ZGlmZiAtLWdpdCBhL0lOU1RBTEwgYi9JTlNUQUxMCmluZGV4IDk4OWI3MTQuLmM5ZDE3OGEgMTAwNjQ0Ci0tLSBhL0lOU1RBTEwKKysrIGIvSU5TVEFMTApAQCAtNzcsNyArNzcsNyBAQAogICAxLyBGaXJzdCwgYnVpbGQgQW5kcm9pZCdzIHBhdGNoZWQgbGliU0RMIGFzIGEgc3RhdGljIGxpYnJhcnksCiAgICAgIHRoaXMgY2FuIGJlIGRvbmUgYXM6CiAKLSAgICAgICAgY2QgJFRPUC9leHRlcm5hbC9xZW11L2Rpc3RyaWIvc2RsLTEuMi4xMgorICAgICAgICBjZCAkVE9QL2V4dGVybmFsL3FlbXUvZGlzdHJpYi9zZGwtMS4yLjE1CiAgICAgICAgIC4vYW5kcm9pZC1jb25maWd1cmUgLS1wcmVmaXg9PFBBVEg+CiAgICAgICAgIG1ha2UKICAgICAgICAgbWFrZSBpbnN0YWxsCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbmRyb2lkIGIvTWFrZWZpbGUuYW5kcm9pZAppbmRleCAxOTVjMDYxLi4wNDQxNjUyIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5hbmRyb2lkCisrKyBiL01ha2VmaWxlLmFuZHJvaWQKQEAgLTgyLDE2ICs4MiwyMCBAQAogICAgIGlmbmVxICgkKGZpbHRlciAxMC4xIDEwLjIgMTAuMyAxMC4xLiUgMTAuMi4lIDEwLjMuJSAxMC40IDEwLjQuJSwkKERBUldJTl9WRVJTSU9OKSksKQogICAgICAgICAkKGVycm9yIEJ1aWxkaW5nIHRoZSBBbmRyb2lkIGVtdWxhdG9yIHJlcXVpcmVzIE9TIFggMTAuNSBvciBhYm92ZSkKICAgICBlbmRpZgotICAgIGlmbmVxICgkKGZpbHRlciAxMC42IDEwLjYuJSwkKERBUldJTl9WRVJTSU9OKSksKQotICAgICAgICAjIFdlIGFyZSBvbiBTbm93IExlb3BhcmQKLSAgICAgICAgTEVPUEFSRF9TREsgOj0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjUuc2RrCi0gICAgICAgIGlmZXEgKCQoc3RyaXAgJCh3aWxkY2FyZCAkKExFT1BBUkRfU0RLKSkpLCkKLSAgICAgICAgICAgICQoaW5mbyAgUGxlYXNlIGluc3RhbGwgdGhlIDEwLjUgU0RLIG9uIHRoaXMgbWFjaGluZSBhdCAkKExFT1BBUkRfU0RLKSkKLSAgICAgICAgICAgICQoZXJyb3IgQWJvcnRpbmcgdGhlIGJ1aWxkLikKLSAgICAgICAgZW5kaWYKLSAgICAgICAgTVlfQ0ZMQUdTICs9IC1pc3lzcm9vdCAkKExFT1BBUkRfU0RLKSAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC41IC1ETUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPTEwLjUKLSAgICAgICAgTVlfTERMSUJTICs9IC1pc3lzcm9vdCAkKExFT1BBUkRfU0RLKSAtV2wsLXN5c2xpYnJvb3QsJChMRU9QQVJEX1NESykgLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuNQorICAgIGlmbmVxICgkKGZpbHRlciAxMC41IDEwLjUuJSAxMC42IDEwLjYuJSwkKERBUldJTl9WRVJTSU9OKSksKQorICAgICAgICAjIFdlIGFyZSBvbiBMZW9wYXJkIG9yIFNub3cgTGVvcGFyZAorICAgICAgICBNU0RLPTEwLjUKKyAgICBlbHNlCisgICAgICAgICMgV2UgYXJlIG9uIExpb24gb3IgYmV5b25kLCBhbmQgMTAuNiBTREsgaXMgdGhlIG1pbmltdW0gaW4gWGNvZGUgNC54CisgICAgICAgIE1TREs9MTAuNgogICAgIGVuZGlmCisgICAgTUFDT1NYX1NESyA6PSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYJChNU0RLKS5zZGsKKyAgICBpZmVxICgkKHN0cmlwICQod2lsZGNhcmQgJChNQUNPU1hfU0RLKSkpLCkKKyAgICAgICAgJChpbmZvICBQbGVhc2UgaW5zdGFsbCB0aGUgJChNU0RLKSBTREsgb24gdGhpcyBtYWNoaW5lIGF0ICQoTUFDT1NYX1NESykpCisgICAgICAgICQoZXJyb3IgQWJvcnRpbmcgdGhlIGJ1aWxkLikKKyAgICBlbmRpZgorICAgIE1ZX0NGTEFHUyArPSAtaXN5c3Jvb3QgJChNQUNPU1hfU0RLKSAtbW1hY29zeC12ZXJzaW9uLW1pbj0kKE1TREspIC1ETUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPSQoTVNESykKKyAgICBNWV9MRExJQlMgKz0gLWlzeXNyb290ICQoTUFDT1NYX1NESykgLVdsLC1zeXNsaWJyb290LCQoTUFDT1NYX1NESykgLW1tYWNvc3gtdmVyc2lvbi1taW49JChNU0RLKQogZW5kaWYKIAogIyBCVUlMRF9TVEFOREFMT05FX0VNVUxBVE9SIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJ1aWxkaW5nIHdpdGgKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmNvbW1vbiBiL01ha2VmaWxlLmNvbW1vbgppbmRleCA0MzgyYmQyLi41MWZjYjg1IDEwMDY0NAotLS0gYS9NYWtlZmlsZS5jb21tb24KKysrIGIvTWFrZWZpbGUuY29tbW9uCkBAIC0xOTgsMTQgKzE5OCw2IEBACiAgICAgQlVJTERfU0RMX0ZST01fU09VUkNFUyA6PSBmYWxzZQogZW5kaWYKIAotIyBPbiBkYXJ3aW4teDg2LCBhIGJ1ZyBpbiB0aGUgQW5kcm9pZCBidWlsZCBzeXN0ZW0gcHJldmVudHMgdGhlIGNvbXBpbGF0aW9uCi0jIG9mIE9iamVjdGl2ZS1DIHNvdXJjZXMuIEZpeGVkIHJlY2VudGx5IGluIEFPU1AsIGJ1dCB3ZSBzdGlsbCB1c2UgdGhlCi0jIHByZWJ1aWx0cyBmb3IgdGhlIGJlbmVmaXQgb2Ygb2xkZXIgcGxhdGZvcm0gYnJhbmNoZXMuCi0jCi1pZmVxICgkKFFFTVVfSE9TVF9UQUcpLGRhcndpbi14ODYpCi0gICAgQlVJTERfU0RMX0ZST01fU09VUkNFUyA6PSBmYWxzZQotZW5kaWYKLQogIyBJZiB3ZSdyZSBidWlsZGluZyB3aXRoIGFuZHJvaWQtY29uZmlndXJlLnNoICYmIG1ha2UsIGFsd2F5cyBidWlsZCBmcm9tCiAjIHNvdXJjZXMgdG8gY2F0Y2ggcmVncmVzc2lvbnMgYXMgc29vbiBhcyB0aGV5IGhhcHBlbi4KICMKQEAgLTIzOCw3ICsyMzAsNyBAQAogCiBlbHNlICMgQlVJTERfU0RMX0ZST01fU09VUkNFUwogCi0gICAgU0RMX0RJUiA6PSBkaXN0cmliL3NkbC0xLjIuMTIKKyAgICBTRExfRElSIDo9IGRpc3RyaWIvc2RsLTEuMi4xNQogICAgIGluY2x1ZGUgJChMT0NBTF9QQVRIKS8kKFNETF9ESVIpL3NvdXJjZXMubWFrZQogICAgIGNvbW1vbl9MT0NBTF9TUkNfRklMRVMgKz0gJChTRExfU09VUkNFUykKIApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9za2luL3NjYWxlci5jIGIvYW5kcm9pZC9za2luL3NjYWxlci5jCmluZGV4IDU2NzI4NjkuLmJhZmQ4NGUgMTAwNjQ0Ci0tLSBhL2FuZHJvaWQvc2tpbi9zY2FsZXIuYworKysgYi9hbmRyb2lkL3NraW4vc2NhbGVyLmMKQEAgLTE1MCw2ICsxNTAsMzQgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgc2NhbGVfZ2VuZXJpYyggJm9wICk7CiAgICAgfQorCisgICAgLy8gVGhlIG9wdGltaXplZCBzY2FsZSBmdW5jdGlvbnMgaW4gYXJnYi5oIGFzc3VtZSB0aGUgZGVzdGluYXRpb24gaXMgQVJHQi4KKyAgICAvLyBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCBkbyBhIGNoYW5uZWwgcmVvcmRlciBub3cuCisgICAgaWYgKGRzdF9zdXJmYWNlLT5mb3JtYXQtPlJzaGlmdCAhPSAxNiB8fAorICAgICAgICBkc3Rfc3VyZmFjZS0+Zm9ybWF0LT5Hc2hpZnQgIT0gIDggfHwKKyAgICAgICAgZHN0X3N1cmZhY2UtPmZvcm1hdC0+QnNoaWZ0ICE9ICAwKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgcnNoaWZ0ID0gZHN0X3N1cmZhY2UtPmZvcm1hdC0+UnNoaWZ0OworICAgICAgICB1aW50MzJfdCBnc2hpZnQgPSBkc3Rfc3VyZmFjZS0+Zm9ybWF0LT5Hc2hpZnQ7CisgICAgICAgIHVpbnQzMl90IGJzaGlmdCA9IGRzdF9zdXJmYWNlLT5mb3JtYXQtPkJzaGlmdDsKKyAgICAgICAgdWludDMyX3QgYXNoaWZ0ID0gZHN0X3N1cmZhY2UtPmZvcm1hdC0+QXNoaWZ0OworICAgICAgICB1aW50MzJfdCBhbWFzayAgPSBkc3Rfc3VyZmFjZS0+Zm9ybWF0LT5BbWFzazsgLy8gbWF5IGJlIDB4MDAKKyAgICAgICAgaW50IHgsIHk7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IG9wLnJkLmg7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QqIGxpbmUgPSAodWludDMyX3QqKShvcC5kc3RfbGluZSArIHkqb3AuZHN0X3BpdGNoKTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBvcC5yZC53OyB4KyspIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCByID0gKGxpbmVbeF0gJiAweDAwZmYwMDAwKSA+PiAxNjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBnID0gKGxpbmVbeF0gJiAweDAwMDBmZjAwKSA+PiAgODsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBiID0gKGxpbmVbeF0gJiAweDAwMDAwMGZmKSA+PiAgMDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBhID0gKGxpbmVbeF0gJiAweGZmMDAwMDAwKSA+PiAyNDsKKyAgICAgICAgICAgICAgICBsaW5lW3hdID0gKHIgPDwgcnNoaWZ0KSB8IChnIDw8IGdzaGlmdCkgfCAoYiA8PCBic2hpZnQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChhIDw8IGFzaGlmdCkgJiBhbWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBTRExfVW5sb2NrU3VyZmFjZSggZHN0X3N1cmZhY2UgKTsKICAgICBTRExfVW5sb2NrU3VyZmFjZSggc3JjX3N1cmZhY2UgKTsKIApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9za2luL3dpbmRvdy5jIGIvYW5kcm9pZC9za2luL3dpbmRvdy5jCmluZGV4IDVkOGM2ODQuLjY1Mjc2YWMgMTAwNjQ0Ci0tLSBhL2FuZHJvaWQvc2tpbi93aW5kb3cuYworKysgYi9hbmRyb2lkL3NraW4vd2luZG93LmMKQEAgLTE0OCwyMiArMTQ4LDI1IEBACiAgICAgcmV0dXJuIChkaXNwLT5kYXRhID09IE5VTEwpID8gLTEgOiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCAgcmdiNTY1X3RvX2FyZ2IzMiggdWludDMyX3QgIHBpeCApCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCByZ2I1NjVfdG9fcmdiYTMyKHVpbnQzMl90IHBpeCwKKyAgICAgICAgdWludDMyX3QgcnNoaWZ0LCB1aW50MzJfdCBnc2hpZnQsIHVpbnQzMl90IGJzaGlmdCwgdWludDMyX3QgYW1hc2spCiB7Ci0gICAgdWludDMyX3QgIHIgPSAoKHBpeCAmIDB4ZjgwMCkgPDwgOCkgfCAoKHBpeCAmIDB4ZTAwMCkgPDwgMyk7Ci0gICAgdWludDMyX3QgIGcgPSAoKHBpeCAmIDB4MDdlMCkgPDwgNSkgfCAoKHBpeCAmIDB4MDYwMCkgPj4gMSk7Ci0gICAgdWludDMyX3QgIGIgPSAoKHBpeCAmIDB4MDAxZikgPDwgMykgfCAoKHBpeCAmIDB4MDAxYykgPj4gMik7Ci0gICAgcmV0dXJuIDB4ZmYwMDAwMDAgfCByIHwgZyB8IGI7CisgICAgdWludDMyX3QgcjggPSAoKHBpeCAmIDB4ZjgwMCkgPj4gIDgpIHwgKChwaXggJiAweGUwMDApID4+IDEzKTsKKyAgICB1aW50MzJfdCBnOCA9ICgocGl4ICYgMHgwN2UwKSA+PiAgMykgfCAoKHBpeCAmIDB4MDYwMCkgPj4gIDkpOworICAgIHVpbnQzMl90IGI4ID0gKChwaXggJiAweDAwMWYpIDw8ICAzKSB8ICgocGl4ICYgMHgwMDFjKSA+PiAgMik7CisgICAgcmV0dXJuIChyOCA8PCByc2hpZnQpIHwgKGc4IDw8IGdzaGlmdCkgfCAoYjggPDwgYnNoaWZ0KSB8IGFtYXNrOwogfQogCiAvKiBUaGUgZnJhbWVidWZmZXIgZm9ybWF0IGlzIFIsRyxCLFggaW4gZnJhbWVidWZmZXIgbWVtb3J5LCBvbiBhCiAgKiBsaXR0bGUtZW5kaWFuIHN5c3RlbSwgdGhpcyB0cmFuc2xhdGVzIHRvIFhCR1IgYWZ0ZXIgYSBsb2FkLgogICovCi1zdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCAgeGJncl90b19hcmdiMzIoIHVpbnQzMl90IHBpeCApCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCB4YmdyX3RvX3JnYmEzMih1aW50MzJfdCBwaXgsCisgICAgICAgIHVpbnQzMl90IHJzaGlmdCwgdWludDMyX3QgZ3NoaWZ0LCB1aW50MzJfdCBic2hpZnQsIHVpbnQzMl90IGFtYXNrKQogewotICAgIHVpbnQzMl90ICBnICA9IChwaXggJiAweDAwMDBmZjAwKTsKLSAgICB1aW50MzJfdCAgcmIgPSAocGl4ICYgMHhmZjAwZmYpOwotICAgIHJldHVybiAweGZmMDAwMDAwIHwgKHJiIDw8IDE2KSB8IGcgfCAocmIgPj4gMTYpOworICAgIHVpbnQzMl90IHI4ID0gKHBpeCAmIDB4MDBmZjAwMDApID4+IDE2OworICAgIHVpbnQzMl90IGc4ID0gKHBpeCAmIDB4MDAwMGZmMDApID4+ICA4OworICAgIHVpbnQzMl90IGI4ID0gKHBpeCAmIDB4MDAwMDAwZmYpID4+ICAwOworICAgIHJldHVybiAocjggPDwgcnNoaWZ0KSB8IChnOCA8PCBnc2hpZnQpIHwgKGI4IDw8IGJzaGlmdCkgfCBhbWFzazsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM5Miw2ICszOTUsMTAgQEAKICAgICBpbnQgICAgICAgICAgIHNyY19waXRjaCA9IGRpc3AtPmRhdGFzaXplLncqMjsKICAgICB1aW50OF90KiAgICAgIHNyY19saW5lICA9ICh1aW50OF90KilkaXNwLT5kYXRhOwogICAgIGludCAgICAgICAgICAgeXksIHh4OworICAgIHVpbnQzMl90ICAgICAgcnNoaWZ0ID0gc3VyZmFjZS0+Zm9ybWF0LT5Sc2hpZnQ7CisgICAgdWludDMyX3QgICAgICBnc2hpZnQgPSBzdXJmYWNlLT5mb3JtYXQtPkdzaGlmdDsKKyAgICB1aW50MzJfdCAgICAgIGJzaGlmdCA9IHN1cmZhY2UtPmZvcm1hdC0+QnNoaWZ0OworICAgIHVpbnQzMl90ICAgICAgYW1hc2sgID0gc3VyZmFjZS0+Zm9ybWF0LT5BbWFzazsgLy8gbWF5IGJlIDB4MDAgZm9yIG5vbi1hbHBoYSBmb3JtYXQKIAogICAgIHN3aXRjaCAoIGRpc3AtPnJvdGF0aW9uICYgMyApCiAgICAgewpAQCAtNDA1LDcgKzQxMiw3IEBACiAKICAgICAgICAgICAgIHh4ID0gMDsKICAgICAgICAgICAgIERVRkY0KHcsIHsKLSAgICAgICAgICAgICAgICBkc3RbeHhdID0gcmdiNTY1X3RvX2FyZ2IzMihzcmNbeHhdKTsKKyAgICAgICAgICAgICAgICBkc3RbeHhdID0gcmdiNTY1X3RvX3JnYmEzMihzcmNbeHhdLCByc2hpZnQsIGdzaGlmdCwgYnNoaWZ0LCBhbWFzayk7CiAgICAgICAgICAgICAgICAgeHgrKzsKICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgc3JjX2xpbmUgKz0gc3JjX3BpdGNoOwpAQCAtNDIyLDcgKzQyOSw3IEBACiAgICAgICAgICAgICB1aW50OF90KiAgIHNyYyA9IHNyY19saW5lOwogCiAgICAgICAgICAgICBEVUZGNCh3LCB7Ci0gICAgICAgICAgICAgICAgZHN0WzBdID0gcmdiNTY1X3RvX2FyZ2IzMigoKHVpbnQxNl90KilzcmMpWzBdKTsKKyAgICAgICAgICAgICAgICBkc3RbMF0gPSByZ2I1NjVfdG9fcmdiYTMyKCgodWludDE2X3QqKXNyYylbMF0sIHJzaGlmdCwgZ3NoaWZ0LCBic2hpZnQsIGFtYXNrKTsKICAgICAgICAgICAgICAgICBzcmMgLT0gc3JjX3BpdGNoOwogICAgICAgICAgICAgICAgIGRzdCArPSAxOwogICAgICAgICAgICAgfSk7CkBAIC00NDAsNyArNDQ3LDcgQEAKICAgICAgICAgICAgIHVpbnQzMl90KiAgZHN0ID0gKHVpbnQzMl90Kilkc3RfbGluZTsKIAogICAgICAgICAgICAgRFVGRjQodywgewotICAgICAgICAgICAgICAgIGRzdFswXSA9IHJnYjU2NV90b19hcmdiMzIoc3JjWzBdKTsKKyAgICAgICAgICAgICAgICBkc3RbMF0gPSByZ2I1NjVfdG9fcmdiYTMyKHNyY1swXSwgcnNoaWZ0LCBnc2hpZnQsIGJzaGlmdCwgYW1hc2spOwogICAgICAgICAgICAgICAgIHNyYyAtPSAxOwogICAgICAgICAgICAgICAgIGRzdCArPSAxOwogICAgICAgICAgICAgfSk7CkBAIC00NTgsNyArNDY1LDcgQEAKICAgICAgICAgICAgIHVpbnQ4X3QqICAgc3JjID0gc3JjX2xpbmU7CiAKICAgICAgICAgICAgIERVRkY0KHcsIHsKLSAgICAgICAgICAgICAgICBkc3RbMF0gPSByZ2I1NjVfdG9fYXJnYjMyKCgodWludDE2X3QqKXNyYylbMF0pOworICAgICAgICAgICAgICAgIGRzdFswXSA9IHJnYjU2NV90b19yZ2JhMzIoKCh1aW50MTZfdCopc3JjKVswXSwgcnNoaWZ0LCBnc2hpZnQsIGJzaGlmdCwgYW1hc2spOwogICAgICAgICAgICAgICAgIGRzdCAgICs9IDE7CiAgICAgICAgICAgICAgICAgc3JjICAgKz0gc3JjX3BpdGNoOwogICAgICAgICAgICAgfSk7CkBAIC00ODIsNiArNDg5LDEwIEBACiAgICAgaW50ICAgICAgICAgICBzcmNfcGl0Y2ggPSBkaXNwLT5kYXRhc2l6ZS53KjQ7CiAgICAgdWludDhfdCogICAgICBzcmNfbGluZSAgPSAodWludDhfdCopZGlzcC0+ZGF0YTsKICAgICBpbnQgICAgICAgICAgIHl5OworICAgIHVpbnQzMl90ICAgICAgcnNoaWZ0ID0gc3VyZmFjZS0+Zm9ybWF0LT5Sc2hpZnQ7CisgICAgdWludDMyX3QgICAgICBnc2hpZnQgPSBzdXJmYWNlLT5mb3JtYXQtPkdzaGlmdDsKKyAgICB1aW50MzJfdCAgICAgIGJzaGlmdCA9IHN1cmZhY2UtPmZvcm1hdC0+QnNoaWZ0OworICAgIHVpbnQzMl90ICAgICAgYW1hc2sgID0gc3VyZmFjZS0+Zm9ybWF0LT5BbWFzazsgLy8gbWF5IGJlIDB4MDAgZm9yIG5vbi1hbHBoYSBmb3JtYXQKIAogICAgIHN3aXRjaCAoIGRpc3AtPnJvdGF0aW9uICYgMyApCiAgICAgewpAQCAtNDkzLDcgKzUwNCw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCogIGRzdCA9ICh1aW50MzJfdCopZHN0X2xpbmU7CiAKICAgICAgICAgICAgIERVRkY0KHcsIHsKLSAgICAgICAgICAgICAgICBkc3RbMF0gPSB4YmdyX3RvX2FyZ2IzMihzcmNbMF0pOworICAgICAgICAgICAgICAgIGRzdFswXSA9IHhiZ3JfdG9fcmdiYTMyKHNyY1swXSwgcnNoaWZ0LCBnc2hpZnQsIGJzaGlmdCwgYW1hc2spOwogICAgICAgICAgICAgICAgIGRzdCsrOwogICAgICAgICAgICAgICAgIHNyYysrOwogICAgICAgICAgICAgfSk7CkBAIC01MTEsNyArNTIyLDcgQEAKICAgICAgICAgICAgIHVpbnQ4X3QqICAgc3JjID0gc3JjX2xpbmU7CiAKICAgICAgICAgICAgIERVRkY0KHcsIHsKLSAgICAgICAgICAgICAgICBkc3RbMF0gPSB4YmdyX3RvX2FyZ2IzMigqKHVpbnQzMl90KilzcmMpOworICAgICAgICAgICAgICAgIGRzdFswXSA9IHhiZ3JfdG9fcmdiYTMyKCoodWludDMyX3QqKXNyYywgcnNoaWZ0LCBnc2hpZnQsIGJzaGlmdCwgYW1hc2spOwogICAgICAgICAgICAgICAgIHNyYyAtPSBzcmNfcGl0Y2g7CiAgICAgICAgICAgICAgICAgZHN0ICs9IDE7CiAgICAgICAgICAgICB9KTsKQEAgLTUyOSw3ICs1NDAsNyBAQAogICAgICAgICAgICAgdWludDMyX3QqICBkc3QgPSAodWludDMyX3QqKWRzdF9saW5lOwogCiAgICAgICAgICAgICBEVUZGNCh3LCB7Ci0gICAgICAgICAgICAgICAgZHN0WzBdID0geGJncl90b19hcmdiMzIoc3JjWzBdKTsKKyAgICAgICAgICAgICAgICBkc3RbMF0gPSB4YmdyX3RvX3JnYmEzMihzcmNbMF0sIHJzaGlmdCwgZ3NoaWZ0LCBic2hpZnQsIGFtYXNrKTsKICAgICAgICAgICAgICAgICBzcmMgLT0gMTsKICAgICAgICAgICAgICAgICBkc3QgKz0gMTsKICAgICAgICAgICAgIH0pOwpAQCAtNTQ3LDcgKzU1OCw3IEBACiAgICAgICAgICAgICB1aW50OF90KiAgIHNyYyA9IHNyY19saW5lOwogCiAgICAgICAgICAgICBEVUZGNCh3LCB7Ci0gICAgICAgICAgICAgICAgZHN0WzBdID0geGJncl90b19hcmdiMzIoKih1aW50MzJfdCopc3JjKTsKKyAgICAgICAgICAgICAgICBkc3RbMF0gPSB4YmdyX3RvX3JnYmEzMigqKHVpbnQzMl90KilzcmMsIHJzaGlmdCwgZ3NoaWZ0LCBic2hpZnQsIGFtYXNrKTsKICAgICAgICAgICAgICAgICBkc3QgICArPSAxOwogICAgICAgICAgICAgICAgIHNyYyAgICs9IHNyY19waXRjaDsKICAgICAgICAgICAgIH0pOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9SRUFETUUgYi9kaXN0cmliL1JFQURNRQppbmRleCA4YTJjZjUyLi4yMmQyNzZmIDEwMDY0NAotLS0gYS9kaXN0cmliL1JFQURNRQorKysgYi9kaXN0cmliL1JFQURNRQpAQCAtMzksMTIgKzM5LDQgQEAKICAgICAiZHluYW1pYyB0aWNrcyIgdGhhdCBtYWtlIHRoaXMgbW9kZSB1bi1uZWNlc3NhcnkgZm9yIEFuZHJvaWQuCiAKIAotaXQgYWxzbyB1c2VzIGEgcGF0Y2hlZCB2ZXJzaW9uIG9mIExpYlNETC0xLjIuMTIgd2hpY2ggaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nOgotCi0gIC0gcHJldmVudCBhIGZhdGFsIGJ1ZyBpbiBRdWFydHogRXh0cmVtZSdzIFF1aWNrRHJhdyBlbXVsYXRpb24gdG8gY3Jhc2ggdGhlIHByb2dyYW0KLSAgICB3aGVuZXZlciBTRExfV0lORE9XX1BPUyBpcyBzZXQgaW4gdGhlIGVudmlyb25tZW50IGJlZm9yZSBzdGFydGluZyB0aGUgcHJvZ3JhbS4KLSAgICB0aGUgcGF0Y2ggaW1wbGVtZW50cyBhIHNpbXBsZSB3b3JrYXJvdW5kIHRvIHRoaXMgc3lzdGVtLWxldmVsIHByb2JsZW0uCi0KLSAgLSBuZXcgQVBJczogU0RMX1dNX0dldFBvcygpIGFuZCBTRExfV01fU2V0UG9zKCkgYXJlIHVzZWQgdG8gcmV0cmlldmUgYW5kIHNldCB0aGUgZW11bGF0b3IKLSAgICB3aW5kb3cgcG9zaXRpb24uIHRoaXMgYWxsb3dzIHVzIHRvIGltcGxlbWVudCBhIHNpbXBsZS15ZXQtdXNlZnVsIGZlYXR1cmU6IHRoZSBlbXVsYXRvciByZW1lbWJlcnMKLSAgICBpdHMgcG9zaXRpb24gYW1vbmcgcmVzdGFydHMuCitpdCBhbHNvIHVzZXMgYSBwYXRjaGVkIHZlcnNpb24gb2YgTGliU0RMLTEuMi4xNS4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9DUkVESVRTIGIvZGlzdHJpYi9zZGwtMS4yLjEyL0NSRURJVFMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjFjMTIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL0NSRURJVFMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0KLVNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciBDUkVESVRTCi1UaGFua3MgdG8gZXZlcnlvbmUgd2hvIG1hZGUgdGhpcyBwb3NzaWJsZSwgaW5jbHVkaW5nOgotCi0qIENsaWZmIE1hdHRoZXdzLCBmb3IgZ2l2aW5nIG1lIGEgcmVhc29uIHRvIHN0YXJ0IHRoaXMgcHJvamVjdC4gOikKLSAtLSBFeGVjdXRvciByb2NrcyEgICpncmluKgotCi0qIFNjb3R0IENhbGwsIGZvciBtYWtpbmcgYSBob21lIGZvciBTREwgb24gdGhlICdOZXQuLi4gVGhhbmtzISA6KQotCi0qIFRoZSBMaW51eCBGdW5kLCBDIE1hZ2F6aW5lLCBFZHVjYXRpb25hbCBUZWNobm9sb2d5IFJlc291cmNlcyBJbmMuLAotICBHYXJldGggTm95Y2UsIEplc3NlIFBhdmVsLCBLZWl0aCBLaXRjaGluLCBKZXJlbXkgSG9ydmF0aCwgVGhvbWFzIE5pY2hvbHNvbiwKLSAgSGFucy1QZXRlciBHeWdheCwgdGhlIEV0ZXJuYWwgTGFuZHMgRGV2ZWxvcG1lbnQgVGVhbSwgTGFycyBCcnViYWtlciwKLSAgYW5kIFBob2VuaXggS29raWRvIGZvciBmaW5hbmNpYWwgY29udHJpYnV0aW9ucwotCi0qIEdh63RhbiBkZSBNZW50ZW4gZm9yIHdyaXRpbmcgdGhlIFBIUCBhbmQgU1FMIGJlaGluZCB0aGUgU0RMIHdlYnNpdGUKLQotKiBUaW0gSm9uZXMgZm9yIHRoZSBuZXcgbG9vayBvZiB0aGUgU0RMIHdlYnNpdGUKLQotKiBNYXJjbyBLcmF1cyBmb3Igc2V0dGluZyB1cCBTREwgbWVyY2hhbmRpc2UKLQotKiBNYXJ0aW4gRG9ubG9uIGZvciBoaXMgd29yayBvbiB0aGUgU0RMIERvY3VtZW50YXRpb24gUHJvamVjdAotCi0qIFJ5YW4gR29yZG9uIGZvciBoZWxwaW5nIGV2ZXJ5Ym9keSBvdXQgYW5kIGtlZXBpbmcgdGhlIGRyZWFtIGFsaXZlLiA6KQotCi0qIE1hdHRpYXMgRW5nZGVn5XJkLCBmb3IgaGVscCB3aXRoIHRoZSBTb2xhcmlzIHBvcnQgYW5kIGxvdHMgb2Ygb3RoZXIgaGVscAotCi0qIE1heCBXYXRzb24sIE1hdHQgU2xvdCwgYW5kIEt5bGUgZm9yIGhlbHAgd2l0aCB0aGUgTWFjT1MgQ2xhc3NpYyBwb3J0Ci0KLSogU3RhbiBTaGVicywgZm9yIHRoZSBpbml0aWFsIE1hYyBPUyBYIHBvcnQKLQotKiBFcmljIFdpbmcsIE1heCBIb3JuLCBhbmQgRGFycmVsbCBXYWxpc3NlciBmb3IgdW5mbGFnZ2luZyB3b3JrIG9uIHRoZSBNYWMgT1MgWCBwb3J0Ci0KLSogUGF0cmljayBUcmFpbm9yLCBKaW0gQm91Y2hlciwgYW5kIE1pa2UgR29yY2hhayBmb3IgdGhlIFFOWCBOZXV0cmlubyBwb3J0Ci0KLSogQ2Fyc3RlbiBHcml3b2R6IGZvciB0aGUgQUlYIHBvcnQKLQotKiBHYWJyaWVsZSBHcmVjbywgZm9yIHRoZSBBbWlnYSBwb3J0Ci0KLSogUGF0cmljZSBNYW5kaW4sIGZvciB0aGUgQXRhcmkgcG9ydAotCi0qIEhhbm51IFZpaXRhbGEgZm9yIHRoZSBFUE9DIHBvcnQKLQotKiBNYXJjdXMgTWVydGFtYSBmb3IgdGhlIFM2MCBwb3J0LgotCi0qIFBldGVyIFZhbGNoZXYgZm9yIG5hZ2dpbmcgbWUgYWJvdXQgdGhlIE9wZW5CU0QgcG9ydCB1bnRpbCBJIGdvdCBpdCByaWdodC4gOikKLQotKiBLZW50IEIgTWVpbiwgZm9yIGEgcGxhY2UgdG8gZG8gdGhlIElSSVggcG9ydAotCi0qIEFzaCwgZm9yIGEgcGxhY2UgdG8gZG8gdGhlIE9TRi8xIEFscGhhIHBvcnQKLQotKiBEYXZpZCBTb3dzeSwgZm9yIGhlbHAgd2l0aCB0aGUgQmVPUyBwb3J0Ci0KLSogRXVnZW5pYSBMb2xpLCBmb3IgZW5kbGVzcyB3b3JrIG9uIHBvcnRpbmcgU0RMIGdhbWVzIHRvIEJlT1MKLQotKiBKb24gVGF5bG9yIGZvciB0aGUgR0dJIGZyb250LWVuZAotCi0qIFBhdWx1cyBFc3RlcmhhenksIGZvciB0aGUgVmlzdWFsIEMrKyB0ZXN0aW5nIGFuZCBsaWJyYXJpZXMKLQotKiBCcmVuZGEgVGFudHplbiwgZm9yIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3Igb24gTWFjT1MKLQotKiBDaHJpcyBOZW50d2ljaCwgZm9yIHRoZSBIZXJtZXMgYXNzZW1ibHkgYmxpdHRlcnMKLQotKiBNaWNoYWVsIFZhbmNlIGFuZCBKaW0gS3V0dGVyIGZvciB0aGUgWDExIE9wZW5HTCBzdXBwb3J0Ci0KLSogU3RlcGhhbmUgUGV0ZXIsIGZvciB0aGUgQUFsaWIgZnJvbnQtZW5kIGFuZCBtdWx0aS10aHJlYWRlZCB0aW1lciBpZGVhLgotCi0qIEpvbiBBdGtpbnMgZm9yIFNETF9pbWFnZSwgU0RMX21peGVyIGFuZCBTRExfbmV0IGRvY3VtZW50YXRpb24KLQotKiBQZXRlciBXaWtsdW5kLCBmb3IgdGhlIDE5OTggd2lubmluZyBTREwgbG9nbywKLSAgYW5kIEFydG8gSGFtYXJhLCBTdGV2ZW4gV29uZywgYW5kIEtlbnQgTWVpbiBmb3Igb3RoZXIgbG9nbyBlbnRyaWVzLgotCi0qIEFybmUgQ2xhdXMsIGZvciB0aGUgMjAwNCB3aW5uaW5nIFNETCBsb2dvLAotICBhbmQgU2hhbmR5IEJyb3duLCBKYWMsIEFsZXggTHltYW4sIE1pa2tlbCBHam9lbCwgI0d1eSwgSm9uYXMgSGFydG1hbm4sCi0gIERhbmllbCBMaWxqZWJlcmcsICBSb25hbGQgU293YSwgRG9jRCwgUGVra2EgSmFlcnZpbmVuLCBQYXRyaWNrIEF2ZWxsYSwKLSAgRXJra2kgS29udGlsbGEsIExldm9uIEdhdmFsaWFuLCBIYWwgRW1lcmljaCwgRGF2aWQgV2lrdG9yc3NvbiwKLSAgUy4gU2NodXJ5IGFuZCBGLiBIdWZza3ksIENpc2thIGRlIFJ1eXZlciwgU2hyZWR3ZWF0LCBUeWxlciBNb250YnJpYW5kLAotICBNYXJ0aW4gQW5kZXJzc29uLCBNZXJseW4gV3lzYXJkLCBGZXJuYW5kbyBJYmFuZXosIERhdmlkIE1pbGxlciwKLSAgQW5kcmUgQm9tbWVsZSwgbG92ZXNieS5jb20sIEZyYW5jaXNjbyBDYW1lbmZvcnRlIFRvcnJlcywgYW5kIERhdmlkIElncmVqYQotICBmb3Igb3RoZXIgbG9nbyBlbnRyaWVzLgotCi0qIEJvYiBQZW5kbGV0b24gYW5kIERhdmlkIE9sb2Zzb24gZm9yIGJlaW5nIGxvbmcgdGltZSBjb250cmlidXRvcnMgdG8KLSAgdGhlIFNETCBtYWlsaW5nIGxpc3QuCi0KLSogRXZlcnlib2R5IGF0IExva2kgU29mdHdhcmUsIEluYy4gZm9yIHRoZWlyIGdyZWF0IGNvbnRyaWJ1dGlvbnMhCi0KLSBBbmQgYSBiaWcgaGFuZCB0byBldmVyeW9uZSBlbHNlIHdobyBnYXZlIG1lIGFwcHJlY2lhdGlvbiwgYWR2aWNlLAotIGFuZCBzdWdnZXN0aW9ucywgZXNwZWNpYWxseSB0aGUgZ29vZCBmb2xrcyBvbiB0aGUgU0RMIG1haWxpbmcgbGlzdC4KLQotVEhBTktTISA6KQotCi0gIC0tIFNhbSBMYW50aW5nYQkJCTxzbG91a2VuQGxpYnNkbC5vcmc+Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9NYWtlZmlsZSBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYTYwOS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIHRoaXMgaXMgYSBzZXQgb2YgZGVmaW5pdGlvbnMgdGhhdCBhbGxvdyB0aGUgdXNhZ2Ugb2YgTWFrZWZpbGUuYW5kcm9pZAotIyBldmVuIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgQW5kcm9pZCBidWlsZCBzeXN0ZW0uCi0jCi0KLU9CSlNfRElSICAgICA6PSBvYmpzCi1DT05GSUdfTUFLRSAgOj0gJChPQkpTX0RJUikvY29uZmlnLm1ha2UKLUNPTkZJR19IICAgICA6PSAkKE9CSlNfRElSKS9jb25maWctaG9zdC5oCi0KLWlmZXEgKCQod2lsZGNhcmQgJChDT05GSUdfTUFLRSkpLCkKLSAgICAkKGVycm9yICJUaGUgY29uZmlndXJhdGlvbiBmaWxlICckKENPTkZJR19NQUtFKScgZG9lc250JyBleGlzdCwgcGxlYXNlIHJ1biB0aGUgImFuZHJvaWQtY29uZmlndXJlLnNoIiBzY3JpcHQpCi1lbmRpZgotCi1pbmNsdWRlICQoQ09ORklHX01BS0UpCi0KLWlmZXEgKCQoc3RyaXAgJChCVUlMRF9TWVNURU0pKSwpCi0gICAgJChlcnJvciAiVGhlIEJVSUxEX1NZU1RFTSB2YXJpYWJsZSB3YXMgbm90IGRlZmluZWQgYnkgeW91ciBjb25maWd1cmF0aW9uIHN1Yi1tYWtlZmlsZS4gQWJvcnRpbmciKQotZW5kaWYKLQotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGVmaW5pdGlvbnMubWFrZQotCi1WUEFUSCA6PSAkKE9CSlNfRElSKQotVlBBVEggKz0gOiQoU1JDX1BBVEgpL2luY2x1ZGUKLVZQQVRIICs9IDokKFNSQ19QQVRIKQotCi0uUEhPTlk6IGFsbCBsaWJyYXJpZXMgZXhlY3V0YWJsZXMgY2xlYW4gY2xlYW4tY29uZmlnIGNsZWFuLW9ianMtZGlyIFwKLSAgICAgICAgY2xlYW4tZXhlY3V0YWJsZXMgY2xlYW4tbGlicmFyaWVzCi0KLUNMRUFSX1ZBUlMgICAgICAgICAgICAgICAgOj0gJChCVUlMRF9TWVNURU0pL2NsZWFyX3ZhcnMubWFrZQotQlVJTERfSE9TVF9FWEVDVVRBQkxFICAgICA6PSAkKEJVSUxEX1NZU1RFTSkvaG9zdF9leGVjdXRhYmxlLm1ha2UKLUJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkgOj0gJChCVUlMRF9TWVNURU0pL2hvc3Rfc3RhdGljX2xpYnJhcnkubWFrZQotCi1ERVBFTkRFTkNZX0RJUlMgOj0KLQotYWxsOiBsaWJyYXJpZXMgZXhlY3V0YWJsZXMKLUVYRUNVVEFCTEVTIDo9Ci1MSUJSQVJJRVMgICA6PQotCi1jbGVhbjogY2xlYW4taW50ZXJtZWRpYXRlcwotCi1kaXN0Y2xlYW46IGNsZWFuIGNsZWFuLWNvbmZpZwotCi0jIGxldCdzIHJvbGwKLWluY2x1ZGUgTWFrZWZpbGUuYW5kcm9pZAotCi1saWJyYXJpZXM6ICQoTElCUkFSSUVTKQotZXhlY3V0YWJsZXM6ICQoRVhFQ1VUQUJMRVMpCi0KLWNsZWFuLWludGVybWVkaWF0ZXM6Ci0Jcm0gLXJmICQoT0JKU19ESVIpL2ludGVybWVkaWF0ZXMgJChFWEVDVVRBQkxFUykgJChMSUJSQVJJRVMpCi0KLWNsZWFuLWNvbmZpZzoKLQlybSAtZiAkKENPTkZJR19NQUtFKSAkKENPTkZJR19IKQotCi0jIGluY2x1ZGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbgotREVQRU5ERU5DWV9ESVJTIDo9ICQoc29ydCAkKERFUEVOREVOQ1lfRElSUykpCi0taW5jbHVkZSAkKHdpbGRjYXJkICQoREVQRU5ERU5DWV9ESVJTOiU9JS8qLmQpKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL1JFQURNRS5BTkRST0lEIGIvZGlzdHJpYi9zZGwtMS4yLjEyL1JFQURNRS5BTkRST0lECmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTdmNGFhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9SRUFETUUuQU5EUk9JRAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgU0RMIDEuMi4xMiB0aGF0IGlzIHVzZWQgYnkgdGhlIEFuZHJvaWQgUUVNVSBlbXVsYXRvci4KLVRoZSBtb2RpZmljYXRpb25zIGFyZSB0aGUgZm9sbG93aW5nOgotCi1UbyBidWlsZCBpdCBhcyBhIHN0YXRpYyBsaWJyYXJ5IG9uIExpbnV4LCBPUyBYIGFuZCBXaW5kb3dzOgotCi0uL2FuZHJvaWQtY29uZmlndXJlLnNoICBbLS1wcmVmaXg9PHBhdGg+XQotbWFrZSAtajIKLW1ha2UgaW5zdGFsbAotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvYW5kcm9pZC1jb25maWd1cmUuc2ggYi9kaXN0cmliL3NkbC0xLjIuMTIvYW5kcm9pZC1jb25maWd1cmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1YmI5MWYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2FuZHJvaWQtY29uZmlndXJlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLSMvYmluL3NoCi0jCi0jIHRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gcmVidWlsZCBTREwgZnJvbSBzb3VyY2VzIGluIHRoZSBjdXJyZW50Ci0jIGRpcmVjdG9yeS4gSXQgZGVwZW5kcyBvbiB0aGUgQW5kcm9pZCBlbXVsYXRvciBidWlsZCBzY3JpcHRzCi0jIHRoYXQgc2hvdWxkIG5vcm1hbGx5IGJlIGxvY2F0ZWQgaW4gLi4vZW11bGF0b3IvYW5kcm9pZC9idWlsZAotIyBidXQgeW91IGNhbiBhbHNvIHVzZSBBTkRST0lEX1FFTVVfUEFUSCBpbiB5b3VyIGVudmlyb25tZW50Ci0jIHRvIHBvaW50IHRvIHRoZSB0b3Agb2YgdGhlIEFuZHJvaWQgZW11bGF0b3Igc291cmNlcwotIwotIwotCi0jIGZpcnN0LCBsZXQncyBzZWUgd2hpY2ggc3lzdGVtIHdlJ3JlIHJ1bm5pbmcgdGhpcyBvbgotY2QgYGRpcm5hbWUgJDBgCi0KLSMgdHJ5IHRvIGZpbmQgdGhlIEFuZHJvaWQgYnVpbGQgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkKLWlmIFsgLXogIiRBTkRST0lEX1FFTVVfUEFUSCIgXSA7IHRoZW4KLSAgICBpZiBbIC1mIC4uLy4uL2FuZHJvaWQvYnVpbGQvY29tbW9uLnNoIF0gOyB0aGVuCi0gICAgICAgIEFORFJPSURfUUVNVV9QQVRIPS4uLy4uCi0gICAgZWxzZQotICAgICAgICBlY2hvICJZb3UgbXVzdCBkZWZpbmUgQU5EUk9JRF9RRU1VX1BBVEggaW4geW91ciBlbnZpcm9ubWVudCB0byBwb2ludCIKLSAgICAgICAgZWNobyAidG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBBbmRyb2lkIGVtdWxhdG9yJ3Mgc291cmNlcy4iCi0gICAgICAgIGV4aXQgMQotICAgIGZpCi1maQotCi1pZiBbICEgLWQgJEFORFJPSURfUUVNVV9QQVRIIF0gOyB0aGVuCi0gICAgZWNobyAiWW91ciBBTkRST0lEX1FFTVVfUEFUSCBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIGRpcmVjdG9yeS4iCi0gICAgZXhpdCAxCi1maQotCi1pZiBbICEgLWYgJEFORFJPSURfUUVNVV9QQVRIL2FuZHJvaWQvYnVpbGQvY29tbW9uLnNoIF0gOyB0aGVuCi0gICAgZWNobyAiWW91ciBBTkRST0lEX1FFTVVfUEFUSCBkb2VzIG5vdCBwb2ludCB0byBhIGRpcmVjdG9yeSB0aGF0IgotICAgIGVjaG8gImNvbnRhaW5zIHRoZSBBbmRyb2lkIGVtdWxhdG9yIGJ1aWxkIHNjcmlwdHMuIgotICAgIGV4aXQgMQotZmkKLQotIyBzb3VyY2UgY29tbW9uIGZ1bmN0aW9ucyBkZWZpbml0aW9ucwotLiAkQU5EUk9JRF9RRU1VX1BBVEgvYW5kcm9pZC9idWlsZC9jb21tb24uc2gKLQotIyBQYXJzZSBvcHRpb25zCi1PUFRJT05fVFJZXzY0PW5vCi1PUFRJT05fSEVMUD1ubwotT1BUSU9OX1RBUkdFVFM9Ci1PUFRJT05fRk9SQ0VfQVVUT0RFVEVDVD1ubwotT1BUSU9OX05PX1RJR0VSPW5vCi0KLWlmIFsgLXogIiRDQyIgXSA7IHRoZW4KLSAgQ0M9Z2NjCi1maQotCi1mb3Igb3B0IGRvCi0gIG9wdGFyZz1gZXhwciAieCRvcHQiIDogJ3hbXj1dKj1cKC4qXCknYAotICBjYXNlICIkb3B0IiBpbgotICAtLWhlbHB8LWh8LVw/KSBPUFRJT05fSEVMUD15ZXMKLSAgOzsKLSAgLS12ZXJib3NlKQotICAgIGlmIFsgIiRWRVJCT1NFIiA9ICJ5ZXMiIF0gOyB0aGVuCi0gICAgICAgIFZFUkJPU0UyPXllcwotICAgIGVsc2UKLSAgICAgICAgVkVSQk9TRT15ZXMKLSAgICBmaQotICA7OwotICAtLWNjPSopIENDPSIkb3B0YXJnIiA7IEhPU1RDQz0kQ0MKLSAgOzsKLSAgLS10cnktNjQpIE9QVElPTl9UUllfNjQ9eWVzCi0gIDs7Ci0gIC0tcHJlZml4PSopIE9QVElPTl9UQVJHRVRTPSIkT1BUSU9OX1RBUkdFVFMgJG9wdGFyZyIKLSAgOzsKLSAgLS1mb3JjZS1hdXRvZGV0ZWN0KSBPUFRJT05fRk9SQ0VfQVVUT0RFVEVDVD15ZXMKLSAgOzsKLSAgLS1uby10aWdlcikgT1BUSU9OX05PX1RJR0VSPXllcwotICA7OwotICAqKQotICAgIGVjaG8gInVua25vd24gb3B0aW9uICckb3B0JywgdXNlIC0taGVscCIKLSAgICBleGl0IDEKLSAgZXNhYwotZG9uZQotCi0jIFByaW50IHRoZSBoZWxwIG1lc3NhZ2UKLSMKLWlmIFsgIiRPUFRJT05fSEVMUCIgPSAieWVzIiBdIDsgdGhlbgotICAgIGNhdCA8PCBFT0YKLQotVXNhZ2U6IHJlYnVpbGQuc2ggW29wdGlvbnNdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotRU9GCi0gICAgZWNobyAiU3RhbmRhcmQgb3B0aW9uczoiCi0gICAgZWNobyAiICAtLWhlbHAgICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIgotICAgIGVjaG8gIiAgLS1jYz1QQVRIICAgICAgICAgICAgICAgIHNwZWNpZnkgQyBjb21waWxlciBbJENDXSIKLSAgICBlY2hvICIgIC0tdHJ5LTY0ICAgICAgICAgICAgICAgICB0cnkgdG8gYnVpbGQgYSA2NC1iaXQgZXhlY3V0YWJsZSAobWF5IGNyYXNoKSIKLSAgICBlY2hvICIgIC0tdmVyYm9zZSAgICAgICAgICAgICAgICB2ZXJib3NlIGNvbmZpZ3VyYXRpb24iCi0gICAgZWNobyAiICAtLWZvcmNlLWF1dG9kZXRlY3QgICAgICAgZm9yY2UgZmVhdHVyZSBhdXRvLWRldGVjdGlvbiIKLSAgICBlY2hvICIgIC0tbm8tdGlnZXIgICAgICAgICAgICAgICBkbyBub3QgZ2VuZXJhdGUgVGlnZXItY29tcGF0aWJsZSBiaW5hcmllcyAoT1MgWCBvbmx5KSIKLSAgICBlY2hvICIiCi0gICAgZXhpdCAxCi1maQotCi0jIHdlIG9ubHkgc3VwcG9ydCBnZW5lcmF0aW5nIDMyLWJpdCBiaW5hcmlzIG9uIDY0LWJpdCBzeXN0ZW1zLgotIyBBbmQgd2UgbWF5IG5lZWQgdG8gYWRkIGEgLVdhLC0tMzIgdG8gQ0ZMQUdTIHRvIGxldCB0aGUgYXNzZW1ibGVyCi0jIGdlbmVyYXRlIDMyLWJpdCBiaW5hcmllcyBvbiBMaW51eCB4ODZfNjQuCi0jCi1pZiBbICIkT1BUSU9OX1RSWV82NCIgIT0gInllcyIgXSA7IHRoZW4KLSAgICBmb3JjZV8zMmJpdF9iaW5hcmllcwotZmkKLQotIyBkZWZhdWx0IHRhcmdldAotaWYgWyAteiAiJE9QVElPTl9UQVJHRVRTIiBdIDsgdGhlbgotICBPUFRJT05fVEFSR0VUUz1vdXQvJE9TCi1maQotCi0jIHdlIGNhbiBidWlsZCBTREwgd2l0aCBDeWd3aW4sIHNvIGVuYWJsZSBpdAotZW5hYmxlX2N5Z3dpbgotCi1zZXR1cF90b29sY2hhaW4KLQotIyMjCi0jIyMgU3BlY2lhbCBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzCi0jIyMKLQotY2FzZSAiJE9TIiBpbgotICAgIGxpbnV4LSopCi0gICAgICAgIEJVSUxEX0NGTEFHUz0iLURfR05VX1NPVVJDRT0xIC1mdmlzaWJpbGl0eT1oaWRkZW4gLURYVEhSRUFEUyAtRF9SRUVOVFJBTlQiCi0gICAgICAgICMgcHJldmVudCAtZnN0YWNrLXByb3RlY3RvciBvciB0aGUgZ2VuZXJhdGVkIGJpbmFyaWVzIHdpbGwgbm90IGxpbmsKLSAgICAgICAgQlVJTERfQ0ZMQUdTPSIkQlVJTERfQ0ZMQUdTIC1mbm8tc3RhY2stcHJvdGVjdG9yIgotICAgICAgICA7OwotICAgIGRhcndpbi0qKQotICAgICAgICBCVUlMRF9DRkxBR1M9Ii1EX0dOVV9TT1VSQ0U9MSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EVEFSR0VUX0FQSV9NQUNfQ0FSQk9OIC1EVEFSR0VUX0FQSV9NQUNfT1NYIC1EX1RIUkVBRF9TQUZFIC1mb3JjZV9jcHVzdWJ0eXBlX0FMTCAtZnBhc2NhbC1zdHJpbmdzIgotICAgICAgICAjIGRldGVjdCB0aGUgMTAuNCBTREsgYW5kIHVzZSBpdCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgIFRJR0VSX1NESz0vRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrCi0gICAgICAgIGlmIFsgISAtZCAkVElHRVJfU0RLIC1hICRPUFRJT05fTk9fVElHRVIgPSBubyBdIDsgdGhlbgotICAgICAgICAgICAgZWNobyAiUGxlYXNlIGluc3RhbGwgdGhlIDEwLjQgU0RLIGF0ICRUSUdFUl9TREsgdG8gZ2VuZXJhdGUgVGlnZXItY29tcGF0aWJsZSBiaW5hcmllcy4iCi0gICAgICAgICAgICBlY2hvICJJZiB5b3UgZG9uJ3Qgd2FudCBjb21wYXRpYmlsaXR5LCB1c2UgLS1uby10aWdlciBvcHRpb24gaW5zdGVhZC4iCi0gICAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLSAgICAgICAgaWYgWyAtZCAkVElHRVJfU0RLIF0gOyB0aGVuCi0gICAgICAgICAgICBUSUdFUl9PUFRTPSItaXN5c3Jvb3QgJFRJR0VSX1NESyAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC40IgotICAgICAgICAgICAgQlVJTERfQ0ZMQUdTPSIkQlVJTERfQ0ZMQUdTICRUSUdFUl9PUFRTIgotICAgICAgICAgICAgQlVJTERfTERGTEFHUz0iJEJVSUxEX0xERkxBR1MgJFRJR0VSX09QVFMgLVdsLC1zeXNsaWJyb290LCQoVElHRVJfU0RLKSIKLSAgICAgICAgICAgIGVjaG8gIlVzaW5nIE9TIFggMTAuNCBTREsgdG8gZ2VuZXJhdGUgVGlnZXItY29tcGF0aWJsZSBiaW5hcmllcy4iCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVjaG8gIldhcm5pbmc6IHRoZSBnZW5lcmF0ZWQgYmluYXJpZXMgd2lsbCBub3QgYmUgY29tcGF0aWJsZSB3aXRoIFRpZ2VyLiIKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSAgICB3aW5kb3dzKQotICAgICAgICBCVUlMRF9DRkxBR1M9Ii1EX0dOVV9TT1VSQ0U9MSIKLSAgICAgICAgOzsKLSAgICAqKQotICAgICAgICBCVUlMRF9DRkxBR1M9Ci1lc2FjCi0KLSMgQlVJTERfQ0ZMQUdTIGFyZSB1c2VkIHRvIGJ1aWxkIFNETCwgYnV0IFNETF9DRkxBR1MgYXJlIHVzZWQKLSMgd2hlbiBjbGllbnRzIHdhbnQgdG8gdXNlIGl0cyBmYWNpbGl0aWVzCi0jCi1jYXNlICIkSE9TVF9PUyIgaW4KLSAgICBsaW51eCkKLSAgICAgICAgU0RMX0NGTEFHUz0iLURfR05VX1NPVVJDRT0xIC1EX1JFRU5UUkFOVCIKLSAgICAgICAgU0RMX1NUQVRJQ19MSUJTPSItbG0gLWxkbCAtbHB0aHJlYWQgLWxydCIKLSAgICAgICAgOzsKLSAgICBkYXJ3aW4pCi0gICAgICAgIFNETF9DRkxBR1M9Ii1EX0dOVV9TT1VSQ0U9MSAtRF9USFJFQURfU0FGRSIKLSAgICAgICAgU0RMX1NUQVRJQ19MSUJTPSItV2wsLWZyYW1ld29yayxPcGVuR0wgLVdsLC1mcmFtZXdvcmssQ29jb2EgLVdsLC1mcmFtZXdvcmssUXVpY2tUaW1lIC1XbCwtZnJhbWV3b3JrLEFwcGxpY2F0aW9uU2VydmljZXMgLVdsLC1mcmFtZXdvcmssQ2FyYm9uIC1XbCwtZnJhbWV3b3JrLElPS2l0IgotICAgICAgICA7OwotICAgIHdpbmRvd3MpCi0gICAgICAgIFNETF9DRkxBR1M9Ii1EX0dOVV9TT1VSQ0U9MSAtRG1haW49U0RMX21haW4iCi0gICAgICAgIFNETF9TVEFUSUNfTElCUz0iLWx1c2VyMzIgLWxnZGkzMiAtbHdpbm1tIgotICAgICAgICA7OwotICAgICopCi0gICAgICAgIFNETF9DRkxBR1M9Ci0gICAgICAgIFNETF9TVEFUSUNfTElCUz0KLWVzYWMKLQotRE9MTEFSPSIkIgotU0RMX1NUQVRJQ19MSUJTPSIkRE9MTEFSe2xpYmRpcn0vbGliU0RMbWFpbi5hICRET0xMQVJ7bGliZGlyfS9saWJTREwuYSAkU0RMX1NUQVRJQ19MSUJTIgotCi0jIyMKLSMjIyBGZWF0dXJlcyBwcm9iZXMKLSMjIwotCi1DT05GSUdfTElCQz15ZXMKLQotIyMjCi0jIyMgQ29uZmlndXJhdGlvbiBmaWxlcyBnZW5lcmF0aW9uCi0jIyMKLQotIyBjcmVhdGUgdGhlIG9ianMgZGlyZWN0b3J5IHRoYXQgaXMgZ29pbmcgdG8gY29udGFpbiBhbGwgZ2VuZXJhdGVkIGZpbGVzCi0jIGluY2x1ZGluZyB0aGUgY29uZmlndXJhdGlvbiBvbmVzCi0jCi1ta2RpciAtcCBvYmpzCi0KLWNvbmZpZ19hZGQgKCkKLXsKLSAgICBlY2hvICIkMSIgPj4gJGNvbmZpZ19oCi19Ci0KLSMgdXNlZCB0byBhZGQgYSBtYWNybyBkZWZpbmUvdW5kZWYgbGluZSB0byB0aGUgY29uZmlndXJhdGlvbgotIyAkMTogbWFjcm8gbmFtZQotIyAkMjogMSwgMCwgeWVzIG9yIG5vCi0jICQzOiBvcHRpb25hbCBsb2cgcHJlZml4Ci1jb25maWdfYWRkX21hY3JvICgpCi17Ci0gICAgbG9jYWwgbG9nbmFtZQotICAgIGxvZ25hbWU9IiR7MzotQ2ZnTWFjcm8gICB9IgotICAgIGNhc2UgIiQyIiBpbgotICAgICAgICAwfG5vfGZhbHNlKQotICAgICAgICAgICAgY29uZmlnX2FkZCAiLyogI3VuZGVmICQxICovIgotICAgICAgICAgICAgbG9nICIkbG9nbmFtZTogJDE9MCIKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIDF8eWVzfHRydWUpCi0gICAgICAgICAgICBjb25maWdfYWRkICIjZGVmaW5lICQxIDEiCi0gICAgICAgICAgICBsb2cgIiRsb2duYW1lOiAkMT0xIgotICAgICAgICAgICAgOzsKLSAgICBlc2FjCi19Ci0KLSMgdXNlZCB0byBhZGQgaG9zdC1vcy1zcGVjaWZpYyBkcml2ZXIgbWFjcm9zIHRvIHRoZSBjb25maWcgZmlsZQotIyAkMSA6IGRyaXZlciBwcmVmaXgsIGUuZy4gRFJJVkVSU19WSURFTwotIyAkMiA6IG1hY3JvIHByZWZpeAotIyB0aGlzIHdpbGwgbG9vayBmb3IgRFJJVkVSU19WSURFT18ke0hPU1RfT1N9LCBhbmQsIGlmIGl0IGlzIG5vdAotIyBkZWZpbmVkIGluIERSSVZFUlNfVklERU9fZGVmYXVsdAotIwotIyB0aGVuIHRoaXMgd2lsbCBjYWxsICdjb25maWdfYWRkICR7Mn1fJHtkcml2ZXJ9JyBmb3IgZWFjaCBkcml2ZXIgbGlzdGVkCi0jCi1jb25maWdfYWRkX2RyaXZlcl9tYWNyb3MgKCkKLXsKLSAgICBsb2NhbCAgZHJpdmVyX2xpc3Q9ImB2YXJfdmFsdWUgJHsxfV8ke0hPU1RfT1N9YCIKLSAgICBsb2NhbCAgZHJpdmVyX25hbWUKLSAgICBpZiBbIC16ICIkZHJpdmVyX2xpc3QiIF0gOyB0aGVuCi0gICAgICAgIGRyaXZlcl9saXN0PSJgdmFyX3ZhbHVlICR7MX1fZGVmYXVsdGAiCi0gICAgZmkKLSAgICBmb3IgZHJpdmVyX25hbWUgaW4gJGRyaXZlcl9saXN0OyBkbwotICAgICAgICBjb25maWdfYWRkX21hY3JvICIkezJ9XyR7ZHJpdmVyX25hbWV9IiB5ZXMKLSAgICBkb25lCi19Ci0KLWNvbmZpZ19oPW9ianMvU0RMX2NvbmZpZy5oCi0KLSMgYSBmdW5jdGlvbiB1c2VkIHRvIGNoZWNrIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBnaXZlbiBTdGFuZGFyZCBDIGhlYWRlcgotIyAkMSA6IGhlYWRlciBuYW1lLCB3aXRob3V0IHRoZSAuaCBzdWZmaXggbm9yIGVuY2xvc2luZyBicmFja2V0cyAoZS5nLiAnbWVtb3J5JyBmb3IgPG1lbW9yeS5oPikKLSMgdGhpcyB3aWxsIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGEgcmVsZXZhbnQgbGluZQotc2RsX2NoZWNrX2hlYWRlciAoKQotewotICAgIGxvY2FsIHJlc3VsdAotICAgIGxvY2FsIGhlYWRlcgotICAgIGxvY2FsIG1hY3JvCi0gICAgaGVhZGVyPSI8JDEuaD4iCi0gICAgbWFjcm89YHRvX3VwcGVyY2FzZSAkMWAKLSAgICBtYWNybz1gZWNobyAkbWFjcm8gfCB0ciAnLycgJ18nYAotICAgIGZlYXR1cmVfY2hlY2tfaGVhZGVyIHJlc3VsdCAiJGhlYWRlciIKLSAgICBjb25maWdfYWRkX21hY3JvIEhBVkVfJHttYWNyb31fSCAkcmVzdWx0ICJTdGRDSGVhZGVyICIKLX0KLQotIyBjYWxsIHNkbF9jaGVja19oZWFkZXIgd2l0aCBhIGxpc3Qgb2YgaGVhZGVyIG5hbWVzCi1zZGxfY2hlY2tfaGVhZGVycyAoKQotewotICAgIGZvciBoaCBpbiAkKjsgZG8KLSAgICAgICAgc2RsX2NoZWNrX2hlYWRlciAiJGhoIgotICAgIGRvbmUKLX0KLQotIyBhIGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgdGhhdCBhIGdpdmVuIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgQyBsaWJyYXJ5Ci0jIHRoaXMgd2lsbCB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBhIHJlbGV2YW50IGxpbmUKLSMgJDE6IGZ1bmN0aW9uIG5hbWUKLSMgJDI6IG9wdGlvbmFsLCBsaWJyYXJpZXMgdG8gbGluayBhZ2FpbnN0Ci0jCi1zZGxfY2hlY2tfZnVuYyAoKQotewotICAgIGxvY2FsIHJlc3VsdAotICAgIGxvY2FsIGZ1bmNuYW1lCi0gICAgbG9jYWwgbWFjcm8KLSAgICBmdW5jbmFtZT0iJDEiCi0gICAgbWFjcm89YHRvX3VwcGVyY2FzZSAkMWAKLSAgICBybSAtZiAkVE1QQwotICAgIGNhdCA+ICRUTVBDIDw8RU9GCi0jdW5kZWYgJGZ1bmNuYW1lCi0jZGVmaW5lICRmdW5jbmFtZSAgX2lubm9jdW91c18kZnVuY25hbWUKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSN1bmRlZiAkZnVuY25hbWUKLQotdHlwZWRlZiB2b2lkICgqZnVuY190KSh2b2lkKTsKLWV4dGVybiB2b2lkICRmdW5jbmFtZSh2b2lkKTsKLWZ1bmNfdCAgX2R1bW15ID0gJGZ1bmNuYW1lOwotaW50ICAgbWFpbih2b2lkKQotewotICAgIHJldHVybiBfZHVtbXkgPT0gJGZ1bmNuYW1lOwotfQotRU9GCi0gICAgRVhUUkFfTERGTEFHUz0iJDIiCi0gICAgZmVhdHVyZV9jaGVja19saW5rIHJlc3VsdAotICAgIGNvbmZpZ19hZGRfbWFjcm8gSEFWRV8ke21hY3JvfSAkcmVzdWx0ICJTdGRDRnVuYyAgICIKLX0KLQotIyBjYWxsIHNkbF9jaGVja19mdW5jIHdpdGggYSBsaXN0IG9mIGZ1bmN0aW9ucwotc2RsX2NoZWNrX2Z1bmNzICgpCi17Ci0gICAgZm9yIGZmIGluICQqOyBkbwotICAgICAgICBzZGxfY2hlY2tfZnVuYyAiJGZmIgotICAgIGRvbmUKLX0KLQotIyBjaGVjayBlbmRpYW5lc3Mgb2YgdGhlIGhvc3QgcGxhdGZvcm0KLXNkbF9jaGVja19lbmRpYW5lc3MgKCkKLXsKLSAgICBjYXQgPiAkVE1QQyA8PEVPRgotICAgIGludCAgbWFpbih2b2lkKQotICAgIHsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgIHY7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgYlsyXTsKLSAgICAgICAgfSB1OwotCi0gICAgICAgIHUudiA9IDB4MTIzNDsKLSAgICAgICAgcmV0dXJuICh1LmJbMF0gPT0gMHgxMik7Ci0gICAgfQotRU9GCi0gICAgZmVhdHVyZV9ydW5fZXhlYyB0ZXN0X2UKLSAgICBpZiBbICIkdGVzdF9lIiA9ICIxIiBdIDsgdGhlbgotICAgICAgICBldmFsICQxPTQzMjEKLSAgICBlbHNlCi0gICAgICAgIGV2YWwgJDE9MTIzNAotICAgIGZpCi19Ci0KLQotZ2VuZXJhdGVfU0RMX2NvbmZpZ19oICgpCi17Ci0gICAgZWNobyAiLyogVGhpcyBmaWxlIHdhcyBhdXRvZ2VuZXJhdGVkIGJ5ICckUFJPR05BTUUnIC0gZG8gbm90IGVkaXQgKi8iID4gJGNvbmZpZ19oCi0KLSAgICBjb25maWdfYWRkICIjaWZuZGVmIF9TRExfY29uZmlnX2giCi0gICAgY29uZmlnX2FkZCAiI2RlZmluZSBfU0RMX2NvbmZpZ19oIgotICAgIGNvbmZpZ19hZGQgIiIKLSAgICBjb25maWdfYWRkICIjaW5jbHVkZSBcIlNETF9wbGF0Zm9ybS5oXCIiCi0gICAgY29uZmlnX2FkZCAiIgotICAgIAotICAgICMgdHJ1ZSBmb3IgYWxsIGFyY2hpdGVjdHVyZXMgdGhlc2UgZGF5cwotICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX0hBU182NEJJVF9UWVBFICAxCi0KLSAgICBzZGxfY2hlY2tfZW5kaWFuZXNzIEVORElBTkVTUwotICAgIGNvbmZpZ19hZGQgIiNkZWZpbmUgU0RMX0JZVEVPUkRFUiAkRU5ESUFORVNTIgotICAgIGNvbmZpZ19hZGQgIiIKLQotICAgIGNvbmZpZ19hZGRfbWFjcm8gSEFWRV9MSUJDICRDT05GSUdfTElCQwotCi0gICAgY29uZmlnX2FkZCAiI2lmIEhBVkVfTElCQyIKLSAgICBjb25maWdfYWRkICIiCi0gICAgY29uZmlnX2FkZCAiLyogVXNlZnVsIGhlYWRlcnMgKi8iCi0KLSAgICBzZGxfY2hlY2tfaGVhZGVycyAgYWxsb2NhIHN5cy90eXBlcyBzdGRpbwotCi0gICAgIyBqdXN0IGxpa2UgY29uZmlndXJlIC0gZm9yY2UgaXQgdG8gMQotICAgIGNvbmZpZ19hZGQgIiNkZWZpbmUgU1REQ19IRUFERVJTICAxIgotCi0gICAgc2RsX2NoZWNrX2hlYWRlcnMgIHN0ZGxpYiBzdGRhcmcgbWFsbG9jIG1lbW9yeSBzdHJpbmcgc3RyaW5ncyBpbnR0eXBlcyBzdGRpbnQgY3R5cGUgbWF0aCBpY29udiBzaWduYWwgYWx0aXZlYwotCi0gICAgY29uZmlnX2FkZCAiLyogQyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLyIKLQotICAgIHNkbF9jaGVja19mdW5jcyAgbWFsbG9jIGNhbGxvYyByZWFsbG9jIGZyZWUgYWxsb2MKLQotICAgIGNvbmZpZ19hZGQgIiNpZm5kZWYgX1dJTjMyIC8qIERvbid0IHVzZSBvbiBXaW5kb3dzICovIgotCi0gICAgc2RsX2NoZWNrX2Z1bmNzICBnZXRlbnYgcHV0ZW52IHVuc2V0ZW52Ci0KLSAgICBjb25maWdfYWRkICIjZW5kaWYiCi0gICAgc2RsX2NoZWNrX2Z1bmNzIHFzb3J0IGFicyBiY29weSBtZW1zZXQgbWVtY3B5IG1lbW1vdmUgbWVtY21wIHN0cmxlbiBzdHJsY3B5IHN0cmxjYXQKLSAgICBzZGxfY2hlY2tfZnVuY3Mgc3RyZHVwIF9zdHJyZXYgX3N0cnVwciBfc3RybHdyIGluZGV4IHJpbmRleCBzdHJjaHIgc3RycmNociBpdG9hIF9sdG9hCi0gICAgc2RsX2NoZWNrX2Z1bmNzIF91aXRvYSBfdWx0b2Egc3RydG9sIHN0cnRvdWwgX2k2NHRvYSBfdWk2NHRvYSBzdHJ0b2xsIHN0cnRvdWxsCi0gICAgc2RsX2NoZWNrX2Z1bmNzIHN0cnRvZCBhdG9pIGF0b2Ygc3RyY21wIHN0cm5jbXAgX3N0cmljbXAgc3RyY2FzZWNtcCBfc3RybmljbXAKLSAgICBzZGxfY2hlY2tfZnVuY3MgdnNucHJpbnRmIGljb252IHNpZ2FjdGlvbiBzZXRqbXAgbmFub3NsZWVwCi0KLSAgICBzZGxfY2hlY2tfZnVuYyBjbG9ja19nZXR0aW1lIC1scnQKLSAgICBzZGxfY2hlY2tfZnVuYyBkbHZzeW0gLWxkbAotCi0gICAgc2RsX2NoZWNrX2Z1bmNzIGdldHBhZ2VzaXplCi0KLSAgICBjb25maWdfYWRkICIjZWxzZSIKLSAgICBjb25maWdfYWRkICIvKiBXZSBtYXkgbmVlZCBzb21lIHJlcGxhY2VtZW50IGZvciBzdGRhcmcuaCBoZXJlICovIgotICAgIGNvbmZpZ19hZGQgIiNpbmNsdWRlIDxzdGRhcmcuaD4iCi0gICAgY29uZmlnX2FkZCAiI2VuZGlmIC8qIEhBVkVfTElCQyAqLyIKLSAgICBjb25maWdfYWRkICIiCi0KLSAgICBjb25maWdfYWRkICIvKiBBbGxvdyBkaXNhYmxpbmcgb2YgY29yZSBzdWJzeXN0ZW1zICovIgotCi0gICAgY29uZmlnX2FkZF9tYWNybyBTRExfQVVESU9fRElTQUJMRUQgeWVzCi0gICAgY29uZmlnX2FkZF9tYWNybyBTRExfQ0RST01fRElTQUJMRUQgeWVzCi0gICAgY29uZmlnX2FkZF9tYWNybyBTRExfQ1BVSU5GT19ESVNBQkxFRCBubwotICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX0VWRU5UU19ESVNBQkxFRCBubwotICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX0ZJTEVfRElTQUJMRUQgeWVzCi0gICAgY29uZmlnX2FkZF9tYWNybyBTRExfSk9ZU1RJQ0tfRElTQUJMRUQgeWVzCi0gICAgY29uZmlnX2FkZF9tYWNybyBTRExfTE9BRFNPX0RJU0FCTEVEIG5vCi0gICAgY29uZmlnX2FkZF9tYWNybyBTRExfVEhSRUFEU19ESVNBQkxFRCBubwotICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX1RJTUVSU19ESVNBQkxFRCBubwotICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX1ZJREVPX0RJU0FCTEVEIG5vCi0KLSAgICBjb25maWdfYWRkICIiCi0gICAgY29uZmlnX2FkZCAiLyogRW5hYmxlIHZhcmlvdXMgc2hhcmVkIG9iamVjdCBsb2FkaW5nIHN5c3RlbXMgKi8iCi0KLSAgICBjb25maWdfYWRkX2RyaXZlcl9tYWNyb3MgRFJJVkVSU19MT0FEU08gU0RMX0xPQURTTwotCi0gICAgY29uZmlnX2FkZCAiIgotICAgIGNvbmZpZ19hZGQgIi8qIEVuYWJsZSB2YXJpb3VzIHRocmVhZGluZyBzeXN0ZW1zICovIgotCi0gICAgY29uZmlnX2FkZF9kcml2ZXJfbWFjcm9zIERSSVZFUlNfVEhSRUFEIFNETF9USFJFQUQKLQotICAgIGNvbmZpZ19hZGQgIiIKLSAgICBjb25maWdfYWRkICIvKiBFbmFibGUgdmFyaW91cyB0aW1lciBzeXN0ZW1zICovIgotCi0gICAgY29uZmlnX2FkZF9kcml2ZXJfbWFjcm9zIERSSVZFUlNfVElNRVIgU0RMX1RJTUVSCi0KLSAgICBjb25maWdfYWRkICIiCi0gICAgY29uZmlnX2FkZCAiLyogRW5hYmxlIHZhcmlvdXMgdmlkZW8gZHJpdmVycyAqLyIKLQotICAgIGNvbmZpZ19hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX1ZJREVPIFNETF9WSURFT19EUklWRVIKLQotICAgIGNvbmZpZ19hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX01BSU4gU0RMX01BSU4KLQotICAgICMgdGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBnb29kIGVub3VnaCBmb3IgYWxsIHJlY2VudCBVbml4IGRpc3RyaWJ1dGlvbnMKLSAgICBjb25maWdfYWRkICIjZGVmaW5lIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUMgXCJsaWJYMTEuc28uNlwiIgotICAgIGNvbmZpZ19hZGQgIiNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YRVhUIFwibGliWGV4dC5zby42XCIiCi0gICAgY29uZmlnX2FkZCAiI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSQU5EUiBcImxpYlhyYW5kci5zby4yXCIiCi0gICAgY29uZmlnX2FkZCAiI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSRU5ERVIgXCJsaWJYcmVuZGVyLnNvLjFcIiIKLQotICAgICMgdG9kbzogT3BlbkdMIHN1cHBvcnQgPwotICAgICMgdG9kbzogQXNzZW1ibHkgcm91dGluZXMgc3VwcG9ydCA/Ci0KLSAgICBjb25maWdfYWRkICIjZW5kaWYgLyogX1NETF9jb25maWdfaCAqLyIKLX0KLQotIyMjIEJ1aWxkIHRoZSBjb25maWcgc3ViLW1ha2VmaWxlCi0jIyMKLQotbWFrZV9hZGQgKCkKLXsKLSAgICBlY2hvICIkMSIgPj4gJGNvbmZpZ19tawotfQotCi1tYWtlX2FkZF9kcml2ZXJfbWFjcm9zICgpCi17Ci0gICAgbG9jYWwgZHJpdmVyX2xpc3Q9ImB2YXJfdmFsdWUgJHsxfV8ke0hPU1RfT1N9YCIKLSAgICBsb2NhbCBkcml2ZXJfbmFtZQotICAgIGlmIFsgLXogIiRkcml2ZXJfbGlzdCIgXSA7IHRoZW4KLSAgICAgICAgZHJpdmVyX2xpc3Q9ImB2YXJfdmFsdWUgJHsxfV9kZWZhdWx0YCIKLSAgICBmaQotICAgIGZvciBkcml2ZXJfbmFtZSBpbiAkZHJpdmVyX2xpc3Q7IGRvCi0gICAgICAgIG1ha2VfYWRkICJTRExfJDJfJHtkcml2ZXJfbmFtZX0gOj0geWVzIgotICAgIGRvbmUKLX0KLQotZ2VuZXJhdGVfc2RsX2NvbmZpZ19tayAoKQotewotICAgIENGTEFHUz0iJENGTEFHUyAkQlVJTERfQ0ZMQUdTIgotICAgIExERkxBR1M9IiRMREZMQUdTICRCVUlMRF9MREZMQUdTIgotICAgIGNyZWF0ZV9jb25maWdfbWsKLQotICAgIG1ha2VfYWRkICIiCi0gICAgUFdEPWBwd2RgCi0gICAgbWFrZV9hZGQgIlNSQ19QQVRIPSRQV0QiCi0gICAgbWFrZV9hZGQgIkJVSUxEX1NZU1RFTT0kQU5EUk9JRF9RRU1VX1BBVEgvYW5kcm9pZC9idWlsZCIKLQotICAgIG1ha2VfYWRkICJTRExfQ09ORklHX0xJQkMgOj0gJENPTkZJR19MSUJDIgotICAgIG1ha2VfYWRkICJTRExfQ09ORklHX0NQVUlORk8gOj0geWVzIgotCi0gICAgbWFrZV9hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX0xPQURTTyBDT05GSUdfTE9BRFNPCi0gICAgbWFrZV9hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX1RIUkVBRCBDT05GSUdfVEhSRUFECi0gICAgbWFrZV9hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX1RJTUVSICBDT05GSUdfVElNRVIKLSAgICBtYWtlX2FkZF9kcml2ZXJfbWFjcm9zIERSSVZFUlNfVklERU8gIENPTkZJR19WSURFTwotCi0gICAgbWFrZV9hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX01BSU4gICBDT05GSUdfTUFJTgotCi0gICAgbWFrZV9hZGQgIklOU1RBTExfVEFSR0VUUyA6PSAkT1BUSU9OX1RBUkdFVFMiCi19Ci0KLSMjIyBCdWlsZCB0aGUgZmluYWwgc2RsLWNvbmZpZyBzY3JpcHQgZnJvbSB0aGUgdGVtcGxhdGUKLSMjIwotCi1nZW5lcmF0ZV9zZGxfY29uZmlnICgpCi17Ci0gICAgIyBidWlsZCBhIHNlZCBzY3JpcHQgdGhhdCB3aWxsIHJlcGxhY2UgYWxsIEBWQVJJQUJMRVNAIGluIHRoZSB0ZW1wbGF0ZQotICAgICMgd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZXMKLSAgICBybSAtZiAkVE1QQwotCi0gICAgIyByZXBsYWNlIEBleGVjX3ByZWZpeEAgd2l0aCAie3ByZWZpeH0iLCBhbmQgQGxpYmRpckAgd2l0aCAie2xpYmRpcn0iCi0gICAgY2F0ID4gJFRNUEMgPDxFT0YKLXMhQGV4ZWNfcHJlZml4QCFcJFx7cHJlZml4XH0hZwotcyFAbGliZGlyQCFcJFx7ZXhlY19wcmVmaXhcfS9saWJzIWcKLXMhQGluY2x1ZGVkaXJAIVwkXHtwcmVmaXhcfS9pbmNsdWRlIWcKLUVPRgotCi0gICAgIyB3ZSB3YW50IHRvIGVuYWJsZSBzdGF0aWMgbGlua2luZywgZG8gQEVOQUJMRV9TVEFUSUNfRkFMU0VAIGFuZCBARU5BQkxFX1NUQVRJQ19UUlVFQAotICAgIGNhdCA+PiAkVE1QQyA8PEVPRgotcyFARU5BQkxFX1NUQVRJQ19GQUxTRUAhXCMhZwotcyFARU5BQkxFX1NUQVRJQ19UUlVFQCEhZwotcyFARU5BQkxFX1NIQVJFRF9UUlVFQCFcIyFnCi1zIUBFTkFCTEVfU0hBUkVEX0ZBTFNFQCEhZwotRU9GCi0KLSAgICAjIHNldCB0aGUgdmVyc2lvbiB0byAxLjIuMTIKLSAgICBjYXQgPj4gJFRNUEMgPDxFT0YKLXMhQFNETF9WRVJTSU9OQCExLjIuMTIhZwotRU9GCi0KLSAgICAjCi0gICAgY2F0ID4+ICRUTVBDIDw8RU9GCi1zIUBTRExfQ0ZMQUdTQCEkU0RMX0NGTEFHUyFnCi1zIUBTRExfU1RBVElDX0xJQlNAISRTRExfU1RBVElDX0xJQlMhZwotRU9GCi0KLSAgICBjYXQgc2RsLWNvbmZpZy5pbiB8IHNlZCAtZiAkVE1QQyA+IG9ianMvc2RsLWNvbmZpZwotICAgIGNobW9kICt4IG9ianMvc2RsLWNvbmZpZwotfQotCi0jIGNvcHkgYSBjb25maWd1cmF0aW9uIGZpbGUgb3IgcGVyZm9ybSBhdXRvLWRldGVjdGlvbiBpZiBvbmUgaXMgbm90IGF2YWlsYWJsZQotIyBvciB0aGUgLS1mb3JjZS1hdXRvZGV0ZWN0IG9wdGlvbiB3YXMgdXNlZAotIyAkMTogYmFzZW5hbWUgb2YgY29uZmlnIGZpbGUKLSMgJDI6IGNvbW1hbmQgdG8gcnVuIHRvIHBlcmZvcm0gYXV0by1kZXRlY3Rpb24vZ2VuZXJhdGlvbgotIwotY29weV9vcl9hdXRvZGV0ZWN0ICgpCi17Ci0gICAgaWYgWyAiJE9QVElPTl9GT1JDRV9BVVRPREVURUNUIiAhPSAieWVzIiAtYSAtZiBhbmRyb2lkL2J1aWxkLyRPUy8kMSBdIDsgdGhlbgotICAgICAgICBsb2cgIlNldHVwICAgICAgOiBDb3B5aW5nICQxIGZyb20gYW5kcm9pZC9idWlsZC8kT1MiCi0gICAgICAgIGNwIC1mIGFuZHJvaWQvYnVpbGQvJE9TLyQxIG9ianMvJDEKLSAgICBlbHNlCi0gICAgICAgIGxvZyAiU2V0dXAgICAgICA6IEF1dG8tZ2VuZXJhdGluZyAkMSIKLSAgICAgICAgZXZhbCAkMgotICAgIGZpCi19Ci0KLWdlbmVyYXRlX2FsbCAoKQotewotICBjb3B5X29yX2F1dG9kZXRlY3QgU0RMX2NvbmZpZy5oIGdlbmVyYXRlX1NETF9jb25maWdfaAotICBnZW5lcmF0ZV9zZGxfY29uZmlnX21rCi0gIGNvcHlfb3JfYXV0b2RldGVjdCBzZGwtY29uZmlnIGdlbmVyYXRlX3NkbF9jb25maWcKLX0KLQotRFJJVkVSU19MT0FEU09fZGVmYXVsdD1ETE9QRU4KLURSSVZFUlNfTE9BRFNPX2Rhcndpbj1ETENPTVBBVAotRFJJVkVSU19MT0FEU09fd2luZG93cz1XSU4zMgotCi0jIFRPRE86IGRldGVybWluZSBpZiBQVEhSRUFEX1JFQ1VSU0lWRSBvciBQVEhSRUFEX1JFQ1VSU0lWRV9OUCBpcyB2YWxpZCBmb3IgdGhlIHBsYXRmb3JtCi1EUklWRVJTX1RIUkVBRF9kZWZhdWx0PSJQVEhSRUFEIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYIgotRFJJVkVSU19USFJFQURfbGludXg9IlBUSFJFQUQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfTlAiCi1EUklWRVJTX1RIUkVBRF93aW5kb3dzPVdJTjMyCi0KLURSSVZFUlNfVElNRVJfZGVmYXVsdD1VTklYCi1EUklWRVJTX1RJTUVSX3dpbmRvd3M9V0lOMzIKLQotIyBUT0RPOiBhY3R1YWxseSBjb21wdXRlIHRoaXMgcHJvcGVybHkgZm9yIFgxMSBhbmQgZHluYW1pYyBsb2FkaW5nICEhCi1EUklWRVJTX1ZJREVPX2RlZmF1bHQ9IlgxMSBYMTFfRFBNUyBYMTFfWElORVJBTUEgWDExX1hNRSIKLURSSVZFUlNfVklERU9fZGFyd2luPSJRVUFSVFoiCi1EUklWRVJTX1ZJREVPX3dpbmRvd3M9IldJTkRJQiIKLQotRFJJVkVSU19NQUlOX2RlZmF1bHQ9RFVNTVkKLURSSVZFUlNfTUFJTl9kYXJ3aW49TUFDT1NYCi1EUklWRVJTX01BSU5fd2luZG93cz1XSU4zMgotCi1nZW5lcmF0ZV9hbGwKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWMyNmMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBNYWluIGluY2x1ZGUgaGVhZGVyIGZvciB0aGUgU0RMIGxpYnJhcnkgKi8KLQotI2lmbmRlZiBfU0RMX0gKLSNkZWZpbmUgX1NETF9ICi0KLSNpbmNsdWRlICJTRExfbWFpbi5oIgotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICJTRExfY2Ryb20uaCIKLSNpbmNsdWRlICJTRExfY3B1aW5mby5oIgotI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKLSNpbmNsdWRlICJTRExfZXJyb3IuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzLmgiCi0jaW5jbHVkZSAiU0RMX2xvYWRzby5oIgotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIlNETF9yd29wcy5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfdmVyc2lvbi5oIgotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEFzIG9mIHZlcnNpb24gMC41LCBTREwgaXMgbG9hZGVkIGR5bmFtaWNhbGx5IGludG8gdGhlIGFwcGxpY2F0aW9uICovCi0KLS8qIFRoZXNlIGFyZSB0aGUgZmxhZ3Mgd2hpY2ggbWF5IGJlIHBhc3NlZCB0byBTRExfSW5pdCgpIC0tIHlvdSBzaG91bGQKLSAgIHNwZWNpZnkgdGhlIHN1YnN5c3RlbXMgd2hpY2ggeW91IHdpbGwgYmUgdXNpbmcgaW4geW91ciBhcHBsaWNhdGlvbi4KLSovCi0jZGVmaW5lCVNETF9JTklUX1RJTUVSCQkweDAwMDAwMDAxCi0jZGVmaW5lIFNETF9JTklUX0FVRElPCQkweDAwMDAwMDEwCi0jZGVmaW5lIFNETF9JTklUX1ZJREVPCQkweDAwMDAwMDIwCi0jZGVmaW5lIFNETF9JTklUX0NEUk9NCQkweDAwMDAwMTAwCi0jZGVmaW5lIFNETF9JTklUX0pPWVNUSUNLCTB4MDAwMDAyMDAKLSNkZWZpbmUgU0RMX0lOSVRfTk9QQVJBQ0hVVEUJMHgwMDEwMDAwMAkvKiBEb24ndCBjYXRjaCBmYXRhbCBzaWduYWxzICovCi0jZGVmaW5lIFNETF9JTklUX0VWRU5UVEhSRUFECTB4MDEwMDAwMDAJLyogTm90IHN1cHBvcnRlZCBvbiBhbGwgT1MncyAqLwotI2RlZmluZSBTRExfSU5JVF9FVkVSWVRISU5HCTB4MDAwMEZGRkYKLQotLyogVGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUgU0RMIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJ5IGFuZCBpbml0aWFsaXplcyAKLSAqIHRoZSBzdWJzeXN0ZW1zIHNwZWNpZmllZCBieSAnZmxhZ3MnIChhbmQgdGhvc2Ugc2F0aXNmeWluZyBkZXBlbmRlbmNpZXMpCi0gKiBVbmxlc3MgdGhlIFNETF9JTklUX05PUEFSQUNIVVRFIGZsYWcgaXMgc2V0LCBpdCB3aWxsIGluc3RhbGwgY2xlYW51cAotICogc2lnbmFsIGhhbmRsZXJzIGZvciBzb21lIGNvbW1vbmx5IGlnbm9yZWQgZmF0YWwgc2lnbmFscyAobGlrZSBTSUdTRUdWKQotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0luaXQoVWludDMyIGZsYWdzKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBzcGVjaWZpYyBTREwgc3Vic3lzdGVtcyAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Jbml0U3ViU3lzdGVtKFVpbnQzMiBmbGFncyk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIHNwZWNpZmljIFNETCBzdWJzeXN0ZW1zICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9RdWl0U3ViU3lzdGVtKFVpbnQzMiBmbGFncyk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBtYXNrIG9mIHRoZSBzcGVjaWZpZWQgc3Vic3lzdGVtcyB3aGljaCBoYXZlCi0gICBiZWVuIGluaXRpYWxpemVkLgotICAgSWYgJ2ZsYWdzJyBpcyAwLCBpdCByZXR1cm5zIGEgbWFzayBvZiBhbGwgaW5pdGlhbGl6ZWQgc3Vic3lzdGVtcy4KLSovCi1leHRlcm4gREVDTFNQRUMgVWludDMyIFNETENBTEwgU0RMX1dhc0luaXQoVWludDMyIGZsYWdzKTsKLQotLyogVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgYWxsIGluaXRpYWxpemVkIHN1YnN5c3RlbXMgYW5kIHVubG9hZHMgdGhlCi0gKiBkeW5hbWljYWxseSBsaW5rZWQgbGlicmFyeS4gIFlvdSBzaG91bGQgY2FsbCBpdCB1cG9uIGFsbCBleGl0IGNvbmRpdGlvbnMuCi0gKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1F1aXQodm9pZCk7Ci0KLS8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCi0KLSNlbmRpZiAvKiBfU0RMX0ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9hY3RpdmUuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9hY3RpdmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmNDc0Yy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfYWN0aXZlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBJbmNsdWRlIGZpbGUgZm9yIFNETCBhcHBsaWNhdGlvbiBmb2N1cyBldmVudCBoYW5kbGluZyAqLwotCi0jaWZuZGVmIF9TRExfYWN0aXZlX2gKLSNkZWZpbmUgX1NETF9hY3RpdmVfaAotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFRoZSBhdmFpbGFibGUgYXBwbGljYXRpb24gc3RhdGVzICovCi0jZGVmaW5lIFNETF9BUFBNT1VTRUZPQ1VTCTB4MDEJCS8qIFRoZSBhcHAgaGFzIG1vdXNlIGNvdmVyYWdlICovCi0jZGVmaW5lIFNETF9BUFBJTlBVVEZPQ1VTCTB4MDIJCS8qIFRoZSBhcHAgaGFzIGlucHV0IGZvY3VzICovCi0jZGVmaW5lIFNETF9BUFBBQ1RJVkUJCTB4MDQJCS8qIFRoZSBhcHBsaWNhdGlvbiBpcyBhY3RpdmUgKi8KLQotLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLwotLyogCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uLCB3aGljaCBpcyBhCi0gKiBiaXR3aXNlIGNvbWJpbmF0aW9uIG9mIFNETF9BUFBNT1VTRUZPQ1VTLCBTRExfQVBQSU5QVVRGT0NVUywgYW5kCi0gKiBTRExfQVBQQUNUSVZFLiAgSWYgU0RMX0FQUEFDVElWRSBpcyBzZXQsIHRoZW4gdGhlIHVzZXIgaXMgYWJsZSB0bwotICogc2VlIHlvdXIgYXBwbGljYXRpb24sIG90aGVyd2lzZSBpdCBoYXMgYmVlbiBpY29uaWZpZWQgb3IgZGlzYWJsZWQuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBVaW50OCBTRExDQUxMIFNETF9HZXRBcHBTdGF0ZSh2b2lkKTsKLQotCi0vKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaW5jbHVkZSAiY2xvc2VfY29kZS5oIgotCi0jZW5kaWYgLyogX1NETF9hY3RpdmVfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2F1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlYzQ3NS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBBY2Nlc3MgdG8gdGhlIHJhdyBhdWRpbyBtaXhpbmcgYnVmZmVyIGZvciB0aGUgU0RMIGxpYnJhcnkgKi8KLQotI2lmbmRlZiBfU0RMX2F1ZGlvX2gKLSNkZWZpbmUgX1NETF9hdWRpb19oCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0jaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICJTRExfcndvcHMuaCIKLQotI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKLS8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBUaGUgY2FsY3VsYXRlZCB2YWx1ZXMgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIGNhbGN1bGF0ZWQgYnkgU0RMX09wZW5BdWRpbygpICovCi10eXBlZGVmIHN0cnVjdCBTRExfQXVkaW9TcGVjIHsKLQlpbnQgZnJlcTsJCS8qIERTUCBmcmVxdWVuY3kgLS0gc2FtcGxlcyBwZXIgc2Vjb25kICovCi0JVWludDE2IGZvcm1hdDsJCS8qIEF1ZGlvIGRhdGEgZm9ybWF0ICovCi0JVWludDggIGNoYW5uZWxzOwkvKiBOdW1iZXIgb2YgY2hhbm5lbHM6IDEgbW9ubywgMiBzdGVyZW8gKi8KLQlVaW50OCAgc2lsZW5jZTsJCS8qIEF1ZGlvIGJ1ZmZlciBzaWxlbmNlIHZhbHVlIChjYWxjdWxhdGVkKSAqLwotCVVpbnQxNiBzYW1wbGVzOwkJLyogQXVkaW8gYnVmZmVyIHNpemUgaW4gc2FtcGxlcyAocG93ZXIgb2YgMikgKi8KLQlVaW50MTYgcGFkZGluZzsJCS8qIE5lY2Vzc2FyeSBmb3Igc29tZSBjb21waWxlIGVudmlyb25tZW50cyAqLwotCVVpbnQzMiBzaXplOwkJLyogQXVkaW8gYnVmZmVyIHNpemUgaW4gYnl0ZXMgKGNhbGN1bGF0ZWQpICovCi0JLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIG5lZWRzIG1vcmUgZGF0YS4KLQkgICAnc3RyZWFtJyBpcyBhIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIGRhdGEgYnVmZmVyCi0JICAgJ2xlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGF0IGJ1ZmZlciBpbiBieXRlcy4KLQkgICBPbmNlIHRoZSBjYWxsYmFjayByZXR1cm5zLCB0aGUgYnVmZmVyIHdpbGwgbm8gbG9uZ2VyIGJlIHZhbGlkLgotCSAgIFN0ZXJlbyBzYW1wbGVzIGFyZSBzdG9yZWQgaW4gYSBMUkxSTFIgb3JkZXJpbmcuCi0JKi8KLQl2b2lkIChTRExDQUxMICpjYWxsYmFjaykodm9pZCAqdXNlcmRhdGEsIFVpbnQ4ICpzdHJlYW0sIGludCBsZW4pOwotCXZvaWQgICp1c2VyZGF0YTsKLX0gU0RMX0F1ZGlvU3BlYzsKLQotLyogQXVkaW8gZm9ybWF0IGZsYWdzIChkZWZhdWx0cyB0byBMU0IgYnl0ZSBvcmRlcikgKi8KLSNkZWZpbmUgQVVESU9fVTgJMHgwMDA4CS8qIFVuc2lnbmVkIDgtYml0IHNhbXBsZXMgKi8KLSNkZWZpbmUgQVVESU9fUzgJMHg4MDA4CS8qIFNpZ25lZCA4LWJpdCBzYW1wbGVzICovCi0jZGVmaW5lIEFVRElPX1UxNkxTQgkweDAwMTAJLyogVW5zaWduZWQgMTYtYml0IHNhbXBsZXMgKi8KLSNkZWZpbmUgQVVESU9fUzE2TFNCCTB4ODAxMAkvKiBTaWduZWQgMTYtYml0IHNhbXBsZXMgKi8KLSNkZWZpbmUgQVVESU9fVTE2TVNCCTB4MTAxMAkvKiBBcyBhYm92ZSwgYnV0IGJpZy1lbmRpYW4gYnl0ZSBvcmRlciAqLwotI2RlZmluZSBBVURJT19TMTZNU0IJMHg5MDEwCS8qIEFzIGFib3ZlLCBidXQgYmlnLWVuZGlhbiBieXRlIG9yZGVyICovCi0jZGVmaW5lIEFVRElPX1UxNglBVURJT19VMTZMU0IKLSNkZWZpbmUgQVVESU9fUzE2CUFVRElPX1MxNkxTQgotCi0vKiBOYXRpdmUgYXVkaW8gYnl0ZSBvcmRlcmluZyAqLwotI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KLSNkZWZpbmUgQVVESU9fVTE2U1lTCUFVRElPX1UxNkxTQgotI2RlZmluZSBBVURJT19TMTZTWVMJQVVESU9fUzE2TFNCCi0jZWxzZQotI2RlZmluZSBBVURJT19VMTZTWVMJQVVESU9fVTE2TVNCCi0jZGVmaW5lIEFVRElPX1MxNlNZUwlBVURJT19TMTZNU0IKLSNlbmRpZgotCi0KLS8qIEEgc3RydWN0dXJlIHRvIGhvbGQgYSBzZXQgb2YgYXVkaW8gY29udmVyc2lvbiBmaWx0ZXJzIGFuZCBidWZmZXJzICovCi10eXBlZGVmIHN0cnVjdCBTRExfQXVkaW9DVlQgewotCWludCBuZWVkZWQ7CQkJLyogU2V0IHRvIDEgaWYgY29udmVyc2lvbiBwb3NzaWJsZSAqLwotCVVpbnQxNiBzcmNfZm9ybWF0OwkJLyogU291cmNlIGF1ZGlvIGZvcm1hdCAqLwotCVVpbnQxNiBkc3RfZm9ybWF0OwkJLyogVGFyZ2V0IGF1ZGlvIGZvcm1hdCAqLwotCWRvdWJsZSByYXRlX2luY3I7CQkvKiBSYXRlIGNvbnZlcnNpb24gaW5jcmVtZW50ICovCi0JVWludDggKmJ1ZjsJCQkvKiBCdWZmZXIgdG8gaG9sZCBlbnRpcmUgYXVkaW8gZGF0YSAqLwotCWludCAgICBsZW47CQkJLyogTGVuZ3RoIG9mIG9yaWdpbmFsIGF1ZGlvIGJ1ZmZlciAqLwotCWludCAgICBsZW5fY3Z0OwkJCS8qIExlbmd0aCBvZiBjb252ZXJ0ZWQgYXVkaW8gYnVmZmVyICovCi0JaW50ICAgIGxlbl9tdWx0OwkJLyogYnVmZmVyIG11c3QgYmUgbGVuKmxlbl9tdWx0IGJpZyAqLwotCWRvdWJsZSBsZW5fcmF0aW87IAkvKiBHaXZlbiBsZW4sIGZpbmFsIHNpemUgaXMgbGVuKmxlbl9yYXRpbyAqLwotCXZvaWQgKFNETENBTEwgKmZpbHRlcnNbMTBdKShzdHJ1Y3QgU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpOwotCWludCBmaWx0ZXJfaW5kZXg7CQkvKiBDdXJyZW50IGF1ZGlvIGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KLX0gU0RMX0F1ZGlvQ1ZUOwotCi0KLS8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGludGVybmFsbHksIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgdW5sZXNzIHlvdQotICogaGF2ZSBhIHNwZWNpZmljIG5lZWQgdG8gc3BlY2lmeSB0aGUgYXVkaW8gZHJpdmVyIHlvdSB3YW50IHRvIHVzZS4KLSAqIFlvdSBzaG91bGQgbm9ybWFsbHkgdXNlIFNETF9Jbml0KCkgb3IgU0RMX0luaXRTdWJTeXN0ZW0oKS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9BdWRpb0luaXQoY29uc3QgY2hhciAqZHJpdmVyX25hbWUpOwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfQXVkaW9RdWl0KHZvaWQpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBnaXZlbiBjaGFyYWN0ZXIgYnVmZmVyIHdpdGggdGhlIG5hbWUgb2YgdGhlCi0gKiBjdXJyZW50IGF1ZGlvIGRyaXZlciwgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGl0IGlmIHRoZSBhdWRpbyBkcml2ZXIgaGFzCi0gKiBiZWVuIGluaXRpYWxpemVkLiAgSXQgcmV0dXJucyBOVUxMIGlmIG5vIGRyaXZlciBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9BdWRpb0RyaXZlck5hbWUoY2hhciAqbmFtZWJ1ZiwgaW50IG1heGxlbik7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBhdWRpbyBkZXZpY2Ugd2l0aCB0aGUgZGVzaXJlZCBwYXJhbWV0ZXJzLCBhbmQKLSAqIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBwbGFjaW5nIHRoZSBhY3R1YWwgaGFyZHdhcmUgcGFyYW1ldGVycyBpbiB0aGUKLSAqIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5ICdvYnRhaW5lZCcuICBJZiAnb2J0YWluZWQnIGlzIE5VTEwsIHRoZSBhdWRpbwotICogZGF0YSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSBpbiB0aGUKLSAqIHJlcXVlc3RlZCBmb3JtYXQsIGFuZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIHRoZSBoYXJkd2FyZQotICogYXVkaW8gZm9ybWF0IGlmIG5lY2Vzc2FyeS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMSBpZiBpdCBmYWlsZWQgCi0gKiB0byBvcGVuIHRoZSBhdWRpbyBkZXZpY2UsIG9yIGNvdWxkbid0IHNldCB1cCB0aGUgYXVkaW8gdGhyZWFkLgotICoKLSAqIFdoZW4gZmlsbGluZyBpbiB0aGUgZGVzaXJlZCBhdWRpbyBzcGVjIHN0cnVjdHVyZSwKLSAqICAnZGVzaXJlZC0+ZnJlcScgc2hvdWxkIGJlIHRoZSBkZXNpcmVkIGF1ZGlvIGZyZXF1ZW5jeSBpbiBzYW1wbGVzLXBlci1zZWNvbmQuCi0gKiAgJ2Rlc2lyZWQtPmZvcm1hdCcgc2hvdWxkIGJlIHRoZSBkZXNpcmVkIGF1ZGlvIGZvcm1hdC4KLSAqICAnZGVzaXJlZC0+c2FtcGxlcycgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgYXVkaW8gYnVmZmVyLCBpbiBzYW1wbGVzLgotICogICAgIFRoaXMgbnVtYmVyIHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3bywgYW5kIG1heSBiZSBhZGp1c3RlZCBieSB0aGUgYXVkaW8KLSAqICAgICBkcml2ZXIgdG8gYSB2YWx1ZSBtb3JlIHN1aXRhYmxlIGZvciB0aGUgaGFyZHdhcmUuICBHb29kIHZhbHVlcyBzZWVtIHRvCi0gKiAgICAgcmFuZ2UgYmV0d2VlbiA1MTIgYW5kIDgwOTYgaW5jbHVzaXZlLCBkZXBlbmRpbmcgb24gdGhlIGFwcGxpY2F0aW9uIGFuZAotICogICAgIENQVSBzcGVlZC4gIFNtYWxsZXIgdmFsdWVzIHlpZWxkIGZhc3RlciByZXNwb25zZSB0aW1lLCBidXQgY2FuIGxlYWQKLSAqICAgICB0byB1bmRlcmZsb3cgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGRvaW5nIGhlYXZ5IHByb2Nlc3NpbmcgYW5kIGNhbm5vdAotICogICAgIGZpbGwgdGhlIGF1ZGlvIGJ1ZmZlciBpbiB0aW1lLiAgQSBzdGVyZW8gc2FtcGxlIGNvbnNpc3RzIG9mIGJvdGggcmlnaHQKLSAqICAgICBhbmQgbGVmdCBjaGFubmVscyBpbiBMUiBvcmRlcmluZy4KLSAqICAgICBOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGltZSBieSB0aGUKLSAqICAgICBmb2xsb3dpbmcgZm9ybXVsYTogIG1zID0gKHNhbXBsZXMqMTAwMCkvZnJlcQotICogICdkZXNpcmVkLT5zaXplJyBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYXVkaW8gYnVmZmVyLCBhbmQgaXMKLSAqICAgICBjYWxjdWxhdGVkIGJ5IFNETF9PcGVuQXVkaW8oKS4KLSAqICAnZGVzaXJlZC0+c2lsZW5jZScgaXMgdGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBidWZmZXIgdG8gc2lsZW5jZSwKLSAqICAgICBhbmQgaXMgY2FsY3VsYXRlZCBieSBTRExfT3BlbkF1ZGlvKCkuCi0gKiAgJ2Rlc2lyZWQtPmNhbGxiYWNrJyBzaG91bGQgYmUgc2V0IHRvIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZAotICogICAgIHdoZW4gdGhlIGF1ZGlvIGRldmljZSBpcyByZWFkeSBmb3IgbW9yZSBkYXRhLiAgSXQgaXMgcGFzc2VkIGEgcG9pbnRlcgotICogICAgIHRvIHRoZSBhdWRpbyBidWZmZXIsIGFuZCB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhdWRpbyBidWZmZXIuCi0gKiAgICAgVGhpcyBmdW5jdGlvbiB1c3VhbGx5IHJ1bnMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQsIGFuZCBzbyB5b3Ugc2hvdWxkCi0gKiAgICAgcHJvdGVjdCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBpdCBhY2Nlc3NlcyBieSBjYWxsaW5nIFNETF9Mb2NrQXVkaW8oKQotICogICAgIGFuZCBTRExfVW5sb2NrQXVkaW8oKSBpbiB5b3VyIGNvZGUuCi0gKiAgJ2Rlc2lyZWQtPnVzZXJkYXRhJyBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB5b3VyIGNhbGxiYWNrCi0gKiAgICAgZnVuY3Rpb24uCi0gKgotICogVGhlIGF1ZGlvIGRldmljZSBzdGFydHMgb3V0IHBsYXlpbmcgc2lsZW5jZSB3aGVuIGl0J3Mgb3BlbmVkLCBhbmQgc2hvdWxkCi0gKiBiZSBlbmFibGVkIGZvciBwbGF5aW5nIGJ5IGNhbGxpbmcgU0RMX1BhdXNlQXVkaW8oMCkgd2hlbiB5b3UgYXJlIHJlYWR5Ci0gKiBmb3IgeW91ciBhdWRpbyBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQuICBTaW5jZSB0aGUgYXVkaW8gZHJpdmVyCi0gKiBtYXkgbW9kaWZ5IHRoZSByZXF1ZXN0ZWQgc2l6ZSBvZiB0aGUgYXVkaW8gYnVmZmVyLCB5b3Ugc2hvdWxkIGFsbG9jYXRlCi0gKiBhbnkgbG9jYWwgbWl4aW5nIGJ1ZmZlcnMgYWZ0ZXIgeW91IG9wZW4gdGhlIGF1ZGlvIGRldmljZS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9PcGVuQXVkaW8oU0RMX0F1ZGlvU3BlYyAqZGVzaXJlZCwgU0RMX0F1ZGlvU3BlYyAqb2J0YWluZWQpOwotCi0vKgotICogR2V0IHRoZSBjdXJyZW50IGF1ZGlvIHN0YXRlOgotICovCi10eXBlZGVmIGVudW0gewotCVNETF9BVURJT19TVE9QUEVEID0gMCwKLQlTRExfQVVESU9fUExBWUlORywKLQlTRExfQVVESU9fUEFVU0VECi19IFNETF9hdWRpb3N0YXR1czsKLWV4dGVybiBERUNMU1BFQyBTRExfYXVkaW9zdGF0dXMgU0RMQ0FMTCBTRExfR2V0QXVkaW9TdGF0dXModm9pZCk7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHBhdXNlcyBhbmQgdW5wYXVzZXMgdGhlIGF1ZGlvIGNhbGxiYWNrIHByb2Nlc3NpbmcuCi0gKiBJdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBwYXJhbWV0ZXIgb2YgMCBhZnRlciBvcGVuaW5nIHRoZSBhdWRpbwotICogZGV2aWNlIHRvIHN0YXJ0IHBsYXlpbmcgc291bmQuICBUaGlzIGlzIHNvIHlvdSBjYW4gc2FmZWx5IGluaXRpYWxpemUKLSAqIGRhdGEgZm9yIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24gYWZ0ZXIgb3BlbmluZyB0aGUgYXVkaW8gZGV2aWNlLgotICogU2lsZW5jZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGF1ZGlvIGRldmljZSBkdXJpbmcgdGhlIHBhdXNlLgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9QYXVzZUF1ZGlvKGludCBwYXVzZV9vbik7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGxvYWRzIGEgV0FWRSBmcm9tIHRoZSBkYXRhIHNvdXJjZSwgYXV0b21hdGljYWxseSBmcmVlaW5nCi0gKiB0aGF0IHNvdXJjZSBpZiAnZnJlZXNyYycgaXMgbm9uLXplcm8uICBGb3IgZXhhbXBsZSwgdG8gbG9hZCBhIFdBVkUgZmlsZSwKLSAqIHlvdSBjb3VsZCBkbzoKLSAqCVNETF9Mb2FkV0FWX1JXKFNETF9SV0Zyb21GaWxlKCJzYW1wbGUud2F2IiwgInJiIiksIDEsIC4uLik7Ci0gKgotICogSWYgdGhpcyBmdW5jdGlvbiBzdWNjZWVkcywgaXQgcmV0dXJucyB0aGUgZ2l2ZW4gU0RMX0F1ZGlvU3BlYywKLSAqIGZpbGxlZCB3aXRoIHRoZSBhdWRpbyBkYXRhIGZvcm1hdCBvZiB0aGUgd2F2ZSBkYXRhLCBhbmQgc2V0cwotICogJ2F1ZGlvX2J1ZicgdG8gYSBtYWxsb2MoKSdkIGJ1ZmZlciBjb250YWluaW5nIHRoZSBhdWRpbyBkYXRhLAotICogYW5kIHNldHMgJ2F1ZGlvX2xlbicgdG8gdGhlIGxlbmd0aCBvZiB0aGF0IGF1ZGlvIGJ1ZmZlciwgaW4gYnl0ZXMuCi0gKiBZb3UgbmVlZCB0byBmcmVlIHRoZSBhdWRpbyBidWZmZXIgd2l0aCBTRExfRnJlZVdBVigpIHdoZW4geW91IGFyZSAKLSAqIGRvbmUgd2l0aCBpdC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTCBhbmQgc2V0cyB0aGUgU0RMIGVycm9yIG1lc3NhZ2UgaWYgdGhlIAotICogd2F2ZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsIHVzZXMgYW4gdW5rbm93biBkYXRhIGZvcm1hdCwgb3IgaXMgCi0gKiBjb3JydXB0LiAgQ3VycmVudGx5IHJhdyBhbmQgTVMtQURQQ00gV0FWRSBmaWxlcyBhcmUgc3VwcG9ydGVkLgotICovCi1leHRlcm4gREVDTFNQRUMgU0RMX0F1ZGlvU3BlYyAqIFNETENBTEwgU0RMX0xvYWRXQVZfUlcoU0RMX1JXb3BzICpzcmMsIGludCBmcmVlc3JjLCBTRExfQXVkaW9TcGVjICpzcGVjLCBVaW50OCAqKmF1ZGlvX2J1ZiwgVWludDMyICphdWRpb19sZW4pOwotCi0vKiBDb21wYXRpYmlsaXR5IGNvbnZlbmllbmNlIGZ1bmN0aW9uIC0tIGxvYWRzIGEgV0FWIGZyb20gYSBmaWxlICovCi0jZGVmaW5lIFNETF9Mb2FkV0FWKGZpbGUsIHNwZWMsIGF1ZGlvX2J1ZiwgYXVkaW9fbGVuKSBcCi0JU0RMX0xvYWRXQVZfUlcoU0RMX1JXRnJvbUZpbGUoZmlsZSwgInJiIiksMSwgc3BlYyxhdWRpb19idWYsYXVkaW9fbGVuKQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBmcmVlcyBkYXRhIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggU0RMX0xvYWRXQVZfUlcoKQotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9GcmVlV0FWKFVpbnQ4ICphdWRpb19idWYpOwotCi0vKgotICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNvdXJjZSBmb3JtYXQgYW5kIHJhdGUgYW5kIGEgZGVzdGluYXRpb24gZm9ybWF0Ci0gKiBhbmQgcmF0ZSwgYW5kIGluaXRpYWxpemVzIHRoZSAnY3Z0JyBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBuZWVkZWQKLSAqIGJ5IFNETF9Db252ZXJ0QXVkaW8oKSB0byBjb252ZXJ0IGEgYnVmZmVyIG9mIGF1ZGlvIGRhdGEgZnJvbSBvbmUgZm9ybWF0Ci0gKiB0byB0aGUgb3RoZXIuCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0J1aWxkQXVkaW9DVlQoU0RMX0F1ZGlvQ1ZUICpjdnQsCi0JCVVpbnQxNiBzcmNfZm9ybWF0LCBVaW50OCBzcmNfY2hhbm5lbHMsIGludCBzcmNfcmF0ZSwKLQkJVWludDE2IGRzdF9mb3JtYXQsIFVpbnQ4IGRzdF9jaGFubmVscywgaW50IGRzdF9yYXRlKTsKLQotLyogT25jZSB5b3UgaGF2ZSBpbml0aWFsaXplZCB0aGUgJ2N2dCcgc3RydWN0dXJlIHVzaW5nIFNETF9CdWlsZEF1ZGlvQ1ZUKCksCi0gKiBjcmVhdGVkIGFuIGF1ZGlvIGJ1ZmZlciBjdnQtPmJ1ZiwgYW5kIGZpbGxlZCBpdCB3aXRoIGN2dC0+bGVuIGJ5dGVzIG9mCi0gKiBhdWRpbyBkYXRhIGluIHRoZSBzb3VyY2UgZm9ybWF0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBpdCBpbi1wbGFjZQotICogdG8gdGhlIGRlc2lyZWQgZm9ybWF0LgotICogVGhlIGRhdGEgY29udmVyc2lvbiBtYXkgZXhwYW5kIHRoZSBzaXplIG9mIHRoZSBhdWRpbyBkYXRhLCBzbyB0aGUgYnVmZmVyCi0gKiBjdnQtPmJ1ZiBzaG91bGQgYmUgYWxsb2NhdGVkIGFmdGVyIHRoZSBjdnQgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIGJ5Ci0gKiBTRExfQnVpbGRBdWRpb0NWVCgpLCBhbmQgc2hvdWxkIGJlIGN2dC0+bGVuKmN2dC0+bGVuX211bHQgYnl0ZXMgbG9uZy4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Db252ZXJ0QXVkaW8oU0RMX0F1ZGlvQ1ZUICpjdnQpOwotCi0vKgotICogVGhpcyB0YWtlcyB0d28gYXVkaW8gYnVmZmVycyBvZiB0aGUgcGxheWluZyBhdWRpbyBmb3JtYXQgYW5kIG1peGVzCi0gKiB0aGVtLCBwZXJmb3JtaW5nIGFkZGl0aW9uLCB2b2x1bWUgYWRqdXN0bWVudCwgYW5kIG92ZXJmbG93IGNsaXBwaW5nLgotICogVGhlIHZvbHVtZSByYW5nZXMgZnJvbSAwIC0gMTI4LCBhbmQgc2hvdWxkIGJlIHNldCB0byBTRExfTUlYX01BWFZPTFVNRQotICogZm9yIGZ1bGwgYXVkaW8gdm9sdW1lLiAgTm90ZSB0aGlzIGRvZXMgbm90IGNoYW5nZSBoYXJkd2FyZSB2b2x1bWUuCi0gKiBUaGlzIGlzIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZSAtLSB5b3UgY2FuIG1peCB5b3VyIG93biBhdWRpbyBkYXRhLgotICovCi0jZGVmaW5lIFNETF9NSVhfTUFYVk9MVU1FIDEyOAotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfTWl4QXVkaW8oVWludDggKmRzdCwgY29uc3QgVWludDggKnNyYywgVWludDMyIGxlbiwgaW50IHZvbHVtZSk7Ci0KLS8qCi0gKiBUaGUgbG9jayBtYW5pcHVsYXRlZCBieSB0aGVzZSBmdW5jdGlvbnMgcHJvdGVjdHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgotICogRHVyaW5nIGEgTG9ja0F1ZGlvL1VubG9ja0F1ZGlvIHBhaXIsIHlvdSBjYW4gYmUgZ3VhcmFudGVlZCB0aGF0IHRoZQotICogY2FsbGJhY2sgZnVuY3Rpb24gaXMgbm90IHJ1bm5pbmcuICBEbyBub3QgY2FsbCB0aGVzZSBmcm9tIHRoZSBjYWxsYmFjawotICogZnVuY3Rpb24gb3IgeW91IHdpbGwgY2F1c2UgZGVhZGxvY2suCi0gKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0xvY2tBdWRpbyh2b2lkKTsKLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1VubG9ja0F1ZGlvKHZvaWQpOwotCi0vKgotICogVGhpcyBmdW5jdGlvbiBzaHV0cyBkb3duIGF1ZGlvIHByb2Nlc3NpbmcgYW5kIGNsb3NlcyB0aGUgYXVkaW8gZGV2aWNlLgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9DbG9zZUF1ZGlvKHZvaWQpOwotCi0KLS8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCi0KLSNlbmRpZiAvKiBfU0RMX2F1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9ieXRlb3JkZXIuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9ieXRlb3JkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3MWNmZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfYnl0ZW9yZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBERVBSRUNBVEVEICovCi0jaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2Nkcm9tLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY2Ryb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZjBjNi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY2Ryb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBUaGlzIGlzIHRoZSBDRC1hdWRpbyBjb250cm9sIEFQSSBmb3IgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyICovCi0KLSNpZm5kZWYgX1NETF9jZHJvbV9oCi0jZGVmaW5lIF9TRExfY2Ryb21faAotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEluIG9yZGVyIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMsIFNETF9Jbml0KCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkCi0gICB3aXRoIHRoZSBTRExfSU5JVF9DRFJPTSBmbGFnLiAgVGhpcyBjYXVzZXMgU0RMIHRvIHNjYW4gdGhlIHN5c3RlbQotICAgZm9yIENELVJPTSBkcml2ZXMsIGFuZCBsb2FkIGFwcHJvcHJpYXRlIGRyaXZlcnMuCi0qLwotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQ0QtUk9NIHRyYWNrcyBvbiBhIGRpc2sgKi8KLSNkZWZpbmUgU0RMX01BWF9UUkFDS1MJOTkKLQotLyogVGhlIHR5cGVzIG9mIENELVJPTSB0cmFjayBwb3NzaWJsZSAqLwotI2RlZmluZSBTRExfQVVESU9fVFJBQ0sJMHgwMAotI2RlZmluZSBTRExfREFUQV9UUkFDSwkweDA0Ci0KLS8qIFRoZSBwb3NzaWJsZSBzdGF0ZXMgd2hpY2ggYSBDRC1ST00gZHJpdmUgY2FuIGJlIGluLiAqLwotdHlwZWRlZiBlbnVtIHsKLQlDRF9UUkFZRU1QVFksCi0JQ0RfU1RPUFBFRCwKLQlDRF9QTEFZSU5HLAotCUNEX1BBVVNFRCwKLQlDRF9FUlJPUiA9IC0xCi19IENEc3RhdHVzOwotCi0vKiBHaXZlbiBhIHN0YXR1cywgcmV0dXJucyB0cnVlIGlmIHRoZXJlJ3MgYSBkaXNrIGluIHRoZSBkcml2ZSAqLwotI2RlZmluZSBDRF9JTkRSSVZFKHN0YXR1cykJKChpbnQpKHN0YXR1cykgPiAwKQotCi10eXBlZGVmIHN0cnVjdCBTRExfQ0R0cmFjayB7Ci0JVWludDggaWQ7CQkvKiBUcmFjayBudW1iZXIgKi8KLQlVaW50OCB0eXBlOwkJLyogRGF0YSBvciBhdWRpbyB0cmFjayAqLwotCVVpbnQxNiB1bnVzZWQ7Ci0JVWludDMyIGxlbmd0aDsJCS8qIExlbmd0aCwgaW4gZnJhbWVzLCBvZiB0aGlzIHRyYWNrICovCi0JVWludDMyIG9mZnNldDsJCS8qIE9mZnNldCwgaW4gZnJhbWVzLCBmcm9tIHN0YXJ0IG9mIGRpc2sgKi8KLX0gU0RMX0NEdHJhY2s7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIG9ubHkgY3VycmVudCBhcyBvZiB0aGUgbGFzdCBjYWxsIHRvIFNETF9DRFN0YXR1cygpICovCi10eXBlZGVmIHN0cnVjdCBTRExfQ0QgewotCWludCBpZDsJCQkvKiBQcml2YXRlIGRyaXZlIGlkZW50aWZpZXIgKi8KLQlDRHN0YXR1cyBzdGF0dXM7CS8qIEN1cnJlbnQgZHJpdmUgc3RhdHVzICovCi0KLQkvKiBUaGUgcmVzdCBvZiB0aGlzIHN0cnVjdHVyZSBpcyBvbmx5IHZhbGlkIGlmIHRoZXJlJ3MgYSBDRCBpbiBkcml2ZSAqLwotCWludCBudW10cmFja3M7CQkvKiBOdW1iZXIgb2YgdHJhY2tzIG9uIGRpc2sgKi8KLQlpbnQgY3VyX3RyYWNrOwkJLyogQ3VycmVudCB0cmFjayBwb3NpdGlvbiAqLwotCWludCBjdXJfZnJhbWU7CQkvKiBDdXJyZW50IGZyYW1lIG9mZnNldCB3aXRoaW4gY3VycmVudCB0cmFjayAqLwotCVNETF9DRHRyYWNrIHRyYWNrW1NETF9NQVhfVFJBQ0tTKzFdOwotfSBTRExfQ0Q7Ci0KLS8qIENvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20gZnJhbWVzIHRvIE1pbnV0ZS9TZWNvbmQvRnJhbWVzIGFuZCB2aWNlIHZlcnNhICovCi0jZGVmaW5lIENEX0ZQUwk3NQotI2RlZmluZSBGUkFNRVNfVE9fTVNGKGYsIE0sUyxGKQl7CQkJCQlcCi0JaW50IHZhbHVlID0gZjsJCQkJCQkJXAotCSooRikgPSB2YWx1ZSVDRF9GUFM7CQkJCQkJXAotCXZhbHVlIC89IENEX0ZQUzsJCQkJCQlcCi0JKihTKSA9IHZhbHVlJTYwOwkJCQkJCVwKLQl2YWx1ZSAvPSA2MDsJCQkJCQkJXAotCSooTSkgPSB2YWx1ZTsJCQkJCQkJXAotfQotI2RlZmluZSBNU0ZfVE9fRlJBTUVTKE0sIFMsIEYpCSgoTSkqNjAqQ0RfRlBTKyhTKSpDRF9GUFMrKEYpKQotCi0vKiBDRC1hdWRpbyBBUEkgZnVuY3Rpb25zOiAqLwotCi0vKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgQ0QtUk9NIGRyaXZlcyBvbiB0aGUgc3lzdGVtLCBvciAtMSBpZgotICAgU0RMX0luaXQoKSBoYXMgbm90IGJlZW4gY2FsbGVkIHdpdGggdGhlIFNETF9JTklUX0NEUk9NIGZsYWcuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfQ0ROdW1Ecml2ZXModm9pZCk7Ci0KLS8qIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSwgc3lzdGVtLWRlcGVuZGVudCBpZGVudGlmaWVyIGZvciB0aGUgQ0QtUk9NLgotICAgRXhhbXBsZToKLQkiL2Rldi9jZHJvbSIKLQkiRToiCi0JIi9kZXYvZGlzay9pZGUvMS9tYXN0ZXIiCi0qLwotZXh0ZXJuIERFQ0xTUEVDIGNvbnN0IGNoYXIgKiBTRExDQUxMIFNETF9DRE5hbWUoaW50IGRyaXZlKTsKLQotLyogT3BlbnMgYSBDRC1ST00gZHJpdmUgZm9yIGFjY2Vzcy4gIEl0IHJldHVybnMgYSBkcml2ZSBoYW5kbGUgb24gc3VjY2VzcywKLSAgIG9yIE5VTEwgaWYgdGhlIGRyaXZlIHdhcyBpbnZhbGlkIG9yIGJ1c3kuICBUaGlzIG5ld2x5IG9wZW5lZCBDRC1ST00KLSAgIGJlY29tZXMgdGhlIGRlZmF1bHQgQ0QgdXNlZCB3aGVuIG90aGVyIENEIGZ1bmN0aW9ucyBhcmUgcGFzc2VkIGEgTlVMTAotICAgQ0QtUk9NIGhhbmRsZS4KLSAgIERyaXZlcyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgd2l0aCAwLiAgRHJpdmUgMCBpcyB0aGUgc3lzdGVtIGRlZmF1bHQgQ0QtUk9NLgotKi8KLWV4dGVybiBERUNMU1BFQyBTRExfQ0QgKiBTRExDQUxMIFNETF9DRE9wZW4oaW50IGRyaXZlKTsKLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZ2l2ZW4gZHJpdmUuCi0gICBJZiB0aGUgZHJpdmUgaGFzIGEgQ0QgaW4gaXQsIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgQ0QgYW5kIGN1cnJlbnQKLSAgIHBsYXkgcG9zaXRpb24gb2YgdGhlIENEIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBTRExfQ0Qgc3RydWN0dXJlLgotKi8KLWV4dGVybiBERUNMU1BFQyBDRHN0YXR1cyBTRExDQUxMIFNETF9DRFN0YXR1cyhTRExfQ0QgKmNkcm9tKTsKLQotLyogUGxheSB0aGUgZ2l2ZW4gQ0Qgc3RhcnRpbmcgYXQgJ3N0YXJ0X3RyYWNrJyBhbmQgJ3N0YXJ0X2ZyYW1lJyBmb3IgJ250cmFja3MnCi0gICB0cmFja3MgYW5kICduZnJhbWVzJyBmcmFtZXMuICBJZiBib3RoICdudHJhY2snIGFuZCAnbmZyYW1lJyBhcmUgMCwgcGxheSAKLSAgIHVudGlsIHRoZSBlbmQgb2YgdGhlIENELiAgVGhpcyBmdW5jdGlvbiB3aWxsIHNraXAgZGF0YSB0cmFja3MuCi0gICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIFNETF9DRFN0YXR1cygpIHRvIAotICAgZ2V0IHRyYWNrIGluZm9ybWF0aW9uIGFib3V0IHRoZSBDRC4KLSAgIEZvciBleGFtcGxlOgotCS8vIFBsYXkgZW50aXJlIENEOgotCWlmICggQ0RfSU5EUklWRShTRExfQ0RTdGF0dXMoY2Ryb20pKSApCi0JCVNETF9DRFBsYXlUcmFja3MoY2Ryb20sIDAsIDAsIDAsIDApOwotCS8vIFBsYXkgbGFzdCB0cmFjazoKLQlpZiAoIENEX0lORFJJVkUoU0RMX0NEU3RhdHVzKGNkcm9tKSkgKSB7Ci0JCVNETF9DRFBsYXlUcmFja3MoY2Ryb20sIGNkcm9tLT5udW10cmFja3MtMSwgMCwgMCwgMCk7Ci0JfQotCS8vIFBsYXkgZmlyc3QgYW5kIHNlY29uZCB0cmFjayBhbmQgMTAgc2Vjb25kcyBvZiB0aGlyZCB0cmFjazoKLQlpZiAoIENEX0lORFJJVkUoU0RMX0NEU3RhdHVzKGNkcm9tKSkgKQotCQlTRExfQ0RQbGF5VHJhY2tzKGNkcm9tLCAwLCAwLCAyLCAxMCk7Ci0KLSAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLCBvciAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCi0qLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9DRFBsYXlUcmFja3MoU0RMX0NEICpjZHJvbSwKLQkJaW50IHN0YXJ0X3RyYWNrLCBpbnQgc3RhcnRfZnJhbWUsIGludCBudHJhY2tzLCBpbnQgbmZyYW1lcyk7Ci0KLS8qIFBsYXkgdGhlIGdpdmVuIENEIHN0YXJ0aW5nIGF0ICdzdGFydCcgZnJhbWUgZm9yICdsZW5ndGgnIGZyYW1lcy4KLSAgIEl0IHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgotKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci0KLS8qIFBhdXNlIHBsYXkgLS0gcmV0dXJucyAwLCBvciAtMSBvbiBlcnJvciAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9DRFBhdXNlKFNETF9DRCAqY2Ryb20pOwotCi0vKiBSZXN1bWUgcGxheSAtLSByZXR1cm5zIDAsIG9yIC0xIG9uIGVycm9yICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pOwotCi0vKiBTdG9wIHBsYXkgLS0gcmV0dXJucyAwLCBvciAtMSBvbiBlcnJvciAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9DRFN0b3AoU0RMX0NEICpjZHJvbSk7Ci0KLS8qIEVqZWN0IENELVJPTSAtLSByZXR1cm5zIDAsIG9yIC0xIG9uIGVycm9yICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NERWplY3QoU0RMX0NEICpjZHJvbSk7Ci0KLS8qIENsb3NlcyB0aGUgaGFuZGxlIGZvciB0aGUgQ0QtUk9NIGRyaXZlICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9DRENsb3NlKFNETF9DRCAqY2Ryb20pOwotCi0KLS8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCi0KLSNlbmRpZiAvKiBfU0RMX3ZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWcuaC5kZWZhdWx0IGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZy5oLmRlZmF1bHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MmY0MmEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZy5oLmRlZmF1bHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0jaWZuZGVmIF9TRExfY29uZmlnX2gKLSNkZWZpbmUgX1NETF9jb25maWdfaAotCi0jaW5jbHVkZSAiU0RMX3BsYXRmb3JtLmgiCi0KLS8qIEFkZCBhbnkgcGxhdGZvcm0gdGhhdCBkb2Vzbid0IGJ1aWxkIHVzaW5nIHRoZSBjb25maWd1cmUgc3lzdGVtICovCi0jaWYgZGVmaW5lZChfX0RSRUFNQ0FTVF9fKQotI2luY2x1ZGUgIlNETF9jb25maWdfZHJlYW1jYXN0LmgiCi0jZWxpZiBkZWZpbmVkKF9fTUFDT1NfXykKLSNpbmNsdWRlICJTRExfY29uZmlnX21hY29zLmgiCi0jZWxpZiBkZWZpbmVkKF9fTUFDT1NYX18pCi0jaW5jbHVkZSAiU0RMX2NvbmZpZ19tYWNvc3guaCIKLSNlbGlmIGRlZmluZWQoX19TWU1CSUFOMzJfXykKLSNpbmNsdWRlICJTRExfY29uZmlnX3N5bWJpYW4uaCIgIC8qIG11c3QgYmUgYmVmb3JlIHdpbjMyISAqLwotI2VsaWYgZGVmaW5lZChfX1dJTjMyX18pCi0jaW5jbHVkZSAiU0RMX2NvbmZpZ193aW4zMi5oIgotI2VsaWYgZGVmaW5lZChfX09TMl9fKQotI2luY2x1ZGUgIlNETF9jb25maWdfb3MyLmgiCi0jZWxzZQotI2luY2x1ZGUgIlNETF9jb25maWdfbWluaW1hbC5oIgotI2VuZGlmIC8qIHBsYXRmb3JtIGNvbmZpZyAqLwotCi0jZW5kaWYgLyogX1NETF9jb25maWdfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZy5oLmluIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZy5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2EzZjlhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWcuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0jaWZuZGVmIF9TRExfY29uZmlnX2gKLSNkZWZpbmUgX1NETF9jb25maWdfaAotCi0vKiBUaGlzIGlzIGEgc2V0IG9mIGRlZmluZXMgdG8gY29uZmlndXJlIHRoZSBTREwgZmVhdHVyZXMgKi8KLQotLyogR2VuZXJhbCBwbGF0Zm9ybSBzcGVjaWZpYyBpZGVudGlmaWVycyAqLwotI2luY2x1ZGUgIlNETF9wbGF0Zm9ybS5oIgotCi0vKiBNYWtlIHN1cmUgdGhhdCB0aGlzIGlzbid0IGluY2x1ZGVkIGJ5IFZpc3VhbCBDKysgKi8KLSNpZmRlZiBfTVNDX1ZFUgotI2Vycm9yIFlvdSBzaG91bGQgY29weSBpbmNsdWRlL1NETF9jb25maWcuaC5kZWZhdWx0IHRvIGluY2x1ZGUvU0RMX2NvbmZpZy5oCi0jZW5kaWYKLQotLyogQyBsYW5ndWFnZSBmZWF0dXJlcyAqLwotI3VuZGVmIGNvbnN0Ci0jdW5kZWYgaW5saW5lCi0jdW5kZWYgdm9sYXRpbGUKLQotLyogQyBkYXRhdHlwZXMgKi8KLSN1bmRlZiBzaXplX3QKLSN1bmRlZiBpbnQ4X3QKLSN1bmRlZiB1aW50OF90Ci0jdW5kZWYgaW50MTZfdAotI3VuZGVmIHVpbnQxNl90Ci0jdW5kZWYgaW50MzJfdAotI3VuZGVmIHVpbnQzMl90Ci0jdW5kZWYgaW50NjRfdAotI3VuZGVmIHVpbnQ2NF90Ci0jdW5kZWYgdWludHB0cl90Ci0jdW5kZWYgU0RMX0hBU182NEJJVF9UWVBFCi0KLS8qIEVuZGlhbm5lc3MgKi8KLSN1bmRlZiBTRExfQllURU9SREVSCi0KLS8qIENvbW1lbnQgdGhpcyBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRob3V0IGFueSBDIGxpYnJhcnkgcmVxdWlyZW1lbnRzICovCi0jdW5kZWYgSEFWRV9MSUJDCi0jaWYgSEFWRV9MSUJDCi0KLS8qIFVzZWZ1bCBoZWFkZXJzICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSN1bmRlZiBIQVZFX1NURElPX0gKLSN1bmRlZiBTVERDX0hFQURFUlMKLSN1bmRlZiBIQVZFX1NURExJQl9ICi0jdW5kZWYgSEFWRV9TVERBUkdfSAotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0jdW5kZWYgSEFWRV9JTlRUWVBFU19ICi0jdW5kZWYgSEFWRV9TVERJTlRfSAotI3VuZGVmIEhBVkVfQ1RZUEVfSAotI3VuZGVmIEhBVkVfTUFUSF9ICi0jdW5kZWYgSEFWRV9JQ09OVl9ICi0jdW5kZWYgSEFWRV9TSUdOQUxfSAotI3VuZGVmIEhBVkVfQUxUSVZFQ19ICi0KLS8qIEMgbGlicmFyeSBmdW5jdGlvbnMgKi8KLSN1bmRlZiBIQVZFX01BTExPQwotI3VuZGVmIEhBVkVfQ0FMTE9DCi0jdW5kZWYgSEFWRV9SRUFMTE9DCi0jdW5kZWYgSEFWRV9GUkVFCi0jdW5kZWYgSEFWRV9BTExPQ0EKLSNpZm5kZWYgX1dJTjMyIC8qIERvbid0IHVzZSBDIHJ1bnRpbWUgdmVyc2lvbnMgb2YgdGhlc2Ugb24gV2luZG93cyAqLwotI3VuZGVmIEhBVkVfR0VURU5WCi0jdW5kZWYgSEFWRV9QVVRFTlYKLSN1bmRlZiBIQVZFX1VOU0VURU5WCi0jZW5kaWYKLSN1bmRlZiBIQVZFX1FTT1JUCi0jdW5kZWYgSEFWRV9BQlMKLSN1bmRlZiBIQVZFX0JDT1BZCi0jdW5kZWYgSEFWRV9NRU1TRVQKLSN1bmRlZiBIQVZFX01FTUNQWQotI3VuZGVmIEhBVkVfTUVNTU9WRQotI3VuZGVmIEhBVkVfTUVNQ01QCi0jdW5kZWYgSEFWRV9TVFJMRU4KLSN1bmRlZiBIQVZFX1NUUkxDUFkKLSN1bmRlZiBIQVZFX1NUUkxDQVQKLSN1bmRlZiBIQVZFX1NUUkRVUAotI3VuZGVmIEhBVkVfX1NUUlJFVgotI3VuZGVmIEhBVkVfX1NUUlVQUgotI3VuZGVmIEhBVkVfX1NUUkxXUgotI3VuZGVmIEhBVkVfSU5ERVgKLSN1bmRlZiBIQVZFX1JJTkRFWAotI3VuZGVmIEhBVkVfU1RSQ0hSCi0jdW5kZWYgSEFWRV9TVFJSQ0hSCi0jdW5kZWYgSEFWRV9TVFJTVFIKLSN1bmRlZiBIQVZFX0lUT0EKLSN1bmRlZiBIQVZFX19MVE9BCi0jdW5kZWYgSEFWRV9fVUlUT0EKLSN1bmRlZiBIQVZFX19VTFRPQQotI3VuZGVmIEhBVkVfU1RSVE9MCi0jdW5kZWYgSEFWRV9TVFJUT1VMCi0jdW5kZWYgSEFWRV9fSTY0VE9BCi0jdW5kZWYgSEFWRV9fVUk2NFRPQQotI3VuZGVmIEhBVkVfU1RSVE9MTAotI3VuZGVmIEhBVkVfU1RSVE9VTEwKLSN1bmRlZiBIQVZFX1NUUlRPRAotI3VuZGVmIEhBVkVfQVRPSQotI3VuZGVmIEhBVkVfQVRPRgotI3VuZGVmIEhBVkVfU1RSQ01QCi0jdW5kZWYgSEFWRV9TVFJOQ01QCi0jdW5kZWYgSEFWRV9fU1RSSUNNUAotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotI3VuZGVmIEhBVkVfX1NUUk5JQ01QCi0jdW5kZWYgSEFWRV9TVFJOQ0FTRUNNUAotI3VuZGVmIEhBVkVfU1NDQU5GCi0jdW5kZWYgSEFWRV9TTlBSSU5URgotI3VuZGVmIEhBVkVfVlNOUFJJTlRGCi0jdW5kZWYgSEFWRV9JQ09OVgotI3VuZGVmIEhBVkVfU0lHQUNUSU9OCi0jdW5kZWYgSEFWRV9TRVRKTVAKLSN1bmRlZiBIQVZFX05BTk9TTEVFUAotI3VuZGVmIEhBVkVfQ0xPQ0tfR0VUVElNRQotI3VuZGVmIEhBVkVfRExWU1lNCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0jZWxzZQotLyogV2UgbWF5IG5lZWQgc29tZSByZXBsYWNlbWVudCBmb3Igc3RkYXJnLmggaGVyZSAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2VuZGlmIC8qIEhBVkVfTElCQyAqLwotCi0vKiBBbGxvdyBkaXNhYmxpbmcgb2YgY29yZSBzdWJzeXN0ZW1zICovCi0jdW5kZWYgU0RMX0FVRElPX0RJU0FCTEVECi0jdW5kZWYgU0RMX0NEUk9NX0RJU0FCTEVECi0jdW5kZWYgU0RMX0NQVUlORk9fRElTQUJMRUQKLSN1bmRlZiBTRExfRVZFTlRTX0RJU0FCTEVECi0jdW5kZWYgU0RMX0ZJTEVfRElTQUJMRUQKLSN1bmRlZiBTRExfSk9ZU1RJQ0tfRElTQUJMRUQKLSN1bmRlZiBTRExfTE9BRFNPX0RJU0FCTEVECi0jdW5kZWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLSN1bmRlZiBTRExfVElNRVJTX0RJU0FCTEVECi0jdW5kZWYgU0RMX1ZJREVPX0RJU0FCTEVECi0KLS8qIEVuYWJsZSB2YXJpb3VzIGF1ZGlvIGRyaXZlcnMgKi8KLSN1bmRlZiBTRExfQVVESU9fRFJJVkVSX0FMU0EKLSN1bmRlZiBTRExfQVVESU9fRFJJVkVSX0FMU0FfRFlOQU1JQwotI3VuZGVmIFNETF9BVURJT19EUklWRVJfQVJUUwotI3VuZGVmIFNETF9BVURJT19EUklWRVJfQVJUU19EWU5BTUlDCi0jdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9CQVVESU8KLSN1bmRlZiBTRExfQVVESU9fRFJJVkVSX0JTRAotI3VuZGVmIFNETF9BVURJT19EUklWRVJfQ09SRUFVRElPCi0jdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9EQVJUCi0jdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9EQwotI3VuZGVmIFNETF9BVURJT19EUklWRVJfRElTSwotI3VuZGVmIFNETF9BVURJT19EUklWRVJfRFVNTVkKLSN1bmRlZiBTRExfQVVESU9fRFJJVkVSX0RNRURJQQotI3VuZGVmIFNETF9BVURJT19EUklWRVJfRFNPVU5ECi0jdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9QVUxTRQotI3VuZGVmIFNETF9BVURJT19EUklWRVJfUFVMU0VfRFlOQU1JQwotI3VuZGVmIFNETF9BVURJT19EUklWRVJfRVNECi0jdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9FU0RfRFlOQU1JQwotI3VuZGVmIFNETF9BVURJT19EUklWRVJfTUlOVAotI3VuZGVmIFNETF9BVURJT19EUklWRVJfTU1FQVVESU8KLSN1bmRlZiBTRExfQVVESU9fRFJJVkVSX05BUwotI3VuZGVmIFNETF9BVURJT19EUklWRVJfT1NTCi0jdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9PU1NfU09VTkRDQVJEX0gKLSN1bmRlZiBTRExfQVVESU9fRFJJVkVSX1BBVUQKLSN1bmRlZiBTRExfQVVESU9fRFJJVkVSX1FOWE5UTwotI3VuZGVmIFNETF9BVURJT19EUklWRVJfU05ETUdSCi0jdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9TVU5BVURJTwotI3VuZGVmIFNETF9BVURJT19EUklWRVJfV0FWRU9VVAotCi0vKiBFbmFibGUgdmFyaW91cyBjZHJvbSBkcml2ZXJzICovCi0jdW5kZWYgU0RMX0NEUk9NX0FJWAotI3VuZGVmIFNETF9DRFJPTV9CRU9TCi0jdW5kZWYgU0RMX0NEUk9NX0JTREkKLSN1bmRlZiBTRExfQ0RST01fREMKLSN1bmRlZiBTRExfQ0RST01fRFVNTVkKLSN1bmRlZiBTRExfQ0RST01fRlJFRUJTRAotI3VuZGVmIFNETF9DRFJPTV9MSU5VWAotI3VuZGVmIFNETF9DRFJPTV9NQUNPUwotI3VuZGVmIFNETF9DRFJPTV9NQUNPU1gKLSN1bmRlZiBTRExfQ0RST01fTUlOVAotI3VuZGVmIFNETF9DRFJPTV9PUEVOQlNECi0jdW5kZWYgU0RMX0NEUk9NX09TMgotI3VuZGVmIFNETF9DRFJPTV9PU0YKLSN1bmRlZiBTRExfQ0RST01fUU5YCi0jdW5kZWYgU0RMX0NEUk9NX1dJTjMyCi0KLS8qIEVuYWJsZSB2YXJpb3VzIGlucHV0IGRyaXZlcnMgKi8KLSN1bmRlZiBTRExfSU5QVVRfVFNMSUIKLSN1bmRlZiBTRExfSk9ZU1RJQ0tfQkVPUwotI3VuZGVmIFNETF9KT1lTVElDS19EQwotI3VuZGVmIFNETF9KT1lTVElDS19EVU1NWQotI3VuZGVmIFNETF9KT1lTVElDS19JT0tJVAotI3VuZGVmIFNETF9KT1lTVElDS19MSU5VWAotI3VuZGVmIFNETF9KT1lTVElDS19MSU5VWEVWCi0jdW5kZWYgU0RMX0pPWVNUSUNLX01BQ09TCi0jdW5kZWYgU0RMX0pPWVNUSUNLX01JTlQKLSN1bmRlZiBTRExfSk9ZU1RJQ0tfT1MyCi0jdW5kZWYgU0RMX0pPWVNUSUNLX1JJU0NPUwotI3VuZGVmIFNETF9KT1lTVElDS19XSU5NTQotI3VuZGVmIFNETF9KT1lTVElDS19VU0JISUQKLSN1bmRlZiBTRExfSk9ZU1RJQ0tfVVNCSElEX01BQ0hJTkVfSk9ZU1RJQ0tfSAotCi0vKiBFbmFibGUgdmFyaW91cyBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgc3lzdGVtcyAqLwotI3VuZGVmIFNETF9MT0FEU09fQkVPUwotI3VuZGVmIFNETF9MT0FEU09fRExDT01QQVQKLSN1bmRlZiBTRExfTE9BRFNPX0RMT1BFTgotI3VuZGVmIFNETF9MT0FEU09fRFVNTVkKLSN1bmRlZiBTRExfTE9BRFNPX0xERwotI3VuZGVmIFNETF9MT0FEU09fTUFDT1MKLSN1bmRlZiBTRExfTE9BRFNPX09TMgotI3VuZGVmIFNETF9MT0FEU09fV0lOMzIKLQotLyogRW5hYmxlIHZhcmlvdXMgdGhyZWFkaW5nIHN5c3RlbXMgKi8KLSN1bmRlZiBTRExfVEhSRUFEX0JFT1MKLSN1bmRlZiBTRExfVEhSRUFEX0RDCi0jdW5kZWYgU0RMX1RIUkVBRF9PUzIKLSN1bmRlZiBTRExfVEhSRUFEX1BUSAotI3VuZGVmIFNETF9USFJFQURfUFRIUkVBRAotI3VuZGVmIFNETF9USFJFQURfUFRIUkVBRF9SRUNVUlNJVkVfTVVURVgKLSN1bmRlZiBTRExfVEhSRUFEX1BUSFJFQURfUkVDVVJTSVZFX01VVEVYX05QCi0jdW5kZWYgU0RMX1RIUkVBRF9TUFJPQwotI3VuZGVmIFNETF9USFJFQURfV0lOMzIKLQotLyogRW5hYmxlIHZhcmlvdXMgdGltZXIgc3lzdGVtcyAqLwotI3VuZGVmIFNETF9USU1FUl9CRU9TCi0jdW5kZWYgU0RMX1RJTUVSX0RDCi0jdW5kZWYgU0RMX1RJTUVSX0RVTU1ZCi0jdW5kZWYgU0RMX1RJTUVSX01BQ09TCi0jdW5kZWYgU0RMX1RJTUVSX01JTlQKLSN1bmRlZiBTRExfVElNRVJfT1MyCi0jdW5kZWYgU0RMX1RJTUVSX1JJU0NPUwotI3VuZGVmIFNETF9USU1FUl9VTklYCi0jdW5kZWYgU0RMX1RJTUVSX1dJTjMyCi0jdW5kZWYgU0RMX1RJTUVSX1dJTkNFCi0KLS8qIEVuYWJsZSB2YXJpb3VzIHZpZGVvIGRyaXZlcnMgKi8KLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX0FBTElCCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9CV0lORE9XCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9EQwotI3VuZGVmIFNETF9WSURFT19EUklWRVJfRERSQVcKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX0RHQQotI3VuZGVmIFNETF9WSURFT19EUklWRVJfRElSRUNURkIKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX0RSQVdTUFJPQ0tFVAotI3VuZGVmIFNETF9WSURFT19EUklWRVJfRFVNTVkKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX0ZCQ09OCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9HQVBJCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9HRU0KLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX0dHSQotI3VuZGVmIFNETF9WSURFT19EUklWRVJfSVBPRAotI3VuZGVmIFNETF9WSURFT19EUklWRVJfTkFOT1gKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX09TMkZTCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9QSE9UT04KLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1BJQ09HVUkKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1BTMkdTCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9RVE9QSUEKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1FVQVJUWgotI3VuZGVmIFNETF9WSURFT19EUklWRVJfUklTQ09TCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9TVkdBTElCCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9UT09MQk9YCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9WR0wKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1dJTkRJQgotI3VuZGVmIFNETF9WSURFT19EUklWRVJfV1NDT05TCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTEKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9ER0FNT1VTRQotI3VuZGVmIFNETF9WSURFT19EUklWRVJfWDExX0RQTVMKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YRVhUCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YUkFORFIKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSRU5ERVIKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFCi0jdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKLSN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9YVgotI3VuZGVmIFNETF9WSURFT19EUklWRVJfWEJJT1MKLQotLyogRW5hYmxlIE9wZW5HTCBzdXBwb3J0ICovCi0jdW5kZWYgU0RMX1ZJREVPX09QRU5HTAotI3VuZGVmIFNETF9WSURFT19PUEVOR0xfR0xYCi0jdW5kZWYgU0RMX1ZJREVPX09QRU5HTF9XR0wKLSN1bmRlZiBTRExfVklERU9fT1BFTkdMX09TTUVTQQotI3VuZGVmIFNETF9WSURFT19PUEVOR0xfT1NNRVNBX0RZTkFNSUMKLQotLyogRW5hYmxlIGFzc2VtYmx5IHJvdXRpbmVzICovCi0jdW5kZWYgU0RMX0FTU0VNQkxZX1JPVVRJTkVTCi0jdW5kZWYgU0RMX0hFUk1FU19CTElUVEVSUwotI3VuZGVmIFNETF9BTFRJVkVDX0JMSVRURVJTCi0KLSNlbmRpZiAvKiBfU0RMX2NvbmZpZ19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY29uZmlnX2FtaWdhLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY29uZmlnX2FtaWdhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZTA4NjEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZ19hbWlnYS5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotI2lmbmRlZiBfU0RMX2NvbmZpZ19hbWlnYV9oCi0jZGVmaW5lIF9TRExfY29uZmlnX2FtaWdhX2gKLQotI2luY2x1ZGUgIlNETF9wbGF0Zm9ybS5oIgotCi0vKiBUaGlzIGlzIGEgc2V0IG9mIGRlZmluZXMgdG8gY29uZmlndXJlIHRoZSBTREwgZmVhdHVyZXMgKi8KLQotI2RlZmluZSBTRExfSEFTXzY0QklUX1RZUEUJMQotCi0vKiBVc2VmdWwgaGVhZGVycyAqLwotI2RlZmluZSBIQVZFX1NZU19UWVBFU19ICTEKLSNkZWZpbmUgSEFWRV9TVERJT19ICTEKLSNkZWZpbmUgU1REQ19IRUFERVJTCTEKLSNkZWZpbmUgSEFWRV9TVFJJTkdfSAkxCi0jZGVmaW5lIEhBVkVfSU5UVFlQRVNfSAkxCi0jZGVmaW5lIEhBVkVfU0lHTkFMX0gJMQotCi0vKiBDIGxpYnJhcnkgZnVuY3Rpb25zICovCi0jZGVmaW5lIEhBVkVfTUFMTE9DCTEKLSNkZWZpbmUgSEFWRV9DQUxMT0MJMQotI2RlZmluZSBIQVZFX1JFQUxMT0MJMQotI2RlZmluZSBIQVZFX0ZSRUUJMQotI2RlZmluZSBIQVZFX0FMTE9DQQkxCi0jZGVmaW5lIEhBVkVfR0VURU5WCTEKLSNkZWZpbmUgSEFWRV9QVVRFTlYJMQotI2RlZmluZSBIQVZFX01FTVNFVAkxCi0jZGVmaW5lIEhBVkVfTUVNQ1BZCTEKLSNkZWZpbmUgSEFWRV9NRU1NT1ZFCTEKLSNkZWZpbmUgSEFWRV9NRU1DTVAJMQotCi0vKiBFbmFibGUgdmFyaW91cyBhdWRpbyBkcml2ZXJzICovCi0jZGVmaW5lIFNETF9BVURJT19EUklWRVJfQUhJCTEKLSNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9ESVNLCTEKLSNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9EVU1NWQkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIGNkcm9tIGRyaXZlcnMgKi8KLSNkZWZpbmUgU0RMX0NEUk9NX0RVTU1ZCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgaW5wdXQgZHJpdmVycyAqLwotI2RlZmluZSBTRExfSk9ZU1RJQ0tfQU1JR0EJMQotCi0vKiBFbmFibGUgdmFyaW91cyBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgc3lzdGVtcyAqLwotI2RlZmluZSBTRExfTE9BRFNPX0RVTU1ZCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgdGhyZWFkaW5nIHN5c3RlbXMgKi8KLSNkZWZpbmUgU0RMX1RIUkVBRF9BTUlHQQkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIHRpbWVyIHN5c3RlbXMgKi8KLSNkZWZpbmUgU0RMX1RJTUVSX0FNSUdBCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgdmlkZW8gZHJpdmVycyAqLwotI2RlZmluZSBTRExfVklERU9fRFJJVkVSX0NZQkVSR1JBUEhJQ1MJMQotI2RlZmluZSBTRExfVklERU9fRFJJVkVSX0RVTU1ZCTEKLQotLyogRW5hYmxlIE9wZW5HTCBzdXBwb3J0ICovCi0jZGVmaW5lIFNETF9WSURFT19PUEVOR0wJMQotCi0jZW5kaWYgLyogX1NETF9jb25maWdfYW1pZ2FfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWdfZHJlYW1jYXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYmVlYTMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZ19kcmVhbWNhc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0jaWZuZGVmIF9TRExfY29uZmlnX2RyZWFtY2FzdF9oCi0jZGVmaW5lIF9TRExfY29uZmlnX2RyZWFtY2FzdF9oCi0KLSNpbmNsdWRlICJTRExfcGxhdGZvcm0uaCIKLQotLyogVGhpcyBpcyBhIHNldCBvZiBkZWZpbmVzIHRvIGNvbmZpZ3VyZSB0aGUgU0RMIGZlYXR1cmVzICovCi0KLXR5cGVkZWYgc2lnbmVkIGNoYXIgaW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKLXR5cGVkZWYgc2lnbmVkIGludCBpbnQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Ci10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnRwdHJfdDsKLSNkZWZpbmUgU0RMX0hBU182NEJJVF9UWVBFCTEKLQotLyogVXNlZnVsIGhlYWRlcnMgKi8KLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSAkxCi0jZGVmaW5lIEhBVkVfU1RESU9fSAkxCi0jZGVmaW5lIFNURENfSEVBREVSUwkxCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0gJMQotI2RlZmluZSBIQVZFX0NUWVBFX0gJMQotCi0vKiBDIGxpYnJhcnkgZnVuY3Rpb25zICovCi0jZGVmaW5lIEhBVkVfTUFMTE9DCTEKLSNkZWZpbmUgSEFWRV9DQUxMT0MJMQotI2RlZmluZSBIQVZFX1JFQUxMT0MJMQotI2RlZmluZSBIQVZFX0ZSRUUJMQotI2RlZmluZSBIQVZFX0FMTE9DQQkxCi0jZGVmaW5lIEhBVkVfR0VURU5WCTEKLSNkZWZpbmUgSEFWRV9QVVRFTlYJMQotI2RlZmluZSBIQVZFX1FTT1JUCTEKLSNkZWZpbmUgSEFWRV9BQlMJMQotI2RlZmluZSBIQVZFX0JDT1BZCTEKLSNkZWZpbmUgSEFWRV9NRU1TRVQJMQotI2RlZmluZSBIQVZFX01FTUNQWQkxCi0jZGVmaW5lIEhBVkVfTUVNTU9WRQkxCi0jZGVmaW5lIEhBVkVfTUVNQ01QCTEKLSNkZWZpbmUgSEFWRV9TVFJMRU4JMQotI2RlZmluZSBIQVZFX1NUUkRVUAkxCi0jZGVmaW5lIEhBVkVfSU5ERVgJMQotI2RlZmluZSBIQVZFX1JJTkRFWAkxCi0jZGVmaW5lIEhBVkVfU1RSQ0hSCTEKLSNkZWZpbmUgSEFWRV9TVFJSQ0hSCTEKLSNkZWZpbmUgSEFWRV9TVFJTVFIJMQotI2RlZmluZSBIQVZFX1NUUlRPTAkxCi0jZGVmaW5lIEhBVkVfU1RSVE9ECTEKLSNkZWZpbmUgSEFWRV9BVE9JCTEKLSNkZWZpbmUgSEFWRV9BVE9GCTEKLSNkZWZpbmUgSEFWRV9TVFJDTVAJMQotI2RlZmluZSBIQVZFX1NUUk5DTVAJMQotI2RlZmluZSBIQVZFX1NUUklDTVAJMQotI2RlZmluZSBIQVZFX1NUUkNBU0VDTVAJMQotI2RlZmluZSBIQVZFX1NTQ0FORgkxCi0jZGVmaW5lIEhBVkVfU05QUklOVEYJMQotI2RlZmluZSBIQVZFX1ZTTlBSSU5URgkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIGF1ZGlvIGRyaXZlcnMgKi8KLSNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9EQwkxCi0jZGVmaW5lIFNETF9BVURJT19EUklWRVJfRElTSwkxCi0jZGVmaW5lIFNETF9BVURJT19EUklWRVJfRFVNTVkJMQotCi0vKiBFbmFibGUgdmFyaW91cyBjZHJvbSBkcml2ZXJzICovCi0jZGVmaW5lIFNETF9DRFJPTV9EQwkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIGlucHV0IGRyaXZlcnMgKi8KLSNkZWZpbmUgU0RMX0pPWVNUSUNLX0RDCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgc2hhcmVkIG9iamVjdCBsb2FkaW5nIHN5c3RlbXMgKi8KLSNkZWZpbmUgU0RMX0xPQURTT19EVU1NWQkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIHRocmVhZGluZyBzeXN0ZW1zICovCi0jZGVmaW5lIFNETF9USFJFQURfREMJMQotCi0vKiBFbmFibGUgdmFyaW91cyB0aW1lciBzeXN0ZW1zICovCi0jZGVmaW5lIFNETF9USU1FUl9EQwkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIHZpZGVvIGRyaXZlcnMgKi8KLSNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9EQwkxCi0jZGVmaW5lIFNETF9WSURFT19EUklWRVJfRFVNTVkJMQotCi0jZW5kaWYgLyogX1NETF9jb25maWdfZHJlYW1jYXN0X2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWdfbWFjb3MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWdfbWFjb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhMWM1OS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY29uZmlnX21hY29zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotI2lmbmRlZiBfU0RMX2NvbmZpZ19tYWNvc19oCi0jZGVmaW5lIF9TRExfY29uZmlnX21hY29zX2gKLQotI2luY2x1ZGUgIlNETF9wbGF0Zm9ybS5oIgotCi0vKiBUaGlzIGlzIGEgc2V0IG9mIGRlZmluZXMgdG8gY29uZmlndXJlIHRoZSBTREwgZmVhdHVyZXMgKi8KLQotI2luY2x1ZGUgPE1hY1R5cGVzLmg+Ci0KLXR5cGVkZWYgU0ludDgJaW50OF90OwotdHlwZWRlZiBVSW50OAl1aW50OF90OwotdHlwZWRlZiBTSW50MTYJaW50MTZfdDsKLXR5cGVkZWYgVUludDE2CXVpbnQxNl90OwotdHlwZWRlZiBTSW50MzIJaW50MzJfdDsKLXR5cGVkZWYgVUludDMyCXVpbnQzMl90OwotdHlwZWRlZiBTSW50NjQJaW50NjRfdDsKLXR5cGVkZWYgVUludDY0CXVpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nCXVpbnRwdHJfdDsKLQotI2RlZmluZSBTRExfSEFTXzY0QklUX1RZUEUJMQotCi0vKiBVc2VmdWwgaGVhZGVycyAqLwotI2RlZmluZSBIQVZFX1NURElPX0gJMQotI2RlZmluZSBTVERDX0hFQURFUlMJMQotI2RlZmluZSBIQVZFX1NUUklOR19ICTEKLSNkZWZpbmUgSEFWRV9DVFlQRV9ICTEKLSNkZWZpbmUgSEFWRV9NQVRIX0gJMQotI2RlZmluZSBIQVZFX1NJR05BTF9ICTEKLQotLyogQyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBIQVZFX01BTExPQwkxCi0jZGVmaW5lIEhBVkVfQ0FMTE9DCTEKLSNkZWZpbmUgSEFWRV9SRUFMTE9DCTEKLSNkZWZpbmUgSEFWRV9GUkVFCTEKLSNkZWZpbmUgSEFWRV9BTExPQ0EJMQotI2RlZmluZSBIQVZFX0FCUwkxCi0jZGVmaW5lIEhBVkVfTUVNU0VUCTEKLSNkZWZpbmUgSEFWRV9NRU1DUFkJMQotI2RlZmluZSBIQVZFX01FTU1PVkUJMQotI2RlZmluZSBIQVZFX01FTUNNUAkxCi0jZGVmaW5lIEhBVkVfU1RSTEVOCTEKLSNkZWZpbmUgSEFWRV9TVFJDSFIJMQotI2RlZmluZSBIQVZFX1NUUlJDSFIJMQotI2RlZmluZSBIQVZFX1NUUlNUUgkxCi0jZGVmaW5lIEhBVkVfSVRPQQkxCi0jZGVmaW5lIEhBVkVfU1RSVE9MCTEKLSNkZWZpbmUgSEFWRV9TVFJUT0QJMQotI2RlZmluZSBIQVZFX0FUT0kJMQotI2RlZmluZSBIQVZFX0FUT0YJMQotI2RlZmluZSBIQVZFX1NUUkNNUAkxCi0jZGVmaW5lIEhBVkVfU1RSTkNNUAkxCi0jZGVmaW5lIEhBVkVfU1NDQU5GCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgYXVkaW8gZHJpdmVycyAqLwotI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX1NORE1HUgkxCi0jZGVmaW5lIFNETF9BVURJT19EUklWRVJfRElTSwkxCi0jZGVmaW5lIFNETF9BVURJT19EUklWRVJfRFVNTVkJMQotCi0vKiBFbmFibGUgdmFyaW91cyBjZHJvbSBkcml2ZXJzICovCi0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0jZGVmaW5lIFNETF9DRFJPTV9EVU1NWQkJMQotI2Vsc2UKLSNkZWZpbmUgU0RMX0NEUk9NX01BQ09TCQkxCi0jZW5kaWYKLQotLyogRW5hYmxlIHZhcmlvdXMgaW5wdXQgZHJpdmVycyAqLwotI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgotI2RlZmluZSBTRExfSk9ZU1RJQ0tfRFVNTVkJMQotI2Vsc2UKLSNkZWZpbmUgU0RMX0pPWVNUSUNLX01BQ09TCTEKLSNlbmRpZgotCi0vKiBFbmFibGUgdmFyaW91cyBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgc3lzdGVtcyAqLwotI2RlZmluZSBTRExfTE9BRFNPX01BQ09TCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgdGhyZWFkaW5nIHN5c3RlbXMgKi8KLSNkZWZpbmUgU0RMX1RIUkVBRFNfRElTQUJMRUQJMQotCi0vKiBFbmFibGUgdmFyaW91cyB0aW1lciBzeXN0ZW1zICovCi0jZGVmaW5lIFNETF9USU1FUl9NQUNPUwkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIHZpZGVvIGRyaXZlcnMgKi8KLSNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9EVU1NWQkxCi0jZGVmaW5lIFNETF9WSURFT19EUklWRVJfRFJBV1NQUk9DS0VUCTEKLSNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9UT09MQk9YCTEKLQotLyogRW5hYmxlIE9wZW5HTCBzdXBwb3J0ICovCi0jZGVmaW5lIFNETF9WSURFT19PUEVOR0wJMQotCi0jZW5kaWYgLyogX1NETF9jb25maWdfbWFjb3NfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZ19tYWNvc3guaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWdfbWFjb3N4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWMyMmUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZ19tYWNvc3guaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0jaWZuZGVmIF9TRExfY29uZmlnX21hY29zeF9oCi0jZGVmaW5lIF9TRExfY29uZmlnX21hY29zeF9oCi0KLSNpbmNsdWRlICJTRExfcGxhdGZvcm0uaCIKLQotLyogVGhpcyBnZXRzIHVzIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVELi4uICovCi0jaW5jbHVkZSA8QXZhaWxhYmlsaXR5TWFjcm9zLmg+Ci0KLS8qIFRoaXMgaXMgYSBzZXQgb2YgZGVmaW5lcyB0byBjb25maWd1cmUgdGhlIFNETCBmZWF0dXJlcyAqLwotCi0jZGVmaW5lIFNETF9IQVNfNjRCSVRfVFlQRQkxCi0KLS8qIFVzZWZ1bCBoZWFkZXJzICovCi0vKiBJZiB3ZSBzcGVjaWZpZWQgYW4gU0RLIG9yIGhhdmUgYSBwb3N0LVBvd2VyUEMgY2hpcCwgdGhlbiBhbGxvY2EuaCBleGlzdHMuICovCi0jaWYgKCAoTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTAzMCkgfHwgKCFkZWZpbmVkKF9fUE9XRVJQQ19fKSkgKQotI2RlZmluZSBIQVZFX0FMTE9DQV9ICQkxCi0jZW5kaWYKLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSAkxCi0jZGVmaW5lIEhBVkVfU1RESU9fSAkxCi0jZGVmaW5lIFNURENfSEVBREVSUwkxCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0gJMQotI2RlZmluZSBIQVZFX0lOVFRZUEVTX0gJMQotI2RlZmluZSBIQVZFX1NURElOVF9ICTEKLSNkZWZpbmUgSEFWRV9DVFlQRV9ICTEKLSNkZWZpbmUgSEFWRV9NQVRIX0gJMQotI2RlZmluZSBIQVZFX1NJR05BTF9ICTEKLQotLyogQyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBIQVZFX01BTExPQwkxCi0jZGVmaW5lIEhBVkVfQ0FMTE9DCTEKLSNkZWZpbmUgSEFWRV9SRUFMTE9DCTEKLSNkZWZpbmUgSEFWRV9GUkVFCTEKLSNkZWZpbmUgSEFWRV9BTExPQ0EJMQotI2RlZmluZSBIQVZFX0dFVEVOVgkxCi0jZGVmaW5lIEhBVkVfUFVURU5WCTEKLSNkZWZpbmUgSEFWRV9VTlNFVEVOVgkxCi0jZGVmaW5lIEhBVkVfUVNPUlQJMQotI2RlZmluZSBIQVZFX0FCUwkxCi0jZGVmaW5lIEhBVkVfQkNPUFkJMQotI2RlZmluZSBIQVZFX01FTVNFVAkxCi0jZGVmaW5lIEhBVkVfTUVNQ1BZCTEKLSNkZWZpbmUgSEFWRV9NRU1NT1ZFCTEKLSNkZWZpbmUgSEFWRV9NRU1DTVAJMQotI2RlZmluZSBIQVZFX1NUUkxFTgkxCi0jZGVmaW5lIEhBVkVfU1RSTENQWQkxCi0jZGVmaW5lIEhBVkVfU1RSTENBVAkxCi0jZGVmaW5lIEhBVkVfU1RSRFVQCTEKLSNkZWZpbmUgSEFWRV9TVFJDSFIJMQotI2RlZmluZSBIQVZFX1NUUlJDSFIJMQotI2RlZmluZSBIQVZFX1NUUlNUUgkxCi0jZGVmaW5lIEhBVkVfU1RSVE9MCTEKLSNkZWZpbmUgSEFWRV9TVFJUT1VMCTEKLSNkZWZpbmUgSEFWRV9TVFJUT0xMCTEKLSNkZWZpbmUgSEFWRV9TVFJUT1VMTAkxCi0jZGVmaW5lIEhBVkVfU1RSVE9ECTEKLSNkZWZpbmUgSEFWRV9BVE9JCTEKLSNkZWZpbmUgSEFWRV9BVE9GCTEKLSNkZWZpbmUgSEFWRV9TVFJDTVAJMQotI2RlZmluZSBIQVZFX1NUUk5DTVAJMQotI2RlZmluZSBIQVZFX1NUUkNBU0VDTVAJMQotI2RlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKLSNkZWZpbmUgSEFWRV9TU0NBTkYJMQotI2RlZmluZSBIQVZFX1NOUFJJTlRGCTEKLSNkZWZpbmUgSEFWRV9WU05QUklOVEYJMQotI2RlZmluZSBIQVZFX1NJR0FDVElPTgkxCi0jZGVmaW5lIEhBVkVfU0VUSk1QCTEKLSNkZWZpbmUgSEFWRV9OQU5PU0xFRVAJMQotCi0vKiBFbmFibGUgdmFyaW91cyBhdWRpbyBkcml2ZXJzICovCi0jZGVmaW5lIFNETF9BVURJT19EUklWRVJfQ09SRUFVRElPCTEKLSNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9TTkRNR1IJMQotI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX0RJU0sJMQotI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX0RVTU1ZCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgY2Ryb20gZHJpdmVycyAqLwotI2RlZmluZSBTRExfQ0RST01fTUFDT1NYCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgaW5wdXQgZHJpdmVycyAqLwotI2RlZmluZSBTRExfSk9ZU1RJQ0tfSU9LSVQJMQotCi0vKiBFbmFibGUgdmFyaW91cyBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgc3lzdGVtcyAqLwotI2lmZGVmIF9fcHBjX18KLS8qIEZvciBNYWMgT1MgWCAxMC4yIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgU0RMX0xPQURTT19ETENPTVBBVAkxCi0jZWxzZQotI2RlZmluZSBTRExfTE9BRFNPX0RMT1BFTgkxCi0jZW5kaWYKLQotLyogRW5hYmxlIHZhcmlvdXMgdGhyZWFkaW5nIHN5c3RlbXMgKi8KLSNkZWZpbmUgU0RMX1RIUkVBRF9QVEhSRUFECTEKLSNkZWZpbmUgU0RMX1RIUkVBRF9QVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWAkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIHRpbWVyIHN5c3RlbXMgKi8KLSNkZWZpbmUgU0RMX1RJTUVSX1VOSVgJMQotCi0vKiBFbmFibGUgdmFyaW91cyB2aWRlbyBkcml2ZXJzICovCi0jZGVmaW5lIFNETF9WSURFT19EUklWRVJfRFVNTVkJMQotI2lmICgoZGVmaW5lZCBUQVJHRVRfQVBJX01BQ19DQVJCT04pICYmIChUQVJHRVRfQVBJX01BQ19DQVJCT04pKQotI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1RPT0xCT1gJMQotI2Vsc2UKLSNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9RVUFSVFoJMQotI2VuZGlmCi0KLS8qIEVuYWJsZSBPcGVuR0wgc3VwcG9ydCAqLwotI2RlZmluZSBTRExfVklERU9fT1BFTkdMCTEKLQotLyogRW5hYmxlIGFzc2VtYmx5IHJvdXRpbmVzICovCi0jZGVmaW5lIFNETF9BU1NFTUJMWV9ST1VUSU5FUwkxCi0jaWZkZWYgX19wcGNfXwotI2RlZmluZSBTRExfQUxUSVZFQ19CTElUVEVSUwkxCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TRExfY29uZmlnX21hY29zeF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY29uZmlnX21pbmltYWwuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWdfbWluaW1hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI2MTQ4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWdfbWluaW1hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotI2lmbmRlZiBfU0RMX2NvbmZpZ19taW5pbWFsX2gKLSNkZWZpbmUgX1NETF9jb25maWdfbWluaW1hbF9oCi0KLSNpbmNsdWRlICJTRExfcGxhdGZvcm0uaCIKLQotLyogVGhpcyBpcyB0aGUgbWluaW1hbCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgU0RMICovCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotdHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNl90OwotdHlwZWRlZiBzaWduZWQgaW50IGludDMyX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50cHRyX3Q7Ci0KLS8qIEVuYWJsZSB0aGUgZHVtbXkgYXVkaW8gZHJpdmVyIChzcmMvYXVkaW8vZHVtbXkvXCouYykgKi8KLSNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9EVU1NWQkxCi0KLS8qIEVuYWJsZSB0aGUgc3R1YiBjZHJvbSBkcml2ZXIgKHNyYy9jZHJvbS9kdW1teS9cKi5jKSAqLwotI2RlZmluZSBTRExfQ0RST01fRElTQUJMRUQJMQotCi0vKiBFbmFibGUgdGhlIHN0dWIgam95c3RpY2sgZHJpdmVyIChzcmMvam95c3RpY2svZHVtbXkvXCouYykgKi8KLSNkZWZpbmUgU0RMX0pPWVNUSUNLX0RJU0FCTEVECTEKLQotLyogRW5hYmxlIHRoZSBzdHViIHNoYXJlZCBvYmplY3QgbG9hZGVyIChzcmMvbG9hZHNvL2R1bW15L1wqLmMpICovCi0jZGVmaW5lIFNETF9MT0FEU09fRElTQUJMRUQJMQotCi0vKiBFbmFibGUgdGhlIHN0dWIgdGhyZWFkIHN1cHBvcnQgKHNyYy90aHJlYWQvZ2VuZXJpYy9cKi5jKSAqLwotI2RlZmluZSBTRExfVEhSRUFEU19ESVNBQkxFRAkxCi0KLS8qIEVuYWJsZSB0aGUgc3R1YiB0aW1lciBzdXBwb3J0IChzcmMvdGltZXIvZHVtbXkvXCouYykgKi8KLSNkZWZpbmUgU0RMX1RJTUVSU19ESVNBQkxFRAkxCi0KLS8qIEVuYWJsZSB0aGUgZHVtbXkgdmlkZW8gZHJpdmVyIChzcmMvdmlkZW8vZHVtbXkvXCouYykgKi8KLSNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9EVU1NWQkxCi0KLSNlbmRpZiAvKiBfU0RMX2NvbmZpZ19taW5pbWFsX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWdfb3MyLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY29uZmlnX29zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2RlYTlmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jb25maWdfb3MyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotI2lmbmRlZiBfU0RMX2NvbmZpZ19vczJfaAotI2RlZmluZSBfU0RMX2NvbmZpZ19vczJfaAotCi0jaW5jbHVkZSAiU0RMX3BsYXRmb3JtLmgiCi0KLS8qIFRoaXMgaXMgYSBzZXQgb2YgZGVmaW5lcyB0byBjb25maWd1cmUgdGhlIFNETCBmZWF0dXJlcyAqLwotCi10eXBlZGVmIHNpZ25lZCBjaGFyICAgICAgICAgaW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydCAgICAgICAgaW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1aW50MTZfdDsKLXR5cGVkZWYgc2lnbmVkIGludCAgICAgICAgICBpbnQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHNpemVfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICB1aW50cHRyX3Q7Ci10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICAgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1aW50NjRfdDsKLQotI2RlZmluZSBTRExfSEFTXzY0QklUX1RZUEUJMQotCi0vKiBVc2UgV2F0Y29tJ3MgTElCQyAqLwotI2RlZmluZSBIQVZFX0xJQkMgMQotCi0vKiBVc2VmdWwgaGVhZGVycyAqLwotI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKLSNkZWZpbmUgSEFWRV9TVERJT19IIDEKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi0jZGVmaW5lIEhBVkVfU1REQVJHX0ggMQotI2RlZmluZSBIQVZFX01BTExPQ19IIDEKLSNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi0jZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi0jZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotI2RlZmluZSBIQVZFX0NUWVBFX0ggMQotI2RlZmluZSBIQVZFX01BVEhfSCAxCi0jZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQotCi0vKiBDIGxpYnJhcnkgZnVuY3Rpb25zICovCi0jZGVmaW5lIEhBVkVfTUFMTE9DIDEKLSNkZWZpbmUgSEFWRV9DQUxMT0MgMQotI2RlZmluZSBIQVZFX1JFQUxMT0MgMQotI2RlZmluZSBIQVZFX0ZSRUUgMQotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi0jZGVmaW5lIEhBVkVfR0VURU5WIDEKLSNkZWZpbmUgSEFWRV9QVVRFTlYgMQotI2RlZmluZSBIQVZFX1VOU0VURU5WIDEKLSNkZWZpbmUgSEFWRV9RU09SVCAxCi0jZGVmaW5lIEhBVkVfQUJTIDEKLSNkZWZpbmUgSEFWRV9CQ09QWSAxCi0jZGVmaW5lIEhBVkVfTUVNU0VUIDEKLSNkZWZpbmUgSEFWRV9NRU1DUFkgMQotI2RlZmluZSBIQVZFX01FTU1PVkUgMQotI2RlZmluZSBIQVZFX01FTUNNUCAxCi0jZGVmaW5lIEhBVkVfU1RSTEVOIDEKLSNkZWZpbmUgSEFWRV9TVFJMQ1BZIDEKLSNkZWZpbmUgSEFWRV9TVFJMQ0FUIDEKLSNkZWZpbmUgSEFWRV9TVFJEVVAgMQotI2RlZmluZSBIQVZFX19TVFJSRVYgMQotI2RlZmluZSBIQVZFX19TVFJVUFIgMQotI2RlZmluZSBIQVZFX19TVFJMV1IgMQotI2RlZmluZSBIQVZFX0lOREVYIDEKLSNkZWZpbmUgSEFWRV9SSU5ERVggMQotI2RlZmluZSBIQVZFX1NUUkNIUiAxCi0jZGVmaW5lIEhBVkVfU1RSUkNIUiAxCi0jZGVmaW5lIEhBVkVfU1RSU1RSIDEKLSNkZWZpbmUgSEFWRV9JVE9BIDEKLSNkZWZpbmUgSEFWRV9fTFRPQSAxCi0jZGVmaW5lIEhBVkVfX1VJVE9BIDEKLSNkZWZpbmUgSEFWRV9fVUxUT0EgMQotI2RlZmluZSBIQVZFX1NUUlRPTCAxCi0jZGVmaW5lIEhBVkVfX0k2NFRPQSAxCi0jZGVmaW5lIEhBVkVfX1VJNjRUT0EgMQotI2RlZmluZSBIQVZFX1NUUlRPTEwgMQotI2RlZmluZSBIQVZFX1NUUlRPRCAxCi0jZGVmaW5lIEhBVkVfQVRPSSAxCi0jZGVmaW5lIEhBVkVfQVRPRiAxCi0jZGVmaW5lIEhBVkVfU1RSQ01QIDEKLSNkZWZpbmUgSEFWRV9TVFJOQ01QIDEKLSNkZWZpbmUgSEFWRV9TVFJJQ01QIDEKLSNkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKLSNkZWZpbmUgSEFWRV9TU0NBTkYgMQotI2RlZmluZSBIQVZFX1NOUFJJTlRGIDEKLSNkZWZpbmUgSEFWRV9WU05QUklOVEYgMQotI2RlZmluZSBIQVZFX1NFVEpNUCAxCi0jZGVmaW5lIEhBVkVfQ0xPQ0tfR0VUVElNRSAxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIGF1ZGlvIGRyaXZlcnMgKi8KLSNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9EQVJUCTEKLSNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9ESVNLCTEKLSNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9EVU1NWQkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIGNkcm9tIGRyaXZlcnMgKi8KLSNkZWZpbmUgU0RMX0NEUk9NX09TMgkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIGlucHV0IGRyaXZlcnMgKi8KLSNkZWZpbmUgU0RMX0pPWVNUSUNLX09TMgkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIHNoYXJlZCBvYmplY3QgbG9hZGluZyBzeXN0ZW1zICovCi0jZGVmaW5lIFNETF9MT0FEU09fT1MyCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgdGhyZWFkaW5nIHN5c3RlbXMgKi8KLSNkZWZpbmUgU0RMX1RIUkVBRF9PUzIJMQotCi0vKiBFbmFibGUgdmFyaW91cyB0aW1lciBzeXN0ZW1zICovCi0jZGVmaW5lIFNETF9USU1FUl9PUzIJMQotCi0vKiBFbmFibGUgdmFyaW91cyB2aWRlbyBkcml2ZXJzICovCi0jZGVmaW5lIFNETF9WSURFT19EUklWRVJfRFVNTVkJMQotI2RlZmluZSBTRExfVklERU9fRFJJVkVSX09TMkZTCTEKLQotLyogRW5hYmxlIE9wZW5HTCBzdXBwb3J0ICovCi0vKiBOb3RoaW5nIGhlcmUgeWV0IGZvciBPUy8yLi4uIDooICovCi0KLS8qIEVuYWJsZSBhc3NlbWJseSByb3V0aW5lcyB3aGVyZSBhdmFpbGFibGUgKi8KLSNkZWZpbmUgU0RMX0FTU0VNQkxZX1JPVVRJTkVTCTEKLQotI2VuZGlmIC8qIF9TRExfY29uZmlnX29zMl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY29uZmlnX3dpbjMyLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY29uZmlnX3dpbjMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjQ0ZDIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvbmZpZ193aW4zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLSNpZm5kZWYgX1NETF9jb25maWdfd2luMzJfaAotI2RlZmluZSBfU0RMX2NvbmZpZ193aW4zMl9oCi0KLSNpbmNsdWRlICJTRExfcGxhdGZvcm0uaCIKLQotLyogVGhpcyBpcyBhIHNldCBvZiBkZWZpbmVzIHRvIGNvbmZpZ3VyZSB0aGUgU0RMIGZlYXR1cmVzICovCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fRE1DX18pCi0jZGVmaW5lIEhBVkVfU1RESU5UX0gJMQotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLXR5cGVkZWYgc2lnbmVkIF9faW50OAkJaW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDgJCXVpbnQ4X3Q7Ci10eXBlZGVmIHNpZ25lZCBfX2ludDE2CQlpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2CXVpbnQxNl90OwotdHlwZWRlZiBzaWduZWQgX19pbnQzMgkJaW50MzJfdDsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQzMgl1aW50MzJfdDsKLXR5cGVkZWYgc2lnbmVkIF9faW50NjQJCWludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQJdWludDY0X3Q7Ci0jaWZuZGVmIF9VSU5UUFRSX1RfREVGSU5FRAotI2lmZGVmICBfV0lONjQKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICB1aW50cHRyX3Q7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1aW50cHRyX3Q7Ci0jZW5kaWYKLSNkZWZpbmUgX1VJTlRQVFJfVF9ERUZJTkVECi0jZW5kaWYKLS8qIE9sZGVyIFZpc3VhbCBDKysgaGVhZGVycyBkb24ndCBoYXZlIHRoZSBXaW42NC1jb21wYXRpYmxlIHR5cGVkZWZzLi4uICovCi0jaWYgKChfTVNDX1ZFUiA8PSAxMjAwKSAmJiAoIWRlZmluZWQoRFdPUkRfUFRSKSkpCi0jZGVmaW5lIERXT1JEX1BUUiBEV09SRAotI2VuZGlmCi0jaWYgKChfTVNDX1ZFUiA8PSAxMjAwKSAmJiAoIWRlZmluZWQoTE9OR19QVFIpKSkKLSNkZWZpbmUgTE9OR19QVFIgTE9ORwotI2VuZGlmCi0jZWxzZQkvKiAhX19HTlVDX18gJiYgIV9NU0NfVkVSICovCi10eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwotdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7Ci10eXBlZGVmIHNpZ25lZCBpbnQgaW50MzJfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwotdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKLSNpZm5kZWYgX1NJWkVfVF9ERUZJTkVEXwotI2RlZmluZSBfU0laRV9UX0RFRklORURfCi10eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7Ci0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnRwdHJfdDsKLSNlbmRpZiAvKiBfX0dOVUNfXyB8fCBfTVNDX1ZFUiAqLwotI2RlZmluZSBTRExfSEFTXzY0QklUX1RZUEUJMQotCi0vKiBFbmFibGVkIGZvciBTREwgMS4yIChiaW5hcnkgY29tcGF0aWJpbGl0eSkgKi8KLSNkZWZpbmUgSEFWRV9MSUJDCTEKLSNpZmRlZiBIQVZFX0xJQkMKLS8qIFVzZWZ1bCBoZWFkZXJzICovCi0jZGVmaW5lIEhBVkVfU1RESU9fSCAxCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotI2RlZmluZSBIQVZFX0NUWVBFX0ggMQotI2RlZmluZSBIQVZFX01BVEhfSCAxCi0jaWZuZGVmIF9XSU4zMl9XQ0UKLSNkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCi0jZW5kaWYKLQotLyogQyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBIQVZFX01BTExPQyAxCi0jZGVmaW5lIEhBVkVfQ0FMTE9DIDEKLSNkZWZpbmUgSEFWRV9SRUFMTE9DIDEKLSNkZWZpbmUgSEFWRV9GUkVFIDEKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotI2RlZmluZSBIQVZFX1FTT1JUIDEKLSNkZWZpbmUgSEFWRV9BQlMgMQotI2RlZmluZSBIQVZFX01FTVNFVCAxCi0jZGVmaW5lIEhBVkVfTUVNQ1BZIDEKLSNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKLSNkZWZpbmUgSEFWRV9NRU1DTVAgMQotI2RlZmluZSBIQVZFX1NUUkxFTiAxCi0jZGVmaW5lIEhBVkVfX1NUUlJFViAxCi0jZGVmaW5lIEhBVkVfX1NUUlVQUiAxCi0jZGVmaW5lIEhBVkVfX1NUUkxXUiAxCi0jZGVmaW5lIEhBVkVfU1RSQ0hSIDEKLSNkZWZpbmUgSEFWRV9TVFJSQ0hSIDEKLSNkZWZpbmUgSEFWRV9TVFJTVFIgMQotI2RlZmluZSBIQVZFX0lUT0EgMQotI2RlZmluZSBIQVZFX19MVE9BIDEKLSNkZWZpbmUgSEFWRV9fVUxUT0EgMQotI2RlZmluZSBIQVZFX1NUUlRPTCAxCi0jZGVmaW5lIEhBVkVfU1RSVE9VTCAxCi0jZGVmaW5lIEhBVkVfU1RSVE9MTCAxCi0jZGVmaW5lIEhBVkVfU1RSVE9EIDEKLSNkZWZpbmUgSEFWRV9BVE9JIDEKLSNkZWZpbmUgSEFWRV9BVE9GIDEKLSNkZWZpbmUgSEFWRV9TVFJDTVAgMQotI2RlZmluZSBIQVZFX1NUUk5DTVAgMQotI2RlZmluZSBIQVZFX19TVFJJQ01QIDEKLSNkZWZpbmUgSEFWRV9fU1RSTklDTVAgMQotI2RlZmluZSBIQVZFX1NTQ0FORiAxCi0jZWxzZQotI2RlZmluZSBIQVZFX1NUREFSR19ICTEKLSNkZWZpbmUgSEFWRV9TVERERUZfSAkxCi0jZW5kaWYKLQotLyogRW5hYmxlIHZhcmlvdXMgYXVkaW8gZHJpdmVycyAqLwotI2lmbmRlZiBfV0lOMzJfV0NFCi0jZGVmaW5lIFNETF9BVURJT19EUklWRVJfRFNPVU5ECTEKLSNlbmRpZgotI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX1dBVkVPVVQJMQotI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX0RJU0sJMQotI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX0RVTU1ZCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgY2Ryb20gZHJpdmVycyAqLwotI2lmZGVmIF9XSU4zMl9XQ0UKLSNkZWZpbmUgU0RMX0NEUk9NX0RJU0FCTEVEICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgU0RMX0NEUk9NX1dJTjMyCQkxCi0jZW5kaWYKLQotLyogRW5hYmxlIHZhcmlvdXMgaW5wdXQgZHJpdmVycyAqLwotI2lmZGVmIF9XSU4zMl9XQ0UKLSNkZWZpbmUgU0RMX0pPWVNUSUNLX0RJU0FCTEVEICAgMQotI2Vsc2UKLSNkZWZpbmUgU0RMX0pPWVNUSUNLX1dJTk1NCTEKLSNlbmRpZgotCi0vKiBFbmFibGUgdmFyaW91cyBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgc3lzdGVtcyAqLwotI2RlZmluZSBTRExfTE9BRFNPX1dJTjMyCTEKLQotLyogRW5hYmxlIHZhcmlvdXMgdGhyZWFkaW5nIHN5c3RlbXMgKi8KLSNkZWZpbmUgU0RMX1RIUkVBRF9XSU4zMgkxCi0KLS8qIEVuYWJsZSB2YXJpb3VzIHRpbWVyIHN5c3RlbXMgKi8KLSNpZmRlZiBfV0lOMzJfV0NFCi0jZGVmaW5lIFNETF9USU1FUl9XSU5DRQkxCi0jZWxzZQotI2RlZmluZSBTRExfVElNRVJfV0lOMzIJMQotI2VuZGlmCi0KLS8qIEVuYWJsZSB2YXJpb3VzIHZpZGVvIGRyaXZlcnMgKi8KLSNpZmRlZiBfV0lOMzJfV0NFCi0jZGVmaW5lIFNETF9WSURFT19EUklWRVJfR0FQSQkxCi0jZW5kaWYKLSNpZm5kZWYgX1dJTjMyX1dDRQotI2RlZmluZSBTRExfVklERU9fRFJJVkVSX0REUkFXCTEKLSNlbmRpZgotI2RlZmluZSBTRExfVklERU9fRFJJVkVSX0RVTU1ZCTEKLSNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9XSU5ESUIJMQotCi0vKiBFbmFibGUgT3BlbkdMIHN1cHBvcnQgKi8KLSNpZm5kZWYgX1dJTjMyX1dDRQotI2RlZmluZSBTRExfVklERU9fT1BFTkdMCTEKLSNkZWZpbmUgU0RMX1ZJREVPX09QRU5HTF9XR0wJMQotI2VuZGlmCi0KLS8qIEVuYWJsZSBhc3NlbWJseSByb3V0aW5lcyAoV2luNjQgZG9lc24ndCBoYXZlIGlubGluZSBhc20pICovCi0jaWZuZGVmIF9XSU42NAotI2RlZmluZSBTRExfQVNTRU1CTFlfUk9VVElORVMJMQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfU0RMX2NvbmZpZ193aW4zMl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY29weWluZy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NvcHlpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllMTIyZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfY29weWluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NwdWluZm8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9jcHVpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYWNiZGQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2NwdWluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLS8qIENQVSBmZWF0dXJlIGRldGVjdGlvbiBmb3IgU0RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmbmRlZiBfU0RMX2NwdWluZm9faAotI2RlZmluZSBfU0RMX2NwdWluZm9faAotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBDUFUgaGFzIHRoZSBSRFRTQyBpbnN0cnVjdGlvbgotICovCi1leHRlcm4gREVDTFNQRUMgU0RMX2Jvb2wgU0RMQ0FMTCBTRExfSGFzUkRUU0Modm9pZCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBDUFUgaGFzIE1NWCBmZWF0dXJlcwotICovCi1leHRlcm4gREVDTFNQRUMgU0RMX2Jvb2wgU0RMQ0FMTCBTRExfSGFzTU1YKHZvaWQpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgQ1BVIGhhcyBNTVggRXh0LiBmZWF0dXJlcwotICovCi1leHRlcm4gREVDTFNQRUMgU0RMX2Jvb2wgU0RMQ0FMTCBTRExfSGFzTU1YRXh0KHZvaWQpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgQ1BVIGhhcyAzRE5vdyBmZWF0dXJlcwotICovCi1leHRlcm4gREVDTFNQRUMgU0RMX2Jvb2wgU0RMQ0FMTCBTRExfSGFzM0ROb3codm9pZCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBDUFUgaGFzIDNETm93ISBFeHQuIGZlYXR1cmVzCi0gKi8KLWV4dGVybiBERUNMU1BFQyBTRExfYm9vbCBTRExDQUxMIFNETF9IYXMzRE5vd0V4dCh2b2lkKTsKLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIENQVSBoYXMgU1NFIGZlYXR1cmVzCi0gKi8KLWV4dGVybiBERUNMU1BFQyBTRExfYm9vbCBTRExDQUxMIFNETF9IYXNTU0Uodm9pZCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBDUFUgaGFzIFNTRTIgZmVhdHVyZXMKLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFNETF9ib29sIFNETENBTEwgU0RMX0hhc1NTRTIodm9pZCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBDUFUgaGFzIEFsdGlWZWMgZmVhdHVyZXMKLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFNETF9ib29sIFNETENBTEwgU0RMX0hhc0FsdGlWZWModm9pZCk7Ci0KLS8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCi0KLSNlbmRpZiAvKiBfU0RMX2NwdWluZm9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2VuZGlhbi5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2VuZGlhbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjhkYjRjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9lbmRpYW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBGdW5jdGlvbnMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgZW5kaWFuLXNwZWNpZmljIHZhbHVlcyAqLwotCi0jaWZuZGVmIF9TRExfZW5kaWFuX2gKLSNkZWZpbmUgX1NETF9lbmRpYW5faAotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotCi0vKiBUaGUgdHdvIHR5cGVzIG9mIGVuZGlhbm5lc3MgKi8KLSNkZWZpbmUgU0RMX0xJTF9FTkRJQU4JMTIzNAotI2RlZmluZSBTRExfQklHX0VORElBTgk0MzIxCi0KLSNpZm5kZWYgU0RMX0JZVEVPUkRFUgkvKiBOb3QgZGVmaW5lZCBpbiBTRExfY29uZmlnLmg/ICovCi0jaWYgZGVmaW5lZChfX2hwcGFfXykgfHwgXAotICAgIGRlZmluZWQoX19tNjhrX18pIHx8IGRlZmluZWQobWM2ODAwMCkgfHwgZGVmaW5lZChfTV9NNjhLKSB8fCBcCi0gICAgKGRlZmluZWQoX19NSVBTX18pICYmIGRlZmluZWQoX19NSVNQRUJfXykpIHx8IFwKLSAgICBkZWZpbmVkKF9fcHBjX18pIHx8IGRlZmluZWQoX19QT1dFUlBDX18pIHx8IGRlZmluZWQoX01fUFBDKSB8fCBcCi0gICAgZGVmaW5lZChfX3NwYXJjX18pCi0jZGVmaW5lIFNETF9CWVRFT1JERVIJU0RMX0JJR19FTkRJQU4KLSNlbHNlCi0jZGVmaW5lIFNETF9CWVRFT1JERVIJU0RMX0xJTF9FTkRJQU4KLSNlbmRpZgotI2VuZGlmIC8qICFTRExfQllURU9SREVSICovCi0KLQotI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKLS8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBVc2UgaW5saW5lIGZ1bmN0aW9ucyBmb3IgY29tcGlsZXJzIHRoYXQgc3VwcG9ydCB0aGVtLCBhbmQgc3RhdGljCi0gICBmdW5jdGlvbnMgZm9yIHRob3NlIHRoYXQgZG8gbm90LiAgQmVjYXVzZSB0aGVzZSBmdW5jdGlvbnMgYmVjb21lCi0gICBzdGF0aWMgZm9yIGNvbXBpbGVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGlubGluZSBmdW5jdGlvbnMsIHRoaXMKLSAgIGhlYWRlciBzaG91bGQgb25seSBiZSBpbmNsdWRlZCBpbiBmaWxlcyB0aGF0IGFjdHVhbGx5IHVzZSB0aGVtLgotKi8KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBcCi0gICAhKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPD0gOTUgLyogYnJva2VuIGdjYyB2ZXJzaW9uICovKQotc3RhdGljIF9faW5saW5lX18gVWludDE2IFNETF9Td2FwMTYoVWludDE2IHgpCi17Ci0JX19hc21fXygieGNoZ2IgJWIwLCVoMCIgOiAiPXEiICh4KSA6ICAiMCIgKHgpKTsKLQlyZXR1cm4geDsKLX0KLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX194ODZfNjRfXykKLXN0YXRpYyBfX2lubGluZV9fIFVpbnQxNiBTRExfU3dhcDE2KFVpbnQxNiB4KQotewotCV9fYXNtX18oInhjaGdiICViMCwlaDAiIDogIj1RIiAoeCkgOiAgIjAiICh4KSk7Ci0JcmV0dXJuIHg7Ci19Ci0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3BwY19fKSkKLXN0YXRpYyBfX2lubGluZV9fIFVpbnQxNiBTRExfU3dhcDE2KFVpbnQxNiB4KQotewotCVVpbnQxNiByZXN1bHQ7Ci0KLQlfX2FzbV9fKCJybHdpbWkgJTAsJTIsOCwxNiwyMyIgOiAiPSZyIiAocmVzdWx0KSA6ICIwIiAoeCA+PiA4KSwgInIiICh4KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9fTTY4MDAwX18pIHx8IGRlZmluZWQoX19NNjgwMjBfXykpCi1zdGF0aWMgX19pbmxpbmVfXyBVaW50MTYgU0RMX1N3YXAxNihVaW50MTYgeCkKLXsKLQlfX2FzbV9fKCJyb3J3ICM4LCUwIiA6ICI9ZCIgKHgpIDogICIwIiAoeCkgOiAiY2MiKTsKLQlyZXR1cm4geDsKLX0KLSNlbHNlCi1zdGF0aWMgX19pbmxpbmVfXyBVaW50MTYgU0RMX1N3YXAxNihVaW50MTYgeCkgewotCXJldHVybigoeDw8OCl8KHg+PjgpKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgXAotICAgIShfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDw9IDk1IC8qIGJyb2tlbiBnY2MgdmVyc2lvbiAqLykKLXN0YXRpYyBfX2lubGluZV9fIFVpbnQzMiBTRExfU3dhcDMyKFVpbnQzMiB4KQotewotCV9fYXNtX18oImJzd2FwICUwIiA6ICI9ciIgKHgpIDogIjAiICh4KSk7Ci0JcmV0dXJuIHg7Ci19Ci0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9feDg2XzY0X18pCi1zdGF0aWMgX19pbmxpbmVfXyBVaW50MzIgU0RMX1N3YXAzMihVaW50MzIgeCkKLXsKLQlfX2FzbV9fKCJic3dhcGwgJTAiIDogIj1yIiAoeCkgOiAiMCIgKHgpKTsKLQlyZXR1cm4geDsKLX0KLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fcHBjX18pKQotc3RhdGljIF9faW5saW5lX18gVWludDMyIFNETF9Td2FwMzIoVWludDMyIHgpCi17Ci0JVWludDMyIHJlc3VsdDsKLQotCV9fYXNtX18oInJsd2ltaSAlMCwlMiwyNCwxNiwyMyIgOiAiPSZyIiAocmVzdWx0KSA6ICIwIiAoeD4+MjQpLCAiciIgKHgpKTsKLQlfX2FzbV9fKCJybHdpbWkgJTAsJTIsOCw4LDE1IiAgIDogIj0mciIgKHJlc3VsdCkgOiAiMCIgKHJlc3VsdCksICAgICJyIiAoeCkpOwotCV9fYXNtX18oInJsd2ltaSAlMCwlMiwyNCwwLDciICAgOiAiPSZyIiAocmVzdWx0KSA6ICIwIiAocmVzdWx0KSwgICAgInIiICh4KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9fTTY4MDAwX18pIHx8IGRlZmluZWQoX19NNjgwMjBfXykpCi1zdGF0aWMgX19pbmxpbmVfXyBVaW50MzIgU0RMX1N3YXAzMihVaW50MzIgeCkKLXsKLQlfX2FzbV9fKCJyb3J3ICM4LCUwXG5cdHN3YXAgJTBcblx0cm9ydyAjOCwlMCIgOiAiPWQiICh4KSA6ICAiMCIgKHgpIDogImNjIik7Ci0JcmV0dXJuIHg7Ci19Ci0jZWxzZQotc3RhdGljIF9faW5saW5lX18gVWludDMyIFNETF9Td2FwMzIoVWludDMyIHgpIHsKLQlyZXR1cm4oKHg8PDI0KXwoKHg8PDgpJjB4MDBGRjAwMDApfCgoeD4+OCkmMHgwMDAwRkYwMCl8KHg+PjI0KSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFNETF9IQVNfNjRCSVRfVFlQRQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICYmIFwKLSAgICEoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8PSA5NSAvKiBicm9rZW4gZ2NjIHZlcnNpb24gKi8pCi1zdGF0aWMgX19pbmxpbmVfXyBVaW50NjQgU0RMX1N3YXA2NChVaW50NjQgeCkKLXsKLQl1bmlvbiB7IAotCQlzdHJ1Y3QgeyBVaW50MzIgYSxiOyB9IHM7Ci0JCVVpbnQ2NCB1OwotCX0gdjsKLQl2LnUgPSB4OwotCV9fYXNtX18oImJzd2FwbCAlMCA7IGJzd2FwbCAlMSA7IHhjaGdsICUwLCUxIiAKLQkgICAgICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikgCi0JICAgICAgICA6ICIwIiAodi5zLmEpLCAiMSIgKHYucy5iKSk7IAotCXJldHVybiB2LnU7Ci19Ci0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9feDg2XzY0X18pCi1zdGF0aWMgX19pbmxpbmVfXyBVaW50NjQgU0RMX1N3YXA2NChVaW50NjQgeCkKLXsKLQlfX2FzbV9fKCJic3dhcHEgJTAiIDogIj1yIiAoeCkgOiAiMCIgKHgpKTsKLQlyZXR1cm4geDsKLX0KLSNlbHNlCi1zdGF0aWMgX19pbmxpbmVfXyBVaW50NjQgU0RMX1N3YXA2NChVaW50NjQgeCkKLXsKLQlVaW50MzIgaGksIGxvOwotCi0JLyogU2VwYXJhdGUgaW50byBoaWdoIGFuZCBsb3cgMzItYml0IHZhbHVlcyBhbmQgc3dhcCB0aGVtICovCi0JbG8gPSAoVWludDMyKSh4JjB4RkZGRkZGRkYpOwotCXggPj49IDMyOwotCWhpID0gKFVpbnQzMikoeCYweEZGRkZGRkZGKTsKLQl4ID0gU0RMX1N3YXAzMihsbyk7Ci0JeCA8PD0gMzI7Ci0JeCB8PSBTRExfU3dhcDMyKGhpKTsKLQlyZXR1cm4oeCk7Ci19Ci0jZW5kaWYKLSNlbHNlCi0vKiBUaGlzIGlzIG1haW5seSB0byBrZWVwIGNvbXBpbGVycyBmcm9tIGNvbXBsYWluaW5nIGluIFNETCBjb2RlLgotICAgSWYgdGhlcmUgaXMgbm8gcmVhbCA2NC1iaXQgZGF0YXR5cGUsIHRoZW4gY29tcGlsZXJzIHdpbGwgY29tcGxhaW4gYWJvdXQKLSAgIHRoZSBmYWtlIDY0LWJpdCBkYXRhdHlwZSB0aGF0IFNETCBwcm92aWRlcyB3aGVuIGl0IGNvbXBpbGVzIHVzZXIgY29kZS4KLSovCi0jZGVmaW5lIFNETF9Td2FwNjQoWCkJKFgpCi0jZW5kaWYgLyogU0RMX0hBU182NEJJVF9UWVBFICovCi0KLQotLyogQnl0ZXN3YXAgaXRlbSBmcm9tIHRoZSBzcGVjaWZpZWQgZW5kaWFubmVzcyB0byB0aGUgbmF0aXZlIGVuZGlhbm5lc3MgKi8KLSNpZiBTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOCi0jZGVmaW5lIFNETF9Td2FwTEUxNihYKQkoWCkKLSNkZWZpbmUgU0RMX1N3YXBMRTMyKFgpCShYKQotI2RlZmluZSBTRExfU3dhcExFNjQoWCkJKFgpCi0jZGVmaW5lIFNETF9Td2FwQkUxNihYKQlTRExfU3dhcDE2KFgpCi0jZGVmaW5lIFNETF9Td2FwQkUzMihYKQlTRExfU3dhcDMyKFgpCi0jZGVmaW5lIFNETF9Td2FwQkU2NChYKQlTRExfU3dhcDY0KFgpCi0jZWxzZQotI2RlZmluZSBTRExfU3dhcExFMTYoWCkJU0RMX1N3YXAxNihYKQotI2RlZmluZSBTRExfU3dhcExFMzIoWCkJU0RMX1N3YXAzMihYKQotI2RlZmluZSBTRExfU3dhcExFNjQoWCkJU0RMX1N3YXA2NChYKQotI2RlZmluZSBTRExfU3dhcEJFMTYoWCkJKFgpCi0jZGVmaW5lIFNETF9Td2FwQkUzMihYKQkoWCkKLSNkZWZpbmUgU0RMX1N3YXBCRTY0KFgpCShYKQotI2VuZGlmCi0KLS8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCi0KLSNlbmRpZiAvKiBfU0RMX2VuZGlhbl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfZXJyb3IuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9lcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ2YmZhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9lcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyogU2ltcGxlIGVycm9yIG1lc3NhZ2Ugcm91dGluZXMgZm9yIFNETCAqLwotCi0jaWZuZGVmIF9TRExfZXJyb3JfaAotI2RlZmluZSBfU0RMX2Vycm9yX2gKLQotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLQotI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKLS8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBQdWJsaWMgZnVuY3Rpb25zICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9TZXRFcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1leHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX0dldEVycm9yKHZvaWQpOwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfQ2xlYXJFcnJvcih2b2lkKTsKLQotLyogUHJpdmF0ZSBlcnJvciBtZXNzYWdlIGZ1bmN0aW9uIC0gdXNlZCBpbnRlcm5hbGx5ICovCi0jZGVmaW5lIFNETF9PdXRPZk1lbW9yeSgpCVNETF9FcnJvcihTRExfRU5PTUVNKQotI2RlZmluZSBTRExfVW5zdXBwb3J0ZWQoKQlTRExfRXJyb3IoU0RMX1VOU1VQUE9SVEVEKQotdHlwZWRlZiBlbnVtIHsKLQlTRExfRU5PTUVNLAotCVNETF9FRlJFQUQsCi0JU0RMX0VGV1JJVEUsCi0JU0RMX0VGU0VFSywKLQlTRExfVU5TVVBQT1JURUQsCi0JU0RMX0xBU1RFUlJPUgotfSBTRExfZXJyb3Jjb2RlOwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRXJyb3IoU0RMX2Vycm9yY29kZSBjb2RlKTsKLQotCi0vKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaW5jbHVkZSAiY2xvc2VfY29kZS5oIgotCi0jZW5kaWYgLyogX1NETF9lcnJvcl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfZXZlbnRzLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfZXZlbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTkxOGMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2V2ZW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qIEluY2x1ZGUgZmlsZSBmb3IgU0RMIGV2ZW50IGhhbmRsaW5nICovCi0KLSNpZm5kZWYgX1NETF9ldmVudHNfaAotI2RlZmluZSBfU0RMX2V2ZW50c19oCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0jaW5jbHVkZSAiU0RMX2FjdGl2ZS5oIgotI2luY2x1ZGUgIlNETF9rZXlib2FyZC5oIgotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgotI2luY2x1ZGUgIlNETF9xdWl0LmgiCi0KLSNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCi0vKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogR2VuZXJhbCBrZXlib2FyZC9tb3VzZSBzdGF0ZSBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBTRExfUkVMRUFTRUQJMAotI2RlZmluZSBTRExfUFJFU1NFRAkxCi0KLS8qIEV2ZW50IGVudW1lcmF0aW9ucyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICAgICBTRExfTk9FVkVOVCA9IDAsCQkJLyogVW51c2VkIChkbyBub3QgcmVtb3ZlKSAqLwotICAgICAgIFNETF9BQ1RJVkVFVkVOVCwJCQkvKiBBcHBsaWNhdGlvbiBsb3Nlcy9nYWlucyB2aXNpYmlsaXR5ICovCi0gICAgICAgU0RMX0tFWURPV04sCQkJLyogS2V5cyBwcmVzc2VkICovCi0gICAgICAgU0RMX0tFWVVQLAkJCS8qIEtleXMgcmVsZWFzZWQgKi8KLSAgICAgICBTRExfTU9VU0VNT1RJT04sCQkJLyogTW91c2UgbW92ZWQgKi8KLSAgICAgICBTRExfTU9VU0VCVVRUT05ET1dOLAkJLyogTW91c2UgYnV0dG9uIHByZXNzZWQgKi8KLSAgICAgICBTRExfTU9VU0VCVVRUT05VUCwJCS8qIE1vdXNlIGJ1dHRvbiByZWxlYXNlZCAqLwotICAgICAgIFNETF9KT1lBWElTTU9USU9OLAkJLyogSm95c3RpY2sgYXhpcyBtb3Rpb24gKi8KLSAgICAgICBTRExfSk9ZQkFMTE1PVElPTiwJCS8qIEpveXN0aWNrIHRyYWNrYmFsbCBtb3Rpb24gKi8KLSAgICAgICBTRExfSk9ZSEFUTU9USU9OLAkJLyogSm95c3RpY2sgaGF0IHBvc2l0aW9uIGNoYW5nZSAqLwotICAgICAgIFNETF9KT1lCVVRUT05ET1dOLAkJLyogSm95c3RpY2sgYnV0dG9uIHByZXNzZWQgKi8KLSAgICAgICBTRExfSk9ZQlVUVE9OVVAsCQkJLyogSm95c3RpY2sgYnV0dG9uIHJlbGVhc2VkICovCi0gICAgICAgU0RMX1FVSVQsCQkJLyogVXNlci1yZXF1ZXN0ZWQgcXVpdCAqLwotICAgICAgIFNETF9TWVNXTUVWRU5ULAkJCS8qIFN5c3RlbSBzcGVjaWZpYyBldmVudCAqLwotICAgICAgIFNETF9FVkVOVF9SRVNFUlZFREEsCQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4uICovCi0gICAgICAgU0RMX0VWRU5UX1JFU0VSVkVEQiwJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLi4gKi8KLSAgICAgICBTRExfVklERU9SRVNJWkUsCQkJLyogVXNlciByZXNpemVkIHZpZGVvIG1vZGUgKi8KLSAgICAgICBTRExfVklERU9FWFBPU0UsCQkJLyogU2NyZWVuIG5lZWRzIHRvIGJlIHJlZHJhd24gKi8KLSAgICAgICBTRExfRVZFTlRfUkVTRVJWRUQyLAkJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuLiAqLwotICAgICAgIFNETF9FVkVOVF9SRVNFUlZFRDMsCQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4uICovCi0gICAgICAgU0RMX0VWRU5UX1JFU0VSVkVENCwJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLi4gKi8KLSAgICAgICBTRExfRVZFTlRfUkVTRVJWRUQ1LAkJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuLiAqLwotICAgICAgIFNETF9FVkVOVF9SRVNFUlZFRDYsCQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4uICovCi0gICAgICAgU0RMX0VWRU5UX1JFU0VSVkVENywJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLi4gKi8KLSAgICAgICAvKiBFdmVudHMgU0RMX1VTRVJFVkVOVCB0aHJvdWdoIFNETF9NQVhFVkVOVFMtMSBhcmUgZm9yIHlvdXIgdXNlICovCi0gICAgICAgU0RMX1VTRVJFVkVOVCA9IDI0LAotICAgICAgIC8qIFRoaXMgbGFzdCBldmVudCBpcyBvbmx5IGZvciBib3VuZGluZyBpbnRlcm5hbCBhcnJheXMKLQkgIEl0IGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgZXZlbnQgbWFzayBkYXRhdHlwZSAtLSBVaW50MzIKLSAgICAgICAgKi8KLSAgICAgICBTRExfTlVNRVZFTlRTID0gMzIKLX0gU0RMX0V2ZW50VHlwZTsKLQotLyogUHJlZGVmaW5lZCBldmVudCBtYXNrcyAqLwotI2RlZmluZSBTRExfRVZFTlRNQVNLKFgpCSgxPDwoWCkpCi10eXBlZGVmIGVudW0gewotCVNETF9BQ1RJVkVFVkVOVE1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9BQ1RJVkVFVkVOVCksCi0JU0RMX0tFWURPV05NQVNLCQk9IFNETF9FVkVOVE1BU0soU0RMX0tFWURPV04pLAotCVNETF9LRVlVUE1BU0sJCT0gU0RMX0VWRU5UTUFTSyhTRExfS0VZVVApLAotCVNETF9LRVlFVkVOVE1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9LRVlET1dOKXwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9FVkVOVE1BU0soU0RMX0tFWVVQKSwKLQlTRExfTU9VU0VNT1RJT05NQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfTU9VU0VNT1RJT04pLAotCVNETF9NT1VTRUJVVFRPTkRPV05NQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfTU9VU0VCVVRUT05ET1dOKSwKLQlTRExfTU9VU0VCVVRUT05VUE1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9NT1VTRUJVVFRPTlVQKSwKLQlTRExfTU9VU0VFVkVOVE1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9NT1VTRU1PVElPTil8Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfRVZFTlRNQVNLKFNETF9NT1VTRUJVVFRPTkRPV04pfAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0VWRU5UTUFTSyhTRExfTU9VU0VCVVRUT05VUCksCi0JU0RMX0pPWUFYSVNNT1RJT05NQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfSk9ZQVhJU01PVElPTiksCi0JU0RMX0pPWUJBTExNT1RJT05NQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfSk9ZQkFMTE1PVElPTiksCi0JU0RMX0pPWUhBVE1PVElPTk1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9KT1lIQVRNT1RJT04pLAotCVNETF9KT1lCVVRUT05ET1dOTUFTSwk9IFNETF9FVkVOVE1BU0soU0RMX0pPWUJVVFRPTkRPV04pLAotCVNETF9KT1lCVVRUT05VUE1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9KT1lCVVRUT05VUCksCi0JU0RMX0pPWUVWRU5UTUFTSwk9IFNETF9FVkVOVE1BU0soU0RMX0pPWUFYSVNNT1RJT04pfAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0VWRU5UTUFTSyhTRExfSk9ZQkFMTE1PVElPTil8Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfRVZFTlRNQVNLKFNETF9KT1lIQVRNT1RJT04pfAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0VWRU5UTUFTSyhTRExfSk9ZQlVUVE9ORE9XTil8Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfRVZFTlRNQVNLKFNETF9KT1lCVVRUT05VUCksCi0JU0RMX1ZJREVPUkVTSVpFTUFTSwk9IFNETF9FVkVOVE1BU0soU0RMX1ZJREVPUkVTSVpFKSwKLQlTRExfVklERU9FWFBPU0VNQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfVklERU9FWFBPU0UpLAotCVNETF9RVUlUTUFTSwkJPSBTRExfRVZFTlRNQVNLKFNETF9RVUlUKSwKLQlTRExfU1lTV01FVkVOVE1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9TWVNXTUVWRU5UKQotfSBTRExfRXZlbnRNYXNrIDsKLSNkZWZpbmUgU0RMX0FMTEVWRU5UUwkJMHhGRkZGRkZGRgotCi0vKiBBcHBsaWNhdGlvbiB2aXNpYmlsaXR5IGV2ZW50IHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX0FjdGl2ZUV2ZW50IHsKLQlVaW50OCB0eXBlOwkvKiBTRExfQUNUSVZFRVZFTlQgKi8KLQlVaW50OCBnYWluOwkvKiBXaGV0aGVyIGdpdmVuIHN0YXRlcyB3ZXJlIGdhaW5lZCBvciBsb3N0ICgxLzApICovCi0JVWludDggc3RhdGU7CS8qIEEgbWFzayBvZiB0aGUgZm9jdXMgc3RhdGVzICovCi19IFNETF9BY3RpdmVFdmVudDsKLQotLyogS2V5Ym9hcmQgZXZlbnQgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBTRExfS2V5Ym9hcmRFdmVudCB7Ci0JVWludDggdHlwZTsJLyogU0RMX0tFWURPV04gb3IgU0RMX0tFWVVQICovCi0JVWludDggd2hpY2g7CS8qIFRoZSBrZXlib2FyZCBkZXZpY2UgaW5kZXggKi8KLQlVaW50OCBzdGF0ZTsJLyogU0RMX1BSRVNTRUQgb3IgU0RMX1JFTEVBU0VEICovCi0JU0RMX2tleXN5bSBrZXlzeW07Ci19IFNETF9LZXlib2FyZEV2ZW50OwotCi0vKiBNb3VzZSBtb3Rpb24gZXZlbnQgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBTRExfTW91c2VNb3Rpb25FdmVudCB7Ci0JVWludDggdHlwZTsJLyogU0RMX01PVVNFTU9USU9OICovCi0JVWludDggd2hpY2g7CS8qIFRoZSBtb3VzZSBkZXZpY2UgaW5kZXggKi8KLQlVaW50OCBzdGF0ZTsJLyogVGhlIGN1cnJlbnQgYnV0dG9uIHN0YXRlICovCi0JVWludDE2IHgsIHk7CS8qIFRoZSBYL1kgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlICovCi0JU2ludDE2IHhyZWw7CS8qIFRoZSByZWxhdGl2ZSBtb3Rpb24gaW4gdGhlIFggZGlyZWN0aW9uICovCi0JU2ludDE2IHlyZWw7CS8qIFRoZSByZWxhdGl2ZSBtb3Rpb24gaW4gdGhlIFkgZGlyZWN0aW9uICovCi19IFNETF9Nb3VzZU1vdGlvbkV2ZW50OwotCi0vKiBNb3VzZSBidXR0b24gZXZlbnQgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBTRExfTW91c2VCdXR0b25FdmVudCB7Ci0JVWludDggdHlwZTsJLyogU0RMX01PVVNFQlVUVE9ORE9XTiBvciBTRExfTU9VU0VCVVRUT05VUCAqLwotCVVpbnQ4IHdoaWNoOwkvKiBUaGUgbW91c2UgZGV2aWNlIGluZGV4ICovCi0JVWludDggYnV0dG9uOwkvKiBUaGUgbW91c2UgYnV0dG9uIGluZGV4ICovCi0JVWludDggc3RhdGU7CS8qIFNETF9QUkVTU0VEIG9yIFNETF9SRUxFQVNFRCAqLwotCVVpbnQxNiB4LCB5OwkvKiBUaGUgWC9ZIGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBhdCBwcmVzcyB0aW1lICovCi19IFNETF9Nb3VzZUJ1dHRvbkV2ZW50OwotCi0vKiBKb3lzdGljayBheGlzIG1vdGlvbiBldmVudCBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IFNETF9Kb3lBeGlzRXZlbnQgewotCVVpbnQ4IHR5cGU7CS8qIFNETF9KT1lBWElTTU9USU9OICovCi0JVWludDggd2hpY2g7CS8qIFRoZSBqb3lzdGljayBkZXZpY2UgaW5kZXggKi8KLQlVaW50OCBheGlzOwkvKiBUaGUgam95c3RpY2sgYXhpcyBpbmRleCAqLwotCVNpbnQxNiB2YWx1ZTsJLyogVGhlIGF4aXMgdmFsdWUgKHJhbmdlOiAtMzI3NjggdG8gMzI3NjcpICovCi19IFNETF9Kb3lBeGlzRXZlbnQ7Ci0KLS8qIEpveXN0aWNrIHRyYWNrYmFsbCBtb3Rpb24gZXZlbnQgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBTRExfSm95QmFsbEV2ZW50IHsKLQlVaW50OCB0eXBlOwkvKiBTRExfSk9ZQkFMTE1PVElPTiAqLwotCVVpbnQ4IHdoaWNoOwkvKiBUaGUgam95c3RpY2sgZGV2aWNlIGluZGV4ICovCi0JVWludDggYmFsbDsJLyogVGhlIGpveXN0aWNrIHRyYWNrYmFsbCBpbmRleCAqLwotCVNpbnQxNiB4cmVsOwkvKiBUaGUgcmVsYXRpdmUgbW90aW9uIGluIHRoZSBYIGRpcmVjdGlvbiAqLwotCVNpbnQxNiB5cmVsOwkvKiBUaGUgcmVsYXRpdmUgbW90aW9uIGluIHRoZSBZIGRpcmVjdGlvbiAqLwotfSBTRExfSm95QmFsbEV2ZW50OwotCi0vKiBKb3lzdGljayBoYXQgcG9zaXRpb24gY2hhbmdlIGV2ZW50IHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX0pveUhhdEV2ZW50IHsKLQlVaW50OCB0eXBlOwkvKiBTRExfSk9ZSEFUTU9USU9OICovCi0JVWludDggd2hpY2g7CS8qIFRoZSBqb3lzdGljayBkZXZpY2UgaW5kZXggKi8KLQlVaW50OCBoYXQ7CS8qIFRoZSBqb3lzdGljayBoYXQgaW5kZXggKi8KLQlVaW50OCB2YWx1ZTsJLyogVGhlIGhhdCBwb3NpdGlvbiB2YWx1ZToKLQkJCSAgICBTRExfSEFUX0xFRlRVUCAgIFNETF9IQVRfVVAgICAgICAgU0RMX0hBVF9SSUdIVFVQCi0JCQkgICAgU0RMX0hBVF9MRUZUICAgICBTRExfSEFUX0NFTlRFUkVEIFNETF9IQVRfUklHSFQKLQkJCSAgICBTRExfSEFUX0xFRlRET1dOIFNETF9IQVRfRE9XTiAgICAgU0RMX0hBVF9SSUdIVERPV04KLQkJCSAgIE5vdGUgdGhhdCB6ZXJvIG1lYW5zIHRoZSBQT1YgaXMgY2VudGVyZWQuCi0JCQkqLwotfSBTRExfSm95SGF0RXZlbnQ7Ci0KLS8qIEpveXN0aWNrIGJ1dHRvbiBldmVudCBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IFNETF9Kb3lCdXR0b25FdmVudCB7Ci0JVWludDggdHlwZTsJLyogU0RMX0pPWUJVVFRPTkRPV04gb3IgU0RMX0pPWUJVVFRPTlVQICovCi0JVWludDggd2hpY2g7CS8qIFRoZSBqb3lzdGljayBkZXZpY2UgaW5kZXggKi8KLQlVaW50OCBidXR0b247CS8qIFRoZSBqb3lzdGljayBidXR0b24gaW5kZXggKi8KLQlVaW50OCBzdGF0ZTsJLyogU0RMX1BSRVNTRUQgb3IgU0RMX1JFTEVBU0VEICovCi19IFNETF9Kb3lCdXR0b25FdmVudDsKLQotLyogVGhlICJ3aW5kb3cgcmVzaXplZCIgZXZlbnQKLSAgIFdoZW4geW91IGdldCB0aGlzIGV2ZW50LCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIGEgbmV3IHZpZGVvCi0gICBtb2RlIHdpdGggdGhlIG5ldyB3aWR0aCBhbmQgaGVpZ2h0LgotICovCi10eXBlZGVmIHN0cnVjdCBTRExfUmVzaXplRXZlbnQgewotCVVpbnQ4IHR5cGU7CS8qIFNETF9WSURFT1JFU0laRSAqLwotCWludCB3OwkJLyogTmV3IHdpZHRoICovCi0JaW50IGg7CQkvKiBOZXcgaGVpZ2h0ICovCi19IFNETF9SZXNpemVFdmVudDsKLQotLyogVGhlICJzY3JlZW4gcmVkcmF3IiBldmVudCAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX0V4cG9zZUV2ZW50IHsKLQlVaW50OCB0eXBlOwkvKiBTRExfVklERU9FWFBPU0UgKi8KLX0gU0RMX0V4cG9zZUV2ZW50OwotCi0vKiBUaGUgInF1aXQgcmVxdWVzdGVkIiBldmVudCAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX1F1aXRFdmVudCB7Ci0JVWludDggdHlwZTsJLyogU0RMX1FVSVQgKi8KLX0gU0RMX1F1aXRFdmVudDsKLQotLyogQSB1c2VyLWRlZmluZWQgZXZlbnQgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX1VzZXJFdmVudCB7Ci0JVWludDggdHlwZTsJLyogU0RMX1VTRVJFVkVOVCB0aHJvdWdoIFNETF9OVU1FVkVOVFMtMSAqLwotCWludCBjb2RlOwkvKiBVc2VyIGRlZmluZWQgZXZlbnQgY29kZSAqLwotCXZvaWQgKmRhdGExOwkvKiBVc2VyIGRlZmluZWQgZGF0YSBwb2ludGVyICovCi0Jdm9pZCAqZGF0YTI7CS8qIFVzZXIgZGVmaW5lZCBkYXRhIHBvaW50ZXIgKi8KLX0gU0RMX1VzZXJFdmVudDsKLQotLyogSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgZXZlbnQsIHlvdSBzaG91bGQgaW5jbHVkZSBTRExfc3lzd20uaCAqLwotc3RydWN0IFNETF9TeXNXTW1zZzsKLXR5cGVkZWYgc3RydWN0IFNETF9TeXNXTW1zZyBTRExfU3lzV01tc2c7Ci10eXBlZGVmIHN0cnVjdCBTRExfU3lzV01FdmVudCB7Ci0JVWludDggdHlwZTsKLQlTRExfU3lzV01tc2cgKm1zZzsKLX0gU0RMX1N5c1dNRXZlbnQ7Ci0KLS8qIEdlbmVyYWwgZXZlbnQgc3RydWN0dXJlICovCi10eXBlZGVmIHVuaW9uIFNETF9FdmVudCB7Ci0JVWludDggdHlwZTsKLQlTRExfQWN0aXZlRXZlbnQgYWN0aXZlOwotCVNETF9LZXlib2FyZEV2ZW50IGtleTsKLQlTRExfTW91c2VNb3Rpb25FdmVudCBtb3Rpb247Ci0JU0RMX01vdXNlQnV0dG9uRXZlbnQgYnV0dG9uOwotCVNETF9Kb3lBeGlzRXZlbnQgamF4aXM7Ci0JU0RMX0pveUJhbGxFdmVudCBqYmFsbDsKLQlTRExfSm95SGF0RXZlbnQgamhhdDsKLQlTRExfSm95QnV0dG9uRXZlbnQgamJ1dHRvbjsKLQlTRExfUmVzaXplRXZlbnQgcmVzaXplOwotCVNETF9FeHBvc2VFdmVudCBleHBvc2U7Ci0JU0RMX1F1aXRFdmVudCBxdWl0OwotCVNETF9Vc2VyRXZlbnQgdXNlcjsKLQlTRExfU3lzV01FdmVudCBzeXN3bTsKLX0gU0RMX0V2ZW50OwotCi0KLS8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotLyogUHVtcHMgdGhlIGV2ZW50IGxvb3AsIGdhdGhlcmluZyBldmVudHMgZnJvbSB0aGUgaW5wdXQgZGV2aWNlcy4KLSAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgZXZlbnQgcXVldWUgYW5kIGludGVybmFsIGlucHV0IGRldmljZSBzdGF0ZS4KLSAgIFRoaXMgc2hvdWxkIG9ubHkgYmUgcnVuIGluIHRoZSB0aHJlYWQgdGhhdCBzZXRzIHRoZSB2aWRlbyBtb2RlLgotKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1B1bXBFdmVudHModm9pZCk7Ci0KLS8qIENoZWNrcyB0aGUgZXZlbnQgcXVldWUgZm9yIG1lc3NhZ2VzIGFuZCBvcHRpb25hbGx5IHJldHVybnMgdGhlbS4KLSAgIElmICdhY3Rpb24nIGlzIFNETF9BRERFVkVOVCwgdXAgdG8gJ251bWV2ZW50cycgZXZlbnRzIHdpbGwgYmUgYWRkZWQgdG8KLSAgIHRoZSBiYWNrIG9mIHRoZSBldmVudCBxdWV1ZS4KLSAgIElmICdhY3Rpb24nIGlzIFNETF9QRUVLRVZFTlQsIHVwIHRvICdudW1ldmVudHMnIGV2ZW50cyBhdCB0aGUgZnJvbnQKLSAgIG9mIHRoZSBldmVudCBxdWV1ZSwgbWF0Y2hpbmcgJ21hc2snLCB3aWxsIGJlIHJldHVybmVkIGFuZCB3aWxsIG5vdAotICAgYmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4KLSAgIElmICdhY3Rpb24nIGlzIFNETF9HRVRFVkVOVCwgdXAgdG8gJ251bWV2ZW50cycgZXZlbnRzIGF0IHRoZSBmcm9udCAKLSAgIG9mIHRoZSBldmVudCBxdWV1ZSwgbWF0Y2hpbmcgJ21hc2snLCB3aWxsIGJlIHJldHVybmVkIGFuZCB3aWxsIGJlCi0gICByZW1vdmVkIGZyb20gdGhlIHF1ZXVlLgotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgZXZlbnRzIGFjdHVhbGx5IHN0b3JlZCwgb3IgLTEKLSAgIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLXNhZmUuCi0qLwotdHlwZWRlZiBlbnVtIHsKLQlTRExfQURERVZFTlQsCi0JU0RMX1BFRUtFVkVOVCwKLQlTRExfR0VURVZFTlQKLX0gU0RMX2V2ZW50YWN0aW9uOwotLyogKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfUGVlcEV2ZW50cyhTRExfRXZlbnQgKmV2ZW50cywgaW50IG51bWV2ZW50cywKLQkJCQlTRExfZXZlbnRhY3Rpb24gYWN0aW9uLCBVaW50MzIgbWFzayk7Ci0KLS8qIFBvbGxzIGZvciBjdXJyZW50bHkgcGVuZGluZyBldmVudHMsIGFuZCByZXR1cm5zIDEgaWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nCi0gICBldmVudHMsIG9yIDAgaWYgdGhlcmUgYXJlIG5vbmUgYXZhaWxhYmxlLiAgSWYgJ2V2ZW50JyBpcyBub3QgTlVMTCwgdGhlIG5leHQKLSAgIGV2ZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgYW5kIHN0b3JlZCBpbiB0aGF0IGFyZWEuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfUG9sbEV2ZW50KFNETF9FdmVudCAqZXZlbnQpOwotCi0vKiBXYWl0cyBpbmRlZmluaXRlbHkgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSBldmVudCwgcmV0dXJuaW5nIDEsIG9yIDAgaWYgdGhlcmUKLSAgIHdhcyBhbiBlcnJvciB3aGlsZSB3YWl0aW5nIGZvciBldmVudHMuICBJZiAnZXZlbnQnIGlzIG5vdCBOVUxMLCB0aGUgbmV4dAotICAgZXZlbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBhbmQgc3RvcmVkIGluIHRoYXQgYXJlYS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9XYWl0RXZlbnQoU0RMX0V2ZW50ICpldmVudCk7Ci0KLS8qIEFkZCBhbiBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuCi0gICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBpZiB0aGUgZXZlbnQgcXVldWUgd2FzIGZ1bGwKLSAgIG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1B1c2hFdmVudChTRExfRXZlbnQgKmV2ZW50KTsKLQotLyoKLSAgVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGEgZmlsdGVyIHRvIHByb2Nlc3MgYWxsIGV2ZW50cyBiZWZvcmUgdGhleQotICBjaGFuZ2UgaW50ZXJuYWwgc3RhdGUgYW5kIGFyZSBwb3N0ZWQgdG8gdGhlIGludGVybmFsIGV2ZW50IHF1ZXVlLgotCi0gIFRoZSBmaWx0ZXIgaXMgcHJvdHlwdGVkIGFzOgotKi8KLXR5cGVkZWYgaW50IChTRExDQUxMICpTRExfRXZlbnRGaWx0ZXIpKGNvbnN0IFNETF9FdmVudCAqZXZlbnQpOwotLyoKLSAgSWYgdGhlIGZpbHRlciByZXR1cm5zIDEsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGludGVybmFsIHF1ZXVlLgotICBJZiBpdCByZXR1cm5zIDAsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmUgZHJvcHBlZCBmcm9tIHRoZSBxdWV1ZSwgYnV0IHRoZSAKLSAgaW50ZXJuYWwgc3RhdGUgd2lsbCBzdGlsbCBiZSB1cGRhdGVkLiAgVGhpcyBhbGxvd3Mgc2VsZWN0aXZlIGZpbHRlcmluZyBvZgotICBkeW5hbWljYWxseSBhcnJpdmluZyBldmVudHMuCi0KLSAgV0FSTklORzogIEJlIHZlcnkgY2FyZWZ1bCBvZiB3aGF0IHlvdSBkbyBpbiB0aGUgZXZlbnQgZmlsdGVyIGZ1bmN0aW9uLCBhcyAKLSAgICAgICAgICAgIGl0IG1heSBydW4gaW4gYSBkaWZmZXJlbnQgdGhyZWFkIQotCi0gIFRoZXJlIGlzIG9uZSBjYXZlYXQgd2hlbiBkZWFsaW5nIHdpdGggdGhlIFNETF9RVUlURVZFTlQgZXZlbnQgdHlwZS4gIFRoZQotICBldmVudCBmaWx0ZXIgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgd2luZG93IG1hbmFnZXIgZGVzaXJlcyB0byBjbG9zZSB0aGUKLSAgYXBwbGljYXRpb24gd2luZG93LiAgSWYgdGhlIGV2ZW50IGZpbHRlciByZXR1cm5zIDEsIHRoZW4gdGhlIHdpbmRvdyB3aWxsCi0gIGJlIGNsb3NlZCwgb3RoZXJ3aXNlIHRoZSB3aW5kb3cgd2lsbCByZW1haW4gb3BlbiBpZiBwb3NzaWJsZS4KLSAgSWYgdGhlIHF1aXQgZXZlbnQgaXMgZ2VuZXJhdGVkIGJ5IGFuIGludGVycnVwdCBzaWduYWwsIGl0IHdpbGwgYnlwYXNzIHRoZQotICBpbnRlcm5hbCBxdWV1ZSBhbmQgYmUgZGVsaXZlcmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBhdCB0aGUgbmV4dCBldmVudCBwb2xsLgotKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1NldEV2ZW50RmlsdGVyKFNETF9FdmVudEZpbHRlciBmaWx0ZXIpOwotCi0vKgotICBSZXR1cm4gdGhlIGN1cnJlbnQgZXZlbnQgZmlsdGVyIC0gY2FuIGJlIHVzZWQgdG8gImNoYWluIiBmaWx0ZXJzLgotICBJZiB0aGVyZSBpcyBubyBldmVudCBmaWx0ZXIgc2V0LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4KLSovCi1leHRlcm4gREVDTFNQRUMgU0RMX0V2ZW50RmlsdGVyIFNETENBTEwgU0RMX0dldEV2ZW50RmlsdGVyKHZvaWQpOwotCi0vKgotICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBzdGF0ZSBvZiBwcm9jZXNzaW5nIGNlcnRhaW4gZXZlbnRzLgotICBJZiAnc3RhdGUnIGlzIHNldCB0byBTRExfSUdOT1JFLCB0aGF0IGV2ZW50IHdpbGwgYmUgYXV0b21hdGljYWxseSBkcm9wcGVkCi0gIGZyb20gdGhlIGV2ZW50IHF1ZXVlIGFuZCB3aWxsIG5vdCBldmVudCBiZSBmaWx0ZXJlZC4KLSAgSWYgJ3N0YXRlJyBpcyBzZXQgdG8gU0RMX0VOQUJMRSwgdGhhdCBldmVudCB3aWxsIGJlIHByb2Nlc3NlZCBub3JtYWxseS4KLSAgSWYgJ3N0YXRlJyBpcyBzZXQgdG8gU0RMX1FVRVJZLCBTRExfRXZlbnRTdGF0ZSgpIHdpbGwgcmV0dXJuIHRoZSAKLSAgY3VycmVudCBwcm9jZXNzaW5nIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuCi0qLwotI2RlZmluZSBTRExfUVVFUlkJLTEKLSNkZWZpbmUgU0RMX0lHTk9SRQkgMAotI2RlZmluZSBTRExfRElTQUJMRQkgMAotI2RlZmluZSBTRExfRU5BQkxFCSAxCi1leHRlcm4gREVDTFNQRUMgVWludDggU0RMQ0FMTCBTRExfRXZlbnRTdGF0ZShVaW50OCB0eXBlLCBpbnQgc3RhdGUpOwotCi0KLS8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCi0KLSNlbmRpZiAvKiBfU0RMX2V2ZW50c19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfZ2V0ZW52LmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfZ2V0ZW52LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2I5Y2UuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2dldGVudi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyogREVQUkVDQVRFRCAqLwotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9qb3lzdGljay5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2pveXN0aWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZjcyZjEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2pveXN0aWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyogSW5jbHVkZSBmaWxlIGZvciBTREwgam95c3RpY2sgZXZlbnQgaGFuZGxpbmcgKi8KLQotI2lmbmRlZiBfU0RMX2pveXN0aWNrX2gKLSNkZWZpbmUgX1NETF9qb3lzdGlja19oCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0KLSNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCi0vKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogSW4gb3JkZXIgdG8gdXNlIHRoZXNlIGZ1bmN0aW9ucywgU0RMX0luaXQoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQKLSAgIHdpdGggdGhlIFNETF9JTklUX0pPWVNUSUNLIGZsYWcuICBUaGlzIGNhdXNlcyBTREwgdG8gc2NhbiB0aGUgc3lzdGVtCi0gICBmb3Igam95c3RpY2tzLCBhbmQgbG9hZCBhcHByb3ByaWF0ZSBkcml2ZXJzLgotKi8KLQotLyogVGhlIGpveXN0aWNrIHN0cnVjdHVyZSB1c2VkIHRvIGlkZW50aWZ5IGFuIFNETCBqb3lzdGljayAqLwotc3RydWN0IF9TRExfSm95c3RpY2s7Ci10eXBlZGVmIHN0cnVjdCBfU0RMX0pveXN0aWNrIFNETF9Kb3lzdGljazsKLQotCi0vKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCi0vKgotICogQ291bnQgdGhlIG51bWJlciBvZiBqb3lzdGlja3MgYXR0YWNoZWQgdG8gdGhlIHN5c3RlbQotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX051bUpveXN0aWNrcyh2b2lkKTsKLQotLyoKLSAqIEdldCB0aGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljay4KLSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBiZWZvcmUgYW55IGpveXN0aWNrcyBhcmUgb3BlbmVkLgotICogSWYgbm8gbmFtZSBjYW4gYmUgZm91bmQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMLgotICovCi1leHRlcm4gREVDTFNQRUMgY29uc3QgY2hhciAqIFNETENBTEwgU0RMX0pveXN0aWNrTmFtZShpbnQgZGV2aWNlX2luZGV4KTsKLQotLyoKLSAqIE9wZW4gYSBqb3lzdGljayBmb3IgdXNlIC0gdGhlIGluZGV4IHBhc3NlZCBhcyBhbiBhcmd1bWVudCByZWZlcnMgdG8KLSAqIHRoZSBOJ3RoIGpveXN0aWNrIG9uIHRoZSBzeXN0ZW0uICBUaGlzIGluZGV4IGlzIHRoZSB2YWx1ZSB3aGljaCB3aWxsCi0gKiBpZGVudGlmeSB0aGlzIGpveXN0aWNrIGluIGZ1dHVyZSBqb3lzdGljayBldmVudHMuCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgam95c3RpY2sgaWRlbnRpZmllciwgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFNETF9Kb3lzdGljayAqIFNETENBTEwgU0RMX0pveXN0aWNrT3BlbihpbnQgZGV2aWNlX2luZGV4KTsKLQotLyoKLSAqIFJldHVybnMgMSBpZiB0aGUgam95c3RpY2sgaGFzIGJlZW4gb3BlbmVkLCBvciAwIGlmIGl0IGhhcyBub3QuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfSm95c3RpY2tPcGVuZWQoaW50IGRldmljZV9pbmRleCk7Ci0KLS8qCi0gKiBHZXQgdGhlIGRldmljZSBpbmRleCBvZiBhbiBvcGVuZWQgam95c3RpY2suCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfSm95c3RpY2tJbmRleChTRExfSm95c3RpY2sgKmpveXN0aWNrKTsKLQotLyoKLSAqIEdldCB0aGUgbnVtYmVyIG9mIGdlbmVyYWwgYXhpcyBjb250cm9scyBvbiBhIGpveXN0aWNrCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfSm95c3RpY2tOdW1BeGVzKFNETF9Kb3lzdGljayAqam95c3RpY2spOwotCi0vKgotICogR2V0IHRoZSBudW1iZXIgb2YgdHJhY2tiYWxscyBvbiBhIGpveXN0aWNrCi0gKiBKb3lzdGljayB0cmFja2JhbGxzIGhhdmUgb25seSByZWxhdGl2ZSBtb3Rpb24gZXZlbnRzIGFzc29jaWF0ZWQKLSAqIHdpdGggdGhlbSBhbmQgdGhlaXIgc3RhdGUgY2Fubm90IGJlIHBvbGxlZC4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Kb3lzdGlja051bUJhbGxzKFNETF9Kb3lzdGljayAqam95c3RpY2spOwotCi0vKgotICogR2V0IHRoZSBudW1iZXIgb2YgUE9WIGhhdHMgb24gYSBqb3lzdGljawotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0pveXN0aWNrTnVtSGF0cyhTRExfSm95c3RpY2sgKmpveXN0aWNrKTsKLQotLyoKLSAqIEdldCB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMgb24gYSBqb3lzdGljawotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0pveXN0aWNrTnVtQnV0dG9ucyhTRExfSm95c3RpY2sgKmpveXN0aWNrKTsKLQotLyoKLSAqIFVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgb3BlbiBqb3lzdGlja3MuCi0gKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBldmVudCBsb29wIGlmIGFueSBqb3lzdGljawotICogZXZlbnRzIGFyZSBlbmFibGVkLgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9Kb3lzdGlja1VwZGF0ZSh2b2lkKTsKLQotLyoKLSAqIEVuYWJsZS9kaXNhYmxlIGpveXN0aWNrIGV2ZW50IHBvbGxpbmcuCi0gKiBJZiBqb3lzdGljayBldmVudHMgYXJlIGRpc2FibGVkLCB5b3UgbXVzdCBjYWxsIFNETF9Kb3lzdGlja1VwZGF0ZSgpCi0gKiB5b3Vyc2VsZiBhbmQgY2hlY2sgdGhlIHN0YXRlIG9mIHRoZSBqb3lzdGljayB3aGVuIHlvdSB3YW50IGpveXN0aWNrCi0gKiBpbmZvcm1hdGlvbi4KLSAqIFRoZSBzdGF0ZSBjYW4gYmUgb25lIG9mIFNETF9RVUVSWSwgU0RMX0VOQUJMRSBvciBTRExfSUdOT1JFLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0pveXN0aWNrRXZlbnRTdGF0ZShpbnQgc3RhdGUpOwotCi0vKgotICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIGF4aXMgY29udHJvbCBvbiBhIGpveXN0aWNrCi0gKiBUaGUgc3RhdGUgaXMgYSB2YWx1ZSByYW5naW5nIGZyb20gLTMyNzY4IHRvIDMyNzY3LgotICogVGhlIGF4aXMgaW5kaWNlcyBzdGFydCBhdCBpbmRleCAwLgotICovCi1leHRlcm4gREVDTFNQRUMgU2ludDE2IFNETENBTEwgU0RMX0pveXN0aWNrR2V0QXhpcyhTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYXhpcyk7Ci0KLS8qCi0gKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBQT1YgaGF0IG9uIGEgam95c3RpY2sKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25zOgotICovCi0jZGVmaW5lIFNETF9IQVRfQ0VOVEVSRUQJMHgwMAotI2RlZmluZSBTRExfSEFUX1VQCQkweDAxCi0jZGVmaW5lIFNETF9IQVRfUklHSFQJCTB4MDIKLSNkZWZpbmUgU0RMX0hBVF9ET1dOCQkweDA0Ci0jZGVmaW5lIFNETF9IQVRfTEVGVAkJMHgwOAotI2RlZmluZSBTRExfSEFUX1JJR0hUVVAJCShTRExfSEFUX1JJR0hUfFNETF9IQVRfVVApCi0jZGVmaW5lIFNETF9IQVRfUklHSFRET1dOCShTRExfSEFUX1JJR0hUfFNETF9IQVRfRE9XTikKLSNkZWZpbmUgU0RMX0hBVF9MRUZUVVAJCShTRExfSEFUX0xFRlR8U0RMX0hBVF9VUCkKLSNkZWZpbmUgU0RMX0hBVF9MRUZURE9XTgkoU0RMX0hBVF9MRUZUfFNETF9IQVRfRE9XTikKLS8qCi0gKiBUaGUgaGF0IGluZGljZXMgc3RhcnQgYXQgaW5kZXggMC4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFVpbnQ4IFNETENBTEwgU0RMX0pveXN0aWNrR2V0SGF0KFNETF9Kb3lzdGljayAqam95c3RpY2ssIGludCBoYXQpOwotCi0vKgotICogR2V0IHRoZSBiYWxsIGF4aXMgY2hhbmdlIHNpbmNlIHRoZSBsYXN0IHBvbGwKLSAqIFRoaXMgcmV0dXJucyAwLCBvciAtMSBpZiB5b3UgcGFzc2VkIGl0IGludmFsaWQgcGFyYW1ldGVycy4KLSAqIFRoZSBiYWxsIGluZGljZXMgc3RhcnQgYXQgaW5kZXggMC4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Kb3lzdGlja0dldEJhbGwoU0RMX0pveXN0aWNrICpqb3lzdGljaywgaW50IGJhbGwsIGludCAqZHgsIGludCAqZHkpOwotCi0vKgotICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgYnV0dG9uIG9uIGEgam95c3RpY2sKLSAqIFRoZSBidXR0b24gaW5kaWNlcyBzdGFydCBhdCBpbmRleCAwLgotICovCi1leHRlcm4gREVDTFNQRUMgVWludDggU0RMQ0FMTCBTRExfSm95c3RpY2tHZXRCdXR0b24oU0RMX0pveXN0aWNrICpqb3lzdGljaywgaW50IGJ1dHRvbik7Ci0KLS8qCi0gKiBDbG9zZSBhIGpveXN0aWNrIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggU0RMX0pveXN0aWNrT3BlbigpCi0gKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljayk7Ci0KLQotLyogRW5kcyBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKLQotI2VuZGlmIC8qIF9TRExfam95c3RpY2tfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2tleWJvYXJkLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfa2V5Ym9hcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkN2RjYS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfa2V5Ym9hcmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBJbmNsdWRlIGZpbGUgZm9yIFNETCBrZXlib2FyZCBldmVudCBoYW5kbGluZyAqLwotCi0jaWZuZGVmIF9TRExfa2V5Ym9hcmRfaAotI2RlZmluZSBfU0RMX2tleWJvYXJkX2gKLQotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLSNpbmNsdWRlICJTRExfZXJyb3IuaCIKLSNpbmNsdWRlICJTRExfa2V5c3ltLmgiCi0KLSNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCi0vKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogS2V5c3ltIHN0cnVjdHVyZQotICAgLSBUaGUgc2NhbmNvZGUgaXMgaGFyZHdhcmUgZGVwZW5kZW50LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGdlbmVyYWwKLSAgICAgYXBwbGljYXRpb25zLiAgSWYgbm8gaGFyZHdhcmUgc2NhbmNvZGUgaXMgYXZhaWxhYmxlLCBpdCB3aWxsIGJlIDAuCi0KLSAgIC0gVGhlICd1bmljb2RlJyB0cmFuc2xhdGVkIGNoYXJhY3RlciBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIGNoYXJhY3RlcgotICAgICB0cmFuc2xhdGlvbiBpcyBlbmFibGVkIGJ5IHRoZSBTRExfRW5hYmxlVU5JQ09ERSgpIEFQSS4gIElmIG5vbi16ZXJvLAotICAgICB0aGlzIGlzIGEgVU5JQ09ERSBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUga2V5cHJlc3MuICBJZiB0aGUKLSAgICAgaGlnaCA5IGJpdHMgb2YgdGhlIGNoYXJhY3RlciBhcmUgMCwgdGhlbiB0aGlzIG1hcHMgdG8gdGhlIGVxdWl2YWxlbnQKLSAgICAgQVNDSUkgY2hhcmFjdGVyOgotCWNoYXIgY2g7Ci0JaWYgKCAoa2V5c3ltLnVuaWNvZGUgJiAweEZGODApID09IDAgKSB7Ci0JCWNoID0ga2V5c3ltLnVuaWNvZGUgJiAweDdGOwotCX0gZWxzZSB7Ci0JCUFuIGludGVybmF0aW9uYWwgY2hhcmFjdGVyLi4KLQl9Ci0gKi8KLXR5cGVkZWYgc3RydWN0IFNETF9rZXlzeW0gewotCVVpbnQ4IHNjYW5jb2RlOwkJCS8qIGhhcmR3YXJlIHNwZWNpZmljIHNjYW5jb2RlICovCi0JU0RMS2V5IHN5bTsJCQkvKiBTREwgdmlydHVhbCBrZXlzeW0gKi8KLQlTRExNb2QgbW9kOwkJCS8qIGN1cnJlbnQga2V5IG1vZGlmaWVycyAqLwotCVVpbnQxNiB1bmljb2RlOwkJCS8qIHRyYW5zbGF0ZWQgY2hhcmFjdGVyICovCi19IFNETF9rZXlzeW07Ci0KLS8qIFRoaXMgaXMgdGhlIG1hc2sgd2hpY2ggcmVmZXJzIHRvIGFsbCBob3RrZXkgYmluZGluZ3MgKi8KLSNkZWZpbmUgU0RMX0FMTF9IT1RLRVlTCQkweEZGRkZGRkZGCi0KLS8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLS8qCi0gKiBFbmFibGUvRGlzYWJsZSBVTklDT0RFIHRyYW5zbGF0aW9uIG9mIGtleWJvYXJkIGlucHV0LgotICogVGhpcyB0cmFuc2xhdGlvbiBoYXMgc29tZSBvdmVyaGVhZCwgc28gdHJhbnNsYXRpb24gZGVmYXVsdHMgb2ZmLgotICogSWYgJ2VuYWJsZScgaXMgMSwgdHJhbnNsYXRpb24gaXMgZW5hYmxlZC4KLSAqIElmICdlbmFibGUnIGlzIDAsIHRyYW5zbGF0aW9uIGlzIGRpc2FibGVkLgotICogSWYgJ2VuYWJsZScgaXMgLTEsIHRoZSB0cmFuc2xhdGlvbiBzdGF0ZSBpcyBub3QgY2hhbmdlZC4KLSAqIEl0IHJldHVybnMgdGhlIHByZXZpb3VzIHN0YXRlIG9mIGtleWJvYXJkIHRyYW5zbGF0aW9uLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0VuYWJsZVVOSUNPREUoaW50IGVuYWJsZSk7Ci0KLS8qCi0gKiBFbmFibGUvRGlzYWJsZSBrZXlib2FyZCByZXBlYXQuICBLZXlib2FyZCByZXBlYXQgZGVmYXVsdHMgdG8gb2ZmLgotICogJ2RlbGF5JyBpcyB0aGUgaW5pdGlhbCBkZWxheSBpbiBtcyBiZXR3ZWVuIHRoZSB0aW1lIHdoZW4gYSBrZXkgaXMKLSAqIHByZXNzZWQsIGFuZCBrZXlib2FyZCByZXBlYXQgYmVnaW5zLgotICogJ2ludGVydmFsJyBpcyB0aGUgdGltZSBpbiBtcyBiZXR3ZWVuIGtleWJvYXJkIHJlcGVhdCBldmVudHMuCi0gKi8KLSNkZWZpbmUgU0RMX0RFRkFVTFRfUkVQRUFUX0RFTEFZCTUwMAotI2RlZmluZSBTRExfREVGQVVMVF9SRVBFQVRfSU5URVJWQUwJMzAKLS8qCi0gKiBJZiAnZGVsYXknIGlzIHNldCB0byAwLCBrZXlib2FyZCByZXBlYXQgaXMgZGlzYWJsZWQuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfRW5hYmxlS2V5UmVwZWF0KGludCBkZWxheSwgaW50IGludGVydmFsKTsKLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0dldEtleVJlcGVhdChpbnQgKmRlbGF5LCBpbnQgKmludGVydmFsKTsKLQotLyoKLSAqIEdldCBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KLSAqIFJldHVybnMgYW4gYXJyYXkgb2Yga2V5c3RhdGVzLCBpbmRleGVkIGJ5IHRoZSBTRExLXyogc3ltcy4KLSAqIFVzZWQ6Ci0gKiAJVWludDggKmtleXN0YXRlID0gU0RMX0dldEtleVN0YXRlKE5VTEwpOwotICoJaWYgKCBrZXlzdGF0ZVtTRExLX1JFVFVSTl0gKSAuLi4gPFJFVFVSTj4gaXMgcHJlc3NlZC4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFVpbnQ4ICogU0RMQ0FMTCBTRExfR2V0S2V5U3RhdGUoaW50ICpudW1rZXlzKTsKLQotLyoKLSAqIEdldCB0aGUgY3VycmVudCBrZXkgbW9kaWZpZXIgc3RhdGUKLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFNETE1vZCBTRExDQUxMIFNETF9HZXRNb2RTdGF0ZSh2b2lkKTsKLQotLyoKLSAqIFNldCB0aGUgY3VycmVudCBrZXkgbW9kaWZpZXIgc3RhdGUKLSAqIFRoaXMgZG9lcyBub3QgY2hhbmdlIHRoZSBrZXlib2FyZCBzdGF0ZSwgb25seSB0aGUga2V5IG1vZGlmaWVyIGZsYWdzLgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9TZXRNb2RTdGF0ZShTRExNb2QgbW9kc3RhdGUpOwotCi0vKgotICogR2V0IHRoZSBuYW1lIG9mIGFuIFNETCB2aXJ0dWFsIGtleXN5bQotICovCi1leHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX0dldEtleU5hbWUoU0RMS2V5IGtleSk7Ci0KLQotLyogRW5kcyBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKLQotI2VuZGlmIC8qIF9TRExfa2V5Ym9hcmRfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2tleXN5bS5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2tleXN5bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQ0YTAzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9rZXlzeW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0jaWZuZGVmIF9TRExfa2V5c3ltX2gKLSNkZWZpbmUgX1NETF9rZXlzeW1faAotCi0vKiBXaGF0IHdlIHJlYWxseSB3YW50IGlzIGEgbWFwcGluZyBvZiBldmVyeSByYXcga2V5IG9uIHRoZSBrZXlib2FyZC4KLSAgIFRvIHN1cHBvcnQgaW50ZXJuYXRpb25hbCBrZXlib2FyZHMsIHdlIHVzZSB0aGUgcmFuZ2UgMHhBMSAtIDB4RkYKLSAgIGFzIGludGVybmF0aW9uYWwgdmlydHVhbCBrZXljb2Rlcy4gIFdlJ2xsIGZvbGxvdyBpbiB0aGUgZm9vdHN0ZXBzIG9mIFgxMS4uLgotICAgVGhlIG5hbWVzIG9mIHRoZSBrZXlzCi0gKi8KLSAKLXR5cGVkZWYgZW51bSB7Ci0JLyogVGhlIGtleWJvYXJkIHN5bXMgaGF2ZSBiZWVuIGNsZXZlcmx5IGNob3NlbiB0byBtYXAgdG8gQVNDSUkgKi8KLQlTRExLX1VOS05PV04JCT0gMCwKLQlTRExLX0ZJUlNUCQk9IDAsCi0JU0RMS19CQUNLU1BBQ0UJCT0gOCwKLQlTRExLX1RBQgkJPSA5LAotCVNETEtfQ0xFQVIJCT0gMTIsCi0JU0RMS19SRVRVUk4JCT0gMTMsCi0JU0RMS19QQVVTRQkJPSAxOSwKLQlTRExLX0VTQ0FQRQkJPSAyNywKLQlTRExLX1NQQUNFCQk9IDMyLAotCVNETEtfRVhDTEFJTQkJPSAzMywKLQlTRExLX1FVT1RFREJMCQk9IDM0LAotCVNETEtfSEFTSAkJPSAzNSwKLQlTRExLX0RPTExBUgkJPSAzNiwKLQlTRExLX0FNUEVSU0FORAkJPSAzOCwKLQlTRExLX1FVT1RFCQk9IDM5LAotCVNETEtfTEVGVFBBUkVOCQk9IDQwLAotCVNETEtfUklHSFRQQVJFTgkJPSA0MSwKLQlTRExLX0FTVEVSSVNLCQk9IDQyLAotCVNETEtfUExVUwkJPSA0MywKLQlTRExLX0NPTU1BCQk9IDQ0LAotCVNETEtfTUlOVVMJCT0gNDUsCi0JU0RMS19QRVJJT0QJCT0gNDYsCi0JU0RMS19TTEFTSAkJPSA0NywKLQlTRExLXzAJCQk9IDQ4LAotCVNETEtfMQkJCT0gNDksCi0JU0RMS18yCQkJPSA1MCwKLQlTRExLXzMJCQk9IDUxLAotCVNETEtfNAkJCT0gNTIsCi0JU0RMS181CQkJPSA1MywKLQlTRExLXzYJCQk9IDU0LAotCVNETEtfNwkJCT0gNTUsCi0JU0RMS184CQkJPSA1NiwKLQlTRExLXzkJCQk9IDU3LAotCVNETEtfQ09MT04JCT0gNTgsCi0JU0RMS19TRU1JQ09MT04JCT0gNTksCi0JU0RMS19MRVNTCQk9IDYwLAotCVNETEtfRVFVQUxTCQk9IDYxLAotCVNETEtfR1JFQVRFUgkJPSA2MiwKLQlTRExLX1FVRVNUSU9OCQk9IDYzLAotCVNETEtfQVQJCQk9IDY0LAotCS8qIAotCSAgIFNraXAgdXBwZXJjYXNlIGxldHRlcnMKLQkgKi8KLQlTRExLX0xFRlRCUkFDS0VUCT0gOTEsCi0JU0RMS19CQUNLU0xBU0gJCT0gOTIsCi0JU0RMS19SSUdIVEJSQUNLRVQJPSA5MywKLQlTRExLX0NBUkVUCQk9IDk0LAotCVNETEtfVU5ERVJTQ09SRQkJPSA5NSwKLQlTRExLX0JBQ0tRVU9URQkJPSA5NiwKLQlTRExLX2EJCQk9IDk3LAotCVNETEtfYgkJCT0gOTgsCi0JU0RMS19jCQkJPSA5OSwKLQlTRExLX2QJCQk9IDEwMCwKLQlTRExLX2UJCQk9IDEwMSwKLQlTRExLX2YJCQk9IDEwMiwKLQlTRExLX2cJCQk9IDEwMywKLQlTRExLX2gJCQk9IDEwNCwKLQlTRExLX2kJCQk9IDEwNSwKLQlTRExLX2oJCQk9IDEwNiwKLQlTRExLX2sJCQk9IDEwNywKLQlTRExLX2wJCQk9IDEwOCwKLQlTRExLX20JCQk9IDEwOSwKLQlTRExLX24JCQk9IDExMCwKLQlTRExLX28JCQk9IDExMSwKLQlTRExLX3AJCQk9IDExMiwKLQlTRExLX3EJCQk9IDExMywKLQlTRExLX3IJCQk9IDExNCwKLQlTRExLX3MJCQk9IDExNSwKLQlTRExLX3QJCQk9IDExNiwKLQlTRExLX3UJCQk9IDExNywKLQlTRExLX3YJCQk9IDExOCwKLQlTRExLX3cJCQk9IDExOSwKLQlTRExLX3gJCQk9IDEyMCwKLQlTRExLX3kJCQk9IDEyMSwKLQlTRExLX3oJCQk9IDEyMiwKLQlTRExLX0RFTEVURQkJPSAxMjcsCi0JLyogRW5kIG9mIEFTQ0lJIG1hcHBlZCBrZXlzeW1zICovCi0KLQkvKiBJbnRlcm5hdGlvbmFsIGtleWJvYXJkIHN5bXMgKi8KLQlTRExLX1dPUkxEXzAJCT0gMTYwLAkJLyogMHhBMCAqLwotCVNETEtfV09STERfMQkJPSAxNjEsCi0JU0RMS19XT1JMRF8yCQk9IDE2MiwKLQlTRExLX1dPUkxEXzMJCT0gMTYzLAotCVNETEtfV09STERfNAkJPSAxNjQsCi0JU0RMS19XT1JMRF81CQk9IDE2NSwKLQlTRExLX1dPUkxEXzYJCT0gMTY2LAotCVNETEtfV09STERfNwkJPSAxNjcsCi0JU0RMS19XT1JMRF84CQk9IDE2OCwKLQlTRExLX1dPUkxEXzkJCT0gMTY5LAotCVNETEtfV09STERfMTAJCT0gMTcwLAotCVNETEtfV09STERfMTEJCT0gMTcxLAotCVNETEtfV09STERfMTIJCT0gMTcyLAotCVNETEtfV09STERfMTMJCT0gMTczLAotCVNETEtfV09STERfMTQJCT0gMTc0LAotCVNETEtfV09STERfMTUJCT0gMTc1LAotCVNETEtfV09STERfMTYJCT0gMTc2LAotCVNETEtfV09STERfMTcJCT0gMTc3LAotCVNETEtfV09STERfMTgJCT0gMTc4LAotCVNETEtfV09STERfMTkJCT0gMTc5LAotCVNETEtfV09STERfMjAJCT0gMTgwLAotCVNETEtfV09STERfMjEJCT0gMTgxLAotCVNETEtfV09STERfMjIJCT0gMTgyLAotCVNETEtfV09STERfMjMJCT0gMTgzLAotCVNETEtfV09STERfMjQJCT0gMTg0LAotCVNETEtfV09STERfMjUJCT0gMTg1LAotCVNETEtfV09STERfMjYJCT0gMTg2LAotCVNETEtfV09STERfMjcJCT0gMTg3LAotCVNETEtfV09STERfMjgJCT0gMTg4LAotCVNETEtfV09STERfMjkJCT0gMTg5LAotCVNETEtfV09STERfMzAJCT0gMTkwLAotCVNETEtfV09STERfMzEJCT0gMTkxLAotCVNETEtfV09STERfMzIJCT0gMTkyLAotCVNETEtfV09STERfMzMJCT0gMTkzLAotCVNETEtfV09STERfMzQJCT0gMTk0LAotCVNETEtfV09STERfMzUJCT0gMTk1LAotCVNETEtfV09STERfMzYJCT0gMTk2LAotCVNETEtfV09STERfMzcJCT0gMTk3LAotCVNETEtfV09STERfMzgJCT0gMTk4LAotCVNETEtfV09STERfMzkJCT0gMTk5LAotCVNETEtfV09STERfNDAJCT0gMjAwLAotCVNETEtfV09STERfNDEJCT0gMjAxLAotCVNETEtfV09STERfNDIJCT0gMjAyLAotCVNETEtfV09STERfNDMJCT0gMjAzLAotCVNETEtfV09STERfNDQJCT0gMjA0LAotCVNETEtfV09STERfNDUJCT0gMjA1LAotCVNETEtfV09STERfNDYJCT0gMjA2LAotCVNETEtfV09STERfNDcJCT0gMjA3LAotCVNETEtfV09STERfNDgJCT0gMjA4LAotCVNETEtfV09STERfNDkJCT0gMjA5LAotCVNETEtfV09STERfNTAJCT0gMjEwLAotCVNETEtfV09STERfNTEJCT0gMjExLAotCVNETEtfV09STERfNTIJCT0gMjEyLAotCVNETEtfV09STERfNTMJCT0gMjEzLAotCVNETEtfV09STERfNTQJCT0gMjE0LAotCVNETEtfV09STERfNTUJCT0gMjE1LAotCVNETEtfV09STERfNTYJCT0gMjE2LAotCVNETEtfV09STERfNTcJCT0gMjE3LAotCVNETEtfV09STERfNTgJCT0gMjE4LAotCVNETEtfV09STERfNTkJCT0gMjE5LAotCVNETEtfV09STERfNjAJCT0gMjIwLAotCVNETEtfV09STERfNjEJCT0gMjIxLAotCVNETEtfV09STERfNjIJCT0gMjIyLAotCVNETEtfV09STERfNjMJCT0gMjIzLAotCVNETEtfV09STERfNjQJCT0gMjI0LAotCVNETEtfV09STERfNjUJCT0gMjI1LAotCVNETEtfV09STERfNjYJCT0gMjI2LAotCVNETEtfV09STERfNjcJCT0gMjI3LAotCVNETEtfV09STERfNjgJCT0gMjI4LAotCVNETEtfV09STERfNjkJCT0gMjI5LAotCVNETEtfV09STERfNzAJCT0gMjMwLAotCVNETEtfV09STERfNzEJCT0gMjMxLAotCVNETEtfV09STERfNzIJCT0gMjMyLAotCVNETEtfV09STERfNzMJCT0gMjMzLAotCVNETEtfV09STERfNzQJCT0gMjM0LAotCVNETEtfV09STERfNzUJCT0gMjM1LAotCVNETEtfV09STERfNzYJCT0gMjM2LAotCVNETEtfV09STERfNzcJCT0gMjM3LAotCVNETEtfV09STERfNzgJCT0gMjM4LAotCVNETEtfV09STERfNzkJCT0gMjM5LAotCVNETEtfV09STERfODAJCT0gMjQwLAotCVNETEtfV09STERfODEJCT0gMjQxLAotCVNETEtfV09STERfODIJCT0gMjQyLAotCVNETEtfV09STERfODMJCT0gMjQzLAotCVNETEtfV09STERfODQJCT0gMjQ0LAotCVNETEtfV09STERfODUJCT0gMjQ1LAotCVNETEtfV09STERfODYJCT0gMjQ2LAotCVNETEtfV09STERfODcJCT0gMjQ3LAotCVNETEtfV09STERfODgJCT0gMjQ4LAotCVNETEtfV09STERfODkJCT0gMjQ5LAotCVNETEtfV09STERfOTAJCT0gMjUwLAotCVNETEtfV09STERfOTEJCT0gMjUxLAotCVNETEtfV09STERfOTIJCT0gMjUyLAotCVNETEtfV09STERfOTMJCT0gMjUzLAotCVNETEtfV09STERfOTQJCT0gMjU0LAotCVNETEtfV09STERfOTUJCT0gMjU1LAkJLyogMHhGRiAqLwotCi0JLyogTnVtZXJpYyBrZXlwYWQgKi8KLQlTRExLX0tQMAkJPSAyNTYsCi0JU0RMS19LUDEJCT0gMjU3LAotCVNETEtfS1AyCQk9IDI1OCwKLQlTRExLX0tQMwkJPSAyNTksCi0JU0RMS19LUDQJCT0gMjYwLAotCVNETEtfS1A1CQk9IDI2MSwKLQlTRExLX0tQNgkJPSAyNjIsCi0JU0RMS19LUDcJCT0gMjYzLAotCVNETEtfS1A4CQk9IDI2NCwKLQlTRExLX0tQOQkJPSAyNjUsCi0JU0RMS19LUF9QRVJJT0QJCT0gMjY2LAotCVNETEtfS1BfRElWSURFCQk9IDI2NywKLQlTRExLX0tQX01VTFRJUExZCT0gMjY4LAotCVNETEtfS1BfTUlOVVMJCT0gMjY5LAotCVNETEtfS1BfUExVUwkJPSAyNzAsCi0JU0RMS19LUF9FTlRFUgkJPSAyNzEsCi0JU0RMS19LUF9FUVVBTFMJCT0gMjcyLAotCi0JLyogQXJyb3dzICsgSG9tZS9FbmQgcGFkICovCi0JU0RMS19VUAkJCT0gMjczLAotCVNETEtfRE9XTgkJPSAyNzQsCi0JU0RMS19SSUdIVAkJPSAyNzUsCi0JU0RMS19MRUZUCQk9IDI3NiwKLQlTRExLX0lOU0VSVAkJPSAyNzcsCi0JU0RMS19IT01FCQk9IDI3OCwKLQlTRExLX0VORAkJPSAyNzksCi0JU0RMS19QQUdFVVAJCT0gMjgwLAotCVNETEtfUEFHRURPV04JCT0gMjgxLAotCi0JLyogRnVuY3Rpb24ga2V5cyAqLwotCVNETEtfRjEJCQk9IDI4MiwKLQlTRExLX0YyCQkJPSAyODMsCi0JU0RMS19GMwkJCT0gMjg0LAotCVNETEtfRjQJCQk9IDI4NSwKLQlTRExLX0Y1CQkJPSAyODYsCi0JU0RMS19GNgkJCT0gMjg3LAotCVNETEtfRjcJCQk9IDI4OCwKLQlTRExLX0Y4CQkJPSAyODksCi0JU0RMS19GOQkJCT0gMjkwLAotCVNETEtfRjEwCQk9IDI5MSwKLQlTRExLX0YxMQkJPSAyOTIsCi0JU0RMS19GMTIJCT0gMjkzLAotCVNETEtfRjEzCQk9IDI5NCwKLQlTRExLX0YxNAkJPSAyOTUsCi0JU0RMS19GMTUJCT0gMjk2LAotCi0JLyogS2V5IHN0YXRlIG1vZGlmaWVyIGtleXMgKi8KLQlTRExLX05VTUxPQ0sJCT0gMzAwLAotCVNETEtfQ0FQU0xPQ0sJCT0gMzAxLAotCVNETEtfU0NST0xMT0NLCQk9IDMwMiwKLQlTRExLX1JTSElGVAkJPSAzMDMsCi0JU0RMS19MU0hJRlQJCT0gMzA0LAotCVNETEtfUkNUUkwJCT0gMzA1LAotCVNETEtfTENUUkwJCT0gMzA2LAotCVNETEtfUkFMVAkJPSAzMDcsCi0JU0RMS19MQUxUCQk9IDMwOCwKLQlTRExLX1JNRVRBCQk9IDMwOSwKLQlTRExLX0xNRVRBCQk9IDMxMCwKLQlTRExLX0xTVVBFUgkJPSAzMTEsCQkvKiBMZWZ0ICJXaW5kb3dzIiBrZXkgKi8KLQlTRExLX1JTVVBFUgkJPSAzMTIsCQkvKiBSaWdodCAiV2luZG93cyIga2V5ICovCi0JU0RMS19NT0RFCQk9IDMxMywJCS8qICJBbHQgR3IiIGtleSAqLwotCVNETEtfQ09NUE9TRQkJPSAzMTQsCQkvKiBNdWx0aS1rZXkgY29tcG9zZSBrZXkgKi8KLQotCS8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb24ga2V5cyAqLwotCVNETEtfSEVMUAkJPSAzMTUsCi0JU0RMS19QUklOVAkJPSAzMTYsCi0JU0RMS19TWVNSRVEJCT0gMzE3LAotCVNETEtfQlJFQUsJCT0gMzE4LAotCVNETEtfTUVOVQkJPSAzMTksCi0JU0RMS19QT1dFUgkJPSAzMjAsCQkvKiBQb3dlciBNYWNpbnRvc2ggcG93ZXIga2V5ICovCi0JU0RMS19FVVJPCQk9IDMyMSwJCS8qIFNvbWUgZXVyb3BlYW4ga2V5Ym9hcmRzICovCi0JU0RMS19VTkRPCQk9IDMyMiwJCS8qIEF0YXJpIGtleWJvYXJkIGhhcyBVbmRvICovCi0KLQkvKiBBZGQgYW55IG90aGVyIGtleXMgaGVyZSAqLwotCi0JU0RMS19MQVNUCi19IFNETEtleTsKLQotLyogRW51bWVyYXRpb24gb2YgdmFsaWQga2V5IG1vZHMgKHBvc3NpYmx5IE9SJ2QgdG9nZXRoZXIpICovCi10eXBlZGVmIGVudW0gewotCUtNT0RfTk9ORSAgPSAweDAwMDAsCi0JS01PRF9MU0hJRlQ9IDB4MDAwMSwKLQlLTU9EX1JTSElGVD0gMHgwMDAyLAotCUtNT0RfTENUUkwgPSAweDAwNDAsCi0JS01PRF9SQ1RSTCA9IDB4MDA4MCwKLQlLTU9EX0xBTFQgID0gMHgwMTAwLAotCUtNT0RfUkFMVCAgPSAweDAyMDAsCi0JS01PRF9MTUVUQSA9IDB4MDQwMCwKLQlLTU9EX1JNRVRBID0gMHgwODAwLAotCUtNT0RfTlVNICAgPSAweDEwMDAsCi0JS01PRF9DQVBTICA9IDB4MjAwMCwKLQlLTU9EX01PREUgID0gMHg0MDAwLAotCUtNT0RfUkVTRVJWRUQgPSAweDgwMDAKLX0gU0RMTW9kOwotCi0jZGVmaW5lIEtNT0RfQ1RSTAkoS01PRF9MQ1RSTHxLTU9EX1JDVFJMKQotI2RlZmluZSBLTU9EX1NISUZUCShLTU9EX0xTSElGVHxLTU9EX1JTSElGVCkKLSNkZWZpbmUgS01PRF9BTFQJKEtNT0RfTEFMVHxLTU9EX1JBTFQpCi0jZGVmaW5lIEtNT0RfTUVUQQkoS01PRF9MTUVUQXxLTU9EX1JNRVRBKQotCi0jZW5kaWYgLyogX1NETF9rZXlzeW1faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2xvYWRzby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX2xvYWRzby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk2NDQ5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9sb2Fkc28uaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLS8qIFN5c3RlbSBkZXBlbmRlbnQgbGlicmFyeSBsb2FkaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogU29tZSB0aGluZ3MgdG8ga2VlcCBpbiBtaW5kOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIC0gVGhlc2UgZnVuY3Rpb25zIG9ubHkgd29yayBvbiBDIGZ1bmN0aW9uIG5hbWVzLiAgT3RoZXIgbGFuZ3VhZ2VzIG1heQotICAgICBoYXZlIG5hbWUgbWFuZ2xpbmcgYW5kIGludHJpbnNpYyBsYW5ndWFnZSBzdXBwb3J0IHRoYXQgdmFyaWVzIGZyb20KLSAgICAgY29tcGlsZXIgdG8gY29tcGlsZXIuCi0gICAtIE1ha2Ugc3VyZSB5b3UgZGVjbGFyZSB5b3VyIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggdGhlIHNhbWUgY2FsbGluZwotICAgICBjb252ZW50aW9uIGFzIHRoZSBhY3R1YWwgbGlicmFyeSBmdW5jdGlvbi4gIFlvdXIgY29kZSB3aWxsIGNyYXNoCi0gICAgIG15c3RlcmlvdXNseSBpZiB5b3UgZG8gbm90IGRvIHRoaXMuCi0gICAtIEF2b2lkIG5hbWVzcGFjZSBjb2xsaXNpb25zLiAgSWYgeW91IGxvYWQgYSBzeW1ib2wgZnJvbSB0aGUgbGlicmFyeSwKLSAgICAgaXQgaXMgbm90IGRlZmluZWQgd2hldGhlciBvciBub3QgaXQgZ29lcyBpbnRvIHRoZSBnbG9iYWwgc3ltYm9sCi0gICAgIG5hbWVzcGFjZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgSWYgaXQgZG9lcyBhbmQgaXQgY29uZmxpY3RzIHdpdGgKLSAgICAgc3ltYm9scyBpbiB5b3VyIGNvZGUgb3Igb3RoZXIgc2hhcmVkIGxpYnJhcmllcywgeW91IHdpbGwgbm90IGdldAotICAgICB0aGUgcmVzdWx0cyB5b3UgZXhwZWN0LiA6KQotKi8KLQotCi0jaWZuZGVmIF9TRExfbG9hZHNvX2gKLSNkZWZpbmUgX1NETF9sb2Fkc29faAotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gZHluYW1pY2FsbHkgbG9hZHMgYSBzaGFyZWQgb2JqZWN0IGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICogdG8gdGhlIG9iamVjdCBoYW5kbGUgKG9yIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGVycm9yKS4KLSAqIFRoZSAnc29maWxlJyBwYXJhbWV0ZXIgaXMgYSBzeXN0ZW0gZGVwZW5kZW50IG5hbWUgb2YgdGhlIG9iamVjdCBmaWxlLgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCAqIFNETENBTEwgU0RMX0xvYWRPYmplY3QoY29uc3QgY2hhciAqc29maWxlKTsKLQotLyogR2l2ZW4gYW4gb2JqZWN0IGhhbmRsZSwgdGhpcyBmdW5jdGlvbiBsb29rcyB1cCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAqIG5hbWVkIGZ1bmN0aW9uIGluIHRoZSBzaGFyZWQgb2JqZWN0IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBhZGRyZXNzCi0gKiBpcyBubyBsb25nZXIgdmFsaWQgYWZ0ZXIgY2FsbGluZyBTRExfVW5sb2FkT2JqZWN0KCkuCi0gKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkICogU0RMQ0FMTCBTRExfTG9hZEZ1bmN0aW9uKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLS8qIFVubG9hZCBhIHNoYXJlZCBvYmplY3QgZnJvbSBtZW1vcnkgKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1VubG9hZE9iamVjdCh2b2lkICpoYW5kbGUpOwotCi0vKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaW5jbHVkZSAiY2xvc2VfY29kZS5oIgotCi0jZW5kaWYgLyogX1NETF9sb2Fkc29faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX21haW4uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOGI3MjguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLSNpZm5kZWYgX1NETF9tYWluX2gKLSNkZWZpbmUgX1NETF9tYWluX2gKLQotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLQotLyogUmVkZWZpbmUgbWFpbigpIG9uIFdpbjMyIGFuZCBNYWNPUyBzbyB0aGF0IGl0IGlzIGNhbGxlZCBieSB3aW5tYWluLmMgKi8KLQotI2lmIGRlZmluZWQoX19XSU4zMl9fKSB8fCBcCi0gICAgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgIWRlZmluZWQoX19CRU9TX18pKSB8fCBcCi0gICAgZGVmaW5lZChfX01BQ09TX18pIHx8IGRlZmluZWQoX19NQUNPU1hfXykgfHwgXAotICAgIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgZGVmaW5lZChRV1MpCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBDX0xJTktBR0UJIkMiCi0jZWxzZQotI2RlZmluZSBDX0xJTktBR0UKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKiBUaGUgYXBwbGljYXRpb24ncyBtYWluKCkgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBDIGxpbmthZ2UsCi0gICBhbmQgc2hvdWxkIGJlIGRlY2xhcmVkIGxpa2UgdGhpczoKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi0JaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLQl7Ci0JfQotICovCi0jZGVmaW5lIG1haW4JU0RMX21haW4KLQotLyogVGhlIHByb3RvdHlwZSBmb3IgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbigpIGZ1bmN0aW9uICovCi1leHRlcm4gQ19MSU5LQUdFIGludCBTRExfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTsKLQotCi0vKiBGcm9tIHRoZSBTREwgbGlicmFyeSBjb2RlIC0tIG5lZWRlZCBmb3IgcmVnaXN0ZXJpbmcgdGhlIGFwcCBvbiBXaW4zMiAqLwotI2lmZGVmIF9fV0lOMzJfXwotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB5b3VyIFdpbk1haW4oKSBmdW5jdGlvbiwgaWYgYW55ICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9TZXRNb2R1bGVIYW5kbGUodm9pZCAqaEluc3QpOwotLyogVGhpcyBjYW4gYWxzbyBiZSBjYWxsZWQsIGJ1dCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5ICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1JlZ2lzdGVyQXBwKGNoYXIgKm5hbWUsIFVpbnQzMiBzdHlsZSwgdm9pZCAqaEluc3QpOwotLyogVGhpcyBjYW4gYWxzbyBiZSBjYWxsZWQsIGJ1dCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IChTRExfUXVpdCBjYWxscyBpdCkgKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1VucmVnaXN0ZXJBcHAodm9pZCk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKLSNlbmRpZgotCi0vKiBGcm9tIHRoZSBTREwgbGlicmFyeSBjb2RlIC0tIG5lZWRlZCBmb3IgcmVnaXN0ZXJpbmcgUXVpY2tEcmF3IG9uIE1hY09TICovCi0jaWYgZGVmaW5lZChfX01BQ09TX18pCi0KLSNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gc28gd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIFF1aWNrRHJhdy5oICovCi1zdHJ1Y3QgUURHbG9iYWxzOwotCi0vKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB5b3VyIG1haW4oKSBmdW5jdGlvbiwgaWYgYW55ICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9Jbml0UXVpY2tEcmF3KHN0cnVjdCBRREdsb2JhbHMgKnRoZV9xZCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaW5jbHVkZSAiY2xvc2VfY29kZS5oIgotI2VuZGlmCi0KLSNlbmRpZiAvKiBOZWVkIHRvIHJlZGVmaW5lIG1haW4oKT8gKi8KLQotI2VuZGlmIC8qIF9TRExfbWFpbl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfbW91c2UuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9tb3VzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM2NGQ4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9tb3VzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qIEluY2x1ZGUgZmlsZSBmb3IgU0RMIG1vdXNlIGV2ZW50IGhhbmRsaW5nICovCi0KLSNpZm5kZWYgX1NETF9tb3VzZV9oCi0jZGVmaW5lIF9TRExfbW91c2VfaAotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotI2luY2x1ZGUgIlNETF92aWRlby5oIgotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IFdNY3Vyc29yIFdNY3Vyc29yOwkvKiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgKi8KLXR5cGVkZWYgc3RydWN0IFNETF9DdXJzb3IgewotCVNETF9SZWN0IGFyZWE7CQkJLyogVGhlIGFyZWEgb2YgdGhlIG1vdXNlIGN1cnNvciAqLwotCVNpbnQxNiBob3RfeCwgaG90X3k7CQkvKiBUaGUgInRpcCIgb2YgdGhlIGN1cnNvciAqLwotCVVpbnQ4ICpkYXRhOwkJCS8qIEIvVyBjdXJzb3IgZGF0YSAqLwotCVVpbnQ4ICptYXNrOwkJCS8qIEIvVyBjdXJzb3IgbWFzayAqLwotCVVpbnQ4ICpzYXZlWzJdOwkJCS8qIFBsYWNlIHRvIHNhdmUgY3Vyc29yIGFyZWEgKi8KLQlXTWN1cnNvciAqd21fY3Vyc29yOwkJLyogV2luZG93LW1hbmFnZXIgY3Vyc29yICovCi19IFNETF9DdXJzb3I7Ci0KLS8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLS8qCi0gKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW91c2UuCi0gKiBUaGUgY3VycmVudCBidXR0b24gc3RhdGUgaXMgcmV0dXJuZWQgYXMgYSBidXR0b24gYml0bWFzaywgd2hpY2ggY2FuCi0gKiBiZSB0ZXN0ZWQgdXNpbmcgdGhlIFNETF9CVVRUT04oWCkgbWFjcm9zLCBhbmQgeCBhbmQgeSBhcmUgc2V0IHRvIHRoZQotICogY3VycmVudCBtb3VzZSBjdXJzb3IgcG9zaXRpb24uICBZb3UgY2FuIHBhc3MgTlVMTCBmb3IgZWl0aGVyIHggb3IgeS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFVpbnQ4IFNETENBTEwgU0RMX0dldE1vdXNlU3RhdGUoaW50ICp4LCBpbnQgKnkpOwotCi0vKgotICogUmV0cmlldmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdXNlLgotICogVGhlIGN1cnJlbnQgYnV0dG9uIHN0YXRlIGlzIHJldHVybmVkIGFzIGEgYnV0dG9uIGJpdG1hc2ssIHdoaWNoIGNhbgotICogYmUgdGVzdGVkIHVzaW5nIHRoZSBTRExfQlVUVE9OKFgpIG1hY3JvcywgYW5kIHggYW5kIHkgYXJlIHNldCB0byB0aGUKLSAqIG1vdXNlIGRlbHRhcyBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIFNETF9HZXRSZWxhdGl2ZU1vdXNlU3RhdGUoKS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFVpbnQ4IFNETENBTEwgU0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZShpbnQgKngsIGludCAqeSk7Ci0KLS8qCi0gKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3IgKGdlbmVyYXRlcyBhIG1vdXNlIG1vdGlvbiBldmVudCkKLSAqLwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfV2FycE1vdXNlKFVpbnQxNiB4LCBVaW50MTYgeSk7Ci0KLS8qCi0gKiBDcmVhdGUgYSBjdXJzb3IgdXNpbmcgdGhlIHNwZWNpZmllZCBkYXRhIGFuZCBtYXNrIChpbiBNU0IgZm9ybWF0KS4KLSAqIFRoZSBjdXJzb3Igd2lkdGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYml0cy4KLSAqCi0gKiBUaGUgY3Vyc29yIGlzIGNyZWF0ZWQgaW4gYmxhY2sgYW5kIHdoaXRlIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nOgotICogZGF0YSAgbWFzayAgICByZXN1bHRpbmcgcGl4ZWwgb24gc2NyZWVuCi0gKiAgMCAgICAgMSAgICAgICBXaGl0ZQotICogIDEgICAgIDEgICAgICAgQmxhY2sKLSAqICAwICAgICAwICAgICAgIFRyYW5zcGFyZW50Ci0gKiAgMSAgICAgMCAgICAgICBJbnZlcnRlZCBjb2xvciBpZiBwb3NzaWJsZSwgYmxhY2sgaWYgbm90LgotICoKLSAqIEN1cnNvcnMgY3JlYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBmcmVlZCB3aXRoIFNETF9GcmVlQ3Vyc29yKCkuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBTRExfQ3Vyc29yICogU0RMQ0FMTCBTRExfQ3JlYXRlQ3Vyc29yCi0JCShVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOwotCi0vKgotICogU2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGN1cnNvciB0byB0aGUgc3BlY2lmaWVkIG9uZS4KLSAqIElmIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IHZpc2libGUsIHRoZSBjaGFuZ2Ugd2lsbCBiZSBpbW1lZGlhdGVseSAKLSAqIHJlcHJlc2VudGVkIG9uIHRoZSBkaXNwbGF5LgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9TZXRDdXJzb3IoU0RMX0N1cnNvciAqY3Vyc29yKTsKLQotLyoKLSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY3Vyc29yLgotICovCi1leHRlcm4gREVDTFNQRUMgU0RMX0N1cnNvciAqIFNETENBTEwgU0RMX0dldEN1cnNvcih2b2lkKTsKLQotLyoKLSAqIERlYWxsb2NhdGVzIGEgY3Vyc29yIGNyZWF0ZWQgd2l0aCBTRExfQ3JlYXRlQ3Vyc29yKCkuCi0gKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0ZyZWVDdXJzb3IoU0RMX0N1cnNvciAqY3Vyc29yKTsKLQotLyoKLSAqIFRvZ2dsZSB3aGV0aGVyIG9yIG5vdCB0aGUgY3Vyc29yIGlzIHNob3duIG9uIHRoZSBzY3JlZW4uCi0gKiBUaGUgY3Vyc29yIHN0YXJ0IG9mZiBkaXNwbGF5ZWQsIGJ1dCBjYW4gYmUgdHVybmVkIG9mZi4KLSAqIFNETF9TaG93Q3Vyc29yKCkgcmV0dXJucyAxIGlmIHRoZSBjdXJzb3Igd2FzIGJlaW5nIGRpc3BsYXllZAotICogYmVmb3JlIHRoZSBjYWxsLCBvciAwIGlmIGl0IHdhcyBub3QuICBZb3UgY2FuIHF1ZXJ5IHRoZSBjdXJyZW50Ci0gKiBzdGF0ZSBieSBwYXNzaW5nIGEgJ3RvZ2dsZScgdmFsdWUgb2YgLTEuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfU2hvd0N1cnNvcihpbnQgdG9nZ2xlKTsKLQotLyogVXNlZCBhcyBhIG1hc2sgd2hlbiB0ZXN0aW5nIGJ1dHRvbnMgaW4gYnV0dG9uc3RhdGUKLSAgIEJ1dHRvbiAxOglMZWZ0IG1vdXNlIGJ1dHRvbgotICAgQnV0dG9uIDI6CU1pZGRsZSBtb3VzZSBidXR0b24KLSAgIEJ1dHRvbiAzOglSaWdodCBtb3VzZSBidXR0b24KLSAgIEJ1dHRvbiA0OglNb3VzZSB3aGVlbCB1cAkgKG1heSBhbHNvIGJlIGEgcmVhbCBidXR0b24pCi0gICBCdXR0b24gNToJTW91c2Ugd2hlZWwgZG93biAobWF5IGFsc28gYmUgYSByZWFsIGJ1dHRvbikKLSAqLwotI2RlZmluZSBTRExfQlVUVE9OKFgpCQkoMSA8PCAoKFgpLTEpKQotI2RlZmluZSBTRExfQlVUVE9OX0xFRlQJCTEKLSNkZWZpbmUgU0RMX0JVVFRPTl9NSURETEUJMgotI2RlZmluZSBTRExfQlVUVE9OX1JJR0hUCTMKLSNkZWZpbmUgU0RMX0JVVFRPTl9XSEVFTFVQCTQKLSNkZWZpbmUgU0RMX0JVVFRPTl9XSEVFTERPV04JNQotI2RlZmluZSBTRExfQlVUVE9OX0xNQVNLCVNETF9CVVRUT04oU0RMX0JVVFRPTl9MRUZUKQotI2RlZmluZSBTRExfQlVUVE9OX01NQVNLCVNETF9CVVRUT04oU0RMX0JVVFRPTl9NSURETEUpCi0jZGVmaW5lIFNETF9CVVRUT05fUk1BU0sJU0RMX0JVVFRPTihTRExfQlVUVE9OX1JJR0hUKQotCi0KLS8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCi0KLSNlbmRpZiAvKiBfU0RMX21vdXNlX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9tdXRleC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX211dGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMTY1MjguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX211dGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotI2lmbmRlZiBfU0RMX211dGV4X2gKLSNkZWZpbmUgX1NETF9tdXRleF9oCi0KLS8qIEZ1bmN0aW9ucyB0byBwcm92aWRlIHRocmVhZCBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcwotCi0JVGhlc2UgYXJlIGluZGVwZW5kZW50IG9mIHRoZSBvdGhlciBTREwgcm91dGluZXMuCi0qLwotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFN5bmNocm9uaXphdGlvbiBmdW5jdGlvbnMgd2hpY2ggY2FuIHRpbWUgb3V0IHJldHVybiB0aGlzIHZhbHVlCi0gICBpZiB0aGV5IHRpbWUgb3V0LgotKi8KLSNkZWZpbmUgU0RMX01VVEVYX1RJTUVET1VUCTEKLQotLyogVGhpcyBpcyB0aGUgdGltZW91dCB2YWx1ZSB3aGljaCBjb3JyZXNwb25kcyB0byBuZXZlciB0aW1lIG91dCAqLwotI2RlZmluZSBTRExfTVVURVhfTUFYV0FJVAkofihVaW50MzIpMCkKLQotCi0vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCi0vKiBNdXRleCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCi0KLS8qIFRoZSBTREwgbXV0ZXggc3RydWN0dXJlLCBkZWZpbmVkIGluIFNETF9tdXRleC5jICovCi1zdHJ1Y3QgU0RMX211dGV4OwotdHlwZWRlZiBzdHJ1Y3QgU0RMX211dGV4IFNETF9tdXRleDsKLQotLyogQ3JlYXRlIGEgbXV0ZXgsIGluaXRpYWxpemVkIHVubG9ja2VkICovCi1leHRlcm4gREVDTFNQRUMgU0RMX211dGV4ICogU0RMQ0FMTCBTRExfQ3JlYXRlTXV0ZXgodm9pZCk7Ci0KLS8qIExvY2sgdGhlIG11dGV4ICAoUmV0dXJucyAwLCBvciAtMSBvbiBlcnJvcikgKi8KLSNkZWZpbmUgU0RMX0xvY2tNdXRleChtKQlTRExfbXV0ZXhQKG0pCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX211dGV4UChTRExfbXV0ZXggKm11dGV4KTsKLQotLyogVW5sb2NrIHRoZSBtdXRleCAgKFJldHVybnMgMCwgb3IgLTEgb24gZXJyb3IpCi0gICBJdCBpcyBhbiBlcnJvciB0byB1bmxvY2sgYSBtdXRleCB0aGF0IGhhcyBub3QgYmVlbiBsb2NrZWQgYnkKLSAgIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIGRvaW5nIHNvIHJlc3VsdHMgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgotICovCi0jZGVmaW5lIFNETF9VbmxvY2tNdXRleChtKQlTRExfbXV0ZXhWKG0pCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX211dGV4VihTRExfbXV0ZXggKm11dGV4KTsKLQotLyogRGVzdHJveSBhIG11dGV4ICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9EZXN0cm95TXV0ZXgoU0RMX211dGV4ICptdXRleCk7Ci0KLQotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotLyogU2VtYXBob3JlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotCi0vKiBUaGUgU0RMIHNlbWFwaG9yZSBzdHJ1Y3R1cmUsIGRlZmluZWQgaW4gU0RMX3NlbS5jICovCi1zdHJ1Y3QgU0RMX3NlbWFwaG9yZTsKLXR5cGVkZWYgc3RydWN0IFNETF9zZW1hcGhvcmUgU0RMX3NlbTsKLQotLyogQ3JlYXRlIGEgc2VtYXBob3JlLCBpbml0aWFsaXplZCB3aXRoIHZhbHVlLCByZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4gKi8KLWV4dGVybiBERUNMU1BFQyBTRExfc2VtICogU0RMQ0FMTCBTRExfQ3JlYXRlU2VtYXBob3JlKFVpbnQzMiBpbml0aWFsX3ZhbHVlKTsKLQotLyogRGVzdHJveSBhIHNlbWFwaG9yZSAqLwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHN1c3BlbmRzIHRoZSBjYWxsaW5nIHRocmVhZCB1bnRpbCB0aGUgc2VtYXBob3JlIHBvaW50ZWQgCi0gKiB0byBieSBzZW0gaGFzIGEgcG9zaXRpdmUgY291bnQuIEl0IHRoZW4gYXRvbWljYWxseSBkZWNyZWFzZXMgdGhlIHNlbWFwaG9yZQotICogY291bnQuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pOwotCi0vKiBOb24tYmxvY2tpbmcgdmFyaWFudCBvZiBTRExfU2VtV2FpdCgpLCByZXR1cm5zIDAgaWYgdGhlIHdhaXQgc3VjY2VlZHMsCi0gICBTRExfTVVURVhfVElNRURPVVQgaWYgdGhlIHdhaXQgd291bGQgYmxvY2ssIGFuZCAtMSBvbiBlcnJvci4KLSovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NlbVRyeVdhaXQoU0RMX3NlbSAqc2VtKTsKLQotLyogVmFyaWFudCBvZiBTRExfU2VtV2FpdCgpIHdpdGggYSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgcmV0dXJucyAwIGlmCi0gICB0aGUgd2FpdCBzdWNjZWVkcywgU0RMX01VVEVYX1RJTUVET1VUIGlmIHRoZSB3YWl0IGRvZXMgbm90IHN1Y2NlZWQgaW4KLSAgIHRoZSBhbGxvdHRlZCB0aW1lLCBhbmQgLTEgb24gZXJyb3IuCi0gICBPbiBzb21lIHBsYXRmb3JtcyB0aGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGJ5IGxvb3Bpbmcgd2l0aCBhIGRlbGF5Ci0gICBvZiAxIG1zLCBhbmQgc28gc2hvdWxkIGJlIGF2b2lkZWQgaWYgcG9zc2libGUuCi0qLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZW1XYWl0VGltZW91dChTRExfc2VtICpzZW0sIFVpbnQzMiBtcyk7Ci0KLS8qIEF0b21pY2FsbHkgaW5jcmVhc2VzIHRoZSBzZW1hcGhvcmUncyBjb3VudCAobm90IGJsb2NraW5nKSwgcmV0dXJucyAwLAotICAgb3IgLTEgb24gZXJyb3IuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfU2VtUG9zdChTRExfc2VtICpzZW0pOwotCi0vKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IG9mIHRoZSBzZW1hcGhvcmUgKi8KLWV4dGVybiBERUNMU1BFQyBVaW50MzIgU0RMQ0FMTCBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKTsKLQotCi0vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCi0vKiBDb25kaXRpb24gdmFyaWFibGUgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCi0KLS8qIFRoZSBTREwgY29uZGl0aW9uIHZhcmlhYmxlIHN0cnVjdHVyZSwgZGVmaW5lZCBpbiBTRExfY29uZC5jICovCi1zdHJ1Y3QgU0RMX2NvbmQ7Ci10eXBlZGVmIHN0cnVjdCBTRExfY29uZCBTRExfY29uZDsKLQotLyogQ3JlYXRlIGEgY29uZGl0aW9uIHZhcmlhYmxlICovCi1leHRlcm4gREVDTFNQRUMgU0RMX2NvbmQgKiBTRExDQUxMIFNETF9DcmVhdGVDb25kKHZvaWQpOwotCi0vKiBEZXN0cm95IGEgY29uZGl0aW9uIHZhcmlhYmxlICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9EZXN0cm95Q29uZChTRExfY29uZCAqY29uZCk7Ci0KLS8qIFJlc3RhcnQgb25lIG9mIHRoZSB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwKLSAgIHJldHVybnMgMCBvciAtMSBvbiBlcnJvci4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Db25kU2lnbmFsKFNETF9jb25kICpjb25kKTsKLQotLyogUmVzdGFydCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUsCi0gICByZXR1cm5zIDAgb3IgLTEgb24gZXJyb3IuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfQ29uZEJyb2FkY2FzdChTRExfY29uZCAqY29uZCk7Ci0KLS8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgdW5sb2NraW5nIHRoZSBwcm92aWRlZCBtdXRleC4KLSAgIFRoZSBtdXRleCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbiEKLSAgIFRoZSBtdXRleCBpcyByZS1sb2NrZWQgb25jZSB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGlzIHNpZ25hbGVkLgotICAgUmV0dXJucyAwIHdoZW4gaXQgaXMgc2lnbmFsZWQsIG9yIC0xIG9uIGVycm9yLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NvbmRXYWl0KFNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dCk7Ci0KLS8qIFdhaXRzIGZvciBhdCBtb3N0ICdtcycgbWlsbGlzZWNvbmRzLCBhbmQgcmV0dXJucyAwIGlmIHRoZSBjb25kaXRpb24KLSAgIHZhcmlhYmxlIGlzIHNpZ25hbGVkLCBTRExfTVVURVhfVElNRURPVVQgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QKLSAgIHNpZ25hbGVkIGluIHRoZSBhbGxvdHRlZCB0aW1lLCBhbmQgLTEgb24gZXJyb3IuCi0gICBPbiBzb21lIHBsYXRmb3JtcyB0aGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGJ5IGxvb3Bpbmcgd2l0aCBhIGRlbGF5Ci0gICBvZiAxIG1zLCBhbmQgc28gc2hvdWxkIGJlIGF2b2lkZWQgaWYgcG9zc2libGUuCi0qLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Db25kV2FpdFRpbWVvdXQoU0RMX2NvbmQgKmNvbmQsIFNETF9tdXRleCAqbXV0ZXgsIFVpbnQzMiBtcyk7Ci0KLS8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCi0KLSNlbmRpZiAvKiBfU0RMX211dGV4X2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9vcGVuZ2wuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9vcGVuZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjMGEzMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfb3BlbmdsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NTUxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qIFRoaXMgaXMgYSBzaW1wbGUgZmlsZSB0byBlbmNhcHN1bGF0ZSB0aGUgT3BlbkdMIEFQSSBoZWFkZXJzICovCi0KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBfX1dJTjMyX18KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2lmbmRlZiBOT01JTk1BWAotI2RlZmluZSBOT01JTk1BWAkvKiBEb24ndCBkZWZpbmVkIG1pbigpIGFuZCBtYXgoKSAqLwotI2VuZGlmCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0jaWZuZGVmIE5PX1NETF9HTEVYVAotI2RlZmluZSBfX2dsZXh0X2hfICAvKiBEb24ndCBsZXQgZ2wuaCBpbmNsdWRlIGdsZXh0LmggKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoX19NQUNPU1hfXykKLSNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4JLyogSGVhZGVyIEZpbGUgRm9yIFRoZSBPcGVuR0wgTGlicmFyeSAqLwotI2luY2x1ZGUgPE9wZW5HTC9nbHUuaD4JLyogSGVhZGVyIEZpbGUgRm9yIFRoZSBHTFUgTGlicmFyeSAqLwotI2VsaWYgZGVmaW5lZChfX01BQ09TX18pCi0jaW5jbHVkZSA8Z2wuaD4JCS8qIEhlYWRlciBGaWxlIEZvciBUaGUgT3BlbkdMIExpYnJhcnkgKi8KLSNpbmNsdWRlIDxnbHUuaD4JLyogSGVhZGVyIEZpbGUgRm9yIFRoZSBHTFUgTGlicmFyeSAqLwotI2Vsc2UKLSNpbmNsdWRlIDxHTC9nbC5oPgkvKiBIZWFkZXIgRmlsZSBGb3IgVGhlIE9wZW5HTCBMaWJyYXJ5ICovCi0jaW5jbHVkZSA8R0wvZ2x1Lmg+CS8qIEhlYWRlciBGaWxlIEZvciBUaGUgR0xVIExpYnJhcnkgKi8KLSNlbmRpZgotI2lmbmRlZiBOT19TRExfR0xFWFQKLSN1bmRlZiBfX2dsZXh0X2hfCi0jZW5kaWYKLQotLyogVGhpcyBmaWxlIHRha2VuIGZyb20gIkdMZXh0LmgiIGZyb20gdGhlIEplZmYgTW9sb2ZlZSBPcGVuR0wgdHV0b3JpYWxzLgotICAgSXQgaXMgaW5jbHVkZWQgaGVyZSBiZWNhdXNlIGdsZXh0LmggaXMgbm90IGF2YWlsYWJsZSBvbiBzb21lIHN5c3RlbXMuCi0gICBJZiB5b3UgZG9uJ3Qgd2FudCB0aGlzIHZlcnNpb24gaW5jbHVkZWQsIHNpbXBseSBkZWZpbmUgIk5PX1NETF9HTEVYVCIKLSAqLwotI2lmbmRlZiBOT19TRExfR0xFWFQKLSNpZiAhZGVmaW5lZChfX2dsZXh0X2hfKSAmJiAhZGVmaW5lZChHTF9HTEVYVF9MRUdBQ1kpCi0jZGVmaW5lIF9fZ2xleHRfaF8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotKiogTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlCi0qKiBtYWRlIHN1YmplY3QgdG8gYW4gYWx0ZXJuYXRpdmUgbGljZW5zZSBhcyBwZXJtaXR0ZWQgaW4gdGhlIFNHSSBGcmVlCi0qKiBTb2Z0d2FyZSBMaWNlbnNlIEIsIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKLSoqIGZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlCi0qKiB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5Ci0qKiBvZiB0aGUgTGljZW5zZSBhdCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCBhdHRuOiBMZWdhbCBTZXJ2aWNlcywgMTYwMAotKiogQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OgotKiogCi0qKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIKLSoqIAotKiogTm90ZSB0aGF0LCBhcyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSwgdGhlIFNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qKiAiQVMgSVMiIGJhc2lzLCB3aXRoIEFMTCBFWFBSRVNTIEFORCBJTVBMSUVEIFdBUlJBTlRJRVMgQU5EIENPTkRJVElPTlMKLSoqIERJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORAotKiogQ09ORElUSU9OUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNBVElTRkFDVE9SWSBRVUFMSVRZLCBGSVRORVNTIEZPUiBBCi0qKiBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORCBOT04tSU5GUklOR0VNRU5ULgotKiogCi0qKiBPcmlnaW5hbCBDb2RlLiBUaGUgT3JpZ2luYWwgQ29kZSBpczogT3BlbkdMIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiwKLSoqIFZlcnNpb24gMS4yLjEsIHJlbGVhc2VkIEphbnVhcnkgMjYsIDIwMDAsIGRldmVsb3BlZCBieSBTaWxpY29uIEdyYXBoaWNzLAotKiogSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0qKiBDb3B5cmlnaHQgaW4gYW55IHBvcnRpb25zIGNyZWF0ZWQgYnkgdGhpcmQgcGFydGllcyBpcyBhcyBpbmRpY2F0ZWQKLSoqIGVsc2V3aGVyZSBoZXJlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qKiAKLSoqIEFkZGl0aW9uYWwgTm90aWNlIFByb3Zpc2lvbnM6IFRoaXMgc29mdHdhcmUgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlCi0qKiBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTYW1wbGUgSW1wbGVtZW50YXRpb24gcHVibGlzaGVkIGJ5IFNHSSwgYnV0IGhhcwotKiogbm90IGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZCBhcyBiZWluZyBjb21wbGlhbnQgd2l0aCB0aGUgT3BlbkdMKFIpCi0qKiB2ZXJzaW9uIDEuMi4xIFNwZWNpZmljYXRpb24uCi0qLwotCi0jaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKEFQSUVOVFJZKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChfX1NDSVRFQ0hfU05BUF9fKQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBBUElFTlRSWQotI2RlZmluZSBBUElFTlRSWQotI2VuZGlmCi0jaWZuZGVmIEFQSUVOVFJZUAotI2RlZmluZSBBUElFTlRSWVAgQVBJRU5UUlkgKgotI2VuZGlmCi0jaWZuZGVmIEdMQVBJCi0jZGVmaW5lIEdMQVBJIGV4dGVybgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBIZWFkZXIgZmlsZSB2ZXJzaW9uIG51bWJlciwgcmVxdWlyZWQgYnkgT3BlbkdMIEFCSSBmb3IgTGludXggKi8KLS8qIGdsZXh0LmggbGFzdCB1cGRhdGVkIDIwMDUvMDYvMjAgKi8KLS8qIEN1cnJlbnQgdmVyc2lvbiBhdCBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvb2dsLXNhbXBsZS9yZWdpc3RyeS8gKi8KLSNkZWZpbmUgR0xfR0xFWFRfVkVSU0lPTiAyOQotCi0jaWZuZGVmIEdMX1ZFUlNJT05fMV8yCi0jZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEVfM18zXzIgICAgICAgICAgICAweDgwMzIKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMwotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0Ci0jZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84ICAgICAgICAgICAweDgwMzUKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzEwXzEwXzEwXzIgICAgICAgIDB4ODAzNgotI2RlZmluZSBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgMHg4MDNBCi0jZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18zRCAgICAgICAgICAgICAweDgwNkEKLSNkZWZpbmUgR0xfUEFDS19TS0lQX0lNQUdFUyAgICAgICAgICAgICAgIDB4ODA2QgotI2RlZmluZSBHTF9QQUNLX0lNQUdFX0hFSUdIVCAgICAgICAgICAgICAgMHg4MDZDCi0jZGVmaW5lIEdMX1VOUEFDS19TS0lQX0lNQUdFUyAgICAgICAgICAgICAweDgwNkQKLSNkZWZpbmUgR0xfVU5QQUNLX0lNQUdFX0hFSUdIVCAgICAgICAgICAgIDB4ODA2RQotI2RlZmluZSBHTF9URVhUVVJFXzNEICAgICAgICAgICAgICAgICAgICAgMHg4MDZGCi0jZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfM0QgICAgICAgICAgICAgICAweDgwNzAKLSNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSCAgICAgICAgICAgICAgICAgIDB4ODA3MQotI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUiAgICAgICAgICAgICAgICAgMHg4MDcyCi0jZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkUgICAgICAgICAgICAweDgwNzMKLSNkZWZpbmUgR0xfVU5TSUdORURfQllURV8yXzNfM19SRVYgICAgICAgIDB4ODM2MgotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81X1JFViAgICAgICAweDgzNjQKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVYgICAgIDB4ODM2NQotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFViAgICAgMHg4MzY2Ci0jZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViAgICAgICAweDgzNjcKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWICAgIDB4ODM2OAotI2RlZmluZSBHTF9CR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUwCi0jZGVmaW5lIEdMX0JHUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKLSNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgIDB4ODBFOAotI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgMHg4MEU5Ci0jZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKLSNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fTE9EICAgICAgICAgICAgICAgIDB4ODEzQQotI2RlZmluZSBHTF9URVhUVVJFX01BWF9MT0QgICAgICAgICAgICAgICAgMHg4MTNCCi0jZGVmaW5lIEdMX1RFWFRVUkVfQkFTRV9MRVZFTCAgICAgICAgICAgICAweDgxM0MKLSNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTEVWRUwgICAgICAgICAgICAgIDB4ODEzRAotI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9DT0xPUl9DT05UUk9MICAgICAgMHg4MUY4Ci0jZGVmaW5lIEdMX1NJTkdMRV9DT0xPUiAgICAgICAgICAgICAgICAgICAweDgxRjkKLSNkZWZpbmUgR0xfU0VQQVJBVEVfU1BFQ1VMQVJfQ09MT1IgICAgICAgIDB4ODFGQQotI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCi0jZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZICAweDBCMTMKLSNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgIDB4MEIyMgotI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9HUkFOVUxBUklUWSAgMHgwQjIzCi0jZGVmaW5lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAweDg0NkQKLSNkZWZpbmUgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgIDB4ODQ2RQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX2ltYWdpbmcKLSNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1IgICAgICAgICAgICAgICAgIDB4ODAwMQotI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgICAgICAgMHg4MDAyCi0jZGVmaW5lIEdMX0NPTlNUQU5UX0FMUEhBICAgICAgICAgICAgICAgICAweDgwMDMKLSNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBICAgICAgIDB4ODAwNAotI2RlZmluZSBHTF9CTEVORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgMHg4MDA1Ci0jZGVmaW5lIEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAweDgwMDYKLSNkZWZpbmUgR0xfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNwotI2RlZmluZSBHTF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA4Ci0jZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OICAgICAgICAgICAgICAgICAweDgwMDkKLSNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVCAgICAgICAgICAgICAgICAgIDB4ODAwQQotI2RlZmluZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1QgICAgICAgICAgMHg4MDBCCi0jZGVmaW5lIEdMX0NPTlZPTFVUSU9OXzFEICAgICAgICAgICAgICAgICAweDgwMTAKLSNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMkQgICAgICAgICAgICAgICAgIDB4ODAxMQotI2RlZmluZSBHTF9TRVBBUkFCTEVfMkQgICAgICAgICAgICAgICAgICAgMHg4MDEyCi0jZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9NT0RFICAgICAgICAweDgwMTMKLSNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFICAgICAgIDB4ODAxNAotI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfQklBUyAgICAgICAgMHg4MDE1Ci0jZGVmaW5lIEdMX1JFRFVDRSAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMTYKLSNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRk9STUFUICAgICAgICAgICAgIDB4ODAxNwotI2RlZmluZSBHTF9DT05WT0xVVElPTl9XSURUSCAgICAgICAgICAgICAgMHg4MDE4Ci0jZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0hFSUdIVCAgICAgICAgICAgICAweDgwMTkKLSNkZWZpbmUgR0xfTUFYX0NPTlZPTFVUSU9OX1dJRFRIICAgICAgICAgIDB4ODAxQQotI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fSEVJR0hUICAgICAgICAgMHg4MDFCCi0jZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFICAgICAweDgwMUMKLSNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9TQ0FMRSAgIDB4ODAxRAotI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0JMVUVfU0NBTEUgICAgMHg4MDFFCi0jZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEUgICAweDgwMUYKLSNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfQklBUyAgICAgIDB4ODAyMAotI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX0JJQVMgICAgMHg4MDIxCi0jZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9CSUFTICAgICAweDgwMjIKLSNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9CSUFTICAgIDB4ODAyMwotI2RlZmluZSBHTF9ISVNUT0dSQU0gICAgICAgICAgICAgICAgICAgICAgMHg4MDI0Ci0jZGVmaW5lIEdMX1BST1hZX0hJU1RPR1JBTSAgICAgICAgICAgICAgICAweDgwMjUKLSNkZWZpbmUgR0xfSElTVE9HUkFNX1dJRFRIICAgICAgICAgICAgICAgIDB4ODAyNgotI2RlZmluZSBHTF9ISVNUT0dSQU1fRk9STUFUICAgICAgICAgICAgICAgMHg4MDI3Ci0jZGVmaW5lIEdMX0hJU1RPR1JBTV9SRURfU0laRSAgICAgICAgICAgICAweDgwMjgKLSNkZWZpbmUgR0xfSElTVE9HUkFNX0dSRUVOX1NJWkUgICAgICAgICAgIDB4ODAyOQotI2RlZmluZSBHTF9ISVNUT0dSQU1fQkxVRV9TSVpFICAgICAgICAgICAgMHg4MDJBCi0jZGVmaW5lIEdMX0hJU1RPR1JBTV9BTFBIQV9TSVpFICAgICAgICAgICAweDgwMkIKLSNkZWZpbmUgR0xfSElTVE9HUkFNX0xVTUlOQU5DRV9TSVpFICAgICAgIDB4ODAyQwotI2RlZmluZSBHTF9ISVNUT0dSQU1fU0lOSyAgICAgICAgICAgICAgICAgMHg4MDJECi0jZGVmaW5lIEdMX01JTk1BWCAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMkUKLSNkZWZpbmUgR0xfTUlOTUFYX0ZPUk1BVCAgICAgICAgICAgICAgICAgIDB4ODAyRgotI2RlZmluZSBHTF9NSU5NQVhfU0lOSyAgICAgICAgICAgICAgICAgICAgMHg4MDMwCi0jZGVmaW5lIEdMX1RBQkxFX1RPT19MQVJHRSAgICAgICAgICAgICAgICAweDgwMzEKLSNkZWZpbmUgR0xfQ09MT1JfTUFUUklYICAgICAgICAgICAgICAgICAgIDB4ODBCMQotI2RlZmluZSBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggICAgICAgMHg4MEIyCi0jZGVmaW5lIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggICAweDgwQjMKLSNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX1NDQUxFICAgIDB4ODBCNAotI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRSAgMHg4MEI1Ci0jZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEUgICAweDgwQjYKLSNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfU0NBTEUgIDB4ODBCNwotI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfQklBUyAgICAgMHg4MEI4Ci0jZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX0JJQVMgICAweDgwQjkKLSNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9CSUFTICAgIDB4ODBCQQotI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9CSUFTICAgMHg4MEJCCi0jZGVmaW5lIEdMX0NPTE9SX1RBQkxFICAgICAgICAgICAgICAgICAgICAweDgwRDAKLSNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRSAgIDB4ODBEMQotI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRSAgMHg4MEQyCi0jZGVmaW5lIEdMX1BST1hZX0NPTE9SX1RBQkxFICAgICAgICAgICAgICAweDgwRDMKLSNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRSAweDgwRDQKLSNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEUgMHg4MEQ1Ci0jZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1NDQUxFICAgICAgICAgICAgICAweDgwRDYKLSNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQklBUyAgICAgICAgICAgICAgIDB4ODBENwotI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9GT1JNQVQgICAgICAgICAgICAgMHg4MEQ4Ci0jZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1dJRFRIICAgICAgICAgICAgICAweDgwRDkKLSNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkUgICAgICAgICAgIDB4ODBEQQotI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9HUkVFTl9TSVpFICAgICAgICAgMHg4MERCCi0jZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRSAgICAgICAgICAweDgwREMKLSNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRSAgICAgICAgIDB4ODBERAotI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRSAgICAgMHg4MERFCi0jZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFICAgICAweDgwREYKLSNkZWZpbmUgR0xfQ09OU1RBTlRfQk9SREVSICAgICAgICAgICAgICAgIDB4ODE1MQotI2RlZmluZSBHTF9SRVBMSUNBVEVfQk9SREVSICAgICAgICAgICAgICAgMHg4MTUzCi0jZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUiAgICAgICAweDgxNTQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1ZFUlNJT05fMV8zCi0jZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKLSNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQotI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCi0jZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKLSNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAotI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1Ci0jZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKLSNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNwotI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4Ci0jZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKLSNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQotI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCi0jZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKLSNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAotI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCi0jZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKLSNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAotI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCi0jZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKLSNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMwotI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0Ci0jZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKLSNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgotI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3Ci0jZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKLSNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQotI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCi0jZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKLSNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQwotI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECi0jZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKLSNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgotI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgMHg4NEUwCi0jZGVmaW5lIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAweDg0RTEKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgIDB4ODRFMgotI2RlZmluZSBHTF9UUkFOU1BPU0VfTU9ERUxWSUVXX01BVFJJWCAgICAgMHg4NEUzCi0jZGVmaW5lIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWCAgICAweDg0RTQKLSNkZWZpbmUgR0xfVFJBTlNQT1NFX1RFWFRVUkVfTUFUUklYICAgICAgIDB4ODRFNQotI2RlZmluZSBHTF9UUkFOU1BPU0VfQ09MT1JfTUFUUklYICAgICAgICAgMHg4NEU2Ci0jZGVmaW5lIEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAweDgwOUQKLSNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQotI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgMHg4MDlGCi0jZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKLSNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDB4ODBBOAotI2RlZmluZSBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEE5Ci0jZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAweDgwQUEKLSNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgIDB4ODBBQgotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVQgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBHTF9OT1JNQUxfTUFQICAgICAgICAgICAgICAgICAgICAgMHg4NTExCi0jZGVmaW5lIEdMX1JFRkxFQ1RJT05fTUFQICAgICAgICAgICAgICAgICAweDg1MTIKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUCAgICAgICAgICAgICAgIDB4ODUxMwotI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgICAgICAgMHg4NTE0Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAgICAweDg1MTUKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YICAgIDB4ODUxNgotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgICAgMHg4NTE3Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAgICAweDg1MTgKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aICAgIDB4ODUxOQotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgMHg4NTFBCi0jZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAweDg1MUIKLSNkZWZpbmUgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAgICAgIDB4ODUxQwotI2RlZmluZSBHTF9DT01QUkVTU0VEX0FMUEhBICAgICAgICAgICAgICAgMHg4NEU5Ci0jZGVmaW5lIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFICAgICAgICAgICAweDg0RUEKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQUxQSEEgICAgIDB4ODRFQgotI2RlZmluZSBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWSAgICAgICAgICAgMHg4NEVDCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCICAgICAgICAgICAgICAgICAweDg0RUQKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBICAgICAgICAgICAgICAgIDB4ODRFRQotI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlQgICAgICAgMHg4NEVGCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NFRF9JTUFHRV9TSVpFICAweDg2QTAKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEICAgICAgICAgICAgIDB4ODZBMQotI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKLSNkZWZpbmUgR0xfQ0xBTVBfVE9fQk9SREVSICAgICAgICAgICAgICAgIDB4ODEyRAotI2RlZmluZSBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTcwCi0jZGVmaW5lIEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAweDg1NzEKLSNkZWZpbmUgR0xfQ09NQklORV9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU3MgotI2RlZmluZSBHTF9TT1VSQ0UwX1JHQiAgICAgICAgICAgICAgICAgICAgMHg4NTgwCi0jZGVmaW5lIEdMX1NPVVJDRTFfUkdCICAgICAgICAgICAgICAgICAgICAweDg1ODEKLSNkZWZpbmUgR0xfU09VUkNFMl9SR0IgICAgICAgICAgICAgICAgICAgIDB4ODU4MgotI2RlZmluZSBHTF9TT1VSQ0UwX0FMUEhBICAgICAgICAgICAgICAgICAgMHg4NTg4Ci0jZGVmaW5lIEdMX1NPVVJDRTFfQUxQSEEgICAgICAgICAgICAgICAgICAweDg1ODkKLSNkZWZpbmUgR0xfU09VUkNFMl9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU4QQotI2RlZmluZSBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkwCi0jZGVmaW5lIEdMX09QRVJBTkQxX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTEKLSNkZWZpbmUgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MgotI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTk4Ci0jZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTkKLSNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5QQotI2RlZmluZSBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMHg4NTczCi0jZGVmaW5lIEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAweDg1NzQKLSNkZWZpbmUgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgIDB4ODU3NQotI2RlZmluZSBHTF9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEU3Ci0jZGVmaW5lIEdMX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgICAgICAweDg1NzYKLSNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUiAgICAgICAgICAgICAgICAgIDB4ODU3NwotI2RlZmluZSBHTF9QUkVWSU9VUyAgICAgICAgICAgICAgICAgICAgICAgMHg4NTc4Ci0jZGVmaW5lIEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg2QUUKLSNkZWZpbmUgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfVkVSU0lPTl8xXzQKLSNkZWZpbmUgR0xfQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgIDB4ODBDOAotI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgMHg4MEM5Ci0jZGVmaW5lIEdMX0JMRU5EX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAweDgwQ0EKLSNkZWZpbmUgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgIDB4ODBDQgotI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgMHg4MTI2Ci0jZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAweDgxMjcKLSNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAgICAgIDB4ODEyOAotI2RlZmluZSBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgMHg4MTI5Ci0jZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAweDgxOTEKLSNkZWZpbmUgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgIDB4ODE5MgotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNiAgICAgICAgICAgICAgMHg4MUE1Ci0jZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDI0ICAgICAgICAgICAgICAweDgxQTYKLSNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzIgICAgICAgICAgICAgIDB4ODFBNwotI2RlZmluZSBHTF9NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgMHg4MzcwCi0jZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRSAgICAgICAgICAweDg0NTAKLSNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEUgICAgICAgICAgICAgICAgIDB4ODQ1MQotI2RlZmluZSBHTF9GUkFHTUVOVF9ERVBUSCAgICAgICAgICAgICAgICAgMHg4NDUyCi0jZGVmaW5lIEdMX0NVUlJFTlRfRk9HX0NPT1JESU5BVEUgICAgICAgICAweDg0NTMKLSNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfVFlQRSAgICAgIDB4ODQ1NAotI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9TVFJJREUgICAgMHg4NDU1Ci0jZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1BPSU5URVIgICAweDg0NTYKLSNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVkgICAgICAgICAgIDB4ODQ1NwotI2RlZmluZSBHTF9DT0xPUl9TVU0gICAgICAgICAgICAgICAgICAgICAgMHg4NDU4Ci0jZGVmaW5lIEdMX0NVUlJFTlRfU0VDT05EQVJZX0NPTE9SICAgICAgICAweDg0NTkKLSNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1NJWkUgICAgIDB4ODQ1QQotI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfVFlQRSAgICAgMHg4NDVCCi0jZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9TVFJJREUgICAweDg0NUMKLSNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1BPSU5URVIgIDB4ODQ1RAotI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVkgICAgICAgICAgMHg4NDVFCi0jZGVmaW5lIEdMX01BWF9URVhUVVJFX0xPRF9CSUFTICAgICAgICAgICAweDg0RkQKLSNkZWZpbmUgR0xfVEVYVFVSRV9GSUxURVJfQ09OVFJPTCAgICAgICAgIDB4ODUwMAotI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTICAgICAgICAgICAgICAgMHg4NTAxCi0jZGVmaW5lIEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAweDg1MDcKLSNkZWZpbmUgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDB4ODUwOAotI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1NJWkUgICAgICAgICAgICAgMHg4ODRBCi0jZGVmaW5lIEdMX0RFUFRIX1RFWFRVUkVfTU9ERSAgICAgICAgICAgICAweDg4NEIKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX01PREUgICAgICAgICAgIDB4ODg0QwotI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQyAgICAgICAgICAgMHg4ODRECi0jZGVmaW5lIEdMX0NPTVBBUkVfUl9UT19URVhUVVJFICAgICAgICAgICAweDg4NEUKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1ZFUlNJT05fMV81Ci0jZGVmaW5lIEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAweDg3NjQKLSNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgIDB4ODc2NQotI2RlZmluZSBHTF9RVUVSWV9DT1VOVEVSX0JJVFMgICAgICAgICAgICAgMHg4ODY0Ci0jZGVmaW5lIEdMX0NVUlJFTlRfUVVFUlkgICAgICAgICAgICAgICAgICAweDg4NjUKLSNkZWZpbmUgR0xfUVVFUllfUkVTVUxUICAgICAgICAgICAgICAgICAgIDB4ODg2NgotI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICAgICAgICAgMHg4ODY3Ci0jZGVmaW5lIEdMX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAweDg4OTIKLSNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgIDB4ODg5MwotI2RlZmluZSBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgMHg4ODk0Ci0jZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAweDg4OTUKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgIDB4ODg5NgotI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgMHg4ODk3Ci0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAweDg4OTgKLSNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgIDB4ODg5OQotI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HIDB4ODg5QQotI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlCCi0jZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUMKLSNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlECi0jZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElORyAgICAweDg4OUUKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUYKLSNkZWZpbmUgR0xfUkVBRF9PTkxZICAgICAgICAgICAgICAgICAgICAgIDB4ODhCOAotI2RlZmluZSBHTF9XUklURV9PTkxZICAgICAgICAgICAgICAgICAgICAgMHg4OEI5Ci0jZGVmaW5lIEdMX1JFQURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAweDg4QkEKLSNkZWZpbmUgR0xfQlVGRkVSX0FDQ0VTUyAgICAgICAgICAgICAgICAgIDB4ODhCQgotI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEICAgICAgICAgICAgICAgICAgMHg4OEJDCi0jZGVmaW5lIEdMX0JVRkZFUl9NQVBfUE9JTlRFUiAgICAgICAgICAgICAweDg4QkQKLSNkZWZpbmUgR0xfU1RSRUFNX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFMAotI2RlZmluZSBHTF9TVFJFQU1fUkVBRCAgICAgICAgICAgICAgICAgICAgMHg4OEUxCi0jZGVmaW5lIEdMX1NUUkVBTV9DT1BZICAgICAgICAgICAgICAgICAgICAweDg4RTIKLSNkZWZpbmUgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFNAotI2RlZmluZSBHTF9TVEFUSUNfUkVBRCAgICAgICAgICAgICAgICAgICAgMHg4OEU1Ci0jZGVmaW5lIEdMX1NUQVRJQ19DT1BZICAgICAgICAgICAgICAgICAgICAweDg4RTYKLSNkZWZpbmUgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgIDB4ODhFOAotI2RlZmluZSBHTF9EWU5BTUlDX1JFQUQgICAgICAgICAgICAgICAgICAgMHg4OEU5Ci0jZGVmaW5lIEdMX0RZTkFNSUNfQ09QWSAgICAgICAgICAgICAgICAgICAweDg4RUEKLSNkZWZpbmUgR0xfU0FNUExFU19QQVNTRUQgICAgICAgICAgICAgICAgIDB4ODkxNAotI2RlZmluZSBHTF9GT0dfQ09PUkRfU1JDICAgICAgICAgICAgICAgICAgR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFCi0jZGVmaW5lIEdMX0ZPR19DT09SRCAgICAgICAgICAgICAgICAgICAgICBHTF9GT0dfQ09PUkRJTkFURQotI2RlZmluZSBHTF9DVVJSRU5UX0ZPR19DT09SRCAgICAgICAgICAgICAgR0xfQ1VSUkVOVF9GT0dfQ09PUkRJTkFURQotI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAgICAgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfVFlQRQotI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfU1RSSURFICAgICAgICAgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfU1RSSURFCi0jZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWV9QT0lOVEVSICAgICAgICBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9QT0lOVEVSCi0jZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWSAgICAgICAgICAgICAgICBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWQotI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfQlVGRkVSX0JJTkRJTkcKLSNkZWZpbmUgR0xfU1JDMF9SR0IgICAgICAgICAgICAgICAgICAgICAgIEdMX1NPVVJDRTBfUkdCCi0jZGVmaW5lIEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICBHTF9TT1VSQ0UxX1JHQgotI2RlZmluZSBHTF9TUkMyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgR0xfU09VUkNFMl9SR0IKLSNkZWZpbmUgR0xfU1JDMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgIEdMX1NPVVJDRTBfQUxQSEEKLSNkZWZpbmUgR0xfU1JDMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgIEdMX1NPVVJDRTFfQUxQSEEKLSNkZWZpbmUgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgIEdMX1NPVVJDRTJfQUxQSEEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1ZFUlNJT05fMl8wCi0jZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICBHTF9CTEVORF9FUVVBVElPTgotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQgICAgMHg4NjIyCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSAgICAgICAweDg2MjMKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREUgICAgIDB4ODYyNAotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEUgICAgICAgMHg4NjI1Ci0jZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQiAgICAgICAgICAweDg2MjYKLSNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRSAgICAgIDB4ODY0MgotI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERSAgICAgICAgMHg4NjQzCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAgICAweDg2NDUKLSNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZVTkMgICAgICAgICAgICAgIDB4ODgwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRkFJTCAgICAgICAgICAgICAgMHg4ODAxCi0jZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUwgICAweDg4MDIKLSNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUyAgIDB4ODgwMwotI2RlZmluZSBHTF9NQVhfRFJBV19CVUZGRVJTICAgICAgICAgICAgICAgMHg4ODI0Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMCAgICAgICAgICAgICAgICAgICAweDg4MjUKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxICAgICAgICAgICAgICAgICAgIDB4ODgyNgotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjIgICAgICAgICAgICAgICAgICAgMHg4ODI3Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMyAgICAgICAgICAgICAgICAgICAweDg4MjgKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI0ICAgICAgICAgICAgICAgICAgIDB4ODgyOQotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjUgICAgICAgICAgICAgICAgICAgMHg4ODJBCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSNiAgICAgICAgICAgICAgICAgICAweDg4MkIKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI3ICAgICAgICAgICAgICAgICAgIDB4ODgyQwotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjggICAgICAgICAgICAgICAgICAgMHg4ODJECi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSOSAgICAgICAgICAgICAgICAgICAweDg4MkUKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMCAgICAgICAgICAgICAgICAgIDB4ODgyRgotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjExICAgICAgICAgICAgICAgICAgMHg4ODMwCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTIgICAgICAgICAgICAgICAgICAweDg4MzEKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMyAgICAgICAgICAgICAgICAgIDB4ODgzMgotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE0ICAgICAgICAgICAgICAgICAgMHg4ODMzCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTUgICAgICAgICAgICAgICAgICAweDg4MzQKLSNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEEgICAgICAgICAgIDB4ODgzRAotI2RlZmluZSBHTF9QT0lOVF9TUFJJVEUgICAgICAgICAgICAgICAgICAgMHg4ODYxCi0jZGVmaW5lIEdMX0NPT1JEX1JFUExBQ0UgICAgICAgICAgICAgICAgICAweDg4NjIKLSNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BVFRSSUJTICAgICAgICAgICAgIDB4ODg2OQotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQgMHg4ODZBCi0jZGVmaW5lIEdMX01BWF9URVhUVVJFX0NPT1JEUyAgICAgICAgICAgICAweDg4NzEKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgICAgICAgIDB4ODg3MgotI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVIgICAgICAgICAgICAgICAgMHg4QjMwCi0jZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVIgICAgICAgICAgICAgICAgICAweDhCMzEKLSNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhCNDkKLSNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFMgIDB4OEI0QQotI2RlZmluZSBHTF9NQVhfVkFSWUlOR19GTE9BVFMgICAgICAgICAgICAgMHg4QjRCCi0jZGVmaW5lIEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyAweDhCNEMKLSNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgMHg4QjRECi0jZGVmaW5lIEdMX1NIQURFUl9UWVBFICAgICAgICAgICAgICAgICAgICAweDhCNEYKLSNkZWZpbmUgR0xfRkxPQVRfVkVDMiAgICAgICAgICAgICAgICAgICAgIDB4OEI1MAotI2RlZmluZSBHTF9GTE9BVF9WRUMzICAgICAgICAgICAgICAgICAgICAgMHg4QjUxCi0jZGVmaW5lIEdMX0ZMT0FUX1ZFQzQgICAgICAgICAgICAgICAgICAgICAweDhCNTIKLSNkZWZpbmUgR0xfSU5UX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1MwotI2RlZmluZSBHTF9JTlRfVkVDMyAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU0Ci0jZGVmaW5lIEdMX0lOVF9WRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDhCNTUKLSNkZWZpbmUgR0xfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NgotI2RlZmluZSBHTF9CT09MX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgMHg4QjU3Ci0jZGVmaW5lIEdMX0JPT0xfVkVDMyAgICAgICAgICAgICAgICAgICAgICAweDhCNTgKLSNkZWZpbmUgR0xfQk9PTF9WRUM0ICAgICAgICAgICAgICAgICAgICAgIDB4OEI1OQotI2RlZmluZSBHTF9GTE9BVF9NQVQyICAgICAgICAgICAgICAgICAgICAgMHg4QjVBCi0jZGVmaW5lIEdMX0ZMT0FUX01BVDMgICAgICAgICAgICAgICAgICAgICAweDhCNUIKLSNkZWZpbmUgR0xfRkxPQVRfTUFUNCAgICAgICAgICAgICAgICAgICAgIDB4OEI1QwotI2RlZmluZSBHTF9TQU1QTEVSXzFEICAgICAgICAgICAgICAgICAgICAgMHg4QjVECi0jZGVmaW5lIEdMX1NBTVBMRVJfMkQgICAgICAgICAgICAgICAgICAgICAweDhCNUUKLSNkZWZpbmUgR0xfU0FNUExFUl8zRCAgICAgICAgICAgICAgICAgICAgIDB4OEI1RgotI2RlZmluZSBHTF9TQU1QTEVSX0NVQkUgICAgICAgICAgICAgICAgICAgMHg4QjYwCi0jZGVmaW5lIEdMX1NBTVBMRVJfMURfU0hBRE9XICAgICAgICAgICAgICAweDhCNjEKLSNkZWZpbmUgR0xfU0FNUExFUl8yRF9TSEFET1cgICAgICAgICAgICAgIDB4OEI2MgotI2RlZmluZSBHTF9ERUxFVEVfU1RBVFVTICAgICAgICAgICAgICAgICAgMHg4QjgwCi0jZGVmaW5lIEdMX0NPTVBJTEVfU1RBVFVTICAgICAgICAgICAgICAgICAweDhCODEKLSNkZWZpbmUgR0xfTElOS19TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4OEI4MgotI2RlZmluZSBHTF9WQUxJREFURV9TVEFUVVMgICAgICAgICAgICAgICAgMHg4QjgzCi0jZGVmaW5lIEdMX0lORk9fTE9HX0xFTkdUSCAgICAgICAgICAgICAgICAweDhCODQKLSNkZWZpbmUgR0xfQVRUQUNIRURfU0hBREVSUyAgICAgICAgICAgICAgIDB4OEI4NQotI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STVMgICAgICAgICAgICAgICAgMHg4Qjg2Ci0jZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEggICAgICAweDhCODcKLSNkZWZpbmUgR0xfU0hBREVSX1NPVVJDRV9MRU5HVEggICAgICAgICAgIDB4OEI4OAotI2RlZmluZSBHTF9BQ1RJVkVfQVRUUklCVVRFUyAgICAgICAgICAgICAgMHg4Qjg5Ci0jZGVmaW5lIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCAgICAweDhCOEEKLSNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVCAweDhCOEIKLSNkZWZpbmUgR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OICAgICAgIDB4OEI4QwotI2RlZmluZSBHTF9DVVJSRU5UX1BST0dSQU0gICAgICAgICAgICAgICAgMHg4QjhECi0jZGVmaW5lIEdMX1BPSU5UX1NQUklURV9DT09SRF9PUklHSU4gICAgICAweDhDQTAKLSNkZWZpbmUgR0xfTE9XRVJfTEVGVCAgICAgICAgICAgICAgICAgICAgIDB4OENBMQotI2RlZmluZSBHTF9VUFBFUl9MRUZUICAgICAgICAgICAgICAgICAgICAgMHg4Q0EyCi0jZGVmaW5lIEdMX1NURU5DSUxfQkFDS19SRUYgICAgICAgICAgICAgICAweDhDQTMKLSNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0sgICAgICAgIDB4OENBNAotI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLICAgICAgICAgMHg4Q0E1Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfbXVsdGl0ZXh0dXJlCi0jZGVmaW5lIEdMX1RFWFRVUkUwX0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzAKLSNkZWZpbmUgR0xfVEVYVFVSRTFfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDMQotI2RlZmluZSBHTF9URVhUVVJFMl9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEMyCi0jZGVmaW5lIEdMX1RFWFRVUkUzX0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzMKLSNkZWZpbmUgR0xfVEVYVFVSRTRfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDNAotI2RlZmluZSBHTF9URVhUVVJFNV9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM1Ci0jZGVmaW5lIEdMX1RFWFRVUkU2X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzYKLSNkZWZpbmUgR0xfVEVYVFVSRTdfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDNwotI2RlZmluZSBHTF9URVhUVVJFOF9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM4Ci0jZGVmaW5lIEdMX1RFWFRVUkU5X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzkKLSNkZWZpbmUgR0xfVEVYVFVSRTEwX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDQQotI2RlZmluZSBHTF9URVhUVVJFMTFfQVJCICAgICAgICAgICAgICAgICAgMHg4NENCCi0jZGVmaW5lIEdMX1RFWFRVUkUxMl9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0MKLSNkZWZpbmUgR0xfVEVYVFVSRTEzX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDRAotI2RlZmluZSBHTF9URVhUVVJFMTRfQVJCICAgICAgICAgICAgICAgICAgMHg4NENFCi0jZGVmaW5lIEdMX1RFWFRVUkUxNV9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0YKLSNkZWZpbmUgR0xfVEVYVFVSRTE2X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREMAotI2RlZmluZSBHTF9URVhUVVJFMTdfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQxCi0jZGVmaW5lIEdMX1RFWFRVUkUxOF9BUkIgICAgICAgICAgICAgICAgICAweDg0RDIKLSNkZWZpbmUgR0xfVEVYVFVSRTE5X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREMwotI2RlZmluZSBHTF9URVhUVVJFMjBfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ0Ci0jZGVmaW5lIEdMX1RFWFRVUkUyMV9BUkIgICAgICAgICAgICAgICAgICAweDg0RDUKLSNkZWZpbmUgR0xfVEVYVFVSRTIyX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRENgotI2RlZmluZSBHTF9URVhUVVJFMjNfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ3Ci0jZGVmaW5lIEdMX1RFWFRVUkUyNF9BUkIgICAgICAgICAgICAgICAgICAweDg0RDgKLSNkZWZpbmUgR0xfVEVYVFVSRTI1X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREOQotI2RlZmluZSBHTF9URVhUVVJFMjZfQVJCICAgICAgICAgICAgICAgICAgMHg4NERBCi0jZGVmaW5lIEdMX1RFWFRVUkUyN19BUkIgICAgICAgICAgICAgICAgICAweDg0REIKLSNkZWZpbmUgR0xfVEVYVFVSRTI4X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREQwotI2RlZmluZSBHTF9URVhUVVJFMjlfQVJCICAgICAgICAgICAgICAgICAgMHg4NERECi0jZGVmaW5lIEdMX1RFWFRVUkUzMF9BUkIgICAgICAgICAgICAgICAgICAweDg0REUKLSNkZWZpbmUgR0xfVEVYVFVSRTMxX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRERgotI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRV9BUkIgICAgICAgICAgICAgMHg4NEUwCi0jZGVmaW5lIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRV9BUkIgICAgICAweDg0RTEKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFNfQVJCICAgICAgICAgIDB4ODRFMgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3RyYW5zcG9zZV9tYXRyaXgKLSNkZWZpbmUgR0xfVFJBTlNQT1NFX01PREVMVklFV19NQVRSSVhfQVJCIDB4ODRFMwotI2RlZmluZSBHTF9UUkFOU1BPU0VfUFJPSkVDVElPTl9NQVRSSVhfQVJCIDB4ODRFNAotI2RlZmluZSBHTF9UUkFOU1BPU0VfVEVYVFVSRV9NQVRSSVhfQVJCICAgMHg4NEU1Ci0jZGVmaW5lIEdMX1RSQU5TUE9TRV9DT0xPUl9NQVRSSVhfQVJCICAgICAweDg0RTYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl9tdWx0aXNhbXBsZQotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9BUkIgICAgICAgICAgICAgICAgMHg4MDlECi0jZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRV9BUkIgICAweDgwOUUKLSNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORV9BUkIgICAgICAgIDB4ODA5RgotI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfQVJCICAgICAgICAgICAgMHg4MEEwCi0jZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTX0FSQiAgICAgICAgICAgICAweDgwQTgKLSNkZWZpbmUgR0xfU0FNUExFU19BUkIgICAgICAgICAgICAgICAgICAgIDB4ODBBOQotI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUVfQVJCICAgICAgMHg4MEFBCi0jZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlRfQVJCICAgICAweDgwQUIKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQklUX0FSQiAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9hZGQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwCi0jZGVmaW5lIEdMX05PUk1BTF9NQVBfQVJCICAgICAgICAgICAgICAgICAweDg1MTEKLSNkZWZpbmUgR0xfUkVGTEVDVElPTl9NQVBfQVJCICAgICAgICAgICAgIDB4ODUxMgotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQiAgICAgICAgICAgMHg4NTEzCi0jZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9BUkIgICAweDg1MTQKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YX0FSQiAweDg1MTUKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX0FSQiAweDg1MTYKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX0FSQiAweDg1MTcKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZX0FSQiAweDg1MTgKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX0FSQiAweDg1MTkKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX0FSQiAweDg1MUEKLSNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9DVUJFX01BUF9BUkIgICAgIDB4ODUxQgotI2RlZmluZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFX0FSQiAgMHg4NTFDCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbgotI2RlZmluZSBHTF9DT01QUkVTU0VEX0FMUEhBX0FSQiAgICAgICAgICAgMHg4NEU5Ci0jZGVmaW5lIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FSQiAgICAgICAweDg0RUEKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQUxQSEFfQVJCIDB4ODRFQgotI2RlZmluZSBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWV9BUkIgICAgICAgMHg4NEVDCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX0FSQiAgICAgICAgICAgICAweDg0RUQKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0FSQiAgICAgICAgICAgIDB4ODRFRQotI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlRfQVJCICAgMHg4NEVGCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NFRF9JTUFHRV9TSVpFX0FSQiAweDg2QTAKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEX0FSQiAgICAgICAgIDB4ODZBMQotI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFNfQVJCIDB4ODZBMgotI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUU19BUkIgMHg4NkEzCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9ib3JkZXJfY2xhbXAKLSNkZWZpbmUgR0xfQ0xBTVBfVE9fQk9SREVSX0FSQiAgICAgICAgICAgIDB4ODEyRAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMKLSNkZWZpbmUgR0xfUE9JTlRfU0laRV9NSU5fQVJCICAgICAgICAgICAgIDB4ODEyNgotI2RlZmluZSBHTF9QT0lOVF9TSVpFX01BWF9BUkIgICAgICAgICAgICAgMHg4MTI3Ci0jZGVmaW5lIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkVfQVJCICAweDgxMjgKLSNkZWZpbmUgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCIDB4ODEyOQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3ZlcnRleF9ibGVuZAotI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSVRTX0FSQiAgICAgICAgICAgMHg4NkE0Ci0jZGVmaW5lIEdMX0FDVElWRV9WRVJURVhfVU5JVFNfQVJCICAgICAgICAweDg2QTUKLSNkZWZpbmUgR0xfV0VJR0hUX1NVTV9VTklUWV9BUkIgICAgICAgICAgIDB4ODZBNgotI2RlZmluZSBHTF9WRVJURVhfQkxFTkRfQVJCICAgICAgICAgICAgICAgMHg4NkE3Ci0jZGVmaW5lIEdMX0NVUlJFTlRfV0VJR0hUX0FSQiAgICAgICAgICAgICAweDg2QTgKLSNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1RZUEVfQVJCICAgICAgICAgIDB4ODZBOQotI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX0FSQiAgICAgICAgMHg4NkFBCi0jZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9TSVpFX0FSQiAgICAgICAgICAweDg2QUIKLSNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1BPSU5URVJfQVJCICAgICAgIDB4ODZBQwotI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfQVJCICAgICAgICAgICAgICAgMHg4NkFECi0jZGVmaW5lIEdMX01PREVMVklFVzBfQVJCICAgICAgICAgICAgICAgICAweDE3MDAKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMV9BUkIgICAgICAgICAgICAgICAgIDB4ODUwQQotI2RlZmluZSBHTF9NT0RFTFZJRVcyX0FSQiAgICAgICAgICAgICAgICAgMHg4NzIyCi0jZGVmaW5lIEdMX01PREVMVklFVzNfQVJCICAgICAgICAgICAgICAgICAweDg3MjMKLSNkZWZpbmUgR0xfTU9ERUxWSUVXNF9BUkIgICAgICAgICAgICAgICAgIDB4ODcyNAotI2RlZmluZSBHTF9NT0RFTFZJRVc1X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI1Ci0jZGVmaW5lIEdMX01PREVMVklFVzZfQVJCICAgICAgICAgICAgICAgICAweDg3MjYKLSNkZWZpbmUgR0xfTU9ERUxWSUVXN19BUkIgICAgICAgICAgICAgICAgIDB4ODcyNwotI2RlZmluZSBHTF9NT0RFTFZJRVc4X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI4Ci0jZGVmaW5lIEdMX01PREVMVklFVzlfQVJCICAgICAgICAgICAgICAgICAweDg3MjkKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMTBfQVJCICAgICAgICAgICAgICAgIDB4ODcyQQotI2RlZmluZSBHTF9NT0RFTFZJRVcxMV9BUkIgICAgICAgICAgICAgICAgMHg4NzJCCi0jZGVmaW5lIEdMX01PREVMVklFVzEyX0FSQiAgICAgICAgICAgICAgICAweDg3MkMKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMTNfQVJCICAgICAgICAgICAgICAgIDB4ODcyRAotI2RlZmluZSBHTF9NT0RFTFZJRVcxNF9BUkIgICAgICAgICAgICAgICAgMHg4NzJFCi0jZGVmaW5lIEdMX01PREVMVklFVzE1X0FSQiAgICAgICAgICAgICAgICAweDg3MkYKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMTZfQVJCICAgICAgICAgICAgICAgIDB4ODczMAotI2RlZmluZSBHTF9NT0RFTFZJRVcxN19BUkIgICAgICAgICAgICAgICAgMHg4NzMxCi0jZGVmaW5lIEdMX01PREVMVklFVzE4X0FSQiAgICAgICAgICAgICAgICAweDg3MzIKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMTlfQVJCICAgICAgICAgICAgICAgIDB4ODczMwotI2RlZmluZSBHTF9NT0RFTFZJRVcyMF9BUkIgICAgICAgICAgICAgICAgMHg4NzM0Ci0jZGVmaW5lIEdMX01PREVMVklFVzIxX0FSQiAgICAgICAgICAgICAgICAweDg3MzUKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMjJfQVJCICAgICAgICAgICAgICAgIDB4ODczNgotI2RlZmluZSBHTF9NT0RFTFZJRVcyM19BUkIgICAgICAgICAgICAgICAgMHg4NzM3Ci0jZGVmaW5lIEdMX01PREVMVklFVzI0X0FSQiAgICAgICAgICAgICAgICAweDg3MzgKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMjVfQVJCICAgICAgICAgICAgICAgIDB4ODczOQotI2RlZmluZSBHTF9NT0RFTFZJRVcyNl9BUkIgICAgICAgICAgICAgICAgMHg4NzNBCi0jZGVmaW5lIEdMX01PREVMVklFVzI3X0FSQiAgICAgICAgICAgICAgICAweDg3M0IKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMjhfQVJCICAgICAgICAgICAgICAgIDB4ODczQwotI2RlZmluZSBHTF9NT0RFTFZJRVcyOV9BUkIgICAgICAgICAgICAgICAgMHg4NzNECi0jZGVmaW5lIEdMX01PREVMVklFVzMwX0FSQiAgICAgICAgICAgICAgICAweDg3M0UKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMzFfQVJCICAgICAgICAgICAgICAgIDB4ODczRgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX21hdHJpeF9wYWxldHRlCi0jZGVmaW5lIEdMX01BVFJJWF9QQUxFVFRFX0FSQiAgICAgICAgICAgICAweDg4NDAKLSNkZWZpbmUgR0xfTUFYX01BVFJJWF9QQUxFVFRFX1NUQUNLX0RFUFRIX0FSQiAweDg4NDEKLSNkZWZpbmUgR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfQVJCICAgICAgIDB4ODg0MgotI2RlZmluZSBHTF9DVVJSRU5UX1BBTEVUVEVfTUFUUklYX0FSQiAgICAgMHg4ODQzCi0jZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9BUkIgICAgICAgICAweDg4NDQKLSNkZWZpbmUgR0xfQ1VSUkVOVF9NQVRSSVhfSU5ERVhfQVJCICAgICAgIDB4ODg0NQotI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9BUkIgICAgMHg4ODQ2Ci0jZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX0FSQiAgICAweDg4NDcKLSNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9BUkIgIDB4ODg0OAotI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9BUkIgMHg4ODQ5Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZQotI2RlZmluZSBHTF9DT01CSU5FX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4NTcwCi0jZGVmaW5lIEdMX0NPTUJJTkVfUkdCX0FSQiAgICAgICAgICAgICAgICAweDg1NzEKLSNkZWZpbmUgR0xfQ09NQklORV9BTFBIQV9BUkIgICAgICAgICAgICAgIDB4ODU3MgotI2RlZmluZSBHTF9TT1VSQ0UwX1JHQl9BUkIgICAgICAgICAgICAgICAgMHg4NTgwCi0jZGVmaW5lIEdMX1NPVVJDRTFfUkdCX0FSQiAgICAgICAgICAgICAgICAweDg1ODEKLSNkZWZpbmUgR0xfU09VUkNFMl9SR0JfQVJCICAgICAgICAgICAgICAgIDB4ODU4MgotI2RlZmluZSBHTF9TT1VSQ0UwX0FMUEhBX0FSQiAgICAgICAgICAgICAgMHg4NTg4Ci0jZGVmaW5lIEdMX1NPVVJDRTFfQUxQSEFfQVJCICAgICAgICAgICAgICAweDg1ODkKLSNkZWZpbmUgR0xfU09VUkNFMl9BTFBIQV9BUkIgICAgICAgICAgICAgIDB4ODU4QQotI2RlZmluZSBHTF9PUEVSQU5EMF9SR0JfQVJCICAgICAgICAgICAgICAgMHg4NTkwCi0jZGVmaW5lIEdMX09QRVJBTkQxX1JHQl9BUkIgICAgICAgICAgICAgICAweDg1OTEKLSNkZWZpbmUgR0xfT1BFUkFORDJfUkdCX0FSQiAgICAgICAgICAgICAgIDB4ODU5MgotI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQV9BUkIgICAgICAgICAgICAgMHg4NTk4Ci0jZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBX0FSQiAgICAgICAgICAgICAweDg1OTkKLSNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEFfQVJCICAgICAgICAgICAgIDB4ODU5QQotI2RlZmluZSBHTF9SR0JfU0NBTEVfQVJCICAgICAgICAgICAgICAgICAgMHg4NTczCi0jZGVmaW5lIEdMX0FERF9TSUdORURfQVJCICAgICAgICAgICAgICAgICAweDg1NzQKLSNkZWZpbmUgR0xfSU5URVJQT0xBVEVfQVJCICAgICAgICAgICAgICAgIDB4ODU3NQotI2RlZmluZSBHTF9TVUJUUkFDVF9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEU3Ci0jZGVmaW5lIEdMX0NPTlNUQU5UX0FSQiAgICAgICAgICAgICAgICAgICAweDg1NzYKLSNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUl9BUkIgICAgICAgICAgICAgIDB4ODU3NwotI2RlZmluZSBHTF9QUkVWSU9VU19BUkIgICAgICAgICAgICAgICAgICAgMHg4NTc4Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY3Jvc3NiYXIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzCi0jZGVmaW5lIEdMX0RPVDNfUkdCX0FSQiAgICAgICAgICAgICAgICAgICAweDg2QUUKLSNkZWZpbmUgR0xfRE9UM19SR0JBX0FSQiAgICAgICAgICAgICAgICAgIDB4ODZBRgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0Ci0jZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVF9BUkIgICAgICAgICAgICAweDgzNzAKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl9kZXB0aF90ZXh0dXJlCi0jZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2X0FSQiAgICAgICAgICAweDgxQTUKLSNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjRfQVJCICAgICAgICAgIDB4ODFBNgotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMl9BUkIgICAgICAgICAgMHg4MUE3Ci0jZGVmaW5lIEdMX1RFWFRVUkVfREVQVEhfU0laRV9BUkIgICAgICAgICAweDg4NEEKLSNkZWZpbmUgR0xfREVQVEhfVEVYVFVSRV9NT0RFX0FSQiAgICAgICAgIDB4ODg0QgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3NoYWRvdwotI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERV9BUkIgICAgICAgMHg4ODRDCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DX0FSQiAgICAgICAweDg4NEQKLSNkZWZpbmUgR0xfQ09NUEFSRV9SX1RPX1RFWFRVUkVfQVJCICAgICAgIDB4ODg0RQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3NoYWRvd19hbWJpZW50Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9GQUlMX1ZBTFVFX0FSQiAweDgwQkYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl93aW5kb3dfcG9zCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdmVydGV4X3Byb2dyYW0KLSNkZWZpbmUgR0xfQ09MT1JfU1VNX0FSQiAgICAgICAgICAgICAgICAgIDB4ODQ1OAotI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9BUkIgICAgICAgICAgICAgMHg4NjIwCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRF9BUkIgMHg4NjIyCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRV9BUkIgICAweDg2MjMKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREVfQVJCIDB4ODYyNAotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEVfQVJCICAgMHg4NjI1Ci0jZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQl9BUkIgICAgICAweDg2MjYKLSNkZWZpbmUgR0xfUFJPR1JBTV9MRU5HVEhfQVJCICAgICAgICAgICAgIDB4ODYyNwotI2RlZmluZSBHTF9QUk9HUkFNX1NUUklOR19BUkIgICAgICAgICAgICAgMHg4NjI4Ci0jZGVmaW5lIEdMX01BWF9QUk9HUkFNX01BVFJJWF9TVEFDS19ERVBUSF9BUkIgMHg4NjJFCi0jZGVmaW5lIEdMX01BWF9QUk9HUkFNX01BVFJJQ0VTX0FSQiAgICAgICAweDg2MkYKLSNkZWZpbmUgR0xfQ1VSUkVOVF9NQVRSSVhfU1RBQ0tfREVQVEhfQVJCIDB4ODY0MAotI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9BUkIgICAgICAgICAgICAgMHg4NjQxCi0jZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkVfQVJCICAweDg2NDIKLSNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREVfQVJCICAgIDB4ODY0MwotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVJfQVJCIDB4ODY0NQotI2RlZmluZSBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX0FSQiAgICAgMHg4NjRCCi0jZGVmaW5lIEdMX1BST0dSQU1fQklORElOR19BUkIgICAgICAgICAgICAweDg2NzcKLSNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BVFRSSUJTX0FSQiAgICAgICAgIDB4ODg2OQotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRURfQVJCIDB4ODg2QQotI2RlZmluZSBHTF9QUk9HUkFNX0VSUk9SX1NUUklOR19BUkIgICAgICAgMHg4ODc0Ci0jZGVmaW5lIEdMX1BST0dSQU1fRk9STUFUX0FTQ0lJX0FSQiAgICAgICAweDg4NzUKLSNkZWZpbmUgR0xfUFJPR1JBTV9GT1JNQVRfQVJCICAgICAgICAgICAgIDB4ODg3NgotI2RlZmluZSBHTF9QUk9HUkFNX0lOU1RSVUNUSU9OU19BUkIgICAgICAgMHg4OEEwCi0jZGVmaW5lIEdMX01BWF9QUk9HUkFNX0lOU1RSVUNUSU9OU19BUkIgICAweDg4QTEKLSNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfSU5TVFJVQ1RJT05TX0FSQiAweDg4QTIKLSNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIgMHg4OEEzCi0jZGVmaW5lIEdMX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICAgICAgICAweDg4QTQKLSNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICAgIDB4ODhBNQotI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9URU1QT1JBUklFU19BUkIgMHg4OEE2Ci0jZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9URU1QT1JBUklFU19BUkIgMHg4OEE3Ci0jZGVmaW5lIEdMX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgICAgICAgICAweDg4QTgKLSNkZWZpbmUgR0xfTUFYX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgICAgIDB4ODhBOQotI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9QQVJBTUVURVJTX0FSQiAgMHg4OEFBCi0jZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9QQVJBTUVURVJTX0FSQiAweDg4QUIKLSNkZWZpbmUgR0xfUFJPR1JBTV9BVFRSSUJTX0FSQiAgICAgICAgICAgIDB4ODhBQwotI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9BVFRSSUJTX0FSQiAgICAgICAgMHg4OEFECi0jZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCICAgICAweDg4QUUKLSNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCIDB4ODhBRgotI2RlZmluZSBHTF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQiAgMHg4OEIwCi0jZGVmaW5lIEdMX01BWF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQiAweDg4QjEKLSNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfQUREUkVTU19SRUdJU1RFUlNfQVJCIDB4ODhCMgotI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQUREUkVTU19SRUdJU1RFUlNfQVJCIDB4ODhCMwotI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9MT0NBTF9QQVJBTUVURVJTX0FSQiAweDg4QjQKLSNkZWZpbmUgR0xfTUFYX1BST0dSQU1fRU5WX1BBUkFNRVRFUlNfQVJCIDB4ODhCNQotI2RlZmluZSBHTF9QUk9HUkFNX1VOREVSX05BVElWRV9MSU1JVFNfQVJCIDB4ODhCNgotI2RlZmluZSBHTF9UUkFOU1BPU0VfQ1VSUkVOVF9NQVRSSVhfQVJCICAgMHg4OEI3Ci0jZGVmaW5lIEdMX01BVFJJWDBfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzAKLSNkZWZpbmUgR0xfTUFUUklYMV9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDMQotI2RlZmluZSBHTF9NQVRSSVgyX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEMyCi0jZGVmaW5lIEdMX01BVFJJWDNfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzMKLSNkZWZpbmUgR0xfTUFUUklYNF9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDNAotI2RlZmluZSBHTF9NQVRSSVg1X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM1Ci0jZGVmaW5lIEdMX01BVFJJWDZfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzYKLSNkZWZpbmUgR0xfTUFUUklYN19BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDNwotI2RlZmluZSBHTF9NQVRSSVg4X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM4Ci0jZGVmaW5lIEdMX01BVFJJWDlfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzkKLSNkZWZpbmUgR0xfTUFUUklYMTBfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDQQotI2RlZmluZSBHTF9NQVRSSVgxMV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OENCCi0jZGVmaW5lIEdMX01BVFJJWDEyX0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0MKLSNkZWZpbmUgR0xfTUFUUklYMTNfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDRAotI2RlZmluZSBHTF9NQVRSSVgxNF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OENFCi0jZGVmaW5lIEdMX01BVFJJWDE1X0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0YKLSNkZWZpbmUgR0xfTUFUUklYMTZfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEMAotI2RlZmluZSBHTF9NQVRSSVgxN19BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQxCi0jZGVmaW5lIEdMX01BVFJJWDE4X0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDIKLSNkZWZpbmUgR0xfTUFUUklYMTlfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEMwotI2RlZmluZSBHTF9NQVRSSVgyMF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ0Ci0jZGVmaW5lIEdMX01BVFJJWDIxX0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDUKLSNkZWZpbmUgR0xfTUFUUklYMjJfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhENgotI2RlZmluZSBHTF9NQVRSSVgyM19BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ3Ci0jZGVmaW5lIEdMX01BVFJJWDI0X0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDgKLSNkZWZpbmUgR0xfTUFUUklYMjVfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEOQotI2RlZmluZSBHTF9NQVRSSVgyNl9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERBCi0jZGVmaW5lIEdMX01BVFJJWDI3X0FSQiAgICAgICAgICAgICAgICAgICAweDg4REIKLSNkZWZpbmUgR0xfTUFUUklYMjhfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEQwotI2RlZmluZSBHTF9NQVRSSVgyOV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERECi0jZGVmaW5lIEdMX01BVFJJWDMwX0FSQiAgICAgICAgICAgICAgICAgICAweDg4REUKLSNkZWZpbmUgR0xfTUFUUklYMzFfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhERgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW0KLSNkZWZpbmUgR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIgICAgICAgICAgIDB4ODgwNAotI2RlZmluZSBHTF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCICAgMHg4ODA1Ci0jZGVmaW5lIEdMX1BST0dSQU1fVEVYX0lOU1RSVUNUSU9OU19BUkIgICAweDg4MDYKLSNkZWZpbmUgR0xfUFJPR1JBTV9URVhfSU5ESVJFQ1RJT05TX0FSQiAgIDB4ODgwNwotI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAweDg4MDgKLSNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lOU1RSVUNUSU9OU19BUkIgMHg4ODA5Ci0jZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCIDB4ODgwQQotI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEIKLSNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYX0lOU1RSVUNUSU9OU19BUkIgMHg4ODBDCi0jZGVmaW5lIEdMX01BWF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCIDB4ODgwRAotI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQUxVX0lOU1RSVUNUSU9OU19BUkIgMHg4ODBFCi0jZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9URVhfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEYKLSNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCIDB4ODgxMAotI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9DT09SRFNfQVJCICAgICAgICAgMHg4ODcxCi0jZGVmaW5lIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAgICAweDg4NzIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdAotI2RlZmluZSBHTF9CVUZGRVJfU0laRV9BUkIgICAgICAgICAgICAgICAgMHg4NzY0Ci0jZGVmaW5lIEdMX0JVRkZFUl9VU0FHRV9BUkIgICAgICAgICAgICAgICAweDg3NjUKLSNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSX0FSQiAgICAgICAgICAgICAgIDB4ODg5MgotI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkIgICAgICAgMHg4ODkzCi0jZGVmaW5lIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAgICAgICAweDg4OTQKLSNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODk1Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODk2Ci0jZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODk3Ci0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTgKLSNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5OQotI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OUEKLSNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OUIKLSNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OUMKLSNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5RAotI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5RQotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OUYKLSNkZWZpbmUgR0xfUkVBRF9PTkxZX0FSQiAgICAgICAgICAgICAgICAgIDB4ODhCOAotI2RlZmluZSBHTF9XUklURV9PTkxZX0FSQiAgICAgICAgICAgICAgICAgMHg4OEI5Ci0jZGVmaW5lIEdMX1JFQURfV1JJVEVfQVJCICAgICAgICAgICAgICAgICAweDg4QkEKLSNkZWZpbmUgR0xfQlVGRkVSX0FDQ0VTU19BUkIgICAgICAgICAgICAgIDB4ODhCQgotI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEX0FSQiAgICAgICAgICAgICAgMHg4OEJDCi0jZGVmaW5lIEdMX0JVRkZFUl9NQVBfUE9JTlRFUl9BUkIgICAgICAgICAweDg4QkQKLSNkZWZpbmUgR0xfU1RSRUFNX0RSQVdfQVJCICAgICAgICAgICAgICAgIDB4ODhFMAotI2RlZmluZSBHTF9TVFJFQU1fUkVBRF9BUkIgICAgICAgICAgICAgICAgMHg4OEUxCi0jZGVmaW5lIEdMX1NUUkVBTV9DT1BZX0FSQiAgICAgICAgICAgICAgICAweDg4RTIKLSNkZWZpbmUgR0xfU1RBVElDX0RSQVdfQVJCICAgICAgICAgICAgICAgIDB4ODhFNAotI2RlZmluZSBHTF9TVEFUSUNfUkVBRF9BUkIgICAgICAgICAgICAgICAgMHg4OEU1Ci0jZGVmaW5lIEdMX1NUQVRJQ19DT1BZX0FSQiAgICAgICAgICAgICAgICAweDg4RTYKLSNkZWZpbmUgR0xfRFlOQU1JQ19EUkFXX0FSQiAgICAgICAgICAgICAgIDB4ODhFOAotI2RlZmluZSBHTF9EWU5BTUlDX1JFQURfQVJCICAgICAgICAgICAgICAgMHg4OEU5Ci0jZGVmaW5lIEdMX0RZTkFNSUNfQ09QWV9BUkIgICAgICAgICAgICAgICAweDg4RUEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl9vY2NsdXNpb25fcXVlcnkKLSNkZWZpbmUgR0xfUVVFUllfQ09VTlRFUl9CSVRTX0FSQiAgICAgICAgIDB4ODg2NAotI2RlZmluZSBHTF9DVVJSRU5UX1FVRVJZX0FSQiAgICAgICAgICAgICAgMHg4ODY1Ci0jZGVmaW5lIEdMX1FVRVJZX1JFU1VMVF9BUkIgICAgICAgICAgICAgICAweDg4NjYKLSNkZWZpbmUgR0xfUVVFUllfUkVTVUxUX0FWQUlMQUJMRV9BUkIgICAgIDB4ODg2NwotI2RlZmluZSBHTF9TQU1QTEVTX1BBU1NFRF9BUkIgICAgICAgICAgICAgMHg4OTE0Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfc2hhZGVyX29iamVjdHMKLSNkZWZpbmUgR0xfUFJPR1JBTV9PQkpFQ1RfQVJCICAgICAgICAgICAgIDB4OEI0MAotI2RlZmluZSBHTF9TSEFERVJfT0JKRUNUX0FSQiAgICAgICAgICAgICAgMHg4QjQ4Ci0jZGVmaW5lIEdMX09CSkVDVF9UWVBFX0FSQiAgICAgICAgICAgICAgICAweDhCNEUKLSNkZWZpbmUgR0xfT0JKRUNUX1NVQlRZUEVfQVJCICAgICAgICAgICAgIDB4OEI0RgotI2RlZmluZSBHTF9GTE9BVF9WRUMyX0FSQiAgICAgICAgICAgICAgICAgMHg4QjUwCi0jZGVmaW5lIEdMX0ZMT0FUX1ZFQzNfQVJCICAgICAgICAgICAgICAgICAweDhCNTEKLSNkZWZpbmUgR0xfRkxPQVRfVkVDNF9BUkIgICAgICAgICAgICAgICAgIDB4OEI1MgotI2RlZmluZSBHTF9JTlRfVkVDMl9BUkIgICAgICAgICAgICAgICAgICAgMHg4QjUzCi0jZGVmaW5lIEdMX0lOVF9WRUMzX0FSQiAgICAgICAgICAgICAgICAgICAweDhCNTQKLSNkZWZpbmUgR0xfSU5UX1ZFQzRfQVJCICAgICAgICAgICAgICAgICAgIDB4OEI1NQotI2RlZmluZSBHTF9CT09MX0FSQiAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU2Ci0jZGVmaW5lIEdMX0JPT0xfVkVDMl9BUkIgICAgICAgICAgICAgICAgICAweDhCNTcKLSNkZWZpbmUgR0xfQk9PTF9WRUMzX0FSQiAgICAgICAgICAgICAgICAgIDB4OEI1OAotI2RlZmluZSBHTF9CT09MX1ZFQzRfQVJCICAgICAgICAgICAgICAgICAgMHg4QjU5Ci0jZGVmaW5lIEdMX0ZMT0FUX01BVDJfQVJCICAgICAgICAgICAgICAgICAweDhCNUEKLSNkZWZpbmUgR0xfRkxPQVRfTUFUM19BUkIgICAgICAgICAgICAgICAgIDB4OEI1QgotI2RlZmluZSBHTF9GTE9BVF9NQVQ0X0FSQiAgICAgICAgICAgICAgICAgMHg4QjVDCi0jZGVmaW5lIEdMX1NBTVBMRVJfMURfQVJCICAgICAgICAgICAgICAgICAweDhCNUQKLSNkZWZpbmUgR0xfU0FNUExFUl8yRF9BUkIgICAgICAgICAgICAgICAgIDB4OEI1RQotI2RlZmluZSBHTF9TQU1QTEVSXzNEX0FSQiAgICAgICAgICAgICAgICAgMHg4QjVGCi0jZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRV9BUkIgICAgICAgICAgICAgICAweDhCNjAKLSNkZWZpbmUgR0xfU0FNUExFUl8xRF9TSEFET1dfQVJCICAgICAgICAgIDB4OEI2MQotI2RlZmluZSBHTF9TQU1QTEVSXzJEX1NIQURPV19BUkIgICAgICAgICAgMHg4QjYyCi0jZGVmaW5lIEdMX1NBTVBMRVJfMkRfUkVDVF9BUkIgICAgICAgICAgICAweDhCNjMKLSNkZWZpbmUgR0xfU0FNUExFUl8yRF9SRUNUX1NIQURPV19BUkIgICAgIDB4OEI2NAotI2RlZmluZSBHTF9PQkpFQ1RfREVMRVRFX1NUQVRVU19BUkIgICAgICAgMHg4QjgwCi0jZGVmaW5lIEdMX09CSkVDVF9DT01QSUxFX1NUQVRVU19BUkIgICAgICAweDhCODEKLSNkZWZpbmUgR0xfT0JKRUNUX0xJTktfU1RBVFVTX0FSQiAgICAgICAgIDB4OEI4MgotI2RlZmluZSBHTF9PQkpFQ1RfVkFMSURBVEVfU1RBVFVTX0FSQiAgICAgMHg4QjgzCi0jZGVmaW5lIEdMX09CSkVDVF9JTkZPX0xPR19MRU5HVEhfQVJCICAgICAweDhCODQKLSNkZWZpbmUgR0xfT0JKRUNUX0FUVEFDSEVEX09CSkVDVFNfQVJCICAgIDB4OEI4NQotI2RlZmluZSBHTF9PQkpFQ1RfQUNUSVZFX1VOSUZPUk1TX0FSQiAgICAgMHg4Qjg2Ci0jZGVmaW5lIEdMX09CSkVDVF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIX0FSQiAweDhCODcKLSNkZWZpbmUgR0xfT0JKRUNUX1NIQURFUl9TT1VSQ0VfTEVOR1RIX0FSQiAweDhCODgKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyCi0jZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfQVJCICAgICAgICAgICAgICAweDhCMzEKLSNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFNfQVJCIDB4OEI0QQotI2RlZmluZSBHTF9NQVhfVkFSWUlOR19GTE9BVFNfQVJCICAgICAgICAgMHg4QjRCCi0jZGVmaW5lIEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUU19BUkIgMHg4QjRDCi0jZGVmaW5lIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAweDhCNEQKLSNkZWZpbmUgR0xfT0JKRUNUX0FDVElWRV9BVFRSSUJVVEVTX0FSQiAgIDB4OEI4OQotI2RlZmluZSBHTF9PQkpFQ1RfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIX0FSQiAweDhCOEEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl9mcmFnbWVudF9zaGFkZXIKLSNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0FSQiAgICAgICAgICAgIDB4OEIzMAotI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTX0FSQiAweDhCNDkKLSNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVF9BUkIgMHg4QjhCCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV8xMDAKLSNkZWZpbmUgR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OX0FSQiAgIDB4OEI4QwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3bwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3BvaW50X3Nwcml0ZQotI2RlZmluZSBHTF9QT0lOVF9TUFJJVEVfQVJCICAgICAgICAgICAgICAgMHg4ODYxCi0jZGVmaW5lIEdMX0NPT1JEX1JFUExBQ0VfQVJCICAgICAgICAgICAgICAweDg4NjIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtX3NoYWRvdwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX2RyYXdfYnVmZmVycwotI2RlZmluZSBHTF9NQVhfRFJBV19CVUZGRVJTX0FSQiAgICAgICAgICAgMHg4ODI0Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMF9BUkIgICAgICAgICAgICAgICAweDg4MjUKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxX0FSQiAgICAgICAgICAgICAgIDB4ODgyNgotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjJfQVJCICAgICAgICAgICAgICAgMHg4ODI3Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSM19BUkIgICAgICAgICAgICAgICAweDg4MjgKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI0X0FSQiAgICAgICAgICAgICAgIDB4ODgyOQotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjVfQVJCICAgICAgICAgICAgICAgMHg4ODJBCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSNl9BUkIgICAgICAgICAgICAgICAweDg4MkIKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI3X0FSQiAgICAgICAgICAgICAgIDB4ODgyQwotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjhfQVJCICAgICAgICAgICAgICAgMHg4ODJECi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSOV9BUkIgICAgICAgICAgICAgICAweDg4MkUKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMF9BUkIgICAgICAgICAgICAgIDB4ODgyRgotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjExX0FSQiAgICAgICAgICAgICAgMHg4ODMwCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTJfQVJCICAgICAgICAgICAgICAweDg4MzEKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxM19BUkIgICAgICAgICAgICAgIDB4ODgzMgotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE0X0FSQiAgICAgICAgICAgICAgMHg4ODMzCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTVfQVJCICAgICAgICAgICAgICAweDg4MzQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZQotI2RlZmluZSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIgICAgICAgICAgMHg4NEY1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19SRUNUQU5HTEVfQVJCICAweDg0RjYKLSNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9SRUNUQU5HTEVfQVJCICAgIDB4ODRGNwotI2RlZmluZSBHTF9NQVhfUkVDVEFOR0xFX1RFWFRVUkVfU0laRV9BUkIgMHg4NEY4Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfY29sb3JfYnVmZmVyX2Zsb2F0Ci0jZGVmaW5lIEdMX1JHQkFfRkxPQVRfTU9ERV9BUkIgICAgICAgICAgICAweDg4MjAKLSNkZWZpbmUgR0xfQ0xBTVBfVkVSVEVYX0NPTE9SX0FSQiAgICAgICAgIDB4ODkxQQotI2RlZmluZSBHTF9DTEFNUF9GUkFHTUVOVF9DT0xPUl9BUkIgICAgICAgMHg4OTFCCi0jZGVmaW5lIEdMX0NMQU1QX1JFQURfQ09MT1JfQVJCICAgICAgICAgICAweDg5MUMKLSNkZWZpbmUgR0xfRklYRURfT05MWV9BUkIgICAgICAgICAgICAgICAgIDB4ODkxRAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwKLSNkZWZpbmUgR0xfSEFMRl9GTE9BVF9BUkIgICAgICAgICAgICAgICAgIDB4MTQwQgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZmxvYXQKLSNkZWZpbmUgR0xfVEVYVFVSRV9SRURfVFlQRV9BUkIgICAgICAgICAgIDB4OEMxMAotI2RlZmluZSBHTF9URVhUVVJFX0dSRUVOX1RZUEVfQVJCICAgICAgICAgMHg4QzExCi0jZGVmaW5lIEdMX1RFWFRVUkVfQkxVRV9UWVBFX0FSQiAgICAgICAgICAweDhDMTIKLSNkZWZpbmUgR0xfVEVYVFVSRV9BTFBIQV9UWVBFX0FSQiAgICAgICAgIDB4OEMxMwotI2RlZmluZSBHTF9URVhUVVJFX0xVTUlOQU5DRV9UWVBFX0FSQiAgICAgMHg4QzE0Ci0jZGVmaW5lIEdMX1RFWFRVUkVfSU5URU5TSVRZX1RZUEVfQVJCICAgICAweDhDMTUKLSNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9UWVBFX0FSQiAgICAgICAgIDB4OEMxNgotI2RlZmluZSBHTF9VTlNJR05FRF9OT1JNQUxJWkVEX0FSQiAgICAgICAgMHg4QzE3Ci0jZGVmaW5lIEdMX1JHQkEzMkZfQVJCICAgICAgICAgICAgICAgICAgICAweDg4MTQKLSNkZWZpbmUgR0xfUkdCMzJGX0FSQiAgICAgICAgICAgICAgICAgICAgIDB4ODgxNQotI2RlZmluZSBHTF9BTFBIQTMyRl9BUkIgICAgICAgICAgICAgICAgICAgMHg4ODE2Ci0jZGVmaW5lIEdMX0lOVEVOU0lUWTMyRl9BUkIgICAgICAgICAgICAgICAweDg4MTcKLSNkZWZpbmUgR0xfTFVNSU5BTkNFMzJGX0FSQiAgICAgICAgICAgICAgIDB4ODgxOAotI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEzMkZfQVJCICAgICAgICAgMHg4ODE5Ci0jZGVmaW5lIEdMX1JHQkExNkZfQVJCICAgICAgICAgICAgICAgICAgICAweDg4MUEKLSNkZWZpbmUgR0xfUkdCMTZGX0FSQiAgICAgICAgICAgICAgICAgICAgIDB4ODgxQgotI2RlZmluZSBHTF9BTFBIQTE2Rl9BUkIgICAgICAgICAgICAgICAgICAgMHg4ODFDCi0jZGVmaW5lIEdMX0lOVEVOU0lUWTE2Rl9BUkIgICAgICAgICAgICAgICAweDg4MUQKLSNkZWZpbmUgR0xfTFVNSU5BTkNFMTZGX0FSQiAgICAgICAgICAgICAgIDB4ODgxRQotI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEExNkZfQVJCICAgICAgICAgMHg4ODFGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfcGl4ZWxfYnVmZmVyX29iamVjdAotI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9BUkIgICAgICAgICAgMHg4OEVCCi0jZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQVJCICAgICAgICAweDg4RUMKLSNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElOR19BUkIgIDB4ODhFRAotI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODhFRgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2FiZ3IKLSNkZWZpbmUgR0xfQUJHUl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX2NvbG9yCi0jZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SX0VYVCAgICAgICAgICAgICAweDgwMDEKLSNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SX0VYVCAgIDB4ODAwMgotI2RlZmluZSBHTF9DT05TVEFOVF9BTFBIQV9FWFQgICAgICAgICAgICAgMHg4MDAzCi0jZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQV9FWFQgICAweDgwMDQKLSNkZWZpbmUgR0xfQkxFTkRfQ09MT1JfRVhUICAgICAgICAgICAgICAgIDB4ODAwNQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3BvbHlnb25fb2Zmc2V0Ci0jZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0VYVCAgICAgICAgICAgICAweDgwMzcKLSNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SX0VYVCAgICAgIDB4ODAzOAotI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9CSUFTX0VYVCAgICAgICAgMHg4MDM5Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZQotI2RlZmluZSBHTF9BTFBIQTRfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4MDNCCi0jZGVmaW5lIEdMX0FMUEhBOF9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwM0MKLSNkZWZpbmUgR0xfQUxQSEExMl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODAzRAotI2RlZmluZSBHTF9BTFBIQTE2X0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MDNFCi0jZGVmaW5lIEdMX0xVTUlOQU5DRTRfRVhUICAgICAgICAgICAgICAgICAweDgwM0YKLSNkZWZpbmUgR0xfTFVNSU5BTkNFOF9FWFQgICAgICAgICAgICAgICAgIDB4ODA0MAotI2RlZmluZSBHTF9MVU1JTkFOQ0UxMl9FWFQgICAgICAgICAgICAgICAgMHg4MDQxCi0jZGVmaW5lIEdMX0xVTUlOQU5DRTE2X0VYVCAgICAgICAgICAgICAgICAweDgwNDIKLSNkZWZpbmUgR0xfTFVNSU5BTkNFNF9BTFBIQTRfRVhUICAgICAgICAgIDB4ODA0MwotI2RlZmluZSBHTF9MVU1JTkFOQ0U2X0FMUEhBMl9FWFQgICAgICAgICAgMHg4MDQ0Ci0jZGVmaW5lIEdMX0xVTUlOQU5DRThfQUxQSEE4X0VYVCAgICAgICAgICAweDgwNDUKLSNkZWZpbmUgR0xfTFVNSU5BTkNFMTJfQUxQSEE0X0VYVCAgICAgICAgIDB4ODA0NgotI2RlZmluZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTEyX0VYVCAgICAgICAgMHg4MDQ3Ci0jZGVmaW5lIEdMX0xVTUlOQU5DRTE2X0FMUEhBMTZfRVhUICAgICAgICAweDgwNDgKLSNkZWZpbmUgR0xfSU5URU5TSVRZX0VYVCAgICAgICAgICAgICAgICAgIDB4ODA0OQotI2RlZmluZSBHTF9JTlRFTlNJVFk0X0VYVCAgICAgICAgICAgICAgICAgMHg4MDRBCi0jZGVmaW5lIEdMX0lOVEVOU0lUWThfRVhUICAgICAgICAgICAgICAgICAweDgwNEIKLSNkZWZpbmUgR0xfSU5URU5TSVRZMTJfRVhUICAgICAgICAgICAgICAgIDB4ODA0QwotI2RlZmluZSBHTF9JTlRFTlNJVFkxNl9FWFQgICAgICAgICAgICAgICAgMHg4MDRECi0jZGVmaW5lIEdMX1JHQjJfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwNEUKLSNkZWZpbmUgR0xfUkdCNF9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0RgotI2RlZmluZSBHTF9SR0I1X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDUwCi0jZGVmaW5lIEdMX1JHQjhfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwNTEKLSNkZWZpbmUgR0xfUkdCMTBfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MgotI2RlZmluZSBHTF9SR0IxMl9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDUzCi0jZGVmaW5lIEdMX1JHQjE2X0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwNTQKLSNkZWZpbmUgR0xfUkdCQTJfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NQotI2RlZmluZSBHTF9SR0JBNF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDU2Ci0jZGVmaW5lIEdMX1JHQjVfQTFfRVhUICAgICAgICAgICAgICAgICAgICAweDgwNTcKLSNkZWZpbmUgR0xfUkdCQThfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OAotI2RlZmluZSBHTF9SR0IxMF9BMl9FWFQgICAgICAgICAgICAgICAgICAgMHg4MDU5Ci0jZGVmaW5lIEdMX1JHQkExMl9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwNUEKLSNkZWZpbmUgR0xfUkdCQTE2X0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODA1QgotI2RlZmluZSBHTF9URVhUVVJFX1JFRF9TSVpFX0VYVCAgICAgICAgICAgMHg4MDVDCi0jZGVmaW5lIEdMX1RFWFRVUkVfR1JFRU5fU0laRV9FWFQgICAgICAgICAweDgwNUQKLSNkZWZpbmUgR0xfVEVYVFVSRV9CTFVFX1NJWkVfRVhUICAgICAgICAgIDB4ODA1RQotI2RlZmluZSBHTF9URVhUVVJFX0FMUEhBX1NJWkVfRVhUICAgICAgICAgMHg4MDVGCi0jZGVmaW5lIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1NJWkVfRVhUICAgICAweDgwNjAKLSNkZWZpbmUgR0xfVEVYVFVSRV9JTlRFTlNJVFlfU0laRV9FWFQgICAgIDB4ODA2MQotI2RlZmluZSBHTF9SRVBMQUNFX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MDYyCi0jZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMURfRVhUICAgICAgICAgICAweDgwNjMKLSNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9FWFQgICAgICAgICAgIDB4ODA2NAotI2RlZmluZSBHTF9URVhUVVJFX1RPT19MQVJHRV9FWFQgICAgICAgICAgMHg4MDY1Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZTNECi0jZGVmaW5lIEdMX1BBQ0tfU0tJUF9JTUFHRVNfRVhUICAgICAgICAgICAweDgwNkIKLSNkZWZpbmUgR0xfUEFDS19JTUFHRV9IRUlHSFRfRVhUICAgICAgICAgIDB4ODA2QwotI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9JTUFHRVNfRVhUICAgICAgICAgMHg4MDZECi0jZGVmaW5lIEdMX1VOUEFDS19JTUFHRV9IRUlHSFRfRVhUICAgICAgICAweDgwNkUKLSNkZWZpbmUgR0xfVEVYVFVSRV8zRF9FWFQgICAgICAgICAgICAgICAgIDB4ODA2RgotI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzNEX0VYVCAgICAgICAgICAgMHg4MDcwCi0jZGVmaW5lIEdMX1RFWFRVUkVfREVQVEhfRVhUICAgICAgICAgICAgICAweDgwNzEKLSNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1JfRVhUICAgICAgICAgICAgIDB4ODA3MgotI2RlZmluZSBHTF9NQVhfM0RfVEVYVFVSRV9TSVpFX0VYVCAgICAgICAgMHg4MDczCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfZmlsdGVyNAotI2RlZmluZSBHTF9GSUxURVI0X1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MTQ2Ci0jZGVmaW5lIEdMX1RFWFRVUkVfRklMVEVSNF9TSVpFX1NHSVMgICAgICAweDgxNDcKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9zdWJ0ZXh0dXJlCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfY29weV90ZXh0dXJlCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfaGlzdG9ncmFtCi0jZGVmaW5lIEdMX0hJU1RPR1JBTV9FWFQgICAgICAgICAgICAgICAgICAweDgwMjQKLSNkZWZpbmUgR0xfUFJPWFlfSElTVE9HUkFNX0VYVCAgICAgICAgICAgIDB4ODAyNQotI2RlZmluZSBHTF9ISVNUT0dSQU1fV0lEVEhfRVhUICAgICAgICAgICAgMHg4MDI2Ci0jZGVmaW5lIEdMX0hJU1RPR1JBTV9GT1JNQVRfRVhUICAgICAgICAgICAweDgwMjcKLSNkZWZpbmUgR0xfSElTVE9HUkFNX1JFRF9TSVpFX0VYVCAgICAgICAgIDB4ODAyOAotI2RlZmluZSBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRV9FWFQgICAgICAgMHg4MDI5Ci0jZGVmaW5lIEdMX0hJU1RPR1JBTV9CTFVFX1NJWkVfRVhUICAgICAgICAweDgwMkEKLSNkZWZpbmUgR0xfSElTVE9HUkFNX0FMUEhBX1NJWkVfRVhUICAgICAgIDB4ODAyQgotI2RlZmluZSBHTF9ISVNUT0dSQU1fTFVNSU5BTkNFX1NJWkVfRVhUICAgMHg4MDJDCi0jZGVmaW5lIEdMX0hJU1RPR1JBTV9TSU5LX0VYVCAgICAgICAgICAgICAweDgwMkQKLSNkZWZpbmUgR0xfTUlOTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODAyRQotI2RlZmluZSBHTF9NSU5NQVhfRk9STUFUX0VYVCAgICAgICAgICAgICAgMHg4MDJGCi0jZGVmaW5lIEdMX01JTk1BWF9TSU5LX0VYVCAgICAgICAgICAgICAgICAweDgwMzAKLSNkZWZpbmUgR0xfVEFCTEVfVE9PX0xBUkdFX0VYVCAgICAgICAgICAgIDB4ODAzMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2NvbnZvbHV0aW9uCi0jZGVmaW5lIEdMX0NPTlZPTFVUSU9OXzFEX0VYVCAgICAgICAgICAgICAweDgwMTAKLSNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMkRfRVhUICAgICAgICAgICAgIDB4ODAxMQotI2RlZmluZSBHTF9TRVBBUkFCTEVfMkRfRVhUICAgICAgICAgICAgICAgMHg4MDEyCi0jZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9NT0RFX0VYVCAgICAweDgwMTMKLSNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFX0VYVCAgIDB4ODAxNAotI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfQklBU19FWFQgICAgMHg4MDE1Ci0jZGVmaW5lIEdMX1JFRFVDRV9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwMTYKLSNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRk9STUFUX0VYVCAgICAgICAgIDB4ODAxNwotI2RlZmluZSBHTF9DT05WT0xVVElPTl9XSURUSF9FWFQgICAgICAgICAgMHg4MDE4Ci0jZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0hFSUdIVF9FWFQgICAgICAgICAweDgwMTkKLSNkZWZpbmUgR0xfTUFYX0NPTlZPTFVUSU9OX1dJRFRIX0VYVCAgICAgIDB4ODAxQQotI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fSEVJR0hUX0VYVCAgICAgMHg4MDFCCi0jZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFX0VYVCAweDgwMUMKLSNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9TQ0FMRV9FWFQgMHg4MDFECi0jZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9TQ0FMRV9FWFQgMHg4MDFFCi0jZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEVfRVhUIDB4ODAxRgotI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX1JFRF9CSUFTX0VYVCAgMHg4MDIwCi0jZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fQklBU19FWFQgMHg4MDIxCi0jZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9CSUFTX0VYVCAweDgwMjIKLSNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9CSUFTX0VYVCAweDgwMjMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSV9jb2xvcl9tYXRyaXgKLSNkZWZpbmUgR0xfQ09MT1JfTUFUUklYX1NHSSAgICAgICAgICAgICAgIDB4ODBCMQotI2RlZmluZSBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEhfU0dJICAgMHg4MEIyCi0jZGVmaW5lIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEhfU0dJIDB4ODBCMwotI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfU0NBTEVfU0dJIDB4ODBCNAotI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRV9TR0kgMHg4MEI1Ci0jZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEVfU0dJIDB4ODBCNgotI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9TQ0FMRV9TR0kgMHg4MEI3Ci0jZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9CSUFTX1NHSSAweDgwQjgKLSNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fQklBU19TR0kgMHg4MEI5Ci0jZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfQklBU19TR0kgMHg4MEJBCi0jZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX0JJQVNfU0dJIDB4ODBCQgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJX2NvbG9yX3RhYmxlCi0jZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1NHSSAgICAgICAgICAgICAgICAweDgwRDAKLSNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRV9TR0kgMHg4MEQxCi0jZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFX1NHSSAweDgwRDIKLSNkZWZpbmUgR0xfUFJPWFlfQ09MT1JfVEFCTEVfU0dJICAgICAgICAgIDB4ODBEMwotI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFX1NHSSAweDgwRDQKLSNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEVfU0dJIDB4ODBENQotI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9TQ0FMRV9TR0kgICAgICAgICAgMHg4MEQ2Ci0jZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JJQVNfU0dJICAgICAgICAgICAweDgwRDcKLSNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfRk9STUFUX1NHSSAgICAgICAgIDB4ODBEOAotI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9XSURUSF9TR0kgICAgICAgICAgMHg4MEQ5Ci0jZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1JFRF9TSVpFX1NHSSAgICAgICAweDgwREEKLSNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfR1JFRU5fU0laRV9TR0kgICAgIDB4ODBEQgotI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9CTFVFX1NJWkVfU0dJICAgICAgMHg4MERDCi0jZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0FMUEhBX1NJWkVfU0dJICAgICAweDgwREQKLSNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkVfU0dJIDB4ODBERQotI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9JTlRFTlNJVFlfU0laRV9TR0kgMHg4MERGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3BpeGVsX3RleHR1cmUKLSNkZWZpbmUgR0xfUElYRUxfVEVYVFVSRV9TR0lTICAgICAgICAgICAgIDB4ODM1MwotI2RlZmluZSBHTF9QSVhFTF9GUkFHTUVOVF9SR0JfU09VUkNFX1NHSVMgMHg4MzU0Ci0jZGVmaW5lIEdMX1BJWEVMX0ZSQUdNRU5UX0FMUEhBX1NPVVJDRV9TR0lTIDB4ODM1NQotI2RlZmluZSBHTF9QSVhFTF9HUk9VUF9DT0xPUl9TR0lTICAgICAgICAgMHg4MzU2Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3BpeGVsX3RleHR1cmUKLSNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9TR0lYICAgICAgICAgICAgIDB4ODEzOQotI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX01PREVfU0dJWCAgICAgICAgMHg4MzJCCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmU0RAotI2RlZmluZSBHTF9QQUNLX1NLSVBfVk9MVU1FU19TR0lTICAgICAgICAgMHg4MTMwCi0jZGVmaW5lIEdMX1BBQ0tfSU1BR0VfREVQVEhfU0dJUyAgICAgICAgICAweDgxMzEKLSNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfVk9MVU1FU19TR0lTICAgICAgIDB4ODEzMgotI2RlZmluZSBHTF9VTlBBQ0tfSU1BR0VfREVQVEhfU0dJUyAgICAgICAgMHg4MTMzCi0jZGVmaW5lIEdMX1RFWFRVUkVfNERfU0dJUyAgICAgICAgICAgICAgICAweDgxMzQKLSNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV80RF9TR0lTICAgICAgICAgIDB4ODEzNQotI2RlZmluZSBHTF9URVhUVVJFXzREU0laRV9TR0lTICAgICAgICAgICAgMHg4MTM2Ci0jZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9RX1NHSVMgICAgICAgICAgICAweDgxMzcKLSNkZWZpbmUgR0xfTUFYXzREX1RFWFRVUkVfU0laRV9TR0lTICAgICAgIDB4ODEzOAotI2RlZmluZSBHTF9URVhUVVJFXzREX0JJTkRJTkdfU0dJUyAgICAgICAgMHg4MTRGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lfdGV4dHVyZV9jb2xvcl90YWJsZQotI2RlZmluZSBHTF9URVhUVVJFX0NPTE9SX1RBQkxFX1NHSSAgICAgICAgMHg4MEJDCi0jZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ09MT1JfVEFCTEVfU0dJICAweDgwQkQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9jbXlrYQotI2RlZmluZSBHTF9DTVlLX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDBDCi0jZGVmaW5lIEdMX0NNWUtBX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwMEQKLSNkZWZpbmUgR0xfUEFDS19DTVlLX0hJTlRfRVhUICAgICAgICAgICAgIDB4ODAwRQotI2RlZmluZSBHTF9VTlBBQ0tfQ01ZS19ISU5UX0VYVCAgICAgICAgICAgMHg4MDBGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9vYmplY3QKLSNkZWZpbmUgR0xfVEVYVFVSRV9QUklPUklUWV9FWFQgICAgICAgICAgIDB4ODA2NgotI2RlZmluZSBHTF9URVhUVVJFX1JFU0lERU5UX0VYVCAgICAgICAgICAgMHg4MDY3Ci0jZGVmaW5lIEdMX1RFWFRVUkVfMURfQklORElOR19FWFQgICAgICAgICAweDgwNjgKLSNkZWZpbmUgR0xfVEVYVFVSRV8yRF9CSU5ESU5HX0VYVCAgICAgICAgIDB4ODA2OQotI2RlZmluZSBHTF9URVhUVVJFXzNEX0JJTkRJTkdfRVhUICAgICAgICAgMHg4MDZBCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX2RldGFpbF90ZXh0dXJlCi0jZGVmaW5lIEdMX0RFVEFJTF9URVhUVVJFXzJEX1NHSVMgICAgICAgICAweDgwOTUKLSNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfMkRfQklORElOR19TR0lTIDB4ODA5NgotI2RlZmluZSBHTF9MSU5FQVJfREVUQUlMX1NHSVMgICAgICAgICAgICAgMHg4MDk3Ci0jZGVmaW5lIEdMX0xJTkVBUl9ERVRBSUxfQUxQSEFfU0dJUyAgICAgICAweDgwOTgKLSNkZWZpbmUgR0xfTElORUFSX0RFVEFJTF9DT0xPUl9TR0lTICAgICAgIDB4ODA5OQotI2RlZmluZSBHTF9ERVRBSUxfVEVYVFVSRV9MRVZFTF9TR0lTICAgICAgMHg4MDlBCi0jZGVmaW5lIEdMX0RFVEFJTF9URVhUVVJFX01PREVfU0dJUyAgICAgICAweDgwOUIKLSNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfRlVOQ19QT0lOVFNfU0dJUyAweDgwOUMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVNfc2hhcnBlbl90ZXh0dXJlCi0jZGVmaW5lIEdMX0xJTkVBUl9TSEFSUEVOX1NHSVMgICAgICAgICAgICAweDgwQUQKLSNkZWZpbmUgR0xfTElORUFSX1NIQVJQRU5fQUxQSEFfU0dJUyAgICAgIDB4ODBBRQotI2RlZmluZSBHTF9MSU5FQVJfU0hBUlBFTl9DT0xPUl9TR0lTICAgICAgMHg4MEFGCi0jZGVmaW5lIEdMX1NIQVJQRU5fVEVYVFVSRV9GVU5DX1BPSU5UU19TR0lTIDB4ODBCMAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3BhY2tlZF9waXhlbHMKLSNkZWZpbmUgR0xfVU5TSUdORURfQllURV8zXzNfMl9FWFQgICAgICAgIDB4ODAzMgotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X0VYVCAgICAgMHg4MDMzCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzFfRVhUICAgICAweDgwMzQKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfRVhUICAgICAgIDB4ODAzNQotI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMl9FWFQgICAgMHg4MDM2Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfbG9kCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0xPRF9TR0lTICAgICAgICAgICAweDgxM0EKLSNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTE9EX1NHSVMgICAgICAgICAgIDB4ODEzQgotI2RlZmluZSBHTF9URVhUVVJFX0JBU0VfTEVWRUxfU0dJUyAgICAgICAgMHg4MTNDCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0xFVkVMX1NHSVMgICAgICAgICAweDgxM0QKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVNfbXVsdGlzYW1wbGUKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfU0dJUyAgICAgICAgICAgICAgIDB4ODA5RAotI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fTUFTS19TR0lTICAgICAgMHg4MDlFCi0jZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkVfU0dJUyAgICAgICAweDgwOUYKLSNkZWZpbmUgR0xfU0FNUExFX01BU0tfU0dJUyAgICAgICAgICAgICAgIDB4ODBBMAotI2RlZmluZSBHTF8xUEFTU19TR0lTICAgICAgICAgICAgICAgICAgICAgMHg4MEExCi0jZGVmaW5lIEdMXzJQQVNTXzBfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTIKLSNkZWZpbmUgR0xfMlBBU1NfMV9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBMwotI2RlZmluZSBHTF80UEFTU18wX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE0Ci0jZGVmaW5lIEdMXzRQQVNTXzFfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTUKLSNkZWZpbmUgR0xfNFBBU1NfMl9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBNgotI2RlZmluZSBHTF80UEFTU18zX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE3Ci0jZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTX1NHSVMgICAgICAgICAgICAweDgwQTgKLSNkZWZpbmUgR0xfU0FNUExFU19TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBOQotI2RlZmluZSBHTF9TQU1QTEVfTUFTS19WQUxVRV9TR0lTICAgICAgICAgMHg4MEFBCi0jZGVmaW5lIEdMX1NBTVBMRV9NQVNLX0lOVkVSVF9TR0lTICAgICAgICAweDgwQUIKLSNkZWZpbmUgR0xfU0FNUExFX1BBVFRFUk5fU0dJUyAgICAgICAgICAgIDB4ODBBQwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3Jlc2NhbGVfbm9ybWFsCi0jZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMX0VYVCAgICAgICAgICAgICAweDgwM0EKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfYXJyYXkKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0VYVCAgICAgICAgICAgICAgIDB4ODA3NAotI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfRVhUICAgICAgICAgICAgICAgMHg4MDc1Ci0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0VYVCAgICAgICAgICAgICAgICAweDgwNzYKLSNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfRVhUICAgICAgICAgICAgICAgIDB4ODA3NwotI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0VYVCAgICAgICAgMHg4MDc4Ci0jZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9FWFQgICAgICAgICAgICAweDgwNzkKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NJWkVfRVhUICAgICAgICAgIDB4ODA3QQotI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgMHg4MDdCCi0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREVfRVhUICAgICAgICAweDgwN0MKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgIDB4ODA3RAotI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgMHg4MDdFCi0jZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9TVFJJREVfRVhUICAgICAgICAweDgwN0YKLSNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgIDB4ODA4MAotI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TSVpFX0VYVCAgICAgICAgICAgMHg4MDgxCi0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1RZUEVfRVhUICAgICAgICAgICAweDgwODIKLSNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfU1RSSURFX0VYVCAgICAgICAgIDB4ODA4MwotI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9DT1VOVF9FWFQgICAgICAgICAgMHg4MDg0Ci0jZGVmaW5lIEdMX0lOREVYX0FSUkFZX1RZUEVfRVhUICAgICAgICAgICAweDgwODUKLSNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfU1RSSURFX0VYVCAgICAgICAgIDB4ODA4NgotI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9DT1VOVF9FWFQgICAgICAgICAgMHg4MDg3Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRV9FWFQgICAweDgwODgKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFX0VYVCAgIDB4ODA4OQotI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERV9FWFQgMHg4MDhBCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQ09VTlRfRVhUICAweDgwOEIKLSNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX1NUUklERV9FWFQgICAgIDB4ODA4QwotI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfQ09VTlRfRVhUICAgICAgMHg4MDhECi0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSX0VYVCAgICAgICAweDgwOEUKLSNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1BPSU5URVJfRVhUICAgICAgIDB4ODA4RgotI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSX0VYVCAgICAgICAgMHg4MDkwCi0jZGVmaW5lIEdMX0lOREVYX0FSUkFZX1BPSU5URVJfRVhUICAgICAgICAweDgwOTEKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSX0VYVCAweDgwOTIKLSNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX1BPSU5URVJfRVhUICAgIDB4ODA5MwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX21pc2NfYXR0cmlidXRlCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX2dlbmVyYXRlX21pcG1hcAotI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVBfU0dJUyAgICAgICAgICAgMHg4MTkxCi0jZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UX1NHSVMgICAgICAweDgxOTIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfY2xpcG1hcAotI2RlZmluZSBHTF9MSU5FQVJfQ0xJUE1BUF9MSU5FQVJfU0dJWCAgICAgMHg4MTcwCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9DRU5URVJfU0dJWCAgICAweDgxNzEKLSNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0ZSQU1FX1NHSVggICAgIDB4ODE3MgotI2RlZmluZSBHTF9URVhUVVJFX0NMSVBNQVBfT0ZGU0VUX1NHSVggICAgMHg4MTczCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9WSVJUVUFMX0RFUFRIX1NHSVggMHg4MTc0Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9MT0RfT0ZGU0VUX1NHSVggMHg4MTc1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9ERVBUSF9TR0lYICAgICAweDgxNzYKLSNkZWZpbmUgR0xfTUFYX0NMSVBNQVBfREVQVEhfU0dJWCAgICAgICAgIDB4ODE3NwotI2RlZmluZSBHTF9NQVhfQ0xJUE1BUF9WSVJUVUFMX0RFUFRIX1NHSVggMHg4MTc4Ci0jZGVmaW5lIEdMX05FQVJFU1RfQ0xJUE1BUF9ORUFSRVNUX1NHSVggICAweDg0NEQKLSNkZWZpbmUgR0xfTkVBUkVTVF9DTElQTUFQX0xJTkVBUl9TR0lYICAgIDB4ODQ0RQotI2RlZmluZSBHTF9MSU5FQVJfQ0xJUE1BUF9ORUFSRVNUX1NHSVggICAgMHg4NDRGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3NoYWRvdwotI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfU0dJWCAgICAgICAgICAgMHg4MTlBCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9PUEVSQVRPUl9TR0lYICAweDgxOUIKLSNkZWZpbmUgR0xfVEVYVFVSRV9MRVFVQUxfUl9TR0lYICAgICAgICAgIDB4ODE5QwotI2RlZmluZSBHTF9URVhUVVJFX0dFUVVBTF9SX1NHSVggICAgICAgICAgMHg4MTlECi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfZWRnZV9jbGFtcAotI2RlZmluZSBHTF9DTEFNUF9UT19FREdFX1NHSVMgICAgICAgICAgICAgMHg4MTJGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfYm9yZGVyX2NsYW1wCi0jZGVmaW5lIEdMX0NMQU1QX1RPX0JPUkRFUl9TR0lTICAgICAgICAgICAweDgxMkQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9ibGVuZF9taW5tYXgKLSNkZWZpbmUgR0xfRlVOQ19BRERfRVhUICAgICAgICAgICAgICAgICAgIDB4ODAwNgotI2RlZmluZSBHTF9NSU5fRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA3Ci0jZGVmaW5lIEdMX01BWF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDgKLSNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fRVhUICAgICAgICAgICAgIDB4ODAwOQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX3N1YnRyYWN0Ci0jZGVmaW5lIEdMX0ZVTkNfU1VCVFJBQ1RfRVhUICAgICAgICAgICAgICAweDgwMEEKLSNkZWZpbmUgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUX0VYVCAgICAgIDB4ODAwQgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX2xvZ2ljX29wCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX2ludGVybGFjZQotI2RlZmluZSBHTF9JTlRFUkxBQ0VfU0dJWCAgICAgICAgICAgICAgICAgMHg4MDk0Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3BpeGVsX3RpbGVzCi0jZGVmaW5lIEdMX1BJWEVMX1RJTEVfQkVTVF9BTElHTk1FTlRfU0dJWCAweDgxM0UKLSNkZWZpbmUgR0xfUElYRUxfVElMRV9DQUNIRV9JTkNSRU1FTlRfU0dJWCAweDgxM0YKLSNkZWZpbmUgR0xfUElYRUxfVElMRV9XSURUSF9TR0lYICAgICAgICAgIDB4ODE0MAotI2RlZmluZSBHTF9QSVhFTF9USUxFX0hFSUdIVF9TR0lYICAgICAgICAgMHg4MTQxCi0jZGVmaW5lIEdMX1BJWEVMX1RJTEVfR1JJRF9XSURUSF9TR0lYICAgICAweDgxNDIKLSNkZWZpbmUgR0xfUElYRUxfVElMRV9HUklEX0hFSUdIVF9TR0lYICAgIDB4ODE0MwotI2RlZmluZSBHTF9QSVhFTF9USUxFX0dSSURfREVQVEhfU0dJWCAgICAgMHg4MTQ0Ci0jZGVmaW5lIEdMX1BJWEVMX1RJTEVfQ0FDSEVfU0laRV9TR0lYICAgICAweDgxNDUKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9zZWxlY3QKLSNkZWZpbmUgR0xfRFVBTF9BTFBIQTRfU0dJUyAgICAgICAgICAgICAgIDB4ODExMAotI2RlZmluZSBHTF9EVUFMX0FMUEhBOF9TR0lTICAgICAgICAgICAgICAgMHg4MTExCi0jZGVmaW5lIEdMX0RVQUxfQUxQSEExMl9TR0lTICAgICAgICAgICAgICAweDgxMTIKLSNkZWZpbmUgR0xfRFVBTF9BTFBIQTE2X1NHSVMgICAgICAgICAgICAgIDB4ODExMwotI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRTRfU0dJUyAgICAgICAgICAgMHg4MTE0Ci0jZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFOF9TR0lTICAgICAgICAgICAweDgxMTUKLSNkZWZpbmUgR0xfRFVBTF9MVU1JTkFOQ0UxMl9TR0lTICAgICAgICAgIDB4ODExNgotI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRTE2X1NHSVMgICAgICAgICAgMHg4MTE3Ci0jZGVmaW5lIEdMX0RVQUxfSU5URU5TSVRZNF9TR0lTICAgICAgICAgICAweDgxMTgKLSNkZWZpbmUgR0xfRFVBTF9JTlRFTlNJVFk4X1NHSVMgICAgICAgICAgIDB4ODExOQotI2RlZmluZSBHTF9EVUFMX0lOVEVOU0lUWTEyX1NHSVMgICAgICAgICAgMHg4MTFBCi0jZGVmaW5lIEdMX0RVQUxfSU5URU5TSVRZMTZfU0dJUyAgICAgICAgICAweDgxMUIKLSNkZWZpbmUgR0xfRFVBTF9MVU1JTkFOQ0VfQUxQSEE0X1NHSVMgICAgIDB4ODExQwotI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRV9BTFBIQThfU0dJUyAgICAgMHg4MTFECi0jZGVmaW5lIEdMX1FVQURfQUxQSEE0X1NHSVMgICAgICAgICAgICAgICAweDgxMUUKLSNkZWZpbmUgR0xfUVVBRF9BTFBIQThfU0dJUyAgICAgICAgICAgICAgIDB4ODExRgotI2RlZmluZSBHTF9RVUFEX0xVTUlOQU5DRTRfU0dJUyAgICAgICAgICAgMHg4MTIwCi0jZGVmaW5lIEdMX1FVQURfTFVNSU5BTkNFOF9TR0lTICAgICAgICAgICAweDgxMjEKLSNkZWZpbmUgR0xfUVVBRF9JTlRFTlNJVFk0X1NHSVMgICAgICAgICAgIDB4ODEyMgotI2RlZmluZSBHTF9RVUFEX0lOVEVOU0lUWThfU0dJUyAgICAgICAgICAgMHg4MTIzCi0jZGVmaW5lIEdMX0RVQUxfVEVYVFVSRV9TRUxFQ1RfU0dJUyAgICAgICAweDgxMjQKLSNkZWZpbmUgR0xfUVVBRF9URVhUVVJFX1NFTEVDVF9TR0lTICAgICAgIDB4ODEyNQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9zcHJpdGUKLSNkZWZpbmUgR0xfU1BSSVRFX1NHSVggICAgICAgICAgICAgICAgICAgIDB4ODE0OAotI2RlZmluZSBHTF9TUFJJVEVfTU9ERV9TR0lYICAgICAgICAgICAgICAgMHg4MTQ5Ci0jZGVmaW5lIEdMX1NQUklURV9BWElTX1NHSVggICAgICAgICAgICAgICAweDgxNEEKLSNkZWZpbmUgR0xfU1BSSVRFX1RSQU5TTEFUSU9OX1NHSVggICAgICAgIDB4ODE0QgotI2RlZmluZSBHTF9TUFJJVEVfQVhJQUxfU0dJWCAgICAgICAgICAgICAgMHg4MTRDCi0jZGVmaW5lIEdMX1NQUklURV9PQkpFQ1RfQUxJR05FRF9TR0lYICAgICAweDgxNEQKLSNkZWZpbmUgR0xfU1BSSVRFX0VZRV9BTElHTkVEX1NHSVggICAgICAgIDB4ODE0RQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX211bHRpX2J1ZmZlcgotI2RlZmluZSBHTF9URVhUVVJFX01VTFRJX0JVRkZFUl9ISU5UX1NHSVggMHg4MTJFCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfcG9pbnRfcGFyYW1ldGVycwotI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTl9FWFQgICAgICAgICAgICAgMHg4MTI2Ci0jZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYX0VYVCAgICAgICAgICAgICAweDgxMjcKLSNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRV9FWFQgIDB4ODEyOAotI2RlZmluZSBHTF9ESVNUQU5DRV9BVFRFTlVBVElPTl9FWFQgICAgICAgMHg4MTI5Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3BvaW50X3BhcmFtZXRlcnMKLSNkZWZpbmUgR0xfUE9JTlRfU0laRV9NSU5fU0dJUyAgICAgICAgICAgIDB4ODEyNgotI2RlZmluZSBHTF9QT0lOVF9TSVpFX01BWF9TR0lTICAgICAgICAgICAgMHg4MTI3Ci0jZGVmaW5lIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkVfU0dJUyAweDgxMjgKLSNkZWZpbmUgR0xfRElTVEFOQ0VfQVRURU5VQVRJT05fU0dJUyAgICAgIDB4ODEyOQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9pbnN0cnVtZW50cwotI2RlZmluZSBHTF9JTlNUUlVNRU5UX0JVRkZFUl9QT0lOVEVSX1NHSVggMHg4MTgwCi0jZGVmaW5lIEdMX0lOU1RSVU1FTlRfTUVBU1VSRU1FTlRTX1NHSVggICAweDgxODEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9zY2FsZV9iaWFzCi0jZGVmaW5lIEdMX1BPU1RfVEVYVFVSRV9GSUxURVJfQklBU19TR0lYICAweDgxNzkKLSNkZWZpbmUgR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9TQ0FMRV9TR0lYIDB4ODE3QQotI2RlZmluZSBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX0JJQVNfUkFOR0VfU0dJWCAweDgxN0IKLSNkZWZpbmUgR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9TQ0FMRV9SQU5HRV9TR0lYIDB4ODE3QwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9mcmFtZXpvb20KLSNkZWZpbmUgR0xfRlJBTUVaT09NX1NHSVggICAgICAgICAgICAgICAgIDB4ODE4QgotI2RlZmluZSBHTF9GUkFNRVpPT01fRkFDVE9SX1NHSVggICAgICAgICAgMHg4MThDCi0jZGVmaW5lIEdMX01BWF9GUkFNRVpPT01fRkFDVE9SX1NHSVggICAgICAweDgxOEQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfdGFnX3NhbXBsZV9idWZmZXIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0ZmZE1hc2tTR0lYCi0jZGVmaW5lIEdMX1RFWFRVUkVfREVGT1JNQVRJT05fQklUX1NHSVggICAweDAwMDAwMDAxCi0jZGVmaW5lIEdMX0dFT01FVFJZX0RFRk9STUFUSU9OX0JJVF9TR0lYICAweDAwMDAwMDAyCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3BvbHlub21pYWxfZmZkCi0jZGVmaW5lIEdMX0dFT01FVFJZX0RFRk9STUFUSU9OX1NHSVggICAgICAweDgxOTQKLSNkZWZpbmUgR0xfVEVYVFVSRV9ERUZPUk1BVElPTl9TR0lYICAgICAgIDB4ODE5NQotI2RlZmluZSBHTF9ERUZPUk1BVElPTlNfTUFTS19TR0lYICAgICAgICAgMHg4MTk2Ci0jZGVmaW5lIEdMX01BWF9ERUZPUk1BVElPTl9PUkRFUl9TR0lYICAgICAweDgxOTcKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfcmVmZXJlbmNlX3BsYW5lCi0jZGVmaW5lIEdMX1JFRkVSRU5DRV9QTEFORV9TR0lYICAgICAgICAgICAweDgxN0QKLSNkZWZpbmUgR0xfUkVGRVJFTkNFX1BMQU5FX0VRVUFUSU9OX1NHSVggIDB4ODE3RQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9mbHVzaF9yYXN0ZXIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfZGVwdGhfdGV4dHVyZQotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNl9TR0lYICAgICAgICAgMHg4MUE1Ci0jZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDI0X1NHSVggICAgICAgICAweDgxQTYKLSNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzJfU0dJWCAgICAgICAgIDB4ODFBNwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJU19mb2dfZnVuY3Rpb24KLSNkZWZpbmUgR0xfRk9HX0ZVTkNfU0dJUyAgICAgICAgICAgICAgICAgIDB4ODEyQQotI2RlZmluZSBHTF9GT0dfRlVOQ19QT0lOVFNfU0dJUyAgICAgICAgICAgMHg4MTJCCi0jZGVmaW5lIEdMX01BWF9GT0dfRlVOQ19QT0lOVFNfU0dJUyAgICAgICAweDgxMkMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfZm9nX29mZnNldAotI2RlZmluZSBHTF9GT0dfT0ZGU0VUX1NHSVggICAgICAgICAgICAgICAgMHg4MTk4Ci0jZGVmaW5lIEdMX0ZPR19PRkZTRVRfVkFMVUVfU0dJWCAgICAgICAgICAweDgxOTkKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0hQX2ltYWdlX3RyYW5zZm9ybQotI2RlZmluZSBHTF9JTUFHRV9TQ0FMRV9YX0hQICAgICAgICAgICAgICAgMHg4MTU1Ci0jZGVmaW5lIEdMX0lNQUdFX1NDQUxFX1lfSFAgICAgICAgICAgICAgICAweDgxNTYKLSNkZWZpbmUgR0xfSU1BR0VfVFJBTlNMQVRFX1hfSFAgICAgICAgICAgIDB4ODE1NwotI2RlZmluZSBHTF9JTUFHRV9UUkFOU0xBVEVfWV9IUCAgICAgICAgICAgMHg4MTU4Ci0jZGVmaW5lIEdMX0lNQUdFX1JPVEFURV9BTkdMRV9IUCAgICAgICAgICAweDgxNTkKLSNkZWZpbmUgR0xfSU1BR0VfUk9UQVRFX09SSUdJTl9YX0hQICAgICAgIDB4ODE1QQotI2RlZmluZSBHTF9JTUFHRV9ST1RBVEVfT1JJR0lOX1lfSFAgICAgICAgMHg4MTVCCi0jZGVmaW5lIEdMX0lNQUdFX01BR19GSUxURVJfSFAgICAgICAgICAgICAweDgxNUMKLSNkZWZpbmUgR0xfSU1BR0VfTUlOX0ZJTFRFUl9IUCAgICAgICAgICAgIDB4ODE1RAotI2RlZmluZSBHTF9JTUFHRV9DVUJJQ19XRUlHSFRfSFAgICAgICAgICAgMHg4MTVFCi0jZGVmaW5lIEdMX0NVQklDX0hQICAgICAgICAgICAgICAgICAgICAgICAweDgxNUYKLSNkZWZpbmUgR0xfQVZFUkFHRV9IUCAgICAgICAgICAgICAgICAgICAgIDB4ODE2MAotI2RlZmluZSBHTF9JTUFHRV9UUkFOU0ZPUk1fMkRfSFAgICAgICAgICAgMHg4MTYxCi0jZGVmaW5lIEdMX1BPU1RfSU1BR0VfVFJBTlNGT1JNX0NPTE9SX1RBQkxFX0hQIDB4ODE2MgotI2RlZmluZSBHTF9QUk9YWV9QT1NUX0lNQUdFX1RSQU5TRk9STV9DT0xPUl9UQUJMRV9IUCAweDgxNjMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0hQX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcwotI2RlZmluZSBHTF9JR05PUkVfQk9SREVSX0hQICAgICAgICAgICAgICAgMHg4MTUwCi0jZGVmaW5lIEdMX0NPTlNUQU5UX0JPUkRFUl9IUCAgICAgICAgICAgICAweDgxNTEKLSNkZWZpbmUgR0xfUkVQTElDQVRFX0JPUkRFUl9IUCAgICAgICAgICAgIDB4ODE1MwotI2RlZmluZSBHTF9DT05WT0xVVElPTl9CT1JERVJfQ09MT1JfSFAgICAgMHg4MTU0Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9JTkdSX3BhbGV0dGVfYnVmZmVyCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfYWRkX2VudgotI2RlZmluZSBHTF9URVhUVVJFX0VOVl9CSUFTX1NHSVggICAgICAgICAgMHg4MEJFCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfY29sb3Jfc3VidGFibGUKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1BHSV92ZXJ0ZXhfaGludHMKLSNkZWZpbmUgR0xfVkVSVEVYX0RBVEFfSElOVF9QR0kgICAgICAgICAgIDB4MUEyMkEKLSNkZWZpbmUgR0xfVkVSVEVYX0NPTlNJU1RFTlRfSElOVF9QR0kgICAgIDB4MUEyMkIKLSNkZWZpbmUgR0xfTUFURVJJQUxfU0lERV9ISU5UX1BHSSAgICAgICAgIDB4MUEyMkMKLSNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9ISU5UX1BHSSAgICAgICAgICAgIDB4MUEyMkQKLSNkZWZpbmUgR0xfQ09MT1IzX0JJVF9QR0kgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgR0xfQ09MT1I0X0JJVF9QR0kgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgR0xfRURHRUZMQUdfQklUX1BHSSAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgR0xfSU5ERVhfQklUX1BHSSAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgR0xfTUFUX0FNQklFTlRfQklUX1BHSSAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgR0xfTUFUX0FNQklFTlRfQU5EX0RJRkZVU0VfQklUX1BHSSAweDAwMjAwMDAwCi0jZGVmaW5lIEdMX01BVF9ESUZGVVNFX0JJVF9QR0kgICAgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIEdMX01BVF9FTUlTU0lPTl9CSVRfUEdJICAgICAgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIEdMX01BVF9DT0xPUl9JTkRFWEVTX0JJVF9QR0kgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIEdMX01BVF9TSElOSU5FU1NfQklUX1BHSSAgICAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIEdMX01BVF9TUEVDVUxBUl9CSVRfUEdJICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIEdMX05PUk1BTF9CSVRfUEdJICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIEdMX1RFWENPT1JEMV9CSVRfUEdJICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIEdMX1RFWENPT1JEMl9CSVRfUEdJICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIEdMX1RFWENPT1JEM19CSVRfUEdJICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEdMX1RFWENPT1JENF9CSVRfUEdJICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIEdMX1ZFUlRFWDIzX0JJVF9QR0kgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEdMX1ZFUlRFWDRfQklUX1BHSSAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9QR0lfbWlzY19oaW50cwotI2RlZmluZSBHTF9QUkVGRVJfRE9VQkxFQlVGRkVSX0hJTlRfUEdJICAgMHgxQTFGOAotI2RlZmluZSBHTF9DT05TRVJWRV9NRU1PUllfSElOVF9QR0kgICAgICAgMHgxQTFGRAotI2RlZmluZSBHTF9SRUNMQUlNX01FTU9SWV9ISU5UX1BHSSAgICAgICAgMHgxQTFGRQotI2RlZmluZSBHTF9OQVRJVkVfR1JBUEhJQ1NfSEFORExFX1BHSSAgICAgMHgxQTIwMgotI2RlZmluZSBHTF9OQVRJVkVfR1JBUEhJQ1NfQkVHSU5fSElOVF9QR0kgMHgxQTIwMwotI2RlZmluZSBHTF9OQVRJVkVfR1JBUEhJQ1NfRU5EX0hJTlRfUEdJICAgMHgxQTIwNAotI2RlZmluZSBHTF9BTFdBWVNfRkFTVF9ISU5UX1BHSSAgICAgICAgICAgMHgxQTIwQwotI2RlZmluZSBHTF9BTFdBWVNfU09GVF9ISU5UX1BHSSAgICAgICAgICAgMHgxQTIwRAotI2RlZmluZSBHTF9BTExPV19EUkFXX09CSl9ISU5UX1BHSSAgICAgICAgMHgxQTIwRQotI2RlZmluZSBHTF9BTExPV19EUkFXX1dJTl9ISU5UX1BHSSAgICAgICAgMHgxQTIwRgotI2RlZmluZSBHTF9BTExPV19EUkFXX0ZSR19ISU5UX1BHSSAgICAgICAgMHgxQTIxMAotI2RlZmluZSBHTF9BTExPV19EUkFXX01FTV9ISU5UX1BHSSAgICAgICAgMHgxQTIxMQotI2RlZmluZSBHTF9TVFJJQ1RfREVQVEhGVU5DX0hJTlRfUEdJICAgICAgMHgxQTIxNgotI2RlZmluZSBHTF9TVFJJQ1RfTElHSFRJTkdfSElOVF9QR0kgICAgICAgMHgxQTIxNwotI2RlZmluZSBHTF9TVFJJQ1RfU0NJU1NPUl9ISU5UX1BHSSAgICAgICAgMHgxQTIxOAotI2RlZmluZSBHTF9GVUxMX1NUSVBQTEVfSElOVF9QR0kgICAgICAgICAgMHgxQTIxOQotI2RlZmluZSBHTF9DTElQX05FQVJfSElOVF9QR0kgICAgICAgICAgICAgMHgxQTIyMAotI2RlZmluZSBHTF9DTElQX0ZBUl9ISU5UX1BHSSAgICAgICAgICAgICAgMHgxQTIyMQotI2RlZmluZSBHTF9XSURFX0xJTkVfSElOVF9QR0kgICAgICAgICAgICAgMHgxQTIyMgotI2RlZmluZSBHTF9CQUNLX05PUk1BTFNfSElOVF9QR0kgICAgICAgICAgMHgxQTIyMwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUKLSNkZWZpbmUgR0xfQ09MT1JfSU5ERVgxX0VYVCAgICAgICAgICAgICAgIDB4ODBFMgotI2RlZmluZSBHTF9DT0xPUl9JTkRFWDJfRVhUICAgICAgICAgICAgICAgMHg4MEUzCi0jZGVmaW5lIEdMX0NPTE9SX0lOREVYNF9FWFQgICAgICAgICAgICAgICAweDgwRTQKLSNkZWZpbmUgR0xfQ09MT1JfSU5ERVg4X0VYVCAgICAgICAgICAgICAgIDB4ODBFNQotI2RlZmluZSBHTF9DT0xPUl9JTkRFWDEyX0VYVCAgICAgICAgICAgICAgMHg4MEU2Ci0jZGVmaW5lIEdMX0NPTE9SX0lOREVYMTZfRVhUICAgICAgICAgICAgICAweDgwRTcKLSNkZWZpbmUgR0xfVEVYVFVSRV9JTkRFWF9TSVpFX0VYVCAgICAgICAgIDB4ODBFRAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2NsaXBfdm9sdW1lX2hpbnQKLSNkZWZpbmUgR0xfQ0xJUF9WT0xVTUVfQ0xJUFBJTkdfSElOVF9FWFQgIDB4ODBGMAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9saXN0X3ByaW9yaXR5Ci0jZGVmaW5lIEdMX0xJU1RfUFJJT1JJVFlfU0dJWCAgICAgICAgICAgICAweDgxODIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfaXJfaW5zdHJ1bWVudDEKLSNkZWZpbmUgR0xfSVJfSU5TVFJVTUVOVDFfU0dJWCAgICAgICAgICAgIDB4ODE3RgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9jYWxsaWdyYXBoaWNfZnJhZ21lbnQKLSNkZWZpbmUgR0xfQ0FMTElHUkFQSElDX0ZSQUdNRU5UX1NHSVggICAgIDB4ODE4MwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX2xvZF9iaWFzCi0jZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVNfU19TR0lYICAgICAgICAweDgxOEUKLSNkZWZpbmUgR0xfVEVYVFVSRV9MT0RfQklBU19UX1NHSVggICAgICAgIDB4ODE4RgotI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTX1JfU0dJWCAgICAgICAgMHg4MTkwCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3NoYWRvd19hbWJpZW50Ci0jZGVmaW5lIEdMX1NIQURPV19BTUJJRU5UX1NHSVggICAgICAgICAgICAweDgwQkYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9pbmRleF90ZXh0dXJlCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfaW5kZXhfbWF0ZXJpYWwKLSNkZWZpbmUgR0xfSU5ERVhfTUFURVJJQUxfRVhUICAgICAgICAgICAgIDB4ODFCOAotI2RlZmluZSBHTF9JTkRFWF9NQVRFUklBTF9QQVJBTUVURVJfRVhUICAgMHg4MUI5Ci0jZGVmaW5lIEdMX0lOREVYX01BVEVSSUFMX0ZBQ0VfRVhUICAgICAgICAweDgxQkEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9pbmRleF9mdW5jCi0jZGVmaW5lIEdMX0lOREVYX1RFU1RfRVhUICAgICAgICAgICAgICAgICAweDgxQjUKLSNkZWZpbmUgR0xfSU5ERVhfVEVTVF9GVU5DX0VYVCAgICAgICAgICAgIDB4ODFCNgotI2RlZmluZSBHTF9JTkRFWF9URVNUX1JFRl9FWFQgICAgICAgICAgICAgMHg4MUI3Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfaW5kZXhfYXJyYXlfZm9ybWF0cwotI2RlZmluZSBHTF9JVUlfVjJGX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MUFECi0jZGVmaW5lIEdMX0lVSV9WM0ZfRVhUICAgICAgICAgICAgICAgICAgICAweDgxQUUKLSNkZWZpbmUgR0xfSVVJX04zRl9WMkZfRVhUICAgICAgICAgICAgICAgIDB4ODFBRgotI2RlZmluZSBHTF9JVUlfTjNGX1YzRl9FWFQgICAgICAgICAgICAgICAgMHg4MUIwCi0jZGVmaW5lIEdMX1QyRl9JVUlfVjJGX0VYVCAgICAgICAgICAgICAgICAweDgxQjEKLSNkZWZpbmUgR0xfVDJGX0lVSV9WM0ZfRVhUICAgICAgICAgICAgICAgIDB4ODFCMgotI2RlZmluZSBHTF9UMkZfSVVJX04zRl9WMkZfRVhUICAgICAgICAgICAgMHg4MUIzCi0jZGVmaW5lIEdMX1QyRl9JVUlfTjNGX1YzRl9FWFQgICAgICAgICAgICAweDgxQjQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9jb21waWxlZF92ZXJ0ZXhfYXJyYXkKLSNkZWZpbmUgR0xfQVJSQVlfRUxFTUVOVF9MT0NLX0ZJUlNUX0VYVCAgIDB4ODFBOAotI2RlZmluZSBHTF9BUlJBWV9FTEVNRU5UX0xPQ0tfQ09VTlRfRVhUICAgMHg4MUE5Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfY3VsbF92ZXJ0ZXgKLSNkZWZpbmUgR0xfQ1VMTF9WRVJURVhfRVhUICAgICAgICAgICAgICAgIDB4ODFBQQotI2RlZmluZSBHTF9DVUxMX1ZFUlRFWF9FWUVfUE9TSVRJT05fRVhUICAgMHg4MUFCCi0jZGVmaW5lIEdMX0NVTExfVkVSVEVYX09CSkVDVF9QT1NJVElPTl9FWFQgMHg4MUFDCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3ljcmNiCi0jZGVmaW5lIEdMX1lDUkNCXzQyMl9TR0lYICAgICAgICAgICAgICAgICAweDgxQkIKLSNkZWZpbmUgR0xfWUNSQ0JfNDQ0X1NHSVggICAgICAgICAgICAgICAgIDB4ODFCQwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9mcmFnbWVudF9saWdodGluZwotI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVElOR19TR0lYICAgICAgICAgMHg4NDAwCi0jZGVmaW5lIEdMX0ZSQUdNRU5UX0NPTE9SX01BVEVSSUFMX1NHSVggICAweDg0MDEKLSNkZWZpbmUgR0xfRlJBR01FTlRfQ09MT1JfTUFURVJJQUxfRkFDRV9TR0lYIDB4ODQwMgotI2RlZmluZSBHTF9GUkFHTUVOVF9DT0xPUl9NQVRFUklBTF9QQVJBTUVURVJfU0dJWCAweDg0MDMKLSNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0xJR0hUU19TR0lYICAgICAgIDB4ODQwNAotI2RlZmluZSBHTF9NQVhfQUNUSVZFX0xJR0hUU19TR0lYICAgICAgICAgMHg4NDA1Ci0jZGVmaW5lIEdMX0NVUlJFTlRfUkFTVEVSX05PUk1BTF9TR0lYICAgICAweDg0MDYKLSNkZWZpbmUgR0xfTElHSFRfRU5WX01PREVfU0dJWCAgICAgICAgICAgIDB4ODQwNwotI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVJfU0dJWCAweDg0MDgKLSNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFRfTU9ERUxfVFdPX1NJREVfU0dJWCAweDg0MDkKLSNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFRfTU9ERUxfQU1CSUVOVF9TR0lYIDB4ODQwQQotI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9OT1JNQUxfSU5URVJQT0xBVElPTl9TR0lYIDB4ODQwQgotI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDBfU0dJWCAgICAgICAgICAgMHg4NDBDCi0jZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUMV9TR0lYICAgICAgICAgICAweDg0MEQKLSNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQyX1NHSVggICAgICAgICAgIDB4ODQwRQotI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDNfU0dJWCAgICAgICAgICAgMHg4NDBGCi0jZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUNF9TR0lYICAgICAgICAgICAweDg0MTAKLSNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQ1X1NHSVggICAgICAgICAgIDB4ODQxMQotI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDZfU0dJWCAgICAgICAgICAgMHg4NDEyCi0jZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUN19TR0lYICAgICAgICAgICAweDg0MTMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0lCTV9yYXN0ZXJwb3NfY2xpcAotI2RlZmluZSBHTF9SQVNURVJfUE9TSVRJT05fVU5DTElQUEVEX0lCTSAgMHgxOTI2MgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfSFBfdGV4dHVyZV9saWdodGluZwotI2RlZmluZSBHTF9URVhUVVJFX0xJR0hUSU5HX01PREVfSFAgICAgICAgMHg4MTY3Ci0jZGVmaW5lIEdMX1RFWFRVUkVfUE9TVF9TUEVDVUxBUl9IUCAgICAgICAweDgxNjgKLSNkZWZpbmUgR0xfVEVYVFVSRV9QUkVfU1BFQ1VMQVJfSFAgICAgICAgIDB4ODE2OQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2RyYXdfcmFuZ2VfZWxlbWVudHMKLSNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTX0VYVCAgICAgIDB4ODBFOAotI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFU19FWFQgICAgICAgMHg4MEU5Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9XSU5fcGhvbmdfc2hhZGluZwotI2RlZmluZSBHTF9QSE9OR19XSU4gICAgICAgICAgICAgICAgICAgICAgMHg4MEVBCi0jZGVmaW5lIEdMX1BIT05HX0hJTlRfV0lOICAgICAgICAgICAgICAgICAweDgwRUIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1dJTl9zcGVjdWxhcl9mb2cKLSNkZWZpbmUgR0xfRk9HX1NQRUNVTEFSX1RFWFRVUkVfV0lOICAgICAgIDB4ODBFQwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2xpZ2h0X3RleHR1cmUKLSNkZWZpbmUgR0xfRlJBR01FTlRfTUFURVJJQUxfRVhUICAgICAgICAgIDB4ODM0OQotI2RlZmluZSBHTF9GUkFHTUVOVF9OT1JNQUxfRVhUICAgICAgICAgICAgMHg4MzRBCi0jZGVmaW5lIEdMX0ZSQUdNRU5UX0NPTE9SX0VYVCAgICAgICAgICAgICAweDgzNEMKLSNkZWZpbmUgR0xfQVRURU5VQVRJT05fRVhUICAgICAgICAgICAgICAgIDB4ODM0RAotI2RlZmluZSBHTF9TSEFET1dfQVRURU5VQVRJT05fRVhUICAgICAgICAgMHg4MzRFCi0jZGVmaW5lIEdMX1RFWFRVUkVfQVBQTElDQVRJT05fTU9ERV9FWFQgICAweDgzNEYKLSNkZWZpbmUgR0xfVEVYVFVSRV9MSUdIVF9FWFQgICAgICAgICAgICAgIDB4ODM1MAotI2RlZmluZSBHTF9URVhUVVJFX01BVEVSSUFMX0ZBQ0VfRVhUICAgICAgMHg4MzUxCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUFURVJJQUxfUEFSQU1FVEVSX0VYVCAweDgzNTIKLS8qIHJldXNlIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCAqLwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9ibGVuZF9hbHBoYV9taW5tYXgKLSNkZWZpbmUgR0xfQUxQSEFfTUlOX1NHSVggICAgICAgICAgICAgICAgIDB4ODMyMAotI2RlZmluZSBHTF9BTFBIQV9NQVhfU0dJWCAgICAgICAgICAgICAgICAgMHg4MzIxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX2ltcGFjdF9waXhlbF90ZXh0dXJlCi0jZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fUV9DRUlMSU5HX1NHSVggICAweDgxODQKLSNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9RX1JPVU5EX1NHSVggICAgIDB4ODE4NQotI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX1FfRkxPT1JfU0dJWCAgICAgMHg4MTg2Ci0jZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fQUxQSEFfUkVQTEFDRV9TR0lYIDB4ODE4NwotI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX0FMUEhBX05PX1JFUExBQ0VfU0dJWCAweDgxODgKLSNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9BTFBIQV9MU19TR0lYICAgIDB4ODE4OQotI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX0FMUEhBX01TX1NHSVggICAgMHg4MThBCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfYmdyYQotI2RlZmluZSBHTF9CR1JfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUwCi0jZGVmaW5lIEdMX0JHUkFfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfYXN5bmMKLSNkZWZpbmUgR0xfQVNZTkNfTUFSS0VSX1NHSVggICAgICAgICAgICAgIDB4ODMyOQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9hc3luY19waXhlbAotI2RlZmluZSBHTF9BU1lOQ19URVhfSU1BR0VfU0dJWCAgICAgICAgICAgMHg4MzVDCi0jZGVmaW5lIEdMX0FTWU5DX0RSQVdfUElYRUxTX1NHSVggICAgICAgICAweDgzNUQKLSNkZWZpbmUgR0xfQVNZTkNfUkVBRF9QSVhFTFNfU0dJWCAgICAgICAgIDB4ODM1RQotI2RlZmluZSBHTF9NQVhfQVNZTkNfVEVYX0lNQUdFX1NHSVggICAgICAgMHg4MzVGCi0jZGVmaW5lIEdMX01BWF9BU1lOQ19EUkFXX1BJWEVMU19TR0lYICAgICAweDgzNjAKLSNkZWZpbmUgR0xfTUFYX0FTWU5DX1JFQURfUElYRUxTX1NHSVggICAgIDB4ODM2MQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9hc3luY19oaXN0b2dyYW0KLSNkZWZpbmUgR0xfQVNZTkNfSElTVE9HUkFNX1NHSVggICAgICAgICAgIDB4ODMyQwotI2RlZmluZSBHTF9NQVhfQVNZTkNfSElTVE9HUkFNX1NHSVggICAgICAgMHg4MzJECi0jZW5kaWYKLQotI2lmbmRlZiBHTF9JTlRFTF90ZXh0dXJlX3NjaXNzb3IKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0lOVEVMX3BhcmFsbGVsX2FycmF5cwotI2RlZmluZSBHTF9QQVJBTExFTF9BUlJBWVNfSU5URUwgICAgICAgICAgMHg4M0Y0Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9QQVJBTExFTF9QT0lOVEVSU19JTlRFTCAweDgzRjUKLSNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGNgotI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9QQVJBTExFTF9QT0lOVEVSU19JTlRFTCAweDgzRjcKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QQVJBTExFTF9QT0lOVEVSU19JTlRFTCAweDgzRjgKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0hQX29jY2x1c2lvbl90ZXN0Ci0jZGVmaW5lIEdMX09DQ0xVU0lPTl9URVNUX0hQICAgICAgICAgICAgICAweDgxNjUKLSNkZWZpbmUgR0xfT0NDTFVTSU9OX1RFU1RfUkVTVUxUX0hQICAgICAgIDB4ODE2NgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybQotI2RlZmluZSBHTF9QSVhFTF9UUkFOU0ZPUk1fMkRfRVhUICAgICAgICAgMHg4MzMwCi0jZGVmaW5lIEdMX1BJWEVMX01BR19GSUxURVJfRVhUICAgICAgICAgICAweDgzMzEKLSNkZWZpbmUgR0xfUElYRUxfTUlOX0ZJTFRFUl9FWFQgICAgICAgICAgIDB4ODMzMgotI2RlZmluZSBHTF9QSVhFTF9DVUJJQ19XRUlHSFRfRVhUICAgICAgICAgMHg4MzMzCi0jZGVmaW5lIEdMX0NVQklDX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgzMzQKLSNkZWZpbmUgR0xfQVZFUkFHRV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODMzNQotI2RlZmluZSBHTF9QSVhFTF9UUkFOU0ZPUk1fMkRfU1RBQ0tfREVQVEhfRVhUIDB4ODMzNgotI2RlZmluZSBHTF9NQVhfUElYRUxfVFJBTlNGT1JNXzJEX1NUQUNLX0RFUFRIX0VYVCAweDgzMzcKLSNkZWZpbmUgR0xfUElYRUxfVFJBTlNGT1JNXzJEX01BVFJJWF9FWFQgIDB4ODMzOAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybV9jb2xvcl90YWJsZQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3NoYXJlZF90ZXh0dXJlX3BhbGV0dGUKLSNkZWZpbmUgR0xfU0hBUkVEX1RFWFRVUkVfUEFMRVRURV9FWFQgICAgIDB4ODFGQgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3NlcGFyYXRlX3NwZWN1bGFyX2NvbG9yCi0jZGVmaW5lIEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0xfRVhUICAweDgxRjgKLSNkZWZpbmUgR0xfU0lOR0xFX0NPTE9SX0VYVCAgICAgICAgICAgICAgIDB4ODFGOQotI2RlZmluZSBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUl9FWFQgICAgMHg4MUZBCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yCi0jZGVmaW5lIEdMX0NPTE9SX1NVTV9FWFQgICAgICAgICAgICAgICAgICAweDg0NTgKLSNkZWZpbmUgR0xfQ1VSUkVOVF9TRUNPTkRBUllfQ09MT1JfRVhUICAgIDB4ODQ1OQotI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU0laRV9FWFQgMHg4NDVBCi0jZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9UWVBFX0VYVCAweDg0NUIKLSNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1NUUklERV9FWFQgMHg4NDVDCi0jZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9QT0lOVEVSX0VYVCAweDg0NUQKLSNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0VYVCAgICAgIDB4ODQ1RQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfcGVydHVyYl9ub3JtYWwKLSNkZWZpbmUgR0xfUEVSVFVSQl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODVBRQotI2RlZmluZSBHTF9URVhUVVJFX05PUk1BTF9FWFQgICAgICAgICAgICAgMHg4NUFGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9mb2dfY29vcmQKLSNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCAgICAgIDB4ODQ1MAotI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9FWFQgICAgICAgICAgICAgMHg4NDUxCi0jZGVmaW5lIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCAgICAgICAgICAgICAweDg0NTIKLSNkZWZpbmUgR0xfQ1VSUkVOVF9GT0dfQ09PUkRJTkFURV9FWFQgICAgIDB4ODQ1MwotI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9UWVBFX0VYVCAgMHg4NDU0Ci0jZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1NUUklERV9FWFQgMHg4NDU1Ci0jZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1BPSU5URVJfRVhUIDB4ODQ1NgotI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9FWFQgICAgICAgMHg4NDU3Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9SRU5EX3NjcmVlbl9jb29yZGluYXRlcwotI2RlZmluZSBHTF9TQ1JFRU5fQ09PUkRJTkFURVNfUkVORCAgICAgICAgMHg4NDkwCi0jZGVmaW5lIEdMX0lOVkVSVEVEX1NDUkVFTl9XX1JFTkQgICAgICAgICAweDg0OTEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9jb29yZGluYXRlX2ZyYW1lCi0jZGVmaW5lIEdMX1RBTkdFTlRfQVJSQVlfRVhUICAgICAgICAgICAgICAweDg0MzkKLSNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfRVhUICAgICAgICAgICAgIDB4ODQzQQotI2RlZmluZSBHTF9DVVJSRU5UX1RBTkdFTlRfRVhUICAgICAgICAgICAgMHg4NDNCCi0jZGVmaW5lIEdMX0NVUlJFTlRfQklOT1JNQUxfRVhUICAgICAgICAgICAweDg0M0MKLSNkZWZpbmUgR0xfVEFOR0VOVF9BUlJBWV9UWVBFX0VYVCAgICAgICAgIDB4ODQzRQotI2RlZmluZSBHTF9UQU5HRU5UX0FSUkFZX1NUUklERV9FWFQgICAgICAgMHg4NDNGCi0jZGVmaW5lIEdMX0JJTk9STUFMX0FSUkFZX1RZUEVfRVhUICAgICAgICAweDg0NDAKLSNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfU1RSSURFX0VYVCAgICAgIDB4ODQ0MQotI2RlZmluZSBHTF9UQU5HRU5UX0FSUkFZX1BPSU5URVJfRVhUICAgICAgMHg4NDQyCi0jZGVmaW5lIEdMX0JJTk9STUFMX0FSUkFZX1BPSU5URVJfRVhUICAgICAweDg0NDMKLSNkZWZpbmUgR0xfTUFQMV9UQU5HRU5UX0VYVCAgICAgICAgICAgICAgIDB4ODQ0NAotI2RlZmluZSBHTF9NQVAyX1RBTkdFTlRfRVhUICAgICAgICAgICAgICAgMHg4NDQ1Ci0jZGVmaW5lIEdMX01BUDFfQklOT1JNQUxfRVhUICAgICAgICAgICAgICAweDg0NDYKLSNkZWZpbmUgR0xfTUFQMl9CSU5PUk1BTF9FWFQgICAgICAgICAgICAgIDB4ODQ0NwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZW52X2NvbWJpbmUKLSNkZWZpbmUgR0xfQ09NQklORV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODU3MAotI2RlZmluZSBHTF9DT01CSU5FX1JHQl9FWFQgICAgICAgICAgICAgICAgMHg4NTcxCi0jZGVmaW5lIEdMX0NPTUJJTkVfQUxQSEFfRVhUICAgICAgICAgICAgICAweDg1NzIKLSNkZWZpbmUgR0xfUkdCX1NDQUxFX0VYVCAgICAgICAgICAgICAgICAgIDB4ODU3MwotI2RlZmluZSBHTF9BRERfU0lHTkVEX0VYVCAgICAgICAgICAgICAgICAgMHg4NTc0Ci0jZGVmaW5lIEdMX0lOVEVSUE9MQVRFX0VYVCAgICAgICAgICAgICAgICAweDg1NzUKLSNkZWZpbmUgR0xfQ09OU1RBTlRfRVhUICAgICAgICAgICAgICAgICAgIDB4ODU3NgotI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SX0VYVCAgICAgICAgICAgICAgMHg4NTc3Ci0jZGVmaW5lIEdMX1BSRVZJT1VTX0VYVCAgICAgICAgICAgICAgICAgICAweDg1NzgKLSNkZWZpbmUgR0xfU09VUkNFMF9SR0JfRVhUICAgICAgICAgICAgICAgIDB4ODU4MAotI2RlZmluZSBHTF9TT1VSQ0UxX1JHQl9FWFQgICAgICAgICAgICAgICAgMHg4NTgxCi0jZGVmaW5lIEdMX1NPVVJDRTJfUkdCX0VYVCAgICAgICAgICAgICAgICAweDg1ODIKLSNkZWZpbmUgR0xfU09VUkNFMF9BTFBIQV9FWFQgICAgICAgICAgICAgIDB4ODU4OAotI2RlZmluZSBHTF9TT1VSQ0UxX0FMUEhBX0VYVCAgICAgICAgICAgICAgMHg4NTg5Ci0jZGVmaW5lIEdMX1NPVVJDRTJfQUxQSEFfRVhUICAgICAgICAgICAgICAweDg1OEEKLSNkZWZpbmUgR0xfT1BFUkFORDBfUkdCX0VYVCAgICAgICAgICAgICAgIDB4ODU5MAotI2RlZmluZSBHTF9PUEVSQU5EMV9SR0JfRVhUICAgICAgICAgICAgICAgMHg4NTkxCi0jZGVmaW5lIEdMX09QRVJBTkQyX1JHQl9FWFQgICAgICAgICAgICAgICAweDg1OTIKLSNkZWZpbmUgR0xfT1BFUkFORDBfQUxQSEFfRVhUICAgICAgICAgICAgIDB4ODU5OAotI2RlZmluZSBHTF9PUEVSQU5EMV9BTFBIQV9FWFQgICAgICAgICAgICAgMHg4NTk5Ci0jZGVmaW5lIEdMX09QRVJBTkQyX0FMUEhBX0VYVCAgICAgICAgICAgICAweDg1OUEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FQUExFX3NwZWN1bGFyX3ZlY3RvcgotI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9TUEVDVUxBUl9WRUNUT1JfQVBQTEUgMHg4NUIwCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUFBMRV90cmFuc2Zvcm1faGludAotI2RlZmluZSBHTF9UUkFOU0ZPUk1fSElOVF9BUFBMRSAgICAgICAgICAgMHg4NUIxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX2ZvZ19zY2FsZQotI2RlZmluZSBHTF9GT0dfU0NBTEVfU0dJWCAgICAgICAgICAgICAgICAgMHg4MUZDCi0jZGVmaW5lIEdMX0ZPR19TQ0FMRV9WQUxVRV9TR0lYICAgICAgICAgICAweDgxRkQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NVTlhfY29uc3RhbnRfZGF0YQotI2RlZmluZSBHTF9VTlBBQ0tfQ09OU1RBTlRfREFUQV9TVU5YICAgICAgMHg4MUQ1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ09OU1RBTlRfREFUQV9TVU5YICAgICAweDgxRDYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NVTl9nbG9iYWxfYWxwaGEKLSNkZWZpbmUgR0xfR0xPQkFMX0FMUEhBX1NVTiAgICAgICAgICAgICAgIDB4ODFEOQotI2RlZmluZSBHTF9HTE9CQUxfQUxQSEFfRkFDVE9SX1NVTiAgICAgICAgMHg4MURBCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TVU5fdHJpYW5nbGVfbGlzdAotI2RlZmluZSBHTF9SRVNUQVJUX1NVTiAgICAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEdMX1JFUExBQ0VfTUlERExFX1NVTiAgICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgR0xfUkVQTEFDRV9PTERFU1RfU1VOICAgICAgICAgICAgIDB4MDAwMwotI2RlZmluZSBHTF9UUklBTkdMRV9MSVNUX1NVTiAgICAgICAgICAgICAgMHg4MUQ3Ci0jZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfU1VOICAgICAgICAgICAweDgxRDgKLSNkZWZpbmUgR0xfUkVQTEFDRU1FTlRfQ09ERV9BUlJBWV9TVU4gICAgIDB4ODVDMAotI2RlZmluZSBHTF9SRVBMQUNFTUVOVF9DT0RFX0FSUkFZX1RZUEVfU1VOIDB4ODVDMQotI2RlZmluZSBHTF9SRVBMQUNFTUVOVF9DT0RFX0FSUkFZX1NUUklERV9TVU4gMHg4NUMyCi0jZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfQVJSQVlfUE9JTlRFUl9TVU4gMHg4NUMzCi0jZGVmaW5lIEdMX1IxVUlfVjNGX1NVTiAgICAgICAgICAgICAgICAgICAweDg1QzQKLSNkZWZpbmUgR0xfUjFVSV9DNFVCX1YzRl9TVU4gICAgICAgICAgICAgIDB4ODVDNQotI2RlZmluZSBHTF9SMVVJX0MzRl9WM0ZfU1VOICAgICAgICAgICAgICAgMHg4NUM2Ci0jZGVmaW5lIEdMX1IxVUlfTjNGX1YzRl9TVU4gICAgICAgICAgICAgICAweDg1QzcKLSNkZWZpbmUgR0xfUjFVSV9DNEZfTjNGX1YzRl9TVU4gICAgICAgICAgIDB4ODVDOAotI2RlZmluZSBHTF9SMVVJX1QyRl9WM0ZfU1VOICAgICAgICAgICAgICAgMHg4NUM5Ci0jZGVmaW5lIEdMX1IxVUlfVDJGX04zRl9WM0ZfU1VOICAgICAgICAgICAweDg1Q0EKLSNkZWZpbmUgR0xfUjFVSV9UMkZfQzRGX04zRl9WM0ZfU1VOICAgICAgIDB4ODVDQgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU1VOX3ZlcnRleAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUKLSNkZWZpbmUgR0xfQkxFTkRfRFNUX1JHQl9FWFQgICAgICAgICAgICAgIDB4ODBDOAotI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCX0VYVCAgICAgICAgICAgICAgMHg4MEM5Ci0jZGVmaW5lIEdMX0JMRU5EX0RTVF9BTFBIQV9FWFQgICAgICAgICAgICAweDgwQ0EKLSNkZWZpbmUgR0xfQkxFTkRfU1JDX0FMUEhBX0VYVCAgICAgICAgICAgIDB4ODBDQgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfSU5HUl9jb2xvcl9jbGFtcAotI2RlZmluZSBHTF9SRURfTUlOX0NMQU1QX0lOR1IgICAgICAgICAgICAgMHg4NTYwCi0jZGVmaW5lIEdMX0dSRUVOX01JTl9DTEFNUF9JTkdSICAgICAgICAgICAweDg1NjEKLSNkZWZpbmUgR0xfQkxVRV9NSU5fQ0xBTVBfSU5HUiAgICAgICAgICAgIDB4ODU2MgotI2RlZmluZSBHTF9BTFBIQV9NSU5fQ0xBTVBfSU5HUiAgICAgICAgICAgMHg4NTYzCi0jZGVmaW5lIEdMX1JFRF9NQVhfQ0xBTVBfSU5HUiAgICAgICAgICAgICAweDg1NjQKLSNkZWZpbmUgR0xfR1JFRU5fTUFYX0NMQU1QX0lOR1IgICAgICAgICAgIDB4ODU2NQotI2RlZmluZSBHTF9CTFVFX01BWF9DTEFNUF9JTkdSICAgICAgICAgICAgMHg4NTY2Ci0jZGVmaW5lIEdMX0FMUEhBX01BWF9DTEFNUF9JTkdSICAgICAgICAgICAweDg1NjcKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0lOR1JfaW50ZXJsYWNlX3JlYWQKLSNkZWZpbmUgR0xfSU5URVJMQUNFX1JFQURfSU5HUiAgICAgICAgICAgIDB4ODU2OAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3N0ZW5jaWxfd3JhcAotI2RlZmluZSBHTF9JTkNSX1dSQVBfRVhUICAgICAgICAgICAgICAgICAgMHg4NTA3Ci0jZGVmaW5lIEdMX0RFQ1JfV1JBUF9FWFQgICAgICAgICAgICAgICAgICAweDg1MDgKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF80MjJfcGl4ZWxzCi0jZGVmaW5lIEdMXzQyMl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwQ0MKLSNkZWZpbmUgR0xfNDIyX1JFVl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBDRAotI2RlZmluZSBHTF80MjJfQVZFUkFHRV9FWFQgICAgICAgICAgICAgICAgMHg4MENFCi0jZGVmaW5lIEdMXzQyMl9SRVZfQVZFUkFHRV9FWFQgICAgICAgICAgICAweDgwQ0YKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3RleGdlbl9yZWZsZWN0aW9uCi0jZGVmaW5lIEdMX05PUk1BTF9NQVBfTlYgICAgICAgICAgICAgICAgICAweDg1MTEKLSNkZWZpbmUgR0xfUkVGTEVDVElPTl9NQVBfTlYgICAgICAgICAgICAgIDB4ODUxMgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY3ViZV9tYXAKLSNkZWZpbmUgR0xfTk9STUFMX01BUF9FWFQgICAgICAgICAgICAgICAgIDB4ODUxMQotI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUF9FWFQgICAgICAgICAgICAgMHg4NTEyCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfRVhUICAgICAgICAgICAweDg1MTMKLSNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX0VYVCAgIDB4ODUxNAotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfRVhUIDB4ODUxNQotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfRVhUIDB4ODUxNgotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfRVhUIDB4ODUxNwotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfRVhUIDB4ODUxOAotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfRVhUIDB4ODUxOQotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfRVhUIDB4ODUxQQotI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQX0VYVCAgICAgMHg4NTFCCi0jZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfRVhUICAweDg1MUMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NVTl9jb252b2x1dGlvbl9ib3JkZXJfbW9kZXMKLSNkZWZpbmUgR0xfV1JBUF9CT1JERVJfU1VOICAgICAgICAgICAgICAgIDB4ODFENAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZW52X2FkZAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfTE9EX0JJQVNfRVhUICAgICAgIDB4ODRGRAotI2RlZmluZSBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MX0VYVCAgICAgMHg4NTAwCi0jZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVNfRVhUICAgICAgICAgICAweDg1MDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYwotI2RlZmluZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAgICAgMHg4NEZFCi0jZGVmaW5lIEdMX01BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAweDg0RkYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfd2VpZ2h0aW5nCi0jZGVmaW5lIEdMX01PREVMVklFVzBfU1RBQ0tfREVQVEhfRVhUICAgICBHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMV9TVEFDS19ERVBUSF9FWFQgICAgIDB4ODUwMgotI2RlZmluZSBHTF9NT0RFTFZJRVcwX01BVFJJWF9FWFQgICAgICAgICAgR0xfTU9ERUxWSUVXX01BVFJJWAotI2RlZmluZSBHTF9NT0RFTFZJRVcxX01BVFJJWF9FWFQgICAgICAgICAgMHg4NTA2Ci0jZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRJTkdfRVhUICAgICAgICAgICAweDg1MDkKLSNkZWZpbmUgR0xfTU9ERUxWSUVXMF9FWFQgICAgICAgICAgICAgICAgIEdMX01PREVMVklFVwotI2RlZmluZSBHTF9NT0RFTFZJRVcxX0VYVCAgICAgICAgICAgICAgICAgMHg4NTBBCi0jZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX1dFSUdIVF9FWFQgICAgICAweDg1MEIKLSNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVF9BUlJBWV9FWFQgICAgICAgIDB4ODUwQwotI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX1NJWkVfRVhUICAgMHg4NTBECi0jZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfVFlQRV9FWFQgICAweDg1MEUKLSNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVF9BUlJBWV9TVFJJREVfRVhUIDB4ODUwRgotI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX1BPSU5URVJfRVhUIDB4ODUxMAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfbGlnaHRfbWF4X2V4cG9uZW50Ci0jZGVmaW5lIEdMX01BWF9TSElOSU5FU1NfTlYgICAgICAgICAgICAgICAweDg1MDQKLSNkZWZpbmUgR0xfTUFYX1NQT1RfRVhQT05FTlRfTlYgICAgICAgICAgIDB4ODUwNQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlCi0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9SQU5HRV9OViAgICAgICAgICAweDg1MUQKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX0xFTkdUSF9OViAgIDB4ODUxRQotI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfVkFMSURfTlYgICAgMHg4NTFGCi0jZGVmaW5lIEdMX01BWF9WRVJURVhfQVJSQVlfUkFOR0VfRUxFTUVOVF9OViAweDg1MjAKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX1BPSU5URVJfTlYgIDB4ODUyMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfcmVnaXN0ZXJfY29tYmluZXJzCi0jZGVmaW5lIEdMX1JFR0lTVEVSX0NPTUJJTkVSU19OViAgICAgICAgICAweDg1MjIKLSNkZWZpbmUgR0xfVkFSSUFCTEVfQV9OViAgICAgICAgICAgICAgICAgIDB4ODUyMwotI2RlZmluZSBHTF9WQVJJQUJMRV9CX05WICAgICAgICAgICAgICAgICAgMHg4NTI0Ci0jZGVmaW5lIEdMX1ZBUklBQkxFX0NfTlYgICAgICAgICAgICAgICAgICAweDg1MjUKLSNkZWZpbmUgR0xfVkFSSUFCTEVfRF9OViAgICAgICAgICAgICAgICAgIDB4ODUyNgotI2RlZmluZSBHTF9WQVJJQUJMRV9FX05WICAgICAgICAgICAgICAgICAgMHg4NTI3Ci0jZGVmaW5lIEdMX1ZBUklBQkxFX0ZfTlYgICAgICAgICAgICAgICAgICAweDg1MjgKLSNkZWZpbmUgR0xfVkFSSUFCTEVfR19OViAgICAgICAgICAgICAgICAgIDB4ODUyOQotI2RlZmluZSBHTF9DT05TVEFOVF9DT0xPUjBfTlYgICAgICAgICAgICAgMHg4NTJBCi0jZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SMV9OViAgICAgICAgICAgICAweDg1MkIKLSNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUl9OViAgICAgICAgICAgICAgIDB4ODUyQwotI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfTlYgICAgICAgICAgICAgMHg4NTJECi0jZGVmaW5lIEdMX1NQQVJFMF9OViAgICAgICAgICAgICAgICAgICAgICAweDg1MkUKLSNkZWZpbmUgR0xfU1BBUkUxX05WICAgICAgICAgICAgICAgICAgICAgIDB4ODUyRgotI2RlZmluZSBHTF9ESVNDQVJEX05WICAgICAgICAgICAgICAgICAgICAgMHg4NTMwCi0jZGVmaW5lIEdMX0VfVElNRVNfRl9OViAgICAgICAgICAgICAgICAgICAweDg1MzEKLSNkZWZpbmUgR0xfU1BBUkUwX1BMVVNfU0VDT05EQVJZX0NPTE9SX05WIDB4ODUzMgotI2RlZmluZSBHTF9VTlNJR05FRF9JREVOVElUWV9OViAgICAgICAgICAgMHg4NTM2Ci0jZGVmaW5lIEdMX1VOU0lHTkVEX0lOVkVSVF9OViAgICAgICAgICAgICAweDg1MzcKLSNkZWZpbmUgR0xfRVhQQU5EX05PUk1BTF9OViAgICAgICAgICAgICAgIDB4ODUzOAotI2RlZmluZSBHTF9FWFBBTkRfTkVHQVRFX05WICAgICAgICAgICAgICAgMHg4NTM5Ci0jZGVmaW5lIEdMX0hBTEZfQklBU19OT1JNQUxfTlYgICAgICAgICAgICAweDg1M0EKLSNkZWZpbmUgR0xfSEFMRl9CSUFTX05FR0FURV9OViAgICAgICAgICAgIDB4ODUzQgotI2RlZmluZSBHTF9TSUdORURfSURFTlRJVFlfTlYgICAgICAgICAgICAgMHg4NTNDCi0jZGVmaW5lIEdMX1NJR05FRF9ORUdBVEVfTlYgICAgICAgICAgICAgICAweDg1M0QKLSNkZWZpbmUgR0xfU0NBTEVfQllfVFdPX05WICAgICAgICAgICAgICAgIDB4ODUzRQotI2RlZmluZSBHTF9TQ0FMRV9CWV9GT1VSX05WICAgICAgICAgICAgICAgMHg4NTNGCi0jZGVmaW5lIEdMX1NDQUxFX0JZX09ORV9IQUxGX05WICAgICAgICAgICAweDg1NDAKLSNkZWZpbmUgR0xfQklBU19CWV9ORUdBVElWRV9PTkVfSEFMRl9OViAgIDB4ODU0MQotI2RlZmluZSBHTF9DT01CSU5FUl9JTlBVVF9OViAgICAgICAgICAgICAgMHg4NTQyCi0jZGVmaW5lIEdMX0NPTUJJTkVSX01BUFBJTkdfTlYgICAgICAgICAgICAweDg1NDMKLSNkZWZpbmUgR0xfQ09NQklORVJfQ09NUE9ORU5UX1VTQUdFX05WICAgIDB4ODU0NAotI2RlZmluZSBHTF9DT01CSU5FUl9BQl9ET1RfUFJPRFVDVF9OViAgICAgMHg4NTQ1Ci0jZGVmaW5lIEdMX0NPTUJJTkVSX0NEX0RPVF9QUk9EVUNUX05WICAgICAweDg1NDYKLSNkZWZpbmUgR0xfQ09NQklORVJfTVVYX1NVTV9OViAgICAgICAgICAgIDB4ODU0NwotI2RlZmluZSBHTF9DT01CSU5FUl9TQ0FMRV9OViAgICAgICAgICAgICAgMHg4NTQ4Ci0jZGVmaW5lIEdMX0NPTUJJTkVSX0JJQVNfTlYgICAgICAgICAgICAgICAweDg1NDkKLSNkZWZpbmUgR0xfQ09NQklORVJfQUJfT1VUUFVUX05WICAgICAgICAgIDB4ODU0QQotI2RlZmluZSBHTF9DT01CSU5FUl9DRF9PVVRQVVRfTlYgICAgICAgICAgMHg4NTRCCi0jZGVmaW5lIEdMX0NPTUJJTkVSX1NVTV9PVVRQVVRfTlYgICAgICAgICAweDg1NEMKLSNkZWZpbmUgR0xfTUFYX0dFTkVSQUxfQ09NQklORVJTX05WICAgICAgIDB4ODU0RAotI2RlZmluZSBHTF9OVU1fR0VORVJBTF9DT01CSU5FUlNfTlYgICAgICAgMHg4NTRFCi0jZGVmaW5lIEdMX0NPTE9SX1NVTV9DTEFNUF9OViAgICAgICAgICAgICAweDg1NEYKLSNkZWZpbmUgR0xfQ09NQklORVIwX05WICAgICAgICAgICAgICAgICAgIDB4ODU1MAotI2RlZmluZSBHTF9DT01CSU5FUjFfTlYgICAgICAgICAgICAgICAgICAgMHg4NTUxCi0jZGVmaW5lIEdMX0NPTUJJTkVSMl9OViAgICAgICAgICAgICAgICAgICAweDg1NTIKLSNkZWZpbmUgR0xfQ09NQklORVIzX05WICAgICAgICAgICAgICAgICAgIDB4ODU1MwotI2RlZmluZSBHTF9DT01CSU5FUjRfTlYgICAgICAgICAgICAgICAgICAgMHg4NTU0Ci0jZGVmaW5lIEdMX0NPTUJJTkVSNV9OViAgICAgICAgICAgICAgICAgICAweDg1NTUKLSNkZWZpbmUgR0xfQ09NQklORVI2X05WICAgICAgICAgICAgICAgICAgIDB4ODU1NgotI2RlZmluZSBHTF9DT01CSU5FUjdfTlYgICAgICAgICAgICAgICAgICAgMHg4NTU3Ci0vKiByZXVzZSBHTF9URVhUVVJFMF9BUkIgKi8KLS8qIHJldXNlIEdMX1RFWFRVUkUxX0FSQiAqLwotLyogcmV1c2UgR0xfWkVSTyAqLwotLyogcmV1c2UgR0xfTk9ORSAqLwotLyogcmV1c2UgR0xfRk9HICovCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9mb2dfZGlzdGFuY2UKLSNkZWZpbmUgR0xfRk9HX0RJU1RBTkNFX01PREVfTlYgICAgICAgICAgIDB4ODU1QQotI2RlZmluZSBHTF9FWUVfUkFESUFMX05WICAgICAgICAgICAgICAgICAgMHg4NTVCCi0jZGVmaW5lIEdMX0VZRV9QTEFORV9BQlNPTFVURV9OViAgICAgICAgICAweDg1NUMKLS8qIHJldXNlIEdMX0VZRV9QTEFORSAqLwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdGV4Z2VuX2VtYm9zcwotI2RlZmluZSBHTF9FTUJPU1NfTElHSFRfTlYgICAgICAgICAgICAgICAgMHg4NTVECi0jZGVmaW5lIEdMX0VNQk9TU19DT05TVEFOVF9OViAgICAgICAgICAgICAweDg1NUUKLSNkZWZpbmUgR0xfRU1CT1NTX01BUF9OViAgICAgICAgICAgICAgICAgIDB4ODU1RgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfYmxlbmRfc3F1YXJlCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNAotI2RlZmluZSBHTF9DT01CSU5FNF9OViAgICAgICAgICAgICAgICAgICAgMHg4NTAzCi0jZGVmaW5lIEdMX1NPVVJDRTNfUkdCX05WICAgICAgICAgICAgICAgICAweDg1ODMKLSNkZWZpbmUgR0xfU09VUkNFM19BTFBIQV9OViAgICAgICAgICAgICAgIDB4ODU4QgotI2RlZmluZSBHTF9PUEVSQU5EM19SR0JfTlYgICAgICAgICAgICAgICAgMHg4NTkzCi0jZGVmaW5lIEdMX09QRVJBTkQzX0FMUEhBX05WICAgICAgICAgICAgICAweDg1OUIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX01FU0FfcmVzaXplX2J1ZmZlcnMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX01FU0Ffd2luZG93X3BvcwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fczN0YwotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUICAgMHg4M0YwCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUICAweDgzRjEKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQgIDB4ODNGMgotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCAgMHg4M0YzCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9JQk1fY3VsbF92ZXJ0ZXgKLSNkZWZpbmUgR0xfQ1VMTF9WRVJURVhfSUJNICAgICAgICAgICAgICAgIDEwMzA1MAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfSUJNX211bHRpbW9kZV9kcmF3X2FycmF5cwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfSUJNX3ZlcnRleF9hcnJheV9saXN0cwotI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfTElTVF9JQk0gICAgICAgICAgMTAzMDcwCi0jZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAxMDMwNzEKLSNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfTElTVF9JQk0gICAgICAgICAgIDEwMzA3MgotI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAgMTAzMDczCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfTElTVF9JQk0gICAxMDMwNzQKLSNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0xJU1RfSUJNICAgICAgIDEwMzA3NQotI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9MSVNUX0lCTSAgMTAzMDc2Ci0jZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9MSVNUX0lCTSAxMDMwNzcKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0xJU1RfU1RSSURFX0lCTSAgIDEwMzA4MAotI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgMTAzMDgxCi0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0xJU1RfU1RSSURFX0lCTSAgICAxMDMwODIKLSNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgIDEwMzA4MwotI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0xJU1RfU1RSSURFX0lCTSAxMDMwODQKLSNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0xJU1RfU1RSSURFX0lCTSAxMDMwODUKLSNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NgotI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9zdWJzYW1wbGUKLSNkZWZpbmUgR0xfUEFDS19TVUJTQU1QTEVfUkFURV9TR0lYICAgICAgIDB4ODVBMAotI2RlZmluZSBHTF9VTlBBQ0tfU1VCU0FNUExFX1JBVEVfU0dJWCAgICAgMHg4NUExCi0jZGVmaW5lIEdMX1BJWEVMX1NVQlNBTVBMRV80NDQ0X1NHSVggICAgICAweDg1QTIKLSNkZWZpbmUgR0xfUElYRUxfU1VCU0FNUExFXzI0MjRfU0dJWCAgICAgIDB4ODVBMwotI2RlZmluZSBHTF9QSVhFTF9TVUJTQU1QTEVfNDI0Ml9TR0lYICAgICAgMHg4NUE0Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3ljcmNiX3N1YnNhbXBsZQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF95Y3JjYmEKLSNkZWZpbmUgR0xfWUNSQ0JfU0dJWCAgICAgICAgICAgICAgICAgICAgIDB4ODMxOAotI2RlZmluZSBHTF9ZQ1JDQkFfU0dJWCAgICAgICAgICAgICAgICAgICAgMHg4MzE5Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lfZGVwdGhfcGFzc19pbnN0cnVtZW50Ci0jZGVmaW5lIEdMX0RFUFRIX1BBU1NfSU5TVFJVTUVOVF9TR0lYICAgICAweDgzMTAKLSNkZWZpbmUgR0xfREVQVEhfUEFTU19JTlNUUlVNRU5UX0NPVU5URVJTX1NHSVggMHg4MzExCi0jZGVmaW5lIEdMX0RFUFRIX1BBU1NfSU5TVFJVTUVOVF9NQVhfU0dJWCAweDgzMTIKLSNlbmRpZgotCi0jaWZuZGVmIEdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX0ZYVDFfM0RGWCAgICAgICAweDg2QjAKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0ZYVDFfM0RGWCAgICAgIDB4ODZCMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfM0RGWF9tdWx0aXNhbXBsZQotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV8zREZYICAgICAgICAgICAgICAgMHg4NkIyCi0jZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTXzNERlggICAgICAgICAgICAweDg2QjMKLSNkZWZpbmUgR0xfU0FNUExFU18zREZYICAgICAgICAgICAgICAgICAgIDB4ODZCNAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVRfM0RGWCAgICAgICAgICAgMHgyMDAwMDAwMAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfM0RGWF90YnVmZmVyCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfbXVsdGlzYW1wbGUKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfRVhUICAgICAgICAgICAgICAgIDB4ODA5RAotI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fTUFTS19FWFQgICAgICAgMHg4MDlFCi0jZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkVfRVhUICAgICAgICAweDgwOUYKLSNkZWZpbmUgR0xfU0FNUExFX01BU0tfRVhUICAgICAgICAgICAgICAgIDB4ODBBMAotI2RlZmluZSBHTF8xUEFTU19FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MEExCi0jZGVmaW5lIEdMXzJQQVNTXzBfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTIKLSNkZWZpbmUgR0xfMlBBU1NfMV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBMwotI2RlZmluZSBHTF80UEFTU18wX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE0Ci0jZGVmaW5lIEdMXzRQQVNTXzFfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTUKLSNkZWZpbmUgR0xfNFBBU1NfMl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBNgotI2RlZmluZSBHTF80UEFTU18zX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE3Ci0jZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTX0VYVCAgICAgICAgICAgICAweDgwQTgKLSNkZWZpbmUgR0xfU0FNUExFU19FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBOQotI2RlZmluZSBHTF9TQU1QTEVfTUFTS19WQUxVRV9FWFQgICAgICAgICAgMHg4MEFBCi0jZGVmaW5lIEdMX1NBTVBMRV9NQVNLX0lOVkVSVF9FWFQgICAgICAgICAweDgwQUIKLSNkZWZpbmUgR0xfU0FNUExFX1BBVFRFUk5fRVhUICAgICAgICAgICAgIDB4ODBBQwotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVRfRVhUICAgICAgICAgICAgMHgyMDAwMDAwMAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF92ZXJ0ZXhfcHJlY2xpcAotI2RlZmluZSBHTF9WRVJURVhfUFJFQ0xJUF9TR0lYICAgICAgICAgICAgMHg4M0VFCi0jZGVmaW5lIEdMX1ZFUlRFWF9QUkVDTElQX0hJTlRfU0dJWCAgICAgICAweDgzRUYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfY29udm9sdXRpb25fYWNjdXJhY3kKLSNkZWZpbmUgR0xfQ09OVk9MVVRJT05fSElOVF9TR0lYICAgICAgICAgIDB4ODMxNgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9yZXNhbXBsZQotI2RlZmluZSBHTF9QQUNLX1JFU0FNUExFX1NHSVggICAgICAgICAgICAgMHg4NDJDCi0jZGVmaW5lIEdMX1VOUEFDS19SRVNBTVBMRV9TR0lYICAgICAgICAgICAweDg0MkQKLSNkZWZpbmUgR0xfUkVTQU1QTEVfUkVQTElDQVRFX1NHSVggICAgICAgIDB4ODQyRQotI2RlZmluZSBHTF9SRVNBTVBMRV9aRVJPX0ZJTExfU0dJWCAgICAgICAgMHg4NDJGCi0jZGVmaW5lIEdMX1JFU0FNUExFX0RFQ0lNQVRFX1NHSVggICAgICAgICAweDg0MzAKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVNfcG9pbnRfbGluZV90ZXhnZW4KLSNkZWZpbmUgR0xfRVlFX0RJU1RBTkNFX1RPX1BPSU5UX1NHSVMgICAgIDB4ODFGMAotI2RlZmluZSBHTF9PQkpFQ1RfRElTVEFOQ0VfVE9fUE9JTlRfU0dJUyAgMHg4MUYxCi0jZGVmaW5lIEdMX0VZRV9ESVNUQU5DRV9UT19MSU5FX1NHSVMgICAgICAweDgxRjIKLSNkZWZpbmUgR0xfT0JKRUNUX0RJU1RBTkNFX1RPX0xJTkVfU0dJUyAgIDB4ODFGMwotI2RlZmluZSBHTF9FWUVfUE9JTlRfU0dJUyAgICAgICAgICAgICAgICAgMHg4MUY0Ci0jZGVmaW5lIEdMX09CSkVDVF9QT0lOVF9TR0lTICAgICAgICAgICAgICAweDgxRjUKLSNkZWZpbmUgR0xfRVlFX0xJTkVfU0dJUyAgICAgICAgICAgICAgICAgIDB4ODFGNgotI2RlZmluZSBHTF9PQkpFQ1RfTElORV9TR0lTICAgICAgICAgICAgICAgMHg4MUY3Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfY29sb3JfbWFzawotI2RlZmluZSBHTF9URVhUVVJFX0NPTE9SX1dSSVRFTUFTS19TR0lTICAgMHg4MUVGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfZG90MwotI2RlZmluZSBHTF9ET1QzX1JHQl9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzQwCi0jZGVmaW5lIEdMX0RPVDNfUkdCQV9FWFQgICAgICAgICAgICAgICAgICAweDg3NDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV90ZXh0dXJlX21pcnJvcl9vbmNlCi0jZGVmaW5lIEdMX01JUlJPUl9DTEFNUF9BVEkgICAgICAgICAgICAgICAweDg3NDIKLSNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfQVRJICAgICAgIDB4ODc0MwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfZmVuY2UKLSNkZWZpbmUgR0xfQUxMX0NPTVBMRVRFRF9OViAgICAgICAgICAgICAgIDB4ODRGMgotI2RlZmluZSBHTF9GRU5DRV9TVEFUVVNfTlYgICAgICAgICAgICAgICAgMHg4NEYzCi0jZGVmaW5lIEdMX0ZFTkNFX0NPTkRJVElPTl9OViAgICAgICAgICAgICAweDg0RjQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0lCTV90ZXh0dXJlX21pcnJvcmVkX3JlcGVhdAotI2RlZmluZSBHTF9NSVJST1JFRF9SRVBFQVRfSUJNICAgICAgICAgICAgMHg4MzcwCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9ldmFsdWF0b3JzCi0jZGVmaW5lIEdMX0VWQUxfMkRfTlYgICAgICAgICAgICAgICAgICAgICAweDg2QzAKLSNkZWZpbmUgR0xfRVZBTF9UUklBTkdVTEFSXzJEX05WICAgICAgICAgIDB4ODZDMQotI2RlZmluZSBHTF9NQVBfVEVTU0VMTEFUSU9OX05WICAgICAgICAgICAgMHg4NkMyCi0jZGVmaW5lIEdMX01BUF9BVFRSSUJfVV9PUkRFUl9OViAgICAgICAgICAweDg2QzMKLSNkZWZpbmUgR0xfTUFQX0FUVFJJQl9WX09SREVSX05WICAgICAgICAgIDB4ODZDNAotI2RlZmluZSBHTF9FVkFMX0ZSQUNUSU9OQUxfVEVTU0VMTEFUSU9OX05WIDB4ODZDNQotI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIwX05WICAgICAgICAgMHg4NkM2Ci0jZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjFfTlYgICAgICAgICAweDg2QzcKLSNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMl9OViAgICAgICAgIDB4ODZDOAotI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIzX05WICAgICAgICAgMHg4NkM5Ci0jZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjRfTlYgICAgICAgICAweDg2Q0EKLSNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCNV9OViAgICAgICAgIDB4ODZDQgotI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI2X05WICAgICAgICAgMHg4NkNDCi0jZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjdfTlYgICAgICAgICAweDg2Q0QKLSNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCOF9OViAgICAgICAgIDB4ODZDRQotI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI5X05WICAgICAgICAgMHg4NkNGCi0jZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjEwX05WICAgICAgICAweDg2RDAKLSNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTFfTlYgICAgICAgIDB4ODZEMQotI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxMl9OViAgICAgICAgMHg4NkQyCi0jZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjEzX05WICAgICAgICAweDg2RDMKLSNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTRfTlYgICAgICAgIDB4ODZENAotI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxNV9OViAgICAgICAgMHg4NkQ1Ci0jZGVmaW5lIEdMX01BWF9NQVBfVEVTU0VMTEFUSU9OX05WICAgICAgICAweDg2RDYKLSNkZWZpbmUgR0xfTUFYX1JBVElPTkFMX0VWQUxfT1JERVJfTlYgICAgIDB4ODZENwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfcGFja2VkX2RlcHRoX3N0ZW5jaWwKLSNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9OViAgICAgICAgICAgICAgIDB4ODRGOQotI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMjRfOF9OViAgICAgICAgICAgMHg4NEZBCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMyCi0jZGVmaW5lIEdMX1BFUl9TVEFHRV9DT05TVEFOVFNfTlYgICAgICAgICAweDg1MzUKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3RleHR1cmVfY29tcHJlc3Npb25fdnRjCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3JlY3RhbmdsZQotI2RlZmluZSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9OViAgICAgICAgICAgMHg4NEY1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19SRUNUQU5HTEVfTlYgICAweDg0RjYKLSNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9SRUNUQU5HTEVfTlYgICAgIDB4ODRGNwotI2RlZmluZSBHTF9NQVhfUkVDVEFOR0xFX1RFWFRVUkVfU0laRV9OViAgMHg4NEY4Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3NoYWRlcgotI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV9SRUNUQU5HTEVfTlYgICAgMHg4NjRDCi0jZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX1JFQ1RBTkdMRV9TQ0FMRV9OViAweDg2NEQKLSNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV9SRUNUQU5HTEVfTlYgMHg4NjRFCi0jZGVmaW5lIEdMX1JHQkFfVU5TSUdORURfRE9UX1BST0RVQ1RfTUFQUElOR19OViAweDg2RDkKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1M4X1M4XzhfOF9OViAgICAgIDB4ODZEQQotI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfOF84X1M4X1M4X1JFVl9OViAgMHg4NkRCCi0jZGVmaW5lIEdMX0RTRFRfTUFHX0lOVEVOU0lUWV9OViAgICAgICAgICAweDg2REMKLSNkZWZpbmUgR0xfU0hBREVSX0NPTlNJU1RFTlRfTlYgICAgICAgICAgIDB4ODZERAotI2RlZmluZSBHTF9URVhUVVJFX1NIQURFUl9OViAgICAgICAgICAgICAgMHg4NkRFCi0jZGVmaW5lIEdMX1NIQURFUl9PUEVSQVRJT05fTlYgICAgICAgICAgICAweDg2REYKLSNkZWZpbmUgR0xfQ1VMTF9NT0RFU19OViAgICAgICAgICAgICAgICAgIDB4ODZFMAotI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV9NQVRSSVhfTlYgICAgICAgMHg4NkUxCi0jZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX1NDQUxFX05WICAgICAgICAweDg2RTIKLSNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfQklBU19OViAgICAgICAgIDB4ODZFMwotI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV8yRF9NQVRSSVhfTlYgICAgR0xfT0ZGU0VUX1RFWFRVUkVfTUFUUklYX05WCi0jZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX1NDQUxFX05WICAgICBHTF9PRkZTRVRfVEVYVFVSRV9TQ0FMRV9OVgotI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV8yRF9CSUFTX05WICAgICAgR0xfT0ZGU0VUX1RFWFRVUkVfQklBU19OVgotI2RlZmluZSBHTF9QUkVWSU9VU19URVhUVVJFX0lOUFVUX05WICAgICAgMHg4NkU0Ci0jZGVmaW5lIEdMX0NPTlNUX0VZRV9OViAgICAgICAgICAgICAgICAgICAweDg2RTUKLSNkZWZpbmUgR0xfUEFTU19USFJPVUdIX05WICAgICAgICAgICAgICAgIDB4ODZFNgotI2RlZmluZSBHTF9DVUxMX0ZSQUdNRU5UX05WICAgICAgICAgICAgICAgMHg4NkU3Ci0jZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX05WICAgICAgICAgICAweDg2RTgKLSNkZWZpbmUgR0xfREVQRU5ERU5UX0FSX1RFWFRVUkVfMkRfTlYgICAgIDB4ODZFOQotI2RlZmluZSBHTF9ERVBFTkRFTlRfR0JfVEVYVFVSRV8yRF9OViAgICAgMHg4NkVBCi0jZGVmaW5lIEdMX0RPVF9QUk9EVUNUX05WICAgICAgICAgICAgICAgICAweDg2RUMKLSNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfREVQVEhfUkVQTEFDRV9OViAgIDB4ODZFRAotI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9URVhUVVJFXzJEX05WICAgICAgMHg4NkVFCi0jZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1RFWFRVUkVfQ1VCRV9NQVBfTlYgMHg4NkYwCi0jZGVmaW5lIEdMX0RPVF9QUk9EVUNUX0RJRkZVU0VfQ1VCRV9NQVBfTlYgMHg4NkYxCi0jZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1JFRkxFQ1RfQ1VCRV9NQVBfTlYgMHg4NkYyCi0jZGVmaW5lIEdMX0RPVF9QUk9EVUNUX0NPTlNUX0VZRV9SRUZMRUNUX0NVQkVfTUFQX05WIDB4ODZGMwotI2RlZmluZSBHTF9ISUxPX05WICAgICAgICAgICAgICAgICAgICAgICAgMHg4NkY0Ci0jZGVmaW5lIEdMX0RTRFRfTlYgICAgICAgICAgICAgICAgICAgICAgICAweDg2RjUKLSNkZWZpbmUgR0xfRFNEVF9NQUdfTlYgICAgICAgICAgICAgICAgICAgIDB4ODZGNgotI2RlZmluZSBHTF9EU0RUX01BR19WSUJfTlYgICAgICAgICAgICAgICAgMHg4NkY3Ci0jZGVmaW5lIEdMX0hJTE8xNl9OViAgICAgICAgICAgICAgICAgICAgICAweDg2RjgKLSNkZWZpbmUgR0xfU0lHTkVEX0hJTE9fTlYgICAgICAgICAgICAgICAgIDB4ODZGOQotI2RlZmluZSBHTF9TSUdORURfSElMTzE2X05WICAgICAgICAgICAgICAgMHg4NkZBCi0jZGVmaW5lIEdMX1NJR05FRF9SR0JBX05WICAgICAgICAgICAgICAgICAweDg2RkIKLSNkZWZpbmUgR0xfU0lHTkVEX1JHQkE4X05WICAgICAgICAgICAgICAgIDB4ODZGQwotI2RlZmluZSBHTF9TSUdORURfUkdCX05WICAgICAgICAgICAgICAgICAgMHg4NkZFCi0jZGVmaW5lIEdMX1NJR05FRF9SR0I4X05WICAgICAgICAgICAgICAgICAweDg2RkYKLSNkZWZpbmUgR0xfU0lHTkVEX0xVTUlOQU5DRV9OViAgICAgICAgICAgIDB4ODcwMQotI2RlZmluZSBHTF9TSUdORURfTFVNSU5BTkNFOF9OViAgICAgICAgICAgMHg4NzAyCi0jZGVmaW5lIEdMX1NJR05FRF9MVU1JTkFOQ0VfQUxQSEFfTlYgICAgICAweDg3MDMKLSNkZWZpbmUgR0xfU0lHTkVEX0xVTUlOQU5DRThfQUxQSEE4X05WICAgIDB4ODcwNAotI2RlZmluZSBHTF9TSUdORURfQUxQSEFfTlYgICAgICAgICAgICAgICAgMHg4NzA1Ci0jZGVmaW5lIEdMX1NJR05FRF9BTFBIQThfTlYgICAgICAgICAgICAgICAweDg3MDYKLSNkZWZpbmUgR0xfU0lHTkVEX0lOVEVOU0lUWV9OViAgICAgICAgICAgIDB4ODcwNwotI2RlZmluZSBHTF9TSUdORURfSU5URU5TSVRZOF9OViAgICAgICAgICAgMHg4NzA4Ci0jZGVmaW5lIEdMX0RTRFQ4X05WICAgICAgICAgICAgICAgICAgICAgICAweDg3MDkKLSNkZWZpbmUgR0xfRFNEVDhfTUFHOF9OViAgICAgICAgICAgICAgICAgIDB4ODcwQQotI2RlZmluZSBHTF9EU0RUOF9NQUc4X0lOVEVOU0lUWThfTlYgICAgICAgMHg4NzBCCi0jZGVmaW5lIEdMX1NJR05FRF9SR0JfVU5TSUdORURfQUxQSEFfTlYgICAweDg3MEMKLSNkZWZpbmUgR0xfU0lHTkVEX1JHQjhfVU5TSUdORURfQUxQSEE4X05WIDB4ODcwRAotI2RlZmluZSBHTF9ISV9TQ0FMRV9OViAgICAgICAgICAgICAgICAgICAgMHg4NzBFCi0jZGVmaW5lIEdMX0xPX1NDQUxFX05WICAgICAgICAgICAgICAgICAgICAweDg3MEYKLSNkZWZpbmUgR0xfRFNfU0NBTEVfTlYgICAgICAgICAgICAgICAgICAgIDB4ODcxMAotI2RlZmluZSBHTF9EVF9TQ0FMRV9OViAgICAgICAgICAgICAgICAgICAgMHg4NzExCi0jZGVmaW5lIEdMX01BR05JVFVERV9TQ0FMRV9OViAgICAgICAgICAgICAweDg3MTIKLSNkZWZpbmUgR0xfVklCUkFOQ0VfU0NBTEVfTlYgICAgICAgICAgICAgIDB4ODcxMwotI2RlZmluZSBHTF9ISV9CSUFTX05WICAgICAgICAgICAgICAgICAgICAgMHg4NzE0Ci0jZGVmaW5lIEdMX0xPX0JJQVNfTlYgICAgICAgICAgICAgICAgICAgICAweDg3MTUKLSNkZWZpbmUgR0xfRFNfQklBU19OViAgICAgICAgICAgICAgICAgICAgIDB4ODcxNgotI2RlZmluZSBHTF9EVF9CSUFTX05WICAgICAgICAgICAgICAgICAgICAgMHg4NzE3Ci0jZGVmaW5lIEdMX01BR05JVFVERV9CSUFTX05WICAgICAgICAgICAgICAweDg3MTgKLSNkZWZpbmUgR0xfVklCUkFOQ0VfQklBU19OViAgICAgICAgICAgICAgIDB4ODcxOQotI2RlZmluZSBHTF9URVhUVVJFX0JPUkRFUl9WQUxVRVNfTlYgICAgICAgMHg4NzFBCi0jZGVmaW5lIEdMX1RFWFRVUkVfSElfU0laRV9OViAgICAgICAgICAgICAweDg3MUIKLSNkZWZpbmUgR0xfVEVYVFVSRV9MT19TSVpFX05WICAgICAgICAgICAgIDB4ODcxQwotI2RlZmluZSBHTF9URVhUVVJFX0RTX1NJWkVfTlYgICAgICAgICAgICAgMHg4NzFECi0jZGVmaW5lIEdMX1RFWFRVUkVfRFRfU0laRV9OViAgICAgICAgICAgICAweDg3MUUKLSNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfU0laRV9OViAgICAgICAgICAgIDB4ODcxRgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdGV4dHVyZV9zaGFkZXIyCi0jZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1RFWFRVUkVfM0RfTlYgICAgICAweDg2RUYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3ZlcnRleF9hcnJheV9yYW5nZTIKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX1dJVEhPVVRfRkxVU0hfTlYgMHg4NTMzCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbQotI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9OViAgICAgICAgICAgICAgMHg4NjIwCi0jZGVmaW5lIEdMX1ZFUlRFWF9TVEFURV9QUk9HUkFNX05WICAgICAgICAweDg2MjEKLSNkZWZpbmUgR0xfQVRUUklCX0FSUkFZX1NJWkVfTlYgICAgICAgICAgIDB4ODYyMwotI2RlZmluZSBHTF9BVFRSSUJfQVJSQVlfU1RSSURFX05WICAgICAgICAgMHg4NjI0Ci0jZGVmaW5lIEdMX0FUVFJJQl9BUlJBWV9UWVBFX05WICAgICAgICAgICAweDg2MjUKLSNkZWZpbmUgR0xfQ1VSUkVOVF9BVFRSSUJfTlYgICAgICAgICAgICAgIDB4ODYyNgotI2RlZmluZSBHTF9QUk9HUkFNX0xFTkdUSF9OViAgICAgICAgICAgICAgMHg4NjI3Ci0jZGVmaW5lIEdMX1BST0dSQU1fU1RSSU5HX05WICAgICAgICAgICAgICAweDg2MjgKLSNkZWZpbmUgR0xfTU9ERUxWSUVXX1BST0pFQ1RJT05fTlYgICAgICAgIDB4ODYyOQotI2RlZmluZSBHTF9JREVOVElUWV9OViAgICAgICAgICAgICAgICAgICAgMHg4NjJBCi0jZGVmaW5lIEdMX0lOVkVSU0VfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MkIKLSNkZWZpbmUgR0xfVFJBTlNQT1NFX05WICAgICAgICAgICAgICAgICAgIDB4ODYyQwotI2RlZmluZSBHTF9JTlZFUlNFX1RSQU5TUE9TRV9OViAgICAgICAgICAgMHg4NjJECi0jZGVmaW5lIEdMX01BWF9UUkFDS19NQVRSSVhfU1RBQ0tfREVQVEhfTlYgMHg4NjJFCi0jZGVmaW5lIEdMX01BWF9UUkFDS19NQVRSSUNFU19OViAgICAgICAgICAweDg2MkYKLSNkZWZpbmUgR0xfTUFUUklYMF9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzMAotI2RlZmluZSBHTF9NQVRSSVgxX05WICAgICAgICAgICAgICAgICAgICAgMHg4NjMxCi0jZGVmaW5lIEdMX01BVFJJWDJfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzIKLSNkZWZpbmUgR0xfTUFUUklYM19OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzMwotI2RlZmluZSBHTF9NQVRSSVg0X05WICAgICAgICAgICAgICAgICAgICAgMHg4NjM0Ci0jZGVmaW5lIEdMX01BVFJJWDVfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzUKLSNkZWZpbmUgR0xfTUFUUklYNl9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzNgotI2RlZmluZSBHTF9NQVRSSVg3X05WICAgICAgICAgICAgICAgICAgICAgMHg4NjM3Ci0jZGVmaW5lIEdMX0NVUlJFTlRfTUFUUklYX1NUQUNLX0RFUFRIX05WICAweDg2NDAKLSNkZWZpbmUgR0xfQ1VSUkVOVF9NQVRSSVhfTlYgICAgICAgICAgICAgIDB4ODY0MQotI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9QT0lOVF9TSVpFX05WICAgMHg4NjQyCi0jZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1RXT19TSURFX05WICAgICAweDg2NDMKLSNkZWZpbmUgR0xfUFJPR1JBTV9QQVJBTUVURVJfTlYgICAgICAgICAgIDB4ODY0NAotI2RlZmluZSBHTF9BVFRSSUJfQVJSQVlfUE9JTlRFUl9OViAgICAgICAgMHg4NjQ1Ci0jZGVmaW5lIEdMX1BST0dSQU1fVEFSR0VUX05WICAgICAgICAgICAgICAweDg2NDYKLSNkZWZpbmUgR0xfUFJPR1JBTV9SRVNJREVOVF9OViAgICAgICAgICAgIDB4ODY0NwotI2RlZmluZSBHTF9UUkFDS19NQVRSSVhfTlYgICAgICAgICAgICAgICAgMHg4NjQ4Ci0jZGVmaW5lIEdMX1RSQUNLX01BVFJJWF9UUkFOU0ZPUk1fTlYgICAgICAweDg2NDkKLSNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fQklORElOR19OViAgICAgIDB4ODY0QQotI2RlZmluZSBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX05WICAgICAgMHg4NjRCCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkwX05WICAgICAgICAweDg2NTAKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTFfTlYgICAgICAgIDB4ODY1MQotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMl9OViAgICAgICAgMHg4NjUyCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkzX05WICAgICAgICAweDg2NTMKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTRfTlYgICAgICAgIDB4ODY1NAotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZNV9OViAgICAgICAgMHg4NjU1Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk2X05WICAgICAgICAweDg2NTYKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTdfTlYgICAgICAgIDB4ODY1NwotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZOF9OViAgICAgICAgMHg4NjU4Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk5X05WICAgICAgICAweDg2NTkKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTEwX05WICAgICAgIDB4ODY1QQotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTFfTlYgICAgICAgMHg4NjVCCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMl9OViAgICAgICAweDg2NUMKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTEzX05WICAgICAgIDB4ODY1RAotI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTRfTlYgICAgICAgMHg4NjVFCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxNV9OViAgICAgICAweDg2NUYKLSNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMF80X05WICAgICAgIDB4ODY2MAotI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxXzRfTlYgICAgICAgMHg4NjYxCi0jZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjJfNF9OViAgICAgICAweDg2NjIKLSNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCM180X05WICAgICAgIDB4ODY2MwotI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI0XzRfTlYgICAgICAgMHg4NjY0Ci0jZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjVfNF9OViAgICAgICAweDg2NjUKLSNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCNl80X05WICAgICAgIDB4ODY2NgotI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI3XzRfTlYgICAgICAgMHg4NjY3Ci0jZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjhfNF9OViAgICAgICAweDg2NjgKLSNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCOV80X05WICAgICAgIDB4ODY2OQotI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMF80X05WICAgICAgMHg4NjZBCi0jZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjExXzRfTlYgICAgICAweDg2NkIKLSNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTJfNF9OViAgICAgIDB4ODY2QwotI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxM180X05WICAgICAgMHg4NjZECi0jZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjE0XzRfTlYgICAgICAweDg2NkUKLSNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTVfNF9OViAgICAgIDB4ODY2RgotI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIwXzRfTlYgICAgICAgMHg4NjcwCi0jZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjFfNF9OViAgICAgICAweDg2NzEKLSNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMl80X05WICAgICAgIDB4ODY3MgotI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIzXzRfTlYgICAgICAgMHg4NjczCi0jZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjRfNF9OViAgICAgICAweDg2NzQKLSNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCNV80X05WICAgICAgIDB4ODY3NQotI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI2XzRfTlYgICAgICAgMHg4Njc2Ci0jZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjdfNF9OViAgICAgICAweDg2NzcKLSNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCOF80X05WICAgICAgIDB4ODY3OAotI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI5XzRfTlYgICAgICAgMHg4Njc5Ci0jZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjEwXzRfTlYgICAgICAweDg2N0EKLSNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTFfNF9OViAgICAgIDB4ODY3QgotI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMl80X05WICAgICAgMHg4NjdDCi0jZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjEzXzRfTlYgICAgICAweDg2N0QKLSNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTRfNF9OViAgICAgIDB4ODY3RQotI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNV80X05WICAgICAgMHg4NjdGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfY29vcmRpbmF0ZV9jbGFtcAotI2RlZmluZSBHTF9URVhUVVJFX01BWF9DTEFNUF9TX1NHSVggICAgICAgMHg4MzY5Ci0jZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1RfU0dJWCAgICAgICAweDgzNkEKLSNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfQ0xBTVBfUl9TR0lYICAgICAgIDB4ODM2QgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9zY2FsZWJpYXNfaGludAotI2RlZmluZSBHTF9TQ0FMRUJJQVNfSElOVF9TR0lYICAgICAgICAgICAgMHg4MzIyCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9PTUxfaW50ZXJsYWNlCi0jZGVmaW5lIEdMX0lOVEVSTEFDRV9PTUwgICAgICAgICAgICAgICAgICAweDg5ODAKLSNkZWZpbmUgR0xfSU5URVJMQUNFX1JFQURfT01MICAgICAgICAgICAgIDB4ODk4MQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfT01MX3N1YnNhbXBsZQotI2RlZmluZSBHTF9GT1JNQVRfU1VCU0FNUExFXzI0XzI0X09NTCAgICAgMHg4OTgyCi0jZGVmaW5lIEdMX0ZPUk1BVF9TVUJTQU1QTEVfMjQ0XzI0NF9PTUwgICAweDg5ODMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX09NTF9yZXNhbXBsZQotI2RlZmluZSBHTF9QQUNLX1JFU0FNUExFX09NTCAgICAgICAgICAgICAgMHg4OTg0Ci0jZGVmaW5lIEdMX1VOUEFDS19SRVNBTVBMRV9PTUwgICAgICAgICAgICAweDg5ODUKLSNkZWZpbmUgR0xfUkVTQU1QTEVfUkVQTElDQVRFX09NTCAgICAgICAgIDB4ODk4NgotI2RlZmluZSBHTF9SRVNBTVBMRV9aRVJPX0ZJTExfT01MICAgICAgICAgMHg4OTg3Ci0jZGVmaW5lIEdMX1JFU0FNUExFX0FWRVJBR0VfT01MICAgICAgICAgICAweDg5ODgKLSNkZWZpbmUgR0xfUkVTQU1QTEVfREVDSU1BVEVfT01MICAgICAgICAgIDB4ODk4OQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfY29weV9kZXB0aF90b19jb2xvcgotI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX1RPX1JHQkFfTlYgICAgICAgMHg4ODZFCi0jZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfVE9fQkdSQV9OViAgICAgICAweDg4NkYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV9lbnZtYXBfYnVtcG1hcAotI2RlZmluZSBHTF9CVU1QX1JPVF9NQVRSSVhfQVRJICAgICAgICAgICAgMHg4Nzc1Ci0jZGVmaW5lIEdMX0JVTVBfUk9UX01BVFJJWF9TSVpFX0FUSSAgICAgICAweDg3NzYKLSNkZWZpbmUgR0xfQlVNUF9OVU1fVEVYX1VOSVRTX0FUSSAgICAgICAgIDB4ODc3NwotI2RlZmluZSBHTF9CVU1QX1RFWF9VTklUU19BVEkgICAgICAgICAgICAgMHg4Nzc4Ci0jZGVmaW5lIEdMX0RVRFZfQVRJICAgICAgICAgICAgICAgICAgICAgICAweDg3NzkKLSNkZWZpbmUgR0xfRFU4RFY4X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODc3QQotI2RlZmluZSBHTF9CVU1QX0VOVk1BUF9BVEkgICAgICAgICAgICAgICAgMHg4NzdCCi0jZGVmaW5lIEdMX0JVTVBfVEFSR0VUX0FUSSAgICAgICAgICAgICAgICAweDg3N0MKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV9mcmFnbWVudF9zaGFkZXIKLSNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0FUSSAgICAgICAgICAgIDB4ODkyMAotI2RlZmluZSBHTF9SRUdfMF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTIxCi0jZGVmaW5lIEdMX1JFR18xX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjIKLSNkZWZpbmUgR0xfUkVHXzJfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyMwotI2RlZmluZSBHTF9SRUdfM19BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI0Ci0jZGVmaW5lIEdMX1JFR180X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjUKLSNkZWZpbmUgR0xfUkVHXzVfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyNgotI2RlZmluZSBHTF9SRUdfNl9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI3Ci0jZGVmaW5lIEdMX1JFR183X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjgKLSNkZWZpbmUgR0xfUkVHXzhfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyOQotI2RlZmluZSBHTF9SRUdfOV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTJBCi0jZGVmaW5lIEdMX1JFR18xMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MkIKLSNkZWZpbmUgR0xfUkVHXzExX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyQwotI2RlZmluZSBHTF9SRUdfMTJfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTJECi0jZGVmaW5lIEdMX1JFR18xM19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MkUKLSNkZWZpbmUgR0xfUkVHXzE0X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyRgotI2RlZmluZSBHTF9SRUdfMTVfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTMwCi0jZGVmaW5lIEdMX1JFR18xNl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzEKLSNkZWZpbmUgR0xfUkVHXzE3X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzMgotI2RlZmluZSBHTF9SRUdfMThfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTMzCi0jZGVmaW5lIEdMX1JFR18xOV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzQKLSNkZWZpbmUgR0xfUkVHXzIwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzNQotI2RlZmluZSBHTF9SRUdfMjFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM2Ci0jZGVmaW5lIEdMX1JFR18yMl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzcKLSNkZWZpbmUgR0xfUkVHXzIzX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzOAotI2RlZmluZSBHTF9SRUdfMjRfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM5Ci0jZGVmaW5lIEdMX1JFR18yNV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0EKLSNkZWZpbmUgR0xfUkVHXzI2X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzQgotI2RlZmluZSBHTF9SRUdfMjdfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNDCi0jZGVmaW5lIEdMX1JFR18yOF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0QKLSNkZWZpbmUgR0xfUkVHXzI5X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzRQotI2RlZmluZSBHTF9SRUdfMzBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNGCi0jZGVmaW5lIEdMX1JFR18zMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NDAKLSNkZWZpbmUgR0xfQ09OXzBfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0MQotI2RlZmluZSBHTF9DT05fMV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQyCi0jZGVmaW5lIEdMX0NPTl8yX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDMKLSNkZWZpbmUgR0xfQ09OXzNfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0NAotI2RlZmluZSBHTF9DT05fNF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ1Ci0jZGVmaW5lIEdMX0NPTl81X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDYKLSNkZWZpbmUgR0xfQ09OXzZfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0NwotI2RlZmluZSBHTF9DT05fN19BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ4Ci0jZGVmaW5lIEdMX0NPTl84X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDkKLSNkZWZpbmUgR0xfQ09OXzlfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0QQotI2RlZmluZSBHTF9DT05fMTBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTRCCi0jZGVmaW5lIEdMX0NPTl8xMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEMKLSNkZWZpbmUgR0xfQ09OXzEyX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0RAotI2RlZmluZSBHTF9DT05fMTNfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTRFCi0jZGVmaW5lIEdMX0NPTl8xNF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEYKLSNkZWZpbmUgR0xfQ09OXzE1X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1MAotI2RlZmluZSBHTF9DT05fMTZfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTUxCi0jZGVmaW5lIEdMX0NPTl8xN19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTIKLSNkZWZpbmUgR0xfQ09OXzE4X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1MwotI2RlZmluZSBHTF9DT05fMTlfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU0Ci0jZGVmaW5lIEdMX0NPTl8yMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTUKLSNkZWZpbmUgR0xfQ09OXzIxX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1NgotI2RlZmluZSBHTF9DT05fMjJfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU3Ci0jZGVmaW5lIEdMX0NPTl8yM19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTgKLSNkZWZpbmUgR0xfQ09OXzI0X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1OQotI2RlZmluZSBHTF9DT05fMjVfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVBCi0jZGVmaW5lIEdMX0NPTl8yNl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUIKLSNkZWZpbmUgR0xfQ09OXzI3X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1QwotI2RlZmluZSBHTF9DT05fMjhfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVECi0jZGVmaW5lIEdMX0NPTl8yOV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUUKLSNkZWZpbmUgR0xfQ09OXzMwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1RgotI2RlZmluZSBHTF9DT05fMzFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTYwCi0jZGVmaW5lIEdMX01PVl9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NjEKLSNkZWZpbmUgR0xfQUREX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2MwotI2RlZmluZSBHTF9NVUxfQVRJICAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY0Ci0jZGVmaW5lIEdMX1NVQl9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NjUKLSNkZWZpbmUgR0xfRE9UM19BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2NgotI2RlZmluZSBHTF9ET1Q0X0FUSSAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY3Ci0jZGVmaW5lIEdMX01BRF9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NjgKLSNkZWZpbmUgR0xfTEVSUF9BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2OQotI2RlZmluZSBHTF9DTkRfQVRJICAgICAgICAgICAgICAgICAgICAgICAgMHg4OTZBCi0jZGVmaW5lIEdMX0NORDBfQVRJICAgICAgICAgICAgICAgICAgICAgICAweDg5NkIKLSNkZWZpbmUgR0xfRE9UMl9BRERfQVRJICAgICAgICAgICAgICAgICAgIDB4ODk2QwotI2RlZmluZSBHTF9TRUNPTkRBUllfSU5URVJQT0xBVE9SX0FUSSAgICAgMHg4OTZECi0jZGVmaW5lIEdMX05VTV9GUkFHTUVOVF9SRUdJU1RFUlNfQVRJICAgICAweDg5NkUKLSNkZWZpbmUgR0xfTlVNX0ZSQUdNRU5UX0NPTlNUQU5UU19BVEkgICAgIDB4ODk2RgotI2RlZmluZSBHTF9OVU1fUEFTU0VTX0FUSSAgICAgICAgICAgICAgICAgMHg4OTcwCi0jZGVmaW5lIEdMX05VTV9JTlNUUlVDVElPTlNfUEVSX1BBU1NfQVRJICAweDg5NzEKLSNkZWZpbmUgR0xfTlVNX0lOU1RSVUNUSU9OU19UT1RBTF9BVEkgICAgIDB4ODk3MgotI2RlZmluZSBHTF9OVU1fSU5QVVRfSU5URVJQT0xBVE9SX0NPTVBPTkVOVFNfQVRJIDB4ODk3MwotI2RlZmluZSBHTF9OVU1fTE9PUEJBQ0tfQ09NUE9ORU5UU19BVEkgICAgMHg4OTc0Ci0jZGVmaW5lIEdMX0NPTE9SX0FMUEhBX1BBSVJJTkdfQVRJICAgICAgICAweDg5NzUKLSNkZWZpbmUgR0xfU1dJWlpMRV9TVFJfQVRJICAgICAgICAgICAgICAgIDB4ODk3NgotI2RlZmluZSBHTF9TV0laWkxFX1NUUV9BVEkgICAgICAgICAgICAgICAgMHg4OTc3Ci0jZGVmaW5lIEdMX1NXSVpaTEVfU1RSX0RSX0FUSSAgICAgICAgICAgICAweDg5NzgKLSNkZWZpbmUgR0xfU1dJWlpMRV9TVFFfRFFfQVRJICAgICAgICAgICAgIDB4ODk3OQotI2RlZmluZSBHTF9TV0laWkxFX1NUUlFfQVRJICAgICAgICAgICAgICAgMHg4OTdBCi0jZGVmaW5lIEdMX1NXSVpaTEVfU1RSUV9EUV9BVEkgICAgICAgICAgICAweDg5N0IKLSNkZWZpbmUgR0xfUkVEX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgR0xfR1JFRU5fQklUX0FUSSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgR0xfQkxVRV9CSVRfQVRJICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgR0xfMlhfQklUX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgR0xfNFhfQklUX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgR0xfOFhfQklUX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgR0xfSEFMRl9CSVRfQVRJICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgR0xfUVVBUlRFUl9CSVRfQVRJICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgR0xfRUlHSFRIX0JJVF9BVEkgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgR0xfU0FUVVJBVEVfQklUX0FUSSAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgR0xfQ09NUF9CSVRfQVRJICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgR0xfTkVHQVRFX0JJVF9BVEkgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgR0xfQklBU19CSVRfQVRJICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV9wbl90cmlhbmdsZXMKLSNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX0FUSSAgICAgICAgICAgICAgIDB4ODdGMAotI2RlZmluZSBHTF9NQVhfUE5fVFJJQU5HTEVTX1RFU1NFTEFUSU9OX0xFVkVMX0FUSSAweDg3RjEKLSNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1BPSU5UX01PREVfQVRJICAgIDB4ODdGMgotI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfTk9STUFMX01PREVfQVRJICAgMHg4N0YzCi0jZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19URVNTRUxBVElPTl9MRVZFTF9BVEkgMHg4N0Y0Ci0jZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19QT0lOVF9NT0RFX0xJTkVBUl9BVEkgMHg4N0Y1Ci0jZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19QT0lOVF9NT0RFX0NVQklDX0FUSSAweDg3RjYKLSNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX05PUk1BTF9NT0RFX0xJTkVBUl9BVEkgMHg4N0Y3Ci0jZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19OT1JNQUxfTU9ERV9RVUFEUkFUSUNfQVRJIDB4ODdGOAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVRJX3ZlcnRleF9hcnJheV9vYmplY3QKLSNkZWZpbmUgR0xfU1RBVElDX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODc2MAotI2RlZmluZSBHTF9EWU5BTUlDX0FUSSAgICAgICAgICAgICAgICAgICAgMHg4NzYxCi0jZGVmaW5lIEdMX1BSRVNFUlZFX0FUSSAgICAgICAgICAgICAgICAgICAweDg3NjIKLSNkZWZpbmUgR0xfRElTQ0FSRF9BVEkgICAgICAgICAgICAgICAgICAgIDB4ODc2MwotI2RlZmluZSBHTF9PQkpFQ1RfQlVGRkVSX1NJWkVfQVRJICAgICAgICAgMHg4NzY0Ci0jZGVmaW5lIEdMX09CSkVDVF9CVUZGRVJfVVNBR0VfQVRJICAgICAgICAweDg3NjUKLSNkZWZpbmUgR0xfQVJSQVlfT0JKRUNUX0JVRkZFUl9BVEkgICAgICAgIDB4ODc2NgotI2RlZmluZSBHTF9BUlJBWV9PQkpFQ1RfT0ZGU0VUX0FUSSAgICAgICAgMHg4NzY3Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfdmVydGV4X3NoYWRlcgotI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0VYVCAgICAgICAgICAgICAgMHg4NzgwCi0jZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfQklORElOR19FWFQgICAgICAweDg3ODEKLSNkZWZpbmUgR0xfT1BfSU5ERVhfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc4MgotI2RlZmluZSBHTF9PUF9ORUdBVEVfRVhUICAgICAgICAgICAgICAgICAgMHg4NzgzCi0jZGVmaW5lIEdMX09QX0RPVDNfRVhUICAgICAgICAgICAgICAgICAgICAweDg3ODQKLSNkZWZpbmUgR0xfT1BfRE9UNF9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODc4NQotI2RlZmluZSBHTF9PUF9NVUxfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4Nzg2Ci0jZGVmaW5lIEdMX09QX0FERF9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3ODcKLSNkZWZpbmUgR0xfT1BfTUFERF9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODc4OAotI2RlZmluZSBHTF9PUF9GUkFDX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4Nzg5Ci0jZGVmaW5lIEdMX09QX01BWF9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3OEEKLSNkZWZpbmUgR0xfT1BfTUlOX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc4QgotI2RlZmluZSBHTF9PUF9TRVRfR0VfRVhUICAgICAgICAgICAgICAgICAgMHg4NzhDCi0jZGVmaW5lIEdMX09QX1NFVF9MVF9FWFQgICAgICAgICAgICAgICAgICAweDg3OEQKLSNkZWZpbmUgR0xfT1BfQ0xBTVBfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc4RQotI2RlZmluZSBHTF9PUF9GTE9PUl9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzhGCi0jZGVmaW5lIEdMX09QX1JPVU5EX0VYVCAgICAgICAgICAgICAgICAgICAweDg3OTAKLSNkZWZpbmUgR0xfT1BfRVhQX0JBU0VfMl9FWFQgICAgICAgICAgICAgIDB4ODc5MQotI2RlZmluZSBHTF9PUF9MT0dfQkFTRV8yX0VYVCAgICAgICAgICAgICAgMHg4NzkyCi0jZGVmaW5lIEdMX09QX1BPV0VSX0VYVCAgICAgICAgICAgICAgICAgICAweDg3OTMKLSNkZWZpbmUgR0xfT1BfUkVDSVBfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc5NAotI2RlZmluZSBHTF9PUF9SRUNJUF9TUVJUX0VYVCAgICAgICAgICAgICAgMHg4Nzk1Ci0jZGVmaW5lIEdMX09QX1NVQl9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3OTYKLSNkZWZpbmUgR0xfT1BfQ1JPU1NfUFJPRFVDVF9FWFQgICAgICAgICAgIDB4ODc5NwotI2RlZmluZSBHTF9PUF9NVUxUSVBMWV9NQVRSSVhfRVhUICAgICAgICAgMHg4Nzk4Ci0jZGVmaW5lIEdMX09QX01PVl9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3OTkKLSNkZWZpbmUgR0xfT1VUUFVUX1ZFUlRFWF9FWFQgICAgICAgICAgICAgIDB4ODc5QQotI2RlZmluZSBHTF9PVVRQVVRfQ09MT1IwX0VYVCAgICAgICAgICAgICAgMHg4NzlCCi0jZGVmaW5lIEdMX09VVFBVVF9DT0xPUjFfRVhUICAgICAgICAgICAgICAweDg3OUMKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQwX0VYVCAgICAgIDB4ODc5RAotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDFfRVhUICAgICAgMHg4NzlFCi0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMl9FWFQgICAgICAweDg3OUYKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQzX0VYVCAgICAgIDB4ODdBMAotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDRfRVhUICAgICAgMHg4N0ExCi0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JENV9FWFQgICAgICAweDg3QTIKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ2X0VYVCAgICAgIDB4ODdBMwotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDdfRVhUICAgICAgMHg4N0E0Ci0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEOF9FWFQgICAgICAweDg3QTUKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ5X0VYVCAgICAgIDB4ODdBNgotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDEwX0VYVCAgICAgMHg4N0E3Ci0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTFfRVhUICAgICAweDg3QTgKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxMl9FWFQgICAgIDB4ODdBOQotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDEzX0VYVCAgICAgMHg4N0FBCi0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTRfRVhUICAgICAweDg3QUIKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxNV9FWFQgICAgIDB4ODdBQwotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE2X0VYVCAgICAgMHg4N0FECi0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTdfRVhUICAgICAweDg3QUUKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxOF9FWFQgICAgIDB4ODdBRgotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE5X0VYVCAgICAgMHg4N0IwCi0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjBfRVhUICAgICAweDg3QjEKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyMV9FWFQgICAgIDB4ODdCMgotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDIyX0VYVCAgICAgMHg4N0IzCi0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjNfRVhUICAgICAweDg3QjQKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyNF9FWFQgICAgIDB4ODdCNQotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI1X0VYVCAgICAgMHg4N0I2Ci0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjZfRVhUICAgICAweDg3QjcKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyN19FWFQgICAgIDB4ODdCOAotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI4X0VYVCAgICAgMHg4N0I5Ci0jZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjlfRVhUICAgICAweDg3QkEKLSNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQzMF9FWFQgICAgIDB4ODdCQgotI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDMxX0VYVCAgICAgMHg4N0JDCi0jZGVmaW5lIEdMX09VVFBVVF9GT0dfRVhUICAgICAgICAgICAgICAgICAweDg3QkQKLSNkZWZpbmUgR0xfU0NBTEFSX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODdCRQotI2RlZmluZSBHTF9WRUNUT1JfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4N0JGCi0jZGVmaW5lIEdMX01BVFJJWF9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3QzAKLSNkZWZpbmUgR0xfVkFSSUFOVF9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODdDMQotI2RlZmluZSBHTF9JTlZBUklBTlRfRVhUICAgICAgICAgICAgICAgICAgMHg4N0MyCi0jZGVmaW5lIEdMX0xPQ0FMX0NPTlNUQU5UX0VYVCAgICAgICAgICAgICAweDg3QzMKLSNkZWZpbmUgR0xfTE9DQUxfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODdDNAotI2RlZmluZSBHTF9NQVhfVkVSVEVYX1NIQURFUl9JTlNUUlVDVElPTlNfRVhUIDB4ODdDNQotI2RlZmluZSBHTF9NQVhfVkVSVEVYX1NIQURFUl9WQVJJQU5UU19FWFQgMHg4N0M2Ci0jZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0lOVkFSSUFOVFNfRVhUIDB4ODdDNwotI2RlZmluZSBHTF9NQVhfVkVSVEVYX1NIQURFUl9MT0NBTF9DT05TVEFOVFNfRVhUIDB4ODdDOAotI2RlZmluZSBHTF9NQVhfVkVSVEVYX1NIQURFUl9MT0NBTFNfRVhUICAgMHg4N0M5Ci0jZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9JTlNUUlVDVElPTlNfRVhUIDB4ODdDQQotI2RlZmluZSBHTF9NQVhfT1BUSU1JWkVEX1ZFUlRFWF9TSEFERVJfVkFSSUFOVFNfRVhUIDB4ODdDQgotI2RlZmluZSBHTF9NQVhfT1BUSU1JWkVEX1ZFUlRFWF9TSEFERVJfTE9DQUxfQ09OU1RBTlRTX0VYVCAweDg3Q0MKLSNkZWZpbmUgR0xfTUFYX09QVElNSVpFRF9WRVJURVhfU0hBREVSX0lOVkFSSUFOVFNfRVhUIDB4ODdDRAotI2RlZmluZSBHTF9NQVhfT1BUSU1JWkVEX1ZFUlRFWF9TSEFERVJfTE9DQUxTX0VYVCAweDg3Q0UKLSNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9JTlNUUlVDVElPTlNfRVhUIDB4ODdDRgotI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX1ZBUklBTlRTX0VYVCAgICAgMHg4N0QwCi0jZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfSU5WQVJJQU5UU19FWFQgICAweDg3RDEKLSNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9MT0NBTF9DT05TVEFOVFNfRVhUIDB4ODdEMgotI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0xPQ0FMU19FWFQgICAgICAgMHg4N0QzCi0jZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfT1BUSU1JWkVEX0VYVCAgICAweDg3RDQKLSNkZWZpbmUgR0xfWF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdENQotI2RlZmluZSBHTF9ZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Q2Ci0jZGVmaW5lIEdMX1pfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RDcKLSNkZWZpbmUgR0xfV19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdEOAotI2RlZmluZSBHTF9ORUdBVElWRV9YX0VYVCAgICAgICAgICAgICAgICAgMHg4N0Q5Ci0jZGVmaW5lIEdMX05FR0FUSVZFX1lfRVhUICAgICAgICAgICAgICAgICAweDg3REEKLSNkZWZpbmUgR0xfTkVHQVRJVkVfWl9FWFQgICAgICAgICAgICAgICAgIDB4ODdEQgotI2RlZmluZSBHTF9ORUdBVElWRV9XX0VYVCAgICAgICAgICAgICAgICAgMHg4N0RDCi0jZGVmaW5lIEdMX1pFUk9fRVhUICAgICAgICAgICAgICAgICAgICAgICAweDg3REQKLSNkZWZpbmUgR0xfT05FX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdERQotI2RlZmluZSBHTF9ORUdBVElWRV9PTkVfRVhUICAgICAgICAgICAgICAgMHg4N0RGCi0jZGVmaW5lIEdMX05PUk1BTElaRURfUkFOR0VfRVhUICAgICAgICAgICAweDg3RTAKLSNkZWZpbmUgR0xfRlVMTF9SQU5HRV9FWFQgICAgICAgICAgICAgICAgIDB4ODdFMQotI2RlZmluZSBHTF9DVVJSRU5UX1ZFUlRFWF9FWFQgICAgICAgICAgICAgMHg4N0UyCi0jZGVmaW5lIEdMX01WUF9NQVRSSVhfRVhUICAgICAgICAgICAgICAgICAweDg3RTMKLSNkZWZpbmUgR0xfVkFSSUFOVF9WQUxVRV9FWFQgICAgICAgICAgICAgIDB4ODdFNAotI2RlZmluZSBHTF9WQVJJQU5UX0RBVEFUWVBFX0VYVCAgICAgICAgICAgMHg4N0U1Ci0jZGVmaW5lIEdMX1ZBUklBTlRfQVJSQVlfU1RSSURFX0VYVCAgICAgICAweDg3RTYKLSNkZWZpbmUgR0xfVkFSSUFOVF9BUlJBWV9UWVBFX0VYVCAgICAgICAgIDB4ODdFNwotI2RlZmluZSBHTF9WQVJJQU5UX0FSUkFZX0VYVCAgICAgICAgICAgICAgMHg4N0U4Ci0jZGVmaW5lIEdMX1ZBUklBTlRfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAweDg3RTkKLSNkZWZpbmUgR0xfSU5WQVJJQU5UX1ZBTFVFX0VYVCAgICAgICAgICAgIDB4ODdFQQotI2RlZmluZSBHTF9JTlZBUklBTlRfREFUQVRZUEVfRVhUICAgICAgICAgMHg4N0VCCi0jZGVmaW5lIEdMX0xPQ0FMX0NPTlNUQU5UX1ZBTFVFX0VYVCAgICAgICAweDg3RUMKLSNkZWZpbmUgR0xfTE9DQUxfQ09OU1RBTlRfREFUQVRZUEVfRVhUICAgIDB4ODdFRAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVRJX3ZlcnRleF9zdHJlYW1zCi0jZGVmaW5lIEdMX01BWF9WRVJURVhfU1RSRUFNU19BVEkgICAgICAgICAweDg3NkIKLSNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTBfQVRJICAgICAgICAgICAgIDB4ODc2QwotI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNMV9BVEkgICAgICAgICAgICAgMHg4NzZECi0jZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU0yX0FUSSAgICAgICAgICAgICAweDg3NkUKLSNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTNfQVRJICAgICAgICAgICAgIDB4ODc2RgotI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNNF9BVEkgICAgICAgICAgICAgMHg4NzcwCi0jZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU01X0FUSSAgICAgICAgICAgICAweDg3NzEKLSNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTZfQVRJICAgICAgICAgICAgIDB4ODc3MgotI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNN19BVEkgICAgICAgICAgICAgMHg4NzczCi0jZGVmaW5lIEdMX1ZFUlRFWF9TT1VSQ0VfQVRJICAgICAgICAgICAgICAweDg3NzQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV9lbGVtZW50X2FycmF5Ci0jZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQVRJICAgICAgICAgICAgICAweDg3NjgKLSNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9UWVBFX0FUSSAgICAgICAgIDB4ODc2OQotI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1BPSU5URVJfQVRJICAgICAgMHg4NzZBCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TVU5fbWVzaF9hcnJheQotI2RlZmluZSBHTF9RVUFEX01FU0hfU1VOICAgICAgICAgICAgICAgICAgMHg4NjE0Ci0jZGVmaW5lIEdMX1RSSUFOR0xFX01FU0hfU1VOICAgICAgICAgICAgICAweDg2MTUKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NVTl9zbGljZV9hY2N1bQotI2RlZmluZSBHTF9TTElDRV9BQ0NVTV9TVU4gICAgICAgICAgICAgICAgMHg4NUNDCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9tdWx0aXNhbXBsZV9maWx0ZXJfaGludAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9GSUxURVJfSElOVF9OViAgICAgMHg4NTM0Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9kZXB0aF9jbGFtcAotI2RlZmluZSBHTF9ERVBUSF9DTEFNUF9OViAgICAgICAgICAgICAgICAgMHg4NjRGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9vY2NsdXNpb25fcXVlcnkKLSNkZWZpbmUgR0xfUElYRUxfQ09VTlRFUl9CSVRTX05WICAgICAgICAgIDB4ODg2NAotI2RlZmluZSBHTF9DVVJSRU5UX09DQ0xVU0lPTl9RVUVSWV9JRF9OViAgMHg4ODY1Ci0jZGVmaW5lIEdMX1BJWEVMX0NPVU5UX05WICAgICAgICAgICAgICAgICAweDg4NjYKLSNkZWZpbmUgR0xfUElYRUxfQ09VTlRfQVZBSUxBQkxFX05WICAgICAgIDB4ODg2NwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfcG9pbnRfc3ByaXRlCi0jZGVmaW5lIEdMX1BPSU5UX1NQUklURV9OViAgICAgICAgICAgICAgICAweDg4NjEKLSNkZWZpbmUgR0xfQ09PUkRfUkVQTEFDRV9OViAgICAgICAgICAgICAgIDB4ODg2MgotI2RlZmluZSBHTF9QT0lOVF9TUFJJVEVfUl9NT0RFX05WICAgICAgICAgMHg4ODYzCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3NoYWRlcjMKLSNkZWZpbmUgR0xfT0ZGU0VUX1BST0pFQ1RJVkVfVEVYVFVSRV8yRF9OViAweDg4NTAKLSNkZWZpbmUgR0xfT0ZGU0VUX1BST0pFQ1RJVkVfVEVYVFVSRV8yRF9TQ0FMRV9OViAweDg4NTEKLSNkZWZpbmUgR0xfT0ZGU0VUX1BST0pFQ1RJVkVfVEVYVFVSRV9SRUNUQU5HTEVfTlYgMHg4ODUyCi0jZGVmaW5lIEdMX09GRlNFVF9QUk9KRUNUSVZFX1RFWFRVUkVfUkVDVEFOR0xFX1NDQUxFX05WIDB4ODg1MwotI2RlZmluZSBHTF9PRkZTRVRfSElMT19URVhUVVJFXzJEX05WICAgICAgMHg4ODU0Ci0jZGVmaW5lIEdMX09GRlNFVF9ISUxPX1RFWFRVUkVfUkVDVEFOR0xFX05WIDB4ODg1NQotI2RlZmluZSBHTF9PRkZTRVRfSElMT19QUk9KRUNUSVZFX1RFWFRVUkVfMkRfTlYgMHg4ODU2Ci0jZGVmaW5lIEdMX09GRlNFVF9ISUxPX1BST0pFQ1RJVkVfVEVYVFVSRV9SRUNUQU5HTEVfTlYgMHg4ODU3Ci0jZGVmaW5lIEdMX0RFUEVOREVOVF9ISUxPX1RFWFRVUkVfMkRfTlYgICAweDg4NTgKLSNkZWZpbmUgR0xfREVQRU5ERU5UX1JHQl9URVhUVVJFXzNEX05WICAgIDB4ODg1OQotI2RlZmluZSBHTF9ERVBFTkRFTlRfUkdCX1RFWFRVUkVfQ1VCRV9NQVBfTlYgMHg4ODVBCi0jZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1BBU1NfVEhST1VHSF9OViAgICAweDg4NUIKLSNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV8xRF9OViAgICAgIDB4ODg1QwotI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9BRkZJTkVfREVQVEhfUkVQTEFDRV9OViAweDg4NUQKLSNkZWZpbmUgR0xfSElMTzhfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4ODg1RQotI2RlZmluZSBHTF9TSUdORURfSElMTzhfTlYgICAgICAgICAgICAgICAgMHg4ODVGCi0jZGVmaW5lIEdMX0ZPUkNFX0JMVUVfVE9fT05FX05WICAgICAgICAgICAweDg4NjAKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMV8xCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfc2hhZG93X2Z1bmNzCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF90d29fc2lkZQotI2RlZmluZSBHTF9TVEVOQ0lMX1RFU1RfVFdPX1NJREVfRVhUICAgICAgMHg4OTEwCi0jZGVmaW5lIEdMX0FDVElWRV9TVEVOQ0lMX0ZBQ0VfRVhUICAgICAgICAweDg5MTEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV90ZXh0X2ZyYWdtZW50X3NoYWRlcgotI2RlZmluZSBHTF9URVhUX0ZSQUdNRU5UX1NIQURFUl9BVEkgICAgICAgMHg4MjAwCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUFBMRV9jbGllbnRfc3RvcmFnZQotI2RlZmluZSBHTF9VTlBBQ0tfQ0xJRU5UX1NUT1JBR0VfQVBQTEUgICAgMHg4NUIyCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUFBMRV9lbGVtZW50X2FycmF5Ci0jZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQVBQTEUgICAgICAgICAgICAweDg3NjgKLSNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9UWVBFX0FQUExFICAgICAgIDB4ODc2OQotI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1BPSU5URVJfQVBQTEUgICAgMHg4NzZBCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUFBMRV9mZW5jZQotI2RlZmluZSBHTF9EUkFXX1BJWEVMU19BUFBMRSAgICAgICAgICAgICAgMHg4QTBBCi0jZGVmaW5lIEdMX0ZFTkNFX0FQUExFICAgICAgICAgICAgICAgICAgICAweDhBMEIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FQUExFX3ZlcnRleF9hcnJheV9vYmplY3QKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfQVBQTEUgICAgIDB4ODVCNQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X3JhbmdlCi0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9SQU5HRV9BUFBMRSAgICAgICAweDg1MUQKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX0xFTkdUSF9BUFBMRSAweDg1MUUKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NUT1JBR0VfSElOVF9BUFBMRSAweDg1MUYKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX1BPSU5URVJfQVBQTEUgMHg4NTIxCi0jZGVmaW5lIEdMX1NUT1JBR0VfQ0FDSEVEX0FQUExFICAgICAgICAgICAweDg1QkUKLSNkZWZpbmUgR0xfU1RPUkFHRV9TSEFSRURfQVBQTEUgICAgICAgICAgIDB4ODVCRgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVBQTEVfeWNiY3JfNDIyCi0jZGVmaW5lIEdMX1lDQkNSXzQyMl9BUFBMRSAgICAgICAgICAgICAgICAweDg1QjkKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfOF84X0FQUExFICAgICAgIDB4ODVCQQotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfUkVWX0FQUExFICAgMHg4NUJCCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TM19zM3RjCi0jZGVmaW5lIEdMX1JHQl9TM1RDICAgICAgICAgICAgICAgICAgICAgICAweDgzQTAKLSNkZWZpbmUgR0xfUkdCNF9TM1RDICAgICAgICAgICAgICAgICAgICAgIDB4ODNBMQotI2RlZmluZSBHTF9SR0JBX1MzVEMgICAgICAgICAgICAgICAgICAgICAgMHg4M0EyCi0jZGVmaW5lIEdMX1JHQkE0X1MzVEMgICAgICAgICAgICAgICAgICAgICAweDgzQTMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV9kcmF3X2J1ZmZlcnMKLSNkZWZpbmUgR0xfTUFYX0RSQVdfQlVGRkVSU19BVEkgICAgICAgICAgIDB4ODgyNAotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjBfQVRJICAgICAgICAgICAgICAgMHg4ODI1Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMV9BVEkgICAgICAgICAgICAgICAweDg4MjYKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIyX0FUSSAgICAgICAgICAgICAgIDB4ODgyNwotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjNfQVRJICAgICAgICAgICAgICAgMHg4ODI4Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSNF9BVEkgICAgICAgICAgICAgICAweDg4MjkKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI1X0FUSSAgICAgICAgICAgICAgIDB4ODgyQQotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjZfQVRJICAgICAgICAgICAgICAgMHg4ODJCCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSN19BVEkgICAgICAgICAgICAgICAweDg4MkMKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI4X0FUSSAgICAgICAgICAgICAgIDB4ODgyRAotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjlfQVRJICAgICAgICAgICAgICAgMHg4ODJFCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTBfQVRJICAgICAgICAgICAgICAweDg4MkYKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMV9BVEkgICAgICAgICAgICAgIDB4ODgzMAotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEyX0FUSSAgICAgICAgICAgICAgMHg4ODMxCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTNfQVRJICAgICAgICAgICAgICAweDg4MzIKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNF9BVEkgICAgICAgICAgICAgIDB4ODgzMwotI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE1X0FUSSAgICAgICAgICAgICAgMHg4ODM0Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BVElfcGl4ZWxfZm9ybWF0X2Zsb2F0Ci0jZGVmaW5lIEdMX1RZUEVfUkdCQV9GTE9BVF9BVEkgICAgICAgICAgICAweDg4MjAKLSNkZWZpbmUgR0xfQ09MT1JfQ0xFQVJfVU5DTEFNUEVEX1ZBTFVFX0FUSSAweDg4MzUKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV90ZXh0dXJlX2Vudl9jb21iaW5lMwotI2RlZmluZSBHTF9NT0RVTEFURV9BRERfQVRJICAgICAgICAgICAgICAgMHg4NzQ0Ci0jZGVmaW5lIEdMX01PRFVMQVRFX1NJR05FRF9BRERfQVRJICAgICAgICAweDg3NDUKLSNkZWZpbmUgR0xfTU9EVUxBVEVfU1VCVFJBQ1RfQVRJICAgICAgICAgIDB4ODc0NgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVRJX3RleHR1cmVfZmxvYXQKLSNkZWZpbmUgR0xfUkdCQV9GTE9BVDMyX0FUSSAgICAgICAgICAgICAgIDB4ODgxNAotI2RlZmluZSBHTF9SR0JfRkxPQVQzMl9BVEkgICAgICAgICAgICAgICAgMHg4ODE1Ci0jZGVmaW5lIEdMX0FMUEhBX0ZMT0FUMzJfQVRJICAgICAgICAgICAgICAweDg4MTYKLSNkZWZpbmUgR0xfSU5URU5TSVRZX0ZMT0FUMzJfQVRJICAgICAgICAgIDB4ODgxNwotI2RlZmluZSBHTF9MVU1JTkFOQ0VfRkxPQVQzMl9BVEkgICAgICAgICAgMHg4ODE4Ci0jZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQV9GTE9BVDMyX0FUSSAgICAweDg4MTkKLSNkZWZpbmUgR0xfUkdCQV9GTE9BVDE2X0FUSSAgICAgICAgICAgICAgIDB4ODgxQQotI2RlZmluZSBHTF9SR0JfRkxPQVQxNl9BVEkgICAgICAgICAgICAgICAgMHg4ODFCCi0jZGVmaW5lIEdMX0FMUEhBX0ZMT0FUMTZfQVRJICAgICAgICAgICAgICAweDg4MUMKLSNkZWZpbmUgR0xfSU5URU5TSVRZX0ZMT0FUMTZfQVRJICAgICAgICAgIDB4ODgxRAotI2RlZmluZSBHTF9MVU1JTkFOQ0VfRkxPQVQxNl9BVEkgICAgICAgICAgMHg4ODFFCi0jZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQV9GTE9BVDE2X0FUSSAgICAweDg4MUYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX2Zsb2F0X2J1ZmZlcgotI2RlZmluZSBHTF9GTE9BVF9SX05WICAgICAgICAgICAgICAgICAgICAgMHg4ODgwCi0jZGVmaW5lIEdMX0ZMT0FUX1JHX05WICAgICAgICAgICAgICAgICAgICAweDg4ODEKLSNkZWZpbmUgR0xfRkxPQVRfUkdCX05WICAgICAgICAgICAgICAgICAgIDB4ODg4MgotI2RlZmluZSBHTF9GTE9BVF9SR0JBX05WICAgICAgICAgICAgICAgICAgMHg4ODgzCi0jZGVmaW5lIEdMX0ZMT0FUX1IxNl9OViAgICAgICAgICAgICAgICAgICAweDg4ODQKLSNkZWZpbmUgR0xfRkxPQVRfUjMyX05WICAgICAgICAgICAgICAgICAgIDB4ODg4NQotI2RlZmluZSBHTF9GTE9BVF9SRzE2X05WICAgICAgICAgICAgICAgICAgMHg4ODg2Ci0jZGVmaW5lIEdMX0ZMT0FUX1JHMzJfTlYgICAgICAgICAgICAgICAgICAweDg4ODcKLSNkZWZpbmUgR0xfRkxPQVRfUkdCMTZfTlYgICAgICAgICAgICAgICAgIDB4ODg4OAotI2RlZmluZSBHTF9GTE9BVF9SR0IzMl9OViAgICAgICAgICAgICAgICAgMHg4ODg5Ci0jZGVmaW5lIEdMX0ZMT0FUX1JHQkExNl9OViAgICAgICAgICAgICAgICAweDg4OEEKLSNkZWZpbmUgR0xfRkxPQVRfUkdCQTMyX05WICAgICAgICAgICAgICAgIDB4ODg4QgotI2RlZmluZSBHTF9URVhUVVJFX0ZMT0FUX0NPTVBPTkVOVFNfTlYgICAgMHg4ODhDCi0jZGVmaW5lIEdMX0ZMT0FUX0NMRUFSX0NPTE9SX1ZBTFVFX05WICAgICAweDg4OEQKLSNkZWZpbmUgR0xfRkxPQVRfUkdCQV9NT0RFX05WICAgICAgICAgICAgIDB4ODg4RQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbQotI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfUFJPR1JBTV9MT0NBTF9QQVJBTUVURVJTX05WIDB4ODg2OAotI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX05WICAgICAgICAgICAgMHg4ODcwCi0jZGVmaW5lIEdMX01BWF9URVhUVVJFX0NPT1JEU19OViAgICAgICAgICAweDg4NzEKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFNfTlYgICAgIDB4ODg3MgotI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0JJTkRJTkdfTlYgICAgMHg4ODczCi0jZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfU1RSSU5HX05WICAgICAgICAweDg4NzQKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX2hhbGZfZmxvYXQKLSNkZWZpbmUgR0xfSEFMRl9GTE9BVF9OViAgICAgICAgICAgICAgICAgIDB4MTQwQgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfcGl4ZWxfZGF0YV9yYW5nZQotI2RlZmluZSBHTF9XUklURV9QSVhFTF9EQVRBX1JBTkdFX05WICAgICAgMHg4ODc4Ci0jZGVmaW5lIEdMX1JFQURfUElYRUxfREFUQV9SQU5HRV9OViAgICAgICAweDg4NzkKLSNkZWZpbmUgR0xfV1JJVEVfUElYRUxfREFUQV9SQU5HRV9MRU5HVEhfTlYgMHg4ODdBCi0jZGVmaW5lIEdMX1JFQURfUElYRUxfREFUQV9SQU5HRV9MRU5HVEhfTlYgMHg4ODdCCi0jZGVmaW5lIEdMX1dSSVRFX1BJWEVMX0RBVEFfUkFOR0VfUE9JTlRFUl9OViAweDg4N0MKLSNkZWZpbmUgR0xfUkVBRF9QSVhFTF9EQVRBX1JBTkdFX1BPSU5URVJfTlYgMHg4ODdECi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9wcmltaXRpdmVfcmVzdGFydAotI2RlZmluZSBHTF9QUklNSVRJVkVfUkVTVEFSVF9OViAgICAgICAgICAgMHg4NTU4Ci0jZGVmaW5lIEdMX1BSSU1JVElWRV9SRVNUQVJUX0lOREVYX05WICAgICAweDg1NTkKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3RleHR1cmVfZXhwYW5kX25vcm1hbAotI2RlZmluZSBHTF9URVhUVVJFX1VOU0lHTkVEX1JFTUFQX01PREVfTlYgMHg4ODhGCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV9tYXBfb2JqZWN0X2J1ZmZlcgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVRJX3NlcGFyYXRlX3N0ZW5jaWwKLSNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZVTkNfQVRJICAgICAgICAgIDB4ODgwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRkFJTF9BVEkgICAgICAgICAgMHg4ODAxCi0jZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUxfQVRJIDB4ODgwMgotI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTX0FUSSAweDg4MDMKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV92ZXJ0ZXhfYXR0cmliX2FycmF5X29iamVjdAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfT0VTX3JlYWRfZm9ybWF0Ci0jZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgMHg4QjlBCi0jZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyAweDhCOUIKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9kZXB0aF9ib3VuZHNfdGVzdAotI2RlZmluZSBHTF9ERVBUSF9CT1VORFNfVEVTVF9FWFQgICAgICAgICAgMHg4ODkwCi0jZGVmaW5lIEdMX0RFUFRIX0JPVU5EU19FWFQgICAgICAgICAgICAgICAweDg4OTEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX21pcnJvcl9jbGFtcAotI2RlZmluZSBHTF9NSVJST1JfQ0xBTVBfRVhUICAgICAgICAgICAgICAgMHg4NzQyCi0jZGVmaW5lIEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVCAgICAgICAweDg3NDMKLSNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX1RPX0JPUkRFUl9FWFQgICAgIDB4ODkxMgotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlCi0jZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX1JHQl9FWFQgICAgICAgICBHTF9CTEVORF9FUVVBVElPTgotI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9BTFBIQV9FWFQgICAgICAgMHg4ODNECi0jZW5kaWYKLQotI2lmbmRlZiBHTF9NRVNBX3BhY2tfaW52ZXJ0Ci0jZGVmaW5lIEdMX1BBQ0tfSU5WRVJUX01FU0EgICAgICAgICAgICAgICAweDg3NTgKLSNlbmRpZgotCi0jaWZuZGVmIEdMX01FU0FfeWNiY3JfdGV4dHVyZQotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfTUVTQSAgICAgICAgMHg4NUJBCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfTUVTQSAgICAweDg1QkIKLSNkZWZpbmUgR0xfWUNCQ1JfTUVTQSAgICAgICAgICAgICAgICAgICAgIDB4ODc1NwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3BpeGVsX2J1ZmZlcl9vYmplY3QKLSNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVJfRVhUICAgICAgICAgIDB4ODhFQgotI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0VYVCAgICAgICAgMHg4OEVDCi0jZGVmaW5lIEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0JJTkRJTkdfRVhUICAweDg4RUQKLSNkZWZpbmUgR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HX0VYVCAweDg4RUYKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtMgotI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9FWEVDX0lOU1RSVUNUSU9OU19OViAweDg4RjQKLSNkZWZpbmUgR0xfTUFYX1BST0dSQU1fQ0FMTF9ERVBUSF9OViAgICAgIDB4ODhGNQotI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9JRl9ERVBUSF9OViAgICAgICAgMHg4OEY2Ci0jZGVmaW5lIEdMX01BWF9QUk9HUkFNX0xPT1BfREVQVEhfTlYgICAgICAweDg4RjcKLSNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTE9PUF9DT1VOVF9OViAgICAgIDB4ODhGOAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0yX29wdGlvbgotLyogcmV1c2UgR0xfTUFYX1BST0dSQU1fRVhFQ19JTlNUUlVDVElPTlNfTlYgKi8KLS8qIHJldXNlIEdMX01BWF9QUk9HUkFNX0NBTExfREVQVEhfTlYgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMwotLyogcmV1c2UgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdAotI2RlZmluZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl9FWFQgMHgwNTA2Ci0jZGVmaW5lIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRV9FWFQgICAgICAweDg0RTgKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQklORElOR19FWFQgICAgICAgIDB4OENBNgotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQklORElOR19FWFQgICAgICAgMHg4Q0E3Ci0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfRVhUIDB4OENEMAotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX0VYVCAweDhDRDEKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX0VYVCAweDhDRDIKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VfRVhUIDB4OENEMwotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfM0RfWk9GRlNFVF9FWFQgMHg4Q0Q0Ci0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCAgICAgICAweDhDRDUKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX0VYVCAweDhDRDYKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfRVhUIDB4OENENwotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RVUExJQ0FURV9BVFRBQ0hNRU5UX0VYVCAweDhDRDgKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TX0VYVCAweDhDRDkKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9GT1JNQVRTX0VYVCAweDhDREEKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9EUkFXX0JVRkZFUl9FWFQgMHg4Q0RCCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfRVhUIDB4OENEQwotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9FWFQgICAgMHg4Q0RECi0jZGVmaW5lIEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UU19FWFQgICAgICAweDhDREYKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDBfRVhUICAgICAgICAgIDB4OENFMAotI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMV9FWFQgICAgICAgICAgMHg4Q0UxCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQyX0VYVCAgICAgICAgICAweDhDRTIKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDNfRVhUICAgICAgICAgIDB4OENFMwotI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNF9FWFQgICAgICAgICAgMHg4Q0U0Ci0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ1X0VYVCAgICAgICAgICAweDhDRTUKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDZfRVhUICAgICAgICAgIDB4OENFNgotI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UN19FWFQgICAgICAgICAgMHg4Q0U3Ci0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ4X0VYVCAgICAgICAgICAweDhDRTgKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDlfRVhUICAgICAgICAgIDB4OENFOQotI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTBfRVhUICAgICAgICAgMHg4Q0VBCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMV9FWFQgICAgICAgICAweDhDRUIKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEyX0VYVCAgICAgICAgIDB4OENFQwotI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTNfRVhUICAgICAgICAgMHg4Q0VECi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxNF9FWFQgICAgICAgICAweDhDRUUKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDE1X0VYVCAgICAgICAgIDB4OENFRgotI2RlZmluZSBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCAgICAgICAgICAgMHg4RDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQgICAgICAgICAweDhEMjAKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfRVhUICAgICAgICAgICAgICAgIDB4OEQ0MAotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfRVhUICAgICAgICAgICAgICAgMHg4RDQxCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9XSURUSF9FWFQgICAgICAgICAweDhENDIKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9FWFQgICAgICAgIDB4OEQ0MwotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX0VYVCAweDhENDQKLSNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDFfRVhUICAgICAgICAgICAgIDB4OEQ0NgotI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYNF9FWFQgICAgICAgICAgICAgMHg4RDQ3Ci0jZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg4X0VYVCAgICAgICAgICAgICAweDhENDgKLSNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDE2X0VYVCAgICAgICAgICAgIDB4OEQ0OQotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfRVhUICAgICAgMHg4RDUwCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFX0VYVCAgICAweDhENTEKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRV9FWFQgICAgIDB4OEQ1MgotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9FWFQgICAgMHg4RDUzCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFX0VYVCAgICAweDhENTQKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRV9FWFQgIDB4OEQ1NQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfR1JFTUVEWV9zdHJpbmdfbWFya2VyCi0jZW5kaWYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2lmbmRlZiBHTF9WRVJTSU9OXzJfMAotLyogR0wgdHlwZSBmb3IgcHJvZ3JhbS9zaGFkZXIgdGV4dCAqLwotdHlwZWRlZiBjaGFyIEdMY2hhcjsJCQkvKiBuYXRpdmUgY2hhcmFjdGVyICovCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9WRVJTSU9OXzFfNQotLyogR0wgdHlwZXMgZm9yIGhhbmRsaW5nIGxhcmdlIHZlcnRleCBidWZmZXIgb2JqZWN0cyAqLwotdHlwZWRlZiBwdHJkaWZmX3QgR0xpbnRwdHI7Ci10eXBlZGVmIHB0cmRpZmZfdCBHTHNpemVpcHRyOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0Ci0vKiBHTCB0eXBlcyBmb3IgaGFuZGxpbmcgbGFyZ2UgdmVydGV4IGJ1ZmZlciBvYmplY3RzICovCi10eXBlZGVmIHB0cmRpZmZfdCBHTGludHB0ckFSQjsKLXR5cGVkZWYgcHRyZGlmZl90IEdMc2l6ZWlwdHJBUkI7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfc2hhZGVyX29iamVjdHMKLS8qIEdMIHR5cGVzIGZvciBoYW5kbGluZyBzaGFkZXIgb2JqZWN0IGhhbmRsZXMgYW5kIHByb2dyYW0vc2hhZGVyIHRleHQgKi8KLXR5cGVkZWYgY2hhciBHTGNoYXJBUkI7CQkvKiBuYXRpdmUgY2hhcmFjdGVyICovCi10eXBlZGVmIHVuc2lnbmVkIGludCBHTGhhbmRsZUFSQjsJLyogc2hhZGVyIG9iamVjdCBoYW5kbGUgKi8KLSNlbmRpZgotCi0vKiBHTCB0eXBlcyBmb3IgImhhbGYiIHByZWNpc2lvbiAoczEwZTUpIGZsb2F0IGRhdGEgaW4gaG9zdCBtZW1vcnkgKi8KLSNpZm5kZWYgR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgR0xoYWxmQVJCOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfaGFsZl9mbG9hdAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTGhhbGZOVjsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1ZFUlNJT05fMV8yCi0jZGVmaW5lIEdMX1ZFUlNJT05fMV8yIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRDb2xvciAoR0xjbGFtcGYsIEdMY2xhbXBmLCBHTGNsYW1wZiwgR0xjbGFtcGYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb24gKEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudHMgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMc2l6ZWksIEdMZW51bSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGUgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVQYXJhbWV0ZXJmdiAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JUYWJsZVBhcmFtZXRlcml2IChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbG9yVGFibGUgKEdMZW51bSwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGUgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdiAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yU3ViVGFibGUgKEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29sb3JTdWJUYWJsZSAoR0xlbnVtLCBHTHNpemVpLCBHTGludCwgR0xpbnQsIEdMc2l6ZWkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uRmlsdGVyMUQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uRmlsdGVyMkQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZiAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZnYgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaSAoR0xlbnVtLCBHTGVudW0sIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcml2IChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMUQgKEdMZW51bSwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlDb252b2x1dGlvbkZpbHRlcjJEIChHTGVudW0sIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvbkZpbHRlciAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyZnYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyaXYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTZXBhcmFibGVGaWx0ZXIgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqLCBHTHZvaWQgKiwgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlcGFyYWJsZUZpbHRlcjJEIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtIChHTGVudW0sIEdMYm9vbGVhbiwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJmdiAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyaXYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNaW5tYXggKEdMZW51bSwgR0xib29sZWFuLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heFBhcmFtZXRlcmZ2IChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJpdiAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEhpc3RvZ3JhbSAoR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIEdMYm9vbGVhbik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWlubWF4IChHTGVudW0sIEdMZW51bSwgR0xib29sZWFuKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNldEhpc3RvZ3JhbSAoR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNldE1pbm1heCAoR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhJbWFnZTNEIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xpbnQsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UzRCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UzRCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5EQ09MT1JQUk9DKSAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OUFJPQykgKEdMZW51bSBtb2RlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1JBTkdFRUxFTUVOVFNQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICp0YWJsZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVQQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09MT1JUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRhYmxlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SU1VCVEFCTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT0xPUlNVQlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTkZJTFRFUjFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTkZJTFRFUjJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09OVk9MVVRJT05GSUxURVIxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09OVk9MVVRJT05GSUxURVIyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05GSUxURVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqaW1hZ2UpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTlBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05QQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTRVBBUkFCTEVGSUxURVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcm93LCBHTHZvaWQgKmNvbHVtbiwgR0x2b2lkICpzcGFuKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VQQVJBQkxFRklMVEVSMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcm93LCBjb25zdCBHTHZvaWQgKmNvbHVtbik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnZhbHVlcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTVBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xISVNUT0dSQU1QUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1JTk1BWFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVTRVRISVNUT0dSQU1QUk9DKSAoR0xlbnVtIHRhcmdldCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU0VUTUlOTUFYUFJPQykgKEdMZW51bSB0YXJnZXQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9WRVJTSU9OXzFfMwotI2RlZmluZSBHTF9WRVJTSU9OXzFfMyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVRleHR1cmUgKEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSAoR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWQgKEdMZW51bSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZHYgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFmIChHTGVudW0sIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZnYgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWkgKEdMZW51bSwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaXYgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzIChHTGVudW0sIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxc3YgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmQgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmR2IChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZiAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmZ2IChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpIChHTGVudW0sIEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpdiAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMnMgKEdMZW51bSwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzdiAoR0xlbnVtLCBjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZCAoR0xlbnVtLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2R2IChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZiAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2Z2IChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNpIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaXYgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNzIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc3YgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGQgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZHYgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZnYgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGkgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aXYgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0c3YgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZCAoY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGQgKGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdlIChHTGNsYW1wZiwgR0xib29sZWFuKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRCAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0sIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlMUQgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMUQgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21wcmVzc2VkVGV4SW1hZ2UgKEdMZW51bSwgR0xpbnQsIEdMdm9pZCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFDVElWRVRFWFRVUkVQUk9DKSAoR0xlbnVtIHRleHR1cmUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTElFTlRBQ1RJVkVURVhUVVJFUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMURWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyRFZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQySVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRFZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENERWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0U1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMT0FEVFJBTlNQT1NFTUFUUklYRlBST0MpIChjb25zdCBHTGZsb2F0ICptKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWERQUk9DKSAoY29uc3QgR0xkb3VibGUgKm0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUVFJBTlNQT1NFTUFUUklYRlBST0MpIChjb25zdCBHTGZsb2F0ICptKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWERQUk9DKSAoY29uc3QgR0xkb3VibGUgKm0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVDT1ZFUkFHRVBST0MpIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01QUkVTU0VEVEVYSU1BR0VQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMdm9pZCAqaW1nKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1ZFUlNJT05fMV80Ci0jZGVmaW5lIEdMX1ZFUlNJT05fMV80IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGUgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRmIChHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGZ2IChjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkZCAoR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkZHYgKGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkUG9pbnRlciAoR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3QXJyYXlzIChHTGVudW0sIEdMaW50ICosIEdMc2l6ZWkgKiwgR0xzaXplaSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3RWxlbWVudHMgKEdMZW51bSwgY29uc3QgR0xzaXplaSAqLCBHTGVudW0sIGNvbnN0IEdMdm9pZCogKiwgR0xzaXplaSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmIChHTGVudW0sIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnYgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmkgKEdMZW51bSwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyaXYgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzYiAoR0xieXRlLCBHTGJ5dGUsIEdMYnl0ZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzYnYgKGNvbnN0IEdMYnl0ZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNkIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNkdiAoY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZnYgKGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaSAoR0xpbnQsIEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaXYgKGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3MgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3N2IChjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3ViIChHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1YnYgKGNvbnN0IEdMdWJ5dGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWkgKEdMdWludCwgR0x1aW50LCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VpdiAoY29uc3QgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VzIChHTHVzaG9ydCwgR0x1c2hvcnQsIEdMdXNob3J0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1c3YgKGNvbnN0IEdMdXNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlciAoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJkIChHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJkdiAoY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmYgKEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmdiAoY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyaSAoR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyaXYgKGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzIChHTHNob3J0LCBHTHNob3J0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Myc3YgKGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2QgKEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkdiAoY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2YgKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmdiAoY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzaSAoR0xpbnQsIEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2l2IChjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzcyAoR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3N2IChjb25zdCBHTHNob3J0ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRGVU5DU0VQQVJBVEVQUk9DKSAoR0xlbnVtIHNmYWN0b3JSR0IsIEdMZW51bSBkZmFjdG9yUkdCLCBHTGVudW0gc2ZhY3RvckFscGhhLCBHTGVudW0gZGZhY3RvckFscGhhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGUFJPQykgKEdMZmxvYXQgY29vcmQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKmNvb3JkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkREUFJPQykgKEdMZG91YmxlIGNvb3JkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkREVlBST0MpIChjb25zdCBHTGRvdWJsZSAqY29vcmQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SRFBPSU5URVJQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdBUlJBWVNQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50ICpmaXJzdCwgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVFNQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSSVBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJJVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNCUFJPQykgKEdMYnl0ZSByZWQsIEdMYnl0ZSBncmVlbiwgR0xieXRlIGJsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNCVlBST0MpIChjb25zdCBHTGJ5dGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNEUFJPQykgKEdMZG91YmxlIHJlZCwgR0xkb3VibGUgZ3JlZW4sIEdMZG91YmxlIGJsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNEVlBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0ZQUk9DKSAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0ZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNJUFJPQykgKEdMaW50IHJlZCwgR0xpbnQgZ3JlZW4sIEdMaW50IGJsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNJVlBST0MpIChjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1NQUk9DKSAoR0xzaG9ydCByZWQsIEdMc2hvcnQgZ3JlZW4sIEdMc2hvcnQgYmx1ZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1NWUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVQlBST0MpIChHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUJWUFJPQykgKGNvbnN0IEdMdWJ5dGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVSVBST0MpIChHTHVpbnQgcmVkLCBHTHVpbnQgZ3JlZW4sIEdMdWludCBibHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUlWUFJPQykgKGNvbnN0IEdMdWludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VTUFJPQykgKEdMdXNob3J0IHJlZCwgR0x1c2hvcnQgZ3JlZW4sIEdMdXNob3J0IGJsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVU1ZQUk9DKSAoY29uc3QgR0x1c2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUlBPSU5URVJQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRFBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRWUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkZQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRlZQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJUFJPQykgKEdMaW50IHgsIEdMaW50IHkpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MySVZQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyU1BST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTVlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNEVlBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRlZQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNJUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSVZQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU1BST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NWUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfVkVSU0lPTl8xXzUKLSNkZWZpbmUgR0xfVkVSU0lPTl8xXzUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5RdWVyaWVzIChHTHNpemVpLCBHTHVpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUXVlcmllcyAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNRdWVyeSAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblF1ZXJ5IChHTGVudW0sIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kUXVlcnkgKEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlpdiAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0aXYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdHVpdiAoR0x1aW50LCBHTGVudW0sIEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kQnVmZmVyIChHTGVudW0sIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlQnVmZmVycyAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbkJ1ZmZlcnMgKEdMc2l6ZWksIEdMdWludCAqKTsKLUdMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzQnVmZmVyIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJ1ZmZlckRhdGEgKEdMZW51bSwgR0xzaXplaXB0ciwgY29uc3QgR0x2b2lkICosIEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQnVmZmVyU3ViRGF0YSAoR0xlbnVtLCBHTGludHB0ciwgR0xzaXplaXB0ciwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclN1YkRhdGEgKEdMZW51bSwgR0xpbnRwdHIsIEdMc2l6ZWlwdHIsIEdMdm9pZCAqKTsKLUdMQVBJIEdMdm9pZCogQVBJRU5UUlkgZ2xNYXBCdWZmZXIgKEdMZW51bSwgR0xlbnVtKTsKLUdMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbFVubWFwQnVmZmVyIChHTGVudW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2IChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QnVmZmVyUG9pbnRlcnYgKEdMZW51bSwgR0xlbnVtLCBHTHZvaWQqICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOUVVFUklFU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFUVVFUklFU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1FVRVJZUFJPQykgKEdMdWludCBpZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOUVVFUllQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EUVVFUllQUk9DKSAoR0xlbnVtIHRhcmdldCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RJVlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUVUlWUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRCVUZGRVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUJVRkZFUlNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5CVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0JVRkZFUlBST0MpIChHTHVpbnQgYnVmZmVyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSREFUQVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSU1VCREFUQVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSU1VCREFUQVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFVOTUFQQlVGRkVSUFJPQykgKEdMZW51bSB0YXJnZXQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQT0lOVEVSVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9WRVJTSU9OXzJfMAotI2RlZmluZSBHTF9WRVJTSU9OXzJfMCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSAoR0xlbnVtLCBHTGVudW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdCdWZmZXJzIChHTHNpemVpLCBjb25zdCBHTGVudW0gKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGUgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSAoR0xlbnVtLCBHTGVudW0sIEdMaW50LCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUgKEdMZW51bSwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBdHRhY2hTaGFkZXIgKEdMdWludCwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kQXR0cmliTG9jYXRpb24gKEdMdWludCwgR0x1aW50LCBjb25zdCBHTGNoYXIgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcGlsZVNoYWRlciAoR0x1aW50KTsKLUdMQVBJIEdMdWludCBBUElFTlRSWSBnbENyZWF0ZVByb2dyYW0gKHZvaWQpOwotR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyIChHTGVudW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVByb2dyYW0gKEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlU2hhZGVyIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERldGFjaFNoYWRlciAoR0x1aW50LCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVBdHRyaWIgKEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMaW50ICosIEdMZW51bSAqLCBHTGNoYXIgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlVW5pZm9ybSAoR0x1aW50LCBHTHVpbnQsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0xpbnQgKiwgR0xlbnVtICosIEdMY2hhciAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBdHRhY2hlZFNoYWRlcnMgKEdMdWludCwgR0xzaXplaSwgR0xzaXplaSAqLCBHTHVpbnQgKik7Ci1HTEFQSSBHTGludCBBUElFTlRSWSBnbEdldEF0dHJpYkxvY2F0aW9uIChHTHVpbnQsIGNvbnN0IEdMY2hhciAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtaXYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtSW5mb0xvZyAoR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMY2hhciAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTaGFkZXJpdiAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNoYWRlckluZm9Mb2cgKEdMdWludCwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGNoYXIgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhZGVyU291cmNlIChHTHVpbnQsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0xjaGFyICopOwotR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtTG9jYXRpb24gKEdMdWludCwgY29uc3QgR0xjaGFyICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFVuaWZvcm1mdiAoR0x1aW50LCBHTGludCwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtaXYgKEdMdWludCwgR0xpbnQsIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmR2IChHTHVpbnQsIEdMZW51bSwgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZnYgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2IChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYgKEdMdWludCwgR0xlbnVtLCBHTHZvaWQqICopOwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNQcm9ncmFtIChHTHVpbnQpOwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNTaGFkZXIgKEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlua1Byb2dyYW0gKEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyU291cmNlIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMY2hhciogKiwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVXNlUHJvZ3JhbSAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWYgKEdMaW50LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmYgKEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2YgKEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGYgKEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWkgKEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJpIChHTGludCwgR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2kgKEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGkgKEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmdiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmdiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNmdiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmdiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpdiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaXYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2l2IChHTGludCwgR0xzaXplaSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpdiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyZnYgKEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDNmdiAoR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NGZ2IChHTGludCwgR0xzaXplaSwgR0xib29sZWFuLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhbGlkYXRlUHJvZ3JhbSAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZCAoR0x1aW50LCBHTGRvdWJsZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWR2IChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmIChHTHVpbnQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmdiAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzIChHTHVpbnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzdiAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmR2IChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmdiAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJzIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJzdiAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNkIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNkdiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZnYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzcyAoR0x1aW50LCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzc3YgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TmJ2IChHTHVpbnQsIGNvbnN0IEdMYnl0ZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0Tml2IChHTHVpbnQsIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROc3YgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnViIChHTHVpbnQsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWJ2IChHTHVpbnQsIGNvbnN0IEdMdWJ5dGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51aXYgKEdMdWludCwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdXN2IChHTHVpbnQsIGNvbnN0IEdMdXNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRidiAoR0x1aW50LCBjb25zdCBHTGJ5dGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGQgKEdMdWludCwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkdiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZnYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0aXYgKEdMdWludCwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHMgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHN2IChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHVidiAoR0x1aW50LCBjb25zdCBHTHVieXRlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1aXYgKEdMdWludCwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1c3YgKEdMdWludCwgY29uc3QgR0x1c2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliUG9pbnRlciAoR0x1aW50LCBHTGludCwgR0xlbnVtLCBHTGJvb2xlYW4sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURVBST0MpIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdCVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RFTkNJTE9QU0VQQVJBVEVQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBzZmFpbCwgR0xlbnVtIGRwZmFpbCwgR0xlbnVtIGRwcGFzcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxGVU5DU0VQQVJBVEVQUk9DKSAoR0xlbnVtIGZyb250ZnVuYywgR0xlbnVtIGJhY2tmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RFTkNJTE1BU0tTRVBBUkFURVBST0MpIChHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBVFRBQ0hTSEFERVJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQVRUUklCTE9DQVRJT05QUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyICpuYW1lKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUElMRVNIQURFUlBST0MpIChHTHVpbnQgc2hhZGVyKTsKLXR5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xDUkVBVEVQUk9HUkFNUFJPQykgKHZvaWQpOwotdHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTENSRUFURVNIQURFUlBST0MpIChHTGVudW0gdHlwZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVBST0dSQU1QUk9DKSAoR0x1aW50IHByb2dyYW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVTSEFERVJQUk9DKSAoR0x1aW50IHNoYWRlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFVEFDSFNIQURFUlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERJU0FCTEVWRVJURVhBVFRSSUJBUlJBWVBST0MpIChHTHVpbnQgaW5kZXgpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkFCTEVWRVJURVhBVFRSSUJBUlJBWVBST0MpIChHTHVpbnQgaW5kZXgpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVBVFRSSUJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVVOSUZPUk1QUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFUVEFDSEVEU0hBREVSU1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBtYXhDb3VudCwgR0xzaXplaSAqY291bnQsIEdMdWludCAqb2JqKTsKLXR5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVEFUVFJJQkxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1JTkZPTE9HUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBREVSSVZQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBREVSSU5GT0xPR1BST0MpIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBREVSU09VUkNFUFJPQykgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKnNvdXJjZSk7Ci10eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNTE9DQVRJT05QUk9DKSAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1GVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1JVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJEVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkZWUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQlBPSU5URVJWUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwb2ludGVyKTsKLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1BST0dSQU1QUk9DKSAoR0x1aW50IHByb2dyYW0pOwotdHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTU0hBREVSUFJPQykgKEdMdWludCBzaGFkZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSU5LUFJPR1JBTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQURFUlNPVVJDRVBST0MpIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqICpzdHJpbmcsIGNvbnN0IEdMaW50ICpsZW5ndGgpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVU0VQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFGUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJGUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNGUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRGUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0ySVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0ZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00RlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDJGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYM0ZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVg0RlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFMSURBVEVQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFGVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU1BST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMlNQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1BST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5CVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROSVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWJ5dGUgeCwgR0x1Ynl0ZSB5LCBHTHVieXRlIHosIEdMdWJ5dGUgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUJWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUlWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRCVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNElWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U1BST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUJWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVSVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VVNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl9tdWx0aXRleHR1cmUKLSNkZWZpbmUgR0xfQVJCX211bHRpdGV4dHVyZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVRleHR1cmVBUkIgKEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZUFSQiAoR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWRBUkIgKEdMZW51bSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZHZBUkIgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFmQVJCIChHTGVudW0sIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZnZBUkIgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWlBUkIgKEdMZW51bSwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaXZBUkIgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzQVJCIChHTGVudW0sIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxc3ZBUkIgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmRBUkIgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmR2QVJCIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZkFSQiAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmZ2QVJCIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpQVJCIChHTGVudW0sIEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpdkFSQiAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMnNBUkIgKEdMZW51bSwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzdkFSQiAoR0xlbnVtLCBjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZEFSQiAoR0xlbnVtLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2R2QVJCIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZkFSQiAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2Z2QVJCIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNpQVJCIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaXZBUkIgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNzQVJCIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc3ZBUkIgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGRBUkIgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZHZBUkIgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmQVJCIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZnZBUkIgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGlBUkIgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aXZBUkIgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzQVJCIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0c3ZBUkIgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFDVElWRVRFWFRVUkVBUkJQUk9DKSAoR0xlbnVtIHRleHR1cmUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTElFTlRBQ1RJVkVURVhUVVJFQVJCUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMURWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxU0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQySVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENERWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0U0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3RyYW5zcG9zZV9tYXRyaXgKLSNkZWZpbmUgR0xfQVJCX3RyYW5zcG9zZV9tYXRyaXggMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZkFSQiAoY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZEFSQiAoY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGZBUkIgKGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGRBUkIgKGNvbnN0IEdMZG91YmxlICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWEZBUkJQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURUUkFOU1BPU0VNQVRSSVhEQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWEZBUkJQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRUUkFOU1BPU0VNQVRSSVhEQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl9tdWx0aXNhbXBsZQotI2RlZmluZSBHTF9BUkJfbXVsdGlzYW1wbGUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZUFSQiAoR0xjbGFtcGYsIEdMYm9vbGVhbik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVDT1ZFUkFHRUFSQlBST0MpIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfYWRkCi0jZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Vudl9hZGQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAKLSNkZWZpbmUgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24KLSNkZWZpbmUgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24gMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzREFSQiAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEQVJCIChHTGVudW0sIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlMURBUkIgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzREFSQiAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkRBUkIgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMURBUkIgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21wcmVzc2VkVGV4SW1hZ2VBUkIgKEdMZW51bSwgR0xpbnQsIEdMdm9pZCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTNEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UyREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMURBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFM0RBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMkRBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMURBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01QUkVTU0VEVEVYSU1BR0VBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMdm9pZCAqaW1nKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcAotI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9ib3JkZXJfY2xhbXAgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMKLSNkZWZpbmUgR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZBUkIgKEdMZW51bSwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmdkFSQiAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGQVJCUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRlZBUkJQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3ZlcnRleF9ibGVuZAotI2RlZmluZSBHTF9BUkJfdmVydGV4X2JsZW5kIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0YnZBUkIgKEdMaW50LCBjb25zdCBHTGJ5dGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0c3ZBUkIgKEdMaW50LCBjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodGl2QVJCIChHTGludCwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0ZnZBUkIgKEdMaW50LCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodGR2QVJCIChHTGludCwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0dWJ2QVJCIChHTGludCwgY29uc3QgR0x1Ynl0ZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHR1c3ZBUkIgKEdMaW50LCBjb25zdCBHTHVzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHR1aXZBUkIgKEdMaW50LCBjb25zdCBHTHVpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0UG9pbnRlckFSQiAoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEJsZW5kQVJCIChHTGludCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRCVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTGJ5dGUgKndlaWdodHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRTVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHNob3J0ICp3ZWlnaHRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hUSVZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0xpbnQgKndlaWdodHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRGVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTGZsb2F0ICp3ZWlnaHRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hURFZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0xkb3VibGUgKndlaWdodHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRVQlZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1Ynl0ZSAqd2VpZ2h0cyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVFVTVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVzaG9ydCAqd2VpZ2h0cyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVFVJVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVpbnQgKndlaWdodHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRQT0lOVEVSQVJCUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQkxFTkRBUkJQUk9DKSAoR0xpbnQgY291bnQpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX21hdHJpeF9wYWxldHRlCi0jZGVmaW5lIEdMX0FSQl9tYXRyaXhfcGFsZXR0ZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1cnJlbnRQYWxldHRlTWF0cml4QVJCIChHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXh1YnZBUkIgKEdMaW50LCBjb25zdCBHTHVieXRlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeEluZGV4dXN2QVJCIChHTGludCwgY29uc3QgR0x1c2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXh1aXZBUkIgKEdMaW50LCBjb25zdCBHTHVpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyQVJCIChHTGludCwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDVVJSRU5UUEFMRVRURU1BVFJJWEFSQlBST0MpIChHTGludCBpbmRleCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYVUJWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdWJ5dGUgKmluZGljZXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhJTkRFWFVTVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVzaG9ydCAqaW5kaWNlcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYVUlWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdWludCAqaW5kaWNlcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYUE9JTlRFUkFSQlBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZQotI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZSAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY3Jvc3NiYXIKLSNkZWZpbmUgR0xfQVJCX3RleHR1cmVfZW52X2Nyb3NzYmFyIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzCi0jZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl90ZXh0dXJlX21pcnJvcmVkX3JlcGVhdAotI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX2RlcHRoX3RleHR1cmUKLSNkZWZpbmUgR0xfQVJCX2RlcHRoX3RleHR1cmUgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3NoYWRvdwotI2RlZmluZSBHTF9BUkJfc2hhZG93IDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl9zaGFkb3dfYW1iaWVudAotI2RlZmluZSBHTF9BUkJfc2hhZG93X2FtYmllbnQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3dpbmRvd19wb3MKLSNkZWZpbmUgR0xfQVJCX3dpbmRvd19wb3MgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZEFSQiAoR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZHZBUkIgKGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmQVJCIChHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZnZBUkIgKGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmlBUkIgKEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMml2QVJCIChjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Myc0FSQiAoR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMnN2QVJCIChjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkQVJCIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZHZBUkIgKGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmQVJCIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZnZBUkIgKGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2lBUkIgKEdMaW50LCBHTGludCwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpdkFSQiAoY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3NBUkIgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzdkFSQiAoY29uc3QgR0xzaG9ydCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJEQVJCUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRFZBUkJQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRkFSQlBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGVkFSQlBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklBUkJQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJVkFSQlBST0MpIChjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTQVJCUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMlNWQVJCUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzREFSQlBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RWQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZBUkJQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGVkFSQlBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lBUkJQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNJVkFSQlBST0MpIChjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNTQVJCUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU1ZBUkJQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdmVydGV4X3Byb2dyYW0KLSNkZWZpbmUgR0xfQVJCX3ZlcnRleF9wcm9ncmFtIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWRBUkIgKEdMdWludCwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFkdkFSQiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZkFSQiAoR0x1aW50LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZnZBUkIgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc0FSQiAoR0x1aW50LCBHTHNob3J0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc3ZBUkIgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZEFSQiAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkdkFSQiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZkFSQiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnZBUkIgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc0FSQiAoR0x1aW50LCBHTHNob3J0LCBHTHNob3J0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc3ZBUkIgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZEFSQiAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZHZBUkIgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2ZBUkIgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2QVJCIChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3NBUkIgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3N2QVJCIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5idkFSQiAoR0x1aW50LCBjb25zdCBHTGJ5dGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5pdkFSQiAoR0x1aW50LCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnN2QVJCIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51YkFSQiAoR0x1aW50LCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVidkFSQiAoR0x1aW50LCBjb25zdCBHTHVieXRlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWl2QVJCIChHTHVpbnQsIGNvbnN0IEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVzdkFSQiAoR0x1aW50LCBjb25zdCBHTHVzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0YnZBUkIgKEdMdWludCwgY29uc3QgR0xieXRlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkQVJCIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZHZBUkIgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZBUkIgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZ2QVJCIChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGl2QVJCIChHTHVpbnQsIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzQVJCIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzdkFSQiAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1YnZBUkIgKEdMdWludCwgY29uc3QgR0x1Ynl0ZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWl2QVJCIChHTHVpbnQsIGNvbnN0IEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dXN2QVJCIChHTHVpbnQsIGNvbnN0IEdMdXNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXJBUkIgKEdMdWludCwgR0xpbnQsIEdMZW51bSwgR0xib29sZWFuLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXlBUkIgKEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5QVJCIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1TdHJpbmdBUkIgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFByb2dyYW1BUkIgKEdMZW51bSwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtc0FSQiAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblByb2dyYW1zQVJCIChHTHNpemVpLCBHTHVpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUVudlBhcmFtZXRlcjRkQVJCIChHTGVudW0sIEdMdWludCwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZHZBUkIgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGZBUkIgKEdMZW51bSwgR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGZ2QVJCIChHTGVudW0sIEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZEFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZHZBUkIgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZkFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmdkFSQiAoR0xlbnVtLCBHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmR2QVJCIChHTGVudW0sIEdMdWludCwgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmZ2QVJCIChHTGVudW0sIEdMdWludCwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJkdkFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcmZ2QVJCIChHTGVudW0sIEdMdWludCwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtaXZBUkIgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtU3RyaW5nQVJCIChHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmR2QVJCIChHTHVpbnQsIEdMZW51bSwgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZnZBUkIgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2QVJCIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnZBUkIgKEdMdWludCwgR0xlbnVtLCBHTHZvaWQqICopOwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNQcm9ncmFtQVJCIChHTHVpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFGVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyREFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRFZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMlNBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzREFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRFZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5CVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROSVZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VQkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWJ5dGUgeCwgR0x1Ynl0ZSB5LCBHTHVieXRlIHosIEdMdWJ5dGUgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUJWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUlWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRCVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNElWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUJWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVSVZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VVNWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5BQkxFVkVSVEVYQVRUUklCQVJSQVlBUkJQUk9DKSAoR0x1aW50IGluZGV4KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRElTQUJMRVZFUlRFWEFUVFJJQkFSUkFZQVJCUFJPQykgKEdMdWludCBpbmRleCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1TVFJJTkdBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdm9pZCAqc3RyaW5nKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFBST0dSQU1BUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHByb2dyYW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVQUk9HUkFNU0FSQlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcHJvZ3JhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5QUk9HUkFNU0FSQlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqcHJvZ3JhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNERBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUjREVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNEZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNERBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNERWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUjRGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUVOVlBBUkFNRVRFUkRWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1FTlZQQVJBTUVURVJGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1MT0NBTFBBUkFNRVRFUkRWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1MT0NBTFBBUkFNRVRFUkZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUlWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1TVFJJTkdBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKnN0cmluZyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkRWQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQklWQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCUE9JTlRFUlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBvaW50ZXIpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTUFJPR1JBTUFSQlBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbQotI2RlZmluZSBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSAxCi0vKiBBbGwgQVJCX2ZyYWdtZW50X3Byb2dyYW0gZW50cnkgcG9pbnRzIGFyZSBzaGFyZWQgd2l0aCBBUkJfdmVydGV4X3Byb2dyYW0uICovCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QKLSNkZWZpbmUgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlckFSQiAoR0xlbnVtLCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnNBUkIgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5CdWZmZXJzQVJCIChHTHNpemVpLCBHTHVpbnQgKik7Ci1HTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0J1ZmZlckFSQiAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJEYXRhQVJCIChHTGVudW0sIEdMc2l6ZWlwdHJBUkIsIGNvbnN0IEdMdm9pZCAqLCBHTGVudW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJ1ZmZlclN1YkRhdGFBUkIgKEdMZW51bSwgR0xpbnRwdHJBUkIsIEdMc2l6ZWlwdHJBUkIsIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJTdWJEYXRhQVJCIChHTGVudW0sIEdMaW50cHRyQVJCLCBHTHNpemVpcHRyQVJCLCBHTHZvaWQgKik7Ci1HTEFQSSBHTHZvaWQqIEFQSUVOVFJZIGdsTWFwQnVmZmVyQVJCIChHTGVudW0sIEdMZW51bSk7Ci1HTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlckFSQiAoR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdkFSQiAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2QVJCIChHTGVudW0sIEdMZW51bSwgR0x2b2lkKiAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRCVUZGRVJBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUJVRkZFUlNBUkJQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5CVUZGRVJTQVJCUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0JVRkZFUkFSQlBST0MpIChHTHVpbnQgYnVmZmVyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSREFUQUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyQVJCIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSU1VCREFUQUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ckFSQiBvZmZzZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSU1VCREFUQUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ckFSQiBvZmZzZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFVOTUFQQlVGRkVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQQVJBTUVURVJJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQT0lOVEVSVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfb2NjbHVzaW9uX3F1ZXJ5Ci0jZGVmaW5lIEdMX0FSQl9vY2NsdXNpb25fcXVlcnkgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5RdWVyaWVzQVJCIChHTHNpemVpLCBHTHVpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUXVlcmllc0FSQiAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNRdWVyeUFSQiAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblF1ZXJ5QVJCIChHTGVudW0sIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kUXVlcnlBUkIgKEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlpdkFSQiAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0aXZBUkIgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdHVpdkFSQiAoR0x1aW50LCBHTGVudW0sIEdMdWludCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlFVRVJJRVNBUkJQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVFVRVJJRVNBUkJQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNRVUVSWUFSQlBST0MpIChHTHVpbnQgaWQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlFVRVJZQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVORFFVRVJZQVJCUFJPQykgKEdMZW51bSB0YXJnZXQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWUlWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUSVZBUkJQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVFVJVkFSQlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3NoYWRlcl9vYmplY3RzCi0jZGVmaW5lIEdMX0FSQl9zaGFkZXJfb2JqZWN0cyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZU9iamVjdEFSQiAoR0xoYW5kbGVBUkIpOwotR0xBUEkgR0xoYW5kbGVBUkIgQVBJRU5UUlkgZ2xHZXRIYW5kbGVBUkIgKEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGV0YWNoT2JqZWN0QVJCIChHTGhhbmRsZUFSQiwgR0xoYW5kbGVBUkIpOwotR0xBUEkgR0xoYW5kbGVBUkIgQVBJRU5UUlkgZ2xDcmVhdGVTaGFkZXJPYmplY3RBUkIgKEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyU291cmNlQVJCIChHTGhhbmRsZUFSQiwgR0xzaXplaSwgY29uc3QgR0xjaGFyQVJCKiAqLCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21waWxlU2hhZGVyQVJCIChHTGhhbmRsZUFSQik7Ci1HTEFQSSBHTGhhbmRsZUFSQiBBUElFTlRSWSBnbENyZWF0ZVByb2dyYW1PYmplY3RBUkIgKHZvaWQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEF0dGFjaE9iamVjdEFSQiAoR0xoYW5kbGVBUkIsIEdMaGFuZGxlQVJCKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5rUHJvZ3JhbUFSQiAoR0xoYW5kbGVBUkIpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVzZVByb2dyYW1PYmplY3RBUkIgKEdMaGFuZGxlQVJCKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYWxpZGF0ZVByb2dyYW1BUkIgKEdMaGFuZGxlQVJCKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWZBUkIgKEdMaW50LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmZBUkIgKEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2ZBUkIgKEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGZBUkIgKEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWlBUkIgKEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJpQVJCIChHTGludCwgR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2lBUkIgKEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGlBUkIgKEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaXZBUkIgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2l2QVJCIChHTGludCwgR0xzaXplaSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyZnZBUkIgKEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDNmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NGZ2QVJCIChHTGludCwgR0xzaXplaSwgR0xib29sZWFuLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE9iamVjdFBhcmFtZXRlcmZ2QVJCIChHTGhhbmRsZUFSQiwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE9iamVjdFBhcmFtZXRlcml2QVJCIChHTGhhbmRsZUFSQiwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbmZvTG9nQVJCIChHTGhhbmRsZUFSQiwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGNoYXJBUkIgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXR0YWNoZWRPYmplY3RzQVJCIChHTGhhbmRsZUFSQiwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGhhbmRsZUFSQiAqKTsKLUdMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0VW5pZm9ybUxvY2F0aW9uQVJCIChHTGhhbmRsZUFSQiwgY29uc3QgR0xjaGFyQVJCICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm1BUkIgKEdMaGFuZGxlQVJCLCBHTHVpbnQsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0xpbnQgKiwgR0xlbnVtICosIEdMY2hhckFSQiAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtZnZBUkIgKEdMaGFuZGxlQVJCLCBHTGludCwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtaXZBUkIgKEdMaGFuZGxlQVJCLCBHTGludCwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhZGVyU291cmNlQVJCIChHTGhhbmRsZUFSQiwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGNoYXJBUkIgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVPQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqKTsKLXR5cGVkZWYgR0xoYW5kbGVBUkIgKEFQSUVOVFJZUCBQRk5HTEdFVEhBTkRMRUFSQlBST0MpIChHTGVudW0gcG5hbWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVRBQ0hPQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgY29udGFpbmVyT2JqLCBHTGhhbmRsZUFSQiBhdHRhY2hlZE9iaik7Ci10eXBlZGVmIEdMaGFuZGxlQVJCIChBUElFTlRSWVAgUEZOR0xDUkVBVEVTSEFERVJPQkpFQ1RBUkJQUk9DKSAoR0xlbnVtIHNoYWRlclR5cGUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJTT1VSQ0VBUkJQUk9DKSAoR0xoYW5kbGVBUkIgc2hhZGVyT2JqLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXJBUkIqICpzdHJpbmcsIGNvbnN0IEdMaW50ICpsZW5ndGgpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QSUxFU0hBREVSQVJCUFJPQykgKEdMaGFuZGxlQVJCIHNoYWRlck9iaik7Ci10eXBlZGVmIEdMaGFuZGxlQVJCIChBUElFTlRSWVAgUEZOR0xDUkVBVEVQUk9HUkFNT0JKRUNUQVJCUFJPQykgKHZvaWQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBVFRBQ0hPQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgY29udGFpbmVyT2JqLCBHTGhhbmRsZUFSQiBvYmopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSU5LUFJPR1JBTUFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVVNFUFJPR1JBTU9CSkVDVEFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFMSURBVEVQUk9HUkFNQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjApOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0ZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNEZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMZmxvYXQgdjMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUlBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJJQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0lBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNElBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIsIEdMaW50IHYzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zRlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUlWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMklWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0lWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNElWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMkZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgzRlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDRGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RQQVJBTUVURVJGVkFSQlBST0MpIChHTGhhbmRsZUFSQiBvYmosIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUUEFSQU1FVEVSSVZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTkZPTE9HQVJCUFJPQykgKEdMaGFuZGxlQVJCIG9iaiwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyQVJCICppbmZvTG9nKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQVRUQUNIRURPQkpFQ1RTQVJCUFJPQykgKEdMaGFuZGxlQVJCIGNvbnRhaW5lck9iaiwgR0xzaXplaSBtYXhDb3VudCwgR0xzaXplaSAqY291bnQsIEdMaGFuZGxlQVJCICpvYmopOwotdHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUxPQ0FUSU9OQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIGNvbnN0IEdMY2hhckFSQiAqbmFtZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVVOSUZPUk1BUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0x1aW50IGluZGV4LCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXJBUkIgKm5hbWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNRlZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1JVkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUlNPVVJDRUFSQlBST0MpIChHTGhhbmRsZUFSQiBvYmosIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhckFSQiAqc291cmNlKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyCi0jZGVmaW5lIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEF0dHJpYkxvY2F0aW9uQVJCIChHTGhhbmRsZUFSQiwgR0x1aW50LCBjb25zdCBHTGNoYXJBUkIgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlQXR0cmliQVJCIChHTGhhbmRsZUFSQiwgR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMaW50ICosIEdMZW51bSAqLCBHTGNoYXJBUkIgKik7Ci1HTEFQSSBHTGludCBBUElFTlRSWSBnbEdldEF0dHJpYkxvY2F0aW9uQVJCIChHTGhhbmRsZUFSQiwgY29uc3QgR0xjaGFyQVJCICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREFUVFJJQkxPQ0FUSU9OQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyQVJCICpuYW1lKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQUNUSVZFQVRUUklCQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMdWludCBpbmRleCwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyQVJCICpuYW1lKTsKLXR5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVEFUVFJJQkxPQ0FUSU9OQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIGNvbnN0IEdMY2hhckFSQiAqbmFtZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfc2hhZGVyCi0jZGVmaW5lIEdMX0FSQl9mcmFnbWVudF9zaGFkZXIgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfMTAwCi0jZGVmaW5lIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzEwMCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvCi0jZGVmaW5lIEdMX0FSQl90ZXh0dXJlX25vbl9wb3dlcl9vZl90d28gMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3BvaW50X3Nwcml0ZQotI2RlZmluZSBHTF9BUkJfcG9pbnRfc3ByaXRlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtX3NoYWRvdwotI2RlZmluZSBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbV9zaGFkb3cgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX2RyYXdfYnVmZmVycwotI2RlZmluZSBHTF9BUkJfZHJhd19idWZmZXJzIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0J1ZmZlcnNBUkIgKEdMc2l6ZWksIGNvbnN0IEdMZW51bSAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdCVUZGRVJTQVJCUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZQotI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9yZWN0YW5nbGUgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX2NvbG9yX2J1ZmZlcl9mbG9hdAotI2RlZmluZSBHTF9BUkJfY29sb3JfYnVmZmVyX2Zsb2F0IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xhbXBDb2xvckFSQiAoR0xlbnVtLCBHTGVudW0pOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xBTVBDT0xPUkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gY2xhbXApOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwKLSNkZWZpbmUgR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZmxvYXQKLSNkZWZpbmUgR0xfQVJCX3RleHR1cmVfZmxvYXQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVJCX3BpeGVsX2J1ZmZlcl9vYmplY3QKLSNkZWZpbmUgR0xfQVJCX3BpeGVsX2J1ZmZlcl9vYmplY3QgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2FiZ3IKLSNkZWZpbmUgR0xfRVhUX2FiZ3IgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX2NvbG9yCi0jZGVmaW5lIEdMX0VYVF9ibGVuZF9jb2xvciAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kQ29sb3JFWFQgKEdMY2xhbXBmLCBHTGNsYW1wZiwgR0xjbGFtcGYsIEdMY2xhbXBmKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5EQ09MT1JFWFRQUk9DKSAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3BvbHlnb25fb2Zmc2V0Ci0jZGVmaW5lIEdMX0VYVF9wb2x5Z29uX29mZnNldCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXRFWFQgKEdMZmxvYXQsIEdMZmxvYXQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9MWUdPTk9GRlNFVEVYVFBST0MpIChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCBiaWFzKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlCi0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlM0QKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmUzRCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlM0RFWFQgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xpbnQsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UzREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWElNQUdFM0RFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UzREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfZmlsdGVyNAotI2RlZmluZSBHTF9TR0lTX3RleHR1cmVfZmlsdGVyNCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleEZpbHRlckZ1bmNTR0lTIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhGaWx0ZXJGdW5jU0dJUyAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhGSUxURVJGVU5DU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZmlsdGVyLCBHTGZsb2F0ICp3ZWlnaHRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYRklMVEVSRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZpbHRlciwgR0xzaXplaSBuLCBjb25zdCBHTGZsb2F0ICp3ZWlnaHRzKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9zdWJ0ZXh0dXJlCi0jZGVmaW5lIEdMX0VYVF9zdWJ0ZXh0dXJlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UxREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfY29weV90ZXh0dXJlCi0jZGVmaW5lIEdMX0VYVF9jb3B5X3RleHR1cmUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UxREVYVCAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyREVYVCAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UxREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkRFWFQgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UzREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhJTUFHRTFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhJTUFHRTJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfaGlzdG9ncmFtCi0jZGVmaW5lIEdMX0VYVF9oaXN0b2dyYW0gMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1FWFQgKEdMZW51bSwgR0xib29sZWFuLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcmZ2RVhUIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJpdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heEVYVCAoR0xlbnVtLCBHTGJvb2xlYW4sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4UGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heFBhcmFtZXRlcml2RVhUIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsSGlzdG9ncmFtRVhUIChHTGVudW0sIEdMc2l6ZWksIEdMZW51bSwgR0xib29sZWFuKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNaW5tYXhFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGJvb2xlYW4pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlc2V0SGlzdG9ncmFtRVhUIChHTGVudW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlc2V0TWlubWF4RVhUIChHTGVudW0pOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEhJU1RPR1JBTUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUlOTUFYRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNFVEhJU1RPR1JBTUVYVFBST0MpIChHTGVudW0gdGFyZ2V0KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVTRVRNSU5NQVhFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfY29udm9sdXRpb24KLSNkZWZpbmUgR0xfRVhUX2NvbnZvbHV0aW9uIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIxREVYVCAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIyREVYVCAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmRVhUIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpRVhUIChHTGVudW0sIEdMZW51bSwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaXZFWFQgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIxREVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMkRFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uRmlsdGVyRVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJpdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNlcGFyYWJsZUZpbHRlckVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICosIEdMdm9pZCAqLCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2VwYXJhYmxlRmlsdGVyMkRFWFQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICosIGNvbnN0IEdMdm9pZCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9ORklMVEVSMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9ORklMVEVSMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUkZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUklFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT05WT0xVVElPTkZJTFRFUjFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT05WT0xVVElPTkZJTFRFUjJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTkZJTFRFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICppbWFnZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9OUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTlBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNFUEFSQUJMRUZJTFRFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpyb3csIEdMdm9pZCAqY29sdW1uLCBHTHZvaWQgKnNwYW4pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVBBUkFCTEVGSUxURVIyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpyb3csIGNvbnN0IEdMdm9pZCAqY29sdW1uKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9jb2xvcl9tYXRyaXgKLSNkZWZpbmUgR0xfRVhUX2NvbG9yX21hdHJpeCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lfY29sb3JfdGFibGUKLSNkZWZpbmUgR0xfU0dJX2NvbG9yX3RhYmxlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JUYWJsZVNHSSAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JUYWJsZVBhcmFtZXRlcmZ2U0dJIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyaXZTR0kgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29sb3JUYWJsZVNHSSAoR0xlbnVtLCBHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVNHSSAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdlNHSSAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2U0dJIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFU0dJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSRlZTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSSVZTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SVEFCTEVTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0YWJsZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJGVlNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJJVlNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9waXhlbF90ZXh0dXJlCi0jZGVmaW5lIEdMX1NHSVhfcGl4ZWxfdGV4dHVyZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuU0dJWCAoR0xlbnVtKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVEVYR0VOU0dJWFBST0MpIChHTGVudW0gbW9kZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3BpeGVsX3RleHR1cmUKLSNkZWZpbmUgR0xfU0dJU19waXhlbF90ZXh0dXJlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJpU0dJUyAoR0xlbnVtLCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJpdlNHSVMgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJmU0dJUyAoR0xlbnVtLCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRleEdlblBhcmFtZXRlcmZ2U0dJUyAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFBpeGVsVGV4R2VuUGFyYW1ldGVyaXZTR0lTIChHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFBpeGVsVGV4R2VuUGFyYW1ldGVyZnZTR0lTIChHTGVudW0sIEdMZmxvYXQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlBBUkFNRVRFUklTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlBBUkFNRVRFUklWU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlBBUkFNRVRFUkZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVEVYR0VOUEFSQU1FVEVSRlZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUElYRUxURVhHRU5QQVJBTUVURVJJVlNHSVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUElYRUxURVhHRU5QQVJBTUVURVJGVlNHSVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJU190ZXh0dXJlNEQKLSNkZWZpbmUgR0xfU0dJU190ZXh0dXJlNEQgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhJbWFnZTREU0dJUyAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTREU0dJUyAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhJTUFHRTREU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xzaXplaSBzaXplNGQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0U0RFNHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHdvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTHNpemVpIHNpemU0ZCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSV90ZXh0dXJlX2NvbG9yX3RhYmxlCi0jZGVmaW5lIEdMX1NHSV90ZXh0dXJlX2NvbG9yX3RhYmxlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9jbXlrYQotI2RlZmluZSBHTF9FWFRfY215a2EgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfb2JqZWN0Ci0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX29iamVjdCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsQXJlVGV4dHVyZXNSZXNpZGVudEVYVCAoR0xzaXplaSwgY29uc3QgR0x1aW50ICosIEdMYm9vbGVhbiAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZUVYVCAoR0xlbnVtLCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzRVhUIChHTHNpemVpLCBjb25zdCBHTHVpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVGV4dHVyZXNFWFQgKEdMc2l6ZWksIEdMdWludCAqKTsKLUdMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVGV4dHVyZUVYVCAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcmlvcml0aXplVGV4dHVyZXNFWFQgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqLCBjb25zdCBHTGNsYW1wZiAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMQVJFVEVYVFVSRVNSRVNJREVOVEVYVFBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMsIEdMYm9vbGVhbiAqcmVzaWRlbmNlcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRURVhUVVJFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVEVYVFVSRVNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOVEVYVFVSRVNFWFRQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1RFWFRVUkVFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUklPUklUSVpFVEVYVFVSRVNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzLCBjb25zdCBHTGNsYW1wZiAqcHJpb3JpdGllcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX2RldGFpbF90ZXh0dXJlCi0jZGVmaW5lIEdMX1NHSVNfZGV0YWlsX3RleHR1cmUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXRhaWxUZXhGdW5jU0dJUyAoR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldERldGFpbFRleEZ1bmNTR0lTIChHTGVudW0sIEdMZmxvYXQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVRBSUxURVhGVU5DU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG4sIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVERFVEFJTFRFWEZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgKnBvaW50cyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3NoYXJwZW5fdGV4dHVyZQotI2RlZmluZSBHTF9TR0lTX3NoYXJwZW5fdGV4dHVyZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYXJwZW5UZXhGdW5jU0dJUyAoR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNoYXJwZW5UZXhGdW5jU0dJUyAoR0xlbnVtLCBHTGZsb2F0ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBUlBFTlRFWEZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBUlBFTlRFWEZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgKnBvaW50cyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfcGFja2VkX3BpeGVscwotI2RlZmluZSBHTF9FWFRfcGFja2VkX3BpeGVscyAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfbG9kCi0jZGVmaW5lIEdMX1NHSVNfdGV4dHVyZV9sb2QgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJU19tdWx0aXNhbXBsZQotI2RlZmluZSBHTF9TR0lTX211bHRpc2FtcGxlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlTWFza1NHSVMgKEdMY2xhbXBmLCBHTGJvb2xlYW4pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZVBhdHRlcm5TR0lTIChHTGVudW0pOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFTUFTS1NHSVNQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVQQVRURVJOU0dJU1BST0MpIChHTGVudW0gcGF0dGVybik7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfcmVzY2FsZV9ub3JtYWwKLSNkZWZpbmUgR0xfRVhUX3Jlc2NhbGVfbm9ybWFsIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfYXJyYXkKLSNkZWZpbmUgR0xfRVhUX3ZlcnRleF9hcnJheSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFycmF5RWxlbWVudEVYVCAoR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlckVYVCAoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXNFWFQgKEdMZW51bSwgR0xpbnQsIEdMc2l6ZWkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVkZ2VGbGFnUG9pbnRlckVYVCAoR0xzaXplaSwgR0xzaXplaSwgY29uc3QgR0xib29sZWFuICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFBvaW50ZXJ2RVhUIChHTGVudW0sIEdMdm9pZCogKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5kZXhQb2ludGVyRVhUIChHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyRVhUIChHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXJFWFQgKEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyRVhUIChHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBUlJBWUVMRU1FTlRFWFRQUk9DKSAoR0xpbnQgaSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUE9JTlRFUkVYVFBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdBUlJBWVNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRURHRUZMQUdQT0lOVEVSRVhUUFJPQykgKEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGJvb2xlYW4gKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQT0lOVEVSVkVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElOREVYUE9JTlRFUkVYVFBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFBPSU5URVJFWFRQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFBPSU5URVJFWFRQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhQT0lOVEVSRVhUUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9taXNjX2F0dHJpYnV0ZQotI2RlZmluZSBHTF9FWFRfbWlzY19hdHRyaWJ1dGUgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAKLSNkZWZpbmUgR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9jbGlwbWFwCi0jZGVmaW5lIEdMX1NHSVhfY2xpcG1hcCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3NoYWRvdwotI2RlZmluZSBHTF9TR0lYX3NoYWRvdyAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfZWRnZV9jbGFtcAotI2RlZmluZSBHTF9TR0lTX3RleHR1cmVfZWRnZV9jbGFtcCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfYm9yZGVyX2NsYW1wCi0jZGVmaW5lIEdMX1NHSVNfdGV4dHVyZV9ib3JkZXJfY2xhbXAgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX21pbm1heAotI2RlZmluZSBHTF9FWFRfYmxlbmRfbWlubWF4IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvbkVYVCAoR0xlbnVtKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05FWFRQUk9DKSAoR0xlbnVtIG1vZGUpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX3N1YnRyYWN0Ci0jZGVmaW5lIEdMX0VYVF9ibGVuZF9zdWJ0cmFjdCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfYmxlbmRfbG9naWNfb3AKLSNkZWZpbmUgR0xfRVhUX2JsZW5kX2xvZ2ljX29wIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfaW50ZXJsYWNlCi0jZGVmaW5lIEdMX1NHSVhfaW50ZXJsYWNlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGlsZXMKLSNkZWZpbmUgR0xfU0dJWF9waXhlbF90aWxlcyAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfc2VsZWN0Ci0jZGVmaW5lIEdMX1NHSVhfdGV4dHVyZV9zZWxlY3QgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9zcHJpdGUKLSNkZWZpbmUgR0xfU0dJWF9zcHJpdGUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTcHJpdGVQYXJhbWV0ZXJmU0dJWCAoR0xlbnVtLCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTcHJpdGVQYXJhbWV0ZXJmdlNHSVggKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTcHJpdGVQYXJhbWV0ZXJpU0dJWCAoR0xlbnVtLCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3ByaXRlUGFyYW1ldGVyaXZTR0lYIChHTGVudW0sIGNvbnN0IEdMaW50ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1BSSVRFUEFSQU1FVEVSRlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1BSSVRFUEFSQU1FVEVSRlZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1BSSVRFUEFSQU1FVEVSSVNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNQUklURVBBUkFNRVRFUklWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX211bHRpX2J1ZmZlcgotI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfbXVsdGlfYnVmZmVyIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzCi0jZGVmaW5lIEdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmRVhUIChHTGVudW0sIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRkVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVNfcG9pbnRfcGFyYW1ldGVycwotI2RlZmluZSBHTF9TR0lTX3BvaW50X3BhcmFtZXRlcnMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZTR0lTIChHTGVudW0sIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnZTR0lTIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRlZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfaW5zdHJ1bWVudHMKLSNkZWZpbmUgR0xfU0dJWF9pbnN0cnVtZW50cyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRJbnN0cnVtZW50c1NHSVggKHZvaWQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluc3RydW1lbnRzQnVmZmVyU0dJWCAoR0xzaXplaSwgR0xpbnQgKik7Ci1HTEFQSSBHTGludCBBUElFTlRSWSBnbFBvbGxJbnN0cnVtZW50c1NHSVggKEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlYWRJbnN0cnVtZW50c1NHSVggKEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGFydEluc3RydW1lbnRzU0dJWCAodm9pZCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RvcEluc3RydW1lbnRzU0dJWCAoR0xpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVElOU1RSVU1FTlRTU0dJWFBST0MpICh2b2lkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5TVFJVTUVOVFNCVUZGRVJTR0lYUFJPQykgKEdMc2l6ZWkgc2l6ZSwgR0xpbnQgKmJ1ZmZlcik7Ci10eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xQT0xMSU5TVFJVTUVOVFNTR0lYUFJPQykgKEdMaW50ICptYXJrZXJfcCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFQURJTlNUUlVNRU5UU1NHSVhQUk9DKSAoR0xpbnQgbWFya2VyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RBUlRJTlNUUlVNRU5UU1NHSVhQUk9DKSAodm9pZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNUT1BJTlNUUlVNRU5UU1NHSVhQUk9DKSAoR0xpbnQgbWFya2VyKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9zY2FsZV9iaWFzCi0jZGVmaW5lIEdMX1NHSVhfdGV4dHVyZV9zY2FsZV9iaWFzIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfZnJhbWV6b29tCi0jZGVmaW5lIEdMX1NHSVhfZnJhbWV6b29tIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVab29tU0dJWCAoR0xpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVaT09NU0dJWFBST0MpIChHTGludCBmYWN0b3IpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF90YWdfc2FtcGxlX2J1ZmZlcgotI2RlZmluZSBHTF9TR0lYX3RhZ19zYW1wbGVfYnVmZmVyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFnU2FtcGxlQnVmZmVyU0dJWCAodm9pZCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQUdTQU1QTEVCVUZGRVJTR0lYUFJPQykgKHZvaWQpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9wb2x5bm9taWFsX2ZmZAotI2RlZmluZSBHTF9TR0lYX3BvbHlub21pYWxfZmZkIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVmb3JtYXRpb25NYXAzZFNHSVggKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGludCwgR0xpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xpbnQsIEdMaW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMaW50LCBHTGludCwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVmb3JtYXRpb25NYXAzZlNHSVggKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xpbnQsIEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGludCwgR0xpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMaW50LCBHTGludCwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWZvcm1TR0lYIChHTGJpdGZpZWxkKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHlEZWZvcm1hdGlvbk1hcFNHSVggKEdMYml0ZmllbGQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVGT1JNQVRJT05NQVAzRFNHSVhQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyLCBHTGludCB1c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMZG91YmxlIHYxLCBHTGRvdWJsZSB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLCBHTGRvdWJsZSB3MSwgR0xkb3VibGUgdzIsIEdMaW50IHdzdHJpZGUsIEdMaW50IHdvcmRlciwgY29uc3QgR0xkb3VibGUgKnBvaW50cyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFRk9STUFUSU9OTUFQM0ZTR0lYUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgdTEsIEdMZmxvYXQgdTIsIEdMaW50IHVzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLCBHTGZsb2F0IHcxLCBHTGZsb2F0IHcyLCBHTGludCB3c3RyaWRlLCBHTGludCB3b3JkZXIsIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFRk9STVNHSVhQUk9DKSAoR0xiaXRmaWVsZCBtYXNrKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRElERU5USVRZREVGT1JNQVRJT05NQVBTR0lYUFJPQykgKEdMYml0ZmllbGQgbWFzayk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3JlZmVyZW5jZV9wbGFuZQotI2RlZmluZSBHTF9TR0lYX3JlZmVyZW5jZV9wbGFuZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlZmVyZW5jZVBsYW5lU0dJWCAoY29uc3QgR0xkb3VibGUgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRUZFUkVOQ0VQTEFORVNHSVhQUk9DKSAoY29uc3QgR0xkb3VibGUgKmVxdWF0aW9uKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfZmx1c2hfcmFzdGVyCi0jZGVmaW5lIEdMX1NHSVhfZmx1c2hfcmFzdGVyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2hSYXN0ZXJTR0lYICh2b2lkKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNIUkFTVEVSU0dJWFBST0MpICh2b2lkKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfZGVwdGhfdGV4dHVyZQotI2RlZmluZSBHTF9TR0lYX2RlcHRoX3RleHR1cmUgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJU19mb2dfZnVuY3Rpb24KLSNkZWZpbmUgR0xfU0dJU19mb2dfZnVuY3Rpb24gMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dGdW5jU0dJUyAoR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGb2dGdW5jU0dJUyAoR0xmbG9hdCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0ZVTkNTR0lTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURk9HRlVOQ1NHSVNQUk9DKSAoR0xmbG9hdCAqcG9pbnRzKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfZm9nX29mZnNldAotI2RlZmluZSBHTF9TR0lYX2ZvZ19vZmZzZXQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfSFBfaW1hZ2VfdHJhbnNmb3JtCi0jZGVmaW5lIEdMX0hQX2ltYWdlX3RyYW5zZm9ybSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaUhQIChHTGVudW0sIEdMZW51bSwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZkhQIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJpdkhQIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmdkhQIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFAgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZ2SFAgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJJSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSRkhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSSVZIUFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTUFHRVRSQU5TRk9STVBBUkFNRVRFUkZWSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTUFHRVRSQU5TRk9STVBBUkFNRVRFUklWSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJGVkhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0hQX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcwotI2RlZmluZSBHTF9IUF9jb252b2x1dGlvbl9ib3JkZXJfbW9kZXMgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX2FkZF9lbnYKLSNkZWZpbmUgR0xfU0dJWF90ZXh0dXJlX2FkZF9lbnYgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2NvbG9yX3N1YnRhYmxlCi0jZGVmaW5lIEdMX0VYVF9jb2xvcl9zdWJ0YWJsZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yU3ViVGFibGVFWFQgKEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29sb3JTdWJUYWJsZUVYVCAoR0xlbnVtLCBHTHNpemVpLCBHTGludCwgR0xpbnQsIEdMc2l6ZWkpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JTVUJUQUJMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTHNpemVpIGNvdW50LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SU1VCVEFCTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9QR0lfdmVydGV4X2hpbnRzCi0jZGVmaW5lIEdMX1BHSV92ZXJ0ZXhfaGludHMgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfUEdJX21pc2NfaGludHMKLSNkZWZpbmUgR0xfUEdJX21pc2NfaGludHMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaW50UEdJIChHTGVudW0sIEdMaW50KTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEhJTlRQR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbW9kZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZQotI2RlZmluZSBHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVFWFQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JUQUJMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnRhYmxlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfY2xpcF92b2x1bWVfaGludAotI2RlZmluZSBHTF9FWFRfY2xpcF92b2x1bWVfaGludCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX2xpc3RfcHJpb3JpdHkKLSNkZWZpbmUgR0xfU0dJWF9saXN0X3ByaW9yaXR5IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TGlzdFBhcmFtZXRlcmZ2U0dJWCAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TGlzdFBhcmFtZXRlcml2U0dJWCAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpc3RQYXJhbWV0ZXJmU0dJWCAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpc3RQYXJhbWV0ZXJmdlNHSVggKEdMdWludCwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpc3RQYXJhbWV0ZXJpU0dJWCAoR0x1aW50LCBHTGVudW0sIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaXN0UGFyYW1ldGVyaXZTR0lYIChHTHVpbnQsIEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMSVNUUEFSQU1FVEVSRlZTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVExJU1RQQVJBTUVURVJJVlNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExJU1RQQVJBTUVURVJGU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElTVFBBUkFNRVRFUkZWU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSVNUUEFSQU1FVEVSSVNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSVNUUEFSQU1FVEVSSVZTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9pcl9pbnN0cnVtZW50MQotI2RlZmluZSBHTF9TR0lYX2lyX2luc3RydW1lbnQxIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfY2FsbGlncmFwaGljX2ZyYWdtZW50Ci0jZGVmaW5lIEdMX1NHSVhfY2FsbGlncmFwaGljX2ZyYWdtZW50IDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9sb2RfYmlhcwotI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfbG9kX2JpYXMgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9zaGFkb3dfYW1iaWVudAotI2RlZmluZSBHTF9TR0lYX3NoYWRvd19hbWJpZW50IDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9pbmRleF90ZXh0dXJlCi0jZGVmaW5lIEdMX0VYVF9pbmRleF90ZXh0dXJlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9pbmRleF9tYXRlcmlhbAotI2RlZmluZSBHTF9FWFRfaW5kZXhfbWF0ZXJpYWwgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbmRleE1hdGVyaWFsRVhUIChHTGVudW0sIEdMZW51bSk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWE1BVEVSSUFMRVhUUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfaW5kZXhfZnVuYwotI2RlZmluZSBHTF9FWFRfaW5kZXhfZnVuYyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluZGV4RnVuY0VYVCAoR0xlbnVtLCBHTGNsYW1wZik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWEZVTkNFWFRQUk9DKSAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfaW5kZXhfYXJyYXlfZm9ybWF0cwotI2RlZmluZSBHTF9FWFRfaW5kZXhfYXJyYXlfZm9ybWF0cyAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfY29tcGlsZWRfdmVydGV4X2FycmF5Ci0jZGVmaW5lIEdMX0VYVF9jb21waWxlZF92ZXJ0ZXhfYXJyYXkgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2NrQXJyYXlzRVhUIChHTGludCwgR0xzaXplaSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5sb2NrQXJyYXlzRVhUICh2b2lkKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQ0tBUlJBWVNFWFRQUk9DKSAoR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTkxPQ0tBUlJBWVNFWFRQUk9DKSAodm9pZCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfY3VsbF92ZXJ0ZXgKLSNkZWZpbmUgR0xfRVhUX2N1bGxfdmVydGV4IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ3VsbFBhcmFtZXRlcmR2RVhUIChHTGVudW0sIEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1bGxQYXJhbWV0ZXJmdkVYVCAoR0xlbnVtLCBHTGZsb2F0ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ1VMTFBBUkFNRVRFUkRWRVhUUFJPQykgKEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENVTExQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3ljcmNiCi0jZGVmaW5lIEdMX1NHSVhfeWNyY2IgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9mcmFnbWVudF9saWdodGluZwotI2RlZmluZSBHTF9TR0lYX2ZyYWdtZW50X2xpZ2h0aW5nIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRDb2xvck1hdGVyaWFsU0dJWCAoR0xlbnVtLCBHTGVudW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRmU0dJWCAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRmdlNHSVggKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRpU0dJWCAoR0xlbnVtLCBHTGVudW0sIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0aXZTR0lYIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodE1vZGVsZlNHSVggKEdMZW51bSwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodE1vZGVsZnZTR0lYIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodE1vZGVsaVNHSVggKEdMZW51bSwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRNb2RlbGl2U0dJWCAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudE1hdGVyaWFsZlNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudE1hdGVyaWFsZnZTR0lYIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudE1hdGVyaWFsaVNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRNYXRlcmlhbGl2U0dJWCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYWdtZW50TGlnaHRmdlNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYWdtZW50TGlnaHRpdlNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFnbWVudE1hdGVyaWFsZnZTR0lYIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFnbWVudE1hdGVyaWFsaXZTR0lYIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRFbnZpU0dJWCAoR0xlbnVtLCBHTGludCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVENPTE9STUFURVJJQUxTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRGU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRGVlNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRJU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hUSVZTR0lYUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVE1PREVMRlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVE1PREVMRlZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVE1PREVMSVNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRNT0RFTElWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVE1BVEVSSUFMRlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTUFURVJJQUxGVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRNQVRFUklBTElTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRNQVRFUklBTElWU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR01FTlRMSUdIVEZWU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR01FTlRMSUdIVElWU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdNRU5UTUFURVJJQUxGVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR01FTlRNQVRFUklBTElWU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElHSFRFTlZJU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0lCTV9yYXN0ZXJwb3NfY2xpcAotI2RlZmluZSBHTF9JQk1fcmFzdGVycG9zX2NsaXAgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfSFBfdGV4dHVyZV9saWdodGluZwotI2RlZmluZSBHTF9IUF90ZXh0dXJlX2xpZ2h0aW5nIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9kcmF3X3JhbmdlX2VsZW1lbnRzCi0jZGVmaW5lIEdMX0VYVF9kcmF3X3JhbmdlX2VsZW1lbnRzIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudHNFWFQgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMc2l6ZWksIEdMZW51bSwgY29uc3QgR0x2b2lkICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1JBTkdFRUxFTUVOVFNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9XSU5fcGhvbmdfc2hhZGluZwotI2RlZmluZSBHTF9XSU5fcGhvbmdfc2hhZGluZyAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9XSU5fc3BlY3VsYXJfZm9nCi0jZGVmaW5lIEdMX1dJTl9zcGVjdWxhcl9mb2cgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2xpZ2h0X3RleHR1cmUKLSNkZWZpbmUgR0xfRVhUX2xpZ2h0X3RleHR1cmUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBcHBseVRleHR1cmVFWFQgKEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUxpZ2h0RVhUIChHTGVudW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVNYXRlcmlhbEVYVCAoR0xlbnVtLCBHTGVudW0pOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVBQTFlURVhUVVJFRVhUUFJPQykgKEdMZW51bSBtb2RlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUxJR0hURVhUUFJPQykgKEdMZW51bSBwbmFtZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVNQVRFUklBTEVYVFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9ibGVuZF9hbHBoYV9taW5tYXgKLSNkZWZpbmUgR0xfU0dJWF9ibGVuZF9hbHBoYV9taW5tYXggMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JncmEKLSNkZWZpbmUgR0xfRVhUX2JncmEgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9hc3luYwotI2RlZmluZSBHTF9TR0lYX2FzeW5jIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQXN5bmNNYXJrZXJTR0lYIChHTHVpbnQpOwotR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xGaW5pc2hBc3luY1NHSVggKEdMdWludCAqKTsKLUdMQVBJIEdMaW50IEFQSUVOVFJZIGdsUG9sbEFzeW5jU0dJWCAoR0x1aW50ICopOwotR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuQXN5bmNNYXJrZXJzU0dJWCAoR0xzaXplaSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlQXN5bmNNYXJrZXJzU0dJWCAoR0x1aW50LCBHTHNpemVpKTsKLUdMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzQXN5bmNNYXJrZXJTR0lYIChHTHVpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVNZTkNNQVJLRVJTR0lYUFJPQykgKEdMdWludCBtYXJrZXIpOwotdHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMRklOSVNIQVNZTkNTR0lYUFJPQykgKEdMdWludCAqbWFya2VycCk7Ci10eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xQT0xMQVNZTkNTR0lYUFJPQykgKEdMdWludCAqbWFya2VycCk7Ci10eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMR0VOQVNZTkNNQVJLRVJTU0dJWFBST0MpIChHTHNpemVpIHJhbmdlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFQVNZTkNNQVJLRVJTU0dJWFBST0MpIChHTHVpbnQgbWFya2VyLCBHTHNpemVpIHJhbmdlKTsKLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0FTWU5DTUFSS0VSU0dJWFBST0MpIChHTHVpbnQgbWFya2VyKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfYXN5bmNfcGl4ZWwKLSNkZWZpbmUgR0xfU0dJWF9hc3luY19waXhlbCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX2FzeW5jX2hpc3RvZ3JhbQotI2RlZmluZSBHTF9TR0lYX2FzeW5jX2hpc3RvZ3JhbSAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9JTlRFTF9wYXJhbGxlbF9hcnJheXMKLSNkZWZpbmUgR0xfSU5URUxfcGFyYWxsZWxfYXJyYXlzIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlcnZJTlRFTCAoR0xpbnQsIEdMZW51bSwgY29uc3QgR0x2b2lkKiAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVydklOVEVMIChHTGVudW0sIGNvbnN0IEdMdm9pZCogKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JQb2ludGVydklOVEVMIChHTGludCwgR0xlbnVtLCBjb25zdCBHTHZvaWQqICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUG9pbnRlcnZJTlRFTCAoR0xpbnQsIEdMZW51bSwgY29uc3QgR0x2b2lkKiAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFBPSU5URVJWSU5URUxQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxQT0lOVEVSVklOVEVMUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JQT0lOVEVSVklOVEVMUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQT0lOVEVSVklOVEVMUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0hQX29jY2x1c2lvbl90ZXN0Ci0jZGVmaW5lIEdMX0hQX29jY2x1c2lvbl90ZXN0IDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9waXhlbF90cmFuc2Zvcm0KLSNkZWZpbmUgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyaUVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcmZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcml2RVhUIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUklFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVFJBTlNGT1JNUEFSQU1FVEVSRkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVFJBTlNGT1JNUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybV9jb2xvcl90YWJsZQotI2RlZmluZSBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtX2NvbG9yX3RhYmxlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9zaGFyZWRfdGV4dHVyZV9wYWxldHRlCi0jZGVmaW5lIEdMX0VYVF9zaGFyZWRfdGV4dHVyZV9wYWxldHRlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9zZXBhcmF0ZV9zcGVjdWxhcl9jb2xvcgotI2RlZmluZSBHTF9FWFRfc2VwYXJhdGVfc3BlY3VsYXJfY29sb3IgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3NlY29uZGFyeV9jb2xvcgotI2RlZmluZSBHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzYkVYVCAoR0xieXRlLCBHTGJ5dGUsIEdMYnl0ZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzYnZFWFQgKGNvbnN0IEdMYnl0ZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNkRVhUIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNkdkVYVCAoY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZkVYVCAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZnZFWFQgKGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaUVYVCAoR0xpbnQsIEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaXZFWFQgKGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3NFWFQgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3N2RVhUIChjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3ViRVhUIChHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1YnZFWFQgKGNvbnN0IEdMdWJ5dGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWlFWFQgKEdMdWludCwgR0x1aW50LCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VpdkVYVCAoY29uc3QgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VzRVhUIChHTHVzaG9ydCwgR0x1c2hvcnQsIEdMdXNob3J0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1c3ZFWFQgKGNvbnN0IEdMdXNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlckVYVCAoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQkVYVFBST0MpIChHTGJ5dGUgcmVkLCBHTGJ5dGUgZ3JlZW4sIEdMYnl0ZSBibHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQlZFWFRQUk9DKSAoY29uc3QgR0xieXRlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzREVYVFBST0MpIChHTGRvdWJsZSByZWQsIEdMZG91YmxlIGdyZWVuLCBHTGRvdWJsZSBibHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRFZFWFRQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGRVhUUFJPQykgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSUVYVFBST0MpIChHTGludCByZWQsIEdMaW50IGdyZWVuLCBHTGludCBibHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSVZFWFRQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTRVhUUFJPQykgKEdMc2hvcnQgcmVkLCBHTHNob3J0IGdyZWVuLCBHTHNob3J0IGJsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTVkVYVFBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUJFWFRQUk9DKSAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VCVkVYVFBST0MpIChjb25zdCBHTHVieXRlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUlFWFRQUk9DKSAoR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLCBHTHVpbnQgYmx1ZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VJVkVYVFBST0MpIChjb25zdCBHTHVpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVU0VYVFBST0MpIChHTHVzaG9ydCByZWQsIEdMdXNob3J0IGdyZWVuLCBHTHVzaG9ydCBibHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVVNWRVhUUFJPQykgKGNvbnN0IEdMdXNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQT0lOVEVSRVhUUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3BlcnR1cmJfbm9ybWFsCi0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3BlcnR1cmJfbm9ybWFsIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZU5vcm1hbEVYVCAoR0xlbnVtKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVOT1JNQUxFWFRQUk9DKSAoR0xlbnVtIG1vZGUpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzCi0jZGVmaW5lIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0FycmF5c0VYVCAoR0xlbnVtLCBHTGludCAqLCBHTHNpemVpICosIEdMc2l6ZWkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzRVhUIChHTGVudW0sIGNvbnN0IEdMc2l6ZWkgKiwgR0xlbnVtLCBjb25zdCBHTHZvaWQqICosIEdMc2l6ZWkpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXQVJSQVlTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9mb2dfY29vcmQKLSNkZWZpbmUgR0xfRVhUX2ZvZ19jb29yZCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkZkVYVCAoR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRmdkVYVCAoY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGRFWFQgKEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGR2RVhUIChjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZFBvaW50ZXJFWFQgKEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGRVhUUFJPQykgKEdMZmxvYXQgY29vcmQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKmNvb3JkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRERVhUUFJPQykgKEdMZG91YmxlIGNvb3JkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkREVkVYVFBST0MpIChjb25zdCBHTGRvdWJsZSAqY29vcmQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SRFBPSU5URVJFWFRQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfUkVORF9zY3JlZW5fY29vcmRpbmF0ZXMKLSNkZWZpbmUgR0xfUkVORF9zY3JlZW5fY29vcmRpbmF0ZXMgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2Nvb3JkaW5hdGVfZnJhbWUKLSNkZWZpbmUgR0xfRVhUX2Nvb3JkaW5hdGVfZnJhbWUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2JFWFQgKEdMYnl0ZSwgR0xieXRlLCBHTGJ5dGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzYnZFWFQgKGNvbnN0IEdMYnl0ZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2RFWFQgKEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzZHZFWFQgKGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzZkVYVCAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNmdkVYVCAoY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2lFWFQgKEdMaW50LCBHTGludCwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzaXZFWFQgKGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzc0VYVCAoR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNzdkVYVCAoY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNiRVhUIChHTGJ5dGUsIEdMYnl0ZSwgR0xieXRlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNidkVYVCAoY29uc3QgR0xieXRlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2RFWFQgKEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2R2RVhUIChjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNmRVhUIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNmdkVYVCAoY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNpRVhUIChHTGludCwgR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNpdkVYVCAoY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzc0VYVCAoR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzc3ZFWFQgKGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudFBvaW50ZXJFWFQgKEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsUG9pbnRlckVYVCAoR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0JFWFRQUk9DKSAoR0xieXRlIHR4LCBHTGJ5dGUgdHksIEdMYnl0ZSB0eik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzQlZFWFRQUk9DKSAoY29uc3QgR0xieXRlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNERVhUUFJPQykgKEdMZG91YmxlIHR4LCBHTGRvdWJsZSB0eSwgR0xkb3VibGUgdHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0RWRVhUUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNGRVhUUFJPQykgKEdMZmxvYXQgdHgsIEdMZmxvYXQgdHksIEdMZmxvYXQgdHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0ZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0lFWFRQUk9DKSAoR0xpbnQgdHgsIEdMaW50IHR5LCBHTGludCB0eik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzSVZFWFRQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM1NFWFRQUk9DKSAoR0xzaG9ydCB0eCwgR0xzaG9ydCB0eSwgR0xzaG9ydCB0eik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzU1ZFWFRQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0JFWFRQUk9DKSAoR0xieXRlIGJ4LCBHTGJ5dGUgYnksIEdMYnl0ZSBieik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0JWRVhUUFJPQykgKGNvbnN0IEdMYnl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0RFWFRQUk9DKSAoR0xkb3VibGUgYngsIEdMZG91YmxlIGJ5LCBHTGRvdWJsZSBieik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0RWRVhUUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzRkVYVFBST0MpIChHTGZsb2F0IGJ4LCBHTGZsb2F0IGJ5LCBHTGZsb2F0IGJ6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzRlZFWFRQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0lFWFRQUk9DKSAoR0xpbnQgYngsIEdMaW50IGJ5LCBHTGludCBieik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0lWRVhUUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzU0VYVFBST0MpIChHTHNob3J0IGJ4LCBHTHNob3J0IGJ5LCBHTHNob3J0IGJ6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzU1ZFWFRQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlRQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUxQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9jb21iaW5lCi0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2Vudl9jb21iaW5lIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FQUExFX3NwZWN1bGFyX3ZlY3RvcgotI2RlZmluZSBHTF9BUFBMRV9zcGVjdWxhcl92ZWN0b3IgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVBQTEVfdHJhbnNmb3JtX2hpbnQKLSNkZWZpbmUgR0xfQVBQTEVfdHJhbnNmb3JtX2hpbnQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9mb2dfc2NhbGUKLSNkZWZpbmUgR0xfU0dJWF9mb2dfc2NhbGUgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU1VOWF9jb25zdGFudF9kYXRhCi0jZGVmaW5lIEdMX1NVTlhfY29uc3RhbnRfZGF0YSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmlzaFRleHR1cmVTVU5YICh2b2lkKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTklTSFRFWFRVUkVTVU5YUFJPQykgKHZvaWQpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU1VOX2dsb2JhbF9hbHBoYQotI2RlZmluZSBHTF9TVU5fZ2xvYmFsX2FscGhhIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JiU1VOIChHTGJ5dGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9yc1NVTiAoR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JpU1VOIChHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JmU1VOIChHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcmRTVU4gKEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcnViU1VOIChHTHVieXRlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcnVzU1VOIChHTHVzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3J1aVNVTiAoR0x1aW50KTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SQlNVTlBST0MpIChHTGJ5dGUgZmFjdG9yKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JTU1VOUFJPQykgKEdMc2hvcnQgZmFjdG9yKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JJU1VOUFJPQykgKEdMaW50IGZhY3Rvcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SRlNVTlBST0MpIChHTGZsb2F0IGZhY3Rvcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SRFNVTlBST0MpIChHTGRvdWJsZSBmYWN0b3IpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUlVCU1VOUFJPQykgKEdMdWJ5dGUgZmFjdG9yKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JVU1NVTlBST0MpIChHTHVzaG9ydCBmYWN0b3IpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUlVJU1VOUFJPQykgKEdMdWludCBmYWN0b3IpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU1VOX3RyaWFuZ2xlX2xpc3QKLSNkZWZpbmUgR0xfU1VOX3RyaWFuZ2xlX2xpc3QgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVNVTiAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1c1NVTiAoR0x1c2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXViU1VOIChHTHVieXRlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aXZTVU4gKGNvbnN0IEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1c3ZTVU4gKGNvbnN0IEdMdXNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVidlNVTiAoY29uc3QgR0x1Ynl0ZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGVQb2ludGVyU1VOIChHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCogKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVNVTlBST0MpIChHTHVpbnQgY29kZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVTU1VOUFJPQykgKEdMdXNob3J0IGNvZGUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVQlNVTlBST0MpIChHTHVieXRlIGNvZGUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpjb2RlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVVNWU1VOUFJPQykgKGNvbnN0IEdMdXNob3J0ICpjb2RlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUJWU1VOUFJPQykgKGNvbnN0IEdMdWJ5dGUgKmNvZGUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVQT0lOVEVSU1VOUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlcik7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TVU5fdmVydGV4Ci0jZGVmaW5lIEdMX1NVTl92ZXJ0ZXggMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR1YlZlcnRleDJmU1VOIChHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR1YlZlcnRleDJmdlNVTiAoY29uc3QgR0x1Ynl0ZSAqLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNHViVmVydGV4M2ZTVU4gKEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNHViVmVydGV4M2Z2U1VOIChjb25zdCBHTHVieXRlICosIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3IzZlZlcnRleDNmU1VOIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmVmVydGV4M2ZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRmVmVydGV4NGZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGZWZXJ0ZXg0ZnZTVU4gKGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3I0dWJWZXJ0ZXgzZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yNHViVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMdWJ5dGUgKiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmU1VOIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXg0ZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZkNvbG9yNGZOb3JtYWwzZlZlcnRleDRmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVZlcnRleDNmU1VOIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNHViVmVydGV4M2ZTVU4gKEdMdWludCwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjR1YlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICosIGNvbnN0IEdMdWJ5dGUgKiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZlNVTiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlOb3JtYWwzZlZlcnRleDNmU1VOIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmU1VOIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmU1VOIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNFVCVkVSVEVYMkZTVU5QUk9DKSAoR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNFVCVkVSVEVYMkZWU1VOUFJPQykgKGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRVQlZFUlRFWDNGU1VOUFJPQykgKEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNFVCVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDRGVkVSVEVYNEZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcCwgR0xmbG9hdCBxLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDRGVkVSVEVYNEZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SNFVCVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjRVQlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0x1Ynl0ZSAqYywgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1IzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SNEZOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0RkNPTE9SNEZOT1JNQUwzRlZFUlRFWDRGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHAsIEdMZmxvYXQgcSwgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDRGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYNEZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjRVQlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjRVQlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTHVieXRlICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSU5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVRFWENPT1JEMkZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVRFWENPT1JEMkZDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVRFWENPT1JEMkZDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUKLSNkZWZpbmUgR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZUVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFRVhUUFJPQykgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9JTkdSX2JsZW5kX2Z1bmNfc2VwYXJhdGUKLSNkZWZpbmUgR0xfSU5HUl9ibGVuZF9mdW5jX3NlcGFyYXRlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGVJTkdSIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0pOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRGVU5DU0VQQVJBVEVJTkdSUFJPQykgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9JTkdSX2NvbG9yX2NsYW1wCi0jZGVmaW5lIEdMX0lOR1JfY29sb3JfY2xhbXAgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfSU5HUl9pbnRlcmxhY2VfcmVhZAotI2RlZmluZSBHTF9JTkdSX2ludGVybGFjZV9yZWFkIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9zdGVuY2lsX3dyYXAKLSNkZWZpbmUgR0xfRVhUX3N0ZW5jaWxfd3JhcCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfNDIyX3BpeGVscwotI2RlZmluZSBHTF9FWFRfNDIyX3BpeGVscyAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl90ZXhnZW5fcmVmbGVjdGlvbgotI2RlZmluZSBHTF9OVl90ZXhnZW5fcmVmbGVjdGlvbiAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TVU5fY29udm9sdXRpb25fYm9yZGVyX21vZGVzCi0jZGVmaW5lIEdMX1NVTl9jb252b2x1dGlvbl9ib3JkZXJfbW9kZXMgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZW52X2FkZAotI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9lbnZfYWRkIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2xvZF9iaWFzCi0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2xvZF9iaWFzIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYwotI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3ZlcnRleF93ZWlnaHRpbmcKLSNkZWZpbmUgR0xfRVhUX3ZlcnRleF93ZWlnaHRpbmcgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRmRVhUIChHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRmdkVYVCAoY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRQb2ludGVyRVhUIChHTHNpemVpLCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFdFSUdIVEZFWFRQUk9DKSAoR0xmbG9hdCB3ZWlnaHQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICp3ZWlnaHQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRQT0lOVEVSRVhUUFJPQykgKEdMc2l6ZWkgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfbGlnaHRfbWF4X2V4cG9uZW50Ci0jZGVmaW5lIEdMX05WX2xpZ2h0X21heF9leHBvbmVudCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UKLSNkZWZpbmUgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2hWZXJ0ZXhBcnJheVJhbmdlTlYgKHZvaWQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEFycmF5UmFuZ2VOViAoR0xzaXplaSwgY29uc3QgR0x2b2lkICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRkxVU0hWRVJURVhBUlJBWVJBTkdFTlZQUk9DKSAodm9pZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFSUkFZUkFOR0VOVlBST0MpIChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3JlZ2lzdGVyX2NvbWJpbmVycwotI2RlZmluZSBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclBhcmFtZXRlcmZOViAoR0xlbnVtLCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclBhcmFtZXRlcml2TlYgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJQYXJhbWV0ZXJpTlYgKEdMZW51bSwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbWJpbmVySW5wdXROViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJPdXRwdXROViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGJvb2xlYW4sIEdMYm9vbGVhbiwgR0xib29sZWFuKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5hbENvbWJpbmVySW5wdXROViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21iaW5lcklucHV0UGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbWJpbmVySW5wdXRQYXJhbWV0ZXJpdk5WIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbWJpbmVyT3V0cHV0UGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21iaW5lck91dHB1dFBhcmFtZXRlcml2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZpbmFsQ29tYmluZXJJbnB1dFBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZpbmFsQ29tYmluZXJJbnB1dFBhcmFtZXRlcml2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSRk5WUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01CSU5FUlBBUkFNRVRFUklOVlBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJJTlBVVE5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIGlucHV0LCBHTGVudW0gbWFwcGluZywgR0xlbnVtIGNvbXBvbmVudFVzYWdlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJPVVRQVVROVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gYWJPdXRwdXQsIEdMZW51bSBjZE91dHB1dCwgR0xlbnVtIHN1bU91dHB1dCwgR0xlbnVtIHNjYWxlLCBHTGVudW0gYmlhcywgR0xib29sZWFuIGFiRG90UHJvZHVjdCwgR0xib29sZWFuIGNkRG90UHJvZHVjdCwgR0xib29sZWFuIG11eFN1bSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTkFMQ09NQklORVJJTlBVVE5WUFJPQykgKEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIGlucHV0LCBHTGVudW0gbWFwcGluZywgR0xlbnVtIGNvbXBvbmVudFVzYWdlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJJTlBVVFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTUJJTkVSSU5QVVRQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJPVVRQVVRQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJPVVRQVVRQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZJTkFMQ09NQklORVJJTlBVVFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZJTkFMQ09NQklORVJJTlBVVFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfZm9nX2Rpc3RhbmNlCi0jZGVmaW5lIEdMX05WX2ZvZ19kaXN0YW5jZSAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl90ZXhnZW5fZW1ib3NzCi0jZGVmaW5lIEdMX05WX3RleGdlbl9lbWJvc3MgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfYmxlbmRfc3F1YXJlCi0jZGVmaW5lIEdMX05WX2JsZW5kX3NxdWFyZSAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNAotI2RlZmluZSBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9NRVNBX3Jlc2l6ZV9idWZmZXJzCi0jZGVmaW5lIEdMX01FU0FfcmVzaXplX2J1ZmZlcnMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNpemVCdWZmZXJzTUVTQSAodm9pZCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNJWkVCVUZGRVJTTUVTQVBST0MpICh2b2lkKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX01FU0Ffd2luZG93X3BvcwotI2RlZmluZSBHTF9NRVNBX3dpbmRvd19wb3MgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZE1FU0EgKEdMZG91YmxlLCBHTGRvdWJsZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmR2TUVTQSAoY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmZNRVNBIChHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZnZNRVNBIChjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpTUVTQSAoR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyaXZNRVNBIChjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Myc01FU0EgKEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzdk1FU0EgKGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2RNRVNBIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZHZNRVNBIChjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZk1FU0EgKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmdk1FU0EgKGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2lNRVNBIChHTGludCwgR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzaXZNRVNBIChjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Mzc01FU0EgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzdk1FU0EgKGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGRNRVNBIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGR2TUVTQSAoY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGZNRVNBIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0ZnZNRVNBIChjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRpTUVTQSAoR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRpdk1FU0EgKGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRzTUVTQSAoR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNHN2TUVTQSAoY29uc3QgR0xzaG9ydCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJETUVTQVBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRWTUVTQVBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGTUVTQVBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGVk1FU0FQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJTUVTQVBST0MpIChHTGludCB4LCBHTGludCB5KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklWTUVTQVBST0MpIChjb25zdCBHTGludCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTTUVTQVBST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTVk1FU0FQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNETUVTQVBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RWTUVTQVBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGTUVTQVBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZWTUVTQVBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lNRVNBUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSVZNRVNBUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NNRVNBUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU1ZNRVNBUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0RE1FU0FQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzREVk1FU0FQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0Rk1FU0FQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNEZWTUVTQVBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNElNRVNBUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0SVZNRVNBUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNFNNRVNBUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzRTVk1FU0FQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9JQk1fY3VsbF92ZXJ0ZXgKLSNkZWZpbmUgR0xfSUJNX2N1bGxfdmVydGV4IDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0lCTV9tdWx0aW1vZGVfZHJhd19hcnJheXMKLSNkZWZpbmUgR0xfSUJNX211bHRpbW9kZV9kcmF3X2FycmF5cyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpTW9kZURyYXdBcnJheXNJQk0gKGNvbnN0IEdMZW51bSAqLCBjb25zdCBHTGludCAqLCBjb25zdCBHTHNpemVpICosIEdMc2l6ZWksIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aU1vZGVEcmF3RWxlbWVudHNJQk0gKGNvbnN0IEdMZW51bSAqLCBjb25zdCBHTHNpemVpICosIEdMZW51bSwgY29uc3QgR0x2b2lkKiBjb25zdCAqLCBHTHNpemVpLCBHTGludCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSU1PREVEUkFXQVJSQVlTSUJNUFJPQykgKGNvbnN0IEdMZW51bSAqbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQsIEdMaW50IG1vZGVzdHJpZGUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSU1PREVEUkFXRUxFTUVOVFNJQk1QUk9DKSAoY29uc3QgR0xlbnVtICptb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogY29uc3QgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTGludCBtb2Rlc3RyaWRlKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0lCTV92ZXJ0ZXhfYXJyYXlfbGlzdHMKLSNkZWZpbmUgR0xfSUJNX3ZlcnRleF9hcnJheV9saXN0cyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlckxpc3RJQk0gKEdMaW50LCBHTGVudW0sIEdMaW50LCBjb25zdCBHTHZvaWQqICosIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvclBvaW50ZXJMaXN0SUJNIChHTGludCwgR0xlbnVtLCBHTGludCwgY29uc3QgR0x2b2lkKiAqLCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRWRnZUZsYWdQb2ludGVyTGlzdElCTSAoR0xpbnQsIGNvbnN0IEdMYm9vbGVhbiogKiwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkUG9pbnRlckxpc3RJQk0gKEdMZW51bSwgR0xpbnQsIGNvbnN0IEdMdm9pZCogKiwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluZGV4UG9pbnRlckxpc3RJQk0gKEdMZW51bSwgR0xpbnQsIGNvbnN0IEdMdm9pZCogKiwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFBvaW50ZXJMaXN0SUJNIChHTGVudW0sIEdMaW50LCBjb25zdCBHTHZvaWQqICosIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXJMaXN0SUJNIChHTGludCwgR0xlbnVtLCBHTGludCwgY29uc3QgR0x2b2lkKiAqLCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlckxpc3RJQk0gKEdMaW50LCBHTGVudW0sIEdMaW50LCBjb25zdCBHTHZvaWQqICosIEdMaW50KTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQT0lOVEVSTElTVElCTVBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFREdFRkxBR1BPSU5URVJMSVNUSUJNUFJPQykgKEdMaW50IHN0cmlkZSwgY29uc3QgR0xib29sZWFuKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRQT0lOVEVSTElTVElCTVBST0MpIChHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWFBPSU5URVJMSVNUSUJNUFJPQykgKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFBPSU5URVJMSVNUSUJNUFJPQykgKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfc3Vic2FtcGxlCi0jZGVmaW5lIEdMX1NHSVhfc3Vic2FtcGxlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfeWNyY2JhCi0jZGVmaW5lIEdMX1NHSVhfeWNyY2JhIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfeWNyY2Jfc3Vic2FtcGxlCi0jZGVmaW5lIEdMX1NHSVhfeWNyY2Jfc3Vic2FtcGxlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfZGVwdGhfcGFzc19pbnN0cnVtZW50Ci0jZGVmaW5lIEdMX1NHSVhfZGVwdGhfcGFzc19pbnN0cnVtZW50IDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxCi0jZGVmaW5lIEdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMXzNERlhfbXVsdGlzYW1wbGUKLSNkZWZpbmUgR0xfM0RGWF9tdWx0aXNhbXBsZSAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF8zREZYX3RidWZmZXIKLSNkZWZpbmUgR0xfM0RGWF90YnVmZmVyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGJ1ZmZlck1hc2szREZYIChHTHVpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEJVRkZFUk1BU0szREZYUFJPQykgKEdMdWludCBtYXNrKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9tdWx0aXNhbXBsZQotI2RlZmluZSBHTF9FWFRfbXVsdGlzYW1wbGUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVNYXNrRVhUIChHTGNsYW1wZiwgR0xib29sZWFuKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVQYXR0ZXJuRVhUIChHTGVudW0pOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFTUFTS0VYVFBST0MpIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRVBBVFRFUk5FWFRQUk9DKSAoR0xlbnVtIHBhdHRlcm4pOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF92ZXJ0ZXhfcHJlY2xpcAotI2RlZmluZSBHTF9TR0lYX3ZlcnRleF9wcmVjbGlwIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVhfY29udm9sdXRpb25fYWNjdXJhY3kKLSNkZWZpbmUgR0xfU0dJWF9jb252b2x1dGlvbl9hY2N1cmFjeSAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3Jlc2FtcGxlCi0jZGVmaW5lIEdMX1NHSVhfcmVzYW1wbGUgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJU19wb2ludF9saW5lX3RleGdlbgotI2RlZmluZSBHTF9TR0lTX3BvaW50X2xpbmVfdGV4Z2VuIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9jb2xvcl9tYXNrCi0jZGVmaW5lIEdMX1NHSVNfdGV4dHVyZV9jb2xvcl9tYXNrIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUNvbG9yTWFza1NHSVMgKEdMYm9vbGVhbiwgR0xib29sZWFuLCBHTGJvb2xlYW4sIEdMYm9vbGVhbik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFQ09MT1JNQVNLU0dJU1BST0MpIChHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfU0dJWF9pZ2xvb19pbnRlcmZhY2UKLSNkZWZpbmUgR0xfU0dJWF9pZ2xvb19pbnRlcmZhY2UgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJZ2xvb0ludGVyZmFjZVNHSVggKEdMZW51bSwgY29uc3QgR0x2b2lkICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSUdMT09JTlRFUkZBQ0VTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0x2b2lkICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZW52X2RvdDMKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZW52X2RvdDMgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVRJX3RleHR1cmVfbWlycm9yX29uY2UKLSNkZWZpbmUgR0xfQVRJX3RleHR1cmVfbWlycm9yX29uY2UgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfZmVuY2UKLSNkZWZpbmUgR0xfTlZfZmVuY2UgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVGZW5jZXNOViAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbkZlbmNlc05WIChHTHNpemVpLCBHTHVpbnQgKik7Ci1HTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0ZlbmNlTlYgKEdMdWludCk7Ci1HTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xUZXN0RmVuY2VOViAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGZW5jZWl2TlYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2hGZW5jZU5WIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldEZlbmNlTlYgKEdMdWludCwgR0xlbnVtKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZFTkNFU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5GRU5DRVNOVlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0ZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xURVNURkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGRU5DRUlWTlZQUk9DKSAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGSU5JU0hGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX2V2YWx1YXRvcnMKLSNkZWZpbmUgR0xfTlZfZXZhbHVhdG9ycyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hcENvbnRyb2xQb2ludHNOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xpbnQsIEdMaW50LCBHTGJvb2xlYW4sIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXBQYXJhbWV0ZXJpdk5WIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFwUGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwQ29udHJvbFBvaW50c05WIChHTGVudW0sIEdMdWludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGJvb2xlYW4sIEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNYXBQYXJhbWV0ZXJpdk5WIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwUGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwQXR0cmliUGFyYW1ldGVyaXZOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwQXR0cmliUGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFdmFsTWFwc05WIChHTGVudW0sIEdMZW51bSk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVBDT05UUk9MUE9JTlRTTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xzaXplaSB1c3RyaWRlLCBHTHNpemVpIHZzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xpbnQgdm9yZGVyLCBHTGJvb2xlYW4gcGFja2VkLCBjb25zdCBHTHZvaWQgKnBvaW50cyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BUFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFQUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1BUENPTlRST0xQT0lOVFNOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTHNpemVpIHVzdHJpZGUsIEdMc2l6ZWkgdnN0cmlkZSwgR0xib29sZWFuIHBhY2tlZCwgR0x2b2lkICpwb2ludHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1BUFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBBVFRSSUJQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUFQQVRUUklCUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRVZBTE1BUFNOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9wYWNrZWRfZGVwdGhfc3RlbmNpbAotI2RlZmluZSBHTF9OVl9wYWNrZWRfZGVwdGhfc3RlbmNpbCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMyCi0jZGVmaW5lIEdMX05WX3JlZ2lzdGVyX2NvbWJpbmVyczIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclN0YWdlUGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tYmluZXJTdGFnZVBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJTVEFHRVBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTUJJTkVSU1RBR0VQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMKLSNkZWZpbmUgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdGV4dHVyZV9yZWN0YW5nbGUKLSNkZWZpbmUgR0xfTlZfdGV4dHVyZV9yZWN0YW5nbGUgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdGV4dHVyZV9zaGFkZXIKLSNkZWZpbmUgR0xfTlZfdGV4dHVyZV9zaGFkZXIgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdGV4dHVyZV9zaGFkZXIyCi0jZGVmaW5lIEdMX05WX3RleHR1cmVfc2hhZGVyMiAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UyCi0jZGVmaW5lIEdMX05WX3ZlcnRleF9hcnJheV9yYW5nZTIgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0KLSNkZWZpbmUgR0xfTlZfdmVydGV4X3Byb2dyYW0gMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbEFyZVByb2dyYW1zUmVzaWRlbnROViAoR0xzaXplaSwgY29uc3QgR0x1aW50ICosIEdMYm9vbGVhbiAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kUHJvZ3JhbU5WIChHTGVudW0sIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbXNOViAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEV4ZWN1dGVQcm9ncmFtTlYgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblByb2dyYW1zTlYgKEdMc2l6ZWksIEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUGFyYW1ldGVyZHZOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbWl2TlYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtU3RyaW5nTlYgKEdMdWludCwgR0xlbnVtLCBHTHVieXRlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRyYWNrTWF0cml4aXZOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZHZOViAoR0x1aW50LCBHTGVudW0sIEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmZ2TlYgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2TlYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydk5WIChHTHVpbnQsIEdMZW51bSwgR0x2b2lkKiAqKTsKLUdMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUHJvZ3JhbU5WIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRQcm9ncmFtTlYgKEdMZW51bSwgR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXI0ZE5WIChHTGVudW0sIEdMdWludCwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXI0ZHZOViAoR0xlbnVtLCBHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXI0Zk5WIChHTGVudW0sIEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcjRmdk5WIChHTGVudW0sIEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyczRkdk5WIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyczRmdk5WIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcXVlc3RSZXNpZGVudFByb2dyYW1zTlYgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFja01hdHJpeE5WIChHTGVudW0sIEdMdWludCwgR0xlbnVtLCBHTGVudW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXJOViAoR0x1aW50LCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWROViAoR0x1aW50LCBHTGRvdWJsZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWR2TlYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWZOViAoR0x1aW50LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZnZOViAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzTlYgKEdMdWludCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMXN2TlYgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZE5WIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmR2TlYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmZOViAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnZOViAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJzTlYgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnN2TlYgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZE5WIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNkdk5WIChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmTlYgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2TlYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzc05WIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzdk5WIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGROViAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGR2TlYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZOViAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZnZOViAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzTlYgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHN2TlYgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWJOViAoR0x1aW50LCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWJ2TlYgKEdMdWludCwgY29uc3QgR0x1Ynl0ZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMWR2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczFmdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczFzdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczJkdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMyZnZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMyc3ZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMzZHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzM2Z2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzM3N2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzNGR2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczRmdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczRzdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczR1YnZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xBUkVQUk9HUkFNU1JFU0lERU5UTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnByb2dyYW1zLCBHTGJvb2xlYW4gKnJlc2lkZW5jZXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EUFJPR1JBTU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVBST0dSQU1TTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnByb2dyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRVhFQ1VURVBST0dSQU1OVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlBST0dSQU1TTlZQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKnByb2dyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVBBUkFNRVRFUkRWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUlWTlZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNU1RSSU5HTlZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWJ5dGUgKnByb2dyYW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRUUkFDS01BVFJJWElWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGFkZHJlc3MsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCUE9JTlRFUlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcG9pbnRlcik7Ci10eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNQUk9HUkFNTlZQUk9DKSAoR0x1aW50IGlkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFBST0dSQU1OVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpwcm9ncmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUjRETlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUjREVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSNEZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVI0RlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSUzREVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVJTNEZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVFVRVNUUkVTSURFTlRQUk9HUkFNU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRSQUNLTUFUUklYTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGFkZHJlc3MsIEdMZW51bSBtYXRyaXgsIEdMZW51bSB0cmFuc2Zvcm0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBmc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMVNOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJETlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNETlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0ZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0Rk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFNOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVQk5WUFJPQykgKEdMdWludCBpbmRleCwgR0x1Ynl0ZSB4LCBHTHVieXRlIHksIEdMdWJ5dGUgeiwgR0x1Ynl0ZSB3KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVCVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMxRFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzFGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMxU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMkRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMyRlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMlNWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHNob3J0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzNEVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTM0ZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzNTVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xzaG9ydCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlM0RFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzRGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlM0U1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNFVCVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1Ynl0ZSAqdik7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfY29vcmRpbmF0ZV9jbGFtcAotI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfY29vcmRpbmF0ZV9jbGFtcCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9TR0lYX3NjYWxlYmlhc19oaW50Ci0jZGVmaW5lIEdMX1NHSVhfc2NhbGViaWFzX2hpbnQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfT01MX2ludGVybGFjZQotI2RlZmluZSBHTF9PTUxfaW50ZXJsYWNlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX09NTF9zdWJzYW1wbGUKLSNkZWZpbmUgR0xfT01MX3N1YnNhbXBsZSAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9PTUxfcmVzYW1wbGUKLSNkZWZpbmUgR0xfT01MX3Jlc2FtcGxlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX2NvcHlfZGVwdGhfdG9fY29sb3IKLSNkZWZpbmUgR0xfTlZfY29weV9kZXB0aF90b19jb2xvciAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BVElfZW52bWFwX2J1bXBtYXAKLSNkZWZpbmUgR0xfQVRJX2Vudm1hcF9idW1wbWFwIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4QnVtcFBhcmFtZXRlcml2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEJ1bXBQYXJhbWV0ZXJmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleEJ1bXBQYXJhbWV0ZXJpdkFUSSAoR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXhCdW1wUGFyYW1ldGVyZnZBVEkgKEdMZW51bSwgR0xmbG9hdCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEJVTVBQQVJBTUVURVJJVkFUSVBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEJVTVBQQVJBTUVURVJGVkFUSVBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYQlVNUFBBUkFNRVRFUklWQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYQlVNUFBBUkFNRVRFUkZWQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW0pOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgotI2RlZmluZSBHTF9BVElfZnJhZ21lbnRfc2hhZGVyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xHZW5GcmFnbWVudFNoYWRlcnNBVEkgKEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEZyYWdtZW50U2hhZGVyQVRJIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUZyYWdtZW50U2hhZGVyQVRJIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luRnJhZ21lbnRTaGFkZXJBVEkgKHZvaWQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZEZyYWdtZW50U2hhZGVyQVRJICh2b2lkKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQYXNzVGV4Q29vcmRBVEkgKEdMdWludCwgR0x1aW50LCBHTGVudW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZU1hcEFUSSAoR0x1aW50LCBHTHVpbnQsIEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JGcmFnbWVudE9wMUFUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvckZyYWdtZW50T3AyQVRJIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yRnJhZ21lbnRPcDNBVEkgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGcmFnbWVudE9wMUFUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGcmFnbWVudE9wMkFUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGcmFnbWVudE9wM0FUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2V0RnJhZ21lbnRTaGFkZXJDb25zdGFudEFUSSAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRU5GUkFHTUVOVFNIQURFUlNBVElQUk9DKSAoR0x1aW50IHJhbmdlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREZSQUdNRU5UU0hBREVSQVRJUFJPQykgKEdMdWludCBpZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZSQUdNRU5UU0hBREVSQVRJUFJPQykgKEdMdWludCBpZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lORlJBR01FTlRTSEFERVJBVElQUk9DKSAodm9pZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVOREZSQUdNRU5UU0hBREVSQVRJUFJPQykgKHZvaWQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQQVNTVEVYQ09PUkRBVElQUk9DKSAoR0x1aW50IGRzdCwgR0x1aW50IGNvb3JkLCBHTGVudW0gc3dpenpsZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRU1BUEFUSVBST0MpIChHTHVpbnQgZHN0LCBHTHVpbnQgaW50ZXJwLCBHTGVudW0gc3dpenpsZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRlJBR01FTlRPUDFBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRlJBR01FTlRPUDJBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRlJBR01FTlRPUDNBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCwgR0x1aW50IGFyZzMsIEdMdWludCBhcmczUmVwLCBHTHVpbnQgYXJnM01vZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFMUEhBRlJBR01FTlRPUDFBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TW9kLCBHTHVpbnQgYXJnMSwgR0x1aW50IGFyZzFSZXAsIEdMdWludCBhcmcxTW9kKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUxQSEFGUkFHTUVOVE9QMkFUSVBST0MpIChHTGVudW0gb3AsIEdMdWludCBkc3QsIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBTFBIQUZSQUdNRU5UT1AzQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCwgR0x1aW50IGFyZzMsIEdMdWludCBhcmczUmVwLCBHTHVpbnQgYXJnM01vZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVEZSQUdNRU5UU0hBREVSQ09OU1RBTlRBVElQUk9DKSAoR0x1aW50IGRzdCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVRJX3BuX3RyaWFuZ2xlcwotI2RlZmluZSBHTF9BVElfcG5fdHJpYW5nbGVzIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUE5UcmlhbmdsZXNpQVRJIChHTGVudW0sIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQTlRyaWFuZ2xlc2ZBVEkgKEdMZW51bSwgR0xmbG9hdCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQTlRSSUFOR0xFU0lBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBOVFJJQU5HTEVTRkFUSVBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVRJX3ZlcnRleF9hcnJheV9vYmplY3QKLSNkZWZpbmUgR0xfQVRJX3ZlcnRleF9hcnJheV9vYmplY3QgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIEdMdWludCBBUElFTlRSWSBnbE5ld09iamVjdEJ1ZmZlckFUSSAoR0xzaXplaSwgY29uc3QgR0x2b2lkICosIEdMZW51bSk7Ci1HTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc09iamVjdEJ1ZmZlckFUSSAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVcGRhdGVPYmplY3RCdWZmZXJBVEkgKEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKiwgR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPYmplY3RCdWZmZXJmdkFUSSAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2JqZWN0QnVmZmVyaXZBVEkgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmVlT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFycmF5T2JqZWN0QVRJIChHTGVudW0sIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMdWludCwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBcnJheU9iamVjdGZ2QVRJIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBcnJheU9iamVjdGl2QVRJIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudEFycmF5T2JqZWN0QVRJIChHTHVpbnQsIEdMZW51bSwgR0xzaXplaSwgR0x1aW50LCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZhcmlhbnRBcnJheU9iamVjdGZ2QVRJIChHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50QXJyYXlPYmplY3RpdkFUSSAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xORVdPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0xzaXplaSBzaXplLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMZW51bSB1c2FnZSk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0x1aW50IGJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVQREFURU9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyLCBHTHVpbnQgb2Zmc2V0LCBHTHNpemVpIHNpemUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xlbnVtIHByZXNlcnZlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUQlVGRkVSRlZBVElQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RCVUZGRVJJVkFUSVBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkVFT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMdWludCBidWZmZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBUlJBWU9CSkVDVEFUSVBST0MpIChHTGVudW0gYXJyYXksIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IG9mZnNldCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFSUkFZT0JKRUNURlZBVElQUk9DKSAoR0xlbnVtIGFycmF5LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFSUkFZT0JKRUNUSVZBVElQUk9DKSAoR0xlbnVtIGFycmF5LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UQVJSQVlPQkpFQ1RBVElQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWQVJJQU5UQVJSQVlPQkpFQ1RGVkFUSVBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVEFSUkFZT0JKRUNUSVZBVElQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3ZlcnRleF9zaGFkZXIKLSNkZWZpbmUgR0xfRVhUX3ZlcnRleF9zaGFkZXIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblZlcnRleFNoYWRlckVYVCAodm9pZCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kVmVydGV4U2hhZGVyRVhUICh2b2lkKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVmVydGV4U2hhZGVyRVhUIChHTHVpbnQpOwotR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuVmVydGV4U2hhZGVyc0VYVCAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVWZXJ0ZXhTaGFkZXJFWFQgKEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyT3AxRVhUIChHTGVudW0sIEdMdWludCwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFkZXJPcDJFWFQgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyT3AzRVhUIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3dpenpsZUVYVCAoR0x1aW50LCBHTHVpbnQsIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsV3JpdGVNYXNrRVhUIChHTHVpbnQsIEdMdWludCwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbnNlcnRDb21wb25lbnRFWFQgKEdMdWludCwgR0x1aW50LCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEV4dHJhY3RDb21wb25lbnRFWFQgKEdMdWludCwgR0x1aW50LCBHTHVpbnQpOwotR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuU3ltYm9sc0VYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZXRJbnZhcmlhbnRFWFQgKEdMdWludCwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2V0TG9jYWxDb25zdGFudEVYVCAoR0x1aW50LCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50YnZFWFQgKEdMdWludCwgY29uc3QgR0xieXRlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRzdkVYVCAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRpdkVYVCAoR0x1aW50LCBjb25zdCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50ZnZFWFQgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50ZHZFWFQgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudHVidkVYVCAoR0x1aW50LCBjb25zdCBHTHVieXRlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnR1c3ZFWFQgKEdMdWludCwgY29uc3QgR0x1c2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudHVpdkVYVCAoR0x1aW50LCBjb25zdCBHTHVpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudFBvaW50ZXJFWFQgKEdMdWludCwgR0xlbnVtLCBHTHVpbnQsIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVWYXJpYW50Q2xpZW50U3RhdGVFWFQgKEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZVZhcmlhbnRDbGllbnRTdGF0ZUVYVCAoR0x1aW50KTsKLUdMQVBJIEdMdWludCBBUElFTlRSWSBnbEJpbmRMaWdodFBhcmFtZXRlckVYVCAoR0xlbnVtLCBHTGVudW0pOwotR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQmluZE1hdGVyaWFsUGFyYW1ldGVyRVhUIChHTGVudW0sIEdMZW51bSk7Ci1HTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xCaW5kVGV4R2VuUGFyYW1ldGVyRVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtKTsKLUdMQVBJIEdMdWludCBBUElFTlRSWSBnbEJpbmRUZXh0dXJlVW5pdFBhcmFtZXRlckVYVCAoR0xlbnVtLCBHTGVudW0pOwotR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQmluZFBhcmFtZXRlckVYVCAoR0xlbnVtKTsKLUdMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVmFyaWFudEVuYWJsZWRFWFQgKEdMdWludCwgR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50Qm9vbGVhbnZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGJvb2xlYW4gKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudEludGVnZXJ2RVhUIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudEZsb2F0dkVYVCAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudFBvaW50ZXJ2RVhUIChHTHVpbnQsIEdMZW51bSwgR0x2b2lkKiAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnZhcmlhbnRCb29sZWFudkVYVCAoR0x1aW50LCBHTGVudW0sIEdMYm9vbGVhbiAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnZhcmlhbnRJbnRlZ2VydkVYVCAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludmFyaWFudEZsb2F0dkVYVCAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TG9jYWxDb25zdGFudEJvb2xlYW52RVhUIChHTHVpbnQsIEdMZW51bSwgR0xib29sZWFuICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExvY2FsQ29uc3RhbnRJbnRlZ2VydkVYVCAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExvY2FsQ29uc3RhbnRGbG9hdHZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkVHSU5WRVJURVhTSEFERVJFWFRQUk9DKSAodm9pZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVORFZFUlRFWFNIQURFUkVYVFBST0MpICh2b2lkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFZFUlRFWFNIQURFUkVYVFBST0MpIChHTHVpbnQgaWQpOwotdHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEdFTlZFUlRFWFNIQURFUlNFWFRQUk9DKSAoR0x1aW50IHJhbmdlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVkVSVEVYU0hBREVSRVhUUFJPQykgKEdMdWludCBpZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQURFUk9QMUVYVFBST0MpIChHTGVudW0gb3AsIEdMdWludCByZXMsIEdMdWludCBhcmcxKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBREVST1AyRVhUUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IHJlcywgR0x1aW50IGFyZzEsIEdMdWludCBhcmcyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBREVST1AzRVhUUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IHJlcywgR0x1aW50IGFyZzEsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNXSVpaTEVFWFRQUk9DKSAoR0x1aW50IHJlcywgR0x1aW50IGluLCBHTGVudW0gb3V0WCwgR0xlbnVtIG91dFksIEdMZW51bSBvdXRaLCBHTGVudW0gb3V0Vyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdSSVRFTUFTS0VYVFBST0MpIChHTHVpbnQgcmVzLCBHTHVpbnQgaW4sIEdMZW51bSBvdXRYLCBHTGVudW0gb3V0WSwgR0xlbnVtIG91dFosIEdMZW51bSBvdXRXKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5TRVJUQ09NUE9ORU5URVhUUFJPQykgKEdMdWludCByZXMsIEdMdWludCBzcmMsIEdMdWludCBudW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFWFRSQUNUQ09NUE9ORU5URVhUUFJPQykgKEdMdWludCByZXMsIEdMdWludCBzcmMsIEdMdWludCBudW0pOwotdHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEdFTlNZTUJPTFNFWFRQUk9DKSAoR0xlbnVtIGRhdGF0eXBlLCBHTGVudW0gc3RvcmFnZXR5cGUsIEdMZW51bSByYW5nZSwgR0x1aW50IGNvbXBvbmVudHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRJTlZBUklBTlRFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICphZGRyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VUTE9DQUxDT05TVEFOVEVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmFkZHIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UQlZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTGJ5dGUgKmFkZHIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UU1ZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTHNob3J0ICphZGRyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVElWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xpbnQgKmFkZHIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5URlZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTGZsb2F0ICphZGRyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVERWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xkb3VibGUgKmFkZHIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UVUJWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0x1Ynl0ZSAqYWRkcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRVU1ZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTHVzaG9ydCAqYWRkcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRVSVZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTHVpbnQgKmFkZHIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UUE9JTlRFUkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB0eXBlLCBHTHVpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQgKmFkZHIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkFCTEVWQVJJQU5UQ0xJRU5UU1RBVEVFWFRQUk9DKSAoR0x1aW50IGlkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRElTQUJMRVZBUklBTlRDTElFTlRTVEFURUVYVFBST0MpIChHTHVpbnQgaWQpOwotdHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEJJTkRMSUdIVFBBUkFNRVRFUkVYVFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSB2YWx1ZSk7Ci10eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQklORE1BVEVSSUFMUEFSQU1FVEVSRVhUUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gdmFsdWUpOwotdHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEJJTkRURVhHRU5QQVJBTUVURVJFWFRQUk9DKSAoR0xlbnVtIHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHZhbHVlKTsKLXR5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xCSU5EVEVYVFVSRVVOSVRQQVJBTUVURVJFWFRQUk9DKSAoR0xlbnVtIHVuaXQsIEdMZW51bSB2YWx1ZSk7Ci10eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQklORFBBUkFNRVRFUkVYVFBST0MpIChHTGVudW0gdmFsdWUpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTVkFSSUFOVEVOQUJMRURFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gY2FwKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVEJPT0xFQU5WRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4gKmRhdGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWQVJJQU5USU5URUdFUlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMaW50ICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVEZMT0FUVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xmbG9hdCAqZGF0YSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZBUklBTlRQT0lOVEVSVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0x2b2lkKiAqZGF0YSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVElOVkFSSUFOVEJPT0xFQU5WRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4gKmRhdGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlZBUklBTlRJTlRFR0VSVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xpbnQgKmRhdGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlZBUklBTlRGTE9BVFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMZmxvYXQgKmRhdGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMT0NBTENPTlNUQU5UQk9PTEVBTlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMYm9vbGVhbiAqZGF0YSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVExPQ0FMQ09OU1RBTlRJTlRFR0VSVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xpbnQgKmRhdGEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMT0NBTENPTlNUQU5URkxPQVRWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGZsb2F0ICpkYXRhKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV92ZXJ0ZXhfc3RyZWFtcwotI2RlZmluZSBHTF9BVElfdmVydGV4X3N0cmVhbXMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xc0FUSSAoR0xlbnVtLCBHTHNob3J0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xc3ZBVEkgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xaUFUSSAoR0xlbnVtLCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMWl2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFmQVRJIChHTGVudW0sIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFkQVRJIChHTGVudW0sIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xZHZBVEkgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMnNBVEkgKEdMZW51bSwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMnN2QVRJIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmlBVEkgKEdMZW51bSwgR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yaXZBVEkgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmZBVEkgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmZ2QVRJIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmRBVEkgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yZHZBVEkgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM3NBVEkgKEdMZW51bSwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM3N2QVRJIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM2lBVEkgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM2l2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNmQVRJIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNkQVRJIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNkdkFUSSAoR0xlbnVtLCBjb25zdCBHTGRvdWJsZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00c0FUSSAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00c3ZBVEkgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00aUFUSSAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNGl2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRmQVRJIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRkQVRJIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00ZHZBVEkgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2JBVEkgKEdMZW51bSwgR0xieXRlLCBHTGJ5dGUsIEdMYnl0ZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2J2QVRJIChHTGVudW0sIGNvbnN0IEdMYnl0ZSAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zc0FUSSAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zc3ZBVEkgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zaUFUSSAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zaXZBVEkgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2ZBVEkgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2Z2QVRJIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2RBVEkgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2R2QVRJIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVZlcnRleFN0cmVhbUFUSSAoR0xlbnVtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhCbGVuZEVudmlBVEkgKEdMZW51bSwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEJsZW5kRW52ZkFUSSAoR0xlbnVtLCBHTGZsb2F0KTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFTVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xSUFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGludCB4KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMUlWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xRkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xRlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMURBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFEVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMlNBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0yU1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMklBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCwgR0xpbnQgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMkZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0yRlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMkRBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJEVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM1NBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNTVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zSUFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0lWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zRkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0ZWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNEQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zRFZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTRTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTRTVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00SUFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNElWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00RkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00RlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNERBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTREVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0JBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xieXRlIG54LCBHTGJ5dGUgbnksIEdMYnl0ZSBueik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNCVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGJ5dGUgKmNvb3Jkcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgbngsIEdMc2hvcnQgbnksIEdMc2hvcnQgbnopOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zU1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0lBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgbngsIEdMaW50IG55LCBHTGludCBueik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNGVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGZsb2F0ICpjb29yZHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zREFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGRvdWJsZSBueCwgR0xkb3VibGUgbnksIEdMZG91YmxlIG56KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0RWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZG91YmxlICpjb29yZHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTElFTlRBQ1RJVkVWRVJURVhTVFJFQU1BVElQUk9DKSAoR0xlbnVtIHN0cmVhbSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEJMRU5ERU5WSUFUSVBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQkxFTkRFTlZGQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BVElfZWxlbWVudF9hcnJheQotI2RlZmluZSBHTF9BVElfZWxlbWVudF9hcnJheSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVsZW1lbnRQb2ludGVyQVRJIChHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudEFycmF5QVRJIChHTGVudW0sIEdMc2l6ZWkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRBcnJheUFUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0xzaXplaSk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTEVNRU5UUE9JTlRFUkFUSVBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRBUlJBWUFUSVBST0MpIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRBUlJBWUFUSVBST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBHTHNpemVpIGNvdW50KTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NVTl9tZXNoX2FycmF5Ci0jZGVmaW5lIEdMX1NVTl9tZXNoX2FycmF5IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd01lc2hBcnJheXNTVU4gKEdMZW51bSwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWkpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV01FU0hBUlJBWVNTVU5QUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBHTHNpemVpIHdpZHRoKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1NVTl9zbGljZV9hY2N1bQotI2RlZmluZSBHTF9TVU5fc2xpY2VfYWNjdW0gMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfbXVsdGlzYW1wbGVfZmlsdGVyX2hpbnQKLSNkZWZpbmUgR0xfTlZfbXVsdGlzYW1wbGVfZmlsdGVyX2hpbnQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfZGVwdGhfY2xhbXAKLSNkZWZpbmUgR0xfTlZfZGVwdGhfY2xhbXAgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfb2NjbHVzaW9uX3F1ZXJ5Ci0jZGVmaW5lIEdMX05WX29jY2x1c2lvbl9xdWVyeSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbk9jY2x1c2lvblF1ZXJpZXNOViAoR0xzaXplaSwgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZU9jY2x1c2lvblF1ZXJpZXNOViAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNPY2NsdXNpb25RdWVyeU5WIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luT2NjbHVzaW9uUXVlcnlOViAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmRPY2NsdXNpb25RdWVyeU5WICh2b2lkKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPY2NsdXNpb25RdWVyeWl2TlYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPY2NsdXNpb25RdWVyeXVpdk5WIChHTHVpbnQsIEdMZW51bSwgR0x1aW50ICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOT0NDTFVTSU9OUVVFUklFU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVPQ0NMVVNJT05RVUVSSUVTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNPQ0NMVVNJT05RVUVSWU5WUFJPQykgKEdMdWludCBpZCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOT0NDTFVTSU9OUVVFUllOVlBST0MpIChHTHVpbnQgaWQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRPQ0NMVVNJT05RVUVSWU5WUFJPQykgKHZvaWQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQ0NMVVNJT05RVUVSWUlWTlZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQ0NMVVNJT05RVUVSWVVJVk5WUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9wb2ludF9zcHJpdGUKLSNkZWZpbmUgR0xfTlZfcG9pbnRfc3ByaXRlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJpTlYgKEdMZW51bSwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyaXZOViAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSSU5WUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyMwotI2RlZmluZSBHTF9OVl90ZXh0dXJlX3NoYWRlcjMgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEKLSNkZWZpbmUgR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX3NoYWRvd19mdW5jcwotI2RlZmluZSBHTF9FWFRfc2hhZG93X2Z1bmNzIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9zdGVuY2lsX3R3b19zaWRlCi0jZGVmaW5lIEdMX0VYVF9zdGVuY2lsX3R3b19zaWRlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlU3RlbmNpbEZhY2VFWFQgKEdMZW51bSk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVTVEVOQ0lMRkFDRUVYVFBST0MpIChHTGVudW0gZmFjZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BVElfdGV4dF9mcmFnbWVudF9zaGFkZXIKLSNkZWZpbmUgR0xfQVRJX3RleHRfZnJhZ21lbnRfc2hhZGVyIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlCi0jZGVmaW5lIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FQUExFX2VsZW1lbnRfYXJyYXkKLSNkZWZpbmUgR0xfQVBQTEVfZWxlbWVudF9hcnJheSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVsZW1lbnRQb2ludGVyQVBQTEUgKEdMZW51bSwgY29uc3QgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50QXJyYXlBUFBMRSAoR0xlbnVtLCBHTGludCwgR0xzaXplaSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudEFycmF5QVBQTEUgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMaW50LCBHTHNpemVpKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdFbGVtZW50QXJyYXlBUFBMRSAoR0xlbnVtLCBjb25zdCBHTGludCAqLCBjb25zdCBHTHNpemVpICosIEdMc2l6ZWkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd1JhbmdlRWxlbWVudEFycmF5QVBQTEUgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIGNvbnN0IEdMaW50ICosIGNvbnN0IEdMc2l6ZWkgKiwgR0xzaXplaSk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTEVNRU5UUE9JTlRFUkFQUExFUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVEFSUkFZQVBQTEVQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1JBTkdFRUxFTUVOVEFSUkFZQVBQTEVQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdFTEVNRU5UQVJSQVlBUFBMRVBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdSQU5HRUVMRU1FTlRBUlJBWUFQUExFUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FQUExFX2ZlbmNlCi0jZGVmaW5lIEdMX0FQUExFX2ZlbmNlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuRmVuY2VzQVBQTEUgKEdMc2l6ZWksIEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVGZW5jZXNBUFBMRSAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldEZlbmNlQVBQTEUgKEdMdWludCk7Ci1HTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0ZlbmNlQVBQTEUgKEdMdWludCk7Ci1HTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xUZXN0RmVuY2VBUFBMRSAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2hGZW5jZUFQUExFIChHTHVpbnQpOwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsVGVzdE9iamVjdEFQUExFIChHTGVudW0sIEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluaXNoT2JqZWN0QVBQTEUgKEdMZW51bSwgR0xpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORkVOQ0VTQVBQTEVQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZFTkNFU0FQUExFUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRGRU5DRUFQUExFUFJPQykgKEdMdWludCBmZW5jZSk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNGRU5DRUFQUExFUFJPQykgKEdMdWludCBmZW5jZSk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMVEVTVEZFTkNFQVBQTEVQUk9DKSAoR0x1aW50IGZlbmNlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRklOSVNIRkVOQ0VBUFBMRVBST0MpIChHTHVpbnQgZmVuY2UpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFRFU1RPQkpFQ1RBUFBMRVBST0MpIChHTGVudW0gb2JqZWN0LCBHTHVpbnQgbmFtZSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTklTSE9CSkVDVEFQUExFUFJPQykgKEdMZW51bSBvYmplY3QsIEdMaW50IG5hbWUpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X29iamVjdAotI2RlZmluZSBHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfb2JqZWN0IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFZlcnRleEFycmF5QVBQTEUgKEdMdWludCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVmVydGV4QXJyYXlzQVBQTEUgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5WZXJ0ZXhBcnJheXNBUFBMRSAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNWZXJ0ZXhBcnJheUFQUExFIChHTHVpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFZFUlRFWEFSUkFZQVBQTEVQUk9DKSAoR0x1aW50IGFycmF5KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVkVSVEVYQVJSQVlTQVBQTEVQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlZFUlRFWEFSUkFZU0FQUExFUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTVkVSVEVYQVJSQVlBUFBMRVBST0MpIChHTHVpbnQgYXJyYXkpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X3JhbmdlCi0jZGVmaW5lIEdMX0FQUExFX3ZlcnRleF9hcnJheV9yYW5nZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEFycmF5UmFuZ2VBUFBMRSAoR0xzaXplaSwgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoVmVydGV4QXJyYXlSYW5nZUFQUExFIChHTHNpemVpLCBHTHZvaWQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXJyYXlQYXJhbWV0ZXJpQVBQTEUgKEdMZW51bSwgR0xpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVJSQVlSQU5HRUFQUExFUFJPQykgKEdMc2l6ZWkgbGVuZ3RoLCBHTHZvaWQgKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSFZFUlRFWEFSUkFZUkFOR0VBUFBMRVBST0MpIChHTHNpemVpIGxlbmd0aCwgR0x2b2lkICpwb2ludGVyKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVJSQVlQQVJBTUVURVJJQVBQTEVQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUFBMRV95Y2Jjcl80MjIKLSNkZWZpbmUgR0xfQVBQTEVfeWNiY3JfNDIyIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX1MzX3MzdGMKLSNkZWZpbmUgR0xfUzNfczN0YyAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BVElfZHJhd19idWZmZXJzCi0jZGVmaW5lIEdMX0FUSV9kcmF3X2J1ZmZlcnMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QnVmZmVyc0FUSSAoR0xzaXplaSwgY29uc3QgR0xlbnVtICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0JVRkZFUlNBVElQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpOwotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVRJX3BpeGVsX2Zvcm1hdF9mbG9hdAotI2RlZmluZSBHTF9BVElfcGl4ZWxfZm9ybWF0X2Zsb2F0IDEKLS8qIFRoaXMgaXMgcmVhbGx5IGEgV0dMIGV4dGVuc2lvbiwgYnV0IGRlZmluZXMgc29tZSBhc3NvY2lhdGVkIEdMIGVudW1zLgotICogQVRJIGRvZXMgbm90IGV4cG9ydCAiR0xfQVRJX3BpeGVsX2Zvcm1hdF9mbG9hdCIgaW4gdGhlIEdMX0VYVEVOU0lPTlMgc3RyaW5nLgotICovCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BVElfdGV4dHVyZV9lbnZfY29tYmluZTMKLSNkZWZpbmUgR0xfQVRJX3RleHR1cmVfZW52X2NvbWJpbmUzIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV90ZXh0dXJlX2Zsb2F0Ci0jZGVmaW5lIEdMX0FUSV90ZXh0dXJlX2Zsb2F0IDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX2Zsb2F0X2J1ZmZlcgotI2RlZmluZSBHTF9OVl9mbG9hdF9idWZmZXIgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbQotI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtIDEKLS8qIFNvbWUgTlZfZnJhZ21lbnRfcHJvZ3JhbSBlbnRyeSBwb2ludHMgYXJlIHNoYXJlZCB3aXRoIEFSQl92ZXJ0ZXhfcHJvZ3JhbS4gKi8KLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICosIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkTlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1Ynl0ZSAqLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZ2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1Ynl0ZSAqLCBjb25zdCBHTGZsb2F0ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdWJ5dGUgKiwgY29uc3QgR0xkb3VibGUgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZnZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICosIEdMZmxvYXQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICosIEdMZG91YmxlICopOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTU5BTUVEUEFSQU1FVEVSNEZOVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTkFNRURQQVJBTUVURVI0RE5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTkFNRURQQVJBTUVURVI0RlZOVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBjb25zdCBHTGZsb2F0ICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTU5BTUVEUEFSQU1FVEVSNERWTlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgY29uc3QgR0xkb3VibGUgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNTkFNRURQQVJBTUVURVJGVk5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1OQU1FRFBBUkFNRVRFUkRWTlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9oYWxmX2Zsb2F0Ci0jZGVmaW5lIEdMX05WX2hhbGZfZmxvYXQgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXgyaE5WIChHTGhhbGZOViwgR0xoYWxmTlYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleDJodk5WIChjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXgzaE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXgzaHZOViAoY29uc3QgR0xoYWxmTlYgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4NGhOViAoR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleDRodk5WIChjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzaE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzaHZOViAoY29uc3QgR0xoYWxmTlYgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3IzaE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjNodk5WIChjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRoTlYgKEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRodk5WIChjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDFoTlYgKEdMaGFsZk5WKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDFodk5WIChjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJoTlYgKEdMaGFsZk5WLCBHTGhhbGZOVik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyaHZOViAoY29uc3QgR0xoYWxmTlYgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQzaE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDNodk5WIChjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRoTlYgKEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRodk5WIChjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWhOViAoR0xlbnVtLCBHTGhhbGZOVik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFodk5WIChHTGVudW0sIGNvbnN0IEdMaGFsZk5WICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaE5WIChHTGVudW0sIEdMaGFsZk5WLCBHTGhhbGZOVik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJodk5WIChHTGVudW0sIGNvbnN0IEdMaGFsZk5WICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaE5WIChHTGVudW0sIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaHZOViAoR0xlbnVtLCBjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGhOViAoR0xlbnVtLCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOVik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRodk5WIChHTGVudW0sIGNvbnN0IEdMaGFsZk5WICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkaE5WIChHTGhhbGZOVik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRodk5WIChjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNoTlYgKEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2h2TlYgKGNvbnN0IEdMaGFsZk5WICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFdlaWdodGhOViAoR0xoYWxmTlYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFdlaWdodGh2TlYgKGNvbnN0IEdMaGFsZk5WICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFoTlYgKEdMdWludCwgR0xoYWxmTlYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFodk5WIChHTHVpbnQsIGNvbnN0IEdMaGFsZk5WICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJoTlYgKEdMdWludCwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyaHZOViAoR0x1aW50LCBjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzaE5WIChHTHVpbnQsIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNodk5WIChHTHVpbnQsIGNvbnN0IEdMaGFsZk5WICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRoTlYgKEdMdWludCwgR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRodk5WIChHTHVpbnQsIGNvbnN0IEdMaGFsZk5WICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMxaHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGhhbGZOViAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMmh2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xoYWxmTlYgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczNodk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaGFsZk5WICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnM0aHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGhhbGZOViAqKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDJITlZQUk9DKSAoR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDJIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYM0hOVlBST0MpIChHTGhhbGZOViB4LCBHTGhhbGZOViB5LCBHTGhhbGZOViB6KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYM0hWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVg0SE5WUFJPQykgKEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHosIEdMaGFsZk5WIHcpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVg0SFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNITlZQUk9DKSAoR0xoYWxmTlYgbngsIEdMaGFsZk5WIG55LCBHTGhhbGZOViBueik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1IzSE5WUFJPQykgKEdMaGFsZk5WIHJlZCwgR0xoYWxmTlYgZ3JlZW4sIEdMaGFsZk5WIGJsdWUpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjNIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0SE5WUFJPQykgKEdMaGFsZk5WIHJlZCwgR0xoYWxmTlYgZ3JlZW4sIEdMaGFsZk5WIGJsdWUsIEdMaGFsZk5WIGFscGhhKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0SFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMUhOVlBST0MpIChHTGhhbGZOViBzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQxSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkhOVlBST0MpIChHTGhhbGZOViBzLCBHTGhhbGZOViB0KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQySFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEM0hOVlBST0MpIChHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEhOVlBST0MpIChHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByLCBHTGhhbGZOViBxKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0SFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUhWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkhOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzLCBHTGhhbGZOViB0KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJIVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNITlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGhhbGZOViAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMsIEdMaGFsZk5WIHQsIEdMaGFsZk5WIHIsIEdMaGFsZk5WIHEpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEhWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREhOVlBST0MpIChHTGhhbGZOViBmb2cpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKmZvZyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0hOVlBST0MpIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFdFSUdIVEhOVlBST0MpIChHTGhhbGZOViB3ZWlnaHQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp3ZWlnaHQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxSE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIySE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzSE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0SE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeiwgR0xoYWxmTlYgdyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMUhWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzJIVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMzSFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbiwgY29uc3QgR0xoYWxmTlYgKnYpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNEhWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3BpeGVsX2RhdGFfcmFuZ2UKLSNkZWZpbmUgR0xfTlZfcGl4ZWxfZGF0YV9yYW5nZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsRGF0YVJhbmdlTlYgKEdMZW51bSwgR0xzaXplaSwgR0x2b2lkICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoUGl4ZWxEYXRhUmFuZ2VOViAoR0xlbnVtKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMREFUQVJBTkdFTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZW5ndGgsIEdMdm9pZCAqcG9pbnRlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNIUElYRUxEQVRBUkFOR0VOVlBST0MpIChHTGVudW0gdGFyZ2V0KTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3ByaW1pdGl2ZV9yZXN0YXJ0Ci0jZGVmaW5lIEdMX05WX3ByaW1pdGl2ZV9yZXN0YXJ0IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJpbWl0aXZlUmVzdGFydE5WICh2b2lkKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcmltaXRpdmVSZXN0YXJ0SW5kZXhOViAoR0x1aW50KTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBSSU1JVElWRVJFU1RBUlROVlBST0MpICh2b2lkKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJJTUlUSVZFUkVTVEFSVElOREVYTlZQUk9DKSAoR0x1aW50IGluZGV4KTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX05WX3RleHR1cmVfZXhwYW5kX25vcm1hbAotI2RlZmluZSBHTF9OVl90ZXh0dXJlX2V4cGFuZF9ub3JtYWwgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0yCi0jZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMiAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BVElfbWFwX29iamVjdF9idWZmZXIKLSNkZWZpbmUgR0xfQVRJX21hcF9vYmplY3RfYnVmZmVyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSBHTHZvaWQqIEFQSUVOVFJZIGdsTWFwT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVubWFwT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMdWludCBidWZmZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTk1BUE9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsCi0jZGVmaW5lIEdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGVBVEkgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZUFUSSAoR0xlbnVtLCBHTGVudW0sIEdMaW50LCBHTHVpbnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RFTkNJTE9QU0VQQVJBVEVBVElQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBzZmFpbCwgR0xlbnVtIGRwZmFpbCwgR0xlbnVtIGRwcGFzcyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxGVU5DU0VQQVJBVEVBVElQUk9DKSAoR0xlbnVtIGZyb250ZnVuYywgR0xlbnVtIGJhY2tmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FUSV92ZXJ0ZXhfYXR0cmliX2FycmF5X29iamVjdAotI2RlZmluZSBHTF9BVElfdmVydGV4X2F0dHJpYl9hcnJheV9vYmplY3QgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdEFUSSAoR0x1aW50LCBHTGludCwgR0xlbnVtLCBHTGJvb2xlYW4sIEdMc2l6ZWksIEdMdWludCwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGZ2QVRJIChHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGl2QVRJIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJBUlJBWU9CSkVDVEFUSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJBUlJBWU9CSkVDVEZWQVRJUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJBUlJBWU9CSkVDVElWQVRJUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX09FU19yZWFkX2Zvcm1hdAotI2RlZmluZSBHTF9PRVNfcmVhZF9mb3JtYXQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfRVhUX2RlcHRoX2JvdW5kc190ZXN0Ci0jZGVmaW5lIEdMX0VYVF9kZXB0aF9ib3VuZHNfdGVzdCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoQm91bmRzRVhUIChHTGNsYW1wZCwgR0xjbGFtcGQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVQVEhCT1VORFNFWFRQUk9DKSAoR0xjbGFtcGQgem1pbiwgR0xjbGFtcGQgem1heCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9taXJyb3JfY2xhbXAKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfbWlycm9yX2NsYW1wIDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQotI2RlZmluZSBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVFWFQgKEdMZW51bSwgR0xlbnVtKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURUVYVFBST0MpIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9NRVNBX3BhY2tfaW52ZXJ0Ci0jZGVmaW5lIEdMX01FU0FfcGFja19pbnZlcnQgMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTUVTQV95Y2Jjcl90ZXh0dXJlCi0jZGVmaW5lIEdMX01FU0FfeWNiY3JfdGV4dHVyZSAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfcGl4ZWxfYnVmZmVyX29iamVjdAotI2RlZmluZSBHTF9FWFRfcGl4ZWxfYnVmZmVyX29iamVjdCAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtX29wdGlvbgotI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtX29wdGlvbiAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtMgotI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtMiAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTJfb3B0aW9uCi0jZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMl9vcHRpb24gMQotI2VuZGlmCi0KLSNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0zCi0jZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMyAxCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0Ci0jZGVmaW5lIEdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyRVhUIChHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRSZW5kZXJidWZmZXJFWFQgKEdMZW51bSwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVSZW5kZXJidWZmZXJzRVhUIChHTHNpemVpLCBjb25zdCBHTHVpbnQgKik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUmVuZGVyYnVmZmVyc0VYVCAoR0xzaXplaSwgR0x1aW50ICopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOwotR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlckVYVCAoR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXJFWFQgKEdMZW51bSwgR0x1aW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5GcmFtZWJ1ZmZlcnNFWFQgKEdMc2l6ZWksIEdMdWludCAqKTsKLUdMQVBJIEdMZW51bSBBUElFTlRSWSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQgKEdMZW51bSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlMURFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdWludCwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHVpbnQsIEdMaW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUzREVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x1aW50LCBHTGludCwgR0xpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHVpbnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcEVYVCAoR0xlbnVtKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVJFTkRFUkJVRkZFUlNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5SRU5ERVJCVUZGRVJTRVhUUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUkVOREVSQlVGRkVSUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0ZSQU1FQlVGRkVSRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRGUkFNRUJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVGUkFNRUJVRkZFUlNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkZSQU1FQlVGRkVSU0VYVFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqZnJhbWVidWZmZXJzKTsKLXR5cGVkZWYgR0xlbnVtIChBUElFTlRSWVAgUEZOR0xDSEVDS0ZSQU1FQlVGRkVSU1RBVFVTRVhUUFJPQykgKEdMZW51bSB0YXJnZXQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKLXR5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlJFTkRFUkJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQU1FQlVGRkVSQVRUQUNITUVOVFBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5FUkFURU1JUE1BUEVYVFBST0MpIChHTGVudW0gdGFyZ2V0KTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0dSRU1FRFlfc3RyaW5nX21hcmtlcgotI2RlZmluZSBHTF9HUkVNRURZX3N0cmluZ19tYXJrZXIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdHJpbmdNYXJrZXJHUkVNRURZIChHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVFJJTkdNQVJLRVJHUkVNRURZUFJPQykgKEdMc2l6ZWkgbGVuLCBjb25zdCBHTHZvaWQgKnN0cmluZyk7Ci0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKLSNlbmRpZiAvKiBOT19TRExfR0xFWFQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9wbGF0Zm9ybS5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZmVlMjkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyogVHJ5IHRvIGdldCBhIHN0YW5kYXJkIHNldCBvZiBwbGF0Zm9ybSBkZWZpbmVzICovCi0KLSNpZm5kZWYgX1NETF9wbGF0Zm9ybV9oCi0jZGVmaW5lIF9TRExfcGxhdGZvcm1faAotCi0jaWYgZGVmaW5lZChfQUlYKQotI3VuZGVmIF9fQUlYX18KLSNkZWZpbmUgX19BSVhfXwkJMQotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JFT1NfXykKLSN1bmRlZiBfX0JFT1NfXwotI2RlZmluZSBfX0JFT1NfXwkxCi0jZW5kaWYKLSNpZiBkZWZpbmVkKGJzZGkpIHx8IGRlZmluZWQoX19ic2RpKSB8fCBkZWZpbmVkKF9fYnNkaV9fKQotI3VuZGVmIF9fQlNESV9fCi0jZGVmaW5lIF9fQlNESV9fCTEKLSNlbmRpZgotI2lmIGRlZmluZWQoX2FyY2hfZHJlYW1jYXN0KQotI3VuZGVmIF9fRFJFQU1DQVNUX18KLSNkZWZpbmUgX19EUkVBTUNBU1RfXwkxCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCi0jdW5kZWYgX19GUkVFQlNEX18KLSNkZWZpbmUgX19GUkVFQlNEX18JMQotI2VuZGlmCi0jaWYgZGVmaW5lZChocHV4KSB8fCBkZWZpbmVkKF9faHB1eCkgfHwgZGVmaW5lZChfX2hwdXhfXykKLSN1bmRlZiBfX0hQVVhfXwotI2RlZmluZSBfX0hQVVhfXwkxCi0jZW5kaWYKLSNpZiBkZWZpbmVkKHNnaSkgfHwgZGVmaW5lZChfX3NnaSkgfHwgZGVmaW5lZChfX3NnaV9fKSB8fCBkZWZpbmVkKF9TR0lfU09VUkNFKQotI3VuZGVmIF9fSVJJWF9fCi0jZGVmaW5lIF9fSVJJWF9fCTEKLSNlbmRpZgotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChfX2xpbnV4X18pCi0jdW5kZWYgX19MSU5VWF9fCi0jZGVmaW5lIF9fTElOVVhfXwkxCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQVBQTEVfXykKLSN1bmRlZiBfX01BQ09TWF9fCi0jZGVmaW5lIF9fTUFDT1NYX18JMQotI2VsaWYgZGVmaW5lZChtYWNpbnRvc2gpCi0jdW5kZWYgX19NQUNPU19fCi0jZGVmaW5lIF9fTUFDT1NfXwkxCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fTmV0QlNEX18pCi0jdW5kZWYgX19ORVRCU0RfXwotI2RlZmluZSBfX05FVEJTRF9fCTEKLSNlbmRpZgotI2lmIGRlZmluZWQoX19PcGVuQlNEX18pCi0jdW5kZWYgX19PUEVOQlNEX18KLSNkZWZpbmUgX19PUEVOQlNEX18JMQotI2VuZGlmCi0jaWYgZGVmaW5lZChfX09TMl9fKQotI3VuZGVmIF9fT1MyX18KLSNkZWZpbmUgX19PUzJfXwkJMQotI2VuZGlmCi0jaWYgZGVmaW5lZChvc2YpIHx8IGRlZmluZWQoX19vc2YpIHx8IGRlZmluZWQoX19vc2ZfXykgfHwgZGVmaW5lZChfT1NGX1NPVVJDRSkKLSN1bmRlZiBfX09TRl9fCi0jZGVmaW5lIF9fT1NGX18JCTEKLSNlbmRpZgotI2lmIGRlZmluZWQoX19RTlhOVE9fXykKLSN1bmRlZiBfX1FOWE5UT19fCi0jZGVmaW5lIF9fUU5YTlRPX18JMQotI2VuZGlmCi0jaWYgZGVmaW5lZChyaXNjb3MpIHx8IGRlZmluZWQoX19yaXNjb3MpIHx8IGRlZmluZWQoX19yaXNjb3NfXykKLSN1bmRlZiBfX1JJU0NPU19fCi0jZGVmaW5lIF9fUklTQ09TX18JMQotI2VuZGlmCi0jaWYgZGVmaW5lZChfX1NWUjQpCi0jdW5kZWYgX19TT0xBUklTX18KLSNkZWZpbmUgX19TT0xBUklTX18JMQotI2VuZGlmCi0jaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCi0jdW5kZWYgX19XSU4zMl9fCi0jZGVmaW5lIF9fV0lOMzJfXwkxCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TRExfcGxhdGZvcm1faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3F1aXQuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9xdWl0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZjQwZmIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3F1aXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qIEluY2x1ZGUgZmlsZSBmb3IgU0RMIHF1aXQgZXZlbnQgaGFuZGxpbmcgKi8KLQotI2lmbmRlZiBfU0RMX3F1aXRfaAotI2RlZmluZSBfU0RMX3F1aXRfaAotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotCi0vKiAKLSAgQW4gU0RMX1FVSVRFVkVOVCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgdXNlciB0cmllcyB0byBjbG9zZSB0aGUgYXBwbGljYXRpb24KLSAgd2luZG93LiAgSWYgaXQgaXMgaWdub3JlZCBvciBmaWx0ZXJlZCBvdXQsIHRoZSB3aW5kb3cgd2lsbCByZW1haW4gb3Blbi4KLSAgSWYgaXQgaXMgbm90IGlnbm9yZWQgb3IgZmlsdGVyZWQsIGl0IGlzIHF1ZXVlZCBub3JtYWxseSBhbmQgdGhlIHdpbmRvdwotICBpcyBhbGxvd2VkIHRvIGNsb3NlLiAgV2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZCwgc2NyZWVuIHVwZGF0ZXMgd2lsbCAKLSAgY29tcGxldGUsIGJ1dCBoYXZlIG5vIGVmZmVjdC4KLQotICBTRExfSW5pdCgpIGluc3RhbGxzIHNpZ25hbCBoYW5kbGVycyBmb3IgU0lHSU5UIChrZXlib2FyZCBpbnRlcnJ1cHQpCi0gIGFuZCBTSUdURVJNIChzeXN0ZW0gdGVybWluYXRpb24gcmVxdWVzdCksIGlmIGhhbmRsZXJzIGRvIG5vdCBhbHJlYWR5Ci0gIGV4aXN0LCB0aGF0IGdlbmVyYXRlIFNETF9RVUlURVZFTlQgZXZlbnRzIGFzIHdlbGwuICBUaGVyZSBpcyBubyB3YXkKLSAgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZSBvZiBhbiBTRExfUVVJVEVWRU5ULCBidXQgc2V0dGluZyBhIHNpZ25hbAotICBoYW5kbGVyIGluIHlvdXIgYXBwbGljYXRpb24gd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBnZW5lcmF0aW9uIG9mCi0gIHF1aXQgZXZlbnRzIGZvciB0aGF0IHNpZ25hbC4KLSovCi0KLS8qIFRoZXJlIGFyZSBubyBmdW5jdGlvbnMgZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBxdWl0IGV2ZW50ICovCi0jZGVmaW5lIFNETF9RdWl0UmVxdWVzdGVkKCkgXAotICAgICAgICAoU0RMX1B1bXBFdmVudHMoKSwgU0RMX1BlZXBFdmVudHMoTlVMTCwwLFNETF9QRUVLRVZFTlQsU0RMX1FVSVRNQVNLKSkKLQotI2VuZGlmIC8qIF9TRExfcXVpdF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfcndvcHMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9yd29wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzE3NzAxLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9yd29wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qIFRoaXMgZmlsZSBwcm92aWRlcyBhIGdlbmVyYWwgaW50ZXJmYWNlIGZvciBTREwgdG8gcmVhZCBhbmQgd3JpdGUKLSAgIGRhdGEgc291cmNlcy4gIEl0IGNhbiBlYXNpbHkgYmUgZXh0ZW5kZWQgdG8gZmlsZXMsIG1lbW9yeSwgZXRjLgotKi8KLQotI2lmbmRlZiBfU0RMX3J3b3BzX2gKLSNkZWZpbmUgX1NETF9yd29wc19oCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0KLSNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCi0vKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogVGhpcyBpcyB0aGUgcmVhZC93cml0ZSBvcGVyYXRpb24gc3RydWN0dXJlIC0tIHZlcnkgYmFzaWMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgU0RMX1JXb3BzIHsKLQkvKiBTZWVrIHRvICdvZmZzZXQnIHJlbGF0aXZlIHRvIHdoZW5jZSwgb25lIG9mIHN0ZGlvJ3Mgd2hlbmNlIHZhbHVlczoKLQkJU0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORAotCSAgIFJldHVybnMgdGhlIGZpbmFsIG9mZnNldCBpbiB0aGUgZGF0YSBzb3VyY2UuCi0JICovCi0JaW50IChTRExDQUxMICpzZWVrKShzdHJ1Y3QgU0RMX1JXb3BzICpjb250ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKLQotCS8qIFJlYWQgdXAgdG8gJ251bScgb2JqZWN0cyBlYWNoIG9mIHNpemUgJ29ianNpemUnIGZyb20gdGhlIGRhdGEKLQkgICBzb3VyY2UgdG8gdGhlIGFyZWEgcG9pbnRlZCBhdCBieSAncHRyJy4KLQkgICBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyByZWFkLCBvciAtMSBpZiB0aGUgcmVhZCBmYWlsZWQuCi0JICovCi0JaW50IChTRExDQUxMICpyZWFkKShzdHJ1Y3QgU0RMX1JXb3BzICpjb250ZXh0LCB2b2lkICpwdHIsIGludCBzaXplLCBpbnQgbWF4bnVtKTsKLQotCS8qIFdyaXRlIGV4YWN0bHkgJ251bScgb2JqZWN0cyBlYWNoIG9mIHNpemUgJ29ianNpemUnIGZyb20gdGhlIGFyZWEKLQkgICBwb2ludGVkIGF0IGJ5ICdwdHInIHRvIGRhdGEgc291cmNlLgotCSAgIFJldHVybnMgJ251bScsIG9yIC0xIGlmIHRoZSB3cml0ZSBmYWlsZWQuCi0JICovCi0JaW50IChTRExDQUxMICp3cml0ZSkoc3RydWN0IFNETF9SV29wcyAqY29udGV4dCwgY29uc3Qgdm9pZCAqcHRyLCBpbnQgc2l6ZSwgaW50IG51bSk7Ci0KLQkvKiBDbG9zZSBhbmQgZnJlZSBhbiBhbGxvY2F0ZWQgU0RMX0ZTb3BzIHN0cnVjdHVyZSAqLwotCWludCAoU0RMQ0FMTCAqY2xvc2UpKHN0cnVjdCBTRExfUldvcHMgKmNvbnRleHQpOwotCi0JVWludDMyIHR5cGU7Ci0JdW5pb24gewotI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotCSAgICBzdHJ1Y3QgewotCQlpbnQgICBhcHBlbmQ7Ci0JCXZvaWQgKmg7Ci0JCXN0cnVjdCB7Ci0JCSAgICB2b2lkICpkYXRhOwotCQkgICAgaW50IHNpemU7Ci0JCSAgICBpbnQgbGVmdDsKLQkJfSBidWZmZXI7Ci0JICAgIH0gd2luMzJpbzsKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RESU9fSCAKLQkgICAgc3RydWN0IHsKLQkJaW50IGF1dG9jbG9zZTsKLQkgCUZJTEUgKmZwOwotCSAgICB9IHN0ZGlvOwotI2VuZGlmCi0JICAgIHN0cnVjdCB7Ci0JCVVpbnQ4ICpiYXNlOwotCSAJVWludDggKmhlcmU7Ci0JCVVpbnQ4ICpzdG9wOwotCSAgICB9IG1lbTsKLQkgICAgc3RydWN0IHsKLQkJdm9pZCAqZGF0YTE7Ci0JICAgIH0gdW5rbm93bjsKLQl9IGhpZGRlbjsKLQotfSBTRExfUldvcHM7Ci0KLQotLyogRnVuY3Rpb25zIHRvIGNyZWF0ZSBTRExfUldvcHMgc3RydWN0dXJlcyBmcm9tIHZhcmlvdXMgZGF0YSBzb3VyY2VzICovCi0KLWV4dGVybiBERUNMU1BFQyBTRExfUldvcHMgKiBTRExDQUxMIFNETF9SV0Zyb21GaWxlKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm1vZGUpOwotCi0jaWZkZWYgSEFWRV9TVERJT19ICi1leHRlcm4gREVDTFNQRUMgU0RMX1JXb3BzICogU0RMQ0FMTCBTRExfUldGcm9tRlAoRklMRSAqZnAsIGludCBhdXRvY2xvc2UpOwotI2VuZGlmCi0KLWV4dGVybiBERUNMU1BFQyBTRExfUldvcHMgKiBTRExDQUxMIFNETF9SV0Zyb21NZW0odm9pZCAqbWVtLCBpbnQgc2l6ZSk7Ci1leHRlcm4gREVDTFNQRUMgU0RMX1JXb3BzICogU0RMQ0FMTCBTRExfUldGcm9tQ29uc3RNZW0oY29uc3Qgdm9pZCAqbWVtLCBpbnQgc2l6ZSk7Ci0KLWV4dGVybiBERUNMU1BFQyBTRExfUldvcHMgKiBTRExDQUxMIFNETF9BbGxvY1JXKHZvaWQpOwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRnJlZVJXKFNETF9SV29wcyAqYXJlYSk7Ci0KLSNkZWZpbmUgUldfU0VFS19TRVQJMAkvKiBTZWVrIGZyb20gdGhlIGJlZ2lubmluZyBvZiBkYXRhICovCi0jZGVmaW5lIFJXX1NFRUtfQ1VSCTEJLyogU2VlayByZWxhdGl2ZSB0byBjdXJyZW50IHJlYWQgcG9pbnQgKi8KLSNkZWZpbmUgUldfU0VFS19FTkQJMgkvKiBTZWVrIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgZGF0YSAqLwotCi0vKiBNYWNyb3MgdG8gZWFzaWx5IHJlYWQgYW5kIHdyaXRlIGZyb20gYW4gU0RMX1JXb3BzIHN0cnVjdHVyZSAqLwotI2RlZmluZSBTRExfUldzZWVrKGN0eCwgb2Zmc2V0LCB3aGVuY2UpCShjdHgpLT5zZWVrKGN0eCwgb2Zmc2V0LCB3aGVuY2UpCi0jZGVmaW5lIFNETF9SV3RlbGwoY3R4KQkJCShjdHgpLT5zZWVrKGN0eCwgMCwgUldfU0VFS19DVVIpCi0jZGVmaW5lIFNETF9SV3JlYWQoY3R4LCBwdHIsIHNpemUsIG4pCShjdHgpLT5yZWFkKGN0eCwgcHRyLCBzaXplLCBuKQotI2RlZmluZSBTRExfUld3cml0ZShjdHgsIHB0ciwgc2l6ZSwgbikJKGN0eCktPndyaXRlKGN0eCwgcHRyLCBzaXplLCBuKQotI2RlZmluZSBTRExfUldjbG9zZShjdHgpCQkoY3R4KS0+Y2xvc2UoY3R4KQotCi0KLS8qIFJlYWQgYW4gaXRlbSBvZiB0aGUgc3BlY2lmaWVkIGVuZGlhbm5lc3MgYW5kIHJldHVybiBpbiBuYXRpdmUgZm9ybWF0ICovCi1leHRlcm4gREVDTFNQRUMgVWludDE2IFNETENBTEwgU0RMX1JlYWRMRTE2KFNETF9SV29wcyAqc3JjKTsKLWV4dGVybiBERUNMU1BFQyBVaW50MTYgU0RMQ0FMTCBTRExfUmVhZEJFMTYoU0RMX1JXb3BzICpzcmMpOwotZXh0ZXJuIERFQ0xTUEVDIFVpbnQzMiBTRExDQUxMIFNETF9SZWFkTEUzMihTRExfUldvcHMgKnNyYyk7Ci1leHRlcm4gREVDTFNQRUMgVWludDMyIFNETENBTEwgU0RMX1JlYWRCRTMyKFNETF9SV29wcyAqc3JjKTsKLWV4dGVybiBERUNMU1BFQyBVaW50NjQgU0RMQ0FMTCBTRExfUmVhZExFNjQoU0RMX1JXb3BzICpzcmMpOwotZXh0ZXJuIERFQ0xTUEVDIFVpbnQ2NCBTRExDQUxMIFNETF9SZWFkQkU2NChTRExfUldvcHMgKnNyYyk7Ci0KLS8qIFdyaXRlIGFuIGl0ZW0gb2YgbmF0aXZlIGZvcm1hdCB0byB0aGUgc3BlY2lmaWVkIGVuZGlhbm5lc3MgKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfV3JpdGVMRTE2KFNETF9SV29wcyAqZHN0LCBVaW50MTYgdmFsdWUpOwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Xcml0ZUJFMTYoU0RMX1JXb3BzICpkc3QsIFVpbnQxNiB2YWx1ZSk7Ci1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1dyaXRlTEUzMihTRExfUldvcHMgKmRzdCwgVWludDMyIHZhbHVlKTsKLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfV3JpdGVCRTMyKFNETF9SV29wcyAqZHN0LCBVaW50MzIgdmFsdWUpOwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Xcml0ZUxFNjQoU0RMX1JXb3BzICpkc3QsIFVpbnQ2NCB2YWx1ZSk7Ci1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1dyaXRlQkU2NChTRExfUldvcHMgKmRzdCwgVWludDY0IHZhbHVlKTsKLQotCi0vKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaW5jbHVkZSAiY2xvc2VfY29kZS5oIgotCi0jZW5kaWYgLyogX1NETF9yd29wc19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfc3RkaW5jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfc3RkaW5jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MWE5YWMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3N0ZGluYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qIFRoaXMgaXMgYSBnZW5lcmFsIGhlYWRlciB0aGF0IGluY2x1ZGVzIEMgbGFuZ3VhZ2Ugc3VwcG9ydCAqLwotCi0jaWZuZGVmIF9TRExfc3RkaW5jX2gKLSNkZWZpbmUgX1NETF9zdGRpbmNfaAotCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0KLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURElPX0gKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChTVERDX0hFQURFUlMpCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotIyBpZiBkZWZpbmVkKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgZWxpZiBkZWZpbmVkKEhBVkVfTUFMTE9DX0gpCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZW5kaWYKLSMgaWYgZGVmaW5lZChIQVZFX1NURERFRl9IKQotIyAgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jIGVuZGlmCi0jIGlmIGRlZmluZWQoSEFWRV9TVERBUkdfSCkKLSMgIGluY2x1ZGUgPHN0ZGFyZy5oPgotIyBlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotIyBpZiAhZGVmaW5lZChTVERDX0hFQURFUlMpICYmIGRlZmluZWQoSEFWRV9NRU1PUllfSCkKLSMgIGluY2x1ZGUgPG1lbW9yeS5oPgotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmIGRlZmluZWQoSEFWRV9JTlRUWVBFU19IKQotIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2VsaWYgZGVmaW5lZChIQVZFX1NURElOVF9IKQotIyBpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfQ1RZUEVfSAotIyBpbmNsdWRlIDxjdHlwZS5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9JQ09OVl9ICi0jIGluY2x1ZGUgPGljb252Lmg+Ci0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSAqLwotI2RlZmluZSBTRExfYXJyYXlzaXplKGFycmF5KQkoc2l6ZW9mKGFycmF5KS9zaXplb2YoYXJyYXlbMF0pKQotI2RlZmluZSBTRExfVEFCTEVTSVpFKHRhYmxlKQlTRExfYXJyYXlzaXplKHRhYmxlKQotCi0vKiBCYXNpYyBkYXRhIHR5cGVzICovCi10eXBlZGVmIGVudW0gU0RMX2Jvb2wgewotCVNETF9GQUxTRSA9IDAsCi0JU0RMX1RSVUUgID0gMQotfSBTRExfYm9vbDsKLQotdHlwZWRlZiBpbnQ4X3QJCVNpbnQ4OwotdHlwZWRlZiB1aW50OF90CQlVaW50ODsKLXR5cGVkZWYgaW50MTZfdAkJU2ludDE2OwotdHlwZWRlZiB1aW50MTZfdAlVaW50MTY7Ci10eXBlZGVmIGludDMyX3QJCVNpbnQzMjsKLXR5cGVkZWYgdWludDMyX3QJVWludDMyOwotCi0jaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCi10eXBlZGVmIGludDY0X3QJCVNpbnQ2NDsKLSNpZm5kZWYgU1lNQklBTjMyX0dDQ0UKLXR5cGVkZWYgdWludDY0X3QJVWludDY0OwotI2VuZGlmCi0jZWxzZQotLyogVGhpcyBpcyByZWFsbHkganVzdCBhIGhhY2sgdG8gcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBjb21wbGFpbmluZyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCVVpbnQzMiBoaTsKLQlVaW50MzIgbG87Ci19IFVpbnQ2NCwgU2ludDY0OwotI2VuZGlmCi0KLS8qIE1ha2Ugc3VyZSB0aGUgdHlwZXMgcmVhbGx5IGhhdmUgdGhlIHJpZ2h0IHNpemVzICovCi0jZGVmaW5lIFNETF9DT01QSUxFX1RJTUVfQVNTRVJUKG5hbWUsIHgpICAgICAgICAgICAgICAgXAotICAgICAgIHR5cGVkZWYgaW50IFNETF9kdW1teV8gIyMgbmFtZVsoeCkgKiAyIC0gMV0KLQotU0RMX0NPTVBJTEVfVElNRV9BU1NFUlQodWludDgsIHNpemVvZihVaW50OCkgPT0gMSk7Ci1TRExfQ09NUElMRV9USU1FX0FTU0VSVChzaW50OCwgc2l6ZW9mKFNpbnQ4KSA9PSAxKTsKLVNETF9DT01QSUxFX1RJTUVfQVNTRVJUKHVpbnQxNiwgc2l6ZW9mKFVpbnQxNikgPT0gMik7Ci1TRExfQ09NUElMRV9USU1FX0FTU0VSVChzaW50MTYsIHNpemVvZihTaW50MTYpID09IDIpOwotU0RMX0NPTVBJTEVfVElNRV9BU1NFUlQodWludDMyLCBzaXplb2YoVWludDMyKSA9PSA0KTsKLVNETF9DT01QSUxFX1RJTUVfQVNTRVJUKHNpbnQzMiwgc2l6ZW9mKFNpbnQzMikgPT0gNCk7Ci1TRExfQ09NUElMRV9USU1FX0FTU0VSVCh1aW50NjQsIHNpemVvZihVaW50NjQpID09IDgpOwotU0RMX0NPTVBJTEVfVElNRV9BU1NFUlQoc2ludDY0LCBzaXplb2YoU2ludDY0KSA9PSA4KTsKLQotLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGVudW1zIGFyZSB0aGUgc2l6ZSBvZiBpbnRzLCBmb3Igc3RydWN0dXJlIHBhY2tpbmcuCi0gICBGb3IgYm90aCBXYXRjb20gQy9DKysgYW5kIEJvcmxhbmQgQy9DKysgdGhlIGNvbXBpbGVyIG9wdGlvbiB0aGF0IG1ha2VzCi0gICBlbnVtcyBoYXZpbmcgdGhlIHNpemUgb2YgYW4gaW50IG11c3QgYmUgZW5hYmxlZC4KLSAgIFRoaXMgaXMgIi1iIiBmb3IgQm9ybGFuZCBDL0MrKyBhbmQgIi1laSIgZm9yIFdhdGNvbSBDL0MrKyAodjExKS4KLSovCi0vKiBFbmFibGUgZW51bXMgYWx3YXlzIGludCBpbiBDb2RlV2FycmlvciAoZm9yIE1QVyB1c2UgIi1lbnVtIGludCIpICovCi0jaWZkZWYgX19NV0VSS1NfXwotI3ByYWdtYSBlbnVtc2Fsd2F5c2ludCBvbgotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JRFVNTVlfRU5VTV9WQUxVRQotfSBTRExfRFVNTVlfRU5VTTsKLQotI2lmbmRlZiBfX05EU19fCi1TRExfQ09NUElMRV9USU1FX0FTU0VSVChlbnVtLCBzaXplb2YoU0RMX0RVTU1ZX0VOVU0pID09IHNpemVvZihpbnQpKTsKLSNlbmRpZgotCi0KLSNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCi0vKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTUFMTE9DCi0jZGVmaW5lIFNETF9tYWxsb2MJbWFsbG9jCi0jZWxzZQotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgKiBTRExDQUxMIFNETF9tYWxsb2Moc2l6ZV90IHNpemUpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NBTExPQwotI2RlZmluZSBTRExfY2FsbG9jCWNhbGxvYwotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyB2b2lkICogU0RMQ0FMTCBTRExfY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1JFQUxMT0MKLSNkZWZpbmUgU0RMX3JlYWxsb2MJcmVhbGxvYwotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyB2b2lkICogU0RMQ0FMTCBTRExfcmVhbGxvYyh2b2lkICptZW0sIHNpemVfdCBzaXplKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9GUkVFCi0jZGVmaW5lIFNETF9mcmVlCWZyZWUKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9mcmVlKHZvaWQgKm1lbSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9BTExPQ0EpICYmICFkZWZpbmVkKGFsbG9jYSkKLSMgaWYgZGVmaW5lZChIQVZFX0FMTE9DQV9IKQotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyBlbGlmIGRlZmluZWQoX01TQ19WRVIpCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxpZiBkZWZpbmVkKF9fRE1DX18pCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgZWxpZiBkZWZpbmVkKF9fQUlYX18pCi0gICNwcmFnbWEgYWxsb2NhCi0jIGVsaWYgZGVmaW5lZChfX01SQ19fKQotICAgdm9pZCAqYWxsb2NhICh1bnNpZ25lZCk7Ci0jIGVsc2UKLSAgIGNoYXIgKmFsbG9jYSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfQUxMT0NBCi0jZGVmaW5lIFNETF9zdGFja19hbGxvYyh0eXBlLCBjb3VudCkgICAgKHR5cGUqKWFsbG9jYShzaXplb2YodHlwZSkqKGNvdW50KSkKLSNkZWZpbmUgU0RMX3N0YWNrX2ZyZWUoZGF0YSkKLSNlbHNlCi0jZGVmaW5lIFNETF9zdGFja19hbGxvYyh0eXBlLCBjb3VudCkgICAgKHR5cGUqKVNETF9tYWxsb2Moc2l6ZW9mKHR5cGUpKihjb3VudCkpCi0jZGVmaW5lIFNETF9zdGFja19mcmVlKGRhdGEpICAgICAgICAgICAgU0RMX2ZyZWUoZGF0YSkKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9HRVRFTlYKLSNkZWZpbmUgU0RMX2dldGVudglnZXRlbnYKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX2dldGVudihjb25zdCBjaGFyICpuYW1lKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9QVVRFTlYKLSNkZWZpbmUgU0RMX3B1dGVudglwdXRlbnYKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX3B1dGVudihjb25zdCBjaGFyICp2YXJpYWJsZSk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfUVNPUlQKLSNkZWZpbmUgU0RMX3Fzb3J0CXFzb3J0Ci0jZWxzZQotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfcXNvcnQodm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgaW50ICgqY29tcGFyZSkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9BQlMKLSNkZWZpbmUgU0RMX2FicwkJYWJzCi0jZWxzZQotI2RlZmluZSBTRExfYWJzKFgpCSgoWCkgPCAwID8gLShYKSA6IChYKSkKLSNlbmRpZgotCi0jZGVmaW5lIFNETF9taW4oeCwgeSkJKCgoeCkgPCAoeSkpID8gKHgpIDogKHkpKQotI2RlZmluZSBTRExfbWF4KHgsIHkpCSgoKHgpID4gKHkpKSA/ICh4KSA6ICh5KSkKLQotI2lmZGVmIEhBVkVfQ1RZUEVfSAotI2RlZmluZSBTRExfaXNkaWdpdChYKSAgaXNkaWdpdChYKQotI2RlZmluZSBTRExfaXNzcGFjZShYKSAgaXNzcGFjZShYKQotI2RlZmluZSBTRExfdG91cHBlcihYKSAgdG91cHBlcihYKQotI2RlZmluZSBTRExfdG9sb3dlcihYKSAgdG9sb3dlcihYKQotI2Vsc2UKLSNkZWZpbmUgU0RMX2lzZGlnaXQoWCkgICgoKFgpID49ICcwJykgJiYgKChYKSA8PSAnOScpKQotI2RlZmluZSBTRExfaXNzcGFjZShYKSAgKCgoWCkgPT0gJyAnKSB8fCAoKFgpID09ICdcdCcpIHx8ICgoWCkgPT0gJ1xyJykgfHwgKChYKSA9PSAnXG4nKSkKLSNkZWZpbmUgU0RMX3RvdXBwZXIoWCkgICgoKFgpID49ICdhJykgJiYgKChYKSA8PSAneicpID8gKCdBJysoKFgpLSdhJykpIDogKFgpKQotI2RlZmluZSBTRExfdG9sb3dlcihYKSAgKCgoWCkgPj0gJ0EnKSAmJiAoKFgpIDw9ICdaJykgPyAoJ2EnKygoWCktJ0EnKSkgOiAoWCkpCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTUVNU0VUCi0jZGVmaW5lIFNETF9tZW1zZXQgICAgICBtZW1zZXQKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgdm9pZCAqIFNETENBTEwgU0RMX21lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3QgbGVuKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChpMzg2KQotI2RlZmluZSBTRExfbWVtc2V0NChkc3QsIHZhbCwgbGVuKQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaW50IHUwLCB1MSwgdTI7CQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCVwKLQkJImNsZFxuXHQiCQkJCQlcCi0JCSJyZXAgOyBzdG9zbFxuXHQiCQkJCVwKLQkJOiAiPSZEIiAodTApLCAiPSZhIiAodTEpLCAiPSZjIiAodTIpCQlcCi0JCTogIjAiIChkc3QpLCAiMSIgKHZhbCksICIyIiAoKFVpbnQzMikobGVuKSkJXAotCQk6ICJtZW1vcnkiICk7CQkJCQlcCi19IHdoaWxlKDApCi0jZW5kaWYKLSNpZm5kZWYgU0RMX21lbXNldDQKLSNkZWZpbmUgU0RMX21lbXNldDQoZHN0LCB2YWwsIGxlbikJCVwKLWRvIHsJCQkJCQlcCi0JdW5zaWduZWQgX2NvdW50ID0gKGxlbik7CQlcCi0JdW5zaWduZWQgX24gPSAoX2NvdW50ICsgMykgLyA0OwkJXAotCVVpbnQzMiAqX3AgPSAoVWludDMyICopKGRzdCk7CQlcCi0JVWludDMyIF92YWwgPSAodmFsKTsJCQlcCi0gICAgICAgIHN3aXRjaCAoX2NvdW50ICUgNCkgewkJCVwKLSAgICAgICAgY2FzZSAwOiBkbyB7ICAgICpfcCsrID0gX3ZhbDsJCVwKLSAgICAgICAgY2FzZSAzOiAgICAgICAgICpfcCsrID0gX3ZhbDsJCVwKLSAgICAgICAgY2FzZSAyOiAgICAgICAgICpfcCsrID0gX3ZhbDsJCVwKLSAgICAgICAgY2FzZSAxOiAgICAgICAgICpfcCsrID0gX3ZhbDsJCVwKLQkJfSB3aGlsZSAoIC0tX24gKTsJCVwKLQl9CQkJCQlcCi19IHdoaWxlKDApCi0jZW5kaWYKLQotLyogV2UgY2FuIGNvdW50IG9uIG1lbWNweSBleGlzdGluZyBvbiBNYWMgT1MgWCBhbmQgYmVpbmcgd2VsbC10dW5lZC4gKi8KLSNpZiBkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykKLSNkZWZpbmUgU0RMX21lbWNweShkc3QsIHNyYywgbGVuKSBtZW1jcHkoZHN0LCBzcmMsIGxlbikKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoaTM4NikKLSNkZWZpbmUgU0RMX21lbWNweShkc3QsIHNyYywgbGVuKQkJCQkJICBcCi1kbyB7CQkJCQkJCQkJICBcCi0JaW50IHUwLCB1MSwgdTI7CQkJCQkJICAJICBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJCSAgXAotCQkiY2xkXG5cdCIJCQkJCQkgIFwKLQkJInJlcCA7IG1vdnNsXG5cdCIJCQkJCSAgXAotCQkidGVzdGIgJDIsJWI0XG5cdCIJCQkJCSAgXAotCQkiamUgMWZcblx0IgkJCQkJCSAgXAotCQkibW92c3dcbiIJCQkJCQkgIFwKLQkJIjE6XHR0ZXN0YiAkMSwlYjRcblx0IgkJCQkJICBcCi0JCSJqZSAyZlxuXHQiCQkJCQkJICBcCi0JCSJtb3ZzYlxuIgkJCQkJCSAgXAotCQkiMjoiCQkJCQkJCSAgXAotCQk6ICI9JmMiICh1MCksICI9JkQiICh1MSksICI9JlMiICh1MikJCQkgIFwKLQkJOiAiMCIgKCh1bnNpZ25lZCkobGVuKS80KSwgInEiIChsZW4pLCAiMSIgKGRzdCksIjIiIChzcmMpIFwKLQkJOiAibWVtb3J5IiApOwkJCQkJCSAgXAotfSB3aGlsZSgwKQotI2VuZGlmCi0jaWZuZGVmIFNETF9tZW1jcHkKLSNpZmRlZiBIQVZFX01FTUNQWQotI2RlZmluZSBTRExfbWVtY3B5ICAgICAgbWVtY3B5Ci0jZWxpZiBkZWZpbmVkKEhBVkVfQkNPUFkpCi0jZGVmaW5lIFNETF9tZW1jcHkoZCwgcywgbikJYmNvcHkoKHMpLCAoZCksIChuKSkKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgdm9pZCAqIFNETENBTEwgU0RMX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbik7Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBjYW4gY291bnQgb24gbWVtY3B5IGV4aXN0aW5nIG9uIE1hYyBPUyBYIGFuZCBiZWluZyB3ZWxsLXR1bmVkLiAqLwotI2lmIGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKQotI2RlZmluZSBTRExfbWVtY3B5NChkc3QsIHNyYywgbGVuKSBtZW1jcHkoZHN0LCBzcmMsIChsZW4pKjQpCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKGkzODYpCi0jZGVmaW5lIFNETF9tZW1jcHk0KGRzdCwgc3JjLCBsZW4pCQkJCVwKLWRvIHsJCQkJCQkJCVwKLQlpbnQgZWN4LCBlZGksIGVzaTsJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQlcCi0JCSJjbGRcblx0IgkJCQkJXAotCQkicmVwIDsgbW92c2wiCQkJCQlcCi0JCTogIj0mYyIgKGVjeCksICI9JkQiIChlZGkpLCAiPSZTIiAoZXNpKQkJXAotCQk6ICIwIiAoKHVuc2lnbmVkKShsZW4pKSwgIjEiIChkc3QpLCAiMiIgKHNyYykJXAotCQk6ICJtZW1vcnkiICk7CQkJCQlcCi19IHdoaWxlKDApCi0jZW5kaWYKLSNpZm5kZWYgU0RMX21lbWNweTQKLSNkZWZpbmUgU0RMX21lbWNweTQoZHN0LCBzcmMsIGxlbikJU0RMX21lbWNweShkc3QsIHNyYywgKGxlbikgPDwgMikKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChpMzg2KQotI2RlZmluZSBTRExfcmV2Y3B5KGRzdCwgc3JjLCBsZW4pCQkJXAotZG8gewkJCQkJCQlcCi0JaW50IHUwLCB1MSwgdTI7CQkJCQlcCi0JY2hhciAqZHN0cCA9IChjaGFyICopKGRzdCk7CQkJXAotCWNoYXIgKnNyY3AgPSAoY2hhciAqKShzcmMpOwkJCVwKLQlpbnQgbiA9IChsZW4pOwkJCQkJXAotCWlmICggbiA+PSA0ICkgewkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJXAotCQkic3RkXG5cdCIJCQkJXAotCQkicmVwIDsgbW92c2xcblx0IgkJCVwKLQkJOiAiPSZjIiAodTApLCAiPSZEIiAodTEpLCAiPSZTIiAodTIpCVwKLQkJOiAiMCIgKG4gPj4gMiksCQkJCVwKLQkJICAiMSIgKGRzdHArKG4tNCkpLCAiMiIgKHNyY3ArKG4tNCkpCVwKLQkJOiAibWVtb3J5IiApOwkJCQlcCi0JfQkJCQkJCVwKLQlzd2l0Y2ggKG4gJiAzKSB7CQkJCVwKLQkJY2FzZSAzOiBkc3RwWzJdID0gc3JjcFsyXTsJCVwKLQkJY2FzZSAyOiBkc3RwWzFdID0gc3JjcFsxXTsJCVwKLQkJY2FzZSAxOiBkc3RwWzBdID0gc3JjcFswXTsJCVwKLQkJCWJyZWFrOwkJCQlcCi0JCWRlZmF1bHQ6CQkJCVwKLQkJCWJyZWFrOwkJCQlcCi0JfQkJCQkJCVwKLX0gd2hpbGUoMCkKLSNlbmRpZgotI2lmbmRlZiBTRExfcmV2Y3B5Ci1leHRlcm4gREVDTFNQRUMgdm9pZCAqIFNETENBTEwgU0RMX3JldmNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbik7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTUVNTU9WRQotI2RlZmluZSBTRExfbWVtbW92ZSAgICAgbWVtbW92ZQotI2VsaWYgZGVmaW5lZChIQVZFX0JDT1BZKQotI2RlZmluZSBTRExfbWVtbW92ZShkLCBzLCBuKQliY29weSgocyksIChkKSwgKG4pKQotI2Vsc2UKLSNkZWZpbmUgU0RMX21lbW1vdmUoZHN0LCBzcmMsIGxlbikJCQlcCi1kbyB7CQkJCQkJCVwKLQlpZiAoIGRzdCA8IHNyYyApIHsJCQkJXAotCQlTRExfbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwkJXAotCX0gZWxzZSB7CQkJCQlcCi0JCVNETF9yZXZjcHkoZHN0LCBzcmMsIGxlbik7CQlcCi0JfQkJCQkJCVwKLX0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9NRU1DTVAKLSNkZWZpbmUgU0RMX21lbWNtcCAgICAgIG1lbWNtcAotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IGxlbik7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSTEVOCi0jZGVmaW5lIFNETF9zdHJsZW4gICAgICBzdHJsZW4KLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgc2l6ZV90IFNETENBTEwgU0RMX3N0cmxlbihjb25zdCBjaGFyICpzdHJpbmcpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUkxDUFkKLSNkZWZpbmUgU0RMX3N0cmxjcHkgICAgIHN0cmxjcHkKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgc2l6ZV90IFNETENBTEwgU0RMX3N0cmxjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBtYXhsZW4pOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUkxDQVQKLSNkZWZpbmUgU0RMX3N0cmxjYXQgICAgc3RybGNhdAotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBzaXplX3QgU0RMQ0FMTCBTRExfc3RybGNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG1heGxlbik7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSRFVQCi0jZGVmaW5lIFNETF9zdHJkdXAgICAgIHN0cmR1cAotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBjaGFyICogU0RMQ0FMTCBTRExfc3RyZHVwKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfX1NUUlJFVgotI2RlZmluZSBTRExfc3RycmV2ICAgICAgX3N0cnJldgotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBjaGFyICogU0RMQ0FMTCBTRExfc3RycmV2KGNoYXIgKnN0cmluZyk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfX1NUUlVQUgotI2RlZmluZSBTRExfc3RydXByICAgICAgX3N0cnVwcgotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBjaGFyICogU0RMQ0FMTCBTRExfc3RydXByKGNoYXIgKnN0cmluZyk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfX1NUUkxXUgotI2RlZmluZSBTRExfc3RybHdyICAgICAgX3N0cmx3cgotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBjaGFyICogU0RMQ0FMTCBTRExfc3RybHdyKGNoYXIgKnN0cmluZyk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSQ0hSCi0jZGVmaW5lIFNETF9zdHJjaHIgICAgICBzdHJjaHIKLSNlbGlmIGRlZmluZWQoSEFWRV9JTkRFWCkKLSNkZWZpbmUgU0RMX3N0cmNociAgICAgIGluZGV4Ci0jZWxzZQotZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9zdHJjaHIoY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgYyk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSUkNIUgotI2RlZmluZSBTRExfc3RycmNociAgICAgc3RycmNocgotI2VsaWYgZGVmaW5lZChIQVZFX1JJTkRFWCkKLSNkZWZpbmUgU0RMX3N0cnJjaHIgICAgIHJpbmRleAotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBjaGFyICogU0RMQ0FMTCBTRExfc3RycmNocihjb25zdCBjaGFyICpzdHJpbmcsIGludCBjKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJTVFIKLSNkZWZpbmUgU0RMX3N0cnN0ciAgICAgIHN0cnN0cgotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBjaGFyICogU0RMQ0FMTCBTRExfc3Ryc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0lUT0EKLSNkZWZpbmUgU0RMX2l0b2EgICAgICAgIGl0b2EKLSNlbHNlCi0jZGVmaW5lIFNETF9pdG9hKHZhbHVlLCBzdHJpbmcsIHJhZGl4KQlTRExfbHRvYSgobG9uZyl2YWx1ZSwgc3RyaW5nLCByYWRpeCkKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9fTFRPQQotI2RlZmluZSBTRExfbHRvYSAgICAgICAgX2x0b2EKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX2x0b2EobG9uZyB2YWx1ZSwgY2hhciAqc3RyaW5nLCBpbnQgcmFkaXgpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX19VSVRPQQotI2RlZmluZSBTRExfdWl0b2EgICAgICAgX3VpdG9hCi0jZWxzZQotI2RlZmluZSBTRExfdWl0b2EodmFsdWUsIHN0cmluZywgcmFkaXgpCVNETF91bHRvYSgobG9uZyl2YWx1ZSwgc3RyaW5nLCByYWRpeCkKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9fVUxUT0EKLSNkZWZpbmUgU0RMX3VsdG9hICAgICAgIF91bHRvYQotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBjaGFyICogU0RMQ0FMTCBTRExfdWx0b2EodW5zaWduZWQgbG9uZyB2YWx1ZSwgY2hhciAqc3RyaW5nLCBpbnQgcmFkaXgpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUlRPTAotI2RlZmluZSBTRExfc3RydG9sICAgICAgc3RydG9sCi0jZWxzZQotZXh0ZXJuIERFQ0xTUEVDIGxvbmcgU0RMQ0FMTCBTRExfc3RydG9sKGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqKmVuZHAsIGludCBiYXNlKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJUT1VMCi0jZGVmaW5lIFNETF9zdHJ0b3VsICAgICAgc3RydG91bAotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyB1bnNpZ25lZCBsb25nIFNETENBTEwgU0RMX3N0cnRvdWwoY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpOwotI2VuZGlmCi0KLSNpZmRlZiBTRExfSEFTXzY0QklUX1RZUEUKLQotI2lmZGVmIEhBVkVfX0k2NFRPQQotI2RlZmluZSBTRExfbGx0b2EgICAgICAgX2k2NHRvYQotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBjaGFyKiBTRExDQUxMIFNETF9sbHRvYShTaW50NjQgdmFsdWUsIGNoYXIgKnN0cmluZywgaW50IHJhZGl4KTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9fVUk2NFRPQQotI2RlZmluZSBTRExfdWxsdG9hICAgICAgX3VpNjR0b2EKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgY2hhciogU0RMQ0FMTCBTRExfdWxsdG9hKFVpbnQ2NCB2YWx1ZSwgY2hhciAqc3RyaW5nLCBpbnQgcmFkaXgpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUlRPTEwKLSNkZWZpbmUgU0RMX3N0cnRvbGwgICAgIHN0cnRvbGwKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgU2ludDY0IFNETENBTEwgU0RMX3N0cnRvbGwoY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUlRPVUxMCi0jZGVmaW5lIFNETF9zdHJ0b3VsbCAgICAgc3RydG91bGwKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgVWludDY0IFNETENBTEwgU0RMX3N0cnRvdWxsKGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqKmVuZHAsIGludCBiYXNlKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogU0RMX0hBU182NEJJVF9UWVBFICovCi0KLSNpZmRlZiBIQVZFX1NUUlRPRAotI2RlZmluZSBTRExfc3RydG9kICAgICAgc3RydG9kCi0jZWxzZQotZXh0ZXJuIERFQ0xTUEVDIGRvdWJsZSBTRExDQUxMIFNETF9zdHJ0b2QoY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kcCk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQVRPSQotI2RlZmluZSBTRExfYXRvaSAgICAgICAgYXRvaQotI2Vsc2UKLSNkZWZpbmUgU0RMX2F0b2koWCkgICAgIFNETF9zdHJ0b2woWCwgTlVMTCwgMCkKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9BVE9GCi0jZGVmaW5lIFNETF9hdG9mICAgICAgICBhdG9mCi0jZWxzZQotI2RlZmluZSBTRExfYXRvZihYKSAgICAgU0RMX3N0cnRvZChYLCBOVUxMKQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUkNNUAotI2RlZmluZSBTRExfc3RyY21wICAgICAgc3RyY21wCi0jZWxzZQotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9zdHJjbXAoY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMik7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSTkNNUAotI2RlZmluZSBTRExfc3RybmNtcCAgICAgc3RybmNtcAotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfc3RybmNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyLCBzaXplX3QgbWF4bGVuKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJDQVNFQ01QCi0jZGVmaW5lIFNETF9zdHJjYXNlY21wICBzdHJjYXNlY21wCi0jZWxpZiBkZWZpbmVkKEhBVkVfX1NUUklDTVApCi0jZGVmaW5lIFNETF9zdHJjYXNlY21wICBfc3RyaWNtcAotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfc3RyY2FzZWNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJOQ0FTRUNNUAotI2RlZmluZSBTRExfc3RybmNhc2VjbXAgc3RybmNhc2VjbXAKLSNlbGlmIGRlZmluZWQoSEFWRV9fU1RSTklDTVApCi0jZGVmaW5lIFNETF9zdHJuY2FzZWNtcCBfc3RybmljbXAKLSNlbHNlCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX3N0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIsIHNpemVfdCBtYXhsZW4pOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NTQ0FORgotI2RlZmluZSBTRExfc3NjYW5mICAgICAgc3NjYW5mCi0jZWxzZQotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9zc2NhbmYoY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NOUFJJTlRGCi0jZGVmaW5lIFNETF9zbnByaW50ZiAgICBzbnByaW50ZgotI2Vsc2UKLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfc25wcmludGYoY2hhciAqdGV4dCwgc2l6ZV90IG1heGxlbiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1ZTTlBSSU5URgotI2RlZmluZSBTRExfdnNucHJpbnRmICAgdnNucHJpbnRmCi0jZWxzZQotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF92c25wcmludGYoY2hhciAqdGV4dCwgc2l6ZV90IG1heGxlbiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSNlbmRpZgotCi0vKiBUaGUgU0RMIGltcGxlbWVudGF0aW9uIG9mIGljb252KCkgcmV0dXJucyB0aGVzZSBlcnJvciBjb2RlcyAqLwotI2RlZmluZSBTRExfSUNPTlZfRVJST1IJCShzaXplX3QpLTEKLSNkZWZpbmUgU0RMX0lDT05WX0UyQklHCQkoc2l6ZV90KS0yCi0jZGVmaW5lIFNETF9JQ09OVl9FSUxTRVEJKHNpemVfdCktMwotI2RlZmluZSBTRExfSUNPTlZfRUlOVkFMCShzaXplX3QpLTQKLQotI2lmZGVmIEhBVkVfSUNPTlYKLSNkZWZpbmUgU0RMX2ljb252X3QgICAgIGljb252X3QKLSNkZWZpbmUgU0RMX2ljb252X29wZW4gIGljb252X29wZW4KLSNkZWZpbmUgU0RMX2ljb252X2Nsb3NlIGljb252X2Nsb3NlCi0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QgX1NETF9pY29udl90ICpTRExfaWNvbnZfdDsKLWV4dGVybiBERUNMU1BFQyBTRExfaWNvbnZfdCBTRExDQUxMIFNETF9pY29udl9vcGVuKGNvbnN0IGNoYXIgKnRvY29kZSwgY29uc3QgY2hhciAqZnJvbWNvZGUpOwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9pY29udl9jbG9zZShTRExfaWNvbnZfdCBjZCk7Ci0jZW5kaWYKLWV4dGVybiBERUNMU1BFQyBzaXplX3QgU0RMQ0FMTCBTRExfaWNvbnYoU0RMX2ljb252X3QgY2QsIGNvbnN0IGNoYXIgKippbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwgY2hhciAqKm91dGJ1Ziwgc2l6ZV90ICpvdXRieXRlc2xlZnQpOwotLyogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHN0cmluZyBiZXR3ZWVuIGVuY29kaW5ncyBpbiBvbmUgcGFzcywgcmV0dXJuaW5nIGEKLSAgIHN0cmluZyB0aGF0IG11c3QgYmUgZnJlZWQgd2l0aCBTRExfZnJlZSgpIG9yIE5VTEwgb24gZXJyb3IuCi0qLwotZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9pY29udl9zdHJpbmcoY29uc3QgY2hhciAqdG9jb2RlLCBjb25zdCBjaGFyICpmcm9tY29kZSwgY29uc3QgY2hhciAqaW5idWYsIHNpemVfdCBpbmJ5dGVzbGVmdCk7Ci0jZGVmaW5lIFNETF9pY29udl91dGY4X2xvY2FsZShTKQlTRExfaWNvbnZfc3RyaW5nKCIiLCAiVVRGLTgiLCBTLCBTRExfc3RybGVuKFMpKzEpCi0jZGVmaW5lIFNETF9pY29udl91dGY4X3VjczIoUykJCShVaW50MTYgKilTRExfaWNvbnZfc3RyaW5nKCJVQ1MtMiIsICJVVEYtOCIsIFMsIFNETF9zdHJsZW4oUykrMSkKLSNkZWZpbmUgU0RMX2ljb252X3V0ZjhfdWNzNChTKQkJKFVpbnQzMiAqKVNETF9pY29udl9zdHJpbmcoIlVDUy00IiwgIlVURi04IiwgUywgU0RMX3N0cmxlbihTKSsxKQotCi0vKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaW5jbHVkZSAiY2xvc2VfY29kZS5oIgotCi0jZW5kaWYgLyogX1NETF9zdGRpbmNfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3N5c3dtLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfc3lzd20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwMjAzNy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfc3lzd20uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBJbmNsdWRlIGZpbGUgZm9yIFNETCBjdXN0b20gc3lzdGVtIHdpbmRvdyBtYW5hZ2VyIGhvb2tzICovCi0KLSNpZm5kZWYgX1NETF9zeXN3bV9oCi0jZGVmaW5lIF9TRExfc3lzd21faAotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotI2luY2x1ZGUgIlNETF92ZXJzaW9uLmgiCi0KLSNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCi0vKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogWW91ciBhcHBsaWNhdGlvbiBoYXMgYWNjZXNzIHRvIGEgc3BlY2lhbCB0eXBlIG9mIGV2ZW50ICdTRExfU1lTV01FVkVOVCcsCi0gICB3aGljaCBjb250YWlucyB3aW5kb3ctbWFuYWdlciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgYXJyaXZlcyB3aGVuZXZlcgotICAgYW4gdW5oYW5kbGVkIHdpbmRvdyBldmVudCBvY2N1cnMuICBUaGlzIGV2ZW50IGlzIGlnbm9yZWQgYnkgZGVmYXVsdCwgYnV0Ci0gICB5b3UgY2FuIGVuYWJsZSBpdCB3aXRoIFNETF9FdmVudFN0YXRlKCkKLSovCi0jaWZkZWYgU0RMX1BST1RPVFlQRVNfT05MWQotc3RydWN0IFNETF9TeXNXTWluZm87Ci10eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIFNETF9TeXNXTWluZm87Ci0jZWxzZQotCi0vKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgZm9yIGN1c3RvbSB3aW5kb3cgbWFuYWdlciBldmVudHMgKi8KLSNpZiBkZWZpbmVkKFNETF9WSURFT19EUklWRVJfWDExKQotI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQotLyogY29uZmxpY3RzIHdpdGggUXVpY2tkcmF3LmggKi8KLSNkZWZpbmUgQ3Vyc29yIFgxMUN1cnNvcgotI2VuZGlmCi0KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgotCi0jaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCi0vKiBtYXRjaGVzIHRoZSByZS1kZWZpbmUgYWJvdmUgKi8KLSN1bmRlZiBDdXJzb3IKLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgdGhlIHZhcmlvdXMgc3VwcG9ydGVkIHN1YnN5c3RlbXMgdW5kZXIgVU5JWCAqLwotdHlwZWRlZiBlbnVtIHsKLQlTRExfU1lTV01fWDExCi19IFNETF9TWVNXTV9UWVBFOwotCi0vKiBUaGUgVU5JWCBjdXN0b20gZXZlbnQgc3RydWN0dXJlICovCi1zdHJ1Y3QgU0RMX1N5c1dNbXNnIHsKLQlTRExfdmVyc2lvbiB2ZXJzaW9uOwotCVNETF9TWVNXTV9UWVBFIHN1YnN5c3RlbTsKLQl1bmlvbiB7Ci0JICAgIFhFdmVudCB4ZXZlbnQ7Ci0JfSBldmVudDsKLX07Ci0KLS8qIFRoZSBVTklYIGN1c3RvbSB3aW5kb3cgbWFuYWdlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCi0gICBXaGVuIHRoaXMgc3RydWN0dXJlIGlzIHJldHVybmVkLCBpdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB3aGljaAotICAgbG93IGxldmVsIHN5c3RlbSBpdCBpcyB1c2luZywgYW5kIHdpbGwgYmUgb25lIG9mIFNETF9TWVNXTV9UWVBFLgotICovCi10eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIHsKLQlTRExfdmVyc2lvbiB2ZXJzaW9uOwotCVNETF9TWVNXTV9UWVBFIHN1YnN5c3RlbTsKLQl1bmlvbiB7Ci0JICAgIHN0cnVjdCB7Ci0JICAgIAlEaXNwbGF5ICpkaXNwbGF5OwkvKiBUaGUgWDExIGRpc3BsYXkgKi8KLQkgICAgCVdpbmRvdyB3aW5kb3c7CQkvKiBUaGUgWDExIGRpc3BsYXkgd2luZG93ICovCi0JCS8qIFRoZXNlIGxvY2tpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSBjYWxsZWQgYXJvdW5kCi0gICAgICAgICAgICAgICAgICAgYW55IFgxMSBmdW5jdGlvbnMgdXNpbmcgdGhlIGRpc3BsYXkgdmFyaWFibGUsIAotICAgICAgICAgICAgICAgICAgIGJ1dCBub3QgdGhlIGdmeGRpc3BsYXkgdmFyaWFibGUuCi0gICAgICAgICAgICAgICAgICAgVGhleSBsb2NrIHRoZSBldmVudCB0aHJlYWQsIHNvIHNob3VsZCBub3QgYmUKLQkJICAgY2FsbGVkIGFyb3VuZCBldmVudCBmdW5jdGlvbnMgb3IgZnJvbSBldmVudCBmaWx0ZXJzLgotCQkgKi8KLQkJdm9pZCAoKmxvY2tfZnVuYykodm9pZCk7Ci0JCXZvaWQgKCp1bmxvY2tfZnVuYykodm9pZCk7Ci0KLQkJLyogSW50cm9kdWNlZCBpbiBTREwgMS4wLjIgKi8KLQkgICAgCVdpbmRvdyBmc3dpbmRvdzsJLyogVGhlIFgxMSBmdWxsc2NyZWVuIHdpbmRvdyAqLwotCSAgICAJV2luZG93IHdtd2luZG93OwkvKiBUaGUgWDExIG1hbmFnZWQgaW5wdXQgd2luZG93ICovCi0KLQkJLyogSW50cm9kdWNlZCBpbiBTREwgMS4yLjEyICovCi0JCURpc3BsYXkgKmdmeGRpc3BsYXk7CS8qIFRoZSBYMTEgZGlzcGxheSB0byB3aGljaCByZW5kZXJpbmcgaXMgZG9uZSAqLwotCSAgICB9IHgxMTsKLQl9IGluZm87Ci19IFNETF9TeXNXTWluZm87Ci0KLSNlbGlmIGRlZmluZWQoU0RMX1ZJREVPX0RSSVZFUl9OQU5PWCkKLSNpbmNsdWRlIDxtaWNyb3dpbi9uYW5vLVguaD4KLQotLyogVGhlIGdlbmVyaWMgY3VzdG9tIGV2ZW50IHN0cnVjdHVyZSAqLwotc3RydWN0IFNETF9TeXNXTW1zZyB7Ci0JU0RMX3ZlcnNpb24gdmVyc2lvbjsKLQlpbnQgZGF0YTsKLX07Ci0KLS8qIFRoZSB3aW5kb3dzIGN1c3RvbSB3aW5kb3cgbWFuYWdlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IFNETF9TeXNXTWluZm8gewotCVNETF92ZXJzaW9uIHZlcnNpb24gOwotCUdSX1dJTkRPV19JRCB3aW5kb3cgOwkvKiBUaGUgZGlzcGxheSB3aW5kb3cgKi8KLX0gU0RMX1N5c1dNaW5mbzsKLQotI2VsaWYgZGVmaW5lZChTRExfVklERU9fRFJJVkVSX1dJTkRJQikgfHwgZGVmaW5lZChTRExfVklERU9fRFJJVkVSX0REUkFXKSB8fCBkZWZpbmVkKFNETF9WSURFT19EUklWRVJfR0FQSSkKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLyogVGhlIHdpbmRvd3MgY3VzdG9tIGV2ZW50IHN0cnVjdHVyZSAqLwotc3RydWN0IFNETF9TeXNXTW1zZyB7Ci0JU0RMX3ZlcnNpb24gdmVyc2lvbjsKLQlIV05EIGh3bmQ7CQkJLyogVGhlIHdpbmRvdyBmb3IgdGhlIG1lc3NhZ2UgKi8KLQlVSU5UIG1zZzsJCQkvKiBUaGUgdHlwZSBvZiBtZXNzYWdlICovCi0JV1BBUkFNIHdQYXJhbTsJCQkvKiBXT1JEIG1lc3NhZ2UgcGFyYW1ldGVyICovCi0JTFBBUkFNIGxQYXJhbTsJCQkvKiBMT05HIG1lc3NhZ2UgcGFyYW1ldGVyICovCi19OwotCi0vKiBUaGUgd2luZG93cyBjdXN0b20gd2luZG93IG1hbmFnZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIHsKLQlTRExfdmVyc2lvbiB2ZXJzaW9uOwotCUhXTkQgd2luZG93OwkJCS8qIFRoZSBXaW4zMiBkaXNwbGF5IHdpbmRvdyAqLwotCUhHTFJDIGhnbHJjOwkJCS8qIFRoZSBPcGVuR0wgY29udGV4dCwgaWYgYW55ICovCi19IFNETF9TeXNXTWluZm87Ci0KLSNlbGlmIGRlZmluZWQoU0RMX1ZJREVPX0RSSVZFUl9SSVNDT1MpCi0KLS8qIFJJU0MgT1MgY3VzdG9tIGV2ZW50IHN0cnVjdHVyZSAqLwotc3RydWN0IFNETF9TeXNXTW1zZyB7Ci0JU0RMX3ZlcnNpb24gdmVyc2lvbjsKLQlpbnQgZXZlbnRDb2RlOwkJLyogVGhlIHdpbmRvdyBmb3IgdGhlIG1lc3NhZ2UgKi8KLQlpbnQgcG9sbEJsb2NrWzY0XTsKLX07Ci0KLS8qIFRoZSBSSVNDIE9TIGN1c3RvbSB3aW5kb3cgbWFuYWdlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IFNETF9TeXNXTWluZm8gewotCVNETF92ZXJzaW9uIHZlcnNpb247Ci0JaW50IHdpbXBWZXJzaW9uOyAgICAvKiBXaW1wIHZlcnNpb24gcnVubmluZyB1bmRlciAqLwotCWludCB0YXNrSGFuZGxlOyAgICAgLyogVGhlIFJJU0MgT1MgdGFzayBoYW5kbGUgKi8KLQlpbnQgd2luZG93OwkJLyogVGhlIFJJU0MgT1MgZGlzcGxheSB3aW5kb3cgKi8KLX0gU0RMX1N5c1dNaW5mbzsKLQotI2VsaWYgZGVmaW5lZChTRExfVklERU9fRFJJVkVSX1BIT1RPTikKLSNpbmNsdWRlIDxzeXMvbmV1dHJpbm8uaD4KLSNpbmNsdWRlIDxQaC5oPgotCi0vKiBUaGUgUU5YIGN1c3RvbSBldmVudCBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBTRExfU3lzV01tc2cgewotCVNETF92ZXJzaW9uIHZlcnNpb247Ci0JaW50IGRhdGE7Ci19OwotCi0vKiBUaGUgUU5YIGN1c3RvbSB3aW5kb3cgbWFuYWdlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IFNETF9TeXNXTWluZm8gewotCVNETF92ZXJzaW9uIHZlcnNpb247Ci0JaW50IGRhdGE7Ci19IFNETF9TeXNXTWluZm87Ci0KLSNlbGlmIGRlZmluZWQoU0RMX1ZJREVPX0RSSVZFUl9RVUFSVFopCi0KLXN0cnVjdCBTRExfU3lzV01tc2cgewotCVNETF92ZXJzaW9uIHZlcnNpb247Ci0JaW50IGRhdGE7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIHsKLSAgICAgICAgU0RMX3ZlcnNpb24gdmVyc2lvbjsKLSAgICAgICAgdm9pZCogbnNXaW5kb3dQdHI7Ci19IFNETF9TeXNXTWluZm87Ci0KLSNlbHNlCi0KLS8qIFRoZSBnZW5lcmljIGN1c3RvbSBldmVudCBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBTRExfU3lzV01tc2cgewotCVNETF92ZXJzaW9uIHZlcnNpb247Ci0JaW50IGRhdGE7Ci19OwotCi0vKiBUaGUgZ2VuZXJpYyBjdXN0b20gd2luZG93IG1hbmFnZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIHsKLQlTRExfdmVyc2lvbiB2ZXJzaW9uOwotCWludCBkYXRhOwotfSBTRExfU3lzV01pbmZvOwotCi0jZW5kaWYgLyogdmlkZW8gZHJpdmVyIHR5cGUgKi8KLQotI2VuZGlmIC8qIFNETF9QUk9UT1RZUEVTX09OTFkgKi8KLQotLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLwotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgeW91IGN1c3RvbSBob29rcyBpbnRvIHRoZSB3aW5kb3cgbWFuYWdlciBpbmZvcm1hdGlvbi4KLSAqIEl0IGZpbGxzIHRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSAnaW5mbycgd2l0aCBjdXN0b20gaW5mb3JtYXRpb24gYW5kCi0gKiByZXR1cm5zIDEgaWYgdGhlIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkLiAgSWYgaXQncyBub3QgaW1wbGVtZW50ZWQsIG9yCi0gKiB0aGUgdmVyc2lvbiBtZW1iZXIgb2YgdGhlICdpbmZvJyBzdHJ1Y3R1cmUgaXMgaW52YWxpZCwgaXQgcmV0dXJucyAwLiAKLSAqCi0gKiBZb3UgdHlwaWNhbGx5IHVzZSB0aGlzIGZ1bmN0aW9uIGxpa2UgdGhpczoKLSAqIFNETF9TeXNXTUluZm8gaW5mbzsKLSAqIFNETF9WRVJTSU9OKCZpbmZvLnZlcnNpb24pOwotICogaWYgKCBTRExfR2V0V01JbmZvKCZpbmZvKSApIHsgLi4uIH0KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9HZXRXTUluZm8oU0RMX1N5c1dNaW5mbyAqaW5mbyk7Ci0KLQotLyogRW5kcyBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKLQotI2VuZGlmIC8qIF9TRExfc3lzd21faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3RocmVhZC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3RocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDNlZTQ2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF90aHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0jaWZuZGVmIF9TRExfdGhyZWFkX2gKLSNkZWZpbmUgX1NETF90aHJlYWRfaAotCi0vKiBIZWFkZXIgZm9yIHRoZSBTREwgdGhyZWFkIG1hbmFnZW1lbnQgcm91dGluZXMgCi0KLQlUaGVzZSBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIG90aGVyIFNETCByb3V0aW5lcy4KLSovCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0KLS8qIFRocmVhZCBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyAqLwotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFRoZSBTREwgdGhyZWFkIHN0cnVjdHVyZSwgZGVmaW5lZCBpbiBTRExfdGhyZWFkLmMgKi8KLXN0cnVjdCBTRExfVGhyZWFkOwotdHlwZWRlZiBzdHJ1Y3QgU0RMX1RocmVhZCBTRExfVGhyZWFkOwotCi0vKiBDcmVhdGUgYSB0aHJlYWQgKi8KLSNpZiAoKGRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChIQVZFX0xJQkMpKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLS8qCi0gICBXZSBjb21waWxlIFNETCBpbnRvIGEgRExMIG9uIE9TLzIuIFRoaXMgbWVhbnMsIHRoYXQgaXQncyB0aGUgRExMIHdoaWNoCi0gICBjcmVhdGVzIGEgbmV3IHRocmVhZCBmb3IgdGhlIGNhbGxpbmcgcHJvY2VzcyB3aXRoIHRoZSBTRExfQ3JlYXRlVGhyZWFkKCkKLSAgIEFQSS4gVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhpcywgdGhhdCBvbmx5IHRoZSBSVEwgb2YgdGhlIFNETC5ETEwgd2lsbAotICAgYmUgaW5pdGlhbGl6ZWQgZm9yIHRob3NlIHRocmVhZHMsIGFuZCBub3QgdGhlIFJUTCBvZiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiEKLSAgIFRvIHNvbHZlIHRoaXMsIHdlIG1ha2UgYSBsaXR0bGUgaGFjayBoZXJlLgotICAgV2UnbGwgYWx3YXlzIHVzZSB0aGUgY2FsbGVyJ3MgX2JlZ2ludGhyZWFkKCkgYW5kIF9lbmR0aHJlYWQoKSBBUElzIHRvCi0gICBzdGFydCBhIG5ldyB0aHJlYWQuIFRoaXMgd2F5LCBpZiBpdCdzIHRoZSBTREwuRExMIHdoaWNoIHVzZXMgdGhpcyBBUEksCi0gICB0aGVuIHRoZSBSVEwgb2YgU0RMLkRMTCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBuZXcgdGhyZWFkLCBhbmQgaWYgaXQncwotICAgdGhlIGFwcGxpY2F0aW9uLCB0aGVuIHRoZSBSVEwgb2YgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgdXNlZC4KLSAgIFNvLCBpbiBzaG9ydDoKLSAgIEFsd2F5cyB1c2UgdGhlIF9iZWdpbnRocmVhZCgpIGFuZCBfZW5kdGhyZWFkKCkgb2YgdGhlIGNhbGxpbmcgcnVudGltZSBsaWJyYXJ5IQotKi8KLSNkZWZpbmUgU0RMX1BBU1NFRF9CRUdJTlRIUkVBRF9FTkRUSFJFQUQKLSNpZm5kZWYgX1dJTjMyX1dDRQotI2luY2x1ZGUgPHByb2Nlc3MuaD4gLyogVGhpcyBoYXMgX2JlZ2ludGhyZWFkKCkgYW5kIF9lbmR0aHJlYWQoKSBkZWZpbmVkISAqLwotI2VuZGlmCi0KLSNpZmRlZiBfX09TMl9fCi10eXBlZGVmIGludCAoKnBmblNETF9DdXJyZW50QmVnaW5UaHJlYWQpKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICosIHVuc2lnbmVkLCB2b2lkICphcmcpOyAKLXR5cGVkZWYgdm9pZCAoKnBmblNETF9DdXJyZW50RW5kVGhyZWFkKSh2b2lkKTsKLSNlbGlmIF9fR05VQ19fCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgKF9fY2RlY2wgKnBmblNETF9DdXJyZW50QmVnaW5UaHJlYWQpICh2b2lkICosIHVuc2lnbmVkLAotICAgICAgICB1bnNpZ25lZCAoX19zdGRjYWxsICpmdW5jKSh2b2lkICopLCB2b2lkICphcmcsIAotICAgICAgICB1bnNpZ25lZCwgdW5zaWduZWQgKnRocmVhZElEKTsKLXR5cGVkZWYgdm9pZCAoX19jZGVjbCAqcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQpKHVuc2lnbmVkIGNvZGUpOwotI2Vsc2UKLXR5cGVkZWYgdWludHB0cl90IChfX2NkZWNsICpwZm5TRExfQ3VycmVudEJlZ2luVGhyZWFkKSAodm9pZCAqLCB1bnNpZ25lZCwKLSAgICAgICAgdW5zaWduZWQgKF9fc3RkY2FsbCAqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnLCAKLSAgICAgICAgdW5zaWduZWQsIHVuc2lnbmVkICp0aHJlYWRJRCk7Ci10eXBlZGVmIHZvaWQgKF9fY2RlY2wgKnBmblNETF9DdXJyZW50RW5kVGhyZWFkKSh1bnNpZ25lZCBjb2RlKTsKLSNlbmRpZgotCi1leHRlcm4gREVDTFNQRUMgU0RMX1RocmVhZCAqIFNETENBTEwgU0RMX0NyZWF0ZVRocmVhZChpbnQgKFNETENBTEwgKmZuKSh2b2lkICopLCB2b2lkICpkYXRhLCBwZm5TRExfQ3VycmVudEJlZ2luVGhyZWFkIHBmbkJlZ2luVGhyZWFkLCBwZm5TRExfQ3VycmVudEVuZFRocmVhZCBwZm5FbmRUaHJlYWQpOwotCi0jaWZkZWYgX19PUzJfXwotI2RlZmluZSBTRExfQ3JlYXRlVGhyZWFkKGZuLCBkYXRhKSBTRExfQ3JlYXRlVGhyZWFkKGZuLCBkYXRhLCBfYmVnaW50aHJlYWQsIF9lbmR0aHJlYWQpCi0jZWxpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0jZGVmaW5lIFNETF9DcmVhdGVUaHJlYWQoZm4sIGRhdGEpIFNETF9DcmVhdGVUaHJlYWQoZm4sIGRhdGEsIE5VTEwsIE5VTEwpCi0jZWxzZQotI2RlZmluZSBTRExfQ3JlYXRlVGhyZWFkKGZuLCBkYXRhKSBTRExfQ3JlYXRlVGhyZWFkKGZuLCBkYXRhLCBfYmVnaW50aHJlYWRleCwgX2VuZHRocmVhZGV4KQotI2VuZGlmCi0jZWxzZQotZXh0ZXJuIERFQ0xTUEVDIFNETF9UaHJlYWQgKiBTRExDQUxMIFNETF9DcmVhdGVUaHJlYWQoaW50IChTRExDQUxMICpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSk7Ci0jZW5kaWYKLQotLyogR2V0IHRoZSAzMi1iaXQgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZCAqLwotZXh0ZXJuIERFQ0xTUEVDIFVpbnQzMiBTRExDQUxMIFNETF9UaHJlYWRJRCh2b2lkKTsKLQotLyogR2V0IHRoZSAzMi1iaXQgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRoZSBzcGVjaWZpZWQgdGhyZWFkLAotICAgZXF1aXZhbGVudCB0byBTRExfVGhyZWFkSUQoKSBpZiB0aGUgc3BlY2lmaWVkIHRocmVhZCBpcyBOVUxMLgotICovCi1leHRlcm4gREVDTFNQRUMgVWludDMyIFNETENBTEwgU0RMX0dldFRocmVhZElEKFNETF9UaHJlYWQgKnRocmVhZCk7Ci0KLS8qIFdhaXQgZm9yIGEgdGhyZWFkIHRvIGZpbmlzaC4KLSAgIFRoZSByZXR1cm4gY29kZSBmb3IgdGhlIHRocmVhZCBmdW5jdGlvbiBpcyBwbGFjZWQgaW4gdGhlIGFyZWEKLSAgIHBvaW50ZWQgdG8gYnkgJ3N0YXR1cycsIGlmICdzdGF0dXMnIGlzIG5vdCBOVUxMLgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgaW50ICpzdGF0dXMpOwotCi0vKiBGb3JjZWZ1bGx5IGtpbGwgYSB0aHJlYWQgd2l0aG91dCB3b3JyeWluZyBhYm91dCBpdHMgc3RhdGUgKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKTsKLQotCi0vKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaW5jbHVkZSAiY2xvc2VfY29kZS5oIgotCi0jZW5kaWYgLyogX1NETF90aHJlYWRfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3RpbWVyLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfdGltZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxMTU5Zi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfdGltZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0jaWZuZGVmIF9TRExfdGltZXJfaAotI2RlZmluZSBfU0RMX3RpbWVyX2gKLQotLyogSGVhZGVyIGZvciB0aGUgU0RMIHRpbWUgbWFuYWdlbWVudCByb3V0aW5lcyAqLwotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotCi0jaW5jbHVkZSAiYmVnaW5fY29kZS5oIgotLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIE9TIHNjaGVkdWxlciB0aW1lc2xpY2UsIGluIG1pbGxpc2Vjb25kcyAqLwotI2RlZmluZSBTRExfVElNRVNMSUNFCQkxMAotCi0vKiBUaGlzIGlzIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gb2YgdGhlIFNETCB0aW1lciBvbiBhbGwgcGxhdGZvcm1zICovCi0jZGVmaW5lIFRJTUVSX1JFU09MVVRJT04JMTAJLyogRXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lZCAqLwotCi0vKiBHZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIFNETCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLgotICogTm90ZSB0aGF0IHRoaXMgdmFsdWUgd3JhcHMgaWYgdGhlIHByb2dyYW0gcnVucyBmb3IgbW9yZSB0aGFuIH40OSBkYXlzLgotICovIAotZXh0ZXJuIERFQ0xTUEVDIFVpbnQzMiBTRExDQUxMIFNETF9HZXRUaWNrcyh2b2lkKTsKLQotLyogV2FpdCBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSByZXR1cm5pbmcgKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0RlbGF5KFVpbnQzMiBtcyk7Ci0KLS8qIEZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgdGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uICovCi10eXBlZGVmIFVpbnQzMiAoU0RMQ0FMTCAqU0RMX1RpbWVyQ2FsbGJhY2spKFVpbnQzMiBpbnRlcnZhbCk7Ci0KLS8qIFNldCBhIGNhbGxiYWNrIHRvIHJ1biBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGFzCi0gKiBlbGFwc2VkLiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBjdXJyZW50IHRpbWVyIGludGVydmFsCi0gKiBhbmQgcmV0dXJucyB0aGUgbmV4dCB0aW1lciBpbnRlcnZhbC4gIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgCi0gKiBzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIGluLCB0aGUgcGVyaW9kaWMgYWxhcm0gY29udGludWVzLCBvdGhlcndpc2UgYQotICogbmV3IGFsYXJtIGlzIHNjaGVkdWxlZC4gIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIDAsIHRoZSBwZXJpb2RpYyBhbGFybQotICogaXMgY2FuY2VsbGVkLgotICoKLSAqIFRvIGNhbmNlbCBhIGN1cnJlbnRseSBydW5uaW5nIHRpbWVyLCBjYWxsIFNETF9TZXRUaW1lcigwLCBOVUxMKTsKLSAqCi0gKiBUaGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gbWF5IHJ1biBpbiBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB5b3VyCi0gKiBtYWluIGNvZGUsIGFuZCBzbyBzaG91bGRuJ3QgY2FsbCBhbnkgZnVuY3Rpb25zIGZyb20gd2l0aGluIGl0c2VsZi4KLSAqCi0gKiBUaGUgbWF4aW11bSByZXNvbHV0aW9uIG9mIHRoaXMgdGltZXIgaXMgMTAgbXMsIHdoaWNoIG1lYW5zIHRoYXQgaWYKLSAqIHlvdSByZXF1ZXN0IGEgMTYgbXMgdGltZXIsIHlvdXIgY2FsbGJhY2sgd2lsbCBydW4gYXBwcm94aW1hdGVseSAyMCBtcwotICogbGF0ZXIgb24gYW4gdW5sb2FkZWQgc3lzdGVtLiAgSWYgeW91IHdhbnRlZCB0byBzZXQgYSBmbGFnIHNpZ25hbGluZwotICogYSBmcmFtZSB1cGRhdGUgYXQgMzAgZnJhbWVzIHBlciBzZWNvbmQgKGV2ZXJ5IDMzIG1zKSwgeW91IG1pZ2h0IHNldCBhIAotICogdGltZXIgZm9yIDMwIG1zOgotICogICBTRExfU2V0VGltZXIoKDMzLzEwKSoxMCwgZmxhZ191cGRhdGUpOwotICoKLSAqIElmIHlvdSB1c2UgdGhpcyBmdW5jdGlvbiwgeW91IG5lZWQgdG8gcGFzcyBTRExfSU5JVF9USU1FUiB0byBTRExfSW5pdCgpLgotICoKLSAqIFVuZGVyIFVOSVgsIHlvdSBzaG91bGQgbm90IHVzZSByYWlzZSBvciB1c2UgU0lHQUxSTSBhbmQgdGhpcyBmdW5jdGlvbgotICogaW4gdGhlIHNhbWUgcHJvZ3JhbSwgYXMgaXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgc2V0aXRpbWVyKCkuICBZb3UgYWxzbwotICogc2hvdWxkIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiBpbiBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMgYXMgc2lnbmFscwotICogdG8gbXVsdGktdGhyZWFkZWQgYXBwcyBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciBpbiBzb21lIGltcGxlbWVudGF0aW9ucy4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfU2V0VGltZXIoVWludDMyIGludGVydmFsLCBTRExfVGltZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0KLS8qIE5ldyB0aW1lciBBUEksIHN1cHBvcnRzIG11bHRpcGxlIHRpbWVycwotICogV3JpdHRlbiBieSBTdGVwaGFuZSBQZXRlciA8bWVnYXN0ZXBAbG9raWdhbWVzLmNvbT4KLSAqLwotCi0vKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIHRoZSBuZXcgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBjdXJyZW50IHRpbWVyIGludGVydmFsIGFuZCByZXR1cm5zCi0gKiB0aGUgbmV4dCB0aW1lciBpbnRlcnZhbC4gIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lCi0gKiBwYXNzZWQgaW4sIHRoZSBwZXJpb2RpYyBhbGFybSBjb250aW51ZXMsIG90aGVyd2lzZSBhIG5ldyBhbGFybSBpcwotICogc2NoZWR1bGVkLiAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgMCwgdGhlIHBlcmlvZGljIGFsYXJtIGlzIGNhbmNlbGxlZC4KLSAqLwotdHlwZWRlZiBVaW50MzIgKFNETENBTEwgKlNETF9OZXdUaW1lckNhbGxiYWNrKShVaW50MzIgaW50ZXJ2YWwsIHZvaWQgKnBhcmFtKTsKLQotLyogRGVmaW5pdGlvbiBvZiB0aGUgdGltZXIgSUQgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NETF9UaW1lcklEICpTRExfVGltZXJJRDsKLQotLyogQWRkIGEgbmV3IHRpbWVyIHRvIHRoZSBwb29sIG9mIHRpbWVycyBhbHJlYWR5IHJ1bm5pbmcuCi0gICBSZXR1cm5zIGEgdGltZXIgSUQsIG9yIE5VTEwgd2hlbiBhbiBlcnJvciBvY2N1cnMuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBTRExfVGltZXJJRCBTRExDQUxMIFNETF9BZGRUaW1lcihVaW50MzIgaW50ZXJ2YWwsIFNETF9OZXdUaW1lckNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwYXJhbSk7Ci0KLS8qIFJlbW92ZSBvbmUgb2YgdGhlIG11bHRpcGxlIHRpbWVycyBrbm93aW5nIGl0cyBJRC4KLSAqIFJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgc3VjY2Vzcy4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFNETF9ib29sIFNETENBTEwgU0RMX1JlbW92ZVRpbWVyKFNETF9UaW1lcklEIHQpOwotCi0vKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaW5jbHVkZSAiY2xvc2VfY29kZS5oIgotCi0jZW5kaWYgLyogX1NETF90aW1lcl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfdHlwZXMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTNiOWNlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyogREVQUkVDQVRFRCAqLwotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF92ZXJzaW9uLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvaW5jbHVkZS9TRExfdmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTBmZmU2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF92ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBjdXJyZW50IFNETCB2ZXJzaW9uICovCi0KLSNpZm5kZWYgX1NETF92ZXJzaW9uX2gKLSNkZWZpbmUgX1NETF92ZXJzaW9uX2gKLQotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLQotI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKLS8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBQcmludGFibGUgZm9ybWF0OiAiJWQuJWQuJWQiLCBNQUpPUiwgTUlOT1IsIFBBVENITEVWRUwKLSovCi0jZGVmaW5lIFNETF9NQUpPUl9WRVJTSU9OCTEKLSNkZWZpbmUgU0RMX01JTk9SX1ZFUlNJT04JMgotI2RlZmluZSBTRExfUEFUQ0hMRVZFTAkJMTIKLQotdHlwZWRlZiBzdHJ1Y3QgU0RMX3ZlcnNpb24gewotCVVpbnQ4IG1ham9yOwotCVVpbnQ4IG1pbm9yOwotCVVpbnQ4IHBhdGNoOwotfSBTRExfdmVyc2lvbjsKLQotLyogVGhpcyBtYWNybyBjYW4gYmUgdXNlZCB0byBmaWxsIGEgdmVyc2lvbiBzdHJ1Y3R1cmUgd2l0aCB0aGUgY29tcGlsZS10aW1lCi0gKiB2ZXJzaW9uIG9mIHRoZSBTREwgbGlicmFyeS4KLSAqLwotI2RlZmluZSBTRExfVkVSU0lPTihYKQkJCQkJCQlcCi17CQkJCQkJCQkJXAotCShYKS0+bWFqb3IgPSBTRExfTUFKT1JfVkVSU0lPTjsJCQkJCVwKLQkoWCktPm1pbm9yID0gU0RMX01JTk9SX1ZFUlNJT047CQkJCQlcCi0JKFgpLT5wYXRjaCA9IFNETF9QQVRDSExFVkVMOwkJCQkJXAotfQotCi0vKiBUaGlzIG1hY3JvIHR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlcnMgaW50byBhIG51bWVyaWMgdmFsdWU6Ci0gICAoMSwyLDMpIC0+ICgxMjAzKQotICAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlcmUgd2lsbCBuZXZlciBiZSBtb3JlIHRoYW4gMTAwIHBhdGNobGV2ZWxzCi0qLwotI2RlZmluZSBTRExfVkVSU0lPTk5VTShYLCBZLCBaKQkJCQkJCVwKLQkoKFgpKjEwMDAgKyAoWSkqMTAwICsgKFopKQotCi0vKiBUaGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBtYWNybyBmb3IgdGhlIGN1cnJlbnQgU0RMIHZlcnNpb24gKi8KLSNkZWZpbmUgU0RMX0NPTVBJTEVEVkVSU0lPTiBcCi0JU0RMX1ZFUlNJT05OVU0oU0RMX01BSk9SX1ZFUlNJT04sIFNETF9NSU5PUl9WRVJTSU9OLCBTRExfUEFUQ0hMRVZFTCkKLQotLyogVGhpcyBtYWNybyB3aWxsIGV2YWx1YXRlIHRvIHRydWUgaWYgY29tcGlsZWQgd2l0aCBTREwgYXQgbGVhc3QgWC5ZLlogKi8KLSNkZWZpbmUgU0RMX1ZFUlNJT05fQVRMRUFTVChYLCBZLCBaKSBcCi0JKFNETF9DT01QSUxFRFZFUlNJT04gPj0gU0RMX1ZFUlNJT05OVU0oWCwgWSwgWikpCi0KLS8qIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgdmVyc2lvbiBvZiB0aGUgZHluYW1pY2FsbHkgbGlua2VkIFNETCBsaWJyYXJ5LgotICAgaXQgc2hvdWxkIE5PVCBiZSB1c2VkIHRvIGZpbGwgYSB2ZXJzaW9uIHN0cnVjdHVyZSwgaW5zdGVhZCB5b3Ugc2hvdWxkCi0gICB1c2UgdGhlIFNETF9WZXJzaW9uKCkgbWFjcm8uCi0gKi8KLWV4dGVybiBERUNMU1BFQyBjb25zdCBTRExfdmVyc2lvbiAqIFNETENBTEwgU0RMX0xpbmtlZF9WZXJzaW9uKHZvaWQpOwotCi0vKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaW5jbHVkZSAiY2xvc2VfY29kZS5oIgotCi0jZW5kaWYgLyogX1NETF92ZXJzaW9uX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF92aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3ZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YmRjMzQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX3ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyogSGVhZGVyIGZpbGUgZm9yIGFjY2VzcyB0byB0aGUgU0RMIHJhdyBmcmFtZWJ1ZmZlciB3aW5kb3cgKi8KLQotI2lmbmRlZiBfU0RMX3ZpZGVvX2gKLSNkZWZpbmUgX1NETF92aWRlb19oCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0jaW5jbHVkZSAiU0RMX3J3b3BzLmgiCi0KLSNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCi0vKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogVHJhbnNwYXJlbmN5IGRlZmluaXRpb25zOiBUaGVzZSBkZWZpbmUgYWxwaGEgYXMgdGhlIG9wYWNpdHkgb2YgYSBzdXJmYWNlICovCi0jZGVmaW5lIFNETF9BTFBIQV9PUEFRVUUgMjU1Ci0jZGVmaW5lIFNETF9BTFBIQV9UUkFOU1BBUkVOVCAwCi0KLS8qIFVzZWZ1bCBkYXRhIHR5cGVzICovCi10eXBlZGVmIHN0cnVjdCBTRExfUmVjdCB7Ci0JU2ludDE2IHgsIHk7Ci0JVWludDE2IHcsIGg7Ci19IFNETF9SZWN0OwotCi10eXBlZGVmIHN0cnVjdCBTRExfQ29sb3IgewotCVVpbnQ4IHI7Ci0JVWludDggZzsKLQlVaW50OCBiOwotCVVpbnQ4IHVudXNlZDsKLX0gU0RMX0NvbG9yOwotI2RlZmluZSBTRExfQ29sb3VyIFNETF9Db2xvcgotCi10eXBlZGVmIHN0cnVjdCBTRExfUGFsZXR0ZSB7Ci0JaW50ICAgICAgIG5jb2xvcnM7Ci0JU0RMX0NvbG9yICpjb2xvcnM7Ci19IFNETF9QYWxldHRlOwotCi0vKiBFdmVyeXRoaW5nIGluIHRoZSBwaXhlbCBmb3JtYXQgc3RydWN0dXJlIGlzIHJlYWQtb25seSAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX1BpeGVsRm9ybWF0IHsKLQlTRExfUGFsZXR0ZSAqcGFsZXR0ZTsKLQlVaW50OCAgQml0c1BlclBpeGVsOwotCVVpbnQ4ICBCeXRlc1BlclBpeGVsOwotCVVpbnQ4ICBSbG9zczsKLQlVaW50OCAgR2xvc3M7Ci0JVWludDggIEJsb3NzOwotCVVpbnQ4ICBBbG9zczsKLQlVaW50OCAgUnNoaWZ0OwotCVVpbnQ4ICBHc2hpZnQ7Ci0JVWludDggIEJzaGlmdDsKLQlVaW50OCAgQXNoaWZ0OwotCVVpbnQzMiBSbWFzazsKLQlVaW50MzIgR21hc2s7Ci0JVWludDMyIEJtYXNrOwotCVVpbnQzMiBBbWFzazsKLQotCS8qIFJHQiBjb2xvciBrZXkgaW5mb3JtYXRpb24gKi8KLQlVaW50MzIgY29sb3JrZXk7Ci0JLyogQWxwaGEgdmFsdWUgaW5mb3JtYXRpb24gKHBlci1zdXJmYWNlIGFscGhhKSAqLwotCVVpbnQ4ICBhbHBoYTsKLX0gU0RMX1BpeGVsRm9ybWF0OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgdHJlYXRlZCBhcyByZWFkLW9ubHksIGV4Y2VwdCBmb3IgJ3BpeGVscycsCi0gICB3aGljaCwgaWYgbm90IE5VTEwsIGNvbnRhaW5zIHRoZSByYXcgcGl4ZWwgZGF0YSBmb3IgdGhlIHN1cmZhY2UuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX1N1cmZhY2UgewotCVVpbnQzMiBmbGFnczsJCQkJLyogUmVhZC1vbmx5ICovCi0JU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQ7CQkvKiBSZWFkLW9ubHkgKi8KLQlpbnQgdywgaDsJCQkJLyogUmVhZC1vbmx5ICovCi0JVWludDE2IHBpdGNoOwkJCQkvKiBSZWFkLW9ubHkgKi8KLQl2b2lkICpwaXhlbHM7CQkJCS8qIFJlYWQtd3JpdGUgKi8KLQlpbnQgb2Zmc2V0OwkJCQkvKiBQcml2YXRlICovCi0KLQkvKiBIYXJkd2FyZS1zcGVjaWZpYyBzdXJmYWNlIGluZm8gKi8KLQlzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgKmh3ZGF0YTsKLQotCS8qIGNsaXBwaW5nIGluZm9ybWF0aW9uICovCi0JU0RMX1JlY3QgY2xpcF9yZWN0OwkJCS8qIFJlYWQtb25seSAqLwotCVVpbnQzMiB1bnVzZWQxOwkJCQkvKiBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KLQotCS8qIEFsbG93IHJlY3Vyc2l2ZSBsb2NrcyAqLwotCVVpbnQzMiBsb2NrZWQ7CQkJCS8qIFByaXZhdGUgKi8KLQotCS8qIGluZm8gZm9yIGZhc3QgYmxpdCBtYXBwaW5nIHRvIG90aGVyIHN1cmZhY2VzICovCi0Jc3RydWN0IFNETF9CbGl0TWFwICptYXA7CQkvKiBQcml2YXRlICovCi0KLQkvKiBmb3JtYXQgdmVyc2lvbiwgYnVtcGVkIGF0IGV2ZXJ5IGNoYW5nZSB0byBpbnZhbGlkYXRlIGJsaXQgbWFwcyAqLwotCXVuc2lnbmVkIGludCBmb3JtYXRfdmVyc2lvbjsJCS8qIFByaXZhdGUgKi8KLQotCS8qIFJlZmVyZW5jZSBjb3VudCAtLSB1c2VkIHdoZW4gZnJlZWluZyBzdXJmYWNlICovCi0JaW50IHJlZmNvdW50OwkJCQkvKiBSZWFkLW1vc3RseSAqLwotfSBTRExfU3VyZmFjZTsKLQotLyogVGhlc2UgYXJlIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGZsYWdzIGZvciB0aGUgU0RMX3N1cmZhY2UgKi8KLS8qIEF2YWlsYWJsZSBmb3IgU0RMX0NyZWF0ZVJHQlN1cmZhY2UoKSBvciBTRExfU2V0VmlkZW9Nb2RlKCkgKi8KLSNkZWZpbmUgU0RMX1NXU1VSRkFDRQkweDAwMDAwMDAwCS8qIFN1cmZhY2UgaXMgaW4gc3lzdGVtIG1lbW9yeSAqLwotI2RlZmluZSBTRExfSFdTVVJGQUNFCTB4MDAwMDAwMDEJLyogU3VyZmFjZSBpcyBpbiB2aWRlbyBtZW1vcnkgKi8KLSNkZWZpbmUgU0RMX0FTWU5DQkxJVAkweDAwMDAwMDA0CS8qIFVzZSBhc3luY2hyb25vdXMgYmxpdHMgaWYgcG9zc2libGUgKi8KLS8qIEF2YWlsYWJsZSBmb3IgU0RMX1NldFZpZGVvTW9kZSgpICovCi0jZGVmaW5lIFNETF9BTllGT1JNQVQJMHgxMDAwMDAwMAkvKiBBbGxvdyBhbnkgdmlkZW8gZGVwdGgvcGl4ZWwtZm9ybWF0ICovCi0jZGVmaW5lIFNETF9IV1BBTEVUVEUJMHgyMDAwMDAwMAkvKiBTdXJmYWNlIGhhcyBleGNsdXNpdmUgcGFsZXR0ZSAqLwotI2RlZmluZSBTRExfRE9VQkxFQlVGCTB4NDAwMDAwMDAJLyogU2V0IHVwIGRvdWJsZS1idWZmZXJlZCB2aWRlbyBtb2RlICovCi0jZGVmaW5lIFNETF9GVUxMU0NSRUVOCTB4ODAwMDAwMDAJLyogU3VyZmFjZSBpcyBhIGZ1bGwgc2NyZWVuIGRpc3BsYXkgKi8KLSNkZWZpbmUgU0RMX09QRU5HTCAgICAgIDB4MDAwMDAwMDIgICAgICAvKiBDcmVhdGUgYW4gT3BlbkdMIHJlbmRlcmluZyBjb250ZXh0ICovCi0jZGVmaW5lIFNETF9PUEVOR0xCTElUCTB4MDAwMDAwMEEJLyogQ3JlYXRlIGFuIE9wZW5HTCByZW5kZXJpbmcgY29udGV4dCBhbmQgdXNlIGl0IGZvciBibGl0dGluZyAqLwotI2RlZmluZSBTRExfUkVTSVpBQkxFCTB4MDAwMDAwMTAJLyogVGhpcyB2aWRlbyBtb2RlIG1heSBiZSByZXNpemVkICovCi0jZGVmaW5lIFNETF9OT0ZSQU1FCTB4MDAwMDAwMjAJLyogTm8gd2luZG93IGNhcHRpb24gb3IgZWRnZSBmcmFtZSAqLwotLyogVXNlZCBpbnRlcm5hbGx5IChyZWFkLW9ubHkpICovCi0jZGVmaW5lIFNETF9IV0FDQ0VMCTB4MDAwMDAxMDAJLyogQmxpdCB1c2VzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiAqLwotI2RlZmluZSBTRExfU1JDQ09MT1JLRVkJMHgwMDAwMTAwMAkvKiBCbGl0IHVzZXMgYSBzb3VyY2UgY29sb3Iga2V5ICovCi0jZGVmaW5lIFNETF9STEVBQ0NFTE9LCTB4MDAwMDIwMDAJLyogUHJpdmF0ZSBmbGFnICovCi0jZGVmaW5lIFNETF9STEVBQ0NFTAkweDAwMDA0MDAwCS8qIFN1cmZhY2UgaXMgUkxFIGVuY29kZWQgKi8KLSNkZWZpbmUgU0RMX1NSQ0FMUEhBCTB4MDAwMTAwMDAJLyogQmxpdCB1c2VzIHNvdXJjZSBhbHBoYSBibGVuZGluZyAqLwotI2RlZmluZSBTRExfUFJFQUxMT0MJMHgwMTAwMDAwMAkvKiBTdXJmYWNlIHVzZXMgcHJlYWxsb2NhdGVkIG1lbW9yeSAqLwotCi0vKiBFdmFsdWF0ZXMgdG8gdHJ1ZSBpZiB0aGUgc3VyZmFjZSBuZWVkcyB0byBiZSBsb2NrZWQgYmVmb3JlIGFjY2VzcyAqLwotI2RlZmluZSBTRExfTVVTVExPQ0soc3VyZmFjZSkJXAotICAoc3VyZmFjZS0+b2Zmc2V0IHx8CQlcCi0gICgoc3VyZmFjZS0+ZmxhZ3MgJiAoU0RMX0hXU1VSRkFDRXxTRExfQVNZTkNCTElUfFNETF9STEVBQ0NFTCkpICE9IDApKQotCi0vKiB0eXBlZGVmIGZvciBwcml2YXRlIHN1cmZhY2UgYmxpdHRpbmcgZnVuY3Rpb25zICovCi10eXBlZGVmIGludCAoKlNETF9ibGl0KShzdHJ1Y3QgU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCi0JCQlzdHJ1Y3QgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpOwotCi0KLS8qIFVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHZpZGVvIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX1ZpZGVvSW5mbyB7Ci0JVWludDMyIGh3X2F2YWlsYWJsZSA6MTsJLyogRmxhZzogQ2FuIHlvdSBjcmVhdGUgaGFyZHdhcmUgc3VyZmFjZXM/ICovCi0JVWludDMyIHdtX2F2YWlsYWJsZSA6MTsJLyogRmxhZzogQ2FuIHlvdSB0YWxrIHRvIGEgd2luZG93IG1hbmFnZXI/ICovCi0JVWludDMyIFVudXNlZEJpdHMxICA6NjsKLQlVaW50MzIgVW51c2VkQml0czIgIDoxOwotCVVpbnQzMiBibGl0X2h3ICAgICAgOjE7CS8qIEZsYWc6IEFjY2VsZXJhdGVkIGJsaXRzIEhXIC0tPiBIVyAqLwotCVVpbnQzMiBibGl0X2h3X0NDICAgOjE7CS8qIEZsYWc6IEFjY2VsZXJhdGVkIGJsaXRzIHdpdGggQ29sb3JrZXkgKi8KLQlVaW50MzIgYmxpdF9od19BICAgIDoxOwkvKiBGbGFnOiBBY2NlbGVyYXRlZCBibGl0cyB3aXRoIEFscGhhICovCi0JVWludDMyIGJsaXRfc3cgICAgICA6MTsJLyogRmxhZzogQWNjZWxlcmF0ZWQgYmxpdHMgU1cgLS0+IEhXICovCi0JVWludDMyIGJsaXRfc3dfQ0MgICA6MTsJLyogRmxhZzogQWNjZWxlcmF0ZWQgYmxpdHMgd2l0aCBDb2xvcmtleSAqLwotCVVpbnQzMiBibGl0X3N3X0EgICAgOjE7CS8qIEZsYWc6IEFjY2VsZXJhdGVkIGJsaXRzIHdpdGggQWxwaGEgKi8KLQlVaW50MzIgYmxpdF9maWxsICAgIDoxOwkvKiBGbGFnOiBBY2NlbGVyYXRlZCBjb2xvciBmaWxsICovCi0JVWludDMyIFVudXNlZEJpdHMzICA6MTY7Ci0JVWludDMyIHZpZGVvX21lbTsJLyogVGhlIHRvdGFsIGFtb3VudCBvZiB2aWRlbyBtZW1vcnkgKGluIEspICovCi0JU0RMX1BpeGVsRm9ybWF0ICp2Zm10OwkvKiBWYWx1ZTogVGhlIGZvcm1hdCBvZiB0aGUgdmlkZW8gc3VyZmFjZSAqLwotCWludCAgICBjdXJyZW50X3c7CS8qIFZhbHVlOiBUaGUgY3VycmVudCB2aWRlbyBtb2RlIHdpZHRoICovCi0JaW50ICAgIGN1cnJlbnRfaDsJLyogVmFsdWU6IFRoZSBjdXJyZW50IHZpZGVvIG1vZGUgaGVpZ2h0ICovCi19IFNETF9WaWRlb0luZm87Ci0KLQotLyogVGhlIG1vc3QgY29tbW9uIHZpZGVvIG92ZXJsYXkgZm9ybWF0cy4KLSAgIEZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGVzZSBwaXhlbCBmb3JtYXRzLCBzZWU6Ci0JaHR0cDovL3d3dy53ZWJhcnR6LmNvbS9mb3VyY2MvaW5kZXh5dXYuaHRtCi0KLSAgIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY29sb3Igc3BhY2VzLCBzZWU6Ci0gICBodHRwOi8vd3d3Lm5ldXJvLnNmYy5rZWlvLmFjLmpwL35hbHkvcG9seWdvbi9pbmZvL2NvbG9yLXNwYWNlLWZhcS5odG1sCi0gKi8KLSNkZWZpbmUgU0RMX1lWMTJfT1ZFUkxBWSAgMHgzMjMxNTY1OQkvKiBQbGFuYXIgbW9kZTogWSArIFYgKyBVICAoMyBwbGFuZXMpICovCi0jZGVmaW5lIFNETF9JWVVWX09WRVJMQVkgIDB4NTY1NTU5NDkJLyogUGxhbmFyIG1vZGU6IFkgKyBVICsgViAgKDMgcGxhbmVzKSAqLwotI2RlZmluZSBTRExfWVVZMl9PVkVSTEFZICAweDMyNTk1NTU5CS8qIFBhY2tlZCBtb2RlOiBZMCtVMCtZMStWMCAoMSBwbGFuZSkgKi8KLSNkZWZpbmUgU0RMX1VZVllfT1ZFUkxBWSAgMHg1OTU2NTk1NQkvKiBQYWNrZWQgbW9kZTogVTArWTArVjArWTEgKDEgcGxhbmUpICovCi0jZGVmaW5lIFNETF9ZVllVX09WRVJMQVkgIDB4NTU1OTU2NTkJLyogUGFja2VkIG1vZGU6IFkwK1YwK1kxK1UwICgxIHBsYW5lKSAqLwotCi0vKiBUaGUgWVVWIGhhcmR3YXJlIHZpZGVvIG92ZXJsYXkgKi8KLXR5cGVkZWYgc3RydWN0IFNETF9PdmVybGF5IHsKLQlVaW50MzIgZm9ybWF0OwkJCQkvKiBSZWFkLW9ubHkgKi8KLQlpbnQgdywgaDsJCQkJLyogUmVhZC1vbmx5ICovCi0JaW50IHBsYW5lczsJCQkJLyogUmVhZC1vbmx5ICovCi0JVWludDE2ICpwaXRjaGVzOwkJCS8qIFJlYWQtb25seSAqLwotCVVpbnQ4ICoqcGl4ZWxzOwkJCQkvKiBSZWFkLXdyaXRlICovCi0KLQkvKiBIYXJkd2FyZS1zcGVjaWZpYyBzdXJmYWNlIGluZm8gKi8KLQlzdHJ1Y3QgcHJpdmF0ZV95dXZod2Z1bmNzICpod2Z1bmNzOwotCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhOwotCi0JLyogU3BlY2lhbCBmbGFncyAqLwotCVVpbnQzMiBod19vdmVybGF5IDoxOwkvKiBGbGFnOiBUaGlzIG92ZXJsYXkgaGFyZHdhcmUgYWNjZWxlcmF0ZWQ/ICovCi0JVWludDMyIFVudXNlZEJpdHMgOjMxOwotfSBTRExfT3ZlcmxheTsKLQotCi0vKiBQdWJsaWMgZW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIE9wZW5HTCB3aW5kb3cgYXR0cmlidXRlcy4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgU0RMX0dMX1JFRF9TSVpFLAotICAgIFNETF9HTF9HUkVFTl9TSVpFLAotICAgIFNETF9HTF9CTFVFX1NJWkUsCi0gICAgU0RMX0dMX0FMUEhBX1NJWkUsCi0gICAgU0RMX0dMX0JVRkZFUl9TSVpFLAotICAgIFNETF9HTF9ET1VCTEVCVUZGRVIsCi0gICAgU0RMX0dMX0RFUFRIX1NJWkUsCi0gICAgU0RMX0dMX1NURU5DSUxfU0laRSwKLSAgICBTRExfR0xfQUNDVU1fUkVEX1NJWkUsCi0gICAgU0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkUsCi0gICAgU0RMX0dMX0FDQ1VNX0JMVUVfU0laRSwKLSAgICBTRExfR0xfQUNDVU1fQUxQSEFfU0laRSwKLSAgICBTRExfR0xfU1RFUkVPLAotICAgIFNETF9HTF9NVUxUSVNBTVBMRUJVRkZFUlMsCi0gICAgU0RMX0dMX01VTFRJU0FNUExFU0FNUExFUywKLSAgICBTRExfR0xfQUNDRUxFUkFURURfVklTVUFMLAotICAgIFNETF9HTF9TV0FQX0NPTlRST0wKLX0gU0RMX0dMYXR0cjsKLQotLyogZmxhZ3MgZm9yIFNETF9TZXRQYWxldHRlKCkgKi8KLSNkZWZpbmUgU0RMX0xPR1BBTCAweDAxCi0jZGVmaW5lIFNETF9QSFlTUEFMIDB4MDIKLQotLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgaW50ZXJuYWxseSwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgeW91Ci0gKiBoYXZlIGEgc3BlY2lmaWMgbmVlZCB0byBzcGVjaWZ5IHRoZSB2aWRlbyBkcml2ZXIgeW91IHdhbnQgdG8gdXNlLgotICogWW91IHNob3VsZCBub3JtYWxseSB1c2UgU0RMX0luaXQoKSBvciBTRExfSW5pdFN1YlN5c3RlbSgpLgotICoKLSAqIFNETF9WaWRlb0luaXQoKSBpbml0aWFsaXplcyB0aGUgdmlkZW8gc3Vic3lzdGVtIC0tIHNldHMgdXAgYSBjb25uZWN0aW9uCi0gKiB0byB0aGUgd2luZG93IG1hbmFnZXIsIGV0YywgYW5kIGRldGVybWluZXMgdGhlIGN1cnJlbnQgdmlkZW8gbW9kZSBhbmQKLSAqIHBpeGVsIGZvcm1hdCwgYnV0IGRvZXMgbm90IGluaXRpYWxpemUgYSB3aW5kb3cgb3IgZ3JhcGhpY3MgbW9kZS4KLSAqIE5vdGUgdGhhdCBldmVudCBoYW5kbGluZyBpcyBhY3RpdmF0ZWQgYnkgdGhpcyByb3V0aW5lLgotICoKLSAqIElmIHlvdSB1c2UgYm90aCBzb3VuZCBhbmQgdmlkZW8gaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IG5lZWQgdG8gY2FsbAotICogU0RMX0luaXQoKSBiZWZvcmUgb3BlbmluZyB0aGUgc291bmQgZGV2aWNlLCBvdGhlcndpc2UgdW5kZXIgV2luMzIgRGlyZWN0WCwKLSAqIHlvdSB3b24ndCBiZSBhYmxlIHRvIHNldCBmdWxsLXNjcmVlbiBkaXNwbGF5IG1vZGVzLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1ZpZGVvSW5pdChjb25zdCBjaGFyICpkcml2ZXJfbmFtZSwgVWludDMyIGZsYWdzKTsKLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1ZpZGVvUXVpdCh2b2lkKTsKLQotLyogVGhpcyBmdW5jdGlvbiBmaWxscyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGJ1ZmZlciB3aXRoIHRoZSBuYW1lIG9mIHRoZQotICogdmlkZW8gZHJpdmVyLCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQgaWYgdGhlIHZpZGVvIGRyaXZlciBoYXMKLSAqIGJlZW4gaW5pdGlhbGl6ZWQuICBJdCByZXR1cm5zIE5VTEwgaWYgbm8gZHJpdmVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICovCi1leHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX1ZpZGVvRHJpdmVyTmFtZShjaGFyICpuYW1lYnVmLCBpbnQgbWF4bGVuKTsKLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGlzcGxheSBzdXJmYWNlLgotICogSWYgU0RMIGlzIGRvaW5nIGZvcm1hdCBjb252ZXJzaW9uIG9uIHRoZSBkaXNwbGF5IHN1cmZhY2UsIHRoaXMKLSAqIGZ1bmN0aW9uIHJldHVybnMgdGhlIHB1YmxpY2x5IHZpc2libGUgc3VyZmFjZSwgbm90IHRoZSByZWFsIHZpZGVvCi0gKiBzdXJmYWNlLgotICovCi1leHRlcm4gREVDTFNQRUMgU0RMX1N1cmZhY2UgKiBTRExDQUxMIFNETF9HZXRWaWRlb1N1cmZhY2Uodm9pZCk7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSByZWFkLW9ubHkgcG9pbnRlciB0byBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAqIHZpZGVvIGhhcmR3YXJlLiAgSWYgdGhpcyBpcyBjYWxsZWQgYmVmb3JlIFNETF9TZXRWaWRlb01vZGUoKSwgdGhlICd2Zm10JwotICogbWVtYmVyIG9mIHRoZSByZXR1cm5lZCBzdHJ1Y3R1cmUgd2lsbCBjb250YWluIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlCi0gKiAiYmVzdCIgdmlkZW8gbW9kZS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGNvbnN0IFNETF9WaWRlb0luZm8gKiBTRExDQUxMIFNETF9HZXRWaWRlb0luZm8odm9pZCk7Ci0KLS8qIAotICogQ2hlY2sgdG8gc2VlIGlmIGEgcGFydGljdWxhciB2aWRlbyBtb2RlIGlzIHN1cHBvcnRlZC4KLSAqIEl0IHJldHVybnMgMCBpZiB0aGUgcmVxdWVzdGVkIG1vZGUgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgYml0IGRlcHRoLAotICogb3IgcmV0dXJucyB0aGUgYml0cy1wZXItcGl4ZWwgb2YgdGhlIGNsb3Nlc3QgYXZhaWxhYmxlIG1vZGUgd2l0aCB0aGUKLSAqIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQuICBJZiB0aGlzIGJpdHMtcGVyLXBpeGVsIGlzIGRpZmZlcmVudCBmcm9tIHRoZQotICogb25lIHVzZWQgd2hlbiBzZXR0aW5nIHRoZSB2aWRlbyBtb2RlLCBTRExfU2V0VmlkZW9Nb2RlKCkgd2lsbCBzdWNjZWVkLAotICogYnV0IHdpbGwgZW11bGF0ZSB0aGUgcmVxdWVzdGVkIGJpdHMtcGVyLXBpeGVsIHdpdGggYSBzaGFkb3cgc3VyZmFjZS4KLSAqCi0gKiBUaGUgYXJndW1lbnRzIHRvIFNETF9WaWRlb01vZGVPSygpIGFyZSB0aGUgc2FtZSBvbmVzIHlvdSB3b3VsZCBwYXNzIHRvCi0gKiBTRExfU2V0VmlkZW9Nb2RlKCkKLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9WaWRlb01vZGVPSyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci0KLS8qCi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGF2YWlsYWJsZSBzY3JlZW4gZGltZW5zaW9ucyBmb3IgdGhlCi0gKiBnaXZlbiBmb3JtYXQgYW5kIHZpZGVvIGZsYWdzLCBzb3J0ZWQgbGFyZ2VzdCB0byBzbWFsbGVzdC4gIFJldHVybnMgCi0gKiBOVUxMIGlmIHRoZXJlIGFyZSBubyBkaW1lbnNpb25zIGF2YWlsYWJsZSBmb3IgYSBwYXJ0aWN1bGFyIGZvcm1hdCwgCi0gKiBvciAoU0RMX1JlY3QgKiopLTEgaWYgYW55IGRpbWVuc2lvbiBpcyBva2F5IGZvciB0aGUgZ2l2ZW4gZm9ybWF0LgotICoKLSAqIElmICdmb3JtYXQnIGlzIE5VTEwsIHRoZSBtb2RlIGxpc3Qgd2lsbCBiZSBmb3IgdGhlIGZvcm1hdCBnaXZlbiAKLSAqIGJ5IFNETF9HZXRWaWRlb0luZm8oKS0+dmZtdAotICovCi1leHRlcm4gREVDTFNQRUMgU0RMX1JlY3QgKiogU0RMQ0FMTCBTRExfTGlzdE1vZGVzKFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotCi0vKgotICogU2V0IHVwIGEgdmlkZW8gbW9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCBhbmQgYml0cy1wZXItcGl4ZWwuCi0gKgotICogSWYgJ2JwcCcgaXMgMCwgaXQgaXMgdHJlYXRlZCBhcyB0aGUgY3VycmVudCBkaXNwbGF5IGJpdHMgcGVyIHBpeGVsLgotICoKLSAqIElmIFNETF9BTllGT1JNQVQgaXMgc2V0IGluICdmbGFncycsIHRoZSBTREwgbGlicmFyeSB3aWxsIHRyeSB0byBzZXQgdGhlCi0gKiByZXF1ZXN0ZWQgYml0cy1wZXItcGl4ZWwsIGJ1dCB3aWxsIHJldHVybiB3aGF0ZXZlciB2aWRlbyBwaXhlbCBmb3JtYXQgaXMKLSAqIGF2YWlsYWJsZS4gIFRoZSBkZWZhdWx0IGlzIHRvIGVtdWxhdGUgdGhlIHJlcXVlc3RlZCBwaXhlbCBmb3JtYXQgaWYgaXQKLSAqIGlzIG5vdCBuYXRpdmVseSBhdmFpbGFibGUuCi0gKgotICogSWYgU0RMX0hXU1VSRkFDRSBpcyBzZXQgaW4gJ2ZsYWdzJywgdGhlIHZpZGVvIHN1cmZhY2Ugd2lsbCBiZSBwbGFjZWQgaW4KLSAqIHZpZGVvIG1lbW9yeSwgaWYgcG9zc2libGUsIGFuZCB5b3UgbWF5IGhhdmUgdG8gY2FsbCBTRExfTG9ja1N1cmZhY2UoKQotICogaW4gb3JkZXIgdG8gYWNjZXNzIHRoZSByYXcgZnJhbWVidWZmZXIuICBPdGhlcndpc2UsIHRoZSB2aWRlbyBzdXJmYWNlCi0gKiB3aWxsIGJlIGNyZWF0ZWQgaW4gc3lzdGVtIG1lbW9yeS4KLSAqCi0gKiBJZiBTRExfQVNZTkNCTElUIGlzIHNldCBpbiAnZmxhZ3MnLCBTREwgd2lsbCB0cnkgdG8gcGVyZm9ybSByZWN0YW5nbGUKLSAqIHVwZGF0ZXMgYXN5bmNocm9ub3VzbHksIGJ1dCB5b3UgbXVzdCBhbHdheXMgbG9jayBiZWZvcmUgYWNjZXNzaW5nIHBpeGVscy4KLSAqIFNETCB3aWxsIHdhaXQgZm9yIHVwZGF0ZXMgdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoZSBsb2NrLgotICoKLSAqIElmIFNETF9IV1BBTEVUVEUgaXMgc2V0IGluICdmbGFncycsIHRoZSBTREwgbGlicmFyeSB3aWxsIGd1YXJhbnRlZQotICogdGhhdCB0aGUgY29sb3JzIHNldCBieSBTRExfU2V0Q29sb3JzKCkgd2lsbCBiZSB0aGUgY29sb3JzIHlvdSBnZXQuCi0gKiBPdGhlcndpc2UsIGluIDgtYml0IG1vZGUsIFNETF9TZXRDb2xvcnMoKSBtYXkgbm90IGJlIGFibGUgdG8gc2V0IGFsbAotICogb2YgdGhlIGNvbG9ycyBleGFjdGx5IHRoZSB3YXkgdGhleSBhcmUgcmVxdWVzdGVkLCBhbmQgeW91IHNob3VsZCBsb29rCi0gKiBhdCB0aGUgdmlkZW8gc3VyZmFjZSBzdHJ1Y3R1cmUgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgcGFsZXR0ZS4KLSAqIElmIFNETCBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgdGhlIGNvbG9ycyB5b3UgcmVxdWVzdCBjYW4gYmUgc2V0LCAKLSAqIGkuZS4gaWYgdGhlIGNvbG9ybWFwIGlzIHNoYXJlZCwgdGhlbiB0aGUgdmlkZW8gc3VyZmFjZSBtYXkgYmUgY3JlYXRlZAotICogdW5kZXIgZW11bGF0aW9uIGluIHN5c3RlbSBtZW1vcnksIG92ZXJyaWRpbmcgdGhlIFNETF9IV1NVUkZBQ0UgZmxhZy4KLSAqCi0gKiBJZiBTRExfRlVMTFNDUkVFTiBpcyBzZXQgaW4gJ2ZsYWdzJywgdGhlIFNETCBsaWJyYXJ5IHdpbGwgdHJ5IHRvIHNldAotICogYSBmdWxsc2NyZWVuIHZpZGVvIG1vZGUuICBUaGUgZGVmYXVsdCBpcyB0byBjcmVhdGUgYSB3aW5kb3dlZCBtb2RlCi0gKiBpZiB0aGUgY3VycmVudCBncmFwaGljcyBzeXN0ZW0gaGFzIGEgd2luZG93IG1hbmFnZXIuCi0gKiBJZiB0aGUgU0RMIGxpYnJhcnkgaXMgYWJsZSB0byBzZXQgYSBmdWxsc2NyZWVuIHZpZGVvIG1vZGUsIHRoaXMgZmxhZyAKLSAqIHdpbGwgYmUgc2V0IGluIHRoZSBzdXJmYWNlIHRoYXQgaXMgcmV0dXJuZWQuCi0gKgotICogSWYgU0RMX0RPVUJMRUJVRiBpcyBzZXQgaW4gJ2ZsYWdzJywgdGhlIFNETCBsaWJyYXJ5IHdpbGwgdHJ5IHRvIHNldCB1cAotICogdHdvIHN1cmZhY2VzIGluIHZpZGVvIG1lbW9yeSBhbmQgc3dhcCBiZXR3ZWVuIHRoZW0gd2hlbiB5b3UgY2FsbCAKLSAqIFNETF9GbGlwKCkuICBUaGlzIGlzIHVzdWFsbHkgc2xvd2VyIHRoYW4gdGhlIG5vcm1hbCBzaW5nbGUtYnVmZmVyaW5nCi0gKiBzY2hlbWUsIGJ1dCBwcmV2ZW50cyAidGVhcmluZyIgYXJ0aWZhY3RzIGNhdXNlZCBieSBtb2RpZnlpbmcgdmlkZW8gCi0gKiBtZW1vcnkgd2hpbGUgdGhlIG1vbml0b3IgaXMgcmVmcmVzaGluZy4gIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgCi0gKiBhcHBsaWNhdGlvbnMgdGhhdCByZWRyYXcgdGhlIGVudGlyZSBzY3JlZW4gb24gZXZlcnkgdXBkYXRlLgotICoKLSAqIElmIFNETF9SRVNJWkFCTEUgaXMgc2V0IGluICdmbGFncycsIHRoZSBTREwgbGlicmFyeSB3aWxsIGFsbG93IHRoZQotICogd2luZG93IG1hbmFnZXIsIGlmIGFueSwgdG8gcmVzaXplIHRoZSB3aW5kb3cgYXQgcnVudGltZS4gIFdoZW4gdGhpcwotICogb2NjdXJzLCBTREwgd2lsbCBzZW5kIGEgU0RMX1ZJREVPUkVTSVpFIGV2ZW50IHRvIHlvdSBhcHBsaWNhdGlvbiwKLSAqIGFuZCB5b3UgbXVzdCByZXNwb25kIHRvIHRoZSBldmVudCBieSByZS1jYWxsaW5nIFNETF9TZXRWaWRlb01vZGUoKQotICogd2l0aCB0aGUgcmVxdWVzdGVkIHNpemUgKG9yIGFub3RoZXIgc2l6ZSB0aGF0IHN1aXRzIHRoZSBhcHBsaWNhdGlvbikuCi0gKgotICogSWYgU0RMX05PRlJBTUUgaXMgc2V0IGluICdmbGFncycsIHRoZSBTREwgbGlicmFyeSB3aWxsIGNyZWF0ZSBhIHdpbmRvdwotICogd2l0aG91dCBhbnkgdGl0bGUgYmFyIG9yIGZyYW1lIGRlY29yYXRpb24uICBGdWxsc2NyZWVuIHZpZGVvIG1vZGVzIGhhdmUKLSAqIHRoaXMgZmxhZyBzZXQgYXV0b21hdGljYWxseS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZpZGVvIGZyYW1lYnVmZmVyIHN1cmZhY2UsIG9yIE5VTEwgaWYgaXQgZmFpbHMuCi0gKgotICogSWYgeW91IHJlbHkgb24gZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSBjZXJ0YWluIHZpZGVvIGZsYWdzLCBjaGVjayB0aGUKLSAqIGZsYWdzIG9mIHRoZSByZXR1cm5lZCBzdXJmYWNlIHRvIG1ha2Ugc3VyZSB0aGF0IGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlLgotICogU0RMIHdpbGwgZmFsbCBiYWNrIHRvIHJlZHVjZWQgZnVuY3Rpb25hbGl0eSBpZiB0aGUgZXhhY3QgZmxhZ3MgeW91IHdhbnRlZAotICogYXJlIG5vdCBhdmFpbGFibGUuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBTRExfU3VyZmFjZSAqIFNETENBTEwgU0RMX1NldFZpZGVvTW9kZQotCQkJKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLQotLyoKLSAqIE1ha2VzIHN1cmUgdGhlIGdpdmVuIGxpc3Qgb2YgcmVjdGFuZ2xlcyBpcyB1cGRhdGVkIG9uIHRoZSBnaXZlbiBzY3JlZW4uCi0gKiBJZiAneCcsICd5JywgJ3cnIGFuZCAnaCcgYXJlIGFsbCAwLCBTRExfVXBkYXRlUmVjdCB3aWxsIHVwZGF0ZSB0aGUgZW50aXJlCi0gKiBzY3JlZW4uCi0gKiBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hpbGUgJ3NjcmVlbicgaXMgbG9ja2VkLgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9VcGRhdGVSZWN0cwotCQkoU0RMX1N1cmZhY2UgKnNjcmVlbiwgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfVXBkYXRlUmVjdAotCQkoU0RMX1N1cmZhY2UgKnNjcmVlbiwgU2ludDMyIHgsIFNpbnQzMiB5LCBVaW50MzIgdywgVWludDMyIGgpOwotCi0vKgotICogT24gaGFyZHdhcmUgdGhhdCBzdXBwb3J0cyBkb3VibGUtYnVmZmVyaW5nLCB0aGlzIGZ1bmN0aW9uIHNldHMgdXAgYSBmbGlwCi0gKiBhbmQgcmV0dXJucy4gIFRoZSBoYXJkd2FyZSB3aWxsIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UsIGFuZCB0aGVuIHN3YXAKLSAqIHZpZGVvIGJ1ZmZlcnMgYmVmb3JlIHRoZSBuZXh0IHZpZGVvIHN1cmZhY2UgYmxpdCBvciBsb2NrIHdpbGwgcmV0dXJuLgotICogT24gaGFyZHdhcmUgdGhhdCBkb2VzbiBub3Qgc3VwcG9ydCBkb3VibGUtYnVmZmVyaW5nLCB0aGlzIGlzIGVxdWl2YWxlbnQKLSAqIHRvIGNhbGxpbmcgU0RMX1VwZGF0ZVJlY3Qoc2NyZWVuLCAwLCAwLCAwLCAwKTsKLSAqIFRoZSBTRExfRE9VQkxFQlVGIGZsYWcgbXVzdCBoYXZlIGJlZW4gcGFzc2VkIHRvIFNETF9TZXRWaWRlb01vZGUoKSB3aGVuCi0gKiBzZXR0aW5nIHRoZSB2aWRlbyBtb2RlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIHBlcmZvcm0gaGFyZHdhcmUgZmxpcHBpbmcuCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfRmxpcChTRExfU3VyZmFjZSAqc2NyZWVuKTsKLQotLyoKLSAqIFNldCB0aGUgZ2FtbWEgY29ycmVjdGlvbiBmb3IgZWFjaCBvZiB0aGUgY29sb3IgY2hhbm5lbHMuCi0gKiBUaGUgZ2FtbWEgdmFsdWVzIHJhbmdlIChhcHByb3hpbWF0ZWx5KSBiZXR3ZWVuIDAuMSBhbmQgMTAuMAotICogCi0gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzbid0IHN1cHBvcnRlZCBkaXJlY3RseSBieSB0aGUgaGFyZHdhcmUsIGl0IHdpbGwKLSAqIGJlIGVtdWxhdGVkIHVzaW5nIGdhbW1hIHJhbXBzLCBpZiBhdmFpbGFibGUuICBJZiBzdWNjZXNzZnVsLCB0aGlzCi0gKiBmdW5jdGlvbiByZXR1cm5zIDAsIG90aGVyd2lzZSBpdCByZXR1cm5zIC0xLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NldEdhbW1hKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpOwotCi0vKgotICogU2V0IHRoZSBnYW1tYSB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzCi0gKiBvZiB0aGUgdmlkZW8gaGFyZHdhcmUuICBFYWNoIHRhYmxlIGlzIGFuIGFycmF5IG9mIDI1NiAxNi1iaXQgcXVhbnRpdGllcywKLSAqIHJlcHJlc2VudGluZyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBmb3IgdGhhdCBjaGFubmVsLgotICogVGhlIGlucHV0IGlzIHRoZSBpbmRleCBpbnRvIHRoZSBhcnJheSwgYW5kIHRoZSBvdXRwdXQgaXMgdGhlIDE2LWJpdAotICogZ2FtbWEgdmFsdWUgYXQgdGhhdCBpbmRleCwgc2NhbGVkIHRvIHRoZSBvdXRwdXQgY29sb3IgcHJlY2lzaW9uLgotICogCi0gKiBZb3UgbWF5IHBhc3MgTlVMTCBmb3IgYW55IG9mIHRoZSBjaGFubmVscyB0byBsZWF2ZSBpdCB1bmNoYW5nZWQuCi0gKiBJZiB0aGUgY2FsbCBzdWNjZWVkcywgaXQgd2lsbCByZXR1cm4gMC4gIElmIHRoZSBkaXNwbGF5IGRyaXZlciBvcgotICogaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBnYW1tYSB0cmFuc2xhdGlvbiwgb3Igb3RoZXJ3aXNlIGZhaWxzLAotICogdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAtMS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZXRHYW1tYVJhbXAoY29uc3QgVWludDE2ICpyZWQsIGNvbnN0IFVpbnQxNiAqZ3JlZW4sIGNvbnN0IFVpbnQxNiAqYmx1ZSk7Ci0KLS8qCi0gKiBSZXRyaWV2ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGdhbW1hIHRyYW5zbGF0aW9uIHRhYmxlcy4KLSAqIAotICogWW91IG11c3QgcGFzcyBpbiB2YWxpZCBwb2ludGVycyB0byBhcnJheXMgb2YgMjU2IDE2LWJpdCBxdWFudGl0aWVzLgotICogQW55IG9mIHRoZSBwb2ludGVycyBtYXkgYmUgTlVMTCB0byBpZ25vcmUgdGhhdCBjaGFubmVsLgotICogSWYgdGhlIGNhbGwgc3VjY2VlZHMsIGl0IHdpbGwgcmV0dXJuIDAuICBJZiB0aGUgZGlzcGxheSBkcml2ZXIgb3IKLSAqIGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZ2FtbWEgdHJhbnNsYXRpb24sIG9yIG90aGVyd2lzZSBmYWlscywKLSAqIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfR2V0R2FtbWFSYW1wKFVpbnQxNiAqcmVkLCBVaW50MTYgKmdyZWVuLCBVaW50MTYgKmJsdWUpOwotCi0vKgotICogU2V0cyBhIHBvcnRpb24gb2YgdGhlIGNvbG9ybWFwIGZvciB0aGUgZ2l2ZW4gOC1iaXQgc3VyZmFjZS4gIElmICdzdXJmYWNlJwotICogaXMgbm90IGEgcGFsZXR0aXplZCBzdXJmYWNlLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZywgcmV0dXJuaW5nIDAuCi0gKiBJZiBhbGwgb2YgdGhlIGNvbG9ycyB3ZXJlIHNldCBhcyBwYXNzZWQgdG8gU0RMX1NldENvbG9ycygpLCBpdCB3aWxsCi0gKiByZXR1cm4gMS4gIElmIG5vdCBhbGwgdGhlIGNvbG9yIGVudHJpZXMgd2VyZSBzZXQgZXhhY3RseSBhcyBnaXZlbiwKLSAqIGl0IHdpbGwgcmV0dXJuIDAsIGFuZCB5b3Ugc2hvdWxkIGxvb2sgYXQgdGhlIHN1cmZhY2UgcGFsZXR0ZSB0bwotICogZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY29sb3IgcGFsZXR0ZS4KLSAqCi0gKiBXaGVuICdzdXJmYWNlJyBpcyB0aGUgc3VyZmFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgZGlzcGxheSwgdGhlCi0gKiBkaXNwbGF5IGNvbG9ybWFwIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgY29sb3JzLiAgSWYgCi0gKiBTRExfSFdQQUxFVFRFIHdhcyBzZXQgaW4gU0RMX1NldFZpZGVvTW9kZSgpIGZsYWdzLCBTRExfU2V0Q29sb3JzKCkKLSAqIHdpbGwgYWx3YXlzIHJldHVybiAxLCBhbmQgdGhlIHBhbGV0dGUgaXMgZ3VhcmFudGVlZCB0byBiZSBzZXQgdGhlIHdheQotICogeW91IGRlc2lyZSwgZXZlbiBpZiB0aGUgd2luZG93IGNvbG9ybWFwIGhhcyB0byBiZSB3YXJwZWQgb3IgcnVuIHVuZGVyCi0gKiBlbXVsYXRpb24uCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfU2V0Q29sb3JzKFNETF9TdXJmYWNlICpzdXJmYWNlLCAKLQkJCVNETF9Db2xvciAqY29sb3JzLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMpOwotCi0vKgotICogU2V0cyBhIHBvcnRpb24gb2YgdGhlIGNvbG9ybWFwIGZvciBhIGdpdmVuIDgtYml0IHN1cmZhY2UuCi0gKiAnZmxhZ3MnIGlzIG9uZSBvciBib3RoIG9mOgotICogU0RMX0xPR1BBTCAgLS0gc2V0IGxvZ2ljYWwgcGFsZXR0ZSwgd2hpY2ggY29udHJvbHMgaG93IGJsaXRzIGFyZSBtYXBwZWQKLSAqICAgICAgICAgICAgICAgIHRvL2Zyb20gdGhlIHN1cmZhY2UsCi0gKiBTRExfUEhZU1BBTCAtLSBzZXQgcGh5c2ljYWwgcGFsZXR0ZSwgd2hpY2ggY29udHJvbHMgaG93IHBpeGVscyBsb29rIG9uCi0gKiAgICAgICAgICAgICAgICB0aGUgc2NyZWVuCi0gKiBPbmx5IHNjcmVlbnMgaGF2ZSBwaHlzaWNhbCBwYWxldHRlcy4gU2VwYXJhdGUgY2hhbmdlIG9mIHBoeXNpY2FsL2xvZ2ljYWwKLSAqIHBhbGV0dGVzIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHNjcmVlbiBoYXMgU0RMX0hXUEFMRVRURSBzZXQuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyAxIGlmIGFsbCBjb2xvdXJzIGNvdWxkIGJlIHNldCBhcyByZXF1ZXN0ZWQsIGFuZCAwCi0gKiBvdGhlcndpc2UuCi0gKgotICogU0RMX1NldENvbG9ycygpIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGgKLSAqICAgICBmbGFncyA9IChTRExfTE9HUEFMfFNETF9QSFlTUEFMKS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZXRQYWxldHRlKFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgZmxhZ3MsCi0JCQkJICAgU0RMX0NvbG9yICpjb2xvcnMsIGludCBmaXJzdGNvbG9yLAotCQkJCSAgIGludCBuY29sb3JzKTsKLQotLyoKLSAqIE1hcHMgYW4gUkdCIHRyaXBsZSB0byBhbiBvcGFxdWUgcGl4ZWwgdmFsdWUgZm9yIGEgZ2l2ZW4gcGl4ZWwgZm9ybWF0Ci0gKi8KLWV4dGVybiBERUNMU1BFQyBVaW50MzIgU0RMQ0FMTCBTRExfTWFwUkdCCi0oY29uc3QgU0RMX1BpeGVsRm9ybWF0ICogY29uc3QgZm9ybWF0LAotIGNvbnN0IFVpbnQ4IHIsIGNvbnN0IFVpbnQ4IGcsIGNvbnN0IFVpbnQ4IGIpOwotCi0vKgotICogTWFwcyBhbiBSR0JBIHF1YWRydXBsZSB0byBhIHBpeGVsIHZhbHVlIGZvciBhIGdpdmVuIHBpeGVsIGZvcm1hdAotICovCi1leHRlcm4gREVDTFNQRUMgVWludDMyIFNETENBTEwgU0RMX01hcFJHQkEKLShjb25zdCBTRExfUGl4ZWxGb3JtYXQgKiBjb25zdCBmb3JtYXQsCi0gY29uc3QgVWludDggciwgY29uc3QgVWludDggZywgY29uc3QgVWludDggYiwgY29uc3QgVWludDggYSk7Ci0KLS8qCi0gKiBNYXBzIGEgcGl4ZWwgdmFsdWUgaW50byB0aGUgUkdCIGNvbXBvbmVudHMgZm9yIGEgZ2l2ZW4gcGl4ZWwgZm9ybWF0Ci0gKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0dldFJHQihVaW50MzIgcGl4ZWwsIFNETF9QaXhlbEZvcm1hdCAqZm10LAotCQkJCVVpbnQ4ICpyLCBVaW50OCAqZywgVWludDggKmIpOwotCi0vKgotICogTWFwcyBhIHBpeGVsIHZhbHVlIGludG8gdGhlIFJHQkEgY29tcG9uZW50cyBmb3IgYSBnaXZlbiBwaXhlbCBmb3JtYXQKLSAqLwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfR2V0UkdCQShVaW50MzIgcGl4ZWwsIFNETF9QaXhlbEZvcm1hdCAqZm10LAotCQkJCSBVaW50OCAqciwgVWludDggKmcsIFVpbnQ4ICpiLCBVaW50OCAqYSk7Ci0KLS8qCi0gKiBBbGxvY2F0ZSBhbmQgZnJlZSBhbiBSR0Igc3VyZmFjZSAobXVzdCBiZSBjYWxsZWQgYWZ0ZXIgU0RMX1NldFZpZGVvTW9kZSkKLSAqIElmIHRoZSBkZXB0aCBpcyA0IG9yIDggYml0cywgYW4gZW1wdHkgcGFsZXR0ZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzdXJmYWNlLgotICogSWYgdGhlIGRlcHRoIGlzIGdyZWF0ZXIgdGhhbiA4IGJpdHMsIHRoZSBwaXhlbCBmb3JtYXQgaXMgc2V0IHVzaW5nIHRoZQotICogZmxhZ3MgJ1tSR0JdbWFzaycuCi0gKiBJZiB0aGUgZnVuY3Rpb24gcnVucyBvdXQgb2YgbWVtb3J5LCBpdCB3aWxsIHJldHVybiBOVUxMLgotICoKLSAqIFRoZSAnZmxhZ3MnIHRlbGwgd2hhdCBraW5kIG9mIHN1cmZhY2UgdG8gY3JlYXRlLgotICogU0RMX1NXU1VSRkFDRSBtZWFucyB0aGF0IHRoZSBzdXJmYWNlIHNob3VsZCBiZSBjcmVhdGVkIGluIHN5c3RlbSBtZW1vcnkuCi0gKiBTRExfSFdTVVJGQUNFIG1lYW5zIHRoYXQgdGhlIHN1cmZhY2Ugc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdmlkZW8gbWVtb3J5LAotICogd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIGRpc3BsYXkgc3VyZmFjZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBzdXJmYWNlcwotICogdGhhdCB3aWxsIG5vdCBjaGFuZ2UgbXVjaCwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFyZHdhcmUgYWNjZWxlcmF0aW9uCi0gKiB3aGVuIGJlaW5nIGJsaXR0ZWQgdG8gdGhlIGRpc3BsYXkgc3VyZmFjZS4KLSAqIFNETF9BU1lOQ0JMSVQgbWVhbnMgdGhhdCBTREwgd2lsbCB0cnkgdG8gcGVyZm9ybSBhc3luY2hyb25vdXMgYmxpdHMgd2l0aAotICogdGhpcyBzdXJmYWNlLCBidXQgeW91IG11c3QgYWx3YXlzIGxvY2sgaXQgYmVmb3JlIGFjY2Vzc2luZyB0aGUgcGl4ZWxzLgotICogU0RMIHdpbGwgd2FpdCBmb3IgY3VycmVudCBibGl0cyB0byBmaW5pc2ggYmVmb3JlIHJldHVybmluZyBmcm9tIHRoZSBsb2NrLgotICogU0RMX1NSQ0NPTE9SS0VZIGluZGljYXRlcyB0aGF0IHRoZSBzdXJmYWNlIHdpbGwgYmUgdXNlZCBmb3IgY29sb3JrZXkgYmxpdHMuCi0gKiBJZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgYWNjZWxlcmF0aW9uIG9mIGNvbG9ya2V5IGJsaXRzIGJldHdlZW4KLSAqIHR3byBzdXJmYWNlcyBpbiB2aWRlbyBtZW1vcnksIFNETCB3aWxsIHRyeSB0byBwbGFjZSB0aGUgc3VyZmFjZSBpbgotICogdmlkZW8gbWVtb3J5LiBJZiB0aGlzIGlzbid0IHBvc3NpYmxlIG9yIGlmIHRoZXJlIGlzIG5vIGhhcmR3YXJlCi0gKiBhY2NlbGVyYXRpb24gYXZhaWxhYmxlLCB0aGUgc3VyZmFjZSB3aWxsIGJlIHBsYWNlZCBpbiBzeXN0ZW0gbWVtb3J5LgotICogU0RMX1NSQ0FMUEhBIG1lYW5zIHRoYXQgdGhlIHN1cmZhY2Ugd2lsbCBiZSB1c2VkIGZvciBhbHBoYSBibGl0cyBhbmQgCi0gKiBpZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIG9mIGFscGhhIGJsaXRzIGJldHdlZW4KLSAqIHR3byBzdXJmYWNlcyBpbiB2aWRlbyBtZW1vcnksIHRvIHBsYWNlIHRoZSBzdXJmYWNlIGluIHZpZGVvIG1lbW9yeQotICogaWYgcG9zc2libGUsIG90aGVyd2lzZSBpdCB3aWxsIGJlIHBsYWNlZCBpbiBzeXN0ZW0gbWVtb3J5LgotICogSWYgdGhlIHN1cmZhY2UgaXMgY3JlYXRlZCBpbiB2aWRlbyBtZW1vcnksIGJsaXRzIHdpbGwgYmUgX211Y2hfIGZhc3RlciwKLSAqIGJ1dCB0aGUgc3VyZmFjZSBmb3JtYXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIHZpZGVvIHN1cmZhY2UgZm9ybWF0LAotICogYW5kIHRoZSBvbmx5IHdheSB0byBhY2Nlc3MgdGhlIHBpeGVscyBtZW1iZXIgb2YgdGhlIHN1cmZhY2UgaXMgdG8gdXNlCi0gKiB0aGUgU0RMX0xvY2tTdXJmYWNlKCkgYW5kIFNETF9VbmxvY2tTdXJmYWNlKCkgY2FsbHMuCi0gKiBJZiB0aGUgcmVxdWVzdGVkIHN1cmZhY2UgYWN0dWFsbHkgcmVzaWRlcyBpbiB2aWRlbyBtZW1vcnksIFNETF9IV1NVUkZBQ0UKLSAqIHdpbGwgYmUgc2V0IGluIHRoZSBmbGFncyBtZW1iZXIgb2YgdGhlIHJldHVybmVkIHN1cmZhY2UuICBJZiBmb3Igc29tZQotICogcmVhc29uIHRoZSBzdXJmYWNlIGNvdWxkIG5vdCBiZSBwbGFjZWQgaW4gdmlkZW8gbWVtb3J5LCBpdCB3aWxsIG5vdCBoYXZlCi0gKiB0aGUgU0RMX0hXU1VSRkFDRSBmbGFnIHNldCwgYW5kIHdpbGwgYmUgY3JlYXRlZCBpbiBzeXN0ZW0gbWVtb3J5IGluc3RlYWQuCi0gKi8KLSNkZWZpbmUgU0RMX0FsbG9jU3VyZmFjZSAgICBTRExfQ3JlYXRlUkdCU3VyZmFjZQotZXh0ZXJuIERFQ0xTUEVDIFNETF9TdXJmYWNlICogU0RMQ0FMTCBTRExfQ3JlYXRlUkdCU3VyZmFjZQotCQkJKFVpbnQzMiBmbGFncywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIAotCQkJVWludDMyIFJtYXNrLCBVaW50MzIgR21hc2ssIFVpbnQzMiBCbWFzaywgVWludDMyIEFtYXNrKTsKLWV4dGVybiBERUNMU1BFQyBTRExfU3VyZmFjZSAqIFNETENBTEwgU0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tKHZvaWQgKnBpeGVscywKLQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGl0Y2gsCi0JCQlVaW50MzIgUm1hc2ssIFVpbnQzMiBHbWFzaywgVWludDMyIEJtYXNrLCBVaW50MzIgQW1hc2spOwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRnJlZVN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0vKgotICogU0RMX0xvY2tTdXJmYWNlKCkgc2V0cyB1cCBhIHN1cmZhY2UgZm9yIGRpcmVjdGx5IGFjY2Vzc2luZyB0aGUgcGl4ZWxzLgotICogQmV0d2VlbiBjYWxscyB0byBTRExfTG9ja1N1cmZhY2UoKS9TRExfVW5sb2NrU3VyZmFjZSgpLCB5b3UgY2FuIHdyaXRlCi0gKiB0byBhbmQgcmVhZCBmcm9tICdzdXJmYWNlLT5waXhlbHMnLCB1c2luZyB0aGUgcGl4ZWwgZm9ybWF0IHN0b3JlZCBpbiAKLSAqICdzdXJmYWNlLT5mb3JtYXQnLiAgT25jZSB5b3UgYXJlIGRvbmUgYWNjZXNzaW5nIHRoZSBzdXJmYWNlLCB5b3Ugc2hvdWxkIAotICogdXNlIFNETF9VbmxvY2tTdXJmYWNlKCkgdG8gcmVsZWFzZSBpdC4KLSAqCi0gKiBOb3QgYWxsIHN1cmZhY2VzIHJlcXVpcmUgbG9ja2luZy4gIElmIFNETF9NVVNUTE9DSyhzdXJmYWNlKSBldmFsdWF0ZXMKLSAqIHRvIDAsIHRoZW4geW91IGNhbiByZWFkIGFuZCB3cml0ZSB0byB0aGUgc3VyZmFjZSBhdCBhbnkgdGltZSwgYW5kIHRoZQotICogcGl4ZWwgZm9ybWF0IG9mIHRoZSBzdXJmYWNlIHdpbGwgbm90IGNoYW5nZS4gIEluIHBhcnRpY3VsYXIsIGlmIHRoZQotICogU0RMX0hXU1VSRkFDRSBmbGFnIGlzIG5vdCBnaXZlbiB3aGVuIGNhbGxpbmcgU0RMX1NldFZpZGVvTW9kZSgpLCB5b3UKLSAqIHdpbGwgbm90IG5lZWQgdG8gbG9jayB0aGUgZGlzcGxheSBzdXJmYWNlIGJlZm9yZSBhY2Nlc3NpbmcgaXQuCi0gKiAKLSAqIE5vIG9wZXJhdGluZyBzeXN0ZW0gb3IgbGlicmFyeSBjYWxscyBzaG91bGQgYmUgbWFkZSBiZXR3ZWVuIGxvY2svdW5sb2NrCi0gKiBwYWlycywgYXMgY3JpdGljYWwgc3lzdGVtIGxvY2tzIG1heSBiZSBoZWxkIGR1cmluZyB0aGlzIHRpbWUuCi0gKgotICogU0RMX0xvY2tTdXJmYWNlKCkgcmV0dXJucyAwLCBvciAtMSBpZiB0aGUgc3VyZmFjZSBjb3VsZG4ndCBiZSBsb2NrZWQuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfTG9ja1N1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfVW5sb2NrU3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0KLS8qCi0gKiBMb2FkIGEgc3VyZmFjZSBmcm9tIGEgc2Vla2FibGUgU0RMIGRhdGEgc291cmNlIChtZW1vcnkgb3IgZmlsZS4pCi0gKiBJZiAnZnJlZXNyYycgaXMgbm9uLXplcm8sIHRoZSBzb3VyY2Ugd2lsbCBiZSBjbG9zZWQgYWZ0ZXIgYmVpbmcgcmVhZC4KLSAqIFJldHVybnMgdGhlIG5ldyBzdXJmYWNlLCBvciBOVUxMIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KLSAqIFRoZSBuZXcgc3VyZmFjZSBzaG91bGQgYmUgZnJlZWQgd2l0aCBTRExfRnJlZVN1cmZhY2UoKS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFNETF9TdXJmYWNlICogU0RMQ0FMTCBTRExfTG9hZEJNUF9SVyhTRExfUldvcHMgKnNyYywgaW50IGZyZWVzcmMpOwotCi0vKiBDb252ZW5pZW5jZSBtYWNybyAtLSBsb2FkIGEgc3VyZmFjZSBmcm9tIGEgZmlsZSAqLwotI2RlZmluZSBTRExfTG9hZEJNUChmaWxlKQlTRExfTG9hZEJNUF9SVyhTRExfUldGcm9tRmlsZShmaWxlLCAicmIiKSwgMSkKLQotLyoKLSAqIFNhdmUgYSBzdXJmYWNlIHRvIGEgc2Vla2FibGUgU0RMIGRhdGEgc291cmNlIChtZW1vcnkgb3IgZmlsZS4pCi0gKiBJZiAnZnJlZWRzdCcgaXMgbm9uLXplcm8sIHRoZSBzb3VyY2Ugd2lsbCBiZSBjbG9zZWQgYWZ0ZXIgYmVpbmcgd3JpdHRlbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsIG9yIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TYXZlQk1QX1JXCi0JCShTRExfU3VyZmFjZSAqc3VyZmFjZSwgU0RMX1JXb3BzICpkc3QsIGludCBmcmVlZHN0KTsKLQotLyogQ29udmVuaWVuY2UgbWFjcm8gLS0gc2F2ZSBhIHN1cmZhY2UgdG8gYSBmaWxlICovCi0jZGVmaW5lIFNETF9TYXZlQk1QKHN1cmZhY2UsIGZpbGUpIFwKLQkJU0RMX1NhdmVCTVBfUlcoc3VyZmFjZSwgU0RMX1JXRnJvbUZpbGUoZmlsZSwgIndiIiksIDEpCi0KLS8qCi0gKiBTZXRzIHRoZSBjb2xvciBrZXkgKHRyYW5zcGFyZW50IHBpeGVsKSBpbiBhIGJsaXR0YWJsZSBzdXJmYWNlLgotICogSWYgJ2ZsYWcnIGlzIFNETF9TUkNDT0xPUktFWSAob3B0aW9uYWxseSBPUidkIHdpdGggU0RMX1JMRUFDQ0VMKSwgCi0gKiAna2V5JyB3aWxsIGJlIHRoZSB0cmFuc3BhcmVudCBwaXhlbCBpbiB0aGUgc291cmNlIGltYWdlIG9mIGEgYmxpdC4KLSAqIFNETF9STEVBQ0NFTCByZXF1ZXN0cyBSTEUgYWNjZWxlcmF0aW9uIGZvciB0aGUgc3VyZmFjZSBpZiBwcmVzZW50LAotICogYW5kIHJlbW92ZXMgUkxFIGFjY2VsZXJhdGlvbiBpZiBhYnNlbnQuCi0gKiBJZiAnZmxhZycgaXMgMCwgdGhpcyBmdW5jdGlvbiBjbGVhcnMgYW55IGN1cnJlbnQgY29sb3Iga2V5LgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZXRDb2xvcktleQotCQkJKFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIgZmxhZywgVWludDMyIGtleSk7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFscGhhIHZhbHVlIGZvciB0aGUgZW50aXJlIHN1cmZhY2UsIGFzIG9wcG9zZWQgdG8KLSAqIHVzaW5nIHRoZSBhbHBoYSBjb21wb25lbnQgb2YgZWFjaCBwaXhlbC4gVGhpcyB2YWx1ZSBtZWFzdXJlcyB0aGUgcmFuZ2UKLSAqIG9mIHRyYW5zcGFyZW5jeSBvZiB0aGUgc3VyZmFjZSwgMCBiZWluZyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvIDI1NQotICogYmVpbmcgY29tcGxldGVseSBvcGFxdWUuIEFuICdhbHBoYScgdmFsdWUgb2YgMjU1IGNhdXNlcyBibGl0cyB0byBiZQotICogb3BhcXVlLCB0aGUgc291cmNlIHBpeGVscyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uICh0aGUgZGVmYXVsdCkuIE5vdGUKLSAqIHRoYXQgcGVyLXN1cmZhY2UgYWxwaGEgY2FuIGJlIGNvbWJpbmVkIHdpdGggY29sb3JrZXkgdHJhbnNwYXJlbmN5LgotICoKLSAqIElmICdmbGFnJyBpcyAwLCBhbHBoYSBibGVuZGluZyBpcyBkaXNhYmxlZCBmb3IgdGhlIHN1cmZhY2UuCi0gKiBJZiAnZmxhZycgaXMgU0RMX1NSQ0FMUEhBLCBhbHBoYSBibGVuZGluZyBpcyBlbmFibGVkIGZvciB0aGUgc3VyZmFjZS4KLSAqIE9SOmluZyB0aGUgZmxhZyB3aXRoIFNETF9STEVBQ0NFTCByZXF1ZXN0cyBSTEUgYWNjZWxlcmF0aW9uIGZvciB0aGUKLSAqIHN1cmZhY2U7IGlmIFNETF9STEVBQ0NFTCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgUkxFIGFjY2VsIHdpbGwgYmUgcmVtb3ZlZC4KLSAqCi0gKiBUaGUgJ2FscGhhJyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3Igc3VyZmFjZXMgdGhhdCBoYXZlIGFuIGFscGhhIGNoYW5uZWwuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfU2V0QWxwaGEoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBmbGFnLCBVaW50OCBhbHBoYSk7Ci0KLS8qCi0gKiBTZXRzIHRoZSBjbGlwcGluZyByZWN0YW5nbGUgZm9yIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlIGluIGEgYmxpdC4KLSAqCi0gKiBJZiB0aGUgY2xpcCByZWN0YW5nbGUgaXMgTlVMTCwgY2xpcHBpbmcgd2lsbCBiZSBkaXNhYmxlZC4KLSAqIElmIHRoZSBjbGlwIHJlY3RhbmdsZSBkb2Vzbid0IGludGVyc2VjdCB0aGUgc3VyZmFjZSwgdGhlIGZ1bmN0aW9uIHdpbGwKLSAqIHJldHVybiBTRExfRkFMU0UgYW5kIGJsaXRzIHdpbGwgYmUgY29tcGxldGVseSBjbGlwcGVkLiAgT3RoZXJ3aXNlIHRoZQotICogZnVuY3Rpb24gcmV0dXJucyBTRExfVFJVRSBhbmQgYmxpdHMgdG8gdGhlIHN1cmZhY2Ugd2lsbCBiZSBjbGlwcGVkIHRvCi0gKiB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBzdXJmYWNlIGFyZWEgYW5kIHRoZSBjbGlwcGluZyByZWN0YW5nbGUuCi0gKgotICogTm90ZSB0aGF0IGJsaXRzIGFyZSBhdXRvbWF0aWNhbGx5IGNsaXBwZWQgdG8gdGhlIGVkZ2VzIG9mIHRoZSBzb3VyY2UKLSAqIGFuZCBkZXN0aW5hdGlvbiBzdXJmYWNlcy4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFNETF9ib29sIFNETENBTEwgU0RMX1NldENsaXBSZWN0KFNETF9TdXJmYWNlICpzdXJmYWNlLCBjb25zdCBTRExfUmVjdCAqcmVjdCk7Ci0KLS8qCi0gKiBHZXRzIHRoZSBjbGlwcGluZyByZWN0YW5nbGUgZm9yIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlIGluIGEgYmxpdC4KLSAqICdyZWN0JyBtdXN0IGJlIGEgcG9pbnRlciB0byBhIHZhbGlkIHJlY3RhbmdsZSB3aGljaCB3aWxsIGJlIGZpbGxlZAotICogd2l0aCB0aGUgY29ycmVjdCB2YWx1ZXMuCi0gKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0dldENsaXBSZWN0KFNETF9TdXJmYWNlICpzdXJmYWNlLCBTRExfUmVjdCAqcmVjdCk7Ci0KLS8qCi0gKiBDcmVhdGVzIGEgbmV3IHN1cmZhY2Ugb2YgdGhlIHNwZWNpZmllZCBmb3JtYXQsIGFuZCB0aGVuIGNvcGllcyBhbmQgbWFwcyAKLSAqIHRoZSBnaXZlbiBzdXJmYWNlIHRvIGl0IHNvIHRoZSBibGl0IG9mIHRoZSBjb252ZXJ0ZWQgc3VyZmFjZSB3aWxsIGJlIGFzIAotICogZmFzdCBhcyBwb3NzaWJsZS4gIElmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIGl0IHJldHVybnMgTlVMTC4KLSAqCi0gKiBUaGUgJ2ZsYWdzJyBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRvIFNETF9DcmVhdGVSR0JTdXJmYWNlKCkgYW5kIGhhcyB0aG9zZSAKLSAqIHNlbWFudGljcy4gIFlvdSBjYW4gYWxzbyBwYXNzIFNETF9STEVBQ0NFTCBpbiB0aGUgZmxhZ3MgcGFyYW1ldGVyIGFuZAotICogU0RMIHdpbGwgdHJ5IHRvIFJMRSBhY2NlbGVyYXRlIGNvbG9ya2V5IGFuZCBhbHBoYSBibGl0cyBpbiB0aGUgcmVzdWx0aW5nCi0gKiBzdXJmYWNlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IFNETF9EaXNwbGF5Rm9ybWF0KCkuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBTRExfU3VyZmFjZSAqIFNETENBTEwgU0RMX0NvbnZlcnRTdXJmYWNlCi0JCQkoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1BpeGVsRm9ybWF0ICpmbXQsIFVpbnQzMiBmbGFncyk7Ci0KLS8qCi0gKiBUaGlzIHBlcmZvcm1zIGEgZmFzdCBibGl0IGZyb20gdGhlIHNvdXJjZSBzdXJmYWNlIHRvIHRoZSBkZXN0aW5hdGlvbgotICogc3VyZmFjZS4gIEl0IGFzc3VtZXMgdGhhdCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWN0YW5nbGVzIGFyZQotICogdGhlIHNhbWUgc2l6ZS4gIElmIGVpdGhlciAnc3JjcmVjdCcgb3IgJ2RzdHJlY3QnIGFyZSBOVUxMLCB0aGUgZW50aXJlCi0gKiBzdXJmYWNlIChzcmMgb3IgZHN0KSBpcyBjb3BpZWQuICBUaGUgZmluYWwgYmxpdCByZWN0YW5nbGVzIGFyZSBzYXZlZAotICogaW4gJ3NyY3JlY3QnIGFuZCAnZHN0cmVjdCcgYWZ0ZXIgYWxsIGNsaXBwaW5nIGlzIHBlcmZvcm1lZC4KLSAqIElmIHRoZSBibGl0IGlzIHN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgMCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgLTEuCi0gKgotICogVGhlIGJsaXQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYSBsb2NrZWQgc3VyZmFjZS4KLSAqCi0gKiBUaGUgYmxpdCBzZW1hbnRpY3MgZm9yIHN1cmZhY2VzIHdpdGggYW5kIHdpdGhvdXQgYWxwaGEgYW5kIGNvbG9ya2V5Ci0gKiBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOgotICoKLSAqIFJHQkEtPlJHQjoKLSAqICAgICBTRExfU1JDQUxQSEEgc2V0OgotICogCWFscGhhLWJsZW5kICh1c2luZyBhbHBoYS1jaGFubmVsKS4KLSAqIAlTRExfU1JDQ09MT1JLRVkgaWdub3JlZC4KLSAqICAgICBTRExfU1JDQUxQSEEgbm90IHNldDoKLSAqIAljb3B5IFJHQi4KLSAqIAlpZiBTRExfU1JDQ09MT1JLRVkgc2V0LCBvbmx5IGNvcHkgdGhlIHBpeGVscyBtYXRjaGluZyB0aGUKLSAqIAlSR0IgdmFsdWVzIG9mIHRoZSBzb3VyY2UgY29sb3VyIGtleSwgaWdub3JpbmcgYWxwaGEgaW4gdGhlCi0gKiAJY29tcGFyaXNvbi4KLSAqIAotICogUkdCLT5SR0JBOgotICogICAgIFNETF9TUkNBTFBIQSBzZXQ6Ci0gKiAJYWxwaGEtYmxlbmQgKHVzaW5nIHRoZSBzb3VyY2UgcGVyLXN1cmZhY2UgYWxwaGEgdmFsdWUpOwotICogCXNldCBkZXN0aW5hdGlvbiBhbHBoYSB0byBvcGFxdWUuCi0gKiAgICAgU0RMX1NSQ0FMUEhBIG5vdCBzZXQ6Ci0gKiAJY29weSBSR0IsIHNldCBkZXN0aW5hdGlvbiBhbHBoYSB0byBzb3VyY2UgcGVyLXN1cmZhY2UgYWxwaGEgdmFsdWUuCi0gKiAgICAgYm90aDoKLSAqIAlpZiBTRExfU1JDQ09MT1JLRVkgc2V0LCBvbmx5IGNvcHkgdGhlIHBpeGVscyBtYXRjaGluZyB0aGUKLSAqIAlzb3VyY2UgY29sb3VyIGtleS4KLSAqIAotICogUkdCQS0+UkdCQToKLSAqICAgICBTRExfU1JDQUxQSEEgc2V0OgotICogCWFscGhhLWJsZW5kICh1c2luZyB0aGUgc291cmNlIGFscGhhIGNoYW5uZWwpIHRoZSBSR0IgdmFsdWVzOwotICogCWxlYXZlIGRlc3RpbmF0aW9uIGFscGhhIHVudG91Y2hlZC4gW05vdGU6IGlzIHRoaXMgY29ycmVjdD9dCi0gKiAJU0RMX1NSQ0NPTE9SS0VZIGlnbm9yZWQuCi0gKiAgICAgU0RMX1NSQ0FMUEhBIG5vdCBzZXQ6Ci0gKiAJY29weSBhbGwgb2YgUkdCQSB0byB0aGUgZGVzdGluYXRpb24uCi0gKiAJaWYgU0RMX1NSQ0NPTE9SS0VZIHNldCwgb25seSBjb3B5IHRoZSBwaXhlbHMgbWF0Y2hpbmcgdGhlCi0gKiAJUkdCIHZhbHVlcyBvZiB0aGUgc291cmNlIGNvbG91ciBrZXksIGlnbm9yaW5nIGFscGhhIGluIHRoZQotICogCWNvbXBhcmlzb24uCi0gKiAKLSAqIFJHQi0+UkdCOiAKLSAqICAgICBTRExfU1JDQUxQSEEgc2V0OgotICogCWFscGhhLWJsZW5kICh1c2luZyB0aGUgc291cmNlIHBlci1zdXJmYWNlIGFscGhhIHZhbHVlKS4KLSAqICAgICBTRExfU1JDQUxQSEEgbm90IHNldDoKLSAqIAljb3B5IFJHQi4KLSAqICAgICBib3RoOgotICogCWlmIFNETF9TUkNDT0xPUktFWSBzZXQsIG9ubHkgY29weSB0aGUgcGl4ZWxzIG1hdGNoaW5nIHRoZQotICogCXNvdXJjZSBjb2xvdXIga2V5LgotICoKLSAqIElmIGVpdGhlciBvZiB0aGUgc3VyZmFjZXMgd2VyZSBpbiB2aWRlbyBtZW1vcnksIGFuZCB0aGUgYmxpdCByZXR1cm5zIC0yLAotICogdGhlIHZpZGVvIG1lbW9yeSB3YXMgbG9zdCwgc28gaXQgc2hvdWxkIGJlIHJlbG9hZGVkIHdpdGggYXJ0d29yayBhbmQgCi0gKiByZS1ibGl0dGVkOgotCXdoaWxlICggU0RMX0JsaXRTdXJmYWNlKGltYWdlLCBpbWdyZWN0LCBzY3JlZW4sIGRzdHJlY3QpID09IC0yICkgewotCQl3aGlsZSAoIFNETF9Mb2NrU3VyZmFjZShpbWFnZSkgPCAwICkKLQkJCVNsZWVwKDEwKTsKLQkJLS0gV3JpdGUgaW1hZ2UgcGl4ZWxzIHRvIGltYWdlLT5waXhlbHMgLS0KLQkJU0RMX1VubG9ja1N1cmZhY2UoaW1hZ2UpOwotCX0KLSAqIFRoaXMgaGFwcGVucyB1bmRlciBEaXJlY3RYIDUuMCB3aGVuIHRoZSBzeXN0ZW0gc3dpdGNoZXMgYXdheSBmcm9tIHlvdXIKLSAqIGZ1bGxzY3JlZW4gYXBwbGljYXRpb24uICBUaGUgbG9jayB3aWxsIGFsc28gZmFpbCB1bnRpbCB5b3UgaGF2ZSBhY2Nlc3MKLSAqIHRvIHRoZSB2aWRlbyBtZW1vcnkgYWdhaW4uCi0gKi8KLS8qIFlvdSBzaG91bGQgY2FsbCBTRExfQmxpdFN1cmZhY2UoKSB1bmxlc3MgeW91IGtub3cgZXhhY3RseSBob3cgU0RMCi0gICBibGl0dGluZyB3b3JrcyBpbnRlcm5hbGx5IGFuZCBob3cgdG8gdXNlIHRoZSBvdGhlciBibGl0IGZ1bmN0aW9ucy4KLSovCi0jZGVmaW5lIFNETF9CbGl0U3VyZmFjZSBTRExfVXBwZXJCbGl0Ci0KLS8qIFRoaXMgaXMgdGhlIHB1YmxpYyBibGl0IGZ1bmN0aW9uLCBTRExfQmxpdFN1cmZhY2UoKSwgYW5kIGl0IHBlcmZvcm1zCi0gICByZWN0YW5nbGUgdmFsaWRhdGlvbiBhbmQgY2xpcHBpbmcgYmVmb3JlIHBhc3NpbmcgaXQgdG8gU0RMX0xvd2VyQmxpdCgpCi0qLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9VcHBlckJsaXQKLQkJCShTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLQkJCSBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCk7Ci0vKiBUaGlzIGlzIGEgc2VtaS1wcml2YXRlIGJsaXQgZnVuY3Rpb24gYW5kIGl0IHBlcmZvcm1zIGxvdy1sZXZlbCBzdXJmYWNlCi0gICBibGl0dGluZyBvbmx5LgotKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfTG93ZXJCbGl0Ci0JCQkoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCi0JCQkgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpOwotCi0vKgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGZhc3QgZmlsbCBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIHdpdGggJ2NvbG9yJwotICogVGhlIGdpdmVuIHJlY3RhbmdsZSBpcyBjbGlwcGVkIHRvIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlIGNsaXAgYXJlYQotICogYW5kIHRoZSBmaW5hbCBmaWxsIHJlY3RhbmdsZSBpcyBzYXZlZCBpbiB0aGUgcGFzc2VkIGluIHBvaW50ZXIuCi0gKiBJZiAnZHN0cmVjdCcgaXMgTlVMTCwgdGhlIHdob2xlIHN1cmZhY2Ugd2lsbCBiZSBmaWxsZWQgd2l0aCAnY29sb3InCi0gKiBUaGUgY29sb3Igc2hvdWxkIGJlIGEgcGl4ZWwgb2YgdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBzdXJmYWNlLCBhbmQgCi0gKiBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBTRExfTWFwUkdCKCkgZnVuY3Rpb24uCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBlcnJvci4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9GaWxsUmVjdAotCQkoU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QsIFVpbnQzMiBjb2xvcik7Ci0KLS8qIAotICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHN1cmZhY2UgYW5kIGNvcGllcyBpdCB0byBhIG5ldyBzdXJmYWNlIG9mIHRoZQotICogcGl4ZWwgZm9ybWF0IGFuZCBjb2xvcnMgb2YgdGhlIHZpZGVvIGZyYW1lYnVmZmVyLCBzdWl0YWJsZSBmb3IgZmFzdAotICogYmxpdHRpbmcgb250byB0aGUgZGlzcGxheSBzdXJmYWNlLiAgSXQgY2FsbHMgU0RMX0NvbnZlcnRTdXJmYWNlKCkKLSAqCi0gKiBJZiB5b3Ugd2FudCB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXJkd2FyZSBjb2xvcmtleSBvciBhbHBoYSBibGl0Ci0gKiBhY2NlbGVyYXRpb24sIHlvdSBzaG91bGQgc2V0IHRoZSBjb2xvcmtleSBhbmQgYWxwaGEgdmFsdWUgYmVmb3JlCi0gKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gKgotICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMgb3IgcnVucyBvdXQgb2YgbWVtb3J5LCBpdCByZXR1cm5zIE5VTEwKLSAqLwotZXh0ZXJuIERFQ0xTUEVDIFNETF9TdXJmYWNlICogU0RMQ0FMTCBTRExfRGlzcGxheUZvcm1hdChTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0KLS8qIAotICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHN1cmZhY2UgYW5kIGNvcGllcyBpdCB0byBhIG5ldyBzdXJmYWNlIG9mIHRoZQotICogcGl4ZWwgZm9ybWF0IGFuZCBjb2xvcnMgb2YgdGhlIHZpZGVvIGZyYW1lYnVmZmVyIChpZiBwb3NzaWJsZSksCi0gKiBzdWl0YWJsZSBmb3IgZmFzdCBhbHBoYSBibGl0dGluZyBvbnRvIHRoZSBkaXNwbGF5IHN1cmZhY2UuCi0gKiBUaGUgbmV3IHN1cmZhY2Ugd2lsbCBhbHdheXMgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLgotICoKLSAqIElmIHlvdSB3YW50IHRvIHRha2UgYWR2YW50YWdlIG9mIGhhcmR3YXJlIGNvbG9ya2V5IG9yIGFscGhhIGJsaXQKLSAqIGFjY2VsZXJhdGlvbiwgeW91IHNob3VsZCBzZXQgdGhlIGNvbG9ya2V5IGFuZCBhbHBoYSB2YWx1ZSBiZWZvcmUKLSAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBJZiB0aGUgY29udmVyc2lvbiBmYWlscyBvciBydW5zIG91dCBvZiBtZW1vcnksIGl0IHJldHVybnMgTlVMTAotICovCi1leHRlcm4gREVDTFNQRUMgU0RMX1N1cmZhY2UgKiBTRExDQUxMIFNETF9EaXNwbGF5Rm9ybWF0QWxwaGEoU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0KLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLS8qIFlVViB2aWRlbyBzdXJmYWNlIG92ZXJsYXkgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLQotLyogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgdmlkZW8gb3V0cHV0IG92ZXJsYXkKLSAgIENhbGxpbmcgdGhlIHJldHVybmVkIHN1cmZhY2UgYW4gb3ZlcmxheSBpcyBzb21ldGhpbmcgb2YgYSBtaXNub21lciBiZWNhdXNlCi0gICB0aGUgY29udGVudHMgb2YgdGhlIGRpc3BsYXkgc3VyZmFjZSB1bmRlcm5lYXRoIHRoZSBhcmVhIHdoZXJlIHRoZSBvdmVybGF5Ci0gICBpcyBzaG93biBpcyB1bmRlZmluZWQgLSBpdCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgY29udmVydGVkIFlVViBkYXRhLgotKi8KLWV4dGVybiBERUNMU1BFQyBTRExfT3ZlcmxheSAqIFNETENBTEwgU0RMX0NyZWF0ZVlVVk92ZXJsYXkoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotCQkJCVVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KTsKLQotLyogTG9jayBhbiBvdmVybGF5IGZvciBkaXJlY3QgYWNjZXNzLCBhbmQgdW5sb2NrIGl0IHdoZW4geW91IGFyZSBkb25lICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0xvY2tZVVZPdmVybGF5KFNETF9PdmVybGF5ICpvdmVybGF5KTsKLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1VubG9ja1lVVk92ZXJsYXkoU0RMX092ZXJsYXkgKm92ZXJsYXkpOwotCi0vKiBCbGl0IGEgdmlkZW8gb3ZlcmxheSB0byB0aGUgZGlzcGxheSBzdXJmYWNlLgotICAgVGhlIGNvbnRlbnRzIG9mIHRoZSB2aWRlbyBzdXJmYWNlIHVuZGVybmVhdGggdGhlIGJsaXQgZGVzdGluYXRpb24gYXJlCi0gICBub3QgZGVmaW5lZC4gIAotICAgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSBtYXkgYmUgZGlmZmVyZW50IGZyb20KLSAgIHRoYXQgb2YgdGhlIG92ZXJsYXksIGJ1dCBjdXJyZW50bHkgb25seSAyeCBzY2FsaW5nIGlzIHN1cHBvcnRlZC4KLSovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0Rpc3BsYXlZVVZPdmVybGF5KFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqZHN0cmVjdCk7Ci0KLS8qIEZyZWUgYSB2aWRlbyBvdmVybGF5ICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9GcmVlWVVWT3ZlcmxheShTRExfT3ZlcmxheSAqb3ZlcmxheSk7Ci0KLQotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotLyogT3BlbkdMIHN1cHBvcnQgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotCi0vKgotICogRHluYW1pY2FsbHkgbG9hZCBhbiBPcGVuR0wgbGlicmFyeSwgb3IgdGhlIGRlZmF1bHQgb25lIGlmIHBhdGggaXMgTlVMTAotICoKLSAqIElmIHlvdSBkbyB0aGlzLCB5b3UgbmVlZCB0byByZXRyaWV2ZSBhbGwgb2YgdGhlIEdMIGZ1bmN0aW9ucyB1c2VkIGluCi0gKiB5b3VyIHByb2dyYW0gZnJvbSB0aGUgZHluYW1pYyBsaWJyYXJ5IHVzaW5nIFNETF9HTF9HZXRQcm9jQWRkcmVzcygpLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0dMX0xvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpOwotCi0vKgotICogR2V0IHRoZSBhZGRyZXNzIG9mIGEgR0wgZnVuY3Rpb24KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgKiBTRExDQUxMIFNETF9HTF9HZXRQcm9jQWRkcmVzcyhjb25zdCBjaGFyKiBwcm9jKTsKLQotLyoKLSAqIFNldCBhbiBhdHRyaWJ1dGUgb2YgdGhlIE9wZW5HTCBzdWJzeXN0ZW0gYmVmb3JlIGludGlhbGl6YXRpb24uCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfR0xfU2V0QXR0cmlidXRlKFNETF9HTGF0dHIgYXR0ciwgaW50IHZhbHVlKTsKLQotLyoKLSAqIEdldCBhbiBhdHRyaWJ1dGUgb2YgdGhlIE9wZW5HTCBzdWJzeXN0ZW0gZnJvbSB0aGUgd2luZG93aW5nCi0gKiBpbnRlcmZhY2UsIHN1Y2ggYXMgZ2xYLiBUaGlzIGlzIG9mIGNvdXJzZSBkaWZmZXJlbnQgZnJvbSBnZXR0aW5nCi0gKiB0aGUgdmFsdWVzIGZyb20gU0RMJ3MgaW50ZXJuYWwgT3BlbkdMIHN1YnN5c3RlbSwgd2hpY2ggb25seQotICogc3RvcmVzIHRoZSB2YWx1ZXMgeW91IHJlcXVlc3QgYmVmb3JlIGluaXRpYWxpemF0aW9uLgotICoKLSAqIERldmVsb3BlcnMgc2hvdWxkIHRyYWNrIHRoZSB2YWx1ZXMgdGhleSBwYXNzIGludG8gU0RMX0dMX1NldEF0dHJpYnV0ZQotICogdGhlbXNlbHZlcyBpZiB0aGV5IHdhbnQgdG8gcmV0cmlldmUgdGhlc2UgdmFsdWVzLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0dMX0dldEF0dHJpYnV0ZShTRExfR0xhdHRyIGF0dHIsIGludCogdmFsdWUpOwotCi0vKgotICogU3dhcCB0aGUgT3BlbkdMIGJ1ZmZlcnMsIGlmIGRvdWJsZS1idWZmZXJpbmcgaXMgc3VwcG9ydGVkLgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9HTF9Td2FwQnVmZmVycyh2b2lkKTsKLQotLyoKLSAqIEludGVybmFsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgY2FsbGVkIHVubGVzcyB5b3UgaGF2ZSByZWFkCi0gKiBhbmQgdW5kZXJzdG9vZCB0aGUgc291cmNlIGNvZGUgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfR0xfVXBkYXRlUmVjdHMoaW50IG51bXJlY3RzLCBTRExfUmVjdCogcmVjdHMpOwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfR0xfTG9jayh2b2lkKTsKLWV4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0dMX1VubG9jayh2b2lkKTsKLQotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotLyogVGhlc2UgZnVuY3Rpb25zIGFsbG93IGludGVyYWN0aW9uIHdpdGggdGhlIHdpbmRvdyBtYW5hZ2VyLCBpZiBhbnkuICAgICAgICAqLwotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotCi0vKgotICogU2V0cy9HZXRzIHRoZSB0aXRsZSBhbmQgaWNvbiB0ZXh0IG9mIHRoZSBkaXNwbGF5IHdpbmRvdyAoVVRGLTggZW5jb2RlZCkKLSAqLwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfV01fU2V0Q2FwdGlvbihjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7Ci1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9XTV9HZXRDYXB0aW9uKGNoYXIgKip0aXRsZSwgY2hhciAqKmljb24pOwotCi0vKgotICogU2V0cyB0aGUgaWNvbiBmb3IgdGhlIGRpc3BsYXkgd2luZG93LgotICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gU0RMX1NldFZpZGVvTW9kZSgpLgotICogSXQgdGFrZXMgYW4gaWNvbiBzdXJmYWNlLCBhbmQgYSBtYXNrIGluIE1TQiBmb3JtYXQuCi0gKiBJZiAnbWFzaycgaXMgTlVMTCwgdGhlIGVudGlyZSBpY29uIHN1cmZhY2Ugd2lsbCBiZSB1c2VkIGFzIHRoZSBpY29uLgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9XTV9TZXRJY29uKFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzayk7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGljb25pZmllcyB0aGUgd2luZG93LCBhbmQgcmV0dXJucyAxIGlmIGl0IHN1Y2NlZWRlZC4KLSAqIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgaXQgZ2VuZXJhdGVzIGFuIFNETF9BUFBBQ1RJVkUgbG9zcyBldmVudC4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgYSBub29wIGFuZCByZXR1cm5zIDAgaW4gbm9uLXdpbmRvd2VkIGVudmlyb25tZW50cy4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9XTV9JY29uaWZ5V2luZG93KHZvaWQpOwotCi0vKgotICogVG9nZ2xlIGZ1bGxzY3JlZW4gbW9kZSB3aXRob3V0IGNoYW5naW5nIHRoZSBjb250ZW50cyBvZiB0aGUgc2NyZWVuLgotICogSWYgdGhlIGRpc3BsYXkgc3VyZmFjZSBkb2VzIG5vdCByZXF1aXJlIGxvY2tpbmcgYmVmb3JlIGFjY2Vzc2luZwotICogdGhlIHBpeGVsIGluZm9ybWF0aW9uLCB0aGVuIHRoZSBtZW1vcnkgcG9pbnRlcnMgd2lsbCBub3QgY2hhbmdlLgotICoKLSAqIElmIHRoaXMgZnVuY3Rpb24gd2FzIGFibGUgdG8gdG9nZ2xlIGZ1bGxzY3JlZW4gbW9kZSAoY2hhbmdlIGZyb20gCi0gKiBydW5uaW5nIGluIGEgd2luZG93IHRvIGZ1bGxzY3JlZW4sIG9yIHZpY2UtdmVyc2EpLCBpdCB3aWxsIHJldHVybiAxLgotICogSWYgaXQgaXMgbm90IGltcGxlbWVudGVkLCBvciBmYWlscywgaXQgcmV0dXJucyAwLgotICoKLSAqIFRoZSBuZXh0IGNhbGwgdG8gU0RMX1NldFZpZGVvTW9kZSgpIHdpbGwgc2V0IHRoZSBtb2RlIGZ1bGxzY3JlZW4KLSAqIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgZmxhZ3MgcGFyYW1ldGVyIC0gaWYgU0RMX0ZVTExTQ1JFRU4gaXMgbm90Ci0gKiBzZXQsIHRoZW4gdGhlIGRpc3BsYXkgd2lsbCBiZSB3aW5kb3dlZCBieSBkZWZhdWx0IHdoZXJlIHN1cHBvcnRlZC4KLSAqCi0gKiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIGluIHRoZSBYMTEgdmlkZW8gZHJpdmVyLgotICovCi1leHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1dNX1RvZ2dsZUZ1bGxTY3JlZW4oU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0vKgotICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCBhbmQgcXVlcnkgdGhlIGlucHV0IGdyYWIgc3RhdGUgb2YKLSAqIHRoZSBhcHBsaWNhdGlvbi4gIEl0IHJldHVybnMgdGhlIG5ldyBpbnB1dCBncmFiIHN0YXRlLgotICovCi10eXBlZGVmIGVudW0gewotCVNETF9HUkFCX1FVRVJZID0gLTEsCi0JU0RMX0dSQUJfT0ZGID0gMCwKLQlTRExfR1JBQl9PTiA9IDEsCi0JU0RMX0dSQUJfRlVMTFNDUkVFTgkvKiBVc2VkIGludGVybmFsbHkgKi8KLX0gU0RMX0dyYWJNb2RlOwotLyoKLSAqIEdyYWJiaW5nIG1lYW5zIHRoYXQgdGhlIG1vdXNlIGlzIGNvbmZpbmVkIHRvIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3csCi0gKiBhbmQgbmVhcmx5IGFsbCBrZXlib2FyZCBpbnB1dCBpcyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGFwcGxpY2F0aW9uLAotICogYW5kIG5vdCBpbnRlcnByZXRlZCBieSBhIHdpbmRvdyBtYW5hZ2VyLCBpZiBhbnkuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBTRExfR3JhYk1vZGUgU0RMQ0FMTCBTRExfV01fR3JhYklucHV0KFNETF9HcmFiTW9kZSBtb2RlKTsKLQotLyoKLSAqIE1vdmUgdGhlIFNETCBXaW5kb3cgdG8gYSBzcGVjaWZ5IHBvc2l0aW9uLiBkb2VzIG5vdGhpbmcgaW4gZnVsbHNjcmVlbiBtb2RlCi0gKgotICovCi1leHRlcm4gREVDTFNQRUMgdm9pZCAgU0RMX1dNX1NldFBvcyhpbnQgIHgsICBpbnQgIHkpOwotCi0vKgotICogR2V0IHRoZSBjdXJyZW50IFNETCB3aW5kb3cgcG9zaXRpb24uIHJldHVybnMgKDAsMCkgaW4gZnVsbHNjcmVlbiBtb2RlCi0gKi8KLWV4dGVybiBERUNMU1BFQyB2b2lkICBTRExfV01fR2V0UG9zKGludCAgKnB4LCBpbnQgICpweSk7Ci0KLS8qCi0gKiBJZiB0aGUgd2luZG93IGlzIGZ1bGx5IHZpc2libGUsIHJldHVybiBUUlVFOyBvdGhlcndpc2UsIHJlY2VudGVyIHRoZSB3aW5kb3cKLSAqIGlmIHRoZSAncmVjZW50ZXInIHBhcmFtZXRlciBpcyBub24tMCwgYW5kIHJldHVybiBGQUxTRS4KLSAqLwotZXh0ZXJuIERFQ0xTUEVDIGludCAgIFNETF9XTV9Jc0Z1bGx5VmlzaWJsZSggaW50ICByZWNlbnRlciApOwotCi0vKgotICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBtYWluIG1vbml0b3IgaW4gRFBJcywgaWYgYXZhaWxhYmxlLgotICogUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgLTEgaWYgdGhlIGRhdGEgaXMgbm90IGF2YWlsYWJsZQotICovCi1leHRlcm4gREVDTFNQRUMgaW50ICAgU0RMX1dNX0dldE1vbml0b3JEUEkoIGludCAgKnhEcGksIGludCAgKnlEcGkgKTsKLQotLyoKLSAqIEdldCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIG1vbml0b3IgaW4gdmlydHVhbCBkZXNrdG9wIHNwYWNlLgotICogSW4gdGhlIGNhc2Ugb2YgbXVsdGktbW9uaXRvciBzeXN0ZW1zLCByZXR1cm5zIHRoZSByZWN0YW5nbGUgb2YKLSAqIHRoZSAnbmVhcmVzdCcgbW9uaXRvciByZWxhdGl2ZSB0byB0aGUgbWFpbiBTRExfd2luZG93LgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHRoZSBkYXRhIGlzIG5vdCBhdmFpbGFibGUuCi0gKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgICBTRExfV01fR2V0TW9uaXRvclJlY3QoIFNETF9SZWN0ICAqcmVjdCApOwotCi0vKiBOb3QgaW4gcHVibGljIEFQSSBhdCB0aGUgbW9tZW50IC0gZG8gbm90IHVzZSEgKi8KLWV4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfU29mdFN0cmV0Y2goU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIAotLyogRW5kcyBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoZW4gdXNpbmcgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKLQotI2VuZGlmIC8qIF9TRExfdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvYmVnaW5fY29kZS5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvYmVnaW5fY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDM3ODdmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL2JlZ2luX2NvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiBUaGlzIGZpbGUgc2V0cyB0aGluZ3MgdXAgZm9yIEMgZHluYW1pYyBsaWJyYXJ5IGZ1bmN0aW9uIGRlZmluaXRpb25zLAotICAgc3RhdGljIGlubGluZWQgZnVuY3Rpb25zLCBhbmQgc3RydWN0dXJlcyBhbGlnbmVkIGF0IDQtYnl0ZSBhbGlnbm1lbnQuCi0gICBJZiB5b3UgZG9uJ3QgbGlrZSB1Z2x5IEMgcHJlcHJvY2Vzc29yIGNvZGUsIGRvbid0IGxvb2sgYXQgdGhpcyBmaWxlLiA6KQotKi8KLQotLyogVGhpcyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tIGluY2x1ZGVkIGl0IGFyb3VuZCBjb2RlIG9ubHkuICovCi0jaWZkZWYgX2JlZ2luX2NvZGVfaAotI2Vycm9yIE5lc3RlZCBpbmNsdXNpb24gb2YgYmVnaW5fY29kZS5oCi0jZW5kaWYKLSNkZWZpbmUgX2JlZ2luX2NvZGVfaAotCi0vKiBTb21lIGNvbXBpbGVycyB1c2UgYSBzcGVjaWFsIGV4cG9ydCBrZXl3b3JkICovCi0jaWZuZGVmIERFQ0xTUEVDCi0jIGlmIGRlZmluZWQoX19CRU9TX18pCi0jICBpZiBkZWZpbmVkKF9fR05VQ19fKQotIyAgIGRlZmluZSBERUNMU1BFQwlfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgIGVsc2UKLSMgICBkZWZpbmUgREVDTFNQRUMJX19kZWNsc3BlYyhleHBvcnQpCi0jICBlbmRpZgotIyBlbGlmIGRlZmluZWQoX19XSU4zMl9fKQotIyAgaWZkZWYgX19CT1JMQU5EQ19fCi0jICAgaWZkZWYgQlVJTERfU0RMCi0jICAgIGRlZmluZSBERUNMU1BFQyAKLSMgICBlbHNlCi0jICAgIGRlZmluZSBERUNMU1BFQwlfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICBlbmRpZgotIyAgZWxzZQotIyAgIGRlZmluZSBERUNMU1BFQwlfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgIGVuZGlmCi0jIGVsaWYgZGVmaW5lZChfX09TMl9fKQotIyAgaWZkZWYgX19XQVRDT01DX18KLSMgICBpZmRlZiBCVUlMRF9TREwKLSMgICAgZGVmaW5lIERFQ0xTUEVDCV9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgIGVsc2UKLSMgICAgZGVmaW5lIERFQ0xTUEVDCi0jICAgZW5kaWYKLSMgIGVsc2UKLSMgICBkZWZpbmUgREVDTFNQRUMKLSMgIGVuZGlmCi0jIGVsc2UKLSMgIGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQKLSMgICBkZWZpbmUgREVDTFNQRUMJX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCi0jICBlbHNlCi0jICAgZGVmaW5lIERFQ0xTUEVDCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEJ5IGRlZmF1bHQgU0RMIHVzZXMgdGhlIEMgY2FsbGluZyBjb252ZW50aW9uICovCi0jaWZuZGVmIFNETENBTEwKLSNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX19HTlVDX18pCi0jZGVmaW5lIFNETENBTEwgX19jZGVjbAotI2Vsc2UKLSNpZmRlZiBfX09TMl9fCi0vKiBCdXQgb24gT1MvMiwgd2UgdXNlIHRoZSBfU3lzdGVtIGNhbGxpbmcgY29udmVudGlvbiAqLwotLyogdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV2ZXJ5IGNvbXBpbGVyICovCi0jZGVmaW5lIFNETENBTEwgX1N5c3RlbQotI2Vsc2UKLSNkZWZpbmUgU0RMQ0FMTAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZiAvKiBTRExDQUxMICovCi0KLSNpZmRlZiBfX1NZTUJJQU4zMl9fIAotI2lmbmRlZiBFS0EyIAotI3VuZGVmIERFQ0xTUEVDCi0jZGVmaW5lIERFQ0xTUEVDCi0jZWxpZiAhZGVmaW5lZChfX1dJTlNfXykKLSN1bmRlZiBERUNMU1BFQwotI2RlZmluZSBERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSNlbmRpZiAvL0VLQTIKLSNlbmRpZiAvL19fU1lNQklBTjMyX18KLQotLyogRm9yY2Ugc3RydWN0dXJlIHBhY2tpbmcgYXQgNCBieXRlIGFsaWdubWVudC4KLSAgIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIHRoZSBoZWFkZXIgaXMgaW5jbHVkZWQgaW4gY29kZSB3aGljaCBoYXMgc3RydWN0dXJlCi0gICBwYWNraW5nIHNldCB0byBhbiBhbHRlcm5hdGUgdmFsdWUsIHNheSBmb3IgbG9hZGluZyBzdHJ1Y3R1cmVzIGZyb20gZGlzay4KLSAgIFRoZSBwYWNraW5nIGlzIHJlc2V0IHRvIHRoZSBwcmV2aW91cyB2YWx1ZSBpbiBjbG9zZV9jb2RlLmgKLSAqLwotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NV0VSS1NfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jaWZkZWYgX01TQ19WRVIKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MTAzKQotI2VuZGlmCi0jaWZkZWYgX19CT1JMQU5EQ19fCi0jcHJhZ21hIG5vcGFja3dhcm5pbmcKLSNlbmRpZgotI3ByYWdtYSBwYWNrKHB1c2gsNCkKLSNlbGlmIChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoX19NQUNPU19fKSkKLSNwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGs0Ynl0ZQotI3ByYWdtYSBlbnVtc2Fsd2F5c2ludCBvbgotI2VuZGlmIC8qIENvbXBpbGVyIG5lZWRzIHN0cnVjdHVyZSBwYWNraW5nIHNldCAqLwotCi0vKiBTZXQgdXAgY29tcGlsZXItc3BlY2lmaWMgb3B0aW9ucyBmb3IgaW5saW5pbmcgZnVuY3Rpb25zICovCi0jaWZuZGVmIFNETF9JTkxJTkVfT0tBWQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIFNETF9JTkxJTkVfT0tBWQotI2Vsc2UKLS8qIEFkZCBhbnkgc3BlY2lhbCBjb21waWxlci1zcGVjaWZpYyBjYXNlcyBoZXJlICovCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IFwKLSAgICBkZWZpbmVkKF9fRE1DX18pIHx8IGRlZmluZWQoX19TQ19fKSB8fCBcCi0gICAgZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChfX0xDQ19fKSB8fCBcCi0gICAgZGVmaW5lZChfX0RFQ0MpIHx8IGRlZmluZWQoX19FQUJJX18pCi0jaWZuZGVmIF9faW5saW5lX18KLSNkZWZpbmUgX19pbmxpbmVfXwlfX2lubGluZQotI2VuZGlmCi0jZGVmaW5lIFNETF9JTkxJTkVfT0tBWQotI2Vsc2UKLSNpZiAhZGVmaW5lZChfX01SQ19fKSAmJiAhZGVmaW5lZChfU0dJX1NPVVJDRSkKLSNpZm5kZWYgX19pbmxpbmVfXwotI2RlZmluZSBfX2lubGluZV9fIGlubGluZQotI2VuZGlmCi0jZGVmaW5lIFNETF9JTkxJTkVfT0tBWQotI2VuZGlmIC8qIE5vdCBhIGZ1bmt5IGNvbXBpbGVyICovCi0jZW5kaWYgLyogVmlzdWFsIEMrKyAqLwotI2VuZGlmIC8qIEdOVSBDICovCi0jZW5kaWYgLyogU0RMX0lOTElORV9PS0FZICovCi0KLS8qIElmIGlubGluaW5nIGlzbid0IHN1cHBvcnRlZCwgcmVtb3ZlICJfX2lubGluZV9fIiwgdHVybmluZyBzdGF0aWMKLSAgIGlubGluZWQgZnVuY3Rpb25zIGludG8gc3RhdGljIGZ1bmN0aW9ucyAocmVzdWx0aW5nIGluIGNvZGUgYmxvYXQKLSAgIGluIGFsbCBmaWxlcyB3aGljaCBpbmNsdWRlIHRoZSBvZmZlbmRpbmcgaGVhZGVyIGZpbGVzKQotKi8KLSNpZm5kZWYgU0RMX0lOTElORV9PS0FZCi0jZGVmaW5lIF9faW5saW5lX18KLSNlbmRpZgotCi0vKiBBcHBhcmVudGx5IHRoaXMgaXMgbmVlZGVkIGJ5IHNldmVyYWwgV2luZG93cyBjb21waWxlcnMgKi8KLSNpZiAhZGVmaW5lZChfX01BQ0hfXykKLSNpZm5kZWYgTlVMTAotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIE5VTEwgMAotI2Vsc2UKLSNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQotI2VuZGlmCi0jZW5kaWYgLyogTlVMTCAqLwotI2VuZGlmIC8qICEgTWFjIE9TIFggLSBicmVha3MgcHJlY29tcGlsZWQgaGVhZGVycyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvY2xvc2VfY29kZS5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvY2xvc2VfY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmJiNjUwLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL2Nsb3NlX2NvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qIFRoaXMgZmlsZSByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiBiZWdpbl9jb2RlLmggYW5kIHNob3VsZCBiZSBpbmNsdWRlZAotICAgYWZ0ZXIgeW91IGZpbmlzaCBhbnkgZnVuY3Rpb24gYW5kIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgaW4geW91ciBoZWFkZXJzCi0qLwotCi0jdW5kZWYgX2JlZ2luX2NvZGVfaAotCi0vKiBSZXNldCBzdHJ1Y3R1cmUgcGFja2luZyBhdCBwcmV2aW91cyBieXRlIGFsaWdubWVudCAqLwotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NV0VSS1NfXykgfHwgZGVmaW5lZChfX1dBVENPTUNfXykgIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQotI2lmZGVmIF9fQk9STEFORENfXwotI3ByYWdtYSBub3BhY2t3YXJuaW5nCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKF9fTUFDT1NfXykpCi0jcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKLSNwcmFnbWEgZW51bXNhbHdheXNpbnQgcmVzZXQKLSNlbHNlCi0jcHJhZ21hIHBhY2socG9wKQotI2VuZGlmCi0jZW5kaWYgLyogQ29tcGlsZXIgbmVlZHMgc3RydWN0dXJlIHBhY2tpbmcgc2V0ICovCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zb3VyY2VzLm1ha2UgYi9kaXN0cmliL3NkbC0xLjIuMTIvc291cmNlcy5tYWtlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWRjYjNmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zb3VyY2VzLm1ha2UKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotIyBUaGlzIGlzIGluY2x1ZGVkIGZyb20gdGhlIG1haW4gQW5kcm9pZCBlbXVsYXRvciBidWlsZCBzY3JpcHQKLSMgdG8gZGVjbGFyZSB0aGUgU0RMLXJlbGF0ZWQgc291cmNlcywgY29tcGlsZXIgZmxhZ3MgYW5kIGxpYnJhcmllcwotIwotCi1TRExfQ0ZMQUdTIDo9Ci1TRExfTERMSUJTIDo9Ci1TRExfU1RBVElDX0xJQlJBUklFUyA6PQotCi1TRExfU09VUkNFUyA6PQotCi1pZmVxICgkKEhPU1RfT1MpLGxpbnV4KQotICAgIFNETF9DT05GSUdfTE9BRFNPX0RMT1BFTiA6PSB5ZXMKLSAgICBTRExfQ09ORklHX1RIUkVBRF9QVEhSRUFEIDo9IHllcwotICAgIFNETF9DT05GSUdfVEhSRUFEX1BUSFJFQURfUkVDVVJTSVZFX01VVEVYX05QIDo9IHllcwotICAgIFNETF9DT05GSUdfVElNRVJfVU5JWCA6PSB5ZXMKLSAgICBTRExfQ09ORklHX1ZJREVPX1gxMSA6PSB5ZXMKLSAgICBTRExfQ09ORklHX1ZJREVPX1gxMV9EUE1TIDo9IHllcwotICAgIFNETF9DT05GSUdfVklERU9fWDExX1hJTkVSQU1BIDo9IHllcwotICAgIFNETF9DT05GSUdfVklERU9fWDExX1hNRSA6PSB5ZXMKLSAgICBTRExfQ09ORklHX01BSU5fRFVNTVkgOj0geWVzCi0KLSAgICBTRExfQ0ZMQUdTICs9IC1EX0dOVV9TT1VSQ0U9MSAtRF9SRUVOVFJBTlQKLSAgICBTRExfTERMSUJTICs9IC1sbSAtbGRsIC1scHRocmVhZCAtbHJ0Ci1lbmRpZgotCi1pZmVxICgkKEhPU1RfT1MpLGZyZWVic2QpCi0gICAgU0RMX0NPTkZJR19MT0FEU09fRExPUEVOIDo9IHllcwotICAgIFNETF9DT05GSUdfVEhSRUFEX1BUSFJFQUQgOj0geWVzCi0gICAgU0RMX0NPTkZJR19USFJFQURfUFRIUkVBRF9SRUNVUlNJVkVfTVVURVggOj0geWVzCi0gICAgU0RMX0NPTkZJR19USU1FUl9VTklYIDo9IHllcwotICAgIFNETF9DT05GSUdfVklERU9fWDExIDo9IHllcwotICAgIFNETF9DT05GSUdfVklERU9fWDExX0RQTVMgOj0geWVzCi0gICAgU0RMX0NPTkZJR19WSURFT19YMTFfWElORVJBTUEgOj0geWVzCi0gICAgU0RMX0NPTkZJR19WSURFT19YMTFfWE1FIDo9IHllcwotICAgIFNETF9DT05GSUdfTUFJTl9EVU1NWSA6PSB5ZXMKLQotICAgIFNETF9DRkxBR1MgKz0gLURfR05VX1NPVVJDRT0xIC1EX1JFRU5UUkFOVAotICAgIFNETF9MRExJQlMgKz0gLWxtIC1sZGwgLWxwdGhyZWFkCi1lbmRpZgotCi1pZmVxICgkKEhPU1RfT1MpLGRhcndpbikKLSAgICBTRExfQ09ORklHX0xPQURTT19ETENPTVBBVCA6PSB5ZXMKLSAgICBTRExfQ09ORklHX1RIUkVBRF9QVEhSRUFEIDo9IHllcwotICAgIFNETF9DT05GSUdfVEhSRUFEX1BUSFJFQURfUkVDVVJTSVZFX01VVEVYIDo9IHllcwotICAgIFNETF9DT05GSUdfVElNRVJfVU5JWCA6PSB5ZXMKLSAgICBTRExfQ09ORklHX1ZJREVPX1FVQVJUWiA6PSB5ZXMKLSAgICBTRExfQ09ORklHX01BSU5fTUFDT1NYIDo9IHllcwotCi0gICAgU0RMX0NGTEFHUyArPSAtRF9HTlVfU09VUkNFPTEgLURUSFJFQURfU0FGRQotICAgIEZSQU1FV09SS1MgOj0gT3BlbkdMIENvY29hIFF1aWNrVGltZSBBcHBsaWNhdGlvblNlcnZpY2VzIENhcmJvbiBJT0tpdAotICAgIFNETF9MRExJQlMgKz0gJChGUkFNRVdPUktTOiU9LVdsLC1mcmFtZXdvcmssJSkKLWVuZGlmCi0KLWlmZXEgKCQoSE9TVF9PUyksd2luZG93cykKLSAgICBTRExfQ09ORklHX0xPQURTT19XSU4zMiA6PSB5ZXMKLSAgICBTRExfQ09ORklHX1RIUkVBRF9XSU4zMiA6PSB5ZXMKLSAgICBTRExfQ09ORklHX1RJTUVSX1dJTjMyIDo9IHllcwotICAgIFNETF9DT05GSUdfVklERU9fV0lORElCIDo9IHllcwotICAgIFNETF9DT05GSUdfTUFJTl9XSU4zMiA6PSB5ZXMKLQotICAgIFNETF9DRkxBR1MgKz0gLURfR05VX1NPVVJDRT0xIC1EbWFpbj1TRExfbWFpbiAtRE5PX1NURElPX1JFRElSRUNUPTEKLSAgICBTRExfTERMSUJTICs9IC1sdXNlcjMyIC1sZ2RpMzIgLWx3aW5tbQotZW5kaWYKLQotCi0jIHRoZSBtYWluIHNyYy8gc291cmNlcwotIwotU1JDUyA6PSBTREwuYyBcCi0gICAgICAgIFNETF9lcnJvci5jIFwKLSAgICAgICAgU0RMX2ZhdGFsLmMgXAotCi1TUkNTICs9IGV2ZW50cy9TRExfYWN0aXZlLmMgXAotCWV2ZW50cy9TRExfZXZlbnRzLmMgXAotCWV2ZW50cy9TRExfZXhwb3NlLmMgXAotCWV2ZW50cy9TRExfa2V5Ym9hcmQuYyBcCi0JZXZlbnRzL1NETF9tb3VzZS5jIFwKLQlldmVudHMvU0RMX3F1aXQuYyBcCi0JZXZlbnRzL1NETF9yZXNpemUuYyBcCi0KLVNSQ1MgKz0gZmlsZS9TRExfcndvcHMuYwotCi1TUkNTICs9IHN0ZGxpYi9TRExfZ2V0ZW52LmMgXAotICAgICAgICBzdGRsaWIvU0RMX2ljb252LmMgXAotICAgICAgICBzdGRsaWIvU0RMX21hbGxvYy5jIFwKLSAgICAgICAgc3RkbGliL1NETF9xc29ydC5jIFwKLSAgICAgICAgc3RkbGliL1NETF9zdGRsaWIuYyBcCi0gICAgICAgIHN0ZGxpYi9TRExfc3RyaW5nLmMKLQotU1JDUyArPSBjcHVpbmZvL1NETF9jcHVpbmZvLmMKLQotU0RMX1NPVVJDRVMgKz0gJChTUkNTOiU9JChTRExfRElSKS9zcmMvJSkKLQotIyB0aGUgTG9hZFNPIHNvdXJjZXMKLSMKLQotU1JDUyA6PQotCi1pZmVxICgkKFNETF9DT05GSUdfTE9BRFNPX0RMT1BFTikseWVzKQotICBTUkNTICs9IGRsb3Blbi9TRExfc3lzbG9hZHNvLmMKLSAgU0RMX0xETElCUyArPSAtbGRsCi1lbmRpZgotCi1pZmVxICgkKFNETF9DT05GSUdfTE9BRFNPX0RMQ09NUEFUKSx5ZXMpCi0gIFNSQ1MgKz0gbWFjb3N4L1NETF9kbGNvbXBhdC5jCi1lbmRpZgotCi1pZmVxICgkKFNETF9DT05GSUdfTE9BRFNPX1dJTjMyKSx5ZXMpCi0gIFNSQ1MgKz0gd2luMzIvU0RMX3N5c2xvYWRzby5jCi1lbmRpZgotCi1TRExfU09VUkNFUyArPSAkKFNSQ1M6JT0kKFNETF9ESVIpL3NyYy9sb2Fkc28vJSkKLQotIyB0aGUgVGhyZWFkIHNvdXJjZXMKLSMKLQotU1JDUyA6PSBTRExfdGhyZWFkLmMKLQotaWZlcSAoJChTRExfQ09ORklHX1RIUkVBRF9QVEhSRUFEKSx5ZXMpCi0gIFNSQ1MgKz0gcHRocmVhZC9TRExfc3lzY29uZC5jIFwKLSAgICAgICAgICBwdGhyZWFkL1NETF9zeXNtdXRleC5jIFwKLSAgICAgICAgICBwdGhyZWFkL1NETF9zeXNzZW0uYyBcCi0gICAgICAgICAgcHRocmVhZC9TRExfc3lzdGhyZWFkLmMKLWVuZGlmCi0KLWlmZXEgKCQoU0RMX0NPTkZJR19USFJFQURfV0lOMzIpLHllcykKLSAgU1JDUyArPSB3aW4zMi9TRExfc3lzbXV0ZXguYyBcCi0gICAgICAgICAgd2luMzIvU0RMX3N5c3NlbS5jIFwKLSAgICAgICAgICB3aW4zMi9TRExfc3lzdGhyZWFkLmMKLWVuZGlmCi0KLVNETF9TT1VSQ0VTICs9ICQoU1JDUzolPSQoU0RMX0RJUikvc3JjL3RocmVhZC8lKQotCi0jIHRoZSBUaW1lciBzb3VyY2VzCi0jCi0KLVNSQ1MgOj0gU0RMX3RpbWVyLmMKLQotaWZlcSAoJChTRExfQ09ORklHX1RJTUVSX1VOSVgpLHllcykKLSAgU1JDUyArPSB1bml4L1NETF9zeXN0aW1lci5jCi1lbmRpZgotCi1pZmVxICgkKFNETF9DT05GSUdfVElNRVJfV0lOMzIpLHllcykKLSAgU1JDUyArPSB3aW4zMi9TRExfc3lzdGltZXIuYwotZW5kaWYKLQotU0RMX1NPVVJDRVMgKz0gJChTUkNTOiU9JChTRExfRElSKS9zcmMvdGltZXIvJSkKLQotIyB0aGUgVmlkZW8gc291cmNlcwotIwotCi1TUkNTIDo9IFNETF9STEVhY2NlbC5jIFwKLQlTRExfYmxpdC5jIFwKLQlTRExfYmxpdF8wLmMgXAotCVNETF9ibGl0XzEuYyBcCi0JU0RMX2JsaXRfQS5jIFwKLQlTRExfYmxpdF9OLmMgXAotCVNETF9ibXAuYyBcCi0JU0RMX2N1cnNvci5jIFwKLQlTRExfZ2FtbWEuYyBcCi0JU0RMX3BpeGVscy5jIFwKLQlTRExfc3RyZXRjaC5jIFwKLQlTRExfc3VyZmFjZS5jIFwKLQlTRExfdmlkZW8uYyBcCi0JU0RMX3l1di5jIFwKLQlTRExfeXV2X21teC5jIFwKLQlTRExfeXV2X3N3LmMgXAotCi1TUkNTICs9IGR1bW15L1NETF9udWxsZXZlbnRzLmMgXAotICAgICAgICBkdW1teS9TRExfbnVsbG1vdXNlLmMgXAotICAgICAgICBkdW1teS9TRExfbnVsbHZpZGVvLmMKLQotaWZlcSAoJChTRExfQ09ORklHX1ZJREVPX1dJTkRJQikseWVzKQotICBTUkNTICs9IHdpbmRpYi9TRExfZGliZXZlbnRzLmMgXAotICAgICAgICAgIHdpbmRpYi9TRExfZGlidmlkZW8uYyBcCi0gICAgICAgICAgd2luY29tbW9uL1NETF9zeXNldmVudHMuYyBcCi0gICAgICAgICAgd2luY29tbW9uL1NETF9zeXNtb3VzZS5jIFwKLSAgICAgICAgICB3aW5jb21tb24vU0RMX3N5c3dtLmMgXAotICAgICAgICAgIHdpbmNvbW1vbi9TRExfd2luZ2wuYwotZW5kaWYKLQotaWZlcSAoJChTRExfQ09ORklHX1ZJREVPX1FVQVJUWikseWVzKQotICBTUkNTICs9IHF1YXJ0ei9TRExfUXVhcnR6R0wubSBcCi0gICAgICAgICAgcXVhcnR6L1NETF9RdWFydHpWaWRlby5tIFwKLSAgICAgICAgICBxdWFydHovU0RMX1F1YXJ0eldNLm0gXAotICAgICAgICAgIHF1YXJ0ei9TRExfUXVhcnR6V2luZG93Lm0gXAotICAgICAgICAgIHF1YXJ0ei9TRExfUXVhcnR6WVVWLm0gXAotICAgICAgICAgIHF1YXJ0ei9TRExfUXVhcnR6RXZlbnRzLm0gXAotICAgICAgICAgIG1hY2NvbW1vbi9TRExfbWFjZXZlbnRzLmMgXAotICAgICAgICAgIG1hY2NvbW1vbi9TRExfbWFjZ2wuYyBcCi0gICAgICAgICAgbWFjY29tbW9uL1NETF9tYWNtb3VzZS5jIFwKLSAgICAgICAgICBtYWNjb21tb24vU0RMX21hY3dtLmMKLQotZW5kaWYKLQotaWZlcSAoJChTRExfQ09ORklHX1ZJREVPX1gxMSkseWVzKQotICBTUkNTICs9IHgxMS9TRExfeDExZHluLmMgXAotICAgICAgICAgIHgxMS9TRExfeDExZGdhLmMgXAotICAgICAgICAgIHgxMS9TRExfeDExZXZlbnRzLmMgXAotICAgICAgICAgIHgxMS9TRExfeDExZ2FtbWEuYyBcCi0gICAgICAgICAgeDExL1NETF94MTFnbC5jIFwKLSAgICAgICAgICB4MTEvU0RMX3gxMWltYWdlLmMgXAotICAgICAgICAgIHgxMS9TRExfeDExbW9kZXMuYyBcCi0gICAgICAgICAgeDExL1NETF94MTFtb3VzZS5jIFwKLSAgICAgICAgICB4MTEvU0RMX3gxMXZpZGVvLmMgXAotICAgICAgICAgIHgxMS9TRExfeDExd20uYyBcCi0gICAgICAgICAgeDExL1NETF94MTF5dXYuYwotZW5kaWYKLQotaWZlcSAoJChTRExfQ09ORklHX1ZJREVPX1gxMV9ER0FNT1VTRSkseWVzKQotICBTUkNTICs9IHgxMS9TRExfeDExZGdhLmMKLWVuZGlmCi0KLWlmZXEgKCQoU0RMX0NPTkZJR19WSURFT19YMTFfWE1FKSx5ZXMpCi0gIFNSQ1MgKz0gWGV4dC9YTUUveG1lLmMKLWVuZGlmCi0KLWlmZXEgKCQoU0RMX0NPTkZJR19WSURFT19YMTFfWElORVJBTUEpLHllcykKLSAgU1JDUyArPSBYZXh0L1hpbmVyYW1hL1hpbmVyYW1hLmMKLWVuZGlmCi0KLWlmZXEgKCQoU0RMX0NPTkZJR19WSURFT19YMTFfWFYpLHllcykKLSAgU1JDUyArPSBYZXh0L1h2L1h2LmMKLWVuZGlmCi0KLVNETF9TT1VSQ0VTICs9ICQoU1JDUzolPSQoU0RMX0RJUikvc3JjL3ZpZGVvLyUpCi0KLSMjIEJ1aWxkIGxpYlNETG1haW4KLSMjCi0KLVNSQ1MgOj0KLQotaWZlcSAoJChTRExfQ09ORklHX01BSU5fRFVNTVkpLHllcykKLSAgU1JDUyArPSBkdW1teS9TRExfZHVtbXlfbWFpbi5jCi1lbmRpZgotCi1pZmVxICgkKFNETF9DT05GSUdfTUFJTl9NQUNPU1gpLHllcykKLSAgU1JDUyArPSBtYWNvc3gvU0RMTWFpbi5tCi1lbmRpZgotCi1pZmVxICgkKFNETF9DT05GSUdfTUFJTl9XSU4zMikseWVzKQotICBTUkNTICs9IHdpbjMyL1NETF93aW4zMl9tYWluLmMKLWVuZGlmCi0KLVNETE1BSU5fU09VUkNFUyA6PSAkKFNSQ1M6JT0kKFNETF9ESVIpL3NyYy9tYWluLyUpCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL1NETC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9TREwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjNGU3ZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL1NETC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBJbml0aWFsaXphdGlvbiBjb2RlIGZvciBTREwgKi8KLQotI2luY2x1ZGUgIlNETC5oIgotI2luY2x1ZGUgIlNETF9mYXRhbC5oIgotI2lmICFTRExfVklERU9fRElTQUJMRUQKLSNpbmNsdWRlICJ2aWRlby9TRExfbGVha3MuaCIKLSNlbmRpZgotCi0jaWYgU0RMX1RIUkVBRF9QVEgKLSNpbmNsdWRlIDxwdGguaD4KLSNlbmRpZgotCi0vKiBJbml0aWFsaXphdGlvbi9DbGVhbnVwIHJvdXRpbmVzICovCi0jaWYgIVNETF9KT1lTVElDS19ESVNBQkxFRAotZXh0ZXJuIGludCAgU0RMX0pveXN0aWNrSW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIFNETF9Kb3lzdGlja1F1aXQodm9pZCk7Ci0jZW5kaWYKLSNpZiAhU0RMX0NEUk9NX0RJU0FCTEVECi1leHRlcm4gaW50ICBTRExfQ0RST01Jbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgU0RMX0NEUk9NUXVpdCh2b2lkKTsKLSNlbmRpZgotI2lmICFTRExfVElNRVJTX0RJU0FCTEVECi1leHRlcm4gdm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKTsKLWV4dGVybiBpbnQgIFNETF9UaW1lckluaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfVGltZXJRdWl0KHZvaWQpOwotI2VuZGlmCi0KLS8qIFRoZSBjdXJyZW50IFNETCB2ZXJzaW9uICovCi1zdGF0aWMgU0RMX3ZlcnNpb24gdmVyc2lvbiA9IAotCXsgU0RMX01BSk9SX1ZFUlNJT04sIFNETF9NSU5PUl9WRVJTSU9OLCBTRExfUEFUQ0hMRVZFTCB9OwotCi0vKiBUaGUgaW5pdGlhbGl6ZWQgc3Vic3lzdGVtcyAqLwotc3RhdGljIFVpbnQzMiBTRExfaW5pdGlhbGl6ZWQgPSAwOwotI2lmICFTRExfVElNRVJTX0RJU0FCTEVECi1zdGF0aWMgVWludDMyIHRpY2tzX3N0YXJ0ZWQgPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBDSEVDS19MRUFLUwotaW50IHN1cmZhY2VzX2FsbG9jYXRlZCA9IDA7Ci0jZW5kaWYKLQotaW50IFNETF9Jbml0U3ViU3lzdGVtKFVpbnQzMiBmbGFncykKLXsKLSNpZiAhU0RMX1ZJREVPX0RJU0FCTEVECi0JLyogSW5pdGlhbGl6ZSB0aGUgdmlkZW8vZXZlbnQgc3Vic3lzdGVtICovCi0JaWYgKCAoZmxhZ3MgJiBTRExfSU5JVF9WSURFTykgJiYgIShTRExfaW5pdGlhbGl6ZWQgJiBTRExfSU5JVF9WSURFTykgKSB7Ci0JCWlmICggU0RMX1ZpZGVvSW5pdChTRExfZ2V0ZW52KCJTRExfVklERU9EUklWRVIiKSwKLQkJICAgICAgICAgICAgICAgICAgIChmbGFncyZTRExfSU5JVF9FVkVOVFRIUkVBRCkpIDwgMCApIHsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJU0RMX2luaXRpYWxpemVkIHw9IFNETF9JTklUX1ZJREVPOwotCX0KLSNlbHNlCi0JaWYgKCBmbGFncyAmIFNETF9JTklUX1ZJREVPICkgewotCQlTRExfU2V0RXJyb3IoIlNETCBub3QgYnVpbHQgd2l0aCB2aWRlbyBzdXBwb3J0Iik7Ci0JCXJldHVybigtMSk7Ci0JfQotI2VuZGlmCi0KLSNpZiAhU0RMX0FVRElPX0RJU0FCTEVECi0JLyogSW5pdGlhbGl6ZSB0aGUgYXVkaW8gc3Vic3lzdGVtICovCi0JaWYgKCAoZmxhZ3MgJiBTRExfSU5JVF9BVURJTykgJiYgIShTRExfaW5pdGlhbGl6ZWQgJiBTRExfSU5JVF9BVURJTykgKSB7Ci0JCWlmICggU0RMX0F1ZGlvSW5pdChTRExfZ2V0ZW52KCJTRExfQVVESU9EUklWRVIiKSkgPCAwICkgewotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQlTRExfaW5pdGlhbGl6ZWQgfD0gU0RMX0lOSVRfQVVESU87Ci0JfQotI2Vsc2UKLQlpZiAoIGZsYWdzICYgU0RMX0lOSVRfQVVESU8gKSB7Ci0JCVNETF9TZXRFcnJvcigiU0RMIG5vdCBidWlsdCB3aXRoIGF1ZGlvIHN1cHBvcnQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0jZW5kaWYKLQotI2lmICFTRExfVElNRVJTX0RJU0FCTEVECi0JLyogSW5pdGlhbGl6ZSB0aGUgdGltZXIgc3Vic3lzdGVtICovCi0JaWYgKCAhIHRpY2tzX3N0YXJ0ZWQgKSB7Ci0JCVNETF9TdGFydFRpY2tzKCk7Ci0JCXRpY2tzX3N0YXJ0ZWQgPSAxOwotCX0KLQlpZiAoIChmbGFncyAmIFNETF9JTklUX1RJTUVSKSAmJiAhKFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX1RJTUVSKSApIHsKLQkJaWYgKCBTRExfVGltZXJJbml0KCkgPCAwICkgewotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQlTRExfaW5pdGlhbGl6ZWQgfD0gU0RMX0lOSVRfVElNRVI7Ci0JfQotI2Vsc2UKLQlpZiAoIGZsYWdzICYgU0RMX0lOSVRfVElNRVIgKSB7Ci0JCVNETF9TZXRFcnJvcigiU0RMIG5vdCBidWlsdCB3aXRoIHRpbWVyIHN1cHBvcnQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0jZW5kaWYKLQotI2lmICFTRExfSk9ZU1RJQ0tfRElTQUJMRUQKLQkvKiBJbml0aWFsaXplIHRoZSBqb3lzdGljayBzdWJzeXN0ZW0gKi8KLQlpZiAoIChmbGFncyAmIFNETF9JTklUX0pPWVNUSUNLKSAmJgotCSAgICAgIShTRExfaW5pdGlhbGl6ZWQgJiBTRExfSU5JVF9KT1lTVElDSykgKSB7Ci0JCWlmICggU0RMX0pveXN0aWNrSW5pdCgpIDwgMCApIHsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJU0RMX2luaXRpYWxpemVkIHw9IFNETF9JTklUX0pPWVNUSUNLOwotCX0KLSNlbHNlCi0JaWYgKCBmbGFncyAmIFNETF9JTklUX0pPWVNUSUNLICkgewotCQlTRExfU2V0RXJyb3IoIlNETCBub3QgYnVpbHQgd2l0aCBqb3lzdGljayBzdXBwb3J0Iik7Ci0JCXJldHVybigtMSk7Ci0JfQotI2VuZGlmCi0KLSNpZiAhU0RMX0NEUk9NX0RJU0FCTEVECi0JLyogSW5pdGlhbGl6ZSB0aGUgQ0QtUk9NIHN1YnN5c3RlbSAqLwotCWlmICggKGZsYWdzICYgU0RMX0lOSVRfQ0RST00pICYmICEoU0RMX2luaXRpYWxpemVkICYgU0RMX0lOSVRfQ0RST00pICkgewotCQlpZiAoIFNETF9DRFJPTUluaXQoKSA8IDAgKSB7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCVNETF9pbml0aWFsaXplZCB8PSBTRExfSU5JVF9DRFJPTTsKLQl9Ci0jZWxzZQotCWlmICggZmxhZ3MgJiBTRExfSU5JVF9DRFJPTSApIHsKLQkJU0RMX1NldEVycm9yKCJTREwgbm90IGJ1aWx0IHdpdGggY2Ryb20gc3VwcG9ydCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLSNlbmRpZgotCXJldHVybigwKTsKLX0KLQotaW50IFNETF9Jbml0KFVpbnQzMiBmbGFncykKLXsKLSNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQgJiYgU0RMX1RIUkVBRF9QVEgKLQlpZiAoIXB0aF9pbml0KCkpIHsKLQkJcmV0dXJuIC0xOwotCX0KLSNlbmRpZgotCi0JLyogQ2xlYXIgdGhlIGVycm9yIG1lc3NhZ2UgKi8KLQlTRExfQ2xlYXJFcnJvcigpOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgZGVzaXJlZCBzdWJzeXN0ZW1zICovCi0JaWYgKCBTRExfSW5pdFN1YlN5c3RlbShmbGFncykgPCAwICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIEV2ZXJ5dGhpbmcgaXMgaW5pdGlhbGl6ZWQgKi8KLQlpZiAoICEoZmxhZ3MgJiBTRExfSU5JVF9OT1BBUkFDSFVURSkgKSB7Ci0JCVNETF9JbnN0YWxsUGFyYWNodXRlKCk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfUXVpdFN1YlN5c3RlbShVaW50MzIgZmxhZ3MpCi17Ci0JLyogU2h1dCBkb3duIHJlcXVlc3RlZCBpbml0aWFsaXplZCBzdWJzeXN0ZW1zICovCi0jaWYgIVNETF9DRFJPTV9ESVNBQkxFRAotCWlmICggKGZsYWdzICYgU0RMX2luaXRpYWxpemVkICYgU0RMX0lOSVRfQ0RST00pICkgewotCQlTRExfQ0RST01RdWl0KCk7Ci0JCVNETF9pbml0aWFsaXplZCAmPSB+U0RMX0lOSVRfQ0RST007Ci0JfQotI2VuZGlmCi0jaWYgIVNETF9KT1lTVElDS19ESVNBQkxFRAotCWlmICggKGZsYWdzICYgU0RMX2luaXRpYWxpemVkICYgU0RMX0lOSVRfSk9ZU1RJQ0spICkgewotCQlTRExfSm95c3RpY2tRdWl0KCk7Ci0JCVNETF9pbml0aWFsaXplZCAmPSB+U0RMX0lOSVRfSk9ZU1RJQ0s7Ci0JfQotI2VuZGlmCi0jaWYgIVNETF9USU1FUlNfRElTQUJMRUQKLQlpZiAoIChmbGFncyAmIFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX1RJTUVSKSApIHsKLQkJU0RMX1RpbWVyUXVpdCgpOwotCQlTRExfaW5pdGlhbGl6ZWQgJj0gflNETF9JTklUX1RJTUVSOwotCX0KLSNlbmRpZgotI2lmICFTRExfQVVESU9fRElTQUJMRUQKLQlpZiAoIChmbGFncyAmIFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX0FVRElPKSApIHsKLQkJU0RMX0F1ZGlvUXVpdCgpOwotCQlTRExfaW5pdGlhbGl6ZWQgJj0gflNETF9JTklUX0FVRElPOwotCX0KLSNlbmRpZgotI2lmICFTRExfVklERU9fRElTQUJMRUQKLQlpZiAoIChmbGFncyAmIFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX1ZJREVPKSApIHsKLQkJU0RMX1ZpZGVvUXVpdCgpOwotCQlTRExfaW5pdGlhbGl6ZWQgJj0gflNETF9JTklUX1ZJREVPOwotCX0KLSNlbmRpZgotfQotCi1VaW50MzIgU0RMX1dhc0luaXQoVWludDMyIGZsYWdzKQotewotCWlmICggISBmbGFncyApIHsKLQkJZmxhZ3MgPSBTRExfSU5JVF9FVkVSWVRISU5HOwotCX0KLQlyZXR1cm4gKFNETF9pbml0aWFsaXplZCZmbGFncyk7Ci19Ci0KLXZvaWQgU0RMX1F1aXQodm9pZCkKLXsKLQkvKiBRdWl0IGFsbCBzdWJzeXN0ZW1zICovCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgcHJpbnRmKCJbU0RMX1F1aXRdIDogRW50ZXIhIENhbGxpbmcgUXVpdFN1YlN5c3RlbSgpXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQlTRExfUXVpdFN1YlN5c3RlbShTRExfSU5JVF9FVkVSWVRISU5HKTsKLQotI2lmZGVmIENIRUNLX0xFQUtTCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgcHJpbnRmKCJbU0RMX1F1aXRdIDogQ0hFQ0tfTEVBS1NcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotCi0JLyogUHJpbnQgdGhlIG51bWJlciBvZiBzdXJmYWNlcyBub3QgZnJlZWQgKi8KLQlpZiAoIHN1cmZhY2VzX2FsbG9jYXRlZCAhPSAwICkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlNETCBXYXJuaW5nOiAlZCBTREwgc3VyZmFjZXMgZXh0YW50XG4iLCAKLQkJCQkJCQlzdXJmYWNlc19hbGxvY2F0ZWQpOwotCX0KLSNlbmRpZgotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW1NETF9RdWl0XSA6IFNETF9Vbmluc3RhbGxQYXJhY2h1dGUoKVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLQkvKiBVbmluc3RhbGwgYW55IHBhcmFjaHV0ZSBzaWduYWwgaGFuZGxlcnMgKi8KLQlTRExfVW5pbnN0YWxsUGFyYWNodXRlKCk7Ci0KLSNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQgJiYgU0RMX1RIUkVBRF9QVEgKLQlwdGhfa2lsbCgpOwotI2VuZGlmCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgcHJpbnRmKCJbU0RMX1F1aXRdIDogUmV0dXJuaW5nIVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLX0KLQotLyogUmV0dXJuIHRoZSBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyICovCi1jb25zdCBTRExfdmVyc2lvbiAqIFNETF9MaW5rZWRfVmVyc2lvbih2b2lkKQotewotCXJldHVybigmdmVyc2lvbik7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fT1MyX18pCi0vKiBCdWlsZGluZyBmb3IgT1MvMiAqLwotI2lmZGVmIF9fV0FUQ09NQ19fCi0KLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNkZWZpbmUgSU5DTF9ET1NFWENFUFRJT05TCi0jaW5jbHVkZSA8b3MyLmg+Ci0KLS8qIEV4Y2VwdGlvbiBoYW5kbGVyIHRvIHByZXZlbnQgdGhlIEF1ZGlvIHRocmVhZCBoYW5naW5nLCBtYWtpbmcgYSB6b21iaWUgcHJvY2VzcyEgKi8KLVVMT05HIF9TeXN0ZW0gU0RMX01haW5fRXhjZXB0aW9uSGFuZGxlcihQRVhDRVBUSU9OUkVQT1JUUkVDT1JEIHBFUmVwUmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFWENFUFRJT05SRUdJU1RSQVRJT05SRUNPUkQgcEVSZWdSZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENPTlRFWFRSRUNPUkQgcEN0eFJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVk9JRCBwKQotewotICBpZiAocEVSZXBSZWMtPmZIYW5kbGVyRmxhZ3MgJiBFSF9FWElUX1VOV0lORCkKLSAgICByZXR1cm4gWENQVF9DT05USU5VRV9TRUFSQ0g7Ci0gIGlmIChwRVJlcFJlYy0+ZkhhbmRsZXJGbGFncyAmIEVIX1VOV0lORElORykKLSAgICByZXR1cm4gWENQVF9DT05USU5VRV9TRUFSQ0g7Ci0gIGlmIChwRVJlcFJlYy0+ZkhhbmRsZXJGbGFncyAmIEVIX05FU1RFRF9DQUxMKQotICAgIHJldHVybiBYQ1BUX0NPTlRJTlVFX1NFQVJDSDsKLQotICAvKiBEbyBjbGVhbnVwIGF0IGV2ZXJ5IGZhdGFsIGV4Y2VwdGlvbiEgKi8KLSAgaWYgKCgocEVSZXBSZWMtPkV4Y2VwdGlvbk51bSAmIFhDUFRfU0VWRVJJVFlfQ09ERSkgPT0gWENQVF9GQVRBTF9FWENFUFRJT04pICYmCi0gICAgICAocEVSZXBSZWMtPkV4Y2VwdGlvbk51bSAhPSBYQ1BUX0JSRUFLUE9JTlQpICYmCi0gICAgICAocEVSZXBSZWMtPkV4Y2VwdGlvbk51bSAhPSBYQ1BUX1NJTkdMRV9TVEVQKQotICAgICApCi0gIHsKLSAgICBpZiAoU0RMX2luaXRpYWxpemVkICYgU0RMX0lOSVRfQVVESU8pCi0gICAgewotICAgICAgLyogVGhpcyByZW1vdmVzIHRoZSB6b21iaWUgYXVkaW8gdGhyZWFkIGluIGNhc2Ugb2YgZW1lcmdlbmN5LiAqLwotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICBwcmludGYoIltTRExfTWFpbl9FeGNlcHRpb25IYW5kbGVyXSA6IENhbGxpbmcgU0RMX0Nsb3NlQXVkaW8oKSFcbiIpOwotI2VuZGlmCi0gICAgICBTRExfQ2xvc2VBdWRpbygpOwotICAgIH0KLSAgfQotICByZXR1cm4gKFhDUFRfQ09OVElOVUVfU0VBUkNIKTsKLX0KLQotCi1FWENFUFRJT05SRUdJU1RSQVRJT05SRUNPUkQgU0RMX01haW5feGNwdGhhbmQgPSB7MCwgU0RMX01haW5fRXhjZXB0aW9uSGFuZGxlcn07Ci0KLS8qIFRoZSBtYWluIERMTCBlbnRyeSBmb3IgRExMIEluaXRpYWxpemF0aW9uIGFuZCBVbmluaXRpYWxpemF0aW9uOiAqLwotdW5zaWduZWQgX1N5c3RlbSBMaWJNYWluKHVuc2lnbmVkIGhtb2QsIHVuc2lnbmVkIHRlcm1pbmF0aW9uKQotewotICBpZiAodGVybWluYXRpb24pCi0gIHsKLSNpZmRlZiBERUJVR19CVUlMRAotLyogICAgcHJpbnRmKCJbU0RMIERMTCBVbmludGlhbGl6YXRpb25dIDogUmVtb3ZpbmcgZXhjZXB0aW9uIGhhbmRsZXJcbiIpOyAqLwotI2VuZGlmCi0gICAgRG9zVW5zZXRFeGNlcHRpb25IYW5kbGVyKCZTRExfTWFpbl94Y3B0aGFuZCk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZQotICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAvKiBNYWtlIHN0ZG91dCBhbmQgc3RkZXJyIHVuYnVmZmVyZWQhICovCi0gICAgc2V0YnVmKHN0ZG91dCwgTlVMTCk7Ci0gICAgc2V0YnVmKHN0ZGVyciwgTlVMTCk7Ci0jZW5kaWYKLSAgICAvKiBGaXJlIHVwIGV4Y2VwdGlvbiBoYW5kbGVyICovCi0jaWZkZWYgREVCVUdfQlVJTEQKLS8qICAgIHByaW50ZigiW1NETCBETEwgSW5pdGlhbGl6YXRpb25dIDogU2V0dGluZyBleGNlcHRpb24gaGFuZGxlclxuIik7ICovCi0jZW5kaWYKLSAgICAvKiBTZXQgZXhjZXB0aW9uIGhhbmRsZXIgKi8KLSAgICBEb3NTZXRFeGNlcHRpb25IYW5kbGVyKCZTRExfTWFpbl94Y3B0aGFuZCk7Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotfQotI2VuZGlmIC8qIF9fV0FUQ09NQ19fICovCi0KLSNlbGlmIGRlZmluZWQoX19XSU4zMl9fKSAgJiYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLQotI2lmICFkZWZpbmVkKEhBVkVfTElCQykgfHwgKGRlZmluZWQoX19XQVRDT01DX18pICYmIGRlZmluZWQoQlVJTERfRExMKSkKLS8qIE5lZWQgdG8gaW5jbHVkZSBEbGxNYWluKCkgb24gV2F0Y29tIEMgZm9yIHNvbWUgcmVhc29uLi4gKi8KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotQk9PTCBBUElFTlRSWSBfRGxsTWFpbkNSVFN0YXJ0dXAoIEhBTkRMRSBoTW9kdWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgIHVsX3JlYXNvbl9mb3JfY2FsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFJlc2VydmVkICkKLXsKLQlzd2l0Y2ggKHVsX3JlYXNvbl9mb3JfY2FsbCkgewotCQljYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKLQkJY2FzZSBETExfVEhSRUFEX0FUVEFDSDoKLQkJY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKLQkJY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLyogYnVpbGRpbmcgRExMIHdpdGggV2F0Y29tIEMgKi8KLQotI2VuZGlmIC8qIE9TLzIgZWxpZiBfX1dJTjMyX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvU0RMX2Vycm9yLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL1NETF9lcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYzMmYyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvU0RMX2Vycm9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFNpbXBsZSBlcnJvciBoYW5kbGluZyBpbiBTREwgKi8KLQotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotI2luY2x1ZGUgIlNETF9lcnJvcl9jLmgiCi0KLS8qIFJvdXRpbmUgdG8gZ2V0IHRoZSB0aHJlYWQtc3BlY2lmaWMgZXJyb3IgdmFyaWFibGUgKi8KLSNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAotLyogVGhlICBTRExfYXJyYXlzaXplKFRoZSApLGRlZmF1bHQgKG5vbi10aHJlYWQtc2FmZSkgZ2xvYmFsIGVycm9yIHZhcmlhYmxlICovCi1zdGF0aWMgU0RMX2Vycm9yIFNETF9nbG9iYWxfZXJyb3I7Ci0jZGVmaW5lIFNETF9HZXRFcnJCdWYoKQkoJlNETF9nbG9iYWxfZXJyb3IpCi0jZWxzZQotZXh0ZXJuIFNETF9lcnJvciAqU0RMX0dldEVyckJ1Zih2b2lkKTsKLSNlbmRpZiAvKiBTRExfVEhSRUFEU19ESVNBQkxFRCAqLwotCi0jZGVmaW5lIFNETF9FUlJCVUZJWkUJMTAyNAotCi0vKiBQcml2YXRlIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX0xvb2t1cFN0cmluZyhjb25zdCBjaGFyICprZXkpCi17Ci0JLyogRklYTUU6IEFkZCBjb2RlIHRvIGxvb2t1cCBrZXkgaW4gbGFuZ3VhZ2Ugc3RyaW5nIGhhc2gtdGFibGUgKi8KLQlyZXR1cm4ga2V5OwotfQotCi0vKiBQdWJsaWMgZnVuY3Rpb25zICovCi0KLXZvaWQgU0RMX1NldEVycm9yIChjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCVNETF9lcnJvciAqZXJyb3I7Ci0KLQkvKiBDb3B5IGluIHRoZSBrZXksIG1hcmsgZXJyb3IgYXMgdmFsaWQgKi8KLQllcnJvciA9IFNETF9HZXRFcnJCdWYoKTsKLQllcnJvci0+ZXJyb3IgPSAxOwotCVNETF9zdHJsY3B5KChjaGFyICopZXJyb3ItPmtleSwgZm10LCBzaXplb2YoZXJyb3ItPmtleSkpOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JZXJyb3ItPmFyZ2MgPSAwOwotCXdoaWxlICggKmZtdCApIHsKLQkJaWYgKCAqZm10KysgPT0gJyUnICkgewotCQkJd2hpbGUgKCAqZm10ID09ICcuJyB8fCAoKmZtdCA+PSAnMCcgJiYgKmZtdCA8PSAnOScpICkgewotCQkJCSsrZm10OwotCQkJfQotCQkJc3dpdGNoICgqZm10KyspIHsKLQkJCSAgICBjYXNlIDA6ICAvKiBNYWxmb3JtZWQgZm9ybWF0IHN0cmluZy4uICovCi0JCQkJLS1mbXQ7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgY2FzZSAnYyc6Ci0JCQkgICAgY2FzZSAnaSc6Ci0JCQkgICAgY2FzZSAnZCc6Ci0JCQkgICAgY2FzZSAndSc6Ci0JCQkgICAgY2FzZSAnbyc6Ci0JCQkgICAgY2FzZSAneCc6Ci0JCQkgICAgY2FzZSAnWCc6Ci0JCQkJZXJyb3ItPmFyZ3NbZXJyb3ItPmFyZ2MrK10udmFsdWVfaSA9Ci0JCQkJCQkJdmFfYXJnKGFwLCBpbnQpOwotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgJ2YnOgotCQkJCWVycm9yLT5hcmdzW2Vycm9yLT5hcmdjKytdLnZhbHVlX2YgPQotCQkJCQkJCXZhX2FyZyhhcCwgZG91YmxlKTsKLQkJCQlicmVhazsKLQkJCSAgICBjYXNlICdwJzoKLQkJCQllcnJvci0+YXJnc1tlcnJvci0+YXJnYysrXS52YWx1ZV9wdHIgPQotCQkJCQkJCXZhX2FyZyhhcCwgdm9pZCAqKTsKLQkJCQlicmVhazsKLQkJCSAgICBjYXNlICdzJzoKLQkJCQl7Ci0JCQkJICBpbnQgaSA9IGVycm9yLT5hcmdjOwotCQkJCSAgY29uc3QgY2hhciAqc3RyID0gdmFfYXJnKGFwLCBjb25zdCBjaGFyICopOwotCQkJCSAgaWYgKHN0ciA9PSBOVUxMKQotCQkJCSAgICAgIHN0ciA9ICIobnVsbCkiOwotCQkJCSAgU0RMX3N0cmxjcHkoKGNoYXIgKillcnJvci0+YXJnc1tpXS5idWYsIHN0ciwgRVJSX01BWF9TVFJMRU4pOwotCQkJCSAgZXJyb3ItPmFyZ2MrKzsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICggZXJyb3ItPmFyZ2MgPj0gRVJSX01BWF9BUkdTICkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXZhX2VuZChhcCk7Ci0KLQkvKiBJZiB3ZSBhcmUgaW4gZGVidWcgbW9kZSwgcHJpbnQgb3V0IGFuIGVycm9yIG1lc3NhZ2UgKi8KLSNpZmRlZiBERUJVR19FUlJPUgotCWZwcmludGYoc3RkZXJyLCAiU0RMX1NldEVycm9yOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOwotI2VuZGlmCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaGFzIGEgYml0IG1vcmUgb3ZlcmhlYWQgdGhhbiBtb3N0IGVycm9yIGZ1bmN0aW9ucwotICAgc28gdGhhdCBpdCBzdXBwb3J0cyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgdGhyZWFkLXNhZmUgZXJyb3JzLgotKi8KLWNoYXIgKlNETF9HZXRFcnJvck1zZyhjaGFyICplcnJzdHIsIHVuc2lnbmVkIGludCBtYXhsZW4pCi17Ci0JU0RMX2Vycm9yICplcnJvcjsKLQotCS8qIENsZWFyIHRoZSBlcnJvciBzdHJpbmcgKi8KLQkqZXJyc3RyID0gJ1wwJzsgLS1tYXhsZW47Ci0KLQkvKiBHZXQgdGhlIHRocmVhZC1zYWZlIGVycm9yLCBhbmQgcHJpbnQgaXQgb3V0ICovCi0JZXJyb3IgPSBTRExfR2V0RXJyQnVmKCk7Ci0JaWYgKCBlcnJvci0+ZXJyb3IgKSB7Ci0JCWNvbnN0IGNoYXIgKmZtdDsKLQkJY2hhciAqbXNnID0gZXJyc3RyOwotCQlpbnQgbGVuOwotCQlpbnQgYXJnaTsKLQotCQlmbXQgPSBTRExfTG9va3VwU3RyaW5nKGVycm9yLT5rZXkpOwotCQlhcmdpID0gMDsKLQkJd2hpbGUgKCAqZm10ICYmIChtYXhsZW4gPiAwKSApIHsKLQkJCWlmICggKmZtdCA9PSAnJScgKSB7Ci0JCQkJY2hhciB0bXBbMzJdLCAqc3BvdCA9IHRtcDsKLQkJCQkqc3BvdCsrID0gKmZtdCsrOwotCQkJCXdoaWxlICggKCpmbXQgPT0gJy4nIHx8ICgqZm10ID49ICcwJyAmJiAqZm10IDw9ICc5JykpICYmIHNwb3QgPCAodG1wK1NETF9hcnJheXNpemUodG1wKS0yKSApIHsKLQkJCQkJKnNwb3QrKyA9ICpmbXQrKzsKLQkJCQl9Ci0JCQkJKnNwb3QrKyA9ICpmbXQrKzsKLQkJCQkqc3BvdCsrID0gJ1wwJzsKLQkJCQlzd2l0Y2ggKHNwb3RbLTJdKSB7Ci0JCQkJICAgIGNhc2UgJyUnOgotCQkJCQkqbXNnKysgPSAnJSc7Ci0JCQkJCW1heGxlbiAtPSAxOwotCQkJCQlicmVhazsKLQkJCQkgICAgY2FzZSAnYyc6Ci0JCQkJICAgIGNhc2UgJ2knOgotCQkJICAgICAgICAgICAgY2FzZSAnZCc6Ci0JCQkgICAgICAgICAgICBjYXNlICd1JzoKLQkJCSAgICAgICAgICAgIGNhc2UgJ28nOgotCQkJCSAgICBjYXNlICd4JzoKLQkJCQkgICAgY2FzZSAnWCc6Ci0JCQkJCWxlbiA9IFNETF9zbnByaW50Zihtc2csIG1heGxlbiwgdG1wLCBlcnJvci0+YXJnc1thcmdpKytdLnZhbHVlX2kpOwotCQkJCQltc2cgKz0gbGVuOwotCQkJCQltYXhsZW4gLT0gbGVuOwotCQkJCQlicmVhazsKLQkJCQkgICAgY2FzZSAnZic6Ci0JCQkJCWxlbiA9IFNETF9zbnByaW50Zihtc2csIG1heGxlbiwgdG1wLCBlcnJvci0+YXJnc1thcmdpKytdLnZhbHVlX2YpOwotCQkJCQltc2cgKz0gbGVuOwotCQkJCQltYXhsZW4gLT0gbGVuOwotCQkJCQlicmVhazsKLQkJCQkgICAgY2FzZSAncCc6Ci0JCQkJCWxlbiA9IFNETF9zbnByaW50Zihtc2csIG1heGxlbiwgdG1wLCBlcnJvci0+YXJnc1thcmdpKytdLnZhbHVlX3B0cik7Ci0JCQkJCW1zZyArPSBsZW47Ci0JCQkJCW1heGxlbiAtPSBsZW47Ci0JCQkJCWJyZWFrOwotCQkJCSAgICBjYXNlICdzJzoKLQkJCQkJbGVuID0gU0RMX3NucHJpbnRmKG1zZywgbWF4bGVuLCB0bXAsIFNETF9Mb29rdXBTdHJpbmcoZXJyb3ItPmFyZ3NbYXJnaSsrXS5idWYpKTsKLQkJCQkJbXNnICs9IGxlbjsKLQkJCQkJbWF4bGVuIC09IGxlbjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkqbXNnKysgPSAqZm10Kys7Ci0JCQkJbWF4bGVuIC09IDE7Ci0JCQl9Ci0JCX0KLQkJKm1zZyA9IDA7CS8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KLQl9Ci0JcmV0dXJuKGVycnN0cik7Ci19Ci0KLS8qIEF2YWlsYWJsZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLWNoYXIgKlNETF9HZXRFcnJvciAodm9pZCkKLXsKLQlzdGF0aWMgY2hhciBlcnJtc2dbU0RMX0VSUkJVRklaRV07Ci0KLQlyZXR1cm4oKGNoYXIgKilTRExfR2V0RXJyb3JNc2coZXJybXNnLCBTRExfRVJSQlVGSVpFKSk7Ci19Ci0KLXZvaWQgU0RMX0NsZWFyRXJyb3Iodm9pZCkKLXsKLQlTRExfZXJyb3IgKmVycm9yOwotCi0JZXJyb3IgPSBTRExfR2V0RXJyQnVmKCk7Ci0JZXJyb3ItPmVycm9yID0gMDsKLX0KLQotLyogVmVyeSBjb21tb24gZXJyb3JzIGdvIGhlcmUgKi8KLXZvaWQgU0RMX0Vycm9yKFNETF9lcnJvcmNvZGUgY29kZSkKLXsKLQlzd2l0Y2ggKGNvZGUpIHsKLQkJY2FzZSBTRExfRU5PTUVNOgotCQkJU0RMX1NldEVycm9yKCJPdXQgb2YgbWVtb3J5Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfRUZSRUFEOgotCQkJU0RMX1NldEVycm9yKCJFcnJvciByZWFkaW5nIGZyb20gZGF0YXN0cmVhbSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0VGV1JJVEU6Ci0JCQlTRExfU2V0RXJyb3IoIkVycm9yIHdyaXRpbmcgdG8gZGF0YXN0cmVhbSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0VGU0VFSzoKLQkJCVNETF9TZXRFcnJvcigiRXJyb3Igc2Vla2luZyBpbiBkYXRhc3RyZWFtIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVNETF9TZXRFcnJvcigiVW5rbm93biBTREwgZXJyb3IiKTsKLQkJCWJyZWFrOwotCX0KLX0KLQotI2lmZGVmIFRFU1RfRVJST1IKLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JY2hhciBidWZmZXJbQlVGU0laKzFdOwotCi0JU0RMX1NldEVycm9yKCJIaSB0aGVyZSEiKTsKLQlwcmludGYoIkVycm9yIDE6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0JU0RMX0NsZWFyRXJyb3IoKTsKLQlTRExfbWVtc2V0KGJ1ZmZlciwgJzEnLCBCVUZTSVopOwotCWJ1ZmZlcltCVUZTSVpdID0gMDsKLQlTRExfU2V0RXJyb3IoIlRoaXMgaXMgdGhlIGVycm9yOiAlcyAoJWYpIiwgYnVmZmVyLCAxLjApOwotCXByaW50ZigiRXJyb3IgMjogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKLQlleGl0KDApOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL1NETF9lcnJvcl9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL1NETF9lcnJvcl9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MGFjYjUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9TRExfZXJyb3JfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoaXMgZmlsZSBkZWZpbmVzIGEgc3RydWN0dXJlIHRoYXQgY2FycmllcyBsYW5ndWFnZS1pbmRlcGVuZGVudAotICAgZXJyb3IgbWVzc2FnZXMKLSovCi0KLSNpZm5kZWYgX1NETF9lcnJvcl9jX2gKLSNkZWZpbmUgX1NETF9lcnJvcl9jX2gKLQotI2RlZmluZSBFUlJfTUFYX1NUUkxFTgkxMjgKLSNkZWZpbmUgRVJSX01BWF9BUkdTCTUKLQotdHlwZWRlZiBzdHJ1Y3QgU0RMX2Vycm9yIHsKLQkvKiBUaGlzIGlzIGEgbnVtZXJpYyB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IGVycm9yICovCi0JaW50IGVycm9yOwotCi0JLyogVGhpcyBpcyBhIGtleSB1c2VkIHRvIGluZGV4IGludG8gYSBsYW5ndWFnZSBoYXNodGFibGUgY29udGFpbmluZwotCSAgIGludGVybmF0aW9uYWxpemVkIHZlcnNpb25zIG9mIHRoZSBTREwgZXJyb3IgbWVzc2FnZXMuICBJZiB0aGUga2V5Ci0JICAgaXMgbm90IGluIHRoZSBoYXNodGFibGUsIG9yIG5vIGhhc2h0YWJsZSBpcyBhdmFpbGFibGUsIHRoZSBrZXkgaXMKLQkgICB1c2VkIGRpcmVjdGx5IGFzIGFuIGVycm9yIG1lc3NhZ2UgZm9ybWF0IHN0cmluZy4KLQkqLwotCWNoYXIga2V5W0VSUl9NQVhfU1RSTEVOXTsKLQotCS8qIFRoZXNlIGFyZSB0aGUgYXJndW1lbnRzIGZvciB0aGUgZXJyb3IgZnVuY3Rpb25zICovCi0JaW50IGFyZ2M7Ci0JdW5pb24gewotCQl2b2lkICp2YWx1ZV9wdHI7Ci0jaWYgMAkvKiBXaGF0IGlzIGEgY2hhcmFjdGVyIGFueXdheT8gIChVTklDT0RFIGlzc3VlcykgKi8KLQkJdW5zaWduZWQgY2hhciB2YWx1ZV9jOwotI2VuZGlmCi0JCWludCB2YWx1ZV9pOwotCQlkb3VibGUgdmFsdWVfZjsKLQkJY2hhciBidWZbRVJSX01BWF9TVFJMRU5dOwotCX0gYXJnc1tFUlJfTUFYX0FSR1NdOwotfSBTRExfZXJyb3I7Ci0KLSNlbmRpZiAvKiBfU0RMX2Vycm9yX2NfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9TRExfZmF0YWwuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvU0RMX2ZhdGFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NDgzNmIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9TRExfZmF0YWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogR2VuZXJhbCBmYXRhbCBzaWduYWwgaGFuZGxpbmcgY29kZSBmb3IgU0RMICovCi0KLSNpZmRlZiBIQVZFX1NJR05BTF9ICi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgIlNETC5oIgotI2luY2x1ZGUgIlNETF9mYXRhbC5oIgotCi0vKiBUaGlzIGluc3RhbGxzIHNvbWUgc2lnbmFsIGhhbmRsZXJzIGZvciB0aGUgbW9yZSBjb21tb24gZmF0YWwgc2lnbmFscywKLSAgIHNvIHRoYXQgaWYgdGhlIHByb2dyYW1tZXIgaXMgbGF6eSwgdGhlIGFwcCBkb2Vzbid0IGRpZSBzbyBob3JyaWJseSBpZgotICAgdGhlIHByb2dyYW0gY3Jhc2hlcy4KLSovCi0KLXN0YXRpYyB2b2lkIFNETF9QYXJhY2h1dGUoaW50IHNpZykKLXsKLQlzaWduYWwoc2lnLCBTSUdfREZMKTsKLQlTRExfUXVpdCgpOwotCXJhaXNlKHNpZyk7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX2ZhdGFsX3NpZ25hbHNbXSA9IHsKLQlTSUdTRUdWLAotI2lmZGVmIFNJR0JVUwotCVNJR0JVUywKLSNlbmRpZgotI2lmZGVmIFNJR0ZQRQotCVNJR0ZQRSwKLSNlbmRpZgotI2lmZGVmIFNJR1FVSVQKLQlTSUdRVUlULAotI2VuZGlmCi0JMAotfTsKLQotdm9pZCBTRExfSW5zdGFsbFBhcmFjaHV0ZSh2b2lkKQotewotCS8qIFNldCBhIGhhbmRsZXIgZm9yIGFueSBmYXRhbCBzaWduYWwgbm90IGFscmVhZHkgaGFuZGxlZCAqLwotCWludCBpOwotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0Jc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247Ci0KLQlmb3IgKCBpPTA7IFNETF9mYXRhbF9zaWduYWxzW2ldOyArK2kgKSB7Ci0JCXNpZ2FjdGlvbihTRExfZmF0YWxfc2lnbmFsc1tpXSwgTlVMTCwgJmFjdGlvbik7Ci0JCWlmICggYWN0aW9uLnNhX2hhbmRsZXIgPT0gU0lHX0RGTCApIHsKLQkJCWFjdGlvbi5zYV9oYW5kbGVyID0gU0RMX1BhcmFjaHV0ZTsKLQkJCXNpZ2FjdGlvbihTRExfZmF0YWxfc2lnbmFsc1tpXSwgJmFjdGlvbiwgTlVMTCk7Ci0JCX0KLQl9Ci0jaWZkZWYgU0lHQUxSTQotCS8qIFNldCBTSUdBTFJNIHRvIGJlIGlnbm9yZWQgLS0gbmVjZXNzYXJ5IG9uIFNvbGFyaXMgKi8KLQlzaWdhY3Rpb24oU0lHQUxSTSwgTlVMTCwgJmFjdGlvbik7Ci0JaWYgKCBhY3Rpb24uc2FfaGFuZGxlciA9PSBTSUdfREZMICkgewotCQlhY3Rpb24uc2FfaGFuZGxlciA9IFNJR19JR047Ci0JCXNpZ2FjdGlvbihTSUdBTFJNLCAmYWN0aW9uLCBOVUxMKTsKLQl9Ci0jZW5kaWYKLSNlbHNlCi0Jdm9pZCAoKm9oYW5kbGVyKShpbnQpOwotCi0JZm9yICggaT0wOyBTRExfZmF0YWxfc2lnbmFsc1tpXTsgKytpICkgewotCQlvaGFuZGxlciA9IHNpZ25hbChTRExfZmF0YWxfc2lnbmFsc1tpXSwgU0RMX1BhcmFjaHV0ZSk7Ci0JCWlmICggb2hhbmRsZXIgIT0gU0lHX0RGTCApIHsKLQkJCXNpZ25hbChTRExfZmF0YWxfc2lnbmFsc1tpXSwgb2hhbmRsZXIpOwotCQl9Ci0JfQotI2VuZGlmIC8qIEhBVkVfU0lHQUNUSU9OICovCi0JcmV0dXJuOwotfQotCi12b2lkIFNETF9Vbmluc3RhbGxQYXJhY2h1dGUodm9pZCkKLXsKLQkvKiBSZW1vdmUgYSBoYW5kbGVyIGZvciBhbnkgZmF0YWwgc2lnbmFsIGhhbmRsZWQgKi8KLQlpbnQgaTsKLSNpZmRlZiBIQVZFX1NJR0FDVElPTgotCXN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOwotCi0JZm9yICggaT0wOyBTRExfZmF0YWxfc2lnbmFsc1tpXTsgKytpICkgewotCQlzaWdhY3Rpb24oU0RMX2ZhdGFsX3NpZ25hbHNbaV0sIE5VTEwsICZhY3Rpb24pOwotCQlpZiAoIGFjdGlvbi5zYV9oYW5kbGVyID09IFNETF9QYXJhY2h1dGUgKSB7Ci0JCQlhY3Rpb24uc2FfaGFuZGxlciA9IFNJR19ERkw7Ci0JCQlzaWdhY3Rpb24oU0RMX2ZhdGFsX3NpZ25hbHNbaV0sICZhY3Rpb24sIE5VTEwpOwotCQl9Ci0JfQotI2Vsc2UKLQl2b2lkICgqb2hhbmRsZXIpKGludCk7Ci0KLQlmb3IgKCBpPTA7IFNETF9mYXRhbF9zaWduYWxzW2ldOyArK2kgKSB7Ci0JCW9oYW5kbGVyID0gc2lnbmFsKFNETF9mYXRhbF9zaWduYWxzW2ldLCBTSUdfREZMKTsKLQkJaWYgKCBvaGFuZGxlciAhPSBTRExfUGFyYWNodXRlICkgewotCQkJc2lnbmFsKFNETF9mYXRhbF9zaWduYWxzW2ldLCBvaGFuZGxlcik7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogSEFWRV9TSUdBQ1RJT04gKi8KLX0KLQotI2Vsc2UKLQotLyogTm8gc2lnbmFscyBvbiB0aGlzIHBsYXRmb3JtLCBub3RoaW5nIHRvIGRvLi4gKi8KLQotdm9pZCBTRExfSW5zdGFsbFBhcmFjaHV0ZSh2b2lkKQotewotCXJldHVybjsKLX0KLQotdm9pZCBTRExfVW5pbnN0YWxsUGFyYWNodXRlKHZvaWQpCi17Ci0JcmV0dXJuOwotfQotCi0jZW5kaWYgLyogSEFWRV9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9TRExfZmF0YWwuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvU0RMX2ZhdGFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjYwNjkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9TRExfZmF0YWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBHZW5lcmFsIGZhdGFsIHNpZ25hbCBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KLQotZXh0ZXJuIHZvaWQgU0RMX0luc3RhbGxQYXJhY2h1dGUodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfVW5pbnN0YWxsUGFyYWNodXRlKHZvaWQpOwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyMzE2ZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLwotCi0jaW5jbHVkZSAiU0RMLmgiCi0jaW5jbHVkZSAiU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICJTRExfYXVkaW9tZW0uaCIKLSNpbmNsdWRlICJTRExfc3lzYXVkaW8uaCIKLQotI2lmZGVmIF9fT1MyX18KLS8qIFdlJ2xsIG5lZWQgdGhlIERvc1NldFByaW9yaXR5KCkgQVBJISAqLwotI2RlZmluZSBJTkNMX0RPU1BST0NFU1MKLSNpbmNsdWRlIDxvczIuaD4KLSNlbmRpZgotCi0vKiBBdmFpbGFibGUgYXVkaW8gZHJpdmVycyAqLwotc3RhdGljIEF1ZGlvQm9vdFN0cmFwICpib290c3RyYXBbXSA9IHsKLSNpZiBTRExfQVVESU9fRFJJVkVSX0JTRAotCSZCU0RfQVVESU9fYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9PU1MKLQkmRFNQX2Jvb3RzdHJhcCwKLQkmRE1BX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfQUxTQQotCSZBTFNBX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfUFVMU0UKLQkmUFVMU0VfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9RTlhOVE8KLQkmUU5YTlRPQVVESU9fYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9TVU5BVURJTwotCSZTVU5BVURJT19ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX0RNRURJQQotCSZETUVESUFfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9BUlRTCi0JJkFSVFNfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9FU0QKLQkmRVNEX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfTkFTCi0JJk5BU19ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX0RTT1VORAotCSZEU09VTkRfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9XQVZFT1VUCi0JJldBVkVPVVRfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9QQVVECi0JJlBhdWRfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9CQVVESU8KLQkmQkFVRElPX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfQ09SRUFVRElPCi0JJkNPUkVBVURJT19ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX1NORE1HUgotCSZTTkRNR1JfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9NSU5UCi0JJk1JTlRBVURJT19HU1hCX2Jvb3RzdHJhcCwKLQkmTUlOVEFVRElPX01DU05fYm9vdHN0cmFwLAotCSZNSU5UQVVESU9fU1RGQV9ib290c3RyYXAsCi0JJk1JTlRBVURJT19YQklPU19ib290c3RyYXAsCi0JJk1JTlRBVURJT19ETUE4X2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfRElTSwotCSZESVNLQVVEX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfRFVNTVkKLQkmRFVNTVlBVURfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9EQwotCSZEQ0FVRF9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX05EUwotCSZORFNBVURfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9NTUVBVURJTwotCSZNTUVBVURJT19ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX0RBUlQKLQkmREFSVF9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX0VQT0NBVURJTwotCSZFUE9DQXVkaW9fYm9vdHN0cmFwLAotI2VuZGlmCi0JTlVMTAotfTsKLVNETF9BdWRpb0RldmljZSAqY3VycmVudF9hdWRpbyA9IE5VTEw7Ci0KLS8qIFZhcmlvdXMgbG9jYWwgZnVuY3Rpb25zICovCi1pbnQgU0RMX0F1ZGlvSW5pdChjb25zdCBjaGFyICpkcml2ZXJfbmFtZSk7Ci12b2lkIFNETF9BdWRpb1F1aXQodm9pZCk7Ci0KLS8qIFRoZSBnZW5lcmFsIG1peGluZyB0aHJlYWQgZnVuY3Rpb24gKi8KLWludCBTRExDQUxMIFNETF9SdW5BdWRpbyh2b2lkICphdWRpb3ApCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IChTRExfQXVkaW9EZXZpY2UgKilhdWRpb3A7Ci0JVWludDggKnN0cmVhbTsKLQlpbnQgICAgc3RyZWFtX2xlbjsKLQl2b2lkICAqdWRhdGE7Ci0Jdm9pZCAoU0RMQ0FMTCAqZmlsbCkodm9pZCAqdXNlcmRhdGEsVWludDggKnN0cmVhbSwgaW50IGxlbik7Ci0JaW50ICAgIHNpbGVuY2U7Ci0KLQkvKiBQZXJmb3JtIGFueSB0aHJlYWQgc2V0dXAgKi8KLQlpZiAoIGF1ZGlvLT5UaHJlYWRJbml0ICkgewotCQlhdWRpby0+VGhyZWFkSW5pdChhdWRpbyk7Ci0JfQotCWF1ZGlvLT50aHJlYWRpZCA9IFNETF9UaHJlYWRJRCgpOwotCi0JLyogU2V0IHVwIHRoZSBtaXhpbmcgZnVuY3Rpb24gKi8KLQlmaWxsICA9IGF1ZGlvLT5zcGVjLmNhbGxiYWNrOwotCXVkYXRhID0gYXVkaW8tPnNwZWMudXNlcmRhdGE7Ci0KLQlpZiAoIGF1ZGlvLT5jb252ZXJ0Lm5lZWRlZCApIHsKLQkJaWYgKCBhdWRpby0+Y29udmVydC5zcmNfZm9ybWF0ID09IEFVRElPX1U4ICkgewotCQkJc2lsZW5jZSA9IDB4ODA7Ci0JCX0gZWxzZSB7Ci0JCQlzaWxlbmNlID0gMDsKLQkJfQotCQlzdHJlYW1fbGVuID0gYXVkaW8tPmNvbnZlcnQubGVuOwotCX0gZWxzZSB7Ci0JCXNpbGVuY2UgPSBhdWRpby0+c3BlYy5zaWxlbmNlOwotCQlzdHJlYW1fbGVuID0gYXVkaW8tPnNwZWMuc2l6ZTsKLQl9Ci0KLSNpZmRlZiBfX09TMl9fCi0gICAgICAgIC8qIEluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGlzIHRocmVhZCB0byBtYWtlIHN1cmUgdGhhdAotICAgICAgICAgICB0aGUgYXVkaW8gd2lsbCBiZSBjb250aW51b3VzIGFsbCB0aGUgdGltZSEgKi8KLSNpZmRlZiBVU0VfRE9TU0VUUFJJT1JJVFkKLSAgICAgICAgaWYgKFNETF9nZXRlbnYoIlNETF9VU0VfVElNRUNSSVRJQ0FMX0FVRElPIikpCi0gICAgICAgIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgICAgIHByaW50ZigiW1NETF9SdW5BdWRpb10gOiBTZXR0aW5nIHByaW9yaXR5IHRvIFRpbWVDcml0aWNhbCswISAoVElEJWQpXG4iLCBTRExfVGhyZWFkSUQoKSk7Ci0jZW5kaWYKLSAgICAgICAgICBEb3NTZXRQcmlvcml0eShQUlRZU19USFJFQUQsIFBSVFlDX1RJTUVDUklUSUNBTCwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgICAgICBwcmludGYoIltTRExfUnVuQXVkaW9dIDogU2V0dGluZyBwcmlvcml0eSB0byBGb3JlZ3JvdW5kU2VydmVyKzAhIChUSUQlZClcbiIsIFNETF9UaHJlYWRJRCgpKTsKLSNlbmRpZgotICAgICAgICAgIERvc1NldFByaW9yaXR5KFBSVFlTX1RIUkVBRCwgUFJUWUNfRk9SRUdST1VORFNFUlZFUiwgMCwgMCk7Ci0gICAgICAgIH0KLSNlbmRpZgotI2VuZGlmCi0KLQkvKiBMb29wLCBmaWxsaW5nIHRoZSBhdWRpbyBidWZmZXJzICovCi0Jd2hpbGUgKCBhdWRpby0+ZW5hYmxlZCApIHsKLQotCQkvKiBGaWxsIHRoZSBjdXJyZW50IGJ1ZmZlciB3aXRoIHNvdW5kICovCi0JCWlmICggYXVkaW8tPmNvbnZlcnQubmVlZGVkICkgewotCQkJaWYgKCBhdWRpby0+Y29udmVydC5idWYgKSB7Ci0JCQkJc3RyZWFtID0gYXVkaW8tPmNvbnZlcnQuYnVmOwotCQkJfSBlbHNlIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0cmVhbSA9IGF1ZGlvLT5HZXRBdWRpb0J1ZihhdWRpbyk7Ci0JCQlpZiAoIHN0cmVhbSA9PSBOVUxMICkgewotCQkJCXN0cmVhbSA9IGF1ZGlvLT5mYWtlX3N0cmVhbTsKLQkJCX0KLQkJfQotCi0JCVNETF9tZW1zZXQoc3RyZWFtLCBzaWxlbmNlLCBzdHJlYW1fbGVuKTsKLQotCQlpZiAoICEgYXVkaW8tPnBhdXNlZCApIHsKLQkJCVNETF9tdXRleFAoYXVkaW8tPm1peGVyX2xvY2spOwotCQkJKCpmaWxsKSh1ZGF0YSwgc3RyZWFtLCBzdHJlYW1fbGVuKTsKLQkJCVNETF9tdXRleFYoYXVkaW8tPm1peGVyX2xvY2spOwotCQl9Ci0KLQkJLyogQ29udmVydCB0aGUgYXVkaW8gaWYgbmVjZXNzYXJ5ICovCi0JCWlmICggYXVkaW8tPmNvbnZlcnQubmVlZGVkICkgewotCQkJU0RMX0NvbnZlcnRBdWRpbygmYXVkaW8tPmNvbnZlcnQpOwotCQkJc3RyZWFtID0gYXVkaW8tPkdldEF1ZGlvQnVmKGF1ZGlvKTsKLQkJCWlmICggc3RyZWFtID09IE5VTEwgKSB7Ci0JCQkJc3RyZWFtID0gYXVkaW8tPmZha2Vfc3RyZWFtOwotCQkJfQotCQkJU0RMX21lbWNweShzdHJlYW0sIGF1ZGlvLT5jb252ZXJ0LmJ1ZiwKLQkJCSAgICAgICAgICAgICAgIGF1ZGlvLT5jb252ZXJ0Lmxlbl9jdnQpOwotCQl9Ci0KLQkJLyogUmVhZHkgY3VycmVudCBidWZmZXIgZm9yIHBsYXkgYW5kIGNoYW5nZSBjdXJyZW50IGJ1ZmZlciAqLwotCQlpZiAoIHN0cmVhbSAhPSBhdWRpby0+ZmFrZV9zdHJlYW0gKSB7Ci0JCQlhdWRpby0+UGxheUF1ZGlvKGF1ZGlvKTsKLQkJfQotCi0JCS8qIFdhaXQgZm9yIGFuIGF1ZGlvIGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlICovCi0JCWlmICggc3RyZWFtID09IGF1ZGlvLT5mYWtlX3N0cmVhbSApIHsKLQkJCVNETF9EZWxheSgoYXVkaW8tPnNwZWMuc2FtcGxlcyoxMDAwKS9hdWRpby0+c3BlYy5mcmVxKTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5XYWl0QXVkaW8oYXVkaW8pOwotCQl9Ci0JfQotCi0JLyogV2FpdCBmb3IgdGhlIGF1ZGlvIHRvIGRyYWluLi4gKi8KLQlpZiAoIGF1ZGlvLT5XYWl0RG9uZSApIHsKLQkJYXVkaW8tPldhaXREb25lKGF1ZGlvKTsKLQl9Ci0KLSNpZmRlZiBfX09TMl9fCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgICAgcHJpbnRmKCJbU0RMX1J1bkF1ZGlvXSA6IFRhc2sgZXhpdGluZy4gKFRJRCVkKVxuIiwgU0RMX1RocmVhZElEKCkpOwotI2VuZGlmCi0jZW5kaWYKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNETF9Mb2NrQXVkaW9fRGVmYXVsdChTRExfQXVkaW9EZXZpY2UgKmF1ZGlvKQotewotCWlmICggYXVkaW8tPnRocmVhZCAmJiAoU0RMX1RocmVhZElEKCkgPT0gYXVkaW8tPnRocmVhZGlkKSApIHsKLQkJcmV0dXJuOwotCX0KLQlTRExfbXV0ZXhQKGF1ZGlvLT5taXhlcl9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgU0RMX1VubG9ja0F1ZGlvX0RlZmF1bHQoU0RMX0F1ZGlvRGV2aWNlICphdWRpbykKLXsKLQlpZiAoIGF1ZGlvLT50aHJlYWQgJiYgKFNETF9UaHJlYWRJRCgpID09IGF1ZGlvLT50aHJlYWRpZCkgKSB7Ci0JCXJldHVybjsKLQl9Ci0JU0RMX211dGV4VihhdWRpby0+bWl4ZXJfbG9jayk7Ci19Ci0KLXN0YXRpYyBVaW50MTYgU0RMX1BhcnNlQXVkaW9Gb3JtYXQoY29uc3QgY2hhciAqc3RyaW5nKQotewotCVVpbnQxNiBmb3JtYXQgPSAwOwotCi0Jc3dpdGNoICgqc3RyaW5nKSB7Ci0JICAgIGNhc2UgJ1UnOgotCQkrK3N0cmluZzsKLQkJZm9ybWF0IHw9IDB4MDAwMDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ1MnOgotCQkrK3N0cmluZzsKLQkJZm9ybWF0IHw9IDB4ODAwMDsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQlzd2l0Y2ggKFNETF9hdG9pKHN0cmluZykpIHsKLQkgICAgY2FzZSA4OgotCQlzdHJpbmcgKz0gMTsKLQkJZm9ybWF0IHw9IDg7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDE2OgotCQlzdHJpbmcgKz0gMjsKLQkJZm9ybWF0IHw9IDE2OwotCQlpZiAoIFNETF9zdHJjbXAoc3RyaW5nLCAiTFNCIikgPT0gMAotI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KLQkJICAgICB8fCBTRExfc3RyY21wKHN0cmluZywgIlNZUyIpID09IDAKLSNlbmRpZgotCQkgICAgKSB7Ci0JCQlmb3JtYXQgfD0gMHgwMDAwOwotCQl9Ci0JCWlmICggU0RMX3N0cmNtcChzdHJpbmcsICJNU0IiKSA9PSAwCi0jaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTgotCQkgICAgIHx8IFNETF9zdHJjbXAoc3RyaW5nLCAiU1lTIikgPT0gMAotI2VuZGlmCi0JCSAgICApIHsKLQkJCWZvcm1hdCB8PSAweDEwMDA7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gZm9ybWF0OwotfQotCi1pbnQgU0RMX0F1ZGlvSW5pdChjb25zdCBjaGFyICpkcml2ZXJfbmFtZSkKLXsKLQlTRExfQXVkaW9EZXZpY2UgKmF1ZGlvOwotCWludCBpID0gMCwgaWR4OwotCi0JLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJ3cml0ZSAnY3VycmVudF9hdWRpbycgKi8KLQlpZiAoIGN1cnJlbnRfYXVkaW8gIT0gTlVMTCApIHsKLQkJU0RMX0F1ZGlvUXVpdCgpOwotCX0KLQotCS8qIFNlbGVjdCB0aGUgcHJvcGVyIGF1ZGlvIGRyaXZlciAqLwotCWF1ZGlvID0gTlVMTDsKLQlpZHggPSAwOwotI2lmIFNETF9BVURJT19EUklWRVJfRVNECi0JaWYgKCAoZHJpdmVyX25hbWUgPT0gTlVMTCkgJiYgKFNETF9nZXRlbnYoIkVTUEVBS0VSIikgIT0gTlVMTCkgKSB7Ci0JCS8qIEFoZW0sIHdlIGtub3cgdGhhdCBpZiBFU1BFQUtFUiBpcyBzZXQsIHVzZXIgcHJvYmFibHkgd2FudHMKLQkJICAgdG8gdXNlIEVTRCwgYnV0IGRvbid0IHN0YXJ0IGl0IGlmIGl0J3Mgbm90IGFscmVhZHkgcnVubmluZy4KLQkJICAgVGhpcyBwcm9iYWJseSBpc24ndCB0aGUgcGxhY2UgdG8gZG8gdGhpcywgYnV0Li4uIFNoaCEgOikKLQkJICovCi0JCWZvciAoIGk9MDsgYm9vdHN0cmFwW2ldOyArK2kgKSB7Ci0JCQlpZiAoIFNETF9zdHJjYXNlY21wKGJvb3RzdHJhcFtpXS0+bmFtZSwgImVzZCIpID09IDAgKSB7Ci0jaWZkZWYgSEFWRV9QVVRFTlYKLQkJCQljb25zdCBjaGFyICplc2Rfbm9fc3Bhd247Ci0KLQkJCQkvKiBEb24ndCBzdGFydCBFU0QgaWYgaXQncyBub3QgcnVubmluZyAqLwotCQkJCWVzZF9ub19zcGF3biA9IGdldGVudigiRVNEX05PX1NQQVdOIik7Ci0JCQkJaWYgKCBlc2Rfbm9fc3Bhd24gPT0gTlVMTCApIHsKLQkJCQkJcHV0ZW52KCJFU0RfTk9fU1BBV049MSIpOwotCQkJCX0KLSNlbmRpZgotCQkJCWlmICggYm9vdHN0cmFwW2ldLT5hdmFpbGFibGUoKSApIHsKLQkJCQkJYXVkaW8gPSBib290c3RyYXBbaV0tPmNyZWF0ZSgwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotI2lmZGVmIEhBVkVfVU5TRVRFTlYKLQkJCQlpZiAoIGVzZF9ub19zcGF3biA9PSBOVUxMICkgewotCQkJCQl1bnNldGVudigiRVNEX05PX1NQQVdOIik7Ci0JCQkJfQotI2VuZGlmCi0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYgLyogU0RMX0FVRElPX0RSSVZFUl9FU0QgKi8KLQlpZiAoIGF1ZGlvID09IE5VTEwgKSB7Ci0JCWlmICggZHJpdmVyX25hbWUgIT0gTlVMTCApIHsKLSNpZiAwCS8qIFRoaXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEgYmV0dGVyIGRyaXZlciBzZWxlY3Rpb24gQVBJICovCi0JCQlpZiAoIFNETF9zdHJyY2hyKGRyaXZlcl9uYW1lLCAnOicpICE9IE5VTEwgKSB7Ci0JCQkJaWR4ID0gYXRvaShTRExfc3RycmNocihkcml2ZXJfbmFtZSwgJzonKSsxKTsKLQkJCX0KLSNlbmRpZgotCQkJZm9yICggaT0wOyBib290c3RyYXBbaV07ICsraSApIHsKLQkJCQlpZiAoU0RMX3N0cmNhc2VjbXAoYm9vdHN0cmFwW2ldLT5uYW1lLCBkcml2ZXJfbmFtZSkgPT0gMCkgewotCQkJCQlpZiAoIGJvb3RzdHJhcFtpXS0+YXZhaWxhYmxlKCkgKSB7Ci0JCQkJCQlhdWRpbz1ib290c3RyYXBbaV0tPmNyZWF0ZShpZHgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKCBpPTA7IGJvb3RzdHJhcFtpXTsgKytpICkgewotCQkJCWlmICggYm9vdHN0cmFwW2ldLT5hdmFpbGFibGUoKSApIHsKLQkJCQkJYXVkaW8gPSBib290c3RyYXBbaV0tPmNyZWF0ZShpZHgpOwotCQkJCQlpZiAoIGF1ZGlvICE9IE5VTEwgKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIGF1ZGlvID09IE5VTEwgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIk5vIGF2YWlsYWJsZSBhdWRpbyBkZXZpY2UiKTsKLSNpZiAwIC8qIERvbid0IGZhaWwgU0RMX0luaXQoKSBpZiBhdWRpbyBpc24ndCBhdmFpbGFibGUuCi0gICAgICAgICBTRExfT3BlbkF1ZGlvKCkgd2lsbCBoYW5kbGUgaXQgYXQgdGhhdCBwb2ludC4gICpzaWdoKgotICAgICAgICovCi0JCQlyZXR1cm4oLTEpOwotI2VuZGlmCi0JCX0KLQl9Ci0JY3VycmVudF9hdWRpbyA9IGF1ZGlvOwotCWlmICggY3VycmVudF9hdWRpbyApIHsKLQkJY3VycmVudF9hdWRpby0+bmFtZSA9IGJvb3RzdHJhcFtpXS0+bmFtZTsKLQkJaWYgKCAhY3VycmVudF9hdWRpby0+TG9ja0F1ZGlvICYmICFjdXJyZW50X2F1ZGlvLT5VbmxvY2tBdWRpbyApIHsKLQkJCWN1cnJlbnRfYXVkaW8tPkxvY2tBdWRpbyA9IFNETF9Mb2NrQXVkaW9fRGVmYXVsdDsKLQkJCWN1cnJlbnRfYXVkaW8tPlVubG9ja0F1ZGlvID0gU0RMX1VubG9ja0F1ZGlvX0RlZmF1bHQ7Ci0JCX0KLQl9Ci0JcmV0dXJuKDApOwotfQotCi1jaGFyICpTRExfQXVkaW9Ecml2ZXJOYW1lKGNoYXIgKm5hbWVidWYsIGludCBtYXhsZW4pCi17Ci0JaWYgKCBjdXJyZW50X2F1ZGlvICE9IE5VTEwgKSB7Ci0JCVNETF9zdHJsY3B5KG5hbWVidWYsIGN1cnJlbnRfYXVkaW8tPm5hbWUsIG1heGxlbik7Ci0JCXJldHVybihuYW1lYnVmKTsKLQl9Ci0JcmV0dXJuKE5VTEwpOwotfQotCi1pbnQgU0RMX09wZW5BdWRpbyhTRExfQXVkaW9TcGVjICpkZXNpcmVkLCBTRExfQXVkaW9TcGVjICpvYnRhaW5lZCkKLXsKLQlTRExfQXVkaW9EZXZpY2UgKmF1ZGlvOwotCWNvbnN0IGNoYXIgKmVudjsKLQotCS8qIFN0YXJ0IHVwIHRoZSBhdWRpbyBkcml2ZXIsIGlmIG5lY2Vzc2FyeSAqLwotCWlmICggISBjdXJyZW50X2F1ZGlvICkgewotCQlpZiAoIChTRExfSW5pdFN1YlN5c3RlbShTRExfSU5JVF9BVURJTykgPCAwKSB8fAotCQkgICAgIChjdXJyZW50X2F1ZGlvID09IE5VTEwpICkgewotCQkJcmV0dXJuKC0xKTsKLQkJfQotCX0KLQlhdWRpbyA9IGN1cnJlbnRfYXVkaW87Ci0KLQlpZiAoYXVkaW8tPm9wZW5lZCkgewotCQlTRExfU2V0RXJyb3IoIkF1ZGlvIGRldmljZSBpcyBhbHJlYWR5IG9wZW5lZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFZlcmlmeSBzb21lIHBhcmFtZXRlcnMgKi8KLQlpZiAoIGRlc2lyZWQtPmZyZXEgPT0gMCApIHsKLQkJZW52ID0gU0RMX2dldGVudigiU0RMX0FVRElPX0ZSRVFVRU5DWSIpOwotCQlpZiAoIGVudiApIHsKLQkJCWRlc2lyZWQtPmZyZXEgPSBTRExfYXRvaShlbnYpOwotCQl9Ci0JfQotCWlmICggZGVzaXJlZC0+ZnJlcSA9PSAwICkgewotCQkvKiBQaWNrIHNvbWUgZGVmYXVsdCBhdWRpbyBmcmVxdWVuY3kgKi8KLQkJZGVzaXJlZC0+ZnJlcSA9IDIyMDUwOwotCX0KLQlpZiAoIGRlc2lyZWQtPmZvcm1hdCA9PSAwICkgewotCQllbnYgPSBTRExfZ2V0ZW52KCJTRExfQVVESU9fRk9STUFUIik7Ci0JCWlmICggZW52ICkgewotCQkJZGVzaXJlZC0+Zm9ybWF0ID0gU0RMX1BhcnNlQXVkaW9Gb3JtYXQoZW52KTsKLQkJfQotCX0KLQlpZiAoIGRlc2lyZWQtPmZvcm1hdCA9PSAwICkgewotCQkvKiBQaWNrIHNvbWUgZGVmYXVsdCBhdWRpbyBmb3JtYXQgKi8KLQkJZGVzaXJlZC0+Zm9ybWF0ID0gQVVESU9fUzE2OwotCX0KLQlpZiAoIGRlc2lyZWQtPmNoYW5uZWxzID09IDAgKSB7Ci0JCWVudiA9IFNETF9nZXRlbnYoIlNETF9BVURJT19DSEFOTkVMUyIpOwotCQlpZiAoIGVudiApIHsKLQkJCWRlc2lyZWQtPmNoYW5uZWxzID0gKFVpbnQ4KVNETF9hdG9pKGVudik7Ci0JCX0KLQl9Ci0JaWYgKCBkZXNpcmVkLT5jaGFubmVscyA9PSAwICkgewotCQkvKiBQaWNrIGEgZGVmYXVsdCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLQkJZGVzaXJlZC0+Y2hhbm5lbHMgPSAyOwotCX0KLQlzd2l0Y2ggKCBkZXNpcmVkLT5jaGFubmVscyApIHsKLQkgICAgY2FzZSAxOgkvKiBNb25vICovCi0JICAgIGNhc2UgMjoJLyogU3RlcmVvICovCi0JICAgIGNhc2UgNDoJLyogc3Vycm91bmQgKi8KLQkgICAgY2FzZSA2OgkvKiBzdXJyb3VuZCB3aXRoIGNlbnRlciBhbmQgbGZlICovCi0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlTRExfU2V0RXJyb3IoIjEgKG1vbm8pIGFuZCAyIChzdGVyZW8pIGNoYW5uZWxzIHN1cHBvcnRlZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlpZiAoIGRlc2lyZWQtPnNhbXBsZXMgPT0gMCApIHsKLQkJZW52ID0gU0RMX2dldGVudigiU0RMX0FVRElPX1NBTVBMRVMiKTsKLQkJaWYgKCBlbnYgKSB7Ci0JCQlkZXNpcmVkLT5zYW1wbGVzID0gKFVpbnQxNilTRExfYXRvaShlbnYpOwotCQl9Ci0JfQotCWlmICggZGVzaXJlZC0+c2FtcGxlcyA9PSAwICkgewotCQkvKiBQaWNrIGEgZGVmYXVsdCBvZiB+NDYgbXMgYXQgZGVzaXJlZCBmcmVxdWVuY3kgKi8KLQkJaW50IHNhbXBsZXMgPSAoZGVzaXJlZC0+ZnJlcSAvIDEwMDApICogNDY7Ci0JCWludCBwb3dlcjIgPSAxOwotCQl3aGlsZSAoIHBvd2VyMiA8IHNhbXBsZXMgKSB7Ci0JCQlwb3dlcjIgKj0gMjsKLQkJfQotCQlkZXNpcmVkLT5zYW1wbGVzID0gcG93ZXIyOwotCX0KLQlpZiAoIGRlc2lyZWQtPmNhbGxiYWNrID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiU0RMX09wZW5BdWRpbygpIHBhc3NlZCBhIE5VTEwgY2FsbGJhY2siKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLSNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAotCS8qIFVzZXMgaW50ZXJydXB0IGRyaXZlbiBhdWRpbywgd2l0aG91dCB0aHJlYWQgKi8KLSNlbHNlCi0JLyogQ3JlYXRlIGEgc2VtYXBob3JlIGZvciBsb2NraW5nIHRoZSBzb3VuZCBidWZmZXJzICovCi0JYXVkaW8tPm1peGVyX2xvY2sgPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLQlpZiAoIGF1ZGlvLT5taXhlcl9sb2NrID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIG1peGVyIGxvY2siKTsKLQkJU0RMX0Nsb3NlQXVkaW8oKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0jZW5kaWYgLyogU0RMX1RIUkVBRFNfRElTQUJMRUQgKi8KLQotCS8qIENhbGN1bGF0ZSB0aGUgc2lsZW5jZSBhbmQgc2l6ZSBvZiB0aGUgYXVkaW8gc3BlY2lmaWNhdGlvbiAqLwotCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoZGVzaXJlZCk7Ci0KLQkvKiBPcGVuIHRoZSBhdWRpbyBzdWJzeXN0ZW0gKi8KLQlTRExfbWVtY3B5KCZhdWRpby0+c3BlYywgZGVzaXJlZCwgc2l6ZW9mKGF1ZGlvLT5zcGVjKSk7Ci0JYXVkaW8tPmNvbnZlcnQubmVlZGVkID0gMDsKLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JYXVkaW8tPnBhdXNlZCAgPSAxOwotCi0JYXVkaW8tPm9wZW5lZCA9IGF1ZGlvLT5PcGVuQXVkaW8oYXVkaW8sICZhdWRpby0+c3BlYykrMTsKLQotCWlmICggISBhdWRpby0+b3BlbmVkICkgewotCQlTRExfQ2xvc2VBdWRpbygpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIElmIHRoZSBhdWRpbyBkcml2ZXIgY2hhbmdlcyB0aGUgYnVmZmVyIHNpemUsIGFjY2VwdCBpdCAqLwotCWlmICggYXVkaW8tPnNwZWMuc2FtcGxlcyAhPSBkZXNpcmVkLT5zYW1wbGVzICkgewotCQlkZXNpcmVkLT5zYW1wbGVzID0gYXVkaW8tPnNwZWMuc2FtcGxlczsKLQkJU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhkZXNpcmVkKTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBhIGZha2UgYXVkaW8gbWVtb3J5IGJ1ZmZlciAqLwotCWF1ZGlvLT5mYWtlX3N0cmVhbSA9IFNETF9BbGxvY0F1ZGlvTWVtKGF1ZGlvLT5zcGVjLnNpemUpOwotCWlmICggYXVkaW8tPmZha2Vfc3RyZWFtID09IE5VTEwgKSB7Ci0JCVNETF9DbG9zZUF1ZGlvKCk7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFNlZSBpZiB3ZSBuZWVkIHRvIGRvIGFueSBjb252ZXJzaW9uICovCi0JaWYgKCBvYnRhaW5lZCAhPSBOVUxMICkgewotCQlTRExfbWVtY3B5KG9idGFpbmVkLCAmYXVkaW8tPnNwZWMsIHNpemVvZihhdWRpby0+c3BlYykpOwotCX0gZWxzZSBpZiAoIGRlc2lyZWQtPmZyZXEgIT0gYXVkaW8tPnNwZWMuZnJlcSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNpcmVkLT5mb3JtYXQgIT0gYXVkaW8tPnNwZWMuZm9ybWF0IHx8Ci0JICAgICAgICAgICAgZGVzaXJlZC0+Y2hhbm5lbHMgIT0gYXVkaW8tPnNwZWMuY2hhbm5lbHMgKSB7Ci0JCS8qIEJ1aWxkIGFuIGF1ZGlvIGNvbnZlcnNpb24gYmxvY2sgKi8KLQkJaWYgKCBTRExfQnVpbGRBdWRpb0NWVCgmYXVkaW8tPmNvbnZlcnQsCi0JCQlkZXNpcmVkLT5mb3JtYXQsIGRlc2lyZWQtPmNoYW5uZWxzLAotCQkJCQlkZXNpcmVkLT5mcmVxLAotCQkJYXVkaW8tPnNwZWMuZm9ybWF0LCBhdWRpby0+c3BlYy5jaGFubmVscywKLQkJCQkJYXVkaW8tPnNwZWMuZnJlcSkgPCAwICkgewotCQkJU0RMX0Nsb3NlQXVkaW8oKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJaWYgKCBhdWRpby0+Y29udmVydC5uZWVkZWQgKSB7Ci0JCQlhdWRpby0+Y29udmVydC5sZW4gPSAoaW50KSAoICgoZG91YmxlKSBkZXNpcmVkLT5zaXplKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpby0+Y29udmVydC5sZW5fcmF0aW8gKTsKLQkJCWF1ZGlvLT5jb252ZXJ0LmJ1ZiA9KFVpbnQ4ICopU0RMX0FsbG9jQXVkaW9NZW0oCi0JCQkgICBhdWRpby0+Y29udmVydC5sZW4qYXVkaW8tPmNvbnZlcnQubGVuX211bHQpOwotCQkJaWYgKCBhdWRpby0+Y29udmVydC5idWYgPT0gTlVMTCApIHsKLQkJCQlTRExfQ2xvc2VBdWRpbygpOwotCQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBTdGFydCB0aGUgYXVkaW8gdGhyZWFkIGlmIG5lY2Vzc2FyeSAqLwotCXN3aXRjaCAoYXVkaW8tPm9wZW5lZCkgewotCQljYXNlICAxOgotCQkJLyogU3RhcnQgdGhlIGF1ZGlvIHRocmVhZCAqLwotI2lmIChkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkpICYmICFkZWZpbmVkKEhBVkVfTElCQykgJiYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLSN1bmRlZiBTRExfQ3JlYXRlVGhyZWFkCi0JCQlhdWRpby0+dGhyZWFkID0gU0RMX0NyZWF0ZVRocmVhZChTRExfUnVuQXVkaW8sIGF1ZGlvLCBOVUxMLCBOVUxMKTsKLSNlbHNlCi0JCQlhdWRpby0+dGhyZWFkID0gU0RMX0NyZWF0ZVRocmVhZChTRExfUnVuQXVkaW8sIGF1ZGlvKTsKLSNlbmRpZgotCQkJaWYgKCBhdWRpby0+dGhyZWFkID09IE5VTEwgKSB7Ci0JCQkJU0RMX0Nsb3NlQXVkaW8oKTsKLQkJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBhdWRpbyB0aHJlYWQiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8qIFRoZSBhdWRpbyBpcyBub3cgcGxheWluZyAqLwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuKDApOwotfQotCi1TRExfYXVkaW9zdGF0dXMgU0RMX0dldEF1ZGlvU3RhdHVzKHZvaWQpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IGN1cnJlbnRfYXVkaW87Ci0JU0RMX2F1ZGlvc3RhdHVzIHN0YXR1czsKLQotCXN0YXR1cyA9IFNETF9BVURJT19TVE9QUEVEOwotCWlmICggYXVkaW8gJiYgYXVkaW8tPmVuYWJsZWQgKSB7Ci0JCWlmICggYXVkaW8tPnBhdXNlZCApIHsKLQkJCXN0YXR1cyA9IFNETF9BVURJT19QQVVTRUQ7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSBTRExfQVVESU9fUExBWUlORzsKLQkJfQotCX0KLQlyZXR1cm4oc3RhdHVzKTsKLX0KLQotdm9pZCBTRExfUGF1c2VBdWRpbyAoaW50IHBhdXNlX29uKQotewotCVNETF9BdWRpb0RldmljZSAqYXVkaW8gPSBjdXJyZW50X2F1ZGlvOwotCi0JaWYgKCBhdWRpbyApIHsKLQkJYXVkaW8tPnBhdXNlZCA9IHBhdXNlX29uOwotCX0KLX0KLQotdm9pZCBTRExfTG9ja0F1ZGlvICh2b2lkKQotewotCVNETF9BdWRpb0RldmljZSAqYXVkaW8gPSBjdXJyZW50X2F1ZGlvOwotCi0JLyogT2J0YWluIGEgbG9jayBvbiB0aGUgbWl4aW5nIGJ1ZmZlcnMgKi8KLQlpZiAoIGF1ZGlvICYmIGF1ZGlvLT5Mb2NrQXVkaW8gKSB7Ci0JCWF1ZGlvLT5Mb2NrQXVkaW8oYXVkaW8pOwotCX0KLX0KLQotdm9pZCBTRExfVW5sb2NrQXVkaW8gKHZvaWQpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IGN1cnJlbnRfYXVkaW87Ci0KLQkvKiBSZWxlYXNlIGxvY2sgb24gdGhlIG1peGluZyBidWZmZXJzICovCi0JaWYgKCBhdWRpbyAmJiBhdWRpby0+VW5sb2NrQXVkaW8gKSB7Ci0JCWF1ZGlvLT5VbmxvY2tBdWRpbyhhdWRpbyk7Ci0JfQotfQotCi12b2lkIFNETF9DbG9zZUF1ZGlvICh2b2lkKQotewotCVNETF9RdWl0U3ViU3lzdGVtKFNETF9JTklUX0FVRElPKTsKLX0KLQotdm9pZCBTRExfQXVkaW9RdWl0KHZvaWQpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IGN1cnJlbnRfYXVkaW87Ci0KLQlpZiAoIGF1ZGlvICkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWlmICggYXVkaW8tPnRocmVhZCAhPSBOVUxMICkgewotCQkJU0RMX1dhaXRUaHJlYWQoYXVkaW8tPnRocmVhZCwgTlVMTCk7Ci0JCX0KLQkJaWYgKCBhdWRpby0+bWl4ZXJfbG9jayAhPSBOVUxMICkgewotCQkJU0RMX0Rlc3Ryb3lNdXRleChhdWRpby0+bWl4ZXJfbG9jayk7Ci0JCX0KLQkJaWYgKCBhdWRpby0+ZmFrZV9zdHJlYW0gIT0gTlVMTCApIHsKLQkJCVNETF9GcmVlQXVkaW9NZW0oYXVkaW8tPmZha2Vfc3RyZWFtKTsKLQkJfQotCQlpZiAoIGF1ZGlvLT5jb252ZXJ0Lm5lZWRlZCApIHsKLQkJCVNETF9GcmVlQXVkaW9NZW0oYXVkaW8tPmNvbnZlcnQuYnVmKTsKLQotCQl9Ci0JCWlmICggYXVkaW8tPm9wZW5lZCApIHsKLQkJCWF1ZGlvLT5DbG9zZUF1ZGlvKGF1ZGlvKTsKLQkJCWF1ZGlvLT5vcGVuZWQgPSAwOwotCQl9Ci0JCS8qIEZyZWUgdGhlIGRyaXZlciBkYXRhICovCi0JCWF1ZGlvLT5mcmVlKGF1ZGlvKTsKLQkJY3VycmVudF9hdWRpbyA9IE5VTEw7Ci0JfQotfQotCi0jZGVmaW5lIE5VTV9GT1JNQVRTCTYKLXN0YXRpYyBpbnQgZm9ybWF0X2lkeDsKLXN0YXRpYyBpbnQgZm9ybWF0X2lkeF9zdWI7Ci1zdGF0aWMgVWludDE2IGZvcm1hdF9saXN0W05VTV9GT1JNQVRTXVtOVU1fRk9STUFUU10gPSB7Ci0geyBBVURJT19VOCwgQVVESU9fUzgsIEFVRElPX1MxNkxTQiwgQVVESU9fUzE2TVNCLCBBVURJT19VMTZMU0IsIEFVRElPX1UxNk1TQiB9LAotIHsgQVVESU9fUzgsIEFVRElPX1U4LCBBVURJT19TMTZMU0IsIEFVRElPX1MxNk1TQiwgQVVESU9fVTE2TFNCLCBBVURJT19VMTZNU0IgfSwKLSB7IEFVRElPX1MxNkxTQiwgQVVESU9fUzE2TVNCLCBBVURJT19VMTZMU0IsIEFVRElPX1UxNk1TQiwgQVVESU9fVTgsIEFVRElPX1M4IH0sCi0geyBBVURJT19TMTZNU0IsIEFVRElPX1MxNkxTQiwgQVVESU9fVTE2TVNCLCBBVURJT19VMTZMU0IsIEFVRElPX1U4LCBBVURJT19TOCB9LAotIHsgQVVESU9fVTE2TFNCLCBBVURJT19VMTZNU0IsIEFVRElPX1MxNkxTQiwgQVVESU9fUzE2TVNCLCBBVURJT19VOCwgQVVESU9fUzggfSwKLSB7IEFVRElPX1UxNk1TQiwgQVVESU9fVTE2TFNCLCBBVURJT19TMTZNU0IsIEFVRElPX1MxNkxTQiwgQVVESU9fVTgsIEFVRElPX1M4IH0sCi19OwotCi1VaW50MTYgU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoVWludDE2IGZvcm1hdCkKLXsKLQlmb3IgKCBmb3JtYXRfaWR4PTA7IGZvcm1hdF9pZHggPCBOVU1fRk9STUFUUzsgKytmb3JtYXRfaWR4ICkgewotCQlpZiAoIGZvcm1hdF9saXN0W2Zvcm1hdF9pZHhdWzBdID09IGZvcm1hdCApIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWZvcm1hdF9pZHhfc3ViID0gMDsKLQlyZXR1cm4oU0RMX05leHRBdWRpb0Zvcm1hdCgpKTsKLX0KLQotVWludDE2IFNETF9OZXh0QXVkaW9Gb3JtYXQodm9pZCkKLXsKLQlpZiAoIChmb3JtYXRfaWR4ID09IE5VTV9GT1JNQVRTKSB8fCAoZm9ybWF0X2lkeF9zdWIgPT0gTlVNX0ZPUk1BVFMpICkgewotCQlyZXR1cm4oMCk7Ci0JfQotCXJldHVybihmb3JtYXRfbGlzdFtmb3JtYXRfaWR4XVtmb3JtYXRfaWR4X3N1YisrXSk7Ci19Ci0KLXZvaWQgU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhTRExfQXVkaW9TcGVjICpzcGVjKQotewotCXN3aXRjaCAoc3BlYy0+Zm9ybWF0KSB7Ci0JCWNhc2UgQVVESU9fVTg6Ci0JCQlzcGVjLT5zaWxlbmNlID0gMHg4MDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3BlYy0+c2lsZW5jZSA9IDB4MDA7Ci0JCQlicmVhazsKLQl9Ci0Jc3BlYy0+c2l6ZSA9IChzcGVjLT5mb3JtYXQmMHhGRikvODsKLQlzcGVjLT5zaXplICo9IHNwZWMtPmNoYW5uZWxzOwotCXNwZWMtPnNpemUgKj0gc3BlYy0+c2FtcGxlczsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX2F1ZGlvX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX2F1ZGlvX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4NDg5NS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpb19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogRnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZXhwb3J0ZWQgZnJvbSBTRExfYXVkaW8uYyBmb3IgU0RMX3N5c2F1ZGlvLmMgKi8KLQotLyogRnVuY3Rpb25zIHRvIGdldCBhIGxpc3Qgb2YgImNsb3NlIiBhdWRpbyBmb3JtYXRzICovCi1leHRlcm4gVWludDE2IFNETF9GaXJzdEF1ZGlvRm9ybWF0KFVpbnQxNiBmb3JtYXQpOwotZXh0ZXJuIFVpbnQxNiBTRExfTmV4dEF1ZGlvRm9ybWF0KHZvaWQpOwotCi0vKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIHNpemUgYW5kIHNpbGVuY2UgZm9yIGEgU0RMX0F1ZGlvU3BlYyAqLwotZXh0ZXJuIHZvaWQgU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhTRExfQXVkaW9TcGVjICpzcGVjKTsKLQotLyogVGhlIGFjdHVhbCBtaXhpbmcgdGhyZWFkIGZ1bmN0aW9uICovCi1leHRlcm4gaW50IFNETENBTEwgU0RMX1J1bkF1ZGlvKHZvaWQgKmF1ZGlvcCk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpb2N2dC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfYXVkaW9jdnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjOTllMS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpb2N2dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxMCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogRnVuY3Rpb25zIGZvciBhdWRpbyBkcml2ZXJzIHRvIHBlcmZvcm0gcnVudGltZSBjb252ZXJzaW9uIG9mIGF1ZGlvIGZvcm1hdCAqLwotCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0KLQotLyogRWZmZWN0aXZlbHkgbWl4IHJpZ2h0IGFuZCBsZWZ0IGNoYW5uZWxzIGludG8gYSBzaW5nbGUgY2hhbm5lbCAqLwotdm9pZCBTRExDQUxMIFNETF9Db252ZXJ0TW9ubyhTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKLXsKLQlpbnQgaTsKLQlTaW50MzIgc2FtcGxlOwotCi0jaWZkZWYgREVCVUdfQ09OVkVSVAotCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyB0byBtb25vXG4iKTsKLSNlbmRpZgotCXN3aXRjaCAoZm9ybWF0JjB4ODAxOCkgewotCi0JCWNhc2UgQVVESU9fVTg6IHsKLQkJCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLQkJCXNyYyA9IGN2dC0+YnVmOwotCQkJZHN0ID0gY3Z0LT5idWY7Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8yOyBpOyAtLWkgKSB7Ci0JCQkJc2FtcGxlID0gc3JjWzBdICsgc3JjWzFdOwotCQkJCSpkc3QgPSAoVWludDgpKHNhbXBsZSAvIDIpOwotCQkJCXNyYyArPSAyOwotCQkJCWRzdCArPSAxOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JCWNhc2UgQVVESU9fUzg6IHsKLQkJCVNpbnQ4ICpzcmMsICpkc3Q7Ci0KLQkJCXNyYyA9IChTaW50OCAqKWN2dC0+YnVmOwotCQkJZHN0ID0gKFNpbnQ4ICopY3Z0LT5idWY7Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8yOyBpOyAtLWkgKSB7Ci0JCQkJc2FtcGxlID0gc3JjWzBdICsgc3JjWzFdOwotCQkJCSpkc3QgPSAoU2ludDgpKHNhbXBsZSAvIDIpOwotCQkJCXNyYyArPSAyOwotCQkJCWRzdCArPSAxOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JCWNhc2UgQVVESU9fVTE2OiB7Ci0JCQlVaW50OCAqc3JjLCAqZHN0OwotCi0JCQlzcmMgPSBjdnQtPmJ1ZjsKLQkJCWRzdCA9IGN2dC0+YnVmOwotCQkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSA9PSAweDEwMDAgKSB7Ci0JCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgewotCQkJCQlzYW1wbGUgPSAoVWludDE2KSgoc3JjWzBdPDw4KXxzcmNbMV0pKwotCQkJCQkgICAgICAgICAoVWludDE2KSgoc3JjWzJdPDw4KXxzcmNbM10pOwotCQkJCQlzYW1wbGUgLz0gMjsKLQkJCQkJZHN0WzFdID0gKHNhbXBsZSYweEZGKTsKLQkJCQkJc2FtcGxlID4+PSA4OwotCQkJCQlkc3RbMF0gPSAoc2FtcGxlJjB4RkYpOwotCQkJCQlzcmMgKz0gNDsKLQkJCQkJZHN0ICs9IDI7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7Ci0JCQkJCXNhbXBsZSA9IChVaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSkrCi0JCQkJCSAgICAgICAgIChVaW50MTYpKChzcmNbM108PDgpfHNyY1syXSk7Ci0JCQkJCXNhbXBsZSAvPSAyOwotCQkJCQlkc3RbMF0gPSAoc2FtcGxlJjB4RkYpOwotCQkJCQlzYW1wbGUgPj49IDg7Ci0JCQkJCWRzdFsxXSA9IChzYW1wbGUmMHhGRik7Ci0JCQkJCXNyYyArPSA0OwotCQkJCQlkc3QgKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBBVURJT19TMTY6IHsKLQkJCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLQkJCXNyYyA9IGN2dC0+YnVmOwotCQkJZHN0ID0gY3Z0LT5idWY7Ci0JCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7Ci0JCQkJCXNhbXBsZSA9IChTaW50MTYpKChzcmNbMF08PDgpfHNyY1sxXSkrCi0JCQkJCSAgICAgICAgIChTaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7Ci0JCQkJCXNhbXBsZSAvPSAyOwotCQkJCQlkc3RbMV0gPSAoc2FtcGxlJjB4RkYpOwotCQkJCQlzYW1wbGUgPj49IDg7Ci0JCQkJCWRzdFswXSA9IChzYW1wbGUmMHhGRik7Ci0JCQkJCXNyYyArPSA0OwotCQkJCQlkc3QgKz0gMjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKLQkJCQkJc2FtcGxlID0gKFNpbnQxNikoKHNyY1sxXTw8OCl8c3JjWzBdKSsKLQkJCQkJICAgICAgICAgKFNpbnQxNikoKHNyY1szXTw8OCl8c3JjWzJdKTsKLQkJCQkJc2FtcGxlIC89IDI7Ci0JCQkJCWRzdFswXSA9IChzYW1wbGUmMHhGRik7Ci0JCQkJCXNhbXBsZSA+Pj0gODsKLQkJCQkJZHN0WzFdID0gKHNhbXBsZSYweEZGKTsKLQkJCQkJc3JjICs9IDQ7Ci0JCQkJCWRzdCArPSAyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JY3Z0LT5sZW5fY3Z0IC89IDI7Ci0JaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOwotCX0KLX0KLQotLyogRGlzY2FyZCB0b3AgNCBjaGFubmVscyAqLwotdm9pZCBTRExDQUxMIFNETF9Db252ZXJ0U3RyaXAoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCi17Ci0JaW50IGk7Ci0JU2ludDMyIGxzYW1wbGUsIHJzYW1wbGU7Ci0KLSNpZmRlZiBERUJVR19DT05WRVJUCi0JZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGRvd24gdG8gc3RlcmVvXG4iKTsKLSNlbmRpZgotCXN3aXRjaCAoZm9ybWF0JjB4ODAxOCkgewotCi0JCWNhc2UgQVVESU9fVTg6IHsKLQkJCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLQkJCXNyYyA9IGN2dC0+YnVmOwotCQkJZHN0ID0gY3Z0LT5idWY7Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC82OyBpOyAtLWkgKSB7Ci0JCQkJZHN0WzBdID0gc3JjWzBdOwotCQkJCWRzdFsxXSA9IHNyY1sxXTsKLQkJCQlzcmMgKz0gNjsKLQkJCQlkc3QgKz0gMjsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCQljYXNlIEFVRElPX1M4OiB7Ci0JCQlTaW50OCAqc3JjLCAqZHN0OwotCi0JCQlzcmMgPSAoU2ludDggKiljdnQtPmJ1ZjsKLQkJCWRzdCA9IChTaW50OCAqKWN2dC0+YnVmOwotCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNjsgaTsgLS1pICkgewotCQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCQlkc3RbMV0gPSBzcmNbMV07Ci0JCQkJc3JjICs9IDY7Ci0JCQkJZHN0ICs9IDI7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBBVURJT19VMTY6IHsKLQkJCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLQkJCXNyYyA9IGN2dC0+YnVmOwotCQkJZHN0ID0gY3Z0LT5idWY7Ci0JCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8xMjsgaTsgLS1pICkgewotCQkJCQlsc2FtcGxlID0gKFVpbnQxNikoKHNyY1swXTw8OCl8c3JjWzFdKTsKLQkJCQkJcnNhbXBsZSA9IChVaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7Ci0JCQkJCQlkc3RbMV0gPSAobHNhbXBsZSYweEZGKTsKLQkJCQkJCWxzYW1wbGUgPj49IDg7Ci0JCQkJCQlkc3RbMF0gPSAobHNhbXBsZSYweEZGKTsKLQkJCQkJCWRzdFszXSA9IChyc2FtcGxlJjB4RkYpOwotCQkJCQkJcnNhbXBsZSA+Pj0gODsKLQkJCQkJCWRzdFsyXSA9IChyc2FtcGxlJjB4RkYpOwotCQkJCQlzcmMgKz0gMTI7Ci0JCQkJCWRzdCArPSA0OwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvMTI7IGk7IC0taSApIHsKLQkJCQkJbHNhbXBsZSA9IChVaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7Ci0JCQkJCXJzYW1wbGUgPSAoVWludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOwotCQkJCQkJZHN0WzBdID0gKGxzYW1wbGUmMHhGRik7Ci0JCQkJCQlsc2FtcGxlID4+PSA4OwotCQkJCQkJZHN0WzFdID0gKGxzYW1wbGUmMHhGRik7Ci0JCQkJCQlkc3RbMl0gPSAocnNhbXBsZSYweEZGKTsKLQkJCQkJCXJzYW1wbGUgPj49IDg7Ci0JCQkJCQlkc3RbM10gPSAocnNhbXBsZSYweEZGKTsKLQkJCQkJc3JjICs9IDEyOwotCQkJCQlkc3QgKz0gNDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBBVURJT19TMTY6IHsKLQkJCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLQkJCXNyYyA9IGN2dC0+YnVmOwotCQkJZHN0ID0gY3Z0LT5idWY7Ci0JCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8xMjsgaTsgLS1pICkgewotCQkJCQlsc2FtcGxlID0gKFNpbnQxNikoKHNyY1swXTw8OCl8c3JjWzFdKTsKLQkJCQkJcnNhbXBsZSA9IChTaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7Ci0JCQkJCQlkc3RbMV0gPSAobHNhbXBsZSYweEZGKTsKLQkJCQkJCWxzYW1wbGUgPj49IDg7Ci0JCQkJCQlkc3RbMF0gPSAobHNhbXBsZSYweEZGKTsKLQkJCQkJCWRzdFszXSA9IChyc2FtcGxlJjB4RkYpOwotCQkJCQkJcnNhbXBsZSA+Pj0gODsKLQkJCQkJCWRzdFsyXSA9IChyc2FtcGxlJjB4RkYpOwotCQkJCQlzcmMgKz0gMTI7Ci0JCQkJCWRzdCArPSA0OwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvMTI7IGk7IC0taSApIHsKLQkJCQkJbHNhbXBsZSA9IChTaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7Ci0JCQkJCXJzYW1wbGUgPSAoU2ludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOwotCQkJCQkJZHN0WzBdID0gKGxzYW1wbGUmMHhGRik7Ci0JCQkJCQlsc2FtcGxlID4+PSA4OwotCQkJCQkJZHN0WzFdID0gKGxzYW1wbGUmMHhGRik7Ci0JCQkJCQlkc3RbMl0gPSAocnNhbXBsZSYweEZGKTsKLQkJCQkJCXJzYW1wbGUgPj49IDg7Ci0JCQkJCQlkc3RbM10gPSAocnNhbXBsZSYweEZGKTsKLQkJCQkJc3JjICs9IDEyOwotCQkJCQlkc3QgKz0gNDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWN2dC0+bGVuX2N2dCAvPSAzOwotCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgewotCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKLQl9Ci19Ci0KLQotLyogRGlzY2FyZCB0b3AgMiBjaGFubmVscyBvZiA2ICovCi12b2lkIFNETENBTEwgU0RMX0NvbnZlcnRTdHJpcF8yKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQotewotCWludCBpOwotCVNpbnQzMiBsc2FtcGxlLCByc2FtcGxlOwotCi0jaWZkZWYgREVCVUdfQ09OVkVSVAotCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyA2IGRvd24gdG8gcXVhZFxuIik7Ci0jZW5kaWYKLQlzd2l0Y2ggKGZvcm1hdCYweDgwMTgpIHsKLQotCQljYXNlIEFVRElPX1U4OiB7Ci0JCQlVaW50OCAqc3JjLCAqZHN0OwotCi0JCQlzcmMgPSBjdnQtPmJ1ZjsKLQkJCWRzdCA9IGN2dC0+YnVmOwotCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgewotCQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCQlkc3RbMV0gPSBzcmNbMV07Ci0JCQkJc3JjICs9IDQ7Ci0JCQkJZHN0ICs9IDI7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBBVURJT19TODogewotCQkJU2ludDggKnNyYywgKmRzdDsKLQotCQkJc3JjID0gKFNpbnQ4ICopY3Z0LT5idWY7Ci0JCQlkc3QgPSAoU2ludDggKiljdnQtPmJ1ZjsKLQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKLQkJCQlkc3RbMF0gPSBzcmNbMF07Ci0JCQkJZHN0WzFdID0gc3JjWzFdOwotCQkJCXNyYyArPSA0OwotCQkJCWRzdCArPSAyOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JCWNhc2UgQVVESU9fVTE2OiB7Ci0JCQlVaW50OCAqc3JjLCAqZHN0OwotCi0JCQlzcmMgPSBjdnQtPmJ1ZjsKLQkJCWRzdCA9IGN2dC0+YnVmOwotCQkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSA9PSAweDEwMDAgKSB7Ci0JCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvODsgaTsgLS1pICkgewotCQkJCQlsc2FtcGxlID0gKFVpbnQxNikoKHNyY1swXTw8OCl8c3JjWzFdKTsKLQkJCQkJcnNhbXBsZSA9IChVaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7Ci0JCQkJCQlkc3RbMV0gPSAobHNhbXBsZSYweEZGKTsKLQkJCQkJCWxzYW1wbGUgPj49IDg7Ci0JCQkJCQlkc3RbMF0gPSAobHNhbXBsZSYweEZGKTsKLQkJCQkJCWRzdFszXSA9IChyc2FtcGxlJjB4RkYpOwotCQkJCQkJcnNhbXBsZSA+Pj0gODsKLQkJCQkJCWRzdFsyXSA9IChyc2FtcGxlJjB4RkYpOwotCQkJCQlzcmMgKz0gODsKLQkJCQkJZHN0ICs9IDQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC84OyBpOyAtLWkgKSB7Ci0JCQkJCWxzYW1wbGUgPSAoVWludDE2KSgoc3JjWzFdPDw4KXxzcmNbMF0pOwotCQkJCQlyc2FtcGxlID0gKFVpbnQxNikoKHNyY1szXTw8OCl8c3JjWzJdKTsKLQkJCQkJCWRzdFswXSA9IChsc2FtcGxlJjB4RkYpOwotCQkJCQkJbHNhbXBsZSA+Pj0gODsKLQkJCQkJCWRzdFsxXSA9IChsc2FtcGxlJjB4RkYpOwotCQkJCQkJZHN0WzJdID0gKHJzYW1wbGUmMHhGRik7Ci0JCQkJCQlyc2FtcGxlID4+PSA4OwotCQkJCQkJZHN0WzNdID0gKHJzYW1wbGUmMHhGRik7Ci0JCQkJCXNyYyArPSA4OwotCQkJCQlkc3QgKz0gNDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBBVURJT19TMTY6IHsKLQkJCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLQkJCXNyYyA9IGN2dC0+YnVmOwotCQkJZHN0ID0gY3Z0LT5idWY7Ci0JCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC84OyBpOyAtLWkgKSB7Ci0JCQkJCWxzYW1wbGUgPSAoU2ludDE2KSgoc3JjWzBdPDw4KXxzcmNbMV0pOwotCQkJCQlyc2FtcGxlID0gKFNpbnQxNikoKHNyY1syXTw8OCl8c3JjWzNdKTsKLQkJCQkJCWRzdFsxXSA9IChsc2FtcGxlJjB4RkYpOwotCQkJCQkJbHNhbXBsZSA+Pj0gODsKLQkJCQkJCWRzdFswXSA9IChsc2FtcGxlJjB4RkYpOwotCQkJCQkJZHN0WzNdID0gKHJzYW1wbGUmMHhGRik7Ci0JCQkJCQlyc2FtcGxlID4+PSA4OwotCQkJCQkJZHN0WzJdID0gKHJzYW1wbGUmMHhGRik7Ci0JCQkJCXNyYyArPSA4OwotCQkJCQlkc3QgKz0gNDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0Lzg7IGk7IC0taSApIHsKLQkJCQkJbHNhbXBsZSA9IChTaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7Ci0JCQkJCXJzYW1wbGUgPSAoU2ludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOwotCQkJCQkJZHN0WzBdID0gKGxzYW1wbGUmMHhGRik7Ci0JCQkJCQlsc2FtcGxlID4+PSA4OwotCQkJCQkJZHN0WzFdID0gKGxzYW1wbGUmMHhGRik7Ci0JCQkJCQlkc3RbMl0gPSAocnNhbXBsZSYweEZGKTsKLQkJCQkJCXJzYW1wbGUgPj49IDg7Ci0JCQkJCQlkc3RbM10gPSAocnNhbXBsZSYweEZGKTsKLQkJCQkJc3JjICs9IDg7Ci0JCQkJCWRzdCArPSA0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JY3Z0LT5sZW5fY3Z0IC89IDI7Ci0JaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOwotCX0KLX0KLQotLyogRHVwbGljYXRlIGEgbW9ubyBjaGFubmVsIHRvIGJvdGggc3RlcmVvIGNoYW5uZWxzICovCi12b2lkIFNETENBTEwgU0RMX0NvbnZlcnRTdGVyZW8oU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCi17Ci0JaW50IGk7Ci0KLSNpZmRlZiBERUJVR19DT05WRVJUCi0JZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIHRvIHN0ZXJlb1xuIik7Ci0jZW5kaWYKLQlpZiAoIChmb3JtYXQgJiAweEZGKSA9PSAxNiApIHsKLQkJVWludDE2ICpzcmMsICpkc3Q7Ci0KLQkJc3JjID0gKFVpbnQxNiAqKShjdnQtPmJ1ZitjdnQtPmxlbl9jdnQpOwotCQlkc3QgPSAoVWludDE2ICopKGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyKTsKLQkJZm9yICggaT1jdnQtPmxlbl9jdnQvMjsgaTsgLS1pICkgewotCQkJZHN0IC09IDI7Ci0JCQlzcmMgLT0gMTsKLQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCWRzdFsxXSA9IHNyY1swXTsKLQkJfQotCX0gZWxzZSB7Ci0JCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLQkJc3JjID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0OwotCQlkc3QgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQqMjsKLQkJZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKLQkJCWRzdCAtPSAyOwotCQkJc3JjIC09IDE7Ci0JCQlkc3RbMF0gPSBzcmNbMF07Ci0JCQlkc3RbMV0gPSBzcmNbMF07Ci0JCX0KLQl9Ci0JY3Z0LT5sZW5fY3Z0ICo9IDI7Ci0JaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOwotCX0KLX0KLQotCi0vKiBEdXBsaWNhdGUgYSBzdGVyZW8gY2hhbm5lbCB0byBhIHBzZXVkby01LjEgc3RyZWFtICovCi12b2lkIFNETENBTEwgU0RMX0NvbnZlcnRTdXJyb3VuZChTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKLXsKLQlpbnQgaTsKLQotI2lmZGVmIERFQlVHX0NPTlZFUlQKLQlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgc3RlcmVvIHRvIHN1cnJvdW5kXG4iKTsKLSNlbmRpZgotCXN3aXRjaCAoZm9ybWF0JjB4ODAxOCkgewotCi0JCWNhc2UgQVVESU9fVTg6IHsKLQkJCVVpbnQ4ICpzcmMsICpkc3QsIGxmLCByZiwgY2U7Ci0KLQkJCXNyYyA9IChVaW50OCAqKShjdnQtPmJ1ZitjdnQtPmxlbl9jdnQpOwotCQkJZHN0ID0gKFVpbnQ4ICopKGN2dC0+YnVmK2N2dC0+bGVuX2N2dCozKTsKLQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0OyBpOyAtLWkgKSB7Ci0JCQkJZHN0IC09IDY7Ci0JCQkJc3JjIC09IDI7Ci0JCQkJbGYgPSBzcmNbMF07Ci0JCQkJcmYgPSBzcmNbMV07Ci0JCQkJY2UgPSAobGYvMikgKyAocmYvMik7Ci0JCQkJZHN0WzBdID0gbGY7Ci0JCQkJZHN0WzFdID0gcmY7Ci0JCQkJZHN0WzJdID0gbGYgLSBjZTsKLQkJCQlkc3RbM10gPSByZiAtIGNlOwotCQkJCWRzdFs0XSA9IGNlOwotCQkJCWRzdFs1XSA9IGNlOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JCWNhc2UgQVVESU9fUzg6IHsKLQkJCVNpbnQ4ICpzcmMsICpkc3QsIGxmLCByZiwgY2U7Ci0KLQkJCXNyYyA9IChTaW50OCAqKWN2dC0+YnVmK2N2dC0+bGVuX2N2dDsKLQkJCWRzdCA9IChTaW50OCAqKWN2dC0+YnVmK2N2dC0+bGVuX2N2dCozOwotCQkJZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKLQkJCQlkc3QgLT0gNjsKLQkJCQlzcmMgLT0gMjsKLQkJCQlsZiA9IHNyY1swXTsKLQkJCQlyZiA9IHNyY1sxXTsKLQkJCQljZSA9IChsZi8yKSArIChyZi8yKTsKLQkJCQlkc3RbMF0gPSBsZjsKLQkJCQlkc3RbMV0gPSByZjsKLQkJCQlkc3RbMl0gPSBsZiAtIGNlOwotCQkJCWRzdFszXSA9IHJmIC0gY2U7Ci0JCQkJZHN0WzRdID0gY2U7Ci0JCQkJZHN0WzVdID0gY2U7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBBVURJT19VMTY6IHsKLQkJCVVpbnQ4ICpzcmMsICpkc3Q7Ci0JCQlVaW50MTYgbGYsIHJmLCBjZSwgbHIsIHJyOwotCi0JCQlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7Ci0JCQlkc3QgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQqMzsKLQotCQkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSA9PSAweDEwMDAgKSB7Ci0JCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgewotCQkJCQlkc3QgLT0gMTI7Ci0JCQkJCXNyYyAtPSA0OwotCQkJCQlsZiA9IChVaW50MTYpKChzcmNbMF08PDgpfHNyY1sxXSk7Ci0JCQkJCXJmID0gKFVpbnQxNikoKHNyY1syXTw8OCl8c3JjWzNdKTsKLQkJCQkJY2UgPSAobGYvMikgKyAocmYvMik7Ci0JCQkJCXJyID0gbGYgLSBjZTsKLQkJCQkJbHIgPSByZiAtIGNlOwotCQkJCQkJZHN0WzFdID0gKGxmJjB4RkYpOwotCQkJCQkJZHN0WzBdID0gKChsZj4+OCkmMHhGRik7Ci0JCQkJCQlkc3RbM10gPSAocmYmMHhGRik7Ci0JCQkJCQlkc3RbMl0gPSAoKHJmPj44KSYweEZGKTsKLQotCQkJCQkJZHN0WzErNF0gPSAobHImMHhGRik7Ci0JCQkJCQlkc3RbMCs0XSA9ICgobHI+PjgpJjB4RkYpOwotCQkJCQkJZHN0WzMrNF0gPSAocnImMHhGRik7Ci0JCQkJCQlkc3RbMis0XSA9ICgocnI+PjgpJjB4RkYpOwotCi0JCQkJCQlkc3RbMSs4XSA9IChjZSYweEZGKTsKLQkJCQkJCWRzdFswKzhdID0gKChjZT4+OCkmMHhGRik7Ci0JCQkJCQlkc3RbMys4XSA9IChjZSYweEZGKTsKLQkJCQkJCWRzdFsyKzhdID0gKChjZT4+OCkmMHhGRik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7Ci0JCQkJCWRzdCAtPSAxMjsKLQkJCQkJc3JjIC09IDQ7Ci0JCQkJCWxmID0gKFVpbnQxNikoKHNyY1sxXTw8OCl8c3JjWzBdKTsKLQkJCQkJcmYgPSAoVWludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOwotCQkJCQljZSA9IChsZi8yKSArIChyZi8yKTsKLQkJCQkJcnIgPSBsZiAtIGNlOwotCQkJCQlsciA9IHJmIC0gY2U7Ci0JCQkJCQlkc3RbMF0gPSAobGYmMHhGRik7Ci0JCQkJCQlkc3RbMV0gPSAoKGxmPj44KSYweEZGKTsKLQkJCQkJCWRzdFsyXSA9IChyZiYweEZGKTsKLQkJCQkJCWRzdFszXSA9ICgocmY+PjgpJjB4RkYpOwotCi0JCQkJCQlkc3RbMCs0XSA9IChsciYweEZGKTsKLQkJCQkJCWRzdFsxKzRdID0gKChscj4+OCkmMHhGRik7Ci0JCQkJCQlkc3RbMis0XSA9IChyciYweEZGKTsKLQkJCQkJCWRzdFszKzRdID0gKChycj4+OCkmMHhGRik7Ci0KLQkJCQkJCWRzdFswKzhdID0gKGNlJjB4RkYpOwotCQkJCQkJZHN0WzErOF0gPSAoKGNlPj44KSYweEZGKTsKLQkJCQkJCWRzdFsyKzhdID0gKGNlJjB4RkYpOwotCQkJCQkJZHN0WzMrOF0gPSAoKGNlPj44KSYweEZGKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBBVURJT19TMTY6IHsKLQkJCVVpbnQ4ICpzcmMsICpkc3Q7Ci0JCQlTaW50MTYgbGYsIHJmLCBjZSwgbHIsIHJyOwotCi0JCQlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7Ci0JCQlkc3QgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQqMzsKLQotCQkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSA9PSAweDEwMDAgKSB7Ci0JCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgewotCQkJCQlkc3QgLT0gMTI7Ci0JCQkJCXNyYyAtPSA0OwotCQkJCQlsZiA9IChTaW50MTYpKChzcmNbMF08PDgpfHNyY1sxXSk7Ci0JCQkJCXJmID0gKFNpbnQxNikoKHNyY1syXTw8OCl8c3JjWzNdKTsKLQkJCQkJY2UgPSAobGYvMikgKyAocmYvMik7Ci0JCQkJCXJyID0gbGYgLSBjZTsKLQkJCQkJbHIgPSByZiAtIGNlOwotCQkJCQkJZHN0WzFdID0gKGxmJjB4RkYpOwotCQkJCQkJZHN0WzBdID0gKChsZj4+OCkmMHhGRik7Ci0JCQkJCQlkc3RbM10gPSAocmYmMHhGRik7Ci0JCQkJCQlkc3RbMl0gPSAoKHJmPj44KSYweEZGKTsKLQotCQkJCQkJZHN0WzErNF0gPSAobHImMHhGRik7Ci0JCQkJCQlkc3RbMCs0XSA9ICgobHI+PjgpJjB4RkYpOwotCQkJCQkJZHN0WzMrNF0gPSAocnImMHhGRik7Ci0JCQkJCQlkc3RbMis0XSA9ICgocnI+PjgpJjB4RkYpOwotCi0JCQkJCQlkc3RbMSs4XSA9IChjZSYweEZGKTsKLQkJCQkJCWRzdFswKzhdID0gKChjZT4+OCkmMHhGRik7Ci0JCQkJCQlkc3RbMys4XSA9IChjZSYweEZGKTsKLQkJCQkJCWRzdFsyKzhdID0gKChjZT4+OCkmMHhGRik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7Ci0JCQkJCWRzdCAtPSAxMjsKLQkJCQkJc3JjIC09IDQ7Ci0JCQkJCWxmID0gKFNpbnQxNikoKHNyY1sxXTw8OCl8c3JjWzBdKTsKLQkJCQkJcmYgPSAoU2ludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOwotCQkJCQljZSA9IChsZi8yKSArIChyZi8yKTsKLQkJCQkJcnIgPSBsZiAtIGNlOwotCQkJCQlsciA9IHJmIC0gY2U7Ci0JCQkJCQlkc3RbMF0gPSAobGYmMHhGRik7Ci0JCQkJCQlkc3RbMV0gPSAoKGxmPj44KSYweEZGKTsKLQkJCQkJCWRzdFsyXSA9IChyZiYweEZGKTsKLQkJCQkJCWRzdFszXSA9ICgocmY+PjgpJjB4RkYpOwotCi0JCQkJCQlkc3RbMCs0XSA9IChsciYweEZGKTsKLQkJCQkJCWRzdFsxKzRdID0gKChscj4+OCkmMHhGRik7Ci0JCQkJCQlkc3RbMis0XSA9IChyciYweEZGKTsKLQkJCQkJCWRzdFszKzRdID0gKChycj4+OCkmMHhGRik7Ci0KLQkJCQkJCWRzdFswKzhdID0gKGNlJjB4RkYpOwotCQkJCQkJZHN0WzErOF0gPSAoKGNlPj44KSYweEZGKTsKLQkJCQkJCWRzdFsyKzhdID0gKGNlJjB4RkYpOwotCQkJCQkJZHN0WzMrOF0gPSAoKGNlPj44KSYweEZGKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWN2dC0+bGVuX2N2dCAqPSAzOwotCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgewotCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKLQl9Ci19Ci0KLQotLyogRHVwbGljYXRlIGEgc3RlcmVvIGNoYW5uZWwgdG8gYSBwc2V1ZG8tNC4wIHN0cmVhbSAqLwotdm9pZCBTRExDQUxMIFNETF9Db252ZXJ0U3Vycm91bmRfNChTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKLXsKLQlpbnQgaTsKLQotI2lmZGVmIERFQlVHX0NPTlZFUlQKLQlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgc3RlcmVvIHRvIHF1YWRcbiIpOwotI2VuZGlmCi0Jc3dpdGNoIChmb3JtYXQmMHg4MDE4KSB7Ci0KLQkJY2FzZSBBVURJT19VODogewotCQkJVWludDggKnNyYywgKmRzdCwgbGYsIHJmLCBjZTsKLQotCQkJc3JjID0gKFVpbnQ4ICopKGN2dC0+YnVmK2N2dC0+bGVuX2N2dCk7Ci0JCQlkc3QgPSAoVWludDggKikoY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjIpOwotCQkJZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKLQkJCQlkc3QgLT0gNDsKLQkJCQlzcmMgLT0gMjsKLQkJCQlsZiA9IHNyY1swXTsKLQkJCQlyZiA9IHNyY1sxXTsKLQkJCQljZSA9IChsZi8yKSArIChyZi8yKTsKLQkJCQlkc3RbMF0gPSBsZjsKLQkJCQlkc3RbMV0gPSByZjsKLQkJCQlkc3RbMl0gPSBsZiAtIGNlOwotCQkJCWRzdFszXSA9IHJmIC0gY2U7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBBVURJT19TODogewotCQkJU2ludDggKnNyYywgKmRzdCwgbGYsIHJmLCBjZTsKLQotCQkJc3JjID0gKFNpbnQ4ICopY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0OwotCQkJZHN0ID0gKFNpbnQ4ICopY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjI7Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dDsgaTsgLS1pICkgewotCQkJCWRzdCAtPSA0OwotCQkJCXNyYyAtPSAyOwotCQkJCWxmID0gc3JjWzBdOwotCQkJCXJmID0gc3JjWzFdOwotCQkJCWNlID0gKGxmLzIpICsgKHJmLzIpOwotCQkJCWRzdFswXSA9IGxmOwotCQkJCWRzdFsxXSA9IHJmOwotCQkJCWRzdFsyXSA9IGxmIC0gY2U7Ci0JCQkJZHN0WzNdID0gcmYgLSBjZTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCQljYXNlIEFVRElPX1UxNjogewotCQkJVWludDggKnNyYywgKmRzdDsKLQkJCVVpbnQxNiBsZiwgcmYsIGNlLCBsciwgcnI7Ci0KLQkJCXNyYyA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dDsKLQkJCWRzdCA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyOwotCi0JCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7Ci0JCQkJCWRzdCAtPSA4OwotCQkJCQlzcmMgLT0gNDsKLQkJCQkJbGYgPSAoVWludDE2KSgoc3JjWzBdPDw4KXxzcmNbMV0pOwotCQkJCQlyZiA9IChVaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7Ci0JCQkJCWNlID0gKGxmLzIpICsgKHJmLzIpOwotCQkJCQlyciA9IGxmIC0gY2U7Ci0JCQkJCWxyID0gcmYgLSBjZTsKLQkJCQkJCWRzdFsxXSA9IChsZiYweEZGKTsKLQkJCQkJCWRzdFswXSA9ICgobGY+PjgpJjB4RkYpOwotCQkJCQkJZHN0WzNdID0gKHJmJjB4RkYpOwotCQkJCQkJZHN0WzJdID0gKChyZj4+OCkmMHhGRik7Ci0KLQkJCQkJCWRzdFsxKzRdID0gKGxyJjB4RkYpOwotCQkJCQkJZHN0WzArNF0gPSAoKGxyPj44KSYweEZGKTsKLQkJCQkJCWRzdFszKzRdID0gKHJyJjB4RkYpOwotCQkJCQkJZHN0WzIrNF0gPSAoKHJyPj44KSYweEZGKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKLQkJCQkJZHN0IC09IDg7Ci0JCQkJCXNyYyAtPSA0OwotCQkJCQlsZiA9IChVaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7Ci0JCQkJCXJmID0gKFVpbnQxNikoKHNyY1szXTw8OCl8c3JjWzJdKTsKLQkJCQkJY2UgPSAobGYvMikgKyAocmYvMik7Ci0JCQkJCXJyID0gbGYgLSBjZTsKLQkJCQkJbHIgPSByZiAtIGNlOwotCQkJCQkJZHN0WzBdID0gKGxmJjB4RkYpOwotCQkJCQkJZHN0WzFdID0gKChsZj4+OCkmMHhGRik7Ci0JCQkJCQlkc3RbMl0gPSAocmYmMHhGRik7Ci0JCQkJCQlkc3RbM10gPSAoKHJmPj44KSYweEZGKTsKLQotCQkJCQkJZHN0WzArNF0gPSAobHImMHhGRik7Ci0JCQkJCQlkc3RbMSs0XSA9ICgobHI+PjgpJjB4RkYpOwotCQkJCQkJZHN0WzIrNF0gPSAocnImMHhGRik7Ci0JCQkJCQlkc3RbMys0XSA9ICgocnI+PjgpJjB4RkYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQotCQljYXNlIEFVRElPX1MxNjogewotCQkJVWludDggKnNyYywgKmRzdDsKLQkJCVNpbnQxNiBsZiwgcmYsIGNlLCBsciwgcnI7Ci0KLQkJCXNyYyA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dDsKLQkJCWRzdCA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyOwotCi0JCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKLQkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7Ci0JCQkJCWRzdCAtPSA4OwotCQkJCQlzcmMgLT0gNDsKLQkJCQkJbGYgPSAoU2ludDE2KSgoc3JjWzBdPDw4KXxzcmNbMV0pOwotCQkJCQlyZiA9IChTaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7Ci0JCQkJCWNlID0gKGxmLzIpICsgKHJmLzIpOwotCQkJCQlyciA9IGxmIC0gY2U7Ci0JCQkJCWxyID0gcmYgLSBjZTsKLQkJCQkJCWRzdFsxXSA9IChsZiYweEZGKTsKLQkJCQkJCWRzdFswXSA9ICgobGY+PjgpJjB4RkYpOwotCQkJCQkJZHN0WzNdID0gKHJmJjB4RkYpOwotCQkJCQkJZHN0WzJdID0gKChyZj4+OCkmMHhGRik7Ci0KLQkJCQkJCWRzdFsxKzRdID0gKGxyJjB4RkYpOwotCQkJCQkJZHN0WzArNF0gPSAoKGxyPj44KSYweEZGKTsKLQkJCQkJCWRzdFszKzRdID0gKHJyJjB4RkYpOwotCQkJCQkJZHN0WzIrNF0gPSAoKHJyPj44KSYweEZGKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKLQkJCQkJZHN0IC09IDg7Ci0JCQkJCXNyYyAtPSA0OwotCQkJCQlsZiA9IChTaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7Ci0JCQkJCXJmID0gKFNpbnQxNikoKHNyY1szXTw8OCl8c3JjWzJdKTsKLQkJCQkJY2UgPSAobGYvMikgKyAocmYvMik7Ci0JCQkJCXJyID0gbGYgLSBjZTsKLQkJCQkJbHIgPSByZiAtIGNlOwotCQkJCQkJZHN0WzBdID0gKGxmJjB4RkYpOwotCQkJCQkJZHN0WzFdID0gKChsZj4+OCkmMHhGRik7Ci0JCQkJCQlkc3RbMl0gPSAocmYmMHhGRik7Ci0JCQkJCQlkc3RbM10gPSAoKHJmPj44KSYweEZGKTsKLQotCQkJCQkJZHN0WzArNF0gPSAobHImMHhGRik7Ci0JCQkJCQlkc3RbMSs0XSA9ICgobHI+PjgpJjB4RkYpOwotCQkJCQkJZHN0WzIrNF0gPSAocnImMHhGRik7Ci0JCQkJCQlkc3RbMys0XSA9ICgocnI+PjgpJjB4RkYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JY3Z0LT5sZW5fY3Z0ICo9IDI7Ci0JaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOwotCX0KLX0KLQotCi0vKiBDb252ZXJ0IDgtYml0IHRvIDE2LWJpdCAtIExTQiAqLwotdm9pZCBTRExDQUxMIFNETF9Db252ZXJ0MTZMU0IoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCi17Ci0JaW50IGk7Ci0JVWludDggKnNyYywgKmRzdDsKLQotI2lmZGVmIERFQlVHX0NPTlZFUlQKLQlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgdG8gMTYtYml0IExTQlxuIik7Ci0jZW5kaWYKLQlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7Ci0JZHN0ID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjI7Ci0JZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKLQkJc3JjIC09IDE7Ci0JCWRzdCAtPSAyOwotCQlkc3RbMV0gPSAqc3JjOwotCQlkc3RbMF0gPSAwOwotCX0KLQlmb3JtYXQgPSAoKGZvcm1hdCAmIH4weDAwMDgpIHwgQVVESU9fVTE2TFNCKTsKLQljdnQtPmxlbl9jdnQgKj0gMjsKLQlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKLQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7Ci0JfQotfQotLyogQ29udmVydCA4LWJpdCB0byAxNi1iaXQgLSBNU0IgKi8KLXZvaWQgU0RMQ0FMTCBTRExfQ29udmVydDE2TVNCKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQotewotCWludCBpOwotCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLSNpZmRlZiBERUJVR19DT05WRVJUCi0JZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIHRvIDE2LWJpdCBNU0JcbiIpOwotI2VuZGlmCi0Jc3JjID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0OwotCWRzdCA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyOwotCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0OyBpOyAtLWkgKSB7Ci0JCXNyYyAtPSAxOwotCQlkc3QgLT0gMjsKLQkJZHN0WzBdID0gKnNyYzsKLQkJZHN0WzFdID0gMDsKLQl9Ci0JZm9ybWF0ID0gKChmb3JtYXQgJiB+MHgwMDA4KSB8IEFVRElPX1UxNk1TQik7Ci0JY3Z0LT5sZW5fY3Z0ICo9IDI7Ci0JaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOwotCX0KLX0KLQotLyogQ29udmVydCAxNi1iaXQgdG8gOC1iaXQgKi8KLXZvaWQgU0RMQ0FMTCBTRExfQ29udmVydDgoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCi17Ci0JaW50IGk7Ci0JVWludDggKnNyYywgKmRzdDsKLQotI2lmZGVmIERFQlVHX0NPTlZFUlQKLQlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgdG8gOC1iaXRcbiIpOwotI2VuZGlmCi0Jc3JjID0gY3Z0LT5idWY7Ci0JZHN0ID0gY3Z0LT5idWY7Ci0JaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSAhPSAweDEwMDAgKSB7IC8qIExpdHRsZSBlbmRpYW4gKi8KLQkJKytzcmM7Ci0JfQotCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzI7IGk7IC0taSApIHsKLQkJKmRzdCA9ICpzcmM7Ci0JCXNyYyArPSAyOwotCQlkc3QgKz0gMTsKLQl9Ci0JZm9ybWF0ID0gKChmb3JtYXQgJiB+MHg5MDEwKSB8IEFVRElPX1U4KTsKLQljdnQtPmxlbl9jdnQgLz0gMjsKLQlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKLQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7Ci0JfQotfQotCi0vKiBUb2dnbGUgc2lnbmVkL3Vuc2lnbmVkICovCi12b2lkIFNETENBTEwgU0RMX0NvbnZlcnRTaWduKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQotewotCWludCBpOwotCVVpbnQ4ICpkYXRhOwotCi0jaWZkZWYgREVCVUdfQ09OVkVSVAotCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyBhdWRpbyBzaWduZWRuZXNzXG4iKTsKLSNlbmRpZgotCWRhdGEgPSBjdnQtPmJ1ZjsKLQlpZiAoIChmb3JtYXQgJiAweEZGKSA9PSAxNiApIHsKLQkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSAhPSAweDEwMDAgKSB7IC8qIExpdHRsZSBlbmRpYW4gKi8KLQkJCSsrZGF0YTsKLQkJfQotCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8yOyBpOyAtLWkgKSB7Ci0JCQkqZGF0YSBePSAweDgwOwotCQkJZGF0YSArPSAyOwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKLQkJCSpkYXRhKysgXj0gMHg4MDsKLQkJfQotCX0KLQlmb3JtYXQgPSAoZm9ybWF0IF4gMHg4MDAwKTsKLQlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKLQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7Ci0JfQotfQotCi0vKiBUb2dnbGUgZW5kaWFubmVzcyAqLwotdm9pZCBTRExDQUxMIFNETF9Db252ZXJ0RW5kaWFuKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQotewotCWludCBpOwotCVVpbnQ4ICpkYXRhLCB0bXA7Ci0KLSNpZmRlZiBERUJVR19DT05WRVJUCi0JZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGF1ZGlvIGVuZGlhbm5lc3NcbiIpOwotI2VuZGlmCi0JZGF0YSA9IGN2dC0+YnVmOwotCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzI7IGk7IC0taSApIHsKLQkJdG1wID0gZGF0YVswXTsKLQkJZGF0YVswXSA9IGRhdGFbMV07Ci0JCWRhdGFbMV0gPSB0bXA7Ci0JCWRhdGEgKz0gMjsKLQl9Ci0JZm9ybWF0ID0gKGZvcm1hdCBeIDB4MTAwMCk7Ci0JaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOwotCX0KLX0KLQotLyogQ29udmVydCByYXRlIHVwIGJ5IG11bHRpcGxlIG9mIDIgKi8KLXZvaWQgU0RMQ0FMTCBTRExfUmF0ZU1VTDIoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCi17Ci0JaW50IGk7Ci0JVWludDggKnNyYywgKmRzdDsKLQotI2lmZGVmIERFQlVHX0NPTlZFUlQKLQlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgYXVkaW8gcmF0ZSAqIDJcbiIpOwotI2VuZGlmCi0Jc3JjID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0OwotCWRzdCA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyOwotCXN3aXRjaCAoZm9ybWF0ICYgMHhGRikgewotCQljYXNlIDg6Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dDsgaTsgLS1pICkgewotCQkJCXNyYyAtPSAxOwotCQkJCWRzdCAtPSAyOwotCQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCQlkc3RbMV0gPSBzcmNbMF07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAxNjoKLQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzI7IGk7IC0taSApIHsKLQkJCQlzcmMgLT0gMjsKLQkJCQlkc3QgLT0gNDsKLQkJCQlkc3RbMF0gPSBzcmNbMF07Ci0JCQkJZHN0WzFdID0gc3JjWzFdOwotCQkJCWRzdFsyXSA9IHNyY1swXTsKLQkJCQlkc3RbM10gPSBzcmNbMV07Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci0JY3Z0LT5sZW5fY3Z0ICo9IDI7Ci0JaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOwotCX0KLX0KLQotCi0vKiBDb252ZXJ0IHJhdGUgdXAgYnkgbXVsdGlwbGUgb2YgMiwgZm9yIHN0ZXJlbyAqLwotdm9pZCBTRExDQUxMIFNETF9SYXRlTVVMMl9jMihTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKLXsKLQlpbnQgaTsKLQlVaW50OCAqc3JjLCAqZHN0OwotCi0jaWZkZWYgREVCVUdfQ09OVkVSVAotCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyBhdWRpbyByYXRlICogMlxuIik7Ci0jZW5kaWYKLQlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7Ci0JZHN0ID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjI7Ci0Jc3dpdGNoIChmb3JtYXQgJiAweEZGKSB7Ci0JCWNhc2UgODoKLQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzI7IGk7IC0taSApIHsKLQkJCQlzcmMgLT0gMjsKLQkJCQlkc3QgLT0gNDsKLQkJCQlkc3RbMF0gPSBzcmNbMF07Ci0JCQkJZHN0WzFdID0gc3JjWzFdOwotCQkJCWRzdFsyXSA9IHNyY1swXTsKLQkJCQlkc3RbM10gPSBzcmNbMV07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAxNjoKLQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKLQkJCQlzcmMgLT0gNDsKLQkJCQlkc3QgLT0gODsKLQkJCQlkc3RbMF0gPSBzcmNbMF07Ci0JCQkJZHN0WzFdID0gc3JjWzFdOwotCQkJCWRzdFsyXSA9IHNyY1syXTsKLQkJCQlkc3RbM10gPSBzcmNbM107Ci0JCQkJZHN0WzRdID0gc3JjWzBdOwotCQkJCWRzdFs1XSA9IHNyY1sxXTsKLQkJCQlkc3RbNl0gPSBzcmNbMl07Ci0JCQkJZHN0WzddID0gc3JjWzNdOwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCWN2dC0+bGVuX2N2dCAqPSAyOwotCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgewotCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKLQl9Ci19Ci0KLS8qIENvbnZlcnQgcmF0ZSB1cCBieSBtdWx0aXBsZSBvZiAyLCBmb3IgcXVhZCAqLwotdm9pZCBTRExDQUxMIFNETF9SYXRlTVVMMl9jNChTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKLXsKLQlpbnQgaTsKLQlVaW50OCAqc3JjLCAqZHN0OwotCi0jaWZkZWYgREVCVUdfQ09OVkVSVAotCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyBhdWRpbyByYXRlICogMlxuIik7Ci0jZW5kaWYKLQlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7Ci0JZHN0ID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjI7Ci0Jc3dpdGNoIChmb3JtYXQgJiAweEZGKSB7Ci0JCWNhc2UgODoKLQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKLQkJCQlzcmMgLT0gNDsKLQkJCQlkc3QgLT0gODsKLQkJCQlkc3RbMF0gPSBzcmNbMF07Ci0JCQkJZHN0WzFdID0gc3JjWzFdOwotCQkJCWRzdFsyXSA9IHNyY1syXTsKLQkJCQlkc3RbM10gPSBzcmNbM107Ci0JCQkJZHN0WzRdID0gc3JjWzBdOwotCQkJCWRzdFs1XSA9IHNyY1sxXTsKLQkJCQlkc3RbNl0gPSBzcmNbMl07Ci0JCQkJZHN0WzddID0gc3JjWzNdOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC84OyBpOyAtLWkgKSB7Ci0JCQkJc3JjIC09IDg7Ci0JCQkJZHN0IC09IDE2OwotCQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCQlkc3RbMV0gPSBzcmNbMV07Ci0JCQkJZHN0WzJdID0gc3JjWzJdOwotCQkJCWRzdFszXSA9IHNyY1szXTsKLQkJCQlkc3RbNF0gPSBzcmNbNF07Ci0JCQkJZHN0WzVdID0gc3JjWzVdOwotCQkJCWRzdFs2XSA9IHNyY1s2XTsKLQkJCQlkc3RbN10gPSBzcmNbN107Ci0JCQkJZHN0WzhdID0gc3JjWzBdOwotCQkJCWRzdFs5XSA9IHNyY1sxXTsKLQkJCQlkc3RbMTBdID0gc3JjWzJdOwotCQkJCWRzdFsxMV0gPSBzcmNbM107Ci0JCQkJZHN0WzEyXSA9IHNyY1s0XTsKLQkJCQlkc3RbMTNdID0gc3JjWzVdOwotCQkJCWRzdFsxNF0gPSBzcmNbNl07Ci0JCQkJZHN0WzE1XSA9IHNyY1s3XTsKLQkJCX0KLQkJCWJyZWFrOwotCX0KLQljdnQtPmxlbl9jdnQgKj0gMjsKLQlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKLQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7Ci0JfQotfQotCi0KLS8qIENvbnZlcnQgcmF0ZSB1cCBieSBtdWx0aXBsZSBvZiAyLCBmb3IgNS4xICovCi12b2lkIFNETENBTEwgU0RMX1JhdGVNVUwyX2M2KFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQotewotCWludCBpOwotCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLSNpZmRlZiBERUJVR19DT05WRVJUCi0JZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGF1ZGlvIHJhdGUgKiAyXG4iKTsKLSNlbmRpZgotCXNyYyA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dDsKLQlkc3QgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQqMjsKLQlzd2l0Y2ggKGZvcm1hdCAmIDB4RkYpIHsKLQkJY2FzZSA4OgotCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNjsgaTsgLS1pICkgewotCQkJCXNyYyAtPSA2OwotCQkJCWRzdCAtPSAxMjsKLQkJCQlkc3RbMF0gPSBzcmNbMF07Ci0JCQkJZHN0WzFdID0gc3JjWzFdOwotCQkJCWRzdFsyXSA9IHNyY1syXTsKLQkJCQlkc3RbM10gPSBzcmNbM107Ci0JCQkJZHN0WzRdID0gc3JjWzRdOwotCQkJCWRzdFs1XSA9IHNyY1s1XTsKLQkJCQlkc3RbNl0gPSBzcmNbMF07Ci0JCQkJZHN0WzddID0gc3JjWzFdOwotCQkJCWRzdFs4XSA9IHNyY1syXTsKLQkJCQlkc3RbOV0gPSBzcmNbM107Ci0JCQkJZHN0WzEwXSA9IHNyY1s0XTsKLQkJCQlkc3RbMTFdID0gc3JjWzVdOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8xMjsgaTsgLS1pICkgewotCQkJCXNyYyAtPSAxMjsKLQkJCQlkc3QgLT0gMjQ7Ci0JCQkJZHN0WzBdID0gc3JjWzBdOwotCQkJCWRzdFsxXSA9IHNyY1sxXTsKLQkJCQlkc3RbMl0gPSBzcmNbMl07Ci0JCQkJZHN0WzNdID0gc3JjWzNdOwotCQkJCWRzdFs0XSA9IHNyY1s0XTsKLQkJCQlkc3RbNV0gPSBzcmNbNV07Ci0JCQkJZHN0WzZdID0gc3JjWzZdOwotCQkJCWRzdFs3XSA9IHNyY1s3XTsKLQkJCQlkc3RbOF0gPSBzcmNbOF07Ci0JCQkJZHN0WzldID0gc3JjWzldOwotCQkJCWRzdFsxMF0gPSBzcmNbMTBdOwotCQkJCWRzdFsxMV0gPSBzcmNbMTFdOwotCQkJCWRzdFsxMl0gPSBzcmNbMF07Ci0JCQkJZHN0WzEzXSA9IHNyY1sxXTsKLQkJCQlkc3RbMTRdID0gc3JjWzJdOwotCQkJCWRzdFsxNV0gPSBzcmNbM107Ci0JCQkJZHN0WzE2XSA9IHNyY1s0XTsKLQkJCQlkc3RbMTddID0gc3JjWzVdOwotCQkJCWRzdFsxOF0gPSBzcmNbNl07Ci0JCQkJZHN0WzE5XSA9IHNyY1s3XTsKLQkJCQlkc3RbMjBdID0gc3JjWzhdOwotCQkJCWRzdFsyMV0gPSBzcmNbOV07Ci0JCQkJZHN0WzIyXSA9IHNyY1sxMF07Ci0JCQkJZHN0WzIzXSA9IHNyY1sxMV07Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci0JY3Z0LT5sZW5fY3Z0ICo9IDI7Ci0JaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOwotCX0KLX0KLQotLyogQ29udmVydCByYXRlIGRvd24gYnkgbXVsdGlwbGUgb2YgMiAqLwotdm9pZCBTRExDQUxMIFNETF9SYXRlRElWMihTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKLXsKLQlpbnQgaTsKLQlVaW50OCAqc3JjLCAqZHN0OwotCi0jaWZkZWYgREVCVUdfQ09OVkVSVAotCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyBhdWRpbyByYXRlIC8gMlxuIik7Ci0jZW5kaWYKLQlzcmMgPSBjdnQtPmJ1ZjsKLQlkc3QgPSBjdnQtPmJ1ZjsKLQlzd2l0Y2ggKGZvcm1hdCAmIDB4RkYpIHsKLQkJY2FzZSA4OgotCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvMjsgaTsgLS1pICkgewotCQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCQlzcmMgKz0gMjsKLQkJCQlkc3QgKz0gMTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgewotCQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCQlkc3RbMV0gPSBzcmNbMV07Ci0JCQkJc3JjICs9IDQ7Ci0JCQkJZHN0ICs9IDI7Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci0JY3Z0LT5sZW5fY3Z0IC89IDI7Ci0JaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOwotCX0KLX0KLQotCi0vKiBDb252ZXJ0IHJhdGUgZG93biBieSBtdWx0aXBsZSBvZiAyLCBmb3Igc3RlcmVvICovCi12b2lkIFNETENBTEwgU0RMX1JhdGVESVYyX2MyKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQotewotCWludCBpOwotCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLSNpZmRlZiBERUJVR19DT05WRVJUCi0JZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGF1ZGlvIHJhdGUgLyAyXG4iKTsKLSNlbmRpZgotCXNyYyA9IGN2dC0+YnVmOwotCWRzdCA9IGN2dC0+YnVmOwotCXN3aXRjaCAoZm9ybWF0ICYgMHhGRikgewotCQljYXNlIDg6Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7Ci0JCQkJZHN0WzBdID0gc3JjWzBdOwotCQkJCWRzdFsxXSA9IHNyY1sxXTsKLQkJCQlzcmMgKz0gNDsKLQkJCQlkc3QgKz0gMjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvODsgaTsgLS1pICkgewotCQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCQlkc3RbMV0gPSBzcmNbMV07Ci0JCQkJZHN0WzJdID0gc3JjWzJdOwotCQkJCWRzdFszXSA9IHNyY1szXTsKLQkJCQlzcmMgKz0gODsKLQkJCQlkc3QgKz0gNDsKLQkJCX0KLQkJCWJyZWFrOwotCX0KLQljdnQtPmxlbl9jdnQgLz0gMjsKLQlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKLQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7Ci0JfQotfQotCi0KLS8qIENvbnZlcnQgcmF0ZSBkb3duIGJ5IG11bHRpcGxlIG9mIDIsIGZvciBxdWFkICovCi12b2lkIFNETENBTEwgU0RMX1JhdGVESVYyX2M0KFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQotewotCWludCBpOwotCVVpbnQ4ICpzcmMsICpkc3Q7Ci0KLSNpZmRlZiBERUJVR19DT05WRVJUCi0JZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGF1ZGlvIHJhdGUgLyAyXG4iKTsKLSNlbmRpZgotCXNyYyA9IGN2dC0+YnVmOwotCWRzdCA9IGN2dC0+YnVmOwotCXN3aXRjaCAoZm9ybWF0ICYgMHhGRikgewotCQljYXNlIDg6Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC84OyBpOyAtLWkgKSB7Ci0JCQkJZHN0WzBdID0gc3JjWzBdOwotCQkJCWRzdFsxXSA9IHNyY1sxXTsKLQkJCQlkc3RbMl0gPSBzcmNbMl07Ci0JCQkJZHN0WzNdID0gc3JjWzNdOwotCQkJCXNyYyArPSA4OwotCQkJCWRzdCArPSA0OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8xNjsgaTsgLS1pICkgewotCQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCQlkc3RbMV0gPSBzcmNbMV07Ci0JCQkJZHN0WzJdID0gc3JjWzJdOwotCQkJCWRzdFszXSA9IHNyY1szXTsKLQkJCQlkc3RbNF0gPSBzcmNbNF07Ci0JCQkJZHN0WzVdID0gc3JjWzVdOwotCQkJCWRzdFs2XSA9IHNyY1s2XTsKLQkJCQlkc3RbN10gPSBzcmNbN107Ci0JCQkJc3JjICs9IDE2OwotCQkJCWRzdCArPSA4OwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCWN2dC0+bGVuX2N2dCAvPSAyOwotCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgewotCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKLQl9Ci19Ci0KLS8qIENvbnZlcnQgcmF0ZSBkb3duIGJ5IG11bHRpcGxlIG9mIDIsIGZvciA1LjEgKi8KLXZvaWQgU0RMQ0FMTCBTRExfUmF0ZURJVjJfYzYoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCi17Ci0JaW50IGk7Ci0JVWludDggKnNyYywgKmRzdDsKLQotI2lmZGVmIERFQlVHX0NPTlZFUlQKLQlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgYXVkaW8gcmF0ZSAvIDJcbiIpOwotI2VuZGlmCi0Jc3JjID0gY3Z0LT5idWY7Ci0JZHN0ID0gY3Z0LT5idWY7Ci0Jc3dpdGNoIChmb3JtYXQgJiAweEZGKSB7Ci0JCWNhc2UgODoKLQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzEyOyBpOyAtLWkgKSB7Ci0JCQkJZHN0WzBdID0gc3JjWzBdOwotCQkJCWRzdFsxXSA9IHNyY1sxXTsKLQkJCQlkc3RbMl0gPSBzcmNbMl07Ci0JCQkJZHN0WzNdID0gc3JjWzNdOwotCQkJCWRzdFs0XSA9IHNyY1s0XTsKLQkJCQlkc3RbNV0gPSBzcmNbNV07Ci0JCQkJc3JjICs9IDEyOwotCQkJCWRzdCArPSA2OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8yNDsgaTsgLS1pICkgewotCQkJCWRzdFswXSA9IHNyY1swXTsKLQkJCQlkc3RbMV0gPSBzcmNbMV07Ci0JCQkJZHN0WzJdID0gc3JjWzJdOwotCQkJCWRzdFszXSA9IHNyY1szXTsKLQkJCQlkc3RbNF0gPSBzcmNbNF07Ci0JCQkJZHN0WzVdID0gc3JjWzVdOwotCQkJCWRzdFs2XSA9IHNyY1s2XTsKLQkJCQlkc3RbN10gPSBzcmNbN107Ci0JCQkJZHN0WzhdID0gc3JjWzhdOwotCQkJCWRzdFs5XSA9IHNyY1s5XTsKLQkJCQlkc3RbMTBdID0gc3JjWzEwXTsKLQkJCQlkc3RbMTFdID0gc3JjWzExXTsKLQkJCQlzcmMgKz0gMjQ7Ci0JCQkJZHN0ICs9IDEyOwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCWN2dC0+bGVuX2N2dCAvPSAyOwotCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgewotCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKLQl9Ci19Ci0KLS8qIFZlcnkgc2xvdyByYXRlIGNvbnZlcnNpb24gcm91dGluZSAqLwotdm9pZCBTRExDQUxMIFNETF9SYXRlU0xPVyhTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKLXsKLQlkb3VibGUgaXBvczsKLQlpbnQgaSwgY2xlbjsKLQotI2lmZGVmIERFQlVHX0NPTlZFUlQKLQlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgYXVkaW8gcmF0ZSAqICU0LjRmXG4iLCAxLjAvY3Z0LT5yYXRlX2luY3IpOwotI2VuZGlmCi0JY2xlbiA9IChpbnQpKChkb3VibGUpY3Z0LT5sZW5fY3Z0IC8gY3Z0LT5yYXRlX2luY3IpOwotCWlmICggY3Z0LT5yYXRlX2luY3IgPiAxLjAgKSB7Ci0JCXN3aXRjaCAoZm9ybWF0ICYgMHhGRikgewotCQkJY2FzZSA4OiB7Ci0JCQkJVWludDggKm91dHB1dDsKLQotCQkJCW91dHB1dCA9IGN2dC0+YnVmOwotCQkJCWlwb3MgPSAwLjA7Ci0JCQkJZm9yICggaT1jbGVuOyBpOyAtLWkgKSB7Ci0JCQkJCSpvdXRwdXQgPSBjdnQtPmJ1ZlsoaW50KWlwb3NdOwotCQkJCQlpcG9zICs9IGN2dC0+cmF0ZV9pbmNyOwotCQkJCQlvdXRwdXQgKz0gMTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQkJY2FzZSAxNjogewotCQkJCVVpbnQxNiAqb3V0cHV0OwotCi0JCQkJY2xlbiAmPSB+MTsKLQkJCQlvdXRwdXQgPSAoVWludDE2ICopY3Z0LT5idWY7Ci0JCQkJaXBvcyA9IDAuMDsKLQkJCQlmb3IgKCBpPWNsZW4vMjsgaTsgLS1pICkgewotCQkJCQkqb3V0cHV0PSgoVWludDE2ICopY3Z0LT5idWYpWyhpbnQpaXBvc107Ci0JCQkJCWlwb3MgKz0gY3Z0LT5yYXRlX2luY3I7Ci0JCQkJCW91dHB1dCArPSAxOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChmb3JtYXQgJiAweEZGKSB7Ci0JCQljYXNlIDg6IHsKLQkJCQlVaW50OCAqb3V0cHV0OwotCi0JCQkJb3V0cHV0ID0gY3Z0LT5idWYrY2xlbjsKLQkJCQlpcG9zID0gKGRvdWJsZSljdnQtPmxlbl9jdnQ7Ci0JCQkJZm9yICggaT1jbGVuOyBpOyAtLWkgKSB7Ci0JCQkJCWlwb3MgLT0gY3Z0LT5yYXRlX2luY3I7Ci0JCQkJCW91dHB1dCAtPSAxOwotCQkJCQkqb3V0cHV0ID0gY3Z0LT5idWZbKGludClpcG9zXTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQkJY2FzZSAxNjogewotCQkJCVVpbnQxNiAqb3V0cHV0OwotCi0JCQkJY2xlbiAmPSB+MTsKLQkJCQlvdXRwdXQgPSAoVWludDE2ICopKGN2dC0+YnVmK2NsZW4pOwotCQkJCWlwb3MgPSAoZG91YmxlKWN2dC0+bGVuX2N2dC8yOwotCQkJCWZvciAoIGk9Y2xlbi8yOyBpOyAtLWkgKSB7Ci0JCQkJCWlwb3MgLT0gY3Z0LT5yYXRlX2luY3I7Ci0JCQkJCW91dHB1dCAtPSAxOwotCQkJCQkqb3V0cHV0PSgoVWludDE2ICopY3Z0LT5idWYpWyhpbnQpaXBvc107Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JY3Z0LT5sZW5fY3Z0ID0gY2xlbjsKLQlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKLQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7Ci0JfQotfQotCi1pbnQgU0RMX0NvbnZlcnRBdWRpbyhTRExfQXVkaW9DVlQgKmN2dCkKLXsKLQkvKiBNYWtlIHN1cmUgdGhlcmUncyBkYXRhIHRvIGNvbnZlcnQgKi8KLQlpZiAoIGN2dC0+YnVmID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiTm8gYnVmZmVyIGFsbG9jYXRlZCBmb3IgY29udmVyc2lvbiIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQkvKiBSZXR1cm4gb2theSBpZiBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSAqLwotCWN2dC0+bGVuX2N2dCA9IGN2dC0+bGVuOwotCWlmICggY3Z0LT5maWx0ZXJzWzBdID09IE5VTEwgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIGNvbnZlcnNpb24gYW5kIGdvISAqLwotCWN2dC0+ZmlsdGVyX2luZGV4ID0gMDsKLQljdnQtPmZpbHRlcnNbMF0oY3Z0LCBjdnQtPnNyY19mb3JtYXQpOwotCXJldHVybigwKTsKLX0KLQotLyogQ3JlYXRlcyBhIHNldCBvZiBhdWRpbyBmaWx0ZXJzIHRvIGNvbnZlcnQgZnJvbSBvbmUgZm9ybWF0IHRvIGFub3RoZXIuIAotICAgUmV0dXJucyAtMSBpZiB0aGUgZm9ybWF0IGNvbnZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCwgb3IgMSBpZiB0aGUKLSAgIGF1ZGlvIGZpbHRlciBpcyBzZXQgdXAuCi0qLwotICAKLWludCBTRExfQnVpbGRBdWRpb0NWVChTRExfQXVkaW9DVlQgKmN2dCwKLQlVaW50MTYgc3JjX2Zvcm1hdCwgVWludDggc3JjX2NoYW5uZWxzLCBpbnQgc3JjX3JhdGUsCi0JVWludDE2IGRzdF9mb3JtYXQsIFVpbnQ4IGRzdF9jaGFubmVscywgaW50IGRzdF9yYXRlKQotewotLypwcmludGYoIkJ1aWxkIGZvcm1hdCAlMDR4LT4lMDR4LCBjaGFubmVscyAldS0+JXUsIHJhdGUgJWQtPiVkXG4iLAotCQlzcmNfZm9ybWF0LCBkc3RfZm9ybWF0LCBzcmNfY2hhbm5lbHMsIGRzdF9jaGFubmVscywgc3JjX3JhdGUsIGRzdF9yYXRlKTsqLwotCS8qIFN0YXJ0IG9mZiB3aXRoIG5vIGNvbnZlcnNpb24gbmVjZXNzYXJ5ICovCi0JY3Z0LT5uZWVkZWQgPSAwOwotCWN2dC0+ZmlsdGVyX2luZGV4ID0gMDsKLQljdnQtPmZpbHRlcnNbMF0gPSBOVUxMOwotCWN2dC0+bGVuX211bHQgPSAxOwotCWN2dC0+bGVuX3JhdGlvID0gMS4wOwotCi0JLyogRmlyc3QgZmlsdGVyOiAgRW5kaWFuIGNvbnZlcnNpb24gZnJvbSBzcmMgdG8gZHN0ICovCi0JaWYgKCAoc3JjX2Zvcm1hdCAmIDB4MTAwMCkgIT0gKGRzdF9mb3JtYXQgJiAweDEwMDApCi0JICAgICAmJiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxNikgJiYgKChkc3RfZm9ybWF0ICYgMHhmZikgPT0gMTYpKSB7Ci0JCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleCsrXSA9IFNETF9Db252ZXJ0RW5kaWFuOwotCX0KLQkKLQkvKiBTZWNvbmQgZmlsdGVyOiBTaWduIGNvbnZlcnNpb24gLS0gc2lnbmVkL3Vuc2lnbmVkICovCi0JaWYgKCAoc3JjX2Zvcm1hdCAmIDB4ODAwMCkgIT0gKGRzdF9mb3JtYXQgJiAweDgwMDApICkgewotCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXgrK10gPSBTRExfQ29udmVydFNpZ247Ci0JfQotCi0JLyogTmV4dCBmaWx0ZXI6ICBDb252ZXJ0IDE2IGJpdCA8LS0+IDggYml0IFBDTSAqLwotCWlmICggKHNyY19mb3JtYXQgJiAweEZGKSAhPSAoZHN0X2Zvcm1hdCAmIDB4RkYpICkgewotCQlzd2l0Y2ggKGRzdF9mb3JtYXQmMHgxMEZGKSB7Ci0JCQljYXNlIEFVRElPX1U4OgotCQkJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleCsrXSA9Ci0JCQkJCQkJIFNETF9Db252ZXJ0ODsKLQkJCQljdnQtPmxlbl9yYXRpbyAvPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURJT19VMTZMU0I6Ci0JCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0KLQkJCQkJCQlTRExfQ29udmVydDE2TFNCOwotCQkJCWN2dC0+bGVuX211bHQgKj0gMjsKLQkJCQljdnQtPmxlbl9yYXRpbyAqPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURJT19VMTZNU0I6Ci0JCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0KLQkJCQkJCQlTRExfQ29udmVydDE2TVNCOwotCQkJCWN2dC0+bGVuX211bHQgKj0gMjsKLQkJCQljdnQtPmxlbl9yYXRpbyAqPSAyOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogTGFzdCBmaWx0ZXI6ICBNb25vL1N0ZXJlbyBjb252ZXJzaW9uICovCi0JaWYgKCBzcmNfY2hhbm5lbHMgIT0gZHN0X2NoYW5uZWxzICkgewotCQlpZiAoIChzcmNfY2hhbm5lbHMgPT0gMSkgJiYgKGRzdF9jaGFubmVscyA+IDEpICkgewotCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0gCi0JCQkJCQlTRExfQ29udmVydFN0ZXJlbzsKLQkJCWN2dC0+bGVuX211bHQgKj0gMjsKLQkJCXNyY19jaGFubmVscyA9IDI7Ci0JCQljdnQtPmxlbl9yYXRpbyAqPSAyOwotCQl9Ci0JCWlmICggKHNyY19jaGFubmVscyA9PSAyKSAmJgotCQkJCShkc3RfY2hhbm5lbHMgPT0gNikgKSB7Ci0JCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXgrK10gPQotCQkJCQkJIFNETF9Db252ZXJ0U3Vycm91bmQ7Ci0JCQlzcmNfY2hhbm5lbHMgPSA2OwotCQkJY3Z0LT5sZW5fbXVsdCAqPSAzOwotCQkJY3Z0LT5sZW5fcmF0aW8gKj0gMzsKLQkJfQotCQlpZiAoIChzcmNfY2hhbm5lbHMgPT0gMikgJiYKLQkJCQkoZHN0X2NoYW5uZWxzID09IDQpICkgewotCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0KLQkJCQkJCSBTRExfQ29udmVydFN1cnJvdW5kXzQ7Ci0JCQlzcmNfY2hhbm5lbHMgPSA0OwotCQkJY3Z0LT5sZW5fbXVsdCAqPSAyOwotCQkJY3Z0LT5sZW5fcmF0aW8gKj0gMjsKLQkJfQotCQl3aGlsZSAoIChzcmNfY2hhbm5lbHMqMikgPD0gZHN0X2NoYW5uZWxzICkgewotCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0gCi0JCQkJCQlTRExfQ29udmVydFN0ZXJlbzsKLQkJCWN2dC0+bGVuX211bHQgKj0gMjsKLQkJCXNyY19jaGFubmVscyAqPSAyOwotCQkJY3Z0LT5sZW5fcmF0aW8gKj0gMjsKLQkJfQotCQlpZiAoIChzcmNfY2hhbm5lbHMgPT0gNikgJiYKLQkJCQkoZHN0X2NoYW5uZWxzIDw9IDIpICkgewotCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0KLQkJCQkJCSBTRExfQ29udmVydFN0cmlwOwotCQkJc3JjX2NoYW5uZWxzID0gMjsKLQkJCWN2dC0+bGVuX3JhdGlvIC89IDM7Ci0JCX0KLQkJaWYgKCAoc3JjX2NoYW5uZWxzID09IDYpICYmCi0JCQkJKGRzdF9jaGFubmVscyA9PSA0KSApIHsKLQkJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleCsrXSA9Ci0JCQkJCQkgU0RMX0NvbnZlcnRTdHJpcF8yOwotCQkJc3JjX2NoYW5uZWxzID0gNDsKLQkJCWN2dC0+bGVuX3JhdGlvIC89IDI7Ci0JCX0KLQkJLyogVGhpcyBhc3N1bWVzIHRoYXQgNCBjaGFubmVsIGF1ZGlvIGlzIGluIHRoZSBmb3JtYXQ6Ci0JCSAgICAgTGVmdCB7ZnJvbnQvYmFja30gKyBSaWdodCB7ZnJvbnQvYmFja30KLQkJICAgc28gY29udmVydGluZyB0byBML1Igc3RlcmVvIHdvcmtzIHByb3Blcmx5LgotCQkgKi8KLQkJd2hpbGUgKCAoKHNyY19jaGFubmVscyUyKSA9PSAwKSAmJgotCQkJCSgoc3JjX2NoYW5uZWxzLzIpID49IGRzdF9jaGFubmVscykgKSB7Ci0JCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXgrK10gPQotCQkJCQkJIFNETF9Db252ZXJ0TW9ubzsKLQkJCXNyY19jaGFubmVscyAvPSAyOwotCQkJY3Z0LT5sZW5fcmF0aW8gLz0gMjsKLQkJfQotCQlpZiAoIHNyY19jaGFubmVscyAhPSBkc3RfY2hhbm5lbHMgKSB7Ci0JCQkvKiBVaCBvaC4uICovOwotCQl9Ci0JfQotCi0JLyogRG8gcmF0ZSBjb252ZXJzaW9uICovCi0JY3Z0LT5yYXRlX2luY3IgPSAwLjA7Ci0JaWYgKCAoc3JjX3JhdGUvMTAwKSAhPSAoZHN0X3JhdGUvMTAwKSApIHsKLQkJVWludDMyIGhpX3JhdGUsIGxvX3JhdGU7Ci0JCWludCBsZW5fbXVsdDsKLQkJZG91YmxlIGxlbl9yYXRpbzsKLQkJdm9pZCAoU0RMQ0FMTCAqcmF0ZV9jdnQpKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KTsKLQotCQlpZiAoIHNyY19yYXRlID4gZHN0X3JhdGUgKSB7Ci0JCQloaV9yYXRlID0gc3JjX3JhdGU7Ci0JCQlsb19yYXRlID0gZHN0X3JhdGU7Ci0JCQlzd2l0Y2ggKHNyY19jaGFubmVscykgewotCQkJCWNhc2UgMTogcmF0ZV9jdnQgPSBTRExfUmF0ZURJVjI7IGJyZWFrOwotCQkJCWNhc2UgMjogcmF0ZV9jdnQgPSBTRExfUmF0ZURJVjJfYzI7IGJyZWFrOwotCQkJCWNhc2UgNDogcmF0ZV9jdnQgPSBTRExfUmF0ZURJVjJfYzQ7IGJyZWFrOwotCQkJCWNhc2UgNjogcmF0ZV9jdnQgPSBTRExfUmF0ZURJVjJfYzY7IGJyZWFrOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJCWxlbl9tdWx0ID0gMTsKLQkJCWxlbl9yYXRpbyA9IDAuNTsKLQkJfSBlbHNlIHsKLQkJCWhpX3JhdGUgPSBkc3RfcmF0ZTsKLQkJCWxvX3JhdGUgPSBzcmNfcmF0ZTsKLQkJCXN3aXRjaCAoc3JjX2NoYW5uZWxzKSB7Ci0JCQkJY2FzZSAxOiByYXRlX2N2dCA9IFNETF9SYXRlTVVMMjsgYnJlYWs7Ci0JCQkJY2FzZSAyOiByYXRlX2N2dCA9IFNETF9SYXRlTVVMMl9jMjsgYnJlYWs7Ci0JCQkJY2FzZSA0OiByYXRlX2N2dCA9IFNETF9SYXRlTVVMMl9jNDsgYnJlYWs7Ci0JCQkJY2FzZSA2OiByYXRlX2N2dCA9IFNETF9SYXRlTVVMMl9jNjsgYnJlYWs7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQkJbGVuX211bHQgPSAyOwotCQkJbGVuX3JhdGlvID0gMi4wOwotCQl9Ci0JCS8qIElmIGhpX3JhdGUgPSBsb19yYXRlKjJeeCB0aGVuIGNvbnZlcnNpb24gaXMgZWFzeSAqLwotCQl3aGlsZSAoICgobG9fcmF0ZSoyKS8xMDApIDw9IChoaV9yYXRlLzEwMCkgKSB7Ci0JCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXgrK10gPSByYXRlX2N2dDsKLQkJCWN2dC0+bGVuX211bHQgKj0gbGVuX211bHQ7Ci0JCQlsb19yYXRlICo9IDI7Ci0JCQljdnQtPmxlbl9yYXRpbyAqPSBsZW5fcmF0aW87Ci0JCX0KLQkJLyogV2UgbWF5IG5lZWQgYSBzbG93IGNvbnZlcnNpb24gaGVyZSB0byBmaW5pc2ggdXAgKi8KLQkJaWYgKCAobG9fcmF0ZS8xMDApICE9IChoaV9yYXRlLzEwMCkgKSB7Ci0jaWYgMQotCQkJLyogVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgaWYgdGhlIGlucHV0IGJ1ZmZlciBpcwotCQkJICAgc2F5IDFLLCBhbmQgdGhlIGNvbnZlcnNpb24gcmF0ZSBpcyBzYXkgMS4xLCB0aGVuIHRoZQotCQkJICAgb3V0cHV0IGJ1ZmZlciBpcyAxLjFLLCB3aGljaCBtYXkgbm90IGJlIGFuIGFjY2VwdGFibGUKLQkJCSAgIGJ1ZmZlciBzaXplIGZvciB0aGUgYXVkaW8gZHJpdmVyIChub3QgYSBwb3dlciBvZiAyKQotCQkJKi8KLQkJCS8qIEZvciBub3csIHB1bnQgYW5kIGhvcGUgdGhlIHJhdGUgZGlzdG9ydGlvbiBpc24ndCBncmVhdC4KLQkJCSovCi0jZWxzZQotCQkJaWYgKCBzcmNfcmF0ZSA8IGRzdF9yYXRlICkgewotCQkJCWN2dC0+cmF0ZV9pbmNyID0gKGRvdWJsZSlsb19yYXRlL2hpX3JhdGU7Ci0JCQkJY3Z0LT5sZW5fbXVsdCAqPSAyOwotCQkJCWN2dC0+bGVuX3JhdGlvIC89IGN2dC0+cmF0ZV9pbmNyOwotCQkJfSBlbHNlIHsKLQkJCQljdnQtPnJhdGVfaW5jciA9IChkb3VibGUpaGlfcmF0ZS9sb19yYXRlOwotCQkJCWN2dC0+bGVuX3JhdGlvICo9IGN2dC0+cmF0ZV9pbmNyOwotCQkJfQotCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0gU0RMX1JhdGVTTE9XOwotI2VuZGlmCi0JCX0KLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIGZpbHRlciBpbmZvcm1hdGlvbiAqLwotCWlmICggY3Z0LT5maWx0ZXJfaW5kZXggIT0gMCApIHsKLQkJY3Z0LT5uZWVkZWQgPSAxOwotCQljdnQtPnNyY19mb3JtYXQgPSBzcmNfZm9ybWF0OwotCQljdnQtPmRzdF9mb3JtYXQgPSBkc3RfZm9ybWF0OwotCQljdnQtPmxlbiA9IDA7Ci0JCWN2dC0+YnVmID0gTlVMTDsKLQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XSA9IE5VTEw7Ci0JfQotCXJldHVybihjdnQtPm5lZWRlZCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpb2Rldi5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfYXVkaW9kZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2NzFmOS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpb2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGF1ZGlvIGRldmljZSB3ZSB1c2UgZm9yIG91dHB1dCAqLwotCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9CU0QgfHwgU0RMX0FVRElPX0RSSVZFUl9PU1MgfHwgU0RMX0FVRElPX0RSSVZFUl9TVU5BVURJTwotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9hdWRpb2Rldl9jLmgiCi0KLSNpZm5kZWYgX1BBVEhfREVWX0RTUAotI2lmIGRlZmluZWQoX19ORVRCU0RfXykgfHwgZGVmaW5lZChfX09QRU5CU0RfXykKLSNkZWZpbmUgX1BBVEhfREVWX0RTUCAgIi9kZXYvYXVkaW8iCi0jZWxzZQotI2RlZmluZSBfUEFUSF9ERVZfRFNQICAiL2Rldi9kc3AiCi0jZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBfUEFUSF9ERVZfRFNQMjQKLSNkZWZpbmUgX1BBVEhfREVWX0RTUDI0CSIvZGV2L3NvdW5kL2RzcCIKLSNlbmRpZgotI2lmbmRlZiBfUEFUSF9ERVZfQVVESU8KLSNkZWZpbmUgX1BBVEhfREVWX0FVRElPCSIvZGV2L2F1ZGlvIgotI2VuZGlmCi0KLQotaW50IFNETF9PcGVuQXVkaW9QYXRoKGNoYXIgKnBhdGgsIGludCBtYXhsZW4sIGludCBmbGFncywgaW50IGNsYXNzaWMpCi17Ci0JY29uc3QgY2hhciAqYXVkaW9kZXY7Ci0JaW50IGF1ZGlvX2ZkOwotCWNoYXIgYXVkaW9wYXRoWzEwMjRdOwotCi0JLyogRmlndXJlIG91dCB3aGF0IG91ciBhdWRpbyBkZXZpY2UgaXMgKi8KLQlpZiAoICgoYXVkaW9kZXY9U0RMX2dldGVudigiU0RMX1BBVEhfRFNQIikpID09IE5VTEwpICYmCi0JICAgICAoKGF1ZGlvZGV2PVNETF9nZXRlbnYoIkFVRElPREVWIikpID09IE5VTEwpICkgewotCQlpZiAoIGNsYXNzaWMgKSB7Ci0JCQlhdWRpb2RldiA9IF9QQVRIX0RFVl9BVURJTzsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBzdGF0IHNiOwotCi0JCQkvKiBBZGRlZCBzdXBwb3J0IGZvciAvZGV2L3NvdW5kL1wqIGluIExpbnV4IDIuNCAqLwotCQkJaWYgKCAoKHN0YXQoIi9kZXYvc291bmQiLCAmc2IpID09IDApICYmIFNfSVNESVIoc2Iuc3RfbW9kZSkpICYmCi0JCQkJICgoc3RhdChfUEFUSF9ERVZfRFNQMjQsICZzYikgPT0gMCkgJiYgU19JU0NIUihzYi5zdF9tb2RlKSkgKSB7Ci0JCQkJYXVkaW9kZXYgPSBfUEFUSF9ERVZfRFNQMjQ7Ci0JCQl9IGVsc2UgewotCQkJCWF1ZGlvZGV2ID0gX1BBVEhfREVWX0RTUDsKLQkJCX0KLQkJfQotCX0KLQlhdWRpb19mZCA9IG9wZW4oYXVkaW9kZXYsIGZsYWdzLCAwKTsKLQotCS8qIElmIHRoZSBmaXJzdCBvcGVuIGZhaWxzLCBsb29rIGZvciBvdGhlciBkZXZpY2VzICovCi0JaWYgKCAoYXVkaW9fZmQgPCAwKSAmJiAoU0RMX3N0cmxlbihhdWRpb2RldikgPCAoc2l6ZW9mKGF1ZGlvcGF0aCktMykpICkgewotCQlpbnQgZXhpc3RzLCBpbnN0YW5jZTsKLQkJc3RydWN0IHN0YXQgc2I7Ci0KLQkJaW5zdGFuY2UgPSAxOwotCQlkbyB7IC8qIERvbid0IHVzZSBlcnJubyBFTk9FTlQgLSBpdCBtYXkgbm90IGJlIHRocmVhZC1zYWZlICovCi0JCQlTRExfc25wcmludGYoYXVkaW9wYXRoLCBTRExfYXJyYXlzaXplKGF1ZGlvcGF0aCksCi0JCQkgICAgICAgICAgICAgIiVzJWQiLCBhdWRpb2RldiwgaW5zdGFuY2UrKyk7Ci0JCQlleGlzdHMgPSAwOwotCQkJaWYgKCBzdGF0KGF1ZGlvcGF0aCwgJnNiKSA9PSAwICkgewotCQkJCWV4aXN0cyA9IDE7Ci0JCQkJYXVkaW9fZmQgPSBvcGVuKGF1ZGlvcGF0aCwgZmxhZ3MsIDApOyAKLQkJCX0KLQkJfSB3aGlsZSAoIGV4aXN0cyAmJiAoYXVkaW9fZmQgPCAwKSApOwotCQlhdWRpb2RldiA9IGF1ZGlvcGF0aDsKLQl9Ci0JaWYgKCBwYXRoICE9IE5VTEwgKSB7Ci0JCVNETF9zdHJsY3B5KHBhdGgsIGF1ZGlvZGV2LCBtYXhsZW4pOwotCQlwYXRoW21heGxlbi0xXSA9ICdcMCc7Ci0JfQotCXJldHVybihhdWRpb19mZCk7Ci19Ci0KLSNlbGlmIFNETF9BVURJT19EUklWRVJfUEFVRAotCi0vKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGF1ZGlvIGRldmljZSB3ZSB1c2UgZm9yIG91dHB1dCAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLSNpbmNsdWRlICJTRExfYXVkaW9kZXZfYy5oIgotCi0jaWZuZGVmIF9QQVRIX0RFVl9EU1AKLSNkZWZpbmUgX1BBVEhfREVWX0RTUAkiL2Rldi8lY2F1ZCVjLyVjIgotI2VuZGlmCi0KLWNoYXIgZGV2c2V0dGluZ3NbXVszXSA9Ci17Ci0gICAgeyAncCcsICcwJywgJzEnIH0sIHsgJ3AnLCAnMCcsICcyJyB9LCB7ICdwJywgJzAnLCAnMycgfSwgeyAncCcsICcwJywgJzQnIH0sCi0gICAgeyAncCcsICcxJywgJzEnIH0sIHsgJ3AnLCAnMScsICcyJyB9LCB7ICdwJywgJzEnLCAnMycgfSwgeyAncCcsICcxJywgJzQnIH0sCi0gICAgeyAncCcsICcyJywgJzEnIH0sIHsgJ3AnLCAnMicsICcyJyB9LCB7ICdwJywgJzInLCAnMycgfSwgeyAncCcsICcyJywgJzQnIH0sCi0gICAgeyAncCcsICczJywgJzEnIH0sIHsgJ3AnLCAnMycsICcyJyB9LCB7ICdwJywgJzMnLCAnMycgfSwgeyAncCcsICczJywgJzQnIH0sCi0gICAgeyAnYicsICcwJywgJzEnIH0sIHsgJ2InLCAnMCcsICcyJyB9LCB7ICdiJywgJzAnLCAnMycgfSwgeyAnYicsICcwJywgJzQnIH0sCi0gICAgeyAnYicsICcxJywgJzEnIH0sIHsgJ2InLCAnMScsICcyJyB9LCB7ICdiJywgJzEnLCAnMycgfSwgeyAnYicsICcxJywgJzQnIH0sCi0gICAgeyAnYicsICcyJywgJzEnIH0sIHsgJ2InLCAnMicsICcyJyB9LCB7ICdiJywgJzInLCAnMycgfSwgeyAnYicsICcyJywgJzQnIH0sCi0gICAgeyAnYicsICczJywgJzEnIH0sIHsgJ2InLCAnMycsICcyJyB9LCB7ICdiJywgJzMnLCAnMycgfSwgeyAnYicsICczJywgJzQnIH0sCi0gICAgeyAnXDAnLCAnXDAnLCAnXDAnIH0KLX07Ci0KLXN0YXRpYyBpbnQgT3BlblVzZXJEZWZpbmVkRGV2aWNlKGNoYXIgKnBhdGgsIGludCBtYXhsZW4sIGludCBmbGFncykKLXsKLQljb25zdCBjaGFyICphdWRpb2RldjsKLQlpbnQgIGF1ZGlvX2ZkOwotCi0JLyogRmlndXJlIG91dCB3aGF0IG91ciBhdWRpbyBkZXZpY2UgaXMgKi8KLQlpZiAoKGF1ZGlvZGV2PVNETF9nZXRlbnYoIlNETF9QQVRIX0RTUCIpKSA9PSBOVUxMKSB7Ci0JICAgIGF1ZGlvZGV2PVNETF9nZXRlbnYoIkFVRElPREVWIik7Ci0JfQotCWlmICggYXVkaW9kZXYgPT0gTlVMTCApIHsKLQkgICAgcmV0dXJuIC0xOwotCX0KLQlhdWRpb19mZCA9IG9wZW4oYXVkaW9kZXYsIGZsYWdzLCAwKTsKLQlpZiAoIHBhdGggIT0gTlVMTCApIHsKLQkJU0RMX3N0cmxjcHkocGF0aCwgYXVkaW9kZXYsIG1heGxlbik7Ci0JCXBhdGhbbWF4bGVuLTFdID0gJ1wwJzsKLQl9Ci0JcmV0dXJuIGF1ZGlvX2ZkOwotfQotCi1pbnQgU0RMX09wZW5BdWRpb1BhdGgoY2hhciAqcGF0aCwgaW50IG1heGxlbiwgaW50IGZsYWdzLCBpbnQgY2xhc3NpYykKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzYjsKLSAgICBpbnQgICAgICAgICBhdWRpb19mZDsKLSAgICBjaGFyICAgICAgICBhdWRpb3BhdGhbMTAyNF07Ci0gICAgaW50ICAgICAgICAgY3ljbGU7Ci0KLSAgICBhdWRpb19mZCA9IE9wZW5Vc2VyRGVmaW5lZERldmljZShwYXRoLG1heGxlbixmbGFncyk7Ci0gICAgaWYgKCBhdWRpb19mZCAhPSAtMSApIHsKLSAgICAgICAgcmV0dXJuIGF1ZGlvX2ZkOwotICAgIH0KLQotICAgIGN5Y2xlICAgID0gMDsKLSAgICB3aGlsZSggZGV2c2V0dGluZ3NbY3ljbGVdWzBdICE9ICdcMCcgKSB7Ci0gICAgICAgIFNETF9zbnByaW50ZiggYXVkaW9wYXRoLCBTRExfYXJyYXlzaXplKGF1ZGlvcGF0aCksCi0gICAgICAgICAgICAgICAgIF9QQVRIX0RFVl9EU1AsCi0gICAgICAgICAgICAgICAgIGRldnNldHRpbmdzW2N5Y2xlXVswXSwKLSAgICAgICAgICAgICAgICAgZGV2c2V0dGluZ3NbY3ljbGVdWzFdLAotICAgICAgICAgICAgICAgICBkZXZzZXR0aW5nc1tjeWNsZV1bMl0pOwotCi0JaWYgKCBzdGF0KGF1ZGlvcGF0aCwgJnNiKSA9PSAwICkgewotCSAgICBhdWRpb19mZCA9IG9wZW4oYXVkaW9wYXRoLCBmbGFncywgMCk7Ci0JICAgIGlmICggYXVkaW9fZmQgPiAwICkgewotCQlpZiAoIHBhdGggIT0gTlVMTCApIHsKLQkJICAgIFNETF9zdHJsY3B5KCBwYXRoLCBhdWRpb3BhdGgsIG1heGxlbiApOwotCQl9Ci0JICAgICAgICByZXR1cm4gYXVkaW9fZmQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotI2VuZGlmIC8qIEF1ZGlvIGRyaXZlciBzZWxlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX2F1ZGlvZGV2X2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX2F1ZGlvZGV2X2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1ZmQ2NS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpb2Rldl9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlLCBzdG9yaW5nIHRoZSBwYXRobmFtZSBpbiAncGF0aCcgICovCi1leHRlcm4gaW50IFNETF9PcGVuQXVkaW9QYXRoKGNoYXIgKnBhdGgsIGludCBtYXhsZW4sIGludCBmbGFncywgaW50IGNsYXNzaWMpOwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpb21lbS5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfYXVkaW9tZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NTllYi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9hdWRpb21lbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNkZWZpbmUgU0RMX0FsbG9jQXVkaW9NZW0JU0RMX21hbGxvYwotI2RlZmluZSBTRExfRnJlZUF1ZGlvTWVtCVNETF9mcmVlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9taXhlci5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwN2EwNy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9taXhlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBUaGlzIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG1peGluZyBjYWxsYmFjayBmb3IgdGhlIFNETCBhdWRpbyByb3V0aW5lcyAqLwotCi0jaW5jbHVkZSAiU0RMX2NwdWluZm8uaCIKLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICJTRExfc3lzYXVkaW8uaCIKLSNpbmNsdWRlICJTRExfbWl4ZXJfTU1YLmgiCi0jaW5jbHVkZSAiU0RMX21peGVyX01NWF9WQy5oIgotI2luY2x1ZGUgIlNETF9taXhlcl9tNjhrLmgiCi0KLS8qIFRoaXMgdGFibGUgaXMgdXNlZCB0byBhZGQgdHdvIHNvdW5kIHZhbHVlcyB0b2dldGhlciBhbmQgcGluCi0gKiB0aGUgdmFsdWUgdG8gYXZvaWQgb3ZlcmZsb3cuICAodXNlZCB3aXRoIHBlcm1pc3Npb24gZnJvbSBBUkRJKQotICogQ2hhbmdlZCB0byB1c2UgMHhGRSBpbnN0ZWFkIG9mIDB4RkYgZm9yIGJldHRlciBzb3VuZCBxdWFsaXR5LgotICovCi1zdGF0aWMgY29uc3QgVWludDggbWl4OFtdID0KLXsKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywKLSAgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwKLSAgMHgwRiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwKLSAgMHgxQSwgMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwKLSAgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywgMHgyRCwgMHgyRSwgMHgyRiwKLSAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwKLSAgMHgzQiwgMHgzQywgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwKLSAgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0QSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0RSwgMHg0RiwgMHg1MCwKLSAgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1QSwgMHg1QiwKLSAgMHg1QywgMHg1RCwgMHg1RSwgMHg1RiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwKLSAgMHg2NywgMHg2OCwgMHg2OSwgMHg2QSwgMHg2QiwgMHg2QywgMHg2RCwgMHg2RSwgMHg2RiwgMHg3MCwgMHg3MSwKLSAgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwgMHg3QiwgMHg3QywKLSAgMHg3RCwgMHg3RSwgMHg3RiwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKLSAgMHg4OCwgMHg4OSwgMHg4QSwgMHg4QiwgMHg4QywgMHg4RCwgMHg4RSwgMHg4RiwgMHg5MCwgMHg5MSwgMHg5MiwKLSAgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5QSwgMHg5QiwgMHg5QywgMHg5RCwKLSAgMHg5RSwgMHg5RiwgMHhBMCwgMHhBMSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNSwgMHhBNiwgMHhBNywgMHhBOCwKLSAgMHhBOSwgMHhBQSwgMHhBQiwgMHhBQywgMHhBRCwgMHhBRSwgMHhBRiwgMHhCMCwgMHhCMSwgMHhCMiwgMHhCMywKLSAgMHhCNCwgMHhCNSwgMHhCNiwgMHhCNywgMHhCOCwgMHhCOSwgMHhCQSwgMHhCQiwgMHhCQywgMHhCRCwgMHhCRSwKLSAgMHhCRiwgMHhDMCwgMHhDMSwgMHhDMiwgMHhDMywgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNywgMHhDOCwgMHhDOSwKLSAgMHhDQSwgMHhDQiwgMHhDQywgMHhDRCwgMHhDRSwgMHhDRiwgMHhEMCwgMHhEMSwgMHhEMiwgMHhEMywgMHhENCwKLSAgMHhENSwgMHhENiwgMHhENywgMHhEOCwgMHhEOSwgMHhEQSwgMHhEQiwgMHhEQywgMHhERCwgMHhERSwgMHhERiwKLSAgMHhFMCwgMHhFMSwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNSwgMHhFNiwgMHhFNywgMHhFOCwgMHhFOSwgMHhFQSwKLSAgMHhFQiwgMHhFQywgMHhFRCwgMHhFRSwgMHhFRiwgMHhGMCwgMHhGMSwgMHhGMiwgMHhGMywgMHhGNCwgMHhGNSwKLSAgMHhGNiwgMHhGNywgMHhGOCwgMHhGOSwgMHhGQSwgMHhGQiwgMHhGQywgMHhGRCwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKLSAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRQotfTsKLQotLyogVGhlIHZvbHVtZSByYW5nZXMgZnJvbSAwIC0gMTI4ICovCi0jZGVmaW5lIEFESlVTVF9WT0xVTUUocywgdikJKHMgPSAocyp2KS9TRExfTUlYX01BWFZPTFVNRSkKLSNkZWZpbmUgQURKVVNUX1ZPTFVNRV9VOChzLCB2KQkocyA9ICgoKHMtMTI4KSp2KS9TRExfTUlYX01BWFZPTFVNRSkrMTI4KQotCi12b2lkIFNETF9NaXhBdWRpbyAoVWludDggKmRzdCwgY29uc3QgVWludDggKnNyYywgVWludDMyIGxlbiwgaW50IHZvbHVtZSkKLXsKLQlVaW50MTYgZm9ybWF0OwotCi0JaWYgKCB2b2x1bWUgPT0gMCApIHsKLQkJcmV0dXJuOwotCX0KLQkvKiBNaXggdGhlIHVzZXItbGV2ZWwgYXVkaW8gZm9ybWF0ICovCi0JaWYgKCBjdXJyZW50X2F1ZGlvICkgewotCQlpZiAoIGN1cnJlbnRfYXVkaW8tPmNvbnZlcnQubmVlZGVkICkgewotCQkJZm9ybWF0ID0gY3VycmVudF9hdWRpby0+Y29udmVydC5zcmNfZm9ybWF0OwotCQl9IGVsc2UgewotCQkJZm9ybWF0ID0gY3VycmVudF9hdWRpby0+c3BlYy5mb3JtYXQ7Ci0JCX0KLQl9IGVsc2UgewotICAJCS8qIEhBQ0sgSEFDSyBIQUNLICovCi0JCWZvcm1hdCA9IEFVRElPX1MxNjsKLQl9Ci0Jc3dpdGNoIChmb3JtYXQpIHsKLQotCQljYXNlIEFVRElPX1U4OiB7Ci0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX002ODAwMF9fKSAmJiBkZWZpbmVkKFNETF9BU1NFTUJMWV9ST1VUSU5FUykKLQkJCVNETF9NaXhBdWRpb19tNjhrX1U4KChjaGFyKilkc3QsKGNoYXIqKXNyYywodW5zaWduZWQgbG9uZylsZW4sKGxvbmcpdm9sdW1lLChjaGFyICopbWl4OCk7Ci0jZWxzZQotCQkJVWludDggc3JjX3NhbXBsZTsKLQotCQkJd2hpbGUgKCBsZW4tLSApIHsKLQkJCQlzcmNfc2FtcGxlID0gKnNyYzsKLQkJCQlBREpVU1RfVk9MVU1FX1U4KHNyY19zYW1wbGUsIHZvbHVtZSk7Ci0JCQkJKmRzdCA9IG1peDhbKmRzdCtzcmNfc2FtcGxlXTsKLQkJCQkrK2RzdDsKLQkJCQkrK3NyYzsKLQkJCX0KLSNlbmRpZgotCQl9Ci0JCWJyZWFrOwotCi0JCWNhc2UgQVVESU9fUzg6IHsKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKFNETF9BU1NFTUJMWV9ST1VUSU5FUykKLQkJCWlmIChTRExfSGFzTU1YKCkpCi0JCQl7Ci0JCQkJU0RMX01peEF1ZGlvX01NWF9TOCgoY2hhciopZHN0LChjaGFyKilzcmMsKHVuc2lnbmVkIGludClsZW4sKGludCl2b2x1bWUpOwotCQkJfQotCQkJZWxzZQotI2VsaWYgKChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSkgJiYgZGVmaW5lZChTRExfQVNTRU1CTFlfUk9VVElORVMpCi0JCQlpZiAoU0RMX0hhc01NWCgpKQotCQkJewotCQkJCVNETF9NaXhBdWRpb19NTVhfUzhfVkMoKGNoYXIqKWRzdCwoY2hhciopc3JjLCh1bnNpZ25lZCBpbnQpbGVuLChpbnQpdm9sdW1lKTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZgotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19NNjgwMDBfXykgJiYgZGVmaW5lZChTRExfQVNTRU1CTFlfUk9VVElORVMpCi0JCQlTRExfTWl4QXVkaW9fbTY4a19TOCgoY2hhciopZHN0LChjaGFyKilzcmMsKHVuc2lnbmVkIGxvbmcpbGVuLChsb25nKXZvbHVtZSk7Ci0jZWxzZQotCQkJewotCQkJU2ludDggKmRzdDgsICpzcmM4OwotCQkJU2ludDggc3JjX3NhbXBsZTsKLQkJCWludCBkc3Rfc2FtcGxlOwotCQkJY29uc3QgaW50IG1heF9hdWRpb3ZhbCA9ICgoMTw8KDgtMSkpLTEpOwotCQkJY29uc3QgaW50IG1pbl9hdWRpb3ZhbCA9IC0oMTw8KDgtMSkpOwotCi0JCQlzcmM4ID0gKFNpbnQ4ICopc3JjOwotCQkJZHN0OCA9IChTaW50OCAqKWRzdDsKLQkJCXdoaWxlICggbGVuLS0gKSB7Ci0JCQkJc3JjX3NhbXBsZSA9ICpzcmM4OwotCQkJCUFESlVTVF9WT0xVTUUoc3JjX3NhbXBsZSwgdm9sdW1lKTsKLQkJCQlkc3Rfc2FtcGxlID0gKmRzdDggKyBzcmNfc2FtcGxlOwotCQkJCWlmICggZHN0X3NhbXBsZSA+IG1heF9hdWRpb3ZhbCApIHsKLQkJCQkJKmRzdDggPSBtYXhfYXVkaW92YWw7Ci0JCQkJfSBlbHNlCi0JCQkJaWYgKCBkc3Rfc2FtcGxlIDwgbWluX2F1ZGlvdmFsICkgewotCQkJCQkqZHN0OCA9IG1pbl9hdWRpb3ZhbDsKLQkJCQl9IGVsc2UgewotCQkJCQkqZHN0OCA9IGRzdF9zYW1wbGU7Ci0JCQkJfQotCQkJCSsrZHN0ODsKLQkJCQkrK3NyYzg7Ci0JCQl9Ci0JCQl9Ci0jZW5kaWYKLQkJfQotCQlicmVhazsKLQotCQljYXNlIEFVRElPX1MxNkxTQjogewotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQotCQkJaWYgKFNETF9IYXNNTVgoKSkKLQkJCXsKLQkJCQlTRExfTWl4QXVkaW9fTU1YX1MxNigoY2hhciopZHN0LChjaGFyKilzcmMsKHVuc2lnbmVkIGludClsZW4sKGludCl2b2x1bWUpOwotCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotI2VsaWYgKChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSkgJiYgZGVmaW5lZChTRExfQVNTRU1CTFlfUk9VVElORVMpCi0JCQlpZiAoU0RMX0hhc01NWCgpKQotCQkJewotCQkJCVNETF9NaXhBdWRpb19NTVhfUzE2X1ZDKChjaGFyKilkc3QsKGNoYXIqKXNyYywodW5zaWduZWQgaW50KWxlbiwoaW50KXZvbHVtZSk7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fTTY4MDAwX18pICYmIGRlZmluZWQoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQotCQkJU0RMX01peEF1ZGlvX202OGtfUzE2TFNCKChzaG9ydCopZHN0LChzaG9ydCopc3JjLCh1bnNpZ25lZCBsb25nKWxlbiwobG9uZyl2b2x1bWUpOwotI2Vsc2UKLQkJCXsKLQkJCVNpbnQxNiBzcmMxLCBzcmMyOwotCQkJaW50IGRzdF9zYW1wbGU7Ci0JCQljb25zdCBpbnQgbWF4X2F1ZGlvdmFsID0gKCgxPDwoMTYtMSkpLTEpOwotCQkJY29uc3QgaW50IG1pbl9hdWRpb3ZhbCA9IC0oMTw8KDE2LTEpKTsKLQotCQkJbGVuIC89IDI7Ci0JCQl3aGlsZSAoIGxlbi0tICkgewotCQkJCXNyYzEgPSAoKHNyY1sxXSk8PDh8c3JjWzBdKTsKLQkJCQlBREpVU1RfVk9MVU1FKHNyYzEsIHZvbHVtZSk7Ci0JCQkJc3JjMiA9ICgoZHN0WzFdKTw8OHxkc3RbMF0pOwotCQkJCXNyYyArPSAyOwotCQkJCWRzdF9zYW1wbGUgPSBzcmMxK3NyYzI7Ci0JCQkJaWYgKCBkc3Rfc2FtcGxlID4gbWF4X2F1ZGlvdmFsICkgewotCQkJCQlkc3Rfc2FtcGxlID0gbWF4X2F1ZGlvdmFsOwotCQkJCX0gZWxzZQotCQkJCWlmICggZHN0X3NhbXBsZSA8IG1pbl9hdWRpb3ZhbCApIHsKLQkJCQkJZHN0X3NhbXBsZSA9IG1pbl9hdWRpb3ZhbDsKLQkJCQl9Ci0JCQkJZHN0WzBdID0gZHN0X3NhbXBsZSYweEZGOwotCQkJCWRzdF9zYW1wbGUgPj49IDg7Ci0JCQkJZHN0WzFdID0gZHN0X3NhbXBsZSYweEZGOwotCQkJCWRzdCArPSAyOwotCQkJfQotCQkJfQotI2VuZGlmCi0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBBVURJT19TMTZNU0I6IHsKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fTTY4MDAwX18pICYmIGRlZmluZWQoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQotCQkJU0RMX01peEF1ZGlvX202OGtfUzE2TVNCKChzaG9ydCopZHN0LChzaG9ydCopc3JjLCh1bnNpZ25lZCBsb25nKWxlbiwobG9uZyl2b2x1bWUpOwotI2Vsc2UKLQkJCVNpbnQxNiBzcmMxLCBzcmMyOwotCQkJaW50IGRzdF9zYW1wbGU7Ci0JCQljb25zdCBpbnQgbWF4X2F1ZGlvdmFsID0gKCgxPDwoMTYtMSkpLTEpOwotCQkJY29uc3QgaW50IG1pbl9hdWRpb3ZhbCA9IC0oMTw8KDE2LTEpKTsKLQotCQkJbGVuIC89IDI7Ci0JCQl3aGlsZSAoIGxlbi0tICkgewotCQkJCXNyYzEgPSAoKHNyY1swXSk8PDh8c3JjWzFdKTsKLQkJCQlBREpVU1RfVk9MVU1FKHNyYzEsIHZvbHVtZSk7Ci0JCQkJc3JjMiA9ICgoZHN0WzBdKTw8OHxkc3RbMV0pOwotCQkJCXNyYyArPSAyOwotCQkJCWRzdF9zYW1wbGUgPSBzcmMxK3NyYzI7Ci0JCQkJaWYgKCBkc3Rfc2FtcGxlID4gbWF4X2F1ZGlvdmFsICkgewotCQkJCQlkc3Rfc2FtcGxlID0gbWF4X2F1ZGlvdmFsOwotCQkJCX0gZWxzZQotCQkJCWlmICggZHN0X3NhbXBsZSA8IG1pbl9hdWRpb3ZhbCApIHsKLQkJCQkJZHN0X3NhbXBsZSA9IG1pbl9hdWRpb3ZhbDsKLQkJCQl9Ci0JCQkJZHN0WzFdID0gZHN0X3NhbXBsZSYweEZGOwotCQkJCWRzdF9zYW1wbGUgPj49IDg7Ci0JCQkJZHN0WzBdID0gZHN0X3NhbXBsZSYweEZGOwotCQkJCWRzdCArPSAyOwotCQkJfQotI2VuZGlmCi0JCX0KLQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDogLyogSWYgdGhpcyBoYXBwZW5zLi4uIEZJWE1FISAqLwotCQkJU0RMX1NldEVycm9yKCJTRExfTWl4QXVkaW8oKTogdW5rbm93biBhdWRpbyBmb3JtYXQiKTsKLQkJCXJldHVybjsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX21peGVyX01NWC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjRiYTAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gICAgTU1YIGFzc2VtYmxlciB2ZXJzaW9uIG9mIFNETF9NaXhBdWRpbyBmb3Igc2lnbmVkIGxpdHRsZSBlbmRpYW4gMTYgYml0IHNhbXBsZXMgYW5kIHNpZ25lZCA4IGJpdCBzYW1wbGVzCi0gICAgQ29weXJpZ2h0IDIwMDIgU3RlcGhhbmUgTWFyY2hlc2luIChzdGVwaGFuZS5tYXJjaGVzaW5Ad2FuYWRvby5mcikKLSAgICBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIExHUEwgKHNlZSBDT1BZSU5HIGZvciBkZXRhaWxzKQotIAotICAgIEFzc3VtZXMgYnVmZmVyIHNpemUgaW4gYnl0ZXMgaXMgYSBtdWx0aXBsZSBvZiAxNgotICAgIEFzc3VtZXMgU0RMX01JWF9NQVhWT0xVTUUgPSAxMjgKLSovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgTWl4aW5nIGZvciAxNiBiaXQgc2lnbmVkIGJ1ZmZlcnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChTRExfQVNTRU1CTFlfUk9VVElORVMpCi12b2lkIFNETF9NaXhBdWRpb19NTVhfUzE2KGNoYXIqIGRzdCxjaGFyKiBzcmMsdW5zaWduZWQgaW50IHNpemUsaW50IHZvbHVtZSkKLXsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0KLSIJbW92bCAlMywlJWVheFxuIgkvKiBlYXggPSB2b2x1bWUgKi8KLQotIgltb3ZsICUyLCUlZWR4XG4iCS8qIGVkeCA9IHNpemUgKi8KLQotIglzaHJsICQ0LCUlZWR4XG4iCS8qIHByb2Nlc3MgMTYgYnl0ZXMgcGVyIGl0ZXJhdGlvbiA9IDggc2FtcGxlcyAqLwotCi0iCWp6IC5lbmRTMTZcbiIKLQotIglweG9yICUlbW0wLCUlbW0wXG4iCi0KLSIJbW92ZCAlJWVheCwlJW1tMFxuIgotIgltb3ZxICUlbW0wLCUlbW0xXG4iCi0iCXBzbGxxICQxNiwlJW1tMFxuIgotIglwb3IgJSVtbTEsJSVtbTBcbiIKLSIJcHNsbHEgJDE2LCUlbW0wXG4iCi0iCXBvciAlJW1tMSwlJW1tMFxuIgotIglwc2xscSAkMTYsJSVtbTBcbiIKLSIJcG9yICUlbW0xLCUlbW0wXG4iCQkvKiBtbTAgPSB2b2x8dm9sfHZvbHx2b2wgKi8KLQotIi5hbGlnbiA4XG4iCi0iCS5taXhsb29wUzE2OlxuIgotCi0iCW1vdnEgKCUxKSwlJW1tMVxuIiAvKiBtbTEgPSBhfGJ8Y3xkICovCi0KLSIJbW92cSAlJW1tMSwlJW1tMlxuIiAvKiBtbTIgPSBhfGJ8Y3xkICovCi0KLSIJbW92cSA4KCUxKSwlJW1tNFxuIiAvKiBtbTQgPSBlfGZ8Z3xoICovCi0KLQkvKiBwcukgY2hhcmdlciBsZSBidWZmZXIgZHN0IGRhbnMgbW03ICovCi0iCW1vdnEgKCUwKSwlJW1tN1xuIiAvKiBtbTcgPSBkc3RbMF0gKi8KLQotCS8qIG11bHRpcGxpZXIgcGFyIGxlIHZvbHVtZSAqLwotIglwbXVsbHcgJSVtbTAsJSVtbTFcbiIgLyogbW0xID0gbChhKnYpfGwoYip2KXxsKGMqdil8bChkKnYpICovCi0KLSIJcG11bGh3ICUlbW0wLCUlbW0yXG4iIC8qIG1tMiA9IGgoYSp2KXxoKGIqdil8aChjKnYpfGgoZCp2KSAqLwotIgltb3ZxICUlbW00LCUlbW01XG4iIC8qIG1tNSA9IGV8ZnxnfGggKi8KLQotIglwbXVsbHcgJSVtbTAsJSVtbTRcbiIgLyogbW00ID0gbChlKnYpfGwoZip2KXxsKGcqdil8bChoKnYpICovCi0KLSIJcG11bGh3ICUlbW0wLCUlbW01XG4iIC8qIG1tNSA9IGgoZSp2KXxoKGYqdil8aChnKnYpfGgoaCp2KSAqLwotIgltb3ZxICUlbW0xLCUlbW0zXG4iIC8qIG1tMyA9IGwoYSp2KXxsKGIqdil8bChjKnYpfGwoZCp2KSAqLwotCi0iCXB1bnBja2h3ZCAlJW1tMiwlJW1tMVxuIiAvKiBtbTEgPSBhKnZ8Yip2ICovCi0KLSIJbW92cSAlJW1tNCwlJW1tNlxuIiAvKiBtbTYgPSBsKGUqdil8bChmKnYpfGwoZyp2KXxsKGgqdikgKi8KLSIJcHVucGNrbHdkICUlbW0yLCUlbW0zXG4iIC8qIG1tMyA9IGMqdnxkKnYgKi8KLQotIglwdW5wY2tod2QgJSVtbTUsJSVtbTRcbiIgLyogbW00ID0gZSpmfGYqdiAqLwotCi0iCXB1bnBja2x3ZCAlJW1tNSwlJW1tNlxuIiAvKiBtbTYgPSBnKnZ8aCp2ICovCi0KLQkvKiBwcukgY2hhcmdlciBsZSBidWZmZXIgZHN0IGRhbnMgbW01ICovCi0iCW1vdnEgOCglMCksJSVtbTVcbiIgLyogbW01ID0gZHN0WzFdICovCi0KLQkvKiBkaXZpc2VyIHBhciAxMjggKi8KLSIJcHNyYWQgJDcsJSVtbTFcbiIgLyogbW0xID0gYSp2LzEyOHxiKnYvMTI4ICwgMTI4ID0gU0RMX01JWF9NQVhWT0xVTUUgKi8KLSIJYWRkICQxNiwlMVxuIgotCi0iCXBzcmFkICQ3LCUlbW0zXG4iIC8qIG1tMyA9IGMqdi8xMjh8ZCp2LzEyOCAqLwotCi0iCXBzcmFkICQ3LCUlbW00XG4iIC8qIG1tNCA9IGUqdi8xMjh8Zip2LzEyOCAqLwotCi0JLyogbW0xID0gbGUgc2FtcGxlIGF2ZWMgbGUgdm9sdW1lIG1vZGlmaekgKi8KLSIJcGFja3NzZHcgJSVtbTEsJSVtbTNcbiIgLyogbW0zID0gcyhhKnZ8Yip2fGMqdnxkKnYpICovCi0KLSIJcHNyYWQgJDcsJSVtbTZcbiIgLyogbW02PSBnKnYvMTI4fGgqdi8xMjggKi8KLSIJcGFkZHN3ICUlbW03LCUlbW0zXG4iIC8qIG1tMyA9IGFkanVzdF92b2x1bWUoc3JjKStkc3QgKi8KLQotCS8qIG1tNCA9IGxlIHNhbXBsZSBhdmVjIGxlIHZvbHVtZSBtb2RpZmnpICovCi0iCXBhY2tzc2R3ICUlbW00LCUlbW02XG4iIC8qIG1tNiA9IHMoZSp2fGYqdnxnKnZ8aCp2KSAqLwotIgltb3ZxICUlbW0zLCglMClcbiIKLQotIglwYWRkc3cgJSVtbTUsJSVtbTZcbiIgLyogbW02ID0gYWRqdXN0X3ZvbHVtZShzcmMpK2RzdCAqLwotCi0iCW1vdnEgJSVtbTYsOCglMClcbiIKLQotIglhZGQgJDE2LCUwXG4iCi0KLSIJZGVjICUlZWR4XG4iCi0KLSIJam56IC5taXhsb29wUzE2XG4iCi0KLSIJZW1tc1xuIgotCi0iLmVuZFMxNjpcbiIKLQkgOgotCSA6ICJyIiAoZHN0KSwgInIiKHNyYyksIm0iKHNpemUpLAotCSAibSIodm9sdW1lKQotCSA6ICJlYXgiLCJlZHgiLCJtZW1vcnkiCi0JICk7Ci19Ci0KLQotCi0vKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIE1peGluZyBmb3IgOCBiaXQgc2lnbmVkIGJ1ZmZlcnMgKi8KLS8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotCi12b2lkIFNETF9NaXhBdWRpb19NTVhfUzgoY2hhciogZHN0LGNoYXIqIHNyYyx1bnNpZ25lZCBpbnQgc2l6ZSxpbnQgdm9sdW1lKQotewotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLQotIgltb3ZsICUzLCUlZWF4XG4iCS8qIGVheCA9IHZvbHVtZSAqLwotCi0iCW1vdmQgJSVlYXgsJSVtbTBcbiIKLSIJbW92cSAlJW1tMCwlJW1tMVxuIgotIglwc2xscSAkMTYsJSVtbTBcbiIKLSIJcG9yICUlbW0xLCUlbW0wXG4iCi0iCXBzbGxxICQxNiwlJW1tMFxuIgotIglwb3IgJSVtbTEsJSVtbTBcbiIKLSIJcHNsbHEgJDE2LCUlbW0wXG4iCi0iCXBvciAlJW1tMSwlJW1tMFxuIgotCi0iCW1vdmwgJTIsJSVlZHhcbiIJLyogZWR4ID0gc2l6ZSAqLwotIglzaHIgJDMsJSVlZHhcbiIJLyogcHJvY2VzcyA4IGJ5dGVzIHBlciBpdGVyYXRpb24gPSA4IHNhbXBsZXMgKi8KLQotIgljbXAgJDAsJSVlZHhcbiIKLSIJamUgLmVuZFM4XG4iCi0KLSIuYWxpZ24gOFxuIgotIgkubWl4bG9vcFM4OlxuIgotCi0iCXB4b3IgJSVtbTIsJSVtbTJcbiIJCS8qIG1tMiA9IDAgKi8KLSIJbW92cSAoJTEpLCUlbW0xXG4iCS8qIG1tMSA9IGF8YnxjfGR8ZXxmfGd8aCAqLwotCi0iCW1vdnEgJSVtbTEsJSVtbTNcbiIgCS8qIG1tMyA9IGF8YnxjfGR8ZXxmfGd8aCAqLwotCi0JLyogb24gdmEgZmFpcmUgbGUgInNpZ24gZXh0ZW5zaW9uIiBlbiBmYWlzYW50IHVuIGNtcCBhdmVjIDAgcXVpIHJldG91cm5lIDEgc2kgPDAsIDAgc2kgPjAgKi8KLSIJcGNtcGd0YiAlJW1tMSwlJW1tMlxuIgkvKiBtbTIgPSAxMTExMTExMXwwMDAwMDAwMHwwMDAwMDAwMC4uLi4gKi8KLQotIglwdW5wY2toYncgJSVtbTIsJSVtbTFcbiIJLyogbW0xID0gMHxhfDB8YnwwfGN8MHxkICovCi0KLSIJcHVucGNrbGJ3ICUlbW0yLCUlbW0zXG4iCS8qIG1tMyA9IDB8ZXwwfGZ8MHxnfDB8aCAqLwotIgltb3ZxICglMCksJSVtbTJcbiIJLyogbW0yID0gZGVzdGluYXRpb24gKi8KLQotIglwbXVsbHcgJSVtbTAsJSVtbTFcbiIJLyogbW0xID0gdiphfHYqYnx2KmN8dipkICovCi0iCWFkZCAkOCwlMVxuIgotCi0iCXBtdWxsdyAlJW1tMCwlJW1tM1xuIgkvKiBtbTMgPSB2KmV8dipmfHYqZ3x2KmggKi8KLSIJcHNyYXcgJDcsJSVtbTFcbiIJCS8qIG1tMSA9IHYqYS8xMjh8dipiLzEyOHx2KmMvMTI4fHYqZC8xMjggICovCi0KLSIJcHNyYXcgJDcsJSVtbTNcbiIJCS8qIG1tMyA9IHYqZS8xMjh8dipmLzEyOHx2KmcvMTI4fHYqaC8xMjggKi8KLQotIglwYWNrc3N3YiAlJW1tMSwlJW1tM1xuIgkvKiBtbTEgPSB2KmEvMTI4fHYqYi8xMjh8dipjLzEyOHx2KmQvMTI4fHYqZS8xMjh8dipmLzEyOHx2KmcvMTI4fHYqaC8xMjggKi8KLQotIglwYWRkc2IgJSVtbTIsJSVtbTNcbiIJLyogYWRkIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLwotCi0iCW1vdnEgJSVtbTMsKCUwKVxuIgkvKiBzdG9yZSBiYWNrIHRvIHJhbSAqLwotIglhZGQgJDgsJTBcbiIKLQotIglkZWMgJSVlZHhcbiIKLQotIglqbnogLm1peGxvb3BTOFxuIgotCi0iLmVuZFM4OlxuIgotIgllbW1zXG4iCi0JIDoKLQkgOiAiciIgKGRzdCksICJyIihzcmMpLCJtIihzaXplKSwKLQkgIm0iKHZvbHVtZSkKLQkgOiAiZWF4IiwiZWR4IiwibWVtb3J5IgotCSApOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX21peGVyX01NWC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjI2ODMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKgotICAgIGhlYWRlcnMgZm9yIE1NWCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBTRExfTWl4QXVkaW8KLSAgICBDb3B5cmlnaHQgMjAwMiBTdGVwaGFuZSBNYXJjaGVzaW4gKHN0ZXBoYW5lLm1hcmNoZXNpbkB3YW5hZG9vLmZyKQotICAgIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTEdQTCAoc2VlIENPUFlJTkcgZm9yIGRldGFpbHMpCi0KLSAgICBBc3N1bWVzIGJ1ZmZlciBzaXplIGluIGJ5dGVzIGlzIGEgbXVsdGlwbGUgb2YgMTYKLSAgICBBc3N1bWVzIFNETF9NSVhfTUFYVk9MVU1FID0gMTI4Ci0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQotdm9pZCBTRExfTWl4QXVkaW9fTU1YX1MxNihjaGFyKiAsY2hhciogLHVuc2lnbmVkIGludCAsaW50ICk7Ci12b2lkIFNETF9NaXhBdWRpb19NTVhfUzgoY2hhciogLGNoYXIqICx1bnNpZ25lZCBpbnQgLGludCApOwotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX21peGVyX01NWF9WQy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YX1ZDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YjY0NmEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YX1ZDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfbWl4ZXJfTU1YX1ZDLmgiCi0KLSNpZiAoKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikpIHx8IGRlZmluZWQoX19XQVRDT01DX18pKSAmJiBkZWZpbmVkKFNETF9BU1NFTUJMWV9ST1VUSU5FUykKLS8vIE1NWCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBTRExfTWl4QXVkaW8gZm9yIHNpZ25lZCBsaXR0bGUgZW5kaWFuIDE2IGJpdCBzYW1wbGVzIGFuZCBzaWduZWQgOCBiaXQgc2FtcGxlcwotLy8gQ29weXJpZ2h0IDIwMDIgU3RlcGhhbmUgTWFyY2hlc2luIChzdGVwaGFuZS5tYXJjaGVzaW5Ad2FuYWRvby5mcikKLS8vIENvbnZlcnRlZCB0byBJbnRlbCBBU00gbm90YXRpb24gYnkgQ3RoCi0vLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIExHUEwgKHNlZSBDT1BZSU5HIGZvciBkZXRhaWxzKQotLy8gCi0vLyBBc3N1bWVzIGJ1ZmZlciBzaXplIGluIGJ5dGVzIGlzIGEgbXVsdGlwbGUgb2YgMTYKLS8vIEFzc3VtZXMgU0RMX01JWF9NQVhWT0xVTUUgPSAxMjgKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE1peGluZyBmb3IgMTYgYml0IHNpZ25lZCBidWZmZXJzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdm9pZCBTRExfTWl4QXVkaW9fTU1YX1MxNl9WQyhjaGFyKiBkc3QsY2hhciogc3JjLHVuc2lnbmVkIGludCBuU2l6ZSxpbnQgdm9sdW1lKQotewotCV9fYXNtCi0JewotCi0JCXB1c2gJZWRpCi0JCXB1c2gJZXNpCi0JCXB1c2gJZWJ4Ci0JCQotCQltb3YJCWVkaSwgZHN0CQkvLyBlZGkgPSBkc3QKLQkJbW92CQllc2ksIHNyYwkJLy8gZXNpID0gc3JjCi0JCW1vdgkJZWF4LCB2b2x1bWUJCS8vIGVheCA9IHZvbHVtZQotCQltb3YJCWVieCwgblNpemUJCS8vIGVieCA9IHNpemUKLQkJc2hyCQllYngsIDQJCQkvLyBwcm9jZXNzIDE2IGJ5dGVzIHBlciBpdGVyYXRpb24gPSA4IHNhbXBsZXMKLQkJanoJCWVuZFMxNgotCQkKLQkJcHhvcgltbTAsIG1tMAotCQltb3ZkCW1tMCwgZWF4CQkvLyUlZWF4LCUlbW0wCi0JCW1vdnEJbW0xLCBtbTAJCS8vJSVtbTAsJSVtbTEKLQkJcHNsbHEJbW0wLCAxNgkJCS8vJDE2LCUlbW0wCi0JCXBvcgkJbW0wLCBtbTEJCS8vJSVtbTEsJSVtbTAKLQkJcHNsbHEJbW0wLCAxNgkJCS8vJDE2LCUlbW0wCi0JCXBvcgkJbW0wLCBtbTEJCS8vJSVtbTEsJSVtbTAKLQkJcHNsbHEJbW0wLCAxNgkJCS8vJDE2LCUlbW0wCi0JCXBvcgkJbW0wLCBtbTEJCS8vJSVtbTEsJSVtbTAJCQkvLyBtbTAgPSB2b2x8dm9sfHZvbHx2b2wKLQotCQkjaWZuZGVmIF9fV0FUQ09NQ19fCi0JCWFsaWduCTE2Ci0JCSNlbmRpZgotbWl4bG9vcFMxNjoKLQkJbW92cQltbTEsIFtlc2ldCQkvLyglJWVzaSksJSVtbTFcbiIgLy8gbW0xID0gYXxifGN8ZAotCQltb3ZxCW1tMiwgbW0xCQkvLyUlbW0xLCUlbW0yXG4iIC8vIG1tMiA9IGF8YnxjfGQKLQkJbW92cQltbTQsIFtlc2kgKyA4XQkvLzgoJSVlc2kpLCUlbW00XG4iIC8vIG1tNCA9IGV8ZnxnfGgKLQkJLy8gcHJlIGNoYXJnZXIgbGUgYnVmZmVyIGRzdCBkYW5zIG1tNwotCQltb3ZxCW1tNywgW2VkaV0JCS8vKCUlZWRpKSwlJW1tN1xuIiAvLyBtbTcgPSBkc3RbMF0iCi0JCS8vIG11bHRpcGxpZXIgcGFyIGxlIHZvbHVtZQotCQlwbXVsbHcJbW0xLCBtbTAJCS8vJSVtbTAsJSVtbTFcbiIgLy8gbW0xID0gbChhKnYpfGwoYip2KXxsKGMqdil8bChkKnYpCi0JCXBtdWxodwltbTIsIG1tMAkJLy8lJW1tMCwlJW1tMlxuIiAvLyBtbTIgPSBoKGEqdil8aChiKnYpfGgoYyp2KXxoKGQqdikKLQkJbW92cQltbTUsIG1tNAkJLy8lJW1tNCwlJW1tNVxuIiAvLyBtbTUgPSBlfGZ8Z3xoCi0JCXBtdWxsdwltbTQsIG1tMAkJLy8lJW1tMCwlJW1tNFxuIiAvLyBtbTQgPSBsKGUqdil8bChmKnYpfGwoZyp2KXxsKGgqdikKLQkJcG11bGh3CW1tNSwgbW0wCQkvLyUlbW0wLCUlbW01XG4iIC8vIG1tNSA9IGgoZSp2KXxoKGYqdil8aChnKnYpfGgoaCp2KQotCQltb3ZxCW1tMywgbW0xCQkvLyUlbW0xLCUlbW0zXG4iIC8vIG1tMyA9IGwoYSp2KXxsKGIqdil8bChjKnYpfGwoZCp2KQotCQlwdW5wY2tod2QJbW0xLCBtbTIJLy8lJW1tMiwlJW1tMVxuIiAvLyBtbTEgPSBhKnZ8Yip2Ci0JCW1vdnEJCW1tNiwgbW00CS8vJSVtbTQsJSVtbTZcbiIgLy8gbW02ID0gbChlKnYpfGwoZip2KXxsKGcqdil8bChoKnYpCi0JCXB1bnBja2x3ZAltbTMsIG1tMgkvLyUlbW0yLCUlbW0zXG4iIC8vIG1tMyA9IGMqdnxkKnYKLQkJcHVucGNraHdkCW1tNCwgbW01CS8vJSVtbTUsJSVtbTRcbiIgLy8gbW00ID0gZSpmfGYqdgotCQlwdW5wY2tsd2QJbW02LCBtbTUJLy8lJW1tNSwlJW1tNlxuIiAvLyBtbTYgPSBnKnZ8aCp2Ci0JCS8vIHByZSBjaGFyZ2VyIGxlIGJ1ZmZlciBkc3QgZGFucyBtbTUKLQkJbW92cQltbTUsIFtlZGkgKyA4XQkvLzgoJSVlZGkpLCUlbW01XG4iIC8vIG1tNSA9IGRzdFsxXQotCQkvLyBkaXZpc2VyIHBhciAxMjgKLQkJcHNyYWQJbW0xLCA3CQkJLy8kNywlJW1tMVxuIiAvLyBtbTEgPSBhKnYvMTI4fGIqdi8xMjggLCAxMjggPSBTRExfTUlYX01BWFZPTFVNRQotCQlhZGQJCWVzaSwgMTYJCQkvLyQxNiwlJWVzaVxuIgotCQlwc3JhZAltbTMsIDcJCQkvLyQ3LCUlbW0zXG4iIC8vIG1tMyA9IGMqdi8xMjh8ZCp2LzEyOAotCQlwc3JhZAltbTQsIDcJCQkvLyQ3LCUlbW00XG4iIC8vIG1tNCA9IGUqdi8xMjh8Zip2LzEyOAotCQkvLyBtbTEgPSBsZSBzYW1wbGUgYXZlYyBsZSB2b2x1bWUgbW9kaWZpZQotCQlwYWNrc3NkdwltbTMsIG1tMQkvLyUlbW0xLCUlbW0zXG4iIC8vIG1tMyA9IHMoYSp2fGIqdnxjKnZ8ZCp2KQotCQlwc3JhZAltbTYsIDcJCQkvLyQ3LCUlbW02XG4iIC8vIG1tNj0gZyp2LzEyOHxoKnYvMTI4Ci0JCXBhZGRzdwltbTMsIG1tNwkJLy8lJW1tNywlJW1tM1xuIiAvLyBtbTMgPSBhZGp1c3Rfdm9sdW1lKHNyYykrZHN0Ci0JCS8vIG1tNCA9IGxlIHNhbXBsZSBhdmVjIGxlIHZvbHVtZSBtb2RpZmllCi0JCXBhY2tzc2R3CW1tNiwgbW00CS8vJSVtbTQsJSVtbTZcbiIgLy8gbW02ID0gcyhlKnZ8Zip2fGcqdnxoKnYpCi0JCW1vdnEJW2VkaV0sIG1tMwkJLy8lJW1tMywoJSVlZGkpXG4iCi0JCXBhZGRzdwltbTYsIG1tNQkJLy8lJW1tNSwlJW1tNlxuIiAvLyBtbTYgPSBhZGp1c3Rfdm9sdW1lKHNyYykrZHN0Ci0JCW1vdnEJW2VkaSArIDhdLCBtbTYJLy8lJW1tNiw4KCUlZWRpKVxuIgotCQlhZGQJCWVkaSwgMTYJCQkvLyQxNiwlJWVkaVxuIgotCQlkZWMJCWVieAkJCQkvLyUlZWJ4XG4iCi0JCWpueiBtaXhsb29wUzE2Ci0KLWVuZHMxNjoKLQkJZW1tcwotCQkKLQkJcG9wCQllYngKLQkJcG9wCQllc2kKLQkJcG9wCQllZGkKLQl9Ci0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBNaXhpbmcgZm9yIDggYml0IHNpZ25lZCBidWZmZXJzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdm9pZCBTRExfTWl4QXVkaW9fTU1YX1M4X1ZDKGNoYXIqIGRzdCxjaGFyKiBzcmMsdW5zaWduZWQgaW50IG5TaXplLGludCB2b2x1bWUpCi17Ci0JX2FzbQotCXsKLQotCQlwdXNoCWVkaQotCQlwdXNoCWVzaQotCQlwdXNoCWVieAotCQkKLQkJbW92CQllZGksIGRzdAkvL21vdmwJJTAsJSVlZGkJLy8gZWRpID0gZHN0Ci0JCW1vdgkJZXNpLCBzcmMJLy8lMSwlJWVzaQkvLyBlc2kgPSBzcmMKLQkJbW92CQllYXgsIHZvbHVtZQkvLyUzLCUlZWF4CS8vIGVheCA9IHZvbHVtZQotCi0JCW1vdmQJbW0wLCBlYXgJLy8lJWVheCwlJW1tMAotCQltb3ZxCW1tMSwgbW0wCS8vJSVtbTAsJSVtbTEKLQkJcHNsbHEJbW0wLCAxNgkJLy8kMTYsJSVtbTAKLQkJcG9yCQltbTAsIG1tMQkvLyUlbW0xLCUlbW0wCi0JCXBzbGxxCW1tMCwgMTYJCS8vJDE2LCUlbW0wCi0JCXBvcgkJbW0wLCBtbTEJLy8lJW1tMSwlJW1tMAotCQlwc2xscQltbTAsIDE2CQkvLyQxNiwlJW1tMAotCQlwb3IJCW1tMCwgbW0xCS8vJSVtbTEsJSVtbTAKLQkJCi0JCW1vdgkJZWJ4LCBuU2l6ZQkvLyUyLCUlZWJ4CS8vIGVieCA9IHNpemUKLQkJc2hyCQllYngsIDMJCS8vJDMsJSVlYngJLy8gcHJvY2VzcyA4IGJ5dGVzIHBlciBpdGVyYXRpb24gPSA4IHNhbXBsZXMKLQkJY21wCQllYngsIDAJCS8vJDAsJSVlYngKLQkJamUJCWVuZFM4Ci0KLQkJI2lmbmRlZiBfX1dBVENPTUNfXwotCQlhbGlnbiAxNgotCQkjZW5kaWYKLW1peGxvb3BTODoKLQkJcHhvcgltbTIsIG1tMgkvLyUlbW0yLCUlbW0yCQkvLyBtbTIgPSAwCi0JCW1vdnEJbW0xLCBbZXNpXQkvLyglJWVzaSksJSVtbTEJLy8gbW0xID0gYXxifGN8ZHxlfGZ8Z3xoCi0JCW1vdnEJbW0zLCBtbTEJLy8lJW1tMSwlJW1tMyAJLy8gbW0zID0gYXxifGN8ZHxlfGZ8Z3xoCi0JCS8vIG9uIHZhIGZhaXJlIGxlICJzaWduIGV4dGVuc2lvbiIgZW4gZmFpc2FudCB1biBjbXAgYXZlYyAwIHF1aSByZXRvdXJuZSAxIHNpIDwwLCAwIHNpID4wCi0JCXBjbXBndGIJCW1tMiwgbW0xCS8vJSVtbTEsJSVtbTIJLy8gbW0yID0gMTExMTExMTF8MDAwMDAwMDB8MDAwMDAwMDAuLi4uCi0JCXB1bnBja2hidwltbTEsIG1tMgkvLyUlbW0yLCUlbW0xCS8vIG1tMSA9IDB8YXwwfGJ8MHxjfDB8ZAotCQlwdW5wY2tsYncJbW0zLCBtbTIJLy8lJW1tMiwlJW1tMwkvLyBtbTMgPSAwfGV8MHxmfDB8Z3wwfGgKLQkJbW92cQltbTIsIFtlZGldCS8vKCUlZWRpKSwlJW1tMgkvLyBtbTIgPSBkZXN0aW5hdGlvbgotCQlwbXVsbHcJbW0xLCBtbTAJLy8lJW1tMCwlJW1tMQkvLyBtbTEgPSB2KmF8dipifHYqY3x2KmQKLQkJYWRkCQllc2ksIDgJCS8vJDgsJSVlc2kKLQkJcG11bGx3CW1tMywgbW0wCS8vJSVtbTAsJSVtbTMJLy8gbW0zID0gdiplfHYqZnx2Kmd8dipoCi0JCXBzcmF3CW1tMSwgNwkJLy8kNywlJW1tMQkJLy8gbW0xID0gdiphLzEyOHx2KmIvMTI4fHYqYy8xMjh8dipkLzEyOCAKLQkJcHNyYXcJbW0zLCA3CQkvLyQ3LCUlbW0zCQkvLyBtbTMgPSB2KmUvMTI4fHYqZi8xMjh8dipnLzEyOHx2KmgvMTI4Ci0JCXBhY2tzc3diIG1tMywgbW0xCS8vJSVtbTEsJSVtbTMJLy8gbW0xID0gdiphLzEyOHx2KmIvMTI4fHYqYy8xMjh8dipkLzEyOHx2KmUvMTI4fHYqZi8xMjh8dipnLzEyOHx2KmgvMTI4Ci0JCXBhZGRzYgltbTMsIG1tMgkvLyUlbW0yLCUlbW0zCS8vIGFkZCB0byBkZXN0aW5hdGlvbiBidWZmZXIKLQkJbW92cQlbZWRpXSwgbW0zCS8vJSVtbTMsKCUlZWRpKQkvLyBzdG9yZSBiYWNrIHRvIHJhbQotCQlhZGQJCWVkaSwgOAkJLy8kOCwlJWVkaQotCQlkZWMJCWVieAkJCS8vJSVlYngKLQkJam56CQltaXhsb29wUzgKLQkJCi1lbmRTODoKLQkJZW1tcwotCQkKLQkJcG9wCQllYngKLQkJcG9wCQllc2kKLQkJcG9wCQllZGkKLQl9Ci19Ci0KLSNlbmRpZiAvKiBTRExfQVNTRU1CTFlfUk9VVElORVMgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX21peGVyX01NWF9WQy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YX1ZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTAyYTkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YX1ZDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotCi0jaWYgKChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSkgJiYgZGVmaW5lZChTRExfQVNTRU1CTFlfUk9VVElORVMpCi0vKiBoZWFkZXJzIGZvciBNTVggYXNzZW1ibGVyIHZlcnNpb24gb2YgU0RMX01peEF1ZGlvCi0gICBDb3B5cmlnaHQgMjAwMiBTdGVwaGFuZSBNYXJjaGVzaW4gKHN0ZXBoYW5lLm1hcmNoZXNpbkB3YW5hZG9vLmZyKQotICAgQ29udmVydGVkIHRvIEludGVsIEFTTSBub3RhdGlvbiBieSBDdGgKLSAgIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTEdQTCAoc2VlIENPUFlJTkcgZm9yIGRldGFpbHMpCi0gICAKLSAgIEFzc3VtZXMgYnVmZmVyIHNpemUgaW4gYnl0ZXMgaXMgYSBtdWx0aXBsZSBvZiAxNgotICAgQXNzdW1lcyBTRExfTUlYX01BWFZPTFVNRSA9IDEyOAotKi8KLXZvaWQgU0RMX01peEF1ZGlvX01NWF9TMTZfVkMoY2hhciogLGNoYXIqICx1bnNpZ25lZCBpbnQgLGludCApOwotdm9pZCBTRExfTWl4QXVkaW9fTU1YX1M4X1ZDKGNoYXIqICxjaGFyKiAsdW5zaWduZWQgaW50ICxpbnQgKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfbTY4ay5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfbWl4ZXJfbTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODc4NmRhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX21peGVyX202OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLQltNjhrIGFzc2VtYmx5IG1peCByb3V0aW5lcwotCi0JUGF0cmljZSBNYW5kaW4KLSovCi0KLSNpZiBkZWZpbmVkKF9fTTY4MDAwX18pICYmIGRlZmluZWQoX19HTlVDX18pCi12b2lkIFNETF9NaXhBdWRpb19tNjhrX1U4KGNoYXIqIGRzdCwgY2hhciogc3JjLCBsb25nIGxlbiwgbG9uZyB2b2x1bWUsIGNoYXIqIG1peDgpCi17Ci0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCi0JInRzdGwJJTJcbiIKLSIJYmVxcwlzdG9wbG9vcF91OFxuIgotIm1peGxvb3BfdTg6XG4iCi0KLQkvKiBNaXggYSBzYW1wbGUgKi8KLQotIgltb3ZlcQkjMCwlJWQwXG4iCi0iCW1vdmVxCSMwLCUlZDFcbiIKLQotIgltb3ZlYgklMUArLCUlZDBcbiIJLyogZDAgPSAqc3JjKysgKi8KLSIJc3ViCSMxMjgsJSVkMFxuIgkvKiBkMCAtPSAxMjggKi8KLSIJbXVscwklMywlJWQwXG4iCS8qIGQwICo9IHZvbHVtZSAoMDw9dm9sdW1lPD0xMjgpICovCi0iCW1vdmViCSUwQCwlJWQxXG4iCS8qIGQxID0gKmRzdCAqLwotIglhc3IJIzcsJSVkMFxuIgkvKiBkMCAvPSAxMjggKFNETF9NSVhfTUFYVk9MVU1FKSAqLwotIglhZGQJIzEyOCwlJWQwXG4iCS8qIGQwICs9IDEyOCAqLwotCi0iCWFkZAklJWQxLCUlZDBcbiIKLQotIgltb3ZlYgklNEAoJSVkMDp3KSwlMEArXG4iCi0KLQkvKiBMb29wIHRpbGwgZG9uZSAqLwotCi0iCXN1YnFsCSMxLCUyXG4iCi0iCWJoaXMJbWl4bG9vcF91OFxuIgotInN0b3Bsb29wX3U4OlxuIgotCi0JIDogLyogbm8gcmV0dXJuIHZhbHVlICovCi0JIDogLyogaW5wdXQgKi8KLQkgCSJhIihkc3QpLCAiYSIoc3JjKSwgImQiKGxlbiksICJkIih2b2x1bWUpLCAiYSIobWl4OCkJCi0JIDogLyogY2xvYmJlcmVkIHJlZ2lzdGVycyAqLwotCSAJImQwIiwgImQxIiwgImNjIiwgIm1lbW9yeSIgCi0JICk7Ci19Ci0KLXZvaWQgU0RMX01peEF1ZGlvX202OGtfUzgoY2hhciogZHN0LCBjaGFyKiBzcmMsIGxvbmcgbGVuLCBsb25nIHZvbHVtZSkKLXsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0KLQkidHN0bAklMlxuIgotIgliZXFzCXN0b3Bsb29wX3M4XG4iCi0iCW1vdmVxCSMtMTI4LCUlZDJcbiIKLSIJbW92ZXEJIzEyNywlJWQzXG4iCi0ibWl4bG9vcF9zODpcbiIKLQotCS8qIE1peCBhIHNhbXBsZSAqLwotCi0iCW1vdmVxCSMwLCUlZDBcbiIKLSIJbW92ZXEJIzAsJSVkMVxuIgotCi0iCW1vdmViCSUxQCssJSVkMFxuIgkvKiBkMCA9ICpzcmMrKyAqLwotIgltdWxzCSUzLCUlZDBcbiIJLyogZDAgKj0gdm9sdW1lICgwPD12b2x1bWU8PTEyOCkgKi8KLSIJbW92ZWIJJTBALCUlZDFcbiIJLyogZDEgPSAqZHN0ICovCi0iCWFzcgkjNywlJWQwXG4iCS8qIGQwIC89IDEyOCAoU0RMX01JWF9NQVhWT0xVTUUpICovCi0KLSIJYWRkCSUlZDEsJSVkMFxuIgotCi0iCWNtcAklJWQyLCUlZDBcbiIKLSIJYmdlcwlsb3dlcl9saW1pdF9zOFxuIgotIgltb3ZlCSUlZDIsJSVkMFxuIgotImxvd2VyX2xpbWl0X3M4OlxuIgotCi0iCWNtcAklJWQzLCUlZDBcbiIKLSIJYmxlcwl1cHBlcl9saW1pdF9zOFxuIgotIgltb3ZlCSUlZDMsJSVkMFxuIgotInVwcGVyX2xpbWl0X3M4OlxuIgotIgltb3ZlYgklJWQwLCUwQCtcbiIKLQotCS8qIExvb3AgdGlsbCBkb25lICovCi0KLSIJc3VicWwJIzEsJTJcbiIKLSIJYmhpcwltaXhsb29wX3M4XG4iCi0ic3RvcGxvb3Bfczg6XG4iCi0KLQkgOiAvKiBubyByZXR1cm4gdmFsdWUgKi8KLQkgOiAvKiBpbnB1dCAqLwotCSAJImEiKGRzdCksICJhIihzcmMpLCAiZCIobGVuKSwgImQiKHZvbHVtZSkJCi0JIDogLyogY2xvYmJlcmVkIHJlZ2lzdGVycyAqLwotCSAJImQwIiwgImQxIiwgImQyIiwgImQzIiwgImNjIiwgIm1lbW9yeSIgCi0JICk7Ci19Ci0KLXZvaWQgU0RMX01peEF1ZGlvX202OGtfUzE2TVNCKHNob3J0KiBkc3QsIHNob3J0KiBzcmMsIGxvbmcgbGVuLCBsb25nIHZvbHVtZSkKLXsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0KLQkidHN0bAklMlxuIgotIgliZXFzCXN0b3Bsb29wX3MxNm1zYlxuIgotIgltb3ZlbAkjLTMyNzY4LCUlZDJcbiIKLSIJbW92ZWwJIzMyNzY3LCUlZDNcbiIKLSIJbHNybAkjMSwlMlxuIgotIm1peGxvb3BfczE2bXNiOlxuIgotCi0JLyogTWl4IGEgc2FtcGxlICovCi0KLSIJbW92ZQklMUArLCUlZDBcbiIJLyogZDAgPSAqc3JjKysgKi8KLSIJbXVscwklMywlJWQwXG4iCS8qIGQwICo9IHZvbHVtZSAoMDw9dm9sdW1lPD0xMjgpICovCi0iCW1vdmUJJTBALCUlZDFcbiIJLyogZDEgPSAqZHN0ICovCi0iCWV4dGwJJSVkMVxuIgkJLyogZXh0ZW5kIGQxIHRvIDMyIGJpdHMgKi8KLSIJYXNybAkjNywlJWQwXG4iCS8qIGQwIC89IDEyOCAoU0RMX01JWF9NQVhWT0xVTUUpICovCi0KLSIJYWRkbAklJWQxLCUlZDBcbiIKLQotIgljbXBsCSUlZDIsJSVkMFxuIgotIgliZ2VzCWxvd2VyX2xpbWl0X3MxNm1zYlxuIgotIgltb3ZlCSUlZDIsJSVkMFxuIgotImxvd2VyX2xpbWl0X3MxNm1zYjpcbiIKLQotIgljbXBsCSUlZDMsJSVkMFxuIgotIglibGVzCXVwcGVyX2xpbWl0X3MxNm1zYlxuIgotIgltb3ZlCSUlZDMsJSVkMFxuIgotInVwcGVyX2xpbWl0X3MxNm1zYjpcbiIKLSIJbW92ZQklJWQwLCUwQCtcbiIKLQotCS8qIExvb3AgdGlsbCBkb25lICovCi0KLSIJc3VicWwJIzEsJTJcbiIKLSIJYmhpcwltaXhsb29wX3MxNm1zYlxuIgotInN0b3Bsb29wX3MxNm1zYjpcbiIKLQotCSA6IC8qIG5vIHJldHVybiB2YWx1ZSAqLwotCSA6IC8qIGlucHV0ICovCi0JIAkiYSIoZHN0KSwgImEiKHNyYyksICJkIihsZW4pLCAiZCIodm9sdW1lKQkKLQkgOiAvKiBjbG9iYmVyZWQgcmVnaXN0ZXJzICovCi0JIAkiZDAiLCAiZDEiLCAiZDIiLCAiZDMiLCAiY2MiLCAibWVtb3J5IiAKLQkgKTsKLX0KLQotdm9pZCBTRExfTWl4QXVkaW9fbTY4a19TMTZMU0Ioc2hvcnQqIGRzdCwgc2hvcnQqIHNyYywgbG9uZyBsZW4sIGxvbmcgdm9sdW1lKQotewotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLQotCSJ0c3RsCSUyXG4iCi0iCWJlcXMJc3RvcGxvb3BfczE2bHNiXG4iCi0iCW1vdmVsCSMtMzI3NjgsJSVkMlxuIgotIgltb3ZlbAkjMzI3NjcsJSVkM1xuIgotIglsc3JsCSMxLCUyXG4iCi0ibWl4bG9vcF9zMTZsc2I6XG4iCi0KLQkvKiBNaXggYSBzYW1wbGUgKi8KLQotIgltb3ZlCSUxQCssJSVkMFxuIgkvKiBkMCA9ICpzcmMrKyAqLwotIglyb3J3CSM4LCUlZDBcbiIKLSIJbXVscwklMywlJWQwXG4iCS8qIGQwICo9IHZvbHVtZSAoMDw9dm9sdW1lPD0xMjgpICovCi0iCW1vdmUJJTBALCUlZDFcbiIJLyogZDEgPSAqZHN0ICovCi0iCXJvcncJIzgsJSVkMVxuIgotIglleHRsCSUlZDFcbiIJCS8qIGV4dGVuZCBkMSB0byAzMiBiaXRzICovCi0iCWFzcmwJIzcsJSVkMFxuIgkvKiBkMCAvPSAxMjggKFNETF9NSVhfTUFYVk9MVU1FKSAqLwotCi0iCWFkZGwJJSVkMSwlJWQwXG4iCi0KLSIJY21wbAklJWQyLCUlZDBcbiIKLSIJYmdlcwlsb3dlcl9saW1pdF9zMTZsc2JcbiIKLSIJbW92ZQklJWQyLCUlZDBcbiIKLSJsb3dlcl9saW1pdF9zMTZsc2I6XG4iCi0KLSIJY21wbAklJWQzLCUlZDBcbiIKLSIJYmxlcwl1cHBlcl9saW1pdF9zMTZsc2JcbiIKLSIJbW92ZQklJWQzLCUlZDBcbiIKLSJ1cHBlcl9saW1pdF9zMTZsc2I6XG4iCi0iCXJvcncJIzgsJSVkMFxuIgotIgltb3ZlCSUlZDAsJTBAK1xuIgotCi0JLyogTG9vcCB0aWxsIGRvbmUgKi8KLQotIglzdWJxbAkjMSwlMlxuIgotIgliaGlzCW1peGxvb3BfczE2bHNiXG4iCi0ic3RvcGxvb3BfczE2bHNiOlxuIgotCi0JIDogLyogbm8gcmV0dXJuIHZhbHVlICovCi0JIDogLyogaW5wdXQgKi8KLQkgCSJhIihkc3QpLCAiYSIoc3JjKSwgImQiKGxlbiksICJkIih2b2x1bWUpCQotCSA6IC8qIGNsb2JiZXJlZCByZWdpc3RlcnMgKi8KLQkgCSJkMCIsICJkMSIsICJkMiIsICJkMyIsICJjYyIsICJtZW1vcnkiIAotCSApOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX21peGVyX202OGsuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX21peGVyX202OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1MWRjNC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF9taXhlcl9tNjhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLQltNjhrIGFzc2VtYmx5IG1peCByb3V0aW5lcwotCi0JUGF0cmljZSBNYW5kaW4KLSovCi0KLSNpZiBkZWZpbmVkKF9fTTY4MDAwX18pICYmIGRlZmluZWQoX19HTlVDX18pCi12b2lkIFNETF9NaXhBdWRpb19tNjhrX1U4KGNoYXIqIGRzdCxjaGFyKiBzcmMsIGxvbmcgbGVuLCBsb25nIHZvbHVtZSwgY2hhciogbWl4OCk7Ci12b2lkIFNETF9NaXhBdWRpb19tNjhrX1M4KGNoYXIqIGRzdCxjaGFyKiBzcmMsIGxvbmcgbGVuLCBsb25nIHZvbHVtZSk7Ci0KLXZvaWQgU0RMX01peEF1ZGlvX202OGtfUzE2TVNCKHNob3J0KiBkc3Qsc2hvcnQqIHNyYywgbG9uZyBsZW4sIGxvbmcgdm9sdW1lKTsKLXZvaWQgU0RMX01peEF1ZGlvX202OGtfUzE2TFNCKHNob3J0KiBkc3Qsc2hvcnQqIHNyYywgbG9uZyBsZW4sIGxvbmcgdm9sdW1lKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfc3lzYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX3N5c2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYzkyMGEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfc3lzYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIFNETF9mcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9zeXNhdWRpb19oCi0jZGVmaW5lIF9TRExfc3lzYXVkaW9faAotCi0jaW5jbHVkZSAiU0RMX211dGV4LmgiCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotCi0vKiBUaGUgU0RMIGF1ZGlvIGRyaXZlciAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX0F1ZGlvRGV2aWNlIFNETF9BdWRpb0RldmljZTsKLQotLyogRGVmaW5lIHRoZSBTREwgYXVkaW8gZHJpdmVyIHN0cnVjdHVyZSAqLwotI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKl90aGlzCi0jaWZuZGVmIF9TVEFUVVMKLSNkZWZpbmUgX1NUQVRVUwlTRExfc3RhdHVzICpzdGF0dXMKLSNlbmRpZgotc3RydWN0IFNETF9BdWRpb0RldmljZSB7Ci0JLyogKiAqICovCi0JLyogVGhlIG5hbWUgb2YgdGhpcyBhdWRpbyBkcml2ZXIgKi8KLQljb25zdCBjaGFyICpuYW1lOwotCi0JLyogKiAqICovCi0JLyogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXVkaW8gZHJpdmVyICovCi0JY29uc3QgY2hhciAqZGVzYzsKLQotCS8qICogKiAqLwotCS8qIFB1YmxpYyBkcml2ZXIgZnVuY3Rpb25zICovCi0JaW50ICAoKk9wZW5BdWRpbykoX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotCXZvaWQgKCpUaHJlYWRJbml0KShfVEhJUyk7CS8qIENhbGxlZCBieSBhdWRpbyB0aHJlYWQgYXQgc3RhcnQgKi8KLQl2b2lkICgqV2FpdEF1ZGlvKShfVEhJUyk7Ci0Jdm9pZCAoKlBsYXlBdWRpbykoX1RISVMpOwotCVVpbnQ4ICooKkdldEF1ZGlvQnVmKShfVEhJUyk7Ci0Jdm9pZCAoKldhaXREb25lKShfVEhJUyk7Ci0Jdm9pZCAoKkNsb3NlQXVkaW8pKF9USElTKTsKLQotCS8qICogKiAqLwotCS8qIExvY2sgLyBVbmxvY2sgZnVuY3Rpb25zIGFkZGVkIGZvciB0aGUgTWFjIHBvcnQgKi8KLQl2b2lkICgqTG9ja0F1ZGlvKShfVEhJUyk7Ci0Jdm9pZCAoKlVubG9ja0F1ZGlvKShfVEhJUyk7Ci0KLQkvKiAqICogKi8KLQkvKiBEYXRhIGNvbW1vbiB0byBhbGwgZGV2aWNlcyAqLwotCi0JLyogVGhlIGN1cnJlbnQgYXVkaW8gc3BlY2lmaWNhdGlvbiAoc2hhcmVkIHdpdGggYXVkaW8gdGhyZWFkKSAqLwotCVNETF9BdWRpb1NwZWMgc3BlYzsKLQotCS8qIEFuIGF1ZGlvIGNvbnZlcnNpb24gYmxvY2sgZm9yIGF1ZGlvIGZvcm1hdCBlbXVsYXRpb24gKi8KLQlTRExfQXVkaW9DVlQgY29udmVydDsKLQotCS8qIEN1cnJlbnQgc3RhdGUgZmxhZ3MgKi8KLQlpbnQgZW5hYmxlZDsKLQlpbnQgcGF1c2VkOwotCWludCBvcGVuZWQ7Ci0KLQkvKiBGYWtlIGF1ZGlvIGJ1ZmZlciBmb3Igd2hlbiB0aGUgYXVkaW8gaGFyZHdhcmUgaXMgYnVzeSAqLwotCVVpbnQ4ICpmYWtlX3N0cmVhbTsKLQotCS8qIEEgc2VtYXBob3JlIGZvciBsb2NraW5nIHRoZSBtaXhpbmcgYnVmZmVycyAqLwotCVNETF9tdXRleCAqbWl4ZXJfbG9jazsKLQotCS8qIEEgdGhyZWFkIHRvIGZlZWQgdGhlIGF1ZGlvIGRldmljZSAqLwotCVNETF9UaHJlYWQgKnRocmVhZDsKLQlVaW50MzIgdGhyZWFkaWQ7Ci0KLQkvKiAqICogKi8KLQkvKiBEYXRhIHByaXZhdGUgdG8gdGhpcyBkcml2ZXIgKi8KLQlzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKmhpZGRlbjsKLQotCS8qICogKiAqLwotCS8qIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGRpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KLQl2b2lkICgqZnJlZSkoX1RISVMpOwotfTsKLSN1bmRlZiBfVEhJUwotCi10eXBlZGVmIHN0cnVjdCBBdWRpb0Jvb3RTdHJhcCB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICpkZXNjOwotCWludCAoKmF2YWlsYWJsZSkodm9pZCk7Ci0JU0RMX0F1ZGlvRGV2aWNlICooKmNyZWF0ZSkoaW50IGRldmluZGV4KTsKLX0gQXVkaW9Cb290U3RyYXA7Ci0KLSNpZiBTRExfQVVESU9fRFJJVkVSX0JTRAotZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIEJTRF9BVURJT19ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX1BVTFNFCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgUFVMU0VfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9PU1MKLWV4dGVybiBBdWRpb0Jvb3RTdHJhcCBEU1BfYm9vdHN0cmFwOwotZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIERNQV9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX0FMU0EKLWV4dGVybiBBdWRpb0Jvb3RTdHJhcCBBTFNBX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfUU5YTlRPCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgUU5YTlRPQVVESU9fYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9TVU5BVURJTwotZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIFNVTkFVRElPX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfRE1FRElBCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgRE1FRElBX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfQVJUUwotZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIEFSVFNfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9FU0QKLWV4dGVybiBBdWRpb0Jvb3RTdHJhcCBFU0RfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9OQVMKLWV4dGVybiBBdWRpb0Jvb3RTdHJhcCBOQVNfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9EU09VTkQKLWV4dGVybiBBdWRpb0Jvb3RTdHJhcCBEU09VTkRfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9XQVZFT1VUCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgV0FWRU9VVF9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX1BBVUQKLWV4dGVybiBBdWRpb0Jvb3RTdHJhcCBQYXVkX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfQkFVRElPCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgQkFVRElPX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfQ09SRUFVRElPCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgQ09SRUFVRElPX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfU05ETUdSCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgU05ETUdSX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfTUlOVAotZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIE1JTlRBVURJT19HU1hCX2Jvb3RzdHJhcDsKLWV4dGVybiBBdWRpb0Jvb3RTdHJhcCBNSU5UQVVESU9fTUNTTl9ib290c3RyYXA7Ci1leHRlcm4gQXVkaW9Cb290U3RyYXAgTUlOVEFVRElPX1NURkFfYm9vdHN0cmFwOwotZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIE1JTlRBVURJT19YQklPU19ib290c3RyYXA7Ci1leHRlcm4gQXVkaW9Cb290U3RyYXAgTUlOVEFVRElPX0RNQThfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9ESVNLCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgRElTS0FVRF9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX0RVTU1ZCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgRFVNTVlBVURfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9EQwotZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIERDQVVEX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfTkRTCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgTkRTQVVEX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfTU1FQVVESU8KLWV4dGVybiBBdWRpb0Jvb3RTdHJhcCBNTUVBVURJT19ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfQVVESU9fRFJJVkVSX0RBUlQKLWV4dGVybiBBdWRpb0Jvb3RTdHJhcCBEQVJUX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9BVURJT19EUklWRVJfRVBPQ0FVRElPCi1leHRlcm4gQXVkaW9Cb290U3RyYXAgRVBPQ0F1ZGlvX2Jvb3RzdHJhcDsgCi0jZW5kaWYKLQotLyogVGhpcyBpcyB0aGUgY3VycmVudCBhdWRpbyBkZXZpY2UgKi8KLWV4dGVybiBTRExfQXVkaW9EZXZpY2UgKmN1cnJlbnRfYXVkaW87Ci0KLSNlbmRpZiAvKiBfU0RMX3N5c2F1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX3dhdmUuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vU0RMX3dhdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1MTk1ZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF93YXZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIE1pY3Jvc29mdCBXQVZFIGZpbGUgbG9hZGluZyByb3V0aW5lcyAqLwotCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiU0RMX3dhdmUuaCIKLQotCi1zdGF0aWMgaW50IFJlYWRDaHVuayhTRExfUldvcHMgKnNyYywgQ2h1bmsgKmNodW5rKTsKLQotc3RydWN0IE1TX0FEUENNX2RlY29kZXN0YXRlIHsKLQlVaW50OCBoUHJlZGljdG9yOwotCVVpbnQxNiBpRGVsdGE7Ci0JU2ludDE2IGlTYW1wMTsKLQlTaW50MTYgaVNhbXAyOwotfTsKLXN0YXRpYyBzdHJ1Y3QgTVNfQURQQ01fZGVjb2RlciB7Ci0JV2F2ZUZNVCB3YXZlZm10OwotCVVpbnQxNiB3U2FtcGxlc1BlckJsb2NrOwotCVVpbnQxNiB3TnVtQ29lZjsKLQlTaW50MTYgYUNvZWZmWzddWzJdOwotCS8qICogKiAqLwotCXN0cnVjdCBNU19BRFBDTV9kZWNvZGVzdGF0ZSBzdGF0ZVsyXTsKLX0gTVNfQURQQ01fc3RhdGU7Ci0KLXN0YXRpYyBpbnQgSW5pdE1TX0FEUENNKFdhdmVGTVQgKmZvcm1hdCkKLXsKLQlVaW50OCAqcm9ndWVfZmVlbDsKLQlVaW50MTYgZXh0cmFfaW5mbzsKLQlpbnQgaTsKLQotCS8qIFNldCB0aGUgcm9ndWUgcG9pbnRlciB0byB0aGUgTVNfQURQQ00gc3BlY2lmaWMgZGF0YSAqLwotCU1TX0FEUENNX3N0YXRlLndhdmVmbXQuZW5jb2RpbmcgPSBTRExfU3dhcExFMTYoZm9ybWF0LT5lbmNvZGluZyk7Ci0JTVNfQURQQ01fc3RhdGUud2F2ZWZtdC5jaGFubmVscyA9IFNETF9Td2FwTEUxNihmb3JtYXQtPmNoYW5uZWxzKTsKLQlNU19BRFBDTV9zdGF0ZS53YXZlZm10LmZyZXF1ZW5jeSA9IFNETF9Td2FwTEUzMihmb3JtYXQtPmZyZXF1ZW5jeSk7Ci0JTVNfQURQQ01fc3RhdGUud2F2ZWZtdC5ieXRlcmF0ZSA9IFNETF9Td2FwTEUzMihmb3JtYXQtPmJ5dGVyYXRlKTsKLQlNU19BRFBDTV9zdGF0ZS53YXZlZm10LmJsb2NrYWxpZ24gPSBTRExfU3dhcExFMTYoZm9ybWF0LT5ibG9ja2FsaWduKTsKLQlNU19BRFBDTV9zdGF0ZS53YXZlZm10LmJpdHNwZXJzYW1wbGUgPQotCQkJCQkgU0RMX1N3YXBMRTE2KGZvcm1hdC0+Yml0c3BlcnNhbXBsZSk7Ci0Jcm9ndWVfZmVlbCA9IChVaW50OCAqKWZvcm1hdCtzaXplb2YoKmZvcm1hdCk7Ci0JaWYgKCBzaXplb2YoKmZvcm1hdCkgPT0gMTYgKSB7Ci0JCWV4dHJhX2luZm8gPSAoKHJvZ3VlX2ZlZWxbMV08PDgpfHJvZ3VlX2ZlZWxbMF0pOwotCQlyb2d1ZV9mZWVsICs9IHNpemVvZihVaW50MTYpOwotCX0KLQlNU19BRFBDTV9zdGF0ZS53U2FtcGxlc1BlckJsb2NrID0gKChyb2d1ZV9mZWVsWzFdPDw4KXxyb2d1ZV9mZWVsWzBdKTsKLQlyb2d1ZV9mZWVsICs9IHNpemVvZihVaW50MTYpOwotCU1TX0FEUENNX3N0YXRlLndOdW1Db2VmID0gKChyb2d1ZV9mZWVsWzFdPDw4KXxyb2d1ZV9mZWVsWzBdKTsKLQlyb2d1ZV9mZWVsICs9IHNpemVvZihVaW50MTYpOwotCWlmICggTVNfQURQQ01fc3RhdGUud051bUNvZWYgIT0gNyApIHsKLQkJU0RMX1NldEVycm9yKCJVbmtub3duIHNldCBvZiBNU19BRFBDTSBjb2VmZmljaWVudHMiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JZm9yICggaT0wOyBpPE1TX0FEUENNX3N0YXRlLndOdW1Db2VmOyArK2kgKSB7Ci0JCU1TX0FEUENNX3N0YXRlLmFDb2VmZltpXVswXSA9ICgocm9ndWVfZmVlbFsxXTw8OCl8cm9ndWVfZmVlbFswXSk7Ci0JCXJvZ3VlX2ZlZWwgKz0gc2l6ZW9mKFVpbnQxNik7Ci0JCU1TX0FEUENNX3N0YXRlLmFDb2VmZltpXVsxXSA9ICgocm9ndWVfZmVlbFsxXTw8OCl8cm9ndWVfZmVlbFswXSk7Ci0JCXJvZ3VlX2ZlZWwgKz0gc2l6ZW9mKFVpbnQxNik7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIFNpbnQzMiBNU19BRFBDTV9uaWJibGUoc3RydWN0IE1TX0FEUENNX2RlY29kZXN0YXRlICpzdGF0ZSwKLQkJCQkJVWludDggbnliYmxlLCBTaW50MTYgKmNvZWZmKQotewotCWNvbnN0IFNpbnQzMiBtYXhfYXVkaW92YWwgPSAoKDE8PCgxNi0xKSktMSk7Ci0JY29uc3QgU2ludDMyIG1pbl9hdWRpb3ZhbCA9IC0oMTw8KDE2LTEpKTsKLQljb25zdCBTaW50MzIgYWRhcHRpdmVbXSA9IHsKLQkJMjMwLCAyMzAsIDIzMCwgMjMwLCAzMDcsIDQwOSwgNTEyLCA2MTQsCi0JCTc2OCwgNjE0LCA1MTIsIDQwOSwgMzA3LCAyMzAsIDIzMCwgMjMwCi0JfTsKLQlTaW50MzIgbmV3X3NhbXBsZSwgZGVsdGE7Ci0KLQluZXdfc2FtcGxlID0gKChzdGF0ZS0+aVNhbXAxICogY29lZmZbMF0pICsKLQkJICAgICAgKHN0YXRlLT5pU2FtcDIgKiBjb2VmZlsxXSkpLzI1NjsKLQlpZiAoIG55YmJsZSAmIDB4MDggKSB7Ci0JCW5ld19zYW1wbGUgKz0gc3RhdGUtPmlEZWx0YSAqIChueWJibGUtMHgxMCk7Ci0JfSBlbHNlIHsKLQkJbmV3X3NhbXBsZSArPSBzdGF0ZS0+aURlbHRhICogbnliYmxlOwotCX0KLQlpZiAoIG5ld19zYW1wbGUgPCBtaW5fYXVkaW92YWwgKSB7Ci0JCW5ld19zYW1wbGUgPSBtaW5fYXVkaW92YWw7Ci0JfSBlbHNlCi0JaWYgKCBuZXdfc2FtcGxlID4gbWF4X2F1ZGlvdmFsICkgewotCQluZXdfc2FtcGxlID0gbWF4X2F1ZGlvdmFsOwotCX0KLQlkZWx0YSA9ICgoU2ludDMyKXN0YXRlLT5pRGVsdGEgKiBhZGFwdGl2ZVtueWJibGVdKS8yNTY7Ci0JaWYgKCBkZWx0YSA8IDE2ICkgewotCQlkZWx0YSA9IDE2OwotCX0KLQlzdGF0ZS0+aURlbHRhID0gKFVpbnQxNilkZWx0YTsKLQlzdGF0ZS0+aVNhbXAyID0gc3RhdGUtPmlTYW1wMTsKLQlzdGF0ZS0+aVNhbXAxID0gKFNpbnQxNiluZXdfc2FtcGxlOwotCXJldHVybihuZXdfc2FtcGxlKTsKLX0KLQotc3RhdGljIGludCBNU19BRFBDTV9kZWNvZGUoVWludDggKiphdWRpb19idWYsIFVpbnQzMiAqYXVkaW9fbGVuKQotewotCXN0cnVjdCBNU19BRFBDTV9kZWNvZGVzdGF0ZSAqc3RhdGVbMl07Ci0JVWludDggKmZyZWVhYmxlLCAqZW5jb2RlZCwgKmRlY29kZWQ7Ci0JU2ludDMyIGVuY29kZWRfbGVuLCBzYW1wbGVzbGVmdDsKLQlTaW50OCBueWJibGUsIHN0ZXJlbzsKLQlTaW50MTYgKmNvZWZmWzJdOwotCVNpbnQzMiBuZXdfc2FtcGxlOwotCi0JLyogQWxsb2NhdGUgdGhlIHByb3BlciBzaXplZCBvdXRwdXQgYnVmZmVyICovCi0JZW5jb2RlZF9sZW4gPSAqYXVkaW9fbGVuOwotCWVuY29kZWQgPSAqYXVkaW9fYnVmOwotCWZyZWVhYmxlID0gKmF1ZGlvX2J1ZjsKLQkqYXVkaW9fbGVuID0gKGVuY29kZWRfbGVuL01TX0FEUENNX3N0YXRlLndhdmVmbXQuYmxvY2thbGlnbikgKiAKLQkJCQlNU19BRFBDTV9zdGF0ZS53U2FtcGxlc1BlckJsb2NrKgotCQkJCU1TX0FEUENNX3N0YXRlLndhdmVmbXQuY2hhbm5lbHMqc2l6ZW9mKFNpbnQxNik7Ci0JKmF1ZGlvX2J1ZiA9IChVaW50OCAqKVNETF9tYWxsb2MoKmF1ZGlvX2xlbik7Ci0JaWYgKCAqYXVkaW9fYnVmID09IE5VTEwgKSB7Ci0JCVNETF9FcnJvcihTRExfRU5PTUVNKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JZGVjb2RlZCA9ICphdWRpb19idWY7Ci0KLQkvKiBHZXQgcmVhZHkuLi4gR28hICovCi0Jc3RlcmVvID0gKE1TX0FEUENNX3N0YXRlLndhdmVmbXQuY2hhbm5lbHMgPT0gMik7Ci0Jc3RhdGVbMF0gPSAmTVNfQURQQ01fc3RhdGUuc3RhdGVbMF07Ci0Jc3RhdGVbMV0gPSAmTVNfQURQQ01fc3RhdGUuc3RhdGVbc3RlcmVvXTsKLQl3aGlsZSAoIGVuY29kZWRfbGVuID49IE1TX0FEUENNX3N0YXRlLndhdmVmbXQuYmxvY2thbGlnbiApIHsKLQkJLyogR3JhYiB0aGUgaW5pdGlhbCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBibG9jayAqLwotCQlzdGF0ZVswXS0+aFByZWRpY3RvciA9ICplbmNvZGVkKys7Ci0JCWlmICggc3RlcmVvICkgewotCQkJc3RhdGVbMV0tPmhQcmVkaWN0b3IgPSAqZW5jb2RlZCsrOwotCQl9Ci0JCXN0YXRlWzBdLT5pRGVsdGEgPSAoKGVuY29kZWRbMV08PDgpfGVuY29kZWRbMF0pOwotCQllbmNvZGVkICs9IHNpemVvZihTaW50MTYpOwotCQlpZiAoIHN0ZXJlbyApIHsKLQkJCXN0YXRlWzFdLT5pRGVsdGEgPSAoKGVuY29kZWRbMV08PDgpfGVuY29kZWRbMF0pOwotCQkJZW5jb2RlZCArPSBzaXplb2YoU2ludDE2KTsKLQkJfQotCQlzdGF0ZVswXS0+aVNhbXAxID0gKChlbmNvZGVkWzFdPDw4KXxlbmNvZGVkWzBdKTsKLQkJZW5jb2RlZCArPSBzaXplb2YoU2ludDE2KTsKLQkJaWYgKCBzdGVyZW8gKSB7Ci0JCQlzdGF0ZVsxXS0+aVNhbXAxID0gKChlbmNvZGVkWzFdPDw4KXxlbmNvZGVkWzBdKTsKLQkJCWVuY29kZWQgKz0gc2l6ZW9mKFNpbnQxNik7Ci0JCX0KLQkJc3RhdGVbMF0tPmlTYW1wMiA9ICgoZW5jb2RlZFsxXTw8OCl8ZW5jb2RlZFswXSk7Ci0JCWVuY29kZWQgKz0gc2l6ZW9mKFNpbnQxNik7Ci0JCWlmICggc3RlcmVvICkgewotCQkJc3RhdGVbMV0tPmlTYW1wMiA9ICgoZW5jb2RlZFsxXTw8OCl8ZW5jb2RlZFswXSk7Ci0JCQllbmNvZGVkICs9IHNpemVvZihTaW50MTYpOwotCQl9Ci0JCWNvZWZmWzBdID0gTVNfQURQQ01fc3RhdGUuYUNvZWZmW3N0YXRlWzBdLT5oUHJlZGljdG9yXTsKLQkJY29lZmZbMV0gPSBNU19BRFBDTV9zdGF0ZS5hQ29lZmZbc3RhdGVbMV0tPmhQcmVkaWN0b3JdOwotCi0JCS8qIFN0b3JlIHRoZSB0d28gaW5pdGlhbCBzYW1wbGVzIHdlIHN0YXJ0IHdpdGggKi8KLQkJZGVjb2RlZFswXSA9IHN0YXRlWzBdLT5pU2FtcDImMHhGRjsKLQkJZGVjb2RlZFsxXSA9IHN0YXRlWzBdLT5pU2FtcDI+Pjg7Ci0JCWRlY29kZWQgKz0gMjsKLQkJaWYgKCBzdGVyZW8gKSB7Ci0JCQlkZWNvZGVkWzBdID0gc3RhdGVbMV0tPmlTYW1wMiYweEZGOwotCQkJZGVjb2RlZFsxXSA9IHN0YXRlWzFdLT5pU2FtcDI+Pjg7Ci0JCQlkZWNvZGVkICs9IDI7Ci0JCX0KLQkJZGVjb2RlZFswXSA9IHN0YXRlWzBdLT5pU2FtcDEmMHhGRjsKLQkJZGVjb2RlZFsxXSA9IHN0YXRlWzBdLT5pU2FtcDE+Pjg7Ci0JCWRlY29kZWQgKz0gMjsKLQkJaWYgKCBzdGVyZW8gKSB7Ci0JCQlkZWNvZGVkWzBdID0gc3RhdGVbMV0tPmlTYW1wMSYweEZGOwotCQkJZGVjb2RlZFsxXSA9IHN0YXRlWzFdLT5pU2FtcDE+Pjg7Ci0JCQlkZWNvZGVkICs9IDI7Ci0JCX0KLQotCQkvKiBEZWNvZGUgYW5kIHN0b3JlIHRoZSBvdGhlciBzYW1wbGVzIGluIHRoaXMgYmxvY2sgKi8KLQkJc2FtcGxlc2xlZnQgPSAoTVNfQURQQ01fc3RhdGUud1NhbXBsZXNQZXJCbG9jay0yKSoKLQkJCQkJTVNfQURQQ01fc3RhdGUud2F2ZWZtdC5jaGFubmVsczsKLQkJd2hpbGUgKCBzYW1wbGVzbGVmdCA+IDAgKSB7Ci0JCQlueWJibGUgPSAoKmVuY29kZWQpPj40OwotCQkJbmV3X3NhbXBsZSA9IE1TX0FEUENNX25pYmJsZShzdGF0ZVswXSxueWJibGUsY29lZmZbMF0pOwotCQkJZGVjb2RlZFswXSA9IG5ld19zYW1wbGUmMHhGRjsKLQkJCW5ld19zYW1wbGUgPj49IDg7Ci0JCQlkZWNvZGVkWzFdID0gbmV3X3NhbXBsZSYweEZGOwotCQkJZGVjb2RlZCArPSAyOwotCi0JCQlueWJibGUgPSAoKmVuY29kZWQpJjB4MEY7Ci0JCQluZXdfc2FtcGxlID0gTVNfQURQQ01fbmliYmxlKHN0YXRlWzFdLG55YmJsZSxjb2VmZlsxXSk7Ci0JCQlkZWNvZGVkWzBdID0gbmV3X3NhbXBsZSYweEZGOwotCQkJbmV3X3NhbXBsZSA+Pj0gODsKLQkJCWRlY29kZWRbMV0gPSBuZXdfc2FtcGxlJjB4RkY7Ci0JCQlkZWNvZGVkICs9IDI7Ci0KLQkJCSsrZW5jb2RlZDsKLQkJCXNhbXBsZXNsZWZ0IC09IDI7Ci0JCX0KLQkJZW5jb2RlZF9sZW4gLT0gTVNfQURQQ01fc3RhdGUud2F2ZWZtdC5ibG9ja2FsaWduOwotCX0KLQlTRExfZnJlZShmcmVlYWJsZSk7Ci0JcmV0dXJuKDApOwotfQotCi1zdHJ1Y3QgSU1BX0FEUENNX2RlY29kZXN0YXRlIHsKLQlTaW50MzIgc2FtcGxlOwotCVNpbnQ4IGluZGV4OwotfTsKLXN0YXRpYyBzdHJ1Y3QgSU1BX0FEUENNX2RlY29kZXIgewotCVdhdmVGTVQgd2F2ZWZtdDsKLQlVaW50MTYgd1NhbXBsZXNQZXJCbG9jazsKLQkvKiAqICogKi8KLQlzdHJ1Y3QgSU1BX0FEUENNX2RlY29kZXN0YXRlIHN0YXRlWzJdOwotfSBJTUFfQURQQ01fc3RhdGU7Ci0KLXN0YXRpYyBpbnQgSW5pdElNQV9BRFBDTShXYXZlRk1UICpmb3JtYXQpCi17Ci0JVWludDggKnJvZ3VlX2ZlZWw7Ci0JVWludDE2IGV4dHJhX2luZm87Ci0KLQkvKiBTZXQgdGhlIHJvZ3VlIHBvaW50ZXIgdG8gdGhlIElNQV9BRFBDTSBzcGVjaWZpYyBkYXRhICovCi0JSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuZW5jb2RpbmcgPSBTRExfU3dhcExFMTYoZm9ybWF0LT5lbmNvZGluZyk7Ci0JSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuY2hhbm5lbHMgPSBTRExfU3dhcExFMTYoZm9ybWF0LT5jaGFubmVscyk7Ci0JSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuZnJlcXVlbmN5ID0gU0RMX1N3YXBMRTMyKGZvcm1hdC0+ZnJlcXVlbmN5KTsKLQlJTUFfQURQQ01fc3RhdGUud2F2ZWZtdC5ieXRlcmF0ZSA9IFNETF9Td2FwTEUzMihmb3JtYXQtPmJ5dGVyYXRlKTsKLQlJTUFfQURQQ01fc3RhdGUud2F2ZWZtdC5ibG9ja2FsaWduID0gU0RMX1N3YXBMRTE2KGZvcm1hdC0+YmxvY2thbGlnbik7Ci0JSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuYml0c3BlcnNhbXBsZSA9Ci0JCQkJCSBTRExfU3dhcExFMTYoZm9ybWF0LT5iaXRzcGVyc2FtcGxlKTsKLQlyb2d1ZV9mZWVsID0gKFVpbnQ4ICopZm9ybWF0K3NpemVvZigqZm9ybWF0KTsKLQlpZiAoIHNpemVvZigqZm9ybWF0KSA9PSAxNiApIHsKLQkJZXh0cmFfaW5mbyA9ICgocm9ndWVfZmVlbFsxXTw8OCl8cm9ndWVfZmVlbFswXSk7Ci0JCXJvZ3VlX2ZlZWwgKz0gc2l6ZW9mKFVpbnQxNik7Ci0JfQotCUlNQV9BRFBDTV9zdGF0ZS53U2FtcGxlc1BlckJsb2NrID0gKChyb2d1ZV9mZWVsWzFdPDw4KXxyb2d1ZV9mZWVsWzBdKTsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBTaW50MzIgSU1BX0FEUENNX25pYmJsZShzdHJ1Y3QgSU1BX0FEUENNX2RlY29kZXN0YXRlICpzdGF0ZSxVaW50OCBueWJibGUpCi17Ci0JY29uc3QgU2ludDMyIG1heF9hdWRpb3ZhbCA9ICgoMTw8KDE2LTEpKS0xKTsKLQljb25zdCBTaW50MzIgbWluX2F1ZGlvdmFsID0gLSgxPDwoMTYtMSkpOwotCWNvbnN0IGludCBpbmRleF90YWJsZVsxNl0gPSB7Ci0JCS0xLCAtMSwgLTEsIC0xLAotCQkgMiwgIDQsICA2LCAgOCwKLQkJLTEsIC0xLCAtMSwgLTEsCi0JCSAyLCAgNCwgIDYsICA4Ci0JfTsKLQljb25zdCBTaW50MzIgc3RlcF90YWJsZVs4OV0gPSB7Ci0JCTcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjgsIDMxLAotCQkzNCwgMzcsIDQxLCA0NSwgNTAsIDU1LCA2MCwgNjYsIDczLCA4MCwgODgsIDk3LCAxMDcsIDExOCwgMTMwLAotCQkxNDMsIDE1NywgMTczLCAxOTAsIDIwOSwgMjMwLCAyNTMsIDI3OSwgMzA3LCAzMzcsIDM3MSwgNDA4LAotCQk0NDksIDQ5NCwgNTQ0LCA1OTgsIDY1OCwgNzI0LCA3OTYsIDg3NiwgOTYzLCAxMDYwLCAxMTY2LCAxMjgyLAotCQkxNDExLCAxNTUyLCAxNzA3LCAxODc4LCAyMDY2LCAyMjcyLCAyNDk5LCAyNzQ5LCAzMDI0LCAzMzI3LAotCQkzNjYwLCA0MDI2LCA0NDI4LCA0ODcxLCA1MzU4LCA1ODk0LCA2NDg0LCA3MTMyLCA3ODQ1LCA4NjMwLAotCQk5NDkzLCAxMDQ0MiwgMTE0ODcsIDEyNjM1LCAxMzg5OSwgMTUyODksIDE2ODE4LCAxODUwMCwgMjAzNTAsCi0JCTIyMzg1LCAyNDYyMywgMjcwODYsIDI5Nzk0LCAzMjc2NwotCX07Ci0JU2ludDMyIGRlbHRhLCBzdGVwOwotCi0JLyogQ29tcHV0ZSBkaWZmZXJlbmNlIGFuZCBuZXcgc2FtcGxlIHZhbHVlICovCi0Jc3RlcCA9IHN0ZXBfdGFibGVbc3RhdGUtPmluZGV4XTsKLQlkZWx0YSA9IHN0ZXAgPj4gMzsKLQlpZiAoIG55YmJsZSAmIDB4MDQgKSBkZWx0YSArPSBzdGVwOwotCWlmICggbnliYmxlICYgMHgwMiApIGRlbHRhICs9IChzdGVwID4+IDEpOwotCWlmICggbnliYmxlICYgMHgwMSApIGRlbHRhICs9IChzdGVwID4+IDIpOwotCWlmICggbnliYmxlICYgMHgwOCApIGRlbHRhID0gLWRlbHRhOwotCXN0YXRlLT5zYW1wbGUgKz0gZGVsdGE7Ci0KLQkvKiBVcGRhdGUgaW5kZXggdmFsdWUgKi8KLQlzdGF0ZS0+aW5kZXggKz0gaW5kZXhfdGFibGVbbnliYmxlXTsKLQlpZiAoIHN0YXRlLT5pbmRleCA+IDg4ICkgewotCQlzdGF0ZS0+aW5kZXggPSA4ODsKLQl9IGVsc2UKLQlpZiAoIHN0YXRlLT5pbmRleCA8IDAgKSB7Ci0JCXN0YXRlLT5pbmRleCA9IDA7Ci0JfQotCi0JLyogQ2xhbXAgb3V0cHV0IHNhbXBsZSAqLwotCWlmICggc3RhdGUtPnNhbXBsZSA+IG1heF9hdWRpb3ZhbCApIHsKLQkJc3RhdGUtPnNhbXBsZSA9IG1heF9hdWRpb3ZhbDsKLQl9IGVsc2UKLQlpZiAoIHN0YXRlLT5zYW1wbGUgPCBtaW5fYXVkaW92YWwgKSB7Ci0JCXN0YXRlLT5zYW1wbGUgPSBtaW5fYXVkaW92YWw7Ci0JfQotCXJldHVybihzdGF0ZS0+c2FtcGxlKTsKLX0KLQotLyogRmlsbCB0aGUgZGVjb2RlIGJ1ZmZlciB3aXRoIGEgY2hhbm5lbCBibG9jayBvZiBkYXRhICg4IHNhbXBsZXMpICovCi1zdGF0aWMgdm9pZCBGaWxsX0lNQV9BRFBDTV9ibG9jayhVaW50OCAqZGVjb2RlZCwgVWludDggKmVuY29kZWQsCi0JaW50IGNoYW5uZWwsIGludCBudW1jaGFubmVscywgc3RydWN0IElNQV9BRFBDTV9kZWNvZGVzdGF0ZSAqc3RhdGUpCi17Ci0JaW50IGk7Ci0JU2ludDggbnliYmxlOwotCVNpbnQzMiBuZXdfc2FtcGxlOwotCi0JZGVjb2RlZCArPSAoY2hhbm5lbCAqIDIpOwotCWZvciAoIGk9MDsgaTw0OyArK2kgKSB7Ci0JCW55YmJsZSA9ICgqZW5jb2RlZCkmMHgwRjsKLQkJbmV3X3NhbXBsZSA9IElNQV9BRFBDTV9uaWJibGUoc3RhdGUsIG55YmJsZSk7Ci0JCWRlY29kZWRbMF0gPSBuZXdfc2FtcGxlJjB4RkY7Ci0JCW5ld19zYW1wbGUgPj49IDg7Ci0JCWRlY29kZWRbMV0gPSBuZXdfc2FtcGxlJjB4RkY7Ci0JCWRlY29kZWQgKz0gMiAqIG51bWNoYW5uZWxzOwotCi0JCW55YmJsZSA9ICgqZW5jb2RlZCk+PjQ7Ci0JCW5ld19zYW1wbGUgPSBJTUFfQURQQ01fbmliYmxlKHN0YXRlLCBueWJibGUpOwotCQlkZWNvZGVkWzBdID0gbmV3X3NhbXBsZSYweEZGOwotCQluZXdfc2FtcGxlID4+PSA4OwotCQlkZWNvZGVkWzFdID0gbmV3X3NhbXBsZSYweEZGOwotCQlkZWNvZGVkICs9IDIgKiBudW1jaGFubmVsczsKLQotCQkrK2VuY29kZWQ7Ci0JfQotfQotCi1zdGF0aWMgaW50IElNQV9BRFBDTV9kZWNvZGUoVWludDggKiphdWRpb19idWYsIFVpbnQzMiAqYXVkaW9fbGVuKQotewotCXN0cnVjdCBJTUFfQURQQ01fZGVjb2Rlc3RhdGUgKnN0YXRlOwotCVVpbnQ4ICpmcmVlYWJsZSwgKmVuY29kZWQsICpkZWNvZGVkOwotCVNpbnQzMiBlbmNvZGVkX2xlbiwgc2FtcGxlc2xlZnQ7Ci0JdW5zaWduZWQgaW50IGMsIGNoYW5uZWxzOwotCi0JLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHZhcmlhYmxlcyBpbiB0aGUgc3RhdGUgYXJyYXkgKi8KLQljaGFubmVscyA9IElNQV9BRFBDTV9zdGF0ZS53YXZlZm10LmNoYW5uZWxzOwotCWlmICggY2hhbm5lbHMgPiBTRExfYXJyYXlzaXplKElNQV9BRFBDTV9zdGF0ZS5zdGF0ZSkgKSB7Ci0JCVNETF9TZXRFcnJvcigiSU1BIEFEUENNIGRlY29kZXIgY2FuIG9ubHkgaGFuZGxlICVkIGNoYW5uZWxzIiwKLQkJCQkJU0RMX2FycmF5c2l6ZShJTUFfQURQQ01fc3RhdGUuc3RhdGUpKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0Jc3RhdGUgPSBJTUFfQURQQ01fc3RhdGUuc3RhdGU7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgcHJvcGVyIHNpemVkIG91dHB1dCBidWZmZXIgKi8KLQllbmNvZGVkX2xlbiA9ICphdWRpb19sZW47Ci0JZW5jb2RlZCA9ICphdWRpb19idWY7Ci0JZnJlZWFibGUgPSAqYXVkaW9fYnVmOwotCSphdWRpb19sZW4gPSAoZW5jb2RlZF9sZW4vSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuYmxvY2thbGlnbikgKiAKLQkJCQlJTUFfQURQQ01fc3RhdGUud1NhbXBsZXNQZXJCbG9jayoKLQkJCQlJTUFfQURQQ01fc3RhdGUud2F2ZWZtdC5jaGFubmVscypzaXplb2YoU2ludDE2KTsKLQkqYXVkaW9fYnVmID0gKFVpbnQ4ICopU0RMX21hbGxvYygqYXVkaW9fbGVuKTsKLQlpZiAoICphdWRpb19idWYgPT0gTlVMTCApIHsKLQkJU0RMX0Vycm9yKFNETF9FTk9NRU0pOwotCQlyZXR1cm4oLTEpOwotCX0KLQlkZWNvZGVkID0gKmF1ZGlvX2J1ZjsKLQotCS8qIEdldCByZWFkeS4uLiBHbyEgKi8KLQl3aGlsZSAoIGVuY29kZWRfbGVuID49IElNQV9BRFBDTV9zdGF0ZS53YXZlZm10LmJsb2NrYWxpZ24gKSB7Ci0JCS8qIEdyYWIgdGhlIGluaXRpYWwgaW5mb3JtYXRpb24gZm9yIHRoaXMgYmxvY2sgKi8KLQkJZm9yICggYz0wOyBjPGNoYW5uZWxzOyArK2MgKSB7Ci0JCQkvKiBGaWxsIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBibG9jayAqLwotCQkJc3RhdGVbY10uc2FtcGxlID0gKChlbmNvZGVkWzFdPDw4KXxlbmNvZGVkWzBdKTsKLQkJCWVuY29kZWQgKz0gMjsKLQkJCWlmICggc3RhdGVbY10uc2FtcGxlICYgMHg4MDAwICkgewotCQkJCXN0YXRlW2NdLnNhbXBsZSAtPSAweDEwMDAwOwotCQkJfQotCQkJc3RhdGVbY10uaW5kZXggPSAqZW5jb2RlZCsrOwotCQkJLyogUmVzZXJ2ZWQgYnl0ZSBpbiBidWZmZXIgaGVhZGVyLCBzaG91bGQgYmUgMCAqLwotCQkJaWYgKCAqZW5jb2RlZCsrICE9IDAgKSB7Ci0JCQkJLyogVWggb2gsIGNvcnJ1cHQgZGF0YT8gIEJ1Z2d5IGNvZGU/ICovOwotCQkJfQotCi0JCQkvKiBTdG9yZSB0aGUgaW5pdGlhbCBzYW1wbGUgd2Ugc3RhcnQgd2l0aCAqLwotCQkJZGVjb2RlZFswXSA9IChVaW50OCkoc3RhdGVbY10uc2FtcGxlJjB4RkYpOwotCQkJZGVjb2RlZFsxXSA9IChVaW50OCkoc3RhdGVbY10uc2FtcGxlPj44KTsKLQkJCWRlY29kZWQgKz0gMjsKLQkJfQotCi0JCS8qIERlY29kZSBhbmQgc3RvcmUgdGhlIG90aGVyIHNhbXBsZXMgaW4gdGhpcyBibG9jayAqLwotCQlzYW1wbGVzbGVmdCA9IChJTUFfQURQQ01fc3RhdGUud1NhbXBsZXNQZXJCbG9jay0xKSpjaGFubmVsczsKLQkJd2hpbGUgKCBzYW1wbGVzbGVmdCA+IDAgKSB7Ci0JCQlmb3IgKCBjPTA7IGM8Y2hhbm5lbHM7ICsrYyApIHsKLQkJCQlGaWxsX0lNQV9BRFBDTV9ibG9jayhkZWNvZGVkLCBlbmNvZGVkLAotCQkJCQkJYywgY2hhbm5lbHMsICZzdGF0ZVtjXSk7Ci0JCQkJZW5jb2RlZCArPSA0OwotCQkJCXNhbXBsZXNsZWZ0IC09IDg7Ci0JCQl9Ci0JCQlkZWNvZGVkICs9IChjaGFubmVscyAqIDggKiAyKTsKLQkJfQotCQllbmNvZGVkX2xlbiAtPSBJTUFfQURQQ01fc3RhdGUud2F2ZWZtdC5ibG9ja2FsaWduOwotCX0KLQlTRExfZnJlZShmcmVlYWJsZSk7Ci0JcmV0dXJuKDApOwotfQotCi1TRExfQXVkaW9TcGVjICogU0RMX0xvYWRXQVZfUlcgKFNETF9SV29wcyAqc3JjLCBpbnQgZnJlZXNyYywKLQkJU0RMX0F1ZGlvU3BlYyAqc3BlYywgVWludDggKiphdWRpb19idWYsIFVpbnQzMiAqYXVkaW9fbGVuKQotewotCWludCB3YXNfZXJyb3I7Ci0JQ2h1bmsgY2h1bms7Ci0JaW50IGxlbnJlYWQ7Ci0JaW50IE1TX0FEUENNX2VuY29kZWQsIElNQV9BRFBDTV9lbmNvZGVkOwotCWludCBzYW1wbGVzaXplOwotCi0JLyogV0FWIG1hZ2ljIGhlYWRlciAqLwotCVVpbnQzMiBSSUZGY2h1bms7Ci0JVWludDMyIHdhdmVsZW4gPSAwOwotCVVpbnQzMiBXQVZFbWFnaWM7Ci0JVWludDMyIGhlYWRlckRpZmYgPSAwOwotCi0JLyogRk1UIGNodW5rICovCi0JV2F2ZUZNVCAqZm9ybWF0ID0gTlVMTDsKLQotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgcGFzc2VkIGEgdmFsaWQgZGF0YSBzb3VyY2UgKi8KLQl3YXNfZXJyb3IgPSAwOwotCWlmICggc3JjID09IE5VTEwgKSB7Ci0JCXdhc19lcnJvciA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JCQotCS8qIENoZWNrIHRoZSBtYWdpYyBoZWFkZXIgKi8KLQlSSUZGY2h1bmsJPSBTRExfUmVhZExFMzIoc3JjKTsKLQl3YXZlbGVuCQk9IFNETF9SZWFkTEUzMihzcmMpOwotCWlmICggd2F2ZWxlbiA9PSBXQVZFICkgeyAvKiBUaGUgUklGRmNodW5rIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCAqLwotCQlXQVZFbWFnaWMgPSB3YXZlbGVuOwotCQl3YXZlbGVuICAgPSBSSUZGY2h1bms7Ci0JCVJJRkZjaHVuayA9IFJJRkY7Ci0JfSBlbHNlIHsKLQkJV0FWRW1hZ2ljID0gU0RMX1JlYWRMRTMyKHNyYyk7Ci0JfQotCWlmICggKFJJRkZjaHVuayAhPSBSSUZGKSB8fCAoV0FWRW1hZ2ljICE9IFdBVkUpICkgewotCQlTRExfU2V0RXJyb3IoIlVucmVjb2duaXplZCBmaWxlIHR5cGUgKG5vdCBXQVZFKSIpOwotCQl3YXNfZXJyb3IgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWhlYWRlckRpZmYgKz0gc2l6ZW9mKFVpbnQzMik7IC8qIGZvciBXQVZFICovCi0KLQkvKiBSZWFkIHRoZSBhdWRpbyBkYXRhIGZvcm1hdCBjaHVuayAqLwotCWNodW5rLmRhdGEgPSBOVUxMOwotCWRvIHsKLQkJaWYgKCBjaHVuay5kYXRhICE9IE5VTEwgKSB7Ci0JCQlTRExfZnJlZShjaHVuay5kYXRhKTsKLQkJfQotCQlsZW5yZWFkID0gUmVhZENodW5rKHNyYywgJmNodW5rKTsKLQkJaWYgKCBsZW5yZWFkIDwgMCApIHsKLQkJCXdhc19lcnJvciA9IDE7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJLyogMiBVaW50MzIncyBmb3IgY2h1bmsgaGVhZGVyK2xlbiwgcGx1cyB0aGUgbGVucmVhZCAqLwotCQloZWFkZXJEaWZmICs9IGxlbnJlYWQgKyAyICogc2l6ZW9mKFVpbnQzMik7Ci0JfSB3aGlsZSAoIChjaHVuay5tYWdpYyA9PSBGQUNUKSB8fCAoY2h1bmsubWFnaWMgPT0gTElTVCkgKTsKLQotCS8qIERlY29kZSB0aGUgYXVkaW8gZGF0YSBmb3JtYXQgKi8KLQlmb3JtYXQgPSAoV2F2ZUZNVCAqKWNodW5rLmRhdGE7Ci0JaWYgKCBjaHVuay5tYWdpYyAhPSBGTVQgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ29tcGxleCBXQVZFIGZpbGVzIG5vdCBzdXBwb3J0ZWQiKTsKLQkJd2FzX2Vycm9yID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlNU19BRFBDTV9lbmNvZGVkID0gSU1BX0FEUENNX2VuY29kZWQgPSAwOwotCXN3aXRjaCAoU0RMX1N3YXBMRTE2KGZvcm1hdC0+ZW5jb2RpbmcpKSB7Ci0JCWNhc2UgUENNX0NPREU6Ci0JCQkvKiBXZSBjYW4gdW5kZXJzdGFuZCB0aGlzICovCi0JCQlicmVhazsKLQkJY2FzZSBNU19BRFBDTV9DT0RFOgotCQkJLyogVHJ5IHRvIHVuZGVyc3RhbmQgdGhpcyAqLwotCQkJaWYgKCBJbml0TVNfQURQQ00oZm9ybWF0KSA8IDAgKSB7Ci0JCQkJd2FzX2Vycm9yID0gMTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCQlNU19BRFBDTV9lbmNvZGVkID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIElNQV9BRFBDTV9DT0RFOgotCQkJLyogVHJ5IHRvIHVuZGVyc3RhbmQgdGhpcyAqLwotCQkJaWYgKCBJbml0SU1BX0FEUENNKGZvcm1hdCkgPCAwICkgewotCQkJCXdhc19lcnJvciA9IDE7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQkJSU1BX0FEUENNX2VuY29kZWQgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVAzX0NPREU6Ci0JCQlTRExfU2V0RXJyb3IoIk1QRUcgTGF5ZXIgMyBkYXRhIG5vdCBzdXBwb3J0ZWQiLAotCQkJCQlTRExfU3dhcExFMTYoZm9ybWF0LT5lbmNvZGluZykpOwotCQkJd2FzX2Vycm9yID0gMTsKLQkJCWdvdG8gZG9uZTsKLQkJZGVmYXVsdDoKLQkJCVNETF9TZXRFcnJvcigiVW5rbm93biBXQVZFIGRhdGEgZm9ybWF0OiAweCUuNHgiLAotCQkJCQlTRExfU3dhcExFMTYoZm9ybWF0LT5lbmNvZGluZykpOwotCQkJd2FzX2Vycm9yID0gMTsKLQkJCWdvdG8gZG9uZTsKLQl9Ci0JU0RMX21lbXNldChzcGVjLCAwLCAoc2l6ZW9mICpzcGVjKSk7Ci0Jc3BlYy0+ZnJlcSA9IFNETF9Td2FwTEUzMihmb3JtYXQtPmZyZXF1ZW5jeSk7Ci0Jc3dpdGNoIChTRExfU3dhcExFMTYoZm9ybWF0LT5iaXRzcGVyc2FtcGxlKSkgewotCQljYXNlIDQ6Ci0JCQlpZiAoIE1TX0FEUENNX2VuY29kZWQgfHwgSU1BX0FEUENNX2VuY29kZWQgKSB7Ci0JCQkJc3BlYy0+Zm9ybWF0ID0gQVVESU9fUzE2OwotCQkJfSBlbHNlIHsKLQkJCQl3YXNfZXJyb3IgPSAxOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgODoKLQkJCXNwZWMtPmZvcm1hdCA9IEFVRElPX1U4OwotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlzcGVjLT5mb3JtYXQgPSBBVURJT19TMTY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXdhc19lcnJvciA9IDE7Ci0JCQlicmVhazsKLQl9Ci0JaWYgKCB3YXNfZXJyb3IgKSB7Ci0JCVNETF9TZXRFcnJvcigiVW5rbm93biAlZC1iaXQgUENNIGRhdGEgZm9ybWF0IiwKLQkJCVNETF9Td2FwTEUxNihmb3JtYXQtPmJpdHNwZXJzYW1wbGUpKTsKLQkJZ290byBkb25lOwotCX0KLQlzcGVjLT5jaGFubmVscyA9IChVaW50OClTRExfU3dhcExFMTYoZm9ybWF0LT5jaGFubmVscyk7Ci0Jc3BlYy0+c2FtcGxlcyA9IDQwOTY7CQkvKiBHb29kIGRlZmF1bHQgYnVmZmVyIHNpemUgKi8KLQotCS8qIFJlYWQgdGhlIGF1ZGlvIGRhdGEgY2h1bmsgKi8KLQkqYXVkaW9fYnVmID0gTlVMTDsKLQlkbyB7Ci0JCWlmICggKmF1ZGlvX2J1ZiAhPSBOVUxMICkgewotCQkJU0RMX2ZyZWUoKmF1ZGlvX2J1Zik7Ci0JCX0KLQkJbGVucmVhZCA9IFJlYWRDaHVuayhzcmMsICZjaHVuayk7Ci0JCWlmICggbGVucmVhZCA8IDAgKSB7Ci0JCQl3YXNfZXJyb3IgPSAxOwotCQkJZ290byBkb25lOwotCQl9Ci0JCSphdWRpb19sZW4gPSBsZW5yZWFkOwotCQkqYXVkaW9fYnVmID0gY2h1bmsuZGF0YTsKLQkJaWYoY2h1bmsubWFnaWMgIT0gREFUQSkgaGVhZGVyRGlmZiArPSBsZW5yZWFkICsgMiAqIHNpemVvZihVaW50MzIpOwotCX0gd2hpbGUgKCBjaHVuay5tYWdpYyAhPSBEQVRBICk7Ci0JaGVhZGVyRGlmZiArPSAyICogc2l6ZW9mKFVpbnQzMik7IC8qIGZvciB0aGUgZGF0YSBjaHVuayBhbmQgbGVuICovCi0KLQlpZiAoIE1TX0FEUENNX2VuY29kZWQgKSB7Ci0JCWlmICggTVNfQURQQ01fZGVjb2RlKGF1ZGlvX2J1ZiwgYXVkaW9fbGVuKSA8IDAgKSB7Ci0JCQl3YXNfZXJyb3IgPSAxOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCWlmICggSU1BX0FEUENNX2VuY29kZWQgKSB7Ci0JCWlmICggSU1BX0FEUENNX2RlY29kZShhdWRpb19idWYsIGF1ZGlvX2xlbikgPCAwICkgewotCQkJd2FzX2Vycm9yID0gMTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCS8qIERvbid0IHJldHVybiBhIGJ1ZmZlciB0aGF0IGlzbid0IGEgbXVsdGlwbGUgb2Ygc2FtcGxlc2l6ZSAqLwotCXNhbXBsZXNpemUgPSAoKHNwZWMtPmZvcm1hdCAmIDB4RkYpLzgpKnNwZWMtPmNoYW5uZWxzOwotCSphdWRpb19sZW4gJj0gfihzYW1wbGVzaXplLTEpOwotCi1kb25lOgotCWlmICggZm9ybWF0ICE9IE5VTEwgKSB7Ci0JCVNETF9mcmVlKGZvcm1hdCk7Ci0JfQotCWlmICggc3JjICkgewotCQlpZiAoIGZyZWVzcmMgKSB7Ci0JCQlTRExfUldjbG9zZShzcmMpOwotCQl9IGVsc2UgewotCQkJLyogc2VlayB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIChnaXZlbiBieSB0aGUgUklGRiBjaHVuaykgKi8KLQkJCVNETF9SV3NlZWsoc3JjLCB3YXZlbGVuIC0gY2h1bmsubGVuZ3RoIC0gaGVhZGVyRGlmZiwgUldfU0VFS19DVVIpOwotCQl9Ci0JfQotCWlmICggd2FzX2Vycm9yICkgewotCQlzcGVjID0gTlVMTDsKLQl9Ci0JcmV0dXJuKHNwZWMpOwotfQotCi0vKiBTaW5jZSB0aGUgV0FWIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBpdCBtdXN0IGFsc28KLSAgIGJlIGZyZWVkIGhlcmUuICAoTmVjZXNzYXJ5IHVuZGVyIFdpbjMyLCBWQysrKQotICovCi12b2lkIFNETF9GcmVlV0FWKFVpbnQ4ICphdWRpb19idWYpCi17Ci0JaWYgKCBhdWRpb19idWYgIT0gTlVMTCApIHsKLQkJU0RMX2ZyZWUoYXVkaW9fYnVmKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgUmVhZENodW5rKFNETF9SV29wcyAqc3JjLCBDaHVuayAqY2h1bmspCi17Ci0JY2h1bmstPm1hZ2ljCT0gU0RMX1JlYWRMRTMyKHNyYyk7Ci0JY2h1bmstPmxlbmd0aAk9IFNETF9SZWFkTEUzMihzcmMpOwotCWNodW5rLT5kYXRhID0gKFVpbnQ4ICopU0RMX21hbGxvYyhjaHVuay0+bGVuZ3RoKTsKLQlpZiAoIGNodW5rLT5kYXRhID09IE5VTEwgKSB7Ci0JCVNETF9FcnJvcihTRExfRU5PTUVNKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JaWYgKCBTRExfUldyZWFkKHNyYywgY2h1bmstPmRhdGEsIGNodW5rLT5sZW5ndGgsIDEpICE9IDEgKSB7Ci0JCVNETF9FcnJvcihTRExfRUZSRUFEKTsKLQkJU0RMX2ZyZWUoY2h1bmstPmRhdGEpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oY2h1bmstPmxlbmd0aCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF93YXZlLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL1NETF93YXZlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYWY2ZWIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9TRExfd2F2ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBTRExfZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBXQVZFIGZpbGVzIGFyZSBsaXR0bGUtZW5kaWFuICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGVmaW5lIHZhbHVlcyBmb3IgTWljcm9zb2Z0IFdBVkUgZm9ybWF0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUklGRgkJMHg0NjQ2NDk1MgkJLyogIlJJRkYiICovCi0jZGVmaW5lIFdBVkUJCTB4NDU1NjQxNTcJCS8qICJXQVZFIiAqLwotI2RlZmluZSBGQUNUCQkweDc0NjM2MTY2CQkvKiAiZmFjdCIgKi8KLSNkZWZpbmUgTElTVAkJMHg1NDUzNDk0YwkJLyogIkxJU1QiICovCi0jZGVmaW5lIEZNVAkJMHgyMDc0NkQ2NgkJLyogImZtdCAiICovCi0jZGVmaW5lIERBVEEJCTB4NjE3NDYxNjQJCS8qICJkYXRhIiAqLwotI2RlZmluZSBQQ01fQ09ERQkweDAwMDEKLSNkZWZpbmUgTVNfQURQQ01fQ09ERQkweDAwMDIKLSNkZWZpbmUgSU1BX0FEUENNX0NPREUJMHgwMDExCi0jZGVmaW5lIE1QM19DT0RFCTB4MDA1NQotI2RlZmluZSBXQVZFX01PTk8JMQotI2RlZmluZSBXQVZFX1NURVJFTwkyCi0KLS8qIE5vcm1hbGx5LCB0aGVzZSB0aHJlZSBjaHVua3MgY29tZSBjb25zZWN1dGl2ZWx5IGluIGEgV0FWRSBmaWxlICovCi10eXBlZGVmIHN0cnVjdCBXYXZlRk1UIHsKLS8qIE5vdCBzYXZlZCBpbiB0aGUgY2h1bmsgd2UgcmVhZDoKLQlVaW50MzIJRk1UY2h1bms7Ci0JVWludDMyCWZtdGxlbjsKLSovCi0JVWludDE2CWVuY29kaW5nOwkKLQlVaW50MTYJY2hhbm5lbHM7CQkvKiAxID0gbW9ubywgMiA9IHN0ZXJlbyAqLwotCVVpbnQzMglmcmVxdWVuY3k7CQkvKiBPbmUgb2YgMTEwMjUsIDIyMDUwLCBvciA0NDEwMCBIeiAqLwotCVVpbnQzMglieXRlcmF0ZTsJCS8qIEF2ZXJhZ2UgYnl0ZXMgcGVyIHNlY29uZCAqLwotCVVpbnQxNglibG9ja2FsaWduOwkJLyogQnl0ZXMgcGVyIHNhbXBsZSBibG9jayAqLwotCVVpbnQxNgliaXRzcGVyc2FtcGxlOwkJLyogT25lIG9mIDgsIDEyLCAxNiwgb3IgNCBmb3IgQURQQ00gKi8KLX0gV2F2ZUZNVDsKLQotLyogVGhlIGdlbmVyYWwgY2h1bmsgZm91bmQgaW4gdGhlIFdBVkUgZmlsZSAqLwotdHlwZWRlZiBzdHJ1Y3QgQ2h1bmsgewotCVVpbnQzMiBtYWdpYzsKLQlVaW50MzIgbGVuZ3RoOwotCVVpbnQ4ICpkYXRhOwotfSBDaHVuazsKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9hbHNhL1NETF9hbHNhX2F1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2Fsc2EvU0RMX2Fsc2FfYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxMzhkMS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2Fsc2EvU0RMX2Fsc2FfYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogQWxsb3cgYWNjZXNzIHRvIGEgcmF3IG1peGluZyBidWZmZXIgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgkvKiBGb3Iga2lsbCgpICovCi0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIlNETF9hbHNhX2F1ZGlvLmgiCi0KLSNpZmRlZiBTRExfQVVESU9fRFJJVkVSX0FMU0FfRFlOQU1JQwotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSAiU0RMX25hbWUuaCIKLSNpbmNsdWRlICJTRExfbG9hZHNvLmgiCi0jZWxzZQotI2RlZmluZSBTRExfTkFNRShYKQlYCi0jZW5kaWYKLQotCi0vKiBUaGUgdGFnIG5hbWUgdXNlZCBieSBBTFNBIGF1ZGlvICovCi0jZGVmaW5lIERSSVZFUl9OQU1FICAgICAgICAgImFsc2EiCi0KLS8qIFRoZSBkZWZhdWx0IEFMU0EgYXVkaW8gZHJpdmVyICovCi0jZGVmaW5lIERFRkFVTFRfREVWSUNFCSJkZWZhdWx0IgotCi0vKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IEFMU0FfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIEFMU0FfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIEFMU0FfUGxheUF1ZGlvKF9USElTKTsKLXN0YXRpYyBVaW50OCAqQUxTQV9HZXRBdWRpb0J1ZihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBBTFNBX0Nsb3NlQXVkaW8oX1RISVMpOwotCi0jaWZkZWYgU0RMX0FVRElPX0RSSVZFUl9BTFNBX0RZTkFNSUMKLQotc3RhdGljIGNvbnN0IGNoYXIgKmFsc2FfbGlicmFyeSA9IFNETF9BVURJT19EUklWRVJfQUxTQV9EWU5BTUlDOwotc3RhdGljIHZvaWQgKmFsc2FfaGFuZGxlID0gTlVMTDsKLXN0YXRpYyBpbnQgYWxzYV9sb2FkZWQgPSAwOwotCi1zdGF0aWMgaW50ICgqU0RMX3NuZF9wY21fb3Blbikoc25kX3BjbV90ICoqcGNtLCBjb25zdCBjaGFyICpuYW1lLCBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOwotc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21fb3BlbikpKHNuZF9wY21fdCAqKnBjbSwgY29uc3QgY2hhciAqbmFtZSwgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKLXN0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2Nsb3NlKSkoc25kX3BjbV90ICpwY20pOwotc3RhdGljIHNuZF9wY21fc2ZyYW1lc190ICgqU0RMX05BTUUoc25kX3BjbV93cml0ZWkpKShzbmRfcGNtX3QgKnBjbSwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKLXN0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX3Jlc3VtZSkpKHNuZF9wY21fdCAqcGNtKTsKLXN0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX3ByZXBhcmUpKShzbmRfcGNtX3QgKnBjbSk7Ci1zdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9kcmFpbikpKHNuZF9wY21fdCAqcGNtKTsKLXN0YXRpYyBjb25zdCBjaGFyICooKlNETF9OQU1FKHNuZF9zdHJlcnJvcikpKGludCBlcnJudW0pOwotc3RhdGljIHNpemVfdCAoKlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NpemVvZikpKHZvaWQpOwotc3RhdGljIHNpemVfdCAoKlNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX3NpemVvZikpKHZvaWQpOwotc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2FueSkpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOwotc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MpKShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc190IGFjY2Vzcyk7Ci1zdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdCkpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKLXN0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHMpKShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKLXN0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHMpKShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOwotc3RhdGljIHVuc2lnbmVkIGludCAoKlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX25lYXIpKShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgKmRpcik7Ci1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhcikpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCwgaW50ICpkaXIpOwotc3RhdGljIHNuZF9wY21fc2ZyYW1lc190ICgqU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplKSkoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19uZWFyKSkoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50ICpkaXIpOwotc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzKSkoc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKLXN0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtcykpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOwotLyoKLSovCi1zdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXNfY3VycmVudCkpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpzd3BhcmFtcyk7Ci1zdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZCkpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7Ci1zdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXNfc2V0X2F2YWlsX21pbikpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7Ci1zdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXMpKShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKLXN0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX25vbmJsb2NrKSkoc25kX3BjbV90ICpwY20sIGludCBub25ibG9jayk7Ci0jZGVmaW5lIHNuZF9wY21faHdfcGFyYW1zX3NpemVvZiBTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zaXplb2YpCi0jZGVmaW5lIHNuZF9wY21fc3dfcGFyYW1zX3NpemVvZiBTRExfTkFNRShzbmRfcGNtX3N3X3BhcmFtc19zaXplb2YpCi0KLS8qIGNhc3QgZnVuY3MgdG8gY2hhciogZmlyc3QsIHRvIHBsZWFzZSBHQ0MncyBzdHJpY3QgYWxpYXNpbmcgcnVsZXMuICovCi1zdGF0aWMgc3RydWN0IHsKLQljb25zdCBjaGFyICpuYW1lOwotCXZvaWQgKipmdW5jOwotfSBhbHNhX2Z1bmN0aW9uc1tdID0gewotCXsgInNuZF9wY21fb3BlbiIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX29wZW4pCQl9LAotCXsgInNuZF9wY21fY2xvc2UiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9jbG9zZSkJfSwKLQl7ICJzbmRfcGNtX3dyaXRlaSIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX3dyaXRlaSkJfSwKLQl7ICJzbmRfcGNtX3Jlc3VtZSIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX3Jlc3VtZSkJfSwKLQl7ICJzbmRfcGNtX3ByZXBhcmUiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9wcmVwYXJlKQl9LAotCXsgInNuZF9wY21fZHJhaW4iLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9kcmFpbikJfSwKLQl7ICJzbmRfc3RyZXJyb3IiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3N0cmVycm9yKQkJfSwKLQl7ICJzbmRfcGNtX2h3X3BhcmFtc19zaXplb2YiLAkJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NpemVvZikJCX0sCi0JeyAic25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mIiwJCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX3N3X3BhcmFtc19zaXplb2YpCQl9LAotCXsgInNuZF9wY21faHdfcGFyYW1zX2FueSIsCQkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfYW55KQkJfSwKLQl7ICJzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MpCQl9LAotCXsgInNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXQiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdCkJCX0sCi0JeyAic25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVscykJfSwKLQl7ICJzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHMiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzKQl9LAotCXsgInNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX25lYXIiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhcikJfSwKLQl7ICJzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhciIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhcikJfSwKLQl7ICJzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemUiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplKQl9LAotCXsgInNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX25lYXIiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbmVhcikJfSwKLQl7ICJzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kcyIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kcykJfSwKLQl7ICJzbmRfcGNtX2h3X3BhcmFtcyIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtcykJfSwKLQl7ICJzbmRfcGNtX3N3X3BhcmFtc19jdXJyZW50IiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX2N1cnJlbnQpCX0sCi0JeyAic25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZCIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfdGhyZXNob2xkKQl9LAotCXsgInNuZF9wY21fc3dfcGFyYW1zX3NldF9hdmFpbF9taW4iLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXNfc2V0X2F2YWlsX21pbikJfSwKLQl7ICJzbmRfcGNtX3N3X3BhcmFtcyIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX3N3X3BhcmFtcykJfSwKLQl7ICJzbmRfcGNtX25vbmJsb2NrIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21fbm9uYmxvY2spCX0sCi19OwotCi1zdGF0aWMgdm9pZCBVbmxvYWRBTFNBTGlicmFyeSh2b2lkKSB7Ci0JaWYgKGFsc2FfbG9hZGVkKSB7Ci0vKgkJU0RMX1VubG9hZE9iamVjdChhbHNhX2hhbmRsZSk7Ki8KLQkJZGxjbG9zZShhbHNhX2hhbmRsZSk7Ci0JCWFsc2FfaGFuZGxlID0gTlVMTDsKLQkJYWxzYV9sb2FkZWQgPSAwOwotCX0KLX0KLQotc3RhdGljIGludCBMb2FkQUxTQUxpYnJhcnkodm9pZCkgewotCWludCBpLCByZXR2YWwgPSAtMTsKLQotLyoJYWxzYV9oYW5kbGUgPSBTRExfTG9hZE9iamVjdChhbHNhX2xpYnJhcnkpOyovCi0JYWxzYV9oYW5kbGUgPSBkbG9wZW4oYWxzYV9saWJyYXJ5LFJUTERfTk9XKTsKLQlpZiAoYWxzYV9oYW5kbGUpIHsKLQkJYWxzYV9sb2FkZWQgPSAxOwotCQlyZXR2YWwgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgU0RMX2FycmF5c2l6ZShhbHNhX2Z1bmN0aW9ucyk7IGkrKykgewotLyoJCQkqYWxzYV9mdW5jdGlvbnNbaV0uZnVuYyA9IFNETF9Mb2FkRnVuY3Rpb24oYWxzYV9oYW5kbGUsYWxzYV9mdW5jdGlvbnNbaV0ubmFtZSk7Ki8KLSNpZiBIQVZFX0RMVlNZTQotCQkJKmFsc2FfZnVuY3Rpb25zW2ldLmZ1bmMgPSBkbHZzeW0oYWxzYV9oYW5kbGUsYWxzYV9mdW5jdGlvbnNbaV0ubmFtZSwiQUxTQV8wLjkiKTsKLQkJCWlmICghKmFsc2FfZnVuY3Rpb25zW2ldLmZ1bmMpCi0jZW5kaWYKLQkJCQkqYWxzYV9mdW5jdGlvbnNbaV0uZnVuYyA9IGRsc3ltKGFsc2FfaGFuZGxlLGFsc2FfZnVuY3Rpb25zW2ldLm5hbWUpOwotCQkJaWYgKCEqYWxzYV9mdW5jdGlvbnNbaV0uZnVuYykgewotCQkJCXJldHZhbCA9IC0xOwotCQkJCVVubG9hZEFMU0FMaWJyYXJ5KCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotI2Vsc2UKLQotc3RhdGljIHZvaWQgVW5sb2FkQUxTQUxpYnJhcnkodm9pZCkgewotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBMb2FkQUxTQUxpYnJhcnkodm9pZCkgewotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogU0RMX0FVRElPX0RSSVZFUl9BTFNBX0RZTkFNSUMgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmdldF9hdWRpb19kZXZpY2UoaW50IGNoYW5uZWxzKQotewotCWNvbnN0IGNoYXIgKmRldmljZTsKLQkKLQlkZXZpY2UgPSBTRExfZ2V0ZW52KCJBVURJT0RFViIpOwkvKiBJcyB0aGVyZSBhIHN0YW5kYXJkIHZhcmlhYmxlIG5hbWU/ICovCi0JaWYgKCBkZXZpY2UgPT0gTlVMTCApIHsKLQkJaWYgKGNoYW5uZWxzID09IDYpIGRldmljZSA9ICJzdXJyb3VuZDUxIjsKLQkJZWxzZSBpZiAoY2hhbm5lbHMgPT0gNCkgZGV2aWNlID0gInN1cnJvdW5kNDAiOwotCQllbHNlIGRldmljZSA9IERFRkFVTFRfREVWSUNFOwotCX0KLQlyZXR1cm4gZGV2aWNlOwotfQotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotCWludCBhdmFpbGFibGU7Ci0JaW50IHN0YXR1czsKLQlzbmRfcGNtX3QgKmhhbmRsZTsKLQotCWF2YWlsYWJsZSA9IDA7Ci0JaWYgKExvYWRBTFNBTGlicmFyeSgpIDwgMCkgewotCQlyZXR1cm4gYXZhaWxhYmxlOwotCX0KLQlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX29wZW4pKCZoYW5kbGUsIGdldF9hdWRpb19kZXZpY2UoMiksIFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLLCBTTkRfUENNX05PTkJMT0NLKTsKLQlpZiAoIHN0YXR1cyA+PSAwICkgewotCQlhdmFpbGFibGUgPSAxOwotICAgICAgICAJU0RMX05BTUUoc25kX3BjbV9jbG9zZSkoaGFuZGxlKTsKLQl9Ci0JVW5sb2FkQUxTQUxpYnJhcnkoKTsKLQlyZXR1cm4oYXZhaWxhYmxlKTsKLX0KLQotc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotCVVubG9hZEFMU0FMaWJyYXJ5KCk7Ci19Ci0KLXN0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlMb2FkQUxTQUxpYnJhcnkoKTsKLQl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotCWlmICggdGhpcyApIHsKLQkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0JCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCX0KLQlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIHRoaXMgKSB7Ci0JCQlTRExfZnJlZSh0aGlzKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQl0aGlzLT5PcGVuQXVkaW8gPSBBTFNBX09wZW5BdWRpbzsKLQl0aGlzLT5XYWl0QXVkaW8gPSBBTFNBX1dhaXRBdWRpbzsKLQl0aGlzLT5QbGF5QXVkaW8gPSBBTFNBX1BsYXlBdWRpbzsKLQl0aGlzLT5HZXRBdWRpb0J1ZiA9IEFMU0FfR2V0QXVkaW9CdWY7Ci0JdGhpcy0+Q2xvc2VBdWRpbyA9IEFMU0FfQ2xvc2VBdWRpbzsKLQotCXRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7Ci0KLQlyZXR1cm4gdGhpczsKLX0KLQotQXVkaW9Cb290U3RyYXAgQUxTQV9ib290c3RyYXAgPSB7Ci0JRFJJVkVSX05BTUUsICJBTFNBIDAuOSBQQ00gYXVkaW8iLAotCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KLXN0YXRpYyB2b2lkIEFMU0FfV2FpdEF1ZGlvKF9USElTKQotewotCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdGhyZWFkLXBhcmVudCBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlICovCi0JeyBzdGF0aWMgaW50IGNudCA9IDA7Ci0JCS8qIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2l0aCB0aHJlYWQgaW1wbGVtZW50YXRpb25zIAotCQkgICB0aGF0IHVzZSBhIGRpZmZlcmVudCBwcm9jZXNzIGlkIGZvciBlYWNoIHRocmVhZC4KLQkJKi8KLQkJaWYgKHBhcmVudCAmJiAoKCgrK2NudCklMTApID09IDApKSB7IC8qIENoZWNrIGV2ZXJ5IDEwIGxvb3BzICovCi0JCQlpZiAoIGtpbGwocGFyZW50LCAwKSA8IDAgKSB7Ci0JCQkJdGhpcy0+ZW5hYmxlZCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLSAqIGh0dHA6Ly9idWd6aWxsYS5saWJzZGwub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTAKLSAqICJGb3IgTGludXggQUxTQSwgdGhpcyBpcyBGTC1GUi1STC1SUi1DLUxGRQotICogIGFuZCBmb3IgV2luZG93cyBEaXJlY3RYIFthbmQgQ29yZUF1ZGlvXSwgdGhpcyBpcyBGTC1GUi1DLUxGRS1STC1SUiIKLSAqLwotI2RlZmluZSBTV0laNihUKSBcCi0gICAgVCAqcHRyID0gKFQgKikgbWl4YnVmOyBcCi0gICAgY29uc3QgVWludDMyIGNvdW50ID0gKHRoaXMtPnNwZWMuc2FtcGxlcyAvIDYpOyBcCi0gICAgVWludDMyIGk7IFwKLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcHRyICs9IDYpIHsgXAotICAgICAgICBUIHRtcDsgXAotICAgICAgICB0bXAgPSBwdHJbMl07IHB0clsyXSA9IHB0cls0XTsgcHRyWzRdID0gdG1wOyBcCi0gICAgICAgIHRtcCA9IHB0clszXTsgcHRyWzNdID0gcHRyWzVdOyBwdHJbNV0gPSB0bXA7IFwKLSAgICB9Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3dpenpsZV9hbHNhX2NoYW5uZWxzXzZfNjRiaXQoX1RISVMpIHsgU1dJWjYoVWludDY0KTsgfQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzd2l6emxlX2Fsc2FfY2hhbm5lbHNfNl8zMmJpdChfVEhJUykgeyBTV0laNihVaW50MzIpOyB9Ci1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN3aXp6bGVfYWxzYV9jaGFubmVsc182XzE2Yml0KF9USElTKSB7IFNXSVo2KFVpbnQxNik7IH0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3dpenpsZV9hbHNhX2NoYW5uZWxzXzZfOGJpdChfVEhJUykgeyBTV0laNihVaW50OCk7IH0KLQotI3VuZGVmIFNXSVo2Ci0KLQotLyoKLSAqIENhbGxlZCByaWdodCBiZWZvcmUgZmVlZGluZyB0aGlzLT5taXhidWYgdG8gdGhlIGhhcmR3YXJlLiBTd2l6emxlIGNoYW5uZWxzCi0gKiAgZnJvbSBXaW5kb3dzL01hYyBvcmRlciB0byB0aGUgZm9ybWF0IGFsc2FsaWIgd2lsbCB3YW50LgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN3aXp6bGVfYWxzYV9jaGFubmVscyhfVEhJUykKLXsKLSAgICBpZiAodGhpcy0+c3BlYy5jaGFubmVscyA9PSA2KSB7Ci0gICAgICAgIGNvbnN0IFVpbnQxNiBmbXRzaXplID0gKHRoaXMtPnNwZWMuZm9ybWF0ICYgMHhGRik7IC8qIGJpdHMvY2hhbm5lbC4gKi8KLSAgICAgICAgaWYgKGZtdHNpemUgPT0gMTYpCi0gICAgICAgICAgICBzd2l6emxlX2Fsc2FfY2hhbm5lbHNfNl8xNmJpdCh0aGlzKTsKLSAgICAgICAgZWxzZSBpZiAoZm10c2l6ZSA9PSA4KQotICAgICAgICAgICAgc3dpenpsZV9hbHNhX2NoYW5uZWxzXzZfOGJpdCh0aGlzKTsKLSAgICAgICAgZWxzZSBpZiAoZm10c2l6ZSA9PSAzMikKLSAgICAgICAgICAgIHN3aXp6bGVfYWxzYV9jaGFubmVsc182XzMyYml0KHRoaXMpOwotICAgICAgICBlbHNlIGlmIChmbXRzaXplID09IDY0KQotICAgICAgICAgICAgc3dpenpsZV9hbHNhX2NoYW5uZWxzXzZfNjRiaXQodGhpcyk7Ci0gICAgfQotCi0gICAgLyogISEhIEZJWE1FOiB1cGRhdGUgdGhpcyBmb3IgNy4xIGlmIG5lZWRlZCwgbGF0ZXIuICovCi19Ci0KLQotc3RhdGljIHZvaWQgQUxTQV9QbGF5QXVkaW8oX1RISVMpCi17Ci0JaW50ICAgICAgICAgICBzdGF0dXM7Ci0JaW50ICAgICAgICAgICBzYW1wbGVfbGVuOwotCXNpZ25lZCBzaG9ydCAqc2FtcGxlX2J1ZjsKLQotCXN3aXp6bGVfYWxzYV9jaGFubmVscyh0aGlzKTsKLQotCXNhbXBsZV9sZW4gPSB0aGlzLT5zcGVjLnNhbXBsZXM7Ci0Jc2FtcGxlX2J1ZiA9IChzaWduZWQgc2hvcnQgKiltaXhidWY7Ci0KLQl3aGlsZSAoIHNhbXBsZV9sZW4gPiAwICkgewotCQlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX3dyaXRlaSkocGNtX2hhbmRsZSwgc2FtcGxlX2J1Ziwgc2FtcGxlX2xlbik7Ci0JCWlmICggc3RhdHVzIDwgMCApIHsKLQkJCWlmICggc3RhdHVzID09IC1FQUdBSU4gKSB7Ci0JCQkJU0RMX0RlbGF5KDEpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKCBzdGF0dXMgPT0gLUVTVFJQSVBFICkgewotCQkJCWRvIHsKLQkJCQkJU0RMX0RlbGF5KDEpOwotCQkJCQlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX3Jlc3VtZSkocGNtX2hhbmRsZSk7Ci0JCQkJfSB3aGlsZSAoIHN0YXR1cyA9PSAtRUFHQUlOICk7Ci0JCQl9Ci0JCQlpZiAoIHN0YXR1cyA8IDAgKSB7Ci0JCQkJc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9wcmVwYXJlKShwY21faGFuZGxlKTsKLQkJCX0KLQkJCWlmICggc3RhdHVzIDwgMCApIHsKLQkJCQkvKiBIbW0sIG5vdCBtdWNoIHdlIGNhbiBkbyAtIGFib3J0ICovCi0JCQkJdGhpcy0+ZW5hYmxlZCA9IDA7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJc2FtcGxlX2J1ZiArPSBzdGF0dXMgKiB0aGlzLT5zcGVjLmNoYW5uZWxzOwotCQlzYW1wbGVfbGVuIC09IHN0YXR1czsKLQl9Ci19Ci0KLXN0YXRpYyBVaW50OCAqQUxTQV9HZXRBdWRpb0J1ZihfVEhJUykKLXsKLQlyZXR1cm4obWl4YnVmKTsKLX0KLQotc3RhdGljIHZvaWQgQUxTQV9DbG9zZUF1ZGlvKF9USElTKQotewotCWlmICggbWl4YnVmICE9IE5VTEwgKSB7Ci0JCVNETF9GcmVlQXVkaW9NZW0obWl4YnVmKTsKLQkJbWl4YnVmID0gTlVMTDsKLQl9Ci0JaWYgKCBwY21faGFuZGxlICkgewotCQlTRExfTkFNRShzbmRfcGNtX2RyYWluKShwY21faGFuZGxlKTsKLQkJU0RMX05BTUUoc25kX3BjbV9jbG9zZSkocGNtX2hhbmRsZSk7Ci0JCXBjbV9oYW5kbGUgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIGludCBBTFNBX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQlpbnQgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc25kX3BjbV9od19wYXJhbXNfdCAqaHdwYXJhbXM7Ci0Jc25kX3BjbV9zd19wYXJhbXNfdCAqc3dwYXJhbXM7Ci0Jc25kX3BjbV9mb3JtYXRfdCAgICAgZm9ybWF0OwotCXNuZF9wY21fdWZyYW1lc190ICAgIGZyYW1lczsKLQlVaW50MTYgICAgICAgICAgICAgICB0ZXN0X2Zvcm1hdDsKLQotCS8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLwotCS8qIE5hbWUgb2YgZGV2aWNlIHNob3VsZCBkZXBlbmQgb24gIyBjaGFubmVscyBpbiBzcGVjICovCi0Jc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9vcGVuKSgmcGNtX2hhbmRsZSwgZ2V0X2F1ZGlvX2RldmljZShzcGVjLT5jaGFubmVscyksIFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLLCBTTkRfUENNX05PTkJMT0NLKTsKLQotCWlmICggc3RhdHVzIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuIGF1ZGlvIGRldmljZTogJXMiLCBTRExfTkFNRShzbmRfc3RyZXJyb3IpKHN0YXR1cykpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIEZpZ3VyZSBvdXQgd2hhdCB0aGUgaGFyZHdhcmUgaXMgY2FwYWJsZSBvZiAqLwotCXNuZF9wY21faHdfcGFyYW1zX2FsbG9jYSgmaHdwYXJhbXMpOwotCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2FueSkocGNtX2hhbmRsZSwgaHdwYXJhbXMpOwotCWlmICggc3RhdHVzIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBnZXQgaGFyZHdhcmUgY29uZmlnOiAlcyIsIFNETF9OQU1FKHNuZF9zdHJlcnJvcikoc3RhdHVzKSk7Ci0JCUFMU0FfQ2xvc2VBdWRpbyh0aGlzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTREwgb25seSB1c2VzIGludGVybGVhdmVkIHNhbXBsZSBvdXRwdXQgKi8KLQlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzKShwY21faGFuZGxlLCBod3BhcmFtcywgU05EX1BDTV9BQ0NFU1NfUldfSU5URVJMRUFWRUQpOwotCWlmICggc3RhdHVzIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgaW50ZXJsZWF2ZWQgYWNjZXNzOiAlcyIsIFNETF9OQU1FKHNuZF9zdHJlcnJvcikoc3RhdHVzKSk7Ci0JCUFMU0FfQ2xvc2VBdWRpbyh0aGlzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBUcnkgZm9yIGEgY2xvc2VzdCBtYXRjaCBvbiBhdWRpbyBmb3JtYXQgKi8KLQlzdGF0dXMgPSAtMTsKLQlmb3IgKCB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7Ci0JICAgICAgdGVzdF9mb3JtYXQgJiYgKHN0YXR1cyA8IDApOyApIHsKLQkJc3dpdGNoICggdGVzdF9mb3JtYXQgKSB7Ci0JCQljYXNlIEFVRElPX1U4OgotCQkJCWZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1U4OwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURJT19TODoKLQkJCQlmb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9TODsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fUzE2TFNCOgotCQkJCWZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1MxNl9MRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fUzE2TVNCOgotCQkJCWZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1MxNl9CRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fVTE2TFNCOgotCQkJCWZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1UxNl9MRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fVTE2TVNCOgotCQkJCWZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1UxNl9CRTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZm9ybWF0ID0gMDsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoIGZvcm1hdCAhPSAwICkgewotCQkJc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdCkocGNtX2hhbmRsZSwgaHdwYXJhbXMsIGZvcm1hdCk7Ci0JCX0KLQkJaWYgKCBzdGF0dXMgPCAwICkgewotCQkJdGVzdF9mb3JtYXQgPSBTRExfTmV4dEF1ZGlvRm9ybWF0KCk7Ci0JCX0KLQl9Ci0JaWYgKCBzdGF0dXMgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHMiKTsKLQkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlzcGVjLT5mb3JtYXQgPSB0ZXN0X2Zvcm1hdDsKLQotCS8qIFNldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0Jc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzKShwY21faGFuZGxlLCBod3BhcmFtcywgc3BlYy0+Y2hhbm5lbHMpOwotCWlmICggc3RhdHVzIDwgMCApIHsKLQkJc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzKShod3BhcmFtcyk7Ci0JCWlmICggKHN0YXR1cyA8PSAwKSB8fCAoc3RhdHVzID4gMikgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBjaGFubmVscyIpOwotCQkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQlzcGVjLT5jaGFubmVscyA9IHN0YXR1czsKLQl9Ci0KLQkvKiBTZXQgdGhlIGF1ZGlvIHJhdGUgKi8KLQlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyKShwY21faGFuZGxlLCBod3BhcmFtcywgc3BlYy0+ZnJlcSwgTlVMTCk7Ci0JaWYgKCBzdGF0dXMgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmcmVxdWVuY3k6ICVzIiwgU0RMX05BTUUoc25kX3N0cmVycm9yKShzdGF0dXMpKTsKLQkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlzcGVjLT5mcmVxID0gc3RhdHVzOwotCi0JLyogU2V0IHRoZSBidWZmZXIgc2l6ZSwgaW4gc2FtcGxlcyAqLwotCWZyYW1lcyA9IHNwZWMtPnNhbXBsZXM7Ci0JZnJhbWVzID0gU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIpKHBjbV9oYW5kbGUsIGh3cGFyYW1zLCBmcmFtZXMsIE5VTEwpOwotCXNwZWMtPnNhbXBsZXMgPSBmcmFtZXM7Ci0JU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbmVhcikocGNtX2hhbmRsZSwgaHdwYXJhbXMsIDIsIE5VTEwpOwotCi0JLyogInNldCIgdGhlIGhhcmR3YXJlIHdpdGggdGhlIGRlc2lyZWQgcGFyYW1ldGVycyAqLwotCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zKShwY21faGFuZGxlLCBod3BhcmFtcyk7Ci0JaWYgKCBzdGF0dXMgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBoYXJkd2FyZSBhdWRpbyBwYXJhbWV0ZXJzOiAlcyIsIFNETF9OQU1FKHNuZF9zdHJlcnJvcikoc3RhdHVzKSk7Ci0JCUFMU0FfQ2xvc2VBdWRpbyh0aGlzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLS8qIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuLi4gKi8KLS8qCi17IHNuZF9wY21fc2ZyYW1lc190IGJ1ZnNpemU7IGludCBmcmFnbWVudHM7Ci0gICBidWZzaXplID0gU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplKShod3BhcmFtcyk7Ci0gICBmcmFnbWVudHMgPSBTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kcykoaHdwYXJhbXMpOwotCi0gICBmcHJpbnRmKHN0ZGVyciwgIkFMU0E6IGJ1ZnNpemUgPSAlbGQsIGZyYWdtZW50cyA9ICVkXG4iLCBidWZzaXplLCBmcmFnbWVudHMpOwotfQotKi8KLQotCS8qIFNldCB0aGUgc29mdHdhcmUgcGFyYW1ldGVycyAqLwotCXNuZF9wY21fc3dfcGFyYW1zX2FsbG9jYSgmc3dwYXJhbXMpOwotCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX2N1cnJlbnQpKHBjbV9oYW5kbGUsIHN3cGFyYW1zKTsKLQlpZiAoIHN0YXR1cyA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IHNvZnR3YXJlIGNvbmZpZzogJXMiLCBTRExfTkFNRShzbmRfc3RyZXJyb3IpKHN0YXR1cykpOwotCQlBTFNBX0Nsb3NlQXVkaW8odGhpcyk7Ci0JCXJldHVybigtMSk7Ci0JfQotCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdGFydF90aHJlc2hvbGQpKHBjbV9oYW5kbGUsIHN3cGFyYW1zLCAwKTsKLQlpZiAoIHN0YXR1cyA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IHN0YXJ0IHRocmVzaG9sZDogJXMiLCBTRExfTkFNRShzbmRfc3RyZXJyb3IpKHN0YXR1cykpOwotCQlBTFNBX0Nsb3NlQXVkaW8odGhpcyk7Ci0JCXJldHVybigtMSk7Ci0JfQotCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX3NldF9hdmFpbF9taW4pKHBjbV9oYW5kbGUsIHN3cGFyYW1zLCBmcmFtZXMpOwotCWlmICggc3RhdHVzIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgYXZhaWwgbWluOiAlcyIsIFNETF9OQU1FKHNuZF9zdHJlcnJvcikoc3RhdHVzKSk7Ci0JCUFMU0FfQ2xvc2VBdWRpbyh0aGlzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0Jc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXMpKHBjbV9oYW5kbGUsIHN3cGFyYW1zKTsKLQlpZiAoIHN0YXR1cyA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IHNvZnR3YXJlIGF1ZGlvIHBhcmFtZXRlcnM6ICVzIiwgU0RMX05BTUUoc25kX3N0cmVycm9yKShzdGF0dXMpKTsKLQkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIENhbGN1bGF0ZSB0aGUgZmluYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBhdWRpbyBzcGVjaWZpY2F0aW9uICovCi0JU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKLQotCS8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KLQltaXhsZW4gPSBzcGVjLT5zaXplOwotCW1peGJ1ZiA9IChVaW50OCAqKVNETF9BbGxvY0F1ZGlvTWVtKG1peGxlbik7Ci0JaWYgKCBtaXhidWYgPT0gTlVMTCApIHsKLQkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbWVtc2V0KG1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7Ci0KLQkvKiBHZXQgdGhlIHBhcmVudCBwcm9jZXNzIGlkICh3ZSdyZSB0aGUgcGFyZW50IG9mIHRoZSBhdWRpbyB0aHJlYWQpICovCi0JcGFyZW50ID0gZ2V0cGlkKCk7Ci0KLQkvKiBTd2l0Y2ggdG8gYmxvY2tpbmcgbW9kZSBmb3IgcGxheWJhY2sgKi8KLQlTRExfTkFNRShzbmRfcGNtX25vbmJsb2NrKShwY21faGFuZGxlLCAwKTsKLQotCS8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLwotCXJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vYWxzYS9TRExfYWxzYV9hdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9hbHNhL1NETF9hbHNhX2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOWFjMDMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9hbHNhL1NETF9hbHNhX2F1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfQUxTQV9QQ01fYXVkaW9faAotI2RlZmluZSBfQUxTQV9QQ01fYXVkaW9faAotCi0jZGVmaW5lIEFMU0FfUENNX09MRF9IV19QQVJBTVNfQVBJCi0jZGVmaW5lIEFMU0FfUENNX09MRF9TV19QQVJBTVNfQVBJCi0jaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7Ci0JLyogVGhlIGF1ZGlvIGRldmljZSBoYW5kbGUgKi8KLQlzbmRfcGNtX3QgKnBjbV9oYW5kbGU7Ci0KLQkvKiBUaGUgcGFyZW50IHByb2Nlc3MgaWQsIHRvIGRldGVjdCB3aGVuIGFwcGxpY2F0aW9uIHF1aXRzICovCi0JcGlkX3QgcGFyZW50OwotCi0JLyogUmF3IG1peGluZyBidWZmZXIgKi8KLQlVaW50OCAqbWl4YnVmOwotCWludCAgICBtaXhsZW47Ci19OwotCi0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgcGNtX2hhbmRsZQkJKHRoaXMtPmhpZGRlbi0+cGNtX2hhbmRsZSkKLSNkZWZpbmUgcGFyZW50CQkJKHRoaXMtPmhpZGRlbi0+cGFyZW50KQotI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCi0jZGVmaW5lIG1peGxlbgkJCSh0aGlzLT5oaWRkZW4tPm1peGxlbikKLQotI2VuZGlmIC8qIF9BTFNBX1BDTV9hdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2FtaWdhb3MvU0RMX2FoaWF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2FtaWdhb3MvU0RMX2FoaWF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTRjMWEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9hbWlnYW9zL1NETF9haGlhdWRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAoZm9yIEFtaWdhT1MpICovCi0KLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIlNETF9haGlhdWRpby5oIgotCi0vKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IEFISV9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgQUhJX1dhaXRBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgdm9pZCBBSElfUGxheUF1ZGlvKF9USElTKTsKLXN0YXRpYyBVaW50OCAqQUhJX0dldEF1ZGlvQnVmKF9USElTKTsKLXN0YXRpYyB2b2lkIEFISV9DbG9zZUF1ZGlvKF9USElTKTsKLQotI2lmbmRlZiBfX1NBU0MKLQkjZGVmaW5lIG15bWFsbG9jKHgpIEFsbG9jVmVjKHgsTUVNRl9QVUJMSUMpIAotCSNkZWZpbmUgbXlmcmVlIEZyZWVWZWMKLSNlbHNlCi0JI2RlZmluZSBteW1hbGxvYyBtYWxsb2MKLQkjZGVmaW5lIG15ZnJlZSBmcmVlCi0jZW5kaWYKLQotLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKLXsKLQlpbnQgb2s9MDsKLQlzdHJ1Y3QgTXNnUG9ydCAqcDsKLQlzdHJ1Y3QgQUhJUmVxdWVzdCAqcmVxOwotCi0JaWYocD1DcmVhdGVNc2dQb3J0KCkpCi0JewotCQlpZihyZXE9KHN0cnVjdCBBSElSZXF1ZXN0ICopQ3JlYXRlSU9SZXF1ZXN0KHAsc2l6ZW9mKHN0cnVjdCBBSElSZXF1ZXN0KSkpCi0JCXsKLQkJCXJlcS0+YWhpcl9WZXJzaW9uPTQ7Ci0KLQkJCWlmKCFPcGVuRGV2aWNlKEFISU5BTUUsMCwoc3RydWN0IElPUmVxdWVzdCAqKXJlcSxOVUxMKSkKLQkJCXsKLQkJCQlEKGJ1ZygiQUhJIGF2YWlsYWJsZS5cbiIpKTsKLQkJCQlvaz0xOwotCQkJCUNsb3NlRGV2aWNlKChzdHJ1Y3QgSU9SZXF1ZXN0ICopcmVxKTsKLQkJCX0KLQkJCURlbGV0ZUlPUmVxdWVzdCgoc3RydWN0IElPUmVxdWVzdCAqKXJlcSk7Ci0JCX0KLQkJRGVsZXRlTXNnUG9ydChwKTsKLQl9Ci0KLQlEKGlmKCFvaykgYnVnKCJBSEkgbm90IGF2YWlsYWJsZVxuIikpOwotCXJldHVybiBvazsKLX0KLQotc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9BdWRpb0RldmljZSAqdGhpczsKLQotI2lmbmRlZiBOT19BTUlHQURFQlVHCi0JRChidWcoIkFISSBjcmVhdGVkLi4uXG4iKSk7Ci0jZW5kaWYKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLQlpZiAoIHRoaXMgKSB7Ci0JCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOwotCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQl9Ci0JaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCB0aGlzICkgewotCQkJU0RMX2ZyZWUodGhpcyk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JdGhpcy0+T3BlbkF1ZGlvID0gQUhJX09wZW5BdWRpbzsKLQl0aGlzLT5XYWl0QXVkaW8gPSBBSElfV2FpdEF1ZGlvOwotCXRoaXMtPlBsYXlBdWRpbyA9IEFISV9QbGF5QXVkaW87Ci0JdGhpcy0+R2V0QXVkaW9CdWYgPSBBSElfR2V0QXVkaW9CdWY7Ci0JdGhpcy0+Q2xvc2VBdWRpbyA9IEFISV9DbG9zZUF1ZGlvOwotCi0JdGhpcy0+ZnJlZSA9IEF1ZGlvX0RlbGV0ZURldmljZTsKLQotCXJldHVybiB0aGlzOwotfQotCi1BdWRpb0Jvb3RTdHJhcCBBSElfYm9vdHN0cmFwID0gewotCSJBSEkiLCBBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQotfTsKLQotCi12b2lkIHN0YXRpYyBBSElfV2FpdEF1ZGlvKF9USElTKQotewotCWlmKCFDaGVja0lPKChzdHJ1Y3QgSU9SZXF1ZXN0ICopYXVkaW9fcmVxW2N1cnJlbnRfYnVmZmVyXSkpCi0JewotCQlXYWl0SU8oKHN0cnVjdCBJT1JlcXVlc3QgKilhdWRpb19yZXFbY3VycmVudF9idWZmZXJdKTsKLS8vCQlBYm9ydElPKChzdHJ1Y3QgSU9SZXF1ZXN0ICopYXVkaW9fcmVxW2N1cnJlbnRfYnVmZmVyXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBBSElfUGxheUF1ZGlvKF9USElTKQotewotCWlmKHBsYXlpbmc+MSkKLQkJV2FpdElPKChzdHJ1Y3QgSU9SZXF1ZXN0ICopYXVkaW9fcmVxW2N1cnJlbnRfYnVmZmVyXSk7Ci0KLQkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSBvdXQgKi8KLQlhdWRpb19yZXFbY3VycmVudF9idWZmZXJdIC0+IGFoaXJfU3RkLiBpb19NZXNzYWdlLm1uX05vZGUubG5fUHJpID0gNjA7Ci0JYXVkaW9fcmVxW2N1cnJlbnRfYnVmZmVyXSAtPiBhaGlyX1N0ZC4gaW9fRGF0YSAgICAgICAgICAgICAgICA9IG1peGJ1ZltjdXJyZW50X2J1ZmZlcl07Ci0JYXVkaW9fcmVxW2N1cnJlbnRfYnVmZmVyXSAtPiBhaGlyX1N0ZC4gaW9fTGVuZ3RoICAgICAgICAgICAgICA9IHRoaXMtPmhpZGRlbi0+c2l6ZTsKLQlhdWRpb19yZXFbY3VycmVudF9idWZmZXJdIC0+IGFoaXJfU3RkLiBpb19PZmZzZXQgICAgICAgICAgICAgID0gMDsKLQlhdWRpb19yZXFbY3VycmVudF9idWZmZXJdIC0+IGFoaXJfU3RkIC4gaW9fQ29tbWFuZCAgICAgICAgICAgID0gQ01EX1dSSVRFOwotCWF1ZGlvX3JlcVtjdXJyZW50X2J1ZmZlcl0gLT4gYWhpcl9GcmVxdWVuY3kgICAgICAgICAgICAgICAgICAgPSB0aGlzLT5oaWRkZW4tPmZyZXE7Ci0JYXVkaW9fcmVxW2N1cnJlbnRfYnVmZmVyXSAtPiBhaGlyX1ZvbHVtZSAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAwMDA7Ci0JYXVkaW9fcmVxW2N1cnJlbnRfYnVmZmVyXSAtPiBhaGlyX1R5cGUgICAgICAgICAgICAgICAgICAgICAgICA9IHRoaXMtPmhpZGRlbi0+dHlwZTsKLQlhdWRpb19yZXFbY3VycmVudF9idWZmZXJdIC0+IGFoaXJfUG9zaXRpb24gICAgICAgICAgICAgICAgICAgID0gMHg4MDAwOwotCWF1ZGlvX3JlcVtjdXJyZW50X2J1ZmZlcl0gLT4gYWhpcl9MaW5rICAgICAgICAgICAgICAgICAgICAgICAgPSAocGxheWluZz4wID8gYXVkaW9fcmVxW2N1cnJlbnRfYnVmZmVyXjFdIDogTlVMTCk7Ci0KLQlTZW5kSU8oKHN0cnVjdCBJT1JlcXVlc3QgKilhdWRpb19yZXFbY3VycmVudF9idWZmZXJdKTsKLQljdXJyZW50X2J1ZmZlcl49MTsKLQotCXBsYXlpbmcrKzsKLX0KLQotc3RhdGljIFVpbnQ4ICpBSElfR2V0QXVkaW9CdWYoX1RISVMpCi17Ci0JcmV0dXJuKG1peGJ1ZltjdXJyZW50X2J1ZmZlcl0pOwotfQotCi1zdGF0aWMgdm9pZCBBSElfQ2xvc2VBdWRpbyhfVEhJUykKLXsKLQlEKGJ1ZygiQ2xvc2luZyBhdWRpby4uLlxuIikpOwotCi0JcGxheWluZz0wOwotCi0JaWYoYXVkaW9fcmVxWzBdKQotCXsKLQkJaWYoYXVkaW9fcmVxWzFdKQotCQl7Ci0JCQlEKGJ1ZygiQnJlYWsgcmVxWzFdLi4uXG4iKSk7Ci0KLQkJCUFib3J0SU8oKHN0cnVjdCBJT1JlcXVlc3QgKilhdWRpb19yZXFbMV0pOwotCQkJV2FpdElPKChzdHJ1Y3QgSU9SZXF1ZXN0ICopYXVkaW9fcmVxWzFdKTsKLQkJfQotCi0JCUQoYnVnKCJCcmVhayByZXFbMF0uLi5cbiIpKTsKLQotCQlBYm9ydElPKChzdHJ1Y3QgSU9SZXF1ZXN0ICopYXVkaW9fcmVxWzBdKTsKLQkJV2FpdElPKChzdHJ1Y3QgSU9SZXF1ZXN0ICopYXVkaW9fcmVxWzBdKTsKLQotCQlpZihhdWRpb19yZXFbMV0pCi0JCXsKLQkJCUQoYnVnKCJCcmVhayBBR0FJTiByZXFbMV0uLi5cbiIpKTsKLQkJCUFib3J0SU8oKHN0cnVjdCBJT1JlcXVlc3QgKilhdWRpb19yZXFbMV0pOwotCQkJV2FpdElPKChzdHJ1Y3QgSU9SZXF1ZXN0ICopYXVkaW9fcmVxWzFdKTsKLQkJfQotLy8gRG91YmxlIGFib3J0IHRvIGJlIHN1cmUgdG8gYnJlYWsgdGhlIGRidWZmZXJpbmcgcHJvY2Vzcy4KLQotCQlTRExfRGVsYXkoMjAwKTsKLQotCQlEKGJ1ZygiUmVxcyBicmVha2VkLCBjbG9zaW5nIGRldmljZS4uLlxuIikpOwotCQlDbG9zZURldmljZSgoc3RydWN0IElPUmVxdWVzdCAqKWF1ZGlvX3JlcVswXSk7Ci0JCUQoYnVnKCJEZXZpY2UgY2xvc2VkLCBmcmVlaW5nIG1lbW9yeS4uLlxuIikpOwotCQlteWZyZWUoYXVkaW9fcmVxWzFdKTsKLQkJRChidWcoIk1lbW9yeSBmcmVlZCwgZGVsZXRpbmcgSU9SZXEuLi5cbiIpKTsgCi0JCURlbGV0ZUlPUmVxdWVzdCgoc3RydWN0IElPUmVxdWVzdCAqKWF1ZGlvX3JlcVswXSk7Ci0JCWF1ZGlvX3JlcVswXT1hdWRpb19yZXFbMV09TlVMTDsKLQl9Ci0KLQlEKGJ1ZygiRnJlZWluZyBtaXhidWZbMF0uLi5cbiIpKTsKLQlpZiAoIG1peGJ1ZlswXSAhPSBOVUxMICkgewotCQlteWZyZWUobWl4YnVmWzBdKTsKLS8vCQlTRExfRnJlZUF1ZGlvTWVtKG1peGJ1ZlswXSk7Ci0JCW1peGJ1ZlswXSA9IE5VTEw7Ci0JfQotCi0JRChidWcoIkZyZWVpbmcgbWl4YnVmWzFdLi4uXG4iKSk7Ci0JaWYgKCBtaXhidWZbMV0gIT0gTlVMTCApIHsKLQkJbXlmcmVlKG1peGJ1ZlsxXSk7Ci0vLwkJU0RMX0ZyZWVBdWRpb01lbShtaXhidWZbMV0pOwotCQltaXhidWZbMV0gPSBOVUxMOwotCX0KLQotCUQoYnVnKCJGcmVlaW5nIGF1ZGlvX3BvcnQuLi5cbiIpKTsKLQotCWlmICggYXVkaW9fcG9ydCAhPSBOVUxMICkgewotCQlEZWxldGVNc2dQb3J0KGF1ZGlvX3BvcnQpOwotCQlhdWRpb19wb3J0ID0gTlVMTDsKLQl9Ci0JRChidWcoIi4uLmRvbmUhXG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQgQUhJX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsJCi0vLwlpbnQgd2lkdGg7Ci0KLQlEKGJ1ZygiQUhJIG9wZW5pbmcuLi5cbiIpKTsKLQotCS8qIERldGVybWluZSB0aGUgYXVkaW8gcGFyYW1ldGVycyBmcm9tIHRoZSBBdWRpb1NwZWMgKi8KLQlzd2l0Y2ggKCBzcGVjLT5mb3JtYXQgJiAweEZGICkgewotCi0JCWNhc2UgODogeyAvKiBTaWduZWQgOCBiaXQgYXVkaW8gZGF0YSAqLwotCQkJRChidWcoIlNhbXBsZXMgYSA4IGJpdC4uLlxuIikpOwotCQkJc3BlYy0+Zm9ybWF0ID0gQVVESU9fUzg7Ci0JCQl0aGlzLT5oaWRkZW4tPmJ5dGVzcGVyc2FtcGxlPTE7Ci0JCQlpZihzcGVjLT5jaGFubmVsczwyKQotCQkJCXRoaXMtPmhpZGRlbi0+dHlwZSA9IEFISVNUX004UzsKLQkJCWVsc2UKLQkJCQl0aGlzLT5oaWRkZW4tPnR5cGUgPSBBSElTVF9TOFM7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJY2FzZSAxNjogeyAvKiBTaWduZWQgMTYgYml0IGF1ZGlvIGRhdGEgKi8KLQkJCUQoYnVnKCJTYW1wbGVzIGEgMTYgYml0Li4uXG4iKSk7Ci0JCQlzcGVjLT5mb3JtYXQgPSBBVURJT19TMTZNU0I7Ci0JCQl0aGlzLT5oaWRkZW4tPmJ5dGVzcGVyc2FtcGxlPTI7Ci0JCQlpZihzcGVjLT5jaGFubmVsczwyKQotCQkJCXRoaXMtPmhpZGRlbi0+dHlwZSA9IEFISVNUX00xNlM7Ci0JCQllbHNlCi0JCQkJdGhpcy0+aGlkZGVuLT50eXBlID0gQUhJU1RfUzE2UzsKLQkJfQotCQlicmVhazsKLQotCQlkZWZhdWx0OiB7Ci0JCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCX0KLQotCWlmKHNwZWMtPmNoYW5uZWxzIT0xICYmIHNwZWMtPmNoYW5uZWxzIT0yKQotCXsKLQkJRChidWcoIldyb25nIGNoYW5uZWwgbnVtYmVyIVxuIikpOwotCQlTRExfU2V0RXJyb3IoIkNoYW5uZWwgbnVtYmVyIG5vbiBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCUQoYnVnKCJCZWZvcmUgQ2FsY3VsYXRlQXVkaW9TcGVjXG4iKSk7Ci0JLyogVXBkYXRlIHRoZSBmcmFnbWVudCBzaXplIGFzIHNpemUgaW4gYnl0ZXMgKi8KLQlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCi0JRChidWcoIkJlZm9yZSBDcmVhdGVNc2dQb3J0XG4iKSk7Ci0KLQlpZighKGF1ZGlvX3BvcnQ9Q3JlYXRlTXNnUG9ydCgpKSkKLQl7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBhIE1zZ1BvcnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCUQoYnVnKCJCZWZvcmUgQ3JlYXRlSU9SZXF1ZXN0XG4iKSk7Ci0KLQlpZighKGF1ZGlvX3JlcVswXT0oc3RydWN0IEFISVJlcXVlc3QgKilDcmVhdGVJT1JlcXVlc3QoYXVkaW9fcG9ydCxzaXplb2Yoc3RydWN0IEFISVJlcXVlc3QpKSkpCi0JewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgYW4gQUhJUmVxdWVzdCIpOwotCQlEZWxldGVNc2dQb3J0KGF1ZGlvX3BvcnQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JYXVkaW9fcmVxWzBdLT5haGlyX1ZlcnNpb24gPSA0OwotCi0JaWYoT3BlbkRldmljZShBSElOQU1FLDAsKHN0cnVjdCBJT1JlcXVlc3QgKilhdWRpb19yZXFbMF0sTlVMTCkpCi0JewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBvcGVuIEFISSBkZXZpY2UhXG4iKTsKLQkJRGVsZXRlSU9SZXF1ZXN0KChzdHJ1Y3QgSU9SZXF1ZXN0ICopYXVkaW9fcmVxWzBdKTsKLQkJRGVsZXRlTXNnUG9ydChhdWRpb19wb3J0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlEKGJ1ZygiQUZURVIgb3BlbmRldmljZVxuIikpOwotCi0JLyogU2V0IG91dHB1dCBmcmVxdWVuY3kgYW5kIHNpemUgKi8KLQl0aGlzLT5oaWRkZW4tPmZyZXEgPSBzcGVjLT5mcmVxOwotCXRoaXMtPmhpZGRlbi0+c2l6ZSA9IHNwZWMtPnNpemU7Ci0KLQlEKGJ1ZygiQmVmb3JlIGJ1ZmZlciBhbGxvY2F0aW9uXG4iKSk7Ci0KLQkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCi0JbWl4YnVmWzBdID0gKFVpbnQ4ICopbXltYWxsb2Moc3BlYy0+c2l6ZSk7Ci0JbWl4YnVmWzFdID0gKFVpbnQ4ICopbXltYWxsb2Moc3BlYy0+c2l6ZSk7Ci0KLQlEKGJ1ZygiQmVmb3JlIGF1ZGlvX3JlcSBhbGxvY2F0aW9uXG4iKSk7Ci0KLQlpZighKGF1ZGlvX3JlcVsxXT1teW1hbGxvYyhzaXplb2Yoc3RydWN0IEFISVJlcXVlc3QpKSkpCi0JewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JCi0JRChidWcoIkJlZm9yZSBhdWRpb19yZXEgbWVtY3B5XG4iKSk7Ci0KLQlTRExfbWVtY3B5KGF1ZGlvX3JlcVsxXSxhdWRpb19yZXFbMF0sc2l6ZW9mKHN0cnVjdCBBSElSZXF1ZXN0KSk7Ci0KLQlpZiAoIG1peGJ1ZlswXSA9PSBOVUxMIHx8IG1peGJ1ZlsxXSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQlEKGJ1ZygiQmVmb3JlIG1peGJ1ZiBtZW1zZXRcbiIpKTsKLQotCVNETF9tZW1zZXQobWl4YnVmWzBdLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKLQlTRExfbWVtc2V0KG1peGJ1ZlsxXSwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7Ci0KLQljdXJyZW50X2J1ZmZlcj0wOwotCXBsYXlpbmc9MDsKLQotCUQoYnVnKCJBSEkgb3BlbmVkOiBmcmVxOiVsZCBtaXhidWY6JWx4LyVseCBidWZsZW46JWxkIGJpdHM6JWxkIGNoYW5uZWxzOiVsZFxuIixzcGVjLT5mcmVxLG1peGJ1ZlswXSxtaXhidWZbMV0sc3BlYy0+c2l6ZSx0aGlzLT5oaWRkZW4tPmJ5dGVzcGVyc2FtcGxlKjgsc3BlYy0+Y2hhbm5lbHMpKTsKLQotCS8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLwotCXJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vYW1pZ2Fvcy9TRExfYWhpYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vYW1pZ2Fvcy9TRExfYWhpYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllZjMzOS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2FtaWdhb3MvU0RMX2FoaWF1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2FoaWF1ZGlvX2gKLSNkZWZpbmUgX1NETF9haGlhdWRpb19oCi0KLSNpbmNsdWRlIDxleGVjL2V4ZWMuaD4KLSNpbmNsdWRlIDxkb3MvZG9zLmg+Ci0jaWZkZWYgX19TQVNDCi0jaW5jbHVkZSA8cHJvdG8vZXhlYy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxpbmxpbmUvZXhlYy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkZXZpY2VzL2FoaS5oPgotI2luY2x1ZGUgIm15ZGVidWcuaCIKLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSBhdWRpbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7Ci0JLyogVGhlIGhhbmRsZSBmb3IgdGhlIGF1ZGlvIGRldmljZSAqLwotCXN0cnVjdCBBSElSZXF1ZXN0ICphdWRpb19yZXFbMl07Ci0Jc3RydWN0IE1zZ1BvcnQgKmF1ZGlvX3BvcnQ7Ci0JU2ludDMyIGZyZXEsdHlwZSxieXRlc3BlcnNhbXBsZSxzaXplOwotCVVpbnQ4ICptaXhidWZbMl07ICAgICAgICAgICAvKiBUaGUgYXBwIG1peGluZyBidWZmZXIgKi8KLQlpbnQgY3VycmVudF9idWZmZXI7Ci0JVWludDMyIHBsYXlpbmc7Ci19OwotCi0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgYXVkaW9fcG9ydAkJKHRoaXMtPmhpZGRlbi0+YXVkaW9fcG9ydCkKLSNkZWZpbmUgYXVkaW9fcmVxCQkodGhpcy0+aGlkZGVuLT5hdWRpb19yZXEpCi0jZGVmaW5lIG1peGJ1ZgkJCSh0aGlzLT5oaWRkZW4tPm1peGJ1ZikKLSNkZWZpbmUgY3VycmVudF9idWZmZXIJCSh0aGlzLT5oaWRkZW4tPmN1cnJlbnRfYnVmZmVyKQotI2RlZmluZSBwbGF5aW5nCQkJKHRoaXMtPmhpZGRlbi0+cGxheWluZykKLQotI2VuZGlmIC8qIF9TRExfYWhpYXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9hcnRzL1NETF9hcnRzYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vYXJ0cy9TRExfYXJ0c2F1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGU1ODIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9hcnRzL1NETF9hcnRzYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogQWxsb3cgYWNjZXNzIHRvIGEgcmF3IG1peGluZyBidWZmZXIgKi8KLQotI2lmZGVmIEhBVkVfU0lHTkFMX0gKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgotI2luY2x1ZGUgIlNETF9hcnRzYXVkaW8uaCIKLQotI2lmZGVmIFNETF9BVURJT19EUklWRVJfQVJUU19EWU5BTUlDCi0jaW5jbHVkZSAiU0RMX25hbWUuaCIKLSNpbmNsdWRlICJTRExfbG9hZHNvLmgiCi0jZWxzZQotI2RlZmluZSBTRExfTkFNRShYKQlYCi0jZW5kaWYKLQotLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgYXJ0c2MgYXVkaW8gKi8KLSNkZWZpbmUgQVJUU19EUklWRVJfTkFNRSAgICAgICAgICJhcnRzIgotCi0vKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IEFSVFNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIEFSVFNfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIEFSVFNfUGxheUF1ZGlvKF9USElTKTsKLXN0YXRpYyBVaW50OCAqQVJUU19HZXRBdWRpb0J1ZihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBBUlRTX0Nsb3NlQXVkaW8oX1RISVMpOwotCi0jaWZkZWYgU0RMX0FVRElPX0RSSVZFUl9BUlRTX0RZTkFNSUMKLQotc3RhdGljIGNvbnN0IGNoYXIgKmFydHNfbGlicmFyeSA9IFNETF9BVURJT19EUklWRVJfQVJUU19EWU5BTUlDOwotc3RhdGljIHZvaWQgKmFydHNfaGFuZGxlID0gTlVMTDsKLXN0YXRpYyBpbnQgYXJ0c19sb2FkZWQgPSAwOwotCi1zdGF0aWMgaW50ICgqU0RMX05BTUUoYXJ0c19pbml0KSkodm9pZCk7Ci1zdGF0aWMgdm9pZCAoKlNETF9OQU1FKGFydHNfZnJlZSkpKHZvaWQpOwotc3RhdGljIGFydHNfc3RyZWFtX3QgKCpTRExfTkFNRShhcnRzX3BsYXlfc3RyZWFtKSkoaW50IHJhdGUsIGludCBiaXRzLCBpbnQgY2hhbm5lbHMsIGNvbnN0IGNoYXIgKm5hbWUpOwotc3RhdGljIGludCAoKlNETF9OQU1FKGFydHNfc3RyZWFtX3NldCkpKGFydHNfc3RyZWFtX3QgcywgYXJ0c19wYXJhbWV0ZXJfdCBwYXJhbSwgaW50IHZhbHVlKTsKLXN0YXRpYyBpbnQgKCpTRExfTkFNRShhcnRzX3N0cmVhbV9nZXQpKShhcnRzX3N0cmVhbV90IHMsIGFydHNfcGFyYW1ldGVyX3QgcGFyYW0pOwotc3RhdGljIGludCAoKlNETF9OQU1FKGFydHNfd3JpdGUpKShhcnRzX3N0cmVhbV90IHMsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgaW50IGNvdW50KTsKLXN0YXRpYyB2b2lkICgqU0RMX05BTUUoYXJ0c19jbG9zZV9zdHJlYW0pKShhcnRzX3N0cmVhbV90IHMpOwotc3RhdGljIGludCAoKlNETF9OQU1FKGFydHNfc3VzcGVuZGVkKSkodm9pZCk7Ci1zdGF0aWMgY29uc3QgY2hhciAqKCpTRExfTkFNRShhcnRzX2Vycm9yX3RleHQpKShpbnQgZXJyb3Jjb2RlKTsKLQotc3RhdGljIHN0cnVjdCB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl2b2lkICoqZnVuYzsKLX0gYXJ0c19mdW5jdGlvbnNbXSA9IHsKLQl7ICJhcnRzX2luaXQiLAkJKHZvaWQgKiopJlNETF9OQU1FKGFydHNfaW5pdCkJCX0sCi0JeyAiYXJ0c19mcmVlIiwJCSh2b2lkICoqKSZTRExfTkFNRShhcnRzX2ZyZWUpCQl9LAotCXsgImFydHNfcGxheV9zdHJlYW0iLAkodm9pZCAqKikmU0RMX05BTUUoYXJ0c19wbGF5X3N0cmVhbSkJfSwKLQl7ICJhcnRzX3N0cmVhbV9zZXQiLAkodm9pZCAqKikmU0RMX05BTUUoYXJ0c19zdHJlYW1fc2V0KQl9LAotCXsgImFydHNfc3RyZWFtX2dldCIsCSh2b2lkICoqKSZTRExfTkFNRShhcnRzX3N0cmVhbV9nZXQpCX0sCi0JeyAiYXJ0c193cml0ZSIsCQkodm9pZCAqKikmU0RMX05BTUUoYXJ0c193cml0ZSkJCX0sCi0JeyAiYXJ0c19jbG9zZV9zdHJlYW0iLAkodm9pZCAqKikmU0RMX05BTUUoYXJ0c19jbG9zZV9zdHJlYW0pCX0sCi0JeyAiYXJ0c19zdXNwZW5kZWQiLAkodm9pZCAqKikmU0RMX05BTUUoYXJ0c19zdXNwZW5kZWQpCX0sCi0JeyAiYXJ0c19lcnJvcl90ZXh0IiwJKHZvaWQgKiopJlNETF9OQU1FKGFydHNfZXJyb3JfdGV4dCkJfSwKLX07Ci0KLXN0YXRpYyB2b2lkIFVubG9hZEFSVFNMaWJyYXJ5KCkKLXsKLQlpZiAoIGFydHNfbG9hZGVkICkgewotCQlTRExfVW5sb2FkT2JqZWN0KGFydHNfaGFuZGxlKTsKLQkJYXJ0c19oYW5kbGUgPSBOVUxMOwotCQlhcnRzX2xvYWRlZCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IExvYWRBUlRTTGlicmFyeSh2b2lkKQotewotCWludCBpLCByZXR2YWwgPSAtMTsKLQotCWFydHNfaGFuZGxlID0gU0RMX0xvYWRPYmplY3QoYXJ0c19saWJyYXJ5KTsKLQlpZiAoIGFydHNfaGFuZGxlICkgewotCQlhcnRzX2xvYWRlZCA9IDE7Ci0JCXJldHZhbCA9IDA7Ci0JCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKGFydHNfZnVuY3Rpb25zKTsgKytpICkgewotCQkJKmFydHNfZnVuY3Rpb25zW2ldLmZ1bmMgPSBTRExfTG9hZEZ1bmN0aW9uKGFydHNfaGFuZGxlLCBhcnRzX2Z1bmN0aW9uc1tpXS5uYW1lKTsKLQkJCWlmICggISphcnRzX2Z1bmN0aW9uc1tpXS5mdW5jICkgewotCQkJCXJldHZhbCA9IC0xOwotCQkJCVVubG9hZEFSVFNMaWJyYXJ5KCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotI2Vsc2UKLQotc3RhdGljIHZvaWQgVW5sb2FkQVJUU0xpYnJhcnkoKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBMb2FkQVJUU0xpYnJhcnkodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIFNETF9BVURJT19EUklWRVJfQVJUU19EWU5BTUlDICovCi0KLS8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCi17Ci0JaW50IGF2YWlsYWJsZSA9IDA7Ci0KLQlpZiAoIExvYWRBUlRTTGlicmFyeSgpIDwgMCApIHsKLQkJcmV0dXJuIGF2YWlsYWJsZTsKLQl9Ci0JaWYgKCBTRExfTkFNRShhcnRzX2luaXQpKCkgPT0gMCApIHsKLQkJaWYgKCBTRExfTkFNRShhcnRzX3N1c3BlbmRlZCkoKSApIHsKLQkJCS8qIFBsYXkgYSBzdHJlYW0gc28gYVJ0cyBkb2Vzbid0IGNyYXNoICovCi0JCQlhcnRzX3N0cmVhbV90IHN0cmVhbTI7Ci0JCQlzdHJlYW0yPVNETF9OQU1FKGFydHNfcGxheV9zdHJlYW0pKDQ0MTAwLCAxNiwgMiwgIlNETCIpOwotCQkJU0RMX05BTUUoYXJ0c193cml0ZSkoc3RyZWFtMiwgIiIsIDApOwotCQkJU0RMX05BTUUoYXJ0c19jbG9zZV9zdHJlYW0pKHN0cmVhbTIpOwotCQkJYXZhaWxhYmxlID0gMTsKLQkJfQotCQlTRExfTkFNRShhcnRzX2ZyZWUpKCk7Ci0JfQotCVVubG9hZEFSVFNMaWJyYXJ5KCk7Ci0KLQlyZXR1cm4gYXZhaWxhYmxlOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci0JVW5sb2FkQVJUU0xpYnJhcnkoKTsKLX0KLQotc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfQXVkaW9EZXZpY2UgKnRoaXM7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCUxvYWRBUlRTTGlicmFyeSgpOwotCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7Ci0JaWYgKCB0aGlzICkgewotCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKLQkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0JfQotCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWlmICggdGhpcyApIHsKLQkJCVNETF9mcmVlKHRoaXMpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCXN0cmVhbSA9IDA7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JdGhpcy0+T3BlbkF1ZGlvID0gQVJUU19PcGVuQXVkaW87Ci0JdGhpcy0+V2FpdEF1ZGlvID0gQVJUU19XYWl0QXVkaW87Ci0JdGhpcy0+UGxheUF1ZGlvID0gQVJUU19QbGF5QXVkaW87Ci0JdGhpcy0+R2V0QXVkaW9CdWYgPSBBUlRTX0dldEF1ZGlvQnVmOwotCXRoaXMtPkNsb3NlQXVkaW8gPSBBUlRTX0Nsb3NlQXVkaW87Ci0KLQl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIEFSVFNfYm9vdHN0cmFwID0gewotCUFSVFNfRFJJVkVSX05BTUUsICJBbmFsb2cgUmVhbHRpbWUgU3ludGhlc2l6ZXIiLAotCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KLXN0YXRpYyB2b2lkIEFSVFNfV2FpdEF1ZGlvKF9USElTKQotewotCVNpbnQzMiB0aWNrczsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdGhyZWFkLXBhcmVudCBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlICovCi0JeyBzdGF0aWMgaW50IGNudCA9IDA7Ci0JCS8qIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2l0aCB0aHJlYWQgaW1wbGVtZW50YXRpb25zIAotCQkgICB0aGF0IHVzZSBhIGRpZmZlcmVudCBwcm9jZXNzIGlkIGZvciBlYWNoIHRocmVhZC4KLQkJKi8KLQkJaWYgKHBhcmVudCAmJiAoKCgrK2NudCklMTApID09IDApKSB7IC8qIENoZWNrIGV2ZXJ5IDEwIGxvb3BzICovCi0JCQlpZiAoIGtpbGwocGFyZW50LCAwKSA8IDAgKSB7Ci0JCQkJdGhpcy0+ZW5hYmxlZCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBVc2UgdGltZXIgZm9yIGdlbmVyYWwgYXVkaW8gc3luY2hyb25pemF0aW9uICovCi0JdGlja3MgPSAoKFNpbnQzMikobmV4dF9mcmFtZSAtIFNETF9HZXRUaWNrcygpKSktRlVER0VfVElDS1M7Ci0JaWYgKCB0aWNrcyA+IDAgKSB7Ci0JCVNETF9EZWxheSh0aWNrcyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBBUlRTX1BsYXlBdWRpbyhfVEhJUykKLXsKLQlpbnQgd3JpdHRlbjsKLQotCS8qIFdyaXRlIHRoZSBhdWRpbyBkYXRhICovCi0Jd3JpdHRlbiA9IFNETF9OQU1FKGFydHNfd3JpdGUpKHN0cmVhbSwgbWl4YnVmLCBtaXhsZW4pOwotCQotCS8qIElmIHRpbWVyIHN5bmNocm9uaXphdGlvbiBpcyBlbmFibGVkLCBzZXQgdGhlIG5leHQgd3JpdGUgZnJhbWUgKi8KLQlpZiAoIGZyYW1lX3RpY2tzICkgewotCQluZXh0X2ZyYW1lICs9IGZyYW1lX3RpY2tzOwotCX0KLQotCS8qIElmIHdlIGNvdWxkbid0IHdyaXRlLCBhc3N1bWUgZmF0YWwgZXJyb3IgZm9yIG5vdyAqLwotCWlmICggd3JpdHRlbiA8IDAgKSB7Ci0JCXRoaXMtPmVuYWJsZWQgPSAwOwotCX0KLSNpZmRlZiBERUJVR19BVURJTwotCWZwcmludGYoc3RkZXJyLCAiV3JvdGUgJWQgYnl0ZXMgb2YgYXVkaW8gZGF0YVxuIiwgd3JpdHRlbik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIFVpbnQ4ICpBUlRTX0dldEF1ZGlvQnVmKF9USElTKQotewotCXJldHVybihtaXhidWYpOwotfQotCi1zdGF0aWMgdm9pZCBBUlRTX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0JaWYgKCBtaXhidWYgIT0gTlVMTCApIHsKLQkJU0RMX0ZyZWVBdWRpb01lbShtaXhidWYpOwotCQltaXhidWYgPSBOVUxMOwotCX0KLQlpZiAoIHN0cmVhbSApIHsKLQkJU0RMX05BTUUoYXJ0c19jbG9zZV9zdHJlYW0pKHN0cmVhbSk7Ci0JCXN0cmVhbSA9IDA7Ci0JfQotCVNETF9OQU1FKGFydHNfZnJlZSkoKTsKLX0KLQotc3RhdGljIGludCBBUlRTX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQlpbnQgYml0cywgZnJhZ19zcGVjOwotCVVpbnQxNiB0ZXN0X2Zvcm1hdCwgZm9ybWF0OwotCWludCBlcnJvcl9jb2RlOwotCi0JLyogUmVzZXQgdGhlIHRpbWVyIHN5bmNocm9uaXphdGlvbiBmbGFnICovCi0JZnJhbWVfdGlja3MgPSAwLjA7Ci0KLQltaXhidWYgPSBOVUxMOwotCi0JLyogVHJ5IGZvciBhIGNsb3Nlc3QgbWF0Y2ggb24gYXVkaW8gZm9ybWF0ICovCi0JZm9ybWF0ID0gMDsKLQliaXRzID0gMDsKLQlmb3IgKCB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7Ci0JCQkJCQkhIGZvcm1hdCAmJiB0ZXN0X2Zvcm1hdDsgKSB7Ci0jaWZkZWYgREVCVUdfQVVESU8KLQkJZnByaW50ZihzdGRlcnIsICJUcnlpbmcgZm9ybWF0IDB4JTQuNHhcbiIsIHRlc3RfZm9ybWF0KTsKLSNlbmRpZgotCQlzd2l0Y2ggKCB0ZXN0X2Zvcm1hdCApIHsKLQkJCWNhc2UgQVVESU9fVTg6Ci0JCQkJYml0cyA9IDg7Ci0JCQkJZm9ybWF0ID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fUzE2TFNCOgotCQkJCWJpdHMgPSAxNjsKLQkJCQlmb3JtYXQgPSAxOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlmb3JtYXQgPSAwOwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICggISBmb3JtYXQgKSB7Ci0JCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKLQkJfQotCX0KLQlpZiAoIGZvcm1hdCA9PSAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHMiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0Jc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7Ci0KLQllcnJvcl9jb2RlID0gU0RMX05BTUUoYXJ0c19pbml0KSgpOwotCWlmICggZXJyb3JfY29kZSAhPSAwICkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBpbml0aWFsaXplIEFSVFM6ICVzIiwgU0RMX05BTUUoYXJ0c19lcnJvcl90ZXh0KShlcnJvcl9jb2RlKSk7Ci0JCXJldHVybigtMSk7Ci0JfQotCWlmICggISBTRExfTkFNRShhcnRzX3N1c3BlbmRlZCkoKSApIHsKLQkJU0RMX1NldEVycm9yKCJBUlRTIGNhbiBub3Qgb3BlbiBhdWRpbyBkZXZpY2UiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0Jc3RyZWFtID0gU0RMX05BTUUoYXJ0c19wbGF5X3N0cmVhbSkoc3BlYy0+ZnJlcSwgYml0cywgc3BlYy0+Y2hhbm5lbHMsICJTREwiKTsKLQotCS8qIENhbGN1bGF0ZSB0aGUgZmluYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBhdWRpbyBzcGVjaWZpY2F0aW9uICovCi0JU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKLQotCS8qIERldGVybWluZSB0aGUgcG93ZXIgb2YgdHdvIG9mIHRoZSBmcmFnbWVudCBzaXplICovCi0JZm9yICggZnJhZ19zcGVjID0gMDsgKDB4MDE8PGZyYWdfc3BlYykgPCBzcGVjLT5zaXplOyArK2ZyYWdfc3BlYyApOwotCWlmICggKDB4MDE8PGZyYWdfc3BlYykgIT0gc3BlYy0+c2l6ZSApIHsKLQkJU0RMX1NldEVycm9yKCJGcmFnbWVudCBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28iKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JZnJhZ19zcGVjIHw9IDB4MDAwMjAwMDA7CS8qIHR3byBmcmFnbWVudHMsIGZvciBsb3cgbGF0ZW5jeSAqLwotCi0jaWZkZWYgQVJUU19QX1BBQ0tFVF9TRVRUSU5HUwotCVNETF9OQU1FKGFydHNfc3RyZWFtX3NldCkoc3RyZWFtLCBBUlRTX1BfUEFDS0VUX1NFVFRJTkdTLCBmcmFnX3NwZWMpOwotI2Vsc2UKLQlTRExfTkFNRShhcnRzX3N0cmVhbV9zZXQpKHN0cmVhbSwgQVJUU19QX1BBQ0tFVF9TSVpFLCBmcmFnX3NwZWMmMHhmZmZmKTsKLQlTRExfTkFNRShhcnRzX3N0cmVhbV9zZXQpKHN0cmVhbSwgQVJUU19QX1BBQ0tFVF9DT1VOVCwgZnJhZ19zcGVjPj4xNik7Ci0jZW5kaWYKLQlzcGVjLT5zaXplID0gU0RMX05BTUUoYXJ0c19zdHJlYW1fZ2V0KShzdHJlYW0sIEFSVFNfUF9QQUNLRVRfU0laRSk7Ci0KLQkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCi0JbWl4bGVuID0gc3BlYy0+c2l6ZTsKLQltaXhidWYgPSAoVWludDggKilTRExfQWxsb2NBdWRpb01lbShtaXhsZW4pOwotCWlmICggbWl4YnVmID09IE5VTEwgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCVNETF9tZW1zZXQobWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKLQotCS8qIEdldCB0aGUgcGFyZW50IHByb2Nlc3MgaWQgKHdlJ3JlIHRoZSBwYXJlbnQgb2YgdGhlIGF1ZGlvIHRocmVhZCkgKi8KLQlwYXJlbnQgPSBnZXRwaWQoKTsKLQotCS8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLwotCXJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vYXJ0cy9TRExfYXJ0c2F1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2FydHMvU0RMX2FydHNhdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTY5YTNkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vYXJ0cy9TRExfYXJ0c2F1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2FydHNjYXVkaW9faAotI2RlZmluZSBfU0RMX2FydHNjYXVkaW9faAotCi0jaW5jbHVkZSA8YXJ0c2MuaD4KLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7Ci0JLyogVGhlIHN0cmVhbSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCi0JYXJ0c19zdHJlYW1fdCBzdHJlYW07Ci0KLQkvKiBUaGUgcGFyZW50IHByb2Nlc3MgaWQsIHRvIGRldGVjdCB3aGVuIGFwcGxpY2F0aW9uIHF1aXRzICovCi0JcGlkX3QgcGFyZW50OwotCi0JLyogUmF3IG1peGluZyBidWZmZXIgKi8KLQlVaW50OCAqbWl4YnVmOwotCWludCAgICBtaXhsZW47Ci0KLQkvKiBTdXBwb3J0IGZvciBhdWRpbyB0aW1pbmcgdXNpbmcgYSB0aW1lciwgaW4gYWRkaXRpb24gdG8gc2VsZWN0KCkgKi8KLQlmbG9hdCBmcmFtZV90aWNrczsKLQlmbG9hdCBuZXh0X2ZyYW1lOwotfTsKLSNkZWZpbmUgRlVER0VfVElDS1MJMTAJLyogVGhlIHNjaGVkdWxlciBvdmVyaGVhZCB0aWNrcyBwZXIgZnJhbWUgKi8KLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIHN0cmVhbQkJCSh0aGlzLT5oaWRkZW4tPnN0cmVhbSkKLSNkZWZpbmUgcGFyZW50CQkJKHRoaXMtPmhpZGRlbi0+cGFyZW50KQotI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCi0jZGVmaW5lIG1peGxlbgkJCSh0aGlzLT5oaWRkZW4tPm1peGxlbikKLSNkZWZpbmUgZnJhbWVfdGlja3MJCSh0aGlzLT5oaWRkZW4tPmZyYW1lX3RpY2tzKQotI2RlZmluZSBuZXh0X2ZyYW1lCQkodGhpcy0+aGlkZGVuLT5uZXh0X2ZyYW1lKQotCi0jZW5kaWYgLyogX1NETF9hcnRzY2F1ZGlvX2ggKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9iYXVkaW8vU0RMX2JlYXVkaW8uY2MgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2JhdWRpby9TRExfYmVhdWRpby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlMGVjYi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2JhdWRpby9TRExfYmVhdWRpby5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogQWxsb3cgYWNjZXNzIHRvIHRoZSBhdWRpbyBzdHJlYW0gb24gQmVPUyAqLwotCi0jaW5jbHVkZSA8U291bmRQbGF5ZXIuaD4KLQotI2luY2x1ZGUgIi4uLy4uL21haW4vYmVvcy9TRExfQmVBcHAuaCIKLQotZXh0ZXJuICJDIiB7Ci0KLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotI2luY2x1ZGUgIi4uLy4uL3RocmVhZC9iZW9zL1NETF9zeXN0aHJlYWRfYy5oIgotI2luY2x1ZGUgIlNETF9iZWF1ZGlvLmgiCi0KLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBCRV9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgQkVfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIEJFX1BsYXlBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgVWludDggKkJFX0dldEF1ZGlvQnVmKF9USElTKTsKLXN0YXRpYyB2b2lkIEJFX0Nsb3NlQXVkaW8oX1RISVMpOwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotCXJldHVybigxKTsKLX0KLQotc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9BdWRpb0RldmljZSAqZGV2aWNlOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlkZXZpY2UgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7Ci0JaWYgKCBkZXZpY2UgKSB7Ci0JCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLQkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCX0KLQlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCBkZXZpY2UgKSB7Ci0JCQlTRExfZnJlZShkZXZpY2UpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQlkZXZpY2UtPk9wZW5BdWRpbyA9IEJFX09wZW5BdWRpbzsKLQlkZXZpY2UtPldhaXRBdWRpbyA9IEJFX1dhaXRBdWRpbzsKLQlkZXZpY2UtPlBsYXlBdWRpbyA9IEJFX1BsYXlBdWRpbzsKLQlkZXZpY2UtPkdldEF1ZGlvQnVmID0gQkVfR2V0QXVkaW9CdWY7Ci0JZGV2aWNlLT5DbG9zZUF1ZGlvID0gQkVfQ2xvc2VBdWRpbzsKLQotCWRldmljZS0+ZnJlZSA9IEF1ZGlvX0RlbGV0ZURldmljZTsKLQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIEJBVURJT19ib290c3RyYXAgPSB7Ci0JImJhdWRpbyIsICJCZU9TIEJTb3VuZFBsYXllciIsCi0JQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KLS8qIFRoZSBCZU9TIGNhbGxiYWNrIGZvciBoYW5kbGluZyB0aGUgYXVkaW8gYnVmZmVyICovCi1zdGF0aWMgdm9pZCBGaWxsU291bmQodm9pZCAqZGV2aWNlLCB2b2lkICpzdHJlYW0sIHNpemVfdCBsZW4sIAotCQkJCQljb25zdCBtZWRpYV9yYXdfYXVkaW9fZm9ybWF0ICZmb3JtYXQpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IChTRExfQXVkaW9EZXZpY2UgKilkZXZpY2U7Ci0KLQkvKiBTaWxlbmNlIHRoZSBidWZmZXIsIHNpbmNlIGl0J3Mgb3VycyAqLwotCVNETF9tZW1zZXQoc3RyZWFtLCBhdWRpby0+c3BlYy5zaWxlbmNlLCBsZW4pOwotCi0JLyogT25seSBkbyBzb2VtdGhpbmcgaWYgYXVkaW8gaXMgZW5hYmxlZCAqLwotCWlmICggISBhdWRpby0+ZW5hYmxlZCApCi0JCXJldHVybjsKLQotCWlmICggISBhdWRpby0+cGF1c2VkICkgewotCQlpZiAoIGF1ZGlvLT5jb252ZXJ0Lm5lZWRlZCApIHsKLQkJCVNETF9tdXRleFAoYXVkaW8tPm1peGVyX2xvY2spOwotCQkJKCphdWRpby0+c3BlYy5jYWxsYmFjaykoYXVkaW8tPnNwZWMudXNlcmRhdGEsCi0JCQkJKFVpbnQ4ICopYXVkaW8tPmNvbnZlcnQuYnVmLGF1ZGlvLT5jb252ZXJ0Lmxlbik7Ci0JCQlTRExfbXV0ZXhWKGF1ZGlvLT5taXhlcl9sb2NrKTsKLQkJCVNETF9Db252ZXJ0QXVkaW8oJmF1ZGlvLT5jb252ZXJ0KTsKLQkJCVNETF9tZW1jcHkoc3RyZWFtLGF1ZGlvLT5jb252ZXJ0LmJ1ZixhdWRpby0+Y29udmVydC5sZW5fY3Z0KTsKLQkJfSBlbHNlIHsKLQkJCVNETF9tdXRleFAoYXVkaW8tPm1peGVyX2xvY2spOwotCQkJKCphdWRpby0+c3BlYy5jYWxsYmFjaykoYXVkaW8tPnNwZWMudXNlcmRhdGEsCi0JCQkJCQkoVWludDggKilzdHJlYW0sIGxlbik7Ci0JCQlTRExfbXV0ZXhWKGF1ZGlvLT5taXhlcl9sb2NrKTsKLQkJfQotCX0KLQlyZXR1cm47Ci19Ci0KLS8qIER1bW15IGZ1bmN0aW9ucyAtLSB3ZSBkb24ndCB1c2UgdGhyZWFkLWJhc2VkIGF1ZGlvICovCi12b2lkIEJFX1dhaXRBdWRpbyhfVEhJUykKLXsKLQlyZXR1cm47Ci19Ci12b2lkIEJFX1BsYXlBdWRpbyhfVEhJUykKLXsKLQlyZXR1cm47Ci19Ci1VaW50OCAqQkVfR2V0QXVkaW9CdWYoX1RISVMpCi17Ci0JcmV0dXJuKE5VTEwpOwotfQotCi12b2lkIEJFX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0JaWYgKCBhdWRpb19vYmogKSB7Ci0JCWF1ZGlvX29iai0+U3RvcCgpOwotCQlkZWxldGUgYXVkaW9fb2JqOwotCQlhdWRpb19vYmogPSBOVUxMOwotCX0KLQotCS8qIFF1aXQgdGhlIEJlIEFwcGxpY2F0aW9uLCBpZiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyAqLwotCVNETF9RdWl0QmVBcHAoKTsKLX0KLQotaW50IEJFX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLSAgICBpbnQgdmFsaWRfZGF0YXR5cGUgPSAwOwotICAgIG1lZGlhX3Jhd19hdWRpb19mb3JtYXQgZm9ybWF0OwotICAgIFVpbnQxNiB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7Ci0KLSAgICAvKiBQYXJzZSB0aGUgYXVkaW8gZm9ybWF0IGFuZCBmaWxsIHRoZSBCZSByYXcgYXVkaW8gZm9ybWF0ICovCi0gICAgbWVtc2V0KCZmb3JtYXQsICdcMCcsIHNpemVvZiAobWVkaWFfcmF3X2F1ZGlvX2Zvcm1hdCkpOwotICAgIGZvcm1hdC5ieXRlX29yZGVyID0gQl9NRURJQV9MSVRUTEVfRU5ESUFOOwotICAgIGZvcm1hdC5mcmFtZV9yYXRlID0gKGZsb2F0KSBzcGVjLT5mcmVxOwotICAgIGZvcm1hdC5jaGFubmVsX2NvdW50ID0gc3BlYy0+Y2hhbm5lbHM7ICAvKiAhISEgRklYTUU6IHN1cHBvcnQgPiAyPyAqLwotICAgIHdoaWxlICgoIXZhbGlkX2RhdGF0eXBlKSAmJiAodGVzdF9mb3JtYXQpKSB7Ci0gICAgICAgIHZhbGlkX2RhdGF0eXBlID0gMTsKLSAgICAgICAgc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7Ci0gICAgICAgIHN3aXRjaCAodGVzdF9mb3JtYXQpIHsKLSAgICAgICAgICAgIGNhc2UgQVVESU9fUzg6Ci0gICAgICAgICAgICAgICAgZm9ybWF0LmZvcm1hdCA9IG1lZGlhX3Jhd19hdWRpb19mb3JtYXQ6OkJfQVVESU9fQ0hBUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBBVURJT19VODoKLSAgICAgICAgICAgICAgICBmb3JtYXQuZm9ybWF0ID0gbWVkaWFfcmF3X2F1ZGlvX2Zvcm1hdDo6Ql9BVURJT19VQ0hBUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBBVURJT19TMTZMU0I6Ci0gICAgICAgICAgICAgICAgZm9ybWF0LmZvcm1hdCA9IG1lZGlhX3Jhd19hdWRpb19mb3JtYXQ6OkJfQVVESU9fU0hPUlQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQVVESU9fUzE2TVNCOgotICAgICAgICAgICAgICAgIGZvcm1hdC5mb3JtYXQgPSBtZWRpYV9yYXdfYXVkaW9fZm9ybWF0OjpCX0FVRElPX1NIT1JUOwotICAgICAgICAgICAgICAgIGZvcm1hdC5ieXRlX29yZGVyID0gQl9NRURJQV9CSUdfRU5ESUFOOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHZhbGlkX2RhdGF0eXBlID0gMDsKLSAgICAgICAgICAgICAgICB0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghdmFsaWRfZGF0YXR5cGUpIHsgLyogc2hvdWxkbid0IGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZS4uLiAqLwotICAgICAgICBTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwotICAgICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBCZSBBcHBsaWNhdGlvbiwgaWYgaXQncyBub3QgYWxyZWFkeSBzdGFydGVkICovCi0gICAgaWYgKFNETF9Jbml0QmVBcHAoKSA8IDApIHsKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotCi0gICAgZm9ybWF0LmJ1ZmZlcl9zaXplID0gc3BlYy0+c2FtcGxlczsKLQotCS8qIENhbGN1bGF0ZSB0aGUgZmluYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBhdWRpbyBzcGVjaWZpY2F0aW9uICovCi0JU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKLQotCS8qIFN1YnNjcmliZSB0byB0aGUgYXVkaW8gc3RyZWFtIChjcmVhdGVzIGEgbmV3IHRocmVhZCkgKi8KLQl7IHNpZ3NldF90IG9tYXNrOwotCQlTRExfTWFza1NpZ25hbHMoJm9tYXNrKTsKLQkJYXVkaW9fb2JqID0gbmV3IEJTb3VuZFBsYXllcigmZm9ybWF0LCAiU0RMIEF1ZGlvIiwgRmlsbFNvdW5kLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgX3RoaXMpOwotCQlTRExfVW5tYXNrU2lnbmFscygmb21hc2spOwotCX0KLQlpZiAoIGF1ZGlvX29iai0+U3RhcnQoKSA9PSBCX05PX0VSUk9SICkgewotCQlhdWRpb19vYmotPlNldEhhc0RhdGEodHJ1ZSk7Ci0JfSBlbHNlIHsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gc3RhcnQgQmUgYXVkaW8iKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBXZSdyZSBydW5uaW5nISAqLwotCXJldHVybigxKTsKLX0KLQotfTsJLyogRXh0ZXJuIEMgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vYmF1ZGlvL1NETF9iZWF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2JhdWRpby9TRExfYmVhdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDJjNjBlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vYmF1ZGlvL1NETF9iZWF1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2xvd2F1ZGlvX2gKLSNkZWZpbmUgX1NETF9sb3dhdWRpb19oCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqX3RoaXMKLQotc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKLQlCU291bmRQbGF5ZXIgKmF1ZGlvX29iajsKLX07Ci0KLS8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLwotI2RlZmluZSBhdWRpb19vYmoJKF90aGlzLT5oaWRkZW4tPmF1ZGlvX29iaikKLQotI2VuZGlmIC8qIF9TRExfbG93YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9ic2QvU0RMX2JzZGF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2JzZC9TRExfYnNkYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5NDZjMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2JzZC9TRExfYnNkYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAqIERyaXZlciBmb3IgbmF0aXZlIE9wZW5CU0QvTmV0QlNEIGF1ZGlvKDQpLgotICogdmVkZ2VAdmVkZ2UuY29tLmFyLgotICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9hdWRpb2lvLmg+Ci0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCi0jaW5jbHVkZSAiU0RMX2JzZGF1ZGlvLmgiCi0KLS8qIFRoZSB0YWcgbmFtZSB1c2VkIGJ5IE5ldEJTRC9PcGVuQlNEIGF1ZGlvICovCi0jaWZkZWYgX19OZXRCU0RfXwotI2RlZmluZSBCU0RfQVVESU9fRFJJVkVSX05BTUUgICAgICAgICAibmV0YnNkIgotI2RlZmluZSBCU0RfQVVESU9fRFJJVkVSX0RFU0MgICAgICAgICAiTmF0aXZlIE5ldEJTRCBhdWRpbyIKLSNlbHNlCi0jZGVmaW5lIEJTRF9BVURJT19EUklWRVJfTkFNRSAgICAgICAgICJvcGVuYnNkIgotI2RlZmluZSBCU0RfQVVESU9fRFJJVkVSX0RFU0MgICAgICAgICAiTmF0aXZlIE9wZW5CU0QgYXVkaW8iCi0jZW5kaWYKLQotLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjaywgYW5kIGRvbid0IGJsb2NrIGlmIGJ1c3kgKi8KLS8qICNkZWZpbmUgVVNFX0JMT0NLSU5HX1dSSVRFUyAqLwotCi0vKiBVc2UgdGltZXIgZm9yIHN5bmNocm9uaXphdGlvbiAqLwotLyogI2RlZmluZSBVU0VfVElNRVJfU1lOQyAqLwotCi0vKiAjZGVmaW5lIERFQlVHX0FVRElPICovCi0vKiAjZGVmaW5lIERFQlVHX0FVRElPX1NUUkVBTSAqLwotCi0jaWZkZWYgVVNFX0JMT0NLSU5HX1dSSVRFUwotI2RlZmluZSBPUEVOX0ZMQUdTCU9fV1JPTkxZCi0jZWxzZQotI2RlZmluZSBPUEVOX0ZMQUdTCShPX1dST05MWXxPX05PTkJMT0NLKQotI2VuZGlmCi0KLS8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIE9CU0RfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyBpbnQgT0JTRF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgT0JTRF9QbGF5QXVkaW8oX1RISVMpOwotc3RhdGljIFVpbnQ4ICpPQlNEX0dldEF1ZGlvQnVmKF9USElTKTsKLXN0YXRpYyB2b2lkIE9CU0RfQ2xvc2VBdWRpbyhfVEhJUyk7Ci0KLSNpZmRlZiBERUJVR19BVURJTwotc3RhdGljIHZvaWQgT0JTRF9TdGF0dXMoX1RISVMpOwotI2VuZGlmCi0KLS8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBpbnQKLUF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotICAgIGludCBmZDsKLSAgICBpbnQgYXZhaWxhYmxlOwotCi0gICAgYXZhaWxhYmxlID0gMDsKLSAgICBmZCA9IFNETF9PcGVuQXVkaW9QYXRoKE5VTEwsIDAsIE9QRU5fRkxBR1MsIDApOwotICAgIGlmKGZkID49IDApIHsKLQlhdmFpbGFibGUgPSAxOwotCWNsb3NlKGZkKTsKLSAgICB9Ci0gICAgcmV0dXJuKGF2YWlsYWJsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1BdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0gICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotICAgIFNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfQXVkaW9EZXZpY2UKLSpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotICAgIFNETF9BdWRpb0RldmljZSAqdGhpczsKLQotICAgIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0gICAgdGhpcyA9IChTRExfQXVkaW9EZXZpY2UqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotICAgIGlmKHRoaXMpIHsKLQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKLQl0aGlzLT5oaWRkZW4gPQotCSAgICAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhKilTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotICAgIH0KLSAgICBpZigodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpKSB7Ci0JU0RMX091dE9mTWVtb3J5KCk7Ci0JaWYodGhpcykgU0RMX2ZyZWUodGhpcyk7Ci0JcmV0dXJuKDApOwotICAgIH0KLSAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0gICAgYXVkaW9fZmQgPSAtMTsKLQotICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgICB0aGlzLT5PcGVuQXVkaW8gPSBPQlNEX09wZW5BdWRpbzsKLSAgICB0aGlzLT5XYWl0QXVkaW8gPSBPQlNEX1dhaXRBdWRpbzsKLSAgICB0aGlzLT5QbGF5QXVkaW8gPSBPQlNEX1BsYXlBdWRpbzsKLSAgICB0aGlzLT5HZXRBdWRpb0J1ZiA9IE9CU0RfR2V0QXVkaW9CdWY7Ci0gICAgdGhpcy0+Q2xvc2VBdWRpbyA9IE9CU0RfQ2xvc2VBdWRpbzsKLQotICAgIHRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIEJTRF9BVURJT19ib290c3RyYXAgPSB7Ci0JQlNEX0FVRElPX0RSSVZFUl9OQU1FLCBCU0RfQVVESU9fRFJJVkVSX0RFU0MsCi0JQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KLS8qIFRoaXMgZnVuY3Rpb24gd2FpdHMgdW50aWwgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgYSBmdWxsIHNvdW5kIGJ1ZmZlciAqLwotc3RhdGljIHZvaWQKLU9CU0RfV2FpdEF1ZGlvKF9USElTKQotewotI2lmbmRlZiBVU0VfQkxPQ0tJTkdfV1JJVEVTIC8qIE5vdCBuZWNlc3Nhcnkgd2hlbiB1c2luZyBibG9ja2luZyB3cml0ZXMgKi8KLQkvKiBTZWUgaWYgd2UgbmVlZCB0byB1c2UgdGltZWQgYXVkaW8gc3luY2hyb25pemF0aW9uICovCi0JaWYgKCBmcmFtZV90aWNrcyApIHsKLQkJLyogVXNlIHRpbWVyIGZvciBnZW5lcmFsIGF1ZGlvIHN5bmNocm9uaXphdGlvbiAqLwotCQlTaW50MzIgdGlja3M7Ci0KLQkJdGlja3MgPSAoKFNpbnQzMikobmV4dF9mcmFtZSAtIFNETF9HZXRUaWNrcygpKSktRlVER0VfVElDS1M7Ci0JCWlmICggdGlja3MgPiAwICkgewotCQkJU0RMX0RlbGF5KHRpY2tzKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFVzZSBzZWxlY3QoKSBmb3IgYXVkaW8gc3luY2hyb25pemF0aW9uICovCi0JCWZkX3NldCBmZHNldDsKLQkJc3RydWN0IHRpbWV2YWwgdGltZW91dDsKLQotCQlGRF9aRVJPKCZmZHNldCk7Ci0JCUZEX1NFVChhdWRpb19mZCwgJmZkc2V0KTsKLQkJdGltZW91dC50dl9zZWMgPSAxMDsKLQkJdGltZW91dC50dl91c2VjID0gMDsKLSNpZmRlZiBERUJVR19BVURJTwotCQlmcHJpbnRmKHN0ZGVyciwgIldhaXRpbmcgZm9yIGF1ZGlvIHRvIGdldCByZWFkeVxuIik7Ci0jZW5kaWYKLQkJaWYgKCBzZWxlY3QoYXVkaW9fZmQrMSwgTlVMTCwgJmZkc2V0LCBOVUxMLCAmdGltZW91dCkgPD0gMCApIHsKLQkJCWNvbnN0IGNoYXIgKm1lc3NhZ2UgPQotCQkJIkF1ZGlvIHRpbWVvdXQgLSBidWdneSBhdWRpbyBkcml2ZXI/IChkaXNhYmxlZCkiOwotCQkJLyogSW4gZ2VuZXJhbCB3ZSBzaG91bGQgbmV2ZXIgcHJpbnQgdG8gdGhlIHNjcmVlbiwKLQkJCSAgIGJ1dCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSBubyBvdGhlciB3YXkgb2YgbGV0dGluZwotCQkJICAgdGhlIHVzZXIga25vdyB3aGF0IGhhcHBlbmVkLgotCQkJKi8KLQkJCWZwcmludGYoc3RkZXJyLCAiU0RMOiAlc1xuIiwgbWVzc2FnZSk7Ci0JCQl0aGlzLT5lbmFibGVkID0gMDsKLQkJCS8qIERvbid0IHRyeSB0byBjbG9zZSAtIG1heSBoYW5nICovCi0JCQlhdWRpb19mZCA9IC0xOwotI2lmZGVmIERFQlVHX0FVRElPCi0JCQlmcHJpbnRmKHN0ZGVyciwgIkRvbmUgZGlzYWJsaW5nIGF1ZGlvXG4iKTsKLSNlbmRpZgotCQl9Ci0jaWZkZWYgREVCVUdfQVVESU8KLQkJZnByaW50ZihzdGRlcnIsICJSZWFkeSFcbiIpOwotI2VuZGlmCi0JfQotI2VuZGlmIC8qICFVU0VfQkxPQ0tJTkdfV1JJVEVTICovCi19Ci0KLXN0YXRpYyB2b2lkCi1PQlNEX1BsYXlBdWRpbyhfVEhJUykKLXsKLQlpbnQgd3JpdHRlbiwgcD0wOwotCi0JLyogV3JpdGUgdGhlIGF1ZGlvIGRhdGEsIGNoZWNraW5nIGZvciBFQUdBSU4gb24gYnJva2VuIGF1ZGlvIGRyaXZlcnMgKi8KLQlkbyB7Ci0JCXdyaXR0ZW4gPSB3cml0ZShhdWRpb19mZCwgJm1peGJ1ZltwXSwgbWl4bGVuLXApOwotCQlpZiAod3JpdHRlbj4wKQotCQkgICBwICs9IHdyaXR0ZW47Ci0JCWlmICh3cml0dGVuID09IC0xICYmIGVycm5vICE9IDAgJiYgZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9IEVJTlRSKQotCQl7Ci0JCSAgIC8qIE5vbiByZWNvdmVyYWJsZSBlcnJvciBoYXMgb2NjdXJyZWQuIEl0IHNob3VsZCBiZSByZXBvcnRlZCEhISAqLwotCQkgICBwZXJyb3IoImF1ZGlvIik7Ci0JCSAgIGJyZWFrOwotCQl9Ci0KLQkJaWYgKCBwIDwgd3JpdHRlbiB8fCAoKHdyaXR0ZW4gPCAwKSAmJiAoKGVycm5vID09IDApIHx8IChlcnJubyA9PSBFQUdBSU4pKSkgKSB7Ci0JCQlTRExfRGVsYXkoMSk7CS8qIExldCBhIGxpdHRsZSBDUFUgdGltZSBnbyBieSAqLwotCQl9Ci0JfSB3aGlsZSAoIHAgPCB3cml0dGVuICk7Ci0KLQkvKiBJZiB0aW1lciBzeW5jaHJvbml6YXRpb24gaXMgZW5hYmxlZCwgc2V0IHRoZSBuZXh0IHdyaXRlIGZyYW1lICovCi0JaWYgKCBmcmFtZV90aWNrcyApIHsKLQkJbmV4dF9mcmFtZSArPSBmcmFtZV90aWNrczsKLQl9Ci0KLQkvKiBJZiB3ZSBjb3VsZG4ndCB3cml0ZSwgYXNzdW1lIGZhdGFsIGVycm9yIGZvciBub3cgKi8KLQlpZiAoIHdyaXR0ZW4gPCAwICkgewotCQl0aGlzLT5lbmFibGVkID0gMDsKLQl9Ci0jaWZkZWYgREVCVUdfQVVESU8KLQlmcHJpbnRmKHN0ZGVyciwgIldyb3RlICVkIGJ5dGVzIG9mIGF1ZGlvIGRhdGFcbiIsIHdyaXR0ZW4pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBVaW50OAotKk9CU0RfR2V0QXVkaW9CdWYoX1RISVMpCi17Ci0gICAgcmV0dXJuKG1peGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PQlNEX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0gICAgaWYobWl4YnVmICE9IE5VTEwpIHsKLQlTRExfRnJlZUF1ZGlvTWVtKG1peGJ1Zik7Ci0JbWl4YnVmID0gTlVMTDsKLSAgICB9Ci0gICAgaWYoYXVkaW9fZmQgPj0gMCkgewotCWNsb3NlKGF1ZGlvX2ZkKTsKLQlhdWRpb19mZCA9IC0xOwotICAgIH0KLX0KLQotI2lmZGVmIERFQlVHX0FVRElPCi12b2lkCi1PQlNEX1N0YXR1cyhfVEhJUykKLXsKLSAgICBhdWRpb19pbmZvX3QgaW5mbzsKLQotICAgIGlmKGlvY3RsKGF1ZGlvX2ZkLCBBVURJT19HRVRJTkZPLCAmaW5mbykgPCAwKSB7Ci0JZnByaW50ZihzdGRlcnIsIkFVRElPX0dFVElORk8gZmFpbGVkLlxuIik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGZwcmludGYoc3RkZXJyLCJcbiIKLSJbcGxheS9yZWNvcmQgaW5mb11cbiIKLSJidWZmZXIgc2l6ZQk6ICAgJWQgYnl0ZXNcbiIKLSJzYW1wbGUgcmF0ZQk6ICAgJWkgSHpcbiIKLSJjaGFubmVscwk6ICAgJWlcbiIKLSJwcmVjaXNpb24JOiAgICVpLWJpdFxuIgotImVuY29kaW5nCTogICAweCV4XG4iCi0ic2VlawkJOiAgICVpXG4iCi0ic2FtcGxlIGNvdW50CTogICAlaVxuIgotIkVPRiBjb3VudAk6ICAgJWlcbiIKLSJwYXVzZWQJCTogICAlc1xuIgotImVycm9yIG9jY3VyZWQJOiAgICVzXG4iCi0id2FpdGluZwkJOiAgICVzXG4iCi0iYWN0aXZlCQk6ICAgJXNcbiIKLSIiLAotICAgIGluZm8ucGxheS5idWZmZXJfc2l6ZSwKLSAgICBpbmZvLnBsYXkuc2FtcGxlX3JhdGUsCi0gICAgaW5mby5wbGF5LmNoYW5uZWxzLAotICAgIGluZm8ucGxheS5wcmVjaXNpb24sCi0gICAgaW5mby5wbGF5LmVuY29kaW5nLAotICAgIGluZm8ucGxheS5zZWVrLAotICAgIGluZm8ucGxheS5zYW1wbGVzLAotICAgIGluZm8ucGxheS5lb2YsCi0gICAgaW5mby5wbGF5LnBhdXNlID8gInllcyIgOiAibm8iLAotICAgIGluZm8ucGxheS5lcnJvciA/ICJ5ZXMiIDogIm5vIiwKLSAgICBpbmZvLnBsYXkud2FpdGluZyA/ICJ5ZXMiIDogIm5vIiwKLSAgICBpbmZvLnBsYXkuYWN0aXZlID8gInllcyI6ICJubyIpOwotCi0gICAgZnByaW50ZihzdGRlcnIsIlxuIgotIlthdWRpbyBpbmZvXVxuIgotIm1vbml0b3JfZ2Fpbgk6ICAgJWlcbiIKLSJodyBibG9jayBzaXplCTogICAlZCBieXRlc1xuIgotImhpIHdhdGVybWFyawk6ICAgJWlcbiIKLSJsbyB3YXRlcm1hcmsJOiAgICVpXG4iCi0iYXVkaW8gbW9kZQk6ICAgJXNcbiIKLSIiLCAgCi0gICAgaW5mby5tb25pdG9yX2dhaW4sCi0gICAgaW5mby5ibG9ja3NpemUsCi0gICAgaW5mby5oaXdhdCwgaW5mby5sb3dhdCwKLSAgICAoaW5mby5tb2RlID09IEFVTU9ERV9QTEFZKSA/ICJQTEFZIgotICAgIDogKGluZm8ubW9kZSA9IEFVTU9ERV9SRUNPUkQpID8gIlJFQ09SRCIKLSAgICA6IChpbmZvLm1vZGUgPT0gQVVNT0RFX1BMQVlfQUxMID8gIlBMQVlfQUxMIgotICAgIDogIj8iKSk7Ci19Ci0jZW5kaWYgLyogREVCVUdfQVVESU8gKi8KLQotc3RhdGljIGludAotT0JTRF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0gICAgY2hhciBhdWRpb2Rldls2NF07Ci0gICAgVWludDE2IGZvcm1hdDsKLSAgICBhdWRpb19pbmZvX3QgaW5mbzsKLQotICAgIEFVRElPX0lOSVRJTkZPKCZpbmZvKTsKLSAgICAKLSAgICAvKiBDYWxjdWxhdGUgdGhlIGZpbmFsIHBhcmFtZXRlcnMgZm9yIHRoaXMgYXVkaW8gc3BlY2lmaWNhdGlvbiAqLwotICAgIFNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7Ci0KLSNpZmRlZiBVU0VfVElNRVJfU1lOQwotICAgIGZyYW1lX3RpY2tzID0gMC4wOwotI2VuZGlmCi0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KLSAgICBhdWRpb19mZCA9IFNETF9PcGVuQXVkaW9QYXRoKGF1ZGlvZGV2LCBzaXplb2YoYXVkaW9kZXYpLCBPUEVOX0ZMQUdTLCAwKTsKLSAgICBpZihhdWRpb19mZCA8IDApIHsKLQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gJXM6ICVzIiwgYXVkaW9kZXYsIHN0cmVycm9yKGVycm5vKSk7Ci0JcmV0dXJuKC0xKTsKLSAgICB9Ci0gICAgCi0gICAgLyogU2V0IHRvIHBsYXkgbW9kZSAqLwotICAgIGluZm8ubW9kZSA9IEFVTU9ERV9QTEFZOwotICAgIGlmKGlvY3RsKGF1ZGlvX2ZkLCBBVURJT19TRVRJTkZPLCAmaW5mbykgPCAwKSB7Ci0JU0RMX1NldEVycm9yKCJDb3VsZG4ndCBwdXQgZGV2aWNlIGludG8gcGxheSBtb2RlIik7Ci0JcmV0dXJuKC0xKTsKLSAgICB9Ci0gICAgCi0gICAgbWl4YnVmID0gTlVMTDsKLSAgICBBVURJT19JTklUSU5GTygmaW5mbyk7Ci0gICAgZm9yIChmb3JtYXQgPSBTRExfRmlyc3RBdWRpb0Zvcm1hdChzcGVjLT5mb3JtYXQpOyAKLSAgICAJZm9ybWF0OyBmb3JtYXQgPSBTRExfTmV4dEF1ZGlvRm9ybWF0KCkpCi0gICAgewotCXN3aXRjaChmb3JtYXQpIHsKLQljYXNlIEFVRElPX1U4OgotCSAgICBpbmZvLnBsYXkuZW5jb2RpbmcgPSBBVURJT19FTkNPRElOR19VTElORUFSOwotCSAgICBpbmZvLnBsYXkucHJlY2lzaW9uID0gODsKLQkgICAgYnJlYWs7Ci0JY2FzZSBBVURJT19TODoKLQkgICAgaW5mby5wbGF5LmVuY29kaW5nID0gQVVESU9fRU5DT0RJTkdfU0xJTkVBUjsKLQkgICAgaW5mby5wbGF5LnByZWNpc2lvbiA9IDg7Ci0JICAgIGJyZWFrOwotCWNhc2UgQVVESU9fUzE2TFNCOgotCSAgICBpbmZvLnBsYXkuZW5jb2RpbmcgPSBBVURJT19FTkNPRElOR19TTElORUFSX0xFOwotCSAgICBpbmZvLnBsYXkucHJlY2lzaW9uID0gMTY7Ci0JICAgIGJyZWFrOwotCWNhc2UgQVVESU9fUzE2TVNCOgotCSAgICBpbmZvLnBsYXkuZW5jb2RpbmcgPSBBVURJT19FTkNPRElOR19TTElORUFSX0JFOwotCSAgICBpbmZvLnBsYXkucHJlY2lzaW9uID0gMTY7Ci0JICAgIGJyZWFrOwotCWNhc2UgQVVESU9fVTE2TFNCOgotCSAgICBpbmZvLnBsYXkuZW5jb2RpbmcgPSBBVURJT19FTkNPRElOR19VTElORUFSX0xFOwotCSAgICBpbmZvLnBsYXkucHJlY2lzaW9uID0gMTY7Ci0JICAgIGJyZWFrOwotCWNhc2UgQVVESU9fVTE2TVNCOgotCSAgICBpbmZvLnBsYXkuZW5jb2RpbmcgPSBBVURJT19FTkNPRElOR19VTElORUFSX0JFOwotCSAgICBpbmZvLnBsYXkucHJlY2lzaW9uID0gMTY7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoaW9jdGwoYXVkaW9fZmQsIEFVRElPX1NFVElORk8sICZpbmZvKSA9PSAwKQotCSAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZighZm9ybWF0KSB7Ci0JU0RMX1NldEVycm9yKCJObyBzdXBwb3J0ZWQgZW5jb2RpbmcgZm9yIDB4JXgiLCBzcGVjLT5mb3JtYXQpOwotCXJldHVybigtMSk7Ci0gICAgfQotCi0gICAgc3BlYy0+Zm9ybWF0ID0gZm9ybWF0OwotCi0gICAgQVVESU9fSU5JVElORk8oJmluZm8pOwotICAgIGluZm8ucGxheS5jaGFubmVscyA9IHNwZWMtPmNoYW5uZWxzOwotICAgIGlmIChpb2N0bChhdWRpb19mZCwgQVVESU9fU0VUSU5GTywgJmluZm8pID09IC0xKQotICAgIAlzcGVjLT5jaGFubmVscyA9IDE7Ci0gICAgQVVESU9fSU5JVElORk8oJmluZm8pOwotICAgIGluZm8ucGxheS5zYW1wbGVfcmF0ZSA9IHNwZWMtPmZyZXE7Ci0gICAgaW5mby5ibG9ja3NpemUgPSBzcGVjLT5zaXplOwotICAgIGluZm8uaGl3YXQgPSA1OwotICAgIGluZm8ubG93YXQgPSAzOwotICAgICh2b2lkKWlvY3RsKGF1ZGlvX2ZkLCBBVURJT19TRVRJTkZPLCAmaW5mbyk7Ci0gICAgKHZvaWQpaW9jdGwoYXVkaW9fZmQsIEFVRElPX0dFVElORk8sICZpbmZvKTsKLSAgICBzcGVjLT5mcmVxICA9IGluZm8ucGxheS5zYW1wbGVfcmF0ZTsKLSAgICAvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCi0gICAgbWl4bGVuID0gc3BlYy0+c2l6ZTsKLSAgICBtaXhidWYgPSAoVWludDgqKVNETF9BbGxvY0F1ZGlvTWVtKG1peGxlbik7Ci0gICAgaWYobWl4YnVmID09IE5VTEwpIHsKLQlyZXR1cm4oLTEpOwotICAgIH0KLSAgICBTRExfbWVtc2V0KG1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7Ci0gICAgCi0gICAgLyogR2V0IHRoZSBwYXJlbnQgcHJvY2VzcyBpZCAod2UncmUgdGhlIHBhcmVudCBvZiB0aGUgYXVkaW8gdGhyZWFkKSAqLwotICAgIHBhcmVudCA9IGdldHBpZCgpOwotCi0jaWZkZWYgREVCVUdfQVVESU8KLSAgICBPQlNEX1N0YXR1cyh0aGlzKTsKLSNlbmRpZgotCi0gICAgLyogV2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCi0gICAgcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9ic2QvU0RMX2JzZGF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2JzZC9TRExfYnNkYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4ZGI4OS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2JzZC9TRExfYnNkYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfb3BlbmJzZGF1ZGlvX2gKLSNkZWZpbmUgX1NETF9vcGVuYnNkYXVkaW9faAotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCi0KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YQotewotICAgIC8qIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBhdWRpbyBkZXZpY2UgKi8KLSAgICBpbnQgYXVkaW9fZmQ7Ci0KLSAgICAvKiBUaGUgcGFyZW50IHByb2Nlc3MgaWQsIHRvIGRldGVjdCB3aGVuIGFwcGxpY2F0aW9uIHF1aXRzICovCi0gICAgcGlkX3QgcGFyZW50OwotCi0gICAgLyogUmF3IG1peGluZyBidWZmZXIgKi8KLSAgICBVaW50OCAqbWl4YnVmOwotICAgIGludCAgICBtaXhsZW47Ci0KLSAgICAvKiBTdXBwb3J0IGZvciBhdWRpbyB0aW1pbmcgdXNpbmcgYSB0aW1lciwgaW4gYWRkaXRpb24gdG8gc2VsZWN0KCkgKi8KLSAgICBmbG9hdCBmcmFtZV90aWNrczsKLSAgICBmbG9hdCBuZXh0X2ZyYW1lOwotfTsKLQotI2RlZmluZSBGVURHRV9USUNLUwkxMAkvKiBUaGUgc2NoZWR1bGVyIG92ZXJoZWFkIHRpY2tzIHBlciBmcmFtZSAqLwotCi0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgYXVkaW9fZmQJCSh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkKQotI2RlZmluZSBwYXJlbnQJCQkodGhpcy0+aGlkZGVuLT5wYXJlbnQpCi0jZGVmaW5lIG1peGJ1ZgkJCSh0aGlzLT5oaWRkZW4tPm1peGJ1ZikKLSNkZWZpbmUgbWl4bGVuCQkJKHRoaXMtPmhpZGRlbi0+bWl4bGVuKQotI2RlZmluZSBmcmFtZV90aWNrcwkJKHRoaXMtPmhpZGRlbi0+ZnJhbWVfdGlja3MpCi0jZGVmaW5lIG5leHRfZnJhbWUJCSh0aGlzLT5oaWRkZW4tPm5leHRfZnJhbWUpCi0KLSNlbmRpZiAvKiBfU0RMX29wZW5ic2RhdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RhcnQvU0RMX2RhcnQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGFydC9TRExfZGFydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzdhNWUyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGFydC9TRExfZGFydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLwotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICJTRExfZGFydC5oIgotCi0vLyBCdWZmZXIgc3RhdGVzOgotI2RlZmluZSBCVUZGRVJfRU1QVFkgICAgICAgMAotI2RlZmluZSBCVUZGRVJfVVNFRCAgICAgICAgMQotCi10eXBlZGVmIHN0cnVjdCBfdE1peEJ1ZmZlckRlc2MgewotICBpbnQgICAgICAgICAgICAgIGlCdWZmZXJVc2FnZTsgICAgICAvLyBCVUZGRVJfRU1QVFkgb3IgQlVGRkVSX1VTRUQKLSAgU0RMX0F1ZGlvRGV2aWNlICpwU0RMQXVkaW9EZXZpY2U7Ci19IHRNaXhCdWZmZXJEZXNjLCAqcE1peEJ1ZmZlckRlc2M7Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERBUlRFdmVudEZ1bmMKLS8vCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBEQVJULCB3aGVuIGFuIGV2ZW50IG9jY3VyZXMsIGxpa2UgZW5kIG9mIAotLy8gcGxheWJhY2sgb2YgYSBidWZmZXIsIGV0Yy4uLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxPTkcgQVBJRU5UUlkgREFSVEV2ZW50RnVuYyhVTE9ORyB1bFN0YXR1cywKLQkJCSAgICBQTUNJX01JWF9CVUZGRVIgcEJ1ZmZlciwKLQkJCSAgICBVTE9ORyB1bEZsYWdzKQotewotICBpZiAodWxGbGFncyAmJiBNSVhfV1JJVEVfQ09NUExFVEUpCi0gIHsgLy8gUGxheWJhY2sgb2YgYnVmZmVyIGNvbXBsZXRlZCEKLQotICAgIC8vIEdldCBwb2ludGVyIHRvIGJ1ZmZlciBkZXNjcmlwdGlvbgotICAgIHBNaXhCdWZmZXJEZXNjIHBCdWZEZXNjOwotCi0gICAgaWYgKHBCdWZmZXIpCi0gICAgewotICAgICAgcEJ1ZkRlc2MgPSAocE1peEJ1ZmZlckRlc2MpICgqcEJ1ZmZlcikudWxVc2VyUGFybTsKLQotICAgICAgaWYgKHBCdWZEZXNjKQotICAgICAgewotICAgICAgICBTRExfQXVkaW9EZXZpY2UgKnBTRExBdWRpb0RldmljZSA9IHBCdWZEZXNjLT5wU0RMQXVkaW9EZXZpY2U7Ci0gICAgICAgIC8vIFNldCB0aGUgYnVmZmVyIHRvIGJlIGVtcHR5Ci0gICAgICAgIHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgPSBCVUZGRVJfRU1QVFk7Ci0gICAgICAgIC8vIEFuZCBub3RpZnkgREFSVCBmZWVkZXIgdGhyZWFkIHRoYXQgaXQgd2lsbCBoYXZlIHRvIHdvcmsgYSBiaXQuCi0gICAgICAgIGlmIChwU0RMQXVkaW9EZXZpY2UpCi0gICAgICAgIERvc1Bvc3RFdmVudFNlbShwU0RMQXVkaW9EZXZpY2UtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQpOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gVFJVRTsKLX0KLQotCi1pbnQgREFSVF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0gIFVpbnQxNiB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7Ci0gIGludCB2YWxpZF9kYXRhdHlwZSA9IDA7Ci0gIE1DSV9BTVBfT1BFTl9QQVJNUyBBbXBPcGVuUGFybXM7Ci0gIE1DSV9HRU5FUklDX1BBUk1TIEdlbmVyaWNQYXJtczsKLSAgaW50IGlEZXZpY2VPcmQgPSAwOyAvLyBEZWZhdWx0IGRldmljZSB0byBiZSB1c2VkCi0gIGludCBiT3BlblNoYXJlZCA9IDE7IC8vIFRyeSBvcGVuaW5nIGl0IHNoYXJlZAotICBpbnQgaUJpdHMgPSAxNjsgLy8gRGVmYXVsdCBpcyAxNiBiaXRzIHNpZ25lZAotICBpbnQgaUZyZXEgPSA0NDEwMDsgLy8gRGVmYXVsdCBpcyA0NEtIegotICBpbnQgaUNoYW5uZWxzID0gMjsgLy8gRGVmYXVsdCBpcyAyIGNoYW5uZWxzIChTdGVyZW8pCi0gIGludCBpTnVtQnVmcyA9IDI7ICAvLyBOdW1iZXIgb2YgYXVkaW8gYnVmZmVyczogMgotICBpbnQgaUJ1ZlNpemU7Ci0gIGludCBpT3Blbk1vZGU7Ci0gIGludCBpU2lsZW5jZTsKLSAgaW50IHJjOwotCi0gIC8vIEZpcnN0IHRoaW5nIGlzIHRvIHRyeSB0byBvcGVuIGEgZ2l2ZW4gREFSVCBkZXZpY2UhCi0gIFNETF9tZW1zZXQoJkFtcE9wZW5QYXJtcywgMCwgc2l6ZW9mKE1DSV9BTVBfT1BFTl9QQVJNUykpOwotICAvLyBwc3pEZXZpY2VUeXBlIHNob3VsZCBjb250YWluIHRoZSBkZXZpY2UgdHlwZSBpbiBsb3cgd29yZCwgYW5kIGRldmljZSBvcmRpbmFsIGluIGhpZ2ggd29yZCEKLSAgQW1wT3BlblBhcm1zLnBzekRldmljZVR5cGUgPSAoUFNaKSAoTUNJX0RFVlRZUEVfQVVESU9fQU1QTUlYIHwgKGlEZXZpY2VPcmQgPDwgMTYpKTsKLQotICBpT3Blbk1vZGUgPSBNQ0lfV0FJVCB8IE1DSV9PUEVOX1RZUEVfSUQ7Ci0gIGlmIChiT3BlblNoYXJlZCkgaU9wZW5Nb2RlIHw9IE1DSV9PUEVOX1NIQVJFQUJMRTsKLQotICByYyA9IG1jaVNlbmRDb21tYW5kKCAwLCBNQ0lfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgaU9wZW5Nb2RlLAotCQkgICAgICAgKFBWT0lEKSAmQW1wT3BlblBhcm1zLCAwKTsKLSAgaWYgKHJjIT1NQ0lFUlJfU1VDQ0VTUykgLy8gTm8gYXVkaW8gYXZhaWxhYmxlPz8KLSAgICByZXR1cm4gKC0xKTsKLSAgLy8gU2F2ZSB0aGUgZGV2aWNlIElEIHdlIGdvdCBmcm9tIERBUlQhCi0gIC8vIFdlIHdpbGwgdXNlIHRoaXMgaW4gdGhlIG5leHQgY2FsbHMhCi0gIGlEZXZpY2VPcmQgPSBBbXBPcGVuUGFybXMudXNEZXZpY2VJRDsKLQotICAvLyBEZXRlcm1pbmUgdGhlIGF1ZGlvIHBhcmFtZXRlcnMgZnJvbSB0aGUgQXVkaW9TcGVjCi0gIGlmIChzcGVjLT5jaGFubmVscyA+IDIpCi0gICAgc3BlYy0+Y2hhbm5lbHMgPSAyOyAgLy8gISEhIEZJWE1FOiBtb3JlIHRoYW4gc3RlcmVvIHN1cHBvcnQgaW4gT1MvMj8KLQotICB3aGlsZSAoKCF2YWxpZF9kYXRhdHlwZSkgJiYgKHRlc3RfZm9ybWF0KSkgewotICAgIHNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OwotICAgIHZhbGlkX2RhdGF0eXBlID0gMTsKLSAgICBzd2l0Y2ggKHRlc3RfZm9ybWF0KSB7Ci0gICAgICBjYXNlIEFVRElPX1U4OgotICAgICAgICAvLyBVbnNpZ25lZCA4IGJpdCBhdWRpbyBkYXRhCi0gICAgICAgIGlTaWxlbmNlID0gMHg4MDsKLSAgICAgICAgaUJpdHMgPSA4OwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVURJT19TMTZMU0I6Ci0gICAgICAgIC8vIFNpZ25lZCAxNiBiaXQgYXVkaW8gZGF0YQotICAgICAgICBpU2lsZW5jZSA9IDB4MDA7Ci0gICAgICAgIGlCaXRzID0gMTY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICB2YWxpZF9kYXRhdHlwZSA9IDA7Ci0gICAgICAgIHRlc3RfZm9ybWF0ID0gU0RMX05leHRBdWRpb0Zvcm1hdCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoIXZhbGlkX2RhdGF0eXBlKSB7IC8vIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBqdXN0IGluIGNhc2UuLi4KLSAgICAvLyBDbG9zZSBEQVJULCBhbmQgZXhpdCB3aXRoIGVycm9yIGNvZGUhCi0gICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7Ci0gICAgU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKLSAgICByZXR1cm4gKC0xKTsKLSAgfQotCi0gIGlGcmVxID0gc3BlYy0+ZnJlcTsKLSAgaUNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7Ci0gIC8qIFVwZGF0ZSB0aGUgZnJhZ21lbnQgc2l6ZSBhcyBzaXplIGluIGJ5dGVzICovCi0gIFNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7Ci0gIGlCdWZTaXplID0gc3BlYy0+c2l6ZTsKLQotICAvLyBOb3cgcXVlcnkgdGhpcyBkZXZpY2UgaWYgaXQgc3VwcG9ydHMgdGhlIGdpdmVuIGZyZXEvYml0cy9jaGFubmVscyEKLSAgU0RMX21lbXNldCgmKF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMpLCAwLCBzaXplb2YoTUNJX01JWFNFVFVQX1BBUk1TKSk7Ci0gIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMudWxCaXRzUGVyU2FtcGxlID0gaUJpdHM7Ci0gIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMudWxGb3JtYXRUYWcgPSBNQ0lfV0FWRV9GT1JNQVRfUENNOwotICBfdGhpcy0+aGlkZGVuLT5NaXhTZXR1cFBhcm1zLnVsU2FtcGxlc1BlclNlYyA9IGlGcmVxOwotICBfdGhpcy0+aGlkZGVuLT5NaXhTZXR1cFBhcm1zLnVsQ2hhbm5lbHMgPSBpQ2hhbm5lbHM7Ci0gIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMudWxGb3JtYXRNb2RlID0gTUNJX1BMQVk7Ci0gIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMudWxEZXZpY2VUeXBlID0gTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU87Ci0gIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMucG1peEV2ZW50ID0gREFSVEV2ZW50RnVuYzsKLSAgcmMgPSBtY2lTZW5kQ29tbWFuZCAoaURldmljZU9yZCwgTUNJX01JWFNFVFVQLAotICAgICAgICAgICAgICAgICAgICAgICBNQ0lfV0FJVCB8IE1DSV9NSVhTRVRVUF9RVUVSWU1PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICYoX3RoaXMtPmhpZGRlbi0+TWl4U2V0dXBQYXJtcyksIDApOwotICBpZiAocmMhPU1DSUVSUl9TVUNDRVNTKQotICB7IC8vIFRoZSBkZXZpY2UgY2Fubm90IGhhbmRsZSB0aGlzIGZvcm1hdCEKLSAgICAvLyBDbG9zZSBEQVJULCBhbmQgZXhpdCB3aXRoIGVycm9yIGNvZGUhCi0gICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7Ci0gICAgU0RMX1NldEVycm9yKCJBdWRpbyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHJlcXVlc3RlZCBhdWRpbyBmb3JtYXQiKTsKLSAgICByZXR1cm4oLTEpOwotICB9Ci0gIC8vIFRoZSBkZXZpY2UgY2FuIGhhbmRsZSB0aGlzIGZvcm1hdCwgc28gaW5pdGlhbGl6ZSEKLSAgcmMgPSBtY2lTZW5kQ29tbWFuZChpRGV2aWNlT3JkLCBNQ0lfTUlYU0VUVVAsCi0gICAgICAgICAgICAgICAgICAgICAgTUNJX1dBSVQgfCBNQ0lfTUlYU0VUVVBfSU5JVCwKLSAgICAgICAgICAgICAgICAgICAgICAmKF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMpLCAwKTsKLSAgaWYgKHJjIT1NQ0lFUlJfU1VDQ0VTUykKLSAgeyAvLyBUaGUgZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQhCi0gICAgLy8gQ2xvc2UgREFSVCwgYW5kIGV4aXQgd2l0aCBlcnJvciBjb2RlIQotICAgIG1jaVNlbmRDb21tYW5kKGlEZXZpY2VPcmQsIE1DSV9DTE9TRSwgTUNJX1dBSVQsICZHZW5lcmljUGFybXMsIDApOwotICAgIFNETF9TZXRFcnJvcigiQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBzZXQgdXAiKTsKLSAgICByZXR1cm4oLTEpOwotICB9Ci0gIC8vIE9rLCB0aGUgZGV2aWNlIGlzIGluaXRpYWxpemVkLgotICAvLyBOb3cgd2Ugc2hvdWxkIGFsbG9jYXRlIGJ1ZmZlcnMuIEZvciB0aGlzLCB3ZSBuZWVkIGEgcGxhY2Ugd2hlcmUKLSAgLy8gdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyB3aWxsIGJlOgotICBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycyA9IChNQ0lfTUlYX0JVRkZFUiAqKSBTRExfbWFsbG9jKHNpemVvZihNQ0lfTUlYX0JVRkZFUikqaU51bUJ1ZnMpOwotICBpZiAoIShfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycykpCi0gIHsgLy8gTm90IGVub3VnaCBtZW1vcnkhCi0gICAgLy8gQ2xvc2UgREFSVCwgYW5kIGV4aXQgd2l0aCBlcnJvciBjb2RlIQotICAgIG1jaVNlbmRDb21tYW5kKGlEZXZpY2VPcmQsIE1DSV9DTE9TRSwgTUNJX1dBSVQsICZHZW5lcmljUGFybXMsIDApOwotICAgIFNETF9TZXRFcnJvcigiTm90IGVub3VnaCBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlciBkZXNjcmlwdG9ycyIpOwotICAgIHJldHVybigtMSk7Ci0gIH0KLSAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgcGxhY2UgZm9yIGJ1ZmZlciBsaXN0LCB3ZSBjYW4gYXNrIERBUlQgZm9yIHRoZQotICAvLyBidWZmZXJzIQotICBfdGhpcy0+aGlkZGVuLT5CdWZmZXJQYXJtcy51bE51bUJ1ZmZlcnMgPSBpTnVtQnVmczsgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnVmZmVycwotICBfdGhpcy0+aGlkZGVuLT5CdWZmZXJQYXJtcy51bEJ1ZmZlclNpemUgPSBpQnVmU2l6ZTsgICAgICAgICAgICAgICAvLyBlYWNoIHdpdGggdGhpcyBzaXplCi0gIF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zLnBCdWZMaXN0ID0gX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnM7IC8vIGdldHRpbmcgZGVzY3JpcHRvcnRzIGludG8gdGhpcyBsaXN0Ci0gIC8vIEFsbG9jYXRlIGJ1ZmZlcnMhCi0gIHJjID0gbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0JVRkZFUiwKLSAgICAgICAgICAgICAgICAgICAgICBNQ0lfV0FJVCB8IE1DSV9BTExPQ0FURV9NRU1PUlksCi0gICAgICAgICAgICAgICAgICAgICAgJihfdGhpcy0+aGlkZGVuLT5CdWZmZXJQYXJtcyksIDApOwotICBpZiAoKHJjIT1NQ0lFUlJfU1VDQ0VTUykgfHwgKGlOdW1CdWZzICE9IF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zLnVsTnVtQnVmZmVycykgfHwgKF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zLnVsQnVmZmVyU2l6ZT09MCkpCi0gIHsgLy8gQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSEKLSAgICAvLyBDbG9zZSBEQVJULCBhbmQgZXhpdCB3aXRoIGVycm9yIGNvZGUhCi0gICAgU0RMX2ZyZWUoX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnMpOyBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycyA9IE5VTEw7Ci0gICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7Ci0gICAgU0RMX1NldEVycm9yKCJEQVJUIGNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXJzIik7Ci0gICAgcmV0dXJuKC0xKTsKLSAgfQotICAvLyBPaywgd2UgaGF2ZSBhbGwgdGhlIGJ1ZmZlcnMgYWxsb2NhdGVkLCBsZXQncyBtYXJrIHRoZW0hCi0gIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGk9MDsgaTxpTnVtQnVmczsgaSsrKQotICAgIHsKLSAgICAgIHBNaXhCdWZmZXJEZXNjIHBCdWZmZXJEZXNjID0gKHBNaXhCdWZmZXJEZXNjKSBTRExfbWFsbG9jKHNpemVvZih0TWl4QnVmZmVyRGVzYykpOzsKLSAgICAgIC8vIENoZWNrIGlmIHRoaXMgYnVmZmVyIHdhcyByZWFsbHkgYWxsb2NhdGVkIGJ5IERBUlQKLSAgICAgIGlmICgoIShfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVyc1tpXS5wQnVmZmVyKSkgfHwgKCFwQnVmZmVyRGVzYykpCi0gICAgICB7IC8vIFdyb25nIGJ1ZmZlciEKLSAgICAgICAgLy8gQ2xvc2UgREFSVCwgYW5kIGV4aXQgd2l0aCBlcnJvciBjb2RlIQotICAgICAgICAvLyBGcmVlIGJ1ZmZlciBkZXNjcmlwdGlvbnMKLSAgICAgICAgeyBpbnQgajsKLSAgICAgICAgICBmb3IgKGo9MDsgajxpOyBqKyspIFNETF9mcmVlKCh2b2lkICopKF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2pdLnVsVXNlclBhcm0pKTsKLSAgICAgICAgfQotICAgICAgICAvLyBhbmQgY2xlYW51cAotICAgICAgICBtY2lTZW5kQ29tbWFuZChpRGV2aWNlT3JkLCBNQ0lfQlVGRkVSLCBNQ0lfV0FJVCB8IE1DSV9ERUFMTE9DQVRFX01FTU9SWSwgJihfdGhpcy0+aGlkZGVuLT5CdWZmZXJQYXJtcyksIDApOwotICAgICAgICBTRExfZnJlZShfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycyk7IF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzID0gTlVMTDsKLSAgICAgICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiRXJyb3IgYXQgaW50ZXJuYWwgYnVmZmVyIGNoZWNrIik7Ci0gICAgICAgIHJldHVybigtMSk7Ci0gICAgICB9Ci0gICAgICBwQnVmZmVyRGVzYy0+aUJ1ZmZlclVzYWdlID0gQlVGRkVSX0VNUFRZOwotICAgICAgcEJ1ZmZlckRlc2MtPnBTRExBdWRpb0RldmljZSA9IF90aGlzOwotCi0gICAgICBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVyc1tpXS51bEJ1ZmZlckxlbmd0aCA9IF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zLnVsQnVmZmVyU2l6ZTsKLSAgICAgIF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2ldLnVsVXNlclBhcm0gPSAoVUxPTkcpIHBCdWZmZXJEZXNjOyAvLyBVc2VyIHBhcmFtZXRlcjogRGVzY3JpcHRpb24gb2YgYnVmZmVyCi0gICAgICBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVyc1tpXS51bEZsYWdzID0gMDsgLy8gU29tZSBzdHVmZiBzaG91bGQgYmUgZmxhZ2dlZCBoZXJlIGZvciBEQVJULCBsaWtlIGVuZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyBkYXRhLCBidXQgYXMgd2Ugd2lsbCBjb250aW5vdXNseSBzZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIGRhdGEsIHRoZXJlIHdpbGwgYmUgbm8gZW5kLjopCi0gICAgICBTRExfbWVtc2V0KF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2ldLnBCdWZmZXIsIGlTaWxlbmNlLCBpQnVmU2l6ZSk7Ci0gICAgfQotICB9Ci0gIF90aGlzLT5oaWRkZW4tPmlOZXh0RnJlZUJ1ZmZlciA9IDA7Ci0gIF90aGlzLT5oaWRkZW4tPmlMYXN0UGxheWVkQnVmID0gLTE7Ci0gIC8vIENyZWF0ZSBldmVudCBzZW1hcGhvcmUKLSAgaWYgKERvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICYoX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQpLCAwLCBGQUxTRSkhPU5PX0VSUk9SKQotICB7Ci0gICAgLy8gQ291bGQgbm90IGNyZWF0ZSBldmVudCBzZW1hcGhvcmUhCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGk9MDsgaTxpTnVtQnVmczsgaSsrKSBTRExfZnJlZSgodm9pZCAqKShfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVyc1tpXS51bFVzZXJQYXJtKSk7Ci0gICAgfQotICAgIG1jaVNlbmRDb21tYW5kKGlEZXZpY2VPcmQsIE1DSV9CVUZGRVIsIE1DSV9XQUlUIHwgTUNJX0RFQUxMT0NBVEVfTUVNT1JZLCAmKF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zKSwgMCk7Ci0gICAgU0RMX2ZyZWUoX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnMpOyBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycyA9IE5VTEw7Ci0gICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7Ci0gICAgU0RMX1NldEVycm9yKCJDb3VsZCBub3QgY3JlYXRlIGV2ZW50IHNlbWFwaG9yZSIpOwotICAgIHJldHVybigtMSk7Ci0gIH0KLQotICAvLyBTdG9yZSB0aGUgbmV3IHNldHRpbmdzIGluIGdsb2JhbCB2YXJpYWJsZXMKLSAgX3RoaXMtPmhpZGRlbi0+aUN1cnJEZXZpY2VPcmQgPSBpRGV2aWNlT3JkOwotICBfdGhpcy0+aGlkZGVuLT5pQ3VyckZyZXEgPSBpRnJlcTsKLSAgX3RoaXMtPmhpZGRlbi0+aUN1cnJCaXRzID0gaUJpdHM7Ci0gIF90aGlzLT5oaWRkZW4tPmlDdXJyQ2hhbm5lbHMgPSBpQ2hhbm5lbHM7Ci0gIF90aGlzLT5oaWRkZW4tPmlDdXJyTnVtQnVmcyA9IGlOdW1CdWZzOwotICBfdGhpcy0+aGlkZGVuLT5pQ3VyckJ1ZlNpemUgPSBpQnVmU2l6ZTsKLQotICByZXR1cm4gKDApOwotfQotCi0KLQotdm9pZCBEQVJUX1RocmVhZEluaXQoX1RISVMpCi17Ci0gIHJldHVybjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCi12b2lkIERBUlRfV2FpdEF1ZGlvKF9USElTKQotewotICBpbnQgaTsKLSAgcE1peEJ1ZmZlckRlc2MgcEJ1ZkRlc2M7Ci0gIFVMT05HIHVsUG9zdENvdW50OwotCi0gIERvc1Jlc2V0RXZlbnRTZW0oX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQsICZ1bFBvc3RDb3VudCk7Ci0gIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gZW1wdHkgYnVmZmVyLCB0aGVuIHJldHVybiBub3chCi0gIGZvciAoaT0wOyBpPF90aGlzLT5oaWRkZW4tPmlDdXJyTnVtQnVmczsgaSsrKQotICB7Ci0gICAgcEJ1ZkRlc2MgPSAocE1peEJ1ZmZlckRlc2MpIF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2ldLnVsVXNlclBhcm07Ci0gICAgaWYgKHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgPT0gQlVGRkVSX0VNUFRZKQotICAgICAgcmV0dXJuOwotICB9Ci0gIC8vIElmIHRoZXJlIGlzIG5vIGVtcHR5IGJ1ZmZlciwgd2FpdCBmb3Igb25lIHRvIGJlIGVtcHR5IQotICBEb3NXYWl0RXZlbnRTZW0oX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQsIDEwMDApOyAvLyBXYWl0IG1heCAxIHNlYyEhISBJbXBvcnRhbnQhCi0gIHJldHVybjsKLX0KLQotdm9pZCBEQVJUX1BsYXlBdWRpbyhfVEhJUykKLXsKLSAgaW50IGlGcmVlQnVmID0gX3RoaXMtPmhpZGRlbi0+aU5leHRGcmVlQnVmZmVyOwotICBwTWl4QnVmZmVyRGVzYyBwQnVmRGVzYzsKLQotICBwQnVmRGVzYyA9IChwTWl4QnVmZmVyRGVzYykgX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnNbaUZyZWVCdWZdLnVsVXNlclBhcm07Ci0gIHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgPSBCVUZGRVJfVVNFRDsKLSAgLy8gU2VuZCBpdCB0byBEQVJUIHRvIGJlIHF1ZXVlZAotICBfdGhpcy0+aGlkZGVuLT5NaXhTZXR1cFBhcm1zLnBtaXhXcml0ZShfdGhpcy0+aGlkZGVuLT5NaXhTZXR1cFBhcm1zLnVsTWl4SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnNbaUZyZWVCdWZdKSwgMSk7Ci0KLSAgX3RoaXMtPmhpZGRlbi0+aUxhc3RQbGF5ZWRCdWYgPSBpRnJlZUJ1ZjsKLSAgaUZyZWVCdWYgPSAoaUZyZWVCdWYrMSkgJSBfdGhpcy0+aGlkZGVuLT5pQ3Vyck51bUJ1ZnM7Ci0gIF90aGlzLT5oaWRkZW4tPmlOZXh0RnJlZUJ1ZmZlciA9IGlGcmVlQnVmOwotfQotCi1VaW50OCAqREFSVF9HZXRBdWRpb0J1ZihfVEhJUykKLXsKLSAgaW50IGlGcmVlQnVmOwotICBVaW50OCAqcFJlc3VsdDsKLSAgcE1peEJ1ZmZlckRlc2MgcEJ1ZkRlc2M7Ci0KLSAgaWYgKF90aGlzKQotICB7Ci0gICAgaWYgKF90aGlzLT5oaWRkZW4pCi0gICAgewotICAgICAgaUZyZWVCdWYgPSBfdGhpcy0+aGlkZGVuLT5pTmV4dEZyZWVCdWZmZXI7Ci0gICAgICBwQnVmRGVzYyA9IChwTWl4QnVmZmVyRGVzYykgX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnNbaUZyZWVCdWZdLnVsVXNlclBhcm07Ci0gICAgICAKLSAgICAgIGlmIChwQnVmRGVzYykKLSAgICAgIHsKLSAgICAgICAgaWYgKHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgPT0gQlVGRkVSX0VNUFRZKQotICAgICAgICB7Ci0gICAgICAgICAgcFJlc3VsdCA9IF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2lGcmVlQnVmXS5wQnVmZmVyOwotICAgICAgICAgIHJldHVybiBwUmVzdWx0OyAKLSAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgIHByaW50ZigiW0RBUlRfR2V0QXVkaW9CdWZdIDogRVJST1IhIHBCdWZEZXNjID0gJXBcbiIsIHBCdWZEZXNjKTsKLSAgICB9IGVsc2UKLSAgICAgIHByaW50ZigiW0RBUlRfR2V0QXVkaW9CdWZdIDogRVJST1IhIF90aGlzLT5oaWRkZW4gPSAlcFxuIiwgX3RoaXMtPmhpZGRlbik7Ci0gIH0gZWxzZQotICAgIHByaW50ZigiW0RBUlRfR2V0QXVkaW9CdWZdIDogRVJST1IhIF90aGlzID0gJXBcbiIsIF90aGlzKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgREFSVF9XYWl0RG9uZShfVEhJUykKLXsKLSAgcE1peEJ1ZmZlckRlc2MgcEJ1ZkRlc2M7Ci0gIFVMT05HIHVsUG9zdENvdW50OwotICBBUElSRVQgcmM7Ci0KLSAgcEJ1ZkRlc2MgPSAocE1peEJ1ZmZlckRlc2MpIF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW190aGlzLT5oaWRkZW4tPmlMYXN0UGxheWVkQnVmXS51bFVzZXJQYXJtOwotICByYyA9IE5PX0VSUk9SOwotICB3aGlsZSAoKHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgIT0gQlVGRkVSX0VNUFRZKSAmJiAocmM9PU5PX0VSUk9SKSkKLSAgewotICAgIERvc1Jlc2V0RXZlbnRTZW0oX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQsICZ1bFBvc3RDb3VudCk7Ci0gICAgcmMgPSBEb3NXYWl0RXZlbnRTZW0oX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQsIDEwMDApOyAvLyAxIHNlYyB0aW1lb3V0ISBJbXBvcnRhbnQhCi0gIH0KLX0KLQotdm9pZCBEQVJUX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0gIE1DSV9HRU5FUklDX1BBUk1TIEdlbmVyaWNQYXJtczsKLSAgaW50IHJjOwotCi0gIC8vIFN0b3AgREFSVCBwbGF5YmFjawotICByYyA9IG1jaVNlbmRDb21tYW5kKF90aGlzLT5oaWRkZW4tPmlDdXJyRGV2aWNlT3JkLCBNQ0lfU1RPUCwgTUNJX1dBSVQsICZHZW5lcmljUGFybXMsIDApOwotICBpZiAocmMhPU1DSUVSUl9TVUNDRVNTKQotICB7Ci0jaWZkZWYgU0ZYX0RFQlVHX0JVSUxECi0gICAgcHJpbnRmKCJDb3VsZCBub3Qgc3RvcCBEQVJUIHBsYXliYWNrIVxuIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgfQotCi0gIC8vIENsb3NlIGV2ZW50IHNlbWFwaG9yZQotICBEb3NDbG9zZUV2ZW50U2VtKF90aGlzLT5oaWRkZW4tPmhldkF1ZGlvQnVmZmVyUGxheWVkKTsKLQotICAvLyBGcmVlIG1lbW9yeSBvZiBidWZmZXIgZGVzY3JpcHRpb25zCi0gIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGk9MDsgaTxfdGhpcy0+aGlkZGVuLT5pQ3Vyck51bUJ1ZnM7IGkrKykgU0RMX2ZyZWUoKHZvaWQgKikoX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnNbaV0udWxVc2VyUGFybSkpOwotICB9Ci0KLSAgLy8gRGVhbGxvY2F0ZSBidWZmZXJzCi0gIHJjID0gbWNpU2VuZENvbW1hbmQoX3RoaXMtPmhpZGRlbi0+aUN1cnJEZXZpY2VPcmQsIE1DSV9CVUZGRVIsIE1DSV9XQUlUIHwgTUNJX0RFQUxMT0NBVEVfTUVNT1JZLCAmKF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zKSwgMCk7Ci0KLSAgLy8gRnJlZSBidWZmZXJsaXN0Ci0gIFNETF9mcmVlKF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzKTsgX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnMgPSBOVUxMOwotCi0gIC8vIENsb3NlIGRhcnQKLSAgcmMgPSBtY2lTZW5kQ29tbWFuZChfdGhpcy0+aGlkZGVuLT5pQ3VyckRldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJihHZW5lcmljUGFybXMpLCAwKTsKLX0KLQotLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotICByZXR1cm4oMSk7Ci19Ci0KLXZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0gIFNETF9mcmVlKGRldmljZSk7Ci19Ci0KLVNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLSAgU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCi0gIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0gIHRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7Ci0gIGlmICggdGhpcyApCi0gIHsKLSAgICBTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKLSAgICB0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0gICAgICBTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotICB9Ci0gIGlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApCi0gIHsKLSAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICBpZiAoIHRoaXMgKQotICAgICAgU0RMX2ZyZWUodGhpcyk7Ci0gICAgcmV0dXJuKDApOwotICB9Ci0gIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQotICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0gIHRoaXMtPk9wZW5BdWRpbyA9IERBUlRfT3BlbkF1ZGlvOwotICB0aGlzLT5UaHJlYWRJbml0ID0gREFSVF9UaHJlYWRJbml0OwotICB0aGlzLT5XYWl0QXVkaW8gPSBEQVJUX1dhaXRBdWRpbzsKLSAgdGhpcy0+UGxheUF1ZGlvID0gREFSVF9QbGF5QXVkaW87Ci0gIHRoaXMtPkdldEF1ZGlvQnVmID0gREFSVF9HZXRBdWRpb0J1ZjsKLSAgdGhpcy0+V2FpdERvbmUgPSBEQVJUX1dhaXREb25lOwotICB0aGlzLT5DbG9zZUF1ZGlvID0gREFSVF9DbG9zZUF1ZGlvOwotCi0gIHRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7Ci0KLSAgcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIERBUlRfYm9vdHN0cmFwID0gewotCSJkYXJ0IiwgIk9TLzIgRGlyZWN0IEF1ZGlvIFJvdVRpbmVzIChEQVJUKSIsCi0JQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGFydC9TRExfZGFydC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kYXJ0L1NETF9kYXJ0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWRhMDAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kYXJ0L1NETF9kYXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2xvd2F1ZGlvX2gKLSNkZWZpbmUgX1NETF9sb3dhdWRpb19oCi0KLSNkZWZpbmUgSU5DTF9UWVBFUwotI2RlZmluZSBJTkNMX0RPU1NFTUFQSE9SRVMKLSNkZWZpbmUgSU5DTF9ET1NSRVNPVVJDRVMKLSNkZWZpbmUgSU5DTF9ET1NNSVNDCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0KLSNkZWZpbmUgSU5DTF9PUzJNTQotI2RlZmluZSBJTkNMX01NSU9PUzIKLSNkZWZpbmUgSU5DTF9NQ0lPUzIKLSNpbmNsdWRlIDxvczIuaD4KLSNpbmNsdWRlIDxvczJtZS5oPiAgICAgLy8gREFSVCBzdHVmZiBhbmQgTU1JTyBzdHVmZgotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIGF1ZGlvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKl90aGlzCi0KLS8qIFRoZSBEaXJlY3RTb3VuZCBvYmplY3RzICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEKLXsKLSAgaW50IGlDdXJyRGV2aWNlT3JkOwotICBpbnQgaUN1cnJGcmVxOwotICBpbnQgaUN1cnJCaXRzOwotICBpbnQgaUN1cnJDaGFubmVsczsKLSAgaW50IGlDdXJyTnVtQnVmczsKLSAgaW50IGlDdXJyQnVmU2l6ZTsKLQotICBpbnQgaUxhc3RQbGF5ZWRCdWY7Ci0gIGludCBpTmV4dEZyZWVCdWZmZXI7Ci0KLSAgTUNJX0JVRkZFUl9QQVJNUyBCdWZmZXJQYXJtczsgICAgIC8vIFNvdW5kIGJ1ZmZlciBwYXJhbWV0ZXJzCi0gIE1DSV9NSVhfQlVGRkVSICpwTWl4QnVmZmVyczsgICAgICAvLyBTb3VuZCBidWZmZXJzCi0gIE1DSV9NSVhTRVRVUF9QQVJNUyBNaXhTZXR1cFBhcm1zOyAvLyBNaXhlciBzZXR1cCBwYXJhbWV0ZXJzCi0gIEhFViBoZXZBdWRpb0J1ZmZlclBsYXllZDsgICAgICAgICAvLyBFdmVudCBzZW1hcGhvcmUgdG8gaW5kaWNhdGUgdGhhdCBhbiBhdWRpbyBidWZmZXIgaGFzIGJlZW4gcGxheWVkIGJ5IERBUlQKLX07Ci0KLSNlbmRpZiAvKiBfU0RMX2xvd2F1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGMvU0RMX2RjYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGMvU0RMX2RjYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4ZWE1YS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RjL1NETF9kY2F1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogT3V0cHV0IGRyZWFtY2FzdCBhaWNhICovCi0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCi0jaW5jbHVkZSAiU0RMX2RjYXVkaW8uaCIKLQotI2luY2x1ZGUgImFpY2EuaCIKLSNpbmNsdWRlIDxkYy9zcHUuaD4KLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBEQ0FVRF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgRENBVURfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIERDQVVEX1BsYXlBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgVWludDggKkRDQVVEX0dldEF1ZGlvQnVmKF9USElTKTsKLXN0YXRpYyB2b2lkIERDQVVEX0Nsb3NlQXVkaW8oX1RISVMpOwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBEQ0FVRF9BdmFpbGFibGUodm9pZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgRENBVURfRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpEQ0FVRF9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9BdWRpb0RldmljZSAqdGhpczsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLQlpZiAoIHRoaXMgKSB7Ci0JCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOwotCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQl9Ci0JaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCB0aGlzICkgewotCQkJU0RMX2ZyZWUodGhpcyk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JdGhpcy0+T3BlbkF1ZGlvID0gRENBVURfT3BlbkF1ZGlvOwotCXRoaXMtPldhaXRBdWRpbyA9IERDQVVEX1dhaXRBdWRpbzsKLQl0aGlzLT5QbGF5QXVkaW8gPSBEQ0FVRF9QbGF5QXVkaW87Ci0JdGhpcy0+R2V0QXVkaW9CdWYgPSBEQ0FVRF9HZXRBdWRpb0J1ZjsKLQl0aGlzLT5DbG9zZUF1ZGlvID0gRENBVURfQ2xvc2VBdWRpbzsKLQotCXRoaXMtPmZyZWUgPSBEQ0FVRF9EZWxldGVEZXZpY2U7Ci0KLQlzcHVfaW5pdCgpOwotCi0JcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIERDQVVEX2Jvb3RzdHJhcCA9IHsKLQkiZGNhdWRpbyIsICJEcmVhbWNhc3QgQUlDQSBhdWRpbyIsCi0JRENBVURfQXZhaWxhYmxlLCBEQ0FVRF9DcmVhdGVEZXZpY2UKLX07Ci0KLS8qIFRoaXMgZnVuY3Rpb24gd2FpdHMgdW50aWwgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgYSBmdWxsIHNvdW5kIGJ1ZmZlciAqLwotc3RhdGljIHZvaWQgRENBVURfV2FpdEF1ZGlvKF9USElTKQotewotCWlmICh0aGlzLT5oaWRkZW4tPnBsYXlpbmcpIHsKLQkJLyogd2FpdCAqLwotCQl3aGlsZShhaWNhX2dldF9wb3MoMCkvdGhpcy0+c3BlYy5zYW1wbGVzID09IHRoaXMtPmhpZGRlbi0+bmV4dGJ1ZikgewotCQkJdGhkX3Bhc3MoKTsKLQkJfQotCX0KLX0KLQotI2RlZmluZQlTUFVfUkFNX0JBU0UJMHhhMDgwMDAwMAotCi1zdGF0aWMgdm9pZCBzcHVfbWVtbG9hZF9zdGVyZW84KGludCBsZWZ0cG9zLGludCByaWdodHBvcyx2b2lkICpzcmMwLHNpemVfdCBzaXplKQotewotCXVpbnQ4ICpzcmMgPSBzcmMwOwotCXVpbnQzMiAqbGVmdCAgPSAodWludDMyKikobGVmdHBvcyArU1BVX1JBTV9CQVNFKTsKLQl1aW50MzIgKnJpZ2h0ID0gKHVpbnQzMiopKHJpZ2h0cG9zK1NQVV9SQU1fQkFTRSk7Ci0Jc2l6ZSA9IChzaXplKzcpLzg7Ci0Jd2hpbGUoc2l6ZS0tKSB7Ci0JCXVuc2lnbmVkIGx2YWwscnZhbDsKLQkJbHZhbCA9ICpzcmMrKzsKLQkJcnZhbCA9ICpzcmMrKzsKLQkJbHZhbHw9ICgqc3JjKyspPDw4OwotCQlydmFsfD0gKCpzcmMrKyk8PDg7Ci0JCWx2YWx8PSAoKnNyYysrKTw8MTY7Ci0JCXJ2YWx8PSAoKnNyYysrKTw8MTY7Ci0JCWx2YWx8PSAoKnNyYysrKTw8MjQ7Ci0JCXJ2YWx8PSAoKnNyYysrKTw8MjQ7Ci0JCWcyX3dyaXRlXzMyKGxlZnQrKyxsdmFsKTsKLQkJZzJfd3JpdGVfMzIocmlnaHQrKyxydmFsKTsKLQkJZzJfZmlmb193YWl0KCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzcHVfbWVtbG9hZF9zdGVyZW8xNihpbnQgbGVmdHBvcyxpbnQgcmlnaHRwb3Msdm9pZCAqc3JjMCxzaXplX3Qgc2l6ZSkKLXsKLQl1aW50MTYgKnNyYyA9IHNyYzA7Ci0JdWludDMyICpsZWZ0ICA9ICh1aW50MzIqKShsZWZ0cG9zICtTUFVfUkFNX0JBU0UpOwotCXVpbnQzMiAqcmlnaHQgPSAodWludDMyKikocmlnaHRwb3MrU1BVX1JBTV9CQVNFKTsKLQlzaXplID0gKHNpemUrNykvODsKLQl3aGlsZShzaXplLS0pIHsKLQkJdW5zaWduZWQgbHZhbCxydmFsOwotCQlsdmFsID0gKnNyYysrOwotCQlydmFsID0gKnNyYysrOwotCQlsdmFsfD0gKCpzcmMrKyk8PDE2OwotCQlydmFsfD0gKCpzcmMrKyk8PDE2OwotCQlnMl93cml0ZV8zMihsZWZ0KyssbHZhbCk7Ci0JCWcyX3dyaXRlXzMyKHJpZ2h0KysscnZhbCk7Ci0JCWcyX2ZpZm9fd2FpdCgpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgRENBVURfUGxheUF1ZGlvKF9USElTKQotewotCVNETF9BdWRpb1NwZWMgKnNwZWMgPSAmdGhpcy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCi0JaWYgKHRoaXMtPmhpZGRlbi0+cGxheWluZykgewotCQkvKiB3YWl0ICovCi0JCXdoaWxlKGFpY2FfZ2V0X3BvcygwKS9zcGVjLT5zYW1wbGVzID09IHRoaXMtPmhpZGRlbi0+bmV4dGJ1ZikgewotCQkJdGhkX3Bhc3MoKTsKLQkJfQotCX0KLQotCW9mZnNldCA9IHRoaXMtPmhpZGRlbi0+bmV4dGJ1ZipzcGVjLT5zaXplOwotCXRoaXMtPmhpZGRlbi0+bmV4dGJ1Zl49MTsKLQkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSwgY2hlY2tpbmcgZm9yIEVBR0FJTiBvbiBicm9rZW4gYXVkaW8gZHJpdmVycyAqLwotCWlmIChzcGVjLT5jaGFubmVscz09MSkgewotCQlzcHVfbWVtbG9hZCh0aGlzLT5oaWRkZW4tPmxlZnRwb3Mrb2Zmc2V0LHRoaXMtPmhpZGRlbi0+bWl4YnVmLHRoaXMtPmhpZGRlbi0+bWl4bGVuKTsKLQl9IGVsc2UgewotCQlvZmZzZXQvPTI7Ci0JCWlmICgodGhpcy0+c3BlYy5mb3JtYXQmMjU1KT09OCkgewotCQkJc3B1X21lbWxvYWRfc3RlcmVvOCh0aGlzLT5oaWRkZW4tPmxlZnRwb3Mrb2Zmc2V0LHRoaXMtPmhpZGRlbi0+cmlnaHRwb3Mrb2Zmc2V0LHRoaXMtPmhpZGRlbi0+bWl4YnVmLHRoaXMtPmhpZGRlbi0+bWl4bGVuKTsKLQkJfSBlbHNlIHsKLQkJCXNwdV9tZW1sb2FkX3N0ZXJlbzE2KHRoaXMtPmhpZGRlbi0+bGVmdHBvcytvZmZzZXQsdGhpcy0+aGlkZGVuLT5yaWdodHBvcytvZmZzZXQsdGhpcy0+aGlkZGVuLT5taXhidWYsdGhpcy0+aGlkZGVuLT5taXhsZW4pOwotCQl9Ci0JfQotCi0JaWYgKCF0aGlzLT5oaWRkZW4tPnBsYXlpbmcpIHsKLQkJaW50IG1vZGU7Ci0JCXRoaXMtPmhpZGRlbi0+cGxheWluZyA9IDE7Ci0JCW1vZGUgPSAoc3BlYy0+Zm9ybWF0PT1BVURJT19TOCk/U01fOEJJVDpTTV8xNkJJVDsKLQkJaWYgKHNwZWMtPmNoYW5uZWxzPT0xKSB7Ci0JCQlhaWNhX3BsYXkoMCxtb2RlLHRoaXMtPmhpZGRlbi0+bGVmdHBvcywwLHNwZWMtPnNhbXBsZXMqMixzcGVjLT5mcmVxLDI1NSwxMjgsMSk7Ci0JCX0gZWxzZSB7Ci0JCQlhaWNhX3BsYXkoMCxtb2RlLHRoaXMtPmhpZGRlbi0+bGVmdHBvcyAsMCxzcGVjLT5zYW1wbGVzKjIsc3BlYy0+ZnJlcSwyNTUsMCwxKTsKLQkJCWFpY2FfcGxheSgxLG1vZGUsdGhpcy0+aGlkZGVuLT5yaWdodHBvcywwLHNwZWMtPnNhbXBsZXMqMixzcGVjLT5mcmVxLDI1NSwyNTUsMSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBVaW50OCAqRENBVURfR2V0QXVkaW9CdWYoX1RISVMpCi17Ci0JcmV0dXJuKHRoaXMtPmhpZGRlbi0+bWl4YnVmKTsKLX0KLQotc3RhdGljIHZvaWQgRENBVURfQ2xvc2VBdWRpbyhfVEhJUykKLXsKLQlhaWNhX3N0b3AoMCk7Ci0JaWYgKHRoaXMtPnNwZWMuY2hhbm5lbHM9PTIpIGFpY2Ffc3RvcCgxKTsKLQlpZiAoIHRoaXMtPmhpZGRlbi0+bWl4YnVmICE9IE5VTEwgKSB7Ci0JCVNETF9GcmVlQXVkaW9NZW0odGhpcy0+aGlkZGVuLT5taXhidWYpOwotCQl0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgaW50IERDQVVEX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLSAgICBVaW50MTYgdGVzdF9mb3JtYXQgPSBTRExfRmlyc3RBdWRpb0Zvcm1hdChzcGVjLT5mb3JtYXQpOwotICAgIGludCB2YWxpZF9kYXRhdHlwZSA9IDA7Ci0gICAgd2hpbGUgKCghdmFsaWRfZGF0YXR5cGUpICYmICh0ZXN0X2Zvcm1hdCkpIHsKLSAgICAgICAgc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7Ci0gICAgICAgIHN3aXRjaCAodGVzdF9mb3JtYXQpIHsKLSAgICAgICAgICAgIC8qIG9ubHkgZm9ybWF0cyBEcmVhbWNhc3QgYWNjZXB0cy4uLiAqLwotICAgICAgICAgICAgY2FzZSBBVURJT19TODoKLSAgICAgICAgICAgIGNhc2UgQVVESU9fUzE2TFNCOgotICAgICAgICAgICAgICAgIHZhbGlkX2RhdGF0eXBlID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghdmFsaWRfZGF0YXR5cGUpIHsgIC8qIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBqdXN0IGluIGNhc2UuLi4gKi8KLSAgICAgICAgU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotCi0gICAgaWYgKHNwZWMtPmNoYW5uZWxzID4gMikKLSAgICAgICAgc3BlYy0+Y2hhbm5lbHMgPSAyOyAgLyogbm8gbW9yZSB0aGFuIHN0ZXJlbyBvbiB0aGUgRHJlYW1jYXN0LiAqLwotCi0JLyogVXBkYXRlIHRoZSBmcmFnbWVudCBzaXplIGFzIHNpemUgaW4gYnl0ZXMgKi8KLQlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCi0JLyogQWxsb2NhdGUgbWl4aW5nIGJ1ZmZlciAqLwotCXRoaXMtPmhpZGRlbi0+bWl4bGVuID0gc3BlYy0+c2l6ZTsKLQl0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IChVaW50OCAqKSBTRExfQWxsb2NBdWRpb01lbSh0aGlzLT5oaWRkZW4tPm1peGxlbik7Ci0JaWYgKCB0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9PSBOVUxMICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbi0+bWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKLQl0aGlzLT5oaWRkZW4tPmxlZnRwb3MgPSAweDExMDAwOwotCXRoaXMtPmhpZGRlbi0+cmlnaHRwb3MgPSAweDExMDAwK3NwZWMtPnNpemU7Ci0JdGhpcy0+aGlkZGVuLT5wbGF5aW5nID0gMDsKLQl0aGlzLT5oaWRkZW4tPm5leHRidWYgPSAwOwotCi0JLyogV2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCi0JcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kYy9TRExfZGNhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kYy9TRExfZGNhdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWIwMWQzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGMvU0RMX2RjYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfZGNhdWRpb19oCi0jZGVmaW5lIF9TRExfZGNhdWRpb19oCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcwotCi1zdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgewotCS8qIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBhdWRpbyBkZXZpY2UgKi8KLQlVaW50OCAqbWl4YnVmOwotCVVpbnQzMiBtaXhsZW47Ci0JaW50IHBsYXlpbmc7Ci0JaW50IGxlZnRwb3MscmlnaHRwb3M7Ci0JaW50IG5leHRidWY7Ci19OwotCi0jZW5kaWYgLyogX1NETF9kY2F1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGMvYWljYS5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kYy9haWNhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMTU1ZDIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kYy9haWNhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfQUlDQV9IXwotI2RlZmluZSBfQUlDQV9IXwotCi0jZGVmaW5lCUFJQ0FfTUVNCTB4YTA4MDAwMDAKLQotI2RlZmluZSBTTV84QklUCQkxCi0jZGVmaW5lIFNNXzE2QklUCTAKLSNkZWZpbmUgU01fQURQQ00JMgotCi12b2lkIGFpY2FfcGxheShpbnQgY2gsaW50IG1vZGUsdW5zaWduZWQgbG9uZyBzbXBwdHIsaW50IGxvb3B0c3QsaW50IGxvb3BlbmQsaW50IGZyZXEsaW50IHZvbCxpbnQgcGFuLGludCBsb29wZmxhZyk7Ci12b2lkIGFpY2Ffc3RvcChpbnQgY2gpOwotdm9pZCBhaWNhX3ZvbChpbnQgY2gsaW50IHZvbCk7Ci12b2lkIGFpY2FfcGFuKGludCBjaCxpbnQgcGFuKTsKLXZvaWQgYWljYV9mcmVxKGludCBjaCxpbnQgZnJlcSk7Ci1pbnQgYWljYV9nZXRfcG9zKGludCBjaCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kaXNrL1NETF9kaXNrYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGlzay9TRExfZGlza2F1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTZkOWQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kaXNrL1NETF9kaXNrYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0KLSAgICBUaGlzIGZpbGUgd3JpdHRlbiBieSBSeWFuIEMuIEdvcmRvbiAoaWNjdWx1c0BpY2N1bHVzLm9yZykKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBPdXRwdXQgcmF3IGF1ZGlvIGRhdGEgdG8gYSBmaWxlLiAqLwotCi0jaWYgSEFWRV9TVERJT19ICi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX3J3b3BzLmgiCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgotI2luY2x1ZGUgIlNETF9kaXNrYXVkaW8uaCIKLQotLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgRElTSyBhdWRpbyAqLwotI2RlZmluZSBESVNLQVVEX0RSSVZFUl9OQU1FICAgICAgICAgImRpc2siCi0KLS8qIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgZGVmYXVsdHMuICovCi0jZGVmaW5lIERJU0tFTlZSX09VVEZJTEUgICAgICAgICAiU0RMX0RJU0tBVURJT0ZJTEUiCi0jZGVmaW5lIERJU0tERUZBVUxUX09VVEZJTEUgICAgICAic2RsYXVkaW8ucmF3IgotI2RlZmluZSBESVNLRU5WUl9XUklURURFTEFZICAgICAgIlNETF9ESVNLQVVESU9ERUxBWSIKLSNkZWZpbmUgRElTS0RFRkFVTFRfV1JJVEVERUxBWSAgIDE1MAotCi0vKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IERJU0tBVURfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIERJU0tBVURfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIERJU0tBVURfUGxheUF1ZGlvKF9USElTKTsKLXN0YXRpYyBVaW50OCAqRElTS0FVRF9HZXRBdWRpb0J1ZihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBESVNLQVVEX0Nsb3NlQXVkaW8oX1RISVMpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqRElTS0FVRF9HZXRPdXRwdXRGaWxlbmFtZSh2b2lkKQotewotCWNvbnN0IGNoYXIgKmVudnIgPSBTRExfZ2V0ZW52KERJU0tFTlZSX09VVEZJTEUpOwotCXJldHVybigoZW52ciAhPSBOVUxMKSA/IGVudnIgOiBESVNLREVGQVVMVF9PVVRGSUxFKTsKLX0KLQotLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRElTS0FVRF9BdmFpbGFibGUodm9pZCkKLXsKLQljb25zdCBjaGFyICplbnZyID0gU0RMX2dldGVudigiU0RMX0FVRElPRFJJVkVSIik7Ci0JaWYgKGVudnIgJiYgKFNETF9zdHJjbXAoZW52ciwgRElTS0FVRF9EUklWRVJfTkFNRSkgPT0gMCkpIHsKLQkJcmV0dXJuKDEpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIERJU0tBVURfRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpESVNLQVVEX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCWNvbnN0IGNoYXIgKmVudnI7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7Ci0JaWYgKCB0aGlzICkgewotCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKLQkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0JfQotCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWlmICggdGhpcyApIHsKLQkJCVNETF9mcmVlKHRoaXMpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCi0JZW52ciA9IFNETF9nZXRlbnYoRElTS0VOVlJfV1JJVEVERUxBWSk7Ci0JdGhpcy0+aGlkZGVuLT53cml0ZV9kZWxheSA9IChlbnZyKSA/IFNETF9hdG9pKGVudnIpIDogRElTS0RFRkFVTFRfV1JJVEVERUxBWTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQl0aGlzLT5PcGVuQXVkaW8gPSBESVNLQVVEX09wZW5BdWRpbzsKLQl0aGlzLT5XYWl0QXVkaW8gPSBESVNLQVVEX1dhaXRBdWRpbzsKLQl0aGlzLT5QbGF5QXVkaW8gPSBESVNLQVVEX1BsYXlBdWRpbzsKLQl0aGlzLT5HZXRBdWRpb0J1ZiA9IERJU0tBVURfR2V0QXVkaW9CdWY7Ci0JdGhpcy0+Q2xvc2VBdWRpbyA9IERJU0tBVURfQ2xvc2VBdWRpbzsKLQotCXRoaXMtPmZyZWUgPSBESVNLQVVEX0RlbGV0ZURldmljZTsKLQotCXJldHVybiB0aGlzOwotfQotCi1BdWRpb0Jvb3RTdHJhcCBESVNLQVVEX2Jvb3RzdHJhcCA9IHsKLQlESVNLQVVEX0RSSVZFUl9OQU1FLCAiZGlyZWN0LXRvLWRpc2sgYXVkaW8iLAotCURJU0tBVURfQXZhaWxhYmxlLCBESVNLQVVEX0NyZWF0ZURldmljZQotfTsKLQotLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCi1zdGF0aWMgdm9pZCBESVNLQVVEX1dhaXRBdWRpbyhfVEhJUykKLXsKLQlTRExfRGVsYXkodGhpcy0+aGlkZGVuLT53cml0ZV9kZWxheSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERJU0tBVURfUGxheUF1ZGlvKF9USElTKQotewotCWludCB3cml0dGVuOwotCi0JLyogV3JpdGUgdGhlIGF1ZGlvIGRhdGEgKi8KLQl3cml0dGVuID0gU0RMX1JXd3JpdGUodGhpcy0+aGlkZGVuLT5vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5oaWRkZW4tPm1peGJ1ZiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+bWl4bGVuKTsKLQotCS8qIElmIHdlIGNvdWxkbid0IHdyaXRlLCBhc3N1bWUgZmF0YWwgZXJyb3IgZm9yIG5vdyAqLwotCWlmICggKFVpbnQzMil3cml0dGVuICE9IHRoaXMtPmhpZGRlbi0+bWl4bGVuICkgewotCQl0aGlzLT5lbmFibGVkID0gMDsKLQl9Ci0jaWZkZWYgREVCVUdfQVVESU8KLQlmcHJpbnRmKHN0ZGVyciwgIldyb3RlICVkIGJ5dGVzIG9mIGF1ZGlvIGRhdGFcbiIsIHdyaXR0ZW4pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBVaW50OCAqRElTS0FVRF9HZXRBdWRpb0J1ZihfVEhJUykKLXsKLQlyZXR1cm4odGhpcy0+aGlkZGVuLT5taXhidWYpOwotfQotCi1zdGF0aWMgdm9pZCBESVNLQVVEX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0JaWYgKCB0aGlzLT5oaWRkZW4tPm1peGJ1ZiAhPSBOVUxMICkgewotCQlTRExfRnJlZUF1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4YnVmKTsKLQkJdGhpcy0+aGlkZGVuLT5taXhidWYgPSBOVUxMOwotCX0KLQlpZiAoIHRoaXMtPmhpZGRlbi0+b3V0cHV0ICE9IE5VTEwgKSB7Ci0JCVNETF9SV2Nsb3NlKHRoaXMtPmhpZGRlbi0+b3V0cHV0KTsKLQkJdGhpcy0+aGlkZGVuLT5vdXRwdXQgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIGludCBESVNLQVVEX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQljb25zdCBjaGFyICpmbmFtZSA9IERJU0tBVURfR2V0T3V0cHV0RmlsZW5hbWUoKTsKLQotCS8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLwotCXRoaXMtPmhpZGRlbi0+b3V0cHV0ID0gU0RMX1JXRnJvbUZpbGUoZm5hbWUsICJ3YiIpOwotCWlmICggdGhpcy0+aGlkZGVuLT5vdXRwdXQgPT0gTlVMTCApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLSNpZiBIQVZFX1NURElPX0gKLQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IFlvdSBhcmUgdXNpbmcgdGhlIFNETCBkaXNrIHdyaXRlciIKLSAgICAgICAgICAgICAgICAgICAgIiBhdWRpbyBkcml2ZXIhXG4gV3JpdGluZyB0byBmaWxlIFslc10uXG4iLCBmbmFtZSk7Ci0jZW5kaWYKLQotCS8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KLQl0aGlzLT5oaWRkZW4tPm1peGxlbiA9IHNwZWMtPnNpemU7Ci0JdGhpcy0+aGlkZGVuLT5taXhidWYgPSAoVWludDggKikgU0RMX0FsbG9jQXVkaW9NZW0odGhpcy0+aGlkZGVuLT5taXhsZW4pOwotCWlmICggdGhpcy0+aGlkZGVuLT5taXhidWYgPT0gTlVMTCApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JU0RMX21lbXNldCh0aGlzLT5oaWRkZW4tPm1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7Ci0KLQkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KLQlyZXR1cm4oMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGlzay9TRExfZGlza2F1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2Rpc2svU0RMX2Rpc2thdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRkNjhmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGlzay9TRExfZGlza2F1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2Rpc2thdWRpb19oCi0jZGVmaW5lIF9TRExfZGlza2F1ZGlvX2gKLQotI2luY2x1ZGUgIlNETF9yd29wcy5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7Ci0JLyogVGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGF1ZGlvIGRldmljZSAqLwotCVNETF9SV29wcyAqb3V0cHV0OwotCVVpbnQ4ICptaXhidWY7Ci0JVWludDMyIG1peGxlbjsKLQlVaW50MzIgd3JpdGVfZGVsYXk7Ci19OwotCi0jZW5kaWYgLyogX1NETF9kaXNrYXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kbWEvU0RMX2RtYWF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RtYS9TRExfZG1hYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3MzRhMy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RtYS9TRExfZG1hYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogQWxsb3cgYWNjZXNzIHRvIGEgcmF3IG1peGluZyBidWZmZXIgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+CS8qIEZvciBzdHJlcnJvcigpICovCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaWYgU0RMX0FVRElPX0RSSVZFUl9PU1NfU09VTkRDQVJEX0gKLS8qIFRoaXMgaXMgaW5zdGFsbGVkIG9uIHNvbWUgc3lzdGVtcyAqLwotI2luY2x1ZGUgPHNvdW5kY2FyZC5oPgotI2Vsc2UKLS8qIFRoaXMgaXMgcmVjb21tZW5kZWQgYnkgT1NTICovCi0jaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgTUFQX0ZBSUxFRAotI2RlZmluZSBNQVBfRkFJTEVECSgoVWludDggKiktMSkKLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgotI2luY2x1ZGUgIlNETF9kbWFhdWRpby5oIgotCi0vKiBUaGUgdGFnIG5hbWUgdXNlZCBieSBETUEgYXVkaW8gKi8KLSNkZWZpbmUgRE1BX0RSSVZFUl9OQU1FICAgICAgICAgImRtYSIKLQotLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjaywgYW5kIGRvbid0IGJsb2NrIGlmIGJ1c3kgKi8KLSNkZWZpbmUgT1BFTl9GTEFHUwkoT19SRFdSfE9fTk9OQkxPQ0spCi0KLS8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRE1BX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7Ci1zdGF0aWMgdm9pZCBETUFfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIERNQV9QbGF5QXVkaW8oX1RISVMpOwotc3RhdGljIFVpbnQ4ICpETUFfR2V0QXVkaW9CdWYoX1RISVMpOwotc3RhdGljIHZvaWQgRE1BX0Nsb3NlQXVkaW8oX1RISVMpOwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotCWludCBhdmFpbGFibGU7Ci0JaW50IGZkOwotCi0JYXZhaWxhYmxlID0gMDsKLQotCWZkID0gU0RMX09wZW5BdWRpb1BhdGgoTlVMTCwgMCwgT1BFTl9GTEFHUywgMCk7Ci0JaWYgKCBmZCA+PSAwICkgewotCQlpbnQgY2FwczsKLQkJc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGluZm87Ci0KLQkJaWYgKCAoaW9jdGwoZmQsIFNORENUTF9EU1BfR0VUQ0FQUywgJmNhcHMpID09IDApICYmCi0JICAgICAgICAgICAgIChjYXBzICYgRFNQX0NBUF9UUklHR0VSKSAmJiAoY2FwcyAmIERTUF9DQVBfTU1BUCkgJiYKLQkJICAgICAoaW9jdGwoZmQsIFNORENUTF9EU1BfR0VUT1NQQUNFLCAmaW5mbykgPT0gMCkgKSB7Ci0JCQlhdmFpbGFibGUgPSAxOwotCQl9Ci0JCWNsb3NlKGZkKTsKLQl9Ci0JcmV0dXJuKGF2YWlsYWJsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKLXsKLQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0JU0RMX2ZyZWUoZGV2aWNlKTsKLX0KLQotc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfQXVkaW9EZXZpY2UgKnRoaXM7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7Ci0JaWYgKCB0aGlzICkgewotCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKLQkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0JfQotCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWlmICggdGhpcyApIHsKLQkJCVNETF9mcmVlKHRoaXMpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCWF1ZGlvX2ZkID0gLTE7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JdGhpcy0+T3BlbkF1ZGlvID0gRE1BX09wZW5BdWRpbzsKLQl0aGlzLT5XYWl0QXVkaW8gPSBETUFfV2FpdEF1ZGlvOwotCXRoaXMtPlBsYXlBdWRpbyA9IERNQV9QbGF5QXVkaW87Ci0JdGhpcy0+R2V0QXVkaW9CdWYgPSBETUFfR2V0QXVkaW9CdWY7Ci0JdGhpcy0+Q2xvc2VBdWRpbyA9IERNQV9DbG9zZUF1ZGlvOwotCi0JdGhpcy0+ZnJlZSA9IEF1ZGlvX0RlbGV0ZURldmljZTsKLQotCXJldHVybiB0aGlzOwotfQotCi1BdWRpb0Jvb3RTdHJhcCBETUFfYm9vdHN0cmFwID0gewotCURNQV9EUklWRVJfTkFNRSwgIk9TUyAvZGV2L2RzcCBETUEgYXVkaW8iLAotCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KLXN0YXRpYyB2b2lkIERNQV9XYWl0QXVkaW8oX1RISVMpCi17Ci0JZmRfc2V0IGZkc2V0OwotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0aHJlYWQtcGFyZW50IHByb2Nlc3MgaXMgc3RpbGwgYWxpdmUgKi8KLQl7IHN0YXRpYyBpbnQgY250ID0gMDsKLQkJLyogTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyB3aXRoIHRocmVhZCBpbXBsZW1lbnRhdGlvbnMgCi0JCSAgIHRoYXQgdXNlIGEgZGlmZmVyZW50IHByb2Nlc3MgaWQgZm9yIGVhY2ggdGhyZWFkLgotCQkqLwotCQlpZiAocGFyZW50ICYmICgoKCsrY250KSUxMCkgPT0gMCkpIHsgLyogQ2hlY2sgZXZlcnkgMTAgbG9vcHMgKi8KLQkJCWlmICgga2lsbChwYXJlbnQsIDApIDwgMCApIHsKLQkJCQl0aGlzLT5lbmFibGVkID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFNlZSBpZiB3ZSBuZWVkIHRvIHVzZSB0aW1lZCBhdWRpbyBzeW5jaHJvbml6YXRpb24gKi8KLQlpZiAoIGZyYW1lX3RpY2tzICkgewotCQkvKiBVc2UgdGltZXIgZm9yIGdlbmVyYWwgYXVkaW8gc3luY2hyb25pemF0aW9uICovCi0JCVNpbnQzMiB0aWNrczsKLQotCQl0aWNrcyA9ICgoU2ludDMyKShuZXh0X2ZyYW1lIC0gU0RMX0dldFRpY2tzKCkpKS1GVURHRV9USUNLUzsKLQkJaWYgKCB0aWNrcyA+IDAgKSB7Ci0JCQlTRExfRGVsYXkodGlja3MpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogVXNlIHNlbGVjdCgpIGZvciBhdWRpbyBzeW5jaHJvbml6YXRpb24gKi8KLQkJc3RydWN0IHRpbWV2YWwgdGltZW91dDsKLQkJRkRfWkVSTygmZmRzZXQpOwotCQlGRF9TRVQoYXVkaW9fZmQsICZmZHNldCk7Ci0JCXRpbWVvdXQudHZfc2VjID0gMTA7Ci0JCXRpbWVvdXQudHZfdXNlYyA9IDA7Ci0jaWZkZWYgREVCVUdfQVVESU8KLQkJZnByaW50ZihzdGRlcnIsICJXYWl0aW5nIGZvciBhdWRpbyB0byBnZXQgcmVhZHlcbiIpOwotI2VuZGlmCi0JCWlmICggc2VsZWN0KGF1ZGlvX2ZkKzEsIE5VTEwsICZmZHNldCwgTlVMTCwgJnRpbWVvdXQpIDw9IDAgKSB7Ci0JCQljb25zdCBjaGFyICptZXNzYWdlID0KLSNpZmRlZiBBVURJT19PU1BBQ0VfSEFDSwotCQkJIkF1ZGlvIHRpbWVvdXQgLSBidWdneSBhdWRpbyBkcml2ZXI/ICh0cnlpbmcgb3NwYWNlKSI7Ci0jZWxzZQotCQkJIkF1ZGlvIHRpbWVvdXQgLSBidWdneSBhdWRpbyBkcml2ZXI/IChkaXNhYmxlZCkiOwotI2VuZGlmCi0JCQkvKiBJbiBnZW5lcmFsIHdlIHNob3VsZCBuZXZlciBwcmludCB0byB0aGUgc2NyZWVuLAotCQkJICAgYnV0IGluIHRoaXMgY2FzZSB3ZSBoYXZlIG5vIG90aGVyIHdheSBvZiBsZXR0aW5nCi0JCQkgICB0aGUgdXNlciBrbm93IHdoYXQgaGFwcGVuZWQuCi0JCQkqLwotCQkJZnByaW50ZihzdGRlcnIsICJTREw6ICVzXG4iLCBtZXNzYWdlKTsKLSNpZmRlZiBBVURJT19PU1BBQ0VfSEFDSwotCQkJLyogV2UgbWF5IGJlIGFibGUgdG8gdXNlIEdFVF9PU1BBQ0UgdHJpY2sgKi8KLQkJCWZyYW1lX3RpY2tzID0gKGZsb2F0KSh0aGlzLT5zcGVjLT5zYW1wbGVzKjEwMDApIC8KLQkJCSAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zcGVjLT5mcmVxOwotCQkJbmV4dF9mcmFtZSA9IFNETF9HZXRUaWNrcygpK2ZyYW1lX3RpY2tzOwotI2Vsc2UKLQkJCXRoaXMtPmVuYWJsZWQgPSAwOwotCQkJLyogRG9uJ3QgdHJ5IHRvIGNsb3NlIC0gbWF5IGhhbmcgKi8KLQkJCWF1ZGlvX2ZkID0gLTE7Ci0jaWZkZWYgREVCVUdfQVVESU8KLQkJCWZwcmludGYoc3RkZXJyLCAiRG9uZSBkaXNhYmxpbmcgYXVkaW9cbiIpOwotI2VuZGlmCi0jZW5kaWYgLyogQVVESU9fT1NQQUNFX0hBQ0sgKi8KLQkJfQotI2lmZGVmIERFQlVHX0FVRElPCi0JCWZwcmludGYoc3RkZXJyLCAiUmVhZHkhXG4iKTsKLSNlbmRpZgotCX0KLX0KLQotc3RhdGljIHZvaWQgRE1BX1BsYXlBdWRpbyhfVEhJUykKLXsKLQkvKiBJZiB0aW1lciBzeW5jaHJvbml6YXRpb24gaXMgZW5hYmxlZCwgc2V0IHRoZSBuZXh0IHdyaXRlIGZyYW1lICovCi0JaWYgKCBmcmFtZV90aWNrcyApIHsKLQkJbmV4dF9mcmFtZSArPSBmcmFtZV90aWNrczsKLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgVWludDggKkRNQV9HZXRBdWRpb0J1ZihfVEhJUykKLXsKLQljb3VudF9pbmZvIGluZm87Ci0JaW50IHBsYXlpbmc7Ci0JaW50IGZpbGxpbmc7Ci0KLQkvKiBHZXQgbnVtYmVyIG9mIGJsb2NrcywgbG9vcGluZyBpZiB3ZSdyZSBub3QgdXNpbmcgc2VsZWN0KCkgKi8KLQlkbyB7Ci0JCWlmICggaW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfR0VUT1BUUiwgJmluZm8pIDwgMCApIHsKLQkJCS8qIFVoIG9oLi4uICovCi0JCQl0aGlzLT5lbmFibGVkID0gMDsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCX0gd2hpbGUgKCBmcmFtZV90aWNrcyAmJiAoaW5mby5ibG9ja3MgPCAxKSApOwotI2lmZGVmIERFQlVHX0FVRElPCi0JaWYgKCBpbmZvLmJsb2NrcyA+IDEgKSB7Ci0JCXByaW50ZigiV2FybmluZzogYXVkaW8gdW5kZXJmbG93ICglZCBmcmFncylcbiIsIGluZm8uYmxvY2tzLTEpOwotCX0KLSNlbmRpZgotCXBsYXlpbmcgPSBpbmZvLnB0ciAvIHRoaXMtPnNwZWMuc2l6ZTsKLQlmaWxsaW5nID0gKHBsYXlpbmcgKyAxKSVudW1fYnVmZmVyczsKLQlyZXR1cm4gKGRtYV9idWYgKyAoZmlsbGluZyAqIHRoaXMtPnNwZWMuc2l6ZSkpOwotfQotCi1zdGF0aWMgdm9pZCBETUFfQ2xvc2VBdWRpbyhfVEhJUykKLXsKLQlpZiAoIGRtYV9idWYgIT0gTlVMTCApIHsKLQkJbXVubWFwKGRtYV9idWYsIGRtYV9sZW4pOwotCQlkbWFfYnVmID0gTlVMTDsKLQl9Ci0JaWYgKCBhdWRpb19mZCA+PSAwICkgewotCQljbG9zZShhdWRpb19mZCk7Ci0JCWF1ZGlvX2ZkID0gLTE7Ci0JfQotfQotCi1zdGF0aWMgaW50IERNQV9SZW9wZW5BdWRpbyhfVEhJUywgY29uc3QgY2hhciAqYXVkaW9kZXYsIGludCBmb3JtYXQsIGludCBzdGVyZW8sCi0JCQkJCQkJU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQlpbnQgZnJhZ19zcGVjOwotCWludCB2YWx1ZTsKLQotCS8qIENsb3NlIGFuZCB0aGVuIHJlb3BlbiB0aGUgYXVkaW8gZGV2aWNlICovCi0JY2xvc2UoYXVkaW9fZmQpOwotCWF1ZGlvX2ZkID0gb3BlbihhdWRpb2RldiwgT19SRFdSLCAwKTsKLQlpZiAoIGF1ZGlvX2ZkIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuICVzOiAlcyIsIGF1ZGlvZGV2LCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIENhbGN1bGF0ZSB0aGUgZmluYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBhdWRpbyBzcGVjaWZpY2F0aW9uICovCi0JU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKLQotCS8qIERldGVybWluZSB0aGUgcG93ZXIgb2YgdHdvIG9mIHRoZSBmcmFnbWVudCBzaXplICovCi0JZm9yICggZnJhZ19zcGVjID0gMDsgKDB4MDE8PGZyYWdfc3BlYykgPCBzcGVjLT5zaXplOyArK2ZyYWdfc3BlYyApOwotCWlmICggKDB4MDE8PGZyYWdfc3BlYykgIT0gc3BlYy0+c2l6ZSApIHsKLQkJU0RMX1NldEVycm9yKCJGcmFnbWVudCBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28iKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTZXQgdGhlIGF1ZGlvIGJ1ZmZlcmluZyBwYXJhbWV0ZXJzICovCi0JaWYgKCBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwgJmZyYWdfc3BlYykgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmcmFnbWVudCBzcGVjIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogU2V0IHRoZSBhdWRpbyBmb3JtYXQgKi8KLQl2YWx1ZSA9IGZvcm1hdDsKLQlpZiAoIChpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9TRVRGTVQsICZ2YWx1ZSkgPCAwKSB8fAotCQkJCQkJKHZhbHVlICE9IGZvcm1hdCkgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZvcm1hdCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFNldCBtb25vIG9yIHN0ZXJlbyBhdWRpbyAqLwotCXZhbHVlID0gKHNwZWMtPmNoYW5uZWxzID4gMSk7Ci0JaWYgKCAoaW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfU1RFUkVPLCAmc3RlcmVvKSA8IDApIHx8Ci0JCQkJCQkodmFsdWUgIT0gc3RlcmVvKSApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgYXVkaW8gY2hhbm5lbHMiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTZXQgdGhlIERTUCBmcmVxdWVuY3kgKi8KLQl2YWx1ZSA9IHNwZWMtPmZyZXE7Ci0JaWYgKCBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9TUEVFRCwgJnZhbHVlKSA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZyZXF1ZW5jeSIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlzcGVjLT5mcmVxID0gdmFsdWU7Ci0KLQkvKiBXZSBzdWNjZXNzZnVsbHkgcmUtb3BlbmVkIHRoZSBhdWRpbyAqLwotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBETUFfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQotewotCWNoYXIgYXVkaW9kZXZbMTAyNF07Ci0JaW50IGZvcm1hdDsKLQlpbnQgc3RlcmVvOwotCWludCB2YWx1ZTsKLQlVaW50MTYgdGVzdF9mb3JtYXQ7Ci0Jc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGluZm87Ci0KLQkvKiBSZXNldCB0aGUgdGltZXIgc3luY2hyb25pemF0aW9uIGZsYWcgKi8KLQlmcmFtZV90aWNrcyA9IDAuMDsKLQotCS8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLwotCWF1ZGlvX2ZkID0gU0RMX09wZW5BdWRpb1BhdGgoYXVkaW9kZXYsIHNpemVvZihhdWRpb2RldiksIE9QRU5fRkxBR1MsIDApOwotCWlmICggYXVkaW9fZmQgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gJXM6ICVzIiwgYXVkaW9kZXYsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybigtMSk7Ci0JfQotCWRtYV9idWYgPSBOVUxMOwotCWlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX1JFU0VULCAwKTsKLQotCS8qIEdldCBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGhhcmR3YXJlIGZvcm1hdHMgKi8KLQlpZiAoIGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX0dFVEZNVFMsICZ2YWx1ZSkgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBhdWRpbyBmb3JtYXQgbGlzdCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFRyeSBmb3IgYSBjbG9zZXN0IG1hdGNoIG9uIGF1ZGlvIGZvcm1hdCAqLwotCWZvcm1hdCA9IDA7Ci0JZm9yICggdGVzdF9mb3JtYXQgPSBTRExfRmlyc3RBdWRpb0Zvcm1hdChzcGVjLT5mb3JtYXQpOwotCQkJCQkJISBmb3JtYXQgJiYgdGVzdF9mb3JtYXQ7ICkgewotI2lmZGVmIERFQlVHX0FVRElPCi0JCWZwcmludGYoc3RkZXJyLCAiVHJ5aW5nIGZvcm1hdCAweCU0LjR4XG4iLCB0ZXN0X2Zvcm1hdCk7Ci0jZW5kaWYKLQkJc3dpdGNoICggdGVzdF9mb3JtYXQgKSB7Ci0JCQljYXNlIEFVRElPX1U4OgotCQkJCWlmICggdmFsdWUgJiBBRk1UX1U4ICkgewotCQkJCQlmb3JtYXQgPSBBRk1UX1U4OwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fUzg6Ci0JCQkJaWYgKCB2YWx1ZSAmIEFGTVRfUzggKSB7Ci0JCQkJCWZvcm1hdCA9IEFGTVRfUzg7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURJT19TMTZMU0I6Ci0JCQkJaWYgKCB2YWx1ZSAmIEFGTVRfUzE2X0xFICkgewotCQkJCQlmb3JtYXQgPSBBRk1UX1MxNl9MRTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRElPX1MxNk1TQjoKLQkJCQlpZiAoIHZhbHVlICYgQUZNVF9TMTZfQkUgKSB7Ci0JCQkJCWZvcm1hdCA9IEFGTVRfUzE2X0JFOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fVTE2TFNCOgotCQkJCWlmICggdmFsdWUgJiBBRk1UX1UxNl9MRSApIHsKLQkJCQkJZm9ybWF0ID0gQUZNVF9VMTZfTEU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURJT19VMTZNU0I6Ci0JCQkJaWYgKCB2YWx1ZSAmIEFGTVRfVTE2X0JFICkgewotCQkJCQlmb3JtYXQgPSBBRk1UX1UxNl9CRTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWZvcm1hdCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCAhIGZvcm1hdCApIHsKLQkJCXRlc3RfZm9ybWF0ID0gU0RMX05leHRBdWRpb0Zvcm1hdCgpOwotCQl9Ci0JfQotCWlmICggZm9ybWF0ID09IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCBhbnkgaGFyZHdhcmUgYXVkaW8gZm9ybWF0cyIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlzcGVjLT5mb3JtYXQgPSB0ZXN0X2Zvcm1hdDsKLQotCS8qIFNldCB0aGUgYXVkaW8gZm9ybWF0ICovCi0JdmFsdWUgPSBmb3JtYXQ7Ci0JaWYgKCAoaW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfU0VURk1ULCAmdmFsdWUpIDwgMCkgfHwKLQkJCQkJCSh2YWx1ZSAhPSBmb3JtYXQpICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmb3JtYXQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTZXQgbW9ubyBvciBzdGVyZW8gYXVkaW8gKGN1cnJlbnRseSBvbmx5IHR3byBjaGFubmVscyBzdXBwb3J0ZWQpICovCi0Jc3RlcmVvID0gKHNwZWMtPmNoYW5uZWxzID4gMSk7Ci0JaW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfU1RFUkVPLCAmc3RlcmVvKTsKLQlpZiAoIHN0ZXJlbyApIHsKLQkJc3BlYy0+Y2hhbm5lbHMgPSAyOwotCX0gZWxzZSB7Ci0JCXNwZWMtPmNoYW5uZWxzID0gMTsKLQl9Ci0KLQkvKiBCZWNhdXNlIHNvbWUgZHJpdmVycyBkb24ndCBhbGxvdyBzZXR0aW5nIHRoZSBidWZmZXIgc2l6ZQotCSAgIGFmdGVyIHNldHRpbmcgdGhlIGZvcm1hdCwgd2UgbXVzdCByZS1vcGVuIHRoZSBhdWRpbyBkZXZpY2UKLQkgICBvbmNlIHdlIGtub3cgd2hhdCBmb3JtYXQgYW5kIGNoYW5uZWxzIGFyZSBzdXBwb3J0ZWQKLQkgKi8KLQlpZiAoIERNQV9SZW9wZW5BdWRpbyh0aGlzLCBhdWRpb2RldiwgZm9ybWF0LCBzdGVyZW8sIHNwZWMpIDwgMCApIHsKLQkJLyogRXJyb3IgaXMgc2V0IGJ5IERNQV9SZW9wZW5BdWRpbygpICovCi0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogTWVtb3J5IG1hcCB0aGUgYXVkaW8gYnVmZmVyICovCi0JaWYgKCBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9HRVRPU1BBQ0UsICZpbmZvKSA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IE9TUEFDRSBwYXJhbWV0ZXJzIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCXNwZWMtPnNpemUgPSBpbmZvLmZyYWdzaXplOwotCXNwZWMtPnNhbXBsZXMgPSBzcGVjLT5zaXplIC8gKChzcGVjLT5mb3JtYXQgJiAweEZGKSAvIDgpOwotCXNwZWMtPnNhbXBsZXMgLz0gc3BlYy0+Y2hhbm5lbHM7Ci0JbnVtX2J1ZmZlcnMgPSBpbmZvLmZyYWdzdG90YWw7Ci0JZG1hX2xlbiA9IG51bV9idWZmZXJzKnNwZWMtPnNpemU7Ci0JZG1hX2J1ZiA9IChVaW50OCAqKW1tYXAoTlVMTCwgZG1hX2xlbiwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKLQkJCQkJCQlhdWRpb19mZCwgMCk7Ci0JaWYgKCBkbWFfYnVmID09IE1BUF9GQUlMRUQgKSB7Ci0JCVNETF9TZXRFcnJvcigiRE1BIG1lbW9yeSBtYXAgZmFpbGVkIik7Ci0JCWRtYV9idWYgPSBOVUxMOwotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbWVtc2V0KGRtYV9idWYsIHNwZWMtPnNpbGVuY2UsIGRtYV9sZW4pOwotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gdXNlIHNlbGVjdCgpIHdvcmthcm91bmQgKi8KLQl7IGNoYXIgKndvcmthcm91bmQ7Ci0JCXdvcmthcm91bmQgPSBTRExfZ2V0ZW52KCJTRExfRFNQX05PU0VMRUNUIik7Ci0JCWlmICggd29ya2Fyb3VuZCApIHsKLQkJCWZyYW1lX3RpY2tzID0gKGZsb2F0KShzcGVjLT5zYW1wbGVzKjEwMDApL3NwZWMtPmZyZXE7Ci0JCQluZXh0X2ZyYW1lID0gU0RMX0dldFRpY2tzKCkrZnJhbWVfdGlja3M7Ci0JCX0KLQl9Ci0KLQkvKiBUcmlnZ2VyIGF1ZGlvIHBsYXliYWNrICovCi0JdmFsdWUgPSAwOwotCWlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX1NFVFRSSUdHRVIsICZ2YWx1ZSk7Ci0JdmFsdWUgPSBQQ01fRU5BQkxFX09VVFBVVDsKLQlpZiAoIGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX1NFVFRSSUdHRVIsICZ2YWx1ZSkgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHRyaWdnZXIgYXVkaW8gb3V0cHV0Iik7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogR2V0IHRoZSBwYXJlbnQgcHJvY2VzcyBpZCAod2UncmUgdGhlIHBhcmVudCBvZiB0aGUgYXVkaW8gdGhyZWFkKSAqLwotCXBhcmVudCA9IGdldHBpZCgpOwotCi0JLyogV2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCi0JcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kbWEvU0RMX2RtYWF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RtYS9TRExfZG1hYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4YzA1YS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RtYS9TRExfZG1hYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfZHNwYXVkaW9faAotI2RlZmluZSBfU0RMX2RzcGF1ZGlvX2gKLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7Ci0JLyogVGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGF1ZGlvIGRldmljZSAqLwotCWludCBhdWRpb19mZDsKLQotCS8qIFRoZSBwYXJlbnQgcHJvY2VzcyBpZCwgdG8gZGV0ZWN0IHdoZW4gYXBwbGljYXRpb24gcXVpdHMgKi8KLQlwaWRfdCBwYXJlbnQ7Ci0KLQkvKiBSYXcgbWl4aW5nIGJ1ZmZlciAqLwotCVVpbnQ4ICpkbWFfYnVmOwotCWludCAgICBkbWFfbGVuOwotCWludCBudW1fYnVmZmVyczsKLQotCS8qIFN1cHBvcnQgZm9yIGF1ZGlvIHRpbWluZyB1c2luZyBhIHRpbWVyLCBpbiBhZGRpdGlvbiB0byBzZWxlY3QoKSAqLwotCWZsb2F0IGZyYW1lX3RpY2tzOwotCWZsb2F0IG5leHRfZnJhbWU7Ci19OwotI2RlZmluZSBGVURHRV9USUNLUwkxMAkvKiBUaGUgc2NoZWR1bGVyIG92ZXJoZWFkIHRpY2tzIHBlciBmcmFtZSAqLwotCi0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgYXVkaW9fZmQJCSh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkKQotI2RlZmluZSBwYXJlbnQJCQkodGhpcy0+aGlkZGVuLT5wYXJlbnQpCi0jZGVmaW5lIGRtYV9idWYJCQkodGhpcy0+aGlkZGVuLT5kbWFfYnVmKQotI2RlZmluZSBkbWFfbGVuCQkJKHRoaXMtPmhpZGRlbi0+ZG1hX2xlbikKLSNkZWZpbmUgbnVtX2J1ZmZlcnMJCSh0aGlzLT5oaWRkZW4tPm51bV9idWZmZXJzKQotI2RlZmluZSBmcmFtZV90aWNrcwkJKHRoaXMtPmhpZGRlbi0+ZnJhbWVfdGlja3MpCi0jZGVmaW5lIG5leHRfZnJhbWUJCSh0aGlzLT5oaWRkZW4tPm5leHRfZnJhbWUpCi0KLSNlbmRpZiAvKiBfU0RMX2RzcGF1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZG1lZGlhL1NETF9pcml4YXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZG1lZGlhL1NETF9pcml4YXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliZDMxMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RtZWRpYS9TRExfaXJpeGF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyIChGb3IgSVJJWCA2LjUgYW5kIGhpZ2hlcikgKi8KLS8qIHBhdGNoIGZvciBJUklYIDUgYnkgR2VvcmcgU2Nod2FyeiAxOC8wNy8yMDA0ICovCi0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIlNETF9pcml4YXVkaW8uaCIKLQotCi0jaWZuZGVmIEFMX1JFU09VUkNFIC8qIGFzIGEgdGVzdCB3aGV0aGVyIHdlIHVzZSB0aGUgb2xkIElSSVggYXVkaW8gbGlicmFyaWVzICovCi0jZGVmaW5lIE9MRF9JUklYX0FVRElPCi0jZGVmaW5lIGFsQ2xvc2VQb3J0KHgpIEFMY2xvc2Vwb3J0KHgpCi0jZGVmaW5lIGFsRnJlZUNvbmZpZyh4KSBBTGZyZWVjb25maWcoeCkKLSNkZWZpbmUgYWxHZXRGaWxsYWJsZSh4KSBBTGdldGZpbGxhYmxlKHgpCi0jZGVmaW5lIGFsTmV3Q29uZmlnKCkgQUxuZXdjb25maWcoKQotI2RlZmluZSBhbE9wZW5Qb3J0KHgseSx6KSBBTG9wZW5wb3J0KHgseSx6KQotI2RlZmluZSBhbFNldENoYW5uZWxzKHgseSkgQUxzZXRjaGFubmVscyh4LHkpCi0jZGVmaW5lIGFsU2V0UXVldWVTaXplKHgseSkgQUxzZXRxdWV1ZXNpemUoeCx5KQotI2RlZmluZSBhbFNldFNhbXBGbXQoeCx5KSBBTHNldHNhbXBmbXQoeCx5KQotI2RlZmluZSBhbFNldFdpZHRoKHgseSkgQUxzZXR3aWR0aCh4LHkpCi0jZW5kaWYKLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBBTF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgQUxfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIEFMX1BsYXlBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgVWludDggKkFMX0dldEF1ZGlvQnVmKF9USElTKTsKLXN0YXRpYyB2b2lkIEFMX0Nsb3NlQXVkaW8oX1RISVMpOwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotCWlmICggdGhpcyApIHsKLQkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0JCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCX0KLQlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIHRoaXMgKSB7Ci0JCQlTRExfZnJlZSh0aGlzKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQl0aGlzLT5PcGVuQXVkaW8gPSBBTF9PcGVuQXVkaW87Ci0JdGhpcy0+V2FpdEF1ZGlvID0gQUxfV2FpdEF1ZGlvOwotCXRoaXMtPlBsYXlBdWRpbyA9IEFMX1BsYXlBdWRpbzsKLQl0aGlzLT5HZXRBdWRpb0J1ZiA9IEFMX0dldEF1ZGlvQnVmOwotCXRoaXMtPkNsb3NlQXVkaW8gPSBBTF9DbG9zZUF1ZGlvOwotCi0JdGhpcy0+ZnJlZSA9IEF1ZGlvX0RlbGV0ZURldmljZTsKLQotCXJldHVybiB0aGlzOwotfQotCi1BdWRpb0Jvb3RTdHJhcCBETUVESUFfYm9vdHN0cmFwID0gewotCSJBTCIsICJJUklYIERNZWRpYSBhdWRpbyIsCi0JQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KLQotdm9pZCBzdGF0aWMgQUxfV2FpdEF1ZGlvKF9USElTKQotewotCVNpbnQzMiB0aW1lbGVmdDsKLQotCXRpbWVsZWZ0ID0gdGhpcy0+c3BlYy5zYW1wbGVzIC0gYWxHZXRGaWxsYWJsZShhdWRpb19wb3J0KTsKLQlpZiAoIHRpbWVsZWZ0ID4gMCApIHsKLQkJdGltZWxlZnQgLz0gKHRoaXMtPnNwZWMuZnJlcS8xMDAwKTsKLQkJU0RMX0RlbGF5KChVaW50MzIpdGltZWxlZnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQUxfUGxheUF1ZGlvKF9USElTKQotewotCS8qIFdyaXRlIHRoZSBhdWRpbyBkYXRhIG91dCAqLwotCWlmICggYWxXcml0ZUZyYW1lcyhhdWRpb19wb3J0LCBtaXhidWYsIHRoaXMtPnNwZWMuc2FtcGxlcykgPCAwICkgewotCQkvKiBBc3N1bWUgZmF0YWwgZXJyb3IsIGZvciBub3cgKi8KLQkJdGhpcy0+ZW5hYmxlZCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgVWludDggKkFMX0dldEF1ZGlvQnVmKF9USElTKQotewotCXJldHVybihtaXhidWYpOwotfQotCi1zdGF0aWMgdm9pZCBBTF9DbG9zZUF1ZGlvKF9USElTKQotewotCWlmICggbWl4YnVmICE9IE5VTEwgKSB7Ci0JCVNETF9GcmVlQXVkaW9NZW0obWl4YnVmKTsKLQkJbWl4YnVmID0gTlVMTDsKLQl9Ci0JaWYgKCBhdWRpb19wb3J0ICE9IE5VTEwgKSB7Ci0JCWFsQ2xvc2VQb3J0KGF1ZGlvX3BvcnQpOwotCQlhdWRpb19wb3J0ID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgQUxfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICogc3BlYykKLXsKLQlVaW50MTYgdGVzdF9mb3JtYXQgPSBTRExfRmlyc3RBdWRpb0Zvcm1hdChzcGVjLT5mb3JtYXQpOwotCWxvbmcgd2lkdGggPSAwOwotCWxvbmcgZm10ID0gMDsKLQlpbnQgdmFsaWQgPSAwOwotCi0jaWZkZWYgT0xEX0lSSVhfQVVESU8KLQl7Ci0JCWxvbmcgYXVkaW9fcGFyYW1bMl07Ci0JCWF1ZGlvX3BhcmFtWzBdID0gQUxfT1VUUFVUX1JBVEU7Ci0JCWF1ZGlvX3BhcmFtWzFdID0gc3BlYy0+ZnJlcTsKLQkJdmFsaWQgPSAoQUxzZXRwYXJhbXMoQUxfREVGQVVMVF9ERVZJQ0UsIGF1ZGlvX3BhcmFtLCAyKSA8IDApOwotCX0KLSNlbHNlCi0JewotCQlBTHB2IGF1ZGlvX3BhcmFtOwotCQlhdWRpb19wYXJhbS5wYXJhbSA9IEFMX1JBVEU7Ci0JCWF1ZGlvX3BhcmFtLnZhbHVlLmkgPSBzcGVjLT5mcmVxOwotCQl2YWxpZCA9IChhbFNldFBhcmFtcyhBTF9ERUZBVUxUX09VVFBVVCwgJmF1ZGlvX3BhcmFtLCAxKSA8IDApOwotCX0KLSNlbmRpZgotCi0Jd2hpbGUgKCghdmFsaWQpICYmICh0ZXN0X2Zvcm1hdCkpIHsKLQkJdmFsaWQgPSAxOwotCQlzcGVjLT5mb3JtYXQgPSB0ZXN0X2Zvcm1hdDsKLQotCQlzd2l0Y2ggKHRlc3RfZm9ybWF0KSB7Ci0JCQljYXNlIEFVRElPX1M4OgotCQkJCXdpZHRoID0gQUxfU0FNUExFXzg7Ci0JCQkJZm10ID0gQUxfU0FNUEZNVF9UV09TQ09NUDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBVURJT19TMTZTWVM6Ci0JCQkJd2lkdGggPSBBTF9TQU1QTEVfMTY7Ci0JCQkJZm10ID0gQUxfU0FNUEZNVF9UV09TQ09NUDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQl2YWxpZCA9IDA7Ci0JCQkJdGVzdF9mb3JtYXQgPSBTRExfTmV4dEF1ZGlvRm9ybWF0KCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodmFsaWQpIHsKLQkJCUFMY29uZmlnIGF1ZGlvX2NvbmZpZyA9IGFsTmV3Q29uZmlnKCk7Ci0JCQl2YWxpZCA9IDA7Ci0JCQlpZiAoYXVkaW9fY29uZmlnKSB7Ci0JCQkJaWYgKGFsU2V0Q2hhbm5lbHMoYXVkaW9fY29uZmlnLCBzcGVjLT5jaGFubmVscykgPCAwKSB7Ci0JCQkJCWlmIChzcGVjLT5jaGFubmVscyA+IDIpIHsgIC8qIGNhbid0IGhhbmRsZSA+IHN0ZXJlbz8gKi8KLQkJCQkJCXNwZWMtPmNoYW5uZWxzID0gMjsgIC8qIHRyeSBhZ2FpbiBiZWxvdy4gKi8KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICgoYWxTZXRTYW1wRm10KGF1ZGlvX2NvbmZpZywgZm10KSA+PSAwKSAmJgotCQkJCSAgICAoKCF3aWR0aCkgfHwgKGFsU2V0V2lkdGgoYXVkaW9fY29uZmlnLCB3aWR0aCkgPj0gMCkpICYmCi0JCQkJICAgIChhbFNldFF1ZXVlU2l6ZShhdWRpb19jb25maWcsIHNwZWMtPnNhbXBsZXMgKiAyKSA+PSAwKSAmJgotCQkJCSAgICAoYWxTZXRDaGFubmVscyhhdWRpb19jb25maWcsIHNwZWMtPmNoYW5uZWxzKSA+PSAwKSkgewotCi0JCQkJCWF1ZGlvX3BvcnQgPSBhbE9wZW5Qb3J0KCJTREwgYXVkaW8iLCAidyIsIGF1ZGlvX2NvbmZpZyk7Ci0JCQkJCWlmIChhdWRpb19wb3J0ID09IE5VTEwpIHsKLQkJCQkJCS8qIGRvY3Mgc2F5IEFMX0JBRF9DSEFOTkVMUyBoYXBwZW5zIGhlcmUsIHRvby4gKi8KLQkJCQkJCWludCBlcnIgPSBvc2Vycm9yKCk7Ci0JCQkJCQlpZiAoZXJyID09IEFMX0JBRF9DSEFOTkVMUykgewotCQkJCQkJCXNwZWMtPmNoYW5uZWxzID0gMjsKLQkJCQkJCQlhbFNldENoYW5uZWxzKGF1ZGlvX2NvbmZpZywgc3BlYy0+Y2hhbm5lbHMpOwotCQkJCQkJCWF1ZGlvX3BvcnQgPSBhbE9wZW5Qb3J0KCJTREwgYXVkaW8iLCAidyIsCi0JCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChhdWRpb19wb3J0ICE9IE5VTEwpIHsKLQkJCQkJCXZhbGlkID0gMTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWFsRnJlZUNvbmZpZyhhdWRpb19jb25maWcpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCF2YWxpZCkgewotCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQkvKiBVcGRhdGUgdGhlIGZyYWdtZW50IHNpemUgYXMgc2l6ZSBpbiBieXRlcyAqLwotCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7Ci0KLQkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCi0JbWl4YnVmID0gKFVpbnQ4ICopIFNETF9BbGxvY0F1ZGlvTWVtKHNwZWMtPnNpemUpOwotCWlmIChtaXhidWYgPT0gTlVMTCkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCVNETF9tZW1zZXQobWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKLQotCS8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLwotCXJldHVybiAoMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZG1lZGlhL1NETF9pcml4YXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZG1lZGlhL1NETF9pcml4YXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxZGU0MS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RtZWRpYS9TRExfaXJpeGF1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2xvd2F1ZGlvX2gKLSNkZWZpbmUgX1NETF9sb3dhdWRpb19oCi0KLSNpbmNsdWRlIDxkbWVkaWEvYXVkaW8uaD4KLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSBhdWRpbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7Ci0JLyogVGhlIGhhbmRsZSBmb3IgdGhlIGF1ZGlvIGRldmljZSAqLwotCUFMcG9ydCBhdWRpb19wb3J0OwotCi0JVWludDggKm1peGJ1ZjsgICAgICAgICAgIC8qIFRoZSBhcHAgbWl4aW5nIGJ1ZmZlciAqLwotfTsKLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIGF1ZGlvX3BvcnQJCSh0aGlzLT5oaWRkZW4tPmF1ZGlvX3BvcnQpCi0jZGVmaW5lIG1peGJ1ZgkJCSh0aGlzLT5oaWRkZW4tPm1peGJ1ZikKLQotI2VuZGlmIC8qIF9TRExfbG93YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kc3AvU0RMX2RzcGF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RzcC9TRExfZHNwYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2MTdlMy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RzcC9TRExfZHNwYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0KLSAgICBNb2RpZmllZCBpbiBPY3QgMjAwNCBieSBIYW5udSBTYXZvbGFpbmVuIAotICAgIGhhbm51QG9wZW5zb3VuZC5jb20KLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4JLyogRm9yIHBlcnJvcigpICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+CS8qIEZvciBzdHJlcnJvcigpICovCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmIFNETF9BVURJT19EUklWRVJfT1NTX1NPVU5EQ0FSRF9ICi0vKiBUaGlzIGlzIGluc3RhbGxlZCBvbiBzb21lIHN5c3RlbXMgKi8KLSNpbmNsdWRlIDxzb3VuZGNhcmQuaD4KLSNlbHNlCi0vKiBUaGlzIGlzIHJlY29tbWVuZGVkIGJ5IE9TUyAqLwotI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgotI2luY2x1ZGUgIlNETF9kc3BhdWRpby5oIgotCi0vKiBUaGUgdGFnIG5hbWUgdXNlZCBieSBEU1AgYXVkaW8gKi8KLSNkZWZpbmUgRFNQX0RSSVZFUl9OQU1FICAgICAgICAgImRzcCIKLQotLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjaywgYW5kIGRvbid0IGJsb2NrIGlmIGJ1c3kgKi8KLSNkZWZpbmUgT1BFTl9GTEFHUwkoT19XUk9OTFl8T19OT05CTE9DSykKLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBEU1BfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIERTUF9XYWl0QXVkaW8oX1RISVMpOwotc3RhdGljIHZvaWQgRFNQX1BsYXlBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgVWludDggKkRTUF9HZXRBdWRpb0J1ZihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBEU1BfQ2xvc2VBdWRpbyhfVEhJUyk7Ci0KLS8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCi17Ci0JaW50IGZkOwotCWludCBhdmFpbGFibGU7Ci0KLQlhdmFpbGFibGUgPSAwOwotCWZkID0gU0RMX09wZW5BdWRpb1BhdGgoTlVMTCwgMCwgT1BFTl9GTEFHUywgMCk7Ci0JaWYgKCBmZCA+PSAwICkgewotCQlhdmFpbGFibGUgPSAxOwotCQljbG9zZShmZCk7Ci0JfQotCXJldHVybihhdmFpbGFibGUpOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotCWlmICggdGhpcyApIHsKLQkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0JCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCX0KLQlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIHRoaXMgKSB7Ci0JCQlTRExfZnJlZSh0aGlzKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQlhdWRpb19mZCA9IC0xOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCXRoaXMtPk9wZW5BdWRpbyA9IERTUF9PcGVuQXVkaW87Ci0JdGhpcy0+V2FpdEF1ZGlvID0gRFNQX1dhaXRBdWRpbzsKLQl0aGlzLT5QbGF5QXVkaW8gPSBEU1BfUGxheUF1ZGlvOwotCXRoaXMtPkdldEF1ZGlvQnVmID0gRFNQX0dldEF1ZGlvQnVmOwotCXRoaXMtPkNsb3NlQXVkaW8gPSBEU1BfQ2xvc2VBdWRpbzsKLQotCXRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7Ci0KLQlyZXR1cm4gdGhpczsKLX0KLQotQXVkaW9Cb290U3RyYXAgRFNQX2Jvb3RzdHJhcCA9IHsKLQlEU1BfRFJJVkVSX05BTUUsICJPU1MgL2Rldi9kc3Agc3RhbmRhcmQgYXVkaW8iLAotCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KLXN0YXRpYyB2b2lkIERTUF9XYWl0QXVkaW8oX1RISVMpCi17Ci0JLyogTm90IG5lZWRlZCBhdCBhbGwgc2luY2UgT1NTIGhhbmRsZXMgd2FpdGluZyBhdXRvbWFnaWNhbGx5ICovCi19Ci0KLXN0YXRpYyB2b2lkIERTUF9QbGF5QXVkaW8oX1RISVMpCi17Ci0JaWYgKHdyaXRlKGF1ZGlvX2ZkLCBtaXhidWYsIG1peGxlbik9PS0xKQotCXsKLQkJcGVycm9yKCJBdWRpbyB3cml0ZSIpOwotCQl0aGlzLT5lbmFibGVkID0gMDsKLQl9Ci0KLSNpZmRlZiBERUJVR19BVURJTwotCWZwcmludGYoc3RkZXJyLCAiV3JvdGUgJWQgYnl0ZXMgb2YgYXVkaW8gZGF0YVxuIiwgbWl4bGVuKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgVWludDggKkRTUF9HZXRBdWRpb0J1ZihfVEhJUykKLXsKLQlyZXR1cm4obWl4YnVmKTsKLX0KLQotc3RhdGljIHZvaWQgRFNQX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0JaWYgKCBtaXhidWYgIT0gTlVMTCApIHsKLQkJU0RMX0ZyZWVBdWRpb01lbShtaXhidWYpOwotCQltaXhidWYgPSBOVUxMOwotCX0KLQlpZiAoIGF1ZGlvX2ZkID49IDAgKSB7Ci0JCWNsb3NlKGF1ZGlvX2ZkKTsKLQkJYXVkaW9fZmQgPSAtMTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgRFNQX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQljaGFyIGF1ZGlvZGV2WzEwMjRdOwotCWludCBmb3JtYXQ7Ci0JaW50IHZhbHVlOwotCWludCBmcmFnX3NwZWM7Ci0JVWludDE2IHRlc3RfZm9ybWF0OwotCi0gICAgLyogTWFrZSBzdXJlIGZyYWdtZW50IHNpemUgc3RheXMgYSBwb3dlciBvZiAyLCBvciBPU1MgZmFpbHMuICovCi0gICAgLyogSSBkb24ndCBrbm93IHdoaWNoIG9mIHRoZXNlIGFyZSBhY3R1YWxseSBsZWdhbCB2YWx1ZXMsIHRob3VnaC4uLiAqLwotICAgIGlmIChzcGVjLT5jaGFubmVscyA+IDgpCi0gICAgICAgIHNwZWMtPmNoYW5uZWxzID0gODsKLSAgICBlbHNlIGlmIChzcGVjLT5jaGFubmVscyA+IDQpCi0gICAgICAgIHNwZWMtPmNoYW5uZWxzID0gNDsKLSAgICBlbHNlIGlmIChzcGVjLT5jaGFubmVscyA+IDIpCi0gICAgICAgIHNwZWMtPmNoYW5uZWxzID0gMjsKLQotCS8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLwotCWF1ZGlvX2ZkID0gU0RMX09wZW5BdWRpb1BhdGgoYXVkaW9kZXYsIHNpemVvZihhdWRpb2RldiksIE9QRU5fRkxBR1MsIDApOwotCWlmICggYXVkaW9fZmQgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gJXM6ICVzIiwgYXVkaW9kZXYsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybigtMSk7Ci0JfQotCW1peGJ1ZiA9IE5VTEw7Ci0KLQkvKiBNYWtlIHRoZSBmaWxlIGRlc2NyaXB0b3IgdXNlIGJsb2NraW5nIHdyaXRlcyB3aXRoIGZjbnRsKCkgKi8KLQl7IGxvbmcgZmxhZ3M7Ci0JCWZsYWdzID0gZmNudGwoYXVkaW9fZmQsIEZfR0VURkwpOwotCQlmbGFncyAmPSB+T19OT05CTE9DSzsKLQkJaWYgKCBmY250bChhdWRpb19mZCwgRl9TRVRGTCwgZmxhZ3MpIDwgMCApIHsKLQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGJsb2NraW5nIG1vZGUiKTsKLQkJCURTUF9DbG9zZUF1ZGlvKHRoaXMpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCX0KLQotCS8qIEdldCBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGhhcmR3YXJlIGZvcm1hdHMgKi8KLQlpZiAoIGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX0dFVEZNVFMsICZ2YWx1ZSkgPCAwICkgewotCQlwZXJyb3IoIlNORENUTF9EU1BfR0VURk1UUyIpOwotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBhdWRpbyBmb3JtYXQgbGlzdCIpOwotCQlEU1BfQ2xvc2VBdWRpbyh0aGlzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBUcnkgZm9yIGEgY2xvc2VzdCBtYXRjaCBvbiBhdWRpbyBmb3JtYXQgKi8KLQlmb3JtYXQgPSAwOwotCWZvciAoIHRlc3RfZm9ybWF0ID0gU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoc3BlYy0+Zm9ybWF0KTsKLQkJCQkJCSEgZm9ybWF0ICYmIHRlc3RfZm9ybWF0OyApIHsKLSNpZmRlZiBERUJVR19BVURJTwotCQlmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyBmb3JtYXQgMHglNC40eFxuIiwgdGVzdF9mb3JtYXQpOwotI2VuZGlmCi0JCXN3aXRjaCAoIHRlc3RfZm9ybWF0ICkgewotCQkJY2FzZSBBVURJT19VODoKLQkJCQlpZiAoIHZhbHVlICYgQUZNVF9VOCApIHsKLQkJCQkJZm9ybWF0ID0gQUZNVF9VODsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRElPX1MxNkxTQjoKLQkJCQlpZiAoIHZhbHVlICYgQUZNVF9TMTZfTEUgKSB7Ci0JCQkJCWZvcm1hdCA9IEFGTVRfUzE2X0xFOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fUzE2TVNCOgotCQkJCWlmICggdmFsdWUgJiBBRk1UX1MxNl9CRSApIHsKLQkJCQkJZm9ybWF0ID0gQUZNVF9TMTZfQkU7Ci0JCQkJfQotCQkJCWJyZWFrOwotI2lmIDAKLS8qCi0gKiBUaGVzZSBmb3JtYXRzIGFyZSBub3QgdXNlZCBieSBhbnkgcmVhbCBsaWZlIHN5c3RlbXMgc28gdGhleSBhcmUgbm90IAotICogbmVlZGVkIGhlcmUuCi0gKi8KLQkJCWNhc2UgQVVESU9fUzg6Ci0JCQkJaWYgKCB2YWx1ZSAmIEFGTVRfUzggKSB7Ci0JCQkJCWZvcm1hdCA9IEFGTVRfUzg7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURJT19VMTZMU0I6Ci0JCQkJaWYgKCB2YWx1ZSAmIEFGTVRfVTE2X0xFICkgewotCQkJCQlmb3JtYXQgPSBBRk1UX1UxNl9MRTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRElPX1UxNk1TQjoKLQkJCQlpZiAoIHZhbHVlICYgQUZNVF9VMTZfQkUgKSB7Ci0JCQkJCWZvcm1hdCA9IEFGTVRfVTE2X0JFOwotCQkJCX0KLQkJCQlicmVhazsKLSNlbmRpZgotCQkJZGVmYXVsdDoKLQkJCQlmb3JtYXQgPSAwOwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICggISBmb3JtYXQgKSB7Ci0JCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKLQkJfQotCX0KLQlpZiAoIGZvcm1hdCA9PSAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHMiKTsKLQkJRFNQX0Nsb3NlQXVkaW8odGhpcyk7Ci0JCXJldHVybigtMSk7Ci0JfQotCXNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OwotCi0JLyogU2V0IHRoZSBhdWRpbyBmb3JtYXQgKi8KLQl2YWx1ZSA9IGZvcm1hdDsKLQlpZiAoIChpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9TRVRGTVQsICZ2YWx1ZSkgPCAwKSB8fAotCQkJCQkJKHZhbHVlICE9IGZvcm1hdCkgKSB7Ci0JCXBlcnJvcigiU05EQ1RMX0RTUF9TRVRGTVQiKTsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgYXVkaW8gZm9ybWF0Iik7Ci0JCURTUF9DbG9zZUF1ZGlvKHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFNldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIG91dHB1dCAqLwotCXZhbHVlID0gc3BlYy0+Y2hhbm5lbHM7Ci0JaWYgKCBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9DSEFOTkVMUywgJnZhbHVlKSA8IDAgKSB7Ci0JCXBlcnJvcigiU05EQ1RMX0RTUF9DSEFOTkVMUyIpOwotCQlTRExfU2V0RXJyb3IoIkNhbm5vdCBzZXQgdGhlIG51bWJlciBvZiBjaGFubmVscyIpOwotCQlEU1BfQ2xvc2VBdWRpbyh0aGlzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0Jc3BlYy0+Y2hhbm5lbHMgPSB2YWx1ZTsKLQotCS8qIFNldCB0aGUgRFNQIGZyZXF1ZW5jeSAqLwotCXZhbHVlID0gc3BlYy0+ZnJlcTsKLQlpZiAoIGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX1NQRUVELCAmdmFsdWUpIDwgMCApIHsKLQkJcGVycm9yKCJTTkRDVExfRFNQX1NQRUVEIik7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZyZXF1ZW5jeSIpOwotCQlEU1BfQ2xvc2VBdWRpbyh0aGlzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0Jc3BlYy0+ZnJlcSA9IHZhbHVlOwotCi0JLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGF1ZGlvIHNwZWNpZmljYXRpb24gKi8KLQlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCi0JLyogRGV0ZXJtaW5lIHRoZSBwb3dlciBvZiB0d28gb2YgdGhlIGZyYWdtZW50IHNpemUgKi8KLQlmb3IgKCBmcmFnX3NwZWMgPSAwOyAoMHgwMVU8PGZyYWdfc3BlYykgPCBzcGVjLT5zaXplOyArK2ZyYWdfc3BlYyApOwotCWlmICggKDB4MDFVPDxmcmFnX3NwZWMpICE9IHNwZWMtPnNpemUgKSB7Ci0JCVNETF9TZXRFcnJvcigiRnJhZ21lbnQgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIik7Ci0JCURTUF9DbG9zZUF1ZGlvKHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlmcmFnX3NwZWMgfD0gMHgwMDAyMDAwMDsJLyogdHdvIGZyYWdtZW50cywgZm9yIGxvdyBsYXRlbmN5ICovCi0KLQkvKiBTZXQgdGhlIGF1ZGlvIGJ1ZmZlcmluZyBwYXJhbWV0ZXJzICovCi0jaWZkZWYgREVCVUdfQVVESU8KLQlmcHJpbnRmKHN0ZGVyciwgIlJlcXVlc3RpbmcgJWQgZnJhZ21lbnRzIG9mIHNpemUgJWRcbiIsCi0JCShmcmFnX3NwZWMgPj4gMTYpLCAxPDwoZnJhZ19zcGVjJjB4RkZGRikpOwotI2VuZGlmCi0JaWYgKCBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwgJmZyYWdfc3BlYykgPCAwICkgewotCQlwZXJyb3IoIlNORENUTF9EU1BfU0VURlJBR01FTlQiKTsKLQl9Ci0jaWZkZWYgREVCVUdfQVVESU8KLQl7IGF1ZGlvX2J1Zl9pbmZvIGluZm87Ci0JICBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9HRVRPU1BBQ0UsICZpbmZvKTsKLQkgIGZwcmludGYoc3RkZXJyLCAiZnJhZ21lbnRzID0gJWRcbiIsIGluZm8uZnJhZ21lbnRzKTsKLQkgIGZwcmludGYoc3RkZXJyLCAiZnJhZ3N0b3RhbCA9ICVkXG4iLCBpbmZvLmZyYWdzdG90YWwpOwotCSAgZnByaW50ZihzdGRlcnIsICJmcmFnc2l6ZSA9ICVkXG4iLCBpbmZvLmZyYWdzaXplKTsKLQkgIGZwcmludGYoc3RkZXJyLCAiYnl0ZXMgPSAlZFxuIiwgaW5mby5ieXRlcyk7Ci0JfQotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCi0JbWl4bGVuID0gc3BlYy0+c2l6ZTsKLQltaXhidWYgPSAoVWludDggKilTRExfQWxsb2NBdWRpb01lbShtaXhsZW4pOwotCWlmICggbWl4YnVmID09IE5VTEwgKSB7Ci0JCURTUF9DbG9zZUF1ZGlvKHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbWVtc2V0KG1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7Ci0KLQkvKiBHZXQgdGhlIHBhcmVudCBwcm9jZXNzIGlkICh3ZSdyZSB0aGUgcGFyZW50IG9mIHRoZSBhdWRpbyB0aHJlYWQpICovCi0JcGFyZW50ID0gZ2V0cGlkKCk7Ci0KLQkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KLQlyZXR1cm4oMCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2RzcC9TRExfZHNwYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZHNwL1NETF9kc3BhdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmY4MDNmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZHNwL1NETF9kc3BhdWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9kc3BhdWRpb19oCi0jZGVmaW5lIF9TRExfZHNwYXVkaW9faAotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKLQotc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKLQkvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCi0JaW50IGF1ZGlvX2ZkOwotCi0JLyogVGhlIHBhcmVudCBwcm9jZXNzIGlkLCB0byBkZXRlY3Qgd2hlbiBhcHBsaWNhdGlvbiBxdWl0cyAqLwotCXBpZF90IHBhcmVudDsKLQotCS8qIFJhdyBtaXhpbmcgYnVmZmVyICovCi0JVWludDggKm1peGJ1ZjsKLQlpbnQgICAgbWl4bGVuOwotfTsKLSNkZWZpbmUgRlVER0VfVElDS1MJMTAJLyogVGhlIHNjaGVkdWxlciBvdmVyaGVhZCB0aWNrcyBwZXIgZnJhbWUgKi8KLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIGF1ZGlvX2ZkCQkodGhpcy0+aGlkZGVuLT5hdWRpb19mZCkKLSNkZWZpbmUgcGFyZW50CQkJKHRoaXMtPmhpZGRlbi0+cGFyZW50KQotI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCi0jZGVmaW5lIG1peGxlbgkJCSh0aGlzLT5oaWRkZW4tPm1peGxlbikKLSNkZWZpbmUgZnJhbWVfdGlja3MJCSh0aGlzLT5oaWRkZW4tPmZyYW1lX3RpY2tzKQotI2RlZmluZSBuZXh0X2ZyYW1lCQkodGhpcy0+aGlkZGVuLT5uZXh0X2ZyYW1lKQotCi0jZW5kaWYgLyogX1NETF9kc3BhdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2R1bW15L1NETF9kdW1teWF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2R1bW15L1NETF9kdW1teWF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOWEzZjAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9kdW1teS9TRExfZHVtbXlhdWRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLQotICAgIFRoaXMgZmlsZSB3cml0dGVuIGJ5IFJ5YW4gQy4gR29yZG9uIChpY2N1bHVzQGljY3VsdXMub3JnKQotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIE91dHB1dCBhdWRpbyB0byBub3doZXJlLi4uICovCi0KLSNpbmNsdWRlICJTRExfcndvcHMuaCIKLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCi0jaW5jbHVkZSAiU0RMX2R1bW15YXVkaW8uaCIKLQotLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgRFVNTVkgYXVkaW8gKi8KLSNkZWZpbmUgRFVNTVlBVURfRFJJVkVSX05BTUUgICAgICAgICAiZHVtbXkiCi0KLS8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRFVNTVlBVURfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIERVTU1ZQVVEX1dhaXRBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgdm9pZCBEVU1NWUFVRF9QbGF5QXVkaW8oX1RISVMpOwotc3RhdGljIFVpbnQ4ICpEVU1NWUFVRF9HZXRBdWRpb0J1ZihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBEVU1NWUFVRF9DbG9zZUF1ZGlvKF9USElTKTsKLQotLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRFVNTVlBVURfQXZhaWxhYmxlKHZvaWQpCi17Ci0JY29uc3QgY2hhciAqZW52ciA9IFNETF9nZXRlbnYoIlNETF9BVURJT0RSSVZFUiIpOwotCWlmIChlbnZyICYmIChTRExfc3RyY21wKGVudnIsIERVTU1ZQVVEX0RSSVZFUl9OQU1FKSA9PSAwKSkgewotCQlyZXR1cm4oMSk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgRFVNTVlBVURfRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpEVU1NWUFVRF9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9BdWRpb0RldmljZSAqdGhpczsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLQlpZiAoIHRoaXMgKSB7Ci0JCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOwotCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQl9Ci0JaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCB0aGlzICkgewotCQkJU0RMX2ZyZWUodGhpcyk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JdGhpcy0+T3BlbkF1ZGlvID0gRFVNTVlBVURfT3BlbkF1ZGlvOwotCXRoaXMtPldhaXRBdWRpbyA9IERVTU1ZQVVEX1dhaXRBdWRpbzsKLQl0aGlzLT5QbGF5QXVkaW8gPSBEVU1NWUFVRF9QbGF5QXVkaW87Ci0JdGhpcy0+R2V0QXVkaW9CdWYgPSBEVU1NWUFVRF9HZXRBdWRpb0J1ZjsKLQl0aGlzLT5DbG9zZUF1ZGlvID0gRFVNTVlBVURfQ2xvc2VBdWRpbzsKLQotCXRoaXMtPmZyZWUgPSBEVU1NWUFVRF9EZWxldGVEZXZpY2U7Ci0KLQlyZXR1cm4gdGhpczsKLX0KLQotQXVkaW9Cb290U3RyYXAgRFVNTVlBVURfYm9vdHN0cmFwID0gewotCURVTU1ZQVVEX0RSSVZFUl9OQU1FLCAiU0RMIGR1bW15IGF1ZGlvIGRyaXZlciIsCi0JRFVNTVlBVURfQXZhaWxhYmxlLCBEVU1NWUFVRF9DcmVhdGVEZXZpY2UKLX07Ci0KLS8qIFRoaXMgZnVuY3Rpb24gd2FpdHMgdW50aWwgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgYSBmdWxsIHNvdW5kIGJ1ZmZlciAqLwotc3RhdGljIHZvaWQgRFVNTVlBVURfV2FpdEF1ZGlvKF9USElTKQotewotCS8qIERvbid0IGJsb2NrIG9uIGZpcnN0IGNhbGxzIHRvIHNpbXVsYXRlIGluaXRpYWwgZnJhZ21lbnQgZmlsbGluZy4gKi8KLQlpZiAodGhpcy0+aGlkZGVuLT5pbml0aWFsX2NhbGxzKQotCQl0aGlzLT5oaWRkZW4tPmluaXRpYWxfY2FsbHMtLTsKLQllbHNlCi0JCVNETF9EZWxheSh0aGlzLT5oaWRkZW4tPndyaXRlX2RlbGF5KTsKLX0KLQotc3RhdGljIHZvaWQgRFVNTVlBVURfUGxheUF1ZGlvKF9USElTKQotewotCS8qIG5vLW9wLi4udGhpcyBpcyBhIG51bGwgZHJpdmVyLiAqLwotfQotCi1zdGF0aWMgVWludDggKkRVTU1ZQVVEX0dldEF1ZGlvQnVmKF9USElTKQotewotCXJldHVybih0aGlzLT5oaWRkZW4tPm1peGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkIERVTU1ZQVVEX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0JaWYgKCB0aGlzLT5oaWRkZW4tPm1peGJ1ZiAhPSBOVUxMICkgewotCQlTRExfRnJlZUF1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4YnVmKTsKLQkJdGhpcy0+aGlkZGVuLT5taXhidWYgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIGludCBEVU1NWUFVRF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JZmxvYXQgYnl0ZXNfcGVyX3NlYyA9IDAuMGY7Ci0KLQkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCi0JdGhpcy0+aGlkZGVuLT5taXhsZW4gPSBzcGVjLT5zaXplOwotCXRoaXMtPmhpZGRlbi0+bWl4YnVmID0gKFVpbnQ4ICopIFNETF9BbGxvY0F1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4bGVuKTsKLQlpZiAoIHRoaXMtPmhpZGRlbi0+bWl4YnVmID09IE5VTEwgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLT5taXhidWYsIHNwZWMtPnNpbGVuY2UsIHNwZWMtPnNpemUpOwotCi0JYnl0ZXNfcGVyX3NlYyA9IChmbG9hdCkgKCgoc3BlYy0+Zm9ybWF0ICYgMHhGRikgLyA4KSAqCi0JICAgICAgICAgICAgICAgICAgIHNwZWMtPmNoYW5uZWxzICogc3BlYy0+ZnJlcSk7Ci0KLQkvKgotCSAqIFdlIHRyeSB0byBtYWtlIHRoaXMgcmVxdWVzdCBtb3JlIGF1ZGlvIGF0IHRoZSBjb3JyZWN0IHJhdGUgZm9yCi0JICogIGEgZ2l2ZW4gYXVkaW8gc3BlYywgc28gdGltaW5nIHN0YXlzIGZhaXJseSBmYWl0aGZ1bC4KLQkgKiBBbHNvLCB3ZSBoYXZlIGl0IG5vdCBibG9jayBhdCBhbGwgZm9yIHRoZSBmaXJzdCB0d28gY2FsbHMsIHNvCi0JICogIGl0IHNlZW1zIGxpa2Ugd2UncmUgZmlsbGluZyB0d28gYXVkaW8gZnJhZ21lbnRzIHJpZ2h0IG91dCBvZiB0aGUKLQkgKiAgZ2F0ZSwgbGlrZSBvdGhlciBTREwgZHJpdmVycyB0ZW5kIHRvIGRvLgotCSAqLwotCXRoaXMtPmhpZGRlbi0+aW5pdGlhbF9jYWxscyA9IDI7Ci0JdGhpcy0+aGlkZGVuLT53cml0ZV9kZWxheSA9Ci0JICAgICAgICAgICAgICAgKFVpbnQzMikgKCgoKGZsb2F0KSBzcGVjLT5zaXplKSAvIGJ5dGVzX3Blcl9zZWMpICogMTAwMC4wZik7Ci0KLQkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KLQlyZXR1cm4oMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZHVtbXkvU0RMX2R1bW15YXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZHVtbXkvU0RMX2R1bW15YXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxNmNjNy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2R1bW15L1NETF9kdW1teWF1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2R1bW15YXVkaW9faAotI2RlZmluZSBfU0RMX2R1bW15YXVkaW9faAotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKLQotc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKLQkvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCi0JVWludDggKm1peGJ1ZjsKLQlVaW50MzIgbWl4bGVuOwotCVVpbnQzMiB3cml0ZV9kZWxheTsKLQlVaW50MzIgaW5pdGlhbF9jYWxsczsKLX07Ci0KLSNlbmRpZiAvKiBfU0RMX2R1bW15YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9lc2QvU0RMX2VzZGF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2VzZC9TRExfZXNkYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1ZTg5YS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2VzZC9TRExfZXNkYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogQWxsb3cgYWNjZXNzIHRvIGFuIEVTRCBuZXR3b3JrIHN0cmVhbSBtaXhpbmcgYnVmZmVyICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGVzZC5oPgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgotI2luY2x1ZGUgIlNETF9lc2RhdWRpby5oIgotCi0jaWZkZWYgU0RMX0FVRElPX0RSSVZFUl9FU0RfRFlOQU1JQwotI2luY2x1ZGUgIlNETF9uYW1lLmgiCi0jaW5jbHVkZSAiU0RMX2xvYWRzby5oIgotI2Vsc2UKLSNkZWZpbmUgU0RMX05BTUUoWCkJWAotI2VuZGlmCi0KLS8qIFRoZSB0YWcgbmFtZSB1c2VkIGJ5IEVTRCBhdWRpbyAqLwotI2RlZmluZSBFU0RfRFJJVkVSX05BTUUJCSJlc2QiCi0KLS8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRVNEX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7Ci1zdGF0aWMgdm9pZCBFU0RfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIEVTRF9QbGF5QXVkaW8oX1RISVMpOwotc3RhdGljIFVpbnQ4ICpFU0RfR2V0QXVkaW9CdWYoX1RISVMpOwotc3RhdGljIHZvaWQgRVNEX0Nsb3NlQXVkaW8oX1RISVMpOwotCi0jaWZkZWYgU0RMX0FVRElPX0RSSVZFUl9FU0RfRFlOQU1JQwotCi1zdGF0aWMgY29uc3QgY2hhciAqZXNkX2xpYnJhcnkgPSBTRExfQVVESU9fRFJJVkVSX0VTRF9EWU5BTUlDOwotc3RhdGljIHZvaWQgKmVzZF9oYW5kbGUgPSBOVUxMOwotc3RhdGljIGludCBlc2RfbG9hZGVkID0gMDsKLQotc3RhdGljIGludCAoKlNETF9OQU1FKGVzZF9vcGVuX3NvdW5kKSkoIGNvbnN0IGNoYXIgKmhvc3QgKTsKLXN0YXRpYyBpbnQgKCpTRExfTkFNRShlc2RfY2xvc2UpKSggaW50IGVzZCApOwotc3RhdGljIGludCAoKlNETF9OQU1FKGVzZF9wbGF5X3N0cmVhbSkpKCBlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqbmFtZSApOwotc3RhdGljIHN0cnVjdCB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl2b2lkICoqZnVuYzsKLX0gZXNkX2Z1bmN0aW9uc1tdID0gewotCXsgImVzZF9vcGVuX3NvdW5kIiwJKHZvaWQgKiopJlNETF9OQU1FKGVzZF9vcGVuX3NvdW5kKQl9LAotCXsgImVzZF9jbG9zZSIsCQkodm9pZCAqKikmU0RMX05BTUUoZXNkX2Nsb3NlKQkJfSwKLQl7ICJlc2RfcGxheV9zdHJlYW0iLAkodm9pZCAqKikmU0RMX05BTUUoZXNkX3BsYXlfc3RyZWFtKQl9LAotfTsKLQotc3RhdGljIHZvaWQgVW5sb2FkRVNETGlicmFyeSgpCi17Ci0JaWYgKCBlc2RfbG9hZGVkICkgewotCQlTRExfVW5sb2FkT2JqZWN0KGVzZF9oYW5kbGUpOwotCQllc2RfaGFuZGxlID0gTlVMTDsKLQkJZXNkX2xvYWRlZCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IExvYWRFU0RMaWJyYXJ5KHZvaWQpCi17Ci0JaW50IGksIHJldHZhbCA9IC0xOwotCi0JZXNkX2hhbmRsZSA9IFNETF9Mb2FkT2JqZWN0KGVzZF9saWJyYXJ5KTsKLQlpZiAoIGVzZF9oYW5kbGUgKSB7Ci0JCWVzZF9sb2FkZWQgPSAxOwotCQlyZXR2YWwgPSAwOwotCQlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShlc2RfZnVuY3Rpb25zKTsgKytpICkgewotCQkJKmVzZF9mdW5jdGlvbnNbaV0uZnVuYyA9IFNETF9Mb2FkRnVuY3Rpb24oZXNkX2hhbmRsZSwgZXNkX2Z1bmN0aW9uc1tpXS5uYW1lKTsKLQkJCWlmICggISplc2RfZnVuY3Rpb25zW2ldLmZ1bmMgKSB7Ci0JCQkJcmV0dmFsID0gLTE7Ci0JCQkJVW5sb2FkRVNETGlicmFyeSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLSNlbHNlCi0KLXN0YXRpYyB2b2lkIFVubG9hZEVTRExpYnJhcnkoKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBMb2FkRVNETGlicmFyeSh2b2lkKQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogU0RMX0FVRElPX0RSSVZFUl9FU0RfRFlOQU1JQyAqLwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotCWludCBjb25uZWN0aW9uOwotCWludCBhdmFpbGFibGU7Ci0KLQlhdmFpbGFibGUgPSAwOwotCWlmICggTG9hZEVTRExpYnJhcnkoKSA8IDAgKSB7Ci0JCXJldHVybiBhdmFpbGFibGU7Ci0JfQotCWNvbm5lY3Rpb24gPSBTRExfTkFNRShlc2Rfb3Blbl9zb3VuZCkoTlVMTCk7Ci0JaWYgKCBjb25uZWN0aW9uID49IDAgKSB7Ci0JCWF2YWlsYWJsZSA9IDE7Ci0JCVNETF9OQU1FKGVzZF9jbG9zZSkoY29ubmVjdGlvbik7Ci0JfQotCVVubG9hZEVTRExpYnJhcnkoKTsKLQlyZXR1cm4oYXZhaWxhYmxlKTsKLX0KLQotc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotCVVubG9hZEVTRExpYnJhcnkoKTsKLX0KLQotc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfQXVkaW9EZXZpY2UgKnRoaXM7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCUxvYWRFU0RMaWJyYXJ5KCk7Ci0JdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLQlpZiAoIHRoaXMgKSB7Ci0JCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOwotCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQl9Ci0JaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCB0aGlzICkgewotCQkJU0RMX2ZyZWUodGhpcyk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0JYXVkaW9fZmQgPSAtMTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQl0aGlzLT5PcGVuQXVkaW8gPSBFU0RfT3BlbkF1ZGlvOwotCXRoaXMtPldhaXRBdWRpbyA9IEVTRF9XYWl0QXVkaW87Ci0JdGhpcy0+UGxheUF1ZGlvID0gRVNEX1BsYXlBdWRpbzsKLQl0aGlzLT5HZXRBdWRpb0J1ZiA9IEVTRF9HZXRBdWRpb0J1ZjsKLQl0aGlzLT5DbG9zZUF1ZGlvID0gRVNEX0Nsb3NlQXVkaW87Ci0KLQl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIEVTRF9ib290c3RyYXAgPSB7Ci0JRVNEX0RSSVZFUl9OQU1FLCAiRW5saWdodGVuZWQgU291bmQgRGFlbW9uIiwKLQlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQotfTsKLQotLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCi1zdGF0aWMgdm9pZCBFU0RfV2FpdEF1ZGlvKF9USElTKQotewotCVNpbnQzMiB0aWNrczsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdGhyZWFkLXBhcmVudCBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlICovCi0JeyBzdGF0aWMgaW50IGNudCA9IDA7Ci0JCS8qIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2l0aCB0aHJlYWQgaW1wbGVtZW50YXRpb25zIAotCQkgICB0aGF0IHVzZSBhIGRpZmZlcmVudCBwcm9jZXNzIGlkIGZvciBlYWNoIHRocmVhZC4KLQkJKi8KLQkJaWYgKHBhcmVudCAmJiAoKCgrK2NudCklMTApID09IDApKSB7IC8qIENoZWNrIGV2ZXJ5IDEwIGxvb3BzICovCi0JCQlpZiAoIGtpbGwocGFyZW50LCAwKSA8IDAgKSB7Ci0JCQkJdGhpcy0+ZW5hYmxlZCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBVc2UgdGltZXIgZm9yIGdlbmVyYWwgYXVkaW8gc3luY2hyb25pemF0aW9uICovCi0JdGlja3MgPSAoKFNpbnQzMikobmV4dF9mcmFtZSAtIFNETF9HZXRUaWNrcygpKSktRlVER0VfVElDS1M7Ci0JaWYgKCB0aWNrcyA+IDAgKSB7Ci0JCVNETF9EZWxheSh0aWNrcyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBFU0RfUGxheUF1ZGlvKF9USElTKQotewotCWludCB3cml0dGVuOwotCi0JLyogV3JpdGUgdGhlIGF1ZGlvIGRhdGEsIGNoZWNraW5nIGZvciBFQUdBSU4gb24gYnJva2VuIGF1ZGlvIGRyaXZlcnMgKi8KLQlkbyB7Ci0JCXdyaXR0ZW4gPSB3cml0ZShhdWRpb19mZCwgbWl4YnVmLCBtaXhsZW4pOwotCQlpZiAoICh3cml0dGVuIDwgMCkgJiYgKChlcnJubyA9PSAwKSB8fCAoZXJybm8gPT0gRUFHQUlOKSkgKSB7Ci0JCQlTRExfRGVsYXkoMSk7CS8qIExldCBhIGxpdHRsZSBDUFUgdGltZSBnbyBieSAqLwotCQl9Ci0JfSB3aGlsZSAoICh3cml0dGVuIDwgMCkgJiYgCi0JICAgICAgICAgICgoZXJybm8gPT0gMCkgfHwgKGVycm5vID09IEVBR0FJTikgfHwgKGVycm5vID09IEVJTlRSKSkgKTsKLQotCS8qIFNldCB0aGUgbmV4dCB3cml0ZSBmcmFtZSAqLwotCW5leHRfZnJhbWUgKz0gZnJhbWVfdGlja3M7Ci0KLQkvKiBJZiB3ZSBjb3VsZG4ndCB3cml0ZSwgYXNzdW1lIGZhdGFsIGVycm9yIGZvciBub3cgKi8KLQlpZiAoIHdyaXR0ZW4gPCAwICkgewotCQl0aGlzLT5lbmFibGVkID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyBVaW50OCAqRVNEX0dldEF1ZGlvQnVmKF9USElTKQotewotCXJldHVybihtaXhidWYpOwotfQotCi1zdGF0aWMgdm9pZCBFU0RfQ2xvc2VBdWRpbyhfVEhJUykKLXsKLQlpZiAoIG1peGJ1ZiAhPSBOVUxMICkgewotCQlTRExfRnJlZUF1ZGlvTWVtKG1peGJ1Zik7Ci0JCW1peGJ1ZiA9IE5VTEw7Ci0JfQotCWlmICggYXVkaW9fZmQgPj0gMCApIHsKLQkJU0RMX05BTUUoZXNkX2Nsb3NlKShhdWRpb19mZCk7Ci0JCWF1ZGlvX2ZkID0gLTE7Ci0JfQotfQotCi0vKiBUcnkgdG8gZ2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtICovCi1zdGF0aWMgY2hhciAqZ2V0X3Byb2duYW1lKHZvaWQpCi17Ci0JY2hhciAqcHJvZ25hbWUgPSBOVUxMOwotI2lmZGVmIF9fTElOVVhfXwotCUZJTEUgKmZwOwotCXN0YXRpYyBjaGFyIHRlbXBbQlVGU0laXTsKLQotCVNETF9zbnByaW50Zih0ZW1wLCBTRExfYXJyYXlzaXplKHRlbXApLCAiL3Byb2MvJWQvY21kbGluZSIsIGdldHBpZCgpKTsKLQlmcCA9IGZvcGVuKHRlbXAsICJyIik7Ci0JaWYgKCBmcCAhPSBOVUxMICkgewotCQlpZiAoIGZnZXRzKHRlbXAsIHNpemVvZih0ZW1wKS0xLCBmcCkgKSB7Ci0JCQlwcm9nbmFtZSA9IFNETF9zdHJyY2hyKHRlbXAsICcvJyk7Ci0JCQlpZiAoIHByb2duYW1lID09IE5VTEwgKSB7Ci0JCQkJcHJvZ25hbWUgPSB0ZW1wOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9nbmFtZSA9IHByb2duYW1lKzE7Ci0JCQl9Ci0JCX0KLQkJZmNsb3NlKGZwKTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4ocHJvZ25hbWUpOwotfQotCi1zdGF0aWMgaW50IEVTRF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JZXNkX2Zvcm1hdF90IGZvcm1hdDsKLQotCS8qIENvbnZlcnQgYXVkaW8gc3BlYyB0byB0aGUgRVNEIGF1ZGlvIGZvcm1hdCAqLwotCWZvcm1hdCA9IChFU0RfU1RSRUFNIHwgRVNEX1BMQVkpOwotCXN3aXRjaCAoIHNwZWMtPmZvcm1hdCAmIDB4RkYgKSB7Ci0JCWNhc2UgODoKLQkJCWZvcm1hdCB8PSBFU0RfQklUUzg7Ci0JCQlicmVhazsKLQkJY2FzZSAxNjoKLQkJCWZvcm1hdCB8PSBFU0RfQklUUzE2OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIEVTRCBhdWRpbyBmb3JtYXQiKTsKLQkJCXJldHVybigtMSk7Ci0JfQotCWlmICggc3BlYy0+Y2hhbm5lbHMgPT0gMSApIHsKLQkJZm9ybWF0IHw9IEVTRF9NT05POwotCX0gZWxzZSB7Ci0JCWZvcm1hdCB8PSBFU0RfU1RFUkVPOwotCX0KLSNpZiAwCi0Jc3BlYy0+c2FtcGxlcyA9IEVTRF9CVUZfU0laRTsJLyogRGFybiwgbm8gd2F5IHRvIGNoYW5nZSB0aGlzIHlldCAqLwotI2VuZGlmCi0KLQkvKiBPcGVuIGEgY29ubmVjdGlvbiB0byB0aGUgRVNEIGF1ZGlvIHNlcnZlciAqLwotCWF1ZGlvX2ZkID0gU0RMX05BTUUoZXNkX3BsYXlfc3RyZWFtKShmb3JtYXQsIHNwZWMtPmZyZXEsIE5VTEwsIGdldF9wcm9nbmFtZSgpKTsKLQlpZiAoIGF1ZGlvX2ZkIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuIEVTRCBjb25uZWN0aW9uIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGF1ZGlvIHNwZWNpZmljYXRpb24gKi8KLQlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCWZyYW1lX3RpY2tzID0gKGZsb2F0KShzcGVjLT5zYW1wbGVzKjEwMDApL3NwZWMtPmZyZXE7Ci0JbmV4dF9mcmFtZSA9IFNETF9HZXRUaWNrcygpK2ZyYW1lX3RpY2tzOwotCi0JLyogQWxsb2NhdGUgbWl4aW5nIGJ1ZmZlciAqLwotCW1peGxlbiA9IHNwZWMtPnNpemU7Ci0JbWl4YnVmID0gKFVpbnQ4ICopU0RMX0FsbG9jQXVkaW9NZW0obWl4bGVuKTsKLQlpZiAoIG1peGJ1ZiA9PSBOVUxMICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbWVtc2V0KG1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7Ci0KLQkvKiBHZXQgdGhlIHBhcmVudCBwcm9jZXNzIGlkICh3ZSdyZSB0aGUgcGFyZW50IG9mIHRoZSBhdWRpbyB0aHJlYWQpICovCi0JcGFyZW50ID0gZ2V0cGlkKCk7Ci0KLQkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KLQlyZXR1cm4oMCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL2VzZC9TRExfZXNkYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZXNkL1NETF9lc2RhdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmZiMjc2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZXNkL1NETF9lc2RhdWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9lc2RhdWRpb19oCi0jZGVmaW5lIF9TRExfZXNkYXVkaW9faAotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKLQotc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKLQkvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCi0JaW50IGF1ZGlvX2ZkOwotCi0JLyogVGhlIHBhcmVudCBwcm9jZXNzIGlkLCB0byBkZXRlY3Qgd2hlbiBhcHBsaWNhdGlvbiBxdWl0cyAqLwotCXBpZF90IHBhcmVudDsKLQotCS8qIFJhdyBtaXhpbmcgYnVmZmVyICovCi0JVWludDggKm1peGJ1ZjsKLQlpbnQgICAgbWl4bGVuOwotCi0JLyogU3VwcG9ydCBmb3IgYXVkaW8gdGltaW5nIHVzaW5nIGEgdGltZXIgKi8KLQlmbG9hdCBmcmFtZV90aWNrczsKLQlmbG9hdCBuZXh0X2ZyYW1lOwotfTsKLSNkZWZpbmUgRlVER0VfVElDS1MJMTAJLyogVGhlIHNjaGVkdWxlciBvdmVyaGVhZCB0aWNrcyBwZXIgZnJhbWUgKi8KLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIGF1ZGlvX2ZkCQkodGhpcy0+aGlkZGVuLT5hdWRpb19mZCkKLSNkZWZpbmUgcGFyZW50CQkJKHRoaXMtPmhpZGRlbi0+cGFyZW50KQotI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCi0jZGVmaW5lIG1peGxlbgkJCSh0aGlzLT5oaWRkZW4tPm1peGxlbikKLSNkZWZpbmUgZnJhbWVfdGlja3MJCSh0aGlzLT5oaWRkZW4tPmZyYW1lX3RpY2tzKQotI2RlZmluZSBuZXh0X2ZyYW1lCQkodGhpcy0+aGlkZGVuLT5uZXh0X2ZyYW1lKQotCi0jZW5kaWYgLyogX1NETF9lc2RhdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21hY29zeC9TRExfY29yZWF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21hY29zeC9TRExfY29yZWF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYWU5NTguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9tYWNvc3gvU0RMX2NvcmVhdWRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8QXVkaW9Vbml0L0F1ZGlvVW5pdC5oPgotCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKLSNpbmNsdWRlICJTRExfY29yZWF1ZGlvLmgiCi0KLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IENvcmVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIENvcmVfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIENvcmVfUGxheUF1ZGlvKF9USElTKTsKLXN0YXRpYyBVaW50OCAqQ29yZV9HZXRBdWRpb0J1ZihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBDb3JlX0Nsb3NlQXVkaW8oX1RISVMpOwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybigxKTsKLX0KLQotc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotICAgIFNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLSAgICBTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotICAgIFNETF9BdWRpb0RldmljZSAqdGhpczsKLQotICAgIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0gICAgdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLSAgICBpZiAoIHRoaXMgKSB7Ci0gICAgICAgIFNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOwotICAgICAgICB0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0gICAgICAgICAgICAgICAgU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLSAgICB9Ci0gICAgaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgaWYgKCB0aGlzICkgewotICAgICAgICAgICAgU0RMX2ZyZWUodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLSAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0KLSAgICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0gICAgdGhpcy0+T3BlbkF1ZGlvID0gQ29yZV9PcGVuQXVkaW87Ci0gICAgdGhpcy0+V2FpdEF1ZGlvID0gQ29yZV9XYWl0QXVkaW87Ci0gICAgdGhpcy0+UGxheUF1ZGlvID0gQ29yZV9QbGF5QXVkaW87Ci0gICAgdGhpcy0+R2V0QXVkaW9CdWYgPSBDb3JlX0dldEF1ZGlvQnVmOwotICAgIHRoaXMtPkNsb3NlQXVkaW8gPSBDb3JlX0Nsb3NlQXVkaW87Ci0KLSAgICB0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0gICAgcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIENPUkVBVURJT19ib290c3RyYXAgPSB7Ci0gICAgImNvcmVhdWRpbyIsICJNYWMgT1MgWCBDb3JlQXVkaW8iLAotICAgIEF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCi19OwotCi0vKiBUaGUgQ29yZUF1ZGlvIGNhbGxiYWNrICovCi1zdGF0aWMgT1NTdGF0dXMgICAgIGF1ZGlvQ2FsbGJhY2sgKHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppblJlZkNvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyAgICAgIGluQWN0aW9uRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAgICAgICAgICAgICppblRpbWVTdGFtcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVzTnVtYmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyICAgICAgICAgICAgICAgICAgICAgKmlvRGF0YSkKLXsKLSAgICBTRExfQXVkaW9EZXZpY2UgKnRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopaW5SZWZDb247Ci0gICAgVUludDMyIHJlbWFpbmluZywgbGVuOwotICAgIHZvaWQgKnB0cjsKLQotICAgIC8qIE9ubHkgZG8gYW55dGhpbmcgaWYgYXVkaW8gaXMgZW5hYmxlZCBhbmQgbm90IHBhdXNlZCAqLwotICAgIGlmICggISB0aGlzLT5lbmFibGVkIHx8IHRoaXMtPnBhdXNlZCApIHsKLSAgICAgICAgU0RMX21lbXNldChpb0RhdGEtPm1EYXRhLCB0aGlzLT5zcGVjLnNpbGVuY2UsIGlvRGF0YS0+bURhdGFCeXRlU2l6ZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICAvKiBObyBTREwgY29udmVyc2lvbiBzaG91bGQgYmUgbmVlZGVkIGhlcmUsIGV2ZXIsIHNpbmNlIHdlIGFjY2VwdAotICAgICAgIGFueSBpbnB1dCBmb3JtYXQgaW4gT3BlbkF1ZGlvLCBhbmQgbGVhdmUgdGhlIGNvbnZlcnNpb24gdG8gQ29yZUF1ZGlvLgotICAgICAqLwotICAgIC8qCi0gICAgYXNzZXJ0KCF0aGlzLT5jb252ZXJ0Lm5lZWRlZCk7Ci0gICAgYXNzZXJ0KHRoaXMtPnNwZWMuY2hhbm5lbHMgPT0gaW9EYXRhLT5tTnVtYmVyQ2hhbm5lbHMpOwotICAgICAqLwotICAgIAotICAgIHJlbWFpbmluZyA9IGlvRGF0YS0+bURhdGFCeXRlU2l6ZTsKLSAgICBwdHIgPSBpb0RhdGEtPm1EYXRhOwotICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7Ci0gICAgICAgIGlmIChidWZmZXJPZmZzZXQgPj0gYnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgLyogR2VuZXJhdGUgdGhlIGRhdGEgKi8KLSAgICAgICAgICAgIFNETF9tZW1zZXQoYnVmZmVyLCB0aGlzLT5zcGVjLnNpbGVuY2UsIGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgU0RMX211dGV4UCh0aGlzLT5taXhlcl9sb2NrKTsKLSAgICAgICAgICAgICgqdGhpcy0+c3BlYy5jYWxsYmFjaykodGhpcy0+c3BlYy51c2VyZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICBTRExfbXV0ZXhWKHRoaXMtPm1peGVyX2xvY2spOwotICAgICAgICAgICAgYnVmZmVyT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbGVuID0gYnVmZmVyU2l6ZSAtIGJ1ZmZlck9mZnNldDsKLSAgICAgICAgaWYgKGxlbiA+IHJlbWFpbmluZykKLSAgICAgICAgICAgIGxlbiA9IHJlbWFpbmluZzsKLSAgICAgICAgU0RMX21lbWNweShwdHIsIChjaGFyICopYnVmZmVyICsgYnVmZmVyT2Zmc2V0LCBsZW4pOwotICAgICAgICBwdHIgPSAoY2hhciAqKXB0ciArIGxlbjsKLSAgICAgICAgcmVtYWluaW5nIC09IGxlbjsKLSAgICAgICAgYnVmZmVyT2Zmc2V0ICs9IGxlbjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIER1bW15IGZ1bmN0aW9ucyAtLSB3ZSBkb24ndCB1c2UgdGhyZWFkLWJhc2VkIGF1ZGlvICovCi12b2lkIENvcmVfV2FpdEF1ZGlvKF9USElTKQotewotICAgIHJldHVybjsKLX0KLQotdm9pZCBDb3JlX1BsYXlBdWRpbyhfVEhJUykKLXsKLSAgICByZXR1cm47Ci19Ci0KLVVpbnQ4ICpDb3JlX0dldEF1ZGlvQnVmKF9USElTKQotewotICAgIHJldHVybihOVUxMKTsKLX0KLQotdm9pZCBDb3JlX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0gICAgT1NTdGF0dXMgcmVzdWx0OwotICAgIHN0cnVjdCBBdWRpb1VuaXRJbnB1dENhbGxiYWNrIGNhbGxiYWNrOwotCi0gICAgLyogc3RvcCBwcm9jZXNzaW5nIHRoZSBhdWRpbyB1bml0ICovCi0gICAgcmVzdWx0ID0gQXVkaW9PdXRwdXRVbml0U3RvcCAob3V0cHV0QXVkaW9Vbml0KTsKLSAgICBpZiAocmVzdWx0ICE9IG5vRXJyKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiQ29yZV9DbG9zZUF1ZGlvOiBBdWRpb091dHB1dFVuaXRTdG9wIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBSZW1vdmUgdGhlIGlucHV0IGNhbGxiYWNrICovCi0gICAgY2FsbGJhY2suaW5wdXRQcm9jID0gMDsKLSAgICBjYWxsYmFjay5pbnB1dFByb2NSZWZDb24gPSAwOwotICAgIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5IChvdXRwdXRBdWRpb1VuaXQsIAotICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1NldElucHV0Q2FsbGJhY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFNjb3BlX0lucHV0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbGxiYWNrKSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBub0VycikgewotICAgICAgICBTRExfU2V0RXJyb3IoIkNvcmVfQ2xvc2VBdWRpbzogQXVkaW9Vbml0U2V0UHJvcGVydHkgKGtBdWRpb1VuaXRQcm9wZXJ0eV9TZXRJbnB1dENhbGxiYWNrKSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmVzdWx0ID0gQ2xvc2VDb21wb25lbnQob3V0cHV0QXVkaW9Vbml0KTsKLSAgICBpZiAocmVzdWx0ICE9IG5vRXJyKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiQ29yZV9DbG9zZUF1ZGlvOiBDbG9zZUNvbXBvbmVudCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIFNETF9mcmVlKGJ1ZmZlcik7Ci19Ci0KLSNkZWZpbmUgQ0hFQ0tfUkVTVUxUKG1zZykgXAotICAgIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsgXAotICAgICAgICBTRExfU2V0RXJyb3IoIkZhaWxlZCB0byBzdGFydCBDb3JlQXVkaW86ICIgbXNnKTsgXAotICAgICAgICByZXR1cm4gLTE7IFwKLSAgICB9Ci0KLQotaW50IENvcmVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQotewotICAgIE9TU3RhdHVzIHJlc3VsdCA9IG5vRXJyOwotICAgIENvbXBvbmVudCBjb21wOwotICAgIENvbXBvbmVudERlc2NyaXB0aW9uIGRlc2M7Ci0gICAgc3RydWN0IEF1ZGlvVW5pdElucHV0Q2FsbGJhY2sgY2FsbGJhY2s7Ci0gICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIHJlcXVlc3RlZERlc2M7Ci0KLSAgICAvKiBTZXR1cCBhIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiB3aXRoIHRoZSByZXF1ZXN0ZWQgZm9ybWF0ICovCi0gICAgcmVxdWVzdGVkRGVzYy5tRm9ybWF0SUQgPSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ007Ci0gICAgcmVxdWVzdGVkRGVzYy5tRm9ybWF0RmxhZ3MgPSBrTGluZWFyUENNRm9ybWF0RmxhZ0lzUGFja2VkOwotICAgIHJlcXVlc3RlZERlc2MubUNoYW5uZWxzUGVyRnJhbWUgPSBzcGVjLT5jaGFubmVsczsKLSAgICByZXF1ZXN0ZWREZXNjLm1TYW1wbGVSYXRlID0gc3BlYy0+ZnJlcTsKLSAgICAKLSAgICByZXF1ZXN0ZWREZXNjLm1CaXRzUGVyQ2hhbm5lbCA9IHNwZWMtPmZvcm1hdCAmIDB4RkY7Ci0gICAgaWYgKHNwZWMtPmZvcm1hdCAmIDB4ODAwMCkKLSAgICAgICAgcmVxdWVzdGVkRGVzYy5tRm9ybWF0RmxhZ3MgfD0ga0xpbmVhclBDTUZvcm1hdEZsYWdJc1NpZ25lZEludGVnZXI7Ci0gICAgaWYgKHNwZWMtPmZvcm1hdCAmIDB4MTAwMCkKLSAgICAgICAgcmVxdWVzdGVkRGVzYy5tRm9ybWF0RmxhZ3MgfD0ga0xpbmVhclBDTUZvcm1hdEZsYWdJc0JpZ0VuZGlhbjsKLQotICAgIHJlcXVlc3RlZERlc2MubUZyYW1lc1BlclBhY2tldCA9IDE7Ci0gICAgcmVxdWVzdGVkRGVzYy5tQnl0ZXNQZXJGcmFtZSA9IHJlcXVlc3RlZERlc2MubUJpdHNQZXJDaGFubmVsICogcmVxdWVzdGVkRGVzYy5tQ2hhbm5lbHNQZXJGcmFtZSAvIDg7Ci0gICAgcmVxdWVzdGVkRGVzYy5tQnl0ZXNQZXJQYWNrZXQgPSByZXF1ZXN0ZWREZXNjLm1CeXRlc1BlckZyYW1lICogcmVxdWVzdGVkRGVzYy5tRnJhbWVzUGVyUGFja2V0OwotCi0KLSAgICAvKiBMb2NhdGUgdGhlIGRlZmF1bHQgb3V0cHV0IGF1ZGlvIHVuaXQgKi8KLSAgICBkZXNjLmNvbXBvbmVudFR5cGUgPSBrQXVkaW9Vbml0Q29tcG9uZW50VHlwZTsKLSAgICBkZXNjLmNvbXBvbmVudFN1YlR5cGUgPSBrQXVkaW9Vbml0U3ViVHlwZV9PdXRwdXQ7Ci0gICAgZGVzYy5jb21wb25lbnRNYW51ZmFjdHVyZXIgPSBrQXVkaW9Vbml0SURfRGVmYXVsdE91dHB1dDsKLSAgICBkZXNjLmNvbXBvbmVudEZsYWdzID0gMDsKLSAgICBkZXNjLmNvbXBvbmVudEZsYWdzTWFzayA9IDA7Ci0gICAgCi0gICAgY29tcCA9IEZpbmROZXh0Q29tcG9uZW50IChOVUxMLCAmZGVzYyk7Ci0gICAgaWYgKGNvbXAgPT0gTlVMTCkgewotICAgICAgICBTRExfU2V0RXJyb3IgKCJGYWlsZWQgdG8gc3RhcnQgQ29yZUF1ZGlvOiBGaW5kTmV4dENvbXBvbmVudCByZXR1cm5lZCBOVUxMIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgLyogT3BlbiAmIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgb3V0cHV0IGF1ZGlvIHVuaXQgKi8KLSAgICByZXN1bHQgPSBPcGVuQUNvbXBvbmVudCAoY29tcCwgJm91dHB1dEF1ZGlvVW5pdCk7Ci0gICAgQ0hFQ0tfUkVTVUxUKCJPcGVuQUNvbXBvbmVudCIpCi0KLSAgICByZXN1bHQgPSBBdWRpb1VuaXRJbml0aWFsaXplIChvdXRwdXRBdWRpb1VuaXQpOwotICAgIENIRUNLX1JFU1VMVCgiQXVkaW9Vbml0SW5pdGlhbGl6ZSIpCi0gICAgICAgICAgICAgICAgCi0gICAgLyogU2V0IHRoZSBpbnB1dCBmb3JtYXQgb2YgdGhlIGF1ZGlvIHVuaXQuICovCi0gICAgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkgKG91dHB1dEF1ZGlvVW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU3RyZWFtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRTY29wZV9JbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAocmVxdWVzdGVkRGVzYykpOwotICAgIENIRUNLX1JFU1VMVCgiQXVkaW9Vbml0U2V0UHJvcGVydHkgKGtBdWRpb1VuaXRQcm9wZXJ0eV9TdHJlYW1Gb3JtYXQpIikKLQotICAgIC8qIFNldCB0aGUgYXVkaW8gY2FsbGJhY2sgKi8KLSAgICBjYWxsYmFjay5pbnB1dFByb2MgPSBhdWRpb0NhbGxiYWNrOwotICAgIGNhbGxiYWNrLmlucHV0UHJvY1JlZkNvbiA9IHRoaXM7Ci0gICAgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkgKG91dHB1dEF1ZGlvVW5pdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU2V0SW5wdXRDYWxsYmFjaywgCi0gICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0U2NvcGVfSW5wdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFjaywgCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FsbGJhY2spKTsKLSAgICBDSEVDS19SRVNVTFQoIkF1ZGlvVW5pdFNldFByb3BlcnR5IChrQXVkaW9Vbml0UHJvcGVydHlfU2V0SW5wdXRDYWxsYmFjaykiKQotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGF1ZGlvIHNwZWNpZmljYXRpb24gKi8KLSAgICBTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotICAgIAotICAgIC8qIEFsbG9jYXRlIGEgc2FtcGxlIGJ1ZmZlciAqLwotICAgIGJ1ZmZlck9mZnNldCA9IGJ1ZmZlclNpemUgPSB0aGlzLT5zcGVjLnNpemU7Ci0gICAgYnVmZmVyID0gU0RMX21hbGxvYyhidWZmZXJTaXplKTsKLQotICAgIC8qIEZpbmFsbHksIHN0YXJ0IHByb2Nlc3Npbmcgb2YgdGhlIGF1ZGlvIHVuaXQgKi8KLSAgICByZXN1bHQgPSBBdWRpb091dHB1dFVuaXRTdGFydCAob3V0cHV0QXVkaW9Vbml0KTsKLSAgICBDSEVDS19SRVNVTFQoIkF1ZGlvT3V0cHV0VW5pdFN0YXJ0IikgICAgCi0gICAgCi0KLSAgICAvKiBXZSdyZSBydW5uaW5nISAqLwotICAgIHJldHVybigxKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWFjb3N4L1NETF9jb3JlYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWFjb3N4L1NETF9jb3JlYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyNDkwYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21hY29zeC9TRExfY29yZWF1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2NvcmVhdWRpb19oCi0jZGVmaW5lIF9TRExfY29yZWF1ZGlvX2gKLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotI2luY2x1ZGUgPEF1ZGlvVW5pdC9BVU5UQ29tcG9uZW50Lmg+Ci0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKLQotc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKLQlBdWRpb1VuaXQgb3V0cHV0QXVkaW9Vbml0OwotCXZvaWQgKmJ1ZmZlcjsKLQlVSW50MzIgYnVmZmVyT2Zmc2V0OwotCVVJbnQzMiBidWZmZXJTaXplOwotfTsKLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIG91dHB1dEF1ZGlvVW5pdAkJKHRoaXMtPmhpZGRlbi0+b3V0cHV0QXVkaW9Vbml0KQotI2RlZmluZSBidWZmZXIJCSh0aGlzLT5oaWRkZW4tPmJ1ZmZlcikKLSNkZWZpbmUgYnVmZmVyT2Zmc2V0CQkodGhpcy0+aGlkZGVuLT5idWZmZXJPZmZzZXQpCi0jZGVmaW5lIGJ1ZmZlclNpemUJCSh0aGlzLT5oaWRkZW4tPmJ1ZmZlclNpemUpCi0KLSNlbmRpZiAvKiBfU0RMX2NvcmVhdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21hY3JvbS9TRExfcm9tYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWFjcm9tL1NETF9yb21hdWRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDBjMDMzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWFjcm9tL1NETF9yb21hdWRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCi0jICBpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+Ci0jZWxpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgKFVOSVZFUlNBTF9JTlRFUkZBQ0VTX1ZFUlNJT04gPiAweDAzMzUpCi0jICBpbmNsdWRlIDxDYXJib24uaD4KLSNlbHNlCi0jICBpbmNsdWRlIDxTb3VuZC5oPiAvKiBTb3VuZE1hbmFnZXIgaW50ZXJmYWNlICovCi0jICBpbmNsdWRlIDxHZXN0YWx0Lmg+Ci0jICBpbmNsdWRlIDxEcml2ZXJTZXJ2aWNlcy5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChOZXdTbmRDYWxsQmFja1VQUCkgJiYgKFVOSVZFUlNBTF9JTlRFUkZBQ0VTX1ZFUlNJT04gPCAweDAzMzUpCi0jaWYgIWRlZmluZWQoTmV3U25kQ2FsbEJhY2tQcm9jKSAvKiBhdm9pZCBjaXJjdWxhciByZWRlZmluaXRpb24uLi4gKi8KLSNkZWZpbmUgTmV3U25kQ2FsbEJhY2tVUFAgTmV3U25kQ2FsbEJhY2tQcm9jCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChOZXdTbmRDYWxsQmFja1VQUCkKLSNkZWZpbmUgTmV3U25kQ2FsbEJhY2tVUFAgTmV3U25kQ2FsbEJhY2tQcm9jCi0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKLSNpbmNsdWRlICJTRExfcm9tYXVkaW8uaCIKLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZCBNYWNfQ2xvc2VBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgaW50IE1hY19PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgTWFjX0xvY2tBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgdm9pZCBNYWNfVW5sb2NrQXVkaW8oX1RISVMpOwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi0KLXN0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuKDEpOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0gICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotICAgIFNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0gICAgU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCi0gICAgLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLSAgICB0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotICAgIGlmICggdGhpcyApIHsKLSAgICAgICAgU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0gICAgICAgIHRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKLSAgICAgICAgICAgICAgICBTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotICAgIH0KLSAgICBpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICBpZiAoIHRoaXMgKSB7Ci0gICAgICAgICAgICBTRExfZnJlZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQotICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgICB0aGlzLT5PcGVuQXVkaW8gICA9IE1hY19PcGVuQXVkaW87Ci0gICAgdGhpcy0+Q2xvc2VBdWRpbyAgPSBNYWNfQ2xvc2VBdWRpbzsKLSAgICB0aGlzLT5Mb2NrQXVkaW8gICA9IE1hY19Mb2NrQXVkaW87Ci0gICAgdGhpcy0+VW5sb2NrQXVkaW8gPSBNYWNfVW5sb2NrQXVkaW87Ci0gICAgdGhpcy0+ZnJlZSAgICAgICAgPSBBdWRpb19EZWxldGVEZXZpY2U7Ci0KLSNpZmRlZiBfX01BQ09TWF9fCS8qIE1hYyBPUyBYIHVzZXMgdGhyZWFkZWQgYXVkaW8sIHNvIG5vcm1hbCB0aHJlYWQgY29kZSBpcyBva2F5ICovCi0gICAgdGhpcy0+TG9ja0F1ZGlvICAgPSBOVUxMOwotICAgIHRoaXMtPlVubG9ja0F1ZGlvID0gTlVMTDsKLSNlbmRpZgotICAgIHJldHVybiB0aGlzOwotfQotCi1BdWRpb0Jvb3RTdHJhcCBTTkRNR1JfYm9vdHN0cmFwID0gewotCSJzbmRtZ3IiLCAiTWFjT1MgU291bmRNYW5hZ2VyIDMuMCIsCi0JQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KLSNpZiBkZWZpbmVkKFRBUkdFVF9BUElfTUFDX0NBUkJPTikgfHwgZGVmaW5lZChVU0VfUllBTlNfU09VTkRDT0RFKQotLyogVGhpcyB3b3JrcyBjb3JyZWN0bHkgb24gTWFjIE9TIFggKi8KLQotI3ByYWdtYSBvcHRpb25zIGFsaWduPXBvd2VyCi0KLXN0YXRpYyB2b2xhdGlsZSBTSW50MzIgYXVkaW9faXNfbG9ja2VkID0gMDsKLXN0YXRpYyB2b2xhdGlsZSBTSW50MzIgbmVlZF90b19taXggPSAwOwotCi1zdGF0aWMgVUludDggICpidWZmZXJbMl07Ci1zdGF0aWMgdm9sYXRpbGUgVUludDMyIHJ1bm5pbmcgPSAwOwotc3RhdGljIENtcFNvdW5kSGVhZGVyIGhlYWRlcjsKLXN0YXRpYyB2b2xhdGlsZSBVaW50MzIgZmlsbF9tZSA9IDA7Ci0KLXN0YXRpYyB2b2lkIG1peF9idWZmZXIoU0RMX0F1ZGlvRGV2aWNlICphdWRpbywgVUludDggKmJ1ZmZlcikKLXsKLSAgIGlmICggISBhdWRpby0+cGF1c2VkICkgewotI2lmZGVmIF9fTUFDT1NYX18KLSAgICAgICAgU0RMX211dGV4UChhdWRpby0+bWl4ZXJfbG9jayk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCBhdWRpby0+Y29udmVydC5uZWVkZWQgKSB7Ci0gICAgICAgICAgICBhdWRpby0+c3BlYy5jYWxsYmFjayhhdWRpby0+c3BlYy51c2VyZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKFVpbnQ4ICopYXVkaW8tPmNvbnZlcnQuYnVmLGF1ZGlvLT5jb252ZXJ0Lmxlbik7Ci0gICAgICAgICAgICBTRExfQ29udmVydEF1ZGlvKCZhdWRpby0+Y29udmVydCk7Ci0gICAgICAgICAgICBpZiAoIGF1ZGlvLT5jb252ZXJ0Lmxlbl9jdnQgIT0gYXVkaW8tPnNwZWMuc2l6ZSApIHsKLSAgICAgICAgICAgICAgICAvKiBVaCBvaC4uLiBwcm9iYWJseSBjcmFzaGVzIGhlcmUgKi87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTRExfbWVtY3B5KGJ1ZmZlciwgYXVkaW8tPmNvbnZlcnQuYnVmLCBhdWRpby0+Y29udmVydC5sZW5fY3Z0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF1ZGlvLT5zcGVjLmNhbGxiYWNrKGF1ZGlvLT5zcGVjLnVzZXJkYXRhLCBidWZmZXIsIGF1ZGlvLT5zcGVjLnNpemUpOwotICAgICAgICB9Ci0jaWZkZWYgX19NQUNPU1hfXwotICAgICAgICBTRExfbXV0ZXhWKGF1ZGlvLT5taXhlcl9sb2NrKTsKLSNlbmRpZgotICAgIH0KLQotICAgIERlY3JlbWVudEF0b21pYygoU0ludDMyICopICZuZWVkX3RvX21peCk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1hY19Mb2NrQXVkaW8oX1RISVMpCi17Ci0gICAgSW5jcmVtZW50QXRvbWljKChTSW50MzIgKikgJmF1ZGlvX2lzX2xvY2tlZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1hY19VbmxvY2tBdWRpbyhfVEhJUykKLXsKLSAgICBTSW50MzIgb2xkdmFsOwotICAgICAgICAgCi0gICAgb2xkdmFsID0gRGVjcmVtZW50QXRvbWljKChTSW50MzIgKikgJmF1ZGlvX2lzX2xvY2tlZCk7Ci0gICAgaWYgKCBvbGR2YWwgIT0gMSApICAvKiAhPSAxIG1lYW5zIGF1ZGlvIGlzIHN0aWxsIGxvY2tlZC4gKi8KLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogRGlkIHdlIG1pc3MgdGhlIGNoYW5jZSB0byBtaXggaW4gYW4gaW50ZXJydXB0PyBEbyBpdCBub3cuICovCi0gICAgaWYgKCBCaXRBbmRBdG9taWMgKDB4RkZGRkZGRkYsIChVSW50MzIgKikgJm5lZWRfdG9fbWl4KSApIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgY291bGQgYmUgYSBwcm9ibGVtIGlmIHlvdSBtaXNzZWQgYW4gaW50ZXJydXB0Ci0gICAgICAgICAqICB3aGlsZSB0aGUgYXVkaW8gd2FzIGxvY2tlZCwgYW5kIGdldCBwcmVlbXB0ZWQgYnkgYSBzZWNvbmQKLSAgICAgICAgICogIGludGVycnVwdCBoZXJlLCBidXQgdGhhdCBtZWFucyB5b3UgbG9ja2VkIGZvciB3YXkgdG9vIGxvbmcgYW55aG93LgotICAgICAgICAgKi8KLSAgICAgICAgbWl4X2J1ZmZlciAodGhpcywgYnVmZmVyW2ZpbGxfbWVdKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNhbGxCYWNrUHJvYyAoU25kQ2hhbm5lbCAqY2hhbiwgU25kQ29tbWFuZCAqY21kX3Bhc3NlZCApIHsKLSAgIFVJbnQzMiBwbGF5X21lOwotICAgU25kQ29tbWFuZCBjbWQ7IAotICAgU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IChTRExfQXVkaW9EZXZpY2UgKiljaGFuLT51c2VySW5mbzsKLQotICAgSW5jcmVtZW50QXRvbWljKChTSW50MzIgKikgJm5lZWRfdG9fbWl4KTsKLQotICAgZmlsbF9tZSA9IGNtZF9wYXNzZWQtPnBhcmFtMjsgIC8qIGJ1ZmZlciB0aGF0IGhhcyBqdXN0IGZpbmlzaGVkIHBsYXlpbmcsIHNvIGZpbGwgaXQgKi8gICAgICAKLSAgIHBsYXlfbWUgPSAhIGZpbGxfbWU7ICAgICAgICAgICAvKiBmaWxsZWQgYnVmZmVyIHRvIHBsYXkgX25vd18gKi8KLQotICAgaWYgKCAhIGF1ZGlvLT5lbmFibGVkICkgewotICAgICAgcmV0dXJuOwotICAgfQotICAgCi0gICAvKiBxdWV1ZSBwcmV2aW91c2x5IG1peGVkIGJ1ZmZlciBmb3IgcGxheWJhY2suICovCi0gICBoZWFkZXIuc2FtcGxlUHRyID0gKFB0cilidWZmZXJbcGxheV9tZV07Ci0gICBjbWQuY21kID0gYnVmZmVyQ21kOwotICAgY21kLnBhcmFtMSA9IDA7IAotICAgY21kLnBhcmFtMiA9IChsb25nKSZoZWFkZXI7Ci0gICBTbmREb0NvbW1hbmQgKGNoYW4sICZjbWQsIDApOwotCi0gICBtZW1zZXQgKGJ1ZmZlcltmaWxsX21lXSwgMCwgYXVkaW8tPnNwZWMuc2l6ZSk7Ci0KLSAgIC8qCi0gICAgKiBpZiBhdWRpbyBkZXZpY2UgaXNuJ3QgbG9ja2VkLCBtaXggdGhlIG5leHQgYnVmZmVyIHRvIGJlIHF1ZXVlZCBpbgotICAgICogIHRoZSBtZW1vcnkgYmxvY2sgdGhhdCBqdXN0IGZpbmlzaGVkIHBsYXlpbmcuCi0gICAgKi8KLSAgIGlmICggISBCaXRBbmRBdG9taWMoMHhGRkZGRkZGRiwgKFVJbnQzMiAqKSAmYXVkaW9faXNfbG9ja2VkKSApIHsKLSAgICAgIG1peF9idWZmZXIgKGF1ZGlvLCBidWZmZXJbZmlsbF9tZV0pOwotICAgfSAKLQotICAgLyogc2V0IHRoaXMgY2FsbGJhY2sgdG8gcnVuIGFnYWluIHdoZW4gY3VycmVudCBidWZmZXIgZHJhaW5zLiAqLwotICAgaWYgKCBydW5uaW5nICkgewotICAgICAgY21kLmNtZCA9IGNhbGxCYWNrQ21kOwotICAgICAgY21kLnBhcmFtMSA9IDA7Ci0gICAgICBjbWQucGFyYW0yID0gcGxheV9tZTsKLSAgIAotICAgICAgU25kRG9Db21tYW5kIChjaGFuLCAmY21kLCAwKTsKLSAgIH0KLX0KLQotc3RhdGljIGludCBNYWNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKSB7Ci0KLSAgIFNuZENhbGxCYWNrVVBQIGNhbGxiYWNrOwotICAgaW50IHNhbXBsZV9iaXRzOwotICAgaW50IGk7Ci0gICBsb25nIGluaXRPcHRpb25zOwotICAgICAgCi0gICAvKiBWZXJ5IGZldyBjb252ZXJzaW9ucyBhcmUgcmVxdWlyZWQsIGJ1dC4uLiAqLwotICAgIHN3aXRjaCAoc3BlYy0+Zm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQVVESU9fUzg6Ci0gICAgICAgIHNwZWMtPmZvcm1hdCA9IEFVRElPX1U4OwotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19VMTZMU0I6Ci0gICAgICAgIHNwZWMtPmZvcm1hdCA9IEFVRElPX1MxNkxTQjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fVTE2TVNCOgotICAgICAgICBzcGVjLT5mb3JtYXQgPSBBVURJT19TMTZNU0I7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotICAgIAotICAgIC8qIGluaXRpYWxpemUgYnVmZmVyQ21kIGhlYWRlciAqLwotICAgIG1lbXNldCAoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOwotICAgIGNhbGxiYWNrID0gKFNuZENhbGxCYWNrVVBQKSBOZXdTbmRDYWxsQmFja1VQUCAoY2FsbEJhY2tQcm9jKTsKLSAgICBzYW1wbGVfYml0cyA9IHNwZWMtPnNpemUgLyBzcGVjLT5zYW1wbGVzIC8gc3BlYy0+Y2hhbm5lbHMgKiA4OwotCi0jaWZkZWYgREVCVUdfQVVESU8KLSAgICBmcHJpbnRmKHN0ZGVyciwKLQkiQXVkaW8gZm9ybWF0IDB4JXgsIGNoYW5uZWxzID0gJWQsIHNhbXBsZV9iaXRzID0gJWQsIGZyZXF1ZW5jeSA9ICVkXG4iLAotCXNwZWMtPmZvcm1hdCwgc3BlYy0+Y2hhbm5lbHMsIHNhbXBsZV9iaXRzLCBzcGVjLT5mcmVxKTsKLSNlbmRpZiAvKiBERUJVR19BVURJTyAqLwotICAgIAotICAgIGhlYWRlci5udW1DaGFubmVscyA9IHNwZWMtPmNoYW5uZWxzOwotICAgIGhlYWRlci5zYW1wbGVTaXplICA9IHNhbXBsZV9iaXRzOwotICAgIGhlYWRlci5zYW1wbGVSYXRlICA9IHNwZWMtPmZyZXEgPDwgMTY7Ci0gICAgaGVhZGVyLm51bUZyYW1lcyAgID0gc3BlYy0+c2FtcGxlczsKLSAgICBoZWFkZXIuZW5jb2RlICAgICAgPSBjbXBTSDsKLSAgICAKLSAgICAvKiBOb3RlIHRoYXQgd2UgaW5zdGFsbCB0aGUgMTZiaXRMaXR0bGVFbmRpYW4gQ29udmVydGVyIGlmIG5lZWRlZC4gKi8KLSAgICBpZiAoIHNwZWMtPmZvcm1hdCA9PSAweDgwMTAgKSB7Ci0gICAgICAgIGhlYWRlci5jb21wcmVzc2lvbklEID0gZml4ZWRDb21wcmVzc2lvbjsKLSAgICAgICAgaGVhZGVyLmZvcm1hdCA9IGsxNkJpdExpdHRsZUVuZGlhbkZvcm1hdDsKLSAgICB9Ci0gICAgCi0gICAgLyogYWxsb2NhdGUgMiBidWZmZXJzICovCi0gICAgZm9yIChpPTA7IGk8MjsgaSsrKSB7Ci0gICAgICAgYnVmZmVyW2ldID0gKFVJbnQ4KiltYWxsb2MgKHNpemVvZihVSW50OCkgKiBzcGVjLT5zaXplKTsKLSAgICAgIGlmIChidWZmZXJbaV0gPT0gTlVMTCkgewotICAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgICByZXR1cm4gKC0xKTsKLSAgICAgIH0KLSAgICAgbWVtc2V0IChidWZmZXJbaV0sIDAsIHNwZWMtPnNpemUpOwotICAgfQotICAgCi0gICAvKiBDcmVhdGUgdGhlIHNvdW5kIG1hbmFnZXIgY2hhbm5lbCAqLwotICAgIGNoYW5uZWwgPSAoU25kQ2hhbm5lbFB0cilTRExfbWFsbG9jKHNpemVvZigqY2hhbm5lbCkpOwotICAgIGlmICggY2hhbm5lbCA9PSBOVUxMICkgewotICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgcmV0dXJuKC0xKTsKLSAgICB9Ci0gICAgaWYgKCBzcGVjLT5jaGFubmVscyA+PSAyICkgewotICAgICAgICBpbml0T3B0aW9ucyA9IGluaXRTdGVyZW87Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5pdE9wdGlvbnMgPSBpbml0TW9ubzsKLSAgICB9Ci0gICAgY2hhbm5lbC0+dXNlckluZm8gPSAobG9uZyl0aGlzOwotICAgIGNoYW5uZWwtPnFMZW5ndGggPSAxMjg7Ci0gICAgaWYgKCBTbmROZXdDaGFubmVsKCZjaGFubmVsLCBzYW1wbGVkU3ludGgsIGluaXRPcHRpb25zLCBjYWxsYmFjaykgIT0gbm9FcnIgKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyBjaGFubmVsIik7Ci0gICAgICAgIFNETF9mcmVlKGNoYW5uZWwpOwotICAgICAgICBjaGFubmVsID0gTlVMTDsKLSAgICAgICAgcmV0dXJuKC0xKTsKLSAgICB9Ci0gICAKLSAgIC8qIHN0YXJ0IHBsYXliYWNrICovCi0gICB7Ci0gICAgICBTbmRDb21tYW5kIGNtZDsKLSAgICAgIGNtZC5jbWQgPSBjYWxsQmFja0NtZDsKLSAgICAgIGNtZC5wYXJhbTIgPSAwOwotICAgICAgcnVubmluZyA9IDE7Ci0gICAgICBTbmREb0NvbW1hbmQgKGNoYW5uZWwsICZjbWQsIDApOwotICAgfQotICAgCi0gICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgTWFjX0Nsb3NlQXVkaW8oX1RISVMpIHsKLSAgIAotICAgaW50IGk7Ci0gICAKLSAgIHJ1bm5pbmcgPSAwOwotICAgCi0gICBpZiAoY2hhbm5lbCkgewotICAgICAgU25kRGlzcG9zZUNoYW5uZWwgKGNoYW5uZWwsIHRydWUpOwotICAgICAgY2hhbm5lbCA9IE5VTEw7Ci0gICB9Ci0gICAKLSAgICBmb3IgKCBpPTA7IGk8MjsgKytpICkgewotICAgICAgICBpZiAoIGJ1ZmZlcltpXSApIHsKLSAgICAgICAgICAgIFNETF9mcmVlKGJ1ZmZlcltpXSk7Ci0gICAgICAgICAgICBidWZmZXJbaV0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotfQotCi0jZWxzZSAvKiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICYmICFVU0VfUllBTlNfU09VTkRDT0RFICovCi0KLXN0YXRpYyB2b2lkIE1hY19Mb2NrQXVkaW8oX1RISVMpCi17Ci0gICAgLyogbm8tb3AuICovCi19Ci0KLXN0YXRpYyB2b2lkIE1hY19VbmxvY2tBdWRpbyhfVEhJUykKLXsKLSAgICAvKiBuby1vcC4gKi8KLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBTb3VuZCBNYW5hZ2VyIHdoZW4gaXQgaGFzIGV4aGF1c3RlZCBvbmUgb2YKLSAgIHRoZSBidWZmZXJzLCBzbyB3ZSdsbCB6ZXJvIGl0IHRvIHNpbGVuY2UgYW5kIGZpbGwgaXQgd2l0aCBhdWRpbyBpZgotICAgd2UncmUgbm90IHBhdXNlZC4KLSovCi1zdGF0aWMgcGFzY2FsCi12b2lkIHNuZERvdWJsZUJhY2tQcm9jIChTbmRDaGFubmVsUHRyIGNoYW4sIFNuZERvdWJsZUJ1ZmZlclB0ciBuZXdidWYpCi17Ci0gICAgU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IChTRExfQXVkaW9EZXZpY2UgKiluZXdidWYtPmRiVXNlckluZm9bMF07Ci0KLSAgICAvKiBJZiBhdWRpbyBpcyBxdWl0dGluZywgZG9uJ3QgZG8gYW55dGhpbmcgKi8KLSAgICBpZiAoICEgYXVkaW8tPmVuYWJsZWQgKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbWVtc2V0IChuZXdidWYtPmRiU291bmREYXRhLCAwLCBhdWRpby0+c3BlYy5zaXplKTsKLSAgICBuZXdidWYtPmRiTnVtRnJhbWVzID0gYXVkaW8tPnNwZWMuc2FtcGxlczsKLSAgICBpZiAoICEgYXVkaW8tPnBhdXNlZCApIHsKLSAgICAgICAgaWYgKCBhdWRpby0+Y29udmVydC5uZWVkZWQgKSB7Ci0gICAgICAgICAgICBhdWRpby0+c3BlYy5jYWxsYmFjayhhdWRpby0+c3BlYy51c2VyZGF0YSwKLSAgICAgICAgICAgICAgICAoVWludDggKilhdWRpby0+Y29udmVydC5idWYsYXVkaW8tPmNvbnZlcnQubGVuKTsKLSAgICAgICAgICAgIFNETF9Db252ZXJ0QXVkaW8oJmF1ZGlvLT5jb252ZXJ0KTsKLSNpZiAwCi0gICAgICAgICAgICBpZiAoIGF1ZGlvLT5jb252ZXJ0Lmxlbl9jdnQgIT0gYXVkaW8tPnNwZWMuc2l6ZSApIHsKLSAgICAgICAgICAgICAgICAvKiBVaCBvaC4uLiBwcm9iYWJseSBjcmFzaGVzIGhlcmUgKi87Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIFNETF9tZW1jcHkobmV3YnVmLT5kYlNvdW5kRGF0YSwgYXVkaW8tPmNvbnZlcnQuYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLT5jb252ZXJ0Lmxlbl9jdnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXVkaW8tPnNwZWMuY2FsbGJhY2soYXVkaW8tPnNwZWMudXNlcmRhdGEsCi0gICAgICAgICAgICAgICAgKFVpbnQ4ICopbmV3YnVmLT5kYlNvdW5kRGF0YSwgYXVkaW8tPnNwZWMuc2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbmV3YnVmLT5kYkZsYWdzICAgIHw9IGRiQnVmZmVyUmVhZHk7Ci19Ci0KLXN0YXRpYyBpbnQgRG91YmxlQnVmZmVyQXVkaW9fQXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgaW50IGF2YWlsYWJsZTsKLSAgICBOdW1WZXJzaW9uIHNuZHZlcnNpb247Ci0gICAgbG9uZyByZXNwb25zZTsKLQotICAgIGF2YWlsYWJsZSA9IDA7Ci0gICAgc25kdmVyc2lvbiA9IFNuZFNvdW5kTWFuYWdlclZlcnNpb24oKTsKLSAgICBpZiAoIHNuZHZlcnNpb24ubWFqb3JSZXYgPj0gMyApIHsKLSAgICAgICAgaWYgKCBHZXN0YWx0KGdlc3RhbHRTb3VuZEF0dHIsICZyZXNwb25zZSkgPT0gbm9FcnIgKSB7Ci0gICAgICAgICAgICBpZiAoIChyZXNwb25zZSAmICgxIDw8IGdlc3RhbHRTbmRQbGF5RG91YmxlQnVmZmVyKSkgKSB7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICggR2VzdGFsdChnZXN0YWx0U291bmRBdHRyLCAmcmVzcG9uc2UpID09IG5vRXJyICkgewotICAgICAgICAgICAgaWYgKCAocmVzcG9uc2UgJiAoMSA8PCBnZXN0YWx0SGFzQVNDKSkgKSB7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4oYXZhaWxhYmxlKTsKLX0KLQotc3RhdGljIHZvaWQgTWFjX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIGNoYW5uZWwgIT0gTlVMTCApIHsKLSAgICAgICAgLyogQ2xlYW4gdXAgdGhlIGF1ZGlvIGNoYW5uZWwgKi8KLSAgICAgICAgU25kRGlzcG9zZUNoYW5uZWwoY2hhbm5lbCwgdHJ1ZSk7Ci0gICAgICAgIGNoYW5uZWwgPSBOVUxMOwotICAgIH0KLSAgICBmb3IgKCBpPTA7IGk8MjsgKytpICkgewotICAgICAgICBpZiAoIGF1ZGlvX2J1ZltpXSApIHsKLSAgICAgICAgICAgIFNETF9mcmVlKGF1ZGlvX2J1ZltpXSk7Ci0gICAgICAgICAgICBhdWRpb19idWZbaV0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IE1hY19PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0gICAgU25kRG91YmxlQnVmZmVySGVhZGVyMiBhdWRpb19kYmg7Ci0gICAgaW50IGk7Ci0gICAgbG9uZyBpbml0T3B0aW9uczsKLSAgICBpbnQgc2FtcGxlX2JpdHM7Ci0gICAgU25kRG91YmxlQmFja1VQUCBkb3VibGVCYWNrUHJvYzsKLQotICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSBkb3VibGUtYnVmZmVyZWQgYXVkaW8gaXMgYXZhaWxhYmxlICovCi0gICAgaWYgKCAhIERvdWJsZUJ1ZmZlckF1ZGlvX0F2YWlsYWJsZSgpICkgewotICAgICAgICBTRExfU2V0RXJyb3IoIlNvdW5kIG1hbmFnZXIgZG9lc24ndCBzdXBwb3J0IGRvdWJsZS1idWZmZXJpbmciKTsKLSAgICAgICAgcmV0dXJuKC0xKTsKLSAgICB9Ci0KLSAgICAvKiBWZXJ5IGZldyBjb252ZXJzaW9ucyBhcmUgcmVxdWlyZWQsIGJ1dC4uLiAqLwotICAgIHN3aXRjaCAoc3BlYy0+Zm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQVVESU9fUzg6Ci0gICAgICAgIHNwZWMtPmZvcm1hdCA9IEFVRElPX1U4OwotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19VMTZMU0I6Ci0gICAgICAgIHNwZWMtPmZvcm1hdCA9IEFVRElPX1MxNkxTQjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fVTE2TVNCOgotICAgICAgICBzcGVjLT5mb3JtYXQgPSBBVURJT19TMTZNU0I7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgZG91YmxlLWJhY2sgaGVhZGVyICovCi0gICAgU0RMX21lbXNldCgmYXVkaW9fZGJoLCAwLCBzaXplb2YoYXVkaW9fZGJoKSk7Ci0gICAgZG91YmxlQmFja1Byb2MgPSBOZXdTbmREb3VibGVCYWNrUHJvYyAoc25kRG91YmxlQmFja1Byb2MpOwotICAgIHNhbXBsZV9iaXRzID0gc3BlYy0+c2l6ZSAvIHNwZWMtPnNhbXBsZXMgLyBzcGVjLT5jaGFubmVscyAqIDg7Ci0gICAgCi0gICAgYXVkaW9fZGJoLmRiaE51bUNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7Ci0gICAgYXVkaW9fZGJoLmRiaFNhbXBsZVNpemUgICAgPSBzYW1wbGVfYml0czsKLSAgICBhdWRpb19kYmguZGJoQ29tcHJlc3Npb25JRCA9IDA7Ci0gICAgYXVkaW9fZGJoLmRiaFBhY2tldFNpemUgICAgPSAwOwotICAgIGF1ZGlvX2RiaC5kYmhTYW1wbGVSYXRlICAgID0gc3BlYy0+ZnJlcSA8PCAxNjsKLSAgICBhdWRpb19kYmguZGJoRG91YmxlQmFjayAgICA9IGRvdWJsZUJhY2tQcm9jOwotICAgIGF1ZGlvX2RiaC5kYmhGb3JtYXQgICAgPSAwOwotCi0gICAgLyogTm90ZSB0aGF0IHdlIGluc3RhbGwgdGhlIDE2Yml0TGl0dGxlRW5kaWFuIENvbnZlcnRlciBpZiBuZWVkZWQuICovCi0gICAgaWYgKCBzcGVjLT5mb3JtYXQgPT0gMHg4MDEwICkgewotICAgICAgICBhdWRpb19kYmguZGJoQ29tcHJlc3Npb25JRCA9IGZpeGVkQ29tcHJlc3Npb247Ci0gICAgICAgIGF1ZGlvX2RiaC5kYmhGb3JtYXQgPSBrMTZCaXRMaXR0bGVFbmRpYW5Gb3JtYXQ7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgdGhlIDIgZG91YmxlLWJhY2sgYnVmZmVycyAqLwotICAgIGZvciAoIGk9MDsgaTwyOyArK2kgKSB7Ci0gICAgICAgIGF1ZGlvX2J1ZltpXSA9IFNETF9jYWxsb2MoMSwgc2l6ZW9mKFNuZERvdWJsZUJ1ZmZlcikrc3BlYy0+c2l6ZSk7Ci0gICAgICAgIGlmICggYXVkaW9fYnVmW2ldID09IE5VTEwgKSB7Ci0gICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgICAgIHJldHVybigtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXVkaW9fYnVmW2ldLT5kYk51bUZyYW1lcyA9IHNwZWMtPnNhbXBsZXM7Ci0gICAgICAgIGF1ZGlvX2J1ZltpXS0+ZGJGbGFncyA9IGRiQnVmZmVyUmVhZHk7Ci0gICAgICAgIGF1ZGlvX2J1ZltpXS0+ZGJVc2VySW5mb1swXSA9IChsb25nKXRoaXM7Ci0gICAgICAgIGF1ZGlvX2RiaC5kYmhCdWZmZXJQdHJbaV0gPSBhdWRpb19idWZbaV07Ci0gICAgfQotCi0gICAgLyogQ3JlYXRlIHRoZSBzb3VuZCBtYW5hZ2VyIGNoYW5uZWwgKi8KLSAgICBjaGFubmVsID0gKFNuZENoYW5uZWxQdHIpU0RMX21hbGxvYyhzaXplb2YoKmNoYW5uZWwpKTsKLSAgICBpZiAoIGNoYW5uZWwgPT0gTlVMTCApIHsKLSAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgIHJldHVybigtMSk7Ci0gICAgfQotICAgIGlmICggc3BlYy0+Y2hhbm5lbHMgPj0gMiApIHsKLSAgICAgICAgaW5pdE9wdGlvbnMgPSBpbml0U3RlcmVvOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluaXRPcHRpb25zID0gaW5pdE1vbm87Ci0gICAgfQotICAgIGNoYW5uZWwtPnVzZXJJbmZvID0gMDsKLSAgICBjaGFubmVsLT5xTGVuZ3RoID0gMTI4OwotICAgIGlmICggU25kTmV3Q2hhbm5lbCgmY2hhbm5lbCwgc2FtcGxlZFN5bnRoLCBpbml0T3B0aW9ucywgMEwpICE9IG5vRXJyICkgewotICAgICAgICBTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gY2hhbm5lbCIpOwotICAgICAgICBTRExfZnJlZShjaGFubmVsKTsKLSAgICAgICAgY2hhbm5lbCA9IE5VTEw7Ci0gICAgICAgIHJldHVybigtMSk7Ci0gICAgfQotIAotICAgIC8qIFN0YXJ0IHBsYXliYWNrICovCi0gICAgaWYgKCBTbmRQbGF5RG91YmxlQnVmZmVyKGNoYW5uZWwsIChTbmREb3VibGVCdWZmZXJIZWFkZXJQdHIpJmF1ZGlvX2RiaCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbm9FcnIgKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiVW5hYmxlIHRvIHBsYXkgZG91YmxlIGJ1ZmZlcmVkIGF1ZGlvIik7Ci0gICAgICAgIHJldHVybigtMSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAxOwotfQotCi0jZW5kaWYgLyogVEFSR0VUX0FQSV9NQUNfQ0FSQk9OIHx8IFVTRV9SWUFOU19TT1VORENPREUgKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9tYWNyb20vU0RMX3JvbWF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21hY3JvbS9TRExfcm9tYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1ZGM2OS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21hY3JvbS9TRExfcm9tYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfcm9tYXVkaW9faAotI2RlZmluZSBfU0RMX3JvbWF1ZGlvX2gKLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBUaGlzIGlzIFJ5YW4ncyBpbXByb3ZlZCBNYWNPUyBzb3VuZCBjb2RlLCB3aXRoIGxvY2tpbmcgc3VwcG9ydCAqLwotI2RlZmluZSBVU0VfUllBTlNfU09VTkRDT0RFCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKLQotc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKLQkvKiBTb3VuZCBtYW5hZ2VyIGF1ZGlvIGNoYW5uZWwgKi8KLQlTbmRDaGFubmVsUHRyIGNoYW5uZWw7Ci0jaWYgZGVmaW5lZChUQVJHRVRfQVBJX01BQ19DQVJCT04pIHx8IGRlZmluZWQoVVNFX1JZQU5TX1NPVU5EQ09ERSkKLQkvKiBGSVhNRTogQWRkIFJ5YW4ncyBzdGF0aWMgZGF0YSBoZXJlICovCi0jZWxzZQotCS8qIERvdWJsZSBidWZmZXJpbmcgdmFyaWFibGVzICovCi0JU25kRG91YmxlQnVmZmVyUHRyIGF1ZGlvX2J1ZlsyXTsKLSNlbmRpZgotfTsKLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIGNoYW5uZWwJCSh0aGlzLT5oaWRkZW4tPmNoYW5uZWwpCi0jZGVmaW5lIGF1ZGlvX2J1ZgkodGhpcy0+aGlkZGVuLT5hdWRpb19idWYpCi0KLSNlbmRpZiAvKiBfU0RMX3JvbWF1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmRlYzY0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0JQXVkaW8gaW50ZXJydXB0IHZhcmlhYmxlcyBhbmQgY2FsbGJhY2sgZnVuY3Rpb24KLQotCVBhdHJpY2UgTWFuZGluCi0qLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxtaW50L29zYmluZC5oPgotI2luY2x1ZGUgPG1pbnQvZmFsY29uLmg+Ci0jaW5jbHVkZSA8bWludC9taW50YmluZC5oPgotI2luY2x1ZGUgPG1pbnQvY29va2llLmg+Ci0KLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICJTRExfbWludGF1ZGlvLmgiCi0jaW5jbHVkZSAiU0RMX21pbnRhdWRpb19zdGZhLmgiCi0KLS8qIFRoZSBhdWRpbyBkZXZpY2UgKi8KLQotU0RMX0F1ZGlvRGV2aWNlICpTRExfTWludEF1ZGlvX2RldmljZTsKLVVpbnQ4ICpTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzJdOwkvKiBQb2ludGVycyB0byBidWZmZXJzICovCi11bnNpZ25lZCBsb25nIFNETF9NaW50QXVkaW9fYXVkaW9zaXplOwkJLyogTGVuZ3RoIG9mIGF1ZGlvIGJ1ZmZlcj1zcGVjLT5zaXplICovCi12b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBTRExfTWludEF1ZGlvX251bWJ1ZjsJCS8qIEJ1ZmZlciB0byBwbGF5ICovCi12b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBTRExfTWludEF1ZGlvX211dGV4Owotdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBTRExfTWludEF1ZGlvX2Nsb2NrdGljczsKLWNvb2tpZV9zdGZhX3QJKlNETF9NaW50QXVkaW9fc3RmYTsKLXVuc2lnbmVkIHNob3J0IFNETF9NaW50QXVkaW9faGFzZnB1OwotCi0vKiBNaU5UIHRocmVhZCB2YXJpYWJsZXMgKi8KLVNETF9ib29sIFNETF9NaW50QXVkaW9fbWludF9wcmVzZW50OwotU0RMX2Jvb2wgU0RMX01pbnRBdWRpb19xdWl0X3RocmVhZDsKLVNETF9ib29sIFNETF9NaW50QXVkaW9fdGhyZWFkX2ZpbmlzaGVkOwotbG9uZyBTRExfTWludEF1ZGlvX3RocmVhZF9waWQ7Ci0KLS8qIFRoZSBjYWxsYmFjayBmdW5jdGlvbiwgY2FsbGVkIGJ5IGVhY2ggZHJpdmVyIHdoZW5ldmVyIG5lZWRlZCAqLwotCi12b2lkIFNETF9NaW50QXVkaW9fQ2FsbGJhY2sodm9pZCkKLXsKLQlVaW50OCAqYnVmZmVyOwotCVNETF9BdWRpb0RldmljZSAqYXVkaW8gPSBTRExfTWludEF1ZGlvX2RldmljZTsKLQotIAlidWZmZXIgPSBTRExfTWludEF1ZGlvX2F1ZGlvYnVmW1NETF9NaW50QXVkaW9fbnVtYnVmXTsKLQlTRExfbWVtc2V0KGJ1ZmZlciwgYXVkaW8tPnNwZWMuc2lsZW5jZSwgYXVkaW8tPnNwZWMuc2l6ZSk7Ci0KLQlpZiAoYXVkaW8tPnBhdXNlZCkKLQkJcmV0dXJuOwotCi0JaWYgKGF1ZGlvLT5jb252ZXJ0Lm5lZWRlZCkgewotCQlpbnQgc2lsZW5jZTsKLQotCQlpZiAoIGF1ZGlvLT5jb252ZXJ0LnNyY19mb3JtYXQgPT0gQVVESU9fVTggKSB7Ci0JCQlzaWxlbmNlID0gMHg4MDsKLQkJfSBlbHNlIHsKLQkJCXNpbGVuY2UgPSAwOwotCQl9Ci0JCVNETF9tZW1zZXQoYXVkaW8tPmNvbnZlcnQuYnVmLCBzaWxlbmNlLCBhdWRpby0+Y29udmVydC5sZW4pOwotCQlhdWRpby0+c3BlYy5jYWxsYmFjayhhdWRpby0+c3BlYy51c2VyZGF0YSwKLQkJCShVaW50OCAqKWF1ZGlvLT5jb252ZXJ0LmJ1ZixhdWRpby0+Y29udmVydC5sZW4pOwotCQlTRExfQ29udmVydEF1ZGlvKCZhdWRpby0+Y29udmVydCk7Ci0JCVNETF9tZW1jcHkoYnVmZmVyLCBhdWRpby0+Y29udmVydC5idWYsIGF1ZGlvLT5jb252ZXJ0Lmxlbl9jdnQpOwotCX0gZWxzZSB7Ci0JCWF1ZGlvLT5zcGVjLmNhbGxiYWNrKGF1ZGlvLT5zcGVjLnVzZXJkYXRhLCBidWZmZXIsIGF1ZGlvLT5zcGVjLnNpemUpOwotCX0KLX0KLQotLyogQWRkIGEgbmV3IGZyZXF1ZW5jeS9jbG9jay9wcmVkaXZpc29yIHRvIHRoZSBjdXJyZW50IGxpc3QgKi8KLXZvaWQgU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3koX1RISVMsIFVpbnQzMiBmcmVxdWVuY3ksIFVpbnQzMiBjbG9jaywKLQlVaW50MzIgcHJlZGl2LCBpbnQgZ3Bpb19iaXRzKQotewotCWludCBpLCBwOwotCi0JaWYgKE1JTlRBVURJT19mcmVxY291bnQ9PU1JTlRBVURJT19tYXhmcmVxcykgewotCQlyZXR1cm47Ci0JfQotCi0JLyogU2VhcmNoIHdoZXJlIHRvIGluc2VydCB0aGUgZnJlcXVlbmN5IChoaWdoZXN0IGZpcnN0KSAqLwotCWZvciAocD0wOyBwPE1JTlRBVURJT19mcmVxY291bnQ7IHArKykgewotCQlpZiAoZnJlcXVlbmN5ID4gTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW3BdLmZyZXF1ZW5jeSkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBQdXQgYWxsIGZvbGxvd2luZyBvbmVzIGZhcmVyICovCi0JaWYgKE1JTlRBVURJT19mcmVxY291bnQ+MCkgewotCQlmb3IgKGk9TUlOVEFVRElPX2ZyZXFjb3VudDsgaT5wOyBpLS0pIHsKLQkJCVNETF9tZW1jcHkoJk1JTlRBVURJT19mcmVxdWVuY2llc1tpXSwgJk1JTlRBVURJT19mcmVxdWVuY2llc1tpLTFdLCBzaXplb2YobWludF9mcmVxdWVuY3lfdCkpOwotCQl9Ci0JfQotCi0JLyogQW5kIGluc2VydCBuZXcgb25lICovCi0JTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW3BdLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKLQlNSU5UQVVESU9fZnJlcXVlbmNpZXNbcF0ubWFzdGVyY2xvY2sgPSBjbG9jazsKLQlNSU5UQVVESU9fZnJlcXVlbmNpZXNbcF0ucHJlZGl2aXNvciA9IHByZWRpdjsKLQlNSU5UQVVESU9fZnJlcXVlbmNpZXNbcF0uZ3Bpb19iaXRzID0gZ3Bpb19iaXRzOwotCi0JTUlOVEFVRElPX2ZyZXFjb3VudCsrOwotfQotCi0vKiBTZWFyY2ggZm9yIHRoZSBuZWFyZXN0IGZyZXF1ZW5jeSAqLwotaW50IFNETF9NaW50QXVkaW9fU2VhcmNoRnJlcXVlbmN5KF9USElTLCBpbnQgZGVzaXJlZF9mcmVxKQotewotCWludCBpOwotCi0JLyogT25seSAxIGZyZXEgPyAqLwotCWlmIChNSU5UQVVESU9fZnJlcWNvdW50PT0xKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIENoZWNrIHRoZSBhcnJheSAqLwotCWZvciAoaT0wOyBpPE1JTlRBVURJT19mcmVxY291bnQ7IGkrKykgewotCQlpZiAoZGVzaXJlZF9mcmVxID49ICgoTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW2ldLmZyZXF1ZW5jeSsKLQkJCU1JTlRBVURJT19mcmVxdWVuY2llc1tpKzFdLmZyZXF1ZW5jeSk+PjEpKSB7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQotCS8qIE5vdCBpbiB0aGUgYXJyYXksIGdpdmUgdGhlIGxhdGVzdCAqLwotCXJldHVybiBNSU5UQVVESU9fZnJlcWNvdW50LTE7Ci19Ci0KLS8qIENoZWNrIGlmIEZQVSBpcyBwcmVzZW50ICovCi12b2lkIFNETF9NaW50QXVkaW9fQ2hlY2tGcHUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGNvb2tpZV9mcHU7Ci0KLQlTRExfTWludEF1ZGlvX2hhc2ZwdSA9IDA7Ci0JaWYgKEdldGNvb2tpZShDX19GUFUsICZjb29raWVfZnB1KSAhPSBDX0ZPVU5EKSB7Ci0JCXJldHVybjsKLQl9Ci0Jc3dpdGNoICgoY29va2llX2ZwdT4+MTYpJjB4ZmZmZSkgewotCQljYXNlIDI6Ci0JCWNhc2UgNDoKLQkJY2FzZSA2OgotCQljYXNlIDg6Ci0JCWNhc2UgMTY6Ci0JCQlTRExfTWludEF1ZGlvX2hhc2ZwdSA9IDE7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLS8qIFRoZSB0aHJlYWQgZnVuY3Rpb24sIHVzZWQgdW5kZXIgTWlOVCB3aXRoIHhiaW9zICovCi1pbnQgU0RMX01pbnRBdWRpb19UaHJlYWQobG9uZyBwYXJhbSkKLXsKLQlTbmRCdWZQdHIJcG9pbnRlcnM7Ci0JU0RMX2Jvb2wJYnVmZmVyc19maWxsZWRbMl0gPSB7U0RMX0ZBTFNFLCBTRExfRkFMU0V9OwotCi0JU0RMX01pbnRBdWRpb190aHJlYWRfZmluaXNoZWQgPSBTRExfRkFMU0U7Ci0Jd2hpbGUgKCFTRExfTWludEF1ZGlvX3F1aXRfdGhyZWFkKSB7Ci0JCWlmIChCdWZmcHRyKCZwb2ludGVycykhPTApCi0JCQljb250aW51ZTsKLQotCQlpZiAoKCAodW5zaWduZWQgbG9uZylwb2ludGVycy5wbGF5Pj0odW5zaWduZWQgbG9uZylTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKQotCQkJJiYgKCAodW5zaWduZWQgbG9uZylwb2ludGVycy5wbGF5PD0odW5zaWduZWQgbG9uZylTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdKSkgCi0JCXsKLQkJCS8qIERNQSBpcyByZWFkaW5nIGJ1ZmZlciAjMCwgc2V0dXAgYnVmZmVyICMxIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLQkJCWlmICghYnVmZmVyc19maWxsZWRbMV0pIHsKLQkJCQlTRExfTWludEF1ZGlvX251bWJ1ZiA9IDE7Ci0JCQkJU0RMX01pbnRBdWRpb19DYWxsYmFjaygpOwotCQkJCVNldGJ1ZmZlcigwLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdICsgU0RMX01pbnRBdWRpb19hdWRpb3NpemUpOwotCQkJCWJ1ZmZlcnNfZmlsbGVkWzFdPVNETF9UUlVFOwotCQkJCWJ1ZmZlcnNfZmlsbGVkWzBdPVNETF9GQUxTRTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIERNQSBpcyByZWFkaW5nIGJ1ZmZlciAjMSwgc2V0dXAgYnVmZmVyICMwIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLQkJCWlmICghYnVmZmVyc19maWxsZWRbMF0pIHsKLQkJCQlTRExfTWludEF1ZGlvX251bWJ1ZiA9IDA7Ci0JCQkJU0RMX01pbnRBdWRpb19DYWxsYmFjaygpOwotCQkJCVNldGJ1ZmZlcigwLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdICsgU0RMX01pbnRBdWRpb19hdWRpb3NpemUpOwotCQkJCWJ1ZmZlcnNfZmlsbGVkWzBdPVNETF9UUlVFOwotCQkJCWJ1ZmZlcnNfZmlsbGVkWzFdPVNETF9GQUxTRTsKLQkJCX0KLQkJfQotCi0JCXVzbGVlcCgxMDApOwotCX0KLQlTRExfTWludEF1ZGlvX3RocmVhZF9maW5pc2hlZCA9IFNETF9UUlVFOwotCXJldHVybiAwOwotfQotCi12b2lkIFNETF9NaW50QXVkaW9fV2FpdFRocmVhZCh2b2lkKQotewotCWlmICghU0RMX01pbnRBdWRpb19taW50X3ByZXNlbnQpCi0JCXJldHVybjsKLQotCWlmIChTRExfTWludEF1ZGlvX3RocmVhZF9maW5pc2hlZCkKLQkJcmV0dXJuOwotCi0JU0RMX01pbnRBdWRpb19xdWl0X3RocmVhZCA9IFNETF9UUlVFOwotCXdoaWxlICghU0RMX01pbnRBdWRpb190aHJlYWRfZmluaXNoZWQpIHsKLQkJU3lpZWxkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDI1ODAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLQlNaU5UIGF1ZGlvIGRyaXZlcgotCi0JUGF0cmljZSBNYW5kaW4KLSovCi0KLSNpZm5kZWYgX1NETF9taW50YXVkaW9faAotI2RlZmluZSBfU0RMX21pbnRhdWRpb19oCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKLSNpbmNsdWRlICJTRExfbWludGF1ZGlvX3N0ZmEuaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgYXVkaW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcwotCi0vKiAxNiBwcmVkaXZpc29ycyB3aXRoIDMgY2xvY2tzIG1heC4gKi8KLSNkZWZpbmUgTUlOVEFVRElPX21heGZyZXFzCQkoMTYqMykJCQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVWludDMyCWZyZXF1ZW5jeTsKLQlVaW50MzIJbWFzdGVyY2xvY2s7Ci0JVWludDMyCXByZWRpdmlzb3I7Ci0JaW50CWdwaW9fYml0czsJLyogaW4gY2FzZSBvZiBleHRlcm5hbCBjbG9jayAqLwotfSBtaW50X2ZyZXF1ZW5jeV90OwotCi1zdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgewotCW1pbnRfZnJlcXVlbmN5X3QJZnJlcXVlbmNpZXNbTUlOVEFVRElPX21heGZyZXFzXTsKLQlpbnQgCWZyZXFfY291bnQ7CQkvKiBOdW1iZXIgb2YgZnJlcXVlbmNpZXMgaW4gdGhlIGFycmF5ICovCi0JaW50CQludW1mcmVxOwkJLyogTnVtYmVyIG9mIHNlbGVjdGVkIGZyZXF1ZW5jeSAqLwotfTsKLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0KLSNkZWZpbmUgTUlOVEFVRElPX2ZyZXF1ZW5jaWVzCSh0aGlzLT5oaWRkZW4tPmZyZXF1ZW5jaWVzKQotI2RlZmluZSBNSU5UQVVESU9fZnJlcWNvdW50CQkodGhpcy0+aGlkZGVuLT5mcmVxX2NvdW50KQotI2RlZmluZSBNSU5UQVVESU9fbnVtZnJlcQkJKHRoaXMtPmhpZGRlbi0+bnVtZnJlcSkKLQotLyogX01DSCBjb29raWUgKHZhbHVlcz4+MTYpICovCi1lbnVtIHsKLQlNQ0hfU1Q9MCwKLQlNQ0hfU1RFLAotCU1DSF9UVCwKLQlNQ0hfRjMwLAotCU1DSF9DTE9ORSwKLQlNQ0hfQVJBTllNCi19OwotCi0vKiBNYXN0ZXIgY2xvY2tzIGZvciByZXBsYXkgZnJlcXVlbmNpZXMgKi8KLSNkZWZpbmUgTUFTVEVSQ0xPQ0tfU1RFCQk4MDEwNjY2CQkvKiBOb3Qgc3VyZSBvZiB0aGlzIG9uZSAqLwotI2RlZmluZSBNQVNURVJDTE9DS19UVAkJMTYxMDc5NTMJLyogTm90IHN1cmUgb2YgdGhpcyBvbmUgKi8KLSNkZWZpbmUgTUFTVEVSQ0xPQ0tfRkFMQ09OMQkyNTE3NTAwMAotI2RlZmluZSBNQVNURVJDTE9DS19GQUxDT04yCTMyMDAwMDAwCS8qIE9ubHkgdXNhYmxlIGZvciBEU1A1NksgKi8KLSNkZWZpbmUgTUFTVEVSQ0xPQ0tfRkFMQ09ORVhUCS0xCQkvKiBDbG9jayBvbiBEU1A1NksgcG9ydCwgdW5rbm93biAqLwotI2RlZmluZSBNQVNURVJDTE9DS180NEsJCTIyNTc5MjAwCS8qIFN0YW5kYXJkIGNsb2NrIGZvciA0NC4xIEtoeiAqLwotI2RlZmluZSBNQVNURVJDTE9DS180OEsJCTI0NTc2MDAwCS8qIFN0YW5kYXJkIGNsb2NrIGZvciA0OCBLaHogKi8KLQotLyogTWFzdGVyIGNsb2NrIHByZWRpdmlzb3JzICovCi0jZGVmaW5lIE1BU1RFUlBSRURJVl9TVEUJMTYwCi0jZGVmaW5lIE1BU1RFUlBSRURJVl9UVAkJMzIwCi0jZGVmaW5lIE1BU1RFUlBSRURJVl9GQUxDT04JMjU2Ci0jZGVmaW5lIE1BU1RFUlBSRURJVl9NSUxBTgkyNTYKLQotLyogTUZQIDY4OTAxIGludGVycnVwdCBzb3VyY2VzICovCi1lbnVtIHsKLQlNRlBfUEFSQUxMRUw9MCwKLQlNRlBfRENELAotCU1GUF9DVFMsCi0JTUZQX0JJVEJMVCwKLQlNRlBfVElNRVJELAotCU1GUF9CQVVEUkFURT1NRlBfVElNRVJELAotCU1GUF9USU1FUkMsCi0JTUZQXzIwMEhaPU1GUF9USU1FUkMsCi0JTUZQX0FDSUEsCi0JTUZQX0RJU0ssCi0JTUZQX1RJTUVSQiwKLQlNRlBfSEJMQU5LPU1GUF9USU1FUkIsCi0JTUZQX1RFUlIsCi0JTUZQX1RCRSwKLQlNRlBfUkVSUiwKLQlNRlBfUkJGLAotCU1GUF9USU1FUkEsCi0JTUZQX0RNQVNPVU5EPU1GUF9USU1FUkEsCi0JTUZQX1JJTkcsCi0JTUZQX01PTk9ERVRFQ1QKLX07Ci0KLS8qIFhidGltZXIoKSB0aW1lcnMgKi8KLWVudW0gewotCVhCX1RJTUVSQT0wLAotCVhCX1RJTUVSQiwKLQlYQl9USU1FUkMsCi0JWEJfVElNRVJECi19OwotCi0vKiBWYXJpYWJsZXMgKi8KLWV4dGVybiBTRExfQXVkaW9EZXZpY2UgKlNETF9NaW50QXVkaW9fZGV2aWNlOwotZXh0ZXJuIFVpbnQ4ICpTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzJdOwkvKiBQb2ludGVycyB0byBidWZmZXJzICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBTRExfTWludEF1ZGlvX2F1ZGlvc2l6ZTsJCS8qIExlbmd0aCBvZiBhdWRpbyBidWZmZXI9c3BlYy0+c2l6ZSAqLwotZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IFNETF9NaW50QXVkaW9fbnVtYnVmOwkJLyogQnVmZmVyIHRvIHBsYXkgKi8KLWV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBTRExfTWludEF1ZGlvX211dGV4OwotZXh0ZXJuIGNvb2tpZV9zdGZhX3QgKlNETF9NaW50QXVkaW9fc3RmYTsKLWV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIFNETF9NaW50QXVkaW9fY2xvY2t0aWNzOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IFNETF9NaW50QXVkaW9faGFzZnB1OwkvKiBUbyBwcmVzZXJ2ZSBmcHUgcmVnaXN0ZXJzIGlmIG5lZWRlZCAqLwotCi0vKiBNaU5UIHRocmVhZCB2YXJpYWJsZXMgKi8KLWV4dGVybiBTRExfYm9vbAlTRExfTWludEF1ZGlvX21pbnRfcHJlc2VudDsKLWV4dGVybiBTRExfYm9vbCBTRExfTWludEF1ZGlvX3F1aXRfdGhyZWFkOwotZXh0ZXJuIFNETF9ib29sIFNETF9NaW50QXVkaW9fdGhyZWFkX2ZpbmlzaGVkOwotZXh0ZXJuIGxvbmcgU0RMX01pbnRBdWRpb190aHJlYWRfcGlkOwotCi0vKiBGdW5jdGlvbnMgKi8KLXZvaWQgU0RMX01pbnRBdWRpb19DYWxsYmFjayh2b2lkKTsKLXZvaWQgU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3koX1RISVMsIFVpbnQzMiBmcmVxdWVuY3ksIFVpbnQzMiBjbG9jaywKLQlVaW50MzIgcHJlZGl2LCBpbnQgZ3Bpb19iaXRzKTsKLWludCBTRExfTWludEF1ZGlvX1NlYXJjaEZyZXF1ZW5jeShfVEhJUywgaW50IGRlc2lyZWRfZnJlcSk7Ci12b2lkIFNETF9NaW50QXVkaW9fQ2hlY2tGcHUodm9pZCk7Ci0KLS8qIE1pTlQgdGhyZWFkIGZ1bmN0aW9ucyAqLwotaW50IFNETF9NaW50QXVkaW9fVGhyZWFkKGxvbmcgcGFyYW0pOwotdm9pZCBTRExfTWludEF1ZGlvX1dhaXRUaHJlYWQodm9pZCk7Ci0KLS8qIEFTTSBpbnRlcnJ1cHQgZnVuY3Rpb25zICovCi12b2lkIFNETF9NaW50QXVkaW9fR3N4YkludGVycnVwdCh2b2lkKTsKLXZvaWQgU0RMX01pbnRBdWRpb19FbXB0eUdzeGJJbnRlcnJ1cHQodm9pZCk7Ci12b2lkIFNETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHRNZWFzdXJlQ2xvY2sodm9pZCk7Ci12b2lkIFNETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHQodm9pZCk7Ci12b2lkIFNETF9NaW50QXVkaW9fRG1hOEludGVycnVwdCh2b2lkKTsKLXZvaWQgU0RMX01pbnRBdWRpb19TdGZhSW50ZXJydXB0KHZvaWQpOwotCi0jZW5kaWYgLyogX1NETF9taW50YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fZG1hOC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fZG1hOC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGM0M2NmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX2RtYTguYworKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLQlNaU5UIGF1ZGlvIGRyaXZlcgotCXVzaW5nIERNQSA4Yml0cyAoaGFyZHdhcmUgYWNjZXNzKQotCi0JUGF0cmljZSBNYW5kaW4KLSovCi0KLS8qIE1pbnQgaW5jbHVkZXMgKi8KLSNpbmNsdWRlIDxtaW50L29zYmluZC5oPgotI2luY2x1ZGUgPG1pbnQvZmFsY29uLmg+Ci0jaW5jbHVkZSA8bWludC9jb29raWUuaD4KLQotI2luY2x1ZGUgIlNETF9hdWRpby5oIgotI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCi0KLSNpbmNsdWRlICIuLi8uLi92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlteGFsbG9jX2MuaCIKLQotI2luY2x1ZGUgIlNETF9taW50YXVkaW8uaCIKLSNpbmNsdWRlICJTRExfbWludGF1ZGlvX2RtYTguaCIKLQotLyotLS0gRGVmaW5lcyAtLS0qLwotCi0jZGVmaW5lIE1JTlRfQVVESU9fRFJJVkVSX05BTUUgIm1pbnRfZG1hOCIKLQotLyogRGVidWcgcHJpbnQgaW5mbyAqLwotI2RlZmluZSBERUJVR19OQU1FICJhdWRpbzpkbWE4OiAiCi0jaWYgMAotI2RlZmluZSBERUJVR19QUklOVCh3aGF0KSBcCi0JeyBcCi0JCXByaW50ZiB3aGF0OyBcCi0JfQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfUFJJTlQod2hhdCkKLSNlbmRpZgotCi0vKi0tLSBTdGF0aWMgdmFyaWFibGVzIC0tLSovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvb2tpZV9zbmQsIGNvb2tpZV9tY2g7Ci0KLS8qLS0tIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgLS0tKi8KLQotc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKTsKLXN0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgTWludF9Mb2NrQXVkaW8oX1RISVMpOwotc3RhdGljIHZvaWQgTWludF9VbmxvY2tBdWRpbyhfVEhJUyk7Ci0KLS8qIFRvIGNoZWNrL2luaXQgaGFyZHdhcmUgYXVkaW8gKi8KLXN0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIE1pbnRfSW5pdEF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLQotLyotLS0gQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgLS0tKi8KLQotc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKLXsKLQljb25zdCBjaGFyICplbnZyID0gU0RMX2dldGVudigiU0RMX0FVRElPRFJJVkVSIik7Ci0KLQkvKiBDaGVjayBpZiB1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlciAqLwotCWlmICgoZW52cikgJiYgKFNETF9zdHJjbXAoZW52ciwgTUlOVF9BVURJT19EUklWRVJfTkFNRSkhPTApKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJ1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlclxuIikpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBDb29raWUgX01DSCBwcmVzZW50ID8gaWYgbm90LCBhc3N1bWUgU1QgbWFjaGluZSAqLwotCWlmIChHZXRjb29raWUoQ19fTUNILCAmY29va2llX21jaCkgPT0gQ19OT1RGT1VORCkgewotCQljb29raWVfbWNoID0gTUNIX1NUOwotCX0KLQotCS8qIENvb2tpZSBfU05EIHByZXNlbnQgPyBpZiBub3QsIGFzc3VtZSBTVCBtYWNoaW5lICovCi0JaWYgKEdldGNvb2tpZShDX19TTkQsICZjb29raWVfc25kKSA9PSBDX05PVEZPVU5EKSB7Ci0JCWNvb2tpZV9zbmQgPSBTTkRfUFNHOwotCX0KLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgOCBiaXRzIGF1ZGlvICovCi0JaWYgKChjb29raWVfc25kICYgU05EXzhCSVQpPT0wKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyA4IGJpdHMgc291bmRcbiIpKTsKLQkgICAgcmV0dXJuKDApOwotCX0KLQotCS8qIENoZWNrIGlmIGF1ZGlvIGlzIGxvY2thYmxlICovCi0JaWYgKGNvb2tpZV9zbmQgJiBTTkRfMTZCSVQpIHsKLQkJaWYgKExvY2tzbmQoKSE9MSkgewotCQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImF1ZGlvIGxvY2tlZCBieSBvdGhlciBhcHBsaWNhdGlvblxuIikpOwotCQkJcmV0dXJuKDApOwotCQl9Ci0KLQkJVW5sb2Nrc25kKCk7Ci0JfQotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIjggYml0cyBhdWRpbyBhdmFpbGFibGUhXG4iKSk7Ci0JcmV0dXJuKDEpOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0gICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotICAgIFNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotICAgIGlmICggdGhpcyApIHsKLSAgICAgICAgU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0gICAgICAgIHRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKLSAgICAgICAgICAgICAgICBTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotICAgIH0KLSAgICBpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICBpZiAoIHRoaXMgKSB7Ci0gICAgICAgICAgICBTRExfZnJlZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQotICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgICB0aGlzLT5PcGVuQXVkaW8gICA9IE1pbnRfT3BlbkF1ZGlvOwotICAgIHRoaXMtPkNsb3NlQXVkaW8gID0gTWludF9DbG9zZUF1ZGlvOwotICAgIHRoaXMtPkxvY2tBdWRpbyAgID0gTWludF9Mb2NrQXVkaW87Ci0gICAgdGhpcy0+VW5sb2NrQXVkaW8gPSBNaW50X1VubG9ja0F1ZGlvOwotICAgIHRoaXMtPmZyZWUgICAgICAgID0gQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0gICAgcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIE1JTlRBVURJT19ETUE4X2Jvb3RzdHJhcCA9IHsKLQlNSU5UX0FVRElPX0RSSVZFUl9OQU1FLCAiTWlOVCBETUEgOCBiaXRzIGF1ZGlvIGRyaXZlciIsCi0JQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KLXN0YXRpYyB2b2lkIE1pbnRfTG9ja0F1ZGlvKF9USElTKQotewotCXZvaWQgKm9sZHBpbGU7Ci0KLQkvKiBTdG9wIHJlcGxheSAqLwotCW9sZHBpbGU9KHZvaWQgKilTdXBlcigwKTsKLQlETUFBVURJT19JTy5jb250cm9sPTA7Ci0JU3VwZXIob2xkcGlsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1pbnRfVW5sb2NrQXVkaW8oX1RISVMpCi17Ci0Jdm9pZCAqb2xkcGlsZTsKLQotCS8qIFJlc3RhcnQgcmVwbGF5ICovCi0Jb2xkcGlsZT0odm9pZCAqKVN1cGVyKDApOwotCURNQUFVRElPX0lPLmNvbnRyb2w9MzsKLQlTdXBlcihvbGRwaWxlKTsKLX0KLQotc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKQotewotCXZvaWQgKm9sZHBpbGU7Ci0KLQkvKiBTdG9wIHJlcGxheSAqLwotCW9sZHBpbGU9KHZvaWQgKilTdXBlcigwKTsKLQlETUFBVURJT19JTy5jb250cm9sPTA7Ci0JU3VwZXIob2xkcGlsZSk7Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiY2xvc2VhdWRpbzogcmVwbGF5IHN0b3BwZWRcbiIpKTsKLQotCS8qIERpc2FibGUgaW50ZXJydXB0ICovCi0JSmRpc2ludChNRlBfRE1BU09VTkQpOwotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImNsb3NlYXVkaW86IGludGVycnVwdCBkaXNhYmxlZFxuIikpOwotCi0JLyogV2FpdCBpZiBjdXJyZW50bHkgcGxheWluZyBzb3VuZCAqLwotCXdoaWxlIChTRExfTWludEF1ZGlvX211dGV4ICE9IDApIHsKLQl9Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiY2xvc2VhdWRpbzogbm8gbW9yZSBpbnRlcnJ1cHQgcnVubmluZ1xuIikpOwotCi0JLyogQ2xlYXIgYnVmZmVycyAqLwotCWlmIChTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKSB7Ci0JCU1mcmVlKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pOwotCQlTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IE5VTEw7Ci0JfQotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImNsb3NlYXVkaW86IGJ1ZmZlcnMgZnJlZWRcbiIpKTsKLX0KLQotc3RhdGljIGludCBNaW50X0NoZWNrQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JaW50IGksIG1hc3RlcnByZWRpdiwgc2ZyZXE7Ci0JdW5zaWduZWQgbG9uZyBtYXN0ZXJjbG9jazsKLQotCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJhc2tlZDogJWQgYml0cywgIixzcGVjLT5mb3JtYXQgJiAweDAwZmYpKTsKLQlERUJVR19QUklOVCgoInNpZ25lZD0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKSkpOwotCURFQlVHX1BSSU5UKCgiYmlnIGVuZGlhbj0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKSkpOwotCURFQlVHX1BSSU5UKCgiY2hhbm5lbHM9JWQsICIsIHNwZWMtPmNoYW5uZWxzKSk7Ci0JREVCVUdfUFJJTlQoKCJmcmVxPSVkXG4iLCBzcGVjLT5mcmVxKSk7Ci0KLQlpZiAoc3BlYy0+Y2hhbm5lbHMgPiAyKQotCQlzcGVjLT5jaGFubmVscyA9IDI7Ci0KLQkvKiBDaGVjayBmb3JtYXRzIGF2YWlsYWJsZSAqLwotCXNwZWMtPmZvcm1hdCA9IEFVRElPX1M4OwotCQotCS8qIENhbGN1bGF0ZSBhbmQgc2VsZWN0IHRoZSBjbG9zZXN0IGZyZXF1ZW5jeSAqLwotCXNmcmVxPTA7Ci0JbWFzdGVyY2xvY2s9TUFTVEVSQ0xPQ0tfU1RFOwotCW1hc3RlcnByZWRpdj1NQVNURVJQUkVESVZfU1RFOwotCXN3aXRjaChjb29raWVfbWNoPj4xNikgewotLyoKLQkJY2FzZSBNQ0hfU1RFOgotCQkJbWFzdGVyY2xvY2s9TUFTVEVSQ0xPQ0tfU1RFOwotCQkJbWFzdGVycHJlZGl2PU1BU1RFUlBSRURJVl9TVEU7Ci0JCQlicmVhazsKLSovCi0JCWNhc2UgTUNIX1RUOgotCQkJbWFzdGVyY2xvY2s9TUFTVEVSQ0xPQ0tfVFQ7Ci0JCQltYXN0ZXJwcmVkaXY9TUFTVEVSUFJFRElWX1RUOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNIX0YzMDoKLQkJY2FzZSBNQ0hfQVJBTllNOgotCQkJbWFzdGVyY2xvY2s9TUFTVEVSQ0xPQ0tfRkFMQ09OMTsKLQkJCW1hc3RlcnByZWRpdj1NQVNURVJQUkVESVZfRkFMQ09OOwotCQkJc2ZyZXE9MTsKLQkJCWJyZWFrOwotCX0KLQkKLQlNSU5UQVVESU9fZnJlcWNvdW50PTA7Ci0JZm9yIChpPXNmcmVxO2k8NDtpKyspIHsKLQkJU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3kodGhpcywgbWFzdGVyY2xvY2svKG1hc3RlcnByZWRpdiooMTw8aSkpLAotCQkJbWFzdGVyY2xvY2ssIGktc2ZyZXEsIC0xKTsKLQl9Ci0KLSNpZiAxCi0JZm9yIChpPTA7IGk8TUlOVEFVRElPX2ZyZXFjb3VudDsgaSsrKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJmcmVxICVkOiAlbHUgSHosIGNsb2NrICVsdSwgcHJlZGl2ICVkXG4iLAotCQkJaSwgTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW2ldLmZyZXF1ZW5jeSwgTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW2ldLm1hc3RlcmNsb2NrLAotCQkJTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW2ldLnByZWRpdmlzb3IKLQkJKSk7Ci0JfQotI2VuZGlmCi0KLQlNSU5UQVVESU9fbnVtZnJlcT1TRExfTWludEF1ZGlvX1NlYXJjaEZyZXF1ZW5jeSh0aGlzLCBzcGVjLT5mcmVxKTsKLQlzcGVjLT5mcmVxPU1JTlRBVURJT19mcmVxdWVuY2llc1tNSU5UQVVESU9fbnVtZnJlcV0uZnJlcXVlbmN5OwotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIm9idGFpbmVkOiAlZCBiaXRzLCAiLHNwZWMtPmZvcm1hdCAmIDB4MDBmZikpOwotCURFQlVHX1BSSU5UKCgic2lnbmVkPSVkLCAiLCAoKHNwZWMtPmZvcm1hdCAmIDB4ODAwMCkhPTApKSk7Ci0JREVCVUdfUFJJTlQoKCJiaWcgZW5kaWFuPSVkLCAiLCAoKHNwZWMtPmZvcm1hdCAmIDB4MTAwMCkhPTApKSk7Ci0JREVCVUdfUFJJTlQoKCJjaGFubmVscz0lZCwgIiwgc3BlYy0+Y2hhbm5lbHMpKTsKLQlERUJVR19QUklOVCgoImZyZXE9JWRcbiIsIHNwZWMtPmZyZXEpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBNaW50X0luaXRBdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQl2b2lkICpvbGRwaWxlOwotCXVuc2lnbmVkIGxvbmcgYnVmZmVyOwotCXVuc2lnbmVkIGNoYXIgbW9kZTsKLQkKLQkvKiBTZXQgcmVwbGF5IHRyYWNrcyAqLwotCWlmIChjb29raWVfc25kICYgU05EXzE2QklUKSB7Ci0JCVNldHRyYWNrcygwLDApOwotCQlTZXRtb250cmFja3MoMCk7Ci0JfQotCi0Jb2xkcGlsZT0odm9pZCAqKVN1cGVyKDApOwotCi0JLyogU3RvcCBjdXJyZW50bHkgcGxheWluZyBzb3VuZCAqLwotCURNQUFVRElPX0lPLmNvbnRyb2w9MDsKLQotCS8qIFNldCBidWZmZXIgKi8KLQlidWZmZXIgPSAodW5zaWduZWQgbG9uZykgU0RMX01pbnRBdWRpb19hdWRpb2J1ZltTRExfTWludEF1ZGlvX251bWJ1Zl07Ci0JRE1BQVVESU9fSU8uc3RhcnRfaGlnaCA9IChidWZmZXI+PjE2KSAmIDI1NTsKLQlETUFBVURJT19JTy5zdGFydF9taWQgPSAoYnVmZmVyPj44KSAmIDI1NTsKLQlETUFBVURJT19JTy5zdGFydF9sb3cgPSBidWZmZXIgJiAyNTU7Ci0KLQlidWZmZXIgKz0gU0RMX01pbnRBdWRpb19hdWRpb3NpemU7Ci0JRE1BQVVESU9fSU8uZW5kX2hpZ2ggPSAoYnVmZmVyPj4xNikgJiAyNTU7Ci0JRE1BQVVESU9fSU8uZW5kX21pZCA9IChidWZmZXI+PjgpICYgMjU1OwotCURNQUFVRElPX0lPLmVuZF9sb3cgPSBidWZmZXIgJiAyNTU7Ci0KLQltb2RlID0gMy1NSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLnByZWRpdmlzb3I7Ci0JaWYgKHNwZWMtPmNoYW5uZWxzPT0xKSB7Ci0JCW1vZGUgfD0gMTw8NzsKLQl9Ci0JRE1BQVVESU9fSU8uc291bmRfY3RybCA9IG1vZGU7CQotCi0JLyogU2V0IGludGVycnVwdCAqLwotCUpkaXNpbnQoTUZQX0RNQVNPVU5EKTsKLQlYYnRpbWVyKFhCX1RJTUVSQSwgOCwgMSwgU0RMX01pbnRBdWRpb19EbWE4SW50ZXJydXB0KTsKLQlKZW5hYmludChNRlBfRE1BU09VTkQpOwotCi0JaWYgKGNvb2tpZV9zbmQgJiBTTkRfMTZCSVQpIHsKLQkJaWYgKFNldGludGVycnVwdChTSV9USU1FUkEsIFNJX1BMQVkpPDApIHsKLQkJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTZXRpbnRlcnJ1cHQoKSBmYWlsZWRcbiIpKTsKLQkJfQotCX0KLQotCS8qIEdvICovCi0JRE1BQVVESU9fSU8uY29udHJvbCA9IDM7CS8qIHBsYXliYWNrICsgcmVwZWF0ICovCi0KLQlTdXBlcihvbGRwaWxlKTsKLX0KLQotc3RhdGljIGludCBNaW50X09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQlTRExfTWludEF1ZGlvX2RldmljZSA9IHRoaXM7Ci0KLQkvKiBDaGVjayBhdWRpbyBjYXBhYmlsaXRpZXMgKi8KLQlpZiAoTWludF9DaGVja0F1ZGlvKHRoaXMsIHNwZWMpPT0tMSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gYnVmZmVycyBpbiBETUEtYWJsZSBSQU0gKi8KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYnVmZmVyIHNpemU9JWRcbiIsIHNwZWMtPnNpemUpKTsKLQotCVNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gPSBBdGFyaV9TeXNNYWxsb2Moc3BlYy0+c2l6ZSAqMiwgTVhfU1RSQU0pOwotCWlmIChTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdPT1OVUxMKSB7Ci0JCVNETF9TZXRFcnJvcigiTUlOVF9PcGVuQXVkaW86IE5vdCBlbm91Z2ggbWVtb3J5IGZvciBhdWRpbyBidWZmZXIiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCVNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0gPSBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdICsgc3BlYy0+c2l6ZSA7Ci0JU0RMX01pbnRBdWRpb19udW1idWY9MDsKLQlTRExfbWVtc2V0KFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0sIHNwZWMtPnNpbGVuY2UsIHNwZWMtPnNpemUgKjIpOwotCVNETF9NaW50QXVkaW9fYXVkaW9zaXplID0gc3BlYy0+c2l6ZTsKLQlTRExfTWludEF1ZGlvX211dGV4ID0gMDsKLQotCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgMCBhdCAweCUwOHhcbiIsIFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pKTsKLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYnVmZmVyIDEgYXQgMHglMDh4XG4iLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdKSk7Ci0KLQlTRExfTWludEF1ZGlvX0NoZWNrRnB1KCk7Ci0KLQkvKiBTZXR1cCBhdWRpbyBoYXJkd2FyZSAqLwotCU1pbnRfSW5pdEF1ZGlvKHRoaXMsIHNwZWMpOwotCi0gICAgcmV0dXJuKDEpOwkvKiBXZSBkb24ndCB1c2UgdGhyZWFkZWQgYXVkaW8gKi8KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX2RtYTguaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX2RtYTguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4ZmVkNC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19kbWE4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLQlETUEgOGJpdHMgYW5kIEZhbGNvbiBDb2RlYyBhdWRpbyBkZWZpbml0aW9ucwotCi0JUGF0cmljZSBNYW5kaW4sIERpZGllciBN6XF1aWdub24KLSovCi0KLSNpZm5kZWYgX1NETF9taW50YXVkaW9fZG1hOF9oCi0jZGVmaW5lIF9TRExfbWludGF1ZGlvX2RtYThfaAotCi0jZGVmaW5lIERNQUFVRElPX0lPX0JBU0UgKDB4ZmZmZjg5MDApCi1zdHJ1Y3QgRE1BQVVESU9fSU9fUyB7Ci0JdW5zaWduZWQgY2hhciBpbnRfY3RybDsKLQl1bnNpZ25lZCBjaGFyIGNvbnRyb2w7Ci0KLQl1bnNpZ25lZCBjaGFyIGR1bW15MTsKLQl1bnNpZ25lZCBjaGFyIHN0YXJ0X2hpZ2g7Ci0JdW5zaWduZWQgY2hhciBkdW1teTI7Ci0JdW5zaWduZWQgY2hhciBzdGFydF9taWQ7Ci0JdW5zaWduZWQgY2hhciBkdW1teTM7Ci0JdW5zaWduZWQgY2hhciBzdGFydF9sb3c7Ci0KLQl1bnNpZ25lZCBjaGFyIGR1bW15NDsKLQl1bnNpZ25lZCBjaGFyIGN1cl9oaWdoOwotCXVuc2lnbmVkIGNoYXIgZHVtbXk1OwotCXVuc2lnbmVkIGNoYXIgY3VyX21pZDsKLQl1bnNpZ25lZCBjaGFyIGR1bW15NjsKLQl1bnNpZ25lZCBjaGFyIGN1cl9sb3c7Ci0KLQl1bnNpZ25lZCBjaGFyIGR1bW15NzsKLQl1bnNpZ25lZCBjaGFyIGVuZF9oaWdoOwotCXVuc2lnbmVkIGNoYXIgZHVtbXk4OwotCXVuc2lnbmVkIGNoYXIgZW5kX21pZDsKLQl1bnNpZ25lZCBjaGFyIGR1bW15OTsKLQl1bnNpZ25lZCBjaGFyIGVuZF9sb3c7Ci0KLQl1bnNpZ25lZCBjaGFyIGR1bW15MTBbMTJdOwotCi0JdW5zaWduZWQgY2hhciB0cmFja19jdHJsOyAvKiBDT0RFQyBvbmx5ICovCi0JdW5zaWduZWQgY2hhciBzb3VuZF9jdHJsOwotCXVuc2lnbmVkIHNob3J0IHNvdW5kX2RhdGE7Ci0JdW5zaWduZWQgc2hvcnQgc291bmRfbWFzazsKLQotCXVuc2lnbmVkIGNoYXIgZHVtbXkxMVsxMF07Ci0JCi0JdW5zaWduZWQgc2hvcnQgZGV2X2N0cmw7Ci0JdW5zaWduZWQgc2hvcnQgZGVzdF9jdHJsOwotCXVuc2lnbmVkIHNob3J0IHN5bmNfZGl2OwotCXVuc2lnbmVkIGNoYXIgdHJhY2tfcmVjOwotCXVuc2lnbmVkIGNoYXIgYWRkZXJpbl9pbnB1dDsKLQl1bnNpZ25lZCBjaGFyIGNoYW5uZWxfaW5wdXQ7Ci0JdW5zaWduZWQgY2hhciBjaGFubmVsX2FtcGxpZmljYXRpb247Ci0JdW5zaWduZWQgY2hhciBjaGFubmVsX3JlZHVjdGlvbjsKLQkKLQl1bnNpZ25lZCBjaGFyIGR1bW15MTJbNl07Ci0KLQl1bnNpZ25lZCBjaGFyIGRhdGFfZGlyZWN0aW9uOwotCXVuc2lnbmVkIGNoYXIgZHVtbXkxMzsKLQl1bnNpZ25lZCBjaGFyIGRldl9kYXRhOwotfTsKLSNkZWZpbmUgRE1BQVVESU9fSU8gKCgqKHZvbGF0aWxlIHN0cnVjdCBETUFBVURJT19JT19TICopRE1BQVVESU9fSU9fQkFTRSkpCi0KLSNlbmRpZiAvKiBfU0RMX21pbnRhdWRpb19kbWE4X2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX2dzeGIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX2dzeGIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmNzhjOS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19nc3hiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0JTWlOVCBhdWRpbyBkcml2ZXIKLQl1c2luZyBYQklPUyBmdW5jdGlvbnMgKEdTWEIgY29tcGF0aWJsZSBkcml2ZXIpCi0KLQlQYXRyaWNlIE1hbmRpbgotKi8KLQotLyogTWludCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+Ci0jaW5jbHVkZSA8bWludC9mYWxjb24uaD4KLSNpbmNsdWRlIDxtaW50L2Nvb2tpZS5oPgotCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKLQotI2luY2x1ZGUgIi4uLy4uL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaW14YWxsb2NfYy5oIgotCi0jaW5jbHVkZSAiU0RMX21pbnRhdWRpby5oIgotI2luY2x1ZGUgIlNETF9taW50YXVkaW9fZ3N4Yi5oIgotCi0vKi0tLSBEZWZpbmVzIC0tLSovCi0KLSNkZWZpbmUgTUlOVF9BVURJT19EUklWRVJfTkFNRSAibWludF9nc3hiIgotCi0vKiBEZWJ1ZyBwcmludCBpbmZvICovCi0jZGVmaW5lIERFQlVHX05BTUUgImF1ZGlvOmdzeGI6ICIKLSNpZiAwCi0jZGVmaW5lIERFQlVHX1BSSU5UKHdoYXQpIFwKLQl7IFwKLQkJcHJpbnRmIHdoYXQ7IFwKLQl9Ci0jZWxzZQotI2RlZmluZSBERUJVR19QUklOVCh3aGF0KQotI2VuZGlmCi0KLS8qLS0tIFN0YXRpYyB2YXJpYWJsZXMgLS0tKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY29va2llX3NuZCwgY29va2llX2dzeGI7Ci0KLS8qLS0tIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgLS0tKi8KLQotc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKTsKLXN0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgTWludF9Mb2NrQXVkaW8oX1RISVMpOwotc3RhdGljIHZvaWQgTWludF9VbmxvY2tBdWRpbyhfVEhJUyk7Ci0KLS8qIFRvIGNoZWNrL2luaXQgaGFyZHdhcmUgYXVkaW8gKi8KLXN0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIE1pbnRfSW5pdEF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLQotLyogR1NYQiBjYWxsYmFja3MgKi8KLXN0YXRpYyB2b2lkIE1pbnRfR3N4YkludGVycnVwdCh2b2lkKTsKLXN0YXRpYyB2b2lkIE1pbnRfR3N4Yk51bGxJbnRlcnJ1cHQodm9pZCk7Ci0KLS8qLS0tIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zIC0tLSovCi0KLXN0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCi17Ci0JY29uc3QgY2hhciAqZW52ciA9IFNETF9nZXRlbnYoIlNETF9BVURJT0RSSVZFUiIpOwotCi0JLyogQ2hlY2sgaWYgdXNlciBhc2tlZCBhIGRpZmZlcmVudCBhdWRpbyBkcml2ZXIgKi8KLQlpZiAoKGVudnIpICYmIChTRExfc3RyY21wKGVudnIsIE1JTlRfQVVESU9fRFJJVkVSX05BTUUpIT0wKSkgewotCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAidXNlciBhc2tlZCBhIGRpZmZlcmVudCBhdWRpbyBkcml2ZXJcbiIpKTsKLQkJcmV0dXJuKDApOwotCX0KLQotCS8qIENvb2tpZSBfU05EIHByZXNlbnQgPyBpZiBub3QsIGFzc3VtZSBTVCBtYWNoaW5lICovCi0JaWYgKEdldGNvb2tpZShDX19TTkQsICZjb29raWVfc25kKSA9PSBDX05PVEZPVU5EKSB7Ci0JCWNvb2tpZV9zbmQgPSBTTkRfUFNHOwotCX0KLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgMTYgYml0cyBhdWRpbyAqLwotCWlmICgoY29va2llX3NuZCAmIFNORF8xNkJJVCk9PTApIHsKLQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIm5vIDE2IGJpdHMgc291bmRcbiIpKTsKLQkgICAgcmV0dXJuKDApOwotCX0KLQotCS8qIENvb2tpZSBHU1hCIHByZXNlbnQgPyAqLwotCWNvb2tpZV9nc3hiID0gKEdldGNvb2tpZShDX0dTWEIsICZjb29raWVfZ3N4YikgPT0gQ19GT1VORCk7Ci0KLQkvKiBJcyBpdCBHU1hCID8gKi8KLQlpZiAoKChjb29raWVfc25kICYgU05EX0dTWEIpPT0wKSB8fCAoY29va2llX2dzeGI9PTApKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyBHU1hCIGF1ZGlvXG4iKSk7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBDaGVjayBpZiBhdWRpbyBpcyBsb2NrYWJsZSAqLwotCWlmIChMb2Nrc25kKCkhPTEpIHsKLQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImF1ZGlvIGxvY2tlZCBieSBvdGhlciBhcHBsaWNhdGlvblxuIikpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JVW5sb2Nrc25kKCk7Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiR1NYQiBhdWRpbyBhdmFpbGFibGUhXG4iKSk7Ci0JcmV0dXJuKDEpOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0gICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotICAgIFNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotICAgIGlmICggdGhpcyApIHsKLSAgICAgICAgU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0gICAgICAgIHRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKLSAgICAgICAgICAgICAgICBTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotICAgIH0KLSAgICBpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICBpZiAoIHRoaXMgKSB7Ci0gICAgICAgICAgICBTRExfZnJlZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQotICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgICB0aGlzLT5PcGVuQXVkaW8gICA9IE1pbnRfT3BlbkF1ZGlvOwotICAgIHRoaXMtPkNsb3NlQXVkaW8gID0gTWludF9DbG9zZUF1ZGlvOwotICAgIHRoaXMtPkxvY2tBdWRpbyAgID0gTWludF9Mb2NrQXVkaW87Ci0gICAgdGhpcy0+VW5sb2NrQXVkaW8gPSBNaW50X1VubG9ja0F1ZGlvOwotICAgIHRoaXMtPmZyZWUgICAgICAgID0gQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0gICAgcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIE1JTlRBVURJT19HU1hCX2Jvb3RzdHJhcCA9IHsKLQlNSU5UX0FVRElPX0RSSVZFUl9OQU1FLCAiTWlOVCBHU1hCIGF1ZGlvIGRyaXZlciIsCi0JQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KLXN0YXRpYyB2b2lkIE1pbnRfTG9ja0F1ZGlvKF9USElTKQotewotCS8qIFN0b3AgcmVwbGF5ICovCi0JQnVmZm9wZXIoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1pbnRfVW5sb2NrQXVkaW8oX1RISVMpCi17Ci0JLyogUmVzdGFydCByZXBsYXkgKi8KLQlCdWZmb3BlcihTQl9QTEFfRU5BfFNCX1BMQV9SUFQpOwotfQotCi1zdGF0aWMgdm9pZCBNaW50X0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0JLyogU3RvcCByZXBsYXkgKi8KLQlCdWZmb3BlcigwKTsKLQotCS8qIFVuaW5zdGFsbCBpbnRlcnJ1cHQgKi8KLQlpZiAoTlNldGludGVycnVwdCgyLCBTSV9OT05FLCBNaW50X0dzeGJOdWxsSW50ZXJydXB0KTwwKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJOU2V0aW50ZXJydXB0KCkgZmFpbGVkIGluIGNsb3NlXG4iKSk7Ci0JfQotCi0JLyogV2FpdCBpZiBjdXJyZW50bHkgcGxheWluZyBzb3VuZCAqLwotCXdoaWxlIChTRExfTWludEF1ZGlvX211dGV4ICE9IDApIHsKLQl9Ci0KLQkvKiBDbGVhciBidWZmZXJzICovCi0JaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pIHsKLQkJTWZyZWUoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSk7Ci0JCVNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gPSBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdID0gTlVMTDsKLQl9Ci0KLQkvKiBVbmxvY2sgc291bmQgc3lzdGVtICovCi0JVW5sb2Nrc25kKCk7Ci19Ci0KLXN0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQotewotCWxvbmcgc25kX2Zvcm1hdDsKLQlpbnQgaSwgcmVzb2x1dGlvbiwgZm9ybWF0X3NpZ25lZCwgZm9ybWF0X2JpZ2VuZGlhbjsKLSAgICBVaW50MTYgdGVzdF9mb3JtYXQgPSBTRExfRmlyc3RBdWRpb0Zvcm1hdChzcGVjLT5mb3JtYXQpOwotICAgIGludCB2YWxpZF9kYXRhdHlwZSA9IDA7Ci0KLQlyZXNvbHV0aW9uID0gc3BlYy0+Zm9ybWF0ICYgMHgwMGZmOwotCWZvcm1hdF9zaWduZWQgPSAoKHNwZWMtPmZvcm1hdCAmIDB4ODAwMCkhPTApOwotCWZvcm1hdF9iaWdlbmRpYW4gPSAoKHNwZWMtPmZvcm1hdCAmIDB4MTAwMCkhPTApOwotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImFza2VkOiAlZCBiaXRzLCAiLHNwZWMtPmZvcm1hdCAmIDB4MDBmZikpOwotCURFQlVHX1BSSU5UKCgic2lnbmVkPSVkLCAiLCAoKHNwZWMtPmZvcm1hdCAmIDB4ODAwMCkhPTApKSk7Ci0JREVCVUdfUFJJTlQoKCJiaWcgZW5kaWFuPSVkLCAiLCAoKHNwZWMtPmZvcm1hdCAmIDB4MTAwMCkhPTApKSk7Ci0JREVCVUdfUFJJTlQoKCJjaGFubmVscz0lZCwgIiwgc3BlYy0+Y2hhbm5lbHMpKTsKLQlERUJVR19QUklOVCgoImZyZXE9JWRcbiIsIHNwZWMtPmZyZXEpKTsKLQotICAgIGlmIChzcGVjLT5jaGFubmVscyA+IDIpIHsKLSAgICAgICAgc3BlYy0+Y2hhbm5lbHMgPSAyOyAgLyogbm8gbW9yZSB0aGFuIHN0ZXJlbyEgKi8KLSAgICB9Ci0KLSAgICB3aGlsZSAoKCF2YWxpZF9kYXRhdHlwZSkgJiYgKHRlc3RfZm9ybWF0KSkgewotICAgICAgICAvKiBDaGVjayBmb3JtYXRzIGF2YWlsYWJsZSAqLwotICAgICAgICBzbmRfZm9ybWF0ID0gU25kc3RhdHVzKFNORF9RVUVSWUZPUk1BVFMpOwotICAgICAgICBzcGVjLT5mb3JtYXQgPSB0ZXN0X2Zvcm1hdDsKLSAgICAgICAgcmVzb2x1dGlvbiA9IHNwZWMtPmZvcm1hdCAmIDB4ZmY7Ci0gICAgICAgIGZvcm1hdF9zaWduZWQgPSAoc3BlYy0+Zm9ybWF0ICYgKDE8PDE1KSk7Ci0gICAgICAgIGZvcm1hdF9iaWdlbmRpYW4gPSAoc3BlYy0+Zm9ybWF0ICYgKDE8PDEyKSk7Ci0gICAgICAgIHN3aXRjaCAodGVzdF9mb3JtYXQpIHsKLSAgICAgICAgICAgIGNhc2UgQVVESU9fVTg6Ci0gICAgICAgICAgICBjYXNlIEFVRElPX1M4OgotICAgICAgICAgICAgICAgIGlmIChzbmRfZm9ybWF0ICYgU05EX0ZPUk1BVDgpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRfZGF0YXR5cGUgPSAxOwotICAgICAgICAgICAgICAgICAgICBzbmRfZm9ybWF0ID0gU25kc3RhdHVzKFNORF9RVUVSWThCSVQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBBVURJT19VMTZMU0I6Ci0gICAgICAgICAgICBjYXNlIEFVRElPX1MxNkxTQjoKLSAgICAgICAgICAgIGNhc2UgQVVESU9fVTE2TVNCOgotICAgICAgICAgICAgY2FzZSBBVURJT19TMTZNU0I6Ci0gICAgICAgICAgICAgICAgaWYgKHNuZF9mb3JtYXQgJiBTTkRfRk9STUFUMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRfZGF0YXR5cGUgPSAxOwotICAgICAgICAgICAgICAgICAgICBzbmRfZm9ybWF0ID0gU25kc3RhdHVzKFNORF9RVUVSWTE2QklUKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGVzdF9mb3JtYXQgPSBTRExfTmV4dEF1ZGlvRm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXZhbGlkX2RhdGF0eXBlKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0Iik7Ci0gICAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLQotCS8qIENoZWNrIHNpZ25lZC91bnNpZ25lZCBmb3JtYXQgKi8KLQlpZiAoZm9ybWF0X3NpZ25lZCkgewotCQlpZiAoc25kX2Zvcm1hdCAmIFNORF9GT1JNQVRTSUdORUQpIHsKLQkJCS8qIE9rICovCi0JCX0gZWxzZSBpZiAoc25kX2Zvcm1hdCAmIFNORF9GT1JNQVRVTlNJR05FRCkgewotCQkJLyogR2l2ZSB1bnNpZ25lZCBmb3JtYXQgKi8KLQkJCXNwZWMtPmZvcm1hdCA9IHNwZWMtPmZvcm1hdCAmICh+MHg4MDAwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChzbmRfZm9ybWF0ICYgU05EX0ZPUk1BVFVOU0lHTkVEKSB7Ci0JCQkvKiBPayAqLwotCQl9IGVsc2UgaWYgKHNuZF9mb3JtYXQgJiBTTkRfRk9STUFUU0lHTkVEKSB7Ci0JCQkvKiBHaXZlIHNpZ25lZCBmb3JtYXQgKi8KLQkJCXNwZWMtPmZvcm1hdCB8PSAweDgwMDA7Ci0JCX0KLQl9Ci0KLQlpZiAoZm9ybWF0X2JpZ2VuZGlhbikgewotCQlpZiAoc25kX2Zvcm1hdCAmIFNORF9GT1JNQVRCSUdFTkRJQU4pIHsKLQkJCS8qIE9rICovCi0JCX0gZWxzZSBpZiAoc25kX2Zvcm1hdCAmIFNORF9GT1JNQVRMSVRUTEVFTkRJQU4pIHsKLQkJCS8qIEdpdmUgbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KLQkJCXNwZWMtPmZvcm1hdCA9IHNwZWMtPmZvcm1hdCAmICh+MHgxMDAwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChzbmRfZm9ybWF0ICYgU05EX0ZPUk1BVExJVFRMRUVORElBTikgewotCQkJLyogT2sgKi8KLQkJfSBlbHNlIGlmIChzbmRfZm9ybWF0ICYgU05EX0ZPUk1BVEJJR0VORElBTikgewotCQkJLyogR2l2ZSBiaWcgZW5kaWFuIGZvcm1hdCAqLwotCQkJc3BlYy0+Zm9ybWF0IHw9IDB4MTAwMDsKLQkJfQotCX0KLQkKLQkvKiBDYWxjdWxhdGUgYW5kIHNlbGVjdCB0aGUgY2xvc2VzdCBmcmVxdWVuY3kgKi8KLQlNSU5UQVVESU9fZnJlcWNvdW50PTA7Ci0JZm9yIChpPTE7aTw0O2krKykgewotCQlTRExfTWludEF1ZGlvX0FkZEZyZXF1ZW5jeSh0aGlzLAotCQkJTUFTVEVSQ0xPQ0tfNDRLLyhNQVNURVJQUkVESVZfTUlMQU4qKDE8PGkpKSwgTUFTVEVSQ0xPQ0tfNDRLLAotCQkJKDE8PGkpLTEsIC0xKTsKLQl9Ci0KLSNpZiAxCi0JZm9yIChpPTA7IGk8TUlOVEFVRElPX2ZyZXFjb3VudDsgaSsrKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJmcmVxICVkOiAlbHUgSHosIGNsb2NrICVsdSwgcHJlZGl2ICVkXG4iLAotCQkJaSwgTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW2ldLmZyZXF1ZW5jeSwgTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW2ldLm1hc3RlcmNsb2NrLAotCQkJTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW2ldLnByZWRpdmlzb3IKLQkJKSk7Ci0JfQotI2VuZGlmCi0KLQlNSU5UQVVESU9fbnVtZnJlcT1TRExfTWludEF1ZGlvX1NlYXJjaEZyZXF1ZW5jeSh0aGlzLCBzcGVjLT5mcmVxKTsKLQlzcGVjLT5mcmVxPU1JTlRBVURJT19mcmVxdWVuY2llc1tNSU5UQVVESU9fbnVtZnJlcV0uZnJlcXVlbmN5OwotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIm9idGFpbmVkOiAlZCBiaXRzLCAiLHNwZWMtPmZvcm1hdCAmIDB4MDBmZikpOwotCURFQlVHX1BSSU5UKCgic2lnbmVkPSVkLCAiLCAoKHNwZWMtPmZvcm1hdCAmIDB4ODAwMCkhPTApKSk7Ci0JREVCVUdfUFJJTlQoKCJiaWcgZW5kaWFuPSVkLCAiLCAoKHNwZWMtPmZvcm1hdCAmIDB4MTAwMCkhPTApKSk7Ci0JREVCVUdfUFJJTlQoKCJjaGFubmVscz0lZCwgIiwgc3BlYy0+Y2hhbm5lbHMpKTsKLQlERUJVR19QUklOVCgoImZyZXE9JWRcbiIsIHNwZWMtPmZyZXEpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBNaW50X0luaXRBdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQlpbnQgY2hhbm5lbHNfbW9kZSwgcHJlZGl2OwotCXZvaWQgKmJ1ZmZlcjsKLQotCS8qIFN0b3AgY3VycmVudGx5IHBsYXlpbmcgc291bmQgKi8KLQlCdWZmb3BlcigwKTsKLQotCS8qIFNldCByZXBsYXkgdHJhY2tzICovCi0JU2V0dHJhY2tzKDAsMCk7Ci0JU2V0bW9udHJhY2tzKDApOwotCi0JLyogU2VsZWN0IHJlcGxheSBmb3JtYXQgKi8KLQlzd2l0Y2ggKHNwZWMtPmZvcm1hdCAmIDB4ZmYpIHsKLQkJY2FzZSA4OgotCQkJaWYgKHNwZWMtPmNoYW5uZWxzPT0yKSB7Ci0JCQkJY2hhbm5lbHNfbW9kZT1TVEVSRU84OwotCQkJfSBlbHNlIHsKLQkJCQljaGFubmVsc19tb2RlPU1PTk84OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlpZiAoc3BlYy0+Y2hhbm5lbHM9PTIpIHsKLQkJCQljaGFubmVsc19tb2RlPVNURVJFTzE2OwotCQkJfSBlbHNlIHsKLQkJCQljaGFubmVsc19tb2RlPU1PTk8xNjsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJY2hhbm5lbHNfbW9kZT1TVEVSRU8xNjsKLQkJCWJyZWFrOwotCX0KLQlpZiAoU2V0bW9kZShjaGFubmVsc19tb2RlKTwwKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTZXRtb2RlKCkgZmFpbGVkXG4iKSk7Ci0JfQotCi0JcHJlZGl2ID0gTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5wcmVkaXZpc29yOwotCURldmNvbm5lY3QoRE1BUExBWSwgREFDLCBDTEtFWFQsIHByZWRpdiwgMSk7Ci0KLQkvKiBTZXQgYnVmZmVyICovCi0JYnVmZmVyID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZltTRExfTWludEF1ZGlvX251bWJ1Zl07Ci0JaWYgKFNldGJ1ZmZlcigwLCBidWZmZXIsIGJ1ZmZlciArIHNwZWMtPnNpemUpPDApIHsKLQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIlNldGJ1ZmZlcigpIGZhaWxlZFxuIikpOwotCX0KLQkKLQkvKiBJbnN0YWxsIGludGVycnVwdCAqLwotCWlmIChOU2V0aW50ZXJydXB0KDIsIFNJX1BMQVksIE1pbnRfR3N4YkludGVycnVwdCk8MCkgewotCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiTlNldGludGVycnVwdCgpIGZhaWxlZFxuIikpOwotCX0KLQotCS8qIEdvICovCi0JQnVmZm9wZXIoU0JfUExBX0VOQXxTQl9QTEFfUlBUKTsKLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiaGFyZHdhcmUgaW5pdGlhbGl6ZWRcbiIpKTsKLX0KLQotc3RhdGljIGludCBNaW50X09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQkvKiBMb2NrIHNvdW5kIHN5c3RlbSAqLwotCWlmIChMb2Nrc25kKCkhPTEpIHsKLSAgIAkgICAgU0RMX1NldEVycm9yKCJNaW50X09wZW5BdWRpbzogQXVkaW8gc3lzdGVtIGFscmVhZHkgaW4gdXNlIik7Ci0gICAgICAgIHJldHVybigtMSk7Ci0JfQotCi0JU0RMX01pbnRBdWRpb19kZXZpY2UgPSB0aGlzOwotCi0JLyogQ2hlY2sgYXVkaW8gY2FwYWJpbGl0aWVzICovCi0JaWYgKE1pbnRfQ2hlY2tBdWRpbyh0aGlzLCBzcGVjKT09LTEpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlcnMgaW4gRE1BLWFibGUgUkFNICovCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciBzaXplPSVkXG4iLCBzcGVjLT5zaXplKSk7Ci0KLQlTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdID0gQXRhcmlfU3lzTWFsbG9jKHNwZWMtPnNpemUgKjIsIE1YX1NUUkFNKTsKLQlpZiAoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXT09TlVMTCkgewotCQlTRExfU2V0RXJyb3IoIk1JTlRfT3BlbkF1ZGlvOiBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgYXVkaW8gYnVmZmVyIik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSArIHNwZWMtPnNpemUgOwotCVNETF9NaW50QXVkaW9fbnVtYnVmPTA7Ci0JU0RMX21lbXNldChTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplICoyKTsKLQlTRExfTWludEF1ZGlvX2F1ZGlvc2l6ZSA9IHNwZWMtPnNpemU7Ci0JU0RMX01pbnRBdWRpb19tdXRleCA9IDA7Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYnVmZmVyIDAgYXQgMHglMDh4XG4iLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKSk7Ci0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciAxIGF0IDB4JTA4eFxuIiwgU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSkpOwotCi0JU0RMX01pbnRBdWRpb19DaGVja0ZwdSgpOwotCi0JLyogU2V0dXAgYXVkaW8gaGFyZHdhcmUgKi8KLQlNaW50X0luaXRBdWRpbyh0aGlzLCBzcGVjKTsKLQotICAgIHJldHVybigxKTsJLyogV2UgZG9uJ3QgdXNlIHRocmVhZGVkIGF1ZGlvICovCi19Ci0KLXN0YXRpYyB2b2lkIE1pbnRfR3N4YkludGVycnVwdCh2b2lkKQotewotCVVpbnQ4ICpuZXdidWY7Ci0KLQlpZiAoU0RMX01pbnRBdWRpb19tdXRleCkKLQkJcmV0dXJuOwotCi0JU0RMX01pbnRBdWRpb19tdXRleD0xOwotCi0JU0RMX01pbnRBdWRpb19udW1idWYgXj0gMTsKLQlTRExfTWludEF1ZGlvX0NhbGxiYWNrKCk7Ci0JbmV3YnVmID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZltTRExfTWludEF1ZGlvX251bWJ1Zl07Ci0JU2V0YnVmZmVyKDAsIG5ld2J1ZiwgbmV3YnVmICsgU0RMX01pbnRBdWRpb19hdWRpb3NpemUpOwotCi0JU0RMX01pbnRBdWRpb19tdXRleD0wOwotfQotCi1zdGF0aWMgdm9pZCBNaW50X0dzeGJOdWxsSW50ZXJydXB0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19nc3hiLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19nc3hiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NWUzMTMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fZ3N4Yi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICogR1NYQiBhdWRpbyBkZWZpbml0aW9ucwotICogCi0gKiBQYXRyaWNlIE1hbmRpbgotICovCi0KLSNpZm5kZWYgX1NETF9taW50YXVkaW9fZ3N4Yl9oCi0jZGVmaW5lIF9TRExfbWludGF1ZGlvX2dzeGJfaAotCi0jaW5jbHVkZSA8bWludC9mYWxjb24uaD4JLyogZm9yIHRyYXBfMTRfeHh4IG1hY3JvcyAqLwotCi0vKiBHU1hCIENvb2tpZSAqLwotCi0jZGVmaW5lIENfR1NYQgkJMHg0NzUzNTg0MkwKLQotLyogQml0IDUgaW4gY29va2llIF9TTkQgKi8KLQotI2RlZmluZSBTTkRfR1NYQgkoMTw8NSkKLQotLyogTlNvdW5kY21kIG1vZGVzICovCi0KLSNkZWZpbmUgU0VUUkFURQkJCTcJLyogU2V0IHNhbXBsZSByYXRlICovCi0jZGVmaW5lIFNFVDhCSVRGT1JNQVQJOAkvKiA4IGJpdHMgZm9ybWF0ICovCi0jZGVmaW5lIFNFVDE2QklURk9STUFUCTkJLyogMTYgYml0cyBmb3JtYXQgKi8KLSNkZWZpbmUgU0VUMjRCSVRGT1JNQVQJMTAJLyogMjQgYml0cyBmb3JtYXQgKi8KLSNkZWZpbmUgU0VUMzJCSVRGT1JNQVQJMTEJLyogMzIgYml0cyBmb3JtYXQgKi8KLSNkZWZpbmUgTFRBVFRFTl9NQVNURVIJMTIJLyogQXR0ZW51YXRpb24gKi8KLSNkZWZpbmUgUlRBVFRFTl9NQVNURVIJMTMKLSNkZWZpbmUgTFRBVFRFTl9NSUNJTgkxNAotI2RlZmluZSBSVEFUVEVOX01JQ0lOCTE1Ci0jZGVmaW5lIExUQVRURU5fRk1HRU4JMTYKLSNkZWZpbmUgUlRBVFRFTl9GTUdFTgkxNwotI2RlZmluZSBMVEFUVEVOX0xJTkVJTgkxOAotI2RlZmluZSBSVEFUVEVOX0xJTkVJTgkxOQotI2RlZmluZSBMVEFUVEVOX0NESU4JMjAKLSNkZWZpbmUgUlRBVFRFTl9DRElOCTIxCi0jZGVmaW5lIExUQVRURU5fVklESU4JMjIKLSNkZWZpbmUgUlRBVFRFTl9WSURJTgkyMwotI2RlZmluZSBMVEFUVEVOX0FVWElOCTI0Ci0jZGVmaW5lIFJUQVRURU5fQVVYSU4JMjUKLQotLyogU2V0bW9kZSBtb2RlcyAqLwotCi0jZGVmaW5lIE1PTk8xNgkJMwotI2RlZmluZSBTVEVSRU8yNAk0Ci0jZGVmaW5lIFNURVJFTzMyCTUKLSNkZWZpbmUgTU9OTzI0CQk2Ci0jZGVmaW5lIE1PTk8zMgkJNwotCi0vKiBTbmRzdGF0dXMgbW9kZXMgKi8KLQotI2RlZmluZSBTTkRfUVVFUllGT1JNQVRTCTIKLSNkZWZpbmUgU05EX1FVRVJZTUlYRVJTCQkzCi0jZGVmaW5lIFNORF9RVUVSWVNPVVJDRVMJNAotI2RlZmluZSBTTkRfUVVFUllEVVBMRVgJCTUKLSNkZWZpbmUgU05EX1FVRVJZOEJJVAkJOAotI2RlZmluZSBTTkRfUVVFUlkxNkJJVAkJOQotI2RlZmluZSBTTkRfUVVFUlkyNEJJVAkJMTAKLSNkZWZpbmUgU05EX1FVRVJZMzJCSVQJCTExCi0KLSNkZWZpbmUgU05EX0ZPUk1BVDgJCSgxPDwwKQotI2RlZmluZSBTTkRfRk9STUFUMTYJKDE8PDEpCi0jZGVmaW5lIFNORF9GT1JNQVQyNAkoMTw8MikKLSNkZWZpbmUgU05EX0ZPUk1BVDMyCSgxPDwzKQotCi0jZGVmaW5lIFNORF9GT1JNQVRTSUdORUQJCSgxPDwwKQotI2RlZmluZSBTTkRfRk9STUFUVU5TSUdORUQJCSgxPDwxKQotI2RlZmluZSBTTkRfRk9STUFUQklHRU5ESUFOCQkoMTw8MikKLSNkZWZpbmUgU05EX0ZPUk1BVExJVFRMRUVORElBTgkoMTw8MykKLQotLyogRGV2Y29ubmVjdCBwcmVzY2FsZXJzICovCi0KLSNkZWZpbmUgQ0xLXzQ0SwkJMQotI2RlZmluZSBDTEtfMjJLCQkzCi0jZGVmaW5lIENMS18xMUsJCTcKLQotLyogRXh0cmEgeGJpb3MgZnVuY3Rpb25zICovCi0KLSNkZWZpbmUgTlNvdW5kY21kKG1vZGUsZGF0YSxkYXRhMikJXAotCShsb25nKXRyYXBfMTRfd3dsKChzaG9ydCkxMzAsKHNob3J0KShtb2RlKSwoc2hvcnQpKGRhdGEpLChsb25nKShkYXRhMikpCi0jZGVmaW5lIE5TZXRpbnRlcnJ1cHQoc3JjX2ludGVyLGNhdXNlLGludGhfYWRkcikJXAotCShsb25nKXRyYXBfMTRfd3d3bCgoc2hvcnQpMTM1LChzaG9ydCkoc3JjX2ludGVyKSwoc2hvcnQpKGNhdXNlKSwJXAotCQkobG9uZykoaW50aF9hZGRyKSkKLQotI2VuZGlmIC8qIF9TRExfbWludGF1ZGlvX2dzeGJfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9faXQuUyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX2l0LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NTFhNTkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9faXQuUworKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiAgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qCi0JQXVkaW8gaW50ZXJydXB0cwotCi0JUGF0cmljZSBNYW5kaW4sIERpZGllciBN6XF1aWdub24KLSAqLwotCi0JLnRleHQKLQotCS5nbG9ibAlfU0RMX01pbnRBdWRpb19DYWxsYmFjawotCi0JLmdsb2JsCV9TRExfTWludEF1ZGlvX1hiaW9zSW50ZXJydXB0Ci0JLmdsb2JsCV9TRExfTWludEF1ZGlvX1hiaW9zSW50ZXJydXB0TWVhc3VyZUNsb2NrCi0JLmdsb2JsCV9TRExfTWludEF1ZGlvX0RtYThJbnRlcnJ1cHQKLQkuZ2xvYmwJX1NETF9NaW50QXVkaW9fU3RmYUludGVycnVwdAotCi0JLmdsb2JsCV9TRExfTWludEF1ZGlvX211dGV4Ci0JLmdsb2JsCV9TRExfTWludEF1ZGlvX2F1ZGlvYnVmCi0JLmdsb2JsCV9TRExfTWludEF1ZGlvX251bWJ1ZgotCS5nbG9ibAlfU0RMX01pbnRBdWRpb19hdWRpb3NpemUKLQkuZ2xvYmwJX1NETF9NaW50QXVkaW9fY2xvY2t0aWNzCi0JLmdsb2JsCV9TRExfTWludEF1ZGlvX2hhc2ZwdQotCi0JLmdsb2JsCV9TRExfTWludEF1ZGlvX3N0ZmEKLQotLyoKLQlIb3cgaXQgd29ya3M6Ci0JLSBBdWRpbyBpcyBwbGF5aW5nIGJ1ZmZlciAjMCAocmVzcC4gIzEpCi0JLSBXZSBtdXN0IGNhbGN1bGF0ZSBhIHNhbXBsZSBpbiBidWZmZXIgIzEgKHJlc3AuICMwKQotCSAgc28gd2UgZmlyc3QgY2FsbCB0aGUgY2FsbGJhY2sgdG8gZG8gaXQKLQktIFRoZW4gd2Ugc3dhcCB0aGUgYnVmZmVycwotKi8KLQotI2RlZmluZQlzYXZwdHIJMHg0YTIKLSNkZWZpbmUJc2F2YW10CTB4NDYKLQotLyotLS0gWGJpb3MgaW50ZXJydXB0IHZlY3RvciB0byBtZWFzdXJlIEZhbGNvbiBleHRlcm5hbCBjbG9jayAtLS0qLwotCi1fU0RMX01pbnRBdWRpb19YYmlvc0ludGVycnVwdE1lYXN1cmVDbG9jazogICAgICAgICAgLyogMSBtUyAqLwotCi0JYnRzdAkjMCwweEZGRkY4OTAxOncJLyogc3RhdGUgRE1BIHNvdW5kICovCi0JYmVxcwlTRExfTWludEF1ZGlvX0VuZEludE1lYXN1cmUKLQlhZGRxbAkjMSxfU0RMX01pbnRBdWRpb19jbG9ja3RpY3MKLVNETF9NaW50QXVkaW9fRW5kSW50TWVhc3VyZToKLQliY2xyCSM1LDB4RkZGRkZBMEY6dwkvKiBDbGVhciBzZXJ2aWNlIGJpdCAqLwotCXJ0ZQotCi0vKi0tLSBYYmlvcyBpbnRlcnJ1cHQgdmVjdG9yIC0tLSovCi0KLV9TRExfTWludEF1ZGlvX1hiaW9zSW50ZXJydXB0OgotCi0JLyogUmVlbmFibGUgaW50ZXJydXB0cywgc28gb3RoZXIgaW50ZXJydXB0cyBjYW4gd29yayAqLwotCW1vdmV3CSMweDIzMDAsc3IKLQotCS8qIENsZWFyIHNlcnZpY2UgYml0LCBzbyBvdGhlciBNRlAgaW50ZXJydXB0cyBjYW4gd29yayAqLwotCWJjbHIJIzUsMHhmZmZmZmEwZjp3Ci0KLQkvKiBDaGVjayBpZiB3ZSBhcmUgbm90IGFscmVhZHkgcnVubmluZyAqLwotCXRzdHcJX1NETF9NaW50QXVkaW9fbXV0ZXgKLQlibmUJU0RMX01pbnRBdWRpb19YYmlvc0VuZAotCW5vdHcJX1NETF9NaW50QXVkaW9fbXV0ZXgKLQkKLQkvKiBTd2FwIGJ1ZmZlcnMgKi8KLQllb3J3CSMxLF9TRExfTWludEF1ZGlvX251bWJ1ZgotCi0JbW92ZW1sCWQwLWQ3L2EwLWE2LHNwQC0KLQotCS8qIFNhdmUgRlBVIGlmIG5lZWRlZCAqLwotCXRzdHcJX1NETF9NaW50QXVkaW9faGFzZnB1Ci0JYmVxcwlTRExfTWludEF1ZGlvX1hiaW9zX25vZnB1MQotCS5jaGlwCTY4MDYwCi0JZnNhdmUJc3BALQotCWZtb3ZlbWwgZnBjci9mcHNyL2ZwaWFyLHNwQC0KLQlmbW92ZW14CWZwMC1mcDcsc3BALQotCS5jaGlwCTY4MDAwCi1TRExfTWludEF1ZGlvX1hiaW9zX25vZnB1MToKLQotCS8qIENhbGxiYWNrICovCi0JanNyCV9TRExfTWludEF1ZGlvX0NhbGxiYWNrCi0KLQkvKiBSZXN0b3JlIEZQVSBpZiBuZWVkZWQgKi8KLQl0c3R3CV9TRExfTWludEF1ZGlvX2hhc2ZwdQotCWJlcXMJU0RMX01pbnRBdWRpb19YYmlvc19ub2ZwdTIKLQkuY2hpcAk2ODA2MAotCWZtb3ZlbXgJc3BAKyxmcDAtZnA3Ci0JZm1vdmVtbAlzcEArLGZwY3IvZnBzci9mcGlhcgotCWZyZXN0b3JlCXNwQCsKLQkuY2hpcAk2ODAwMAotU0RMX01pbnRBdWRpb19YYmlvc19ub2ZwdTI6Ci0KLQkvKiBSZXNlcnZlIHNwYWNlIGZvciByZWdpc3RlcnMgKi8KLQlzdWJsCSNzYXZhbXQsc2F2cHRyCi0KLQkvKiBTZXQgbmV3IGJ1ZmZlciAqLwotCi0JbW92ZXEJIzAsZDAKLQltb3ZlbAlfU0RMX01pbnRBdWRpb19hdWRpb3NpemUsZDEKLQotCW1vdmV3CV9TRExfTWludEF1ZGlvX251bWJ1ZixkMAotCWxzbGwJIzIsZDAKLQlsZWEJX1NETF9NaW50QXVkaW9fYXVkaW9idWYsYTAKLQltb3ZlbAlhMEAoZDA6bCksYTEKLQotCWxlYQlhMUAoZDE6bCksYTIKLQotCW1vdmVsCWEyLHNwQC0KLQltb3ZlbAlhMSxzcEAtCi0JY2xydwlzcEAtCi0JbW92ZXcJIzEzMSxzcEAtCi0JdHJhcAkjMTQKLQlsZWEJc3BAKDEyKSxzcAotCi0JLyogUmVzdG9yZSByZWdpc3RlcnMgc3BhY2UgKi8KLQlhZGRsCSNzYXZhbXQsc2F2cHRyCi0KLQltb3ZlbWwJc3BAKyxkMC1kNy9hMC1hNgotCi0JY2xydwlfU0RMX01pbnRBdWRpb19tdXRleAotU0RMX01pbnRBdWRpb19YYmlvc0VuZDoKLQlydGUKLQotLyotLS0gRE1BIDggYml0cyBpbnRlcnJ1cHQgdmVjdG9yIC0tLSovCi0KLV9TRExfTWludEF1ZGlvX0RtYThJbnRlcnJ1cHQ6Ci0KLQkvKiBSZWVuYWJsZSBpbnRlcnJ1cHRzLCBzbyBvdGhlciBpbnRlcnJ1cHRzIGNhbiB3b3JrICovCi0JbW92ZXcJIzB4MjMwMCxzcgotCi0JLyogQ2xlYXIgc2VydmljZSBiaXQsIHNvIG90aGVyIE1GUCBpbnRlcnJ1cHRzIGNhbiB3b3JrICovCi0JYmNscgkjNSwweGZmZmZmYTBmOncKLQotCS8qIENoZWNrIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBydW5uaW5nICovCi0JdHN0dwlfU0RMX01pbnRBdWRpb19tdXRleAotCWJuZQlTRExfTWludEF1ZGlvX0RtYThFbmQKLQlub3R3CV9TRExfTWludEF1ZGlvX211dGV4Ci0JCi0JLyogU3dhcCBidWZmZXJzICovCi0JZW9ydwkjMSxfU0RMX01pbnRBdWRpb19udW1idWYKLQotCW1vdmVtbAlkMC1kMS9hMC1hMSxzcEAtCi0KLQkvKiBTYXZlIEZQVSBpZiBuZWVkZWQgKi8KLQl0c3R3CV9TRExfTWludEF1ZGlvX2hhc2ZwdQotCWJlcXMJU0RMX01pbnRBdWRpb19EbWE4X25vZnB1MQotCS5jaGlwCTY4MDYwCi0JZnNhdmUJc3BALQotCWZtb3ZlbWwgZnBjci9mcHNyL2ZwaWFyLHNwQC0KLQlmbW92ZW14CWZwMC1mcDcsc3BALQotCS5jaGlwCTY4MDAwCi1TRExfTWludEF1ZGlvX0RtYThfbm9mcHUxOgotCi0JLyogQ2FsbGJhY2sgKi8KLQlqc3IJX1NETF9NaW50QXVkaW9fQ2FsbGJhY2sKLQotCS8qIFJlc3RvcmUgRlBVIGlmIG5lZWRlZCAqLwotCXRzdHcJX1NETF9NaW50QXVkaW9faGFzZnB1Ci0JYmVxcwlTRExfTWludEF1ZGlvX0RtYThfbm9mcHUyCi0JLmNoaXAJNjgwNjAKLQlmbW92ZW14CXNwQCssZnAwLWZwNwotCWZtb3ZlbWwJc3BAKyxmcGNyL2Zwc3IvZnBpYXIKLQlmcmVzdG9yZQlzcEArCi0JLmNoaXAJNjgwMDAKLVNETF9NaW50QXVkaW9fRG1hOF9ub2ZwdTI6Ci0KLQkvKiBTZXQgbmV3IGJ1ZmZlciAqLwotCi0JbW92ZXEJIzAsZDAKLQotCW1vdmV3CV9TRExfTWludEF1ZGlvX251bWJ1ZixkMAotCWxzbHcJIzIsZDAKLQlsZWEJX1NETF9NaW50QXVkaW9fYXVkaW9idWYsYTAKLQltb3ZlbAlhMEAoZDA6dyksZDEKLQotCS8qIE1vZGlmeSBETUEgYWRkcmVzc2VzICovCi0JbGVhCTB4ZmZmZjg5MDA6dyxhMAotCi0JbW92ZWIJZDEsYTBAKDB4MDcpCS8qIFN0YXJ0IGFkZHJlc3MgKi8KLQlyb3JsCSM4LGQxCi0JbW92ZWIJZDEsYTBAKDB4MDUpCi0Jcm9ybAkjOCxkMQotCW1vdmViCWQxLGEwQCgweDAzKQotCXN3YXAJZDEKLQotCWFkZGwJX1NETF9NaW50QXVkaW9fYXVkaW9zaXplLGQxCi0KLQltb3ZlYglkMSxhMEAoMHgxMykJLyogRW5kIGFkZHJlc3MgKi8KLQlyb3JsCSM4LGQxCi0JbW92ZWIJZDEsYTBAKDB4MTEpCi0Jcm9ybAkjOCxkMQotCW1vdmViCWQxLGEwQCgweDBmKQotCi0JbW92ZW1sCXNwQCssZDAtZDEvYTAtYTEKLQotCWNscncJX1NETF9NaW50QXVkaW9fbXV0ZXgKLVNETF9NaW50QXVkaW9fRG1hOEVuZDoKLQlydGUKLQotLyotLS0gU1RGQSBpbnRlcnJ1cHQgdmVjdG9yIC0tLSovCi0KLVNURkFfU09VTkRfU1RBUlQJPQk2Ci1TVEZBX1NPVU5EX0VORAkJPQlTVEZBX1NPVU5EX1NUQVJUKzgKLQotX1NETF9NaW50QXVkaW9fU3RmYUludGVycnVwdDoKLQotCS8qIFJlZW5hYmxlIGludGVycnVwdHMsIHNvIG90aGVyIGludGVycnVwdHMgY2FuIHdvcmsgKi8KLQltb3ZldwkjMHgyMzAwLHNyCi0KLQkvKiBDaGVjayBpZiB3ZSBhcmUgbm90IGFscmVhZHkgcnVubmluZyAqLwotCXRzdHcJX1NETF9NaW50QXVkaW9fbXV0ZXgKLQlibmVzCVNETF9NaW50QXVkaW9fU3RmYUVuZAotCW5vdHcJX1NETF9NaW50QXVkaW9fbXV0ZXgKLQkKLQkvKiBTd2FwIGJ1ZmZlcnMgKi8KLQllb3J3CSMxLF9TRExfTWludEF1ZGlvX251bWJ1ZgotCi0JbW92ZW1sCWQwLWQ3L2EwLWE2LHNwQC0KLQotCS8qIFNhdmUgRlBVIGlmIG5lZWRlZCAqLwotCXRzdHcJX1NETF9NaW50QXVkaW9faGFzZnB1Ci0JYmVxcwlTRExfTWludEF1ZGlvX1N0ZmFfbm9mcHUxCi0JLmNoaXAJNjgwNjAKLQlmc2F2ZQlzcEAtCi0JZm1vdmVtbCBmcGNyL2Zwc3IvZnBpYXIsc3BALQotCWZtb3ZlbXgJZnAwLWZwNyxzcEAtCi0JLmNoaXAJNjgwMDAKLVNETF9NaW50QXVkaW9fU3RmYV9ub2ZwdTE6Ci0KLQkvKiBDYWxsYmFjayAqLwotCWpzcglfU0RMX01pbnRBdWRpb19DYWxsYmFjawotCi0JLyogUmVzdG9yZSBGUFUgaWYgbmVlZGVkICovCi0JdHN0dwlfU0RMX01pbnRBdWRpb19oYXNmcHUKLQliZXFzCVNETF9NaW50QXVkaW9fU3RmYV9ub2ZwdTIKLQkuY2hpcAk2ODA2MAotCWZtb3ZlbXgJc3BAKyxmcDAtZnA3Ci0JZm1vdmVtbAlzcEArLGZwY3IvZnBzci9mcGlhcgotCWZyZXN0b3JlCXNwQCsKLQkuY2hpcAk2ODAwMAotU0RMX01pbnRBdWRpb19TdGZhX25vZnB1MjoKLQotCS8qIFNldCBuZXcgYnVmZmVyICovCi0KLQltb3ZlcQkjMCxkMAotCW1vdmVsCV9TRExfTWludEF1ZGlvX3N0ZmEsYTEKLQotCW1vdmV3CV9TRExfTWludEF1ZGlvX251bWJ1ZixkMAotCWxzbHcJIzIsZDAKLQlsZWEJX1NETF9NaW50QXVkaW9fYXVkaW9idWYsYTAKLQltb3ZlbAlhMEAoZDA6dyksZDEKLQotCS8qIE1vZGlmeSBTVEZBIHJlcGxheSBidWZmZXJzICovCi0JbW92ZWwJZDEsYTFAKFNURkFfU09VTkRfU1RBUlQpCi0JYWRkbAlfU0RMX01pbnRBdWRpb19hdWRpb3NpemUsZDEKLQltb3ZlbAlkMSxhMUAoU1RGQV9TT1VORF9FTkQpCi0KLQltb3ZlbWwJc3BAKyxkMC1kNy9hMC1hNgotCi0JY2xydwlfU0RMX01pbnRBdWRpb19tdXRleAotU0RMX01pbnRBdWRpb19TdGZhRW5kOgotCXJ0ZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fbWNzbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fbWNzbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDY0MTg0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX21jc24uYworKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLQlNaU5UIGF1ZGlvIGRyaXZlcgotCXVzaW5nIFhCSU9TIGZ1bmN0aW9ucyAoTWFjU291bmQgY29tcGF0aWJsZSBkcml2ZXIpCi0KLQlQYXRyaWNlIE1hbmRpbgotKi8KLQotI2luY2x1ZGUgPHN1cHBvcnQuaD4KLQotLyogTWludCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+Ci0jaW5jbHVkZSA8bWludC9mYWxjb24uaD4KLSNpbmNsdWRlIDxtaW50L2Nvb2tpZS5oPgotCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKLQotI2luY2x1ZGUgIi4uLy4uL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaW14YWxsb2NfYy5oIgotCi0jaW5jbHVkZSAiU0RMX21pbnRhdWRpby5oIgotI2luY2x1ZGUgIlNETF9taW50YXVkaW9fbWNzbi5oIgotCi0vKi0tLSBEZWZpbmVzIC0tLSovCi0KLSNkZWZpbmUgTUlOVF9BVURJT19EUklWRVJfTkFNRSAibWludF9tY3NuIgotCi0vKiBEZWJ1ZyBwcmludCBpbmZvICovCi0jZGVmaW5lIERFQlVHX05BTUUgImF1ZGlvOm1jc246ICIKLSNpZiAwCi0jZGVmaW5lIERFQlVHX1BSSU5UKHdoYXQpIFwKLQl7IFwKLQkJcHJpbnRmIHdoYXQ7IFwKLQl9Ci0jZWxzZQotI2RlZmluZSBERUJVR19QUklOVCh3aGF0KQotI2VuZGlmCi0KLS8qLS0tIFN0YXRpYyB2YXJpYWJsZXMgLS0tKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY29va2llX3NuZCwgY29va2llX21jaDsKLXN0YXRpYyBjb29raWVfbWNzbl90ICpjb29raWVfbWNzbjsKLQotLyotLS0gQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAtLS0qLwotCi1zdGF0aWMgdm9pZCBNaW50X0Nsb3NlQXVkaW8oX1RISVMpOwotc3RhdGljIGludCBNaW50X09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7Ci1zdGF0aWMgdm9pZCBNaW50X0xvY2tBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgdm9pZCBNaW50X1VubG9ja0F1ZGlvKF9USElTKTsKLQotLyogVG8gY2hlY2svaW5pdCBoYXJkd2FyZSBhdWRpbyAqLwotc3RhdGljIGludCBNaW50X0NoZWNrQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgTWludF9Jbml0QXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotCi0vKi0tLSBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAtLS0qLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JY29uc3QgY2hhciAqZW52ciA9IFNETF9nZXRlbnYoIlNETF9BVURJT0RSSVZFUiIpOwotCi0JU0RMX01pbnRBdWRpb19taW50X3ByZXNlbnQgPSAoR2V0Y29va2llKENfTWlOVCwgJmR1bW15KSA9PSBDX0ZPVU5EKTsKLQotCS8qIFdlIGNhbid0IHVzZSBYQklPUyBpbiBpbnRlcnJ1cHQgd2l0aCBNYWdpYywgZG9uJ3Qga25vdyBhYm91dCB0aHJlYWQgKi8KLQlpZiAoR2V0Y29va2llKENfTWFnWCwgJmR1bW15KSA9PSBDX0ZPVU5EKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBDaGVjayBpZiB1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlciAqLwotCWlmICgoZW52cikgJiYgKFNETF9zdHJjbXAoZW52ciwgTUlOVF9BVURJT19EUklWRVJfTkFNRSkhPTApKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJ1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlclxuIikpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyogQ29va2llIF9NQ0ggcHJlc2VudCA/IGlmIG5vdCwgYXNzdW1lIFNUIG1hY2hpbmUgKi8KLQlpZiAoR2V0Y29va2llKENfX01DSCwgJmNvb2tpZV9tY2gpID09IENfTk9URk9VTkQpIHsKLQkJY29va2llX21jaCA9IE1DSF9TVDsKLQl9Ci0KLQkvKiBDb29raWUgX1NORCBwcmVzZW50ID8gaWYgbm90LCBhc3N1bWUgU1QgbWFjaGluZSAqLwotCWlmIChHZXRjb29raWUoQ19fU05ELCAmY29va2llX3NuZCkgPT0gQ19OT1RGT1VORCkgewotCQljb29raWVfc25kID0gU05EX1BTRzsKLQl9Ci0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIDE2IGJpdHMgYXVkaW8gKi8KLQlpZiAoKGNvb2tpZV9zbmQgJiBTTkRfMTZCSVQpPT0wKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyAxNiBiaXRzIHNvdW5kXG4iKSk7Ci0JICAgIHJldHVybigwKTsKLQl9Ci0KLQkvKiBDb29raWUgTUNTTiBwcmVzZW50ID8gKi8KLQlpZiAoR2V0Y29va2llKENfTWNTbiwgKGxvbmcgKikgJmNvb2tpZV9tY3NuKSAhPSBDX0ZPVU5EKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyBNQ1NOIGF1ZGlvXG4iKSk7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBDaGVjayBpZiBpbnRlcnJ1cHQgYXQgZW5kIG9mIHJlcGxheSAqLwotCWlmIChjb29raWVfbWNzbi0+cGludCA9PSAwKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyBpbnRlcnJ1cHQgYXQgZW5kIG9mIHJlcGxheVxuIikpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyogQ2hlY2sgaWYgYXVkaW8gaXMgbG9ja2FibGUgKi8KLQlpZiAoTG9ja3NuZCgpIT0xKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJhdWRpbyBsb2NrZWQgYnkgb3RoZXIgYXBwbGljYXRpb25cbiIpKTsKLQkJcmV0dXJuKDApOwotCX0KLQotCVVubG9ja3NuZCgpOwotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIk1DU04gYXVkaW8gYXZhaWxhYmxlIVxuIikpOwotCXJldHVybigxKTsKLX0KLQotc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotICAgIFNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLSAgICBTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9BdWRpb0RldmljZSAqdGhpczsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLSAgICBpZiAoIHRoaXMgKSB7Ci0gICAgICAgIFNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOwotICAgICAgICB0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0gICAgICAgICAgICAgICAgU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLSAgICB9Ci0gICAgaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgaWYgKCB0aGlzICkgewotICAgICAgICAgICAgU0RMX2ZyZWUodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLSAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0KLSAgICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0gICAgdGhpcy0+T3BlbkF1ZGlvICAgPSBNaW50X09wZW5BdWRpbzsKLSAgICB0aGlzLT5DbG9zZUF1ZGlvICA9IE1pbnRfQ2xvc2VBdWRpbzsKLSAgICB0aGlzLT5Mb2NrQXVkaW8gICA9IE1pbnRfTG9ja0F1ZGlvOwotICAgIHRoaXMtPlVubG9ja0F1ZGlvID0gTWludF9VbmxvY2tBdWRpbzsKLSAgICB0aGlzLT5mcmVlICAgICAgICA9IEF1ZGlvX0RlbGV0ZURldmljZTsKLQotICAgIHJldHVybiB0aGlzOwotfQotCi1BdWRpb0Jvb3RTdHJhcCBNSU5UQVVESU9fTUNTTl9ib290c3RyYXAgPSB7Ci0JTUlOVF9BVURJT19EUklWRVJfTkFNRSwgIk1pTlQgTUNTTiBhdWRpbyBkcml2ZXIiLAotCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCi19OwotCi1zdGF0aWMgdm9pZCBNaW50X0xvY2tBdWRpbyhfVEhJUykKLXsKLQkvKiBTdG9wIHJlcGxheSAqLwotCUJ1ZmZvcGVyKDApOwotfQotCi1zdGF0aWMgdm9pZCBNaW50X1VubG9ja0F1ZGlvKF9USElTKQotewotCS8qIFJlc3RhcnQgcmVwbGF5ICovCi0JQnVmZm9wZXIoU0JfUExBX0VOQXxTQl9QTEFfUlBUKTsKLX0KLQotc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKQotewotCS8qIFN0b3AgcmVwbGF5ICovCi0JU0RMX01pbnRBdWRpb19XYWl0VGhyZWFkKCk7Ci0JQnVmZm9wZXIoMCk7Ci0KLQlpZiAoIVNETF9NaW50QXVkaW9fbWludF9wcmVzZW50KSB7Ci0JCS8qIFVuaW5zdGFsbCBpbnRlcnJ1cHQgKi8KLQkJSmRpc2ludChNRlBfRE1BU09VTkQpOwotCX0KLQotCS8qIFdhaXQgaWYgY3VycmVudGx5IHBsYXlpbmcgc291bmQgKi8KLQl3aGlsZSAoU0RMX01pbnRBdWRpb19tdXRleCAhPSAwKSB7Ci0JfQotCi0JLyogQ2xlYXIgYnVmZmVycyAqLwotCWlmIChTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKSB7Ci0JCU1mcmVlKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pOwotCQlTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IE5VTEw7Ci0JfQotCi0JLyogVW5sb2NrIHNvdW5kIHN5c3RlbSAqLwotCVVubG9ja3NuZCgpOwotfQotCi1zdGF0aWMgaW50IE1pbnRfQ2hlY2tBdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIG1hc3RlcmNsb2NrLCBtYXN0ZXJwcmVkaXY7Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYXNrZWQ6ICVkIGJpdHMsICIsc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKSk7Ci0JREVCVUdfUFJJTlQoKCJzaWduZWQ9JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHg4MDAwKSE9MCkpKTsKLQlERUJVR19QUklOVCgoImJpZyBlbmRpYW49JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHgxMDAwKSE9MCkpKTsKLQlERUJVR19QUklOVCgoImNoYW5uZWxzPSVkLCAiLCBzcGVjLT5jaGFubmVscykpOwotCURFQlVHX1BSSU5UKCgiZnJlcT0lZFxuIiwgc3BlYy0+ZnJlcSkpOwotCi0gICAgaWYgKHNwZWMtPmNoYW5uZWxzID4gMikgewotICAgICAgICBzcGVjLT5jaGFubmVscyA9IDI7ICAvKiBubyBtb3JlIHRoYW4gc3RlcmVvISAqLwotICAgIH0KLQotCS8qIENoZWNrIGZvcm1hdHMgYXZhaWxhYmxlICovCi0JTUlOVEFVRElPX2ZyZXFjb3VudD0wOwotCXN3aXRjaChjb29raWVfbWNzbi0+cGxheSkgewotCQljYXNlIE1DU05fU1Q6Ci0JCQlzcGVjLT5jaGFubmVscz0xOwotCQkJc3BlYy0+Zm9ybWF0PTg7IC8qIEZJWE1FOiBpcyBpdCBzaWduZWQgb3IgdW5zaWduZWQgPyAqLwotCQkJU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3kodGhpcywgMTI1MDAsIDAsIDAsIC0xKTsKLQkJCWJyZWFrOwotCQljYXNlIE1DU05fVFQ6CS8qIEFsc28gU1RFLCBNZWdhIFNURSAqLwotCQkJc3BlYy0+Zm9ybWF0PUFVRElPX1M4OwotCQkJbWFzdGVyY2xvY2s9TUFTVEVSQ0xPQ0tfU1RFOwotCQkJbWFzdGVycHJlZGl2PU1BU1RFUlBSRURJVl9TVEU7Ci0JCQlpZiAoKGNvb2tpZV9tY2g+PjE2KT09TUNIX1RUKSB7Ci0JCQkJbWFzdGVyY2xvY2s9TUFTVEVSQ0xPQ0tfVFQ7Ci0JCQkJbWFzdGVycHJlZGl2PU1BU1RFUlBSRURJVl9UVDsKLQkJCX0KLQkJCWZvciAoaT0wOyBpPDQ7IGkrKykgewotCQkJCVNETF9NaW50QXVkaW9fQWRkRnJlcXVlbmN5KHRoaXMsIG1hc3RlcmNsb2NrLyhtYXN0ZXJwcmVkaXYqKDE8PGkpKSwKLQkJCQkJbWFzdGVyY2xvY2ssIDMtaSwgLTEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTUNTTl9GQUxDT046CS8qIEFsc28gTWFjICovCi0JCQlmb3IgKGk9MTsgaTwxMjsgaSsrKSB7Ci0JCQkJLyogUmVtb3ZlIHVudXNhYmxlIEZhbGNvbiBjb2RlYyBwcmVkaXZpc29ycyAqLwotCQkJCWlmICgoaT09NikgfHwgKGk9PTgpIHx8IChpPT0xMCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVNETF9NaW50QXVkaW9fQWRkRnJlcXVlbmN5KHRoaXMsIE1BU1RFUkNMT0NLX0ZBTENPTjEvKE1BU1RFUlBSRURJVl9GQUxDT04qKGkrMSkpLAotCQkJCQlDTEsyNU0sIGkrMSwgLTEpOwotCQkJfQotCQkJaWYgKGNvb2tpZV9tY3NuLT5yZXMxICE9IDApIHsKLQkJCQlmb3IgKGk9MTsgaTw0OyBpKyspIHsKLQkJCQkJU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3kodGhpcywgKGNvb2tpZV9tY3NuLT5yZXMxKS8oTUFTVEVSUFJFRElWX0ZBTENPTiooMTw8aSkpLAotCQkJCQkJQ0xLRVhULCAoMTw8aSktMSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJCXNwZWMtPmZvcm1hdCB8PSAweDgwMDA7CS8qIEF1ZGlvIGlzIGFsd2F5cyBzaWduZWQgKi8KLQkJCWlmICgoc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKT09MTYpIHsKLQkJCQlzcGVjLT5mb3JtYXQgfD0gMHgxMDAwOwkvKiBBdWRpbyBpcyBhbHdheXMgYmlnIGVuZGlhbiAqLwotCQkJCXNwZWMtPmNoYW5uZWxzPTI7CS8qIDE2IGJpdHMgYWx3YXlzIHN0ZXJlbyAqLwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0jaWYgMQotCWZvciAoaT0wOyBpPE1JTlRBVURJT19mcmVxY291bnQ7IGkrKykgewotCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiZnJlcSAlZDogJWx1IEh6LCBjbG9jayAlbHUsIHByZWRpdiAlZFxuIiwKLQkJCWksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5mcmVxdWVuY3ksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5tYXN0ZXJjbG9jaywKLQkJCU1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5wcmVkaXZpc29yCi0JCSkpOwotCX0KLSNlbmRpZgotCi0JTUlOVEFVRElPX251bWZyZXE9U0RMX01pbnRBdWRpb19TZWFyY2hGcmVxdWVuY3kodGhpcywgc3BlYy0+ZnJlcSk7Ci0Jc3BlYy0+ZnJlcT1NSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLmZyZXF1ZW5jeTsKLQotCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJvYnRhaW5lZDogJWQgYml0cywgIixzcGVjLT5mb3JtYXQgJiAweDAwZmYpKTsKLQlERUJVR19QUklOVCgoInNpZ25lZD0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKSkpOwotCURFQlVHX1BSSU5UKCgiYmlnIGVuZGlhbj0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKSkpOwotCURFQlVHX1BSSU5UKCgiY2hhbm5lbHM9JWQsICIsIHNwZWMtPmNoYW5uZWxzKSk7Ci0JREVCVUdfUFJJTlQoKCJmcmVxPSVkXG4iLCBzcGVjLT5mcmVxKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgTWludF9Jbml0QXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JaW50IGNoYW5uZWxzX21vZGUsIHByZWRpdiwgZG1hY2xvY2s7Ci0Jdm9pZCAqYnVmZmVyOwotCi0JLyogU3RvcCBjdXJyZW50bHkgcGxheWluZyBzb3VuZCAqLwotCVNETF9NaW50QXVkaW9fcXVpdF90aHJlYWQgPSBTRExfRkFMU0U7Ci0JU0RMX01pbnRBdWRpb190aHJlYWRfZmluaXNoZWQgPSBTRExfVFJVRTsKLQlTRExfTWludEF1ZGlvX1dhaXRUaHJlYWQoKTsKLQlCdWZmb3BlcigwKTsKLQotCS8qIFNldCByZXBsYXkgdHJhY2tzICovCi0JU2V0dHJhY2tzKDAsMCk7Ci0JU2V0bW9udHJhY2tzKDApOwotCi0JLyogU2VsZWN0IHJlcGxheSBmb3JtYXQgKi8KLQljaGFubmVsc19tb2RlPVNURVJFTzE2OwotCXN3aXRjaCAoc3BlYy0+Zm9ybWF0ICYgMHhmZikgewotCQljYXNlIDg6Ci0JCQlpZiAoc3BlYy0+Y2hhbm5lbHM9PTIpIHsKLQkJCQljaGFubmVsc19tb2RlPVNURVJFTzg7Ci0JCQl9IGVsc2UgewotCQkJCWNoYW5uZWxzX21vZGU9TU9OTzg7Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci0JaWYgKFNldG1vZGUoY2hhbm5lbHNfbW9kZSk8MCkgewotCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiU2V0bW9kZSgpIGZhaWxlZFxuIikpOwotCX0KLQotCWRtYWNsb2NrID0gTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5tYXN0ZXJjbG9jazsKLQlwcmVkaXYgPSBNSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLnByZWRpdmlzb3I7Ci0Jc3dpdGNoKGNvb2tpZV9tY3NuLT5wbGF5KSB7Ci0JCWNhc2UgTUNTTl9UVDoKLQkJCURldmNvbm5lY3QoRE1BUExBWSwgREFDLCBDTEsyNU0sIENMS09MRCwgMSk7Ci0JCQlTb3VuZGNtZChTRVRQUkVTQ0FMRSwgcHJlZGl2KTsKLQkJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTVEUvVFQgcHJlc2NhbGVyIHNlbGVjdGVkXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ1NOX0ZBTENPTjoKLQkJCURldmNvbm5lY3QoRE1BUExBWSwgREFDLCBkbWFjbG9jaywgcHJlZGl2LCAxKTsKLQkJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJGYWxjb24gcHJlc2NhbGVyIHNlbGVjdGVkXG4iKSk7Ci0JCQlicmVhazsKLQl9Ci0KLQkvKiBTZXQgYnVmZmVyICovCi0JYnVmZmVyID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZltTRExfTWludEF1ZGlvX251bWJ1Zl07Ci0JaWYgKFNldGJ1ZmZlcigwLCBidWZmZXIsIGJ1ZmZlciArIHNwZWMtPnNpemUpPDApIHsKLQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIlNldGJ1ZmZlcigpIGZhaWxlZFxuIikpOwotCX0KLQkKLQlpZiAoU0RMX01pbnRBdWRpb19taW50X3ByZXNlbnQpIHsKLQkJU0RMX01pbnRBdWRpb190aHJlYWRfcGlkID0gdGZvcmsoU0RMX01pbnRBdWRpb19UaHJlYWQsIDApOwotCX0gZWxzZSB7Ci0JCS8qIEluc3RhbGwgaW50ZXJydXB0ICovCi0JCUpkaXNpbnQoTUZQX0RNQVNPVU5EKTsKLQkJWGJ0aW1lcihYQl9USU1FUkEsIDgsIDEsIFNETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHQpOwotCQlKZW5hYmludChNRlBfRE1BU09VTkQpOwotCi0JCWlmIChTZXRpbnRlcnJ1cHQoU0lfVElNRVJBLCBTSV9QTEFZKTwwKSB7Ci0JCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiU2V0aW50ZXJydXB0KCkgZmFpbGVkXG4iKSk7Ci0JCX0KLQl9Ci0KLQkvKiBHbyAqLwotCUJ1ZmZvcGVyKFNCX1BMQV9FTkF8U0JfUExBX1JQVCk7Ci0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImhhcmR3YXJlIGluaXRpYWxpemVkXG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JLyogTG9jayBzb3VuZCBzeXN0ZW0gKi8KLQlpZiAoTG9ja3NuZCgpIT0xKSB7Ci0gICAJICAgIFNETF9TZXRFcnJvcigiTWludF9PcGVuQXVkaW86IEF1ZGlvIHN5c3RlbSBhbHJlYWR5IGluIHVzZSIpOwotICAgICAgICByZXR1cm4oLTEpOwotCX0KLQotCVNETF9NaW50QXVkaW9fZGV2aWNlID0gdGhpczsKLQotCS8qIENoZWNrIGF1ZGlvIGNhcGFiaWxpdGllcyAqLwotCWlmIChNaW50X0NoZWNrQXVkaW8odGhpcywgc3BlYyk9PS0xKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBidWZmZXJzIGluIERNQS1hYmxlIFJBTSAqLwotCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgc2l6ZT0lZFxuIiwgc3BlYy0+c2l6ZSkpOwotCi0JU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSA9IEF0YXJpX1N5c01hbGxvYyhzcGVjLT5zaXplICoyLCBNWF9TVFJBTSk7Ci0JaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF09PU5VTEwpIHsKLQkJU0RMX1NldEVycm9yKCJNSU5UX09wZW5BdWRpbzogTm90IGVub3VnaCBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlciIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gKyBzcGVjLT5zaXplIDsKLQlTRExfTWludEF1ZGlvX251bWJ1Zj0wOwotCVNETF9tZW1zZXQoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSAqMik7Ci0JU0RMX01pbnRBdWRpb19hdWRpb3NpemUgPSBzcGVjLT5zaXplOwotCVNETF9NaW50QXVkaW9fbXV0ZXggPSAwOwotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciAwIGF0IDB4JTA4eFxuIiwgU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSkpOwotCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgMSBhdCAweCUwOHhcbiIsIFNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0pKTsKLQotCVNETF9NaW50QXVkaW9fQ2hlY2tGcHUoKTsKLQotCS8qIFNldHVwIGF1ZGlvIGhhcmR3YXJlICovCi0JTWludF9Jbml0QXVkaW8odGhpcywgc3BlYyk7Ci0KLSAgICByZXR1cm4oMSk7CS8qIFdlIGRvbid0IHVzZSBTREwgdGhyZWFkZWQgYXVkaW8gKi8KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX21jc24uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX21jc24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1M2RkZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19tY3NuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLQlNQ1NOIGNvbnRyb2wgc3RydWN0dXJlCi0KLQlQYXRyaWNlIE1hbmRpbgotKi8KLQotI2lmbmRlZiBfU0RMX21pbnRhdWRpb19tY3NoX2gKLSNkZWZpbmUgX1NETF9taW50YXVkaW9fbWNzaF9oCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwkvKiBWZXJzaW9uICovCi0JdW5zaWduZWQgc2hvcnQgc2l6ZTsJLyogU2l6ZSBvZiBzdHJ1Y3R1cmUgKi8KLQotCXVuc2lnbmVkIHNob3J0IHBsYXk7CS8qIFJlcGxheSBjYXBhYmlsaXR5ICovCi0JdW5zaWduZWQgc2hvcnQgcmVjb3JkOwkvKiBSZWNvcmQgY2FwYWJpbGl0eSAqLwotCXVuc2lnbmVkIHNob3J0IGRzcDsJCS8qIERTUDU2SyBwcmVzZW50ICovCi0JdW5zaWduZWQgc2hvcnQgcGludDsJLyogSW50ZXJydXB0IGF0IGVuZCBvZiByZXBsYXkgKi8KLQl1bnNpZ25lZCBzaG9ydCByaW50OwkvKiBJbnRlcnJ1cHQgYXQgZW5kIG9mIHJlY29yZCAqLwotCi0JdW5zaWduZWQgbG9uZyByZXMxOwkJLyogRnJlcXVlbmN5IG9mIGV4dGVybmFsIGNsb2NrICovCi0JdW5zaWduZWQgbG9uZyByZXMyOwotCXVuc2lnbmVkIGxvbmcgcmVzMzsKLQl1bnNpZ25lZCBsb25nIHJlczQ7Ci19IGNvb2tpZV9tY3NuX3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLWVudW0gewotCU1DU05fU1Q9MCwKLQlNQ1NOX1RULAotCU1DU05fU1RFPU1DU05fVFQsCi0JTUNTTl9GQUxDT04sCi0JTUNTTl9NQUM9TUNTTl9GQUxDT04KLX07Ci0KLSNkZWZpbmUgU0VUU01QRlJFUQk3CS8qIFNldCBzYW1wbGUgZnJlcXVlbmN5ICovCi0KLSNlbmRpZiAvKiBfU0RMX21pbnRhdWRpb19tY3NoX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX3N0ZmEuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX3N0ZmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkMWZkZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19zdGZhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0JTWlOVCBhdWRpbyBkcml2ZXIKLQl1c2luZyBYQklPUyBmdW5jdGlvbnMgKFNURkEgZHJpdmVyKQotCi0JUGF0cmljZSBNYW5kaW4KLSovCi0KLS8qIE1pbnQgaW5jbHVkZXMgKi8KLSNpbmNsdWRlIDxtaW50L29zYmluZC5oPgotI2luY2x1ZGUgPG1pbnQvZmFsY29uLmg+Ci0jaW5jbHVkZSA8bWludC9jb29raWUuaD4KLQotI2luY2x1ZGUgIlNETF9hdWRpby5oIgotI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCi0KLSNpbmNsdWRlICIuLi8uLi92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlteGFsbG9jX2MuaCIKLQotI2luY2x1ZGUgIlNETF9taW50YXVkaW8uaCIKLSNpbmNsdWRlICJTRExfbWludGF1ZGlvX3N0ZmEuaCIKLQotLyotLS0gRGVmaW5lcyAtLS0qLwotCi0jZGVmaW5lIE1JTlRfQVVESU9fRFJJVkVSX05BTUUgIm1pbnRfc3RmYSIKLQotLyogRGVidWcgcHJpbnQgaW5mbyAqLwotI2RlZmluZSBERUJVR19OQU1FICJhdWRpbzpzdGZhOiAiCi0jaWYgMAotI2RlZmluZSBERUJVR19QUklOVCh3aGF0KSBcCi0JeyBcCi0JCXByaW50ZiB3aGF0OyBcCi0JfQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfUFJJTlQod2hhdCkKLSNlbmRpZgotCi0vKi0tLSBTdGF0aWMgdmFyaWFibGVzIC0tLSovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvb2tpZV9zbmQsIGNvb2tpZV9tY2g7Ci1zdGF0aWMgY29va2llX3N0ZmFfdCAqY29va2llX3N0ZmE7Ci0KLXN0YXRpYyBjb25zdCBpbnQgZnJlcXNbMTZdPXsKLQk0OTk1LAk2MjY5LAk3NDkzLAk4MTkyLAotCTk4MzAsCTEwOTcxLAkxMjUzOCwJMTQ5ODUsCi0JMTYzODQsCTE5ODE5LAkyMTk0MywJMjQ1NzYsCi0JMzA3MjAsCTMyMzM2LAk0Mzg4NSwJNDkxNTIKLX07Ci0KLS8qLS0tIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgLS0tKi8KLQotc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKTsKLXN0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgTWludF9Mb2NrQXVkaW8oX1RISVMpOwotc3RhdGljIHZvaWQgTWludF9VbmxvY2tBdWRpbyhfVEhJUyk7Ci0KLS8qIFRvIGNoZWNrL2luaXQgaGFyZHdhcmUgYXVkaW8gKi8KLXN0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIE1pbnRfSW5pdEF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLQotLyotLS0gQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgLS0tKi8KLQotc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKLXsKLQljb25zdCBjaGFyICplbnZyID0gU0RMX2dldGVudigiU0RMX0FVRElPRFJJVkVSIik7Ci0KLQkvKiBDaGVjayBpZiB1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlciAqLwotCWlmICgoZW52cikgJiYgKFNETF9zdHJjbXAoZW52ciwgTUlOVF9BVURJT19EUklWRVJfTkFNRSkhPTApKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJ1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlclxuIikpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyogQ29va2llIF9NQ0ggcHJlc2VudCA/IGlmIG5vdCwgYXNzdW1lIFNUIG1hY2hpbmUgKi8KLQlpZiAoR2V0Y29va2llKENfX01DSCwgJmNvb2tpZV9tY2gpID09IENfTk9URk9VTkQpIHsKLQkJY29va2llX21jaCA9IE1DSF9TVDsKLQl9Ci0KLQkvKiBDb29raWUgX1NORCBwcmVzZW50ID8gaWYgbm90LCBhc3N1bWUgU1QgbWFjaGluZSAqLwotCWlmIChHZXRjb29raWUoQ19fU05ELCAmY29va2llX3NuZCkgPT0gQ19OT1RGT1VORCkgewotCQljb29raWVfc25kID0gU05EX1BTRzsKLQl9Ci0KLQkvKiBDb29raWUgU1RGQSBwcmVzZW50ID8gKi8KLQlpZiAoR2V0Y29va2llKENfU1RGQSwgKGxvbmcgKikgJmNvb2tpZV9zdGZhKSAhPSBDX0ZPVU5EKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyBTVEZBIGF1ZGlvXG4iKSk7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQlTRExfTWludEF1ZGlvX3N0ZmEgPSBjb29raWVfc3RmYTsKLQotCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTVEZBIGF1ZGlvIGF2YWlsYWJsZSFcbiIpKTsKLQlyZXR1cm4oMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKLXsKLSAgICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0gICAgU0RMX2ZyZWUoZGV2aWNlKTsKLX0KLQotc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfQXVkaW9EZXZpY2UgKnRoaXM7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7Ci0gICAgaWYgKCB0aGlzICkgewotICAgICAgICBTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKLSAgICAgICAgdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQotICAgICAgICAgICAgICAgIFNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0gICAgfQotICAgIGlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKLSAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgIGlmICggdGhpcyApIHsKLSAgICAgICAgICAgIFNETF9mcmVlKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybigwKTsKLSAgICB9Ci0gICAgU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCi0gICAgLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotICAgIHRoaXMtPk9wZW5BdWRpbyAgID0gTWludF9PcGVuQXVkaW87Ci0gICAgdGhpcy0+Q2xvc2VBdWRpbyAgPSBNaW50X0Nsb3NlQXVkaW87Ci0gICAgdGhpcy0+TG9ja0F1ZGlvICAgPSBNaW50X0xvY2tBdWRpbzsKLSAgICB0aGlzLT5VbmxvY2tBdWRpbyA9IE1pbnRfVW5sb2NrQXVkaW87Ci0gICAgdGhpcy0+ZnJlZSAgICAgICAgPSBBdWRpb19EZWxldGVEZXZpY2U7Ci0KLSAgICByZXR1cm4gdGhpczsKLX0KLQotQXVkaW9Cb290U3RyYXAgTUlOVEFVRElPX1NURkFfYm9vdHN0cmFwID0gewotCU1JTlRfQVVESU9fRFJJVkVSX05BTUUsICJNaU5UIFNURkEgYXVkaW8gZHJpdmVyIiwKLQlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQotfTsKLQotc3RhdGljIHZvaWQgTWludF9Mb2NrQXVkaW8oX1RISVMpCi17Ci0Jdm9pZCAqb2xkcGlsZTsKLQotCS8qIFN0b3AgcmVwbGF5ICovCi0Jb2xkcGlsZT0odm9pZCAqKVN1cGVyKDApOwotCWNvb2tpZV9zdGZhLT5zb3VuZF9lbmFibGU9U1RGQV9QTEFZX0RJU0FCTEU7Ci0JU3VwZXIob2xkcGlsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1pbnRfVW5sb2NrQXVkaW8oX1RISVMpCi17Ci0Jdm9pZCAqb2xkcGlsZTsKLQotCS8qIFJlc3RhcnQgcmVwbGF5ICovCi0Jb2xkcGlsZT0odm9pZCAqKVN1cGVyKDApOwotCWNvb2tpZV9zdGZhLT5zb3VuZF9lbmFibGU9U1RGQV9QTEFZX0VOQUJMRXxTVEZBX1BMQVlfUkVQRUFUOwotCVN1cGVyKG9sZHBpbGUpOwotfQotCi1zdGF0aWMgdm9pZCBNaW50X0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0Jdm9pZCAqb2xkcGlsZTsKLQotCS8qIFN0b3AgcmVwbGF5ICovCi0Jb2xkcGlsZT0odm9pZCAqKVN1cGVyKDApOwotCWNvb2tpZV9zdGZhLT5zb3VuZF9lbmFibGU9U1RGQV9QTEFZX0RJU0FCTEU7Ci0JU3VwZXIob2xkcGlsZSk7Ci0KLQkvKiBXYWl0IGlmIGN1cnJlbnRseSBwbGF5aW5nIHNvdW5kICovCi0Jd2hpbGUgKFNETF9NaW50QXVkaW9fbXV0ZXggIT0gMCkgewotCX0KLQotCS8qIENsZWFyIGJ1ZmZlcnMgKi8KLQlpZiAoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSkgewotCQlNZnJlZShTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKTsKLQkJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0gPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIGludCBNaW50X0NoZWNrQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JaW50IGk7Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYXNrZWQ6ICVkIGJpdHMsICIsc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKSk7Ci0JREVCVUdfUFJJTlQoKCJzaWduZWQ9JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHg4MDAwKSE9MCkpKTsKLQlERUJVR19QUklOVCgoImJpZyBlbmRpYW49JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHgxMDAwKSE9MCkpKTsKLQlERUJVR19QUklOVCgoImNoYW5uZWxzPSVkLCAiLCBzcGVjLT5jaGFubmVscykpOwotCURFQlVHX1BSSU5UKCgiZnJlcT0lZFxuIiwgc3BlYy0+ZnJlcSkpOwotCi0gICAgaWYgKHNwZWMtPmNoYW5uZWxzID4gMikgewotICAgICAgICBzcGVjLT5jaGFubmVscyA9IDI7ICAvKiBubyBtb3JlIHRoYW4gc3RlcmVvISAqLwotICAgIH0KLQotCS8qIENoZWNrIGZvcm1hdHMgYXZhaWxhYmxlICovCi0JTUlOVEFVRElPX2ZyZXFjb3VudD0wOwotCWZvciAoaT0wO2k8MTY7aSsrKSB7Ci0JCVNETF9NaW50QXVkaW9fQWRkRnJlcXVlbmN5KHRoaXMsIGZyZXFzW2ldLCAwLCBpLCAtMSk7Ci0JfQotCi0jaWYgMQotCWZvciAoaT0wOyBpPE1JTlRBVURJT19mcmVxY291bnQ7IGkrKykgewotCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiZnJlcSAlZDogJWx1IEh6LCBjbG9jayAlbHUsIHByZWRpdiAlZFxuIiwKLQkJCWksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5mcmVxdWVuY3ksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5tYXN0ZXJjbG9jaywKLQkJCU1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5wcmVkaXZpc29yCi0JCSkpOwotCX0KLSNlbmRpZgotCi0JTUlOVEFVRElPX251bWZyZXE9U0RMX01pbnRBdWRpb19TZWFyY2hGcmVxdWVuY3kodGhpcywgc3BlYy0+ZnJlcSk7Ci0Jc3BlYy0+ZnJlcT1NSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLmZyZXF1ZW5jeTsKLQotCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJvYnRhaW5lZDogJWQgYml0cywgIixzcGVjLT5mb3JtYXQgJiAweDAwZmYpKTsKLQlERUJVR19QUklOVCgoInNpZ25lZD0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKSkpOwotCURFQlVHX1BSSU5UKCgiYmlnIGVuZGlhbj0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKSkpOwotCURFQlVHX1BSSU5UKCgiY2hhbm5lbHM9JWQsICIsIHNwZWMtPmNoYW5uZWxzKSk7Ci0JREVCVUdfUFJJTlQoKCJmcmVxPSVkXG4iLCBzcGVjLT5mcmVxKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgTWludF9Jbml0QXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0Jdm9pZCAqYnVmZmVyOwotCXZvaWQgKm9sZHBpbGU7Ci0KLQlidWZmZXIgPSBTRExfTWludEF1ZGlvX2F1ZGlvYnVmW1NETF9NaW50QXVkaW9fbnVtYnVmXTsKLQotCW9sZHBpbGU9KHZvaWQgKilTdXBlcigwKTsKLQotCS8qIFN0b3AgcmVwbGF5ICovCi0JY29va2llX3N0ZmEtPnNvdW5kX2VuYWJsZT1TVEZBX1BMQVlfRElTQUJMRTsKLQotCS8qIFNlbGVjdCByZXBsYXkgZm9ybWF0ICovCi0JY29va2llX3N0ZmEtPnNvdW5kX2NvbnRyb2wgPSBNSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLnByZWRpdmlzb3I7Ci0JaWYgKChzcGVjLT5mb3JtYXQgJiAweGZmKT09OCkgewotCQljb29raWVfc3RmYS0+c291bmRfY29udHJvbCB8PSBTVEZBX0ZPUk1BVF84QklUOwotCX0gZWxzZSB7Ci0JCWNvb2tpZV9zdGZhLT5zb3VuZF9jb250cm9sIHw9IFNURkFfRk9STUFUXzE2QklUOwotCX0KLQlpZiAoc3BlYy0+Y2hhbm5lbHM9PTIpIHsKLQkJY29va2llX3N0ZmEtPnNvdW5kX2NvbnRyb2wgfD0gU1RGQV9GT1JNQVRfU1RFUkVPOwotCX0gZWxzZSB7Ci0JCWNvb2tpZV9zdGZhLT5zb3VuZF9jb250cm9sIHw9IFNURkFfRk9STUFUX01PTk87Ci0JfQotCWlmICgoc3BlYy0+Zm9ybWF0ICYgMHg4MDAwKSE9MCkgewotCQljb29raWVfc3RmYS0+c291bmRfY29udHJvbCB8PSBTVEZBX0ZPUk1BVF9TSUdORUQ7Ci0JfSBlbHNlIHsKLQkJY29va2llX3N0ZmEtPnNvdW5kX2NvbnRyb2wgfD0gU1RGQV9GT1JNQVRfVU5TSUdORUQ7Ci0JfQotCWlmICgoc3BlYy0+Zm9ybWF0ICYgMHgxMDAwKSE9MCkgewotCQljb29raWVfc3RmYS0+c291bmRfY29udHJvbCB8PSBTVEZBX0ZPUk1BVF9CSUdFTkRJQU47Ci0JfSBlbHNlIHsKLQkJY29va2llX3N0ZmEtPnNvdW5kX2NvbnRyb2wgfD0gU1RGQV9GT1JNQVRfTElURU5ESUFOOwotCX0KLQotCS8qIFNldCBidWZmZXIgKi8KLQljb29raWVfc3RmYS0+c291bmRfc3RhcnQgPSAodW5zaWduZWQgbG9uZykgYnVmZmVyOwotCWNvb2tpZV9zdGZhLT5zb3VuZF9lbmQgPSAodW5zaWduZWQgbG9uZykgKGJ1ZmZlciArIHNwZWMtPnNpemUpOwotCi0JLyogU2V0IGludGVycnVwdCAqLwotCWNvb2tpZV9zdGZhLT5zdGZhX2l0ID0gU0RMX01pbnRBdWRpb19TdGZhSW50ZXJydXB0OwotCi0JLyogUmVzdGFydCByZXBsYXkgKi8KLQljb29raWVfc3RmYS0+c291bmRfZW5hYmxlPVNURkFfUExBWV9FTkFCTEV8U1RGQV9QTEFZX1JFUEVBVDsKLQotCVN1cGVyKG9sZHBpbGUpOwotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImhhcmR3YXJlIGluaXRpYWxpemVkXG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JU0RMX01pbnRBdWRpb19kZXZpY2UgPSB0aGlzOwotCi0JLyogQ2hlY2sgYXVkaW8gY2FwYWJpbGl0aWVzICovCi0JaWYgKE1pbnRfQ2hlY2tBdWRpbyh0aGlzLCBzcGVjKT09LTEpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlcnMgaW4gRE1BLWFibGUgUkFNICovCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciBzaXplPSVkXG4iLCBzcGVjLT5zaXplKSk7Ci0KLQlTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdID0gQXRhcmlfU3lzTWFsbG9jKHNwZWMtPnNpemUgKjIsIE1YX1NUUkFNKTsKLQlpZiAoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXT09TlVMTCkgewotCQlTRExfU2V0RXJyb3IoIk1JTlRfT3BlbkF1ZGlvOiBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgYXVkaW8gYnVmZmVyIik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSArIHNwZWMtPnNpemUgOwotCVNETF9NaW50QXVkaW9fbnVtYnVmPTA7Ci0JU0RMX21lbXNldChTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplICoyKTsKLQlTRExfTWludEF1ZGlvX2F1ZGlvc2l6ZSA9IHNwZWMtPnNpemU7Ci0JU0RMX01pbnRBdWRpb19tdXRleCA9IDA7Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYnVmZmVyIDAgYXQgMHglMDh4XG4iLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKSk7Ci0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciAxIGF0IDB4JTA4eFxuIiwgU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSkpOwotCi0JU0RMX01pbnRBdWRpb19DaGVja0ZwdSgpOwotCi0JLyogU2V0dXAgYXVkaW8gaGFyZHdhcmUgKi8KLQlNaW50X0luaXRBdWRpbyh0aGlzLCBzcGVjKTsKLQotICAgIHJldHVybigxKTsJLyogV2UgZG9uJ3QgdXNlIHRocmVhZGVkIGF1ZGlvICovCi19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19zdGZhLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19zdGZhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YmYyZDYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fc3RmYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotCVNURkEgY29udHJvbCBzdHJ1Y3R1cmUKLQotCVBhdHJpY2UgTWFuZGluCi0qLwotCi0jaWZuZGVmIF9TRExfbWludGF1ZGlvX3N0ZmFfaAotI2RlZmluZSBfU0RMX21pbnRhdWRpb19zdGZhX2gKLQotLyotLS0gRGVmaW5lcyAtLS0qLwotCi0jZGVmaW5lIENfU1RGQQkweDUzNTQ0NjQxTAkvKiBTb3VuZCB0cmVpYmVyIGb8ciBhdGFyaSAoc2ViL1RoZSByZW1vdmVycykgKi8KLQotI2RlZmluZSBTVEZBX1BMQVlfRU5BQkxFCSgxPDwwKQotI2RlZmluZSBTVEZBX1BMQVlfRElTQUJMRQkoMDw8MCkKLSNkZWZpbmUgU1RGQV9QTEFZX1JFUEVBVAkoMTw8MSkKLSNkZWZpbmUgU1RGQV9QTEFZX1NJTkdMRQkoMDw8MSkKLQotI2RlZmluZSBTVEZBX0ZPUk1BVF9TSUdORUQJCSgxPDwxNSkKLSNkZWZpbmUgU1RGQV9GT1JNQVRfVU5TSUdORUQJKDA8PDE1KQotI2RlZmluZSBTVEZBX0ZPUk1BVF9TVEVSRU8JCSgxPDwxNCkKLSNkZWZpbmUgU1RGQV9GT1JNQVRfTU9OTwkJKDA8PDE0KQotI2RlZmluZSBTVEZBX0ZPUk1BVF8xNkJJVAkJKDE8PDEzKQotI2RlZmluZSBTVEZBX0ZPUk1BVF84QklUCQkoMDw8MTMpCi0jZGVmaW5lIFNURkFfRk9STUFUX0xJVEVORElBTgkoMTw8OSkKLSNkZWZpbmUgU1RGQV9GT1JNQVRfQklHRU5ESUFOCSgwPDw5KQotI2RlZmluZSBTVEZBX0ZPUk1BVF9GUkVRX01BU0sJMHgwZgotZW51bSB7Ci0JU1RGQV9GT1JNQVRfRjQ5OTU9MCwKLQlTVEZBX0ZPUk1BVF9GNjI2OSwKLQlTVEZBX0ZPUk1BVF9GNzQ5MywKLQlTVEZBX0ZPUk1BVF9GODE5MiwKLQotCVNURkFfRk9STUFUX0Y5ODMwLAotCVNURkFfRk9STUFUX0YxMDk3MSwKLQlTVEZBX0ZPUk1BVF9GMTI1MzgsCi0JU1RGQV9GT1JNQVRfRjE0OTg1LAotCi0JU1RGQV9GT1JNQVRfRjE2Mzg0LAotCVNURkFfRk9STUFUX0YxOTgxOSwKLQlTVEZBX0ZPUk1BVF9GMjE5NDMsCi0JU1RGQV9GT1JNQVRfRjI0NTc2LAotCi0JU1RGQV9GT1JNQVRfRjMwNzIwLAotCVNURkFfRk9STUFUX0YzMjMzNiwKLQlTVEZBX0ZPUk1BVF9GNDM4ODUsCi0JU1RGQV9GT1JNQVRfRjQ5MTUyCi19OwotCi0vKi0tLSBUeXBlcyAtLS0qLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgc291bmRfZW5hYmxlOwotCXVuc2lnbmVkIHNob3J0IHNvdW5kX2NvbnRyb2w7Ci0JdW5zaWduZWQgc2hvcnQgc291bmRfb3V0cHV0OwotCXVuc2lnbmVkIGxvbmcgc291bmRfc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBzb3VuZF9jdXJyZW50OwotCXVuc2lnbmVkIGxvbmcgc291bmRfZW5kOwotCXVuc2lnbmVkIHNob3J0IHZlcnNpb247Ci0Jdm9pZCAqb2xkX3ZibDsKLQl2b2lkICpvbGRfdGltZXJhOwotCXVuc2lnbmVkIGxvbmcgb2xkX21mcF9zdGF0dXM7Ci0Jdm9pZCAqbmV3X3ZibDsKLQl2b2lkICpkcml2ZXJzX2xpc3Q7Ci0Jdm9pZCAqcGxheV9zdG9wOwotCXVuc2lnbmVkIHNob3J0IGZyZXF1ZW5jeTsKLQl2b2lkICpzZXRfZnJlcXVlbmN5OwotCQotCXVuc2lnbmVkIHNob3J0IGZyZXF1ZW5jeV90aHJlc2hvbGQ7Ci0JdW5zaWduZWQgc2hvcnQgKmN1c3RvbV9mcmVxX3RhYmxlOwotCXVuc2lnbmVkIHNob3J0IHN0ZmFfb25fb2ZmOwotCXZvaWQgKm5ld19kcml2ZXJzX2xpc3Q7Ci0JdW5zaWduZWQgbG9uZyBvbGRfYml0XzJfb2ZfY29va2llX3NuZDsKLQl2b2lkICgqc3RmYV9pdCkodm9pZCk7Ci19IGNvb2tpZV9zdGZhX3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNlbmRpZiAvKiBfU0RMX21pbnRhdWRpb19zdGZhX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX3hiaW9zLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb194Ymlvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTFhZjNmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX3hiaW9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0JTWlOVCBhdWRpbyBkcml2ZXIKLQl1c2luZyBYQklPUyBmdW5jdGlvbnMgKEZhbGNvbikKLQotCVBhdHJpY2UgTWFuZGluLCBEaWRpZXIgTelxdWlnbm9uCi0qLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC5oPgotCi0vKiBNaW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KLSNpbmNsdWRlIDxtaW50L2ZhbGNvbi5oPgotI2luY2x1ZGUgPG1pbnQvY29va2llLmg+Ci0KLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0jaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvY19jLmgiCi0KLSNpbmNsdWRlICJTRExfbWludGF1ZGlvLmgiCi0jaW5jbHVkZSAiU0RMX21pbnRhdWRpb19kbWE4LmgiCi0KLS8qLS0tIERlZmluZXMgLS0tKi8KLQotI2RlZmluZSBNSU5UX0FVRElPX0RSSVZFUl9OQU1FICJtaW50X3hiaW9zIgotCi0vKiBEZWJ1ZyBwcmludCBpbmZvICovCi0jZGVmaW5lIERFQlVHX05BTUUgImF1ZGlvOnhiaW9zOiAiCi0jaWYgMAotI2RlZmluZSBERUJVR19QUklOVCh3aGF0KSBcCi0JeyBcCi0JCXByaW50ZiB3aGF0OyBcCi0JfQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfUFJJTlQod2hhdCkKLSNlbmRpZgotCi0vKi0tLSBTdGF0aWMgdmFyaWFibGVzIC0tLSovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvb2tpZV9zbmQ7Ci0KLS8qLS0tIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgLS0tKi8KLQotc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKTsKLXN0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOwotc3RhdGljIHZvaWQgTWludF9Mb2NrQXVkaW8oX1RISVMpOwotc3RhdGljIHZvaWQgTWludF9VbmxvY2tBdWRpbyhfVEhJUyk7Ci0KLS8qIFRvIGNoZWNrL2luaXQgaGFyZHdhcmUgYXVkaW8gKi8KLXN0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIE1pbnRfSW5pdEF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLQotLyotLS0gQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgLS0tKi8KLQotc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGR1bW15OwotCWNvbnN0IGNoYXIgKmVudnIgPSBTRExfZ2V0ZW52KCJTRExfQVVESU9EUklWRVIiKTsKLQotCS8qU0RMX01pbnRBdWRpb19taW50X3ByZXNlbnQgPSAoR2V0Y29va2llKENfTWlOVCwgJmR1bW15KSA9PSBDX0ZPVU5EKTsqLwotCVNETF9NaW50QXVkaW9fbWludF9wcmVzZW50ID0gU0RMX0ZBTFNFOwotCi0JLyogV2UgY2FuJ3QgdXNlIFhCSU9TIGluIGludGVycnVwdCB3aXRoIE1hZ2ljLCBkb24ndCBrbm93IGFib3V0IHRocmVhZCAqLwotCWlmIChHZXRjb29raWUoQ19NYWdYLCAmZHVtbXkpID09IENfRk9VTkQpIHsKLQkJcmV0dXJuKDApOwotCX0KLQotCS8qIENoZWNrIGlmIHVzZXIgYXNrZWQgYSBkaWZmZXJlbnQgYXVkaW8gZHJpdmVyICovCi0JaWYgKChlbnZyKSAmJiAoU0RMX3N0cmNtcChlbnZyLCBNSU5UX0FVRElPX0RSSVZFUl9OQU1FKSE9MCkpIHsKLQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgInVzZXIgYXNrZWQgYSBkaWZmZXJlbnQgYXVkaW8gZHJpdmVyXG4iKSk7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBDb29raWUgX1NORCBwcmVzZW50ID8gaWYgbm90LCBhc3N1bWUgU1QgbWFjaGluZSAqLwotCWlmIChHZXRjb29raWUoQ19fU05ELCAmY29va2llX3NuZCkgPT0gQ19OT1RGT1VORCkgewotCQljb29raWVfc25kID0gU05EX1BTRzsKLQl9Ci0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIDE2IGJpdHMgYXVkaW8gKi8KLQlpZiAoKGNvb2tpZV9zbmQgJiBTTkRfMTZCSVQpPT0wKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyAxNiBiaXRzIHNvdW5kXG4iKSk7Ci0JICAgIHJldHVybigwKTsKLQl9Ci0KLQkvKiBDaGVjayBpZiBhdWRpbyBpcyBsb2NrYWJsZSAqLwotCWlmIChMb2Nrc25kKCkhPTEpIHsKLQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImF1ZGlvIGxvY2tlZCBieSBvdGhlciBhcHBsaWNhdGlvblxuIikpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JVW5sb2Nrc25kKCk7Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiWEJJT1MgYXVkaW8gYXZhaWxhYmxlIVxuIikpOwotCXJldHVybigxKTsKLX0KLQotc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotICAgIFNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLSAgICBTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9BdWRpb0RldmljZSAqdGhpczsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLSAgICBpZiAoIHRoaXMgKSB7Ci0gICAgICAgIFNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOwotICAgICAgICB0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0gICAgICAgICAgICAgICAgU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLSAgICB9Ci0gICAgaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgaWYgKCB0aGlzICkgewotICAgICAgICAgICAgU0RMX2ZyZWUodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLSAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0KLSAgICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0gICAgdGhpcy0+T3BlbkF1ZGlvICAgPSBNaW50X09wZW5BdWRpbzsKLSAgICB0aGlzLT5DbG9zZUF1ZGlvICA9IE1pbnRfQ2xvc2VBdWRpbzsKLSAgICB0aGlzLT5Mb2NrQXVkaW8gICA9IE1pbnRfTG9ja0F1ZGlvOwotICAgIHRoaXMtPlVubG9ja0F1ZGlvID0gTWludF9VbmxvY2tBdWRpbzsKLSAgICB0aGlzLT5mcmVlICAgICAgICA9IEF1ZGlvX0RlbGV0ZURldmljZTsKLQotICAgIHJldHVybiB0aGlzOwotfQotCi1BdWRpb0Jvb3RTdHJhcCBNSU5UQVVESU9fWEJJT1NfYm9vdHN0cmFwID0gewotCU1JTlRfQVVESU9fRFJJVkVSX05BTUUsICJNaU5UIFhCSU9TIGF1ZGlvIGRyaXZlciIsCi0JQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KLXN0YXRpYyB2b2lkIE1pbnRfTG9ja0F1ZGlvKF9USElTKQotewotCS8qIFN0b3AgcmVwbGF5ICovCi0JQnVmZm9wZXIoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1pbnRfVW5sb2NrQXVkaW8oX1RISVMpCi17Ci0JLyogUmVzdGFydCByZXBsYXkgKi8KLQlCdWZmb3BlcihTQl9QTEFfRU5BfFNCX1BMQV9SUFQpOwotfQotCi1zdGF0aWMgdm9pZCBNaW50X0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0JLyogU3RvcCByZXBsYXkgKi8KLQlTRExfTWludEF1ZGlvX1dhaXRUaHJlYWQoKTsKLQlCdWZmb3BlcigwKTsKLQotCWlmICghU0RMX01pbnRBdWRpb19taW50X3ByZXNlbnQpIHsKLQkJLyogVW5pbnN0YWxsIGludGVycnVwdCAqLwotCQlKZGlzaW50KE1GUF9ETUFTT1VORCk7Ci0JfQotCi0JLyogV2FpdCBpZiBjdXJyZW50bHkgcGxheWluZyBzb3VuZCAqLwotCXdoaWxlIChTRExfTWludEF1ZGlvX211dGV4ICE9IDApIHsKLQl9Ci0KLQkvKiBDbGVhciBidWZmZXJzICovCi0JaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pIHsKLQkJTWZyZWUoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSk7Ci0JCVNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gPSBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdID0gTlVMTDsKLQl9Ci0KLQkvKiBVbmxvY2sgc291bmQgc3lzdGVtICovCi0JVW5sb2Nrc25kKCk7Ci19Ci0KLS8qIEZhbGNvbiBYQklPUyBpbXBsZW1lbnRhdGlvbiBvZiBEZXZjb25uZWN0KCkgaXMgYnVnZ3kgd2l0aCBleHRlcm5hbCBjbG9jayAqLwotc3RhdGljIHZvaWQgRGV2Y29ubmVjdDIoaW50IHNyYywgaW50IGRzdCwgaW50IHNjbGssIGludCBwcmUpCi17CQkKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTUFTSzFbM10gPSB7IDAsIDB4NjAwMCwgMCB9OwotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNQVNLMls0XSA9IHsgMHhGRkYwLCAweEZGOEYsIDB4RjBGRiwgMHgwRkZGIH07Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IElOREVYMVs0XSA9IHsgIDEsIDMsIDUsIDcgfTsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgSU5ERVgyWzRdID0geyAgMCwgMiwgNCwgNiB9OwotCXVuc2lnbmVkIHNob3J0IHN5bmNfZGl2LGRldl9jdHJsLGRlc3RfY3RybDsKLQl2b2lkICpvbGRzdGFjazsKLQotCWlmIChkc3Q9PTApIHsKLQkJcmV0dXJuOwotCX0KLQotCW9sZHN0YWNrPSh2b2lkICopU3VwZXIoMCk7Ci0KLQlkZXZfY3RybCA9IERNQUFVRElPX0lPLmRldl9jdHJsOwotCWRlc3RfY3RybCA9IERNQUFVRElPX0lPLmRlc3RfY3RybDsKLQlkZXZfY3RybCAmPSBNQVNLMltzcmNdOwotCi0JaWYgKHNyYz09QURDKSB7Ci0JCWRldl9jdHJsIHw9IE1BU0sxW3NjbGtdOwotCX0gZWxzZSB7Ci0JCWRldl9jdHJsIHw9IChJTkRFWDFbc2Nsa10gPDwgKHNyYzw8NCkpOwotCX0KLQotCWlmIChkc3QgJiBETUFSRUMpIHsJCQotCQlkZXN0X2N0cmwgJj0gMHhGRkYwOwotCQlkZXN0X2N0cmwgfD0gSU5ERVgxW3NyY107Ci0JfQotCi0JaWYgKGRzdCAmIERTUFJFQ1YpIHsJCQotCQlkZXN0X2N0cmwgJj0gMHhGRjhGOwotCQlkZXN0X2N0cmwgfD0gKElOREVYMVtzcmNdPDw0KTsgCi0JfQotCi0JaWYgKGRzdCAmIEVYVE9VVCkgewkJCi0JCWRlc3RfY3RybCAmPSAweEYwRkY7Ci0JCWRlc3RfY3RybCB8PSAoSU5ERVgxW3NyY108PDgpOyAKLQl9Ci0KLQlpZiAoZHN0ICYgREFDKSB7CQkKLQkJZGV2X2N0cmwgJj0gMHgwRkZGOwotCQlkZXZfY3RybCB8PSBNQVNLMVtzY2xrXTsgCi0JCWRlc3RfY3RybCAmPSAgMHgwRkZGOwotCQlkZXN0X2N0cmwgfD0gKElOREVYMltzcmNdPDwxMik7IAotCX0KLQotCXN5bmNfZGl2ID0gRE1BQVVESU9fSU8uc3luY19kaXY7Ci0JaWYgKHNjbGs9PUNMS0VYVCkgewotCQlwcmU8PD04OwotCQlzeW5jX2RpdiAmPSAweEYwRkY7Ci0JfSBlbHNlIHsKLQkJc3luY19kaXYgJj0gMHhGRkYwOwotCX0KLQlzeW5jX2RpdiB8PSBwcmU7Ci0KLQlETUFBVURJT19JTy5kZXZfY3RybCA9IGRldl9jdHJsOwotCURNQUFVRElPX0lPLmRlc3RfY3RybCA9IGRlc3RfY3RybDsKLQlETUFBVURJT19JTy5zeW5jX2RpdiA9IHN5bmNfZGl2OwotCi0JU3VwZXIob2xkc3RhY2spOwotfQotCi1zdGF0aWMgdm9pZCBNaW50X0NoZWNrRXh0ZXJuYWxDbG9jayhfVEhJUykKLXsKLSNkZWZpbmUgU0laRV9CVUZfQ0xPQ0tfTUVBU1VSRSAoNDQxMDAvMTApCi0KLQl1bnNpZ25lZCBsb25nIGNvb2tpZV9zbmQ7Ci0JY2hhciAqYnVmZmVyOwotCWludCBpLCBqOwotCi0JLyogRFNQIHByZXNlbnQgd2l0aCBpdHMgR1BJTyBwb3J0ID8gKi8KLQlpZiAoR2V0Y29va2llKENfX1NORCwgJmNvb2tpZV9zbmQpID09IENfTk9URk9VTkQpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoKGNvb2tpZV9zbmQgJiBTTkRfRFNQKT09MCkgewotCQlyZXR1cm47Ci0JfQotCi0JYnVmZmVyID0gQXRhcmlfU3lzTWFsbG9jKFNJWkVfQlVGX0NMT0NLX01FQVNVUkUsIE1YX1NUUkFNKTsKLQlpZiAoYnVmZmVyPT1OVUxMKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG1lYXN1cmVcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQlTRExfbWVtc2V0KGJ1ZmZlciwgMCwgU0laRV9CVUZfQ0xPQ0tfTUVBU1VSRSk7Ci0KLQlCdWZmb3BlcigwKTsKLQlTZXR0cmFja3MoMCwwKTsKLQlTZXRtb250cmFja3MoMCk7Ci0JU2V0bW9kZShNT05POCk7Ci0JSmRpc2ludChNRlBfVElNRVJBKTsKLQotCWZvciAoaT0wOyBpPDI7IGkrKykgewotCQlHcGlvKEdQSU9fU0VULDcpOyAgICAgIC8qIERTUCBwb3J0IGdwaW8gb3V0cHV0cyAqLwotCQlHcGlvKEdQSU9fV1JJVEUsMitpKTsgIC8qIDIyLjU3OTIvMjQuNTc2IE1IeiBmb3IgNDQuMS80OEtIeiAqLwotCQlEZXZjb25uZWN0MihETUFQTEFZLCBEQUMsIENMS0VYVCwgQ0xLNTBLKTsgIC8qIE1hdHJpeCBhbmQgY2xvY2sgc291cmNlICovCi0JCVNldGJ1ZmZlcigwLCBidWZmZXIsIGJ1ZmZlciArIFNJWkVfQlVGX0NMT0NLX01FQVNVUkUpOwkJICAgICAgICAgICAvKiBTZXQgYnVmZmVyICovCi0JCVhidGltZXIoWEJfVElNRVJBLCA1LCAzOCwgU0RMX01pbnRBdWRpb19YYmlvc0ludGVycnVwdE1lYXN1cmVDbG9jayk7IC8qIGRlbGF5IG1vZGUgdGltZXIgQSwgcHJlZGl2IC82NCwgMUtIeiAqLwotCQlKZW5hYmludChNRlBfVElNRVJBKTsKLQkJU0RMX01pbnRBdWRpb19jbG9ja3RpY3MgPSAwOwotCQlCdWZmb3BlcihTQl9QTEFfRU5BKTsKLQkJdXNsZWVwKDExMDAwMCk7Ci0KLQkJaWYoKEJ1ZmZvcGVyKC0xKSAmIDEpPT0wKSB7Ci0JCQlpZiAoU0RMX01pbnRBdWRpb19jbG9ja3RpY3MpIHsKLQkJCQl1bnNpZ25lZCBsb25nIGtoejsKLQotCQkJCWtoeiA9ICgoU0laRV9CVUZfQ0xPQ0tfTUVBU1VSRS9TRExfTWludEF1ZGlvX2Nsb2NrdGljcykgKzEpICYgMHhGRkZGRkZGRTsKLQkJCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAibWVhc3VyZSAlZDogZnJlcT0lbHUgS0h6XG4iLCBpKzEsIGtoeikpOwotCi0JCQkJaWYoa2h6PT00NCkgewotCQkJCQlmb3IgKGo9MTsgajw0OyBqKyspIHsKLQkJCQkJCVNETF9NaW50QXVkaW9fQWRkRnJlcXVlbmN5KHRoaXMsIE1BU1RFUkNMT0NLXzQ0Sy8oTUFTVEVSUFJFRElWX0ZBTENPTiooMTw8aikpLCBNQVNURVJDTE9DS180NEssICgxPDxqKS0xLCAyK2kpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChraHo9PTQ4KSB7Ci0JCQkJCWZvciAoaj0xOyBqPDQ7IGorKykgewotCQkJCQkJU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3kodGhpcywgTUFTVEVSQ0xPQ0tfNDhLLyhNQVNURVJQUkVESVZfRkFMQ09OKigxPDxqKSksIE1BU1RFUkNMT0NLXzQ4SywgKDE8PGopLTEsIDIraSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJObyBtZWFzdXJlXG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiTm8gU0RNQSBjbG9ja1xuIikpOwotCQl9Ci0KLQkJQnVmZm9wZXIoMCk7ICAgICAgICAgICAgIC8qIHN0b3AgKi8KLQkJSmRpc2ludChNRlBfVElNRVJBKTsgICAgIC8qIFVuaW5zdGFsbCBpbnRlcnJ1cHQgKi8KLQl9Ci0KLQlNZnJlZShidWZmZXIpOwotfQotCi1zdGF0aWMgaW50IE1pbnRfQ2hlY2tBdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQlpbnQgaTsKLQlVaW50MzIgZXh0Y2xvY2s7Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYXNrZWQ6ICVkIGJpdHMsICIsc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKSk7Ci0JREVCVUdfUFJJTlQoKCJzaWduZWQ9JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHg4MDAwKSE9MCkpKTsKLQlERUJVR19QUklOVCgoImJpZyBlbmRpYW49JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHgxMDAwKSE9MCkpKTsKLQlERUJVR19QUklOVCgoImNoYW5uZWxzPSVkLCAiLCBzcGVjLT5jaGFubmVscykpOwotCURFQlVHX1BSSU5UKCgiZnJlcT0lZFxuIiwgc3BlYy0+ZnJlcSkpOwotCi0gICAgaWYgKHNwZWMtPmNoYW5uZWxzID4gMikgewotICAgICAgICBzcGVjLT5jaGFubmVscyA9IDI7ICAvKiBubyBtb3JlIHRoYW4gc3RlcmVvISAqLwotICAgIH0KLQotCXNwZWMtPmZvcm1hdCB8PSAweDgwMDA7CS8qIEF1ZGlvIGlzIGFsd2F5cyBzaWduZWQgKi8KLQlpZiAoKHNwZWMtPmZvcm1hdCAmIDB4MDBmZik9PTE2KSB7Ci0JCXNwZWMtPmZvcm1hdCB8PSAweDEwMDA7CS8qIEF1ZGlvIGlzIGFsd2F5cyBiaWcgZW5kaWFuICovCi0JCXNwZWMtPmNoYW5uZWxzPTI7CS8qIDE2IGJpdHMgYWx3YXlzIHN0ZXJlbyAqLwotCX0KLQotCU1JTlRBVURJT19mcmVxY291bnQ9MDsKLQotCS8qIEFkZCBleHRlcm5hbCBjbG9ja3MgaWYgcHJlc2VudCAqLwotCU1pbnRfQ2hlY2tFeHRlcm5hbENsb2NrKHRoaXMpOwotCi0JLyogU3RhbmRhcmQgY2xvY2tzICovCi0JZm9yIChpPTE7aTwxMjtpKyspIHsKLQkJLyogUmVtb3ZlIHVudXNhYmxlIEZhbGNvbiBjb2RlYyBwcmVkaXZpc29ycyAqLwotCQlpZiAoKGk9PTYpIHx8IChpPT04KSB8fCAoaT09MTApKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlTRExfTWludEF1ZGlvX0FkZEZyZXF1ZW5jeSh0aGlzLCBNQVNURVJDTE9DS19GQUxDT04xLyhNQVNURVJQUkVESVZfRkFMQ09OKihpKzEpKSwgTUFTVEVSQ0xPQ0tfRkFMQ09OMSwgaSwgLTEpOwotCX0KLQotI2lmIDEKLQlmb3IgKGk9MDsgaTxNSU5UQVVESU9fZnJlcWNvdW50OyBpKyspIHsKLQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImZyZXEgJWQ6ICVsdSBIeiwgY2xvY2sgJWx1LCBwcmVkaXYgJWRcbiIsCi0JCQlpLCBNSU5UQVVESU9fZnJlcXVlbmNpZXNbaV0uZnJlcXVlbmN5LCBNSU5UQVVESU9fZnJlcXVlbmNpZXNbaV0ubWFzdGVyY2xvY2ssCi0JCQlNSU5UQVVESU9fZnJlcXVlbmNpZXNbaV0ucHJlZGl2aXNvcgotCQkpKTsKLQl9Ci0jZW5kaWYKLQotCU1JTlRBVURJT19udW1mcmVxPVNETF9NaW50QXVkaW9fU2VhcmNoRnJlcXVlbmN5KHRoaXMsIHNwZWMtPmZyZXEpOwotCXNwZWMtPmZyZXE9TUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5mcmVxdWVuY3k7Ci0KLQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAib2J0YWluZWQ6ICVkIGJpdHMsICIsc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKSk7Ci0JREVCVUdfUFJJTlQoKCJzaWduZWQ9JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHg4MDAwKSE9MCkpKTsKLQlERUJVR19QUklOVCgoImJpZyBlbmRpYW49JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHgxMDAwKSE9MCkpKTsKLQlERUJVR19QUklOVCgoImNoYW5uZWxzPSVkLCAiLCBzcGVjLT5jaGFubmVscykpOwotCURFQlVHX1BSSU5UKCgiZnJlcT0lZFxuIiwgc3BlYy0+ZnJlcSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIE1pbnRfSW5pdEF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQotewotCWludCBjaGFubmVsc19tb2RlLCBkbWFjbG9jaywgcHJlZGl2OwotCXZvaWQgKmJ1ZmZlcjsKLQotCS8qIFN0b3AgY3VycmVudGx5IHBsYXlpbmcgc291bmQgKi8KLQlTRExfTWludEF1ZGlvX3F1aXRfdGhyZWFkID0gU0RMX0ZBTFNFOwotCVNETF9NaW50QXVkaW9fdGhyZWFkX2ZpbmlzaGVkID0gU0RMX1RSVUU7Ci0JU0RMX01pbnRBdWRpb19XYWl0VGhyZWFkKCk7Ci0JQnVmZm9wZXIoMCk7Ci0KLQkvKiBTZXQgcmVwbGF5IHRyYWNrcyAqLwotCVNldHRyYWNrcygwLDApOwotCVNldG1vbnRyYWNrcygwKTsKLQotCS8qIFNlbGVjdCByZXBsYXkgZm9ybWF0ICovCi0JY2hhbm5lbHNfbW9kZT1TVEVSRU8xNjsKLQlzd2l0Y2ggKHNwZWMtPmZvcm1hdCAmIDB4ZmYpIHsKLQkJY2FzZSA4OgotCQkJaWYgKHNwZWMtPmNoYW5uZWxzPT0yKSB7Ci0JCQkJY2hhbm5lbHNfbW9kZT1TVEVSRU84OwotCQkJfSBlbHNlIHsKLQkJCQljaGFubmVsc19tb2RlPU1PTk84OwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCWlmIChTZXRtb2RlKGNoYW5uZWxzX21vZGUpPDApIHsKLQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIlNldG1vZGUoKSBmYWlsZWRcbiIpKTsKLQl9Ci0KLQlkbWFjbG9jayA9IE1JTlRBVURJT19mcmVxdWVuY2llc1tNSU5UQVVESU9fbnVtZnJlcV0ubWFzdGVyY2xvY2s7Ci0JcHJlZGl2ID0gTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5wcmVkaXZpc29yOwotCWlmIChNSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLmdwaW9fYml0cyAhPSAtMSkgewotCQlHcGlvKEdQSU9fU0VULDcpOwkJLyogRFNQIHBvcnQgZ3BpbyBvdXRwdXRzICovCi0JCUdwaW8oR1BJT19XUklURSwgTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5ncGlvX2JpdHMpOwotCQlEZXZjb25uZWN0MihETUFQTEFZLCBEQUN8RVhUT1VULCBDTEtFWFQsIHByZWRpdik7Ci0JfSBlbHNlIHsKLQkJRGV2Y29ubmVjdDIoRE1BUExBWSwgREFDLCBDTEsyNU0sIHByZWRpdik7Ci0JfQotCi0JLyogU2V0IGJ1ZmZlciAqLwotCWJ1ZmZlciA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbU0RMX01pbnRBdWRpb19udW1idWZdOwotCWlmIChTZXRidWZmZXIoMCwgYnVmZmVyLCBidWZmZXIgKyBzcGVjLT5zaXplKTwwKSB7Ci0JCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTZXRidWZmZXIoKSBmYWlsZWRcbiIpKTsKLQl9Ci0JCi0JaWYgKFNETF9NaW50QXVkaW9fbWludF9wcmVzZW50KSB7Ci0JCVNETF9NaW50QXVkaW9fdGhyZWFkX3BpZCA9IHRmb3JrKFNETF9NaW50QXVkaW9fVGhyZWFkLCAwKTsKLQl9IGVsc2UgewotCQkvKiBJbnN0YWxsIGludGVycnVwdCAqLwotCQlKZGlzaW50KE1GUF9ETUFTT1VORCk7Ci0JCS8qWGJ0aW1lcihYQl9USU1FUkEsIDgsIDEsIFNETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHQpOyovCi0JCVhidGltZXIoWEJfVElNRVJBLCA4LCAxLCBTRExfTWludEF1ZGlvX0RtYThJbnRlcnJ1cHQpOwotCQlKZW5hYmludChNRlBfRE1BU09VTkQpOwotCi0JCWlmIChTZXRpbnRlcnJ1cHQoU0lfVElNRVJBLCBTSV9QTEFZKTwwKSB7Ci0JCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiU2V0aW50ZXJydXB0KCkgZmFpbGVkXG4iKSk7Ci0JCX0KLQl9Ci0KLQkvKiBHbyAqLwotCUJ1ZmZvcGVyKFNCX1BMQV9FTkF8U0JfUExBX1JQVCk7Ci0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImhhcmR3YXJlIGluaXRpYWxpemVkXG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JLyogTG9jayBzb3VuZCBzeXN0ZW0gKi8KLQlpZiAoTG9ja3NuZCgpIT0xKSB7Ci0gICAJICAgIFNETF9TZXRFcnJvcigiTWludF9PcGVuQXVkaW86IEF1ZGlvIHN5c3RlbSBhbHJlYWR5IGluIHVzZSIpOwotICAgICAgICByZXR1cm4oLTEpOwotCX0KLQotCVNETF9NaW50QXVkaW9fZGV2aWNlID0gdGhpczsKLQotCS8qIENoZWNrIGF1ZGlvIGNhcGFiaWxpdGllcyAqLwotCWlmIChNaW50X0NoZWNrQXVkaW8odGhpcywgc3BlYyk9PS0xKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBidWZmZXJzIGluIERNQS1hYmxlIFJBTSAqLwotCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgc2l6ZT0lZFxuIiwgc3BlYy0+c2l6ZSkpOwotCi0JU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSA9IEF0YXJpX1N5c01hbGxvYyhzcGVjLT5zaXplICoyLCBNWF9TVFJBTSk7Ci0JaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF09PU5VTEwpIHsKLQkJU0RMX1NldEVycm9yKCJNSU5UX09wZW5BdWRpbzogTm90IGVub3VnaCBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlciIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gKyBzcGVjLT5zaXplIDsKLQlTRExfTWludEF1ZGlvX251bWJ1Zj0wOwotCVNETF9tZW1zZXQoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSAqMik7Ci0JU0RMX01pbnRBdWRpb19hdWRpb3NpemUgPSBzcGVjLT5zaXplOwotCVNETF9NaW50QXVkaW9fbXV0ZXggPSAwOwotCi0JREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciAwIGF0IDB4JTA4eFxuIiwgU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSkpOwotCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgMSBhdCAweCUwOHhcbiIsIFNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0pKTsKLQotCVNETF9NaW50QXVkaW9fQ2hlY2tGcHUoKTsKLQotCS8qIFNldHVwIGF1ZGlvIGhhcmR3YXJlICovCi0JTWludF9Jbml0QXVkaW8odGhpcywgc3BlYyk7Ci0KLSAgICByZXR1cm4oMSk7CS8qIFdlIGRvbid0IHVzZSBTREwgdGhyZWFkZWQgYXVkaW8gKi8KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbW1lL1NETF9tbWVhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9tbWUvU0RMX21tZWF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNGQyYmUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9tbWUvU0RMX21tZWF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRydTY0IFVOSVggTU1FIHN1cHBvcnQgKi8KLSNpbmNsdWRlIDxtbWVfYXBpLmg+Ci0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIlNETF9tbWVhdWRpby5oIgotCi1zdGF0aWMgQk9PTCBpblVzZVtOVU1fQlVGRkVSU107Ci0KLS8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgTU1FX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7Ci1zdGF0aWMgdm9pZCBNTUVfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyBVaW50OCAqTU1FX0dldEF1ZGlvQnVmKF9USElTKTsKLXN0YXRpYyB2b2lkIE1NRV9QbGF5QXVkaW8oX1RISVMpOwotc3RhdGljIHZvaWQgTU1FX1dhaXREb25lKF9USElTKTsKLXN0YXRpYyB2b2lkIE1NRV9DbG9zZUF1ZGlvKF9USElTKTsKLQotLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuKDEpOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0gICAgaWYgKCBkZXZpY2UgKSB7Ci0JaWYgKCBkZXZpY2UtPmhpZGRlbiApIHsKLQkgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCSAgICBkZXZpY2UtPmhpZGRlbiA9IE5VTEw7Ci0JfQotCVNETF9mcmVlKGRldmljZSk7Ci0JZGV2aWNlID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0gICAgU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCi0vKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotICAgIHRoaXMgPSBTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLSAgICBpZiAoIHRoaXMgKSB7Ci0JU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0JdGhpcy0+aGlkZGVuID0gU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLSAgICB9Ci0gICAgaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotCVNETF9PdXRPZk1lbW9yeSgpOwotCWlmICggdGhpcyApIHsKLQkgICAgU0RMX2ZyZWUodGhpcyk7Ci0JfQotCXJldHVybigwKTsKLSAgICB9Ci0gICAgU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgICB0aGlzLT5PcGVuQXVkaW8gICAgICAgPSAgICAgICBNTUVfT3BlbkF1ZGlvOwotICAgIHRoaXMtPldhaXRBdWRpbyAgICAgICA9ICAgICAgIE1NRV9XYWl0QXVkaW87Ci0gICAgdGhpcy0+UGxheUF1ZGlvICAgICAgID0gICAgICAgTU1FX1BsYXlBdWRpbzsKLSAgICB0aGlzLT5HZXRBdWRpb0J1ZiAgICAgPSAgICAgTU1FX0dldEF1ZGlvQnVmOwotICAgIHRoaXMtPldhaXREb25lICAgICAgICA9ICAgICAgICBNTUVfV2FpdERvbmU7Ci0gICAgdGhpcy0+Q2xvc2VBdWRpbyAgICAgID0gICAgICBNTUVfQ2xvc2VBdWRpbzsKLSAgICB0aGlzLT5mcmVlICAgICAgICAgICAgPSAgQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0gICAgcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIE1NRUFVRElPX2Jvb3RzdHJhcCA9IHsKLSAgICAid2F2ZW91dCIsICJUcnU2NCBNTUUgV2F2ZU91dCIsCi0gICAgQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KLXN0YXRpYyB2b2lkIFNldE1NZXJyb3IoY2hhciAqZnVuY3Rpb24sIE1NUkVTVUxUIGNvZGUpCi17Ci0gICAgaW50IGxlbjsKLSAgICBjaGFyIGVycmJ1ZltNQVhFUlJPUkxFTkdUSF07Ci0KLSAgICBTRExfc25wcmludGYoZXJyYnVmLCBTRExfYXJyYXlzaXplKGVycmJ1ZiksICIlczogIiwgZnVuY3Rpb24pOwotICAgIGxlbiA9IFNETF9zdHJsZW4oZXJyYnVmKTsKLSAgICB3YXZlT3V0R2V0RXJyb3JUZXh0KGNvZGUsIGVycmJ1ZitsZW4sIE1BWEVSUk9STEVOR1RILWxlbik7Ci0gICAgU0RMX1NldEVycm9yKCIlcyIsZXJyYnVmKTsKLX0KLQotc3RhdGljIHZvaWQgQ0FMTEJBQ0sgTU1FX0NBTExCQUNLKEhXQVZFT1VUIGh3bywKLQkJCQkgIFVJTlQgdU1zZywKLQkJCQkgIERXT1JEIGR3SW5zdGFuY2UsCi0JCQkJICBMUEFSQU0gZHdQYXJhbTEsCi0JCQkJICBMUEFSQU0gZHdQYXJhbTIpCi17Ci0gICAgV0FWRUhEUiAqd3AgPSAoV0FWRUhEUiAqKSBkd1BhcmFtMTsKLQotICAgIGlmICggdU1zZyA9PSBXT01fRE9ORSApCi0JaW5Vc2Vbd3AtPmR3VXNlcl0gPSBGQUxTRTsKLX0KLQotc3RhdGljIGludCBNTUVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQotewotICAgIE1NUkVTVUxUIHJlc3VsdDsKLSAgICBpbnQgaTsKLQotICAgIG1peGJ1ZiA9IE5VTEw7Ci0KLSAgICAvKiBTZXQgYmFzaWMgV0FWRSBmb3JtYXQgcGFyYW1ldGVycyAqLwotICAgIHNobSA9IG1tZUFsbG9jTWVtKHNpemVvZigqc2htKSk7Ci0gICAgaWYgKCBzaG0gPT0gTlVMTCApIHsKLQlTRExfU2V0RXJyb3IoIk91dCBvZiBtZW1vcnk6IHNobSIpOwotCXJldHVybigtMSk7Ci0gICAgfQotICAgIHNobS0+c291bmQgPSAwOwotICAgIHNobS0+d0ZtdC53Zi53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBhdWRpbyBwYXJhbWV0ZXJzIGZyb20gdGhlIEF1ZGlvU3BlYyAqLwotICAgIHN3aXRjaCAoIHNwZWMtPmZvcm1hdCAmIDB4RkYgKSB7Ci0JY2FzZSA4OgotCSAgICAvKiBVbnNpZ25lZCA4IGJpdCBhdWRpbyBkYXRhICovCi0JICAgIHNwZWMtPmZvcm1hdCA9IEFVRElPX1U4OwotCSAgICBzaG0tPndGbXQud0JpdHNQZXJTYW1wbGUgPSA4OwotCSAgICBicmVhazsKLQljYXNlIDE2OgotCSAgICAvKiBTaWduZWQgMTYgYml0IGF1ZGlvIGRhdGEgKi8KLQkgICAgc3BlYy0+Zm9ybWF0ID0gQVVESU9fUzE2OwotCSAgICBzaG0tPndGbXQud0JpdHNQZXJTYW1wbGUgPSAxNjsKLQkgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIFNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0Iik7Ci0JICAgIHJldHVybigtMSk7Ci0gICAgfQotCi0gICAgc2htLT53Rm10LndmLm5DaGFubmVscyA9IHNwZWMtPmNoYW5uZWxzOwotICAgIHNobS0+d0ZtdC53Zi5uU2FtcGxlc1BlclNlYyA9IHNwZWMtPmZyZXE7Ci0gICAgc2htLT53Rm10LndmLm5CbG9ja0FsaWduID0KLQlzaG0tPndGbXQud2YubkNoYW5uZWxzICogc2htLT53Rm10LndCaXRzUGVyU2FtcGxlIC8gODsKLSAgICBzaG0tPndGbXQud2YubkF2Z0J5dGVzUGVyU2VjID0KLQlzaG0tPndGbXQud2YublNhbXBsZXNQZXJTZWMgKiBzaG0tPndGbXQud2YubkJsb2NrQWxpZ247Ci0KLSAgICAvKiBDaGVjayB0aGUgYnVmZmVyIHNpemUgLS0gbWluaW11bSBvZiAxLzQgc2Vjb25kICh3b3JkIGFsaWduZWQpICovCi0gICAgaWYgKCBzcGVjLT5zYW1wbGVzIDwgKHNwZWMtPmZyZXEvNCkgKQotCXNwZWMtPnNhbXBsZXMgPSAoKHNwZWMtPmZyZXEvNCkrMykmfjM7Ci0KLSAgICAvKiBVcGRhdGUgdGhlIGZyYWdtZW50IHNpemUgYXMgc2l6ZSBpbiBieXRlcyAqLwotICAgIFNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7Ci0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KLSAgICByZXN1bHQgPSB3YXZlT3V0T3BlbigmKHNobS0+c291bmQpLAotCQkJIFdBVkVfTUFQUEVSLAotCQkJICYoc2htLT53Rm10LndmKSwKLQkJCSBNTUVfQ0FMTEJBQ0ssCi0JCQkgTlVMTCwKLQkJCSAoQ0FMTEJBQ0tfRlVOQ1RJT058V0FWRV9PUEVOX1NIQVJFQUJMRSkpOwotICAgIGlmICggcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IgKSB7Ci0JICAgIFNldE1NZXJyb3IoIndhdmVPdXRPcGVuKCkiLCByZXN1bHQpOwotCSAgICByZXR1cm4oLTEpOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSB0aGUgc291bmQgYnVmZmVycyAqLwotICAgIG1peGJ1ZiA9IChVaW50OCAqKW1tZUFsbG9jQnVmZmVyKE5VTV9CVUZGRVJTICogKHNwZWMtPnNpemUpKTsKLSAgICBpZiAoIG1peGJ1ZiA9PSBOVUxMICkgewotCVNETF9TZXRFcnJvcigiT3V0IG9mIG1lbW9yeTogbWl4YnVmIik7Ci0JcmV0dXJuKC0xKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7IGkrKykgewotCXNobS0+d0hkcltpXS5scERhdGEgICAgICAgICA9ICZtaXhidWZbaSAqIChzcGVjLT5zaXplKV07Ci0Jc2htLT53SGRyW2ldLmR3QnVmZmVyTGVuZ3RoID0gc3BlYy0+c2l6ZTsKLQlzaG0tPndIZHJbaV0uZHdGbGFncyAgICAgICAgPSAwOwotCXNobS0+d0hkcltpXS5kd1VzZXIgICAgICAgICA9IGk7Ci0Jc2htLT53SGRyW2ldLmR3TG9vcHMgICAgICAgID0gMDsgICAgICAgLyogbG9vcCBjb250cm9sIGNvdW50ZXIgKi8KLQlzaG0tPndIZHJbaV0ubHBOZXh0ICAgICAgICAgPSBOVUxMOyAgICAvKiByZXNlcnZlZCBmb3IgZHJpdmVyICovCi0Jc2htLT53SGRyW2ldLnJlc2VydmVkICAgICAgID0gMDsKLQlpblVzZVtpXSA9IEZBTFNFOwotICAgIH0KLSAgICBuZXh0X2J1ZmZlciA9IDA7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIE1NRV9XYWl0QXVkaW8oX1RISVMpCi17Ci0gICAgd2hpbGUgKCBpblVzZVtuZXh0X2J1ZmZlcl0gKSB7Ci0JbW1lV2FpdEZvckNhbGxiYWNrcygpOwotCW1tZVByb2Nlc3NDYWxsYmFja3MoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBVaW50OCAqTU1FX0dldEF1ZGlvQnVmKF9USElTKQotewotICAgIFVpbnQ4ICpyZXR2YWw7Ci0KLSAgICBpblVzZVtuZXh0X2J1ZmZlcl0gPSBUUlVFOwotICAgIHJldHZhbCA9IChVaW50OCAqKShzaG0tPndIZHJbbmV4dF9idWZmZXJdLmxwRGF0YSk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgTU1FX1BsYXlBdWRpbyhfVEhJUykKLXsKLSAgICAvKiBRdWV1ZSBpdCB1cCAqLwotICAgIHdhdmVPdXRXcml0ZShzaG0tPnNvdW5kLCAmKHNobS0+d0hkcltuZXh0X2J1ZmZlcl0pLCBzaXplb2YoV0FWRUhEUikpOwotICAgIG5leHRfYnVmZmVyID0gKG5leHRfYnVmZmVyKzEpJU5VTV9CVUZGRVJTOwotfQotCi1zdGF0aWMgdm9pZCBNTUVfV2FpdERvbmUoX1RISVMpCi17Ci0gICAgTU1SRVNVTFQgcmVzdWx0OwotICAgIGludCBpOwotCi0gICAgaWYgKCBzaG0tPnNvdW5kICkgewotCWZvciAoaSA9IDA7IGkgPCBOVU1fQlVGRkVSUzsgaSsrKQotCSAgICB3aGlsZSAoIGluVXNlW2ldICkgewotCQltbWVXYWl0Rm9yQ2FsbGJhY2tzKCk7Ci0JCW1tZVByb2Nlc3NDYWxsYmFja3MoKTsKLQkgICAgfQotCXJlc3VsdCA9IHdhdmVPdXRSZXNldChzaG0tPnNvdW5kKTsKLQlpZiAoIHJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SICkKLQkgICAgU2V0TU1lcnJvcigid2F2ZU91dFJlc2V0KCkiLCByZXN1bHQpOwotCW1tZVByb2Nlc3NDYWxsYmFja3MoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIE1NRV9DbG9zZUF1ZGlvKF9USElTKQotewotICAgIE1NUkVTVUxUIHJlc3VsdDsKLQotICAgIGlmICggbWl4YnVmICkgewotCXJlc3VsdCA9IG1tZUZyZWVCdWZmZXIobWl4YnVmKTsKLQlpZiAocmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IgKQotCSAgICBTZXRNTWVycm9yKCJtbWVGcmVlQnVmZmVyIiwgcmVzdWx0KTsKLQltaXhidWYgPSBOVUxMOwotICAgIH0KLQotICAgIGlmICggc2htICkgewotCWlmICggc2htLT5zb3VuZCApIHsKLQkgICAgcmVzdWx0ID0gd2F2ZU91dENsb3NlKHNobS0+c291bmQpOwotCSAgICBpZiAocmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IgKQotCQlTZXRNTWVycm9yKCJ3YXZlT3V0Q2xvc2UoKSIsIHJlc3VsdCk7Ci0JICAgIG1tZVByb2Nlc3NDYWxsYmFja3MoKTsKLQl9Ci0JcmVzdWx0ID0gbW1lRnJlZU1lbShzaG0pOwotCWlmIChyZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUiApCi0JICAgIFNldE1NZXJyb3IoIm1tZUZyZWVNZW0oKSIsIHJlc3VsdCk7Ci0Jc2htID0gTlVMTDsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbW1lL1NETF9tbWVhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9tbWUvU0RMX21tZWF1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDlkODMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9tbWUvU0RMX21tZWF1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogQWxsb3cgYWNjZXNzIHRvIGEgcmF3IG1peGluZyBidWZmZXIgKi8KLQotI2lmbmRlZiBfU0RMX2xvd2F1ZGlvX2gKLSNkZWZpbmUgX1NETF9sb3dhdWRpb19oCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcwotI2RlZmluZSBOVU1fQlVGRkVSUyAyCi0KLXN0cnVjdCBTaGFyZWRNZW0gewotICAgIEhXQVZFT1VUIHNvdW5kOwotICAgIFdBVkVIRFIgd0hkcltOVU1fQlVGRkVSU107Ci0gICAgUENNV0FWRUZPUk1BVCB3Rm10OwotfTsKLQotc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKLSAgICBVaW50OCAqbWl4YnVmOyAgICAgICAgICAvKiBUaGUgcmF3IGFsbG9jYXRlZCBtaXhpbmcgYnVmZmVyICovCi0gICAgc3RydWN0IFNoYXJlZE1lbSAqc2htOwotICAgIGludCBuZXh0X2J1ZmZlcjsKLX07Ci0KLSNkZWZpbmUgc2htCQkJKHRoaXMtPmhpZGRlbi0+c2htKQotI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCi0jZGVmaW5lIG5leHRfYnVmZmVyCQkodGhpcy0+aGlkZGVuLT5uZXh0X2J1ZmZlcikKLS8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLwotI2VuZGlmIC8qIF9TRExfbG93YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9uYXMvU0RMX25hc2F1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL25hcy9TRExfbmFzYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkMmEzYi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL25hcy9TRExfbmFzYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0KLSAgICBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiBieToKLSAgICBFcmlrIEluZ2UgQm9sc/gKLSAgICBrbmFuQG1vLmhpbW9sZGUubm8KLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLwotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCi0jaW5jbHVkZSAiU0RMX25hc2F1ZGlvLmgiCi0KLS8qIFRoZSB0YWcgbmFtZSB1c2VkIGJ5IGFydHNjIGF1ZGlvICovCi0jZGVmaW5lIE5BU19EUklWRVJfTkFNRSAgICAgICAgICJuYXMiCi0KLXN0YXRpYyBzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKnRoaXMyID0gTlVMTDsKLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBOQVNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIE5BU19XYWl0QXVkaW8oX1RISVMpOwotc3RhdGljIHZvaWQgTkFTX1BsYXlBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgVWludDggKk5BU19HZXRBdWRpb0J1ZihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBOQVNfQ2xvc2VBdWRpbyhfVEhJUyk7Ci0KLS8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCi17Ci0JQXVTZXJ2ZXIgKmF1ZCA9IEF1T3BlblNlcnZlcigiIiwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0JaWYgKCFhdWQpIHJldHVybiAwOwotCi0JQXVDbG9zZVNlcnZlcihhdWQpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX0F1ZGlvRGV2aWNlICp0aGlzOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotCWlmICggdGhpcyApIHsKLQkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0JCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCX0KLQlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIHRoaXMgKSB7Ci0JCQlTRExfZnJlZSh0aGlzKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQl0aGlzLT5PcGVuQXVkaW8gPSBOQVNfT3BlbkF1ZGlvOwotCXRoaXMtPldhaXRBdWRpbyA9IE5BU19XYWl0QXVkaW87Ci0JdGhpcy0+UGxheUF1ZGlvID0gTkFTX1BsYXlBdWRpbzsKLQl0aGlzLT5HZXRBdWRpb0J1ZiA9IE5BU19HZXRBdWRpb0J1ZjsKLQl0aGlzLT5DbG9zZUF1ZGlvID0gTkFTX0Nsb3NlQXVkaW87Ci0KLQl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIE5BU19ib290c3RyYXAgPSB7Ci0JTkFTX0RSSVZFUl9OQU1FLCAiTmV0d29yayBBdWRpbyBTeXN0ZW0iLAotCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KLXN0YXRpYyB2b2lkIE5BU19XYWl0QXVkaW8oX1RISVMpCi17Ci0Jd2hpbGUgKCB0aGlzLT5oaWRkZW4tPmJ1Zl9mcmVlIDwgdGhpcy0+aGlkZGVuLT5taXhsZW4gKSB7Ci0JCUF1RXZlbnQgZXY7Ci0JCUF1TmV4dEV2ZW50KHRoaXMtPmhpZGRlbi0+YXVkLCBBdVRydWUsICZldik7Ci0JCUF1RGlzcGF0Y2hFdmVudCh0aGlzLT5oaWRkZW4tPmF1ZCwgJmV2KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIE5BU19QbGF5QXVkaW8oX1RISVMpCi17Ci0Jd2hpbGUgKHRoaXMtPmhpZGRlbi0+bWl4bGVuID4gdGhpcy0+aGlkZGVuLT5idWZfZnJlZSkgeyAvKiBXZSB0aGluayB0aGUgYnVmZmVyIGlzIGZ1bGw/IFlpa2VzISBBc2sgdGhlIHNlcnZlciBmb3IgZXZlbnRzLAotCQkJCSAgICBpbiB0aGUgaG9wZSB0aGF0IHNvbWUgb2YgdGhlbSBpcyBMb3dXYXRlciBldmVudHMgdGVsbGluZyB1cyBtb3JlCi0JCQkJICAgIG9mIHRoZSBidWZmZXIgaXMgZnJlZSBub3cgdGhhbiB3aGF0IHdlIHRoaW5rLiAqLwotCQlBdUV2ZW50IGV2OwotCQlBdU5leHRFdmVudCh0aGlzLT5oaWRkZW4tPmF1ZCwgQXVUcnVlLCAmZXYpOwotCQlBdURpc3BhdGNoRXZlbnQodGhpcy0+aGlkZGVuLT5hdWQsICZldik7Ci0JfQotCXRoaXMtPmhpZGRlbi0+YnVmX2ZyZWUgLT0gdGhpcy0+aGlkZGVuLT5taXhsZW47Ci0KLQkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSAqLwotCUF1V3JpdGVFbGVtZW50KHRoaXMtPmhpZGRlbi0+YXVkLCB0aGlzLT5oaWRkZW4tPmZsb3csIDAsIHRoaXMtPmhpZGRlbi0+bWl4bGVuLCB0aGlzLT5oaWRkZW4tPm1peGJ1ZiwgQXVGYWxzZSwgTlVMTCk7Ci0KLQl0aGlzLT5oaWRkZW4tPndyaXR0ZW4gKz0gdGhpcy0+aGlkZGVuLT5taXhsZW47Ci0JCi0jaWZkZWYgREVCVUdfQVVESU8KLQlmcHJpbnRmKHN0ZGVyciwgIldyb3RlICVkIGJ5dGVzIG9mIGF1ZGlvIGRhdGFcbiIsIHRoaXMtPmhpZGRlbi0+bWl4bGVuKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgVWludDggKk5BU19HZXRBdWRpb0J1ZihfVEhJUykKLXsKLQlyZXR1cm4odGhpcy0+aGlkZGVuLT5taXhidWYpOwotfQotCi1zdGF0aWMgdm9pZCBOQVNfQ2xvc2VBdWRpbyhfVEhJUykKLXsKLQlpZiAoIHRoaXMtPmhpZGRlbi0+bWl4YnVmICE9IE5VTEwgKSB7Ci0JCVNETF9GcmVlQXVkaW9NZW0odGhpcy0+aGlkZGVuLT5taXhidWYpOwotCQl0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IE5VTEw7Ci0JfQotCWlmICggdGhpcy0+aGlkZGVuLT5hdWQgKSB7Ci0JCUF1Q2xvc2VTZXJ2ZXIodGhpcy0+aGlkZGVuLT5hdWQpOwotCQl0aGlzLT5oaWRkZW4tPmF1ZCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzZGxmb3JtYXRfdG9fYXVmb3JtYXQodW5zaWduZWQgaW50IGZtdCkKLXsKLSAgc3dpdGNoIChmbXQpCi0gICAgewotICAgIGNhc2UgQVVESU9fVTg6Ci0gICAgICByZXR1cm4gQXVGb3JtYXRMaW5lYXJVbnNpZ25lZDg7Ci0gICAgY2FzZSBBVURJT19TODoKLSAgICAgIHJldHVybiBBdUZvcm1hdExpbmVhclNpZ25lZDg7Ci0gICAgY2FzZSBBVURJT19VMTZMU0I6Ci0gICAgICByZXR1cm4gQXVGb3JtYXRMaW5lYXJVbnNpZ25lZDE2TFNCOwotICAgIGNhc2UgQVVESU9fVTE2TVNCOgotICAgICAgcmV0dXJuIEF1Rm9ybWF0TGluZWFyVW5zaWduZWQxNk1TQjsKLSAgICBjYXNlIEFVRElPX1MxNkxTQjoKLSAgICAgIHJldHVybiBBdUZvcm1hdExpbmVhclNpZ25lZDE2TFNCOwotICAgIGNhc2UgQVVESU9fUzE2TVNCOgotICAgICAgcmV0dXJuIEF1Rm9ybWF0TGluZWFyU2lnbmVkMTZNU0I7Ci0gICAgfQotICByZXR1cm4gQXVOb25lOwotfQotCi1zdGF0aWMgQXVCb29sCi1ldmVudF9oYW5kbGVyKEF1U2VydmVyKiBhdWQsIEF1RXZlbnQqIGV2LCBBdUV2ZW50SGFuZGxlclJlYyogaG5kKQotewotCXN3aXRjaCAoZXYtPnR5cGUpIHsKLQljYXNlIEF1RXZlbnRUeXBlRWxlbWVudE5vdGlmeTogewotCQlBdUVsZW1lbnROb3RpZnlFdmVudCogZXZlbnQgPSAoQXVFbGVtZW50Tm90aWZ5RXZlbnQgKilldjsKLQotCQlzd2l0Y2ggKGV2ZW50LT5raW5kKSB7Ci0JCWNhc2UgQXVFbGVtZW50Tm90aWZ5S2luZExvd1dhdGVyOgotCQkJaWYgKHRoaXMyLT5idWZfZnJlZSA+PSAwKSB7Ci0JCQkJdGhpczItPnJlYWxseSArPSBldmVudC0+bnVtX2J5dGVzOwotCQkJCWdldHRpbWVvZmRheSgmdGhpczItPmxhc3RfdHYsIDApOwotCQkJCXRoaXMyLT5idWZfZnJlZSArPSBldmVudC0+bnVtX2J5dGVzOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzMi0+YnVmX2ZyZWUgPSBldmVudC0+bnVtX2J5dGVzOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQXVFbGVtZW50Tm90aWZ5S2luZFN0YXRlOgotCQkJc3dpdGNoIChldmVudC0+Y3VyX3N0YXRlKSB7Ci0JCQljYXNlIEF1U3RhdGVQYXVzZToKLQkJCQlpZiAoZXZlbnQtPnJlYXNvbiAhPSBBdVJlYXNvblVzZXIpIHsKLQkJCQkJaWYgKHRoaXMyLT5idWZfZnJlZSA+PSAwKSB7Ci0JCQkJCQl0aGlzMi0+cmVhbGx5ICs9IGV2ZW50LT5udW1fYnl0ZXM7Ci0JCQkJCQlnZXR0aW1lb2ZkYXkoJnRoaXMyLT5sYXN0X3R2LCAwKTsKLQkJCQkJCXRoaXMyLT5idWZfZnJlZSArPSBldmVudC0+bnVtX2J5dGVzOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdGhpczItPmJ1Zl9mcmVlID0gZXZlbnQtPm51bV9ieXRlczsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQl9Ci0JcmV0dXJuIEF1VHJ1ZTsKLX0KLQotc3RhdGljIEF1RGV2aWNlSUQKLWZpbmRfZGV2aWNlKF9USElTLCBpbnQgbmNoKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBBdVNlcnZlck51bURldmljZXModGhpcy0+aGlkZGVuLT5hdWQpOyBpKyspIHsKLQkJaWYgKChBdURldmljZUtpbmQoQXVTZXJ2ZXJEZXZpY2UodGhpcy0+aGlkZGVuLT5hdWQsIGkpKSA9PQotCQkJCUF1Q29tcG9uZW50S2luZFBoeXNpY2FsT3V0cHV0KSAmJgotCQkJQXVEZXZpY2VOdW1UcmFja3MoQXVTZXJ2ZXJEZXZpY2UodGhpcy0+aGlkZGVuLT5hdWQsIGkpKSA9PSBuY2gpIHsKLQkJCXJldHVybiBBdURldmljZUlkZW50aWZpZXIoQXVTZXJ2ZXJEZXZpY2UodGhpcy0+aGlkZGVuLT5hdWQsIGkpKTsKLQkJfQotCX0KLQlyZXR1cm4gQXVOb25lOwotfQotCi1zdGF0aWMgaW50IE5BU19PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JQXVFbGVtZW50IGVsbXNbM107Ci0JaW50IGJ1ZmZlcl9zaXplOwotCVVpbnQxNiB0ZXN0X2Zvcm1hdCwgZm9ybWF0OwotCi0JdGhpcy0+aGlkZGVuLT5taXhidWYgPSBOVUxMOwotCi0JLyogVHJ5IGZvciBhIGNsb3Nlc3QgbWF0Y2ggb24gYXVkaW8gZm9ybWF0ICovCi0JZm9ybWF0ID0gMDsKLQlmb3IgKCB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7Ci0JCQkJCQkhIGZvcm1hdCAmJiB0ZXN0X2Zvcm1hdDsgKSB7Ci0JCWZvcm1hdCA9IHNkbGZvcm1hdF90b19hdWZvcm1hdCh0ZXN0X2Zvcm1hdCk7Ci0KLQkJaWYgKGZvcm1hdCA9PSBBdU5vbmUpIHsKLQkJCXRlc3RfZm9ybWF0ID0gU0RMX05leHRBdWRpb0Zvcm1hdCgpOwotCQl9Ci0JfQotCWlmICggZm9ybWF0ID09IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCBhbnkgaGFyZHdhcmUgYXVkaW8gZm9ybWF0cyIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlzcGVjLT5mb3JtYXQgPSB0ZXN0X2Zvcm1hdDsKLQotCXRoaXMtPmhpZGRlbi0+YXVkID0gQXVPcGVuU2VydmVyKCIiLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLQlpZiAodGhpcy0+aGlkZGVuLT5hdWQgPT0gMCkKLQl7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiBjb25uZWN0aW9uIHRvIE5BUyBzZXJ2ZXIiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCQotCXRoaXMtPmhpZGRlbi0+ZGV2ID0gZmluZF9kZXZpY2UodGhpcywgc3BlYy0+Y2hhbm5lbHMpOwotCWlmICgodGhpcy0+aGlkZGVuLT5kZXYgPT0gQXVOb25lKSB8fCAoISh0aGlzLT5oaWRkZW4tPmZsb3cgPSBBdUNyZWF0ZUZsb3codGhpcy0+aGlkZGVuLT5hdWQsIE5VTEwpKSkpIHsKLQkJQXVDbG9zZVNlcnZlcih0aGlzLT5oaWRkZW4tPmF1ZCk7Ci0JCXRoaXMtPmhpZGRlbi0+YXVkID0gMDsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBmaW5kIGEgZml0dGluZyBwbGF5YmFjayBkZXZpY2Ugb24gTkFTIHNlcnZlciIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JCi0JYnVmZmVyX3NpemUgPSBzcGVjLT5mcmVxOwotCWlmIChidWZmZXJfc2l6ZSA8IDQwOTYpCi0JCWJ1ZmZlcl9zaXplID0gNDA5NjsgCi0KLQlpZiAoYnVmZmVyX3NpemUgPiAzMjc2OCkKLQkJYnVmZmVyX3NpemUgPSAzMjc2ODsgLyogU28gdGhhdCB0aGUgYnVmZmVyIHdvbid0IGdldCB1bm1hbmFnZWFibHkgYmlnLiAqLwotCi0JLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGF1ZGlvIHNwZWNpZmljYXRpb24gKi8KLQlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCi0JdGhpczIgPSB0aGlzLT5oaWRkZW47Ci0KLQlBdU1ha2VFbGVtZW50SW1wb3J0Q2xpZW50KGVsbXMsIHNwZWMtPmZyZXEsIGZvcm1hdCwgc3BlYy0+Y2hhbm5lbHMsIEF1VHJ1ZSwKLQkJCQlidWZmZXJfc2l6ZSwgYnVmZmVyX3NpemUgLyA0LCAwLCBOVUxMKTsKLQlBdU1ha2VFbGVtZW50RXhwb3J0RGV2aWNlKGVsbXMrMSwgMCwgdGhpcy0+aGlkZGVuLT5kZXYsIHNwZWMtPmZyZXEsCi0JCQkJQXVVbmxpbWl0ZWRTYW1wbGVzLCAwLCBOVUxMKTsKLQlBdVNldEVsZW1lbnRzKHRoaXMtPmhpZGRlbi0+YXVkLCB0aGlzLT5oaWRkZW4tPmZsb3csIEF1VHJ1ZSwgMiwgZWxtcywgTlVMTCk7Ci0JQXVSZWdpc3RlckV2ZW50SGFuZGxlcih0aGlzLT5oaWRkZW4tPmF1ZCwgQXVFdmVudEhhbmRsZXJJRE1hc2ssIDAsIHRoaXMtPmhpZGRlbi0+ZmxvdywKLQkJCQlldmVudF9oYW5kbGVyLCAoQXVQb2ludGVyKSBOVUxMKTsKLQotCUF1U3RhcnRGbG93KHRoaXMtPmhpZGRlbi0+YXVkLCB0aGlzLT5oaWRkZW4tPmZsb3csIE5VTEwpOwotCi0JLyogQWxsb2NhdGUgbWl4aW5nIGJ1ZmZlciAqLwotCXRoaXMtPmhpZGRlbi0+bWl4bGVuID0gc3BlYy0+c2l6ZTsKLQl0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IChVaW50OCAqKVNETF9BbGxvY0F1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4bGVuKTsKLQlpZiAoIHRoaXMtPmhpZGRlbi0+bWl4YnVmID09IE5VTEwgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLT5taXhidWYsIHNwZWMtPnNpbGVuY2UsIHNwZWMtPnNpemUpOwotCi0JLyogR2V0IHRoZSBwYXJlbnQgcHJvY2VzcyBpZCAod2UncmUgdGhlIHBhcmVudCBvZiB0aGUgYXVkaW8gdGhyZWFkKSAqLwotCXRoaXMtPmhpZGRlbi0+cGFyZW50ID0gZ2V0cGlkKCk7Ci0KLQkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KLQlyZXR1cm4oMCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL25hcy9TRExfbmFzYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbmFzL1NETF9uYXNhdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTBkNjY5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbmFzL1NETF9uYXNhdWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotCi0gICAgVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gYnk6Ci0gICAgRXJpayBJbmdlIEJvbHP4Ci0gICAga25hbkBtby5oaW1vbGRlLm5vCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX25hc2F1ZGlvX2gKLSNkZWZpbmUgX1NETF9uYXNhdWRpb19oCi0KLSNpZmRlZiBfX3NnaQotI2luY2x1ZGUgPG5hcy9hdWRpb2xpYi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhdWRpby9hdWRpb2xpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7Ci0JQXVTZXJ2ZXIqICBhdWQ7Ci0JQXVGbG93SUQgICBmbG93OwotCUF1RGV2aWNlSUQgZGV2OwotCQotCS8qIFRoZSBwYXJlbnQgcHJvY2VzcyBpZCwgdG8gZGV0ZWN0IHdoZW4gYXBwbGljYXRpb24gcXVpdHMgKi8KLQlwaWRfdCBwYXJlbnQ7Ci0KLQkvKiBSYXcgbWl4aW5nIGJ1ZmZlciAqLwotCVVpbnQ4ICptaXhidWY7Ci0JaW50ICAgIG1peGxlbjsKLQotCWludCB3cml0dGVuOwotCWludCByZWFsbHk7Ci0JaW50IGJwczsKLQlzdHJ1Y3QgdGltZXZhbCBsYXN0X3R2OwotCWludCBidWZfZnJlZTsKLX07Ci0jZW5kaWYgLyogX1NETF9uYXNhdWRpb19oICovCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbnRvL1NETF9udG9fYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbnRvL1NETF9udG9fYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4NmJhZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL250by9TRExfbnRvX2F1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KLSNpbmNsdWRlIDxzeXMvbmV1dHJpbm8uaD4KLSNpbmNsdWRlIDxzeXMvYXNvdW5kbGliLmg+Ci0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIlNETF9udG9fYXVkaW8uaCIKLQotLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgTlRPIGF1ZGlvICovCi0jZGVmaW5lIERSSVZFUl9OQU1FICJxc2EtbnRvIgotCi0vKiBkZWZhdWx0IGNoYW5uZWwgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIERFRkFVTFRfQ1BBUkFNU19SQVRFIDIyMDUwCi0jZGVmaW5lIERFRkFVTFRfQ1BBUkFNU19WT0lDRVMgMQotLyogRklYTUU6IG5lZWQgdG8gYWRkIGluIHRoZSBuZWFyIGZ1dHVyZSBmbGV4aWJsZSBsb2dpYyB3aXRoIGZyYWdfc2l6ZSBhbmQgZnJhZ3MgY291bnQgKi8KLSNkZWZpbmUgREVGQVVMVF9DUEFSQU1TX0ZSQUdfU0laRSA0MDk2Ci0jZGVmaW5lIERFRkFVTFRfQ1BBUkFNU19GUkFHU19NSU4gMQotI2RlZmluZSBERUZBVUxUX0NQQVJBTVNfRlJBR1NfTUFYIDEKLQotLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjaywgYW5kIGRvbid0IGJsb2NrIGlmIGJ1c3kgKi8KLSNkZWZpbmUgT1BFTl9GTEFHUyBTTkRfUENNX09QRU5fUExBWUJBQ0sKLQotI2RlZmluZSBRU0FfTk9fV09SS0FST1VORFMgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUVNBX01NQVBfV09SS0FST1VORCAweDAwMDAwMDAxCi0KLXN0cnVjdCBCdWdneUNhcmRzCi17Ci0gICBjaGFyKiBjYXJkbmFtZTsKLSAgIHVuc2lnbmVkIGxvbmcgYnVndHlwZTsKLX07Ci0KLSNkZWZpbmUgUVNBX1dBX0NBUkRTIDMKLQotc3RydWN0IEJ1Z2d5Q2FyZHMgYnVnZ3ljYXJkc1tRU0FfV0FfQ0FSRFNdPQotewotICAgeyJTb3VuZCBCbGFzdGVyIExpdmUhIiwgUVNBX01NQVBfV09SS0FST1VORH0sCi0gICB7IlZvcnRleCA4ODIwIiwgICAgICAgICBRU0FfTU1BUF9XT1JLQVJPVU5EfSwKLSAgIHsiVm9ydGV4IDg4MzAiLCAgICAgICAgIFFTQV9NTUFQX1dPUktBUk9VTkR9LAotfTsKLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgTlRPX1RocmVhZEluaXQoX1RISVMpOwotc3RhdGljIGludCBOVE9fT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjKiBzcGVjKTsKLXN0YXRpYyB2b2lkIE5UT19XYWl0QXVkaW8oX1RISVMpOwotc3RhdGljIHZvaWQgTlRPX1BsYXlBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgVWludDgqIE5UT19HZXRBdWRpb0J1ZihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBOVE9fQ2xvc2VBdWRpbyhfVEhJUyk7Ci0KLS8qIGNhcmQgbmFtZXMgY2hlY2sgdG8gYXBwbHkgdGhlIHdvcmthcm91bmRzICovCi1zdGF0aWMgaW50IE5UT19DaGVja0J1Z2d5Q2FyZHMoX1RISVMsIHVuc2lnbmVkIGxvbmcgY2hlY2tmb3IpCi17Ci0gICAgY2hhciBzY2FyZG5hbWVbMzNdOwotICAgIGludCBpdDsKLSAgICAKLSAgICBpZiAoc25kX2NhcmRfZ2V0X25hbWUoY2FyZG5vLCBzY2FyZG5hbWUsIDMyKTwwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgZm9yIChpdD0wOyBpdDxRU0FfV0FfQ0FSRFM7IGl0KyspCi0gICAgewotICAgICAgIGlmIChTRExfc3RyY21wKGJ1Z2d5Y2FyZHNbaXRdLmNhcmRuYW1lLCBzY2FyZG5hbWUpPT0wKQotICAgICAgIHsKLSAgICAgICAgICBpZiAoYnVnZ3ljYXJkc1tpdF0uYnVndHlwZT09Y2hlY2tmb3IpCi0gICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBOVE9fVGhyZWFkSW5pdChfVEhJUykKLXsKLSAgIGludCBzdGF0dXM7Ci0gICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07Ci0KLSAgIC8qIGluY3JlYXNpbmcgZGVmYXVsdCAxMCBwcmlvcml0eSB0byAyNSB0byBhdm9pZCBqZXJreSBzb3VuZCAqLwotICAgc3RhdHVzPVNjaGVkR2V0KDAsIDAsICZwYXJhbSk7Ci0gICBwYXJhbS5zY2hlZF9wcmlvcml0eT1wYXJhbS5zY2hlZF9jdXJwcmlvcml0eSsxNTsKLSAgIHN0YXR1cz1TY2hlZFNldCgwLCAwLCBTQ0hFRF9OT0NIQU5HRSwgJnBhcmFtKTsKLX0KLQotLyogUENNIHRyYW5zZmVyIGNoYW5uZWwgcGFyYW1ldGVycyBpbml0aWFsaXplIGZ1bmN0aW9uICovCi1zdGF0aWMgdm9pZCBOVE9fSW5pdEF1ZGlvUGFyYW1zKHNuZF9wY21fY2hhbm5lbF9wYXJhbXNfdCogY3BhcnMpCi17Ci0gICAgU0RMX21lbXNldChjcGFycywgMCwgc2l6ZW9mKHNuZF9wY21fY2hhbm5lbF9wYXJhbXNfdCkpOwotCi0gICAgY3BhcnMtPmNoYW5uZWwgPSBTTkRfUENNX0NIQU5ORUxfUExBWUJBQ0s7Ci0gICAgY3BhcnMtPm1vZGUgPSBTTkRfUENNX01PREVfQkxPQ0s7Ci0gICAgY3BhcnMtPnN0YXJ0X21vZGUgPSBTTkRfUENNX1NUQVJUX0RBVEE7Ci0gICAgY3BhcnMtPnN0b3BfbW9kZSAgPSBTTkRfUENNX1NUT1BfU1RPUDsKLSAgICBjcGFycy0+Zm9ybWF0LmZvcm1hdCA9IFNORF9QQ01fU0ZNVF9TMTZfTEU7Ci0gICAgY3BhcnMtPmZvcm1hdC5pbnRlcmxlYXZlID0gMTsKLSAgICBjcGFycy0+Zm9ybWF0LnJhdGUgPSBERUZBVUxUX0NQQVJBTVNfUkFURTsKLSAgICBjcGFycy0+Zm9ybWF0LnZvaWNlcyA9IERFRkFVTFRfQ1BBUkFNU19WT0lDRVM7Ci0gICAgY3BhcnMtPmJ1Zi5ibG9jay5mcmFnX3NpemUgPSBERUZBVUxUX0NQQVJBTVNfRlJBR19TSVpFOwotICAgIGNwYXJzLT5idWYuYmxvY2suZnJhZ3NfbWluID0gREVGQVVMVF9DUEFSQU1TX0ZSQUdTX01JTjsKLSAgICBjcGFycy0+YnVmLmJsb2NrLmZyYWdzX21heCA9IERFRkFVTFRfQ1BBUkFNU19GUkFHU19NQVg7Ci19Ci0KLXN0YXRpYyBpbnQgTlRPX0F1ZGlvQXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgLyogIFNlZSBpZiB3ZSBjYW4gb3BlbiBhIG5vbmJsb2NraW5nIGNoYW5uZWwuCi0gICAgICAgIFJldHVybiB2YWx1ZSAnMScgbWVhbnMgd2UgY2FuLgotICAgICAgICBSZXR1cm4gdmFsdWUgJzAnIG1lYW5zIHdlIGNhbm5vdC4gKi8KLQotICAgIGludCBhdmFpbGFibGU7Ci0gICAgaW50IHJ2YWw7Ci0gICAgc25kX3BjbV90KiBoYW5kbGU7Ci0KLSAgICBhdmFpbGFibGUgPSAwOwotICAgIGhhbmRsZSA9IE5VTEw7Ci0KLSAgICBydmFsID0gc25kX3BjbV9vcGVuX3ByZWZlcnJlZCgmaGFuZGxlLCBOVUxMLCBOVUxMLCBPUEVOX0ZMQUdTKTsKLQotICAgIGlmIChydmFsID49IDApCi0gICAgewotICAgICAgICBhdmFpbGFibGUgPSAxOwotCi0gICAgICAgIGlmICgocnZhbCA9IHNuZF9wY21fY2xvc2UoaGFuZGxlKSkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRExfU2V0RXJyb3IoIk5UT19BdWRpb0F2YWlsYWJsZSgpOiBzbmRfcGNtX2Nsb3NlIGZhaWxlZDogJXNcbiIsIHNuZF9zdHJlcnJvcihydmFsKSk7Ci0gICAgICAgICAgICBhdmFpbGFibGUgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiTlRPX0F1ZGlvQXZhaWxhYmxlKCk6IHRoZXJlIGFyZSBubyBhdmFpbGFibGUgYXVkaW8gZGV2aWNlcy5cbiIpOwotICAgIH0KLQotICAgIHJldHVybiAoYXZhaWxhYmxlKTsKLX0KLQotc3RhdGljIHZvaWQgTlRPX0RlbGV0ZUF1ZGlvRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotICAgIGlmICgoZGV2aWNlKSYmKGRldmljZS0+aGlkZGVuKSkKLSAgICB7Ci0gICAgICAgIFNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLSAgICB9Ci0gICAgaWYgKGRldmljZSkKLSAgICB7Ci0gICAgICAgIFNETF9mcmVlKGRldmljZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlKiBOVE9fQ3JlYXRlQXVkaW9EZXZpY2UoaW50IGRldmluZGV4KQotewotICAgIFNETF9BdWRpb0RldmljZSAqdGhpczsKLQotICAgIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0gICAgdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLSAgICBpZiAodGhpcykKLSAgICB7Ci0gICAgICAgIFNETF9tZW1zZXQodGhpcywgMCwgc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotICAgICAgICB0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopU0RMX21hbGxvYyhzaXplb2Yoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhKSk7Ci0gICAgfQotICAgIGlmICgodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpKQotICAgIHsKLSAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgIGlmICh0aGlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRExfZnJlZSh0aGlzKTsKLQl9Ci0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCBzaXplb2Yoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhKSk7Ci0gICAgYXVkaW9faGFuZGxlID0gTlVMTDsKLQotICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgICB0aGlzLT5UaHJlYWRJbml0ID0gTlRPX1RocmVhZEluaXQ7Ci0gICAgdGhpcy0+T3BlbkF1ZGlvID0gTlRPX09wZW5BdWRpbzsKLSAgICB0aGlzLT5XYWl0QXVkaW8gPSBOVE9fV2FpdEF1ZGlvOwotICAgIHRoaXMtPlBsYXlBdWRpbyA9IE5UT19QbGF5QXVkaW87Ci0gICAgdGhpcy0+R2V0QXVkaW9CdWYgPSBOVE9fR2V0QXVkaW9CdWY7Ci0gICAgdGhpcy0+Q2xvc2VBdWRpbyA9IE5UT19DbG9zZUF1ZGlvOwotCi0gICAgdGhpcy0+ZnJlZSA9IE5UT19EZWxldGVBdWRpb0RldmljZTsKLQotICAgIHJldHVybiB0aGlzOwotfQotCi1BdWRpb0Jvb3RTdHJhcCBRTlhOVE9BVURJT19ib290c3RyYXAgPQotewotICAgIERSSVZFUl9OQU1FLCAiUU5YNiBRU0EtTlRPIEF1ZGlvIiwKLSAgICBOVE9fQXVkaW9BdmFpbGFibGUsCi0gICAgTlRPX0NyZWF0ZUF1ZGlvRGV2aWNlCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KLXN0YXRpYyB2b2lkIE5UT19XYWl0QXVkaW8oX1RISVMpCi17Ci0gICAgZmRfc2V0IHdmZHM7Ci0gICAgaW50IHNlbGVjdHJldDsKLQotICAgIEZEX1pFUk8oJndmZHMpOwotICAgIEZEX1NFVChhdWRpb19mZCwgJndmZHMpOwotCi0gICAgZG8gewotICAgICAgICBzZWxlY3RyZXQ9c2VsZWN0KGF1ZGlvX2ZkICsgMSwgTlVMTCwgJndmZHMsIE5VTEwsIE5VTEwpOwotICAgICAgICBzd2l0Y2ggKHNlbGVjdHJldCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAtMToKLSAgICAgICAgICAgIGNhc2UgIDA6IFNETF9TZXRFcnJvcigiTlRPX1dhaXRBdWRpbygpOiBzZWxlY3QoKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZGVmYXVsdDogaWYgKEZEX0lTU0VUKGF1ZGlvX2ZkLCAmd2ZkcykpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlKDEpOwotfQotCi1zdGF0aWMgdm9pZCBOVE9fUGxheUF1ZGlvKF9USElTKQotewotICAgIGludCB3cml0dGVuLCBydmFsOwotICAgIGludCB0b3dyaXRlOwotICAgIHZvaWQqIHBjbWJ1ZmZlcjsKLQotICAgIGlmICghdGhpcy0+ZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgdG93cml0ZSA9IHRoaXMtPnNwZWMuc2l6ZTsKLSAgICBwY21idWZmZXIgPSBwY21fYnVmOwotCi0gICAgLyogV3JpdGUgdGhlIGF1ZGlvIGRhdGEsIGNoZWNraW5nIGZvciBFQUdBSU4gKGJ1ZmZlciBmdWxsKSBhbmQgdW5kZXJydW4gKi8KLSAgICBkbyB7Ci0gICAgICAgIHdyaXR0ZW4gPSBzbmRfcGNtX3BsdWdpbl93cml0ZShhdWRpb19oYW5kbGUsIHBjbV9idWYsIHRvd3JpdGUpOwotICAgICAgICBpZiAod3JpdHRlbiAhPSB0b3dyaXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGVycm5vID09IEVBR0FJTikgfHwgKGVycm5vID09IEVXT1VMREJMT0NLKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBMZXQgYSBsaXR0bGUgQ1BVIHRpbWUgZ28gYnkgYW5kIHRyeSB0byB3cml0ZSBhZ2FpbiAqLwotICAgICAgICAgICAgICAgIFNETF9EZWxheSgxKTsKLSAgICAgICAgICAgICAgICAvKiBpZiB3ZSB3cm90ZSBzb21lIGRhdGEgKi8KLSAgICAgICAgICAgICAgICB0b3dyaXRlIC09IHdyaXR0ZW47Ci0gICAgICAgICAgICAgICAgcGNtYnVmZmVyICs9IHdyaXR0ZW4gKiB0aGlzLT5zcGVjLmNoYW5uZWxzOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQkJCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChlcnJubyA9PSBFSU5WQUwpIHx8IChlcnJubyA9PSBFSU8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU0RMX21lbXNldCgmY3N0YXR1cywgMCwgc2l6ZW9mKGNzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICAgICAgY3N0YXR1cy5jaGFubmVsID0gU05EX1BDTV9DSEFOTkVMX1BMQVlCQUNLOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJ2YWwgPSBzbmRfcGNtX3BsdWdpbl9zdGF0dXMoYXVkaW9faGFuZGxlLCAmY3N0YXR1cykpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJOVE9fUGxheUF1ZGlvKCk6IHNuZF9wY21fcGx1Z2luX3N0YXR1cyBmYWlsZWQ6ICVzXG4iLCBzbmRfc3RyZXJyb3IocnZhbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9CQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNzdGF0dXMuc3RhdHVzID09IFNORF9QQ01fU1RBVFVTX1VOREVSUlVOKSB8fCAoY3N0YXR1cy5zdGF0dXMgPT0gU05EX1BDTV9TVEFUVVNfUkVBRFkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJ2YWwgPSBzbmRfcGNtX3BsdWdpbl9wcmVwYXJlKGF1ZGlvX2hhbmRsZSwgU05EX1BDTV9DSEFOTkVMX1BMQVlCQUNLKSkgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigiTlRPX1BsYXlBdWRpbygpOiBzbmRfcGNtX3BsdWdpbl9wcmVwYXJlIGZhaWxlZDogJXNcbiIsIHNuZF9zdHJlcnJvcihydmFsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CQkgICAgICAgIAkJCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogd2Ugd3JvdGUgYWxsIHJlbWFpbmluZyBkYXRhICovCi0gICAgICAgICAgICB0b3dyaXRlIC09IHdyaXR0ZW47Ci0gICAgICAgICAgICBwY21idWZmZXIgKz0gd3JpdHRlbiAqIHRoaXMtPnNwZWMuY2hhbm5lbHM7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICgodG93cml0ZSA+IDApICAmJiAodGhpcy0+ZW5hYmxlZCkpOwotCi0gICAgLyogSWYgd2UgY291bGRuJ3Qgd3JpdGUsIGFzc3VtZSBmYXRhbCBlcnJvciBmb3Igbm93ICovCi0gICAgaWYgKHRvd3JpdGUgIT0gMCkKLSAgICB7Ci0gICAgICAgIHRoaXMtPmVuYWJsZWQgPSAwOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotc3RhdGljIFVpbnQ4KiBOVE9fR2V0QXVkaW9CdWYoX1RISVMpCi17Ci0gICAgcmV0dXJuIHBjbV9idWY7Ci19Ci0KLXN0YXRpYyB2b2lkIE5UT19DbG9zZUF1ZGlvKF9USElTKQotewotICAgIGludCBydmFsOwotCi0gICAgdGhpcy0+ZW5hYmxlZCA9IDA7Ci0KLSAgICBpZiAoYXVkaW9faGFuZGxlICE9IE5VTEwpCi0gICAgewotICAgICAgICBpZiAoKHJ2YWwgPSBzbmRfcGNtX3BsdWdpbl9mbHVzaChhdWRpb19oYW5kbGUsIFNORF9QQ01fQ0hBTk5FTF9QTEFZQkFDSykpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgU0RMX1NldEVycm9yKCJOVE9fQ2xvc2VBdWRpbygpOiBzbmRfcGNtX3BsdWdpbl9mbHVzaCBmYWlsZWQ6ICVzXG4iLCBzbmRfc3RyZXJyb3IocnZhbCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICgocnZhbCA9IHNuZF9wY21fY2xvc2UoYXVkaW9faGFuZGxlKSkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRExfU2V0RXJyb3IoIk5UT19DbG9zZUF1ZGlvKCk6IHNuZF9wY21fY2xvc2UgZmFpbGVkOiAlc1xuIixzbmRfc3RyZXJyb3IocnZhbCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGF1ZGlvX2hhbmRsZSA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IE5UT19PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMqIHNwZWMpCi17Ci0gICAgaW50IHJ2YWw7Ci0gICAgaW50IGZvcm1hdDsKLSAgICBVaW50MTYgdGVzdF9mb3JtYXQ7Ci0gICAgaW50IGZvdW5kOwotCi0gICAgYXVkaW9faGFuZGxlID0gTlVMTDsKLSAgICB0aGlzLT5lbmFibGVkID0gMDsKLQotICAgIGlmIChwY21fYnVmICE9IE5VTEwpCi0gICAgewotICAgICAgICBTRExfRnJlZUF1ZGlvTWVtKHBjbV9idWYpOyAKLSAgICAgICAgcGNtX2J1ZiA9IE5VTEw7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBjaGFubmVsIHRyYW5zZmVyIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCAqLwotICAgIE5UT19Jbml0QXVkaW9QYXJhbXMoJmNwYXJhbXMpOwotCi0gICAgLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlICovCi0gICAgcnZhbCA9IHNuZF9wY21fb3Blbl9wcmVmZXJyZWQoJmF1ZGlvX2hhbmRsZSwgJmNhcmRubywgJmRldmljZW5vLCBPUEVOX0ZMQUdTKTsKLSAgICBpZiAocnZhbCA8IDApCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoIk5UT19PcGVuQXVkaW8oKTogc25kX3BjbV9vcGVuIGZhaWxlZDogJXNcbiIsIHNuZF9zdHJlcnJvcihydmFsKSk7Ci0gICAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLQotICAgIGlmICghTlRPX0NoZWNrQnVnZ3lDYXJkcyh0aGlzLCBRU0FfTU1BUF9XT1JLQVJPVU5EKSkKLSAgICB7Ci0gICAgICAgIC8qIGVuYWJsZSBjb3VudCBzdGF0dXMgcGFyYW1ldGVyICovCi0gICAgICAgIGlmICgocnZhbCA9IHNuZF9wY21fcGx1Z2luX3NldF9kaXNhYmxlKGF1ZGlvX2hhbmRsZSwgUExVR0lOX0RJU0FCTEVfTU1BUCkpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgU0RMX1NldEVycm9yKCJzbmRfcGNtX3BsdWdpbl9zZXRfZGlzYWJsZSBmYWlsZWQ6ICVzXG4iLCBzbmRfc3RyZXJyb3IocnZhbCkpOwotICAgICAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBUcnkgZm9yIGEgY2xvc2VzdCBtYXRjaCBvbiBhdWRpbyBmb3JtYXQgKi8KLSAgICBmb3JtYXQgPSAwOwotICAgIC8qIGNhbid0IHVzZSBmb3JtYXQgYXMgU05EX1BDTV9TRk1UX1U4ID0gMCBpbiBudG8gKi8KLSAgICBmb3VuZCA9IDA7Ci0KLSAgICBmb3IgKHRlc3RfZm9ybWF0PVNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7ICFmb3VuZCA7KQotICAgIHsKLSAgICAgICAgLyogaWYgbWF0Y2ggZm91bmQgc2V0IGZvcm1hdCB0byBlcXVpdmFsZW50IEFMU0EgZm9ybWF0ICovCi0gICAgICAgIHN3aXRjaCAodGVzdF9mb3JtYXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQVVESU9fVTg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBTTkRfUENNX1NGTVRfVTg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVVESU9fUzg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBTTkRfUENNX1NGTVRfUzg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVVESU9fUzE2TFNCOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gU05EX1BDTV9TRk1UX1MxNl9MRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBVURJT19TMTZNU0I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBTTkRfUENNX1NGTVRfUzE2X0JFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFVRElPX1UxNkxTQjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IFNORF9QQ01fU0ZNVF9VMTZfTEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVVESU9fVTE2TVNCOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gU05EX1BDTV9TRk1UX1UxNl9CRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFmb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgdGVzdF9mb3JtYXQgPSBTRExfTmV4dEF1ZGlvRm9ybWF0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhc3N1bWVzIHRlc3RfZm9ybWF0IG5vdCAwIG9uIHN1Y2Nlc3MgKi8KLSAgICBpZiAodGVzdF9mb3JtYXQgPT0gMCkKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiTlRPX09wZW5BdWRpbygpOiBDb3VsZG4ndCBmaW5kIGFueSBoYXJkd2FyZSBhdWRpbyBmb3JtYXRzIik7Ci0gICAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLQotICAgIHNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OwotCi0gICAgLyogU2V0IHRoZSBhdWRpbyBmb3JtYXQgKi8KLSAgICBjcGFyYW1zLmZvcm1hdC5mb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICAvKiBTZXQgbW9ubyBvciBzdGVyZW8gYXVkaW8gKGN1cnJlbnRseSBvbmx5IHR3byBjaGFubmVscyBzdXBwb3J0ZWQpICovCi0gICAgY3BhcmFtcy5mb3JtYXQudm9pY2VzID0gc3BlYy0+Y2hhbm5lbHM7Ci0JCi0gICAgLyogU2V0IHJhdGUgKi8KLSAgICBjcGFyYW1zLmZvcm1hdC5yYXRlID0gc3BlYy0+ZnJlcTsKLQotICAgIC8qIFNldHVwIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBjcGFyYW1zICovCi0gICAgcnZhbCA9IHNuZF9wY21fcGx1Z2luX3BhcmFtcyhhdWRpb19oYW5kbGUsICZjcGFyYW1zKTsKLSAgICBpZiAocnZhbCA8IDApCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoIk5UT19PcGVuQXVkaW8oKTogc25kX3BjbV9jaGFubmVsX3BhcmFtcyBmYWlsZWQ6ICVzXG4iLCBzbmRfc3RyZXJyb3IocnZhbCkpOwotICAgICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0KLSAgICAvKiBNYWtlIHN1cmUgY2hhbm5lbCBpcyBzZXR1cCByaWdodCBvbmUgbGFzdCB0aW1lICovCi0gICAgU0RMX21lbXNldCgmY3NldHVwLCAweDAwLCBzaXplb2YoY3NldHVwKSk7Ci0gICAgY3NldHVwLmNoYW5uZWwgPSBTTkRfUENNX0NIQU5ORUxfUExBWUJBQ0s7Ci0gICAgaWYgKHNuZF9wY21fcGx1Z2luX3NldHVwKGF1ZGlvX2hhbmRsZSwgJmNzZXR1cCkgPCAwKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJOVE9fT3BlbkF1ZGlvKCk6IFVuYWJsZSB0byBzZXR1cCBwbGF5YmFjayBjaGFubmVsXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGF1ZGlvIHNwZWNpZmljYXRpb24gKi8KLSAgICBTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCi0gICAgcGNtX2xlbiA9IHNwZWMtPnNpemU7Ci0KLSAgICBpZiAocGNtX2xlbj09MCkKLSAgICB7Ci0gICAgICAgIHBjbV9sZW4gPSBjc2V0dXAuYnVmLmJsb2NrLmZyYWdfc2l6ZSAqIHNwZWMtPmNoYW5uZWxzICogKHNuZF9wY21fZm9ybWF0X3dpZHRoKGZvcm1hdCkvOCk7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIHRoZSBhdWRpbyBidWZmZXIgYW5kIGluaXRpYWxpemUgd2l0aCBzaWxlbmNlIChOb3RlIHRoYXQKLSAgICAgICBidWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZnJhZ21lbnQgc2l6ZSwgc28gZmluZCBjbG9zZXN0IG11bHRpcGxlKQotICAgICovCi0gICAgcGNtX2J1ZiA9IChVaW50OCopU0RMX0FsbG9jQXVkaW9NZW0ocGNtX2xlbik7Ci0gICAgaWYgKHBjbV9idWYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiTlRPX09wZW5BdWRpbygpOiBwY20gYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotICAgIFNETF9tZW1zZXQocGNtX2J1Ziwgc3BlYy0+c2lsZW5jZSwgcGNtX2xlbik7Ci0KLSAgICAvKiBnZXQgdGhlIGZpbGUgZGVzY3JpcHRvciAqLwotICAgIGlmICgoYXVkaW9fZmQgPSBzbmRfcGNtX2ZpbGVfZGVzY3JpcHRvcihhdWRpb19oYW5kbGUsIFNORF9QQ01fQ0hBTk5FTF9QTEFZQkFDSykpIDwgMCkKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiTlRPX09wZW5BdWRpbygpOiBzbmRfcGNtX2ZpbGVfZGVzY3JpcHRvciBmYWlsZWQgd2l0aCBlcnJvciBjb2RlOiAlc1xuIiwgc25kX3N0cmVycm9yKHJ2YWwpKTsKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotCi0gICAgLyogVHJpZ2dlciBhdWRpbyBwbGF5YmFjayAqLwotICAgIHJ2YWwgPSBzbmRfcGNtX3BsdWdpbl9wcmVwYXJlKGF1ZGlvX2hhbmRsZSwgU05EX1BDTV9DSEFOTkVMX1BMQVlCQUNLKTsKLSAgICBpZiAocnZhbCA8IDApCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoInNuZF9wY21fcGx1Z2luX3ByZXBhcmUgZmFpbGVkOiAlc1xuIiwgc25kX3N0cmVycm9yKHJ2YWwpKTsKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotCi0gICAgdGhpcy0+ZW5hYmxlZCA9IDE7Ci0KLSAgICAvKiBHZXQgdGhlIHBhcmVudCBwcm9jZXNzIGlkICh3ZSdyZSB0aGUgcGFyZW50IG9mIHRoZSBhdWRpbyB0aHJlYWQpICovCi0gICAgcGFyZW50ID0gZ2V0cGlkKCk7Ci0KLSAgICAvKiBXZSdyZSByZWFsbHkgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCi0gICAgcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbnRvL1NETF9udG9fYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vbnRvL1NETF9udG9fYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmZDAwZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL250by9TRExfbnRvX2F1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfX1NETF9OVE9fQVVESU9fSF9fCi0jZGVmaW5lIF9fU0RMX05UT19BVURJT19IX18KLQotI2luY2x1ZGUgPHN5cy9hc291bmRsaWIuaD4KLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSBhdWRpbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YQotewotICAgIC8qIFRoZSBhdWRpbyBkZXZpY2UgaGFuZGxlICovCi0gICAgaW50IGNhcmRubzsKLSAgICBpbnQgZGV2aWNlbm87Ci0gICAgc25kX3BjbV90KiBhdWRpb19oYW5kbGU7Ci0KLSAgICAvKiBUaGUgYXVkaW8gZmlsZSBkZXNjcmlwdG9yICovCi0gICAgaW50IGF1ZGlvX2ZkOwotCi0gICAgLyogVGhlIHBhcmVudCBwcm9jZXNzIGlkLCB0byBkZXRlY3Qgd2hlbiBhcHBsaWNhdGlvbiBxdWl0cyAqLwotICAgIHBpZF90IHBhcmVudDsKLQotICAgIC8qIFJhdyBtaXhpbmcgYnVmZmVyICovCi0gICAgVWludDgqIHBjbV9idWY7Ci0gICAgVWludDMyIHBjbV9sZW47Ci0KLSAgICAvKiBRU0EgcGFyYW1ldGVycyAqLwotICAgIHNuZF9wY21fY2hhbm5lbF9zdGF0dXNfdCBjc3RhdHVzOwotICAgIHNuZF9wY21fY2hhbm5lbF9wYXJhbXNfdCBjcGFyYW1zOwotICAgIHNuZF9wY21fY2hhbm5lbF9zZXR1cF90ICBjc2V0dXA7Ci19OwotCi0jZGVmaW5lIGNhcmRubyAgICAgICAgICAodGhpcy0+aGlkZGVuLT5jYXJkbm8pCi0jZGVmaW5lIGRldmljZW5vICAgICAgICAodGhpcy0+aGlkZGVuLT5kZXZpY2VubykKLSNkZWZpbmUgYXVkaW9faGFuZGxlICAgICh0aGlzLT5oaWRkZW4tPmF1ZGlvX2hhbmRsZSkKLSNkZWZpbmUgYXVkaW9fZmQgICAgICAgICh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkKQotI2RlZmluZSBwYXJlbnQgICAgICAgICAgKHRoaXMtPmhpZGRlbi0+cGFyZW50KQotI2RlZmluZSBwY21fYnVmICAgICAgICAgKHRoaXMtPmhpZGRlbi0+cGNtX2J1ZikKLSNkZWZpbmUgcGNtX2xlbiAgICAgICAgICh0aGlzLT5oaWRkZW4tPnBjbV9sZW4pCi0jZGVmaW5lIGNzdGF0dXMgICAgICAgICAodGhpcy0+aGlkZGVuLT5jc3RhdHVzKQotI2RlZmluZSBjcGFyYW1zICAgICAgICAgKHRoaXMtPmhpZGRlbi0+Y3BhcmFtcykKLSNkZWZpbmUgY3NldHVwICAgICAgICAgICh0aGlzLT5oaWRkZW4tPmNzZXR1cCkKLQotI2VuZGlmIC8qIF9fU0RMX05UT19BVURJT19IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vcGF1ZGlvL1NETF9wYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vcGF1ZGlvL1NETF9wYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwN2I1OS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL3BhdWRpby9TRExfcGF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIENhcnN0ZW4gR3Jpd29kegotICAgIGdyaWZmQGtvbS50dS1kYXJtc3RhZHQuZGUKLQotICAgIGJhc2VkIG9uIGxpbnV4L1NETF9kc3BhdWRpby5jIGJ5IFNhbSBMYW50aW5nYQotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgotI2luY2x1ZGUgIlNETF9wYXVkaW8uaCIKLQotI2RlZmluZSBERUJVR19BVURJTyAxCi0KLS8qIEEgY29uZmxpY3Qgd2l0aGluIEFJWCA0LjMuMyA8c3lzLz4gaGVhZGVycyBhbmQgcHJvYmFibHkgb3RoZXJzIGFzIHdlbGwuCi0gKiBJIGd1ZXNzIG5vYm9keSBldmVyIHVzZXMgYXVkaW8uLi4gU2hhbWUgb3ZlciBBSVggaGVhZGVyIGZpbGVzLiAgKi8KLSNpbmNsdWRlIDxzeXMvbWFjaGluZS5oPgotI3VuZGVmIEJJR19FTkRJQU4KLSNpbmNsdWRlIDxzeXMvYXVkaW8uaD4KLQotLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgcGF1ZCBhdWRpbyAqLwotI2RlZmluZSBQYXVkX0RSSVZFUl9OQU1FICAgICAgICAgInBhdWQiCi0KLS8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2ssIGFuZCBkb24ndCBibG9jayBpZiBidXN5ICovCi0vKiAjZGVmaW5lIE9QRU5fRkxBR1MJKE9fV1JPTkxZfE9fTk9OQkxPQ0spICovCi0jZGVmaW5lIE9QRU5fRkxBR1MJT19XUk9OTFkKLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBQYXVkX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7Ci1zdGF0aWMgdm9pZCBQYXVkX1dhaXRBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgdm9pZCBQYXVkX1BsYXlBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgVWludDggKlBhdWRfR2V0QXVkaW9CdWYoX1RISVMpOwotc3RhdGljIHZvaWQgUGF1ZF9DbG9zZUF1ZGlvKF9USElTKTsKLQotLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKLXsKLQlpbnQgZmQ7Ci0JaW50IGF2YWlsYWJsZTsKLQotCWF2YWlsYWJsZSA9IDA7Ci0JZmQgPSBTRExfT3BlbkF1ZGlvUGF0aChOVUxMLCAwLCBPUEVOX0ZMQUdTLCAwKTsKLQlpZiAoIGZkID49IDAgKSB7Ci0JCWF2YWlsYWJsZSA9IDE7Ci0JCWNsb3NlKGZkKTsKLQl9Ci0JcmV0dXJuKGF2YWlsYWJsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKLXsKLQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0JU0RMX2ZyZWUoZGV2aWNlKTsKLX0KLQotc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfQXVkaW9EZXZpY2UgKnRoaXM7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7Ci0JaWYgKCB0aGlzICkgewotCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKLQkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0JfQotCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWlmICggdGhpcyApIHsKLQkJCVNETF9mcmVlKHRoaXMpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCWF1ZGlvX2ZkID0gLTE7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JdGhpcy0+T3BlbkF1ZGlvID0gUGF1ZF9PcGVuQXVkaW87Ci0JdGhpcy0+V2FpdEF1ZGlvID0gUGF1ZF9XYWl0QXVkaW87Ci0JdGhpcy0+UGxheUF1ZGlvID0gUGF1ZF9QbGF5QXVkaW87Ci0JdGhpcy0+R2V0QXVkaW9CdWYgPSBQYXVkX0dldEF1ZGlvQnVmOwotCXRoaXMtPkNsb3NlQXVkaW8gPSBQYXVkX0Nsb3NlQXVkaW87Ci0KLQl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIFBhdWRfYm9vdHN0cmFwID0gewotCVBhdWRfRFJJVkVSX05BTUUsICJBSVggUGF1ZGlvIiwKLQlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQotfTsKLQotLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCi1zdGF0aWMgdm9pZCBQYXVkX1dhaXRBdWRpbyhfVEhJUykKLXsKLSAgICBmZF9zZXQgZmRzZXQ7Ci0KLSAgICAvKiBTZWUgaWYgd2UgbmVlZCB0byB1c2UgdGltZWQgYXVkaW8gc3luY2hyb25pemF0aW9uICovCi0gICAgaWYgKCBmcmFtZV90aWNrcyApIHsKLSAgICAgICAgLyogVXNlIHRpbWVyIGZvciBnZW5lcmFsIGF1ZGlvIHN5bmNocm9uaXphdGlvbiAqLwotICAgICAgICBTaW50MzIgdGlja3M7Ci0KLSAgICAgICAgdGlja3MgPSAoKFNpbnQzMikobmV4dF9mcmFtZSAtIFNETF9HZXRUaWNrcygpKSktRlVER0VfVElDS1M7Ci0gICAgICAgIGlmICggdGlja3MgPiAwICkgewotCSAgICBTRExfRGVsYXkodGlja3MpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXVkaW9fYnVmZmVyICBwYXVkX2J1ZmluZm87Ci0KLSAgICAgICAgLyogVXNlIHNlbGVjdCgpIGZvciBhdWRpbyBzeW5jaHJvbml6YXRpb24gKi8KLSAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKLSAgICAgICAgRkRfWkVSTygmZmRzZXQpOwotICAgICAgICBGRF9TRVQoYXVkaW9fZmQsICZmZHNldCk7Ci0KLSAgICAgICAgaWYgKCBpb2N0bChhdWRpb19mZCwgQVVESU9fQlVGRkVSLCAmcGF1ZF9idWZpbmZvKSA8IDAgKSB7Ci0jaWZkZWYgREVCVUdfQVVESU8KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgZ2V0IGF1ZGlvIGJ1ZmZlciBpbmZvcm1hdGlvblxuIik7Ci0jZW5kaWYKLSAgICAgICAgICAgIHRpbWVvdXQudHZfc2VjICA9IDEwOwotICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLQkgICAgbG9uZyBtc19pbl9idWYgPSBwYXVkX2J1ZmluZm8ud3JpdGVfYnVmX3RpbWU7Ci0gICAgICAgICAgICB0aW1lb3V0LnR2X3NlYyAgPSBtc19pbl9idWYvMTAwMDsKLQkgICAgbXNfaW5fYnVmICAgICAgID0gbXNfaW5fYnVmIC0gdGltZW91dC50dl9zZWMqMTAwMDsKLSAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IG1zX2luX2J1ZioxMDAwOwotI2lmZGVmIERFQlVHX0FVRElPCi0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsCi0JCSAgICAgIldhaXRpbmcgZm9yIHdyaXRlX2J1Zl90aW1lPSVsZCwlbGRcbiIsCi0JCSAgICAgdGltZW91dC50dl9zZWMsCi0JCSAgICAgdGltZW91dC50dl91c2VjICk7Ci0jZW5kaWYKLQl9Ci0KLSNpZmRlZiBERUJVR19BVURJTwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhaXRpbmcgZm9yIGF1ZGlvIHRvIGdldCByZWFkeVxuIik7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCBzZWxlY3QoYXVkaW9fZmQrMSwgTlVMTCwgJmZkc2V0LCBOVUxMLCAmdGltZW91dCkgPD0gMCApIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UgPSAiQXVkaW8gdGltZW91dCAtIGJ1Z2d5IGF1ZGlvIGRyaXZlcj8gKGRpc2FibGVkKSI7Ci0gICAgICAgICAgICAvKgotCSAgICAgKiBJbiBnZW5lcmFsIHdlIHNob3VsZCBuZXZlciBwcmludCB0byB0aGUgc2NyZWVuLAotICAgICAgICAgICAgICogYnV0IGluIHRoaXMgY2FzZSB3ZSBoYXZlIG5vIG90aGVyIHdheSBvZiBsZXR0aW5nCi0gICAgICAgICAgICAgKiB0aGUgdXNlciBrbm93IHdoYXQgaGFwcGVuZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU0RMOiAlcyAtICVzXG4iLCBzdHJlcnJvcihlcnJubyksIG1lc3NhZ2UpOwotICAgICAgICAgICAgdGhpcy0+ZW5hYmxlZCA9IDA7Ci0gICAgICAgICAgICAvKiBEb24ndCB0cnkgdG8gY2xvc2UgLSBtYXkgaGFuZyAqLwotICAgICAgICAgICAgYXVkaW9fZmQgPSAtMTsKLSNpZmRlZiBERUJVR19BVURJTwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEb25lIGRpc2FibGluZyBhdWRpb1xuIik7Ci0jZW5kaWYKLSAgICAgICAgfQotI2lmZGVmIERFQlVHX0FVRElPCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVhZHkhXG4iKTsKLSNlbmRpZgotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgUGF1ZF9QbGF5QXVkaW8oX1RISVMpCi17Ci0JaW50IHdyaXR0ZW47Ci0KLQkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSwgY2hlY2tpbmcgZm9yIEVBR0FJTiBvbiBicm9rZW4gYXVkaW8gZHJpdmVycyAqLwotCWRvIHsKLQkJd3JpdHRlbiA9IHdyaXRlKGF1ZGlvX2ZkLCBtaXhidWYsIG1peGxlbik7Ci0JCWlmICggKHdyaXR0ZW4gPCAwKSAmJiAoKGVycm5vID09IDApIHx8IChlcnJubyA9PSBFQUdBSU4pKSApIHsKLQkJCVNETF9EZWxheSgxKTsJLyogTGV0IGEgbGl0dGxlIENQVSB0aW1lIGdvIGJ5ICovCi0JCX0KLQl9IHdoaWxlICggKHdyaXR0ZW4gPCAwKSAmJiAKLQkgICAgICAgICAgKChlcnJubyA9PSAwKSB8fCAoZXJybm8gPT0gRUFHQUlOKSB8fCAoZXJybm8gPT0gRUlOVFIpKSApOwotCi0JLyogSWYgdGltZXIgc3luY2hyb25pemF0aW9uIGlzIGVuYWJsZWQsIHNldCB0aGUgbmV4dCB3cml0ZSBmcmFtZSAqLwotCWlmICggZnJhbWVfdGlja3MgKSB7Ci0JCW5leHRfZnJhbWUgKz0gZnJhbWVfdGlja3M7Ci0JfQotCi0JLyogSWYgd2UgY291bGRuJ3Qgd3JpdGUsIGFzc3VtZSBmYXRhbCBlcnJvciBmb3Igbm93ICovCi0JaWYgKCB3cml0dGVuIDwgMCApIHsKLQkJdGhpcy0+ZW5hYmxlZCA9IDA7Ci0JfQotI2lmZGVmIERFQlVHX0FVRElPCi0JZnByaW50ZihzdGRlcnIsICJXcm90ZSAlZCBieXRlcyBvZiBhdWRpbyBkYXRhXG4iLCB3cml0dGVuKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgVWludDggKlBhdWRfR2V0QXVkaW9CdWYoX1RISVMpCi17Ci0JcmV0dXJuIG1peGJ1ZjsKLX0KLQotc3RhdGljIHZvaWQgUGF1ZF9DbG9zZUF1ZGlvKF9USElTKQotewotCWlmICggbWl4YnVmICE9IE5VTEwgKSB7Ci0JCVNETF9GcmVlQXVkaW9NZW0obWl4YnVmKTsKLQkJbWl4YnVmID0gTlVMTDsKLQl9Ci0JaWYgKCBhdWRpb19mZCA+PSAwICkgewotCQljbG9zZShhdWRpb19mZCk7Ci0JCWF1ZGlvX2ZkID0gLTE7Ci0JfQotfQotCi1zdGF0aWMgaW50IFBhdWRfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQotewotCWNoYXIgICAgICAgICAgYXVkaW9kZXZbMTAyNF07Ci0JaW50ICAgICAgICAgICBmb3JtYXQ7Ci0JaW50ICAgICAgICAgICBieXRlc19wZXJfc2FtcGxlOwotCVVpbnQxNiAgICAgICAgdGVzdF9mb3JtYXQ7Ci0JYXVkaW9faW5pdCAgICBwYXVkX2luaXQ7Ci0JYXVkaW9fYnVmZmVyICBwYXVkX2J1ZmluZm87Ci0JYXVkaW9fc3RhdHVzICBwYXVkX3N0YXR1czsKLQlhdWRpb19jb250cm9sIHBhdWRfY29udHJvbDsKLQlhdWRpb19jaGFuZ2UgIHBhdWRfY2hhbmdlOwotCi0JLyogUmVzZXQgdGhlIHRpbWVyIHN5bmNocm9uaXphdGlvbiBmbGFnICovCi0JZnJhbWVfdGlja3MgPSAwLjA7Ci0KLQkvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KLQlhdWRpb19mZCA9IFNETF9PcGVuQXVkaW9QYXRoKGF1ZGlvZGV2LCBzaXplb2YoYXVkaW9kZXYpLCBPUEVOX0ZMQUdTLCAwKTsKLQlpZiAoIGF1ZGlvX2ZkIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuICVzOiAlcyIsIGF1ZGlvZGV2LCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBXZSBjYW4ndCBzZXQgdGhlIGJ1ZmZlciBzaXplIC0ganVzdCBhc2sgdGhlIGRldmljZSBmb3IgdGhlIG1heGltdW0KLQkgKiB0aGF0IHdlIGNhbiBoYXZlLgotCSAqLwotCWlmICggaW9jdGwoYXVkaW9fZmQsIEFVRElPX0JVRkZFUiwgJnBhdWRfYnVmaW5mbykgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBhdWRpbyBidWZmZXIgaW5mb3JtYXRpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCW1peGJ1ZiA9IE5VTEw7Ci0KLQlpZiAoIHNwZWMtPmNoYW5uZWxzID4gMSApCi0JICAgIHNwZWMtPmNoYW5uZWxzID0gMjsKLQllbHNlCi0JICAgIHNwZWMtPmNoYW5uZWxzID0gMTsKLQotCS8qCi0JICogRmllbGRzIGluIHRoZSBhdWRpb19pbml0IHN0cnVjdHVyZToKLQkgKgotCSAqIElnbm9yZWQgYnkgdXM6Ci0JICoKLQkgKiBwYXVkLmxvYWRwYXRoW0xPQURfUEFUSF07ICogRFNQIGNvZGUgdG8gbG9hZCwgTVdhdmUgY2hpcCBvbmx5PwotCSAqIHBhdWQuc2xvdF9udW1iZXI7ICAgICAgICAgKiBzbG90IG51bWJlciBvZiB0aGUgYWRhcHRlcgotCSAqIHBhdWQuZGV2aWNlX2lkOyAgICAgICAgICAgKiBhZGFwdGVyIGlkZW50aWZpY2F0aW9uIG51bWJlcgotCSAqCi0JICogSW5wdXQ6Ci0JICoKLQkgKiBwYXVkLnNyYXRlOyAgICAgICAgICAgKiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIegotCSAqIHBhdWQuYml0c19wZXJfc2FtcGxlOyAqIDgsIDE2LCAzMiwgLi4uCi0JICogcGF1ZC5ic2l6ZTsgICAgICAgICAgICogYmxvY2sgc2l6ZSBmb3IgdGhpcyByYXRlCi0JICogcGF1ZC5tb2RlOyAgICAgICAgICAgICogQURQQ00sIFBDTSwgTVVfTEFXLCBBX0xBVywgU09VUkNFX01JWAotCSAqIHBhdWQuY2hhbm5lbHM7ICAgICAgICAqIDE9bW9ubywgMj1zdGVyZW8KLQkgKiBwYXVkLmZsYWdzOyAgICAgICAgICAgKiBGSVhFRCAtIGZpeGVkIGxlbmd0aCBkYXRhCi0JICogICAgICAgICAgICAgICAgICAgICAgICogTEVGVF9BTElHTkVELCBSSUdIVF9BTElHTkVEICh2YXIgbGVuIG9ubHkpCi0JICogICAgICAgICAgICAgICAgICAgICAgICogVFdPU19DT01QTEVNRU5UIC0gMidzIGNvbXBsZW1lbnQgZGF0YQotCSAqICAgICAgICAgICAgICAgICAgICAgICAqIFNJR05FRCAtIHNpZ25lZD8gY29tbWVudCBzZWVtcyB3cm9uZyBpbiBzeXMvYXVkaW8uaAotCSAqICAgICAgICAgICAgICAgICAgICAgICAqIEJJR19FTkRJQU4KLQkgKiBwYXVkLm9wZXJhdGlvbjsgICAgICAgKiBQTEFZLCBSRUNPUkQKLQkgKgotCSAqIE91dHB1dDoKLQkgKgotCSAqIHBhdWQuZmxhZ3M7ICAgICAgICAgICAqIFBJVENIICAgICAgICAgICAgLSBwaXRjaCBpcyBzdXBwb3J0ZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBJTlBVVCAgICAgICAgICAgIC0gaW5wdXQgaXMgc3VwcG9ydGVkCi0JICogICAgICAgICAgICAgICAgICAgICAgICogT1VUUFVUICAgICAgICAgICAtIG91dHB1dCBpcyBzdXBwb3J0ZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBNT05JVE9SICAgICAgICAgIC0gbW9uaXRvciBpcyBzdXBwb3J0ZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBWT0xVTUUgICAgICAgICAgIC0gdm9sdW1lIGlzIHN1cHBvcnRlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAqIFZPTFVNRV9ERUxBWSAgICAgLSB2b2x1bWUgZGVsYXkgaXMgc3VwcG9ydGVkCi0JICogICAgICAgICAgICAgICAgICAgICAgICogQkFMQU5DRSAgICAgICAgICAtIGJhbGFuY2UgaXMgc3VwcG9ydGVkCi0JICogICAgICAgICAgICAgICAgICAgICAgICogQkFMQU5DRV9ERUxBWSAgICAtIGJhbGFuY2UgZGVsYXkgaXMgc3VwcG9ydGVkCi0JICogICAgICAgICAgICAgICAgICAgICAgICogVFJFQkxFICAgICAgICAgICAtIHRyZWJsZSBjb250cm9sIGlzIHN1cHBvcnRlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAqIEJBU1MgICAgICAgICAgICAgLSBiYXNzIGNvbnRyb2wgaXMgc3VwcG9ydGVkCi0JICogICAgICAgICAgICAgICAgICAgICAgICogQkVTVEZJVF9QUk9WSURFRCAtIGJlc3QgZml0IHJldHVybmVkCi0JICogICAgICAgICAgICAgICAgICAgICAgICogTE9BRF9DT0RFICAgICAgICAtIERTUCBsb2FkIG5lZWRlZAotCSAqIHBhdWQucmM7ICAgICAgICAgICAgICAqIE5PX1BMQVkgICAgICAgICAtIERTUCBjb2RlIGNhbid0IGRvIHBsYXkgcmVxdWVzdHMKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBOT19SRUNPUkQgICAgICAgLSBEU1AgY29kZSBjYW4ndCBkbyByZWNvcmQgcmVxdWVzdHMKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBJTlZBTElEX1JFUVVFU1QgLSByZXF1ZXN0IHdhcyBpbnZhbGlkCi0JICogICAgICAgICAgICAgICAgICAgICAgICogQ09ORkxJQ1QgICAgICAgIC0gY29uZmxpY3Qgd2l0aCBvcGVuJ3MgZmxhZ3MKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBPVkVSTE9BREVEICAgICAgLSBvdXQgb2YgRFNQIE1JUFMgb3IgbWVtb3J5Ci0JICogcGF1ZC5wb3NpdGlvbl9yZXNvbHV0aW9uOyAqIHNtYWxsZXN0IGluY3JlbWVudCBmb3IgcG9zaXRpb24KLQkgKi8KLQotICAgICAgICBwYXVkX2luaXQuc3JhdGUgPSBzcGVjLT5mcmVxOwotCXBhdWRfaW5pdC5tb2RlID0gUENNOwotCXBhdWRfaW5pdC5vcGVyYXRpb24gPSBQTEFZOwotCXBhdWRfaW5pdC5jaGFubmVscyA9IHNwZWMtPmNoYW5uZWxzOwotCi0JLyogVHJ5IGZvciBhIGNsb3Nlc3QgbWF0Y2ggb24gYXVkaW8gZm9ybWF0ICovCi0JZm9ybWF0ID0gMDsKLQlmb3IgKCB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7Ci0JCQkJCQkhIGZvcm1hdCAmJiB0ZXN0X2Zvcm1hdDsgKSB7Ci0jaWZkZWYgREVCVUdfQVVESU8KLQkJZnByaW50ZihzdGRlcnIsICJUcnlpbmcgZm9ybWF0IDB4JTQuNHhcbiIsIHRlc3RfZm9ybWF0KTsKLSNlbmRpZgotCQlzd2l0Y2ggKCB0ZXN0X2Zvcm1hdCApIHsKLQkJCWNhc2UgQVVESU9fVTg6Ci0JCQkgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDE7Ci0JCQkgICAgcGF1ZF9pbml0LmJpdHNfcGVyX3NhbXBsZSA9IDg7Ci0JCQkgICAgcGF1ZF9pbml0LmZsYWdzID0gVFdPU19DT01QTEVNRU5UIHwgRklYRUQ7Ci0JCQkgICAgZm9ybWF0ID0gMTsKLQkJCSAgICBicmVhazsKLQkJCWNhc2UgQVVESU9fUzg6Ci0JCQkgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDE7Ci0JCQkgICAgcGF1ZF9pbml0LmJpdHNfcGVyX3NhbXBsZSA9IDg7Ci0JCQkgICAgcGF1ZF9pbml0LmZsYWdzID0gU0lHTkVEIHwKLQkJCQkJICAgICAgVFdPU19DT01QTEVNRU5UIHwgRklYRUQ7Ci0JCQkgICAgZm9ybWF0ID0gMTsKLQkJCSAgICBicmVhazsKLQkJCWNhc2UgQVVESU9fUzE2TFNCOgotCQkJICAgIGJ5dGVzX3Blcl9zYW1wbGUgPSAyOwotCQkJICAgIHBhdWRfaW5pdC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQkJCSAgICBwYXVkX2luaXQuZmxhZ3MgPSBTSUdORUQgfAotCQkJCQkgICAgICBUV09TX0NPTVBMRU1FTlQgfCBGSVhFRDsKLQkJCSAgICBmb3JtYXQgPSAxOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSBBVURJT19TMTZNU0I6Ci0JCQkgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDI7Ci0JCQkgICAgcGF1ZF9pbml0LmJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCQkJICAgIHBhdWRfaW5pdC5mbGFncyA9IEJJR19FTkRJQU4gfAotCQkJCQkgICAgICBTSUdORUQgfAotCQkJCQkgICAgICBUV09TX0NPTVBMRU1FTlQgfCBGSVhFRDsKLQkJCSAgICBmb3JtYXQgPSAxOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSBBVURJT19VMTZMU0I6Ci0JCQkgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDI7Ci0JCQkgICAgcGF1ZF9pbml0LmJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCQkJICAgIHBhdWRfaW5pdC5mbGFncyA9IFRXT1NfQ09NUExFTUVOVCB8IEZJWEVEOwotCQkJICAgIGZvcm1hdCA9IDE7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIEFVRElPX1UxNk1TQjoKLQkJCSAgICBieXRlc19wZXJfc2FtcGxlID0gMjsKLQkJCSAgICBwYXVkX2luaXQuYml0c19wZXJfc2FtcGxlID0gMTY7Ci0JCQkgICAgcGF1ZF9pbml0LmZsYWdzID0gQklHX0VORElBTiB8Ci0JCQkJCSAgICAgIFRXT1NfQ09NUExFTUVOVCB8IEZJWEVEOwotCQkJICAgIGZvcm1hdCA9IDE7Ci0JCQkgICAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICggISBmb3JtYXQgKSB7Ci0JCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKLQkJfQotCX0KLQlpZiAoIGZvcm1hdCA9PSAwICkgewotI2lmZGVmIERFQlVHX0FVRElPCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHNcbiIpOwotI2VuZGlmCi0JICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCBhbnkgaGFyZHdhcmUgYXVkaW8gZm9ybWF0cyIpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCXNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OwotCi0JLyoKLQkgKiBXZSBrbm93IHRoZSBidWZmZXIgc2l6ZSBhbmQgdGhlIG1heCBudW1iZXIgb2Ygc3Vic2VxdWVudCB3cml0ZXMKLQkgKiB0aGF0IGNhbiBiZSBwZW5kaW5nLiBJZiBtb3JlIHRoYW4gb25lIGNhbiBwZW5kLCBhbGxvdyB0aGUgYXBwbGljYXRpb24KLQkgKiB0byBkbyBzb21ldGhpbmcgbGlrZSBkb3VibGUgYnVmZmVyaW5nIGJldHdlZW4gb3VyIHdyaXRlIGJ1ZmZlciBhbmQKLQkgKiB0aGUgZGV2aWNlJ3Mgb3duIGJ1ZmZlciB0aGF0IHdlIGFyZSBmaWxsaW5nIHdpdGggd3JpdGUoKSBhbnl3YXkuCi0JICoKLQkgKiBXZSBjYWxjdWxhdGUgc3BlYy0+c2FtcGxlcyBsaWtlIHRoaXMgYmVjYXVzZSBTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKCkKLQkgKiB3aWxsIGdpdmUgcHV0IHBhdWRfYnVmaW5mby53cml0ZV9idWZfY2FwIChvciBwYXVkX2J1ZmluZm8ud3JpdGVfYnVmX2NhcC8yKQotCSAqIGludG8gc3BlYy0+c2l6ZSBpbiByZXR1cm4uCi0JICovCi0JaWYgKCBwYXVkX2J1ZmluZm8ucmVxdWVzdF9idWZfY2FwID09IDEgKQotCXsKLQkgICAgc3BlYy0+c2FtcGxlcyA9IHBhdWRfYnVmaW5mby53cml0ZV9idWZfY2FwCi0JCQkgIC8gYnl0ZXNfcGVyX3NhbXBsZQotCQkJICAvIHNwZWMtPmNoYW5uZWxzOwotCX0KLQllbHNlCi0JewotCSAgICBzcGVjLT5zYW1wbGVzID0gcGF1ZF9idWZpbmZvLndyaXRlX2J1Zl9jYXAKLQkJCSAgLyBieXRlc19wZXJfc2FtcGxlCi0JCQkgIC8gc3BlYy0+Y2hhbm5lbHMKLQkJCSAgLyAyOwotCX0KLSAgICAgICAgcGF1ZF9pbml0LmJzaXplID0gYnl0ZXNfcGVyX3NhbXBsZSAqIHNwZWMtPmNoYW5uZWxzOwotCi0JU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKLQotCS8qCi0JICogVGhlIEFJWCBwYXVkIGRldmljZSBpbml0IGNhbid0IG1vZGlmeSB0aGUgdmFsdWVzIG9mIHRoZSBhdWRpb19pbml0Ci0JICogc3RydWN0dXJlIHRoYXQgd2UgcGFzcyB0byBpdC4gU28gd2UgZG9uJ3QgbmVlZCBhbnkgcmVjYWxjdWxhdGlvbgotCSAqIG9mIHRoaXMgc3R1ZmYgYW5kIG5vIHJlaW5pdCBjYWxsIGFzIGluIGxpbnV4IGRzcCBhbmQgZG1hIGNvZGUuCi0JICoKLQkgKiAvZGV2L3BhdWQgc3VwcG9ydHMgYWxsIG9mIHRoZSBlbmNvZGluZyBmb3JtYXRzLCBzbyB3ZSBkb24ndCBuZWVkCi0JICogdG8gZG8gYW55dGhpbmcgbGlrZSByZW9wZW5pbmcgdGhlIGRldmljZSwgZWl0aGVyLgotCSAqLwotCWlmICggaW9jdGwoYXVkaW9fZmQsIEFVRElPX0lOSVQsICZwYXVkX2luaXQpIDwgMCApIHsKLQkgICAgc3dpdGNoICggcGF1ZF9pbml0LnJjICkKLQkgICAgewotCSAgICBjYXNlIDEgOgotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmb3JtYXQ6IERTUCBjYW4ndCBkbyBwbGF5IHJlcXVlc3RzIik7Ci0JCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMiA6Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZvcm1hdDogRFNQIGNhbid0IGRvIHJlY29yZCByZXF1ZXN0cyIpOwotCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDQgOgotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmb3JtYXQ6IHJlcXVlc3Qgd2FzIGludmFsaWQiKTsKLQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQkgICAgY2FzZSA1IDoKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgYXVkaW8gZm9ybWF0OiBjb25mbGljdCB3aXRoIG9wZW4ncyBmbGFncyIpOwotCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDYgOgotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmb3JtYXQ6IG91dCBvZiBEU1AgTUlQUyBvciBtZW1vcnkiKTsKLQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQkgICAgZGVmYXVsdCA6Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZvcm1hdDogbm90IGRvY3VtZW50ZWQgaW4gc3lzL2F1ZGlvLmgiKTsKLQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQkgICAgfQotCX0KLQotCS8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KLQltaXhsZW4gPSBzcGVjLT5zaXplOwotCW1peGJ1ZiA9IChVaW50OCAqKVNETF9BbGxvY0F1ZGlvTWVtKG1peGxlbik7Ci0JaWYgKCBtaXhidWYgPT0gTlVMTCApIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlTRExfbWVtc2V0KG1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7Ci0KLQkvKgotCSAqIFNldCBzb21lIHBhcmFtdGVyczogZnVsbCB2b2x1bWUsIGZpcnN0IHNwZWFrZXIgdGhhdCB3ZSBjYW4gZmluZC4KLQkgKiBJZ25vcmUgdGhlIG90aGVyIHNldHRpbmdzIGZvciBub3cuCi0JICovCi0JcGF1ZF9jaGFuZ2UuaW5wdXQgPSBBVURJT19JR05PUkU7ICAgICAgICAgLyogdGhlIG5ldyBpbnB1dCBzb3VyY2UgKi8KLSAgICAgICAgcGF1ZF9jaGFuZ2Uub3V0cHV0ID0gT1VUUFVUXzE7ICAgICAgICAgICAgLyogRVhURVJOQUxfU1BFQUtFUixJTlRFUk5BTF9TUEVBS0VSLE9VVFBVVF8xICovCi0gICAgICAgIHBhdWRfY2hhbmdlLm1vbml0b3IgPSBBVURJT19JR05PUkU7ICAgICAgIC8qIHRoZSBuZXcgbW9uaXRvciBzdGF0ZSAqLwotICAgICAgICBwYXVkX2NoYW5nZS52b2x1bWUgPSAweDdmZmZmZmZmOyAgICAgICAgICAvKiB2b2x1bWUgbGV2ZWwgWzAtMHg3ZmZmZmZmZl0gKi8KLSAgICAgICAgcGF1ZF9jaGFuZ2Uudm9sdW1lX2RlbGF5ID0gQVVESU9fSUdOT1JFOyAgLyogdGhlIG5ldyB2b2x1bWUgZGVsYXkgKi8KLSAgICAgICAgcGF1ZF9jaGFuZ2UuYmFsYW5jZSA9IDB4M2ZmZmZmZmY7ICAgICAgICAgLyogdGhlIG5ldyBiYWxhbmNlICovCi0gICAgICAgIHBhdWRfY2hhbmdlLmJhbGFuY2VfZGVsYXkgPSBBVURJT19JR05PUkU7IC8qIHRoZSBuZXcgYmFsYW5jZSBkZWxheSAqLwotICAgICAgICBwYXVkX2NoYW5nZS50cmVibGUgPSBBVURJT19JR05PUkU7ICAgICAgICAvKiB0aGUgbmV3IHRyZWJsZSBzdGF0ZSAqLwotICAgICAgICBwYXVkX2NoYW5nZS5iYXNzID0gQVVESU9fSUdOT1JFOyAgICAgICAgICAvKiB0aGUgbmV3IGJhc3Mgc3RhdGUgKi8KLSAgICAgICAgcGF1ZF9jaGFuZ2UucGl0Y2ggPSBBVURJT19JR05PUkU7ICAgICAgICAgLyogdGhlIG5ldyBwaXRjaCBzdGF0ZSAqLwotCi0JcGF1ZF9jb250cm9sLmlvY3RsX3JlcXVlc3QgPSBBVURJT19DSEFOR0U7Ci0JcGF1ZF9jb250cm9sLnJlcXVlc3RfaW5mbyA9IChjaGFyKikmcGF1ZF9jaGFuZ2U7Ci0JaWYgKCBpb2N0bChhdWRpb19mZCwgQVVESU9fQ09OVFJPTCwgJnBhdWRfY29udHJvbCkgPCAwICkgewotI2lmZGVmIERFQlVHX0FVRElPCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGNoYW5nZSBhdWRpbyBkaXNwbGF5IHNldHRpbmdzXG4iICk7Ci0jZW5kaWYKLQl9Ci0KLQkvKgotCSAqIFRlbGwgdGhlIGRldmljZSB0byBleHBlY3QgZGF0YS4gQWN0dWFsIHN0YXJ0IHdpbGwgd2FpdCBmb3IKLQkgKiB0aGUgZmlyc3Qgd3JpdGUoKSBjYWxsLgotCSAqLwotCXBhdWRfY29udHJvbC5pb2N0bF9yZXF1ZXN0ID0gQVVESU9fU1RBUlQ7Ci0JcGF1ZF9jb250cm9sLnBvc2l0aW9uID0gMDsKLQlpZiAoIGlvY3RsKGF1ZGlvX2ZkLCBBVURJT19DT05UUk9MLCAmcGF1ZF9jb250cm9sKSA8IDAgKSB7Ci0jaWZkZWYgREVCVUdfQVVESU8KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgc3RhcnQgYXVkaW8gcGxheVxuIiApOwotI2VuZGlmCi0JICAgIFNETF9TZXRFcnJvcigiQ2FuJ3Qgc3RhcnQgYXVkaW8gcGxheSIpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHVzZSBzZWxlY3QoKSB3b3JrYXJvdW5kICovCi0gICAgICAgIHsgY2hhciAqd29ya2Fyb3VuZDsKLSAgICAgICAgICAgICAgICB3b3JrYXJvdW5kID0gU0RMX2dldGVudigiU0RMX0RTUF9OT1NFTEVDVCIpOwotICAgICAgICAgICAgICAgIGlmICggd29ya2Fyb3VuZCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3RpY2tzID0gKGZsb2F0KShzcGVjLT5zYW1wbGVzKjEwMDApL3NwZWMtPmZyZXE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2ZyYW1lID0gU0RMX0dldFRpY2tzKCkrZnJhbWVfdGlja3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQkvKiBHZXQgdGhlIHBhcmVudCBwcm9jZXNzIGlkICh3ZSdyZSB0aGUgcGFyZW50IG9mIHRoZSBhdWRpbyB0aHJlYWQpICovCi0JcGFyZW50ID0gZ2V0cGlkKCk7Ci0KLQkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9wYXVkaW8vU0RMX3BhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9wYXVkaW8vU0RMX3BhdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2YyMmVkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vcGF1ZGlvL1NETF9wYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfcGF1ZGF1ZGlvX2gKLSNkZWZpbmUgX1NETF9wYXVkYXVkaW9faAotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKLQotc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKLQkvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCi0JaW50IGF1ZGlvX2ZkOwotCi0JLyogVGhlIHBhcmVudCBwcm9jZXNzIGlkLCB0byBkZXRlY3Qgd2hlbiBhcHBsaWNhdGlvbiBxdWl0cyAqLwotCXBpZF90IHBhcmVudDsKLQotCS8qIFJhdyBtaXhpbmcgYnVmZmVyICovCi0JVWludDggKm1peGJ1ZjsKLQlpbnQgICAgbWl4bGVuOwotCi0JLyogU3VwcG9ydCBmb3IgYXVkaW8gdGltaW5nIHVzaW5nIGEgdGltZXIsIGluIGFkZGl0aW9uIHRvIHNlbGVjdCgpICovCi0JZmxvYXQgZnJhbWVfdGlja3M7Ci0JZmxvYXQgbmV4dF9mcmFtZTsKLX07Ci0jZGVmaW5lIEZVREdFX1RJQ0tTCTEwCS8qIFRoZSBzY2hlZHVsZXIgb3ZlcmhlYWQgdGlja3MgcGVyIGZyYW1lICovCi0KLS8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLwotI2RlZmluZSBhdWRpb19mZAkJKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQpCi0jZGVmaW5lIHBhcmVudAkJCSh0aGlzLT5oaWRkZW4tPnBhcmVudCkKLSNkZWZpbmUgbWl4YnVmCQkJKHRoaXMtPmhpZGRlbi0+bWl4YnVmKQotI2RlZmluZSBtaXhsZW4JCQkodGhpcy0+aGlkZGVuLT5taXhsZW4pCi0jZGVmaW5lIGZyYW1lX3RpY2tzCQkodGhpcy0+aGlkZGVuLT5mcmFtZV90aWNrcykKLSNkZWZpbmUgbmV4dF9mcmFtZQkJKHRoaXMtPmhpZGRlbi0+bmV4dF9mcmFtZSkKLQotI2VuZGlmIC8qIF9TRExfcGF1ZGF1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vc3VuL1NETF9zdW5hdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9zdW4vU0RMX3N1bmF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZGFiYTEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9zdW4vU0RMX3N1bmF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgX19ORVRCU0RfXwotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9hdWRpb2lvLmg+Ci0jZW5kaWYKLSNpZmRlZiBfX1NWUjQKLSNpbmNsdWRlIDxzeXMvYXVkaW9pby5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCi0jaW5jbHVkZSAiU0RMX3N1bmF1ZGlvLmgiCi0KLS8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2ssIGFuZCBkb24ndCBibG9jayBpZiBidXN5ICovCi0jZGVmaW5lIE9QRU5fRkxBR1MJKE9fV1JPTkxZfE9fTk9OQkxPQ0spCi0KLS8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRFNQX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7Ci1zdGF0aWMgdm9pZCBEU1BfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyB2b2lkIERTUF9QbGF5QXVkaW8oX1RISVMpOwotc3RhdGljIFVpbnQ4ICpEU1BfR2V0QXVkaW9CdWYoX1RISVMpOwotc3RhdGljIHZvaWQgRFNQX0Nsb3NlQXVkaW8oX1RISVMpOwotCi1zdGF0aWMgVWludDggc25kMmF1KGludCBzYW1wbGUpOwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotCWludCBmZDsKLQlpbnQgYXZhaWxhYmxlOwotCi0JYXZhaWxhYmxlID0gMDsKLQlmZCA9IFNETF9PcGVuQXVkaW9QYXRoKE5VTEwsIDAsIE9QRU5fRkxBR1MsIDEpOwotCWlmICggZmQgPj0gMCApIHsKLQkJYXZhaWxhYmxlID0gMTsKLQkJY2xvc2UoZmQpOwotCX0KLQlyZXR1cm4oYXZhaWxhYmxlKTsKLX0KLQotc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9BdWRpb0RldmljZSAqdGhpczsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLQlpZiAoIHRoaXMgKSB7Ci0JCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOwotCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQl9Ci0JaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCB0aGlzICkgewotCQkJU0RMX2ZyZWUodGhpcyk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0JYXVkaW9fZmQgPSAtMTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQl0aGlzLT5PcGVuQXVkaW8gPSBEU1BfT3BlbkF1ZGlvOwotCXRoaXMtPldhaXRBdWRpbyA9IERTUF9XYWl0QXVkaW87Ci0JdGhpcy0+UGxheUF1ZGlvID0gRFNQX1BsYXlBdWRpbzsKLQl0aGlzLT5HZXRBdWRpb0J1ZiA9IERTUF9HZXRBdWRpb0J1ZjsKLQl0aGlzLT5DbG9zZUF1ZGlvID0gRFNQX0Nsb3NlQXVkaW87Ci0KLQl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIFNVTkFVRElPX2Jvb3RzdHJhcCA9IHsKLQkiYXVkaW8iLCAiVU5JWCAvZGV2L2F1ZGlvIGludGVyZmFjZSIsCi0JQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKLX07Ci0KLSNpZmRlZiBERUJVR19BVURJTwotdm9pZCBDaGVja1VuZGVyZmxvdyhfVEhJUykKLXsKLSNpZmRlZiBBVURJT19HRVRJTkZPCi0JYXVkaW9faW5mb190IGluZm87Ci0JaW50IGxlZnQ7Ci0KLQlpb2N0bChhdWRpb19mZCwgQVVESU9fR0VUSU5GTywgJmluZm8pOwotCWxlZnQgPSAod3JpdHRlbiAtIGluZm8ucGxheS5zYW1wbGVzKTsKLQlpZiAoIHdyaXR0ZW4gJiYgKGxlZnQgPT0gMCkgKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiYXVkaW8gdW5kZXJmbG93IVxuIik7Ci0JfQotI2VuZGlmCi19Ci0jZW5kaWYKLQotdm9pZCBEU1BfV2FpdEF1ZGlvKF9USElTKQotewotI2lmZGVmIEFVRElPX0dFVElORk8KLSNkZWZpbmUgU0xFRVBfRlVER0UJMTAJCS8qIDEwIG1zIHNjaGVkdWxpbmcgZnVkZ2UgZmFjdG9yICovCi0JYXVkaW9faW5mb190IGluZm87Ci0JU2ludDMyIGxlZnQ7Ci0KLQlpb2N0bChhdWRpb19mZCwgQVVESU9fR0VUSU5GTywgJmluZm8pOwotCWxlZnQgPSAod3JpdHRlbiAtIGluZm8ucGxheS5zYW1wbGVzKTsKLQlpZiAoIGxlZnQgPiBmcmFnc2l6ZSApIHsKLQkJU2ludDMyIHNsZWVweTsKLQotCQlzbGVlcHkgPSAoKGxlZnQgLSBmcmFnc2l6ZSkvZnJlcXVlbmN5KTsKLQkJc2xlZXB5IC09IFNMRUVQX0ZVREdFOwotCQlpZiAoIHNsZWVweSA+IDAgKSB7Ci0JCQlTRExfRGVsYXkoc2xlZXB5KTsKLQkJfQotCX0KLSNlbHNlCi0JZmRfc2V0IGZkc2V0OwotCi0JRkRfWkVSTygmZmRzZXQpOwotCUZEX1NFVChhdWRpb19mZCwgJmZkc2V0KTsKLQlzZWxlY3QoYXVkaW9fZmQrMSwgTlVMTCwgJmZkc2V0LCBOVUxMLCBOVUxMKTsKLSNlbmRpZgotfQotCi12b2lkIERTUF9QbGF5QXVkaW8oX1RISVMpCi17Ci0JLyogV3JpdGUgdGhlIGF1ZGlvIGRhdGEgKi8KLQlpZiAoIHVsYXdfb25seSApIHsKLQkJLyogQXNzdW1pbmcgdGhhdCB0aGlzLT5zcGVjLmZyZXEgPj0gODAwMCBIeiAqLwotCQlpbnQgYWNjdW0sIGluY3IsIHBvczsKLQkJVWludDggKmF1YnVmOwotCi0JCWFjY3VtID0gMDsKLQkJaW5jciAgPSB0aGlzLT5zcGVjLmZyZXEvODsKLQkJYXVidWYgPSB1bGF3X2J1ZjsKLQkJc3dpdGNoIChhdWRpb19mbXQgJiAweEZGKSB7Ci0JCQljYXNlIDg6IHsKLQkJCQlVaW50OCAqc25kYnVmOwotCi0JCQkJc25kYnVmID0gbWl4YnVmOwotCQkJCWZvciAoIHBvcz0wOyBwb3MgPCBmcmFnc2l6ZTsgKytwb3MgKSB7Ci0JCQkJCSphdWJ1ZiA9IHNuZDJhdSgoMHg4MC0qc25kYnVmKSo2NCk7Ci0JCQkJCWFjY3VtICs9IGluY3I7Ci0JCQkJCXdoaWxlICggYWNjdW0gPiAwICkgewotCQkJCQkJYWNjdW0gLT0gMTAwMDsKLQkJCQkJCXNuZGJ1ZiArPSAxOwotCQkJCQl9Ci0JCQkJCWF1YnVmICs9IDE7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCQljYXNlIDE2OiB7Ci0JCQkJU2ludDE2ICpzbmRidWY7Ci0KLQkJCQlzbmRidWYgPSAoU2ludDE2ICopbWl4YnVmOwotCQkJCWZvciAoIHBvcz0wOyBwb3MgPCBmcmFnc2l6ZTsgKytwb3MgKSB7Ci0JCQkJCSphdWJ1ZiA9IHNuZDJhdSgqc25kYnVmLzQpOwotCQkJCQlhY2N1bSArPSBpbmNyOwotCQkJCQl3aGlsZSAoIGFjY3VtID4gMCApIHsKLQkJCQkJCWFjY3VtIC09IDEwMDA7Ci0JCQkJCQlzbmRidWYgKz0gMTsKLQkJCQkJfQotCQkJCQlhdWJ1ZiArPSAxOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0jaWZkZWYgREVCVUdfQVVESU8KLQkJQ2hlY2tVbmRlcmZsb3codGhpcyk7Ci0jZW5kaWYKLQkJaWYgKCB3cml0ZShhdWRpb19mZCwgdWxhd19idWYsIGZyYWdzaXplKSA8IDAgKSB7Ci0JCQkvKiBBc3N1bWUgZmF0YWwgZXJyb3IsIGZvciBub3cgKi8KLQkJCXRoaXMtPmVuYWJsZWQgPSAwOwotCQl9Ci0JCXdyaXR0ZW4gKz0gZnJhZ3NpemU7Ci0JfSBlbHNlIHsKLSNpZmRlZiBERUJVR19BVURJTwotCQlDaGVja1VuZGVyZmxvdyh0aGlzKTsKLSNlbmRpZgotCQlpZiAoIHdyaXRlKGF1ZGlvX2ZkLCBtaXhidWYsIHRoaXMtPnNwZWMuc2l6ZSkgPCAwICkgewotCQkJLyogQXNzdW1lIGZhdGFsIGVycm9yLCBmb3Igbm93ICovCi0JCQl0aGlzLT5lbmFibGVkID0gMDsKLQkJfQotCQl3cml0dGVuICs9IGZyYWdzaXplOwotCX0KLX0KLQotVWludDggKkRTUF9HZXRBdWRpb0J1ZihfVEhJUykKLXsKLQlyZXR1cm4obWl4YnVmKTsKLX0KLQotdm9pZCBEU1BfQ2xvc2VBdWRpbyhfVEhJUykKLXsKLQlpZiAoIG1peGJ1ZiAhPSBOVUxMICkgewotCQlTRExfRnJlZUF1ZGlvTWVtKG1peGJ1Zik7Ci0JCW1peGJ1ZiA9IE5VTEw7Ci0JfQotCWlmICggdWxhd19idWYgIT0gTlVMTCApIHsKLQkJU0RMX2ZyZWUodWxhd19idWYpOwotCQl1bGF3X2J1ZiA9IE5VTEw7Ci0JfQotCWNsb3NlKGF1ZGlvX2ZkKTsKLX0KLQotaW50IERTUF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCi17Ci0JY2hhciBhdWRpb2RldlsxMDI0XTsKLSNpZmRlZiBBVURJT19TRVRJTkZPCi0JaW50IGVuYzsKLSNlbmRpZgotCWludCBkZXNpcmVkX2ZyZXEgPSBzcGVjLT5mcmVxOwotCi0JLyogSW5pdGlhbGl6ZSBvdXIgZnJlZWFibGUgdmFyaWFibGVzLCBpbiBjYXNlIHdlIGZhaWwqLwotCWF1ZGlvX2ZkID0gLTE7Ci0JbWl4YnVmID0gTlVMTDsKLQl1bGF3X2J1ZiA9IE5VTEw7Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIGF1ZGlvIHBhcmFtZXRlcnMgZnJvbSB0aGUgQXVkaW9TcGVjICovCi0Jc3dpdGNoICggc3BlYy0+Zm9ybWF0ICYgMHhGRiApIHsKLQotCQljYXNlIDg6IHsgLyogVW5zaWduZWQgOCBiaXQgYXVkaW8gZGF0YSAqLwotCQkJc3BlYy0+Zm9ybWF0ID0gQVVESU9fVTg7Ci0jaWZkZWYgQVVESU9fU0VUSU5GTwotCQkJZW5jID0gQVVESU9fRU5DT0RJTkdfTElORUFSODsKLSNlbmRpZgotCQl9Ci0JCWJyZWFrOwotCi0JCWNhc2UgMTY6IHsgLyogU2lnbmVkIDE2IGJpdCBhdWRpbyBkYXRhICovCi0JCSAgICAgICAgc3BlYy0+Zm9ybWF0ID0gQVVESU9fUzE2U1lTOwotI2lmZGVmIEFVRElPX1NFVElORk8KLQkJCWVuYyA9IEFVRElPX0VOQ09ESU5HX0xJTkVBUjsKLSNlbmRpZgotCQl9Ci0JCWJyZWFrOwotCi0JCWRlZmF1bHQ6IHsKLQkJCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0Iik7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JfQotCWF1ZGlvX2ZtdCA9IHNwZWMtPmZvcm1hdDsKLQotCS8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLwotCWF1ZGlvX2ZkID0gU0RMX09wZW5BdWRpb1BhdGgoYXVkaW9kZXYsIHNpemVvZihhdWRpb2RldiksIE9QRU5fRkxBR1MsIDEpOwotCWlmICggYXVkaW9fZmQgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gJXM6ICVzIiwgYXVkaW9kZXYsCi0JCQkgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JdWxhd19vbmx5ID0gMDsJCS8qIG1vZGVybiBTdW5zIGRvIHN1cHBvcnQgbGluZWFyIGF1ZGlvICovCi0jaWZkZWYgQVVESU9fU0VUSU5GTwotCWZvcig7OykgewotCSAgICBhdWRpb19pbmZvX3QgaW5mbzsKLQkgICAgQVVESU9fSU5JVElORk8oJmluZm8pOyAvKiBpbml0IGFsbCBmaWVsZHMgdG8gIm5vIGNoYW5nZSIgKi8KLQotCSAgICAvKiBUcnkgdG8gc2V0IHRoZSByZXF1ZXN0ZWQgc2V0dGluZ3MgKi8KLQkgICAgaW5mby5wbGF5LnNhbXBsZV9yYXRlID0gc3BlYy0+ZnJlcTsKLQkgICAgaW5mby5wbGF5LmNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7Ci0JICAgIGluZm8ucGxheS5wcmVjaXNpb24gPSAoZW5jID09IEFVRElPX0VOQ09ESU5HX1VMQVcpCi0JCSAgICAgICAgICAgICAgICAgID8gOCA6IHNwZWMtPmZvcm1hdCAmIDB4ZmY7Ci0JICAgIGluZm8ucGxheS5lbmNvZGluZyA9IGVuYzsKLQkgICAgaWYoIGlvY3RsKGF1ZGlvX2ZkLCBBVURJT19TRVRJTkZPLCAmaW5mbykgPT0gMCApIHsKLQotCQkvKiBDaGVjayB0byBiZSBzdXJlIHdlIGdvdCB3aGF0IHdlIHdhbnRlZCAqLwotCQlpZihpb2N0bChhdWRpb19mZCwgQVVESU9fR0VUSU5GTywgJmluZm8pIDwgMCkgewotCQkgICAgU0RMX1NldEVycm9yKCJFcnJvciBnZXR0aW5nIGF1ZGlvIHBhcmFtZXRlcnM6ICVzIiwKLQkJCQkgc3RyZXJyb3IoZXJybm8pKTsKLQkJICAgIHJldHVybiAtMTsKLQkJfQotCQlpZihpbmZvLnBsYXkuZW5jb2RpbmcgPT0gZW5jCi0JCSAgICYmIGluZm8ucGxheS5wcmVjaXNpb24gPT0gKHNwZWMtPmZvcm1hdCAmIDB4ZmYpCi0JCSAgICYmIGluZm8ucGxheS5jaGFubmVscyA9PSBzcGVjLT5jaGFubmVscykgewotCQkgICAgLyogWW93ISBBbGwgc2VlbXMgdG8gYmUgd2VsbCEgKi8KLQkJICAgIHNwZWMtPmZyZXEgPSBpbmZvLnBsYXkuc2FtcGxlX3JhdGU7Ci0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgICAgc3dpdGNoKGVuYykgewotCSAgICBjYXNlIEFVRElPX0VOQ09ESU5HX0xJTkVBUjg6Ci0JCS8qIHVuc2lnbmVkIDhiaXQgYXBwYXJlbnRseSBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KLQkJZW5jID0gQVVESU9fRU5DT0RJTkdfTElORUFSOwotCQlzcGVjLT5mb3JtYXQgPSBBVURJT19TMTZTWVM7Ci0JCWJyZWFrOwkvKiB0cnkgYWdhaW4gKi8KLQotCSAgICBjYXNlIEFVRElPX0VOQ09ESU5HX0xJTkVBUjoKLQkJLyogbGluZWFyIDE2Yml0IGRpZG4ndCB3b3JrIGVpdGhlciwgcmVzb3J0IHRvILUtbGF3ICovCi0JCWVuYyA9IEFVRElPX0VOQ09ESU5HX1VMQVc7Ci0JCXNwZWMtPmNoYW5uZWxzID0gMTsKLQkJc3BlYy0+ZnJlcSA9IDgwMDA7Ci0JCXNwZWMtPmZvcm1hdCA9IEFVRElPX1U4OwotCQl1bGF3X29ubHkgPSAxOwotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCQkvKiBvaCB3ZWxsLi4uICovCi0JCVNETF9TZXRFcnJvcigiRXJyb3Igc2V0dGluZyBhdWRpbyBwYXJhbWV0ZXJzOiAlcyIsCi0JCQkgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBBVURJT19TRVRJTkZPICovCi0Jd3JpdHRlbiA9IDA7Ci0KLQkvKiBXZSBjYW4gYWN0dWFsbHkgY29udmVydCBvbi10aGUtZmx5IHRvIFUtTGF3ICovCi0JaWYgKCB1bGF3X29ubHkgKSB7Ci0JICAgICAgICBzcGVjLT5mcmVxID0gZGVzaXJlZF9mcmVxOwotCQlmcmFnc2l6ZSA9IChzcGVjLT5zYW1wbGVzKjEwMDApLyhzcGVjLT5mcmVxLzgpOwotCQlmcmVxdWVuY3kgPSA4OwotCQl1bGF3X2J1ZiA9IChVaW50OCAqKVNETF9tYWxsb2MoZnJhZ3NpemUpOwotCQlpZiAoIHVsYXdfYnVmID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJc3BlYy0+Y2hhbm5lbHMgPSAxOwotCX0gZWxzZSB7Ci0JCWZyYWdzaXplID0gc3BlYy0+c2FtcGxlczsKLQkJZnJlcXVlbmN5ID0gc3BlYy0+ZnJlcS8xMDAwOwotCX0KLSNpZmRlZiBERUJVR19BVURJTwotCWZwcmludGYoc3RkZXJyLCAiQXVkaW8gZGV2aWNlICVzIFUtTGF3IG9ubHlcbiIsIAotCQkJCXVsYXdfb25seSA/ICJpcyIgOiAiaXMgbm90Iik7Ci0JZnByaW50ZihzdGRlcnIsICJmb3JtYXQ9MHgleCBjaGFuPSVkIGZyZXE9JWRcbiIsCi0JCXNwZWMtPmZvcm1hdCwgc3BlYy0+Y2hhbm5lbHMsIHNwZWMtPmZyZXEpOwotI2VuZGlmCi0KLQkvKiBVcGRhdGUgdGhlIGZyYWdtZW50IHNpemUgYXMgc2l6ZSBpbiBieXRlcyAqLwotCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7Ci0KLQkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCi0JbWl4YnVmID0gKFVpbnQ4ICopU0RMX0FsbG9jQXVkaW9NZW0oc3BlYy0+c2l6ZSk7Ci0JaWYgKCBtaXhidWYgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCVNETF9tZW1zZXQobWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKLQotCS8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLwotCXJldHVybigwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoaXMgZnVuY3Rpb24gKHNuZDJhdSgpKSBjb3B5cmlnaHRlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICBDb3B5cmlnaHQgMTk4OSBieSBSaWNoIEdvcHN0ZWluIGFuZCBIYXJyaXMgQ29ycG9yYXRpb24gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgICAqLwotLyogICAgICBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyAgICAgICAgKi8KLS8qICAgICAgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgICAgICAgICovCi0vKiAgICAgIGFwcGVhcnMgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgICAqLwotLyogICAgICB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCAgKi8KLS8qICAgICAgdGhhdCB0aGUgbmFtZSBvZiBSaWNoIEdvcHN0ZWluIGFuZCBIYXJyaXMgQ29ycG9yYXRpb24gbm90IGJlICAgICovCi0vKiAgICAgIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uICAgICAqLwotLyogICAgICBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgICAgKi8KLS8qICAgICAgUmljaCBHb3BzdGVpbiBhbmQgSGFycmlzIENvcnBvcmF0aW9uIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zICAgICovCi0vKiAgICAgIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0ICAgICAqLwotLyogICAgICBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBVaW50OCBzbmQyYXUoaW50IHNhbXBsZSkKLXsKLQotCWludCBtYXNrOwotCi0JaWYgKHNhbXBsZSA8IDApIHsKLQkJc2FtcGxlID0gLXNhbXBsZTsKLQkJbWFzayA9IDB4N2Y7Ci0JfSBlbHNlIHsKLQkJbWFzayA9IDB4ZmY7Ci0JfQotCi0JaWYgKHNhbXBsZSA8IDMyKSB7Ci0JCXNhbXBsZSA9IDB4RjAgfCAoMTUgLSBzYW1wbGUgLyAyKTsKLQl9IGVsc2UgaWYgKHNhbXBsZSA8IDk2KSB7Ci0JCXNhbXBsZSA9IDB4RTAgfCAoMTUgLSAoc2FtcGxlIC0gMzIpIC8gNCk7Ci0JfSBlbHNlIGlmIChzYW1wbGUgPCAyMjQpIHsKLQkJc2FtcGxlID0gMHhEMCB8ICgxNSAtIChzYW1wbGUgLSA5NikgLyA4KTsKLQl9IGVsc2UgaWYgKHNhbXBsZSA8IDQ4MCkgewotCQlzYW1wbGUgPSAweEMwIHwgKDE1IC0gKHNhbXBsZSAtIDIyNCkgLyAxNik7Ci0JfSBlbHNlIGlmIChzYW1wbGUgPCA5OTIpIHsKLQkJc2FtcGxlID0gMHhCMCB8ICgxNSAtIChzYW1wbGUgLSA0ODApIC8gMzIpOwotCX0gZWxzZSBpZiAoc2FtcGxlIDwgMjAxNikgewotCQlzYW1wbGUgPSAweEEwIHwgKDE1IC0gKHNhbXBsZSAtIDk5MikgLyA2NCk7Ci0JfSBlbHNlIGlmIChzYW1wbGUgPCA0MDY0KSB7Ci0JCXNhbXBsZSA9IDB4OTAgfCAoMTUgLSAoc2FtcGxlIC0gMjAxNikgLyAxMjgpOwotCX0gZWxzZSBpZiAoc2FtcGxlIDwgODE2MCkgewotCQlzYW1wbGUgPSAweDgwIHwgKDE1IC0gKHNhbXBsZSAtIDQwNjQpIC8gIDI1Nik7Ci0JfSBlbHNlIHsKLQkJc2FtcGxlID0gMHg4MDsKLQl9Ci0JcmV0dXJuIChtYXNrICYgc2FtcGxlKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vc3VuL1NETF9zdW5hdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9zdW4vU0RMX3N1bmF1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjBkNWUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby9zdW4vU0RMX3N1bmF1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2xvd2F1ZGlvX2gKLSNkZWZpbmUgX1NETF9sb3dhdWRpb19oCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcwotCi1zdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgewotCS8qIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBhdWRpbyBkZXZpY2UgKi8KLQlpbnQgYXVkaW9fZmQ7Ci0KLQlVaW50MTYgYXVkaW9fZm10OyAgICAgICAgLyogVGhlIGFwcCBhdWRpbyBmb3JtYXQgKi8KLQlVaW50OCAqbWl4YnVmOyAgICAgICAgICAgLyogVGhlIGFwcCBtaXhpbmcgYnVmZmVyICovCi0JaW50IHVsYXdfb25seTsgICAgICAgICAgIC8qIEZsYWcgLS0gZG9lcyBoYXJkd2FyZSBvbmx5IG91dHB1dCBVLWxhdz8gKi8KLQlVaW50OCAqdWxhd19idWY7ICAgICAgICAgLyogVGhlIFUtbGF3IG1peGluZyBidWZmZXIgKi8KLQlTaW50MzIgd3JpdHRlbjsgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBzYW1wbGVzIHdyaXR0ZW4gKi8KLQlpbnQgZnJhZ3NpemU7ICAgICAgICAgICAgLyogVGhlIGF1ZGlvIGZyYWdtZW50IHNpemUgaW4gc2FtcGxlcyAqLwotCWludCBmcmVxdWVuY3k7ICAgICAgICAgICAvKiBUaGUgYXVkaW8gZnJlcXVlbmN5IGluIEtIeiAqLwotfTsKLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIGF1ZGlvX2ZkCQkodGhpcy0+aGlkZGVuLT5hdWRpb19mZCkKLSNkZWZpbmUgYXVkaW9fZm10CQkodGhpcy0+aGlkZGVuLT5hdWRpb19mbXQpCi0jZGVmaW5lIG1peGJ1ZgkJCSh0aGlzLT5oaWRkZW4tPm1peGJ1ZikKLSNkZWZpbmUgdWxhd19vbmx5CQkodGhpcy0+aGlkZGVuLT51bGF3X29ubHkpCi0jZGVmaW5lIHVsYXdfYnVmCQkodGhpcy0+aGlkZGVuLT51bGF3X2J1ZikKLSNkZWZpbmUgd3JpdHRlbgkJCSh0aGlzLT5oaWRkZW4tPndyaXR0ZW4pCi0jZGVmaW5lIGZyYWdzaXplCQkodGhpcy0+aGlkZGVuLT5mcmFnc2l6ZSkKLSNkZWZpbmUgZnJlcXVlbmN5CQkodGhpcy0+aGlkZGVuLT5mcmVxdWVuY3kpCi0KLSNlbmRpZiAvKiBfU0RMX2xvd2F1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vdW1zL1NETF91bXNhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby91bXMvU0RMX3Vtc2F1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NzNiNTYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby91bXMvU0RMX3Vtc2F1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIENhcnN0ZW4gR3Jpd29kegotICAgIGdyaWZmQGtvbS50dS1kYXJtc3RhZHQuZGUKLQotICAgIGJhc2VkIG9uIGxpbnV4L1NETF9kc3BhdWRpby5jIGJ5IFNhbSBMYW50aW5nYQotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCi0jaW5jbHVkZSAiU0RMX3Vtc2F1ZGlvLmgiCi0KLS8qIFRoZSB0YWcgbmFtZSB1c2VkIGJ5IFVNUyBhdWRpbyAqLwotI2RlZmluZSBVTVNfRFJJVkVSX05BTUUgICAgICAgICAidW1zIgotCi0jZGVmaW5lIERFQlVHX0FVRElPIDEKLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBVTVNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIFVNU19QbGF5QXVkaW8oX1RISVMpOwotc3RhdGljIFVpbnQ4ICpVTVNfR2V0QXVkaW9CdWYoX1RISVMpOwotc3RhdGljIHZvaWQgVU1TX0Nsb3NlQXVkaW8oX1RISVMpOwotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURPcGVuKF9USElTLCAgc3RyaW5nIGRldmljZSwgc3RyaW5nIG1vZGUsIGxvbmcgZmxhZ3MpOwotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEQ2xvc2UoX1RISVMpOwotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFER2V0Qml0c1BlclNhbXBsZShfVEhJUywgbG9uZyogYml0cyk7Ci1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRCaXRzUGVyU2FtcGxlKF9USElTLCBsb25nIGJpdHMpOwotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0U2FtcGxlUmF0ZShfVEhJUywgbG9uZyByYXRlLCBsb25nKiBzZXRfcmF0ZSk7Ci1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRCeXRlT3JkZXIoX1RISVMsIHN0cmluZyBieXRlX29yZGVyKTsKLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldEF1ZGlvRm9ybWF0VHlwZShfVEhJUywgc3RyaW5nIGZtdCk7Ci1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXROdW1iZXJGb3JtYXQoX1RISVMsIHN0cmluZyBmbXQpOwotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFESW5pdGlhbGl6ZShfVEhJUyk7Ci1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTdGFydChfVEhJUyk7Ci1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTdG9wKF9USElTKTsKLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldFRpbWVGb3JtYXQoX1RISVMsICBVTVNBdWRpb1R5cGVzX1RpbWVGb3JtYXQgZm10ICk7Ci1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZUJ1ZmZTaXplKF9USElTLCAgbG9uZyogYnVmZl9zaXplICk7Ci1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZUJ1ZmZSZW1haW4oX1RISVMsICBsb25nKiBidWZmX3NpemUgKTsKLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFdyaXRlQnVmZlVzZWQoX1RISVMsICBsb25nKiBidWZmX3NpemUgKTsKLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldERNQUJ1ZmZlclNpemUoX1RISVMsICBsb25nIGJ5dGVzLCBsb25nKiBieXRlc19yZXQgKTsKLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldFZvbHVtZShfVEhJUywgIGxvbmcgdm9sdW1lICk7Ci1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRCYWxhbmNlKF9USElTLCAgbG9uZyBiYWxhbmNlICk7Ci1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRDaGFubmVscyhfVEhJUywgIGxvbmcgY2hhbm5lbHMgKTsKLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFBsYXlSZW1haW5pbmdEYXRhKF9USElTLCAgYm9vbGVhbiBibG9jayApOwotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFERW5hYmxlT3V0cHV0KF9USElTLCAgc3RyaW5nIG91dHB1dCwgbG9uZyogbGVmdF9nYWluLCBsb25nKiByaWdodF9nYWluKTsKLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFdyaXRlKF9USElTLCAgVU1TQXVkaW9UeXBlc19CdWZmZXIqIGJ1ZmYsIGxvbmcgc2FtcGxlcywgbG9uZyogc2FtcGxlc193cml0dGVuKTsKLQotLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShfVEhJUykKLXsKLSAgICBpZih0aGlzLT5oaWRkZW4tPnBsYXlidWYuX2J1ZmZlcikgU0RMX2ZyZWUodGhpcy0+aGlkZGVuLT5wbGF5YnVmLl9idWZmZXIpOwotICAgIGlmKHRoaXMtPmhpZGRlbi0+ZmlsbGJ1Zi5fYnVmZmVyKSBTRExfZnJlZSh0aGlzLT5oaWRkZW4tPmZpbGxidWYuX2J1ZmZlcik7Ci0gICAgX3NvbUZyZWUoIHRoaXMtPmhpZGRlbi0+dW1zZGV2ICk7Ci0gICAgU0RMX2ZyZWUodGhpcy0+aGlkZGVuKTsKLSAgICBTRExfZnJlZSh0aGlzKTsKLX0KLQotc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLSAgICBTRExfQXVkaW9EZXZpY2UgKnRoaXM7Ci0KLSAgICAvKgotICAgICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG1hbmFnZW1lbnQgc3RvcmFnZSBhbmQgcHJpdmF0ZSBtYW5hZ2VtZW50Ci0gICAgICogc3RvcmFnZSBmb3IgdGhpcyBTREwtdXNpbmcgbGlicmFyeS4KLSAgICAgKi8KLSAgICB0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOwotICAgIGlmICggdGhpcyApIHsKLSAgICAgICAgU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0gICAgICAgIHRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKilTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotICAgIH0KLSAgICBpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICBpZiAoIHRoaXMgKSB7Ci0gICAgICAgICAgICBTRExfZnJlZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLSNpZmRlZiBERUJVR19BVURJTwotICAgIGZwcmludGYoc3RkZXJyLCAiQ3JlYXRpbmcgVU1TIEF1ZGlvIGRldmljZVxuIik7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogQ2FsbHMgZm9yIFVNUyBlbnYgaW5pdGlhbGl6YXRpb24gYW5kIGF1ZGlvIG9iamVjdCBjb25zdHJ1Y3Rpb24uCi0gICAgICovCi0gICAgdGhpcy0+aGlkZGVuLT5ldiAgICAgPSBzb21HZXRHbG9iYWxFbnZpcm9ubWVudCgpOwotICAgIHRoaXMtPmhpZGRlbi0+dW1zZGV2ID0gVU1TQXVkaW9EZXZpY2VOZXcoKTsKLQotICAgIC8qCi0gICAgICogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycy4KLSAgICAgKi8KLSAgICB0aGlzLT5PcGVuQXVkaW8gICA9IFVNU19PcGVuQXVkaW87Ci0gICAgdGhpcy0+V2FpdEF1ZGlvICAgPSBOVUxMOyAgICAgICAgICAgLyogd2UgZG8gYmxvY2tpbmcgb3V0cHV0ICovCi0gICAgdGhpcy0+UGxheUF1ZGlvICAgPSBVTVNfUGxheUF1ZGlvOwotICAgIHRoaXMtPkdldEF1ZGlvQnVmID0gVU1TX0dldEF1ZGlvQnVmOwotICAgIHRoaXMtPkNsb3NlQXVkaW8gID0gVU1TX0Nsb3NlQXVkaW87Ci0gICAgdGhpcy0+ZnJlZSAgICAgICAgPSBBdWRpb19EZWxldGVEZXZpY2U7Ci0KLSNpZmRlZiBERUJVR19BVURJTwotICAgIGZwcmludGYoc3RkZXJyLCAiZG9uZVxuIik7Ci0jZW5kaWYKLSAgICByZXR1cm4gdGhpczsKLX0KLQotQXVkaW9Cb290U3RyYXAgVU1TX2Jvb3RzdHJhcCA9IHsKLQlVTVNfRFJJVkVSX05BTUUsICJBSVggVU1TIGF1ZGlvIiwKLQlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQotfTsKLQotc3RhdGljIFVpbnQ4ICpVTVNfR2V0QXVkaW9CdWYoX1RISVMpCi17Ci0jaWZkZWYgREVCVUdfQVVESU8KLSAgICBmcHJpbnRmKHN0ZGVyciwgImVudGVyIFVNU19HZXRBdWRpb0J1ZlxuIik7Ci0jZW5kaWYKLSAgICByZXR1cm4gdGhpcy0+aGlkZGVuLT5maWxsYnVmLl9idWZmZXI7Ci0vKgotICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZTsKLSAgICBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIHJjOwotCi0gICAgcmMgPSBVQURTZXRUaW1lRm9ybWF0KHRoaXMsIFVNU0F1ZGlvVHlwZXNfQnl0ZXMgKTsKLSAgICByYyA9IFVBRFdyaXRlQnVmZlNpemUodGhpcywgIGJ1ZlNpemUgKTsKLSovCi19Ci0KLXN0YXRpYyB2b2lkIFVNU19DbG9zZUF1ZGlvKF9USElTKQotewotICAgIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgcmM7Ci0KLSNpZmRlZiBERUJVR19BVURJTwotICAgIGZwcmludGYoc3RkZXJyLCAiZW50ZXIgVU1TX0Nsb3NlQXVkaW9cbiIpOwotI2VuZGlmCi0gICAgcmMgPSBVQURQbGF5UmVtYWluaW5nRGF0YSh0aGlzLCBUUlVFKTsKLSAgICByYyA9IFVBRFN0b3AodGhpcyk7Ci0gICAgcmMgPSBVQURDbG9zZSh0aGlzKTsKLX0KLQotc3RhdGljIHZvaWQgVU1TX1BsYXlBdWRpbyhfVEhJUykKLXsKLSAgICBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIHJjOwotICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1RvV3JpdGU7Ci0gICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzV3JpdHRlbjsKLSAgICBVTVNBdWRpb1R5cGVzX0J1ZmZlciAgICAgIHN3cGJ1ZjsKLQotI2lmZGVmIERFQlVHX0FVRElPCi0gICAgZnByaW50ZihzdGRlcnIsICJlbnRlciBVTVNfUGxheUF1ZGlvXG4iKTsKLSNlbmRpZgotICAgIHNhbXBsZXNUb1dyaXRlID0gdGhpcy0+aGlkZGVuLT5wbGF5YnVmLl9sZW5ndGgvdGhpcy0+aGlkZGVuLT5ieXRlc1BlclNhbXBsZTsKLSAgICBkbwotICAgIHsKLSAgICAgICAgcmMgPSBVQURXcml0ZSh0aGlzLCAgJnRoaXMtPmhpZGRlbi0+cGxheWJ1ZiwKLQkJICAgICAgIHNhbXBsZXNUb1dyaXRlLAotCSAgICAgICAgICAgICAgICZzYW1wbGVzV3JpdHRlbiApOwotCXNhbXBsZXNUb1dyaXRlIC09IHNhbXBsZXNXcml0dGVuOwotCi0JLyogcmMgdmFsdWVzOiBVTVNBdWRpb0RldmljZV9TdWNjZXNzCi0JICogICAgICAgICAgICBVTVNBdWRpb0RldmljZV9GYWlsdXJlCi0JICogICAgICAgICAgICBVTVNBdWRpb0RldmljZV9QcmVlbXB0ZWQKLQkgKiAgICAgICAgICAgIFVNU0F1ZGlvRGV2aWNlX0ludGVycnVwdGVkCi0JICogICAgICAgICAgICBVTVNBdWRpb0RldmljZV9EZXZpY2VFcnJvcgotCSAqLwotCWlmICggcmMgPT0gVU1TQXVkaW9EZXZpY2VfRGV2aWNlRXJyb3IgKSB7Ci0jaWZkZWYgREVCVUdfQVVESU8KLQkgICAgZnByaW50ZihzdGRlcnIsICJSZXR1cm5pbmcgZnJvbSBQbGF5QXVkaW8gd2l0aCBkZXZpY2VzIGVycm9yXG4iKTsKLSNlbmRpZgotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLSAgICB3aGlsZShzYW1wbGVzVG9Xcml0ZT4wKTsKLQotICAgIFNETF9Mb2NrQXVkaW8oKTsKLSAgICBTRExfbWVtY3B5KCAmc3dwYnVmLCAgICAgICAgICAgICAgICAmdGhpcy0+aGlkZGVuLT5wbGF5YnVmLCBzaXplb2YoVU1TQXVkaW9UeXBlc19CdWZmZXIpICk7Ci0gICAgU0RMX21lbWNweSggJnRoaXMtPmhpZGRlbi0+cGxheWJ1ZiwgJnRoaXMtPmhpZGRlbi0+ZmlsbGJ1Ziwgc2l6ZW9mKFVNU0F1ZGlvVHlwZXNfQnVmZmVyKSApOwotICAgIFNETF9tZW1jcHkoICZ0aGlzLT5oaWRkZW4tPmZpbGxidWYsICZzd3BidWYsICAgICAgICAgICAgICAgIHNpemVvZihVTVNBdWRpb1R5cGVzX0J1ZmZlcikgKTsKLSAgICBTRExfVW5sb2NrQXVkaW8oKTsKLQotI2lmZGVmIERFQlVHX0FVRElPCi0gICAgZnByaW50ZihzdGRlcnIsICJXcm90ZSBhdWRpbyBkYXRhIGFuZCBzd2FwcGVkIGJ1ZmZlclxuIik7Ci0jZW5kaWYKLX0KLQotI2lmIDAKLS8vIAkvKiBTZXQgdGhlIERTUCBmcmVxdWVuY3kgKi8KLS8vIAl2YWx1ZSA9IHNwZWMtPmZyZXE7Ci0vLyAJaWYgKCBpb2N0bCh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCBTT1VORF9QQ01fV1JJVEVfUkFURSwgJnZhbHVlKSA8IDAgKSB7Ci0vLyAJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZyZXF1ZW5jeSIpOwotLy8gCQlyZXR1cm4oLTEpOwotLy8gCX0KLS8vIAlzcGVjLT5mcmVxID0gdmFsdWU7Ci0jZW5kaWYKLQotc3RhdGljIGludCBVTVNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQotewotICAgIGNoYXIqICBhdWRpb2RldiA9ICIvZGV2L3BhdWQwIjsKLSAgICBsb25nICAgbGdhaW47Ci0gICAgbG9uZyAgIHJnYWluOwotICAgIGxvbmcgICBvdXRSYXRlOwotICAgIGxvbmcgICBvdXRCdWZTaXplOwotICAgIGxvbmcgICBiaXRzUGVyU2FtcGxlOwotICAgIGxvbmcgICBzYW1wbGVzUGVyU2VjOwotICAgIGxvbmcgICBzdWNjZXNzOwotICAgIFVpbnQxNiB0ZXN0X2Zvcm1hdDsKLSAgICBpbnQgICAgZnJhZ19zcGVjOwotICAgIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgcmM7Ci0KLSNpZmRlZiBERUJVR19BVURJTwotICAgIGZwcmludGYoc3RkZXJyLCAiZW50ZXIgVU1TX09wZW5BdWRpb1xuIik7Ci0jZW5kaWYKLSAgICByYyA9IFVBRE9wZW4odGhpcywgYXVkaW9kZXYsIlBMQVkiLCBVTVNBdWRpb0RldmljZV9CbG9ja2luZ0lPKTsKLSAgICBpZiAoIHJjICE9IFVNU0F1ZGlvRGV2aWNlX1N1Y2Nlc3MgKSB7Ci0JU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuICVzOiAlcyIsIGF1ZGlvZGV2LCBzdHJlcnJvcihlcnJubykpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gCi0gICAgcmMgPSBVQURTZXRBdWRpb0Zvcm1hdFR5cGUodGhpcywgIlBDTSIpOyAKLQotICAgIHN1Y2Nlc3MgPSAwOwotICAgIHRlc3RfZm9ybWF0ID0gU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoc3BlYy0+Zm9ybWF0KTsKLSAgICBkbwotICAgIHsKLSNpZmRlZiBERUJVR19BVURJTwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyBmb3JtYXQgMHglNC40eFxuIiwgdGVzdF9mb3JtYXQpOwotI2VuZGlmCi0gICAgICAgIHN3aXRjaCAoIHRlc3RfZm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICBjYXNlIEFVRElPX1U4OgotLyogZnJvbSB0aGUgbWFjIGNvZGU6IGJldHRlciA/ICovCi0vKiBzYW1wbGVfYml0cyA9IHNwZWMtPnNpemUgLyBzcGVjLT5zYW1wbGVzIC8gc3BlYy0+Y2hhbm5lbHMgKiA4OyAqLwotCSAgICBzdWNjZXNzICAgICAgID0gMTsKLSAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUgPSA4OwotICAgICAgICAgICAgcmMgPSBVQURTZXRTYW1wbGVSYXRlKHRoaXMsICBzcGVjLT5mcmVxIDw8IDE2LCAmb3V0UmF0ZSApOwotICAgICAgICAgICAgcmMgPSBVQURTZXRCeXRlT3JkZXIodGhpcywgIk1TQiIpOyAgICAgICAvKiBpcnJlbGV2YW50ICovCi0gICAgICAgICAgICByYyA9IFVBRFNldE51bWJlckZvcm1hdCh0aGlzLCAiVU5TSUdORUQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX1M4OgotCSAgICBzdWNjZXNzICAgICAgID0gMTsKLSAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUgPSA4OwotICAgICAgICAgICAgcmMgPSBVQURTZXRTYW1wbGVSYXRlKHRoaXMsICBzcGVjLT5mcmVxIDw8IDE2LCAmb3V0UmF0ZSApOwotICAgICAgICAgICAgcmMgPSBVQURTZXRCeXRlT3JkZXIodGhpcywgIk1TQiIpOyAgICAgICAvKiBpcnJlbGV2YW50ICovCi0gICAgICAgICAgICByYyA9IFVBRFNldE51bWJlckZvcm1hdCh0aGlzLCAiU0lHTkVEIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19TMTZMU0I6Ci0JICAgIHN1Y2Nlc3MgICAgICAgPSAxOwotICAgICAgICAgICAgYml0c1BlclNhbXBsZSA9IDE2OwotICAgICAgICAgICAgcmMgPSBVQURTZXRTYW1wbGVSYXRlKHRoaXMsICBzcGVjLT5mcmVxIDw8IDE2LCAmb3V0UmF0ZSApOwotICAgICAgICAgICAgcmMgPSBVQURTZXRCeXRlT3JkZXIodGhpcywgIkxTQiIpOwotICAgICAgICAgICAgcmMgPSBVQURTZXROdW1iZXJGb3JtYXQodGhpcywgIlNJR05FRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fUzE2TVNCOgotCSAgICBzdWNjZXNzICAgICAgID0gMTsKLSAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUgPSAxNjsKLSAgICAgICAgICAgIHJjID0gVUFEU2V0U2FtcGxlUmF0ZSh0aGlzLCAgc3BlYy0+ZnJlcSA8PCAxNiwgJm91dFJhdGUgKTsKLSAgICAgICAgICAgIHJjID0gVUFEU2V0Qnl0ZU9yZGVyKHRoaXMsICJNU0IiKTsKLSAgICAgICAgICAgIHJjID0gVUFEU2V0TnVtYmVyRm9ybWF0KHRoaXMsICJTSUdORUQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX1UxNkxTQjoKLQkgICAgc3VjY2VzcyAgICAgICA9IDE7Ci0gICAgICAgICAgICBiaXRzUGVyU2FtcGxlID0gMTY7Ci0gICAgICAgICAgICByYyA9IFVBRFNldFNhbXBsZVJhdGUodGhpcywgIHNwZWMtPmZyZXEgPDwgMTYsICZvdXRSYXRlICk7Ci0gICAgICAgICAgICByYyA9IFVBRFNldEJ5dGVPcmRlcih0aGlzLCAiTFNCIik7Ci0gICAgICAgICAgICByYyA9IFVBRFNldE51bWJlckZvcm1hdCh0aGlzLCAiVU5TSUdORUQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX1UxNk1TQjoKLQkgICAgc3VjY2VzcyAgICAgICA9IDE7Ci0gICAgICAgICAgICBiaXRzUGVyU2FtcGxlID0gMTY7Ci0gICAgICAgICAgICByYyA9IFVBRFNldFNhbXBsZVJhdGUodGhpcywgIHNwZWMtPmZyZXEgPDwgMTYsICZvdXRSYXRlICk7Ci0gICAgICAgICAgICByYyA9IFVBRFNldEJ5dGVPcmRlcih0aGlzLCAiTVNCIik7Ci0gICAgICAgICAgICByYyA9IFVBRFNldE51bWJlckZvcm1hdCh0aGlzLCAiVU5TSUdORUQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhIHN1Y2Nlc3MgKSB7Ci0gICAgICAgICAgICB0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB3aGlsZSAoICEgc3VjY2VzcyAmJiB0ZXN0X2Zvcm1hdCApOwotCi0gICAgaWYgKCBzdWNjZXNzID09IDAgKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCBhbnkgaGFyZHdhcmUgYXVkaW8gZm9ybWF0cyIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7Ci0KLSAgICBmb3IgKCBmcmFnX3NwZWMgPSAwOyAoMHgwMTw8ZnJhZ19zcGVjKSA8IHNwZWMtPnNpemU7ICsrZnJhZ19zcGVjICk7Ci0gICAgaWYgKCAoMHgwMTw8ZnJhZ19zcGVjKSAhPSBzcGVjLT5zaXplICkgewotICAgICAgICBTRExfU2V0RXJyb3IoIkZyYWdtZW50IHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICggZnJhZ19zcGVjID4gMjA0OCApIGZyYWdfc3BlYyA9IDIwNDg7Ci0KLSAgICB0aGlzLT5oaWRkZW4tPmJ5dGVzUGVyU2FtcGxlICAgPSAoYml0c1BlclNhbXBsZSAvIDgpICogc3BlYy0+Y2hhbm5lbHM7Ci0gICAgc2FtcGxlc1BlclNlYyAgICAgICAgICAgICAgICAgID0gdGhpcy0+aGlkZGVuLT5ieXRlc1BlclNhbXBsZSAqIG91dFJhdGU7Ci0KLSAgICB0aGlzLT5oaWRkZW4tPnBsYXlidWYuX2xlbmd0aCAgPSAwOwotICAgIHRoaXMtPmhpZGRlbi0+cGxheWJ1Zi5fbWF4aW11bSA9IHNwZWMtPnNpemU7Ci0gICAgdGhpcy0+aGlkZGVuLT5wbGF5YnVmLl9idWZmZXIgID0gKHVuc2lnbmVkIGNoYXIqKVNETF9tYWxsb2Moc3BlYy0+c2l6ZSk7Ci0gICAgdGhpcy0+aGlkZGVuLT5maWxsYnVmLl9sZW5ndGggID0gMDsKLSAgICB0aGlzLT5oaWRkZW4tPmZpbGxidWYuX21heGltdW0gPSBzcGVjLT5zaXplOwotICAgIHRoaXMtPmhpZGRlbi0+ZmlsbGJ1Zi5fYnVmZmVyICA9ICh1bnNpZ25lZCBjaGFyKilTRExfbWFsbG9jKHNwZWMtPnNpemUpOwotCi0gICAgcmMgPSBVQURTZXRCaXRzUGVyU2FtcGxlKHRoaXMsICBiaXRzUGVyU2FtcGxlICk7Ci0gICAgcmMgPSBVQURTZXRETUFCdWZmZXJTaXplKHRoaXMsICBmcmFnX3NwZWMsICZvdXRCdWZTaXplICk7Ci0gICAgcmMgPSBVQURTZXRDaGFubmVscyh0aGlzLCBzcGVjLT5jaGFubmVscyk7ICAgICAgLyogZnVuY3Rpb25zIHJlZHVjZXMgdG8gbW9ubyBvciBzdGVyZW8gKi8KLQotICAgIGxnYWluID0gMTAwOyAvKm1heGltdW0gbGVmdCBpbnB1dCBnYWluKi8KLSAgICByZ2FpbiA9IDEwMDsgLyptYWltdW0gcmlnaHQgaW5wdXQgZ2FpbiovCi0gICAgcmMgPSBVQURFbmFibGVPdXRwdXQodGhpcywgIkxJTkVfT1VUIiwmbGdhaW4sJnJnYWluKTsKLSAgICByYyA9IFVBREluaXRpYWxpemUodGhpcyk7Ci0gICAgcmMgPSBVQURTdGFydCh0aGlzKTsKLSAgICByYyA9IFVBRFNldFZvbHVtZSh0aGlzLCAxMDApOwotICAgIHJjID0gVUFEU2V0QmFsYW5jZSh0aGlzLCAwKTsKLQotICAgIC8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLwotICAgIHJldHVybiAwOwotfQotCi0MCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURHZXRCaXRzUGVyU2FtcGxlKF9USElTLCBsb25nKiBiaXRzKQotewotICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9nZXRfYml0c19wZXJfc2FtcGxlKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKLQkJCQkJICAgICAgIHRoaXMtPmhpZGRlbi0+ZXYsCi0JCQkJCSAgICAgICBiaXRzICk7Ci19Ci0KLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldEJpdHNQZXJTYW1wbGUoX1RISVMsIGxvbmcgYml0cykKLXsKLSAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfc2V0X2JpdHNfcGVyX3NhbXBsZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCi0JCQkJCSAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAotCQkJCQkgICAgICAgYml0cyApOwotfQotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRTYW1wbGVSYXRlKF9USElTLCBsb25nIHJhdGUsIGxvbmcqIHNldF9yYXRlKQotewotICAgIC8qIGZyb20gdGhlIG1hYyBjb2RlOiBzYW1wbGUgcmF0ZSA9IHNwZWMtPmZyZXEgPDwgMTY7ICovCi0gICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3NldF9zYW1wbGVfcmF0ZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCi0JCQkJCSAgIHRoaXMtPmhpZGRlbi0+ZXYsCi0JCQkJCSAgIHJhdGUsCi0JCQkJCSAgIHNldF9yYXRlICk7Ci19Ci0KLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldEJ5dGVPcmRlcihfVEhJUywgc3RyaW5nIGJ5dGVfb3JkZXIpCi17Ci0gICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3NldF9ieXRlX29yZGVyKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKLQkJCQkJICB0aGlzLT5oaWRkZW4tPmV2LAotCQkJCQkgIGJ5dGVfb3JkZXIgKTsKLX0KLQotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0QXVkaW9Gb3JtYXRUeXBlKF9USElTLCBzdHJpbmcgZm10KQotewotICAgIC8qIHBvc3NpYmxlIFBDTSwgQV9MQVcgb3IgTVVfTEFXICovCi0gICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3NldF9hdWRpb19mb3JtYXRfdHlwZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCi0JCQkJCQkgdGhpcy0+aGlkZGVuLT5ldiwKLQkJCQkJCSBmbXQgKTsKLX0KLQotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0TnVtYmVyRm9ybWF0KF9USElTLCBzdHJpbmcgZm10KQotewotICAgIC8qIHBvc3NpYmxlIFNJR05FRCwgVU5TSUdORUQsIG9yIFRXT1NfQ09NUExFTUVOVCAqLwotICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9zZXRfbnVtYmVyX2Zvcm1hdCggdGhpcy0+aGlkZGVuLT51bXNkZXYsCi0JCQkJCSAgICAgdGhpcy0+aGlkZGVuLT5ldiwKLQkJCQkJICAgICBmbXQgKTsKLX0KLQotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFESW5pdGlhbGl6ZShfVEhJUykKLXsKLSAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2VfaW5pdGlhbGl6ZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCi0JCQkJICAgICAgdGhpcy0+aGlkZGVuLT5ldiApOwotfQotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTdGFydChfVEhJUykKLXsKLSAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfc3RhcnQoIHRoaXMtPmhpZGRlbi0+dW1zZGV2LAotCQkJCSB0aGlzLT5oaWRkZW4tPmV2ICk7Ci19Ci0KLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldFRpbWVGb3JtYXQoX1RISVMsICBVTVNBdWRpb1R5cGVzX1RpbWVGb3JtYXQgZm10ICkKLXsKLSAgICAvKgotICAgICAqIFN3aXRjaGVzIHRoZSB0aW1lIGZvcm1hdCB0byB0aGUgbmV3IGZvcm1hdCwgaW1tZWRpYXRlbHkuCi0gICAgICogcG9zc2libGUgVU1TQXVkaW9UeXBlc19Nc2VjcywgVU1TQXVkaW9UeXBlc19CeXRlcyBvciBVTVNBdWRpb1R5cGVzX1NhbXBsZXMKLSAgICAgKi8KLSAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfc2V0X3RpbWVfZm9ybWF0KCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKLQkJCQkJICAgdGhpcy0+aGlkZGVuLT5ldiwKLQkJCQkJICAgZm10ICk7Ci19Ci0KLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFdyaXRlQnVmZlNpemUoX1RISVMsICBsb25nKiBidWZmX3NpemUgKQotewotICAgIC8qCi0gICAgICogcmV0dXJucyB3cml0ZSBidWZmZXIgc2l6ZSBpbiB0aGUgY3VycmVudCB0aW1lIGZvcm1hdAotICAgICAqLwotICAgIHJldHVybiBVTVNBdWRpb0RldmljZV93cml0ZV9idWZmX3NpemUoIHRoaXMtPmhpZGRlbi0+dW1zZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+ZXYsCi0JCQkJCSAgIGJ1ZmZfc2l6ZSApOwotfQotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZUJ1ZmZSZW1haW4oX1RISVMsICBsb25nKiBidWZmX3NpemUgKQotewotICAgIC8qCi0gICAgICogcmV0dXJucyBhbW91bnQgb2YgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSB3cml0ZSBidWZmZXIKLSAgICAgKiBpbiB0aGUgY3VycmVudCB0aW1lIGZvcm1hdAotICAgICAqLwotICAgIHJldHVybiBVTVNBdWRpb0RldmljZV93cml0ZV9idWZmX3JlbWFpbiggdGhpcy0+aGlkZGVuLT51bXNkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAotCQkJCQkgICAgIGJ1ZmZfc2l6ZSApOwotfQotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZUJ1ZmZVc2VkKF9USElTLCAgbG9uZyogYnVmZl9zaXplICkKLXsKLSAgICAvKgotICAgICAqIHJldHVybnMgYW1vdW50IG9mIGZpbGxlZCBzcGFjZSBpbiB0aGUgd3JpdGUgYnVmZmVyCi0gICAgICogaW4gdGhlIGN1cnJlbnQgdGltZSBmb3JtYXQKLSAgICAgKi8KLSAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfd3JpdGVfYnVmZl91c2VkKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAotCQkJCQkgICBidWZmX3NpemUgKTsKLX0KLQotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0RE1BQnVmZmVyU2l6ZShfVEhJUywgIGxvbmcgYnl0ZXMsIGxvbmcqIGJ5dGVzX3JldCApCi17Ci0gICAgLyoKLSAgICAgKiBSZXF1ZXN0IGEgbmV3IERNQSBidWZmZXIgc2l6ZSwgbWF4aW11bSByZXF1ZXN0ZWQgc2l6ZSAyMDQ4LgotICAgICAqIFRha2VzIGVmZmVjdCB3aXRoIG5leHQgaW5pdGlhbGl6ZSgpIGNhbGwuCi0gICAgICogRGV2aWNlcyBtYXkgb3IgbWF5IG5vdCBzdXBwb3J0IERNQS4KLSAgICAgKi8KLSAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfc2V0X0RNQV9idWZmZXJfc2l6ZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCi0JCQkJCSAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAotCQkJCQkgICAgICAgYnl0ZXMsCi0JCQkJCSAgICAgICBieXRlc19yZXQgKTsKLX0KLQotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0Vm9sdW1lKF9USElTLCAgbG9uZyB2b2x1bWUgKQotewotICAgIC8qCi0gICAgICogU2V0IHRoZSB2b2x1bWUuCi0gICAgICogVGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5LgotICAgICAqLwotICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9zZXRfdm9sdW1lKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKLQkJCQkgICAgICB0aGlzLT5oaWRkZW4tPmV2LAotCQkJCSAgICAgIHZvbHVtZSApOwotfQotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRCYWxhbmNlKF9USElTLCAgbG9uZyBiYWxhbmNlICkKLXsKLSAgICAvKgotICAgICAqIFNldCB0aGUgYmFsYW5jZS4KLSAgICAgKiBUYWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuCi0gICAgICovCi0gICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3NldF9iYWxhbmNlKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKLQkJCQkgICAgICAgdGhpcy0+aGlkZGVuLT5ldiwKLQkJCQkgICAgICAgYmFsYW5jZSApOwotfQotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRDaGFubmVscyhfVEhJUywgIGxvbmcgY2hhbm5lbHMgKQotewotICAgIC8qCi0gICAgICogU2V0IG1vbm8gb3Igc3RlcmVvLgotICAgICAqIFRha2VzIGVmZmVjdCB3aXRoIG5leHQgaW5pdGlhbGl6ZSgpIGNhbGwuCi0gICAgICovCi0gICAgaWYgKCBjaGFubmVscyAhPSAxICkgY2hhbm5lbHMgPSAyOwotICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9zZXRfbnVtYmVyX29mX2NoYW5uZWxzKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKLQkJCQkgICAgICAgICAgICAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAotCQkJCSAgICAgICAgICAgICAgICAgIGNoYW5uZWxzICk7Ci19Ci0KLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRE9wZW4oX1RISVMsICBzdHJpbmcgZGV2aWNlLCBzdHJpbmcgbW9kZSwgbG9uZyBmbGFncykKLXsKLSAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfb3BlbiggdGhpcy0+aGlkZGVuLT51bXNkZXYsCi0JCQkJdGhpcy0+aGlkZGVuLT5ldiwKLQkJCQlkZXZpY2UsCi0JCQkJbW9kZSwKLQkJCQlmbGFncyApOwotfQotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZShfVEhJUywgIFVNU0F1ZGlvVHlwZXNfQnVmZmVyKiBidWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc2FtcGxlcywKLQkJCQkJICAgbG9uZyogc2FtcGxlc193cml0dGVuKQotewotICAgIHJldHVybiBVTVNBdWRpb0RldmljZV93cml0ZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCi0JCQkJIHRoaXMtPmhpZGRlbi0+ZXYsCi0JCQkJIGJ1ZmYsCi0JCQkJIHNhbXBsZXMsCi0JCQkJIHNhbXBsZXNfd3JpdHRlbiApOwotfQotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURQbGF5UmVtYWluaW5nRGF0YShfVEhJUywgIGJvb2xlYW4gYmxvY2sgKQotewotICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9wbGF5X3JlbWFpbmluZ19kYXRhKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKLQkJCQkJICAgICAgIHRoaXMtPmhpZGRlbi0+ZXYsCi0JCQkJCSAgICAgICBibG9jayk7Ci19Ci0KLXN0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFN0b3AoX1RISVMpCi17Ci0gICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3N0b3AoIHRoaXMtPmhpZGRlbi0+dW1zZGV2LAotCQkJCXRoaXMtPmhpZGRlbi0+ZXYgKTsKLX0KLQotc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEQ2xvc2UoX1RISVMpCi17Ci0gICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX2Nsb3NlKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKLQkJCQkgdGhpcy0+aGlkZGVuLT5ldiApOwotfQotCi1zdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURFbmFibGVPdXRwdXQoX1RISVMsICBzdHJpbmcgb3V0cHV0LCBsb25nKiBsZWZ0X2dhaW4sIGxvbmcqIHJpZ2h0X2dhaW4pCi17Ci0gICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX2VuYWJsZV9vdXRwdXQoIHRoaXMtPmhpZGRlbi0+dW1zZGV2LAotCQkJCQkgdGhpcy0+aGlkZGVuLT5ldiwKLQkJCQkJIG91dHB1dCwKLQkJCQkJIGxlZnRfZ2FpbiwKLQkJCQkJIHJpZ2h0X2dhaW4gKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby91bXMvU0RMX3Vtc2F1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL3Vtcy9TRExfdW1zYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0MTBjYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL3Vtcy9TRExfdW1zYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBDYXJzdGVuIEdyaXdvZHoKLSAgICBncmlmZkBrb20udHUtZGFybXN0YWR0LmRlCi0KLSAgICBiYXNlZCBvbiBsaW51eC9TRExfZHNwYXVkaW8uaCBieSBTYW0gTGFudGluZ2EKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfVU1TYXVkaW9faAotI2RlZmluZSBfU0RMX1VNU2F1ZGlvX2gKLQotI2luY2x1ZGUgPFVNUy9VTVNBdWRpb0RldmljZS5oPgotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKLQotc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhCi17Ci0gICAgLyogUG9pbnRlciB0byB0aGUgKG9wZW4pIFVNUyBhdWRpbyBkZXZpY2UgKi8KLSAgICBFbnZpcm9ubWVudCogICBldjsKLSAgICBVTVNBdWRpb0RldmljZSB1bXNkZXY7Ci0KLSAgICAvKiBSYXcgbWl4aW5nIGJ1ZmZlciAqLwotICAgIFVNU0F1ZGlvVHlwZXNfQnVmZmVyIHBsYXlidWY7Ci0gICAgVU1TQXVkaW9UeXBlc19CdWZmZXIgZmlsbGJ1ZjsKLQotICAgIGxvbmcgYnl0ZXNQZXJTYW1wbGU7Ci19OwotCi0jZW5kaWYgLyogX1NETF9VTVNhdWRpb19oICovCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vd2luZGliL1NETF9kaWJhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby93aW5kaWIvU0RMX2RpYmF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhODYxMjYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby93aW5kaWIvU0RMX2RpYmF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKLSNpbmNsdWRlICJTRExfZGliYXVkaW8uaCIKLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIChfV0lOMzJfV0NFIDwgMzAwKQotI2luY2x1ZGUgIndpbl9jZV9zZW1hcGhvcmUuaCIKLSNlbmRpZgotCi0KLS8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRElCX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7Ci1zdGF0aWMgdm9pZCBESUJfVGhyZWFkSW5pdChfVEhJUyk7Ci1zdGF0aWMgdm9pZCBESUJfV2FpdEF1ZGlvKF9USElTKTsKLXN0YXRpYyBVaW50OCAqRElCX0dldEF1ZGlvQnVmKF9USElTKTsKLXN0YXRpYyB2b2lkIERJQl9QbGF5QXVkaW8oX1RISVMpOwotc3RhdGljIHZvaWQgRElCX1dhaXREb25lKF9USElTKTsKLXN0YXRpYyB2b2lkIERJQl9DbG9zZUF1ZGlvKF9USElTKTsKLQotaW50IHZvbGF0aWxlICAgZGliYXVkaW9fdGhyZWFkX2RlYnVnID0gMDsKLWludCB2b2xhdGlsZSAgIGRpYmF1ZGlvX2NiX2RlYnVnICAgICA9IDA7Ci1pbnQgdm9sYXRpbGUgICBkaWJhdWRpb19tYWluX2RlYnVnICAgPSAwOwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotCXJldHVybigxKTsKLX0KLQotc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9BdWRpb0RldmljZSAqdGhpczsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKLQlpZiAoIHRoaXMgKSB7Ci0JCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOwotCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQl9Ci0JaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCB0aGlzICkgewotCQkJU0RMX2ZyZWUodGhpcyk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JdGhpcy0+T3BlbkF1ZGlvID0gRElCX09wZW5BdWRpbzsKLQl0aGlzLT5UaHJlYWRJbml0ID0gRElCX1RocmVhZEluaXQ7Ci0JdGhpcy0+V2FpdEF1ZGlvID0gRElCX1dhaXRBdWRpbzsKLQl0aGlzLT5QbGF5QXVkaW8gPSBESUJfUGxheUF1ZGlvOwotCXRoaXMtPkdldEF1ZGlvQnVmID0gRElCX0dldEF1ZGlvQnVmOwotCXRoaXMtPldhaXREb25lID0gRElCX1dhaXREb25lOwotCXRoaXMtPkNsb3NlQXVkaW8gPSBESUJfQ2xvc2VBdWRpbzsKLQotCXRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7Ci0KLQlyZXR1cm4gdGhpczsKLX0KLQotQXVkaW9Cb290U3RyYXAgV0FWRU9VVF9ib290c3RyYXAgPSB7Ci0JIndhdmVvdXQiLCAiV2luOTUvOTgvTlQvMjAwMCBXYXZlT3V0IiwKLQlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQotfTsKLQotCi0vKiBUaGUgV2luMzIgY2FsbGJhY2sgZm9yIGZpbGxpbmcgdGhlIFdBVkUgZGV2aWNlICovCi1zdGF0aWMgdm9pZCBDQUxMQkFDSyBGaWxsU291bmQoSFdBVkVPVVQgaHdvLCBVSU5UIHVNc2csIERXT1JEX1BUUiBkd0luc3RhbmNlLAotCQkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQotewotCVNETF9BdWRpb0RldmljZSAqdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilkd0luc3RhbmNlOwotCi0JLyogT25seSBzZXJ2aWNlICJidWZmZXIgZG9uZSBwbGF5aW5nIiBtZXNzYWdlcyAqLwotCWlmICggdU1zZyAhPSBXT01fRE9ORSApCi0JCXJldHVybjsKLQotCS8qIFNpZ25hbCB0aGF0IHdlIGFyZSBkb25lIHBsYXlpbmcgYSBidWZmZXIgKi8KLQlkaWJhdWRpb19jYl9kZWJ1ZyA9IDE7Ci0JRW50ZXJDcml0aWNhbFNlY3Rpb24oICZhdWRpb19jcyApOwotCWRpYmF1ZGlvX2NiX2RlYnVnID0gMjsKLQlTZXRFdmVudCggYXVkaW9fZXZlbnQgKTsKLQlkaWJhdWRpb19jYl9kZWJ1ZyA9IDM7Ci0JTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdWRpb19jcyApOwotCWRpYmF1ZGlvX2NiX2RlYnVnID0gNDsKLX0KLQotc3RhdGljIHZvaWQgU2V0TU1lcnJvcihjaGFyICpmdW5jdGlvbiwgTU1SRVNVTFQgY29kZSkKLXsKLQlzaXplX3QgbGVuOwotCWNoYXIgZXJyYnVmW01BWEVSUk9STEVOR1RIXTsKLSNpZmRlZiBfV0lOMzJfV0NFCi0Jd2NoYXJfdCB3ZXJyYnVmW01BWEVSUk9STEVOR1RIXTsKLSNlbmRpZgotCi0JU0RMX3NucHJpbnRmKGVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLCAiJXM6ICIsIGZ1bmN0aW9uKTsKLQlsZW4gPSBTRExfc3RybGVuKGVycmJ1Zik7Ci0KLSNpZmRlZiBfV0lOMzJfV0NFCi0JLyogVU5JQ09ERSB2ZXJzaW9uICovCi0Jd2F2ZU91dEdldEVycm9yVGV4dChjb2RlLCB3ZXJyYnVmLCBNQVhFUlJPUkxFTkdUSC1sZW4pOwotCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLDAsd2VycmJ1ZiwtMSxlcnJidWYrbGVuLE1BWEVSUk9STEVOR1RILWxlbixOVUxMLE5VTEwpOwotI2Vsc2UKLQl3YXZlT3V0R2V0RXJyb3JUZXh0KGNvZGUsIGVycmJ1ZitsZW4sIChVSU5UKShNQVhFUlJPUkxFTkdUSC1sZW4pKTsKLSNlbmRpZgotCi0JU0RMX1NldEVycm9yKCIlcyIsZXJyYnVmKTsKLX0KLQotLyogU2V0IGhpZ2ggcHJpb3JpdHkgZm9yIHRoZSBhdWRpbyB0aHJlYWQgKi8KLXN0YXRpYyB2b2lkIERJQl9UaHJlYWRJbml0KF9USElTKQotewotCVNldFRocmVhZFByaW9yaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgVEhSRUFEX1BSSU9SSVRZX0hJR0hFU1QpOwotfQotCi12b2lkIERJQl9XYWl0QXVkaW8oX1RISVMpCi17Ci0JLyogV2FpdCBmb3IgYW4gYXVkaW8gY2h1bmsgdG8gZmluaXNoICovCi0JZGliYXVkaW9fdGhyZWFkX2RlYnVnID0gMTsKLQlXYWl0Rm9yU2luZ2xlT2JqZWN0KGF1ZGlvX2V2ZW50LCBJTkZJTklURSk7Ci0JZGliYXVkaW9fdGhyZWFkX2RlYnVnID0gMjsKLQlSZXNldEV2ZW50KCBhdWRpb19ldmVudCApOwotCWRpYmF1ZGlvX3RocmVhZF9kZWJ1ZyA9IDM7Ci19Ci0KLVVpbnQ4ICpESUJfR2V0QXVkaW9CdWYoX1RISVMpCi17Ci0gICAgVWludDggKnJldHZhbDsKLQotCWRpYmF1ZGlvX3RocmVhZF9kZWJ1ZyA9IDQ7Ci0gICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZhdWRpb19jcyApOwotCWRpYmF1ZGlvX3RocmVhZF9kZWJ1ZyA9IDU7Ci0JcmV0dmFsID0gKFVpbnQ4ICopKHdhdmVidWZbbmV4dF9idWZmZXJdLmxwRGF0YSk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotdm9pZCBESUJfUGxheUF1ZGlvKF9USElTKQotewotCS8qIFF1ZXVlIGl0IHVwICovCi0JZGliYXVkaW9fdGhyZWFkX2RlYnVnID0gNjsKLQl3YXZlT3V0V3JpdGUoc291bmQsICZ3YXZlYnVmW25leHRfYnVmZmVyXSwgc2l6ZW9mKHdhdmVidWZbMF0pKTsKLQlkaWJhdWRpb190aHJlYWRfZGVidWcgPSA3OwotCW5leHRfYnVmZmVyID0gKG5leHRfYnVmZmVyKzEpJU5VTV9CVUZGRVJTOwotCUxlYXZlQ3JpdGljYWxTZWN0aW9uKCAmYXVkaW9fY3MgKTsKLQlkaWJhdWRpb190aHJlYWRfZGVidWcgPSA4OwotfQotCi12b2lkIERJQl9XYWl0RG9uZShfVEhJUykKLXsKLQlpbnQgaSwgbGVmdCwgdHJpZXMgPSA1OwotCQotCWRpYmF1ZGlvX3RocmVhZF9kZWJ1ZyA9IDk7Ci0KLSAgIC8qIGdpdmUgc29tZSB0aW1lIGZvciB0aGUgd2F2ZSBvdXRwdXQgdG8gc2VuZCB0aGUgbGFzdCBidWZmZXIsCi0JKiBidXQgZG9uJ3QgaGFuZyBpZiBvbmUgd2FzIGNhbmNlbGxlZAotCSovCi0JZG8gewotCQlsZWZ0ID0gTlVNX0JVRkZFUlM7Ci0JCWZvciAoIGk9MDsgaTxOVU1fQlVGRkVSUzsgKytpICkgewotCQkJaWYgKCB3YXZlYnVmW2ldLmR3RmxhZ3MgJiBXSERSX0RPTkUgKSB7Ci0JCQkJLS1sZWZ0OwotCQkJfQotCQl9Ci0JCWlmICggbGVmdCA9PSAwICkKLQkJCWJyZWFrOwotCi0JCVNETF9EZWxheSgxMDApOwotCX0gd2hpbGUgKCAtLXRyaWVzID4gMCApOwotCi0JZGliYXVkaW9fdGhyZWFkX2RlYnVnID0gMTA7Ci19Ci0KLXZvaWQgRElCX0Nsb3NlQXVkaW8oX1RISVMpCi17Ci0JaW50IGk7Ci0KLQkvKiBDbG9zZSB1cCBhdWRpbyAqLwotCWlmICggYXVkaW9fZXZlbnQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgKSB7Ci0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAoX1dJTjMyX1dDRSA8IDMwMCkKLQkJQ2xvc2VTeW5jaEhhbmRsZShhdWRpb19ldmVudCk7Ci0jZWxzZQotCQlDbG9zZUhhbmRsZShhdWRpb19ldmVudCk7Ci0jZW5kaWYKLQl9Ci0JaWYgKCBzb3VuZCApIHsKLQkgICAgd2F2ZU91dFJlc2V0KHNvdW5kKTsKLQl9Ci0KLQkvKiBDbGVhbiB1cCBtaXhpbmcgYnVmZmVycyAqLwotCWZvciAoIGk9MDsgaTxOVU1fQlVGRkVSUzsgKytpICkgewotCQlpZiAoIHdhdmVidWZbaV0uZHdVc2VyICE9IDB4RkZGRiApIHsKLQkJCXdhdmVPdXRVbnByZXBhcmVIZWFkZXIoc291bmQsICZ3YXZlYnVmW2ldLAotCQkJCQkJc2l6ZW9mKHdhdmVidWZbaV0pKTsKLQkJCXdhdmVidWZbaV0uZHdVc2VyID0gMHhGRkZGOwotCQl9Ci0JfQotCS8qIEZyZWUgcmF3IG1peGluZyBidWZmZXIgKi8KLQlpZiAoIG1peGJ1ZiAhPSBOVUxMICkgewotCQlTRExfZnJlZShtaXhidWYpOwotCQltaXhidWYgPSBOVUxMOwotCX0KLQotCWlmICggc291bmQgKQotCQl3YXZlT3V0Q2xvc2Uoc291bmQpOwotfQotCi1pbnQgRElCX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKLXsKLQlNTVJFU1VMVCByZXN1bHQ7Ci0JaW50IGk7Ci0JV0FWRUZPUk1BVEVYIHdhdmVmb3JtYXQ7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSB3YXZlYnVmIHN0cnVjdHVyZXMgZm9yIGNsb3NpbmcgKi8KLQlzb3VuZCA9IE5VTEw7Ci0JSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggJmF1ZGlvX2NzICk7Ci0JYXVkaW9fZXZlbnQgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQlmb3IgKCBpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyArK2kgKQotCQl3YXZlYnVmW2ldLmR3VXNlciA9IDB4RkZGRjsKLQltaXhidWYgPSBOVUxMOwotCi0JLyogU2V0IGJhc2ljIFdBVkUgZm9ybWF0IHBhcmFtZXRlcnMgKi8KLQlTRExfbWVtc2V0KCZ3YXZlZm9ybWF0LCAwLCBzaXplb2Yod2F2ZWZvcm1hdCkpOwotCXdhdmVmb3JtYXQud0Zvcm1hdFRhZyA9IFdBVkVfRk9STUFUX1BDTTsKLQotCS8qIERldGVybWluZSB0aGUgYXVkaW8gcGFyYW1ldGVycyBmcm9tIHRoZSBBdWRpb1NwZWMgKi8KLQlzd2l0Y2ggKCBzcGVjLT5mb3JtYXQgJiAweEZGICkgewotCQljYXNlIDg6Ci0JCQkvKiBVbnNpZ25lZCA4IGJpdCBhdWRpbyBkYXRhICovCi0JCQlzcGVjLT5mb3JtYXQgPSBBVURJT19VODsKLQkJCXdhdmVmb3JtYXQud0JpdHNQZXJTYW1wbGUgPSA4OwotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQkvKiBTaWduZWQgMTYgYml0IGF1ZGlvIGRhdGEgKi8KLQkJCXNwZWMtPmZvcm1hdCA9IEFVRElPX1MxNjsKLQkJCXdhdmVmb3JtYXQud0JpdHNQZXJTYW1wbGUgPSAxNjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKLQkJCXJldHVybigtMSk7Ci0JfQotCXdhdmVmb3JtYXQubkNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7Ci0Jd2F2ZWZvcm1hdC5uU2FtcGxlc1BlclNlYyA9IHNwZWMtPmZyZXE7Ci0Jd2F2ZWZvcm1hdC5uQmxvY2tBbGlnbiA9Ci0JCXdhdmVmb3JtYXQubkNoYW5uZWxzICogKHdhdmVmb3JtYXQud0JpdHNQZXJTYW1wbGUvOCk7Ci0Jd2F2ZWZvcm1hdC5uQXZnQnl0ZXNQZXJTZWMgPSAKLQkJd2F2ZWZvcm1hdC5uU2FtcGxlc1BlclNlYyAqIHdhdmVmb3JtYXQubkJsb2NrQWxpZ247Ci0KLQkvKiBDaGVjayB0aGUgYnVmZmVyIHNpemUgLS0gbWluaW11bSBvZiAxLzQgc2Vjb25kICh3b3JkIGFsaWduZWQpICovCi0JaWYgKCBzcGVjLT5zYW1wbGVzIDwgKHNwZWMtPmZyZXEvNCkgKQotCQlzcGVjLT5zYW1wbGVzID0gKChzcGVjLT5mcmVxLzQpKzMpJn4zOwotCi0JLyogVXBkYXRlIHRoZSBmcmFnbWVudCBzaXplIGFzIHNpemUgaW4gYnl0ZXMgKi8KLQlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOwotCi0JLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlICovCi0JcmVzdWx0ID0gd2F2ZU91dE9wZW4oJnNvdW5kLCBXQVZFX01BUFBFUiwgJndhdmVmb3JtYXQsCi0JCQkoRFdPUkRfUFRSKUZpbGxTb3VuZCwgKERXT1JEX1BUUil0aGlzLCBDQUxMQkFDS19GVU5DVElPTik7Ci0JaWYgKCByZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUiApIHsKLQkJU2V0TU1lcnJvcigid2F2ZU91dE9wZW4oKSIsIHJlc3VsdCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0jaWZkZWYgU09VTkRfREVCVUcKLQkvKiBDaGVjayB0aGUgc291bmQgZGV2aWNlIHdlIHJldHJpZXZlZCAqLwotCXsKLQkJV0FWRU9VVENBUFMgY2FwczsKLQotCQlyZXN1bHQgPSB3YXZlT3V0R2V0RGV2Q2FwcygoVUlOVClzb3VuZCwgJmNhcHMsIHNpemVvZihjYXBzKSk7Ci0JCWlmICggcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IgKSB7Ci0JCQlTZXRNTWVycm9yKCJ3YXZlT3V0R2V0RGV2Q2FwcygpIiwgcmVzdWx0KTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJcHJpbnRmKCJBdWRpbyBkZXZpY2U6ICVzXG4iLCBjYXBzLnN6UG5hbWUpOwotCX0KLSNlbmRpZgotCi0JLyogQ3JlYXRlIHRoZSBhdWRpbyBidWZmZXIgc2VtYXBob3JlICovCi0JYXVkaW9fZXZlbnQgPSBDcmVhdGVFdmVudCggTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwgKTsKLQlpZiAoIGF1ZGlvX2V2ZW50ID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNlbWFwaG9yZSIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIENyZWF0ZSB0aGUgc291bmQgYnVmZmVycyAqLwotCW1peGJ1ZiA9IChVaW50OCAqKVNETF9tYWxsb2MoTlVNX0JVRkZFUlMqc3BlYy0+c2l6ZSk7Ci0JaWYgKCBtaXhidWYgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJPdXQgb2YgbWVtb3J5Iik7Ci0JCXJldHVybigtMSk7Ci0JfQotCWZvciAoIGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7ICsraSApIHsKLQkJU0RMX21lbXNldCgmd2F2ZWJ1ZltpXSwgMCwgc2l6ZW9mKHdhdmVidWZbaV0pKTsKLQkJd2F2ZWJ1ZltpXS5scERhdGEgPSAoTFBTVFIpICZtaXhidWZbaSpzcGVjLT5zaXplXTsKLQkJd2F2ZWJ1ZltpXS5kd0J1ZmZlckxlbmd0aCA9IHNwZWMtPnNpemU7Ci0JCXdhdmVidWZbaV0uZHdGbGFncyA9IFdIRFJfRE9ORTsKLQkJcmVzdWx0ID0gd2F2ZU91dFByZXBhcmVIZWFkZXIoc291bmQsICZ3YXZlYnVmW2ldLAotCQkJCQkJCXNpemVvZih3YXZlYnVmW2ldKSk7Ci0JCWlmICggcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IgKSB7Ci0JCQlTZXRNTWVycm9yKCJ3YXZlT3V0UHJlcGFyZUhlYWRlcigpIiwgcmVzdWx0KTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9Ci0KLQkvKiBSZWFkeSB0byBnbyEgKi8KLQluZXh0X2J1ZmZlciA9IDA7Ci0JcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby93aW5kaWIvU0RMX2RpYmF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL3dpbmRpYi9TRExfZGliYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2OGFiYS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL3dpbmRpYi9TRExfZGliYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfbG93YXVkaW9faAotI2RlZmluZSBfU0RMX2xvd2F1ZGlvX2gKLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLSNkZWZpbmUgTlVNX0JVRkZFUlMgMgkJCS8qIC0tIERvbid0IGxvd2VyIHRoaXMhICovCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7Ci0JSFdBVkVPVVQgICAgICAgICAgc291bmQ7Ci0JQ1JJVElDQUxfU0VDVElPTiAgYXVkaW9fY3M7Ci0JSEFORExFICAgICAgICAgICAgYXVkaW9fZXZlbnQ7Ci0JVWludDgqICAgICAgICAgICAgbWl4YnVmOwkJLyogVGhlIHJhdyBhbGxvY2F0ZWQgbWl4aW5nIGJ1ZmZlciAqLwotCVdBVkVIRFIgICAgICAgICAgIHdhdmVidWZbTlVNX0JVRkZFUlNdOwkvKiBXYXZlIGF1ZGlvIGZyYWdtZW50cyAqLwotCWludCAgICAgICAgICAgICAgY3VyX2J1ZmZlcjsKLQlpbnQgICAgICAgICAgICAgIG5leHRfYnVmZmVyOwotfTsKLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIHNvdW5kCQkJKHRoaXMtPmhpZGRlbi0+c291bmQpCi0jZGVmaW5lIGF1ZGlvX2V2ZW50CQkodGhpcy0+aGlkZGVuLT5hdWRpb19ldmVudCkKLSNkZWZpbmUgYXVkaW9fY3MgICAgICAgICh0aGlzLT5oaWRkZW4tPmF1ZGlvX2NzKQotI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCi0jZGVmaW5lIHdhdmVidWYJCQkodGhpcy0+aGlkZGVuLT53YXZlYnVmKQotI2RlZmluZSBjdXJfYnVmZmVyCQkodGhpcy0+aGlkZGVuLT5jdXJfYnVmZmVyKQotI2RlZmluZSBuZXh0X2J1ZmZlcgkJKHRoaXMtPmhpZGRlbi0+bmV4dF9idWZmZXIpCi0KLSNlbmRpZiAvKiBfU0RMX2xvd2F1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vd2luZHg1L1NETF9keDVhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby93aW5keDUvU0RMX2R4NWF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmQyZTguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby93aW5keDUvU0RMX2R4NWF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCi0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfYXVkaW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgotI2luY2x1ZGUgIlNETF9keDVhdWRpby5oIgotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byB1c2UgRGlyZWN0WCA2IERpcmVjdFNvdW5kTm90aWZ5IGludGVyZmFjZSAqLwotLy8jZGVmaW5lIFVTRV9QT1NJVElPTl9OT1RJRlkKLQotLyogRGlyZWN0WCBmdW5jdGlvbiBwb2ludGVycyBmb3IgYXVkaW8gKi8KLUhSRVNVTFQgKFdJTkFQSSAqRFNvdW5kQ3JlYXRlKShMUEdVSUQsIExQRElSRUNUU09VTkQgKiwgTFBVTktOT1dOKTsKLQotLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBEWDVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKLXN0YXRpYyB2b2lkIERYNV9UaHJlYWRJbml0KF9USElTKTsKLXN0YXRpYyB2b2lkIERYNV9XYWl0QXVkaW9fQnVzeVdhaXQoX1RISVMpOwotI2lmZGVmIFVTRV9QT1NJVElPTl9OT1RJRlkKLXN0YXRpYyB2b2lkIERYNl9XYWl0QXVkaW9fRXZlbnRXYWl0KF9USElTKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgRFg1X1BsYXlBdWRpbyhfVEhJUyk7Ci1zdGF0aWMgVWludDggKkRYNV9HZXRBdWRpb0J1ZihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBEWDVfV2FpdERvbmUoX1RISVMpOwotc3RhdGljIHZvaWQgRFg1X0Nsb3NlQXVkaW8oX1RISVMpOwotCi0vKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQotewotCUhJTlNUQU5DRSBEU291bmRETEw7Ci0JaW50IGRzb3VuZF9vazsKLQotCS8qIFZlcnNpb24gY2hlY2sgRFNPVU5ELkRMTCAoSXMgRGlyZWN0WCBva2F5PykgKi8KLQlkc291bmRfb2sgPSAwOwotCURTb3VuZERMTCA9IExvYWRMaWJyYXJ5KFRFWFQoIkRTT1VORC5ETEwiKSk7Ci0JaWYgKCBEU291bmRETEwgIT0gTlVMTCApIHsKLQkJLyogV2UganVzdCB1c2UgYmFzaWMgRGlyZWN0U291bmQsIHdlJ3JlIG9rYXkgKi8KLQkJLyogWWF5ISAqLwotCQkvKiBVbmZvcnR1bmF0ZWx5LCB0aGUgc291bmQgZHJpdmVycyBvbiBOVCBoYXZlCi0JCSAgIGhpZ2hlciBsYXRlbmNpZXMgdGhhbiB0aGUgYXVkaW8gYnVmZmVycyB1c2VkCi0JCSAgIGJ5IG1hbnkgU0RMIGFwcGxpY2F0aW9ucywgc28gdGhlcmUgYXJlIGdhcHMKLQkJICAgaW4gdGhlIGF1ZGlvIC0gaXQgc291bmRzIHRlcnJpYmxlLiAgUHVudCBmb3Igbm93LgotCQkgKi8KLQkJT1NWRVJTSU9OSU5GTyB2ZXI7Ci0JCXZlci5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mIChPU1ZFUlNJT05JTkZPKTsKLQkJR2V0VmVyc2lvbkV4KCZ2ZXIpOwotCQlzd2l0Y2ggKHZlci5kd1BsYXRmb3JtSWQpIHsKLQkJCWNhc2UgVkVSX1BMQVRGT1JNX1dJTjMyX05UOgotCQkJCWlmICggdmVyLmR3TWFqb3JWZXJzaW9uID4gNCApIHsKLQkJCQkJLyogV2luMksgKi8KLQkJCQkJZHNvdW5kX29rID0gMTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBXaW5OVCAqLwotCQkJCQlkc291bmRfb2sgPSAwOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLyogV2luOTUgb3IgV2luOTggKi8KLQkJCQlkc291bmRfb2sgPSAxOwotCQkJCWJyZWFrOwotCQl9Ci0JCS8qIE5vdyBjaGVjayBmb3IgRGlyZWN0WCA1IG9yIGJldHRlciAtIG90aGVyd2lzZQotCQkgKiB3ZSB3aWxsIGZhaWwgbGF0ZXIgaW4gRFg1X09wZW5BdWRpbyB3aXRob3V0IGEgY2hhbmNlCi0JCSAqIHRvIGZhbGwgYmFjayB0byB0aGUgRElCIGRyaXZlci4gKi8KLQkJaWYgKGRzb3VuZF9vaykgewotCQkJLyogRGlyZWN0U291bmRDYXB0dXJlQ3JlYXRlIHdhcyBhZGRlZCBpbiBEWDUgKi8KLQkJCWlmICghR2V0UHJvY0FkZHJlc3MoRFNvdW5kRExMLCBURVhUKCJEaXJlY3RTb3VuZENhcHR1cmVDcmVhdGUiKSkpCi0JCQkJZHNvdW5kX29rID0gMDsKLQotCQl9Ci0JCS8qIENsZWFuIHVwLi4gKi8KLQkJRnJlZUxpYnJhcnkoRFNvdW5kRExMKTsKLQl9Ci0JcmV0dXJuKGRzb3VuZF9vayk7Ci19Ci0KLS8qIEZ1bmN0aW9ucyBmb3IgbG9hZGluZyB0aGUgRGlyZWN0WCBmdW5jdGlvbnMgZHluYW1pY2FsbHkgKi8KLXN0YXRpYyBISU5TVEFOQ0UgRFNvdW5kRExMID0gTlVMTDsKLQotc3RhdGljIHZvaWQgRFg1X1VubG9hZCh2b2lkKQotewotCWlmICggRFNvdW5kRExMICE9IE5VTEwgKSB7Ci0JCUZyZWVMaWJyYXJ5KERTb3VuZERMTCk7Ci0JCURTb3VuZENyZWF0ZSA9IE5VTEw7Ci0JCURTb3VuZERMTCA9IE5VTEw7Ci0JfQotfQotc3RhdGljIGludCBEWDVfTG9hZCh2b2lkKQotewotCWludCBzdGF0dXM7Ci0KLQlEWDVfVW5sb2FkKCk7Ci0JRFNvdW5kRExMID0gTG9hZExpYnJhcnkoVEVYVCgiRFNPVU5ELkRMTCIpKTsKLQlpZiAoIERTb3VuZERMTCAhPSBOVUxMICkgewotCQlEU291bmRDcmVhdGUgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKERTb3VuZERMTCwKLQkJCQkJVEVYVCgiRGlyZWN0U291bmRDcmVhdGUiKSk7Ci0JfQotCWlmICggRFNvdW5kRExMICYmIERTb3VuZENyZWF0ZSApIHsKLQkJc3RhdHVzID0gMDsKLQl9IGVsc2UgewotCQlEWDVfVW5sb2FkKCk7Ci0JCXN0YXR1cyA9IC0xOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCi17Ci0JRFg1X1VubG9hZCgpOwotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9BdWRpb0RldmljZSAqdGhpczsKLQotCS8qIExvYWQgRGlyZWN0WCAqLwotCWlmICggRFg1X0xvYWQoKSA8IDAgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7Ci0JaWYgKCB0aGlzICkgewotCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKLQkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0JfQotCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWlmICggdGhpcyApIHsKLQkJCVNETF9mcmVlKHRoaXMpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCXRoaXMtPk9wZW5BdWRpbyA9IERYNV9PcGVuQXVkaW87Ci0JdGhpcy0+VGhyZWFkSW5pdCA9IERYNV9UaHJlYWRJbml0OwotCXRoaXMtPldhaXRBdWRpbyA9IERYNV9XYWl0QXVkaW9fQnVzeVdhaXQ7Ci0JdGhpcy0+UGxheUF1ZGlvID0gRFg1X1BsYXlBdWRpbzsKLQl0aGlzLT5HZXRBdWRpb0J1ZiA9IERYNV9HZXRBdWRpb0J1ZjsKLQl0aGlzLT5XYWl0RG9uZSA9IERYNV9XYWl0RG9uZTsKLQl0aGlzLT5DbG9zZUF1ZGlvID0gRFg1X0Nsb3NlQXVkaW87Ci0KLQl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIHRoaXM7Ci19Ci0KLUF1ZGlvQm9vdFN0cmFwIERTT1VORF9ib290c3RyYXAgPSB7Ci0JImRzb3VuZCIsICJXaW45NS85OC8yMDAwIERpcmVjdFNvdW5kIiwKLQlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQotfTsKLQotc3RhdGljIHZvaWQgU2V0RFNlcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGNvZGUpCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmVycm9yOwotCXN0YXRpYyBjaGFyICBlcnJidWZbMTAyNF07Ci0KLQllcnJidWZbMF0gPSAwOwotCXN3aXRjaCAoY29kZSkgewotCQljYXNlIEVfTk9JTlRFUkZBQ0U6Ci0JCQllcnJvciA9IAotCQkiVW5zdXBwb3J0ZWQgaW50ZXJmYWNlXG4tLSBJcyBEaXJlY3RYIDUuMCBvciBsYXRlciBpbnN0YWxsZWQ/IjsKLQkJCWJyZWFrOwotCQljYXNlIERTRVJSX0FMTE9DQVRFRDoKLQkJCWVycm9yID0gIkF1ZGlvIGRldmljZSBpbiB1c2UiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNFUlJfQkFERk9STUFUOgotCQkJZXJyb3IgPSAiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0IjsKLQkJCWJyZWFrOwotCQljYXNlIERTRVJSX0JVRkZFUkxPU1Q6Ci0JCQllcnJvciA9ICJNaXhpbmcgYnVmZmVyIHdhcyBsb3N0IjsKLQkJCWJyZWFrOwotCQljYXNlIERTRVJSX0NPTlRST0xVTkFWQUlMOgotCQkJZXJyb3IgPSAiQ29udHJvbCByZXF1ZXN0ZWQgaXMgbm90IGF2YWlsYWJsZSI7Ci0JCQlicmVhazsKLQkJY2FzZSBEU0VSUl9JTlZBTElEQ0FMTDoKLQkJCWVycm9yID0gIkludmFsaWQgY2FsbCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNFUlJfSU5WQUxJRFBBUkFNOgotCQkJZXJyb3IgPSAiSW52YWxpZCBwYXJhbWV0ZXIiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNFUlJfTk9EUklWRVI6Ci0JCQllcnJvciA9ICJObyBhdWRpbyBkZXZpY2UgZm91bmQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNFUlJfT1VUT0ZNRU1PUlk6Ci0JCQllcnJvciA9ICJPdXQgb2YgbWVtb3J5IjsKLQkJCWJyZWFrOwotCQljYXNlIERTRVJSX1BSSU9MRVZFTE5FRURFRDoKLQkJCWVycm9yID0gIkNhbGxlciBkb2Vzbid0IGhhdmUgcHJpb3JpdHkiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNFUlJfVU5TVVBQT1JURUQ6Ci0JCQllcnJvciA9ICJGdW5jdGlvbiBub3Qgc3VwcG9ydGVkIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJU0RMX3NucHJpbnRmKGVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLAotCQkJICAgICAgICAgIiVzOiBVbmtub3duIERpcmVjdFNvdW5kIGVycm9yOiAweCV4IiwKLQkJCQkJCQkJZnVuY3Rpb24sIGNvZGUpOwotCQkJYnJlYWs7Ci0JfQotCWlmICggISBlcnJidWZbMF0gKSB7Ci0JCVNETF9zbnByaW50ZihlcnJidWYsIFNETF9hcnJheXNpemUoZXJyYnVmKSwgIiVzOiAlcyIsIGZ1bmN0aW9uLCBlcnJvcik7Ci0JfQotCVNETF9TZXRFcnJvcigiJXMiLCBlcnJidWYpOwotCXJldHVybjsKLX0KLQotLyogRGlyZWN0U291bmQgbmVlZHMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgd2luZG93ICovCi1zdGF0aWMgSFdORCBtYWlud2luID0gTlVMTDsKLS8qICovCi12b2lkIERYNV9Tb3VuZEZvY3VzKEhXTkQgaHduZCkKLXsKLQltYWlud2luID0gaHduZDsKLX0KLQotc3RhdGljIHZvaWQgRFg1X1RocmVhZEluaXQoX1RISVMpCi17Ci0JU2V0VGhyZWFkUHJpb3JpdHkoR2V0Q3VycmVudFRocmVhZCgpLCBUSFJFQURfUFJJT1JJVFlfSElHSEVTVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIERYNV9XYWl0QXVkaW9fQnVzeVdhaXQoX1RISVMpCi17Ci0JRFdPUkQgc3RhdHVzOwotCURXT1JEIGN1cnNvciwganVuazsKLQlIUkVTVUxUIHJlc3VsdDsKLQotCS8qIFNlbWktYnVzeSB3YWl0LCBzaW5jZSB3ZSBoYXZlIG5vIHdheSBvZiBnZXR0aW5nIHBsYXkgbm90aWZpY2F0aW9uCi0JICAgb24gYSBwcmltYXJ5IG1peGluZyBidWZmZXIgbG9jYXRlZCBpbiBoYXJkd2FyZSAoRGlyZWN0WCA1LjApCi0JKi8KLQlyZXN1bHQgPSBJRGlyZWN0U291bmRCdWZmZXJfR2V0Q3VycmVudFBvc2l0aW9uKG1peGJ1ZiwgJmp1bmssICZjdXJzb3IpOwotCWlmICggcmVzdWx0ICE9IERTX09LICkgewotCQlpZiAoIHJlc3VsdCA9PSBEU0VSUl9CVUZGRVJMT1NUICkgewotCQkJSURpcmVjdFNvdW5kQnVmZmVyX1Jlc3RvcmUobWl4YnVmKTsKLQkJfQotI2lmZGVmIERFQlVHX1NPVU5ECi0JCVNldERTZXJyb3IoIkRpcmVjdFNvdW5kIEdldEN1cnJlbnRQb3NpdGlvbiIsIHJlc3VsdCk7Ci0jZW5kaWYKLQkJcmV0dXJuOwotCX0KLQotCXdoaWxlICggKGN1cnNvci9taXhsZW4pID09IGxhc3RjaHVuayApIHsKLQkJLyogRklYTUU6IGZpbmQgb3V0IGhvdyBtdWNoIHRpbWUgaXMgbGVmdCBhbmQgc2xlZXAgdGhhdCBsb25nICovCi0JCVNETF9EZWxheSgxKTsKLQotCQkvKiBUcnkgdG8gcmVzdG9yZSBhIGxvc3Qgc291bmQgYnVmZmVyICovCi0JCUlEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRTdGF0dXMobWl4YnVmLCAmc3RhdHVzKTsKLQkJaWYgKCAoc3RhdHVzJkRTQlNUQVRVU19CVUZGRVJMT1NUKSApIHsKLQkJCUlEaXJlY3RTb3VuZEJ1ZmZlcl9SZXN0b3JlKG1peGJ1Zik7Ci0JCQlJRGlyZWN0U291bmRCdWZmZXJfR2V0U3RhdHVzKG1peGJ1ZiwgJnN0YXR1cyk7Ci0JCQlpZiAoIChzdGF0dXMmRFNCU1RBVFVTX0JVRkZFUkxPU1QpICkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICggISAoc3RhdHVzJkRTQlNUQVRVU19QTEFZSU5HKSApIHsKLQkJCXJlc3VsdCA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9QbGF5KG1peGJ1ZiwgMCwgMCwgRFNCUExBWV9MT09QSU5HKTsKLQkJCWlmICggcmVzdWx0ID09IERTX09LICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotI2lmZGVmIERFQlVHX1NPVU5ECi0JCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBQbGF5IiwgcmVzdWx0KTsKLSNlbmRpZgotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogRmluZCBvdXQgd2hlcmUgd2UgYXJlIHBsYXlpbmcgKi8KLQkJcmVzdWx0ID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbihtaXhidWYsCi0JCQkJCQkJCSZqdW5rLCAmY3Vyc29yKTsKLQkJaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7Ci0JCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBHZXRDdXJyZW50UG9zaXRpb24iLCByZXN1bHQpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgVVNFX1BPU0lUSU9OX05PVElGWQotc3RhdGljIHZvaWQgRFg2X1dhaXRBdWRpb19FdmVudFdhaXQoX1RISVMpCi17Ci0JRFdPUkQgc3RhdHVzOwotCUhSRVNVTFQgcmVzdWx0OwotCi0JLyogVHJ5IHRvIHJlc3RvcmUgYSBsb3N0IHNvdW5kIGJ1ZmZlciAqLwotCUlEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRTdGF0dXMobWl4YnVmLCAmc3RhdHVzKTsKLQlpZiAoIChzdGF0dXMmRFNCU1RBVFVTX0JVRkZFUkxPU1QpICkgewotCQlJRGlyZWN0U291bmRCdWZmZXJfUmVzdG9yZShtaXhidWYpOwotCQlJRGlyZWN0U291bmRCdWZmZXJfR2V0U3RhdHVzKG1peGJ1ZiwgJnN0YXR1cyk7Ci0JCWlmICggKHN0YXR1cyZEU0JTVEFUVVNfQlVGRkVSTE9TVCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JaWYgKCAhIChzdGF0dXMmRFNCU1RBVFVTX1BMQVlJTkcpICkgewotCQlyZXN1bHQgPSBJRGlyZWN0U291bmRCdWZmZXJfUGxheShtaXhidWYsIDAsIDAsIERTQlBMQVlfTE9PUElORyk7Ci0JCWlmICggcmVzdWx0ICE9IERTX09LICkgewotI2lmZGVmIERFQlVHX1NPVU5ECi0JCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBQbGF5IiwgcmVzdWx0KTsKLSNlbmRpZgotCQkJcmV0dXJuOwotCQl9Ci0JfQotCVdhaXRGb3JTaW5nbGVPYmplY3QoYXVkaW9fZXZlbnQsIElORklOSVRFKTsKLX0KLSNlbmRpZiAvKiBVU0VfUE9TSVRJT05fTk9USUZZICovCi0KLXN0YXRpYyB2b2lkIERYNV9QbGF5QXVkaW8oX1RISVMpCi17Ci0JLyogVW5sb2NrIHRoZSBidWZmZXIsIGFsbG93aW5nIGl0IHRvIHBsYXkgKi8KLQlpZiAoIGxvY2tlZF9idWYgKSB7Ci0JCUlEaXJlY3RTb3VuZEJ1ZmZlcl9VbmxvY2sobWl4YnVmLCBsb2NrZWRfYnVmLCBtaXhsZW4sIE5VTEwsIDApOwotCX0KLQotfQotCi1zdGF0aWMgVWludDggKkRYNV9HZXRBdWRpb0J1ZihfVEhJUykKLXsKLQlEV09SRCAgIGN1cnNvciwganVuazsKLQlIUkVTVUxUIHJlc3VsdDsKLQlEV09SRCAgIHJhd2xlbjsKLQotCS8qIEZpZ3VyZSBvdXQgd2hpY2ggYmxvY2tzIHRvIGZpbGwgbmV4dCAqLwotCWxvY2tlZF9idWYgPSBOVUxMOwotCXJlc3VsdCA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRDdXJyZW50UG9zaXRpb24obWl4YnVmLCAmanVuaywgJmN1cnNvcik7Ci0JaWYgKCByZXN1bHQgPT0gRFNFUlJfQlVGRkVSTE9TVCApIHsKLQkJSURpcmVjdFNvdW5kQnVmZmVyX1Jlc3RvcmUobWl4YnVmKTsKLQkJcmVzdWx0ID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbihtaXhidWYsCi0JCQkJCQkJCSZqdW5rLCAmY3Vyc29yKTsKLQl9Ci0JaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7Ci0JCVNldERTZXJyb3IoIkRpcmVjdFNvdW5kIEdldEN1cnJlbnRQb3NpdGlvbiIsIHJlc3VsdCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JY3Vyc29yIC89IG1peGxlbjsKLSNpZmRlZiBERUJVR19TT1VORAotCS8qIERldGVjdCBhdWRpbyBkcm9wb3V0cyAqLwotCXsgRFdPUkQgc3BvdCA9IGN1cnNvcjsKLQkgIGlmICggc3BvdCA8IGxhc3RjaHVuayApIHsKLQkgICAgc3BvdCArPSBOVU1fQlVGRkVSUzsKLQkgIH0KLQkgIGlmICggc3BvdCA+IGxhc3RjaHVuaysxICkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgIkF1ZGlvIGRyb3BvdXQsIG1pc3NlZCAlZCBmcmFnbWVudHNcbiIsCi0JICAgICAgICAgICAgKHNwb3QgLSAobGFzdGNodW5rKzEpKSk7Ci0JICB9Ci0JfQotI2VuZGlmCi0JbGFzdGNodW5rID0gY3Vyc29yOwotCWN1cnNvciA9IChjdXJzb3IrMSklTlVNX0JVRkZFUlM7Ci0JY3Vyc29yICo9IG1peGxlbjsKLQotCS8qIExvY2sgdGhlIGF1ZGlvIGJ1ZmZlciAqLwotCXJlc3VsdCA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9Mb2NrKG1peGJ1ZiwgY3Vyc29yLCBtaXhsZW4sCi0JCQkJKExQVk9JRCAqKSZsb2NrZWRfYnVmLCAmcmF3bGVuLCBOVUxMLCAmanVuaywgMCk7Ci0JaWYgKCByZXN1bHQgPT0gRFNFUlJfQlVGRkVSTE9TVCApIHsKLQkJSURpcmVjdFNvdW5kQnVmZmVyX1Jlc3RvcmUobWl4YnVmKTsKLQkJcmVzdWx0ID0gSURpcmVjdFNvdW5kQnVmZmVyX0xvY2sobWl4YnVmLCBjdXJzb3IsIG1peGxlbiwKLQkJCQkoTFBWT0lEICopJmxvY2tlZF9idWYsICZyYXdsZW4sIE5VTEwsICZqdW5rLCAwKTsKLQl9Ci0JaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7Ci0JCVNldERTZXJyb3IoIkRpcmVjdFNvdW5kIExvY2siLCByZXN1bHQpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCXJldHVybihsb2NrZWRfYnVmKTsKLX0KLQotc3RhdGljIHZvaWQgRFg1X1dhaXREb25lKF9USElTKQotewotCVVpbnQ4ICpzdHJlYW07Ci0KLQkvKiBXYWl0IGZvciB0aGUgcGxheWluZyBjaHVuayB0byBmaW5pc2ggKi8KLQlzdHJlYW0gPSB0aGlzLT5HZXRBdWRpb0J1Zih0aGlzKTsKLQlpZiAoIHN0cmVhbSAhPSBOVUxMICkgewotCQlTRExfbWVtc2V0KHN0cmVhbSwgc2lsZW5jZSwgbWl4bGVuKTsKLQkJdGhpcy0+UGxheUF1ZGlvKHRoaXMpOwotCX0KLQl0aGlzLT5XYWl0QXVkaW8odGhpcyk7Ci0KLQkvKiBTdG9wIHRoZSBsb29waW5nIHNvdW5kIGJ1ZmZlciAqLwotCUlEaXJlY3RTb3VuZEJ1ZmZlcl9TdG9wKG1peGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkIERYNV9DbG9zZUF1ZGlvKF9USElTKQotewotCWlmICggc291bmQgIT0gTlVMTCApIHsKLQkJaWYgKCBtaXhidWYgIT0gTlVMTCApIHsKLQkJCS8qIENsZWFuIHVwIHRoZSBhdWRpbyBidWZmZXIgKi8KLQkJCUlEaXJlY3RTb3VuZEJ1ZmZlcl9SZWxlYXNlKG1peGJ1Zik7Ci0JCQltaXhidWYgPSBOVUxMOwotCQl9Ci0JCWlmICggYXVkaW9fZXZlbnQgIT0gTlVMTCApIHsKLQkJCUNsb3NlSGFuZGxlKGF1ZGlvX2V2ZW50KTsKLQkJCWF1ZGlvX2V2ZW50ID0gTlVMTDsKLQkJfQotCQlJRGlyZWN0U291bmRfUmVsZWFzZShzb3VuZCk7Ci0JCXNvdW5kID0gTlVMTDsKLQl9Ci19Ci0KLSNpZmRlZiBVU0VfUFJJTUFSWV9CVUZGRVIKLS8qIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gY3JlYXRlIGEgcHJpbWFyeSBhdWRpbyBidWZmZXIsIGFuZCByZXR1cm5zIHRoZQotICAgbnVtYmVyIG9mIGF1ZGlvIGNodW5rcyBhdmFpbGFibGUgaW4gdGhlIGNyZWF0ZWQgYnVmZmVyLgotKi8KLXN0YXRpYyBpbnQgQ3JlYXRlUHJpbWFyeShMUERJUkVDVFNPVU5EIHNuZE9iaiwgSFdORCBmb2N1cywgCi0JTFBESVJFQ1RTT1VOREJVRkZFUiAqc25kYnVmLCBXQVZFRk9STUFURVggKndhdmVmbXQsIFVpbnQzMiBjaHVua3NpemUpCi17Ci0JSFJFU1VMVCByZXN1bHQ7Ci0JRFNCVUZGRVJERVNDIGZvcm1hdDsKLQlEU0JDQVBTIGNhcHM7Ci0JaW50IG51bWNodW5rczsKLQotCS8qIFRyeSB0byBzZXQgcHJpbWFyeSBtaXhpbmcgcHJpdmlsZWdlcyAqLwotCXJlc3VsdCA9IElEaXJlY3RTb3VuZF9TZXRDb29wZXJhdGl2ZUxldmVsKHNuZE9iaiwgZm9jdXMsCi0JCQkJCQkJRFNTQ0xfV1JJVEVQUklNQVJZKTsKLQlpZiAoIHJlc3VsdCAhPSBEU19PSyApIHsKLSNpZmRlZiBERUJVR19TT1VORAotCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBTZXRDb29wZXJhdGl2ZUxldmVsIiwgcmVzdWx0KTsKLSNlbmRpZgotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFRyeSB0byBjcmVhdGUgdGhlIHByaW1hcnkgYnVmZmVyICovCi0JU0RMX21lbXNldCgmZm9ybWF0LCAwLCBzaXplb2YoZm9ybWF0KSk7Ci0JZm9ybWF0LmR3U2l6ZSA9IHNpemVvZihmb3JtYXQpOwotCWZvcm1hdC5kd0ZsYWdzPShEU0JDQVBTX1BSSU1BUllCVUZGRVJ8RFNCQ0FQU19HRVRDVVJSRU5UUE9TSVRJT04yKTsKLQlmb3JtYXQuZHdGbGFncyB8PSBEU0JDQVBTX1NUSUNLWUZPQ1VTOwotI2lmZGVmIFVTRV9QT1NJVElPTl9OT1RJRlkKLQlmb3JtYXQuZHdGbGFncyB8PSBEU0JDQVBTX0NUUkxQT1NJVElPTk5PVElGWTsKLSNlbmRpZgotCXJlc3VsdCA9IElEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlcihzbmRPYmosICZmb3JtYXQsIHNuZGJ1ZiwgTlVMTCk7Ci0JaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7Ci0jaWZkZWYgREVCVUdfU09VTkQKLQkJU2V0RFNlcnJvcigiRGlyZWN0U291bmQgQ3JlYXRlU291bmRCdWZmZXIiLCByZXN1bHQpOwotI2VuZGlmCi0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGZyYWdtZW50IGJ1ZmZlciAqLwotCVNETF9tZW1zZXQoJmNhcHMsIDAsIHNpemVvZihjYXBzKSk7Ci0JY2Fwcy5kd1NpemUgPSBzaXplb2YoY2Fwcyk7Ci0JcmVzdWx0ID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldENhcHMoKnNuZGJ1ZiwgJmNhcHMpOwotCWlmICggcmVzdWx0ICE9IERTX09LICkgewotI2lmZGVmIERFQlVHX1NPVU5ECi0JCVNldERTZXJyb3IoIkRpcmVjdFNvdW5kIEdldENhcHMiLCByZXN1bHQpOwotI2VuZGlmCi0JCUlEaXJlY3RTb3VuZEJ1ZmZlcl9SZWxlYXNlKCpzbmRidWYpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlpZiAoIChjaHVua3NpemUgPiBjYXBzLmR3QnVmZmVyQnl0ZXMpIHx8Ci0JCQkJKChjYXBzLmR3QnVmZmVyQnl0ZXMlY2h1bmtzaXplKSAhPSAwKSApIHsKLQkJLyogVGhlIHByaW1hcnkgYnVmZmVyIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgJ2NodW5rc2l6ZScKLQkJICAgLS0gdGhpcyBob3BlZnVsbHkgZG9lc24ndCBoYXBwZW4gd2hlbiAnY2h1bmtzaXplJyBpcyBhIAotCQkgICAgICBwb3dlciBvZiAyLgotCQkqLwotCQlJRGlyZWN0U291bmRCdWZmZXJfUmVsZWFzZSgqc25kYnVmKTsKLQkJU0RMX1NldEVycm9yKAotIlByaW1hcnkgYnVmZmVyIHNpemUgaXM6ICVkLCBjYW5ub3QgYnJlYWsgaXQgaW50byBjaHVua3Mgb2YgJWQgYnl0ZXNcbiIsCi0JCQkJCWNhcHMuZHdCdWZmZXJCeXRlcywgY2h1bmtzaXplKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JbnVtY2h1bmtzID0gKGNhcHMuZHdCdWZmZXJCeXRlcy9jaHVua3NpemUpOwotCi0JLyogU2V0IHRoZSBwcmltYXJ5IGF1ZGlvIGZvcm1hdCAqLwotCXJlc3VsdCA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9TZXRGb3JtYXQoKnNuZGJ1Ziwgd2F2ZWZtdCk7Ci0JaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7Ci0jaWZkZWYgREVCVUdfU09VTkQKLQkJU2V0RFNlcnJvcigiRGlyZWN0U291bmQgU2V0Rm9ybWF0IiwgcmVzdWx0KTsKLSNlbmRpZgotCQlJRGlyZWN0U291bmRCdWZmZXJfUmVsZWFzZSgqc25kYnVmKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcmV0dXJuKG51bWNodW5rcyk7Ci19Ci0jZW5kaWYgLyogVVNFX1BSSU1BUllfQlVGRkVSICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gY3JlYXRlIGEgc2Vjb25kYXJ5IGF1ZGlvIGJ1ZmZlciwgYW5kIHJldHVybnMgdGhlCi0gICBudW1iZXIgb2YgYXVkaW8gY2h1bmtzIGF2YWlsYWJsZSBpbiB0aGUgY3JlYXRlZCBidWZmZXIuCi0qLwotc3RhdGljIGludCBDcmVhdGVTZWNvbmRhcnkoTFBESVJFQ1RTT1VORCBzbmRPYmosIEhXTkQgZm9jdXMsCi0JTFBESVJFQ1RTT1VOREJVRkZFUiAqc25kYnVmLCBXQVZFRk9STUFURVggKndhdmVmbXQsIFVpbnQzMiBjaHVua3NpemUpCi17Ci0JY29uc3QgaW50IG51bWNodW5rcyA9IDg7Ci0JSFJFU1VMVCByZXN1bHQ7Ci0JRFNCVUZGRVJERVNDIGZvcm1hdDsKLQlMUFZPSUQgcHZBdWRpb1B0cjEsIHB2QXVkaW9QdHIyOwotCURXT1JEICBkd0F1ZGlvQnl0ZXMxLCBkd0F1ZGlvQnl0ZXMyOwotCi0JLyogVHJ5IHRvIHNldCBwcmltYXJ5IG1peGluZyBwcml2aWxlZ2VzICovCi0JaWYgKCBmb2N1cyApIHsKLQkJcmVzdWx0ID0gSURpcmVjdFNvdW5kX1NldENvb3BlcmF0aXZlTGV2ZWwoc25kT2JqLAotCQkJCQlmb2N1cywgRFNTQ0xfUFJJT1JJVFkpOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IElEaXJlY3RTb3VuZF9TZXRDb29wZXJhdGl2ZUxldmVsKHNuZE9iaiwKLQkJCQkJR2V0RGVza3RvcFdpbmRvdygpLCBEU1NDTF9OT1JNQUwpOwotCX0KLQlpZiAoIHJlc3VsdCAhPSBEU19PSyApIHsKLSNpZmRlZiBERUJVR19TT1VORAotCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBTZXRDb29wZXJhdGl2ZUxldmVsIiwgcmVzdWx0KTsKLSNlbmRpZgotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFRyeSB0byBjcmVhdGUgdGhlIHNlY29uZGFyeSBidWZmZXIgKi8KLQlTRExfbWVtc2V0KCZmb3JtYXQsIDAsIHNpemVvZihmb3JtYXQpKTsKLQlmb3JtYXQuZHdTaXplID0gc2l6ZW9mKGZvcm1hdCk7Ci0JZm9ybWF0LmR3RmxhZ3MgPSBEU0JDQVBTX0dFVENVUlJFTlRQT1NJVElPTjI7Ci0jaWZkZWYgVVNFX1BPU0lUSU9OX05PVElGWQotCWZvcm1hdC5kd0ZsYWdzIHw9IERTQkNBUFNfQ1RSTFBPU0lUSU9OTk9USUZZOwotI2VuZGlmCi0JaWYgKCAhIGZvY3VzICkgewotCQlmb3JtYXQuZHdGbGFncyB8PSBEU0JDQVBTX0dMT0JBTEZPQ1VTOwotCX0gZWxzZSB7Ci0JCWZvcm1hdC5kd0ZsYWdzIHw9IERTQkNBUFNfU1RJQ0tZRk9DVVM7Ci0JfQotCWZvcm1hdC5kd0J1ZmZlckJ5dGVzID0gbnVtY2h1bmtzKmNodW5rc2l6ZTsKLQlpZiAoIChmb3JtYXQuZHdCdWZmZXJCeXRlcyA8IERTQlNJWkVfTUlOKSB8fAotCSAgICAgKGZvcm1hdC5kd0J1ZmZlckJ5dGVzID4gRFNCU0laRV9NQVgpICkgewotCQlTRExfU2V0RXJyb3IoIlNvdW5kIGJ1ZmZlciBzaXplIG11c3QgYmUgYmV0d2VlbiAlZCBhbmQgJWQiLAotCQkJCURTQlNJWkVfTUlOL251bWNodW5rcywgRFNCU0laRV9NQVgvbnVtY2h1bmtzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JZm9ybWF0LmR3UmVzZXJ2ZWQgPSAwOwotCWZvcm1hdC5scHdmeEZvcm1hdCA9IHdhdmVmbXQ7Ci0JcmVzdWx0ID0gSURpcmVjdFNvdW5kX0NyZWF0ZVNvdW5kQnVmZmVyKHNuZE9iaiwgJmZvcm1hdCwgc25kYnVmLCBOVUxMKTsKLQlpZiAoIHJlc3VsdCAhPSBEU19PSyApIHsKLQkJU2V0RFNlcnJvcigiRGlyZWN0U291bmQgQ3JlYXRlU291bmRCdWZmZXIiLCByZXN1bHQpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlJRGlyZWN0U291bmRCdWZmZXJfU2V0Rm9ybWF0KCpzbmRidWYsIHdhdmVmbXQpOwotCi0JLyogU2lsZW5jZSB0aGUgaW5pdGlhbCBhdWRpbyBidWZmZXIgKi8KLQlyZXN1bHQgPSBJRGlyZWN0U291bmRCdWZmZXJfTG9jaygqc25kYnVmLCAwLCBmb3JtYXQuZHdCdWZmZXJCeXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEICopJnB2QXVkaW9QdHIxLCAmZHdBdWRpb0J5dGVzMSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEICopJnB2QXVkaW9QdHIyLCAmZHdBdWRpb0J5dGVzMiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0JMT0NLX0VOVElSRUJVRkZFUik7Ci0JaWYgKCByZXN1bHQgPT0gRFNfT0sgKSB7Ci0JCWlmICggd2F2ZWZtdC0+d0JpdHNQZXJTYW1wbGUgPT0gOCApIHsKLQkJCVNETF9tZW1zZXQocHZBdWRpb1B0cjEsIDB4ODAsIGR3QXVkaW9CeXRlczEpOwotCQl9IGVsc2UgewotCQkJU0RMX21lbXNldChwdkF1ZGlvUHRyMSwgMHgwMCwgZHdBdWRpb0J5dGVzMSk7Ci0JCX0KLQkJSURpcmVjdFNvdW5kQnVmZmVyX1VubG9jaygqc25kYnVmLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpcHZBdWRpb1B0cjEsIGR3QXVkaW9CeXRlczEsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRClwdkF1ZGlvUHRyMiwgZHdBdWRpb0J5dGVzMik7Ci0JfQotCi0JLyogV2UncmUgcmVhZHkgdG8gZ28gKi8KLQlyZXR1cm4obnVtY2h1bmtzKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBzZXQgcG9zaXRpb24gbm90aWZ5IGV2ZW50cyBvbiB0aGUgbWl4aW5nIGJ1ZmZlciAqLwotI2lmZGVmIFVTRV9QT1NJVElPTl9OT1RJRlkKLXN0YXRpYyBpbnQgQ3JlYXRlQXVkaW9FdmVudChfVEhJUykKLXsKLQlMUERJUkVDVFNPVU5ETk9USUZZIG5vdGlmeTsKLQlEU0JQT1NJVElPTk5PVElGWSAqbm90aWZ5X3Bvc2l0aW9uczsKLQlpbnQgaSwgcmV0dmFsOwotCUhSRVNVTFQgcmVzdWx0OwotCi0JLyogRGVmYXVsdCB0byBmYWlsIG9uIGV4aXQgKi8KLQlyZXR2YWwgPSAtMTsKLQlub3RpZnkgPSBOVUxMOwotCi0JLyogUXVlcnkgZm9yIHRoZSBpbnRlcmZhY2UgKi8KLQlyZXN1bHQgPSBJRGlyZWN0U291bmRCdWZmZXJfUXVlcnlJbnRlcmZhY2UobWl4YnVmLAotCQkJJklJRF9JRGlyZWN0U291bmROb3RpZnksICh2b2lkICopJm5vdGlmeSk7Ci0JaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgbm90aWZ5IHN0cnVjdHVyZXMgKi8KLQlub3RpZnlfcG9zaXRpb25zID0gKERTQlBPU0lUSU9OTk9USUZZICopU0RMX21hbGxvYyhOVU1fQlVGRkVSUyoKLQkJCQkJc2l6ZW9mKCpub3RpZnlfcG9zaXRpb25zKSk7Ci0JaWYgKCBub3RpZnlfcG9zaXRpb25zID09IE5VTEwgKSB7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBDcmVhdGUgdGhlIG5vdGlmeSBldmVudCAqLwotCWF1ZGlvX2V2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKLQlpZiAoIGF1ZGlvX2V2ZW50ID09IE5VTEwgKSB7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIG5vdGlmeSBzdHJ1Y3R1cmVzICovCi0JZm9yICggaT0wOyBpPE5VTV9CVUZGRVJTOyArK2kgKSB7Ci0JCW5vdGlmeV9wb3NpdGlvbnNbaV0uZHdPZmZzZXQgPSBpKm1peGxlbjsKLQkJbm90aWZ5X3Bvc2l0aW9uc1tpXS5oRXZlbnROb3RpZnkgPSBhdWRpb19ldmVudDsKLQl9Ci0JcmVzdWx0ID0gSURpcmVjdFNvdW5kTm90aWZ5X1NldE5vdGlmaWNhdGlvblBvc2l0aW9ucyhub3RpZnksCi0JCQkJCU5VTV9CVUZGRVJTLCBub3RpZnlfcG9zaXRpb25zKTsKLQlpZiAoIHJlc3VsdCA9PSBEU19PSyApIHsKLQkJcmV0dmFsID0gMDsKLQl9Ci1kb25lOgotCWlmICggbm90aWZ5ICE9IE5VTEwgKSB7Ci0JCUlEaXJlY3RTb3VuZE5vdGlmeV9SZWxlYXNlKG5vdGlmeSk7Ci0JfQotCXJldHVybihyZXR2YWwpOwotfQotI2VuZGlmIC8qIFVTRV9QT1NJVElPTl9OT1RJRlkgKi8KLQotc3RhdGljIGludCBEWDVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQotewotCUhSRVNVTFQgICAgICByZXN1bHQ7Ci0JV0FWRUZPUk1BVEVYIHdhdmVmb3JtYXQ7Ci0KLQkvKiBTZXQgYmFzaWMgV0FWRSBmb3JtYXQgcGFyYW1ldGVycyAqLwotCVNETF9tZW1zZXQoJndhdmVmb3JtYXQsIDAsIHNpemVvZih3YXZlZm9ybWF0KSk7Ci0Jd2F2ZWZvcm1hdC53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOwotCi0JLyogRGV0ZXJtaW5lIHRoZSBhdWRpbyBwYXJhbWV0ZXJzIGZyb20gdGhlIEF1ZGlvU3BlYyAqLwotCXN3aXRjaCAoIHNwZWMtPmZvcm1hdCAmIDB4RkYgKSB7Ci0JCWNhc2UgODoKLQkJCS8qIFVuc2lnbmVkIDggYml0IGF1ZGlvIGRhdGEgKi8KLQkJCXNwZWMtPmZvcm1hdCA9IEFVRElPX1U4OwotCQkJc2lsZW5jZSA9IDB4ODA7Ci0JCQl3YXZlZm9ybWF0LndCaXRzUGVyU2FtcGxlID0gODsKLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQkJLyogU2lnbmVkIDE2IGJpdCBhdWRpbyBkYXRhICovCi0JCQlzcGVjLT5mb3JtYXQgPSBBVURJT19TMTY7Ci0JCQlzaWxlbmNlID0gMHgwMDsKLQkJCXdhdmVmb3JtYXQud0JpdHNQZXJTYW1wbGUgPSAxNjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKLQkJCXJldHVybigtMSk7Ci0JfQotCXdhdmVmb3JtYXQubkNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7Ci0Jd2F2ZWZvcm1hdC5uU2FtcGxlc1BlclNlYyA9IHNwZWMtPmZyZXE7Ci0Jd2F2ZWZvcm1hdC5uQmxvY2tBbGlnbiA9Ci0JCXdhdmVmb3JtYXQubkNoYW5uZWxzICogKHdhdmVmb3JtYXQud0JpdHNQZXJTYW1wbGUvOCk7Ci0Jd2F2ZWZvcm1hdC5uQXZnQnl0ZXNQZXJTZWMgPSAKLQkJd2F2ZWZvcm1hdC5uU2FtcGxlc1BlclNlYyAqIHdhdmVmb3JtYXQubkJsb2NrQWxpZ247Ci0KLQkvKiBVcGRhdGUgdGhlIGZyYWdtZW50IHNpemUgYXMgc2l6ZSBpbiBieXRlcyAqLwotCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7Ci0KLQkvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KLQlyZXN1bHQgPSBEU291bmRDcmVhdGUoTlVMTCwgJnNvdW5kLCBOVUxMKTsKLQlpZiAoIHJlc3VsdCAhPSBEU19PSyApIHsKLQkJU2V0RFNlcnJvcigiRGlyZWN0U291bmRDcmVhdGUiLCByZXN1bHQpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIENyZWF0ZSB0aGUgYXVkaW8gYnVmZmVyIHRvIHdoaWNoIHdlIHdyaXRlICovCi0JTlVNX0JVRkZFUlMgPSAtMTsKLSNpZmRlZiBVU0VfUFJJTUFSWV9CVUZGRVIKLQlpZiAoIG1haW53aW4gKSB7Ci0JCU5VTV9CVUZGRVJTID0gQ3JlYXRlUHJpbWFyeShzb3VuZCwgbWFpbndpbiwgJm1peGJ1ZiwKLQkJCQkJCSZ3YXZlZm9ybWF0LCBzcGVjLT5zaXplKTsKLQl9Ci0jZW5kaWYgLyogVVNFX1BSSU1BUllfQlVGRkVSICovCi0JaWYgKCBOVU1fQlVGRkVSUyA8IDAgKSB7Ci0JCU5VTV9CVUZGRVJTID0gQ3JlYXRlU2Vjb25kYXJ5KHNvdW5kLCBtYWlud2luLCAmbWl4YnVmLAotCQkJCQkJJndhdmVmb3JtYXQsIHNwZWMtPnNpemUpOwotCQlpZiAoIE5VTV9CVUZGRVJTIDwgMCApIHsKLQkJCXJldHVybigtMSk7Ci0JCX0KLSNpZmRlZiBERUJVR19TT1VORAotCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIHNlY29uZGFyeSBhdWRpbyBidWZmZXJcbiIpOwotI2VuZGlmCi0JfQotI2lmZGVmIERFQlVHX1NPVU5ECi0JZWxzZQotCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIHByaW1hcnkgYXVkaW8gYnVmZmVyXG4iKTsKLSNlbmRpZgotCi0JLyogVGhlIGJ1ZmZlciB3aWxsIGF1dG8tc3RhcnQgcGxheWluZyBpbiBEWDVfV2FpdEF1ZGlvKCkgKi8KLQlsYXN0Y2h1bmsgPSAwOwotCW1peGxlbiA9IHNwZWMtPnNpemU7Ci0KLSNpZmRlZiBVU0VfUE9TSVRJT05fTk9USUZZCi0JLyogU2VlIGlmIHdlIGNhbiB1c2UgRGlyZWN0WCA2IGV2ZW50IG5vdGlmaWNhdGlvbiAqLwotCWlmICggQ3JlYXRlQXVkaW9FdmVudCh0aGlzKSA9PSAwICkgewotCQl0aGlzLT5XYWl0QXVkaW8gPSBEWDZfV2FpdEF1ZGlvX0V2ZW50V2FpdDsKLQl9IGVsc2UgewotCQl0aGlzLT5XYWl0QXVkaW8gPSBEWDVfV2FpdEF1ZGlvX0J1c3lXYWl0OwotCX0KLSNlbmRpZgotCXJldHVybigwKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby93aW5keDUvU0RMX2R4NWF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL3dpbmR4NS9TRExfZHg1YXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViZGY2ZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2F1ZGlvL3dpbmR4NS9TRExfZHg1YXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfbG93YXVkaW9faAotI2RlZmluZSBfU0RMX2xvd2F1ZGlvX2gKLQotI2luY2x1ZGUgImRpcmVjdHguaCIKLQotI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCi0KLS8qIFRoZSBEaXJlY3RTb3VuZCBvYmplY3RzICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgewotCUxQRElSRUNUU09VTkQgc291bmQ7Ci0JTFBESVJFQ1RTT1VOREJVRkZFUiBtaXhidWY7Ci0JaW50IE5VTV9CVUZGRVJTOwotCWludCBtaXhsZW4sIHNpbGVuY2U7Ci0JRFdPUkQgbGFzdGNodW5rOwotCVVpbnQ4ICpsb2NrZWRfYnVmOwotCUhBTkRMRSBhdWRpb19ldmVudDsKLX07Ci0KLS8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLwotI2RlZmluZSBzb3VuZAkJCSh0aGlzLT5oaWRkZW4tPnNvdW5kKQotI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCi0jZGVmaW5lIE5VTV9CVUZGRVJTCQkodGhpcy0+aGlkZGVuLT5OVU1fQlVGRkVSUykKLSNkZWZpbmUgbWl4bGVuCQkJKHRoaXMtPmhpZGRlbi0+bWl4bGVuKQotI2RlZmluZSBzaWxlbmNlCQkJKHRoaXMtPmhpZGRlbi0+c2lsZW5jZSkKLSNkZWZpbmUgbGFzdGNodW5rCQkodGhpcy0+aGlkZGVuLT5sYXN0Y2h1bmspCi0jZGVmaW5lIGxvY2tlZF9idWYJCSh0aGlzLT5oaWRkZW4tPmxvY2tlZF9idWYpCi0jZGVmaW5lIGF1ZGlvX2V2ZW50CQkodGhpcy0+aGlkZGVuLT5hdWRpb19ldmVudCkKLQotI2VuZGlmIC8qIF9TRExfbG93YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby93aW5keDUvZGlyZWN0eC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9hdWRpby93aW5keDUvZGlyZWN0eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTRkNmM2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vd2luZHg1L2RpcmVjdHguaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLQotI2lmbmRlZiBfZGlyZWN0eF9oCi0jZGVmaW5lIF9kaXJlY3R4X2gKLQotLyogSW5jbHVkZSBhbGwgb2YgdGhlIERpcmVjdFggNS4wIGhlYWRlcnMgYW5kIGFkZHMgYW55IG5lY2Vzc2FyeSB0d2Vha3MgKi8KLQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPG1tc3lzdGVtLmg+Ci0jaWZuZGVmIFdJTjMyCi0jZGVmaW5lIFdJTjMyCi0jZW5kaWYKLSN1bmRlZiAgV0lOTlQKLQotLyogRmFyIHBvaW50ZXJzIGRvbid0IGV4aXN0IGluIDMyLWJpdCBjb2RlICovCi0jaWZuZGVmIEZBUgotI2RlZmluZSBGQVIKLSNlbmRpZgotCi0vKiBFcnJvciBjb2RlcyBub3QgeWV0IGluY2x1ZGVkIGluIFdpbjMyIEFQSSBoZWFkZXIgZmlsZXMgKi8KLSNpZm5kZWYgTUFLRV9IUkVTVUxUCi0jZGVmaW5lIE1BS0VfSFJFU1VMVChzZXYsZmFjLGNvZGUpIFwKLQkoKEhSRVNVTFQpKCgodW5zaWduZWQgbG9uZykoc2V2KTw8MzEpIHwgKCh1bnNpZ25lZCBsb25nKShmYWMpPDwxNikgfCAoKHVuc2lnbmVkIGxvbmcpKGNvZGUpKSkpCi0jZW5kaWYKLQotI2lmbmRlZiBTX09LCi0jZGVmaW5lIFNfT0sJCShIUkVTVUxUKTB4MDAwMDAwMDBMCi0jZW5kaWYKLQotI2lmbmRlZiBTVUNDRUVERUQKLSNkZWZpbmUgU1VDQ0VFREVEKHgpCSgoSFJFU1VMVCkoeCkgPj0gMCkKLSNlbmRpZgotI2lmbmRlZiBGQUlMRUQKLSNkZWZpbmUgRkFJTEVEKHgpCSgoSFJFU1VMVCkoeCk8MCkKLSNlbmRpZgotCi0jaWZuZGVmIEVfRkFJTAotI2RlZmluZSBFX0ZBSUwJCShIUkVTVUxUKTB4ODAwMDAwMDhMCi0jZW5kaWYKLSNpZm5kZWYgRV9OT0lOVEVSRkFDRQotI2RlZmluZSBFX05PSU5URVJGQUNFCShIUkVTVUxUKTB4ODAwMDQwMDJMCi0jZW5kaWYKLSNpZm5kZWYgRV9PVVRPRk1FTU9SWQotI2RlZmluZSBFX09VVE9GTUVNT1JZCShIUkVTVUxUKTB4ODAwNzAwMEVMCi0jZW5kaWYKLSNpZm5kZWYgRV9JTlZBTElEQVJHCi0jZGVmaW5lIEVfSU5WQUxJREFSRwkoSFJFU1VMVCkweDgwMDcwMDU3TAotI2VuZGlmCi0jaWZuZGVmIEVfTk9USU1QTAotI2RlZmluZSBFX05PVElNUEwJKEhSRVNVTFQpMHg4MDAwNDAwMUwKLSNlbmRpZgotI2lmbmRlZiBSRUdEQl9FX0NMQVNTTk9UUkVHCi0jZGVmaW5lIFJFR0RCX0VfQ0xBU1NOT1RSRUcJKEhSRVNVTFQpMHg4MDA0MDE1NEwKLSNlbmRpZgotCi0vKiBTZXZlcml0eSBjb2RlcyAqLwotI2lmbmRlZiBTRVZFUklUWV9FUlJPUgotI2RlZmluZSBTRVZFUklUWV9FUlJPUgkxCi0jZW5kaWYKLQotLyogRXJyb3IgZmFjaWxpdHkgY29kZXMgKi8KLSNpZm5kZWYgRkFDSUxJVFlfV0lOMzIKLSNkZWZpbmUgRkFDSUxJVFlfV0lOMzIJNwotI2VuZGlmCi0KLSNpZm5kZWYgRklFTERfT0ZGU0VUCi0jZGVmaW5lIEZJRUxEX09GRlNFVCh0eXBlLCBmaWVsZCkgICAgKChMT05HKSYoKCh0eXBlICopMCktPmZpZWxkKSkKLSNlbmRpZgotCi0vKiBEaXJlY3RYIGhlYWRlcnMgKGlmIGl0IGlzbid0IGluY2x1ZGVkLCBJIGhhdmVuJ3QgdGVzdGVkIGl0IHlldCkKLSAqLwotLyogV2UgbmVlZCB0aGVzZSBkZWZpbmVzIHRvIG1hcmsgd2hhdCB2ZXJzaW9uIG9mIERpcmVjdFggQVBJIHdlIHVzZSAqLwotI2RlZmluZSBESVJFQ1REUkFXX1ZFUlNJT04gIDB4MDcwMAotI2RlZmluZSBESVJFQ1RTT1VORF9WRVJTSU9OIDB4MDUwMAotI2RlZmluZSBESVJFQ1RJTlBVVF9WRVJTSU9OIDB4MDUwMAotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCi0jZW5kaWYKLSNpbmNsdWRlIDxkZHJhdy5oPgotI2luY2x1ZGUgPGRzb3VuZC5oPgotI2luY2x1ZGUgPGRpbnB1dC5oPgotCi0jZW5kaWYgLyogX2RpcmVjdHhfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9TRExfY2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vU0RMX2Nkcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDJiNWEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9TRExfY2Ryb20uYworKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBpcyB0aGUgQ0QtYXVkaW8gY29udHJvbCBBUEkgZm9yIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciAqLwotCi0jaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCi0jaW5jbHVkZSAiU0RMX3N5c2Nkcm9tLmgiCi0KLSNpZiAhZGVmaW5lZChfX01BQ09TX18pCi0jZGVmaW5lIENMSVBfRlJBTUVTCTEwCS8qIFNvbWUgQ0QtUk9NcyB3b24ndCBnbyBhbGwgdGhlIHdheSAqLwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgU0RMX2NkaW5pdHRlZCA9IDA7Ci1zdGF0aWMgU0RMX0NEICpkZWZhdWx0X2Nkcm9tOwotCi0vKiBUaGUgc3lzdGVtIGxldmVsIENELVJPTSBjb250cm9sIGZ1bmN0aW9ucyAqLwotc3RydWN0IENEY2FwcyBTRExfQ0RjYXBzID0gewotCU5VTEwsCQkJCQkvKiBOYW1lICovCi0JTlVMTCwJCQkJCS8qIE9wZW4gKi8KLQlOVUxMLAkJCQkJLyogR2V0VE9DICovCi0JTlVMTCwJCQkJCS8qIFN0YXR1cyAqLwotCU5VTEwsCQkJCQkvKiBQbGF5ICovCi0JTlVMTCwJCQkJCS8qIFBhdXNlICovCi0JTlVMTCwJCQkJCS8qIFJlc3VtZSAqLwotCU5VTEwsCQkJCQkvKiBTdG9wICovCi0JTlVMTCwJCQkJCS8qIEVqZWN0ICovCi0JTlVMTCwJCQkJCS8qIENsb3NlICovCi19OwotaW50IFNETF9udW1jZHM7Ci0KLWludCBTRExfQ0RST01Jbml0KHZvaWQpCi17Ci0JaW50IHJldHZhbDsKLQotCVNETF9udW1jZHMgPSAwOwotCXJldHZhbCA9IFNETF9TWVNfQ0RJbml0KCk7Ci0JaWYgKCByZXR2YWwgPT0gMCApIHsKLQkJU0RMX2NkaW5pdHRlZCA9IDE7Ci0JfQotCWRlZmF1bHRfY2Ryb20gPSBOVUxMOwotCXJldHVybihyZXR2YWwpOwotfQotCi0vKiBDaGVjayB0byBzZWUgaWYgdGhlIENELVJPTSBzdWJzeXN0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLXN0YXRpYyBpbnQgQ2hlY2tJbml0KGludCBjaGVja19jZHJvbSwgU0RMX0NEICoqY2Ryb20pCi17Ci0JaW50IG9rYXk7Ci0KLQlva2F5ID0gU0RMX2NkaW5pdHRlZDsKLQlpZiAoIGNoZWNrX2Nkcm9tICYmICgqY2Ryb20gPT0gTlVMTCkgKSB7Ci0JCSpjZHJvbSA9IGRlZmF1bHRfY2Ryb207Ci0JCWlmICggKmNkcm9tID09IE5VTEwgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIkNELVJPTSBub3Qgb3BlbmVkIik7Ci0JCQlva2F5ID0gMDsKLQkJfQotCX0KLQlpZiAoICEgU0RMX2NkaW5pdHRlZCApIHsKLQkJU0RMX1NldEVycm9yKCJDRC1ST00gc3Vic3lzdGVtIG5vdCBpbml0aWFsaXplZCIpOwotCX0KLQlyZXR1cm4ob2theSk7Ci19Ci0KLWludCBTRExfQ0ROdW1Ecml2ZXModm9pZCkKLXsKLQlpZiAoICEgQ2hlY2tJbml0KDAsIE5VTEwpICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oU0RMX251bWNkcyk7Ci19Ci0KLWNvbnN0IGNoYXIgKlNETF9DRE5hbWUoaW50IGRyaXZlKQotewotCWlmICggISBDaGVja0luaXQoMCwgTlVMTCkgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JaWYgKCBkcml2ZSA+PSBTRExfbnVtY2RzICkgewotCQlTRExfU2V0RXJyb3IoIkludmFsaWQgQ0QtUk9NIGRyaXZlIGluZGV4Iik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JaWYgKCBTRExfQ0RjYXBzLk5hbWUgKSB7Ci0JCXJldHVybihTRExfQ0RjYXBzLk5hbWUoZHJpdmUpKTsKLQl9IGVsc2UgewotCQlyZXR1cm4oIiIpOwotCX0KLX0KLQotU0RMX0NEICpTRExfQ0RPcGVuKGludCBkcml2ZSkKLXsKLQlzdHJ1Y3QgU0RMX0NEICpjZHJvbTsKLQotCWlmICggISBDaGVja0luaXQoMCwgTlVMTCkgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JaWYgKCBkcml2ZSA+PSBTRExfbnVtY2RzICkgewotCQlTRExfU2V0RXJyb3IoIkludmFsaWQgQ0QtUk9NIGRyaXZlIGluZGV4Iik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JY2Ryb20gPSAoU0RMX0NEICopU0RMX21hbGxvYyhzaXplb2YoKmNkcm9tKSk7Ci0JaWYgKCBjZHJvbSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlTRExfbWVtc2V0KGNkcm9tLCAwLCBzaXplb2YoKmNkcm9tKSk7Ci0JY2Ryb20tPmlkID0gU0RMX0NEY2Fwcy5PcGVuKGRyaXZlKTsKLQlpZiAoIGNkcm9tLT5pZCA8IDAgKSB7Ci0JCVNETF9mcmVlKGNkcm9tKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlkZWZhdWx0X2Nkcm9tID0gY2Ryb207Ci0JcmV0dXJuKGNkcm9tKTsKLX0KLQotQ0RzdGF0dXMgU0RMX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20pCi17Ci0JQ0RzdGF0dXMgc3RhdHVzOwotCWludCBpOwotCVVpbnQzMiBwb3NpdGlvbjsKLQotCS8qIENoZWNrIGlmIHRoZSBDRC1ST00gc3Vic3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkICovCi0JaWYgKCAhIENoZWNrSW5pdCgxLCAmY2Ryb20pICkgewotCQlyZXR1cm4oQ0RfRVJST1IpOwotCX0KLQotCS8qIEdldCB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGRyaXZlICovCi0JY2Ryb20tPm51bXRyYWNrcyA9IDA7Ci0JY2Ryb20tPmN1cl90cmFjayA9IDA7Ci0JY2Ryb20tPmN1cl9mcmFtZSA9IDA7Ci0Jc3RhdHVzID0gU0RMX0NEY2Fwcy5TdGF0dXMoY2Ryb20sICZpKTsKLQlwb3NpdGlvbiA9IChVaW50MzIpaTsKLQljZHJvbS0+c3RhdHVzID0gc3RhdHVzOwotCi0JLyogR2V0IHRoZSB0YWJsZSBvZiBjb250ZW50cywgaWYgdGhlcmUncyBhIENEIGF2YWlsYWJsZSAqLwotCWlmICggQ0RfSU5EUklWRShzdGF0dXMpICkgewotCQlpZiAoIFNETF9DRGNhcHMuR2V0VE9DKGNkcm9tKSA8IDAgKSB7Ci0JCQlzdGF0dXMgPSBDRF9FUlJPUjsKLQkJfQotCQkvKiBJZiB0aGUgZHJpdmUgaXMgcGxheWluZywgZ2V0IGN1cnJlbnQgcGxheSBwb3NpdGlvbiAqLwotCQlpZiAoIChzdGF0dXMgPT0gQ0RfUExBWUlORykgfHwgKHN0YXR1cyA9PSBDRF9QQVVTRUQpICkgewotCQkJZm9yICggaT0xOyBjZHJvbS0+dHJhY2tbaV0ub2Zmc2V0IDw9IHBvc2l0aW9uOyArK2kgKSB7Ci0JCQkJLyogS2VlcCBsb29raW5nICovOwotCQkJfQotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiQ3VycmVudCBwb3NpdGlvbjogJWQsIHRyYWNrID0gJWQgKG9mZnNldCBpcyAlZClcbiIsCi0JCQkJcG9zaXRpb24sIGktMSwgY2Ryb20tPnRyYWNrW2ktMV0ub2Zmc2V0KTsKLSNlbmRpZgotCQkJY2Ryb20tPmN1cl90cmFjayA9IGktMTsKLQkJCXBvc2l0aW9uIC09IGNkcm9tLT50cmFja1tjZHJvbS0+Y3VyX3RyYWNrXS5vZmZzZXQ7Ci0JCQljZHJvbS0+Y3VyX2ZyYW1lID0gcG9zaXRpb247Ci0JCX0KLQl9Ci0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLWludCBTRExfQ0RQbGF5VHJhY2tzKFNETF9DRCAqY2Ryb20sCi0JCQlpbnQgc3RyYWNrLCBpbnQgc2ZyYW1lLCBpbnQgbnRyYWNrcywgaW50IG5mcmFtZXMpCi17Ci0JaW50IGV0cmFjaywgZWZyYW1lOwotCWludCBzdGFydCwgbGVuZ3RoOwotCi0JLyogQ2hlY2sgaWYgdGhlIENELVJPTSBzdWJzeXN0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLQlpZiAoICEgQ2hlY2tJbml0KDEsICZjZHJvbSkgKSB7Ci0JCXJldHVybihDRF9FUlJPUik7Ci0JfQotCi0JLyogRGV0ZXJtaW5lIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHRyYWNrcyAqLwotCWlmICggKHN0cmFjayA8IDApIHx8IChzdHJhY2sgPj0gY2Ryb20tPm51bXRyYWNrcykgKSB7Ci0JCVNETF9TZXRFcnJvcigiSW52YWxpZCBzdGFydGluZyB0cmFjayIpOwotCQlyZXR1cm4oQ0RfRVJST1IpOwotCX0KLQlpZiAoICEgbnRyYWNrcyAmJiAhIG5mcmFtZXMgKSB7Ci0JCWV0cmFjayA9IGNkcm9tLT5udW10cmFja3M7Ci0JCWVmcmFtZSA9IDA7Ci0JfSBlbHNlIHsKLQkJZXRyYWNrID0gc3RyYWNrK250cmFja3M7Ci0JCWlmICggZXRyYWNrID09IHN0cmFjayApIHsKLQkJCWVmcmFtZSA9IHNmcmFtZSArIG5mcmFtZXM7Ci0JCX0gZWxzZSB7Ci0JCQllZnJhbWUgPSBuZnJhbWVzOwotCQl9Ci0JfQotCWlmICggZXRyYWNrID4gY2Ryb20tPm51bXRyYWNrcyApIHsKLQkJU0RMX1NldEVycm9yKCJJbnZhbGlkIHBsYXkgbGVuZ3RoIik7Ci0JCXJldHVybihDRF9FUlJPUik7Ci0JfQotCi0JLyogU2tpcCBkYXRhIHRyYWNrcyBhbmQgdmVyaWZ5IGZyYW1lIG9mZnNldHMgKi8KLQl3aGlsZSAoIChzdHJhY2sgPD0gZXRyYWNrKSAmJgotCQkJKGNkcm9tLT50cmFja1tzdHJhY2tdLnR5cGUgPT0gU0RMX0RBVEFfVFJBQ0spICkgewotCQkrK3N0cmFjazsKLQl9Ci0JaWYgKCBzZnJhbWUgPj0gKGludCljZHJvbS0+dHJhY2tbc3RyYWNrXS5sZW5ndGggKSB7Ci0JCVNETF9TZXRFcnJvcigiSW52YWxpZCBzdGFydGluZyBmcmFtZSBmb3IgdHJhY2sgJWQiLCBzdHJhY2spOwotCQlyZXR1cm4oQ0RfRVJST1IpOwotCX0KLQl3aGlsZSAoIChldHJhY2sgPiBzdHJhY2spICYmCi0JCQkoY2Ryb20tPnRyYWNrW2V0cmFjay0xXS50eXBlID09IFNETF9EQVRBX1RSQUNLKSApIHsKLQkJLS1ldHJhY2s7Ci0JfQotCWlmICggZWZyYW1lID4gKGludCljZHJvbS0+dHJhY2tbZXRyYWNrXS5sZW5ndGggKSB7Ci0JCVNETF9TZXRFcnJvcigiSW52YWxpZCBlbmRpbmcgZnJhbWUgZm9yIHRyYWNrICVkIiwgZXRyYWNrKTsKLQkJcmV0dXJuKENEX0VSUk9SKTsKLQl9Ci0KLQkvKiBEZXRlcm1pbmUgc3RhcnQgZnJhbWUgYW5kIHBsYXkgbGVuZ3RoICovCi0Jc3RhcnQgPSAoY2Ryb20tPnRyYWNrW3N0cmFja10ub2Zmc2V0K3NmcmFtZSk7Ci0JbGVuZ3RoID0gKGNkcm9tLT50cmFja1tldHJhY2tdLm9mZnNldCtlZnJhbWUpLXN0YXJ0OwotI2lmZGVmIENMSVBfRlJBTUVTCi0JLyogSSd2ZSBuZXZlciBzZWVuIHRoaXMgbmVjZXNzYXJ5LCBidXQgeG1jZCBkb2VzIGl0Li4gKi8KLQlsZW5ndGggLT0gQ0xJUF9GUkFNRVM7CS8qIENMSVBfRlJBTUVTID09IDEwICovCi0jZW5kaWYKLQlpZiAoIGxlbmd0aCA8IDAgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBQbGF5ISAqLwotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiUGxheWluZyAlZCBmcmFtZXMgYXQgb2Zmc2V0ICVkXG4iLCBsZW5ndGgsIHN0YXJ0KTsKLSNlbmRpZgotCXJldHVybihTRExfQ0RjYXBzLlBsYXkoY2Ryb20sIHN0YXJ0LCBsZW5ndGgpKTsKLX0KLQotaW50IFNETF9DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHNmcmFtZSwgaW50IGxlbmd0aCkKLXsKLQkvKiBDaGVjayBpZiB0aGUgQ0QtUk9NIHN1YnN5c3RlbSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwotCWlmICggISBDaGVja0luaXQoMSwgJmNkcm9tKSApIHsKLQkJcmV0dXJuKENEX0VSUk9SKTsKLQl9Ci0KLQlyZXR1cm4oU0RMX0NEY2Fwcy5QbGF5KGNkcm9tLCBzZnJhbWUsIGxlbmd0aCkpOwotfQotCi1pbnQgU0RMX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKLXsKLQlDRHN0YXR1cyBzdGF0dXM7Ci0JaW50IHJldHZhbDsKLQotCS8qIENoZWNrIGlmIHRoZSBDRC1ST00gc3Vic3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkICovCi0JaWYgKCAhIENoZWNrSW5pdCgxLCAmY2Ryb20pICkgewotCQlyZXR1cm4oQ0RfRVJST1IpOwotCX0KLQotCXN0YXR1cyA9IFNETF9DRGNhcHMuU3RhdHVzKGNkcm9tLCBOVUxMKTsKLQlzd2l0Y2ggKHN0YXR1cykgewotCQljYXNlIENEX1BMQVlJTkc6Ci0JCQlyZXR2YWwgPSBTRExfQ0RjYXBzLlBhdXNlKGNkcm9tKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dmFsID0gMDsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4ocmV0dmFsKTsKLX0KLQotaW50IFNETF9DRFJlc3VtZShTRExfQ0QgKmNkcm9tKQotewotCUNEc3RhdHVzIHN0YXR1czsKLQlpbnQgcmV0dmFsOwotCi0JLyogQ2hlY2sgaWYgdGhlIENELVJPTSBzdWJzeXN0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLQlpZiAoICEgQ2hlY2tJbml0KDEsICZjZHJvbSkgKSB7Ci0JCXJldHVybihDRF9FUlJPUik7Ci0JfQotCi0Jc3RhdHVzID0gU0RMX0NEY2Fwcy5TdGF0dXMoY2Ryb20sIE5VTEwpOwotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCWNhc2UgQ0RfUEFVU0VEOgotCQkJcmV0dmFsID0gU0RMX0NEY2Fwcy5SZXN1bWUoY2Ryb20pOwotCQlkZWZhdWx0OgotCQkJcmV0dmFsID0gMDsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4ocmV0dmFsKTsKLX0KLQotaW50IFNETF9DRFN0b3AoU0RMX0NEICpjZHJvbSkKLXsKLQlDRHN0YXR1cyBzdGF0dXM7Ci0JaW50IHJldHZhbDsKLQotCS8qIENoZWNrIGlmIHRoZSBDRC1ST00gc3Vic3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkICovCi0JaWYgKCAhIENoZWNrSW5pdCgxLCAmY2Ryb20pICkgewotCQlyZXR1cm4oQ0RfRVJST1IpOwotCX0KLQotCXN0YXR1cyA9IFNETF9DRGNhcHMuU3RhdHVzKGNkcm9tLCBOVUxMKTsKLQlzd2l0Y2ggKHN0YXR1cykgewotCQljYXNlIENEX1BMQVlJTkc6Ci0JCWNhc2UgQ0RfUEFVU0VEOgotCQkJcmV0dmFsID0gU0RMX0NEY2Fwcy5TdG9wKGNkcm9tKTsKLQkJZGVmYXVsdDoKLQkJCXJldHZhbCA9IDA7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuKHJldHZhbCk7Ci19Ci0KLWludCBTRExfQ0RFamVjdChTRExfQ0QgKmNkcm9tKQotewotCS8qIENoZWNrIGlmIHRoZSBDRC1ST00gc3Vic3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkICovCi0JaWYgKCAhIENoZWNrSW5pdCgxLCAmY2Ryb20pICkgewotCQlyZXR1cm4oQ0RfRVJST1IpOwotCX0KLQlyZXR1cm4oU0RMX0NEY2Fwcy5FamVjdChjZHJvbSkpOwotfQotCi12b2lkIFNETF9DRENsb3NlKFNETF9DRCAqY2Ryb20pCi17Ci0JLyogQ2hlY2sgaWYgdGhlIENELVJPTSBzdWJzeXN0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLQlpZiAoICEgQ2hlY2tJbml0KDEsICZjZHJvbSkgKSB7Ci0JCXJldHVybjsKLQl9Ci0JU0RMX0NEY2Fwcy5DbG9zZShjZHJvbSk7Ci0JU0RMX2ZyZWUoY2Ryb20pOwotCWRlZmF1bHRfY2Ryb20gPSBOVUxMOwotfQotCi12b2lkIFNETF9DRFJPTVF1aXQodm9pZCkKLXsKLQlTRExfU1lTX0NEUXVpdCgpOwotCVNETF9jZGluaXR0ZWQgPSAwOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9TRExfc3lzY2Ryb20uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vU0RMX3N5c2Nkcm9tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWUwN2IuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9TRExfc3lzY2Ryb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgU0RMX2ZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBpcyB0aGUgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmb3IgdGhlIFNETCBDRC1ST00gQVBJICovCi0KLS8qIFN0cnVjdHVyZSBvZiBDRCBhdWRpbyBjb250cm9sIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHN0cnVjdCBDRGNhcHMgewotCS8qIEdldCB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGRyaXZlICovCi0JY29uc3QgY2hhciAqKCpOYW1lKShpbnQgZHJpdmUpOwotCi0JLyogT3BlbiB0aGUgc3BlY2lmaWVkIGRyaXZlLCByZXR1cm5pbmcgYSBkcml2ZSBpZCwgb3IgLTEgb24gZXJyb3IgKi8KLQlpbnQgKCpPcGVuKShpbnQgZHJpdmUpOwotCi0JLyogR2V0IHRhYmxlLW9mLWNvbnRlbnRzIChudW1iZXIgb2YgdHJhY2tzICsgdHJhY2sgaW5mbykgZm9yIGRpc2suCi0JICAgVGhlIFRPQyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBjZHJvbSBzdHJ1Y3R1cmUuCi0JICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZXJyb3IuCi0JICovCi0JaW50ICgqR2V0VE9DKShTRExfQ0QgKmNkcm9tKTsKLQotCS8qIFJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgYW5kIHBsYXkgcG9zaXRpb24sIGluIGZyYW1lcywgb2YgdGhlCi0JICAgZHJpdmUuICAncG9zaXRpb24nIG1heSBiZSBOVUxMLCBhbmQgaWYgc28sIHNob3VsZCBiZSBpZ25vcmVkLgotCSAqLwotCUNEc3RhdHVzICgqU3RhdHVzKShTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKTsKLQotCS8qIFBsYXkgZnJvbSBmcmFtZSAnc3RhcnQnIHRvICdzdGFydCtsZW4nICovCi0JaW50ICgqUGxheSkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuKTsgCi0KLQkvKiBQYXVzZSBwbGF5ICovCi0JaW50ICgqUGF1c2UpKFNETF9DRCAqY2Ryb20pOwotCi0JLyogUmVzdW1lIHBsYXkgKi8KLQlpbnQgKCpSZXN1bWUpKFNETF9DRCAqY2Ryb20pOwotCi0JLyogU3RvcCBwbGF5ICovCi0JaW50ICgqU3RvcCkoU0RMX0NEICpjZHJvbSk7Ci0KLQkvKiBFamVjdCB0aGUgY3VycmVudCBkaXNrICovCi0JaW50ICgqRWplY3QpKFNETF9DRCAqY2Ryb20pOwotCi0JLyogQ2xvc2UgdGhlIHNwZWNpZmllZCBkcml2ZSAqLwotCXZvaWQgKCpDbG9zZSkoU0RMX0NEICpjZHJvbSk7Ci19IFNETF9DRGNhcHM7Ci0KLS8qIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIENELVJPTSBkcml2ZXMgb24gdGhlIHN5c3RlbSAqLwotZXh0ZXJuIGludCBTRExfbnVtY2RzOwotCi0vKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIENELVJPTSBkcml2ZXMgYW5kIGZpbGwgU0RMX0NEY2Fwcy4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHNldCBTRExfbnVtY2RzIHRvIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIENECi0gKiBkcml2ZXMuICBEcml2ZSAwIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgQ0QtUk9NLgotICogSXQgc2hvdWxkIHJldHVybiAwLCBvciAtMSBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgotKi8KLWV4dGVybiBpbnQgIFNETF9TWVNfQ0RJbml0KHZvaWQpOwotCi0vKiBGdW5jdGlvbiB0byBwZXJmb3JtIGFueSBzeXN0ZW0tc3BlY2lmaWMgQ0QtUk9NIHJlbGF0ZWQgY2xlYW51cCAqLwotZXh0ZXJuIHZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vYWl4L1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9haXgvU0RMX3N5c2Nkcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjIzYTkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9haXgvU0RMX3N5c2Nkcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIENhcnN0ZW4gR3Jpd29kegotICAgIGdyaWZmQGtvbS50dS1kYXJtc3RhZHQuZGUKLQotICAgIGJhc2VkIG9uIGxpbnV4L1NETF9zeXNjZHJvbS5jIGJ5IFNhbSBMYW50aW5nYQotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfQ0RST01fQUlYCi0KLS8qIEZ1bmN0aW9ucyBmb3Igc3lzdGVtLWxldmVsIENELVJPTSBhdWRpbyBjb250cm9sICovCi0KLS8qI2RlZmluZSBERUJVR19DRFJPTSAxKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL2RldmluZm8uaD4KLSNpbmNsdWRlIDxzeXMvbW50Y3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgotI2luY2x1ZGUgPHN5cy92bW91bnQuaD4KLSNpbmNsdWRlIDxmc3RhYi5oPgotI2luY2x1ZGUgPHN5cy9zY2Rpc2suaD4KLQotI2luY2x1ZGUgIlNETF9jZHJvbS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQ0QtUk9NIGRyaXZlcyB3ZSdsbCBkZXRlY3QgKi8KLSNkZWZpbmUgTUFYX0RSSVZFUwkxNgkKLQotLyogQSBsaXN0IG9mIGF2YWlsYWJsZSBDRC1ST00gZHJpdmVzICovCi1zdGF0aWMgY2hhciAqU0RMX2NkbGlzdFtNQVhfRFJJVkVTXTsKLXN0YXRpYyBkZXZfdCBTRExfY2Rtb2RlW01BWF9EUklWRVNdOwotCi0vKiBUaGUgc3lzdGVtLWRlcGVuZGVudCBDRCBjb250cm9sIGZ1bmN0aW9ucyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSk7Ci1zdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKTsKLXN0YXRpYyBpbnQgICAgICAgICBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIENEc3RhdHVzICAgIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7Ci1zdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKLXN0YXRpYyBpbnQgICAgICAgICBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgICAgICAgICBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgICAgICAgICBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCAgICAgICAgIFNETF9TWVNfQ0Rpb2N0bChpbnQgaWQsIGludCBjb21tYW5kLCB2b2lkICphcmcpOwotCi0vKiBDaGVjayBhIGRyaXZlIHRvIHNlZSBpZiBpdCBpcyBhIENELVJPTSAqLwotc3RhdGljIGludCBDaGVja0RyaXZlKGNoYXIgKmRyaXZlLCBzdHJ1Y3Qgc3RhdCAqc3RidWYpCi17Ci0gICAgaW50IGlzX2NkOwotICAgIGludCBjZGZkOwotICAgIGludCByZXQ7Ci0gICAgc3RydWN0IGRldmluZm8gaW5mbzsKLQotICAgIC8qIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHJldHVybiAtMSAqLwotICAgIGlmICggc3RhdChkcml2ZSwgc3RidWYpIDwgMCApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIElmIGl0IGRvZXMgZXhpc3QsIHZlcmlmeSB0aGF0IGl0J3MgYW4gYXZhaWxhYmxlIENELVJPTSAqLwotICAgIGlzX2NkID0gMDsKLSAgICBpZiAoIFNfSVNDSFIoc3RidWYtPnN0X21vZGUpIHx8IFNfSVNCTEsoc3RidWYtPnN0X21vZGUpICkgewotICAgICAgICBjZGZkID0gb3Blbihkcml2ZSwgKE9fUkRPTkxZfE9fRVhDTHxPX05PTkJMT0NLKSwgMCk7Ci0gICAgICAgIGlmICggY2RmZCA+PSAwICkgewotICAgICAgICAgICAgcmV0ID0gU0RMX1NZU19DRGlvY3RsKCBjZGZkLCBJT0NJTkZPLCAmaW5mbyApOwotCSAgICBpZiAoIHJldCA8IDAgKSB7Ci0JCS8qIFNvbWUga2luZCBvZiBlcnJvciAqLwotCQlpc19jZCA9IDA7Ci0JICAgIH0gZWxzZSB7Ci0JCWlmICggaW5mby5kZXZ0eXBlID09IEREX0NEUk9NICkgewotCQkgICAgaXNfY2QgPSAxOwotCQl9IGVsc2UgewotCQkgICAgaXNfY2QgPSAwOwotCQl9Ci0JICAgIH0KLSAgICAgICAgICAgIGNsb3NlKGNkZmQpOwotCX0KLSNpZmRlZiBERUJVR19DRFJPTQotCWVsc2UKLQl7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGRyaXZlICVzICglcylcbiIsIGRyaXZlLCBzdHJlcnJvcihlcnJubykpOwotCX0KLSNlbmRpZgotICAgIH0KLSAgICByZXR1cm4gaXNfY2Q7Ci19Ci0KLS8qIEFkZCBhIENELVJPTSBkcml2ZSB0byBvdXIgbGlzdCBvZiB2YWxpZCBkcml2ZXMgKi8KLXN0YXRpYyB2b2lkIEFkZERyaXZlKGNoYXIgKmRyaXZlLCBzdHJ1Y3Qgc3RhdCAqc3RidWYpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIFNETF9udW1jZHMgPCBNQVhfRFJJVkVTICkgewotCQkvKiBDaGVjayB0byBtYWtlIHN1cmUgaXQncyBub3QgYWxyZWFkeSBpbiBvdXIgbGlzdC4KLQkgCSAgIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIHNlZSBhIGRyaXZlIHZpYSBzeW1ib2xpYyBsaW5rLgotCQkgKi8KLQkJZm9yICggaT0wOyBpPFNETF9udW1jZHM7ICsraSApIHsKLQkJCWlmICggc3RidWYtPnN0X3JkZXYgPT0gU0RMX2NkbW9kZVtpXSApIHsKLSNpZmRlZiBERUJVR19DRFJPTQotICBmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSBkcml2ZSBkZXRlY3RlZDogJXMgPT0gJXNcbiIsIGRyaXZlLCBTRExfY2RsaXN0W2ldKTsKLSNlbmRpZgotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8qIEFkZCB0aGlzIGRyaXZlIHRvIG91ciBsaXN0ICovCi0JCWkgPSBTRExfbnVtY2RzOwotCQlTRExfY2RsaXN0W2ldID0gU0RMX3N0cmR1cChkcml2ZSk7Ci0JCWlmICggU0RMX2NkbGlzdFtpXSA9PSBOVUxMICkgewotCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU0RMX2NkbW9kZVtpXSA9IHN0YnVmLT5zdF9yZGV2OwotCQkrK1NETF9udW1jZHM7Ci0jaWZkZWYgREVCVUdfQ0RST00KLSAgZnByaW50ZihzdGRlcnIsICJBZGRlZCBDRC1ST00gZHJpdmU6ICVzXG4iLCBkcml2ZSk7Ci0jZW5kaWYKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIENoZWNrTW91bnRzKCkKLXsKLSAgICBjaGFyKiAgICAgICAgICBidWZmZXI7Ci0gICAgaW50ICAgICAgICAgICAgYnVmc3o7Ci0gICAgc3RydWN0IHZtb3VudCogcHRyOwotICAgIGludCAgICAgICAgICAgIHJldDsKLQotICAgIGJ1ZmZlciA9IChjaGFyKilTRExfbWFsbG9jKDEwKTsKLSAgICBidWZzeiAgPSAxMDsKLSAgICBpZiAoIGJ1ZmZlcj09TlVMTCApCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSAxMCBieXRlcyBpbiBhaXgvU0RMX3N5c2Nkcm9tLmM6Q2hlY2tNb3VudHNcbiIgKTsKLQlleGl0ICggLTEwICk7Ci0gICAgfQotCi0gICAgZG8KLSAgICB7Ci0JLyogbW50Y3RybCgpIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG1vdW50ZWQgZmlsZXN5c3RlbXMgKi8KLSAgICAgICAgcmV0ID0gbW50Y3RsICggTUNUTF9RVUVSWSwgYnVmc3osIGJ1ZmZlciApOwotICAgICAgICBpZiAoIHJldCA9PSAwICkKLSAgICAgICAgewotCQkJCSAgIC8qIEJ1ZmZlciB3YXMgdG9vIHNtYWxsLCByZWFsbG9jLiAgICAqLwotICAgICAgICAgICAgYnVmc3ogPSAqKGludCopYnVmZmVyOyAvKiBSZXF1aXJlZCBzaXplIGlzIGluIGZpcnN0IHdvcmQuICAgKi8KLQkJCQkgICAvKiAod2hhdGV2ZXIgYSB3b3JkIGlzIGluIEFJWCA0LjMuMykgKi8KLQkJCQkgICAvKiBpbnQgc2VlbXMgdG8gYmUgT0sgaW4gMzJiaXQgbW9kZS4gKi8KLSAgICAgICAgICAgIFNETF9mcmVlKGJ1ZmZlcik7Ci0gICAgICAgICAgICBidWZmZXIgPSAoY2hhciopU0RMX21hbGxvYyhidWZzeik7Ci0gICAgICAgICAgICBpZiAoIGJ1ZmZlcj09TlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0JCQkiQ291bGQgbm90IGFsbG9jYXRlICVkIGJ5dGVzIGluIGFpeC9TRExfc3lzY2Ryb20uYzpDaGVja01vdW50c1xuIiwKLQkJCWJ1ZnN6ICk7Ci0JICAgICAgICBleGl0ICggLTEwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQllbHNlIGlmICggcmV0IDwgMCApCi0JewotI2lmZGVmIERFQlVHX0NEUk9NCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHJlYWRpbmcgdm1vdW50IHN0cnVjdHVyZXNcbiIpOwotI2VuZGlmCi0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotICAgIHdoaWxlICggcmV0ID09IDAgKTsKLQotI2lmZGVmIERFQlVHX0NEUk9NCi0gICAgZnByaW50ZiAoIHN0ZGVyciwgIlJlYWQgJWQgdm1vdW50IHN0cnVjdHVyZXNcbiIscmV0ICk7Ci0jZW5kaWYKLSAgICBwdHIgPSAoc3RydWN0IHZtb3VudCopYnVmZmVyOwotICAgIGRvCi0gICAgewotICAgICAgICAgICAgc3dpdGNoKHB0ci0+dm10X2dmc3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE1OVF9DRFJPTSA6Ci0gICAgICAgICAgICAgICAgewotCQkgICAgc3RydWN0IHN0YXQgc3RidWY7Ci0JCSAgICBjaGFyKiAgICAgICB0ZXh0OwotCi0JCSAgICB0ZXh0ID0gKGNoYXIqKXB0ciArIHB0ci0+dm10X2RhdGFbVk1UX09CSkVDVF0udm10X29mZjsKLSNpZmRlZiBERUJVR19DRFJPTQotICBmcHJpbnRmKHN0ZGVyciwgIkNoZWNraW5nIG1vdW50IHBhdGg6ICVzIG1vdW50ZWQgb24gJXNcbiIsCi0JdGV4dCwgKGNoYXIqKXB0ciArIHB0ci0+dm10X2RhdGFbVk1UX1NUVUJdLnZtdF9vZmYgKTsKLSNlbmRpZgotCQkgICAgaWYgKCBDaGVja0RyaXZlKCB0ZXh0LCAmc3RidWYpID4gMCkKLQkJICAgIHsKLQkJICAgICAgICBBZGREcml2ZSggdGV4dCwgJnN0YnVmKTsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB0ciA9IChzdHJ1Y3Qgdm1vdW50KikoKGNoYXIqKXB0ciArIHB0ci0+dm10X2xlbmd0aCk7Ci0gICAgICAgICAgICByZXQtLTsKLSAgICB9Ci0gICAgd2hpbGUgKCByZXQgPiAwICk7Ci0KLSAgICBmcmVlICggYnVmZmVyICk7Ci19Ci0KLXN0YXRpYyBpbnQgQ2hlY2tOb25tb3VudHMoKQotewotI2lmZGVmIF9USFJFQURfU0FGRQotICAgIEFGSUxFX3QgICAgICBmc0ZpbGUgPSBOVUxMOwotICAgIGludCAgICAgICAgICBwYXNzTm8gPSAwOwotICAgIGludCAgICAgICAgICByZXQ7Ci0gICAgc3RydWN0IGZzdGFiIGVudHJ5OwotICAgIHN0cnVjdCBzdGF0ICBzdGJ1ZjsKLQotICAgIHJldCA9IHNldGZzZW50X3IoICZmc0ZpbGUsICZwYXNzTm8gKTsKLSAgICBpZiAoIHJldCAhPSAwICkgcmV0dXJuIC0xOwotICAgIGRvCi0gICAgewotICAgICAgICByZXQgPSBnZXRmc2VudF9yICggJmVudHJ5LCAmZnNGaWxlLCAmcGFzc05vICk7Ci0gICAgICAgIGlmICggcmV0ID09IDAgKSB7Ci0gICAgICAgICAgICBjaGFyKiBsID0gU0RMX3N0cnJjaHIoZW50cnkuZnNfc3BlYywnLycpOwotICAgICAgICAgICAgaWYgKCBsICE9IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCAhU0RMX3N0cm5jbXAoImNkIiwrK2wsMikgKSB7Ci0jaWZkZWYgREVCVUdfQ0RST00KLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0JCQkgICAgIkZvdW5kIHVubW91bnRlZCBDRCBST00gZHJpdmUgd2l0aCBkZXZpY2UgbmFtZSAlc1xuIiwKLQkJCSAgICBlbnRyeS5mc19zcGVjKTsKLSNlbmRpZgotCQkgICAgaWYgKCBDaGVja0RyaXZlKCBlbnRyeS5mc19zcGVjLCAmc3RidWYpID4gMCkKLQkJICAgIHsKLQkJICAgICAgICBBZGREcml2ZSggZW50cnkuZnNfc3BlYywgJnN0YnVmKTsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUgKCByZXQgPT0gMCApOwotICAgIHJldCA9IGVuZGZzZW50X3IgKCAmZnNGaWxlICk7Ci0gICAgaWYgKCByZXQgIT0gMCApIHJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgc3RydWN0IGZzdGFiKiBlbnRyeTsKLSAgICBzdHJ1Y3Qgc3RhdCAgc3RidWY7Ci0KLSAgICBzZXRmc2VudCgpOwotICAgIGRvCi0gICAgewotICAgICAgICBlbnRyeSA9IGdldGZzZW50KCk7Ci0gICAgICAgIGlmICggZW50cnkgIT0gTlVMTCApIHsKLSAgICAgICAgICAgIGNoYXIqIGwgPSBTRExfc3RycmNocihlbnRyeS0+ZnNfc3BlYywnLycpOwotICAgICAgICAgICAgaWYgKCBsICE9IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCAhU0RMX3N0cm5jbXAoImNkIiwrK2wsMikgKSB7Ci0jaWZkZWYgREVCVUdfQ0RST00KLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkZvdW5kIHVubW91bnRlZCBDRCBST00gZHJpdmUgd2l0aCBkZXZpY2UgbmFtZSAlcyIsIGVudHJ5LT5mc19zcGVjKTsKLSNlbmRpZgotCQkgICAgaWYgKCBDaGVja0RyaXZlKCBlbnRyeS0+ZnNfc3BlYywgJnN0YnVmKSA+IDApCi0JCSAgICB7Ci0JCSAgICAgICAgQWRkRHJpdmUoIGVudHJ5LT5mc19zcGVjLCAmc3RidWYpOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB3aGlsZSAoIGVudHJ5ICE9IE5VTEwgKTsKLSAgICBlbmRmc2VudCgpOwotI2VuZGlmCi19Ci0KLWludCAgU0RMX1NZU19DREluaXQodm9pZCkKLXsKLQljaGFyICpTRExjZHJvbTsKLQlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKLQotCS8qIEZpbGwgaW4gb3VyIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KLQlTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKLQlTRExfQ0RjYXBzLk9wZW4gPSBTRExfU1lTX0NET3BlbjsKLQlTRExfQ0RjYXBzLkdldFRPQyA9IFNETF9TWVNfQ0RHZXRUT0M7Ci0JU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOwotCVNETF9DRGNhcHMuUGxheSA9IFNETF9TWVNfQ0RQbGF5OwotCVNETF9DRGNhcHMuUGF1c2UgPSBTRExfU1lTX0NEUGF1c2U7Ci0JU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOwotCVNETF9DRGNhcHMuU3RvcCA9IFNETF9TWVNfQ0RTdG9wOwotCVNETF9DRGNhcHMuRWplY3QgPSBTRExfU1lTX0NERWplY3Q7Ci0JU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKLQotCS8qIExvb2sgaW4gdGhlIGVudmlyb25tZW50IGZvciBvdXIgQ0QtUk9NIGRyaXZlIGxpc3QgKi8KLQlTRExjZHJvbSA9IFNETF9nZXRlbnYoIlNETF9DRFJPTSIpOwkvKiAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZGV2aWNlcyAqLwotCWlmICggU0RMY2Ryb20gIT0gTlVMTCApIHsKLQkJY2hhciAqY2RwYXRoLCAqZGVsaW07Ci0JCXNpemVfdCBsZW4gPSBTRExfc3RybGVuKFNETGNkcm9tKSsxOwotCQljZHBhdGggPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbGVuKTsKLQkJaWYgKCBjZHBhdGggIT0gTlVMTCApIHsKLQkJCVNETF9zdHJsY3B5KGNkcGF0aCwgU0RMY2Ryb20sIGxlbik7Ci0JCQlTRExjZHJvbSA9IGNkcGF0aDsKLQkJCWRvIHsKLQkJCQlkZWxpbSA9IFNETF9zdHJjaHIoU0RMY2Ryb20sICc6Jyk7Ci0JCQkJaWYgKCBkZWxpbSApIHsKLQkJCQkJKmRlbGltKysgPSAnXDAnOwotCQkJCX0KLSNpZmRlZiBERUJVR19DRFJPTQotICBmcHJpbnRmKHN0ZGVyciwgIkNoZWNraW5nIENELVJPTSBkcml2ZSBmcm9tIFNETF9DRFJPTTogJXNcbiIsIFNETGNkcm9tKTsKLSNlbmRpZgotCQkJCWlmICggQ2hlY2tEcml2ZShTRExjZHJvbSwgJnN0YnVmKSA+IDAgKSB7Ci0JCQkJCUFkZERyaXZlKFNETGNkcm9tLCAmc3RidWYpOwotCQkJCX0KLQkJCQlpZiAoIGRlbGltICkgewotCQkJCQlTRExjZHJvbSA9IGRlbGltOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVNETGNkcm9tID0gTlVMTDsKLQkJCQl9Ci0JCQl9IHdoaWxlICggU0RMY2Ryb20gKTsKLQkJCVNETF9zdGFja19mcmVlKGNkcGF0aCk7Ci0JCX0KLQotCQkvKiBJZiB3ZSBmb3VuZCBvdXIgZHJpdmVzLCB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyAqLwotCQlpZiAoIFNETF9udW1jZHMgPiAwICkgewotCQkJcmV0dXJuKDApOwotCQl9Ci0JfQotCi0JQ2hlY2tNb3VudHMoKTsKLQlDaGVja05vbm1vdW50cygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEdlbmVyYWwgaW9jdGwoKSBDRC1ST00gY29tbWFuZCBmdW5jdGlvbiAqLwotc3RhdGljIGludCBTRExfU1lTX0NEaW9jdGwoaW50IGlkLCBpbnQgY29tbWFuZCwgdm9pZCAqYXJnKQotewotICAgIGludCByZXR2YWw7Ci0KLSAgICByZXR2YWwgPSBpb2N0bChpZCwgY29tbWFuZCwgYXJnKTsKLSAgICBpZiAoIHJldHZhbCA8IDAgKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiaW9jdGwoKSBlcnJvcjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKQotewotCXJldHVybihTRExfY2RsaXN0W2RyaXZlXSk7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKQotewotICAgIGludCAgIGZkOwotICAgIGNoYXIqIGxhc3RzbDsKLSAgICBjaGFyKiBjZHJvbW5hbWU7Ci0gICAgc2l6ZV90IGxlbjsKLQotICAgIC8qCi0gICAgICogV2UgZm91bmQgL2Rldi9jZD8gZHJpdmVzIGFuZCB0aGF0IGlzIGluIG91ciBsaXN0LiBCdXQgd2UgY2FuCi0gICAgICogb3BlbiBvbmx5IHRoZSAvZGV2L3JjZD8gdmVyc2lvbnMgb2YgdGhvc2UgZGV2aWNlcyBmb3IgQXVkaW8gQ0QuCi0gICAgICovCi0gICAgbGVuID0gU0RMX3N0cmxlbihTRExfY2RsaXN0W2RyaXZlXSkrMjsKLSAgICBjZHJvbW5hbWUgPSAoY2hhciopU0RMX21hbGxvYyhsZW4pOwotICAgIFNETF9zdHJsY3B5KGNkcm9tbmFtZSxTRExfY2RsaXN0W2RyaXZlXSxsZW4pOwotICAgIGxhc3RzbCA9IFNETF9zdHJyY2hyKGNkcm9tbmFtZSwnLycpOwotICAgIGlmIChsYXN0c2wpIHsKLQkqbGFzdHNsID0gMDsKLQlTRExfc3RybGNhdChjZHJvbW5hbWUsIi9yIixsZW4pOwotCWxhc3RzbCA9IFNETF9zdHJyY2hyKFNETF9jZGxpc3RbZHJpdmVdLCcvJyk7Ci0JaWYgKGxhc3RzbCkgewotCSAgICBsYXN0c2wrKzsKLQkgICAgU0RMX3N0cmxjYXQoY2Ryb21uYW1lLGxhc3RzbCxsZW4pOwotCX0KLSAgICB9Ci0KLSNpZmRlZiBERUJVR19DRFJPTQotICAgIGZwcmludGYoc3RkZXJyLCAiU2hvdWxkIG9wZW4gZHJpdmUgJXMsIG9wZW5pbmcgJXNcbiIsIFNETF9jZGxpc3RbZHJpdmVdLCBjZHJvbW5hbWUpOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFVzZSBleGNsdXNpdmUgYWNjZXNzLiBEb24ndCB1c2UgU0NfRElBR05PU1RJQ1MgYXMgeG1jZCBkb2VzIGJlY2F1c2UgdGhleQotICAgICAqIHJlcXVpcmUgcm9vdCBwcml2aWxlZGdlcywgYW5kIHdlIGRvbid0IHdhbnQgdGhhdC4gU0NfU0lOR0xFIHByb3ZpZGVzCi0gICAgICogZXhjbHVzaXZlIGFjY2VzcyB3aXRoIGxlc3MgdHJvdWJsZS4KLSAgICAgKi8KLSAgICBmZCA9IG9wZW54KGNkcm9tbmFtZSwgT19SRE9OTFksIE5VTEwsIFNDX1NJTkdMRSk7Ci0gICAgaWYgKCBmZCA8IDAgKQotICAgIHsKLSNpZmRlZiBERUJVR19DRFJPTQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBkcml2ZSAlcyAoJXMpXG4iLCBjZHJvbW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlzdHJ1Y3QgbW9kZV9mb3JtX29wIGNkTW9kZTsKLQlpbnQgICAgICAgICAgICAgICAgIHJldDsKLSNpZmRlZiBERUJVR19DRFJPTQotCWNkTW9kZS5hY3Rpb24gPSBDRF9HRVRfTU9ERTsKLQlyZXQgPSBTRExfU1lTX0NEaW9jdGwoZmQsIERLX0NEX01PREUsICZjZE1vZGUpOwotCWlmICggcmV0IDwgMCApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotCSAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IGRyaXZlIG1vZGUgZm9yICVzICglcylcbiIsCi0JCSAgICBjZHJvbW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0JfSBlbHNlIHsKLQkgICAgc3dpdGNoKGNkTW9kZS5jZF9tb2RlX2Zvcm0pIHsKLQkJY2FzZSBDRF9NT0RFMSA6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotCSAgICAgICAgICAgICAgICAiRHJpdmUgbW9kZSBmb3IgJXMgaXMgJXNcbiIsCi0JCSAgICAgICAgY2Ryb21uYW1lLCAiQ0QtUk9NIERhdGEgTW9kZSAxIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBDRF9NT0RFMl9GT1JNMSA6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotCSAgICAgICAgICAgICAgICAiRHJpdmUgbW9kZSBmb3IgJXMgaXMgJXNcbiIsCi0JCSAgICAgICAgY2Ryb21uYW1lLCAiQ0QtUk9NIFhBIERhdGEgTW9kZSAyIEZvcm0gMSIpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgQ0RfTU9ERTJfRk9STTIgOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLQkgICAgICAgICAgICAgICAgIkRyaXZlIG1vZGUgZm9yICVzIGlzICVzXG4iLAotCQkgICAgICAgIGNkcm9tbmFtZSwgIkNELVJPTSBYQSBEYXRhIE1vZGUgMiBGb3JtIDIiKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIENEX0RBIDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0JICAgICAgICAgICAgICAgICJEcml2ZSBtb2RlIGZvciAlcyBpcyAlc1xuIiwKLQkJICAgICAgICBjZHJvbW5hbWUsICJDRC1EQSIpOwotCQkgICAgYnJlYWs7Ci0JCWRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLQkgICAgICAgICAgICAgICAgIkRyaXZlIG1vZGUgZm9yICVzIGlzICVzXG4iLAotCQkgICAgICAgIGNkcm9tbmFtZSwgInVua25vd24iKTsKLQkJICAgIGJyZWFrOwotCSAgICB9Ci0JfQotI2VuZGlmCi0KLQljZE1vZGUuYWN0aW9uICAgICAgID0gQ0RfQ0hHX01PREU7Ci0JY2RNb2RlLmNkX21vZGVfZm9ybSA9IENEX0RBOwotCXJldCA9IFNETF9TWVNfQ0Rpb2N0bChmZCwgREtfQ0RfTU9ERSwgJmNkTW9kZSk7Ci0JaWYgKCByZXQgPCAwICkgewotI2lmZGVmIERFQlVHX0NEUk9NCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLQkgICAgICAgICAgICAiQ291bGQgbm90IHNldCBkcml2ZSBtb2RlIGZvciAlcyAoJXMpXG4iLAotCQkgICAgY2Ryb21uYW1lLCBzdHJlcnJvcihlcnJubykpOwotI2VuZGlmCi0gICAgICAgICAgICBTRExfU2V0RXJyb3IoImlvY3RsKCkgZXJyb3I6IENvdWxkIG5vdCBzZXQgQ0QgZHJpdmUgbW9kZSwgJXMiLAotCSAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLQl9IGVsc2UgewotI2lmZGVmIERFQlVHX0NEUk9NCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLQkgICAgICAgICAgICAiRHJpdmUgbW9kZSBmb3IgJXMgc2V0IHRvIENEX0RBXG4iLAotCQkgICAgY2Ryb21uYW1lKTsKLSNlbmRpZgotCX0KLSAgICB9Ci0gICAgU0RMX2ZyZWUoY2Ryb21uYW1lKTsKLSAgICByZXR1cm4gZmQ7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQotewotICAgIHN0cnVjdCBjZF9hdWRpb19jbWQgY21kOwotICAgIHN0cnVjdCBjZF9hdWRpb19jbWQgZW50cnk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIGludCAgICAgICAgICAgICAgICAgb2theTsKLQotICAgIGNtZC5hdWRpb19jbWRzID0gQ0RfVFJLX0lORk9fQVVESU87Ci0gICAgY21kLm1zZl9mbGFnICAgPSBGQUxTRTsKLSAgICBpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIERLQVVESU8sICZjbWQpIDwgMCApIHsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgb2theSA9IDA7Ci0gICAgY2Ryb20tPm51bXRyYWNrcyA9IGNtZC5pbmRleGluZy50cmFja19pbmRleC5sYXN0X3RyYWNrCi0JCSAgICAgLSBjbWQuaW5kZXhpbmcudHJhY2tfaW5kZXguZmlyc3RfdHJhY2srMTsKLSAgICBpZiAoIGNkcm9tLT5udW10cmFja3MgPiBTRExfTUFYX1RSQUNLUyApIHsKLSAgICAgICAgY2Ryb20tPm51bXRyYWNrcyA9IFNETF9NQVhfVFJBQ0tTOwotICAgIH0KLQotICAgIC8qIFJlYWQgYWxsIHRoZSB0cmFjayBUT0MgZW50cmllcyAqLwotICAgIGZvciAoIGk9MDsgaTw9Y2Ryb20tPm51bXRyYWNrczsgKytpICkgewotICAgICAgICBpZiAoIGkgPT0gY2Ryb20tPm51bXRyYWNrcyApIHsKLSAgICAgICAgICAgIGNkcm9tLT50cmFja1tpXS5pZCA9IDB4QUE7OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ldLmlkID0gY21kLmluZGV4aW5nLnRyYWNrX2luZGV4LmZpcnN0X3RyYWNrK2k7Ci0gICAgICAgIH0KLSAgICAgICAgZW50cnkuYXVkaW9fY21kcyAgICAgICAgID0gQ0RfR0VUX1RSS19NU0Y7Ci0JZW50cnkuaW5kZXhpbmcudHJhY2tfbXNmLnRyYWNrID0gY2Ryb20tPnRyYWNrW2ldLmlkOwotCWlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgREtBVURJTywgJmVudHJ5KSA8IDAgKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNkcm9tLT50cmFja1tpXS50eXBlID0gMDsgICAgLyogZG9uJ3Qga25vdyBob3cgdG8gZGV0ZWN0IDB4MDQgZGF0YSB0cmFjayAqLwotICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IE1TRl9UT19GUkFNRVMoCi0gICAgICAgICAgICAgICAgZW50cnkuaW5kZXhpbmcudHJhY2tfbXNmLm1pbnMsCi0gICAgICAgICAgICAgICAgZW50cnkuaW5kZXhpbmcudHJhY2tfbXNmLnNlY3MsCi0gICAgICAgICAgICAgICAgZW50cnkuaW5kZXhpbmcudHJhY2tfbXNmLmZyYW1lcyk7Ci0gICAgICAgICAgICBjZHJvbS0+dHJhY2tbaV0ubGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGlmICggaSA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ktMV0ubGVuZ3RoID0gY2Ryb20tPnRyYWNrW2ldLm9mZnNldAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgLSBjZHJvbS0+dHJhY2tbaS0xXS5vZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCBpID09IChjZHJvbS0+bnVtdHJhY2tzKzEpICkgewotICAgICAgICBva2F5ID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuKG9rYXkgPyAwIDogLTEpOwotfQotCi0vKiBHZXQgQ0QtUk9NIHN0YXR1cyAqLwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKLXsKLSAgICBDRHN0YXR1cyAgICAgICAgICAgIHN0YXR1czsKLSAgICBzdHJ1Y3QgY2RfYXVkaW9fY21kIGNtZDsKLSAgICBjbWQuYXVkaW9fY21kcyA9IENEX0lORk9fQVVESU87Ci0KLSAgICBpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIERLQVVESU8sICZjbWQpIDwgMCApIHsKLSNpZmRlZiBERUJVR19DRFJPTQotICAgIGZwcmludGYoc3RkZXJyLCAiaW9jdGwgZmFpbGVkIGluIFNETF9TWVNfQ0RTdGF0dXMgKCVzKVxuIiwgU0RMX0dldEVycm9yKCkpOwotI2VuZGlmCi0gICAgICAgIHN0YXR1cyA9IENEX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoY21kLnN0YXR1cykgewotICAgICAgICAgICAgY2FzZSBDRF9OT19BVURJTzoKLSAgICAgICAgICAgIGNhc2UgQ0RfQ09NUExFVEVEOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENEX1BMQVlfQVVESU86Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQ0RfUExBWUlORzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0RfUEFVU0VfQVVESU86Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQ0RfUEFVU0VEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDRF9OT1RfVkFMSUQ6Ci0jaWZkZWYgREVCVUdfQ0RST00KLSAgICBmcHJpbnRmKHN0ZGVyciwgImNkU3RhdHVzIGZhaWxlZCB3aXRoIENEX05PVF9WQUxJRFxuIik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBDRF9FUlJPUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0RfU1RBVFVTX0VSUk9SOgotI2lmZGVmIERFQlVHX0NEUk9NCi0gICAgZnByaW50ZihzdGRlcnIsICJjZFN0YXR1cyBmYWlsZWQgd2l0aCBDRF9TVEFUVVNfRVJST1JcbiIpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gQ0RfRVJST1I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotI2lmZGVmIERFQlVHX0NEUk9NCi0gICAgZnByaW50ZihzdGRlcnIsICJjZFN0YXR1cyBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yXG4iKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX0VSUk9SOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICggcG9zaXRpb24gKSB7Ci0gICAgICAgIGlmICggc3RhdHVzID09IENEX1BMQVlJTkcgfHwgKHN0YXR1cyA9PSBDRF9QQVVTRUQpICkgewotICAgICAgICAgICAgKnBvc2l0aW9uID0gTVNGX1RPX0ZSQU1FUyggY21kLmluZGV4aW5nLmluZm9fYXVkaW8uY3VycmVudF9taW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmluZGV4aW5nLmluZm9fYXVkaW8uY3VycmVudF9zZWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmluZGV4aW5nLmluZm9fYXVkaW8uY3VycmVudF9mcmFtZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKnBvc2l0aW9uID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vKiBTdGFydCBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLXsKLSAgICBzdHJ1Y3QgY2RfYXVkaW9fY21kIGNtZDsKLQotICAgIC8qCi0gICAgICogTXkgQ0QgUm9tIGlzIG11dGVkIGJ5IGRlZmF1bHQuIEkgdGhpbmsgSSByZWFkIHRoYXQgdGhpcyBpcyBuZXcgd2l0aAotICAgICAqIEFJWCA0LjMuIFNETCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHZvbHVtZSwgc28gSSBuZWVkIGEga2x1ZGdlLiBNYXliZQotICAgICAqIGl0cyBiZXR0ZXIgdG8gZG8gdGhpcyBlbHNld2hlcmU/Ci0gICAgICovCi0gICAgY21kLmF1ZGlvX2NtZHMgPSBDRF9QTEFZX0FVRElPIHwgQ0RfU0VUX1ZPTFVNRTsKLSAgICBjbWQubXNmX2ZsYWcgICA9IFRSVUU7Ci0gICAgRlJBTUVTX1RPX01TRihzdGFydCwKLSAgICAgICAgICAgICAgICAgICZjbWQuaW5kZXhpbmcubXNmLmZpcnN0X21pbnMsCi0gICAgICAgICAgICAgICAgICAmY21kLmluZGV4aW5nLm1zZi5maXJzdF9zZWNzLAotICAgICAgICAgICAgICAgICAgJmNtZC5pbmRleGluZy5tc2YuZmlyc3RfZnJhbWVzKTsKLSAgICBGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICZjbWQuaW5kZXhpbmcubXNmLmxhc3RfbWlucywKLSAgICAgICAgICAgICAgICAgICZjbWQuaW5kZXhpbmcubXNmLmxhc3Rfc2VjcywKLSAgICAgICAgICAgICAgICAgICZjbWQuaW5kZXhpbmcubXNmLmxhc3RfZnJhbWVzKTsKLSAgICBjbWQudm9sdW1lX3R5cGUgICAgID0gQ0RfVk9MVU1FX0FMTDsKLSAgICBjbWQuYWxsX2NoYW5uZWxfdm9sID0gMjU1OyAgIC8qIFRoaXMgaXMgYSB1Y2hhci4gV2hhdCBpcyBhIGdvb2QgdmFsdWU/IE5vIGRvY3UhICovCi0gICAgY21kLm91dF9wb3J0XzBfc2VsICA9IENEX0FVRElPX0NITkxfMDsKLSAgICBjbWQub3V0X3BvcnRfMV9zZWwgID0gQ0RfQVVESU9fQ0hOTF8xOwotICAgIGNtZC5vdXRfcG9ydF8yX3NlbCAgPSBDRF9BVURJT19DSE5MXzI7Ci0gICAgY21kLm91dF9wb3J0XzNfc2VsICA9IENEX0FVRElPX0NITkxfMzsKLQotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiVHJ5aW5nIHRvIHBsYXkgZnJvbSAlZDolZDolZCB0byAlZDolZDolZFxuIiwKLQljbWQuaW5kZXhpbmcubXNmLmZpcnN0X21pbnMsCi0JY21kLmluZGV4aW5nLm1zZi5maXJzdF9zZWNzLAotCWNtZC5pbmRleGluZy5tc2YuZmlyc3RfZnJhbWVzLAotCWNtZC5pbmRleGluZy5tc2YubGFzdF9taW5zLAotCWNtZC5pbmRleGluZy5tc2YubGFzdF9zZWNzLAotCWNtZC5pbmRleGluZy5tc2YubGFzdF9mcmFtZXMpOwotI2VuZGlmCi0JcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIERLQVVESU8sICZjbWQpKTsKLX0KLQotLyogUGF1c2UgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKLXsKLSAgICBzdHJ1Y3QgY2RfYXVkaW9fY21kIGNtZDsKLSAgICBjbWQuYXVkaW9fY21kcyA9IENEX1BBVVNFX0FVRElPOwotICAgIHJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBES0FVRElPLCAmY21kKSk7Ci19Ci0KLS8qIFJlc3VtZSBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKLXsKLSAgICBzdHJ1Y3QgY2RfYXVkaW9fY21kIGNtZDsKLSAgICBjbWQuYXVkaW9fY21kcyA9IENEX1JFU1VNRV9BVURJTzsKLSAgICByZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgREtBVURJTywgJmNtZCkpOwotfQotCi0vKiBTdG9wIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKLXsKLSAgICBzdHJ1Y3QgY2RfYXVkaW9fY21kIGNtZDsKLSAgICBjbWQuYXVkaW9fY21kcyA9IENEX1NUT1BfQVVESU87Ci0gICAgcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIERLQVVESU8sICZjbWQpKTsKLX0KLQotLyogRWplY3QgdGhlIENELVJPTSAqLwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKLXsKLSAgICByZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgREtFSkVDVCwgMCkpOwotfQotCi0vKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLwotc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCi17Ci0gICAgY2xvc2UoY2Ryb20tPmlkKTsKLX0KLQotdm9pZCBTRExfU1lTX0NEUXVpdCh2b2lkKQotewotCWludCBpOwotCi0JaWYgKCBTRExfbnVtY2RzID4gMCApIHsKLQkJZm9yICggaT0wOyBpPFNETF9udW1jZHM7ICsraSApIHsKLQkJCVNETF9mcmVlKFNETF9jZGxpc3RbaV0pOwotCQl9Ci0JCVNETF9udW1jZHMgPSAwOwotCX0KLX0KLQotI2VuZGlmIC8qIFNETF9DRFJPTV9BSVggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vYmVvcy9TRExfc3lzY2Ryb20uY2MgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL2Jlb3MvU0RMX3N5c2Nkcm9tLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjkwOTRhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vYmVvcy9TRExfc3lzY2Ryb20uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfQ0RST01fQkVPUwotCi0vKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCBvbiBCZU9TCi0gICAobm90IGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQgeWV0KQotICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c2NzaS5oPgotI2luY2x1ZGUgPERpcmVjdG9yeS5oPgotI2luY2x1ZGUgPEVudHJ5Lmg+Ci0jaW5jbHVkZSA8UGF0aC5oPgotCi0jaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKLX0KLQotLyogQ29uc3RhbnRzIHRvIGhlbHAgdXMgZ2V0IGF0IHRoZSBTQ1NJIHRhYmxlLW9mLWNvbnRlbnRzIGluZm8gKi8KLSNkZWZpbmUgQ0RfTlVNVFJBQ0tTKHRvYykJdG9jLnRvY19kYXRhWzNdCi0jZGVmaW5lIENEX1RSQUNLKHRvYywgdHJhY2spCSgmdG9jLnRvY19kYXRhWzYrKHRyYWNrKSo4XSkKLSNkZWZpbmUgQ0RfVFJBQ0tfTih0b2MsIHRyYWNrKQlDRF9UUkFDSyh0b2MsIHRyYWNrKVswXQotI2RlZmluZSBDRF9UUkFDS19NKHRvYywgdHJhY2spCUNEX1RSQUNLKHRvYywgdHJhY2spWzNdCi0jZGVmaW5lIENEX1RSQUNLX1ModG9jLCB0cmFjaykJQ0RfVFJBQ0sodG9jLCB0cmFjaylbNF0KLSNkZWZpbmUgQ0RfVFJBQ0tfRih0b2MsIHRyYWNrKQlDRF9UUkFDSyh0b2MsIHRyYWNrKVs1XQotCi0vKiBDb25zdGFudHMgdG8gaGVscCB1cyBnZXQgYXQgdGhlIFNDU0kgcG9zaXRpb24gaW5mbyAqLwotI2RlZmluZSBQT1NfVFJBQ0socG9zKQlwb3MucG9zaXRpb25bNl0KLSNkZWZpbmUgUE9TX0FCU19NKHBvcykJcG9zLnBvc2l0aW9uWzldCi0jZGVmaW5lIFBPU19BQlNfUyhwb3MpCXBvcy5wb3NpdGlvblsxMF0KLSNkZWZpbmUgUE9TX0FCU19GKHBvcykJcG9zLnBvc2l0aW9uWzExXQotI2RlZmluZSBQT1NfUkVMX00ocG9zKQlwb3MucG9zaXRpb25bMTNdCi0jZGVmaW5lIFBPU19SRUxfUyhwb3MpCXBvcy5wb3NpdGlvblsxNF0KLSNkZWZpbmUgUE9TX1JFTF9GKHBvcykJcG9zLnBvc2l0aW9uWzE1XQotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQ0QtUk9NIGRyaXZlcyB3ZSdsbCBkZXRlY3QgKi8KLSNkZWZpbmUgTUFYX0RSSVZFUwkxNgkKLQotLyogQSBsaXN0IG9mIGF2YWlsYWJsZSBDRC1ST00gZHJpdmVzICovCi1zdGF0aWMgY2hhciAqU0RMX2NkbGlzdFtNQVhfRFJJVkVTXTsKLQotLyogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQ0QgY29udHJvbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKLWludCB0cnlfZGlyKGNvbnN0IGNoYXIgKmRpcmVjdG9yeSk7Ci0KLQotLyogQ2hlY2sgYSBkcml2ZSB0byBzZWUgaWYgaXQgaXMgYSBDRC1ST00gKi8KLXN0YXRpYyBpbnQgQ2hlY2tEcml2ZShjaGFyICpkcml2ZSkKLXsKLQlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKLQlpbnQgaXNfY2QsIGNkZmQ7Ci0JZGV2aWNlX2dlb21ldHJ5IGluZm87Ci0KLQkvKiBJZiBpdCBkb2Vzbid0IGV4aXN0LCByZXR1cm4gLTEgKi8KLQlpZiAoIHN0YXQoZHJpdmUsICZzdGJ1ZikgPCAwICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIElmIGl0IGRvZXMgZXhpc3QsIHZlcmlmeSB0aGF0IGl0J3MgYW4gYXZhaWxhYmxlIENELVJPTSAqLwotCWlzX2NkID0gMDsKLQljZGZkID0gb3Blbihkcml2ZSwgMCk7Ci0JaWYgKCBjZGZkID49IDAgKSB7Ci0JCWlmICggaW9jdGwoY2RmZCwgQl9HRVRfR0VPTUVUUlksICZpbmZvKSA9PSBCX05PX0VSUk9SICkgewotCQkJaWYgKCBpbmZvLmRldmljZV90eXBlID09IEJfQ0QgKSB7Ci0JCQkJaXNfY2QgPSAxOwotCQkJfQotCQl9Ci0JCWNsb3NlKGNkZmQpOwotCX0gZWxzZSB7Ci0JCS8qIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBkcml2ZSBpcyBvcGVuIC4uICg/KSAqLzsKLQkJaXNfY2QgPSAxOwotCX0KLQlyZXR1cm4oaXNfY2QpOwotfQotCi0vKiBBZGQgYSBDRC1ST00gZHJpdmUgdG8gb3VyIGxpc3Qgb2YgdmFsaWQgZHJpdmVzICovCi1zdGF0aWMgdm9pZCBBZGREcml2ZShjaGFyICpkcml2ZSkKLXsKLQlpbnQgaTsKLQlzaXplX3QgbGVuOwotCi0JaWYgKCBTRExfbnVtY2RzIDwgTUFYX0RSSVZFUyApIHsKLQkJLyogQWRkIHRoaXMgZHJpdmUgdG8gb3VyIGxpc3QgKi8KLQkJaSA9IFNETF9udW1jZHM7Ci0JCWxlbiA9IFNETF9zdHJsZW4oZHJpdmUpKzE7Ci0JCVNETF9jZGxpc3RbaV0gPSAoY2hhciAqKVNETF9tYWxsb2MobGVuKTsKLQkJaWYgKCBTRExfY2RsaXN0W2ldID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybjsKLQkJfQotCQlTRExfc3RybGNweShTRExfY2RsaXN0W2ldLCBkcml2ZSwgbGVuKTsKLQkJKytTRExfbnVtY2RzOwotI2lmZGVmIENEUk9NX0RFQlVHCi0gIGZwcmludGYoc3RkZXJyLCAiQWRkZWQgQ0QtUk9NIGRyaXZlOiAlc1xuIiwgZHJpdmUpOwotI2VuZGlmCi0JfQotfQotCi0vKiBJREUgYnVzIHNjYW5uaW5nIG1hZ2ljICovCi1lbnVtIHsKLQlJREVfR0VUX0RFVklDRVNfSU5GTyA9IEJfREVWSUNFX09QX0NPREVTX0VORCArIDUwLAotfTsKLXN0cnVjdCBpZGVfY3RybF9pbmZvIHsKLQlib29sCWlkZV8wX3ByZXNlbnQ7Ci0JYm9vbAlpZGVfMF9tYXN0ZXJfcHJlc2VudDsKLQlib29sCWlkZV8wX3NsYXZlX3ByZXNlbnQ7Ci0JaW50CWlkZV8wX21hc3Rlcl90eXBlOwotCWludAlpZGVfMF9zbGF2ZV90eXBlOwotCWJvb2wJaWRlXzFfcHJlc2VudDsKLQlib29sCWlkZV8xX21hc3Rlcl9wcmVzZW50OwotCWJvb2wJaWRlXzFfc2xhdmVfcHJlc2VudDsKLQlpbnQJaWRlXzFfbWFzdGVyX3R5cGU7Ci0JaW50CWlkZV8xX3NsYXZlX3R5cGU7Ci19OwotCi1pbnQgIFNETF9TWVNfQ0RJbml0KHZvaWQpCi17Ci0JY2hhciAqU0RMY2Ryb207Ci0JaW50IHJhd19mZDsKLQlzdHJ1Y3QgaWRlX2N0cmxfaW5mbyBpbmZvOwotCi0JLyogRmlsbCBpbiBvdXIgZHJpdmVyIGNhcGFiaWxpdGllcyAqLwotCVNETF9DRGNhcHMuTmFtZSA9IFNETF9TWVNfQ0ROYW1lOwotCVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOwotCVNETF9DRGNhcHMuR2V0VE9DID0gU0RMX1NZU19DREdldFRPQzsKLQlTRExfQ0RjYXBzLlN0YXR1cyA9IFNETF9TWVNfQ0RTdGF0dXM7Ci0JU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7Ci0JU0RMX0NEY2Fwcy5QYXVzZSA9IFNETF9TWVNfQ0RQYXVzZTsKLQlTRExfQ0RjYXBzLlJlc3VtZSA9IFNETF9TWVNfQ0RSZXN1bWU7Ci0JU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7Ci0JU0RMX0NEY2Fwcy5FamVjdCA9IFNETF9TWVNfQ0RFamVjdDsKLQlTRExfQ0RjYXBzLkNsb3NlID0gU0RMX1NZU19DRENsb3NlOwotCi0JLyogTG9vayBpbiB0aGUgZW52aXJvbm1lbnQgZm9yIG91ciBDRC1ST00gZHJpdmUgbGlzdCAqLwotCVNETGNkcm9tID0gU0RMX2dldGVudigiU0RMX0NEUk9NIik7CS8qICc6JyBzZXBhcmF0ZWQgbGlzdCBvZiBkZXZpY2VzICovCi0JaWYgKCBTRExjZHJvbSAhPSBOVUxMICkgewotCQljaGFyICpjZHBhdGgsICpkZWxpbTsKLQkJc2l6ZV90IGxlbiA9IFNETF9zdHJsZW4oU0RMY2Ryb20pKzE7Ci0JCWNkcGF0aCA9IFNETF9zdGFja19hbGxvYyhjaGFyLCBsZW4pOwotCQlpZiAoIGNkcGF0aCAhPSBOVUxMICkgewotCQkJU0RMX3N0cmxjcHkoY2RwYXRoLCBTRExjZHJvbSwgbGVuKTsKLQkJCVNETGNkcm9tID0gY2RwYXRoOwotCQkJZG8gewotCQkJCWRlbGltID0gU0RMX3N0cmNocihTRExjZHJvbSwgJzonKTsKLQkJCQlpZiAoIGRlbGltICkgewotCQkJCQkqZGVsaW0rKyA9ICdcMCc7Ci0JCQkJfQotCQkJCWlmICggQ2hlY2tEcml2ZShTRExjZHJvbSkgPiAwICkgewotCQkJCQlBZGREcml2ZShTRExjZHJvbSk7Ci0JCQkJfQotCQkJCWlmICggZGVsaW0gKSB7Ci0JCQkJCVNETGNkcm9tID0gZGVsaW07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU0RMY2Ryb20gPSBOVUxMOwotCQkJCX0KLQkJCX0gd2hpbGUgKCBTRExjZHJvbSApOwotCQkJU0RMX3N0YWNrX2ZyZWUoY2RwYXRoKTsKLQkJfQotCi0JCS8qIElmIHdlIGZvdW5kIG91ciBkcml2ZXMsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCi0JCWlmICggU0RMX251bWNkcyA+IDAgKSB7Ci0JCQlyZXR1cm4oMCk7Ci0JCX0KLQl9Ci0JCi0JLyogU2NhbiB0aGUgc3lzdGVtIGZvciBDRC1ST00gZHJpdmVzICovCi0JdHJ5X2RpcigiL2Rldi9kaXNrIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IHRyeV9kaXIoY29uc3QgY2hhciAqZGlyZWN0b3J5KQoteyAKLQlCRGlyZWN0b3J5IGRpcjsgCi0JZGlyLlNldFRvKGRpcmVjdG9yeSk7IAotCWlmKGRpci5Jbml0Q2hlY2soKSAhPSBCX05PX0VSUk9SKSB7IAotCQlyZXR1cm4gZmFsc2U7IAotCX0gCi0JZGlyLlJld2luZCgpOyAKLQlCRW50cnkgZW50cnk7IAotCXdoaWxlKGRpci5HZXROZXh0RW50cnkoJmVudHJ5KSA+PSAwKSB7IAotCQlCUGF0aCBwYXRoOyAKLQkJY29uc3QgY2hhciAqbmFtZTsgCi0JCWVudHJ5X3JlZiBlOyAKLQkJCi0JCWlmKGVudHJ5LkdldFBhdGgoJnBhdGgpICE9IEJfTk9fRVJST1IpIAotCQkJY29udGludWU7IAotCQluYW1lID0gcGF0aC5QYXRoKCk7IAotCQkKLQkJaWYoZW50cnkuR2V0UmVmKCZlKSAhPSBCX05PX0VSUk9SKSAKLQkJCWNvbnRpbnVlOyAKLQotCQlpZihlbnRyeS5Jc0RpcmVjdG9yeSgpKSB7IAotCQkJaWYoU0RMX3N0cmNtcChlLm5hbWUsICJmbG9wcHkiKSA9PSAwKSAKLQkJCQljb250aW51ZTsgLyogaWdub3JlIGZsb3BweSAoaXQgaXMgbm90IHNpbGVudCkgICovCi0JCQlpbnQgZGV2ZmQgPSB0cnlfZGlyKG5hbWUpOwotCQkJaWYoZGV2ZmQgPj0gMCkKLQkJCQlyZXR1cm4gZGV2ZmQ7Ci0JCX0gCi0JCWVsc2UgeyAKLQkJCWludCBkZXZmZDsgCi0JCQlkZXZpY2VfZ2VvbWV0cnkgZzsgCi0KLQkJCWlmKFNETF9zdHJjbXAoZS5uYW1lLCAicmF3IikgIT0gMCkgCi0JCQkJY29udGludWU7IC8qIGlnbm9yZSBwYXJ0aXRpb25zICovCi0KLQkJCWRldmZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7IAotCQkJaWYoZGV2ZmQgPCAwKSAKLQkJCQljb250aW51ZTsgCi0KLQkJCWlmKGlvY3RsKGRldmZkLCBCX0dFVF9HRU9NRVRSWSwgJmcsIHNpemVvZihnKSkgPj0gMCkgewotCQkJCWlmKGcuZGV2aWNlX3R5cGUgPT0gQl9DRCkKLQkJCQl7Ci0JCQkJQWRkRHJpdmUoc3RyZHVwKG5hbWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljbG9zZShkZXZmZCk7Ci0JCX0gCi0JfQotCXJldHVybiBCX0VSUk9SOwotfQotCi0KLS8qIEdlbmVyYWwgaW9jdGwoKSBDRC1ST00gY29tbWFuZCBmdW5jdGlvbiAqLwotc3RhdGljIGludCBTRExfU1lTX0NEaW9jdGwoaW50IGluZGV4LCBpbnQgY29tbWFuZCwgdm9pZCAqYXJnKQotewotCWludCBva2F5OwotCWludCBmZDsKLQotCW9rYXkgPSAwOwotCWZkID0gb3BlbihTRExfY2RsaXN0W2luZGV4XSwgMCk7Ci0JaWYgKCBmZCA+PSAwICkgewotCQlpZiAoIGlvY3RsKGZkLCBjb21tYW5kLCBhcmcpID09IEJfTk9fRVJST1IgKSB7Ci0JCQlva2F5ID0gMTsKLQkJfQotCQljbG9zZShmZCk7Ci0JfQotCXJldHVybihva2F5ID8gMCA6IC0xKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKLXsKLQlyZXR1cm4oU0RMX2NkbGlzdFtkcml2ZV0pOwotfSAKLQotc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpCi17Ci0JcmV0dXJuKGRyaXZlKTsKLX0KLQotc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pCi17Ci0JaW50IGk7Ci0Jc2NzaV90b2MgdG9jOwotCi0JaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBCX1NDU0lfR0VUX1RPQywgJnRvYykgPT0gMCApIHsKLQkJY2Ryb20tPm51bXRyYWNrcyA9IENEX05VTVRSQUNLUyh0b2MpOwotCQlpZiAoIGNkcm9tLT5udW10cmFja3MgPiBTRExfTUFYX1RSQUNLUyApIHsKLQkJCWNkcm9tLT5udW10cmFja3MgPSBTRExfTUFYX1RSQUNLUzsKLQkJfQotCQlmb3IgKCBpPTA7IGk8PWNkcm9tLT5udW10cmFja3M7ICsraSApIHsKLQkJCWNkcm9tLT50cmFja1tpXS5pZCA9IENEX1RSQUNLX04odG9jLCBpKTsKLQkJCS8qIEZJWE1FOiAgSG93IGRvIHdlIHRlbGwgb24gQmVPUz8gKi8KLQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOwotCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IE1TRl9UT19GUkFNRVMoCi0JCQkJCQkJQ0RfVFJBQ0tfTSh0b2MsIGkpLAotCQkJCQkJCUNEX1RSQUNLX1ModG9jLCBpKSwKLQkJCQkJCQlDRF9UUkFDS19GKHRvYywgaSkpOwotCQkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IDA7Ci0JCQlpZiAoIGkgPiAwICkgewotCQkJCWNkcm9tLT50cmFja1tpLTFdLmxlbmd0aCA9Ci0JCQkJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0LQotCQkJCQkJY2Ryb20tPnRyYWNrW2ktMV0ub2Zmc2V0OwotCQkJfQotCQl9Ci0JCXJldHVybigwKTsKLQl9IGVsc2UgewotCQlyZXR1cm4oLTEpOwotCX0KLX0KLQotLyogR2V0IENELVJPTSBzdGF0dXMgKi8KLXN0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pCi17Ci0JQ0RzdGF0dXMgc3RhdHVzOwotCWludCBmZDsKLQlpbnQgY3VyX2ZyYW1lOwotCXNjc2lfcG9zaXRpb24gcG9zOwotCi0JZmQgPSBvcGVuKFNETF9jZGxpc3RbY2Ryb20tPmlkXSwgMCk7Ci0JY3VyX2ZyYW1lID0gMDsKLQlpZiAoIGZkID49IDAgKSB7Ci0JCWlmICggaW9jdGwoZmQsIEJfU0NTSV9HRVRfUE9TSVRJT04sICZwb3MpID09IEJfTk9fRVJST1IgKSB7Ci0JCQljdXJfZnJhbWUgPSBNU0ZfVE9fRlJBTUVTKAotCQkJCVBPU19BQlNfTShwb3MpLCBQT1NfQUJTX1MocG9zKSwgUE9TX0FCU19GKHBvcykpOwotCQl9Ci0JCWlmICggISBwb3MucG9zaXRpb25bMV0gfHwgKHBvcy5wb3NpdGlvblsxXSA+PSAweDEzKSB8fAotCQkJKChwb3MucG9zaXRpb25bMV0gPT0gMHgxMikgJiYgKCFwb3MucG9zaXRpb25bNl0pKSApIHsKLQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCX0gZWxzZQotCQlpZiAoIHBvcy5wb3NpdGlvblsxXSA9PSAweDExICkgewotCQkJc3RhdHVzID0gQ0RfUExBWUlORzsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IENEX1BBVVNFRDsKLQkJfQotCQljbG9zZShmZCk7Ci0JfSBlbHNlIHsKLQkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOwotCX0KLQlpZiAoIHBvc2l0aW9uICkgewotCQkqcG9zaXRpb24gPSBjdXJfZnJhbWU7Ci0JfQotCXJldHVybihzdGF0dXMpOwotfQotCi0vKiBTdGFydCBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLXsKLQlpbnQgb2theTsKLQlpbnQgZmQ7Ci0Jc2NzaV9wbGF5X3Bvc2l0aW9uIHBvczsKLQotCW9rYXkgPSAwOwotCWZkID0gb3BlbihTRExfY2RsaXN0W2Nkcm9tLT5pZF0sIDApOwotCWlmICggZmQgPj0gMCApIHsKLQkJRlJBTUVTX1RPX01TRihzdGFydCwgJnBvcy5zdGFydF9tLCAmcG9zLnN0YXJ0X3MsICZwb3Muc3RhcnRfZik7Ci0JCUZSQU1FU19UT19NU0Yoc3RhcnQrbGVuZ3RoLCAmcG9zLmVuZF9tLCAmcG9zLmVuZF9zLCAmcG9zLmVuZF9mKTsKLQkJaWYgKCBpb2N0bChmZCwgQl9TQ1NJX1BMQVlfUE9TSVRJT04sICZwb3MpID09IEJfTk9fRVJST1IgKSB7Ci0JCQlva2F5ID0gMTsKLQkJfQotCQljbG9zZShmZCk7Ci0JfQotCXJldHVybihva2F5ID8gMCA6IC0xKTsKLX0KLQotLyogUGF1c2UgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQl9TQ1NJX1BBVVNFX0FVRElPLCAwKSk7Ci19Ci0KLS8qIFJlc3VtZSBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQl9TQ1NJX1JFU1VNRV9BVURJTywgMCkpOwotfQotCi0vKiBTdG9wIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQl9TQ1NJX1NUT1BfQVVESU8sIDApKTsKLX0KLQotLyogRWplY3QgdGhlIENELVJPTSAqLwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQl9TQ1NJX0VKRUNULCAwKSk7Ci19Ci0KLS8qIENsb3NlIHRoZSBDRC1ST00gaGFuZGxlICovCi1zdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSkKLXsKLQljbG9zZShjZHJvbS0+aWQpOwotfQotCi12b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIFNETF9udW1jZHMgPiAwICkgewotCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgewotCQkJU0RMX2ZyZWUoU0RMX2NkbGlzdFtpXSk7Ci0JCX0KLQkJU0RMX251bWNkcyA9IDA7Ci0JfQotfQotCi0jZW5kaWYgLyogU0RMX0NEUk9NX0JFT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vYnNkaS9TRExfc3lzY2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vYnNkaS9TRExfc3lzY2Ryb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4N2YyMS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL2JzZGkvU0RMX3N5c2Nkcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfQ0RST01fQlNESQotCi0vKgotICogRnVuY3Rpb25zIGZvciBzeXN0ZW0tbGV2ZWwgQ0QtUk9NIGF1ZGlvIGNvbnRyb2wgZm9yIEJTRC9PUyA0LngKLSAqIFRoaXMgc3RhcnRlZCBsaWZlIG91dCBhcyBhIGNvcHkgb2YgdGhlIGZyZWVic2QvU0RMX2Nkcm9tLmMgZmlsZSBidXQgd2FzCi0gKiBoZWF2aWx5IG1vZGlmaWVkLiAgIFdvcmtzIGZvciBzdGFuZGFyZCAoTU1DKSBTQ1NJIGFuZCBBVEFQSSBDRHJvbSBkcml2ZXMuCi0gKgotICogU3RldmVuIFNjaHVsdHogLSBzbXNAdG8uZ2QtZXMuY29tCi0qLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVyci5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPC9zeXMvZGV2L3Njc2kvc2NzaS5oPgotI2luY2x1ZGUgPC9zeXMvZGV2L3Njc2kvc2NzaV9pb2N0bC5oPgotCi0jaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2Nkcm9tLmgiCi0KLS8qCi0gKiBUaGUgbXNmX3RvX2ZyYW1lIGFuZCBmcmFtZV90b19tc2Ygd2VyZSB5YW5rZWQgZnJvbSBsaWJjZHJvbSBhbmQgaW5saW5lZAotICogaGVyZSBzbyB0aGF0IC1sY2Ryb20gZG9lc24ndCBoYXZlIHRvIGJlIGRyYWdnZWQgaW4gZm9yIHNvbWV0aGluZyBzbyBzaW1wbGUuCi0qLwotCi0jZGVmaW5lCUZSQU1FU19QRVJfU0VDT05ECTc1Ci0jZGVmaW5lCUZSQU1FU19QRVJfTUlOVVRFCShGUkFNRVNfUEVSX1NFQ09ORCAqIDYwKQotCi1pbnQKLW1zZl90b19mcmFtZShpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBpbnQgZnJhbWUpCi0JewotCXJldHVybihtaW51dGUgKiBGUkFNRVNfUEVSX01JTlVURSArIHNlY29uZCAqIEZSQU1FU19QRVJfU0VDT05EICsgZnJhbWUpOwotCX0KLQotdm9pZAotZnJhbWVfdG9fbXNmKGludCBmcmFtZSwgaW50ICptaW5wLCBpbnQgKnNlY3AsIGludCAqZnJhbWVwKQotCXsKLQkqbWlucCA9IGZyYW1lIC8gRlJBTUVTX1BFUl9NSU5VVEU7Ci0JKnNlY3AgPSAoZnJhbWUgJSBGUkFNRVNfUEVSX01JTlVURSkgLyBGUkFNRVNfUEVSX1NFQ09ORDsKLQkqZnJhbWVwID0gZnJhbWUgJSBGUkFNRVNfUEVSX1NFQ09ORDsKLQl9Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIHdlJ2xsIGRldGVjdCAqLwotI2RlZmluZSBNQVhfRFJJVkVTCTE2CQotCi0vKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIENELVJPTSBkcml2ZXMgKi8KLXN0YXRpYyBjaGFyICpTRExfY2RsaXN0W01BWF9EUklWRVNdOwotc3RhdGljIGRldl90IFNETF9jZG1vZGVbTUFYX0RSSVZFU107Ci0KLS8qIFRoZSBzeXN0ZW0tZGVwZW5kZW50IENEIGNvbnRyb2wgZnVuY3Rpb25zICovCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOwotc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSk7Ci0KLXR5cGVkZWYJc3RydWN0CXNjc2lfY2RiIGNkYl90OwotCi1zdGF0aWMgaW50IHNjc2lfY21kKGludCBmZCwKLQkJc3RydWN0IHNjc2lfY2RiICpjZGIsCi0JCWludCBjZGJsZW4sIAotCQlpbnQgcncsCi0JCWNhZGRyX3QgZGF0YSwKLQkJaW50IGRhdGFsZW4sCi0JCXN0cnVjdCBzY3NpX3VzZXJfY2RiICpzdXMpCi0JewotCWludAlzY3Npc3RhdHVzOwotCXVuc2lnbmVkIGNoYXIJKmNwOwotCXN0cnVjdAlzY3NpX3VzZXJfY2RiIHN1YzsKLQotICAgIC8qIHNhZmV0eSBjaGVja3MgKi8KLQlpZgkoIWNkYikgcmV0dXJuKC0xKTsKLQlpZgkocncgIT0gU1VDX1JFQUQgJiYgcncgIT0gU1VDX1dSSVRFKSByZXR1cm4oLTEpOwotCi0Jc3VjLnN1Y19mbGFncyA9IHJ3OwotCXN1Yy5zdWNfY2RibGVuID0gY2RibGVuOwotCWJjb3B5KGNkYiwgc3VjLnN1Y19jZGIsIGNkYmxlbik7Ci0Jc3VjLnN1Y19kYXRhbGVuID0gZGF0YWxlbjsKLQlzdWMuc3VjX2RhdGEgPSBkYXRhOwotCXN1Yy5zdWNfdGltZW91dCA9IDEwOwkJLyogMTAgc2VjcyBtYXggZm9yIFRVUiBvciBTRU5TRSAqLwotCWlmCShpb2N0bChmZCwgU0NTSVJBV0NEQiwgJnN1YykgPT0gLTEpCi0JCXJldHVybigtMTEpOwotCXNjc2lzdGF0dXMgPSBzdWMuc3VjX3N1cy5zdXNfc3RhdHVzOwotCWNwID0gc3VjLnN1Y19zdXMuc3VzX3NlbnNlOwotCi0vKgotICogSWYgYSBwbGFjZSB0byBjb3B5IHRoZSBzZW5zZSBkYXRhIGJhY2sgdG8gaGFzIGJlZW4gcHJvdmlkZWQgdGhlbiB0aGUKLSAqIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgdGhlIGVycm9ycyBhbmQgcHJpbnRpbmcgYW55IGluZm9ybWF0aW9uCi0gKiBvdXQgaWYgdGhlIHN0YXR1cyB3YXMgbm90IHN1Y2Nlc3NmdWwuCi0qLwotCWlmCShzY3Npc3RhdHVzICE9IDAgJiYgIXN1cykKLQkJewotCQlmcHJpbnRmKHN0ZGVyciwic2NzaXN0YXR1cyA9ICV4IGNtZCA9ICV4XG4iLAotCQkJc2NzaXN0YXR1cywgY2RiWzBdKTsKLQkJZnByaW50ZihzdGRlcnIsICJzZW5zZSAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleFxuIiwgCi0JCQljcFswXSwgY3BbMV0sIGNwWzJdLCBjcFszXSwgY3BbNF0sIGNwWzVdLAotCQkJY3BbNl0sIGNwWzddLCBjcFs4XSwgY3BbOV0sIGNwWzEwXSwgY3BbMTFdLAotCQkJY3BbMTJdLCBjcFsxM10sIGNwWzE0XSwgY3BbMTVdKTsKLQkJcmV0dXJuKDEpOwotCQl9Ci0JaWYJKHN1cykKLQkJYmNvcHkoJnN1Yywgc3VzLCBzaXplb2YgKHN0cnVjdCBzY3NpX3VzZXJfY2RiKSk7Ci0JaWYJKHNjc2lzdGF0dXMpCi0JCXJldHVybigxKTsJLyogUmV0dXJuIG5vbi16ZXJvIGZvciB1bnN1Y2Nlc3NmdWwgc3RhdHVzICovCi0JcmV0dXJuKDApOwotCX0KLQotLyogcmVxdWVzdCB2ZW5kb3IgYnJhbmQgYW5kIG1vZGVsICovCi11bnNpZ25lZCBjaGFyICpJbnF1aXJ5KGludCBmZCkKLQl7Ci0Jc3RhdGljIHN0cnVjdCBzY3NpX2NkYjYgY2RiID0gCi0JCXsKLQkJMHgxMiwgCi0JCTAsIDAsIDAsCi0JCTU2LAotCQkwCi0JCX07Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgSW5xYnVmZmVyWzU2XTsKLQotCWlmCShzY3NpX2NtZChmZCwgKGNkYl90ICopJmNkYiwgNiwgU1VDX1JFQUQsIElucWJ1ZmZlciwgCi0JCQlzaXplb2YoSW5xYnVmZmVyKSwgMCkpCi0JCXJldHVybigiXDM3NyIpOwotCXJldHVybihJbnFidWZmZXIpOwotCX0KLQotI2RlZmluZSBBRERfU0VOU0VDT0RFIDEyCi0jZGVmaW5lIEFERF9TQ19RVUFMSUZJRVIgMTMKLQotaW50IFRlc3RGb3JNZWRpdW0oaW50IGZkKQotCXsKLQlpbnQJc3RzLCBhc2MsIGFzY3E7Ci0Jc3RydWN0CXNjc2lfdXNlcl9jZGIgc3VzOwotCXN0YXRpYyBzdHJ1Y3Qgc2NzaV9jZGI2IGNkYiA9Ci0JCXsKLQkJQ01EX1RFU1RfVU5JVF9SRUFEWSwgLyogY29tbWFuZCAqLwotCQkwLAkvKiByZXNlcnZlZCAqLwotCQkwLAkvKiByZXNlcnZlZCAqLwotCQkwLAkvKiByZXNlcnZlZCAqLwotCQkwLAkvKiByZXNlcnZlZCAqLwotCQkwCS8qIHJlc2VydmVkICovCi0JCX07Ci0KLWFnYWluOglzdHMgPSBzY3NpX2NtZChmZCwgKGNkYl90ICopJmNkYiwgNiwgU1VDX1JFQUQsIDAsIDAsICZzdXMpOwotCWFzYyA9IHN1cy5zdWNfc3VzLnN1c19zZW5zZVtBRERfU0VOU0VDT0RFXTsKLQlhc2NxID0gc3VzLnN1Y19zdXMuc3VzX3NlbnNlW0FERF9TQ19RVUFMSUZJRVJdOwotCWlmCShhc2MgPT0gMHgzYSAmJiBhc2NxID09IDB4MCkJLyogbm8gbWVkaXVtICovCi0JCXJldHVybigwKTsKLQlpZgkoYXNjID09IDB4MjggJiYgYXNjcSA9PSAweDApCS8qIG1lZGl1bSBjaGFuZ2VkICovCi0JCWdvdG8gYWdhaW47Ci0JaWYJKGFzYyA9PSAweDQgJiYgYXNjcSA9PSAweDEgKQkvKiBjb21pbmcgcmVhZHkgKi8KLQkJewotCQlzbGVlcCgyKTsKLQkJZ290byBhZ2FpbjsKLQkJfQotCXJldHVybigxKTsKLQl9Ci0KLS8qIENoZWNrIGEgZHJpdmUgdG8gc2VlIGlmIGl0IGlzIGEgQ0QtUk9NICovCi1zdGF0aWMgaW50IENoZWNrRHJpdmUoY2hhciAqZHJpdmUsIHN0cnVjdCBzdGF0ICpzdGJ1ZikKLXsKLQlpbnQgaXNfY2QgPSAwLCBjZGZkOwotCWNoYXIgKnA7Ci0KLQkvKiBJZiBpdCBkb2Vzbid0IGV4aXN0LCByZXR1cm4gLTEgKi8KLQlpZiAoIHN0YXQoZHJpdmUsIHN0YnVmKSA8IDAgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogSWYgaXQgZG9lcyBleGlzdCwgdmVyaWZ5IHRoYXQgaXQncyBhbiBhdmFpbGFibGUgQ0QtUk9NICovCi0JY2RmZCA9IG9wZW4oZHJpdmUsIChPX1JET05MWXxPX0VYQ0x8T19OT05CTE9DSyksIDApOwotCWlmICggY2RmZCA+PSAwICkgewotCQlwID0gSW5xdWlyeShjZGZkKTsKLQkJaWYgKCpwID09IFRZUEVfUk9NKQotCQkJaXNfY2QgPSAxOwotCQljbG9zZShjZGZkKTsKLQl9Ci0JcmV0dXJuKGlzX2NkKTsKLX0KLQotLyogQWRkIGEgQ0QtUk9NIGRyaXZlIHRvIG91ciBsaXN0IG9mIHZhbGlkIGRyaXZlcyAqLwotc3RhdGljIHZvaWQgQWRkRHJpdmUoY2hhciAqZHJpdmUsIHN0cnVjdCBzdGF0ICpzdGJ1ZikKLXsKLQlpbnQgaTsKLQotCWlmICggU0RMX251bWNkcyA8IE1BWF9EUklWRVMgKSB7Ci0JCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbHJlYWR5IGluIG91ciBsaXN0LgotCSAJICAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2Ugc2VlIGEgZHJpdmUgdmlhIHN5bWJvbGljIGxpbmsuCi0JCSAqLwotCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgewotCQkJaWYgKCBzdGJ1Zi0+c3RfcmRldiA9PSBTRExfY2Rtb2RlW2ldICkgewotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiRHVwbGljYXRlIGRyaXZlIGRldGVjdGVkOiAlcyA9PSAlc1xuIiwgZHJpdmUsIFNETF9jZGxpc3RbaV0pOwotI2VuZGlmCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLyogQWRkIHRoaXMgZHJpdmUgdG8gb3VyIGxpc3QgKi8KLQkJaSA9IFNETF9udW1jZHM7Ci0JCVNETF9jZGxpc3RbaV0gPSBTRExfc3RyZHVwKGRyaXZlKTsKLQkJaWYgKCBTRExfY2RsaXN0W2ldID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybjsKLQkJfQotCQlTRExfY2Rtb2RlW2ldID0gc3RidWYtPnN0X3JkZXY7Ci0JCSsrU0RMX251bWNkczsKLSNpZmRlZiBERUJVR19DRFJPTQotICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIENELVJPTSBkcml2ZTogJXNcbiIsIGRyaXZlKTsKLSNlbmRpZgotCX0KLX0KLQotaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQotewotCS8qIGNoZWNrbGlzdDogL2Rldi9yc3I/YyAqLwotCXN0YXRpYyBjaGFyICpjaGVja2xpc3RbXSA9IHsKLQkiPzAgcnNyPyIsIE5VTEwKLQl9OwotCWNoYXIgKlNETGNkcm9tOwotCWludCBpLCBqLCBleGlzdHM7Ci0JY2hhciBkcml2ZVszMl07Ci0Jc3RydWN0IHN0YXQgc3RidWY7Ci0KLQkvKiBGaWxsIGluIG91ciBkcml2ZXIgY2FwYWJpbGl0aWVzICovCi0JU0RMX0NEY2Fwcy5OYW1lID0gU0RMX1NZU19DRE5hbWU7Ci0JU0RMX0NEY2Fwcy5PcGVuID0gU0RMX1NZU19DRE9wZW47Ci0JU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOwotCVNETF9DRGNhcHMuU3RhdHVzID0gU0RMX1NZU19DRFN0YXR1czsKLQlTRExfQ0RjYXBzLlBsYXkgPSBTRExfU1lTX0NEUGxheTsKLQlTRExfQ0RjYXBzLlBhdXNlID0gU0RMX1NZU19DRFBhdXNlOwotCVNETF9DRGNhcHMuUmVzdW1lID0gU0RMX1NZU19DRFJlc3VtZTsKLQlTRExfQ0RjYXBzLlN0b3AgPSBTRExfU1lTX0NEU3RvcDsKLQlTRExfQ0RjYXBzLkVqZWN0ID0gU0RMX1NZU19DREVqZWN0OwotCVNETF9DRGNhcHMuQ2xvc2UgPSBTRExfU1lTX0NEQ2xvc2U7Ci0KLQkvKiBMb29rIGluIHRoZSBlbnZpcm9ubWVudCBmb3Igb3VyIENELVJPTSBkcml2ZSBsaXN0ICovCi0JU0RMY2Ryb20gPSBTRExfZ2V0ZW52KCJTRExfQ0RST00iKTsJLyogJzonIHNlcGFyYXRlZCBsaXN0IG9mIGRldmljZXMgKi8KLQlpZiAoIFNETGNkcm9tICE9IE5VTEwgKSB7Ci0JCWNoYXIgKmNkcGF0aCwgKmRlbGltOwotCQlzaXplX3QgbGVuID0gU0RMX3N0cmxlbihTRExjZHJvbSkrMTsKLQkJY2RwYXRoID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIGxlbik7Ci0JCWlmICggY2RwYXRoICE9IE5VTEwgKSB7Ci0JCQlTRExfc3RybGNweShjZHBhdGgsIFNETGNkcm9tLCBsZW4pOwotCQkJU0RMY2Ryb20gPSBjZHBhdGg7Ci0JCQlkbyB7Ci0JCQkJZGVsaW0gPSBTRExfc3RyY2hyKFNETGNkcm9tLCAnOicpOwotCQkJCWlmICggZGVsaW0gKSB7Ci0JCQkJCSpkZWxpbSsrID0gJ1wwJzsKLQkJCQl9Ci0JCQkJaWYgKCBDaGVja0RyaXZlKFNETGNkcm9tLCAmc3RidWYpID4gMCApIHsKLQkJCQkJQWRkRHJpdmUoU0RMY2Ryb20sICZzdGJ1Zik7Ci0JCQkJfQotCQkJCWlmICggZGVsaW0gKSB7Ci0JCQkJCVNETGNkcm9tID0gZGVsaW07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU0RMY2Ryb20gPSBOVUxMOwotCQkJCX0KLQkJCX0gd2hpbGUgKCBTRExjZHJvbSApOwotCQkJU0RMX3N0YWNrX2ZyZWUoY2RwYXRoKTsKLQkJfQotCi0JCS8qIElmIHdlIGZvdW5kIG91ciBkcml2ZXMsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCi0JCWlmICggU0RMX251bWNkcyA+IDAgKSB7Ci0JCQlyZXR1cm4oMCk7Ci0JCX0KLQl9Ci0KLQkvKiBTY2FuIHRoZSBzeXN0ZW0gZm9yIENELVJPTSBkcml2ZXMgKi8KLQlmb3IgKCBpPTA7IGNoZWNrbGlzdFtpXTsgKytpICkgewotCQlpZiAoIGNoZWNrbGlzdFtpXVswXSA9PSAnPycgKSB7Ci0JCQljaGFyICppbnNlcnQ7Ci0JCQlleGlzdHMgPSAxOwotCQkJZm9yICggaj1jaGVja2xpc3RbaV1bMV07IGV4aXN0czsgKytqICkgewotCQkJCVNETF9zbnByaW50Zihkcml2ZSwgU0RMX2FycmF5c2l6ZShkcml2ZSksICIvZGV2LyVzYyIsICZjaGVja2xpc3RbaV1bM10pOwotCQkJCWluc2VydCA9IFNETF9zdHJjaHIoZHJpdmUsICc/Jyk7Ci0JCQkJaWYgKCBpbnNlcnQgIT0gTlVMTCApIHsKLQkJCQkJKmluc2VydCA9IGo7Ci0JCQkJfQotCQkJCXN3aXRjaCAoQ2hlY2tEcml2ZShkcml2ZSwgJnN0YnVmKSkgewotCQkJCQkvKiBEcml2ZSBleGlzdHMgYW5kIGlzIGEgQ0QtUk9NICovCi0JCQkJCWNhc2UgMToKLQkJCQkJCUFkZERyaXZlKGRyaXZlLCAmc3RidWYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCS8qIERyaXZlIGV4aXN0cywgYnV0IGlzbid0IGEgQ0QtUk9NICovCi0JCQkJCWNhc2UgMDoKLQkJCQkJCWJyZWFrOwotCQkJCQkvKiBEcml2ZSBkb2Vzbid0IGV4aXN0ICovCi0JCQkJCWNhc2UgLTE6Ci0JCQkJCQlleGlzdHMgPSAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIi9kZXYvJXMiLCBjaGVja2xpc3RbaV0pOwotCQkJaWYgKCBDaGVja0RyaXZlKGRyaXZlLCAmc3RidWYpID4gMCApIHsKLQkJCQlBZGREcml2ZShkcml2ZSwgJnN0YnVmKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpCi17Ci0JcmV0dXJuKFNETF9jZGxpc3RbZHJpdmVdKTsKLX0KLQotc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpCi17Ci0JcmV0dXJuKG9wZW4oU0RMX2NkbGlzdFtkcml2ZV0sIE9fUkRPTkxZIHwgT19OT05CTE9DSyB8IE9fRVhDTCwgMCkpOwotfQotCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSkKLQl7Ci0JdV9jaGFyIGNkYlsxMF0sIGJ1Zls0XSwgKnAsICp0b2M7Ci0Jc3RydWN0IHNjc2lfdXNlcl9jZGIgc3VzOwotCWludCBpLCBzdHMsIGZpcnN0X3RyYWNrLCBsYXN0X3RyYWNrLCBudHJhY2tzLCB0b2Nfc2l6ZTsKLQotCWJ6ZXJvKGNkYiwgc2l6ZW9mIChjZGIpKTsKLQljZGJbMF0gPSAweDQzOwkJLyogUmVhZCBUT0MgKi8KLQljZGJbMV0gPSAweDI7CQkvKiBNU0YgKi8KLQljZGJbOF0gPSA0OwkJLyogc2l6ZSBUT0MgaGVhZGVyICovCi0Jc3RzID0gc2NzaV9jbWQoY2Ryb20tPmlkLCAoY2RiX3QgKiljZGIsIDEwLCBTVUNfUkVBRCwgYnVmLCA0LCAmc3VzKTsKLQlpZgkoc3RzIDwgMCkKLQkJcmV0dXJuKC0xKTsKLQlmaXJzdF90cmFjayA9IGJ1ZlsyXTsKLQlsYXN0X3RyYWNrID0gYnVmWzNdOwotCW50cmFja3MgPSBsYXN0X3RyYWNrIC0gZmlyc3RfdHJhY2sgKyAxOwotCWNkcm9tLT5udW10cmFja3MgPSBudHJhY2tzOwotCXRvY19zaXplID0gNCArIChudHJhY2tzICsgMSkgKiA4OwotCXRvYyA9ICh1X2NoYXIgKilTRExfbWFsbG9jKHRvY19zaXplKTsKLQlpZgkodG9jID09IE5VTEwpCi0JCXJldHVybigtMSk7Ci0JYnplcm8oY2RiLCBzaXplb2YgKGNkYikpOwotCWNkYlswXSA9IDB4NDM7Ci0JY2RiWzFdID0gMHgyOwotCWNkYls2XSA9IGZpcnN0X3RyYWNrOwotCWNkYls3XSA9IHRvY19zaXplID4+IDg7Ci0JY2RiWzhdID0gdG9jX3NpemUgJiAweGZmOwotCXN0cyA9IHNjc2lfY21kKGNkcm9tLT5pZCwgKGNkYl90ICopY2RiLCAxMCwgU1VDX1JFQUQsIHRvYywgdG9jX3NpemUsIAotCQkJJnN1cyk7Ci0JaWYJKHN0cyA8IDApCi0JCXsKLQkJU0RMX2ZyZWUodG9jKTsKLQkJcmV0dXJuKC0xKTsKLQkJfQotCi0JZm9yCShpID0gMCwgcCA9IHRvYys0OyBpIDw9IG50cmFja3M7IGkrKywgcCs9IDgpCi0JCXsKLQkJaWYJKGkgPT0gbnRyYWNrcykKLQkJCWNkcm9tLT50cmFja1tpXS5pZCA9IDB4QUE7CS8qIExlYWRvdXQgKi8KLQkJZWxzZQotCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gZmlyc3RfdHJhY2sgKyBpOwotCQlpZgkocFsxXSAmIDB4MjApCi0JCQljZHJvbS0+dHJhY2tbaV0udHlwZSA9IFNETF9EQVRBX1RSQUNLOwotCQllbHNlCi0JCQljZHJvbS0+dHJhY2tbaV0udHlwZSA9IFNETF9BVURJT19UUkFDSzsKLQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IG1zZl90b19mcmFtZShwWzVdLCBwWzZdLCBwWzddKTsKLQkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IDA7Ci0JCWlmCShpID4gMCkKLQkJCWNkcm9tLT50cmFja1tpLTFdLmxlbmd0aCA9IGNkcm9tLT50cmFja1tpXS5vZmZzZXQgLQotCQkJCQkJICAgY2Ryb20tPnRyYWNrW2ktMV0ub2Zmc2V0OwotCQl9Ci0JU0RMX2ZyZWUodG9jKTsKLQlyZXR1cm4oMCk7Ci0JfQotCi0vKiBHZXQgQ0QtUk9NIHN0YXR1cyAqLwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKLQl7Ci0JQ0RzdGF0dXMgc3RhdHVzOwotCXVfY2hhcgljZGJbMTBdLCBidWZbMTZdOwotCWludAlzdHM7Ci0Jc3RydWN0CXNjc2lfdXNlcl9jZGIgc3VzOwotCi0JYnplcm8oY2RiLCBzaXplb2YgKGNkYikpOwotCWNkYlswXSA9IDB4NDI7CQkvKiByZWFkIHN1YnEgKi8KLQljZGJbMV0gPSAweDI7CQkvKiBNU0YgKi8KLQljZGJbMl0gPSAweDQwOwkJLyogcSBjaGFubmVsICovCi0JY2RiWzNdID0gMTsJCS8qIGN1cnJlbnQgcG9zICovCi0JY2RiWzddID0gc2l6ZW9mIChidWYpID4+IDg7Ci0JY2RiWzhdID0gc2l6ZW9mIChidWYpICYgMHhmZjsKLQlzdHMgPSBzY3NpX2NtZChjZHJvbS0+aWQsIChjZGJfdCAqKWNkYiwgMTAsIFNVQ19SRUFELCBidWYsIHNpemVvZiAoYnVmKSwKLQkJCSZzdXMpOwotCWlmCShzdHMgPCAwKQotCQlyZXR1cm4oLTEpOwotCWlmCShzdHMpCi0JCXsKLQkJaWYJKFRlc3RGb3JNZWRpdW0oY2Ryb20tPmlkKSA9PSAwKQotCQkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOwotCQllbHNlCi0JCQlzdGF0dXMgPSBDRF9FUlJPUjsKLQkJfQotCWVsc2UKLQkJewotCQlzd2l0Y2gJKGJ1ZlsxXSkKLQkJCXsKLQkJCWNhc2UJMHgxMToKLQkJCQlzdGF0dXMgPSBDRF9QTEFZSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZQkweDEyOgotCQkJCXN0YXR1cyA9IENEX1BBVVNFRDsKLQkJCQlicmVhazsKLQkJCWNhc2UJMHgxMzoKLQkJCWNhc2UJMHgxNDoKLQkJCWNhc2UJMHgxNToKLQkJCQlzdGF0dXMgPSBDRF9TVE9QUEVEOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdGF0dXMgPSBDRF9FUlJPUjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCWlmCShwb3NpdGlvbikKLQkJewotCQlpZgkoIHN0YXR1cyA9PSBDRF9QTEFZSU5HIHx8IChzdGF0dXMgPT0gQ0RfUEFVU0VEKSApCi0JCQkqcG9zaXRpb24gPSBtc2ZfdG9fZnJhbWUoYnVmWzldLCBidWZbMTBdLCBidWZbMTFdKTsKLQkJZWxzZQotCQkJKnBvc2l0aW9uID0gMDsKLQkJfQotCXJldHVybihzdGF0dXMpOwotCX0KLQotLyogU3RhcnQgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0JewotCXVfY2hhcgljZGJbMTBdOwotCWludAlzdHMsIG1pbnV0ZSwgc2Vjb25kLCBmcmFtZSwgZW1pbnV0ZSwgZXNlY29uZCwgZWZyYW1lOwotCXN0cnVjdAlzY3NpX3VzZXJfY2RiIHN1czsKLQotCWJ6ZXJvKGNkYiwgc2l6ZW9mKGNkYikpOwotCWNkYlswXSA9IDB4NDc7CQkvKiBQbGF5ICovCi0JZnJhbWVfdG9fbXNmKHN0YXJ0LCAmbWludXRlLCAmc2Vjb25kLCAmZnJhbWUpOwotCWZyYW1lX3RvX21zZihzdGFydCArIGxlbmd0aCwgJmVtaW51dGUsICZlc2Vjb25kLCAmZWZyYW1lKTsKLQljZGJbM10gPSBtaW51dGU7Ci0JY2RiWzRdID0gc2Vjb25kOwotCWNkYls1XSA9IGZyYW1lOwotCWNkYls2XSA9IGVtaW51dGU7Ci0JY2RiWzddID0gZXNlY29uZDsKLQljZGJbOF0gPSBlZnJhbWU7Ci0Jc3RzID0gc2NzaV9jbWQoY2Ryb20tPmlkLCAoY2RiX3QgKiljZGIsIDEwLCBTVUNfUkVBRCwgMCwgMCwgJnN1cyk7Ci0JcmV0dXJuKHN0cyk7Ci0JfQotCi1zdGF0aWMJaW50Ci1wYXVzZXJlc3VtZShTRExfQ0QgKmNkcm9tLCBpbnQgZmxhZykKLQl7Ci0JdV9jaGFyCWNkYlsxMF07Ci0Jc3RydWN0CXNjc2lfdXNlcl9jZGIgc3VzOwotCi0JYnplcm8oY2RiLCBzaXplb2YgKGNkYikpOwotCWNkYlswXSA9IDB4NGI7Ci0JY2RiWzhdID0gZmxhZyAmIDB4MTsKLQlyZXR1cm4oc2NzaV9jbWQoY2Ryb20tPmlkLCAoY2RiX3QgKiljZGIsIDEwLCBTVUNfUkVBRCwgMCwgMCwgJnN1cykpOwotCX0KLQotLyogUGF1c2UgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4ocGF1c2VyZXN1bWUoY2Ryb20sIDApKTsKLX0KLQotLyogUmVzdW1lIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKQotewotCXJldHVybihwYXVzZXJlc3VtZShjZHJvbSwgMSkpOwotfQotCi0vKiBTdG9wIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKLXsKLQl1X2NoYXIgY2RiWzZdOwotCXN0cnVjdAlzY3NpX3VzZXJfY2RiIHN1czsKLQotCWJ6ZXJvKGNkYiwgc2l6ZW9mIChjZGIpKTsKLQljZGJbMF0gPSAweDFiOwkJLyogc3RvcCAqLwotCWNkYlsxXSA9IDE7CQkvKiBpbW1lZGlhdGUgKi8KLQlyZXR1cm4oc2NzaV9jbWQoY2Ryb20tPmlkLCAoY2RiX3QgKiljZGIsIDYsIFNVQ19SRUFELCAwLCAwLCAmc3VzKSk7Ci19Ci0KLS8qIEVqZWN0IHRoZSBDRC1ST00gKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pCi17Ci0JdV9jaGFyIGNkYls2XTsKLQlzdHJ1Y3QJc2NzaV91c2VyX2NkYiBzdXM7Ci0KLQliemVybyhjZGIsIHNpemVvZiAoY2RiKSk7Ci0JY2RiWzBdID0gMHgxYjsJCS8qIHN0b3AgKi8KLQljZGJbMV0gPSAxOwkJLyogaW1tZWRpYXRlICovCi0JY2RiWzRdID0gMjsJCS8qIGVqZWN0ICovCi0JcmV0dXJuKHNjc2lfY21kKGNkcm9tLT5pZCwgKGNkYl90ICopY2RiLCA2LCBTVUNfUkVBRCwgMCwgMCwgJnN1cykpOwotfQotCi0vKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLwotc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCi0JewotCWNsb3NlKGNkcm9tLT5pZCk7Ci0JfQotCi12b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIFNETF9udW1jZHMgPiAwICkgewotCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgewotCQkJU0RMX2ZyZWUoU0RMX2NkbGlzdFtpXSk7Ci0JCQl9Ci0JCX0KLQlTRExfbnVtY2RzID0gMDsKLX0KLQotI2VuZGlmIC8qIFNETF9DRFJPTV9CU0RJICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL2RjL1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9kYy9TRExfc3lzY2Ryb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5ZTA4OS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL2RjL1NETF9zeXNjZHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX0NEUk9NX0RDCi0KLS8qIEZ1bmN0aW9ucyBmb3Igc3lzdGVtLWxldmVsIENELVJPTSBhdWRpbyBjb250cm9sICovCi0KLSNpbmNsdWRlIDxkYy9jZHJvbS5oPgotI2luY2x1ZGUgPGRjL3NwdS5oPgotCi0jaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2Nkcm9tLmgiCi0KLS8qIFRoZSBzeXN0ZW0tZGVwZW5kZW50IENEIGNvbnRyb2wgZnVuY3Rpb25zICovCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOwotc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSk7Ci0KLQotaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQotewotCS8qIEZpbGwgaW4gb3VyIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KLQlTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKLQlTRExfQ0RjYXBzLk9wZW4gPSBTRExfU1lTX0NET3BlbjsKLQlTRExfQ0RjYXBzLkdldFRPQyA9IFNETF9TWVNfQ0RHZXRUT0M7Ci0JU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOwotCVNETF9DRGNhcHMuUGxheSA9IFNETF9TWVNfQ0RQbGF5OwotCVNETF9DRGNhcHMuUGF1c2UgPSBTRExfU1lTX0NEUGF1c2U7Ci0JU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOwotCVNETF9DRGNhcHMuU3RvcCA9IFNETF9TWVNfQ0RTdG9wOwotCVNETF9DRGNhcHMuRWplY3QgPSBTRExfU1lTX0NERWplY3Q7Ci0JU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKLQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKLXsKLQlyZXR1cm4gIi9jZCI7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKQotewotCXJldHVybihkcml2ZSk7Ci19Ci0KLSNkZWZpbmUJVFJBQ0tfQ0REQQkwCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSkKLXsKLQlDRFJPTV9UT0MgdG9jOwotCWludCByZXQsaTsKLQotCXJldCA9IGNkcm9tX3JlYWRfdG9jKCZ0b2MsMCk7Ci0JaWYgKHJldCE9RVJSX09LKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQljZHJvbS0+bnVtdHJhY2tzID0gVE9DX1RSQUNLKHRvYy5sYXN0KS1UT0NfVFJBQ0sodG9jLmZpcnN0KSsxOwotCWZvcihpPTA7aTxjZHJvbS0+bnVtdHJhY2tzO2krKykgewotCQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gdG9jLmVudHJ5W2ldOwotCQljZHJvbS0+dHJhY2tbaV0uaWQgPSBpKzE7Ci0JCWNkcm9tLT50cmFja1tpXS50eXBlID0gKFRPQ19DVFJMKHRvYy5lbnRyeVtpXSk9PVRSQUNLX0NEREEpP1NETF9BVURJT19UUkFDSzpTRExfREFUQV9UUkFDSzsKLQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IFRPQ19MQkEoZW50cnkpLTE1MDsKLQkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IFRPQ19MQkEoKGkrMTx0b2MubGFzdCk/dG9jLmVudHJ5W2krMV06dG9jLmxlYWRvdXRfc2VjdG9yKS1UT0NfTEJBKGVudHJ5KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogR2V0IENELVJPTSBzdGF0dXMgKi8KLXN0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pCi17Ci0JaW50IHJldCxkY19zdGF0dXMsZGlzY190eXBlOwotCi0JcmV0ID0gY2Ryb21fZ2V0X3N0YXR1cygmZGNfc3RhdHVzLCZkaXNjX3R5cGUpOwotCWlmIChyZXQhPUVSUl9PSykgcmV0dXJuIENEX0VSUk9SOwotCi0Jc3dpdGNoKGRjX3N0YXR1cykgewotLy8JY2FzZSBDRF9TVEFUVVNfQlVTWToKLQljYXNlIENEX1NUQVRVU19QQVVTRUQ6Ci0JCXJldHVybiBDRF9QQVVTRUQ7Ci0JY2FzZSBDRF9TVEFUVVNfU1RBTkRCWToKLQkJcmV0dXJuIENEX1NUT1BQRUQ7Ci0JY2FzZSBDRF9TVEFUVVNfUExBWUlORzoKLQkJcmV0dXJuIENEX1BMQVlJTkc7Ci0vLwljYXNlIENEX1NUQVRVU19TRUVLSU5HOgotLy8JY2FzZSBDRF9TVEFUVVNfU0NBTklORzoKLQljYXNlIENEX1NUQVRVU19PUEVOOgotCWNhc2UgQ0RfU1RBVFVTX05PX0RJU0M6Ci0JCXJldHVybiBDRF9UUkFZRU1QVFk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuCUNEX0VSUk9SOwotCX0KLX0KLQotLyogU3RhcnQgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi17Ci0JaW50IHJldCA9IGNkcm9tX2NkZGFfcGxheShzdGFydC0xNTAsc3RhcnQtMTUwK2xlbmd0aCwxLENEREFfU0VDVE9SUyk7Ci0JcmV0dXJuIHJldD09RVJSX09LPzA6LTE7Ci19Ci0KLS8qIFBhdXNlIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pCi17Ci0JaW50IHJldD1jZHJvbV9jZGRhX3BhdXNlKCk7Ci0JcmV0dXJuIHJldD09RVJSX09LPzA6LTE7Ci19Ci0KLS8qIFJlc3VtZSBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKLXsKLQlpbnQgcmV0PWNkcm9tX2NkZGFfcmVzdW1lKCk7Ci0JcmV0dXJuIHJldD09RVJSX09LPzA6LTE7Ci19Ci0KLS8qIFN0b3AgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQotewotCWludCByZXQ9Y2Ryb21fc3Bpbl9kb3duKCk7Ci0JcmV0dXJuIHJldD09RVJSX09LPzA6LTE7Ci19Ci0KLS8qIEVqZWN0IHRoZSBDRC1ST00gKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pCi17Ci0JcmV0dXJuIC0xOwotfQotCi0vKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLwotc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCi17Ci19Ci0KLXZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCkKLXsKLQotfQotCi0jZW5kaWYgLyogU0RMX0NEUk9NX0RDICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL2R1bW15L1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9kdW1teS9TRExfc3lzY2Ryb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5OTMwMy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL2R1bW15L1NETF9zeXNjZHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZiBkZWZpbmVkKFNETF9DRFJPTV9EVU1NWSkgfHwgZGVmaW5lZChTRExfQ0RST01fRElTQUJMRUQpCi0KLS8qIFN0dWIgZnVuY3Rpb25zIGZvciBzeXN0ZW0tbGV2ZWwgQ0QtUk9NIGF1ZGlvIGNvbnRyb2wgKi8KLQotI2luY2x1ZGUgIlNETF9jZHJvbS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgotCi1pbnQgIFNETF9TWVNfQ0RJbml0KHZvaWQpCi17Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCi17Ci0JcmV0dXJuOwotfQotCi0jZW5kaWYgLyogU0RMX0NEUk9NX0RVTU1ZIHx8IFNETF9DRFJPTV9ESVNBQkxFRCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9mcmVlYnNkL1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9mcmVlYnNkL1NETF9zeXNjZHJvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGI1YzkwLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vZnJlZWJzZC9TRExfc3lzY2Ryb20uYworKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9DRFJPTV9GUkVFQlNECi0KLS8qIEZ1bmN0aW9ucyBmb3Igc3lzdGVtLWxldmVsIENELVJPTSBhdWRpbyBjb250cm9sICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvY2Rpby5oPgotCi0jaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2Nkcm9tLmgiCi0KLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgd2UnbGwgZGV0ZWN0ICovCi0jZGVmaW5lIE1BWF9EUklWRVMJMTYJCi0KLS8qIEEgbGlzdCBvZiBhdmFpbGFibGUgQ0QtUk9NIGRyaXZlcyAqLwotc3RhdGljIGNoYXIgKlNETF9jZGxpc3RbTUFYX0RSSVZFU107Ci1zdGF0aWMgZGV2X3QgU0RMX2NkbW9kZVtNQVhfRFJJVkVTXTsKLQotLyogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQ0QgY29udHJvbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKLQotLyogU29tZSBpb2N0bCgpIGVycm5vIHZhbHVlcyB3aGljaCBvY2N1ciB3aGVuIHRoZSB0cmF5IGlzIGVtcHR5ICovCi0jZGVmaW5lIEVSUk5PX1RSQVlFTVBUWShlcnJubykJXAotCSgoZXJybm8gPT0gRUlPKSB8fCAoZXJybm8gPT0gRU5PRU5UKSB8fCAoZXJybm8gPT0gRUlOVkFMKSkKLQotLyogQ2hlY2sgYSBkcml2ZSB0byBzZWUgaWYgaXQgaXMgYSBDRC1ST00gKi8KLXN0YXRpYyBpbnQgQ2hlY2tEcml2ZShjaGFyICpkcml2ZSwgc3RydWN0IHN0YXQgKnN0YnVmKQotewotCWludCBpc19jZCwgY2RmZDsKLQlzdHJ1Y3QgaW9jX3JlYWRfc3ViY2hhbm5lbCBpbmZvOwotCi0JLyogSWYgaXQgZG9lc24ndCBleGlzdCwgcmV0dXJuIC0xICovCi0JaWYgKCBzdGF0KGRyaXZlLCBzdGJ1ZikgPCAwICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIElmIGl0IGRvZXMgZXhpc3QsIHZlcmlmeSB0aGF0IGl0J3MgYW4gYXZhaWxhYmxlIENELVJPTSAqLwotCWlzX2NkID0gMDsKLQlpZiAoIFNfSVNDSFIoc3RidWYtPnN0X21vZGUpIHx8IFNfSVNCTEsoc3RidWYtPnN0X21vZGUpICkgewotCQljZGZkID0gb3Blbihkcml2ZSwgKE9fUkRPTkxZfE9fRVhDTHxPX05PTkJMT0NLKSwgMCk7Ci0JCWlmICggY2RmZCA+PSAwICkgewotCQkJaW5mby5hZGRyZXNzX2Zvcm1hdCA9IENEX01TRl9GT1JNQVQ7Ci0JCQlpbmZvLmRhdGFfZm9ybWF0ID0gQ0RfQ1VSUkVOVF9QT1NJVElPTjsKLQkJCWluZm8uZGF0YV9sZW4gPSAwOwotCQkJaW5mby5kYXRhID0gTlVMTDsKLQkJCS8qIFVuZGVyIExpbnV4LCBFSU8gb2NjdXJzIHdoZW4gYSBkaXNrIGlzIG5vdCBwcmVzZW50LgotCQkJICAgVGhpcyBpc24ndCAxMDAlIHJlbGlhYmxlLCBzbyB3ZSB1c2UgdGhlIFVTRV9NTlRFTlQKLQkJCSAgIGNvZGUgYWJvdmUgaW5zdGVhZC4KLQkJCSAqLwotCQkJaWYgKCAoaW9jdGwoY2RmZCwgQ0RJT0NSRUFEU1VCQ0hBTk5FTCwgJmluZm8pID09IDApIHx8Ci0JCQkJCQlFUlJOT19UUkFZRU1QVFkoZXJybm8pICkgewotCQkJCWlzX2NkID0gMTsKLQkJCX0KLQkJCWNsb3NlKGNkZmQpOwotCQl9Ci0JfQotCXJldHVybihpc19jZCk7Ci19Ci0KLS8qIEFkZCBhIENELVJPTSBkcml2ZSB0byBvdXIgbGlzdCBvZiB2YWxpZCBkcml2ZXMgKi8KLXN0YXRpYyB2b2lkIEFkZERyaXZlKGNoYXIgKmRyaXZlLCBzdHJ1Y3Qgc3RhdCAqc3RidWYpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIFNETF9udW1jZHMgPCBNQVhfRFJJVkVTICkgewotCQkvKiBDaGVjayB0byBtYWtlIHN1cmUgaXQncyBub3QgYWxyZWFkeSBpbiBvdXIgbGlzdC4KLQkgCSAgIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIHNlZSBhIGRyaXZlIHZpYSBzeW1ib2xpYyBsaW5rLgotCQkgKi8KLQkJZm9yICggaT0wOyBpPFNETF9udW1jZHM7ICsraSApIHsKLQkJCWlmICggc3RidWYtPnN0X3JkZXYgPT0gU0RMX2NkbW9kZVtpXSApIHsKLSNpZmRlZiBERUJVR19DRFJPTQotICBmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSBkcml2ZSBkZXRlY3RlZDogJXMgPT0gJXNcbiIsIGRyaXZlLCBTRExfY2RsaXN0W2ldKTsKLSNlbmRpZgotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8qIEFkZCB0aGlzIGRyaXZlIHRvIG91ciBsaXN0ICovCi0JCWkgPSBTRExfbnVtY2RzOwotCQlTRExfY2RsaXN0W2ldID0gU0RMX3N0cmR1cChkcml2ZSk7Ci0JCWlmICggU0RMX2NkbGlzdFtpXSA9PSBOVUxMICkgewotCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU0RMX2NkbW9kZVtpXSA9IHN0YnVmLT5zdF9yZGV2OwotCQkrK1NETF9udW1jZHM7Ci0jaWZkZWYgREVCVUdfQ0RST00KLSAgZnByaW50ZihzdGRlcnIsICJBZGRlZCBDRC1ST00gZHJpdmU6ICVzXG4iLCBkcml2ZSk7Ci0jZW5kaWYKLQl9Ci19Ci0KLWludCAgU0RMX1NZU19DREluaXQodm9pZCkKLXsKLQkvKiBjaGVja2xpc3Q6IC9kZXYvY2Ryb20sL2Rldi9jZD9jIC9kZXYvYWNkP2MKLQkJCS9kZXYvbWF0Y2Q/YyAvZGV2L21jZD9jIC9kZXYvc2NkP2MgKi8KLQlzdGF0aWMgY2hhciAqY2hlY2tsaXN0W10gPSB7Ci0JImNkcm9tIiwgIj8wIGNkPyIsICI/MCBhY2Q/IiwgIj8wIG1hdGNkPyIsICI/MCBtY2Q/IiwgIj8wIHNjZD8iLE5VTEwKLQl9OwotCWNoYXIgKlNETGNkcm9tOwotCWludCBpLCBqLCBleGlzdHM7Ci0JY2hhciBkcml2ZVszMl07Ci0Jc3RydWN0IHN0YXQgc3RidWY7Ci0KLQkvKiBGaWxsIGluIG91ciBkcml2ZXIgY2FwYWJpbGl0aWVzICovCi0JU0RMX0NEY2Fwcy5OYW1lID0gU0RMX1NZU19DRE5hbWU7Ci0JU0RMX0NEY2Fwcy5PcGVuID0gU0RMX1NZU19DRE9wZW47Ci0JU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOwotCVNETF9DRGNhcHMuU3RhdHVzID0gU0RMX1NZU19DRFN0YXR1czsKLQlTRExfQ0RjYXBzLlBsYXkgPSBTRExfU1lTX0NEUGxheTsKLQlTRExfQ0RjYXBzLlBhdXNlID0gU0RMX1NZU19DRFBhdXNlOwotCVNETF9DRGNhcHMuUmVzdW1lID0gU0RMX1NZU19DRFJlc3VtZTsKLQlTRExfQ0RjYXBzLlN0b3AgPSBTRExfU1lTX0NEU3RvcDsKLQlTRExfQ0RjYXBzLkVqZWN0ID0gU0RMX1NZU19DREVqZWN0OwotCVNETF9DRGNhcHMuQ2xvc2UgPSBTRExfU1lTX0NEQ2xvc2U7Ci0KLQkvKiBMb29rIGluIHRoZSBlbnZpcm9ubWVudCBmb3Igb3VyIENELVJPTSBkcml2ZSBsaXN0ICovCi0JU0RMY2Ryb20gPSBTRExfZ2V0ZW52KCJTRExfQ0RST00iKTsJLyogJzonIHNlcGFyYXRlZCBsaXN0IG9mIGRldmljZXMgKi8KLQlpZiAoIFNETGNkcm9tICE9IE5VTEwgKSB7Ci0JCWNoYXIgKmNkcGF0aCwgKmRlbGltOwotCQlzaXplX3QgbGVuID0gU0RMX3N0cmxlbihTRExjZHJvbSkrMTsKLQkJY2RwYXRoID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIGxlbik7Ci0JCWlmICggY2RwYXRoICE9IE5VTEwgKSB7Ci0JCQlTRExfc3RybGNweShjZHBhdGgsIFNETGNkcm9tLCBsZW4pOwotCQkJU0RMY2Ryb20gPSBjZHBhdGg7Ci0JCQlkbyB7Ci0JCQkJZGVsaW0gPSBTRExfc3RyY2hyKFNETGNkcm9tLCAnOicpOwotCQkJCWlmICggZGVsaW0gKSB7Ci0JCQkJCSpkZWxpbSsrID0gJ1wwJzsKLQkJCQl9Ci0JCQkJaWYgKCBDaGVja0RyaXZlKFNETGNkcm9tLCAmc3RidWYpID4gMCApIHsKLQkJCQkJQWRkRHJpdmUoU0RMY2Ryb20sICZzdGJ1Zik7Ci0JCQkJfQotCQkJCWlmICggZGVsaW0gKSB7Ci0JCQkJCVNETGNkcm9tID0gZGVsaW07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU0RMY2Ryb20gPSBOVUxMOwotCQkJCX0KLQkJCX0gd2hpbGUgKCBTRExjZHJvbSApOwotCQkJU0RMX3N0YWNrX2ZyZWUoY2RwYXRoKTsKLQkJfQotCi0JCS8qIElmIHdlIGZvdW5kIG91ciBkcml2ZXMsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCi0JCWlmICggU0RMX251bWNkcyA+IDAgKSB7Ci0JCQlyZXR1cm4oMCk7Ci0JCX0KLQl9Ci0KLQkvKiBTY2FuIHRoZSBzeXN0ZW0gZm9yIENELVJPTSBkcml2ZXMgKi8KLQlmb3IgKCBpPTA7IGNoZWNrbGlzdFtpXTsgKytpICkgewotCQlpZiAoIGNoZWNrbGlzdFtpXVswXSA9PSAnPycgKSB7Ci0JCQljaGFyICppbnNlcnQ7Ci0JCQlleGlzdHMgPSAxOwotCQkJZm9yICggaj1jaGVja2xpc3RbaV1bMV07IGV4aXN0czsgKytqICkgewotCQkJCVNETF9zbnByaW50Zihkcml2ZSwgU0RMX2FycmF5c2l6ZShkcml2ZSksICIvZGV2LyVzYyIsICZjaGVja2xpc3RbaV1bM10pOwotCQkJCWluc2VydCA9IFNETF9zdHJjaHIoZHJpdmUsICc/Jyk7Ci0JCQkJaWYgKCBpbnNlcnQgIT0gTlVMTCApIHsKLQkJCQkJKmluc2VydCA9IGo7Ci0JCQkJfQotCQkJCXN3aXRjaCAoQ2hlY2tEcml2ZShkcml2ZSwgJnN0YnVmKSkgewotCQkJCQkvKiBEcml2ZSBleGlzdHMgYW5kIGlzIGEgQ0QtUk9NICovCi0JCQkJCWNhc2UgMToKLQkJCQkJCUFkZERyaXZlKGRyaXZlLCAmc3RidWYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCS8qIERyaXZlIGV4aXN0cywgYnV0IGlzbid0IGEgQ0QtUk9NICovCi0JCQkJCWNhc2UgMDoKLQkJCQkJCWJyZWFrOwotCQkJCQkvKiBEcml2ZSBkb2Vzbid0IGV4aXN0ICovCi0JCQkJCWNhc2UgLTE6Ci0JCQkJCQlleGlzdHMgPSAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIi9kZXYvJXMiLCBjaGVja2xpc3RbaV0pOwotCQkJaWYgKCBDaGVja0RyaXZlKGRyaXZlLCAmc3RidWYpID4gMCApIHsKLQkJCQlBZGREcml2ZShkcml2ZSwgJnN0YnVmKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIEdlbmVyYWwgaW9jdGwoKSBDRC1ST00gY29tbWFuZCBmdW5jdGlvbiAqLwotc3RhdGljIGludCBTRExfU1lTX0NEaW9jdGwoaW50IGlkLCBpbnQgY29tbWFuZCwgdm9pZCAqYXJnKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBpb2N0bChpZCwgY29tbWFuZCwgYXJnKTsKLQlpZiAoIHJldHZhbCA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiaW9jdGwoKSBlcnJvcjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCX0KLQlyZXR1cm4ocmV0dmFsKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKLXsKLQlyZXR1cm4oU0RMX2NkbGlzdFtkcml2ZV0pOwotfQotCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSkKLXsKLQlyZXR1cm4ob3BlbihTRExfY2RsaXN0W2RyaXZlXSwgKE9fUkRPTkxZfE9fRVhDTHxPX05PTkJMT0NLKSwgMCkpOwotfQotCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSkKLXsKLQlzdHJ1Y3QgaW9jX3RvY19oZWFkZXIgdG9jOwotCWludCBpLCBva2F5OwotCXN0cnVjdCBpb2NfcmVhZF90b2NfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGNkX3RvY19lbnRyeSBkYXRhOwotCi0Jb2theSA9IDA7Ci0JaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRElPUkVBRFRPQ0hFQURFUiwgJnRvYykgPT0gMCApIHsKLQkJY2Ryb20tPm51bXRyYWNrcyA9IHRvYy5lbmRpbmdfdHJhY2stdG9jLnN0YXJ0aW5nX3RyYWNrKzE7Ci0JCWlmICggY2Ryb20tPm51bXRyYWNrcyA+IFNETF9NQVhfVFJBQ0tTICkgewotCQkJY2Ryb20tPm51bXRyYWNrcyA9IFNETF9NQVhfVFJBQ0tTOwotCQl9Ci0JCS8qIFJlYWQgYWxsIHRoZSB0cmFjayBUT0MgZW50cmllcyAqLwotCQlmb3IgKCBpPTA7IGk8PWNkcm9tLT5udW10cmFja3M7ICsraSApIHsKLQkJCWlmICggaSA9PSBjZHJvbS0+bnVtdHJhY2tzICkgewotCQkJCWNkcm9tLT50cmFja1tpXS5pZCA9IDB4QUE7IC8qIENEUk9NX0xFQURPVVQgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gdG9jLnN0YXJ0aW5nX3RyYWNrK2k7Ci0JCQl9Ci0JCQllbnRyeS5zdGFydGluZ190cmFjayA9IGNkcm9tLT50cmFja1tpXS5pZDsKLQkJCWVudHJ5LmFkZHJlc3NfZm9ybWF0ID0gQ0RfTVNGX0ZPUk1BVDsKLQkJCWVudHJ5LmRhdGFfbGVuID0gc2l6ZW9mKGRhdGEpOwotCQkJZW50cnkuZGF0YSA9ICZkYXRhOwotCQkJaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRElPUkVBRFRPQ0VOVFJZUywKLQkJCQkJCQkJJmVudHJ5KSA8IDAgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gZGF0YS5jb250cm9sOwotCQkJCWNkcm9tLT50cmFja1tpXS5vZmZzZXQgPSBNU0ZfVE9fRlJBTUVTKAotCQkJCQkJZGF0YS5hZGRyLm1zZi5taW51dGUsCi0JCQkJCQlkYXRhLmFkZHIubXNmLnNlY29uZCwKLQkJCQkJCWRhdGEuYWRkci5tc2YuZnJhbWUpOwotCQkJCWNkcm9tLT50cmFja1tpXS5sZW5ndGggPSAwOwotCQkJCWlmICggaSA+IDAgKSB7Ci0JCQkJCWNkcm9tLT50cmFja1tpLTFdLmxlbmd0aCA9Ci0JCQkJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0LQotCQkJCQkJY2Ryb20tPnRyYWNrW2ktMV0ub2Zmc2V0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIGkgPT0gKGNkcm9tLT5udW10cmFja3MrMSkgKSB7Ci0JCQlva2F5ID0gMTsKLQkJfQotCX0KLQlyZXR1cm4ob2theSA/IDAgOiAtMSk7Ci19Ci0KLS8qIEdldCBDRC1ST00gc3RhdHVzICovCi1zdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKQotewotCUNEc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgaW9jX3RvY19oZWFkZXIgdG9jOwotCXN0cnVjdCBpb2NfcmVhZF9zdWJjaGFubmVsIGluZm87Ci0Jc3RydWN0IGNkX3N1Yl9jaGFubmVsX2luZm8gZGF0YTsKLQotCWluZm8uYWRkcmVzc19mb3JtYXQgPSBDRF9NU0ZfRk9STUFUOwotCWluZm8uZGF0YV9mb3JtYXQgPSBDRF9DVVJSRU5UX1BPU0lUSU9OOwotCWluZm8udHJhY2sgPSAwOwotCWluZm8uZGF0YV9sZW4gPSBzaXplb2YoZGF0YSk7Ci0JaW5mby5kYXRhID0gJmRhdGE7Ci0JaWYgKCBpb2N0bChjZHJvbS0+aWQsIENESU9DUkVBRFNVQkNIQU5ORUwsICZpbmZvKSA8IDAgKSB7Ci0JCWlmICggRVJSTk9fVFJBWUVNUFRZKGVycm5vKSApIHsKLQkJCXN0YXR1cyA9IENEX1RSQVlFTVBUWTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IENEX0VSUk9SOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChkYXRhLmhlYWRlci5hdWRpb19zdGF0dXMpIHsKLQkJCWNhc2UgQ0RfQVNfQVVESU9fSU5WQUxJRDoKLQkJCWNhc2UgQ0RfQVNfTk9fU1RBVFVTOgotCQkJCS8qIFRyeSB0byBkZXRlcm1pbmUgaWYgdGhlcmUncyBhIENEIGF2YWlsYWJsZSAqLwotCQkJCWlmIChpb2N0bChjZHJvbS0+aWQsQ0RJT1JFQURUT0NIRUFERVIsJnRvYyk9PTApCi0JCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJZWxzZQotCQkJCQlzdGF0dXMgPSBDRF9UUkFZRU1QVFk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENEX0FTX1BMQVlfQ09NUExFVEVEOgotCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENEX0FTX1BMQVlfSU5fUFJPR1JFU1M6Ci0JCQkJc3RhdHVzID0gQ0RfUExBWUlORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0RfQVNfUExBWV9QQVVTRUQ6Ci0JCQkJc3RhdHVzID0gQ0RfUEFVU0VEOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdGF0dXMgPSBDRF9FUlJPUjsKLQkJCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIHBvc2l0aW9uICkgewotCQlpZiAoIHN0YXR1cyA9PSBDRF9QTEFZSU5HIHx8IChzdGF0dXMgPT0gQ0RfUEFVU0VEKSApIHsKLQkJCSpwb3NpdGlvbiA9IE1TRl9UT19GUkFNRVMoCi0JCQkJCWRhdGEud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5taW51dGUsCi0JCQkJCWRhdGEud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5zZWNvbmQsCi0JCQkJCWRhdGEud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5mcmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQkqcG9zaXRpb24gPSAwOwotCQl9Ci0JfQotCXJldHVybihzdGF0dXMpOwotfQotCi0vKiBTdGFydCBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaW9jX3BsYXlfbXNmIHBsYXl0aW1lOwotCi0JRlJBTUVTX1RPX01TRihzdGFydCwKLQkJJnBsYXl0aW1lLnN0YXJ0X20sICZwbGF5dGltZS5zdGFydF9zLCAmcGxheXRpbWUuc3RhcnRfZik7Ci0JRlJBTUVTX1RPX01TRihzdGFydCtsZW5ndGgsCi0JCSZwbGF5dGltZS5lbmRfbSwgJnBsYXl0aW1lLmVuZF9zLCAmcGxheXRpbWUuZW5kX2YpOwotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiVHJ5aW5nIHRvIHBsYXkgZnJvbSAlZDolZDolZCB0byAlZDolZDolZFxuIiwKLQlwbGF5dGltZS5jZG1zZl9taW4wLCBwbGF5dGltZS5jZG1zZl9zZWMwLCBwbGF5dGltZS5jZG1zZl9mcmFtZTAsCi0JcGxheXRpbWUuY2Rtc2ZfbWluMSwgcGxheXRpbWUuY2Rtc2Zfc2VjMSwgcGxheXRpbWUuY2Rtc2ZfZnJhbWUxKTsKLSNlbmRpZgotCWlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NTVEFSVCwgMCk7Ci0JcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9DUExBWU1TRiwgJnBsYXl0aW1lKSk7Ci19Ci0KLS8qIFBhdXNlIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pCi17Ci0JcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9DUEFVU0UsIDApKTsKLX0KLQotLyogUmVzdW1lIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKQotewotCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRElPQ1JFU1VNRSwgMCkpOwotfQotCi0vKiBTdG9wIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NTVE9QLCAwKSk7Ci19Ci0KLS8qIEVqZWN0IHRoZSBDRC1ST00gKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pCi17Ci0JcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9DRUpFQ1QsIDApKTsKLX0KLQotLyogQ2xvc2UgdGhlIENELVJPTSBoYW5kbGUgKi8KLXN0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKQotewotCWNsb3NlKGNkcm9tLT5pZCk7Ci19Ci0KLXZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWlmICggU0RMX251bWNkcyA+IDAgKSB7Ci0JCWZvciAoIGk9MDsgaTxTRExfbnVtY2RzOyArK2kgKSB7Ci0JCQlTRExfZnJlZShTRExfY2RsaXN0W2ldKTsKLQkJfQotCQlTRExfbnVtY2RzID0gMDsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBTRExfQ0RST01fRlJFRUJTRCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9saW51eC9TRExfc3lzY2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbGludXgvU0RMX3N5c2Nkcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MzViMjguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9saW51eC9TRExfc3lzY2Ryb20uYworKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9DRFJPTV9MSU5VWAotCi0vKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+CS8qIEZvciBzdHJlcnJvcigpICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaWZkZWYgX19MSU5VWF9fCi0jaWZkZWYgSEFWRV9MSU5VWF9WRVJTSU9OX0gKLS8qIGxpbnV4IDIuNi45IHdvcmthcm91bmQgKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID09IEtFUk5FTF9WRVJTSU9OKDIsNiw5KQotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2RlZmluZSBfX2xlNjQgX191NjQKLSNkZWZpbmUgX19sZTMyIF9fdTMyCi0jZGVmaW5lIF9fbGUxNiBfX3UxNgotI2RlZmluZSBfX2JlNjQgX191NjQKLSNkZWZpbmUgX19iZTMyIF9fdTMyCi0jZGVmaW5lIF9fYmUxNiBfX3UxNgotI2VuZGlmIC8qIGxpbnV4IDIuNi45IHdvcmthcm91bmQgKi8KLSNlbmRpZiAvKiBIQVZFX0xJTlVYX1ZFUlNJT05fSCAqLwotI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+Ci0jZW5kaWYKLSNpZmRlZiBfX1NWUjQKLSNpbmNsdWRlIDxzeXMvY2Rpby5oPgotI2VuZGlmCi0KLS8qIERlZmluZSB0aGlzIHRvIHVzZSB0aGUgYWx0ZXJuYXRpdmUgZ2V0bW50ZW50KCkgY29kZSAqLwotI2lmbmRlZiBfX1NWUjQKLSNkZWZpbmUgVVNFX01OVEVOVAotI2VuZGlmCi0KLSNpZmRlZiBVU0VfTU5URU5UCi0jaWYgZGVmaW5lZChfX1VTTENfXykKLSNpbmNsdWRlIDxzeXMvbW50ZW50Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPG1udGVudC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1BBVEhfTU5UVEFCCi0jaWZkZWYgTU5UVEFCCi0jZGVmaW5lIF9QQVRIX01OVFRBQglNTlRUQUIKLSNlbHNlCi0jZGVmaW5lIF9QQVRIX01OVFRBQgkiL2V0Yy9mc3RhYiIKLSNlbmRpZgotI2VuZGlmIC8qICFfUEFUSF9NTlRUQUIgKi8KLQotI2lmbmRlZiBfUEFUSF9NT1VOVEVECi0jZGVmaW5lIF9QQVRIX01PVU5URUQJIi9ldGMvbXRhYiIKLSNlbmRpZiAvKiAhX1BBVEhfTU9VTlRFRCAqLwotCi0jaWZuZGVmIE1OVFRZUEVfQ0RST00KLSNkZWZpbmUgTU5UVFlQRV9DRFJPTQkiaXNvOTY2MCIKLSNlbmRpZgotI2lmbmRlZiBNTlRUWVBFX1NVUEVSCi0jZGVmaW5lIE1OVFRZUEVfU1VQRVIJInN1cGVybW91bnQiCi0jZW5kaWYKLSNlbmRpZiAvKiBVU0VfTU5URU5UICovCi0KLSNpbmNsdWRlICJTRExfY2Ryb20uaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKLQotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQ0QtUk9NIGRyaXZlcyB3ZSdsbCBkZXRlY3QgKi8KLSNkZWZpbmUgTUFYX0RSSVZFUwkxNgkKLQotLyogQSBsaXN0IG9mIGF2YWlsYWJsZSBDRC1ST00gZHJpdmVzICovCi1zdGF0aWMgY2hhciAqU0RMX2NkbGlzdFtNQVhfRFJJVkVTXTsKLXN0YXRpYyBkZXZfdCBTRExfY2Rtb2RlW01BWF9EUklWRVNdOwotCi0vKiBUaGUgc3lzdGVtLWRlcGVuZGVudCBDRCBjb250cm9sIGZ1bmN0aW9ucyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pOwotc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pOwotCi0vKiBTb21lIGlvY3RsKCkgZXJybm8gdmFsdWVzIHdoaWNoIG9jY3VyIHdoZW4gdGhlIHRyYXkgaXMgZW1wdHkgKi8KLSNpZm5kZWYgRU5PTUVESVVNCi0jZGVmaW5lIEVOT01FRElVTSBFTk9FTlQKLSNlbmRpZgotI2RlZmluZSBFUlJOT19UUkFZRU1QVFkoZXJybm8pCVwKLQkoKGVycm5vID09IEVJTykgICAgfHwgKGVycm5vID09IEVOT0VOVCkgfHwgXAotCSAoZXJybm8gPT0gRUlOVkFMKSB8fCAoZXJybm8gPT0gRU5PTUVESVVNKSkKLQotLyogQ2hlY2sgYSBkcml2ZSB0byBzZWUgaWYgaXQgaXMgYSBDRC1ST00gKi8KLXN0YXRpYyBpbnQgQ2hlY2tEcml2ZShjaGFyICpkcml2ZSwgY2hhciAqbW50dHlwZSwgc3RydWN0IHN0YXQgKnN0YnVmKQotewotCWludCBpc19jZCwgY2RmZDsKLQlzdHJ1Y3QgY2Ryb21fc3ViY2hubCBpbmZvOwotCi0JLyogSWYgaXQgZG9lc24ndCBleGlzdCwgcmV0dXJuIC0xICovCi0JaWYgKCBzdGF0KGRyaXZlLCBzdGJ1ZikgPCAwICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIElmIGl0IGRvZXMgZXhpc3QsIHZlcmlmeSB0aGF0IGl0J3MgYW4gYXZhaWxhYmxlIENELVJPTSAqLwotCWlzX2NkID0gMDsKLQlpZiAoIFNfSVNDSFIoc3RidWYtPnN0X21vZGUpIHx8IFNfSVNCTEsoc3RidWYtPnN0X21vZGUpICkgewotCQljZGZkID0gb3Blbihkcml2ZSwgKE9fUkRPTkxZfE9fTk9OQkxPQ0spLCAwKTsKLQkJaWYgKCBjZGZkID49IDAgKSB7Ci0JCQlpbmZvLmNkc2NfZm9ybWF0ID0gQ0RST01fTVNGOwotCQkJLyogVW5kZXIgTGludXgsIEVJTyBvY2N1cnMgd2hlbiBhIGRpc2sgaXMgbm90IHByZXNlbnQuCi0JCQkgKi8KLQkJCWlmICggKGlvY3RsKGNkZmQsIENEUk9NU1VCQ0hOTCwgJmluZm8pID09IDApIHx8Ci0JCQkJCQlFUlJOT19UUkFZRU1QVFkoZXJybm8pICkgewotCQkJCWlzX2NkID0gMTsKLQkJCX0KLQkJCWNsb3NlKGNkZmQpOwotCQl9Ci0jaWZkZWYgVVNFX01OVEVOVAotCQkvKiBFdmVuIGlmIHdlIGNhbid0IHJlYWQgaXQsIGl0IG1pZ2h0IGJlIG1vdW50ZWQgKi8KLQkJZWxzZSBpZiAoIG1udHR5cGUgJiYgKFNETF9zdHJjbXAobW50dHlwZSwgTU5UVFlQRV9DRFJPTSkgPT0gMCkgKSB7Ci0JCQlpc19jZCA9IDE7Ci0JCX0KLSNlbmRpZgotCX0KLQlyZXR1cm4oaXNfY2QpOwotfQotCi0vKiBBZGQgYSBDRC1ST00gZHJpdmUgdG8gb3VyIGxpc3Qgb2YgdmFsaWQgZHJpdmVzICovCi1zdGF0aWMgdm9pZCBBZGREcml2ZShjaGFyICpkcml2ZSwgc3RydWN0IHN0YXQgKnN0YnVmKQotewotCWludCBpOwotCi0JaWYgKCBTRExfbnVtY2RzIDwgTUFYX0RSSVZFUyApIHsKLQkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGl0J3Mgbm90IGFscmVhZHkgaW4gb3VyIGxpc3QuCi0JIAkgICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBzZWUgYSBkcml2ZSB2aWEgc3ltYm9saWMgbGluay4KLQkJICovCi0JCWZvciAoIGk9MDsgaTxTRExfbnVtY2RzOyArK2kgKSB7Ci0JCQlpZiAoIHN0YnVmLT5zdF9yZGV2ID09IFNETF9jZG1vZGVbaV0gKSB7Ci0jaWZkZWYgREVCVUdfQ0RST00KLSAgZnByaW50ZihzdGRlcnIsICJEdXBsaWNhdGUgZHJpdmUgZGV0ZWN0ZWQ6ICVzID09ICVzXG4iLCBkcml2ZSwgU0RMX2NkbGlzdFtpXSk7Ci0jZW5kaWYKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvKiBBZGQgdGhpcyBkcml2ZSB0byBvdXIgbGlzdCAqLwotCQlpID0gU0RMX251bWNkczsKLQkJU0RMX2NkbGlzdFtpXSA9IFNETF9zdHJkdXAoZHJpdmUpOwotCQlpZiAoIFNETF9jZGxpc3RbaV0gPT0gTlVMTCApIHsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVNETF9jZG1vZGVbaV0gPSBzdGJ1Zi0+c3RfcmRldjsKLQkJKytTRExfbnVtY2RzOwotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiQWRkZWQgQ0QtUk9NIGRyaXZlOiAlc1xuIiwgZHJpdmUpOwotI2VuZGlmCi0JfQotfQotCi0jaWZkZWYgVVNFX01OVEVOVAotc3RhdGljIHZvaWQgQ2hlY2tNb3VudHMoY29uc3QgY2hhciAqbXRhYikKLXsKLQlGSUxFICptbnRmcDsKLQlzdHJ1Y3QgbW50ZW50ICptbnRlbnQ7Ci0Jc3RydWN0IHN0YXQgc3RidWY7Ci0KLQltbnRmcCA9IHNldG1udGVudChtdGFiLCAiciIpOwotCWlmICggbW50ZnAgIT0gTlVMTCApIHsKLQkJY2hhciAqdG1wOwotCQljaGFyICptbnRfdHlwZTsKLQkJc2l6ZV90IG1udF90eXBlX2xlbjsKLQkJY2hhciAqbW50X2RldjsKLQkJc2l6ZV90IG1udF9kZXZfbGVuOwotCi0JCXdoaWxlICggKG1udGVudD1nZXRtbnRlbnQobW50ZnApKSAhPSBOVUxMICkgewotCQkJbW50X3R5cGVfbGVuID0gU0RMX3N0cmxlbihtbnRlbnQtPm1udF90eXBlKSArIDE7Ci0JCQltbnRfdHlwZSA9IFNETF9zdGFja19hbGxvYyhjaGFyLCBtbnRfdHlwZV9sZW4pOwotCQkJaWYgKG1udF90eXBlID09IE5VTEwpCi0JCQkJY29udGludWU7ICAvKiBtYXliZSB5b3UnbGwgZ2V0IGx1Y2t5IG5leHQgdGltZS4gKi8KLQotCQkJbW50X2Rldl9sZW4gPSBTRExfc3RybGVuKG1udGVudC0+bW50X2ZzbmFtZSkgKyAxOwotCQkJbW50X2RldiA9IFNETF9zdGFja19hbGxvYyhjaGFyLCBtbnRfZGV2X2xlbik7Ci0JCQlpZiAobW50X2RldiA9PSBOVUxMKSB7Ci0JCQkJU0RMX3N0YWNrX2ZyZWUobW50X3R5cGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTRExfc3RybGNweShtbnRfdHlwZSwgbW50ZW50LT5tbnRfdHlwZSwgbW50X3R5cGVfbGVuKTsKLQkJCVNETF9zdHJsY3B5KG1udF9kZXYsIG1udGVudC0+bW50X2ZzbmFtZSwgbW50X2Rldl9sZW4pOwotCi0JCQkvKiBIYW5kbGUgInN1cGVybW91bnQiIGZpbGVzeXN0ZW0gbW91bnRzICovCi0JCQlpZiAoIFNETF9zdHJjbXAobW50X3R5cGUsIE1OVFRZUEVfU1VQRVIpID09IDAgKSB7Ci0JCQkJdG1wID0gU0RMX3N0cnN0cihtbnRlbnQtPm1udF9vcHRzLCAiZnM9Iik7Ci0JCQkJaWYgKCB0bXAgKSB7Ci0JCQkJCVNETF9zdGFja19mcmVlKG1udF90eXBlKTsKLQkJCQkJbW50X3R5cGUgPSBTRExfc3RyZHVwKHRtcCArIFNETF9zdHJsZW4oImZzPSIpKTsKLQkJCQkJaWYgKCBtbnRfdHlwZSApIHsKLQkJCQkJCXRtcCA9IFNETF9zdHJjaHIobW50X3R5cGUsICcsJyk7Ci0JCQkJCQlpZiAoIHRtcCApIHsKLQkJCQkJCQkqdG1wID0gJ1wwJzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl0bXAgPSBTRExfc3Ryc3RyKG1udGVudC0+bW50X29wdHMsICJkZXY9Iik7Ci0JCQkJaWYgKCB0bXAgKSB7Ci0JCQkJCVNETF9zdGFja19mcmVlKG1udF9kZXYpOwotCQkJCQltbnRfZGV2ID0gU0RMX3N0cmR1cCh0bXAgKyBTRExfc3RybGVuKCJkZXY9IikpOwotCQkJCQlpZiAoIG1udF9kZXYgKSB7Ci0JCQkJCQl0bXAgPSBTRExfc3RyY2hyKG1udF9kZXYsICcsJyk7Ci0JCQkJCQlpZiAoIHRtcCApIHsKLQkJCQkJCQkqdG1wID0gJ1wwJzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICggU0RMX3N0cmNtcChtbnRfdHlwZSwgTU5UVFlQRV9DRFJPTSkgPT0gMCApIHsKLSNpZmRlZiBERUJVR19DRFJPTQotICBmcHJpbnRmKHN0ZGVyciwgIkNoZWNraW5nIG1vdW50IHBhdGggZnJvbSAlczogJXMgbW91bnRlZCBvbiAlcyBvZiAlc1xuIiwKLQltdGFiLCBtbnRfZGV2LCBtbnRlbnQtPm1udF9kaXIsIG1udF90eXBlKTsKLSNlbmRpZgotCQkJCWlmIChDaGVja0RyaXZlKG1udF9kZXYsIG1udF90eXBlLCAmc3RidWYpID4gMCkgewotCQkJCQlBZGREcml2ZShtbnRfZGV2LCAmc3RidWYpOwotCQkJCX0KLQkJCX0KLQkJCVNETF9zdGFja19mcmVlKG1udF9kZXYpOwotCQkJU0RMX3N0YWNrX2ZyZWUobW50X3R5cGUpOwotCQl9Ci0JCWVuZG1udGVudChtbnRmcCk7Ci0JfQotfQotI2VuZGlmIC8qIFVTRV9NTlRFTlQgKi8KLQotaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQotewotCS8qIGNoZWNrbGlzdDogL2Rldi9jZHJvbSwgL2Rldi9oZD8sIC9kZXYvc2NkPyAvZGV2L3NyPyAqLwotCXN0YXRpYyBjaGFyICpjaGVja2xpc3RbXSA9IHsKLQkJImNkcm9tIiwgIj9hIGhkPyIsICI/MCBzY2Q/IiwgIj8wIHNyPyIsIE5VTEwKLQl9OwotCWNoYXIgKlNETGNkcm9tOwotCWludCBpLCBqLCBleGlzdHM7Ci0JY2hhciBkcml2ZVszMl07Ci0Jc3RydWN0IHN0YXQgc3RidWY7Ci0KLQkvKiBGaWxsIGluIG91ciBkcml2ZXIgY2FwYWJpbGl0aWVzICovCi0JU0RMX0NEY2Fwcy5OYW1lID0gU0RMX1NZU19DRE5hbWU7Ci0JU0RMX0NEY2Fwcy5PcGVuID0gU0RMX1NZU19DRE9wZW47Ci0JU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOwotCVNETF9DRGNhcHMuU3RhdHVzID0gU0RMX1NZU19DRFN0YXR1czsKLQlTRExfQ0RjYXBzLlBsYXkgPSBTRExfU1lTX0NEUGxheTsKLQlTRExfQ0RjYXBzLlBhdXNlID0gU0RMX1NZU19DRFBhdXNlOwotCVNETF9DRGNhcHMuUmVzdW1lID0gU0RMX1NZU19DRFJlc3VtZTsKLQlTRExfQ0RjYXBzLlN0b3AgPSBTRExfU1lTX0NEU3RvcDsKLQlTRExfQ0RjYXBzLkVqZWN0ID0gU0RMX1NZU19DREVqZWN0OwotCVNETF9DRGNhcHMuQ2xvc2UgPSBTRExfU1lTX0NEQ2xvc2U7Ci0KLQkvKiBMb29rIGluIHRoZSBlbnZpcm9ubWVudCBmb3Igb3VyIENELVJPTSBkcml2ZSBsaXN0ICovCi0JU0RMY2Ryb20gPSBTRExfZ2V0ZW52KCJTRExfQ0RST00iKTsJLyogJzonIHNlcGFyYXRlZCBsaXN0IG9mIGRldmljZXMgKi8KLQlpZiAoIFNETGNkcm9tICE9IE5VTEwgKSB7Ci0JCWNoYXIgKmNkcGF0aCwgKmRlbGltOwotCQlzaXplX3QgbGVuID0gU0RMX3N0cmxlbihTRExjZHJvbSkrMTsKLQkJY2RwYXRoID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIGxlbik7Ci0JCWlmICggY2RwYXRoICE9IE5VTEwgKSB7Ci0JCQlTRExfc3RybGNweShjZHBhdGgsIFNETGNkcm9tLCBsZW4pOwotCQkJU0RMY2Ryb20gPSBjZHBhdGg7Ci0JCQlkbyB7Ci0JCQkJZGVsaW0gPSBTRExfc3RyY2hyKFNETGNkcm9tLCAnOicpOwotCQkJCWlmICggZGVsaW0gKSB7Ci0JCQkJCSpkZWxpbSsrID0gJ1wwJzsKLQkJCQl9Ci0jaWZkZWYgREVCVUdfQ0RST00KLSAgZnByaW50ZihzdGRlcnIsICJDaGVja2luZyBDRC1ST00gZHJpdmUgZnJvbSBTRExfQ0RST006ICVzXG4iLCBTRExjZHJvbSk7Ci0jZW5kaWYKLQkJCQlpZiAoIENoZWNrRHJpdmUoU0RMY2Ryb20sIE5VTEwsICZzdGJ1ZikgPiAwICkgewotCQkJCQlBZGREcml2ZShTRExjZHJvbSwgJnN0YnVmKTsKLQkJCQl9Ci0JCQkJaWYgKCBkZWxpbSApIHsKLQkJCQkJU0RMY2Ryb20gPSBkZWxpbTsKLQkJCQl9IGVsc2UgewotCQkJCQlTRExjZHJvbSA9IE5VTEw7Ci0JCQkJfQotCQkJfSB3aGlsZSAoIFNETGNkcm9tICk7Ci0JCQlTRExfc3RhY2tfZnJlZShjZHBhdGgpOwotCQl9Ci0KLQkJLyogSWYgd2UgZm91bmQgb3VyIGRyaXZlcywgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gKi8KLQkJaWYgKCBTRExfbnVtY2RzID4gMCApIHsKLQkJCXJldHVybigwKTsKLQkJfQotCX0KLQotI2lmZGVmIFVTRV9NTlRFTlQKLQkvKiBDaGVjayAvZGV2L2Nkcm9tIGZpcnN0IDotKSAqLwotCWlmIChDaGVja0RyaXZlKCIvZGV2L2Nkcm9tIiwgTlVMTCwgJnN0YnVmKSA+IDApIHsKLQkJQWRkRHJpdmUoIi9kZXYvY2Ryb20iLCAmc3RidWYpOwotCX0KLQotCS8qIE5vdyBjaGVjayB0aGUgY3VycmVudGx5IG1vdW50ZWQgQ0QgZHJpdmVzICovCi0JQ2hlY2tNb3VudHMoX1BBVEhfTU9VTlRFRCk7Ci0KLQkvKiBGaW5hbGx5IGNoZWNrIHBvc3NpYmxlIG1vdW50YWJsZSBkcml2ZXMgaW4gL2V0Yy9mc3RhYiAqLwotCUNoZWNrTW91bnRzKF9QQVRIX01OVFRBQik7Ci0KLQkvKiBJZiB3ZSBmb3VuZCBvdXIgZHJpdmVzLCB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyAqLwotCWlmICggU0RMX251bWNkcyA+IDAgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0jZW5kaWYgLyogVVNFX01OVEVOVCAqLwotCi0JLyogU2NhbiB0aGUgc3lzdGVtIGZvciBDRC1ST00gZHJpdmVzLgotCSAgIE5vdCBhbHdheXMgMTAwJSByZWxpYWJsZSwgc28gdXNlIHRoZSBVU0VfTU5URU5UIGNvZGUgYWJvdmUgZmlyc3QuCi0JICovCi0JZm9yICggaT0wOyBjaGVja2xpc3RbaV07ICsraSApIHsKLQkJaWYgKCBjaGVja2xpc3RbaV1bMF0gPT0gJz8nICkgewotCQkJY2hhciAqaW5zZXJ0OwotCQkJZXhpc3RzID0gMTsKLQkJCWZvciAoIGo9Y2hlY2tsaXN0W2ldWzFdOyBleGlzdHM7ICsraiApIHsKLQkJCQlTRExfc25wcmludGYoZHJpdmUsIFNETF9hcnJheXNpemUoZHJpdmUpLCAiL2Rldi8lcyIsICZjaGVja2xpc3RbaV1bM10pOwotCQkJCWluc2VydCA9IFNETF9zdHJjaHIoZHJpdmUsICc/Jyk7Ci0JCQkJaWYgKCBpbnNlcnQgIT0gTlVMTCApIHsKLQkJCQkJKmluc2VydCA9IGo7Ci0JCQkJfQotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiQ2hlY2tpbmcgcG9zc2libGUgQ0QtUk9NIGRyaXZlOiAlc1xuIiwgZHJpdmUpOwotI2VuZGlmCi0JCQkJc3dpdGNoIChDaGVja0RyaXZlKGRyaXZlLCBOVUxMLCAmc3RidWYpKSB7Ci0JCQkJCS8qIERyaXZlIGV4aXN0cyBhbmQgaXMgYSBDRC1ST00gKi8KLQkJCQkJY2FzZSAxOgotCQkJCQkJQWRkRHJpdmUoZHJpdmUsICZzdGJ1Zik7Ci0JCQkJCQlicmVhazsKLQkJCQkJLyogRHJpdmUgZXhpc3RzLCBidXQgaXNuJ3QgYSBDRC1ST00gKi8KLQkJCQkJY2FzZSAwOgotCQkJCQkJYnJlYWs7Ci0JCQkJCS8qIERyaXZlIGRvZXNuJ3QgZXhpc3QgKi8KLQkJCQkJY2FzZSAtMToKLQkJCQkJCWV4aXN0cyA9IDA7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTRExfc25wcmludGYoZHJpdmUsIFNETF9hcnJheXNpemUoZHJpdmUpLCAiL2Rldi8lcyIsIGNoZWNrbGlzdFtpXSk7Ci0jaWZkZWYgREVCVUdfQ0RST00KLSAgZnByaW50ZihzdGRlcnIsICJDaGVja2luZyBwb3NzaWJsZSBDRC1ST00gZHJpdmU6ICVzXG4iLCBkcml2ZSk7Ci0jZW5kaWYKLQkJCWlmICggQ2hlY2tEcml2ZShkcml2ZSwgTlVMTCwgJnN0YnVmKSA+IDAgKSB7Ci0JCQkJQWRkRHJpdmUoZHJpdmUsICZzdGJ1Zik7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuKDApOwotfQotCi0vKiBHZW5lcmFsIGlvY3RsKCkgQ0QtUk9NIGNvbW1hbmQgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRGlvY3RsKGludCBpZCwgaW50IGNvbW1hbmQsIHZvaWQgKmFyZykKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gaW9jdGwoaWQsIGNvbW1hbmQsIGFyZyk7Ci0JaWYgKCByZXR2YWwgPCAwICkgewotCQlTRExfU2V0RXJyb3IoImlvY3RsKCkgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0JcmV0dXJuKHJldHZhbCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpCi17Ci0JcmV0dXJuKFNETF9jZGxpc3RbZHJpdmVdKTsKLX0KLQotc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpCi17Ci0JcmV0dXJuKG9wZW4oU0RMX2NkbGlzdFtkcml2ZV0sIChPX1JET05MWXxPX05PTkJMT0NLKSwgMCkpOwotfQotCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSkKLXsKLQlzdHJ1Y3QgY2Ryb21fdG9jaGRyIHRvYzsKLQlpbnQgaSwgb2theTsKLQlzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgZW50cnk7Ci0KLQlva2F5ID0gMDsKLQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENEUk9NUkVBRFRPQ0hEUiwgJnRvYykgPT0gMCApIHsKLQkJY2Ryb20tPm51bXRyYWNrcyA9IHRvYy5jZHRoX3RyazEtdG9jLmNkdGhfdHJrMCsxOwotCQlpZiAoIGNkcm9tLT5udW10cmFja3MgPiBTRExfTUFYX1RSQUNLUyApIHsKLQkJCWNkcm9tLT5udW10cmFja3MgPSBTRExfTUFYX1RSQUNLUzsKLQkJfQotCQkvKiBSZWFkIGFsbCB0aGUgdHJhY2sgVE9DIGVudHJpZXMgKi8KLQkJZm9yICggaT0wOyBpPD1jZHJvbS0+bnVtdHJhY2tzOyArK2kgKSB7Ci0JCQlpZiAoIGkgPT0gY2Ryb20tPm51bXRyYWNrcyApIHsKLQkJCQljZHJvbS0+dHJhY2tbaV0uaWQgPSBDRFJPTV9MRUFET1VUOwotCQkJfSBlbHNlIHsKLQkJCQljZHJvbS0+dHJhY2tbaV0uaWQgPSB0b2MuY2R0aF90cmswK2k7Ci0JCQl9Ci0JCQllbnRyeS5jZHRlX3RyYWNrID0gY2Ryb20tPnRyYWNrW2ldLmlkOwotCQkJZW50cnkuY2R0ZV9mb3JtYXQgPSBDRFJPTV9NU0Y7Ci0JCQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENEUk9NUkVBRFRPQ0VOVFJZLAotCQkJCQkJCQkmZW50cnkpIDwgMCApIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCBlbnRyeS5jZHRlX2N0cmwgJiBDRFJPTV9EQVRBX1RSQUNLICkgewotCQkJCQljZHJvbS0+dHJhY2tbaV0udHlwZSA9IFNETF9EQVRBX1RSQUNLOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOwotCQkJCX0KLQkJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gTVNGX1RPX0ZSQU1FUygKLQkJCQkJCWVudHJ5LmNkdGVfYWRkci5tc2YubWludXRlLAotCQkJCQkJZW50cnkuY2R0ZV9hZGRyLm1zZi5zZWNvbmQsCi0JCQkJCQllbnRyeS5jZHRlX2FkZHIubXNmLmZyYW1lKTsKLQkJCQljZHJvbS0+dHJhY2tbaV0ubGVuZ3RoID0gMDsKLQkJCQlpZiAoIGkgPiAwICkgewotCQkJCQljZHJvbS0+dHJhY2tbaS0xXS5sZW5ndGggPQotCQkJCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldC0KLQkJCQkJCWNkcm9tLT50cmFja1tpLTFdLm9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCBpID09IChjZHJvbS0+bnVtdHJhY2tzKzEpICkgewotCQkJb2theSA9IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuKG9rYXkgPyAwIDogLTEpOwotfQotCi0vKiBHZXQgQ0QtUk9NIHN0YXR1cyAqLwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKLXsKLQlDRHN0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGNkcm9tX3RvY2hkciB0b2M7Ci0Jc3RydWN0IGNkcm9tX3N1YmNobmwgaW5mbzsKLQotCWluZm8uY2RzY19mb3JtYXQgPSBDRFJPTV9NU0Y7Ci0JaWYgKCBpb2N0bChjZHJvbS0+aWQsIENEUk9NU1VCQ0hOTCwgJmluZm8pIDwgMCApIHsKLQkJaWYgKCBFUlJOT19UUkFZRU1QVFkoZXJybm8pICkgewotCQkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gQ0RfRVJST1I7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKGluZm8uY2RzY19hdWRpb3N0YXR1cykgewotCQkJY2FzZSBDRFJPTV9BVURJT19JTlZBTElEOgotCQkJY2FzZSBDRFJPTV9BVURJT19OT19TVEFUVVM6Ci0JCQkJLyogVHJ5IHRvIGRldGVybWluZSBpZiB0aGVyZSdzIGEgQ0QgYXZhaWxhYmxlICovCi0JCQkJaWYgKGlvY3RsKGNkcm9tLT5pZCwgQ0RST01SRUFEVE9DSERSLCAmdG9jKT09MCkKLQkJCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKLQkJCQllbHNlCi0JCQkJCXN0YXR1cyA9IENEX1RSQVlFTVBUWTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0RST01fQVVESU9fQ09NUExFVEVEOgotCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENEUk9NX0FVRElPX1BMQVk6Ci0JCQkJc3RhdHVzID0gQ0RfUExBWUlORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0RST01fQVVESU9fUEFVU0VEOgotCQkJCS8qIFdvcmthcm91bmQgYnVnZ3kgQ0QtUk9NIGRyaXZlICovCi0JCQkJaWYgKCBpbmZvLmNkc2NfdHJrID09IENEUk9NX0xFQURPVVQgKSB7Ci0JCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhdHVzID0gQ0RfUEFVU0VEOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RhdHVzID0gQ0RfRVJST1I7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCBwb3NpdGlvbiApIHsKLQkJaWYgKCBzdGF0dXMgPT0gQ0RfUExBWUlORyB8fCAoc3RhdHVzID09IENEX1BBVVNFRCkgKSB7Ci0JCQkqcG9zaXRpb24gPSBNU0ZfVE9fRlJBTUVTKAotCQkJCQlpbmZvLmNkc2NfYWJzYWRkci5tc2YubWludXRlLAotCQkJCQlpbmZvLmNkc2NfYWJzYWRkci5tc2Yuc2Vjb25kLAotCQkJCQlpbmZvLmNkc2NfYWJzYWRkci5tc2YuZnJhbWUpOwotCQl9IGVsc2UgewotCQkJKnBvc2l0aW9uID0gMDsKLQkJfQotCX0KLQlyZXR1cm4oc3RhdHVzKTsKLX0KLQotLyogU3RhcnQgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGNkcm9tX21zZiBwbGF5dGltZTsKLQotCUZSQU1FU19UT19NU0Yoc3RhcnQsCi0JICAgJnBsYXl0aW1lLmNkbXNmX21pbjAsICZwbGF5dGltZS5jZG1zZl9zZWMwLCAmcGxheXRpbWUuY2Rtc2ZfZnJhbWUwKTsKLQlGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwKLQkgICAmcGxheXRpbWUuY2Rtc2ZfbWluMSwgJnBsYXl0aW1lLmNkbXNmX3NlYzEsICZwbGF5dGltZS5jZG1zZl9mcmFtZTEpOwotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiVHJ5aW5nIHRvIHBsYXkgZnJvbSAlZDolZDolZCB0byAlZDolZDolZFxuIiwKLQlwbGF5dGltZS5jZG1zZl9taW4wLCBwbGF5dGltZS5jZG1zZl9zZWMwLCBwbGF5dGltZS5jZG1zZl9mcmFtZTAsCi0JcGxheXRpbWUuY2Rtc2ZfbWluMSwgcGxheXRpbWUuY2Rtc2Zfc2VjMSwgcGxheXRpbWUuY2Rtc2ZfZnJhbWUxKTsKLSNlbmRpZgotCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVBMQVlNU0YsICZwbGF5dGltZSkpOwotfQotCi0vKiBQYXVzZSBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKQotewotCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVBBVVNFLCAwKSk7Ci19Ci0KLS8qIFJlc3VtZSBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01SRVNVTUUsIDApKTsKLX0KLQotLyogU3RvcCBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pCi17Ci0JcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENEUk9NU1RPUCwgMCkpOwotfQotCi0vKiBFamVjdCB0aGUgQ0QtUk9NICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKQotewotCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTUVKRUNULCAwKSk7Ci19Ci0KLS8qIENsb3NlIHRoZSBDRC1ST00gaGFuZGxlICovCi1zdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSkKLXsKLQljbG9zZShjZHJvbS0+aWQpOwotfQotCi12b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIFNETF9udW1jZHMgPiAwICkgewotCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgewotCQkJU0RMX2ZyZWUoU0RMX2NkbGlzdFtpXSk7Ci0JCX0KLQkJU0RMX251bWNkcyA9IDA7Ci0JfQotfQotCi0jZW5kaWYgLyogU0RMX0NEUk9NX0xJTlVYICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zL1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvcy9TRExfc3lzY2Ryb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlNjllOS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zL1NETF9zeXNjZHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX0NEUk9NX01BQ09TCi0KLS8qIE1hY09TIGZ1bmN0aW9ucyBmb3Igc3lzdGVtLWxldmVsIENELVJPTSBhdWRpbyBjb250cm9sICovCi0KLSNpbmNsdWRlIDxEZXZpY2VzLmg+Ci0jaW5jbHVkZSA8RmlsZXMuaD4KLSNpbmNsdWRlIDxMb3dNZW0uaD4gLyogVXNlIGVudHJ5IHRhYmxlIG1hY3Jvcywgbm90IGZ1bmN0aW9ucyBpbiBJbnRlcmZhY2VMaWIgICovCi0KLSNpbmNsdWRlICJTRExfY2Ryb20uaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKLSNpbmNsdWRlICJTRExfc3lzY2Ryb21fYy5oIgotCi0vKiBBZGRlZCBieSBNYXR0IFNsb3QgKi8KLSNpZiAhZGVmaW5lZChMTUdldFVuaXRUYWJsZUVudHJ5Q291bnQpCi0gICNkZWZpbmUgTE1HZXRVbml0VGFibGVFbnRyeUNvdW50KCkgICAqKHNob3J0ICopMHgwMUQyCi0jZW5kaWYKLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgd2UnbGwgZGV0ZWN0ICovCi0jZGVmaW5lIE1BWF9EUklWRVMJMjYJCi0KLS8qIEEgbGlzdCBvZiBhdmFpbGFibGUgQ0QtUk9NIGRyaXZlcyAqLwotc3RhdGljIGxvbmcgU0RMX2NkdmVyc2lvbiA9IDA7Ci1zdGF0aWMgc3RydWN0IHsKLQlzaG9ydAkJZFJlZk51bTsKLQlzaG9ydAkJZHJpdmVOdW07Ci0JbG9uZwkJZnJhbWVzOwotCWNoYXIJCW5hbWVbMjU2XTsKLQlCb29sZWFuCQloYXNBdWRpbzsKLQl9IFNETF9jZGxpc3RbTUFYX0RSSVZFU107Ci1zdGF0aWMgU3RyaW5nUHRyIGdEcml2ZXJOYW1lID0gIlxwLkFwcGxlQ0QiOwotCi0vKiBUaGUgc3lzdGVtLWRlcGVuZGVudCBDRCBjb250cm9sIGZ1bmN0aW9ucyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pOwotc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pOwotCi1zdGF0aWMgc2hvcnQgU0RMX1NZU19TaG9ydFRvQkNEKHNob3J0IHZhbHVlKQotewotCXJldHVybigodmFsdWUgJSAxMCkgKyAodmFsdWUgLyAxMCkgKiAweDEwKTsgLyogQ29udmVydCB2YWx1ZSB0byBCQ0QgKi8KLX0KLQotc3RhdGljIHNob3J0IFNETF9TWVNfQkNEVG9TaG9ydChzaG9ydCB2YWx1ZSkKLXsKLQlyZXR1cm4oKHZhbHVlICUgMHgxMCkgKyAodmFsdWUgLyAweDEwKSAqIDEwKTsgLyogQ29udmVydCB2YWx1ZSBmcm9tIEJDRCAqLwotfQotCi1pbnQgIFNETF9TWVNfQ0RJbml0KHZvaWQpCi17Ci0JU0ludDE2CQkJZFJlZk51bSA9IDA7Ci0JU0ludDE2CQkJZmlyc3QsIGxhc3Q7Ci0KLQlTRExfbnVtY2RzID0gMDsKLQotCS8qIENoZWNrIHRoYXQgdGhlIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSAqLwotCWlmIChHZXN0YWx0KGtHZXN0YWx0QXVkaW9DRFNlbGVjdG9yLCAmU0RMX2NkdmVyc2lvbikgfHwgCi0JCQkhU0RMX2NkdmVyc2lvbikgcmV0dXJuKDApOwotCi0JLyogRmlsbCBpbiBvdXIgZHJpdmVyIGNhcGFiaWxpdGllcyAqLwotCVNETF9DRGNhcHMuTmFtZSA9IFNETF9TWVNfQ0ROYW1lOwotCVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOwotCVNETF9DRGNhcHMuR2V0VE9DID0gU0RMX1NZU19DREdldFRPQzsKLQlTRExfQ0RjYXBzLlN0YXR1cyA9IFNETF9TWVNfQ0RTdGF0dXM7Ci0JU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7Ci0JU0RMX0NEY2Fwcy5QYXVzZSA9IFNETF9TWVNfQ0RQYXVzZTsKLQlTRExfQ0RjYXBzLlJlc3VtZSA9IFNETF9TWVNfQ0RSZXN1bWU7Ci0JU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7Ci0JU0RMX0NEY2Fwcy5FamVjdCA9IFNETF9TWVNfQ0RFamVjdDsKLQlTRExfQ0RjYXBzLkNsb3NlID0gU0RMX1NZU19DRENsb3NlOwotCi0JLyogV2FsayB0aGUgbGlzdCwgY291bnQgZWFjaCBBdWRpb0NEIGRyaXZlciwgYW5kIHNhdmUgdGhlIHJlZm51bXMgKi8KLQlmaXJzdCA9IC0xOwotCWxhc3QgPSAwIC0gTE1HZXRVbml0VGFibGVFbnRyeUNvdW50KCk7Ci0JZm9yKGRSZWZOdW0gPSBmaXJzdDsgZFJlZk51bSA+PSBsYXN0OyBkUmVmTnVtLS0pIHsKLQkJU3RyMjU1CQlkcml2ZXJOYW1lOwotCQlTdHJpbmdQdHIJbmFtZVB0cjsKLQkJREN0bEhhbmRsZQlkZXZpY2VFbnRyeTsKLQotCQlkZXZpY2VFbnRyeSA9IEdldERDdGxFbnRyeShkUmVmTnVtKTsKLQkJaWYgKCEgZGV2aWNlRW50cnkpIGNvbnRpbnVlOwotCQkKLQkJLyogSXMgdGhpcyBhbiAuQXBwbGVDRCA/ICovCi0JCW5hbWVQdHIgPSAoKmRldmljZUVudHJ5KS0+ZEN0bEZsYWdzICYgKDFMIDw8IGRSQU1CYXNlZCkgPwotCQkJCSgoU3RyaW5nUHRyKSAoKERDdGxQdHIpIGRldmljZUVudHJ5KS0+ZEN0bERyaXZlciArIDE4KSA6Ci0JCQkJKChTdHJpbmdQdHIpICgqZGV2aWNlRW50cnkpLT5kQ3RsRHJpdmVyICsgMTgpOwotCQlCbG9ja01vdmVEYXRhKG5hbWVQdHIsIGRyaXZlck5hbWUsIG5hbWVQdHJbMF0rMSk7Ci0JCWlmIChkcml2ZXJOYW1lWzBdID4gZ0RyaXZlck5hbWVbMF0pIGRyaXZlck5hbWVbMF0gPSBnRHJpdmVyTmFtZVswXTsKLQkJaWYgKCEgRXF1YWxTdHJpbmcoZHJpdmVyTmFtZSwgZ0RyaXZlck5hbWUsIGZhbHNlLCBmYWxzZSkpIGNvbnRpbnVlOwotCi0JCS8qIFJlY29yZCB0aGUgYmFzaWMgaW5mbyBmb3IgZWFjaCBkcml2ZSAqLwotCQlTRExfY2RsaXN0W1NETF9udW1jZHNdLmRSZWZOdW0gPSBkUmVmTnVtOwotCQlCbG9ja01vdmVEYXRhKG5hbWVQdHIgKyAxLCBTRExfY2RsaXN0W1NETF9udW1jZHNdLm5hbWUsIG5hbWVQdHJbMF0pOwotCQlTRExfY2RsaXN0W1NETF9udW1jZHNdLm5hbWVbbmFtZVB0clswXV0gPSAwOwotCQlTRExfY2RsaXN0W1NETF9udW1jZHNdLmhhc0F1ZGlvID0gZmFsc2U7Ci0JCVNETF9udW1jZHMrKzsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKQotewotCXJldHVybihTRExfY2RsaXN0W2RyaXZlXS5uYW1lKTsKLX0KLQotc3RhdGljIGludCBnZXRfZHJpdmVudW0oaW50IGRyaXZlKQotewotCVFIZHIgKmRyaXZlUSA9IEdldERydlFIZHIoKTsKLQlEcnZRRWwgKmRyaXZlRWxlbTsKLQotCS8qIFVwZGF0ZSB0aGUgZHJpdmUgbnVtYmVyICovCi0JU0RMX2NkbGlzdFtkcml2ZV0uZHJpdmVOdW0gPSAwOwotCWlmICggZHJpdmVRLT5xVGFpbCApIHsKLQkJZHJpdmVRLT5xVGFpbC0+cUxpbmsgPSAwOwotCX0KLQlmb3IgKCBkcml2ZUVsZW09KERydlFFbCAqKWRyaXZlUS0+cUhlYWQ7IGRyaXZlRWxlbTsKLQkgICAgICBkcml2ZUVsZW0gPSAoRHJ2UUVsICopZHJpdmVFbGVtLT5xTGluayApIHsKLQkJaWYgKCBkcml2ZUVsZW0tPmRRUmVmTnVtID09IFNETF9jZGxpc3RbZHJpdmVdLmRSZWZOdW0gKSB7Ci0JCQlTRExfY2RsaXN0W2RyaXZlXS5kcml2ZU51bSA9IGRyaXZlRWxlbS0+ZFFEcml2ZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybihTRExfY2RsaXN0W2RyaXZlXS5kcml2ZU51bSk7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKQotewotCXJldHVybihkcml2ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQotewotCUNEQ250cmxQYXJhbQkJY2RwYjsKLQlDRFRyYWNrRGF0YQkJCXRyYWNrc1tTRExfTUFYX1RSQUNLU107Ci0JbG9uZwkJCQlpLCBsZWFkb3V0OwotCi0JLyogR2V0IHRoZSBudW1iZXIgb2YgdHJhY2tzIG9uIHRoZSBDRCBieSBleGFtaW5pbmcgdGhlIFRPQyAqLwotCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7Ci0JY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07Ci0JY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKLQljZHBiLmNzQ29kZSA9IGtSZWFkVE9DOwotCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IGtHZXRUcmFja1JhbmdlOwotCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7Ci0JCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCWNkcm9tLT5udW10cmFja3MgPSAKLQkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMV0pIC0gCi0JCQlTRExfU1lTX0JDRFRvU2hvcnQoY2RwYi5jc1BhcmFtLmJ5dGVzWzBdKSArIDE7Ci0JaWYgKCBjZHJvbS0+bnVtdHJhY2tzID4gU0RMX01BWF9UUkFDS1MgKQotCQljZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7Ci0JY2Ryb20tPnN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JY2Ryb20tPmN1cl90cmFjayA9IDA7IC8qIEFwcGFyZW50bHkgdGhlc2UgYXJlIHNldCBlbHNld2hlcmUgKi8KLQljZHJvbS0+Y3VyX2ZyYW1lID0gMDsgLyogQXBwYXJlbnRseSB0aGVzZSBhcmUgc2V0IGVsc2V3aGVyZSAqLwotCi0KLQkvKiBHZXQgdGhlIGxlYWQgb3V0IGFyZWEgb2YgdGhlIENEIGJ5IGV4YW1pbmluZyB0aGUgVE9DICovCi0JU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKLQljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKLQljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwotCWNkcGIuY3NDb2RlID0ga1JlYWRUT0M7Ci0JY2RwYi5jc1BhcmFtLndvcmRzWzBdID0ga0dldExlYWRPdXRBcmVhOwotCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7Ci0JCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCWxlYWRvdXQgPSBNU0ZfVE9fRlJBTUVTKAotCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5ieXRlc1swXSksCi0JCQlTRExfU1lTX0JDRFRvU2hvcnQoY2RwYi5jc1BhcmFtLmJ5dGVzWzFdKSwKLQkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMl0pKTsKLQotCS8qIEdldCBhbiBhcnJheSBvZiB0cmFjayBsb2NhdGlvbnMgYnkgZXhhbWluaW5nIHRoZSBUT0MgKi8KLQlTRExfbWVtc2V0KHRyYWNrcywgMCwgc2l6ZW9mKHRyYWNrcykpOwotCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7Ci0JY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07Ci0JY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKLQljZHBiLmNzQ29kZSA9IGtSZWFkVE9DOwotCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IGtHZXRUcmFja0VudHJpZXM7CS8qIFR5cGUgb2YgUXVlcnkgKi8KLQkqICgobG9uZyAqKSAoY2RwYi5jc1BhcmFtLndvcmRzKzEpKSA9IChsb25nKSB0cmFja3M7CQkJCQotCWNkcGIuY3NQYXJhbS53b3Jkc1szXSA9IGNkcm9tLT5udW10cmFja3MgKiBzaXplb2YodHJhY2tzWzBdKTsJCQotCSogKChjaGFyICopIChjZHBiLmNzUGFyYW0ud29yZHMrNCkpID0gMTsJLyogRmlyc3QgdHJhY2sgKi8KLQlpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgewotCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBSZWFkIGFsbCB0aGUgdHJhY2sgVE9DIGVudHJpZXMgKi8KLQlTRExfY2RsaXN0W2Nkcm9tLT5pZF0uaGFzQXVkaW8gPSBmYWxzZTsKLQlmb3IgKCBpPTA7IGk8Y2Ryb20tPm51bXRyYWNrczsgKytpICkgCi0JCXsKLQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gaSsxOwotCQlpZiAodHJhY2tzW2ldLmVudHJ5LmNvbnRyb2wgJiBrRGF0YVRyYWNrTWFzaykKLQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0RBVEFfVFJBQ0s7Ci0JCWVsc2UKLQkJCXsKLQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOwotCQkJU0RMX2NkbGlzdFtTRExfbnVtY2RzXS5oYXNBdWRpbyA9IHRydWU7Ci0JCQl9Ci0JCQotCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gTVNGX1RPX0ZSQU1FUygKLQkJCQlTRExfU1lTX0JDRFRvU2hvcnQodHJhY2tzW2ldLmVudHJ5Lm1pbiksCi0JCQkJU0RMX1NZU19CQ0RUb1Nob3J0KHRyYWNrc1tpXS5lbnRyeS5taW4pLAotCQkJCVNETF9TWVNfQkNEVG9TaG9ydCh0cmFja3NbaV0uZW50cnkuZnJhbWUpKTsKLQkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IE1TRl9UT19GUkFNRVMoCi0JCQkJU0RMX1NZU19CQ0RUb1Nob3J0KHRyYWNrc1tpKzFdLmVudHJ5Lm1pbiksCi0JCQkJU0RMX1NZU19CQ0RUb1Nob3J0KHRyYWNrc1tpKzFdLmVudHJ5Lm1pbiksCi0JCQkJU0RMX1NZU19CQ0RUb1Nob3J0KHRyYWNrc1tpKzFdLmVudHJ5LmZyYW1lKSkgLQotCQkJCWNkcm9tLT50cmFja1tpXS5vZmZzZXQ7Ci0JCX0KLQkKLQkvKiBBcHBhcmVudGx5IFNETCB3YW50cyBhIGZha2UgbGFzdCBlbnRyeSAqLwotCWNkcm9tLT50cmFja1tpXS5vZmZzZXQgPSBsZWFkb3V0OwotCWNkcm9tLT50cmFja1tpXS5sZW5ndGggPSAwOwotCi0JcmV0dXJuKDApOwotfQotCi0vKiBHZXQgQ0QtUk9NIHN0YXR1cyAqLwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKLXsKLQlDRENudHJsUGFyYW0gY2RwYjsKLQlDRHN0YXR1cyBzdGF0dXMgPSBDRF9FUlJPUjsKLQlCb29sZWFuIHNwaW5uaW5nID0gZmFsc2U7Ci0KLQlpZiAocG9zaXRpb24pICpwb3NpdGlvbiA9IDA7Ci0KLQkvKiBHZXQgdGhlIG51bWJlciBvZiB0cmFja3Mgb24gdGhlIENEIGJ5IGV4YW1pbmluZyB0aGUgVE9DICovCi0JaWYgKCAhIGdldF9kcml2ZW51bShjZHJvbS0+aWQpICkgewotCQlyZXR1cm4oQ0RfVFJBWUVNUFRZKTsKLQl9Ci0JU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKLQljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKLQljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwotCWNkcGIuY3NDb2RlID0ga1JlYWRUT0M7Ci0JY2RwYi5jc1BhcmFtLndvcmRzWzBdID0ga0dldFRyYWNrUmFuZ2U7Ci0JaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKLQkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7Ci0JCXJldHVybihDRF9FUlJPUik7Ci0JfQotCi0JY2Ryb20tPm51bXRyYWNrcyA9IAotCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5ieXRlc1sxXSkgLSAKLQkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMF0pICsgMTsKLQlpZiAoIGNkcm9tLT5udW10cmFja3MgPiBTRExfTUFYX1RSQUNLUyApCi0JCWNkcm9tLT5udW10cmFja3MgPSBTRExfTUFYX1RSQUNLUzsKLQljZHJvbS0+Y3VyX3RyYWNrID0gMDsgLyogQXBwYXJlbnRseSB0aGVzZSBhcmUgc2V0IGVsc2V3aGVyZSAqLwotCWNkcm9tLT5jdXJfZnJhbWUgPSAwOyAvKiBBcHBhcmVudGx5IHRoZXNlIGFyZSBzZXQgZWxzZXdoZXJlICovCi0KLQotCWlmICgxIHx8IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5oYXNBdWRpbykgewotCQkvKiBHZXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3RhdHVzICovCi0JCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7Ci0JCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOwotCQljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwotCQljZHBiLmNzQ29kZSA9IGtBdWRpb1N0YXR1czsKLQkJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKLQkJCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQotCQlzd2l0Y2goY2RwYi5jc1BhcmFtLmNkLnN0YXR1cykgewotCQkJY2FzZSBrU3RhdHVzUGxheWluZzoKLQkJCQlzdGF0dXMgPSBDRF9QTEFZSU5HOwotCQkJCXNwaW5uaW5nID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2Uga1N0YXR1c1BhdXNlZDoKLQkJCQlzdGF0dXMgPSBDRF9QQVVTRUQ7Ci0JCQkJc3Bpbm5pbmcgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBrU3RhdHVzTXV0ZWQ6Ci0JCQkJc3RhdHVzID0gQ0RfUExBWUlORzsgLyogV2hhdCBzaG91bGQgSSBkbyBoZXJlPyAqLwotCQkJCXNwaW5uaW5nID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2Uga1N0YXR1c0RvbmU6Ci0JCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKLQkJCQlzcGlubmluZyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIGtTdGF0dXNTdG9wcGVkOgotCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJc3Bpbm5pbmcgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCWNhc2Uga1N0YXR1c0Vycm9yOgotCQkJZGVmYXVsdDoKLQkJCQlzdGF0dXMgPSBDRF9FUlJPUjsKLQkJCQlzcGlubmluZyA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCWlmIChzcGlubmluZyAmJiBwb3NpdGlvbikgKnBvc2l0aW9uID0gTVNGX1RPX0ZSQU1FUygKLQkJCQlTRExfU1lTX0JDRFRvU2hvcnQoY2RwYi5jc1BhcmFtLmNkLm1pbnV0ZSksCi0JCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5jZC5zZWNvbmQpLAotCQkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uY2QuZnJhbWUpKTsKLQkJfQotCWVsc2UKLQkJc3RhdHVzID0gQ0RfRVJST1I7IC8qIFdoYXQgc2hvdWxkIEkgZG8gaGVyZT8gKi8KLQotCXJldHVybihzdGF0dXMpOwotfQotCi0vKiBTdGFydCBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLXsKLQlDRENudHJsUGFyYW0gY2RwYjsKLQotCS8qIFBhdXNlIHRoZSBjdXJyZW50IGF1ZGlvIHBsYXliYWNrIHRvIGF2b2lkIGF1ZGlibGUgYXJ0aWZhY3RzICovCi0JaWYgKCBTRExfU1lTX0NEUGF1c2UoY2Ryb20pIDwgMCApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTcGVjaWZ5IHRoZSBBdWRpb0NEIHBsYXliYWNrIG1vZGUgKi8KLQlTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwotCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOwotCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07Ci0JY2RwYi5jc0NvZGUgPSBrU2V0UGxheU1vZGU7Ci0JY2RwYi5jc1BhcmFtLmJ5dGVzWzBdID0gZmFsc2U7CQkJLyogUmVwZWF0PyAqLwotCWNkcGIuY3NQYXJhbS5ieXRlc1sxXSA9IGtQbGF5TW9kZVNlcXVlbnRpYWw7CS8qIFBsYXkgbW9kZSAqLwotCS8qIKWlpcpUcmVhdCBhcyBzb2Z0IGVycm9yLCBORUMgRHJpdmUgZG9lc250IHN1cHBvcnQgdGhpcyBjYWxsIKWlpSAqLwotCVBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpICZjZHBiKTsKLQotI2lmIDEKLQkvKiBTcGVjaWZ5IHRoZSBlbmQgb2YgYXVkaW8gcGxheWJhY2sgKi8KLQlTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwotCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOwotCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07Ci0JY2RwYi5jc0NvZGUgPSBrQXVkaW9TdG9wOwotCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IGtCbG9ja1Bvc2l0aW9uOwkJLyogUG9zaXRpb24gTW9kZSAqLwotCSoobG9uZyAqKSAoY2RwYi5jc1BhcmFtLndvcmRzICsgMSkgPSBzdGFydCtsZW5ndGgtMTsgLyogU2VhcmNoIEFkZHJlc3MgKi8KLQlpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgewotCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTcGVjaWZ5IHRoZSBzdGFydCBvZiBhdWRpbyBwbGF5YmFjaywgYW5kIHN0YXJ0IGl0ICovCi0JU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKLQljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKLQljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwotCWNkcGIuY3NDb2RlID0ga0F1ZGlvUGxheTsKLQljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSBrQmxvY2tQb3NpdGlvbjsJCQkvKiBQb3NpdGlvbiBNb2RlICovCi0JKihsb25nICopIChjZHBiLmNzUGFyYW0ud29yZHMgKyAxKSA9IHN0YXJ0KzE7CS8qIFNlYXJjaCBBZGRyZXNzICovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzNdID0gZmFsc2U7CQkJCQkvKiBTdG9wIGFkZHJlc3M/ICovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzRdID0ga1N0ZXJlb1BsYXlNb2RlOwkJLyogQXVkaW8gUGxheSBNb2RlICovCi0JaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKLQkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7Ci0JCXJldHVybigtMSk7Ci0JfQotI2Vsc2UKLQkvKiBTcGVjaWZ5IHRoZSBlbmQgb2YgYXVkaW8gcGxheWJhY2sgKi8KLQlGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwgJm0sICZzLCAmZik7Ci0JU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKLQljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKLQljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwotCWNkcGIuY3NDb2RlID0ga0F1ZGlvU3RvcDsKLQljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSBrVHJhY2tQb3NpdGlvbjsJCQkvKiBQb3NpdGlvbiBNb2RlICovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMDsJCQkJCQkvKiBTZWFyY2ggQWRkcmVzcyAoaGl3b3JkKSovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzJdID0gCQkJCQkJLyogU2VhcmNoIEFkZHJlc3MgKGxvd29yZCkqLwotCQkJU0RMX1NZU19TaG9ydFRvQkNEKGNkcm9tLT5udW10cmFja3MpOwkKLQlpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgewotCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTcGVjaWZ5IHRoZSBzdGFydCBvZiBhdWRpbyBwbGF5YmFjaywgYW5kIHN0YXJ0IGl0ICovCi0JRlJBTUVTX1RPX01TRihzdGFydCwgJm0sICZzLCAmZik7Ci0JU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKLQljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKLQljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwotCWNkcGIuY3NDb2RlID0ga0F1ZGlvUGxheTsKLQljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSBrVHJhY2tQb3NpdGlvbjsJCQkvKiBQb3NpdGlvbiBNb2RlICovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMDsJCQkJCQkvKiBTZWFyY2ggQWRkcmVzcyAoaGl3b3JkKSovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzJdID0gU0RMX1NZU19TaG9ydFRvQkNEKDEpOwkvKiBTZWFyY2ggQWRkcmVzcyAobG93b3JkKSovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzNdID0gZmFsc2U7CQkJCQkvKiBTdG9wIGFkZHJlc3M/ICovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzRdID0ga1N0ZXJlb1BsYXlNb2RlOwkJLyogQXVkaW8gUGxheSBNb2RlICovCi0JaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKLQkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7Ci0JCXJldHVybigtMSk7Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIFBhdXNlIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pCi17Ci0JQ0RDbnRybFBhcmFtIGNkcGI7Ci0KLQlTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwotCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOwotCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07Ci0JY2RwYi5jc0NvZGUgPSBrQXVkaW9QYXVzZTsKLQljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSAwOwkvKiBQYXVzZS9Db250aW51ZSBGbGFnIChoaXdvcmQpICovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMTsJLyogUGF1c2UvQ29udGludWUgRmxhZyAobG93b3JkKSAqLwotCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7Ci0JCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIFJlc3VtZSBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKLXsKLQlDRENudHJsUGFyYW0gY2RwYjsKLQotCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7Ci0JY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07Ci0JY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKLQljZHBiLmNzQ29kZSA9IGtBdWRpb1BhdXNlOwotCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IDA7CS8qIFBhdXNlL0NvbnRpbnVlIEZsYWcgKGhpd29yZCkgKi8KLQljZHBiLmNzUGFyYW0ud29yZHNbMV0gPSAwOwkvKiBQYXVzZS9Db250aW51ZSBGbGFnIChsb3dvcmQpICovCi0JaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKLQkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotLyogU3RvcCBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pCi17Ci0JQ0RDbnRybFBhcmFtIGNkcGI7Ci0KLQlTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwotCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOwotCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07Ci0JY2RwYi5jc0NvZGUgPSBrQXVkaW9TdG9wOwotCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IDA7CQkvKiBQb3NpdGlvbiBNb2RlICovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMDsJCS8qIFNlYXJjaCBBZGRyZXNzIChoaXdvcmQpICovCi0JY2RwYi5jc1BhcmFtLndvcmRzWzJdID0gMDsJCS8qIFNlYXJjaCBBZGRyZXNzIChsb3dvcmQpICovCi0JaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKLQkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotLyogRWplY3QgdGhlIENELVJPTSAqLwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKLXsKLQlCb29sZWFuCWRpc2sgPSBmYWxzZTsKLQlRSGRyICpkcml2ZVEgPSBHZXREcnZRSGRyKCk7Ci0JRHJ2UUVsICpkcml2ZUVsZW07Ci0JSFBhcmFtQmxvY2tSZWMgaHBiOwotCVBhcmFtQmxvY2tSZWMgY3BiOwotCi0JZm9yICggZHJpdmVFbGVtID0gKERydlFFbCAqKSBkcml2ZVEtPnFIZWFkOyBkcml2ZUVsZW07IGRyaXZlRWxlbSA9IAotCQkJICAoZHJpdmVFbGVtKSA/ICgoRHJ2UUVsICopIGRyaXZlRWxlbS0+cUxpbmspIDogCi0JCQkgICgoRHJ2UUVsICopIGRyaXZlUS0+cUhlYWQpICkgewotCQlpZiAoIGRyaXZlUS0+cVRhaWwgKSB7Ci0JCQlkcml2ZVEtPnFUYWlsLT5xTGluayA9IDA7Ci0JCX0KLQkJaWYgKCBkcml2ZUVsZW0tPmRRUmVmTnVtICE9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtICkgewotCQkJY29udGludWU7Ci0JCX0KLQkKLQkJLyogRG9lcyBkcml2ZSBjb250YWluIG1vdW50ZWQgdm9sdW1lPyBJZiBub3QsIHNraXAgKi8KLQkJU0RMX21lbXNldCgmaHBiLCAwLCBzaXplb2YoaHBiKSk7Ci0JCWhwYi52b2x1bWVQYXJhbS5pb1ZSZWZOdW0gPSBkcml2ZUVsZW0tPmRRRHJpdmU7Ci0JCWlmICggUEJIR2V0VkluZm9TeW5jKCZocGIpICE9IG5vRXJyICkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCAoVW5tb3VudFZvbCgwLCBkcml2ZUVsZW0tPmRRRHJpdmUpID09IG5vRXJyKSAmJiAKLQkJICAgICAoRWplY3QoMCwgZHJpdmVFbGVtLT5kUURyaXZlKSA9PSBub0VycikgKSB7Ci0JCQlkcml2ZUVsZW0gPSAwOyAvKiBDbGVhciBwb2ludGVyIHRvIHJlc2V0IG91ciBsb29wICovCi0JCQlkaXNrID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qIElmIG5vIGRpc2sgaXMgcHJlc2VudCwganVzdCBlamVjdCB0aGUgdHJheSAqLwotCWlmICghIGRpc2spIHsKLQkJU0RMX21lbXNldCgmY3BiLCAwLCBzaXplb2YoY3BiKSk7Ci0JCWNwYi5jbnRybFBhcmFtLmlvVlJlZk51bSA9IDA7IC8qIE5vIERyaXZlICovCi0JCWNwYi5jbnRybFBhcmFtLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwotCQljcGIuY250cmxQYXJhbS5jc0NvZGUgPSBrRWplY3RUaGVEaXNjOwotCQlpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNwYikgIT0gbm9FcnIgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuKDApOwotfQotCi0vKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLwotc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCi17Ci0JcmV0dXJuOwotfQotCi12b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCi17Ci0Jd2hpbGUoU0RMX251bWNkcy0tKSAKLQkJU0RMX21lbXNldChTRExfY2RsaXN0ICsgU0RMX251bWNkcywgMCwgc2l6ZW9mKFNETF9jZGxpc3RbMF0pKTsKLX0KLQotI2VuZGlmIC8qIFNETF9DRFJPTV9NQUNPUyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvcy9TRExfc3lzY2Ryb21fYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvcy9TRExfc3lzY2Ryb21fYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzU4MjZlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3MvU0RMX3N5c2Nkcm9tX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBpcyB0aGUgTWFjT1Mgc3BlY2lmaWMgaGVhZGVyIGZvciB0aGUgU0RMIENELVJPTSBBUEkKLSAgIENvbnRyaWJ1dGVkIGJ5IE1hdHQgU2xvdAotICovCi0KLS8qIEFwcGxlQ0QgQ29udHJvbCBjYWxscyAqLwotI2RlZmluZSBrVmVyaWZ5VGhlRGlzYyAgIAkgIDUJCS8qIFJldHVybnMgbm9FcnIgaWYgdGhlcmUgaXMgZGlzYyBpbnNlcnRlZCAqLwotI2RlZmluZSBrRWplY3RUaGVEaXNjICAgCSAgNwkJLyogRWplY3QgZGlzYyBmcm9tIGRyaXZlICovCi0jZGVmaW5lIGtVc2VyRWplY3QgICAgCQkgODAJCS8qIEVuYWJsZS9kaXNhYmxlIHRoZSBDRC1ST00gZWplY3QgYnV0dG9uICovCi0jZGVmaW5lIGtSZWFkVE9DICAgIAkJMTAwCQkvKiBFeHRyYWN0IHZhcmlvdXMgVE9DIGluZm9ybWF0aW9uIGZyb20gdGhlIGRpc2MgKi8KLSNkZWZpbmUga1JlYWRRICAgCQkJMTAxCQkvKiBFeHRyYWN0IFEgc3ViY29kZSBpbmZvIGZvciB0aGUgY3VycmVudCB0cmFjayAqLwotI2RlZmluZSBrQXVkaW9UcmFja1NlYXJjaCAgIDEwMwkJLyogU3RhcnQgcGxheWJhY2sgZnJvbSB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uICovCi0jZGVmaW5lIGtBdWRpb1BsYXkgICAgCQkxMDQJCS8qIFN0YXJ0IHBsYXliYWNrIGZyb20gdGhlIGluZGljYXRlZCBwb3NpdGlvbiAqLwotI2RlZmluZSBrQXVkaW9QYXVzZSAgICAJCTEwNQkJLyogUGF1c2UvY29udGludWUgdGhlIHBsYXliYWNrICovCi0jZGVmaW5lIGtBdWRpb1N0b3AgICAgCQkxMDYJCS8qIFN0b3AgcGxheWJhY2sgYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbiAqLwotI2RlZmluZSBrQXVkaW9TdGF0dXMgICAgCTEwNwkJLyogUmV0dXJuIGF1ZGlvIHBsYXkgc3RhdHVzICovCi0jZGVmaW5lIGtBdWRpb0NvbnRyb2wgICAgCTEwOQkJLyogU2V0IHRoZSBvdXRwdXQgdm9sdW1lIGZvciB0aGUgYXVkaW8gY2hhbm5lbHMgKi8KLSNkZWZpbmUga1JlYWRBdWRpb1ZvbHVtZSAgIAkxMTIJCS8qIEdldCB0aGUgb3V0cHV0IHZvbHVtZSBmb3IgdGhlIGF1ZGlvIGNoYW5uZWxzICovCi0jZGVmaW5lIGtTZXRUcmFja0xpc3QgICAJMTIyCQkvKiBTZXQgdGhlIHRyYWNrIHByb2dyYW0gZm9yIHRoZSBhdWRpbyBDRCB0byBwbGF5ICovCi0jZGVmaW5lIGtHZXRUcmFja0xpc3QgICAJMTIzCQkvKiBHZXQgdGhlIHRyYWNrIHByb2dyYW0gdGhlIGF1ZGlvIENEIGlzIHBsYXlpbmcgKi8KLSNkZWZpbmUga0dldFRyYWNrSW5kZXggICAJMTI0CQkvKiBHZXQgdGhlIHRyYWNrIGluZGV4IHRoZSBhdWRpbyBDRCBpcyBwbGF5aW5nICovCi0jZGVmaW5lIGtTZXRQbGF5TW9kZSAgIAkJMTI1CQkvKiBTZXQgdGhlIGF1ZGlvIHRyYWNrcyBwbGF5IG1vZGUgKi8KLSNkZWZpbmUga0dldFBsYXlNb2RlICAgCQkxMjYJCS8qIEdldCB0aGUgYXVkaW8gdHJhY2tzIHBsYXkgbW9kZSAqLwotCi0vKiBBcHBsZUNEIFN0YXR1cyBjYWxscyAqLwotI2RlZmluZSBrR2V0RHJpdmVUeXBlICAgCSA5NgkJLyogR2V0IHRoZSB0eXBlIG9mIHRoZSBwaHlzaWNhbCBDRC1ST00gZHJpdmUgKi8KLSNkZWZpbmUga1dob0lzVGhlcmUgICAgCQkgOTcJCS8qIEdldCBhIGJpdG1hcCBvZiBTQ1NJIElEcyB0aGUgZHJpdmVyIGNvbnRyb2xzICovCi0jZGVmaW5lIGtHZXRCbG9ja1NpemUgICAgCSA5OAkJLyogR2V0IGN1cnJlbnQgYmxvY2sgc2l6ZSBvZiB0aGUgQ0QtUk9NIGRyaXZlICovCi0JCi0vKiBBcHBsZUNEIG90aGVyIGNvbnN0YW50cyAqLwotI2RlZmluZSBrQmxvY2tQb3NpdGlvbiAgICAJICAwCQkvKiBQb3NpdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGxvZ2ljYWwgYmxvY2sgbnVtYmVyICovCi0jZGVmaW5lIGtBYnNNU0ZQb3NpdGlvbiAgICAJICAxCQkvKiBQb3NpdGlvbiBhdCB0aGUgc3BlY2lmaWVkIE1pbi9TZWMvRnJhbWUgKGluIEJDRCkgKi8KLSNkZWZpbmUga1RyYWNrUG9zaXRpb24gICAgCSAgMgkJLyogUG9zaXRpb24gYXQgdGhlIHNwZWNpZmllZCB0cmFjayBudW1iZXIgKGluIEJDRCkgKi8KLSNkZWZpbmUga0luZGV4UG9zaXRpb24gICAgCSAgMwkJLyogUG9zaXRpb24gYXQgdGhlIG50aCB0cmFjayBpbiBwcm9ncmFtIChpbiBCQ0QpICovCi0KLSNkZWZpbmUga011dGVkUGxheU1vZGUgICAJICAwCQkvKiBQbGF5IHRoZSBhdWRpbyB0cmFjayB3aXRoIG5vIG91dHB1dCAqLwotI2RlZmluZSBrU3RlcmVvUGxheU1vZGUgICAJICA5CQkvKiBQbGF5IHRoZSBhdWRpbyB0cmFjayBpbiBub3JtYWwgc3RlcmVvICovCi0KLSNkZWZpbmUga0NvbnRyb2xGaWVsZE1hc2sgIAkweDBECS8qIEJpdHMgMywyLDAgaW4gdGhlIG5pYmJsZSAqLwotI2RlZmluZSBrRGF0YVRyYWNrTWFzayAgIAkweDA0CS8qIEluZGljYXRlcyBEYXRhIFRyYWNrICovCi0KLSNkZWZpbmUga0dldFRyYWNrUmFuZ2UgICAgCSAgMQkJLyogUXVlcnkgVE9DIGZvciB0cmFjayBudW1iZXJzICovCi0jZGVmaW5lIGtHZXRMZWFkT3V0QXJlYSAgICAJICAyCQkvKiBRdWVyeSBUT0MgZm9yICJMZWFkIE91dCIgZW5kIG9mIGF1ZGlvIGRhdGEgKi8KLSNkZWZpbmUga0dldFRyYWNrRW50cmllcyAgIAkgIDMJCS8qIFF1ZXJ5IFRPQyBmb3IgdHJhY2sgc3RhcnRzIGFuZCBkYXRhIHR5cGVzICovCi0KLSNkZWZpbmUga1N0YXR1c1BsYXlpbmcJCSAgMAkJLyogQXVkaW8gUGxheSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgKi8KLSNkZWZpbmUga1N0YXR1c1BhdXNlZAkJICAxCQkvKiBDRC1ST00gZGV2aWNlIGluIEhvbGQgVHJhY2sgKCJQYXVzZSIpIHN0YXRlICovCi0jZGVmaW5lIGtTdGF0dXNNdXRlZAkJICAyCQkvKiBNVVRJTkctT04gb3BlcmF0aW9uIGluIHByb2dyZXNzICovCi0jZGVmaW5lIGtTdGF0dXNEb25lCQkJICAzCQkvKiBBdWRpbyBQbGF5IGNvbXBsZXRlZCAqLwotI2RlZmluZSBrU3RhdHVzRXJyb3IJCSAgNAkJLyogRXJyb3Igb2NjdXJyZWQgZHVyaW5nIGF1ZGlvIHBsYXkgb3BlcmF0aW9uICovCi0jZGVmaW5lIGtTdGF0dXNTdG9wcGVkCQkgIDUJCS8qIEF1ZGlvIHBsYXkgb3BlcmF0aW9uIG5vdCByZXF1ZXN0ZWQgKi8KLQotI2RlZmluZSBrUGxheU1vZGVTZXF1ZW50aWFsCSAgMAkJLyogIFBsYXkgdHJhY2tzIGluIG9yZGVyICovCi0jZGVmaW5lIGtQbGF5TW9kZVNodWZmbGVkCSAgMQkJLyogUGxheSB0cmFja3MgcmFuZG9tbHkgKi8KLSNkZWZpbmUga1BsYXlNb2RlUHJvZ3JhbW1lZCAgIDIJCS8qIFVzZSBjdXN0b20gcGxheWxpc3QgKi8KLQotLyogQXBwbGVDRCBHZXN0YWx0IHNlbGVjdG9ycyAqLwotI2RlZmluZSBrR2VzdGFsdEF1ZGlvQ0RTZWxlY3RvciAgICAnYXVjZCcKLSNkZWZpbmUga0RyaXZlclZlcnNpb241MiAgIAkJMHgwMDAwMDUyMAotI2RlZmluZSBrRHJpdmVyVmVyc2lvbjUxICAgCQkweDAwMDAwNTEwCi0jZGVmaW5lIGtEcml2ZXJWZXJzaW9uNTAgICAJCTB4MDAwMDA1MDAKLQotLyogRHJpdmUgdHlwZSBjb25zdGFudHMgKi8KLSNkZWZpbmUga0RyaXZlQXBwbGVDRF9TQyAgIAkJCQkgIDEKLSNkZWZpbmUga0RyaXZlQXBwbGVDRF9TQ1BsdXNfb3JfMTUwICAgCSAgMgotI2RlZmluZSBrRHJpdmVBcHBsZUNEXzMwMF9vcl8zMDBQbHVzICAgCSAgMwotCi0vKiBNaXNjIGNvbnN0YW50cyAqLwotI2RlZmluZSBrRmlyc3RTQ1NJRGV2aWNlICAgCSAtMzMKLSNkZWZpbmUga0xhc3RTQ1NJRGV2aWNlICAgIAkgLTQwCi0KLSNpZiBQUkFHTUFfU1RSVUNUX0FMSUdOCi0JI3ByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4awotI2VuZGlmCi0KLS8qIEFwcGxlQ0QgZHJpdmVyIHBhcmFtZXRlciBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgQ0RDbnRybFBhcmFtIHsKLQlRRWxlbVB0cgkJCQlxTGluazsKLQlzaG9ydAkJCQkJcVR5cGU7Ci0Jc2hvcnQJCQkJCWlvVHJhcDsKLQlQdHIJCQkJCQlpb0NtZEFkZHI7Ci0JSU9Db21wbGV0aW9uVVBQCQkJaW9Db21wbGV0aW9uOwotCU9TRXJyCQkJCQlpb1Jlc3VsdDsKLQlTdHJpbmdQdHIJCQkJaW9OYW1lUHRyOwotCXNob3J0CQkJCQlpb1ZSZWZOdW07Ci0Jc2hvcnQJCQkJCWlvQ1JlZk51bTsKLQlzaG9ydAkJCQkJY3NDb2RlOwotCQotCXVuaW9uIHsKLQkJbG9uZwkJCQlsb25nc1s2XTsKLQkJc2hvcnQJCQkJd29yZHNbMTFdOwotCQl1bnNpZ25lZCBjaGFyCQlieXRlc1syMl07Ci0JCXN0cnVjdCB7Ci0JCQl1bnNpZ25lZCBjaGFyCXN0YXR1czsKLQkJCXVuc2lnbmVkIGNoYXIJcGxheTsKLQkJCXVuc2lnbmVkIGNoYXIJY29udHJvbDsKLQkJCXVuc2lnbmVkIGNoYXIJbWludXRlOwotCQkJdW5zaWduZWQgY2hhcglzZWNvbmQ7Ci0JCQl1bnNpZ25lZCBjaGFyCWZyYW1lOwotCQkJfSBjZDsKLQkJfSBjc1BhcmFtOwotCi0JfSBDRENudHJsUGFyYW0sICpDRENudHJsUGFyYW1QdHI7Ci0KLXR5cGVkZWYgdW5pb24gQ0RUcmFja0RhdGEgewotCWxvbmcJCQkJdmFsdWU7CQkJLyogVHJlYXQgYXMgYSBsb25nd29yZCB2YWx1ZSAqLwotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGNoYXIJcmVzZXJ2ZWQgOiA0OwkvKiBVbnVzZWQgYnkgQXBwbGVDRCBkcml2ZXIgICovCi0JCXVuc2lnbmVkIGNoYXIJY29udHJvbCA6IDQ7CS8qIFRyYWNrIGZsYWdzIChkYXRhIHRyYWNrPykgKi8KLQkJdW5zaWduZWQgY2hhcgltaW47CQkJLyogU3RhcnQgb2YgdHJhY2sgKEJDRCkgICAgICAqLwotCQl1bnNpZ25lZCBjaGFyCXNlYzsJCQkvKiBTdGFydCBvZiB0cmFjayAoQkNEKSAgICAgICovCi0JCXVuc2lnbmVkIGNoYXIJZnJhbWU7CQkJLyogU3RhcnQgb2YgdHJhY2sgKEJDRCkgICAgICAqLwotCQl9IGVudHJ5OwkJCQkJCS8qIEJyb2tlbiBpbnRvIGZpZWxkcyAgICAgICAgKi8KLQl9IENEVHJhY2tEYXRhLCAqQ0RUcmFja1B0cjsKLQkKLSNpZiBQUkFHTUFfU1RSVUNUX0FMSUdOCi0JI3ByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L0F1ZGlvRmlsZVBsYXllci5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvc3gvQXVkaW9GaWxlUGxheWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2ViMGMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvc3gvQXVkaW9GaWxlUGxheWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0KLSAgICBUaGlzIGZpbGUgYmFzZWQgb24gQXBwbGUgc2FtcGxlIGNvZGUuIFdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgZmlsZSBuYW1lLCAKLSAgICBzbyBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgaXQgb24gYXBwbGUuY29tL2RldmVsb3BlcgotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gICAgQXVkaW9GaWxlUGxheWVyLmNwcAotKi8KLSNpbmNsdWRlICJBdWRpb0ZpbGVQbGF5ZXIuaCIKLQotLyoKLXZvaWQgVGhyb3dSZXN1bHQgKE9TU3RhdHVzIHJlc3VsdCwgY29uc3QgY2hhciogc3RyKQotewotICAgIFNETF9TZXRFcnJvciAoIkVycm9yOiAlcyAlZCIsIHN0ciwgcmVzdWx0KTsKLSAgICB0aHJvdyByZXN1bHQ7Ci19Ci0qLwotCi0jaWYgREVCVUcKLXN0YXRpYyB2b2lkIFByaW50U3RyZWFtRGVzYyAoQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uICppbkRlc2MpCi17Ci0gICAgaWYgKCFpbkRlc2MpIHsKLSAgICAgICAgcHJpbnRmICgiQ2FuJ3QgcHJpbnQgYSBOVUxMIGRlc2MhXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBwcmludGYgKCItIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC1cbiIpOwotICAgIHByaW50ZiAoIiAgU2FtcGxlIFJhdGU6JWZcbiIsIGluRGVzYy0+bVNhbXBsZVJhdGUpOwotICAgIHByaW50ZiAoIiAgRm9ybWF0IElEOiVzXG4iLCAoY2hhciopJmluRGVzYy0+bUZvcm1hdElEKTsKLSAgICBwcmludGYgKCIgIEZvcm1hdCBGbGFnczolbFhcbiIsIGluRGVzYy0+bUZvcm1hdEZsYWdzKTsKLSAgICBwcmludGYgKCIgIEJ5dGVzIHBlciBQYWNrZXQ6JWxkXG4iLCBpbkRlc2MtPm1CeXRlc1BlclBhY2tldCk7Ci0gICAgcHJpbnRmICgiICBGcmFtZXMgcGVyIFBhY2tldDolbGRcbiIsIGluRGVzYy0+bUZyYW1lc1BlclBhY2tldCk7Ci0gICAgcHJpbnRmICgiICBCeXRlcyBwZXIgRnJhbWU6JWxkXG4iLCBpbkRlc2MtPm1CeXRlc1BlckZyYW1lKTsKLSAgICBwcmludGYgKCIgIENoYW5uZWxzIHBlciBGcmFtZTolbGRcbiIsIGluRGVzYy0+bUNoYW5uZWxzUGVyRnJhbWUpOwotICAgIHByaW50ZiAoIiAgQml0cyBwZXIgQ2hhbm5lbDolbGRcbiIsIGluRGVzYy0+bUJpdHNQZXJDaGFubmVsKTsKLSAgICBwcmludGYgKCItIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC1cbiIpOwotfQotI2VuZGlmCi0KLQotc3RhdGljIGludCBBdWRpb0ZpbGVQbGF5ZXJfU2V0RGVzdGluYXRpb24gKEF1ZGlvRmlsZVBsYXllciAqYWZwLCBBdWRpb1VuaXQgICppbkRlc3RVbml0KQotewotICAgIC8qaWYgKGFmcC0+bUNvbm5lY3RlZCkgdGhyb3cgc3RhdGljX2Nhc3Q8T1NTdGF0dXM+KC0xKTsqLyAvKiBjYW4ndCBzZXQgZGVzdCBpZiBhbHJlYWR5IGVuZ2FnZWQgKi8KLSAgICBpZiAoYWZwLT5tQ29ubmVjdGVkKQotICAgICAgICByZXR1cm4gMCA7Ci0KLSAgICBTRExfbWVtY3B5KCZhZnAtPm1QbGF5VW5pdCwgaW5EZXN0VW5pdCwgc2l6ZW9mIChhZnAtPm1QbGF5VW5pdCkpOwotCi0gICAgT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7Ci0gICAgCi0KLSAgICAgICAgLyogd2UgY2FuICJkb3duIiBjYXN0IGEgY29tcG9uZW50IGluc3RhbmNlIHRvIGEgY29tcG9uZW50ICovCi0gICAgQ29tcG9uZW50RGVzY3JpcHRpb24gZGVzYzsKLSAgICByZXN1bHQgPSBHZXRDb21wb25lbnRJbmZvICgoQ29tcG9uZW50KSppbkRlc3RVbml0LCAmZGVzYywgMCwgMCwgMCk7Ci0gICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJHZXRDb21wb25lbnRJbmZvIikqLwotICAgICAgICAKLSAgICAgICAgLyogd2UncmUgZ29pbmcgdG8gdXNlIHRoaXMgdG8ga25vdyB3aGljaCBjb252ZXJ0IHJvdXRpbmUgdG8gY2FsbAotICAgICAgICAgICBhIHYxIGF1ZGlvIHVuaXQgd2lsbCBoYXZlIGEgdHlwZSBvZiAnYXVudCcKLSAgICAgICAgICAgYSB2MiBhdWRpbyB1bml0IHdpbGwgaGF2ZSBvbmUgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgdHlwZXMuICovCi0gICAgaWYgKGRlc2MuY29tcG9uZW50VHlwZSAhPSBrQXVkaW9Vbml0Q29tcG9uZW50VHlwZSkgewotICAgICAgICByZXN1bHQgPSBiYWRDb21wb25lbnRJbnN0YW5jZTsKLSAgICAgICAgLypUSFJPV19SRVNVTFQoIkJBRCBDT01QT05FTlQiKSovCi0gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgaW5wdXQgZm9ybWF0IG9mIHRoZSBhdWRpbyB1bml0LiAqLwotICAgIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5ICgqaW5EZXN0VW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU3RyZWFtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRTY29wZV9JbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZnAtPm1GaWxlRGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChhZnAtPm1GaWxlRGVzY3JpcHRpb24pKTsKLSAgICAgICAgLypUSFJPV19SRVNVTFQoIkF1ZGlvVW5pdFNldFByb3BlcnR5IikqLwotICAgIGlmIChyZXN1bHQpIHJldHVybiAwOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb0ZpbGVQbGF5ZXJfU2V0Tm90aWZpZXIoQXVkaW9GaWxlUGxheWVyICphZnAsIEF1ZGlvRmlsZVBsYXlOb3RpZmllciBpbk5vdGlmaWVyLCB2b2lkICppblJlZkNvbikKLXsKLSAgICBhZnAtPm1Ob3RpZmllciA9IGluTm90aWZpZXI7Ci0gICAgYWZwLT5tUmVmQ29uID0gaW5SZWZDb247Ci19Ci0KLXN0YXRpYyBpbnQgQXVkaW9GaWxlUGxheWVyX0lzQ29ubmVjdGVkKEF1ZGlvRmlsZVBsYXllciAqYWZwKQotewotICAgIHJldHVybiBhZnAtPm1Db25uZWN0ZWQ7Ci19Ci0KLXN0YXRpYyBBdWRpb1VuaXQgQXVkaW9GaWxlUGxheWVyX0dldERlc3RVbml0KEF1ZGlvRmlsZVBsYXllciAqYWZwKQotewotICAgcmV0dXJuIGFmcC0+bVBsYXlVbml0OwotfQotCi1zdGF0aWMgdm9pZCBBdWRpb0ZpbGVQbGF5ZXJfUHJpbnQoQXVkaW9GaWxlUGxheWVyICphZnApCi17Ci0jaWYgREVCVUcgICAgCi0gICAgcHJpbnRmICgiSXMgQ29ubmVjdGVkOiVzXG4iLCAoSXNDb25uZWN0ZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKLSAgICBwcmludGYgKCItIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gXG4iKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCAgICBBdWRpb0ZpbGVQbGF5ZXJfU2V0U3RhcnRGcmFtZSAoQXVkaW9GaWxlUGxheWVyICphZnAsIGludCBmcmFtZSkKLXsKLSAgICBTSW50NjQgcG9zaXRpb24gPSBmcmFtZSAqIDIzNTI7Ci0KLSAgICBhZnAtPm1TdGFydEZyYW1lID0gZnJhbWU7Ci0gICAgYWZwLT5tQXVkaW9GaWxlTWFuYWdlci0+U2V0UG9zaXRpb24gKGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXIsIHBvc2l0aW9uKTsKLX0KLQotICAgIAotc3RhdGljIGludCAgICBBdWRpb0ZpbGVQbGF5ZXJfR2V0Q3VycmVudEZyYW1lIChBdWRpb0ZpbGVQbGF5ZXIgKmFmcCkKLXsKLSAgICByZXR1cm4gYWZwLT5tU3RhcnRGcmFtZSArIChhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyLT5HZXRCeXRlQ291bnRlcihhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyKSAvIDIzNTIpOwotfQotICAgIAotc3RhdGljIHZvaWQgICAgQXVkaW9GaWxlUGxheWVyX1NldFN0b3BGcmFtZSAoQXVkaW9GaWxlUGxheWVyICphZnAsIGludCBmcmFtZSkKLXsKLSAgICBTSW50NjQgcG9zaXRpb24gID0gZnJhbWUgKiAyMzUyOwotICAgIAotICAgIGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXItPlNldEVuZE9mRmlsZSAoYWZwLT5tQXVkaW9GaWxlTWFuYWdlciwgcG9zaXRpb24pOwotfQotICAgIAotdm9pZCBkZWxldGVfQXVkaW9GaWxlUGxheWVyKEF1ZGlvRmlsZVBsYXllciAqYWZwKQotewotICAgIGlmIChhZnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGFmcC0+RGlzY29ubmVjdChhZnApOwotICAgICAgICAKLSAgICAgICAgaWYgKGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXIpIHsKLSAgICAgICAgICAgIGRlbGV0ZV9BdWRpb0ZpbGVNYW5hZ2VyKGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXIpOwotICAgICAgICAgICAgYWZwLT5tQXVkaW9GaWxlTWFuYWdlciA9IDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgaWYgKGFmcC0+bUZvcmtSZWZOdW0pIHsKLSAgICAgICAgICAgIEZTQ2xvc2VGb3JrIChhZnAtPm1Gb3JrUmVmTnVtKTsKLSAgICAgICAgICAgIGFmcC0+bUZvcmtSZWZOdW0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIFNETF9mcmVlKGFmcCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50ICAgIEF1ZGlvRmlsZVBsYXllcl9Db25uZWN0KEF1ZGlvRmlsZVBsYXllciAqYWZwKQotewotI2lmIERFQlVHCi0gICAgcHJpbnRmICgiQ29ubmVjdDoleCwgZW5nYWdlZD0lZFxuIiwgKGludClhZnAtPm1QbGF5VW5pdCwgKGFmcC0+bUNvbm5lY3RlZCA/IDEgOiAwKSk7Ci0jZW5kaWYKLSAgICBpZiAoIWFmcC0+bUNvbm5lY3RlZCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgICAgaWYgKCFhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyLT5Eb0Nvbm5lY3QoYWZwLT5tQXVkaW9GaWxlTWFuYWdlcikpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvKiBzZXQgdGhlIHJlbmRlciBjYWxsYmFjayBmb3IgdGhlIGZpbGUgZGF0YSB0byBiZSBzdXBwbGllZCB0byB0aGUgc291bmQgY29udmVydGVyIEFVICovCi0gICAgICAgIGFmcC0+bUlucHV0Q2FsbGJhY2suaW5wdXRQcm9jID0gYWZwLT5tQXVkaW9GaWxlTWFuYWdlci0+RmlsZUlucHV0UHJvYzsKLSAgICAgICAgYWZwLT5tSW5wdXRDYWxsYmFjay5pbnB1dFByb2NSZWZDb24gPSBhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyOwotCi0gICAgICAgIE9TU3RhdHVzIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5IChhZnAtPm1QbGF5VW5pdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1NldElucHV0Q2FsbGJhY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRTY29wZV9JbnB1dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZwLT5tSW5wdXRDYWxsYmFjaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFmcC0+bUlucHV0Q2FsbGJhY2spKTsKLSAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7ICAvKlRIUk9XX1JFU1VMVCgiQXVkaW9Vbml0U2V0UHJvcGVydHkiKSovCi0gICAgICAgIGFmcC0+bUNvbm5lY3RlZCA9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qIHdhcm5pbmcgbm90ZWQsIG5vdyBwbGVhc2UgZ28gYXdheSA7LSkgKi8KLS8qICN3YXJuaW5nIFRoaXMgc2hvdWxkIHJlZGlyZWN0IHRoZSBjYWxsaW5nIG9mIG5vdGlmaWNhdGlvbiBjb2RlIHRvIHNvbWUgb3RoZXIgdGhyZWFkICovCi1zdGF0aWMgdm9pZCAgICBBdWRpb0ZpbGVQbGF5ZXJfRG9Ob3RpZmljYXRpb24gKEF1ZGlvRmlsZVBsYXllciAqYWZwLCBPU1N0YXR1cyBpblN0YXR1cykKLXsKLSAgICBpZiAoYWZwLT5tTm90aWZpZXIpIHsKLSAgICAgICAgKCphZnAtPm1Ob3RpZmllcikgKGFmcC0+bVJlZkNvbiwgaW5TdGF0dXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFNETF9TZXRFcnJvciAoIk5vdGlmaWNhdGlvbiBwb3N0ZWQgd2l0aCBubyBub3RpZmllciBpbiBwbGFjZSIpOwotICAgICAgICAKLSAgICAgICAgaWYgKGluU3RhdHVzID09IGtBdWRpb0ZpbGVQbGF5X0ZpbGVJc0ZpbmlzaGVkKQotICAgICAgICAgICAgYWZwLT5EaXNjb25uZWN0KGFmcCk7Ci0gICAgICAgIGVsc2UgaWYgKGluU3RhdHVzICE9IGtBdWRpb0ZpbGVQbGF5RXJyX0ZpbGVQbGF5VW5kZXJydW4pCi0gICAgICAgICAgICBhZnAtPkRpc2Nvbm5lY3QoYWZwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkICAgIEF1ZGlvRmlsZVBsYXllcl9EaXNjb25uZWN0IChBdWRpb0ZpbGVQbGF5ZXIgKmFmcCkKLXsKLSNpZiBERUJVRwotICAgIHByaW50ZiAoIkRpc2Nvbm5lY3Q6JXgsJWxkLCBlbmdhZ2VkPSVkXG4iLCAoaW50KWFmcC0+bVBsYXlVbml0LCAwLCAoYWZwLT5tQ29ubmVjdGVkID8gMSA6IDApKTsKLSNlbmRpZgotICAgIGlmIChhZnAtPm1Db25uZWN0ZWQpCi0gICAgewotICAgICAgICBhZnAtPm1Db25uZWN0ZWQgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgIGFmcC0+bUlucHV0Q2FsbGJhY2suaW5wdXRQcm9jID0gMDsKLSAgICAgICAgYWZwLT5tSW5wdXRDYWxsYmFjay5pbnB1dFByb2NSZWZDb24gPSAwOwotICAgICAgICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSAoYWZwLT5tUGxheVVuaXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9TZXRJbnB1dENhbGxiYWNrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0U2NvcGVfSW5wdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmcC0+bUlucHV0Q2FsbGJhY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhZnAtPm1JbnB1dENhbGxiYWNrKSk7Ci0gICAgICAgIGlmIChyZXN1bHQpIAotICAgICAgICAgICAgU0RMX1NldEVycm9yICgiQXVkaW9Vbml0U2V0UHJvcGVydHk6UmVtb3ZlSW5wdXRDYWxsYmFjazolbGQiLCByZXN1bHQpOwotCi0gICAgICAgIGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXItPkRpc2Nvbm5lY3QoYWZwLT5tQXVkaW9GaWxlTWFuYWdlcik7Ci0gICAgfQotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUludDMyIG9mZnNldDsKLSAgICBVSW50MzIgYmxvY2tTaXplOwotfSBTU05ERGF0YTsKLQotc3RhdGljIGludCAgICBBdWRpb0ZpbGVQbGF5ZXJfT3BlbkZpbGUgKEF1ZGlvRmlsZVBsYXllciAqYWZwLCBjb25zdCBGU1JlZiAqaW5SZWYsIFNJbnQ2NCAqb3V0RmlsZURhdGFTaXplKQotewotICAgIENvbnRhaW5lckNodW5rIGNodW5rSGVhZGVyOwotICAgIENodW5rSGVhZGVyIGNodW5rOwotICAgIFNTTkREYXRhIHNzbmREYXRhOwotCi0gICAgT1NFcnIgcmVzdWx0OwotICAgIEhGU1VuaVN0cjI1NSBkZk5hbWU7Ci0gICAgQnl0ZUNvdW50IGFjdHVhbDsKLSAgICBTSW50NjQgb2Zmc2V0OwotCi0gICAgLyogT3BlbiB0aGUgZGF0YSBmb3JrIG9mIHRoZSBpbnB1dCBmaWxlICovCi0gICAgcmVzdWx0ID0gRlNHZXREYXRhRm9ya05hbWUoJmRmTmFtZSk7Ci0gICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJBdWRpb0ZpbGVQbGF5ZXI6Ok9wZW5GaWxlKCk6IEZTR2V0RGF0YUZvcmtOYW1lIikqLwotCi0gICAgcmVzdWx0ID0gRlNPcGVuRm9yayhpblJlZiwgZGZOYW1lLmxlbmd0aCwgZGZOYW1lLnVuaWNvZGUsIGZzUmRQZXJtLCAmYWZwLT5tRm9ya1JlZk51bSk7Ci0gICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJBdWRpb0ZpbGVQbGF5ZXI6Ok9wZW5GaWxlKCk6IEZTT3BlbkZvcmsiKSovCi0gCi0gICAgLyogUmVhZCB0aGUgZmlsZSBoZWFkZXIsIGFuZCBjaGVjayBpZiBpdCdzIGluZGVlZCBhbiBBSUZDIGZpbGUgKi8KLSAgICByZXN1bHQgPSBGU1JlYWRGb3JrKGFmcC0+bUZvcmtSZWZOdW0sIGZzQXRNYXJrLCAwLCBzaXplb2YoY2h1bmtIZWFkZXIpLCAmY2h1bmtIZWFkZXIsICZhY3R1YWwpOwotICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgiQXVkaW9GaWxlUGxheWVyOjpPcGVuRmlsZSgpOiBGU1JlYWRGb3JrIikqLwotCi0gICAgaWYgKGNodW5rSGVhZGVyLmNrSUQgIT0gJ0ZPUk0nKSB7Ci0gICAgICAgIHJlc3VsdCA9IC0xOwotICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gMDsgLypUSFJPV19SRVNVTFQoIkF1ZGlvRmlsZVBsYXllcjo6T3BlbkZpbGUoKTogY2h1bmsgaWQgaXMgbm90ICdGT1JNJyIpOyovCi0gICAgfQotCi0gICAgaWYgKGNodW5rSGVhZGVyLmZvcm1UeXBlICE9ICdBSUZDJykgewotICAgICAgICByZXN1bHQgPSAtMTsKLSAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJBdWRpb0ZpbGVQbGF5ZXI6Ok9wZW5GaWxlKCk6IGZpbGUgZm9ybWF0IGlzIG5vdCAnQUlGQyciKTsqLwotICAgIH0KLQotICAgIC8qIFNlYXJjaCBmb3IgdGhlIFNTTkQgY2h1bmsuIFdlIGlnbm9yZSBhbGwgY29tcHJlc3Npb24gZXRjLiBpbmZvcm1hdGlvbgotICAgICAgIGluIG90aGVyIGNodW5rcy4gT2YgY291cnNlIHRoYXQgaXMga2luZCBvZiBldmlsLCBidXQgZm9yIG5vdyB3ZSBhcmUgbGF6eQotICAgICAgIGFuZCByZWx5IG9uIHRoZSBjZGZzIHRvIGFsd2F5cyBnaXZlIHVzIHRoZSBzYW1lIGZpeGVkIGZvcm1hdC4KLSAgICAgICBUT0RPOiBQYXJzZSB0aGUgQ09NTSBjaHVuayB3ZSBjdXJyZW50bHkgc2tpcCB0byBmaWxsIGluIG1GaWxlRGVzY3JpcHRpb24uCi0gICAgKi8KLSAgICBvZmZzZXQgPSAwOwotICAgIGRvIHsKLSAgICAgICAgcmVzdWx0ID0gRlNSZWFkRm9yayhhZnAtPm1Gb3JrUmVmTnVtLCBmc0Zyb21NYXJrLCBvZmZzZXQsIHNpemVvZihjaHVuayksICZjaHVuaywgJmFjdHVhbCk7Ci0gICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgiQXVkaW9GaWxlUGxheWVyOjpPcGVuRmlsZSgpOiBGU1JlYWRGb3JrIikqLwotICAgICAgICAgICAgCi0gICAgICAgIC8qIFNraXAgdGhlIGNodW5rIGRhdGEgKi8KLSAgICAgICAgb2Zmc2V0ID0gY2h1bmsuY2tTaXplOwotICAgIH0gd2hpbGUgKGNodW5rLmNrSUQgIT0gJ1NTTkQnKTsKLQotICAgIC8qIFJlYWQgdGhlIGhlYWRlciBvZiB0aGUgU1NORCBjaHVuay4gQWZ0ZXIgdGhpcywgd2UgYXJlIHBvc2l0aW9uZWQgcmlnaHQKLSAgICAgICBhdCB0aGUgc3RhcnQgb2YgdGhlIGF1ZGlvIGRhdGEuICovCi0gICAgcmVzdWx0ID0gRlNSZWFkRm9yayhhZnAtPm1Gb3JrUmVmTnVtLCBmc0F0TWFyaywgMCwgc2l6ZW9mKHNzbmREYXRhKSwgJnNzbmREYXRhLCAmYWN0dWFsKTsKLSAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gMDsgLypUSFJPV19SRVNVTFQoIkF1ZGlvRmlsZVBsYXllcjo6T3BlbkZpbGUoKTogRlNSZWFkRm9yayIpKi8KLQotICAgIHJlc3VsdCA9IEZTU2V0Rm9ya1Bvc2l0aW9uKGFmcC0+bUZvcmtSZWZOdW0sIGZzRnJvbU1hcmssIHNzbmREYXRhLm9mZnNldCk7Ci0gICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJBdWRpb0ZpbGVQbGF5ZXI6Ok9wZW5GaWxlKCk6IEZTU2V0Rm9ya1Bvc2l0aW9uIikqLwotCi0gICAgLyogRGF0YSBzaXplICovCi0gICAgKm91dEZpbGVEYXRhU2l6ZSA9IGNodW5rLmNrU2l6ZSAtIHNzbmREYXRhLm9mZnNldCAtIDg7Ci0KLSAgICAvKiBGaWxlIGZvcm1hdCAqLwotICAgIGFmcC0+bUZpbGVEZXNjcmlwdGlvbi5tU2FtcGxlUmF0ZSA9IDQ0MTAwOwotICAgIGFmcC0+bUZpbGVEZXNjcmlwdGlvbi5tRm9ybWF0SUQgPSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ007Ci0gICAgYWZwLT5tRmlsZURlc2NyaXB0aW9uLm1Gb3JtYXRGbGFncyA9IGtMaW5lYXJQQ01Gb3JtYXRGbGFnSXNQYWNrZWQgfCBrTGluZWFyUENNRm9ybWF0RmxhZ0lzU2lnbmVkSW50ZWdlcjsKLSAgICBhZnAtPm1GaWxlRGVzY3JpcHRpb24ubUJ5dGVzUGVyUGFja2V0ID0gNDsKLSAgICBhZnAtPm1GaWxlRGVzY3JpcHRpb24ubUZyYW1lc1BlclBhY2tldCA9IDE7Ci0gICAgYWZwLT5tRmlsZURlc2NyaXB0aW9uLm1CeXRlc1BlckZyYW1lID0gNDsKLSAgICBhZnAtPm1GaWxlRGVzY3JpcHRpb24ubUNoYW5uZWxzUGVyRnJhbWUgPSAyOwotICAgIGFmcC0+bUZpbGVEZXNjcmlwdGlvbi5tQml0c1BlckNoYW5uZWwgPSAxNjsKLQotICAgIHJldHVybiAxOwotfQotCi1BdWRpb0ZpbGVQbGF5ZXIgKm5ld19BdWRpb0ZpbGVQbGF5ZXIgKGNvbnN0IEZTUmVmICppbkZpbGVSZWYpCi17Ci0gICAgU0ludDY0IGZpbGVEYXRhU2l6ZSAgPSAwOwotCi0gICAgQXVkaW9GaWxlUGxheWVyICphZnAgPSAoQXVkaW9GaWxlUGxheWVyICopIFNETF9tYWxsb2Moc2l6ZW9mIChBdWRpb0ZpbGVQbGF5ZXIpKTsKLSAgICBpZiAoYWZwID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIFNETF9tZW1zZXQoYWZwLCAnXDAnLCBzaXplb2YgKCphZnApKTsKLQotICAgICNkZWZpbmUgU0VUX0FVRElPRklMRVBMQVlFUl9NRVRIT0QobSkgYWZwLT5tID0gQXVkaW9GaWxlUGxheWVyXyMjbQotICAgIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9EKFNldERlc3RpbmF0aW9uKTsKLSAgICBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRChTZXROb3RpZmllcik7Ci0gICAgU0VUX0FVRElPRklMRVBMQVlFUl9NRVRIT0QoU2V0U3RhcnRGcmFtZSk7Ci0gICAgU0VUX0FVRElPRklMRVBMQVlFUl9NRVRIT0QoR2V0Q3VycmVudEZyYW1lKTsKLSAgICBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRChTZXRTdG9wRnJhbWUpOwotICAgIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9EKENvbm5lY3QpOwotICAgIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9EKERpc2Nvbm5lY3QpOwotICAgIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9EKERvTm90aWZpY2F0aW9uKTsKLSAgICBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRChJc0Nvbm5lY3RlZCk7Ci0gICAgU0VUX0FVRElPRklMRVBMQVlFUl9NRVRIT0QoR2V0RGVzdFVuaXQpOwotICAgIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9EKFByaW50KTsKLSAgICBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRChPcGVuRmlsZSk7Ci0gICAgI3VuZGVmIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9ECi0KLSAgICBpZiAoIWFmcC0+T3BlbkZpbGUgKGFmcCwgaW5GaWxlUmVmLCAmZmlsZURhdGFTaXplKSkKLSAgICB7Ci0gICAgICAgIFNETF9mcmVlKGFmcCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAgICAgCi0gICAgLyogd2Ugd2FudCBhYm91dCA0IHNlY29uZHMgd29ydGggb2YgZGF0YSBmb3IgdGhlIGJ1ZmZlciAqLwotICAgIGludCBieXRlc1BlclNlY29uZCA9IChVSW50MzIpICg0ICogYWZwLT5tRmlsZURlc2NyaXB0aW9uLm1TYW1wbGVSYXRlICogYWZwLT5tRmlsZURlc2NyaXB0aW9uLm1CeXRlc1BlckZyYW1lKTsKLSAgICAKLSNpZiBERUJVRwotICAgIHByaW50ZigiRmlsZSBmb3JtYXQ6XG4iKTsKLSAgICBQcmludFN0cmVhbURlc2MgKCZhZnAtPm1GaWxlRGVzY3JpcHRpb24pOwotI2VuZGlmCi0gICAgCi0gICAgYWZwLT5tQXVkaW9GaWxlTWFuYWdlciA9IG5ld19BdWRpb0ZpbGVNYW5hZ2VyKGFmcCwgYWZwLT5tRm9ya1JlZk51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZURhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0gICAgaWYgKGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZV9BdWRpb0ZpbGVQbGF5ZXIoYWZwKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmcDsKLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvc3gvQXVkaW9GaWxlUGxheWVyLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9BdWRpb0ZpbGVQbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3ZWIxOS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9BdWRpb0ZpbGVQbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0KLSAgICBUaGlzIGZpbGUgYmFzZWQgb24gQXBwbGUgc2FtcGxlIGNvZGUuIFdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgZmlsZSBuYW1lLCAKLSAgICBzbyBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgaXQgb24gYXBwbGUuY29tL2RldmVsb3BlcgotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gICAgQXVkaW9GaWxlUGxheWVyLmgKLSovCi0jaWZuZGVmIF9fQXVkaW9GaWxlUGxheWVyX0hfXwotI2RlZmluZSBfX0F1ZGlvRmlsZVBsYXllcl9IX18KLQotI2luY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLQotI2luY2x1ZGUgPEF1ZGlvVW5pdC9BdWRpb1VuaXQuaD4KLQotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotCi1jb25zdCBjaGFyKiBBdWRpb0ZpbGVQbGF5ZXJFcnJvclN0ciAoT1NTdGF0dXMgZXJyb3IpOwotCi0vKgotdm9pZCBUaHJvd1Jlc3VsdCAoT1NTdGF0dXMgcmVzdWx0LCBjb25zdCBjaGFyICpzdHIpOwotCi0jZGVmaW5lIFRIUk9XX1JFU1VMVChzdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChyZXN1bHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVGhyb3dSZXN1bHQgKHJlc3VsdCwgc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotKi8KLQotdHlwZWRlZiB2b2lkICgqQXVkaW9GaWxlUGxheU5vdGlmaWVyKSh2b2lkICAgICAgICAgICppblJlZkNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TU3RhdHVzICAgICAgICBpblN0YXR1cyk7Ci0KLWVudW0gewotICAgIGtBdWRpb0ZpbGVQbGF5RXJyX0ZpbGVQbGF5VW5kZXJydW4gPSAtMTAwMDAsCi0gICAga0F1ZGlvRmlsZVBsYXlfRmlsZUlzRmluaXNoZWQgPSAtMTAwMDEsCi0gICAga0F1ZGlvRmlsZVBsYXlfUGxheWVySXNVbmluaXRpYWxpemVkID0gLTEwMDAyCi19OwotCi0KLXN0cnVjdCBTX0F1ZGlvRmlsZU1hbmFnZXI7Ci0KLSNwcmFnbWEgbWFyayBfX19fX19fX19fIEF1ZGlvRmlsZVBsYXllcgotdHlwZWRlZiBzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIKLXsKLS8qcHVibGljOiovCi0gICAgaW50ICAgICAgICAgICAgICgqU2V0RGVzdGluYXRpb24pKHN0cnVjdCBTX0F1ZGlvRmlsZVBsYXllciAqYWZwLCBBdWRpb1VuaXQgKmluRGVzdFVuaXQpOwotICAgIHZvaWQgICAgICAgICAgICAoKlNldE5vdGlmaWVyKShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCwgQXVkaW9GaWxlUGxheU5vdGlmaWVyIGluTm90aWZpZXIsIHZvaWQgKmluUmVmQ29uKTsKLSAgICB2b2lkICAgICAgICAgICAgKCpTZXRTdGFydEZyYW1lKShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCwgaW50IGZyYW1lKTsgLyogc2VlayBpbiB0aGUgZmlsZSAqLwotICAgIGludCAgICAgICAgICAgICAoKkdldEN1cnJlbnRGcmFtZSkoc3RydWN0IFNfQXVkaW9GaWxlUGxheWVyICphZnApOyAvKiBnZXQgdGhlIGN1cnJlbnQgZnJhbWUgcG9zaXRpb24gKi8KLSAgICB2b2lkICAgICAgICAgICAgKCpTZXRTdG9wRnJhbWUpKHN0cnVjdCBTX0F1ZGlvRmlsZVBsYXllciAqYWZwLCBpbnQgZnJhbWUpOyAgIC8qIHNldCBsaW1pdCBpbiB0aGUgZmlsZSAqLwotICAgIGludCAgICAgICAgICAgICAoKkNvbm5lY3QpKHN0cnVjdCBTX0F1ZGlvRmlsZVBsYXllciAqYWZwKTsKLSAgICB2b2lkICAgICAgICAgICAgKCpEaXNjb25uZWN0KShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCk7Ci0gICAgdm9pZCAgICAgICAgICAgICgqRG9Ob3RpZmljYXRpb24pKHN0cnVjdCBTX0F1ZGlvRmlsZVBsYXllciAqYWZwLCBPU1N0YXR1cyBpbkVycm9yKTsKLSAgICBpbnQgICAgICAgICAgICAgKCpJc0Nvbm5lY3RlZCkoc3RydWN0IFNfQXVkaW9GaWxlUGxheWVyICphZnApOwotICAgIEF1ZGlvVW5pdCAgICAgICAoKkdldERlc3RVbml0KShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCk7Ci0gICAgdm9pZCAgICAgICAgICAgICgqUHJpbnQpKHN0cnVjdCBTX0F1ZGlvRmlsZVBsYXllciAqYWZwKTsKLQotLypwcml2YXRlOiovCi0gICAgQXVkaW9Vbml0ICAgICAgICAgICAgICAgICAgICAgICBtUGxheVVuaXQ7Ci0gICAgU0ludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ya1JlZk51bTsKLSAgICAKLSAgICBBdWRpb1VuaXRJbnB1dENhbGxiYWNrICAgICAgICAgIG1JbnB1dENhbGxiYWNrOwotCi0gICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uICAgICBtRmlsZURlc2NyaXB0aW9uOwotICAgIAotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZDsKLSAgICAKLSAgICBzdHJ1Y3QgU19BdWRpb0ZpbGVNYW5hZ2VyKiAgICAgIG1BdWRpb0ZpbGVNYW5hZ2VyOwotICAgIAotICAgIEF1ZGlvRmlsZVBsYXlOb3RpZmllciAgICAgICAgICAgbU5vdGlmaWVyOwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvbjsKLSAgICAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydEZyYW1lOwotICAgIAotI3ByYWdtYSBtYXJrIF9fX19fX19fX18gUHJpdmF0ZV9NZXRob2RzCi0gICAgCi0gICAgaW50ICAgICAgICAgICgqT3BlbkZpbGUpKHN0cnVjdCBTX0F1ZGlvRmlsZVBsYXllciAqYWZwLCBjb25zdCBGU1JlZiAqaW5SZWYsIFNJbnQ2NCAqb3V0RmlsZVNpemUpOwotfSBBdWRpb0ZpbGVQbGF5ZXI7Ci0KLQotQXVkaW9GaWxlUGxheWVyICpuZXdfQXVkaW9GaWxlUGxheWVyKGNvbnN0IEZTUmVmICAgICppbkZpbGVSZWYpOwotdm9pZCBkZWxldGVfQXVkaW9GaWxlUGxheWVyKEF1ZGlvRmlsZVBsYXllciAqYWZwKTsKLQotCi0KLSNwcmFnbWEgbWFyayBfX19fX19fX19fIEF1ZGlvRmlsZU1hbmFnZXIKLXR5cGVkZWYgc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlcgotewotLypwdWJsaWM6Ki8KLSAgICAgICAgLyogdGhpcyBtZXRob2Qgc2hvdWxkIE5PVCBiZSBjYWxsZWQgYnkgYW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MKLSAgICAgICAgICAgYXMgaXQgaXMgY2FsbGVkIGJ5IHRoZSBwYXJlbnQncyBEaXNjb25uZWN0KCkgbWV0aG9kICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAoKkRpc2Nvbm5lY3QpKHN0cnVjdCBTX0F1ZGlvRmlsZU1hbmFnZXIgKmFmbSk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAoKkRvQ29ubmVjdCkoc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciAqYWZtKTsKLSAgICBPU1N0YXR1cyAgICAgICAgICAgICgqUmVhZCkoc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciAqYWZtLCBjaGFyICpidWZmZXIsIFVJbnQzMiAqbGVuKTsKLSAgICBjb25zdCBjaGFyKiAgICAgICAgICgqR2V0RmlsZUJ1ZmZlcikoc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciAqYWZtKTsKLSAgICBjb25zdCBBdWRpb0ZpbGVQbGF5ZXIgKigqR2V0UGFyZW50KShzdHJ1Y3QgU19BdWRpb0ZpbGVNYW5hZ2VyICphZm0pOwotICAgIHZvaWQgICAgICAgICAgICAgICAgKCpTZXRQb3NpdGlvbikoc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciAqYWZtLCBTSW50NjQgcG9zKTsgIC8qIHNlZWsvcmV3aW5kIGluIHRoZSBmaWxlICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAoKkdldEJ5dGVDb3VudGVyKShzdHJ1Y3QgU19BdWRpb0ZpbGVNYW5hZ2VyICphZm0pOyAgLyogcmV0dXJuIGFjdHVhbCBieXRlcyBzdHJlYW1lZCB0byBhdWRpbyBoYXJkd2FyZSAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgKCpTZXRFbmRPZkZpbGUpKHN0cnVjdCBTX0F1ZGlvRmlsZU1hbmFnZXIgKmFmbSwgU0ludDY0IHBvcyk7ICAvKiBzZXQgdGhlICJFT0YiICh3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgaXQgcmVhY2hlZCBlb2YpICovCi0gICAKLS8qcHJvdGVjdGVkOiovCi0gICAgQXVkaW9GaWxlUGxheWVyKiAgICBtUGFyZW50OwotICAgIFNJbnQxNiAgICAgICAgICAgICAgbUZvcmtSZWZOdW07Ci0gICAgU0ludDY0ICAgICAgICAgICAgICBtQXVkaW9EYXRhT2Zmc2V0OwotICAgIAotICAgIGNoYXIqICAgICAgICAgICAgICAgbUZpbGVCdWZmZXI7Ci0KLSAgICBpbnQgICAgICAgICAgICAgICAgIG1CeXRlQ291bnRlcjsKLQotICAgIGludCAgICAgICAgICAgICAgICBtUmVhZEZyb21GaXJzdEJ1ZmZlcjsKLSAgICBpbnQgICAgICAgICAgICAgICAgbUxvY2tVbnN1Y2Nlc3NmdWw7Ci0gICAgaW50ICAgICAgICAgICAgICAgIG1Jc0VuZ2FnZWQ7Ci0gICAgCi0gICAgaW50ICAgICAgICAgICAgICAgICBtTnVtVGltZXNBc2tlZFNpbmNlRmluaXNoZWQ7Ci0KLQotCXZvaWQqICAgICAgICAgICAgICAgbVRtcEJ1ZmZlcjsKLQlVSW50MzIgICAgICAgICAgICAgIG1CdWZmZXJTaXplOwotCVVJbnQzMiAgICAgICAgICAgICAgbUJ1ZmZlck9mZnNldDsKLS8qcHVibGljOiovCi0gICAgVUludDMyICAgICAgICAgICAgICBtQ2h1bmtTaXplOwotICAgIFNJbnQ2NCAgICAgICAgICAgICAgbUZpbGVMZW5ndGg7Ci0gICAgU0ludDY0ICAgICAgICAgICAgICBtUmVhZEZpbGVQb3NpdGlvbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1Xcml0ZVRvRmlyc3RCdWZmZXI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtRmluaXNoZWRSZWFkaW5nRGF0YTsKLQotLypwcm90ZWN0ZWQ6Ki8KLSAgICBPU1N0YXR1cyAgICAgICAgICAgICgqUmVuZGVyKShzdHJ1Y3QgU19BdWRpb0ZpbGVNYW5hZ2VyICphZm0sIEF1ZGlvQnVmZmVyICppb0RhdGEpOwotICAgIE9TU3RhdHVzICAgICAgICAgICAgKCpHZXRGaWxlRGF0YSkoc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciAqYWZtLCB2b2lkKiogaW5PdXREYXRhLCBVSW50MzIgKmluT3V0RGF0YVNpemUpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgKCpBZnRlclJlbmRlcikoc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciAqYWZtKTsKLQotLypwdWJsaWM6Ki8KLSAgICAvKnN0YXRpYyovCi0gICAgT1NTdGF0dXMgICAgICAgICAgICAoKkZpbGVJbnB1dFByb2MpKHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppblJlZkNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MgICAgICBpbkFjdGlvbkZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAgICAgICAgICAgICppblRpbWVTdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1c051bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXIgICAgICAgICAgICAgICAgICAgICAqaW9EYXRhKTsKLX0gQXVkaW9GaWxlTWFuYWdlcjsKLQotCi1BdWRpb0ZpbGVNYW5hZ2VyICpuZXdfQXVkaW9GaWxlTWFuYWdlciAoQXVkaW9GaWxlUGxheWVyICppblBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICBTSW50MTYgICAgICAgICAgaW5Gb3JrUmVmTnVtLCAKLSAgICAgICAgICAgICAgICAgICAgICBTSW50NjQgICAgICAgICAgaW5GaWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICBpbkNodW5rU2l6ZSk7Ci0gICAgCi12b2lkIGRlbGV0ZV9BdWRpb0ZpbGVNYW5hZ2VyKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSk7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9BdWRpb0ZpbGVSZWFkZXJUaHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L0F1ZGlvRmlsZVJlYWRlclRocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdmZTliLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L0F1ZGlvRmlsZVJlYWRlclRocmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotCi0gICAgVGhpcyBmaWxlIGJhc2VkIG9uIEFwcGxlIHNhbXBsZSBjb2RlLiBXZSBoYXZlbid0IGNoYW5nZWQgdGhlIGZpbGUgbmFtZSwgCi0gICAgc28gaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGl0IG9uIGFwcGxlLmNvbS9kZXZlbG9wZXIKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgQXVkaW9GaWxlTWFuYWdlci5jcHAKLSovCi0jaW5jbHVkZSAiQXVkaW9GaWxlUGxheWVyLmgiCi0jaW5jbHVkZSA8bWFjaC9tYWNoLmg+IC8qIHVzZWQgZm9yIHNldHRpbmcgcG9saWN5IG9mIHRocmVhZCAqLwotI2luY2x1ZGUgIlNETE9TWENBR3VhcmQuaCIKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLS8qI2luY2x1ZGUgPGxpc3Q+Ki8KLQotLyp0eXBlZGVmIHZvaWQgKkZpbGVEYXRhOyovCi10eXBlZGVmIHN0cnVjdCBTX0ZpbGVEYXRhCi17Ci0gICAgQXVkaW9GaWxlTWFuYWdlciAqb2JqOwotICAgIHN0cnVjdCBTX0ZpbGVEYXRhICpuZXh0OwotfSBGaWxlRGF0YTsKLQotCi10eXBlZGVmIHN0cnVjdCBTX0ZpbGVSZWFkZXJUaHJlYWQgewotLypwdWJsaWM6Ki8KLSAgICBTRExPU1hDQUd1YXJkKiAgICAgICAgICAgICAgICAgICAgKCpHZXRHdWFyZCkoc3RydWN0IFNfRmlsZVJlYWRlclRocmVhZCAqZnJ0KTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpBZGRSZWFkZXIpKHN0cnVjdCBTX0ZpbGVSZWFkZXJUaHJlYWQgKmZydCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqUmVtb3ZlUmVhZGVyKShzdHJ1Y3QgU19GaWxlUmVhZGVyVGhyZWFkICpmcnQsIEF1ZGlvRmlsZU1hbmFnZXIqIGluSXRlbSk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICgqVHJ5TmV4dFJlYWQpKHN0cnVjdCBTX0ZpbGVSZWFkZXJUaHJlYWQgKmZydCwgQXVkaW9GaWxlTWFuYWdlciogaW5JdGVtKTsKLQotICAgIGludCAgICAgbVRocmVhZFNob3VsZERpZTsKLSAgICAKLS8qcHJpdmF0ZToqLwotICAgIC8qdHlwZWRlZiBzdGQ6Omxpc3Q8QXVkaW9GaWxlTWFuYWdlcio+IEZpbGVEYXRhOyovCi0KLSAgICBTRExPU1hDQUd1YXJkICAgICAgICAgICAgICptR3VhcmQ7Ci0gICAgVUludDMyICAgICAgICAgICAgICBtVGhyZWFkUHJpb3JpdHk7Ci0gICAgCi0gICAgaW50ICAgICAgICAgICAgICAgICBtTnVtUmVhZGVyczsgICAgCi0gICAgRmlsZURhdGEgICAgICAgICAgICAqbUZpbGVEYXRhOwotCi0KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpSZWFkTmV4dENodW5rKShzdHJ1Y3QgU19GaWxlUmVhZGVyVGhyZWFkICpmcnQpOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAoKlN0YXJ0Rml4ZWRQcmlvcml0eVRocmVhZCkoc3RydWN0IFNfRmlsZVJlYWRlclRocmVhZCAqZnJ0KTsKLSAgICAvKnN0YXRpYyovCi0gICAgVUludDMyICAgICAgICAgICAgICAgKCpHZXRUaHJlYWRCYXNlUHJpb3JpdHkpKHB0aHJlYWRfdCBpblRocmVhZCk7Ci0gICAgLypzdGF0aWMqLwotICAgIHZvaWQqICAgICAgICAgICAgICAgICgqRGlza1JlYWRlckVudHJ5KSh2b2lkICppblJlZkNvbik7Ci19IEZpbGVSZWFkZXJUaHJlYWQ7Ci0KLQotc3RhdGljIFNETE9TWENBR3VhcmQqIEZpbGVSZWFkZXJUaHJlYWRfR2V0R3VhcmQoRmlsZVJlYWRlclRocmVhZCAqZnJ0KQotewotICAgIHJldHVybiBmcnQtPm1HdWFyZDsKLX0KLQotLyogcmV0dXJucyAxIGlmIHN1Y2NlZWRlZCAqLwotc3RhdGljIGludCBGaWxlUmVhZGVyVGhyZWFkX1RyeU5leHRSZWFkIChGaWxlUmVhZGVyVGhyZWFkICpmcnQsIEF1ZGlvRmlsZU1hbmFnZXIqIGluSXRlbSkKLXsKLSAgICBpbnQgZGlkTG9jayA9IDA7Ci0gICAgaW50IHN1Y2NlZWRlZCA9IDA7Ci0gICAgaWYgKGZydC0+bUd1YXJkLT5UcnkoZnJ0LT5tR3VhcmQsICZkaWRMb2NrKSkKLSAgICB7Ci0gICAgICAgIC8qZnJ0LT5tRmlsZURhdGEucHVzaF9iYWNrIChpbkl0ZW0pOyovCi0gICAgICAgIC8qICEhISBGSVhNRTogdGhpcyBjb3VsZCBiZSBmYXN0ZXIgd2l0aCBhICJ0YWlsIiBtZW1iZXIuIC0tcnlhbi4gKi8KLSAgICAgICAgRmlsZURhdGEgKmkgPSBmcnQtPm1GaWxlRGF0YTsKLSAgICAgICAgRmlsZURhdGEgKnByZXYgPSBOVUxMOwotCi0gICAgICAgIEZpbGVEYXRhICpuZXdmZCA9IChGaWxlRGF0YSAqKSBTRExfbWFsbG9jKHNpemVvZiAoRmlsZURhdGEpKTsKLSAgICAgICAgbmV3ZmQtPm9iaiA9IGluSXRlbTsKLSAgICAgICAgbmV3ZmQtPm5leHQgPSBOVUxMOwotCi0gICAgICAgIHdoaWxlIChpICE9IE5VTEwpIHsgcHJldiA9IGk7IGkgPSBpLT5uZXh0OyB9Ci0gICAgICAgIGlmIChwcmV2ID09IE5VTEwpCi0gICAgICAgICAgICBmcnQtPm1GaWxlRGF0YSA9IG5ld2ZkOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmV2LT5uZXh0ID0gbmV3ZmQ7Ci0KLSAgICAgICAgZnJ0LT5tR3VhcmQtPk5vdGlmeShmcnQtPm1HdWFyZCk7Ci0gICAgICAgIHN1Y2NlZWRlZCA9IDE7Ci0KLSAgICAgICAgaWYgKGRpZExvY2spCi0gICAgICAgICAgICBmcnQtPm1HdWFyZC0+VW5sb2NrKGZydC0+bUd1YXJkKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHN1Y2NlZWRlZDsKLX0KLQotc3RhdGljIHZvaWQgICAgRmlsZVJlYWRlclRocmVhZF9BZGRSZWFkZXIoRmlsZVJlYWRlclRocmVhZCAqZnJ0KQotewotICAgIGlmIChmcnQtPm1OdW1SZWFkZXJzID09IDApCi0gICAgewotICAgICAgICBmcnQtPm1UaHJlYWRTaG91bGREaWUgPSAwOwotICAgICAgICBmcnQtPlN0YXJ0Rml4ZWRQcmlvcml0eVRocmVhZCAoZnJ0KTsKLSAgICB9Ci0gICAgZnJ0LT5tTnVtUmVhZGVycysrOwotfQotCi1zdGF0aWMgdm9pZCAgICBGaWxlUmVhZGVyVGhyZWFkX1JlbW92ZVJlYWRlciAoRmlsZVJlYWRlclRocmVhZCAqZnJ0LCBBdWRpb0ZpbGVNYW5hZ2VyKiBpbkl0ZW0pCi17Ci0gICAgaWYgKGZydC0+bU51bVJlYWRlcnMgPiAwKQotICAgIHsKLSAgICAgICAgaW50IGJOZWVkc1JlbGVhc2UgPSBmcnQtPm1HdWFyZC0+TG9jayhmcnQtPm1HdWFyZCk7Ci0gICAgICAgIAotICAgICAgICAvKmZydC0+bUZpbGVEYXRhLnJlbW92ZSAoaW5JdGVtKTsqLwotICAgICAgICBGaWxlRGF0YSAqaSA9IGZydC0+bUZpbGVEYXRhOwotICAgICAgICBGaWxlRGF0YSAqcHJldiA9IE5VTEw7Ci0gICAgICAgIHdoaWxlIChpICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVEYXRhICpuZXh0ID0gaS0+bmV4dDsKLSAgICAgICAgICAgIGlmIChpLT5vYmogIT0gaW5JdGVtKQotICAgICAgICAgICAgICAgIHByZXYgPSBpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcmV2ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGZydC0+bUZpbGVEYXRhID0gbmV4dDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBuZXh0OwotICAgICAgICAgICAgICAgIFNETF9mcmVlKGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSA9IG5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoLS1mcnQtPm1OdW1SZWFkZXJzID09IDApIHsKLSAgICAgICAgICAgIGZydC0+bVRocmVhZFNob3VsZERpZSA9IDE7Ci0gICAgICAgICAgICBmcnQtPm1HdWFyZC0+Tm90aWZ5KGZydC0+bUd1YXJkKTsgLyogd2FrZSB1cCB0aHJlYWQgc28gaXQgd2lsbCBxdWl0ICovCi0gICAgICAgICAgICBmcnQtPm1HdWFyZC0+V2FpdChmcnQtPm1HdWFyZCk7ICAgLyogd2FpdCBmb3IgdGhyZWFkIHRvIGRpZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJOZWVkc1JlbGVhc2UpIGZydC0+bUd1YXJkLT5VbmxvY2soZnJ0LT5tR3VhcmQpOwotICAgIH0gICAKLX0KLQotc3RhdGljIGludCAgICBGaWxlUmVhZGVyVGhyZWFkX1N0YXJ0Rml4ZWRQcmlvcml0eVRocmVhZCAoRmlsZVJlYWRlclRocmVhZCAqZnJ0KQotewotICAgIHB0aHJlYWRfYXR0cl90ICAgICAgdGhlVGhyZWFkQXR0cnM7Ci0gICAgcHRocmVhZF90ICAgICAgICAgICBwVGhyZWFkOwotCi0gICAgT1NTdGF0dXMgcmVzdWx0ID0gcHRocmVhZF9hdHRyX2luaXQoJnRoZVRocmVhZEF0dHJzKTsKLSAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJwdGhyZWFkX2F0dHJfaW5pdCAtIFRocmVhZCBhdHRyaWJ1dGVzIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIpKi8KLSAgICAKLSAgICByZXN1bHQgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnRoZVRocmVhZEF0dHJzLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7Ci0gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgicHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlIC0gVGhyZWFkIGF0dHJpYnV0ZXMgY291bGQgbm90IGJlIGRldGFjaGVkLiIpKi8KLSAgICAKLSAgICByZXN1bHQgPSBwdGhyZWFkX2NyZWF0ZSAoJnBUaHJlYWQsICZ0aGVUaHJlYWRBdHRycywgZnJ0LT5EaXNrUmVhZGVyRW50cnksIGZydCk7Ci0gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgicHRocmVhZF9jcmVhdGUgLSBDcmVhdGUgYW5kIHN0YXJ0IHRoZSB0aHJlYWQuIikqLwotICAgIAotICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aGVUaHJlYWRBdHRycyk7Ci0gICAgCi0gICAgLyogd2UndmUgbm93IGNyZWF0ZWQgdGhlIHRocmVhZCBhbmQgc3RhcnRlZCBpdAotICAgICAgIHdlJ2xsIG5vdyBzZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdG8gdGhlIG5vbWluYXRlZCBwcmlvcml0eQotICAgICAgIGFuZCB3ZSdsbCBhbHNvIG1ha2UgdGhlIHRocmVhZCBmaXhlZCAqLwotICAgIHRocmVhZF9leHRlbmRlZF9wb2xpY3lfZGF0YV90ICAgICAgIHRoZUZpeGVkUG9saWN5OwotICAgIHRocmVhZF9wcmVjZWRlbmNlX3BvbGljeV9kYXRhX3QgICAgIHRoZVByZWNlZGVuY2VQb2xpY3k7Ci0gICAgU0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQcmlvcml0eTsKLSAgICAKLSAgICAvKiBtYWtlIHRocmVhZCBmaXhlZCAqLwotICAgIHRoZUZpeGVkUG9saWN5LnRpbWVzaGFyZSA9IDA7ICAgLyogc2V0IHRvIDEgZm9yIGEgbm9uLWZpeGVkIHRocmVhZCAqLwotICAgIHJlc3VsdCA9IHRocmVhZF9wb2xpY3lfc2V0IChwdGhyZWFkX21hY2hfdGhyZWFkX25wKHBUaHJlYWQpLCBUSFJFQURfRVhURU5ERURfUE9MSUNZLCAodGhyZWFkX3BvbGljeV90KSZ0aGVGaXhlZFBvbGljeSwgVEhSRUFEX0VYVEVOREVEX1BPTElDWV9DT1VOVCk7Ci0gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgidGhyZWFkX3BvbGljeSAtIENvdWxkbid0IHNldCB0aHJlYWQgYXMgZml4ZWQgcHJpb3JpdHkuIikqLwotICAgIC8qIHNldCBwcmlvcml0eSAqLwotICAgIC8qIHByZWNlZGVuY3kgcG9saWN5J3MgImltcG9ydGFuY2UiIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHNwYXduaW5nIHRocmVhZCdzIHByaW9yaXR5ICovCi0gICAgcmVsYXRpdmVQcmlvcml0eSA9IGZydC0+bVRocmVhZFByaW9yaXR5IC0gZnJ0LT5HZXRUaHJlYWRCYXNlUHJpb3JpdHkocHRocmVhZF9zZWxmKCkpOwotICAgICAgICAKLSAgICB0aGVQcmVjZWRlbmNlUG9saWN5LmltcG9ydGFuY2UgPSByZWxhdGl2ZVByaW9yaXR5OwotICAgIHJlc3VsdCA9IHRocmVhZF9wb2xpY3lfc2V0IChwdGhyZWFkX21hY2hfdGhyZWFkX25wKHBUaHJlYWQpLCBUSFJFQURfUFJFQ0VERU5DRV9QT0xJQ1ksICh0aHJlYWRfcG9saWN5X3QpJnRoZVByZWNlZGVuY2VQb2xpY3ksIFRIUkVBRF9QUkVDRURFTkNFX1BPTElDWV9DT1VOVCk7Ci0gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgidGhyZWFkX3BvbGljeSAtIENvdWxkbid0IHNldCB0aHJlYWQgcHJpb3JpdHkuIikqLwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBVSW50MzIgIEZpbGVSZWFkZXJUaHJlYWRfR2V0VGhyZWFkQmFzZVByaW9yaXR5IChwdGhyZWFkX3QgaW5UaHJlYWQpCi17Ci0gICAgdGhyZWFkX2Jhc2ljX2luZm9fZGF0YV90ICAgICAgICAgICAgdGhyZWFkSW5mbzsKLSAgICBwb2xpY3lfaW5mb19kYXRhX3QgICAgICAgICAgICAgICAgICB0aGVQb2xpY3lJbmZvOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotICAgIAotICAgIC8qIGdldCBiYXNpYyBpbmZvICovCi0gICAgY291bnQgPSBUSFJFQURfQkFTSUNfSU5GT19DT1VOVDsKLSAgICB0aHJlYWRfaW5mbyAocHRocmVhZF9tYWNoX3RocmVhZF9ucCAoaW5UaHJlYWQpLCBUSFJFQURfQkFTSUNfSU5GTywgKGludGVnZXJfdCopJnRocmVhZEluZm8sICZjb3VudCk7Ci0gICAgCi0gICAgc3dpdGNoICh0aHJlYWRJbmZvLnBvbGljeSkgewotICAgICAgICBjYXNlIFBPTElDWV9USU1FU0hBUkU6Ci0gICAgICAgICAgICBjb3VudCA9IFBPTElDWV9USU1FU0hBUkVfSU5GT19DT1VOVDsKLSAgICAgICAgICAgIHRocmVhZF9pbmZvKHB0aHJlYWRfbWFjaF90aHJlYWRfbnAgKGluVGhyZWFkKSwgVEhSRUFEX1NDSEVEX1RJTUVTSEFSRV9JTkZPLCAoaW50ZWdlcl90KikmKHRoZVBvbGljeUluZm8udHMpLCAmY291bnQpOwotICAgICAgICAgICAgcmV0dXJuIHRoZVBvbGljeUluZm8udHMuYmFzZV9wcmlvcml0eTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgIGNhc2UgUE9MSUNZX0ZJRk86Ci0gICAgICAgICAgICBjb3VudCA9IFBPTElDWV9GSUZPX0lORk9fQ09VTlQ7Ci0gICAgICAgICAgICB0aHJlYWRfaW5mbyhwdGhyZWFkX21hY2hfdGhyZWFkX25wIChpblRocmVhZCksIFRIUkVBRF9TQ0hFRF9GSUZPX0lORk8sIChpbnRlZ2VyX3QqKSYodGhlUG9saWN5SW5mby5maWZvKSwgJmNvdW50KTsKLSAgICAgICAgICAgIGlmICh0aGVQb2xpY3lJbmZvLmZpZm8uZGVwcmVzc2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoZVBvbGljeUluZm8uZmlmby5kZXByZXNzX3ByaW9yaXR5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhlUG9saWN5SW5mby5maWZvLmJhc2VfcHJpb3JpdHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNlIFBPTElDWV9SUjoKLSAgICAgICAgICAgIGNvdW50ID0gUE9MSUNZX1JSX0lORk9fQ09VTlQ7Ci0gICAgICAgICAgICB0aHJlYWRfaW5mbyhwdGhyZWFkX21hY2hfdGhyZWFkX25wIChpblRocmVhZCksIFRIUkVBRF9TQ0hFRF9SUl9JTkZPLCAoaW50ZWdlcl90KikmKHRoZVBvbGljeUluZm8ucnIpLCAmY291bnQpOwotICAgICAgICAgICAgaWYgKHRoZVBvbGljeUluZm8ucnIuZGVwcmVzc2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoZVBvbGljeUluZm8ucnIuZGVwcmVzc19wcmlvcml0eTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoZVBvbGljeUluZm8ucnIuYmFzZV9wcmlvcml0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgICAgKkZpbGVSZWFkZXJUaHJlYWRfRGlza1JlYWRlckVudHJ5ICh2b2lkICppblJlZkNvbikKLXsKLSAgICBGaWxlUmVhZGVyVGhyZWFkICpmcnQgPSAoRmlsZVJlYWRlclRocmVhZCAqKWluUmVmQ29uOwotICAgIGZydC0+UmVhZE5leHRDaHVuayhmcnQpOwotICAgICNpZiBERUJVRwotICAgIHByaW50ZiAoImZpbmlzaGVkIHdpdGggcmVhZGluZyBmaWxlXG4iKTsKLSAgICAjZW5kaWYKLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgICAgRmlsZVJlYWRlclRocmVhZF9SZWFkTmV4dENodW5rIChGaWxlUmVhZGVyVGhyZWFkICpmcnQpCi17Ci0gICAgT1NTdGF0dXMgcmVzdWx0OwotICAgIFVJbnQzMiAgZGF0YUNodW5rU2l6ZTsKLSAgICBBdWRpb0ZpbGVNYW5hZ2VyKiB0aGVJdGVtID0gMDsKLQotICAgIGZvciAoOzspIAotICAgIHsKLSAgICAgICAgeyAvKiB0aGlzIGlzIGEgc2NvcGVkIGJhc2VkIGxvY2sgKi8KLSAgICAgICAgICAgIGludCBiTmVlZHNSZWxlYXNlID0gZnJ0LT5tR3VhcmQtPkxvY2soZnJ0LT5tR3VhcmQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZnJ0LT5tVGhyZWFkU2hvdWxkRGllKSB7Ci0gICAgICAgICAgICAgICAgZnJ0LT5tR3VhcmQtPk5vdGlmeShmcnQtPm1HdWFyZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJOZWVkc1JlbGVhc2UpIGZydC0+bUd1YXJkLT5VbmxvY2soZnJ0LT5tR3VhcmQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyppZiAoZnJ0LT5tRmlsZURhdGEuZW1wdHkoKSkqLwotICAgICAgICAgICAgaWYgKGZydC0+bUZpbGVEYXRhID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJ0LT5tR3VhcmQtPldhaXQoZnJ0LT5tR3VhcmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBraWxsIHRocmVhZCAqLwotICAgICAgICAgICAgaWYgKGZydC0+bVRocmVhZFNob3VsZERpZSkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZnJ0LT5tR3VhcmQtPk5vdGlmeShmcnQtPm1HdWFyZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJOZWVkc1JlbGVhc2UpIGZydC0+bUd1YXJkLT5VbmxvY2soZnJ0LT5tR3VhcmQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyp0aGVJdGVtID0gZnJ0LT5tRmlsZURhdGEuZnJvbnQoKTsqLwotICAgICAgICAgICAgLypmcnQtPm1GaWxlRGF0YS5wb3BfZnJvbnQoKTsqLwotICAgICAgICAgICAgdGhlSXRlbSA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoZnJ0LT5tRmlsZURhdGEgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlRGF0YSAqbmV4dCA9IGZydC0+bUZpbGVEYXRhLT5uZXh0OwotICAgICAgICAgICAgICAgIHRoZUl0ZW0gPSBmcnQtPm1GaWxlRGF0YS0+b2JqOwotICAgICAgICAgICAgICAgIFNETF9mcmVlKGZydC0+bUZpbGVEYXRhKTsKLSAgICAgICAgICAgICAgICBmcnQtPm1GaWxlRGF0YSA9IG5leHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChiTmVlZHNSZWxlYXNlKSBmcnQtPm1HdWFyZC0+VW5sb2NrKGZydC0+bUd1YXJkKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBpZiAoKHRoZUl0ZW0tPm1GaWxlTGVuZ3RoIC0gdGhlSXRlbS0+bVJlYWRGaWxlUG9zaXRpb24pIDwgdGhlSXRlbS0+bUNodW5rU2l6ZSkKLSAgICAgICAgICAgIGRhdGFDaHVua1NpemUgPSB0aGVJdGVtLT5tRmlsZUxlbmd0aCAtIHRoZUl0ZW0tPm1SZWFkRmlsZVBvc2l0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkYXRhQ2h1bmtTaXplID0gdGhlSXRlbS0+bUNodW5rU2l6ZTsKLSAgICAgICAgCi0gICAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBleGl0IGNvbmRpdGlvbiBmb3IgdGhlIHRocmVhZCAqLwotICAgICAgICBpZiAoZGF0YUNodW5rU2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICB0aGVJdGVtLT5tRmluaXNoZWRSZWFkaW5nRGF0YSA9IDE7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAgICAgLyogY29uc3RydWN0IHBvaW50ZXIgKi8KLSAgICAgICAgY2hhciogd3JpdGVQdHIgPSAoY2hhciAqKSAodGhlSXRlbS0+R2V0RmlsZUJ1ZmZlcih0aGVJdGVtKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGVJdGVtLT5tV3JpdGVUb0ZpcnN0QnVmZmVyID8gMCA6IHRoZUl0ZW0tPm1DaHVua1NpemUpKTsKLSAgICAKLSAgICAgICAgICAgIC8qIHJlYWQgZGF0YSAqLwotICAgICAgICByZXN1bHQgPSB0aGVJdGVtLT5SZWFkKHRoZUl0ZW0sIHdyaXRlUHRyLCAmZGF0YUNodW5rU2l6ZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbm9FcnIgJiYgcmVzdWx0ICE9IGVvZkVycikgewotICAgICAgICAgICAgQXVkaW9GaWxlUGxheWVyICphZnAgPSAoQXVkaW9GaWxlUGxheWVyICopIHRoZUl0ZW0tPkdldFBhcmVudCh0aGVJdGVtKTsKLSAgICAgICAgICAgIGFmcC0+RG9Ob3RpZmljYXRpb24oYWZwLCByZXN1bHQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChkYXRhQ2h1bmtTaXplICE9IHRoZUl0ZW0tPm1DaHVua1NpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlUHRyICs9IGRhdGFDaHVua1NpemU7Ci0KLSAgICAgICAgICAgIC8qIGNhbid0IGV4aXQgeWV0Li4gd2Ugc3RpbGwgaGF2ZSB0byBwYXNzIHRoZSBwYXJ0aWFsIGJ1ZmZlciBiYWNrICovCi0gICAgICAgICAgICBTRExfbWVtc2V0KHdyaXRlUHRyLCAwLCAodGhlSXRlbS0+bUNodW5rU2l6ZSAtIGRhdGFDaHVua1NpemUpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhlSXRlbS0+bVdyaXRlVG9GaXJzdEJ1ZmZlciA9ICF0aGVJdGVtLT5tV3JpdGVUb0ZpcnN0QnVmZmVyOyAgIC8qIHN3aXRjaCBidWZmZXJzICovCi0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IGVvZkVycikKLSAgICAgICAgICAgIHRoZUl0ZW0tPm1SZWFkRmlsZVBvc2l0aW9uID0gdGhlSXRlbS0+bUZpbGVMZW5ndGg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRoZUl0ZW0tPm1SZWFkRmlsZVBvc2l0aW9uICs9IGRhdGFDaHVua1NpemU7ICAgICAgICAvKiBpbmNyZW1lbnQgY291bnQgKi8KLSAgICB9Ci19Ci0KLXZvaWQgZGVsZXRlX0ZpbGVSZWFkZXJUaHJlYWQoRmlsZVJlYWRlclRocmVhZCAqZnJ0KQotewotICAgIGlmIChmcnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZV9TRExPU1hDQUd1YXJkKGZydC0+bUd1YXJkKTsKLSAgICAgICAgU0RMX2ZyZWUoZnJ0KTsKLSAgICB9Ci19Ci0KLUZpbGVSZWFkZXJUaHJlYWQgKm5ld19GaWxlUmVhZGVyVGhyZWFkICgpCi17Ci0gICAgRmlsZVJlYWRlclRocmVhZCAqZnJ0ID0gKEZpbGVSZWFkZXJUaHJlYWQgKikgU0RMX21hbGxvYyhzaXplb2YgKEZpbGVSZWFkZXJUaHJlYWQpKTsKLSAgICBpZiAoZnJ0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIFNETF9tZW1zZXQoZnJ0LCAnXDAnLCBzaXplb2YgKCpmcnQpKTsKLQotICAgIGZydC0+bUd1YXJkID0gbmV3X1NETE9TWENBR3VhcmQoKTsKLSAgICBpZiAoZnJ0LT5tR3VhcmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIFNETF9mcmVlKGZydCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgICNkZWZpbmUgU0VUX0ZJTEVSRUFERVJUSFJFQURfTUVUSE9EKG0pIGZydC0+bSA9IEZpbGVSZWFkZXJUaHJlYWRfIyNtCi0gICAgU0VUX0ZJTEVSRUFERVJUSFJFQURfTUVUSE9EKEdldEd1YXJkKTsKLSAgICBTRVRfRklMRVJFQURFUlRIUkVBRF9NRVRIT0QoQWRkUmVhZGVyKTsKLSAgICBTRVRfRklMRVJFQURFUlRIUkVBRF9NRVRIT0QoUmVtb3ZlUmVhZGVyKTsKLSAgICBTRVRfRklMRVJFQURFUlRIUkVBRF9NRVRIT0QoVHJ5TmV4dFJlYWQpOwotICAgIFNFVF9GSUxFUkVBREVSVEhSRUFEX01FVEhPRChSZWFkTmV4dENodW5rKTsKLSAgICBTRVRfRklMRVJFQURFUlRIUkVBRF9NRVRIT0QoU3RhcnRGaXhlZFByaW9yaXR5VGhyZWFkKTsKLSAgICBTRVRfRklMRVJFQURFUlRIUkVBRF9NRVRIT0QoR2V0VGhyZWFkQmFzZVByaW9yaXR5KTsKLSAgICBTRVRfRklMRVJFQURFUlRIUkVBRF9NRVRIT0QoRGlza1JlYWRlckVudHJ5KTsKLSAgICAjdW5kZWYgU0VUX0ZJTEVSRUFERVJUSFJFQURfTUVUSE9ECi0KLSAgICBmcnQtPm1UaHJlYWRQcmlvcml0eSA9IDYyOwotICAgIHJldHVybiBmcnQ7Ci19Ci0KLQotc3RhdGljIEZpbGVSZWFkZXJUaHJlYWQgKnNSZWFkZXJUaHJlYWQ7Ci0KLQotc3RhdGljIGludCAgICBBdWRpb0ZpbGVNYW5hZ2VyX0RvQ29ubmVjdCAoQXVkaW9GaWxlTWFuYWdlciAqYWZtKQotewotICAgIGlmICghYWZtLT5tSXNFbmdhZ2VkKQotICAgIHsKLSAgICAgICAgT1NTdGF0dXMgcmVzdWx0OwotCi0gICAgICAgIC8qYWZtLT5tUmVhZEZpbGVQb3NpdGlvbiA9IDA7Ki8KLSAgICAgICAgYWZtLT5tRmluaXNoZWRSZWFkaW5nRGF0YSA9IDA7Ci0KLSAgICAgICAgYWZtLT5tTnVtVGltZXNBc2tlZFNpbmNlRmluaXNoZWQgPSAwOwotICAgICAgICBhZm0tPm1Mb2NrVW5zdWNjZXNzZnVsID0gMDsKLSAgICAgICAgCi0gICAgICAgIFVJbnQzMiBkYXRhQ2h1bmtTaXplOwotICAgICAgICAKLSAgICAgICAgaWYgKChhZm0tPm1GaWxlTGVuZ3RoIC0gYWZtLT5tUmVhZEZpbGVQb3NpdGlvbikgPCBhZm0tPm1DaHVua1NpemUpCi0gICAgICAgICAgICBkYXRhQ2h1bmtTaXplID0gYWZtLT5tRmlsZUxlbmd0aCAtIGFmbS0+bVJlYWRGaWxlUG9zaXRpb247Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRhdGFDaHVua1NpemUgPSBhZm0tPm1DaHVua1NpemU7Ci0gICAgICAgIAotICAgICAgICByZXN1bHQgPSBhZm0tPlJlYWQoYWZtLCBhZm0tPm1GaWxlQnVmZmVyLCAmZGF0YUNodW5rU2l6ZSk7Ci0gICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgiQXVkaW9GaWxlTWFuYWdlcjo6RG9Db25uZWN0KCk6IFJlYWQiKSovCi0KLSAgICAgICAgYWZtLT5tUmVhZEZpbGVQb3NpdGlvbiArPSBkYXRhQ2h1bmtTaXplOwotICAgICAgICAgICAgICAgIAotICAgICAgICBhZm0tPm1Xcml0ZVRvRmlyc3RCdWZmZXIgPSAwOwotICAgICAgICBhZm0tPm1SZWFkRnJvbUZpcnN0QnVmZmVyID0gMTsKLQotICAgICAgICBzUmVhZGVyVGhyZWFkLT5BZGRSZWFkZXIoc1JlYWRlclRocmVhZCk7Ci0gICAgICAgIAotICAgICAgICBhZm0tPm1Jc0VuZ2FnZWQgPSAxOwotICAgIH0KLSAgICAvKgotICAgIGVsc2UKLSAgICAgICAgdGhyb3cgc3RhdGljX2Nhc3Q8T1NTdGF0dXM+KC0xKTsgKi8gLyogdGhyZWFkIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCAqLwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkICAgIEF1ZGlvRmlsZU1hbmFnZXJfRGlzY29ubmVjdCAoQXVkaW9GaWxlTWFuYWdlciAqYWZtKQotewotICAgIGlmIChhZm0tPm1Jc0VuZ2FnZWQpCi0gICAgewotICAgICAgICBzUmVhZGVyVGhyZWFkLT5SZW1vdmVSZWFkZXIgKHNSZWFkZXJUaHJlYWQsIGFmbSk7Ci0gICAgICAgIGFmbS0+bUlzRW5nYWdlZCA9IDA7Ci0gICAgfQotfQotCi1zdGF0aWMgT1NTdGF0dXMgQXVkaW9GaWxlTWFuYWdlcl9SZWFkKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSwgY2hhciAqYnVmZmVyLCBVSW50MzIgKmxlbikKLXsKLSAgICByZXR1cm4gRlNSZWFkRm9yayAoYWZtLT5tRm9ya1JlZk51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgZnNGcm9tU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGFmbS0+bVJlYWRGaWxlUG9zaXRpb24gKyBhZm0tPm1BdWRpb0RhdGFPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICpsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKLX0KLQotc3RhdGljIE9TU3RhdHVzIEF1ZGlvRmlsZU1hbmFnZXJfR2V0RmlsZURhdGEgKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSwgdm9pZCoqIGluT3V0RGF0YSwgVUludDMyICppbk91dERhdGFTaXplKQotewotICAgIGlmIChhZm0tPm1GaW5pc2hlZFJlYWRpbmdEYXRhKQotICAgIHsKLSAgICAgICAgKythZm0tPm1OdW1UaW1lc0Fza2VkU2luY2VGaW5pc2hlZDsKLSAgICAgICAgKmluT3V0RGF0YVNpemUgPSAwOwotICAgICAgICAqaW5PdXREYXRhID0gMDsKLSAgICAgICAgcmV0dXJuIG5vRXJyOwotICAgIH0KLSAgICAKLSAgICBpZiAoYWZtLT5tUmVhZEZyb21GaXJzdEJ1ZmZlciA9PSBhZm0tPm1Xcml0ZVRvRmlyc3RCdWZmZXIpIHsKLSAgICAgICAgI2lmIERFQlVHCi0gICAgICAgIHByaW50ZiAoIiogKiAqICogKiAqICogQ2FuJ3Qga2VlcCB1cCB3aXRoIHJlYWRpbmcgZmlsZVxuIik7Ci0gICAgICAgICNlbmRpZgotICAgICAgICAKLSAgICAgICAgYWZtLT5tUGFyZW50LT5Eb05vdGlmaWNhdGlvbiAoYWZtLT5tUGFyZW50LCBrQXVkaW9GaWxlUGxheUVycl9GaWxlUGxheVVuZGVycnVuKTsKLSAgICAgICAgKmluT3V0RGF0YVNpemUgPSAwOwotICAgICAgICAqaW5PdXREYXRhID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICAqaW5PdXREYXRhU2l6ZSA9IGFmbS0+bUNodW5rU2l6ZTsKLSAgICAgICAgKmluT3V0RGF0YSA9IGFmbS0+bVJlYWRGcm9tRmlyc3RCdWZmZXIgPyBhZm0tPm1GaWxlQnVmZmVyIDogKGFmbS0+bUZpbGVCdWZmZXIgKyBhZm0tPm1DaHVua1NpemUpOwotICAgIH0KLQotICAgIGFmbS0+bUxvY2tVbnN1Y2Nlc3NmdWwgPSAhc1JlYWRlclRocmVhZC0+VHJ5TmV4dFJlYWQgKHNSZWFkZXJUaHJlYWQsIGFmbSk7Ci0gICAgCi0gICAgYWZtLT5tUmVhZEZyb21GaXJzdEJ1ZmZlciA9ICFhZm0tPm1SZWFkRnJvbUZpcnN0QnVmZmVyOwotCi0gICAgcmV0dXJuIG5vRXJyOwotfQotCi1zdGF0aWMgdm9pZCAgICBBdWRpb0ZpbGVNYW5hZ2VyX0FmdGVyUmVuZGVyIChBdWRpb0ZpbGVNYW5hZ2VyICphZm0pCi17Ci0gICAgaWYgKGFmbS0+bU51bVRpbWVzQXNrZWRTaW5jZUZpbmlzaGVkID4gMCkKLSAgICB7Ci0gICAgICAgIGludCBkaWRMb2NrID0gMDsKLSAgICAgICAgU0RMT1NYQ0FHdWFyZCAqZ3VhcmQgPSBzUmVhZGVyVGhyZWFkLT5HZXRHdWFyZChzUmVhZGVyVGhyZWFkKTsKLSAgICAgICAgaWYgKGd1YXJkLT5UcnkoZ3VhcmQsICZkaWRMb2NrKSkgewotICAgICAgICAgICAgYWZtLT5tUGFyZW50LT5Eb05vdGlmaWNhdGlvbiAoYWZtLT5tUGFyZW50LCBrQXVkaW9GaWxlUGxheV9GaWxlSXNGaW5pc2hlZCk7Ci0gICAgICAgICAgICBpZiAoZGlkTG9jaykKLSAgICAgICAgICAgICAgICBndWFyZC0+VW5sb2NrKGd1YXJkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChhZm0tPm1Mb2NrVW5zdWNjZXNzZnVsKQotICAgICAgICBhZm0tPm1Mb2NrVW5zdWNjZXNzZnVsID0gIXNSZWFkZXJUaHJlYWQtPlRyeU5leHRSZWFkIChzUmVhZGVyVGhyZWFkLCBhZm0pOwotfQotCi1zdGF0aWMgdm9pZCAgICBBdWRpb0ZpbGVNYW5hZ2VyX1NldFBvc2l0aW9uIChBdWRpb0ZpbGVNYW5hZ2VyICphZm0sIFNJbnQ2NCBwb3MpCi17Ci0gICAgaWYgKHBvcyA8IDAgfHwgcG9zID49IGFmbS0+bUZpbGVMZW5ndGgpIHsKLSAgICAgICAgU0RMX1NldEVycm9yICgiQXVkaW9GaWxlTWFuYWdlcjo6U2V0UG9zaXRpb24gLSBwb3NpdGlvbiBpbnZhbGlkOiAlZCBmaWxlbGVuPSVkXG4iLCAKLSAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcG9zLCAodW5zaWduZWQgaW50KWFmbS0+bUZpbGVMZW5ndGgpOwotICAgICAgICBwb3MgPSAwOwotICAgIH0KLSAgICAgICAgCi0gICAgYWZtLT5tUmVhZEZpbGVQb3NpdGlvbiA9IHBvczsKLX0KLSAgICAKLXN0YXRpYyB2b2lkICAgIEF1ZGlvRmlsZU1hbmFnZXJfU2V0RW5kT2ZGaWxlIChBdWRpb0ZpbGVNYW5hZ2VyICphZm0sIFNJbnQ2NCBwb3MpCi17Ci0gICAgaWYgKHBvcyA8PSAwIHx8IHBvcyA+IGFmbS0+bUZpbGVMZW5ndGgpIHsKLSAgICAgICAgU0RMX1NldEVycm9yICgiQXVkaW9GaWxlTWFuYWdlcjo6U2V0RW5kT2ZGaWxlIC0gcG9zaXRpb24gYmV5b25kIGFjdHVhbCBlb2ZcbiIpOwotICAgICAgICBwb3MgPSBhZm0tPm1GaWxlTGVuZ3RoOwotICAgIH0KLSAgICAKLSAgICBhZm0tPm1GaWxlTGVuZ3RoID0gcG9zOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqQXVkaW9GaWxlTWFuYWdlcl9HZXRGaWxlQnVmZmVyKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSkKLXsKLSAgICByZXR1cm4gYWZtLT5tRmlsZUJ1ZmZlcjsKLX0KLQotY29uc3QgQXVkaW9GaWxlUGxheWVyICpBdWRpb0ZpbGVNYW5hZ2VyX0dldFBhcmVudChBdWRpb0ZpbGVNYW5hZ2VyICphZm0pCi17Ci0gICAgcmV0dXJuIGFmbS0+bVBhcmVudDsKLX0KLQotc3RhdGljIGludCBBdWRpb0ZpbGVNYW5hZ2VyX0dldEJ5dGVDb3VudGVyKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSkKLXsKLSAgICByZXR1cm4gYWZtLT5tQnl0ZUNvdW50ZXI7Ci19Ci0KLQotc3RhdGljIE9TU3RhdHVzICAgIEF1ZGlvRmlsZU1hbmFnZXJfRmlsZUlucHV0UHJvYyAodm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmluUmVmQ29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MgaW5BY3Rpb25GbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wICAgICAgICppblRpbWVTdGFtcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICBpbkJ1c051bWJlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlciAgICAgICAgICAgICAgICAqaW9EYXRhKQotewotICAgIEF1ZGlvRmlsZU1hbmFnZXIqIGFmbSA9IChBdWRpb0ZpbGVNYW5hZ2VyKilpblJlZkNvbjsKLSAgICByZXR1cm4gYWZtLT5SZW5kZXIoYWZtLCBpb0RhdGEpOwotfQotCi1zdGF0aWMgT1NTdGF0dXMgICAgQXVkaW9GaWxlTWFuYWdlcl9SZW5kZXIgKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSwgQXVkaW9CdWZmZXIgKmlvRGF0YSkKLXsKLSAgICBPU1N0YXR1cyByZXN1bHQgPSBub0VycjsKLSAgICAKLQlpZiAoYWZtLT5tQnVmZmVyT2Zmc2V0ID49IGFmbS0+bUJ1ZmZlclNpemUpIHsKLQkJcmVzdWx0ID0gYWZtLT5HZXRGaWxlRGF0YShhZm0sICZhZm0tPm1UbXBCdWZmZXIsICZhZm0tPm1CdWZmZXJTaXplKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJU0RMX1NldEVycm9yICgiQXVkaW9Db252ZXJ0ZXJGaWxsQnVmZmVyOiVsZFxuIiwgcmVzdWx0KTsKLQkJCWFmbS0+bVBhcmVudC0+RG9Ob3RpZmljYXRpb24oYWZtLT5tUGFyZW50LCByZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWFmbS0+bUJ1ZmZlck9mZnNldCA9IDA7Ci0JfQotICAgIAkKLSAgICBpZiAoaW9EYXRhLT5tRGF0YUJ5dGVTaXplID4gYWZtLT5tQnVmZmVyU2l6ZSAtIGFmbS0+bUJ1ZmZlck9mZnNldCkKLSAgICAJaW9EYXRhLT5tRGF0YUJ5dGVTaXplID0gYWZtLT5tQnVmZmVyU2l6ZSAtIGFmbS0+bUJ1ZmZlck9mZnNldDsKLSAgICBpb0RhdGEtPm1EYXRhID0gKGNoYXIgKilhZm0tPm1UbXBCdWZmZXIgKyBhZm0tPm1CdWZmZXJPZmZzZXQ7Ci0gICAgYWZtLT5tQnVmZmVyT2Zmc2V0ICs9IGlvRGF0YS0+bURhdGFCeXRlU2l6ZTsKLSAgICAKLQlhZm0tPm1CeXRlQ291bnRlciArPSBpb0RhdGEtPm1EYXRhQnl0ZVNpemU7Ci0JYWZtLT5BZnRlclJlbmRlcihhZm0pOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotdm9pZCBkZWxldGVfQXVkaW9GaWxlTWFuYWdlciAoQXVkaW9GaWxlTWFuYWdlciAqYWZtKQotewotICAgIGlmIChhZm0gIT0gTlVMTCkgewotICAgICAgICBpZiAoYWZtLT5tRmlsZUJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShhZm0tPm1GaWxlQnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNETF9mcmVlKGFmbSk7Ci0gICAgfQotfQotCi0KLUF1ZGlvRmlsZU1hbmFnZXIgKm5ld19BdWRpb0ZpbGVNYW5hZ2VyKEF1ZGlvRmlsZVBsYXllciAqaW5QYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSW50MTYgICAgICAgICAgaW5Gb3JrUmVmTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ludDY0ICAgICAgICAgIGluRmlsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICBpbkNodW5rU2l6ZSkKLXsKLSAgICBBdWRpb0ZpbGVNYW5hZ2VyICphZm07Ci0KLSAgICBpZiAoc1JlYWRlclRocmVhZCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgc1JlYWRlclRocmVhZCA9IG5ld19GaWxlUmVhZGVyVGhyZWFkKCk7Ci0gICAgICAgIGlmIChzUmVhZGVyVGhyZWFkID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBhZm0gPSAoQXVkaW9GaWxlTWFuYWdlciAqKSBTRExfbWFsbG9jKHNpemVvZiAoQXVkaW9GaWxlTWFuYWdlcikpOwotICAgIGlmIChhZm0gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgU0RMX21lbXNldChhZm0sICdcMCcsIHNpemVvZiAoKmFmbSkpOwotCi0gICAgI2RlZmluZSBTRVRfQVVESU9GSUxFTUFOQUdFUl9NRVRIT0QobSkgYWZtLT5tID0gQXVkaW9GaWxlTWFuYWdlcl8jI20KLSAgICBTRVRfQVVESU9GSUxFTUFOQUdFUl9NRVRIT0QoRGlzY29ubmVjdCk7Ci0gICAgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKERvQ29ubmVjdCk7Ci0gICAgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKFJlYWQpOwotICAgIFNFVF9BVURJT0ZJTEVNQU5BR0VSX01FVEhPRChHZXRGaWxlQnVmZmVyKTsKLSAgICBTRVRfQVVESU9GSUxFTUFOQUdFUl9NRVRIT0QoR2V0UGFyZW50KTsKLSAgICBTRVRfQVVESU9GSUxFTUFOQUdFUl9NRVRIT0QoU2V0UG9zaXRpb24pOwotICAgIFNFVF9BVURJT0ZJTEVNQU5BR0VSX01FVEhPRChHZXRCeXRlQ291bnRlcik7Ci0gICAgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKFNldEVuZE9mRmlsZSk7Ci0gICAgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKFJlbmRlcik7Ci0gICAgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKEdldEZpbGVEYXRhKTsKLSAgICBTRVRfQVVESU9GSUxFTUFOQUdFUl9NRVRIT0QoQWZ0ZXJSZW5kZXIpOwotICAgIFNFVF9BVURJT0ZJTEVNQU5BR0VSX01FVEhPRChGaWxlSW5wdXRQcm9jKTsKLSAgICAjdW5kZWYgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9ECi0KLSAgICBhZm0tPm1QYXJlbnQgPSBpblBhcmVudDsKLSAgICBhZm0tPm1Gb3JrUmVmTnVtID0gaW5Gb3JrUmVmTnVtOwotICAgIGFmbS0+bUJ1ZmZlclNpemUgPSBpbkNodW5rU2l6ZTsKLSAgICBhZm0tPm1CdWZmZXJPZmZzZXQgPSBpbkNodW5rU2l6ZTsKLSAgICBhZm0tPm1DaHVua1NpemUgPSBpbkNodW5rU2l6ZTsKLSAgICBhZm0tPm1GaWxlTGVuZ3RoID0gaW5GaWxlTGVuZ3RoOwotICAgIGFmbS0+bUZpbGVCdWZmZXIgPSAoY2hhciopIFNETF9tYWxsb2MoYWZtLT5tQ2h1bmtTaXplICogMik7Ci0gICAgRlNHZXRGb3JrUG9zaXRpb24oYWZtLT5tRm9ya1JlZk51bSwgJmFmbS0+bUF1ZGlvRGF0YU9mZnNldCk7Ci0gICAgYXNzZXJ0IChhZm0tPm1GaWxlQnVmZmVyICE9IE5VTEwpOwotICAgIHJldHVybiBhZm07Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L0NEUGxheWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9DRFBsYXllci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmRjMjEzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L0NEUGxheWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIkNEUGxheWVyLmgiCi0jaW5jbHVkZSAiQXVkaW9GaWxlUGxheWVyLmgiCi0jaW5jbHVkZSAiU0RMT1NYQ0FHdWFyZC5oIgotCi0vKiB3ZSdyZSBleHBvcnRpbmcgdGhlc2UgZnVuY3Rpb25zIGludG8gQyBsYW5kIGZvciBTRExfc3lzY2Ryb20uYyAqLwotLypleHRlcm4gIkMiIHsqLwotCi0vKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIENvbnN0YW50cwotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCi0KLSNkZWZpbmUga0F1ZGlvQ0RGaWxlc3lzdGVtSUQgICAoVUludDE2KSgoJ0onIDw8IDgpIHwgJ0gnKSAvKiAnSkgnOyB0aGlzIGF2b2lkcyBjb21waWxlciB3YXJuaW5nICovCi0KLS8qIFhNTCBQTGlzdCBrZXlzICovCi0jZGVmaW5lIGtSYXdUT0NEYXRhU3RyaW5nICAgICAgICAgICAiRm9ybWF0IDB4MDIgVE9DIERhdGEiCi0jZGVmaW5lIGtTZXNzaW9uc1N0cmluZyAgICAgICAgICAgICAiU2Vzc2lvbnMiCi0jZGVmaW5lIGtTZXNzaW9uVHlwZVN0cmluZyAgICAgICAgICAiU2Vzc2lvbiBUeXBlIgotI2RlZmluZSBrVHJhY2tBcnJheVN0cmluZyAgICAgICAgICAgIlRyYWNrIEFycmF5IgotI2RlZmluZSBrRmlyc3RUcmFja0luU2Vzc2lvblN0cmluZyAgICAgICJGaXJzdCBUcmFjayIKLSNkZWZpbmUga0xhc3RUcmFja0luU2Vzc2lvblN0cmluZyAgICAgICAiTGFzdCBUcmFjayIKLSNkZWZpbmUga0xlYWRvdXRCbG9ja1N0cmluZyAgICAgICAgICJMZWFkb3V0IEJsb2NrIgotI2RlZmluZSBrRGF0YUtleVN0cmluZyAgICAgICAgICAgICAgIkRhdGEiCi0jZGVmaW5lIGtQb2ludEtleVN0cmluZyAgICAgICAgICAgICAiUG9pbnQiCi0jZGVmaW5lIGtTZXNzaW9uTnVtYmVyS2V5U3RyaW5nICAgICAgICAgIlNlc3Npb24gTnVtYmVyIgotI2RlZmluZSBrU3RhcnRCbG9ja0tleVN0cmluZyAgICAgICAgICAgICJTdGFydCBCbG9jayIgICAKLSAgICAKLS8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgR2xvYmFscwotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCi0KLSNwcmFnbWEgbWFyayAtLSBHbG9iYWxzIC0tCi0KLXN0YXRpYyBpbnQgICAgICAgICAgICAgcGxheUJhY2tXYXNJbml0ID0gMDsKLXN0YXRpYyBBdWRpb1VuaXQgICAgICAgIHRoZVVuaXQ7Ci1zdGF0aWMgQXVkaW9GaWxlUGxheWVyKiB0aGVQbGF5ZXIgPSBOVUxMOwotc3RhdGljIENEUGxheWVyQ29tcGxldGlvblByb2MgICBjb21wbGV0aW9uUHJvYyA9IE5VTEw7Ci1zdGF0aWMgU0RMX211dGV4ICAgICAgICphcGlNdXRleCA9IE5VTEw7Ci1zdGF0aWMgU0RMX3NlbSAgICAgICAgICpjYWxsYmFja1NlbTsKLXN0YXRpYyBTRExfQ0QqICAgICAgICAgIHRoZUNEUk9NOwotCi0vKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIFByb3RvdHlwZXMKLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLwotCi0jcHJhZ21hIG1hcmsgLS0gUHJvdG90eXBlcyAtLQotCi1zdGF0aWMgT1NTdGF0dXMgQ2hlY2tJbml0ICgpOwotCi1zdGF0aWMgdm9pZCAgICAgRmlsZVBsYXlOb3RpZmljYXRpb25IYW5kbGVyICh2b2lkKiBpblJlZkNvbiwgT1NTdGF0dXMgaW5TdGF0dXMpOwotCi1zdGF0aWMgaW50ICAgICAgUnVuQ2FsbEJhY2tUaHJlYWQgKHZvaWQqIGluUmVmQ29uKTsKLQotCi0jcHJhZ21hIG1hcmsgLS0gUHVibGljIEZ1bmN0aW9ucyAtLQotCi12b2lkICAgICBMb2NrICgpCi17Ci0gICAgaWYgKCFhcGlNdXRleCkgewotICAgICAgICBhcGlNdXRleCA9IFNETF9DcmVhdGVNdXRleCgpOwotICAgIH0KLSAgICBTRExfbXV0ZXhQKGFwaU11dGV4KTsKLX0KLQotdm9pZCAgICAgVW5sb2NrICgpCi17Ci0gICAgU0RMX211dGV4VihhcGlNdXRleCk7Ci19Ci0KLWludCBEZXRlY3RBdWRpb0NEVm9sdW1lcyhGU1ZvbHVtZVJlZk51bSAqdm9sdW1lcywgaW50IG51bVZvbHVtZXMpCi17Ci0gICAgaW50IHZvbHVtZUluZGV4OwotICAgIGludCBjZFZvbHVtZUNvdW50ID0gMDsKLSAgICBPU1N0YXR1cyByZXN1bHQgPSBub0VycjsKLSAgICAKLSAgICBmb3IgKHZvbHVtZUluZGV4ID0gMTsgcmVzdWx0ID09IG5vRXJyIHx8IHJlc3VsdCAhPSBuc3ZFcnI7IHZvbHVtZUluZGV4KyspCi0gICAgewotICAgICAgICBGU1ZvbHVtZVJlZk51bSAgYWN0dWFsVm9sdW1lOwotICAgICAgICBGU1ZvbHVtZUluZm8gICAgdm9sdW1lSW5mbzsKLSAgICAgICAgCi0gICAgICAgIG1lbXNldCAoJnZvbHVtZUluZm8sIDAsIHNpemVvZih2b2x1bWVJbmZvKSk7Ci0gICAgICAgIAotICAgICAgICByZXN1bHQgPSBGU0dldFZvbHVtZUluZm8gKGtGU0ludmFsaWRWb2x1bWVSZWZOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbFZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRlNWb2xJbmZvRlNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7IAotICAgICAgICAgCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbm9FcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2b2x1bWVJbmZvLmZpbGVzeXN0ZW1JRCA9PSBrQXVkaW9DREZpbGVzeXN0ZW1JRCkgLyogSXQncyBhbiBhdWRpbyBDRCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2b2x1bWVzICE9IE5VTEwgJiYgY2RWb2x1bWVDb3VudCA8IG51bVZvbHVtZXMpCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZXNbY2RWb2x1bWVDb3VudF0gPSBhY3R1YWxWb2x1bWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjZFZvbHVtZUNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgICAgLyogSSdtIGNvbW1lbnRpbmcgdGhpcyBvdXQgYmVjYXVzZSBpdCBzZWVtcyB0byBiZSBoYXJtbGVzcyAqLwotICAgICAgICAgICAgLypTRExfU2V0RXJyb3IgKCJEZXRlY3RBdWRpb0NEVm9sdW1lczogRlNHZXRWb2x1bWVJbmZvIHJldHVybmVkICVkIiwgcmVzdWx0KTsqLwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICByZXR1cm4gY2RWb2x1bWVDb3VudDsKLX0KLQotaW50IFJlYWRUT0NEYXRhIChGU1ZvbHVtZVJlZk51bSB0aGVWb2x1bWUsIFNETF9DRCAqdGhlQ0QpCi17Ci0gICAgSEZTVW5pU3RyMjU1ICAgICAgZGF0YUZvcmtOYW1lOwotICAgIE9TU3RhdHVzICAgICAgICAgIHRoZUVycjsKLSAgICBTSW50MTYgICAgICAgICAgICBmb3JrUmVmTnVtOwotICAgIFNJbnQ2NCAgICAgICAgICAgIGZvcmtTaXplOwotICAgIFB0ciAgICAgICAgICAgICAgIGZvcmtEYXRhID0gMDsKLSAgICBCeXRlQ291bnQgICAgICAgICBhY3R1YWxSZWFkOwotICAgIENGRGF0YVJlZiAgICAgICAgIGRhdGFSZWYgPSAwOwotICAgIENGUHJvcGVydHlMaXN0UmVmIHByb3BlcnR5TGlzdFJlZiA9IDA7Ci0KLSAgICBGU1JlZlBhcmFtICAgICAgZnNSZWZQQjsKLSAgICBGU1JlZiAgICAgICAgICAgdG9jUGxpc3RGU1JlZjsKLSAgICAKLSAgICBjb25zdCBjaGFyKiBlcnJvciA9ICJVbnNwZWNpZmllZCBFcnJvciI7Ci0gICAgCi0gICAgLyogZ2V0IHN0dWZmIGZyb20gLlRPQy5wbGlzdCAqLwotICAgIGZzUmVmUEIuaW9Db21wbGV0aW9uID0gTlVMTDsKLSAgICBmc1JlZlBCLmlvTmFtZVB0ciA9ICJccC5UT0MucGxpc3QiOwotICAgIGZzUmVmUEIuaW9WUmVmTnVtID0gdGhlVm9sdW1lOwotICAgIGZzUmVmUEIuaW9EaXJJRCA9IDA7Ci0gICAgZnNSZWZQQi5uZXdSZWYgPSAmdG9jUGxpc3RGU1JlZjsKLSAgICAKLSAgICB0aGVFcnIgPSBQQk1ha2VGU1JlZlN5bmMgKCZmc1JlZlBCKTsKLSAgICBpZih0aGVFcnIgIT0gbm9FcnIpIHsKLSAgICAgICAgZXJyb3IgPSAiUEJNYWtlRlNSZWZTeW5jIjsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLSAgICAKLSAgICAvKiBMb2FkIGFuZCBwYXJzZSB0aGUgVE9DIFhNTCBkYXRhICovCi0KLSAgICB0aGVFcnIgPSBGU0dldERhdGFGb3JrTmFtZSAoJmRhdGFGb3JrTmFtZSk7Ci0gICAgaWYgKHRoZUVyciAhPSBub0VycikgewotICAgICAgICBlcnJvciA9ICJGU0dldERhdGFGb3JrTmFtZSI7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0gICAgCi0gICAgdGhlRXJyID0gRlNPcGVuRm9yayAoJnRvY1BsaXN0RlNSZWYsIGRhdGFGb3JrTmFtZS5sZW5ndGgsIGRhdGFGb3JrTmFtZS51bmljb2RlLCBmc1JkUGVybSwgJmZvcmtSZWZOdW0pOwotICAgIGlmICh0aGVFcnIgIT0gbm9FcnIpIHsKLSAgICAgICAgZXJyb3IgPSAiRlNPcGVuRm9yayI7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0gICAgCi0gICAgdGhlRXJyID0gRlNHZXRGb3JrU2l6ZSAoZm9ya1JlZk51bSwgJmZvcmtTaXplKTsKLSAgICBpZiAodGhlRXJyICE9IG5vRXJyKSB7Ci0gICAgICAgIGVycm9yID0gIkZTR2V0Rm9ya1NpemUiOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotICAgIAotICAgIC8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5IGZvciB0aGUgWE1MIGRhdGEgKi8KLSAgICBmb3JrRGF0YSA9IE5ld1B0ciAoZm9ya1NpemUpOwotICAgIGlmKGZvcmtEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZXJyb3IgPSAiTmV3UHRyIjsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLSAgICAKLSAgICB0aGVFcnIgPSBGU1JlYWRGb3JrIChmb3JrUmVmTnVtLCBmc0Zyb21TdGFydCwgMCAvKiBvZmZzZXQgbG9jYXRpb24gKi8sIGZvcmtTaXplLCBmb3JrRGF0YSwgJmFjdHVhbFJlYWQpOwotICAgIGlmKHRoZUVyciAhPSBub0VycikgewotICAgICAgICBlcnJvciA9ICJGU1JlYWRGb3JrIjsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLSAgICAKLSAgICBkYXRhUmVmID0gQ0ZEYXRhQ3JlYXRlIChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoVUludDggKilmb3JrRGF0YSwgZm9ya1NpemUpOwotICAgIGlmKGRhdGFSZWYgPT0gMCkgewotICAgICAgICBlcnJvciA9ICJDRkRhdGFDcmVhdGUiOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgcHJvcGVydHlMaXN0UmVmID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVGcm9tWE1MRGF0YSAoa0NGQWxsb2NhdG9yRGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlByb3BlcnR5TGlzdEltbXV0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICBpZiAocHJvcGVydHlMaXN0UmVmID09IE5VTEwpIHsKLSAgICAgICAgZXJyb3IgPSAiQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVGcm9tWE1MRGF0YSI7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICAvKiBOb3cgd2UgZ290IHRoZSBQcm9wZXJ0eSBMaXN0IGluIG1lbW9yeS4gUGFyc2UgaXQuICovCi0gICAgCi0gICAgLyogRmlyc3QsIG1ha2Ugc3VyZSB0aGUgcm9vdCBpdGVtIGlzIGEgQ0ZEaWN0aW9uYXJ5LiBJZiBub3QsIHJlbGVhc2UgYW5kIGJhaWwuICovCi0gICAgaWYoQ0ZHZXRUeXBlSUQocHJvcGVydHlMaXN0UmVmKT09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKQotICAgIHsKLSAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmIGRpY3RSZWYgPSAoQ0ZEaWN0aW9uYXJ5UmVmKXByb3BlcnR5TGlzdFJlZjsKLSAgICAgICAgCi0gICAgICAgIENGRGF0YVJlZiAgIHRoZVJhd1RPQ0RhdGFSZWY7Ci0gICAgICAgIENGQXJyYXlSZWYgIHRoZVNlc3Npb25BcnJheVJlZjsKLSAgICAgICAgQ0ZJbmRleCAgICAgbnVtU2Vzc2lvbnM7Ci0gICAgICAgIENGSW5kZXggICAgIGluZGV4OwotICAgICAgICAKLSAgICAgICAgLyogVGhpcyBpcyBob3cgd2UgZ2V0IHRoZSBSYXcgVE9DIERhdGEgKi8KLSAgICAgICAgdGhlUmF3VE9DRGF0YVJlZiA9IChDRkRhdGFSZWYpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKGRpY3RSZWYsIENGU1RSKGtSYXdUT0NEYXRhU3RyaW5nKSk7Ci0gICAgICAgIAotICAgICAgICAvKiBHZXQgdGhlIHNlc3Npb24gYXJyYXkgaW5mby4gKi8KLSAgICAgICAgdGhlU2Vzc2lvbkFycmF5UmVmID0gKENGQXJyYXlSZWYpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKGRpY3RSZWYsIENGU1RSKGtTZXNzaW9uc1N0cmluZykpOwotICAgICAgICAKLSAgICAgICAgLyogRmluZCBvdXQgaG93IG1hbnkgc2Vzc2lvbnMgdGhlcmUgYXJlLiAqLwotICAgICAgICBudW1TZXNzaW9ucyA9IENGQXJyYXlHZXRDb3VudCAodGhlU2Vzc2lvbkFycmF5UmVmKTsKLSAgICAgICAgCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHRvdGFsIG51bWJlciBvZiB0cmFja3MgdG8gMCAqLwotICAgICAgICB0aGVDRC0+bnVtdHJhY2tzID0gMDsKLSAgICAgICAgCi0gICAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgc2Vzc2lvbnMsIGNvbGxlY3RpbmcgdGhlIHRyYWNrIGRhdGEgKi8KLSAgICAgICAgZm9yKGluZGV4ID0gMDsgaW5kZXggPCBudW1TZXNzaW9uczsgaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmIHRoZVNlc3Npb25EaWN0OwotICAgICAgICAgICAgQ0ZOdW1iZXJSZWYgICAgIGxlYWRvdXRCbG9jazsKLSAgICAgICAgICAgIENGQXJyYXlSZWYgICAgICB0cmFja0FycmF5OwotICAgICAgICAgICAgQ0ZJbmRleCAgICAgICAgIG51bVRyYWNrczsKLSAgICAgICAgICAgIENGSW5kZXggICAgICAgICB0cmFja0luZGV4OwotICAgICAgICAgICAgVUludDMyICAgICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhlU2Vzc2lvbkRpY3QgICAgICA9IChDRkRpY3Rpb25hcnlSZWYpIENGQXJyYXlHZXRWYWx1ZUF0SW5kZXggKHRoZVNlc3Npb25BcnJheVJlZiwgaW5kZXgpOwotICAgICAgICAgICAgbGVhZG91dEJsb2NrICAgICAgICA9IChDRk51bWJlclJlZikgQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHRoZVNlc3Npb25EaWN0LCBDRlNUUihrTGVhZG91dEJsb2NrU3RyaW5nKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyYWNrQXJyYXkgPSAoQ0ZBcnJheVJlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZSAodGhlU2Vzc2lvbkRpY3QsIENGU1RSKGtUcmFja0FycmF5U3RyaW5nKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG51bVRyYWNrcyA9IENGQXJyYXlHZXRDb3VudCAodHJhY2tBcnJheSk7Ci0KLSAgICAgICAgICAgIGZvcih0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IG51bVRyYWNrczsgdHJhY2tJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZiB0aGVUcmFja0RpY3Q7Ci0gICAgICAgICAgICAgICAgQ0ZOdW1iZXJSZWYgICAgIHRyYWNrTnVtYmVyOwotICAgICAgICAgICAgICAgIENGTnVtYmVyUmVmICAgICBzZXNzaW9uTnVtYmVyOwotICAgICAgICAgICAgICAgIENGTnVtYmVyUmVmICAgICBzdGFydEJsb2NrOwotICAgICAgICAgICAgICAgIENGQm9vbGVhblJlZiAgICBpc0RhdGFUcmFjazsKLSAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgdmFsdWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhlVHJhY2tEaWN0ICA9IChDRkRpY3Rpb25hcnlSZWYpIENGQXJyYXlHZXRWYWx1ZUF0SW5kZXggKHRyYWNrQXJyYXksIHRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyYWNrTnVtYmVyICAgPSAoQ0ZOdW1iZXJSZWYpICBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAodGhlVHJhY2tEaWN0LCBDRlNUUihrUG9pbnRLZXlTdHJpbmcpKTsKLSAgICAgICAgICAgICAgICBzZXNzaW9uTnVtYmVyID0gKENGTnVtYmVyUmVmKSAgQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHRoZVRyYWNrRGljdCwgQ0ZTVFIoa1Nlc3Npb25OdW1iZXJLZXlTdHJpbmcpKTsKLSAgICAgICAgICAgICAgICBzdGFydEJsb2NrICAgID0gKENGTnVtYmVyUmVmKSAgQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHRoZVRyYWNrRGljdCwgQ0ZTVFIoa1N0YXJ0QmxvY2tLZXlTdHJpbmcpKTsKLSAgICAgICAgICAgICAgICBpc0RhdGFUcmFjayAgID0gKENGQm9vbGVhblJlZikgQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHRoZVRyYWNrRGljdCwgQ0ZTVFIoa0RhdGFLZXlTdHJpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgU0RMX0NEIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgIGludCBpZHggPSB0aGVDRC0+bnVtdHJhY2tzKys7Ci0KLSAgICAgICAgICAgICAgICBDRk51bWJlckdldFZhbHVlICh0cmFja051bWJlciwga0NGTnVtYmVyU0ludDMyVHlwZSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICB0aGVDRC0+dHJhY2tbaWR4XS5pZCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIENGTnVtYmVyR2V0VmFsdWUgKHN0YXJ0QmxvY2ssIGtDRk51bWJlclNJbnQzMlR5cGUsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgdGhlQ0QtPnRyYWNrW2lkeF0ub2Zmc2V0ID0gdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICB0aGVDRC0+dHJhY2tbaWR4XS50eXBlID0gKGlzRGF0YVRyYWNrID09IGtDRkJvb2xlYW5UcnVlKSA/IFNETF9EQVRBX1RSQUNLIDogU0RMX0FVRElPX1RSQUNLOwotCi0gICAgICAgICAgICAgICAgLyogU2luY2UgdGhlIHRyYWNrIGxlbmd0aHMgYXJlIG5vdCBzdG9yZWQgaW4gLlRPQy5wbGlzdCB3ZSBjb21wdXRlIHRoZW0uICovCi0gICAgICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUNELT50cmFja1tpZHgtMV0ubGVuZ3RoID0gdGhlQ0QtPnRyYWNrW2lkeF0ub2Zmc2V0IC0gdGhlQ0QtPnRyYWNrW2lkeC0xXS5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIGxhc3QgdHJhY2sgKi8KLSAgICAgICAgICAgIENGTnVtYmVyR2V0VmFsdWUgKGxlYWRvdXRCbG9jaywga0NGTnVtYmVyU0ludDMyVHlwZSwgJnZhbHVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhlQ0QtPnRyYWNrW3RoZUNELT5udW10cmFja3MtMV0ubGVuZ3RoID0gCi0gICAgICAgICAgICAgICAgdmFsdWUgLSB0aGVDRC0+dHJhY2tbdGhlQ0QtPm51bXRyYWNrcy0xXS5vZmZzZXQ7Ci0KLSAgICAgICAgICAgIC8qIFNldCBvZmZzZXQgdG8gbGVhZG91dCB0cmFjayAqLwotICAgICAgICAgICAgdGhlQ0QtPnRyYWNrW3RoZUNELT5udW10cmFja3NdLm9mZnNldCA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgCi0gICAgfQotCi0gICAgdGhlRXJyID0gMDsKLSAgICBnb3RvIGNsZWFudXA7Ci1iYWlsOgotICAgIFNETF9TZXRFcnJvciAoIlJlYWRUT0NEYXRhOiAlcyByZXR1cm5lZCAlZCIsIGVycm9yLCB0aGVFcnIpOwotICAgIHRoZUVyciA9IC0xOwotY2xlYW51cDoKLQotICAgIGlmIChwcm9wZXJ0eUxpc3RSZWYgIT0gTlVMTCkKLSAgICAgICAgQ0ZSZWxlYXNlKHByb3BlcnR5TGlzdFJlZik7Ci0gICAgaWYgKGRhdGFSZWYgIT0gTlVMTCkKLSAgICAgICAgQ0ZSZWxlYXNlKGRhdGFSZWYpOwotICAgIGlmIChmb3JrRGF0YSAhPSBOVUxMKQotICAgICAgICBEaXNwb3NlUHRyKGZvcmtEYXRhKTsKLSAgICAgICAgCi0gICAgRlNDbG9zZUZvcmsgKGZvcmtSZWZOdW0pOwotCi0gICAgcmV0dXJuIHRoZUVycjsKLX0KLQotaW50IExpc3RUcmFja0ZpbGVzIChGU1ZvbHVtZVJlZk51bSB0aGVWb2x1bWUsIEZTUmVmICp0cmFja0ZpbGVzLCBpbnQgbnVtVHJhY2tzKQotewotICAgIE9TU3RhdHVzICAgICAgICByZXN1bHQgPSAtMTsKLSAgICBGU0l0ZXJhdG9yICAgICAgaXRlcmF0b3I7Ci0gICAgSXRlbUNvdW50ICAgICAgIGFjdHVhbE9iamVjdHM7Ci0gICAgRlNSZWYgICAgICAgICAgIHJvb3REaXJlY3Rvcnk7Ci0gICAgRlNSZWYgICAgICAgICAgIHJlZjsKLSAgICBIRlNVbmlTdHIyNTUgICAgbmFtZVN0cjsKLSAgICAKLSAgICByZXN1bHQgPSBGU0dldFZvbHVtZUluZm8gKHRoZVZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZTVm9sSW5mb0ZTSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJvb3REaXJlY3RvcnkpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKLSAgICAgICAgU0RMX1NldEVycm9yICgiTGlzdFRyYWNrRmlsZXM6IEZTR2V0Vm9sdW1lSW5mbyByZXR1cm5lZCAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcmVzdWx0ID0gRlNPcGVuSXRlcmF0b3IgKCZyb290RGlyZWN0b3J5LCBrRlNJdGVyYXRlRmxhdCwgJml0ZXJhdG9yKTsKLSAgICBpZiAocmVzdWx0ID09IG5vRXJyKSB7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEZTR2V0Q2F0YWxvZ0luZm9CdWxrIChpdGVyYXRvciwgMSwgJmFjdHVhbE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwga0ZTQ2F0SW5mb05vbmUsIE5VTEwsICZyZWYsIE5VTEwsICZuYW1lU3RyKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbm9FcnIpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiAgbmFtZTsKLSAgICAgICAgICAgICAgICBuYW1lID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyAoTlVMTCwgbmFtZVN0ci51bmljb2RlLCBuYW1lU3RyLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyogTG9vayBmb3IgLmFpZmYgZXh0ZW5zaW9uICovCi0gICAgICAgICAgICAgICAgaWYgKENGU3RyaW5nSGFzU3VmZml4IChuYW1lLCBDRlNUUigiLmFpZmYiKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdIYXNTdWZmaXggKG5hbWUsIENGU1RSKCIuY2RkYSIpKSkgewotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogRXh0cmFjdCB0aGUgdHJhY2sgaWQgZnJvbSB0aGUgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IHRyYWNrSUQgPSAwLCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBuYW1lU3RyLmxlbmd0aCAmJiAhaXNkaWdpdChuYW1lU3RyLnVuaWNvZGVbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBuYW1lU3RyLmxlbmd0aCAmJiBpc2RpZ2l0KG5hbWVTdHIudW5pY29kZVtpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSUQgPSAxMCAqIHRyYWNrSUQgKyhuYW1lU3RyLnVuaWNvZGVbaV0gLSAnMCcpOwotICAgICAgICAgICAgICAgICAgICAgICAgKytpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgI2lmIERFQlVHX0NEUk9NCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiRm91bmQgQUlGRiBmb3IgdHJhY2sgJWQ6ICclcydcbiIsIHRyYWNrSUQsIAotICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ0dldENTdHJpbmdQdHIgKG5hbWUsIENGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIFRyYWNrIElEJ3Mgc3RhcnQgYXQgMSwgYnV0IHdlIHdhbnQgdG8gc3RhcnQgYXQgMCAqLwotICAgICAgICAgICAgICAgICAgICB0cmFja0lELS07Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCA8PSB0cmFja0lEICYmIHRyYWNrSUQgPD0gU0RMX01BWF9UUkFDS1MpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrSUQgPCBudW1UcmFja3MpCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkgKCZ0cmFja0ZpbGVzW3RyYWNrSURdLCAmcmVmLCBzaXplb2YoRlNSZWYpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZSZWxlYXNlIChuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZShub0VyciA9PSByZXN1bHQpOwotICAgICAgICBGU0Nsb3NlSXRlcmF0b3IgKGl0ZXJhdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBMb2FkRmlsZSAoY29uc3QgRlNSZWYgKnJlZiwgaW50IHN0YXJ0RnJhbWUsIGludCBzdG9wRnJhbWUpCi17Ci0gICAgaW50IGVycm9yID0gLTE7Ci0gICAgCi0gICAgaWYgKENoZWNrSW5pdCAoKSA8IDApCi0gICAgICAgIGdvdG8gYmFpbDsKLSAgICAKLSAgICAvKiByZWxlYXNlIGFueSBjdXJyZW50bHkgcGxheWluZyBmaWxlICovCi0gICAgaWYgKFJlbGVhc2VGaWxlICgpIDwgMCkKLSAgICAgICAgZ290byBiYWlsOwotICAgIAotICAgICNpZiBERUJVR19DRFJPTQotICAgIHByaW50ZiAoIkxvYWRGaWxlOiAlZCAlZFxuIiwgc3RhcnRGcmFtZSwgc3RvcEZyYW1lKTsKLSAgICAjZW5kaWYKLSAgICAKLSAgICAvKnRyeSB7Ki8KLSAgICAKLSAgICAgICAgLyogY3JlYXRlIGEgbmV3IHBsYXllciwgYW5kIGF0dGFjaCB0byB0aGUgYXVkaW8gdW5pdCAqLwotICAgICAgICAKLSAgICAgICAgdGhlUGxheWVyID0gbmV3X0F1ZGlvRmlsZVBsYXllcihyZWYpOwotICAgICAgICBpZiAodGhlUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIkxvYWRGaWxlOiBDb3VsZCBub3QgY3JlYXRlIHBsYXllciIpOwotICAgICAgICAgICAgcmV0dXJuIC0zOyAvKnRocm93ICgtMyk7Ki8KLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIGlmICghdGhlUGxheWVyLT5TZXREZXN0aW5hdGlvbih0aGVQbGF5ZXIsICZ0aGVVbml0KSkKLSAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChzdGFydEZyYW1lID49IDApCi0gICAgICAgICAgICB0aGVQbGF5ZXItPlNldFN0YXJ0RnJhbWUgKHRoZVBsYXllciwgc3RhcnRGcmFtZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc3RvcEZyYW1lID49IDAgJiYgc3RvcEZyYW1lID4gc3RhcnRGcmFtZSkKLSAgICAgICAgICAgIHRoZVBsYXllci0+U2V0U3RvcEZyYW1lICh0aGVQbGF5ZXIsIHN0b3BGcmFtZSk7Ci0gICAgICAgIAotICAgICAgICAvKiB3ZSBzZXQgdGhlIG5vdGlmaWVyIGxhdGVyICovCi0gICAgICAgIC8qdGhlUGxheWVyLT5TZXROb3RpZmllcih0aGVQbGF5ZXIsIEZpbGVQbGF5Tm90aWZpY2F0aW9uSGFuZGxlciwgTlVMTCk7Ki8KLSAgICAgICAgICAgIAotICAgICAgICBpZiAoIXRoZVBsYXllci0+Q29ubmVjdCh0aGVQbGF5ZXIpKQotICAgICAgICAgICAgZ290byBiYWlsOwotICAgIAotICAgICAgICAjaWYgREVCVUdfQ0RST00KLSAgICAgICAgdGhlUGxheWVyLT5QcmludCh0aGVQbGF5ZXIpOwotICAgICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0gICAgICAgICNlbmRpZgotICAgIC8qfQotICAgICAgY2F0Y2ggKC4uLikKLSAgICAgIHsKLSAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICB9Ki8KLSAgICAgICAgCi0gICAgZXJyb3IgPSAwOwotCi0gICAgYmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci19Ci0KLWludCBSZWxlYXNlRmlsZSAoKQotewotICAgIGludCBlcnJvciA9IC0xOwotICAgICAgICAKLSAgICAvKiAoRG9uJ3Qgc2VlIGFueSB3YXkgdGhhdCB0aGUgb3JpZ2luYWwgQysrIGNvZGUgY291bGQgdGhyb3cgaGVyZS4pIC0tcnlhbi4gKi8KLSAgICAvKnRyeSB7Ki8KLSAgICAgICAgaWYgKHRoZVBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoZVBsYXllci0+RGlzY29ubmVjdCh0aGVQbGF5ZXIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWxldGVfQXVkaW9GaWxlUGxheWVyKHRoZVBsYXllcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoZVBsYXllciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAvKn0KLSAgICAgIGNhdGNoICguLi4pCi0gICAgICB7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgfSovCi0gICAgCi0gICAgZXJyb3IgPSAwOwotICAgIAotLyogIGJhaWw6ICovCi0gICAgcmV0dXJuIGVycm9yOwotfQotCi1pbnQgUGxheUZpbGUgKCkKLXsKLSAgICBPU1N0YXR1cyByZXN1bHQgPSAtMTsKLSAgICAKLSAgICBpZiAoQ2hlY2tJbml0ICgpIDwgMCkKLSAgICAgICAgZ290byBiYWlsOwotICAgICAgICAKLSAgICAvKnRyeSB7Ki8KLSAgICAKLSAgICAgICAgLy8gc3RhcnQgcHJvY2Vzc2luZyBvZiB0aGUgYXVkaW8gdW5pdAotICAgICAgICByZXN1bHQgPSBBdWRpb091dHB1dFVuaXRTdGFydCAodGhlVW5pdCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0KSBnb3RvIGJhaWw7IC8vVEhST1dfUkVTVUxUKCJQbGF5RmlsZTogQXVkaW9PdXRwdXRVbml0U3RhcnQiKQotICAgICAgICAKLSAgICAvKn0KLSAgICBjYXRjaCAoLi4uKQotICAgIHsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0qLwotICAgIAotICAgIHJlc3VsdCA9IDA7Ci0gICAgCi1iYWlsOgotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBQYXVzZUZpbGUgKCkKLXsKLSAgICBPU1N0YXR1cyByZXN1bHQgPSAtMTsKLSAgICAKLSAgICBpZiAoQ2hlY2tJbml0ICgpIDwgMCkKLSAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgCi0gICAgLyp0cnkgeyovCi0gICAgCi0gICAgICAgIC8qIHN0b3AgcHJvY2Vzc2luZyB0aGUgYXVkaW8gdW5pdCAqLwotICAgICAgICByZXN1bHQgPSBBdWRpb091dHB1dFVuaXRTdG9wICh0aGVVbml0KTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQpIGdvdG8gYmFpbDsgIC8qVEhST1dfUkVTVUxUKCJQYXVzZUZpbGU6IEF1ZGlvT3V0cHV0VW5pdFN0b3AiKSovCi0gICAgLyp9Ci0gICAgICBjYXRjaCAoLi4uKQotICAgICAgewotICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgIH0qLwotICAgIAotICAgIHJlc3VsdCA9IDA7Ci1iYWlsOgotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgU2V0Q29tcGxldGlvblByb2MgKENEUGxheWVyQ29tcGxldGlvblByb2MgcHJvYywgU0RMX0NEICpjZHJvbSkKLXsKLSAgICBhc3NlcnQodGhlUGxheWVyICE9IE5VTEwpOwotCi0gICAgdGhlQ0RST00gPSBjZHJvbTsKLSAgICBjb21wbGV0aW9uUHJvYyA9IHByb2M7Ci0gICAgdGhlUGxheWVyLT5TZXROb3RpZmllciAodGhlUGxheWVyLCBGaWxlUGxheU5vdGlmaWNhdGlvbkhhbmRsZXIsIGNkcm9tKTsKLX0KLQotaW50IEdldEN1cnJlbnRGcmFtZSAoKQoteyAgICAKLSAgICBpbnQgZnJhbWU7Ci0gICAgCi0gICAgaWYgKHRoZVBsYXllciA9PSBOVUxMKQotICAgICAgICBmcmFtZSA9IDA7Ci0gICAgZWxzZQotICAgICAgICBmcmFtZSA9IHRoZVBsYXllci0+R2V0Q3VycmVudEZyYW1lICh0aGVQbGF5ZXIpOwotICAgICAgICAKLSAgICByZXR1cm4gZnJhbWU7IAotfQotCi0KLSNwcmFnbWEgbWFyayAtLSBQcml2YXRlIEZ1bmN0aW9ucyAtLQotCi1zdGF0aWMgT1NTdGF0dXMgQ2hlY2tJbml0ICgpCi17ICAgIAotICAgIGlmIChwbGF5QmFja1dhc0luaXQpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIE9TU3RhdHVzIHJlc3VsdCA9IG5vRXJyOwotICAgIAotICAgIC8qIENyZWF0ZSB0aGUgY2FsbGJhY2sgc2VtYXBob3JlICovCi0gICAgY2FsbGJhY2tTZW0gPSBTRExfQ3JlYXRlU2VtYXBob3JlKDApOwotCi0gICAgLyogU3RhcnQgY2FsbGJhY2sgdGhyZWFkICovCi0gICAgU0RMX0NyZWF0ZVRocmVhZChSdW5DYWxsQmFja1RocmVhZCwgTlVMTCk7Ci0KLSAgICB7IC8qdHJ5IHsqLwotICAgICAgICBDb21wb25lbnREZXNjcmlwdGlvbiBkZXNjOwotICAgIAotICAgICAgICBkZXNjLmNvbXBvbmVudFR5cGUgPSBrQXVkaW9Vbml0Q29tcG9uZW50VHlwZTsKLSAgICAgICAgZGVzYy5jb21wb25lbnRTdWJUeXBlID0ga0F1ZGlvVW5pdFN1YlR5cGVfT3V0cHV0OwotICAgICAgICBkZXNjLmNvbXBvbmVudE1hbnVmYWN0dXJlciA9IGtBdWRpb1VuaXRJRF9EZWZhdWx0T3V0cHV0OwotICAgICAgICBkZXNjLmNvbXBvbmVudEZsYWdzID0gMDsKLSAgICAgICAgZGVzYy5jb21wb25lbnRGbGFnc01hc2sgPSAwOwotICAgICAgICAKLSAgICAgICAgQ29tcG9uZW50IGNvbXAgPSBGaW5kTmV4dENvbXBvbmVudCAoTlVMTCwgJmRlc2MpOwotICAgICAgICBpZiAoY29tcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBTRExfU2V0RXJyb3IgKCJDaGVja0luaXQ6IEZpbmROZXh0Q29tcG9uZW50IHJldHVybmVkIE5VTEwiKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAtMTsgLy90aHJvdyhpbnRlcm5hbENvbXBvbmVudEVycik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IE9wZW5BQ29tcG9uZW50IChjb21wLCAmdGhlVW5pdCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gLTE7IC8vVEhST1dfUkVTVUxUKCJDaGVja0luaXQ6IE9wZW5BQ29tcG9uZW50IikKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIHlvdSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIG91dHB1dCB1bml0IGJlZm9yZSB5b3Ugc2V0IGl0IGFzIGEgZGVzdGluYXRpb24KLSAgICAgICAgcmVzdWx0ID0gQXVkaW9Vbml0SW5pdGlhbGl6ZSAodGhlVW5pdCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gLTE7IC8vVEhST1dfUkVTVUxUKCJDaGVja0luaXQ6IEF1ZGlvVW5pdEluaXRpYWxpemUiKQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHBsYXlCYWNrV2FzSW5pdCA9IHRydWU7Ci0gICAgfQotICAgIC8qY2F0Y2ggKC4uLikKLSAgICAgIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ki8KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgRmlsZVBsYXlOb3RpZmljYXRpb25IYW5kbGVyKHZvaWQgKiBpblJlZkNvbiwgT1NTdGF0dXMgaW5TdGF0dXMpCi17Ci0gICAgaWYgKGluU3RhdHVzID09IGtBdWRpb0ZpbGVQbGF5X0ZpbGVJc0ZpbmlzaGVkKSB7Ci0gICAgCi0gICAgICAgIC8qIG5vdGlmeSBub24tQ0EgdGhyZWFkIHRvIHBlcmZvcm0gdGhlIGNhbGxiYWNrICovCi0gICAgICAgIFNETF9TZW1Qb3N0KGNhbGxiYWNrU2VtKTsKLSAgICAgICAgCi0gICAgfSBlbHNlIGlmIChpblN0YXR1cyA9PSBrQXVkaW9GaWxlUGxheUVycl9GaWxlUGxheVVuZGVycnVuKSB7Ci0gICAgCi0gICAgICAgIFNETF9TZXRFcnJvciAoIkNEUGxheWVyIE5vdGlmaWNhdGlvbjogYnVmZmVyIHVuZGVycnVuIik7Ci0gICAgfSBlbHNlIGlmIChpblN0YXR1cyA9PSBrQXVkaW9GaWxlUGxheV9QbGF5ZXJJc1VuaW5pdGlhbGl6ZWQpIHsKLSAgICAKLSAgICAgICAgU0RMX1NldEVycm9yICgiQ0RQbGF5ZXIgTm90aWZpY2F0aW9uOiBwbGF5ZXIgaXMgdW5pbml0aWFsaXplZCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIAotICAgICAgICBTRExfU2V0RXJyb3IgKCJDRFBsYXllciBOb3RpZmljYXRpb246IHVua25vd24gZXJyb3IgJWxkIiwgaW5TdGF0dXMpOwotICAgIH0KLX0KLQotc3RhdGljIGludCBSdW5DYWxsQmFja1RocmVhZCAodm9pZCAqcGFyYW0pCi17Ci0gICAgZm9yICg7OykgewotICAgIAotCVNETF9TZW1XYWl0KGNhbGxiYWNrU2VtKTsKLQotICAgICAgICBpZiAoY29tcGxldGlvblByb2MgJiYgdGhlQ0RST00pIHsKLSAgICAgICAgICAgICNpZiBERUJVR19DRFJPTQotICAgICAgICAgICAgcHJpbnRmICgiY2FsbGJhY2shXG4iKTsKLSAgICAgICAgICAgICNlbmRpZgotICAgICAgICAgICAgKCpjb21wbGV0aW9uUHJvYykodGhlQ0RST00pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgI2lmIERFQlVHX0NEUk9NCi0gICAgICAgICAgICBwcmludGYgKCJjYWxsYmFjaz9cbiIpOwotICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgI2lmIERFQlVHX0NEUk9NCi0gICAgcHJpbnRmICgidGhyZWFkIGR5aW5nIG5vdy4uLlxuIik7Ci0gICAgI2VuZGlmCi0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qfTsgLy8gZXh0ZXJuICJDIiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvc3gvQ0RQbGF5ZXIuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L0NEUGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDExMjguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvc3gvQ0RQbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9fQ0RQbGF5ZXJfX0hfXwotI2RlZmluZSBfX0NEUGxheWVyX19IX18gMQotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+Ci0jaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KLSNpbmNsdWRlIDxBdWRpb1VuaXQvQXVkaW9Vbml0Lmg+Ci0KLSNpbmNsdWRlICJTREwuaCIKLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX211dGV4LmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdHlwZWRlZiB2b2lkICgqQ0RQbGF5ZXJDb21wbGV0aW9uUHJvYykoU0RMX0NEICpjZHJvbSkgOwotCi12b2lkICAgICBMb2NrICgpOwotCi12b2lkICAgICBVbmxvY2soKTsKLQotaW50ICAgICAgTG9hZEZpbGUgKGNvbnN0IEZTUmVmICpyZWYsIGludCBzdGFydEZyYW1lLCBpbnQgZW5kRnJhbWUpOyAvKiBwYXNzIC0xIHRvIGRvIG5vdGhpbmcgKi8KLQotaW50ICAgICAgUmVsZWFzZUZpbGUgKCk7Ci0KLWludCAgICAgIFBsYXlGaWxlICAoKTsKLQotaW50ICAgICAgUGF1c2VGaWxlICgpOwotCi12b2lkICAgICBTZXRDb21wbGV0aW9uUHJvYyAoQ0RQbGF5ZXJDb21wbGV0aW9uUHJvYyBwcm9jLCBTRExfQ0QgKmNkcm9tKTsKLQotaW50ICAgICAgUmVhZFRPQ0RhdGEgKEZTVm9sdW1lUmVmTnVtIHRoZVZvbHVtZSwgU0RMX0NEICp0aGVDRCk7Ci0KLWludCAgICAgIExpc3RUcmFja0ZpbGVzIChGU1ZvbHVtZVJlZk51bSB0aGVWb2x1bWUsIEZTUmVmICp0cmFja0ZpbGVzLCBpbnQgbnVtVHJhY2tzKTsKLQotaW50ICAgICAgRGV0ZWN0QXVkaW9DRFZvbHVtZXMgKEZTVm9sdW1lUmVmTnVtICp2b2x1bWVzLCBpbnQgbnVtVm9sdW1lcyk7Ci0KLWludCAgICAgIEdldEN1cnJlbnRGcmFtZSAoKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19OwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0NEX1BsYXllcl9fSF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9TRExPU1hDQUd1YXJkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9TRExPU1hDQUd1YXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODljNGUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvc3gvU0RMT1NYQ0FHdWFyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qICAKLSAgICBOb3RlOiBUaGlzIGZpbGUgaGFzbid0IGJlZW4gbW9kaWZpZWQgc28gdGVjaG5pY2FsbHkgd2UgaGF2ZSB0byBrZWVwIHRoZSBkaXNjbGFpbWVyIDotKAotICAgIAotICAgIENvcHlyaWdodDogIKkgQ29weXJpZ2h0IDIwMDIgQXBwbGUgQ29tcHV0ZXIsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgIERpc2NsYWltZXI6IElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuCi0gICAgICAgICAgICAoIkFwcGxlIikgaW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91cgotICAgICAgICAgICAgdXNlLCBpbnN0YWxsYXRpb24sIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIEFwcGxlIHNvZnR3YXJlCi0gICAgICAgICAgICBjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLAotICAgICAgICAgICAgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KLQotICAgICAgICAgICAgSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgc3ViamVjdAotICAgICAgICAgICAgdG8gdGhlc2UgdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZdVzCi0gICAgICAgICAgICBjb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgQXBwbGUgc29mdHdhcmUgKHRoZSAiQXBwbGUgU29mdHdhcmUiKSwgdG8gdXNlLAotICAgICAgICAgICAgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dAotICAgICAgICAgICAgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZQotICAgICAgICAgICAgdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dCBtb2RpZmljYXRpb25zLCB5b3UgbXVzdCByZXRhaW4KLSAgICAgICAgICAgIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbCBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZgotICAgICAgICAgICAgdGhlIEFwcGxlIFNvZnR3YXJlLiAgTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcyBvciBsb2dvcyBvZgotICAgICAgICAgICAgQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUKLSAgICAgICAgICAgIEFwcGxlIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQXBwbGUuICBFeGNlcHQgYXMKLSAgICAgICAgICAgIGV4cHJlc3NseSBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLAotICAgICAgICAgICAgYXJlIGdyYW50ZWQgYnkgQXBwbGUgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQKLSAgICAgICAgICAgIG1heSBiZSBpbmZyaW5nZWQgYnkgeW91ciBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZQotICAgICAgICAgICAgU29mdHdhcmUgbWF5IGJlIGluY29ycG9yYXRlZC4KLQotICAgICAgICAgICAgVGhlIEFwcGxlIFNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEFwcGxlIG9uIGFuICJBUyBJUyIgYmFzaXMuICBBUFBMRSBNQUtFUyBOTwotICAgICAgICAgICAgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIFRIRSBJTVBMSUVECi0gICAgICAgICAgICBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gICAgICAgICAgICBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUyBVU0UgQU5EIE9QRVJBVElPTiBBTE9ORSBPUiBJTgotICAgICAgICAgICAgQ09NQklOQVRJT04gV0lUSCBZT1VSIFBST0RVQ1RTLgotCi0gICAgICAgICAgICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCBPUgotICAgICAgICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQotICAgICAgICAgICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gICAgICAgICAgICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04KLSAgICAgICAgICAgIE9GIFRIRSBBUFBMRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5EIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULCBUT1JUCi0gICAgICAgICAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIE9USEVSV0lTRSwgRVZFTiBJRiBBUFBMRSBIQVMgQkVFTgotICAgICAgICAgICAgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIENBR3VhcmQuY3AKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgSW5jbHVkZXMKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0qLwotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLQotLyojZGVmaW5lIE5ERUJVRyAxKi8KLS8qCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0qLwotI2RlZmluZSBhc3NlcnQoWCkKLQotCi0jaW5jbHVkZSAiU0RMT1NYQ0FHdWFyZC5oIgotCi0vKiN3YXJuaW5nICAgICAgTmVlZCBhIHRyeS1iYXNlZCBMb2NrZXIgdG9vKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBTRExPU1hDQUd1YXJkCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBTRExPU1hDQUd1YXJkX0xvY2soU0RMT1NYQ0FHdWFyZCAqY2FnKQotewotICAgIGludCB0aGVBbnN3ZXIgPSAwOwotICAgIAotICAgIGlmKHB0aHJlYWRfc2VsZigpICE9IGNhZy0+bU93bmVyKQotICAgIHsKLSAgICAgICAgT1NTdGF0dXMgdGhlRXJyb3IgPSBwdGhyZWFkX211dGV4X2xvY2soJmNhZy0+bU11dGV4KTsKLSAgICAgICAgKHZvaWQpdGhlRXJyb3I7Ci0gICAgICAgIGFzc2VydCh0aGVFcnJvciA9PSAwKTsKLSAgICAgICAgY2FnLT5tT3duZXIgPSBwdGhyZWFkX3NlbGYoKTsKLSAgICAgICAgdGhlQW5zd2VyID0gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhlQW5zd2VyOwotfQotCi1zdGF0aWMgdm9pZCAgICBTRExPU1hDQUd1YXJkX1VubG9jayhTRExPU1hDQUd1YXJkICpjYWcpCi17Ci0gICAgT1NTdGF0dXMgdGhlRXJyb3I7Ci0gICAgYXNzZXJ0KHB0aHJlYWRfc2VsZigpID09IGNhZy0+bU93bmVyKTsKLQotICAgIGNhZy0+bU93bmVyID0gMDsKLSAgICB0aGVFcnJvciA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjYWctPm1NdXRleCk7Ci0gICAgKHZvaWQpdGhlRXJyb3I7Ci0gICAgYXNzZXJ0KHRoZUVycm9yID09IDApOwotfQotCi1zdGF0aWMgaW50IFNETE9TWENBR3VhcmRfVHJ5IChTRExPU1hDQUd1YXJkICpjYWcsIGludCAqb3V0V2FzTG9ja2VkKQotewotICAgIGludCB0aGVBbnN3ZXIgPSAwOwotICAgICpvdXRXYXNMb2NrZWQgPSAwOwotICAgIAotICAgIGlmIChwdGhyZWFkX3NlbGYoKSA9PSBjYWctPm1Pd25lcikgewotICAgICAgICB0aGVBbnN3ZXIgPSAxOwotICAgICAgICAqb3V0V2FzTG9ja2VkID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBPU1N0YXR1cyB0aGVFcnJvciA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmY2FnLT5tTXV0ZXgpOwotICAgICAgICBpZiAodGhlRXJyb3IgPT0gMCkgewotICAgICAgICAgICAgY2FnLT5tT3duZXIgPSBwdGhyZWFkX3NlbGYoKTsKLSAgICAgICAgICAgIHRoZUFuc3dlciA9IDE7Ci0gICAgICAgICAgICAqb3V0V2FzTG9ja2VkID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdGhlQW5zd2VyOwotfQotCi1zdGF0aWMgdm9pZCAgICBTRExPU1hDQUd1YXJkX1dhaXQoU0RMT1NYQ0FHdWFyZCAqY2FnKQotewotICAgIE9TU3RhdHVzIHRoZUVycm9yOwotICAgIGFzc2VydChwdGhyZWFkX3NlbGYoKSA9PSBjYWctPm1Pd25lcik7Ci0KLSAgICBjYWctPm1Pd25lciA9IDA7Ci0KLSAgICB0aGVFcnJvciA9IHB0aHJlYWRfY29uZF93YWl0KCZjYWctPm1Db25kVmFyLCAmY2FnLT5tTXV0ZXgpOwotICAgICh2b2lkKXRoZUVycm9yOwotICAgIGFzc2VydCh0aGVFcnJvciA9PSAwKTsKLSAgICBjYWctPm1Pd25lciA9IHB0aHJlYWRfc2VsZigpOwotfQotCi1zdGF0aWMgdm9pZCAgICBTRExPU1hDQUd1YXJkX05vdGlmeShTRExPU1hDQUd1YXJkICpjYWcpCi17Ci0gICAgT1NTdGF0dXMgdGhlRXJyb3IgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZjYWctPm1Db25kVmFyKTsKLSAgICAodm9pZCl0aGVFcnJvcjsKLSAgICBhc3NlcnQodGhlRXJyb3IgPT0gMCk7Ci19Ci0KLQotU0RMT1NYQ0FHdWFyZCAqbmV3X1NETE9TWENBR3VhcmQodm9pZCkKLXsKLSAgICBPU1N0YXR1cyB0aGVFcnJvcjsKLSAgICBTRExPU1hDQUd1YXJkICpjYWcgPSAoU0RMT1NYQ0FHdWFyZCAqKSBTRExfbWFsbG9jKHNpemVvZiAoU0RMT1NYQ0FHdWFyZCkpOwotICAgIGlmIChjYWcgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgU0RMX21lbXNldChjYWcsICdcMCcsIHNpemVvZiAoKmNhZykpOwotCi0gICAgI2RlZmluZSBTRVRfU0RMT1NYQ0FHVUFSRF9NRVRIT0QobSkgY2FnLT5tID0gU0RMT1NYQ0FHdWFyZF8jI20KLSAgICBTRVRfU0RMT1NYQ0FHVUFSRF9NRVRIT0QoTG9jayk7Ci0gICAgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9EKFVubG9jayk7Ci0gICAgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9EKFRyeSk7Ci0gICAgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9EKFdhaXQpOwotICAgIFNFVF9TRExPU1hDQUdVQVJEX01FVEhPRChOb3RpZnkpOwotICAgICN1bmRlZiBTRVRfU0RMT1NYQ0FHVUFSRF9NRVRIT0QKLQotICAgIHRoZUVycm9yID0gcHRocmVhZF9tdXRleF9pbml0KCZjYWctPm1NdXRleCwgTlVMTCk7Ci0gICAgKHZvaWQpdGhlRXJyb3I7Ci0gICAgYXNzZXJ0KHRoZUVycm9yID09IDApOwotICAgIAotICAgIHRoZUVycm9yID0gcHRocmVhZF9jb25kX2luaXQoJmNhZy0+bUNvbmRWYXIsIE5VTEwpOwotICAgICh2b2lkKXRoZUVycm9yOwotICAgIGFzc2VydCh0aGVFcnJvciA9PSAwKTsKLSAgICAKLSAgICBjYWctPm1Pd25lciA9IDA7Ci0gICAgcmV0dXJuIGNhZzsKLX0KLQotdm9pZCBkZWxldGVfU0RMT1NYQ0FHdWFyZChTRExPU1hDQUd1YXJkICpjYWcpCi17Ci0gICAgaWYgKGNhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZjYWctPm1NdXRleCk7Ci0gICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjYWctPm1Db25kVmFyKTsKLSAgICAgICAgU0RMX2ZyZWUoY2FnKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L1NETE9TWENBR3VhcmQuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L1NETE9TWENBR3VhcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwMzg3YS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9TRExPU1hDQUd1YXJkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qICAKLSAgICBOb3RlOiBUaGlzIGZpbGUgaGFzbid0IGJlZW4gbW9kaWZpZWQgc28gdGVjaG5pY2FsbHkgd2UgaGF2ZSB0byBrZWVwIHRoZSBkaXNjbGFpbWVyIDotKAotCi0KLSAgICBDb3B5cmlnaHQ6ICCpIENvcHlyaWdodCAyMDAyIEFwcGxlIENvbXB1dGVyLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICBEaXNjbGFpbWVyOiBJTVBPUlRBTlQ6ICBUaGlzIEFwcGxlIHNvZnR3YXJlIGlzIHN1cHBsaWVkIHRvIHlvdSBieSBBcHBsZSBDb21wdXRlciwgSW5jLgotICAgICAgICAgICAgKCJBcHBsZSIpIGluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIKLSAgICAgICAgICAgIHVzZSwgaW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZQotICAgICAgICAgICAgY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcy4gIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcywKLSAgICAgICAgICAgIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCi0KLSAgICAgICAgICAgIEluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHN1YmplY3QKLSAgICAgICAgICAgIHRvIHRoZXNlIHRlcm1zLCBBcHBsZSBncmFudHMgeW91IGEgcGVyc29uYWwsIG5vbi1leGNsdXNpdmUgbGljZW5zZSwgdW5kZXIgQXBwbGXVcwotICAgICAgICAgICAgY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIEFwcGxlIHNvZnR3YXJlICh0aGUgIkFwcGxlIFNvZnR3YXJlIiksIHRvIHVzZSwKLSAgICAgICAgICAgIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5IGZvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUKLSAgICAgICAgICAgIHRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgeW91IG11c3QgcmV0YWluCi0gICAgICAgICAgICB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YKLSAgICAgICAgICAgIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3Mgb3IgbG9nb3Mgb2YKLSAgICAgICAgICAgIEFwcGxlIENvbXB1dGVyLCBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCi0gICAgICAgICAgICBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiAgRXhjZXB0IGFzCi0gICAgICAgICAgICBleHByZXNzbHkgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwKLSAgICAgICAgICAgIGFyZSBncmFudGVkIGJ5IEFwcGxlIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0Ci0gICAgICAgICAgICBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIgZGVyaXZhdGl2ZSB3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgQXBwbGUKLSAgICAgICAgICAgIFNvZnR3YXJlIG1heSBiZSBpbmNvcnBvcmF0ZWQuCi0KLSAgICAgICAgICAgIFRoZSBBcHBsZSBTb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBBcHBsZSBvbiBhbiAiQVMgSVMiIGJhc2lzLiAgQVBQTEUgTUFLRVMgTk8KLSAgICAgICAgICAgIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRAotICAgICAgICAgICAgV0FSUkFOVElFUyBPRiBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICAgICAgICAgICAgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBBUFBMRSBTT0ZUV0FSRSBPUiBJVFMgVVNFIEFORCBPUEVSQVRJT04gQUxPTkUgT1IgSU4KLSAgICAgICAgICAgIENPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4KLQotICAgICAgICAgICAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwgT1IKLSAgICAgICAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKLSAgICAgICAgICAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICAgICAgICAgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFLCBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBBTkQvT1IgRElTVFJJQlVUSU9OCi0gICAgICAgICAgICBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwgVE9SVAotICAgICAgICAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4KLSAgICAgICAgICAgIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBDQUd1YXJkLmgKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotI2lmICFkZWZpbmVkKF9fQ0FHdWFyZF9oX18pCi0jZGVmaW5lIF9fQ0FHdWFyZF9oX18KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIEluY2x1ZGVzCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgPENvcmVBdWRpby9Db3JlQXVkaW9UeXBlcy5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgQ0FHdWFyZAotICAKLSAgICBUaGlzIGlzIHlvdXIgdHlwaWNhbCBtdXRleCB3aXRoIHNpZ25hbGxpbmcgaW1wbGVtZW50ZWQgdmlhIHB0aHJlYWRzLgotICAgIExvY2soKSB3aWxsIHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBndWFyZCBpcyBsb2NrZWQgb24gdGhhdCBjYWxsLgotICAgIEEgdGhyZWFkIHRoYXQgYWxyZWFkeSBoYXMgdGhlIGd1YXJkIHdpbGwgcmVjZWl2ZSAnZmFsc2UnIGlmIGl0IGxvY2tzIGl0Ci0gICAgYWdhaW4uIFVzZSBvZiB0aGUgc3RhY2stYmFzZWQgQ0FHdWFyZDo6TG9ja2VyIGNsYXNzIGlzIGhpZ2hseSByZWNvbW1lbmRlZAotICAgIHRvIHByb3Blcmx5IG1hbmFnZSB0aGUgcmVjdXJzaXZlIG5lc3RpbmcuIFRoZSBXYWl0IGNhbGxzIHdpdGggdGltZW91dHMKLSAgICB3aWxsIHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0aW1lb3V0IHBlcmlvZCBleHBpcmVkLiBUaGV5IHdpbGwKLSAgICByZXR1cm4gZmFsc2UgaWYgdGhleSByZWNlaXZlIG5vdGlmaWNhdGlvbiBhbnkgb3RoZXIgd2F5LgotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXR5cGVkZWYgc3RydWN0IFNfU0RMT1NYQ0FHdWFyZAotewotCi0vKiAgQ29uc3RydWN0aW9uL0Rlc3RydWN0aW9uICovCi0vKnB1YmxpYzoqLwotLyogIEFjdGlvbnMgKi8KLS8qcHVibGljOiovCi0gICAgaW50ICAgICAoKkxvY2spKHN0cnVjdCBTX1NETE9TWENBR3VhcmQgKmNhZyk7Ci0gICAgdm9pZCAgICAoKlVubG9jaykoc3RydWN0IFNfU0RMT1NYQ0FHdWFyZCAqY2FnKTsKLSAgICBpbnQgICAgICgqVHJ5KShzdHJ1Y3QgU19TRExPU1hDQUd1YXJkICpjYWcsIGludCAqb3V0V2FzTG9ja2VkKTsgICAgLyogcmV0dXJucyB0cnVlIGlmIGxvY2sgaXMgZnJlZSwgZmFsc2UgaWYgbm90ICovCi0gICAgdm9pZCAgICAoKldhaXQpKHN0cnVjdCBTX1NETE9TWENBR3VhcmQgKmNhZyk7Ci0gICAgdm9pZCAgICAoKk5vdGlmeSkoc3RydWN0IFNfU0RMT1NYQ0FHdWFyZCAqY2FnKTsKLQotLyogIEltcGxlbWVudGF0aW9uICovCi0vKnByb3RlY3RlZDoqLwotICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7Ci0gICAgcHRocmVhZF9jb25kX3QgIG1Db25kVmFyOwotICAgIHB0aHJlYWRfdCAgICAgICBtT3duZXI7Ci19IFNETE9TWENBR3VhcmQ7Ci0KLVNETE9TWENBR3VhcmQgKm5ld19TRExPU1hDQUd1YXJkKHZvaWQpOwotdm9pZCBkZWxldGVfU0RMT1NYQ0FHdWFyZChTRExPU1hDQUd1YXJkICpjYWcpOwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9tYWNvc3gvU0RMX3N5c2Nkcm9tLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9TRExfc3lzY2Ryb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0M2Q4Yi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9TRExfc3lzY2Ryb20uYworKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9DRFJPTV9NQUNPU1gKLQotI2luY2x1ZGUgIlNETF9zeXNjZHJvbV9jLmgiCi0KLSNwcmFnbWEgbWFyayAtLSBHbG9iYWxzIC0tCi0KLXN0YXRpYyBGU1JlZioqICAgICAgICAgdHJhY2tzOwotc3RhdGljIEZTVm9sdW1lUmVmTnVtKiB2b2x1bWVzOwotc3RhdGljIENEc3RhdHVzICAgICAgICBzdGF0dXM7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgIG5leHRUcmFja0ZyYW1lOwotc3RhdGljIGludCAgICAgICAgICAgICBuZXh0VHJhY2tGcmFtZXNSZW1haW5pbmc7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgIGZha2VDRDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgY3VycmVudFRyYWNrOwotc3RhdGljIGludCAgICAgICAgICAgICBkaWRSZWFkVE9DOwotc3RhdGljIGludCAgICAgICAgICAgICBjYWNoZVRPQ051bVRyYWNrczsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgY3VycmVudERyaXZlOyAvKiBPbmx5IGFsbG93IDEgZHJpdmUgaW4gdXNlIGF0IGEgdGltZSAqLwotCi0jcHJhZ21hIG1hcmsgLS0gUHJvdG90eXBlcyAtLQotCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUgICAoaW50IGRyaXZlKTsKLXN0YXRpYyBpbnQgICAgICAgICBTRExfU1lTX0NET3BlbiAgIChpbnQgZHJpdmUpOwotc3RhdGljIGludCAgICAgICAgIFNETF9TWVNfQ0RHZXRUT0MgKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIENEc3RhdHVzICAgIFNETF9TWVNfQ0RTdGF0dXMgKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOwotc3RhdGljIGludCAgICAgICAgIFNETF9TWVNfQ0RQbGF5ICAgKFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRFBhdXNlICAoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRFJlc3VtZSAoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRFN0b3AgICAoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DREVqZWN0ICAoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgU0RMX1NZU19DRENsb3NlICAoU0RMX0NEICpjZHJvbSk7Ci0KLSNwcmFnbWEgbWFyayAtLSBIZWxwZXIgRnVuY3Rpb25zIC0tCi0KLS8qIFJlYWQgYSBsaXN0IG9mIHRyYWNrcyBmcm9tIHRoZSB2b2x1bWUgKi8KLXN0YXRpYyBpbnQgTG9hZFRyYWNrcyAoU0RMX0NEICpjZHJvbSkKLXsKLSAgICAvKiBDaGVjayBpZiB0cmFja3MgYXJlIGFscmVhZHkgbG9hZGVkICovCi0gICAgaWYgICggdHJhY2tzW2Nkcm9tLT5pZF0gIT0gTlVMTCApCi0gICAgICAgIHJldHVybiAwOwotICAgICAgICAKLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRyYWNrcyAqLwotICAgIHRyYWNrc1tjZHJvbS0+aWRdID0gKEZTUmVmKikgU0RMX2NhbGxvYyAoMSwgc2l6ZW9mKCoqdHJhY2tzKSAqIGNkcm9tLT5udW10cmFja3MpOwotICAgIGlmICh0cmFja3NbY2Ryb20tPmlkXSA9PSBOVUxMKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICAvKiBMb2FkIHRyYWNrcyAqLwotICAgIGlmIChMaXN0VHJhY2tGaWxlcyAodm9sdW1lc1tjZHJvbS0+aWRdLCB0cmFja3NbY2Ryb20tPmlkXSwgY2Ryb20tPm51bXRyYWNrcykgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogRmluZCBhIGZpbGUgZm9yIGEgZ2l2ZW4gc3RhcnQgZnJhbWUgYW5kIGxlbmd0aCAqLwotc3RhdGljIEZTUmVmKiBHZXRGaWxlRm9yT2Zmc2V0IChTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsICBpbnQgKm91dFN0YXJ0RnJhbWUsIGludCAqb3V0U3RvcEZyYW1lKQotewotICAgIGludCBpOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBjZHJvbS0+bnVtdHJhY2tzOyBpKyspIHsKLSAgICAKLSAgICAgICAgaWYgKGNkcm9tLT50cmFja1tpXS5vZmZzZXQgPD0gc3RhcnQgJiYKLSAgICAgICAgICAgIHN0YXJ0IDwgKGNkcm9tLT50cmFja1tpXS5vZmZzZXQgKyBjZHJvbS0+dHJhY2tbaV0ubGVuZ3RoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICBpZiAoaSA9PSBjZHJvbS0+bnVtdHJhY2tzKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgCi0gICAgY3VycmVudFRyYWNrID0gaTsKLQotICAgICpvdXRTdGFydEZyYW1lID0gc3RhcnQgLSBjZHJvbS0+dHJhY2tbaV0ub2Zmc2V0OwotICAgIAotICAgIGlmICgoKm91dFN0YXJ0RnJhbWUgKyBsZW5ndGgpIDwgY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCkgewotICAgICAgICAqb3V0U3RvcEZyYW1lID0gKm91dFN0YXJ0RnJhbWUgKyBsZW5ndGg7Ci0gICAgICAgIGxlbmd0aCA9IDA7Ci0gICAgICAgIG5leHRUcmFja0ZyYW1lID0gLTE7Ci0gICAgICAgIG5leHRUcmFja0ZyYW1lc1JlbWFpbmluZyA9IC0xOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgKm91dFN0b3BGcmFtZSA9IC0xOwotICAgICAgICBsZW5ndGggLT0gY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCAtICpvdXRTdGFydEZyYW1lOwotICAgICAgICBuZXh0VHJhY2tGcmFtZSA9IGNkcm9tLT50cmFja1tpKzFdLm9mZnNldDsKLSAgICAgICAgbmV4dFRyYWNrRnJhbWVzUmVtYWluaW5nID0gbGVuZ3RoOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gJnRyYWNrc1tjZHJvbS0+aWRdW2ldOwotfQotCi0vKiBTZXR1cCBhbm90aGVyIGZpbGUgZm9yIHBsYXliYWNrLCBvciBzdG9wIHBsYXliYWNrIChjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZCkgKi8KLXN0YXRpYyB2b2lkIENvbXBsZXRpb25Qcm9jIChTRExfQ0QgKmNkcm9tKQotewotICAgIAotICAgIExvY2sgKCk7Ci0gICAgCi0gICAgaWYgKG5leHRUcmFja0ZyYW1lID4gMCAmJiBuZXh0VHJhY2tGcmFtZXNSZW1haW5pbmcgPiAwKSB7Ci0gICAgCi0gICAgICAgIC8qIExvYWQgdGhlIG5leHQgZmlsZSB0byBwbGF5ICovCi0gICAgICAgIGludCBzdGFydEZyYW1lLCBzdG9wRnJhbWU7Ci0gICAgICAgIEZTUmVmICpmaWxlOwotICAgICAgICAKLSAgICAgICAgUGF1c2VGaWxlICgpOwotICAgICAgICBSZWxlYXNlRmlsZSAoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgZmlsZSA9IEdldEZpbGVGb3JPZmZzZXQgKGNkcm9tLCBuZXh0VHJhY2tGcmFtZSwgCi0gICAgICAgICAgICBuZXh0VHJhY2tGcmFtZXNSZW1haW5pbmcsICZzdGFydEZyYW1lLCAmc3RvcEZyYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0gICAgICAgICAgICBVbmxvY2sgKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIExvYWRGaWxlIChmaWxlLCBzdGFydEZyYW1lLCBzdG9wRnJhbWUpOwotICAgICAgICAKLSAgICAgICAgU2V0Q29tcGxldGlvblByb2MgKENvbXBsZXRpb25Qcm9jLCBjZHJvbSk7Ci0gICAgICAgIAotICAgICAgICBQbGF5RmlsZSAoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCi0gICAgICAgIC8qIFJlbGVhc2UgdGhlIGN1cnJlbnQgZmlsZSAqLwotICAgICAgICBQYXVzZUZpbGUgKCk7Ci0gICAgICAgIFJlbGVhc2VGaWxlICgpOwotICAgICAgICBzdGF0dXMgPSBDRF9TVE9QUEVEOwotICAgIH0KLSAgICAKLSAgICBVbmxvY2sgKCk7Ci19Ci0KLQotI3ByYWdtYSBtYXJrIC0tIERyaXZlciBGdW5jdGlvbnMgLS0KLQotLyogSW5pdGlhbGl6ZSAqLwotaW50IFNETF9TWVNfQ0RJbml0ICh2b2lkKSAKLXsKLSAgICAvKiBJbml0aWFsaXplIGdsb2JhbHMgKi8KLSAgICB2b2x1bWVzID0gTlVMTDsKLSAgICB0cmFja3MgID0gTlVMTDsKLSAgICBzdGF0dXMgID0gQ0RfU1RPUFBFRDsKLSAgICBuZXh0VHJhY2tGcmFtZSA9IC0xOwotICAgIG5leHRUcmFja0ZyYW1lc1JlbWFpbmluZyA9IC0xOwotICAgIGZha2VDRCAgPSBTRExfRkFMU0U7Ci0gICAgY3VycmVudFRyYWNrID0gLTE7Ci0gICAgZGlkUmVhZFRPQyA9IFNETF9GQUxTRTsKLSAgICBjYWNoZVRPQ051bVRyYWNrcyA9IC0xOwotICAgIGN1cnJlbnREcml2ZSA9IC0xOwotICAgIAotICAgIC8qIEZpbGwgaW4gZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgICBTRExfQ0RjYXBzLk5hbWUgICA9IFNETF9TWVNfQ0ROYW1lOwotICAgIFNETF9DRGNhcHMuT3BlbiAgID0gU0RMX1NZU19DRE9wZW47Ci0gICAgU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOwotICAgIFNETF9DRGNhcHMuU3RhdHVzID0gU0RMX1NZU19DRFN0YXR1czsKLSAgICBTRExfQ0RjYXBzLlBsYXkgICA9IFNETF9TWVNfQ0RQbGF5OwotICAgIFNETF9DRGNhcHMuUGF1c2UgID0gU0RMX1NZU19DRFBhdXNlOwotICAgIFNETF9DRGNhcHMuUmVzdW1lID0gU0RMX1NZU19DRFJlc3VtZTsKLSAgICBTRExfQ0RjYXBzLlN0b3AgICA9IFNETF9TWVNfQ0RTdG9wOwotICAgIFNETF9DRGNhcHMuRWplY3QgID0gU0RMX1NZU19DREVqZWN0OwotICAgIFNETF9DRGNhcHMuQ2xvc2UgID0gU0RMX1NZU19DRENsb3NlOwotCi0gICAgLyogCi0gICAgICAgIFJlYWQgdGhlIGxpc3Qgb2YgImRyaXZlcyIKLSAgICAgICAgCi0gICAgICAgIFRoaXMgaXMgY3VycmVudGx5IGEgaGFjayB0aGF0IGluZmVycyBkcml2ZXMgZnJvbQotICAgICAgICBtb3VudGVkIGF1ZGlvIENEIHZvbHVtZXMsIHJhdGhlciB0aGFuCi0gICAgICAgIGFjdHVhbCBDRC1ST00gZGV2aWNlcyAtIHdoaWNoIG1lYW5zIGl0IG1heSBub3QKLSAgICAgICAgYWN0IGFzIGV4cGVjdGVkIHNvbWV0aW1lcy4KLSAgICAqLwotICAgIAotICAgIC8qIEZpbmQgb3V0IGhvdyBtYW55IGNkIHZvbHVtZXMgYXJlIG1vdW50ZWQgKi8KLSAgICBTRExfbnVtY2RzID0gRGV0ZWN0QXVkaW9DRFZvbHVtZXMgKE5VTEwsIDApOwotCi0gICAgLyoKLSAgICAgICAgSWYgdGhlcmUgYXJlIG5vIHZvbHVtZXMsIGZha2UgYSBjZCBkZXZpY2UKLSAgICAgICAgc28gdHJheSBlbXB0eSBjYW4gYmUgcmVwb3J0ZWQuCi0gICAgKi8KLSAgICBpZiAoU0RMX251bWNkcyA9PSAwKSB7Ci0gICAgCi0gICAgICAgIGZha2VDRCA9IFNETF9UUlVFOwotICAgICAgICBTRExfbnVtY2RzID0gMTsKLSAgICAgICAgc3RhdHVzID0gQ0RfVFJBWUVNUFRZOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB2b2x1bWVzICovCi0gICAgdm9sdW1lcyA9IChGU1ZvbHVtZVJlZk51bSopIFNETF9jYWxsb2MgKDEsIHNpemVvZigqdm9sdW1lcykgKiBTRExfbnVtY2RzKTsKLSAgICBpZiAodm9sdW1lcyA9PSBOVUxMKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdHJhY2tzICovCi0gICAgdHJhY2tzID0gKEZTUmVmKiopIFNETF9jYWxsb2MgKDEsIHNpemVvZigqdHJhY2tzKSAqIChTRExfbnVtY2RzICsgMSkpOwotICAgIGlmICh0cmFja3MgPT0gTlVMTCkgewotICAgICAgICBTRExfT3V0T2ZNZW1vcnkgKCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgLyogTWFyayB0aGUgZW5kIG9mIHRoZSB0cmFja3MgYXJyYXkgKi8KLSAgICB0cmFja3NbIFNETF9udW1jZHMgXSA9IChGU1JlZiopLTE7Ci0gICAgCi0gICAgLyogCi0gICAgICAgIFJlZGV0ZWN0LCBub3cgc2F2ZSBhbGwgdm9sdW1lcyBmb3IgbGF0ZXIKLSAgICAgICAgVXBkYXRlIFNETF9udW1jZHMganVzdCBpbiBjYXNlIGl0IGNoYW5nZWQKLSAgICAqLwotICAgIHsKLSAgICAgICAgaW50IG51bVZvbHVtZXMgPSBTRExfbnVtY2RzOwotICAgICAgICAKLSAgICAgICAgU0RMX251bWNkcyA9IERldGVjdEF1ZGlvQ0RWb2x1bWVzICh2b2x1bWVzLCBudW1Wb2x1bWVzKTsKLSAgICAgICAgCi0gICAgICAgIC8qIElmIG1vcmUgY2RzIHN1ZGRlbmx5IHNob3cgdXAsIGlnbm9yZSB0aGVtICovCi0gICAgICAgIGlmIChTRExfbnVtY2RzID4gbnVtVm9sdW1lcykgewotICAgICAgICAgICAgU0RMX1NldEVycm9yICgiU29tZSBDRCdzIHdlcmUgYWRkZWQgYnV0IHRoZXkgd2lsbCBiZSBpZ25vcmVkIik7Ci0gICAgICAgICAgICBTRExfbnVtY2RzID0gbnVtVm9sdW1lczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotLyogU2h1dGRvd24gYW5kIGNsZWFudXAgKi8KLXZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCkKLXsKLSAgICBSZWxlYXNlRmlsZSgpOwotICAgIAotICAgIGlmICh2b2x1bWVzICE9IE5VTEwpCi0gICAgICAgIGZyZWUgKHZvbHVtZXMpOwotICAgICAgICAKLSAgICBpZiAodHJhY2tzICE9IE5VTEwpIHsKLSAgICAKLSAgICAgICAgRlNSZWYgKipwdHI7Ci0gICAgICAgIGZvciAocHRyID0gdHJhY2tzOyAqcHRyICE9IChGU1JlZiopLTE7IHB0cisrKQotICAgICAgICAgICAgaWYgKCpwdHIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBmcmVlICgqcHRyKTsKLSAgICAgICAgICAgIAotICAgICAgICBmcmVlICh0cmFja3MpOwotICAgIH0KLX0KLQotLyogR2V0IHRoZSBVbml4IGRpc2sgbmFtZSBvZiB0aGUgdm9sdW1lICovCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUgKGludCBkcml2ZSkKLXsKLSAgICBPU1N0YXR1cyAgICAgZXJyID0gbm9FcnI7Ci0gICAgSFBhcmFtQmxvY2tSZWMgIHBiOwotICAgIEdldFZvbFBhcm1zSW5mb0J1ZmZlciAgIHZvbFBhcm1zSW5mbzsKLSAgIAotICAgIGlmIChmYWtlQ0QpCi0gICAgICAgIHJldHVybiAiRmFrZSBDRC1ST00gRGV2aWNlIjsKLQotICAgIHBiLmlvUGFyYW0uaW9OYW1lUHRyID0gTlVMTDsKLSAgICBwYi5pb1BhcmFtLmlvVlJlZk51bSA9IHZvbHVtZXNbZHJpdmVdOwotICAgIHBiLmlvUGFyYW0uaW9CdWZmZXIgPSAoUHRyKSZ2b2xQYXJtc0luZm87Ci0gICAgcGIuaW9QYXJhbS5pb1JlcUNvdW50ID0gKFNJbnQzMilzaXplb2Yodm9sUGFybXNJbmZvKTsKLSAgICBlcnIgPSBQQkhHZXRWb2xQYXJtc1N5bmMoJnBiKTsKLQotICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICAgICAgU0RMX1NldEVycm9yICgiUEJIR2V0Vm9sUGFybXNTeW5jIHJldHVybmVkICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZvbFBhcm1zSW5mby52TURldmljZUlEOwotfQotCi0vKiBPcGVuIHRoZSAiZGV2aWNlIiAqLwotc3RhdGljIGludCBTRExfU1lTX0NET3BlbiAoaW50IGRyaXZlKQotewotICAgIC8qIE9ubHkgYWxsb3cgMSBkZXZpY2UgdG8gYmUgb3BlbiAqLwotICAgIGlmIChjdXJyZW50RHJpdmUgPj0gMCkgewotICAgICAgICBTRExfU2V0RXJyb3IgKCJPbmx5IG9uZSBjZHJvbSBpcyBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGN1cnJlbnREcml2ZSA9IGRyaXZlOwotCi0gICAgcmV0dXJuIGRyaXZlOwotfQotCi0vKiBHZXQgdGhlIHRhYmxlIG9mIGNvbnRlbnRzICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MgKFNETF9DRCAqY2Ryb20pCi17Ci0gICAgaWYgKGZha2VDRCkgewotICAgICAgICBTRExfU2V0RXJyb3IgKGtFcnJvckZha2VEZXZpY2UpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIGlmIChkaWRSZWFkVE9DKSB7Ci0gICAgICAgIGNkcm9tLT5udW10cmFja3MgPSBjYWNoZVRPQ051bVRyYWNrczsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIAotICAgIFJlYWRUT0NEYXRhICh2b2x1bWVzW2Nkcm9tLT5pZF0sIGNkcm9tKTsKLSAgICBkaWRSZWFkVE9DID0gU0RMX1RSVUU7Ci0gICAgY2FjaGVUT0NOdW1UcmFja3MgPSBjZHJvbS0+bnVtdHJhY2tzOwotICAgIAotICAgIHJldHVybiAwOwotfQotCi0vKiBHZXQgQ0QtUk9NIHN0YXR1cyAqLwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMgKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pCi17Ci0gICAgaWYgKHBvc2l0aW9uKSB7Ci0gICAgICAgIGludCB0cmFja0ZyYW1lOwotICAgICAgICAKLSAgICAgICAgTG9jayAoKTsKLSAgICAgICAgdHJhY2tGcmFtZSA9IEdldEN1cnJlbnRGcmFtZSAoKTsKLSAgICAgICAgVW5sb2NrICgpOwotICAgIAotICAgICAgICAqcG9zaXRpb24gPSBjZHJvbS0+dHJhY2tbY3VycmVudFRyYWNrXS5vZmZzZXQgKyB0cmFja0ZyYW1lOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vKiBTdGFydCBwbGF5YmFjayAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi17Ci0gICAgaW50IHN0YXJ0RnJhbWUsIHN0b3BGcmFtZTsKLSAgICBGU1JlZiAqcmVmOwotICAgIAotICAgIGlmIChmYWtlQ0QpIHsKLSAgICAgICAgU0RMX1NldEVycm9yIChrRXJyb3JGYWtlRGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBMb2NrKCk7Ci0gICAgCi0gICAgaWYgKExvYWRUcmFja3MgKGNkcm9tKSA8IDApCi0gICAgICAgIHJldHVybiAtMjsKLSAgICAKLSAgICBpZiAoUGF1c2VGaWxlICgpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0zOwotICAgICAgICAKLSAgICBpZiAoUmVsZWFzZUZpbGUgKCkgPCAwKQotICAgICAgICByZXR1cm4gLTQ7Ci0gICAgCi0gICAgcmVmID0gR2V0RmlsZUZvck9mZnNldCAoY2Ryb20sIHN0YXJ0LCBsZW5ndGgsICZzdGFydEZyYW1lLCAmc3RvcEZyYW1lKTsKLSAgICBpZiAocmVmID09IE5VTEwpIHsKLSAgICAgICAgU0RMX1NldEVycm9yICgiU0RMX1NZU19DRFBsYXk6IE5vIGZpbGUgZm9yIHN0YXJ0PSVkLCBsZW5ndGg9JWQiLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIC01OwotICAgIH0KLSAgICAKLSAgICBpZiAoTG9hZEZpbGUgKHJlZiwgc3RhcnRGcmFtZSwgc3RvcEZyYW1lKSA8IDApCi0gICAgICAgIHJldHVybiAtNjsKLSAgICAKLSAgICBTZXRDb21wbGV0aW9uUHJvYyAoQ29tcGxldGlvblByb2MsIGNkcm9tKTsKLSAgICAKLSAgICBpZiAoUGxheUZpbGUgKCkgPCAwKQotICAgICAgICByZXR1cm4gLTc7Ci0gICAgCi0gICAgc3RhdHVzID0gQ0RfUExBWUlORzsKLSAgICAKLSAgICBVbmxvY2soKTsKLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotLyogUGF1c2UgcGxheWJhY2sgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pCi17Ci0gICAgaWYgKGZha2VDRCkgewotICAgICAgICBTRExfU2V0RXJyb3IgKGtFcnJvckZha2VEZXZpY2UpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIExvY2sgKCk7Ci0gICAgCi0gICAgaWYgKFBhdXNlRmlsZSAoKSA8IDApIHsKLSAgICAgICAgVW5sb2NrICgpOwotICAgICAgICByZXR1cm4gLTI7Ci0gICAgfQotICAgIAotICAgIHN0YXR1cyA9IENEX1BBVVNFRDsKLSAgICAKLSAgICBVbmxvY2sgKCk7Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJlc3VtZSBwbGF5YmFjayAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pCi17Ci0gICAgaWYgKGZha2VDRCkgewotICAgICAgICBTRExfU2V0RXJyb3IgKGtFcnJvckZha2VEZXZpY2UpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIExvY2sgKCk7Ci0gICAgCi0gICAgaWYgKFBsYXlGaWxlICgpIDwgMCkgewotICAgICAgICBVbmxvY2sgKCk7Ci0gICAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0gICAgICAgIAotICAgIHN0YXR1cyA9IENEX1BMQVlJTkc7Ci0gICAgCi0gICAgVW5sb2NrICgpOwotICAgIAotICAgIHJldHVybiAwOwotfQotCi0vKiBTdG9wIHBsYXliYWNrICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pCi17Ci0gICAgaWYgKGZha2VDRCkgewotICAgICAgICBTRExfU2V0RXJyb3IgKGtFcnJvckZha2VEZXZpY2UpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIExvY2sgKCk7Ci0gICAgCi0gICAgaWYgKFBhdXNlRmlsZSAoKSA8IDApIHsKLSAgICAgICAgVW5sb2NrICgpOwotICAgICAgICByZXR1cm4gLTI7Ci0gICAgfQotICAgICAgICAKLSAgICBpZiAoUmVsZWFzZUZpbGUgKCkgPCAwKSB7Ci0gICAgICAgIFVubG9jayAoKTsKLSAgICAgICAgcmV0dXJuIC0zOwotICAgIH0KLSAgICAgICAgCi0gICAgc3RhdHVzID0gQ0RfU1RPUFBFRDsKLSAgICAKLSAgICBVbmxvY2sgKCk7Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEVqZWN0IHRoZSBDRC1ST00gKFVubW91bnQgdGhlIHZvbHVtZSkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pCi17Ci0gICAgT1NTdGF0dXMgZXJyOwotICAgIHBpZF90IGRpc3NlbnRlcjsKLQotICAgIGlmIChmYWtlQ0QpIHsKLSAgICAgICAgU0RMX1NldEVycm9yIChrRXJyb3JGYWtlRGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBMb2NrICgpOwotICAgIAotICAgIGlmIChQYXVzZUZpbGUgKCkgPCAwKSB7Ci0gICAgICAgIFVubG9jayAoKTsKLSAgICAgICAgcmV0dXJuIC0yOwotICAgIH0KLSAgICAgICAgCi0gICAgaWYgKFJlbGVhc2VGaWxlICgpIDwgMCkgewotICAgICAgICBVbmxvY2sgKCk7Ci0gICAgICAgIHJldHVybiAtMzsKLSAgICB9Ci0gICAgCi0gICAgc3RhdHVzID0gQ0RfU1RPUFBFRDsKLSAgICAKLQkvKiBFamVjdCB0aGUgdm9sdW1lICovCi0JZXJyID0gRlNFamVjdFZvbHVtZVN5bmModm9sdW1lc1tjZHJvbS0+aWRdLCBrTmlsT3B0aW9ucywgJmRpc3NlbnRlcik7Ci0KLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgICAgIFVubG9jayAoKTsKLQkJU0RMX1NldEVycm9yICgiUEJVbm1vdW50Vm9sIHJldHVybmVkICVkIiwgZXJyKTsKLQkJcmV0dXJuIC00OwotCX0KLSAgICAKLSAgICBzdGF0dXMgPSBDRF9UUkFZRU1QVFk7Ci0KLSAgICAvKiBJbnZhbGlkYXRlIHZvbHVtZSBhbmQgdHJhY2sgaW5mbyAqLwotICAgIHZvbHVtZXNbY2Ryb20tPmlkXSA9IDA7Ci0gICAgZnJlZSAodHJhY2tzW2Nkcm9tLT5pZF0pOwotICAgIHRyYWNrc1tjZHJvbS0+aWRdID0gTlVMTDsKLSAgICAKLSAgICBVbmxvY2sgKCk7Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENsb3NlIHRoZSBDRC1ST00gKi8KLXN0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKQotewotICAgIGN1cnJlbnREcml2ZSA9IC0xOwotICAgIHJldHVybjsKLX0KLQotI2VuZGlmIC8qIFNETF9DRFJPTV9NQUNPU1ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L1NETF9zeXNjZHJvbV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21hY29zeC9TRExfc3lzY2Ryb21fYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzEzMTk4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWFjb3N4L1NETF9zeXNjZHJvbV9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoaXMgaXMgdGhlIE1hYyBPUyBYIC8gQ29yZUF1ZGlvIHNwZWNpZmljIGhlYWRlciBmb3IgdGhlIFNETCBDRC1ST00gQVBJCi0gICBDb250cmlidXRlZCBieSBEYXJyZWxsIFdhbGlzc2VyIGFuZCBNYXggSG9ybgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEltcGxlbWVudGF0aW9uIE5vdGVzCi0gKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBUaGlzIGNvZGUgaGFzIHNldmVyYWwgbGltaXRhdGlvbnMgY3VycmVudGx5IChhbGwgb2Ygd2hpY2ggYXJlIHByb2FiYWx5IGZpeGFibGUpOgotICAgIAotICAgIDEuIEEgQ0QtUk9NIGRldmljZSBpcyBpbmZlcnJlZCBmcm9tIGEgbW91bnRlZCBjZGZzIHZvbHVtZSwgc28gZGV2aWNlIDAgaXMKLSAgICAgICBub3QgbmVjZXNzYXJpbHkgdGhlIGZpcnN0IENELVJPTSBkZXZpY2Ugb24gdGhlIHN5c3RlbS4gKFNvbWV3aGF0IGVhc3kgdG8gZml4Ci0gICAgICAgYnkgdXNlaW5nIHRoZSBkZXZpY2UgbmFtZSBmcm9tIHRoZSB2b2x1bWUgaWQncyB0byByZW9yZGVyIHRoZSB2b2x1bWVzKQotICAgICAgIAotICAgIDIuIFlvdSBjYW4gb25seSBvcGVuIGFuZCBjb250cm9sIDEgQ0QtUk9NIGRldmljZSBhdCBhIHRpbWUuIChDaGFsbGVuZ2luZyB0byBmaXgsCi0gICAgICAgZHVlIHRvIGV4dGVuc2l2ZSBjb2RlIHJlc3RydWN0dXJpbmcpCi0gICAgCi0gICAgMy4gVGhlIHN0YXR1cyByZXBvcnRlZCBieSBTRExfQ0RTdGF0dXMgb25seSBjaGFuZ2VzIHRvIGZyb20gQ0RfUExBWUlORyB0byBDRF9TVE9QUEVEIGluCi0gICAgICAgMS1zZWNvbmQgaW50ZXJ2YWxzIChiZWNhdXNlIHRoZSBhdWRpbyBpcyBidWZmZXJlZCBpbiAxLXNlY29uZCBjaHVua3MpIElmCi0gICAgICAgdGhlIGF1ZGlvIGRhdGEgaXMgbGVzcyB0aGFuIDEgc2Vjb25kLCB0aGUgcmVtYWluZGVyIGlzIGZpbGxlZCB3aXRoIHNpbGVuY2UuCi0gICAgICAgCi0gICAgICAgSWYgeW91IG5lZWQgdG8gcGxheSBzZXF1ZW5jZXMgYmFjay10by1iYWNrIHRoYXQgYXJlIGxlc3MgdGhhdCAxIHNlY29uZCBsb25nLAotICAgICAgIHVzZSB0aGUgZnJhbWUgcG9zaXRpb24gdG8gZGV0ZXJtaW5lIHdoZW4gdG8gcGxheSB0aGUgbmV4dCBzZXF1ZW5jZSwgaW5zdGVhZAotICAgICAgIG9mIFNETF9DRFN0YXR1cy4KLSAgICAgICAKLSAgICAgICBUaGlzIG1heSBiZSBwb3NzaWJsZSB0byBmaXggd2l0aCBhIGNsZXZlciB1c2FnZSBvZiB0aGUgQXVkaW9Vbml0IEFQSS4KLSAgICAgICAKLSAgICA0LiBXaGVuIG5ldyB2b2x1bWVzIGFyZSBpbnNlcnRlZCwgb3VyIHZvbHVtZSBpbmZvcm1hdGlvbiBpcyBub3QgdXBkYXRlZC4gVGhlIG9ubHkgd2F5Ci0gICAgICAgdG8gcmVmcmVzaCB0aGlzIGluZm9ybWF0aW9uIGlzIHRvIHJlaW5pdCB0aGUgQ0QtUk9NIHN1YnN5c3RlbSBvZiBTREwuIFRvIGZpeCB0aGlzLAotICAgICAgIG9uZSB3b3VsZCBwcm9iYWJseSBoYXZlIHRvIGZpeCBwb2ludCAxIGFib3ZlIGZpcnN0LCB0aGVuIGZpZ3VyZSBvdXQgaG93IHRvIHJlZ2lzdGVyCi0gICAgICAgZm9yIGEgbm90aWZpY2F0aW9uIHdoZW4gbmV3IG1lZGlhIGlzIG1vdW50ZWQgaW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBhdXRvbWF0aWMKLSAgICAgICByZXNjYW4gZm9yIGNkZnMgdm9sdW1lcy4KLSAgICAKLSAgICAKLSAgICAKLSAgICBTbywgaGVyZSBjb21lcyBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGlzIGFsbCB3b3Jrcy4KLSAgICAKLSAgICAgICAgPCBJbml0aWFsaXppbmcgPgotICAgICAgICAKLSAgICAgICAgVG8gZ2V0IHRoaW5ncyByb2xsaW5nLCB3ZSBoYXZlIHRvIGxvY2F0ZSBtb3VudGVkIHZvbHVtZXMgdGhhdCBjb250YWluCi0gICAgICAgIGF1ZGlvIChzaW5jZSBuZWFybHkgYWxsIE1hY3MgZG9uJ3QgaGF2ZSBhbmFsb2cgYXVkaW8taW4gb24gdGhlIHNvdW5kIGNhcmQpLgotICAgICAgICBUaGF0J3MgZWFzeSwgc2luY2UgdGhlc2Ugdm9sdW1lcyBoYXZlIGEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGlzIHNwZWNpYWwKLSAgICAgICAgZmlsZXN5c3RlbS4gU2VlIERldGVjdEF1ZGlvQ0RWb2x1bWVzKCkgaW4gQ0RQbGF5ZXIuY3BwIGZvciB0aGlzIGNvZGUuCi0gICAgICAgIAotICAgICAgICBOZXh0LCB3ZSBwYXJzZSB0aGUgaW52aXNpYmxlIC5UT0MucGxpc3QgaW4gdGhlIHJvb3Qgb2YgdGhlIHZvbHVtZSwgd2hpY2ggZ2V0cyB1cwotICAgICAgICB0aGUgdHJhY2sgaW5mb3JtYXRpb24gKG51bWJlciwgb2Zmc2V0LCBsZW5ndGgsIGxlYWRvdXQsIGV0YykuIFNlZSBSZWFkVE9DRGF0YSgpIGluCi0gICAgICAgIENEUGxheWVyLmNwcCBmb3IgdGhlIHNraW5ueSBvbiB0aGlzLgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDwgVGhlIFBsYXliYWNrIExvb3AgPgotICAgICAgICAKLSAgICAgICAgTm93IGNvbWUgdGhlIHRyaWNreSBwYXJ0cy4gTGV0J3Mgc3RhcnQgd2l0aCBiYXNpYyBhdWRpbyBwbGF5YmFjay4gV2hlbiBhIGZyYW1lCi0gICAgICAgIHJhbmdlIHRvIHBsYXkgaXMgcmVxdWVzdGVkLCB3ZSBtdXN0IGZpcnN0IGZpbmQgdGhlIC5haWZmIGZpbGVzIG9uIHRoZSB2b2x1bWUsIAotICAgICAgICBob3BlZnVsbHkgaW4gdGhlIHJpZ2h0IG9yZGVyLiBTaW5jZSB0aGVzZSBmaWxlcyBhbGwgYmVnaW4gd2l0aCBhIG51bWJlciAiMSBBdWRpbyBUcmFjayIsIAotICAgICAgICBldGMsIHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdHJhY2sgb3JkZXIuCi0gICAgICAgIAotICAgICAgICBPbmNlIGFsbCBmaWxlcyBhcmUgZGV0ZXJtaW5lZCwgd2UgaGF2ZSB0byBmaW5kIHdoYXQgZmlsZSBjb3JyZXNwb25kcyB0byB0aGUgc3RhcnQKLSAgICAgICAgYW5kIGxlbmd0aCBwYXJhbWV0ZXIgdG8gU0RMX1NZU19DRFBsYXkoKS4gQWdhaW4sIHRoaXMgaXMgcXVpdGUgc2ltcGxlIGJ5IHdhbGtpbmcgdGhlCi0gICAgICAgIGNkcm9tJ3MgdHJhY2sgbGlzdC4gQXQgdGhpcyBwb2ludCwgd2UgYWxzbyBzYXZlIHRoZSBvZmZzZXQgdG8gdGhlIG5leHQgdHJhY2sgYW5kIGZyYW1lcwotICAgICAgICByZW1haW5pbmcsIGlmIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gcGxheSBhbm90aGVyIGZpbGUgYWZ0ZXIgdGhlIGZpcnN0IG9uZS4gU2VlCi0gICAgICAgIEdldEZpbGVGb3JPZmZzZXQoKSBmb3IgdGhpcyBjb2RlLgotICAgICAgICAKLSAgICAgICAgQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFsbCBpbmZvIG5lZWRlZCB0byBzdGFydCBwbGF5YmFjaywgc28gd2UgaGFuZCBvZmYgdG8gdGhlIExvYWRGaWxlKCkKLSAgICAgICAgZnVuY3Rpb24sIHdoaWNoIHByb2NlZWRzIHRvIGRvIGl0cyBtYWdpYyBhbmQgcGxheXMgYmFjayB0aGUgZmlsZS4KLSAgICAgICAgCi0gICAgICAgIFdoZW4gdGhlIGZpbGUgaXMgZmluaXNoZWQgcGxheWluZywgQ29tcGxldGlvblByb2MoKSBpcyBpbnZva2VkLCBhdCB3aGljaCB0aW1lIHdlIGNhbgotICAgICAgICBwbGF5IHRoZSBuZXh0IGZpbGUgaWYgdGhlIHByZXZpb3VzbHkgc2F2ZWQgbmV4dCB0cmFjayBhbmQgZnJhbWVzIHJlbWFpbmluZwotICAgICAgICBpbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGQuIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDwgTWFnaWMgPgotICAgICAgICAKLSAgICAgICAgT0ssIHNvIGl0J3Mgbm90IHJlYWxseSBtYWdpYywgYnV0IHNpbmNlIEkgZG9uJ3QgZnVsbHkgdW5kZXJzdGFuZCBhbGwgdGhlIGhpZGRlbiBkZXRhaWxzIGl0Ci0gICAgICAgIHNlZW1zIGxpa2UgaXQgdG8gbWUgOy0pIFRoZSBBUEkncyBpbnZvbHZlZCBhcmUgdGhlIEF1ZGlvVW5pdCBhbmQgQXVkaW9GaWxlIEFQSSdzLiBUaGVzZQotICAgICAgICBhcHBlYXIgdG8gYmUgYW4gZXh0ZW5zaW9uIG9mIENvcmVBdWRpbyBmb3IgY3JlYXRpbmcgbW9kdWxhciBwbGF5YmFjayBhbmQgZi94IGVudGl0aWVzLgotICAgICAgICBUaGUgaW1wb3J0YW50IHRoaW5nIGlzIHRoYXQgQ1BVIHVzYWdlIGlzIHZlcnkgbG93IGFuZCByZWxpYWJpbGl0eSBpcyB2ZXJ5IGhpZ2guIFlvdSdkCi0gICAgICAgIGJlIGhhcmQtcHJlc3NlZCB0byBmaW5kIGEgd2F5IHRvIHN0dXR0ZXIgdGhlIHBsYXliYWNrIHdpdGggb3RoZXIgQ1BVLWludGVuc2l2ZSB0YXNrcy4KLSAgICAKLSAgICAgICAgT25lIHBhcnQgb2YgdGhpcyBtYWdpYyBpcyB0aGF0IGl0IHVzZXMgbXVsdGlwbGUgdGhyZWFkcywgd2hpY2ggY2FycmllcyB0aGUgdXN1YWwgcG90ZW50aWFsCi0gICAgICAgIGZvciBkaXNhc3RlciBpZiBub3QgaGFuZGxlZCBjYXJlZnVsbHkuIFBsYXliYWNrIGN1cnJlbnRseSByZXF1aXJlcyA0IGFkZGl0aW9uYWwgdGhyZWFkczoKLSAgICAgICAgICAgIDEuIFRoZSBjb3JlYXVkaW8gcnVubG9vcCB0aHJlYWQKLSAgICAgICAgICAgIDIuIFRoZSBjb3JlYXVkaW8gZGV2aWNlIGkvbyB0aHJlYWQKLSAgICAgICAgICAgIDMuIFRoZSBmaWxlIHN0cmVhbWluZyB0aHJlYWQKLSAgICAgICAgICAgIDQuIFRoZSBub3RpZmljYXRpb24vY2FsbGJhY2sgdGhyZWFkCi0gICAgICAgIAotICAgICAgICBUaGUgZmlyc3QgMiB0aHJlYWRzIGFyZSBuZWNlc3NhcnkgZXZpbCAtIENvcmVBdWRpbyBjcmVhdGVzIHRoaXMgbm8gbWF0dGVyIHdoYXQgdGhlIHNpdHVhdGlvbgotICAgICAgICBpcyAoZXZlbiB0aGUgU0RMIHNvdW5kIGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgdGhlc2VzIHN1Y2tlcnMpLiBUaGUgbGFzdCB0d28gYXJlIGFyZSBjcmVhdGVkCi0gICAgICAgIGJ5IHVzLgotICAgICAgICAKLSAgICAgICAgVGhlIGZpbGUgaXMgc3RyZWFtZWQgZnJvbSBkaXNrIHVzaW5nIGEgdGhyZWFkZWQgZG91YmxlLWJ1ZmZlciBhcHByb2FjaC4gCi0gICAgICAgIFRoaXMgd2F5LCB0aGUgaGlnaCBsYXRlbmN5IG9wZXJhdGlvbiBvZiByZWFkaW5nIGZyb20gZGlzayBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgaW50ZXJydXB0aW5nCi0gICAgICAgIHRoZSByZWFsLXRpbWUgZGV2aWNlIHRocmVhZCAod2hpY2ggYW1vdW50cyB0byBhdm9pZGluZyBkcm9wb3V0cykuIFRoZSBkZXZpY2UgdGhyZWFkIGdyYWJzIHRoZQotICAgICAgICBidWZmZXIgdGhhdCBpc24ndCBiZWluZyByZWFkIGFuZCBzZW5kcyBpdCB0byB0aGUgQ29yZUF1ZGlvIG1peGVyIHdoZXJlIGl0IGV2ZW50dWFsbHkgZ2V0cyAKLSAgICAgICAgdG8gdGhlIHNvdW5kIGNhcmQuCi0gICAgICAgIAotICAgICAgICBUaGUgZGV2aWNlIHRocmVhZCBwb3N0cyBhIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBmaWxlIHN0cmVhbWluZyB0aHJlYWQgaXMgb3V0IG9mIGRhdGEuIFRoaXMKLSAgICAgICAgbm90aWZpY2F0aW9uIG11c3QgYmUgaGFuZGxlZCBpbiBhIHNlcGFyYXRlIHRocmVhZCB0byBhdm9pZCBwb3RlbnRpYWwgZGVhZGxvY2sgaW4gdGhlCi0gICAgICAgIGRldmljZSB0aHJlYWQuIFRoYXQncyB3aGVyZSB0aGUgbm90aWZpY2F0aW9uIHRocmVhZCBjb21lcyBpbi4gVGhpcyB0aHJlYWQgaXMgc2lnbmFsZWQKLSAgICAgICAgd2hlbmV2ZXIgYSBub3RpZmljYXRpb24gbmVlZHMgdG8gYmUgcHJvY2Vzc2VkLCBzbyBhbm90aGVyIGZpbGUgY2FuIGJlIHBsYXllZCBiYWNrIGlmIG5lZWQgYmUuCi0gICAgICAgIAotICAgICAgICBUaGUgQVBJIGluIENEUGxheWVyLmNwcCBjb250YWlucyBzeW5jaHJvbml6YXRpb24gYmVjYXVzZSBvdGhlcndpc2UgYm90aCB0aGUgbm90aWZpY2F0aW9uIHRocmVhZAotICAgICAgICBhbmQgbWFpbiB0aHJlYWQgKG9yIGFub3RoZXIgb3RoZXIgdGhyZWFkIHVzaW5nIHRoZSBTREwgQ0QgYXBpKSBjYW4gcG90ZW50aWFsbHkgY2FsbCBpdCBhdCB0aGUgc2FtZSB0aW1lLgotICAgIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJTRExfY2Ryb20uaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKLQotI2luY2x1ZGUgIkNEUGxheWVyLmgiCi0KLSNkZWZpbmUga0Vycm9yRmFrZURldmljZSAiRXJyb3I6IENhbm5vdCBwcm9jZWVkIHNpbmNlIHdlJ3JlIGZha2luZyBhIENELVJPTSBkZXZpY2UuIFJlaW5pdCB0aGUgQ0QtUk9NIHN1YnN5c3RlbSB0byBzY2FuIGZvciBuZXcgdm9sdW1lcy4iCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWludC9TRExfc3lzY2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vbWludC9TRExfc3lzY2Ryb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxNzg5OS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL21pbnQvU0RMX3N5c2Nkcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfQ0RST01fTUlOVAotCi0vKgotCUF0YXJpIE1ldGFET1MgQ0QtUk9NIGZ1bmN0aW9ucwotCi0JUGF0cmljZSBNYW5kaW4KLSovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSA8Y2Ryb21pby5oPgotI2luY2x1ZGUgPG1ldGFkb3MuaD4KLQotI2luY2x1ZGUgIlNETF9jZHJvbS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgotCi0vKiBTb21lIGlvY3RsKCkgZXJybm8gdmFsdWVzIHdoaWNoIG9jY3VyIHdoZW4gdGhlIHRyYXkgaXMgZW1wdHkgKi8KLSNpZm5kZWYgRU5PTUVESVVNCi0jZGVmaW5lIEVOT01FRElVTSBFTk9FTlQKLSNlbmRpZgotI2RlZmluZSBFUlJOT19UUkFZRU1QVFkoZXJybm8pCVwKLQkoKGVycm5vID09IEVJTykgICAgfHwgKGVycm5vID09IEVOT0VOVCkgfHwgXAotCSAoZXJybm8gPT0gRUlOVkFMKSB8fCAoZXJybm8gPT0gRU5PTUVESVVNKSkKLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgd2UnbGwgZGV0ZWN0ICovCi0jZGVmaW5lIE1BWF9EUklWRVMJMzIJCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBjaGFyIGRldmljZVszXTsJLyogUGh5c2ljYWwgZGV2aWNlIGxldHRlciArICc6JyArICdcMCcgKi8KLQltZXRhb3Blbl90CW1ldGFvcGVuOwkJLyogSW5mb3Mgb24gb3BlbmVkIGRyaXZlICovCi19IG1ldGFkb3NfZHJpdmVfdDsKLQotc3RhdGljIG1ldGFkb3NfZHJpdmVfdCBtZXRhZG9zX2RyaXZlc1tNQVhfRFJJVkVTXTsKLQotLyogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQ0QgY29udHJvbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOwotc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCBTRExfU1lTX0NEaW9jdGwoaW50IGlkLCBpbnQgY29tbWFuZCwgdm9pZCAqYXJnKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOwotc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7Ci0KLWludCBTRExfU1lTX0NESW5pdCh2b2lkKQotewotCW1ldGFpbml0X3QJbWV0YWluaXQ9ezAsMCwwLDB9OwotCW1ldGFvcGVuX3QJbWV0YW9wZW47Ci0JaW50IGksIGhhbmRsZTsKLQlzdHJ1Y3QgY2Ryb21fc3ViY2hubCBpbmZvOwotCi0JTWV0YWluaXQoJm1ldGFpbml0KTsKLQlpZiAobWV0YWluaXQudmVyc2lvbiA9PSBOVUxMKSB7Ci0jaWZkZWYgREVCVUdfQ0RST00KLQkJZnByaW50ZihzdGRlcnIsICJNZXRhRE9TIG5vdCBpbnN0YWxsZWRcbiIpOwotI2VuZGlmCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAobWV0YWluaXQuZHJpdmVzX21hcCA9PSAwKSB7Ci0jaWZkZWYgREVCVUdfQ0RST00KLQkJZnByaW50ZihzdGRlcnIsICJObyBNZXRhRE9TIGRldmljZXMgcHJlc2VudFxuIik7Ci0jZW5kaWYKLQkJcmV0dXJuIC0xOwotCX0KLQotCVNETF9udW1jZHMgPSAwOwotCQotCWZvciAoaT0nQSc7IGk8PSdaJzsgaSsrKSB7Ci0JCW1ldGFkb3NfZHJpdmVzW1NETF9udW1jZHNdLmRldmljZVswXSA9IDA7Ci0JCW1ldGFkb3NfZHJpdmVzW1NETF9udW1jZHNdLmRldmljZVsxXSA9ICc6JzsKLQkJbWV0YWRvc19kcml2ZXNbU0RMX251bWNkc10uZGV2aWNlWzJdID0gMDsKLQotCQlpZiAobWV0YWluaXQuZHJpdmVzX21hcCAmICgxPDwoaS0nQScpKSkgewotCQkJaGFuZGxlID0gTWV0YW9wZW4oaSwgJm1ldGFvcGVuKTsKLQkJCWlmIChoYW5kbGUgPT0gMCkgewotCi0JCQkJaW5mby5jZHNjX2Zvcm1hdCA9IENEUk9NX01TRjsKLQkJCQlpZiAoIChNZXRhaW9jdGwoaSwgTUVUQURPU19JT0NUTF9NQUdJQywgQ0RST01TVUJDSE5MLCAmaW5mbykgPT0gMCkgfHwgRVJSTk9fVFJBWUVNUFRZKGVycm5vKSApIHsKLQkJCQkJbWV0YWRvc19kcml2ZXNbU0RMX251bWNkc10uZGV2aWNlWzBdID0gaTsKLQkJCQkJKytTRExfbnVtY2RzOwotCQkJCX0KLQotCQkJCU1ldGFjbG9zZShpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEZpbGwgaW4gb3VyIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KLQlTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKLQlTRExfQ0RjYXBzLk9wZW4gPSBTRExfU1lTX0NET3BlbjsKLQlTRExfQ0RjYXBzLkNsb3NlID0gU0RMX1NZU19DRENsb3NlOwotCi0JU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOwotCVNETF9DRGNhcHMuU3RhdHVzID0gU0RMX1NZU19DRFN0YXR1czsKLQlTRExfQ0RjYXBzLlBsYXkgPSBTRExfU1lTX0NEUGxheTsKLQlTRExfQ0RjYXBzLlBhdXNlID0gU0RMX1NZU19DRFBhdXNlOwotCVNETF9DRGNhcHMuUmVzdW1lID0gU0RMX1NZU19DRFJlc3VtZTsKLQlTRExfQ0RjYXBzLlN0b3AgPSBTRExfU1lTX0NEU3RvcDsKLQlTRExfQ0RjYXBzLkVqZWN0ID0gU0RMX1NZU19DREVqZWN0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCkKLXsKLQlTRExfbnVtY2RzID0gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKLXsKLQlyZXR1cm4obWV0YWRvc19kcml2ZXNbZHJpdmVdLmRldmljZSk7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKQotewotCWludCBoYW5kbGU7Ci0KLQloYW5kbGUgPSBNZXRhb3BlbihtZXRhZG9zX2RyaXZlc1tkcml2ZV0uZGV2aWNlWzBdLCAmKG1ldGFkb3NfZHJpdmVzW2RyaXZlXS5tZXRhb3BlbikpOwotCWlmIChoYW5kbGUgPT0gMCkgewotCQlyZXR1cm4gZHJpdmU7Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSkKLXsKLQlNZXRhY2xvc2UobWV0YWRvc19kcml2ZXNbY2Ryb20tPmlkXS5kZXZpY2VbMF0pOwotfQotCi1zdGF0aWMgaW50IFNETF9TWVNfQ0Rpb2N0bChpbnQgaWQsIGludCBjb21tYW5kLCB2b2lkICphcmcpCi17Ci0JaW50IHJldHZhbDsKLQotCXJldHZhbCA9IE1ldGFpb2N0bChtZXRhZG9zX2RyaXZlc1tpZF0uZGV2aWNlWzBdLCBNRVRBRE9TX0lPQ1RMX01BR0lDLCBjb21tYW5kLCBhcmcpOwotCWlmICggcmV0dmFsIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJpb2N0bCgpIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JfQotCXJldHVybihyZXR2YWwpOwotfQotCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSkKLXsKLQlpbnQgaSxva2F5OwotCXN0cnVjdCBjZHJvbV90b2NoZHIgdG9jOwotCXN0cnVjdCBjZHJvbV90b2NlbnRyeSBlbnRyeTsKLQotCS8qIFVzZSBzdGFuZGFyZCBpb2N0bCgpICovCQotCWlmIChTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVJFQURUT0NIRFIsICZ0b2MpPDApIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWNkcm9tLT5udW10cmFja3MgPSB0b2MuY2R0aF90cmsxLXRvYy5jZHRoX3RyazArMTsKLQlpZiAoIGNkcm9tLT5udW10cmFja3MgPiBTRExfTUFYX1RSQUNLUyApIHsKLQkJY2Ryb20tPm51bXRyYWNrcyA9IFNETF9NQVhfVFJBQ0tTOwotCX0KLQotCS8qIFJlYWQgYWxsIHRoZSB0cmFjayBUT0MgZW50cmllcyAqLwotCW9rYXk9MTsKLQlmb3IgKCBpPTA7IGk8PWNkcm9tLT5udW10cmFja3M7ICsraSApIHsKLQkJaWYgKCBpID09IGNkcm9tLT5udW10cmFja3MgKSB7Ci0JCQljZHJvbS0+dHJhY2tbaV0uaWQgPSBDRFJPTV9MRUFET1VUOwotCQl9IGVsc2UgewotCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gdG9jLmNkdGhfdHJrMCtpOwotCQl9Ci0JCWVudHJ5LmNkdGVfdHJhY2sgPSBjZHJvbS0+dHJhY2tbaV0uaWQ7Ci0JCWVudHJ5LmNkdGVfZm9ybWF0ID0gQ0RST01fTVNGOwotCQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENEUk9NUkVBRFRPQ0VOVFJZLCAmZW50cnkpIDwgMCApIHsKLQkJCW9rYXk9MDsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJaWYgKCBlbnRyeS5jZHRlX2N0cmwgJiBDRFJPTV9EQVRBX1RSQUNLICkgewotCQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0RBVEFfVFJBQ0s7Ci0JCQl9IGVsc2UgewotCQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOwotCQkJfQotCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IE1TRl9UT19GUkFNRVMoCi0JCQkJZW50cnkuY2R0ZV9hZGRyLm1zZi5taW51dGUsCi0JCQkJZW50cnkuY2R0ZV9hZGRyLm1zZi5zZWNvbmQsCi0JCQkJZW50cnkuY2R0ZV9hZGRyLm1zZi5mcmFtZSk7Ci0JCQkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IDA7Ci0JCQlpZiAoIGkgPiAwICkgewotCQkJCWNkcm9tLT50cmFja1tpLTFdLmxlbmd0aCA9IGNkcm9tLT50cmFja1tpXS5vZmZzZXQtY2Ryb20tPnRyYWNrW2ktMV0ub2Zmc2V0OwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuKG9rYXkgPyAwIDogLTEpOwotfQotCi0vKiBHZXQgQ0QtUk9NIHN0YXR1cyAqLwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKLXsKLQlDRHN0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGNkcm9tX3RvY2hkciB0b2M7Ci0Jc3RydWN0IGNkcm9tX3N1YmNobmwgaW5mbzsKLQotCWluZm8uY2RzY19mb3JtYXQgPSBDRFJPTV9NU0Y7Ci0JaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVNVQkNITkwsICZpbmZvKSA8IDAgKSB7Ci0JCWlmICggRVJSTk9fVFJBWUVNUFRZKGVycm5vKSApIHsKLQkJCXN0YXR1cyA9IENEX1RSQVlFTVBUWTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IENEX0VSUk9SOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChpbmZvLmNkc2NfYXVkaW9zdGF0dXMpIHsKLQkJCWNhc2UgQ0RST01fQVVESU9fSU5WQUxJRDoKLQkJCWNhc2UgQ0RST01fQVVESU9fTk9fU1RBVFVTOgotCQkJCS8qIFRyeSB0byBkZXRlcm1pbmUgaWYgdGhlcmUncyBhIENEIGF2YWlsYWJsZSAqLwotCQkJCWlmIChTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVJFQURUT0NIRFIsICZ0b2MpPT0wKSB7Ci0JCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQ0RST01fQVVESU9fQ09NUExFVEVEOgotCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENEUk9NX0FVRElPX1BMQVk6Ci0JCQkJc3RhdHVzID0gQ0RfUExBWUlORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0RST01fQVVESU9fUEFVU0VEOgotCQkJCS8qIFdvcmthcm91bmQgYnVnZ3kgQ0QtUk9NIGRyaXZlICovCi0JCQkJaWYgKCBpbmZvLmNkc2NfdHJrID09IENEUk9NX0xFQURPVVQgKSB7Ci0JCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhdHVzID0gQ0RfUEFVU0VEOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RhdHVzID0gQ0RfRVJST1I7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCBwb3NpdGlvbiApIHsKLQkJaWYgKCBzdGF0dXMgPT0gQ0RfUExBWUlORyB8fCAoc3RhdHVzID09IENEX1BBVVNFRCkgKSB7Ci0JCQkqcG9zaXRpb24gPSBNU0ZfVE9fRlJBTUVTKAotCQkJCQlpbmZvLmNkc2NfYWJzYWRkci5tc2YubWludXRlLAotCQkJCQlpbmZvLmNkc2NfYWJzYWRkci5tc2Yuc2Vjb25kLAotCQkJCQlpbmZvLmNkc2NfYWJzYWRkci5tc2YuZnJhbWUpOwotCQl9IGVsc2UgewotCQkJKnBvc2l0aW9uID0gMDsKLQkJfQotCX0KLQlyZXR1cm4oc3RhdHVzKTsKLX0KLQotLyogU3RhcnQgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGNkcm9tX21zZiBwbGF5dGltZTsKLQotCUZSQU1FU19UT19NU0Yoc3RhcnQsCi0JICAgJnBsYXl0aW1lLmNkbXNmX21pbjAsICZwbGF5dGltZS5jZG1zZl9zZWMwLCAmcGxheXRpbWUuY2Rtc2ZfZnJhbWUwKTsKLQlGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwKLQkgICAmcGxheXRpbWUuY2Rtc2ZfbWluMSwgJnBsYXl0aW1lLmNkbXNmX3NlYzEsICZwbGF5dGltZS5jZG1zZl9mcmFtZTEpOwotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiVHJ5aW5nIHRvIHBsYXkgZnJvbSAlZDolZDolZCB0byAlZDolZDolZFxuIiwKLQlwbGF5dGltZS5jZG1zZl9taW4wLCBwbGF5dGltZS5jZG1zZl9zZWMwLCBwbGF5dGltZS5jZG1zZl9mcmFtZTAsCi0JcGxheXRpbWUuY2Rtc2ZfbWluMSwgcGxheXRpbWUuY2Rtc2Zfc2VjMSwgcGxheXRpbWUuY2Rtc2ZfZnJhbWUxKTsKLSNlbmRpZgotCi0JcmV0dXJuIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENEUk9NUExBWU1TRiwgJnBsYXl0aW1lKTsKLX0KLQotLyogUGF1c2UgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4gU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01QQVVTRSwgMCk7Ci19Ci0KLS8qIFJlc3VtZSBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4gU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01SRVNVTUUsIDApOwotfQotCi0vKiBTdG9wIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4gU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01TVE9QLCAwKTsKLX0KLQotLyogRWplY3QgdGhlIENELVJPTSAqLwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4gU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01FSkVDVCwgMCk7Ci19Ci0KLSNlbmRpZiAvKiBTRExfQ0RST01fTUlOVCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9vcGVuYnNkL1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9vcGVuYnNkL1NETF9zeXNjZHJvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDc3YzgyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vb3BlbmJzZC9TRExfc3lzY2Ryb20uYworKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9DRFJPTV9PUEVOQlNECi0KLS8qIEZ1bmN0aW9ucyBmb3Igc3lzdGVtLWxldmVsIENELVJPTSBhdWRpbyBjb250cm9sICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvY2Rpby5oPgotCi0jaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2Nkcm9tLmgiCi0KLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgd2UnbGwgZGV0ZWN0ICovCi0jZGVmaW5lIE1BWF9EUklWRVMJMTYJCi0KLS8qIEEgbGlzdCBvZiBhdmFpbGFibGUgQ0QtUk9NIGRyaXZlcyAqLwotc3RhdGljIGNoYXIgKlNETF9jZGxpc3RbTUFYX0RSSVZFU107Ci1zdGF0aWMgZGV2X3QgU0RMX2NkbW9kZVtNQVhfRFJJVkVTXTsKLQotLyogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQ0QgY29udHJvbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKLQotLyogU29tZSBpb2N0bCgpIGVycm5vIHZhbHVlcyB3aGljaCBvY2N1ciB3aGVuIHRoZSB0cmF5IGlzIGVtcHR5ICovCi0jZGVmaW5lIEVSUk5PX1RSQVlFTVBUWShlcnJubykJXAotCSgoZXJybm8gPT0gRUlPKSB8fCAoZXJybm8gPT0gRU5PRU5UKSB8fCAoZXJybm8gPT0gRUlOVkFMKSB8fCBcCi0JIChlcnJubyA9PSBFTk9ERVYpKQotCi0vKiBDaGVjayBhIGRyaXZlIHRvIHNlZSBpZiBpdCBpcyBhIENELVJPTSAqLwotc3RhdGljIGludCBDaGVja0RyaXZlKGNoYXIgKmRyaXZlLCBzdHJ1Y3Qgc3RhdCAqc3RidWYpCi17Ci0JaW50IGlzX2NkLCBjZGZkOwotCXN0cnVjdCBpb2NfcmVhZF9zdWJjaGFubmVsIGluZm87Ci0KLQkvKiBJZiBpdCBkb2Vzbid0IGV4aXN0LCByZXR1cm4gLTEgKi8KLQlpZiAoIHN0YXQoZHJpdmUsIHN0YnVmKSA8IDAgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogSWYgaXQgZG9lcyBleGlzdCwgdmVyaWZ5IHRoYXQgaXQncyBhbiBhdmFpbGFibGUgQ0QtUk9NICovCi0JaXNfY2QgPSAwOwotCWlmICggU19JU0NIUihzdGJ1Zi0+c3RfbW9kZSkgfHwgU19JU0JMSyhzdGJ1Zi0+c3RfbW9kZSkgKSB7Ci0JCWNkZmQgPSBvcGVuKGRyaXZlLCAoT19SRE9OTFl8T19FWENMfE9fTk9OQkxPQ0spLCAwKTsKLQkJaWYgKCBjZGZkID49IDAgKSB7Ci0JCQlpbmZvLmFkZHJlc3NfZm9ybWF0ID0gQ0RfTVNGX0ZPUk1BVDsKLQkJCWluZm8uZGF0YV9mb3JtYXQgPSBDRF9DVVJSRU5UX1BPU0lUSU9OOwotCQkJaW5mby5kYXRhX2xlbiA9IDA7Ci0JCQlpbmZvLmRhdGEgPSBOVUxMOwotCQkJLyogVW5kZXIgTGludXgsIEVJTyBvY2N1cnMgd2hlbiBhIGRpc2sgaXMgbm90IHByZXNlbnQuCi0JCQkgICBUaGlzIGlzbid0IDEwMCUgcmVsaWFibGUsIHNvIHdlIHVzZSB0aGUgVVNFX01OVEVOVAotCQkJICAgY29kZSBhYm92ZSBpbnN0ZWFkLgotCQkJICovCi0JCQlpZiAoIChpb2N0bChjZGZkLCBDRElPQ1JFQURTVUJDSEFOTkVMLCAmaW5mbykgPT0gMCkgfHwKLQkJCQkJCUVSUk5PX1RSQVlFTVBUWShlcnJubykgKSB7Ci0JCQkJaXNfY2QgPSAxOwotCQkJfQotCQkJY2xvc2UoY2RmZCk7Ci0JCX0KLQkJZWxzZSBpZiAoRVJSTk9fVFJBWUVNUFRZKGVycm5vKSkKLQkJCWlzX2NkID0gMTsKLQl9Ci0JcmV0dXJuKGlzX2NkKTsKLX0KLQotLyogQWRkIGEgQ0QtUk9NIGRyaXZlIHRvIG91ciBsaXN0IG9mIHZhbGlkIGRyaXZlcyAqLwotc3RhdGljIHZvaWQgQWRkRHJpdmUoY2hhciAqZHJpdmUsIHN0cnVjdCBzdGF0ICpzdGJ1ZikKLXsKLQlpbnQgaTsKLQotCWlmICggU0RMX251bWNkcyA8IE1BWF9EUklWRVMgKSB7Ci0JCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbHJlYWR5IGluIG91ciBsaXN0LgotCSAJICAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2Ugc2VlIGEgZHJpdmUgdmlhIHN5bWJvbGljIGxpbmsuCi0JCSAqLwotCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgewotCQkJaWYgKCBzdGJ1Zi0+c3RfcmRldiA9PSBTRExfY2Rtb2RlW2ldICkgewotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiRHVwbGljYXRlIGRyaXZlIGRldGVjdGVkOiAlcyA9PSAlc1xuIiwgZHJpdmUsIFNETF9jZGxpc3RbaV0pOwotI2VuZGlmCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLyogQWRkIHRoaXMgZHJpdmUgdG8gb3VyIGxpc3QgKi8KLQkJaSA9IFNETF9udW1jZHM7Ci0JCVNETF9jZGxpc3RbaV0gPSBTRExfc3RyZHVwKGRyaXZlKTsKLQkJaWYgKCBTRExfY2RsaXN0W2ldID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybjsKLQkJfQotCQlTRExfY2Rtb2RlW2ldID0gc3RidWYtPnN0X3JkZXY7Ci0JCSsrU0RMX251bWNkczsKLSNpZmRlZiBERUJVR19DRFJPTQotICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIENELVJPTSBkcml2ZTogJXNcbiIsIGRyaXZlKTsKLSNlbmRpZgotCX0KLX0KLQotaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQotewotCXN0YXRpYyBjaGFyICpjaGVja2xpc3RbXSA9IHsKLSNpZiBkZWZpbmVkKF9fT1BFTkJTRF9fKQotCQkiPzAgY2Q/YyIsICJjZHJvbSIsIE5VTEwKLSNlbGlmIGRlZmluZWQoX19ORVRCU0RfXykKLQkJIj8wIGNkP2QiLCAiPzAgY2Q/YyIsICJjZHJvbSIsIE5VTEwKLSNlbHNlCi0JCSI/MCBjZD9jIiwgIj8wIGFjZD9jIiwgImNkcm9tIiwgTlVMTAotI2VuZGlmCi0JfTsKLQljaGFyICpTRExjZHJvbTsKLQlpbnQgaSwgaiwgZXhpc3RzOwotCWNoYXIgZHJpdmVbMzJdOwotCXN0cnVjdCBzdGF0IHN0YnVmOwotCi0JLyogRmlsbCBpbiBvdXIgZHJpdmVyIGNhcGFiaWxpdGllcyAqLwotCVNETF9DRGNhcHMuTmFtZSA9IFNETF9TWVNfQ0ROYW1lOwotCVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOwotCVNETF9DRGNhcHMuR2V0VE9DID0gU0RMX1NZU19DREdldFRPQzsKLQlTRExfQ0RjYXBzLlN0YXR1cyA9IFNETF9TWVNfQ0RTdGF0dXM7Ci0JU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7Ci0JU0RMX0NEY2Fwcy5QYXVzZSA9IFNETF9TWVNfQ0RQYXVzZTsKLQlTRExfQ0RjYXBzLlJlc3VtZSA9IFNETF9TWVNfQ0RSZXN1bWU7Ci0JU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7Ci0JU0RMX0NEY2Fwcy5FamVjdCA9IFNETF9TWVNfQ0RFamVjdDsKLQlTRExfQ0RjYXBzLkNsb3NlID0gU0RMX1NZU19DRENsb3NlOwotCi0JLyogTG9vayBpbiB0aGUgZW52aXJvbm1lbnQgZm9yIG91ciBDRC1ST00gZHJpdmUgbGlzdCAqLwotCVNETGNkcm9tID0gU0RMX2dldGVudigiU0RMX0NEUk9NIik7CS8qICc6JyBzZXBhcmF0ZWQgbGlzdCBvZiBkZXZpY2VzICovCi0JaWYgKCBTRExjZHJvbSAhPSBOVUxMICkgewotCQljaGFyICpjZHBhdGgsICpkZWxpbTsKLQkJc2l6ZV90IGxlbiA9IFNETF9zdHJsZW4oU0RMY2Ryb20pKzE7Ci0JCWNkcGF0aCA9IFNETF9zdGFja19hbGxvYyhjaGFyLCBsZW4pOwotCQlpZiAoIGNkcGF0aCAhPSBOVUxMICkgewotCQkJU0RMX3N0cmxjcHkoY2RwYXRoLCBTRExjZHJvbSwgbGVuKTsKLQkJCVNETGNkcm9tID0gY2RwYXRoOwotCQkJZG8gewotCQkJCWRlbGltID0gU0RMX3N0cmNocihTRExjZHJvbSwgJzonKTsKLQkJCQlpZiAoIGRlbGltICkgewotCQkJCQkqZGVsaW0rKyA9ICdcMCc7Ci0JCQkJfQotCQkJCWlmICggQ2hlY2tEcml2ZShTRExjZHJvbSwgJnN0YnVmKSA+IDAgKSB7Ci0JCQkJCUFkZERyaXZlKFNETGNkcm9tLCAmc3RidWYpOwotCQkJCX0KLQkJCQlpZiAoIGRlbGltICkgewotCQkJCQlTRExjZHJvbSA9IGRlbGltOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVNETGNkcm9tID0gTlVMTDsKLQkJCQl9Ci0JCQl9IHdoaWxlICggU0RMY2Ryb20gKTsKLQkJCVNETF9zdGFja19mcmVlKGNkcGF0aCk7Ci0JCX0KLQotCQkvKiBJZiB3ZSBmb3VuZCBvdXIgZHJpdmVzLCB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyAqLwotCQlpZiAoIFNETF9udW1jZHMgPiAwICkgewotCQkJcmV0dXJuKDApOwotCQl9Ci0JfQotCi0JLyogU2NhbiB0aGUgc3lzdGVtIGZvciBDRC1ST00gZHJpdmVzICovCi0JZm9yICggaT0wOyBjaGVja2xpc3RbaV07ICsraSApIHsKLQkJaWYgKCBjaGVja2xpc3RbaV1bMF0gPT0gJz8nICkgewotCQkJY2hhciAqaW5zZXJ0OwotCQkJZXhpc3RzID0gMTsKLQkJCWZvciAoIGo9Y2hlY2tsaXN0W2ldWzFdOyBleGlzdHM7ICsraiApIHsKLQkJCQlTRExfc25wcmludGYoZHJpdmUsIFNETF9hcnJheXNpemUoZHJpdmUpLCAiL2Rldi8lcyIsICZjaGVja2xpc3RbaV1bM10pOwotCQkJCWluc2VydCA9IFNETF9zdHJjaHIoZHJpdmUsICc/Jyk7Ci0JCQkJaWYgKCBpbnNlcnQgIT0gTlVMTCApIHsKLQkJCQkJKmluc2VydCA9IGo7Ci0JCQkJfQotCQkJCXN3aXRjaCAoQ2hlY2tEcml2ZShkcml2ZSwgJnN0YnVmKSkgewotCQkJCQkvKiBEcml2ZSBleGlzdHMgYW5kIGlzIGEgQ0QtUk9NICovCi0JCQkJCWNhc2UgMToKLQkJCQkJCUFkZERyaXZlKGRyaXZlLCAmc3RidWYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCS8qIERyaXZlIGV4aXN0cywgYnV0IGlzbid0IGEgQ0QtUk9NICovCi0JCQkJCWNhc2UgMDoKLQkJCQkJCWJyZWFrOwotCQkJCQkvKiBEcml2ZSBkb2Vzbid0IGV4aXN0ICovCi0JCQkJCWNhc2UgLTE6Ci0JCQkJCQlleGlzdHMgPSAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIi9kZXYvJXMiLCBjaGVja2xpc3RbaV0pOwotCQkJaWYgKCBDaGVja0RyaXZlKGRyaXZlLCAmc3RidWYpID4gMCApIHsKLQkJCQlBZGREcml2ZShkcml2ZSwgJnN0YnVmKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIEdlbmVyYWwgaW9jdGwoKSBDRC1ST00gY29tbWFuZCBmdW5jdGlvbiAqLwotc3RhdGljIGludCBTRExfU1lTX0NEaW9jdGwoaW50IGlkLCBpbnQgY29tbWFuZCwgdm9pZCAqYXJnKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBpb2N0bChpZCwgY29tbWFuZCwgYXJnKTsKLQlpZiAoIHJldHZhbCA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiaW9jdGwoKSBlcnJvcjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCX0KLQlyZXR1cm4ocmV0dmFsKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKLXsKLQlyZXR1cm4oU0RMX2NkbGlzdFtkcml2ZV0pOwotfQotCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSkKLXsKLQlyZXR1cm4ob3BlbihTRExfY2RsaXN0W2RyaXZlXSwgKE9fUkRPTkxZfE9fRVhDTHxPX05PTkJMT0NLKSwgMCkpOwotfQotCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSkKLXsKLQlzdHJ1Y3QgaW9jX3RvY19oZWFkZXIgdG9jOwotCWludCBpLCBva2F5OwotCXN0cnVjdCBpb2NfcmVhZF90b2NfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGNkX3RvY19lbnRyeSBkYXRhOwotCi0Jb2theSA9IDA7Ci0JaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRElPUkVBRFRPQ0hFQURFUiwgJnRvYykgPT0gMCApIHsKLQkJY2Ryb20tPm51bXRyYWNrcyA9IHRvYy5lbmRpbmdfdHJhY2stdG9jLnN0YXJ0aW5nX3RyYWNrKzE7Ci0JCWlmICggY2Ryb20tPm51bXRyYWNrcyA+IFNETF9NQVhfVFJBQ0tTICkgewotCQkJY2Ryb20tPm51bXRyYWNrcyA9IFNETF9NQVhfVFJBQ0tTOwotCQl9Ci0JCS8qIFJlYWQgYWxsIHRoZSB0cmFjayBUT0MgZW50cmllcyAqLwotCQlmb3IgKCBpPTA7IGk8PWNkcm9tLT5udW10cmFja3M7ICsraSApIHsKLQkJCWlmICggaSA9PSBjZHJvbS0+bnVtdHJhY2tzICkgewotCQkJCWNkcm9tLT50cmFja1tpXS5pZCA9IDB4QUE7IC8qIENEUk9NX0xFQURPVVQgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gdG9jLnN0YXJ0aW5nX3RyYWNrK2k7Ci0JCQl9Ci0JCQllbnRyeS5zdGFydGluZ190cmFjayA9IGNkcm9tLT50cmFja1tpXS5pZDsKLQkJCWVudHJ5LmFkZHJlc3NfZm9ybWF0ID0gQ0RfTVNGX0ZPUk1BVDsKLQkJCWVudHJ5LmRhdGFfbGVuID0gc2l6ZW9mKGRhdGEpOwotCQkJZW50cnkuZGF0YSA9ICZkYXRhOwotCQkJaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRElPUkVBRFRPQ0VOVFJZUywKLQkJCQkJCQkJJmVudHJ5KSA8IDAgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gZGF0YS5jb250cm9sOwotCQkJCWNkcm9tLT50cmFja1tpXS5vZmZzZXQgPSBNU0ZfVE9fRlJBTUVTKAotCQkJCQkJZGF0YS5hZGRyLm1zZi5taW51dGUsCi0JCQkJCQlkYXRhLmFkZHIubXNmLnNlY29uZCwKLQkJCQkJCWRhdGEuYWRkci5tc2YuZnJhbWUpOwotCQkJCWNkcm9tLT50cmFja1tpXS5sZW5ndGggPSAwOwotCQkJCWlmICggaSA+IDAgKSB7Ci0JCQkJCWNkcm9tLT50cmFja1tpLTFdLmxlbmd0aCA9Ci0JCQkJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0LQotCQkJCQkJY2Ryb20tPnRyYWNrW2ktMV0ub2Zmc2V0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIGkgPT0gKGNkcm9tLT5udW10cmFja3MrMSkgKSB7Ci0JCQlva2F5ID0gMTsKLQkJfQotCX0KLQlyZXR1cm4ob2theSA/IDAgOiAtMSk7Ci19Ci0KLS8qIEdldCBDRC1ST00gc3RhdHVzICovCi1zdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKQotewotCUNEc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgaW9jX3RvY19oZWFkZXIgdG9jOwotCXN0cnVjdCBpb2NfcmVhZF9zdWJjaGFubmVsIGluZm87Ci0Jc3RydWN0IGNkX3N1Yl9jaGFubmVsX2luZm8gZGF0YTsKLQotCWluZm8uYWRkcmVzc19mb3JtYXQgPSBDRF9NU0ZfRk9STUFUOwotCWluZm8uZGF0YV9mb3JtYXQgPSBDRF9DVVJSRU5UX1BPU0lUSU9OOwotCWluZm8udHJhY2sgPSAwOwotCWluZm8uZGF0YV9sZW4gPSBzaXplb2YoZGF0YSk7Ci0JaW5mby5kYXRhID0gJmRhdGE7Ci0JaWYgKCBpb2N0bChjZHJvbS0+aWQsIENESU9DUkVBRFNVQkNIQU5ORUwsICZpbmZvKSA8IDAgKSB7Ci0JCWlmICggRVJSTk9fVFJBWUVNUFRZKGVycm5vKSApIHsKLQkJCXN0YXR1cyA9IENEX1RSQVlFTVBUWTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IENEX0VSUk9SOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChkYXRhLmhlYWRlci5hdWRpb19zdGF0dXMpIHsKLQkJCWNhc2UgQ0RfQVNfQVVESU9fSU5WQUxJRDoKLQkJCWNhc2UgQ0RfQVNfTk9fU1RBVFVTOgotCQkJCS8qIFRyeSB0byBkZXRlcm1pbmUgaWYgdGhlcmUncyBhIENEIGF2YWlsYWJsZSAqLwotCQkJCWlmIChpb2N0bChjZHJvbS0+aWQsQ0RJT1JFQURUT0NIRUFERVIsJnRvYyk9PTApCi0JCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJZWxzZQotCQkJCQlzdGF0dXMgPSBDRF9UUkFZRU1QVFk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENEX0FTX1BMQVlfQ09NUExFVEVEOgotCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENEX0FTX1BMQVlfSU5fUFJPR1JFU1M6Ci0JCQkJc3RhdHVzID0gQ0RfUExBWUlORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0RfQVNfUExBWV9QQVVTRUQ6Ci0JCQkJc3RhdHVzID0gQ0RfUEFVU0VEOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdGF0dXMgPSBDRF9FUlJPUjsKLQkJCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIHBvc2l0aW9uICkgewotCQlpZiAoIHN0YXR1cyA9PSBDRF9QTEFZSU5HIHx8IChzdGF0dXMgPT0gQ0RfUEFVU0VEKSApIHsKLQkJCSpwb3NpdGlvbiA9IE1TRl9UT19GUkFNRVMoCi0JCQkJCWRhdGEud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5taW51dGUsCi0JCQkJCWRhdGEud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5zZWNvbmQsCi0JCQkJCWRhdGEud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5mcmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQkqcG9zaXRpb24gPSAwOwotCQl9Ci0JfQotCXJldHVybihzdGF0dXMpOwotfQotCi0vKiBTdGFydCBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaW9jX3BsYXlfbXNmIHBsYXl0aW1lOwotCi0JRlJBTUVTX1RPX01TRihzdGFydCwKLQkJJnBsYXl0aW1lLnN0YXJ0X20sICZwbGF5dGltZS5zdGFydF9zLCAmcGxheXRpbWUuc3RhcnRfZik7Ci0JRlJBTUVTX1RPX01TRihzdGFydCtsZW5ndGgsCi0JCSZwbGF5dGltZS5lbmRfbSwgJnBsYXl0aW1lLmVuZF9zLCAmcGxheXRpbWUuZW5kX2YpOwotI2lmZGVmIERFQlVHX0NEUk9NCi0gIGZwcmludGYoc3RkZXJyLCAiVHJ5aW5nIHRvIHBsYXkgZnJvbSAlZDolZDolZCB0byAlZDolZDolZFxuIiwKLQlwbGF5dGltZS5zdGFydF9tLCBwbGF5dGltZS5zdGFydF9zLCBwbGF5dGltZS5zdGFydF9mLAotCXBsYXl0aW1lLmVuZF9tLCBwbGF5dGltZS5lbmRfcywgcGxheXRpbWUuZW5kX2YpOwotI2VuZGlmCi0JaW9jdGwoY2Ryb20tPmlkLCBDRElPQ1NUQVJULCAwKTsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NQTEFZTVNGLCAmcGxheXRpbWUpKTsKLX0KLQotLyogUGF1c2UgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NQQVVTRSwgMCkpOwotfQotCi0vKiBSZXN1bWUgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pCi17Ci0JcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9DUkVTVU1FLCAwKSk7Ci19Ci0KLS8qIFN0b3AgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQotewotCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRElPQ1NUT1AsIDApKTsKLX0KLQotLyogRWplY3QgdGhlIENELVJPTSAqLwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NFSkVDVCwgMCkpOwotfQotCi0vKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLwotc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCi17Ci0JY2xvc2UoY2Ryb20tPmlkKTsKLX0KLQotdm9pZCBTRExfU1lTX0NEUXVpdCh2b2lkKQotewotCWludCBpOwotCi0JaWYgKCBTRExfbnVtY2RzID4gMCApIHsKLQkJZm9yICggaT0wOyBpPFNETF9udW1jZHM7ICsraSApIHsKLQkJCVNETF9mcmVlKFNETF9jZGxpc3RbaV0pOwotCQl9Ci0JCVNETF9udW1jZHMgPSAwOwotCX0KLX0KLQotI2VuZGlmIC8qIFNETF9DRFJPTV9PUEVOQlNEICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2Nkcm9tL29zMi9TRExfc3lzY2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vb3MyL1NETF9zeXNjZHJvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjIwNWZkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vb3MyL1NETF9zeXNjZHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX0NEUk9NX09TMgotCi0vKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCAqLwotCi0jZGVmaW5lIElOQ0xfTUNJT1MyCi0jaW5jbHVkZSA8b3MyLmg+Ci0jaW5jbHVkZSA8b3MybWUuaD4KLQotI2luY2x1ZGUgIlNETF9jZHJvbS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgotCi0vKiBTaXplIG9mIE1DSSByZXN1bHQgYnVmZmVyIChpbiBieXRlcykgKi8KLSNkZWZpbmUgTUNJX0NNRFJFVEJVRlNJWkUJMTI4Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIHdlJ2xsIGRldGVjdCAqLwotI2RlZmluZSBNQVhfRFJJVkVTCTE2CQotCi0vKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIENELVJPTSBkcml2ZXMgKi8KLXN0YXRpYyBjaGFyICpTRExfY2RsaXN0W01BWF9EUklWRVNdOwotLy9zdGF0aWMgZGV2X3QgU0RMX2NkbW9kZVtNQVhfRFJJVkVTXTsKLQotLyogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQ0QgY29udHJvbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKLQotLyogTUNJIFRpbWluZyBGdW5jdGlvbnMgKi8KLSNkZWZpbmUJTUNJX01NVElNRVBFUlNFQ09ORAkJMzAwMAotI2RlZmluZQlGUkFNRVNGUk9NTU0obW10aW1lKQkJKCgobW10aW1lKSpDRF9GUFMpL01DSV9NTVRJTUVQRVJTRUNPTkQpCi0KLQotLyogUmVhZHkgZm9yIE1DSSBDREF1ZGlvIERldmljZXMgKi8KLWludCAgU0RMX1NZU19DREluaXQodm9pZCkKLXsKLWludCBpOyAvKiBnZW5lcmlnIGNvdW50ZXIgKi8KLU1DSV9TWVNJTkZPX1BBUk1TCQltc3A7CS8qIFN0cnVjdHVyZSB0byBNQ0kgU3lzSW5mbyBwYXJhbWV0ZXJzICovCi1DSEFSIAkJCQkJCVN5c0luZm9SZXRbTUNJX0NNRFJFVEJVRlNJWkVdOwkvKiBCdWZmZXIgZm9yIE1DSSBDb21tYW5kIHJlc3VsdCAqLwotCi0vKiBGaWxsIGluIG91ciBkcml2ZXIgY2FwYWJpbGl0aWVzICovCi1TRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKLVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOwotU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOwotU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOwotU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7Ci1TRExfQ0RjYXBzLlBhdXNlID0gU0RMX1NZU19DRFBhdXNlOwotU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOwotU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7Ci1TRExfQ0RjYXBzLkVqZWN0ID0gU0RMX1NZU19DREVqZWN0OwotU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKLQotLyogR2V0IHRoZSBudW1iZXIgb2YgQ0QgUk9NcyBpbiB0aGUgU3lzdGVtICovCi0vKiBDbGVhbiBTeXNJbmZvIHN0cnVjdHVyZSAqLwotU0RMX21lbXNldCgmbXNwLCAweDAwLCBzaXplb2YoTUNJX1NZU0lORk9fUEFSTVMpKTsKLS8qIFByZXBhcmUgc3RydWN0dXJlIHRvIEFzayBOdW1lciBvZiBBdWRpbyBDRHMgKi8KLW1zcC51c0RldmljZVR5cGUgPSBNQ0lfREVWVFlQRV9DRF9BVURJTzsJLyogQ0QgQXVkaW8gVHlwZSAqLwotbXNwLnBzelJldHVybiA9IChQU1opJlN5c0luZm9SZXQ7IAkvKiBSZXR1cm4gU3RydWN0dXJlICovCi1tc3AudWxSZXRTaXplID0gTUNJX0NNRFJFVEJVRlNJWkU7IAkvKiBTaXplIG9mIHJldCBzdHJ1Y3QgKi8KLWlmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZCgwLE1DSV9TWVNJTkZPLCBNQ0lfU1lTSU5GT19RVUFOVElUWSB8IE1DSV9XQUlULCAoUFZPSUQpJm1zcCwgMCkpICE9IE1DSUVSUl9TVUNDRVNTKSByZXR1cm4oQ0RfRVJST1IpOwotU0RMX251bWNkcyA9IGF0b2koU3lzSW5mb1JldCk7Ci1pZiAoU0RMX251bWNkcyA+IE1BWF9EUklWRVMpIFNETF9udW1jZHMgPSBNQVhfRFJJVkVTOyAvKiBMaW1pdCBtYXhpbXVtIENEIG51bWJlciAqLwotCi0vKiBHZXQgYW5kIEFkZCB0aGVpciBzeXN0ZW0gbmFtZSB0byB0aGUgU0RMX2NkbGlzdCAqLwotbXNwLnBzelJldHVybiA9IChQU1opJlN5c0luZm9SZXQ7IAkJCQkvKiBSZXR1cm4gU3RydWN0dXJlICovCi1tc3AudWxSZXRTaXplID0gTUNJX0NNRFJFVEJVRlNJWkU7IAkJCS8qIFNpemUgb2YgcmV0IHN0cnVjdCAqLwotbXNwLnVzRGV2aWNlVHlwZSA9IE1DSV9ERVZUWVBFX0NEX0FVRElPOwkJLyogQ0QgQXVkaW8gVHlwZSAqLwotZm9yIChpPTA7IGk8U0RMX251bWNkczsgaSsrKQotCXsKLQltc3AudWxOdW1iZXIgPSBpKzE7Ci0JbWNpU2VuZENvbW1hbmQoMCxNQ0lfU1lTSU5GTywgTUNJX1NZU0lORk9fTkFNRSB8IE1DSV9XQUlULCZtc3AsIDApOwotCVNETF9jZGxpc3RbaV0gPSBTRExfc3RyZHVwKFN5c0luZm9SZXQpOwotCWlmICggU0RMX2NkbGlzdFtpXSA9PSBOVUxMICkKLQkJewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLQkJfQotCX0KLXJldHVybigwKTsKLX0KLQotLyogUmV0dXJuIENEQXVkaW8gU3lzdGVtIERlcGVuZGVudCBEZXZpY2UgTmFtZSAtIFJlYWR5IGZvciBNQ0kqLwotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKLXsKLXJldHVybihTRExfY2RsaXN0W2RyaXZlXSk7Ci19Ci0KLS8qIE9wZW4gQ0RBdWRpbyBEZXZpY2UgLSBSZWFkeSBmb3IgTUNJICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSkKLXsKLU1DSV9PUEVOX1BBUk1TCW1vcDsKLU1DSV9TRVRfUEFSTVMgbXNwOwotTUNJX0dFTkVSSUNfUEFSTVMgbWdwOwotCi0vKiBPcGVuIHRoZSBkZXZpY2UgKi8KLW1vcC5od25kQ2FsbGJhY2sgPSAoSFdORClOVUxMOwkJLy8gTm9uZQotbW9wLnVzRGV2aWNlSUQgPSAoVVNIT1JUKU5VTEw7CQkvLyBXaWxsIGJlIHJldHVybmVkLgotbW9wLnBzekRldmljZVR5cGUgPSAoUFNaKVNETF9jZGxpc3RbZHJpdmVdOwkJLy8gQ0RBdWRpbyBEZXZpY2UKLWlmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZCgwLE1DSV9PUEVOLE1DSV9XQUlULCZtb3AsIDApKSAhPSBNQ0lFUlJfU1VDQ0VTUykgcmV0dXJuKENEX0VSUk9SKTsKLS8qIFNldCB0aW1lIGZvcm1hdCAqLwotbXNwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7CQkvLyBOb25lCi1tc3AudWxUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NU0Y7CS8vIE1pbnV0ZSA6IFNlY29uZCA6IEZyYW1lIHN0cnVjdHVyZQotbXNwLnVsU3BlZWRGb3JtYXQgPSAoVUxPTkcpTlVMTDsJCS8vIE5vIGNoYW5nZQotbXNwLnVsQXVkaW8gPSAoVUxPTkcpTlVMTDsJCQkJLy8gTm8gQ2hhbm5lbAotbXNwLnVsTGV2ZWwgPSAoVUxPTkcpTlVMTDsJCQkJLy8gTm8gVm9sdW1lCi1tc3AudWxPdmVyID0gKFVMT05HKU5VTEw7CQkJCS8vIE5vIERlbGF5Ci1tc3AudWxJdGVtID0gKFVMT05HKU5VTEw7CQkJCS8vIE5vIGl0ZW0KLW1zcC51bFZhbHVlID0gKFVMT05HKU5VTEw7CQkJCS8vIE5vIHZhbHVlIGZvciBpdGVtIGZsYWcKLWlmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZChtb3AudXNEZXZpY2VJRCxNQ0lfU0VULE1DSV9XQUlUIHwgTUNJX1NFVF9USU1FX0ZPUk1BVCwmbXNwLCAwKSkgPT0gTUNJRVJSX1NVQ0NFU1MpIHJldHVybiAobW9wLnVzRGV2aWNlSUQpOwotLyogRXJyb3Igc2V0dGluZyB0aW1lIGZvcm1hdD8gLSBDbG9zZSBvcGVuZWQgZGV2aWNlICovCi1tZ3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKLW1jaVNlbmRDb21tYW5kKG1vcC51c0RldmljZUlELE1DSV9DTE9TRSxNQ0lfV0FJVCwmbWdwLCAwKTsKLXJldHVybihDRF9FUlJPUik7Ci19Ci0KLS8qIEdldCBDRCBUYWJsZSBPZiBDb250ZW50cyAtIFJlYWR5IGZvciBNQ0kgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQotewotTUNJX1RPQ19QQVJNUyBtdHA7Ci1NQ0lfU1RBVFVTX1BBUk1TIG1zcDsKLU1DSV9UT0NfUkVDICogbXRyOwotSU5UIGk7Ci0KLS8qIENvcnJlY3Rpb24gYmVjYXVzZSBNQ0kgY2Fubm90IHJlYWQgVE9DIHdoaWxlIENEIGlzIHBsYXlpbmcgKGl0J2xsIHN0b3AhKSAqLwotaWYgKGNkcm9tLT5zdGF0dXMgPT0gQ0RfUExBWUlORyB8fCBjZHJvbS0+c3RhdHVzID09IENEX1BBVVNFRCkgcmV0dXJuIDA7Ci0KLS8qIEdldCBOdW1iZXIgb2YgVHJhY2tzICovCi1tc3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsgLyogTm9uZSAqLwotbXNwLnVsUmV0dXJuID0gKFVMT05HKU5VTEw7IC8qIFdlIHdhbnQgdGhpcyBpbmZvcm1hdGlvbiAqLwotbXNwLnVsSXRlbSA9IE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUzsKLW1zcC51bFZhbHVlID0gKFVMT05HKU5VTEw7IC8qIE5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KLWlmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZChjZHJvbS0+aWQsTUNJX1NUQVRVUyxNQ0lfV0FJVCB8IE1DSV9TVEFUVVNfSVRFTSwmbXNwLCAwKSkgIT0gTUNJRVJSX1NVQ0NFU1MpIHJldHVybihDRF9FUlJPUik7Ci1jZHJvbS0+bnVtdHJhY2tzID0gbXNwLnVsUmV0dXJuOwotaWYgKCBjZHJvbS0+bnVtdHJhY2tzID4gU0RMX01BWF9UUkFDS1MgKQotCXsKLQljZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7Ci0JfQotLyogQWxvY2F0ZSBzcGFjZSBmb3IgVE9DIGRhdGEgKi8KLW10ciA9IChNQ0lfVE9DX1JFQyAqKVNETF9tYWxsb2MoY2Ryb20tPm51bXRyYWNrcypzaXplb2YoTUNJX1RPQ19SRUMpKTsKLWlmICggbXRyID09IE5VTEwgKQotCXsKLQlTRExfT3V0T2ZNZW1vcnkoKTsKLQlyZXR1cm4oLTEpOwotCX0KLS8qIEdldCBUT0MgZnJvbSBDRCAqLwotbXRwLnBCdWYgPSBtdHI7Ci1tdHAudWxCdWZTaXplID0gY2Ryb20tPm51bXRyYWNrcypzaXplb2YoTUNJX1RPQ19SRUMpOwotaWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfR0VUVE9DLE1DSV9XQUlULCZtdHAsIDApKSAhPSBNQ0lFUlJfU1VDQ0VTUykKLQl7Ci0JU0RMX091dE9mTWVtb3J5KCk7Ci0JU0RMX2ZyZWUobXRyKTsKLQlyZXR1cm4oQ0RfRVJST1IpOwotCX0KLS8qIEZpbGwgU0RMIFRyYWNrcyBTdHJ1Y3R1cmUgKi8KLWZvciAoaT0wOyBpPGNkcm9tLT5udW10cmFja3M7IGkrKykKLQl7Ci0JLyogU2V0IFRyYWNrIElEICovCi0JY2Ryb20tPnRyYWNrW2ldLmlkID0gKG10citpKS0+VHJhY2tOdW07Ci0JLyogU2V0IFRyYWNrIFR5cGUgKi8KLQltc3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsgLyogTm9uZSAqLwotCW1zcC51bFJldHVybiA9IChVTE9ORylOVUxMOyAvKiBXZSB3YW50IHRoaXMgaW5mb3JtYXRpb24gKi8KLQltc3AudWxJdGVtID0gTUNJX0NEX1NUQVRVU19UUkFDS19UWVBFOwotCW1zcC51bFZhbHVlID0gKFVMT05HKSgobXRyK2kpLT5UcmFja051bSk7IC8qIFRyYWNrIE51bWJlcj8gKi8KLQlpZiAoTE9VU0hPUlQobWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9TVEFUVVMsTUNJX1dBSVQgfCBNQ0lfVFJBQ0sgfCBNQ0lfU1RBVFVTX0lURU0sJm1zcCwgMCkpICE9IE1DSUVSUl9TVUNDRVNTKQotCQl7Ci0JCVNETF9mcmVlKG10cik7Ci0JCXJldHVybiAoQ0RfRVJST1IpOwotCQl9Ci0JaWYgKG1zcC51bFJldHVybj09TUNJX0NEX1RSQUNLX0FVRElPKSBjZHJvbS0+dHJhY2tbaV0udHlwZSA9IFNETF9BVURJT19UUkFDSzsKLQllbHNlIGNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0RBVEFfVFJBQ0s7Ci0JLyogU2V0IFRyYWNrIExlbmd0aCAtIHZhbHVlcyBmcm9tIE1DSSBhcmUgaW4gTU1USU1FcyAtIDMwMDAgTU1USU1FID0gMSBzZWNvbmQgKi8KLQljZHJvbS0+dHJhY2tbaV0ubGVuZ3RoID0gRlJBTUVTRlJPTU1NKChtdHIraSktPnVsRW5kQWRkciAtIChtdHIraSktPnVsU3RhcnRBZGRyKTsKLQkvKiBTZXQgVHJhY2sgT2Zmc2V0ICovCi0JY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IEZSQU1FU0ZST01NTSgobXRyK2kpLT51bFN0YXJ0QWRkcik7Ci0JfQotU0RMX2ZyZWUobXRyKTsKLXJldHVybigwKTsKLX0KLQotCi0vKiBHZXQgQ0QtUk9NIHN0YXR1cyAtIFJlYWR5IGZvciBNQ0kgKi8KLXN0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pCi17Ci1DRHN0YXR1cyBzdGF0dXM7Ci1NQ0lfU1RBVFVTX1BBUk1TIG1zcDsKLQotLyogR2V0IFN0YXR1cyBmcm9tIE1DSSAqLwotbXNwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7IC8qIE5vbmUgKi8KLW1zcC51bFJldHVybiA9IChVTE9ORylOVUxMOyAvKiBXZSB3YW50IHRoaXMgaW5mb3JtYXRpb24gKi8KLW1zcC51bEl0ZW0gPSBNQ0lfU1RBVFVTX01PREU7Ci1tc3AudWxWYWx1ZSA9IChVTE9ORylOVUxMOyAvKiBObyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCi1pZiAoTE9VU0hPUlQobWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9TVEFUVVMsTUNJX1dBSVQgfCBNQ0lfU1RBVFVTX0lURU0sJm1zcCwgMCkpICE9IE1DSUVSUl9TVUNDRVNTKSBzdGF0dXMgPSBDRF9FUlJPUjsKLWVsc2UKLQl7Ci0Jc3dpdGNoKG1zcC51bFJldHVybikKLQkJewotCQljYXNlCU1DSV9NT0RFX05PVF9SRUFEWToKLQkJCXN0YXR1cyA9IENEX1RSQVlFTVBUWTsKLQkJCWJyZWFrOwotCQljYXNlCU1DSV9NT0RFX1BBVVNFOgotCQkJc3RhdHVzID0gQ0RfUEFVU0VEOwotCQkJYnJlYWs7Ci0JCWNhc2UJTUNJX01PREVfUExBWToKLQkJCXN0YXR1cyA9IENEX1BMQVlJTkc7Ci0JCQlicmVhazsKLQkJY2FzZQlNQ0lfTU9ERV9TVE9QOgotCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKLQkJCWJyZWFrOwotCQkvKiBUaGVzZSBjYXNlcyBzaG91bGQgbm90IG9jY291ciAqLwotCQljYXNlCU1DSV9NT0RFX1JFQ09SRDoKLQkJY2FzZQlNQ0lfTU9ERV9TRUVLOgotCQlkZWZhdWx0OgotCQkJc3RhdHVzID0gQ0RfRVJST1I7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotLyogRGV0ZXJtaW5lIHBvc2l0aW9uICovCi1pZiAocG9zaXRpb24gIT0gTlVMTCkgLyogVGhlIFNETCAkJiQmJSMgQ0RST00gY2FsbCBzZW5kcyBOVUxMIHBvaW50ZXIgaGVyZSEgKi8KLQl7Ci0JCWlmICgoc3RhdHVzID09IENEX1BMQVlJTkcpIHx8IChzdGF0dXMgPT0gQ0RfUEFVU0VEKSkKLQkJewotCQkvKiBHZXQgUG9zaXRpb24gKi8KLQkJbXNwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7IC8qIE5vbmUgKi8KLQkJbXNwLnVsUmV0dXJuID0gKFVMT05HKU5VTEw7IC8qIFdlIHdhbnQgdGhpcyBpbmZvcm1hdGlvbiAqLwotCQltc3AudWxJdGVtID0gTUNJX1NUQVRVU19QT1NJVElPTjsKLQkJbXNwLnVsVmFsdWUgPSAoVUxPTkcpTlVMTDsgLyogTm8gYWRkaXRpb25hIGluZm8gKi8KLQkJaWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfU1RBVFVTLE1DSV9XQUlUIHwgTUNJX1NUQVRVU19JVEVNLCZtc3AsIDApKSAhPSBNQ0lFUlJfU1VDQ0VTUykgcmV0dXJuIChDRF9FUlJPUik7Ci0JCS8qIENvbnZlcnQgZnJvbSBNU0YgKGZvcm1hdCBzZWxlY3RlZCBpbiB0aGUgT3BlbiBwcm9jZXNzKSB0byBGcmFtZXMgKGZvcm1hdCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQpICovCi0JCSpwb3NpdGlvbiA9IE1TRl9UT19GUkFNRVMoTVNGX01JTlVURShtc3AudWxSZXR1cm4pLE1TRl9TRUNPTkQobXNwLnVsUmV0dXJuKSxNU0ZfRlJBTUUobXNwLnVsUmV0dXJuKSk7Ci0JCX0KLQllbHNlICpwb3NpdGlvbiA9IDA7Ci0JfQotcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLS8qIFN0YXJ0IHBsYXkgLSBSZWFkeSBmb3IgTUNJICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLXsKLU1DSV9HRU5FUklDX1BBUk1TIG1ncDsKLU1DSV9TVEFUVVNfUEFSTVMgbXNwOwotTUNJX1BMQVlfUEFSTVMJbXBwOwotVUxPTkcgbWluLHNlYyxmcm07Ci0KLS8qIFN0YXJ0IE1TRiAqLwotRlJBTUVTX1RPX01TRihzdGFydCwgJm1pbiwgJnNlYywgJmZybSk7Ci1NU0ZfTUlOVVRFKG1wcC51bEZyb20pID0gbWluOwotTVNGX1NFQ09ORChtcHAudWxGcm9tKSA9IHNlYzsKLU1TRl9GUkFNRShtcHAudWxGcm9tKSA9IGZybTsKLS8qIEVuZCBNU0YgKi8KLUZSQU1FU19UT19NU0Yoc3RhcnQrbGVuZ3RoLCAmbWluLCAmc2VjLCAmZnJtKTsKLU1TRl9NSU5VVEUobXBwLnVsVG8pID0gbWluOwotTVNGX1NFQ09ORChtcHAudWxUbykgPSBzZWM7Ci1NU0ZfRlJBTUUobXBwLnVsVG8pID0gZnJtOwotI2lmZGVmIERFQlVHX0NEUk9NCi0JZnByaW50ZihzdGRlcnIsICJUcnlpbmcgdG8gcGxheSBmcm9tICVkOiVkOiVkIHRvICVkOiVkOiVkXG4iLAotCXBsYXl0aW1lLmNkbXNmX21pbjAsIHBsYXl0aW1lLmNkbXNmX3NlYzAsIHBsYXl0aW1lLmNkbXNmX2ZyYW1lMCwKLQlwbGF5dGltZS5jZG1zZl9taW4xLCBwbGF5dGltZS5jZG1zZl9zZWMxLCBwbGF5dGltZS5jZG1zZl9mcmFtZTEpOwotI2VuZGlmCi0vKiBWZXJpZmllcyBpZiBpdCBpcyBwYXVzZWQgZmlyc3QuLi4gYW5kIGlmIGl0IGlzLCB1bnBhdXNlIGJlZm9yZSBzdG9wcGluZyBpdC4gKi8KLW1zcC5od25kQ2FsbGJhY2sgPSAoSFdORClOVUxMOyAvKiBOb25lICovCi1tc3AudWxSZXR1cm4gPSAoVUxPTkcpTlVMTDsgLyogV2Ugd2FudCB0aGlzIGluZm9ybWF0aW9uICovCi1tc3AudWxJdGVtID0gTUNJX1NUQVRVU19NT0RFOwotbXNwLnVsVmFsdWUgPSAoVUxPTkcpTlVMTDsgLyogTm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLwotaWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfU1RBVFVTLE1DSV9XQUlUIHwgTUNJX1NUQVRVU19JVEVNLCZtc3AsIDApKSA9PSBNQ0lFUlJfU1VDQ0VTUykKLQl7Ci0JaWYgKG1zcC51bFJldHVybiA9PSBNQ0lfTU9ERV9QQVVTRSkKLQkJewotCQltZ3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKLQkJbWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9SRVNVTUUsMCwmbWdwLCAwKTsKLQkJfQotCX0KLS8qIE5vdyBwbGF5IGl0LiAqLwotbXBwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7CQkvLyBXZSBkbyBub3Qgd2FudCB0aGUgaW5mby4gdGVtcAotaWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfUExBWSxNQ0lfRlJPTSB8IE1DSV9UTywmbXBwLCAwKSkgPT0gTUNJRVJSX1NVQ0NFU1MpIHJldHVybiAwOwotcmV0dXJuIChDRF9FUlJPUik7Ci19Ci0KLS8qIFBhdXNlIHBsYXkgLSBSZWFkeSBmb3IgTUNJICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKQotewotTUNJX0dFTkVSSUNfUEFSTVMgbWdwOwotCi1tZ3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKLWlmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZChjZHJvbS0+aWQsTUNJX1BBVVNFLE1DSV9XQUlULCZtZ3AsIDApKSA9PSBNQ0lFUlJfU1VDQ0VTUykgcmV0dXJuIDA7Ci1yZXR1cm4oQ0RfRVJST1IpOwotfQotCi0vKiBSZXN1bWUgcGxheSAtIFJlYWR5IGZvciBNQ0kgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKQotewotTUNJX0dFTkVSSUNfUEFSTVMgbWdwOwotCi1tZ3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKLWlmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZChjZHJvbS0+aWQsTUNJX1JFU1VNRSxNQ0lfV0FJVCwmbWdwLCAwKSkgPT0gTUNJRVJSX1NVQ0NFU1MpIHJldHVybiAwOwotcmV0dXJuKENEX0VSUk9SKTsKLX0KLQotLyogU3RvcCBwbGF5IC0gUmVhZHkgZm9yIE1DSSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQotewotTUNJX0dFTkVSSUNfUEFSTVMgbWdwOwotTUNJX1NUQVRVU19QQVJNUyBtc3A7Ci0KLS8qIFZlcmlmaWVzIGlmIGl0IGlzIHBhdXNlZCBmaXJzdC4uLiBhbmQgaWYgaXQgaXMsIHVucGF1c2UgYmVmb3JlIHN0b3BwaW5nIGl0LiAqLwotbXNwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7IC8qIE5vbmUgKi8KLW1zcC51bFJldHVybiA9IChVTE9ORylOVUxMOyAvKiBXZSB3YW50IHRoaXMgaW5mb3JtYXRpb24gKi8KLW1zcC51bEl0ZW0gPSBNQ0lfU1RBVFVTX01PREU7Ci1tc3AudWxWYWx1ZSA9IChVTE9ORylOVUxMOyAvKiBObyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCi1pZiAoTE9VU0hPUlQobWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9TVEFUVVMsTUNJX1dBSVQgfCBNQ0lfU1RBVFVTX0lURU0sJm1zcCwgMCkpID09IE1DSUVSUl9TVUNDRVNTKQotCXsKLQlpZiAobXNwLnVsUmV0dXJuID09IE1DSV9NT0RFX1BBVVNFKQotCQl7Ci0JCW1ncC5od25kQ2FsbGJhY2sgPSAoSFdORClOVUxMOwkJLy8gTm9uZQotCQltY2lTZW5kQ29tbWFuZChjZHJvbS0+aWQsTUNJX1JFU1VNRSwwLCZtZ3AsIDApOwotCQl9Ci0JfQotLyogTm93IHN0b3BzIHRoZSBtZWRpYSAqLwotbWdwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7CQkvLyBOb25lCi1pZiAoTE9VU0hPUlQobWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9TVE9QLE1DSV9XQUlULCZtZ3AsIDApKSA9PSBNQ0lFUlJfU1VDQ0VTUykgcmV0dXJuIDA7Ci1yZXR1cm4oQ0RfRVJST1IpOwotfQotCi0vKiBFamVjdCB0aGUgQ0QtUk9NIC0gUmVhZHkgZm9yIE1DSSAqLwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKLXsKLU1DSV9TRVRfUEFSTVMgbXNwOwotCi1tc3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKLW1zcC51bFRpbWVGb3JtYXQgPSAoVUxPTkcpTlVMTDsJCS8vIE5vIGNoYW5nZQotbXNwLnVsU3BlZWRGb3JtYXQgPSAoVUxPTkcpTlVMTDsJCS8vIE5vIGNoYW5nZQotbXNwLnVsQXVkaW8gPSAoVUxPTkcpTlVMTDsJCQkJLy8gTm8gQ2hhbm5lbAotbXNwLnVsTGV2ZWwgPSAoVUxPTkcpTlVMTDsJCQkJLy8gTm8gVm9sdW1lCi1tc3AudWxPdmVyID0gKFVMT05HKU5VTEw7CQkJCS8vIE5vIERlbGF5Ci1tc3AudWxJdGVtID0gKFVMT05HKU5VTEw7CQkJCQkvLyBObyBpdGVtCi1tc3AudWxWYWx1ZSA9IChVTE9ORylOVUxMOwkJCQkJLy8gTm8gdmFsdWUgZm9yIGl0ZW0gZmxhZwotaWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfU0VULE1DSV9XQUlUIHwgTUNJX1NFVF9ET09SX09QRU4sJm1zcCwgMCkpID09IE1DSUVSUl9TVUNDRVNTKSByZXR1cm4gMDsKLXJldHVybihDRF9FUlJPUik7Ci19Ci0KLS8qIENsb3NlIHRoZSBDRC1ST00gaGFuZGxlIC0gUmVhZHkgZm9yIE1DSSAqLwotc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCi17Ci1NQ0lfR0VORVJJQ19QQVJNUyBtZ3A7Ci0KLW1ncC5od25kQ2FsbGJhY2sgPSAoSFdORClOVUxMOwkJLy8gTm9uZQotbWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9DTE9TRSxNQ0lfV0FJVCwmbWdwLCAwKTsKLX0KLQotLyogRmluYWxpemUgQ0RST00gU3Vic3lzdGVtIC0gUmVhZHkgZm9yIE1DSSAqLwotdm9pZCBTRExfU1lTX0NEUXVpdCh2b2lkKQotewotaW50IGk7Ci0KLWlmICggU0RMX251bWNkcyA+IDAgKQotCXsKLQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkKLQkJewotCQlTRExfZnJlZShTRExfY2RsaXN0W2ldKTsKLQkJfQotCVNETF9udW1jZHMgPSAwOwotCX0KLX0KLQotI2VuZGlmIC8qIFNETF9DRFJPTV9PUzIgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vcW54L1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9xbngvU0RMX3N5c2Nkcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MWQ2NDAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS9xbngvU0RMX3N5c2Nkcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfQ0RST01fUU5YCi0KLS8qIEZ1bmN0aW9ucyBmb3Igc3lzdGVtLWxldmVsIENELVJPTSBhdWRpbyBjb250cm9sICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvY2Ryb20uaD4KLSNpbmNsdWRlIDxzeXMvZGNtZF9jYW0uaD4KLQotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIlNETF9jZHJvbS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQ0QtUk9NIGRyaXZlcyB3ZSdsbCBkZXRlY3QgKi8KLSNkZWZpbmUgTUFYX0RSSVZFUyAxNgotCi0jZGVmaW5lIFFOWF9DRF9PUEVOTU9ERSBPX1JET05MWSB8IE9fRVhDTAotCi0vKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIENELVJPTSBkcml2ZXMgKi8KLXN0YXRpYyBjaGFyICpTRExfY2RsaXN0W01BWF9EUklWRVNdOwotc3RhdGljIGRldl90IFNETF9jZG1vZGVbTUFYX0RSSVZFU107Ci1zdGF0aWMgaW50ICAgU0RMX2Nkb3BlbltNQVhfRFJJVkVTXTsKLQotLyogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQ0QgY29udHJvbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOwotc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKLQotLyogQ2hlY2sgYSBkcml2ZSB0byBzZWUgaWYgaXQgaXMgYSBDRC1ST00gKi8KLXN0YXRpYyBpbnQgQ2hlY2tEcml2ZShjaGFyICpkcml2ZSwgc3RydWN0IHN0YXQgKnN0YnVmKQotewotICAgIGludCBpc19jZCwgY2RmZDsKLSAgICBjYW1fZGV2aW5mb190IGRpbmZvOwotICAgIGludCBkZXZjdGxyZXQ9MDsKLQotICAgIGludCBhdGFwaTsKLSAgICBpbnQgcmVtb3ZhYmxlOwotICAgIGludCBjZGIxMDsKLQotICAgIC8qIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHJldHVybiAtMSAqLwotICAgIGlmIChzdGF0KGRyaXZlLCBzdGJ1ZikgPCAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuKC0xKTsKLSAgICB9Ci0KLSAgICAvKiBJZiBpdCBkb2VzIGV4aXN0LCB2ZXJpZnkgdGhhdCBpdCdzIGFuIGF2YWlsYWJsZSBDRC1ST00gKi8KLSAgICBpc19jZCA9IDA7Ci0KLSAgICBpZiAoU19JU0NIUihzdGJ1Zi0+c3RfbW9kZSkgfHwgU19JU0JMSyhzdGJ1Zi0+c3RfbW9kZSkpCi0gICAgewotICAgICAgICBjZGZkID0gb3Blbihkcml2ZSwgUU5YX0NEX09QRU5NT0RFKTsKLSAgICAgICAgaWYgKCBjZGZkID49IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXZjdGxyZXQ9ZGV2Y3RsKGNkZmQsIERDTURfQ0FNX0RFVklORk8sICZkaW5mbywgc2l6ZW9mKGNhbV9kZXZpbmZvX3QpLCBOVUxMKTsKLQotICAgICAgICAgICAgaWYgKGRldmN0bHJldD09RU9LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgYXRhcGk9ZGluZm8uZmxhZ3MgJiBERVZfQVRBUEk7Ci0gICAgICAgICAgICAgICByZW1vdmFibGU9ZGluZm8uZmxhZ3MgJiBERVZfUkVNT1ZBQkxFOwotICAgICAgICAgICAgICAgY2RiMTA9ZGluZm8uZmxhZ3MgJiBERVZfQ0RCXzEwOyAvKiBJJ20gbm90IHN1cmUgYWJvdXQgdGhhdCBmbGFnICovCi0KLSAgICAgICAgICAgICAgIC8qIGluIHRoZSBuZWFyIGZ1dHVyZSBuZWVkIHRvIGFkZCBtb3JlIGNoZWNrcyBmb3Igc3BsaXR0aW5nIGNkcm9tcyBmcm9tIG90aGVyIGRldmljZXMgKi8KLSAgICAgICAgICAgICAgIGlmICgoYXRhcGkpJiYocmVtb3ZhYmxlKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBpc19jZCA9IDE7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNsb3NlKGNkZmQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybihpc19jZCk7Ci19Ci0KLS8qIEFkZCBhIENELVJPTSBkcml2ZSB0byBvdXIgbGlzdCBvZiB2YWxpZCBkcml2ZXMgKi8KLXN0YXRpYyB2b2lkIEFkZERyaXZlKGNoYXIgKmRyaXZlLCBzdHJ1Y3Qgc3RhdCAqc3RidWYpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoU0RMX251bWNkcyA8IE1BWF9EUklWRVMpCi0gICAgewotICAgICAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgaXQncyBub3QgYWxyZWFkeSBpbiBvdXIgbGlzdC4KLSAgICAgICAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2Ugc2VlIGEgZHJpdmUgdmlhIHN5bWJvbGljIGxpbmsuICovCi0KLSAgICAgICAgZm9yIChpPTA7IGk8U0RMX251bWNkczsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RidWYtPnN0X3JkZXYgPT0gU0RMX2NkbW9kZVtpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBZGQgdGhpcyBkcml2ZSB0byBvdXIgbGlzdCAqLwotCi0gICAgICAgIGkgPSBTRExfbnVtY2RzOwotICAgICAgICBTRExfY2RsaXN0W2ldID0gU0RMX3N0cmR1cChkcml2ZSk7Ci0gICAgICAgIGlmIChTRExfY2RsaXN0W2ldID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNETF9jZG1vZGVbaV0gPSBzdGJ1Zi0+c3RfcmRldjsKLSAgICAgICAgKytTRExfbnVtY2RzOwotICAgIH0KLX0KLQotaW50IFNETF9TWVNfQ0RJbml0KHZvaWQpCi17Ci0gICAgLyogY2hlY2tsaXN0OiAvZGV2L2Nkcm9tLCAvZGV2L2NkPywgL2Rldi9zY2Q/ICovCi0gICAgc3RhdGljIGNoYXIgKmNoZWNrbGlzdFtdPXsiY2Ryb20iLCAiPzAgY2Q/IiwgIj8xIGNkPyIsICI/MCBzY2Q/IiwgTlVMTH07Ci0KLSAgICBjaGFyICpTRExjZHJvbTsKLSAgICBpbnQgaSwgaiwgZXhpc3RzOwotICAgIGNoYXIgZHJpdmVbMzJdOwotICAgIHN0cnVjdCBzdGF0IHN0YnVmOwotCi0gICAgLyogRmlsbCBpbiBvdXIgZHJpdmVyIGNhcGFiaWxpdGllcyAqLwotICAgIFNETF9DRGNhcHMuTmFtZSA9IFNETF9TWVNfQ0ROYW1lOwotICAgIFNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOwotICAgIFNETF9DRGNhcHMuR2V0VE9DID0gU0RMX1NZU19DREdldFRPQzsKLSAgICBTRExfQ0RjYXBzLlN0YXR1cyA9IFNETF9TWVNfQ0RTdGF0dXM7Ci0gICAgU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7Ci0gICAgU0RMX0NEY2Fwcy5QYXVzZSA9IFNETF9TWVNfQ0RQYXVzZTsKLSAgICBTRExfQ0RjYXBzLlJlc3VtZSA9IFNETF9TWVNfQ0RSZXN1bWU7Ci0gICAgU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7Ci0gICAgU0RMX0NEY2Fwcy5FamVjdCA9IFNETF9TWVNfQ0RFamVjdDsKLSAgICBTRExfQ0RjYXBzLkNsb3NlID0gU0RMX1NZU19DRENsb3NlOwotCi0gICAgLyogY2xlYXJpbmcgZGV2aWNlIG9wZW4gc3RhdHVzICovCi0gICAgZm9yIChpPTA7IGk8TUFYX0RSSVZFUzsgaSsrKQotICAgIHsKLSAgICAgICBTRExfY2RvcGVuW2ldPTA7Ci0gICAgfQotCi0gICAgLyogTG9vayBpbiB0aGUgZW52aXJvbm1lbnQgZm9yIG91ciBDRC1ST00gZHJpdmUgbGlzdCAqLwotICAgIFNETGNkcm9tID0gU0RMX2dldGVudigiU0RMX0NEUk9NIik7CS8qICc6JyBzZXBhcmF0ZWQgbGlzdCBvZiBkZXZpY2VzICovCi0gICAgaWYgKCBTRExjZHJvbSAhPSBOVUxMICkKLSAgICB7Ci0gICAgICAgIGNoYXIgKmNkcGF0aCwgKmRlbGltOwotCXNpemVfdCBsZW4gPSBTRExfc3RybGVuKFNETGNkcm9tKSsxOwotICAgICAgICBjZHBhdGggPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbGVuKTsKLSAgICAgICAgaWYgKGNkcGF0aCAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRExfc3RybGNweShjZHBhdGgsIFNETGNkcm9tLCBsZW4pOwotICAgICAgICAgICAgU0RMY2Ryb20gPSBjZHBhdGg7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgZGVsaW0gPSBTRExfc3RyY2hyKFNETGNkcm9tLCAnOicpOwotICAgICAgICAgICAgICAgIGlmIChkZWxpbSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpkZWxpbSsrID0gJ1wwJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKENoZWNrRHJpdmUoU0RMY2Ryb20sICZzdGJ1ZikgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQWRkRHJpdmUoU0RMY2Ryb20sICZzdGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWxpbSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNETGNkcm9tID0gZGVsaW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNETGNkcm9tID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChTRExjZHJvbSk7Ci0gICAgICAgICAgICBTRExfc3RhY2tfZnJlZShjZHBhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgd2UgZm91bmQgb3VyIGRyaXZlcywgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gKi8KLSAgICAgICAgaWYgKFNETF9udW1jZHMgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTY2FuIHRoZSBzeXN0ZW0gZm9yIENELVJPTSBkcml2ZXMgKi8KLSAgICBmb3IgKCBpPTA7IGNoZWNrbGlzdFtpXTsgKytpICkKLSAgICB7Ci0gICAgICAgIGlmIChjaGVja2xpc3RbaV1bMF0gPT0gJz8nKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyKiBpbnNlcnQ7Ci0gICAgICAgICAgICBleGlzdHMgPSAxOwotCi0gICAgICAgICAgICBmb3IgKCBqPWNoZWNrbGlzdFtpXVsxXTsgZXhpc3RzOyArK2ogKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNETF9zbnByaW50Zihkcml2ZSwgU0RMX2FycmF5c2l6ZShkcml2ZSksICIvZGV2LyVzIiwgJmNoZWNrbGlzdFtpXVszXSk7Ci0gICAgICAgICAgICAgICAgaW5zZXJ0ID0gU0RMX3N0cmNocihkcml2ZSwgJz8nKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqaW5zZXJ0ID0gajsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDaGVja0RyaXZlKGRyaXZlLCAmc3RidWYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRHJpdmUgZXhpc3RzIGFuZCBpcyBhIENELVJPTSAqLwotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZERyaXZlKGRyaXZlLCAmc3RidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLyogRHJpdmUgZXhpc3RzLCBidXQgaXNuJ3QgYSBDRC1ST00gKi8KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLyogRHJpdmUgZG9lc24ndCBleGlzdCAqLwotICAgICAgICAgICAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTRExfc25wcmludGYoZHJpdmUsIFNETF9hcnJheXNpemUoZHJpdmUpLCAiL2Rldi8lcyIsIGNoZWNrbGlzdFtpXSk7Ci0gICAgICAgICAgICBpZiAoQ2hlY2tEcml2ZShkcml2ZSwgJnN0YnVmKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWRkRHJpdmUoZHJpdmUsICZzdGJ1Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuKDApOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKQotewotICAgIHJldHVybihTRExfY2RsaXN0W2RyaXZlXSk7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKQotewotICAgIGludCBoYW5kbGU7Ci0KLSAgICBoYW5kbGU9b3BlbihTRExfY2RsaXN0W2RyaXZlXSwgUU5YX0NEX09QRU5NT0RFKTsKLQotICAgIGlmIChoYW5kbGU+MCkKLSAgICB7Ci0gICAgICAgIFNETF9jZG9wZW5bZHJpdmVdPWhhbmRsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKGhhbmRsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQotewotICAgIGNkcm9tX3JlYWRfdG9jX3QgdG9jOwotICAgIGludCBpLCBva2F5OwotCi0gICAgb2theSA9IDA7Ci0gICAgaWYgKGRldmN0bChjZHJvbS0+aWQsIERDTURfQ0FNX0NEUk9NUkVBRFRPQywgJnRvYywgc2l6ZW9mKHRvYyksIE5VTEwpID09IDApCi0gICAgewotICAgICAgICBjZHJvbS0+bnVtdHJhY2tzID0gdG9jLmxhc3RfdHJhY2sgLSB0b2MuZmlyc3RfdHJhY2sgKyAxOwotICAgICAgICBpZiAoY2Ryb20tPm51bXRyYWNrcyA+IFNETF9NQVhfVFJBQ0tTKQotICAgICAgICB7Ci0gICAgICAgICAgICBjZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7Ci0gICAgICAgIH0KLSAgICAgICAgLyogUmVhZCBhbGwgdGhlIHRyYWNrIFRPQyBlbnRyaWVzICovCi0gICAgICAgIGZvciAoaT0wOyBpPD1jZHJvbS0+bnVtdHJhY2tzOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpID09IGNkcm9tLT5udW10cmFja3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ldLmlkID0gQ0RST01fTEVBRE9VVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjZHJvbS0+dHJhY2tbaV0uaWQgPSB0b2MuZmlyc3RfdHJhY2sraTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ldLnR5cGUgPSB0b2MudG9jX2VudHJ5W2ldLmNvbnRyb2xfYWRyICYgMHgwRjsKLSAgICAgICAgICAgIGNkcm9tLT50cmFja1tpXS5vZmZzZXQgPSB0b2MudG9jX2VudHJ5W2ldLmFkZHIubGJhOwotICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ktMV0ubGVuZ3RoID0gY2Ryb20tPnRyYWNrW2ldLm9mZnNldC1jZHJvbS0+dHJhY2tbaS0xXS5vZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gKGNkcm9tLT5udW10cmFja3MrMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9rYXkgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAob2theSA/IDAgOiAtMSk7Ci19Ci0KLS8qIEdldCBDRC1ST00gc3RhdHVzICovCi1zdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKQotewotICAgIENEc3RhdHVzIHN0YXR1czsKLQotICAgIGNkcm9tX3JlYWRfdG9jX3QgdG9jOwotICAgIGNkcm9tX3N1YmNoX2RhdGFfdCBpbmZvOwotICAgIGNhbV9kZXZpbmZvX3QgZGluZm87Ci0KLSAgICBpbnQgZGV2Y3RscmV0PTA7Ci0gICAgaW50IGRyaXZlPS0xOwotICAgIGludCBpOwotICAgIGludCBlYWdhaW5jbnQ9MDsKLQotICAgIC8qIGNoZWNrIG1lZGlhIHByZXNlbmNlIGJlZm9yZSByZWFkIHN1YmNoYW5uZWwgY2FsbCwgc29tZSBjZHJvbXMgY2FuIGxvY2t1cHMgKi8KLSAgICAvKiBpZiBubyBtZWRpYSwgd2hpbGUgY2FsbGluZyByZWFkIHN1YmNoYW5uZWwgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZGV2Y3RscmV0PWRldmN0bChjZHJvbS0+aWQsIERDTURfQ0FNX0RFVklORk8sICZkaW5mbywgc2l6ZW9mKGNhbV9kZXZpbmZvX3QpLCBOVUxMKTsKLQotICAgIGlmIChkZXZjdGxyZXQ9PUVPSykKLSAgICB7Ci0gICAgICAgIGlmICgoZGluZm8uZmxhZ3MgJiBERVZfTk9fTUVESUEpIT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBDRF9UUkFZRU1QVFk7Ci0gICAgICAgICAgICBpZiAocG9zaXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGlmIG1lZGlhIGV4aXN0cywgdGhlbiBkbyBvdGhlciBzdHVmZiAqLwotCi0gICAgU0RMX21lbXNldCgmaW5mbywgMHgwMCwgc2l6ZW9mKGluZm8pKTsKLSAgICBpbmZvLnN1YmNoX2NvbW1hbmQuZGF0YV9mb3JtYXQgPSBDRFJPTV9TVUJDSF9DVVJSRU5UX1BPU0lUSU9OOwotCi0gICAgZG8gewotICAgICAgICBkZXZjdGxyZXQ9ZGV2Y3RsKGNkcm9tLT5pZCwgRENNRF9DQU1fQ0RST01TVUJDSE5MLCAmaW5mbywgc2l6ZW9mKGluZm8pLCBOVUxMKTsKLSAgICAgICAgaWYgKGRldmN0bHJldD09RUlPKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBiaWcgd29ya2Fyb3VuZCBmb3IgbWVkaWEgY2hhbmdlLCBoYW5kbGUgaXMgdW51c2FibGUgYWZ0ZXIgdGhhdCwKLSAgICAgICAgICAgICAgIHRoYXQgYnVnIHdhcyBmb3VuZCBpbiBRTlggNi4yLCA2LjIuMSBpcyBub3QgcmVsZWFzZWQgeWV0LiAgICAqLwotCi0gICAgICAgICAgICBmb3IgKGk9MDsgaTxNQVhfRFJJVkVTOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFNETF9jZG9wZW5baV09PWNkcm9tLT5pZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlPWk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkcml2ZT09LTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiB0aGF0IGNhbm5vdCBoYXBwZW4sIGJ1dCAuLi4gKi8KLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xvc2UoY2Ryb20tPmlkKTsKLSAgICAgICAgICAgIGNkcm9tLT5pZD1vcGVuKFNETF9jZGxpc3RbZHJpdmVdLCBRTlhfQ0RfT1BFTk1PREUpOwotICAgICAgICAgICAgZGV2Y3RscmV0PUVBR0FJTjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2Y3RscmV0PT1FQUdBSU4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVhZ2FpbmNudCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlYWdhaW5jbnQ9PTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIGJyb2tlbiBjZHJvbXMsIHdoaWNoIGNhbiByZXR1cm4gYWx3YXlzIEVBR0FJTiB3aGVuIGl0cyBub3QgcmVhZHksICovCi0gICAgICAgICAgICAvKiB0aGF0IG1lYW4gZXJyb3Jub3VzIG1lZGlhIG9yIGp1c3Qgbm8gbWVkaWEgYXZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZGV2Y3RscmV0PUVOWElPOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICgoZGV2Y3RscmV0PT1FQUdBSU4pfHwoZGV2Y3RscmV0PT1FU1RBTEUpKTsKLQotICAgIGlmIChkZXZjdGxyZXQgIT0gMCkKLSAgICB7Ci0gICAgICAgIGlmIChkZXZjdGxyZXQ9PUVOWElPKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBDRF9UUkFZRU1QVFk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBDRF9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzd2l0Y2ggKGluZm8uY3VycmVudF9wb3NpdGlvbi5oZWFkZXIuYXVkaW9fc3RhdHVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIENEUk9NX0FVRElPX0lOVkFMSUQ6Ci0gICAgICAgICAgICBjYXNlIENEUk9NX0FVRElPX05PX1NUQVRVUzoKLSAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIGRldGVybWluZSBpZiB0aGVyZSdzIGEgQ0QgYXZhaWxhYmxlICovCi0gICAgICAgICAgICAgICAgIGlmIChkZXZjdGwoY2Ryb20tPmlkLCBEQ01EX0NBTV9DRFJPTVJFQURUT0MsICZ0b2MsIHNpemVvZih0b2MpLCBOVUxMKT09MCkKLSAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0gICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX1RSQVlFTVBUWTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENEUk9NX0FVRElPX0NPTVBMRVRFRDoKLSAgICAgICAgICAgICAgICAgc3RhdHVzID0gQ0RfU1RPUFBFRDsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENEUk9NX0FVRElPX1BMQVk6Ci0gICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDRFJPTV9BVURJT19QQVVTRUQ6Ci0gICAgICAgICAgICAgICAgIC8qIFdvcmthcm91bmQgYnVnZ3kgQ0QtUk9NIGRyaXZlICovCi0gICAgICAgICAgICAgICAgIGlmIChpbmZvLmN1cnJlbnRfcG9zaXRpb24uZGF0YV9mb3JtYXQgPT0gQ0RST01fTEVBRE9VVCkKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQ0RfU1RPUFBFRDsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX0VSUk9SOwotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwb3NpdGlvbikKLSAgICB7Ci0gICAgICAgaWYgKHN0YXR1cz09Q0RfUExBWUlORyB8fCAoc3RhdHVzPT1DRF9QQVVTRUQpKQotICAgICAgIHsKLSAgICAgICAgICAgKnBvc2l0aW9uID0gTVNGX1RPX0ZSQU1FUyhpbmZvLmN1cnJlbnRfcG9zaXRpb24uYWRkci5tc2YubWludXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uY3VycmVudF9wb3NpdGlvbi5hZGRyLm1zZi5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5jdXJyZW50X3Bvc2l0aW9uLmFkZHIubXNmLmZyYW1lKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgICAgKnBvc2l0aW9uID0gMDsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIChzdGF0dXMpOwotfQotCi0vKiBTdGFydCBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLXsKLSAgICBjZHJvbV9wbGF5bXNmX3QgcGxheXRpbWU7Ci0KLSAgICBGUkFNRVNfVE9fTVNGKHN0YXJ0LCAmcGxheXRpbWUuc3RhcnRfbWludXRlLCAmcGxheXRpbWUuc3RhcnRfc2Vjb25kLCAmcGxheXRpbWUuc3RhcnRfZnJhbWUpOwotICAgIEZSQU1FU19UT19NU0Yoc3RhcnQrbGVuZ3RoLCAmcGxheXRpbWUuZW5kX21pbnV0ZSwgJnBsYXl0aW1lLmVuZF9zZWNvbmQsICZwbGF5dGltZS5lbmRfZnJhbWUpOwotCi0gICAgaWYgKGRldmN0bChjZHJvbS0+aWQsIERDTURfQ0FNX0NEUk9NUExBWU1TRiwgJnBsYXl0aW1lLCBzaXplb2YocGxheXRpbWUpLCBOVUxMKSAhPSAwKQotICAgIHsKLSAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBQYXVzZSBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKQotewotICAgIGlmIChkZXZjdGwoY2Ryb20tPmlkLCBEQ01EX0NBTV9DRFJPTVBBVVNFLCBOVUxMLCAwLCBOVUxMKSE9MCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogUmVzdW1lIHBsYXkgKi8KLXN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKQotewotICAgIGlmIChkZXZjdGwoY2Ryb20tPmlkLCBEQ01EX0NBTV9DRFJPTVJFU1VNRSwgTlVMTCwgMCwgTlVMTCkhPTApCi0gICAgewotICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIFN0b3AgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQotewotICAgIGlmIChkZXZjdGwoY2Ryb20tPmlkLCBEQ01EX0NBTV9DRFJPTVNUT1AsIE5VTEwsIDAsIE5VTEwpIT0wKQotICAgIHsKLSAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBFamVjdCB0aGUgQ0QtUk9NICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKQotewotICAgIGlmIChkZXZjdGwoY2Ryb20tPmlkLCBEQ01EX0NBTV9FSkVDVF9NRURJQSwgTlVMTCwgMCwgTlVMTCkhPTApCi0gICAgewotICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIENsb3NlIHRoZSBDRC1ST00gaGFuZGxlICovCi1zdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaT0wOyBpPE1BWF9EUklWRVM7IGkrKykKLSAgICB7Ci0gICAgICAgaWYgKFNETF9jZG9wZW5baV09PWNkcm9tLT5pZCkKLSAgICAgICB7Ci0gICAgICAgICAgIFNETF9jZG9wZW5baV09MDsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLQotICAgIGNsb3NlKGNkcm9tLT5pZCk7Ci19Ci0KLXZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmIChTRExfbnVtY2RzID4gMCkKLSAgICB7Ci0gICAgICAgIGZvciAoaT0wOyBpPFNETF9udW1jZHM7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgU0RMX2ZyZWUoU0RMX2NkbGlzdFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgU0RMX251bWNkcyA9IDA7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogU0RMX0NEUk9NX1FOWCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS93aW4zMi9TRExfc3lzY2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vd2luMzIvU0RMX3N5c2Nkcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMDU4N2QuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9jZHJvbS93aW4zMi9TRExfc3lzY2Ryb20uYworKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9DRFJPTV9XSU4zMgotCi0vKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCAqLwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8bW1zeXN0ZW0uaD4KLQotI2luY2x1ZGUgIlNETF9jZHJvbS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgotCi0vKiBUaGlzIHJlYWxseSBicm9rZW4/PyAqLwotI2RlZmluZSBCUk9LRU5fTUNJX1BBVVNFCS8qIFBhdXNpbmcgYWN0dWFsbHkgc3RvcHMgcGxheSAtLSBEb2ghICovCi0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIHdlJ2xsIGRldGVjdCAoRG9uJ3QgY2hhbmdlISkgKi8KLSNkZWZpbmUgTUFYX0RSSVZFUwkyNgkKLQotLyogQSBsaXN0IG9mIGF2YWlsYWJsZSBDRC1ST00gZHJpdmVzICovCi1zdGF0aWMgY2hhciAqU0RMX2NkbGlzdFtNQVhfRFJJVkVTXTsKLXN0YXRpYyBNQ0lERVZJQ0VJRCBTRExfbWNpSURbTUFYX0RSSVZFU107Ci0jaWZkZWYgQlJPS0VOX01DSV9QQVVTRQotc3RhdGljIGludCBTRExfcGF1c2VkW01BWF9EUklWRVNdOwotI2VuZGlmCi1zdGF0aWMgaW50IFNETF9DRF9lbmRfcG9zaXRpb247Ci0KLS8qIFRoZSBzeXN0ZW0tZGVwZW5kZW50IENEIGNvbnRyb2wgZnVuY3Rpb25zICovCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKTsKLXN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKTsKLXN0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOwotc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pOwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7Ci1zdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSk7Ci0KLQotLyogQWRkIGEgQ0QtUk9NIGRyaXZlIHRvIG91ciBsaXN0IG9mIHZhbGlkIGRyaXZlcyAqLwotc3RhdGljIHZvaWQgQWRkRHJpdmUoY2hhciAqZHJpdmUpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIFNETF9udW1jZHMgPCBNQVhfRFJJVkVTICkgewotCQkvKiBBZGQgdGhpcyBkcml2ZSB0byBvdXIgbGlzdCAqLwotCQlpID0gU0RMX251bWNkczsKLQkJU0RMX2NkbGlzdFtpXSA9IFNETF9zdHJkdXAoZHJpdmUpOwotCQlpZiAoIFNETF9jZGxpc3RbaV0gPT0gTlVMTCApIHsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCSsrU0RMX251bWNkczsKLSNpZmRlZiBDRFJPTV9ERUJVRwotICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIENELVJPTSBkcml2ZTogJXNcbiIsIGRyaXZlKTsKLSNlbmRpZgotCX0KLX0KLQotaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQotewotCS8qIGNoZWNrbGlzdDogRHJpdmUgJ0EnIC0gJ1onICovCi0JaW50IGk7Ci0JY2hhciBkcml2ZVs0XTsKLQotCS8qIEZpbGwgaW4gb3VyIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KLQlTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKLQlTRExfQ0RjYXBzLk9wZW4gPSBTRExfU1lTX0NET3BlbjsKLQlTRExfQ0RjYXBzLkdldFRPQyA9IFNETF9TWVNfQ0RHZXRUT0M7Ci0JU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOwotCVNETF9DRGNhcHMuUGxheSA9IFNETF9TWVNfQ0RQbGF5OwotCVNETF9DRGNhcHMuUGF1c2UgPSBTRExfU1lTX0NEUGF1c2U7Ci0JU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOwotCVNETF9DRGNhcHMuU3RvcCA9IFNETF9TWVNfQ0RTdG9wOwotCVNETF9DRGNhcHMuRWplY3QgPSBTRExfU1lTX0NERWplY3Q7Ci0JU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKLQotCS8qIFNjYW4gdGhlIHN5c3RlbSBmb3IgQ0QtUk9NIGRyaXZlcyAqLwotCWZvciAoIGk9J0EnOyBpPD0nWic7ICsraSApIHsKLQkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIiVjOlxcIiwgaSk7Ci0JCWlmICggR2V0RHJpdmVUeXBlKGRyaXZlKSA9PSBEUklWRV9DRFJPTSApIHsKLQkJCUFkZERyaXZlKGRyaXZlKTsKLQkJfQotCX0KLQlTRExfbWVtc2V0KFNETF9tY2lJRCwgMCwgc2l6ZW9mKFNETF9tY2lJRCkpOwotCXJldHVybigwKTsKLX0KLQotLyogR2VuZXJhbCBpb2N0bCgpIENELVJPTSBjb21tYW5kIGZ1bmN0aW9uICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0Rpb2N0bChpbnQgaWQsIFVJTlQgbXNnLCBEV09SRCBmbGFncywgdm9pZCAqYXJnKQotewotCU1DSUVSUk9SIG1jaV9lcnJvcjsKLQotCW1jaV9lcnJvciA9IG1jaVNlbmRDb21tYW5kKFNETF9tY2lJRFtpZF0sIG1zZywgZmxhZ3MsIChEV09SRF9QVFIpYXJnKTsKLQlpZiAoIG1jaV9lcnJvciApIHsKLQkJY2hhciBlcnJvclsyNTZdOwotCi0JCW1jaUdldEVycm9yU3RyaW5nKG1jaV9lcnJvciwgZXJyb3IsIDI1Nik7Ci0JCVNETF9TZXRFcnJvcigibWNpU2VuZENvbW1hbmQoKSBlcnJvcjogJXMiLCBlcnJvcik7Ci0JfQotCXJldHVybighbWNpX2Vycm9yID8gMCA6IC0xKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKLXsKLQlyZXR1cm4oU0RMX2NkbGlzdFtkcml2ZV0pOwotfQotCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSkKLXsKLQlNQ0lfT1BFTl9QQVJNUyBtY2lfb3BlbjsKLQlNQ0lfU0VUX1BBUk1TIG1jaV9zZXQ7Ci0JY2hhciBkZXZpY2VbM107Ci0JRFdPUkQgZmxhZ3M7Ci0KLQkvKiBPcGVuIHRoZSByZXF1ZXN0ZWQgZGV2aWNlICovCi0JbWNpX29wZW4ubHBzdHJEZXZpY2VUeXBlID0gKExQQ1NUUikgTUNJX0RFVlRZUEVfQ0RfQVVESU87Ci0JZGV2aWNlWzBdID0gKlNETF9jZGxpc3RbZHJpdmVdOwotCWRldmljZVsxXSA9ICc6JzsKLQlkZXZpY2VbMl0gPSAnXDAnOwotCW1jaV9vcGVuLmxwc3RyRWxlbWVudE5hbWUgPSBkZXZpY2U7Ci0JZmxhZ3MgPQotCSAgKE1DSV9PUEVOX1RZUEV8TUNJX09QRU5fU0hBUkVBQkxFfE1DSV9PUEVOX1RZUEVfSUR8TUNJX09QRU5fRUxFTUVOVCk7Ci0JaWYgKCBTRExfU1lTX0NEaW9jdGwoMCwgTUNJX09QRU4sIGZsYWdzLCAmbWNpX29wZW4pIDwgMCApIHsKLQkJZmxhZ3MgJj0gfk1DSV9PUEVOX1NIQVJFQUJMRTsKLQkJaWYgKCBTRExfU1lTX0NEaW9jdGwoMCwgTUNJX09QRU4sIGZsYWdzLCAmbWNpX29wZW4pIDwgMCApIHsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9Ci0JU0RMX21jaUlEW2RyaXZlXSA9IG1jaV9vcGVuLndEZXZpY2VJRDsKLQotCS8qIFNldCB0aGUgbWludXRlLXNlY29uZC1mcmFtZSB0aW1lIGZvcm1hdCAqLwotCW1jaV9zZXQuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NU0Y7Ci0JU0RMX1NZU19DRGlvY3RsKGRyaXZlLCBNQ0lfU0VULCBNQ0lfU0VUX1RJTUVfRk9STUFULCAmbWNpX3NldCk7Ci0KLSNpZmRlZiBCUk9LRU5fTUNJX1BBVVNFCi0JU0RMX3BhdXNlZFtkcml2ZV0gPSAwOwotI2VuZGlmCi0JcmV0dXJuKGRyaXZlKTsKLX0KLQotc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pCi17Ci0JTUNJX1NUQVRVU19QQVJNUyBtY2lfc3RhdHVzOwotCWludCBpLCBva2F5OwotCURXT1JEIGZsYWdzOwotCi0Jb2theSA9IDA7Ci0JbWNpX3N0YXR1cy5kd0l0ZW0gPSBNQ0lfU1RBVFVTX05VTUJFUl9PRl9UUkFDS1M7Ci0JZmxhZ3MgPSBNQ0lfU1RBVFVTX0lURU0gfCBNQ0lfV0FJVDsKLQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9TVEFUVVMsIGZsYWdzLCAmbWNpX3N0YXR1cykgPT0gMCApIHsKLQkJY2Ryb20tPm51bXRyYWNrcyA9IG1jaV9zdGF0dXMuZHdSZXR1cm47Ci0JCWlmICggY2Ryb20tPm51bXRyYWNrcyA+IFNETF9NQVhfVFJBQ0tTICkgewotCQkJY2Ryb20tPm51bXRyYWNrcyA9IFNETF9NQVhfVFJBQ0tTOwotCQl9Ci0JCS8qIFJlYWQgYWxsIHRoZSB0cmFjayBUT0MgZW50cmllcyAqLwotCQlmbGFncyA9IE1DSV9TVEFUVVNfSVRFTSB8IE1DSV9UUkFDSyB8IE1DSV9XQUlUOwotCQlmb3IgKCBpPTA7IGk8Y2Ryb20tPm51bXRyYWNrczsgKytpICkgewotCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gaSsxOwotCQkJbWNpX3N0YXR1cy5kd1RyYWNrID0gY2Ryb20tPnRyYWNrW2ldLmlkOwotI2lmZGVmIE1DSV9DREFfU1RBVFVTX1RZUEVfVFJBQ0sKLQkJCW1jaV9zdGF0dXMuZHdJdGVtID0gTUNJX0NEQV9TVEFUVVNfVFlQRV9UUkFDSzsKLQkJCWlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1NUQVRVUywgZmxhZ3MsCi0JCQkJCQkJJm1jaV9zdGF0dXMpIDwgMCApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICggbWNpX3N0YXR1cy5kd1JldHVybiA9PSBNQ0lfQ0RBX1RSQUNLX0FVRElPICkgewotCQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOwotCQkJfSBlbHNlIHsKLQkJCQljZHJvbS0+dHJhY2tbaV0udHlwZSA9IFNETF9EQVRBX1RSQUNLOwotCQkJfQotI2Vsc2UKLQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOwotI2VuZGlmCi0JCQltY2lfc3RhdHVzLmR3SXRlbSA9IE1DSV9TVEFUVVNfUE9TSVRJT047Ci0JCQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9TVEFUVVMsIGZsYWdzLAotCQkJCQkJCSZtY2lfc3RhdHVzKSA8IDAgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gTVNGX1RPX0ZSQU1FUygKLQkJCQkJTUNJX01TRl9NSU5VVEUobWNpX3N0YXR1cy5kd1JldHVybiksCi0JCQkJCU1DSV9NU0ZfU0VDT05EKG1jaV9zdGF0dXMuZHdSZXR1cm4pLAotCQkJCQlNQ0lfTVNGX0ZSQU1FKG1jaV9zdGF0dXMuZHdSZXR1cm4pKTsKLQkJCWNkcm9tLT50cmFja1tpXS5sZW5ndGggPSAwOwotCQkJaWYgKCBpID4gMCApIHsKLQkJCQljZHJvbS0+dHJhY2tbaS0xXS5sZW5ndGggPQotCQkJCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldC0KLQkJCQkJCWNkcm9tLT50cmFja1tpLTFdLm9mZnNldDsKLQkJCX0KLQkJfQotCQlpZiAoIGkgPT0gY2Ryb20tPm51bXRyYWNrcyApIHsKLQkJCW1jaV9zdGF0dXMuZHdUcmFjayA9IGNkcm9tLT50cmFja1tpIC0gMV0uaWQ7Ci0JCQltY2lfc3RhdHVzLmR3SXRlbSA9IE1DSV9TVEFUVVNfTEVOR1RIOwotCQkJaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBNQ0lfU1RBVFVTLCBmbGFncywKLQkJCQkJCQkmbWNpX3N0YXR1cykgPT0gMCApIHsKLQkJCQljZHJvbS0+dHJhY2tbaSAtIDFdLmxlbmd0aCA9IE1TRl9UT19GUkFNRVMoCi0JCQkJCU1DSV9NU0ZfTUlOVVRFKG1jaV9zdGF0dXMuZHdSZXR1cm4pLAotCQkJCQlNQ0lfTVNGX1NFQ09ORChtY2lfc3RhdHVzLmR3UmV0dXJuKSwKLQkJCQkJTUNJX01TRl9GUkFNRShtY2lfc3RhdHVzLmR3UmV0dXJuKSk7Ci0JCQkJLyogY29tcHV0ZSBsZWFkLW91dCBvZmZzZXQgKi8KLQkJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gY2Ryb20tPnRyYWNrW2kgLSAxXS5vZmZzZXQgKwotCQkJCQljZHJvbS0+dHJhY2tbaSAtIDFdLmxlbmd0aDsKLQkJCQljZHJvbS0+dHJhY2tbaV0ubGVuZ3RoID0gMDsKLQkJCQlva2F5ID0gMTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4ob2theSA/IDAgOiAtMSk7Ci19Ci0KLS8qIEdldCBDRC1ST00gc3RhdHVzICovCi1zdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKQotewotCUNEc3RhdHVzIHN0YXR1czsKLQlNQ0lfU1RBVFVTX1BBUk1TIG1jaV9zdGF0dXM7Ci0JRFdPUkQgZmxhZ3M7Ci0KLQlmbGFncyA9IE1DSV9TVEFUVVNfSVRFTSB8IE1DSV9XQUlUOwotCW1jaV9zdGF0dXMuZHdJdGVtID0gTUNJX1NUQVRVU19NT0RFOwotCWlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1NUQVRVUywgZmxhZ3MsICZtY2lfc3RhdHVzKSA8IDAgKSB7Ci0JCXN0YXR1cyA9IENEX0VSUk9SOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAobWNpX3N0YXR1cy5kd1JldHVybikgewotCQkJY2FzZSBNQ0lfTU9ERV9OT1RfUkVBRFk6Ci0JCQljYXNlIE1DSV9NT0RFX09QRU46Ci0JCQkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNQ0lfTU9ERV9TVE9QOgotI2lmZGVmIEJST0tFTl9NQ0lfUEFVU0UKLQkJCQlpZiAoIFNETF9wYXVzZWRbY2Ryb20tPmlkXSApIHsKLQkJCQkJc3RhdHVzID0gQ0RfUEFVU0VEOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7Ci0JCQkJfQotI2Vsc2UKLQkJCQlzdGF0dXMgPSBDRF9TVE9QUEVEOwotI2VuZGlmIC8qIEJST0tFTl9NQ0lfUEFVU0UgKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgTUNJX01PREVfUExBWToKLSNpZmRlZiBCUk9LRU5fTUNJX1BBVVNFCi0JCQkJaWYgKCBTRExfcGF1c2VkW2Nkcm9tLT5pZF0gKSB7Ci0JCQkJCXN0YXR1cyA9IENEX1BBVVNFRDsKLQkJCQl9IGVsc2UgewotCQkJCQlzdGF0dXMgPSBDRF9QTEFZSU5HOwotCQkJCX0KLSNlbHNlCi0JCQkJc3RhdHVzID0gQ0RfUExBWUlORzsKLSNlbmRpZiAvKiBCUk9LRU5fTUNJX1BBVVNFICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE1DSV9NT0RFX1BBVVNFOgotCQkJCXN0YXR1cyA9IENEX1BBVVNFRDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RhdHVzID0gQ0RfRVJST1I7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCBwb3NpdGlvbiApIHsKLQkJaWYgKCBzdGF0dXMgPT0gQ0RfUExBWUlORyB8fCAoc3RhdHVzID09IENEX1BBVVNFRCkgKSB7Ci0JCQltY2lfc3RhdHVzLmR3SXRlbSA9IE1DSV9TVEFUVVNfUE9TSVRJT047Ci0JCQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9TVEFUVVMsIGZsYWdzLAotCQkJCQkJCSZtY2lfc3RhdHVzKSA9PSAwICkgewotCQkJCSpwb3NpdGlvbiA9IE1TRl9UT19GUkFNRVMoCi0JCQkJCU1DSV9NU0ZfTUlOVVRFKG1jaV9zdGF0dXMuZHdSZXR1cm4pLAotCQkJCQlNQ0lfTVNGX1NFQ09ORChtY2lfc3RhdHVzLmR3UmV0dXJuKSwKLQkJCQkJTUNJX01TRl9GUkFNRShtY2lfc3RhdHVzLmR3UmV0dXJuKSk7Ci0JCQl9IGVsc2UgewotCQkJCSpwb3NpdGlvbiA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkqcG9zaXRpb24gPSAwOwotCQl9Ci0JfQotCXJldHVybihzdGF0dXMpOwotfQotCi0vKiBTdGFydCBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLXsKLQlNQ0lfUExBWV9QQVJNUyBtY2lfcGxheTsKLQlpbnQgbSwgcywgZjsKLQlEV09SRCBmbGFnczsKLQotCWZsYWdzID0gTUNJX0ZST00gfCBNQ0lfVE8gfCBNQ0lfTk9USUZZOwotCW1jaV9wbGF5LmR3Q2FsbGJhY2sgPSAwOwotCUZSQU1FU19UT19NU0Yoc3RhcnQsICZtLCAmcywgJmYpOwotCW1jaV9wbGF5LmR3RnJvbSA9IE1DSV9NQUtFX01TRihtLCBzLCBmKTsKLQlGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwgJm0sICZzLCAmZik7Ci0JbWNpX3BsYXkuZHdUbyA9IE1DSV9NQUtFX01TRihtLCBzLCBmKTsKLQlTRExfQ0RfZW5kX3Bvc2l0aW9uID0gbWNpX3BsYXkuZHdUbzsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1BMQVksIGZsYWdzLCAmbWNpX3BsYXkpKTsKLX0KLQotLyogUGF1c2UgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKLXsKLSNpZmRlZiBCUk9LRU5fTUNJX1BBVVNFCi0JU0RMX3BhdXNlZFtjZHJvbS0+aWRdID0gMTsKLSNlbmRpZgotCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBNQ0lfUEFVU0UsIE1DSV9XQUlULCBOVUxMKSk7Ci19Ci0KLS8qIFJlc3VtZSBwbGF5ICovCi1zdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKLXsKLSNpZmRlZiBCUk9LRU5fTUNJX1BBVVNFCi0JTUNJX1NUQVRVU19QQVJNUyBtY2lfc3RhdHVzOwotCWludCBva2F5OwotCWludCBmbGFnczsKLQotCW9rYXkgPSAwOwotCS8qIFBsYXkgZnJvbSB0aGUgY3VycmVudCBwbGF5IHBvc2l0aW9uIHRvIHRoZSBlbmQgcG9zaXRpb24gc2V0IGVhcmxpZXIgKi8KLQlmbGFncyA9IE1DSV9TVEFUVVNfSVRFTSB8IE1DSV9XQUlUOwotCW1jaV9zdGF0dXMuZHdJdGVtID0gTUNJX1NUQVRVU19QT1NJVElPTjsKLQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9TVEFUVVMsIGZsYWdzLCAmbWNpX3N0YXR1cykgPT0gMCApIHsKLQkJTUNJX1BMQVlfUEFSTVMgbWNpX3BsYXk7Ci0KLQkJZmxhZ3MgPSBNQ0lfRlJPTSB8IE1DSV9UTyB8IE1DSV9OT1RJRlk7Ci0JCW1jaV9wbGF5LmR3Q2FsbGJhY2sgPSAwOwotCQltY2lfcGxheS5kd0Zyb20gPSBtY2lfc3RhdHVzLmR3UmV0dXJuOwotCQltY2lfcGxheS5kd1RvID0gU0RMX0NEX2VuZF9wb3NpdGlvbjsKLQkJaWYgKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsTUNJX1BMQVksZmxhZ3MsJm1jaV9wbGF5KSA9PSAwKSB7Ci0JCQlva2F5ID0gMTsKLQkJCVNETF9wYXVzZWRbY2Ryb20tPmlkXSA9IDA7Ci0JCX0KLQl9Ci0JcmV0dXJuKG9rYXkgPyAwIDogLTEpOwotI2Vsc2UKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1JFU1VNRSwgTUNJX1dBSVQsIE5VTEwpKTsKLSNlbmRpZiAvKiBCUk9LRU5fTUNJX1BBVVNFICovCi19Ci0KLS8qIFN0b3AgcGxheSAqLwotc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQotewotCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBNQ0lfU1RPUCwgTUNJX1dBSVQsIE5VTEwpKTsKLX0KLQotLyogRWplY3QgdGhlIENELVJPTSAqLwotc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKLXsKLQlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1NFVCwgTUNJX1NFVF9ET09SX09QRU4sIE5VTEwpKTsKLX0KLQotLyogQ2xvc2UgdGhlIENELVJPTSBoYW5kbGUgKi8KLXN0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKQotewotCVNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9DTE9TRSwgTUNJX1dBSVQsIE5VTEwpOwotfQotCi12b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIFNETF9udW1jZHMgPiAwICkgewotCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgewotCQkJU0RMX2ZyZWUoU0RMX2NkbGlzdFtpXSk7Ci0JCX0KLQkJU0RMX251bWNkcyA9IDA7Ci0JfQotfQotCi0jZW5kaWYgLyogU0RMX0NEUk9NX1dJTjMyICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2NwdWluZm8vU0RMX2NwdWluZm8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY3B1aW5mby9TRExfY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM5ODdlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY3B1aW5mby9TRExfY3B1aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBDUFUgZmVhdHVyZSBkZXRlY3Rpb24gZm9yIFNETCAqLwotCi0jaW5jbHVkZSAiU0RMLmgiCi0jaW5jbHVkZSAiU0RMX2NwdWluZm8uaCIKLQotI2lmIGRlZmluZWQoX19NQUNPU1hfXykgJiYgZGVmaW5lZChfX3BwY19fKQotI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4gLyogRm9yIEFsdGlWZWMgY2hlY2sgKi8KLSNlbGlmIFNETF9BTFRJVkVDX0JMSVRURVJTICYmIEhBVkVfU0VUSk1QCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBDUFVfSEFTX1JEVFNDCTB4MDAwMDAwMDEKLSNkZWZpbmUgQ1BVX0hBU19NTVgJMHgwMDAwMDAwMgotI2RlZmluZSBDUFVfSEFTX01NWEVYVAkweDAwMDAwMDA0Ci0jZGVmaW5lIENQVV9IQVNfM0ROT1cJMHgwMDAwMDAxMAotI2RlZmluZSBDUFVfSEFTXzNETk9XRVhUIDB4MDAwMDAwMjAKLSNkZWZpbmUgQ1BVX0hBU19TU0UJMHgwMDAwMDA0MAotI2RlZmluZSBDUFVfSEFTX1NTRTIJMHgwMDAwMDA4MAotI2RlZmluZSBDUFVfSEFTX0FMVElWRUMJMHgwMDAwMDEwMAotCi0jaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMgJiYgSEFWRV9TRVRKTVAgJiYgIV9fTUFDT1NYX18KLS8qIFRoaXMgaXMgdGhlIGJydXRlIGZvcmNlIHdheSBvZiBkZXRlY3RpbmcgaW5zdHJ1Y3Rpb24gc2V0cy4uLgotICAgdGhlIGlkZWEgaXMgYm9ycm93ZWQgZnJvbSB0aGUgbGlibXBlZzIgbGlicmFyeSAtIHRoYW5rcyEKLSAqLwotc3RhdGljIGptcF9idWYgam1wYnVmOwotc3RhdGljIHZvaWQgaWxsZWdhbF9pbnN0cnVjdGlvbihpbnQgc2lnKQotewotCWxvbmdqbXAoam1wYnVmLCAxKTsKLX0KLSNlbmRpZiAvKiBIQVZFX1NFVEpNUCAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgQ1BVX2hhdmVDUFVJRCh2b2lkKQotewotCWludCBoYXNfQ1BVSUQgPSAwOwotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoaTM4NikKLQlfX2FzbV9fICgKLSIgICAgICAgIHB1c2hmbCAgICAgICAgICAgICAgICAgICAgICAjIEdldCBvcmlnaW5hbCBFRkxBR1MgICAgICAgICAgICAgXG4iCi0iICAgICAgICBwb3BsICAgICUlZWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgIHhvcmwgICAgJDB4MjAwMDAwLCUlZWF4ICAgICAjIEZsaXAgSUQgYml0IGluIEVGTEFHUyAgICAgICAgICAgXG4iCi0iICAgICAgICBwdXNobCAgICUlZWF4ICAgICAgICAgICAgICAgIyBTYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sgIFxuIgotIiAgICAgICAgcG9wZmwgICAgICAgICAgICAgICAgICAgICAgICMgUmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZSAgICBcbiIKLSIgICAgICAgIHB1c2hmbCAgICAgICAgICAgICAgICAgICAgICAjIEdldCBuZXcgRUZMQUdTICAgICAgICAgICAgICAgICAgXG4iCi0iICAgICAgICBwb3BsICAgICUlZWF4ICAgICAgICAgICAgICAgIyBTdG9yZSBuZXcgRUZMQUdTIGluIEVBWCAgICAgICAgIFxuIgotIiAgICAgICAgeG9ybCAgICAlJWVjeCwlJWVheCAgICAgICAgICMgQ2FuIG5vdCB0b2dnbGUgSUQgYml0LCAgICAgICAgICBcbiIKLSIgICAgICAgIGp6ICAgICAgMWYgICAgICAgICAgICAgICAgICAjIFByb2Nlc3Nvcj04MDQ4NiAgICAgICAgICAgICAgICAgXG4iCi0iICAgICAgICBtb3ZsICAgICQxLCUwICAgICAgICAgICAgICAgIyBXZSBoYXZlIENQVUlEIHN1cHBvcnQgICAgICAgICAgIFxuIgotIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQk6ICI9bSIgKGhhc19DUFVJRCkKLQk6Ci0JOiAiJWVheCIsICIlZWN4IgotCSk7Ci0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9feDg2XzY0X18pCi0vKiBUZWNobmljYWxseSwgaWYgdGhpcyBpcyBiZWluZyBjb21waWxlZCB1bmRlciBfX3g4Nl82NF9fIHRoZW4gaXQgaGFzIAotQ1BVaWQgYnkgZGVmaW5pdGlvbi4gIEJ1dCBpdCdzIG5pY2UgdG8gYmUgYWJsZSB0byBwcm92ZSBpdC4gIDopICAgICAgKi8KLQlfX2FzbV9fICgKLSIgICAgICAgIHB1c2hmcSAgICAgICAgICAgICAgICAgICAgICAjIEdldCBvcmlnaW5hbCBFRkxBR1MgICAgICAgICAgICAgXG4iCi0iICAgICAgICBwb3BxICAgICUlcmF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotIiAgICAgICAgbW92cSAgICAlJXJheCwlJXJjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgIHhvcmwgICAgJDB4MjAwMDAwLCUlZWF4ICAgICAjIEZsaXAgSUQgYml0IGluIEVGTEFHUyAgICAgICAgICAgXG4iCi0iICAgICAgICBwdXNocSAgICUlcmF4ICAgICAgICAgICAgICAgIyBTYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sgIFxuIgotIiAgICAgICAgcG9wZnEgICAgICAgICAgICAgICAgICAgICAgICMgUmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZSAgICBcbiIKLSIgICAgICAgIHB1c2hmcSAgICAgICAgICAgICAgICAgICAgICAjIEdldCBuZXcgRUZMQUdTICAgICAgICAgICAgICAgICAgXG4iCi0iICAgICAgICBwb3BxICAgICUlcmF4ICAgICAgICAgICAgICAgIyBTdG9yZSBuZXcgRUZMQUdTIGluIEVBWCAgICAgICAgIFxuIgotIiAgICAgICAgeG9ybCAgICAlJWVjeCwlJWVheCAgICAgICAgICMgQ2FuIG5vdCB0b2dnbGUgSUQgYml0LCAgICAgICAgICBcbiIKLSIgICAgICAgIGp6ICAgICAgMWYgICAgICAgICAgICAgICAgICAjIFByb2Nlc3Nvcj04MDQ4NiAgICAgICAgICAgICAgICAgXG4iCi0iICAgICAgICBtb3ZsICAgICQxLCUwICAgICAgICAgICAgICAgIyBXZSBoYXZlIENQVUlEIHN1cHBvcnQgICAgICAgICAgIFxuIgotIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQk6ICI9bSIgKGhhc19DUFVJRCkKLQk6Ci0JOiAiJXJheCIsICIlcmN4IgotCSk7Ci0jZWxpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KSkgfHwgZGVmaW5lZChfX1dBVENPTUNfXykKLQlfX2FzbSB7Ci0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBvcmlnaW5hbCBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgbW92ICAgICBlY3gsIGVheAotICAgICAgICB4b3IgICAgIGVheCwgMjAwMDAwaCAgICAgICAgOyBGbGlwIElEIGJpdCBpbiBFRkxBR1MKLSAgICAgICAgcHVzaCAgICBlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrCi0gICAgICAgIHBvcGZkICAgICAgICAgICAgICAgICAgICAgICA7IFJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG5ldyBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgU3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKLSAgICAgICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgICAgIDsgQ2FuIG5vdCB0b2dnbGUgSUQgYml0LAotICAgICAgICBqeiAgICAgIGRvbmUgICAgICAgICAgICAgICAgOyBQcm9jZXNzb3I9ODA0ODYKLSAgICAgICAgbW92ICAgICBoYXNfQ1BVSUQsMSAgICAgICAgIDsgV2UgaGF2ZSBDUFVJRCBzdXBwb3J0Ci1kb25lOgotCX0KLSNlbGlmIGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19pMzg2KQotCV9fYXNtICgKLSIgICAgICAgcHVzaGZsICAgICAgICAgICAgICAgICBcbiIKLSIJcG9wbCAgICAlZWF4ICAgICAgICAgICBcbiIKLSIJbW92bCAgICAlZWF4LCVlY3ggICAgICBcbiIKLSIJeG9ybCAgICAkMHgyMDAwMDAsJWVheCBcbiIKLSIJcHVzaGwgICAlZWF4ICAgICAgICAgICBcbiIKLSIJcG9wZmwgICAgICAgICAgICAgICAgICBcbiIKLSIJcHVzaGZsICAgICAgICAgICAgICAgICBcbiIKLSIJcG9wbCAgICAlZWF4ICAgICAgICAgICBcbiIKLSIJeG9ybCAgICAlZWN4LCVlYXggICAgICBcbiIKLSIJanogICAgICAxZiAgICAgICAgICAgICBcbiIKLSIJbW92bCAgICAkMSwtOCglZWJwKSAgICBcbiIKLSIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQkpOwotI2VsaWYgZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX2FtZDY0KQotCV9fYXNtICgKLSIgICAgICAgcHVzaGZxICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgcG9wcSAgICAlcmF4ICAgICAgICAgICBcbiIKLSIgICAgICAgbW92cSAgICAlcmF4LCVyY3ggICAgICBcbiIKLSIgICAgICAgeG9ybCAgICAkMHgyMDAwMDAsJWVheCBcbiIKLSIgICAgICAgcHVzaHEgICAlcmF4ICAgICAgICAgICBcbiIKLSIgICAgICAgcG9wZnEgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgcHVzaGZxICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgcG9wcSAgICAlcmF4ICAgICAgICAgICBcbiIKLSIgICAgICAgeG9ybCAgICAlZWN4LCVlYXggICAgICBcbiIKLSIgICAgICAganogICAgICAxZiAgICAgICAgICAgICBcbiIKLSIgICAgICAgbW92bCAgICAkMSwtOCglcmJwKSAgICBcbiIKLSIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQkpOwotI2VuZGlmCi0JcmV0dXJuIGhhc19DUFVJRDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IENQVV9nZXRDUFVJREZlYXR1cmVzKHZvaWQpCi17Ci0JaW50IGZlYXR1cmVzID0gMDsKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSApCi0JX19hc21fXyAoCi0iICAgICAgICBtb3ZsICAgICUlZWJ4LCUlZWRpXG4iCi0iICAgICAgICB4b3JsICAgICUlZWF4LCUlZWF4ICAgICAgICAgIyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uICAgIFxuIgotIiAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAgICMgR2V0IGFuZCBzYXZlIHZlbmRvciBJRCAgICAgICAgICBcbiIKLSIgICAgICAgIGNtcGwgICAgJDEsJSVlYXggICAgICAgICAgICAjIE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRFxuIgotIiAgICAgICAgamwgICAgICAxZiAgICAgICAgICAgICAgICAgICMgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvblxuIgotIiAgICAgICAgeG9ybCAgICAlJWVheCwlJWVheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgIGluY2wgICAgJSVlYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0iICAgICAgICBjcHVpZCAgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgZmFtaWx5L21vZGVsL3N0ZXBwaW5nL2ZlYXR1cmVzXG4iCi0iICAgICAgICBtb3ZsICAgICUlZWR4LCUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlZGksJSVlYnhcbiIKLQk6ICI9bSIgKGZlYXR1cmVzKQotCToKLQk6ICIlZWF4IiwgIiVlY3giLCAiJWVkeCIsICIlZWRpIgotCSk7Ci0jZWxpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KSkgfHwgZGVmaW5lZChfX1dBVENPTUNfXykKLQlfX2FzbSB7Ci0gICAgICAgIHhvciAgICAgZWF4LCBlYXggICAgICAgICAgICA7IFNldCB1cCBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGFuZCBzYXZlIHZlbmRvciBJRAotICAgICAgICBjbXAgICAgIGVheCwgMSAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgMSBpcyB2YWxpZCBpbnB1dCBmb3IgQ1BVSUQKLSAgICAgICAgamwgICAgICBkb25lICAgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICB4b3IgICAgIGVheCwgZWF4Ci0gICAgICAgIGluYyAgICAgZWF4Ci0gICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICAgICA7IEdldCBmYW1pbHkvbW9kZWwvc3RlcHBpbmcvZmVhdHVyZXMKLSAgICAgICAgbW92ICAgICBmZWF0dXJlcywgZWR4Ci1kb25lOgotCX0KLSNlbGlmIGRlZmluZWQoX19zdW4pICYmIChkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2FtZDY0KSkKLQkgICAgX19hc20oCi0iICAgICAgICBtb3ZsICAgICVlYngsJWVkaVxuIgotIiAgICAgICAgeG9ybCAgICAlZWF4LCVlYXggICAgICAgICBcbiIKLSIgICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICAgXG4iCi0iICAgICAgICBjbXBsICAgICQxLCVlYXggICAgICAgICAgIFxuIgotIiAgICAgICAgamwgICAgICAxZiAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgIHhvcmwgICAgJWVheCwlZWF4ICAgICAgICAgXG4iCi0iICAgICAgICBpbmNsICAgICVlYXggICAgICAgICAgICAgIFxuIgotIiAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICBcbiIKLSNpZmRlZiBfX2kzODYKLSIgICAgICAgIG1vdmwgICAgJWVkeCwtOCglZWJwKSAgICAgXG4iCi0jZWxzZQotIiAgICAgICAgbW92bCAgICAlZWR4LC04KCVyYnApICAgICBcbiIKLSNlbmRpZgotIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgIG1vdmwgICAgJWVkaSwlZWJ4XG4iICk7Ci0jZW5kaWYKLQlyZXR1cm4gZmVhdHVyZXM7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBDUFVfZ2V0Q1BVSURGZWF0dXJlc0V4dCh2b2lkKQotewotCWludCBmZWF0dXJlcyA9IDA7Ci0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZCAoX194ODZfNjRfXykgKQotCV9fYXNtX18gKAotIiAgICAgICAgbW92bCAgICAlJWVieCwlJWVkaVxuIgotIiAgICAgICAgbW92bCAgICAkMHg4MDAwMDAwMCwlJWVheCAgICMgUXVlcnkgZm9yIGV4dGVuZGVkIGZ1bmN0aW9ucyAgICBcbiIKLSIgICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICAgICAjIEdldCBleHRlbmRlZCBmdW5jdGlvbiBsaW1pdCAgICAgXG4iCi0iICAgICAgICBjbXBsICAgICQweDgwMDAwMDAxLCUlZWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotIiAgICAgICAgamwgICAgICAxZiAgICAgICAgICAgICAgICAgICMgTm9wZSwgd2UgZG9udCBoYXZlIGZ1bmN0aW9uIDgwMDAwMDAwMWhcbiIKLSIgICAgICAgIG1vdmwgICAgJDB4ODAwMDAwMDEsJSVlYXggICAjIFNldHVwIGV4dGVuZGVkIGZ1bmN0aW9uIDgwMDAwMDAwMWhcbiIKLSIgICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCBnZXQgdGhlIGluZm9ybWF0aW9uICAgICAgICAgXG4iCi0iICAgICAgICBtb3ZsICAgICUlZWR4LCUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlZGksJSVlYnhcbiIKLQk6ICI9bSIgKGZlYXR1cmVzKQotCToKLQk6ICIlZWF4IiwgIiVlY3giLCAiJWVkeCIsICIlZWRpIgotCSk7Ci0jZWxpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KSkgfHwgZGVmaW5lZChfX1dBVENPTUNfXykKLQlfX2FzbSB7Ci0gICAgICAgIG1vdiAgICAgZWF4LDgwMDAwMDAwaCAgICAgICA7IFF1ZXJ5IGZvciBleHRlbmRlZCBmdW5jdGlvbnMKLSAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGV4dGVuZGVkIGZ1bmN0aW9uIGxpbWl0Ci0gICAgICAgIGNtcCAgICAgZWF4LDgwMDAwMDAxaAotICAgICAgICBqbCAgICAgIGRvbmUgICAgICAgICAgICAgICAgOyBOb3BlLCB3ZSBkb250IGhhdmUgZnVuY3Rpb24gODAwMDAwMDAxaAotICAgICAgICBtb3YgICAgIGVheCw4MDAwMDAwMWggICAgICAgOyBTZXR1cCBleHRlbmRlZCBmdW5jdGlvbiA4MDAwMDAwMDFoCi0gICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICAgICA7IGFuZCBnZXQgdGhlIGluZm9ybWF0aW9uCi0gICAgICAgIG1vdiAgICAgZmVhdHVyZXMsZWR4Ci1kb25lOgotCX0KLSNlbGlmIGRlZmluZWQoX19zdW4pICYmICggZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19hbWQ2NCkgKQotCSAgICBfX2FzbSAoCi0iICAgICAgICBtb3ZsICAgICVlYngsJWVkaVxuIgotIiAgICAgICAgbW92bCAgICAkMHg4MDAwMDAwMCwlZWF4IFxuIgotIiAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgIFxuIgotIiAgICAgICAgY21wbCAgICAkMHg4MDAwMDAwMSwlZWF4IFxuIgotIiAgICAgICAgamwgICAgICAxZiAgICAgICAgICAgICAgIFxuIgotIiAgICAgICAgbW92bCAgICAkMHg4MDAwMDAwMSwlZWF4IFxuIgotIiAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgIFxuIgotI2lmZGVmIF9faTM4NgotIiAgICAgICAgbW92bCAgICAlZWR4LC04KCVlYnApICAgXG4iCi0jZWxzZQotIiAgICAgICAgbW92bCAgICAlZWR4LC04KCVyYnApICAgXG4iCi0jZW5kaWYKLSIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgICAgICAgIG1vdmwgICAgJWVkaSwlZWJ4XG4iCi0JICAgICk7Ci0jZW5kaWYKLQlyZXR1cm4gZmVhdHVyZXM7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBDUFVfaGF2ZVJEVFNDKHZvaWQpCi17Ci0JaWYgKCBDUFVfaGF2ZUNQVUlEKCkgKSB7Ci0JCXJldHVybiAoQ1BVX2dldENQVUlERmVhdHVyZXMoKSAmIDB4MDAwMDAwMTApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IENQVV9oYXZlTU1YKHZvaWQpCi17Ci0JaWYgKCBDUFVfaGF2ZUNQVUlEKCkgKSB7Ci0JCXJldHVybiAoQ1BVX2dldENQVUlERmVhdHVyZXMoKSAmIDB4MDA4MDAwMDApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IENQVV9oYXZlTU1YRXh0KHZvaWQpCi17Ci0JaWYgKCBDUFVfaGF2ZUNQVUlEKCkgKSB7Ci0JCXJldHVybiAoQ1BVX2dldENQVUlERmVhdHVyZXNFeHQoKSAmIDB4MDA0MDAwMDApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IENQVV9oYXZlM0ROb3codm9pZCkKLXsKLQlpZiAoIENQVV9oYXZlQ1BVSUQoKSApIHsKLQkJcmV0dXJuIChDUFVfZ2V0Q1BVSURGZWF0dXJlc0V4dCgpICYgMHg4MDAwMDAwMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgQ1BVX2hhdmUzRE5vd0V4dCh2b2lkKQotewotCWlmICggQ1BVX2hhdmVDUFVJRCgpICkgewotCQlyZXR1cm4gKENQVV9nZXRDUFVJREZlYXR1cmVzRXh0KCkgJiAweDQwMDAwMDAwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBDUFVfaGF2ZVNTRSh2b2lkKQotewotCWlmICggQ1BVX2hhdmVDUFVJRCgpICkgewotCQlyZXR1cm4gKENQVV9nZXRDUFVJREZlYXR1cmVzKCkgJiAweDAyMDAwMDAwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBDUFVfaGF2ZVNTRTIodm9pZCkKLXsKLQlpZiAoIENQVV9oYXZlQ1BVSUQoKSApIHsKLQkJcmV0dXJuIChDUFVfZ2V0Q1BVSURGZWF0dXJlcygpICYgMHgwNDAwMDAwMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgQ1BVX2hhdmVBbHRpVmVjKHZvaWQpCi17Ci0Jdm9sYXRpbGUgaW50IGFsdGl2ZWMgPSAwOwotI2lmIGRlZmluZWQoX19NQUNPU1hfXykgJiYgZGVmaW5lZChfX3BwY19fKQotCWludCBzZWxlY3RvcnNbMl0gPSB7IENUTF9IVywgSFdfVkVDVE9SVU5JVCB9OyAKLQlpbnQgaGFzVmVjdG9yVW5pdCA9IDA7IAotCXNpemVfdCBsZW5ndGggPSBzaXplb2YoaGFzVmVjdG9yVW5pdCk7IAotCWludCBlcnJvciA9IHN5c2N0bChzZWxlY3RvcnMsIDIsICZoYXNWZWN0b3JVbml0LCAmbGVuZ3RoLCBOVUxMLCAwKTsgCi0JaWYoIDAgPT0gZXJyb3IgKQotCQlhbHRpdmVjID0gKGhhc1ZlY3RvclVuaXQgIT0gMCk7IAotI2VsaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMgJiYgSEFWRV9TRVRKTVAKLQl2b2lkICgqaGFuZGxlcikoaW50IHNpZyk7Ci0JaGFuZGxlciA9IHNpZ25hbChTSUdJTEwsIGlsbGVnYWxfaW5zdHJ1Y3Rpb24pOwotCWlmICggc2V0am1wKGptcGJ1ZikgPT0gMCApIHsKLQkJYXNtIHZvbGF0aWxlICgibXRzcHIgMjU2LCAlMFxuXHQiCi0JCQkgICAgICAidmFuZCAlJXYwLCAlJXYwLCAlJXYwIgotCQkJICAgICAgOgotCQkJICAgICAgOiAiciIgKC0xKSk7Ci0JCWFsdGl2ZWMgPSAxOwotCX0KLQlzaWduYWwoU0lHSUxMLCBoYW5kbGVyKTsKLSNlbmRpZgotCXJldHVybiBhbHRpdmVjOyAKLX0KLQotc3RhdGljIFVpbnQzMiBTRExfQ1BVRmVhdHVyZXMgPSAweEZGRkZGRkZGOwotCi1zdGF0aWMgVWludDMyIFNETF9HZXRDUFVGZWF0dXJlcyh2b2lkKQotewotCWlmICggU0RMX0NQVUZlYXR1cmVzID09IDB4RkZGRkZGRkYgKSB7Ci0JCVNETF9DUFVGZWF0dXJlcyA9IDA7Ci0JCWlmICggQ1BVX2hhdmVSRFRTQygpICkgewotCQkJU0RMX0NQVUZlYXR1cmVzIHw9IENQVV9IQVNfUkRUU0M7Ci0JCX0KLQkJaWYgKCBDUFVfaGF2ZU1NWCgpICkgewotCQkJU0RMX0NQVUZlYXR1cmVzIHw9IENQVV9IQVNfTU1YOwotCQl9Ci0JCWlmICggQ1BVX2hhdmVNTVhFeHQoKSApIHsKLQkJCVNETF9DUFVGZWF0dXJlcyB8PSBDUFVfSEFTX01NWEVYVDsKLQkJfQotCQlpZiAoIENQVV9oYXZlM0ROb3coKSApIHsKLQkJCVNETF9DUFVGZWF0dXJlcyB8PSBDUFVfSEFTXzNETk9XOwotCQl9Ci0JCWlmICggQ1BVX2hhdmUzRE5vd0V4dCgpICkgewotCQkJU0RMX0NQVUZlYXR1cmVzIHw9IENQVV9IQVNfM0ROT1dFWFQ7Ci0JCX0KLQkJaWYgKCBDUFVfaGF2ZVNTRSgpICkgewotCQkJU0RMX0NQVUZlYXR1cmVzIHw9IENQVV9IQVNfU1NFOwotCQl9Ci0JCWlmICggQ1BVX2hhdmVTU0UyKCkgKSB7Ci0JCQlTRExfQ1BVRmVhdHVyZXMgfD0gQ1BVX0hBU19TU0UyOwotCQl9Ci0JCWlmICggQ1BVX2hhdmVBbHRpVmVjKCkgKSB7Ci0JCQlTRExfQ1BVRmVhdHVyZXMgfD0gQ1BVX0hBU19BTFRJVkVDOwotCQl9Ci0JfQotCXJldHVybiBTRExfQ1BVRmVhdHVyZXM7Ci19Ci0KLVNETF9ib29sIFNETF9IYXNSRFRTQyh2b2lkKQotewotCWlmICggU0RMX0dldENQVUZlYXR1cmVzKCkgJiBDUFVfSEFTX1JEVFNDICkgewotCQlyZXR1cm4gU0RMX1RSVUU7Ci0JfQotCXJldHVybiBTRExfRkFMU0U7Ci19Ci0KLVNETF9ib29sIFNETF9IYXNNTVgodm9pZCkKLXsKLQlpZiAoIFNETF9HZXRDUFVGZWF0dXJlcygpICYgQ1BVX0hBU19NTVggKSB7Ci0JCXJldHVybiBTRExfVFJVRTsKLQl9Ci0JcmV0dXJuIFNETF9GQUxTRTsKLX0KLQotU0RMX2Jvb2wgU0RMX0hhc01NWEV4dCh2b2lkKQotewotCWlmICggU0RMX0dldENQVUZlYXR1cmVzKCkgJiBDUFVfSEFTX01NWEVYVCApIHsKLQkJcmV0dXJuIFNETF9UUlVFOwotCX0KLQlyZXR1cm4gU0RMX0ZBTFNFOwotfQotCi1TRExfYm9vbCBTRExfSGFzM0ROb3codm9pZCkKLXsKLQlpZiAoIFNETF9HZXRDUFVGZWF0dXJlcygpICYgQ1BVX0hBU18zRE5PVyApIHsKLQkJcmV0dXJuIFNETF9UUlVFOwotCX0KLQlyZXR1cm4gU0RMX0ZBTFNFOwotfQotCi1TRExfYm9vbCBTRExfSGFzM0ROb3dFeHQodm9pZCkKLXsKLQlpZiAoIFNETF9HZXRDUFVGZWF0dXJlcygpICYgQ1BVX0hBU18zRE5PV0VYVCApIHsKLQkJcmV0dXJuIFNETF9UUlVFOwotCX0KLQlyZXR1cm4gU0RMX0ZBTFNFOwotfQotCi1TRExfYm9vbCBTRExfSGFzU1NFKHZvaWQpCi17Ci0JaWYgKCBTRExfR2V0Q1BVRmVhdHVyZXMoKSAmIENQVV9IQVNfU1NFICkgewotCQlyZXR1cm4gU0RMX1RSVUU7Ci0JfQotCXJldHVybiBTRExfRkFMU0U7Ci19Ci0KLVNETF9ib29sIFNETF9IYXNTU0UyKHZvaWQpCi17Ci0JaWYgKCBTRExfR2V0Q1BVRmVhdHVyZXMoKSAmIENQVV9IQVNfU1NFMiApIHsKLQkJcmV0dXJuIFNETF9UUlVFOwotCX0KLQlyZXR1cm4gU0RMX0ZBTFNFOwotfQotCi1TRExfYm9vbCBTRExfSGFzQWx0aVZlYyh2b2lkKQotewotCWlmICggU0RMX0dldENQVUZlYXR1cmVzKCkgJiBDUFVfSEFTX0FMVElWRUMgKSB7Ci0JCXJldHVybiBTRExfVFJVRTsKLQl9Ci0JcmV0dXJuIFNETF9GQUxTRTsKLX0KLQotI2lmZGVmIFRFU1RfTUFJTgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IG1haW4oKQotewotCXByaW50ZigiUkRUU0M6ICVkXG4iLCBTRExfSGFzUkRUU0MoKSk7Ci0JcHJpbnRmKCJNTVg6ICVkXG4iLCBTRExfSGFzTU1YKCkpOwotCXByaW50ZigiTU1YRXh0OiAlZFxuIiwgU0RMX0hhc01NWEV4dCgpKTsKLQlwcmludGYoIjNETm93OiAlZFxuIiwgU0RMX0hhczNETm93KCkpOwotCXByaW50ZigiM0ROb3dFeHQ6ICVkXG4iLCBTRExfSGFzM0ROb3dFeHQoKSk7Ci0JcHJpbnRmKCJTU0U6ICVkXG4iLCBTRExfSGFzU1NFKCkpOwotCXByaW50ZigiU1NFMjogJWRcbiIsIFNETF9IYXNTU0UyKCkpOwotCXByaW50ZigiQWx0aVZlYzogJWRcbiIsIFNETF9IYXNBbHRpVmVjKCkpOwotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogVEVTVF9NQUlOICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfYWN0aXZlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfYWN0aXZlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YjU5MDguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX2FjdGl2ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFwcGxpY2F0aW9uIGZvY3VzL2ljb25pZmljYXRpb24gaGFuZGxpbmcgY29kZSBmb3IgU0RMICovCi0KLSNpbmNsdWRlICJTRExfZXZlbnRzLmgiCi0jaW5jbHVkZSAiU0RMX2V2ZW50c19jLmgiCi0KLQotLyogVGhlc2UgYXJlIHN0YXRpYyBmb3Igb3VyIGFjdGl2ZSBldmVudCBoYW5kbGluZyBjb2RlICovCi1zdGF0aWMgVWludDggU0RMX2FwcHN0YXRlID0gMDsKLQotLyogUHVibGljIGZ1bmN0aW9ucyAqLwotaW50IFNETF9BcHBBY3RpdmVJbml0KHZvaWQpCi17Ci0JLyogU3RhcnQgY29tcGxldGVseSBhY3RpdmUgKi8KLQlTRExfYXBwc3RhdGUgPSAoU0RMX0FQUEFDVElWRXxTRExfQVBQSU5QVVRGT0NVU3xTRExfQVBQTU9VU0VGT0NVUyk7Ci0KLQkvKiBUaGF0J3MgaXQhICovCi0JcmV0dXJuKDApOwotfQotdm9pZCBTRExfQXBwQWN0aXZlUXVpdCh2b2lkKQotewotfQotCi1VaW50OCBTRExfR2V0QXBwU3RhdGUodm9pZCkKLXsKLQlyZXR1cm4oU0RMX2FwcHN0YXRlKTsKLX0KLQotLyogVGhpcyBpcyBnbG9iYWwgZm9yIFNETF9ldmVudGxvb3AuYyAqLwotaW50IFNETF9Qcml2YXRlQXBwQWN0aXZlKFVpbnQ4IGdhaW4sIFVpbnQ4IHN0YXRlKQotewotCWludCBwb3N0ZWQ7Ci0JVWludDggbmV3X3N0YXRlOwotCi0JLyogTW9kaWZ5IHRoZSBjdXJyZW50IHN0YXRlIHdpdGggdGhlIGdpdmVuIG1hc2sgKi8KLQlpZiAoIGdhaW4gKSB7Ci0JCW5ld19zdGF0ZSA9IChTRExfYXBwc3RhdGUgfCBzdGF0ZSk7Ci0JfSBlbHNlIHsKLQkJbmV3X3N0YXRlID0gKFNETF9hcHBzdGF0ZSAmIH5zdGF0ZSk7Ci0JfQotCi0JLyogRHJvcCBldmVudHMgdGhhdCBkb24ndCBjaGFuZ2Ugc3RhdGUgKi8KLQlpZiAoIG5ld19zdGF0ZSA9PSBTRExfYXBwc3RhdGUgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBVcGRhdGUgaW50ZXJuYWwgYWN0aXZlIHN0YXRlICovCi0JU0RMX2FwcHN0YXRlID0gbmV3X3N0YXRlOwotCi0JLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KLQlwb3N0ZWQgPSAwOwotCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX0FDVElWRUVWRU5UXSA9PSBTRExfRU5BQkxFICkgewotCQlTRExfRXZlbnQgZXZlbnQ7Ci0JCVNETF9tZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKLQkJZXZlbnQudHlwZSA9IFNETF9BQ1RJVkVFVkVOVDsKLQkJZXZlbnQuYWN0aXZlLmdhaW4gPSBnYWluOwotCQlldmVudC5hY3RpdmUuc3RhdGUgPSBzdGF0ZTsKLQkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgKCpTRExfRXZlbnRPSykoJmV2ZW50KSApIHsKLQkJCXBvc3RlZCA9IDE7Ci0JCQlTRExfUHVzaEV2ZW50KCZldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKiBJZiB3ZSBsb3N0IGtleWJvYXJkIGZvY3VzLCBwb3N0IGtleS11cCBldmVudHMgKi8KLQlpZiAoIChzdGF0ZSAmIFNETF9BUFBJTlBVVEZPQ1VTKSAmJiAhZ2FpbiApIHsKLQkJU0RMX1Jlc2V0S2V5Ym9hcmQoKTsKLQl9Ci0JcmV0dXJuKHBvc3RlZCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDZmYjcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX2V2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBHZW5lcmFsIGV2ZW50IGhhbmRsaW5nIGNvZGUgZm9yIFNETCAqLwotCi0jaW5jbHVkZSAiU0RMLmgiCi0jaW5jbHVkZSAiU0RMX3N5c3dtLmgiCi0jaW5jbHVkZSAiU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIi4uL3RpbWVyL1NETF90aW1lcl9jLmgiCi0jaWYgIVNETF9KT1lTVElDS19ESVNBQkxFRAotI2luY2x1ZGUgIi4uL2pveXN0aWNrL1NETF9qb3lzdGlja19jLmgiCi0jZW5kaWYKLQotLyogUHVibGljIGRhdGEgLS0gdGhlIGV2ZW50IGZpbHRlciAqLwotU0RMX0V2ZW50RmlsdGVyIFNETF9FdmVudE9LID0gTlVMTDsKLVVpbnQ4IFNETF9Qcm9jZXNzRXZlbnRzW1NETF9OVU1FVkVOVFNdOwotc3RhdGljIFVpbnQzMiBTRExfZXZlbnRzdGF0ZSA9IDA7Ci0KLS8qIFByaXZhdGUgZGF0YSAtLSBldmVudCBxdWV1ZSAqLwotI2RlZmluZSBNQVhFVkVOVFMJMTI4Ci1zdGF0aWMgc3RydWN0IHsKLQlTRExfbXV0ZXggKmxvY2s7Ci0JaW50IGFjdGl2ZTsKLQlpbnQgaGVhZDsKLQlpbnQgdGFpbDsKLQlTRExfRXZlbnQgZXZlbnRbTUFYRVZFTlRTXTsKLQlpbnQgd21tc2dfbmV4dDsKLQlzdHJ1Y3QgU0RMX1N5c1dNbXNnIHdtbXNnW01BWEVWRU5UU107Ci19IFNETF9FdmVudFE7Ci0KLS8qIFByaXZhdGUgZGF0YSAtLSBldmVudCBsb2NraW5nIHN0cnVjdHVyZSAqLwotc3RhdGljIHN0cnVjdCB7Ci0JU0RMX211dGV4ICpsb2NrOwotCWludCBzYWZlOwotfSBTRExfRXZlbnRMb2NrOwotCi0vKiBUaHJlYWQgZnVuY3Rpb25zICovCi1zdGF0aWMgU0RMX1RocmVhZCAqU0RMX0V2ZW50VGhyZWFkID0gTlVMTDsJLyogVGhyZWFkIGhhbmRsZSAqLwotc3RhdGljIFVpbnQzMiBldmVudF90aHJlYWQ7CQkJLyogVGhlIGV2ZW50IHRocmVhZCBpZCAqLwotCi12b2lkIFNETF9Mb2NrX0V2ZW50VGhyZWFkKHZvaWQpCi17Ci0JaWYgKCBTRExfRXZlbnRUaHJlYWQgJiYgKFNETF9UaHJlYWRJRCgpICE9IGV2ZW50X3RocmVhZCkgKSB7Ci0JCS8qIEdyYWIgbG9jayBhbmQgc3BpbiB1bnRpbCB3ZSdyZSBzdXJlIGV2ZW50IHRocmVhZCBzdG9wcGVkICovCi0JCVNETF9tdXRleFAoU0RMX0V2ZW50TG9jay5sb2NrKTsKLQkJd2hpbGUgKCAhIFNETF9FdmVudExvY2suc2FmZSApIHsKLQkJCVNETF9EZWxheSgxKTsKLQkJfQotCX0KLX0KLXZvaWQgU0RMX1VubG9ja19FdmVudFRocmVhZCh2b2lkKQotewotCWlmICggU0RMX0V2ZW50VGhyZWFkICYmIChTRExfVGhyZWFkSUQoKSAhPSBldmVudF90aHJlYWQpICkgewotCQlTRExfbXV0ZXhWKFNETF9FdmVudExvY2subG9jayk7Ci0JfQotfQotCi0jaWZkZWYgX19PUzJfXwotLyoKLSAqIFdlJ2xsIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiBHb2JibGVFdmVudHMgdGhyZWFkLCBzbyBpdCB3aWxsIHByb2Nlc3MKLSAqICBldmVudHMgaW4gdGltZSBmb3Igc3VyZSEgRm9yIHRoaXMsIHdlIG5lZWQgdGhlIERvc1NldFByaW9yaXR5KCkgQVBJCi0gKiAgZnJvbSB0aGUgb3MyLmggaW5jbHVkZSBmaWxlLgotICovCi0jZGVmaW5lIElOQ0xfRE9TUFJPQ0VTUwotI2luY2x1ZGUgPG9zMi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotCi1zdGF0aWMgaW50IFNETENBTEwgU0RMX0dvYmJsZUV2ZW50cyh2b2lkICp1bnVzZWQpCi17Ci0JZXZlbnRfdGhyZWFkID0gU0RMX1RocmVhZElEKCk7Ci0KLSNpZmRlZiBfX09TMl9fCi0jaWZkZWYgVVNFX0RPU1NFVFBSSU9SSVRZCi0JLyogSW5jcmVhc2UgdGhyZWFkIHByaW9yaXR5LCBzbyBpdCB3aWxsIHByb2Nlc3MgZXZlbnRzIGluIHRpbWUgZm9yIHN1cmUhICovCi0JRG9zU2V0UHJpb3JpdHkoUFJUWVNfVEhSRUFELCBQUlRZQ19SRUdVTEFSLCArMTYsIDApOwotI2VuZGlmCi0jZW5kaWYKLQotCXdoaWxlICggU0RMX0V2ZW50US5hY3RpdmUgKSB7Ci0JCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQotCQkvKiBHZXQgZXZlbnRzIGZyb20gdGhlIHZpZGVvIHN1YnN5c3RlbSAqLwotCQlpZiAoIHZpZGVvICkgewotCQkJdmlkZW8tPlB1bXBFdmVudHModGhpcyk7Ci0JCX0KLQotCQkvKiBRdWV1ZSBwZW5kaW5nIGtleS1yZXBlYXQgZXZlbnRzICovCi0JCVNETF9DaGVja0tleVJlcGVhdCgpOwotCi0jaWYgIVNETF9KT1lTVElDS19ESVNBQkxFRAotCQkvKiBDaGVjayBmb3Igam95c3RpY2sgc3RhdGUgY2hhbmdlICovCi0JCWlmICggU0RMX251bWpveXN0aWNrcyAmJiAoU0RMX2V2ZW50c3RhdGUgJiBTRExfSk9ZRVZFTlRNQVNLKSApIHsKLQkJCVNETF9Kb3lzdGlja1VwZGF0ZSgpOwotCQl9Ci0jZW5kaWYKLQotCQkvKiBHaXZlIHVwIHRoZSBDUFUgZm9yIHRoZSByZXN0IG9mIG91ciB0aW1lc2xpY2UgKi8KLQkJU0RMX0V2ZW50TG9jay5zYWZlID0gMTsKLQkJaWYgKCBTRExfdGltZXJfcnVubmluZyApIHsKLQkJCVNETF9UaHJlYWRlZFRpbWVyQ2hlY2soKTsKLQkJfQotCQlTRExfRGVsYXkoMSk7Ci0KLQkJLyogQ2hlY2sgZm9yIGV2ZW50IGxvY2tpbmcuCi0JCSAgIE9uIHRoZSBQIG9mIHRoZSBsb2NrIG11dGV4LCBpZiB0aGUgbG9jayBpcyBoZWxkLCB0aGlzIHRocmVhZAotCQkgICB3aWxsIHdhaXQgdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQgYmVmb3JlIGNvbnRpbnVpbmcuICBUaGUKLQkJICAgc2FmZSBmbGFnIHdpbGwgYmUgc2V0LCBtZWFuaW5nIHRoYXQgdGhlIG90aGVyIHRocmVhZCBjYW4gZ28KLQkJICAgYWJvdXQgaXQncyBidXNpbmVzcy4gIFRoZSBzYWZlIGZsYWcgaXMgcmVzZXQgYmVmb3JlIHRoZSBWLAotCQkgICBzbyBhcyBzb29uIGFzIHRoZSBtdXRleCBpcyBmcmVlLCBvdGhlciB0aHJlYWRzIGNhbiBzZWUgdGhhdAotCQkgICBpdCdzIG5vdCBzYWZlIHRvIGludGVyZmVyZSB3aXRoIHRoZSBldmVudCB0aHJlYWQuCi0JCSAqLwotCQlTRExfbXV0ZXhQKFNETF9FdmVudExvY2subG9jayk7Ci0JCVNETF9FdmVudExvY2suc2FmZSA9IDA7Ci0JCVNETF9tdXRleFYoU0RMX0V2ZW50TG9jay5sb2NrKTsKLQl9Ci0JU0RMX1NldFRpbWVyVGhyZWFkZWQoMCk7Ci0JZXZlbnRfdGhyZWFkID0gMDsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX1N0YXJ0RXZlbnRUaHJlYWQoVWludDMyIGZsYWdzKQotewotCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgdG8gemVybyAqLwotCVNETF9FdmVudFRocmVhZCA9IE5VTEw7Ci0JU0RMX21lbXNldCgmU0RMX0V2ZW50TG9jaywgMCwgc2l6ZW9mKFNETF9FdmVudExvY2spKTsKLQotCS8qIENyZWF0ZSB0aGUgbG9jayBhbmQgc2V0IG91cnNlbHZlcyBhY3RpdmUgKi8KLSNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKLQlTRExfRXZlbnRRLmxvY2sgPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLQlpZiAoIFNETF9FdmVudFEubG9jayA9PSBOVUxMICkgewotI2lmZGVmIF9fTUFDT1NfXyAvKiBNYWNPUyBjbGFzc2ljIHlvdSBjYW4ndCBtdWx0aXRocmVhZCwgc28gbm8gbG9jayBuZWVkZWQgKi8KLQkJOwotI2Vsc2UKLQkJcmV0dXJuKC0xKTsKLSNlbmRpZgotCX0KLSNlbmRpZiAvKiAhU0RMX1RIUkVBRFNfRElTQUJMRUQgKi8KLQlTRExfRXZlbnRRLmFjdGl2ZSA9IDE7Ci0KLQlpZiAoIChmbGFncyZTRExfSU5JVF9FVkVOVFRIUkVBRCkgPT0gU0RMX0lOSVRfRVZFTlRUSFJFQUQgKSB7Ci0JCVNETF9FdmVudExvY2subG9jayA9IFNETF9DcmVhdGVNdXRleCgpOwotCQlpZiAoIFNETF9FdmVudExvY2subG9jayA9PSBOVUxMICkgewotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQlTRExfRXZlbnRMb2NrLnNhZmUgPSAwOwotCi0JCS8qIFRoZSBldmVudCB0aHJlYWQgd2lsbCBoYW5kbGUgdGltZXJzIHRvbyAqLwotCQlTRExfU2V0VGltZXJUaHJlYWRlZCgyKTsKLSNpZiAoZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpKSAmJiAhZGVmaW5lZChIQVZFX0xJQkMpICYmICFkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0jdW5kZWYgU0RMX0NyZWF0ZVRocmVhZAotCQlTRExfRXZlbnRUaHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkKFNETF9Hb2JibGVFdmVudHMsIE5VTEwsIE5VTEwsIE5VTEwpOwotI2Vsc2UKLQkJU0RMX0V2ZW50VGhyZWFkID0gU0RMX0NyZWF0ZVRocmVhZChTRExfR29iYmxlRXZlbnRzLCBOVUxMKTsKLSNlbmRpZgotCQlpZiAoIFNETF9FdmVudFRocmVhZCA9PSBOVUxMICkgewotCQkJcmV0dXJuKC0xKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWV2ZW50X3RocmVhZCA9IDA7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgU0RMX1N0b3BFdmVudFRocmVhZCh2b2lkKQotewotCVNETF9FdmVudFEuYWN0aXZlID0gMDsKLQlpZiAoIFNETF9FdmVudFRocmVhZCApIHsKLQkJU0RMX1dhaXRUaHJlYWQoU0RMX0V2ZW50VGhyZWFkLCBOVUxMKTsKLQkJU0RMX0V2ZW50VGhyZWFkID0gTlVMTDsKLQkJU0RMX0Rlc3Ryb3lNdXRleChTRExfRXZlbnRMb2NrLmxvY2spOwotCX0KLSNpZm5kZWYgSVBPRAotCVNETF9EZXN0cm95TXV0ZXgoU0RMX0V2ZW50US5sb2NrKTsKLSNlbmRpZgotfQotCi1VaW50MzIgU0RMX0V2ZW50VGhyZWFkSUQodm9pZCkKLXsKLQlyZXR1cm4oZXZlbnRfdGhyZWFkKTsKLX0KLQotLyogUHVibGljIGZ1bmN0aW9ucyAqLwotCi12b2lkIFNETF9TdG9wRXZlbnRMb29wKHZvaWQpCi17Ci0JLyogSGFsdCB0aGUgZXZlbnQgdGhyZWFkLCBpZiBydW5uaW5nICovCi0JU0RMX1N0b3BFdmVudFRocmVhZCgpOwotCi0JLyogU2h1dGRvd24gZXZlbnQgaGFuZGxlcnMgKi8KLQlTRExfQXBwQWN0aXZlUXVpdCgpOwotCVNETF9LZXlib2FyZFF1aXQoKTsKLQlTRExfTW91c2VRdWl0KCk7Ci0JU0RMX1F1aXRRdWl0KCk7Ci0KLQkvKiBDbGVhbiBvdXQgRXZlbnRRICovCi0JU0RMX0V2ZW50US5oZWFkID0gMDsKLQlTRExfRXZlbnRRLnRhaWwgPSAwOwotCVNETF9FdmVudFEud21tc2dfbmV4dCA9IDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gKGFuZCBhc3NvY2lhdGVkIGNhbGxzKSBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICovCi1pbnQgU0RMX1N0YXJ0RXZlbnRMb29wKFVpbnQzMiBmbGFncykKLXsKLQlpbnQgcmV0Y29kZTsKLQotCS8qIENsZWFuIG91dCB0aGUgZXZlbnQgcXVldWUgKi8KLQlTRExfRXZlbnRUaHJlYWQgPSBOVUxMOwotCVNETF9FdmVudFEubG9jayA9IE5VTEw7Ci0JU0RMX1N0b3BFdmVudExvb3AoKTsKLQotCS8qIE5vIGZpbHRlciB0byBzdGFydCB3aXRoLCBwcm9jZXNzIG1vc3QgZXZlbnQgdHlwZXMgKi8KLQlTRExfRXZlbnRPSyA9IE5VTEw7Ci0JU0RMX21lbXNldChTRExfUHJvY2Vzc0V2ZW50cyxTRExfRU5BQkxFLHNpemVvZihTRExfUHJvY2Vzc0V2ZW50cykpOwotCVNETF9ldmVudHN0YXRlID0gfjA7Ci0JLyogSXQncyBub3Qgc2F2ZSB0byBjYWxsIFNETF9FdmVudFN0YXRlKCkgeWV0ICovCi0JU0RMX2V2ZW50c3RhdGUgJj0gfigweDAwMDAwMDAxIDw8IFNETF9TWVNXTUVWRU5UKTsKLQlTRExfUHJvY2Vzc0V2ZW50c1tTRExfU1lTV01FVkVOVF0gPSBTRExfSUdOT1JFOwotCi0JLyogSW5pdGlhbGl6ZSBldmVudCBoYW5kbGVycyAqLwotCXJldGNvZGUgPSAwOwotCXJldGNvZGUgKz0gU0RMX0FwcEFjdGl2ZUluaXQoKTsKLQlyZXRjb2RlICs9IFNETF9LZXlib2FyZEluaXQoKTsKLQlyZXRjb2RlICs9IFNETF9Nb3VzZUluaXQoKTsKLQlyZXRjb2RlICs9IFNETF9RdWl0SW5pdCgpOwotCWlmICggcmV0Y29kZSA8IDAgKSB7Ci0JCS8qIFdlIGRvbid0IGV4cGVjdCB0aGVtIHRvIGZhaWwsIGJ1dC4uLiAqLwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIENyZWF0ZSB0aGUgbG9jayBhbmQgZXZlbnQgdGhyZWFkICovCi0JaWYgKCBTRExfU3RhcnRFdmVudFRocmVhZChmbGFncykgPCAwICkgewotCQlTRExfU3RvcEV2ZW50TG9vcCgpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLQotLyogQWRkIGFuIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZSAtLSBjYWxsZWQgd2l0aCB0aGUgcXVldWUgbG9ja2VkICovCi1zdGF0aWMgaW50IFNETF9BZGRFdmVudChTRExfRXZlbnQgKmV2ZW50KQotewotCWludCB0YWlsLCBhZGRlZDsKLQotCXRhaWwgPSAoU0RMX0V2ZW50US50YWlsKzEpJU1BWEVWRU5UUzsKLQlpZiAoIHRhaWwgPT0gU0RMX0V2ZW50US5oZWFkICkgewotCQkvKiBPdmVyZmxvdywgZHJvcCBldmVudCAqLwotCQlhZGRlZCA9IDA7Ci0JfSBlbHNlIHsKLQkJU0RMX0V2ZW50US5ldmVudFtTRExfRXZlbnRRLnRhaWxdID0gKmV2ZW50OwotCQlpZiAoZXZlbnQtPnR5cGUgPT0gU0RMX1NZU1dNRVZFTlQpIHsKLQkJCS8qIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGxvc2UgYW4gZXZlbnQgKi8KLQkJCWludCBuZXh0ID0gU0RMX0V2ZW50US53bW1zZ19uZXh0OwotCQkJU0RMX0V2ZW50US53bW1zZ1tuZXh0XSA9ICpldmVudC0+c3lzd20ubXNnOwotCQkgICAgICAgIFNETF9FdmVudFEuZXZlbnRbU0RMX0V2ZW50US50YWlsXS5zeXN3bS5tc2cgPQotCQkJCQkJJlNETF9FdmVudFEud21tc2dbbmV4dF07Ci0JCQlTRExfRXZlbnRRLndtbXNnX25leHQgPSAobmV4dCsxKSVNQVhFVkVOVFM7Ci0JCX0KLQkJU0RMX0V2ZW50US50YWlsID0gdGFpbDsKLQkJYWRkZWQgPSAxOwotCX0KLQlyZXR1cm4oYWRkZWQpOwotfQotCi0vKiBDdXQgYW4gZXZlbnQsIGFuZCByZXR1cm4gdGhlIG5leHQgdmFsaWQgc3BvdCwgb3IgdGhlIHRhaWwgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY2FsbGVkIHdpdGggdGhlIHF1ZXVlIGxvY2tlZCAqLwotc3RhdGljIGludCBTRExfQ3V0RXZlbnQoaW50IHNwb3QpCi17Ci0JaWYgKCBzcG90ID09IFNETF9FdmVudFEuaGVhZCApIHsKLQkJU0RMX0V2ZW50US5oZWFkID0gKFNETF9FdmVudFEuaGVhZCsxKSVNQVhFVkVOVFM7Ci0JCXJldHVybihTRExfRXZlbnRRLmhlYWQpOwotCX0gZWxzZQotCWlmICggKHNwb3QrMSklTUFYRVZFTlRTID09IFNETF9FdmVudFEudGFpbCApIHsKLQkJU0RMX0V2ZW50US50YWlsID0gc3BvdDsKLQkJcmV0dXJuKFNETF9FdmVudFEudGFpbCk7Ci0JfSBlbHNlCi0JLyogV2UgY3V0IHRoZSBtaWRkbGUgLS0gc2hpZnQgZXZlcnl0aGluZyBvdmVyICovCi0JewotCQlpbnQgaGVyZSwgbmV4dDsKLQotCQkvKiBUaGlzIGNhbiBwcm9iYWJseSBiZSBvcHRpbWl6ZWQgd2l0aCBTRExfbWVtY3B5KCkgLS0gY2FyZWZ1bCEgKi8KLQkJaWYgKCAtLVNETF9FdmVudFEudGFpbCA8IDAgKSB7Ci0JCQlTRExfRXZlbnRRLnRhaWwgPSBNQVhFVkVOVFMtMTsKLQkJfQotCQlmb3IgKCBoZXJlPXNwb3Q7IGhlcmUgIT0gU0RMX0V2ZW50US50YWlsOyBoZXJlID0gbmV4dCApIHsKLQkJCW5leHQgPSAoaGVyZSsxKSVNQVhFVkVOVFM7Ci0JCQlTRExfRXZlbnRRLmV2ZW50W2hlcmVdID0gU0RMX0V2ZW50US5ldmVudFtuZXh0XTsKLQkJfQotCQlyZXR1cm4oc3BvdCk7Ci0JfQotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotLyogTG9jayB0aGUgZXZlbnQgcXVldWUsIHRha2UgYSBwZWVwIGF0IGl0LCBhbmQgdW5sb2NrIGl0ICovCi1pbnQgU0RMX1BlZXBFdmVudHMoU0RMX0V2ZW50ICpldmVudHMsIGludCBudW1ldmVudHMsIFNETF9ldmVudGFjdGlvbiBhY3Rpb24sCi0JCQkJCQkJCVVpbnQzMiBtYXNrKQotewotCWludCBpLCB1c2VkOwotCi0JLyogRG9uJ3QgbG9vayBhZnRlciB3ZSd2ZSBxdWl0ICovCi0JaWYgKCAhIFNETF9FdmVudFEuYWN0aXZlICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQkvKiBMb2NrIHRoZSBldmVudCBxdWV1ZSAqLwotCXVzZWQgPSAwOwotCWlmICggU0RMX211dGV4UChTRExfRXZlbnRRLmxvY2spID09IDAgKSB7Ci0JCWlmICggYWN0aW9uID09IFNETF9BRERFVkVOVCApIHsKLQkJCWZvciAoIGk9MDsgaTxudW1ldmVudHM7ICsraSApIHsKLQkJCQl1c2VkICs9IFNETF9BZGRFdmVudCgmZXZlbnRzW2ldKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVNETF9FdmVudCB0bXBldmVudDsKLQkJCWludCBzcG90OwotCi0JCQkvKiBJZiAnZXZlbnRzJyBpcyBOVUxMLCBqdXN0IHNlZSBpZiB0aGV5IGV4aXN0ICovCi0JCQlpZiAoIGV2ZW50cyA9PSBOVUxMICkgewotCQkJCWFjdGlvbiA9IFNETF9QRUVLRVZFTlQ7Ci0JCQkJbnVtZXZlbnRzID0gMTsKLQkJCQlldmVudHMgPSAmdG1wZXZlbnQ7Ci0JCQl9Ci0JCQlzcG90ID0gU0RMX0V2ZW50US5oZWFkOwotCQkJd2hpbGUgKCh1c2VkIDwgbnVtZXZlbnRzKSYmKHNwb3QgIT0gU0RMX0V2ZW50US50YWlsKSkgewotCQkJCWlmICggbWFzayAmIFNETF9FVkVOVE1BU0soU0RMX0V2ZW50US5ldmVudFtzcG90XS50eXBlKSApIHsKLQkJCQkJZXZlbnRzW3VzZWQrK10gPSBTRExfRXZlbnRRLmV2ZW50W3Nwb3RdOwotCQkJCQlpZiAoIGFjdGlvbiA9PSBTRExfR0VURVZFTlQgKSB7Ci0JCQkJCQlzcG90ID0gU0RMX0N1dEV2ZW50KHNwb3QpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3BvdCA9IChzcG90KzEpJU1BWEVWRU5UUzsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXNwb3QgPSAoc3BvdCsxKSVNQVhFVkVOVFM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVNETF9tdXRleFYoU0RMX0V2ZW50US5sb2NrKTsKLQl9IGVsc2UgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGxvY2sgZXZlbnQgcXVldWUiKTsKLQkJdXNlZCA9IC0xOwotCX0KLQlyZXR1cm4odXNlZCk7Ci19Ci0KLS8qIFJ1biB0aGUgc3lzdGVtIGRlcGVuZGVudCBldmVudCBsb29wcyAqLwotdm9pZCBTRExfUHVtcEV2ZW50cyh2b2lkKQotewotCWlmICggIVNETF9FdmVudFRocmVhZCApIHsKLQkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwotCi0JCS8qIEdldCBldmVudHMgZnJvbSB0aGUgdmlkZW8gc3Vic3lzdGVtICovCi0JCWlmICggdmlkZW8gKSB7Ci0JCQl2aWRlby0+UHVtcEV2ZW50cyh0aGlzKTsKLQkJfQotCi0JCS8qIFF1ZXVlIHBlbmRpbmcga2V5LXJlcGVhdCBldmVudHMgKi8KLQkJU0RMX0NoZWNrS2V5UmVwZWF0KCk7Ci0KLSNpZiAhU0RMX0pPWVNUSUNLX0RJU0FCTEVECi0JCS8qIENoZWNrIGZvciBqb3lzdGljayBzdGF0ZSBjaGFuZ2UgKi8KLQkJaWYgKCBTRExfbnVtam95c3RpY2tzICYmIChTRExfZXZlbnRzdGF0ZSAmIFNETF9KT1lFVkVOVE1BU0spICkgewotCQkJU0RMX0pveXN0aWNrVXBkYXRlKCk7Ci0JCX0KLSNlbmRpZgotCX0KLX0KLQotLyogUHVibGljIGZ1bmN0aW9ucyAqLwotCi1pbnQgU0RMX1BvbGxFdmVudCAoU0RMX0V2ZW50ICpldmVudCkKLXsKLQlTRExfUHVtcEV2ZW50cygpOwotCi0JLyogV2UgY2FuJ3QgcmV0dXJuIC0xLCBqdXN0IHJldHVybiAwIChubyBldmVudCkgb24gZXJyb3IgKi8KLQlpZiAoIFNETF9QZWVwRXZlbnRzKGV2ZW50LCAxLCBTRExfR0VURVZFTlQsIFNETF9BTExFVkVOVFMpIDw9IDAgKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotaW50IFNETF9XYWl0RXZlbnQgKFNETF9FdmVudCAqZXZlbnQpCi17Ci0Jd2hpbGUgKCAxICkgewotCQlTRExfUHVtcEV2ZW50cygpOwotCQlzd2l0Y2goU0RMX1BlZXBFdmVudHMoZXZlbnQsIDEsIFNETF9HRVRFVkVOVCwgU0RMX0FMTEVWRU5UUykpIHsKLQkJICAgIGNhc2UgLTE6IHJldHVybiAwOwotCQkgICAgY2FzZSAxOiByZXR1cm4gMTsKLQkJICAgIGNhc2UgMDogU0RMX0RlbGF5KDEwKTsKLQkJfQotCX0KLX0KLQotaW50IFNETF9QdXNoRXZlbnQoU0RMX0V2ZW50ICpldmVudCkKLXsKLQlpZiAoIFNETF9QZWVwRXZlbnRzKGV2ZW50LCAxLCBTRExfQURERVZFTlQsIDApIDw9IDAgKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU0RMX1NldEV2ZW50RmlsdGVyIChTRExfRXZlbnRGaWx0ZXIgZmlsdGVyKQotewotCVNETF9FdmVudCBiaXRidWNrZXQ7Ci0KLQkvKiBTZXQgZmlsdGVyIGFuZCBkaXNjYXJkIHBlbmRpbmcgZXZlbnRzICovCi0JU0RMX0V2ZW50T0sgPSBmaWx0ZXI7Ci0Jd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZiaXRidWNrZXQpID4gMCApCi0JCTsKLX0KLQotU0RMX0V2ZW50RmlsdGVyIFNETF9HZXRFdmVudEZpbHRlcih2b2lkKQotewotCXJldHVybihTRExfRXZlbnRPSyk7Ci19Ci0KLVVpbnQ4IFNETF9FdmVudFN0YXRlIChVaW50OCB0eXBlLCBpbnQgc3RhdGUpCi17Ci0JU0RMX0V2ZW50IGJpdGJ1Y2tldDsKLQlVaW50OCBjdXJyZW50X3N0YXRlOwotCi0JLyogSWYgU0RMX0FMTEVWRU5UUyB3YXMgc3BlY2lmaWVkLi4uICovCi0JaWYgKCB0eXBlID09IDB4RkYgKSB7Ci0JCWN1cnJlbnRfc3RhdGUgPSBTRExfSUdOT1JFOwotCQlmb3IgKCB0eXBlPTA7IHR5cGU8U0RMX05VTUVWRU5UUzsgKyt0eXBlICkgewotCQkJaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1t0eXBlXSAhPSBTRExfSUdOT1JFICkgewotCQkJCWN1cnJlbnRfc3RhdGUgPSBTRExfRU5BQkxFOwotCQkJfQotCQkJU0RMX1Byb2Nlc3NFdmVudHNbdHlwZV0gPSBzdGF0ZTsKLQkJCWlmICggc3RhdGUgPT0gU0RMX0VOQUJMRSApIHsKLQkJCQlTRExfZXZlbnRzdGF0ZSB8PSAoMHgwMDAwMDAwMSA8PCAodHlwZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlTRExfZXZlbnRzdGF0ZSAmPSB+KDB4MDAwMDAwMDEgPDwgKHR5cGUpKTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoIFNETF9Qb2xsRXZlbnQoJmJpdGJ1Y2tldCkgPiAwICkKLQkJCTsKLQkJcmV0dXJuKGN1cnJlbnRfc3RhdGUpOwotCX0KLQotCS8qIEp1c3Qgc2V0IHRoZSBzdGF0ZSBmb3Igb25lIGV2ZW50IHR5cGUgKi8KLQljdXJyZW50X3N0YXRlID0gU0RMX1Byb2Nlc3NFdmVudHNbdHlwZV07Ci0Jc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIFNETF9JR05PUkU6Ci0JCWNhc2UgU0RMX0VOQUJMRToKLQkJCS8qIFNldCBzdGF0ZSBhbmQgZGlzY2FyZCBwZW5kaW5nIGV2ZW50cyAqLwotCQkJU0RMX1Byb2Nlc3NFdmVudHNbdHlwZV0gPSBzdGF0ZTsKLQkJCWlmICggc3RhdGUgPT0gU0RMX0VOQUJMRSApIHsKLQkJCQlTRExfZXZlbnRzdGF0ZSB8PSAoMHgwMDAwMDAwMSA8PCAodHlwZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlTRExfZXZlbnRzdGF0ZSAmPSB+KDB4MDAwMDAwMDEgPDwgKHR5cGUpKTsKLQkJCX0KLQkJCXdoaWxlICggU0RMX1BvbGxFdmVudCgmYml0YnVja2V0KSA+IDAgKQotCQkJCTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogUXVlcnlpbmcgc3RhdGU/ICovCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuKGN1cnJlbnRfc3RhdGUpOwotfQotCi0vKiBUaGlzIGlzIGEgZ2VuZXJpYyBldmVudCBoYW5kbGVyLgotICovCi1pbnQgU0RMX1ByaXZhdGVTeXNXTUV2ZW50KFNETF9TeXNXTW1zZyAqbWVzc2FnZSkKLXsKLQlpbnQgcG9zdGVkOwotCi0JcG9zdGVkID0gMDsKLQlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW1NETF9TWVNXTUVWRU5UXSA9PSBTRExfRU5BQkxFICkgewotCQlTRExfRXZlbnQgZXZlbnQ7Ci0JCVNETF9tZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKLQkJZXZlbnQudHlwZSA9IFNETF9TWVNXTUVWRU5UOwotCQlldmVudC5zeXN3bS5tc2cgPSBtZXNzYWdlOwotCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgewotCQkJcG9zdGVkID0gMTsKLQkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKLQkJfQotCX0KLQkvKiBVcGRhdGUgaW50ZXJuYWwgZXZlbnQgc3RhdGUgKi8KLQlyZXR1cm4ocG9zdGVkKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvZXZlbnRzL1NETF9ldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX2V2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNWEzOGMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX2V2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVXNlZnVsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGZyb20gU0RMX2V2ZW50cy5jICovCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotCi0vKiBTdGFydCBhbmQgc3RvcCB0aGUgZXZlbnQgcHJvY2Vzc2luZyBsb29wICovCi1leHRlcm4gaW50IFNETF9TdGFydEV2ZW50TG9vcChVaW50MzIgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgU0RMX1N0b3BFdmVudExvb3Aodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfUXVpdEludGVycnVwdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgU0RMX0xvY2tfRXZlbnRUaHJlYWQodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKHZvaWQpOwotZXh0ZXJuIFVpbnQzMiBTRExfRXZlbnRUaHJlYWRJRCh2b2lkKTsKLQotLyogRXZlbnQgaGFuZGxlciBpbml0IHJvdXRpbmVzICovCi1leHRlcm4gaW50ICBTRExfQXBwQWN0aXZlSW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgIFNETF9LZXlib2FyZEluaXQodm9pZCk7Ci1leHRlcm4gaW50ICBTRExfTW91c2VJbml0KHZvaWQpOwotZXh0ZXJuIGludCAgU0RMX1F1aXRJbml0KHZvaWQpOwotCi0vKiBFdmVudCBoYW5kbGVyIHF1aXQgcm91dGluZXMgKi8KLWV4dGVybiB2b2lkIFNETF9BcHBBY3RpdmVRdWl0KHZvaWQpOwotZXh0ZXJuIHZvaWQgU0RMX0tleWJvYXJkUXVpdCh2b2lkKTsKLWV4dGVybiB2b2lkIFNETF9Nb3VzZVF1aXQodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfUXVpdFF1aXQodm9pZCk7Ci0KLS8qIFRoZSBldmVudCBmaWx0ZXIgZnVuY3Rpb24gKi8KLWV4dGVybiBTRExfRXZlbnRGaWx0ZXIgU0RMX0V2ZW50T0s7Ci0KLS8qIFRoZSBhcnJheSBvZiBldmVudCBwcm9jZXNzaW5nIHN0YXRlcyAqLwotZXh0ZXJuIFVpbnQ4IFNETF9Qcm9jZXNzRXZlbnRzW1NETF9OVU1FVkVOVFNdOwotCi0vKiBJbnRlcm5hbCBldmVudCBxdWV1ZWluZyBmdW5jdGlvbnMKLSAgIChmcm9tIFNETF9hY3RpdmUuYywgU0RMX21vdXNlLmMsIFNETF9rZXlib2FyZC5jLCBTRExfcXVpdC5jLCBTRExfZXZlbnRzLmMpCi0gKi8KLWV4dGVybiBpbnQgU0RMX1ByaXZhdGVBcHBBY3RpdmUoVWludDggZ2FpbiwgVWludDggc3RhdGUpOwotZXh0ZXJuIGludCBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKFVpbnQ4IGJ1dHRvbnN0YXRlLCBpbnQgcmVsYXRpdmUsCi0JCQkJCQlTaW50MTYgeCwgU2ludDE2IHkpOwotZXh0ZXJuIGludCBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFVpbnQ4IHN0YXRlLCBVaW50OCBidXR0b24sU2ludDE2IHgsU2ludDE2IHkpOwotZXh0ZXJuIGludCBTRExfUHJpdmF0ZUtleWJvYXJkKFVpbnQ4IHN0YXRlLCBTRExfa2V5c3ltICprZXkpOwotZXh0ZXJuIGludCBTRExfUHJpdmF0ZVJlc2l6ZShpbnQgdywgaW50IGgpOwotZXh0ZXJuIGludCBTRExfUHJpdmF0ZUV4cG9zZSh2b2lkKTsKLWV4dGVybiBpbnQgU0RMX1ByaXZhdGVRdWl0KHZvaWQpOwotZXh0ZXJuIGludCBTRExfUHJpdmF0ZVN5c1dNRXZlbnQoU0RMX1N5c1dNbXNnICptZXNzYWdlKTsKLQotLyogVXNlZCBieSB0aGUgYWN0aXZpdHkgZXZlbnQgaGFuZGxlciB0byByZW1vdmUgbW91c2UgZm9jdXMgKi8KLWV4dGVybiB2b2lkIFNETF9SZXNldE1vdXNlKHZvaWQpOwotCi0vKiBVc2VkIGJ5IHRoZSBhY3Rpdml0eSBldmVudCBoYW5kbGVyIHRvIHJlbW92ZSBrZXlib2FyZCBmb2N1cyAqLwotZXh0ZXJuIHZvaWQgU0RMX1Jlc2V0S2V5Ym9hcmQodm9pZCk7Ci0KLS8qIFVzZWQgYnkgdGhlIGV2ZW50IGxvb3AgdG8gcXVldWUgcGVuZGluZyBrZXlib2FyZCByZXBlYXQgZXZlbnRzICovCi1leHRlcm4gdm9pZCBTRExfQ2hlY2tLZXlSZXBlYXQodm9pZCk7Ci0KLS8qIFVzZWQgYnkgdGhlIE9TIGtleWJvYXJkIGNvZGUgdG8gZGV0ZWN0IHdoZXRoZXIgb3Igbm90IHRvIGRvIFVOSUNPREUgKi8KLSNpZm5kZWYgREVGQVVMVF9VTklDT0RFX1RSQU5TTEFUSU9OCi0jZGVmaW5lIERFRkFVTFRfVU5JQ09ERV9UUkFOU0xBVElPTiAwCS8qIERlZmF1bHQgb2ZmIGJlY2F1c2Ugb2Ygb3ZlcmhlYWQgKi8KLSNlbmRpZgotZXh0ZXJuIGludCBTRExfVHJhbnNsYXRlVU5JQ09ERTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvZXZlbnRzL1NETF9leHBvc2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvZXZlbnRzL1NETF9leHBvc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyNWVhMS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfZXhwb3NlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogUmVmcmVzaCBldmVudCBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KLQotI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzX2MuaCIKLQotCi0vKiBUaGlzIGlzIGdsb2JhbCBmb3IgU0RMX2V2ZW50bG9vcC5jICovCi1pbnQgU0RMX1ByaXZhdGVFeHBvc2Uodm9pZCkKLXsKLQlpbnQgcG9zdGVkOwotCVNETF9FdmVudCBldmVudHNbMzJdOwotCi0JLyogUHVsbCBvdXQgYWxsIG9sZCByZWZyZXNoIGV2ZW50cyAqLwotCVNETF9QZWVwRXZlbnRzKGV2ZW50cywgc2l6ZW9mKGV2ZW50cykvc2l6ZW9mKGV2ZW50c1swXSksCi0JICAgICAgICAgICAgICAgICAgICBTRExfR0VURVZFTlQsIFNETF9WSURFT0VYUE9TRU1BU0spOwotCi0JLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KLQlwb3N0ZWQgPSAwOwotCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX1ZJREVPRVhQT1NFXSA9PSBTRExfRU5BQkxFICkgewotCQlTRExfRXZlbnQgZXZlbnQ7Ci0JCWV2ZW50LnR5cGUgPSBTRExfVklERU9FWFBPU0U7Ci0JCWlmICggKFNETF9FdmVudE9LID09IE5VTEwpIHx8ICgqU0RMX0V2ZW50T0spKCZldmVudCkgKSB7Ci0JCQlwb3N0ZWQgPSAxOwotCQkJU0RMX1B1c2hFdmVudCgmZXZlbnQpOwotCQl9Ci0JfQotCXJldHVybihwb3N0ZWQpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX2tleWJvYXJkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfa2V5Ym9hcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3YWY0Mi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfa2V5Ym9hcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogR2VuZXJhbCBrZXlib2FyZCBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KLQotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfc3lzZXZlbnRzLmgiCi0KLQotLyogR2xvYmFsIGtleXN0YXRlIGluZm9ybWF0aW9uICovCi1zdGF0aWMgVWludDggIFNETF9LZXlTdGF0ZVtTRExLX0xBU1RdOwotc3RhdGljIFNETE1vZCBTRExfTW9kU3RhdGU7Ci1pbnQgU0RMX1RyYW5zbGF0ZVVOSUNPREUgPSAwOwotCi1zdGF0aWMgY29uc3QgY2hhciAqa2V5bmFtZXNbU0RMS19MQVNUXTsJLyogQXJyYXkgb2Yga2V5Y29kZSBuYW1lcyAqLwotCi0vKgotICogamsgOTkxMjE1IC0gYWRkZWQKLSAqLwotc3RydWN0IHsKLQlpbnQgZmlyc3R0aW1lOyAgICAvKiBpZiB3ZSBjaGVjayBhZ2FpbnN0IHRoZSBkZWxheSBvciByZXBlYXQgdmFsdWUgKi8KLQlpbnQgZGVsYXk7ICAgICAgICAvKiB0aGUgZGVsYXkgYmVmb3JlIHdlIHN0YXJ0IHJlcGVhdGluZyAqLwotCWludCBpbnRlcnZhbDsgICAgIC8qIHRoZSBkZWxheSBiZXR3ZWVuIGtleSByZXBlYXQgZXZlbnRzICovCi0JVWludDMyIHRpbWVzdGFtcDsgLyogdGhlIHRpbWUgdGhlIGZpcnN0IGtleWRvd24gZXZlbnQgb2NjdXJyZWQgKi8KLQotCVNETF9FdmVudCBldnQ7ICAgIC8qIHRoZSBldmVudCB3ZSBhcmUgc3VwcG9zZWQgdG8gcmVwZWF0ICovCi19IFNETF9LZXlSZXBlYXQ7Ci0KLS8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KLWludCBTRExfS2V5Ym9hcmRJbml0KHZvaWQpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87Ci0KLQkvKiBTZXQgZGVmYXVsdCBtb2RlIG9mIFVOSUNPREUgdHJhbnNsYXRpb24gKi8KLQlTRExfRW5hYmxlVU5JQ09ERShERUZBVUxUX1VOSUNPREVfVFJBTlNMQVRJT04pOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgdGFibGVzICovCi0JU0RMX01vZFN0YXRlID0gS01PRF9OT05FOwotCVNETF9tZW1zZXQoKHZvaWQqKWtleW5hbWVzLCAwLCBzaXplb2Yoa2V5bmFtZXMpKTsKLQlTRExfbWVtc2V0KFNETF9LZXlTdGF0ZSwgMCwgc2l6ZW9mKFNETF9LZXlTdGF0ZSkpOwotCXZpZGVvLT5Jbml0T1NLZXltYXAodGhpcyk7Ci0KLQlTRExfRW5hYmxlS2V5UmVwZWF0KDAsIDApOwotCi0JLyogRmlsbCBpbiB0aGUgYmxhbmtzIGluIGtleW5hbWVzICovCi0Ja2V5bmFtZXNbU0RMS19CQUNLU1BBQ0VdID0gImJhY2tzcGFjZSI7Ci0Ja2V5bmFtZXNbU0RMS19UQUJdID0gInRhYiI7Ci0Ja2V5bmFtZXNbU0RMS19DTEVBUl0gPSAiY2xlYXIiOwotCWtleW5hbWVzW1NETEtfUkVUVVJOXSA9ICJyZXR1cm4iOwotCWtleW5hbWVzW1NETEtfUEFVU0VdID0gInBhdXNlIjsKLQlrZXluYW1lc1tTRExLX0VTQ0FQRV0gPSAiZXNjYXBlIjsKLQlrZXluYW1lc1tTRExLX1NQQUNFXSA9ICJzcGFjZSI7Ci0Ja2V5bmFtZXNbU0RMS19FWENMQUlNXSAgPSAiISI7Ci0Ja2V5bmFtZXNbU0RMS19RVU9URURCTF0gID0gIlwiIjsKLQlrZXluYW1lc1tTRExLX0hBU0hdICA9ICIjIjsKLQlrZXluYW1lc1tTRExLX0RPTExBUl0gID0gIiQiOwotCWtleW5hbWVzW1NETEtfQU1QRVJTQU5EXSAgPSAiJiI7Ci0Ja2V5bmFtZXNbU0RMS19RVU9URV0gPSAiJyI7Ci0Ja2V5bmFtZXNbU0RMS19MRUZUUEFSRU5dID0gIigiOwotCWtleW5hbWVzW1NETEtfUklHSFRQQVJFTl0gPSAiKSI7Ci0Ja2V5bmFtZXNbU0RMS19BU1RFUklTS10gPSAiKiI7Ci0Ja2V5bmFtZXNbU0RMS19QTFVTXSA9ICIrIjsKLQlrZXluYW1lc1tTRExLX0NPTU1BXSA9ICIsIjsKLQlrZXluYW1lc1tTRExLX01JTlVTXSA9ICItIjsKLQlrZXluYW1lc1tTRExLX1BFUklPRF0gPSAiLiI7Ci0Ja2V5bmFtZXNbU0RMS19TTEFTSF0gPSAiLyI7Ci0Ja2V5bmFtZXNbU0RMS18wXSA9ICIwIjsKLQlrZXluYW1lc1tTRExLXzFdID0gIjEiOwotCWtleW5hbWVzW1NETEtfMl0gPSAiMiI7Ci0Ja2V5bmFtZXNbU0RMS18zXSA9ICIzIjsKLQlrZXluYW1lc1tTRExLXzRdID0gIjQiOwotCWtleW5hbWVzW1NETEtfNV0gPSAiNSI7Ci0Ja2V5bmFtZXNbU0RMS182XSA9ICI2IjsKLQlrZXluYW1lc1tTRExLXzddID0gIjciOwotCWtleW5hbWVzW1NETEtfOF0gPSAiOCI7Ci0Ja2V5bmFtZXNbU0RMS185XSA9ICI5IjsKLQlrZXluYW1lc1tTRExLX0NPTE9OXSA9ICI6IjsKLQlrZXluYW1lc1tTRExLX1NFTUlDT0xPTl0gPSAiOyI7Ci0Ja2V5bmFtZXNbU0RMS19MRVNTXSA9ICI8IjsKLQlrZXluYW1lc1tTRExLX0VRVUFMU10gPSAiPSI7Ci0Ja2V5bmFtZXNbU0RMS19HUkVBVEVSXSA9ICI+IjsKLQlrZXluYW1lc1tTRExLX1FVRVNUSU9OXSA9ICI/IjsKLQlrZXluYW1lc1tTRExLX0FUXSA9ICJAIjsKLQlrZXluYW1lc1tTRExLX0xFRlRCUkFDS0VUXSA9ICJbIjsKLQlrZXluYW1lc1tTRExLX0JBQ0tTTEFTSF0gPSAiXFwiOwotCWtleW5hbWVzW1NETEtfUklHSFRCUkFDS0VUXSA9ICJdIjsKLQlrZXluYW1lc1tTRExLX0NBUkVUXSA9ICJeIjsKLQlrZXluYW1lc1tTRExLX1VOREVSU0NPUkVdID0gIl8iOwotCWtleW5hbWVzW1NETEtfQkFDS1FVT1RFXSA9ICJgIjsKLQlrZXluYW1lc1tTRExLX2FdID0gImEiOwotCWtleW5hbWVzW1NETEtfYl0gPSAiYiI7Ci0Ja2V5bmFtZXNbU0RMS19jXSA9ICJjIjsKLQlrZXluYW1lc1tTRExLX2RdID0gImQiOwotCWtleW5hbWVzW1NETEtfZV0gPSAiZSI7Ci0Ja2V5bmFtZXNbU0RMS19mXSA9ICJmIjsKLQlrZXluYW1lc1tTRExLX2ddID0gImciOwotCWtleW5hbWVzW1NETEtfaF0gPSAiaCI7Ci0Ja2V5bmFtZXNbU0RMS19pXSA9ICJpIjsKLQlrZXluYW1lc1tTRExLX2pdID0gImoiOwotCWtleW5hbWVzW1NETEtfa10gPSAiayI7Ci0Ja2V5bmFtZXNbU0RMS19sXSA9ICJsIjsKLQlrZXluYW1lc1tTRExLX21dID0gIm0iOwotCWtleW5hbWVzW1NETEtfbl0gPSAibiI7Ci0Ja2V5bmFtZXNbU0RMS19vXSA9ICJvIjsKLQlrZXluYW1lc1tTRExLX3BdID0gInAiOwotCWtleW5hbWVzW1NETEtfcV0gPSAicSI7Ci0Ja2V5bmFtZXNbU0RMS19yXSA9ICJyIjsKLQlrZXluYW1lc1tTRExLX3NdID0gInMiOwotCWtleW5hbWVzW1NETEtfdF0gPSAidCI7Ci0Ja2V5bmFtZXNbU0RMS191XSA9ICJ1IjsKLQlrZXluYW1lc1tTRExLX3ZdID0gInYiOwotCWtleW5hbWVzW1NETEtfd10gPSAidyI7Ci0Ja2V5bmFtZXNbU0RMS194XSA9ICJ4IjsKLQlrZXluYW1lc1tTRExLX3ldID0gInkiOwotCWtleW5hbWVzW1NETEtfel0gPSAieiI7Ci0Ja2V5bmFtZXNbU0RMS19ERUxFVEVdID0gImRlbGV0ZSI7Ci0KLQlrZXluYW1lc1tTRExLX1dPUkxEXzBdID0gIndvcmxkIDAiOwotCWtleW5hbWVzW1NETEtfV09STERfMV0gPSAid29ybGQgMSI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8yXSA9ICJ3b3JsZCAyIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzNdID0gIndvcmxkIDMiOwotCWtleW5hbWVzW1NETEtfV09STERfNF0gPSAid29ybGQgNCI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF81XSA9ICJ3b3JsZCA1IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzZdID0gIndvcmxkIDYiOwotCWtleW5hbWVzW1NETEtfV09STERfN10gPSAid29ybGQgNyI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF84XSA9ICJ3b3JsZCA4IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzldID0gIndvcmxkIDkiOwotCWtleW5hbWVzW1NETEtfV09STERfMTBdID0gIndvcmxkIDEwIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzExXSA9ICJ3b3JsZCAxMSI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8xMl0gPSAid29ybGQgMTIiOwotCWtleW5hbWVzW1NETEtfV09STERfMTNdID0gIndvcmxkIDEzIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzE0XSA9ICJ3b3JsZCAxNCI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8xNV0gPSAid29ybGQgMTUiOwotCWtleW5hbWVzW1NETEtfV09STERfMTZdID0gIndvcmxkIDE2IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzE3XSA9ICJ3b3JsZCAxNyI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8xOF0gPSAid29ybGQgMTgiOwotCWtleW5hbWVzW1NETEtfV09STERfMTldID0gIndvcmxkIDE5IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzIwXSA9ICJ3b3JsZCAyMCI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8yMV0gPSAid29ybGQgMjEiOwotCWtleW5hbWVzW1NETEtfV09STERfMjJdID0gIndvcmxkIDIyIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzIzXSA9ICJ3b3JsZCAyMyI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8yNF0gPSAid29ybGQgMjQiOwotCWtleW5hbWVzW1NETEtfV09STERfMjVdID0gIndvcmxkIDI1IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzI2XSA9ICJ3b3JsZCAyNiI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8yN10gPSAid29ybGQgMjciOwotCWtleW5hbWVzW1NETEtfV09STERfMjhdID0gIndvcmxkIDI4IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzI5XSA9ICJ3b3JsZCAyOSI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8zMF0gPSAid29ybGQgMzAiOwotCWtleW5hbWVzW1NETEtfV09STERfMzFdID0gIndvcmxkIDMxIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzMyXSA9ICJ3b3JsZCAzMiI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8zM10gPSAid29ybGQgMzMiOwotCWtleW5hbWVzW1NETEtfV09STERfMzRdID0gIndvcmxkIDM0IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzM1XSA9ICJ3b3JsZCAzNSI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8zNl0gPSAid29ybGQgMzYiOwotCWtleW5hbWVzW1NETEtfV09STERfMzddID0gIndvcmxkIDM3IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzM4XSA9ICJ3b3JsZCAzOCI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF8zOV0gPSAid29ybGQgMzkiOwotCWtleW5hbWVzW1NETEtfV09STERfNDBdID0gIndvcmxkIDQwIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzQxXSA9ICJ3b3JsZCA0MSI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF80Ml0gPSAid29ybGQgNDIiOwotCWtleW5hbWVzW1NETEtfV09STERfNDNdID0gIndvcmxkIDQzIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzQ0XSA9ICJ3b3JsZCA0NCI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF80NV0gPSAid29ybGQgNDUiOwotCWtleW5hbWVzW1NETEtfV09STERfNDZdID0gIndvcmxkIDQ2IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzQ3XSA9ICJ3b3JsZCA0NyI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF80OF0gPSAid29ybGQgNDgiOwotCWtleW5hbWVzW1NETEtfV09STERfNDldID0gIndvcmxkIDQ5IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzUwXSA9ICJ3b3JsZCA1MCI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF81MV0gPSAid29ybGQgNTEiOwotCWtleW5hbWVzW1NETEtfV09STERfNTJdID0gIndvcmxkIDUyIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzUzXSA9ICJ3b3JsZCA1MyI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF81NF0gPSAid29ybGQgNTQiOwotCWtleW5hbWVzW1NETEtfV09STERfNTVdID0gIndvcmxkIDU1IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzU2XSA9ICJ3b3JsZCA1NiI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF81N10gPSAid29ybGQgNTciOwotCWtleW5hbWVzW1NETEtfV09STERfNThdID0gIndvcmxkIDU4IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzU5XSA9ICJ3b3JsZCA1OSI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF82MF0gPSAid29ybGQgNjAiOwotCWtleW5hbWVzW1NETEtfV09STERfNjFdID0gIndvcmxkIDYxIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzYyXSA9ICJ3b3JsZCA2MiI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF82M10gPSAid29ybGQgNjMiOwotCWtleW5hbWVzW1NETEtfV09STERfNjRdID0gIndvcmxkIDY0IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzY1XSA9ICJ3b3JsZCA2NSI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF82Nl0gPSAid29ybGQgNjYiOwotCWtleW5hbWVzW1NETEtfV09STERfNjddID0gIndvcmxkIDY3IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzY4XSA9ICJ3b3JsZCA2OCI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF82OV0gPSAid29ybGQgNjkiOwotCWtleW5hbWVzW1NETEtfV09STERfNzBdID0gIndvcmxkIDcwIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzcxXSA9ICJ3b3JsZCA3MSI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF83Ml0gPSAid29ybGQgNzIiOwotCWtleW5hbWVzW1NETEtfV09STERfNzNdID0gIndvcmxkIDczIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzc0XSA9ICJ3b3JsZCA3NCI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF83NV0gPSAid29ybGQgNzUiOwotCWtleW5hbWVzW1NETEtfV09STERfNzZdID0gIndvcmxkIDc2IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzc3XSA9ICJ3b3JsZCA3NyI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF83OF0gPSAid29ybGQgNzgiOwotCWtleW5hbWVzW1NETEtfV09STERfNzldID0gIndvcmxkIDc5IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzgwXSA9ICJ3b3JsZCA4MCI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF84MV0gPSAid29ybGQgODEiOwotCWtleW5hbWVzW1NETEtfV09STERfODJdID0gIndvcmxkIDgyIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzgzXSA9ICJ3b3JsZCA4MyI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF84NF0gPSAid29ybGQgODQiOwotCWtleW5hbWVzW1NETEtfV09STERfODVdID0gIndvcmxkIDg1IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzg2XSA9ICJ3b3JsZCA4NiI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF84N10gPSAid29ybGQgODciOwotCWtleW5hbWVzW1NETEtfV09STERfODhdID0gIndvcmxkIDg4IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzg5XSA9ICJ3b3JsZCA4OSI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF85MF0gPSAid29ybGQgOTAiOwotCWtleW5hbWVzW1NETEtfV09STERfOTFdID0gIndvcmxkIDkxIjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzkyXSA9ICJ3b3JsZCA5MiI7Ci0Ja2V5bmFtZXNbU0RMS19XT1JMRF85M10gPSAid29ybGQgOTMiOwotCWtleW5hbWVzW1NETEtfV09STERfOTRdID0gIndvcmxkIDk0IjsKLQlrZXluYW1lc1tTRExLX1dPUkxEXzk1XSA9ICJ3b3JsZCA5NSI7Ci0KLQlrZXluYW1lc1tTRExLX0tQMF0gPSAiWzBdIjsKLQlrZXluYW1lc1tTRExLX0tQMV0gPSAiWzFdIjsKLQlrZXluYW1lc1tTRExLX0tQMl0gPSAiWzJdIjsKLQlrZXluYW1lc1tTRExLX0tQM10gPSAiWzNdIjsKLQlrZXluYW1lc1tTRExLX0tQNF0gPSAiWzRdIjsKLQlrZXluYW1lc1tTRExLX0tQNV0gPSAiWzVdIjsKLQlrZXluYW1lc1tTRExLX0tQNl0gPSAiWzZdIjsKLQlrZXluYW1lc1tTRExLX0tQN10gPSAiWzddIjsKLQlrZXluYW1lc1tTRExLX0tQOF0gPSAiWzhdIjsKLQlrZXluYW1lc1tTRExLX0tQOV0gPSAiWzldIjsKLQlrZXluYW1lc1tTRExLX0tQX1BFUklPRF0gPSAiWy5dIjsKLQlrZXluYW1lc1tTRExLX0tQX0RJVklERV0gPSAiWy9dIjsKLQlrZXluYW1lc1tTRExLX0tQX01VTFRJUExZXSA9ICJbKl0iOwotCWtleW5hbWVzW1NETEtfS1BfTUlOVVNdID0gIlstXSI7Ci0Ja2V5bmFtZXNbU0RMS19LUF9QTFVTXSA9ICJbK10iOwotCWtleW5hbWVzW1NETEtfS1BfRU5URVJdID0gImVudGVyIjsKLQlrZXluYW1lc1tTRExLX0tQX0VRVUFMU10gPSAiZXF1YWxzIjsKLQotCWtleW5hbWVzW1NETEtfVVBdID0gInVwIjsKLQlrZXluYW1lc1tTRExLX0RPV05dID0gImRvd24iOwotCWtleW5hbWVzW1NETEtfUklHSFRdID0gInJpZ2h0IjsKLQlrZXluYW1lc1tTRExLX0xFRlRdID0gImxlZnQiOwotCWtleW5hbWVzW1NETEtfRE9XTl0gPSAiZG93biI7Ci0Ja2V5bmFtZXNbU0RMS19JTlNFUlRdID0gImluc2VydCI7Ci0Ja2V5bmFtZXNbU0RMS19IT01FXSA9ICJob21lIjsKLQlrZXluYW1lc1tTRExLX0VORF0gPSAiZW5kIjsKLQlrZXluYW1lc1tTRExLX1BBR0VVUF0gPSAicGFnZSB1cCI7Ci0Ja2V5bmFtZXNbU0RMS19QQUdFRE9XTl0gPSAicGFnZSBkb3duIjsKLQotCWtleW5hbWVzW1NETEtfRjFdID0gImYxIjsKLQlrZXluYW1lc1tTRExLX0YyXSA9ICJmMiI7Ci0Ja2V5bmFtZXNbU0RMS19GM10gPSAiZjMiOwotCWtleW5hbWVzW1NETEtfRjRdID0gImY0IjsKLQlrZXluYW1lc1tTRExLX0Y1XSA9ICJmNSI7Ci0Ja2V5bmFtZXNbU0RMS19GNl0gPSAiZjYiOwotCWtleW5hbWVzW1NETEtfRjddID0gImY3IjsKLQlrZXluYW1lc1tTRExLX0Y4XSA9ICJmOCI7Ci0Ja2V5bmFtZXNbU0RMS19GOV0gPSAiZjkiOwotCWtleW5hbWVzW1NETEtfRjEwXSA9ICJmMTAiOwotCWtleW5hbWVzW1NETEtfRjExXSA9ICJmMTEiOwotCWtleW5hbWVzW1NETEtfRjEyXSA9ICJmMTIiOwotCWtleW5hbWVzW1NETEtfRjEzXSA9ICJmMTMiOwotCWtleW5hbWVzW1NETEtfRjE0XSA9ICJmMTQiOwotCWtleW5hbWVzW1NETEtfRjE1XSA9ICJmMTUiOwotCi0Ja2V5bmFtZXNbU0RMS19OVU1MT0NLXSA9ICJudW1sb2NrIjsKLQlrZXluYW1lc1tTRExLX0NBUFNMT0NLXSA9ICJjYXBzIGxvY2siOwotCWtleW5hbWVzW1NETEtfU0NST0xMT0NLXSA9ICJzY3JvbGwgbG9jayI7Ci0Ja2V5bmFtZXNbU0RMS19SU0hJRlRdID0gInJpZ2h0IHNoaWZ0IjsKLQlrZXluYW1lc1tTRExLX0xTSElGVF0gPSAibGVmdCBzaGlmdCI7Ci0Ja2V5bmFtZXNbU0RMS19SQ1RSTF0gPSAicmlnaHQgY3RybCI7Ci0Ja2V5bmFtZXNbU0RMS19MQ1RSTF0gPSAibGVmdCBjdHJsIjsKLQlrZXluYW1lc1tTRExLX1JBTFRdID0gInJpZ2h0IGFsdCI7Ci0Ja2V5bmFtZXNbU0RMS19MQUxUXSA9ICJsZWZ0IGFsdCI7Ci0Ja2V5bmFtZXNbU0RMS19STUVUQV0gPSAicmlnaHQgbWV0YSI7Ci0Ja2V5bmFtZXNbU0RMS19MTUVUQV0gPSAibGVmdCBtZXRhIjsKLQlrZXluYW1lc1tTRExLX0xTVVBFUl0gPSAibGVmdCBzdXBlciI7CS8qICJXaW5kb3dzIiBrZXlzICovCi0Ja2V5bmFtZXNbU0RMS19SU1VQRVJdID0gInJpZ2h0IHN1cGVyIjsJCi0Ja2V5bmFtZXNbU0RMS19NT0RFXSA9ICJhbHQgZ3IiOwotCWtleW5hbWVzW1NETEtfQ09NUE9TRV0gPSAiY29tcG9zZSI7Ci0KLQlrZXluYW1lc1tTRExLX0hFTFBdID0gImhlbHAiOwotCWtleW5hbWVzW1NETEtfUFJJTlRdID0gInByaW50IHNjcmVlbiI7Ci0Ja2V5bmFtZXNbU0RMS19TWVNSRVFdID0gInN5cyByZXEiOwotCWtleW5hbWVzW1NETEtfQlJFQUtdID0gImJyZWFrIjsKLQlrZXluYW1lc1tTRExLX01FTlVdID0gIm1lbnUiOwotCWtleW5hbWVzW1NETEtfUE9XRVJdID0gInBvd2VyIjsKLQlrZXluYW1lc1tTRExLX0VVUk9dID0gImV1cm8iOwotCWtleW5hbWVzW1NETEtfVU5ET10gPSAidW5kbyI7Ci0KLQkvKiBEb25lLiAgV2hldy4gKi8KLQlyZXR1cm4oMCk7Ci19Ci12b2lkIFNETF9LZXlib2FyZFF1aXQodm9pZCkKLXsKLX0KLQotLyogV2UgbG9zdCB0aGUga2V5Ym9hcmQsIHNvIHBvc3Qga2V5IHVwIG1lc3NhZ2VzIGZvciBhbGwgcHJlc3NlZCBrZXlzICovCi12b2lkIFNETF9SZXNldEtleWJvYXJkKHZvaWQpCi17Ci0JU0RMX2tleXN5bSBrZXlzeW07Ci0JU0RMS2V5IGtleTsKLQotCVNETF9tZW1zZXQoJmtleXN5bSwgMCwgKHNpemVvZiBrZXlzeW0pKTsKLQlmb3IgKCBrZXk9U0RMS19GSVJTVDsga2V5PFNETEtfTEFTVDsgKytrZXkgKSB7Ci0JCWlmICggU0RMX0tleVN0YXRlW2tleV0gPT0gU0RMX1BSRVNTRUQgKSB7Ci0JCQlrZXlzeW0uc3ltID0ga2V5OwotCQkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsICZrZXlzeW0pOwotCQl9Ci0JfQotCVNETF9LZXlSZXBlYXQudGltZXN0YW1wID0gMDsKLX0KLQotaW50IFNETF9FbmFibGVVTklDT0RFKGludCBlbmFibGUpCi17Ci0JaW50IG9sZF9tb2RlOwotCi0Jb2xkX21vZGUgPSBTRExfVHJhbnNsYXRlVU5JQ09ERTsKLQlpZiAoIGVuYWJsZSA+PSAwICkgewotCQlTRExfVHJhbnNsYXRlVU5JQ09ERSA9IGVuYWJsZTsKLQl9Ci0JcmV0dXJuKG9sZF9tb2RlKTsKLX0KLQotVWludDggKiBTRExfR2V0S2V5U3RhdGUgKGludCAqbnVta2V5cykKLXsKLQlpZiAoIG51bWtleXMgIT0gKGludCAqKTAgKQotCQkqbnVta2V5cyA9IFNETEtfTEFTVDsKLQlyZXR1cm4oU0RMX0tleVN0YXRlKTsKLX0KLVNETE1vZCBTRExfR2V0TW9kU3RhdGUgKHZvaWQpCi17Ci0JcmV0dXJuKFNETF9Nb2RTdGF0ZSk7Ci19Ci12b2lkIFNETF9TZXRNb2RTdGF0ZSAoU0RMTW9kIG1vZHN0YXRlKQotewotCVNETF9Nb2RTdGF0ZSA9IG1vZHN0YXRlOwotfQotCi1jaGFyICpTRExfR2V0S2V5TmFtZShTRExLZXkga2V5KQotewotCWNvbnN0IGNoYXIgKmtleW5hbWU7Ci0KLQlrZXluYW1lID0gTlVMTDsKLQlpZiAoIGtleSA8IFNETEtfTEFTVCApIHsKLQkJa2V5bmFtZSA9IGtleW5hbWVzW2tleV07Ci0JfQotCWlmICgga2V5bmFtZSA9PSBOVUxMICkgewotCQlrZXluYW1lID0gInVua25vd24ga2V5IjsKLQl9Ci0JLyogRklYTUU6IG1ha2UgdGhpcyBmdW5jdGlvbiBjb25zdCBpbiAxLjMgKi8KLQlyZXR1cm4gKGNoYXIgKikoa2V5bmFtZSk7Ci19Ci0KLS8qIFRoZXNlIGFyZSBnbG9iYWwgZm9yIFNETF9ldmVudGxvb3AuYyAqLwotaW50IFNETF9Qcml2YXRlS2V5Ym9hcmQoVWludDggc3RhdGUsIFNETF9rZXlzeW0gKmtleXN5bSkKLXsKLQlTRExfRXZlbnQgZXZlbnQ7Ci0JaW50IHBvc3RlZCwgcmVwZWF0YWJsZTsKLQlVaW50MTYgbW9kc3RhdGU7Ci0KLQlTRExfbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7Ci0KLSNpZiAwCi1wcmludGYoIlRoZSAnJXMnIGtleSBoYXMgYmVlbiAlc1xuIiwgU0RMX0dldEtleU5hbWUoa2V5c3ltLT5zeW0pLCAKLQkJCQlzdGF0ZSA9PSBTRExfUFJFU1NFRCA/ICJwcmVzc2VkIiA6ICJyZWxlYXNlZCIpOwotI2VuZGlmCi0JLyogU2V0IHVwIHRoZSBrZXlzeW0gKi8KLQltb2RzdGF0ZSA9IChVaW50MTYpU0RMX01vZFN0YXRlOwotCi0JcmVwZWF0YWJsZSA9IDA7Ci0KLQlpZiAoIHN0YXRlID09IFNETF9QUkVTU0VEICkgewotCQlrZXlzeW0tPm1vZCA9IChTRExNb2QpbW9kc3RhdGU7Ci0JCXN3aXRjaCAoa2V5c3ltLT5zeW0pIHsKLQkJCWNhc2UgU0RMS19VTktOT1dOOgotCQkJCWJyZWFrOwotCQkJY2FzZSBTRExLX05VTUxPQ0s6Ci0JCQkJbW9kc3RhdGUgXj0gS01PRF9OVU07Ci0JCQkJaWYgKCAhIChtb2RzdGF0ZSZLTU9EX05VTSkgKQotCQkJCQlzdGF0ZSA9IFNETF9SRUxFQVNFRDsKLQkJCQlrZXlzeW0tPm1vZCA9IChTRExNb2QpbW9kc3RhdGU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNETEtfQ0FQU0xPQ0s6Ci0JCQkJbW9kc3RhdGUgXj0gS01PRF9DQVBTOwotCQkJCWlmICggISAobW9kc3RhdGUmS01PRF9DQVBTKSApCi0JCQkJCXN0YXRlID0gU0RMX1JFTEVBU0VEOwotCQkJCWtleXN5bS0+bW9kID0gKFNETE1vZCltb2RzdGF0ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0RMS19MQ1RSTDoKLQkJCQltb2RzdGF0ZSB8PSBLTU9EX0xDVFJMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTRExLX1JDVFJMOgotCQkJCW1vZHN0YXRlIHw9IEtNT0RfUkNUUkw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNETEtfTFNISUZUOgotCQkJCW1vZHN0YXRlIHw9IEtNT0RfTFNISUZUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTRExLX1JTSElGVDoKLQkJCQltb2RzdGF0ZSB8PSBLTU9EX1JTSElGVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0RMS19MQUxUOgotCQkJCW1vZHN0YXRlIHw9IEtNT0RfTEFMVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0RMS19SQUxUOgotCQkJCW1vZHN0YXRlIHw9IEtNT0RfUkFMVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0RMS19MTUVUQToKLQkJCQltb2RzdGF0ZSB8PSBLTU9EX0xNRVRBOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTRExLX1JNRVRBOgotCQkJCW1vZHN0YXRlIHw9IEtNT0RfUk1FVEE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNETEtfTU9ERToKLQkJCQltb2RzdGF0ZSB8PSBLTU9EX01PREU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJlcGVhdGFibGUgPSAxOwotCQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChrZXlzeW0tPnN5bSkgewotCQkJY2FzZSBTRExLX1VOS05PV046Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNETEtfTlVNTE9DSzoKLQkJCWNhc2UgU0RMS19DQVBTTE9DSzoKLQkJCQkvKiBPbmx5IHNlbmQga2V5ZG93biBldmVudHMgKi8KLQkJCQlyZXR1cm4oMCk7Ci0JCQljYXNlIFNETEtfTENUUkw6Ci0JCQkJbW9kc3RhdGUgJj0gfktNT0RfTENUUkw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNETEtfUkNUUkw6Ci0JCQkJbW9kc3RhdGUgJj0gfktNT0RfUkNUUkw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNETEtfTFNISUZUOgotCQkJCW1vZHN0YXRlICY9IH5LTU9EX0xTSElGVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0RMS19SU0hJRlQ6Ci0JCQkJbW9kc3RhdGUgJj0gfktNT0RfUlNISUZUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTRExLX0xBTFQ6Ci0JCQkJbW9kc3RhdGUgJj0gfktNT0RfTEFMVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0RMS19SQUxUOgotCQkJCW1vZHN0YXRlICY9IH5LTU9EX1JBTFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNETEtfTE1FVEE6Ci0JCQkJbW9kc3RhdGUgJj0gfktNT0RfTE1FVEE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNETEtfUk1FVEE6Ci0JCQkJbW9kc3RhdGUgJj0gfktNT0RfUk1FVEE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNETEtfTU9ERToKLQkJCQltb2RzdGF0ZSAmPSB+S01PRF9NT0RFOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQlrZXlzeW0tPm1vZCA9IChTRExNb2QpbW9kc3RhdGU7Ci0JfQotCi0JLyogRmlndXJlIG91dCB3aGF0IHR5cGUgb2YgZXZlbnQgdGhpcyBpcyAqLwotCXN3aXRjaCAoc3RhdGUpIHsKLQkJY2FzZSBTRExfUFJFU1NFRDoKLQkJCWV2ZW50LnR5cGUgPSBTRExfS0VZRE9XTjsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9SRUxFQVNFRDoKLQkJCWV2ZW50LnR5cGUgPSBTRExfS0VZVVA7Ci0JCQkvKgotCQkJICogamsgOTkxMjE1IC0gQWRkZWQKLQkJCSAqLwotCQkJaWYgKCBTRExfS2V5UmVwZWF0LnRpbWVzdGFtcCAmJgotCQkJICAgICBTRExfS2V5UmVwZWF0LmV2dC5rZXkua2V5c3ltLnN5bSA9PSBrZXlzeW0tPnN5bSApIHsKLQkJCQlTRExfS2V5UmVwZWF0LnRpbWVzdGFtcCA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIEludmFsaWQgc3RhdGUgLS0gYmFpbCAqLwotCQkJcmV0dXJuKDApOwotCX0KLQotCWlmICgga2V5c3ltLT5zeW0gIT0gU0RMS19VTktOT1dOICkgewotCQkvKiBEcm9wIGV2ZW50cyB0aGF0IGRvbid0IGNoYW5nZSBzdGF0ZSAqLwotCQlpZiAoIFNETF9LZXlTdGF0ZVtrZXlzeW0tPnN5bV0gPT0gc3RhdGUgKSB7Ci0jaWYgMAotcHJpbnRmKCJLZXlib2FyZCBldmVudCBkaWRuJ3QgY2hhbmdlIHN0YXRlIC0gZHJvcHBlZCFcbiIpOwotI2VuZGlmCi0JCQlyZXR1cm4oMCk7Ci0JCX0KLQotCQkvKiBVcGRhdGUgaW50ZXJuYWwga2V5Ym9hcmQgc3RhdGUgKi8KLQkJU0RMX01vZFN0YXRlID0gKFNETE1vZCltb2RzdGF0ZTsKLQkJU0RMX0tleVN0YXRlW2tleXN5bS0+c3ltXSA9IHN0YXRlOwotCX0KLQotCS8qIFBvc3QgdGhlIGV2ZW50LCBpZiBkZXNpcmVkICovCi0JcG9zdGVkID0gMDsKLQlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW2V2ZW50LnR5cGVdID09IFNETF9FTkFCTEUgKSB7Ci0JCWV2ZW50LmtleS5zdGF0ZSA9IHN0YXRlOwotCQlldmVudC5rZXkua2V5c3ltID0gKmtleXN5bTsKLQkJLyoKLQkJICogamsgOTkxMjE1IC0gQWRkZWQKLQkJICovCi0JCWlmIChyZXBlYXRhYmxlICYmIChTRExfS2V5UmVwZWF0LmRlbGF5ICE9IDApKSB7Ci0JCQlTRExfS2V5UmVwZWF0LmV2dCA9IGV2ZW50OwotCQkJU0RMX0tleVJlcGVhdC5maXJzdHRpbWUgPSAxOwotCQkJU0RMX0tleVJlcGVhdC50aW1lc3RhbXA9U0RMX0dldFRpY2tzKCk7Ci0JCX0KLQkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgU0RMX0V2ZW50T0soJmV2ZW50KSApIHsKLQkJCXBvc3RlZCA9IDE7Ci0JCQlTRExfUHVzaEV2ZW50KCZldmVudCk7Ci0JCX0KLQl9Ci0JcmV0dXJuKHBvc3RlZCk7Ci19Ci0KLS8qCi0gKiBqayA5OTEyMTUgLSBBZGRlZAotICovCi12b2lkIFNETF9DaGVja0tleVJlcGVhdCh2b2lkKQotewotCWlmICggU0RMX0tleVJlcGVhdC50aW1lc3RhbXAgKSB7Ci0JCVVpbnQzMiBub3csIGludGVydmFsOwotCi0JCW5vdyA9IFNETF9HZXRUaWNrcygpOwotCQlpbnRlcnZhbCA9IChub3cgLSBTRExfS2V5UmVwZWF0LnRpbWVzdGFtcCk7Ci0JCWlmICggU0RMX0tleVJlcGVhdC5maXJzdHRpbWUgKSB7Ci0JCQlpZiAoIGludGVydmFsID4gKFVpbnQzMilTRExfS2V5UmVwZWF0LmRlbGF5ICkgewotCQkJCVNETF9LZXlSZXBlYXQudGltZXN0YW1wID0gbm93OwotCQkJCVNETF9LZXlSZXBlYXQuZmlyc3R0aW1lID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICggaW50ZXJ2YWwgPiAoVWludDMyKVNETF9LZXlSZXBlYXQuaW50ZXJ2YWwgKSB7Ci0JCQkJU0RMX0tleVJlcGVhdC50aW1lc3RhbXAgPSBub3c7Ci0JCQkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgU0RMX0V2ZW50T0soJlNETF9LZXlSZXBlYXQuZXZ0KSApIHsKLQkJCQkJU0RMX1B1c2hFdmVudCgmU0RMX0tleVJlcGVhdC5ldnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotaW50IFNETF9FbmFibGVLZXlSZXBlYXQoaW50IGRlbGF5LCBpbnQgaW50ZXJ2YWwpCi17Ci0JaWYgKCAoZGVsYXkgPCAwKSB8fCAoaW50ZXJ2YWwgPCAwKSApIHsKLQkJU0RMX1NldEVycm9yKCJrZXlib2FyZCByZXBlYXQgdmFsdWUgbGVzcyB0aGFuIHplcm8iKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JU0RMX0tleVJlcGVhdC5maXJzdHRpbWUgPSAwOwotCVNETF9LZXlSZXBlYXQuZGVsYXkgPSBkZWxheTsKLQlTRExfS2V5UmVwZWF0LmludGVydmFsID0gaW50ZXJ2YWw7Ci0JU0RMX0tleVJlcGVhdC50aW1lc3RhbXAgPSAwOwotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfR2V0S2V5UmVwZWF0KGludCAqZGVsYXksIGludCAqaW50ZXJ2YWwpCi17Ci0JKmRlbGF5ID0gU0RMX0tleVJlcGVhdC5kZWxheTsKLQkqaW50ZXJ2YWwgPSBTRExfS2V5UmVwZWF0LmludGVydmFsOwotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvZXZlbnRzL1NETF9tb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzJlZjNjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvZXZlbnRzL1NETF9tb3VzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBHZW5lcmFsIG1vdXNlIGhhbmRsaW5nIGNvZGUgZm9yIFNETCAqLwotCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIi4uL3ZpZGVvL1NETF9jdXJzb3JfYy5oIgotI2luY2x1ZGUgIi4uL3ZpZGVvL1NETF9zeXN2aWRlby5oIgotCi0KLS8qIFRoZXNlIGFyZSBzdGF0aWMgZm9yIG91ciBtb3VzZSBoYW5kbGluZyBjb2RlICovCi1zdGF0aWMgU2ludDE2IFNETF9Nb3VzZVggPSAwOwotc3RhdGljIFNpbnQxNiBTRExfTW91c2VZID0gMDsKLXN0YXRpYyBTaW50MTYgU0RMX0RlbHRhWCA9IDA7Ci1zdGF0aWMgU2ludDE2IFNETF9EZWx0YVkgPSAwOwotc3RhdGljIFVpbnQ4ICBTRExfQnV0dG9uU3RhdGUgPSAwOwotCi0KLS8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KLWludCBTRExfTW91c2VJbml0KHZvaWQpCi17Ci0JLyogVGhlIG1vdXNlIGlzIGF0ICgwLDApICovCi0JU0RMX01vdXNlWCA9IDA7Ci0JU0RMX01vdXNlWSA9IDA7Ci0JU0RMX0RlbHRhWCA9IDA7Ci0JU0RMX0RlbHRhWSA9IDA7Ci0JU0RMX0J1dHRvblN0YXRlID0gMDsKLQotCS8qIFRoYXQncyBpdCEgKi8KLQlyZXR1cm4oMCk7Ci19Ci12b2lkIFNETF9Nb3VzZVF1aXQodm9pZCkKLXsKLX0KLQotLyogV2UgbG9zdCB0aGUgbW91c2UsIHNvIHBvc3QgYnV0dG9uIHVwIG1lc3NhZ2VzIGZvciBhbGwgcHJlc3NlZCBidXR0b25zICovCi12b2lkIFNETF9SZXNldE1vdXNlKHZvaWQpCi17Ci0JVWludDggaTsKLQlmb3IgKCBpID0gMDsgaSA8IHNpemVvZihTRExfQnV0dG9uU3RhdGUpKjg7ICsraSApIHsKLQkJaWYgKCBTRExfQnV0dG9uU3RhdGUgJiBTRExfQlVUVE9OKGkpICkgewotCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIGksIDAsIDApOwotCQl9Ci0JfQotfQotCi1VaW50OCBTRExfR2V0TW91c2VTdGF0ZSAoaW50ICp4LCBpbnQgKnkpCi17Ci0JaWYgKCB4ICkgewotCQkqeCA9IFNETF9Nb3VzZVg7Ci0JfQotCWlmICggeSApIHsKLQkJKnkgPSBTRExfTW91c2VZOwotCX0KLQlyZXR1cm4oU0RMX0J1dHRvblN0YXRlKTsKLX0KLQotVWludDggU0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZSAoaW50ICp4LCBpbnQgKnkpCi17Ci0JaWYgKCB4ICkKLQkJKnggPSBTRExfRGVsdGFYOwotCWlmICggeSApCi0JCSp5ID0gU0RMX0RlbHRhWTsKLQlTRExfRGVsdGFYID0gMDsKLQlTRExfRGVsdGFZID0gMDsKLQlyZXR1cm4oU0RMX0J1dHRvblN0YXRlKTsKLX0KLQotc3RhdGljIHZvaWQgQ2xpcE9mZnNldChTaW50MTYgKngsIFNpbnQxNiAqeSkKLXsKLQkvKiBUaGlzIGNsaXBzIGFic29sdXRlIG1vdXNlIGNvb3JkaW5hdGVzIHdoZW4gdGhlIGFwcGFyZW50Ci0JICAgZGlzcGxheSBzdXJmYWNlIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVhbCBkaXNwbGF5IHN1cmZhY2UuCi0JICovCi0JaWYgKCBTRExfVmlkZW9TdXJmYWNlLT5vZmZzZXQgKSB7Ci0JCSp5IC09IFNETF9WaWRlb1N1cmZhY2UtPm9mZnNldC9TRExfVmlkZW9TdXJmYWNlLT5waXRjaDsKLQkJKnggLT0gKFNETF9WaWRlb1N1cmZhY2UtPm9mZnNldCVTRExfVmlkZW9TdXJmYWNlLT5waXRjaCkvCi0JCQkJU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCX0KLX0KLQotLyogVGhlc2UgYXJlIGdsb2JhbCBmb3IgU0RMX2V2ZW50bG9vcC5jICovCi1pbnQgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbihVaW50OCBidXR0b25zdGF0ZSwgaW50IHJlbGF0aXZlLCBTaW50MTYgeCwgU2ludDE2IHkpCi17Ci0JaW50IHBvc3RlZDsKLQlVaW50MTYgWCwgWTsKLQlTaW50MTYgWHJlbDsKLQlTaW50MTYgWXJlbDsKLQotCS8qIERvbid0IGhhbmRsZSBtb3VzZSBtb3Rpb24gaWYgdGhlcmUncyBubyBjdXJzb3Igc3VyZmFjZSAqLwotCWlmICggU0RMX1ZpZGVvU3VyZmFjZSA9PSBOVUxMICkgewotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyogRGVmYXVsdCBidXR0b25zdGF0ZSBpcyB0aGUgY3VycmVudCBvbmUgKi8KLQlpZiAoICEgYnV0dG9uc3RhdGUgKSB7Ci0JCWJ1dHRvbnN0YXRlID0gU0RMX0J1dHRvblN0YXRlOwotCX0KLQotCVhyZWwgPSB4OwotCVlyZWwgPSB5OwotCWlmICggcmVsYXRpdmUgKSB7Ci0JCS8qIFB1c2ggdGhlIGN1cnNvciBhcm91bmQgKi8KLQkJeCA9IChTRExfTW91c2VYK3gpOwotCQl5ID0gKFNETF9Nb3VzZVkreSk7Ci0JfSBlbHNlIHsKLQkJLyogRG8gd2UgbmVlZCB0byBjbGlwIHt4LHl9ID8gKi8KLQkJQ2xpcE9mZnNldCgmeCwgJnkpOwotCX0KLQotCS8qIE1vdXNlIGNvb3JkaW5hdGVzIHJhbmdlIGZyb20gMCAtIHdpZHRoLTEgYW5kIDAgLSBoZWlnaHQtMSAqLwotCWlmICggeCA8IDAgKQotCQlYID0gMDsKLQllbHNlCi0JaWYgKCB4ID49IFNETF9WaWRlb1N1cmZhY2UtPncgKQotCQlYID0gU0RMX1ZpZGVvU3VyZmFjZS0+dy0xOwotCWVsc2UKLQkJWCA9IChVaW50MTYpeDsKLQotCWlmICggeSA8IDAgKQotCQlZID0gMDsKLQllbHNlCi0JaWYgKCB5ID49IFNETF9WaWRlb1N1cmZhY2UtPmggKQotCQlZID0gU0RMX1ZpZGVvU3VyZmFjZS0+aC0xOwotCWVsc2UKLQkJWSA9IChVaW50MTYpeTsKLQotCS8qIElmIG5vdCByZWxhdGl2ZSBtb2RlLCBnZW5lcmF0ZSByZWxhdGl2ZSBtb3Rpb24gZnJvbSBjbGFtcGVkIFgvWS4KLQkgICBUaGlzIHByZXZlbnRzIGxvdHMgb2YgZXh0cmFuZW91cyBsYXJnZSBkZWx0YSByZWxhdGl2ZSBtb3Rpb24gd2hlbgotCSAgIHRoZSBzY3JlZW4gaXMgd2luZG93ZWQgbW9kZSBhbmQgdGhlIG1vdXNlIGlzIG91dHNpZGUgdGhlIHdpbmRvdy4KLQkqLwotCWlmICggISByZWxhdGl2ZSApIHsKLQkJWHJlbCA9IFgtU0RMX01vdXNlWDsKLQkJWXJlbCA9IFktU0RMX01vdXNlWTsKLQl9Ci0KLQkvKiBEcm9wIGV2ZW50cyB0aGF0IGRvbid0IGNoYW5nZSBzdGF0ZSAqLwotCWlmICggISBYcmVsICYmICEgWXJlbCApIHsKLSNpZiAwCi1wcmludGYoIk1vdXNlIGV2ZW50IGRpZG4ndCBjaGFuZ2Ugc3RhdGUgLSBkcm9wcGVkIVxuIik7Ci0jZW5kaWYKLQkJcmV0dXJuKDApOwotCX0KLQotCS8qIFVwZGF0ZSBpbnRlcm5hbCBtb3VzZSBzdGF0ZSAqLwotCVNETF9CdXR0b25TdGF0ZSA9IGJ1dHRvbnN0YXRlOwotCVNETF9Nb3VzZVggPSBYOwotCVNETF9Nb3VzZVkgPSBZOwotCVNETF9EZWx0YVggKz0gWHJlbDsKLQlTRExfRGVsdGFZICs9IFlyZWw7Ci0gICAgICAgIFNETF9Nb3ZlQ3Vyc29yKFNETF9Nb3VzZVgsIFNETF9Nb3VzZVkpOwotCi0JLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KLQlwb3N0ZWQgPSAwOwotCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX01PVVNFTU9USU9OXSA9PSBTRExfRU5BQkxFICkgewotCQlTRExfRXZlbnQgZXZlbnQ7Ci0JCVNETF9tZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKLQkJZXZlbnQudHlwZSA9IFNETF9NT1VTRU1PVElPTjsKLQkJZXZlbnQubW90aW9uLnN0YXRlID0gYnV0dG9uc3RhdGU7Ci0JCWV2ZW50Lm1vdGlvbi54ID0gWDsKLQkJZXZlbnQubW90aW9uLnkgPSBZOwotCQlldmVudC5tb3Rpb24ueHJlbCA9IFhyZWw7Ci0JCWV2ZW50Lm1vdGlvbi55cmVsID0gWXJlbDsKLQkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgKCpTRExfRXZlbnRPSykoJmV2ZW50KSApIHsKLQkJCXBvc3RlZCA9IDE7Ci0JCQlTRExfUHVzaEV2ZW50KCZldmVudCk7Ci0JCX0KLQl9Ci0JcmV0dXJuKHBvc3RlZCk7Ci19Ci0KLWludCBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFVpbnQ4IHN0YXRlLCBVaW50OCBidXR0b24sIFNpbnQxNiB4LCBTaW50MTYgeSkKLXsKLQlTRExfRXZlbnQgZXZlbnQ7Ci0JaW50IHBvc3RlZDsKLQlpbnQgbW92ZV9tb3VzZTsKLQlVaW50OCBidXR0b25zdGF0ZTsKLQotCVNETF9tZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKLQotCS8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLQlpZiAoIHggfHwgeSApIHsKLQkJQ2xpcE9mZnNldCgmeCwgJnkpOwotCQltb3ZlX21vdXNlID0gMTsKLQkJLyogTW91c2UgY29vcmRpbmF0ZXMgcmFuZ2UgZnJvbSAwIC0gd2lkdGgtMSBhbmQgMCAtIGhlaWdodC0xICovCi0JCWlmICggeCA8IDAgKQotCQkJeCA9IDA7Ci0JCWVsc2UKLQkJaWYgKCB4ID49IFNETF9WaWRlb1N1cmZhY2UtPncgKQotCQkJeCA9IFNETF9WaWRlb1N1cmZhY2UtPnctMTsKLQotCQlpZiAoIHkgPCAwICkKLQkJCXkgPSAwOwotCQllbHNlCi0JCWlmICggeSA+PSBTRExfVmlkZW9TdXJmYWNlLT5oICkKLQkJCXkgPSBTRExfVmlkZW9TdXJmYWNlLT5oLTE7Ci0JfSBlbHNlIHsKLQkJbW92ZV9tb3VzZSA9IDA7Ci0JfQotCWlmICggISB4ICkKLQkJeCA9IFNETF9Nb3VzZVg7Ci0JaWYgKCAhIHkgKQotCQl5ID0gU0RMX01vdXNlWTsKLQotCS8qIEZpZ3VyZSBvdXQgd2hpY2ggZXZlbnQgdG8gcGVyZm9ybSAqLwotCWJ1dHRvbnN0YXRlID0gU0RMX0J1dHRvblN0YXRlOwotCXN3aXRjaCAoIHN0YXRlICkgewotCQljYXNlIFNETF9QUkVTU0VEOgotCQkJZXZlbnQudHlwZSA9IFNETF9NT1VTRUJVVFRPTkRPV047Ci0JCQlidXR0b25zdGF0ZSB8PSBTRExfQlVUVE9OKGJ1dHRvbik7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfUkVMRUFTRUQ6Ci0JCQlldmVudC50eXBlID0gU0RMX01PVVNFQlVUVE9OVVA7Ci0JCQlidXR0b25zdGF0ZSAmPSB+U0RMX0JVVFRPTihidXR0b24pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBJbnZhbGlkIHN0YXRlIC0tIGJhaWwgKi8KLQkJCXJldHVybigwKTsKLQl9Ci0KLQkvKiBVcGRhdGUgaW50ZXJuYWwgbW91c2Ugc3RhdGUgKi8KLQlTRExfQnV0dG9uU3RhdGUgPSBidXR0b25zdGF0ZTsKLQlpZiAoIG1vdmVfbW91c2UgKSB7Ci0JCVNETF9Nb3VzZVggPSB4OwotCQlTRExfTW91c2VZID0geTsKLQkJU0RMX01vdmVDdXJzb3IoU0RMX01vdXNlWCwgU0RMX01vdXNlWSk7Ci0JfQotCi0JLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KLQlwb3N0ZWQgPSAwOwotCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbZXZlbnQudHlwZV0gPT0gU0RMX0VOQUJMRSApIHsKLQkJZXZlbnQuYnV0dG9uLnN0YXRlID0gc3RhdGU7Ci0JCWV2ZW50LmJ1dHRvbi5idXR0b24gPSBidXR0b247Ci0JCWV2ZW50LmJ1dHRvbi54ID0geDsKLQkJZXZlbnQuYnV0dG9uLnkgPSB5OwotCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgewotCQkJcG9zdGVkID0gMTsKLQkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKLQkJfQotCX0KLQlyZXR1cm4ocG9zdGVkKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX3F1aXQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvZXZlbnRzL1NETF9xdWl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWYzMjcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX3F1aXQuYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBHZW5lcmFsIHF1aXQgaGFuZGxpbmcgY29kZSBmb3IgU0RMICovCi0KLSNpZmRlZiBIQVZFX1NJR05BTF9ICi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzX2MuaCIKLQotCi0jaWZkZWYgSEFWRV9TSUdOQUxfSAotc3RhdGljIHZvaWQgU0RMX0hhbmRsZVNJRyhpbnQgc2lnKQotewotCS8qIFJlc2V0IHRoZSBzaWduYWwgaGFuZGxlciAqLwotCXNpZ25hbChzaWcsIFNETF9IYW5kbGVTSUcpOwotCi0JLyogU2lnbmFsIGEgcXVpdCBpbnRlcnJ1cHQgKi8KLQlTRExfUHJpdmF0ZVF1aXQoKTsKLX0KLSNlbmRpZiAvKiBIQVZFX1NJR05BTF9IICovCi0KLS8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KLWludCBTRExfUXVpdEluaXQodm9pZCkKLXsKLSNpZmRlZiBIQVZFX1NJR05BTF9ICi0Jdm9pZCAoKm9oYW5kbGVyKShpbnQpOwotCi0JLyogQm90aCBTSUdJTlQgYW5kIFNJR1RFUk0gYXJlIHRyYW5zbGF0ZWQgaW50byBxdWl0IGludGVycnVwdHMgKi8KLQlvaGFuZGxlciA9IHNpZ25hbChTSUdJTlQsIFNETF9IYW5kbGVTSUcpOwotCWlmICggb2hhbmRsZXIgIT0gU0lHX0RGTCApCi0JCXNpZ25hbChTSUdJTlQsIG9oYW5kbGVyKTsKLQlvaGFuZGxlciA9IHNpZ25hbChTSUdURVJNLCBTRExfSGFuZGxlU0lHKTsKLQlpZiAoIG9oYW5kbGVyICE9IFNJR19ERkwgKQotCQlzaWduYWwoU0lHVEVSTSwgb2hhbmRsZXIpOwotI2VuZGlmIC8qIEhBVkVfU0lHTkFMX0ggKi8KLQotCS8qIFRoYXQncyBpdCEgKi8KLQlyZXR1cm4oMCk7Ci19Ci12b2lkIFNETF9RdWl0UXVpdCh2b2lkKQotewotI2lmZGVmIEhBVkVfU0lHTkFMX0gKLQl2b2lkICgqb2hhbmRsZXIpKGludCk7Ci0KLQlvaGFuZGxlciA9IHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCWlmICggb2hhbmRsZXIgIT0gU0RMX0hhbmRsZVNJRyApCi0JCXNpZ25hbChTSUdJTlQsIG9oYW5kbGVyKTsKLQlvaGFuZGxlciA9IHNpZ25hbChTSUdURVJNLCBTSUdfREZMKTsKLQlpZiAoIG9oYW5kbGVyICE9IFNETF9IYW5kbGVTSUcgKQotCQlzaWduYWwoU0lHVEVSTSwgb2hhbmRsZXIpOwotI2VuZGlmIC8qIEhBVkVfU0lHTkFMX0ggKi8KLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgaXQncyBva2F5IHRvIGNsb3NlIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3cgKi8KLWludCBTRExfUHJpdmF0ZVF1aXQodm9pZCkKLXsKLQlpbnQgcG9zdGVkOwotCi0JcG9zdGVkID0gMDsKLQlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW1NETF9RVUlUXSA9PSBTRExfRU5BQkxFICkgewotCQlTRExfRXZlbnQgZXZlbnQ7Ci0JCWV2ZW50LnR5cGUgPSBTRExfUVVJVDsKLQkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgKCpTRExfRXZlbnRPSykoJmV2ZW50KSApIHsKLQkJCXBvc3RlZCA9IDE7Ci0JCQlTRExfUHVzaEV2ZW50KCZldmVudCk7Ci0JCX0KLQl9Ci0JcmV0dXJuKHBvc3RlZCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfcmVzaXplLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2V2ZW50cy9TRExfcmVzaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjVmNzAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX3Jlc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFJlc2l6ZSBldmVudCBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KLQotI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICIuLi92aWRlby9TRExfc3lzdmlkZW8uaCIKLQotCi0vKiBLZWVwIHRoZSBsYXN0IHJlc2l6ZSBldmVudCBzbyB3ZSBkb24ndCBwb3N0IGR1cGxpY2F0ZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgewotCWludCB3OwotCWludCBoOwotfSBsYXN0X3Jlc2l6ZTsKLQotLyogVGhpcyBpcyBnbG9iYWwgZm9yIFNETF9ldmVudGxvb3AuYyAqLwotaW50IFNETF9Qcml2YXRlUmVzaXplKGludCB3LCBpbnQgaCkKLXsKLQlpbnQgcG9zdGVkOwotCVNETF9FdmVudCBldmVudHNbMzJdOwotCi0JLyogU2VlIGlmIHRoaXMgZXZlbnQgd291bGQgY2hhbmdlIHRoZSB2aWRlbyBzdXJmYWNlICovCi0JaWYgKCAhdyB8fCAhaAotI2lmbmRlZiBfX09TMl9fCi0gICAgICAgICAgICB8fCAoKGxhc3RfcmVzaXplLncgPT0gdykgJiYgKGxhc3RfcmVzaXplLmggPT0gaCkpCi0jZW5kaWYKLSAgICApIHsKLQkJcmV0dXJuKDApOwotCX0KLSAgICAgICAgbGFzdF9yZXNpemUudyA9IHc7Ci0gICAgICAgIGxhc3RfcmVzaXplLmggPSBoOwotCWlmICggISBTRExfVmlkZW9TdXJmYWNlIHx8Ci0JICAgICAoKHcgPT0gU0RMX1ZpZGVvU3VyZmFjZS0+dykgJiYgKGggPT0gU0RMX1ZpZGVvU3VyZmFjZS0+aCkpICkgewotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyogUHVsbCBvdXQgYWxsIG9sZCByZXNpemUgZXZlbnRzICovCi0JU0RMX1BlZXBFdmVudHMoZXZlbnRzLCBzaXplb2YoZXZlbnRzKS9zaXplb2YoZXZlbnRzWzBdKSwKLQkgICAgICAgICAgICAgICAgICAgIFNETF9HRVRFVkVOVCwgU0RMX1ZJREVPUkVTSVpFTUFTSyk7Ci0KLQkvKiBQb3N0IHRoZSBldmVudCwgaWYgZGVzaXJlZCAqLwotCXBvc3RlZCA9IDA7Ci0JaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tTRExfVklERU9SRVNJWkVdID09IFNETF9FTkFCTEUgKSB7Ci0JCVNETF9FdmVudCBldmVudDsKLQkJZXZlbnQudHlwZSA9IFNETF9WSURFT1JFU0laRTsKLQkJZXZlbnQucmVzaXplLncgPSB3OwotCQlldmVudC5yZXNpemUuaCA9IGg7Ci0JCWlmICggKFNETF9FdmVudE9LID09IE5VTEwpIHx8ICgqU0RMX0V2ZW50T0spKCZldmVudCkgKSB7Ci0JCQlwb3N0ZWQgPSAxOwotCQkJU0RMX1B1c2hFdmVudCgmZXZlbnQpOwotCQl9Ci0JfQotCXJldHVybihwb3N0ZWQpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9ldmVudHMvU0RMX3N5c2V2ZW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Q1NWI0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvZXZlbnRzL1NETF9zeXNldmVudHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgU0RMX2ZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIi4uL3ZpZGVvL1NETF9zeXN2aWRlby5oIgotCi0vKiBVc2VmdWwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZnJvbSBTRExfc3lzZXZlbnRzLmMgKi8KLQotI2lmZGVmIF9fQkVPU19fCQkvKiBUaGUgQmUgZXZlbnQgbG9vcCBydW5zIGluIGEgc2VwYXJhdGUgdGhyZWFkICovCi0jZGVmaW5lIE1VU1RfVEhSRUFEX0VWRU5UUwotI2VuZGlmCi0KLSNpZmRlZiBfX1dJTjMyX18JLyogV2luMzIgZG9lc24ndCBhbGxvdyBhIHNlcGFyYXRlIGV2ZW50IHRocmVhZCAqLwotI2RlZmluZSBDQU5UX1RIUkVBRF9FVkVOVFMKLSNlbmRpZgotCi0jaWZkZWYgSVBPRAkJCS8qIGlQb2QgZG9lc24ndCBzdXBwb3J0IHRocmVhZGluZyBhdCBhbGwgKi8KLSNkZWZpbmUgQ0FOVF9USFJFQURfRVZFTlRTCi0jZW5kaWYKLQotI2lmZGVmIF9fTUFDT1NfXwkvKiBNYWNPUyA3LzggZG9uJ3Qgc3VwcG9ydCBwcmVlbXB0aXZlIG11bHRpLXRhc2tpbmcgKi8KLSNkZWZpbmUgQ0FOVF9USFJFQURfRVZFTlRTCi0jZW5kaWYKLQotI2lmZGVmIF9fT1MyX18JCS8qIFRoZSBPUy8yIGV2ZW50IGxvb3AgcnVucyBpbiBhIHNlcGFyYXRlIHRocmVhZCAqLwotI2RlZmluZSBNVVNUX1RIUkVBRF9FVkVOVFMKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9maWxlL1NETF9yd29wcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9maWxlL1NETF9yd29wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDYzYmYxLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvZmlsZS9TRExfcndvcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDYxMiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBmaWxlIHByb3ZpZGVzIGEgZ2VuZXJhbCBpbnRlcmZhY2UgZm9yIFNETCB0byByZWFkIGFuZCB3cml0ZQotICAgZGF0YSBzb3VyY2VzLiAgSXQgY2FuIGVhc2lseSBiZSBleHRlbmRlZCB0byBmaWxlcywgbWVtb3J5LCBldGMuCi0qLwotCi0jaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgotI2luY2x1ZGUgIlNETF9yd29wcy5oIgotCi0KLSNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLQotLyogRnVuY3Rpb25zIHRvIHJlYWQvd3JpdGUgV2luMzIgQVBJIGZpbGUgcG9pbnRlcnMgKi8KLS8qIFdpbGwgbm90IHVzZSBpdCBvbiBXaW5DRSBiZWNhdXNlIHN0ZGlvIGlzIGJ1ZmZlcmVkLCBpdCBtZWFucwotICAgZmFzdGVyLCBhbmQgYWxsIHN0ZGlvIGZ1bmN0aW9ucyBhbnl3YXkgYXJlIGVtYmVkZGVkIGluIGNvcmVkbGwuZGxsIC0gCi0gICB0aGUgbWFpbiB3aW5jZSBkbGwqLwotCi0jZGVmaW5lIFdJTkRPV1NfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2lmbmRlZiBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIKLSNkZWZpbmUgSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSIDB4RkZGRkZGRkYKLSNlbmRpZgotCi0jZGVmaW5lIFJFQURBSEVBRF9CVUZGRVJfU0laRQkxMDI0Ci0KLXN0YXRpYyBpbnQgU0RMQ0FMTCB3aW4zMl9maWxlX29wZW4oU0RMX1JXb3BzICpjb250ZXh0LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkKLXsKLSNpZm5kZWYgX1dJTjMyX1dDRQotCVVJTlQJb2xkX2Vycm9yX21vZGU7Ci0jZW5kaWYKLQlIQU5ETEUJaDsKLQlEV09SRAlyX3JpZ2h0LCB3X3JpZ2h0OwotCURXT1JECW11c3RfZXhpc3QsIHRydW5jYXRlOwotCWludAkJYV9tb2RlOwotCi0JaWYgKCFjb250ZXh0KQotCQlyZXR1cm4gLTE7IC8qIGZhaWxlZCAoaW52YWxpZCBjYWxsKSAqLwotCQkKLQljb250ZXh0LT5oaWRkZW4ud2luMzJpby5oID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IC8qIG1hcmsgdGhpcyBhcyB1bnVzYWJsZSAqLwotCWNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5kYXRhID0gTlVMTDsKLQljb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuc2l6ZSA9IDA7Ci0JY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmxlZnQgPSAwOwotCi0JLyogInIiID0gcmVhZGluZywgZmlsZSBtdXN0IGV4aXN0ICovCi0JLyogInciID0gd3JpdGluZywgdHJ1bmNhdGUgZXhpc3RpbmcsIGZpbGUgbWF5IG5vdCBleGlzdCAqLwotCS8qICJyKyI9IHJlYWRpbmcgb3Igd3JpdGluZywgZmlsZSBtdXN0IGV4aXN0ICAgICAgICAgICAgKi8KLQkvKiAiYSIgPSB3cml0aW5nLCBhcHBlbmQgZmlsZSBtYXkgbm90IGV4aXN0ICAgICAgICAgICAgICovCi0JLyogImErIj0gYXBwZW5kICsgcmVhZCwgZmlsZSBtYXkgbm90IGV4aXN0ICAgICAgICAgICAgICAqLwotCS8qICJ3KyIgPSByZWFkLCB3cml0ZSwgdHJ1bmNhdGUuIGZpbGUgbWF5IG5vdCBleGlzdCAgICAqLwotCQotCW11c3RfZXhpc3QgPSAoIFNETF9zdHJjaHIobW9kZSwncicpICE9IE5VTEwgKSA/IE9QRU5fRVhJU1RJTkcgOiAwOwotCXRydW5jYXRlICAgPSAoIFNETF9zdHJjaHIobW9kZSwndycpICE9IE5VTEwgKSA/IENSRUFURV9BTFdBWVMgOiAwOwotCXJfcmlnaHQgICAgPSAoIFNETF9zdHJjaHIobW9kZSwnKycpICE9IE5VTEwgfHwgbXVzdF9leGlzdCApID8gR0VORVJJQ19SRUFEIDogMDsKLQlhX21vZGUgICAgID0gKCBTRExfc3RyY2hyKG1vZGUsJ2EnKSAhPSBOVUxMICkgPyBPUEVOX0FMV0FZUyA6IDA7Ci0Jd19yaWdodCAgICA9ICggYV9tb2RlIHx8IFNETF9zdHJjaHIobW9kZSwnKycpIHx8IHRydW5jYXRlICkgPyBHRU5FUklDX1dSSVRFIDogMDsKLQotCWlmICghcl9yaWdodCAmJiAhd19yaWdodCkgLyogaW5jb25zaXN0ZW50IG1vZGUgKi8KLQkJcmV0dXJuIC0xOyAvKiBmYWlsZWQgKGludmFsaWQgY2FsbCkgKi8KLQotCWNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5kYXRhID0gKGNoYXIgKilTRExfbWFsbG9jKFJFQURBSEVBRF9CVUZGRVJfU0laRSk7Ci0JaWYgKCFjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuZGF0YSkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotI2lmZGVmIF9XSU4zMl9XQ0UKLQl7Ci0JCXNpemVfdCBzaXplID0gU0RMX3N0cmxlbihmaWxlbmFtZSkrMTsKLQkJd2NoYXJfdCAqZmlsZW5hbWVXID0gU0RMX3N0YWNrX2FsbG9jKHdjaGFyX3QsIHNpemUpOwotCi0JCWlmICggTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBmaWxlbmFtZSwgLTEsIGZpbGVuYW1lVywgc2l6ZSkgPT0gMCApIHsKLQkJCVNETF9zdGFja19mcmVlKGZpbGVuYW1lVyk7Ci0JCQlTRExfZnJlZShjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuZGF0YSk7Ci0JCQljb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuZGF0YSA9IE5VTEw7Ci0JCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0IGZpbGVuYW1lIHRvIFVuaWNvZGUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQloID0gQ3JlYXRlRmlsZShmaWxlbmFtZVcsICh3X3JpZ2h0fHJfcmlnaHQpLCAod19yaWdodCk/IDAgOiBGSUxFX1NIQVJFX1JFQUQsIAotCQkJCQkgICBOVUxMLCAobXVzdF9leGlzdHx0cnVuY2F0ZXxhX21vZGUpLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsTlVMTCk7Ci0JCVNETF9zdGFja19mcmVlKGZpbGVuYW1lVyk7Ci0JfQotI2Vsc2UKLQkvKiBEbyBub3Qgb3BlbiBhIGRpYWxvZyBib3ggaWYgZmFpbHVyZSAqLwotCW9sZF9lcnJvcl9tb2RlID0gU2V0RXJyb3JNb2RlKFNFTV9OT09QRU5GSUxFRVJST1JCT1h8U0VNX0ZBSUxDUklUSUNBTEVSUk9SUyk7Ci0KLQloID0gQ3JlYXRlRmlsZShmaWxlbmFtZSwgKHdfcmlnaHR8cl9yaWdodCksICh3X3JpZ2h0KT8gMCA6IEZJTEVfU0hBUkVfUkVBRCwgCi0JCSAgICAgICAgICAgTlVMTCwgKG11c3RfZXhpc3R8dHJ1bmNhdGV8YV9tb2RlKSwgRklMRV9BVFRSSUJVVEVfTk9STUFMLE5VTEwpOwotCi0JLyogcmVzdG9yZSBvbGQgYmVoYXZpb3VyICovCi0JU2V0RXJyb3JNb2RlKG9sZF9lcnJvcl9tb2RlKTsKLSNlbmRpZiAvKiBfV0lOMzJfV0NFICovCi0KLQlpZiAoaD09SU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJU0RMX2ZyZWUoY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEpOwotCQljb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuZGF0YSA9IE5VTEw7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiAlcyIsZmlsZW5hbWUpOwotCQlyZXR1cm4gLTI7IC8qIGZhaWxlZCAoQ3JlYXRlRmlsZSkgKi8KLQl9Ci0JY29udGV4dC0+aGlkZGVuLndpbjMyaW8uaCA9IGg7Ci0JY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYXBwZW5kID0gYV9tb2RlOwotCi0JcmV0dXJuIDA7IC8qIG9rICovCi19Ci1zdGF0aWMgaW50IFNETENBTEwgd2luMzJfZmlsZV9zZWVrKFNETF9SV29wcyAqY29udGV4dCwgaW50IG9mZnNldCwgaW50IHdoZW5jZSkKLXsKLQlEV09SRCB3aW4zMndoZW5jZTsKLQlpbnQgICBmaWxlX3BvczsKLQkKLQlpZiAoIWNvbnRleHQgfHwgY29udGV4dC0+aGlkZGVuLndpbjMyaW8uaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQlTRExfU2V0RXJyb3IoIndpbjMyX2ZpbGVfc2VlazogaW52YWxpZCBjb250ZXh0L2ZpbGUgbm90IG9wZW5lZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogRklYTUU6IFdlIG1heSBiZSBhYmxlIHRvIHNhdGlzZnkgdGhlIHNlZWsgd2l0aGluIGJ1ZmZlcmVkIGRhdGEgKi8KLQlpZiAod2hlbmNlID09IFJXX1NFRUtfQ1VSICYmIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0KSB7Ci0JCW9mZnNldCAtPSBjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdDsKLSAgICB9Ci0gICAgY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmxlZnQgPSAwOwotCi0Jc3dpdGNoICh3aGVuY2UpIHsKLQkJY2FzZSBSV19TRUVLX1NFVDoJCQotCQkJd2luMzJ3aGVuY2UgPSBGSUxFX0JFR0lOOyBicmVhazsKLQkJY2FzZSBSV19TRUVLX0NVUjoKLQkJCXdpbjMyd2hlbmNlID0gRklMRV9DVVJSRU5UOyBicmVhazsKLQkJY2FzZSBSV19TRUVLX0VORDoKLQkJCXdpbjMyd2hlbmNlID0gRklMRV9FTkQ7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJU0RMX1NldEVycm9yKCJ3aW4zMl9maWxlX3NlZWs6IFVua25vd24gdmFsdWUgZm9yICd3aGVuY2UnIik7CQkJCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JZmlsZV9wb3MgPSBTZXRGaWxlUG9pbnRlcihjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oLG9mZnNldCxOVUxMLHdpbjMyd2hlbmNlKTsKLQotCWlmICggZmlsZV9wb3MgIT0gSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSICkKLQkJcmV0dXJuIGZpbGVfcG9zOyAvKiBzdWNjZXNzICovCi0JCi0JU0RMX0Vycm9yKFNETF9FRlNFRUspOwotCXJldHVybiAtMTsgLyogZXJyb3IgKi8KLX0KLXN0YXRpYyBpbnQgU0RMQ0FMTCB3aW4zMl9maWxlX3JlYWQoU0RMX1JXb3BzICpjb250ZXh0LCB2b2lkICpwdHIsIGludCBzaXplLCBpbnQgbWF4bnVtKQotewotCWludAkJdG90YWxfbmVlZDsgCi0JaW50CQl0b3RhbF9yZWFkID0gMDsgCi0gICAgaW50ICAgICByZWFkX2FoZWFkOwotCURXT1JECWJ5dGVfcmVhZDsKLQkKLQl0b3RhbF9uZWVkID0gc2l6ZSptYXhudW07Ci0JCi0JaWYgKCFjb250ZXh0IHx8IGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgfHwgdG90YWxfbmVlZDw9MCB8fCAhc2l6ZSkgCQotCQlyZXR1cm4gMDsKLQotICAgIGlmIChjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdCA+IDApIHsKLSAgICAgICAgdm9pZCAqZGF0YSA9IChjaGFyICopY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuc2l6ZSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0OwotICAgICAgICByZWFkX2FoZWFkID0gU0RMX21pbih0b3RhbF9uZWVkLCBjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdCk7IAotICAgICAgICBTRExfbWVtY3B5KHB0ciwgZGF0YSwgcmVhZF9haGVhZCk7Ci0gICAgICAgIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0IC09IHJlYWRfYWhlYWQ7Ci0KLSAgICAgICAgaWYgKHJlYWRfYWhlYWQgPT0gdG90YWxfbmVlZCkgewotICAgICAgICAgICAgcmV0dXJuIG1heG51bTsKLSAgICAgICAgfQotICAgICAgICBwdHIgPSAoY2hhciAqKXB0ciArIHJlYWRfYWhlYWQ7Ci0gICAgICAgIHRvdGFsX25lZWQgLT0gcmVhZF9haGVhZDsgICAgICAgCi0JCXRvdGFsX3JlYWQgKz0gcmVhZF9haGVhZDsKLSAgICB9Ci0KLSAgICBpZiAodG90YWxfbmVlZCA8IFJFQURBSEVBRF9CVUZGRVJfU0laRSkgewotICAgICAgICBpZiAoIVJlYWRGaWxlKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmgsY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEsUkVBREFIRUFEX0JVRkZFUl9TSVpFLCZieXRlX3JlYWQsTlVMTCkpIHsKLSAgICAgICAgICAgIFNETF9FcnJvcihTRExfRUZSRUFEKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJlYWRfYWhlYWQgPSBTRExfbWluKHRvdGFsX25lZWQsIChpbnQpYnl0ZV9yZWFkKTsKLSAgICAgICAgU0RMX21lbWNweShwdHIsIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5kYXRhLCByZWFkX2FoZWFkKTsKLSAgICAgICAgY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLnNpemUgPSBieXRlX3JlYWQ7Ci0gICAgICAgIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0ID0gYnl0ZV9yZWFkLXJlYWRfYWhlYWQ7Ci0gICAgICAgIHRvdGFsX3JlYWQgKz0gcmVhZF9haGVhZDsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIVJlYWRGaWxlKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmgscHRyLHRvdGFsX25lZWQsJmJ5dGVfcmVhZCxOVUxMKSkgewotICAgICAgICAgICAgU0RMX0Vycm9yKFNETF9FRlJFQUQpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgdG90YWxfcmVhZCArPSBieXRlX3JlYWQ7Ci0gICAgfQotCXJldHVybiAodG90YWxfcmVhZC9zaXplKTsKLX0KLXN0YXRpYyBpbnQgU0RMQ0FMTCB3aW4zMl9maWxlX3dyaXRlKFNETF9SV29wcyAqY29udGV4dCwgY29uc3Qgdm9pZCAqcHRyLCBpbnQgc2l6ZSwgaW50IG51bSkKLXsKLQkKLQlpbnQJCXRvdGFsX2J5dGVzOyAKLQlEV09SRAlieXRlX3dyaXR0ZW4sbndyaXR0ZW47Ci0JCi0JdG90YWxfYnl0ZXMgPSBzaXplKm51bTsKLQotCWlmICghY29udGV4dCB8fCBjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oPT1JTlZBTElEX0hBTkRMRV9WQUxVRSB8fCB0b3RhbF9ieXRlczw9MCB8fCAhc2l6ZSkgCQotCQlyZXR1cm4gMDsKLQotCWlmIChjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdCkgewotCQlTZXRGaWxlUG9pbnRlcihjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oLC1jb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdCxOVUxMLEZJTEVfQ1VSUkVOVCk7Ci0JCWNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0ID0gMDsKLQl9Ci0KLQkvKiBpZiBpbiBhcHBlbmQgbW9kZSwgd2UgbXVzdCBnbyB0byB0aGUgRU9GIGJlZm9yZSB3cml0ZSAqLwotCWlmIChjb250ZXh0LT5oaWRkZW4ud2luMzJpby5hcHBlbmQpIHsKLQkJaWYgKCBTZXRGaWxlUG9pbnRlcihjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oLDBMLE5VTEwsRklMRV9FTkQpID09IElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUiApIHsKLQkJCVNETF9FcnJvcihTRExfRUZXUklURSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkKLQlpZiAoIVdyaXRlRmlsZShjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oLHB0cix0b3RhbF9ieXRlcywmYnl0ZV93cml0dGVuLE5VTEwpKSB7Ci0JCVNETF9FcnJvcihTRExfRUZXUklURSk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlud3JpdHRlbiA9IGJ5dGVfd3JpdHRlbi9zaXplOwotCXJldHVybiBud3JpdHRlbjsKLX0KLXN0YXRpYyBpbnQgU0RMQ0FMTCB3aW4zMl9maWxlX2Nsb3NlKFNETF9SV29wcyAqY29udGV4dCkKLXsKLQkKLQlpZiAoIGNvbnRleHQgKSB7CQkJCQkJCQkKLQkJaWYgKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJCUNsb3NlSGFuZGxlKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmgpOwotCQkJY29udGV4dC0+aGlkZGVuLndpbjMyaW8uaCA9IElOVkFMSURfSEFORExFX1ZBTFVFOyAvKiB0byBiZSBzdXJlICovCi0JCX0KLQkJaWYgKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5kYXRhKSB7Ci0JCQlTRExfZnJlZShjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuZGF0YSk7Ci0JCQljb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuZGF0YSA9IE5VTEw7Ci0JCX0KLQkJU0RMX0ZyZWVSVyhjb250ZXh0KTsKLQl9Ci0JcmV0dXJuKDApOwotfQotI2VuZGlmIC8qIF9fV0lOMzJfXyAqLwotCi0jaWZkZWYgSEFWRV9TVERJT19ICi0KLS8qIEZ1bmN0aW9ucyB0byByZWFkL3dyaXRlIHN0ZGlvIGZpbGUgcG9pbnRlcnMgKi8KLQotc3RhdGljIGludCBTRExDQUxMIHN0ZGlvX3NlZWsoU0RMX1JXb3BzICpjb250ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgd2hlbmNlKQotewotCWlmICggZnNlZWsoY29udGV4dC0+aGlkZGVuLnN0ZGlvLmZwLCBvZmZzZXQsIHdoZW5jZSkgPT0gMCApIHsKLQkJcmV0dXJuKGZ0ZWxsKGNvbnRleHQtPmhpZGRlbi5zdGRpby5mcCkpOwotCX0gZWxzZSB7Ci0JCVNETF9FcnJvcihTRExfRUZTRUVLKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci19Ci1zdGF0aWMgaW50IFNETENBTEwgc3RkaW9fcmVhZChTRExfUldvcHMgKmNvbnRleHQsIHZvaWQgKnB0ciwgaW50IHNpemUsIGludCBtYXhudW0pCi17Ci0Jc2l6ZV90IG5yZWFkOwotCi0JbnJlYWQgPSBmcmVhZChwdHIsIHNpemUsIG1heG51bSwgY29udGV4dC0+aGlkZGVuLnN0ZGlvLmZwKTsgCi0JaWYgKCBucmVhZCA9PSAwICYmIGZlcnJvcihjb250ZXh0LT5oaWRkZW4uc3RkaW8uZnApICkgewotCQlTRExfRXJyb3IoU0RMX0VGUkVBRCk7Ci0JfQotCXJldHVybihucmVhZCk7Ci19Ci1zdGF0aWMgaW50IFNETENBTEwgc3RkaW9fd3JpdGUoU0RMX1JXb3BzICpjb250ZXh0LCBjb25zdCB2b2lkICpwdHIsIGludCBzaXplLCBpbnQgbnVtKQotewotCXNpemVfdCBud3JvdGU7Ci0KLQlud3JvdGUgPSBmd3JpdGUocHRyLCBzaXplLCBudW0sIGNvbnRleHQtPmhpZGRlbi5zdGRpby5mcCk7Ci0JaWYgKCBud3JvdGUgPT0gMCAmJiBmZXJyb3IoY29udGV4dC0+aGlkZGVuLnN0ZGlvLmZwKSApIHsKLQkJU0RMX0Vycm9yKFNETF9FRldSSVRFKTsKLQl9Ci0JcmV0dXJuKG53cm90ZSk7Ci19Ci1zdGF0aWMgaW50IFNETENBTEwgc3RkaW9fY2xvc2UoU0RMX1JXb3BzICpjb250ZXh0KQotewotCWlmICggY29udGV4dCApIHsKLQkJaWYgKCBjb250ZXh0LT5oaWRkZW4uc3RkaW8uYXV0b2Nsb3NlICkgewotCQkJLyogV0FSTklORzogIENoZWNrIHRoZSByZXR1cm4gdmFsdWUgaGVyZSEgKi8KLQkJCWZjbG9zZShjb250ZXh0LT5oaWRkZW4uc3RkaW8uZnApOwotCQl9Ci0JCVNETF9GcmVlUlcoY29udGV4dCk7Ci0JfQotCXJldHVybigwKTsKLX0KLSNlbmRpZiAvKiAhSEFWRV9TVERJT19IICovCi0KLS8qIEZ1bmN0aW9ucyB0byByZWFkL3dyaXRlIG1lbW9yeSBwb2ludGVycyAqLwotCi1zdGF0aWMgaW50IFNETENBTEwgbWVtX3NlZWsoU0RMX1JXb3BzICpjb250ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgd2hlbmNlKQotewotCVVpbnQ4ICpuZXdwb3M7Ci0KLQlzd2l0Y2ggKHdoZW5jZSkgewotCQljYXNlIFJXX1NFRUtfU0VUOgotCQkJbmV3cG9zID0gY29udGV4dC0+aGlkZGVuLm1lbS5iYXNlK29mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIFJXX1NFRUtfQ1VSOgotCQkJbmV3cG9zID0gY29udGV4dC0+aGlkZGVuLm1lbS5oZXJlK29mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIFJXX1NFRUtfRU5EOgotCQkJbmV3cG9zID0gY29udGV4dC0+aGlkZGVuLm1lbS5zdG9wK29mZnNldDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJU0RMX1NldEVycm9yKCJVbmtub3duIHZhbHVlIGZvciAnd2hlbmNlJyIpOwotCQkJcmV0dXJuKC0xKTsKLQl9Ci0JaWYgKCBuZXdwb3MgPCBjb250ZXh0LT5oaWRkZW4ubWVtLmJhc2UgKSB7Ci0JCW5ld3BvcyA9IGNvbnRleHQtPmhpZGRlbi5tZW0uYmFzZTsKLQl9Ci0JaWYgKCBuZXdwb3MgPiBjb250ZXh0LT5oaWRkZW4ubWVtLnN0b3AgKSB7Ci0JCW5ld3BvcyA9IGNvbnRleHQtPmhpZGRlbi5tZW0uc3RvcDsKLQl9Ci0JY29udGV4dC0+aGlkZGVuLm1lbS5oZXJlID0gbmV3cG9zOwotCXJldHVybihjb250ZXh0LT5oaWRkZW4ubWVtLmhlcmUtY29udGV4dC0+aGlkZGVuLm1lbS5iYXNlKTsKLX0KLXN0YXRpYyBpbnQgU0RMQ0FMTCBtZW1fcmVhZChTRExfUldvcHMgKmNvbnRleHQsIHZvaWQgKnB0ciwgaW50IHNpemUsIGludCBtYXhudW0pCi17Ci0Jc2l6ZV90IHRvdGFsX2J5dGVzOwotCXNpemVfdCBtZW1fYXZhaWxhYmxlOwotCi0JdG90YWxfYnl0ZXMgPSAobWF4bnVtICogc2l6ZSk7Ci0JaWYgKCAobWF4bnVtIDw9IDApIHx8IChzaXplIDw9IDApIHx8ICgodG90YWxfYnl0ZXMgLyBtYXhudW0pICE9IChzaXplX3QpIHNpemUpICkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQltZW1fYXZhaWxhYmxlID0gKGNvbnRleHQtPmhpZGRlbi5tZW0uc3RvcCAtIGNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSk7Ci0JaWYgKHRvdGFsX2J5dGVzID4gbWVtX2F2YWlsYWJsZSkgewotCQl0b3RhbF9ieXRlcyA9IG1lbV9hdmFpbGFibGU7Ci0JfQotCi0JU0RMX21lbWNweShwdHIsIGNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSwgdG90YWxfYnl0ZXMpOwotCWNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSArPSB0b3RhbF9ieXRlczsKLQotCXJldHVybiAodG90YWxfYnl0ZXMgLyBzaXplKTsKLX0KLXN0YXRpYyBpbnQgU0RMQ0FMTCBtZW1fd3JpdGUoU0RMX1JXb3BzICpjb250ZXh0LCBjb25zdCB2b2lkICpwdHIsIGludCBzaXplLCBpbnQgbnVtKQotewotCWlmICggKGNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSArIChudW0qc2l6ZSkpID4gY29udGV4dC0+aGlkZGVuLm1lbS5zdG9wICkgewotCQludW0gPSAoY29udGV4dC0+aGlkZGVuLm1lbS5zdG9wLWNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSkvc2l6ZTsKLQl9Ci0JU0RMX21lbWNweShjb250ZXh0LT5oaWRkZW4ubWVtLmhlcmUsIHB0ciwgbnVtKnNpemUpOwotCWNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSArPSBudW0qc2l6ZTsKLQlyZXR1cm4obnVtKTsKLX0KLXN0YXRpYyBpbnQgU0RMQ0FMTCBtZW1fd3JpdGVjb25zdChTRExfUldvcHMgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnB0ciwgaW50IHNpemUsIGludCBudW0pCi17Ci0JU0RMX1NldEVycm9yKCJDYW4ndCB3cml0ZSB0byByZWFkLW9ubHkgbWVtb3J5Iik7Ci0JcmV0dXJuKC0xKTsKLX0KLXN0YXRpYyBpbnQgU0RMQ0FMTCBtZW1fY2xvc2UoU0RMX1JXb3BzICpjb250ZXh0KQotewotCWlmICggY29udGV4dCApIHsKLQkJU0RMX0ZyZWVSVyhjb250ZXh0KTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi0KLS8qIEZ1bmN0aW9ucyB0byBjcmVhdGUgU0RMX1JXb3BzIHN0cnVjdHVyZXMgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcyAqLwotCi0jaWZkZWYgX19NQUNPU19fCi0vKgotICogdHJhbnNsYXRlIHVuaXgtc3R5bGUgc2xhc2gtc2VwYXJhdGVkIGZpbGVuYW1lIHRvIG1hYy1zdHlsZSBjb2xvbi1zZXBhcmF0ZWQKLSAqIG5hbWU7IHJldHVybiBtYWxsb2NlZCBzdHJpbmcKLSAqLwotc3RhdGljIGNoYXIgKnVuaXhfdG9fbWFjKGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0JaW50IGZsZW4gPSBTRExfc3RybGVuKGZpbGUpOwotCWNoYXIgKnBhdGggPSBTRExfbWFsbG9jKGZsZW4gKyAyKTsKLQljb25zdCBjaGFyICpzcmMgPSBmaWxlOwotCWNoYXIgKmRzdCA9IHBhdGg7Ci0JaWYoKnNyYyA9PSAnLycpIHsKLQkJLyogcmVhbGx5IGRlcGVuZHMgb24gZmlsZXN5c3RlbSBsYXlvdXQsIGhvcGUgZm9yIHRoZSBiZXN0ICovCi0JCXNyYysrOwotCX0gZWxzZSB7Ci0JCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBNYWNPUyBwYXRoIHRvIGJlZ2luIHdpdGggKi8KLQkJaWYoKnNyYyAhPSAnOicpCi0JCQkqZHN0KysgPSAnOic7ICAgLyogcmVsYXRpdmUgcGF0aHMgYmVnaW4gd2l0aCAnOicgKi8KLQl9Ci0Jd2hpbGUoc3JjIDwgZmlsZSArIGZsZW4pIHsKLQkJY29uc3QgY2hhciAqZW5kID0gU0RMX3N0cmNocihzcmMsICcvJyk7Ci0JCWludCBsZW47Ci0JCWlmKCFlbmQpCi0JCQllbmQgPSBmaWxlICsgZmxlbjsgLyogbGFzdCBjb21wb25lbnQgKi8KLQkJbGVuID0gZW5kIC0gc3JjOwotCQlpZihsZW4gPT0gMCB8fCAobGVuID09IDEgJiYgc3JjWzBdID09ICcuJykpIHsKLQkJCS8qIHJlbW92ZSByZXBlYXRlZCBzbGFzaGVzIGFuZCAuICovCi0JCX0gZWxzZSB7Ci0JCQlpZihsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJy4nICYmIHNyY1sxXSA9PSAnLicpIHsKLQkJCQkvKiByZXBsYWNlIC4uIHdpdGggdGhlIGVtcHR5IHN0cmluZyAqLwotCQkJfSBlbHNlIHsKLQkJCQlTRExfbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotCQkJCWRzdCArPSBsZW47Ci0JCQl9Ci0JCQlpZihlbmQgPCBmaWxlICsgZmxlbikKLQkJCQkqZHN0KysgPSAnOic7Ci0JCX0KLQkJc3JjID0gZW5kICsgMTsKLQl9Ci0JKmRzdCsrID0gJ1wwJzsKLQlyZXR1cm4gcGF0aDsKLX0KLSNlbmRpZiAvKiBfX01BQ09TX18gKi8KLQotU0RMX1JXb3BzICpTRExfUldGcm9tRmlsZShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RlKQotewotCVNETF9SV29wcyAqcndvcHMgPSBOVUxMOwotI2lmZGVmIEhBVkVfU1RESU9fSAotCUZJTEUgKmZwID0gTlVMTDsKLSNlbmRpZgotCWlmICggIWZpbGUgfHwgISpmaWxlIHx8ICFtb2RlIHx8ICEqbW9kZSApIHsKLQkJU0RMX1NldEVycm9yKCJTRExfUldGcm9tRmlsZSgpOiBObyBmaWxlIG9yIG5vIG1vZGUgc3BlY2lmaWVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotCXJ3b3BzID0gU0RMX0FsbG9jUlcoKTsKLQlpZiAoIXJ3b3BzKQotCQlyZXR1cm4gTlVMTDsgLyogU0RMX1NldEVycm9yIGFscmVhZHkgc2V0dXAgYnkgU0RMX0FsbG9jUlcoKSAqLwotCWlmICh3aW4zMl9maWxlX29wZW4ocndvcHMsZmlsZSxtb2RlKSA8IDApIHsKLQkJU0RMX0ZyZWVSVyhyd29wcyk7Ci0JCXJldHVybiBOVUxMOwotCX0JCi0JcndvcHMtPnNlZWsgID0gd2luMzJfZmlsZV9zZWVrOwotCXJ3b3BzLT5yZWFkICA9IHdpbjMyX2ZpbGVfcmVhZDsKLQlyd29wcy0+d3JpdGUgPSB3aW4zMl9maWxlX3dyaXRlOwotCXJ3b3BzLT5jbG9zZSA9IHdpbjMyX2ZpbGVfY2xvc2U7Ci0KLSNlbGlmIEhBVkVfU1RESU9fSAotCi0jaWZkZWYgX19NQUNPU19fCi0JewotCQljaGFyICptcGF0aCA9IHVuaXhfdG9fbWFjKGZpbGUpOwotCQlmcCA9IGZvcGVuKG1wYXRoLCBtb2RlKTsKLQkJU0RMX2ZyZWUobXBhdGgpOwotCX0KLSNlbHNlCi0JZnAgPSBmb3BlbihmaWxlLCBtb2RlKTsKLSNlbmRpZgotCWlmICggZnAgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuICVzIiwgZmlsZSk7Ci0JfSBlbHNlIHsKLQkJcndvcHMgPSBTRExfUldGcm9tRlAoZnAsIDEpOwotCX0KLSNlbHNlCi0JU0RMX1NldEVycm9yKCJTREwgbm90IGNvbXBpbGVkIHdpdGggc3RkaW8gc3VwcG9ydCIpOwotI2VuZGlmIC8qICFIQVZFX1NURElPX0ggKi8KLQotCXJldHVybihyd29wcyk7Ci19Ci0KLSNpZmRlZiBIQVZFX1NURElPX0gKLVNETF9SV29wcyAqU0RMX1JXRnJvbUZQKEZJTEUgKmZwLCBpbnQgYXV0b2Nsb3NlKQotewotCVNETF9SV29wcyAqcndvcHMgPSBOVUxMOwotCi0JcndvcHMgPSBTRExfQWxsb2NSVygpOwotCWlmICggcndvcHMgIT0gTlVMTCApIHsKLQkJcndvcHMtPnNlZWsgPSBzdGRpb19zZWVrOwotCQlyd29wcy0+cmVhZCA9IHN0ZGlvX3JlYWQ7Ci0JCXJ3b3BzLT53cml0ZSA9IHN0ZGlvX3dyaXRlOwotCQlyd29wcy0+Y2xvc2UgPSBzdGRpb19jbG9zZTsKLQkJcndvcHMtPmhpZGRlbi5zdGRpby5mcCA9IGZwOwotCQlyd29wcy0+aGlkZGVuLnN0ZGlvLmF1dG9jbG9zZSA9IGF1dG9jbG9zZTsKLQl9Ci0JcmV0dXJuKHJ3b3BzKTsKLX0KLSNlbmRpZiAvKiBIQVZFX1NURElPX0ggKi8KLQotU0RMX1JXb3BzICpTRExfUldGcm9tTWVtKHZvaWQgKm1lbSwgaW50IHNpemUpCi17Ci0JU0RMX1JXb3BzICpyd29wczsKLQotCXJ3b3BzID0gU0RMX0FsbG9jUlcoKTsKLQlpZiAoIHJ3b3BzICE9IE5VTEwgKSB7Ci0JCXJ3b3BzLT5zZWVrID0gbWVtX3NlZWs7Ci0JCXJ3b3BzLT5yZWFkID0gbWVtX3JlYWQ7Ci0JCXJ3b3BzLT53cml0ZSA9IG1lbV93cml0ZTsKLQkJcndvcHMtPmNsb3NlID0gbWVtX2Nsb3NlOwotCQlyd29wcy0+aGlkZGVuLm1lbS5iYXNlID0gKFVpbnQ4ICopbWVtOwotCQlyd29wcy0+aGlkZGVuLm1lbS5oZXJlID0gcndvcHMtPmhpZGRlbi5tZW0uYmFzZTsKLQkJcndvcHMtPmhpZGRlbi5tZW0uc3RvcCA9IHJ3b3BzLT5oaWRkZW4ubWVtLmJhc2Urc2l6ZTsKLQl9Ci0JcmV0dXJuKHJ3b3BzKTsKLX0KLQotU0RMX1JXb3BzICpTRExfUldGcm9tQ29uc3RNZW0oY29uc3Qgdm9pZCAqbWVtLCBpbnQgc2l6ZSkKLXsKLQlTRExfUldvcHMgKnJ3b3BzOwotCi0JcndvcHMgPSBTRExfQWxsb2NSVygpOwotCWlmICggcndvcHMgIT0gTlVMTCApIHsKLQkJcndvcHMtPnNlZWsgPSBtZW1fc2VlazsKLQkJcndvcHMtPnJlYWQgPSBtZW1fcmVhZDsKLQkJcndvcHMtPndyaXRlID0gbWVtX3dyaXRlY29uc3Q7Ci0JCXJ3b3BzLT5jbG9zZSA9IG1lbV9jbG9zZTsKLQkJcndvcHMtPmhpZGRlbi5tZW0uYmFzZSA9IChVaW50OCAqKW1lbTsKLQkJcndvcHMtPmhpZGRlbi5tZW0uaGVyZSA9IHJ3b3BzLT5oaWRkZW4ubWVtLmJhc2U7Ci0JCXJ3b3BzLT5oaWRkZW4ubWVtLnN0b3AgPSByd29wcy0+aGlkZGVuLm1lbS5iYXNlK3NpemU7Ci0JfQotCXJldHVybihyd29wcyk7Ci19Ci0KLVNETF9SV29wcyAqU0RMX0FsbG9jUlcodm9pZCkKLXsKLQlTRExfUldvcHMgKmFyZWE7Ci0KLQlhcmVhID0gKFNETF9SV29wcyAqKVNETF9tYWxsb2Moc2l6ZW9mICphcmVhKTsKLQlpZiAoIGFyZWEgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JfQotCXJldHVybihhcmVhKTsKLX0KLQotdm9pZCBTRExfRnJlZVJXKFNETF9SV29wcyAqYXJlYSkKLXsKLQlTRExfZnJlZShhcmVhKTsKLX0KLQotLyogRnVuY3Rpb25zIGZvciBkeW5hbWljYWxseSByZWFkaW5nIGFuZCB3cml0aW5nIGVuZGlhbi1zcGVjaWZpYyB2YWx1ZXMgKi8KLQotVWludDE2IFNETF9SZWFkTEUxNiAoU0RMX1JXb3BzICpzcmMpCi17Ci0JVWludDE2IHZhbHVlOwotCi0JU0RMX1JXcmVhZChzcmMsICZ2YWx1ZSwgKHNpemVvZiB2YWx1ZSksIDEpOwotCXJldHVybihTRExfU3dhcExFMTYodmFsdWUpKTsKLX0KLVVpbnQxNiBTRExfUmVhZEJFMTYgKFNETF9SV29wcyAqc3JjKQotewotCVVpbnQxNiB2YWx1ZTsKLQotCVNETF9SV3JlYWQoc3JjLCAmdmFsdWUsIChzaXplb2YgdmFsdWUpLCAxKTsKLQlyZXR1cm4oU0RMX1N3YXBCRTE2KHZhbHVlKSk7Ci19Ci1VaW50MzIgU0RMX1JlYWRMRTMyIChTRExfUldvcHMgKnNyYykKLXsKLQlVaW50MzIgdmFsdWU7Ci0KLQlTRExfUldyZWFkKHNyYywgJnZhbHVlLCAoc2l6ZW9mIHZhbHVlKSwgMSk7Ci0JcmV0dXJuKFNETF9Td2FwTEUzMih2YWx1ZSkpOwotfQotVWludDMyIFNETF9SZWFkQkUzMiAoU0RMX1JXb3BzICpzcmMpCi17Ci0JVWludDMyIHZhbHVlOwotCi0JU0RMX1JXcmVhZChzcmMsICZ2YWx1ZSwgKHNpemVvZiB2YWx1ZSksIDEpOwotCXJldHVybihTRExfU3dhcEJFMzIodmFsdWUpKTsKLX0KLVVpbnQ2NCBTRExfUmVhZExFNjQgKFNETF9SV29wcyAqc3JjKQotewotCVVpbnQ2NCB2YWx1ZTsKLQotCVNETF9SV3JlYWQoc3JjLCAmdmFsdWUsIChzaXplb2YgdmFsdWUpLCAxKTsKLQlyZXR1cm4oU0RMX1N3YXBMRTY0KHZhbHVlKSk7Ci19Ci1VaW50NjQgU0RMX1JlYWRCRTY0IChTRExfUldvcHMgKnNyYykKLXsKLQlVaW50NjQgdmFsdWU7Ci0KLQlTRExfUldyZWFkKHNyYywgJnZhbHVlLCAoc2l6ZW9mIHZhbHVlKSwgMSk7Ci0JcmV0dXJuKFNETF9Td2FwQkU2NCh2YWx1ZSkpOwotfQotCi1pbnQgU0RMX1dyaXRlTEUxNiAoU0RMX1JXb3BzICpkc3QsIFVpbnQxNiB2YWx1ZSkKLXsKLQl2YWx1ZSA9IFNETF9Td2FwTEUxNih2YWx1ZSk7Ci0JcmV0dXJuKFNETF9SV3dyaXRlKGRzdCwgJnZhbHVlLCAoc2l6ZW9mIHZhbHVlKSwgMSkpOwotfQotaW50IFNETF9Xcml0ZUJFMTYgKFNETF9SV29wcyAqZHN0LCBVaW50MTYgdmFsdWUpCi17Ci0JdmFsdWUgPSBTRExfU3dhcEJFMTYodmFsdWUpOwotCXJldHVybihTRExfUld3cml0ZShkc3QsICZ2YWx1ZSwgKHNpemVvZiB2YWx1ZSksIDEpKTsKLX0KLWludCBTRExfV3JpdGVMRTMyIChTRExfUldvcHMgKmRzdCwgVWludDMyIHZhbHVlKQotewotCXZhbHVlID0gU0RMX1N3YXBMRTMyKHZhbHVlKTsKLQlyZXR1cm4oU0RMX1JXd3JpdGUoZHN0LCAmdmFsdWUsIChzaXplb2YgdmFsdWUpLCAxKSk7Ci19Ci1pbnQgU0RMX1dyaXRlQkUzMiAoU0RMX1JXb3BzICpkc3QsIFVpbnQzMiB2YWx1ZSkKLXsKLQl2YWx1ZSA9IFNETF9Td2FwQkUzMih2YWx1ZSk7Ci0JcmV0dXJuKFNETF9SV3dyaXRlKGRzdCwgJnZhbHVlLCAoc2l6ZW9mIHZhbHVlKSwgMSkpOwotfQotaW50IFNETF9Xcml0ZUxFNjQgKFNETF9SV29wcyAqZHN0LCBVaW50NjQgdmFsdWUpCi17Ci0JdmFsdWUgPSBTRExfU3dhcExFNjQodmFsdWUpOwotCXJldHVybihTRExfUld3cml0ZShkc3QsICZ2YWx1ZSwgKHNpemVvZiB2YWx1ZSksIDEpKTsKLX0KLWludCBTRExfV3JpdGVCRTY0IChTRExfUldvcHMgKmRzdCwgVWludDY0IHZhbHVlKQotewotCXZhbHVlID0gU0RMX1N3YXBCRTY0KHZhbHVlKTsKLQlyZXR1cm4oU0RMX1JXd3JpdGUoZHN0LCAmdmFsdWUsIChzaXplb2YgdmFsdWUpLCAxKSk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2hlcm1lcy9IZWFkTU1YLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2hlcm1lcy9IZWFkTU1YLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2Y2ZGEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMvSGVhZE1NWC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gICBIZWFkZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBNTVggcm91dGluZXMgZm9yIHRoZSBIRVJNRVMgbGlicmFyeQotICAgQ29weXJpZ2h0IChjKSAxOTk4IENocmlzdGlhbiBOZW50d2ljaCAoYy5uZW50d2ljaEBjcy51Y2wuYWMudWspCi0gICBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAotICAKLSAgIFBsZWFzZSByZWZlciB0byB0aGUgZmlsZSBDT1BZSU5HLkxJQiBjb250YWluZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IKLSAgIGxpY2Vuc2luZyBjb25kaXRpb25zCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfX0hFUk1FU19IRUFEX01NWF9fCi0jZGVmaW5lIF9fSEVSTUVTX0hFQURfTU1YX18KLQotCi0vKiBJZiB5b3UgY2Fubm90IHN0YW5kIGlmZGVmcywgdGhlbiBwbGVhc2UgZG8gbm90IGxvb2sgaW50byB0aGlzIGZpbGUsIGl0J3MKLSAgIGdvaW5nIHRvIGVuZCB5b3VyIGxpZmUgOikgKi8KLQotI2lmZGVmIFg4Nl9BU1NFTUJMRVIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgU1RBQ0tDQUxMIENvbnZlcnRNTVgoSGVybWVzQ29udmVydGVySW50ZXJmYWNlICopOwotCi12b2lkIFNUQUNLQ0FMTCBDbGVhck1NWF8zMihIZXJtZXNDbGVhckludGVyZmFjZSAqKTsKLXZvaWQgU1RBQ0tDQUxMIENsZWFyTU1YXzI0KEhlcm1lc0NsZWFySW50ZXJmYWNlICopOwotdm9pZCBTVEFDS0NBTEwgQ2xlYXJNTVhfMTYoSGVybWVzQ2xlYXJJbnRlcmZhY2UgKik7Ci12b2lkIFNUQUNLQ0FMTCBDbGVhck1NWF84KEhlcm1lc0NsZWFySW50ZXJmYWNlICopOwotCi12b2lkIENvbnZlcnRNTVhwSUkzMl8yNFJHQjg4OCgpOwotdm9pZCBDb252ZXJ0TU1YcElJMzJfMTZSR0I1NjUoKTsKLXZvaWQgQ29udmVydE1NWHBJSTMyXzE2QkdSNTY1KCk7Ci12b2lkIENvbnZlcnRNTVhwSUkzMl8xNlJHQjU1NSgpOwotdm9pZCBDb252ZXJ0TU1YcElJMzJfMTZCR1I1NjUoKTsKLXZvaWQgQ29udmVydE1NWHBJSTMyXzE2QkdSNTU1KCk7Ci0KLXZvaWQgQ29udmVydE1NWHAzMl8xNlJHQjU1NSgpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLQotLyogRml4IHRoZSB1bmRlcnNjb3JlIGJ1c2luZXNzIHdpdGggRUxGIGNvbXBpbGVycyAqLwotCi0jaWYgZGVmaW5lZChfX0VMRl9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotICAjaWZkZWYgX19jcGx1c3BsdXMgCi0gIGV4dGVybiAiQyIgeyAgIAotICAjZW5kaWYKLQotICBleHRlcm4gdm9pZCBfQ29udmVydE1NWChIZXJtZXNDb252ZXJ0ZXJJbnRlcmZhY2UgKik7Ci0gIGV4dGVybiB2b2lkIF9Db252ZXJ0TU1YcElJMzJfMjRSR0I4ODgoKTsKLSAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRNTVhwSUkzMl8xNlJHQjU2NSgpOwotICBleHRlcm4gdm9pZCBfQ29udmVydE1NWHBJSTMyXzE2QkdSNTY1KCk7Ci0gIGV4dGVybiB2b2lkIF9Db252ZXJ0TU1YcElJMzJfMTZSR0I1NTUoKTsKLSAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRNTVhwSUkzMl8xNkJHUjU1NSgpOwotCi0gICNkZWZpbmUgQ29udmVydE1NWCBfQ29udmVydE1NWAotICAjZGVmaW5lIENvbnZlcnRNTVhwSUkzMl8yNFJHQjg4OCBfQ29udmVydE1NWHBJSTMyXzI0UkdCODg4Ci0gICNkZWZpbmUgQ29udmVydE1NWHBJSTMyXzE2UkdCNTY1IF9Db252ZXJ0TU1YcElJMzJfMTZSR0I1NjUKLSAgI2RlZmluZSBDb252ZXJ0TU1YcElJMzJfMTZCR1I1NjUgX0NvbnZlcnRNTVhwSUkzMl8xNkJHUjU2NQotICAjZGVmaW5lIENvbnZlcnRNTVhwSUkzMl8xNlJHQjU1NSBfQ29udmVydE1NWHBJSTMyXzE2UkdCNTU1Ci0gICNkZWZpbmUgQ29udmVydE1NWHBJSTMyXzE2QkdSNTU1IF9Db252ZXJ0TU1YcElJMzJfMTZCR1I1NTUKLQotICAjaWZkZWYgX19jcGx1c3BsdXMKLSAgfQotICAjZW5kaWYKLQotI2VuZGlmIC8qIEVMRiBhbmQgR05VQyAqLwotCi0KLQotCi0vKiBNYWtlIGl0IHdvcmsgd2l0aCBXYXRjb20gKi8KLSNpZmRlZiBfX1dBVENPTUNfXwotI3ByYWdtYSB3YXJuaW5nIDYwMSA5Ci0KLSNwcmFnbWEgYXV4IENvbnZlcnRNTVggIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQotCi0jcHJhZ21hIGF1eCBDbGVhck1NWF8zMiAiXyoiIG1vZGlmeSBbRUFYIEVCWCBFQ1ggRURYIEVTSSBFREldCi0jcHJhZ21hIGF1eCBDbGVhck1NWF8yNCAiXyoiIG1vZGlmeSBbRUFYIEVCWCBFQ1ggRURYIEVTSSBFREldCi0jcHJhZ21hIGF1eCBDbGVhck1NWF8xNiAiXyoiIG1vZGlmeSBbRUFYIEVCWCBFQ1ggRURYIEVTSSBFREldCi0jcHJhZ21hIGF1eCBDbGVhck1NWF84ICJfKiIgbW9kaWZ5IFtFQVggRUJYIEVDWCBFRFggRVNJIEVESV0KLQotI3ByYWdtYSBhdXggQ29udmVydE1NWHBJSTMyXzI0UkdCODg4ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRNTVhwSUkzMl8xNlJHQjU2NSAiXyoiCi0jcHJhZ21hIGF1eCBDb252ZXJ0TU1YcElJMzJfMTZCR1I1NjUgIl8qIgotI3ByYWdtYSBhdXggQ29udmVydE1NWHBJSTMyXzE2UkdCNTU1ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRNTVhwSUkzMl8xNkJHUjU1NSAiXyoiCi0jcHJhZ21hIGF1eCBDb252ZXJ0TU1YcDMyXzE2UkdCNTU1ICJfKiIKLQotI2VuZGlmIC8qIFdBVENPTSAqLwotCi0jZW5kaWYgLyogWDg2X0FTU0VNQkxFUiAqLwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMvSGVhZFg4Ni5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMvSGVhZFg4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGUwY2M5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvaGVybWVzL0hlYWRYODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICAgSGVhZGVyIGRlZmluaXRpb25zIGZvciB0aGUgeDg2IHJvdXRpbmVzIGZvciB0aGUgSEVSTUVTIGxpYnJhcnkKLSAgIENvcHlyaWdodCAoYykgMTk5OCBDaHJpc3RpYW4gTmVudHdpY2ggKGJybkBlbGVldC5tY2IuYXQpCi0gICBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAotICAKLSAgIFBsZWFzZSByZWZlciB0byB0aGUgZmlsZSBDT1BZSU5HLkxJQiBjb250YWluZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IKLSAgIGxpY2Vuc2luZyBjb25kaXRpb25zCi0qLwotCi0jaWZuZGVmIF9fSEVSTUVTX0hFQURfWDg2X18KLSNkZWZpbmUgX19IRVJNRVNfSEVBRF9YODZfXwotCi0KLSNpZmRlZiBYODZfQVNTRU1CTEVSCi0KLS8qIElmIHlvdSBjYW4ndCBzdGFuZCBJRkRFRlMsIHRoZW4gY2xvc2UgeW91ciBleWVzIG5vdywgcGxlYXNlIDopICovCi0KLS8qIE9rLCB3ZSBzdGFydCB3aXRoIG5vcm1hbCBmdW5jdGlvbiBkZWZpbml0aW9ucyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLXZvaWQgU1RBQ0tDQUxMIENvbnZlcnRYODYoSGVybWVzQ29udmVydGVySW50ZXJmYWNlICopOwotdm9pZCBTVEFDS0NBTEwgQ2xlYXJYODZfMzIoSGVybWVzQ2xlYXJJbnRlcmZhY2UgKik7Ci12b2lkIFNUQUNLQ0FMTCBDbGVhclg4Nl8yNChIZXJtZXNDbGVhckludGVyZmFjZSAqKTsKLXZvaWQgU1RBQ0tDQUxMIENsZWFyWDg2XzE2KEhlcm1lc0NsZWFySW50ZXJmYWNlICopOwotdm9pZCBTVEFDS0NBTEwgQ2xlYXJYODZfOChIZXJtZXNDbGVhckludGVyZmFjZSAqKTsKLQotaW50IFNUQUNLQ0FMTCBIZXJtZXNfWDg2X0NQVSgpOwotCi12b2lkIENvbnZlcnRYODZwMzJfMzJCR1I4ODgoKTsKLXZvaWQgQ29udmVydFg4NnAzMl8zMlJHQkE4ODgoKTsKLXZvaWQgQ29udmVydFg4NnAzMl8zMkJHUkE4ODgoKTsKLXZvaWQgQ29udmVydFg4NnAzMl8yNFJHQjg4OCgpOwotdm9pZCBDb252ZXJ0WDg2cDMyXzI0QkdSODg4KCk7Ci12b2lkIENvbnZlcnRYODZwMzJfMTZSR0I1NjUoKTsKLXZvaWQgQ29udmVydFg4NnAzMl8xNkJHUjU2NSgpOwotdm9pZCBDb252ZXJ0WDg2cDMyXzE2UkdCNTU1KCk7Ci12b2lkIENvbnZlcnRYODZwMzJfMTZCR1I1NTUoKTsKLXZvaWQgQ29udmVydFg4NnAzMl84UkdCMzMyKCk7Ci0KLXZvaWQgQ29udmVydFg4NnAxNl8zMlJHQjg4OCgpOwotdm9pZCBDb252ZXJ0WDg2cDE2XzMyQkdSODg4KCk7Ci12b2lkIENvbnZlcnRYODZwMTZfMzJSR0JBODg4KCk7Ci12b2lkIENvbnZlcnRYODZwMTZfMzJCR1JBODg4KCk7Ci12b2lkIENvbnZlcnRYODZwMTZfMjRSR0I4ODgoKTsKLXZvaWQgQ29udmVydFg4NnAxNl8yNEJHUjg4OCgpOwotdm9pZCBDb252ZXJ0WDg2cDE2XzE2QkdSNTY1KCk7Ci12b2lkIENvbnZlcnRYODZwMTZfMTZSR0I1NTUoKTsKLXZvaWQgQ29udmVydFg4NnAxNl8xNkJHUjU1NSgpOwotdm9pZCBDb252ZXJ0WDg2cDE2XzhSR0IzMzIoKTsKLQotdm9pZCBDb3B5WDg2cF80Ynl0ZSgpOwotdm9pZCBDb3B5WDg2cF8zYnl0ZSgpOwotdm9pZCBDb3B5WDg2cF8yYnl0ZSgpOwotdm9pZCBDb3B5WDg2cF8xYnl0ZSgpOwotCi12b2lkIENvbnZlcnRYODZwSThfMzIoKTsKLXZvaWQgQ29udmVydFg4NnBJOF8yNCgpOwotdm9pZCBDb252ZXJ0WDg2cEk4XzE2KCk7Ci0KLWV4dGVybiBpbnQgQ29udmVydFg4NnAxNl8zMlJHQjg4OF9MVVRfWDg2WzUxMl07Ci1leHRlcm4gaW50IENvbnZlcnRYODZwMTZfMzJCR1I4ODhfTFVUX1g4Nls1MTJdOwotZXh0ZXJuIGludCBDb252ZXJ0WDg2cDE2XzMyUkdCQTg4OF9MVVRfWDg2WzUxMl07Ci1leHRlcm4gaW50IENvbnZlcnRYODZwMTZfMzJCR1JBODg4X0xVVF9YODZbNTEyXTsKLSAgCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLQotCi0vKiBOb3cgZml4IHVwIHRoZSBFTEYgdW5kZXJzY29yZSBwcm9ibGVtICovCi0KLSNpZiBkZWZpbmVkKF9fRUxGX18pICYmIGRlZmluZWQoX19HTlVDX18pCi0gICNpZmRlZiBfX2NwbHVzcGx1cwotICBleHRlcm4gIkMiIHsKLSAgI2VuZGlmCi0KLSAgZXh0ZXJuIGludCBfSGVybWVzX1g4Nl9DUFUoKTsKLQotICBleHRlcm4gdm9pZCBfQ29udmVydFg4NihIZXJtZXNDb252ZXJ0ZXJJbnRlcmZhY2UgKik7Ci0KLSAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMzJfMzJCR1I4ODgoKTsKLSAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMzJfMzJSR0JBODg4KCk7Ci0gIGV4dGVybiB2b2lkIF9Db252ZXJ0WDg2cDMyXzMyQkdSQTg4OCgpOwotICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8yNFJHQjg4OCgpOwotICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8yNEJHUjg4OCgpOwotICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8xNlJHQjU2NSgpOwotICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8xNkJHUjU2NSgpOwotICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8xNlJHQjU1NSgpOwotICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8xNkJHUjU1NSgpOwotICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl84UkdCMzMyKCk7Ci0KLSAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMTZfMTZCR1I1NjUoKTsKLSAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMTZfMTZSR0I1NTUoKTsKLSAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMTZfMTZCR1I1NTUoKTsKLSAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMTZfOFJHQjMzMigpOwotCi0KLSAgI2RlZmluZSBIZXJtZXNfWDg2X0NQVSBfSGVybWVzX1g4Nl9DUFUKLQotICAjZGVmaW5lIENvbnZlcnRYODYgX0NvbnZlcnRYODYKLQotICAjZGVmaW5lIENvbnZlcnRYODZwMzJfMzJCR1I4ODggX0NvbnZlcnRYODZwMzJfMzJCR1I4ODgKLSAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzMyUkdCQTg4OCBfQ29udmVydFg4NnAzMl8zMlJHQkE4ODgKLSAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzMyQkdSQTg4OCBfQ29udmVydFg4NnAzMl8zMkJHUkE4ODgKLSAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzI0UkdCODg4IF9Db252ZXJ0WDg2cDMyXzI0UkdCODg4Ci0gICNkZWZpbmUgQ29udmVydFg4NnAzMl8yNEJHUjg4OCBfQ29udmVydFg4NnAzMl8yNEJHUjg4OAotICAjZGVmaW5lIENvbnZlcnRYODZwMzJfMTZSR0I1NjUgX0NvbnZlcnRYODZwMzJfMTZSR0I1NjUKLSAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzE2QkdSNTY1IF9Db252ZXJ0WDg2cDMyXzE2QkdSNTY1Ci0gICNkZWZpbmUgQ29udmVydFg4NnAzMl8xNlJHQjU1NSBfQ29udmVydFg4NnAzMl8xNlJHQjU1NQotICAjZGVmaW5lIENvbnZlcnRYODZwMzJfMTZCR1I1NTUgX0NvbnZlcnRYODZwMzJfMTZCR1I1NTUKLSAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzhSR0IzMzIgX0NvbnZlcnRYODZwMzJfOFJHQjMzMgotCi0gICNkZWZpbmUgQ29udmVydFg4NnAxNl8xNkJHUjU2NSBfQ29udmVydFg4NnAxNl8xNkJHUjU2NQotICAjZGVmaW5lIENvbnZlcnRYODZwMTZfMTZSR0I1NTUgX0NvbnZlcnRYODZwMTZfMTZSR0I1NTUKLSAgI2RlZmluZSBDb252ZXJ0WDg2cDE2XzE2QkdSNTU1IF9Db252ZXJ0WDg2cDE2XzE2QkdSNTU1Ci0gICNkZWZpbmUgQ29udmVydFg4NnAxNl84UkdCMzMyIF9Db252ZXJ0WDg2cDE2XzhSR0IzMzIKLQotCi0gICNpZmRlZiBfX2NwbHVzcGx1cwotICB9Ci0gICNlbmRpZgotCi0jZW5kaWYgLyogRUxGICYgR05VICovCi0KLQotCi0vKiBNYWtlIGl0IHJ1biB3aXRoIFdBVENPTSBDICovCi0jaWZkZWYgX19XQVRDT01DX18KLSNwcmFnbWEgd2FybmluZyA2MDEgOQotCi0jcHJhZ21hIGF1eCBIZXJtZXNfWDg2X0NQVSAiXyoiCi0KLSNwcmFnbWEgYXV4IENvbnZlcnRYODYgIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQotI3ByYWdtYSBhdXggQ2xlYXJYODZfMzIgIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQotI3ByYWdtYSBhdXggQ2xlYXJYODZfMjQgIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQotI3ByYWdtYSBhdXggQ2xlYXJYODZfMTYgIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQotI3ByYWdtYSBhdXggQ2xlYXJYODZfOCAiXyoiIG1vZGlmeSBbRUFYIEVCWCBFQ1ggRURYIEVTSSBFREldCi0KLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwMzJfMzJCR1I4ODggIl8qIgotI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl8zMlJHQkE4ODggIl8qIgotI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl8zMkJHUkE4ODggIl8qIgotI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl8yNFJHQjg4OCAiXyoiCi0jcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDMyXzI0QkdSODg4ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwMzJfMTZSR0I1NjUgIl8qIgotI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl8xNkJHUjU2NSAiXyoiCi0jcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDMyXzE2UkdCNTU1ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwMzJfMTZCR1I1NTUgIl8qIgotI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl84UkdCMzMyICJfKiIKLQotI3ByYWdtYSBhdXggQ29udmVydFg4NnAxNl8zMlJHQjg4OCAiXyoiCi0jcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDE2XzMyQkdSODg4ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMzJSR0JBODg4ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMzJCR1JBODg4ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMjRSR0I4ODggIl8qIgotI3ByYWdtYSBhdXggQ29udmVydFg4NnAxNl8yNEJHUjg4OCAiXyoiCi0jcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDE2XzE2QkdSNTY1ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMTZSR0I1NTUgIl8qIgotI3ByYWdtYSBhdXggQ29udmVydFg4NnAxNl8xNkJHUjU1NSAiXyoiCi0jcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDE2XzhSR0IzMzIgIl8qIgotCi0jcHJhZ21hIGF1eCBDb3B5WDg2cF80Ynl0ZSAiXyoiCi0jcHJhZ21hIGF1eCBDb3B5WDg2cF8zYnl0ZSAiXyoiCi0jcHJhZ21hIGF1eCBDb3B5WDg2cF8yYnl0ZSAiXyoiCi0jcHJhZ21hIGF1eCBDb3B5WDg2cF8xYnl0ZSAiXyoiCi0KLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwSThfMzIgIl8qIgotI3ByYWdtYSBhdXggQ29udmVydFg4NnBJOF8yNCAiXyoiCi0jcHJhZ21hIGF1eCBDb252ZXJ0WDg2cEk4XzE2ICJfKiIKLQotI3ByYWdtYSBhdXggQ29udmVydFg4NnAxNl8zMlJHQjg4OF9MVVRfWDg2ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMzJCR1I4ODhfTFVUX1g4NiAiXyoiCi0jcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDE2XzMyUkdCQTg4OF9MVVRfWDg2ICJfKiIKLSNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMzJCR1JBODg4X0xVVF9YODYgIl8qIgotCi0jZW5kaWYgLyogX19XQVRDT01DX18gKi8KLQotCi0jZW5kaWYgLyogWDg2X0FTU0VNQkxFUiAqLwotCi0KLSNlbmRpZiAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvaGVybWVzL21teF9tYWluLmFzbSBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvaGVybWVzL21teF9tYWluLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4ODZkNi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2hlcm1lcy9tbXhfbWFpbi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi07Ci07IG1teCBmb3JtYXQgY29udmVydGVyIG1haW4gbG9vcHMgZm9yIEhFUk1FUwotOyBTb21lIHJvdXRpbmVzIENvcHlyaWdodCAoYykgMTk5OCBDaHJpc3RpYW4gTmVudHdpY2ggKGMubmVudHdpY2hAY3MudWNsLmFjLnVrKQotOyBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAotOyAKLTsgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgotOyBsaWNlbnNpbmcgY29uZGl0aW9ucwkJCi07Ci0KLUJJVFMgMzIKLQotJWluY2x1ZGUgImNvbW1vbi5pbmMiCi0KLVNETF9GVU5DIF9Db252ZXJ0TU1YCi0KLVNFQ1RJT04gLnRleHQKLQkJCi07OyBfQ29udmVydE1NWDoJIAotOzsgW0VTUCs4XSBDb252ZXJ0ZXJJbmZvKgotOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTs7IENvbnZlcnRlckluZm8gKGVicCsuLikKLTs7ICAgMDoJdm9pZCAqc19waXhlbHMKLTs7ICAgNDoJaW50IHNfd2lkdGgKLTs7ICAgODoJaW50IHNfaGVpZ2h0Ci07OyAgMTI6CWludCBzX2FkZAotOzsgIDE2Ogl2b2lkICpkX3BpeGVscwotOzsgIDIwOglpbnQgZF93aWR0aAotOzsgIDI0OglpbnQgZF9oZWlnaHQKLTs7ICAyODoJaW50IGRfYWRkCi07OyAgMzI6CXZvaWQgKCpjb252ZXJ0ZXJfZnVuY3Rpb24pKCkgCi07OyAgMzY6IGludDMyICpsb29rdXAKLQkKLV9Db252ZXJ0TU1YOgotCXB1c2ggZWJwCi0JbW92IGVicCxlc3AKLQotOyBTYXZlIHRoZSByZWdpc3RlcnMgdXNlZCBieSB0aGUgYmxpdHRlcnMsIG5lY2Vzc2FyeSBmb3Igb3B0aW1pemVkIGNvZGUKLQlwdXNoYQotCi0JbW92IGVheCxbZWJwKzhdCi0KLSAgICAgICAgY21wIGR3b3JkIFtlYXgrNF0sQllURSAwCi0JamUgZW5kY29udmVydAotCQotCW1vdiBlYnAsZWF4Ci0JCi0JbW92IGVzaSxbZWJwKzBdCi0JbW92IGVkaSxbZWJwKzE2XQotCQoteV9sb29wOgkKLQltb3YgZWN4LFtlYnArNF0KLQotCWNhbGwgW2VicCszMl0KLQotCWFkZCBlc2ksW2VicCsxMl0KLQlhZGQgZWRpLFtlYnArMjhdCi0JCi0JZGVjIGR3b3JkICBbZWJwKzhdCi0Jam56IHlfbG9vcAotCi0JCi07IFJlc3RvcmUgdGhlIHJlZ2lzdGVycyB1c2VkIGJ5IHRoZSBibGl0dGVycywgbmVjZXNzYXJ5IGZvciBvcHRpbWl6ZWQgY29kZQotCXBvcGEKLQotCXBvcCBlYnAKLQotZW5kY29udmVydDoKLQllbW1zCi0JCi0JcmV0CQkKLQotJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZgotc2VjdGlvbiAubm90ZS5HTlUtc3RhY2sgbm9hbGxvYyBub2V4ZWMgbm93cml0ZSBwcm9nYml0cwotJWVuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2hlcm1lcy9tbXhwMl8zMi5hc20gYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2hlcm1lcy9tbXhwMl8zMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZDMxZWMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMvbW14cDJfMzIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLTsKLTsgcElJLW9wdGltaXNlZCBNTVggZm9ybWF0IGNvbnZlcnRlcnMgZm9yIEhFUk1FUwotOyBDb3B5cmlnaHQgKGMpIDE5OTggQ2hyaXN0aWFuIE5lbnR3aWNoIChjLm5lbnR3aWNoQGNzLnVjbC5hYy51aykKLTsgICBhbmQgKGMpIDE5OTkgSm9uYXRoYW4gTWF0dGhldyAoam1hdHRoZXdAdXEubmV0LmF1KQotOyBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAotOyAKLTsgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgotOyBsaWNlbnNpbmcgY29uZGl0aW9ucwkJCi07Ci07IENPUFlSSUdIVCBOT1RJQ0UKLTsgCi07IFRoaXMgZmlsZSBwYXJ0bHkgY29udGFpbnMgY29kZSB0aGF0IGlzIChjKSBJbnRlbCBDb3Jwb3JhdGlvbiwgc3BlY2lmaWNhbGx5Ci07IHRoZSBtb2RlIGRldGVjdGlvbiByb3V0aW5lLCBhbmQgdGhlIGNvbnZlcnRlciB0byAxNSBiaXQgKDggcGl4ZWwKLTsgY29udmVyc2lvbiByb3V0aW5lIGZyb20gdGhlIG1teCBwcm9ncmFtbWluZyB0dXRvcmlhbCBwYWdlcykuCi07Ci07Ci07IFRoZXNlIHJvdXRpbmVzIGFyZW4ndCBleGFjdGx5IHBJSSBvcHRpbWlzZWQgLSBpdCdzIGp1c3QgdGhhdCBhcyB0aGV5Ci07IGFyZSwgdGhleSdyZSB0ZXJyaWJsZSBvbiBwNSBNTVhzLCBidXQgbGVzcyBzbyBvbiBwSUlzLiAgU29tZW9uZSBuZWVkcyB0bwotOyBvcHRpbWlzZSB0aGVtIGZvciBwNSBNTVhzLi4KLQotQklUUyAzMgotCi0laW5jbHVkZSAiY29tbW9uLmluYyIKLQkKLVNETF9GVU5DIF9Db252ZXJ0TU1YcElJMzJfMjRSR0I4ODgKLVNETF9GVU5DIF9Db252ZXJ0TU1YcElJMzJfMTZSR0I1NjUKLVNETF9GVU5DIF9Db252ZXJ0TU1YcElJMzJfMTZCR1I1NjUKLVNETF9GVU5DIF9Db252ZXJ0TU1YcElJMzJfMTZSR0I1NTUKLVNETF9GVU5DIF9Db252ZXJ0TU1YcElJMzJfMTZCR1I1NTUKLQotOzsgTWFjcm9zIGZvciBjb252ZXJzaW9uIHJvdXRpbmVzCi0KLSVtYWNybyBfcHVzaF9pbW1xX21hc2sgMQotCXB1c2ggZHdvcmQgJTEKLQlwdXNoIGR3b3JkICUxCi0lZW5kbWFjcm8KLQotJW1hY3JvIGxvYWRfaW1tcSAyCi0JX3B1c2hfaW1tcV9tYXNrICUyCi0JbW92cSAlMSwgW2VzcF0KLSVlbmRtYWNybwotCi0lbWFjcm8gcGFuZF9pbW1xIDIKLQlfcHVzaF9pbW1xX21hc2sgJTIKLQlwYW5kICUxLCBbZXNwXQotJWVuZG1hY3JvCi0KLSVkZWZpbmUgQ0xFQU5VUF9JTU1RX0xPQURTKG51bSkgXAotCWFkZCBlc3AsIGJ5dGUgOCAqIG51bQotCi0lZGVmaW5lIG1teDMyX3JnYjg4OF9tYXNrIDAwZmZmZmZmaAotJWRlZmluZSBtbXgzMl9yZ2I1NjVfYiAwMDAwMDBmOGgKLSVkZWZpbmUgbW14MzJfcmdiNTY1X2cgMDAwMGZjMDBoCi0lZGVmaW5lIG1teDMyX3JnYjU2NV9yIDAwZjgwMDAwaAotCi0lZGVmaW5lIG1teDMyX3JnYjU1NV9yYiAwMGY4MDBmOGgKLSVkZWZpbmUgbW14MzJfcmdiNTU1X2cgMDAwMGY4MDBoCi0lZGVmaW5lIG1teDMyX3JnYjU1NV9tdWwgMjAwMDAwMDhoCi0lZGVmaW5lIG1teDMyX2JncjU1NV9tdWwgMDAwODIwMDBoCi0KLVNFQ1RJT04gLnRleHQKLQotX0NvbnZlcnRNTVhwSUkzMl8yNFJHQjg4ODoKLQotICAgICAgICA7IHNldCB1cCBtbTYgYXMgdGhlIG1hc2ssIG1tNyBhcyB6ZXJvCi0gICAgICAgIGxvYWRfaW1tcSBtbTYsIG1teDMyX3JnYjg4OF9tYXNrCi0gICAgICAgIENMRUFOVVBfSU1NUV9MT0FEUygxKQotICAgICAgICBweG9yIG1tNywgbW03Ci0KLSAgICAgICAgbW92IGVkeCwgZWN4ICAgICAgICAgICAgICAgICAgICA7IHNhdmUgZWN4Ci0gICAgICAgIGFuZCBlY3gsIDBmZmZmZmZmY2ggICAgICAgICAgICAgOyBjbGVhciBsb3dlciB0d28gYml0cwotICAgICAgICBqbnogLkwxCi0gICAgICAgIGptcCAuTDIKLQotLkwxOgotCi0gICAgICAgIG1vdnEgbW0wLCBbZXNpXSAgICAgICAgICAgICAgICAgOyBBIFIgRyBCIGEgciBnIGIKLSAgICAgICAgcGFuZCBtbTAsIG1tNiAgICAgICAgICAgICAgICAgICA7IDAgUiBHIEIgMCByIGcgYgotICAgICAgICBtb3ZxIG1tMSwgW2VzaSs4XSAgICAgICAgICAgICAgIDsgQSBSIEcgQiBhIHIgZyBiCi0gICAgICAgIHBhbmQgbW0xLCBtbTYgICAgICAgICAgICAgICAgICAgOyAwIFIgRyBCIDAgciBnIGIKLQotICAgICAgICBtb3ZxIG1tMiwgbW0wICAgICAgICAgICAgICAgICAgIDsgMCBSIEcgQiAwIHIgZyBiCi0gICAgICAgIHB1bnBja2hkcSBtbTIsIG1tNyAgICAgICAgICAgICAgOyAwIDAgMCAwIDAgUiBHIEIKLSAgICAgICAgcHVucGNrbGRxIG1tMCwgbW03ICAgICAgICAgICAgICA7IDAgMCAwIDAgMCByIGcgYgotICAgICAgICBwc2xscSBtbTIsIDI0ICAgICAgICAgICAgICAgICAgIDsgMCAwIFIgRyBCIDAgMCAwCi0gICAgICAgIHBvciBtbTAsIG1tMiAgICAgICAgICAgICAgICAgICAgOyAwIDAgUiBHIEIgciBnIGIKLQotICAgICAgICBtb3ZxIG1tMywgbW0xICAgICAgICAgICAgICAgICAgIDsgMCBSIEcgQiAwIHIgZyBiCi0gICAgICAgIHBzbGxxIG1tMywgNDggICAgICAgICAgICAgICAgICAgOyBnIGIgMCAwIDAgMCAwIDAKLSAgICAgICAgcG9yIG1tMCwgbW0zICAgICAgICAgICAgICAgICAgICA7IGcgYiBSIEcgQiByIGcgYgotCi0gICAgICAgIG1vdnEgbW00LCBtbTEgICAgICAgICAgICAgICAgICAgOyAwIFIgRyBCIDAgciBnIGIKLSAgICAgICAgcHVucGNraGRxIG1tNCwgbW03ICAgICAgICAgICAgICA7IDAgMCAwIDAgMCBSIEcgQgotICAgICAgICBwdW5wY2tsZHEgbW0xLCBtbTcgICAgICAgICAgICAgIDsgMCAwIDAgMCAwIHIgZyBiCi0gICAgICAgIHBzcmxxIG1tMSwgMTYgICAgICAgICAgICAgICAgICAgOyAwIDAgMCBSIEcgQiAwIHIKLSAgICAgICAgcHNsbHEgbW00LCA4ICAgICAgICAgICAgICAgICAgICA7IDAgMCAwIDAgUiBHIEIgMAotICAgICAgICBwb3IgbW0xLCBtbTQgICAgICAgICAgICAgICAgICAgIDsgMCAwIDAgMCBSIEcgQiByCi0KLSAgICAgICAgbW92cSBbZWRpXSwgbW0wCi0gICAgICAgIGFkZCBlc2ksIEJZVEUgMTYKLSAgICAgICAgbW92ZCBbZWRpKzhdLCBtbTEKLSAgICAgICAgYWRkIGVkaSwgQllURSAxMgotICAgICAgICBzdWIgZWN4LCBCWVRFIDQKLSAgICAgICAgam56IC5MMQotCi0uTDI6Ci0gICAgICAgIG1vdiBlY3gsIGVkeAotICAgICAgICBhbmQgZWN4LCBCWVRFIDMKLSAgICAgICAganogLkw0Ci0uTDM6Ci0gICAgICAgIG1vdiBhbCwgW2VzaV0KLSAgICAgICAgbW92IGJsLCBbZXNpKzFdCi0gICAgICAgIG1vdiBkbCwgW2VzaSsyXQotICAgICAgICBtb3YgW2VkaV0sIGFsCi0gICAgICAgIG1vdiBbZWRpKzFdLCBibAotICAgICAgICBtb3YgW2VkaSsyXSwgZGwKLSAgICAgICAgYWRkIGVzaSwgQllURSA0Ci0gICAgICAgIGFkZCBlZGksIEJZVEUgMwotICAgICAgICBkZWMgZWN4Ci0gICAgICAgIGpueiAuTDMKLS5MNDoKLSAgICAgICAgcmV0dXJuCi0KLQotCi1fQ29udmVydE1NWHBJSTMyXzE2UkdCNTY1OgotCi0gICAgICAgIDsgc2V0IHVwIG1hc2tzCi0gICAgICAgIGxvYWRfaW1tcSBtbTUsIG1teDMyX3JnYjU2NV9iCi0gICAgICAgIGxvYWRfaW1tcSBtbTYsIG1teDMyX3JnYjU2NV9nCi0gICAgICAgIGxvYWRfaW1tcSBtbTcsIG1teDMyX3JnYjU2NV9yCi0gICAgICAgIENMRUFOVVBfSU1NUV9MT0FEUygzKQotCi0gICAgICAgIG1vdiBlZHgsIGVjeAotICAgICAgICBzaHIgZWN4LCAyCi0gICAgICAgIGpueiAuTDEKLSAgICAgICAgam1wIC5MMiAgICAgICAgIDsgbm90IG5lY2Vzc2FyeSBhdCB0aGUgbW9tZW50LCBidXQgZG9lc24ndCBodXJ0IChtdWNoKQotCi0uTDE6Ci0gICAgICAgIG1vdnEgbW0wLCBbZXNpXSAgICAgICAgIDsgYXJnYgotICAgICAgICBtb3ZxIG1tMSwgbW0wICAgICAgICAgICA7IGFyZ2IKLSAgICAgICAgcGFuZCBtbTAsIG1tNiAgICAgICAgICAgOyAwMGcwCi0gICAgICAgIG1vdnEgbW0zLCBtbTEgICAgICAgICAgIDsgYXJnYgotICAgICAgICBwYW5kIG1tMSwgbW01ICAgICAgICAgICA7IDAwMGIKLSAgICAgICAgcGFuZCBtbTMsIG1tNyAgICAgICAgICAgOyAwcjAwCi0gICAgICAgIHBzbGxkIG1tMSwgMiAgICAgICAgICAgIDsgMCAwIDAwMDAwMGJiIGJiYjAwMDAwCi0gICAgICAgIHBvciBtbTAsIG1tMSAgICAgICAgICAgIDsgMCAwIGdnZ2dnZ2JiIGJiYjAwMDAwCi0gICAgICAgIHBzcmxkIG1tMCwgNSAgICAgICAgICAgIDsgMCAwIDAwMDAwZ2dnIGdnZ2JiYmJiCi0KLSAgICAgICAgbW92cSBtbTQsIFtlc2krOF0gICAgICAgOyBhcmdiCi0gICAgICAgIG1vdnEgbW0yLCBtbTQgICAgICAgICAgIDsgYXJnYgotICAgICAgICBwYW5kIG1tNCwgbW02ICAgICAgICAgICA7IDAwZzAKLSAgICAgICAgbW92cSBtbTEsIG1tMiAgICAgICAgICAgOyBhcmdiCi0gICAgICAgIHBhbmQgbW0yLCBtbTUgICAgICAgICAgIDsgMDAwYgotICAgICAgICBwYW5kIG1tMSwgbW03ICAgICAgICAgICA7IDByMDAKLSAgICAgICAgcHNsbGQgbW0yLCAyICAgICAgICAgICAgOyAwIDAgMDAwMDAwYmIgYmJiMDAwMDAKLSAgICAgICAgcG9yIG1tNCwgbW0yICAgICAgICAgICAgOyAwIDAgZ2dnZ2dnYmIgYmJiMDAwMDAKLSAgICAgICAgcHNybGQgbW00LCA1ICAgICAgICAgICAgOyAwIDAgMDAwMDBnZ2cgZ2dnYmJiYmIKLQotICAgICAgICBwYWNrdXN3YiBtbTMsIG1tMSAgICAgICA7IFIgMCByIDAKLSAgICAgICAgcGFja3NzZHcgbW0wLCBtbTQgICAgICAgOyBhcyBhYm92ZS4uIGlzaAotICAgICAgICBwb3IgbW0wLCBtbTMgICAgICAgICAgICA7IGRvbmUuCi0gICAgICAgIG1vdnEgW2VkaV0sIG1tMAotCi0gICAgICAgIGFkZCBlc2ksIDE2Ci0gICAgICAgIGFkZCBlZGksIDgKLSAgICAgICAgZGVjIGVjeAotICAgICAgICBqbnogLkwxCi0KLS5MMjoKLSAgICAgICAgbW92IGVjeCwgZWR4Ci0gICAgICAgIGFuZCBlY3gsIEJZVEUgMwotICAgICAgICBqeiAuTDQKLS5MMzoKLSAgICAgICAgbW92IGFsLCBbZXNpXQotICAgICAgICBtb3YgYmgsIFtlc2krMV0KLSAgICAgICAgbW92IGFoLCBbZXNpKzJdCi0gICAgICAgIHNociBhbCwgMwotICAgICAgICBhbmQgZWF4LCAwRjgxRmggICAgICAgICAgICA7IEJZVEU/Ci0gICAgICAgIHNociBlYngsIDUKLSAgICAgICAgYW5kIGVieCwgMDdFMGggICAgICAgICAgICAgOyBCWVRFPwotICAgICAgICBhZGQgZWF4LCBlYngKLSAgICAgICAgbW92IFtlZGldLCBhbAotICAgICAgICBtb3YgW2VkaSsxXSwgYWgKLSAgICAgICAgYWRkIGVzaSwgQllURSA0Ci0gICAgICAgIGFkZCBlZGksIEJZVEUgMgotICAgICAgICBkZWMgZWN4Ci0gICAgICAgIGpueiAuTDMKLQotLkw0OgotCXJldG4KLQotCQotX0NvbnZlcnRNTVhwSUkzMl8xNkJHUjU2NToKLQotICAgICAgICBsb2FkX2ltbXEgbW01LCBtbXgzMl9yZ2I1NjVfcgotICAgICAgICBsb2FkX2ltbXEgbW02LCBtbXgzMl9yZ2I1NjVfZwotICAgICAgICBsb2FkX2ltbXEgbW03LCBtbXgzMl9yZ2I1NjVfYgotICAgICAgICBDTEVBTlVQX0lNTVFfTE9BRFMoMykKLQotICAgICAgICBtb3YgZWR4LCBlY3gKLSAgICAgICAgc2hyIGVjeCwgMgotICAgICAgICBqbnogLkwxCi0gICAgICAgIGptcCAuTDIKLQotLkwxOgotICAgICAgICBtb3ZxIG1tMCwgW2VzaV0gICAgICAgICAgICAgICAgIDsgYSByIGcgYgotICAgICAgICBtb3ZxIG1tMSwgbW0wICAgICAgICAgICAgICAgICAgIDsgYSByIGcgYgotICAgICAgICBwYW5kIG1tMCwgbW02ICAgICAgICAgICAgICAgICAgIDsgMCAwIGcgMAotICAgICAgICBtb3ZxIG1tMywgbW0xICAgICAgICAgICAgICAgICAgIDsgYSByIGcgYgotICAgICAgICBwYW5kIG1tMSwgbW01ICAgICAgICAgICAgICAgICAgIDsgMCByIDAgMAotICAgICAgICBwYW5kIG1tMywgbW03ICAgICAgICAgICAgICAgICAgIDsgMCAwIDAgYgotCi0gICAgICAgIHBzbGxxIG1tMywgMTYgICAgICAgICAgICAgICAgICAgOyAwIGIgMCAwCi0gICAgICAgIHBzcmxkIG1tMSwgMTQgICAgICAgICAgICAgICAgICAgOyAwIDAgMDAwMDAwcnIgcnJyMDAwMDAKLSAgICAgICAgcG9yIG1tMCwgbW0xICAgICAgICAgICAgICAgICAgICA7IDAgMCBnZ2dnZ2dyciBycnIwMDAwMAotICAgICAgICBwc3JsZCBtbTAsIDUgICAgICAgICAgICAgICAgICAgIDsgMCAwIDAwMDAwZ2dnIGdnZ3JycnJyCi0KLSAgICAgICAgbW92cSBtbTQsIFtlc2krOF0gICAgICAgICAgICAgICA7IGEgciBnIGIKLSAgICAgICAgbW92cSBtbTIsIG1tNCAgICAgICAgICAgICAgICAgICA7IGEgciBnIGIKLSAgICAgICAgcGFuZCBtbTQsIG1tNiAgICAgICAgICAgICAgICAgICA7IDAgMCBnIDAKLSAgICAgICAgbW92cSBtbTEsIG1tMiAgICAgICAgICAgICAgICAgICA7IGEgciBnIGIKLSAgICAgICAgcGFuZCBtbTIsIG1tNSAgICAgICAgICAgICAgICAgICA7IDAgciAwIDAKLSAgICAgICAgcGFuZCBtbTEsIG1tNyAgICAgICAgICAgICAgICAgICA7IDAgMCAwIGIKLQotICAgICAgICBwc2xscSBtbTEsIDE2ICAgICAgICAgICAgICAgICAgIDsgMCBiIDAgMAotICAgICAgICBwc3JsZCBtbTIsIDE0ICAgICAgICAgICAgICAgICAgIDsgMCAwIDAwMDAwMHJyIHJycjAwMDAwCi0gICAgICAgIHBvciBtbTQsIG1tMiAgICAgICAgICAgICAgICAgICAgOyAwIDAgZ2dnZ2dncnIgcnJyMDAwMDAKLSAgICAgICAgcHNybGQgbW00LCA1ICAgICAgICAgICAgICAgICAgICA7IDAgMCAwMDAwMGdnZyBnZ2dycnJycgotCi0gICAgICAgIHBhY2t1c3diIG1tMywgbW0xICAgICAgICAgICAgICAgOyBCQkJCQjAwMCAwMDAwMDAwMCBiYmJiYjAwMCAwMDAwMDAwMAotICAgICAgICBwYWNrc3NkdyBtbTAsIG1tNCAgICAgICAgICAgICAgIDsgMDAwMDBHR0cgR0dHUlJSUlIgMDAwMDBHR0cgR0dHUlJSUlIKLSAgICAgICAgcG9yIG1tMCwgbW0zICAgICAgICAgICAgICAgICAgICA7IEJCQkJCR0dHIEdHR1JSUlJSIGJiYmJiZ2dnIGdnZ3JycnJyCi0gICAgICAgIG1vdnEgW2VkaV0sIG1tMAotCi0gICAgICAgIGFkZCBlc2ksIEJZVEUgMTYKLSAgICAgICAgYWRkIGVkaSwgQllURSA4Ci0gICAgICAgIGRlYyBlY3gKLSAgICAgICAgam56IC5MMQotCi0uTDI6Ci0gICAgICAgIGFuZCBlZHgsIEJZVEUgMwotICAgICAgICBqeiAuTDQKLS5MMzoKLSAgICAgICAgbW92IGFsLCBbZXNpKzJdCi0gICAgICAgIG1vdiBiaCwgW2VzaSsxXQotICAgICAgICBtb3YgYWgsIFtlc2ldCi0gICAgICAgIHNociBhbCwgMwotICAgICAgICBhbmQgZWF4LCAwRjgxRmggICAgICAgICAgICAgICAgICAgIDsgQllURSA/Ci0gICAgICAgIHNociBlYngsIDUKLSAgICAgICAgYW5kIGVieCwgMDdFMGggICAgICAgICAgICAgICAgICAgICA7IEJZVEUgPwotICAgICAgICBhZGQgZWF4LCBlYngKLSAgICAgICAgbW92IFtlZGldLCBhbAotICAgICAgICBtb3YgW2VkaSsxXSwgYWgKLSAgICAgICAgYWRkIGVzaSwgQllURSA0Ci0gICAgICAgIGFkZCBlZGksIEJZVEUgMgotICAgICAgICBkZWMgZWR4Ci0gICAgICAgIGpueiAuTDMKLQotLkw0OgotICAgICAgICByZXRuCi0KLV9Db252ZXJ0TU1YcElJMzJfMTZCR1I1NTU6Ci0KLSAgICAgICAgOyB0aGUgMTZCR1I1NTUgY29udmVydGVyIGlzIGlkZW50aWNhbCB0byB0aGUgUkdCNTU1IG9uZSwKLSAgICAgICAgOyBleGNlcHQgaXQgdXNlcyBhIGRpZmZlcmVudCBtdWx0aXBsaWVyIGZvciB0aGUgcG1hZGR3ZAotICAgICAgICA7IGluc3RydWN0aW9uLiAgY29vbCBodWguCi0KLSAgICAgICAgbG9hZF9pbW1xIG1tNywgbW14MzJfYmdyNTU1X211bAotICAgICAgICBqbXAgX2NvbnZlcnRfYmdyNTU1X2NoZWF0Ci0KLTsgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgSW50ZWwgdmVyc2lvbi4uIHRoZXkgb2J2aW91c2x5IHdlbnQgdG8KLTsgbXVjaCBtb3JlIHRyb3VibGUgdG8gZXhwYW5kL2NvaWwgdGhlIGxvb3AgdGhhbiBJIGRpZCwgc28gdGhlaXJzCi07IHdvdWxkIGFsbW9zdCBjZXJ0YWlubHkgYmUgZmFzdGVyLCBldmVuIGlmIG9ubHkgYSBsaXR0bGUuCi07IEkgZGlkIHJlbmFtZSAnbW14MzJfcmdiNTU1X2FkZCcgdG8gJ21teDMyX3JnYjU1NV9tdWwnLCB3aGljaCBpcwotOyAoSSB0aGluaykgYSBtb3JlIGFjY3VyYXRlIG5hbWUuLgotX0NvbnZlcnRNTVhwSUkzMl8xNlJHQjU1NToKLQotCWxvYWRfaW1tcSBtbTcsIG1teDMyX3JnYjU1NV9tdWwKLV9jb252ZXJ0X2JncjU1NV9jaGVhdDoKLQlsb2FkX2ltbXEgbW02LCBtbXgzMl9yZ2I1NTVfZwotCUNMRUFOVVBfSU1NUV9MT0FEUygyKQotICAgICAgICAKLQltb3YgZWR4LGVjeAkJICAgICAgICAgICA7IFNhdmUgZWN4IAotCi0gICAgICAgIGFuZCBlY3gsRFdPUkQgMGZmZmZmZmY4aCAgICAgICAgICAgIDsgY2xlYXIgbG93ZXIgdGhyZWUgYml0cwotCWpueiAuTF9PSwotICAgICAgICBqbXAgbmVhciAuTDIgCi0KLS5MX09LOgotCQotCW1vdnEgbW0yLFtlc2krOF0KLQotCW1vdnEgbW0wLFtlc2ldCi0JbW92cSBtbTMsbW0yCi0KLQlwYW5kX2ltbXEgbW0zLCBtbXgzMl9yZ2I1NTVfcmIKLQltb3ZxIG1tMSxtbTAKLQotCXBhbmRfaW1tcSBtbTEsIG1teDMyX3JnYjU1NV9yYgotCXBtYWRkd2QgbW0zLG1tNwotCi0JQ0xFQU5VUF9JTU1RX0xPQURTKDIpCi0KLQlwbWFkZHdkIG1tMSxtbTcKLQlwYW5kIG1tMixtbTYKLQotLkwxOgotCW1vdnEgbW00LFtlc2krMjRdCi0JcGFuZCBtbTAsbW02Ci0KLQltb3ZxIG1tNSxbZXNpKzE2XQotCXBvciBtbTMsbW0yCi0KLQlwc3JsZCBtbTMsNgotCXBvciBtbTEsbW0wCi0KLQltb3ZxIG1tMCxtbTQKLQlwc3JsZCBtbTEsNgotCi0JcGFuZF9pbW1xIG1tMCwgbW14MzJfcmdiNTU1X3JiCi0JcGFja3NzZHcgbW0xLG1tMwotCi0JbW92cSBtbTMsbW01Ci0JcG1hZGR3ZCBtbTAsbW03Ci0KLQlwYW5kX2ltbXEgbW0zLCBtbXgzMl9yZ2I1NTVfcmIKLQlwYW5kIG1tNCxtbTYKLQotCW1vdnEgW2VkaV0sbW0xCQkJCi0JcG1hZGR3ZCBtbTMsbW03Ci0KLSAgICAgICAgYWRkIGVzaSxCWVRFIDMyCi0JcG9yIG1tNCxtbTAKLQotCXBhbmQgbW01LG1tNgotCXBzcmxkIG1tNCw2Ci0KLQltb3ZxIG1tMixbZXNpKzhdCi0JcG9yIG1tNSxtbTMKLQotCW1vdnEgbW0wLFtlc2ldCi0JcHNybGQgbW01LDYKLQotCW1vdnEgbW0zLG1tMgotCW1vdnEgbW0xLG1tMAotCi0JcGFuZF9pbW1xIG1tMywgbW14MzJfcmdiNTU1X3JiCi0JcGFja3NzZHcgbW01LG1tNAotCi0JcGFuZF9pbW1xIG1tMSwgbW14MzJfcmdiNTU1X3JiCi0JcGFuZCBtbTIsbW02Ci0KLQlDTEVBTlVQX0lNTVFfTE9BRFMoNCkKLQotCW1vdnEgW2VkaSs4XSxtbTUKLQlwbWFkZHdkIG1tMyxtbTcKLQotCXBtYWRkd2QgbW0xLG1tNwotICAgICAgICBhZGQgZWRpLEJZVEUgMTYKLQkKLSAgICAgICAgc3ViIGVjeCxCWVRFIDgKLQlqeiAuTDIKLSAgICAgICAgam1wIC5MMQotCi0KLS5MMjoJCi0JbW92IGVjeCxlZHgKLQkKLSAgICAgICAgYW5kIGVjeCxCWVRFIDcKLQlqeiAuTDQKLQkKLS5MMzoJCi0JbW92IGVieCxbZXNpXQotICAgICAgICBhZGQgZXNpLEJZVEUgNAotCQotICAgICAgICBtb3YgZWF4LGVieAotICAgICAgICBtb3YgZWR4LGVieAotCi0gICAgICAgIHNociBlYXgsMwotICAgICAgICBzaHIgZWR4LDYKLQotICAgICAgICBhbmQgZWF4LEJZVEUgMDAwMDAwMDAwMDAxMTExMWIKLSAgICAgICAgYW5kIGVkeCwgICAgIDAwMDAwMDExMTExMDAwMDBiCi0KLSAgICAgICAgc2hyIGVieCw5Ci0KLSAgICAgICAgb3IgZWF4LGVkeAotCi0gICAgICAgIGFuZCBlYngsICAgICAwMTExMTEwMDAwMDAwMDAwYgotCi0gICAgICAgIG9yIGVheCxlYngKLQotICAgICAgICBtb3YgW2VkaV0sYXgKLSAgICAgICAgYWRkIGVkaSxCWVRFIDIKLQotCWRlYyBlY3gKLQlqbnogLkwzCQotCi0uTDQ6CQkKLQlyZXRuCi0KLSVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGYKLXNlY3Rpb24gLm5vdGUuR05VLXN0YWNrIG5vYWxsb2Mgbm9leGVjIG5vd3JpdGUgcHJvZ2JpdHMKLSVlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMveDg2X21haW4uYXNtIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMveDg2X21haW4uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhiZjhmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvaGVybWVzL3g4Nl9tYWluLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTsKLTsgeDg2IGZvcm1hdCBjb252ZXJ0ZXJzIGZvciBIRVJNRVMKLTsgU29tZSByb3V0aW5lcyBDb3B5cmlnaHQgKGMpIDE5OTggQ2hyaXN0aWFuIE5lbnR3aWNoIChicm5AZWxlZXQubWNiLmF0KQotOyBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAotOyAKLTsgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgotOyBsaWNlbnNpbmcgY29uZGl0aW9ucwkJCi07Ci07IE1vc3Qgcm91dGluZXMgYXJlIChjKSBHbGVubiBGaWVkbGVyIChwdGNAZ2FmZmVyLm9yZyksIHVzZWQgd2l0aCBwZXJtaXNzaW9uCi07IAotCi1CSVRTIDMyCi0KLSVpbmNsdWRlICJjb21tb24uaW5jIgotCi1TRExfRlVOQyBfQ29udmVydFg4NgotCi1TRUNUSU9OIC50ZXh0Ci0JCQotOzsgX0NvbnZlcnRYODY6CSAKLTs7IFtFU1ArOF0gQ29udmVydGVySW5mbyoKLTs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07OyBDb252ZXJ0ZXJJbmZvIChlYnArLi4pCi07OyAgIDA6CXZvaWQgKnNfcGl4ZWxzCi07OyAgIDQ6CWludCBzX3dpZHRoCi07OyAgIDg6CWludCBzX2hlaWdodAotOzsgIDEyOglpbnQgc19hZGQKLTs7ICAxNjoJdm9pZCAqZF9waXhlbHMKLTs7ICAyMDoJaW50IGRfd2lkdGgKLTs7ICAyNDoJaW50IGRfaGVpZ2h0Ci07OyAgMjg6CWludCBkX2FkZAotOzsgIDMyOgl2b2lkICgqY29udmVydGVyX2Z1bmN0aW9uKSgpIAotOzsgIDM2OiBpbnQzMiAqbG9va3VwCi0JCi1fQ29udmVydFg4NjoKLQlwdXNoIGVicAotCW1vdiBlYnAsZXNwCi0KLTsgU2F2ZSB0aGUgcmVnaXN0ZXJzIHVzZWQgYnkgdGhlIGJsaXR0ZXJzLCBuZWNlc3NhcnkgZm9yIG9wdGltaXplZCBjb2RlCi0JcHVzaGEKLQotCW1vdiBlYXgsW2VicCs4XQotCi0gICAgICAgIGNtcCBkd29yZCBbZWF4KzRdLEJZVEUgMAotCWplIGVuZGNvbnZlcnQKLQkKLQltb3YgZWJwLGVheAotCQotCW1vdiBlc2ksW2VicCswXQotCW1vdiBlZGksW2VicCsxNl0KLQkKLXlfbG9vcDoJCi0JbW92IGVjeCxbZWJwKzRdCi0KLQljYWxsIFtlYnArMzJdCi0KLQlhZGQgZXNpLFtlYnArMTJdCi0JYWRkIGVkaSxbZWJwKzI4XQotCQotCWRlYyBkd29yZCAgW2VicCs4XQotCWpueiB5X2xvb3AKLQotOyBSZXN0b3JlIHRoZSByZWdpc3RlcnMgdXNlZCBieSB0aGUgYmxpdHRlcnMsIG5lY2Vzc2FyeSBmb3Igb3B0aW1pemVkIGNvZGUKLQlwb3BhCi0JCi0JcG9wIGVicAotCi1lbmRjb252ZXJ0OgkKLQlyZXQJCQotCi0KLQotJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZgotc2VjdGlvbiAubm90ZS5HTlUtc3RhY2sgbm9hbGxvYyBub2V4ZWMgbm93cml0ZSBwcm9nYml0cwotJWVuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2hlcm1lcy94ODZwXzE2LmFzbSBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvaGVybWVzL3g4NnBfMTYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzVjNzVkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvaGVybWVzL3g4NnBfMTYuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLTsKLTsgeDg2IGZvcm1hdCBjb252ZXJ0ZXJzIGZvciBIRVJNRVMKLTsgQ29weXJpZ2h0IChjKSAxOTk4IEdsZW5uIEZpZWxkZXIgKGdhZmZlckBnYWZmZXIub3JnKQotOyBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAotOyAKLTsgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgotOyBsaWNlbnNpbmcgY29uZGl0aW9ucwkJCi07IAotOyBSb3V0aW5lcyBhZGp1c3RlZCBmb3IgSGVybWVzIGJ5IENocmlzdGlhbiBOZW50d2ljaCAoYnJuQGVsZWV0Lm1jYi5hdCkKLTsgVXNlZCB3aXRoIHBlcm1pc3Npb24uCi07IAotCi1CSVRTIDMyCi0KLSVpbmNsdWRlICJjb21tb24uaW5jIgotCi1TRExfRlVOQyBfQ29udmVydFg4NnAxNl8xNkJHUjU2NQotU0RMX0ZVTkMgX0NvbnZlcnRYODZwMTZfMTZSR0I1NTUKLVNETF9GVU5DIF9Db252ZXJ0WDg2cDE2XzE2QkdSNTU1Ci1TRExfRlVOQyBfQ29udmVydFg4NnAxNl84UkdCMzMyCi0KLUVYVEVSTiBfQ29udmVydFg4NgotCi1TRUNUSU9OIC50ZXh0Ci0KLV9Db252ZXJ0WDg2cDE2XzE2QkdSNTY1OgotCi0gICAgOyBjaGVjayBzaG9ydAotICAgIGNtcCBlY3gsQllURSAxNgotICAgIGphIC5MMwotCi0KLS5MMSA7IHNob3J0IGxvb3AKLSAgICBtb3YgYWwsW2VzaV0KLSAgICBtb3YgYWgsW2VzaSsxXQotICAgIG1vdiBlYngsZWF4Ci0gICAgbW92IGVkeCxlYXgKLSAgICBzaHIgZWF4LDExCi0gICAgYW5kIGVheCxCWVRFIDExMTExYgotICAgIGFuZCBlYngsMTExMTExMDAwMDBiCi0gICAgc2hsIGVkeCwxMQotICAgIGFkZCBlYXgsZWJ4Ci0gICAgYWRkIGVheCxlZHgKLSAgICBtb3YgW2VkaV0sYWwKLSAgICBtb3YgW2VkaSsxXSxhaAotICAgIGFkZCBlc2ksQllURSAyCi0gICAgYWRkIGVkaSxCWVRFIDIKLSAgICBkZWMgZWN4Ci0gICAgam56IC5MMQotLkwyCi0gICAgcmV0bgotCi0uTDMgOyBoZWFkCi0gICAgbW92IGVheCxlZGkKLSAgICBhbmQgZWF4LEJZVEUgMTFiCi0gICAganogLkw0Ci0gICAgbW92IGFsLFtlc2ldCi0gICAgbW92IGFoLFtlc2krMV0KLSAgICBtb3YgZWJ4LGVheAotICAgIG1vdiBlZHgsZWF4Ci0gICAgc2hyIGVheCwxMQotICAgIGFuZCBlYXgsQllURSAxMTExMWIKLSAgICBhbmQgZWJ4LDExMTExMTAwMDAwYgotICAgIHNobCBlZHgsMTEKLSAgICBhZGQgZWF4LGVieAotICAgIGFkZCBlYXgsZWR4Ci0gICAgbW92IFtlZGldLGFsCi0gICAgbW92IFtlZGkrMV0sYWgKLSAgICBhZGQgZXNpLEJZVEUgMgotICAgIGFkZCBlZGksQllURSAyCi0gICAgZGVjIGVjeAotCi0uTDQgOyBzYXZlIGNvdW50Ci0gICAgcHVzaCBlY3gKLQotICAgIDsgdW5yb2xsIHR3aWNlCi0gICAgc2hyIGVjeCwxCi0gICAgCi0gICAgOyBwb2ludCBhcnJheXMgdG8gZW5kCi0gICAgbGVhIGVzaSxbZXNpK2VjeCo0XQotICAgIGxlYSBlZGksW2VkaStlY3gqNF0KLQotICAgIDsgbmVnYXRpdmUgY291bnRlciAKLSAgICBuZWcgZWN4Ci0gICAgam1wIFNIT1JUIC5MNgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0uTDUgICAgIG1vdiBbZWRpK2VjeCo0LTRdLGVheAotLkw2ICAgICBtb3YgZWF4LFtlc2krZWN4KjRdCi0KLSAgICAgICAgbW92IGVieCxbZXNpK2VjeCo0XQotICAgICAgICBhbmQgZWF4LDA3RTAwN0UwaCAgICAgICAgIAotCi0gICAgICAgIG1vdiBlZHgsW2VzaStlY3gqNF0KLSAgICAgICAgYW5kIGVieCwwRjgwMEY4MDBoCi0KLSAgICAgICAgc2hyIGVieCwxMQotICAgICAgICBhbmQgZWR4LDAwMUYwMDFGaAotCi0gICAgICAgIHNobCBlZHgsMTEKLSAgICAgICAgYWRkIGVheCxlYngKLQotICAgICAgICBhZGQgZWF4LGVkeCAgICAgICAgICAgICAgICAgCi0gICAgICAgIGluYyBlY3gKLQotICAgICAgICBqbnogLkw1ICAgICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgIG1vdiBbZWRpK2VjeCo0LTRdLGVheAotCi0gICAgOyB0YWlsCi0gICAgcG9wIGVjeAotICAgIGFuZCBlY3gsQllURSAxCi0gICAganogLkw3Ci0gICAgbW92IGFsLFtlc2ldCi0gICAgbW92IGFoLFtlc2krMV0KLSAgICBtb3YgZWJ4LGVheAotICAgIG1vdiBlZHgsZWF4Ci0gICAgc2hyIGVheCwxMQotICAgIGFuZCBlYXgsQllURSAxMTExMWIKLSAgICBhbmQgZWJ4LDExMTExMTAwMDAwYgotICAgIHNobCBlZHgsMTEKLSAgICBhZGQgZWF4LGVieAotICAgIGFkZCBlYXgsZWR4Ci0gICAgbW92IFtlZGldLGFsCi0gICAgbW92IFtlZGkrMV0sYWgKLSAgICBhZGQgZXNpLEJZVEUgMgotICAgIGFkZCBlZGksQllURSAyCi0KLS5MNwotICAgIHJldG4KLQotCi0KLQotCi0KLV9Db252ZXJ0WDg2cDE2XzE2UkdCNTU1OgotCi0gICAgOyBjaGVjayBzaG9ydAotICAgIGNtcCBlY3gsQllURSAzMgotICAgIGphIC5MMwotCi0KLS5MMSA7IHNob3J0IGxvb3AKLSAgICBtb3YgYWwsW2VzaV0KLSAgICBtb3YgYWgsW2VzaSsxXQotICAgIG1vdiBlYngsZWF4Ci0gICAgc2hyIGVieCwxCi0gICAgYW5kIGVieCwgICAgIDAxMTExMTExMTExMDAwMDBiCi0gICAgYW5kIGVheCxCWVRFIDAwMDAwMDAwMDAwMTExMTFiCi0gICAgYWRkIGVheCxlYngKLSAgICBtb3YgW2VkaV0sYWwKLSAgICBtb3YgW2VkaSsxXSxhaAotICAgIGFkZCBlc2ksQllURSAyCi0gICAgYWRkIGVkaSxCWVRFIDIKLSAgICBkZWMgZWN4Ci0gICAgam56IC5MMQotLkwyCi0gICAgcmV0bgotCi0uTDMgOyBoZWFkCi0gICAgbW92IGVheCxlZGkKLSAgICBhbmQgZWF4LEJZVEUgMTFiCi0gICAganogLkw0Ci0gICAgbW92IGFsLFtlc2ldCi0gICAgbW92IGFoLFtlc2krMV0KLSAgICBtb3YgZWJ4LGVheAotICAgIHNociBlYngsMQotICAgIGFuZCBlYngsICAgICAwMTExMTExMTExMTAwMDAwYgotICAgIGFuZCBlYXgsQllURSAwMDAwMDAwMDAwMDExMTExYgotICAgIGFkZCBlYXgsZWJ4Ci0gICAgbW92IFtlZGldLGFsCi0gICAgbW92IFtlZGkrMV0sYWgKLSAgICBhZGQgZXNpLEJZVEUgMgotICAgIGFkZCBlZGksQllURSAyCi0gICAgZGVjIGVjeAotCi0uTDQgOyBzYXZlIGVicAotICAgIHB1c2ggZWJwCi0KLSAgICA7IHNhdmUgY291bnQKLSAgICBwdXNoIGVjeAotCi0gICAgOyB1bnJvbGwgZm91ciB0aW1lcwotICAgIHNociBlY3gsMgotICAgIAotICAgIDsgcG9pbnQgYXJyYXlzIHRvIGVuZAotICAgIGxlYSBlc2ksW2VzaStlY3gqOF0KLSAgICBsZWEgZWRpLFtlZGkrZWN4KjhdCi0KLSAgICA7IG5lZ2F0aXZlIGNvdW50ZXIgCi0gICAgeG9yIGVicCxlYnAKLSAgICBzdWIgZWJwLGVjeAotCi0uTDUgICAgIG1vdiBlYXgsW2VzaStlYnAqOF0gICAgICAgIDsgYWdpPwotICAgICAgICBtb3YgZWN4LFtlc2krZWJwKjgrNF0KLSAgICAgICAKLSAgICAgICAgbW92IGVieCxlYXgKLSAgICAgICAgbW92IGVkeCxlY3gKLQotICAgICAgICBhbmQgZWF4LDBGRkMwRkZDMGgKLSAgICAgICAgYW5kIGVjeCwwRkZDMEZGQzBoCi0KLSAgICAgICAgc2hyIGVheCwxCi0gICAgICAgIGFuZCBlYngsMDAxRjAwMUZoCi0KLSAgICAgICAgc2hyIGVjeCwxCi0gICAgICAgIGFuZCBlZHgsMDAxRjAwMUZoCi0KLSAgICAgICAgYWRkIGVheCxlYngKLSAgICAgICAgYWRkIGVjeCxlZHgKLQotICAgICAgICBtb3YgW2VkaStlYnAqOF0sZWF4Ci0gICAgICAgIG1vdiBbZWRpK2VicCo4KzRdLGVjeAotCi0gICAgICAgIGluYyBlYnAKLSAgICAgICAgam56IC5MNSAgICAgICAgICAgICAgICAgCi0KLSAgICA7IHRhaWwKLSAgICBwb3AgZWN4Ci0uTDYgYW5kIGVjeCxCWVRFIDExYgotICAgIGp6IC5MNwotICAgIG1vdiBhbCxbZXNpXQotICAgIG1vdiBhaCxbZXNpKzFdCi0gICAgbW92IGVieCxlYXgKLSAgICBzaHIgZWJ4LDEKLSAgICBhbmQgZWJ4LCAgICAgMDExMTExMTExMTEwMDAwMGIKLSAgICBhbmQgZWF4LEJZVEUgMDAwMDAwMDAwMDAxMTExMWIKLSAgICBhZGQgZWF4LGVieAotICAgIG1vdiBbZWRpXSxhbAotICAgIG1vdiBbZWRpKzFdLGFoCi0gICAgYWRkIGVzaSxCWVRFIDIKLSAgICBhZGQgZWRpLEJZVEUgMgotICAgIGRlYyBlY3gKLSAgICBqbXAgU0hPUlQgLkw2Ci0KLS5MNyBwb3AgZWJwCi0gICAgcmV0bgotCi0KLQotCi0KLQotX0NvbnZlcnRYODZwMTZfMTZCR1I1NTU6Ci0KLSAgICA7IGNoZWNrIHNob3J0Ci0gICAgY21wIGVjeCxCWVRFIDE2Ci0gICAgamEgLkwzCi0KLQkKLS5MMSA7IHNob3J0IGxvb3AKLSAgICBtb3YgYWwsW2VzaV0KLSAgICBtb3YgYWgsW2VzaSsxXQotICAgIG1vdiBlYngsZWF4Ci0gICAgbW92IGVkeCxlYXgKLSAgICBzaHIgZWF4LDExCi0gICAgYW5kIGVheCxCWVRFIDExMTExYgotICAgIHNociBlYngsMQotICAgIGFuZCBlYngsMTExMTEwMDAwMGIKLSAgICBzaGwgZWR4LDEwCi0gICAgYW5kIGVkeCwwMTExMTEwMDAwMDAwMDAwYgotICAgIGFkZCBlYXgsZWJ4Ci0gICAgYWRkIGVheCxlZHgKLSAgICBtb3YgW2VkaV0sYWwKLSAgICBtb3YgW2VkaSsxXSxhaAotICAgIGFkZCBlc2ksQllURSAyCi0gICAgYWRkIGVkaSxCWVRFIDIKLSAgICBkZWMgZWN4Ci0gICAgam56IC5MMQotLkwyCi0gICAgcmV0bgotCi0uTDMgOyBoZWFkCi0gICAgbW92IGVheCxlZGkKLSAgICBhbmQgZWF4LEJZVEUgMTFiCi0gICAganogLkw0Ci0gICAgbW92IGFsLFtlc2ldCi0gICAgbW92IGFoLFtlc2krMV0KLSAgICBtb3YgZWJ4LGVheAotICAgIG1vdiBlZHgsZWF4Ci0gICAgc2hyIGVheCwxMQotICAgIGFuZCBlYXgsQllURSAxMTExMWIKLSAgICBzaHIgZWJ4LDEKLSAgICBhbmQgZWJ4LDExMTExMDAwMDBiCi0gICAgc2hsIGVkeCwxMAotICAgIGFuZCBlZHgsMDExMTExMDAwMDAwMDAwMGIKLSAgICBhZGQgZWF4LGVieAotICAgIGFkZCBlYXgsZWR4Ci0gICAgbW92IFtlZGldLGFsCi0gICAgbW92IFtlZGkrMV0sYWgKLSAgICBhZGQgZXNpLEJZVEUgMgotICAgIGFkZCBlZGksQllURSAyCi0gICAgZGVjIGVjeAotCi0uTDQgOyBzYXZlIGNvdW50Ci0gICAgcHVzaCBlY3gKLQotICAgIDsgdW5yb2xsIHR3aWNlCi0gICAgc2hyIGVjeCwxCi0gICAgCi0gICAgOyBwb2ludCBhcnJheXMgdG8gZW5kCi0gICAgbGVhIGVzaSxbZXNpK2VjeCo0XQotICAgIGxlYSBlZGksW2VkaStlY3gqNF0KLQotICAgIDsgbmVnYXRpdmUgY291bnRlciAKLSAgICBuZWcgZWN4Ci0gICAgam1wIFNIT1JUIC5MNgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0uTDUgICAgIG1vdiBbZWRpK2VjeCo0LTRdLGVheAotLkw2ICAgICBtb3YgZWF4LFtlc2krZWN4KjRdCi0KLSAgICAgICAgc2hyIGVheCwxCi0gICAgICAgIG1vdiBlYngsW2VzaStlY3gqNF0KLSAgICAgICAgCi0gICAgICAgIGFuZCBlYXgsMDNFMDAzRTBoICAgICAgICAgCi0gICAgICAgIG1vdiBlZHgsW2VzaStlY3gqNF0KLQotICAgICAgICBhbmQgZWJ4LDBGODAwRjgwMGgKLQotICAgICAgICBzaHIgZWJ4LDExCi0gICAgICAgIGFuZCBlZHgsMDAxRjAwMUZoCi0KLSAgICAgICAgc2hsIGVkeCwxMAotICAgICAgICBhZGQgZWF4LGVieAotCi0gICAgICAgIGFkZCBlYXgsZWR4ICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW5jIGVjeAotCi0gICAgICAgIGpueiAuTDUgICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgbW92IFtlZGkrZWN4KjQtNF0sZWF4Ci0KLSAgICA7IHRhaWwKLSAgICBwb3AgZWN4Ci0gICAgYW5kIGVjeCxCWVRFIDEKLSAgICBqeiAuTDcKLSAgICBtb3YgYWwsW2VzaV0KLSAgICBtb3YgYWgsW2VzaSsxXQotICAgIG1vdiBlYngsZWF4Ci0gICAgbW92IGVkeCxlYXgKLSAgICBzaHIgZWF4LDExCi0gICAgYW5kIGVheCxCWVRFIDExMTExYgotICAgIHNociBlYngsMQotICAgIGFuZCBlYngsMTExMTEwMDAwMGIKLSAgICBzaGwgZWR4LDEwCi0gICAgYW5kIGVkeCwwMTExMTEwMDAwMDAwMDAwYgotICAgIGFkZCBlYXgsZWJ4Ci0gICAgYWRkIGVheCxlZHgKLSAgICBtb3YgW2VkaV0sYWwKLSAgICBtb3YgW2VkaSsxXSxhaAotICAgIGFkZCBlc2ksQllURSAyCi0gICAgYWRkIGVkaSxCWVRFIDIKLQotLkw3Ci0gICAgcmV0bgotCi0KLQotCi0KLQotX0NvbnZlcnRYODZwMTZfOFJHQjMzMjoKLQotICAgIDsgY2hlY2sgc2hvcnQKLSAgICBjbXAgZWN4LEJZVEUgMTYKLSAgICBqYSAuTDMKLQotCi0uTDEgOyBzaG9ydCBsb29wCi0gICAgbW92IGFsLFtlc2krMF0KLSAgICBtb3YgYWgsW2VzaSsxXQotICAgIG1vdiBlYngsZWF4Ci0gICAgbW92IGVkeCxlYXgKLSAgICBhbmQgZWF4LEJZVEUgMTEwMDBiICAgICAgICAgOyBibHVlCi0gICAgc2hyIGVheCwzCi0gICAgYW5kIGVieCwxMTEwMDAwMDAwMGIgICAgICAgIDsgZ3JlZW4KLSAgICBzaHIgZWJ4LDYKLSAgICBhbmQgZWR4LDExMTAwMDAwMDAwMDAwMDBiICAgOyByZWQKLSAgICBzaHIgZWR4LDgKLSAgICBhZGQgZWF4LGVieAotICAgIGFkZCBlYXgsZWR4Ci0gICAgbW92IFtlZGldLGFsCi0gICAgYWRkIGVzaSxCWVRFIDIKLSAgICBpbmMgZWRpCi0gICAgZGVjIGVjeAotICAgIGpueiAuTDEKLS5MMgotICAgIHJldG4KLQotLkwzIG1vdiBlYXgsZWRpCi0gICAgYW5kIGVheCxCWVRFIDExYgotICAgIGp6IC5MNAotICAgIG1vdiBhbCxbZXNpKzBdCi0gICAgbW92IGFoLFtlc2krMV0KLSAgICBtb3YgZWJ4LGVheAotICAgIG1vdiBlZHgsZWF4Ci0gICAgYW5kIGVheCxCWVRFIDExMDAwYiAgICAgICAgIDsgYmx1ZQotICAgIHNociBlYXgsMwotICAgIGFuZCBlYngsMTExMDAwMDAwMDBiICAgICAgICA7IGdyZWVuCi0gICAgc2hyIGVieCw2Ci0gICAgYW5kIGVkeCwxMTEwMDAwMDAwMDAwMDAwYiAgIDsgcmVkCi0gICAgc2hyIGVkeCw4Ci0gICAgYWRkIGVheCxlYngKLSAgICBhZGQgZWF4LGVkeAotICAgIG1vdiBbZWRpXSxhbAotICAgIGFkZCBlc2ksQllURSAyCi0gICAgaW5jIGVkaQotICAgIGRlYyBlY3gKLSAgICBqbXAgU0hPUlQgLkwzCi0KLS5MNCA7IHNhdmUgZWJwCi0gICAgcHVzaCBlYnAKLQotICAgIDsgc2F2ZSBjb3VudAotICAgIHB1c2ggZWN4Ci0KLSAgICA7IHVucm9sbCA0IHRpbWVzCi0gICAgc2hyIGVjeCwyCi0KLSAgICA7IHByZXN0ZXAKLSAgICBtb3YgZGwsW2VzaSswXQotICAgIG1vdiBibCxbZXNpKzFdCi0gICAgbW92IGRoLFtlc2krMl0KLSAgICAgICAgCi0uTDUgICAgIHNobCBlZHgsMTYKLSAgICAgICAgbW92IGJoLFtlc2krM10KLSAgICAgICAgCi0gICAgICAgIHNobCBlYngsMTYKLSAgICAgICAgbW92IGRsLFtlc2krNF0KLQotICAgICAgICBtb3YgZGgsW2VzaSs2XQotICAgICAgICBtb3YgYmwsW2VzaSs1XQotCi0gICAgICAgIGFuZCBlZHgsMDAwMTEwMDAwMDAxMTAwMDAwMDExMDAwMDAwMTEwMDBiCi0gICAgICAgIG1vdiBiaCxbZXNpKzddCi0KLSAgICAgICAgcm9yIGVkeCwxNiszCi0gICAgICAgIG1vdiBlYXgsZWJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2V0dXAgZWF4IGZvciByZWRzCi0KLSAgICAgICAgYW5kIGVieCwwMDAwMDExMTAwMDAwMTExMDAwMDAxMTEwMDAwMDExMWIKLSAgICAgICAgYW5kIGVheCwxMTEwMDAwMDExMTAwMDAwMTExMDAwMDAxMTEwMDAwMGIgICAgICAgOyByZWRzCi0KLSAgICAgICAgcm9yIGVieCwxNi0yCi0gICAgICAgIGFkZCBlc2ksQllURSA4Ci0KLSAgICAgICAgcm9yIGVheCwxNgotICAgICAgICBhZGQgZWRpLEJZVEUgNAotCi0gICAgICAgIGFkZCBlYXgsZWJ4Ci0gICAgICAgIG1vdiBibCxbZXNpKzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZ3JlZW5zCi0KLSAgICAgICAgYWRkIGVheCxlZHgKLSAgICAgICAgbW92IGRsLFtlc2krMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBibHVlcwotCi0gICAgICAgIG1vdiBbZWRpLTRdLGVheAotICAgICAgICBtb3YgZGgsW2VzaSsyXQotCi0gICAgICAgIGRlYyBlY3gKLSAgICAgICAgam56IC5MNSAgICAgICAgICAgICAgICAgCi0gICAgCi0gICAgOyBjaGVjayB0YWlsCi0gICAgcG9wIGVjeAotICAgIGFuZCBlY3gsQllURSAxMWIKLSAgICBqeiAuTDcKLQotLkw2IDsgdGFpbAotICAgIG1vdiBhbCxbZXNpKzBdCi0gICAgbW92IGFoLFtlc2krMV0KLSAgICBtb3YgZWJ4LGVheAotICAgIG1vdiBlZHgsZWF4Ci0gICAgYW5kIGVheCxCWVRFIDExMDAwYiAgICAgICAgIDsgYmx1ZQotICAgIHNociBlYXgsMwotICAgIGFuZCBlYngsMTExMDAwMDAwMDBiICAgICAgICA7IGdyZWVuCi0gICAgc2hyIGVieCw2Ci0gICAgYW5kIGVkeCwxMTEwMDAwMDAwMDAwMDAwYiAgIDsgcmVkCi0gICAgc2hyIGVkeCw4Ci0gICAgYWRkIGVheCxlYngKLSAgICBhZGQgZWF4LGVkeAotICAgIG1vdiBbZWRpXSxhbAotICAgIGFkZCBlc2ksQllURSAyCi0gICAgaW5jIGVkaQotICAgIGRlYyBlY3gKLSAgICBqbnogLkw2Ci0KLS5MNyBwb3AgZWJwCi0gICAgcmV0bgotCi0laWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmCi1zZWN0aW9uIC5ub3RlLkdOVS1zdGFjayBub2FsbG9jIG5vZXhlYyBub3dyaXRlIHByb2diaXRzCi0lZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvaGVybWVzL3g4NnBfMzIuYXNtIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMveDg2cF8zMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NDZjMWMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMveDg2cF8zMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ1ICswLDAgQEAKLTsKLTsgeDg2IGZvcm1hdCBjb252ZXJ0ZXJzIGZvciBIRVJNRVMKLTsgU29tZSByb3V0aW5lcyBDb3B5cmlnaHQgKGMpIDE5OTggQ2hyaXN0aWFuIE5lbnR3aWNoIChicm5AZWxlZXQubWNiLmF0KQotOyBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAotOyAKLTsgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgotOyBsaWNlbnNpbmcgY29uZGl0aW9ucwkJCi07Ci07IE1vc3Qgcm91dGluZXMgYXJlIChjKSBHbGVubiBGaWVkbGVyIChwdGNAZ2FmZmVyLm9yZyksIHVzZWQgd2l0aCBwZXJtaXNzaW9uCi07IAotCi1CSVRTIDMyCi0KLSVpbmNsdWRlICJjb21tb24uaW5jIgotCi1TRExfRlVOQyBfQ29udmVydFg4NnAzMl8zMkJHUjg4OAotU0RMX0ZVTkMgX0NvbnZlcnRYODZwMzJfMzJSR0JBODg4Ci1TRExfRlVOQyBfQ29udmVydFg4NnAzMl8zMkJHUkE4ODgKLVNETF9GVU5DIF9Db252ZXJ0WDg2cDMyXzI0UkdCODg4CQotU0RMX0ZVTkMgX0NvbnZlcnRYODZwMzJfMjRCR1I4ODgKLVNETF9GVU5DIF9Db252ZXJ0WDg2cDMyXzE2UkdCNTY1Ci1TRExfRlVOQyBfQ29udmVydFg4NnAzMl8xNkJHUjU2NQotU0RMX0ZVTkMgX0NvbnZlcnRYODZwMzJfMTZSR0I1NTUKLVNETF9GVU5DIF9Db252ZXJ0WDg2cDMyXzE2QkdSNTU1Ci1TRExfRlVOQyBfQ29udmVydFg4NnAzMl84UkdCMzMyCi0KLVNFQ1RJT04gLnRleHQKLQotOzsgX0NvbnZlcnRfKgotOzsgUGFyYW10ZXJzOgkKLTs7ICAgRVNJID0gc291cmNlIAotOzsgICBFREkgPSBkZXN0Ci07OyAgIEVDWCA9IGFtb3VudCAoTk9UIDAhISEgKHRoZSBfQ29udmVydFg4NiByb3V0aW5lIGNoZWNrcyBmb3IgdGhhdCB0aG91Z2gpKQotOzsgRGVzdHJveXM6Ci07OyAgIEVBWCwgRUJYLCBFRFgKLQotCi1fQ29udmVydFg4NnAzMl8zMkJHUjg4ODoKLQotICAgIDsgY2hlY2sgc2hvcnQKLSAgICBjbXAgZWN4LEJZVEUgMzIKLSAgICBqYSAuTDMKLQotLkwxIDsgc2hvcnQgbG9vcAotICAgIG1vdiBlZHgsW2VzaV0KLSAgICBic3dhcCBlZHgKLSAgICByb3IgZWR4LDgKLSAgICBtb3YgW2VkaV0sZWR4Ci0gICAgYWRkIGVzaSxCWVRFIDQKLSAgICBhZGQgZWRpLEJZVEUgNAotICAgIGRlYyBlY3gKLSAgICBqbnogLkwxCi0uTDIKLSAgICByZXRuCi0KLS5MMyA7IHNhdmUgZWJwCi0gICAgcHVzaCBlYnAKLQotICAgIDsgdW5yb2xsIGZvdXIgdGltZXMKLSAgICBtb3YgZWJwLGVjeAotICAgIHNociBlYnAsMgotICAgIAotICAgIDsgc2F2ZSBjb3VudAotICAgIHB1c2ggZWN4Ci0KLS5MNCAgICAgbW92IGVheCxbZXNpXQotICAgICAgICBtb3YgZWJ4LFtlc2krNF0KLQotICAgICAgICBic3dhcCBlYXgKLQotICAgICAgICBic3dhcCBlYngKLQotICAgICAgICByb3IgZWF4LDgKLSAgICAgICAgbW92IGVjeCxbZXNpKzhdCi0KLSAgICAgICAgcm9yIGVieCw4Ci0gICAgICAgIG1vdiBlZHgsW2VzaSsxMl0KLQotICAgICAgICBic3dhcCBlY3gKLQotICAgICAgICBic3dhcCBlZHgKLQotICAgICAgICByb3IgZWN4LDgKLSAgICAgICAgbW92IFtlZGkrMF0sZWF4Ci0KLSAgICAgICAgcm9yIGVkeCw4Ci0gICAgICAgIG1vdiBbZWRpKzRdLGVieAotCi0gICAgICAgIG1vdiBbZWRpKzhdLGVjeAotICAgICAgICBtb3YgW2VkaSsxMl0sZWR4Ci0KLSAgICAgICAgYWRkIGVzaSxCWVRFIDE2Ci0gICAgICAgIGFkZCBlZGksQllURSAxNgotCi0gICAgICAgIGRlYyBlYnAKLSAgICAgICAgam56IC5MNCAgICAgICAgICAgICAgICAgCi0KLSAgICA7IGNoZWNrIHRhaWwKLSAgICBwb3AgZWN4Ci0gICAgYW5kIGVjeCxCWVRFIDExYgotICAgIGp6IC5MNgotCi0uTDUgOyB0YWlsIGxvb3AKLSAgICBtb3YgZWR4LFtlc2ldCi0gICAgYnN3YXAgZWR4Ci0gICAgcm9yIGVkeCw4Ci0gICAgbW92IFtlZGldLGVkeAotICAgIGFkZCBlc2ksQllURSA0Ci0gICAgYWRkIGVkaSxCWVRFIDQKLSAgICBkZWMgZWN4Ci0gICAgam56IC5MNQotCi0uTDYgcG9wIGVicAotICAgIHJldG4KLQkKLQotCQotCQkKLV9Db252ZXJ0WDg2cDMyXzMyUkdCQTg4ODoKLQkKLSAgICA7IGNoZWNrIHNob3J0Ci0gICAgY21wIGVjeCxCWVRFIDMyCi0gICAgamEgLkwzCi0KLS5MMSA7IHNob3J0IGxvb3AKLSAgICBtb3YgZWR4LFtlc2ldCi0gICAgcm9sIGVkeCw4Ci0gICAgbW92IFtlZGldLGVkeAotICAgIGFkZCBlc2ksQllURSA0Ci0gICAgYWRkIGVkaSxCWVRFIDQKLSAgICBkZWMgZWN4Ci0gICAgam56IC5MMQotLkwyCi0gICAgcmV0bgotCi0uTDMgOyBzYXZlIGVicAotICAgIHB1c2ggZWJwCi0KLSAgICA7IHVucm9sbCBmb3VyIHRpbWVzCi0gICAgbW92IGVicCxlY3gKLSAgICBzaHIgZWJwLDIKLSAgICAKLSAgICA7IHNhdmUgY291bnQKLSAgICBwdXNoIGVjeAotCi0uTDQgICAgIG1vdiBlYXgsW2VzaV0KLSAgICAgICAgbW92IGVieCxbZXNpKzRdCi0KLSAgICAgICAgcm9sIGVheCw4Ci0gICAgICAgIG1vdiBlY3gsW2VzaSs4XQotCi0gICAgICAgIHJvbCBlYngsOAotICAgICAgICBtb3YgZWR4LFtlc2krMTJdCi0KLSAgICAgICAgcm9sIGVjeCw4Ci0gICAgICAgIG1vdiBbZWRpKzBdLGVheAotCi0gICAgICAgIHJvbCBlZHgsOAotICAgICAgICBtb3YgW2VkaSs0XSxlYngKLQotICAgICAgICBtb3YgW2VkaSs4XSxlY3gKLSAgICAgICAgbW92IFtlZGkrMTJdLGVkeAotCi0gICAgICAgIGFkZCBlc2ksQllURSAxNgotICAgICAgICBhZGQgZWRpLEJZVEUgMTYKLQotICAgICAgICBkZWMgZWJwCi0gICAgICAgIGpueiAuTDQgICAgICAgICAgICAgICAgIAotCi0gICAgOyBjaGVjayB0YWlsCi0gICAgcG9wIGVjeAotICAgIGFuZCBlY3gsQllURSAxMWIKLSAgICBqeiAuTDYKLQotLkw1IDsgdGFpbCBsb29wCi0gICAgbW92IGVkeCxbZXNpXQotICAgIHJvbCBlZHgsOAotICAgIG1vdiBbZWRpXSxlZHgKLSAgICBhZGQgZXNpLEJZVEUgNAotICAgIGFkZCBlZGksQllURSA0Ci0gICAgZGVjIGVjeAotICAgIGpueiAuTDUKLQotLkw2IHBvcCBlYnAKLSAgICByZXRuCi0KLQkKLQotCi1fQ29udmVydFg4NnAzMl8zMkJHUkE4ODg6Ci0KLSAgICA7IGNoZWNrIHNob3J0Ci0gICAgY21wIGVjeCxCWVRFIDMyCi0gICAgamEgLkwzCi0KLS5MMSA7IHNob3J0IGxvb3AKLSAgICBtb3YgZWR4LFtlc2ldCi0gICAgYnN3YXAgZWR4Ci0gICAgbW92IFtlZGldLGVkeAotICAgIGFkZCBlc2ksQllURSA0Ci0gICAgYWRkIGVkaSxCWVRFIDQKLSAgICBkZWMgZWN4Ci0gICAgam56IC5MMQotLkwyCi0gICAgcmV0bgotCi0uTDMgOyBzYXZlIGVicAotICAgIHB1c2ggZWJwCi0KLSAgICA7IHVucm9sbCBmb3VyIHRpbWVzCi0gICAgbW92IGVicCxlY3gKLSAgICBzaHIgZWJwLDIKLSAgICAKLSAgICA7IHNhdmUgY291bnQKLSAgICBwdXNoIGVjeAotCi0uTDQgICAgIG1vdiBlYXgsW2VzaV0KLSAgICAgICAgbW92IGVieCxbZXNpKzRdCi0KLSAgICAgICAgbW92IGVjeCxbZXNpKzhdCi0gICAgICAgIG1vdiBlZHgsW2VzaSsxMl0KLQotICAgICAgICBic3dhcCBlYXgKLQotICAgICAgICBic3dhcCBlYngKLQotICAgICAgICBic3dhcCBlY3gKLQotICAgICAgICBic3dhcCBlZHgKLQotICAgICAgICBtb3YgW2VkaSswXSxlYXgKLSAgICAgICAgbW92IFtlZGkrNF0sZWJ4Ci0KLSAgICAgICAgbW92IFtlZGkrOF0sZWN4Ci0gICAgICAgIG1vdiBbZWRpKzEyXSxlZHgKLQotICAgICAgICBhZGQgZXNpLEJZVEUgMTYKLSAgICAgICAgYWRkIGVkaSxCWVRFIDE2Ci0KLSAgICAgICAgZGVjIGVicAotICAgICAgICBqbnogLkw0ICAgICAgICAgICAgICAgICAKLQotICAgIDsgY2hlY2sgdGFpbAotICAgIHBvcCBlY3gKLSAgICBhbmQgZWN4LEJZVEUgMTFiCi0gICAganogLkw2Ci0KLS5MNSA7IHRhaWwgbG9vcAotICAgIG1vdiBlZHgsW2VzaV0KLSAgICBic3dhcCBlZHgKLSAgICBtb3YgW2VkaV0sZWR4Ci0gICAgYWRkIGVzaSxCWVRFIDQKLSAgICBhZGQgZWRpLEJZVEUgNAotICAgIGRlYyBlY3gKLSAgICBqbnogLkw1Ci0KLS5MNiBwb3AgZWJwCi0gICAgcmV0bgotCi0KLQkKLQkKLTs7IDMyIGJpdCBSR0IgODg4IHRvIDI0IEJJVCBSR0IgODg4Ci0KLV9Db252ZXJ0WDg2cDMyXzI0UkdCODg4OgotCi0JOyBjaGVjayBzaG9ydAotCWNtcCBlY3gsQllURSAzMgotCWphIC5MMwotCi0uTDEJOyBzaG9ydCBsb29wCi0JbW92IGFsLFtlc2ldCi0JbW92IGJsLFtlc2krMV0KLQltb3YgZGwsW2VzaSsyXQotCW1vdiBbZWRpXSxhbAotCW1vdiBbZWRpKzFdLGJsCi0JbW92IFtlZGkrMl0sZGwKLQlhZGQgZXNpLEJZVEUgNAotCWFkZCBlZGksQllURSAzCi0JZGVjIGVjeAotCWpueiAuTDEKLS5MMiAKLQlyZXRuCi0KLS5MMwk7CSBoZWFkCi0JbW92IGVkeCxlZGkKLQlhbmQgZWR4LEJZVEUgMTFiCi0JanogLkw0Ci0JbW92IGFsLFtlc2ldCi0JbW92IGJsLFtlc2krMV0KLQltb3YgZGwsW2VzaSsyXQotCW1vdiBbZWRpXSxhbAotCW1vdiBbZWRpKzFdLGJsCi0JbW92IFtlZGkrMl0sZGwKLQlhZGQgZXNpLEJZVEUgNAotCWFkZCBlZGksQllURSAzCi0JZGVjIGVjeAotCWptcCBTSE9SVCAuTDMKLQotLkw0IDsgdW5yb2xsIDQgdGltZXMKLQlwdXNoIGVicAotCW1vdiBlYnAsZWN4Ci0Jc2hyIGVicCwyCi0KLSAgICA7IHNhdmUgY291bnQKLQlwdXNoIGVjeAotCi0uTDUgICAgIG1vdiBlYXgsW2VzaV0gICAgICAgICAgICAgICAgICAgOyBmaXJzdCBkd29yZCAgICAgICAgICAgIGVheCA9IFtBXVtSXVtHXVtCXQotICAgICAgICBtb3YgZWJ4LFtlc2krNF0gICAgICAgICAgICAgICAgIDsgc2Vjb25kIGR3b3JkICAgICAgICAgICBlYnggPSBbYV1bcl1bZ11bYl0KLQotICAgICAgICBzaGwgZWF4LDggICAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICBlYXggPSBbUl1bR11bQl1bLl0KLSAgICAgICAgbW92IGVjeCxbZXNpKzEyXSAgICAgICAgICAgICAgICA7IHRoaXJkIGR3b3JkICAgICAgICAgICAgZWN4ID0gW2FdW3JdW2ddW2JdCi0KLSAgICAgICAgc2hsIGVieCw4ICAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWJ4ID0gW3JdW2ddW2JdWy5dCi0gICAgICAgIG1vdiBhbCxbZXNpKzRdICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVheCA9IFtSXVtHXVtCXVtiXQotCi0gICAgICAgIHJvciBlYXgsOCAgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVheCA9IFtiXVtSXVtHXVtCXSAoZG9uZSkKLSAgICAgICAgbW92IGJoLFtlc2krOCsxXSAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWJ4ID0gW3JdW2ddW0ddWy5dCi0KLSAgICAgICAgbW92IFtlZGldLGVheAotICAgICAgICBhZGQgZWRpLEJZVEUgMyo0Ci0KLSAgICAgICAgc2hsIGVjeCw4ICAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWN4ID0gW3JdW2ddW2JdWy5dCi0gICAgICAgIG1vdiBibCxbZXNpKzgrMF0gICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVieCA9IFtyXVtnXVtHXVtCXQotCi0gICAgICAgIHJvbCBlYngsMTYgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVieCA9IFtHXVtCXVtyXVtnXSAoZG9uZSkKLSAgICAgICAgbW92IGNsLFtlc2krOCsyXSAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWN4ID0gW3JdW2ddW2JdW1JdIChkb25lKQotCi0gICAgICAgIG1vdiBbZWRpKzQtMyo0XSxlYngKLSAgICAgICAgYWRkIGVzaSxCWVRFIDQqNAotICAgICAgICAKLSAgICAgICAgbW92IFtlZGkrOC0zKjRdLGVjeAotICAgICAgICBkZWMgZWJwCi0KLSAgICAgICAgam56IC5MNQotCi0gICAgOyBjaGVjayB0YWlsCi0JcG9wIGVjeAotCWFuZCBlY3gsQllURSAxMWIKLQlqeiAuTDcKLQotLkw2IDsgdGFpbCBsb29wCi0JbW92IGFsLFtlc2ldCi0JbW92IGJsLFtlc2krMV0KLQltb3YgZGwsW2VzaSsyXQotCW1vdiBbZWRpXSxhbAotCW1vdiBbZWRpKzFdLGJsCi0JbW92IFtlZGkrMl0sZGwKLQlhZGQgZXNpLEJZVEUgNAotCWFkZCBlZGksQllURSAzCi0JZGVjIGVjeAotCWpueiAuTDYKLQotLkw3CXBvcCBlYnAKLQlyZXRuCi0KLQotCi0KLTs7IDMyIGJpdCBSR0IgODg4IHRvIDI0IGJpdCBCR1IgODg4Ci0KLV9Db252ZXJ0WDg2cDMyXzI0QkdSODg4OgotCi0JOyBjaGVjayBzaG9ydAotCWNtcCBlY3gsQllURSAzMgotCWphIC5MMwotCi0JCi0uTDEJOyBzaG9ydCBsb29wCi0JbW92IGRsLFtlc2ldCi0JbW92IGJsLFtlc2krMV0KLQltb3YgYWwsW2VzaSsyXQotCW1vdiBbZWRpXSxhbAotCW1vdiBbZWRpKzFdLGJsCi0JbW92IFtlZGkrMl0sZGwKLQlhZGQgZXNpLEJZVEUgNAotCWFkZCBlZGksQllURSAzCi0JZGVjIGVjeAotCWpueiAuTDEKLS5MMgotCXJldG4KLQotLkwzIDsgaGVhZAotCW1vdiBlZHgsZWRpCi0JYW5kIGVkeCxCWVRFIDExYgotCWp6IC5MNAotCW1vdiBkbCxbZXNpXQotCW1vdiBibCxbZXNpKzFdCi0JbW92IGFsLFtlc2krMl0KLQltb3YgW2VkaV0sYWwKLQltb3YgW2VkaSsxXSxibAotCW1vdiBbZWRpKzJdLGRsCi0JYWRkIGVzaSxCWVRFIDQKLQlhZGQgZWRpLEJZVEUgMwotCWRlYyBlY3gKLQlqbXAgU0hPUlQgLkwzCi0KLS5MNAk7IHVucm9sbCA0IHRpbWVzCi0JcHVzaCBlYnAKLQltb3YgZWJwLGVjeAotCXNociBlYnAsMgotCi0JOyBzYXZlIGNvdW50Ci0JcHVzaCBlY3gKLQotLkw1ICAgICAKLQltb3YgZWF4LFtlc2ldICAgICAgICAgICAgICAgICAgIDsgZmlyc3QgZHdvcmQgICAgICAgICAgICBlYXggPSBbQV1bUl1bR11bQl0KLSAgICAgICAgbW92IGVieCxbZXNpKzRdICAgICAgICAgICAgICAgICA7IHNlY29uZCBkd29yZCAgICAgICAgICAgZWJ4ID0gW2FdW3JdW2ddW2JdCi0gICAgICAgIAotICAgICAgICBic3dhcCBlYXggICAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICBlYXggPSBbQl1bR11bUl1bQV0KLQotICAgICAgICBic3dhcCBlYnggICAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICBlYnggPSBbYl1bZ11bcl1bYV0KLQotICAgICAgICBtb3YgYWwsW2VzaSs0KzJdICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICBlYXggPSBbQl1bR11bUl1bcl0gCi0gICAgICAgIG1vdiBiaCxbZXNpKzQrNCsxXSAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVieCA9IFtiXVtnXVtHXVthXQotCi0gICAgICAgIHJvciBlYXgsOCAgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVheCA9IFtyXVtCXVtHXVtSXSAoZG9uZSkKLSAgICAgICAgbW92IGJsLFtlc2krNCs0KzJdICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWJ4ID0gW2JdW2ddW0ddW1JdCi0KLSAgICAgICAgcm9yIGVieCwxNiAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWJ4ID0gW0ddW1JdW2JdW2ddIChkb25lKQotICAgICAgICBtb3YgW2VkaV0sZWF4Ci0gICAgCi0gICAgICAgIG1vdiBbZWRpKzRdLGVieAotICAgICAgICBtb3YgZWN4LFtlc2krMTJdICAgICAgICAgICAgICAgIDsgdGhpcmQgZHdvcmQgICAgICAgICAgICBlY3ggPSBbYV1bcl1bZ11bYl0KLSAgICAgICAgCi0gICAgICAgIGJzd2FwIGVjeCAgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVjeCA9IFtiXVtnXVtyXVthXQotICAgICAgICAKLSAgICAgICAgbW92IGNsLFtlc2krOF0gICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWN4ID0gW2JdW2ddW3JdW0JdIChkb25lKQotICAgICAgICBhZGQgZXNpLEJZVEUgNCo0Ci0KLSAgICAgICAgbW92IFtlZGkrOF0sZWN4Ci0gICAgICAgIGFkZCBlZGksQllURSAzKjQKLQotICAgICAgICBkZWMgZWJwCi0gICAgICAgIGpueiAuTDUKLQotCTsgY2hlY2sgdGFpbAotCXBvcCBlY3gKLQlhbmQgZWN4LEJZVEUgMTFiCi0JanogLkw3Ci0KLS5MNgk7IHRhaWwgbG9vcAotCW1vdiBkbCxbZXNpXQotCW1vdiBibCxbZXNpKzFdCi0JbW92IGFsLFtlc2krMl0KLQltb3YgW2VkaV0sYWwKLQltb3YgW2VkaSsxXSxibAotCW1vdiBbZWRpKzJdLGRsCi0JYWRkIGVzaSxCWVRFIDQKLQlhZGQgZWRpLEJZVEUgMwotCWRlYyBlY3gKLQlqbnogLkw2Ci0KLS5MNyAKLQlwb3AgZWJwCi0JcmV0bgotIAotCi0JCi0JCQotOzsgMzIgYml0IFJHQiA4ODggdG8gMTYgQklUIFJHQiA1NjUgCi0KLV9Db252ZXJ0WDg2cDMyXzE2UkdCNTY1OgotCTsgY2hlY2sgc2hvcnQKLQljbXAgZWN4LEJZVEUgMTYKLQlqYSAuTDMKLQotLkwxIDsgc2hvcnQgbG9vcAotCW1vdiBibCxbZXNpKzBdICAgIDsgYmx1ZQotCW1vdiBhbCxbZXNpKzFdICAgIDsgZ3JlZW4KLQltb3YgYWgsW2VzaSsyXSAgICA7IHJlZAotCXNociBhaCwzCi0gICAgICAgIGFuZCBhbCwxMTExMTEwMGIKLQlzaGwgZWF4LDMKLQlzaHIgYmwsMwotCWFkZCBhbCxibAotCW1vdiBbZWRpKzBdLGFsCi0JbW92IFtlZGkrMV0sYWgKLQlhZGQgZXNpLEJZVEUgNAotCWFkZCBlZGksQllURSAyCi0JZGVjIGVjeAotCWpueiAuTDEKLQotLkwyOgkJCQk7IEVuZCBvZiBzaG9ydCBsb29wCi0JcmV0bgotCi0JCi0uTDMJOyBoZWFkCi0JbW92IGVieCxlZGkKLQlhbmQgZWJ4LEJZVEUgMTFiCi0JanogLkw0Ci0JCi0JbW92IGJsLFtlc2krMF0gICAgOyBibHVlCi0JbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgotCW1vdiBhaCxbZXNpKzJdICAgIDsgcmVkCi0Jc2hyIGFoLDMKLQlhbmQgYWwsMTExMTExMDBiCi0Jc2hsIGVheCwzCi0Jc2hyIGJsLDMKLQlhZGQgYWwsYmwKLQltb3YgW2VkaSswXSxhbAotCW1vdiBbZWRpKzFdLGFoCi0JYWRkIGVzaSxCWVRFIDQKLQlhZGQgZWRpLEJZVEUgMgotCWRlYyBlY3gKLQotLkw0OgkgCi0gICAgOyBzYXZlIGNvdW50Ci0JcHVzaCBlY3gKLQotICAgIDsgdW5yb2xsIHR3aWNlCi0Jc2hyIGVjeCwxCi0gICAgCi0gICAgOyBwb2ludCBhcnJheXMgdG8gZW5kCi0JbGVhIGVzaSxbZXNpK2VjeCo4XQotCWxlYSBlZGksW2VkaStlY3gqNF0KLQotICAgIDsgbmVnYXRpdmUgY291bnRlciAKLQluZWcgZWN4Ci0Jam1wIFNIT1JUIC5MNgotCi0uTDU6CSAgICAKLQltb3YgW2VkaStlY3gqNC00XSxlYXgKLS5MNjoJCi0JbW92IGVheCxbZXNpK2VjeCo4XQotCi0gICAgICAgIHNociBhaCwyCi0gICAgICAgIG1vdiBlYngsW2VzaStlY3gqOCs0XQotCi0gICAgICAgIHNociBlYXgsMwotICAgICAgICBtb3YgZWR4LFtlc2krZWN4KjgrNF0KLQotICAgICAgICBzaHIgYmgsMgotICAgICAgICBtb3YgZGwsW2VzaStlY3gqOCsyXQotCi0gICAgICAgIHNobCBlYngsMTMKLSAgICAgICAgYW5kIGVheCwwMDAwMDdGRmgKLSAgICAgICAgCi0gICAgICAgIHNobCBlZHgsOAotICAgICAgICBhbmQgZWJ4LDA3RkYwMDAwaAotCi0gICAgICAgIGFuZCBlZHgsMEY4MDBGODAwaAotICAgICAgICBhZGQgZWF4LGVieAotCi0gICAgICAgIGFkZCBlYXgsZWR4Ci0gICAgICAgIGluYyBlY3gKLQotICAgICAgICBqbnogLkw1ICAgICAgICAgICAgICAgICAKLQotCW1vdiBbZWRpK2VjeCo0LTRdLGVheAotCi0gICAgOyB0YWlsCi0JcG9wIGVjeAotCXRlc3QgY2wsMQotCWp6IC5MNwotCQotCW1vdiBibCxbZXNpKzBdICAgIDsgYmx1ZQotCW1vdiBhbCxbZXNpKzFdICAgIDsgZ3JlZW4KLQltb3YgYWgsW2VzaSsyXSAgICA7IHJlZAotCXNociBhaCwzCi0JYW5kIGFsLDExMTExMTAwYgotCXNobCBlYXgsMwotCXNociBibCwzCi0JYWRkIGFsLGJsCi0JbW92IFtlZGkrMF0sYWwKLQltb3YgW2VkaSsxXSxhaAotCWFkZCBlc2ksQllURSA0Ci0JYWRkIGVkaSxCWVRFIDIKLQotLkw3OgkKLQlyZXRuCi0KLQotCi0JCi07OyAzMiBiaXQgUkdCIDg4OCB0byAxNiBCSVQgQkdSIDU2NSAKLQotX0NvbnZlcnRYODZwMzJfMTZCR1I1NjU6Ci0JCi0JOyBjaGVjayBzaG9ydAotCWNtcCBlY3gsQllURSAxNgotCWphIC5MMwotCi0uTDEJOyBzaG9ydCBsb29wCi0JbW92IGFoLFtlc2krMF0gICAgOyBibHVlCi0JbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgotCW1vdiBibCxbZXNpKzJdICAgIDsgcmVkCi0Jc2hyIGFoLDMKLQlhbmQgYWwsMTExMTExMDBiCi0Jc2hsIGVheCwzCi0Jc2hyIGJsLDMKLQlhZGQgYWwsYmwKLQltb3YgW2VkaSswXSxhbAotCW1vdiBbZWRpKzFdLGFoCi0JYWRkIGVzaSxCWVRFIDQKLQlhZGQgZWRpLEJZVEUgMgotCWRlYyBlY3gKLQlqbnogLkwxCi0uTDIKLQlyZXRuCi0KLS5MMwk7IGhlYWQKLQltb3YgZWJ4LGVkaQotCWFuZCBlYngsQllURSAxMWIKLQlqeiAuTDQgICAKLQltb3YgYWgsW2VzaSswXSAgICA7IGJsdWUKLQltb3YgYWwsW2VzaSsxXSAgICA7IGdyZWVuCi0JbW92IGJsLFtlc2krMl0gICAgOyByZWQKLQlzaHIgYWgsMwotCWFuZCBhbCwxMTExMTEwMGIKLQlzaGwgZWF4LDMKLQlzaHIgYmwsMwotCWFkZCBhbCxibAotCW1vdiBbZWRpKzBdLGFsCi0JbW92IFtlZGkrMV0sYWgKLQlhZGQgZXNpLEJZVEUgNAotCWFkZCBlZGksQllURSAyCi0JZGVjIGVjeAotCi0uTDQJOyBzYXZlIGNvdW50Ci0JcHVzaCBlY3gKLQotCTsgdW5yb2xsIHR3aWNlCi0Jc2hyIGVjeCwxCi0gICAgCi0JOyBwb2ludCBhcnJheXMgdG8gZW5kCi0JbGVhIGVzaSxbZXNpK2VjeCo4XQotCWxlYSBlZGksW2VkaStlY3gqNF0KLQotCTsgbmVnYXRpdmUgY291bnQKLQluZWcgZWN4Ci0Jam1wIFNIT1JUIC5MNgotCi0uTDUgICAgIAotCW1vdiBbZWRpK2VjeCo0LTRdLGVheCAgICAgICAgICAgIAotLkw2ICAgICAKLQltb3YgZWR4LFtlc2krZWN4KjgrNF0KLQotICAgICAgICBtb3YgYmgsW2VzaStlY3gqOCs0XSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG1vdiBhaCxbZXNpK2VjeCo4XSAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgc2hyIGJoLDMKLSAgICAgICAgbW92IGFsLFtlc2krZWN4KjgrMV0gICAgICAgICAgICAgCi0KLSAgICAgICAgc2hyIGFoLDMKLSAgICAgICAgbW92IGJsLFtlc2krZWN4KjgrNV0gICAgICAgICAgIAotCi0gICAgICAgIHNobCBlYXgsMwotICAgICAgICBtb3YgZGwsW2VzaStlY3gqOCsyXQotCi0gICAgICAgIHNobCBlYngsMTkKLSAgICAgICAgYW5kIGVheCwwMDAwRkZFMGggICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBzaHIgZWR4LDMKLSAgICAgICAgYW5kIGVieCwwRkZFMDAwMDBoICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgYW5kIGVkeCwwMDFGMDAxRmggICAgICAgICAgICAgICAKLSAgICAgICAgYWRkIGVheCxlYngKLQotICAgICAgICBhZGQgZWF4LGVkeAotICAgICAgICBpbmMgZWN4Ci0KLSAgICAgICAgam56IC5MNSAgICAgICAgICAgICAgICAgCi0KLQltb3YgW2VkaStlY3gqNC00XSxlYXggICAgICAgICAgICAKLQotCTsgdGFpbAotCXBvcCBlY3gKLQlhbmQgZWN4LEJZVEUgMQotCWp6IC5MNwotCW1vdiBhaCxbZXNpKzBdICAgIDsgYmx1ZQotCW1vdiBhbCxbZXNpKzFdICAgIDsgZ3JlZW4KLQltb3YgYmwsW2VzaSsyXSAgICA7IHJlZAotCXNociBhaCwzCi0JYW5kIGFsLDExMTExMTAwYgotCXNobCBlYXgsMwotCXNociBibCwzCi0JYWRkIGFsLGJsCi0JbW92IFtlZGkrMF0sYWwKLQltb3YgW2VkaSsxXSxhaAotCWFkZCBlc2ksQllURSA0Ci0JYWRkIGVkaSxCWVRFIDIKLQotLkw3IAotCXJldG4KLQotCi0JCi0JCi07OyAzMiBCSVQgUkdCIFRPIDE2IEJJVCBSR0IgNTU1Ci0KLV9Db252ZXJ0WDg2cDMyXzE2UkdCNTU1OgotCi0JOyBjaGVjayBzaG9ydAotCWNtcCBlY3gsQllURSAxNgotCWphIC5MMwotCi0uTDEJOyBzaG9ydCBsb29wCi0JbW92IGJsLFtlc2krMF0gICAgOyBibHVlCi0JbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgotCW1vdiBhaCxbZXNpKzJdICAgIDsgcmVkCi0Jc2hyIGFoLDMKLQlhbmQgYWwsMTExMTEwMDBiCi0Jc2hsIGVheCwyCi0Jc2hyIGJsLDMKLQlhZGQgYWwsYmwKLQltb3YgW2VkaSswXSxhbAotCW1vdiBbZWRpKzFdLGFoCi0JYWRkIGVzaSxCWVRFIDQKLQlhZGQgZWRpLEJZVEUgMgotCWRlYyBlY3gKLQlqbnogLkwxCi0uTDIKLQlyZXRuCi0KLS5MMwk7IGhlYWQKLQltb3YgZWJ4LGVkaQotICAgICAgICBhbmQgZWJ4LEJZVEUgMTFiCi0JanogLkw0ICAgCi0JbW92IGJsLFtlc2krMF0gICAgOyBibHVlCi0JbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgotCW1vdiBhaCxbZXNpKzJdICAgIDsgcmVkCi0Jc2hyIGFoLDMKLQlhbmQgYWwsMTExMTEwMDBiCi0Jc2hsIGVheCwyCi0Jc2hyIGJsLDMKLQlhZGQgYWwsYmwKLQltb3YgW2VkaSswXSxhbAotCW1vdiBbZWRpKzFdLGFoCi0JYWRkIGVzaSxCWVRFIDQKLQlhZGQgZWRpLEJZVEUgMgotCWRlYyBlY3gKLQotLkw0CTsgc2F2ZSBjb3VudAotCXB1c2ggZWN4Ci0KLQk7IHVucm9sbCB0d2ljZQotCXNociBlY3gsMQotICAgIAotCTsgcG9pbnQgYXJyYXlzIHRvIGVuZAotCWxlYSBlc2ksW2VzaStlY3gqOF0KLQlsZWEgZWRpLFtlZGkrZWN4KjRdCi0KLQk7IG5lZ2F0aXZlIGNvdW50ZXIgCi0JbmVnIGVjeAotCWptcCBTSE9SVCAuTDYKLQotLkw1ICAgICAKLQltb3YgW2VkaStlY3gqNC00XSxlYXgKLS5MNiAgICAgCi0JbW92IGVheCxbZXNpK2VjeCo4XQotCi0gICAgICAgIHNociBhaCwzCi0gICAgICAgIG1vdiBlYngsW2VzaStlY3gqOCs0XQotCi0gICAgICAgIHNociBlYXgsMwotICAgICAgICBtb3YgZWR4LFtlc2krZWN4KjgrNF0KLQotICAgICAgICBzaHIgYmgsMwotICAgICAgICBtb3YgZGwsW2VzaStlY3gqOCsyXQotCi0gICAgICAgIHNobCBlYngsMTMKLSAgICAgICAgYW5kIGVheCwwMDAwMDdGRmgKLSAgICAgICAgCi0gICAgICAgIHNobCBlZHgsNwotICAgICAgICBhbmQgZWJ4LDA3RkYwMDAwaAotCi0gICAgICAgIGFuZCBlZHgsMDdDMDA3QzAwaAotICAgICAgICBhZGQgZWF4LGVieAotCi0gICAgICAgIGFkZCBlYXgsZWR4Ci0gICAgICAgIGluYyBlY3gKLQotICAgICAgICBqbnogLkw1ICAgICAgICAgICAgICAgICAKLQotCW1vdiBbZWRpK2VjeCo0LTRdLGVheAotCi0JOyB0YWlsCi0JcG9wIGVjeAotCWFuZCBlY3gsQllURSAxCi0JanogLkw3Ci0JbW92IGJsLFtlc2krMF0gICAgOyBibHVlCi0JbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgotCW1vdiBhaCxbZXNpKzJdICAgIDsgcmVkCi0Jc2hyIGFoLDMKLQlhbmQgYWwsMTExMTEwMDBiCi0Jc2hsIGVheCwyCi0Jc2hyIGJsLDMKLQlhZGQgYWwsYmwKLQltb3YgW2VkaSswXSxhbAotCW1vdiBbZWRpKzFdLGFoCi0JYWRkIGVzaSxCWVRFIDQKLQlhZGQgZWRpLEJZVEUgMgotCi0uTDcKLQlyZXRuCi0KLQotCi0KLTs7IDMyIEJJVCBSR0IgVE8gMTYgQklUIEJHUiA1NTUKLQkKLV9Db252ZXJ0WDg2cDMyXzE2QkdSNTU1OgotCQotCTsgY2hlY2sgc2hvcnQKLQljbXAgZWN4LEJZVEUgMTYKLQlqYSAuTDMKLQotCi0uTDEJOyBzaG9ydCBsb29wCi0JbW92IGFoLFtlc2krMF0gICAgOyBibHVlCi0JbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgotCW1vdiBibCxbZXNpKzJdICAgIDsgcmVkCi0Jc2hyIGFoLDMKLQlhbmQgYWwsMTExMTEwMDBiCi0Jc2hsIGVheCwyCi0Jc2hyIGJsLDMKLQlhZGQgYWwsYmwKLQltb3YgW2VkaSswXSxhbAotCW1vdiBbZWRpKzFdLGFoCi0JYWRkIGVzaSxCWVRFIDQKLQlhZGQgZWRpLEJZVEUgMgotCWRlYyBlY3gKLQlqbnogLkwxCi0uTDIgCi0JcmV0bgotCi0uTDMJOyBoZWFkCi0JbW92IGVieCxlZGkKLSAgICAgICAgYW5kIGVieCxCWVRFIDExYgotCWp6IC5MNCAgIAotCW1vdiBhaCxbZXNpKzBdICAgIDsgYmx1ZQotCW1vdiBhbCxbZXNpKzFdICAgIDsgZ3JlZW4KLQltb3YgYmwsW2VzaSsyXSAgICA7IHJlZAotCXNociBhaCwzCi0JYW5kIGFsLDExMTExMDAwYgotCXNobCBlYXgsMgotCXNociBibCwzCi0JYWRkIGFsLGJsCi0JbW92IFtlZGkrMF0sYWwKLQltb3YgW2VkaSsxXSxhaAotCWFkZCBlc2ksQllURSA0Ci0JYWRkIGVkaSxCWVRFIDIKLQlkZWMgZWN4Ci0KLS5MNAk7IHNhdmUgY291bnQKLQlwdXNoIGVjeAotCi0JOyB1bnJvbGwgdHdpY2UKLQlzaHIgZWN4LDEKLSAgICAKLQk7IHBvaW50IGFycmF5cyB0byBlbmQKLQlsZWEgZXNpLFtlc2krZWN4KjhdCi0JbGVhIGVkaSxbZWRpK2VjeCo0XQotCi0JOyBuZWdhdGl2ZSBjb3VudGVyIAotCW5lZyBlY3gKLQlqbXAgU0hPUlQgLkw2Ci0KLS5MNSAgICAgCi0JbW92IFtlZGkrZWN4KjQtNF0sZWF4ICAgICAgICAgICAgCi0uTDYgICAgIAotCW1vdiBlZHgsW2VzaStlY3gqOCs0XQotCi0gICAgICAgIG1vdiBiaCxbZXNpK2VjeCo4KzRdICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbW92IGFoLFtlc2krZWN4KjhdICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICBzaHIgYmgsMwotICAgICAgICBtb3YgYWwsW2VzaStlY3gqOCsxXSAgICAgICAgICAgICAKLQotICAgICAgICBzaHIgYWgsMwotICAgICAgICBtb3YgYmwsW2VzaStlY3gqOCs1XSAgICAgICAgICAgCi0KLSAgICAgICAgc2hsIGVheCwyCi0gICAgICAgIG1vdiBkbCxbZXNpK2VjeCo4KzJdCi0KLSAgICAgICAgc2hsIGVieCwxOAotICAgICAgICBhbmQgZWF4LDAwMDA3RkUwaCAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIHNociBlZHgsMwotICAgICAgICBhbmQgZWJ4LDA3RkUwMDAwMGggICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBhbmQgZWR4LDAwMUYwMDFGaCAgICAgICAgICAgICAgIAotICAgICAgICBhZGQgZWF4LGVieAotCi0gICAgICAgIGFkZCBlYXgsZWR4Ci0gICAgICAgIGluYyBlY3gKLQotICAgICAgICBqbnogLkw1ICAgICAgICAgICAgICAgICAKLQotCW1vdiBbZWRpK2VjeCo0LTRdLGVheCAgICAgICAgICAgIAotCi0JOyB0YWlsCi0JcG9wIGVjeAotCWFuZCBlY3gsQllURSAxCi0JanogLkw3Ci0JbW92IGFoLFtlc2krMF0gICAgOyBibHVlCi0JbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgotCW1vdiBibCxbZXNpKzJdICAgIDsgcmVkCi0Jc2hyIGFoLDMKLQlhbmQgYWwsMTExMTEwMDBiCi0Jc2hsIGVheCwyCi0Jc2hyIGJsLDMKLQlhZGQgYWwsYmwKLQltb3YgW2VkaSswXSxhbAotCW1vdiBbZWRpKzFdLGFoCi0JYWRkIGVzaSxCWVRFIDQKLQlhZGQgZWRpLEJZVEUgMgotCi0uTDcKLQlyZXRuCi0KLQotCi0KLQkKLTs7IEZST00gMzIgQklUIFJHQiB0byA4IEJJVCBSR0IgKHJycmdnZ2JiYikKLTs7IFRoaXMgcm91dGluZSB3cml0ZXMgRk9VUiBwaXhlbHMgYXQgb25jZSAoZHdvcmQpIGFuZCB0aGVuLCBpZiB0aGV5IGV4aXN0Ci07OyB0aGUgdHJhaWxpbmcgdGhyZWUgcGl4ZWxzCi1fQ29udmVydFg4NnAzMl84UkdCMzMyOgotCi0JCi0uTF9BTElHTkVECi0JcHVzaCBlY3gKLQotCXNociBlY3gsMgkJOyBXZSB3aWxsIGRyYXcgNCBwaXhlbHMgYXQgb25jZQotCWpueiAuTDEKLQkKLQlqbXAgLkwyCQkJOyBzaG9ydCBqdW1wIG91dCBvZiByYW5nZSA6KAotCQotLkwxOgotCW1vdiBlYXgsW2VzaV0JCTsgZmlyc3QgcGFpciBvZiBwaXhlbHMKLQltb3YgZWR4LFtlc2krNF0KLQotCXNociBkbCw2Ci0JbW92IGVieCxlYXgKLQotCXNociBhbCw2Ci0JYW5kIGFoLDBlMGgKLQotCXNociBlYngsMTYKLQlhbmQgZGgsMGUwaAotCQotCXNociBhaCwzCi0JYW5kIGJsLDBlMGgKLQotCXNociBkaCwzCi0JCi0Jb3IgYWwsYmwKLQkKLQltb3YgZWJ4LGVkeAkKLQlvciBhbCxhaAotCQotCXNociBlYngsMTYKLQlvciBkbCxkaAotCi0JYW5kIGJsLDBlMGgKLQkKLQlvciBkbCxibAotCi0JbW92IGFoLGRsCi0KLQkKLQkJCi0JbW92IGVieCxbZXNpKzhdCQk7IHNlY29uZCBwYWlyIG9mIHBpeGVscwotCi0JbW92IGVkeCxlYngKLQlhbmQgYmgsMGUwaAotCi0Jc2hyIGJsLDYKLQlhbmQgZWR4LDBlMDAwMDBoCi0KLQlzaHIgZWR4LDE2Ci0KLQlzaHIgYmgsMwotCi0Jcm9yIGVheCwxNgotCW9yIGJsLGRsCi0KLQltb3YgZWR4LFtlc2krMTJdCi0Jb3IgYmwsYmgKLQkKLQltb3YgYWwsYmwKLQotCW1vdiBlYngsZWR4Ci0JYW5kIGRoLDBlMGgKLQotCXNociBkbCw2Ci0JYW5kIGVieCwwZTAwMDAwaAotCQotCXNociBkaCwzCi0JbW92IGFoLGRsCi0KLQlzaHIgZWJ4LDE2Ci0Jb3IgYWgsZGgKLQotCW9yIGFoLGJsCi0KLQlyb2wgZWF4LDE2Ci0JYWRkIGVzaSxCWVRFIDE2Ci0JCQkKLQltb3YgW2VkaV0sZWF4CQotCWFkZCBlZGksQllURSA0Ci0JCi0JZGVjIGVjeAotCWp6IC5MMgkJCTsgTDEgb3V0IG9mIHJhbmdlIGZvciBzaG9ydCBqdW1wIDooCi0JCi0Jam1wIC5MMQotLkwyOgotCQotCXBvcCBlY3gKLQlhbmQgZWN4LEJZVEUgMwkJOyBtYXNrIG91dCBudW1iZXIgb2YgcGl4ZWxzIHRvIGRyYXcKLQkKLQlqeiAuTDQJCQk7IE5vdGhpbmcgdG8gZG8gYW55bW9yZQotCi0uTDM6Ci0JbW92IGVheCxbZXNpXQkJOyBzaW5nbGUgcGl4ZWwgY29udmVyc2lvbiBmb3IgdHJhaWxpbmcgcGl4ZWxzCi0KLSAgICAgICAgbW92IGVieCxlYXgKLQotICAgICAgICBzaHIgYWwsNgotICAgICAgICBhbmQgYWgsMGUwaAotCi0gICAgICAgIHNociBlYngsMTYKLQotICAgICAgICBzaHIgYWgsMwotICAgICAgICBhbmQgYmwsMGUwaAotCi0gICAgICAgIG9yIGFsLGFoCi0gICAgICAgIG9yIGFsLGJsCi0KLSAgICAgICAgbW92IFtlZGldLGFsCi0KLSAgICAgICAgaW5jIGVkaQotICAgICAgICBhZGQgZXNpLEJZVEUgNAotCi0JZGVjIGVjeAotCWpueiAuTDMKLQkKLS5MNDoJCi0JcmV0bgotCi0laWZpZG4gX19PVVRQVVRfRk9STUFUX18sZWxmCi1zZWN0aW9uIC5ub3RlLkdOVS1zdGFjayBub2FsbG9jIG5vZXhlYyBub3dyaXRlIHByb2diaXRzCi0lZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svU0RMX2pveXN0aWNrLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL1NETF9qb3lzdGljay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg0YTMyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svU0RMX2pveXN0aWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoaXMgaXMgdGhlIGpveXN0aWNrIEFQSSBmb3IgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyICovCi0KLSNpbmNsdWRlICJTRExfZXZlbnRzLmgiCi0jaW5jbHVkZSAiU0RMX3N5c2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiU0RMX2pveXN0aWNrX2MuaCIKLSNpZiAhU0RMX0VWRU5UU19ESVNBQkxFRAotI2luY2x1ZGUgIi4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHVzZWQgZm9yIFF1YWtlIElJSSBBcmVuYSAqLwotI2lmIFNETF9FVkVOVFNfRElTQUJMRUQKLSNkZWZpbmUgU0RMX0xvY2tfRXZlbnRUaHJlYWQoKQotI2RlZmluZSBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCkKLSNlbmRpZgotCi1VaW50OCBTRExfbnVtam95c3RpY2tzID0gMDsKLVNETF9Kb3lzdGljayAqKlNETF9qb3lzdGlja3MgPSBOVUxMOwotc3RhdGljIFNETF9Kb3lzdGljayAqZGVmYXVsdF9qb3lzdGljayA9IE5VTEw7Ci0KLWludCBTRExfSm95c3RpY2tJbml0KHZvaWQpCi17Ci0JaW50IGFycmF5bGVuOwotCWludCBzdGF0dXM7Ci0KLQlTRExfbnVtam95c3RpY2tzID0gMDsKLQlzdGF0dXMgPSBTRExfU1lTX0pveXN0aWNrSW5pdCgpOwotCWlmICggc3RhdHVzID49IDAgKSB7Ci0JCWFycmF5bGVuID0gKHN0YXR1cysxKSpzaXplb2YoKlNETF9qb3lzdGlja3MpOwotCQlTRExfam95c3RpY2tzID0gKFNETF9Kb3lzdGljayAqKilTRExfbWFsbG9jKGFycmF5bGVuKTsKLQkJaWYgKCBTRExfam95c3RpY2tzID09IE5VTEwgKSB7Ci0JCQlTRExfbnVtam95c3RpY2tzID0gMDsKLQkJfSBlbHNlIHsKLQkJCVNETF9tZW1zZXQoU0RMX2pveXN0aWNrcywgMCwgYXJyYXlsZW4pOwotCQkJU0RMX251bWpveXN0aWNrcyA9IHN0YXR1czsKLQkJfQotCQlzdGF0dXMgPSAwOwotCX0KLQlkZWZhdWx0X2pveXN0aWNrID0gTlVMTDsKLQlyZXR1cm4oc3RhdHVzKTsKLX0KLQotLyoKLSAqIENvdW50IHRoZSBudW1iZXIgb2Ygam95c3RpY2tzIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW0KLSAqLwotaW50IFNETF9OdW1Kb3lzdGlja3Modm9pZCkKLXsKLQlyZXR1cm4gU0RMX251bWpveXN0aWNrczsKLX0KLQotLyoKLSAqIEdldCB0aGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljawotICovCi1jb25zdCBjaGFyICpTRExfSm95c3RpY2tOYW1lKGludCBkZXZpY2VfaW5kZXgpCi17Ci0JaWYgKCAoZGV2aWNlX2luZGV4IDwgMCkgfHwgKGRldmljZV9pbmRleCA+PSBTRExfbnVtam95c3RpY2tzKSApIHsKLQkJU0RMX1NldEVycm9yKCJUaGVyZSBhcmUgJWQgam95c3RpY2tzIGF2YWlsYWJsZSIsCi0JCSAgICAgICAgICAgICBTRExfbnVtam95c3RpY2tzKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlyZXR1cm4oU0RMX1NZU19Kb3lzdGlja05hbWUoZGV2aWNlX2luZGV4KSk7Ci19Ci0KLS8qCi0gKiBPcGVuIGEgam95c3RpY2sgZm9yIHVzZSAtIHRoZSBpbmRleCBwYXNzZWQgYXMgYW4gYXJndW1lbnQgcmVmZXJzIHRvCi0gKiB0aGUgTid0aCBqb3lzdGljayBvbiB0aGUgc3lzdGVtLiAgVGhpcyBpbmRleCBpcyB0aGUgdmFsdWUgd2hpY2ggd2lsbAotICogaWRlbnRpZnkgdGhpcyBqb3lzdGljayBpbiBmdXR1cmUgam95c3RpY2sgZXZlbnRzLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGpveXN0aWNrIGlkZW50aWZpZXIsIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gKi8KLVNETF9Kb3lzdGljayAqU0RMX0pveXN0aWNrT3BlbihpbnQgZGV2aWNlX2luZGV4KQotewotCWludCBpOwotCVNETF9Kb3lzdGljayAqam95c3RpY2s7Ci0KLQlpZiAoIChkZXZpY2VfaW5kZXggPCAwKSB8fCAoZGV2aWNlX2luZGV4ID49IFNETF9udW1qb3lzdGlja3MpICkgewotCQlTRExfU2V0RXJyb3IoIlRoZXJlIGFyZSAlZCBqb3lzdGlja3MgYXZhaWxhYmxlIiwKLQkJICAgICAgICAgICAgIFNETF9udW1qb3lzdGlja3MpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogSWYgdGhlIGpveXN0aWNrIGlzIGFscmVhZHkgb3BlbiwgcmV0dXJuIGl0ICovCi0JZm9yICggaT0wOyBTRExfam95c3RpY2tzW2ldOyArK2kgKSB7Ci0JCWlmICggZGV2aWNlX2luZGV4ID09IFNETF9qb3lzdGlja3NbaV0tPmluZGV4ICkgewotCQkJam95c3RpY2sgPSBTRExfam95c3RpY2tzW2ldOwotCQkJKytqb3lzdGljay0+cmVmX2NvdW50OwotCQkJcmV0dXJuKGpveXN0aWNrKTsKLQkJfQotCX0KLQotCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgam95c3RpY2sgKi8KLQlqb3lzdGljayA9IChTRExfSm95c3RpY2sgKilTRExfbWFsbG9jKChzaXplb2YgKmpveXN0aWNrKSk7Ci0JaWYgKCBqb3lzdGljayAhPSBOVUxMICkgewotCQlTRExfbWVtc2V0KGpveXN0aWNrLCAwLCAoc2l6ZW9mICpqb3lzdGljaykpOwotCQlqb3lzdGljay0+aW5kZXggPSBkZXZpY2VfaW5kZXg7Ci0JCWlmICggU0RMX1NZU19Kb3lzdGlja09wZW4oam95c3RpY2spIDwgMCApIHsKLQkJCVNETF9mcmVlKGpveXN0aWNrKTsKLQkJCWpveXN0aWNrID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCWlmICggam95c3RpY2stPm5heGVzID4gMCApIHsKLQkJCQlqb3lzdGljay0+YXhlcyA9IChTaW50MTYgKilTRExfbWFsbG9jCi0JCQkJCShqb3lzdGljay0+bmF4ZXMqc2l6ZW9mKFNpbnQxNikpOwotCQkJfQotCQkJaWYgKCBqb3lzdGljay0+bmhhdHMgPiAwICkgewotCQkJCWpveXN0aWNrLT5oYXRzID0gKFVpbnQ4ICopU0RMX21hbGxvYwotCQkJCQkoam95c3RpY2stPm5oYXRzKnNpemVvZihVaW50OCkpOwotCQkJfQotCQkJaWYgKCBqb3lzdGljay0+bmJhbGxzID4gMCApIHsKLQkJCQlqb3lzdGljay0+YmFsbHMgPSAoc3RydWN0IGJhbGxkZWx0YSAqKVNETF9tYWxsb2MKLQkJCQkgIChqb3lzdGljay0+bmJhbGxzKnNpemVvZigqam95c3RpY2stPmJhbGxzKSk7Ci0JCQl9Ci0JCQlpZiAoIGpveXN0aWNrLT5uYnV0dG9ucyA+IDAgKSB7Ci0JCQkJam95c3RpY2stPmJ1dHRvbnMgPSAoVWludDggKilTRExfbWFsbG9jCi0JCQkJCShqb3lzdGljay0+bmJ1dHRvbnMqc2l6ZW9mKFVpbnQ4KSk7Ci0JCQl9Ci0JCQlpZiAoICgoam95c3RpY2stPm5heGVzID4gMCkgJiYgIWpveXN0aWNrLT5heGVzKQotCQkJICB8fCAoKGpveXN0aWNrLT5uaGF0cyA+IDApICYmICFqb3lzdGljay0+aGF0cykKLQkJCSAgfHwgKChqb3lzdGljay0+bmJhbGxzID4gMCkgJiYgIWpveXN0aWNrLT5iYWxscykKLQkJCSAgfHwgKChqb3lzdGljay0+bmJ1dHRvbnMgPiAwKSAmJiAham95c3RpY2stPmJ1dHRvbnMpKSB7Ci0JCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQkJU0RMX0pveXN0aWNrQ2xvc2Uoam95c3RpY2spOwotCQkJCWpveXN0aWNrID0gTlVMTDsKLQkJCX0KLQkJCWlmICggam95c3RpY2stPmF4ZXMgKSB7Ci0JCQkJU0RMX21lbXNldChqb3lzdGljay0+YXhlcywgMCwKLQkJCQkJam95c3RpY2stPm5heGVzKnNpemVvZihTaW50MTYpKTsKLQkJCX0KLQkJCWlmICggam95c3RpY2stPmhhdHMgKSB7Ci0JCQkJU0RMX21lbXNldChqb3lzdGljay0+aGF0cywgMCwKLQkJCQkJam95c3RpY2stPm5oYXRzKnNpemVvZihVaW50OCkpOwotCQkJfQotCQkJaWYgKCBqb3lzdGljay0+YmFsbHMgKSB7Ci0JCQkJU0RMX21lbXNldChqb3lzdGljay0+YmFsbHMsIDAsCi0JCQkJICBqb3lzdGljay0+bmJhbGxzKnNpemVvZigqam95c3RpY2stPmJhbGxzKSk7Ci0JCQl9Ci0JCQlpZiAoIGpveXN0aWNrLT5idXR0b25zICkgewotCQkJCVNETF9tZW1zZXQoam95c3RpY2stPmJ1dHRvbnMsIDAsCi0JCQkJCWpveXN0aWNrLT5uYnV0dG9ucypzaXplb2YoVWludDgpKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIGpveXN0aWNrICkgewotCQkvKiBBZGQgam95c3RpY2sgdG8gbGlzdCAqLwotCQkrK2pveXN0aWNrLT5yZWZfY291bnQ7Ci0JCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0JCWZvciAoIGk9MDsgU0RMX2pveXN0aWNrc1tpXTsgKytpICkKLQkJCS8qIFNraXAgdG8gbmV4dCBqb3lzdGljayAqLzsKLQkJU0RMX2pveXN0aWNrc1tpXSA9IGpveXN0aWNrOwotCQlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0JfQotCXJldHVybihqb3lzdGljayk7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIDEgaWYgdGhlIGpveXN0aWNrIGhhcyBiZWVuIG9wZW5lZCwgb3IgMCBpZiBpdCBoYXMgbm90LgotICovCi1pbnQgU0RMX0pveXN0aWNrT3BlbmVkKGludCBkZXZpY2VfaW5kZXgpCi17Ci0JaW50IGksIG9wZW5lZDsKLQotCW9wZW5lZCA9IDA7Ci0JZm9yICggaT0wOyBTRExfam95c3RpY2tzW2ldOyArK2kgKSB7Ci0JCWlmICggU0RMX2pveXN0aWNrc1tpXS0+aW5kZXggPT0gKFVpbnQ4KWRldmljZV9pbmRleCApIHsKLQkJCW9wZW5lZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4ob3BlbmVkKTsKLX0KLQotc3RhdGljIGludCBWYWxpZEpveXN0aWNrKFNETF9Kb3lzdGljayAqKmpveXN0aWNrKQotewotCWludCB2YWxpZDsKLQotCWlmICggKmpveXN0aWNrID09IE5VTEwgKSB7Ci0JCSpqb3lzdGljayA9IGRlZmF1bHRfam95c3RpY2s7Ci0JfQotCWlmICggKmpveXN0aWNrID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiSm95c3RpY2sgaGFzbid0IGJlZW4gb3BlbmVkIHlldCIpOwotCQl2YWxpZCA9IDA7Ci0JfSBlbHNlIHsKLQkJdmFsaWQgPSAxOwotCX0KLQlyZXR1cm4gdmFsaWQ7Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIGRldmljZSBpbmRleCBvZiBhbiBvcGVuZWQgam95c3RpY2suCi0gKi8KLWludCBTRExfSm95c3RpY2tJbmRleChTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCWlmICggISBWYWxpZEpveXN0aWNrKCZqb3lzdGljaykgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCXJldHVybihqb3lzdGljay0+aW5kZXgpOwotfQotCi0vKgotICogR2V0IHRoZSBudW1iZXIgb2YgbXVsdGktZGltZW5zaW9uYWwgYXhpcyBjb250cm9scyBvbiBhIGpveXN0aWNrCi0gKi8KLWludCBTRExfSm95c3RpY2tOdW1BeGVzKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JaWYgKCAhIFZhbGlkSm95c3RpY2soJmpveXN0aWNrKSApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcmV0dXJuKGpveXN0aWNrLT5uYXhlcyk7Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIG51bWJlciBvZiBoYXRzIG9uIGEgam95c3RpY2sKLSAqLwotaW50IFNETF9Kb3lzdGlja051bUhhdHMoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLQlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oam95c3RpY2stPm5oYXRzKTsKLX0KLQotLyoKLSAqIEdldCB0aGUgbnVtYmVyIG9mIHRyYWNrYmFsbHMgb24gYSBqb3lzdGljawotICovCi1pbnQgU0RMX0pveXN0aWNrTnVtQmFsbHMoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLQlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oam95c3RpY2stPm5iYWxscyk7Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIG51bWJlciBvZiBidXR0b25zIG9uIGEgam95c3RpY2sKLSAqLwotaW50IFNETF9Kb3lzdGlja051bUJ1dHRvbnMoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLQlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oam95c3RpY2stPm5idXR0b25zKTsKLX0KLQotLyoKLSAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBheGlzIGNvbnRyb2wgb24gYSBqb3lzdGljawotICovCi1TaW50MTYgU0RMX0pveXN0aWNrR2V0QXhpcyhTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYXhpcykKLXsKLQlTaW50MTYgc3RhdGU7Ci0KLQlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgewotCQlyZXR1cm4oMCk7Ci0JfQotCWlmICggYXhpcyA8IGpveXN0aWNrLT5uYXhlcyApIHsKLQkJc3RhdGUgPSBqb3lzdGljay0+YXhlc1theGlzXTsKLQl9IGVsc2UgewotCQlTRExfU2V0RXJyb3IoIkpveXN0aWNrIG9ubHkgaGFzICVkIGF4ZXMiLCBqb3lzdGljay0+bmF4ZXMpOwotCQlzdGF0ZSA9IDA7Ci0JfQotCXJldHVybihzdGF0ZSk7Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBoYXQgb24gYSBqb3lzdGljawotICovCi1VaW50OCBTRExfSm95c3RpY2tHZXRIYXQoU0RMX0pveXN0aWNrICpqb3lzdGljaywgaW50IGhhdCkKLXsKLQlVaW50OCBzdGF0ZTsKLQotCWlmICggISBWYWxpZEpveXN0aWNrKCZqb3lzdGljaykgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0JaWYgKCBoYXQgPCBqb3lzdGljay0+bmhhdHMgKSB7Ci0JCXN0YXRlID0gam95c3RpY2stPmhhdHNbaGF0XTsKLQl9IGVsc2UgewotCQlTRExfU2V0RXJyb3IoIkpveXN0aWNrIG9ubHkgaGFzICVkIGhhdHMiLCBqb3lzdGljay0+bmhhdHMpOwotCQlzdGF0ZSA9IDA7Ci0JfQotCXJldHVybihzdGF0ZSk7Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIGJhbGwgYXhpcyBjaGFuZ2Ugc2luY2UgdGhlIGxhc3QgcG9sbAotICovCi1pbnQgU0RMX0pveXN0aWNrR2V0QmFsbChTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYmFsbCwgaW50ICpkeCwgaW50ICpkeSkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCAhIFZhbGlkSm95c3RpY2soJmpveXN0aWNrKSApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQlyZXR2YWwgPSAwOwotCWlmICggYmFsbCA8IGpveXN0aWNrLT5uYmFsbHMgKSB7Ci0JCWlmICggZHggKSB7Ci0JCQkqZHggPSBqb3lzdGljay0+YmFsbHNbYmFsbF0uZHg7Ci0JCX0KLQkJaWYgKCBkeSApIHsKLQkJCSpkeSA9IGpveXN0aWNrLT5iYWxsc1tiYWxsXS5keTsKLQkJfQotCQlqb3lzdGljay0+YmFsbHNbYmFsbF0uZHggPSAwOwotCQlqb3lzdGljay0+YmFsbHNbYmFsbF0uZHkgPSAwOwotCX0gZWxzZSB7Ci0JCVNETF9TZXRFcnJvcigiSm95c3RpY2sgb25seSBoYXMgJWQgYmFsbHMiLCBqb3lzdGljay0+bmJhbGxzKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCXJldHVybihyZXR2YWwpOwotfQotCi0vKgotICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgYnV0dG9uIG9uIGEgam95c3RpY2sKLSAqLwotVWludDggU0RMX0pveXN0aWNrR2V0QnV0dG9uKFNETF9Kb3lzdGljayAqam95c3RpY2ssIGludCBidXR0b24pCi17Ci0JVWludDggc3RhdGU7Ci0KLQlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgewotCQlyZXR1cm4oMCk7Ci0JfQotCWlmICggYnV0dG9uIDwgam95c3RpY2stPm5idXR0b25zICkgewotCQlzdGF0ZSA9IGpveXN0aWNrLT5idXR0b25zW2J1dHRvbl07Ci0JfSBlbHNlIHsKLQkJU0RMX1NldEVycm9yKCJKb3lzdGljayBvbmx5IGhhcyAlZCBidXR0b25zIixqb3lzdGljay0+bmJ1dHRvbnMpOwotCQlzdGF0ZSA9IDA7Ci0JfQotCXJldHVybihzdGF0ZSk7Ci19Ci0KLS8qCi0gKiBDbG9zZSBhIGpveXN0aWNrIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggU0RMX0pveXN0aWNrT3BlbigpCi0gKi8KLXZvaWQgU0RMX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLQlpbnQgaTsKLQotCWlmICggISBWYWxpZEpveXN0aWNrKCZqb3lzdGljaykgKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBGaXJzdCBkZWNyZW1lbnQgcmVmIGNvdW50ICovCi0JaWYgKCAtLWpveXN0aWNrLT5yZWZfY291bnQgPiAwICkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogTG9jayB0aGUgZXZlbnQgcXVldWUgLSBwcmV2ZW50IGpveXN0aWNrIHBvbGxpbmcgKi8KLQlTRExfTG9ja19FdmVudFRocmVhZCgpOwotCi0JaWYgKCBqb3lzdGljayA9PSBkZWZhdWx0X2pveXN0aWNrICkgewotCQlkZWZhdWx0X2pveXN0aWNrID0gTlVMTDsKLQl9Ci0JU0RMX1NZU19Kb3lzdGlja0Nsb3NlKGpveXN0aWNrKTsKLQotCS8qIFJlbW92ZSBqb3lzdGljayBmcm9tIGxpc3QgKi8KLQlmb3IgKCBpPTA7IFNETF9qb3lzdGlja3NbaV07ICsraSApIHsKLQkJaWYgKCBqb3lzdGljayA9PSBTRExfam95c3RpY2tzW2ldICkgewotCQkJU0RMX21lbWNweSgmU0RMX2pveXN0aWNrc1tpXSwgJlNETF9qb3lzdGlja3NbaSsxXSwKLQkJCSAgICAgICAoU0RMX251bWpveXN0aWNrcy1pKSpzaXplb2Yoam95c3RpY2spKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogTGV0IHRoZSBldmVudCB0aHJlYWQga2VlcCBydW5uaW5nICovCi0JU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotCi0JLyogRnJlZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBqb3lzdGljayAqLwotCWlmICggam95c3RpY2stPmF4ZXMgKSB7Ci0JCVNETF9mcmVlKGpveXN0aWNrLT5heGVzKTsKLQl9Ci0JaWYgKCBqb3lzdGljay0+aGF0cyApIHsKLQkJU0RMX2ZyZWUoam95c3RpY2stPmhhdHMpOwotCX0KLQlpZiAoIGpveXN0aWNrLT5iYWxscyApIHsKLQkJU0RMX2ZyZWUoam95c3RpY2stPmJhbGxzKTsKLQl9Ci0JaWYgKCBqb3lzdGljay0+YnV0dG9ucyApIHsKLQkJU0RMX2ZyZWUoam95c3RpY2stPmJ1dHRvbnMpOwotCX0KLQlTRExfZnJlZShqb3lzdGljayk7Ci19Ci0KLXZvaWQgU0RMX0pveXN0aWNrUXVpdCh2b2lkKQotewotCS8qIFN0b3AgdGhlIGV2ZW50IHBvbGxpbmcgKi8KLQlTRExfTG9ja19FdmVudFRocmVhZCgpOwotCVNETF9udW1qb3lzdGlja3MgPSAwOwotCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKLQotCS8qIFF1aXQgdGhlIGpveXN0aWNrIHNldHVwICovCi0JU0RMX1NZU19Kb3lzdGlja1F1aXQoKTsKLQlpZiAoIFNETF9qb3lzdGlja3MgKSB7Ci0JCVNETF9mcmVlKFNETF9qb3lzdGlja3MpOwotCQlTRExfam95c3RpY2tzID0gTlVMTDsKLQl9Ci19Ci0KLQotLyogVGhlc2UgYXJlIGdsb2JhbCBmb3IgU0RMX3N5c2pveXN0aWNrLmMgYW5kIFNETF9ldmVudHMuYyAqLwotCi1pbnQgU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoU0RMX0pveXN0aWNrICpqb3lzdGljaywgVWludDggYXhpcywgU2ludDE2IHZhbHVlKQotewotCWludCBwb3N0ZWQ7Ci0KLQkvKiBVcGRhdGUgaW50ZXJuYWwgam95c3RpY2sgc3RhdGUgKi8KLQlqb3lzdGljay0+YXhlc1theGlzXSA9IHZhbHVlOwotCi0JLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KLQlwb3N0ZWQgPSAwOwotI2lmICFTRExfRVZFTlRTX0RJU0FCTEVECi0JaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tTRExfSk9ZQVhJU01PVElPTl0gPT0gU0RMX0VOQUJMRSApIHsKLQkJU0RMX0V2ZW50IGV2ZW50OwotCQlldmVudC50eXBlID0gU0RMX0pPWUFYSVNNT1RJT047Ci0JCWV2ZW50LmpheGlzLndoaWNoID0gam95c3RpY2stPmluZGV4OwotCQlldmVudC5qYXhpcy5heGlzID0gYXhpczsKLQkJZXZlbnQuamF4aXMudmFsdWUgPSB2YWx1ZTsKLQkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgKCpTRExfRXZlbnRPSykoJmV2ZW50KSApIHsKLQkJCXBvc3RlZCA9IDE7Ci0JCQlTRExfUHVzaEV2ZW50KCZldmVudCk7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogIVNETF9FVkVOVFNfRElTQUJMRUQgKi8KLQlyZXR1cm4ocG9zdGVkKTsKLX0KLQotaW50IFNETF9Qcml2YXRlSm95c3RpY2tIYXQoU0RMX0pveXN0aWNrICpqb3lzdGljaywgVWludDggaGF0LCBVaW50OCB2YWx1ZSkKLXsKLQlpbnQgcG9zdGVkOwotCi0JLyogVXBkYXRlIGludGVybmFsIGpveXN0aWNrIHN0YXRlICovCi0Jam95c3RpY2stPmhhdHNbaGF0XSA9IHZhbHVlOwotCi0JLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KLQlwb3N0ZWQgPSAwOwotI2lmICFTRExfRVZFTlRTX0RJU0FCTEVECi0JaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tTRExfSk9ZSEFUTU9USU9OXSA9PSBTRExfRU5BQkxFICkgewotCQlTRExfRXZlbnQgZXZlbnQ7Ci0JCWV2ZW50LmpoYXQudHlwZSA9IFNETF9KT1lIQVRNT1RJT047Ci0JCWV2ZW50LmpoYXQud2hpY2ggPSBqb3lzdGljay0+aW5kZXg7Ci0JCWV2ZW50LmpoYXQuaGF0ID0gaGF0OwotCQlldmVudC5qaGF0LnZhbHVlID0gdmFsdWU7Ci0JCWlmICggKFNETF9FdmVudE9LID09IE5VTEwpIHx8ICgqU0RMX0V2ZW50T0spKCZldmVudCkgKSB7Ci0JCQlwb3N0ZWQgPSAxOwotCQkJU0RMX1B1c2hFdmVudCgmZXZlbnQpOwotCQl9Ci0JfQotI2VuZGlmIC8qICFTRExfRVZFTlRTX0RJU0FCTEVEICovCi0JcmV0dXJuKHBvc3RlZCk7Ci19Ci0KLWludCBTRExfUHJpdmF0ZUpveXN0aWNrQmFsbChTRExfSm95c3RpY2sgKmpveXN0aWNrLCBVaW50OCBiYWxsLAotCQkJCQlTaW50MTYgeHJlbCwgU2ludDE2IHlyZWwpCi17Ci0JaW50IHBvc3RlZDsKLQotCS8qIFVwZGF0ZSBpbnRlcm5hbCBtb3VzZSBzdGF0ZSAqLwotCWpveXN0aWNrLT5iYWxsc1tiYWxsXS5keCArPSB4cmVsOwotCWpveXN0aWNrLT5iYWxsc1tiYWxsXS5keSArPSB5cmVsOwotCi0JLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KLQlwb3N0ZWQgPSAwOwotI2lmICFTRExfRVZFTlRTX0RJU0FCTEVECi0JaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tTRExfSk9ZQkFMTE1PVElPTl0gPT0gU0RMX0VOQUJMRSApIHsKLQkJU0RMX0V2ZW50IGV2ZW50OwotCQlldmVudC5qYmFsbC50eXBlID0gU0RMX0pPWUJBTExNT1RJT047Ci0JCWV2ZW50LmpiYWxsLndoaWNoID0gam95c3RpY2stPmluZGV4OwotCQlldmVudC5qYmFsbC5iYWxsID0gYmFsbDsKLQkJZXZlbnQuamJhbGwueHJlbCA9IHhyZWw7Ci0JCWV2ZW50LmpiYWxsLnlyZWwgPSB5cmVsOwotCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgewotCQkJcG9zdGVkID0gMTsKLQkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKLQkJfQotCX0KLSNlbmRpZiAvKiAhU0RMX0VWRU5UU19ESVNBQkxFRCAqLwotCXJldHVybihwb3N0ZWQpOwotfQotCi1pbnQgU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihTRExfSm95c3RpY2sgKmpveXN0aWNrLCBVaW50OCBidXR0b24sIFVpbnQ4IHN0YXRlKQotewotCWludCBwb3N0ZWQ7Ci0jaWYgIVNETF9FVkVOVFNfRElTQUJMRUQKLQlTRExfRXZlbnQgZXZlbnQ7Ci0KLQlzd2l0Y2ggKCBzdGF0ZSApIHsKLQkJY2FzZSBTRExfUFJFU1NFRDoKLQkJCWV2ZW50LnR5cGUgPSBTRExfSk9ZQlVUVE9ORE9XTjsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9SRUxFQVNFRDoKLQkJCWV2ZW50LnR5cGUgPSBTRExfSk9ZQlVUVE9OVVA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIEludmFsaWQgc3RhdGUgLS0gYmFpbCAqLwotCQkJcmV0dXJuKDApOwotCX0KLSNlbmRpZiAvKiAhU0RMX0VWRU5UU19ESVNBQkxFRCAqLwotCi0JLyogVXBkYXRlIGludGVybmFsIGpveXN0aWNrIHN0YXRlICovCi0Jam95c3RpY2stPmJ1dHRvbnNbYnV0dG9uXSA9IHN0YXRlOwotCi0JLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KLQlwb3N0ZWQgPSAwOwotI2lmICFTRExfRVZFTlRTX0RJU0FCTEVECi0JaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tldmVudC50eXBlXSA9PSBTRExfRU5BQkxFICkgewotCQlldmVudC5qYnV0dG9uLndoaWNoID0gam95c3RpY2stPmluZGV4OwotCQlldmVudC5qYnV0dG9uLmJ1dHRvbiA9IGJ1dHRvbjsKLQkJZXZlbnQuamJ1dHRvbi5zdGF0ZSA9IHN0YXRlOwotCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgewotCQkJcG9zdGVkID0gMTsKLQkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKLQkJfQotCX0KLSNlbmRpZiAvKiAhU0RMX0VWRU5UU19ESVNBQkxFRCAqLwotCXJldHVybihwb3N0ZWQpOwotfQotCi12b2lkIFNETF9Kb3lzdGlja1VwZGF0ZSh2b2lkKQotewotCWludCBpOwotCi0JZm9yICggaT0wOyBTRExfam95c3RpY2tzW2ldOyArK2kgKSB7Ci0JCVNETF9TWVNfSm95c3RpY2tVcGRhdGUoU0RMX2pveXN0aWNrc1tpXSk7Ci0JfQotfQotCi1pbnQgU0RMX0pveXN0aWNrRXZlbnRTdGF0ZShpbnQgc3RhdGUpCi17Ci0jaWYgU0RMX0VWRU5UU19ESVNBQkxFRAotCXJldHVybiBTRExfSUdOT1JFOwotI2Vsc2UKLQljb25zdCBVaW50OCBldmVudF9saXN0W10gPSB7Ci0JCVNETF9KT1lBWElTTU9USU9OLCBTRExfSk9ZQkFMTE1PVElPTiwgU0RMX0pPWUhBVE1PVElPTiwKLQkJU0RMX0pPWUJVVFRPTkRPV04sIFNETF9KT1lCVVRUT05VUCwKLQl9OwotCXVuc2lnbmVkIGludCBpOwotCi0Jc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIFNETF9RVUVSWToKLQkJCXN0YXRlID0gU0RMX0lHTk9SRTsKLQkJCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKGV2ZW50X2xpc3QpOyArK2kgKSB7Ci0JCQkJc3RhdGUgPSBTRExfRXZlbnRTdGF0ZShldmVudF9saXN0W2ldLFNETF9RVUVSWSk7Ci0JCQkJaWYgKCBzdGF0ZSA9PSBTRExfRU5BQkxFICkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKGV2ZW50X2xpc3QpOyArK2kgKSB7Ci0JCQkJU0RMX0V2ZW50U3RhdGUoZXZlbnRfbGlzdFtpXSwgc3RhdGUpOwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCXJldHVybihzdGF0ZSk7Ci0jZW5kaWYgLyogU0RMX0VWRU5UU19ESVNBQkxFRCAqLwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9TRExfam95c3RpY2tfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9TRExfam95c3RpY2tfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2IxZTNiLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svU0RMX2pveXN0aWNrX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBVc2VmdWwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZnJvbSBTRExfam95c3RpY2suYyAqLwotI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgotCi0vKiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBqb3lzdGlja3Mgb24gdGhlIHN5c3RlbSAqLwotZXh0ZXJuIFVpbnQ4IFNETF9udW1qb3lzdGlja3M7Ci0KLS8qIEludGVybmFsIGV2ZW50IHF1ZXVlaW5nIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCBTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhTRExfSm95c3RpY2sgKmpveXN0aWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OCBheGlzLCBTaW50MTYgdmFsdWUpOwotZXh0ZXJuIGludCBTRExfUHJpdmF0ZUpveXN0aWNrQmFsbChTRExfSm95c3RpY2sgKmpveXN0aWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OCBiYWxsLCBTaW50MTYgeHJlbCwgU2ludDE2IHlyZWwpOwotZXh0ZXJuIGludCBTRExfUHJpdmF0ZUpveXN0aWNrSGF0KFNETF9Kb3lzdGljayAqam95c3RpY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OCBoYXQsIFVpbnQ4IHZhbHVlKTsKLWV4dGVybiBpbnQgU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihTRExfSm95c3RpY2sgKmpveXN0aWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQ4IGJ1dHRvbiwgVWludDggc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9TRExfc3lzam95c3RpY2suaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svU0RMX3N5c2pveXN0aWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YzUzNGMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9TRExfc3lzam95c3RpY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgU0RMX2ZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBpcyB0aGUgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmb3IgdGhlIFNETCBqb3lzdGljayBBUEkgKi8KLQotI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgotCi0vKiBUaGUgU0RMIGpveXN0aWNrIHN0cnVjdHVyZSAqLwotc3RydWN0IF9TRExfSm95c3RpY2sgewotCVVpbnQ4IGluZGV4OwkJLyogRGV2aWNlIGluZGV4ICovCi0JY29uc3QgY2hhciAqbmFtZTsJLyogSm95c3RpY2sgbmFtZSAtIHN5c3RlbSBkZXBlbmRlbnQgKi8KLQotCWludCBuYXhlczsJCS8qIE51bWJlciBvZiBheGlzIGNvbnRyb2xzIG9uIHRoZSBqb3lzdGljayAqLwotCVNpbnQxNiAqYXhlczsJCS8qIEN1cnJlbnQgYXhpcyBzdGF0ZXMgKi8KLQotCWludCBuaGF0czsJCS8qIE51bWJlciBvZiBoYXRzIG9uIHRoZSBqb3lzdGljayAqLwotCVVpbnQ4ICpoYXRzOwkJLyogQ3VycmVudCBoYXQgc3RhdGVzICovCi0JCi0JaW50IG5iYWxsczsJCS8qIE51bWJlciBvZiB0cmFja2JhbGxzIG9uIHRoZSBqb3lzdGljayAqLwotCXN0cnVjdCBiYWxsZGVsdGEgewotCQlpbnQgZHg7Ci0JCWludCBkeTsKLQl9ICpiYWxsczsJCS8qIEN1cnJlbnQgYmFsbCBtb3Rpb24gZGVsdGFzICovCi0JCi0JaW50IG5idXR0b25zOwkJLyogTnVtYmVyIG9mIGJ1dHRvbnMgb24gdGhlIGpveXN0aWNrICovCi0JVWludDggKmJ1dHRvbnM7CQkvKiBDdXJyZW50IGJ1dHRvbiBzdGF0ZXMgKi8KLQkKLQlzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhICpod2RhdGE7CS8qIERyaXZlciBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KLQotCWludCByZWZfY291bnQ7CQkvKiBSZWZlcmVuY2UgY291bnQgZm9yIG11bHRpcGxlIG9wZW5zICovCi19OwotCi0vKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIGpveXN0aWNrcy4KLSAqIEpveXN0aWNrIDAgc2hvdWxkIGJlIHRoZSBzeXN0ZW0gZGVmYXVsdCBqb3lzdGljay4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBqb3lzdGlja3MsIG9yIC0xCi0gKiBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgotICovCi1leHRlcm4gaW50IFNETF9TWVNfSm95c3RpY2tJbml0KHZvaWQpOwotCi0vKiBGdW5jdGlvbiB0byBnZXQgdGhlIGRldmljZS1kZXBlbmRlbnQgbmFtZSBvZiBhIGpveXN0aWNrICovCi1leHRlcm4gY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KTsKLQotLyogRnVuY3Rpb24gdG8gb3BlbiBhIGpveXN0aWNrIGZvciB1c2UuCi0gICBUaGUgam95c3RpY2sgdG8gb3BlbiBpcyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGZpZWxkIG9mIHRoZSBqb3lzdGljay4KLSAgIFRoaXMgc2hvdWxkIGZpbGwgdGhlIG5idXR0b25zIGFuZCBuYXhlcyBmaWVsZHMgb2YgdGhlIGpveXN0aWNrIHN0cnVjdHVyZS4KLSAgIEl0IHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0gKi8KLWV4dGVybiBpbnQgU0RMX1NZU19Kb3lzdGlja09wZW4oU0RMX0pveXN0aWNrICpqb3lzdGljayk7Ci0KLS8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCi0gKiBidXQgaW5zdGVhZCBzaG91bGQgY2FsbCBTRExfUHJpdmF0ZUpveXN0aWNrKigpIHRvIGRlbGl2ZXIgZXZlbnRzCi0gKiBhbmQgdXBkYXRlIGpveXN0aWNrIGRldmljZSBzdGF0ZS4KLSAqLwotZXh0ZXJuIHZvaWQgU0RMX1NZU19Kb3lzdGlja1VwZGF0ZShTRExfSm95c3RpY2sgKmpveXN0aWNrKTsKLQotLyogRnVuY3Rpb24gdG8gY2xvc2UgYSBqb3lzdGljayBhZnRlciB1c2UgKi8KLWV4dGVybiB2b2lkIFNETF9TWVNfSm95c3RpY2tDbG9zZShTRExfSm95c3RpY2sgKmpveXN0aWNrKTsKLQotLyogRnVuY3Rpb24gdG8gcGVyZm9ybSBhbnkgc3lzdGVtLXNwZWNpZmljIGpveXN0aWNrIHJlbGF0ZWQgY2xlYW51cCAqLwotZXh0ZXJuIHZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svYW1pZ2Fvcy9TRExfc3lzam95c3RpY2suYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svYW1pZ2Fvcy9TRExfc3lzam95c3RpY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlNGViZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL2FtaWdhb3MvU0RMX3N5c2pveXN0aWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfSk9ZU1RJQ0tfQU1JR0EKLQotLyogVGhpcyBpcyB0aGUgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmb3IgdGhlIFNETCBqb3lzdGljayBBUEkgKi8KLQotI2luY2x1ZGUgPGxpYnJhcmllcy9sb3dsZXZlbC5oPgotI2lmIGRlZmluZWQoX19TQVNDKSB8fCBkZWZpbmVkKFNUT1JNQzRfV09TKQotI2luY2x1ZGUgPHByb3RvL2V4ZWMuaD4KLSNpbmNsdWRlIDxwcm90by9sb3dsZXZlbC5oPgotI2luY2x1ZGUgPHByb3RvL2dyYXBoaWNzLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGlubGluZS9leGVjLmg+Ci0jaW5jbHVkZSA8aW5saW5lL2xvd2xldmVsLmg+Ci0jaW5jbHVkZSA8aW5saW5lL2dyYXBoaWNzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJteWRlYnVnLmgiCi0KLWV4dGVybiBzdHJ1Y3QgRXhlY0Jhc2UgKlN5c0Jhc2U7Ci1leHRlcm4gc3RydWN0IEdmeEJhc2UgKkdmeEJhc2U7Ci0KLSNpbmNsdWRlICJTRExfam95c3RpY2suaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzam95c3RpY2suaCIKLSNpbmNsdWRlICIuLi9TRExfam95c3RpY2tfYy5oIgotCi0vKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIGpveXN0aWNrcy4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHNldCBTRExfbnVtam95c3RpY2tzIHRvIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCi0gKiBqb3lzdGlja3MuICBKb3lzdGljayAwIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgam95c3RpY2suCi0gKiBJdCBzaG91bGQgcmV0dXJuIDAsIG9yIC0xIG9uIGFuIHVucmVjb3ZlcmFibGUgZmF0YWwgZXJyb3IuCi0gKi8KLQotCi0vKiBBbWlnYSBzcGVjaWZpYyBkYXRhcyAqLwotc3RydWN0IExpYnJhcnkgKkxvd0xldmVsQmFzZT1OVUxMOwotCi1VTE9ORyBqb3lidXRbXT0KLXsKLQlKUEZfQlVUVE9OX1JFRCwKLQlKUEZfQlVUVE9OX0JMVUUsCi0JSlBGX0JVVFRPTl9QTEFZLAotCUpQRl9CVVRUT05fWUVMTE9XLAotCUpQRl9CVVRUT05fR1JFRU4sCi0JSlBGX0JVVFRPTl9GT1JXQVJELAotCUpQRl9CVVRUT05fUkVWRVJTRSwKLX07Ci0KLXN0cnVjdCBqb3lzdGlja19od2RhdGEKLXsKLQlVTE9ORyBqb3lzdGF0ZTsKLX07Ci0KLWludCBTRExfU1lTX0pveXN0aWNrSW5pdCh2b2lkKQotewotCWlmKCFMb3dMZXZlbEJhc2UpCi0JewotCQlpZihMb3dMZXZlbEJhc2U9T3BlbkxpYnJhcnkoImxvd2xldmVsLmxpYnJhcnkiLDM3KSkKLQkJCXJldHVybiAyOwotCX0KLQllbHNlCi0JCXJldHVybiAyOwotCi0JRChidWcoIiVsZCBqb3lzdGlja3MgYXZhaWxhYmxlLlxuIixTRExfbnVtam95c3RpY2tzKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkZXZpY2UtZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljayAqLwotY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQotewotCWlmKGluZGV4PDImJkxvd0xldmVsQmFzZSkKLQl7Ci0JCXN3aXRjaChpbmRleCkKLQkJewotCQkJY2FzZSAwOgotCQkJCXJldHVybiAiUG9ydCAxIEFtaWdhIEpveXN0aWNrL0pveXBhZCI7Ci0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuICJQb3J0IDIgQW1pZ2EgSm95c3RpY2svSm95cGFkIjsKLQkJfQotCX0KLQotCVNETF9TZXRFcnJvcigiTm8gam95c3RpY2sgYXZhaWxhYmxlIHdpdGggdGhhdCBpbmRleCIpOwotCXJldHVybihOVUxMKTsKLX0KLQotLyogRnVuY3Rpb24gdG8gb3BlbiBhIGpveXN0aWNrIGZvciB1c2UuCi0gICBUaGUgam95c3RpY2sgdG8gb3BlbiBpcyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGZpZWxkIG9mIHRoZSBqb3lzdGljay4KLSAgIFRoaXMgc2hvdWxkIGZpbGwgdGhlIG5idXR0b25zIGFuZCBuYXhlcyBmaWVsZHMgb2YgdGhlIGpveXN0aWNrIHN0cnVjdHVyZS4KLSAgIEl0IHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0gKi8KLQotaW50IFNETF9TWVNfSm95c3RpY2tPcGVuKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JVUxPTkcgdGVtcCxpOwotCUQoYnVnKCJPcGVuaW5nIGpveXN0aWNrICVsZFxuIixqb3lzdGljay0+aW5kZXgpKTsKLQotCWlmKCEoam95c3RpY2stPmh3ZGF0YT1TRExfbWFsbG9jKHNpemVvZihzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhKSkpKQotCQlyZXR1cm4gLTE7Ci0KLS8qIFRoaXMgbG9vcCBpcyB0byBjaGVjayBpZiB0aGUgY29udHJvbGxlciBpcyBhIGpveXBhZCAqLwotCi0JZm9yKGk9MDtpPDIwO2krKykKLQl7Ci0JCXRlbXA9UmVhZEpveVBvcnQoam95c3RpY2stPmluZGV4XjEpOyAvLyBmaXggdG8gaW52ZXJ0IGFtaWdhIGpveXBvcnRzCi0JCVdhaXRUT0YoKTsKLQl9Ci0KLQlpZigodGVtcCZKUF9UWVBFX01BU0spPT1KUF9UWVBFX0dBTUVDVExSKQotCQlqb3lzdGljay0+bmJ1dHRvbnM9NzsKLQllbHNlCi0JCWpveXN0aWNrLT5uYnV0dG9ucz0zOwotCi0Jam95c3RpY2stPm5oYXRzPTA7Ci0Jam95c3RpY2stPm5iYWxscz0wOwotCWpveXN0aWNrLT5uYXhlcz0yOwotCWpveXN0aWNrLT5od2RhdGEtPmpveXN0YXRlPTBMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCi0gKiBidXQgaW5zdGVhZCBzaG91bGQgY2FsbCBTRExfUHJpdmF0ZUpveXN0aWNrKigpIHRvIGRlbGl2ZXIgZXZlbnRzCi0gKiBhbmQgdXBkYXRlIGpveXN0aWNrIGRldmljZSBzdGF0ZS4KLSAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JVUxPTkcgZGF0YTsKLQlpbnQgaTsKLQotCWlmKGpveXN0aWNrLT5pbmRleDwyKQotCXsKLQkJZGF0YT1SZWFkSm95UG9ydChqb3lzdGljay0+aW5kZXgpOwotCi0JCWlmKGRhdGEmSlBfRElSRUNUSU9OX01BU0spCi0JCXsKLQkJCWlmKGRhdGEmSlBGX0pPWV9ET1dOKQotCQkJewotCQkJCWlmKCEoam95c3RpY2stPmh3ZGF0YS0+am95c3RhdGUmSlBGX0pPWV9ET1dOKSkKLQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssMCwxMjcpOwotCQkJfQotCQkJZWxzZSBpZihkYXRhJkpQRl9KT1lfVVApCi0JCQl7Ci0JCQkJaWYoIShqb3lzdGljay0+aHdkYXRhLT5qb3lzdGF0ZSZKUEZfSk9ZX1VQKSkKLQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssMCwtMTI3KTsKLQkJCX0KLQkJCWVsc2UgaWYoam95c3RpY2stPmh3ZGF0YS0+am95c3RhdGUmKEpQRl9KT1lfVVB8SlBGX0pPWV9ET1dOKSkKLQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywwLDApOwotCi0JCQlpZihkYXRhJkpQRl9KT1lfTEVGVCkKLQkJCXsKLQkJCQlpZighKGpveXN0aWNrLT5od2RhdGEtPmpveXN0YXRlJkpQRl9KT1lfTEVGVCkpCi0JCQkJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLDEsLTEyNyk7Ci0JCQl9Ci0JCQllbHNlIGlmKGRhdGEmSlBGX0pPWV9SSUdIVCkKLQkJCXsKLQkJCQlpZighKGpveXN0aWNrLT5od2RhdGEtPmpveXN0YXRlJkpQRl9KT1lfUklHSFQpKQotCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywxLDEyNyk7Ci0JCQl9Ci0JCQllbHNlIGlmKGpveXN0aWNrLT5od2RhdGEtPmpveXN0YXRlJihKUEZfSk9ZX0xFRlR8SlBGX0pPWV9SSUdIVCkpCi0JCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssMSwwKTsKLQkJfQotCQllbHNlIGlmKGpveXN0aWNrLT5od2RhdGEtPmpveXN0YXRlJihKUEZfSk9ZX0xFRlR8SlBGX0pPWV9SSUdIVCkpCi0JCXsKLQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywxLDApOwotCQl9Ci0JCWVsc2UgaWYoam95c3RpY2stPmh3ZGF0YS0+am95c3RhdGUmKEpQRl9KT1lfVVB8SlBGX0pPWV9ET1dOKSkKLQkJewotCQkJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLDAsMCk7Ci0JCX0KLQotCQlmb3IoaT0wO2k8am95c3RpY2stPm5idXR0b25zO2krKykKLQkJewotCQkJaWYoIChkYXRhJmpveWJ1dFtpXSkgKQotCQkJewotCQkJCWlmKGk9PTEpCi0JCQkJCWRhdGEmPSh+KGpveWJ1dFsyXSkpOwotCi0JCQkJaWYoIShqb3lzdGljay0+aHdkYXRhLT5qb3lzdGF0ZSZqb3lidXRbaV0pKQotCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLGksU0RMX1BSRVNTRUQpOwotCQkJfQotCQkJZWxzZSBpZihqb3lzdGljay0+aHdkYXRhLT5qb3lzdGF0ZSZqb3lidXRbaV0pCi0JCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayxpLFNETF9SRUxFQVNFRCk7Ci0JCX0KLQotCQlqb3lzdGljay0+aHdkYXRhLT5qb3lzdGF0ZT1kYXRhOwotCX0KLQotCXJldHVybjsKLX0KLQotLyogRnVuY3Rpb24gdG8gY2xvc2UgYSBqb3lzdGljayBhZnRlciB1c2UgKi8KLXZvaWQgU0RMX1NZU19Kb3lzdGlja0Nsb3NlKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JaWYoam95c3RpY2stPmh3ZGF0YSkKLQkJU0RMX2ZyZWUoam95c3RpY2stPmh3ZGF0YSk7Ci0JcmV0dXJuOwotfQotCi0vKiBGdW5jdGlvbiB0byBwZXJmb3JtIGFueSBzeXN0ZW0tc3BlY2lmaWMgam95c3RpY2sgcmVsYXRlZCBjbGVhbnVwICovCi0KLXZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCkKLXsKLQlpZihMb3dMZXZlbEJhc2UpCi0JewotCQlDbG9zZUxpYnJhcnkoTG93TGV2ZWxCYXNlKTsKLQkJTG93TGV2ZWxCYXNlPU5VTEw7Ci0JCVNETF9udW1qb3lzdGlja3M9MDsKLQl9Ci0JcmV0dXJuOwotfQotCi0jZW5kaWYgLyogU0RMX0pPWVNUSUNLX0FNSUdBICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL2Jlb3MvU0RMX2Jlam95c3RpY2suY2MgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL2Jlb3MvU0RMX2Jlam95c3RpY2suY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNTJiODYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9iZW9zL1NETF9iZWpveXN0aWNrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX0pPWVNUSUNLX0JFT1MKLQotLyogVGhpcyBpcyB0aGUgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmb3IgdGhlIFNETCBqb3lzdGljayBBUEkgKi8KLQotI2luY2x1ZGUgPGJlL3N1cHBvcnQvU3RyaW5nLmg+Ci0jaW5jbHVkZSA8YmUvZGV2aWNlL0pveXN0aWNrLmg+Ci0KLWV4dGVybiAiQyIgewotCi0jaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2pveXN0aWNrX2MuaCIKLQotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygam95c3RpY2tzIHdlJ2xsIGRldGVjdCAqLwotI2RlZmluZSBNQVhfSk9ZU1RJQ0tTCTE2CQotCi0vKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIGpveXN0aWNrcyAqLwotc3RhdGljIGNoYXIgKlNETF9qb3lwb3J0W01BWF9KT1lTVElDS1NdOwotc3RhdGljIGNoYXIgKlNETF9qb3luYW1lW01BWF9KT1lTVElDS1NdOwotCi0vKiBUaGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGEgam95c3RpY2sgKi8KLXN0cnVjdCBqb3lzdGlja19od2RhdGEgewotCUJKb3lzdGljayAqc3RpY2s7Ci0JdWludDggKm5ld19oYXRzOwotCWludDE2ICpuZXdfYXhlczsKLX07Ci0KLS8qIEZ1bmN0aW9uIHRvIHNjYW4gdGhlIHN5c3RlbSBmb3Igam95c3RpY2tzLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgc2V0IFNETF9udW1qb3lzdGlja3MgdG8gdGhlIG51bWJlciBvZiBhdmFpbGFibGUKLSAqIGpveXN0aWNrcy4gIEpveXN0aWNrIDAgc2hvdWxkIGJlIHRoZSBzeXN0ZW0gZGVmYXVsdCBqb3lzdGljay4KLSAqIEl0IHNob3VsZCByZXR1cm4gMCwgb3IgLTEgb24gYW4gdW5yZWNvdmVyYWJsZSBmYXRhbCBlcnJvci4KLSAqLwotaW50IFNETF9TWVNfSm95c3RpY2tJbml0KHZvaWQpCi17Ci0JQkpveXN0aWNrIGpveXN0aWNrOwotCWludCBudW1qb3lzdGlja3M7Ci0JaW50IGk7Ci0JaW50MzIgbnBvcnRzOwotCWNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKLQkKLQkvKiBTZWFyY2ggZm9yIGF0dGFjaGVkIGpveXN0aWNrcyAqLwotCW5wb3J0cyA9IGpveXN0aWNrLkNvdW50RGV2aWNlcygpOwotCW51bWpveXN0aWNrcyA9IDA7Ci0JU0RMX21lbXNldChTRExfam95cG9ydCwgMCwgKHNpemVvZiBTRExfam95cG9ydCkpOwotCVNETF9tZW1zZXQoU0RMX2pveW5hbWUsIDAsIChzaXplb2YgU0RMX2pveW5hbWUpKTsKLQlmb3IgKCBpPTA7IChTRExfbnVtam95c3RpY2tzIDwgTUFYX0pPWVNUSUNLUykgJiYgKGkgPCBucG9ydHMpOyArK2kgKSB7Ci0JCWlmICggam95c3RpY2suR2V0RGV2aWNlTmFtZShpLCBuYW1lKSA9PSBCX09LICkgewotCQkJaWYgKCBqb3lzdGljay5PcGVuKG5hbWUpICE9IEJfRVJST1IgKSB7Ci0JCQkJQlN0cmluZyBzdGlja19uYW1lOwotCQkJCWpveXN0aWNrLkdldENvbnRyb2xsZXJOYW1lKCZzdGlja19uYW1lKTsKLQkJCQlTRExfam95cG9ydFtudW1qb3lzdGlja3NdID0gc3RyZHVwKG5hbWUpOwotCQkJCVNETF9qb3luYW1lW251bWpveXN0aWNrc10gPQotCQkJCQkgICAgICAgICAgIHN0cmR1cChzdGlja19uYW1lLlN0cmluZygpKTsKLQkJCQludW1qb3lzdGlja3MrKzsKLQkJCQlqb3lzdGljay5DbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybihudW1qb3lzdGlja3MpOwotfQotCi0vKiBGdW5jdGlvbiB0byBnZXQgdGhlIGRldmljZS1kZXBlbmRlbnQgbmFtZSBvZiBhIGpveXN0aWNrICovCi1jb25zdCBjaGFyICpTRExfU1lTX0pveXN0aWNrTmFtZShpbnQgaW5kZXgpCi17Ci0JcmV0dXJuIFNETF9qb3luYW1lW2luZGV4XTsKLX0KLQotLyogRnVuY3Rpb24gdG8gb3BlbiBhIGpveXN0aWNrIGZvciB1c2UuCi0gICBUaGUgam95c3RpY2sgdG8gb3BlbiBpcyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGZpZWxkIG9mIHRoZSBqb3lzdGljay4KLSAgIFRoaXMgc2hvdWxkIGZpbGwgdGhlIG5idXR0b25zIGFuZCBuYXhlcyBmaWVsZHMgb2YgdGhlIGpveXN0aWNrIHN0cnVjdHVyZS4KLSAgIEl0IHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0gKi8KLWludCBTRExfU1lTX0pveXN0aWNrT3BlbihTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCUJKb3lzdGljayAqc3RpY2s7Ci0KLQkvKiBDcmVhdGUgdGhlIGpveXN0aWNrIGRhdGEgc3RydWN0dXJlICovCi0Jam95c3RpY2stPmh3ZGF0YSA9IChzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhICopCi0JICAgICAgICAgICAgICAgICAgIFNETF9tYWxsb2Moc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7Ci0JaWYgKCBqb3lzdGljay0+aHdkYXRhID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbWVtc2V0KGpveXN0aWNrLT5od2RhdGEsIDAsIHNpemVvZigqam95c3RpY2stPmh3ZGF0YSkpOwotCXN0aWNrID0gbmV3IEJKb3lzdGljazsKLQlqb3lzdGljay0+aHdkYXRhLT5zdGljayA9IHN0aWNrOwotCi0JLyogT3BlbiB0aGUgcmVxdWVzdGVkIGpveXN0aWNrIGZvciB1c2UgKi8KLQlpZiAoIHN0aWNrLT5PcGVuKFNETF9qb3lwb3J0W2pveXN0aWNrLT5pbmRleF0pID09IEJfRVJST1IgKSB7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gam95c3RpY2siKTsKLQkJU0RMX1NZU19Kb3lzdGlja0Nsb3NlKGpveXN0aWNrKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTZXQgdGhlIGpveXN0aWNrIHRvIGNhbGlicmF0ZWQgbW9kZSAqLwotCXN0aWNrLT5FbmFibGVDYWxpYnJhdGlvbigpOwotCi0JLyogR2V0IHRoZSBudW1iZXIgb2YgYnV0dG9ucywgaGF0cywgYW5kIGF4ZXMgb24gdGhlIGpveXN0aWNrICovCi0Jam95c3RpY2stPm5idXR0b25zID0gc3RpY2stPkNvdW50QnV0dG9ucygpOwotCWpveXN0aWNrLT5uYXhlcyA9IHN0aWNrLT5Db3VudEF4ZXMoKTsKLQlqb3lzdGljay0+bmhhdHMgPSBzdGljay0+Q291bnRIYXRzKCk7Ci0KLQlqb3lzdGljay0+aHdkYXRhLT5uZXdfYXhlcyA9IChpbnQxNiAqKQotCSAgICAgICAgICAgICAgICAgIFNETF9tYWxsb2Moam95c3RpY2stPm5heGVzKnNpemVvZihpbnQxNikpOwotCWpveXN0aWNrLT5od2RhdGEtPm5ld19oYXRzID0gKHVpbnQ4ICopCi0JICAgICAgICAgICAgICAgICAgU0RMX21hbGxvYyhqb3lzdGljay0+bmhhdHMqc2l6ZW9mKHVpbnQ4KSk7Ci0JaWYgKCAhIGpveXN0aWNrLT5od2RhdGEtPm5ld19oYXRzIHx8ICEgam95c3RpY2stPmh3ZGF0YS0+bmV3X2F4ZXMgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlTRExfU1lTX0pveXN0aWNrQ2xvc2Uoam95c3RpY2spOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFdlJ3JlIGRvbmUhICovCi0JcmV0dXJuKDApOwotfQotCi0vKiBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHN0YXRlIG9mIGEgam95c3RpY2sgLSBjYWxsZWQgYXMgYSBkZXZpY2UgcG9sbC4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IHVwZGF0ZSB0aGUgam95c3RpY2sgc3RydWN0dXJlIGRpcmVjdGx5LAotICogYnV0IGluc3RlYWQgc2hvdWxkIGNhbGwgU0RMX1ByaXZhdGVKb3lzdGljayooKSB0byBkZWxpdmVyIGV2ZW50cwotICogYW5kIHVwZGF0ZSBqb3lzdGljayBkZXZpY2Ugc3RhdGUuCi0gKi8KLXZvaWQgU0RMX1NZU19Kb3lzdGlja1VwZGF0ZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCXN0YXRpYyBjb25zdCBVaW50OCBoYXRfbWFwWzldID0gewotICAgICAgICAgICAgIFNETF9IQVRfQ0VOVEVSRUQsCi0gICAgICAgICAgICAgU0RMX0hBVF9VUCwKLSAgICAgICAgICAgICBTRExfSEFUX1JJR0hUVVAsCi0gICAgICAgICAgICAgU0RMX0hBVF9SSUdIVCwKLSAgICAgICAgICAgICBTRExfSEFUX1JJR0hURE9XTiwKLSAgICAgICAgICAgICBTRExfSEFUX0RPV04sCi0gICAgICAgICAgICAgU0RMX0hBVF9MRUZURE9XTiwKLSAgICAgICAgICAgICBTRExfSEFUX0xFRlQsCi0gICAgICAgICAgICAgU0RMX0hBVF9MRUZUVVAKLQl9OwotCWNvbnN0IGludCBKSVRURVIgPSAoMzI3NjgvMTApOwkvKiAxMCUgaml0dGVyIHRocmVzaG9sZCAob2s/KSAqLwotCi0JQkpveXN0aWNrICpzdGljazsKLQlpbnQgaSwgY2hhbmdlOwotCWludDE2ICpheGVzOwotCXVpbnQ4ICpoYXRzOwotCXVpbnQzMiBidXR0b25zOwotCi0JLyogU2V0IHVwIGRhdGEgcG9pbnRlcnMgKi8KLQlzdGljayA9IGpveXN0aWNrLT5od2RhdGEtPnN0aWNrOwotCWF4ZXMgPSBqb3lzdGljay0+aHdkYXRhLT5uZXdfYXhlczsKLQloYXRzID0gam95c3RpY2stPmh3ZGF0YS0+bmV3X2hhdHM7Ci0KLQkvKiBHZXQgdGhlIG5ldyBqb3lzdGljayBzdGF0ZSAqLwotCXN0aWNrLT5VcGRhdGUoKTsKLQlzdGljay0+R2V0QXhpc1ZhbHVlcyhheGVzKTsKLQlzdGljay0+R2V0SGF0VmFsdWVzKGhhdHMpOwotCWJ1dHRvbnMgPSBzdGljay0+QnV0dG9uVmFsdWVzKCk7Ci0KLQkvKiBHZW5lcmF0ZSBheGlzIG1vdGlvbiBldmVudHMgKi8KLQlmb3IgKCBpPTA7IGk8am95c3RpY2stPm5heGVzOyArK2kgKSB7Ci0JCWNoYW5nZSA9ICgoaW50MzIpYXhlc1tpXSAtIGpveXN0aWNrLT5heGVzW2ldKTsKLQkJaWYgKCAoY2hhbmdlID4gSklUVEVSKSB8fCAoY2hhbmdlIDwgLUpJVFRFUikgKSB7Ci0JCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywgaSwgYXhlc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKiBHZW5lcmF0ZSBoYXQgY2hhbmdlIGV2ZW50cyAqLwotCWZvciAoIGk9MDsgaTxqb3lzdGljay0+bmhhdHM7ICsraSApIHsKLQkJaWYgKCBoYXRzW2ldICE9IGpveXN0aWNrLT5oYXRzW2ldICkgewotCQkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgaSwgaGF0X21hcFtoYXRzW2ldXSk7Ci0JCX0KLQl9Ci0KLQkvKiBHZW5lcmF0ZSBidXR0b24gZXZlbnRzICovCi0JZm9yICggaT0wOyBpPGpveXN0aWNrLT5uYnV0dG9uczsgKytpICkgewotCQlpZiAoIChidXR0b25zJjB4MDEpICE9IGpveXN0aWNrLT5idXR0b25zW2ldICkgewotCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywgaSwgKGJ1dHRvbnMmMHgwMSkpOwotCQl9Ci0JCWJ1dHRvbnMgPj49IDE7Ci0JfQotfQotCi0vKiBGdW5jdGlvbiB0byBjbG9zZSBhIGpveXN0aWNrIGFmdGVyIHVzZSAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLQlpZiAoIGpveXN0aWNrLT5od2RhdGEgKSB7Ci0JCWpveXN0aWNrLT5od2RhdGEtPnN0aWNrLT5DbG9zZSgpOwotCQlkZWxldGUgam95c3RpY2stPmh3ZGF0YS0+c3RpY2s7Ci0JCWlmICggam95c3RpY2stPmh3ZGF0YS0+bmV3X2hhdHMgKSB7Ci0JCQlTRExfZnJlZShqb3lzdGljay0+aHdkYXRhLT5uZXdfaGF0cyk7Ci0JCX0KLQkJaWYgKCBqb3lzdGljay0+aHdkYXRhLT5uZXdfYXhlcyApIHsKLQkJCVNETF9mcmVlKGpveXN0aWNrLT5od2RhdGEtPm5ld19heGVzKTsKLQkJfQotCQlTRExfZnJlZShqb3lzdGljay0+aHdkYXRhKTsKLQkJam95c3RpY2stPmh3ZGF0YSA9IE5VTEw7Ci0JfQotfQotCi0vKiBGdW5jdGlvbiB0byBwZXJmb3JtIGFueSBzeXN0ZW0tc3BlY2lmaWMgam95c3RpY2sgcmVsYXRlZCBjbGVhbnVwICovCi12b2lkIFNETF9TWVNfSm95c3RpY2tRdWl0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKCBpPTA7IFNETF9qb3lwb3J0W2ldOyArK2kgKSB7Ci0JCVNETF9mcmVlKFNETF9qb3lwb3J0W2ldKTsKLQl9Ci0JU0RMX2pveXBvcnRbMF0gPSBOVUxMOwotCi0JZm9yICggaT0wOyBTRExfam95bmFtZVtpXTsgKytpICkgewotCQlTRExfZnJlZShTRExfam95bmFtZVtpXSk7Ci0JfQotCVNETF9qb3luYW1lWzBdID0gTlVMTDsKLX0KLQotfTsgLy8gZXh0ZXJuICJDIgotCi0jZW5kaWYgLyogU0RMX0pPWVNUSUNLX0JFT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svYnNkL1NETF9zeXNqb3lzdGljay5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9ic2QvU0RMX3N5c2pveXN0aWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNjg5OWQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9ic2QvU0RMX3N5c2pveXN0aWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfSk9ZU1RJQ0tfVVNCSElECi0KLS8qCi0gKiBKb3lzdGljayBkcml2ZXIgZm9yIHRoZSB1aGlkKDQpIGludGVyZmFjZSBmb3VuZCBpbiBPcGVuQlNELAotICogTmV0QlNEIGFuZCBGcmVlQlNELgotICoKLSAqIE1haW50YWluZXI6IDx2ZWRnZSBhdCBjc29mdC5vcmc+Ci0gKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWYgZGVmaW5lZChIQVZFX1VTQl9IKQotI2luY2x1ZGUgPHVzYi5oPgotI2VuZGlmCi0jaWZkZWYgX19EcmFnb25GbHlfXwotI2luY2x1ZGUgPGJ1cy91c2IvdXNiLmg+Ci0jaW5jbHVkZSA8YnVzL3VzYi91c2JoaWQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8ZGV2L3VzYi91c2IuaD4KLSNpbmNsdWRlIDxkZXYvdXNiL3VzYmhpZC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfVVNCSElEX0gpCi0jaW5jbHVkZSA8dXNiaGlkLmg+Ci0jZWxpZiBkZWZpbmVkKEhBVkVfTElCVVNCX0gpCi0jaW5jbHVkZSA8bGlidXNiLmg+Ci0jZWxpZiBkZWZpbmVkKEhBVkVfTElCVVNCSElEX0gpCi0jaW5jbHVkZSA8bGlidXNiaGlkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9fRlJFRUJTRF9fCi0jaWZuZGVmIF9fRHJhZ29uRmx5X18KLSNpbmNsdWRlIDxvc3JlbGRhdGUuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9qb3lzdGljay5oPgotI2VuZGlmCi0KLSNpZiBTRExfSk9ZU1RJQ0tfVVNCSElEX01BQ0hJTkVfSk9ZU1RJQ0tfSAotI2luY2x1ZGUgPG1hY2hpbmUvam95c3RpY2suaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2pveXN0aWNrX2MuaCIKLQotI2RlZmluZSBNQVhfVUhJRF9KT1lTCTQKLSNkZWZpbmUgTUFYX0pPWV9KT1lTCTIKLSNkZWZpbmUgTUFYX0pPWVMJKE1BWF9VSElEX0pPWVMgKyBNQVhfSk9ZX0pPWVMpCi0KLXN0cnVjdCByZXBvcnQgewotCXN0cnVjdAl1c2JfY3RsX3JlcG9ydCAqYnVmOwkvKiBCdWZmZXIgKi8KLQlzaXplX3QJc2l6ZTsJCQkvKiBCdWZmZXIgc2l6ZSAqLwotCWludAlyaWQ7CQkJLyogUmVwb3J0IElEICovCi0JZW51bSB7Ci0JCVNSRVBPUlRfVU5JTklULAotCQlTUkVQT1JUX0NMRUFOLAotCQlTUkVQT1JUX0RJUlRZCi0JfSBzdGF0dXM7Ci19OwotCi1zdGF0aWMgc3RydWN0IHsKLQlpbnQJdWhpZF9yZXBvcnQ7Ci0JaGlkX2tpbmRfdCBraW5kOwotCWNvbnN0CWNoYXIgKm5hbWU7Ci19IGNvbnN0IHJlcGluZm9bXSA9IHsKLQl7IFVISURfSU5QVVRfUkVQT1JULAloaWRfaW5wdXQsCSJpbnB1dCIgfSwKLQl7IFVISURfT1VUUFVUX1JFUE9SVCwJaGlkX291dHB1dCwJIm91dHB1dCIgfSwKLQl7IFVISURfRkVBVFVSRV9SRVBPUlQsCWhpZF9mZWF0dXJlLAkiZmVhdHVyZSIgfQotfTsKLQotZW51bSB7Ci0JUkVQT1JUX0lOUFVUID0gMCwKLQlSRVBPUlRfT1VUUFVUID0gMSwKLQlSRVBPUlRfRkVBVFVSRSA9IDIKLX07Ci0KLWVudW0gewotCUpPWUFYRV9YLAotCUpPWUFYRV9ZLAotCUpPWUFYRV9aLAotCUpPWUFYRV9TTElERVIsCi0JSk9ZQVhFX1dIRUVMLAotCUpPWUFYRV9SWCwKLQlKT1lBWEVfUlksCi0JSk9ZQVhFX1JaLAotCUpPWUFYRV9jb3VudAotfTsKLQotc3RydWN0IGpveXN0aWNrX2h3ZGF0YSB7Ci0JaW50CWZkOwotCWNoYXIJKnBhdGg7Ci0JZW51bSB7Ci0JCUJTREpPWV9VSElELAkvKiB1aGlkKDQpICovCi0JCUJTREpPWV9KT1kJLyogam95KDQpICovCi0JfSB0eXBlOwotCXN0cnVjdAlyZXBvcnRfZGVzYyAqcmVwZGVzYzsKLQlzdHJ1Y3QJcmVwb3J0IGlucmVwb3J0OwotCWludAlheGlzX21hcFtKT1lBWEVfY291bnRdOwkvKiBtYXAgcHJlc2VudCBKT1lBWEVfKiB0byAwLDEsLi4qLwotCWludAl4OwotCWludAl5OwotCWludAl4bWluOwotCWludAl5bWluOwotCWludAl4bWF4OwotCWludAl5bWF4OwotfTsKLQotc3RhdGljIGNoYXIgKmpveW5hbWVzW01BWF9KT1lTXTsKLXN0YXRpYyBjaGFyICpqb3lkZXZuYW1lc1tNQVhfSk9ZU107Ci0KLXN0YXRpYyBpbnQJcmVwb3J0X2FsbG9jKHN0cnVjdCByZXBvcnQgKiwgc3RydWN0IHJlcG9ydF9kZXNjICosIGludCk7Ci1zdGF0aWMgdm9pZAlyZXBvcnRfZnJlZShzdHJ1Y3QgcmVwb3J0ICopOwotCi0jaWZkZWYgVVNCSElEX1VDUl9EQVRBCi0jZGVmaW5lIFJFUF9CVUZfREFUQShyZXApICgocmVwKS0+YnVmLT51Y3JfZGF0YSkKLSNlbHNlCi0jZGVmaW5lIFJFUF9CVUZfREFUQShyZXApICgocmVwKS0+YnVmLT5kYXRhKQotI2VuZGlmCi0KLWludAotU0RMX1NZU19Kb3lzdGlja0luaXQodm9pZCkKLXsKLQljaGFyIHNbMTZdOwotCWludCBpLCBmZDsKLQotCVNETF9udW1qb3lzdGlja3MgPSAwOwotCi0JU0RMX21lbXNldChqb3luYW1lcywgMCwgc2l6ZW9mKGpveW5hbWVzKSk7Ci0JU0RMX21lbXNldChqb3lkZXZuYW1lcywgMCwgc2l6ZW9mKGpveWRldm5hbWVzKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1VISURfSk9ZUzsgaSsrKSB7Ci0JCVNETF9Kb3lzdGljayBuajsKLQotCQlTRExfc25wcmludGYocywgU0RMX2FycmF5c2l6ZShzKSwgIi9kZXYvdWhpZCVkIiwgaSk7Ci0KLQkJbmouaW5kZXggPSBTRExfbnVtam95c3RpY2tzOwotCQlqb3luYW1lc1tuai5pbmRleF0gPSBzdHJkdXAocyk7Ci0KLQkJaWYgKFNETF9TWVNfSm95c3RpY2tPcGVuKCZuaikgPT0gMCkgewotCQkJU0RMX1NZU19Kb3lzdGlja0Nsb3NlKCZuaik7Ci0JCQlTRExfbnVtam95c3RpY2tzKys7Ci0JCX0gZWxzZSB7Ci0JCQlTRExfZnJlZShqb3luYW1lc1tuai5pbmRleF0pOwotCQkJam95bmFtZXNbbmouaW5kZXhdID0gTlVMTDsKLQkJfQotCX0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0pPWV9KT1lTOyBpKyspIHsKLQkJU0RMX3NucHJpbnRmKHMsIFNETF9hcnJheXNpemUocyksICIvZGV2L2pveSVkIiwgaSk7Ci0JCWZkID0gb3BlbihzLCBPX1JET05MWSk7Ci0JCWlmIChmZCAhPSAtMSkgewotCQkJam95bmFtZXNbU0RMX251bWpveXN0aWNrcysrXSA9IHN0cmR1cChzKTsKLQkJCWNsb3NlKGZkKTsKLQkJfQotCX0KLQotCS8qIFJlYWQgdGhlIGRlZmF1bHQgVVNCIEhJRCB1c2FnZSB0YWJsZS4gKi8KLQloaWRfaW5pdChOVUxMKTsKLQotCXJldHVybiAoU0RMX251bWpveXN0aWNrcyk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQotewotCWlmIChqb3lkZXZuYW1lc1tpbmRleF0gIT0gTlVMTCkgewotCQlyZXR1cm4gKGpveWRldm5hbWVzW2luZGV4XSk7Ci0JfQotCXJldHVybiAoam95bmFtZXNbaW5kZXhdKTsKLX0KLQotc3RhdGljIGludAotdXNhZ2VfdG9fam95YXhlKHVuc2lnbmVkIHVzYWdlKQotewotICAgIGludCBqb3lheGU7Ci0gICAgc3dpdGNoICh1c2FnZSkgewotICAgIGNhc2UgSFVHX1g6Ci0Jam95YXhlID0gSk9ZQVhFX1g7IGJyZWFrOwotICAgIGNhc2UgSFVHX1k6Ci0Jam95YXhlID0gSk9ZQVhFX1k7IGJyZWFrOwotICAgIGNhc2UgSFVHX1o6Ci0Jam95YXhlID0gSk9ZQVhFX1o7IGJyZWFrOwotICAgIGNhc2UgSFVHX1NMSURFUjoKLQlqb3lheGUgPSBKT1lBWEVfU0xJREVSOyBicmVhazsKLSAgICBjYXNlIEhVR19XSEVFTDoKLQlqb3lheGUgPSBKT1lBWEVfV0hFRUw7IGJyZWFrOwotICAgIGNhc2UgSFVHX1JYOgotCWpveWF4ZSA9IEpPWUFYRV9SWDsgYnJlYWs7Ci0gICAgY2FzZSBIVUdfUlk6Ci0Jam95YXhlID0gSk9ZQVhFX1JZOyBicmVhazsKLSAgICBjYXNlIEhVR19SWjoKLQlqb3lheGUgPSBKT1lBWEVfUlo7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0Jam95YXhlID0gLTE7Ci0gICAgfQotICAgIHJldHVybiBqb3lheGU7ICAgIAotfQotCi1zdGF0aWMgdW5zaWduZWQKLWhhdHZhbF90b19zZGwoU2ludDMyIGhhdHZhbCkKLXsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaGF0X2Rpcl9tYXBbOF0gPSB7Ci0JU0RMX0hBVF9VUCwgU0RMX0hBVF9SSUdIVFVQLCBTRExfSEFUX1JJR0hULCBTRExfSEFUX1JJR0hURE9XTiwgCi0JU0RMX0hBVF9ET1dOLCBTRExfSEFUX0xFRlRET1dOLCBTRExfSEFUX0xFRlQsIFNETF9IQVRfTEVGVFVQCi0gICAgfTsKLSAgICB1bnNpZ25lZCByZXN1bHQ7Ci0gICAgaWYgKChoYXR2YWwgJiA3KSA9PSBoYXR2YWwpIAotCXJlc3VsdCA9IGhhdF9kaXJfbWFwW2hhdHZhbF07Ci0gICAgZWxzZSAKLQlyZXN1bHQgPSBTRExfSEFUX0NFTlRFUkVEOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotaW50Ci1TRExfU1lTX0pveXN0aWNrT3BlbihTRExfSm95c3RpY2sgKmpveSkKLXsKLQljaGFyICpwYXRoID0gam95bmFtZXNbam95LT5pbmRleF07Ci0Jc3RydWN0IGpveXN0aWNrX2h3ZGF0YSAqaHc7Ci0Jc3RydWN0IGhpZF9pdGVtIGhpdGVtOwotCXN0cnVjdCBoaWRfZGF0YSAqaGRhdGE7Ci0Jc3RydWN0IHJlcG9ydCAqcmVwOwotCWludCBmZDsKLQlpbnQgaTsKLQotCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7Ci0JaWYgKGZkID09IC0xKSB7Ci0JCVNETF9TZXRFcnJvcigiJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0JaHcgPSAoc3RydWN0IGpveXN0aWNrX2h3ZGF0YSAqKVNETF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBqb3lzdGlja19od2RhdGEpKTsKLQlpZiAoaHcgPT0gTlVMTCkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0Jam95LT5od2RhdGEgPSBodzsKLQlody0+ZmQgPSBmZDsKLQlody0+cGF0aCA9IHN0cmR1cChwYXRoKTsKLQlody0+eCA9IDA7Ci0JaHctPnkgPSAwOwotCWh3LT54bWluID0gMHhmZmZmOwotCWh3LT55bWluID0gMHhmZmZmOwotCWh3LT54bWF4ID0gMDsKLQlody0+eW1heCA9IDA7Ci0JaWYgKCEgU0RMX3N0cm5jbXAocGF0aCwgIi9kZXYvam95IiwgOCkpIHsKLQkJaHctPnR5cGUgPSBCU0RKT1lfSk9ZOwotCQlqb3ktPm5heGVzID0gMjsKLQkJam95LT5uYnV0dG9ucyA9IDI7Ci0JCWpveS0+bmhhdHMgPSAwOwotCQlqb3ktPm5iYWxscyA9IDA7Ci0JCWpveWRldm5hbWVzW2pveS0+aW5kZXhdID0gc3RyZHVwKCJHYW1lcG9ydCBqb3lzdGljayIpOwotCQlnb3RvIHVzYmVuZDsKLQl9IGVsc2UgewotCQlody0+dHlwZSA9IEJTREpPWV9VSElEOwotCX0KLQotCXsKLQkgICAgaW50IGF4OwotCSAgICBmb3IgKGF4ID0gMDsgYXggPCBKT1lBWEVfY291bnQ7IGF4KyspCi0JCWh3LT5heGlzX21hcFtheF0gPSAtMTsKLQl9Ci0JaHctPnJlcGRlc2MgPSBoaWRfZ2V0X3JlcG9ydF9kZXNjKGZkKTsKLQlpZiAoaHctPnJlcGRlc2MgPT0gTlVMTCkgewotCQlTRExfU2V0RXJyb3IoIiVzOiBVU0JfR0VUX1JFUE9SVF9ERVNDOiAlcyIsIGh3LT5wYXRoLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byB1c2JlcnI7Ci0JfQotCi0JcmVwID0gJmh3LT5pbnJlcG9ydDsKLQlpZiAoaW9jdGwoZmQsIFVTQl9HRVRfUkVQT1JUX0lELCAmcmVwLT5yaWQpIDwgMCkgewotCQlyZXAtPnJpZCA9IC0xOyAvKiBYWFggKi8KLQl9Ci0JaWYgKHJlcG9ydF9hbGxvYyhyZXAsIGh3LT5yZXBkZXNjLCBSRVBPUlRfSU5QVVQpIDwgMCkgewotCQlnb3RvIHVzYmVycjsKLQl9Ci0JaWYgKHJlcC0+c2l6ZSA8PSAwKSB7Ci0JCVNETF9TZXRFcnJvcigiJXM6IElucHV0IHJlcG9ydCBkZXNjcmlwdG9yIGhhcyBpbnZhbGlkIGxlbmd0aCIsCi0JCSAgICBody0+cGF0aCk7Ci0JCWdvdG8gdXNiZXJyOwotCX0KLQotI2lmIGRlZmluZWQoVVNCSElEX05FVykgfHwgKGRlZmluZWQoX19GUkVFQlNEX18pICYmIF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDExMSkKLQloZGF0YSA9IGhpZF9zdGFydF9wYXJzZShody0+cmVwZGVzYywgMSA8PCBoaWRfaW5wdXQsIHJlcC0+cmlkKTsKLSNlbHNlCi0JaGRhdGEgPSBoaWRfc3RhcnRfcGFyc2UoaHctPnJlcGRlc2MsIDEgPDwgaGlkX2lucHV0KTsKLSNlbmRpZgotCWlmIChoZGF0YSA9PSBOVUxMKSB7Ci0JCVNETF9TZXRFcnJvcigiJXM6IENhbm5vdCBzdGFydCBISUQgcGFyc2VyIiwgaHctPnBhdGgpOwotCQlnb3RvIHVzYmVycjsKLQl9Ci0Jam95LT5uYXhlcyA9IDA7Ci0Jam95LT5uYnV0dG9ucyA9IDA7Ci0Jam95LT5uaGF0cyA9IDA7Ci0Jam95LT5uYmFsbHMgPSAwOwotCWZvciAoaT0wOyBpPEpPWUFYRV9jb3VudDsgaSsrKQotCQlody0+YXhpc19tYXBbaV0gPSAtMTsKLQotCXdoaWxlIChoaWRfZ2V0X2l0ZW0oaGRhdGEsICZoaXRlbSkgPiAwKSB7Ci0JCWNoYXIgKnNwOwotCQljb25zdCBjaGFyICpzOwotCi0JCXN3aXRjaCAoaGl0ZW0ua2luZCkgewotCQljYXNlIGhpZF9jb2xsZWN0aW9uOgotCQkJc3dpdGNoIChISURfUEFHRShoaXRlbS51c2FnZSkpIHsKLQkJCWNhc2UgSFVQX0dFTkVSSUNfREVTS1RPUDoKLQkJCQlzd2l0Y2ggKEhJRF9VU0FHRShoaXRlbS51c2FnZSkpIHsKLQkJCQljYXNlIEhVR19KT1lTVElDSzoKLQkJCQljYXNlIEhVR19HQU1FX1BBRDoKLQkJCQkJcyA9IGhpZF91c2FnZV9pbl9wYWdlKGhpdGVtLnVzYWdlKTsKLQkJCQkJc3AgPSBTRExfbWFsbG9jKFNETF9zdHJsZW4ocykgKyA1KTsKLQkJCQkJU0RMX3NucHJpbnRmKHNwLCBTRExfc3RybGVuKHMpICsgNSwgIiVzICglZCkiLCBzLAotCQkJCQkgICAgam95LT5pbmRleCk7Ci0JCQkJCWpveWRldm5hbWVzW2pveS0+aW5kZXhdID0gc3A7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgaGlkX2lucHV0OgotCQkJc3dpdGNoIChISURfUEFHRShoaXRlbS51c2FnZSkpIHsKLQkJCWNhc2UgSFVQX0dFTkVSSUNfREVTS1RPUDogewotCQkJICAgIHVuc2lnbmVkIHVzYWdlID0gSElEX1VTQUdFKGhpdGVtLnVzYWdlKTsKLQkJCSAgICBpbnQgam95YXhlID0gdXNhZ2VfdG9fam95YXhlKHVzYWdlKTsKLQkJCSAgICBpZiAoam95YXhlID49IDApIHsKLQkJCQlody0+YXhpc19tYXBbam95YXhlXSA9IDE7Ci0JCQkgICAgfSBlbHNlIGlmICh1c2FnZSA9PSBIVUdfSEFUX1NXSVRDSCkgewotCQkJCWpveS0+bmhhdHMrKzsKLQkJCSAgICB9Ci0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEhVUF9CVVRUT046Ci0JCQkJam95LT5uYnV0dG9ucysrOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaGlkX2VuZF9wYXJzZShoZGF0YSk7Ci0JZm9yIChpPTA7IGk8Sk9ZQVhFX2NvdW50OyBpKyspCi0JCWlmIChody0+YXhpc19tYXBbaV0gPiAwKQotCQkJaHctPmF4aXNfbWFwW2ldID0gam95LT5uYXhlcysrOwotCi11c2JlbmQ6Ci0JLyogVGhlIHBvbGwgYmxvY2tzIHRoZSBldmVudCB0aHJlYWQuICovCi0JZmNudGwoZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotCi0JcmV0dXJuICgwKTsKLXVzYmVycjoKLQljbG9zZShody0+ZmQpOwotCVNETF9mcmVlKGh3LT5wYXRoKTsKLQlTRExfZnJlZShodyk7Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLXZvaWQKLVNETF9TWVNfSm95c3RpY2tVcGRhdGUoU0RMX0pveXN0aWNrICpqb3kpCi17Ci0Jc3RydWN0IGhpZF9pdGVtIGhpdGVtOwotCXN0cnVjdCBoaWRfZGF0YSAqaGRhdGE7Ci0Jc3RydWN0IHJlcG9ydCAqcmVwOwotCWludCBuYnV0dG9uLCBuYXhlID0gLTE7Ci0JU2ludDMyIHY7Ci0KLSNpZiBkZWZpbmVkKF9fRlJFRUJTRF9fKSB8fCBTRExfSk9ZU1RJQ0tfVVNCSElEX01BQ0hJTkVfSk9ZU1RJQ0tfSAotCXN0cnVjdCBqb3lzdGljayBnYW1lcG9ydDsKLSAKLQlpZiAoam95LT5od2RhdGEtPnR5cGUgPT0gQlNESk9ZX0pPWSkgewotCQlpZiAocmVhZChqb3ktPmh3ZGF0YS0+ZmQsICZnYW1lcG9ydCwgc2l6ZW9mIGdhbWVwb3J0KSAhPSBzaXplb2YgZ2FtZXBvcnQpCi0JCQlyZXR1cm47Ci0JCWlmIChhYnMoam95LT5od2RhdGEtPnggLSBnYW1lcG9ydC54KSA+IDgpIHsKLQkJCWpveS0+aHdkYXRhLT54ID0gZ2FtZXBvcnQueDsKLQkJCWlmIChqb3ktPmh3ZGF0YS0+eCA8IGpveS0+aHdkYXRhLT54bWluKSB7Ci0JCQkJam95LT5od2RhdGEtPnhtaW4gPSBqb3ktPmh3ZGF0YS0+eDsKLQkJCX0KLQkJCWlmIChqb3ktPmh3ZGF0YS0+eCA+IGpveS0+aHdkYXRhLT54bWF4KSB7Ci0JCQkJam95LT5od2RhdGEtPnhtYXggPSBqb3ktPmh3ZGF0YS0+eDsKLQkJCX0KLQkJCWlmIChqb3ktPmh3ZGF0YS0+eG1pbiA9PSBqb3ktPmh3ZGF0YS0+eG1heCkgewotCQkJCWpveS0+aHdkYXRhLT54bWluLS07Ci0JCQkJam95LT5od2RhdGEtPnhtYXgrKzsKLQkJCX0KLQkJCXYgPSAoU2ludDMyKWpveS0+aHdkYXRhLT54OwotCQkJdiAtPSAoam95LT5od2RhdGEtPnhtYXggKyBqb3ktPmh3ZGF0YS0+eG1pbiArIDEpLzI7Ci0JCQl2ICo9IDMyNzY4Lygoam95LT5od2RhdGEtPnhtYXggLSBqb3ktPmh3ZGF0YS0+eG1pbiArIDEpLzIpOwotCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95LCAwLCB2KTsKLQkJfQotCQlpZiAoYWJzKGpveS0+aHdkYXRhLT55IC0gZ2FtZXBvcnQueSkgPiA4KSB7Ci0JCQlqb3ktPmh3ZGF0YS0+eSA9IGdhbWVwb3J0Lnk7Ci0JCQlpZiAoam95LT5od2RhdGEtPnkgPCBqb3ktPmh3ZGF0YS0+eW1pbikgewotCQkJCWpveS0+aHdkYXRhLT55bWluID0gam95LT5od2RhdGEtPnk7Ci0JCQl9Ci0JCQlpZiAoam95LT5od2RhdGEtPnkgPiBqb3ktPmh3ZGF0YS0+eW1heCkgewotCQkJCWpveS0+aHdkYXRhLT55bWF4ID0gam95LT5od2RhdGEtPnk7Ci0JCQl9Ci0JCQlpZiAoam95LT5od2RhdGEtPnltaW4gPT0gam95LT5od2RhdGEtPnltYXgpIHsKLQkJCQlqb3ktPmh3ZGF0YS0+eW1pbi0tOwotCQkJCWpveS0+aHdkYXRhLT55bWF4Kys7Ci0JCQl9Ci0JCQl2ID0gKFNpbnQzMilqb3ktPmh3ZGF0YS0+eTsKLQkJCXYgLT0gKGpveS0+aHdkYXRhLT55bWF4ICsgam95LT5od2RhdGEtPnltaW4gKyAxKS8yOwotCQkJdiAqPSAzMjc2OC8oKGpveS0+aHdkYXRhLT55bWF4IC0gam95LT5od2RhdGEtPnltaW4gKyAxKS8yKTsKLQkJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveSwgMSwgdik7Ci0JCX0KLQkJaWYgKGdhbWVwb3J0LmIxICE9IGpveS0+YnV0dG9uc1swXSkgewotCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3ksIDAsIGdhbWVwb3J0LmIxKTsKLQkJfQotCQlpZiAoZ2FtZXBvcnQuYjIgIT0gam95LT5idXR0b25zWzFdKSB7Ci0JCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveSwgMSwgZ2FtZXBvcnQuYjIpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLyogZGVmaW5lZChfX0ZSRUVCU0RfXykgfHwgU0RMX0pPWVNUSUNLX1VTQkhJRF9NQUNISU5FX0pPWVNUSUNLX0ggKi8KLQkKLQlyZXAgPSAmam95LT5od2RhdGEtPmlucmVwb3J0OwotCi0JaWYgKHJlYWQoam95LT5od2RhdGEtPmZkLCBSRVBfQlVGX0RBVEEocmVwKSwgcmVwLT5zaXplKSAhPSByZXAtPnNpemUpIHsKLQkJcmV0dXJuOwotCX0KLSNpZiBkZWZpbmVkKFVTQkhJRF9ORVcpIHx8IChkZWZpbmVkKF9fRlJFRUJTRF9fKSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAxMTEpCi0JaGRhdGEgPSBoaWRfc3RhcnRfcGFyc2Uoam95LT5od2RhdGEtPnJlcGRlc2MsIDEgPDwgaGlkX2lucHV0LCByZXAtPnJpZCk7Ci0jZWxzZQotCWhkYXRhID0gaGlkX3N0YXJ0X3BhcnNlKGpveS0+aHdkYXRhLT5yZXBkZXNjLCAxIDw8IGhpZF9pbnB1dCk7Ci0jZW5kaWYKLQlpZiAoaGRhdGEgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDYW5ub3Qgc3RhcnQgSElEIHBhcnNlclxuIiwKLQkJICAgIGpveS0+aHdkYXRhLT5wYXRoKTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAobmJ1dHRvbiA9IDA7IGhpZF9nZXRfaXRlbShoZGF0YSwgJmhpdGVtKSA+IDA7KSB7Ci0JCXN3aXRjaCAoaGl0ZW0ua2luZCkgewotCQljYXNlIGhpZF9pbnB1dDoKLQkJCXN3aXRjaCAoSElEX1BBR0UoaGl0ZW0udXNhZ2UpKSB7Ci0JCQljYXNlIEhVUF9HRU5FUklDX0RFU0tUT1A6IHsKLQkJCSAgICB1bnNpZ25lZCB1c2FnZSA9IEhJRF9VU0FHRShoaXRlbS51c2FnZSk7Ci0JCQkgICAgaW50IGpveWF4ZSA9IHVzYWdlX3RvX2pveWF4ZSh1c2FnZSk7Ci0JCQkgICAgaWYgKGpveWF4ZSA+PSAwKSB7Ci0JCQkJbmF4ZSA9IGpveS0+aHdkYXRhLT5heGlzX21hcFtqb3lheGVdOwotCQkJCS8qIHNjYWxlYXhlICovCi0JCQkJdiA9IChTaW50MzIpaGlkX2dldF9kYXRhKFJFUF9CVUZfREFUQShyZXApLAotCQkJCQkJCSAmaGl0ZW0pOwotCQkJCXYgLT0gKGhpdGVtLmxvZ2ljYWxfbWF4aW11bSArIGhpdGVtLmxvZ2ljYWxfbWluaW11bSArIDEpLzI7Ci0JCQkJdiAqPSAzMjc2OC8oKGhpdGVtLmxvZ2ljYWxfbWF4aW11bSAtIGhpdGVtLmxvZ2ljYWxfbWluaW11bSArIDEpLzIpOwotCQkJCWlmICh2ICE9IGpveS0+YXhlc1tuYXhlXSkgewotCQkJCSAgICBTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3ksIG5heGUsIHYpOwotCQkJCX0KLQkJCSAgICB9IGVsc2UgaWYgKHVzYWdlID09IEhVR19IQVRfU1dJVENIKSB7Ci0JCQkJdiA9IChTaW50MzIpaGlkX2dldF9kYXRhKFJFUF9CVUZfREFUQShyZXApLAotCQkJCQkJCSAmaGl0ZW0pOwotCQkJCVNETF9Qcml2YXRlSm95c3RpY2tIYXQoam95LCAwLAotCQkJCQloYXR2YWxfdG9fc2RsKHYpLWhpdGVtLmxvZ2ljYWxfbWluaW11bSk7Ci0JCQkgICAgfQotCQkJICAgIGJyZWFrOwotCQkJfQotCQkJY2FzZSBIVVBfQlVUVE9OOgotCQkJCXYgPSAoU2ludDMyKWhpZF9nZXRfZGF0YShSRVBfQlVGX0RBVEEocmVwKSwKLQkJCQkgICAgJmhpdGVtKTsKLQkJCQlpZiAoam95LT5idXR0b25zW25idXR0b25dICE9IHYpIHsKLQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3ksCi0JCQkJCSAgICBuYnV0dG9uLCB2KTsKLQkJCQl9Ci0JCQkJbmJ1dHRvbisrOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaGlkX2VuZF9wYXJzZShoZGF0YSk7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNsb3NlIGEgam95c3RpY2sgYWZ0ZXIgdXNlICovCi12b2lkCi1TRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3kpCi17Ci0JaWYgKFNETF9zdHJuY21wKGpveS0+aHdkYXRhLT5wYXRoLCAiL2Rldi9qb3kiLCA4KSkJewotCQlyZXBvcnRfZnJlZSgmam95LT5od2RhdGEtPmlucmVwb3J0KTsKLQkJaGlkX2Rpc3Bvc2VfcmVwb3J0X2Rlc2Moam95LT5od2RhdGEtPnJlcGRlc2MpOwotCX0KLQljbG9zZShqb3ktPmh3ZGF0YS0+ZmQpOwotCVNETF9mcmVlKGpveS0+aHdkYXRhLT5wYXRoKTsKLQlTRExfZnJlZShqb3ktPmh3ZGF0YSk7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQKLVNETF9TWVNfSm95c3RpY2tRdWl0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0pPWVM7IGkrKykgewotCQlpZiAoam95bmFtZXNbaV0gIT0gTlVMTCkKLQkJCVNETF9mcmVlKGpveW5hbWVzW2ldKTsKLQkJaWYgKGpveWRldm5hbWVzW2ldICE9IE5VTEwpCi0JCQlTRExfZnJlZShqb3lkZXZuYW1lc1tpXSk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50Ci1yZXBvcnRfYWxsb2Moc3RydWN0IHJlcG9ydCAqciwgc3RydWN0IHJlcG9ydF9kZXNjICpyZCwgaW50IHJlcGluZCkKLXsKLQlpbnQgbGVuOwotCi0jaWZkZWYgX19EcmFnb25GbHlfXwotCWxlbiA9IGhpZF9yZXBvcnRfc2l6ZShyZCwgci0+cmlkLCByZXBpbmZvW3JlcGluZF0ua2luZCk7Ci0jZWxpZiBfX0ZSRUVCU0RfXwotIyBpZiAoX19GcmVlQlNEX3ZlcnNpb24gPj0gNDYwMDAwKQotIyAgaWYgKF9fRnJlZUJTRF92ZXJzaW9uIDw9IDUwMDExMSkKLQlsZW4gPSBoaWRfcmVwb3J0X3NpemUocmQsIHItPnJpZCwgcmVwaW5mb1tyZXBpbmRdLmtpbmQpOwotIyAgZWxzZQotCWxlbiA9IGhpZF9yZXBvcnRfc2l6ZShyZCwgcmVwaW5mb1tyZXBpbmRdLmtpbmQsIHItPnJpZCk7Ci0jICBlbmRpZgotIyBlbHNlCi0JbGVuID0gaGlkX3JlcG9ydF9zaXplKHJkLCByZXBpbmZvW3JlcGluZF0ua2luZCwgJnItPnJpZCk7Ci0jIGVuZGlmCi0jZWxzZQotIyBpZmRlZiBVU0JISURfTkVXCi0JbGVuID0gaGlkX3JlcG9ydF9zaXplKHJkLCByZXBpbmZvW3JlcGluZF0ua2luZCwgci0+cmlkKTsKLSMgZWxzZQotCWxlbiA9IGhpZF9yZXBvcnRfc2l6ZShyZCwgcmVwaW5mb1tyZXBpbmRdLmtpbmQsICZyLT5yaWQpOwotIyBlbmRpZgotI2VuZGlmCi0KLQlpZiAobGVuIDwgMCkgewotCQlTRExfU2V0RXJyb3IoIk5lZ2F0aXZlIEhJRCByZXBvcnQgc2l6ZSIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0Jci0+c2l6ZSA9IGxlbjsKLQotCWlmIChyLT5zaXplID4gMCkgewotCQlyLT5idWYgPSBTRExfbWFsbG9jKHNpemVvZigqci0+YnVmKSAtIHNpemVvZihSRVBfQlVGX0RBVEEocikpICsKLQkJICAgIHItPnNpemUpOwotCQlpZiAoci0+YnVmID09IE5VTEwpIHsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9IGVsc2UgewotCQlyLT5idWYgPSBOVUxMOwotCX0KLQotCXItPnN0YXR1cyA9IFNSRVBPUlRfQ0xFQU47Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlcG9ydF9mcmVlKHN0cnVjdCByZXBvcnQgKnIpCi17Ci0JaWYgKHItPmJ1ZiAhPSBOVUxMKSB7Ci0JCVNETF9mcmVlKHItPmJ1Zik7Ci0JfQotCXItPnN0YXR1cyA9IFNSRVBPUlRfVU5JTklUOwotfQotCi0jZW5kaWYgLyogU0RMX0pPWVNUSUNLX1VTQkhJRCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9kYXJ3aW4vU0RMX3N5c2pveXN0aWNrLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL2Rhcndpbi9TRExfc3lzam95c3RpY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkOTgzZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL2Rhcndpbi9TRExfc3lzam95c3RpY2suYworKysgL2Rldi9udWxsCkBAIC0xLDg0MSArMCwwIEBACi0vKgotCVNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0JVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0JTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0JdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0JVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0JYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLQlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotCUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0JWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLQlMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0JRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0JU2FtIExhbnRpbmdhCi0Jc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9KT1lTVElDS19JT0tJVAotCi0vKiBTREwgam95c3RpY2sgZHJpdmVyIGZvciBEYXJ3aW4gLyBNYWMgT1MgWCwgYmFzZWQgb24gdGhlIElPS2l0IEhJRCBBUEkgKi8KLS8qIFdyaXR0ZW4gMjAwMSBieSBNYXggSG9ybiAqLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXNleGl0cy5oPgotI2luY2x1ZGUgPG1hY2gvbWFjaC5oPgotI2luY2x1ZGUgPG1hY2gvbWFjaF9lcnJvci5oPgotI2luY2x1ZGUgPElPS2l0L0lPS2l0TGliLmg+Ci0jaW5jbHVkZSA8SU9LaXQvSU9DRlBsdWdJbi5oPgotI2lmZGVmIE1BQ09TXzEwXzBfNAotI2luY2x1ZGUgPElPS2l0L2hpZHN5c3RlbS9JT0hJRFVzYWdlVGFibGVzLmg+Ci0jZWxzZQotLyogVGhlIGhlYWRlciB3YXMgbW92ZWQgaGVyZSBpbiBNYWMgT1MgWCAxMC4xICovCi0jaW5jbHVkZSA8S2VybmVsL0lPS2l0L2hpZHN5c3RlbS9JT0hJRFVzYWdlVGFibGVzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxJT0tpdC9oaWQvSU9ISURMaWIuaD4KLSNpbmNsdWRlIDxJT0tpdC9oaWQvSU9ISURLZXlzLmg+Ci0jaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KLSNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+IC8qIGZvciBOZXdQdHJDbGVhciwgRGlzcG9zZVB0ciAqLwotCi0jaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2pveXN0aWNrX2MuaCIKLQotc3RydWN0IHJlY0VsZW1lbnQKLXsKLQlJT0hJREVsZW1lbnRDb29raWUgY29va2llOwkJCQkvKiB1bmlxdWUgdmFsdWUgd2hpY2ggaWRlbnRpZmllcyBlbGVtZW50LCB3aWxsIE5PVCBjaGFuZ2UgKi8KLQlsb25nIG1pbjsJCQkJCQkJCS8qIHJlcG9ydGVkIG1pbiB2YWx1ZSBwb3NzaWJsZSAqLwotCWxvbmcgbWF4OwkJCQkJCQkJLyogcmVwb3J0ZWQgbWF4IHZhbHVlIHBvc3NpYmxlICovCi0jaWYgMAotCS8qIFRPRE86IG1heWJlIHNob3VsZCBoYW5kbGUgdGhlIGZvbGxvd2luZyBzdHVmZiBzb21laG93PyAqLwotCi0JbG9uZyBzY2FsZWRNaW47CQkJCQkJCS8qIHJlcG9ydGVkIHNjYWxlZCBtaW4gdmFsdWUgcG9zc2libGUgKi8KLQlsb25nIHNjYWxlZE1heDsJCQkJCQkJLyogcmVwb3J0ZWQgc2NhbGVkIG1heCB2YWx1ZSBwb3NzaWJsZSAqLwotCWxvbmcgc2l6ZTsJCQkJCQkJCS8qIHNpemUgaW4gYml0cyBvZiBkYXRhIHJldHVybiBmcm9tIGVsZW1lbnQgKi8KLQlCb29sZWFuIHJlbGF0aXZlOwkJCQkJCS8qIGFyZSByZXBvcnRzIHJlbGF0aXZlIHRvIGxhc3QgcmVwb3J0IChkZWx0YXMpICovCi0JQm9vbGVhbiB3cmFwcGluZzsJCQkJCQkvKiBkb2VzIGVsZW1lbnQgd3JhcCBhcm91bmQgKG9uZSB2YWx1ZSBoaWdoZXIgdGhhbiBtYXggaXMgbWluKSAqLwotCUJvb2xlYW4gbm9uTGluZWFyOwkJCQkJCS8qIGFyZSB0aGUgdmFsdWVzIHJlcG9ydGVkIG5vbi1saW5lYXIgcmVsYXRpdmUgdG8gZWxlbWVudCBtb3ZlbWVudCAqLwotCUJvb2xlYW4gcHJlZmVycmVkU3RhdGU7CQkJCQkvKiBkb2VzIGVsZW1lbnQgaGF2ZSBhIHByZWZlcnJlZCBzdGF0ZSAoc3VjaCBhcyBhIGJ1dHRvbikgKi8KLQlCb29sZWFuIG51bGxTdGF0ZTsJCQkJCQkvKiBkb2VzIGVsZW1lbnQgaGF2ZSBudWxsIHN0YXRlICovCi0jZW5kaWYgLyogMCAqLwotCi0JLyogcnVudGltZSB2YXJpYWJsZXMgdXNlZCBmb3IgYXV0by1jYWxpYnJhdGlvbiAqLwotCWxvbmcgbWluUmVwb3J0OwkJCQkJCQkvKiBtaW4gcmV0dXJuZWQgdmFsdWUgKi8KLQlsb25nIG1heFJlcG9ydDsJCQkJCQkJLyogbWF4IHJldHVybmVkIHZhbHVlICovCi0JCi0Jc3RydWN0IHJlY0VsZW1lbnQgKiBwTmV4dDsJCQkJLyogbmV4dCBlbGVtZW50IGluIGxpc3QgKi8KLX07Ci10eXBlZGVmIHN0cnVjdCByZWNFbGVtZW50IHJlY0VsZW1lbnQ7Ci0KLXN0cnVjdCBqb3lzdGlja19od2RhdGEKLXsKLQlJT0hJRERldmljZUludGVyZmFjZSAqKiBpbnRlcmZhY2U7CQkvKiBpbnRlcmZhY2UgdG8gZGV2aWNlLCBOVUxMID0gbm8gaW50ZXJmYWNlICovCi0KLQljaGFyIHByb2R1Y3RbMjU2XTsJCQkJCQkJLyogbmFtZSBvZiBwcm9kdWN0ICovCi0JbG9uZyB1c2FnZTsJCQkJCQkJCS8qIHVzYWdlIHBhZ2UgZnJvbSBJT1VTQkhJRCBQYXJzZXIuaCB3aGljaCBkZWZpbmVzIGdlbmVyYWwgdXNhZ2UgKi8KLQlsb25nIHVzYWdlUGFnZTsJCQkJCQkJLyogdXNhZ2Ugd2l0aGluIGFib3ZlIHBhZ2UgZnJvbSBJT1VTQkhJRCBQYXJzZXIuaCB3aGljaCBkZWZpbmVzIHNwZWNpZmljIHVzYWdlICovCi0KLQlsb25nIGF4ZXM7CQkJCQkJCQkvKiBudW1iZXIgb2YgYXhpcyAoY2FsY3VsYXRlZCwgbm90IHJlcG9ydGVkIGJ5IGRldmljZSkgKi8KLQlsb25nIGJ1dHRvbnM7CQkJCQkJCS8qIG51bWJlciBvZiBidXR0b25zIChjYWxjdWxhdGVkLCBub3QgcmVwb3J0ZWQgYnkgZGV2aWNlKSAqLwotCWxvbmcgaGF0czsJCQkJCQkJCS8qIG51bWJlciBvZiBoYXQgc3dpdGNoZXMgKGNhbGN1bGF0ZWQsIG5vdCByZXBvcnRlZCBieSBkZXZpY2UpICovCi0JbG9uZyBlbGVtZW50czsJCQkJCQkJLyogbnVtYmVyIG9mIHRvdGFsIGVsZW1lbnRzIChzaG91bGRiZSB0b3RhbCBvZiBhYm92ZSkgKGNhbGN1bGF0ZWQsIG5vdCByZXBvcnRlZCBieSBkZXZpY2UpICovCi0KLQlyZWNFbGVtZW50KiBmaXJzdEF4aXM7Ci0JcmVjRWxlbWVudCogZmlyc3RCdXR0b247Ci0JcmVjRWxlbWVudCogZmlyc3RIYXQ7Ci0KLQlpbnQgcmVtb3ZlZDsKLQlpbnQgdW5jZW50ZXJlZDsKLQotCXN0cnVjdCBqb3lzdGlja19od2RhdGEqIHBOZXh0OwkJCS8qIG5leHQgZGV2aWNlICovCi19OwotdHlwZWRlZiBzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhIHJlY0RldmljZTsKLQotCi0vKiBMaW5rZWQgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGRldmljZXMgKi8KLXN0YXRpYyByZWNEZXZpY2UgKmdwRGV2aWNlTGlzdCA9IE5VTEw7Ci0KLQotc3RhdGljIHZvaWQgSElEUmVwb3J0RXJyb3JOdW0gKGNoYXIgKiBzdHJFcnJvciwgbG9uZyBudW1FcnJvcikKLXsKLQlTRExfU2V0RXJyb3Ioc3RyRXJyb3IpOwotfQotCi1zdGF0aWMgdm9pZCBISURHZXRDb2xsZWN0aW9uRWxlbWVudHMgKENGTXV0YWJsZURpY3Rpb25hcnlSZWYgZGV2aWNlUHJvcGVydGllcywgcmVjRGV2aWNlICpwRGV2aWNlKTsKLQotLyogcmV0dXJucyBjdXJyZW50IHZhbHVlIGZvciBlbGVtZW50LCBwb2xsaW5nIGVsZW1lbnQKLSAqIHdpbGwgcmV0dXJuIDAgb24gZXJyb3IgY29uZGl0aW9ucyB3aGljaCBzaG91bGQgYmUgYWNjb3VudGVkIGZvciBieSBhcHBsaWNhdGlvbgotICovCi0KLXN0YXRpYyBTSW50MzIgSElER2V0RWxlbWVudFZhbHVlIChyZWNEZXZpY2UgKnBEZXZpY2UsIHJlY0VsZW1lbnQgKnBFbGVtZW50KQotewotCUlPUmV0dXJuIHJlc3VsdCA9IGtJT1JldHVyblN1Y2Nlc3M7Ci0JSU9ISURFdmVudFN0cnVjdCBoaWRFdmVudDsKLQloaWRFdmVudC52YWx1ZSA9IDA7Ci0JCi0JaWYgKE5VTEwgIT0gcERldmljZSAmJiBOVUxMICE9IHBFbGVtZW50ICYmIE5VTEwgIT0gcERldmljZS0+aW50ZXJmYWNlKQotCXsKLQkJcmVzdWx0ID0gKCoocERldmljZS0+aW50ZXJmYWNlKSktPmdldEVsZW1lbnRWYWx1ZShwRGV2aWNlLT5pbnRlcmZhY2UsIHBFbGVtZW50LT5jb29raWUsICZoaWRFdmVudCk7Ci0JCWlmIChrSU9SZXR1cm5TdWNjZXNzID09IHJlc3VsdCkKLQkJewotCQkJLyogcmVjb3JkIG1pbiBhbmQgbWF4IGZvciBhdXRvIGNhbGlicmF0aW9uICovCi0JCQlpZiAoaGlkRXZlbnQudmFsdWUgPCBwRWxlbWVudC0+bWluUmVwb3J0KQotCQkJCXBFbGVtZW50LT5taW5SZXBvcnQgPSBoaWRFdmVudC52YWx1ZTsKLQkJCWlmIChoaWRFdmVudC52YWx1ZSA+IHBFbGVtZW50LT5tYXhSZXBvcnQpCi0JCQkJcEVsZW1lbnQtPm1heFJlcG9ydCA9IGhpZEV2ZW50LnZhbHVlOwotCQl9Ci0JfQotCi0JLyogYXV0byB1c2VyIHNjYWxlICovCi0JcmV0dXJuIGhpZEV2ZW50LnZhbHVlOwotfQotCi1zdGF0aWMgU0ludDMyIEhJRFNjYWxlZENhbGlicmF0ZWRWYWx1ZSAocmVjRGV2aWNlICpwRGV2aWNlLCByZWNFbGVtZW50ICpwRWxlbWVudCwgbG9uZyBtaW4sIGxvbmcgbWF4KQotewotCWZsb2F0IGRldmljZVNjYWxlID0gbWF4IC0gbWluOwotCWZsb2F0IHJlYWRTY2FsZSA9IHBFbGVtZW50LT5tYXhSZXBvcnQgLSBwRWxlbWVudC0+bWluUmVwb3J0OwotCVNJbnQzMiB2YWx1ZSA9IEhJREdldEVsZW1lbnRWYWx1ZShwRGV2aWNlLCBwRWxlbWVudCk7Ci0JaWYgKHJlYWRTY2FsZSA9PSAwKQotCQlyZXR1cm4gdmFsdWU7IC8qIG5vIHNjYWxpbmcgYXQgYWxsICovCi0JZWxzZQotCQlyZXR1cm4gKCh2YWx1ZSAtIHBFbGVtZW50LT5taW5SZXBvcnQpICogZGV2aWNlU2NhbGUgLyByZWFkU2NhbGUpICsgbWluOwotfQotCi0KLXN0YXRpYyB2b2lkIEhJRFJlbW92YWxDYWxsYmFjayh2b2lkICogdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPUmV0dXJuIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogcmVmY29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBzZW5kZXIpCi17Ci0JcmVjRGV2aWNlICpkZXZpY2UgPSAocmVjRGV2aWNlICopIHJlZmNvbjsKLQlkZXZpY2UtPnJlbW92ZWQgPSAxOwotCWRldmljZS0+dW5jZW50ZXJlZCA9IDE7Ci19Ci0KLQotCi0vKiBDcmVhdGUgYW5kIG9wZW4gYW4gaW50ZXJmYWNlIHRvIGRldmljZSwgcmVxdWlyZWQgcHJpb3IgdG8gZXh0cmFjdGluZyB2YWx1ZXMgb3IgYnVpbGRpbmcgcXVldWVzLgotICogTm90ZTogYXBwbGljdGlvbiBub3cgb3ducyB0aGUgZGV2aWNlIGFuZCBtdXN0IGNsb3NlIGFuZCByZWxlYXNlIGl0IHByaW9yIHRvIGV4aXRpbmcKLSAqLwotCi1zdGF0aWMgSU9SZXR1cm4gSElEQ3JlYXRlT3BlbkRldmljZUludGVyZmFjZSAoaW9fb2JqZWN0X3QgaGlkRGV2aWNlLCByZWNEZXZpY2UgKnBEZXZpY2UpCi17Ci0JSU9SZXR1cm4gcmVzdWx0ID0ga0lPUmV0dXJuU3VjY2VzczsKLQlIUkVTVUxUIHBsdWdJblJlc3VsdCA9IFNfT0s7Ci0JU0ludDMyIHNjb3JlID0gMDsKLQlJT0NGUGx1Z0luSW50ZXJmYWNlICoqIHBwUGx1Z0luSW50ZXJmYWNlID0gTlVMTDsKLQkKLQlpZiAoTlVMTCA9PSBwRGV2aWNlLT5pbnRlcmZhY2UpCi0JewotCQlyZXN1bHQgPSBJT0NyZWF0ZVBsdWdJbkludGVyZmFjZUZvclNlcnZpY2UgKGhpZERldmljZSwga0lPSElERGV2aWNlVXNlckNsaWVudFR5cGVJRCwKLQkJCQkJCQkJCQkJCQlrSU9DRlBsdWdJbkludGVyZmFjZUlELCAmcHBQbHVnSW5JbnRlcmZhY2UsICZzY29yZSk7Ci0JCWlmIChrSU9SZXR1cm5TdWNjZXNzID09IHJlc3VsdCkKLQkJewotCQkJLyogQ2FsbCBhIG1ldGhvZCBvZiB0aGUgaW50ZXJtZWRpYXRlIHBsdWctaW4gdG8gY3JlYXRlIHRoZSBkZXZpY2UgaW50ZXJmYWNlICovCi0JCQlwbHVnSW5SZXN1bHQgPSAoKnBwUGx1Z0luSW50ZXJmYWNlKS0+UXVlcnlJbnRlcmZhY2UgKHBwUGx1Z0luSW50ZXJmYWNlLAotCQkJCQkJCQlDRlVVSURHZXRVVUlEQnl0ZXMgKGtJT0hJRERldmljZUludGVyZmFjZUlEKSwgKHZvaWQgKikgJihwRGV2aWNlLT5pbnRlcmZhY2UpKTsKLQkJCWlmIChTX09LICE9IHBsdWdJblJlc3VsdCkKLQkJCQlISURSZXBvcnRFcnJvck51bSAoIkNvdWxkbtV0IHF1ZXJ5IEhJRCBjbGFzcyBkZXZpY2UgaW50ZXJmYWNlIGZyb20gcGx1Z0luSW50ZXJmYWNlIiwgcGx1Z0luUmVzdWx0KTsKLQkJCSgqcHBQbHVnSW5JbnRlcmZhY2UpLT5SZWxlYXNlIChwcFBsdWdJbkludGVyZmFjZSk7Ci0JCX0KLQkJZWxzZQotCQkJSElEUmVwb3J0RXJyb3JOdW0gKCJGYWlsZWQgdG8gY3JlYXRlICoqcGx1Z0luSW50ZXJmYWNlIHZpYSBJT0NyZWF0ZVBsdWdJbkludGVyZmFjZUZvclNlcnZpY2UuIiwgcmVzdWx0KTsKLQl9Ci0JaWYgKE5VTEwgIT0gcERldmljZS0+aW50ZXJmYWNlKQotCXsKLQkJcmVzdWx0ID0gKCoocERldmljZS0+aW50ZXJmYWNlKSktPm9wZW4gKHBEZXZpY2UtPmludGVyZmFjZSwgMCk7Ci0JCWlmIChrSU9SZXR1cm5TdWNjZXNzICE9IHJlc3VsdCkKLQkJCUhJRFJlcG9ydEVycm9yTnVtICgiRmFpbGVkIHRvIG9wZW4gcERldmljZS0+aW50ZXJmYWNlIHZpYSBvcGVuLiIsIHJlc3VsdCk7Ci0JCWVsc2UKLQkJCSgqKHBEZXZpY2UtPmludGVyZmFjZSkpLT5zZXRSZW1vdmFsQ2FsbGJhY2sgKHBEZXZpY2UtPmludGVyZmFjZSwgSElEUmVtb3ZhbENhbGxiYWNrLCBwRGV2aWNlLCBwRGV2aWNlKTsKLQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKiBDbG9zZXMgYW5kIHJlbGVhc2VzIGludGVyZmFjZSB0byBkZXZpY2UsIHNob3VsZCBiZSBkb25lIHByaW9yIHRvIGV4dGluZyBhcHBsaWNhdGlvbgotICogTm90ZTogd2lsbCBoYXZlIG5vIGFmZmVjdCBpZiBkZXZpY2Ugb3IgaW50ZXJmYWNlIGRvIG5vdCBleGlzdAotICogYXBwbGljYXRpb24gd2lsbCAib3duIiB0aGUgZGV2aWNlIGlmIGludGVyZmFjZSBpcyBub3QgY2xvc2VkCi0gKiAoZGV2aWNlIG1heSBoYXZlIHRvIGJlIHBsdWcgYW5kIHJlLXBsdWdnZWQgaW4gZGlmZmVyZW50IGxvY2F0aW9uIHRvIGdldCBpdCB3b3JraW5nIGFnYWluIHdpdGhvdXQgYSByZXN0YXJ0KQotICovCi0KLXN0YXRpYyBJT1JldHVybiBISURDbG9zZVJlbGVhc2VJbnRlcmZhY2UgKHJlY0RldmljZSAqcERldmljZSkKLXsKLQlJT1JldHVybiByZXN1bHQgPSBrSU9SZXR1cm5TdWNjZXNzOwotCQotCWlmICgoTlVMTCAhPSBwRGV2aWNlKSAmJiAoTlVMTCAhPSBwRGV2aWNlLT5pbnRlcmZhY2UpKQotCXsKLQkJLyogY2xvc2UgdGhlIGludGVyZmFjZSAqLwotCQlyZXN1bHQgPSAoKihwRGV2aWNlLT5pbnRlcmZhY2UpKS0+Y2xvc2UgKHBEZXZpY2UtPmludGVyZmFjZSk7Ci0JCWlmIChrSU9SZXR1cm5Ob3RPcGVuID09IHJlc3VsdCkKLQkJewotCQkJLyogZG8gbm90aGluZyBhcyBkZXZpY2Ugd2FzIG5vdCBvcGVuZWQsIHRodXMgY2FuJ3QgYmUgY2xvc2VkICovCi0JCX0KLQkJZWxzZSBpZiAoa0lPUmV0dXJuU3VjY2VzcyAhPSByZXN1bHQpCi0JCQlISURSZXBvcnRFcnJvck51bSAoIkZhaWxlZCB0byBjbG9zZSBJT0hJRERldmljZUludGVyZmFjZS4iLCByZXN1bHQpOwotCQkvKiByZWxlYXNlIHRoZSBpbnRlcmZhY2UgKi8KLQkJcmVzdWx0ID0gKCoocERldmljZS0+aW50ZXJmYWNlKSktPlJlbGVhc2UgKHBEZXZpY2UtPmludGVyZmFjZSk7Ci0JCWlmIChrSU9SZXR1cm5TdWNjZXNzICE9IHJlc3VsdCkKLQkJCUhJRFJlcG9ydEVycm9yTnVtICgiRmFpbGVkIHRvIHJlbGVhc2UgSU9ISUREZXZpY2VJbnRlcmZhY2UuIiwgcmVzdWx0KTsKLQkJcERldmljZS0+aW50ZXJmYWNlID0gTlVMTDsKLQl9CQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGV4dHJhY3RzIGFjdHVhbCBzcGVjaWZpYyBlbGVtZW50IGluZm9ybWF0aW9uIGZyb20gZWFjaCBlbGVtZW50IENGIGRpY3Rpb25hcnkgZW50cnkgKi8KLQotc3RhdGljIHZvaWQgSElER2V0RWxlbWVudEluZm8gKENGVHlwZVJlZiByZWZFbGVtZW50LCByZWNFbGVtZW50ICpwRWxlbWVudCkKLXsKLQlsb25nIG51bWJlcjsKLQlDRlR5cGVSZWYgcmVmVHlwZTsKLQotCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudENvb2tpZUtleSkpOwotCWlmIChyZWZUeXBlICYmIENGTnVtYmVyR2V0VmFsdWUgKHJlZlR5cGUsIGtDRk51bWJlckxvbmdUeXBlLCAmbnVtYmVyKSkKLQkJcEVsZW1lbnQtPmNvb2tpZSA9IChJT0hJREVsZW1lbnRDb29raWUpIG51bWJlcjsKLQlyZWZUeXBlID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHJlZkVsZW1lbnQsIENGU1RSKGtJT0hJREVsZW1lbnRNaW5LZXkpKTsKLQlpZiAocmVmVHlwZSAmJiBDRk51bWJlckdldFZhbHVlIChyZWZUeXBlLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJm51bWJlcikpCi0JCXBFbGVtZW50LT5taW5SZXBvcnQgPSBwRWxlbWVudC0+bWluID0gbnVtYmVyOwotCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudE1heEtleSkpOwotCWlmIChyZWZUeXBlICYmIENGTnVtYmVyR2V0VmFsdWUgKHJlZlR5cGUsIGtDRk51bWJlckxvbmdUeXBlLCAmbnVtYmVyKSkKLQkJcEVsZW1lbnQtPm1heFJlcG9ydCA9IHBFbGVtZW50LT5tYXggPSBudW1iZXI7Ci0vKgotCVRPRE86IG1heWJlIHNob3VsZCBoYW5kbGUgdGhlIGZvbGxvd2luZyBzdHVmZiBzb21laG93PwotCi0JcmVmVHlwZSA9IENGRGljdGlvbmFyeUdldFZhbHVlIChyZWZFbGVtZW50LCBDRlNUUihrSU9ISURFbGVtZW50U2NhbGVkTWluS2V5KSk7Ci0JaWYgKHJlZlR5cGUgJiYgQ0ZOdW1iZXJHZXRWYWx1ZSAocmVmVHlwZSwga0NGTnVtYmVyTG9uZ1R5cGUsICZudW1iZXIpKQotCQlwRWxlbWVudC0+c2NhbGVkTWluID0gbnVtYmVyOwotCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudFNjYWxlZE1heEtleSkpOwotCWlmIChyZWZUeXBlICYmIENGTnVtYmVyR2V0VmFsdWUgKHJlZlR5cGUsIGtDRk51bWJlckxvbmdUeXBlLCAmbnVtYmVyKSkKLQkJcEVsZW1lbnQtPnNjYWxlZE1heCA9IG51bWJlcjsKLQlyZWZUeXBlID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHJlZkVsZW1lbnQsIENGU1RSKGtJT0hJREVsZW1lbnRTaXplS2V5KSk7Ci0JaWYgKHJlZlR5cGUgJiYgQ0ZOdW1iZXJHZXRWYWx1ZSAocmVmVHlwZSwga0NGTnVtYmVyTG9uZ1R5cGUsICZudW1iZXIpKQotCQlwRWxlbWVudC0+c2l6ZSA9IG51bWJlcjsKLQlyZWZUeXBlID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHJlZkVsZW1lbnQsIENGU1RSKGtJT0hJREVsZW1lbnRJc1JlbGF0aXZlS2V5KSk7Ci0JaWYgKHJlZlR5cGUpCi0JCXBFbGVtZW50LT5yZWxhdGl2ZSA9IENGQm9vbGVhbkdldFZhbHVlIChyZWZUeXBlKTsKLQlyZWZUeXBlID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHJlZkVsZW1lbnQsIENGU1RSKGtJT0hJREVsZW1lbnRJc1dyYXBwaW5nS2V5KSk7Ci0JaWYgKHJlZlR5cGUpCi0JCXBFbGVtZW50LT53cmFwcGluZyA9IENGQm9vbGVhbkdldFZhbHVlIChyZWZUeXBlKTsKLQlyZWZUeXBlID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHJlZkVsZW1lbnQsIENGU1RSKGtJT0hJREVsZW1lbnRJc05vbkxpbmVhcktleSkpOwotCWlmIChyZWZUeXBlKQotCQlwRWxlbWVudC0+bm9uTGluZWFyID0gQ0ZCb29sZWFuR2V0VmFsdWUgKHJlZlR5cGUpOwotCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudEhhc1ByZWZlcmVkU3RhdGVLZXkpKTsKLQlpZiAocmVmVHlwZSkKLQkJcEVsZW1lbnQtPnByZWZlcnJlZFN0YXRlID0gQ0ZCb29sZWFuR2V0VmFsdWUgKHJlZlR5cGUpOwotCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudEhhc051bGxTdGF0ZUtleSkpOwotCWlmIChyZWZUeXBlKQotCQlwRWxlbWVudC0+bnVsbFN0YXRlID0gQ0ZCb29sZWFuR2V0VmFsdWUgKHJlZlR5cGUpOwotKi8KLX0JCQkKLQotLyogZXhhbWluZXMgQ0YgZGljdGlvbmFyeSB2bGF1ZSBpbiBkZXZpY2UgZWxlbWVudCBoaWVyYXJjaHkgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGVsZW1lbnQgb2YgaW50ZXJlc3Qgb3IgYSBjb2xsZWN0aW9uIG9mIG1vcmUgZWxlbWVudHMKLSAqIGlmIGVsZW1lbnQgb2YgaW50ZXJlc3QgYWxsb2NhdGUgc3RvcmFnZSwgYWRkIHRvIGxpc3QgYW5kIHJldHJpZXZlIGVsZW1lbnQgc3BlY2lmaWMgaW5mbwotICogaWYgY29sbGVjdGlvbiB0aGVuIHBhc3Mgb24gdG8gZGVjb25zdHJ1Y3Rpb24gY29sbGVjdGlvbiBpbnRvIGFkZGl0aW9uYWwgaW5kaXZpZHVhbCBlbGVtZW50cwotICovCi0KLXN0YXRpYyB2b2lkIEhJREFkZEVsZW1lbnQgKENGVHlwZVJlZiByZWZFbGVtZW50LCByZWNEZXZpY2UqIHBEZXZpY2UpCi17Ci0JcmVjRWxlbWVudCogZWxlbWVudCA9IE5VTEw7Ci0JcmVjRWxlbWVudCoqIGhlYWRFbGVtZW50ID0gTlVMTDsKLQlsb25nIGVsZW1lbnRUeXBlLCB1c2FnZVBhZ2UsIHVzYWdlOwotCUNGVHlwZVJlZiByZWZFbGVtZW50VHlwZSA9IENGRGljdGlvbmFyeUdldFZhbHVlIChyZWZFbGVtZW50LCBDRlNUUihrSU9ISURFbGVtZW50VHlwZUtleSkpOwotCUNGVHlwZVJlZiByZWZVc2FnZVBhZ2UgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudFVzYWdlUGFnZUtleSkpOwotCUNGVHlwZVJlZiByZWZVc2FnZSA9IENGRGljdGlvbmFyeUdldFZhbHVlIChyZWZFbGVtZW50LCBDRlNUUihrSU9ISURFbGVtZW50VXNhZ2VLZXkpKTsKLQotCi0JaWYgKChyZWZFbGVtZW50VHlwZSkgJiYgKENGTnVtYmVyR2V0VmFsdWUgKHJlZkVsZW1lbnRUeXBlLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJmVsZW1lbnRUeXBlKSkpCi0JewotCQkvKiBsb29rIGF0IHR5cGVzIG9mIGludGVyZXN0ICovCi0JCWlmICgoZWxlbWVudFR5cGUgPT0ga0lPSElERWxlbWVudFR5cGVJbnB1dF9NaXNjKSB8fCAoZWxlbWVudFR5cGUgPT0ga0lPSElERWxlbWVudFR5cGVJbnB1dF9CdXR0b24pIHx8Ci0JCQkoZWxlbWVudFR5cGUgPT0ga0lPSElERWxlbWVudFR5cGVJbnB1dF9BeGlzKSkKLQkJewotCQkJaWYgKHJlZlVzYWdlUGFnZSAmJiBDRk51bWJlckdldFZhbHVlIChyZWZVc2FnZVBhZ2UsIGtDRk51bWJlckxvbmdUeXBlLCAmdXNhZ2VQYWdlKSAmJgotCQkJCXJlZlVzYWdlICYmIENGTnVtYmVyR2V0VmFsdWUgKHJlZlVzYWdlLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJnVzYWdlKSkKLQkJCXsKLQkJCQlzd2l0Y2ggKHVzYWdlUGFnZSkgLyogb25seSBpbnRlcmVzdGVkIGluIGtISURQYWdlX0dlbmVyaWNEZXNrdG9wIGFuZCBrSElEUGFnZV9CdXR0b24gKi8KLQkJCQl7Ci0JCQkJCWNhc2Uga0hJRFBhZ2VfR2VuZXJpY0Rlc2t0b3A6Ci0JCQkJCQl7Ci0JCQkJCQkJc3dpdGNoICh1c2FnZSkgLyogbG9vayBhdCB1c2FnZSB0byBkZXRlcm1pbmUgZnVuY3Rpb24gKi8KLQkJCQkJCQl7Ci0JCQkJCQkJCWNhc2Uga0hJRFVzYWdlX0dEX1g6Ci0JCQkJCQkJCWNhc2Uga0hJRFVzYWdlX0dEX1k6Ci0JCQkJCQkJCWNhc2Uga0hJRFVzYWdlX0dEX1o6Ci0JCQkJCQkJCWNhc2Uga0hJRFVzYWdlX0dEX1J4OgotCQkJCQkJCQljYXNlIGtISURVc2FnZV9HRF9SeToKLQkJCQkJCQkJY2FzZSBrSElEVXNhZ2VfR0RfUno6Ci0JCQkJCQkJCWNhc2Uga0hJRFVzYWdlX0dEX1NsaWRlcjoKLQkJCQkJCQkJY2FzZSBrSElEVXNhZ2VfR0RfRGlhbDoKLQkJCQkJCQkJY2FzZSBrSElEVXNhZ2VfR0RfV2hlZWw6Ci0JCQkJCQkJCQllbGVtZW50ID0gKHJlY0VsZW1lbnQgKikgTmV3UHRyQ2xlYXIgKHNpemVvZiAocmVjRWxlbWVudCkpOwotCQkJCQkJCQkJaWYgKGVsZW1lbnQpCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJcERldmljZS0+YXhlcysrOwotCQkJCQkJCQkJCWhlYWRFbGVtZW50ID0gJihwRGV2aWNlLT5maXJzdEF4aXMpOwotCQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSBrSElEVXNhZ2VfR0RfSGF0c3dpdGNoOgotCQkJCQkJCQkJZWxlbWVudCA9IChyZWNFbGVtZW50ICopIE5ld1B0ckNsZWFyIChzaXplb2YgKHJlY0VsZW1lbnQpKTsKLQkJCQkJCQkJCWlmIChlbGVtZW50KQotCQkJCQkJCQkJewotCQkJCQkJCQkJCXBEZXZpY2UtPmhhdHMrKzsKLQkJCQkJCQkJCQloZWFkRWxlbWVudCA9ICYocERldmljZS0+Zmlyc3RIYXQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2Uga0hJRFBhZ2VfQnV0dG9uOgotCQkJCQkJZWxlbWVudCA9IChyZWNFbGVtZW50ICopIE5ld1B0ckNsZWFyIChzaXplb2YgKHJlY0VsZW1lbnQpKTsKLQkJCQkJCWlmIChlbGVtZW50KQotCQkJCQkJewotCQkJCQkJCXBEZXZpY2UtPmJ1dHRvbnMrKzsKLQkJCQkJCQloZWFkRWxlbWVudCA9ICYocERldmljZS0+Zmlyc3RCdXR0b24pOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoa0lPSElERWxlbWVudFR5cGVDb2xsZWN0aW9uID09IGVsZW1lbnRUeXBlKQotCQkJSElER2V0Q29sbGVjdGlvbkVsZW1lbnRzICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZikgcmVmRWxlbWVudCwgcERldmljZSk7Ci0JfQotCi0JaWYgKGVsZW1lbnQgJiYgaGVhZEVsZW1lbnQpIC8qIGFkZCB0byBsaXN0ICovCi0JewotCQlwRGV2aWNlLT5lbGVtZW50cysrOwotCQlpZiAoTlVMTCA9PSAqaGVhZEVsZW1lbnQpCi0JCQkqaGVhZEVsZW1lbnQgPSBlbGVtZW50OwotCQllbHNlCi0JCXsKLQkJCXJlY0VsZW1lbnQgKmVsZW1lbnRQcmV2aW91cywgKmVsZW1lbnRDdXJyZW50OwotCQkJZWxlbWVudEN1cnJlbnQgPSAqaGVhZEVsZW1lbnQ7Ci0JCQl3aGlsZSAoZWxlbWVudEN1cnJlbnQpCi0JCQl7Ci0JCQkJZWxlbWVudFByZXZpb3VzID0gZWxlbWVudEN1cnJlbnQ7Ci0JCQkJZWxlbWVudEN1cnJlbnQgPSBlbGVtZW50UHJldmlvdXMtPnBOZXh0OwotCQkJfQotCQkJZWxlbWVudFByZXZpb3VzLT5wTmV4dCA9IGVsZW1lbnQ7Ci0JCX0KLQkJZWxlbWVudC0+cE5leHQgPSBOVUxMOwotCQlISURHZXRFbGVtZW50SW5mbyAocmVmRWxlbWVudCwgZWxlbWVudCk7Ci0JfQotfQotCi0vKiBjb2xsZWN0cyBpbmZvcm1hdGlvbiBmcm9tIGVhY2ggYXJyYXkgbWVtYmVyIGluIGRldmljZSBlbGVtZW50IGxpc3QgKGVhY2ggYXJyYXkgbWVtZWJlciA9IGVsZW1lbnQpICovCi0KLXN0YXRpYyB2b2lkIEhJREdldEVsZW1lbnRzQ0ZBcnJheUhhbmRsZXIgKGNvbnN0IHZvaWQgKiB2YWx1ZSwgdm9pZCAqIHBhcmFtZXRlcikKLXsKLQlpZiAoQ0ZHZXRUeXBlSUQgKHZhbHVlKSA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQgKCkpCi0JCUhJREFkZEVsZW1lbnQgKChDRlR5cGVSZWYpIHZhbHVlLCAocmVjRGV2aWNlICopIHBhcmFtZXRlcik7Ci19Ci0KLS8qIGhhbmRsZXMgcmV0cmlldmFsIG9mIGVsZW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhcnJheXMgb2YgZWxlbWVudHMgaW4gZGV2aWNlIElPIHJlZ2lzdHJ5IGluZm9ybWF0aW9uICovCi0KLXN0YXRpYyB2b2lkIEhJREdldEVsZW1lbnRzIChDRlR5cGVSZWYgcmVmRWxlbWVudEN1cnJlbnQsIHJlY0RldmljZSAqcERldmljZSkKLXsKLQlDRlR5cGVJRCB0eXBlID0gQ0ZHZXRUeXBlSUQgKHJlZkVsZW1lbnRDdXJyZW50KTsKLQlpZiAodHlwZSA9PSBDRkFycmF5R2V0VHlwZUlEKCkpIC8qIGlmIGVsZW1lbnQgaXMgYW4gYXJyYXkgKi8KLQl7Ci0JCUNGUmFuZ2UgcmFuZ2UgPSB7MCwgQ0ZBcnJheUdldENvdW50IChyZWZFbGVtZW50Q3VycmVudCl9OwotCQkvKiBDb3VudEVsZW1lbnRzQ0ZBcnJheUhhbmRsZXIgY2FsbGVkIGZvciBlYWNoIGFycmF5IG1lbWJlciAqLwotCQlDRkFycmF5QXBwbHlGdW5jdGlvbiAocmVmRWxlbWVudEN1cnJlbnQsIHJhbmdlLCBISURHZXRFbGVtZW50c0NGQXJyYXlIYW5kbGVyLCBwRGV2aWNlKTsKLQl9Ci19CQkJCi0KLS8qIGhhbmRsZXMgZXh0cmFjdGluZyBlbGVtZW50IGluZm9ybWF0aW9uIGZyb20gZWxlbWVudCBjb2xsZWN0aW9uIENGIHR5cGVzCi0gKiB1c2VkIGZyb20gdG9wIGxldmVsIGVsZW1lbnQgZGVjb2RpbmcgYW5kIGhpZXJhcmNoeSBkZWNvbnN0cnVjdGlvbiB0byBmbGF0dGVuIGRldmljZSBlbGVtZW50IGxpc3QKLSAqLwotCi1zdGF0aWMgdm9pZCBISURHZXRDb2xsZWN0aW9uRWxlbWVudHMgKENGTXV0YWJsZURpY3Rpb25hcnlSZWYgZGV2aWNlUHJvcGVydGllcywgcmVjRGV2aWNlICpwRGV2aWNlKQotewotCUNGVHlwZVJlZiByZWZFbGVtZW50VG9wID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKGRldmljZVByb3BlcnRpZXMsIENGU1RSKGtJT0hJREVsZW1lbnRLZXkpKTsKLQlpZiAocmVmRWxlbWVudFRvcCkKLQkJSElER2V0RWxlbWVudHMgKHJlZkVsZW1lbnRUb3AsIHBEZXZpY2UpOwotfQotCi0vKiB1c2UgdG9wIGxldmVsIGVsZW1lbnQgdXNhZ2UgcGFnZSBhbmQgdXNhZ2UgdG8gZGlzY2VybiBkZXZpY2UgdXNhZ2UgcGFnZSBhbmQgdXNhZ2Ugc2V0dGluZyBhcHByb3ByaWF0ZSB2bGF1ZXMgaW4gZGV2aWNlIHJlY29yZCAqLwotCi1zdGF0aWMgdm9pZCBISURUb3BMZXZlbEVsZW1lbnRIYW5kbGVyIChjb25zdCB2b2lkICogdmFsdWUsIHZvaWQgKiBwYXJhbWV0ZXIpCi17Ci0JQ0ZUeXBlUmVmIHJlZkNGID0gMDsKLQlpZiAoQ0ZHZXRUeXBlSUQgKHZhbHVlKSAhPSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQgKCkpCi0JCXJldHVybjsKLQlyZWZDRiA9IENGRGljdGlvbmFyeUdldFZhbHVlICh2YWx1ZSwgQ0ZTVFIoa0lPSElERWxlbWVudFVzYWdlUGFnZUtleSkpOwotCWlmICghQ0ZOdW1iZXJHZXRWYWx1ZSAocmVmQ0YsIGtDRk51bWJlckxvbmdUeXBlLCAmKChyZWNEZXZpY2UgKikgcGFyYW1ldGVyKS0+dXNhZ2VQYWdlKSkKLQkJU0RMX1NldEVycm9yICgiQ0ZOdW1iZXJHZXRWYWx1ZSBlcnJvciByZXRyaWV2aW5nIHBEZXZpY2UtPnVzYWdlUGFnZS4iKTsKLQlyZWZDRiA9IENGRGljdGlvbmFyeUdldFZhbHVlICh2YWx1ZSwgQ0ZTVFIoa0lPSElERWxlbWVudFVzYWdlS2V5KSk7Ci0JaWYgKCFDRk51bWJlckdldFZhbHVlIChyZWZDRiwga0NGTnVtYmVyTG9uZ1R5cGUsICYoKHJlY0RldmljZSAqKSBwYXJhbWV0ZXIpLT51c2FnZSkpCi0JCVNETF9TZXRFcnJvciAoIkNGTnVtYmVyR2V0VmFsdWUgZXJyb3IgcmV0cmlldmluZyBwRGV2aWNlLT51c2FnZS4iKTsKLX0KLQotLyogZXh0cmFjdHMgZGV2aWNlIGluZm8gZnJvbSBDRiBkaWN0aW9uYXJ5IHJlY29yZHMgaW4gSU8gcmVnaXN0cnkgKi8KLQotc3RhdGljIHZvaWQgSElER2V0RGV2aWNlSW5mbyAoaW9fb2JqZWN0X3QgaGlkRGV2aWNlLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGhpZFByb3BlcnRpZXMsIHJlY0RldmljZSAqcERldmljZSkKLXsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIHVzYlByb3BlcnRpZXMgPSAwOwotCWlvX3JlZ2lzdHJ5X2VudHJ5X3QgcGFyZW50MSwgcGFyZW50MjsKLQkKLQkvKiBNYWMgT1MgWCBjdXJyZW50bHkgaXMgbm90IG1pcnJvcmluZyBhbGwgVVNCIHByb3BlcnRpZXMgdG8gSElEIHBhZ2Ugc28gbmVlZCB0byBsb29rIGF0IFVTQiBkZXZpY2UgcGFnZSBhbHNvCi0JICogZ2V0IGRpY3Rpb25hcnkgZm9yIHVzYiBwcm9wZXJ0aWVzOiBzdGVwIHVwIHR3byBsZXZlbHMgYW5kIGdldCBDRiBkaWN0aW9uYXJ5IGZvciBVU0IgcHJvcGVydGllcwotCSAqLwotCWlmICgoS0VSTl9TVUNDRVNTID09IElPUmVnaXN0cnlFbnRyeUdldFBhcmVudEVudHJ5IChoaWREZXZpY2UsIGtJT1NlcnZpY2VQbGFuZSwgJnBhcmVudDEpKSAmJgotCQkoS0VSTl9TVUNDRVNTID09IElPUmVnaXN0cnlFbnRyeUdldFBhcmVudEVudHJ5IChwYXJlbnQxLCBrSU9TZXJ2aWNlUGxhbmUsICZwYXJlbnQyKSkgJiYKLQkJKEtFUk5fU1VDQ0VTUyA9PSBJT1JlZ2lzdHJ5RW50cnlDcmVhdGVDRlByb3BlcnRpZXMgKHBhcmVudDIsICZ1c2JQcm9wZXJ0aWVzLCBrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrTmlsT3B0aW9ucykpKQotCXsKLQkJaWYgKHVzYlByb3BlcnRpZXMpCi0JCXsKLQkJCUNGVHlwZVJlZiByZWZDRiA9IDA7Ci0JCQkvKiBnZXQgZGV2aWNlIGluZm8KLQkJCSAqIHRyeSBoaWQgZGljdGlvbmFyeSBmaXJzdCwgaWYgZmFpbCB0aGVuIGdvIHRvIHVzYiBkaWN0aW9uYXJ5Ci0JCQkgKi8KLQkJCQotCQkJCi0JCQkvKiBnZXQgcHJvZHVjdCBuYW1lICovCi0JCQlyZWZDRiA9IENGRGljdGlvbmFyeUdldFZhbHVlIChoaWRQcm9wZXJ0aWVzLCBDRlNUUihrSU9ISURQcm9kdWN0S2V5KSk7Ci0JCQlpZiAoIXJlZkNGKQotCQkJCXJlZkNGID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHVzYlByb3BlcnRpZXMsIENGU1RSKCJVU0IgUHJvZHVjdCBOYW1lIikpOwotCQkJaWYgKHJlZkNGKQotCQkJewotCQkJCWlmICghQ0ZTdHJpbmdHZXRDU3RyaW5nIChyZWZDRiwgcERldmljZS0+cHJvZHVjdCwgMjU2LCBDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nICgpKSkKLQkJCQkJU0RMX1NldEVycm9yICgiQ0ZTdHJpbmdHZXRDU3RyaW5nIGVycm9yIHJldHJpZXZpbmcgcERldmljZS0+cHJvZHVjdC4iKTsKLQkJCX0KLQkJCQotCQkJLyogZ2V0IHVzYWdlIHBhZ2UgYW5kIHVzYWdlICovCi0JCQlyZWZDRiA9IENGRGljdGlvbmFyeUdldFZhbHVlIChoaWRQcm9wZXJ0aWVzLCBDRlNUUihrSU9ISURQcmltYXJ5VXNhZ2VQYWdlS2V5KSk7Ci0JCQlpZiAocmVmQ0YpCi0JCQl7Ci0JCQkJaWYgKCFDRk51bWJlckdldFZhbHVlIChyZWZDRiwga0NGTnVtYmVyTG9uZ1R5cGUsICZwRGV2aWNlLT51c2FnZVBhZ2UpKQotCQkJCQlTRExfU2V0RXJyb3IgKCJDRk51bWJlckdldFZhbHVlIGVycm9yIHJldHJpZXZpbmcgcERldmljZS0+dXNhZ2VQYWdlLiIpOwotCQkJCXJlZkNGID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKGhpZFByb3BlcnRpZXMsIENGU1RSKGtJT0hJRFByaW1hcnlVc2FnZUtleSkpOwotCQkJCWlmIChyZWZDRikKLQkJCQkJaWYgKCFDRk51bWJlckdldFZhbHVlIChyZWZDRiwga0NGTnVtYmVyTG9uZ1R5cGUsICZwRGV2aWNlLT51c2FnZSkpCi0JCQkJCQlTRExfU2V0RXJyb3IgKCJDRk51bWJlckdldFZhbHVlIGVycm9yIHJldHJpZXZpbmcgcERldmljZS0+dXNhZ2UuIik7Ci0JCQl9Ci0KLQkJCWlmIChOVUxMID09IHJlZkNGKSAvKiBnZXQgdG9wIGxldmVsIGVsZW1lbnQgSElEIHVzYWdlIHBhZ2Ugb3IgdXNhZ2UgKi8KLQkJCXsKLQkJCQkvKiB1c2UgdG9wIGxldmVsIGVsZW1lbnQgaW5zdGVhZCAqLwotCQkJCUNGVHlwZVJlZiByZWZDRlRvcEVsZW1lbnQgPSAwOwotCQkJCXJlZkNGVG9wRWxlbWVudCA9IENGRGljdGlvbmFyeUdldFZhbHVlIChoaWRQcm9wZXJ0aWVzLCBDRlNUUihrSU9ISURFbGVtZW50S2V5KSk7Ci0JCQkJewotCQkJCQkvKiByZWZDRlRvcEVsZW1lbnQgcG9pbnRzIHRvIGFuIGFycmF5IG9mIGVsZW1lbnQgZGljdGlvbmFyaWVzICovCi0JCQkJCUNGUmFuZ2UgcmFuZ2UgPSB7MCwgQ0ZBcnJheUdldENvdW50IChyZWZDRlRvcEVsZW1lbnQpfTsKLQkJCQkJQ0ZBcnJheUFwcGx5RnVuY3Rpb24gKHJlZkNGVG9wRWxlbWVudCwgcmFuZ2UsIEhJRFRvcExldmVsRWxlbWVudEhhbmRsZXIsIHBEZXZpY2UpOwotCQkJCX0KLQkJCX0KLQotCQkJQ0ZSZWxlYXNlICh1c2JQcm9wZXJ0aWVzKTsKLQkJfQotCQllbHNlCi0JCQlTRExfU2V0RXJyb3IgKCJJT1JlZ2lzdHJ5RW50cnlDcmVhdGVDRlByb3BlcnRpZXMgZmFpbGVkIHRvIGNyZWF0ZSB1c2JQcm9wZXJ0aWVzLiIpOwotCi0JCWlmIChrSU9SZXR1cm5TdWNjZXNzICE9IElPT2JqZWN0UmVsZWFzZSAocGFyZW50MikpCi0JCQlTRExfU2V0RXJyb3IgKCJJT09iamVjdFJlbGVhc2UgZXJyb3Igd2l0aCBwYXJlbnQyLiIpOwotCQlpZiAoa0lPUmV0dXJuU3VjY2VzcyAhPSBJT09iamVjdFJlbGVhc2UgKHBhcmVudDEpKQotCQkJU0RMX1NldEVycm9yICgiSU9PYmplY3RSZWxlYXNlIGVycm9yIHdpdGggcGFyZW50MS4iKTsKLQl9Ci19Ci0KLQotc3RhdGljIHJlY0RldmljZSAqSElEQnVpbGREZXZpY2UgKGlvX29iamVjdF90IGhpZERldmljZSkKLXsKLQlyZWNEZXZpY2UgKnBEZXZpY2UgPSAocmVjRGV2aWNlICopIE5ld1B0ckNsZWFyIChzaXplb2YgKHJlY0RldmljZSkpOwotCWlmIChwRGV2aWNlKQotCXsKLQkJLyogZ2V0IGRpY3Rpb25hcnkgZm9yIEhJRCBwcm9wZXJ0aWVzICovCi0JCUNGTXV0YWJsZURpY3Rpb25hcnlSZWYgaGlkUHJvcGVydGllcyA9IDA7Ci0JCWtlcm5fcmV0dXJuX3QgcmVzdWx0ID0gSU9SZWdpc3RyeUVudHJ5Q3JlYXRlQ0ZQcm9wZXJ0aWVzIChoaWREZXZpY2UsICZoaWRQcm9wZXJ0aWVzLCBrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrTmlsT3B0aW9ucyk7Ci0JCWlmICgocmVzdWx0ID09IEtFUk5fU1VDQ0VTUykgJiYgaGlkUHJvcGVydGllcykKLQkJewotCQkJLyogY3JlYXRlIGRldmljZSBpbnRlcmZhY2UgKi8KLQkJCXJlc3VsdCA9IEhJRENyZWF0ZU9wZW5EZXZpY2VJbnRlcmZhY2UgKGhpZERldmljZSwgcERldmljZSk7Ci0JCQlpZiAoa0lPUmV0dXJuU3VjY2VzcyA9PSByZXN1bHQpCi0JCQl7Ci0JCQkJSElER2V0RGV2aWNlSW5mbyAoaGlkRGV2aWNlLCBoaWRQcm9wZXJ0aWVzLCBwRGV2aWNlKTsgLyogaGlkRGV2aWNlIHVzZWQgdG8gZmluZCBwYXJlbnRzIGluIHJlZ2lzdHJ5IHRyZWUgKi8KLQkJCQlISURHZXRDb2xsZWN0aW9uRWxlbWVudHMgKGhpZFByb3BlcnRpZXMsIHBEZXZpY2UpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURpc3Bvc2VQdHIoKFB0cilwRGV2aWNlKTsKLQkJCQlwRGV2aWNlID0gTlVMTDsKLQkJCX0KLQkJCUNGUmVsZWFzZSAoaGlkUHJvcGVydGllcyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlEaXNwb3NlUHRyKChQdHIpcERldmljZSk7Ci0JCQlwRGV2aWNlID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gcERldmljZTsKLX0KLQotLyogZGlzcG9zZXMgb2YgdGhlIGVsZW1lbnQgbGlzdCBhc3NvY2lhdGVkIHdpdGggYSBkZXZpY2UgYW5kIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaXN0Ci0gKi8KLQotc3RhdGljIHZvaWQgSElERGlzcG9zZUVsZW1lbnRMaXN0IChyZWNFbGVtZW50ICoqZWxlbWVudExpc3QpCi17Ci0JcmVjRWxlbWVudCAqcEVsZW1lbnQgPSAqZWxlbWVudExpc3Q7Ci0Jd2hpbGUgKHBFbGVtZW50KQotCXsKLQkJcmVjRWxlbWVudCAqcEVsZW1lbnROZXh0ID0gcEVsZW1lbnQtPnBOZXh0OwotCQlEaXNwb3NlUHRyICgoUHRyKSBwRWxlbWVudCk7Ci0JCXBFbGVtZW50ID0gcEVsZW1lbnROZXh0OwotCX0KLQkqZWxlbWVudExpc3QgPSBOVUxMOwotfQotCi0vKiBkaXNwb3NlcyBvZiBhIHNpbmdsZSBkZXZpY2UsIGNsb3NpbmcgYW5kIHJlbGVhc2VpbmcgaW50ZXJmYWNlLCBmcmVlaW5nIG1lbW9yeSBmcm8gZGV2aWNlIGFuZCBlbGVtZW50cywgc2V0dGluZyBkZXZpY2UgcG9pbnRlciB0byBOVUxMCi0gKiBhbGwgeW91ciBkZXZpY2Ugbm8gbG9uZ2VyIGJlbG9uZyB0byB1cy4uLiAoaS5lLiwgeW91IGRvIG5vdCAnb3duJyB0aGUgZGV2aWNlIGFueW1vcmUpCi0gKi8KLQotc3RhdGljIHJlY0RldmljZSAqSElERGlzcG9zZURldmljZSAocmVjRGV2aWNlICoqcHBEZXZpY2UpCi17Ci0Ja2Vybl9yZXR1cm5fdCByZXN1bHQgPSBLRVJOX1NVQ0NFU1M7Ci0JcmVjRGV2aWNlICpwRGV2aWNlTmV4dCA9IE5VTEw7Ci0JaWYgKCpwcERldmljZSkKLQl7Ci0JCS8qIHNhdmUgbmV4dCBkZXZpY2UgcHJpb3IgdG8gZGlzcG9zaW5nIG9mIHRoaXMgZGV2aWNlICovCi0JCXBEZXZpY2VOZXh0ID0gKCpwcERldmljZSktPnBOZXh0OwotCQkKLQkJLyogZnJlZSBlbGVtZW50IGxpc3RzICovCi0JCUhJRERpc3Bvc2VFbGVtZW50TGlzdCAoJigqcHBEZXZpY2UpLT5maXJzdEF4aXMpOwotCQlISUREaXNwb3NlRWxlbWVudExpc3QgKCYoKnBwRGV2aWNlKS0+Zmlyc3RCdXR0b24pOwotCQlISUREaXNwb3NlRWxlbWVudExpc3QgKCYoKnBwRGV2aWNlKS0+Zmlyc3RIYXQpOwotCQkKLQkJcmVzdWx0ID0gSElEQ2xvc2VSZWxlYXNlSW50ZXJmYWNlICgqcHBEZXZpY2UpOyAvKiBmdW5jdGlvbiBzYW5pdHkgY2hlY2tzIGludGVyZmFjZSB2YWx1ZSAobm93IGFwcGxpY2F0aW9uIGRvZXMgbm90IG93biBkZXZpY2UpICovCi0JCWlmIChrSU9SZXR1cm5TdWNjZXNzICE9IHJlc3VsdCkKLQkJCUhJRFJlcG9ydEVycm9yTnVtICgiSElEQ2xvc2VSZWxlYXNlSW50ZXJmYWNlIGZhaWxlZCB3aGVuIHRyeWluZyB0byBkaXBvc2UgZGV2aWNlLiIsIHJlc3VsdCk7Ci0JCURpc3Bvc2VQdHIgKChQdHIpKnBwRGV2aWNlKTsKLQkJKnBwRGV2aWNlID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHBEZXZpY2VOZXh0OwotfQotCi0KLS8qIEZ1bmN0aW9uIHRvIHNjYW4gdGhlIHN5c3RlbSBmb3Igam95c3RpY2tzLgotICogSm95c3RpY2sgMCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IGpveXN0aWNrLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGpveXN0aWNrcywgb3IgLTEKLSAqIG9uIGFuIHVucmVjb3ZlcmFibGUgZmF0YWwgZXJyb3IuCi0gKi8KLWludCBTRExfU1lTX0pveXN0aWNrSW5pdCh2b2lkKQotewotCUlPUmV0dXJuIHJlc3VsdCA9IGtJT1JldHVyblN1Y2Nlc3M7Ci0JbWFjaF9wb3J0X3QgbWFzdGVyUG9ydCA9IDA7Ci0JaW9faXRlcmF0b3JfdCBoaWRPYmplY3RJdGVyYXRvciA9IDA7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBoaWRNYXRjaERpY3Rpb25hcnkgPSBOVUxMOwotCXJlY0RldmljZSAqZGV2aWNlLCAqbGFzdERldmljZTsKLQlpb19vYmplY3RfdCBpb0hJRERldmljZU9iamVjdCA9IDA7Ci0JCi0JU0RMX251bWpveXN0aWNrcyA9IDA7Ci0JCi0JaWYgKGdwRGV2aWNlTGlzdCkKLQl7Ci0JCVNETF9TZXRFcnJvcigiSm95c3RpY2s6IERldmljZSBsaXN0IGFscmVhZHkgaW5pdGVkLiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXJlc3VsdCA9IElPTWFzdGVyUG9ydCAoYm9vdHN0cmFwX3BvcnQsICZtYXN0ZXJQb3J0KTsKLQlpZiAoa0lPUmV0dXJuU3VjY2VzcyAhPSByZXN1bHQpCi0JewotCQlTRExfU2V0RXJyb3IoIkpveXN0aWNrOiBJT01hc3RlclBvcnQgZXJyb3Igd2l0aCBib290c3RyYXBfcG9ydC4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFNldCB1cCBhIG1hdGNoaW5nIGRpY3Rpb25hcnkgdG8gc2VhcmNoIEkvTyBSZWdpc3RyeSBieSBjbGFzcyBuYW1lIGZvciBhbGwgSElEIGNsYXNzIGRldmljZXMuICovCi0JaGlkTWF0Y2hEaWN0aW9uYXJ5ID0gSU9TZXJ2aWNlTWF0Y2hpbmcgKGtJT0hJRERldmljZUtleSk7Ci0JaWYgKGhpZE1hdGNoRGljdGlvbmFyeSkKLQl7Ci0JCS8qIEFkZCBrZXkgZm9yIGRldmljZSB0eXBlIChqb3lzdGljaywgaW4gdGhpcyBjYXNlKSB0byByZWZpbmUgdGhlIG1hdGNoaW5nIGRpY3Rpb25hcnkuICovCi0JCQotCQkvKiBOT1RFOiB3ZSBub3cgcGVyZm9ybSB0aGlzIGZpbHRlcmluZyBsYXRlcgotCQlVSW50MzIgdXNhZ2VQYWdlID0ga0hJRFBhZ2VfR2VuZXJpY0Rlc2t0b3A7Ci0JCVVJbnQzMiB1c2FnZSA9IGtISURVc2FnZV9HRF9Kb3lzdGljazsKLQkJQ0ZOdW1iZXJSZWYgcmVmVXNhZ2UgPSBOVUxMLCByZWZVc2FnZVBhZ2UgPSBOVUxMOwotCi0JCXJlZlVzYWdlID0gQ0ZOdW1iZXJDcmVhdGUgKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZ1c2FnZSk7Ci0JCUNGRGljdGlvbmFyeVNldFZhbHVlIChoaWRNYXRjaERpY3Rpb25hcnksIENGU1RSIChrSU9ISURQcmltYXJ5VXNhZ2VLZXkpLCByZWZVc2FnZSk7Ci0JCXJlZlVzYWdlUGFnZSA9IENGTnVtYmVyQ3JlYXRlIChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAmdXNhZ2VQYWdlKTsKLQkJQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUgKGhpZE1hdGNoRGljdGlvbmFyeSwgQ0ZTVFIgKGtJT0hJRFByaW1hcnlVc2FnZVBhZ2VLZXkpLCByZWZVc2FnZVBhZ2UpOwotCQkqLwotCX0KLQllbHNlCi0JewotCQlTRExfU2V0RXJyb3IoIkpveXN0aWNrOiBGYWlsZWQgdG8gZ2V0IEhJRCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIHZpYSBJT1NlcnZpY2VNYXRjaGluZy4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkvKi8gTm93IHNlYXJjaCBJL08gUmVnaXN0cnkgZm9yIG1hdGNoaW5nIGRldmljZXMuICovCi0JcmVzdWx0ID0gSU9TZXJ2aWNlR2V0TWF0Y2hpbmdTZXJ2aWNlcyAobWFzdGVyUG9ydCwgaGlkTWF0Y2hEaWN0aW9uYXJ5LCAmaGlkT2JqZWN0SXRlcmF0b3IpOwotCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KLQlpZiAoa0lPUmV0dXJuU3VjY2VzcyAhPSByZXN1bHQpCi0JewotCQlTRExfU2V0RXJyb3IoIkpveXN0aWNrOiBDb3VsZG4ndCBjcmVhdGUgYSBISUQgb2JqZWN0IGl0ZXJhdG9yLiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghaGlkT2JqZWN0SXRlcmF0b3IpIC8qIHRoZXJlIGFyZSBubyBqb3lzdGlja3MgKi8KLQl7Ci0JCWdwRGV2aWNlTGlzdCA9IE5VTEw7Ci0JCVNETF9udW1qb3lzdGlja3MgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogSU9TZXJ2aWNlR2V0TWF0Y2hpbmdTZXJ2aWNlcyBjb25zdW1lcyBhIHJlZmVyZW5jZSB0byB0aGUgZGljdGlvbmFyeSwgc28gd2UgZG9uJ3QgbmVlZCB0byByZWxlYXNlIHRoZSBkaWN0aW9uYXJ5IHJlZi4gKi8KLQotCS8qIGJ1aWxkIGZsYXQgbGlua2VkIGxpc3Qgb2YgZGV2aWNlcyBmcm9tIGRldmljZSBpdGVyYXRvciAqLwotCi0JZ3BEZXZpY2VMaXN0ID0gbGFzdERldmljZSA9IE5VTEw7Ci0JCi0Jd2hpbGUgKChpb0hJRERldmljZU9iamVjdCA9IElPSXRlcmF0b3JOZXh0IChoaWRPYmplY3RJdGVyYXRvcikpKQotCXsKLQkJLyogYnVpbGQgYSBkZXZpY2UgcmVjb3JkICovCi0JCWRldmljZSA9IEhJREJ1aWxkRGV2aWNlIChpb0hJRERldmljZU9iamVjdCk7Ci0JCWlmICghZGV2aWNlKQotCQkJY29udGludWU7Ci0KLQkJLyogZHVtcCBkZXZpY2Ugb2JqZWN0LCBpdCBpcyBubyBsb25nZXIgbmVlZGVkICovCi0JCXJlc3VsdCA9IElPT2JqZWN0UmVsZWFzZSAoaW9ISUREZXZpY2VPYmplY3QpOwotLyoJCWlmIChLRVJOX1NVQ0NFU1MgIT0gcmVzdWx0KQotCQkJSElEUmVwb3J0RXJyb3JOdW0gKCJJT09iamVjdFJlbGVhc2UgZXJyb3Igd2l0aCBpb0hJRERldmljZU9iamVjdC4iLCByZXN1bHQpOwotKi8KLQotCQkvKiBGaWx0ZXIgZGV2aWNlIGxpc3QgdG8gbm9uLWtleWJvYXJkL21vdXNlIHN0dWZmICovIAotCQlpZiAoIChkZXZpY2UtPnVzYWdlUGFnZSAhPSBrSElEUGFnZV9HZW5lcmljRGVza3RvcCkgfHwKLQkJICAgICAoKGRldmljZS0+dXNhZ2UgIT0ga0hJRFVzYWdlX0dEX0pveXN0aWNrICYmCi0JCSAgICAgIGRldmljZS0+dXNhZ2UgIT0ga0hJRFVzYWdlX0dEX0dhbWVQYWQgJiYKLQkJICAgICAgZGV2aWNlLT51c2FnZSAhPSBrSElEVXNhZ2VfR0RfTXVsdGlBeGlzQ29udHJvbGxlcikpICkgewotCi0JCQkvKiByZWxlYXNlIG1lbW9yeSBmb3IgdGhlIGRldmljZSAqLwotCQkJSElERGlzcG9zZURldmljZSAoJmRldmljZSk7Ci0JCQlEaXNwb3NlUHRyKChQdHIpZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCQotCQkvKiBBZGQgZGV2aWNlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KLQkJaWYgKGxhc3REZXZpY2UpCi0JCQlsYXN0RGV2aWNlLT5wTmV4dCA9IGRldmljZTsKLQkJZWxzZQotCQkJZ3BEZXZpY2VMaXN0ID0gZGV2aWNlOwotCQlsYXN0RGV2aWNlID0gZGV2aWNlOwotCX0KLQlyZXN1bHQgPSBJT09iamVjdFJlbGVhc2UgKGhpZE9iamVjdEl0ZXJhdG9yKTsgLyogcmVsZWFzZSB0aGUgaXRlcmF0b3IgKi8KLQotCS8qIENvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgZGV2aWNlcyB3ZSBmb3VuZCAqLwotCWRldmljZSA9IGdwRGV2aWNlTGlzdDsKLQl3aGlsZSAoZGV2aWNlKQotCXsKLQkJU0RMX251bWpveXN0aWNrcysrOwotCQlkZXZpY2UgPSBkZXZpY2UtPnBOZXh0OwotCX0KLQkKLQlyZXR1cm4gU0RMX251bWpveXN0aWNrczsKLX0KLQotLyogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkZXZpY2UtZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljayAqLwotY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQotewotCXJlY0RldmljZSAqZGV2aWNlID0gZ3BEZXZpY2VMaXN0OwotCQotCWZvciAoOyBpbmRleCA+IDA7IGluZGV4LS0pCi0JCWRldmljZSA9IGRldmljZS0+cE5leHQ7Ci0KLQlyZXR1cm4gZGV2aWNlLT5wcm9kdWN0OwotfQotCi0vKiBGdW5jdGlvbiB0byBvcGVuIGEgam95c3RpY2sgZm9yIHVzZS4KLSAqIFRoZSBqb3lzdGljayB0byBvcGVuIGlzIHNwZWNpZmllZCBieSB0aGUgaW5kZXggZmllbGQgb2YgdGhlIGpveXN0aWNrLgotICogVGhpcyBzaG91bGQgZmlsbCB0aGUgbmJ1dHRvbnMgYW5kIG5heGVzIGZpZWxkcyBvZiB0aGUgam95c3RpY2sgc3RydWN0dXJlLgotICogSXQgcmV0dXJucyAwLCBvciAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KLSAqLwotaW50IFNETF9TWVNfSm95c3RpY2tPcGVuKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JcmVjRGV2aWNlICpkZXZpY2UgPSBncERldmljZUxpc3Q7Ci0JaW50IGluZGV4OwotCQotCWZvciAoaW5kZXggPSBqb3lzdGljay0+aW5kZXg7IGluZGV4ID4gMDsgaW5kZXgtLSkKLQkJZGV2aWNlID0gZGV2aWNlLT5wTmV4dDsKLQotCWpveXN0aWNrLT5od2RhdGEgPSBkZXZpY2U7Ci0Jam95c3RpY2stPm5hbWUgPSBkZXZpY2UtPnByb2R1Y3Q7Ci0KLQlqb3lzdGljay0+bmF4ZXMgPSBkZXZpY2UtPmF4ZXM7Ci0Jam95c3RpY2stPm5oYXRzID0gZGV2aWNlLT5oYXRzOwotCWpveXN0aWNrLT5uYmFsbHMgPSAwOwotCWpveXN0aWNrLT5uYnV0dG9ucyA9IGRldmljZS0+YnV0dG9uczsKLQotCXJldHVybiAwOwotfQotCi0vKiBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHN0YXRlIG9mIGEgam95c3RpY2sgLSBjYWxsZWQgYXMgYSBkZXZpY2UgcG9sbC4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IHVwZGF0ZSB0aGUgam95c3RpY2sgc3RydWN0dXJlIGRpcmVjdGx5LAotICogYnV0IGluc3RlYWQgc2hvdWxkIGNhbGwgU0RMX1ByaXZhdGVKb3lzdGljayooKSB0byBkZWxpdmVyIGV2ZW50cwotICogYW5kIHVwZGF0ZSBqb3lzdGljayBkZXZpY2Ugc3RhdGUuCi0gKi8KLXZvaWQgU0RMX1NZU19Kb3lzdGlja1VwZGF0ZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCXJlY0RldmljZSAqZGV2aWNlID0gam95c3RpY2stPmh3ZGF0YTsKLQlyZWNFbGVtZW50ICplbGVtZW50OwotCVNJbnQzMiB2YWx1ZTsKLQlpbnQgaTsKLQotCWlmIChkZXZpY2UtPnJlbW92ZWQpICAvKiBkZXZpY2Ugd2FzIHVucGx1Z2dlZDsgaWdub3JlIGl0LiAqLwotCXsKLQkJaWYgKGRldmljZS0+dW5jZW50ZXJlZCkKLQkJewotCQkJZGV2aWNlLT51bmNlbnRlcmVkID0gMDsKLQotCQkJLyogVGVsbCB0aGUgYXBwIHRoYXQgZXZlcnl0aGluZyBpcyBjZW50ZXJlZC91bnByZXNzZWQuLi4gKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPmF4ZXM7IGkrKykKLQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywgaSwgMCk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPmJ1dHRvbnM7IGkrKykKLQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLCBpLCAwKTsKLQotCQkJZm9yIChpID0gMDsgaSA8IGRldmljZS0+aGF0czsgaSsrKQotCQkJCVNETF9Qcml2YXRlSm95c3RpY2tIYXQoam95c3RpY2ssIGksIFNETF9IQVRfQ0VOVEVSRUQpOwotCQl9Ci0KLQkJcmV0dXJuOwotCX0KLQotCWVsZW1lbnQgPSBkZXZpY2UtPmZpcnN0QXhpczsKLQlpID0gMDsKLQl3aGlsZSAoZWxlbWVudCkKLQl7Ci0JCXZhbHVlID0gSElEU2NhbGVkQ2FsaWJyYXRlZFZhbHVlKGRldmljZSwgZWxlbWVudCwgLTMyNzY4LCAzMjc2Nyk7Ci0JCWlmICggdmFsdWUgIT0gam95c3RpY2stPmF4ZXNbaV0gKQotCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssIGksIHZhbHVlKTsKLQkJZWxlbWVudCA9IGVsZW1lbnQtPnBOZXh0OwotCQkrK2k7Ci0JfQotCQotCWVsZW1lbnQgPSBkZXZpY2UtPmZpcnN0QnV0dG9uOwotCWkgPSAwOwotCXdoaWxlIChlbGVtZW50KQotCXsKLQkJdmFsdWUgPSBISURHZXRFbGVtZW50VmFsdWUoZGV2aWNlLCBlbGVtZW50KTsKLSAgICAgICAgaWYgKHZhbHVlID4gMSkgIC8qIGhhbmRsZSBwcmVzc3VyZS1zZW5zaXRpdmUgYnV0dG9ucyAqLwotICAgICAgICAgICAgdmFsdWUgPSAxOwotCQlpZiAoIHZhbHVlICE9IGpveXN0aWNrLT5idXR0b25zW2ldICkKLQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIGksIHZhbHVlKTsKLQkJZWxlbWVudCA9IGVsZW1lbnQtPnBOZXh0OwotCQkrK2k7Ci0JfQotCSAgICAKLQllbGVtZW50ID0gZGV2aWNlLT5maXJzdEhhdDsKLQlpID0gMDsKLQl3aGlsZSAoZWxlbWVudCkKLQl7Ci0JCVVpbnQ4IHBvcyA9IDA7Ci0KLQkJdmFsdWUgPSBISURHZXRFbGVtZW50VmFsdWUoZGV2aWNlLCBlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQtPm1heCA9PSAzKSAvKiA0IHBvc2l0aW9uIGhhdHN3aXRjaCAtIHNjYWxlIHVwIHZhbHVlICovCi0JCQl2YWx1ZSAqPSAyOwotCQllbHNlIGlmIChlbGVtZW50LT5tYXggIT0gNykgLyogTmVpdGhlciBhIDQgbm9yIDggcG9zaXRpb25zIC0gZmFsbCBiYWNrIHRvIGRlZmF1bHQgcG9zaXRpb24gKGNlbnRlcmVkKSAqLwotCQkJdmFsdWUgPSAtMTsKLQkJc3dpdGNoKHZhbHVlKQotCQl7Ci0JCQljYXNlIDA6Ci0JCQkJcG9zID0gU0RMX0hBVF9VUDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlwb3MgPSBTRExfSEFUX1JJR0hUVVA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcG9zID0gU0RMX0hBVF9SSUdIVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlwb3MgPSBTRExfSEFUX1JJR0hURE9XTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlwb3MgPSBTRExfSEFUX0RPV047Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDU6Ci0JCQkJcG9zID0gU0RMX0hBVF9MRUZURE9XTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgNjoKLQkJCQlwb3MgPSBTRExfSEFUX0xFRlQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDc6Ci0JCQkJcG9zID0gU0RMX0hBVF9MRUZUVVA7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCS8qIEV2ZXJ5IG90aGVyIHZhbHVlIGlzIG1hcHBlZCB0byBjZW50ZXIuIFdlIGRvIHRoYXQgYmVjYXVzZSBzb21lCi0JCQkJICogam95c3RpY2tzIHVzZSA4IGFuZCBzb21lIDE1IGZvciB0aGlzIHZhbHVlLCBhbmQgYXBwYXJlbnRseQotCQkJCSAqIHRoZXJlIGFyZSBldmVuIG1vcmUgdmFyaWFudHMgb3V0IHRoZXJlIC0gc28gd2UgdHJ5IHRvIGJlIGdlbmVyb3VzLgotCQkJCSAqLwotCQkJCXBvcyA9IFNETF9IQVRfQ0VOVEVSRUQ7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCBwb3MgIT0gam95c3RpY2stPmhhdHNbaV0gKQotCQkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgaSwgcG9zKTsKLQkJZWxlbWVudCA9IGVsZW1lbnQtPnBOZXh0OwotCQkrK2k7Ci0JfQotCQotCXJldHVybjsKLX0KLQotLyogRnVuY3Rpb24gdG8gY2xvc2UgYSBqb3lzdGljayBhZnRlciB1c2UgKi8KLXZvaWQgU0RMX1NZU19Kb3lzdGlja0Nsb3NlKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JLyogU2hvdWxkIHdlIGRvIGFueXRoaW5nIGhlcmU/ICovCi0JcmV0dXJuOwotfQotCi0vKiBGdW5jdGlvbiB0byBwZXJmb3JtIGFueSBzeXN0ZW0tc3BlY2lmaWMgam95c3RpY2sgcmVsYXRlZCBjbGVhbnVwICovCi12b2lkIFNETF9TWVNfSm95c3RpY2tRdWl0KHZvaWQpCi17Ci0Jd2hpbGUgKE5VTEwgIT0gZ3BEZXZpY2VMaXN0KQotCQlncERldmljZUxpc3QgPSBISUREaXNwb3NlRGV2aWNlICgmZ3BEZXZpY2VMaXN0KTsKLX0KLQotI2VuZGlmIC8qIFNETF9KT1lTVElDS19JT0tJVCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9kYy9TRExfc3lzam95c3RpY2suYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svZGMvU0RMX3N5c2pveXN0aWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzI0NzMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9kYy9TRExfc3lzam95c3RpY2suYworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9KT1lTVElDS19EQwotCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNqb3lzdGljay5oIgotI2luY2x1ZGUgIi4uL1NETF9qb3lzdGlja19jLmgiCi0KLSNpbmNsdWRlIDxkYy9tYXBsZS5oPgotI2luY2x1ZGUgPGRjL21hcGxlL2NvbnRyb2xsZXIuaD4KLQotI2RlZmluZSBNQVhfSk9ZU1RJQ0tTCTgJLyogb25seSAyIGFyZSBzdXBwb3J0ZWQgaW4gdGhlIG11bHRpbWVkaWEgQVBJICovCi0jZGVmaW5lIE1BWF9BWEVTCTYJLyogZWFjaCBqb3lzdGljayBjYW4gaGF2ZSB1cCB0byA2IGF4ZXMgKi8KLSNkZWZpbmUgTUFYX0JVVFRPTlMJOAkvKiBhbmQgOCBidXR0b25zICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lCU1BWF9IQVRTCTIKLQotI2RlZmluZQlKT1lOQU1FTEVOCTgKLQotLyogYXJyYXkgdG8gaG9sZCBqb3lzdGljayBJRCB2YWx1ZXMgKi8KLXN0YXRpYyB1aW50OAlTWVNfSm95c3RpY2tfYWRkcltNQVhfSk9ZU1RJQ0tTXTsKLQotLyogVGhlIHByaXZhdGUgc3RydWN0dXJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhIGpveXN0aWNrICovCi1zdHJ1Y3Qgam95c3RpY2tfaHdkYXRhCi17Ci0JY29udF9jb25kX3QgcHJldl9jb25kOwotCWludCBwcmV2X2J1dHRvbnM7Ci19OwotCi0vKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIGpveXN0aWNrcy4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHNldCBTRExfbnVtam95c3RpY2tzIHRvIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCi0gKiBqb3lzdGlja3MuICBKb3lzdGljayAwIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgam95c3RpY2suCi0gKiBJdCBzaG91bGQgcmV0dXJuIDAsIG9yIC0xIG9uIGFuIHVucmVjb3ZlcmFibGUgZmF0YWwgZXJyb3IuCi0gKi8KLWludCBTRExfU1lTX0pveXN0aWNrSW5pdCh2b2lkKQotewotCWludCBudW1kZXZzOwotCi0JaW50IHAsdTsKLQotCW51bWRldnMgPSAwOwotCWZvcihwPTA7cDxNQVBMRV9QT1JUX0NPVU5UO3ArKykgewotCQlmb3IodT0wO3U8TUFQTEVfVU5JVF9DT1VOVDt1KyspIHsKLQkJCWlmIChtYXBsZV9kZXZpY2VfZnVuYyhwLHUpJk1BUExFX0ZVTkNfQ09OVFJPTExFUikgewotCQkJCVNZU19Kb3lzdGlja19hZGRyW251bWRldnNdID0gbWFwbGVfYWRkcihwLHUpOwotCQkJCW51bWRldnMrKzsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybihudW1kZXZzKTsKLX0KLQotLyogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkZXZpY2UtZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljayAqLwotY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQotewotCW1hcGxlX2RldmljZV90ICpkZXY7Ci0JaWYgKG1hcGxlX2NvbXBhdF9yZXNvbHZlKFNZU19Kb3lzdGlja19hZGRyW2luZGV4XSwmZGV2LE1BUExFX0ZVTkNfQ09OVFJPTExFUikhPTApIHJldHVybiBOVUxMOwotCXJldHVybiBkZXYtPmluZm8ucHJvZHVjdF9uYW1lOwotfQotCi0vKiBGdW5jdGlvbiB0byBvcGVuIGEgam95c3RpY2sgZm9yIHVzZS4KLSAgIFRoZSBqb3lzdGljayB0byBvcGVuIGlzIHNwZWNpZmllZCBieSB0aGUgaW5kZXggZmllbGQgb2YgdGhlIGpveXN0aWNrLgotICAgVGhpcyBzaG91bGQgZmlsbCB0aGUgbmJ1dHRvbnMgYW5kIG5heGVzIGZpZWxkcyBvZiB0aGUgam95c3RpY2sgc3RydWN0dXJlLgotICAgSXQgcmV0dXJucyAwLCBvciAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KLSAqLwotaW50IFNETF9TWVNfSm95c3RpY2tPcGVuKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzeXN0ZW0gc3BlY2lmaWMgaGFyZHdhcmUgZGF0YSAqLwotCWpveXN0aWNrLT5od2RhdGEgPSAoc3RydWN0IGpveXN0aWNrX2h3ZGF0YSAqKSBTRExfbWFsbG9jKHNpemVvZigqam95c3RpY2stPmh3ZGF0YSkpOwotCWlmIChqb3lzdGljay0+aHdkYXRhID09IE5VTEwpCi0JewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JU0RMX21lbXNldChqb3lzdGljay0+aHdkYXRhLCAwLCBzaXplb2YoKmpveXN0aWNrLT5od2RhdGEpKTsKLQotCS8qIGZpbGwgbmJ1dHRvbnMsIG5heGVzLCBhbmQgbmhhdHMgZmllbGRzICovCi0Jam95c3RpY2stPm5idXR0b25zID0gTUFYX0JVVFRPTlM7Ci0Jam95c3RpY2stPm5heGVzID0gTUFYX0FYRVM7Ci0Jam95c3RpY2stPm5oYXRzID0gTUFYX0hBVFM7Ci0JcmV0dXJuKDApOwotfQotCi0KLS8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCi0gKiBidXQgaW5zdGVhZCBzaG91bGQgY2FsbCBTRExfUHJpdmF0ZUpveXN0aWNrKigpIHRvIGRlbGl2ZXIgZXZlbnRzCi0gKiBhbmQgdXBkYXRlIGpveXN0aWNrIGRldmljZSBzdGF0ZS4KLSAqLwotCi12b2lkIFNETF9TWVNfSm95c3RpY2tVcGRhdGUoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLWNvbnN0CWludCBzZGxfYnV0dG9uc1tdID0gewotCUNPTlRfQywKLQlDT05UX0IsCi0JQ09OVF9BLAotCUNPTlRfU1RBUlQsCi0JQ09OVF9aLAotCUNPTlRfWSwKLQlDT05UX1gsCi0JQ09OVF9ECi19OwotCi0JdWludDggYWRkcjsKLQljb250X2NvbmRfdCBjb25kLCpwcmV2X2NvbmQ7Ci0JaW50IGJ1dHRvbnMscHJldl9idXR0b25zLGksY2hhbmdlZDsKLQotCWFkZHIgPSBTWVNfSm95c3RpY2tfYWRkcltqb3lzdGljay0+aW5kZXhdOwotCWlmIChjb250X2dldF9jb25kKGFkZHIsJmNvbmQpPDApIHJldHVybjsKLQotCWJ1dHRvbnMgPSBjb25kLmJ1dHRvbnM7Ci0JcHJldl9idXR0b25zID0gam95c3RpY2stPmh3ZGF0YS0+cHJldl9idXR0b25zOwotCWNoYW5nZWQgPSBidXR0b25zXnByZXZfYnV0dG9uczsKLQotCWlmICgoY2hhbmdlZCkmKENPTlRfRFBBRF9VUHxDT05UX0RQQURfRE9XTnxDT05UX0RQQURfTEVGVHxDT05UX0RQQURfUklHSFQpKSB7Ci0JCWludCBoYXQgPSBTRExfSEFUX0NFTlRFUkVEOwotCQlpZiAoYnV0dG9ucyZDT05UX0RQQURfVVApIGhhdHw9U0RMX0hBVF9VUDsKLQkJaWYgKGJ1dHRvbnMmQ09OVF9EUEFEX0RPV04pIGhhdHw9U0RMX0hBVF9ET1dOOwotCQlpZiAoYnV0dG9ucyZDT05UX0RQQURfTEVGVCkgaGF0fD1TRExfSEFUX0xFRlQ7Ci0JCWlmIChidXR0b25zJkNPTlRfRFBBRF9SSUdIVCkgaGF0fD1TRExfSEFUX1JJR0hUOwotCQlTRExfUHJpdmF0ZUpveXN0aWNrSGF0KGpveXN0aWNrLCAwLCBoYXQpOwotCX0KLQlpZiAoKGNoYW5nZWQpJihDT05UX0RQQUQyX1VQfENPTlRfRFBBRDJfRE9XTnxDT05UX0RQQUQyX0xFRlR8Q09OVF9EUEFEMl9SSUdIVCkpIHsKLQkJaW50IGhhdCA9IFNETF9IQVRfQ0VOVEVSRUQ7Ci0JCWlmIChidXR0b25zJkNPTlRfRFBBRDJfVVApIGhhdHw9U0RMX0hBVF9VUDsKLQkJaWYgKGJ1dHRvbnMmQ09OVF9EUEFEMl9ET1dOKSBoYXR8PVNETF9IQVRfRE9XTjsKLQkJaWYgKGJ1dHRvbnMmQ09OVF9EUEFEMl9MRUZUKSBoYXR8PVNETF9IQVRfTEVGVDsKLQkJaWYgKGJ1dHRvbnMmQ09OVF9EUEFEMl9SSUdIVCkgaGF0fD1TRExfSEFUX1JJR0hUOwotCQlTRExfUHJpdmF0ZUpveXN0aWNrSGF0KGpveXN0aWNrLCAxLCBoYXQpOwotCX0KLQotCWZvcihpPTA7aTxzaXplb2Yoc2RsX2J1dHRvbnMpL3NpemVvZihzZGxfYnV0dG9uc1swXSk7aSsrKSB7Ci0JCWlmIChjaGFuZ2VkICYgc2RsX2J1dHRvbnNbaV0pIHsKLQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIGksIChidXR0b25zICYgc2RsX2J1dHRvbnNbaV0pP1NETF9QUkVTU0VEOlNETF9SRUxFQVNFRCk7Ci0JCX0KLQl9Ci0KLQlwcmV2X2NvbmQgPSAmam95c3RpY2stPmh3ZGF0YS0+cHJldl9jb25kOwotCWlmIChjb25kLmpveXghPXByZXZfY29uZC0+am95eCkKLQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssIDAsIGNvbmQuam95eC0xMjgpOwotCWlmIChjb25kLmpveXkhPXByZXZfY29uZC0+am95eSkKLQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssIDEsIGNvbmQuam95eS0xMjgpOwotCWlmIChjb25kLnJ0cmlnIT1wcmV2X2NvbmQtPnJ0cmlnKQotCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywgMiwgY29uZC5ydHJpZyk7Ci0JaWYgKGNvbmQubHRyaWchPXByZXZfY29uZC0+bHRyaWcpCi0JCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLCAzLCBjb25kLmx0cmlnKTsKLQlpZiAoY29uZC5qb3kyeCE9cHJldl9jb25kLT5qb3kyeCkKLQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssIDQsIGNvbmQuam95MngtMTI4KTsKLQlpZiAoY29uZC5qb3kyeSE9cHJldl9jb25kLT5qb3kyeSkKLQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssIDUsIGNvbmQuam95MnktMTI4KTsKLQotCWpveXN0aWNrLT5od2RhdGEtPnByZXZfYnV0dG9ucyA9IGJ1dHRvbnM7Ci0Jam95c3RpY2stPmh3ZGF0YS0+cHJldl9jb25kID0gY29uZDsKLX0KLQotLyogRnVuY3Rpb24gdG8gY2xvc2UgYSBqb3lzdGljayBhZnRlciB1c2UgKi8KLXZvaWQgU0RMX1NZU19Kb3lzdGlja0Nsb3NlKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JaWYgKGpveXN0aWNrLT5od2RhdGEgIT0gTlVMTCkgewotCQkvKiBmcmVlIHN5c3RlbSBzcGVjaWZpYyBoYXJkd2FyZSBkYXRhICovCi0JCVNETF9mcmVlKGpveXN0aWNrLT5od2RhdGEpOwotCX0KLX0KLQotLyogRnVuY3Rpb24gdG8gcGVyZm9ybSBhbnkgc3lzdGVtLXNwZWNpZmljIGpveXN0aWNrIHJlbGF0ZWQgY2xlYW51cCAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrUXVpdCh2b2lkKQotewotCXJldHVybjsKLX0KLQotI2VuZGlmIC8qIFNETF9KT1lTVElDS19EQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9kdW1teS9TRExfc3lzam95c3RpY2suYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svZHVtbXkvU0RMX3N5c2pveXN0aWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjA5YTIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9kdW1teS9TRExfc3lzam95c3RpY2suYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChTRExfSk9ZU1RJQ0tfRFVNTVkpIHx8IGRlZmluZWQoU0RMX0pPWVNUSUNLX0RJU0FCTEVEKQotCi0vKiBUaGlzIGlzIHRoZSBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZvciB0aGUgU0RMIGpveXN0aWNrIEFQSSAqLwotCi0jaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2pveXN0aWNrX2MuaCIKLQotLyogRnVuY3Rpb24gdG8gc2NhbiB0aGUgc3lzdGVtIGZvciBqb3lzdGlja3MuCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzZXQgU0RMX251bWpveXN0aWNrcyB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQotICogam95c3RpY2tzLiAgSm95c3RpY2sgMCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IGpveXN0aWNrLgotICogSXQgc2hvdWxkIHJldHVybiAwLCBvciAtMSBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgotICovCi1pbnQgU0RMX1NZU19Kb3lzdGlja0luaXQodm9pZCkKLXsKLQlTRExfbnVtam95c3RpY2tzID0gMDsKLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGdldCB0aGUgZGV2aWNlLWRlcGVuZGVudCBuYW1lIG9mIGEgam95c3RpY2sgKi8KLWNvbnN0IGNoYXIgKlNETF9TWVNfSm95c3RpY2tOYW1lKGludCBpbmRleCkKLXsKLQlTRExfU2V0RXJyb3IoIkxvZ2ljIGVycm9yOiBObyBqb3lzdGlja3MgYXZhaWxhYmxlIik7Ci0JcmV0dXJuKE5VTEwpOwotfQotCi0vKiBGdW5jdGlvbiB0byBvcGVuIGEgam95c3RpY2sgZm9yIHVzZS4KLSAgIFRoZSBqb3lzdGljayB0byBvcGVuIGlzIHNwZWNpZmllZCBieSB0aGUgaW5kZXggZmllbGQgb2YgdGhlIGpveXN0aWNrLgotICAgVGhpcyBzaG91bGQgZmlsbCB0aGUgbmJ1dHRvbnMgYW5kIG5heGVzIGZpZWxkcyBvZiB0aGUgam95c3RpY2sgc3RydWN0dXJlLgotICAgSXQgcmV0dXJucyAwLCBvciAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KLSAqLwotaW50IFNETF9TWVNfSm95c3RpY2tPcGVuKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JU0RMX1NldEVycm9yKCJMb2dpYyBlcnJvcjogTm8gam95c3RpY2tzIGF2YWlsYWJsZSIpOwotCXJldHVybigtMSk7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCi0gKiBidXQgaW5zdGVhZCBzaG91bGQgY2FsbCBTRExfUHJpdmF0ZUpveXN0aWNrKigpIHRvIGRlbGl2ZXIgZXZlbnRzCi0gKiBhbmQgdXBkYXRlIGpveXN0aWNrIGRldmljZSBzdGF0ZS4KLSAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JcmV0dXJuOwotfQotCi0vKiBGdW5jdGlvbiB0byBjbG9zZSBhIGpveXN0aWNrIGFmdGVyIHVzZSAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLQlyZXR1cm47Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIHBlcmZvcm0gYW55IHN5c3RlbS1zcGVjaWZpYyBqb3lzdGljayByZWxhdGVkIGNsZWFudXAgKi8KLXZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCkKLXsKLQlyZXR1cm47Ci19Ci0KLSNlbmRpZiAvKiBTRExfSk9ZU1RJQ0tfRFVNTVkgfHwgU0RMX0pPWVNUSUNLX0RJU0FCTEVEICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL2xpbnV4L1NETF9zeXNqb3lzdGljay5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9saW51eC9TRExfc3lzam95c3RpY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwYmFlNi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL2xpbnV4L1NETF9zeXNqb3lzdGljay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5OSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9KT1lTVElDS19MSU5VWAotCi0vKiBUaGlzIGlzIHRoZSBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZvciB0aGUgU0RMIGpveXN0aWNrIEFQSSAqLwotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgkJLyogRm9yIHRoZSBkZWZpbml0aW9uIG9mIFBBVEhfTUFYICovCi0jaW5jbHVkZSA8bGludXgvam95c3RpY2suaD4KLSNpZiBTRExfSU5QVVRfTElOVVhFVgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNqb3lzdGljay5oIgotI2luY2x1ZGUgIi4uL1NETF9qb3lzdGlja19jLmgiCi0KLS8qIFNwZWNpYWwgam95c3RpY2sgY29uZmlndXJhdGlvbnMgKi8KLXN0YXRpYyBzdHJ1Y3QgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IG5heGVzOwotCWludCBuaGF0czsKLQlpbnQgbmJhbGxzOwotfSBzcGVjaWFsX2pveXN0aWNrc1tdID0gewotCXsgIk1hZENhdHogUGFudGhlciBYTCIsIDMsIDIsIDEgfSwgLyogV2UgZG9uJ3QgaGFuZGxlIHJ1ZGRlciAoYXhpcyA4KSAqLwotCXsgIlNpZGVXaW5kZXIgUHJlY2lzaW9uIFBybyIsIDQsIDEsIDAgfSwKLQl7ICJTaWRlV2luZGVyIDNEIFBybyIsIDQsIDEsIDAgfSwKLQl7ICJNaWNyb3NvZnQgU2lkZVdpbmRlciAzRCBQcm8iLCA0LCAxLCAwIH0sCi0JeyAiTWljcm9zb2Z0IFNpZGVXaW5kZXIgUHJlY2lzaW9uIFBybyIsIDQsIDEsIDAgfSwKLQl7ICJNaWNyb3NvZnQgU2lkZVdpbmRlciBEdWFsIFN0cmlrZSBVU0IgdmVyc2lvbiAxLjAiLCAyLCAxLCAwIH0sCi0JeyAiV2luZ01hbiBJbnRlcmNlcHRvciIsIDMsIDMsIDAgfSwKLQl7ICJXaW5nTWFuIEV4dHJlbWUgRGlnaXRhbCAzRCIsIDQsIDEsIDAgfSwKLQl7ICJNaWNyb3NvZnQgU2lkZVdpbmRlciBQcmVjaXNpb24gMiBKb3lzdGljayIsIDQsIDEsIDAgfSwKLQl7ICJMb2dpdGVjaCBJbmMuIFdpbmdNYW4gRXh0cmVtZSBEaWdpdGFsIDNEIiwgNCwgMSwgMCB9LAotCXsgIlNhaXRlayBTYWl0ZWsgWDQ1IiwgNiwgMSwgMCB9Ci19OwotCi0jaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCi0KLS8qCi0gICBTb21lIFVTQiBISURzIHNob3cgdXAgYXMgYSBzaW5nbGUgam95c3RpY2sgZXZlbiB0aG91Z2ggdGhleSBhY3R1YWxseQotICAgY29udHJvbCAyIG9yIG1vcmUgam95c3RpY2tzLgotKi8KLS8qCi0gICBUaGlzIGNvZGUgaGFuZGxlcyB0aGUgTVAtODgwMCAoUXVhZCkgYW5kIE1QLTg4NjYgKER1YWwpLCB3aGljaCBjYW4KLSAgIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgdHJhbnNwYXJlbnQgYmx1ZSBkZXNpZ24uIEl0J3MgcXVpdGUgdHJpdmlhbAotICAgdG8gYWRkIG90aGVyIGpveXN0aWNrcyB3aXRoIHNpbWlsYXIgcXVpcmt5IGJlaGF2aW9yLgotICAgLWlkCi0qLwotCi1zdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nIHsKLSAgICAgICAgaW50IG5qb3k7Ci0gICAgICAgIGludCBudGhpbmc7Ci19OwotCi0vKgotICAge2xvZ2ljYWwgam95LCBsb2dpY2FsIGF4aXN9LAotICAge2xvZ2ljYWwgam95LCBsb2dpY2FsIGhhdH0sCi0gICB7bG9naWNhbCBqb3ksIGxvZ2ljYWwgYmFsbH0sCi0gICB7bG9naWNhbCBqb3ksIGxvZ2ljYWwgYnV0dG9ufQotKi8KLQotc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgbXA4OHh4XzFfbG9naWNhbF9heGlzbWFwW10gPSB7Ci0gICB7MCwwfSx7MCwxfSx7MCwyfSx7MCwzfSx7MCw0fSx7MCw1fQotfTsKLXN0YXRpYyBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nIG1wODh4eF8xX2xvZ2ljYWxfYnV0dG9ubWFwW10gPSB7Ci0gICB7MCwwfSx7MCwxfSx7MCwyfSx7MCwzfSx7MCw0fSx7MCw1fSx7MCw2fSx7MCw3fSx7MCw4fSx7MCw5fSx7MCwxMH0sezAsMTF9Ci19OwotCi1zdGF0aWMgc3RydWN0IGpveXN0aWNrX2xvZ2ljYWxfbWFwcGluZyBtcDg4eHhfMl9sb2dpY2FsX2F4aXNtYXBbXSA9IHsKLSAgIHswLDB9LHswLDF9LHswLDJ9LHsxLDB9LHsxLDF9LHswLDN9LAotICAgezEsMn0sezEsM30sezAsNH0sezAsNX0sezEsNH0sezEsNX0KLX07Ci1zdGF0aWMgc3RydWN0IGpveXN0aWNrX2xvZ2ljYWxfbWFwcGluZyBtcDg4eHhfMl9sb2dpY2FsX2J1dHRvbm1hcFtdID0gewotICAgezAsMH0sezAsMX0sezAsMn0sezAsM30sezAsNH0sezAsNX0sezAsNn0sezAsN30sezAsOH0sezAsOX0sezAsMTB9LHswLDExfSwKLSAgIHsxLDB9LHsxLDF9LHsxLDJ9LHsxLDN9LHsxLDR9LHsxLDV9LHsxLDZ9LHsxLDd9LHsxLDh9LHsxLDl9LHsxLDEwfSx7MSwxMX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nIG1wODh4eF8zX2xvZ2ljYWxfYXhpc21hcFtdID0gewotICAgezAsMH0sezAsMX0sezAsMn0sezEsMH0sezEsMX0sezAsM30sCi0gICB7MSwyfSx7MSwzfSx7MiwwfSx7MiwxfSx7MiwyfSx7MiwzfSwKLSAgIHswLDR9LHswLDV9LHsxLDR9LHsxLDV9LHsyLDR9LHsyLDV9Ci19Owotc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgbXA4OHh4XzNfbG9naWNhbF9idXR0b25tYXBbXSA9IHsKLSAgIHswLDB9LHswLDF9LHswLDJ9LHswLDN9LHswLDR9LHswLDV9LHswLDZ9LHswLDd9LHswLDh9LHswLDl9LHswLDEwfSx7MCwxMX0sCi0gICB7MSwwfSx7MSwxfSx7MSwyfSx7MSwzfSx7MSw0fSx7MSw1fSx7MSw2fSx7MSw3fSx7MSw4fSx7MSw5fSx7MSwxMH0sezEsMTF9LAotICAgezIsMH0sezIsMX0sezIsMn0sezIsM30sezIsNH0sezIsNX0sezIsNn0sezIsN30sezIsOH0sezIsOX0sezIsMTB9LHsyLDExfQotfTsKLQotc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgbXA4OHh4XzRfbG9naWNhbF9heGlzbWFwW10gPSB7Ci0gICB7MCwwfSx7MCwxfSx7MCwyfSx7MSwwfSx7MSwxfSx7MCwzfSwKLSAgIHsxLDJ9LHsxLDN9LHsyLDB9LHsyLDF9LHsyLDJ9LHsyLDN9LAotICAgezMsMH0sezMsMX0sezMsMn0sezMsM30sezAsNH0sezAsNX0sCi0gICB7MSw0fSx7MSw1fSx7Miw0fSx7Miw1fSx7Myw0fSx7Myw1fQotfTsKLXN0YXRpYyBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nIG1wODh4eF80X2xvZ2ljYWxfYnV0dG9ubWFwW10gPSB7Ci0gICB7MCwwfSx7MCwxfSx7MCwyfSx7MCwzfSx7MCw0fSx7MCw1fSx7MCw2fSx7MCw3fSx7MCw4fSx7MCw5fSx7MCwxMH0sezAsMTF9LAotICAgezEsMH0sezEsMX0sezEsMn0sezEsM30sezEsNH0sezEsNX0sezEsNn0sezEsN30sezEsOH0sezEsOX0sezEsMTB9LHsxLDExfSwKLSAgIHsyLDB9LHsyLDF9LHsyLDJ9LHsyLDN9LHsyLDR9LHsyLDV9LHsyLDZ9LHsyLDd9LHsyLDh9LHsyLDl9LHsyLDEwfSx7MiwxMX0sCi0gICB7MywwfSx7MywxfSx7MywyfSx7MywzfSx7Myw0fSx7Myw1fSx7Myw2fSx7Myw3fSx7Myw4fSx7Myw5fSx7MywxMH0sezMsMTF9Ci19OwotCi1zdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9sYXlvdXQgewotICAgICAgICBpbnQgbmF4ZXM7Ci0gICAgICAgIGludCBuaGF0czsKLSAgICAgICAgaW50IG5iYWxsczsKLSAgICAgICAgaW50IG5idXR0b25zOwotfTsKLQotc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCBtcDg4eHhfMV9sb2dpY2FsX2xheW91dFtdID0gewotICAgICAgICB7NiwgMCwgMCwgMTJ9Ci19Owotc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCBtcDg4eHhfMl9sb2dpY2FsX2xheW91dFtdID0gewotICAgICAgICB7NiwgMCwgMCwgMTJ9LAotICAgICAgICB7NiwgMCwgMCwgMTJ9Ci19Owotc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCBtcDg4eHhfM19sb2dpY2FsX2xheW91dFtdID0gewotICAgICAgICB7NiwgMCwgMCwgMTJ9LAotICAgICAgICB7NiwgMCwgMCwgMTJ9LAotICAgICAgICB7NiwgMCwgMCwgMTJ9Ci19Owotc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCBtcDg4eHhfNF9sb2dpY2FsX2xheW91dFtdID0gewotICAgICAgICB7NiwgMCwgMCwgMTJ9LAotICAgICAgICB7NiwgMCwgMCwgMTJ9LAotICAgICAgICB7NiwgMCwgMCwgMTJ9LAotICAgICAgICB7NiwgMCwgMCwgMTJ9Ci19OwotCi0vKgotICAgVGhpcyBhcnJheSBzZXRzIHVwIGEgbWVhbnMgb2YgbWFwcGluZyBhIHNpbmdsZSBwaHlzaWNhbCBqb3lzdGljayB0bwotICAgbXVsdGlwbGUgbG9naWNhbCBqb3lzdGlja3MuIChkam0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgbmpveXMKLSAgICAgICAgdGhlIG51bWJlciBvZiBsb2dpY2FsIGpveXN0aWNrcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGxheW91dHMKLSAgICAgICAgYW4gYXJyYXkgb2YgbGF5b3V0IHN0cnVjdHVyZXMsIG9uZSB0byBkZXNjcmliZSBlYWNoIGxvZ2ljYWwgam95c3RpY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBheGVzLCBoYXRzLCBiYWxscywgYnV0dG9ucwotICAgICAgICBhcnJheXMgdGhhdCBtYXAgYSBwaHlzaWNhbCB0aGluZ3kgdG8gYSBsb2dpY2FsIHRoaW5neQotICovCi1zdHJ1Y3Qgam95c3RpY2tfbG9naWNhbG1hcCB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IG5idXR0b25zOwotICAgICAgICBpbnQgbmpveXM7Ci0gICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCAqbGF5b3V0OwotICAgICAgICBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nICpheGlzbWFwOwotICAgICAgICBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nICpoYXRtYXA7Ci0gICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgKmJhbGxtYXA7Ci0gICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgKmJ1dHRvbm1hcDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbG1hcCBqb3lzdGlja19sb2dpY2FsbWFwW10gPSB7Ci0gICAgICAgIHsKLQkJIldpc2VHcm91cC4sTHRkIE1QLTg4NjYgRHVhbCBVU0IgSm95cGFkIiwKLQkJMTIsCi0JCTEsCi0JCW1wODh4eF8xX2xvZ2ljYWxfbGF5b3V0LAotICAgICAgICAJbXA4OHh4XzFfbG9naWNhbF9heGlzbWFwLAotCQlOVUxMLAotCQlOVUxMLAotICAgICAgICAJbXA4OHh4XzFfbG9naWNhbF9idXR0b25tYXAKLQl9LAotICAgICAgICB7Ci0JCSJXaXNlR3JvdXAuLEx0ZCBNUC04ODY2IER1YWwgVVNCIEpveXBhZCIsCi0JCTI0LAotCQkyLAotCQltcDg4eHhfMl9sb2dpY2FsX2xheW91dCwKLSAgICAgICAgCW1wODh4eF8yX2xvZ2ljYWxfYXhpc21hcCwKLQkJTlVMTCwKLQkJTlVMTCwKLSAgICAgICAgCW1wODh4eF8yX2xvZ2ljYWxfYnV0dG9ubWFwCi0JfSwKLSAgICAgICAgewotCQkiV2lzZUdyb3VwLixMdGQgTVAtODgwMCBRdWFkIFVTQiBKb3lwYWQiLAotCQkxMiwKLQkJMSwKLQkJbXA4OHh4XzFfbG9naWNhbF9sYXlvdXQsCi0gICAgICAgIAltcDg4eHhfMV9sb2dpY2FsX2F4aXNtYXAsCi0JCU5VTEwsCi0JCU5VTEwsCi0gICAgICAgIAltcDg4eHhfMV9sb2dpY2FsX2J1dHRvbm1hcAotCX0sCi0gICAgICAgIHsKLQkJIldpc2VHcm91cC4sTHRkIE1QLTg4MDAgUXVhZCBVU0IgSm95cGFkIiwKLQkJMjQsCi0JCTIsCi0JCW1wODh4eF8yX2xvZ2ljYWxfbGF5b3V0LAotICAgICAgICAJbXA4OHh4XzJfbG9naWNhbF9heGlzbWFwLAotCQlOVUxMLAotCQlOVUxMLAotICAgICAgICAJbXA4OHh4XzJfbG9naWNhbF9idXR0b25tYXAKLQl9LAotICAgICAgICB7Ci0JCSJXaXNlR3JvdXAuLEx0ZCBNUC04ODAwIFF1YWQgVVNCIEpveXBhZCIsCi0JCTM2LAotCQkzLAotCQltcDg4eHhfM19sb2dpY2FsX2xheW91dCwKLSAgICAgICAgCW1wODh4eF8zX2xvZ2ljYWxfYXhpc21hcCwKLQkJTlVMTCwKLQkJTlVMTCwKLSAgICAgICAgCW1wODh4eF8zX2xvZ2ljYWxfYnV0dG9ubWFwCi0JfSwKLSAgICAgICAgewotCQkiV2lzZUdyb3VwLixMdGQgTVAtODgwMCBRdWFkIFVTQiBKb3lwYWQiLAotCQk0OCwKLQkJNCwKLQkJbXA4OHh4XzRfbG9naWNhbF9sYXlvdXQsCi0gICAgICAgIAltcDg4eHhfNF9sb2dpY2FsX2F4aXNtYXAsCi0JCU5VTEwsCi0JCU5VTEwsCi0gICAgICAgIAltcDg4eHhfNF9sb2dpY2FsX2J1dHRvbm1hcAotCX0KLX07Ci0KLS8qIGZpbmQgdGhlIGhlYWQgb2YgYSBsaW5rZWQgbGlzdCwgZ2l2ZW4gYSBwb2ludCBpbiBpdAotICovCi0jZGVmaW5lIFNETF9qb3lsaXN0X2hlYWQoaSwgc3RhcnQpXAotICAgICAgICBmb3IoaSA9IHN0YXJ0OyBTRExfam95bGlzdFtpXS5mbmFtZSA9PSBOVUxMOykgaSA9IFNETF9qb3lsaXN0W2ldLnByZXY7Ci0KLSNkZWZpbmUgU0RMX2xvZ2ljYWxfam95ZGVjbChkKSBkCi0KLQotI2Vsc2UKLQotI2RlZmluZSBTRExfbG9naWNhbF9qb3lkZWNsKGQpCi0KLSNlbmRpZiAvKiBVU0VfTE9HSUNBTF9KT1lTVElDS1MgKi8KLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGpveXN0aWNrcyB3ZSdsbCBkZXRlY3QgKi8KLSNkZWZpbmUgTUFYX0pPWVNUSUNLUwkzMgotCi0vKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIGpveXN0aWNrcyAqLwotc3RhdGljIHN0cnVjdAotewotICAgICAgICBjaGFyKiBmbmFtZTsKLSNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKLSAgICAgICAgU0RMX0pveXN0aWNrKiBqb3k7Ci0gICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsbWFwKiBtYXA7Ci0gICAgICAgIGludCBwcmV2OwotICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgaW50IGxvZ2ljYWxubzsKLSNlbmRpZiAvKiBVU0VfTE9HSUNBTF9KT1lTVElDS1MgKi8KLX0gU0RMX2pveWxpc3RbTUFYX0pPWVNUSUNLU107Ci0KLQotLyogVGhlIHByaXZhdGUgc3RydWN0dXJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhIGpveXN0aWNrICovCi1zdHJ1Y3Qgam95c3RpY2tfaHdkYXRhIHsKLQlpbnQgZmQ7Ci0JLyogVGhlIGN1cnJlbnQgbGludXggam95c3RpY2sgZHJpdmVyIG1hcHMgaGF0cyB0byB0d28gYXhlcyAqLwotCXN0cnVjdCBod2RhdGFfaGF0IHsKLQkJaW50IGF4aXNbMl07Ci0JfSAqaGF0czsKLQkvKiBUaGUgY3VycmVudCBsaW51eCBqb3lzdGljayBkcml2ZXIgbWFwcyBiYWxscyB0byB0d28gYXhlcyAqLwotCXN0cnVjdCBod2RhdGFfYmFsbCB7Ci0JCWludCBheGlzWzJdOwotCX0gKmJhbGxzOwotCi0JLyogU3VwcG9ydCBmb3IgdGhlIExpbnV4IDIuNCB1bmlmaWVkIGlucHV0IGludGVyZmFjZSAqLwotI2lmIFNETF9JTlBVVF9MSU5VWEVWCi0JU0RMX2Jvb2wgaXNfaGlkOwotCVVpbnQ4IGtleV9tYXBbS0VZX01BWC1CVE5fTUlTQ107Ci0JVWludDggYWJzX21hcFtBQlNfTUFYXTsKLQlzdHJ1Y3QgYXhpc19jb3JyZWN0IHsKLQkJaW50IHVzZWQ7Ci0JCWludCBjb2VmWzNdOwotCX0gYWJzX2NvcnJlY3RbQUJTX01BWF07Ci0jZW5kaWYKLX07Ci0KLQotI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUwotCi1zdGF0aWMgaW50IENvdW50TG9naWNhbEpveXN0aWNrcyhpbnQgbWF4KQotewotICAgcmVnaXN0ZXIgaW50IGksIGosIGssIHJldCwgcHJldjsKLSAgIGNvbnN0IGNoYXIqIG5hbWU7Ci0gICBpbnQgbmJ1dHRvbnMsIGZkOwotICAgdW5zaWduZWQgY2hhciBuOwotCi0gICByZXQgPSAwOwotCi0gICBmb3IoaSA9IDA7IGkgPCBtYXg7IGkrKykgewotICAgICAgbmFtZSA9IFNETF9TWVNfSm95c3RpY2tOYW1lKGkpOwotCQotICAgICAgZmQgPSBvcGVuKFNETF9qb3lsaXN0W2ldLmZuYW1lLCBPX1JET05MWSwgMCk7Ci0gICAgICBpZiAoIGZkID49IDAgKSB7Ci0JIGlmICggaW9jdGwoZmQsIEpTSU9DR0JVVFRPTlMsICZuKSA8IDAgKSB7Ci0JICAgIG5idXR0b25zID0gLTE7Ci0JIH0gZWxzZSB7Ci0gICAgICAgICAgICBuYnV0dG9ucyA9IG47Ci0JIH0KLQkgY2xvc2UoZmQpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JIG5idXR0b25zPS0xOwotICAgICAgfQotCi0gICAgICBpZiAobmFtZSkgewotICAgICAgICAgZm9yKGogPSAwOyBqIDwgU0RMX2FycmF5c2l6ZShqb3lzdGlja19sb2dpY2FsbWFwKTsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoIVNETF9zdHJjbXAobmFtZSwgam95c3RpY2tfbG9naWNhbG1hcFtqXS5uYW1lKSAmJiAobmJ1dHRvbnM9PS0xIHx8IG5idXR0b25zPT1qb3lzdGlja19sb2dpY2FsbWFwW2pdLm5idXR0b25zKSkgewotICAgICAgICAgICAgICAgcHJldiA9IGk7Ci0gICAgICAgICAgICAgICBTRExfam95bGlzdFtwcmV2XS5tYXAgPSAmKGpveXN0aWNrX2xvZ2ljYWxtYXBbal0pOwotCi0gICAgICAgICAgICAgICBmb3IoayA9IDE7IGsgPCBqb3lzdGlja19sb2dpY2FsbWFwW2pdLm5qb3lzOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgIFNETF9qb3lsaXN0W3ByZXZdLm5leHQgPSBtYXggKyByZXQ7Ci0gICAgICAgICAgICAgICAgICBTRExfam95bGlzdFttYXgrcmV0XS5wcmV2ID0gcHJldjsKLQkJICAKLSAgICAgICAgICAgICAgICAgIHByZXYgPSBtYXggKyByZXQ7Ci0gICAgICAgICAgICAgICAgICBTRExfam95bGlzdFtwcmV2XS5sb2dpY2Fsbm8gPSBrOwotICAgICAgICAgICAgICAgICAgU0RMX2pveWxpc3RbcHJldl0ubWFwID0gJihqb3lzdGlja19sb2dpY2FsbWFwW2pdKTsKLSAgICAgICAgICAgICAgICAgIHJldCsrOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgTG9naWNhbFN1ZmZpeChpbnQgbG9naWNhbG5vLCBjaGFyKiBuYW1lYnVmLCBpbnQgbGVuKQotewotICAgcmVnaXN0ZXIgaW50IHNsZW47Ci0gICBjb25zdCBzdGF0aWMgY2hhciBzdWZmaXhzW10gPQotICAgICAgIjAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5IgotICAgICAgIjIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyIjsKLSAgIGNvbnN0IGNoYXIqIHN1ZmZpeDsKLSAgIHNsZW4gPSBTRExfc3RybGVuKG5hbWVidWYpOwotICAgc3VmZml4ID0gTlVMTDsKLQotICAgaWYgKGxvZ2ljYWxubyoyPHNpemVvZihzdWZmaXhzKSkKLSAgICAgIHN1ZmZpeCA9IHN1ZmZpeHMgKyAobG9naWNhbG5vKjIpOwotCi0gICBpZiAoc2xlbiArIDQgPCBsZW4gJiYgc3VmZml4KSB7Ci0gICAgICBuYW1lYnVmW3NsZW4rK10gPSAnICc7Ci0gICAgICBuYW1lYnVmW3NsZW4rK10gPSAnIyc7Ci0gICAgICBuYW1lYnVmW3NsZW4rK10gPSBzdWZmaXhbMF07Ci0gICAgICBuYW1lYnVmW3NsZW4rK10gPSBzdWZmaXhbMV07Ci0gICAgICBuYW1lYnVmW3NsZW4rK10gPSAwOwotICAgfQotfQotCi0jZW5kaWYgLyogVVNFX0xPR0lDQUxfSk9ZU1RJQ0tTICovCi0KLSNpZiBTRExfSU5QVVRfTElOVVhFVgotI2RlZmluZSB0ZXN0X2JpdChuciwgYWRkcikgXAotCSgoKDFVTCA8PCAoKG5yKSAmIDMxKSkgJiAoKChjb25zdCB1bnNpZ25lZCBpbnQgKikgYWRkcilbKG5yKSA+PiA1XSkpICE9IDApCi0KLXN0YXRpYyBpbnQgRVZfSXNKb3lzdGljayhpbnQgZmQpCi17Ci0JdW5zaWduZWQgbG9uZyBldmJpdFs0MF07Ci0JdW5zaWduZWQgbG9uZyBrZXliaXRbNDBdOwotCXVuc2lnbmVkIGxvbmcgYWJzYml0WzQwXTsKLQotCWlmICggKGlvY3RsKGZkLCBFVklPQ0dCSVQoMCwgc2l6ZW9mKGV2Yml0KSksIGV2Yml0KSA8IDApIHx8Ci0JICAgICAoaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9LRVksIHNpemVvZihrZXliaXQpKSwga2V5Yml0KSA8IDApIHx8Ci0JICAgICAoaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9BQlMsIHNpemVvZihhYnNiaXQpKSwgYWJzYml0KSA8IDApICkgewotCQlyZXR1cm4oMCk7Ci0JfQotCWlmICghKHRlc3RfYml0KEVWX0tFWSwgZXZiaXQpICYmIHRlc3RfYml0KEVWX0FCUywgZXZiaXQpICYmCi0JICAgICAgdGVzdF9iaXQoQUJTX1gsIGFic2JpdCkgJiYgdGVzdF9iaXQoQUJTX1ksIGFic2JpdCkgJiYKLQkgICAgICh0ZXN0X2JpdChCVE5fVFJJR0dFUiwga2V5Yml0KSB8fCB0ZXN0X2JpdChCVE5fQSwga2V5Yml0KSB8fCB0ZXN0X2JpdChCVE5fMSwga2V5Yml0KSkpKSByZXR1cm4gMDsKLQlyZXR1cm4oMSk7Ci19Ci0KLSNlbmRpZiAvKiBTRExfSU5QVVRfTElOVVhFViAqLwotCi0vKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIGpveXN0aWNrcyAqLwotaW50IFNETF9TWVNfSm95c3RpY2tJbml0KHZvaWQpCi17Ci0JLyogVGhlIGJhc2UgcGF0aCBvZiB0aGUgam95c3RpY2sgZGV2aWNlcyAqLwotCWNvbnN0IGNoYXIgKmpveWRldl9wYXR0ZXJuW10gPSB7Ci0jaWYgU0RMX0lOUFVUX0xJTlVYRVYKLQkJIi9kZXYvaW5wdXQvZXZlbnQlZCIsCi0jZW5kaWYKLQkJIi9kZXYvaW5wdXQvanMlZCIsCi0JCSIvZGV2L2pzJWQiCi0JfTsKLQlpbnQgbnVtam95c3RpY2tzOwotCWludCBpLCBqOwotCWludCBmZDsKLQljaGFyIHBhdGhbUEFUSF9NQVhdOwotCWRldl90IGRldl9udW1zW01BWF9KT1lTVElDS1NdOyAgLyogbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlcnMgKi8KLQlzdHJ1Y3Qgc3RhdCBzYjsKLQlpbnQgbiwgZHVwbGljYXRlOwotCi0JbnVtam95c3RpY2tzID0gMDsKLQotCS8qIEZpcnN0IHNlZSBpZiB0aGUgdXNlciBzcGVjaWZpZWQgYSBqb3lzdGljayB0byB1c2UgKi8KLQlpZiAoIFNETF9nZXRlbnYoIlNETF9KT1lTVElDS19ERVZJQ0UiKSAhPSBOVUxMICkgewotCQlTRExfc3RybGNweShwYXRoLCBTRExfZ2V0ZW52KCJTRExfSk9ZU1RJQ0tfREVWSUNFIiksIHNpemVvZihwYXRoKSk7Ci0JCWlmICggc3RhdChwYXRoLCAmc2IpID09IDAgKSB7Ci0JCQlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFksIDApOwotCQkJaWYgKCBmZCA+PSAwICkgewotCQkJCS8qIEFzc3VtZSB0aGUgdXNlciBrbm93cyB3aGF0IHRoZXkncmUgZG9pbmcuICovCi0JCQkJU0RMX2pveWxpc3RbbnVtam95c3RpY2tzXS5mbmFtZSA9IFNETF9zdHJkdXAocGF0aCk7Ci0JCQkJaWYgKCBTRExfam95bGlzdFtudW1qb3lzdGlja3NdLmZuYW1lICkgewotCQkJCQlkZXZfbnVtc1tudW1qb3lzdGlja3NdID0gc2Iuc3RfcmRldjsKLQkJCQkJKytudW1qb3lzdGlja3M7Ci0JCQkJfQotCQkJCWNsb3NlKGZkKTsKLQkJCX0KLQkJfQotCX0KLQotCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKGpveWRldl9wYXR0ZXJuKTsgKytpICkgewotCQlmb3IgKCBqPTA7IGogPCBNQVhfSk9ZU1RJQ0tTOyArK2ogKSB7Ci0JCQlTRExfc25wcmludGYocGF0aCwgU0RMX2FycmF5c2l6ZShwYXRoKSwgam95ZGV2X3BhdHRlcm5baV0sIGopOwotCi0JCQkvKiByY2cwNjMwMjAwMCByZXBsYWNlZCBhY2Nlc3MoRl9PSykgY2FsbCB3aXRoIHN0YXQoKS4KLQkJCSAqIHN0YXQoKSB3aWxsIGZhaWwgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgc28gaXQncwotCQkJICogZXF1aXZhbGVudCBiZWhhdmlvdXIuCi0JCQkgKi8KLQkJCWlmICggc3RhdChwYXRoLCAmc2IpID09IDAgKSB7Ci0JCQkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGl0J3Mgbm90IGFscmVhZHkgaW4gbGlzdC4KLQkJCQkgKiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBzZWUgYSBzdGljayB2aWEgc3ltbGluay4KLQkJCQkgKi8KLQkJCQlkdXBsaWNhdGUgPSAwOwotCQkJCWZvciAobj0wOyAobjxudW1qb3lzdGlja3MpICYmICFkdXBsaWNhdGU7ICsrbikgewotCQkJCQlpZiAoIHNiLnN0X3JkZXYgPT0gZGV2X251bXNbbl0gKSB7Ci0JCQkJCQlkdXBsaWNhdGUgPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkdXBsaWNhdGUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZLCAwKTsKLQkJCQlpZiAoIGZkIDwgMCApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotI2lmIFNETF9JTlBVVF9MSU5VWEVWCi0jaWZkZWYgREVCVUdfSU5QVVRfRVZFTlRTCi0JCQkJcHJpbnRmKCJDaGVja2luZyAlc1xuIiwgcGF0aCk7Ci0jZW5kaWYKLQkJCQlpZiAoIChpID09IDApICYmICEgRVZfSXNKb3lzdGljayhmZCkgKSB7Ci0JCQkJCWNsb3NlKGZkKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotI2VuZGlmCi0JCQkJY2xvc2UoZmQpOwotCi0JCQkJLyogV2UncmUgZmluZSwgYWRkIHRoaXMgam95c3RpY2sgKi8KLQkJCQlTRExfam95bGlzdFtudW1qb3lzdGlja3NdLmZuYW1lID0gU0RMX3N0cmR1cChwYXRoKTsKLQkJCQlpZiAoIFNETF9qb3lsaXN0W251bWpveXN0aWNrc10uZm5hbWUgKSB7Ci0JCQkJCWRldl9udW1zW251bWpveXN0aWNrc10gPSBzYi5zdF9yZGV2OwotCQkJCQkrK251bWpveXN0aWNrczsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlicmVhazsKLQkJfQotCi0jaWYgU0RMX0lOUFVUX0xJTlVYRVYKLQkJLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4uLgotCQkgICBJZiB0aGUgZXZlbnQgZGV2aWNlcyBhcmUgdmFsaWQgdGhlbiB0aGUgam95c3RpY2sgZGV2aWNlcwotCQkgICB3aWxsIGJlIGR1cGxpY2F0ZXMgYnV0IHdpdGhvdXQgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIKLQkJICAgaGF0cyBvciBiYWxscy4gVW5mb3J0dW5hdGVseSwgdGhlIGV2ZW50IGRldmljZXMgY2FuJ3QKLQkJICAgY3VycmVudGx5IGJlIGNhbGlicmF0ZWQsIHNvIGl0J3MgYSB3aW4tbG9zZSBzaXR1YXRpb24uCi0JCSAgIFNvIDogL2Rldi9pbnB1dC9ldmVudFggPSAvZGV2L2lucHV0L2pzWSA9IC9kZXYvanNZCi0JCSovCi0JCWlmICggKGkgPT0gMCkgJiYgKG51bWpveXN0aWNrcyA+IDApICkKLQkJCWJyZWFrOwotI2VuZGlmCi0JfQotI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUwotCW51bWpveXN0aWNrcyArPSBDb3VudExvZ2ljYWxKb3lzdGlja3MobnVtam95c3RpY2tzKTsKLSNlbmRpZgotCi0JcmV0dXJuKG51bWpveXN0aWNrcyk7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGdldCB0aGUgZGV2aWNlLWRlcGVuZGVudCBuYW1lIG9mIGEgam95c3RpY2sgKi8KLWNvbnN0IGNoYXIgKlNETF9TWVNfSm95c3RpY2tOYW1lKGludCBpbmRleCkKLXsKLQlpbnQgZmQ7Ci0Jc3RhdGljIGNoYXIgbmFtZWJ1ZlsxMjhdOwotCWNoYXIgKm5hbWU7Ci0JU0RMX2xvZ2ljYWxfam95ZGVjbChpbnQgb2luZGV4ID0gaW5kZXgpOwotCi0jaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCi0JU0RMX2pveWxpc3RfaGVhZChpbmRleCwgaW5kZXgpOwotI2VuZGlmCi0JbmFtZSA9IE5VTEw7Ci0JZmQgPSBvcGVuKFNETF9qb3lsaXN0W2luZGV4XS5mbmFtZSwgT19SRE9OTFksIDApOwotCWlmICggZmQgPj0gMCApIHsKLQkJaWYgKCAKLSNpZiBTRExfSU5QVVRfTElOVVhFVgotCQkgICAgIChpb2N0bChmZCwgRVZJT0NHTkFNRShzaXplb2YobmFtZWJ1ZikpLCBuYW1lYnVmKSA8PSAwKSAmJgotI2VuZGlmCi0JCSAgICAgKGlvY3RsKGZkLCBKU0lPQ0dOQU1FKHNpemVvZihuYW1lYnVmKSksIG5hbWVidWYpIDw9IDApICkgewotCQkJbmFtZSA9IFNETF9qb3lsaXN0W2luZGV4XS5mbmFtZTsKLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSBuYW1lYnVmOwotCQl9Ci0JCWNsb3NlKGZkKTsKLQotCi0jaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCi0JCWlmIChTRExfam95bGlzdFtvaW5kZXhdLnByZXYgfHwgU0RMX2pveWxpc3Rbb2luZGV4XS5uZXh0IHx8IGluZGV4IT1vaW5kZXgpCi0JCXsKLSAgICAgICAJCSAgIExvZ2ljYWxTdWZmaXgoU0RMX2pveWxpc3Rbb2luZGV4XS5sb2dpY2Fsbm8sIG5hbWVidWYsIDEyOCk7Ci0JCX0KLSNlbmRpZgotCX0KLQlyZXR1cm4gbmFtZTsKLX0KLQotc3RhdGljIGludCBhbGxvY2F0ZV9oYXRkYXRhKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JaW50IGk7Ci0KLQlqb3lzdGljay0+aHdkYXRhLT5oYXRzID0gKHN0cnVjdCBod2RhdGFfaGF0ICopU0RMX21hbGxvYygKLQkJam95c3RpY2stPm5oYXRzICogc2l6ZW9mKHN0cnVjdCBod2RhdGFfaGF0KSk7Ci0JaWYgKCBqb3lzdGljay0+aHdkYXRhLT5oYXRzID09IE5VTEwgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCWZvciAoIGk9MDsgaTxqb3lzdGljay0+bmhhdHM7ICsraSApIHsKLQkJam95c3RpY2stPmh3ZGF0YS0+aGF0c1tpXS5heGlzWzBdID0gMTsKLQkJam95c3RpY2stPmh3ZGF0YS0+aGF0c1tpXS5heGlzWzFdID0gMTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IGFsbG9jYXRlX2JhbGxkYXRhKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JaW50IGk7Ci0KLQlqb3lzdGljay0+aHdkYXRhLT5iYWxscyA9IChzdHJ1Y3QgaHdkYXRhX2JhbGwgKilTRExfbWFsbG9jKAotCQlqb3lzdGljay0+bmJhbGxzICogc2l6ZW9mKHN0cnVjdCBod2RhdGFfYmFsbCkpOwotCWlmICggam95c3RpY2stPmh3ZGF0YS0+YmFsbHMgPT0gTlVMTCApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JZm9yICggaT0wOyBpPGpveXN0aWNrLT5uYmFsbHM7ICsraSApIHsKLQkJam95c3RpY2stPmh3ZGF0YS0+YmFsbHNbaV0uYXhpc1swXSA9IDA7Ci0JCWpveXN0aWNrLT5od2RhdGEtPmJhbGxzW2ldLmF4aXNbMV0gPSAwOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBTRExfYm9vbCBKU19Db25maWdKb3lzdGljayhTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgZmQpCi17Ci0JU0RMX2Jvb2wgaGFuZGxlZDsKLQl1bnNpZ25lZCBjaGFyIG47Ci0JaW50IG9sZF9heGVzLCB0bXBfbmF4ZXMsIHRtcF9uaGF0cywgdG1wX25iYWxsczsKLQljb25zdCBjaGFyICpuYW1lOwotCWNoYXIgKmVudiwgZW52X25hbWVbMTI4XTsKLQlpbnQgaTsKLQotCWhhbmRsZWQgPSBTRExfRkFMU0U7Ci0KLQkvKiBEZWZhdWx0IGpveXN0aWNrIGRldmljZSBzZXR0aW5ncyAqLwotCWlmICggaW9jdGwoZmQsIEpTSU9DR0FYRVMsICZuKSA8IDAgKSB7Ci0JCWpveXN0aWNrLT5uYXhlcyA9IDI7Ci0JfSBlbHNlIHsKLQkJam95c3RpY2stPm5heGVzID0gbjsKLQl9Ci0JaWYgKCBpb2N0bChmZCwgSlNJT0NHQlVUVE9OUywgJm4pIDwgMCApIHsKLQkJam95c3RpY2stPm5idXR0b25zID0gMjsKLQl9IGVsc2UgewotCQlqb3lzdGljay0+bmJ1dHRvbnMgPSBuOwotCX0KLQotCW5hbWUgPSBTRExfU1lTX0pveXN0aWNrTmFtZShqb3lzdGljay0+aW5kZXgpOwotCW9sZF9heGVzID0gam95c3RpY2stPm5heGVzOwotCi0JLyogR2VuZXJpYyBhbmFsb2cgam95c3RpY2sgc3VwcG9ydCAqLwotCWlmICggU0RMX3N0cnN0cihuYW1lLCAiQW5hbG9nIikgPT0gbmFtZSAmJiBTRExfc3Ryc3RyKG5hbWUsICItaGF0IikgKSB7Ci0JCWlmICggU0RMX3NzY2FuZihuYW1lLCJBbmFsb2cgJWQtYXhpcyAlKmQtYnV0dG9uICVkLWhhdCIsCi0JCQkmdG1wX25heGVzLCAmdG1wX25oYXRzKSA9PSAyICkgewotCi0JCQlqb3lzdGljay0+bmF4ZXMgPSB0bXBfbmF4ZXM7Ci0JCQlqb3lzdGljay0+bmhhdHMgPSB0bXBfbmhhdHM7Ci0KLQkJCWhhbmRsZWQgPSBTRExfVFJVRTsKLQkJfQotCX0KLQotCS8qIFNwZWNpYWwgam95c3RpY2sgc3VwcG9ydCAqLwotCWZvciAoIGk9MDsgaSA8IFNETF9hcnJheXNpemUoc3BlY2lhbF9qb3lzdGlja3MpOyArK2kgKSB7Ci0JCWlmICggU0RMX3N0cmNtcChuYW1lLCBzcGVjaWFsX2pveXN0aWNrc1tpXS5uYW1lKSA9PSAwICkgewotCi0JCQlqb3lzdGljay0+bmF4ZXMgPSBzcGVjaWFsX2pveXN0aWNrc1tpXS5uYXhlczsKLQkJCWpveXN0aWNrLT5uaGF0cyA9IHNwZWNpYWxfam95c3RpY2tzW2ldLm5oYXRzOwotCQkJam95c3RpY2stPm5iYWxscyA9IHNwZWNpYWxfam95c3RpY2tzW2ldLm5iYWxsczsKLQotCQkJaGFuZGxlZCA9IFNETF9UUlVFOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBVc2VyIGVudmlyb25tZW50IGpveXN0aWNrIHN1cHBvcnQgKi8KLQlpZiAoIChlbnYgPSBTRExfZ2V0ZW52KCJTRExfTElOVVhfSk9ZU1RJQ0siKSkgKSB7Ci0JCSplbnZfbmFtZSA9ICdcMCc7Ci0JCWlmICggKmVudiA9PSAnXCcnICYmIFNETF9zc2NhbmYoZW52LCAiJyVbXiddcyciLCBlbnZfbmFtZSkgPT0gMSApCi0JCQllbnYgKz0gU0RMX3N0cmxlbihlbnZfbmFtZSkrMjsKLQkJZWxzZSBpZiAoIFNETF9zc2NhbmYoZW52LCAiJXMiLCBlbnZfbmFtZSkgPT0gMSApCi0JCQllbnYgKz0gU0RMX3N0cmxlbihlbnZfbmFtZSk7Ci0KLQkJaWYgKCBTRExfc3RyY21wKG5hbWUsIGVudl9uYW1lKSA9PSAwICkgewotCi0JCQlpZiAoIFNETF9zc2NhbmYoZW52LCAiJWQgJWQgJWQiLCAmdG1wX25heGVzLCAmdG1wX25oYXRzLAotCQkJCSZ0bXBfbmJhbGxzKSA9PSAzICkgewotCi0JCQkJam95c3RpY2stPm5heGVzID0gdG1wX25heGVzOwotCQkJCWpveXN0aWNrLT5uaGF0cyA9IHRtcF9uaGF0czsKLQkJCQlqb3lzdGljay0+bmJhbGxzID0gdG1wX25iYWxsczsKLQotCQkJCWhhbmRsZWQgPSBTRExfVFJVRTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFJlbWFwIGhhdHMgYW5kIGJhbGxzICovCi0JaWYgKGhhbmRsZWQpIHsKLQkJaWYgKCBqb3lzdGljay0+bmhhdHMgPiAwICkgewotCQkJaWYgKCBhbGxvY2F0ZV9oYXRkYXRhKGpveXN0aWNrKSA8IDAgKSB7Ci0JCQkJam95c3RpY2stPm5oYXRzID0gMDsKLQkJCX0KLQkJfQotCQlpZiAoIGpveXN0aWNrLT5uYmFsbHMgPiAwICkgewotCQkJaWYgKCBhbGxvY2F0ZV9iYWxsZGF0YShqb3lzdGljaykgPCAwICkgewotCQkJCWpveXN0aWNrLT5uYmFsbHMgPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuKGhhbmRsZWQpOwotfQotCi0jaWYgU0RMX0lOUFVUX0xJTlVYRVYKLQotc3RhdGljIFNETF9ib29sIEVWX0NvbmZpZ0pveXN0aWNrKFNETF9Kb3lzdGljayAqam95c3RpY2ssIGludCBmZCkKLXsKLQlpbnQgaSwgdDsKLQl1bnNpZ25lZCBsb25nIGtleWJpdFs0MF07Ci0JdW5zaWduZWQgbG9uZyBhYnNiaXRbNDBdOwotCXVuc2lnbmVkIGxvbmcgcmVsYml0WzQwXTsKLQotCS8qIFNlZSBpZiB0aGlzIGRldmljZSB1c2VzIHRoZSBuZXcgdW5pZmllZCBldmVudCBBUEkgKi8KLQlpZiAoIChpb2N0bChmZCwgRVZJT0NHQklUKEVWX0tFWSwgc2l6ZW9mKGtleWJpdCkpLCBrZXliaXQpID49IDApICYmCi0JICAgICAoaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9BQlMsIHNpemVvZihhYnNiaXQpKSwgYWJzYml0KSA+PSAwKSAmJgotCSAgICAgKGlvY3RsKGZkLCBFVklPQ0dCSVQoRVZfUkVMLCBzaXplb2YocmVsYml0KSksIHJlbGJpdCkgPj0gMCkgKSB7Ci0JCWpveXN0aWNrLT5od2RhdGEtPmlzX2hpZCA9IFNETF9UUlVFOwotCi0JCS8qIEdldCB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMsIGF4ZXMsIGFuZCBvdGhlciB0aGluZ2FtYWppZ3MgKi8KLQkJZm9yICggaT1CVE5fSk9ZU1RJQ0s7IGkgPCBLRVlfTUFYOyArK2kgKSB7Ci0JCQlpZiAoIHRlc3RfYml0KGksIGtleWJpdCkgKSB7Ci0jaWZkZWYgREVCVUdfSU5QVVRfRVZFTlRTCi0JCQkJcHJpbnRmKCJKb3lzdGljayBoYXMgYnV0dG9uOiAweCV4XG4iLCBpKTsKLSNlbmRpZgotCQkJCWpveXN0aWNrLT5od2RhdGEtPmtleV9tYXBbaS1CVE5fTUlTQ10gPQotCQkJCQkJam95c3RpY2stPm5idXR0b25zOwotCQkJCSsram95c3RpY2stPm5idXR0b25zOwotCQkJfQotCQl9Ci0JCWZvciAoIGk9QlROX01JU0M7IGkgPCBCVE5fSk9ZU1RJQ0s7ICsraSApIHsKLQkJCWlmICggdGVzdF9iaXQoaSwga2V5Yml0KSApIHsKLSNpZmRlZiBERUJVR19JTlBVVF9FVkVOVFMKLQkJCQlwcmludGYoIkpveXN0aWNrIGhhcyBidXR0b246IDB4JXhcbiIsIGkpOwotI2VuZGlmCi0JCQkJam95c3RpY2stPmh3ZGF0YS0+a2V5X21hcFtpLUJUTl9NSVNDXSA9Ci0JCQkJCQlqb3lzdGljay0+bmJ1dHRvbnM7Ci0JCQkJKytqb3lzdGljay0+bmJ1dHRvbnM7Ci0JCQl9Ci0JCX0KLQkJZm9yICggaT0wOyBpPEFCU19NQVg7ICsraSApIHsKLQkJCS8qIFNraXAgaGF0cyAqLwotCQkJaWYgKCBpID09IEFCU19IQVQwWCApIHsKLQkJCQlpID0gQUJTX0hBVDNZOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKCB0ZXN0X2JpdChpLCBhYnNiaXQpICkgewotCQkJCWludCB2YWx1ZXNbNV07Ci0KLQkJCQlpZiAoIGlvY3RsKGZkLCBFVklPQ0dBQlMoaSksIHZhbHVlcykgPCAwICkKLQkJCQkJY29udGludWU7Ci0jaWZkZWYgREVCVUdfSU5QVVRfRVZFTlRTCi0JCQkJcHJpbnRmKCJKb3lzdGljayBoYXMgYWJzb2x1dGUgYXhpczogJXhcbiIsIGkpOwotCQkJCXByaW50ZigiVmFsdWVzID0geyAlZCwgJWQsICVkLCAlZCwgJWQgfVxuIiwKLQkJCQkJdmFsdWVzWzBdLCB2YWx1ZXNbMV0sCi0JCQkJCXZhbHVlc1syXSwgdmFsdWVzWzNdLCB2YWx1ZXNbNF0pOwotI2VuZGlmIC8qIERFQlVHX0lOUFVUX0VWRU5UUyAqLwotCQkJCWpveXN0aWNrLT5od2RhdGEtPmFic19tYXBbaV0gPSBqb3lzdGljay0+bmF4ZXM7Ci0JCQkJaWYgKCB2YWx1ZXNbMV0gPT0gdmFsdWVzWzJdICkgewotCQkJCSAgICBqb3lzdGljay0+aHdkYXRhLT5hYnNfY29ycmVjdFtpXS51c2VkID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCSAgICBqb3lzdGljay0+aHdkYXRhLT5hYnNfY29ycmVjdFtpXS51c2VkID0gMTsKLQkJCQkgICAgam95c3RpY2stPmh3ZGF0YS0+YWJzX2NvcnJlY3RbaV0uY29lZlswXSA9Ci0JCQkJCSh2YWx1ZXNbMl0gKyB2YWx1ZXNbMV0pIC8gMiAtIHZhbHVlc1s0XTsKLQkJCQkgICAgam95c3RpY2stPmh3ZGF0YS0+YWJzX2NvcnJlY3RbaV0uY29lZlsxXSA9Ci0JCQkJCSh2YWx1ZXNbMl0gKyB2YWx1ZXNbMV0pIC8gMiArIHZhbHVlc1s0XTsKLQkJCQkgICAgdCA9ICgodmFsdWVzWzJdIC0gdmFsdWVzWzFdKSAvIDIgLSAyICogdmFsdWVzWzRdKTsKLQkJCQkgICAgaWYgKCB0ICE9IDAgKSB7Ci0JCQkJCWpveXN0aWNrLT5od2RhdGEtPmFic19jb3JyZWN0W2ldLmNvZWZbMl0gPSAoMSA8PCAyOSkgLyB0OwotCQkJCSAgICB9IGVsc2UgewotCQkJCQlqb3lzdGljay0+aHdkYXRhLT5hYnNfY29ycmVjdFtpXS5jb2VmWzJdID0gMDsKLQkJCQkgICAgfQotCQkJCX0KLQkJCQkrK2pveXN0aWNrLT5uYXhlczsKLQkJCX0KLQkJfQotCQlmb3IgKCBpPUFCU19IQVQwWDsgaSA8PSBBQlNfSEFUM1k7IGkgKz0gMiApIHsKLQkJCWlmICggdGVzdF9iaXQoaSwgYWJzYml0KSB8fCB0ZXN0X2JpdChpKzEsIGFic2JpdCkgKSB7Ci0jaWZkZWYgREVCVUdfSU5QVVRfRVZFTlRTCi0JCQkJcHJpbnRmKCJKb3lzdGljayBoYXMgaGF0ICVkXG4iLChpLUFCU19IQVQwWCkvMik7Ci0jZW5kaWYKLQkJCQkrK2pveXN0aWNrLT5uaGF0czsKLQkJCX0KLQkJfQotCQlpZiAoIHRlc3RfYml0KFJFTF9YLCByZWxiaXQpIHx8IHRlc3RfYml0KFJFTF9ZLCByZWxiaXQpICkgewotCQkJKytqb3lzdGljay0+bmJhbGxzOwotCQl9Ci0KLQkJLyogQWxsb2NhdGUgZGF0YSB0byBrZWVwIHRyYWNrIG9mIHRoZXNlIHRoaW5nYW1hamlncyAqLwotCQlpZiAoIGpveXN0aWNrLT5uaGF0cyA+IDAgKSB7Ci0JCQlpZiAoIGFsbG9jYXRlX2hhdGRhdGEoam95c3RpY2spIDwgMCApIHsKLQkJCQlqb3lzdGljay0+bmhhdHMgPSAwOwotCQkJfQotCQl9Ci0JCWlmICggam95c3RpY2stPm5iYWxscyA+IDAgKSB7Ci0JCQlpZiAoIGFsbG9jYXRlX2JhbGxkYXRhKGpveXN0aWNrKSA8IDAgKSB7Ci0JCQkJam95c3RpY2stPm5iYWxscyA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuKGpveXN0aWNrLT5od2RhdGEtPmlzX2hpZCk7Ci19Ci0KLSNlbmRpZiAvKiBTRExfSU5QVVRfTElOVVhFViAqLwotCi0jaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCi1zdGF0aWMgdm9pZCBDb25maWdMb2dpY2FsSm95c3RpY2soU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLSAgICAgICAgc3RydWN0IGpveXN0aWNrX2xvZ2ljYWxfbGF5b3V0KiBsYXlvdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBsYXlvdXQgPSBTRExfam95bGlzdFtqb3lzdGljay0+aW5kZXhdLm1hcC0+bGF5b3V0ICsKLSAgICAgICAgICAgICAgICBTRExfam95bGlzdFtqb3lzdGljay0+aW5kZXhdLmxvZ2ljYWxubzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGpveXN0aWNrLT5uYnV0dG9ucyA9IGxheW91dC0+bmJ1dHRvbnM7Ci0gICAgICAgIGpveXN0aWNrLT5uaGF0cyA9IGxheW91dC0+bmhhdHM7Ci0gICAgICAgIGpveXN0aWNrLT5uYXhlcyA9IGxheW91dC0+bmF4ZXM7Ci0gICAgICAgIGpveXN0aWNrLT5uYmFsbHMgPSBsYXlvdXQtPm5iYWxsczsKLX0KLSNlbmRpZgotCi0KLS8qIEZ1bmN0aW9uIHRvIG9wZW4gYSBqb3lzdGljayBmb3IgdXNlLgotICAgVGhlIGpveXN0aWNrIHRvIG9wZW4gaXMgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCBmaWVsZCBvZiB0aGUgam95c3RpY2suCi0gICBUaGlzIHNob3VsZCBmaWxsIHRoZSBuYnV0dG9ucyBhbmQgbmF4ZXMgZmllbGRzIG9mIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUuCi0gICBJdCByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIGlzIGFuIGVycm9yLgotICovCi1pbnQgU0RMX1NZU19Kb3lzdGlja09wZW4oU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLQlpbnQgZmQ7Ci0JU0RMX2xvZ2ljYWxfam95ZGVjbChpbnQgcmVhbGluZGV4KTsKLQlTRExfbG9naWNhbF9qb3lkZWNsKFNETF9Kb3lzdGljayAqcmVhbGpveSA9IE5VTEwpOwotCi0JLyogT3BlbiB0aGUgam95c3RpY2sgYW5kIHNldCB0aGUgam95c3RpY2sgZmlsZSBkZXNjcmlwdG9yICovCi0jaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCi0JaWYgKFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0uZm5hbWUgPT0gTlVMTCkgewotCQlTRExfam95bGlzdF9oZWFkKHJlYWxpbmRleCwgam95c3RpY2stPmluZGV4KTsKLQkJcmVhbGpveSA9IFNETF9Kb3lzdGlja09wZW4ocmVhbGluZGV4KTsKLQotCQlpZiAocmVhbGpveSA9PSBOVUxMKQotCQkJcmV0dXJuKC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCWZkID0gcmVhbGpveS0+aHdkYXRhLT5mZDsKLQotCX0gZWxzZSB7Ci0JCWZkID0gb3BlbihTRExfam95bGlzdFtqb3lzdGljay0+aW5kZXhdLmZuYW1lLCBPX1JET05MWSwgMCk7Ci0JfQotCVNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0uam95ID0gam95c3RpY2s7Ci0jZWxzZQotCWZkID0gb3BlbihTRExfam95bGlzdFtqb3lzdGljay0+aW5kZXhdLmZuYW1lLCBPX1JET05MWSwgMCk7Ci0jZW5kaWYKLQotCWlmICggZmQgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBvcGVuICVzXG4iLAotCQkgICAgICAgICAgICAgU0RMX2pveWxpc3Rbam95c3RpY2stPmluZGV4XSk7Ci0JCXJldHVybigtMSk7Ci0JfQotCWpveXN0aWNrLT5od2RhdGEgPSAoc3RydWN0IGpveXN0aWNrX2h3ZGF0YSAqKQotCSAgICAgICAgICAgICAgICAgICBTRExfbWFsbG9jKHNpemVvZigqam95c3RpY2stPmh3ZGF0YSkpOwotCWlmICggam95c3RpY2stPmh3ZGF0YSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbWVtc2V0KGpveXN0aWNrLT5od2RhdGEsIDAsIHNpemVvZigqam95c3RpY2stPmh3ZGF0YSkpOwotCWpveXN0aWNrLT5od2RhdGEtPmZkID0gZmQ7Ci0KLQkvKiBTZXQgdGhlIGpveXN0aWNrIHRvIG5vbi1ibG9ja2luZyByZWFkIG1vZGUgKi8KLQlmY250bChmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7Ci0KLQkvKiBHZXQgdGhlIG51bWJlciBvZiBidXR0b25zIGFuZCBheGVzIG9uIHRoZSBqb3lzdGljayAqLwotI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUwotCWlmIChyZWFsam95KQotCQlDb25maWdMb2dpY2FsSm95c3RpY2soam95c3RpY2spOwotCWVsc2UKLSNlbmRpZgotI2lmIFNETF9JTlBVVF9MSU5VWEVWCi0JaWYgKCAhIEVWX0NvbmZpZ0pveXN0aWNrKGpveXN0aWNrLCBmZCkgKQotI2VuZGlmCi0JCUpTX0NvbmZpZ0pveXN0aWNrKGpveXN0aWNrLCBmZCk7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLSNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKLQotc3RhdGljIFNETF9Kb3lzdGljayogRmluZExvZ2ljYWxKb3lzdGljaygKLSAgIFNETF9Kb3lzdGljayAqam95c3RpY2ssIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcqIHYpCi17Ci0gICAgICAgIFNETF9Kb3lzdGljayAqbG9naWNhbGpveTsKLSAgICAgICAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgICAgICAgaSA9IGpveXN0aWNrLT5pbmRleDsKLSAgICAgICAgbG9naWNhbGpveSA9IE5VTEw7Ci0KLSAgICAgICAgLyogZ2V0IHRoZSBmYWtlIGpveXN0aWNrIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBldmVudAotICAgICAgICAgKi8KLSAgICAgICAgZm9yKDs7KSB7Ci0KLSAgICAgICAgICAgaWYgKFNETF9qb3lsaXN0W2ldLmxvZ2ljYWxubyA9PSB2LT5uam95KSB7Ci0gICAgICAgICAgICAgIGxvZ2ljYWxqb3kgPSBTRExfam95bGlzdFtpXS5qb3k7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgaWYgKFNETF9qb3lsaXN0W2ldLm5leHQgPT0gMCkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgaSA9IFNETF9qb3lsaXN0W2ldLm5leHQ7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsb2dpY2Fsam95OwotfQotCi1zdGF0aWMgaW50IExvZ2ljYWxKb3lzdGlja0J1dHRvbigKLSAgIFNETF9Kb3lzdGljayAqam95c3RpY2ssIFVpbnQ4IGJ1dHRvbiwgVWludDggc3RhdGUpewotICAgICAgICBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nKiBidXR0b25zOwotICAgICAgICBTRExfSm95c3RpY2sgKmxvZ2ljYWxqb3kgPSBOVUxMOwotCi0gICAgICAgIC8qIGlmIHRoZXJlJ3Mgbm8gbWFwIHRoZW4gdGhpcyBpcyBqdXN0IGEgcmVndWxhciBqb3lzdGljawotICAgICAgICAgKi8KLSAgICAgICAgaWYgKFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0ubWFwID09IE5VTEwpCi0gICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8qIGdldCB0aGUgbG9naWNhbCBqb3lzdGljayB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgZXZlbnQKLSAgICAgICAgICovCi0gICAgICAgIGJ1dHRvbnMgPSBTRExfam95bGlzdFtqb3lzdGljay0+aW5kZXhdLm1hcC0+YnV0dG9ubWFwK2J1dHRvbjsKLSAgICAgICAgbG9naWNhbGpveSA9IEZpbmRMb2dpY2FsSm95c3RpY2soam95c3RpY2ssIGJ1dHRvbnMpOwotCi0gICAgICAgIGlmIChsb2dpY2Fsam95ID09IE5VTEwpCi0gICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgIFNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24obG9naWNhbGpveSwgYnV0dG9ucy0+bnRoaW5nLCBzdGF0ZSk7Ci0KLSAgICAgICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgTG9naWNhbEpveXN0aWNrQXhpcygKLQlTRExfSm95c3RpY2sgKmpveXN0aWNrLCBVaW50OCBheGlzLCBTaW50MTYgdmFsdWUpCi17Ci0gICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcqIGF4ZXM7Ci0gICAgICAgIFNETF9Kb3lzdGljayAqbG9naWNhbGpveSA9IE5VTEw7Ci0KLSAgICAgICAgLyogaWYgdGhlcmUncyBubyBtYXAgdGhlbiB0aGlzIGlzIGp1c3QgYSByZWd1bGFyIGpveXN0aWNrCi0gICAgICAgICAqLwotICAgICAgICBpZiAoU0RMX2pveWxpc3Rbam95c3RpY2stPmluZGV4XS5tYXAgPT0gTlVMTCkKLSAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLyogZ2V0IHRoZSBsb2dpY2FsIGpveXN0aWNrIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBldmVudAotICAgICAgICAgKi8KLSAgICAgICAgYXhlcyA9IFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0ubWFwLT5heGlzbWFwK2F4aXM7Ci0gICAgICAgIGxvZ2ljYWxqb3kgPSBGaW5kTG9naWNhbEpveXN0aWNrKGpveXN0aWNrLCBheGVzKTsKLQotICAgICAgICBpZiAobG9naWNhbGpveSA9PSBOVUxMKQotICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhsb2dpY2Fsam95LCBheGVzLT5udGhpbmcsIHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBVU0VfTE9HSUNBTF9KT1lTVElDS1MgKi8KLQotc3RhdGljIF9faW5saW5lX18KLXZvaWQgSGFuZGxlSGF0KFNETF9Kb3lzdGljayAqc3RpY2ssIFVpbnQ4IGhhdCwgaW50IGF4aXMsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgaHdkYXRhX2hhdCAqdGhlX2hhdDsKLQljb25zdCBVaW50OCBwb3NpdGlvbl9tYXBbM11bM10gPSB7Ci0JCXsgU0RMX0hBVF9MRUZUVVAsIFNETF9IQVRfVVAsIFNETF9IQVRfUklHSFRVUCB9LAotCQl7IFNETF9IQVRfTEVGVCwgU0RMX0hBVF9DRU5URVJFRCwgU0RMX0hBVF9SSUdIVCB9LAotCQl7IFNETF9IQVRfTEVGVERPV04sIFNETF9IQVRfRE9XTiwgU0RMX0hBVF9SSUdIVERPV04gfQotCX07Ci0JU0RMX2xvZ2ljYWxfam95ZGVjbChTRExfSm95c3RpY2sgKmxvZ2ljYWxqb3kgPSBOVUxMKTsKLQlTRExfbG9naWNhbF9qb3lkZWNsKHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcqIGhhdHMgPSBOVUxMKTsKLQotCXRoZV9oYXQgPSAmc3RpY2stPmh3ZGF0YS0+aGF0c1toYXRdOwotCWlmICggdmFsdWUgPCAwICkgewotCQl2YWx1ZSA9IDA7Ci0JfSBlbHNlCi0JaWYgKCB2YWx1ZSA9PSAwICkgewotCQl2YWx1ZSA9IDE7Ci0JfSBlbHNlCi0JaWYgKCB2YWx1ZSA+IDAgKSB7Ci0JCXZhbHVlID0gMjsKLQl9Ci0JaWYgKCB2YWx1ZSAhPSB0aGVfaGF0LT5heGlzW2F4aXNdICkgewotCQl0aGVfaGF0LT5heGlzW2F4aXNdID0gdmFsdWU7Ci0KLSNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKLQkJLyogaWYgdGhlcmUncyBubyBtYXAgdGhlbiB0aGlzIGlzIGp1c3QgYSByZWd1bGFyIGpveXN0aWNrCi0JCSovCi0JCWlmIChTRExfam95bGlzdFtzdGljay0+aW5kZXhdLm1hcCAhPSBOVUxMKSB7Ci0KLQkJCS8qIGdldCB0aGUgZmFrZSBqb3lzdGljayB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgZXZlbnQKLQkJCSovCi0JCQloYXRzID0gU0RMX2pveWxpc3Rbc3RpY2stPmluZGV4XS5tYXAtPmhhdG1hcCtoYXQ7Ci0JCQlsb2dpY2Fsam95ID0gRmluZExvZ2ljYWxKb3lzdGljayhzdGljaywgaGF0cyk7Ci0JCX0KLQotCQlpZiAobG9naWNhbGpveSkgewotCQkJc3RpY2sgPSBsb2dpY2Fsam95OwotCQkJaGF0ID0gaGF0cy0+bnRoaW5nOwotCQl9Ci0jZW5kaWYgLyogVVNFX0xPR0lDQUxfSk9ZU1RJQ0tTICovCi0KLQkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChzdGljaywgaGF0LAotCQkJcG9zaXRpb25fbWFwW3RoZV9oYXQtPmF4aXNbMV1dW3RoZV9oYXQtPmF4aXNbMF1dKTsKLQl9Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fCi12b2lkIEhhbmRsZUJhbGwoU0RMX0pveXN0aWNrICpzdGljaywgVWludDggYmFsbCwgaW50IGF4aXMsIGludCB2YWx1ZSkKLXsKLQlzdGljay0+aHdkYXRhLT5iYWxsc1tiYWxsXS5heGlzW2F4aXNdICs9IHZhbHVlOwotfQotCi0vKiBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHN0YXRlIG9mIGEgam95c3RpY2sgLSBjYWxsZWQgYXMgYSBkZXZpY2UgcG9sbC4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IHVwZGF0ZSB0aGUgam95c3RpY2sgc3RydWN0dXJlIGRpcmVjdGx5LAotICogYnV0IGluc3RlYWQgc2hvdWxkIGNhbGwgU0RMX1ByaXZhdGVKb3lzdGljayooKSB0byBkZWxpdmVyIGV2ZW50cwotICogYW5kIHVwZGF0ZSBqb3lzdGljayBkZXZpY2Ugc3RhdGUuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgSlNfSGFuZGxlRXZlbnRzKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0Jc3RydWN0IGpzX2V2ZW50IGV2ZW50c1szMl07Ci0JaW50IGksIGxlbjsKLQlVaW50OCBvdGhlcl9heGlzOwotCi0jaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCi0JaWYgKFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0uZm5hbWUgPT0gTlVMTCkgewotCQlTRExfam95bGlzdF9oZWFkKGksIGpveXN0aWNrLT5pbmRleCk7Ci0JCUpTX0hhbmRsZUV2ZW50cyhTRExfam95bGlzdFtpXS5qb3kpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0KLQl3aGlsZSAoKGxlbj1yZWFkKGpveXN0aWNrLT5od2RhdGEtPmZkLCBldmVudHMsIChzaXplb2YgZXZlbnRzKSkpID4gMCkgewotCQlsZW4gLz0gc2l6ZW9mKGV2ZW50c1swXSk7Ci0JCWZvciAoIGk9MDsgaTxsZW47ICsraSApIHsKLQkJCXN3aXRjaCAoZXZlbnRzW2ldLnR5cGUgJiB+SlNfRVZFTlRfSU5JVCkgewotCQkJICAgIGNhc2UgSlNfRVZFTlRfQVhJUzoKLQkJCQlpZiAoIGV2ZW50c1tpXS5udW1iZXIgPCBqb3lzdGljay0+bmF4ZXMgKSB7Ci0jaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCi0JCQkJCWlmICghTG9naWNhbEpveXN0aWNrQXhpcyhqb3lzdGljaywKLQkJCQkgICAgICAgICAgIGV2ZW50c1tpXS5udW1iZXIsIGV2ZW50c1tpXS52YWx1ZSkpCi0jZW5kaWYKLQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssCi0JCQkJICAgICAgICAgICBldmVudHNbaV0ubnVtYmVyLCBldmVudHNbaV0udmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZXZlbnRzW2ldLm51bWJlciAtPSBqb3lzdGljay0+bmF4ZXM7Ci0JCQkJb3RoZXJfYXhpcyA9IChldmVudHNbaV0ubnVtYmVyIC8gMik7Ci0JCQkJaWYgKCBvdGhlcl9heGlzIDwgam95c3RpY2stPm5oYXRzICkgewotCQkJCQlIYW5kbGVIYXQoam95c3RpY2ssIG90aGVyX2F4aXMsCi0JCQkJCQlldmVudHNbaV0ubnVtYmVyJTIsCi0JCQkJCQlldmVudHNbaV0udmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZXZlbnRzW2ldLm51bWJlciAtPSBqb3lzdGljay0+bmhhdHMqMjsKLQkJCQlvdGhlcl9heGlzID0gKGV2ZW50c1tpXS5udW1iZXIgLyAyKTsKLQkJCQlpZiAoIG90aGVyX2F4aXMgPCBqb3lzdGljay0+bmJhbGxzICkgewotCQkJCQlIYW5kbGVCYWxsKGpveXN0aWNrLCBvdGhlcl9heGlzLAotCQkJCQkJZXZlbnRzW2ldLm51bWJlciUyLAotCQkJCQkJZXZlbnRzW2ldLnZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgSlNfRVZFTlRfQlVUVE9OOgotI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUwotCQkJCWlmICghTG9naWNhbEpveXN0aWNrQnV0dG9uKGpveXN0aWNrLAotCQkJCSAgICAgICAgICAgZXZlbnRzW2ldLm51bWJlciwgZXZlbnRzW2ldLnZhbHVlKSkKLSNlbmRpZgotCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssCi0JCQkJICAgICAgICAgICBldmVudHNbaV0ubnVtYmVyLCBldmVudHNbaV0udmFsdWUpOwotCQkJCWJyZWFrOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkJLyogPz8gKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLSNpZiBTRExfSU5QVVRfTElOVVhFVgotc3RhdGljIF9faW5saW5lX18gaW50IEVWX0F4aXNDb3JyZWN0KFNETF9Kb3lzdGljayAqam95c3RpY2ssIGludCB3aGljaCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBheGlzX2NvcnJlY3QgKmNvcnJlY3Q7Ci0KLQljb3JyZWN0ID0gJmpveXN0aWNrLT5od2RhdGEtPmFic19jb3JyZWN0W3doaWNoXTsKLQlpZiAoIGNvcnJlY3QtPnVzZWQgKSB7Ci0JCWlmICggdmFsdWUgPiBjb3JyZWN0LT5jb2VmWzBdICkgewotCQkJaWYgKCB2YWx1ZSA8IGNvcnJlY3QtPmNvZWZbMV0gKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQl2YWx1ZSAtPSBjb3JyZWN0LT5jb2VmWzFdOwotCQl9IGVsc2UgewotCQkJdmFsdWUgLT0gY29ycmVjdC0+Y29lZlswXTsKLQkJfQotCQl2YWx1ZSAqPSBjb3JyZWN0LT5jb2VmWzJdOwotCQl2YWx1ZSA+Pj0gMTQ7Ci0JfQotCi0JLyogQ2xhbXAgYW5kIHJldHVybiAqLwotCWlmICggdmFsdWUgPCAtMzI3NjggKSByZXR1cm4gLTMyNzY4OwotCWlmICggdmFsdWUgPiAgMzI3NjcgKSByZXR1cm4gIDMyNzY3OwotCi0JcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIEVWX0hhbmRsZUV2ZW50cyhTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCXN0cnVjdCBpbnB1dF9ldmVudCBldmVudHNbMzJdOwotCWludCBpLCBsZW47Ci0JaW50IGNvZGU7Ci0KLSNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKLQlpZiAoU0RMX2pveWxpc3Rbam95c3RpY2stPmluZGV4XS5mbmFtZSA9PSBOVUxMKSB7Ci0JCVNETF9qb3lsaXN0X2hlYWQoaSwgam95c3RpY2stPmluZGV4KTsKLQkJcmV0dXJuIEVWX0hhbmRsZUV2ZW50cyhTRExfam95bGlzdFtpXS5qb3kpOwotCX0KLSNlbmRpZgotCi0Jd2hpbGUgKChsZW49cmVhZChqb3lzdGljay0+aHdkYXRhLT5mZCwgZXZlbnRzLCAoc2l6ZW9mIGV2ZW50cykpKSA+IDApIHsKLQkJbGVuIC89IHNpemVvZihldmVudHNbMF0pOwotCQlmb3IgKCBpPTA7IGk8bGVuOyArK2kgKSB7Ci0JCQljb2RlID0gZXZlbnRzW2ldLmNvZGU7Ci0JCQlzd2l0Y2ggKGV2ZW50c1tpXS50eXBlKSB7Ci0JCQkgICAgY2FzZSBFVl9LRVk6Ci0JCQkJaWYgKCBjb2RlID49IEJUTl9NSVNDICkgewotCQkJCQljb2RlIC09IEJUTl9NSVNDOwotI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUwotCQkJCQlpZiAoIUxvZ2ljYWxKb3lzdGlja0J1dHRvbihqb3lzdGljaywKLQkJCQkgICAgICAgICAgIGpveXN0aWNrLT5od2RhdGEtPmtleV9tYXBbY29kZV0sCi0JCQkJCSAgIGV2ZW50c1tpXS52YWx1ZSkpCi0jZW5kaWYKLQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywKLQkJCQkgICAgICAgICAgIGpveXN0aWNrLT5od2RhdGEtPmtleV9tYXBbY29kZV0sCi0JCQkJCSAgIGV2ZW50c1tpXS52YWx1ZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgRVZfQUJTOgotCQkJCXN3aXRjaCAoY29kZSkgewotCQkJCSAgICBjYXNlIEFCU19IQVQwWDoKLQkJCQkgICAgY2FzZSBBQlNfSEFUMFk6Ci0JCQkJICAgIGNhc2UgQUJTX0hBVDFYOgotCQkJCSAgICBjYXNlIEFCU19IQVQxWToKLQkJCQkgICAgY2FzZSBBQlNfSEFUMlg6Ci0JCQkJICAgIGNhc2UgQUJTX0hBVDJZOgotCQkJCSAgICBjYXNlIEFCU19IQVQzWDoKLQkJCQkgICAgY2FzZSBBQlNfSEFUM1k6Ci0JCQkJCWNvZGUgLT0gQUJTX0hBVDBYOwotCQkJCQlIYW5kbGVIYXQoam95c3RpY2ssIGNvZGUvMiwgY29kZSUyLAotCQkJCQkJCWV2ZW50c1tpXS52YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCSAgICBkZWZhdWx0OgotCQkJCQlldmVudHNbaV0udmFsdWUgPSBFVl9BeGlzQ29ycmVjdChqb3lzdGljaywgY29kZSwgZXZlbnRzW2ldLnZhbHVlKTsKLSNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKLQkJCQkJaWYgKCFMb2dpY2FsSm95c3RpY2tBeGlzKGpveXN0aWNrLAotCQkJCSAgICAgICAgICAgam95c3RpY2stPmh3ZGF0YS0+YWJzX21hcFtjb2RlXSwKLQkJCQkJICAgZXZlbnRzW2ldLnZhbHVlKSkKLSNlbmRpZgotCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywKLQkJCQkgICAgICAgICAgIGpveXN0aWNrLT5od2RhdGEtPmFic19tYXBbY29kZV0sCi0JCQkJCSAgIGV2ZW50c1tpXS52YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICBjYXNlIEVWX1JFTDoKLQkJCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCQkgICAgY2FzZSBSRUxfWDoKLQkJCQkgICAgY2FzZSBSRUxfWToKLQkJCQkJY29kZSAtPSBSRUxfWDsKLQkJCQkJSGFuZGxlQmFsbChqb3lzdGljaywgY29kZS8yLCBjb2RlJTIsCi0JCQkJCQkJZXZlbnRzW2ldLnZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJICAgIGRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICBkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotI2VuZGlmIC8qIFNETF9JTlBVVF9MSU5VWEVWICovCi0KLXZvaWQgU0RMX1NZU19Kb3lzdGlja1VwZGF0ZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCWludCBpOwotCQotI2lmIFNETF9JTlBVVF9MSU5VWEVWCi0JaWYgKCBqb3lzdGljay0+aHdkYXRhLT5pc19oaWQgKQotCQlFVl9IYW5kbGVFdmVudHMoam95c3RpY2spOwotCWVsc2UKLSNlbmRpZgotCQlKU19IYW5kbGVFdmVudHMoam95c3RpY2spOwotCi0JLyogRGVsaXZlciBiYWxsIG1vdGlvbiB1cGRhdGVzICovCi0JZm9yICggaT0wOyBpPGpveXN0aWNrLT5uYmFsbHM7ICsraSApIHsKLQkJaW50IHhyZWwsIHlyZWw7Ci0KLQkJeHJlbCA9IGpveXN0aWNrLT5od2RhdGEtPmJhbGxzW2ldLmF4aXNbMF07Ci0JCXlyZWwgPSBqb3lzdGljay0+aHdkYXRhLT5iYWxsc1tpXS5heGlzWzFdOwotCQlpZiAoIHhyZWwgfHwgeXJlbCApIHsKLQkJCWpveXN0aWNrLT5od2RhdGEtPmJhbGxzW2ldLmF4aXNbMF0gPSAwOwotCQkJam95c3RpY2stPmh3ZGF0YS0+YmFsbHNbaV0uYXhpc1sxXSA9IDA7Ci0JCQlTRExfUHJpdmF0ZUpveXN0aWNrQmFsbChqb3lzdGljaywgKFVpbnQ4KWksIHhyZWwsIHlyZWwpOwotCQl9Ci0JfQotfQotCi0vKiBGdW5jdGlvbiB0byBjbG9zZSBhIGpveXN0aWNrIGFmdGVyIHVzZSAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLSNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKLQlyZWdpc3RlciBpbnQgaTsKLQlpZiAoU0RMX2pveWxpc3Rbam95c3RpY2stPmluZGV4XS5mbmFtZSA9PSBOVUxMKSB7Ci0JCVNETF9qb3lsaXN0X2hlYWQoaSwgam95c3RpY2stPmluZGV4KTsKLQkJU0RMX0pveXN0aWNrQ2xvc2UoU0RMX2pveWxpc3RbaV0uam95KTsKLQl9Ci0jZW5kaWYKLQotCWlmICggam95c3RpY2stPmh3ZGF0YSApIHsKLSNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKLQkJaWYgKFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0uZm5hbWUgIT0gTlVMTCkKLSNlbmRpZgotCQljbG9zZShqb3lzdGljay0+aHdkYXRhLT5mZCk7Ci0JCWlmICggam95c3RpY2stPmh3ZGF0YS0+aGF0cyApIHsKLQkJCVNETF9mcmVlKGpveXN0aWNrLT5od2RhdGEtPmhhdHMpOwotCQl9Ci0JCWlmICggam95c3RpY2stPmh3ZGF0YS0+YmFsbHMgKSB7Ci0JCQlTRExfZnJlZShqb3lzdGljay0+aHdkYXRhLT5iYWxscyk7Ci0JCX0KLQkJU0RMX2ZyZWUoam95c3RpY2stPmh3ZGF0YSk7Ci0JCWpveXN0aWNrLT5od2RhdGEgPSBOVUxMOwotCX0KLX0KLQotLyogRnVuY3Rpb24gdG8gcGVyZm9ybSBhbnkgc3lzdGVtLXNwZWNpZmljIGpveXN0aWNrIHJlbGF0ZWQgY2xlYW51cCAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrUXVpdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yICggaT0wOyBTRExfam95bGlzdFtpXS5mbmFtZTsgKytpICkgewotCQlTRExfZnJlZShTRExfam95bGlzdFtpXS5mbmFtZSk7Ci0JfQotCVNETF9qb3lsaXN0WzBdLmZuYW1lID0gTlVMTDsKLX0KLQotI2VuZGlmIC8qIFNETF9KT1lTVElDS19MSU5VWCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9tYWNvcy9TRExfc3lzam95c3RpY2suYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svbWFjb3MvU0RMX3N5c2pveXN0aWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NjA5YjMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9tYWNvcy9TRExfc3lzam95c3RpY2suYworKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9KT1lTVElDS19NQUNPUwotCi0vKiAgU0RMIHN0dWZmICAtLSAgIlNETF9zeXNqb3lzdGljay5jIgotICAgIE1hY09TIGpveXN0aWNrIGZ1bmN0aW9ucyBieSBGcmVkZXJpY2sgUmVpdGJlcmdlcgotCi0gICAgVGhlIGNvZGUgdGhhdCBmb2xsb3dzIGlzIG1lYW50IGZvciBTREwuICBVc2UgYXQgeW91ciBvd24gcmlzay4KLSovCi0KLSNpbmNsdWRlIDxJbnB1dFNwcm9ja2V0Lmg+Ci0KLSNpbmNsdWRlICJTRExfam95c3RpY2suaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzam95c3RpY2suaCIKLSNpbmNsdWRlICIuLi9TRExfam95c3RpY2tfYy5oIgotCi0KLS8qICBUaGUgbWF4IG51bWJlciBvZiBqb3lzdGlja3Mgd2Ugd2lsbCBkZXRlY3QgICovCi0jZGVmaW5lICAgICBNQVhfSk9ZU1RJQ0tTICAgICAgIDE2IAotLyogIExpbWl0IG91cnNlbHZlcyB0byAzMiBlbGVtZW50cyBwZXIgZGV2aWNlICAqLwotI2RlZmluZSAgICAga01heFJlZmVyZW5jZXMgICAgICAzMiAKLQotI2RlZmluZQkJSVNwU3ltbWV0cmljQXhpc1RvRmxvYXQoYXhpcykJKCgoKGZsb2F0KSBheGlzKSAtIGtJU3BBeGlzTWlkZGxlKSAvIChrSVNwQXhpc01heGltdW0ta0lTcEF4aXNNaWRkbGUpKQotI2RlZmluZQkJSVNwQXN5bW1ldHJpY0F4aXNUb0Zsb2F0KGF4aXMpCSgoKGZsb2F0KSBheGlzKSAvIChrSVNwQXhpc01heGltdW0pKQotCi0KLXN0YXRpYyAgSVNwRGV2aWNlUmVmZXJlbmNlICBTWVNfSm95c3RpY2tzW01BWF9KT1lTVElDS1NdOwotc3RhdGljICBJU3BFbGVtZW50TGlzdFJlZmVyZW5jZSBTWVNfRWxlbWVudHNbTUFYX0pPWVNUSUNLU107Ci1zdGF0aWMgIElTcERldmljZURlZmluaXRpb24gICAgIFNZU19EZXZEZWZbTUFYX0pPWVNUSUNLU107Ci0KLXN0cnVjdCBqb3lzdGlja19od2RhdGEgCi17Ci0gICAgY2hhciBuYW1lWzY0XTsKLS8qICAgIFVpbnQ4ICAgaWQ7Ki8KLSAgICBJU3BFbGVtZW50UmVmZXJlbmNlIHJlZnNba01heFJlZmVyZW5jZXNdOwotICAgIC8qICBnb25uYSBuZWVkIHNvbWUgc29ydCBvZiBtYXBwaW5nIGluZm8gICovCi19OyAKLQotCi0vKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIGpveXN0aWNrcy4KLSAqIEpveXN0aWNrIDAgc2hvdWxkIGJlIHRoZSBzeXN0ZW0gZGVmYXVsdCBqb3lzdGljay4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBqb3lzdGlja3MsIG9yIC0xCi0gKiBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgotICovCi1pbnQgU0RMX1NZU19Kb3lzdGlja0luaXQodm9pZCkKLXsKLSAgICBzdGF0aWMgSVNwRGV2aWNlQ2xhc3MgY2xhc3Nlc1s0XSA9IHsKLSAgICAgICAga0lTcERldmljZUNsYXNzX0pveXN0aWNrLAotICAgICNpZiBrSVNwRGV2aWNlQ2xhc3NfR2FtZXBhZAotICAgICAgICBrSVNwRGV2aWNlQ2xhc3NfR2FtZXBhZCwKLSAgICAjZW5kaWYKLSAgICAgICAga0lTcERldmljZUNsYXNzX1doZWVsLAotICAgICAgICAwCi0gICAgfTsKLSAgICBPU0VyciAgIGVycjsKLSAgICBpbnQgICAgIGk7Ci0gICAgVUludDMyICBjb3VudCwgbnVtSm95c3RpY2tzOwotCi0gICAgaWYgKCAoUHRyKTAgPT0gKFB0cilJU3BTdGFydHVwICkgewotICAgICAgICBTRExfU2V0RXJyb3IoIklucHV0U3Byb2NrZXQgbm90IGluc3RhbGxlZCIpOwotICAgICAgICByZXR1cm4gLTE7ICAvLyAgSW5wdXRTcHJvY2tldCBub3QgaW5zdGFsbGVkCi0gICAgfQotCi0gICAgaWYoIChQdHIpMCA9PSAoUHRyKUlTcEdldFZlcnNpb24gKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiSW5wdXRTcHJvY2tldCBub3QgdmVyc2lvbiAxLjEgb3IgbmV3ZXIiKTsKLSAgICAgICAgcmV0dXJuIC0xOyAgLy8gIG9sZCB2ZXJzaW9uIG9mIElTcCAobm90IGF0IGxlYXN0IDEuMSkKLSAgICB9Ci0KLSAgICBJU3BTdGFydHVwKCk7Ci0KLSAgICAvKiBHZXQgYWxsIHRoZSBqb3lzdGlja3MgKi8KLSAgICBudW1Kb3lzdGlja3MgPSAwOwotICAgIGZvciAoIGk9MDsgY2xhc3Nlc1tpXTsgKytpICkgewotICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgIGVyciA9IElTcERldmljZXNfRXh0cmFjdEJ5Q2xhc3MoCi0gICAgICAgICAgICBjbGFzc2VzW2ldLAotICAgICAgICAgICAgTUFYX0pPWVNUSUNLUy1udW1Kb3lzdGlja3MsCi0gICAgICAgICAgICAmY291bnQsCi0gICAgICAgICAgICAmU1lTX0pveXN0aWNrc1tudW1Kb3lzdGlja3NdKTsKLSAgICAgICAgbnVtSm95c3RpY2tzICs9IGNvdW50OwotICAgIH0KLQotICAgIGZvcihpID0gMDsgaSA8IG51bUpveXN0aWNrczsgaSsrKQotICAgIHsKLSAgICAgICAgSVNwRGV2aWNlX0dldERlZmluaXRpb24oCi0gICAgICAgICAgICBTWVNfSm95c3RpY2tzW2ldLCBzaXplb2YoSVNwRGV2aWNlRGVmaW5pdGlvbiksCi0gICAgICAgICAgICAmU1lTX0RldkRlZltpXSk7Ci0gICAgICAgIAotICAgICAgICBlcnIgPSBJU3BFbGVtZW50TGlzdF9OZXcoCi0gICAgICAgICAgICAwLCBOVUxMLAotICAgICAgICAgICAgJlNZU19FbGVtZW50c1tpXSwgMCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIElTcERldmljZV9HZXRFbGVtZW50TGlzdCgKLSAgICAgICAgICAgIFNZU19Kb3lzdGlja3NbaV0sCi0gICAgICAgICAgICAmU1lTX0VsZW1lbnRzW2ldKTsKLSAgICB9Ci0KLSAgICBJU3BEZXZpY2VzX0RlYWN0aXZhdGUobnVtSm95c3RpY2tzLCBTWVNfSm95c3RpY2tzKTsKLQotICAgIHJldHVybiBudW1Kb3lzdGlja3M7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGdldCB0aGUgZGV2aWNlLWRlcGVuZGVudCBuYW1lIG9mIGEgam95c3RpY2sgKi8KLWNvbnN0IGNoYXIgKlNETF9TWVNfSm95c3RpY2tOYW1lKGludCBpbmRleCkKLXsKLSAgICBzdGF0aWMgY2hhciBuYW1lWzY0XTsKLSAgICBpbnQgbGVuOwotCi0gICAgLyogIGNvbnZlcnQgcGFzY2FsIHN0cmluZyB0byBjLXN0cmluZyAgKi8KLSAgICBsZW4gPSBTWVNfRGV2RGVmW2luZGV4XS5kZXZpY2VOYW1lWzBdOwotICAgIGlmICggbGVuID49IHNpemVvZihuYW1lKSApIHsKLSAgICAgICAgbGVuID0gKHNpemVvZihuYW1lKSAtIDEpOwotICAgIH0KLSAgICBTRExfbWVtY3B5KG5hbWUsICZTWVNfRGV2RGVmW2luZGV4XS5kZXZpY2VOYW1lWzFdLCBsZW4pOwotICAgIG5hbWVbbGVuXSA9ICdcMCc7Ci0KLSAgICByZXR1cm4gbmFtZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gb3BlbiBhIGpveXN0aWNrIGZvciB1c2UuCi0gICBUaGUgam95c3RpY2sgdG8gb3BlbiBpcyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGZpZWxkIG9mIHRoZSBqb3lzdGljay4KLSAgIFRoaXMgc2hvdWxkIGZpbGwgdGhlIG5idXR0b25zIGFuZCBuYXhlcyBmaWVsZHMgb2YgdGhlIGpveXN0aWNrIHN0cnVjdHVyZS4KLSAgIEl0IHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0gKi8KLWludCBTRExfU1lTX0pveXN0aWNrT3BlbihTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotICAgIGludCAgICAgaW5kZXg7Ci0gICAgVUludDMyICBjb3VudCwgZ290Q291bnQsIGNvdW50MjsKLSAgICBsb25nICAgIG51bUF4aXMsIG51bUJ1dHRvbnMsIG51bUhhdHMsIG51bUJhbGxzOwotCi0gICAgY291bnQgPSBrTWF4UmVmZXJlbmNlczsKLSAgICBjb3VudDIgPSAwOwotICAgIG51bUF4aXMgPSBudW1CdXR0b25zID0gbnVtSGF0cyA9IG51bUJhbGxzID0gMDsKLQotICAgIGluZGV4ID0gam95c3RpY2stPmluZGV4OwotCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzeXN0ZW0gc3BlY2lmaWMgaGFyZHdhcmUgZGF0YSAqLwotICAgIGpveXN0aWNrLT5od2RhdGEgPSAoc3RydWN0IGpveXN0aWNrX2h3ZGF0YSAqKSBTRExfbWFsbG9jKHNpemVvZigqam95c3RpY2stPmh3ZGF0YSkpOwotICAgIGlmIChqb3lzdGljay0+aHdkYXRhID09IE5VTEwpCi0gICAgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLSAgICB9Ci0gICAgU0RMX21lbXNldChqb3lzdGljay0+aHdkYXRhLCAwLCBzaXplb2YoKmpveXN0aWNrLT5od2RhdGEpKTsKLSAgICBTRExfc3RybGNweShqb3lzdGljay0+aHdkYXRhLT5uYW1lLCBTRExfU1lTX0pveXN0aWNrTmFtZShpbmRleCksIFNETF9hcnJheXNpemUoam95c3RpY2stPmh3ZGF0YS0+bmFtZSkpOwotICAgIGpveXN0aWNrLT5uYW1lID0gam95c3RpY2stPmh3ZGF0YS0+bmFtZTsKLQotICAgIElTcEVsZW1lbnRMaXN0X0V4dHJhY3RCeUtpbmQoCi0gICAgICAgIFNZU19FbGVtZW50c1tpbmRleF0sCi0gICAgICAgIGtJU3BFbGVtZW50S2luZF9BeGlzLAotICAgICAgICBjb3VudCwKLSAgICAgICAgJmdvdENvdW50LAotICAgICAgICBqb3lzdGljay0+aHdkYXRhLT5yZWZzKTsKLQotICAgIG51bUF4aXMgPSBnb3RDb3VudDsKLSAgICBjb3VudCAtPSBnb3RDb3VudDsKLSAgICBjb3VudDIgKz0gZ290Q291bnQ7Ci0KLSAgICBJU3BFbGVtZW50TGlzdF9FeHRyYWN0QnlLaW5kKAotICAgICAgICBTWVNfRWxlbWVudHNbaW5kZXhdLAotICAgICAgICBrSVNwRWxlbWVudEtpbmRfRFBhZCwKLSAgICAgICAgY291bnQsCi0gICAgICAgICZnb3RDb3VudCwKLSAgICAgICAgJihqb3lzdGljay0+aHdkYXRhLT5yZWZzW2NvdW50Ml0pKTsKLQotICAgIG51bUhhdHMgPSBnb3RDb3VudDsKLSAgICBjb3VudCAtPSBnb3RDb3VudDsKLSAgICBjb3VudDIgKz0gZ290Q291bnQ7Ci0KLSAgICBJU3BFbGVtZW50TGlzdF9FeHRyYWN0QnlLaW5kKAotICAgICAgICBTWVNfRWxlbWVudHNbaW5kZXhdLAotICAgICAgICBrSVNwRWxlbWVudEtpbmRfQnV0dG9uLAotICAgICAgICBjb3VudCwKLSAgICAgICAgJmdvdENvdW50LAotICAgICAgICAmKGpveXN0aWNrLT5od2RhdGEtPnJlZnNbY291bnQyXSkpOwotCi0gICAgbnVtQnV0dG9ucyA9IGdvdENvdW50OwotICAgIGNvdW50IC09IGdvdENvdW50OwotICAgIGNvdW50MiArPSBnb3RDb3VudDsKLQotICAgIGpveXN0aWNrLT5uYXhlcyA9IG51bUF4aXM7Ci0gICAgam95c3RpY2stPm5oYXRzID0gbnVtSGF0czsKLSAgICBqb3lzdGljay0+bmJhbGxzID0gbnVtQmFsbHM7Ci0gICAgam95c3RpY2stPm5idXR0b25zID0gbnVtQnV0dG9uczsKLQotICAgIElTcERldmljZXNfQWN0aXZhdGUoCi0gICAgICAgIDEsCi0gICAgICAgICZTWVNfSm95c3RpY2tzW2luZGV4XSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiBhIGpveXN0aWNrIC0gY2FsbGVkIGFzIGEgZGV2aWNlIHBvbGwuCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZG4ndCB1cGRhdGUgdGhlIGpveXN0aWNrIHN0cnVjdHVyZSBkaXJlY3RseSwKLSAqIGJ1dCBpbnN0ZWFkIHNob3VsZCBjYWxsIFNETF9Qcml2YXRlSm95c3RpY2sqKCkgdG8gZGVsaXZlciBldmVudHMKLSAqIGFuZCB1cGRhdGUgam95c3RpY2sgZGV2aWNlIHN0YXRlLgotICovCi12b2lkIFNETF9TWVNfSm95c3RpY2tVcGRhdGUoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLSAgICBpbnQgICAgIGksIGo7Ci0gICAgSVNwQXhpc0RhdGEgICAgIGE7Ci0gICAgSVNwRFBhZERhdGEgICAgIGI7Ci0gICAgLy9JU3BEZWx0YURhdGEgICAgYzsKLSAgICBJU3BCdXR0b25EYXRhICAgZDsKLQotICAgIGZvcihpID0gMCwgaiA9IDA7IGkgPCBqb3lzdGljay0+bmF4ZXM7IGkrKywgaisrKQotICAgIHsKLSAgICAgICAgU2ludDE2IHZhbHVlOwotCi0gICAgICAgIElTcEVsZW1lbnRfR2V0U2ltcGxlU3RhdGUoCi0gICAgICAgICAgICBqb3lzdGljay0+aHdkYXRhLT5yZWZzW2pdLAotICAgICAgICAgICAgJmEpOwotICAgICAgICB2YWx1ZSA9IChJU3BTeW1tZXRyaWNBeGlzVG9GbG9hdChhKSogMzI3NjcuMCk7Ci0gICAgICAgIGlmICggdmFsdWUgIT0gam95c3RpY2stPmF4ZXNbaV0gKSB7Ci0gICAgICAgICAgICBTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywgaSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yKGkgPSAwOyBpIDwgam95c3RpY2stPm5oYXRzOyBpKyssIGorKykKLSAgICB7Ci0gICAgICAgIFVpbnQ4IHBvczsKLQotICAgICAgICBJU3BFbGVtZW50X0dldFNpbXBsZVN0YXRlKAotICAgICAgICAgICAgam95c3RpY2stPmh3ZGF0YS0+cmVmc1tqXSwKLSAgICAgICAgICAgICZiKTsKLSAgICAgICAgc3dpdGNoKGIpIHsKLSAgICAgICAgICAgIGNhc2Uga0lTcFBhZElkbGU6Ci0gICAgICAgICAgICAgICAgcG9zID0gU0RMX0hBVF9DRU5URVJFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2Uga0lTcFBhZExlZnQ6Ci0gICAgICAgICAgICAgICAgcG9zID0gU0RMX0hBVF9MRUZUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBrSVNwUGFkVXBMZWZ0OgotICAgICAgICAgICAgICAgIHBvcyA9IFNETF9IQVRfTEVGVFVQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBrSVNwUGFkVXA6Ci0gICAgICAgICAgICAgICAgcG9zID0gU0RMX0hBVF9VUDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2Uga0lTcFBhZFVwUmlnaHQ6Ci0gICAgICAgICAgICAgICAgcG9zID0gU0RMX0hBVF9SSUdIVFVQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBrSVNwUGFkUmlnaHQ6Ci0gICAgICAgICAgICAgICAgcG9zID0gU0RMX0hBVF9SSUdIVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2Uga0lTcFBhZERvd25SaWdodDoKLSAgICAgICAgICAgICAgICBwb3MgPSBTRExfSEFUX1JJR0hURE9XTjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2Uga0lTcFBhZERvd246Ci0gICAgICAgICAgICAgICAgcG9zID0gU0RMX0hBVF9ET1dOOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBrSVNwUGFkRG93bkxlZnQ6Ci0gICAgICAgICAgICAgICAgcG9zID0gU0RMX0hBVF9MRUZURE9XTjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHBvcyAhPSBqb3lzdGljay0+aGF0c1tpXSApIHsKLSAgICAgICAgICAgIFNETF9Qcml2YXRlSm95c3RpY2tIYXQoam95c3RpY2ssIGksIHBvcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBqb3lzdGljay0+bmJhbGxzOyBpKyssIGorKykKLSAgICB7Ci0gICAgICAgIC8qICBpZ25vcmUgYmFsbHMgcmlnaHQgbm93ICAqLwotICAgIH0KLQotICAgIGZvcihpID0gMDsgaSA8IGpveXN0aWNrLT5uYnV0dG9uczsgaSsrLCBqKyspCi0gICAgewotICAgICAgICBJU3BFbGVtZW50X0dldFNpbXBsZVN0YXRlKAotICAgICAgICAgICAgam95c3RpY2stPmh3ZGF0YS0+cmVmc1tqXSwKLSAgICAgICAgICAgICZkKTsKLSAgICAgICAgaWYgKCBkICE9IGpveXN0aWNrLT5idXR0b25zW2ldICkgewotICAgICAgICAgICAgU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywgaSwgZCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNsb3NlIGEgam95c3RpY2sgYWZ0ZXIgdXNlICovCi12b2lkIFNETF9TWVNfSm95c3RpY2tDbG9zZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotICAgIGludCBpbmRleDsKLQotICAgIGluZGV4ID0gam95c3RpY2stPmluZGV4OwotCi0gICAgSVNwRGV2aWNlc19EZWFjdGl2YXRlKAotICAgICAgICAxLAotICAgICAgICAmU1lTX0pveXN0aWNrc1tpbmRleF0pOwotfQotCi0vKiBGdW5jdGlvbiB0byBwZXJmb3JtIGFueSBzeXN0ZW0tc3BlY2lmaWMgam95c3RpY2sgcmVsYXRlZCBjbGVhbnVwICovCi12b2lkIFNETF9TWVNfSm95c3RpY2tRdWl0KHZvaWQpCi17Ci0gICAgSVNwU2h1dGRvd24oKTsKLX0KLQotI2VuZGlmIC8qIFNETF9KT1lTVElDS19NQUNPUyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9taW50L1NETF9zeXNqb3lzdGljay5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9taW50L1NETF9zeXNqb3lzdGljay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjRlNTY4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svbWludC9TRExfc3lzam95c3RpY2suYworKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9KT1lTVElDS19NSU5UCi0KLS8qCi0gKglBdGFyaSBKb3lzdGljay9Kb3lwYWQgZHJpdmVycwotICoKLSAqCVBhdHJpY2UgTWFuZGluCi0gKi8KLQotI2luY2x1ZGUgPG1pbnQvY29va2llLmg+Ci0jaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KLQotI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzam95c3RpY2suaCIKLSNpbmNsdWRlICIuLi9TRExfam95c3RpY2tfYy5oIgotCi0jaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX2lrYmRpbnRlcnJ1cHRfcy5oIgotI2luY2x1ZGUgIi4uLy4uL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zaW50ZXJydXB0X3MuaCIKLQotLyotLS0gQ29uc3QgLS0tKi8KLQotLyogV2UgY2FuIGhhdmU6Ci0JMSBqb3lzdGljayBvbiBJS0JEIHBvcnQgMSwgcmVhZCB2aWEgaGFyZHdhcmUgSS9PCi0JICBvciBzYW1lIGpveXN0aWNrIG9uIElLQkQgcG9ydCAxLCByZWFkIHZpYSB4YmlvcwotCTEgam95cGFkIG9uIHBvcnQgQSAodXAgdG8gNCB3aXRoIHRlYW10YXApCi0JICBvciAyIGpveXN0aWNrcyBvbiBqb3lwYWQgcG9ydCBBCi0JICBvciAxIGFuYWxvZyBwYWRkbGUgb24gam95cGFkIHBvcnQgQQotCSAgb3IgMSBsaWdodHBlbiBvbiBqb3lwYWQgcG9ydCBBCi0JMSBqb3lwYWQgb24gcG9ydCBCICh1cCB0byA0IHdpdGggdGVhbXRhcCkKLQkgIG9yIDIgam95c3RpY2tzIG9uIGpveXBhZCBwb3J0IEIKLQkgIG9yIDEgYW5hbG9nIHBhZGRsZSBvbiBqb3lwYWQgcG9ydCBCCi0JMiBqb3lzdGlja3Mgb24gcGFyYWxsZWwgcG9ydAotKi8KLQotZW51bSB7Ci0JSUtCRF9KT1kxPTAsCi0JWEJJT1NfSk9ZMSwKLQlQT1JUQV9QQUQwLAotCVBPUlRBX1BBRDEsCi0JUE9SVEFfUEFEMiwKLQlQT1JUQV9QQUQzLAotCVBPUlRCX1BBRDAsCi0JUE9SVEJfUEFEMSwKLQlQT1JUQl9QQUQyLAotCVBPUlRCX1BBRDMsCi0JUE9SVEFfSk9ZMCwKLQlQT1JUQV9KT1kxLAotCVBPUlRCX0pPWTAsCi0JUE9SVEJfSk9ZMSwKLQlQT1JUQV9MUCwKLQlQT1JUQV9BTlBBRCwKLQlQT1JUQl9BTlBBRCwKLSNpZiAwCi0JUEFSQV9KT1kwLAotCVBBUkFfSk9ZMSwKLSNlbmRpZgotCU1BWF9KT1lTVElDS1MKLX07Ci0KLWVudW0gewotCU1DSF9TVD0wLAotCU1DSF9TVEUsCi0JTUNIX1RULAotCU1DSF9GMzAsCi0JTUNIX0NMT05FLAotCU1DSF9BUkFOWU0KLX07Ci0KLS8qCUpveXBhZCBidXR0b25zCi0gKgkJUHJvY29udHJvbGxlciBub3RlOgotICoJCQlMLFIgYXJlIGNvbm5lY3RlZCB0byA0LDYKLSAqCQkJWCxZLFogYXJlIGNvbm5lY3RlZCB0byA3LDgsOQotICovCi0KLWVudW0gewotCUpQX1VQPTAsCUpQX0RPV04sCUpQX0xFRlQsCUpQX1JJR0hULAotCUpQX0tQTVVMVCwJSlBfS1A3LAkJSlBfS1A0LAkJSlBfS1AxLAotCUpQX0tQMCwJCUpQX0tQOCwJCUpQX0tQNSwJCUpQX0tQMiwKLQlKUF9LUE5VTSwJSlBfS1A5LAkJSlBfS1A2LAkJSlBfS1AzLAotCUpQX1BBVVNFLAlKUF9GSVJFMCwJSlBfVU5ERUYwLAlKUF9GSVJFMSwKLQlKUF9VTkRFRjEsCUpQX0ZJUkUyLAlKUF9VTkRFRjIsCUpQX09QVElPTgotfTsKLQotI2RlZmluZSBKUF9OVU1fQlVUVE9OUyAxNwotCi0jZGVmaW5lIFBPUlRfSlNfUklHSFQJKDE8PDApCi0jZGVmaW5lIFBPUlRfSlNfTEVGVAkoMTw8MSkKLSNkZWZpbmUgUE9SVF9KU19ET1dOCSgxPDwyKQotI2RlZmluZSBQT1JUX0pTX1VQCQkoMTw8MykKLSNkZWZpbmUgUE9SVF9KU19GSVJFCSgxPDw0KQotCi0vKi0tLSBUeXBlcyAtLS0qLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JU0RMX2Jvb2wgZW5hYmxlZDsKLQl1bnNpZ25lZCBjaGFyICpuYW1lOwotCVVpbnQzMiBwcmV2c3RhdGU7Ci19IGF0YXJpam95X3Q7Ci0KLS8qLS0tIFZhcmlhYmxlcyAtLS0qLwotCi1zdGF0aWMgYXRhcmlqb3lfdCBhdGFyaWpveXN0aWNrc1tNQVhfSk9ZU1RJQ0tTXT17Ci0Je1NETF9GQUxTRSwiSUtCRCBqb3lzdGljayBwb3J0IDEiLDB9LAotCXtTRExfRkFMU0UsIlhiaW9zIGpveXN0aWNrIHBvcnQgMSIsMH0sCi0Je1NETF9GQUxTRSwiSm95cGFkIDAgcG9ydCBBIiwwfSwKLQl7U0RMX0ZBTFNFLCJKb3lwYWQgMSBwb3J0IEEiLDB9LAotCXtTRExfRkFMU0UsIkpveXBhZCAyIHBvcnQgQSIsMH0sCi0Je1NETF9GQUxTRSwiSm95cGFkIDMgcG9ydCBBIiwwfSwKLQl7U0RMX0ZBTFNFLCJKb3lwYWQgMCBwb3J0IEIiLDB9LAotCXtTRExfRkFMU0UsIkpveXBhZCAxIHBvcnQgQiIsMH0sCi0Je1NETF9GQUxTRSwiSm95cGFkIDIgcG9ydCBCIiwwfSwKLQl7U0RMX0ZBTFNFLCJKb3lwYWQgMyBwb3J0IEIiLDB9LAotCXtTRExfRkFMU0UsIkpveXN0aWNrIDAgcG9ydCBBIiwwfSwKLQl7U0RMX0ZBTFNFLCJKb3lzdGljayAxIHBvcnQgQSIsMH0sCi0Je1NETF9GQUxTRSwiSm95c3RpY2sgMCBwb3J0IEIiLDB9LAotCXtTRExfRkFMU0UsIkpveXN0aWNrIDEgcG9ydCBCIiwwfSwKLQl7U0RMX0ZBTFNFLCJMaWdodHBlbiBwb3J0IEEiLDB9LAotCXtTRExfRkFMU0UsIkFuYWxvZyBwYWRkbGUgcG9ydCBBIiwwfSwKLQl7U0RMX0ZBTFNFLCJBbmFsb2cgcGFkZGxlIHBvcnQgQiIsMH0KLSNpZiAwCi0JLHtTRExfRkFMU0UsIkpveXN0aWNrIDAgcGFyYWxsZWwgcG9ydCIsMH0sCi0Je1NETF9GQUxTRSwiSm95c3RpY2sgMSBwYXJhbGxlbCBwb3J0IiwwfQotI2VuZGlmCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGpwX2J1dHRvbnNbSlBfTlVNX0JVVFRPTlNdPXsKLQlKUF9GSVJFMCwJSlBfRklSRTEsCUpQX0ZJUkUyLAlKUF9QQVVTRSwKLQlKUF9PUFRJT04sCUpQX0tQTVVMVCwJSlBfS1BOVU0sCUpQX0tQMCwKLQlKUF9LUDEsCQlKUF9LUDIsCQlKUF9LUDMsCQlKUF9LUDQsCi0JSlBfS1A1LAkJSlBfS1A2LAkJSlBfS1A3LAkJSlBfS1A4LAotCUpQX0tQOQotfTsKLQotc3RhdGljIFNETF9ib29sIGpveXBhZF9wb3J0c19lbmFibGVkPVNETF9GQUxTRTsKLQotLyogVXBkYXRlZCBqb3lwYWQgcG9ydHMgKi8KLXN0YXRpYyBVaW50MTYganBfcGFkZGxlc1s0XTsKLXN0YXRpYyBVaW50MTYganBfbGlnaHRwZW5zWzJdOwotc3RhdGljIFVpbnQxNiBqcF9kaXJlY3Rpb25zOwotc3RhdGljIFVpbnQxNiBqcF9maXJlczsKLXN0YXRpYyBVaW50MzIganBfam95cGFkc1s4XTsKLQotLyotLS0gRnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tKi8KLQotc3RhdGljIGludCBHZXRFbmFibGVkQXRhcmlKb3lzdGljayhpbnQgaW5kZXgpOwotc3RhdGljIHZvaWQgVXBkYXRlSm95cGFkcyh2b2lkKTsKLQotLyotLS0gRnVuY3Rpb25zIC0tLSovCi0KLWludCBTRExfU1lTX0pveXN0aWNrSW5pdCh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgY29va2llX21jaDsKLQljb25zdCBjaGFyICplbnZyPVNETF9nZXRlbnYoIlNETF9KT1lTVElDS19BVEFSSSIpOwotCQotI2RlZmluZSBURVNUX0pPWV9FTkFCTEVEKGVudixpZHN0cmluZyxudW0pIFwKLQlpZiAoU0RMX3N0cnN0cihlbnYsaWRzdHJpbmciLW9mZiIpKSB7IFwKLQkJYXRhcmlqb3lzdGlja3NbbnVtXS5lbmFibGVkPVNETF9GQUxTRTsgXAotCX0gXAotCWlmIChTRExfc3Ryc3RyKGVudixpZHN0cmluZyItb24iKSkgeyBcCi0JCWF0YXJpam95c3RpY2tzW251bV0uZW5hYmxlZD1TRExfVFJVRTsgXAotCX0KLQotCS8qIENvb2tpZSBfTUNIIHByZXNlbnQgPyBpZiBub3QsIGFzc3VtZSBTVCBtYWNoaW5lICovCi0JaWYgKEdldGNvb2tpZShDX19NQ0gsICZjb29raWVfbWNoKSAhPSBDX0ZPVU5EKSB7Ci0JCWNvb2tpZV9tY2ggPSBNQ0hfU1QgPDwgMTY7Ci0JfQotCi0JLyogRW5hYmxlIHNvbWUgZGVmYXVsdCBqb3lzdGlja3MgKi8KLQlpZiAoKGNvb2tpZV9tY2ggPT0gTUNIX1NUPDwxNikgfHwgKChjb29raWVfbWNoPj4xNikgPT0gTUNIX1NURSkgfHwKLQkJKGNvb2tpZV9tY2ggPT0gTUNIX1RUPDwxNikgfHwgKGNvb2tpZV9tY2ggPT0gTUNIX0YzMDw8MTYpIHx8Ci0JCShjb29raWVfbWNoID09IE1DSF9BUkFOWU08PDE2KSkgewotCQlhdGFyaWpveXN0aWNrc1tJS0JEX0pPWTFdLmVuYWJsZWQ9KFNETF9BdGFyaUlrYmRfZW5hYmxlZCE9MCk7Ci0JfQotCWlmICgoY29va2llX21jaCA9PSBNQ0hfU1RFPDwxNikgfHwgKGNvb2tpZV9tY2ggPT0gTUNIX0YzMDw8MTYpKSB7Ci0JCWF0YXJpam95c3RpY2tzW1BPUlRBX1BBRDBdLmVuYWJsZWQgPSAKLQkJCWF0YXJpam95c3RpY2tzW1BPUlRBX1BBRDFdLmVuYWJsZWQgPQotCQkJYXRhcmlqb3lzdGlja3NbUE9SVEFfUEFEMl0uZW5hYmxlZCA9Ci0JCQlhdGFyaWpveXN0aWNrc1tQT1JUQV9QQUQzXS5lbmFibGVkID0KLQkJCWF0YXJpam95c3RpY2tzW1BPUlRCX1BBRDBdLmVuYWJsZWQgPQotCQkJYXRhcmlqb3lzdGlja3NbUE9SVEJfUEFEMV0uZW5hYmxlZCA9Ci0JCQlhdGFyaWpveXN0aWNrc1tQT1JUQl9QQUQyXS5lbmFibGVkID0KLQkJCWF0YXJpam95c3RpY2tzW1BPUlRCX1BBRDNdLmVuYWJsZWQgPSBTRExfVFJVRTsKLQl9Ci0JaWYgKCFhdGFyaWpveXN0aWNrc1tJS0JEX0pPWTFdLmVuYWJsZWQpIHsKLQkJYXRhcmlqb3lzdGlja3NbWEJJT1NfSk9ZMV0uZW5hYmxlZD0oU0RMX0F0YXJpWGJpb3NfZW5hYmxlZCE9MCk7Ci0JfQotCi0JLyogUmVhZCBlbnZpcm9ubWVudCBmb3Igam95c3RpY2tzIHRvIGVuYWJsZSAqLwotCWlmIChlbnZyKSB7Ci0JCS8qIElLQkQgb24gYW55IEF0YXJpLCBtYXliZSBjbG9uZXMgKi8KLQkJaWYgKChjb29raWVfbWNoID09IE1DSF9TVDw8MTYpIHx8ICgoY29va2llX21jaD4+MTYpID09IE1DSF9TVEUpIHx8Ci0JCQkoY29va2llX21jaCA9PSBNQ0hfVFQ8PDE2KSB8fCAoY29va2llX21jaCA9PSBNQ0hfRjMwPDwxNikgfHwKLQkJCShjb29raWVfbWNoID09IE1DSF9BUkFOWU08PDE2KSkgewotCQkJaWYgKFNETF9BdGFyaUlrYmRfZW5hYmxlZCE9MCkgewotCQkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgImlrYmQtam95MSIsIElLQkRfSk9ZMSk7Ci0JCQl9Ci0JCX0KLQkJLyogSm95cGFkcyBwb3J0cyBvbmx5IG9uIFNURSBhbmQgRmFsY29uICovCi0JCWlmICgoY29va2llX21jaCA9PSBNQ0hfU1RFPDwxNikgfHwgKGNvb2tpZV9tY2ggPT0gTUNIX0YzMDw8MTYpKSB7Ci0JCQlURVNUX0pPWV9FTkFCTEVEKGVudnIsICJwb3J0YS1wYWQiLCBQT1JUQV9QQUQwKTsKLQkJCWlmICghYXRhcmlqb3lzdGlja3NbUE9SVEFfUEFEMF0uZW5hYmxlZCkgewotCQkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgInBvcnRhLWpveTAiLCBQT1JUQV9KT1kwKTsKLQkJCQlURVNUX0pPWV9FTkFCTEVEKGVudnIsICJwb3J0YS1qb3kxIiwgUE9SVEFfSk9ZMSk7Ci0JCQkJaWYgKCEoYXRhcmlqb3lzdGlja3NbUE9SVEFfSk9ZMF0uZW5hYmxlZCkgJiYgIShhdGFyaWpveXN0aWNrc1tQT1JUQV9KT1kxXS5lbmFibGVkKSkgewotCQkJCQlURVNUX0pPWV9FTkFCTEVEKGVudnIsICJwb3J0YS1scCIsIFBPUlRBX0xQKTsKLQkJCQkJaWYgKCFhdGFyaWpveXN0aWNrc1tQT1JUQV9MUF0uZW5hYmxlZCkgewotCQkJCQkJVEVTVF9KT1lfRU5BQkxFRChlbnZyLCAicG9ydGEtYW5wYWQiLCBQT1JUQV9BTlBBRCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgInBvcnRiLXBhZCIsIFBPUlRCX1BBRDApOwotCQkJaWYgKCFhdGFyaWpveXN0aWNrc1tQT1JUQl9QQUQwXS5lbmFibGVkKSB7Ci0JCQkJVEVTVF9KT1lfRU5BQkxFRChlbnZyLCAicG9ydGItam95MCIsIFBPUlRCX0pPWTApOwotCQkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgInBvcnRiLWpveTEiLCBQT1JUQl9KT1kxKTsKLQkJCQlpZiAoIShhdGFyaWpveXN0aWNrc1tQT1JUQl9KT1kwXS5lbmFibGVkKSAmJiAhKGF0YXJpam95c3RpY2tzW1BPUlRCX0pPWTFdLmVuYWJsZWQpKSB7Ci0JCQkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgInBvcnRiLWFucGFkIiwgUE9SVEJfQU5QQUQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghYXRhcmlqb3lzdGlja3NbSUtCRF9KT1kxXS5lbmFibGVkKSB7Ci0JCQlpZiAoU0RMX0F0YXJpWGJpb3NfZW5hYmxlZCE9MCkgewotCQkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgInhiaW9zLWpveTEiLCBYQklPU19KT1kxKTsKLQkJCX0KLQkJfQotI2lmIDAKLQkJLyogUGFyYWxsZWwgcG9ydCBvbiBhbnkgQXRhcmksIG1heWJlIGNsb25lcyAqLwotCQlpZiAoKGNvb2tpZV9tY2ggPT0gTUNIX1NUPDwxNikgfHwgKChjb29raWVfbWNoPj4xNikgPT0gTUNIX1NURSkgfHwKLQkJCShjb29raWVfbWNoID09IE1DSF9UVDw8MTYpIHx8IChjb29raWVfbWNoID09IE1DSF9GMzA8PDE2KSkgewotCQkJVEVTVF9KT1lfRU5BQkxFRChlbnZyLCAicGFyYS1qb3kwIiwgUEFSQV9KT1kwKTsKLQkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgInBhcmEtam95MSIsIFBBUkFfSk9ZMSk7Ci0JCX0KLSNlbmRpZgotCX0KLQotCS8qIE5lZWQgdG8gdXBkYXRlIGpveXBhZCBwb3J0cyA/ICovCi0Jam95cGFkX3BvcnRzX2VuYWJsZWQ9U0RMX0ZBTFNFOwotCWZvciAoaT1QT1JUQV9QQUQwO2k8PVBPUlRCX0FOUEFEO2krKykgewotCQlpZiAoYXRhcmlqb3lzdGlja3NbaV0uZW5hYmxlZCkgewotCQkJam95cGFkX3BvcnRzX2VuYWJsZWQ9U0RMX1RSVUU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCVNETF9udW1qb3lzdGlja3MgPSAwOwotCWZvciAoaT0wO2k8TUFYX0pPWVNUSUNLUztpKyspIHsKLQkJaWYgKGF0YXJpam95c3RpY2tzW2ldLmVuYWJsZWQpIHsKLQkJCSsrU0RMX251bWpveXN0aWNrczsKLQkJfQotCX0KLQotCXJldHVybihTRExfbnVtam95c3RpY2tzKTsKLX0KLQotc3RhdGljIGludCBHZXRFbmFibGVkQXRhcmlKb3lzdGljayhpbnQgaW5kZXgpCi17Ci0JaW50IGksajsKLQotCS8qIFJldHVybiB0aGUgbnRoJ2luZGV4JyBlbmFibGVkIGF0YXJpIGpveXN0aWNrICovCi0Jaj0wOwotCWZvciAoaT0wO2k8TUFYX0pPWVNUSUNLUztpKyspIHsKLQkJaWYgKCFhdGFyaWpveXN0aWNrc1tpXS5lbmFibGVkKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChqPT1pbmRleCkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQkrK2o7Ci0JfQotCWlmIChpPT1NQVhfSk9ZU1RJQ0tTKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gaTsKLX0KLQotY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQotewotCWludCBudW1qb3lzdGljazsKLQotCW51bWpveXN0aWNrPUdldEVuYWJsZWRBdGFyaUpveXN0aWNrKGluZGV4KTsKLQlpZiAobnVtam95c3RpY2s9PS0xKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybihhdGFyaWpveXN0aWNrc1tudW1qb3lzdGlja10ubmFtZSk7Ci19Ci0KLWludCBTRExfU1lTX0pveXN0aWNrT3BlbihTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCWludCBudW1qb3lzdGljazsKLQkKLQludW1qb3lzdGljaz1HZXRFbmFibGVkQXRhcmlKb3lzdGljayhqb3lzdGljay0+aW5kZXgpOwotCWlmIChudW1qb3lzdGljaz09LTEpCi0JCXJldHVybiAtMTsKLQkKLQlqb3lzdGljay0+bmF4ZXM9MDsKLQlqb3lzdGljay0+bmhhdHM9MDsKLQlqb3lzdGljay0+bmJhbGxzPTA7Ci0KLQlzd2l0Y2gobnVtam95c3RpY2spIHsKLQkJY2FzZSBQT1JUQV9QQUQwOgotCQljYXNlIFBPUlRBX1BBRDE6Ci0JCWNhc2UgUE9SVEFfUEFEMjoKLQkJY2FzZSBQT1JUQV9QQUQzOgotCQljYXNlIFBPUlRCX1BBRDA6Ci0JCWNhc2UgUE9SVEJfUEFEMToKLQkJY2FzZSBQT1JUQl9QQUQyOgotCQljYXNlIFBPUlRCX1BBRDM6Ci0JCQlqb3lzdGljay0+bmhhdHM9MTsKLQkJCWpveXN0aWNrLT5uYnV0dG9ucz1KUF9OVU1fQlVUVE9OUzsKLQkJCWJyZWFrOwotCQljYXNlIFBPUlRBX0xQOgotCQljYXNlIFBPUlRBX0FOUEFEOgotCQljYXNlIFBPUlRCX0FOUEFEOgotCQkJam95c3RpY2stPm5heGVzPTI7Ci0JCQlqb3lzdGljay0+bmJ1dHRvbnM9MjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJam95c3RpY2stPm5oYXRzPTE7Ci0JCQlqb3lzdGljay0+bmJ1dHRvbnM9MTsKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JaW50IG51bWpveXN0aWNrOwotCVVpbnQ4IGhhdHN0YXRlOwotCVVpbnQzMiBjdXJzdGF0ZSxwcmV2c3RhdGU7Ci0JCi0JbnVtam95c3RpY2s9R2V0RW5hYmxlZEF0YXJpSm95c3RpY2soam95c3RpY2stPmluZGV4KTsKLQlpZiAobnVtam95c3RpY2s9PS0xKQotCQlyZXR1cm47Ci0KLQlwcmV2c3RhdGUgPSBhdGFyaWpveXN0aWNrc1tudW1qb3lzdGlja10ucHJldnN0YXRlOwotCi0JaWYgKGpveXBhZF9wb3J0c19lbmFibGVkKSB7Ci0JCVN1cGV4ZWMoVXBkYXRlSm95cGFkcyk7Ci0JfQotCi0Jc3dpdGNoIChudW1qb3lzdGljaykgewotCQljYXNlIElLQkRfSk9ZMToKLQkJY2FzZSBYQklPU19KT1kxOgotCQkJewotCQkJCWN1cnN0YXRlID0gMDsKLQotCQkJCWlmIChudW1qb3lzdGljaz09SUtCRF9KT1kxKSB7Ci0JCQkJCWN1cnN0YXRlID0gU0RMX0F0YXJpSWtiZF9qb3lzdGljayAmIDB4ZmY7Ci0JCQkJfQotCQkJCWlmIChudW1qb3lzdGljaz09WEJJT1NfSk9ZMSkgewotCQkJCQljdXJzdGF0ZSA9IFNETF9BdGFyaVhiaW9zX2pveXN0aWNrICYgMHhmZjsKLQkJCQl9Ci0KLQkJCQlpZiAoY3Vyc3RhdGUgIT0gcHJldnN0YXRlKSB7Ci0JCQkJCWhhdHN0YXRlID0gU0RMX0hBVF9DRU5URVJFRDsKLQkJCQkJaWYgKGN1cnN0YXRlICYgSUtCRF9KT1lfTEVGVCkgewotCQkJCQkJaGF0c3RhdGUgfD0gU0RMX0hBVF9MRUZUOwotCQkJCQl9Ci0JCQkJCWlmIChjdXJzdGF0ZSAmIElLQkRfSk9ZX1JJR0hUKSB7Ci0JCQkJCQloYXRzdGF0ZSB8PSBTRExfSEFUX1JJR0hUOwotCQkJCQl9Ci0JCQkJCWlmIChjdXJzdGF0ZSAmIElLQkRfSk9ZX1VQKSB7Ci0JCQkJCQloYXRzdGF0ZSB8PSBTRExfSEFUX1VQOwotCQkJCQl9Ci0JCQkJCWlmIChjdXJzdGF0ZSAmIElLQkRfSk9ZX0RPV04pIHsKLQkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfRE9XTjsKLQkJCQkJfQotCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrSGF0KGpveXN0aWNrLCAwLCBoYXRzdGF0ZSk7Ci0KLQkJCQkJLyogQnV0dG9uICovCi0JCQkJCWlmICgoY3Vyc3RhdGUgJiBJS0JEX0pPWV9GSVJFKSAmJiAhKHByZXZzdGF0ZSAmIElLQkRfSk9ZX0ZJUkUpKSB7Ci0JCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLDAsU0RMX1BSRVNTRUQpOwotCQkJCQl9Ci0JCQkJCWlmICghKGN1cnN0YXRlICYgSUtCRF9KT1lfRklSRSkgJiYgKHByZXZzdGF0ZSAmIElLQkRfSk9ZX0ZJUkUpKSB7Ci0JCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLDAsU0RMX1JFTEVBU0VEKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhdGFyaWpveXN0aWNrc1tudW1qb3lzdGlja10ucHJldnN0YXRlID0gY3Vyc3RhdGU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQT1JUQV9QQUQwOgotCQljYXNlIFBPUlRBX1BBRDE6Ci0JCWNhc2UgUE9SVEFfUEFEMjoKLQkJY2FzZSBQT1JUQV9QQUQzOgotCQljYXNlIFBPUlRCX1BBRDA6Ci0JCWNhc2UgUE9SVEJfUEFEMToKLQkJY2FzZSBQT1JUQl9QQUQyOgotCQljYXNlIFBPUlRCX1BBRDM6Ci0JCQl7Ci0JCQkJaW50IG51bWpveXBhZCxpOwotCQkJCQotCQkJCW51bWpveXBhZCA9IDA7Ci0JCQkJc3dpdGNoKG51bWpveXN0aWNrKSB7Ci0JCQkJCWNhc2UgUE9SVEFfUEFEMDoKLQkJCQkJCW51bWpveXBhZCA9IDA7CWJyZWFrOwotCQkJCQljYXNlIFBPUlRBX1BBRDE6Ci0JCQkJCQludW1qb3lwYWQgPSAxOwlicmVhazsKLQkJCQkJY2FzZSBQT1JUQV9QQUQyOgotCQkJCQkJbnVtam95cGFkID0gMjsJYnJlYWs7Ci0JCQkJCWNhc2UgUE9SVEFfUEFEMzoKLQkJCQkJCW51bWpveXBhZCA9IDM7CWJyZWFrOwotCQkJCQljYXNlIFBPUlRCX1BBRDA6Ci0JCQkJCQludW1qb3lwYWQgPSA0OwlicmVhazsKLQkJCQkJY2FzZSBQT1JUQl9QQUQxOgotCQkJCQkJbnVtam95cGFkID0gNTsJYnJlYWs7Ci0JCQkJCWNhc2UgUE9SVEJfUEFEMjoKLQkJCQkJCW51bWpveXBhZCA9IDY7CWJyZWFrOwotCQkJCQljYXNlIFBPUlRCX1BBRDM6Ci0JCQkJCQludW1qb3lwYWQgPSA3OwlicmVhazsKLQkJCQl9CQkJCQotCQkJCQotCQkJCWN1cnN0YXRlPWpwX2pveXBhZHNbbnVtam95cGFkXTsKLQkJCQlpZiAoY3Vyc3RhdGUhPXByZXZzdGF0ZSkgewotCQkJCQloYXRzdGF0ZSA9IFNETF9IQVRfQ0VOVEVSRUQ7Ci0JCQkJCWlmIChjdXJzdGF0ZSAmICgxPDxKUF9MRUZUKSkgewotCQkJCQkJaGF0c3RhdGUgfD0gU0RMX0hBVF9MRUZUOwotCQkJCQl9Ci0JCQkJCWlmIChjdXJzdGF0ZSAmICgxPDxKUF9SSUdIVCkpIHsKLQkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfUklHSFQ7Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnN0YXRlICYgKDE8PEpQX1VQKSkgewotCQkJCQkJaGF0c3RhdGUgfD0gU0RMX0hBVF9VUDsKLQkJCQkJfQotCQkJCQlpZiAoY3Vyc3RhdGUgJiAoMTw8SlBfRE9XTikpIHsKLQkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfRE9XTjsKLQkJCQkJfQotCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrSGF0KGpveXN0aWNrLCAwLCBoYXRzdGF0ZSk7Ci0KLQkJCQkJLyogQnV0dG9ucyAqLwotCQkJCQlmb3IgKGk9MDtpPEpQX05VTV9CVVRUT05TO2krKykgewotCQkJCQkJaW50IGJ1dHRvbjsKLQkJCQkJCQotCQkJCQkJYnV0dG9uPTE8PGpwX2J1dHRvbnNbaV07Ci0KLQkJCQkJCWlmICgoY3Vyc3RhdGUgJiBidXR0b24pICYmICEocHJldnN0YXRlICYgYnV0dG9uKSkgewotCQkJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssaSxTRExfUFJFU1NFRCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIShjdXJzdGF0ZSAmIGJ1dHRvbikgJiYgKHByZXZzdGF0ZSAmIGJ1dHRvbikpIHsKLQkJCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLGksU0RMX1JFTEVBU0VEKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlhdGFyaWpveXN0aWNrc1tudW1qb3lzdGlja10ucHJldnN0YXRlID0gY3Vyc3RhdGU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQT1JUQV9KT1kwOgotCQljYXNlIFBPUlRBX0pPWTE6Ci0JCWNhc2UgUE9SVEJfSk9ZMDoKLQkJY2FzZSBQT1JUQl9KT1kxOgotCQkJewotCQkJCWludCBmaXJlX3NoaWZ0PTAsZGlyX3NoaWZ0PTA7Ci0JCQkJCi0JCQkJaWYgKG51bWpveXN0aWNrPT1QT1JUQV9KT1kwKSB7CWZpcmVfc2hpZnQ9MDsgZGlyX3NoaWZ0PTA7IH0KLQkJCQlpZiAobnVtam95c3RpY2s9PVBPUlRBX0pPWTEpIHsJZmlyZV9zaGlmdD0xOyBkaXJfc2hpZnQ9NDsgfQotCQkJCWlmIChudW1qb3lzdGljaz09UE9SVEJfSk9ZMCkgewlmaXJlX3NoaWZ0PTI7IGRpcl9zaGlmdD04OyB9Ci0JCQkJaWYgKG51bWpveXN0aWNrPT1QT1JUQl9KT1kxKSB7CWZpcmVfc2hpZnQ9MzsgZGlyX3NoaWZ0PTEyOyB9Ci0KLQkJCQljdXJzdGF0ZSA9IChqcF9kaXJlY3Rpb25zPj5kaXJfc2hpZnQpICYgMTU7Ci0JCQkJY3Vyc3RhdGUgfD0gKChqcF9maXJlcz4+ZmlyZV9zaGlmdCkgJiAxKTw8NDsKLQotCQkJCWlmIChjdXJzdGF0ZSAhPSBwcmV2c3RhdGUpIHsKLQkJCQkJaGF0c3RhdGUgPSBTRExfSEFUX0NFTlRFUkVEOwotCQkJCQlpZiAoY3Vyc3RhdGUgJiBQT1JUX0pTX0xFRlQpIHsKLQkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfTEVGVDsKLQkJCQkJfQotCQkJCQlpZiAoY3Vyc3RhdGUgJiBQT1JUX0pTX1JJR0hUKSB7Ci0JCQkJCQloYXRzdGF0ZSB8PSBTRExfSEFUX1JJR0hUOwotCQkJCQl9Ci0JCQkJCWlmIChjdXJzdGF0ZSAmIFBPUlRfSlNfVVApIHsKLQkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfVVA7Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnN0YXRlICYgUE9SVF9KU19ET1dOKSB7Ci0JCQkJCQloYXRzdGF0ZSB8PSBTRExfSEFUX0RPV047Ci0JCQkJCX0KLQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgMCwgaGF0c3RhdGUpOwotCi0JCQkJCS8qIEJ1dHRvbiAqLwotCQkJCQlpZiAoKGN1cnN0YXRlICYgUE9SVF9KU19GSVJFKSAmJiAhKHByZXZzdGF0ZSAmIFBPUlRfSlNfRklSRSkpIHsKLQkJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssMCxTRExfUFJFU1NFRCk7Ci0JCQkJCX0KLQkJCQkJaWYgKCEoY3Vyc3RhdGUgJiBQT1JUX0pTX0ZJUkUpICYmIChwcmV2c3RhdGUgJiBQT1JUX0pTX0ZJUkUpKSB7Ci0JCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLDAsU0RMX1JFTEVBU0VEKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhdGFyaWpveXN0aWNrc1tudW1qb3lzdGlja10ucHJldnN0YXRlID0gY3Vyc3RhdGU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQT1JUQV9MUDoKLQkJCXsKLQkJCQlpbnQgaTsKLQotCQkJCWN1cnN0YXRlID0ganBfbGlnaHRwZW5zWzBdPj4xOwotCQkJCWN1cnN0YXRlIHw9IChqcF9saWdodHBlbnNbMV0+PjEpPDwxNTsKLQkJCQljdXJzdGF0ZSB8PSAoanBfZmlyZXMgJiAzKTw8MzA7Ci0KLQkJCQlpZiAoY3Vyc3RhdGUgIT0gcHJldnN0YXRlKSB7Ci0JCQkJCS8qIFggYXhpcyAqLwotCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywwLGpwX2xpZ2h0cGVuc1swXSBeIDB4ODAwMCk7Ci0JCQkJCS8qIFkgYXhpcyAqLwotCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywxLGpwX2xpZ2h0cGVuc1sxXSBeIDB4ODAwMCk7Ci0JCQkJCS8qIEJ1dHRvbnMgKi8KLQkJCQkJZm9yIChpPTA7aTwyO2krKykgewotCQkJCQkJaW50IGJ1dHRvbjsKLQkJCQkJCQotCQkJCQkJYnV0dG9uPTE8PCgzMCtpKTsKLQotCQkJCQkJaWYgKChjdXJzdGF0ZSAmIGJ1dHRvbikgJiYgIShwcmV2c3RhdGUgJiBidXR0b24pKSB7Ci0JCQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayxpLFNETF9QUkVTU0VEKTsKLQkJCQkJCX0KLQkJCQkJCWlmICghKGN1cnN0YXRlICYgYnV0dG9uKSAmJiAocHJldnN0YXRlICYgYnV0dG9uKSkgewotCQkJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssaSxTRExfUkVMRUFTRUQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWF0YXJpam95c3RpY2tzW251bWpveXN0aWNrXS5wcmV2c3RhdGUgPSBjdXJzdGF0ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBPUlRBX0FOUEFEOgotCQljYXNlIFBPUlRCX0FOUEFEOgotCQkJewotCQkJCWludCBudW1wYWRkbGUsIGk7Ci0JCQkJCi0JCQkJbnVtcGFkZGxlPTA8PDE7Ci0JCQkJaWYgKG51bWpveXN0aWNrPT1QT1JUQl9BTlBBRCkgbnVtcGFkZGxlPTE8PDE7Ci0KLQkJCQljdXJzdGF0ZSA9IGpwX3BhZGRsZXNbbnVtcGFkZGxlXT4+MTsKLQkJCQljdXJzdGF0ZSB8PSAoanBfcGFkZGxlc1tudW1wYWRkbGUrMV0+PjEpPDwxNTsKLQkJCQljdXJzdGF0ZSB8PSAoKGpwX2ZpcmVzPj5udW1wYWRkbGUpICYgMyk8PDMwOwotCi0JCQkJaWYgKGN1cnN0YXRlICE9IHByZXZzdGF0ZSkgewotCQkJCQkvKiBYIGF4aXMgKi8KLQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssMCxqcF9wYWRkbGVzW251bXBhZGRsZV0gXiAweDgwMDApOwotCQkJCQkvKiBZIGF4aXMgKi8KLQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssMSxqcF9wYWRkbGVzW251bXBhZGRsZSsxXSBeIDB4ODAwMCk7Ci0JCQkJCS8qIEJ1dHRvbnMgKi8KLQkJCQkJZm9yIChpPTA7aTwyO2krKykgewotCQkJCQkJaW50IGJ1dHRvbjsKLQkJCQkJCQotCQkJCQkJYnV0dG9uPTE8PCgzMCtpKTsKLQotCQkJCQkJaWYgKChjdXJzdGF0ZSAmIGJ1dHRvbikgJiYgIShwcmV2c3RhdGUgJiBidXR0b24pKSB7Ci0JCQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayxpLFNETF9QUkVTU0VEKTsKLQkJCQkJCX0KLQkJCQkJCWlmICghKGN1cnN0YXRlICYgYnV0dG9uKSAmJiAocHJldnN0YXRlICYgYnV0dG9uKSkgewotCQkJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssaSxTRExfUkVMRUFTRUQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWF0YXJpam95c3RpY2tzW251bWpveXN0aWNrXS5wcmV2c3RhdGUgPSBjdXJzdGF0ZTsKLQkJCX0KLQkJCWJyZWFrOwotI2lmIDAKLQkJY2FzZSBQQVJBX0pPWTA6Ci0JCWNhc2UgUEFSQV9KT1kxOgotCQkJYnJlYWs7Ci0jZW5kaWYKLQl9OwotCi0JcmV0dXJuOwotfQotCi12b2lkIFNETF9TWVNfSm95c3RpY2tDbG9zZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCXJldHVybjsKLX0KLQotdm9pZCBTRExfU1lTX0pveXN0aWNrUXVpdCh2b2lkKQotewotCVNETF9udW1qb3lzdGlja3M9MDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tIEpveXBhZCBJL08gcmVhZC93cml0ZSBpbnRlcmZhY2UgLS0tKi8KLQotI2RlZmluZSBKT1lQQURfSU9fQkFTRSAoMHhmZmZmOTIwMCkKLXN0cnVjdCBKT1lQQURfSU9fUyB7Ci0JVWludDE2IGZpcmVzOwotCVVpbnQxNiBkaXJlY3Rpb25zOwotCVVpbnQxNiBkdW1teTFbNl07Ci0JVWludDE2IHBhZGRsZXNbNF07Ci0JVWludDE2IGR1bW15Mls0XTsKLQlVaW50MTYgbGlnaHRwZW5zWzJdOwotfTsKLSNkZWZpbmUgSk9ZUEFEX0lPICgoKih2b2xhdGlsZSBzdHJ1Y3QgSk9ZUEFEX0lPX1MgKilKT1lQQURfSU9fQkFTRSkpCi0KLXN0YXRpYyBjb25zdCBVaW50MTYgam95cGFkX21hc2tzWzgqNF09ewotCTB4ZmZmZSwgMHhmZmZkLCAweGZmZmIsIDB4ZmZmNywKLQkweGZmZjAsIDB4ZmZmMSwgMHhmZmYyLCAweGZmZjMsCi0JMHhmZmY0LCAweGZmZjUsIDB4ZmZmNiwgMHhmZmY4LAotCTB4ZmZmOSwgMHhmZmZhLCAweGZmZmMsIDB4ZmZmZiwKLQkweGZmZWYsIDB4ZmZkZiwgMHhmZmJmLCAweGZmN2YsCi0JMHhmZjBmLCAweGZmMWYsIDB4ZmYyZiwgMHhmZjNmLAotCTB4ZmY0ZiwgMHhmZjVmLCAweGZmNmYsIDB4ZmY4ZiwKLQkweGZmOWYsIDB4ZmZhZiwgMHhmZmNmLCAweGZmZmYKLX07Ci0KLXN0YXRpYyB2b2lkIFVwZGF0ZUpveXBhZHModm9pZCkKLXsKLQlVaW50MTYgdG1wLCBpLCBqOwotCVVpbnQzMiBjdXJfZmlyZSwgY3VyX2RpcjsKLQotCS8qLS0tIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHN1cGVydmlzb3IgbW9kZSAtLS0qLwotCi0JLyogVXBkYXRlIGpveXN0aWNrcyAqLwotCWpwX2ZpcmVzID0gKH4oSk9ZUEFEX0lPLmZpcmVzKSkgJiAxNTsKLQlqcF9kaXJlY3Rpb25zID0gKH4oSk9ZUEFEX0lPLmRpcmVjdGlvbnMpKTsKLQkKLQkvKiBVcGRhdGUgbGlnaHRwZW4gKi8KLQl0bXAgPSBKT1lQQURfSU8ubGlnaHRwZW5zWzBdICYgMTAyMzsKLQlqcF9saWdodHBlbnNbMF0gPSAodG1wPDw2KSB8ICh0bXA+PjQpOwotCXRtcCA9IEpPWVBBRF9JTy5saWdodHBlbnNbMV0gJiAxMDIzOwotCWpwX2xpZ2h0cGVuc1sxXSA9ICh0bXA8PDYpIHwgKHRtcD4+NCk7Ci0JCi0JLyogVXBkYXRlIHBhZGRsZXMgKi8KLQl0bXAgPSAoSk9ZUEFEX0lPLnBhZGRsZXNbMF0gJiAyNTUpOwotCWpwX3BhZGRsZXNbMF0gPSAodG1wPDw4KSB8IHRtcDsKLQl0bXAgPSAoSk9ZUEFEX0lPLnBhZGRsZXNbMV0gJiAyNTUpOwotCWpwX3BhZGRsZXNbMV0gPSAodG1wPDw4KSB8IHRtcDsKLQl0bXAgPSAoSk9ZUEFEX0lPLnBhZGRsZXNbMl0gJiAyNTUpOwotCWpwX3BhZGRsZXNbMl0gPSAodG1wPDw4KSB8IHRtcDsKLQl0bXAgPSAoSk9ZUEFEX0lPLnBhZGRsZXNbM10gJiAyNTUpOwotCWpwX3BhZGRsZXNbM10gPSAodG1wPDw4KSB8IHRtcDsKLQotCS8qIFVwZGF0ZSBqb3lwYWRzIG9uIHRlYW10YXAgcG9ydCBBICovCQotCWZvciAoaT0wOyBpPDQ7IGkrKykgewotCQlqcF9qb3lwYWRzW2ldID0gMDsKLQkJZm9yIChqPTA7IGo8NDsgaisrKSB7Ci0JCQlKT1lQQURfSU8uZGlyZWN0aW9ucyA9IGpveXBhZF9tYXNrc1soaSo0KStqXTsKLQotCQkJY3VyX2ZpcmUgPSAofihKT1lQQURfSU8uZmlyZXMpICYgMyk8PDE2OwotCQkJY3VyX2RpciA9ICh+KEpPWVBBRF9JTy5kaXJlY3Rpb25zKT4+OCkgJiAxNTsKLQotCQkJanBfam95cGFkc1tpXSB8PSBjdXJfZmlyZTw8KGoqMik7Ci0JCQlqcF9qb3lwYWRzW2ldIHw9IGN1cl9kaXI8PChqKjQpOwotCQl9Ci0JfQotCi0JLyogVXBkYXRlIGpveXBhZHMgb24gdGVhbXRhcCBwb3J0IEIgKi8JCi0JZm9yIChpPTQ7IGk8ODsgaSsrKSB7Ci0JCWpwX2pveXBhZHNbaV0gPSAwOwotCQlmb3IgKGo9MDsgajw0OyBqKyspIHsKLQkJCUpPWVBBRF9JTy5kaXJlY3Rpb25zID0gam95cGFkX21hc2tzWyhpKjQpK2pdOwotCi0JCQljdXJfZmlyZSA9ICh+KEpPWVBBRF9JTy5maXJlcykgJiAweGMpPDwxNDsKLQkJCWN1cl9kaXIgPSAofihKT1lQQURfSU8uZGlyZWN0aW9ucyk+PjEyKSAmIDE1OwotCi0JCQlqcF9qb3lwYWRzW2ldIHw9IGN1cl9maXJlPDwoaioyKTsKLQkJCWpwX2pveXBhZHNbaV0gfD0gY3VyX2Rpcjw8KGoqNCk7Ci0JCX0KLQl9Ci0KLQlKT1lQQURfSU8uZGlyZWN0aW9ucz0weGZmZmY7Ci19Ci0KLSNlbmRpZiAvKiBTRExfSk9ZU1RJQ0tfTUlOVCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9vczIvU0RMX3N5c2pveXN0aWNrLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL29zMi9TRExfc3lzam95c3RpY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkY2E0ZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL29zMi9TRExfc3lzam95c3RpY2suYworKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9KT1lTVElDS19PUzIKLQotLyogT1MvMiBKb3lzdGljayBkcml2ZXIsIGNvbnRyaWJ1dGVkIGJ5IERhbmllbCBDYWV0YW5vICovCi0KLSNpbmNsdWRlIDxtZW0uaD4KLQotI2RlZmluZSBJTkNMX0RPU0RFVklDRVMKLSNkZWZpbmUgSU5DTF9ET1NERVZJT0NUTAotI2RlZmluZSBJTkNMX0RPU01FTU1HUgotI2luY2x1ZGUgPG9zMi5oPgotI2luY2x1ZGUgImpveW9zMi5oIgotCi0jaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNqb3lzdGljay5oIgotI2luY2x1ZGUgIi4uL1NETF9qb3lzdGlja19jLmgiCi0KLUhGSUxFIGhKb3lQb3J0ID0gTlVMTDsJCS8qIEpveXN0aWNrIEdBTUUkIFBvcnQgQWRkcmVzcyAqLwotI2RlZmluZSBNQVhfSk9ZU1RJQ0tTCTIJLyogTWF4aW11bSBvZiB0d28gam95c3RpY2tzICovCi0jZGVmaW5lIE1BWF9BWEVTCTQJCQkvKiBlYWNoIGpveXN0aWNrIGNhbiBoYXZlIHVwIHRvIDQgYXhlcyAqLwotI2RlZmluZSBNQVhfQlVUVE9OUwk4CQkvKiA4IGJ1dHRvbnMgKi8KLSNkZWZpbmUgTUFYX0hBVFMJMAkJCS8qIDAgaGF0cyAtIE9TLzIgZG9lc24ndCBzdXBwb3J0IGl0ICovCi0jZGVmaW5lIE1BWF9CQUxMUwkwCQkJLyogYW5kIDAgYmFsbHMgLSBPUy8yIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLwotI2RlZmluZSBBWElTX01JTiAtMzI3NjgJCS8qIG1pbmltdW0gdmFsdWUgZm9yIGF4ZXMgY29vcmRpbmF0ZSAqLwotI2RlZmluZSBBWElTX01BWCAzMjc2NwkJLyogbWF4aW11bSB2YWx1ZSBmb3IgYXhlcyBjb29yZGluYXRlICovCi0jZGVmaW5lIE1BWF9KT1lOQU1FCTEyOAkvKiBKb3lzdGljayBuYW1lIG1heSBoYXZlIDEyOCBjaGFyYWN0ZXJzICovCi0vKiBsaW1pdCBheGVzIHRvIDI1NiBwb3NzaWJsZSBwb3NpdGlvbnMgdG8gZmlsdGVyIG91dCBub2lzZSAqLwotI2RlZmluZSBKT1lfQVhJU19USFJFU0hPTEQgKCgoQVhJU19NQVgpLShBWElTX01JTikpLzI1NikKLS8qIENhbGMgQnV0dG9uIEZsYWcgZm9yIGJ1dHRvbnMgQSB0byBEICovCi0jZGVmaW5lIEpPWV9CVVRUT05fRkxBRyhuKSAoMTw8bikKLQotLyogSm95c3RpY2sgZGF0YS4uLiBob2xkIGluZm9ybWF0aW9uIGFib3V0IGRldGVjdGVkIGRldmljZXMgKi8KLXR5cGVkZWYgc3RydWN0IFNZU19Kb3lEYXRhX3MKLXsKLVNpbnQ4CQkJCQlpZDsJCQkJCQkJCS8vIERldmljZSBJRAotY2hhcgkJCQkJc3pEZXZpY2VOYW1lW01BWF9KT1lOQU1FXTsJLy8gRGV2aWNlIE5hbWUKLWNoYXIJCQkJCWF4ZXM7CQkJCQkJCQkvLyBOdW1iZXIgb2YgYXhlcwotY2hhcgkJCQkJYnV0dG9uczsJCQkJCQkJLy8gTnVtYmVyIG9mIGJ1dHRvbnMKLWNoYXIJCQkJCWhhdHM7CQkJCQkJCQkvLyBOdW1iZXIgb2YgYnV0dG9ucwotY2hhcgkJCQkJYmFsbHM7CQkJCQkJCS8vIE51bWJlciBvZiBidXR0b25zCi1pbnQJCQkJCWF4ZXNfbWluW01BWF9BWEVTXTsJCQkvLyBtaW5pbXVtIGNhbGxpYnJhdGlvbiB2YWx1ZSBmb3IgYXhlcwotaW50CQkJCQlheGVzX21lZFtNQVhfQVhFU107CQkJLy8gbWVkaXVtIGNhbGxpYnJhdGlvbiB2YWx1ZSBmb3IgYXhlcwotaW50CQkJCQlheGVzX21heFtNQVhfQVhFU107CQkJLy8gbWF4aW11bSBjYWxsaWJyYXRpb24gdmFsdWUgZm9yIGF4ZXMKLWludAkJCQkJYnV0dG9uY2FsY1s0XTsJCQkJCS8vIFVzZWQgZm9yIGJ1dHRvbnMgNSwgNiwgNyBhbmQgOC4KLX0gU1lTX0pveURhdGFfdCwgKlNZU19Kb3lEYXRhX3A7Ci0KLVNZU19Kb3lEYXRhX3QgU1lTX0pveURhdGFbTUFYX0pPWVNUSUNLU107Ci0KLQotLyogU3RydWN0dXJlIHVzZWQgdG8gY29udmVydCBkYXRhIGZyb20gT1MvMiBkcml2ZXIgZm9ybWF0IHRvIFNETCBmb3JtYXQgKi8KLXN0cnVjdCBqb3lzdGlja19od2RhdGEKLXsKLVNpbnQ4CQkJCQlpZDsKLXN0cnVjdCBfdHJhbnNheGVzCi0JewotCWludCBvZmZzZXQ7CQkJCQkvKiBDZW50ZXIgT2Zmc2V0ICovCi0JZmxvYXQgc2NhbGUxOwkJCQkvKiBDZW50ZXIgdG8gbGVmdC91cCBTY2FsZSAqLwotCWZsb2F0IHNjYWxlMjsJCQkJLyogQ2VudGVyIHRvIHJpZ2h0L2Rvd24gU2NhbGUgKi8KLQl9IHRyYW5zYXhlc1tNQVhfQVhFU107Ci19OwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBnZXQgdmFsdWVzIGZyb20gSm95c3RpY2sgRW52aXJvbm1lbnQgVmFyaWFibGUgKi8KLXN0cnVjdCBfam95Y2ZnCi17Ci1jaGFyCW5hbWVbTUFYX0pPWU5BTUVdOwotdW5zaWduZWQgaW50CWF4ZXM7Ci11bnNpZ25lZCBpbnQJYnV0dG9uczsKLXVuc2lnbmVkIGludAloYXRzOwotdW5zaWduZWQgaW50CWJhbGxzOwotfTsKLQotLyogT1MvMiBJbXBsZW1lbnRhdGlvbiBGdW5jdGlvbiBQcm90b3R5cGVzICovCi1BUElSRVQgam95UG9ydE9wZW4oSEZJTEUgKiBoR2FtZSk7Ci12b2lkIGpveVBvcnRDbG9zZShIRklMRSAqIGhHYW1lKTsKLWludCBqb3lHZXREYXRhKGNoYXIgKmpveWVudiwgY2hhciAqbmFtZSwgY2hhciBzdG9wY2hhciwgc2l6ZV90IG1heGNoYXJzKTsKLWludCBqb3lHZXRFbnYoc3RydWN0IF9qb3ljZmcgKiBqb3lkYXRhKTsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIGpveXN0aWNrcy4JCQkJCQkJCQkqLwotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgc2V0IFNETF9udW1qb3lzdGlja3MgdG8gdGhlIG51bWJlciBvZiBhdmFpbGFibGUJKi8KLS8qIGpveXN0aWNrcy4gIEpveXN0aWNrIDAgc2hvdWxkIGJlIHRoZSBzeXN0ZW0gZGVmYXVsdCBqb3lzdGljay4JCQkqLwotLyogSXQgc2hvdWxkIHJldHVybiAwLCBvciAtMSBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBTRExfU1lTX0pveXN0aWNrSW5pdCh2b2lkKQotewotQVBJUkVUIHJjOwkJCQkJCQkJCQkJLyogR2VuZXJpYyBPUy8yIHJldHVybiBjb2RlICovCi1HQU1FX1BPUlRfU1RSVUNUCXN0Sm95U3RhdHVzOwkJCQkvKiBKb3lzdGljayBTdGF0dXMgU3RydWN0dXJlICovCi1HQU1FX1BBUk1fU1RSVUNUCXN0R2FtZVBhcm1zOwkJCQkvKiBKb3lzdGljayBQYXJhbWV0ZXIgU3RydWN0dXJlICovCi1HQU1FX0NBTElCX1NUUlVDVAlzdEdhbWVDYWxpYjsJCQkJLyogQ2FsaWJyYXRpb24gU3RydWN0ICovCi1VTE9ORyB1bERhdGFMZW47CQkJCQkJCQkJLyogU2l6ZSBvZiBkYXRhICovCi1VTE9ORyB1bExhc3RUaWNrOwkJCQkJCS8qIFRpY2sgQ291bnRlciBmb3IgdGltaW5nIG9wZXJhdGlvbnMgKi8KLVVpbnQ4IG1heGRldnM7CQkJCQkJCQkJCS8qIE1heGltdW0gbnVtYmVyIG9mIGRldmljZXMgKi8KLVVpbnQ4IG51bWRldnM7CQkJCQkJCQkJCS8qIE51bWJlciBvZiBwcmVzZW50IGRldmljZXMgKi8KLVVpbnQ4IG1heGJ1dDsJCQkJCQkJCQkJLyogTWF4aW11bSBudW1iZXIgb2YgYnV0dG9ucy4uLiAqLwotVWludDggaTsJCQkJCQkJCQkJCQkvKiBUZW1wb3JhcnkgQ291bnQgVmFycyAqLwotVWludDggdWNOZXdKb3lzdGlja01hc2s7CQkJCQkJCQkJCS8qIE1hc2sgZm9yIEpveXN0aWNrIERldGVjdGlvbiAqLwotc3RydWN0IF9qb3ljZmcgam95Y2ZnOwkJCQkJCQkvKiBKb3kgQ29uZmlndXJhdGlvbiBmcm9tIGVudnZhciAqLwotCi0KLS8qIEdldCBNYXggTnVtYmVyIG9mIERldmljZXMgKi8KLXJjID0gam95UG9ydE9wZW4oJmhKb3lQb3J0KTsgLyogT3BlbiBHQU1FJCBwb3J0ICovCi1pZiAocmMgIT0gMCkgcmV0dXJuIDA7CS8qIENhbm5vdCBvcGVuLi4uIHJlcG9ydCBubyBqb3lzdGljayAqLwotdWxEYXRhTGVuID0gc2l6ZW9mKHN0R2FtZVBhcm1zKTsKLXJjID0gRG9zRGV2SU9DdGwoaEpveVBvcnQsIElPQ1RMX0NBVF9VU0VSLCBHQU1FX0dFVF9QQVJNUywKLQlOVUxMLCAwLCBOVUxMLCAmc3RHYW1lUGFybXMsIHVsRGF0YUxlbiwgJnVsRGF0YUxlbik7IC8qIEFzayBkZXZpY2UgaW5mbyAqLwotaWYgKHJjICE9IDApCi0JewotCWpveVBvcnRDbG9zZSgmaEpveVBvcnQpOwotCVNETF9TZXRFcnJvcigiQ291bGQgbm90IHJlYWQgam95c3RpY2sgcG9ydC4iKTsKLQlyZXR1cm4gLTE7Ci0JfQotaWYgKHN0R2FtZVBhcm1zLnVzZUEgIT0gMCkgbWF4ZGV2cysrOwotaWYgKHN0R2FtZVBhcm1zLnVzZUIgIT0gMCkgbWF4ZGV2cysrOwotaWYgKCBtYXhkZXZzID4gTUFYX0pPWVNUSUNLUyApIG1heGRldnMgPSBNQVhfSk9ZU1RJQ0tTOwotCi0vKiBEZWZpbmVzIG1pbi9tYXggYXhlcyB2YWx1ZXMgKGNhbGxpYnJhdGlvbikgKi8KLXVsRGF0YUxlbiA9IHNpemVvZihzdEdhbWVDYWxpYik7Ci1yYyA9IERvc0RldklPQ3RsKGhKb3lQb3J0LCBJT0NUTF9DQVRfVVNFUiwgR0FNRV9HRVRfQ0FMSUIsCi0JTlVMTCwgMCwgTlVMTCwgJnN0R2FtZUNhbGliLCB1bERhdGFMZW4sICZ1bERhdGFMZW4pOwotaWYgKHJjICE9IDApCi0JewotCWpveVBvcnRDbG9zZSgmaEpveVBvcnQpOwotCVNETF9TZXRFcnJvcigiQ291bGQgbm90IHJlYWQgY2FsbGlicmF0aW9uIGRhdGEuIik7Ci0JcmV0dXJuIC0xOwotCX0KLQotLyogRGV0ZXJtaW5lIGhvdyBtYW55IGpveXN0aWNrcyBhcmUgYWN0aXZlICovCi1udW1kZXZzID0gMDsJLyogUG9pbnRzIG5vIGRldmljZSAqLwotdWNOZXdKb3lzdGlja01hc2sgPSAweDBGOwkvKiByZWFkIGFsbCA0IGpveXN0aWNrIGF4aXMgKi8KLXVsRGF0YUxlbiA9IHNpemVvZih1Y05ld0pveXN0aWNrTWFzayk7Ci1yYyA9IERvc0RldklPQ3RsKGhKb3lQb3J0LCBJT0NUTF9DQVRfVVNFUiwgR0FNRV9QT1JUX1JFU0VULAotCQkmdWNOZXdKb3lzdGlja01hc2ssIHVsRGF0YUxlbiwgJnVsRGF0YUxlbiwgTlVMTCwgMCwgTlVMTCk7Ci1pZiAocmMgPT0gMCkKLQl7Ci0JdWxEYXRhTGVuID0gc2l6ZW9mKHN0Sm95U3RhdHVzKTsKLQlyYyA9IERvc0RldklPQ3RsKGhKb3lQb3J0LCBJT0NUTF9DQVRfVVNFUiwgR0FNRV9QT1JUX0dFVCwKLQkJTlVMTCwgMCwgTlVMTCwgJnN0Sm95U3RhdHVzLCB1bERhdGFMZW4sICZ1bERhdGFMZW4pOwotCWlmIChyYyAhPSAwKQotCQl7Ci0JCWpveVBvcnRDbG9zZSgmaEpveVBvcnQpOwotCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCBjYWxsIGpveXN0aWNrIHBvcnQuIik7Ci0JCXJldHVybiAtMTsKLQkJfQotCXVsTGFzdFRpY2sgPSBzdEpveVN0YXR1cy51bEpzX1RpY2tzOwotCXdoaWxlIChzdEpveVN0YXR1cy51bEpzX1RpY2tzID09IHVsTGFzdFRpY2spCi0JCXsKLQkJcmMgPSBEb3NEZXZJT0N0bChoSm95UG9ydCwgSU9DVExfQ0FUX1VTRVIsIEdBTUVfUE9SVF9HRVQsCi0JCQlOVUxMLCAwLCBOVUxMLCAmc3RKb3lTdGF0dXMsIHVsRGF0YUxlbiwgJnVsRGF0YUxlbik7Ci0JCX0KLQlpZiAoKHN0Sm95U3RhdHVzLnVjSnNfSm95U3RpY2tNYXNrICYgMHgwMykgPiAwKSBudW1kZXZzKys7Ci0JaWYgKCgoc3RKb3lTdGF0dXMudWNKc19Kb3lTdGlja01hc2sgPj4gMikgJiAweDAzKSA+IDApIG51bWRldnMrKzsKLQl9Ci0KLWlmIChudW1kZXZzPm1heGRldnMpIG51bWRldnM9bWF4ZGV2czsKLQotLyogSWYgKmFueSogam95c3RpY2sgd2FzIGRldGVjdGVkLi4uIExldCdzIGNvbmZpZ3VyZSBTREwgZm9yIHRoZW0gKi8KLWlmIChudW1kZXZzID4gMCkKLQl7Ci0JLyogVmVyaWZ5IGlmIGl0IGlzIGEgInVzZXIgZGVmaW5lZCIgam95c3RpY2sgKi8KLQlpZiAoam95R2V0RW52KCZqb3ljZmcpKQotCQl7Ci0JCUdBTUVfM1BPU19TVFJVQ1QgKiBheGlzWzRdOwotCQlheGlzWzBdID0gJnN0R2FtZUNhbGliLkF4OwotCQlheGlzWzFdID0gJnN0R2FtZUNhbGliLkF5OwotCQlheGlzWzJdID0gJnN0R2FtZUNhbGliLkJ4OwotCQlheGlzWzNdID0gJnN0R2FtZUNhbGliLkJ5OwotCQkvKiBTYXkgaXQgaGFzIG9uZSBkZXZpY2Ugb25seSAodXNlciBkZWZpbmVkIGlzIGFsd2F5cyBvbmUgZGV2aWNlIG9ubHkpICovCi0JCW51bWRldnMgPSAxOwotCQkvKiBEZWZpbmUgRGV2aWNlIDAgYXMuLi4gKi8KLQkJU1lTX0pveURhdGFbMF0uaWQ9MDsKLQkJLyogRGVmaW5lIE51bWJlciBvZiBBeGVzLi4uIHVwIHRvIDQgKi8KLQkJaWYgKGpveWNmZy5heGVzPk1BWF9BWEVTKSBqb3ljZmcuYXhlcyA9IE1BWF9BWEVTOwotCQlTWVNfSm95RGF0YVswXS5heGVzID0gam95Y2ZnLmF4ZXM7Ci0JCS8qIERlZmluZSBudW1iZXIgb2YgYnV0dG9ucy4uLiA4IGlmIDIgYXhlcywgNiBpZiAzIGF4ZXMgYW5kIDQgaWYgNCBheGVzICovCi0JCW1heGJ1dCA9IE1BWF9CVVRUT05TOwotCQlpZiAoam95Y2ZnLmF4ZXM+MikgbWF4YnV0LT0oKGpveWNmZy5heGVzLTIpPDwxKTsgLyogTUFYX0JVVFRPTlMgLSAyKihheGVzLTIpICovCi0JCWlmIChqb3ljZmcuYnV0dG9ucyA+IG1heGJ1dCkgam95Y2ZnLmJ1dHRvbnMgPSBtYXhidXQ7Ci0JCVNZU19Kb3lEYXRhWzBdLmJ1dHRvbnMgPSBqb3ljZmcuYnV0dG9uczsKLQkJLyogRGVmaW5lIG51bWJlciBvZiBoYXRzICovCi0JCWlmIChqb3ljZmcuaGF0cyA+IE1BWF9IQVRTKSBqb3ljZmcuaGF0cyA9IE1BWF9IQVRTOwotCQlTWVNfSm95RGF0YVswXS5oYXRzID0gam95Y2ZnLmhhdHM7Ci0JCS8qIERlZmluZSBudW1iZXIgb2YgYmFsbHMgKi8KLQkJaWYgKGpveWNmZy5iYWxscyA+IE1BWF9CQUxMUykgam95Y2ZnLmJhbGxzID0gTUFYX0JBTExTOwotCQlTWVNfSm95RGF0YVswXS5iYWxscyA9IGpveWNmZy5iYWxsczsKLQkJLyogSW5pdGlhbGl6ZSBBeGVzIENhbGxpYnJhdGlvbiBWYWx1ZXMgKi8KLQkJZm9yIChpPTA7IGk8am95Y2ZnLmF4ZXM7IGkrKykKLQkJCXsKLQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXNfbWluW2ldID0gYXhpc1tpXS0+bG93ZXI7Ci0JCQlTWVNfSm95RGF0YVswXS5heGVzX21lZFtpXSA9IGF4aXNbaV0tPmNlbnRyZTsKLQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXNfbWF4W2ldID0gYXhpc1tpXS0+dXBwZXI7Ci0JCQl9Ci0JCS8qIEluaXRpYWxpemUgQnV0dG9ucyA1IHRvIDggc3RydWN0dXJlcyAqLwotCQlpZiAoam95Y2ZnLmJ1dHRvbnM+PTUpIFNZU19Kb3lEYXRhWzBdLmJ1dHRvbmNhbGNbMF09KChheGlzWzJdLT5sb3dlcitheGlzWzNdLT5jZW50cmUpPj4xKTsKLQkJaWYgKGpveWNmZy5idXR0b25zPj02KSBTWVNfSm95RGF0YVswXS5idXR0b25jYWxjWzFdPSgoYXhpc1szXS0+bG93ZXIrYXhpc1szXS0+Y2VudHJlKT4+MSk7Ci0JCWlmIChqb3ljZmcuYnV0dG9ucz49NykgU1lTX0pveURhdGFbMF0uYnV0dG9uY2FsY1syXT0oKGF4aXNbMl0tPnVwcGVyK2F4aXNbM10tPmNlbnRyZSk+PjEpOwotCQlpZiAoam95Y2ZnLmJ1dHRvbnM+PTgpIFNZU19Kb3lEYXRhWzBdLmJ1dHRvbmNhbGNbM109KChheGlzWzNdLT51cHBlcitheGlzWzNdLT5jZW50cmUpPj4xKTsKLQkJLyogSW50aWFsaXplIEpveXN0aWNrIE5hbWUgKi8KLQkJU0RMX3N0cmxjcHkgKFNZU19Kb3lEYXRhWzBdLnN6RGV2aWNlTmFtZSxqb3ljZmcubmFtZSwgU0RMX2FycmF5c2l6ZShTWVNfSm95RGF0YVswXS5zekRldmljZU5hbWUpKTsKLQkJfQotCS8qIERlZmF1bHQgSW5pdCAuLi4gYXV0b2NvbmZpZyAqLwotCWVsc2UKLQkJewotCQkvKiBpZiB0d28gZGV2aWNlcyB3ZXJlIGRldGVjdGVkLi4uIGNvbmZpZ3VyZSBhcyBKb3kxIDQgYXhpcyBhbmQgSm95MiAyIGF4aXMgKi8KLQkJaWYgKG51bWRldnM9PTIpCi0JCQl7Ci0JCQkvKiBEZWZpbmUgRGV2aWNlIDAgYXMgNCBheGVzLCA0IGJ1dHRvbnMgKi8KLQkJCVNZU19Kb3lEYXRhWzBdLmlkPTA7Ci0JCQlTWVNfSm95RGF0YVswXS5heGVzID0gNDsKLQkJCVNZU19Kb3lEYXRhWzBdLmJ1dHRvbnMgPSA0OwotCQkJU1lTX0pveURhdGFbMF0uaGF0cyA9IDA7Ci0JCQlTWVNfSm95RGF0YVswXS5iYWxscyA9IDA7Ci0JCQlTWVNfSm95RGF0YVswXS5heGVzX21pblswXSA9IHN0R2FtZUNhbGliLkF4Lmxvd2VyOwotCQkJU1lTX0pveURhdGFbMF0uYXhlc19tZWRbMF0gPSBzdEdhbWVDYWxpYi5BeC5jZW50cmU7Ci0JCQlTWVNfSm95RGF0YVswXS5heGVzX21heFswXSA9IHN0R2FtZUNhbGliLkF4LnVwcGVyOwotCQkJU1lTX0pveURhdGFbMF0uYXhlc19taW5bMV0gPSBzdEdhbWVDYWxpYi5BeS5sb3dlcjsKLQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXNfbWVkWzFdID0gc3RHYW1lQ2FsaWIuQXkuY2VudHJlOwotCQkJU1lTX0pveURhdGFbMF0uYXhlc19tYXhbMV0gPSBzdEdhbWVDYWxpYi5BeS51cHBlcjsKLQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXNfbWluWzJdID0gc3RHYW1lQ2FsaWIuQngubG93ZXI7Ci0JCQlTWVNfSm95RGF0YVswXS5heGVzX21lZFsyXSA9IHN0R2FtZUNhbGliLkJ4LmNlbnRyZTsKLQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXNfbWF4WzJdID0gc3RHYW1lQ2FsaWIuQngudXBwZXI7Ci0JCQlTWVNfSm95RGF0YVswXS5heGVzX21pblszXSA9IHN0R2FtZUNhbGliLkJ5Lmxvd2VyOwotCQkJU1lTX0pveURhdGFbMF0uYXhlc19tZWRbM10gPSBzdEdhbWVDYWxpYi5CeS5jZW50cmU7Ci0JCQlTWVNfSm95RGF0YVswXS5heGVzX21heFszXSA9IHN0R2FtZUNhbGliLkJ5LnVwcGVyOwotCQkJLyogRGVmaW5lIERldmljZSAxIGFzIDIgYXhlcywgMiBidXR0b25zICovCi0JCQlTWVNfSm95RGF0YVsxXS5pZD0xOwotCQkJU1lTX0pveURhdGFbMV0uYXhlcyA9IDI7Ci0JCQlTWVNfSm95RGF0YVsxXS5idXR0b25zID0gMjsKLQkJCVNZU19Kb3lEYXRhWzFdLmhhdHMgPSAwOwotCQkJU1lTX0pveURhdGFbMV0uYmFsbHMgPSAwOwotCQkJU1lTX0pveURhdGFbMV0uYXhlc19taW5bMF0gPSBzdEdhbWVDYWxpYi5CeC5sb3dlcjsKLQkJCVNZU19Kb3lEYXRhWzFdLmF4ZXNfbWVkWzBdID0gc3RHYW1lQ2FsaWIuQnguY2VudHJlOwotCQkJU1lTX0pveURhdGFbMV0uYXhlc19tYXhbMF0gPSBzdEdhbWVDYWxpYi5CeC51cHBlcjsKLQkJCVNZU19Kb3lEYXRhWzFdLmF4ZXNfbWluWzFdID0gc3RHYW1lQ2FsaWIuQnkubG93ZXI7Ci0JCQlTWVNfSm95RGF0YVsxXS5heGVzX21lZFsxXSA9IHN0R2FtZUNhbGliLkJ5LmNlbnRyZTsKLQkJCVNZU19Kb3lEYXRhWzFdLmF4ZXNfbWF4WzFdID0gc3RHYW1lQ2FsaWIuQnkudXBwZXI7Ci0JCQl9Ci0JCS8qIE9uZSBqb3lzdGljayBvbmx5PyAqLwotCQllbHNlCi0JCQl7Ci0JCQkvKiBJZiBpdCBpcyBqb3lzdGljayBBLi4uICovCi0JCQlpZiAoKHN0Sm95U3RhdHVzLnVjSnNfSm95U3RpY2tNYXNrICYgMHgwMykgPiAwKQotCQkJCXsKLQkJCQkvKiBEZWZpbmUgRGV2aWNlIDAgYXMgMiBheGVzLCA0IGJ1dHRvbnMgKi8KLQkJCQlTWVNfSm95RGF0YVswXS5pZD0wOwotCQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXMgPSAyOwotCQkJCVNZU19Kb3lEYXRhWzBdLmJ1dHRvbnMgPSA0OwotCQkJCVNZU19Kb3lEYXRhWzBdLmhhdHMgPSAwOwotCQkJCVNZU19Kb3lEYXRhWzBdLmJhbGxzID0gMDsKLQkJCQlTWVNfSm95RGF0YVswXS5heGVzX21pblswXSA9IHN0R2FtZUNhbGliLkF4Lmxvd2VyOwotCQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXNfbWVkWzBdID0gc3RHYW1lQ2FsaWIuQXguY2VudHJlOwotCQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXNfbWF4WzBdID0gc3RHYW1lQ2FsaWIuQXgudXBwZXI7Ci0JCQkJU1lTX0pveURhdGFbMF0uYXhlc19taW5bMV0gPSBzdEdhbWVDYWxpYi5BeS5sb3dlcjsKLQkJCQlTWVNfSm95RGF0YVswXS5heGVzX21lZFsxXSA9IHN0R2FtZUNhbGliLkF5LmNlbnRyZTsKLQkJCQlTWVNfSm95RGF0YVswXS5heGVzX21heFsxXSA9IHN0R2FtZUNhbGliLkF5LnVwcGVyOwotCQkJCX0KLQkJCS8qIElmIG5vdCwgaXQgaXMgam95c3RpY2sgQiAqLwotCQkJZWxzZQotCQkJCXsKLQkJCQkvKiBEZWZpbmUgRGV2aWNlIDEgYXMgMiBheGVzLCAyIGJ1dHRvbnMgKi8KLQkJCQlTWVNfSm95RGF0YVswXS5pZD0xOwotCQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXMgPSAyOwotCQkJCVNZU19Kb3lEYXRhWzBdLmJ1dHRvbnMgPSAyOwotCQkJCVNZU19Kb3lEYXRhWzBdLmhhdHMgPSAwOwotCQkJCVNZU19Kb3lEYXRhWzBdLmJhbGxzID0gMDsKLQkJCQlTWVNfSm95RGF0YVswXS5heGVzX21pblswXSA9IHN0R2FtZUNhbGliLkJ4Lmxvd2VyOwotCQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXNfbWVkWzBdID0gc3RHYW1lQ2FsaWIuQnguY2VudHJlOwotCQkJCVNZU19Kb3lEYXRhWzBdLmF4ZXNfbWF4WzBdID0gc3RHYW1lQ2FsaWIuQngudXBwZXI7Ci0JCQkJU1lTX0pveURhdGFbMF0uYXhlc19taW5bMV0gPSBzdEdhbWVDYWxpYi5CeS5sb3dlcjsKLQkJCQlTWVNfSm95RGF0YVswXS5heGVzX21lZFsxXSA9IHN0R2FtZUNhbGliLkJ5LmNlbnRyZTsKLQkJCQlTWVNfSm95RGF0YVswXS5heGVzX21heFsxXSA9IHN0R2FtZUNhbGliLkJ5LnVwcGVyOwotCQkJCX0KLQkJCX0KLQkJLyogSGFjayB0byBkZWZpbmUgSm95c3RpY2sgUG9ydCBOYW1lcyAqLwotCQlpZiAoIG51bWRldnMgPiBtYXhkZXZzICkgbnVtZGV2cyA9IG1heGRldnM7Ci0JCWZvciAoaT0wOyBpPG51bWRldnM7IGkrKykKLSAgICAgICAgICAgICAgICAgIFNETF9zbnByaW50ZiAoU1lTX0pveURhdGFbaV0uc3pEZXZpY2VOYW1lLCBTRExfYXJyYXlzaXplKFNZU19Kb3lEYXRhW2ldLnN6RGV2aWNlTmFtZSksICJEZWZhdWx0IEpveXN0aWNrICVjIiwgJ0EnK1NZU19Kb3lEYXRhW2ldLmlkKTsKLQotICAgICAgICAgICAgICAgIH0KLQl9Ci0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZXZpY2VzIGZvdW5kICovCi1yZXR1cm4obnVtZGV2cyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkZXZpY2UtZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljayAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQotewotLyogTm8gbmVlZCB0byB2ZXJpZnkgaWYgZGV2aWNlIGV4aXN0cywgYWxyZWFkeSBkb25lIGluIHVwcGVyIGxheWVyICovCi1yZXR1cm4oU1lTX0pveURhdGFbaW5kZXhdLnN6RGV2aWNlTmFtZSk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRnVuY3Rpb24gdG8gb3BlbiBhIGpveXN0aWNrIGZvciB1c2UuCQkJCQkJCQkJCQkJCSovCi0vKiBUaGUgam95c3RpY2sgdG8gb3BlbiBpcyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGZpZWxkIG9mIHRoZSBqb3lzdGljay4JCSovCi0vKiBUaGlzIHNob3VsZCBmaWxsIHRoZSBuYnV0dG9ucyBhbmQgbmF4ZXMgZmllbGRzIG9mIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUuCSovCi0vKiBJdCByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIGlzIGFuIGVycm9yLgkJCQkJCQkJCQkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFNETF9TWVNfSm95c3RpY2tPcGVuKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci1pbnQgaW5kZXg7CQkvKiBJbmRleCBzaG9ydGN1dCBmb3IgaW5kZXggaW4gam95c3RpY2sgc3RydWN0dXJlICovCi1pbnQgaTsJCQkvKiBHZW5lcmljIENvdW50ZXIgKi8KLQotLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzeXN0ZW0gc3BlY2lmaWMgaGFyZHdhcmUgZGF0YSAqLwotam95c3RpY2stPmh3ZGF0YSA9IChzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhICopIFNETF9tYWxsb2Moc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7Ci1pZiAoam95c3RpY2stPmh3ZGF0YSA9PSBOVUxMKQotCXsKLQlTRExfT3V0T2ZNZW1vcnkoKTsKLQlyZXR1cm4oLTEpOwotCX0KLS8qIFJlc2V0IEhhcmR3YXJlIERhdGEgKi8KLVNETF9tZW1zZXQoam95c3RpY2stPmh3ZGF0YSwgMCwgc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7Ci0KLS8qIFNob3J0Q3V0IFBvaW50ZXIgKi8KLWluZGV4ID0gam95c3RpY2stPmluZGV4OwotLyogRGVmaW5lIG9mZnNldHMgYW5kIHNjYWxlcyBmb3IgYWxsIGF4ZXMgKi8KLWpveXN0aWNrLT5od2RhdGEtPmlkID0gU1lTX0pveURhdGFbaW5kZXhdLmlkOwotZm9yICggaSA9IDA7IGkgPCBNQVhfQVhFUzsgKytpICkKLQl7Ci0JaWYgKCAoaTwyKSB8fCBpIDwgU1lTX0pveURhdGFbaW5kZXhdLmF4ZXMgKQotCQl7Ci0JCWpveXN0aWNrLT5od2RhdGEtPnRyYW5zYXhlc1tpXS5vZmZzZXQgPSAoKEFYSVNfTUFYICsgQVhJU19NSU4pPj4xKSAtIFNZU19Kb3lEYXRhW2luZGV4XS5heGVzX21lZFtpXTsKLQkJLy9qb3lzdGljay0+aHdkYXRhLT50cmFuc2F4ZXNbaV0uc2NhbGUgPSAoZmxvYXQpKChBWElTX01BWCAtIEFYSVNfTUlOKS8oU1lTX0pveURhdGFbaW5kZXhdLmF4ZXNfbWF4W2ldLVNZU19Kb3lEYXRhW2luZGV4XS5heGVzX21pbltpXSkpOwotCQlqb3lzdGljay0+aHdkYXRhLT50cmFuc2F4ZXNbaV0uc2NhbGUxID0gKGZsb2F0KWFicygoQVhJU19NSU4vU1lTX0pveURhdGFbaW5kZXhdLmF4ZXNfbWluW2ldKSk7Ci0JCWpveXN0aWNrLT5od2RhdGEtPnRyYW5zYXhlc1tpXS5zY2FsZTIgPSAoZmxvYXQpYWJzKChBWElTX01BWC9TWVNfSm95RGF0YVtpbmRleF0uYXhlc19tYXhbaV0pKTsKLQkJfQotCWVsc2UKLQkJewotCQlqb3lzdGljay0+aHdkYXRhLT50cmFuc2F4ZXNbaV0ub2Zmc2V0ID0gMDsKLQkJLy9qb3lzdGljay0+aHdkYXRhLT50cmFuc2F4ZXNbaV0uc2NhbGUgPSAxLjA7IC8qIEp1c3QgaW4gY2FzZSAqLwotCQlqb3lzdGljay0+aHdkYXRhLT50cmFuc2F4ZXNbaV0uc2NhbGUxID0gMS4wOyAvKiBKdXN0IGluIGNhc2UgKi8KLQkJam95c3RpY2stPmh3ZGF0YS0+dHJhbnNheGVzW2ldLnNjYWxlMiA9IDEuMDsgLyogSnVzdCBpbiBjYXNlICovCi0JCX0KLQl9Ci0KLS8qIGZpbGwgbmJ1dHRvbnMsIG5heGVzLCBhbmQgbmhhdHMgZmllbGRzICovCi1qb3lzdGljay0+bmJ1dHRvbnMgPSBTWVNfSm95RGF0YVtpbmRleF0uYnV0dG9uczsKLWpveXN0aWNrLT5uYXhlcyA9IFNZU19Kb3lEYXRhW2luZGV4XS5heGVzOwotLyogam95c3RpY2stPm5oYXRzID0gU1lTX0pveURhdGFbaW5kZXhdLmhhdHM7ICovCi1qb3lzdGljay0+bmhhdHMgPSAwOyAvKiBObyBzdXBwb3J0IGZvciBoYXRzIGF0IHRoaXMgdGltZSAqLwotLyogam95c3RpY2stPm5iYWxscyA9IFNZU19Kb3lEYXRhW2luZGV4XS5iYWxsczsgKi8KLWpveXN0aWNrLT5uYmFsbHMgPSAwOyAvKiBObyBzdXBwb3J0IGZvciBiYWxscyBhdCB0aGlzIHRpbWUgKi8KLXJldHVybiAwOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgkqLwotLyogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCQkJKi8KLS8qIGJ1dCBpbnN0ZWFkIHNob3VsZCBjYWxsIFNETF9Qcml2YXRlSm95c3RpY2sqKCkgdG8gZGVsaXZlciBldmVudHMJCQkqLwotLyogYW5kIHVwZGF0ZSBqb3lzdGljayBkZXZpY2Ugc3RhdGUuCQkJCQkJCQkJCQkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci1BUElSRVQgcmM7CQkJCQkJCQkJLyogR2VuZXJpYyBPUy8yIHJldHVybiBjb2RlICovCi1pbnQgaW5kZXg7CQkJCQkJCQkJLyogaW5kZXggc2hvcnRjdXJ0IHRvIGpveXN0aWNrIGluZGV4ICovCi1pbnQgaTsJCQkJCQkJCQkJLyogR2VuZXJpYyBjb3VudGVyICovCi1pbnQgbm9ybWJ1dDsJCQkJCQkJCS8qIE51bWJlciBvZiBidXR0b25zIHJlcG9ydGVkIGJ5IGpveXN0aWNrICovCi1pbnQgY29ycjsJCQkJCQkJCQkvKiBDb3JyZWN0aW9uIGZvciBidXR0b24gbmFtZXMgKi8KLVNpbnQxNiB2YWx1ZSwgY2hhbmdlOwkJCQkJLyogVmFsdWVzIHVzZWQgdG8gdXBkYXRlIGF4aXMgdmFsdWVzICovCi1zdHJ1Y3QgX3RyYW5zYXhlcyAqdHJhbnNheGVzOwkJCS8qIFNob3J0Y3V0IGZvciBDb3JyZWN0aW9uIHN0cnVjdHVyZSAqLwotVWludDMyIHBvc1tNQVhfQVhFU107CQkJCQkvKiBWZWN0b3IgdG8gaW5mb3JtIHRoZSBBeGlzIHN0YXR1cyAqLwotVUxPTkcgdWxEYXRhTGVuOwkJCQkJCQkvKiBTaXplIG9mIGRhdGEgKi8KLUdBTUVfU1RBVFVTX1NUUlVDVCBzdEdhbWVTdGF0dXM7CQkvKiBKb3lzdGljayBTdGF0dXMgU3RydWN0dXJlICovCi0KLXVsRGF0YUxlbiA9IHNpemVvZihzdEdhbWVTdGF0dXMpOwotcmMgPSBEb3NEZXZJT0N0bChoSm95UG9ydCwgSU9DVExfQ0FUX1VTRVIsIEdBTUVfR0VUX1NUQVRVUywKLQlOVUxMLCAwLCBOVUxMLCAmc3RHYW1lU3RhdHVzLCB1bERhdGFMZW4sICZ1bERhdGFMZW4pOwotaWYgKHJjICE9IDApCi0JewotCVNETF9TZXRFcnJvcigiQ291bGQgbm90IHJlYWQgam95c3RpY2sgc3RhdHVzLiIpOwotCXJldHVybjsgLyogQ291bGQgbm90IHJlYWQgZGF0YSAqLwotCX0KLQotLyogU2hvcnRjdXQgcG9pbnRlciAqLwotaW5kZXggPSBqb3lzdGljay0+aW5kZXg7Ci0vKiBqb3lzdGljayBtb3Rpb24gZXZlbnRzICovCi0KLWlmIChTWVNfSm95RGF0YVtpbmRleF0uaWQgPT0gMCkKLQl7Ci0JcG9zWzBdID0gc3RHYW1lU3RhdHVzLmN1cmRhdGEuQS54OwotCXBvc1sxXSA9IHN0R2FtZVN0YXR1cy5jdXJkYXRhLkEueTsKLQlpZiAoU1lTX0pveURhdGFbaW5kZXhdLmF4ZXMgPj0gMykJcG9zWzJdID0gc3RHYW1lU3RhdHVzLmN1cmRhdGEuQi54OwotCWVsc2UgcG9zWzJdPTA7Ci0JaWYgKFNZU19Kb3lEYXRhW2luZGV4XS5heGVzID49IDQpCXBvc1szXSA9IHN0R2FtZVN0YXR1cy5jdXJkYXRhLkIueTsKLQllbHNlIHBvc1szXT0wOwotCXBvc1s0XT0wOwkvKiBPUy8yIGJhc2ljIGRyaXZlcnMgZG8gbm90IHN1cHBvcnQgbW9yZSB0aGFuIDQgYXhlcyBqb3lzdGlja3MgKi8KLQlwb3NbNV09MDsKLQl9Ci1lbHNlIGlmIChTWVNfSm95RGF0YVtpbmRleF0uaWQgPT0gMSkKLQl7Ci0JcG9zWzBdID0gc3RHYW1lU3RhdHVzLmN1cmRhdGEuQi54OwotCXBvc1sxXSA9IHN0R2FtZVN0YXR1cy5jdXJkYXRhLkIueTsKLQlwb3NbMl09MDsKLQlwb3NbM109MDsKLQlwb3NbNF09MDsKLQlwb3NbNV09MDsKLQl9Ci0KLS8qIENvcnJlY3RzIHRoZSBtb3ZlbWVudHMgdXNpbmcgdGhlIGNhbGxpYnJhdGlvbiAqLwotdHJhbnNheGVzID0gam95c3RpY2stPmh3ZGF0YS0+dHJhbnNheGVzOwotZm9yIChpID0gMDsgaSA8IGpveXN0aWNrLT5uYXhlczsgaSsrKQotCXsKLQl2YWx1ZSA9IHBvc1tpXSArIHRyYW5zYXhlc1tpXS5vZmZzZXQ7Ci0JaWYgKHZhbHVlPDApCi0JCXsKLQkJdmFsdWUqPXRyYW5zYXhlc1tpXS5zY2FsZTE7Ci0JCWlmICh2YWx1ZT4wKSB2YWx1ZSA9IEFYSVNfTUlOOwotCQl9Ci0JZWxzZQotCQl7Ci0JCXZhbHVlKj10cmFuc2F4ZXNbaV0uc2NhbGUyOwotCQlpZiAodmFsdWU8MCkgdmFsdWUgPSBBWElTX01BWDsKLQkJfQotCWNoYW5nZSA9ICh2YWx1ZSAtIGpveXN0aWNrLT5heGVzW2ldKTsKLQlpZiAoIChjaGFuZ2UgPCAtSk9ZX0FYSVNfVEhSRVNIT0xEKSB8fCAoY2hhbmdlID4gSk9ZX0FYSVNfVEhSRVNIT0xEKSApCi0JCXsKLQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssIChVaW50OClpLCAoU2ludDE2KXZhbHVlKTsKLQkJfQotCX0KLQotLyogam95c3RpY2sgYnV0dG9uIEEgdG8gRCBldmVudHMgKi8KLWlmIChTWVNfSm95RGF0YVtpbmRleF0uaWQgPT0gMSkgY29yciA9IDI7Ci1lbHNlIGNvcnIgPSAwOwotbm9ybWJ1dD00OwkvKiBOdW1iZXIgb2Ygbm9ybWFsIGJ1dHRvbnMgKi8KLWlmIChqb3lzdGljay0+bmJ1dHRvbnM8bm9ybWJ1dCkgbm9ybWJ1dCA9IGpveXN0aWNrLT5uYnV0dG9uczsKLWZvciAoIGkgPSBjb3JyOyAoaS1jb3JyKSA8IG5vcm1idXQ7ICsraSApCi0JewotCS8qCi0JCUJ1dHRvbiBBOiAxMTEwIDAwMDAKLQkJQnV0dG9uIEI6IDExMDEgMDAwMAotCQlCdXR0b24gQzogMTAxMSAwMDAwCi0JCUJ1dHRvbiBEOiAwMTExIDAwMDAKLQkqLwotCWlmICggKH5zdEdhbWVTdGF0dXMuY3VyZGF0YS5idXRNYXNrKT4+NCAmIEpPWV9CVVRUT05fRkxBRyhpKSApCi0JCXsKLQkJaWYgKCAhIGpveXN0aWNrLT5idXR0b25zW2ktY29ycl0gKQotCQkJewotCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywgKFVpbnQ4KShpLWNvcnIpLCBTRExfUFJFU1NFRCk7Ci0JCQl9Ci0JCX0KLQllbHNlCi0JCXsKLQkJaWYgKCBqb3lzdGljay0+YnV0dG9uc1tpLWNvcnJdICkKLQkJCXsKLQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIChVaW50OCkoaS1jb3JyKSwgU0RMX1JFTEVBU0VEKTsKLQkJCX0KLQkJfQotCX0KLQotLyogSm95c3RpY2sgYnV0dG9uIEUgdG8gSCBidXR0b25zICovCi0JLyoKLQkJQnV0dG9uIEU6IEF4aXMgMiBYIExlZnQKLQkJQnV0dG9uIEY6IEF4aXMgMiBZIFVwCi0JCUJ1dHRvbiBHOiBBeGlzIDIgWCBSaWdodAotCQlCdXR0b24gSDogQXhpcyAyIFkgRG93bgotCSovCi1pZiAoam95c3RpY2stPm5idXR0b25zPj01KQotCXsKLQlpZiAoc3RHYW1lU3RhdHVzLmN1cmRhdGEuQi54IDwgU1lTX0pveURhdGFbaW5kZXhdLmJ1dHRvbmNhbGNbMF0pIFNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIChVaW50OCk0LCBTRExfUFJFU1NFRCk7Ci0JZWxzZSBTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLCAoVWludDgpNCwgU0RMX1JFTEVBU0VEKTsKLQl9Ci1pZiAoam95c3RpY2stPm5idXR0b25zPj02KQotCXsKLQlpZiAoc3RHYW1lU3RhdHVzLmN1cmRhdGEuQi55IDwgU1lTX0pveURhdGFbaW5kZXhdLmJ1dHRvbmNhbGNbMV0pIFNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIChVaW50OCk1LCBTRExfUFJFU1NFRCk7Ci0JZWxzZSBTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLCAoVWludDgpNSwgU0RMX1JFTEVBU0VEKTsKLQl9Ci1pZiAoam95c3RpY2stPm5idXR0b25zPj03KQotCXsKLQlpZiAoc3RHYW1lU3RhdHVzLmN1cmRhdGEuQi54ID4gU1lTX0pveURhdGFbaW5kZXhdLmJ1dHRvbmNhbGNbMl0pIFNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIChVaW50OCk2LCBTRExfUFJFU1NFRCk7Ci0JZWxzZSBTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLCAoVWludDgpNiwgU0RMX1JFTEVBU0VEKTsKLQl9Ci1pZiAoam95c3RpY2stPm5idXR0b25zPj04KQotCXsKLQlpZiAoc3RHYW1lU3RhdHVzLmN1cmRhdGEuQi55ID4gU1lTX0pveURhdGFbaW5kZXhdLmJ1dHRvbmNhbGNbM10pIFNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIChVaW50OCk3LCBTRExfUFJFU1NFRCk7Ci0JZWxzZSBTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLCAoVWludDgpNywgU0RMX1JFTEVBU0VEKTsKLQl9Ci0KLS8qIGpveXN0aWNrIGhhdCBldmVudHMgKi8KLS8qIE5vdCBTdXBwb3J0ZWQgdW5kZXIgT1MvMiAqLwotLyogam95c3RpY2sgYmFsbCBldmVudHMgKi8KLS8qIE5vdCBTdXBwb3J0ZWQgdW5kZXIgT1MvMiAqLwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZ1bmN0aW9uIHRvIGNsb3NlIGEgam95c3RpY2sgYWZ0ZXIgdXNlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLWlmIChqb3lzdGljay0+aHdkYXRhICE9IE5VTEwpCi0JewotCS8qIGZyZWUgc3lzdGVtIHNwZWNpZmljIGhhcmR3YXJlIGRhdGEgKi8KLQlTRExfZnJlZShqb3lzdGljay0+aHdkYXRhKTsKLQl9Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBGdW5jdGlvbiB0byBwZXJmb3JtIGFueSBzeXN0ZW0tc3BlY2lmaWMgam95c3RpY2sgcmVsYXRlZCBjbGVhbnVwICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFNETF9TWVNfSm95c3RpY2tRdWl0KHZvaWQpCi17Ci1qb3lQb3J0Q2xvc2UoJmhKb3lQb3J0KTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogT1MvMiBJbXBsZW1lbnRhdGlvbnMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE9wZW4gSm95c3RpY2sgUG9ydCwgaWYgbm90IG9wZW5lZCB5ZXQgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFQSVJFVCBqb3lQb3J0T3BlbihIRklMRSAqIGhHYW1lKQotewotQVBJUkVUCQlyYzsJCQkJLyogR2VuZXJpYyBSZXR1cm4gQ29kZSAqLwotVUxPTkcJCQl1bEFjdGlvbjsJCS8qID8gKi8KLVVMT05HCQkJdWxWZXJzaW9uOwkJLyogVmVyc2lvbiBvZiBqb3lzdGljayBkcml2ZXIgKi8KLVVMT05HCQkJdWxEYXRhTGVuOwkJLyogU2l6ZSBvZiB2ZXJzaW9uIGRhdGEgKi8KLQotLyogVmVyaWZpZXMgaWYgam95cG9ydCBpcyBub3QgYWxyZWFkeSBvcGVuLi4uICovCi1pZiAoKmhHYW1lICE9IE5VTEwpIHJldHVybiAwOwotLyogT3BlbiBHQU1FJCBmb3IgcmVhZCAqLwotcmMgPSBEb3NPcGVuKChQU1opR0FNRVBERE5BTUUsIGhHYW1lLCAmdWxBY3Rpb24sIDAsIEZJTEVfUkVBRE9OTFksCi0JRklMRV9PUEVOLCBPUEVOX0FDQ0VTU19SRUFET05MWSB8IE9QRU5fU0hBUkVfREVOWU5PTkUsIE5VTEwpOwotaWYgKHJjICE9IDApCi0JewotCVNETF9TZXRFcnJvcigiQ291bGQgbm90IG9wZW4gSm95c3RpY2sgUG9ydC4iKTsKLQlyZXR1cm4gLTE7Ci0JfQotCQotLyogR2V0IEpveXN0aWNrIERyaXZlciBWZXJzaW9uLi4uIG11c3QgYmUgMi4wIG9yIGhpZ2hlciAqLwotdWxWZXJzaW9uID0gMDsKLXVsRGF0YUxlbiA9IHNpemVvZih1bFZlcnNpb24pOwotcmMgPSBEb3NEZXZJT0N0bCggKmhHYW1lLCBJT0NUTF9DQVRfVVNFUiwgR0FNRV9HRVRfVkVSU0lPTiwKLQlOVUxMLCAwLCBOVUxMLCAmdWxWZXJzaW9uLCB1bERhdGFMZW4sICZ1bERhdGFMZW4pOwotaWYgKHJjICE9IDApCi0JewotCWpveVBvcnRDbG9zZShoR2FtZSk7Ci0JU0RMX1NldEVycm9yKCJDb3VsZCBub3QgZ2V0IEpveXN0aWNrIERyaXZlciB2ZXJzaW9uLiIpOwotCXJldHVybiAtMTsJCi0JfQotaWYgKHVsVmVyc2lvbiA8IEdBTUVfVkVSU0lPTikKLQl7Ci0Jam95UG9ydENsb3NlKGhHYW1lKTsKLQlTRExfU2V0RXJyb3IoIkRyaXZlciB0b28gb2xkLiBBdCBsZWFzdCBJQk0gZHJpdmVyIHZlcnNpb24gMi4wIHJlcXVpcmVkLiIpOwotCXJldHVybiAtMTsKLQl9Ci1yZXR1cm4gMDsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ2xvc2UgSm95UG9ydCwgaWYgb3BlbmVkICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgam95UG9ydENsb3NlKEhGSUxFICogaEdhbWUpCi17Ci1pZiAoKmhHYW1lICE9IE5VTEwpIERvc0Nsb3NlKCpoR2FtZSk7Ci0qaEdhbWUgPSBOVUxMOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdldCBTREwgSm95c3RpY2sgRW52VmFyICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGpveUdldEVudihzdHJ1Y3QgX2pveWNmZyAqIGpveWRhdGEpCi17Ci1jaGFyICpqb3llbnY7CQkJCS8qIFBvaW50ZXIgdG8gdGVzdGVkIGNoYXJhY3RlciAqLwotY2hhciB0ZW1wbnVtYmVyWzVdOwkJLyogVGVtcG9yYXJ5IHBsYWNlIHRvIHB1dCBudW1lcmljIHRleHRzICovCi0KLWpveWVudiA9IFNETF9nZXRlbnYoIlNETF9PUzJfSk9ZU1RJQ0siKTsKLWlmIChqb3llbnYgPT0gTlVMTCkgcmV0dXJuIDA7Ci0vKiBKb3lzdGljayBFbnZpcm9ubWVudCBpcyBkZWZpbmVkISAqLwotd2hpbGUgKCpqb3llbnY9PScgJyAmJiAqam95ZW52IT0wKSBqb3llbnYrKzsgLyoganVtcCBzcGFjZXMuLi4gKi8KLS8qIElmIHRoZSBzdHJpbmcgbmFtZSBzdGFydHMgd2l0aCAnLi4uIGdldCBpZiBmdWxseSAqLwotaWYgKCpqb3llbnY9PSdcJycpIGpveWVudis9am95R2V0RGF0YSgrK2pveWVudixqb3lkYXRhLT5uYW1lLCdcJycsc2l6ZW9mKGpveWRhdGEtPm5hbWUpKTsKLS8qIElmIG5vdCwgZ2V0IGl0IHVudGlsIHRoZSBuZXh0IHNwYWNlICovCi1lbHNlIGlmICgqam95ZW52PT0nXCInKSBqb3llbnYrPWpveUdldERhdGEoKytqb3llbnYsam95ZGF0YS0+bmFtZSwnXCInLHNpemVvZihqb3lkYXRhLT5uYW1lKSk7Ci1lbHNlIGpveWVudis9am95R2V0RGF0YShqb3llbnYsam95ZGF0YS0+bmFtZSwnICcsc2l6ZW9mKGpveWRhdGEtPm5hbWUpKTsKLS8qIE5vdyBnZXQgdGhlIG51bWJlciBvZiBheGVzICovCi13aGlsZSAoKmpveWVudj09JyAnICYmICpqb3llbnYhPTApIGpveWVudisrOyAvKiBqdW1wIHNwYWNlcy4uLiAqLwotam95ZW52Kz1qb3lHZXREYXRhKGpveWVudix0ZW1wbnVtYmVyLCcgJyxzaXplb2YodGVtcG51bWJlcikpOwotam95ZGF0YS0+YXhlcyA9IGF0b2kodGVtcG51bWJlcik7Ci0vKiBOb3cgZ2V0IHRoZSBudW1iZXIgb2YgYnV0dG9ucyAqLwotd2hpbGUgKCpqb3llbnY9PScgJyAmJiAqam95ZW52IT0wKSBqb3llbnYrKzsgLyoganVtcCBzcGFjZXMuLi4gKi8KLWpveWVudis9am95R2V0RGF0YShqb3llbnYsdGVtcG51bWJlciwnICcsc2l6ZW9mKHRlbXBudW1iZXIpKTsKLWpveWRhdGEtPmJ1dHRvbnMgPSBhdG9pKHRlbXBudW1iZXIpOwotLyogTm93IGdldCB0aGUgbnVtYmVyIG9mIGhhdHMgKi8KLXdoaWxlICgqam95ZW52PT0nICcgJiYgKmpveWVudiE9MCkgam95ZW52Kys7IC8qIGp1bXAgc3BhY2VzLi4uICovCi1qb3llbnYrPWpveUdldERhdGEoam95ZW52LHRlbXBudW1iZXIsJyAnLHNpemVvZih0ZW1wbnVtYmVyKSk7Ci1qb3lkYXRhLT5oYXRzID0gYXRvaSh0ZW1wbnVtYmVyKTsKLS8qIE5vdyBnZXQgdGhlIG51bWJlciBvZiBiYWxscyAqLwotd2hpbGUgKCpqb3llbnY9PScgJyAmJiAqam95ZW52IT0wKSBqb3llbnYrKzsgLyoganVtcCBzcGFjZXMuLi4gKi8KLWpveWVudis9am95R2V0RGF0YShqb3llbnYsdGVtcG51bWJlciwnICcsc2l6ZW9mKHRlbXBudW1iZXIpKTsKLWpveWRhdGEtPmJhbGxzID0gYXRvaSh0ZW1wbnVtYmVyKTsKLXJldHVybiAxOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdldCBhIHRleHQgZnJvbSBpbiB0aGUgc3RyaW5nIHN0YXJ0aW5nIGluIGpveWVudiB1bnRpbCBpdCBmaW5kcwkJKi8KLS8qIHRoZSBzdG9wY2hhciBvciBtYXhjaGFycyBpcyByZWFjaGVkLiBUaGUgcmVzdWx0IGlzIHBsYWNlZCBpbiBuYW1lLgkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBqb3lHZXREYXRhKGNoYXIgKmpveWVudiwgY2hhciAqbmFtZSwgY2hhciBzdG9wY2hhciwgc2l6ZV90IG1heGNoYXJzKQotewotY2hhciAqbmFtZXB0cjsJCQkvKiBQb2ludGVyIHRvIHRoZSBzZWxlY3RlZCBjaGFyYWN0ZXIgKi8KLWludCBjaGNudD0wOwkJCS8qIENvdW50IGhvdyBtYW55IGNoYXJhY3RlcnMgd2hlcmUgY29waWVkICovCi0KLW5hbWVwdHI9bmFtZTsKLXdoaWxlICgqam95ZW52IT1zdG9wY2hhciAmJiAqam95ZW52IT0wKQotCXsKLQlpZiAobmFtZXB0cjwobmFtZSsobWF4Y2hhcnMtMSkpKQotCQl7Ci0JCSpuYW1lcHRyID0gKmpveWVudjsgLyogT25seSBjb3B5IGlmIHNtYWxsZXIgdGhhbiBtYXhpbXVtICovCi0JCW5hbWVwdHIrKzsKLQkJfQotCWNoY250Kys7Ci0Jam95ZW52Kys7Ci0JfQotaWYgKCpqb3llbnY9PXN0b3BjaGFyKQotCXsKLQlqb3llbnYrKzsgLyogSnVtcCBzdG9wY2hhciAqLwotCWNoY250Kys7Ci0JfQotKm5hbWVwdHIgPSAwOyAvKiBNYXJrIGxhc3QgYnl0ZSAqLwotcmV0dXJuIGNoY250OwotfQotCi0jZW5kaWYgLyogU0RMX0pPWVNUSUNLX09TMiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9vczIvam95b3MyLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL29zMi9qb3lvczIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4MDAxMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL29zMi9qb3lvczIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBDT1BZUklHSFQgICAgQ29weXJpZ2h0IChDKSAxOTk1IElCTSBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgZm9sbG93aW5nIElCTSBPUy8yIHNvdXJjZSBjb2RlIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yICAgICAgICovCi0vKiAgICB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcgeW91IGluIHlvdXIgZGV2ZWxvcG1lbnQgb2YgT1MvMiBkZXZpY2UgICAgICAgICovCi0vKiAgICBkcml2ZXJzLiBZb3UgbWF5IHVzZSB0aGlzIGNvZGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBJQk0gTGljZW5zZSAgICAgICovCi0vKiAgICBBZ3JlZW1lbnQgcHJvdmlkZWQgaW4gdGhlIElCTSBEZXZpY2UgRHJpdmVyIFNvdXJjZSBLaXQgZm9yIE9TLzIuIFRoaXMgICovCi0vKiAgICBDb3B5cmlnaHQgc3RhdGVtZW50IG1heSBub3QgYmUgcmVtb3ZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEpPWU9TMl9ICi0jZGVmaW5lIEpPWU9TMl9ICi0KLS8qKioqKiogR0FNRVBPUlQuU1lTIGpveXN0aWNrIGRlZmluaXRpb25zLCBzdGFydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgR0FNRV9WRVJTSU9OICAgIDB4MjAgICAgICAgICAgIC8qIDIuMCBGaXJzdCBJQk0gdmVyc2lvbiAqLwotI2RlZmluZSBHQU1FUERETkFNRSAgICAgIkdBTUUkICAgIgotI2RlZmluZSBJT0NUTF9DQVRfVVNFUgkweDgwCi0jZGVmaW5lIEdBTUVfUE9SVF9HRVQJMHgyMAkJLyogcmVhZCBHQU1FUE9SVC5TWVMgdmFsdWVzICovCi0jZGVmaW5lIEdBTUVfUE9SVF9SRVNFVCAweDYwCQkvKiByZXNldCBqb3lzdGljayBtYXNrIHdpdGggZ2l2ZW4gdmFsdWUgKi8KLQotI3ByYWdtYSBwYWNrKDEpCQkJCS8qIHBhY2sgc3RydWN0dXJlIHNpemUgaXMgMSBieXRlICovCi10eXBlZGVmIHN0cnVjdCB7CQkJLyogR0FNRVBPUlQuU1lTIHN0cnVjdHVyZSAqLwotCVVTSE9SVAl1c0pzX0F4Q250OwkJLyogSm95c3RpY2tfQSBYIHBvc2l0aW9uICovCi0JVVNIT1JUCXVzSnNfQXlDbnQ7CQkvKiBKb3lzdGlja19BIFkgcG9zaXRpb24gKi8KLQlVU0hPUlQJdXNKc19CeENudDsJCS8qIEpveXN0aWNrX0IgWCBwb3NpdGlvbiAqLwotCVVTSE9SVAl1c0pzX0J5Q250OwkJLyogSm95c3RpY2tfQiBZIHBvc2l0aW9uICovCi0JVVNIT1JUCXVzSnNfQnV0dG9uQTFDbnQ7CS8qIGJ1dHRvbiBBMSBwcmVzcyBjb3VudCAqLwotCVVTSE9SVAl1c0pzX0J1dHRvbkEyQ250OwkvKiBidXR0b24gQTIgcHJlc3MgY291bnQgKi8KLQlVU0hPUlQJdXNKc19CdXR0b25CMUNudDsJLyogYnV0dG9uIEIxIHByZXNzIGNvdW50ICovCi0JVVNIT1JUCXVzSnNfQnV0dG9uQjJDbnQ7CS8qIGJ1dHRvbiBCMiBwcmVzcyBjb3VudCAqLwotCVVDSEFSCXVjSnNfSm95U3RpY2tNYXNrOwkvKiBtYXNrIG9mIGNvbm5lY3RlZCBqb3lzdGljayBwb3RzICovCi0JVUNIQVIJdWNKc19CdXR0b25TdGF0dXM7CS8qIGJpdHMgb2Ygc3dpdGNoZXMgZG93biAqLwotCVVMT05HCXVsSnNfVGlja3M7CQkvKiBqb3lzdGljayBjbG9jayB0aWNrcyAqLwotfSBHQU1FX1BPUlRfU1RSVUNUOwotI3ByYWdtYSBwYWNrKCkJCQkJLypyZXNldCB0byBub3JtYWwgcGFjayBzaXplICovCi0vKioqKioqIEdBTUVQT1JULlNZUyBqb3lzdGljayBkZWZpbml0aW9ucywgZW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdBTUVfR0VUX1ZFUlNJT04gICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBHQU1FX0dFVF9QQVJNUyAgICAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgR0FNRV9TRVRfUEFSTVMgICAgICAgICAgICAgICAgICAweDAzCi0jZGVmaW5lIEdBTUVfR0VUX0NBTElCICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBHQU1FX1NFVF9DQUxJQiAgICAgICAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgR0FNRV9HRVRfRElHU0VUICAgICAgICAgICAgICAgICAweDA2Ci0jZGVmaW5lIEdBTUVfU0VUX0RJR1NFVCAgICAgICAgICAgICAgICAgMHgwNwotI2RlZmluZSBHQU1FX0dFVF9TVEFUVVMgICAgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgR0FNRV9HRVRfU1RBVFVTX0JVVFdBSVQgICAgICAgICAweDExCi0jZGVmaW5lIEdBTUVfR0VUX1NUQVRVU19TQU1QV0FJVCAgICAgICAgMHgxMgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gYml0IG1hc2tzIGZvciBlYWNoIGF4aXMKLSNkZWZpbmUgSk9ZX0FYX0JJVCAgICAgIDB4MDEKLSNkZWZpbmUgSk9ZX0FZX0JJVCAgICAgIDB4MDIKLSNkZWZpbmUgSk9ZX0FfQklUUyAgICAgIChKT1lfQVhfQklUfEpPWV9BWV9CSVQpCi0jZGVmaW5lIEpPWV9CWF9CSVQgICAgICAweDA0Ci0jZGVmaW5lIEpPWV9CWV9CSVQgICAgICAweDA4Ci0jZGVmaW5lIEpPWV9CX0JJVFMgICAgICAoSk9ZX0JYX0JJVHxKT1lfQllfQklUKQotI2RlZmluZSBKT1lfQUxMUE9TX0JJVFMgKEpPWV9BX0JJVFN8Sk9ZX0JfQklUUykKLQotLy8gYml0IG1hc2tzIGZvciBlYWNoIGJ1dHRvbgotI2RlZmluZSBKT1lfQlVUMV9CSVQgICAgMHgxMAotI2RlZmluZSBKT1lfQlVUMl9CSVQgICAgMHgyMAotI2RlZmluZSBKT1lfQlVUM19CSVQgICAgMHg0MAotI2RlZmluZSBKT1lfQlVUNF9CSVQgICAgMHg4MAotI2RlZmluZSBKT1lfQUxMX0JVVFMgICAgKEpPWV9CVVQxX0JJVHxKT1lfQlVUMl9CSVR8Sk9ZX0JVVDNfQklUfEpPWV9CVVQ0X0JJVCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIDEtRCBwb3NpdGlvbiBzdHJ1Y3QgdXNlZCBmb3IgZWFjaCBheGlzCi10eXBlZGVmIFNIT1JUICAgR0FNRV9QT1M7ICAgICAgIC8qIHNvbWUgZGF0YSBmb3JtYXRzIHJlcXVpcmUgc2lnbmVkIHZhbHVlcyAqLwotCi0vLyBzaW1wbGUgMi1EIHBvc2l0aW9uIGZvciBlYWNoIGpveXN0aWNrCi10eXBlZGVmIHN0cnVjdAotewotICAgICAgICBHQU1FX1BPUyAgICAgICAgICAgICAgICB4OwotICAgICAgICBHQU1FX1BPUyAgICAgICAgICAgICAgICB5OwotfQotR0FNRV8yRFBPU19TVFJVQ1Q7Ci0KLS8vIHN0cnVjdCBkZWZpbmluZyB0aGUgaW5zdGFudGFuZW91cyBzdGF0ZSBvZiBib3RoIHN0aWNrcyBhbmQgYWxsIGJ1dHRvbnMKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICAgIEdBTUVfMkRQT1NfU1RSVUNUICAgICAgIEE7Ci0gICAgICAgIEdBTUVfMkRQT1NfU1RSVUNUICAgICAgIEI7Ci0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIGJ1dE1hc2s7Ci19Ci1HQU1FX0RBVEFfU1RSVUNUOwotCi0vLyBzdHJ1Y3QgdG8gYmUgdXNlZCBmb3IgY2FsaWJyYXRpb24gYW5kIGRpZ2l0YWwgcmVzcG9uc2Ugb24gZWFjaCBheGlzCi10eXBlZGVmIHN0cnVjdAotewotICAgICAgICBHQU1FX1BPUyAgICAgICAgICAgICAgICBsb3dlcjsKLSAgICAgICAgR0FNRV9QT1MgICAgICAgICAgICAgICAgY2VudHJlOwotICAgICAgICBHQU1FX1BPUyAgICAgICAgICAgICAgICB1cHBlcjsKLX0KLUdBTUVfM1BPU19TVFJVQ1Q7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBzdGF0dXMgc3RydWN0IHJldHVybmVkIHRvIE9TLzIgYXBwbGljYXRpb25zOgotLy8gY3VycmVudCBkYXRhIGZvciBhbGwgc3RpY2tzIGFzIHdlbGwgYXMgYnV0dG9uIGNvdW50cyBzaW5jZSBsYXN0IHJlYWQKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICAgIEdBTUVfREFUQV9TVFJVQ1QgICAgICAgIGN1cmRhdGE7Ci0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIGIxY250OwotICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBiMmNudDsKLSAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgYjNjbnQ7Ci0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIGI0Y250OwotfQotR0FNRV9TVEFUVVNfU1RSVUNUOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogaW4gdXNlIGJpdG1hc2tzIG9yaWdpbmF0aW5nIGluIDAuMmIgKi8KLSNkZWZpbmUgR0FNRV9VU0VfQk9USF9PTERNQVNLICAgMHgwMSAgICAvKiBmb3IgYmFja3dhcmQgY29tcGF0IHdpdGggYm9vbCAqLwotI2RlZmluZSBHQU1FX1VTRV9YX05FV01BU0sgICAgICAweDAyCi0jZGVmaW5lIEdBTUVfVVNFX1lfTkVXTUFTSyAgICAgIDB4MDQKLSNkZWZpbmUgR0FNRV9VU0VfWF9FSVRIRVJNQVNLICAgKEdBTUVfVVNFX1hfTkVXTUFTS3xHQU1FX1VTRV9CT1RIX09MRE1BU0spCi0jZGVmaW5lIEdBTUVfVVNFX1lfRUlUSEVSTUFTSyAgIChHQU1FX1VTRV9ZX05FV01BU0t8R0FNRV9VU0VfQk9USF9PTERNQVNLKQotI2RlZmluZSBHQU1FX1VTRV9CT1RIX05FV01BU0sgICAoR0FNRV9VU0VfWF9ORVdNQVNLfEdBTUVfVVNFX1lfTkVXTUFTSykKLQotLyogb25seSB0aW1lZCBzYW1wbGluZyBpbXBsZW1lbnRlZCBpbiB2ZXJzaW9uIDEuMCAqLwotI2RlZmluZSBHQU1FX01PREVfVElNRUQgICAgICAgICAxICAgICAgIC8qIHRpbWVkIHNhbXBsaW5nICovCi0jZGVmaW5lIEdBTUVfTU9ERV9SRVFVRVNUICAgICAgIDIgICAgICAgLyogcmVxdWVzdCBkcml2ZW4gc2FtcGxpbmcgKi8KLQotLyogb25seSByYXcgaW1wbGVtZW50ZWQgaW4gdmVyc2lvbiAxLjAgKi8KLSNkZWZpbmUgR0FNRV9EQVRBX0ZPUk1BVF9SQVcgICAgMSAgICAgICAvKiBbbCxjLHJdICAgKi8KLSNkZWZpbmUgR0FNRV9EQVRBX0ZPUk1BVF9TSUdORUQgMiAgICAgICAvKiBbLWwsMCwrcl0gKi8KLSNkZWZpbmUgR0FNRV9EQVRBX0ZPUk1BVF9CSU5BUlkgMyAgICAgICAvKiB7LTEsMCwrMX0gKi8KLSNkZWZpbmUgR0FNRV9EQVRBX0ZPUk1BVF9TQ0FMRUQgNCAgICAgICAvKiBbLTEwLCsxMF0gKi8KLQotLy8gcGFyYW1ldGVycyBkZWZpbmluZyB0aGUgb3BlcmF0aW9uIG9mIHRoZSBkcml2ZXIKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIHVzZUE7ICAgICAgICAgICAvKiBuZXcgYml0bWFza3M6IHNlZSBhYm92ZSAqLwotICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICB1c2VCOwotICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBtb2RlOyAgICAgICAgICAgLyogc2VlIGNvbnN0cyBhYm92ZSAqLwotICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBmb3JtYXQ7ICAgICAgICAgLyogc2VlIGNvbnN0cyBhYm92ZSAqLwotICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBzYW1wRGl2OyAgICAgICAgLyogc2FtcCBmcmVxID0gMzIgLyBuICovCi0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIHNjYWxlOyAgICAgICAgICAvKiBzY2FsaW5nIGZhY3RvciAqLwotICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICByZXMxOyAgICAgICAgICAgLyogbXVzdCBiZSAwICovCi0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIHJlczI7ICAgICAgICAgICAvKiBtdXN0IGJlIDAgKi8KLX0KLUdBTUVfUEFSTV9TVFJVQ1Q7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBjYWxpYnJhdGlvbiB2YWx1ZXMgZm9yIGVhY2ggYXhpczoKLS8vICAgICAgLSB1cHBlciBsaW1pdCBvbiB2YWx1ZSB0byBiZSBjb25zaWRlcmVkIGluIGxvd2VyIHJhbmdlCi0vLyAgICAgIC0gY2VudHJlIHZhbHVlCi0vLyAgICAgIC0gbG93ZXIgbGltaXQgb24gdmFsdWUgdG8gYmUgY29uc2lkZXJlZCBpbiB1cHBlciByYW5nZQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAgICAgR0FNRV8zUE9TX1NUUlVDVCAgICAgICAgQXg7Ci0gICAgICAgIEdBTUVfM1BPU19TVFJVQ1QgICAgICAgIEF5OwotICAgICAgICBHQU1FXzNQT1NfU1RSVUNUICAgICAgICBCeDsKLSAgICAgICAgR0FNRV8zUE9TX1NUUlVDVCAgICAgICAgQnk7Ci19Ci1HQU1FX0NBTElCX1NUUlVDVDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIHN0cnVjdCBkZWZpbmluZyB0aGUgZGlnaXRhbCByZXNwb25zZSB2YWx1ZXMgZm9yIGFsbCBheGVzCi10eXBlZGVmIHN0cnVjdAotewotICAgICAgICBHQU1FXzNQT1NfU1RSVUNUICAgICAgICBBeDsKLSAgICAgICAgR0FNRV8zUE9TX1NUUlVDVCAgICAgICAgQXk7Ci0gICAgICAgIEdBTUVfM1BPU19TVFJVQ1QgICAgICAgIEJ4OwotICAgICAgICBHQU1FXzNQT1NfU1RSVUNUICAgICAgICBCeTsKLX0KLUdBTUVfRElHU0VUX1NUUlVDVDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svcmlzY29zL1NETF9zeXNqb3lzdGljay5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9yaXNjb3MvU0RMX3N5c2pveXN0aWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGFjOTEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9qb3lzdGljay9yaXNjb3MvU0RMX3N5c2pveXN0aWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfSk9ZU1RJQ0tfUklTQ09TCi0KLS8qCi0gICBSSVNDIE9TIC0gSm95c3RpY2sgc3VwcG9ydCBieSBBbGFuIEJ1Y2tsZXkgKGFsYW5fYmFhQGhvdG1haWwuY29tKSAtIDEwIEFwcmlsIDIwMDMKLQotICAgTm90ZTogQ3VycmVudGx5IGFzc3VtZXMgam95c3RpY2sgaXMgcHJlc2VudCBpZiBqb3lzdGljayBtb2R1bGUgaXMgbG9hZGVkCi0gICBhbmQgdGhhdCB0aGVyZSBpcyBvbmUgam95c3RpY2sgd2l0aCBmb3VyIGJ1dHRvbnMuCi0qLwotCi0vKiBUaGlzIGlzIHRoZSBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZvciB0aGUgU0RMIGpveXN0aWNrIEFQSSAqLwotCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNqb3lzdGljay5oIgotI2luY2x1ZGUgIi4uL1NETF9qb3lzdGlja19jLmgiCi0KLSNpbmNsdWRlICJrZXJuZWwuaCIKLQotI2RlZmluZSBKT1lTVElDS19SRUFEIDB4NDNGNDAKLQotc3RydWN0IGpveXN0aWNrX2h3ZGF0YSAKLXsKLQlpbnQgam95c3RhdGU7Ci19OwotCi0KLS8qIEZ1bmN0aW9uIHRvIHNjYW4gdGhlIHN5c3RlbSBmb3Igam95c3RpY2tzLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgc2V0IFNETF9udW1qb3lzdGlja3MgdG8gdGhlIG51bWJlciBvZiBhdmFpbGFibGUKLSAqIGpveXN0aWNrcy4gIEpveXN0aWNrIDAgc2hvdWxkIGJlIHRoZSBzeXN0ZW0gZGVmYXVsdCBqb3lzdGljay4KLSAqIEl0IHNob3VsZCByZXR1cm4gbnVtYmVyIG9mIGpveXN0aWNrcywgb3IgLTEgb24gYW4gdW5yZWNvdmVyYWJsZSBmYXRhbCBlcnJvci4KLSAqLwotaW50IFNETF9TWVNfSm95c3RpY2tJbml0KHZvaWQpCi17Ci0JX2tlcm5lbF9zd2lfcmVncyByZWdzOwotCi0JIC8qIFRyeSB0byByZWFkIGpveXN0aWNrIDAgKi8KLQlyZWdzLnJbMF0gPSAwOwotCWlmIChfa2VybmVsX3N3aShKT1lTVElDS19SRUFELCAmcmVncywgJnJlZ3MpID09IE5VTEwpCi0JewotCQkvKiBTd2l0Y2ggd29ya3Mgc28gYXNzdW1lIHdlJ3ZlIGdvdCBhIGpveXN0aWNrICovCi0JCXJldHVybiAxOwotCX0KLQkvKiBTd2l0Y2ggZmFpbHMgc28gaXQgbG9va3MgbGlrZSB0aGVyZSdzIG5vIGpveXN0aWNrIGhlcmUgKi8KLQotCXJldHVybigwKTsKLX0KLQotLyogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkZXZpY2UtZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljayAqLwotY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQotewotCWlmIChpbmRleCA9PSAwKQotCXsKLQkJcmV0dXJuICJSSVNDIE9TIEpveXN0aWNrIDAiOwotCX0KLQotCVNETF9TZXRFcnJvcigiTm8gam95c3RpY2sgYXZhaWxhYmxlIHdpdGggdGhhdCBpbmRleCIpOwotCXJldHVybihOVUxMKTsKLX0KLQotLyogRnVuY3Rpb24gdG8gb3BlbiBhIGpveXN0aWNrIGZvciB1c2UuCi0gICBUaGUgam95c3RpY2sgdG8gb3BlbiBpcyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGZpZWxkIG9mIHRoZSBqb3lzdGljay4KLSAgIFRoaXMgc2hvdWxkIGZpbGwgdGhlIG5idXR0b25zIGFuZCBuYXhlcyBmaWVsZHMgb2YgdGhlIGpveXN0aWNrIHN0cnVjdHVyZS4KLSAgIEl0IHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0gKi8KLWludCBTRExfU1lTX0pveXN0aWNrT3BlbihTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLQotCWlmKCEoam95c3RpY2stPmh3ZGF0YT1TRExfbWFsbG9jKHNpemVvZihzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhKSkpKQotCQlyZXR1cm4gLTE7Ci0KLQlyZWdzLnJbMF0gPSBqb3lzdGljay0+aW5kZXg7Ci0KLQkvKiBEb24ndCBrbm93IGhvdyB0byBnZXQgZXhhY3QgY291bnQgb2YgYnV0dG9ucyBzbyBhc3N1bWUgbWF4IG9mIDQgZm9yIG5vdyAqLwotCWpveXN0aWNrLT5uYnV0dG9ucz00OwotCi0Jam95c3RpY2stPm5oYXRzPTA7Ci0Jam95c3RpY2stPm5iYWxscz0wOwotCWpveXN0aWNrLT5uYXhlcz0yOwotCWpveXN0aWNrLT5od2RhdGEtPmpveXN0YXRlPTA7Ci0KLQlyZXR1cm4gMDsKLQotfQotCi0vKiBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHN0YXRlIG9mIGEgam95c3RpY2sgLSBjYWxsZWQgYXMgYSBkZXZpY2UgcG9sbC4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IHVwZGF0ZSB0aGUgam95c3RpY2sgc3RydWN0dXJlIGRpcmVjdGx5LAotICogYnV0IGluc3RlYWQgc2hvdWxkIGNhbGwgU0RMX1ByaXZhdGVKb3lzdGljayooKSB0byBkZWxpdmVyIGV2ZW50cwotICogYW5kIHVwZGF0ZSBqb3lzdGljayBkZXZpY2Ugc3RhdGUuCi0gKi8KLXZvaWQgU0RMX1NZU19Kb3lzdGlja1VwZGF0ZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLQlyZWdzLnJbMF0gPSBqb3lzdGljay0+aW5kZXg7Ci0KLQlpZiAoX2tlcm5lbF9zd2koSk9ZU1RJQ0tfUkVBRCwgJnJlZ3MsICZyZWdzKSA9PSBOVUxMKQotCXsKLQkJaW50IG5ld3N0YXRlID0gcmVncy5yWzBdOwotCQlpbnQgb2xkc3RhdGUgPSBqb3lzdGljay0+aHdkYXRhLT5qb3lzdGF0ZTsKLQkJaWYgKG5ld3N0YXRlICE9IG9sZHN0YXRlKQotCQl7Ci0JCQlpZiAoKG5ld3N0YXRlICYgMHhGRikgIT0gKG9sZHN0YXRlICYgMHhGRikpCi0JCQl7Ci0JCQkJaW50IHkgPSByZWdzLnJbMF0gJiAweEZGOwotCQkJCS8qIENvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcyAqLwotCQkJCWlmICh5ID49IDEyOCkgeSAtPSAyNTY7Ci0JCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssMSwteSAqIDI1Nik7IC8qIFVwIGFuZCBkb3duIG9wcG9zaXRlIHRvIHJlc3VsdCBpbiBTREwgKi8KLQkJCX0KLQkJCWlmICgobmV3c3RhdGUgJiAweEZGMDApICE9IChvbGRzdGF0ZSAmIDB4RkYwMCkpCi0JCQl7Ci0JCQkJaW50IHggPSAocmVncy5yWzBdICYgMHhGRjAwKSA+PiA4OwotCQkJCWlmICh4ID49IDEyOCkgeCAtPSAyNTY7Ci0JCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssMCx4ICogMjU2KTsKLQkJCX0KLQotCQkJaWYgKChuZXdzdGF0ZSAmIDB4RkYwMDAwKSAhPSAob2xkc3RhdGUgJiAweEZGMDAwMCkpCi0JCQl7Ci0JCQkJaW50IGJ1dHRvbnMgPSAocmVncy5yWzBdICYgMHhGRjAwMDApID4+IDE2OwotCQkJCWludCBvbGRidXR0b25zID0gKG9sZHN0YXRlICYgMHhGRjAwMDApID4+IDE2OwotCQkJCWludCBpOwotCQkJCWZvciAoaSA9IDA7IGkgPCBqb3lzdGljay0+bmJ1dHRvbnM7IGkrKykKLQkJCQl7Ci0JCQkJCWlmICgoYnV0dG9ucyAmICgxPDxpKSkgIT0gKG9sZGJ1dHRvbnMgJiAoMTw8aSkpKQotCQkJCQl7Ci0JCQkJCQlpZiAoYnV0dG9ucyAmICgxPDxpKSkgU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayxpLFNETF9QUkVTU0VEKTsKLQkJCQkJCWVsc2UgU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayxpLFNETF9SRUxFQVNFRCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlqb3lzdGljay0+aHdkYXRhLT5qb3lzdGF0ZSA9IG5ld3N0YXRlOwotCQl9CQkKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNsb3NlIGEgam95c3RpY2sgYWZ0ZXIgdXNlICovCi12b2lkIFNETF9TWVNfSm95c3RpY2tDbG9zZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQotewotCWlmKGpveXN0aWNrLT5od2RhdGEpCi0JCVNETF9mcmVlKGpveXN0aWNrLT5od2RhdGEpOwotCXJldHVybjsKLX0KLQotLyogRnVuY3Rpb24gdG8gcGVyZm9ybSBhbnkgc3lzdGVtLXNwZWNpZmljIGpveXN0aWNrIHJlbGF0ZWQgY2xlYW51cCAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrUXVpdCh2b2lkKQotewotCVNETF9udW1qb3lzdGlja3M9MDsKLQotCXJldHVybjsKLX0KLQotI2VuZGlmIC8qIFNETF9KT1lTVElDS19SSVNDT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svd2luMzIvU0RMX21tam95c3RpY2suYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvam95c3RpY2svd2luMzIvU0RMX21tam95c3RpY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxZjhmOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2pveXN0aWNrL3dpbjMyL1NETF9tbWpveXN0aWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfSk9ZU1RJQ0tfV0lOTU0KLQotLyogV2luMzIgTXVsdGlNZWRpYSBKb3lzdGljayBkcml2ZXIsIGNvbnRyaWJ1dGVkIGJ5IEFuZHJlaSBkZSBBLiBGb3JtaWdhICovCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotI2luY2x1ZGUgPHJlZ3N0ci5oPgotCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXNqb3lzdGljay5oIgotI2luY2x1ZGUgIi4uL1NETF9qb3lzdGlja19jLmgiCi0KLSNkZWZpbmUgTUFYX0pPWVNUSUNLUwkxNgotI2RlZmluZSBNQVhfQVhFUwk2CS8qIGVhY2ggam95c3RpY2sgY2FuIGhhdmUgdXAgdG8gNiBheGVzICovCi0jZGVmaW5lIE1BWF9CVVRUT05TCTMyCS8qIGFuZCAzMiBidXR0b25zICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFYSVNfTUlOCS0zMjc2OCAgLyogbWluaW11bSB2YWx1ZSBmb3IgYXhpcyBjb29yZGluYXRlICovCi0jZGVmaW5lIEFYSVNfTUFYCTMyNzY3ICAgLyogbWF4aW11bSB2YWx1ZSBmb3IgYXhpcyBjb29yZGluYXRlICovCi0vKiBsaW1pdCBheGlzIHRvIDI1NiBwb3NzaWJsZSBwb3NpdGlvbnMgdG8gZmlsdGVyIG91dCBub2lzZSAqLwotI2RlZmluZSBKT1lfQVhJU19USFJFU0hPTEQgICAgICAoKChBWElTX01BWCktKEFYSVNfTUlOKSkvMjU2KQotI2RlZmluZSBKT1lfQlVUVE9OX0ZMQUcobikJKDE8PG4pCi0KLQotLyogYXJyYXkgdG8gaG9sZCBqb3lzdGljayBJRCB2YWx1ZXMgKi8KLXN0YXRpYyBVSU5UCVNZU19Kb3lzdGlja0lEW01BWF9KT1lTVElDS1NdOwotc3RhdGljIEpPWUNBUFMJU1lTX0pveXN0aWNrW01BWF9KT1lTVElDS1NdOwotc3RhdGljIGNoYXIJKlNZU19Kb3lzdGlja05hbWVbTUFYX0pPWVNUSUNLU107Ci0KLS8qIFRoZSBwcml2YXRlIHN0cnVjdHVyZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYSBqb3lzdGljayAqLwotc3RydWN0IGpveXN0aWNrX2h3ZGF0YQotewotCS8qIGpveXN0aWNrIElEICovCi0JVUlOVAlpZDsKLQotCS8qIHZhbHVlcyB1c2VkIHRvIHRyYW5zbGF0ZSBkZXZpY2Utc3BlY2lmaWMgY29vcmRpbmF0ZXMgaW50bwotCSAgIFNETC1zdGFuZGFyZCByYW5nZXMgKi8KLQlzdHJ1Y3QgX3RyYW5zYXhpcyB7Ci0JCWludCBvZmZzZXQ7Ci0JCWZsb2F0IHNjYWxlOwotCX0gdHJhbnNheGlzWzZdOwotfTsKLQotLyogQ29udmVydCBhIHdpbjMyIE11bHRpbWVkaWEgQVBJIHJldHVybiBjb2RlIHRvIGEgdGV4dCBtZXNzYWdlICovCi1zdGF0aWMgdm9pZCBTZXRNTWVycm9yKGNoYXIgKmZ1bmN0aW9uLCBpbnQgY29kZSk7Ci0KLQotc3RhdGljIGNoYXIgKkdldEpveXN0aWNrTmFtZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKnN6UmVnS2V5KQotewotCS8qIGFkZGVkIDcvMjQvMjAwNCBieSBFY2toYXJkIFN0b2xiZXJnICovCi0JLyoKLQkJc2VlIGlmIHRoZXJlIGlzIGEgam95c3RpY2sgZm9yIHRoZSBjdXJyZW50Ci0JCWluZGV4ICgxLTE2KSBsaXN0ZWQgaW4gdGhlIHJlZ2lzdHJ5Ci0JKi8KLQljaGFyICpuYW1lID0gTlVMTDsKLQlIS0VZIGhUb3BLZXk7Ci0JSEtFWSBoS2V5OwotCURXT1JEIHJlZ3NpemU7Ci0JTE9ORyByZWdyZXN1bHQ7Ci0JY2hhciByZWdrZXlbMjU2XTsKLQljaGFyIHJlZ3ZhbHVlWzI1Nl07Ci0JY2hhciByZWduYW1lWzI1Nl07Ci0KLQlTRExfc25wcmludGYocmVna2V5LCBTRExfYXJyYXlzaXplKHJlZ2tleSksICIlc1xcJXNcXCVzIiwKLQkJUkVHU1RSX1BBVEhfSk9ZQ09ORklHLCBzelJlZ0tleSwgUkVHU1RSX0tFWV9KT1lDVVJSKTsKLQloVG9wS2V5ID0gSEtFWV9MT0NBTF9NQUNISU5FOwotCXJlZ3Jlc3VsdCA9IFJlZ09wZW5LZXlFeEEoaFRvcEtleSwgcmVna2V5LCAwLCBLRVlfUkVBRCwgJmhLZXkpOwotCWlmIChyZWdyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgewotCQloVG9wS2V5ID0gSEtFWV9DVVJSRU5UX1VTRVI7Ci0JCXJlZ3Jlc3VsdCA9IFJlZ09wZW5LZXlFeEEoaFRvcEtleSwgcmVna2V5LCAwLCBLRVlfUkVBRCwgJmhLZXkpOwotCX0KLQlpZiAocmVncmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogZmluZCB0aGUgcmVnaXN0cnkga2V5IG5hbWUgZm9yIHRoZSBqb3lzdGljaydzIHByb3BlcnRpZXMgKi8KLQlyZWdzaXplID0gc2l6ZW9mKHJlZ25hbWUpOwotCVNETF9zbnByaW50ZihyZWd2YWx1ZSwgU0RMX2FycmF5c2l6ZShyZWd2YWx1ZSksICJKb3lzdGljayVkJXMiLCBpbmRleCsxLCBSRUdTVFJfVkFMX0pPWU9FTU5BTUUpOwotCXJlZ3Jlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgcmVndmFsdWUsIDAsIDAsIChMUEJZVEUpcmVnbmFtZSwgJnJlZ3NpemUpOwotCVJlZ0Nsb3NlS2V5KGhLZXkpOwotCi0JaWYgKHJlZ3Jlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIG9wZW4gdGhhdCByZWdpc3RyeSBrZXkgKi8KLQlTRExfc25wcmludGYocmVna2V5LCBTRExfYXJyYXlzaXplKHJlZ2tleSksICIlc1xcJXMiLCBSRUdTVFJfUEFUSF9KT1lPRU0sIHJlZ25hbWUpOwotCXJlZ3Jlc3VsdCA9IFJlZ09wZW5LZXlFeEEoaFRvcEtleSwgcmVna2V5LCAwLCBLRVlfUkVBRCwgJmhLZXkpOwotCWlmIChyZWdyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBmaW5kIHRoZSBzaXplIGZvciB0aGUgT0VNIG5hbWUgdGV4dCAqLwotCXJlZ3NpemUgPSBzaXplb2YocmVndmFsdWUpOwotCXJlZ3Jlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgUkVHU1RSX1ZBTF9KT1lPRU1OQU1FLCAwLCAwLCBOVUxMLCAmcmVnc2l6ZSk7Ci0JaWYgKHJlZ3Jlc3VsdCA9PSBFUlJPUl9TVUNDRVNTKSB7Ci0JCS8qIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBPRU0gbmFtZSB0ZXh0IC4uLiAqLwotCQluYW1lID0gKGNoYXIgKikgU0RMX21hbGxvYyhyZWdzaXplKTsKLQkJaWYgKCBuYW1lICkgewotCQkJLyogLi4uIGFuZCByZWFkIGl0IGZyb20gdGhlIHJlZ2lzdHJ5ICovCi0JCQlyZWdyZXN1bHQgPSBSZWdRdWVyeVZhbHVlRXhBKGhLZXksCi0JCQkJUkVHU1RSX1ZBTF9KT1lPRU1OQU1FLCAwLCAwLAotCQkJCShMUEJZVEUpIG5hbWUsICZyZWdzaXplKTsKLQkJfQotCX0KLQlSZWdDbG9zZUtleShoS2V5KTsKLQotCXJldHVybihuYW1lKTsKLX0KLQotLyogRnVuY3Rpb24gdG8gc2NhbiB0aGUgc3lzdGVtIGZvciBqb3lzdGlja3MuCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzZXQgU0RMX251bWpveXN0aWNrcyB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQotICogam95c3RpY2tzLiAgSm95c3RpY2sgMCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IGpveXN0aWNrLgotICogSXQgc2hvdWxkIHJldHVybiAwLCBvciAtMSBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgotICovCi1pbnQgU0RMX1NZU19Kb3lzdGlja0luaXQodm9pZCkKLXsKLQlpbnQJaTsKLQlpbnQgbWF4ZGV2czsKLQlpbnQgbnVtZGV2czsKLQlKT1lJTkZPRVggam95aW5mbzsKLQlKT1lDQVBTCWpveWNhcHM7Ci0JTU1SRVNVTFQgcmVzdWx0OwotCi0JLyogUmVzZXQgdGhlIGpveXN0aWNrIElEICYgbmFtZSBtYXBwaW5nIHRhYmxlcyAqLwotCWZvciAoIGkgPSAwOyBpIDwgTUFYX0pPWVNUSUNLUzsgKytpICkgewotCQlTWVNfSm95c3RpY2tJRFtpXSA9IDA7Ci0JCVNZU19Kb3lzdGlja05hbWVbaV0gPSBOVUxMOwotCX0KLQotCS8qIExvb3Agb3ZlciBhbGwgcG90ZW50aWFsIGpveXN0aWNrIGRldmljZXMgKi8KLQludW1kZXZzID0gMDsKLQltYXhkZXZzID0gam95R2V0TnVtRGV2cygpOwotCWZvciAoIGkgPSBKT1lTVElDS0lEMTsgaSA8IG1heGRldnMgJiYgbnVtZGV2cyA8IE1BWF9KT1lTVElDS1M7ICsraSApIHsKLQkJCi0JCWpveWluZm8uZHdTaXplID0gc2l6ZW9mKGpveWluZm8pOwotCQlqb3lpbmZvLmR3RmxhZ3MgPSBKT1lfUkVUVVJOQUxMOwotCQlyZXN1bHQgPSBqb3lHZXRQb3NFeChpLCAmam95aW5mbyk7Ci0JCWlmICggcmVzdWx0ID09IEpPWUVSUl9OT0VSUk9SICkgewotCQkJcmVzdWx0ID0gam95R2V0RGV2Q2FwcyhpLCAmam95Y2Fwcywgc2l6ZW9mKGpveWNhcHMpKTsKLQkJCWlmICggcmVzdWx0ID09IEpPWUVSUl9OT0VSUk9SICkgewotCQkJCVNZU19Kb3lzdGlja0lEW251bWRldnNdID0gaTsKLQkJCQlTWVNfSm95c3RpY2tbbnVtZGV2c10gPSBqb3ljYXBzOwotCQkJCVNZU19Kb3lzdGlja05hbWVbbnVtZGV2c10gPSBHZXRKb3lzdGlja05hbWUoaSwgam95Y2Fwcy5zelJlZ0tleSk7Ci0JCQkJbnVtZGV2cysrOwotCQkJfQotCQl9Ci0JfQotCXJldHVybihudW1kZXZzKTsKLX0KLQotLyogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkZXZpY2UtZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljayAqLwotY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQotewotCWlmICggU1lTX0pveXN0aWNrTmFtZVtpbmRleF0gIT0gTlVMTCApIHsKLQkJcmV0dXJuKFNZU19Kb3lzdGlja05hbWVbaW5kZXhdKTsKLQl9IGVsc2UgewotCQlyZXR1cm4oU1lTX0pveXN0aWNrW2luZGV4XS5zelBuYW1lKTsKLQl9Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIG9wZW4gYSBqb3lzdGljayBmb3IgdXNlLgotICAgVGhlIGpveXN0aWNrIHRvIG9wZW4gaXMgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCBmaWVsZCBvZiB0aGUgam95c3RpY2suCi0gICBUaGlzIHNob3VsZCBmaWxsIHRoZSBuYnV0dG9ucyBhbmQgbmF4ZXMgZmllbGRzIG9mIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUuCi0gICBJdCByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIGlzIGFuIGVycm9yLgotICovCi1pbnQgU0RMX1NZU19Kb3lzdGlja09wZW4oU0RMX0pveXN0aWNrICpqb3lzdGljaykKLXsKLQlpbnQgaW5kZXgsIGk7Ci0JaW50IGNhcHNfZmxhZ3NbTUFYX0FYRVMtMl0gPQotCQl7IEpPWUNBUFNfSEFTWiwgSk9ZQ0FQU19IQVNSLCBKT1lDQVBTX0hBU1UsIEpPWUNBUFNfSEFTViB9OwotCWludCBheGlzX21pbltNQVhfQVhFU10sIGF4aXNfbWF4W01BWF9BWEVTXTsKLQotCi0JLyogc2hvcnRjdXQgKi8KLQlpbmRleCA9IGpveXN0aWNrLT5pbmRleDsKLQlheGlzX21pblswXSA9IFNZU19Kb3lzdGlja1tpbmRleF0ud1htaW47Ci0JYXhpc19tYXhbMF0gPSBTWVNfSm95c3RpY2tbaW5kZXhdLndYbWF4OwotCWF4aXNfbWluWzFdID0gU1lTX0pveXN0aWNrW2luZGV4XS53WW1pbjsKLQlheGlzX21heFsxXSA9IFNZU19Kb3lzdGlja1tpbmRleF0ud1ltYXg7Ci0JYXhpc19taW5bMl0gPSBTWVNfSm95c3RpY2tbaW5kZXhdLndabWluOwotCWF4aXNfbWF4WzJdID0gU1lTX0pveXN0aWNrW2luZGV4XS53Wm1heDsKLQlheGlzX21pblszXSA9IFNZU19Kb3lzdGlja1tpbmRleF0ud1JtaW47Ci0JYXhpc19tYXhbM10gPSBTWVNfSm95c3RpY2tbaW5kZXhdLndSbWF4OwotCWF4aXNfbWluWzRdID0gU1lTX0pveXN0aWNrW2luZGV4XS53VW1pbjsKLQlheGlzX21heFs0XSA9IFNZU19Kb3lzdGlja1tpbmRleF0ud1VtYXg7Ci0JYXhpc19taW5bNV0gPSBTWVNfSm95c3RpY2tbaW5kZXhdLndWbWluOwotCWF4aXNfbWF4WzVdID0gU1lTX0pveXN0aWNrW2luZGV4XS53Vm1heDsKLQotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3lzdGVtIHNwZWNpZmljIGhhcmR3YXJlIGRhdGEgKi8KLQlqb3lzdGljay0+aHdkYXRhID0gKHN0cnVjdCBqb3lzdGlja19od2RhdGEgKikgU0RMX21hbGxvYyhzaXplb2YoKmpveXN0aWNrLT5od2RhdGEpKTsKLQlpZiAoam95c3RpY2stPmh3ZGF0YSA9PSBOVUxMKQotCXsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCVNETF9tZW1zZXQoam95c3RpY2stPmh3ZGF0YSwgMCwgc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7Ci0KLQkvKiBzZXQgaGFyZHdhcmUgZGF0YSAqLwotCWpveXN0aWNrLT5od2RhdGEtPmlkID0gU1lTX0pveXN0aWNrSURbaW5kZXhdOwotCWZvciAoIGkgPSAwOyBpIDwgTUFYX0FYRVM7ICsraSApIHsKLQkJaWYgKCAoaTwyKSB8fCAoU1lTX0pveXN0aWNrW2luZGV4XS53Q2FwcyAmIGNhcHNfZmxhZ3NbaS0yXSkgKSB7Ci0JCQlqb3lzdGljay0+aHdkYXRhLT50cmFuc2F4aXNbaV0ub2Zmc2V0ID0KLQkJCQlBWElTX01JTiAtIGF4aXNfbWluW2ldOwotCQkJam95c3RpY2stPmh3ZGF0YS0+dHJhbnNheGlzW2ldLnNjYWxlID0KLQkJCQkoZmxvYXQpKEFYSVNfTUFYIC0gQVhJU19NSU4pIC8gKGF4aXNfbWF4W2ldIC0gYXhpc19taW5baV0pOwotCQl9IGVsc2UgewotCQkJam95c3RpY2stPmh3ZGF0YS0+dHJhbnNheGlzW2ldLm9mZnNldCA9IDA7Ci0JCQlqb3lzdGljay0+aHdkYXRhLT50cmFuc2F4aXNbaV0uc2NhbGUgPSAxLjA7IC8qIEp1c3QgaW4gY2FzZSAqLwotCQl9Ci0JfQotCi0JLyogZmlsbCBuYnV0dG9ucywgbmF4ZXMsIGFuZCBuaGF0cyBmaWVsZHMgKi8KLQlqb3lzdGljay0+bmJ1dHRvbnMgPSBTWVNfSm95c3RpY2tbaW5kZXhdLndOdW1CdXR0b25zOwotCWpveXN0aWNrLT5uYXhlcyA9IFNZU19Kb3lzdGlja1tpbmRleF0ud051bUF4ZXM7Ci0JaWYgKCBTWVNfSm95c3RpY2tbaW5kZXhdLndDYXBzICYgSk9ZQ0FQU19IQVNQT1YgKSB7Ci0JCWpveXN0aWNrLT5uaGF0cyA9IDE7Ci0JfSBlbHNlIHsKLQkJam95c3RpY2stPm5oYXRzID0gMDsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgVWludDggVHJhbnNsYXRlUE9WKERXT1JEIHZhbHVlKQotewotCVVpbnQ4IHBvczsKLQotCXBvcyA9IFNETF9IQVRfQ0VOVEVSRUQ7Ci0JaWYgKCB2YWx1ZSAhPSBKT1lfUE9WQ0VOVEVSRUQgKSB7Ci0JCWlmICggKHZhbHVlID4gSk9ZX1BPVkxFRlQpIHx8ICh2YWx1ZSA8IEpPWV9QT1ZSSUdIVCkgKSB7Ci0JCQlwb3MgfD0gU0RMX0hBVF9VUDsKLQkJfQotCQlpZiAoICh2YWx1ZSA+IEpPWV9QT1ZGT1JXQVJEKSAmJiAodmFsdWUgPCBKT1lfUE9WQkFDS1dBUkQpICkgewotCQkJcG9zIHw9IFNETF9IQVRfUklHSFQ7Ci0JCX0KLQkJaWYgKCAodmFsdWUgPiBKT1lfUE9WUklHSFQpICYmICh2YWx1ZSA8IEpPWV9QT1ZMRUZUKSApIHsKLQkJCXBvcyB8PSBTRExfSEFUX0RPV047Ci0JCX0KLQkJaWYgKCB2YWx1ZSA+IEpPWV9QT1ZCQUNLV0FSRCApIHsKLQkJCXBvcyB8PSBTRExfSEFUX0xFRlQ7Ci0JCX0KLQl9Ci0JcmV0dXJuKHBvcyk7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCi0gKiBidXQgaW5zdGVhZCBzaG91bGQgY2FsbCBTRExfUHJpdmF0ZUpveXN0aWNrKigpIHRvIGRlbGl2ZXIgZXZlbnRzCi0gKiBhbmQgdXBkYXRlIGpveXN0aWNrIGRldmljZSBzdGF0ZS4KLSAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JTU1SRVNVTFQgcmVzdWx0OwotCWludCBpOwotCURXT1JEIGZsYWdzW01BWF9BWEVTXSA9IHsgSk9ZX1JFVFVSTlgsIEpPWV9SRVRVUk5ZLCBKT1lfUkVUVVJOWiwgCi0JCQkJICBKT1lfUkVUVVJOUiwgSk9ZX1JFVFVSTlUsIEpPWV9SRVRVUk5WIH07Ci0JRFdPUkQgcG9zW01BWF9BWEVTXTsKLQlzdHJ1Y3QgX3RyYW5zYXhpcyAqdHJhbnNheGlzOwotCWludCB2YWx1ZSwgY2hhbmdlOwotCUpPWUlORk9FWCBqb3lpbmZvOwotCi0Jam95aW5mby5kd1NpemUgPSBzaXplb2Yoam95aW5mbyk7Ci0Jam95aW5mby5kd0ZsYWdzID0gSk9ZX1JFVFVSTkFMTHxKT1lfUkVUVVJOUE9WQ1RTOwotCWlmICggISBqb3lzdGljay0+aGF0cyApIHsKLQkJam95aW5mby5kd0ZsYWdzICY9IH4oSk9ZX1JFVFVSTlBPVnxKT1lfUkVUVVJOUE9WQ1RTKTsKLQl9Ci0JcmVzdWx0ID0gam95R2V0UG9zRXgoam95c3RpY2stPmh3ZGF0YS0+aWQsICZqb3lpbmZvKTsKLQlpZiAoIHJlc3VsdCAhPSBKT1lFUlJfTk9FUlJPUiApIHsKLQkJU2V0TU1lcnJvcigiam95R2V0UG9zRXgiLCByZXN1bHQpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogam95c3RpY2sgbW90aW9uIGV2ZW50cyAqLwotCXBvc1swXSA9IGpveWluZm8uZHdYcG9zOwotCXBvc1sxXSA9IGpveWluZm8uZHdZcG9zOwotCXBvc1syXSA9IGpveWluZm8uZHdacG9zOwotCXBvc1szXSA9IGpveWluZm8uZHdScG9zOwotCXBvc1s0XSA9IGpveWluZm8uZHdVcG9zOwotCXBvc1s1XSA9IGpveWluZm8uZHdWcG9zOwotCi0JdHJhbnNheGlzID0gam95c3RpY2stPmh3ZGF0YS0+dHJhbnNheGlzOwotCWZvciAoaSA9IDA7IGkgPCBqb3lzdGljay0+bmF4ZXM7IGkrKykgewotCQlpZiAoam95aW5mby5kd0ZsYWdzICYgZmxhZ3NbaV0pIHsKLQkJCXZhbHVlID0gKGludCkoKChmbG9hdClwb3NbaV0gKyB0cmFuc2F4aXNbaV0ub2Zmc2V0KSAqIHRyYW5zYXhpc1tpXS5zY2FsZSk7Ci0JCQljaGFuZ2UgPSAodmFsdWUgLSBqb3lzdGljay0+YXhlc1tpXSk7Ci0JCQlpZiAoIChjaGFuZ2UgPCAtSk9ZX0FYSVNfVEhSRVNIT0xEKSB8fCAoY2hhbmdlID4gSk9ZX0FYSVNfVEhSRVNIT0xEKSApIHsKLQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywgKFVpbnQ4KWksIChTaW50MTYpdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogam95c3RpY2sgYnV0dG9uIGV2ZW50cyAqLwotCWlmICggam95aW5mby5kd0ZsYWdzICYgSk9ZX1JFVFVSTkJVVFRPTlMgKSB7Ci0JCWZvciAoIGkgPSAwOyBpIDwgam95c3RpY2stPm5idXR0b25zOyArK2kgKSB7Ci0JCQlpZiAoIGpveWluZm8uZHdCdXR0b25zICYgSk9ZX0JVVFRPTl9GTEFHKGkpICkgewotCQkJCWlmICggISBqb3lzdGljay0+YnV0dG9uc1tpXSApIHsKLQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywgKFVpbnQ4KWksIFNETF9QUkVTU0VEKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICggam95c3RpY2stPmJ1dHRvbnNbaV0gKSB7Ci0JCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIChVaW50OClpLCBTRExfUkVMRUFTRUQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIGpveXN0aWNrIGhhdCBldmVudHMgKi8KLQlpZiAoIGpveWluZm8uZHdGbGFncyAmIEpPWV9SRVRVUk5QT1YgKSB7Ci0JCVVpbnQ4IHBvczsKLQotCQlwb3MgPSBUcmFuc2xhdGVQT1Yoam95aW5mby5kd1BPVik7Ci0JCWlmICggcG9zICE9IGpveXN0aWNrLT5oYXRzWzBdICkgewotCQkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgMCwgcG9zKTsKLQkJfQotCX0KLX0KLQotLyogRnVuY3Rpb24gdG8gY2xvc2UgYSBqb3lzdGljayBhZnRlciB1c2UgKi8KLXZvaWQgU0RMX1NZU19Kb3lzdGlja0Nsb3NlKFNETF9Kb3lzdGljayAqam95c3RpY2spCi17Ci0JaWYgKGpveXN0aWNrLT5od2RhdGEgIT0gTlVMTCkgewotCQkvKiBmcmVlIHN5c3RlbSBzcGVjaWZpYyBoYXJkd2FyZSBkYXRhICovCi0JCVNETF9mcmVlKGpveXN0aWNrLT5od2RhdGEpOwotCX0KLX0KLQotLyogRnVuY3Rpb24gdG8gcGVyZm9ybSBhbnkgc3lzdGVtLXNwZWNpZmljIGpveXN0aWNrIHJlbGF0ZWQgY2xlYW51cCAqLwotdm9pZCBTRExfU1lTX0pveXN0aWNrUXVpdCh2b2lkKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSk9ZU1RJQ0tTOyBpKyspIHsKLQkJaWYgKCBTWVNfSm95c3RpY2tOYW1lW2ldICE9IE5VTEwgKSB7Ci0JCQlTRExfZnJlZShTWVNfSm95c3RpY2tOYW1lW2ldKTsKLQkJfQotCX0KLX0KLQotCi0vKiBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMgKi8KLXZvaWQgU2V0TU1lcnJvcihjaGFyICpmdW5jdGlvbiwgaW50IGNvZGUpCi17Ci0Jc3RhdGljIGNoYXIgKmVycm9yOwotCXN0YXRpYyBjaGFyICBlcnJidWZbMTAyNF07Ci0KLQllcnJidWZbMF0gPSAwOwotCXN3aXRjaCAoY29kZSkgCi0JewotCQljYXNlIE1NU1lTRVJSX05PRFJJVkVSOgotCQkJZXJyb3IgPSAiSm95c3RpY2sgZHJpdmVyIG5vdCBwcmVzZW50IjsKLQkJYnJlYWs7Ci0KLQkJY2FzZSBNTVNZU0VSUl9JTlZBTFBBUkFNOgotCQljYXNlIEpPWUVSUl9QQVJNUzoKLQkJCWVycm9yID0gIkludmFsaWQgcGFyYW1ldGVyKHMpIjsKLQkJYnJlYWs7Ci0JCQotCQljYXNlIE1NU1lTRVJSX0JBRERFVklDRUlEOgotCQkJZXJyb3IgPSAiQmFkIGRldmljZSBJRCI7Ci0JCWJyZWFrOwotCi0JCWNhc2UgSk9ZRVJSX1VOUExVR0dFRDoKLQkJCWVycm9yID0gIkpveXN0aWNrIG5vdCBhdHRhY2hlZCI7Ci0JCWJyZWFrOwotCi0JCWNhc2UgSk9ZRVJSX05PQ0FORE86Ci0JCQllcnJvciA9ICJDYW4ndCBjYXB0dXJlIGpveXN0aWNrIGlucHV0IjsKLQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCVNETF9zbnByaW50ZihlcnJidWYsIFNETF9hcnJheXNpemUoZXJyYnVmKSwKLQkJCSAgICAgICAgICIlczogVW5rbm93biBNdWx0aW1lZGlhIHN5c3RlbSBlcnJvcjogMHgleCIsCi0JCQkJCQkJCWZ1bmN0aW9uLCBjb2RlKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCAhIGVycmJ1ZlswXSApIHsKLQkJU0RMX3NucHJpbnRmKGVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLCAiJXM6ICVzIiwgZnVuY3Rpb24sIGVycm9yKTsKLQl9Ci0JU0RMX1NldEVycm9yKCIlcyIsIGVycmJ1Zik7Ci19Ci0KLSNlbmRpZiAvKiBTRExfSk9ZU1RJQ0tfV0lOTU0gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbG9hZHNvL2Jlb3MvU0RMX3N5c2xvYWRzby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vYmVvcy9TRExfc3lzbG9hZHNvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDZkOTMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vYmVvcy9TRExfc3lzbG9hZHNvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9MT0FEU09fQkVPUwotCi0vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCi0vKiBTeXN0ZW0gZGVwZW5kZW50IGxpYnJhcnkgbG9hZGluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGJlL2tlcm5lbC9pbWFnZS5oPgotCi0jaW5jbHVkZSAiU0RMX2xvYWRzby5oIgotCi12b2lkICoKLVNETF9Mb2FkT2JqZWN0KGNvbnN0IGNoYXIgKnNvZmlsZSkKLXsKLSAgICB2b2lkICpoYW5kbGUgPSBOVUxMOwotICAgIGltYWdlX2lkIGxpYnJhcnlfaWQgPSBsb2FkX2FkZF9vbihzb2ZpbGUpOwotICAgIGlmIChsaWJyYXJ5X2lkIDwgMCkgewotICAgICAgICBTRExfU2V0RXJyb3Ioc3RyZXJyb3IoKGludCkgbGlicmFyeV9pZCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhhbmRsZSA9ICh2b2lkICopIChsaWJyYXJ5X2lkKTsKLSAgICB9Ci0gICAgcmV0dXJuIChoYW5kbGUpOwotfQotCi12b2lkICoKLVNETF9Mb2FkRnVuY3Rpb24odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIHZvaWQgKnN5bSA9IE5VTEw7Ci0gICAgaW1hZ2VfaWQgbGlicmFyeV9pZCA9IChpbWFnZV9pZCkgaGFuZGxlOwotICAgIHN0YXR1c190IHJjID0gZ2V0X2ltYWdlX3N5bWJvbChsaWJyYXJ5X2lkLCBuYW1lLCBCX1NZTUJPTF9UWVBFX1RFWFQsICZzeW0pOwotICAgIGlmIChyYyAhPSBCX05PX0VSUk9SKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcihzdHJlcnJvcihyYykpOwotICAgIH0KLSAgICByZXR1cm4gKHN5bSk7Ci19Ci0KLXZvaWQKLVNETF9VbmxvYWRPYmplY3Qodm9pZCAqaGFuZGxlKQotewotICAgIGltYWdlX2lkIGxpYnJhcnlfaWQ7Ci0gICAgaWYgKGhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgIGxpYnJhcnlfaWQgPSAoaW1hZ2VfaWQpIGhhbmRsZTsKLSAgICAgICAgdW5sb2FkX2FkZF9vbihsaWJyYXJ5X2lkKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBTRExfTE9BRFNPX0JFT1MgKi8KLQotLyogdmk6IHNldCB0cz00IHN3PTQgZXhwYW5kdGFiOiAqLwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2xvYWRzby9kbG9wZW4vU0RMX3N5c2xvYWRzby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vZGxvcGVuL1NETF9zeXNsb2Fkc28uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwYWNhZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2xvYWRzby9kbG9wZW4vU0RMX3N5c2xvYWRzby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfTE9BRFNPX0RMT1BFTgotCi0vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCi0vKiBTeXN0ZW0gZGVwZW5kZW50IGxpYnJhcnkgbG9hZGluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLSNpbmNsdWRlICJTRExfbG9hZHNvLmgiCi0KLXZvaWQgKlNETF9Mb2FkT2JqZWN0KGNvbnN0IGNoYXIgKnNvZmlsZSkKLXsKLQl2b2lkICpoYW5kbGUgPSBkbG9wZW4oc29maWxlLCBSVExEX05PVyk7Ci0JY29uc3QgY2hhciAqbG9hZGVycm9yID0gKGNoYXIgKilkbGVycm9yKCk7Ci0JaWYgKCBoYW5kbGUgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBzb2ZpbGUsIGxvYWRlcnJvcik7Ci0JfQotCXJldHVybihoYW5kbGUpOwotfQotCi12b2lkICpTRExfTG9hZEZ1bmN0aW9uKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQl2b2lkICpzeW1ib2wgPSBkbHN5bShoYW5kbGUsIG5hbWUpOwotCWlmICggc3ltYm9sID09IE5VTEwgKSB7Ci0JCS8qIGFwcGVuZCBhbiB1bmRlcnNjb3JlIGZvciBwbGF0Zm9ybXMgdGhhdCBuZWVkIHRoYXQuICovCi0JCXNpemVfdCBsZW4gPSAxK1NETF9zdHJsZW4obmFtZSkrMTsKLQkJY2hhciAqX25hbWUgPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbGVuKTsKLQkJX25hbWVbMF0gPSAnXyc7Ci0JCVNETF9zdHJsY3B5KCZfbmFtZVsxXSwgbmFtZSwgbGVuKTsKLQkJc3ltYm9sID0gZGxzeW0oaGFuZGxlLCBfbmFtZSk7Ci0JCVNETF9zdGFja19mcmVlKF9uYW1lKTsKLQkJaWYgKCBzeW1ib2wgPT0gTlVMTCApIHsKLQkJCVNETF9TZXRFcnJvcigiRmFpbGVkIGxvYWRpbmcgJXM6ICVzIiwgbmFtZSwgKGNvbnN0IGNoYXIgKilkbGVycm9yKCkpOwotCQl9Ci0JfQotCXJldHVybihzeW1ib2wpOwotfQotCi12b2lkIFNETF9VbmxvYWRPYmplY3Qodm9pZCAqaGFuZGxlKQotewotCWlmICggaGFuZGxlICE9IE5VTEwgKSB7Ci0JCWRsY2xvc2UoaGFuZGxlKTsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBTRExfTE9BRFNPX0RMT1BFTiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vZHVtbXkvU0RMX3N5c2xvYWRzby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vZHVtbXkvU0RMX3N5c2xvYWRzby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QxNmI5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbG9hZHNvL2R1bW15L1NETF9zeXNsb2Fkc28uYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChTRExfTE9BRFNPX0RVTU1ZKSB8fCBkZWZpbmVkKFNETF9MT0FEU09fRElTQUJMRUQpCi0KLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLS8qIFN5c3RlbSBkZXBlbmRlbnQgbGlicmFyeSBsb2FkaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2luY2x1ZGUgIlNETF9sb2Fkc28uaCIKLQotdm9pZCAqU0RMX0xvYWRPYmplY3QoY29uc3QgY2hhciAqc29maWxlKQotewotCWNvbnN0IGNoYXIgKmxvYWRlcnJvciA9ICJTRExfTG9hZE9iamVjdCgpIG5vdCBpbXBsZW1lbnRlZCI7Ci0JU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBzb2ZpbGUsIGxvYWRlcnJvcik7Ci0JcmV0dXJuKE5VTEwpOwotfQotCi12b2lkICpTRExfTG9hZEZ1bmN0aW9uKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQljb25zdCBjaGFyICpsb2FkZXJyb3IgPSAiU0RMX0xvYWRGdW5jdGlvbigpIG5vdCBpbXBsZW1lbnRlZCI7Ci0JU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBuYW1lLCBsb2FkZXJyb3IpOwotCXJldHVybihOVUxMKTsKLX0KLQotdm9pZCBTRExfVW5sb2FkT2JqZWN0KHZvaWQgKmhhbmRsZSkKLXsKLSAgICAvKiBuby1vcC4gKi8KLX0KLQotI2VuZGlmIC8qIFNETF9MT0FEU09fRFVNTVkgfHwgU0RMX0xPQURTT19ESVNBQkxFRCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vbWFjb3MvU0RMX3N5c2xvYWRzby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vbWFjb3MvU0RMX3N5c2xvYWRzby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTZkZjFkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbG9hZHNvL21hY29zL1NETF9zeXNsb2Fkc28uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9MT0FEU09fTUFDT1MKLQotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotLyogU3lzdGVtIGRlcGVuZGVudCBsaWJyYXJ5IGxvYWRpbmcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgT0xEUDJDIDEKLSNpbmNsdWRlIDxTdHJpbmdzLmg+Ci0jaW5jbHVkZSA8Q29kZUZyYWdtZW50cy5oPgotI2luY2x1ZGUgPEVycm9ycy5oPgotCi0jaW5jbHVkZSAiU0RMX2xvYWRzby5oIgotCi12b2lkICpTRExfTG9hZE9iamVjdChjb25zdCBjaGFyICpzb2ZpbGUpCi17Ci0Jdm9pZCAqaGFuZGxlID0gTlVMTDsKLQljb25zdCBjaGFyICpsb2FkZXJyb3IgPSBOVUxMOwotCUNGcmFnQ29ubmVjdGlvbklEIGxpYnJhcnlfaWQ7Ci0JUHRyIG1haW5BZGRyOwotCVN0cjI1NSBlcnJOYW1lOwotCU9TRXJyIGVycm9yOwotCWNoYXIgcHNvZmlsZVs1MTJdOwotCi0JU0RMX3N0cmxjcHkocHNvZmlsZSwgc29maWxlLCBTRExfYXJyYXlzaXplKHBzb2ZpbGUpKTsKLQllcnJvciA9IEdldFNoYXJlZExpYnJhcnkoQzJQU3RyKHBzb2ZpbGUpLCBrQ29tcGlsZWRDRnJhZ0FyY2gsCi0JCQlrTG9hZENGcmFnLCAmbGlicmFyeV9pZCwgJm1haW5BZGRyLCBlcnJOYW1lKTsKLQlzd2l0Y2ggKGVycm9yKSB7Ci0JCWNhc2Ugbm9FcnI6Ci0JCQlsb2FkZXJyb3IgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCWNhc2UgY2ZyYWdOb0xpYnJhcnlFcnI6Ci0JCQlsb2FkZXJyb3IgPSAiTGlicmFyeSBub3QgZm91bmQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgY2ZyYWdVbnJlc29sdmVkRXJyOgotCQkJbG9hZGVycm9yID0gIlVuYWJsZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIjsKLQkJCWJyZWFrOwotCQljYXNlIGNmcmFnTm9Qcml2YXRlTWVtRXJyOgotCQljYXNlIGNmcmFnTm9DbGllbnRNZW1FcnI6Ci0JCQlsb2FkZXJyb3IgPSAiT3V0IG9mIG1lbW9yeSI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWxvYWRlcnJvciA9ICJVbmtub3duIENvZGUgRnJhZ21lbnQgTWFuYWdlciBlcnJvciI7Ci0JCQlicmVhazsKLQl9Ci0JaWYgKCBsb2FkZXJyb3IgPT0gTlVMTCApIHsKLQkJaGFuZGxlID0gKHZvaWQgKikobGlicmFyeV9pZCk7Ci0JfSBlbHNlIHsKLQkJU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBzb2ZpbGUsIGxvYWRlcnJvcik7Ci0JfQotCXJldHVybihoYW5kbGUpOwotfQotCi12b2lkICpTRExfTG9hZEZ1bmN0aW9uKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQl2b2lkICpzeW1ib2wgPSBOVUxMOwotCWNvbnN0IGNoYXIgKmxvYWRlcnJvciA9IE5VTEw7Ci0JQ0ZyYWdTeW1ib2xDbGFzcyBjbGFzczsKLQlDRnJhZ0Nvbm5lY3Rpb25JRCBsaWJyYXJ5X2lkID0gKENGcmFnQ29ubmVjdGlvbklEKWhhbmRsZTsKLQljaGFyIHBuYW1lWzUxMl07Ci0KLQlTRExfc3RybGNweShwbmFtZSwgbmFtZSwgU0RMX2FycmF5c2l6ZShwbmFtZSkpOwotCWlmICggRmluZFN5bWJvbChsaWJyYXJ5X2lkLCBDMlBTdHIocG5hbWUpLAotCSAgICAgICAgICAgICAgICAoY2hhciAqKikmc3ltYm9sLCAmY2xhc3MpICE9IG5vRXJyICkgewotCQlsb2FkZXJyb3IgPSAiU3ltYm9sIG5vdCBmb3VuZCI7Ci0JfQotCi0JaWYgKCBzeW1ib2wgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBuYW1lLCBsb2FkZXJyb3IpOwotCX0KLQlyZXR1cm4oc3ltYm9sKTsKLX0KLQotdm9pZCBTRExfVW5sb2FkT2JqZWN0KHZvaWQgKmhhbmRsZSkKLXsKLQlDRnJhZ0Nvbm5lY3Rpb25JRCBsaWJyYXJ5X2lkOwotCWlmICggaGFuZGxlICE9IE5VTEwgKSB7Ci0JCWxpYnJhcnlfaWQgPSAoQ0ZyYWdDb25uZWN0aW9uSUQpaGFuZGxlOwotCQlDbG9zZUNvbm5lY3Rpb24oJmxpYnJhcnlfaWQpOwotCX0KLX0KLQotI2VuZGlmIC8qIFNETF9MT0FEU09fTUFDT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbG9hZHNvL21hY29zeC9TRExfZGxjb21wYXQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbG9hZHNvL21hY29zeC9TRExfZGxjb21wYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyOGRkMS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2xvYWRzby9tYWNvc3gvU0RMX2RsY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDA3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX0xPQURTT19ETENPTVBBVAotCi0vKiBQbGVhc2Ugbm90ZSB0aGF0IGRsY29tcGF0IGFwcGFyZW50bHkgc2hpcHMgaW4gY3VycmVudCBNYWMgT1MgWCB2ZXJzaW9ucwotICogIGFzIGEgc3lzdGVtIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFVuaXggImRsb3BlbiIKLSAqICBpbnRlcmZhY2UuIEluIG9yZGVyIHRvIGFsbG93IFNETCB0byB3b3JrIG9uIG9sZGVyIE9TIFggcmVsZWFzZXMgYW5kIGFsc28KLSAqICBub3QgY29uZmxpY3Qgd2l0aCB0aGUgc3lzdGVtIGxpYiBvbiBuZXdlciB2ZXJzaW9ucywgd2UgaW5jbHVkZSBkbGNvbXBhdAotICogIGluIFNETCBhbmQgY2hhbmdlIHRoZSBzeW1ib2xzIHRvIHByZXZlbnQgc3ltYm9sIGNsYXNoIHdpdGggYW55IGV4aXN0aW5nCi0gKiAgc3lzdGVtIGxpYnJhcmllcy4gIC0tcnlhbi4KLSAqLwotCi0vKiBoZXJlIGlzIHRoZSBkbGNvbXBhdCBsaWNlbnNlOiAqLwotCi0vKgotQ29weXJpZ2h0IChjKSAyMDAyIEpvcmdlIEFjZXJlZGEgIDxqYWNlcmVkYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+ICYKLSAgICAgICAgICAgICAgICAgICBQZXRlciBPJ0dvcm1hbiA8b2dvcm1hbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gICAgICAgICAgICAgICAgICAgCi1Qb3J0aW9ucyBtYXkgYmUgY29weXJpZ2h0IG90aGVycywgc2VlIHRoZSBBVVRIT1JTIGZpbGUgaW5jbHVkZWQgd2l0aCB0aGlzCi1kaXN0cmlidXRpb24uCi0KLU1haW50YWluZWQgYnkgUGV0ZXIgTydHb3JtYW4gPG9nb3JtYW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgotCi1CdWcgUmVwb3J0cyBhbmQgb3RoZXIgcXVlcmllcyBzaG91bGQgZ28gdG8gPG9nb3JtYW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLWEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi1wZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLXRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKLWluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLUVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLUxJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLU9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0qLwotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8bWFjaC1vL2R5bGQuaD4KLSNpbmNsdWRlIDxtYWNoLW8vbmxpc3QuaD4KLSNpbmNsdWRlIDxtYWNoLW8vZ2V0c2VjdC5oPgotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotCi0vKiBKdXN0IHBsYXlpbmcgdG8gc2VlIGlmIGl0IHdvdWxkIGNvbXBpbGUgd2l0aCB0aGUgZnJlZWJzZCBoZWFkZXJzLCBpdCBkb2VzLAotICogYnV0IGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVudCB2YWx1ZXMgZm9yIFJUTERfTE9DQUwgZXRjLCBpdCB3b3VsZCBicmVhayBiaW5hcnkKLSAqIGNvbXBhdC4uLiBvaCB3ZWxsCi0gKi8KLSNpZm5kZWYgX19CU0RfVklTSUJMRQotI2RlZmluZSBfX0JTRF9WSVNJQkxFIDEKLSNlbmRpZgotCi0vKmluY2x1ZGUgImRsZmNuLmgiKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+IDMKLSNkZWZpbmUgZGxfcmVzdHJpY3QgX19yZXN0cmljdAotI2Vsc2UKLSNkZWZpbmUgZGxfcmVzdHJpY3QKLSNlbmRpZgotCi0jaWYgMAotI2lmbmRlZiBfUE9TSVhfU09VUkNFCi0vKgotICogU3RydWN0dXJlIGZpbGxlZCBpbiBieSBkbGFkZHIoKS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX09TWF9kbF9pbmZvIHsKLSAgICAgICAgY29uc3QgY2hhciAgICAgICpkbGlfZm5hbWU7ICAgICAvKiBQYXRobmFtZSBvZiBzaGFyZWQgb2JqZWN0ICovCi0gICAgICAgIHZvaWQgICAgICAgICAgICAqZGxpX2ZiYXNlOyAgICAgLyogQmFzZSBhZGRyZXNzIG9mIHNoYXJlZCBvYmplY3QgKi8KLSAgICAgICAgY29uc3QgY2hhciAgICAgICpkbGlfc25hbWU7ICAgICAvKiBOYW1lIG9mIG5lYXJlc3Qgc3ltYm9sICovCi0gICAgICAgIHZvaWQgICAgICAgICAgICAqZGxpX3NhZGRyOyAgICAgLyogQWRkcmVzcyBvZiBuZWFyZXN0IHN5bWJvbCAqLwotfSBTRExfT1NYX0RsX2luZm87Ci0KLXN0YXRpYyBpbnQgU0RMX09TWF9kbGFkZHIoY29uc3Qgdm9pZCAqIGRsX3Jlc3RyaWN0LCBTRExfT1NYX0RsX2luZm8gKiBkbF9yZXN0cmljdCk7Ci0jZW5kaWYgLyogISBfUE9TSVhfU09VUkNFICovCi0jZW5kaWYgLyogMCAqLwotCi1zdGF0aWMgaW50IFNETF9PU1hfZGxjbG9zZSh2b2lkICogaGFuZGxlKTsKLXN0YXRpYyBjb25zdCBjaGFyICogU0RMX09TWF9kbGVycm9yKHZvaWQpOwotc3RhdGljIHZvaWQgKiBTRExfT1NYX2Rsb3Blbihjb25zdCBjaGFyICpwYXRoLCBpbnQgbW9kZSk7Ci1zdGF0aWMgdm9pZCAqIFNETF9PU1hfZGxzeW0odm9pZCAqIGRsX3Jlc3RyaWN0IGhhbmRsZSwgY29uc3QgY2hhciAqIGRsX3Jlc3RyaWN0IHN5bWJvbCk7Ci0KLSNkZWZpbmUgUlRMRF9MQVpZCTB4MQotI2RlZmluZSBSVExEX05PVwkweDIKLSNkZWZpbmUgUlRMRF9MT0NBTAkweDQKLSNkZWZpbmUgUlRMRF9HTE9CQUwJMHg4Ci0KLSNpZm5kZWYgX1BPU0lYX1NPVVJDRQotI2RlZmluZSBSVExEX05PTE9BRAkweDEwCi0jZGVmaW5lIFJUTERfTk9ERUxFVEUJMHg4MAotCi0vKgotICogU3BlY2lhbCBoYW5kbGUgYXJndW1lbnRzIGZvciBTRExfT1NYX2Rsc3ltKCkuCi0gKi8KLSNkZWZpbmUJUlRMRF9ORVhUCQkoKHZvaWQgKikgLTEpCS8qIFNlYXJjaCBzdWJzZXF1ZW50IG9iamVjdHMuICovCi0jZGVmaW5lCVJUTERfREVGQVVMVAkoKHZvaWQgKikgLTIpCS8qIFVzZSBkZWZhdWx0IHNlYXJjaCBhbGdvcml0aG0uICovCi0jZW5kaWYgLyogISBfUE9TSVhfU09VUkNFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNpZm5kZWYgZGxfcmVzdHJpY3QKLSNkZWZpbmUgZGxfcmVzdHJpY3QgX19yZXN0cmljdAotI2VuZGlmCi0vKiBUaGlzIGlzIG5vdCBhdmFpbGFibGUgb24gMTAuMSAqLwotI2lmbmRlZiBMQ19MT0FEX1dFQUtfRFlMSUIKLSNkZWZpbmUJTENfTE9BRF9XRUFLX0RZTElCICgweDE4IHwgTENfUkVRX0RZTEQpCi0jZW5kaWYKLQotLyogV2l0aCB0aGlzIHN0dWZmIGhlcmUsIHRoaXMgdGhpbmcgbWF5IGFjdHVhbGx5IGNvbXBpbGUvcnVuIG9uIDEwLjAgc3lzdGVtcwotICogTm90IHRoYXQgSSBoYXZlIGEgMTAuMCBzeXN0ZW0gdG8gdGVzdCBpdCBvbiBhbnlsb25nZXIKLSAqLwotI2lmbmRlZiBMQ19SRVFfRFlMRAotI2RlZmluZSBMQ19SRVFfRFlMRCAweDgwMDAwMDAwCi0jZW5kaWYKLSNpZm5kZWYgTlNBRERJTUFHRV9PUFRJT05fUkVUVVJOX09OTFlfSUZfTE9BREVECi0jZGVmaW5lIE5TQURESU1BR0VfT1BUSU9OX1JFVFVSTl9PTkxZX0lGX0xPQURFRCAweDQKLSNlbmRpZgotI2lmbmRlZiBOU0FERElNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IKLSNkZWZpbmUgTlNBRERJTUFHRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SIDB4MQotI2VuZGlmCi0jaWZuZGVmIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fQklORAotI2RlZmluZSBOU0xPT0tVUFNZTUJPTElOSU1BR0VfT1BUSU9OX0JJTkQgMHgwCi0jZW5kaWYKLSNpZm5kZWYgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IKLSNkZWZpbmUgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IgMHg0Ci0jZW5kaWYKLS8qIFRoZXNlIHN5bWJvbHMgd2lsbCBiZSBsb29rZWQgZm9yIGluIGR5bGQgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKigqZHlsZF9OU0FkZEltYWdlKSAoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nKSA9IDA7Ci1zdGF0aWMgaW50ICgqZHlsZF9OU0lzU3ltYm9sTmFtZURlZmluZWRJbkltYWdlKSAoY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICosIGNvbnN0IGNoYXIgKikgPSAwOwotc3RhdGljIE5TU3ltYm9sKCpkeWxkX05TTG9va3VwU3ltYm9sSW5JbWFnZSkKLQkoY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZykgPSAwOwotCi0vKiBEZWZpbmUgdGhpcyB0byBtYWtlIGRsY29tcGF0IHJldXNlIGRhdGEgYmxvY2suIFRoaXMgd2F5IGluIHRoZW9yeSB3ZSBzYXZlCi0gKiBhIGxpdHRsZSBiaXQgb2Ygb3ZlcmhlYWQuIEhvd2V2ZXIgd2UgdGhlbiBjb3VsZG4ndCBjb3JyZWN0bHkgY2F0Y2ggZXhjZXNzCi0gKiBjYWxscyB0byBTRExfT1NYX2RsY2xvc2UoKS4gSGVuY2Ugd2UgZG9uJ3QgdXNlIHRoaXMgZmVhdHVyZQotICovCi0jdW5kZWYgUkVVU0VfU1RBVFVTCi0KLS8qIFNpemUgb2YgdGhlIGludGVybmFsIGVycm9yIG1lc3NhZ2UgYnVmZmVyICh1c2VkIGJ5IGRsZXJyb3IoKSkgKi8KLSNkZWZpbmUgRVJSX1NUUl9MRU4JCQkyNTEKLQotLyogTWF4aW11bSBudW1iZXIgb2Ygc2VhcmNoIHBhdGhzIHN1cHBvcnRlZCBieSBnZXRTZWFyY2hQYXRoICovCi0jZGVmaW5lIE1BWF9TRUFSQ0hfUEFUSFMJMzIKLQotCi0jZGVmaW5lIE1BR0lDX0RZTElCX09GSSAoKE5TT2JqZWN0RmlsZUltYWdlKSAnRFlPRicpCi0jZGVmaW5lIE1BR0lDX0RZTElCX01PRCAoKE5TTW9kdWxlKSAnRFlNTycpCi0KLS8qIGludGVybmFsIGZsYWdzICovCi0jZGVmaW5lIERMX0lOX0xJU1QgMHgwMQotCi0vKiBvdXIgbXV0ZXggKi8KLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgZGxjb21wYXRfbXV0ZXg7Ci0vKiBPdXIgdGhyZWFkIHNwZWNpZmljIHN0b3JhZ2UKLSAqLwotc3RhdGljIHB0aHJlYWRfa2V5X3QgZGxlcnJvcl9rZXk7Ci0KLXN0cnVjdCBkbHRocmVhZAotewotCWludCBsb2NrY250OwotCXVuc2lnbmVkIGNoYXIgZXJyc2V0OwotCWNoYXIgZXJyc3RyW0VSUl9TVFJfTEVOXTsKLX07Ci0KLS8qIFRoaXMgaXMgb3VyIGNlbnRyYWwgZGF0YSBzdHJ1Y3R1cmUuIFdoZW5ldmVyIGEgbW9kdWxlIGlzIGxvYWRlZCB2aWEKLSAqIFNETF9PU1hfZGxvcGVuKCksIHdlIGNyZWF0ZSBzdWNoIGEgc3RydWN0LgotICovCi1zdHJ1Y3QgZGxzdGF0dXMKLXsKLQlzdHJ1Y3QgZGxzdGF0dXMgKm5leHQ7CQkvKiBwb2ludGVyIHRvIG5leHQgZWxlbWVudCBpbiB0aGUgbGlua2VkIGxpc3QgKi8KLQlOU01vZHVsZSBtb2R1bGU7Ci0JY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICpsaWI7Ci0JaW50IHJlZnM7CQkJCQkvKiByZWZlcmVuY2UgY291bnQgKi8KLQlpbnQgbW9kZTsJCQkJCS8qIG1vZGUgaW4gd2hpY2ggdGhpcyBtb2R1bGUgd2FzIGxvYWRlZCAqLwotCWRldl90IGRldmljZTsKLQlpbm9fdCBpbm9kZTsKLQlpbnQgZmxhZ3M7CQkJCQkvKiBBbnkgaW50ZXJuYWwgZmxhZ3Mgd2UgbWF5IG5lZWQgKi8KLX07Ci0KLS8qIEhlYWQgbm9kZSBvZiB0aGUgZGxzdGF0dXMgbGlzdCAqLwotc3RhdGljIHN0cnVjdCBkbHN0YXR1cyBtYWluU3RhdHVzID0geyAwLCBNQUdJQ19EWUxJQl9NT0QsIE5VTEwsIC0xLCBSVExEX0dMT0JBTCwgMCwgMCwgMCB9Owotc3RhdGljIHN0cnVjdCBkbHN0YXR1cyAqc3RxdWV1ZSA9ICZtYWluU3RhdHVzOwotCi0KLS8qIFN0b3JhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIG1lc3NhZ2UgKHVzZWQgYnkgZGxlcnJvcigpKSAqLwotLyogc3RhdGljIGNoYXIgZXJyX3N0cltFUlJfU1RSX0xFTl07ICovCi0vKiBzdGF0aWMgaW50IGVycl9maWxsZWQgPSAwOyAqLwotCi0vKiBQcm90b3R5cGVzIHRvIGludGVybmFsIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgZGVidWcoY29uc3QgY2hhciAqZm10LCAuLi4pOwotc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqc3RyLCAuLi4pOwotc3RhdGljIGNvbnN0IGNoYXIgKnNhZmVnZXRlbnYoY29uc3QgY2hhciAqcyk7Ci1zdGF0aWMgY29uc3QgY2hhciAqc2VhcmNoTGlzdCh2b2lkKTsKLXN0YXRpYyBjb25zdCBjaGFyICpnZXRTZWFyY2hQYXRoKGludCBpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpnZXRGdWxsUGF0aChpbnQgaSwgY29uc3QgY2hhciAqZmlsZSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHN0YXQgKmZpbmRGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKipmdWxsUGF0aCk7Ci1zdGF0aWMgaW50IGlzVmFsaWRTdGF0dXMoc3RydWN0IGRsc3RhdHVzICpzdGF0dXMpOwotc3RhdGljIGlubGluZSBpbnQgaXNGbGFnU2V0KGludCBtb2RlLCBpbnQgZmxhZyk7Ci1zdGF0aWMgc3RydWN0IGRsc3RhdHVzICpsb29rdXBTdGF0dXMoY29uc3Qgc3RydWN0IHN0YXQgKnNidWYpOwotc3RhdGljIHZvaWQgaW5zZXJ0U3RhdHVzKHN0cnVjdCBkbHN0YXR1cyAqZGxzLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqc2J1Zik7Ci1zdGF0aWMgaW50IHByb21vdGVMb2NhbFRvR2xvYmFsKHN0cnVjdCBkbHN0YXR1cyAqZGxzKTsKLXN0YXRpYyB2b2lkICpyZWZlcmVuY2Uoc3RydWN0IGRsc3RhdHVzICpkbHMsIGludCBtb2RlKTsKLXN0YXRpYyB2b2lkICpkbHN5bUludGVybihzdHJ1Y3QgZGxzdGF0dXMgKmRscywgY29uc3QgY2hhciAqc3ltYm9sLCBpbnQgY2FuU2V0RXJyb3IpOwotc3RhdGljIHN0cnVjdCBkbHN0YXR1cyAqYWxsb2NTdGF0dXModm9pZCk7Ci1zdGF0aWMgc3RydWN0IGRsc3RhdHVzICpsb2FkTW9kdWxlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHN0cnVjdCBzdGF0ICpzYnVmLCBpbnQgbW9kZSk7Ci1zdGF0aWMgTlNTeW1ib2wgc2VhcmNoX2xpbmtlZF9saWJzKGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqbWgsIGNvbnN0IGNoYXIgKnN5bWJvbCk7Ci1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X2xpYl9uYW1lKGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqbWgpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqZ2V0X21hY2hfaGVhZGVyX2Zyb21fTlNNb2R1bGUoTlNNb2R1bGUgbW9kKTsKLXN0YXRpYyB2b2lkIGRsY29tcGF0X2luaXRfZnVuYyh2b2lkKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBkbGNvbXBhdF9pbml0X2NoZWNrKHZvaWQpOwotc3RhdGljIGlubGluZSB2b2lkIGRvbG9jayh2b2lkKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBkb3VubG9jayh2b2lkKTsKLXN0YXRpYyB2b2lkIGRsZXJyb3JmcmVlKHZvaWQgKmRhdGEpOwotc3RhdGljIHZvaWQgcmVzZXRkbGVycm9yKHZvaWQpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqbXlfZmluZF9pbWFnZShjb25zdCBjaGFyICpuYW1lKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKmltYWdlX2Zvcl9hZGRyZXNzKGNvbnN0IHZvaWQgKmFkZHJlc3MpOwotc3RhdGljIGlubGluZSBjaGFyICpkeWxkX2Vycm9yX3N0cih2b2lkKTsKLQotI2lmIEZJTktfQlVJTEQKLS8qIFR3byBHbG9iYWwgRnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCAqZGxzeW1fcHJlcGVuZF91bmRlcnNjb3JlKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKTsKLXN0YXRpYyB2b2lkICpkbHN5bV9hdXRvX3VuZGVyc2NvcmUodm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpzeW1ib2wpOwotCi0vKiBBbmQgdGhlaXIgX2ludGVybiBjb3VudGVycGFydHMgKi8KLXN0YXRpYyB2b2lkICpkbHN5bV9wcmVwZW5kX3VuZGVyc2NvcmVfaW50ZXJuKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKTsKLXN0YXRpYyB2b2lkICpkbHN5bV9hdXRvX3VuZGVyc2NvcmVfaW50ZXJuKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKTsKLSNlbmRpZgotCi0vKiBGdW5jdGlvbnMgKi8KLQotc3RhdGljIHZvaWQgZGVidWcoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0jaWYgREVCVUcgPiAxCi0JdmFfbGlzdCBhcmc7Ci0JdmFfc3RhcnQoYXJnLCBmbXQpOwotCWZwcmludGYoc3RkZXJyLCAiRExERUJVRzogIik7Ci0JdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZyk7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWZmbHVzaChzdGRlcnIpOwotCXZhX2VuZChhcmcpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKnN0ciwgLi4uKQotewotCXZhX2xpc3QgYXJnOwotCXN0cnVjdCBkbHRocmVhZCAgKnRzczsKLQljaGFyICogZXJyX3N0cjsKLQl2YV9zdGFydChhcmcsIHN0cik7Ci0JdHNzID0gcHRocmVhZF9nZXRzcGVjaWZpYyhkbGVycm9yX2tleSk7Ci0JZXJyX3N0ciA9IHRzcy0+ZXJyc3RyOwotCVNETF9zdHJsY3B5KGVycl9zdHIsICJkbGNvbXBhdDogIiwgRVJSX1NUUl9MRU4pOwotCXZzbnByaW50ZihlcnJfc3RyICsgMTAsIEVSUl9TVFJfTEVOIC0gMTAsIHN0ciwgYXJnKTsKLQl2YV9lbmQoYXJnKTsKLQlkZWJ1ZygiRVJST1I6ICVzXG4iLCBlcnJfc3RyKTsKLQl0c3MtPmVycnNldCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqc3RyKQotewotI2lmIERFQlVHID4gMAotCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogZGxjb21wYXQ6ICVzXG4iLCBzdHIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzYWZlZ2V0ZW52KGNvbnN0IGNoYXIgKnMpCi17Ci0JY29uc3QgY2hhciAqc3MgPSBTRExfZ2V0ZW52KHMpOwotCXJldHVybiBzcyA/IHNzIDogIiI7Ci19Ci0KLS8qIGJlY2F1c2UgdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9ucywgd2UKLSAqIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IGhvdyBlbGVnYW50IGl0IGlzLi4uIGl0IGNvdWxkIHVzZSB0aGUgbG9hZAotICogY29tbWFuZHMgdG8gZmluZCB0aGUgaW5zdGFsbCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBidXQuLi4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmdldF9saWJfbmFtZShjb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKm1oKQotewotCXVuc2lnbmVkIGxvbmcgY291bnQgPSBfZHlsZF9pbWFnZV9jb3VudCgpOwotCXVuc2lnbmVkIGxvbmcgaTsKLQljb25zdCBjaGFyICp2YWwgPSBOVUxMOwotCWlmIChtaCkKLQl7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQl7Ci0JCQlpZiAobWggPT0gX2R5bGRfZ2V0X2ltYWdlX2hlYWRlcihpKSkKLQkJCXsKLQkJCQl2YWwgPSBfZHlsZF9nZXRfaW1hZ2VfbmFtZShpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gdmFsOwotfQotCi0vKiBSZXR1cm5zIHRoZSBtYWNoX2hlYWRlciBmb3IgdGhlIG1vZHVsZSBidSBnb2luZyB0aHJvdWdoIGFsbCB0aGUgbG9hZGVkIGltYWdlcwotICogYW5kIGZpbmRpbmcgdGhlIG9uZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG1vZHVsZS4gVGhlcmUgcmVhbGx5IG91Z2h0IHRvIGJlCi0gKiBhbiBhcGkgZm9yIGRvaW5nIHRoaXMsIHdvdWxkIGJlIGZhc3RlciwgYnV0IHRoZXJlIGlzbid0IG9uZSByaWdodCBub3cKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqZ2V0X21hY2hfaGVhZGVyX2Zyb21fTlNNb2R1bGUoTlNNb2R1bGUgbW9kKQotewotCWNvbnN0IGNoYXIgKm1vZF9uYW1lID0gTlNOYW1lT2ZNb2R1bGUobW9kKTsKLQljb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKm1oID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGNvdW50ID0gX2R5bGRfaW1hZ2VfY291bnQoKTsKLQl1bnNpZ25lZCBsb25nIGk7Ci0JZGVidWcoIk1vZHVsZSBuYW1lOiAlcyIsIG1vZF9uYW1lKTsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQl7Ci0JCWlmICghU0RMX3N0cmNtcChtb2RfbmFtZSwgX2R5bGRfZ2V0X2ltYWdlX25hbWUoaSkpKQotCQl7Ci0JCQltaCA9IF9keWxkX2dldF9pbWFnZV9oZWFkZXIoaSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gbWg7Ci19Ci0KLQotLyogQ29tcHV0ZSBhbmQgcmV0dXJuIGEgbGlzdCBvZiBhbGwgZGlyZWN0b3JpZXMgdGhhdCB3ZSBzaG91bGQgc2VhcmNoIHdoZW4KLSAqIHRyeWluZyB0byBsb2NhdGUgYSBtb2R1bGUuIFdlIGZpcnN0IGxvb2sgYXQgdGhlIHZhbHVlcyBvZiBMRF9MSUJSQVJZX1BBVEgKLSAqIGFuZCBEWUxEX0xJQlJBUllfUEFUSCwgYW5kIHRoZW4gZmluYWxseSBmYWxsIGJhY2sgdG8gbG9va2luZyBpbnRvCi0gKiAvdXNyL2xpYiBhbmQgL2xpYi4gU2luY2UgYm90aCBvZiB0aGUgZW52aXJvbm1lbnRzIHZhcmlhYmxlcyBjYW4gY29udGFpbiBhCi0gKiBsaXN0IG9mIGNvbG9uIHNlcGVyYXRlZCBwYXRocywgd2Ugc2ltcGx5IGNvbmNhdCB0aGVtIGFuZCB0aGUgdHdvIG90aGVyIHBhdGhzCi0gKiBpbnRvIG9uZSBiaWcgc3RyaW5nLCB3aGljaCB3ZSB0aGVuIGNhbiBlYXNpbHkgcGFyc2UuCi0gKiBTcGxpdHRpbmcgdGhpcyBzdHJpbmcgaW50byB0aGUgYWN0dWFsIHBhdGggbGlzdCBpcyBkb25lIGJ5IGdldFNlYXJjaFBhdGgoKQotICovCi1zdGF0aWMgY29uc3QgY2hhciAqc2VhcmNoTGlzdCgpCi17Ci0Jc2l6ZV90IGJ1Zl9zaXplOwotCXN0YXRpYyBjaGFyICpidWY9TlVMTDsKLQljb25zdCBjaGFyICpsZGxwID0gc2FmZWdldGVudigiTERfTElCUkFSWV9QQVRIIik7Ci0JY29uc3QgY2hhciAqZHlsZGxwID0gc2FmZWdldGVudigiRFlMRF9MSUJSQVJZX1BBVEgiKTsKLQljb25zdCBjaGFyICpzdGRwYXRoID0gU0RMX2dldGVudigiRFlMRF9GQUxMQkFDS19MSUJSQVJZX1BBVEgiKTsKLQlpZiAoIXN0ZHBhdGgpCi0JCXN0ZHBhdGggPSAiL3Vzci9sb2NhbC9saWI6L2xpYjovdXNyL2xpYiI7Ci0JaWYgKCFidWYpCi0JewkKLQkJYnVmX3NpemUgPSBTRExfc3RybGVuKGxkbHApICsgU0RMX3N0cmxlbihkeWxkbHApICsgU0RMX3N0cmxlbihzdGRwYXRoKSArIDQ7Ci0JCWJ1ZiA9IFNETF9tYWxsb2MoYnVmX3NpemUpOwotCQlTRExfc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiVzJXMlcyVzJXMlYyIsIGR5bGRscCwgKGR5bGRscFswXSA/ICI6IiA6ICIiKSwgbGRscCwgKGxkbHBbMF0gPyAiOiIgOiAiIiksCi0JCQkJIHN0ZHBhdGgsICdcMCcpOwotCX0KLQlyZXR1cm4gYnVmOwotfQotCi0vKiBSZXR1cm5zIHRoZSBpdGggc2VhcmNoIHBhdGggZnJvbSB0aGUgbGlzdCBhcyBjb21wdXRlZCBieSBzZWFyY2hMaXN0KCkgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRTZWFyY2hQYXRoKGludCBpKQotewotCXN0YXRpYyBjb25zdCBjaGFyICpsaXN0ID0gMDsKLQlzdGF0aWMgY2hhciAqKnBhdGggPSAoY2hhciAqKikwOwotCXN0YXRpYyBpbnQgZW5kID0gMDsKLQlzdGF0aWMgaW50IG51bXNpemUgPSBNQVhfU0VBUkNIX1BBVEhTOwotCXN0YXRpYyBjaGFyICoqdG1wOwotCS8qIFNvIHdlIGNhbiBjYWxsIFNETF9mcmVlKCkgaW4gdGhlICJkZXN0cnVjdG9yIiB3ZSB1c2UgaT0tMSB0byByZXR1cm4gdGhlIGFsbG9jJ2QgYXJyYXkgKi8KLQlpZiAoaSA9PSAtMSkKLQl7Ci0JCXJldHVybiAoY29uc3QgY2hhciopcGF0aDsKLQl9Ci0JaWYgKCFwYXRoKQotCXsKLQkJcGF0aCA9IChjaGFyICoqKVNETF9jYWxsb2MoTUFYX1NFQVJDSF9QQVRIUywgc2l6ZW9mKGNoYXIgKiopKTsKLQl9Ci0JaWYgKCFsaXN0ICYmICFlbmQpCi0JCWxpc3QgPSBzZWFyY2hMaXN0KCk7Ci0JaWYgKGkgPj0gKG51bXNpemUpKQotCXsKLQkJZGVidWcoIkluY3JlYXNpbmcgc2l6ZSBmb3IgbG9uZyBQQVRIIik7Ci0JCXRtcCA9IChjaGFyICoqKVNETF9jYWxsb2MoKE1BWF9TRUFSQ0hfUEFUSFMgKyBudW1zaXplKSwgc2l6ZW9mKGNoYXIgKiopKTsKLQkJaWYgKHRtcCkKLQkJewotCQkJU0RMX21lbWNweSh0bXAsIHBhdGgsIHNpemVvZihjaGFyICoqKSAqIG51bXNpemUpOwotCQkJU0RMX2ZyZWUocGF0aCk7Ci0JCQlwYXRoID0gdG1wOwotCQkJbnVtc2l6ZSArPSBNQVhfU0VBUkNIX1BBVEhTOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQl3aGlsZSAoIXBhdGhbaV0gJiYgIWVuZCkKLQl7Ci0JCXBhdGhbaV0gPSBzdHJzZXAoKGNoYXIgKiopJmxpc3QsICI6Iik7Ci0KLQkJaWYgKHBhdGhbaV1bMF0gPT0gMCkKLQkJCXBhdGhbaV0gPSAwOwotCQllbmQgPSAobGlzdCA9PSAwKTsKLQl9Ci0JcmV0dXJuIHBhdGhbaV07Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRGdWxsUGF0aChpbnQgaSwgY29uc3QgY2hhciAqZmlsZSkKLXsKLQlzdGF0aWMgY2hhciBidWZbUEFUSF9NQVhdOwotCWNvbnN0IGNoYXIgKnBhdGggPSBnZXRTZWFyY2hQYXRoKGkpOwotCWlmIChwYXRoKQotCXsKLQkJU0RMX3NucHJpbnRmKGJ1ZiwgUEFUSF9NQVgsICIlcy8lcyIsIHBhdGgsIGZpbGUpOwotCX0KLQlyZXR1cm4gcGF0aCA/IGJ1ZiA6IDA7Ci19Ci0KLS8qIEdpdmVuIGEgZmlsZSBuYW1lLCB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBmdWxsIHBhdGggZm9yIHRoYXQgZmlsZS4gU3RhcnRzCi0gKiBpdHMgc2VhcmNoIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIHRoZW4gdHJpZXMgYWxsIHBhdGhzIGluIHRoZSAKLSAqIHNlYXJjaCBsaXN0IGluIHRoZSBvcmRlciB0aGV5IGFyZSBzcGVjaWZpZWQgdGhlcmUuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhdCAqZmluZEZpbGUoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqKmZ1bGxQYXRoKQotewotCWludCBpID0gMDsKLQlzdGF0aWMgc3RydWN0IHN0YXQgc2J1ZjsKLQljaGFyICpmaWxlTmFtZTsKLQlkZWJ1ZygiZmluZGluZyBmaWxlICVzIiwgZmlsZSk7Ci0JKmZ1bGxQYXRoID0gZmlsZTsKLQlpZiAoMCA9PSBzdGF0KGZpbGUsICZzYnVmKSkKLQkJcmV0dXJuICZzYnVmOwotCWlmIChTRExfc3RyY2hyKGZpbGUsICcvJykpCi0JCXJldHVybiAwOwkJCQkvKiBJZiB0aGUgcGF0aCBoYWQgYSAvIHdlIGRvbid0IGxvb2sgaW4gZW52IHZhciBwbGFjZXMgKi8KLQlmaWxlTmFtZSA9IE5VTEw7Ci0JaWYgKCFmaWxlTmFtZSkKLQkJZmlsZU5hbWUgPSAoY2hhciAqKWZpbGU7Ci0Jd2hpbGUgKCgqZnVsbFBhdGggPSBnZXRGdWxsUGF0aChpKyssIGZpbGVOYW1lKSkpCi0JewotCQlpZiAoMCA9PSBzdGF0KCpmdWxsUGF0aCwgJnNidWYpKQotCQkJcmV0dXJuICZzYnVmOwotCX0KLQk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIERldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gZGxzdGF0dXMgaXMgdmFsaWQgb3Igbm90ICovCi1zdGF0aWMgaW50IGlzVmFsaWRTdGF0dXMoc3RydWN0IGRsc3RhdHVzICpzdGF0dXMpCi17Ci0JLyogV2FsayB0aGUgbGlzdCB0byB2ZXJpZnkgc3RhdHVzIGlzIGNvbnRhaW5lZCBpbiBpdCAqLwotCXN0cnVjdCBkbHN0YXR1cyAqZGxzID0gc3RxdWV1ZTsKLQl3aGlsZSAoZGxzICYmIHN0YXR1cyAhPSBkbHMpCi0JCWRscyA9IGRscy0+bmV4dDsKLQlpZiAoZGxzID09IDApCi0JCWVycm9yKCJpbnZhbGlkIGhhbmRsZSIpOwotCWVsc2UgaWYgKChkbHMtPm1vZHVsZSA9PSAwKSB8fCAoZGxzLT5yZWZzID09IDApKQotCQllcnJvcigiaGFuZGxlIHRvIGNsb3NlZCBsaWJyYXJ5Iik7Ci0JZWxzZQotCQlyZXR1cm4gVFJVRTsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlzRmxhZ1NldChpbnQgbW9kZSwgaW50IGZsYWcpCi17Ci0JcmV0dXJuIChtb2RlICYgZmxhZykgPT0gZmxhZzsKLX0KLQotc3RhdGljIHN0cnVjdCBkbHN0YXR1cyAqbG9va3VwU3RhdHVzKGNvbnN0IHN0cnVjdCBzdGF0ICpzYnVmKQotewotCXN0cnVjdCBkbHN0YXR1cyAqZGxzID0gc3RxdWV1ZTsKLQlkZWJ1ZygibG9va2luZyBmb3Igc3RhdHVzIik7Ci0Jd2hpbGUgKGRscyAmJiAoIC8qIGlzRmxhZ1NldChkbHMtPm1vZGUsIFJUTERfVU5TSEFSRUQpICovIDAKLQkJCQkgICB8fCBzYnVmLT5zdF9kZXYgIT0gZGxzLT5kZXZpY2UgfHwgc2J1Zi0+c3RfaW5vICE9IGRscy0+aW5vZGUpKQotCQlkbHMgPSBkbHMtPm5leHQ7Ci0JcmV0dXJuIGRsczsKLX0KLQotc3RhdGljIHZvaWQgaW5zZXJ0U3RhdHVzKHN0cnVjdCBkbHN0YXR1cyAqZGxzLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqc2J1ZikKLXsKLQlkZWJ1ZygiaW5zZXJ0aW5nIHN0YXR1cyIpOwotCWRscy0+aW5vZGUgPSBzYnVmLT5zdF9pbm87Ci0JZGxzLT5kZXZpY2UgPSBzYnVmLT5zdF9kZXY7Ci0JZGxzLT5yZWZzID0gMDsKLQlkbHMtPm1vZGUgPSAwOwotCWlmICgoZGxzLT5mbGFncyAmIERMX0lOX0xJU1QpID09IDApCi0JewotCQlkbHMtPm5leHQgPSBzdHF1ZXVlOwotCQlzdHF1ZXVlID0gZGxzOwotCQlkbHMtPmZsYWdzIHw9IERMX0lOX0xJU1Q7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGRsc3RhdHVzICphbGxvY1N0YXR1cygpCi17Ci0Jc3RydWN0IGRsc3RhdHVzICpkbHM7Ci0jaWZkZWYgUkVVU0VfU1RBVFVTCi0JZGxzID0gc3RxdWV1ZTsKLQl3aGlsZSAoZGxzICYmIGRscy0+bW9kdWxlKQotCQlkbHMgPSBkbHMtPm5leHQ7Ci0JaWYgKCFkbHMpCi0jZW5kaWYKLQkJZGxzID0gU0RMX2NhbGxvYyhzaXplb2YoKmRscyksMSk7Ci0JcmV0dXJuIGRsczsKLX0KLQotc3RhdGljIGludCBwcm9tb3RlTG9jYWxUb0dsb2JhbChzdHJ1Y3QgZGxzdGF0dXMgKmRscykKLXsKLQlzdGF0aWMgaW50ICgqcCkgKE5TTW9kdWxlIG1vZHVsZSkgPSAwOwotCWRlYnVnKCJwcm9tb3RpbmciKTsKLQlpZiAoIXApCi0JCV9keWxkX2Z1bmNfbG9va3VwKCJfX2R5bGRfTlNNYWtlUHJpdmF0ZU1vZHVsZVB1YmxpYyIsICh2b2lkICoqKSZwKTsKLQlyZXR1cm4gKGRscy0+bW9kdWxlID09IE1BR0lDX0RZTElCX01PRCkgfHwgKHAgJiYgcChkbHMtPm1vZHVsZSkpOwotfQotCi1zdGF0aWMgdm9pZCAqcmVmZXJlbmNlKHN0cnVjdCBkbHN0YXR1cyAqZGxzLCBpbnQgbW9kZSkKLXsKLQlpZiAoZGxzKQotCXsKLQkJaWYgKGRscy0+bW9kdWxlID09IE1BR0lDX0RZTElCX01PRCAmJiBpc0ZsYWdTZXQobW9kZSwgUlRMRF9MT0NBTCkpCi0JCXsKLQkJCXdhcm5pbmcoInRyeWluZyB0byBvcGVuIGEgLmR5bGliIHdpdGggUlRMRF9MT0NBTCIpOwotCQkJZXJyb3IoInVuYWJsZSB0byBvcGVuIGEgLmR5bGliIHdpdGggUlRMRF9MT0NBTCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGlzRmxhZ1NldChtb2RlLCBSVExEX0dMT0JBTCkgJiYKLQkJCSFpc0ZsYWdTZXQoZGxzLT5tb2RlLCBSVExEX0dMT0JBTCkgJiYgIXByb21vdGVMb2NhbFRvR2xvYmFsKGRscykpCi0JCXsKLQkJCWVycm9yKCJ1bmFibGUgdG8gcHJvbW90ZSBsb2NhbCBtb2R1bGUgdG8gZ2xvYmFsIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlkbHMtPm1vZGUgfD0gbW9kZTsKLQkJZGxzLT5yZWZzKys7Ci0JfQotCWVsc2UKLQkJZGVidWcoInJlZmVyZW5jZSBjYWxsZWQgd2l0aCBOVUxMIGFyZ3VtZW50Iik7Ci0KLQlyZXR1cm4gZGxzOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICpteV9maW5kX2ltYWdlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICptaCA9IDA7Ci0JY29uc3QgY2hhciAqaWQgPSBOVUxMOwotCWludCBpID0gX2R5bGRfaW1hZ2VfY291bnQoKTsKLQlpbnQgajsKLQltaCA9IChzdHJ1Y3QgbWFjaF9oZWFkZXIgKikKLQkJZHlsZF9OU0FkZEltYWdlKG5hbWUsIE5TQURESU1BR0VfT1BUSU9OX1JFVFVSTl9PTkxZX0lGX0xPQURFRCB8Ci0JCQkJCQlOU0FERElNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOwotCWlmICghbWgpCi0JewotCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQl7Ci0JCQlpZCA9IF9keWxkX2dldF9pbWFnZV9uYW1lKGopOwotCQkJaWYgKCFTRExfc3RyY21wKGlkLCBuYW1lKSkKLQkJCXsKLQkJCQltaCA9IF9keWxkX2dldF9pbWFnZV9oZWFkZXIoaik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIG1oOwotfQotCi0vKgotICogZHlsZCBhZGRzIGxpYnJhcmllcyBieSBmaXJzdCBhZGRpbmcgdGhlIGRpcmVjdGx5IGRlcGVuZGFudCBsaWJyYXJpZXMgaW4gbGluayBvcmRlciwgYW5kCi0gKiB0aGVuIGFkZGluZyB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aG9zZSBsaWJyYXJpZXMsIHNvIHdlIHNob3VsZCBkbyB0aGUgc2FtZS4uLiBidXQgd2UgZG9uJ3QKLSAqIGJvdGhlciBhZGRpbmcgdGhlIGV4dHJhIGRlcGVuZGVuY2llcywgaWYgdGhlIHN5bWJvbHMgYXJlIG5laXRoZXIgaW4gdGhlIGxvYWRlZCBpbWFnZSBub3IKLSAqIGFueSBvZiBpdCdzIGRpcmVjdCBkZXBlbmRlbmNpZXMsIHRoZW4gaXQgcHJvYmFibHkgaXNuJ3QgdGhlcmUuCi0gKi8KLXN0YXRpYyBOU1N5bWJvbCBzZWFyY2hfbGlua2VkX2xpYnMoY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICogbWgsIGNvbnN0IGNoYXIgKnN5bWJvbCkKLXsKLQl1bnNpZ25lZCBpbnQgbjsKLQlzdHJ1Y3QgbG9hZF9jb21tYW5kICpsYyA9IDA7Ci0Jc3RydWN0IG1hY2hfaGVhZGVyICp3aDsKLQlOU1N5bWJvbCBuc3N5bSA9IDA7Ci0JaWYgKGR5bGRfTlNBZGRJbWFnZSAmJiBkeWxkX05TSXNTeW1ib2xOYW1lRGVmaW5lZEluSW1hZ2UgJiYgZHlsZF9OU0xvb2t1cFN5bWJvbEluSW1hZ2UpCi0JewotCQlsYyA9IChzdHJ1Y3QgbG9hZF9jb21tYW5kICopKChjaGFyICopbWggKyBzaXplb2Yoc3RydWN0IG1hY2hfaGVhZGVyKSk7Ci0JCWZvciAobiA9IDA7IG4gPCBtaC0+bmNtZHM7IG4rKywgbGMgPSAoc3RydWN0IGxvYWRfY29tbWFuZCAqKSgoY2hhciAqKWxjICsgbGMtPmNtZHNpemUpKQotCQl7Ci0JCQlpZiAoKExDX0xPQURfRFlMSUIgPT0gbGMtPmNtZCkgfHwgKExDX0xPQURfV0VBS19EWUxJQiA9PSBsYy0+Y21kKSkKLQkJCXsKLQkJCQlpZiAoKHdoID0gKHN0cnVjdCBtYWNoX2hlYWRlciAqKQotCQkJCQkgbXlfZmluZF9pbWFnZSgoY2hhciAqKSgoKHN0cnVjdCBkeWxpYl9jb21tYW5kICopbGMpLT5keWxpYi5uYW1lLm9mZnNldCArCi0JCQkJCQkJCQkJCShjaGFyICopbGMpKSkpCi0JCQkJewotCQkJCQlpZiAoZHlsZF9OU0lzU3ltYm9sTmFtZURlZmluZWRJbkltYWdlKHdoLCBzeW1ib2wpKQotCQkJCQl7Ci0JCQkJCQluc3N5bSA9IGR5bGRfTlNMb29rdXBTeW1ib2xJbkltYWdlKHdoLAotCQkJCQkJCQkJCQkJCQkgICBzeW1ib2wsCi0JCQkJCQkJCQkJCQkJCSAgIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fQklORCB8Ci0JCQkJCQkJCQkJCQkJCSAgIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICgoIW5zc3ltKSAmJiBOU0lzU3ltYm9sTmFtZURlZmluZWQoc3ltYm9sKSkKLQkJewotCQkJLyogSSd2ZSBuZXZlciBzZWVuIHRoaXMgZGVidWcgbWVzc2FnZS4uLiovCi0JCQlkZWJ1ZygiU3ltYm9sIFwiJXNcIiBpcyBkZWZpbmVkIGJ1dCB3YXMgbm90IGZvdW5kIiwgc3ltYm9sKTsKLQkJfQotCX0KLQlyZXR1cm4gbnNzeW07Ci19Ci0KLS8qIFVwIHRvIHRoZSBjYWxsZXIgdG8gU0RMX2ZyZWUoKSByZXR1cm5lZCBzdHJpbmcgKi8KLXN0YXRpYyBpbmxpbmUgY2hhciAqZHlsZF9lcnJvcl9zdHIoKQotewotCU5TTGlua0VkaXRFcnJvcnMgZHlsZGVyOwotCWludCBkeWxkZXJubzsKLQljb25zdCBjaGFyICpkeWxkZXJyc3RyOwotCWNvbnN0IGNoYXIgKmR5bGRmaWxlOwotCWNoYXIqIHJldFN0ciA9IE5VTEw7Ci0JTlNMaW5rRWRpdEVycm9yKCZkeWxkZXIsICZkeWxkZXJubywgJmR5bGRmaWxlLCAmZHlsZGVycnN0cik7Ci0JaWYgKGR5bGRlcnJzdHIgJiYgKmR5bGRlcnJzdHIpCi0JewotCQlyZXRTdHIgPSBTRExfc3RyZHVwKGR5bGRlcnJzdHIpOwotCX0KLQlyZXR1cm4gcmV0U3RyOwotfQotCi1zdGF0aWMgdm9pZCAqZGxzeW1JbnRlcm4oc3RydWN0IGRsc3RhdHVzICpkbHMsIGNvbnN0IGNoYXIgKnN5bWJvbCwgaW50IGNhblNldEVycm9yKQotewotICBOU1N5bWJvbCBuc3N5bSA9IDA7Ci0jaWZkZWYgX19HQ0NfXyAgCi0Jdm9pZCAqY2FsbGVyID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDEpOwkvKiBCZSAqdmVyeSogY2FyZWZ1bCBhYm91dCBpbmxpbmluZyAqLwotI2Vsc2UKLQl2b2lkICpjYWxsZXIgPSBOVUxMOwotI2VuZGlmCi0JY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICpjYWxsZXJfbWggPSAwOwotCWNoYXIgKnNhdmVkRXJyb3JTdHIgPSBOVUxMOwotCXJlc2V0ZGxlcnJvcigpOwotI2lmbmRlZiBSVExEX1NFTEYKLSNkZWZpbmUJUlRMRF9TRUxGCQkoKHZvaWQgKikgLTMpCi0jZW5kaWYKLQlpZiAoTlVMTCA9PSBkbHMpCi0JCWRscyA9IFJUTERfU0VMRjsKLQlpZiAoKFJUTERfTkVYVCA9PSBkbHMpIHx8IChSVExEX1NFTEYgPT0gZGxzKSkKLQl7Ci0JCWlmIChkeWxkX05TSXNTeW1ib2xOYW1lRGVmaW5lZEluSW1hZ2UgJiYgZHlsZF9OU0xvb2t1cFN5bWJvbEluSW1hZ2UgJiYgY2FsbGVyKQotCQkgIHsKLQkJCWNhbGxlcl9taCA9IGltYWdlX2Zvcl9hZGRyZXNzKGNhbGxlcik7Ci0JCQlpZiAoUlRMRF9TRUxGID09IGRscykKLQkJCXsKLQkJCQkvKiBGSVhNRTogV2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBOU01vZHVsZSBhcGksIGlmIFNFTEYgaXMgYW4gTUhfQlVORExFCi0JCQkJICogQnV0IGl0IGFwcGVhcnMgdG8gd29yayBhbnl3YXksIGFuZCBsb29raW5nIGF0IHRoZSBjb2RlIGluIGR5bGRfbGliZnVuY3MuYwotCQkJCSAqIHRoaXMgaXMgYWNjZXB0YWJsZS4KLQkJCQkgKi8KLQkJCQlpZiAoZHlsZF9OU0lzU3ltYm9sTmFtZURlZmluZWRJbkltYWdlKGNhbGxlcl9taCwgc3ltYm9sKSkKLQkJCQl7Ci0JCQkJCW5zc3ltID0gZHlsZF9OU0xvb2t1cFN5bWJvbEluSW1hZ2UoY2FsbGVyX21oLAotCQkJCQkJCQkJCQkJCSAgIHN5bWJvbCwKLQkJCQkJCQkJCQkJCQkgICBOU0xPT0tVUFNZTUJPTElOSU1BR0VfT1BUSU9OX0JJTkQgfAotCQkJCQkJCQkJCQkJCSAgIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW5zc3ltKQotCQkJewotCQkJCWlmIChSVExEX1NFTEYgPT0gZGxzKQotCQkJCQlzYXZlZEVycm9yU3RyID0gZHlsZF9lcnJvcl9zdHIoKTsKLQkJCQluc3N5bSA9IHNlYXJjaF9saW5rZWRfbGlicyhjYWxsZXJfbWgsIHN5bWJvbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoY2FuU2V0RXJyb3IpCi0JCQkJZXJyb3IoIlJUTERfU0VMRiBhbmQgUlRMRF9ORVhUIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlpZiAoIW5zc3ltKQotCXsKLQotCQlpZiAoUlRMRF9ERUZBVUxUID09IGRscykKLQkJewotCQkJZGxzID0gJm1haW5TdGF0dXM7Ci0JCX0KLQkJaWYgKCFpc1ZhbGlkU3RhdHVzKGRscykpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQlpZiAoZGxzLT5tb2R1bGUgIT0gTUFHSUNfRFlMSUJfTU9EKQotCQl7Ci0JCQluc3N5bSA9IE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUoZGxzLT5tb2R1bGUsIHN5bWJvbCk7Ci0JCQlpZiAoIW5zc3ltICYmIE5TSXNTeW1ib2xOYW1lRGVmaW5lZChzeW1ib2wpKQotCQkJewotCQkJCWRlYnVnKCJTZWFyY2hpbmcgZGVwZW5kZW5jaWVzIik7Ci0JCQkJc2F2ZWRFcnJvclN0ciA9IGR5bGRfZXJyb3Jfc3RyKCk7Ci0JCQkJbnNzeW0gPSBzZWFyY2hfbGlua2VkX2xpYnMoZ2V0X21hY2hfaGVhZGVyX2Zyb21fTlNNb2R1bGUoZGxzLT5tb2R1bGUpLCBzeW1ib2wpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGRscy0+bGliICYmIGR5bGRfTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSAmJiBkeWxkX05TTG9va3VwU3ltYm9sSW5JbWFnZSkKLQkJewotCQkJaWYgKGR5bGRfTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZShkbHMtPmxpYiwgc3ltYm9sKSkKLQkJCXsKLQkJCQluc3N5bSA9IGR5bGRfTlNMb29rdXBTeW1ib2xJbkltYWdlKGRscy0+bGliLAotCQkJCQkJCQkJCQkJICAgc3ltYm9sLAotCQkJCQkJCQkJCQkJICAgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9CSU5EIHwKLQkJCQkJCQkJCQkJCSAgIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SKTsKLQkJCX0KLQkJCWVsc2UgaWYgKE5TSXNTeW1ib2xOYW1lRGVmaW5lZChzeW1ib2wpKQotCQkJewotCQkJCWRlYnVnKCJTZWFyY2hpbmcgZGVwZW5kZW5jaWVzIik7Ci0JCQkJc2F2ZWRFcnJvclN0ciA9IGR5bGRfZXJyb3Jfc3RyKCk7Ci0JCQkJbnNzeW0gPSBzZWFyY2hfbGlua2VkX2xpYnMoZGxzLT5saWIsIHN5bWJvbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZGxzLT5tb2R1bGUgPT0gTUFHSUNfRFlMSUJfTU9EKQotCQl7Ci0JCQkvKiBHbG9iYWwgY29udGV4dCwgdXNlIE5TTG9va3VwQW5kQmluZFN5bWJvbCAqLwotCQkJaWYgKE5TSXNTeW1ib2xOYW1lRGVmaW5lZChzeW1ib2wpKQotCQkJewotCQkJCS8qIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHJldHVybiBvbiBlcnJvciBvcHRpb24gZm9yIHRoaXMgY2FsbD8/PwotCQkJCSAgIHRoaXMgaXMgcG90ZW50aWFsbHkgYnJva2VuLCBpZiBiaW5kaW5nIGZhaWxzLCBpdCB3aWxsIGltcHJvcGVybHkKLQkJCQkgICBleGl0IHRoZSBhcHBsaWNhdGlvbi4gKi8KLQkJCQluc3N5bSA9IE5TTG9va3VwQW5kQmluZFN5bWJvbChzeW1ib2wpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChzYXZlZEVycm9yU3RyKQotCQkJCQlTRExfZnJlZShzYXZlZEVycm9yU3RyKTsJCQkKLQkJCQlzYXZlZEVycm9yU3RyID0gU0RMX21hbGxvYygyNTYpOwotCQkJCVNETF9zbnByaW50ZihzYXZlZEVycm9yU3RyLCAyNTYsICJTeW1ib2wgXCIlc1wiIG5vdCBpbiBnbG9iYWwgY29udGV4dCIsc3ltYm9sKTsJCi0JCQl9Ci0JCX0KLQl9Ci0JLyogRXJyb3IgcmVwb3J0aW5nICovCi0JaWYgKCFuc3N5bSkKLQl7Ci0JCWlmICghc2F2ZWRFcnJvclN0ciB8fCAhU0RMX3N0cmxlbihzYXZlZEVycm9yU3RyKSkKLQkJewotCQkJaWYgKHNhdmVkRXJyb3JTdHIpCi0JCQkJU0RMX2ZyZWUoc2F2ZWRFcnJvclN0cik7Ci0JCQlzYXZlZEVycm9yU3RyID0gU0RMX21hbGxvYygyNTYpOwotCQkJU0RMX3NucHJpbnRmKHNhdmVkRXJyb3JTdHIsIDI1NiwiU3ltYm9sIFwiJXNcIiBub3QgZm91bmQiLHN5bWJvbCk7Ci0JCX0KLQkJaWYgKGNhblNldEVycm9yKQotCQl7Ci0JCQllcnJvcihzYXZlZEVycm9yU3RyKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWRlYnVnKHNhdmVkRXJyb3JTdHIpOwotCQl9Ci0JCWlmIChzYXZlZEVycm9yU3RyKQotCQkJU0RMX2ZyZWUoc2F2ZWRFcnJvclN0cik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gTlNBZGRyZXNzT2ZTeW1ib2wobnNzeW0pOwotfQotCi1zdGF0aWMgc3RydWN0IGRsc3RhdHVzICpsb2FkTW9kdWxlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHN0cnVjdCBzdGF0ICpzYnVmLCBpbnQgbW9kZSkKLXsKLQlOU09iamVjdEZpbGVJbWFnZSBvZmkgPSAwOwotCU5TT2JqZWN0RmlsZUltYWdlUmV0dXJuQ29kZSBvZmlyYzsKLQlzdHJ1Y3QgZGxzdGF0dXMgKmRsczsKLQlOU0xpbmtFZGl0RXJyb3JzIGxlcjsKLQlpbnQgbGVybm87Ci0JY29uc3QgY2hhciAqZXJyc3RyOwotCWNvbnN0IGNoYXIgKmZpbGU7Ci0Jdm9pZCAoKmluaXQpICh2b2lkKTsKLQotCW9maXJjID0gTlNDcmVhdGVPYmplY3RGaWxlSW1hZ2VGcm9tRmlsZShwYXRoLCAmb2ZpKTsKLQlzd2l0Y2ggKG9maXJjKQotCXsKLQkJY2FzZSBOU09iamVjdEZpbGVJbWFnZVN1Y2Nlc3M6Ci0JCQlicmVhazsKLQkJY2FzZSBOU09iamVjdEZpbGVJbWFnZUluYXBwcm9wcmlhdGVGaWxlOgotCQkJaWYgKGR5bGRfTlNBZGRJbWFnZSAmJiBkeWxkX05TSXNTeW1ib2xOYW1lRGVmaW5lZEluSW1hZ2UgJiYgZHlsZF9OU0xvb2t1cFN5bWJvbEluSW1hZ2UpCi0JCQl7CQotCQkJCWlmIChpc0ZsYWdTZXQobW9kZSwgUlRMRF9MT0NBTCkpCi0JCQkJewotCQkJCQl3YXJuaW5nKCJ0cnlpbmcgdG8gb3BlbiBhIC5keWxpYiB3aXRoIFJUTERfTE9DQUwiKTsKLQkJCQkJZXJyb3IoInVuYWJsZSB0byBvcGVuIHRoaXMgZmlsZSB3aXRoIFJUTERfTE9DQUwiKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWVycm9yKCJvcGVuaW5nIHRoaXMgZmlsZSBpcyB1bnN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VGYWlsdXJlOgotCQkJZXJyb3IoIm9iamVjdCBmaWxlIHNldHVwIGZhaWx1cmUiKTsKLQkJCXJldHVybiBOVUxMOwotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlQXJjaDoKLQkJCWVycm9yKCJubyBvYmplY3QgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJY2FzZSBOU09iamVjdEZpbGVJbWFnZUZvcm1hdDoKLQkJCWVycm9yKCJiYWQgb2JqZWN0IGZpbGUgZm9ybWF0Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJY2FzZSBOU09iamVjdEZpbGVJbWFnZUFjY2VzczoKLQkJCWVycm9yKCJjYW4ndCByZWFkIG9iamVjdCBmaWxlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJZGVmYXVsdDoKLQkJCWVycm9yKCJ1bmtub3duIGVycm9yIGZyb20gTlNDcmVhdGVPYmplY3RGaWxlSW1hZ2VGcm9tRmlsZSgpIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGxzID0gbG9va3VwU3RhdHVzKHNidWYpOwotCWlmICghZGxzKQotCXsKLQkJZGxzID0gYWxsb2NTdGF0dXMoKTsKLQl9Ci0JaWYgKCFkbHMpCi0JewotCQllcnJvcigidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLy8JZGxzLT5saWIgPSAwOwotCWlmIChvZmlyYyA9PSBOU09iamVjdEZpbGVJbWFnZUluYXBwcm9wcmlhdGVGaWxlKQotCXsKLQkJaWYgKChkbHMtPmxpYiA9IGR5bGRfTlNBZGRJbWFnZShwYXRoLCBOU0FERElNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpKSkKLQkJewotCQkJZGVidWcoIkR5bmFtaWMgbGliIGxvYWRlZCBhdCAlbGQiLCBkbHMtPmxpYik7Ci0JCQlvZmkgPSBNQUdJQ19EWUxJQl9PRkk7Ci0JCQlkbHMtPm1vZHVsZSA9IE1BR0lDX0RZTElCX01PRDsKLQkJCW9maXJjID0gTlNPYmplY3RGaWxlSW1hZ2VTdWNjZXNzOwotCQkJLyogQWx0aG91Z2ggaXQgaXMgcG9zc2libGUgd2l0aCBhIGJpdCBvZiB3b3JrIHRvIG1vZGlmeSB0aGlzIHNvIGl0IHdvcmtzIGFuZAotCQkJICAgZnVuY3Rpb25zIHdpdGggUlRMRF9OT1csIEkgZG9uJ3QgZGVlbSBpdCBuZWNlc3NhcnkgYXQgdGhlIG1vbWVudCAqLwotCQl9Ci0JCWlmICghKGRscy0+bW9kdWxlKSkKLQkJewotCQkJTlNMaW5rRWRpdEVycm9yKCZsZXIsICZsZXJubywgJmZpbGUsICZlcnJzdHIpOwotCQkJaWYgKCFlcnJzdHIgfHwgKCFTRExfc3RybGVuKGVycnN0cikpKQotCQkJCWVycm9yKCJDYW4ndCBvcGVuIHRoaXMgZmlsZSB0eXBlIik7Ci0JCQllbHNlCi0JCQkJZXJyb3IoZXJyc3RyKTsKLQkJCWlmICgoZGxzLT5mbGFncyAmIERMX0lOX0xJU1QpID09IDApCi0JCQl7Ci0JCQkJU0RMX2ZyZWUoZGxzKTsKLQkJCX0KLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWRscy0+bW9kdWxlID0gTlNMaW5rTW9kdWxlKG9maSwgcGF0aCwKLQkJCQkJCQkJICAgTlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IgfAotCQkJCQkJCQkgICBOU0xJTktNT0RVTEVfT1BUSU9OX1BSSVZBVEUgfAotCQkJCQkJCQkgICAoaXNGbGFnU2V0KG1vZGUsIFJUTERfTk9XKSA/IE5TTElOS01PRFVMRV9PUFRJT05fQklORE5PVyA6IDApKTsKLQkJTlNEZXN0cm95T2JqZWN0RmlsZUltYWdlKG9maSk7Ci0JCWlmIChkbHMtPm1vZHVsZSkKLQkJewotCQkJZGxzLT5saWIgPSBnZXRfbWFjaF9oZWFkZXJfZnJvbV9OU01vZHVsZShkbHMtPm1vZHVsZSk7Ci0JCX0KLQl9Ci0JaWYgKCFkbHMtPm1vZHVsZSkKLQl7Ci0JCU5TTGlua0VkaXRFcnJvcigmbGVyLCAmbGVybm8sICZmaWxlLCAmZXJyc3RyKTsKLQkJaWYgKChkbHMtPmZsYWdzICYgRExfSU5fTElTVCkgPT0gMCkKLQkJewotCQkJU0RMX2ZyZWUoZGxzKTsKLQkJfQotCQllcnJvcihlcnJzdHIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpbnNlcnRTdGF0dXMoZGxzLCBzYnVmKTsKLQlkbHMgPSByZWZlcmVuY2UoZGxzLCBtb2RlKTsKLQlpZiAoKGluaXQgPSBkbHN5bUludGVybihkbHMsICJfX2luaXQiLCAwKSkpCi0JewotCQlkZWJ1ZygiY2FsbGluZyBfaW5pdCgpIik7Ci0JCWluaXQoKTsKLQl9Ci0JcmV0dXJuIGRsczsKLX0KLQotaW5saW5lIHN0YXRpYyB2b2lkIGRsY29tcGF0X2luaXRfY2hlY2sodm9pZCkKLXsKLQlzdGF0aWMgcHRocmVhZF9tdXRleF90IGwgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotCXN0YXRpYyBpbnQgaW5pdF9kb25lID0gMDsKLQotCXB0aHJlYWRfbXV0ZXhfbG9jaygmbCk7Ci0JaWYgKCFpbml0X2RvbmUpIHsKLQkJZGxjb21wYXRfaW5pdF9mdW5jKCk7Ci0JCWluaXRfZG9uZSA9IDE7Ci0JfQotCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsKTsKLX0KLQotc3RhdGljIHZvaWQgZGxjb21wYXRfaW5pdF9mdW5jKHZvaWQpCi17Ci0gICAgICAgIF9keWxkX2Z1bmNfbG9va3VwKCJfX2R5bGRfTlNBZGRJbWFnZSIsICh2b2lkICoqKSZkeWxkX05TQWRkSW1hZ2UpOwotCV9keWxkX2Z1bmNfbG9va3VwKCJfX2R5bGRfTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSIsCi0JCQkgICh2b2lkICoqKSZkeWxkX05TSXNTeW1ib2xOYW1lRGVmaW5lZEluSW1hZ2UpOwotCV9keWxkX2Z1bmNfbG9va3VwKCJfX2R5bGRfTlNMb29rdXBTeW1ib2xJbkltYWdlIiwgKHZvaWQgKiopJmR5bGRfTlNMb29rdXBTeW1ib2xJbkltYWdlKTsKLQlpZiAocHRocmVhZF9tdXRleF9pbml0KCZkbGNvbXBhdF9tdXRleCwgTlVMTCkpCi0JICAgIGV4aXQoMSk7Ci0JaWYgKHB0aHJlYWRfa2V5X2NyZWF0ZSgmZGxlcnJvcl9rZXksICZkbGVycm9yZnJlZSkpCi0JICAgIGV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc2V0ZGxlcnJvcigpCi17Ci0Jc3RydWN0IGRsdGhyZWFkICp0c3M7Ci0JdHNzID0gcHRocmVhZF9nZXRzcGVjaWZpYyhkbGVycm9yX2tleSk7Ci0JdHNzLT5lcnJzZXQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBkbGVycm9yZnJlZSh2b2lkICpkYXRhKQotewotCVNETF9mcmVlKGRhdGEpOwotfQotCi0vKiBXZSBraW5kIG9mIHdhbnQgYSByZWN1cnNpdmUgbG9jayBoZXJlLCBidXQgbWVldCBhIGxpdHRsZSB0cm91YmxlCi0gKiBiZWNhdXNlIHRoZXkgYXJlIG5vdCBhdmFpbGFibGUgcHJlIE9TIFggMTAuMiwgc28gd2UgZmFrZSBpdAotICogdXNpbmcgdGhyZWFkIHNwZWNpZmljIHN0b3JhZ2UgdG8ga2VlcCBhIGxvY2sgY291bnQKLSAqLyAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkb2xvY2sodm9pZCkKLXsKLQlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgZGx0aHJlYWQgKnRzczsKLQlkbGNvbXBhdF9pbml0X2NoZWNrKCk7Ci0JdHNzID0gcHRocmVhZF9nZXRzcGVjaWZpYyhkbGVycm9yX2tleSk7Ci0JaWYgKCF0c3MpCi0JewotCQl0c3MgPSBTRExfbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGx0aHJlYWQpKTsKLQkJdHNzLT5sb2NrY250ID0gMDsKLQkJdHNzLT5lcnJzZXQgPSAwOwotCQlpZiAocHRocmVhZF9zZXRzcGVjaWZpYyhkbGVycm9yX2tleSwgdHNzKSkKLQkJewotCQkJZnByaW50ZihzdGRlcnIsImRsY29tcGF0OiBwdGhyZWFkX3NldHNwZWNpZmljIGZhaWxlZFxuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfQotCWlmICghdHNzLT5sb2NrY250KQotCQllcnIgPSBwdGhyZWFkX211dGV4X2xvY2soJmRsY29tcGF0X211dGV4KTsKLQl0c3MtPmxvY2tjbnQgPSB0c3MtPmxvY2tjbnQgKzE7CQotCWlmIChlcnIpCi0JCWV4aXQoZXJyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRvdW5sb2NrKHZvaWQpCi17Ci0JaW50IGVyciA9IDA7Ci0Jc3RydWN0IGRsdGhyZWFkICp0c3M7Ci0JdHNzID0gcHRocmVhZF9nZXRzcGVjaWZpYyhkbGVycm9yX2tleSk7Ci0JdHNzLT5sb2NrY250ID0gdHNzLT5sb2NrY250IC0xOwotCWlmICghdHNzLT5sb2NrY250KQotCQllcnIgPSBwdGhyZWFkX211dGV4X3VubG9jaygmZGxjb21wYXRfbXV0ZXgpOwotCWlmIChlcnIpCi0JCWV4aXQoZXJyKTsKLX0KLQotc3RhdGljIHZvaWQgKlNETF9PU1hfZGxvcGVuKGNvbnN0IGNoYXIgKnBhdGgsIGludCBtb2RlKQotewotCWNvbnN0IHN0cnVjdCBzdGF0ICpzYnVmOwotCXN0cnVjdCBkbHN0YXR1cyAqZGxzOwotCWNvbnN0IGNoYXIgKmZ1bGxQYXRoOwotCi0JZG9sb2NrKCk7Ci0JcmVzZXRkbGVycm9yKCk7Ci0JaWYgKCFwYXRoKQotCXsKLQkJZGxzID0gJm1haW5TdGF0dXM7Ci0JCWdvdG8gZGxvcGVub2s7Ci0JfQotCWlmICghKHNidWYgPSBmaW5kRmlsZShwYXRoLCAmZnVsbFBhdGgpKSkKLQl7Ci0JCWVycm9yKCJmaWxlIFwiJXNcIiBub3QgZm91bmQiLCBwYXRoKTsKLQkJZ290byBkbG9wZW5lcnJvcjsKLQl9Ci0JLyogTm93IGNoZWNrcyB0aGF0IGl0IGhhc24ndCBiZWVuIGNsb3NlZCBhbHJlYWR5ICovCi0JaWYgKChkbHMgPSBsb29rdXBTdGF0dXMoc2J1ZikpICYmIChkbHMtPnJlZnMgPiAwKSkKLQl7Ci0JCS8qIGRlYnVnKCJzdGF0dXMgZm91bmQiKTsgKi8KLQkJZGxzID0gcmVmZXJlbmNlKGRscywgbW9kZSk7Ci0JCWdvdG8gZGxvcGVub2s7Ci0JfQotI2lmZGVmIAlSVExEX05PTE9BRAotCWlmIChpc0ZsYWdTZXQobW9kZSwgUlRMRF9OT0xPQUQpKQotCXsKLQkJZXJyb3IoIm5vIGV4aXN0aW5nIGhhbmRsZSBhbmQgUlRMRF9OT0xPQUQgc3BlY2lmaWVkIik7Ci0JCWdvdG8gZGxvcGVuZXJyb3I7Ci0JfQotI2VuZGlmCi0JaWYgKGlzRmxhZ1NldChtb2RlLCBSVExEX0xBWlkpICYmIGlzRmxhZ1NldChtb2RlLCBSVExEX05PVykpCi0JewotCQllcnJvcigiaG93IGNhbiBJIGxvYWQgc29tZXRoaW5nIGJvdGggUlRMRF9MQVpZIGFuZCBSVExEX05PVz8iKTsKLQkJZ290byBkbG9wZW5lcnJvcjsKLQl9Ci0JZGxzID0gbG9hZE1vZHVsZShmdWxsUGF0aCwgc2J1ZiwgbW9kZSk7Ci0JCi0gIGRsb3Blbm9rOgotCWRvdW5sb2NrKCk7Ci0JcmV0dXJuICh2b2lkICopZGxzOwotICBkbG9wZW5lcnJvcjoKLQlkb3VubG9jaygpOwotCXJldHVybiBOVUxMOwotfQotCi0jaWYgIUZJTktfQlVJTEQKLXN0YXRpYyB2b2lkICpTRExfT1NYX2Rsc3ltKHZvaWQgKiBkbF9yZXN0cmljdCBoYW5kbGUsIGNvbnN0IGNoYXIgKiBkbF9yZXN0cmljdCBzeW1ib2wpCi17Ci0JaW50IHN5bV9sZW4gPSBTRExfc3RybGVuKHN5bWJvbCk7Ci0Jdm9pZCAqdmFsdWUgPSBOVUxMOwotCWNoYXIgKm1hbGxvY19zeW0gPSBOVUxMOwotCWRvbG9jaygpOwotCW1hbGxvY19zeW0gPSBTRExfbWFsbG9jKHN5bV9sZW4gKyAyKTsKLQlpZiAobWFsbG9jX3N5bSkKLQl7Ci0JCVNETF9zbnByaW50ZihtYWxsb2Nfc3ltLCBzeW1fbGVuKzIsICJfJXMiLCBzeW1ib2wpOwotCQl2YWx1ZSA9IGRsc3ltSW50ZXJuKGhhbmRsZSwgbWFsbG9jX3N5bSwgMSk7Ci0JCVNETF9mcmVlKG1hbGxvY19zeW0pOwotCX0KLQllbHNlCi0JewotCQllcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOwotCQlnb3RvIGRsc3ltZXJyb3I7Ci0JfQotCWRvdW5sb2NrKCk7Ci0JcmV0dXJuIHZhbHVlOwotICBkbHN5bWVycm9yOgotCWRvdW5sb2NrKCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotI2lmIEZJTktfQlVJTEQKLQotc3RhdGljIHZvaWQgKmRsc3ltX3ByZXBlbmRfdW5kZXJzY29yZSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN5bWJvbCkKLXsKLQl2b2lkICphbnN3ZXI7Ci0JZG9sb2NrKCk7Ci0JYW5zd2VyID0gZGxzeW1fcHJlcGVuZF91bmRlcnNjb3JlX2ludGVybihoYW5kbGUsIHN5bWJvbCk7Ci0JZG91bmxvY2soKTsKLQlyZXR1cm4gYW5zd2VyOwotfQotCi1zdGF0aWMgdm9pZCAqZGxzeW1fcHJlcGVuZF91bmRlcnNjb3JlX2ludGVybih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN5bWJvbCkKLXsKLS8qCi0gKglBIHF1aWNrIGFuZCBlYXN5IHdheSBmb3IgcG9ydGluZyBwYWNrYWdlcyB3aGljaCBjYWxsIGRsc3ltKGhhbmRsZSwic3ltIikKLSAqCUlmIHRoZSBwb3J0ZXIgYWRkcyAtRGRsc3ltPWRsc3ltX3ByZXBlbmRfdW5kZXJzY29yZSB0byB0aGUgQ0ZMQUdTIHRoZW4KLSAqCXRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQsIGFuZCB3aWxsIGFkZCB0aGUgcmVxdWlyZWQgdW5kZXJzY29yZS4KLSAqCQotICoJTm90ZSB0aGF0IEkgaGF2ZW4ndCBmaWd1cmVkIG91dCB5ZXQgd2hpY2ggc2hvdWxkIGJlICJzdGFuZGFyZCIsIHByZXBlbmQKLSAqCXRoZSB1bmRlcnNjb3JlIGFsd2F5cywgb3Igbm90IGF0IGFsbC4gVGhlc2UgZ2xvYmFsIGZ1bmN0aW9ucyBuZWVkIHRvIGdvIGF3YXkKLSAqCWZvciBvcGVuZGFyd2luLgotICovCi0JaW50IHN5bV9sZW4gPSBTRExfc3RybGVuKHN5bWJvbCk7Ci0Jdm9pZCAqdmFsdWUgPSBOVUxMOwotCWNoYXIgKm1hbGxvY19zeW0gPSBOVUxMOwotCW1hbGxvY19zeW0gPSBTRExfbWFsbG9jKHN5bV9sZW4gKyAyKTsKLQlpZiAobWFsbG9jX3N5bSkKLQl7Ci0JCVNETF9zbnByaW50ZihtYWxsb2Nfc3ltLCBzeW1fbGVuKzIsICJfJXMiLCBzeW1ib2wpOwotCQl2YWx1ZSA9IGRsc3ltSW50ZXJuKGhhbmRsZSwgbWFsbG9jX3N5bSwgMSk7Ci0JCVNETF9mcmVlKG1hbGxvY19zeW0pOwotCX0KLQllbHNlCi0JewotCQllcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOwotCX0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkICpkbHN5bV9hdXRvX3VuZGVyc2NvcmUodm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpzeW1ib2wpCi17Ci0Jdm9pZCAqYW5zd2VyOwotCWRvbG9jaygpOwotCWFuc3dlciA9IGRsc3ltX2F1dG9fdW5kZXJzY29yZV9pbnRlcm4oaGFuZGxlLCBzeW1ib2wpOwotCWRvdW5sb2NrKCk7Ci0JcmV0dXJuIGFuc3dlcjsKLQotfQotc3RhdGljIHZvaWQgKmRsc3ltX2F1dG9fdW5kZXJzY29yZV9pbnRlcm4odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpzeW1ib2wpCi17Ci0Jc3RydWN0IGRsc3RhdHVzICpkbHMgPSBoYW5kbGU7Ci0Jdm9pZCAqYWRkciA9IDA7Ci0JYWRkciA9IGRsc3ltSW50ZXJuKGRscywgc3ltYm9sLCAwKTsKLQlpZiAoIWFkZHIpCi0JCWFkZHIgPSBkbHN5bV9wcmVwZW5kX3VuZGVyc2NvcmVfaW50ZXJuKGhhbmRsZSwgc3ltYm9sKTsKLQlyZXR1cm4gYWRkcjsKLX0KLQotCi1zdGF0aWMgdm9pZCAqU0RMX09TWF9kbHN5bSh2b2lkICogZGxfcmVzdHJpY3QgaGFuZGxlLCBjb25zdCBjaGFyICogZGxfcmVzdHJpY3Qgc3ltYm9sKQotewotCXN0cnVjdCBkbHN0YXR1cyAqZGxzID0gaGFuZGxlOwotCXZvaWQgKmFkZHIgPSAwOwotCWRvbG9jaygpOwotCWFkZHIgPSBkbHN5bUludGVybihkbHMsIHN5bWJvbCwgMSk7Ci0JZG91bmxvY2soKTsKLQlyZXR1cm4gYWRkcjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IFNETF9PU1hfZGxjbG9zZSh2b2lkICpoYW5kbGUpCi17Ci0Jc3RydWN0IGRsc3RhdHVzICpkbHMgPSBoYW5kbGU7Ci0JZG9sb2NrKCk7Ci0JcmVzZXRkbGVycm9yKCk7Ci0JaWYgKCFpc1ZhbGlkU3RhdHVzKGRscykpCi0JewotCQlnb3RvIGRsY2xvc2VlcnJvcjsKLQl9Ci0JaWYgKGRscy0+bW9kdWxlID09IE1BR0lDX0RZTElCX01PRCkKLQl7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0JCWlmICghZGxzLT5saWIpCi0JCXsKLQkJCW5hbWUgPSAiZ2xvYmFsIGNvbnRleHQiOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbmFtZSA9IGdldF9saWJfbmFtZShkbHMtPmxpYik7Ci0JCX0KLQkJd2FybmluZygidHJ5aW5nIHRvIGNsb3NlIGEgLmR5bGliISIpOwotCQllcnJvcigiTm90IGNsb3NpbmcgXCIlc1wiIC0gZHluYW1pYyBsaWJyYXJpZXMgY2Fubm90IGJlIGNsb3NlZCIsIG5hbWUpOwotCQlnb3RvIGRsY2xvc2VlcnJvcjsKLQl9Ci0JaWYgKCFkbHMtPm1vZHVsZSkKLQl7Ci0JCWVycm9yKCJtb2R1bGUgYWxyZWFkeSBjbG9zZWQiKTsKLQkJZ290byBkbGNsb3NlZXJyb3I7Ci0JfQotCQotCWlmIChkbHMtPnJlZnMgPT0gMSkKLQl7Ci0JCXVuc2lnbmVkIGxvbmcgb3B0aW9ucyA9IDA7Ci0JCXZvaWQgKCpmaW5pKSAodm9pZCk7Ci0JCWlmICgoZmluaSA9IGRsc3ltSW50ZXJuKGRscywgIl9fZmluaSIsIDApKSkKLQkJewotCQkJZGVidWcoImNhbGxpbmcgX2ZpbmkoKSIpOwotCQkJZmluaSgpOwotCQl9Ci0JCW9wdGlvbnMgfD0gTlNVTkxJTktNT0RVTEVfT1BUSU9OX1JFU0VUX0xBWllfUkVGRVJFTkNFUzsKLSNpZmRlZiBSVExEX05PREVMRVRFCi0JCWlmIChpc0ZsYWdTZXQoZGxzLT5tb2RlLCBSVExEX05PREVMRVRFKSkKLQkJCW9wdGlvbnMgfD0gTlNVTkxJTktNT0RVTEVfT1BUSU9OX0tFRVBfTUVNT1JZX01BUFBFRDsKLSNlbmRpZgotCQlpZiAoIU5TVW5MaW5rTW9kdWxlKGRscy0+bW9kdWxlLCBvcHRpb25zKSkKLQkJewotCQkJZXJyb3IoInVuYWJsZSB0byB1bmxpbmsgbW9kdWxlIik7Ci0JCQlnb3RvIGRsY2xvc2VlcnJvcjsKLQkJfQotCQlkbHMtPnJlZnMtLTsKLQkJZGxzLT5tb2R1bGUgPSAwOwotCQkvKiBOb3RlOiB0aGUgZGxzdGF0dXMgc3RydWN0IGRscyBpcyBuZWl0aGVyIHJlbW92ZWQgZnJvbSB0aGUgbGlzdAotCQkgKiBub3IgaXMgdGhlIG1lbW9yeSBpdCBvY2N1cGllcyBmcmVlZC4gVGhpcyBzaG91bGRuJ3QgcG9zZSBhIAotCQkgKiBwcm9ibGVtIGluIG1vc3RseSBhbGwgY2FzZXMsIHRob3VnaC4KLQkJICovCi0JfQotCWRvdW5sb2NrKCk7Ci0JcmV0dXJuIDA7Ci0gIGRsY2xvc2VlcnJvcjoKLQlkb3VubG9jaygpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqU0RMX09TWF9kbGVycm9yKHZvaWQpCi17Ci0Jc3RydWN0IGRsdGhyZWFkICAqdHNzOwotCWNvbnN0IGNoYXIgKiBlcnJfc3RyID0gTlVMTDsKLQlkbGNvbXBhdF9pbml0X2NoZWNrKCk7Ci0JdHNzID0gcHRocmVhZF9nZXRzcGVjaWZpYyhkbGVycm9yX2tleSk7Ci0JaWYgKHRzcyAhPSBOVUxMICYmIHRzcy0+ZXJyc2V0ICE9IDApIHsKLQkJdHNzLT5lcnJzZXQgPSAwOwkKLQkJZXJyX3N0ciA9IHRzcy0+ZXJyc3RyOwotCX0KLQlyZXR1cm4gKGVycl9zdHIpOwotfQotCi0vKiBHaXZlbiBhbiBhZGRyZXNzLCByZXR1cm4gdGhlIG1hY2hfaGVhZGVyIGZvciB0aGUgaW1hZ2UgY29udGFpbmluZyBpdAotICogb3IgemVybyBpZiB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBub3QgY29udGFpbmVkIGluIGFueSBsb2FkZWQgaW1hZ2VzLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICppbWFnZV9mb3JfYWRkcmVzcyhjb25zdCB2b2lkICphZGRyZXNzKQotewotCXVuc2lnbmVkIGxvbmcgaTsKLQl1bnNpZ25lZCBsb25nIGo7Ci0JdW5zaWduZWQgbG9uZyBjb3VudCA9IF9keWxkX2ltYWdlX2NvdW50KCk7Ci0JY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICptaCA9IDA7Ci0Jc3RydWN0IGxvYWRfY29tbWFuZCAqbGMgPSAwOwotCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JewotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyAtIF9keWxkX2dldF9pbWFnZV92bWFkZHJfc2xpZGUoaSk7Ci0JCW1oID0gX2R5bGRfZ2V0X2ltYWdlX2hlYWRlcihpKTsKLQkJaWYgKG1oKQotCQl7Ci0JCQlsYyA9IChzdHJ1Y3QgbG9hZF9jb21tYW5kICopKChjaGFyICopbWggKyBzaXplb2Yoc3RydWN0IG1hY2hfaGVhZGVyKSk7Ci0JCQlmb3IgKGogPSAwOyBqIDwgbWgtPm5jbWRzOyBqKyssIGxjID0gKHN0cnVjdCBsb2FkX2NvbW1hbmQgKikoKGNoYXIgKilsYyArIGxjLT5jbWRzaXplKSkKLQkJCXsKLQkJCQlpZiAoTENfU0VHTUVOVCA9PSBsYy0+Y21kICYmCi0JCQkJCWFkZHIgPj0gKChzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kICopbGMpLT52bWFkZHIgJiYKLQkJCQkJYWRkciA8Ci0JCQkJCSgoc3RydWN0IHNlZ21lbnRfY29tbWFuZCAqKWxjKS0+dm1hZGRyICsgKChzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kICopbGMpLT52bXNpemUpCi0JCQkJewotCQkJCQlnb3RvIGltYWdlX2ZvdW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCQltaCA9IDA7Ci0JfQotICBpbWFnZV9mb3VuZDoKLQlyZXR1cm4gbWg7Ci19Ci0KLSNpZiAwIC8qIHVudXNlZCAqLwotc3RhdGljIGludCBTRExfT1NYX2RsYWRkcihjb25zdCB2b2lkICogZGxfcmVzdHJpY3QgcCwgU0RMX09TWF9EbF9pbmZvICogZGxfcmVzdHJpY3QgaW5mbykKLXsKLS8qCi0JRklYTUU6IFVTZSB0aGUgcm91dGluZSBpbWFnZV9mb3JfYWRkcmVzcy4KLSovCi0JdW5zaWduZWQgbG9uZyBpOwotCXVuc2lnbmVkIGxvbmcgajsKLQl1bnNpZ25lZCBsb25nIGNvdW50ID0gX2R5bGRfaW1hZ2VfY291bnQoKTsKLQlzdHJ1Y3QgbWFjaF9oZWFkZXIgKm1oID0gMDsKLQlzdHJ1Y3QgbG9hZF9jb21tYW5kICpsYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHRhYmxlX29mZiA9ICh1bnNpZ25lZCBsb25nKTA7Ci0JaW50IGZvdW5kID0gMDsKLQlpZiAoIWluZm8pCi0JCXJldHVybiAwOwotCWRvbG9jaygpOwotCXJlc2V0ZGxlcnJvcigpOwotCWluZm8tPmRsaV9mbmFtZSA9IDA7Ci0JaW5mby0+ZGxpX2ZiYXNlID0gMDsKLQlpbmZvLT5kbGlfc25hbWUgPSAwOwotCWluZm8tPmRsaV9zYWRkciA9IDA7Ci0vKiBTb21lIG9mIHRoaXMgd2FzIHN3aXBlZCBmcm9tIGNvZGUgcG9zdGVkIGJ5IERvdWdsYXMgRGF2aWRzb24gPGRkYXZpZHNvIEFUIGFwcGxlIERPVCBjb20+Ci0gKiB0byBkYXJ3aW4tZGV2ZWxvcG1lbnQgQVQgbGlzdHMgRE9UIGFwcGxlIERPVCBjb20gYW5kIHNsaWdodGx5IG1vZGlmaWVkCi0gKi8KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQl7Ci0JCWFkZHIgPSAodW5zaWduZWQgbG9uZylwIC0gX2R5bGRfZ2V0X2ltYWdlX3ZtYWRkcl9zbGlkZShpKTsKLQkJbWggPSBfZHlsZF9nZXRfaW1hZ2VfaGVhZGVyKGkpOwotCQlpZiAobWgpCi0JCXsKLQkJCWxjID0gKHN0cnVjdCBsb2FkX2NvbW1hbmQgKikoKGNoYXIgKiltaCArIHNpemVvZihzdHJ1Y3QgbWFjaF9oZWFkZXIpKTsKLQkJCWZvciAoaiA9IDA7IGogPCBtaC0+bmNtZHM7IGorKywgbGMgPSAoc3RydWN0IGxvYWRfY29tbWFuZCAqKSgoY2hhciAqKWxjICsgbGMtPmNtZHNpemUpKQotCQkJewotCQkJCWlmIChMQ19TRUdNRU5UID09IGxjLT5jbWQgJiYKLQkJCQkJYWRkciA+PSAoKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQgKilsYyktPnZtYWRkciAmJgotCQkJCQlhZGRyIDwKLQkJCQkJKChzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kICopbGMpLT52bWFkZHIgKyAoKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQgKilsYyktPnZtc2l6ZSkKLQkJCQl7Ci0JCQkJCWluZm8tPmRsaV9mbmFtZSA9IF9keWxkX2dldF9pbWFnZV9uYW1lKGkpOwotCQkJCQlpbmZvLT5kbGlfZmJhc2UgPSAodm9pZCAqKW1oOwotCQkJCQlmb3VuZCA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIWZvdW5kKQotCXsKLQkJZG91bmxvY2soKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWxjID0gKHN0cnVjdCBsb2FkX2NvbW1hbmQgKikoKGNoYXIgKiltaCArIHNpemVvZihzdHJ1Y3QgbWFjaF9oZWFkZXIpKTsKLQlmb3IgKGogPSAwOyBqIDwgbWgtPm5jbWRzOyBqKyssIGxjID0gKHN0cnVjdCBsb2FkX2NvbW1hbmQgKikoKGNoYXIgKilsYyArIGxjLT5jbWRzaXplKSkKLQl7Ci0JCWlmIChMQ19TRUdNRU5UID09IGxjLT5jbWQpCi0JCXsKLQkJCWlmICghU0RMX3N0cmNtcCgoKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQgKilsYyktPnNlZ25hbWUsICJfX0xJTktFRElUIikpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JdGFibGVfb2ZmID0KLQkJKCh1bnNpZ25lZCBsb25nKSgoc3RydWN0IHNlZ21lbnRfY29tbWFuZCAqKWxjKS0+dm1hZGRyKSAtCi0JCSgodW5zaWduZWQgbG9uZykoKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQgKilsYyktPmZpbGVvZmYpICsgX2R5bGRfZ2V0X2ltYWdlX3ZtYWRkcl9zbGlkZShpKTsKLQlkZWJ1ZygidGFibGUgb2ZmICV4IiwgdGFibGVfb2ZmKTsKLQotCWxjID0gKHN0cnVjdCBsb2FkX2NvbW1hbmQgKikoKGNoYXIgKiltaCArIHNpemVvZihzdHJ1Y3QgbWFjaF9oZWFkZXIpKTsKLQlmb3IgKGogPSAwOyBqIDwgbWgtPm5jbWRzOyBqKyssIGxjID0gKHN0cnVjdCBsb2FkX2NvbW1hbmQgKikoKGNoYXIgKilsYyArIGxjLT5jbWRzaXplKSkKLQl7Ci0JCWlmIChMQ19TWU1UQUIgPT0gbGMtPmNtZCkKLQkJewotCi0JCQlzdHJ1Y3Qgbmxpc3QgKnN5bXRhYmxlID0gKHN0cnVjdCBubGlzdCAqKSgoKHN0cnVjdCBzeW10YWJfY29tbWFuZCAqKWxjKS0+c3ltb2ZmICsgdGFibGVfb2ZmKTsKLQkJCXVuc2lnbmVkIGxvbmcgbnVtc3ltcyA9ICgoc3RydWN0IHN5bXRhYl9jb21tYW5kICopbGMpLT5uc3ltczsKLQkJCXN0cnVjdCBubGlzdCAqbmVhcmVzdCA9IE5VTEw7Ci0JCQl1bnNpZ25lZCBsb25nIGRpZmYgPSAweGZmZmZmZmZmOwotCQkJdW5zaWduZWQgbG9uZyBzdHJ0YWJsZSA9ICh1bnNpZ25lZCBsb25nKSgoKHN0cnVjdCBzeW10YWJfY29tbWFuZCAqKWxjKS0+c3Ryb2ZmICsgdGFibGVfb2ZmKTsKLQkJCWRlYnVnKCJzeW10YWJsZSAleCIsIHN5bXRhYmxlKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBudW1zeW1zOyBpKyspCi0JCQl7Ci0JCQkJLyogSWdub3JlIHRoZSBmb2xsb3dpbmcga2luZHMgb2YgU3ltYm9scyAqLwotCQkJCWlmICgoIXN5bXRhYmxlLT5uX3ZhbHVlKQkvKiBVbmRlZmluZWQgKi8KLQkJCQkJfHwgKHN5bXRhYmxlLT5uX3R5cGUgPj0gTl9QRVhUKQkvKiBEZWJ1ZyBzeW1ib2wgKi8KLQkJCQkJfHwgKCEoc3ltdGFibGUtPm5fdHlwZSAmIE5fRVhUKSkJLyogTG9jYWwgU3ltYm9sICovCi0JCQkJCSkKLQkJCQl7Ci0JCQkJCXN5bXRhYmxlKys7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoKGFkZHIgPj0gc3ltdGFibGUtPm5fdmFsdWUpICYmIChkaWZmID49IChzeW10YWJsZS0+bl92YWx1ZSAtIGFkZHIpKSkKLQkJCQl7Ci0JCQkJCWRpZmYgPSAodW5zaWduZWQgbG9uZylzeW10YWJsZS0+bl92YWx1ZSAtIGFkZHI7Ci0JCQkJCW5lYXJlc3QgPSBzeW10YWJsZTsKLQkJCQl9Ci0JCQkJc3ltdGFibGUrKzsKLQkJCX0KLQkJCWlmIChuZWFyZXN0KQotCQkJewotCQkJCWluZm8tPmRsaV9zYWRkciA9IG5lYXJlc3QtPm5fdmFsdWUgKyAoKHZvaWQgKilwIC0gYWRkcik7Ci0JCQkJaW5mby0+ZGxpX3NuYW1lID0gKGNoYXIgKikoc3RydGFibGUgKyBuZWFyZXN0LT5uX3VuLm5fc3RyeCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZG91bmxvY2soKTsKLQlyZXR1cm4gMTsKLX0KLSNlbmRpZgotCi0vKgotICogSW1wbGVtZW50IHRoZSBkbGZ1bmMoKSBpbnRlcmZhY2UsIHdoaWNoIGJlaGF2ZXMgZXhhY3RseSB0aGUgc2FtZSBhcwotICogZGxzeW0oKSBleGNlcHQgdGhhdCBpdCByZXR1cm5zIGEgZnVuY3Rpb24gcG9pbnRlciBpbnN0ZWFkIG9mIGEgZGF0YQotICogcG9pbnRlci4gIFRoaXMgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCi0gKiBhYm91dCB1bmRlZmluZWQgYmVoYXZpb3IsIGFuZCBpcyBpbnRlbmRlZCBhcyBwcmlvciBhcnQgZm9yIGZ1dHVyZQotICogUE9TSVggc3RhbmRhcmRpemF0aW9uLiAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IGFsbCBwb2ludGVyIHR5cGVzCi0gKiBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uLCB3aGljaCBpcyB0cnVlIG9uIGFsbCBwbGF0Zm9ybXMgRnJlZUJTRAotICogcnVucyBvbiwgYnV0IGlzIG5vdCBndWFyYW50ZWVkIGJ5IHRoZSBDIHN0YW5kYXJkLgotICovCi0jaWYgMCAKLXN0YXRpYyBkbGZ1bmNfdCBTRExfT1NYX2RsZnVuYyh2b2lkICogZGxfcmVzdHJpY3QgaGFuZGxlLCBjb25zdCBjaGFyICogZGxfcmVzdHJpY3Qgc3ltYm9sKQotewotCXVuaW9uCi0JewotCQl2b2lkICpkOwotCQlkbGZ1bmNfdCBmOwotCX0gcnY7Ci0JaW50IHN5bV9sZW4gPSBTRExfc3RybGVuKHN5bWJvbCk7Ci0JY2hhciAqbWFsbG9jX3N5bSA9IE5VTEw7Ci0JZG9sb2NrKCk7Ci0JbWFsbG9jX3N5bSA9IFNETF9tYWxsb2Moc3ltX2xlbiArIDIpOwotCWlmIChtYWxsb2Nfc3ltKQotCXsKLQkJU0RMX3NucHJpbnRmKG1hbGxvY19zeW0sIHN5bV9sZW4rMiwgIl8lcyIsIHN5bWJvbCk7Ci0JCXJ2LmQgPSBkbHN5bUludGVybihoYW5kbGUsIG1hbGxvY19zeW0sIDEpOwotCQlTRExfZnJlZShtYWxsb2Nfc3ltKTsKLQl9Ci0JZWxzZQotCXsKLQkJZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKLQkJZ290byBkbGZ1bmNlcnJvcjsKLQl9Ci0JZG91bmxvY2soKTsKLQlyZXR1cm4gcnYuZjsKLSAgZGxmdW5jZXJyb3I6Ci0JZG91bmxvY2soKTsKLQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgotCi0KLQotLyogZGxjb21wYXQgZW5kcywgaGVyZSdzIHRoZSBTREwgaW50ZXJmYWNlLi4uICAtLXJ5YW4uICAqLwotCi0KLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLS8qIFN5c3RlbSBkZXBlbmRlbnQgbGlicmFyeSBsb2FkaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2luY2x1ZGUgIlNETF9sb2Fkc28uaCIKLQotdm9pZCAqU0RMX0xvYWRPYmplY3QoY29uc3QgY2hhciAqc29maWxlKQotewotCXZvaWQgKmhhbmRsZSA9IFNETF9PU1hfZGxvcGVuKHNvZmlsZSwgUlRMRF9OT1cpOwotCWNvbnN0IGNoYXIgKmxvYWRlcnJvciA9IFNETF9PU1hfZGxlcnJvcigpOwotCWlmICggaGFuZGxlID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiRmFpbGVkIGxvYWRpbmcgJXM6ICVzIiwgc29maWxlLCBsb2FkZXJyb3IpOwotCX0KLQlyZXR1cm4oaGFuZGxlKTsKLX0KLQotdm9pZCAqU0RMX0xvYWRGdW5jdGlvbih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jdm9pZCAqc3ltYm9sID0gU0RMX09TWF9kbHN5bShoYW5kbGUsIG5hbWUpOwotCWlmICggc3ltYm9sID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiRmFpbGVkIGxvYWRpbmcgJXM6ICVzIiwgbmFtZSwgU0RMX09TWF9kbGVycm9yKCkpOwotCX0KLQlyZXR1cm4oc3ltYm9sKTsKLX0KLQotdm9pZCBTRExfVW5sb2FkT2JqZWN0KHZvaWQgKmhhbmRsZSkKLXsKLQlpZiAoIGhhbmRsZSAhPSBOVUxMICkgewotCQlTRExfT1NYX2RsY2xvc2UoaGFuZGxlKTsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBTRExfTE9BRFNPX0RMQ09NUEFUICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL2xvYWRzby9taW50L1NETF9zeXNsb2Fkc28uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbG9hZHNvL21pbnQvU0RMX3N5c2xvYWRzby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDg5ZTFiLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbG9hZHNvL21pbnQvU0RMX3N5c2xvYWRzby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfTE9BRFNPX0xERwotCi0vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCi0vKiBTeXN0ZW0gZGVwZW5kZW50IGxpYnJhcnkgbG9hZGluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGdlbS5oPgotI2luY2x1ZGUgPGxkZy5oPgotCi0jaW5jbHVkZSAiU0RMX2xvYWRzby5oIgotCi12b2lkICpTRExfTG9hZE9iamVjdChjb25zdCBjaGFyICpzb2ZpbGUpCi17Ci0JY29uc3QgY2hhciAqbG9hZGVycm9yID0gIlVua25vd24gZXJyb3IiOwotCXZvaWQgKmhhbmRsZSA9ICh2b2lkICopbGRnX29wZW4oKGNoYXIgKilzb2ZpbGUsIGxkZ19nbG9iYWwpOwotCWlmICggaGFuZGxlID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiRmFpbGVkIGxvYWRpbmcgJXM6ICVzIiwgc29maWxlLCBsb2FkZXJyb3IpOwotCX0KLQlyZXR1cm4oaGFuZGxlKTsKLX0KLQotdm9pZCAqU0RMX0xvYWRGdW5jdGlvbih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JY29uc3QgY2hhciAqbG9hZGVycm9yID0gIlVua25vd24gZXJyb3IiOwotCXZvaWQgKnN5bWJvbCA9ICh2b2lkICopbGRnX2ZpbmQoKGNoYXIgKiluYW1lLCAoTERHICopaGFuZGxlKTsKLQlpZiAoIHN5bWJvbCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIG5hbWUsIGxvYWRlcnJvcik7Ci0JfQotCXJldHVybihzeW1ib2wpOwotfQotCi12b2lkIFNETF9VbmxvYWRPYmplY3Qodm9pZCAqaGFuZGxlKQotewotCWlmICggaGFuZGxlICE9IE5VTEwgKSB7Ci0JCWxkZ19jbG9zZSgoTERHICopaGFuZGxlLCBsZGdfZ2xvYmFsKTsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBTRExfTE9BRFNPX0xERyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vb3MyL1NETF9zeXNsb2Fkc28uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbG9hZHNvL29zMi9TRExfc3lzbG9hZHNvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjc1OTEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vb3MyL1NETF9zeXNsb2Fkc28uYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX0xPQURTT19PUzIKLQotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotLyogU3lzdGVtIGRlcGVuZGVudCBsaWJyYXJ5IGxvYWRpbmcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNkZWZpbmUgSU5DTF9ET1NNT0RVTEVNR1IKLSNpbmNsdWRlIDxvczIuaD4KLQotI2luY2x1ZGUgIlNETF9sb2Fkc28uaCIKLQotdm9pZCAqU0RMX0xvYWRPYmplY3QoY29uc3QgY2hhciAqc29maWxlKQotewotICAgIEhNT0RVTEUgaGFuZGxlID0gTlVMTDsKLSAgICBjaGFyIGJ1Zls1MTJdOwotICAgIEFQSVJFVCB1bHJjID0gRG9zTG9hZE1vZHVsZShidWYsIHNpemVvZiAoYnVmKSwgKGNoYXIgKikgc29maWxlLCAmaGFuZGxlKTsKLQotICAgIC8qIEdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgaWYgYWxsIGxvYWRzIGZhaWxlZCAqLwotICAgIGlmICgodWxyYyAhPSBOT19FUlJPUikgfHwgKGhhbmRsZSA9PSBOVUxMKSkKLSAgICAgICAgU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBzb2ZpbGUsIGJ1Zik7Ci0KLSAgICByZXR1cm4oKHZvaWQgKikgaGFuZGxlKTsKLX0KLQotdm9pZCAqU0RMX0xvYWRGdW5jdGlvbih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqbG9hZGVycm9yID0gIlVua25vd24gZXJyb3IiOwotICAgIHZvaWQgKnN5bWJvbCA9IE5VTEw7Ci0gICAgQVBJUkVUIHVscmMgPSBEb3NRdWVyeVByb2NBZGRyKChITU9EVUxFKWhhbmRsZSwgMCwgKGNoYXIgKiluYW1lLCAmc3ltYm9sKTsKLSAgICBpZiAodWxyYyA9PSBFUlJPUl9JTlZBTElEX0hBTkRMRSkKLSAgICAgICAgbG9hZGVycm9yID0gIkludmFsaWQgbW9kdWxlIGhhbmRsZSI7Ci0gICAgZWxzZSBpZiAodWxyYyA9PSBFUlJPUl9JTlZBTElEX05BTUUpCi0gICAgICAgIGxvYWRlcnJvciA9ICJTeW1ib2wgbm90IGZvdW5kIjsKLQotICAgIGlmIChzeW1ib2wgPT0gTlVMTCkKLSAgICAgICAgU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBuYW1lLCBsb2FkZXJyb3IpOwotCi0gICAgcmV0dXJuKHN5bWJvbCk7Ci19Ci0KLXZvaWQgU0RMX1VubG9hZE9iamVjdCh2b2lkICpoYW5kbGUpCi17Ci0gICAgaWYgKCBoYW5kbGUgIT0gTlVMTCApCi0gICAgICAgIERvc0ZyZWVNb2R1bGUoKEhNT0RVTEUpIGhhbmRsZSk7Ci19Ci0KLSNlbmRpZiAvKiBTRExfTE9BRFNPX09TMiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vd2luMzIvU0RMX3N5c2xvYWRzby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9sb2Fkc28vd2luMzIvU0RMX3N5c2xvYWRzby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ3YzY4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbG9hZHNvL3dpbjMyL1NETF9zeXNsb2Fkc28uYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9MT0FEU09fV0lOMzIKLQotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotLyogU3lzdGVtIGRlcGVuZGVudCBsaWJyYXJ5IGxvYWRpbmcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJTRExfbG9hZHNvLmgiCi0KLXZvaWQgKlNETF9Mb2FkT2JqZWN0KGNvbnN0IGNoYXIgKnNvZmlsZSkKLXsKLQl2b2lkICpoYW5kbGUgPSBOVUxMOwotCWNvbnN0IGNoYXIgKmxvYWRlcnJvciA9ICJVbmtub3duIGVycm9yIjsKLQotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLQljaGFyIGVycmJ1Zls1MTJdOwotCi0Jd2NoYXJfdCAqZXJyYnVmX3QgPSBTRExfbWFsbG9jKDUxMiAqIHNpemVvZih3Y2hhcl90KSk7Ci0Jd2NoYXJfdCAqc29maWxlX3QgPSBTRExfbWFsbG9jKChNQVhfUEFUSCsxKSAqIHNpemVvZih3Y2hhcl90KSk7Ci0KLQlNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgTUJfUFJFQ09NUE9TRUQsIHNvZmlsZSwgLTEsIHNvZmlsZV90LCBNQVhfUEFUSCk7Ci0JaGFuZGxlID0gKHZvaWQgKilMb2FkTGlicmFyeShzb2ZpbGVfdCk7Ci0KLQkvKiBHZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIGlmIGFsbCBsb2FkcyBmYWlsZWQgKi8KLQlpZiAoIGhhbmRsZSA9PSBOVUxMICkgewotCQlGb3JtYXRNZXNzYWdlKChGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUyB8Ci0JCQkJCUZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNKSwKLQkJCQlOVUxMLCBHZXRMYXN0RXJyb3IoKSwgCi0JCQkJTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCi0JCQkJZXJyYnVmX3QsIFNETF9hcnJheXNpemUoZXJyYnVmKSwgTlVMTCk7Ci0JCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBlcnJidWZfdCwgLTEsIGVycmJ1ZiwgNTExLCBOVUxMLCBOVUxMKTsKLQkJbG9hZGVycm9yID0gZXJyYnVmOwotCX0KLQotCVNETF9mcmVlKHNvZmlsZV90KTsKLQlTRExfZnJlZShlcnJidWZfdCk7Ci0KLSNlbHNlIC8qaWYgZGVmaW5lZChfX1dJTjMyX18pKi8KLQljaGFyIGVycmJ1Zls1MTJdOwotCi0JaGFuZGxlID0gKHZvaWQgKilMb2FkTGlicmFyeShzb2ZpbGUpOwotCi0JLyogR2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSBpZiBhbGwgbG9hZHMgZmFpbGVkICovCi0JaWYgKCBoYW5kbGUgPT0gTlVMTCApIHsKLQkJRm9ybWF0TWVzc2FnZSgoRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMgfAotCQkJCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSksCi0JCQkJTlVMTCwgR2V0TGFzdEVycm9yKCksIAotCQkJCU1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAotCQkJCWVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLCBOVUxMKTsKLQkJbG9hZGVycm9yID0gZXJyYnVmOwotCX0KLSNlbmRpZgotCi0JaWYgKCBoYW5kbGUgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBzb2ZpbGUsIGxvYWRlcnJvcik7Ci0JfQotCXJldHVybihoYW5kbGUpOwotfQotCi12b2lkICpTRExfTG9hZEZ1bmN0aW9uKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQl2b2lkICpzeW1ib2wgPSBOVUxMOwotCWNvbnN0IGNoYXIgKmxvYWRlcnJvciA9ICJVbmtub3duIGVycm9yIjsKLQotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLQljaGFyIGVycmJ1Zls1MTJdOwotCWludCBsZW5ndGggPSBTRExfc3RybGVuKG5hbWUpOwotCi0Jd2NoYXJfdCAqbmFtZV90ID0gU0RMX21hbGxvYygobGVuZ3RoICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwotCXdjaGFyX3QgKmVycmJ1Zl90ID0gU0RMX21hbGxvYyg1MTIgKiBzaXplb2Yod2NoYXJfdCkpOwotCi0JTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIE1CX1BSRUNPTVBPU0VELCBuYW1lLCAtMSwgbmFtZV90LCBsZW5ndGgpOwotCi0Jc3ltYm9sID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcygoSE1PRFVMRSloYW5kbGUsIG5hbWVfdCk7Ci0JaWYgKCBzeW1ib2wgPT0gTlVMTCApIHsKLQkJRm9ybWF0TWVzc2FnZSgoRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMgfAotCQkJCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSksCi0JCQkJTlVMTCwgR2V0TGFzdEVycm9yKCksIAotCQkJCU1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAotCQkJCWVycmJ1Zl90LCBTRExfYXJyYXlzaXplKGVycmJ1ZiksIE5VTEwpOwotCQlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgZXJyYnVmX3QsIC0xLCBlcnJidWYsIDUxMSwgTlVMTCwgTlVMTCk7Ci0JCWxvYWRlcnJvciA9IGVycmJ1ZjsKLQl9Ci0KLQlTRExfZnJlZShuYW1lX3QpOwotCVNETF9mcmVlKGVycmJ1Zl90KTsKLQotI2Vsc2UgLyppZiBkZWZpbmVkKFdJTjMyKSovCi0JY2hhciBlcnJidWZbNTEyXTsKLQotCXN5bWJvbCA9ICh2b2lkICopR2V0UHJvY0FkZHJlc3MoKEhNT0RVTEUpaGFuZGxlLCBuYW1lKTsKLQlpZiAoIHN5bWJvbCA9PSBOVUxMICkgewotCQlGb3JtYXRNZXNzYWdlKChGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUyB8Ci0JCQkJCUZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNKSwKLQkJCQlOVUxMLCBHZXRMYXN0RXJyb3IoKSwgCi0JCQkJTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCi0JCQkJZXJyYnVmLCBTRExfYXJyYXlzaXplKGVycmJ1ZiksIE5VTEwpOwotCQlsb2FkZXJyb3IgPSBlcnJidWY7Ci0JfQotI2VuZGlmCi0KLQlpZiAoIHN5bWJvbCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIG5hbWUsIGxvYWRlcnJvcik7Ci0JfQotCXJldHVybihzeW1ib2wpOwotfQotCi12b2lkIFNETF9VbmxvYWRPYmplY3Qodm9pZCAqaGFuZGxlKQotewotCWlmICggaGFuZGxlICE9IE5VTEwgKSB7Ci0JCUZyZWVMaWJyYXJ5KChITU9EVUxFKWhhbmRsZSk7Ci0JfQotfQotCi0jZW5kaWYgLyogU0RMX0xPQURTT19XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL2Jlb3MvU0RMX0JlQXBwLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL2Jlb3MvU0RMX0JlQXBwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjI2OGNjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9iZW9zL1NETF9CZUFwcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogSGFuZGxlIHRoZSBCZUFwcCBzcGVjaWZpYyBwb3J0aW9ucyBvZiB0aGUgYXBwbGljYXRpb24gKi8KLQotI2luY2x1ZGUgPEFwcEtpdC5oPgotI2luY2x1ZGUgPHN0b3JhZ2UvUGF0aC5oPgotI2luY2x1ZGUgPHN0b3JhZ2UvRW50cnkuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIlNETF9CZUFwcC5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfZXJyb3IuaCIKLQotLyogRmxhZyB0byB0ZWxsIHdoZXRoZXIgb3Igbm90IHRoZSBCZSBhcHBsaWNhdGlvbiBpcyBhY3RpdmUgb3Igbm90ICovCi1pbnQgU0RMX0JlQXBwQWN0aXZlID0gMDsKLXN0YXRpYyBTRExfVGhyZWFkICpTRExfQXBwVGhyZWFkID0gTlVMTDsKLQotc3RhdGljIGludCBTdGFydEJlQXBwKHZvaWQgKnVudXNlZCkKLXsKLQlCQXBwbGljYXRpb24gKkFwcDsKLQotCUFwcCA9IG5ldyBCQXBwbGljYXRpb24oImFwcGxpY2F0aW9uL3gtU0RMLWV4ZWN1dGFibGUiKTsKLQotCUFwcC0+UnVuKCk7Ci0JZGVsZXRlIEFwcDsKLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIEJlIEFwcGxpY2F0aW9uLCBpZiBpdCdzIG5vdCBhbHJlYWR5IHN0YXJ0ZWQgKi8KLWludCBTRExfSW5pdEJlQXBwKHZvaWQpCi17Ci0JLyogQ3JlYXRlIHRoZSBCQXBwbGljYXRpb24gdGhhdCBoYW5kbGVzIGFwcHNlcnZlciBpbnRlcmFjdGlvbiAqLwotCWlmICggU0RMX0JlQXBwQWN0aXZlIDw9IDAgKSB7Ci0JCVNETF9BcHBUaHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkKFN0YXJ0QmVBcHAsIE5VTEwpOwotCQlpZiAoIFNETF9BcHBUaHJlYWQgPT0gTlVMTCApIHsKLQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIEJBcHBsaWNhdGlvbiB0aHJlYWQiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJCi0JCS8qIENoYW5nZSB3b3JraW5nIHRvIGRpcmVjdG9yeSB0byB0aGF0IG9mIGV4ZWN1dGFibGUgKi8KLQkJYXBwX2luZm8gaW5mbzsKLQkJaWYgKEJfT0sgPT0gYmVfYXBwLT5HZXRBcHBJbmZvKCZpbmZvKSkgewotCQkJZW50cnlfcmVmIHJlZiA9IGluZm8ucmVmOwotCQkJQkVudHJ5IGVudHJ5OwotCQkJaWYgKEJfT0sgPT0gZW50cnkuU2V0VG8oJnJlZikpIHsKLQkJCQlCUGF0aCBwYXRoOwotCQkJCWlmIChCX09LID09IHBhdGguU2V0VG8oJmVudHJ5KSkgewotCQkJCQlpZiAoQl9PSyA9PSBwYXRoLkdldFBhcmVudCgmcGF0aCkpIHsKLQkJCQkJCWNoZGlyKHBhdGguUGF0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkKLQkJCi0JCWRvIHsKLQkJCVNETF9EZWxheSgxMCk7Ci0JCX0gd2hpbGUgKCAoYmVfYXBwID09IE5VTEwpIHx8IGJlX2FwcC0+SXNMYXVuY2hpbmcoKSApOwotCi0JCS8qIE1hcmsgdGhlIGFwcGxpY2F0aW9uIGFjdGl2ZSAqLwotCQlTRExfQmVBcHBBY3RpdmUgPSAwOwotCX0KLQotCS8qIEluY3JlbWVudCB0aGUgYXBwbGljYXRpb24gcmVmZXJlbmNlIGNvdW50ICovCi0JKytTRExfQmVBcHBBY3RpdmU7Ci0KLQkvKiBUaGUgYXBwIGlzIHJ1bm5pbmcsIGFuZCB3ZSdyZSByZWFkeSB0byBnbyAqLwotCXJldHVybigwKTsKLX0KLQotLyogUXVpdCB0aGUgQmUgQXBwbGljYXRpb24sIGlmIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCi12b2lkIFNETF9RdWl0QmVBcHAodm9pZCkKLXsKLQkvKiBEZWNyZW1lbnQgdGhlIGFwcGxpY2F0aW9uIHJlZmVyZW5jZSBjb3VudCAqLwotCS0tU0RMX0JlQXBwQWN0aXZlOwotCi0JLyogSWYgdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVkIHplcm8sIGNsZWFuIHVwIHRoZSBhcHAgKi8KLQlpZiAoIFNETF9CZUFwcEFjdGl2ZSA9PSAwICkgewotCQlpZiAoIFNETF9BcHBUaHJlYWQgIT0gTlVMTCApIHsKLQkJCWlmICggYmVfYXBwICE9IE5VTEwgKSB7IC8qIE5vdCB0ZXN0ZWQgKi8KLQkJCQliZV9hcHAtPlBvc3RNZXNzYWdlKEJfUVVJVF9SRVFVRVNURUQpOwotCQkJfQotCQkJU0RMX1dhaXRUaHJlYWQoU0RMX0FwcFRocmVhZCwgTlVMTCk7Ci0JCQlTRExfQXBwVGhyZWFkID0gTlVMTDsKLQkJfQotCQkvKiBiZV9hcHAgc2hvdWxkIG5vdyBiZSBOVUxMIHNpbmNlIGJlX2FwcCBoYXMgcXVpdCAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9iZW9zL1NETF9CZUFwcC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL2Jlb3MvU0RMX0JlQXBwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NWRjMWQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL2Jlb3MvU0RMX0JlQXBwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogSGFuZGxlIHRoZSBCZUFwcCBzcGVjaWZpYyBwb3J0aW9ucyBvZiB0aGUgYXBwbGljYXRpb24gKi8KLQotLyogSW5pdGlhbGl6ZSB0aGUgQmUgQXBwbGljYXRpb24sIGlmIGl0J3Mgbm90IGFscmVhZHkgc3RhcnRlZCAqLwotZXh0ZXJuIGludCBTRExfSW5pdEJlQXBwKHZvaWQpOwotCi0vKiBRdWl0IHRoZSBCZSBBcHBsaWNhdGlvbiwgaWYgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gKi8KLWV4dGVybiB2b2lkIFNETF9RdWl0QmVBcHAodm9pZCk7Ci0KLS8qIEZsYWcgdG8gdGVsbCB3aGV0aGVyIHRoZSBhcHAgaXMgYWN0aXZlIG9yIG5vdCAqLwotZXh0ZXJuIGludCBTRExfQmVBcHBBY3RpdmU7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vZXBvYy9TRExfbWFpbi5jcHAgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vZXBvYy9TRExfbWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzljNzAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL2Vwb2MvU0RMX21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyoKLSAgICBTRExfbWFpbi5jcHAKLSAgICBUaGUgRXBvYyBleGVjdXRhYmxlIHN0YXJ0dXAgZnVuY3Rpb25zIAotCi0gICAgRXBvYyB2ZXJzaW9uIGJ5IEhhbm51IFZpaXRhbGEgKGhhbm51LmoudmlpdGFsYUBtYm5ldC5maSkKLSovCi0KLSNpbmNsdWRlIDxlMzJzdGQuaD4KLSNpbmNsdWRlIDxlMzJkZWYuaD4KLSNpbmNsdWRlIDxlMzJzdnIuaD4KLSNpbmNsdWRlIDxlMzJiYXNlLmg+Ci0jaW5jbHVkZSA8ZXN0bGliLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx3MzJzdGQuaD4KLSNpbmNsdWRlIDxhcGd0YXNrLmg+Ci0KLSNpbmNsdWRlICJTRExfZXJyb3IuaCIKLQotI2lmbmRlZiBFWFBPUlRfQwotIyBpZmRlZiBfX1ZDMzJfXwotIyAgZGVmaW5lIElNUE9SVF9DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgZGVmaW5lIEVYUE9SVF9DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyBlbmRpZgotIyBpZmRlZiBfX0dDQzMyX18KLSMgIGRlZmluZSBJTVBPUlRfQwotIyAgZGVmaW5lIEVYUE9SVF9DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fV0lOU19fKQotI2luY2x1ZGUgPGVzdHczMi5oPgotSU1QT1JUX0Mgdm9pZCBSZWdpc3RlcldzRXhlKGNvbnN0IFREZXNDICZhTmFtZSk7Ci0jZW5kaWYKLQotLyogVGhlIHByb3RvdHlwZSBmb3IgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbigpIGZ1bmN0aW9uICovCi0jZGVmaW5lIG1haW4JU0RMX21haW4KLWV4dGVybiAiQyIgaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmVudnBbXSk7Ci1leHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50IHJldCk7Ci0KLQotLyogRXBvYyBtYWluIGZ1bmN0aW9uICovCi0KLUdMREVGX0MgVEludCBFMzJNYWluKCkgCi0gICAgewotICAgIC8qICBHZXQgdGhlIGNsZWFuLXVwIHN0YWNrICovCi0JQ1RyYXBDbGVhbnVwKiBjbGVhbnVwID0gQ1RyYXBDbGVhbnVwOjpOZXcoKTsKLQotICAgICNpZiBkZWZpbmVkKF9fV0lOU19fKQotICAgIC8qIGFycmFuZ2UgZm9yIGFjY2VzcyB0byBXaW4zMiBzdGRpbi9zdGRvdXQvc3RkZXJyICovCi0gICAJUldpbjMyU3RyZWFtOjpTdGFydFNlcnZlcigpOwkKLSAgICAjZW5kaWYKLQotICAgIC8qIEFycmFuZ2UgZm9yIG11bHRpLXRocmVhZGVkIG9wZXJhdGlvbiAqLwotCVNwYXduUG9zaXhTZXJ2ZXJUaHJlYWQoKTsJCi0KLSAgICAvKiBHZXQgYXJncyBhbmQgZW52aXJvbm1lbnQgKi8KLQlpbnQgYXJnYz0wOwotCWNoYXIqKiBhcmd2PTA7Ci0JY2hhcioqIGVudnA9MDsKLQlfX2NydDAoYXJnYyxhcmd2LGVudnApOwkKLQotICAgICNpZiBkZWZpbmVkKF9fV0lOU19fKQotCS8qIENhdXNlIHRoZSBncmFwaGljYWwgV2luZG93IFNlcnZlciB0byBjb21lIGludG8gZXhpc3RlbmNlICovCi0JUlNlbWFwaG9yZSBzZW07Ci0Jc2VtLkNyZWF0ZUdsb2JhbChfTCgiV3NFeGVTZW0iKSwwKTsKLQlSZWdpc3RlcldzRXhlKHNlbS5GdWxsTmFtZSgpKTsKLSAgICAjZW5kaWYKLQotCi0gICAgLyogU3RhcnQgdGhlIGFwcGxpY2F0aW9uISAqLwotCi0gICAgLyogQ3JlYXRlIHN0ZGxpYiAqLwotICAgIF9SRUVOVDsKLQotICAgIC8qIFNldCBwcm9jZXNzIGFuZCB0aHJlYWQgcHJpb3JpdHkgKi8KLSAgICBSVGhyZWFkIGN1cnJlbnRUaHJlYWQ7Ci0KLSAgICBjdXJyZW50VGhyZWFkLlJlbmFtZShfTCgiU2RsUHJvZ3JhbSIpKTsKLSAgICBjdXJyZW50VGhyZWFkLlNldFByb2Nlc3NQcmlvcml0eShFUHJpb3JpdHlMb3cpOwotICAgIGN1cnJlbnRUaHJlYWQuU2V0UHJpb3JpdHkoRVByaW9yaXR5TXVjaExlc3MpOwotCi0gICAgLyogQ2FsbCBzdGRsaWIgbWFpbiAqLwotICAgIGludCByZXQgPSBtYWluKGFyZ2MsIGFyZ3YsIGVudnApOyAvKiAhISBwcm9jZXNzIGV4aXRzIGhlcmUgaWYgdGhlcmUgaXMgImV4aXQoKSIgaW4gbWFpbiEgKi8JCi0KLSAgICAvKiBDYWxsIGV4aXQgKi8KLSAgICBleGl0KHJldCk7IC8qICEhIHByb2Nlc3MgZXhpdHMgaGVyZSEgKi8JCQkKLQotICAgIC8qIEZyZWUgcmVzb3VyY2VzIGFuZCByZXR1cm4gKi8KLSAgICBDbG9zZVNURExJQigpOwotICAgCWRlbGV0ZSBjbGVhbnVwOwkJCQkJCQkJCQotICAgIHJldHVybihLRXJyTm9uZSk7Ci0gICAgfQotCi0vKiBFcG9jIGRsbCBlbnRyeSBwb2ludCAqLwotI2lmIGRlZmluZWQoX19XSU5TX18pCi1HTERFRl9DIFRJbnQgRTMyRGxsKFREbGxSZWFzb24pCi0JewotCXJldHVybihLRXJyTm9uZSk7Ci0JfQotCi1FWFBPUlRfQyBUSW50IFdpbnNNYWluKFRBbnkgKikKLQl7Ci0gICAgRTMyTWFpbigpOwotCXJldHVybiBLRXJyTm9uZTsKLQl9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9tYWNvcy9TREwuciBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9tYWNvcy9TREwucgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0NTA3YS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3MvU0RMLnIKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1kYXRhICdETE9HJyAoMTAwMCkgewotCSQiMDA3MiAwMDQwIDAwRUEgMDFCMyAwMDAxIDAxMDAgMDAwMCAwMDAwIDAwMDAgMDNFOCAwQzQzIDZGNkQgNkQ2MSA2RTY0IDIwNEMgNjk2RSIgICAgICAgICAgICAgICAgICAgIC8qIC5yLkAu6i6zLi4uLi4uLi4uLi7oLkNvbW1hbmQgTGluICovCi0JJCI2NTAwIDI4MEEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZS4owiAqLwotfTsKLQotZGF0YSAnRExPRycgKDEwMDEpIHsKLQkkIjAwNzIgMDA0MCAwMERCIDAxQUMgMDAwMSAwMTAwIDAwMDAgMDAwMCAwMDAwIDAzRTkgMEM0NSA3MjcyIDZGNzIgMjA1NyA2OTZFIDY0NkYiICAgICAgICAgICAgICAgICAgICAvKiAuci5ALtsurC4uLi4uLi4uLi4u6S5FcnJvciBXaW5kbyAqLwotCSQiNzcwMCAyODBBIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHcuKMIgKi8KLX07Ci0KLWRhdGEgJ0RMT0cnICgxMDAyKSB7Ci0JJCIwMEI4IDAwQkUgMDE0NyAwMUQ4IDAwMDUgMDEwMCAwMDAwIDAwMDAgMDAwMCAwM0VBIDE2NDMgNkY2RSA2NjY5IDcyNkQgMjA0NCA2OTczIiAgICAgICAgICAgICAgICAgICAgLyogLrguvi5HLtguLi4uLi4uLi4uLuouQ29uZmlybSBEaXMgKi8KLQkkIjcwNkMgNjE3OSAyMDQzIDY4NjEgNkU2NyA2NTEwIDI4MEEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGF5IENoYW5nZS4owiAqLwotfTsKLQotZGF0YSAnRElUTCcgKDEwMDApIHsKLQkkIjAwMDUgMDAwMCAwMDAwIDAwNTIgMDExMyAwMDY2IDAxNTggMDQwMiA0RjRCIDAwMDAgMDAwMCAwMDUyIDAwQzIgMDA2NiAwMTA3IDA0MDYiICAgICAgICAgICAgICAgICAgICAvKiAuLi4uLi4uUi4uLmYuWC4uT0suLi4uLlIuwi5mLi4uLiAqLwotCSQiNDM2MSA2RTYzIDY1NkMgMDAwMCAwMDAwIDAwMEYgMDA4NCAwMDFGIDAxNTUgMTAwMCAwMDAwIDAwMDAgMDA1NCAwMDE5IDAwNjYgMDA3RCIgICAgICAgICAgICAgICAgICAgIC8qIENhbmNlbC4uLi4uLi6ELi4uVS4uLi4uLi5ULi4uZi59ICovCi0JJCIwNTBFIDRGNzUgNzQ3MCA3NTc0IDIwNzQgNkYyMCA2NjY5IDZDNjUgMDAwMCAwMDAwIDAwMEYgMDAxOCAwMDFGIDAwN0YgMDgwRCA0MzZGIiAgICAgICAgICAgICAgICAgICAgLyogLi5PdXRwdXQgdG8gZmlsZS4uLi4uLi4uLi4uLi4uQ28gKi8KLQkkIjZENkQgNjE2RSA2NDIwIDRDNjkgNkU2NSAzQTAwIDAwMDAgMDAwMCAwMDMwIDAwMTggMDA0MCAwMTU4IDA3MDIgMDA4MCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtbWFuZCBMaW5lOi4uLi4uLjAuLi5ALlguLi6AICovCi19OwotCi1kYXRhICdESVRMJyAoMTAwMSkgewotCSQiMDAwMSAwMDAwIDAwMDAgMDA0NiAwMTIwIDAwNUEgMDE1QSAwNDAyIDRGNEIgMDAwMCAwMDAwIDAwMTAgMDAwQSAwMDM4IDAxNjAgMDgwMCIgICAgICAgICAgICAgICAgICAgIC8qIC4uLi4uLi5GLiAuWi5aLi5PSy4uLi4uLi7CLjguYC4uICovCi19OwotCi1kYXRhICdESVRMJyAoMTAwMikgewotCSQiMDAwMiAwMDAwIDAwMDAgMDA2RiAwMDFFIDAwODMgMDA1OCAwNDA2IDQzNjEgNkU2MyA2NTZDIDAwMDAgMDAwMCAwMDZFIDAwQzAgMDA4MiIgICAgICAgICAgICAgICAgICAgIC8qIC4uLi4uLi5vLi4ugy5YLi5DYW5jZWwuLi4uLm4uwC6CICovCi0JJCIwMEZBIDA0MDIgNEY0QiAwMDAwIDAwMDAgMDAwRSAwMDBGIDAwNUYgMDEwQyA4OEIzIDU0NjggNjUyMCA3MzY1IDc0NzQgNjk2RSA2NzIwIiAgICAgICAgICAgICAgICAgICAgLyogLvouLk9LLi4uLi4uLi4uXy4uiLNUaGUgc2V0dGluZyAgKi8KLQkkIjY2NkYgNzIyMCA3OTZGIDc1NzIgMjA2RCA2RjZFIDY5NzQgNkY3MiAyMDY4IDYxNzMgMjA2MiA2NTY1IDZFMjAgNjM2OCA2MTZFIDY3NjUiICAgICAgICAgICAgICAgICAgICAvKiBmb3IgeW91ciBtb25pdG9yIGhhcyBiZWVuIGNoYW5nZSAqLwotCSQiNjQyQyAyMDYxIDZFNjQgMjA2OSA3NDIwIDZENjEgNzkyMCA2RTZGIDc0MjAgNjI2NSAyMDY0IDY5NzMgNzA2QyA2MTc5IDY1NjQgMjA2MyIgICAgICAgICAgICAgICAgICAgIC8qIGQsIGFuZCBpdCBtYXkgbm90IGJlIGRpc3BsYXllZCBjICovCi0JJCI2RjcyIDcyNjUgNjM3NCA2Qzc5IDJFMjAgNTQ2RiAyMDYzIDZGNkUgNjY2OSA3MjZEIDIwNzQgNjg2NSAyMDY0IDY5NzMgNzA2QyA2MTc5IiAgICAgICAgICAgICAgICAgICAgLyogb3JyZWN0bHkuIFRvIGNvbmZpcm0gdGhlIGRpc3BsYXkgKi8KLQkkIjIwNjkgNzMyMCA2MzZGIDcyNzIgNjU2MyA3NDJDIDIwNjMgNkM2OSA2MzZCIDIwNEYgNEIyRSAyMDU0IDZGMjAgNzI2NSA3NDc1IDcyNkUiICAgICAgICAgICAgICAgICAgICAvKiAgaXMgY29ycmVjdCwgY2xpY2sgT0suIFRvIHJldHVybiAqLwotCSQiMjA3NCA2RjIwIDc0NjggNjUyMCA2RjcyIDY5NjcgNjk2RSA2MTZDIDIwNzMgNjU3NCA3NDY5IDZFNjcgMkMyMCA2MzZDIDY5NjMgNkIyMCIgICAgICAgICAgICAgICAgICAgIC8qICB0byB0aGUgb3JpZ2luYWwgc2V0dGluZywgY2xpY2sgICovCi0JJCI0MzYxIDZFNjMgNjU2QyAyRTAwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FuY2VsLi4gKi8KLX07Ci0KLWRhdGEgJ01FTlUnICgxMjgsIHByZWxvYWQpIHsKLQkkIjAwODAgMDAwMCAwMDAwIDAwMDAgMDAwMCBGRkZGIEZGRkIgMDExNCAwQzQxIDYyNkYgNzU3NCAyMDUzIDQ0NEMgMkUyRSAyRTAwIDAwMDAiICAgICAgICAgICAgICAgICAgICAvKiAugC4uLi4uLi4u////+y4uLkFib3V0IFNETC4uLi4uLiAqLwotCSQiMDAwMSAyRDAwIDAwMDAgMDAwMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC4uLS4uLi4uICovCi19OwotCi1kYXRhICdNRU5VJyAoMTI5KSB7Ci0JJCIwMDgxIDAwMDAgMDAwMCAwMDAwIDAwMDAgRkZGRiBGRkZGIDBDNTYgNjk2NCA2NTZGIDIwNDQgNzI2OSA3NjY1IDcyMTkgNDQ3MiA2MTc3IiAgICAgICAgICAgICAgICAgICAgLyogLoEuLi4uLi4uLv////8uVmlkZW8gRHJpdmVyLkRyYXcgKi8KLQkkIjUzNzAgNzI2RiA2MzZCIDY1NzQgMjAyOCA0Njc1IDZDNkMgNzM2MyA3MjY1IDY1NkUgMjkwMCAwMDAwIDAwMUUgNTQ2RiA2RjZDIDQyNkYiICAgICAgICAgICAgICAgICAgICAvKiBTcHJvY2tldCAoRnVsbHNjcmVlbikuLi4uLlRvb2xCbyAqLwotCSQiNzgyMCAyMDI4IDQ2NzUgNkM2QyA3MzYzIDcyNjUgNjU2RSAyRjU3IDY5NkUgNjQ2RiA3NzY1IDY0MjkgMDAwMCAwMDAwIDAwIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHggIChGdWxsc2NyZWVuL1dpbmRvd2VkKS4uLi4uICovCi19OwotCi1kYXRhICdDTlRMJyAoMTI4KSB7Ci0JJCIwMDAwIDAwMDAgMDAxMCAwMTQwIDAwMDAgMDEwMCAwMDY0IDAwODEgMDNGMCAwMDAwIDAwMDAgMEQ1NiA2OTY0IDY1NkYgMjA0NCA3MjY5IiAgICAgICAgICAgICAgICAgICAgLyogLi4uLi4uLkAuLi4uLmQugS7wLi4uLi5WaWRlbyBEcmkgKi8KLQkkIjc2NjUgNzIzQSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXI6ICovCi19OwotCi1kYXRhICdUTVBMJyAoMTI4LCAiQ0xuZSIpIHsKLQkkIjBDNDMgNkY2RCA2RDYxIDZFNjQgMjA0QyA2OTZFIDY1NTAgNTM1NCA1MjBDIDU2NjkgNjQ2NSA2RjIwIDQ0NzIgNjk3NiA2NTcyIDUwNTMiICAgICAgICAgICAgICAgICAgICAvKiAuQ29tbWFuZCBMaW5lUFNUUi5WaWRlbyBEcml2ZXJQUyAqLwotCSQiNTQ1MiAwQzUzIDYxNzYgNjUyMCA1NDZGIDIwNDYgNjk2QyA2NTQyIDRGNEYgNEMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRSLlNhdmUgVG8gRmlsZUJPT0wgKi8KLX07Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9tYWNvcy9TRExfbWFpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zL1NETF9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ODYzOGIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zL1NETF9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyogVGhpcyBmaWxlIHRha2VzIGNhcmUgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHBhcnNpbmcsIGFuZCBzdGRpbyByZWRpcmVjdGlvbgotICAgaW4gdGhlIE1hY09TIGVudmlyb25tZW50LiAoc3RkaW8vc3RkZXJyIGlzICpub3QqIGRpcmVjdGVkIGZvciBNYWNoLU8gYnVpbGRzKQotICovCi0KLSNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKLSNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+Ci0jZWxpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgKFVOSVZFUlNBTF9JTlRFUkZBQ0VTX1ZFUlNJT04gPiAweDAzMzUpCi0jaW5jbHVkZSA8Q2FyYm9uLmg+Ci0jZWxzZQotI2luY2x1ZGUgPERpYWxvZ3MuaD4KLSNpbmNsdWRlIDxGb250cy5oPgotI2luY2x1ZGUgPEV2ZW50cy5oPgotI2luY2x1ZGUgPFJlc291cmNlcy5oPgotI2luY2x1ZGUgPEZvbGRlcnMuaD4KLSNlbmRpZgotCi0vKiBJbmNsdWRlIHRoZSBTREwgbWFpbiBkZWZpbml0aW9uIGhlYWRlciAqLwotI2luY2x1ZGUgIlNETC5oIgotI2luY2x1ZGUgIlNETF9tYWluLmgiCi0jaWZkZWYgbWFpbgotI3VuZGVmIG1haW4KLSNlbmRpZgotCi0jaWYgIShkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykpCi0vKiBUaGUgc3RhbmRhcmQgb3V0cHV0IGZpbGVzICovCi0jZGVmaW5lIFNURE9VVF9GSUxFCSJzdGRvdXQudHh0IgotI2RlZmluZSBTVERFUlJfRklMRQkic3RkZXJyLnR4dCIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX19NV0VSS1NfXykgJiYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgotCS8qIEluIE1QVywgdGhlIHFkIGdsb2JhbCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpYnJhcmllcyAqLwotCVFER2xvYmFscyBxZDsKLSNlbmRpZgotCi0vKiBTdHJ1Y3R1cmUgZm9yIGtlZXBpbmcgcHJlZnMgaW4gMSB2YXJpYWJsZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFN0cjI1NSAgY29tbWFuZF9saW5lOwotICAgIFN0cjI1NSAgdmlkZW9fZHJpdmVyX25hbWU7Ci0gICAgQm9vbGVhbiBvdXRwdXRfdG9fZmlsZTsKLX0gIFByZWZzUmVjb3JkOwotCi0vKiBTZWUgaWYgdGhlIGNvbW1hbmQga2V5IGlzIGhlbGQgZG93biBhdCBzdGFydHVwICovCi1zdGF0aWMgQm9vbGVhbiBDb21tYW5kS2V5SXNEb3duKHZvaWQpCi17Ci0JS2V5TWFwICB0aGVLZXlNYXA7Ci0KLQlHZXRLZXlzKHRoZUtleU1hcCk7Ci0KLQlpZiAoKCh1bnNpZ25lZCBjaGFyICopIHRoZUtleU1hcClbNl0gJiAweDgwKSB7Ci0JCXJldHVybih0cnVlKTsKLQl9Ci0JcmV0dXJuKGZhbHNlKTsKLX0KLQotI2lmICEoZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pKQotCi0vKiBQYXJzZSBhIGNvbW1hbmQgbGluZSBidWZmZXIgaW50byBhcmd1bWVudHMgKi8KLXN0YXRpYyBpbnQgUGFyc2VDb21tYW5kTGluZShjaGFyICpjbWRsaW5lLCBjaGFyICoqYXJndikKLXsKLQljaGFyICpidWZwOwotCWludCBhcmdjOwotCi0JYXJnYyA9IDA7Ci0JZm9yICggYnVmcCA9IGNtZGxpbmU7ICpidWZwOyApIHsKLQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLQkJd2hpbGUgKCBTRExfaXNzcGFjZSgqYnVmcCkgKSB7Ci0JCQkrK2J1ZnA7Ci0JCX0KLQkJLyogU2tpcCBvdmVyIGFyZ3VtZW50ICovCi0JCWlmICggKmJ1ZnAgPT0gJyInICkgewotCQkJKytidWZwOwotCQkJaWYgKCAqYnVmcCApIHsKLQkJCQlpZiAoIGFyZ3YgKSB7Ci0JCQkJCWFyZ3ZbYXJnY10gPSBidWZwOwotCQkJCX0KLQkJCQkrK2FyZ2M7Ci0JCQl9Ci0JCQkvKiBTa2lwIG92ZXIgd29yZCAqLwotCQkJd2hpbGUgKCAqYnVmcCAmJiAoKmJ1ZnAgIT0gJyInKSApIHsKLQkJCQkrK2J1ZnA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoICpidWZwICkgewotCQkJCWlmICggYXJndiApIHsKLQkJCQkJYXJndlthcmdjXSA9IGJ1ZnA7Ci0JCQkJfQotCQkJCSsrYXJnYzsKLQkJCX0KLQkJCS8qIFNraXAgb3ZlciB3b3JkICovCi0JCQl3aGlsZSAoICpidWZwICYmICEgU0RMX2lzc3BhY2UoKmJ1ZnApICkgewotCQkJCSsrYnVmcDsKLQkJCX0KLQkJfQotCQlpZiAoICpidWZwICkgewotCQkJaWYgKCBhcmd2ICkgewotCQkJCSpidWZwID0gJ1wwJzsKLQkJCX0KLQkJCSsrYnVmcDsKLQkJfQotCX0KLQlpZiAoIGFyZ3YgKSB7Ci0JCWFyZ3ZbYXJnY10gPSBOVUxMOwotCX0KLQlyZXR1cm4oYXJnYyk7Ci19Ci0KLS8qIFJlbW92ZSB0aGUgb3V0cHV0IGZpbGVzIGlmIHRoZXJlIHdhcyBubyBvdXRwdXQgd3JpdHRlbiAqLwotc3RhdGljIHZvaWQgY2xlYW51cF9vdXRwdXQodm9pZCkKLXsKLQlGSUxFICpmaWxlOwotCWludCBlbXB0eTsKLQotCS8qIEZsdXNoIHRoZSBvdXRwdXQgaW4gY2FzZSBhbnl0aGluZyBpcyBxdWV1ZWQgKi8KLQlmY2xvc2Uoc3Rkb3V0KTsKLQlmY2xvc2Uoc3RkZXJyKTsKLQotCS8qIFNlZSBpZiB0aGUgZmlsZXMgaGF2ZSBhbnkgb3V0cHV0IGluIHRoZW0gKi8KLQlmaWxlID0gZm9wZW4oU1RET1VUX0ZJTEUsICJyYiIpOwotCWlmICggZmlsZSApIHsKLQkJZW1wdHkgPSAoZmdldGMoZmlsZSkgPT0gRU9GKSA/IDEgOiAwOwotCQlmY2xvc2UoZmlsZSk7Ci0JCWlmICggZW1wdHkgKSB7Ci0JCQlyZW1vdmUoU1RET1VUX0ZJTEUpOwotCQl9Ci0JfQotCWZpbGUgPSBmb3BlbihTVERFUlJfRklMRSwgInJiIik7Ci0JaWYgKCBmaWxlICkgewotCQllbXB0eSA9IChmZ2V0YyhmaWxlKSA9PSBFT0YpID8gMSA6IDA7Ci0JCWZjbG9zZShmaWxlKTsKLQkJaWYgKCBlbXB0eSApIHsKLQkJCXJlbW92ZShTVERFUlJfRklMRSk7Ci0JCX0KLQl9Ci19Ci0KLSNlbmRpZiAvLyEoZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pKQotCi1zdGF0aWMgaW50IGdldEN1cnJlbnRBcHBOYW1lIChTdHJGaWxlTmFtZSBuYW1lKSB7Ci0JCi0gICAgUHJvY2Vzc1NlcmlhbE51bWJlciBwcm9jZXNzOwotICAgIFByb2Nlc3NJbmZvUmVjICAgICAgcHJvY2Vzc19pbmZvOwotICAgIEZTU3BlYyAgICAgICAgICAgICAgcHJvY2Vzc19mc3A7Ci0gICAgCi0gICAgcHJvY2Vzcy5oaWdoTG9uZ09mUFNOID0gMDsKLSAgICBwcm9jZXNzLmxvd0xvbmdPZlBTTiAgPSBrQ3VycmVudFByb2Nlc3M7Ci0gICAgcHJvY2Vzc19pbmZvLnByb2Nlc3NJbmZvTGVuZ3RoID0gc2l6ZW9mIChwcm9jZXNzX2luZm8pOwotICAgIHByb2Nlc3NfaW5mby5wcm9jZXNzTmFtZSAgICA9IE5VTEw7Ci0gICAgcHJvY2Vzc19pbmZvLnByb2Nlc3NBcHBTcGVjID0gJnByb2Nlc3NfZnNwOwotICAgIAotICAgIGlmICggbm9FcnIgIT0gR2V0UHJvY2Vzc0luZm9ybWF0aW9uICgmcHJvY2VzcywgJnByb2Nlc3NfaW5mbykgKQotICAgICAgIHJldHVybiAwOwotICAgIAotICAgIFNETF9tZW1jcHkobmFtZSwgcHJvY2Vzc19mc3AubmFtZSwgcHJvY2Vzc19mc3AubmFtZVswXSArIDEpOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGdldFByZWZzRmlsZSAoRlNTcGVjICpwcmVmc19mc3AsIGludCBjcmVhdGUpIHsKLQotICAgIC8qIFRoZSBwcmVmcyBmaWxlIG5hbWUgaXMgdGhlIGFwcGxpY2F0aW9uIG5hbWUsIHBvc3NpYmx5IHRydW5jYXRlZCwgKi8KLSAgICAvKiBwbHVzICIgUHJlZmVyZW5jZXMgKi8KLSAgICAKLSAgICAjZGVmaW5lICBTVUZGSVggICAiIFByZWZlcmVuY2VzIgotICAgICNkZWZpbmUgIE1BWF9OQU1FIDE5ICAgICAgICAgICAgIC8qIDMxIC0gc3RybGVuIChTVUZGSVgpICovCi0gICAgCi0gICAgc2hvcnQgIHZvbHVtZV9yZWZfbnVtYmVyOwotICAgIGxvbmcgICBkaXJlY3RvcnlfaWQ7Ci0gICAgU3RyRmlsZU5hbWUgIHByZWZzX25hbWU7Ci0gICAgU3RyRmlsZU5hbWUgIGFwcF9uYW1lOwotICAgIAotICAgIC8qIEdldCBQcmVmZXJlbmNlcyBmb2xkZXIgLSB3b3JrcyB3aXRoIE11bHRpcGxlIFVzZXJzICovCi0gICAgaWYgKCBub0VyciAhPSBGaW5kRm9sZGVyICgga09uU3lzdGVtRGlzaywga1ByZWZlcmVuY2VzRm9sZGVyVHlwZSwga0RvbnRDcmVhdGVGb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZV9yZWZfbnVtYmVyLCAmZGlyZWN0b3J5X2lkKSApCi0gICAgICAgIGV4aXQgKC0xKTsKLSAgICAKLSAgICBpZiAoICEgZ2V0Q3VycmVudEFwcE5hbWUgKGFwcF9uYW1lKSApCi0gICAgICAgIGV4aXQgKC0xKTsKLSAgICAKLSAgICAvKiBUcnVuY2F0ZSBpZiBuYW1lIGlzIHRvbyBsb25nICovCi0gICAgaWYgKGFwcF9uYW1lWzBdID4gTUFYX05BTUUgKQotICAgICAgICBhcHBfbmFtZVswXSA9IE1BWF9OQU1FOwotICAgICAgICAKLSAgICBTRExfbWVtY3B5KHByZWZzX25hbWUgKyAxLCBhcHBfbmFtZSArIDEsIGFwcF9uYW1lWzBdKTsgICAgCi0gICAgU0RMX21lbWNweShwcmVmc19uYW1lICsgYXBwX25hbWVbMF0gKyAxLCBTVUZGSVgsIHN0cmxlbiAoU1VGRklYKSk7Ci0gICAgcHJlZnNfbmFtZVswXSA9IGFwcF9uYW1lWzBdICsgc3RybGVuIChTVUZGSVgpOwotICAgCi0gICAgLyogTWFrZSB0aGUgZmlsZSBzcGVjIGZvciBwcmVmcyBmaWxlICovCi0gICAgaWYgKCBub0VyciAhPSBGU01ha2VGU1NwZWMgKHZvbHVtZV9yZWZfbnVtYmVyLCBkaXJlY3RvcnlfaWQsIHByZWZzX25hbWUsIHByZWZzX2ZzcCkgKSB7Ci0gICAgICAgIGlmICggIWNyZWF0ZSApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBDcmVhdGUgdGhlIHByZWZzIGZpbGUgKi8KLSAgICAgICAgICAgIFNETF9tZW1jcHkocHJlZnNfZnNwLT5uYW1lLCBwcmVmc19uYW1lLCBwcmVmc19uYW1lWzBdICsgMSk7Ci0gICAgICAgICAgICBwcmVmc19mc3AtPnBhcklEICAgPSBkaXJlY3RvcnlfaWQ7Ci0gICAgICAgICAgICBwcmVmc19mc3AtPnZSZWZOdW0gPSB2b2x1bWVfcmVmX251bWJlcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIEZTcENyZWF0ZVJlc0ZpbGUgKHByZWZzX2ZzcCwgMHgzZjNmM2YzZiwgJ3ByZWYnLCAwKTsgLy8gJz8/Pz8nIHBhcnNlZCBhcyB0cmlncmFwaAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIG5vRXJyICE9IFJlc0Vycm9yICgpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZFByZWZzUmVzb3VyY2UgKFByZWZzUmVjb3JkICpwcmVmcykgewotICAgIAotICAgIEhhbmRsZSBwcmVmc19oYW5kbGU7Ci0gICAgCi0gICAgcHJlZnNfaGFuZGxlID0gR2V0MVJlc291cmNlKCAnQ0xuZScsIDEyOCApOwotCi0JaWYgKHByZWZzX2hhbmRsZSAhPSBOVUxMKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotLy8JCWludCBqICAgICAgPSAwOwotCQkKLQkJSExvY2socHJlZnNfaGFuZGxlKTsKLQkJCi0JCS8qIEdldCBjb21tYW5kIGxpbmUgc3RyaW5nICovCQotCQlTRExfbWVtY3B5KHByZWZzLT5jb21tYW5kX2xpbmUsICpwcmVmc19oYW5kbGUsICgqcHJlZnNfaGFuZGxlKVswXSsxKTsKLQotCQkvKiBHZXQgdmlkZW8gZHJpdmVyIG5hbWUgKi8KLQkJb2Zmc2V0ICs9ICgqcHJlZnNfaGFuZGxlKVswXSArIDE7CQotCQlTRExfbWVtY3B5KHByZWZzLT52aWRlb19kcml2ZXJfbmFtZSwgKnByZWZzX2hhbmRsZSArIG9mZnNldCwgKCpwcmVmc19oYW5kbGUpW29mZnNldF0gKyAxKTsJCQotCQkKLQkJLyogR2V0IHNhdmUtdG8tZmlsZSBvcHRpb24gKDEgb3IgMCkgKi8KLQkJb2Zmc2V0ICs9ICgqcHJlZnNfaGFuZGxlKVtvZmZzZXRdICsgMTsKLQkJcHJlZnMtPm91dHB1dF90b19maWxlID0gKCpwcmVmc19oYW5kbGUpW29mZnNldF07Ci0JCQotCQlSZWxlYXNlUmVzb3VyY2UoIHByZWZzX2hhbmRsZSApOwotICAgIAotICAgICAgICByZXR1cm4gUmVzRXJyb3IoKSA9PSBub0VycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3cml0ZVByZWZzUmVzb3VyY2UgKFByZWZzUmVjb3JkICpwcmVmcywgc2hvcnQgcmVzb3VyY2VfZmlsZSkgewotCi0gICAgSGFuZGxlIHByZWZzX2hhbmRsZTsKLSAgICAKLSAgICBVc2VSZXNGaWxlIChyZXNvdXJjZV9maWxlKTsKLSAgICAKLSAgICBwcmVmc19oYW5kbGUgPSBHZXQxUmVzb3VyY2UgKCAnQ0xuZScsIDEyOCApOwotICAgIGlmIChwcmVmc19oYW5kbGUgIT0gTlVMTCkKLSAgICAgICAgUmVtb3ZlUmVzb3VyY2UgKHByZWZzX2hhbmRsZSk7Ci0gICAgCi0gICAgcHJlZnNfaGFuZGxlID0gTmV3SGFuZGxlICggcHJlZnMtPmNvbW1hbmRfbGluZVswXSArIHByZWZzLT52aWRlb19kcml2ZXJfbmFtZVswXSArIDQgKTsKLSAgICBpZiAocHJlZnNfaGFuZGxlICE9IE5VTEwpIHsKLSAgICAKLSAgICAgICAgaW50IG9mZnNldDsKLSAgICAgICAgCi0gICAgICAgIEhMb2NrIChwcmVmc19oYW5kbGUpOwotICAgICAgICAKLSAgICAgICAgLyogQ29tbWFuZCBsaW5lIHRleHQgKi8KLSAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgU0RMX21lbWNweSgqcHJlZnNfaGFuZGxlLCBwcmVmcy0+Y29tbWFuZF9saW5lLCBwcmVmcy0+Y29tbWFuZF9saW5lWzBdICsgMSk7Ci0gICAgICAgIAotICAgICAgICAvKiBWaWRlbyBkcml2ZXIgbmFtZSAqLwotICAgICAgICBvZmZzZXQgKz0gcHJlZnMtPmNvbW1hbmRfbGluZVswXSArIDE7Ci0gICAgICAgIFNETF9tZW1jcHkoKnByZWZzX2hhbmRsZSArIG9mZnNldCwgcHJlZnMtPnZpZGVvX2RyaXZlcl9uYW1lLCBwcmVmcy0+dmlkZW9fZHJpdmVyX25hbWVbMF0gKyAxKTsKLSAgICAgICAgCi0gICAgICAgIC8qIE91dHB1dC10by1maWxlIG9wdGlvbiAqLwotICAgICAgICBvZmZzZXQgKz0gcHJlZnMtPnZpZGVvX2RyaXZlcl9uYW1lWzBdICsgMTsKLSAgICAgICAgKiggKigoY2hhcioqKXByZWZzX2hhbmRsZSkgKyBvZmZzZXQpICAgICA9IChjaGFyKXByZWZzLT5vdXRwdXRfdG9fZmlsZTsKLSAgICAgICAgKiggKigoY2hhcioqKXByZWZzX2hhbmRsZSkgKyBvZmZzZXQgKyAxKSA9IDA7Ci0gICAgICAgICAgICAgIAotICAgICAgICBBZGRSZXNvdXJjZSAgIChwcmVmc19oYW5kbGUsICdDTG5lJywgMTI4LCAiXHBDb21tYW5kIExpbmUiKTsKLSAgICAgICAgV3JpdGVSZXNvdXJjZSAocHJlZnNfaGFuZGxlKTsKLSAgICAgICAgVXBkYXRlUmVzRmlsZSAocmVzb3VyY2VfZmlsZSk7Ci0gICAgICAgIERpc3Bvc2VIYW5kbGUgKHByZWZzX2hhbmRsZSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gUmVzRXJyb3IoKSA9PSBub0VycjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZFByZWZlcmVuY2VzIChQcmVmc1JlY29yZCAqcHJlZnMpIHsKLQotICAgIGludCAgICBub19lcnJvciA9IDE7Ci0gICAgRlNTcGVjIHByZWZzX2ZzcDsKLQotICAgIC8qIENoZWNrIGZvciBwcmVmcyBmaWxlIGZpcnN0ICovCi0gICAgaWYgKCBnZXRQcmVmc0ZpbGUgKCZwcmVmc19mc3AsIDApICkgewotICAgIAotICAgICAgICBzaG9ydCAgcHJlZnNfcmVzb3VyY2U7Ci0gICAgICAgIAotICAgICAgICBwcmVmc19yZXNvdXJjZSA9IEZTcE9wZW5SZXNGaWxlICgmcHJlZnNfZnNwLCBmc1JkUGVybSk7Ci0gICAgICAgIGlmICggcHJlZnNfcmVzb3VyY2UgPT0gLTEgKSAvKiB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLiAqLwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgICAgIFVzZVJlc0ZpbGUgICAocHJlZnNfcmVzb3VyY2UpOwotICAgICAgICBub19lcnJvciA9IHJlYWRQcmVmc1Jlc291cmNlIChwcmVmcyk7ICAgICAKLSAgICAgICAgQ2xvc2VSZXNGaWxlIChwcmVmc19yZXNvdXJjZSk7Ci0gICAgfQotICAgIAotICAgIC8qIEZhbGwgYmFjayB0byBhcHBsaWNhdGlvbidzIHJlc291cmNlIGZvcmsgKHJlYWRpbmcgb25seSwgc28gdGhpcyBpcyBzYWZlKSAqLwotICAgIGVsc2UgewotICAgIAotICAgICAgICAgIG5vX2Vycm9yID0gcmVhZFByZWZzUmVzb3VyY2UgKHByZWZzKTsKLSAgICAgfQotCi0gICAgcmV0dXJuIG5vX2Vycm9yOwotfQotCi1zdGF0aWMgaW50IHdyaXRlUHJlZmVyZW5jZXMgKFByZWZzUmVjb3JkICpwcmVmcykgewotICAgIAotICAgIGludCAgICBub19lcnJvciA9IDE7Ci0gICAgRlNTcGVjIHByZWZzX2ZzcDsKLSAgICAKLSAgICAvKiBHZXQgcHJlZnMgZmlsZSwgY3JlYXRlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgKi8KLSAgICBpZiAoIGdldFByZWZzRmlsZSAoJnByZWZzX2ZzcCwgMSkgKSB7Ci0gICAgCi0gICAgICAgIHNob3J0ICBwcmVmc19yZXNvdXJjZTsKLSAgICAgICAgCi0gICAgICAgIHByZWZzX3Jlc291cmNlID0gRlNwT3BlblJlc0ZpbGUgKCZwcmVmc19mc3AsIGZzUmRXclBlcm0pOwotICAgICAgICBpZiAocHJlZnNfcmVzb3VyY2UgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbm9fZXJyb3IgPSB3cml0ZVByZWZzUmVzb3VyY2UgKHByZWZzLCBwcmVmc19yZXNvdXJjZSk7Ci0gICAgICAgIENsb3NlUmVzRmlsZSAocHJlZnNfcmVzb3VyY2UpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbm9fZXJyb3I7Ci19Ci0KLS8qIFRoaXMgaXMgd2hlcmUgZXhlY3V0aW9uIGJlZ2lucyAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQotI2lmICEoZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pKQotI3ByYWdtYSB1bnVzZWQoYXJnYywgYXJndikKLSNlbmRpZgotCQotI2RlZmluZSBERUZBVUxUX0FSR1MgIlxwIiAgICAgICAgICAgICAgICAvKiBwYXNjYWwgc3RyaW5nIGZvciBkZWZhdWx0IGFyZ3MgKi8KLSNkZWZpbmUgREVGQVVMVF9WSURFT19EUklWRVIgIlxwdG9vbGJveCIgLyogcGFzY2FsIHN0cmluZyBmb3IgZGVmYXVsdCB2aWRlbyBkcml2ZXIgbmFtZSAqLwkKLSNkZWZpbmUgREVGQVVMVF9PVVRQVVRfVE9fRklMRSAxICAgICAgICAgLyogMSA9PSBvdXRwdXQgdG8gZmlsZSwgMCA9PSBubyBvdXRwdXQgKi8KLQotI2RlZmluZSBWSURFT19JRF9EUkFXU1BST0NLRVQgMSAgICAgICAgICAvKiB0aGVzZSBjb3JyZXNwb25kIHRvIHBvcHVwIG1lbnUgY2hvaWNlcyAqLwotI2RlZmluZSBWSURFT19JRF9UT09MQk9YICAgICAgMgotCi0gICAgUHJlZnNSZWNvcmQgcHJlZnMgPSB7IERFRkFVTFRfQVJHUywgREVGQVVMVF9WSURFT19EUklWRVIsIERFRkFVTFRfT1VUUFVUX1RPX0ZJTEUgfTsgCi0JCi0jaWYgIShkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykpCi0JaW50ICAgICBuYXJnczsKLQljaGFyICAgKiphcmdzOwotCWNoYXIgICAqY29tbWFuZExpbmU7Ci0JCi0JU3RyRmlsZU5hbWUgIGFwcE5hbWVUZXh0OwotI2VuZGlmCi0JaW50ICAgICB2aWRlb2RyaXZlciAgICAgPSBWSURFT19JRF9UT09MQk9YOwotICAgIGludCAgICAgc2V0dGluZ3NDaGFuZ2VkID0gMDsKLSAgICAKLSAgICBsb25nCWk7Ci0KLQkvKiBLeWxlJ3MgU0RMIGNvbW1hbmQtbGluZSBkaWFsb2cgY29kZSAuLi4gKi8KLSNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JSW5pdEdyYWYgICAgKCZxZC50aGVQb3J0KTsKLQlJbml0Rm9udHMgICAoKTsKLQlJbml0V2luZG93cyAoKTsKLQlJbml0TWVudXMgICAoKTsKLQlJbml0RGlhbG9ncyAobmlsKTsKLSNlbmRpZgotCUluaXRDdXJzb3IgKCk7Ci0JRmx1c2hFdmVudHMoZXZlcnlFdmVudCwwKTsKLSNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JTWF4QXBwbFpvbmUgKCk7Ci0jZW5kaWYKLQlNb3JlTWFzdGVycyAoKTsKLQlNb3JlTWFzdGVycyAoKTsKLSNpZiAwCi0JLyogSW50aWFsaXplIFNETCwgYW5kIHB1dCB1cCBhIGRpYWxvZyBpZiB3ZSBmYWlsICovCi0JaWYgKCBTRExfSW5pdCAoMCkgPCAwICkgewotCi0jZGVmaW5lIGtFcnJfT0sJCTEKLSNkZWZpbmUga0Vycl9UZXh0CTIKLQotICAgICAgICBEaWFsb2dQdHIgZXJyb3JEaWFsb2c7Ci0gICAgICAgIHNob3J0CSAgZHVtbXlUeXBlOwotICAgIAlSZWN0CSAgZHVtbXlSZWN0OwotCSAgICBIYW5kbGUgICAgZHVtbXlIYW5kbGU7Ci0JICAgIHNob3J0ICAgICBpdGVtSGl0OwotCQotCQllcnJvckRpYWxvZyA9IEdldE5ld0RpYWxvZyAoMTAwMSwgbmlsLCAoV2luZG93UHRyKS0xKTsKLQkJaWYgKGVycm9yRGlhbG9nID09IE5VTEwpCi0JCSAgICByZXR1cm4gLTE7Ci0JCURyYXdEaWFsb2cgKGVycm9yRGlhbG9nKTsKLQkJCi0JCUdldERpYWxvZ0l0ZW0gKGVycm9yRGlhbG9nLCBrRXJyX1RleHQsICZkdW1teVR5cGUsICZkdW1teUhhbmRsZSwgJmR1bW15UmVjdCk7Ci0JCVNldERpYWxvZ0l0ZW1UZXh0IChkdW1teUhhbmRsZSwgIlxwRXJyb3IgSW5pdGlhbGl6aW5nIFNETCIpOwotCQkKLSNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLQkJU2V0UG9ydCAoR2V0RGlhbG9nUG9ydChlcnJvckRpYWxvZykpOwotI2Vsc2UKLQkJU2V0UG9ydCAoZXJyb3JEaWFsb2cpOwotI2VuZGlmCi0JCWRvIHsKLQkJCU1vZGFsRGlhbG9nIChuaWwsICZpdGVtSGl0KTsKLQkJfSB3aGlsZSAoaXRlbUhpdCAhPSBrRXJyX09LKTsKLQkJCi0JCURpc3Bvc2VEaWFsb2cgKGVycm9yRGlhbG9nKTsKLQkJZXhpdCAoLTEpOwotCX0KLQlhdGV4aXQoY2xlYW51cF9vdXRwdXQpOwotCWF0ZXhpdChTRExfUXVpdCk7Ci0jZW5kaWYKLQotLyogU2V0IHVwIFNETCdzIFF1aWNrRHJhdyBlbnZpcm9ubWVudCAgKi8KLSNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JU0RMX0luaXRRdWlja0RyYXcoJnFkKTsKLSNlbmRpZgotCi0JIGlmICggcmVhZFByZWZlcmVuY2VzICgmcHJlZnMpICkgewotCQkKLSAgICAgICAgaWYgKFNETF9tZW1jbXAocHJlZnMudmlkZW9fZHJpdmVyX25hbWUrMSwgIkRTcCIsIDMpID09IDApCi0gICAgICAgICAgICB2aWRlb2RyaXZlciA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKFNETF9tZW1jbXAocHJlZnMudmlkZW9fZHJpdmVyX25hbWUrMSwgInRvb2xib3giLCA3KSA9PSAwKQotICAgICAgICAgICAgdmlkZW9kcml2ZXIgPSAyOwotCSB9Ci0JIAkKLQlpZiAoIENvbW1hbmRLZXlJc0Rvd24oKSApIHsKLQotI2RlZmluZSBrQ0xfT0sJCTEKLSNkZWZpbmUga0NMX0NhbmNlbAkyCi0jZGVmaW5lIGtDTF9UZXh0CTMKLSNkZWZpbmUga0NMX0ZpbGUJNAotI2RlZmluZSBrQ0xfVmlkZW8gICA2Ci0gICAgICAgCi0gICAgICAgIERpYWxvZ1B0ciBjb21tYW5kRGlhbG9nOwotICAgICAgICBzaG9ydAkgIGR1bW15VHlwZTsKLSAgICAgICAgUmVjdAkgIGR1bW15UmVjdDsKLSAgICAgICAgSGFuZGxlICAgIGR1bW15SGFuZGxlOwotICAgICAgICBzaG9ydCAgICAgaXRlbUhpdDsKLSAgICNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLSAgICAgICAgQ29udHJvbFJlZiBjb250cm9sOwotICAgI2VuZGlmCi0gICAgICAgIAotICAgICAgICAvKiBBc3N1bWUgdGhhdCB0aGV5IHdpbGwgY2hhbmdlIHNldHRpbmdzLCByYXRoZXIgdGhhbiBkbyBleGhhdXN0aXZlIGNoZWNrICovCi0gICAgICAgIHNldHRpbmdzQ2hhbmdlZCA9IDE7Ci0gICAgICAgIAotICAgICAgICAvKiBDcmVhdGUgZGlhbG9nIGFuZCBkaXNwbGF5IGl0ICovCi0gICAgICAgIGNvbW1hbmREaWFsb2cgPSBHZXROZXdEaWFsb2cgKDEwMDAsIG5pbCwgKFdpbmRvd1B0ciktMSk7Ci0gICAgI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgotICAgICAgICBTZXRQb3J0ICggR2V0RGlhbG9nUG9ydChjb21tYW5kRGlhbG9nKSApOwotICAgICNlbHNlCi0gICAgICAgIFNldFBvcnQgKGNvbW1hbmREaWFsb2cpOwotICAgICAjZW5kaWYKLSAgICAgICAgICAgCi0gICAgICAgIC8qIFNldHVwIGNvbnRyb2xzICovCi0gICAgI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgotICAgICAgICBHZXREaWFsb2dJdGVtQXNDb250cm9sKGNvbW1hbmREaWFsb2csIGtDTF9GaWxlLCAmY29udHJvbCk7Ci0gICAgICAgIFNldENvbnRyb2xWYWx1ZSAoY29udHJvbCwgcHJlZnMub3V0cHV0X3RvX2ZpbGUpOwotICAgICNlbHNlCi0gICAgICAgIEdldERpYWxvZ0l0ZW0gICAoY29tbWFuZERpYWxvZywga0NMX0ZpbGUsICZkdW1teVR5cGUsICZkdW1teUhhbmRsZSwgJmR1bW15UmVjdCk7IC8qIE1KUyAqLwotICAgICAgICBTZXRDb250cm9sVmFsdWUgKChDb250cm9sSGFuZGxlKWR1bW15SGFuZGxlLCBwcmVmcy5vdXRwdXRfdG9fZmlsZSApOwotICAgICNlbmRpZgotCi0gICAgICAgIEdldERpYWxvZ0l0ZW0gICAgIChjb21tYW5kRGlhbG9nLCBrQ0xfVGV4dCwgJmR1bW15VHlwZSwgJmR1bW15SGFuZGxlLCAmZHVtbXlSZWN0KTsKLSAgICAgICAgU2V0RGlhbG9nSXRlbVRleHQgKGR1bW15SGFuZGxlLCBwcmVmcy5jb21tYW5kX2xpbmUpOwotCi0gICAgI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgotICAgICAgICBHZXREaWFsb2dJdGVtQXNDb250cm9sKGNvbW1hbmREaWFsb2csIGtDTF9WaWRlbywgJmNvbnRyb2wpOwotICAgICAgICBTZXRDb250cm9sVmFsdWUgKGNvbnRyb2wsIHZpZGVvZHJpdmVyKTsKLSAgICNlbHNlCi0gICAgICAgIEdldERpYWxvZ0l0ZW0gICAoY29tbWFuZERpYWxvZywga0NMX1ZpZGVvLCAmZHVtbXlUeXBlLCAmZHVtbXlIYW5kbGUsICZkdW1teVJlY3QpOwotICAgICAgICBTZXRDb250cm9sVmFsdWUgKChDb250cm9sUmVmKWR1bW15SGFuZGxlLCB2aWRlb2RyaXZlcik7Ci0gICAgICNlbmRpZgotCi0gICAgICAgIFNldERpYWxvZ0RlZmF1bHRJdGVtIChjb21tYW5kRGlhbG9nLCBrQ0xfT0spOwotICAgICAgICBTZXREaWFsb2dDYW5jZWxJdGVtICAoY29tbWFuZERpYWxvZywga0NMX0NhbmNlbCk7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAJCQotICAgICAgICAJTW9kYWxEaWFsb2cobmlsLCAmaXRlbUhpdCk7IC8qIHdhaXQgZm9yIHVzZXIgcmVzcG9uc2UgKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogVG9nZ2xlIGNvbW1hbmQtbGluZSBvdXRwdXQgY2hlY2tib3ggKi8JCi0gICAgICAgIAlpZiAoIGl0ZW1IaXQgPT0ga0NMX0ZpbGUgKSB7Ci0gICAgICAgICNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLSAgICAgICAgCQlHZXREaWFsb2dJdGVtQXNDb250cm9sKGNvbW1hbmREaWFsb2csIGtDTF9GaWxlLCAmY29udHJvbCk7Ci0gICAgICAgIAkJU2V0Q29udHJvbFZhbHVlIChjb250cm9sLCAhR2V0Q29udHJvbFZhbHVlKGNvbnRyb2wpKTsKLSAgICAgICAgI2Vsc2UKLSAgICAgICAgCQlHZXREaWFsb2dJdGVtKGNvbW1hbmREaWFsb2csIGtDTF9GaWxlLCAmZHVtbXlUeXBlLCAmZHVtbXlIYW5kbGUsICZkdW1teVJlY3QpOyAvKiBNSlMgKi8KLSAgICAgICAgCQlTZXRDb250cm9sVmFsdWUoKENvbnRyb2xIYW5kbGUpZHVtbXlIYW5kbGUsICFHZXRDb250cm9sVmFsdWUoKENvbnRyb2xIYW5kbGUpZHVtbXlIYW5kbGUpICk7Ci0gICAgICAgICNlbmRpZgotICAgICAgICAJfQotCi0gICAgICAgIH0gd2hpbGUgKGl0ZW1IaXQgIT0ga0NMX09LICYmIGl0ZW1IaXQgIT0ga0NMX0NhbmNlbCk7Ci0KLSAgICAgICAgLyogR2V0IGNvbnRyb2wgdmFsdWVzLCBldmVuIGlmIHRoZXkgZGlkIG5vdCBjaGFuZ2UgKi8KLSAgICAgICAgR2V0RGlhbG9nSXRlbSAgICAgKGNvbW1hbmREaWFsb2csIGtDTF9UZXh0LCAmZHVtbXlUeXBlLCAmZHVtbXlIYW5kbGUsICZkdW1teVJlY3QpOyAvKiBNSlMgKi8KLSAgICAgICAgR2V0RGlhbG9nSXRlbVRleHQgKGR1bW15SGFuZGxlLCBwcmVmcy5jb21tYW5kX2xpbmUpOwotCi0gICAgI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgotICAgICAgICBHZXREaWFsb2dJdGVtQXNDb250cm9sKGNvbW1hbmREaWFsb2csIGtDTF9GaWxlLCAmY29udHJvbCk7Ci0gICAgICAgIHByZWZzLm91dHB1dF90b19maWxlID0gR2V0Q29udHJvbFZhbHVlKGNvbnRyb2wpOwotCSNlbHNlCi0gICAgICAgIEdldERpYWxvZ0l0ZW0gKGNvbW1hbmREaWFsb2csIGtDTF9GaWxlLCAmZHVtbXlUeXBlLCAmZHVtbXlIYW5kbGUsICZkdW1teVJlY3QpOyAvKiBNSlMgKi8KLSAgICAgICAgcHJlZnMub3V0cHV0X3RvX2ZpbGUgPSBHZXRDb250cm9sVmFsdWUgKChDb250cm9sSGFuZGxlKWR1bW15SGFuZGxlKTsKLSAJI2VuZGlmCi0KLSAgICAjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0gICAgICAgIEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woY29tbWFuZERpYWxvZywga0NMX1ZpZGVvLCAmY29udHJvbCk7Ci0gICAgICAgIHZpZGVvZHJpdmVyID0gR2V0Q29udHJvbFZhbHVlKGNvbnRyb2wpOwotICAgICNlbHNlCi0gICAgICAgIEdldERpYWxvZ0l0ZW0gKGNvbW1hbmREaWFsb2csIGtDTF9WaWRlbywgJmR1bW15VHlwZSwgJmR1bW15SGFuZGxlLCAmZHVtbXlSZWN0KTsKLSAgICAgICAgdmlkZW9kcml2ZXIgPSBHZXRDb250cm9sVmFsdWUgKChDb250cm9sUmVmKWR1bW15SGFuZGxlKTsKLSAgICAgI2VuZGlmCi0KLSAgICAgICAgRGlzcG9zZURpYWxvZyAoY29tbWFuZERpYWxvZyk7Ci0KLSAgICAgICAgaWYgKGl0ZW1IaXQgPT0ga0NMX0NhbmNlbCApIHsKLSAgICAgICAgCWV4aXQgKDApOwotICAgICAgICB9Ci0JfQotICAgIAotICAgIC8qIFNldCBwc2V1ZG8tZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB2aWRlbyBkcml2ZXIsIHVwZGF0ZSBwcmVmcyAqLwotCXN3aXRjaCAoIHZpZGVvZHJpdmVyICkgewotCSAgIGNhc2UgVklERU9fSURfRFJBV1NQUk9DS0VUOiAKLQkgICAgICBTRExfcHV0ZW52KCJTRExfVklERU9EUklWRVI9RFNwIik7Ci0JICAgICAgU0RMX21lbWNweShwcmVmcy52aWRlb19kcml2ZXJfbmFtZSwgIlxwRFNwIiwgNCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgY2FzZSBWSURFT19JRF9UT09MQk9YOgotCSAgICAgIFNETF9wdXRlbnYoIlNETF9WSURFT0RSSVZFUj10b29sYm94Iik7Ci0JICAgICAgU0RMX21lbWNweShwcmVmcy52aWRlb19kcml2ZXJfbmFtZSwgIlxwdG9vbGJveCIsIDgpOwotCSAgICAgIGJyZWFrOwotCX0KLQotI2lmICEoZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pKQotICAgIC8qIFJlZGlyZWN0IHN0YW5kYXJkIEkvTyB0byBmaWxlcyAqLwotCWlmICggcHJlZnMub3V0cHV0X3RvX2ZpbGUgKSB7Ci0JCWZyZW9wZW4gKFNURE9VVF9GSUxFLCAidyIsIHN0ZG91dCk7Ci0JCWZyZW9wZW4gKFNUREVSUl9GSUxFLCAidyIsIHN0ZGVycik7Ci0JfSBlbHNlIHsKLQkJZmNsb3NlIChzdGRvdXQpOwotCQlmY2xvc2UgKHN0ZGVycik7Ci0JfQotI2VuZGlmCi0gICAKLSAgICBpZiAoc2V0dGluZ3NDaGFuZ2VkKSB7Ci0gICAgICAgIC8qIFNhdmUgdGhlIHByZWZzLCBldmVuIGlmIHRoZXkgbWlnaHQgbm90IGhhdmUgY2hhbmdlZCAoYnV0IHByb2JhYmx5IGRpZCkgKi8KLSAgICAgICAgaWYgKCAhIHdyaXRlUHJlZmVyZW5jZXMgKCZwcmVmcykgKQotICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiV0FSTklORzogQ291bGQgbm90IHNhdmUgcHJlZmVyZW5jZXMhXG4iKTsKLSAgICB9Ci0gICAKLSNpZiAhKGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKSkKLSAgICBhcHBOYW1lVGV4dFswXSA9IDA7Ci0gICAgZ2V0Q3VycmVudEFwcE5hbWUgKGFwcE5hbWVUZXh0KTsgLyogY2hlY2sgZm9yIGVycm9yIGhlcmUgPyAqLwotCi0gICAgY29tbWFuZExpbmUgPSAoY2hhciopIG1hbGxvYyAoYXBwTmFtZVRleHRbMF0gKyBwcmVmcy5jb21tYW5kX2xpbmVbMF0gKyAyKTsKLSAgICBpZiAoIGNvbW1hbmRMaW5lID09IE5VTEwgKSB7Ci0gICAgICAgZXhpdCgtMSk7Ci0gICAgfQotCi0gICAgLyogUmF0aGVyIHRoYW4gcmV3cml0ZSBQYXJzZUNvbW1hbmRMaW5lIG1ldGhvZCwgbGV0J3MgcmVwbGFjZSAgKi8KLSAgICAvKiBhbnkgc3BhY2VzIGluIGFwcGxpY2F0aW9uIG5hbWUgd2l0aCB1bmRlcnNjb3JlcywgICAgICAgICAgICAqLwotICAgIC8qIHNvIHRoYXQgdGhlIGFwcCBuYW1lIGlzIG9ubHkgMSBhcmd1bWVudCAgICAgICAgICAgICAgICAgICAgICovICAgCi0gICAgZm9yIChpID0gMTsgaSA8IDErYXBwTmFtZVRleHRbMF07IGkrKykKLSAgICAgICAgaWYgKCBhcHBOYW1lVGV4dFtpXSA9PSAnICcgKSBhcHBOYW1lVGV4dFtpXSA9ICdfJzsKLQotICAgIC8qIENvcHkgYXBwIG5hbWUgJiBmdWxsIGNvbW1hbmQgdGV4dCB0byBjb21tYW5kLWxpbmUgQy1zdHJpbmcgKi8gICAgICAKLSAgICBTRExfbWVtY3B5KGNvbW1hbmRMaW5lLCBhcHBOYW1lVGV4dCArIDEsIGFwcE5hbWVUZXh0WzBdKTsKLSAgICBjb21tYW5kTGluZVthcHBOYW1lVGV4dFswXV0gPSAnICc7Ci0gICAgU0RMX21lbWNweShjb21tYW5kTGluZSArIGFwcE5hbWVUZXh0WzBdICsgMSwgcHJlZnMuY29tbWFuZF9saW5lICsgMSwgcHJlZnMuY29tbWFuZF9saW5lWzBdKTsKLSAgICBjb21tYW5kTGluZVsgYXBwTmFtZVRleHRbMF0gKyAxICsgcHJlZnMuY29tbWFuZF9saW5lWzBdIF0gPSAnXDAnOwotCi0gICAgLyogUGFyc2UgQy1zdHJpbmcgaW50byBhcmd2IGFuZCBhcmdjICovCi0gICAgbmFyZ3MgPSBQYXJzZUNvbW1hbmRMaW5lIChjb21tYW5kTGluZSwgTlVMTCk7Ci0gICAgYXJncyA9IChjaGFyICoqKW1hbGxvYygobmFyZ3MrMSkqKHNpemVvZiAqYXJncykpOwotICAgIGlmICggYXJncyA9PSBOVUxMICkgewotCQlleGl0KC0xKTsKLQl9Ci0JUGFyc2VDb21tYW5kTGluZSAoY29tbWFuZExpbmUsIGFyZ3MpOwotICAgICAgICAKLQkvKiBSdW4gdGhlIG1haW4gYXBwbGljYXRpb24gY29kZSAqLwotCVNETF9tYWluKG5hcmdzLCBhcmdzKTsKLQlmcmVlIChhcmdzKTsKLQlmcmVlIChjb21tYW5kTGluZSk7Ci0gICAKLSAgIAkvKiBSZW1vdmUgdXNlbGVzcyBzdGRvdXQudHh0IGFuZCBzdGRlcnIudHh0ICovCi0gICAJY2xlYW51cF9vdXRwdXQgKCk7Ci0jZWxzZSAvLyBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKLQlTRExfbWFpbihhcmdjLCBhcmd2KTsKLSNlbmRpZgotICAgCQotCS8qIEV4aXQgY2xlYW5seSwgY2FsbGluZyBhdGV4aXQoKSBmdW5jdGlvbnMgKi8KLQlleGl0ICgwKTsgICAgCi0KLQkvKiBOZXZlciByZWFjaGVkLCBidXQga2VlcHMgdGhlIGNvbXBpbGVyIHF1aWV0ICovCi0JcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9tYWNvcy9TSVpFLnIgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3MvU0laRS5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWNkOTQyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9tYWNvcy9TSVpFLnIKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0KLSNpbmNsdWRlICJQcm9jZXNzZXMuciIKLQotcmVzb3VyY2UgJ1NJWkUnICgtMSkgewotCXJlc2VydmVkLAotCWFjY2VwdFN1c3BlbmRSZXN1bWVFdmVudHMsCi0JcmVzZXJ2ZWQsCi0JY2FuQmFja2dyb3VuZCwKLQlkb2VzQWN0aXZhdGVPbkZHU3dpdGNoLAotCWJhY2tncm91bmRBbmRGb3JlZ3JvdW5kLAotCWdldEZyb250Q2xpY2tzLAotCWlnbm9yZUFwcERpZWRFdmVudHMsCi0JaXMzMkJpdENvbXBhdGlibGUsCi0JaXNIaWdoTGV2ZWxFdmVudEF3YXJlLAotCW9ubHlMb2NhbEhMRXZlbnRzLAotCW5vdFN0YXRpb25lcnlBd2FyZSwKLQl1c2VUZXh0RWRpdFNlcnZpY2VzLAotCXJlc2VydmVkLAotCXJlc2VydmVkLAotCXJlc2VydmVkLAotCTUyNDI4ODAsCQkvLyA1IG1lZ3MgbWluaW11bQotCTUyNDI4ODAJCQkvLyA1IG1lZ3MgbWF4aW11bQotfTsKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zL2V4cG9ydHMvTWFrZWZpbGUgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3MvZXhwb3J0cy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkNzlmZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3MvZXhwb3J0cy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLQotRVhQT1JUUyA9IFNETC54Ci1IRUFERVJTID0gXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMLmggXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX2FjdGl2ZS5oIFwKLQkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9hdWRpby5oIFwKLQkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9jZHJvbS5oIFwKLQkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9jb3B5aW5nLmggXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX2NwdWluZm8uaCBcCi0JLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfZW5kaWFuLmggXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX2Vycm9yLmggXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX2V2ZW50cy5oIFwKLQkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9qb3lzdGljay5oIFwKLQkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9rZXlib2FyZC5oIFwKLQkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9rZXlzeW0uaCBcCi0JLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfbG9hZHNvLmggXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX21vdXNlLmggXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX211dGV4LmggXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX3F1aXQuaCBcCi0JLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfcndvcHMuaCBcCi0JLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfc3lzd20uaCBcCi0JLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfdGhyZWFkLmggXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX3RpbWVyLmggXAotCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX3ZlcnNpb24uaCBcCi0JLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfdmlkZW8uaAotCi0KLWFsbDogJChFWFBPUlRTKQotCi0kKEVYUE9SVFMpOiBNYWtlZmlsZSBnZW5kZWYucGwgJChIRUFERVJTKQotCXBlcmwgZ2VuZGVmLnBsICQoSEVBREVSUykgPiRAIHx8IHJtICRACi0KLWNsZWFuOgotCXJtIC1mICQoRVhQT1JUUykKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9tYWNvcy9leHBvcnRzL1NETC54IGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zL2V4cG9ydHMvU0RMLngKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGI3YTQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zL2V4cG9ydHMvU0RMLngKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotCVNETF9Jbml0Ci0JU0RMX0luaXRTdWJTeXN0ZW0KLQlTRExfUXVpdFN1YlN5c3RlbQotCVNETF9XYXNJbml0Ci0JU0RMX1F1aXQKLQlTRExfR2V0QXBwU3RhdGUKLQlTRExfQXVkaW9Jbml0Ci0JU0RMX0F1ZGlvUXVpdAotCVNETF9BdWRpb0RyaXZlck5hbWUKLQlTRExfT3BlbkF1ZGlvCi0JU0RMX0dldEF1ZGlvU3RhdHVzCi0JU0RMX1BhdXNlQXVkaW8KLQlTRExfTG9hZFdBVl9SVwotCVNETF9GcmVlV0FWCi0JU0RMX0J1aWxkQXVkaW9DVlQKLQlTRExfQ29udmVydEF1ZGlvCi0JU0RMX01peEF1ZGlvCi0JU0RMX0xvY2tBdWRpbwotCVNETF9VbmxvY2tBdWRpbwotCVNETF9DbG9zZUF1ZGlvCi0JU0RMX0NETnVtRHJpdmVzCi0JU0RMX0NETmFtZQotCVNETF9DRE9wZW4KLQlTRExfQ0RTdGF0dXMKLQlTRExfQ0RQbGF5VHJhY2tzCi0JU0RMX0NEUGxheQotCVNETF9DRFBhdXNlCi0JU0RMX0NEUmVzdW1lCi0JU0RMX0NEU3RvcAotCVNETF9DREVqZWN0Ci0JU0RMX0NEQ2xvc2UKLQlTRExfSGFzUkRUU0MKLQlTRExfSGFzTU1YCi0JU0RMX0hhc01NWEV4dAotCVNETF9IYXMzRE5vdwotCVNETF9IYXMzRE5vd0V4dAotCVNETF9IYXNTU0UKLQlTRExfSGFzU1NFMgotCVNETF9IYXNBbHRpVmVjCi0JU0RMX1NldEVycm9yCi0JU0RMX0dldEVycm9yCi0JU0RMX0NsZWFyRXJyb3IKLQlTRExfRXJyb3IKLQlTRExfUHVtcEV2ZW50cwotCVNETF9QZWVwRXZlbnRzCi0JU0RMX1BvbGxFdmVudAotCVNETF9XYWl0RXZlbnQKLQlTRExfUHVzaEV2ZW50Ci0JU0RMX1NldEV2ZW50RmlsdGVyCi0JU0RMX0dldEV2ZW50RmlsdGVyCi0JU0RMX0V2ZW50U3RhdGUKLQlTRExfTnVtSm95c3RpY2tzCi0JU0RMX0pveXN0aWNrTmFtZQotCVNETF9Kb3lzdGlja09wZW4KLQlTRExfSm95c3RpY2tPcGVuZWQKLQlTRExfSm95c3RpY2tJbmRleAotCVNETF9Kb3lzdGlja051bUF4ZXMKLQlTRExfSm95c3RpY2tOdW1CYWxscwotCVNETF9Kb3lzdGlja051bUhhdHMKLQlTRExfSm95c3RpY2tOdW1CdXR0b25zCi0JU0RMX0pveXN0aWNrVXBkYXRlCi0JU0RMX0pveXN0aWNrRXZlbnRTdGF0ZQotCVNETF9Kb3lzdGlja0dldEF4aXMKLQlTRExfSm95c3RpY2tHZXRIYXQKLQlTRExfSm95c3RpY2tHZXRCYWxsCi0JU0RMX0pveXN0aWNrR2V0QnV0dG9uCi0JU0RMX0pveXN0aWNrQ2xvc2UKLQlTRExfRW5hYmxlVU5JQ09ERQotCVNETF9FbmFibGVLZXlSZXBlYXQKLQlTRExfR2V0S2V5UmVwZWF0Ci0JU0RMX0dldEtleVN0YXRlCi0JU0RMX0dldE1vZFN0YXRlCi0JU0RMX1NldE1vZFN0YXRlCi0JU0RMX0dldEtleU5hbWUKLQlTRExfTG9hZE9iamVjdAotCVNETF9Mb2FkRnVuY3Rpb24KLQlTRExfVW5sb2FkT2JqZWN0Ci0JU0RMX0dldE1vdXNlU3RhdGUKLQlTRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlCi0JU0RMX1dhcnBNb3VzZQotCVNETF9DcmVhdGVDdXJzb3IKLQlTRExfU2V0Q3Vyc29yCi0JU0RMX0dldEN1cnNvcgotCVNETF9GcmVlQ3Vyc29yCi0JU0RMX1Nob3dDdXJzb3IKLQlTRExfQ3JlYXRlTXV0ZXgKLQlTRExfbXV0ZXhQCi0JU0RMX211dGV4VgotCVNETF9EZXN0cm95TXV0ZXgKLQlTRExfQ3JlYXRlU2VtYXBob3JlCi0JU0RMX0Rlc3Ryb3lTZW1hcGhvcmUKLQlTRExfU2VtV2FpdAotCVNETF9TZW1UcnlXYWl0Ci0JU0RMX1NlbVdhaXRUaW1lb3V0Ci0JU0RMX1NlbVBvc3QKLQlTRExfU2VtVmFsdWUKLQlTRExfQ3JlYXRlQ29uZAotCVNETF9EZXN0cm95Q29uZAotCVNETF9Db25kU2lnbmFsCi0JU0RMX0NvbmRCcm9hZGNhc3QKLQlTRExfQ29uZFdhaXQKLQlTRExfQ29uZFdhaXRUaW1lb3V0Ci0JU0RMX1JXRnJvbUZpbGUKLQlTRExfUldGcm9tRlAKLQlTRExfUldGcm9tTWVtCi0JU0RMX1JXRnJvbUNvbnN0TWVtCi0JU0RMX0FsbG9jUlcKLQlTRExfRnJlZVJXCi0JU0RMX1JlYWRMRTE2Ci0JU0RMX1JlYWRCRTE2Ci0JU0RMX1JlYWRMRTMyCi0JU0RMX1JlYWRCRTMyCi0JU0RMX1JlYWRMRTY0Ci0JU0RMX1JlYWRCRTY0Ci0JU0RMX1dyaXRlTEUxNgotCVNETF9Xcml0ZUJFMTYKLQlTRExfV3JpdGVMRTMyCi0JU0RMX1dyaXRlQkUzMgotCVNETF9Xcml0ZUxFNjQKLQlTRExfV3JpdGVCRTY0Ci0JU0RMX0dldFdNSW5mbwotCVNETF9DcmVhdGVUaHJlYWQKLQlTRExfQ3JlYXRlVGhyZWFkCi0JU0RMX1RocmVhZElECi0JU0RMX0dldFRocmVhZElECi0JU0RMX1dhaXRUaHJlYWQKLQlTRExfS2lsbFRocmVhZAotCVNETF9HZXRUaWNrcwotCVNETF9EZWxheQotCVNETF9TZXRUaW1lcgotCVNETF9BZGRUaW1lcgotCVNETF9SZW1vdmVUaW1lcgotCVNETF9MaW5rZWRfVmVyc2lvbgotCVNETF9WaWRlb0luaXQKLQlTRExfVmlkZW9RdWl0Ci0JU0RMX1ZpZGVvRHJpdmVyTmFtZQotCVNETF9HZXRWaWRlb1N1cmZhY2UKLQlTRExfR2V0VmlkZW9JbmZvCi0JU0RMX1ZpZGVvTW9kZU9LCi0JU0RMX0xpc3RNb2RlcwotCVNETF9TZXRWaWRlb01vZGUKLQlTRExfVXBkYXRlUmVjdHMKLQlTRExfVXBkYXRlUmVjdAotCVNETF9GbGlwCi0JU0RMX1NldEdhbW1hCi0JU0RMX1NldEdhbW1hUmFtcAotCVNETF9HZXRHYW1tYVJhbXAKLQlTRExfU2V0Q29sb3JzCi0JU0RMX1NldFBhbGV0dGUKLQlTRExfTWFwUkdCCi0JU0RMX01hcFJHQkEKLQlTRExfR2V0UkdCCi0JU0RMX0dldFJHQkEKLQlTRExfQ3JlYXRlUkdCU3VyZmFjZQotCVNETF9DcmVhdGVSR0JTdXJmYWNlRnJvbQotCVNETF9GcmVlU3VyZmFjZQotCVNETF9Mb2NrU3VyZmFjZQotCVNETF9VbmxvY2tTdXJmYWNlCi0JU0RMX0xvYWRCTVBfUlcKLQlTRExfU2F2ZUJNUF9SVwotCVNETF9TZXRDb2xvcktleQotCVNETF9TZXRBbHBoYQotCVNETF9TZXRDbGlwUmVjdAotCVNETF9HZXRDbGlwUmVjdAotCVNETF9Db252ZXJ0U3VyZmFjZQotCVNETF9VcHBlckJsaXQKLQlTRExfTG93ZXJCbGl0Ci0JU0RMX0ZpbGxSZWN0Ci0JU0RMX0Rpc3BsYXlGb3JtYXQKLQlTRExfRGlzcGxheUZvcm1hdEFscGhhCi0JU0RMX0NyZWF0ZVlVVk92ZXJsYXkKLQlTRExfTG9ja1lVVk92ZXJsYXkKLQlTRExfVW5sb2NrWVVWT3ZlcmxheQotCVNETF9EaXNwbGF5WVVWT3ZlcmxheQotCVNETF9GcmVlWVVWT3ZlcmxheQotCVNETF9HTF9Mb2FkTGlicmFyeQotCVNETF9HTF9HZXRQcm9jQWRkcmVzcwotCVNETF9HTF9TZXRBdHRyaWJ1dGUKLQlTRExfR0xfR2V0QXR0cmlidXRlCi0JU0RMX0dMX1N3YXBCdWZmZXJzCi0JU0RMX0dMX1VwZGF0ZVJlY3RzCi0JU0RMX0dMX0xvY2sKLQlTRExfR0xfVW5sb2NrCi0JU0RMX1dNX1NldENhcHRpb24KLQlTRExfV01fR2V0Q2FwdGlvbgotCVNETF9XTV9TZXRJY29uCi0JU0RMX1dNX0ljb25pZnlXaW5kb3cKLQlTRExfV01fVG9nZ2xlRnVsbFNjcmVlbgotCVNETF9XTV9HcmFiSW5wdXQKLQlTRExfU29mdFN0cmV0Y2gKLQlTRExfcHV0ZW52Ci0JU0RMX2dldGVudgotCVNETF9xc29ydAotCVNETF9yZXZjcHkKLQlTRExfc3RybGNweQotCVNETF9zdHJsY2F0Ci0JU0RMX3N0cmR1cAotCVNETF9zdHJyZXYKLQlTRExfc3RydXByCi0JU0RMX3N0cmx3cgotCVNETF9sdG9hCi0JU0RMX3VsdG9hCi0JU0RMX3N0cmNhc2VjbXAKLQlTRExfc3RybmNhc2VjbXAKLQlTRExfc25wcmludGYKLQlTRExfdnNucHJpbnRmCi0JU0RMX2ljb252Ci0JU0RMX2ljb252X3N0cmluZwotCVNETF9Jbml0UXVpY2tEcmF3CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3MvZXhwb3J0cy9nZW5kZWYucGwgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3MvZXhwb3J0cy9nZW5kZWYucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzM5NGIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zL2V4cG9ydHMvZ2VuZGVmLnBsCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIFByb2dyYW0gdG8gdGFrZSBhIHNldCBvZiBoZWFkZXIgZmlsZXMgYW5kIGdlbmVyYXRlIERMTCBleHBvcnQgZGVmaW5pdGlvbnMKLQotIyBTcGVjaWFsIGV4cG9ydHMgdG8gaWdub3JlIGZvciB0aGlzIHBsYXRmb3JtCi0KLXdoaWxlICggKCRmaWxlID0gc2hpZnQoQEFSR1YpKSApIHsKLQlpZiAoICEgZGVmaW5lZChvcGVuKEZJTEUsICRmaWxlKSkgKSB7Ci0JCXdhcm4gIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOwotCQluZXh0OwotCX0KLQkkcHJpbnRlZF9oZWFkZXIgPSAwOwotCSRmaWxlID1+IHMsLiovLCw7Ci0Jd2hpbGUgKDxGSUxFPikgewotCQlpZiAoIC8gREVDTFNQRUMuKiBTRExDQUxMIChbXlxzXChdKykvICkgewotCQkJaWYgKCBub3QgJGV4Y2x1ZGV7JDF9ICkgewotCQkJCXByaW50ICJcdCQxXG4iOwotCQkJfQotCQl9Ci0JfQotCWNsb3NlKEZJTEUpOwotfQotCi0jIFNwZWNpYWwgZXhwb3J0cyB0byBpbmNsdWRlIGZvciB0aGlzIHBsYXRmb3JtCi1wcmludCAiXHRTRExfcHV0ZW52XG4iOwotcHJpbnQgIlx0U0RMX2dldGVudlxuIjsKLXByaW50ICJcdFNETF9xc29ydFxuIjsKLXByaW50ICJcdFNETF9yZXZjcHlcbiI7Ci1wcmludCAiXHRTRExfc3RybGNweVxuIjsKLXByaW50ICJcdFNETF9zdHJsY2F0XG4iOwotcHJpbnQgIlx0U0RMX3N0cmR1cFxuIjsKLXByaW50ICJcdFNETF9zdHJyZXZcbiI7Ci1wcmludCAiXHRTRExfc3RydXByXG4iOwotcHJpbnQgIlx0U0RMX3N0cmx3clxuIjsKLXByaW50ICJcdFNETF9sdG9hXG4iOwotcHJpbnQgIlx0U0RMX3VsdG9hXG4iOwotcHJpbnQgIlx0U0RMX3N0cmNhc2VjbXBcbiI7Ci1wcmludCAiXHRTRExfc3RybmNhc2VjbXBcbiI7Ci1wcmludCAiXHRTRExfc25wcmludGZcbiI7Ci1wcmludCAiXHRTRExfdnNucHJpbnRmXG4iOwotcHJpbnQgIlx0U0RMX2ljb252XG4iOwotcHJpbnQgIlx0U0RMX2ljb252X3N0cmluZ1xuIjsKLXByaW50ICJcdFNETF9Jbml0UXVpY2tEcmF3XG4iOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zeC9TRExNYWluLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3N4L1NETE1haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4M2RmNS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3N4L1NETE1haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAotICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KLSAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KLQotICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcwotKi8KLQotI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KLQotQGludGVyZmFjZSBTRExNYWluIDogTlNPYmplY3QKLUBlbmQKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9tYWNvc3gvU0RMTWFpbi5tIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zeC9TRExNYWluLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiODllZTguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zeC9TRExNYWluLm0KKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyogICBTRExNYWluLm0gLSBtYWluIGVudHJ5IHBvaW50IGZvciBvdXIgQ29jb2EtaXplZCBTREwgYXBwCi0gICAgICAgSW5pdGlhbCBWZXJzaW9uOiBEYXJyZWxsIFdhbGlzc2VyIDxkd2FsaXNzMUBwdXJkdWUuZWR1PgotICAgICAgIE5vbi1OSUItQ29kZSAmIG90aGVyIGNoYW5nZXM6IE1heCBIb3JuIDxtYXhAcXVlbmRpLmRlPgotCi0gICAgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzCi0qLwotCi0jaW1wb3J0ICJTREwuaCIKLSNpbXBvcnQgIlNETE1haW4uaCIKLSNpbXBvcnQgPHN5cy9wYXJhbS5oPiAvKiBmb3IgTUFYUEFUSExFTiAqLwotI2ltcG9ydCA8dW5pc3RkLmg+Ci0KLS8qIEZvciBzb21lIHJlYW9uLCBBcHBsZSByZW1vdmVkIHNldEFwcGxlTWVudSBmcm9tIHRoZSBoZWFkZXJzIGluIDEwLjQsCi0gYnV0IHRoZSBtZXRob2Qgc3RpbGwgaXMgdGhlcmUgYW5kIHdvcmtzLiBUbyBhdm9pZCB3YXJuaW5ncywgd2UgZGVjbGFyZQotIGl0IG91cnNlbHZlcyBoZXJlLiAqLwotQGludGVyZmFjZSBOU0FwcGxpY2F0aW9uKFNETF9NaXNzaW5nX01ldGhvZHMpCi0tICh2b2lkKXNldEFwcGxlTWVudTooTlNNZW51ICopbWVudTsKLUBlbmQKLQotLyogVXNlIHRoaXMgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSB1c2UgU0RMTWFpbi5uaWIgb3Igbm90ICovCi0jZGVmaW5lCQlTRExfVVNFX05JQl9GSUxFCTAKLQotLyogVXNlIHRoaXMgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSB1c2UgQ1BTIChkb2NraW5nKSBvciBub3QgKi8KLSNkZWZpbmUJCVNETF9VU0VfQ1BTCQkxCi0jaWZkZWYgU0RMX1VTRV9DUFMKLS8qIFBvcnRpb25zIG9mIENQUy5oICovCi10eXBlZGVmIHN0cnVjdCBDUFNQcm9jZXNzU2VyTnVtCi17Ci0JVUludDMyCQlsbzsKLQlVSW50MzIJCWhpOwotfSBDUFNQcm9jZXNzU2VyTnVtOwotCi1leHRlcm4gT1NFcnIJQ1BTR2V0Q3VycmVudFByb2Nlc3MoIENQU1Byb2Nlc3NTZXJOdW0gKnBzbik7Ci1leHRlcm4gT1NFcnIgCUNQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb24oIENQU1Byb2Nlc3NTZXJOdW0gKnBzbiwgVUludDMyIF9hcmcyLCBVSW50MzIgX2FyZzMsIFVJbnQzMiBfYXJnNCwgVUludDMyIF9hcmc1KTsKLWV4dGVybiBPU0VycglDUFNTZXRGcm9udFByb2Nlc3MoIENQU1Byb2Nlc3NTZXJOdW0gKnBzbik7Ci0KLSNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLwotCi1zdGF0aWMgaW50ICAgIGdBcmdjOwotc3RhdGljIGNoYXIgICoqZ0FyZ3Y7Ci1zdGF0aWMgQk9PTCAgIGdGaW5kZXJMYXVuY2g7Ci1zdGF0aWMgQk9PTCAgIGdDYWxsZWRBcHBNYWlubGluZSA9IEZBTFNFOwotCi1zdGF0aWMgTlNTdHJpbmcgKmdldEFwcGxpY2F0aW9uTmFtZSh2b2lkKQotewotICAgIE5TRGljdGlvbmFyeSAqZGljdDsKLSAgICBOU1N0cmluZyAqYXBwTmFtZSA9IDA7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIGFwcGxpY2F0aW9uIG5hbWUgKi8KLSAgICBkaWN0ID0gKE5TRGljdGlvbmFyeSAqKUNGQnVuZGxlR2V0SW5mb0RpY3Rpb25hcnkoQ0ZCdW5kbGVHZXRNYWluQnVuZGxlKCkpOwotICAgIGlmIChkaWN0KQotICAgICAgICBhcHBOYW1lID0gW2RpY3Qgb2JqZWN0Rm9yS2V5OiBAIkNGQnVuZGxlTmFtZSJdOwotICAgIAotICAgIGlmICghW2FwcE5hbWUgbGVuZ3RoXSkKLSAgICAgICAgYXBwTmFtZSA9IFtbTlNQcm9jZXNzSW5mbyBwcm9jZXNzSW5mb10gcHJvY2Vzc05hbWVdOwotCi0gICAgcmV0dXJuIGFwcE5hbWU7Ci19Ci0KLSNpZiBTRExfVVNFX05JQl9GSUxFCi0vKiBBIGhlbHBlciBjYXRlZ29yeSBmb3IgTlNTdHJpbmcgKi8KLUBpbnRlcmZhY2UgTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCi0tIChOU1N0cmluZyAqKXN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGg6KE5TU3RyaW5nICopYVN0cmluZzsKLUBlbmQKLSNlbmRpZgotCi1AaW50ZXJmYWNlIFNETEFwcGxpY2F0aW9uIDogTlNBcHBsaWNhdGlvbgotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gU0RMQXBwbGljYXRpb24KLS8qIEludm9rZWQgZnJvbSB0aGUgUXVpdCBtZW51IGl0ZW0gKi8KLS0gKHZvaWQpdGVybWluYXRlOihpZClzZW5kZXIKLXsKLSAgICAvKiBQb3N0IGEgU0RMX1FVSVQgZXZlbnQgKi8KLSAgICBTRExfRXZlbnQgZXZlbnQ7Ci0gICAgZXZlbnQudHlwZSA9IFNETF9RVUlUOwotICAgIFNETF9QdXNoRXZlbnQoJmV2ZW50KTsKLX0KLUBlbmQKLQotLyogVGhlIG1haW4gY2xhc3Mgb2YgdGhlIGFwcGxpY2F0aW9uLCB0aGUgYXBwbGljYXRpb24ncyBkZWxlZ2F0ZSAqLwotQGltcGxlbWVudGF0aW9uIFNETE1haW4KLQotLyogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgLmFwcCdzIHBhcmVudCBkaXJlY3RvcnkgKi8KLS0gKHZvaWQpIHNldHVwV29ya2luZ0RpcmVjdG9yeTooQk9PTClzaG91bGRDaGRpcgotewotICAgIGlmIChzaG91bGRDaGRpcikKLSAgICB7Ci0gICAgICAgIGNoYXIgcGFyZW50ZGlyW01BWFBBVEhMRU5dOwotCQlDRlVSTFJlZiB1cmwgPSBDRkJ1bmRsZUNvcHlCdW5kbGVVUkwoQ0ZCdW5kbGVHZXRNYWluQnVuZGxlKCkpOwotCQlDRlVSTFJlZiB1cmwyID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCgwLCB1cmwpOwotCQlpZiAoQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24odXJsMiwgdHJ1ZSwgKFVJbnQ4ICopcGFyZW50ZGlyLCBNQVhQQVRITEVOKSkgewotCSAgICAgICAgYXNzZXJ0ICggY2hkaXIgKHBhcmVudGRpcikgPT0gMCApOyAgIC8qIGNoZGlyIHRvIHRoZSBiaW5hcnkgYXBwJ3MgcGFyZW50ICovCi0JCX0KLQkJQ0ZSZWxlYXNlKHVybCk7Ci0JCUNGUmVsZWFzZSh1cmwyKTsKLQl9Ci0KLX0KLQotI2lmIFNETF9VU0VfTklCX0ZJTEUKLQotLyogRml4IG1lbnUgdG8gY29udGFpbiB0aGUgcmVhbCBhcHAgbmFtZSBpbnN0ZWFkIG9mICJTREwgQXBwIiAqLwotLSAodm9pZClmaXhNZW51OihOU01lbnUgKilhTWVudSB3aXRoQXBwTmFtZTooTlNTdHJpbmcgKilhcHBOYW1lCi17Ci0gICAgTlNSYW5nZSBhUmFuZ2U7Ci0gICAgTlNFbnVtZXJhdG9yICplbnVtZXJhdG9yOwotICAgIE5TTWVudUl0ZW0gKm1lbnVJdGVtOwotCi0gICAgYVJhbmdlID0gW1thTWVudSB0aXRsZV0gcmFuZ2VPZlN0cmluZzpAIlNETCBBcHAiXTsKLSAgICBpZiAoYVJhbmdlLmxlbmd0aCAhPSAwKQotICAgICAgICBbYU1lbnUgc2V0VGl0bGU6IFtbYU1lbnUgdGl0bGVdIHN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6YVJhbmdlIHdpdGg6YXBwTmFtZV1dOwotCi0gICAgZW51bWVyYXRvciA9IFtbYU1lbnUgaXRlbUFycmF5XSBvYmplY3RFbnVtZXJhdG9yXTsKLSAgICB3aGlsZSAoKG1lbnVJdGVtID0gW2VudW1lcmF0b3IgbmV4dE9iamVjdF0pKQotICAgIHsKLSAgICAgICAgYVJhbmdlID0gW1ttZW51SXRlbSB0aXRsZV0gcmFuZ2VPZlN0cmluZzpAIlNETCBBcHAiXTsKLSAgICAgICAgaWYgKGFSYW5nZS5sZW5ndGggIT0gMCkKLSAgICAgICAgICAgIFttZW51SXRlbSBzZXRUaXRsZTogW1ttZW51SXRlbSB0aXRsZV0gc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTphUmFuZ2Ugd2l0aDphcHBOYW1lXV07Ci0gICAgICAgIGlmIChbbWVudUl0ZW0gaGFzU3VibWVudV0pCi0gICAgICAgICAgICBbc2VsZiBmaXhNZW51OlttZW51SXRlbSBzdWJtZW51XSB3aXRoQXBwTmFtZTphcHBOYW1lXTsKLSAgICB9Ci0gICAgWyBhTWVudSBzaXplVG9GaXQgXTsKLX0KLQotI2Vsc2UKLQotc3RhdGljIHZvaWQgc2V0QXBwbGljYXRpb25NZW51KHZvaWQpCi17Ci0gICAgLyogd2FybmluZzogdGhpcyBjb2RlIGlzIHZlcnkgb2RkICovCi0gICAgTlNNZW51ICphcHBsZU1lbnU7Ci0gICAgTlNNZW51SXRlbSAqbWVudUl0ZW07Ci0gICAgTlNTdHJpbmcgKnRpdGxlOwotICAgIE5TU3RyaW5nICphcHBOYW1lOwotICAgIAotICAgIGFwcE5hbWUgPSBnZXRBcHBsaWNhdGlvbk5hbWUoKTsKLSAgICBhcHBsZU1lbnUgPSBbW05TTWVudSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiJdOwotICAgIAotICAgIC8qIEFkZCBtZW51IGl0ZW1zICovCi0gICAgdGl0bGUgPSBbQCJBYm91dCAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOwotICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKG9yZGVyRnJvbnRTdGFuZGFyZEFib3V0UGFuZWw6KSBrZXlFcXVpdmFsZW50OkAiIl07Ci0KLSAgICBbYXBwbGVNZW51IGFkZEl0ZW06W05TTWVudUl0ZW0gc2VwYXJhdG9ySXRlbV1dOwotCi0gICAgdGl0bGUgPSBbQCJIaWRlICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07Ci0gICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3IoaGlkZTopIGtleUVxdWl2YWxlbnQ6QCJoIl07Ci0KLSAgICBtZW51SXRlbSA9IChOU01lbnVJdGVtICopW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOkAiSGlkZSBPdGhlcnMiIGFjdGlvbjpAc2VsZWN0b3IoaGlkZU90aGVyQXBwbGljYXRpb25zOikga2V5RXF1aXZhbGVudDpAImgiXTsKLSAgICBbbWVudUl0ZW0gc2V0S2V5RXF1aXZhbGVudE1vZGlmaWVyTWFzazooTlNBbHRlcm5hdGVLZXlNYXNrfE5TQ29tbWFuZEtleU1hc2spXTsKLQotICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTpAIlNob3cgQWxsIiBhY3Rpb246QHNlbGVjdG9yKHVuaGlkZUFsbEFwcGxpY2F0aW9uczopIGtleUVxdWl2YWxlbnQ6QCIiXTsKLQotICAgIFthcHBsZU1lbnUgYWRkSXRlbTpbTlNNZW51SXRlbSBzZXBhcmF0b3JJdGVtXV07Ci0KLSAgICB0aXRsZSA9IFtAIlF1aXQgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKLSAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3Rvcih0ZXJtaW5hdGU6KSBrZXlFcXVpdmFsZW50OkAicSJdOwotCi0gICAgCi0gICAgLyogUHV0IG1lbnUgaW50byB0aGUgbWVudWJhciAqLwotICAgIG1lbnVJdGVtID0gW1tOU01lbnVJdGVtIGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiIiBhY3Rpb246bmlsIGtleUVxdWl2YWxlbnQ6QCIiXTsKLSAgICBbbWVudUl0ZW0gc2V0U3VibWVudTphcHBsZU1lbnVdOwotICAgIFtbTlNBcHAgbWFpbk1lbnVdIGFkZEl0ZW06bWVudUl0ZW1dOwotCi0gICAgLyogVGVsbCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IHRoYXQgdGhpcyBpcyBub3cgdGhlIGFwcGxpY2F0aW9uIG1lbnUgKi8KLSAgICBbTlNBcHAgc2V0QXBwbGVNZW51OmFwcGxlTWVudV07Ci0KLSAgICAvKiBGaW5hbGx5IGdpdmUgdXAgb3VyIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdHMgKi8KLSAgICBbYXBwbGVNZW51IHJlbGVhc2VdOwotICAgIFttZW51SXRlbSByZWxlYXNlXTsKLX0KLQotLyogQ3JlYXRlIGEgd2luZG93IG1lbnUgKi8KLXN0YXRpYyB2b2lkIHNldHVwV2luZG93TWVudSh2b2lkKQotewotICAgIE5TTWVudSAgICAgICp3aW5kb3dNZW51OwotICAgIE5TTWVudUl0ZW0gICp3aW5kb3dNZW51SXRlbTsKLSAgICBOU01lbnVJdGVtICAqbWVudUl0ZW07Ci0KLSAgICB3aW5kb3dNZW51ID0gW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJXaW5kb3ciXTsKLSAgICAKLSAgICAvKiAiTWluaW1pemUiIGl0ZW0gKi8KLSAgICBtZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIk1pbmltaXplIiBhY3Rpb246QHNlbGVjdG9yKHBlcmZvcm1NaW5pYXR1cml6ZTopIGtleUVxdWl2YWxlbnQ6QCJtIl07Ci0gICAgW3dpbmRvd01lbnUgYWRkSXRlbTptZW51SXRlbV07Ci0gICAgW21lbnVJdGVtIHJlbGVhc2VdOwotICAgIAotICAgIC8qIFB1dCBtZW51IGludG8gdGhlIG1lbnViYXIgKi8KLSAgICB3aW5kb3dNZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIldpbmRvdyIgYWN0aW9uOm5pbCBrZXlFcXVpdmFsZW50OkAiIl07Ci0gICAgW3dpbmRvd01lbnVJdGVtIHNldFN1Ym1lbnU6d2luZG93TWVudV07Ci0gICAgW1tOU0FwcCBtYWluTWVudV0gYWRkSXRlbTp3aW5kb3dNZW51SXRlbV07Ci0gICAgCi0gICAgLyogVGVsbCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IHRoYXQgdGhpcyBpcyBub3cgdGhlIHdpbmRvdyBtZW51ICovCi0gICAgW05TQXBwIHNldFdpbmRvd3NNZW51OndpbmRvd01lbnVdOwotCi0gICAgLyogRmluYWxseSBnaXZlIHVwIG91ciByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RzICovCi0gICAgW3dpbmRvd01lbnUgcmVsZWFzZV07Ci0gICAgW3dpbmRvd01lbnVJdGVtIHJlbGVhc2VdOwotfQotCi0vKiBSZXBsYWNlbWVudCBmb3IgTlNBcHBsaWNhdGlvbk1haW4gKi8KLXN0YXRpYyB2b2lkIEN1c3RvbUFwcGxpY2F0aW9uTWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIE5TQXV0b3JlbGVhc2VQb29sCSpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07Ci0gICAgU0RMTWFpbgkJCQkqc2RsTWFpbjsKLQotICAgIC8qIEVuc3VyZSB0aGUgYXBwbGljYXRpb24gb2JqZWN0IGlzIGluaXRpYWxpc2VkICovCi0gICAgW1NETEFwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKLSAgICAKLSNpZmRlZiBTRExfVVNFX0NQUwotICAgIHsKLSAgICAgICAgQ1BTUHJvY2Vzc1Nlck51bSBQU047Ci0gICAgICAgIC8qIFRlbGwgdGhlIGRvY2sgYWJvdXQgdXMgKi8KLSAgICAgICAgaWYgKCFDUFNHZXRDdXJyZW50UHJvY2VzcygmUFNOKSkKLSAgICAgICAgICAgIGlmICghQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbigmUFNOLDB4MDMsMHgzQywweDJDLDB4MTEwMykpCi0gICAgICAgICAgICAgICAgaWYgKCFDUFNTZXRGcm9udFByb2Nlc3MoJlBTTikpCi0gICAgICAgICAgICAgICAgICAgIFtTRExBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07Ci0gICAgfQotI2VuZGlmIC8qIFNETF9VU0VfQ1BTICovCi0KLSAgICAvKiBTZXQgdXAgdGhlIG1lbnViYXIgKi8KLSAgICBbTlNBcHAgc2V0TWFpbk1lbnU6W1tOU01lbnUgYWxsb2NdIGluaXRdXTsKLSAgICBzZXRBcHBsaWNhdGlvbk1lbnUoKTsKLSAgICBzZXR1cFdpbmRvd01lbnUoKTsKLQotICAgIC8qIENyZWF0ZSBTRExNYWluIGFuZCBtYWtlIGl0IHRoZSBhcHAgZGVsZWdhdGUgKi8KLSAgICBzZGxNYWluID0gW1tTRExNYWluIGFsbG9jXSBpbml0XTsKLSAgICBbTlNBcHAgc2V0RGVsZWdhdGU6c2RsTWFpbl07Ci0gICAgCi0gICAgLyogU3RhcnQgdGhlIG1haW4gZXZlbnQgbG9vcCAqLwotICAgIFtOU0FwcCBydW5dOwotICAgIAotICAgIFtzZGxNYWluIHJlbGVhc2VdOwotICAgIFtwb29sIHJlbGVhc2VdOwotfQotCi0jZW5kaWYKLQotCi0vKgotICogQ2F0Y2ggZG9jdW1lbnQgb3BlbiByZXF1ZXN0cy4uLnRoaXMgbGV0cyB1cyBub3RpY2UgZmlsZXMgd2hlbiB0aGUgYXBwCi0gKiAgd2FzIGxhdW5jaGVkIGJ5IGRvdWJsZS1jbGlja2luZyBhIGRvY3VtZW50LCBvciB3aGVuIGEgZG9jdW1lbnQgd2FzCi0gKiAgZHJhZ2dlZC9kcm9wcGVkIG9uIHRoZSBhcHAncyBpY29uLiBZb3UgbmVlZCB0byBoYXZlIGEKLSAqICBDRkJ1bmRsZURvY3VtZW50c1R5cGUgc2VjdGlvbiBpbiB5b3VyIEluZm8ucGxpc3QgdG8gZ2V0IHRoaXMgbWVzc2FnZSwKLSAqICBhcHBhcmVudGx5LgotICoKLSAqIEZpbGVzIGFyZSBhZGRlZCB0byBnQXJndiwgc28gdG8gdGhlIGFwcCwgdGhleSdsbCBsb29rIGxpa2UgY29tbWFuZCBsaW5lCi0gKiAgYXJndW1lbnRzLiBQcmV2aW91c2x5LCBhcHBzIGxhdW5jaGVkIGZyb20gdGhlIGZpbmRlciBoYWQgbm90aGluZyBidXQKLSAqICBhbiBhcmd2WzBdLgotICoKLSAqIFRoaXMgbWVzc2FnZSBtYXkgYmUgcmVjZWl2ZWQgbXVsdGlwbGUgdGltZXMgdG8gb3BlbiBzZXZlcmFsIGRvY3Mgb24gbGF1bmNoLgotICoKLSAqIFRoaXMgbWVzc2FnZSBpcyBpZ25vcmVkIG9uY2UgdGhlIGFwcCdzIG1haW5saW5lIGhhcyBiZWVuIGNhbGxlZC4KLSAqLwotLSAoQk9PTClhcHBsaWNhdGlvbjooTlNBcHBsaWNhdGlvbiAqKXRoZUFwcGxpY2F0aW9uIG9wZW5GaWxlOihOU1N0cmluZyAqKWZpbGVuYW1lCi17Ci0gICAgY29uc3QgY2hhciAqdGVtcGFyZzsKLSAgICBzaXplX3QgYXJnbGVuOwotICAgIGNoYXIgKmFyZzsKLSAgICBjaGFyICoqbmV3YXJndjsKLQotICAgIGlmICghZ0ZpbmRlckxhdW5jaCkgIC8qIE1hY09TIGlzIHBhc3NpbmcgY29tbWFuZCBsaW5lIGFyZ3MuICovCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChnQ2FsbGVkQXBwTWFpbmxpbmUpICAvKiBhcHAgaGFzIHN0YXJ0ZWQsIGlnbm9yZSB0aGlzIGRvY3VtZW50LiAqLwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICB0ZW1wYXJnID0gW2ZpbGVuYW1lIFVURjhTdHJpbmddOwotICAgIGFyZ2xlbiA9IFNETF9zdHJsZW4odGVtcGFyZykgKyAxOwotICAgIGFyZyA9IChjaGFyICopIFNETF9tYWxsb2MoYXJnbGVuKTsKLSAgICBpZiAoYXJnID09IE5VTEwpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIG5ld2FyZ3YgPSAoY2hhciAqKikgcmVhbGxvYyhnQXJndiwgc2l6ZW9mIChjaGFyICopICogKGdBcmdjICsgMikpOwotICAgIGlmIChuZXdhcmd2ID09IE5VTEwpCi0gICAgewotICAgICAgICBTRExfZnJlZShhcmcpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGdBcmd2ID0gbmV3YXJndjsKLQotICAgIFNETF9zdHJsY3B5KGFyZywgdGVtcGFyZywgYXJnbGVuKTsKLSAgICBnQXJndltnQXJnYysrXSA9IGFyZzsKLSAgICBnQXJndltnQXJnY10gPSBOVUxMOwotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8qIENhbGxlZCB3aGVuIHRoZSBpbnRlcm5hbCBldmVudCBsb29wIGhhcyBqdXN0IHN0YXJ0ZWQgcnVubmluZyAqLwotLSAodm9pZCkgYXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IChOU05vdGlmaWNhdGlvbiAqKSBub3RlCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIC8qIFNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIC5hcHAncyBwYXJlbnQgZGlyZWN0b3J5ICovCi0gICAgW3NlbGYgc2V0dXBXb3JraW5nRGlyZWN0b3J5OmdGaW5kZXJMYXVuY2hdOwotCi0jaWYgU0RMX1VTRV9OSUJfRklMRQotICAgIC8qIFNldCB0aGUgbWFpbiBtZW51IHRvIGNvbnRhaW4gdGhlIHJlYWwgYXBwIG5hbWUgaW5zdGVhZCBvZiAiU0RMIEFwcCIgKi8KLSAgICBbc2VsZiBmaXhNZW51OltOU0FwcCBtYWluTWVudV0gd2l0aEFwcE5hbWU6Z2V0QXBwbGljYXRpb25OYW1lKCldOwotI2VuZGlmCi0KLSAgICAvKiBIYW5kIG9mZiB0byBtYWluIGFwcGxpY2F0aW9uIGNvZGUgKi8KLSAgICBnQ2FsbGVkQXBwTWFpbmxpbmUgPSBUUlVFOwotICAgIHN0YXR1cyA9IFNETF9tYWluIChnQXJnYywgZ0FyZ3YpOwotCi0gICAgLyogV2UncmUgZG9uZSwgdGhhbmsgeW91IGZvciBwbGF5aW5nICovCi0gICAgZXhpdChzdGF0dXMpOwotfQotQGVuZAotCi0KLUBpbXBsZW1lbnRhdGlvbiBOU1N0cmluZyAoUmVwbGFjZVN1YlN0cmluZykKLQotLSAoTlNTdHJpbmcgKilzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOihOU1JhbmdlKWFSYW5nZSB3aXRoOihOU1N0cmluZyAqKWFTdHJpbmcKLXsKLSAgICB1bnNpZ25lZCBpbnQgYnVmZmVyU2l6ZTsKLSAgICB1bnNpZ25lZCBpbnQgc2VsZkxlbiA9IFtzZWxmIGxlbmd0aF07Ci0gICAgdW5zaWduZWQgaW50IGFTdHJpbmdMZW4gPSBbYVN0cmluZyBsZW5ndGhdOwotICAgIHVuaWNoYXIgKmJ1ZmZlcjsKLSAgICBOU1JhbmdlIGxvY2FsUmFuZ2U7Ci0gICAgTlNTdHJpbmcgKnJlc3VsdDsKLQotICAgIGJ1ZmZlclNpemUgPSBzZWxmTGVuICsgYVN0cmluZ0xlbiAtIGFSYW5nZS5sZW5ndGg7Ci0gICAgYnVmZmVyID0gTlNBbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlclNpemUqc2l6ZW9mKHVuaWNoYXIpKTsKLSAgICAKLSAgICAvKiBHZXQgZmlyc3QgcGFydCBpbnRvIGJ1ZmZlciAqLwotICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOwotICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVJhbmdlLmxvY2F0aW9uOwotICAgIFtzZWxmIGdldENoYXJhY3RlcnM6YnVmZmVyIHJhbmdlOmxvY2FsUmFuZ2VdOwotICAgIAotICAgIC8qIEdldCBtaWRkbGUgcGFydCBpbnRvIGJ1ZmZlciAqLwotICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOwotICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVN0cmluZ0xlbjsKLSAgICBbYVN0cmluZyBnZXRDaGFyYWN0ZXJzOihidWZmZXIrYVJhbmdlLmxvY2F0aW9uKSByYW5nZTpsb2NhbFJhbmdlXTsKLSAgICAgCi0gICAgLyogR2V0IGxhc3QgcGFydCBpbnRvIGJ1ZmZlciAqLwotICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSBhUmFuZ2UubG9jYXRpb24gKyBhUmFuZ2UubGVuZ3RoOwotICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gc2VsZkxlbiAtIGxvY2FsUmFuZ2UubG9jYXRpb247Ci0gICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbithU3RyaW5nTGVuKSByYW5nZTpsb2NhbFJhbmdlXTsKLSAgICAKLSAgICAvKiBCdWlsZCBvdXRwdXQgc3RyaW5nICovCi0gICAgcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhDaGFyYWN0ZXJzOmJ1ZmZlciBsZW5ndGg6YnVmZmVyU2l6ZV07Ci0gICAgCi0gICAgTlNEZWFsbG9jYXRlTWVtb3J5UGFnZXMoYnVmZmVyLCBidWZmZXJTaXplKTsKLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1AZW5kCi0KLQotCi0jaWZkZWYgbWFpbgotIyAgdW5kZWYgbWFpbgotI2VuZGlmCi0KLQotLyogTWFpbiBlbnRyeSBwb2ludCB0byBleGVjdXRhYmxlIC0gc2hvdWxkICpub3QqIGJlIFNETF9tYWluISAqLwotaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgaW50byBhIGdsb2JhbCB2YXJpYWJsZSAqLwotICAgIC8qIFRoaXMgaXMgcGFzc2VkIGlmIHdlIGFyZSBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgKi8KLSAgICBpZiAoIGFyZ2MgPj0gMiAmJiBzdHJuY21wIChhcmd2WzFdLCAiLXBzbiIsIDQpID09IDAgKSB7Ci0gICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogMik7Ci0gICAgICAgIGdBcmd2WzBdID0gYXJndlswXTsKLSAgICAgICAgZ0FyZ3ZbMV0gPSBOVUxMOwotICAgICAgICBnQXJnYyA9IDE7Ci0gICAgICAgIGdGaW5kZXJMYXVuY2ggPSBZRVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGdBcmdjID0gYXJnYzsKLSAgICAgICAgZ0FyZ3YgPSAoY2hhciAqKikgU0RMX21hbGxvYyhzaXplb2YgKGNoYXIgKikgKiAoYXJnYysxKSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYXJnYzsgaSsrKQotICAgICAgICAgICAgZ0FyZ3ZbaV0gPSBhcmd2W2ldOwotICAgICAgICBnRmluZGVyTGF1bmNoID0gTk87Ci0gICAgfQotCi0vKiBBTkRST0lEX0JFR0lOICovCi0gICAgLyogaWYgLW5vLXdpbmRvdyBpcyB1c2VkLCB3ZSBkb24ndCB3YW50IHRvIGxhdW5jaCBhIGdyYXBoaWNhbAotICAgICAqIGFwcGxpY2F0aW9uIHRoYXQgY3JlYXRlcyBhIE1lbnUgYmFyIGFuZCBzdGVhbHMgdGhlIGZvY3VzLgotICAgICAqLwotICAgIHsKLSAgICAgICAgaW50ICBubjsKLSAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgYXJnYzsgbm4rKykgewotICAgICAgICAgICAgaWYgKCAhc3RyY21wKCBhcmd2W25uXSwgIi1uby13aW5kb3ciICkgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNETF9tYWluIChhcmdjLCBhcmd2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLS8qIEFORFJPSURfRU5EICovCi0KLSNpZiBTRExfVVNFX05JQl9GSUxFCi0gICAgW1NETEFwcGxpY2F0aW9uIHBvc2VBc0NsYXNzOltOU0FwcGxpY2F0aW9uIGNsYXNzXV07Ci0gICAgTlNBcHBsaWNhdGlvbk1haW4gKGFyZ2MsIGFyZ3YpOwotI2Vsc2UKLSAgICBDdXN0b21BcHBsaWNhdGlvbk1haW4gKGFyZ2MsIGFyZ3YpOwotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi93aW4zMi9TRExfd2luMzJfbWFpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL3dpbjMyL1NETF93aW4zMl9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMGJlNDUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL3dpbjMyL1NETF93aW4zMl9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoKLSAgICBTRExfbWFpbi5jLCBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgU2FtIExhbnRpbmdhICA0LzEzLzk4Ci0KLSAgICBUaGUgV2luTWFpbiBmdW5jdGlvbiAtLSBjYWxscyB5b3VyIHByb2dyYW0ncyBtYWluKCkgZnVuY3Rpb24KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpZmRlZiBfV0lOMzJfV0NFCi0jIGRlZmluZSBESVJfU0VQRVJBVE9SIFRFWFQoIlxcIikKLSMgdW5kZWYgX2dldGN3ZAotIyBkZWZpbmUgX2dldGN3ZChzdHIsbGVuKQl3Y3NjcHkoc3RyLFRFWFQoIiIpKQotIyBkZWZpbmUgc2V0YnVmKGYsYikKLSMgZGVmaW5lIHNldHZidWYodyx4LHkseikKLSMgZGVmaW5lIGZvcGVuCQlfd2ZvcGVuCi0jIGRlZmluZSBmcmVvcGVuCV93ZnJlb3BlbgotIyBkZWZpbmUgcmVtb3ZlKHgpCURlbGV0ZUZpbGUoeCkKLSNlbHNlCi0jIGRlZmluZSBESVJfU0VQRVJBVE9SIFRFWFQoIi8iKQotIyBpbmNsdWRlIDxkaXJlY3QuaD4KLSNlbmRpZgotCi0vKiBJbmNsdWRlIHRoZSBTREwgbWFpbiBkZWZpbml0aW9uIGhlYWRlciAqLwotI2luY2x1ZGUgIlNETC5oIgotI2luY2x1ZGUgIlNETF9tYWluLmgiCi0KLSNpZmRlZiBtYWluCi0jIGlmbmRlZiBfV0lOMzJfV0NFX0VNVUxBVElPTgotIyAgdW5kZWYgbWFpbgotIyBlbmRpZiAvKiBfV0lOMzJfV0NFX0VNVUxBVElPTiAqLwotI2VuZGlmIC8qIG1haW4gKi8KLQotLyogVGhlIHN0YW5kYXJkIG91dHB1dCBmaWxlcyAqLwotI2RlZmluZSBTVERPVVRfRklMRQlURVhUKCJzdGRvdXQudHh0IikKLSNkZWZpbmUgU1RERVJSX0ZJTEUJVEVYVCgic3RkZXJyLnR4dCIpCi0KLSNpZm5kZWYgTk9fU1RESU9fUkVESVJFQ1QKLSMgaWZkZWYgX1dJTjMyX1dDRQotICBzdGF0aWMgd2NoYXJfdCBzdGRvdXRQYXRoW01BWF9QQVRIXTsKLSAgc3RhdGljIHdjaGFyX3Qgc3RkZXJyUGF0aFtNQVhfUEFUSF07Ci0jIGVsc2UKLSAgc3RhdGljIGNoYXIgc3Rkb3V0UGF0aFtNQVhfUEFUSF07Ci0gIHN0YXRpYyBjaGFyIHN0ZGVyclBhdGhbTUFYX1BBVEhdOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIF9XSU4zMl9XQ0UgPCAzMDAKLS8qIHNlZW1zIHRvIGJlIHVuZGVmaW5lZCBpbiBXaW4gQ0UgYWx0aG91Z2ggaW4gb25saW5lIGhlbHAgKi8KLSNkZWZpbmUgaXNzcGFjZShhKSAoKChDSEFSKWEgPT0gJyAnKSB8fCAoKENIQVIpYSA9PSAnXHQnKSkKLSNlbmRpZiAvKiBfV0lOMzJfV0NFIDwgMzAwICovCi0KLS8qIFBhcnNlIGEgY29tbWFuZCBsaW5lIGJ1ZmZlciBpbnRvIGFyZ3VtZW50cyAqLwotc3RhdGljIGludCBQYXJzZUNvbW1hbmRMaW5lKGNoYXIgKmNtZGxpbmUsIGNoYXIgKiphcmd2KQotewotCWNoYXIgKmJ1ZnA7Ci0JaW50IGFyZ2M7Ci0KLQlhcmdjID0gMDsKLQlmb3IgKCBidWZwID0gY21kbGluZTsgKmJ1ZnA7ICkgewotCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCQl3aGlsZSAoIGlzc3BhY2UoKmJ1ZnApICkgewotCQkJKytidWZwOwotCQl9Ci0JCS8qIFNraXAgb3ZlciBhcmd1bWVudCAqLwotCQlpZiAoICpidWZwID09ICciJyApIHsKLQkJCSsrYnVmcDsKLQkJCWlmICggKmJ1ZnAgKSB7Ci0JCQkJaWYgKCBhcmd2ICkgewotCQkJCQlhcmd2W2FyZ2NdID0gYnVmcDsKLQkJCQl9Ci0JCQkJKythcmdjOwotCQkJfQotCQkJLyogU2tpcCBvdmVyIHdvcmQgKi8KLQkJCXdoaWxlICggKmJ1ZnAgJiYgKCpidWZwICE9ICciJykgKSB7Ci0JCQkJKytidWZwOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCAqYnVmcCApIHsKLQkJCQlpZiAoIGFyZ3YgKSB7Ci0JCQkJCWFyZ3ZbYXJnY10gPSBidWZwOwotCQkJCX0KLQkJCQkrK2FyZ2M7Ci0JCQl9Ci0JCQkvKiBTa2lwIG92ZXIgd29yZCAqLwotCQkJd2hpbGUgKCAqYnVmcCAmJiAhIGlzc3BhY2UoKmJ1ZnApICkgewotCQkJCSsrYnVmcDsKLQkJCX0KLQkJfQotCQlpZiAoICpidWZwICkgewotCQkJaWYgKCBhcmd2ICkgewotCQkJCSpidWZwID0gJ1wwJzsKLQkJCX0KLQkJCSsrYnVmcDsKLQkJfQotCX0KLQlpZiAoIGFyZ3YgKSB7Ci0JCWFyZ3ZbYXJnY10gPSBOVUxMOwotCX0KLQlyZXR1cm4oYXJnYyk7Ci19Ci0KLS8qIFNob3cgYW4gZXJyb3IgbWVzc2FnZSAqLwotc3RhdGljIHZvaWQgU2hvd0Vycm9yKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICptZXNzYWdlKQotewotLyogSWYgVVNFX01FU1NBR0VCT1ggaXMgZGVmaW5lZCwgeW91IG5lZWQgdG8gbGluayB3aXRoIHVzZXIzMi5saWIgKi8KLSNpZmRlZiBVU0VfTUVTU0FHRUJPWAotCU1lc3NhZ2VCb3goTlVMTCwgbWVzc2FnZSwgdGl0bGUsIE1CX0lDT05FWENMQU1BVElPTnxNQl9PSyk7Ci0jZWxzZQotCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCB0aXRsZSwgbWVzc2FnZSk7Ci0jZW5kaWYKLX0KLQotLyogUG9wIHVwIGFuIG91dCBvZiBtZW1vcnkgbWVzc2FnZSwgcmV0dXJucyB0byBXaW5kb3dzICovCi1zdGF0aWMgQk9PTCBPdXRPZk1lbW9yeSh2b2lkKQotewotCVNob3dFcnJvcigiRmF0YWwgRXJyb3IiLCAiT3V0IG9mIG1lbW9yeSAtIGFib3J0aW5nIik7Ci0JcmV0dXJuIEZBTFNFOwotfQotCi0vKiBTRExfUXVpdCgpIHNob3VsZG4ndCBiZSB1c2VkIHdpdGggYXRleGl0KCkgZGlyZWN0bHkgYmVjYXVzZQotICAgY2FsbGluZyBjb252ZW50aW9ucyBtYXkgZGlmZmVyLi4uICovCi1zdGF0aWMgdm9pZCBjbGVhbnVwKHZvaWQpCi17Ci0JU0RMX1F1aXQoKTsKLX0KLQotLyogUmVtb3ZlIHRoZSBvdXRwdXQgZmlsZXMgaWYgdGhlcmUgd2FzIG5vIG91dHB1dCB3cml0dGVuICovCi1zdGF0aWMgdm9pZCBjbGVhbnVwX291dHB1dCh2b2lkKQotewotI2lmbmRlZiBOT19TVERJT19SRURJUkVDVAotCUZJTEUgKmZpbGU7Ci0JaW50IGVtcHR5OwotI2VuZGlmCi0KLQkvKiBGbHVzaCB0aGUgb3V0cHV0IGluIGNhc2UgYW55dGhpbmcgaXMgcXVldWVkICovCi0JZmNsb3NlKHN0ZG91dCk7Ci0JZmNsb3NlKHN0ZGVycik7Ci0KLSNpZm5kZWYgTk9fU1RESU9fUkVESVJFQ1QKLQkvKiBTZWUgaWYgdGhlIGZpbGVzIGhhdmUgYW55IG91dHB1dCBpbiB0aGVtICovCi0JaWYgKCBzdGRvdXRQYXRoWzBdICkgewotCQlmaWxlID0gZm9wZW4oc3Rkb3V0UGF0aCwgVEVYVCgicmIiKSk7Ci0JCWlmICggZmlsZSApIHsKLQkJCWVtcHR5ID0gKGZnZXRjKGZpbGUpID09IEVPRikgPyAxIDogMDsKLQkJCWZjbG9zZShmaWxlKTsKLQkJCWlmICggZW1wdHkgKSB7Ci0JCQkJcmVtb3ZlKHN0ZG91dFBhdGgpOwotCQkJfQotCQl9Ci0JfQotCWlmICggc3RkZXJyUGF0aFswXSApIHsKLQkJZmlsZSA9IGZvcGVuKHN0ZGVyclBhdGgsIFRFWFQoInJiIikpOwotCQlpZiAoIGZpbGUgKSB7Ci0JCQllbXB0eSA9IChmZ2V0YyhmaWxlKSA9PSBFT0YpID8gMSA6IDA7Ci0JCQlmY2xvc2UoZmlsZSk7Ci0JCQlpZiAoIGVtcHR5ICkgewotCQkJCXJlbW92ZShzdGRlcnJQYXRoKTsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLS8qIFRoZSBWQysrIGNvbXBpbGVyIG5lZWRzIG1haW4gZGVmaW5lZCAqLwotI2RlZmluZSBjb25zb2xlX21haW4gbWFpbgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgd2hlcmUgZXhlY3V0aW9uIGJlZ2lucyBbY29uc29sZSBhcHBzXSAqLwotaW50IGNvbnNvbGVfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCXNpemVfdCBuOwotCWNoYXIgKmJ1ZnAsICphcHBuYW1lOwotCWludCBzdGF0dXM7Ci0KLQkvKiBHZXQgdGhlIGNsYXNzIG5hbWUgZnJvbSBhcmd2WzBdICovCi0JYXBwbmFtZSA9IGFyZ3ZbMF07Ci0JaWYgKCAoYnVmcD1TRExfc3RycmNocihhcmd2WzBdLCAnXFwnKSkgIT0gTlVMTCApIHsKLQkJYXBwbmFtZSA9IGJ1ZnArMTsKLQl9IGVsc2UKLQlpZiAoIChidWZwPVNETF9zdHJyY2hyKGFyZ3ZbMF0sICcvJykpICE9IE5VTEwgKSB7Ci0JCWFwcG5hbWUgPSBidWZwKzE7Ci0JfQotCi0JaWYgKCAoYnVmcD1TRExfc3RycmNocihhcHBuYW1lLCAnLicpKSA9PSBOVUxMICkKLQkJbiA9IFNETF9zdHJsZW4oYXBwbmFtZSk7Ci0JZWxzZQotCQluID0gKGJ1ZnAtYXBwbmFtZSk7Ci0KLQlidWZwID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIG4rMSk7Ci0JaWYgKCBidWZwID09IE5VTEwgKSB7Ci0JCXJldHVybiBPdXRPZk1lbW9yeSgpOwotCX0KLQlTRExfc3RybGNweShidWZwLCBhcHBuYW1lLCBuKzEpOwotCWFwcG5hbWUgPSBidWZwOwotCi0JLyogTG9hZCBTREwgZHluYW1pYyBsaW5rIGxpYnJhcnkgKi8KLQlpZiAoIFNETF9Jbml0KFNETF9JTklUX05PUEFSQUNIVVRFKSA8IDAgKSB7Ci0JCVNob3dFcnJvcigiV2luTWFpbigpIGVycm9yIiwgU0RMX0dldEVycm9yKCkpOwotCQlyZXR1cm4oRkFMU0UpOwotCX0KLQlhdGV4aXQoY2xlYW51cF9vdXRwdXQpOwotCWF0ZXhpdChjbGVhbnVwKTsKLQotCS8qIFNhbToKLQkgICBXZSBzdGlsbCBuZWVkIHRvIHBhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIGhhbmRsZSBzbyB0aGF0Ci0JICAgRGlyZWN0SW5wdXQgd2lsbCBpbml0aWFsaXplIHByb3Blcmx5IHdoZW4gU0RMX1JlZ2lzdGVyQXBwKCkKLQkgICBpcyBjYWxsZWQgbGF0ZXIgaW4gdGhlIHZpZGVvIGluaXRpYWxpemF0aW9uLgotCSAqLwotCVNETF9TZXRNb2R1bGVIYW5kbGUoR2V0TW9kdWxlSGFuZGxlKE5VTEwpKTsKLQotCS8qIFJ1biB0aGUgYXBwbGljYXRpb24gbWFpbigpIGNvZGUgKi8KLQlzdGF0dXMgPSBTRExfbWFpbihhcmdjLCBhcmd2KTsKLQotCS8qIEV4aXQgY2xlYW5seSwgY2FsbGluZyBhdGV4aXQoKSBmdW5jdGlvbnMgKi8KLQlleGl0KHN0YXR1cyk7Ci0KLQkvKiBIdXNoIGxpdHRsZSBjb21waWxlciwgZG9uJ3QgeW91IGNyeS4uLiAqLwotCXJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIHdoZXJlIGV4ZWN1dGlvbiBiZWdpbnMgW3dpbmRvd2VkIGFwcHNdICovCi0jaWZkZWYgX1dJTjMyX1dDRQotaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdCwgSElOU1RBTkNFIGhQcmV2LCBMUFdTVFIgc3pDbWRMaW5lLCBpbnQgc3cpCi0jZWxzZQotaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdCwgSElOU1RBTkNFIGhQcmV2LCBMUFNUUiBzekNtZExpbmUsIGludCBzdykKLSNlbmRpZgotewotCUhJTlNUQU5DRSBoYW5kbGU7Ci0JY2hhciAqKmFyZ3Y7Ci0JaW50IGFyZ2M7Ci0JY2hhciAqY21kbGluZTsKLSNpZmRlZiBfV0lOMzJfV0NFCi0Jd2NoYXJfdCAqYnVmcDsKLQlpbnQgbkxlbjsKLSNlbHNlCi0JY2hhciAqYnVmcDsKLQlzaXplX3QgbkxlbjsKLSNlbmRpZgotI2lmbmRlZiBOT19TVERJT19SRURJUkVDVAotCURXT1JEIHBhdGhsZW47Ci0jaWZkZWYgX1dJTjMyX1dDRQotCXdjaGFyX3QgcGF0aFtNQVhfUEFUSF07Ci0jZWxzZQotCWNoYXIgcGF0aFtNQVhfUEFUSF07Ci0jZW5kaWYKLQlGSUxFICpuZXdmcDsKLSNlbmRpZgotCi0JLyogU3RhcnQgdXAgRERIRUxQLkVYRSBiZWZvcmUgb3BlbmluZyBhbnkgZmlsZXMsIHNvIERESEVMUCBkb2Vzbid0Ci0JICAga2VlcCB0aGVtIG9wZW4uICBUaGlzIGlzIGEgaGFjay4uIGhvcGVmdWxseSBpdCB3aWxsIGJlIGZpeGVkIAotCSAgIHNvbWVkYXkuICBEREhFTFAuRVhFIHN0YXJ0cyB1cCB0aGUgZmlyc3QgdGltZSBERFJBVy5ETEwgaXMgbG9hZGVkLgotCSAqLwotCWhhbmRsZSA9IExvYWRMaWJyYXJ5KFRFWFQoIkREUkFXLkRMTCIpKTsKLQlpZiAoIGhhbmRsZSAhPSBOVUxMICkgewotCQlGcmVlTGlicmFyeShoYW5kbGUpOwotCX0KLQotI2lmbmRlZiBOT19TVERJT19SRURJUkVDVAotCXBhdGhsZW4gPSBHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBwYXRoLCBTRExfYXJyYXlzaXplKHBhdGgpKTsKLQl3aGlsZSAoIHBhdGhsZW4gPiAwICYmIHBhdGhbcGF0aGxlbl0gIT0gJ1xcJyApIHsKLQkJLS1wYXRobGVuOwotCX0KLQlwYXRoW3BhdGhsZW5dID0gJ1wwJzsKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLQl3Y3NuY3B5KCBzdGRvdXRQYXRoLCBwYXRoLCBTRExfYXJyYXlzaXplKHN0ZG91dFBhdGgpICk7Ci0Jd2NzbmNhdCggc3Rkb3V0UGF0aCwgRElSX1NFUEVSQVRPUiBTVERPVVRfRklMRSwgU0RMX2FycmF5c2l6ZShzdGRvdXRQYXRoKSApOwotI2Vsc2UKLQlTRExfc3RybGNweSggc3Rkb3V0UGF0aCwgcGF0aCwgU0RMX2FycmF5c2l6ZShzdGRvdXRQYXRoKSApOwotCVNETF9zdHJsY2F0KCBzdGRvdXRQYXRoLCBESVJfU0VQRVJBVE9SIFNURE9VVF9GSUxFLCBTRExfYXJyYXlzaXplKHN0ZG91dFBhdGgpICk7Ci0jZW5kaWYKLSAgICAKLQkvKiBSZWRpcmVjdCBzdGFuZGFyZCBpbnB1dCBhbmQgc3RhbmRhcmQgb3V0cHV0ICovCi0JbmV3ZnAgPSBmcmVvcGVuKHN0ZG91dFBhdGgsIFRFWFQoInciKSwgc3Rkb3V0KTsKLQotI2lmbmRlZiBfV0lOMzJfV0NFCi0JaWYgKCBuZXdmcCA9PSBOVUxMICkgewkvKiBUaGlzIGhhcHBlbnMgb24gTlQgKi8KLSNpZiAhZGVmaW5lZChzdGRvdXQpCi0JCXN0ZG91dCA9IGZvcGVuKHN0ZG91dFBhdGgsIFRFWFQoInciKSk7Ci0jZWxzZQotCQluZXdmcCA9IGZvcGVuKHN0ZG91dFBhdGgsIFRFWFQoInciKSk7Ci0JCWlmICggbmV3ZnAgKSB7Ci0JCQkqc3Rkb3V0ID0gKm5ld2ZwOwotCQl9Ci0jZW5kaWYKLQl9Ci0jZW5kaWYgLyogX1dJTjMyX1dDRSAqLwotCi0jaWZkZWYgX1dJTjMyX1dDRQotCXdjc25jcHkoIHN0ZGVyclBhdGgsIHBhdGgsIFNETF9hcnJheXNpemUoc3Rkb3V0UGF0aCkgKTsKLQl3Y3NuY2F0KCBzdGRlcnJQYXRoLCBESVJfU0VQRVJBVE9SIFNURE9VVF9GSUxFLCBTRExfYXJyYXlzaXplKHN0ZG91dFBhdGgpICk7Ci0jZWxzZQotCVNETF9zdHJsY3B5KCBzdGRlcnJQYXRoLCBwYXRoLCBTRExfYXJyYXlzaXplKHN0ZGVyclBhdGgpICk7Ci0JU0RMX3N0cmxjYXQoIHN0ZGVyclBhdGgsIERJUl9TRVBFUkFUT1IgU1RERVJSX0ZJTEUsIFNETF9hcnJheXNpemUoc3RkZXJyUGF0aCkgKTsKLSNlbmRpZgotCi0JbmV3ZnAgPSBmcmVvcGVuKHN0ZGVyclBhdGgsIFRFWFQoInciKSwgc3RkZXJyKTsKLSNpZm5kZWYgX1dJTjMyX1dDRQotCWlmICggbmV3ZnAgPT0gTlVMTCApIHsJLyogVGhpcyBoYXBwZW5zIG9uIE5UICovCi0jaWYgIWRlZmluZWQoc3RkZXJyKQotCQlzdGRlcnIgPSBmb3BlbihzdGRlcnJQYXRoLCBURVhUKCJ3IikpOwotI2Vsc2UKLQkJbmV3ZnAgPSBmb3BlbihzdGRlcnJQYXRoLCBURVhUKCJ3IikpOwotCQlpZiAoIG5ld2ZwICkgewotCQkJKnN0ZGVyciA9ICpuZXdmcDsKLQkJfQotI2VuZGlmCi0JfQotI2VuZGlmIC8qIF9XSU4zMl9XQ0UgKi8KLQotCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9MQkYsIEJVRlNJWik7CS8qIExpbmUgYnVmZmVyZWQgKi8KLQlzZXRidWYoc3RkZXJyLCBOVUxMKTsJCQkvKiBObyBidWZmZXJpbmcgKi8KLSNlbmRpZiAvKiAhTk9fU1RESU9fUkVESVJFQ1QgKi8KLQotI2lmZGVmIF9XSU4zMl9XQ0UKLQluTGVuID0gd2NzbGVuKHN6Q21kTGluZSkrMTI4KzE7Ci0JYnVmcCA9IFNETF9zdGFja19hbGxvYyh3Y2hhcl90LCBuTGVuKjIpOwotCXdjc2NweSAoYnVmcCwgVEVYVCgiXCIiKSk7Ci0JR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgYnVmcCsxLCAxMjgtMyk7Ci0Jd2NzY3B5IChidWZwK3djc2xlbihidWZwKSwgVEVYVCgiXCIgIikpOwotCXdjc25jcHkoYnVmcCt3Y3NsZW4oYnVmcCksIHN6Q21kTGluZSxuTGVuLXdjc2xlbihidWZwKSk7Ci0JbkxlbiA9IHdjc2xlbihidWZwKSsxOwotCWNtZGxpbmUgPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbkxlbik7Ci0JaWYgKCBjbWRsaW5lID09IE5VTEwgKSB7Ci0JCXJldHVybiBPdXRPZk1lbW9yeSgpOwotCX0KLQlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgYnVmcCwgLTEsIGNtZGxpbmUsIG5MZW4sIE5VTEwsIE5VTEwpOwotI2Vsc2UKLQkvKiBHcmFiIHRoZSBjb21tYW5kIGxpbmUgKi8KLQlidWZwID0gR2V0Q29tbWFuZExpbmUoKTsKLQluTGVuID0gU0RMX3N0cmxlbihidWZwKSsxOwotCWNtZGxpbmUgPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbkxlbik7Ci0JaWYgKCBjbWRsaW5lID09IE5VTEwgKSB7Ci0JCXJldHVybiBPdXRPZk1lbW9yeSgpOwotCX0KLQlTRExfc3RybGNweShjbWRsaW5lLCBidWZwLCBuTGVuKTsKLSNlbmRpZgotCi0JLyogUGFyc2UgaXQgaW50byBhcmd2IGFuZCBhcmdjICovCi0JYXJnYyA9IFBhcnNlQ29tbWFuZExpbmUoY21kbGluZSwgTlVMTCk7Ci0JYXJndiA9IFNETF9zdGFja19hbGxvYyhjaGFyKiwgYXJnYysxKTsKLQlpZiAoIGFyZ3YgPT0gTlVMTCApIHsKLQkJcmV0dXJuIE91dE9mTWVtb3J5KCk7Ci0JfQotCVBhcnNlQ29tbWFuZExpbmUoY21kbGluZSwgYXJndik7Ci0KLQkvKiBSdW4gdGhlIG1haW4gcHJvZ3JhbSAoYWZ0ZXIgYSBsaXR0bGUgU0RMIGluaXRpYWxpemF0aW9uKSAqLwotCWNvbnNvbGVfbWFpbihhcmdjLCBhcmd2KTsKLQotCS8qIEh1c2ggbGl0dGxlIGNvbXBpbGVyLCBkb24ndCB5b3UgY3J5Li4uICovCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vd2luMzIvdmVyc2lvbi5yYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi93aW4zMi92ZXJzaW9uLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWIyN2YxLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi93aW4zMi92ZXJzaW9uLnJjCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTDQotI2luY2x1ZGUgImFmeHJlcy5oIg0KLSN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTDQotDQotTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMNCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vDQotLy8gVmVyc2lvbg0KLS8vDQotDQotVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPDQotIEZJTEVWRVJTSU9OIDEsMiwxMiwwDQotIFBST0RVQ1RWRVJTSU9OIDEsMiwxMiwwDQotIEZJTEVGTEFHU01BU0sgMHgzZkwNCi0gRklMRUZMQUdTIDB4MEwNCi0gRklMRU9TIDB4NDAwMDRMDQotIEZJTEVUWVBFIDB4MkwNCi0gRklMRVNVQlRZUEUgMHgwTA0KLUJFR0lODQotICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyINCi0gICAgQkVHSU4NCi0gICAgICAgIEJMT0NLICIwNDA5MDRiMCINCi0gICAgICAgIEJFR0lODQotICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIlwwIg0KLSAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiU0RMXDAiDQotICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgIjEsIDIsIDEyLCAwXDAiDQotICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJTRExcMCINCi0gICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IKkgMjAwNyBTYW0gTGFudGluZ2FcMCINCi0gICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJTREwuZGxsXDAiDQotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlNpbXBsZSBEaXJlY3RNZWRpYSBMYXllclwwIg0KLSAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxLCAyLCAxMiwgMFwwIg0KLSAgICAgICAgRU5EDQotICAgIEVORA0KLSAgICBCTE9DSyAiVmFyRmlsZUluZm8iDQotICAgIEJFR0lODQotICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTIwMA0KLSAgICBFTkQNCi1FTkQNCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3N0ZGxpYi9TRExfZ2V0ZW52LmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3N0ZGxpYi9TRExfZ2V0ZW52LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjcwN2EuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9zdGRsaWIvU0RMX2dldGVudi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotCi0jaWZuZGVmIEhBVkVfR0VURU5WCi0KLSNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkgJiYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0vKiBOb3RlIHRoaXMgaXNuJ3QgdGhyZWFkLXNhZmUhICovCi0KLXN0YXRpYyBjaGFyICpTRExfZW52bWVtID0gTlVMTDsJLyogVWdoLCBtZW1vcnkgbGVhayAqLwotc3RhdGljIHNpemVfdCBTRExfZW52bWVtbGVuID0gMDsKLQotLyogUHV0IGEgdmFyaWFibGUgb2YgdGhlIGZvcm0gIm5hbWU9dmFsdWUiIGludG8gdGhlIGVudmlyb25tZW50ICovCi1pbnQgU0RMX3B1dGVudihjb25zdCBjaGFyICp2YXJpYWJsZSkKLXsKLQlzaXplX3QgYnVmZmVybGVuOwotCWNoYXIgKnZhbHVlOwotCWNvbnN0IGNoYXIgKnNlcDsKLQotCXNlcCA9IFNETF9zdHJjaHIodmFyaWFibGUsICc9Jyk7Ci0JaWYgKCBzZXAgPT0gTlVMTCApIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlidWZmZXJsZW4gPSBTRExfc3RybGVuKHZhcmlhYmxlKSsxOwotCWlmICggYnVmZmVybGVuID4gU0RMX2Vudm1lbWxlbiApIHsKLQkJY2hhciAqbmV3bWVtID0gKGNoYXIgKilTRExfcmVhbGxvYyhTRExfZW52bWVtLCBidWZmZXJsZW4pOwotCQlpZiAoIG5ld21lbSA9PSBOVUxMICkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVNETF9lbnZtZW0gPSBuZXdtZW07Ci0JCVNETF9lbnZtZW1sZW4gPSBidWZmZXJsZW47Ci0JfQotCVNETF9zdHJsY3B5KFNETF9lbnZtZW0sIHZhcmlhYmxlLCBidWZmZXJsZW4pOwotCXZhbHVlID0gU0RMX2Vudm1lbSArIChzZXAgLSB2YXJpYWJsZSk7Ci0JKnZhbHVlKysgPSAnXDAnOwotCWlmICggIVNldEVudmlyb25tZW50VmFyaWFibGUoU0RMX2Vudm1lbSwgKnZhbHVlID8gdmFsdWUgOiBOVUxMKSApIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogUmV0cmlldmUgYSB2YXJpYWJsZSBuYW1lZCAibmFtZSIgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KLWNoYXIgKlNETF9nZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzaXplX3QgYnVmZmVybGVuOwotCi0JYnVmZmVybGVuID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZShuYW1lLCBTRExfZW52bWVtLCAoRFdPUkQpU0RMX2Vudm1lbWxlbik7Ci0JaWYgKCBidWZmZXJsZW4gPT0gMCApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggYnVmZmVybGVuID4gU0RMX2Vudm1lbWxlbiApIHsKLQkJY2hhciAqbmV3bWVtID0gKGNoYXIgKilTRExfcmVhbGxvYyhTRExfZW52bWVtLCBidWZmZXJsZW4pOwotCQlpZiAoIG5ld21lbSA9PSBOVUxMICkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJU0RMX2Vudm1lbSA9IG5ld21lbTsKLQkJU0RMX2Vudm1lbWxlbiA9IGJ1ZmZlcmxlbjsKLQkJR2V0RW52aXJvbm1lbnRWYXJpYWJsZShuYW1lLCBTRExfZW52bWVtLCAoRFdPUkQpU0RMX2Vudm1lbWxlbik7Ci0JfQotCXJldHVybiBTRExfZW52bWVtOwotfQotCi0jZWxzZSAvKiByb2xsIG91ciBvd24gKi8KLQotc3RhdGljIGNoYXIgKipTRExfZW52ID0gKGNoYXIgKiopMDsKLQotLyogUHV0IGEgdmFyaWFibGUgb2YgdGhlIGZvcm0gIm5hbWU9dmFsdWUiIGludG8gdGhlIGVudmlyb25tZW50ICovCi1pbnQgU0RMX3B1dGVudihjb25zdCBjaGFyICp2YXJpYWJsZSkKLXsKLQljb25zdCBjaGFyICpuYW1lLCAqdmFsdWU7Ci0JaW50IGFkZGVkOwotCWludCBsZW4sIGk7Ci0JY2hhciAqKm5ld19lbnY7Ci0JY2hhciAqbmV3X3ZhcmlhYmxlOwotCi0JLyogQSBsaXR0bGUgZXJyb3IgY2hlY2tpbmcgKi8KLQlpZiAoICEgdmFyaWFibGUgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCW5hbWUgPSB2YXJpYWJsZTsKLQlmb3IgKCB2YWx1ZT12YXJpYWJsZTsgKnZhbHVlICYmICgqdmFsdWUgIT0gJz0nKTsgKyt2YWx1ZSApIHsKLQkJLyogS2VlcCBsb29raW5nIGZvciAnPScgKi8gOwotCX0KLQlpZiAoICp2YWx1ZSApIHsKLQkJKyt2YWx1ZTsKLQl9IGVsc2UgewotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHZhcmlhYmxlICovCi0JbmV3X3ZhcmlhYmxlID0gU0RMX3N0cmR1cCh2YXJpYWJsZSk7Ci0JaWYgKCAhIG5ld192YXJpYWJsZSApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBBY3R1YWxseSBwdXQgaXQgaW50byB0aGUgZW52aXJvbm1lbnQgKi8KLQlhZGRlZCA9IDA7Ci0JaSA9IDA7Ci0JaWYgKCBTRExfZW52ICkgewotCQkvKiBDaGVjayB0byBzZWUgaWYgaXQncyBhbHJlYWR5IHRoZXJlLi4uICovCi0JCWxlbiA9ICh2YWx1ZSAtIG5hbWUpOwotCQlmb3IgKCA7IFNETF9lbnZbaV07ICsraSApIHsKLQkJCWlmICggU0RMX3N0cm5jbXAoU0RMX2VudltpXSwgbmFtZSwgbGVuKSA9PSAwICkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8qIElmIHdlIGZvdW5kIGl0LCBqdXN0IHJlcGxhY2UgdGhlIGVudHJ5ICovCi0JCWlmICggU0RMX2VudltpXSApIHsKLQkJCVNETF9mcmVlKFNETF9lbnZbaV0pOwotCQkJU0RMX2VudltpXSA9IG5ld192YXJpYWJsZTsKLQkJCWFkZGVkID0gMTsKLQkJfQotCX0KLQotCS8qIERpZG4ndCBmaW5kIGl0IGluIHRoZSBlbnZpcm9ubWVudCwgZXhwYW5kIGFuZCBhZGQgKi8KLQlpZiAoICEgYWRkZWQgKSB7Ci0JCW5ld19lbnYgPSBTRExfcmVhbGxvYyhTRExfZW52LCAoaSsyKSpzaXplb2YoY2hhciAqKSk7Ci0JCWlmICggbmV3X2VudiApIHsKLQkJCVNETF9lbnYgPSBuZXdfZW52OwotCQkJU0RMX2VudltpKytdID0gbmV3X3ZhcmlhYmxlOwotCQkJU0RMX2VudltpKytdID0gKGNoYXIgKikwOwotCQkJYWRkZWQgPSAxOwotCQl9IGVsc2UgewotCQkJU0RMX2ZyZWUobmV3X3ZhcmlhYmxlKTsKLQkJfQotCX0KLQlyZXR1cm4gKGFkZGVkID8gMCA6IC0xKTsKLX0KLQotLyogUmV0cmlldmUgYSB2YXJpYWJsZSBuYW1lZCAibmFtZSIgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KLWNoYXIgKlNETF9nZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlpbnQgbGVuLCBpOwotCWNoYXIgKnZhbHVlOwotCi0JdmFsdWUgPSAoY2hhciAqKTA7Ci0JaWYgKCBTRExfZW52ICkgewotCQlsZW4gPSBTRExfc3RybGVuKG5hbWUpOwotCQlmb3IgKCBpPTA7IFNETF9lbnZbaV0gJiYgIXZhbHVlOyArK2kgKSB7Ci0JCQlpZiAoIChTRExfc3RybmNtcChTRExfZW52W2ldLCBuYW1lLCBsZW4pID09IDApICYmCi0JCQkgICAgIChTRExfZW52W2ldW2xlbl0gPT0gJz0nKSApIHsKLQkJCQl2YWx1ZSA9ICZTRExfZW52W2ldW2xlbisxXTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLSNlbmRpZiAvKiBfX1dJTjMyX18gKi8KLQotI2VuZGlmIC8qICFIQVZFX0dFVEVOViAqLwotCi0jaWZkZWYgVEVTVF9NQUlOCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQljaGFyICp2YWx1ZTsKLQotCXByaW50ZigiQ2hlY2tpbmcgZm9yIG5vbi1leGlzdGVudCB2YXJpYWJsZS4uLiAiKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQlpZiAoICEgU0RMX2dldGVudigiRVhJU1RTIikgKSB7Ci0JCXByaW50Zigib2theVxuIik7Ci0JfSBlbHNlIHsKLQkJcHJpbnRmKCJmYWlsZWRcbiIpOwotCX0KLQlwcmludGYoIlNldHRpbmcgRklSU1Q9VkFMVUUxIGluIHRoZSBlbnZpcm9ubWVudC4uLiAiKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQlpZiAoIFNETF9wdXRlbnYoIkZJUlNUPVZBTFVFMSIpID09IDAgKSB7Ci0JCXByaW50Zigib2theVxuIik7Ci0JfSBlbHNlIHsKLQkJcHJpbnRmKCJmYWlsZWRcbiIpOwotCX0KLQlwcmludGYoIkdldHRpbmcgRklSU1QgZnJvbSB0aGUgZW52aXJvbm1lbnQuLi4gIik7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0JdmFsdWUgPSBTRExfZ2V0ZW52KCJGSVJTVCIpOwotCWlmICggdmFsdWUgJiYgKFNETF9zdHJjbXAodmFsdWUsICJWQUxVRTEiKSA9PSAwKSApIHsKLQkJcHJpbnRmKCJva2F5XG4iKTsKLQl9IGVsc2UgewotCQlwcmludGYoImZhaWxlZFxuIik7Ci0JfQotCXByaW50ZigiU2V0dGluZyBTRUNPTkQ9VkFMVUUyIGluIHRoZSBlbnZpcm9ubWVudC4uLiAiKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQlpZiAoIFNETF9wdXRlbnYoIlNFQ09ORD1WQUxVRTIiKSA9PSAwICkgewotCQlwcmludGYoIm9rYXlcbiIpOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiZmFpbGVkXG4iKTsKLQl9Ci0JcHJpbnRmKCJHZXR0aW5nIFNFQ09ORCBmcm9tIHRoZSBlbnZpcm9ubWVudC4uLiAiKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQl2YWx1ZSA9IFNETF9nZXRlbnYoIlNFQ09ORCIpOwotCWlmICggdmFsdWUgJiYgKFNETF9zdHJjbXAodmFsdWUsICJWQUxVRTIiKSA9PSAwKSApIHsKLQkJcHJpbnRmKCJva2F5XG4iKTsKLQl9IGVsc2UgewotCQlwcmludGYoImZhaWxlZFxuIik7Ci0JfQotCXByaW50ZigiU2V0dGluZyBGSVJTVD1OT1ZBTFVFIGluIHRoZSBlbnZpcm9ubWVudC4uLiAiKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQlpZiAoIFNETF9wdXRlbnYoIkZJUlNUPU5PVkFMVUUiKSA9PSAwICkgewotCQlwcmludGYoIm9rYXlcbiIpOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiZmFpbGVkXG4iKTsKLQl9Ci0JcHJpbnRmKCJHZXR0aW5nIEZJUlNUIGZyb20gdGhlIGVudmlyb25tZW50Li4uICIpOwotCWZmbHVzaChzdGRvdXQpOwotCXZhbHVlID0gU0RMX2dldGVudigiRklSU1QiKTsKLQlpZiAoIHZhbHVlICYmIChTRExfc3RyY21wKHZhbHVlLCAiTk9WQUxVRSIpID09IDApICkgewotCQlwcmludGYoIm9rYXlcbiIpOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiZmFpbGVkXG4iKTsKLQl9Ci0JcHJpbnRmKCJDaGVja2luZyBmb3Igbm9uLWV4aXN0ZW50IHZhcmlhYmxlLi4uICIpOwotCWZmbHVzaChzdGRvdXQpOwotCWlmICggISBTRExfZ2V0ZW52KCJFWElTVFMiKSApIHsKLQkJcHJpbnRmKCJva2F5XG4iKTsKLQl9IGVsc2UgewotCQlwcmludGYoImZhaWxlZFxuIik7Ci0JfQotCXJldHVybigwKTsKLX0KLSNlbmRpZiAvKiBURVNUX01BSU4gKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9zdGRsaWIvU0RMX2ljb252LmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3N0ZGxpYi9TRExfaWNvbnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3YzczYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3N0ZGxpYi9TRExfaWNvbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDg4MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHBvcnRhYmxlIGljb252IGZ1bmN0aW9ucyBmb3IgU0RMICovCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0jaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgotCi0jaWZkZWYgSEFWRV9JQ09OVgotCi0vKiBEZXBlbmRpbmcgb24gd2hpY2ggc3RhbmRhcmQgdGhlIGljb252KCkgd2FzIGltcGxlbWVudGVkIHdpdGgsCi0gICBpY29udigpIG1heSBvciBtYXkgbm90IHVzZSBjb25zdCBjaGFyICoqIGZvciB0aGUgaW5idWYgcGFyYW0uCi0gICBJZiB3ZSBnZXQgdGhpcyB3cm9uZywgaXQncyBqdXN0IGEgd2FybmluZywgc28gbm8gYmlnIGRlYWwuCi0qLwotI2lmIGRlZmluZWQoX1hHUDYpIHx8IFwKLSAgICBkZWZpbmVkKF9fR0xJQkNfXykgJiYgKChfX0dMSUJDX18gPiAyKSB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDIpKQotI2RlZmluZSBJQ09OVl9JTkJVRl9OT05DT05TVAotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi1zaXplX3QgU0RMX2ljb252KFNETF9pY29udl90IGNkLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqaW5idWYsIHNpemVfdCAqaW5ieXRlc2xlZnQsCi0gICAgICAgICAgICAgICAgIGNoYXIgKipvdXRidWYsIHNpemVfdCAqb3V0Ynl0ZXNsZWZ0KQotewotCXNpemVfdCByZXRDb2RlOwotI2lmZGVmIElDT05WX0lOQlVGX05PTkNPTlNUCi0JcmV0Q29kZSA9IGljb252KGNkLCAoY2hhciAqKilpbmJ1ZiwgaW5ieXRlc2xlZnQsIG91dGJ1Ziwgb3V0Ynl0ZXNsZWZ0KTsKLSNlbHNlCi0JcmV0Q29kZSA9IGljb252KGNkLCBpbmJ1ZiwgaW5ieXRlc2xlZnQsIG91dGJ1Ziwgb3V0Ynl0ZXNsZWZ0KTsKLSNlbmRpZgotCWlmICggcmV0Q29kZSA9PSAoc2l6ZV90KS0xICkgewotCQlzd2l0Y2goZXJybm8pIHsKLQkJICAgIGNhc2UgRTJCSUc6Ci0JCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOwotCQkgICAgY2FzZSBFSUxTRVE6Ci0JCQlyZXR1cm4gU0RMX0lDT05WX0VJTFNFUTsKLQkJICAgIGNhc2UgRUlOVkFMOgotCQkJcmV0dXJuIFNETF9JQ09OVl9FSU5WQUw7Ci0JCSAgICBkZWZhdWx0OgotCQkJcmV0dXJuIFNETF9JQ09OVl9FUlJPUjsKLQkJfQotCX0KLQlyZXR1cm4gcmV0Q29kZTsKLX0KLQotI2Vsc2UKLQotLyogTG90cyBvZiB1c2VmdWwgaW5mb3JtYXRpb24gb24gVW5pY29kZSBhdDoKLQlodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdW5pY29kZS5odG1sCi0qLwotCi0jZGVmaW5lIFVOSUNPREVfQk9NCTB4RkVGRgotCi0jZGVmaW5lIFVOS05PV05fQVNDSUkJJz8nCi0jZGVmaW5lIFVOS05PV05fVU5JQ09ERQkweEZGRkQKLQotZW51bSB7Ci0JRU5DT0RJTkdfVU5LTk9XTiwKLQlFTkNPRElOR19BU0NJSSwKLQlFTkNPRElOR19MQVRJTjEsCi0JRU5DT0RJTkdfVVRGOCwKLQlFTkNPRElOR19VVEYxNiwJCS8qIE5lZWRzIGJ5dGUgb3JkZXIgbWFya2VyICovCi0JRU5DT0RJTkdfVVRGMTZCRSwKLQlFTkNPRElOR19VVEYxNkxFLAotCUVOQ09ESU5HX1VURjMyLAkJLyogTmVlZHMgYnl0ZSBvcmRlciBtYXJrZXIgKi8KLQlFTkNPRElOR19VVEYzMkJFLAotCUVOQ09ESU5HX1VURjMyTEUsCi0JRU5DT0RJTkdfVUNTMiwJCS8qIE5hdGl2ZSBieXRlIG9yZGVyIGFzc3VtZWQgKi8KLQlFTkNPRElOR19VQ1M0LAkJLyogTmF0aXZlIGJ5dGUgb3JkZXIgYXNzdW1lZCAqLwotfTsKLSNpZiBTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOCi0jZGVmaW5lIEVOQ09ESU5HX1VURjE2TkFUSVZFCUVOQ09ESU5HX1VURjE2QkUKLSNkZWZpbmUgRU5DT0RJTkdfVVRGMzJOQVRJVkUJRU5DT0RJTkdfVVRGMzJCRQotI2Vsc2UKLSNkZWZpbmUgRU5DT0RJTkdfVVRGMTZOQVRJVkUJRU5DT0RJTkdfVVRGMTZMRQotI2RlZmluZSBFTkNPRElOR19VVEYzMk5BVElWRQlFTkNPRElOR19VVEYzMkxFCi0jZW5kaWYKLQotc3RydWN0IF9TRExfaWNvbnZfdAotewotCWludCBzcmNfZm10OwotCWludCBkc3RfZm10OwotfTsKLQotc3RhdGljIHN0cnVjdCB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgZm9ybWF0OwotfSBlbmNvZGluZ3NbXSA9IHsKLQl7ICJBU0NJSSIsCUVOQ09ESU5HX0FTQ0lJIH0sCi0JeyAiVVMtQVNDSUkiLAlFTkNPRElOR19BU0NJSSB9LAotCXsgIjg4NTktMSIsCUVOQ09ESU5HX0xBVElOMSB9LAotCXsgIklTTy04ODU5LTEiLAlFTkNPRElOR19MQVRJTjEgfSwKLQl7ICJVVEY4IiwJRU5DT0RJTkdfVVRGOCB9LAotCXsgIlVURi04IiwJRU5DT0RJTkdfVVRGOCB9LAotCXsgIlVURjE2IiwJRU5DT0RJTkdfVVRGMTYgfSwKLQl7ICJVVEYtMTYiLAlFTkNPRElOR19VVEYxNiB9LAotCXsgIlVURjE2QkUiLAlFTkNPRElOR19VVEYxNkJFIH0sCi0JeyAiVVRGLTE2QkUiLAlFTkNPRElOR19VVEYxNkJFIH0sCi0JeyAiVVRGMTZMRSIsCUVOQ09ESU5HX1VURjE2TEUgfSwKLQl7ICJVVEYtMTZMRSIsCUVOQ09ESU5HX1VURjE2TEUgfSwKLQl7ICJVVEYzMiIsCUVOQ09ESU5HX1VURjMyIH0sCi0JeyAiVVRGLTMyIiwJRU5DT0RJTkdfVVRGMzIgfSwKLQl7ICJVVEYzMkJFIiwJRU5DT0RJTkdfVVRGMzJCRSB9LAotCXsgIlVURi0zMkJFIiwJRU5DT0RJTkdfVVRGMzJCRSB9LAotCXsgIlVURjMyTEUiLAlFTkNPRElOR19VVEYzMkxFIH0sCi0JeyAiVVRGLTMyTEUiLAlFTkNPRElOR19VVEYzMkxFIH0sCi0JeyAiVUNTMiIsCUVOQ09ESU5HX1VDUzIgfSwKLQl7ICJVQ1MtMiIsCUVOQ09ESU5HX1VDUzIgfSwKLQl7ICJVQ1M0IiwJRU5DT0RJTkdfVUNTNCB9LAotCXsgIlVDUy00IiwJRU5DT0RJTkdfVUNTNCB9LAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmdldGxvY2FsZShjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXplKQotewotCWNvbnN0IGNoYXIgKmxhbmc7Ci0JY2hhciAqcHRyOwotCi0JbGFuZyA9IFNETF9nZXRlbnYoIkxDX0FMTCIpOwotCWlmICggIWxhbmcgKSB7Ci0JCWxhbmcgPSBTRExfZ2V0ZW52KCJMQ19DVFlQRSIpOwotCX0KLQlpZiAoICFsYW5nICkgewotCQlsYW5nID0gU0RMX2dldGVudigiTENfTUVTU0FHRVMiKTsKLQl9Ci0JaWYgKCAhbGFuZyApIHsKLQkJbGFuZyA9IFNETF9nZXRlbnYoIkxBTkciKTsKLQl9Ci0JaWYgKCAhbGFuZyB8fCAhKmxhbmcgfHwgU0RMX3N0cmNtcChsYW5nLCAiQyIpID09IDAgKSB7Ci0JCWxhbmcgPSAiQVNDSUkiOwotCX0KLQotCS8qIFdlIG5lZWQgdG8gdHJpbSBkb3duIHN0cmluZ3MgbGlrZSAiZW5fVVMuVVRGLThAYmxhaCIgdG8gIlVURi04IiAqLwotCXB0ciA9IFNETF9zdHJjaHIobGFuZywgJy4nKTsKLQlpZiAocHRyICE9IE5VTEwpIHsKLQkJbGFuZyA9IHB0ciArIDE7Ci0JfQotCi0JU0RMX3N0cmxjcHkoYnVmZmVyLCBsYW5nLCBidWZzaXplKTsKLQlwdHIgPSBTRExfc3RyY2hyKGJ1ZmZlciwgJ0AnKTsKLQlpZiAocHRyICE9IE5VTEwpIHsKLQkJKnB0ciA9ICdcMCc7ICAvKiBjaG9wIGVuZCBvZiBzdHJpbmcuICovCi0JfQotCi0JcmV0dXJuIGJ1ZmZlcjsKLX0KLQotU0RMX2ljb252X3QgU0RMX2ljb252X29wZW4oY29uc3QgY2hhciAqdG9jb2RlLCBjb25zdCBjaGFyICpmcm9tY29kZSkKLXsKLQlpbnQgc3JjX2ZtdCA9IEVOQ09ESU5HX1VOS05PV047Ci0JaW50IGRzdF9mbXQgPSBFTkNPRElOR19VTktOT1dOOwotCWludCBpOwotCWNoYXIgZnJvbWNvZGVfYnVmZmVyWzY0XTsKLQljaGFyIHRvY29kZV9idWZmZXJbNjRdOwotCi0JaWYgKCAhZnJvbWNvZGUgfHwgISpmcm9tY29kZSApIHsKLQkJZnJvbWNvZGUgPSBnZXRsb2NhbGUoZnJvbWNvZGVfYnVmZmVyLCBzaXplb2YoZnJvbWNvZGVfYnVmZmVyKSk7Ci0JfQotCWlmICggIXRvY29kZSB8fCAhKnRvY29kZSApIHsKLQkJdG9jb2RlID0gZ2V0bG9jYWxlKHRvY29kZV9idWZmZXIsIHNpemVvZih0b2NvZGVfYnVmZmVyKSk7Ci0JfQotCWZvciAoIGkgPSAwOyBpIDwgU0RMX2FycmF5c2l6ZShlbmNvZGluZ3MpOyArK2kgKSB7Ci0JCWlmICggU0RMX3N0cmNhc2VjbXAoZnJvbWNvZGUsIGVuY29kaW5nc1tpXS5uYW1lKSA9PSAwICkgewotCQkJc3JjX2ZtdCA9IGVuY29kaW5nc1tpXS5mb3JtYXQ7Ci0JCQlpZiAoIGRzdF9mbXQgIT0gRU5DT0RJTkdfVU5LTk9XTiApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIFNETF9zdHJjYXNlY21wKHRvY29kZSwgZW5jb2RpbmdzW2ldLm5hbWUpID09IDAgKSB7Ci0JCQlkc3RfZm10ID0gZW5jb2RpbmdzW2ldLmZvcm1hdDsKLQkJCWlmICggc3JjX2ZtdCAhPSBFTkNPRElOR19VTktOT1dOICkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmICggc3JjX2ZtdCAhPSBFTkNPRElOR19VTktOT1dOICYmIGRzdF9mbXQgIT0gRU5DT0RJTkdfVU5LTk9XTiApIHsKLQkJU0RMX2ljb252X3QgY2QgPSAoU0RMX2ljb252X3QpU0RMX21hbGxvYyhzaXplb2YoKmNkKSk7Ci0JCWlmICggY2QgKSB7Ci0JCQljZC0+c3JjX2ZtdCA9IHNyY19mbXQ7Ci0JCQljZC0+ZHN0X2ZtdCA9IGRzdF9mbXQ7Ci0JCQlyZXR1cm4gY2Q7Ci0JCX0KLQl9Ci0JcmV0dXJuIChTRExfaWNvbnZfdCktMTsKLX0KLQotc2l6ZV90IFNETF9pY29udihTRExfaWNvbnZfdCBjZCwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LAotICAgICAgICAgICAgICAgICBjaGFyICoqb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdCkKLXsKLQkvKiBGb3Igc2ltcGxpY2l0eSwgd2UnbGwgY29udmVydCBldmVyeXRoaW5nIHRvIGFuZCBmcm9tIFVDUy00ICovCi0JY29uc3QgY2hhciAqc3JjOwotCWNoYXIgKmRzdDsKLQlzaXplX3Qgc3JjbGVuLCBkc3RsZW47Ci0JVWludDMyIGNoID0gMDsKLQlzaXplX3QgdG90YWw7Ci0KLQlpZiAoICFpbmJ1ZiB8fCAhKmluYnVmICkgewotCQkvKiBSZXNldCB0aGUgY29udGV4dCAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCAhb3V0YnVmIHx8ICEqb3V0YnVmIHx8ICFvdXRieXRlc2xlZnQgfHwgISpvdXRieXRlc2xlZnQgKSB7Ci0JCXJldHVybiBTRExfSUNPTlZfRTJCSUc7Ci0JfQotCXNyYyA9ICppbmJ1ZjsKLQlzcmNsZW4gPSAoaW5ieXRlc2xlZnQgPyAqaW5ieXRlc2xlZnQgOiAwKTsKLQlkc3QgPSAqb3V0YnVmOwotCWRzdGxlbiA9ICpvdXRieXRlc2xlZnQ7Ci0KLQlzd2l0Y2ggKCBjZC0+c3JjX2ZtdCApIHsKLQkgICAgY2FzZSBFTkNPRElOR19VVEYxNjoKLQkJLyogU2NhbiBmb3IgYSBieXRlIG9yZGVyIG1hcmtlciAqLwotCQl7Ci0JCQlVaW50OCAqcCA9IChVaW50OCAqKXNyYzsKLQkJCXNpemVfdCBuID0gc3JjbGVuIC8gMjsKLQkJCXdoaWxlICggbiApIHsKLQkJCQlpZiAoIHBbMF0gPT0gMHhGRiAmJiBwWzFdID09IDB4RkUgKSB7Ci0JCQkJCWNkLT5zcmNfZm10ID0gRU5DT0RJTkdfVVRGMTZCRTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmICggcFswXSA9PSAweEZFICYmIHBbMV0gPT0gMHhGRiApIHsKLQkJCQkJY2QtPnNyY19mbXQgPSBFTkNPRElOR19VVEYxNkxFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcCArPSAyOwotCQkJCS0tbjsKLQkJCX0KLQkJCWlmICggbiA9PSAwICkgewotCQkJCS8qIFdlIGNhbid0IHRlbGwsIGRlZmF1bHQgdG8gaG9zdCBvcmRlciAqLwotCQkJCWNkLT5zcmNfZm10ID0gRU5DT0RJTkdfVVRGMTZOQVRJVkU7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgRU5DT0RJTkdfVVRGMzI6Ci0JCS8qIFNjYW4gZm9yIGEgYnl0ZSBvcmRlciBtYXJrZXIgKi8KLQkJewotCQkJVWludDggKnAgPSAoVWludDggKilzcmM7Ci0JCQlzaXplX3QgbiA9IHNyY2xlbiAvIDQ7Ci0JCQl3aGlsZSAoIG4gKSB7Ci0JCQkJaWYgKCBwWzBdID09IDB4RkYgJiYgcFsxXSA9PSAweEZFICYmCi0JCQkJICAgICBwWzJdID09IDB4MDAgJiYgcFszXSA9PSAweDAwICkgewotCQkJCQljZC0+c3JjX2ZtdCA9IEVOQ09ESU5HX1VURjMyQkU7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoIHBbMF0gPT0gMHgwMCAmJiBwWzFdID09IDB4MDAgJiYKLQkJCQkgICAgICAgICAgICBwWzJdID09IDB4RkUgJiYgcFszXSA9PSAweEZGICkgewotCQkJCQljZC0+c3JjX2ZtdCA9IEVOQ09ESU5HX1VURjMyTEU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwICs9IDQ7Ci0JCQkJLS1uOwotCQkJfQotCQkJaWYgKCBuID09IDAgKSB7Ci0JCQkJLyogV2UgY2FuJ3QgdGVsbCwgZGVmYXVsdCB0byBob3N0IG9yZGVyICovCi0JCQkJY2QtPnNyY19mbXQgPSBFTkNPRElOR19VVEYzMk5BVElWRTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0KLQlzd2l0Y2ggKCBjZC0+ZHN0X2ZtdCApIHsKLQkgICAgY2FzZSBFTkNPRElOR19VVEYxNjoKLQkJLyogRGVmYXVsdCB0byBob3N0IG9yZGVyLCBuZWVkIHRvIGFkZCBieXRlIG9yZGVyIG1hcmtlciAqLwotCQlpZiAoIGRzdGxlbiA8IDIgKSB7Ci0JCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOwotCQl9Ci0JCSooVWludDE2ICopZHN0ID0gVU5JQ09ERV9CT007Ci0JCWRzdCArPSAyOwotCQlkc3RsZW4gLT0gMjsKLQkJY2QtPmRzdF9mbXQgPSBFTkNPRElOR19VVEYxNk5BVElWRTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRU5DT0RJTkdfVVRGMzI6Ci0JCS8qIERlZmF1bHQgdG8gaG9zdCBvcmRlciwgbmVlZCB0byBhZGQgYnl0ZSBvcmRlciBtYXJrZXIgKi8KLQkJaWYgKCBkc3RsZW4gPCA0ICkgewotCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKLQkJfQotCQkqKFVpbnQzMiAqKWRzdCA9IFVOSUNPREVfQk9NOwotCQlkc3QgKz0gNDsKLQkJZHN0bGVuIC09IDQ7Ci0JCWNkLT5kc3RfZm10ID0gRU5DT0RJTkdfVVRGMzJOQVRJVkU7Ci0JCWJyZWFrOwotCX0KLQotCXRvdGFsID0gMDsKLQl3aGlsZSAoIHNyY2xlbiA+IDAgKSB7Ci0JCS8qIERlY29kZSBhIGNoYXJhY3RlciAqLwotCQlzd2l0Y2ggKCBjZC0+c3JjX2ZtdCApIHsKLQkJICAgIGNhc2UgRU5DT0RJTkdfQVNDSUk6Ci0JCQl7Ci0JCQkJVWludDggKnAgPSAoVWludDggKilzcmM7Ci0JCQkJY2ggPSAoVWludDMyKShwWzBdICYgMHg3Rik7Ci0JCQkJKytzcmM7Ci0JCQkJLS1zcmNsZW47Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRU5DT0RJTkdfTEFUSU4xOgotCQkJewotCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopc3JjOwotCQkJCWNoID0gKFVpbnQzMilwWzBdOwotCQkJCSsrc3JjOwotCQkJCS0tc3JjbGVuOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEVOQ09ESU5HX1VURjg6IC8qIFJGQyAzNjI5ICovCi0JCQl7Ci0JCQkJVWludDggKnAgPSAoVWludDggKilzcmM7Ci0JCQkJc2l6ZV90IGxlZnQgPSAwOwotCQkJCVNETF9ib29sIG92ZXJsb25nID0gU0RMX0ZBTFNFOwotCQkJCWlmICggcFswXSA+PSAweEZDICkgewotCQkJCQlpZiAoIChwWzBdICYgMHhGRSkgIT0gMHhGQyApIHsKLQkJCQkJCS8qIFNraXAgaWxsZWdhbCBzZXF1ZW5jZXMKLQkJCQkJCXJldHVybiBTRExfSUNPTlZfRUlMU0VROwotCQkJCQkJKi8KLQkJCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCBwWzBdID09IDB4RkMgKSB7Ci0JCQkJCQkJb3ZlcmxvbmcgPSBTRExfVFJVRTsKLQkJCQkJCX0KLQkJCQkJCWNoID0gKFVpbnQzMikocFswXSAmIDB4MDEpOwotCQkJCQkJbGVmdCA9IDU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCBwWzBdID49IDB4RjggKSB7Ci0JCQkJCWlmICggKHBbMF0gJiAweEZDKSAhPSAweEY4ICkgewotCQkJCQkJLyogU2tpcCBpbGxlZ2FsIHNlcXVlbmNlcwotCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7Ci0JCQkJCQkqLwotCQkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoIHBbMF0gPT0gMHhGOCApIHsKLQkJCQkJCQlvdmVybG9uZyA9IFNETF9UUlVFOwotCQkJCQkJfQotCQkJCQkJY2ggPSAoVWludDMyKShwWzBdICYgMHgwMyk7Ci0JCQkJCQlsZWZ0ID0gNDsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIHBbMF0gPj0gMHhGMCApIHsKLQkJCQkJaWYgKCAocFswXSAmIDB4RjgpICE9IDB4RjAgKSB7Ci0JCQkJCQkvKiBTa2lwIGlsbGVnYWwgc2VxdWVuY2VzCi0JCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTFNFUTsKLQkJCQkJCSovCi0JCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICggcFswXSA9PSAweEYwICkgewotCQkJCQkJCW92ZXJsb25nID0gU0RMX1RSVUU7Ci0JCQkJCQl9Ci0JCQkJCQljaCA9IChVaW50MzIpKHBbMF0gJiAweDA3KTsKLQkJCQkJCWxlZnQgPSAzOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICggcFswXSA+PSAweEUwICkgewotCQkJCQlpZiAoIChwWzBdICYgMHhGMCkgIT0gMHhFMCApIHsKLQkJCQkJCS8qIFNraXAgaWxsZWdhbCBzZXF1ZW5jZXMKLQkJCQkJCXJldHVybiBTRExfSUNPTlZfRUlMU0VROwotCQkJCQkJKi8KLQkJCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCBwWzBdID09IDB4RTAgKSB7Ci0JCQkJCQkJb3ZlcmxvbmcgPSBTRExfVFJVRTsKLQkJCQkJCX0KLQkJCQkJCWNoID0gKFVpbnQzMikocFswXSAmIDB4MEYpOwotCQkJCQkJbGVmdCA9IDI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCBwWzBdID49IDB4QzAgKSB7Ci0JCQkJCWlmICggKHBbMF0gJiAweEUwKSAhPSAweEMwICkgewotCQkJCQkJLyogU2tpcCBpbGxlZ2FsIHNlcXVlbmNlcwotCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7Ci0JCQkJCQkqLwotCQkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoIChwWzBdICYgMHhDRSkgPT0gMHhDMCApIHsKLQkJCQkJCQlvdmVybG9uZyA9IFNETF9UUlVFOwotCQkJCQkJfQotCQkJCQkJY2ggPSAoVWludDMyKShwWzBdICYgMHgxRik7Ci0JCQkJCQlsZWZ0ID0gMTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICggKHBbMF0gJiAweDgwKSAhPSAweDAwICkgewotCQkJCQkJLyogU2tpcCBpbGxlZ2FsIHNlcXVlbmNlcwotCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7Ci0JCQkJCQkqLwotCQkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljaCA9IChVaW50MzIpcFswXTsKLQkJCQkJfQotCQkJCX0KLQkJCQkrK3NyYzsKLQkJCQktLXNyY2xlbjsKLQkJCQlpZiAoIHNyY2xlbiA8IGxlZnQgKSB7Ci0JCQkJCXJldHVybiBTRExfSUNPTlZfRUlOVkFMOwotCQkJCX0KLQkJCQl3aGlsZSAoIGxlZnQtLSApIHsKLQkJCQkJKytwOwotCQkJCQlpZiAoIChwWzBdICYgMHhDMCkgIT0gMHg4MCApIHsKLQkJCQkJCS8qIFNraXAgaWxsZWdhbCBzZXF1ZW5jZXMKLQkJCQkJCXJldHVybiBTRExfSUNPTlZfRUlMU0VROwotCQkJCQkJKi8KLQkJCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2ggPDw9IDY7Ci0JCQkJCWNoIHw9IChwWzBdICYgMHgzRik7Ci0JCQkJCSsrc3JjOwotCQkJCQktLXNyY2xlbjsKLQkJCQl9Ci0JCQkJaWYgKCBvdmVybG9uZyApIHsKLQkJCQkJLyogUG90ZW50aWFsIHNlY3VyaXR5IHJpc2sKLQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7Ci0JCQkJCSovCi0JCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCX0KLQkJCQlpZiAoIChjaCA+PSAweEQ4MDAgJiYgY2ggPD0gMHhERkZGKSB8fAotCQkJCSAgICAgKGNoID09IDB4RkZGRSB8fCBjaCA9PSAweEZGRkYpIHx8Ci0JCQkJICAgICBjaCA+IDB4MTBGRkZGICkgewotCQkJCQkvKiBTa2lwIGlsbGVnYWwgc2VxdWVuY2VzCi0JCQkJCXJldHVybiBTRExfSUNPTlZfRUlMU0VROwotCQkJCQkqLwotCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRU5DT0RJTkdfVVRGMTZCRTogLyogUkZDIDI3ODEgKi8KLQkJCXsKLQkJCQlVaW50OCAqcCA9IChVaW50OCAqKXNyYzsKLQkJCQlVaW50MTYgVzEsIFcyOwotCQkJCWlmICggc3JjbGVuIDwgMiApIHsKLQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSU5WQUw7Ci0JCQkJfQotCQkJCVcxID0gKChVaW50MTYpcFswXSA8PCA4KSB8Ci0JCQkJICAgICAgKFVpbnQxNilwWzFdOwotCQkJCXNyYyArPSAyOwotCQkJCXNyY2xlbiAtPSAyOwotCQkJCWlmICggVzEgPCAweEQ4MDAgfHwgVzEgPiAweERGRkYgKSB7Ci0JCQkJCWNoID0gKFVpbnQzMilXMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICggVzEgPiAweERCRkYgKSB7Ci0JCQkJCS8qIFNraXAgaWxsZWdhbCBzZXF1ZW5jZXMKLQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7Ci0JCQkJCSovCi0JCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCBzcmNsZW4gPCAyICkgewotCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTlZBTDsKLQkJCQl9Ci0JCQkJcCA9IChVaW50OCAqKXNyYzsKLQkJCQlXMiA9ICgoVWludDE2KXBbMF0gPDwgOCkgfAotCQkJCSAgICAgIChVaW50MTYpcFsxXTsKLQkJCQlzcmMgKz0gMjsKLQkJCQlzcmNsZW4gLT0gMjsKLQkJCQlpZiAoIFcyIDwgMHhEQzAwIHx8IFcyID4gMHhERkZGICkgewotCQkJCQkvKiBTa2lwIGlsbGVnYWwgc2VxdWVuY2VzCi0JCQkJCXJldHVybiBTRExfSUNPTlZfRUlMU0VROwotCQkJCQkqLwotCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNoID0gKCgoVWludDMyKShXMSAmIDB4M0ZGKSA8PCAxMCkgfAotCQkJCSAgICAgIChVaW50MzIpKFcyICYgMHgzRkYpKSArIDB4MTAwMDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRU5DT0RJTkdfVVRGMTZMRTogLyogUkZDIDI3ODEgKi8KLQkJCXsKLQkJCQlVaW50OCAqcCA9IChVaW50OCAqKXNyYzsKLQkJCQlVaW50MTYgVzEsIFcyOwotCQkJCWlmICggc3JjbGVuIDwgMiApIHsKLQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSU5WQUw7Ci0JCQkJfQotCQkJCVcxID0gKChVaW50MTYpcFsxXSA8PCA4KSB8Ci0JCQkJICAgICAgKFVpbnQxNilwWzBdOwotCQkJCXNyYyArPSAyOwotCQkJCXNyY2xlbiAtPSAyOwotCQkJCWlmICggVzEgPCAweEQ4MDAgfHwgVzEgPiAweERGRkYgKSB7Ci0JCQkJCWNoID0gKFVpbnQzMilXMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICggVzEgPiAweERCRkYgKSB7Ci0JCQkJCS8qIFNraXAgaWxsZWdhbCBzZXF1ZW5jZXMKLQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7Ci0JCQkJCSovCi0JCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCBzcmNsZW4gPCAyICkgewotCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTlZBTDsKLQkJCQl9Ci0JCQkJcCA9IChVaW50OCAqKXNyYzsKLQkJCQlXMiA9ICgoVWludDE2KXBbMV0gPDwgOCkgfAotCQkJCSAgICAgIChVaW50MTYpcFswXTsKLQkJCQlzcmMgKz0gMjsKLQkJCQlzcmNsZW4gLT0gMjsKLQkJCQlpZiAoIFcyIDwgMHhEQzAwIHx8IFcyID4gMHhERkZGICkgewotCQkJCQkvKiBTa2lwIGlsbGVnYWwgc2VxdWVuY2VzCi0JCQkJCXJldHVybiBTRExfSUNPTlZfRUlMU0VROwotCQkJCQkqLwotCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNoID0gKCgoVWludDMyKShXMSAmIDB4M0ZGKSA8PCAxMCkgfAotCQkJCSAgICAgIChVaW50MzIpKFcyICYgMHgzRkYpKSArIDB4MTAwMDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRU5DT0RJTkdfVVRGMzJCRToKLQkJCXsKLQkJCQlVaW50OCAqcCA9IChVaW50OCAqKXNyYzsKLQkJCQlpZiAoIHNyY2xlbiA8IDQgKSB7Ci0JCQkJCXJldHVybiBTRExfSUNPTlZfRUlOVkFMOwotCQkJCX0KLQkJCQljaCA9ICgoVWludDMyKXBbMF0gPDwgMjQpIHwKLQkJCQkgICAgICgoVWludDMyKXBbMV0gPDwgMTYpIHwKLQkJCQkgICAgICgoVWludDMyKXBbMl0gPDwgOCkgfAotCQkJCSAgICAgIChVaW50MzIpcFszXTsKLQkJCQlzcmMgKz0gNDsKLQkJCQlzcmNsZW4gLT0gNDsKLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgY2FzZSBFTkNPRElOR19VVEYzMkxFOgotCQkJewotCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopc3JjOwotCQkJCWlmICggc3JjbGVuIDwgNCApIHsKLQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSU5WQUw7Ci0JCQkJfQotCQkJCWNoID0gKChVaW50MzIpcFszXSA8PCAyNCkgfAotCQkJCSAgICAgKChVaW50MzIpcFsyXSA8PCAxNikgfAotCQkJCSAgICAgKChVaW50MzIpcFsxXSA8PCA4KSB8Ci0JCQkJICAgICAgKFVpbnQzMilwWzBdOwotCQkJCXNyYyArPSA0OwotCQkJCXNyY2xlbiAtPSA0OwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEVOQ09ESU5HX1VDUzI6Ci0JCQl7Ci0JCQkJVWludDE2ICpwID0gKFVpbnQxNiAqKXNyYzsKLQkJCQlpZiAoIHNyY2xlbiA8IDIgKSB7Ci0JCQkJCXJldHVybiBTRExfSUNPTlZfRUlOVkFMOwotCQkJCX0KLQkJCQljaCA9ICpwOwotCQkJCXNyYyArPSAyOwotCQkJCXNyY2xlbiAtPSAyOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEVOQ09ESU5HX1VDUzQ6Ci0JCQl7Ci0JCQkJVWludDMyICpwID0gKFVpbnQzMiAqKXNyYzsKLQkJCQlpZiAoIHNyY2xlbiA8IDQgKSB7Ci0JCQkJCXJldHVybiBTRExfSUNPTlZfRUlOVkFMOwotCQkJCX0KLQkJCQljaCA9ICpwOwotCQkJCXNyYyArPSA0OwotCQkJCXNyY2xlbiAtPSA0OwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBFbmNvZGUgYSBjaGFyYWN0ZXIgKi8KLQkJc3dpdGNoICggY2QtPmRzdF9mbXQgKSB7Ci0JCSAgICBjYXNlIEVOQ09ESU5HX0FTQ0lJOgotCQkJewotCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopZHN0OwotCQkJCWlmICggZHN0bGVuIDwgMSApIHsKLQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKLQkJCQl9Ci0JCQkJaWYgKCBjaCA+IDB4N0YgKSB7Ci0JCQkJCSpwID0gVU5LTk9XTl9BU0NJSTsKLQkJCQl9IGVsc2UgewotCQkJCQkqcCA9IChVaW50OCljaDsKLQkJCQl9Ci0JCQkJKytkc3Q7Ci0JCQkJLS1kc3RsZW47Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRU5DT0RJTkdfTEFUSU4xOgotCQkJewotCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopZHN0OwotCQkJCWlmICggZHN0bGVuIDwgMSApIHsKLQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKLQkJCQl9Ci0JCQkJaWYgKCBjaCA+IDB4RkYgKSB7Ci0JCQkJCSpwID0gVU5LTk9XTl9BU0NJSTsKLQkJCQl9IGVsc2UgewotCQkJCQkqcCA9IChVaW50OCljaDsKLQkJCQl9Ci0JCQkJKytkc3Q7Ci0JCQkJLS1kc3RsZW47Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRU5DT0RJTkdfVVRGODogLyogUkZDIDM2MjkgKi8KLQkJCXsKLQkJCQlVaW50OCAqcCA9IChVaW50OCAqKWRzdDsKLQkJCQlpZiAoIGNoID4gMHgxMEZGRkYgKSB7Ci0JCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCX0KLQkJCQlpZiAoIGNoIDw9IDB4N0YgKSB7Ci0JCQkJCWlmICggZHN0bGVuIDwgMSApIHsKLQkJCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7Ci0JCQkJCX0KLQkJCQkJKnAgPSAoVWludDgpY2g7Ci0JCQkJCSsrZHN0OwotCQkJCQktLWRzdGxlbjsKLQkJCQl9IGVsc2UgaWYgKCBjaCA8PSAweDdGRiApIHsKLQkJCQkJaWYgKCBkc3RsZW4gPCAyICkgewotCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKLQkJCQkJfQotCQkJCQlwWzBdID0gMHhDMCB8IChVaW50OCkoKGNoID4+IDYpICYgMHgxRik7Ci0JCQkJCXBbMV0gPSAweDgwIHwgKFVpbnQ4KShjaCAmIDB4M0YpOwotCQkJCQlkc3QgKz0gMjsKLQkJCQkJZHN0bGVuIC09IDI7Ci0JCQkJfSBlbHNlIGlmICggY2ggPD0gMHhGRkZGICkgewotCQkJCQlpZiAoIGRzdGxlbiA8IDMgKSB7Ci0JCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOwotCQkJCQl9Ci0JCQkJCXBbMF0gPSAweEUwIHwgKFVpbnQ4KSgoY2ggPj4gMTIpICYgMHgwRik7Ci0JCQkJCXBbMV0gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gNikgJiAweDNGKTsKLQkJCQkJcFsyXSA9IDB4ODAgfCAoVWludDgpKGNoICYgMHgzRik7Ci0JCQkJCWRzdCArPSAzOwotCQkJCQlkc3RsZW4gLT0gMzsKLQkJCQl9IGVsc2UgaWYgKCBjaCA8PSAweDFGRkZGRiApIHsKLQkJCQkJaWYgKCBkc3RsZW4gPCA0ICkgewotCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKLQkJCQkJfQotCQkJCQlwWzBdID0gMHhGMCB8IChVaW50OCkoKGNoID4+IDE4KSAmIDB4MDcpOwotCQkJCQlwWzFdID0gMHg4MCB8IChVaW50OCkoKGNoID4+IDEyKSAmIDB4M0YpOwotCQkJCQlwWzJdID0gMHg4MCB8IChVaW50OCkoKGNoID4+IDYpICYgMHgzRik7Ci0JCQkJCXBbM10gPSAweDgwIHwgKFVpbnQ4KShjaCAmIDB4M0YpOwotCQkJCQlkc3QgKz0gNDsKLQkJCQkJZHN0bGVuIC09IDQ7Ci0JCQkJfSBlbHNlIGlmICggY2ggPD0gMHgzRkZGRkZGICkgewotCQkJCQlpZiAoIGRzdGxlbiA8IDUgKSB7Ci0JCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOwotCQkJCQl9Ci0JCQkJCXBbMF0gPSAweEY4IHwgKFVpbnQ4KSgoY2ggPj4gMjQpICYgMHgwMyk7Ci0JCQkJCXBbMV0gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gMTgpICYgMHgzRik7Ci0JCQkJCXBbMl0gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gMTIpICYgMHgzRik7Ci0JCQkJCXBbM10gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gNikgJiAweDNGKTsKLQkJCQkJcFs0XSA9IDB4ODAgfCAoVWludDgpKGNoICYgMHgzRik7Ci0JCQkJCWRzdCArPSA1OwotCQkJCQlkc3RsZW4gLT0gNTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIGRzdGxlbiA8IDYgKSB7Ci0JCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOwotCQkJCQl9Ci0JCQkJCXBbMF0gPSAweEZDIHwgKFVpbnQ4KSgoY2ggPj4gMzApICYgMHgwMSk7Ci0JCQkJCXBbMV0gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gMjQpICYgMHgzRik7Ci0JCQkJCXBbMl0gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gMTgpICYgMHgzRik7Ci0JCQkJCXBbM10gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gMTIpICYgMHgzRik7Ci0JCQkJCXBbNF0gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gNikgJiAweDNGKTsKLQkJCQkJcFs1XSA9IDB4ODAgfCAoVWludDgpKGNoICYgMHgzRik7Ci0JCQkJCWRzdCArPSA2OwotCQkJCQlkc3RsZW4gLT0gNjsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRU5DT0RJTkdfVVRGMTZCRTogLyogUkZDIDI3ODEgKi8KLQkJCXsKLQkJCQlVaW50OCAqcCA9IChVaW50OCAqKWRzdDsKLQkJCQlpZiAoIGNoID4gMHgxMEZGRkYgKSB7Ci0JCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCX0KLQkJCQlpZiAoIGNoIDwgMHgxMDAwMCApIHsKLQkJCQkJaWYgKCBkc3RsZW4gPCAyICkgewotCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKLQkJCQkJfQotCQkJCQlwWzBdID0gKFVpbnQ4KShjaCA+PiA4KTsKLQkJCQkJcFsxXSA9IChVaW50OCljaDsKLQkJCQkJZHN0ICs9IDI7Ci0JCQkJCWRzdGxlbiAtPSAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVVpbnQxNiBXMSwgVzI7Ci0JCQkJCWlmICggZHN0bGVuIDwgNCApIHsKLQkJCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7Ci0JCQkJCX0KLQkJCQkJY2ggPSBjaCAtIDB4MTAwMDA7Ci0JCQkJCVcxID0gMHhEODAwIHwgKFVpbnQxNikoKGNoID4+IDEwKSAmIDB4M0ZGKTsKLQkJCQkJVzIgPSAweERDMDAgfCAoVWludDE2KShjaCAmIDB4M0ZGKTsKLQkJCQkJcFswXSA9IChVaW50OCkoVzEgPj4gOCk7Ci0JCQkJCXBbMV0gPSAoVWludDgpVzE7Ci0JCQkJCXBbMl0gPSAoVWludDgpKFcyID4+IDgpOwotCQkJCQlwWzNdID0gKFVpbnQ4KVcyOwotCQkJCQlkc3QgKz0gNDsKLQkJCQkJZHN0bGVuIC09IDQ7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEVOQ09ESU5HX1VURjE2TEU6IC8qIFJGQyAyNzgxICovCi0JCQl7Ci0JCQkJVWludDggKnAgPSAoVWludDggKilkc3Q7Ci0JCQkJaWYgKCBjaCA+IDB4MTBGRkZGICkgewotCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKLQkJCQl9Ci0JCQkJaWYgKCBjaCA8IDB4MTAwMDAgKSB7Ci0JCQkJCWlmICggZHN0bGVuIDwgMiApIHsKLQkJCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7Ci0JCQkJCX0KLQkJCQkJcFsxXSA9IChVaW50OCkoY2ggPj4gOCk7Ci0JCQkJCXBbMF0gPSAoVWludDgpY2g7Ci0JCQkJCWRzdCArPSAyOwotCQkJCQlkc3RsZW4gLT0gMjsKLQkJCQl9IGVsc2UgewotCQkJCQlVaW50MTYgVzEsIFcyOwotCQkJCQlpZiAoIGRzdGxlbiA8IDQgKSB7Ci0JCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOwotCQkJCQl9Ci0JCQkJCWNoID0gY2ggLSAweDEwMDAwOwotCQkJCQlXMSA9IDB4RDgwMCB8IChVaW50MTYpKChjaCA+PiAxMCkgJiAweDNGRik7Ci0JCQkJCVcyID0gMHhEQzAwIHwgKFVpbnQxNikoY2ggJiAweDNGRik7Ci0JCQkJCXBbMV0gPSAoVWludDgpKFcxID4+IDgpOwotCQkJCQlwWzBdID0gKFVpbnQ4KVcxOwotCQkJCQlwWzNdID0gKFVpbnQ4KShXMiA+PiA4KTsKLQkJCQkJcFsyXSA9IChVaW50OClXMjsKLQkJCQkJZHN0ICs9IDQ7Ci0JCQkJCWRzdGxlbiAtPSA0OwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgY2FzZSBFTkNPRElOR19VVEYzMkJFOgotCQkJewotCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopZHN0OwotCQkJCWlmICggY2ggPiAweDEwRkZGRiApIHsKLQkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7Ci0JCQkJfQotCQkJCWlmICggZHN0bGVuIDwgNCApIHsKLQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKLQkJCQl9Ci0JCQkJcFswXSA9IChVaW50OCkoY2ggPj4gMjQpOwotCQkJCXBbMV0gPSAoVWludDgpKGNoID4+IDE2KTsKLQkJCQlwWzJdID0gKFVpbnQ4KShjaCA+PiA4KTsKLQkJCQlwWzNdID0gKFVpbnQ4KWNoOwotCQkJCWRzdCArPSA0OwotCQkJCWRzdGxlbiAtPSA0OwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEVOQ09ESU5HX1VURjMyTEU6Ci0JCQl7Ci0JCQkJVWludDggKnAgPSAoVWludDggKilkc3Q7Ci0JCQkJaWYgKCBjaCA+IDB4MTBGRkZGICkgewotCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKLQkJCQl9Ci0JCQkJaWYgKCBkc3RsZW4gPCA0ICkgewotCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOwotCQkJCX0KLQkJCQlwWzNdID0gKFVpbnQ4KShjaCA+PiAyNCk7Ci0JCQkJcFsyXSA9IChVaW50OCkoY2ggPj4gMTYpOwotCQkJCXBbMV0gPSAoVWludDgpKGNoID4+IDgpOwotCQkJCXBbMF0gPSAoVWludDgpY2g7Ci0JCQkJZHN0ICs9IDQ7Ci0JCQkJZHN0bGVuIC09IDQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRU5DT0RJTkdfVUNTMjoKLQkJCXsKLQkJCQlVaW50MTYgKnAgPSAoVWludDE2ICopZHN0OwotCQkJCWlmICggY2ggPiAweEZGRkYgKSB7Ci0JCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCX0KLQkJCQlpZiAoIGRzdGxlbiA8IDIgKSB7Ci0JCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7Ci0JCQkJfQotCQkJCSpwID0gKFVpbnQxNiljaDsKLQkJCQlkc3QgKz0gMjsKLQkJCQlkc3RsZW4gLT0gMjsKLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgY2FzZSBFTkNPRElOR19VQ1M0OgotCQkJewotCQkJCVVpbnQzMiAqcCA9IChVaW50MzIgKilkc3Q7Ci0JCQkJaWYgKCBjaCA+IDB4N0ZGRkZGRkYgKSB7Ci0JCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOwotCQkJCX0KLQkJCQlpZiAoIGRzdGxlbiA8IDQgKSB7Ci0JCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7Ci0JCQkJfQotCQkJCSpwID0gY2g7Ci0JCQkJZHN0ICs9IDQ7Ci0JCQkJZHN0bGVuIC09IDQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFVwZGF0ZSBzdGF0ZSAqLwotCQkqaW5idWYgPSBzcmM7Ci0JCSppbmJ5dGVzbGVmdCA9IHNyY2xlbjsKLQkJKm91dGJ1ZiA9IGRzdDsKLQkJKm91dGJ5dGVzbGVmdCA9IGRzdGxlbjsKLQkJKyt0b3RhbDsKLQl9Ci0JcmV0dXJuIHRvdGFsOwotfQotCi1pbnQgU0RMX2ljb252X2Nsb3NlKFNETF9pY29udl90IGNkKQotewotCWlmICggY2QgJiYgY2QgIT0gKFNETF9pY29udl90KS0xICkgewotCQlTRExfZnJlZShjZCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogIUhBVkVfSUNPTlYgKi8KLQotY2hhciAqU0RMX2ljb252X3N0cmluZyhjb25zdCBjaGFyICp0b2NvZGUsIGNvbnN0IGNoYXIgKmZyb21jb2RlLCBjb25zdCBjaGFyICppbmJ1Ziwgc2l6ZV90IGluYnl0ZXNsZWZ0KQotewotCVNETF9pY29udl90IGNkOwotCWNoYXIgKnN0cmluZzsKLQlzaXplX3Qgc3RyaW5nc2l6ZTsKLQljaGFyICpvdXRidWY7Ci0Jc2l6ZV90IG91dGJ5dGVzbGVmdDsKLQlzaXplX3QgcmV0Q29kZSA9IDA7Ci0KLQljZCA9IFNETF9pY29udl9vcGVuKHRvY29kZSwgZnJvbWNvZGUpOwotCWlmICggY2QgPT0gKFNETF9pY29udl90KS0xICkgewotCQkvKiBTZWUgaWYgd2UgY2FuIHJlY292ZXIgaGVyZSAoZml4ZXMgaWNvbnYgb24gU29sYXJpcyAxMSkgKi8KLQkJaWYgKCAhdG9jb2RlIHx8ICEqdG9jb2RlICkgewotCQkJdG9jb2RlID0gIlVURi04IjsKLQkJfQotCQlpZiAoICFmcm9tY29kZSB8fCAhKmZyb21jb2RlICkgewotCQkJdG9jb2RlID0gIlVURi04IjsKLQkJfQotCQljZCA9IFNETF9pY29udl9vcGVuKHRvY29kZSwgZnJvbWNvZGUpOwotCX0KLQlpZiAoIGNkID09IChTRExfaWNvbnZfdCktMSApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc3RyaW5nc2l6ZSA9IGluYnl0ZXNsZWZ0ID4gNCA/IGluYnl0ZXNsZWZ0IDogNDsKLQlzdHJpbmcgPSBTRExfbWFsbG9jKHN0cmluZ3NpemUpOwotCWlmICggIXN0cmluZyApIHsKLQkJU0RMX2ljb252X2Nsb3NlKGNkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW91dGJ1ZiA9IHN0cmluZzsKLQlvdXRieXRlc2xlZnQgPSBzdHJpbmdzaXplOwotCVNETF9tZW1zZXQob3V0YnVmLCAwLCA0KTsKLQotCXdoaWxlICggaW5ieXRlc2xlZnQgPiAwICkgewotCQlyZXRDb2RlID0gU0RMX2ljb252KGNkLCAmaW5idWYsICZpbmJ5dGVzbGVmdCwgJm91dGJ1ZiwgJm91dGJ5dGVzbGVmdCk7Ci0JCXN3aXRjaCAocmV0Q29kZSkgewotCQkgICAgY2FzZSBTRExfSUNPTlZfRTJCSUc6Ci0JCQl7Ci0JCQkJY2hhciAqb2xkc3RyaW5nID0gc3RyaW5nOwotCQkJCXN0cmluZ3NpemUgKj0gMjsKLQkJCQlzdHJpbmcgPSBTRExfcmVhbGxvYyhzdHJpbmcsIHN0cmluZ3NpemUpOwotCQkJCWlmICggIXN0cmluZyApIHsKLQkJCQkJU0RMX2ljb252X2Nsb3NlKGNkKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJCW91dGJ1ZiA9IHN0cmluZyArIChvdXRidWYgLSBvbGRzdHJpbmcpOwotCQkJCW91dGJ5dGVzbGVmdCA9IHN0cmluZ3NpemUgLSAob3V0YnVmIC0gc3RyaW5nKTsKLQkJCQlTRExfbWVtc2V0KG91dGJ1ZiwgMCwgNCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgU0RMX0lDT05WX0VJTFNFUToKLQkJCS8qIFRyeSBza2lwcGluZyBzb21lIGlucHV0IGRhdGEgLSBub3QgcGVyZmVjdCwgYnV0Li4uICovCi0JCQkrK2luYnVmOwotCQkJLS1pbmJ5dGVzbGVmdDsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBTRExfSUNPTlZfRUlOVkFMOgotCQkgICAgY2FzZSBTRExfSUNPTlZfRVJST1I6Ci0JCQkvKiBXZSBjYW4ndCBjb250aW51ZS4uLiAqLwotCQkJaW5ieXRlc2xlZnQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JU0RMX2ljb252X2Nsb3NlKGNkKTsKLQotCXJldHVybiBzdHJpbmc7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3N0ZGxpYi9TRExfbWFsbG9jLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3N0ZGxpYi9TRExfbWFsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNjAwOWUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9zdGRsaWIvU0RMX21hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTExMSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHBvcnRhYmxlIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBmb3IgU0RMICovCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0KLSNpZm5kZWYgSEFWRV9NQUxMT0MKLQotI2RlZmluZSBMQUNLU19TWVNfVFlQRVNfSAotI2RlZmluZSBMQUNLU19TVERJT19ICi0jZGVmaW5lIExBQ0tTX1NUUklOR1NfSAotI2RlZmluZSBMQUNLU19TVFJJTkdfSAotI2RlZmluZSBMQUNLU19TVERMSUJfSAotI2RlZmluZSBBQk9SVAotCi0vKgotICBUaGlzIGlzIGEgdmVyc2lvbiAoYWthIGRsbWFsbG9jKSBvZiBtYWxsb2MvZnJlZS9yZWFsbG9jIHdyaXR0ZW4gYnkKLSAgRG91ZyBMZWEgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKLSAgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluLiAgU2VuZCBxdWVzdGlvbnMsCi0gIGNvbW1lbnRzLCBjb21wbGFpbnRzLCBwZXJmb3JtYW5jZSBkYXRhLCBldGMgdG8gZGxAY3Mub3N3ZWdvLmVkdQotCi0qIFZlcnNpb24gMi44LjMgVGh1IFNlcCAyMiAxMToxNjoxNSAyMDA1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKLQotICAgTm90ZTogVGhlcmUgbWF5IGJlIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hbGxvYyBvYnRhaW5hYmxlIGF0Ci0gICAgICAgICAgIGZ0cDovL2dlZS5jcy5vc3dlZ28uZWR1L3B1Yi9taXNjL21hbGxvYy5jCi0gICAgICAgICBDaGVjayBiZWZvcmUgaW5zdGFsbGluZyEKLQotKiBRdWlja3N0YXJ0Ci0KLSAgVGhpcyBsaWJyYXJ5IGlzIGFsbCBpbiBvbmUgZmlsZSB0byBzaW1wbGlmeSB0aGUgbW9zdCBjb21tb24gdXNhZ2U6Ci0gIGZ0cCBpdCwgY29tcGlsZSBpdCAoLU8zKSwgYW5kIGxpbmsgaXQgaW50byBhbm90aGVyIHByb2dyYW0uIEFsbCBvZgotICB0aGUgY29tcGlsZS10aW1lIG9wdGlvbnMgZGVmYXVsdCB0byByZWFzb25hYmxlIHZhbHVlcyBmb3IgdXNlIG9uCi0gIG1vc3QgcGxhdGZvcm1zLiAgWW91IG1pZ2h0IGxhdGVyIHdhbnQgdG8gc3RlcCB0aHJvdWdoIHZhcmlvdXMKLSAgY29tcGlsZS10aW1lIGFuZCBkeW5hbWljIHR1bmluZyBvcHRpb25zLgotCi0gIEZvciBjb252ZW5pZW5jZSwgYW4gaW5jbHVkZSBmaWxlIGZvciBjb2RlIHVzaW5nIHRoaXMgbWFsbG9jIGlzIGF0OgotICAgICBmdHA6Ly9nZWUuY3Mub3N3ZWdvLmVkdS9wdWIvbWlzYy9tYWxsb2MtMi44LjMuaAotICBZb3UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhpcyAuaCBmaWxlIHVubGVzcyB5b3UgY2FsbCBmdW5jdGlvbnMgbm90Ci0gIGRlZmluZWQgaW4geW91ciBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gIFRoZSAuaCBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlCi0gIGV4Y2VycHRzIGZyb20gdGhpcyBmaWxlIG5lZWRlZCBmb3IgdXNpbmcgdGhpcyBtYWxsb2Mgb24gQU5TSSBDL0MrKwotICBzeXN0ZW1zLCBzbyBsb25nIGFzIHlvdSBoYXZlbid0IGNoYW5nZWQgY29tcGlsZS10aW1lIG9wdGlvbnMgYWJvdXQKLSAgbmFtaW5nIGFuZCB0dW5pbmcgcGFyYW1ldGVycy4gIElmIHlvdSBkbywgdGhlbiB5b3UgY2FuIGNyZWF0ZSB5b3VyCi0gIG93biBtYWxsb2MuaCB0aGF0IGRvZXMgaW5jbHVkZSBhbGwgc2V0dGluZ3MgYnkgY3V0dGluZyBhdCB0aGUgcG9pbnQKLSAgaW5kaWNhdGVkIGJlbG93LiBOb3RlIHRoYXQgeW91IG1heSBhbHJlYWR5IGJ5IGRlZmF1bHQgYmUgdXNpbmcgYSBDCi0gIGxpYnJhcnkgY29udGFpbmluZyBhIG1hbGxvYyB0aGF0IGlzIGJhc2VkIG9uIHNvbWUgdmVyc2lvbiBvZiB0aGlzCi0gIG1hbGxvYyAoZm9yIGV4YW1wbGUgaW4gbGludXgpLiBZb3UgbWlnaHQgc3RpbGwgd2FudCB0byB1c2UgdGhlIG9uZQotICBpbiB0aGlzIGZpbGUgdG8gY3VzdG9taXplIHNldHRpbmdzIG9yIHRvIGF2b2lkIG92ZXJoZWFkcyBhc3NvY2lhdGVkCi0gIHdpdGggbGlicmFyeSB2ZXJzaW9ucy4KLQotKiBWaXRhbCBzdGF0aXN0aWNzOgotCi0gIFN1cHBvcnRlZCBwb2ludGVyL3NpemVfdCByZXByZXNlbnRhdGlvbjogICAgICAgNCBvciA4IGJ5dGVzCi0gICAgICAgc2l6ZV90IE1VU1QgYmUgYW4gdW5zaWduZWQgdHlwZSBvZiB0aGUgc2FtZSB3aWR0aCBhcwotICAgICAgIHBvaW50ZXJzLiAoSWYgeW91IGFyZSB1c2luZyBhbiBhbmNpZW50IHN5c3RlbSB0aGF0IGRlY2xhcmVzCi0gICAgICAgc2l6ZV90IGFzIGEgc2lnbmVkIHR5cGUsIG9yIG5lZWQgaXQgdG8gYmUgYSBkaWZmZXJlbnQgd2lkdGgKLSAgICAgICB0aGFuIHBvaW50ZXJzLCB5b3UgY2FuIHVzZSBhIHByZXZpb3VzIHJlbGVhc2Ugb2YgdGhpcyBtYWxsb2MKLSAgICAgICAoZS5nLiAyLjcuMikgc3VwcG9ydGluZyB0aGVzZS4pCi0KLSAgQWxpZ25tZW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJ5dGVzIChkZWZhdWx0KQotICAgICAgIFRoaXMgc3VmZmljZXMgZm9yIG5lYXJseSBhbGwgY3VycmVudCBtYWNoaW5lcyBhbmQgQyBjb21waWxlcnMuCi0gICAgICAgSG93ZXZlciwgeW91IGNhbiBkZWZpbmUgTUFMTE9DX0FMSUdOTUVOVCB0byBiZSB3aWRlciB0aGFuIHRoaXMKLSAgICAgICBpZiBuZWNlc3NhcnkgKHVwIHRvIDEyOGJ5dGVzKSwgYXQgdGhlIGV4cGVuc2Ugb2YgdXNpbmcgbW9yZSBzcGFjZS4KLQotICBNaW5pbXVtIG92ZXJoZWFkIHBlciBhbGxvY2F0ZWQgY2h1bms6ICAgNCBvciAgOCBieXRlcyAoaWYgNGJ5dGUgc2l6ZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IG9yIDE2IGJ5dGVzIChpZiA4Ynl0ZSBzaXplcykKLSAgICAgICBFYWNoIG1hbGxvY2VkIGNodW5rIGhhcyBhIGhpZGRlbiB3b3JkIG9mIG92ZXJoZWFkIGhvbGRpbmcgc2l6ZQotICAgICAgIGFuZCBzdGF0dXMgaW5mb3JtYXRpb24sIGFuZCBhZGRpdGlvbmFsIGNyb3NzLWNoZWNrIHdvcmQKLSAgICAgICBpZiBGT09URVJTIGlzIGRlZmluZWQuCi0KLSAgTWluaW11bSBhbGxvY2F0ZWQgc2l6ZTogNC1ieXRlIHB0cnM6ICAxNiBieXRlcyAgICAoaW5jbHVkaW5nIG92ZXJoZWFkKQotICAgICAgICAgICAgICAgICAgICAgICAgICA4LWJ5dGUgcHRyczogIDMyIGJ5dGVzICAgIChpbmNsdWRpbmcgb3ZlcmhlYWQpCi0KLSAgICAgICBFdmVuIGEgcmVxdWVzdCBmb3IgemVybyBieXRlcyAoaS5lLiwgbWFsbG9jKDApKSByZXR1cm5zIGEKLSAgICAgICBwb2ludGVyIHRvIHNvbWV0aGluZyBvZiB0aGUgbWluaW11bSBhbGxvY2F0YWJsZSBzaXplLgotICAgICAgIFRoZSBtYXhpbXVtIG92ZXJoZWFkIHdhc3RhZ2UgKGkuZS4sIG51bWJlciBvZiBleHRyYSBieXRlcwotICAgICAgIGFsbG9jYXRlZCB0aGFuIHdlcmUgcmVxdWVzdGVkIGluIG1hbGxvYykgaXMgbGVzcyB0aGFuIG9yIGVxdWFsCi0gICAgICAgdG8gdGhlIG1pbmltdW0gc2l6ZSwgZXhjZXB0IGZvciByZXF1ZXN0cyA+PSBtbWFwX3RocmVzaG9sZCB0aGF0Ci0gICAgICAgYXJlIHNlcnZpY2VkIHZpYSBtbWFwKCksIHdoZXJlIHRoZSB3b3JzdCBjYXNlIHdhc3RhZ2UgaXMgYWJvdXQKLSAgICAgICAzMiBieXRlcyBwbHVzIHRoZSByZW1haW5kZXIgZnJvbSBhIHN5c3RlbSBwYWdlICh0aGUgbWluaW1hbAotICAgICAgIG1tYXAgdW5pdCk7IHR5cGljYWxseSA0MDk2IG9yIDgxOTIgYnl0ZXMuCi0KLSAgU2VjdXJpdHk6IHN0YXRpYy1zYWZlOyBvcHRpb25hbGx5IG1vcmUgb3IgbGVzcwotICAgICAgIFRoZSAic2VjdXJpdHkiIG9mIG1hbGxvYyByZWZlcnMgdG8gdGhlIGFiaWxpdHkgb2YgbWFsaWNpb3VzCi0gICAgICAgY29kZSB0byBhY2NlbnR1YXRlIHRoZSBlZmZlY3RzIG9mIGVycm9ycyAoZm9yIGV4YW1wbGUsIGZyZWVpbmcKLSAgICAgICBzcGFjZSB0aGF0IGlzIG5vdCBjdXJyZW50bHkgbWFsbG9jJ2VkIG9yIG92ZXJ3cml0aW5nIHBhc3QgdGhlCi0gICAgICAgZW5kcyBvZiBjaHVua3MpIGluIGNvZGUgdGhhdCBjYWxscyBtYWxsb2MuICBUaGlzIG1hbGxvYwotICAgICAgIGd1YXJhbnRlZXMgbm90IHRvIG1vZGlmeSBhbnkgbWVtb3J5IGxvY2F0aW9ucyBiZWxvdyB0aGUgYmFzZSBvZgotICAgICAgIGhlYXAsIGkuZS4sIHN0YXRpYyB2YXJpYWJsZXMsIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIHVzYWdlCi0gICAgICAgZXJyb3JzLiAgVGhlIHJvdXRpbmVzIGFkZGl0aW9uYWxseSBkZXRlY3QgbW9zdCBpbXByb3BlciBmcmVlcwotICAgICAgIGFuZCByZWFsbG9jcy4gIEFsbCB0aGlzIGhvbGRzIGFzIGxvbmcgYXMgdGhlIHN0YXRpYyBib29ra2VlcGluZwotICAgICAgIGZvciBtYWxsb2MgaXRzZWxmIGlzIG5vdCBjb3JydXB0ZWQgYnkgc29tZSBvdGhlciBtZWFucy4gIFRoaXMKLSAgICAgICBpcyBvbmx5IG9uZSBhc3BlY3Qgb2Ygc2VjdXJpdHkgLS0gdGhlc2UgY2hlY2tzIGRvIG5vdCwgYW5kCi0gICAgICAgY2Fubm90LCBkZXRlY3QgYWxsIHBvc3NpYmxlIHByb2dyYW1taW5nIGVycm9ycy4KLQotICAgICAgIElmIEZPT1RFUlMgaXMgZGVmaW5lZCBub256ZXJvLCB0aGVuIGVhY2ggYWxsb2NhdGVkIGNodW5rCi0gICAgICAgY2FycmllcyBhbiBhZGRpdGlvbmFsIGNoZWNrIHdvcmQgdG8gdmVyaWZ5IHRoYXQgaXQgd2FzIG1hbGxvY2VkCi0gICAgICAgZnJvbSBpdHMgc3BhY2UuICBUaGVzZSBjaGVjayB3b3JkcyBhcmUgdGhlIHNhbWUgd2l0aGluIGVhY2gKLSAgICAgICBleGVjdXRpb24gb2YgYSBwcm9ncmFtIHVzaW5nIG1hbGxvYywgYnV0IGRpZmZlciBhY3Jvc3MKLSAgICAgICBleGVjdXRpb25zLCBzbyBleHRlcm5hbGx5IGNyYWZ0ZWQgZmFrZSBjaHVua3MgY2Fubm90IGJlCi0gICAgICAgZnJlZWQuIFRoaXMgaW1wcm92ZXMgc2VjdXJpdHkgYnkgcmVqZWN0aW5nIGZyZWVzL3JlYWxsb2NzIHRoYXQKLSAgICAgICBjb3VsZCBjb3JydXB0IGhlYXAgbWVtb3J5LCBpbiBhZGRpdGlvbiB0byB0aGUgY2hlY2tzIHByZXZlbnRpbmcKLSAgICAgICB3cml0ZXMgdG8gc3RhdGljcyB0aGF0IGFyZSBhbHdheXMgb24uICBUaGlzIG1heSBmdXJ0aGVyIGltcHJvdmUKLSAgICAgICBzZWN1cml0eSBhdCB0aGUgZXhwZW5zZSBvZiB0aW1lIGFuZCBzcGFjZSBvdmVyaGVhZC4gIChOb3RlIHRoYXQKLSAgICAgICBGT09URVJTIG1heSBhbHNvIGJlIHdvcnRoIHVzaW5nIHdpdGggTVNQQUNFUy4pCi0KLSAgICAgICBCeSBkZWZhdWx0IGRldGVjdGVkIGVycm9ycyBjYXVzZSB0aGUgcHJvZ3JhbSB0byBhYm9ydCAoY2FsbGluZwotICAgICAgICJhYm9ydCgpIikuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyB0byBpbnN0ZWFkIHByb2NlZWQgcGFzdAotICAgICAgIGVycm9ycyBieSBkZWZpbmluZyBQUk9DRUVEX09OX0VSUk9SLiAgSW4gdGhpcyBjYXNlLCBhIGJhZCBmcmVlCi0gICAgICAgaGFzIG5vIGVmZmVjdCwgYW5kIGEgbWFsbG9jIHRoYXQgZW5jb3VudGVycyBhIGJhZCBhZGRyZXNzCi0gICAgICAgY2F1c2VkIGJ5IHVzZXIgb3ZlcndyaXRlcyB3aWxsIGlnbm9yZSB0aGUgYmFkIGFkZHJlc3MgYnkKLSAgICAgICBkcm9wcGluZyBwb2ludGVycyBhbmQgaW5kaWNlcyB0byBhbGwga25vd24gbWVtb3J5LiBUaGlzIG1heQotICAgICAgIGJlIGFwcHJvcHJpYXRlIGZvciBwcm9ncmFtcyB0aGF0IHNob3VsZCBjb250aW51ZSBpZiBhdCBhbGwKLSAgICAgICBwb3NzaWJsZSBpbiB0aGUgZmFjZSBvZiBwcm9ncmFtbWluZyBlcnJvcnMsIGFsdGhvdWdoIHRoZXkgbWF5Ci0gICAgICAgcnVuIG91dCBvZiBtZW1vcnkgYmVjYXVzZSBkcm9wcGVkIG1lbW9yeSBpcyBuZXZlciByZWNsYWltZWQuCi0KLSAgICAgICBJZiB5b3UgZG9uJ3QgbGlrZSBlaXRoZXIgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBkZWZpbmUKLSAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTiBhbmQgVVNBR0VfRVJST1JfQUNUSU9OIHRvIGRvIGFueXRoaW5nCi0gICAgICAgZWxzZS4gQW5kIGlmIGlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgcHJvZ3JhbSB1c2luZyBtYWxsb2MgaGFzCi0gICAgICAgbm8gZXJyb3JzIG9yIHZ1bG5lcmFiaWxpdGllcywgeW91IGNhbiBkZWZpbmUgSU5TRUNVUkUgdG8gMSwKLSAgICAgICB3aGljaCBtaWdodCAob3IgbWlnaHQgbm90KSBwcm92aWRlIGEgc21hbGwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuCi0KLSAgVGhyZWFkLXNhZmV0eTogTk9UIHRocmVhZC1zYWZlIHVubGVzcyBVU0VfTE9DS1MgZGVmaW5lZAotICAgICAgIFdoZW4gVVNFX0xPQ0tTIGlzIGRlZmluZWQsIGVhY2ggcHVibGljIGNhbGwgdG8gbWFsbG9jLCBmcmVlLAotICAgICAgIGV0YyBpcyBzdXJyb3VuZGVkIHdpdGggZWl0aGVyIGEgcHRocmVhZCBtdXRleCBvciBhIHdpbjMyCi0gICAgICAgc3BpbmxvY2sgKGRlcGVuZGluZyBvbiBXSU4zMikuIFRoaXMgaXMgbm90IGVzcGVjaWFsbHkgZmFzdCwgYW5kCi0gICAgICAgY2FuIGJlIGEgbWFqb3IgYm90dGxlbmVjay4gIEl0IGlzIGRlc2lnbmVkIG9ubHkgdG8gcHJvdmlkZQotICAgICAgIG1pbmltYWwgcHJvdGVjdGlvbiBpbiBjb25jdXJyZW50IGVudmlyb25tZW50cywgYW5kIHRvIHByb3ZpZGUgYQotICAgICAgIGJhc2lzIGZvciBleHRlbnNpb25zLiAgSWYgeW91IGFyZSB1c2luZyBtYWxsb2MgaW4gYSBjb25jdXJyZW50Ci0gICAgICAgcHJvZ3JhbSwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBwdG1hbGxvYywgd2hpY2ggaXMgZGVyaXZlZCBmcm9tCi0gICAgICAgYSB2ZXJzaW9uIG9mIHRoaXMgbWFsbG9jLiAoU2VlIGh0dHA6Ly93d3cubWFsbG9jLmRlKS4KLQotICBTeXN0ZW0gcmVxdWlyZW1lbnRzOiBBbnkgY29tYmluYXRpb24gb2YgTU9SRUNPUkUgYW5kL29yIE1NQVAvTVVOTUFQCi0gICAgICAgVGhpcyBtYWxsb2MgY2FuIHVzZSB1bml4IHNicmsgb3IgYW55IGVtdWxhdGlvbiAoaW52b2tlZCB1c2luZwotICAgICAgIHRoZSBDQUxMX01PUkVDT1JFIG1hY3JvKSBhbmQvb3IgbW1hcC9tdW5tYXAgb3IgYW55IGVtdWxhdGlvbgotICAgICAgIChpbnZva2VkIHVzaW5nIENBTExfTU1BUC9DQUxMX01VTk1BUCkgdG8gZ2V0IGFuZCByZWxlYXNlIHN5c3RlbQotICAgICAgIG1lbW9yeS4gIE9uIG1vc3QgdW5peCBzeXN0ZW1zLCBpdCB0ZW5kcyB0byB3b3JrIGJlc3QgaWYgYm90aAotICAgICAgIE1PUkVDT1JFIGFuZCBNTUFQIGFyZSBlbmFibGVkLiAgT24gV2luMzIsIGl0IHVzZXMgZW11bGF0aW9ucwotICAgICAgIGJhc2VkIG9uIFZpcnR1YWxBbGxvYy4gSXQgYWxzbyB1c2VzIGNvbW1vbiBDIGxpYnJhcnkgZnVuY3Rpb25zCi0gICAgICAgbGlrZSBtZW1zZXQuCi0KLSAgQ29tcGxpYW5jZTogSSBiZWxpZXZlIGl0IGlzIGNvbXBsaWFudCB3aXRoIHRoZSBTaW5nbGUgVW5peCBTcGVjaWZpY2F0aW9uCi0gICAgICAgKFNlZSBodHRwOi8vd3d3LnVuaXgub3JnKS4gQWxzbyBTVklEL1hQRywgQU5TSSBDLCBhbmQgcHJvYmFibHkKLSAgICAgICBvdGhlcnMgYXMgd2VsbC4KLQotKiBPdmVydmlldyBvZiBhbGdvcml0aG1zCi0KLSAgVGhpcyBpcyBub3QgdGhlIGZhc3Rlc3QsIG1vc3Qgc3BhY2UtY29uc2VydmluZywgbW9zdCBwb3J0YWJsZSwgb3IKLSAgbW9zdCB0dW5hYmxlIG1hbGxvYyBldmVyIHdyaXR0ZW4uIEhvd2V2ZXIgaXQgaXMgYW1vbmcgdGhlIGZhc3Rlc3QKLSAgd2hpbGUgYWxzbyBiZWluZyBhbW9uZyB0aGUgbW9zdCBzcGFjZS1jb25zZXJ2aW5nLCBwb3J0YWJsZSBhbmQKLSAgdHVuYWJsZS4gIENvbnNpc3RlbnQgYmFsYW5jZSBhY3Jvc3MgdGhlc2UgZmFjdG9ycyByZXN1bHRzIGluIGEgZ29vZAotICBnZW5lcmFsLXB1cnBvc2UgYWxsb2NhdG9yIGZvciBtYWxsb2MtaW50ZW5zaXZlIHByb2dyYW1zLgotCi0gIEluIG1vc3Qgd2F5cywgdGhpcyBtYWxsb2MgaXMgYSBiZXN0LWZpdCBhbGxvY2F0b3IuIEdlbmVyYWxseSwgaXQKLSAgY2hvb3NlcyB0aGUgYmVzdC1maXR0aW5nIGV4aXN0aW5nIGNodW5rIGZvciBhIHJlcXVlc3QsIHdpdGggdGllcwotICBicm9rZW4gaW4gYXBwcm94aW1hdGVseSBsZWFzdC1yZWNlbnRseS11c2VkIG9yZGVyLiAoVGhpcyBzdHJhdGVneQotICBub3JtYWxseSBtYWludGFpbnMgbG93IGZyYWdtZW50YXRpb24uKSBIb3dldmVyLCBmb3IgcmVxdWVzdHMgbGVzcwotICB0aGFuIDI1NmJ5dGVzLCBpdCBkZXZpYXRlcyBmcm9tIGJlc3QtZml0IHdoZW4gdGhlcmUgaXMgbm90IGFuCi0gIGV4YWN0bHkgZml0dGluZyBhdmFpbGFibGUgY2h1bmsgYnkgcHJlZmVycmluZyB0byB1c2Ugc3BhY2UgYWRqYWNlbnQKLSAgdG8gdGhhdCB1c2VkIGZvciB0aGUgcHJldmlvdXMgc21hbGwgcmVxdWVzdCwgYXMgd2VsbCBhcyBieSBicmVha2luZwotICB0aWVzIGluIGFwcHJveGltYXRlbHkgbW9zdC1yZWNlbnRseS11c2VkIG9yZGVyLiAoVGhlc2UgZW5oYW5jZQotICBsb2NhbGl0eSBvZiBzZXJpZXMgb2Ygc21hbGwgYWxsb2NhdGlvbnMuKSAgQW5kIGZvciB2ZXJ5IGxhcmdlIHJlcXVlc3RzCi0gICg+PSAyNTZLYiBieSBkZWZhdWx0KSwgaXQgcmVsaWVzIG9uIHN5c3RlbSBtZW1vcnkgbWFwcGluZwotICBmYWNpbGl0aWVzLCBpZiBzdXBwb3J0ZWQuICAoVGhpcyBoZWxwcyBhdm9pZCBjYXJyeWluZyBhcm91bmQgYW5kCi0gIHBvc3NpYmx5IGZyYWdtZW50aW5nIG1lbW9yeSB1c2VkIG9ubHkgZm9yIGxhcmdlIGNodW5rcy4pCi0KLSAgQWxsIG9wZXJhdGlvbnMgKGV4Y2VwdCBtYWxsb2Nfc3RhdHMgYW5kIG1hbGxpbmZvKSBoYXZlIGV4ZWN1dGlvbgotICB0aW1lcyB0aGF0IGFyZSBib3VuZGVkIGJ5IGEgY29uc3RhbnQgZmFjdG9yIG9mIHRoZSBudW1iZXIgb2YgYml0cyBpbgotICBhIHNpemVfdCwgbm90IGNvdW50aW5nIGFueSBjbGVhcmluZyBpbiBjYWxsb2Mgb3IgY29weWluZyBpbiByZWFsbG9jLAotICBvciBhY3Rpb25zIHN1cnJvdW5kaW5nIE1PUkVDT1JFIGFuZCBNTUFQIHRoYXQgaGF2ZSB0aW1lcwotICBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiBub24tY29udGlndW91cyByZWdpb25zIHJldHVybmVkIGJ5Ci0gIHN5c3RlbSBhbGxvY2F0aW9uIHJvdXRpbmVzLCB3aGljaCBpcyBvZnRlbiBqdXN0IDEuCi0KLSAgVGhlIGltcGxlbWVudGF0aW9uIGlzIG5vdCB2ZXJ5IG1vZHVsYXIgYW5kIHNlcmlvdXNseSBvdmVydXNlcwotICBtYWNyb3MuIFBlcmhhcHMgc29tZWRheSBhbGwgQyBjb21waWxlcnMgd2lsbCBkbyBhcyBnb29kIGEgam9iCi0gIGlubGluaW5nIG1vZHVsYXIgY29kZSBhcyBjYW4gbm93IGJlIGRvbmUgYnkgYnJ1dGUtZm9yY2UgZXhwYW5zaW9uLAotICBidXQgbm93LCBlbm91Z2ggb2YgdGhlbSBzZWVtIG5vdCB0by4KLQotICBTb21lIGNvbXBpbGVycyBpc3N1ZSBhIGxvdCBvZiB3YXJuaW5ncyBhYm91dCBjb2RlIHRoYXQgaXMKLSAgZGVhZC91bnJlYWNoYWJsZSBvbmx5IG9uIHNvbWUgcGxhdGZvcm1zLCBhbmQgYWxzbyBhYm91dCBpbnRlbnRpb25hbAotICB1c2VzIG9mIG5lZ2F0aW9uIG9uIHVuc2lnbmVkIHR5cGVzLiBBbGwga25vd24gY2FzZXMgb2YgZWFjaCBjYW4gYmUKLSAgaWdub3JlZC4KLQotICBGb3IgYSBsb25nZXIgYnV0IG91dCBvZiBkYXRlIGhpZ2gtbGV2ZWwgZGVzY3JpcHRpb24sIHNlZQotICAgICBodHRwOi8vZ2VlLmNzLm9zd2Vnby5lZHUvZGwvaHRtbC9tYWxsb2MuaHRtbAotCi0qIE1TUEFDRVMKLSAgSWYgTVNQQUNFUyBpcyBkZWZpbmVkLCB0aGVuIGluIGFkZGl0aW9uIHRvIG1hbGxvYywgZnJlZSwgZXRjLiwKLSAgdGhpcyBmaWxlIGFsc28gZGVmaW5lcyBtc3BhY2VfbWFsbG9jLCBtc3BhY2VfZnJlZSwgZXRjLiBUaGVzZQotICBhcmUgdmVyc2lvbnMgb2YgbWFsbG9jIHJvdXRpbmVzIHRoYXQgdGFrZSBhbiAibXNwYWNlIiBhcmd1bWVudAotICBvYnRhaW5lZCB1c2luZyBjcmVhdGVfbXNwYWNlLCB0byBjb250cm9sIGFsbCBpbnRlcm5hbCBib29ra2VlcGluZy4KLSAgSWYgT05MWV9NU1BBQ0VTIGlzIGRlZmluZWQsIG9ubHkgdGhlc2UgdmVyc2lvbnMgYXJlIGNvbXBpbGVkLgotICBTbyBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhpcyBhbGxvY2F0b3IgZm9yIG9ubHkgc29tZSBhbGxvY2F0aW9ucywKLSAgYW5kIHlvdXIgc3lzdGVtIG1hbGxvYyBmb3Igb3RoZXJzLCB5b3UgY2FuIGNvbXBpbGUgd2l0aAotICBPTkxZX01TUEFDRVMgYW5kIHRoZW4gZG8gc29tZXRoaW5nIGxpa2UuLi4KLSAgICBzdGF0aWMgbXNwYWNlIG15bXNwYWNlID0gY3JlYXRlX21zcGFjZSgwLDApOyAvLyBmb3IgZXhhbXBsZQotICAgICNkZWZpbmUgbXltYWxsb2MoYnl0ZXMpICBtc3BhY2VfbWFsbG9jKG15bXNwYWNlLCBieXRlcykKLQotICAoTm90ZTogSWYgeW91IG9ubHkgbmVlZCBvbmUgaW5zdGFuY2Ugb2YgYW4gbXNwYWNlLCB5b3UgY2FuIGluc3RlYWQKLSAgdXNlICJVU0VfRExfUFJFRklYIiB0byByZWxhYmVsIHRoZSBnbG9iYWwgbWFsbG9jLikKLQotICBZb3UgY2FuIHNpbWlsYXJseSBjcmVhdGUgdGhyZWFkLWxvY2FsIGFsbG9jYXRvcnMgYnkgc3RvcmluZwotICBtc3BhY2VzIGFzIHRocmVhZC1sb2NhbHMuIEZvciBleGFtcGxlOgotICAgIHN0YXRpYyBfX3RocmVhZCBtc3BhY2UgdGxtcyA9IDA7Ci0gICAgdm9pZCogIHRsbWFsbG9jKHNpemVfdCBieXRlcykgewotICAgICAgaWYgKHRsbXMgPT0gMCkgdGxtcyA9IGNyZWF0ZV9tc3BhY2UoMCwgMCk7Ci0gICAgICByZXR1cm4gbXNwYWNlX21hbGxvYyh0bG1zLCBieXRlcyk7Ci0gICAgfQotICAgIHZvaWQgIHRsZnJlZSh2b2lkKiBtZW0pIHsgbXNwYWNlX2ZyZWUodGxtcywgbWVtKTsgfQotCi0gIFVubGVzcyBGT09URVJTIGlzIGRlZmluZWQsIGVhY2ggbXNwYWNlIGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQuCi0gIFlvdSBjYW5ub3QgYWxsb2NhdGUgZnJvbSBvbmUgYW5kIGZyZWUgdG8gYW5vdGhlciAoYWx0aG91Z2gKLSAgY29uZm9ybWFuY2UgaXMgb25seSB3ZWFrbHkgY2hlY2tlZCwgc28gdXNhZ2UgZXJyb3JzIGFyZSBub3QgYWx3YXlzCi0gIGNhdWdodCkuIElmIEZPT1RFUlMgaXMgZGVmaW5lZCwgdGhlbiBlYWNoIGNodW5rIGNhcnJpZXMgYXJvdW5kIGEgdGFnCi0gIGluZGljYXRpbmcgaXRzIG9yaWdpbmF0aW5nIG1zcGFjZSwgYW5kIGZyZWVzIGFyZSBkaXJlY3RlZCB0byB0aGVpcgotICBvcmlnaW5hdGluZyBzcGFjZXMuCi0KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDb21waWxlLXRpbWUgb3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQmUgY2FyZWZ1bCBpbiBzZXR0aW5nICNkZWZpbmUgdmFsdWVzIGZvciBudW1lcmljYWwgY29uc3RhbnRzIG9mIHR5cGUKLXNpemVfdC4gT24gc29tZSBzeXN0ZW1zLCBsaXRlcmFsIHZhbHVlcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQKLXRvIHNpemVfdCBwcmVjaXNpb24gdW5sZXNzIHRoZXkgYXJlIGV4cGxpY2l0bHkgY2FzdGVkLgotCi1XSU4zMiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmaW5lZCBpZiBfV0lOMzIgZGVmaW5lZAotICBEZWZpbmluZyBXSU4zMiBzZXRzIHVwIGRlZmF1bHRzIGZvciBNUyBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXJzLgotICBPdGhlcndpc2UgZGVmYXVsdHMgYXJlIGZvciB1bml4LgotCi1NQUxMT0NfQUxJR05NRU5UICAgICAgICAgZGVmYXVsdDogKHNpemVfdCk4Ci0gIENvbnRyb2xzIHRoZSBtaW5pbXVtIGFsaWdubWVudCBmb3IgbWFsbG9jJ2VkIGNodW5rcy4gIEl0IG11c3QgYmUgYQotICBwb3dlciBvZiB0d28gYW5kIGF0IGxlYXN0IDgsIGV2ZW4gb24gbWFjaGluZXMgZm9yIHdoaWNoIHNtYWxsZXIKLSAgYWxpZ25tZW50cyB3b3VsZCBzdWZmaWNlLiBJdCBtYXkgYmUgZGVmaW5lZCBhcyBsYXJnZXIgdGhhbiB0aGlzCi0gIHRob3VnaC4gTm90ZSBob3dldmVyIHRoYXQgY29kZSBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBvcHRpbWl6ZWQgZm9yCi0gIHRoZSBjYXNlIG9mIDgtYnl0ZSBhbGlnbm1lbnQuCi0KLU1TUEFDRVMgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAwIChmYWxzZSkKLSAgSWYgdHJ1ZSwgY29tcGlsZSBpbiBzdXBwb3J0IGZvciBpbmRlcGVuZGVudCBhbGxvY2F0aW9uIHNwYWNlcy4KLSAgVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpZiBIQVZFX01NQVAgaXMgdHJ1ZS4KLQotT05MWV9NU1BBQ0VTICAgICAgICAgICAgIGRlZmF1bHQ6IDAgKGZhbHNlKQotICBJZiB0cnVlLCBvbmx5IGNvbXBpbGUgaW4gbXNwYWNlIHZlcnNpb25zLCBub3QgcmVndWxhciB2ZXJzaW9ucy4KLQotVVNFX0xPQ0tTICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAgKGZhbHNlKQotICBDYXVzZXMgZWFjaCBjYWxsIHRvIGVhY2ggcHVibGljIHJvdXRpbmUgdG8gYmUgc3Vycm91bmRlZCB3aXRoCi0gIHB0aHJlYWQgb3IgV0lOMzIgbXV0ZXggbG9jay91bmxvY2suIChJZiBzZXQgdHJ1ZSwgdGhpcyBjYW4gYmUKLSAgb3ZlcnJpZGRlbiBvbiBhIHBlci1tc3BhY2UgYmFzaXMgZm9yIG1zcGFjZSB2ZXJzaW9ucy4pCi0KLUZPT1RFUlMgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAwCi0gIElmIHRydWUsIHByb3ZpZGUgZXh0cmEgY2hlY2tpbmcgYW5kIGRpc3BhdGNoaW5nIGJ5IHBsYWNpbmcKLSAgaW5mb3JtYXRpb24gaW4gdGhlIGZvb3RlcnMgb2YgYWxsb2NhdGVkIGNodW5rcy4gVGhpcyBhZGRzCi0gIHNwYWNlIGFuZCB0aW1lIG92ZXJoZWFkLgotCi1JTlNFQ1VSRSAgICAgICAgICAgICAgICAgZGVmYXVsdDogMAotICBJZiB0cnVlLCBvbWl0IGNoZWNrcyBmb3IgdXNhZ2UgZXJyb3JzIGFuZCBoZWFwIHNwYWNlIG92ZXJ3cml0ZXMuCi0KLVVTRV9ETF9QUkVGSVggICAgICAgICAgICBkZWZhdWx0OiBOT1QgZGVmaW5lZAotICBDYXVzZXMgY29tcGlsZXIgdG8gcHJlZml4IGFsbCBwdWJsaWMgcm91dGluZXMgd2l0aCB0aGUgc3RyaW5nICdkbCcuCi0gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdSBvbmx5IHdhbnQgdG8gdXNlIHRoaXMgbWFsbG9jIGluIG9uZSBwYXJ0Ci0gIG9mIGEgcHJvZ3JhbSwgdXNpbmcgeW91ciByZWd1bGFyIHN5c3RlbSBtYWxsb2MgZWxzZXdoZXJlLgotCi1BQk9SVCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmaW5lZCBhcyBhYm9ydCgpCi0gIERlZmluZXMgaG93IHRvIGFib3J0IG9uIGZhaWxlZCBjaGVja3MuICBPbiBtb3N0IHN5c3RlbXMsIGEgZmFpbGVkCi0gIGNoZWNrIGNhbm5vdCBkaWUgd2l0aCBhbiAiYXNzZXJ0IiBvciBldmVuIHByaW50IGFuIGluZm9ybWF0aXZlCi0gIG1lc3NhZ2UsIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgcHJpbnQgcm91dGluZXMgaW4gdHVybiBjYWxsIG1hbGxvYywKLSAgd2hpY2ggd2lsbCBmYWlsIGFnYWluLiAgR2VuZXJhbGx5LCB0aGUgYmVzdCBwb2xpY3kgaXMgdG8gc2ltcGx5IGNhbGwKLSAgYWJvcnQoKS4gSXQncyBub3QgdmVyeSB1c2VmdWwgdG8gZG8gbW9yZSB0aGFuIHRoaXMgYmVjYXVzZSBtYW55Ci0gIGVycm9ycyBkdWUgdG8gb3ZlcndyaXRpbmcgd2lsbCBzaG93IHVwIGFzIGFkZHJlc3MgZmF1bHRzIChudWxsLCBvZGQKLSAgYWRkcmVzc2VzIGV0YykgcmF0aGVyIHRoYW4gbWFsbG9jLXRyaWdnZXJlZCBjaGVja3MsIHNvIHdpbGwgYWxzbwotICBhYm9ydC4gIEFsc28sIG1vc3QgY29tcGlsZXJzIGtub3cgdGhhdCBhYm9ydCgpIGRvZXMgbm90IHJldHVybiwgc28KLSAgY2FuIGJldHRlciBvcHRpbWl6ZSBjb2RlIGNvbmRpdGlvbmFsbHkgY2FsbGluZyBpdC4KLQotUFJPQ0VFRF9PTl9FUlJPUiAgICAgICAgICAgZGVmYXVsdDogZGVmaW5lZCBhcyAwIChmYWxzZSkKLSAgQ29udHJvbHMgd2hldGhlciBkZXRlY3RlZCBiYWQgYWRkcmVzc2VzIGNhdXNlIHRoZW0gdG8gYnlwYXNzZWQKLSAgcmF0aGVyIHRoYW4gYWJvcnRpbmcuIElmIHNldCwgZGV0ZWN0ZWQgYmFkIGFyZ3VtZW50cyB0byBmcmVlIGFuZAotICByZWFsbG9jIGFyZSBpZ25vcmVkLiBBbmQgYWxsIGJvb2trZWVwaW5nIGluZm9ybWF0aW9uIGlzIHplcm9lZCBvdXQKLSAgdXBvbiBhIGRldGVjdGVkIG92ZXJ3cml0ZSBvZiBmcmVlZCBoZWFwIHNwYWNlLCB0aHVzIGxvc2luZyB0aGUKLSAgYWJpbGl0eSB0byBldmVyIHJldHVybiBpdCBmcm9tIG1hbGxvYyBhZ2FpbiwgYnV0IGVuYWJsaW5nIHRoZQotICBhcHBsaWNhdGlvbiB0byBwcm9jZWVkLiBJZiBQUk9DRUVEX09OX0VSUk9SIGlzIGRlZmluZWQsIHRoZQotICBzdGF0aWMgdmFyaWFibGUgbWFsbG9jX2NvcnJ1cHRpb25fZXJyb3JfY291bnQgaXMgY29tcGlsZWQgaW4KLSAgYW5kIGNhbiBiZSBleGFtaW5lZCB0byBzZWUgaWYgZXJyb3JzIGhhdmUgb2NjdXJyZWQuIFRoaXMgb3B0aW9uCi0gIGdlbmVyYXRlcyBzbG93ZXIgY29kZSB0aGFuIHRoZSBkZWZhdWx0IGFib3J0IHBvbGljeS4KLQotREVCVUcgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IE5PVCBkZWZpbmVkCi0gIFRoZSBERUJVRyBzZXR0aW5nIGlzIG1haW5seSBpbnRlbmRlZCBmb3IgcGVvcGxlIHRyeWluZyB0byBtb2RpZnkKLSAgdGhpcyBjb2RlIG9yIGRpYWdub3NlIHByb2JsZW1zIHdoZW4gcG9ydGluZyB0byBuZXcgcGxhdGZvcm1zLgotICBIb3dldmVyLCBpdCBtYXkgYWxzbyBiZSBhYmxlIHRvIGJldHRlciBpc29sYXRlIHVzZXIgZXJyb3JzIHRoYW4ganVzdAotICB1c2luZyBydW50aW1lIGNoZWNrcy4gIFRoZSBhc3NlcnRpb25zIGluIHRoZSBjaGVjayByb3V0aW5lcyBzcGVsbAotICBvdXQgaW4gbW9yZSBkZXRhaWwgdGhlIGFzc3VtcHRpb25zIGFuZCBpbnZhcmlhbnRzIHVuZGVybHlpbmcgdGhlCi0gIGFsZ29yaXRobXMuICBUaGUgY2hlY2tpbmcgaXMgZmFpcmx5IGV4dGVuc2l2ZSwgYW5kIHdpbGwgc2xvdyBkb3duCi0gIGV4ZWN1dGlvbiBub3RpY2VhYmx5LiBDYWxsaW5nIG1hbGxvY19zdGF0cyBvciBtYWxsaW5mbyB3aXRoIERFQlVHCi0gIHNldCB3aWxsIGF0dGVtcHQgdG8gY2hlY2sgZXZlcnkgbm9uLW1tYXBwZWQgYWxsb2NhdGVkIGFuZCBmcmVlIGNodW5rCi0gIGluIHRoZSBjb3Vyc2Ugb2YgY29tcHV0aW5nIHRoZSBzdW1tYXJpZXMuCi0KLUFCT1JUX09OX0FTU0VSVF9GQUlMVVJFICAgZGVmYXVsdDogZGVmaW5lZCBhcyAxICh0cnVlKQotICBEZWJ1Z2dpbmcgYXNzZXJ0aW9uIGZhaWx1cmVzIGNhbiBiZSBuZWFybHkgaW1wb3NzaWJsZSBpZiB5b3VyCi0gIHZlcnNpb24gb2YgdGhlIGFzc2VydCBtYWNybyBjYXVzZXMgbWFsbG9jIHRvIGJlIGNhbGxlZCwgd2hpY2ggd2lsbAotICBsZWFkIHRvIGEgY2FzY2FkZSBvZiBmdXJ0aGVyIGZhaWx1cmVzLCBibG93aW5nIHRoZSBydW50aW1lIHN0YWNrLgotICBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRSBjYXVzZSBhc3NlcnRpb25zIGZhaWx1cmVzIHRvIGNhbGwgYWJvcnQoKSwKLSAgd2hpY2ggd2lsbCB1c3VhbGx5IG1ha2UgZGVidWdnaW5nIGVhc2llci4KLQotTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICAgICBkZWZhdWx0OiBzZXRzIGVycm5vIHRvIEVOT01FTSwgb3Igbm8tb3Agb24gd2luMzIKLSAgVGhlIGFjdGlvbiB0byB0YWtlIGJlZm9yZSAicmV0dXJuIDAiIHdoZW4gbWFsbG9jIGZhaWxzIHRvIGJlIGFibGUgdG8KLSAgcmV0dXJuIG1lbW9yeSBiZWNhdXNlIHRoZXJlIGlzIG5vbmUgYXZhaWxhYmxlLgotCi1IQVZFX01PUkVDT1JFICAgICAgICAgICAgIGRlZmF1bHQ6IDEgKHRydWUpIHVubGVzcyB3aW4zMiBvciBPTkxZX01TUEFDRVMKLSAgVHJ1ZSBpZiB0aGlzIHN5c3RlbSBzdXBwb3J0cyBzYnJrIG9yIGFuIGVtdWxhdGlvbiBvZiBpdC4KLQotTU9SRUNPUkUgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBzYnJrCi0gIFRoZSBuYW1lIG9mIHRoZSBzYnJrLXN0eWxlIHN5c3RlbSByb3V0aW5lIHRvIGNhbGwgdG8gb2J0YWluIG1vcmUKLSAgbWVtb3J5LiAgU2VlIGJlbG93IGZvciBndWlkYW5jZSBvbiB3cml0aW5nIGN1c3RvbSBNT1JFQ09SRQotICBmdW5jdGlvbnMuIFRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudCB0byBzYnJrL01PUkVDT1JFIHZhcmllcyBhY3Jvc3MKLSAgc3lzdGVtcy4gIEl0IGNhbm5vdCBiZSBzaXplX3QsIGJlY2F1c2UgaXQgc3VwcG9ydHMgbmVnYXRpdmUKLSAgYXJndW1lbnRzLCBzbyBpdCBpcyBub3JtYWxseSB0aGUgc2lnbmVkIHR5cGUgb2YgdGhlIHNhbWUgd2lkdGggYXMKLSAgc2l6ZV90IChzb21ldGltZXMgZGVjbGFyZWQgYXMgImludHB0cl90IikuICBJdCBkb2Vzbid0IG11Y2ggbWF0dGVyCi0gIHRob3VnaC4gSW50ZXJuYWxseSwgd2Ugb25seSBjYWxsIGl0IHdpdGggYXJndW1lbnRzIGxlc3MgdGhhbiBoYWxmCi0gIHRoZSBtYXggdmFsdWUgb2YgYSBzaXplX3QsIHdoaWNoIHNob3VsZCB3b3JrIGFjcm9zcyBhbGwgcmVhc29uYWJsZQotICBwb3NzaWJpbGl0aWVzLCBhbHRob3VnaCBzb21ldGltZXMgZ2VuZXJhdGluZyBjb21waWxlciB3YXJuaW5ncy4gIFNlZQotICBuZWFyIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGZvciBndWlkZWxpbmVzIGZvciBjcmVhdGluZyBhIGN1c3RvbQotICB2ZXJzaW9uIG9mIE1PUkVDT1JFLgotCi1NT1JFQ09SRV9DT05USUdVT1VTICAgICAgIGRlZmF1bHQ6IDEgKHRydWUpCi0gIElmIHRydWUsIHRha2UgYWR2YW50YWdlIG9mIGZhY3QgdGhhdCBjb25zZWN1dGl2ZSBjYWxscyB0byBNT1JFQ09SRQotICB3aXRoIHBvc2l0aXZlIGFyZ3VtZW50cyBhbHdheXMgcmV0dXJuIGNvbnRpZ3VvdXMgaW5jcmVhc2luZwotICBhZGRyZXNzZXMuICBUaGlzIGlzIHRydWUgb2YgdW5peCBzYnJrLiBJdCBkb2VzIG5vdCBodXJ0IHRvbyBtdWNoIHRvCi0gIHNldCBpdCB0cnVlIGFueXdheSwgc2luY2UgbWFsbG9jIGNvcGVzIHdpdGggbm9uLWNvbnRpZ3VpdGllcy4KLSAgU2V0dGluZyBpdCBmYWxzZSB3aGVuIGRlZmluaXRlbHkgbm9uLWNvbnRpZ3VvdXMgc2F2ZXMgdGltZQotICBhbmQgcG9zc2libHkgd2FzdGVkIHNwYWNlIGl0IHdvdWxkIHRha2UgdG8gZGlzY292ZXIgdGhpcyB0aG91Z2guCi0KLU1PUkVDT1JFX0NBTk5PVF9UUklNICAgICAgZGVmYXVsdDogTk9UIGRlZmluZWQKLSAgVHJ1ZSBpZiBNT1JFQ09SRSBjYW5ub3QgcmVsZWFzZSBzcGFjZSBiYWNrIHRvIHRoZSBzeXN0ZW0gd2hlbiBnaXZlbgotICBuZWdhdGl2ZSBhcmd1bWVudHMuIFRoaXMgaXMgZ2VuZXJhbGx5IG5lY2Vzc2FyeSBvbmx5IGlmIHlvdSBhcmUKLSAgdXNpbmcgYSBoYW5kLWNyYWZ0ZWQgTU9SRUNPUkUgZnVuY3Rpb24gdGhhdCBjYW5ub3QgaGFuZGxlIG5lZ2F0aXZlCi0gIGFyZ3VtZW50cy4KLQotSEFWRV9NTUFQICAgICAgICAgICAgICAgICBkZWZhdWx0OiAxICh0cnVlKQotICBUcnVlIGlmIHRoaXMgc3lzdGVtIHN1cHBvcnRzIG1tYXAgb3IgYW4gZW11bGF0aW9uIG9mIGl0LiAgSWYgc28sIGFuZAotICBIQVZFX01PUkVDT1JFIGlzIG5vdCB0cnVlLCBNTUFQIGlzIHVzZWQgZm9yIGFsbCBzeXN0ZW0KLSAgYWxsb2NhdGlvbi4gSWYgc2V0IGFuZCBIQVZFX01PUkVDT1JFIGlzIHRydWUgYXMgd2VsbCwgTU1BUCBpcwotICBwcmltYXJpbHkgdXNlZCB0byBkaXJlY3RseSBhbGxvY2F0ZSB2ZXJ5IGxhcmdlIGJsb2Nrcy4gSXQgaXMgYWxzbwotICB1c2VkIGFzIGEgYmFja3VwIHN0cmF0ZWd5IGluIGNhc2VzIHdoZXJlIE1PUkVDT1JFIGZhaWxzIHRvIHByb3ZpZGUKLSAgc3BhY2UgZnJvbSBzeXN0ZW0uIE5vdGU6IEEgc2luZ2xlIGNhbGwgdG8gTVVOTUFQIGlzIGFzc3VtZWQgdG8gYmUKLSAgYWJsZSB0byB1bm1hcCBtZW1vcnkgdGhhdCBtYXkgaGF2ZSBiZSBhbGxvY2F0ZWQgdXNpbmcgbXVsdGlwbGUgY2FsbHMKLSAgdG8gTU1BUCwgc28gbG9uZyBhcyB0aGV5IGFyZSBhZGphY2VudC4KLQotSEFWRV9NUkVNQVAgICAgICAgICAgICAgICBkZWZhdWx0OiAxIG9uIGxpbnV4LCBlbHNlIDAKLSAgSWYgdHJ1ZSByZWFsbG9jKCkgdXNlcyBtcmVtYXAoKSB0byByZS1hbGxvY2F0ZSBsYXJnZSBibG9ja3MgYW5kCi0gIGV4dGVuZCBvciBzaHJpbmsgYWxsb2NhdGlvbiBzcGFjZXMuCi0KLU1NQVBfQ0xFQVJTICAgICAgICAgICAgICAgZGVmYXVsdDogMSBvbiB1bml4Ci0gIFRydWUgaWYgbW1hcCBjbGVhcnMgbWVtb3J5IHNvIGNhbGxvYyBkb2Vzbid0IG5lZWQgdG8uIFRoaXMgaXMgdHJ1ZQotICBmb3Igc3RhbmRhcmQgdW5peCBtbWFwIHVzaW5nIC9kZXYvemVyby4KLQotVVNFX0JVSUxUSU5fRkZTICAgICAgICAgICAgZGVmYXVsdDogMCAoaS5lLiwgbm90IHVzZWQpCi0gIENhdXNlcyBtYWxsb2MgdG8gdXNlIHRoZSBidWlsdGluIGZmcygpIGZ1bmN0aW9uIHRvIGNvbXB1dGUgaW5kaWNlcy4KLSAgU29tZSBjb21waWxlcnMgbWF5IHJlY29nbml6ZSBhbmQgaW50cmluc2lmeSBmZnMgdG8gYmUgZmFzdGVyIHRoYW4gdGhlCi0gIHN1cHBsaWVkIEMgdmVyc2lvbi4gQWxzbywgdGhlIGNhc2Ugb2YgeDg2IHVzaW5nIGdjYyBpcyBzcGVjaWFsLWNhc2VkCi0gIHRvIGFuIGFzbSBpbnN0cnVjdGlvbiwgc28gaXMgYWxyZWFkeSBhcyBmYXN0IGFzIGl0IGNhbiBiZSwgYW5kIHNvCi0gIHRoaXMgc2V0dGluZyBoYXMgbm8gZWZmZWN0LiAoT24gbW9zdCB4ODZzLCB0aGUgYXNtIHZlcnNpb24gaXMgb25seQotICBzbGlnaHRseSBmYXN0ZXIgdGhhbiB0aGUgQyB2ZXJzaW9uLikKLQotbWFsbG9jX2dldHBhZ2VzaXplICAgICAgICAgZGVmYXVsdDogZGVyaXZlIGZyb20gc3lzdGVtIGluY2x1ZGVzLCBvciA0MDk2LgotICBUaGUgc3lzdGVtIHBhZ2Ugc2l6ZS4gVG8gdGhlIGV4dGVudCBwb3NzaWJsZSwgdGhpcyBtYWxsb2MgbWFuYWdlcwotICBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtIGluIHBhZ2Utc2l6ZSB1bml0cy4gIFRoaXMgbWF5IGJlIChhbmQKLSAgdXN1YWxseSBpcykgYSBmdW5jdGlvbiByYXRoZXIgdGhhbiBhIGNvbnN0YW50LiBUaGlzIGlzIGlnbm9yZWQKLSAgaWYgV0lOMzIsIHdoZXJlIHBhZ2Ugc2l6ZSBpcyBkZXRlcm1pbmVkIHVzaW5nIGdldFN5c3RlbUluZm8gZHVyaW5nCi0gIGluaXRpYWxpemF0aW9uLgotCi1VU0VfREVWX1JBTkRPTSAgICAgICAgICAgICBkZWZhdWx0OiAwIChpLmUuLCBub3QgdXNlZCkKLSAgQ2F1c2VzIG1hbGxvYyB0byB1c2UgL2Rldi9yYW5kb20gdG8gaW5pdGlhbGl6ZSBzZWN1cmUgbWFnaWMgc2VlZCBmb3IKLSAgc3RhbXBpbmcgZm9vdGVycy4gT3RoZXJ3aXNlLCB0aGUgY3VycmVudCB0aW1lIGlzIHVzZWQuCi0KLU5PX01BTExJTkZPICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAKLSAgSWYgZGVmaW5lZCwgZG9uJ3QgY29tcGlsZSAibWFsbGluZm8iLiBUaGlzIGNhbiBiZSBhIHNpbXBsZSB3YXkKLSAgb2YgZGVhbGluZyB3aXRoIG1pc21hdGNoZXMgYmV0d2VlbiBzeXN0ZW0gZGVjbGFyYXRpb25zIGFuZAotICB0aG9zZSBpbiB0aGlzIGZpbGUuCi0KLU1BTExJTkZPX0ZJRUxEX1RZUEUgICAgICAgIGRlZmF1bHQ6IHNpemVfdAotICBUaGUgdHlwZSBvZiB0aGUgZmllbGRzIGluIHRoZSBtYWxsaW5mbyBzdHJ1Y3QuIFRoaXMgd2FzIG9yaWdpbmFsbHkKLSAgZGVmaW5lZCBhcyAiaW50IiBpbiBTVklEIGV0YywgYnV0IGlzIG1vcmUgdXNlZnVsbHkgZGVmaW5lZCBhcwotICBzaXplX3QuIFRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgaWYgIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggaXMgbm90IHNldAotCi1SRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgICAgZGVmYXVsdDogbm90IGRlZmluZWQKLSAgVGhpcyBzaG91bGQgYmUgc2V0IGlmIGEgY2FsbCB0byByZWFsbG9jIHdpdGggemVybyBieXRlcyBzaG91bGQgCi0gIGJlIHRoZSBzYW1lIGFzIGEgY2FsbCB0byBmcmVlLiBTb21lIHBlb3BsZSB0aGluayBpdCBzaG91bGQuIE90aGVyd2lzZSwgCi0gIHNpbmNlIHRoaXMgbWFsbG9jIHJldHVybnMgYSB1bmlxdWUgcG9pbnRlciBmb3IgbWFsbG9jKDApLCBzbyBkb2VzIAotICByZWFsbG9jKHAsIDApLgotCi1MQUNLU19VTklTVERfSCwgTEFDS1NfRkNOVExfSCwgTEFDS1NfU1lTX1BBUkFNX0gsIExBQ0tTX1NZU19NTUFOX0gKLUxBQ0tTX1NUUklOR1NfSCwgTEFDS1NfU1RSSU5HX0gsIExBQ0tTX1NZU19UWVBFU19ILCAgTEFDS1NfRVJSTk9fSAotTEFDS1NfU1RETElCX0ggICAgICAgICAgICAgICAgZGVmYXVsdDogTk9UIGRlZmluZWQgdW5sZXNzIG9uIFdJTjMyCi0gIERlZmluZSB0aGVzZSBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZXNlIGhlYWRlciBmaWxlcy4KLSAgWW91IG1pZ2h0IG5lZWQgdG8gbWFudWFsbHkgaW5zZXJ0IHNvbWUgb2YgdGhlIGRlY2xhcmF0aW9ucyB0aGV5IHByb3ZpZGUuCi0KLURFRkFVTFRfR1JBTlVMQVJJVFkgICAgICAgIGRlZmF1bHQ6IHBhZ2Ugc2l6ZSBpZiBNT1JFQ09SRV9DT05USUdVT1VTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1faW5mby5kd0FsbG9jYXRpb25HcmFudWxhcml0eSBpbiBXSU4zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIDY0Sy4KLSAgICAgIEFsc28gc2V0dGFibGUgdXNpbmcgbWFsbG9wdChNX0dSQU5VTEFSSVRZLCB4KQotICBUaGUgdW5pdCBmb3IgYWxsb2NhdGluZyBhbmQgZGVhbGxvY2F0aW5nIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0uICBPbgotICBtb3N0IHN5c3RlbXMgd2l0aCBjb250aWd1b3VzIE1PUkVDT1JFLCB0aGVyZSBpcyBubyByZWFzb24gdG8KLSAgbWFrZSB0aGlzIG1vcmUgdGhhbiBhIHBhZ2UuIEhvd2V2ZXIsIHN5c3RlbXMgd2l0aCBNTUFQIHRlbmQgdG8KLSAgZWl0aGVyIHJlcXVpcmUgb3IgZW5jb3VyYWdlIGxhcmdlciBncmFudWxhcml0aWVzLiAgWW91IGNhbiBpbmNyZWFzZQotICB0aGlzIHZhbHVlIHRvIHByZXZlbnQgc3lzdGVtIGFsbG9jYXRpb24gZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBzbwotICBvZnRlbiwgZXNwZWNpYWxseSBpZiB0aGV5IGFyZSBzbG93LiAgVGhlIHZhbHVlIG11c3QgYmUgYXQgbGVhc3Qgb25lCi0gIHBhZ2UgYW5kIG11c3QgYmUgYSBwb3dlciBvZiB0d28uICBTZXR0aW5nIHRvIDAgY2F1c2VzIGluaXRpYWxpemF0aW9uCi0gIHRvIGVpdGhlciBwYWdlIHNpemUgb3Igd2luMzIgcmVnaW9uIHNpemUuICAoTm90ZTogSW4gcHJldmlvdXMKLSAgdmVyc2lvbnMgb2YgbWFsbG9jLCB0aGUgZXF1aXZhbGVudCBvZiB0aGlzIG9wdGlvbiB3YXMgY2FsbGVkCi0gICJUT1BfUEFEIikKLQotREVGQVVMVF9UUklNX1RIUkVTSE9MRCAgICBkZWZhdWx0OiAyTUIKLSAgICAgIEFsc28gc2V0dGFibGUgdXNpbmcgbWFsbG9wdChNX1RSSU1fVEhSRVNIT0xELCB4KQotICBUaGUgbWF4aW11bSBhbW91bnQgb2YgdW51c2VkIHRvcC1tb3N0IG1lbW9yeSB0byBrZWVwIGJlZm9yZQotICByZWxlYXNpbmcgdmlhIG1hbGxvY190cmltIGluIGZyZWUoKS4gIEF1dG9tYXRpYyB0cmltbWluZyBpcyBtYWlubHkKLSAgdXNlZnVsIGluIGxvbmctbGl2ZWQgcHJvZ3JhbXMgdXNpbmcgY29udGlndW91cyBNT1JFQ09SRS4gIEJlY2F1c2UKLSAgdHJpbW1pbmcgdmlhIHNicmsgY2FuIGJlIHNsb3cgb24gc29tZSBzeXN0ZW1zLCBhbmQgY2FuIHNvbWV0aW1lcyBiZQotICB3YXN0ZWZ1bCAoaW4gY2FzZXMgd2hlcmUgcHJvZ3JhbXMgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkIGFsbG9jYXRlCi0gIG1vcmUgbGFyZ2UgY2h1bmtzKSB0aGUgdmFsdWUgc2hvdWxkIGJlIGhpZ2ggZW5vdWdoIHNvIHRoYXQgeW91cgotICBvdmVyYWxsIHN5c3RlbSBwZXJmb3JtYW5jZSB3b3VsZCBpbXByb3ZlIGJ5IHJlbGVhc2luZyB0aGlzIG11Y2gKLSAgbWVtb3J5LiAgQXMgYSByb3VnaCBndWlkZSwgeW91IG1pZ2h0IHNldCB0byBhIHZhbHVlIGNsb3NlIHRvIHRoZQotICBhdmVyYWdlIHNpemUgb2YgYSBwcm9jZXNzIChwcm9ncmFtKSBydW5uaW5nIG9uIHlvdXIgc3lzdGVtLgotICBSZWxlYXNpbmcgdGhpcyBtdWNoIG1lbW9yeSB3b3VsZCBhbGxvdyBzdWNoIGEgcHJvY2VzcyB0byBydW4gaW4KLSAgbWVtb3J5LiAgR2VuZXJhbGx5LCBpdCBpcyB3b3J0aCB0dW5pbmcgdHJpbSB0aHJlc2hvbGRzIHdoZW4gYQotICBwcm9ncmFtIHVuZGVyZ29lcyBwaGFzZXMgd2hlcmUgc2V2ZXJhbCBsYXJnZSBjaHVua3MgYXJlIGFsbG9jYXRlZAotICBhbmQgcmVsZWFzZWQgaW4gd2F5cyB0aGF0IGNhbiByZXVzZSBlYWNoIG90aGVyJ3Mgc3RvcmFnZSwgcGVyaGFwcwotICBtaXhlZCB3aXRoIHBoYXNlcyB3aGVyZSB0aGVyZSBhcmUgbm8gc3VjaCBjaHVua3MgYXQgYWxsLiBUaGUgdHJpbQotICB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBwYWdlIHNpemUgdG8gaGF2ZSBhbnkgdXNlZnVsIGVmZmVjdC4gIFRvCi0gIGRpc2FibGUgdHJpbW1pbmcgY29tcGxldGVseSwgeW91IGNhbiBzZXQgdG8gTUFYX1NJWkVfVC4gTm90ZSB0aGF0IHRoZSB0cmljawotICBzb21lIHBlb3BsZSB1c2Ugb2YgbWFsbG9jaW5nIGEgaHVnZSBzcGFjZSBhbmQgdGhlbiBmcmVlaW5nIGl0IGF0Ci0gIHByb2dyYW0gc3RhcnR1cCwgaW4gYW4gYXR0ZW1wdCB0byByZXNlcnZlIHN5c3RlbSBtZW1vcnksIGRvZXNuJ3QKLSAgaGF2ZSB0aGUgaW50ZW5kZWQgZWZmZWN0IHVuZGVyIGF1dG9tYXRpYyB0cmltbWluZywgc2luY2UgdGhhdCBtZW1vcnkKLSAgd2lsbCBpbW1lZGlhdGVseSBiZSByZXR1cm5lZCB0byB0aGUgc3lzdGVtLgotCi1ERUZBVUxUX01NQVBfVEhSRVNIT0xEICAgICAgIGRlZmF1bHQ6IDI1NksKLSAgICAgIEFsc28gc2V0dGFibGUgdXNpbmcgbWFsbG9wdChNX01NQVBfVEhSRVNIT0xELCB4KQotICBUaGUgcmVxdWVzdCBzaXplIHRocmVzaG9sZCBmb3IgdXNpbmcgTU1BUCB0byBkaXJlY3RseSBzZXJ2aWNlIGEKLSAgcmVxdWVzdC4gUmVxdWVzdHMgb2YgYXQgbGVhc3QgdGhpcyBzaXplIHRoYXQgY2Fubm90IGJlIGFsbG9jYXRlZAotICB1c2luZyBhbHJlYWR5LWV4aXN0aW5nIHNwYWNlIHdpbGwgYmUgc2VydmljZWQgdmlhIG1tYXAuICAoSWYgZW5vdWdoCi0gIG5vcm1hbCBmcmVlZCBzcGFjZSBhbHJlYWR5IGV4aXN0cyBpdCBpcyB1c2VkIGluc3RlYWQuKSAgVXNpbmcgbW1hcAotICBzZWdyZWdhdGVzIHJlbGF0aXZlbHkgbGFyZ2UgY2h1bmtzIG9mIG1lbW9yeSBzbyB0aGF0IHRoZXkgY2FuIGJlCi0gIGluZGl2aWR1YWxseSBvYnRhaW5lZCBhbmQgcmVsZWFzZWQgZnJvbSB0aGUgaG9zdCBzeXN0ZW0uIEEgcmVxdWVzdAotICBzZXJ2aWNlZCB0aHJvdWdoIG1tYXAgaXMgbmV2ZXIgcmV1c2VkIGJ5IGFueSBvdGhlciByZXF1ZXN0IChhdCBsZWFzdAotICBub3QgZGlyZWN0bHk7IHRoZSBzeXN0ZW0gbWF5IGp1c3Qgc28gaGFwcGVuIHRvIHJlbWFwIHN1Y2Nlc3NpdmUKLSAgcmVxdWVzdHMgdG8gdGhlIHNhbWUgbG9jYXRpb25zKS4gIFNlZ3JlZ2F0aW5nIHNwYWNlIGluIHRoaXMgd2F5IGhhcwotICB0aGUgYmVuZWZpdHMgdGhhdDogTW1hcHBlZCBzcGFjZSBjYW4gYWx3YXlzIGJlIGluZGl2aWR1YWxseSByZWxlYXNlZAotICBiYWNrIHRvIHRoZSBzeXN0ZW0sIHdoaWNoIGhlbHBzIGtlZXAgdGhlIHN5c3RlbSBsZXZlbCBtZW1vcnkgZGVtYW5kcwotICBvZiBhIGxvbmctbGl2ZWQgcHJvZ3JhbSBsb3cuICBBbHNvLCBtYXBwZWQgbWVtb3J5IGRvZXNuJ3QgYmVjb21lCi0gIGBsb2NrZWQnIGJldHdlZW4gb3RoZXIgY2h1bmtzLCBhcyBjYW4gaGFwcGVuIHdpdGggbm9ybWFsbHkgYWxsb2NhdGVkCi0gIGNodW5rcywgd2hpY2ggbWVhbnMgdGhhdCBldmVuIHRyaW1taW5nIHZpYSBtYWxsb2NfdHJpbSB3b3VsZCBub3QKLSAgcmVsZWFzZSB0aGVtLiAgSG93ZXZlciwgaXQgaGFzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCB0aGUgc3BhY2UKLSAgY2Fubm90IGJlIHJlY2xhaW1lZCwgY29uc29saWRhdGVkLCBhbmQgdGhlbiB1c2VkIHRvIHNlcnZpY2UgbGF0ZXIKLSAgcmVxdWVzdHMsIGFzIGhhcHBlbnMgd2l0aCBub3JtYWwgY2h1bmtzLiAgVGhlIGFkdmFudGFnZXMgb2YgbW1hcAotICBuZWFybHkgYWx3YXlzIG91dHdlaWdoIGRpc2FkdmFudGFnZXMgZm9yICJsYXJnZSIgY2h1bmtzLCBidXQgdGhlCi0gIHZhbHVlIG9mICJsYXJnZSIgbWF5IHZhcnkgYWNyb3NzIHN5c3RlbXMuICBUaGUgZGVmYXVsdCBpcyBhbgotICBlbXBpcmljYWxseSBkZXJpdmVkIHZhbHVlIHRoYXQgd29ya3Mgd2VsbCBpbiBtb3N0IHN5c3RlbXMuIFlvdSBjYW4KLSAgZGlzYWJsZSBtbWFwIGJ5IHNldHRpbmcgdG8gTUFYX1NJWkVfVC4KLQotKi8KLQotI2lmbmRlZiBXSU4zMgotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBXSU4zMiAxCi0jZW5kaWYgIC8qIF9XSU4zMiAqLwotI2VuZGlmICAvKiBXSU4zMiAqLwotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIEhBVkVfTU9SRUNPUkUgMAotI2RlZmluZSBMQUNLU19VTklTVERfSAotI2RlZmluZSBMQUNLU19TWVNfUEFSQU1fSAotI2RlZmluZSBMQUNLU19TWVNfTU1BTl9ICi0jZGVmaW5lIExBQ0tTX1NUUklOR19ICi0jZGVmaW5lIExBQ0tTX1NUUklOR1NfSAotI2RlZmluZSBMQUNLU19TWVNfVFlQRVNfSAotI2RlZmluZSBMQUNLU19FUlJOT19ICi0jZGVmaW5lIExBQ0tTX0ZDTlRMX0ggCi0jZGVmaW5lIE1BTExPQ19GQUlMVVJFX0FDVElPTgotI2RlZmluZSBNTUFQX0NMRUFSUyAwIC8qIFdJTkNFIGFuZCBzb21lIG90aGVycyBhcHBhcmVudGx5IGRvbid0IGNsZWFyICovCi0jZW5kaWYgIC8qIFdJTjMyICovCi0KLSNpZiBkZWZpbmVkKERBUldJTikgfHwgZGVmaW5lZChfREFSV0lOKQotLyogTWFjIE9TWCBkb2NzIGFkdmlzZSBub3QgdG8gdXNlIHNicms7IGl0IHNlZW1zIGJldHRlciB0byB1c2UgbW1hcCAqLwotI2lmbmRlZiBIQVZFX01PUkVDT1JFCi0jZGVmaW5lIEhBVkVfTU9SRUNPUkUgMAotI2RlZmluZSBIQVZFX01NQVAgMQotI2VuZGlmICAvKiBIQVZFX01PUkVDT1JFICovCi0jZW5kaWYgIC8qIERBUldJTiAqLwotCi0jaWZuZGVmIExBQ0tTX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvKiBGb3Igc2l6ZV90ICovCi0jZW5kaWYgIC8qIExBQ0tTX1NZU19UWVBFU19IICovCi0KLS8qIFRoZSBtYXhpbXVtIHBvc3NpYmxlIHNpemVfdCB2YWx1ZSBoYXMgYWxsIGJpdHMgc2V0ICovCi0jZGVmaW5lIE1BWF9TSVpFX1QgICAgICAgICAgICh+KHNpemVfdCkwKQotCi0jaWZuZGVmIE9OTFlfTVNQQUNFUwotI2RlZmluZSBPTkxZX01TUEFDRVMgMAotI2VuZGlmICAvKiBPTkxZX01TUEFDRVMgKi8KLSNpZm5kZWYgTVNQQUNFUwotI2lmIE9OTFlfTVNQQUNFUwotI2RlZmluZSBNU1BBQ0VTIDEKLSNlbHNlICAgLyogT05MWV9NU1BBQ0VTICovCi0jZGVmaW5lIE1TUEFDRVMgMAotI2VuZGlmICAvKiBPTkxZX01TUEFDRVMgKi8KLSNlbmRpZiAgLyogTVNQQUNFUyAqLwotI2lmbmRlZiBNQUxMT0NfQUxJR05NRU5UCi0jZGVmaW5lIE1BTExPQ19BTElHTk1FTlQgKChzaXplX3QpOFUpCi0jZW5kaWYgIC8qIE1BTExPQ19BTElHTk1FTlQgKi8KLSNpZm5kZWYgRk9PVEVSUwotI2RlZmluZSBGT09URVJTIDAKLSNlbmRpZiAgLyogRk9PVEVSUyAqLwotI2lmbmRlZiBBQk9SVAotI2RlZmluZSBBQk9SVCAgYWJvcnQoKQotI2VuZGlmICAvKiBBQk9SVCAqLwotI2lmbmRlZiBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRQotI2RlZmluZSBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRSAxCi0jZW5kaWYgIC8qIEFCT1JUX09OX0FTU0VSVF9GQUlMVVJFICovCi0jaWZuZGVmIFBST0NFRURfT05fRVJST1IKLSNkZWZpbmUgUFJPQ0VFRF9PTl9FUlJPUiAwCi0jZW5kaWYgIC8qIFBST0NFRURfT05fRVJST1IgKi8KLSNpZm5kZWYgVVNFX0xPQ0tTCi0jZGVmaW5lIFVTRV9MT0NLUyAwCi0jZW5kaWYgIC8qIFVTRV9MT0NLUyAqLwotI2lmbmRlZiBJTlNFQ1VSRQotI2RlZmluZSBJTlNFQ1VSRSAwCi0jZW5kaWYgIC8qIElOU0VDVVJFICovCi0jaWZuZGVmIEhBVkVfTU1BUAotI2RlZmluZSBIQVZFX01NQVAgMQotI2VuZGlmICAvKiBIQVZFX01NQVAgKi8KLSNpZm5kZWYgTU1BUF9DTEVBUlMKLSNkZWZpbmUgTU1BUF9DTEVBUlMgMQotI2VuZGlmICAvKiBNTUFQX0NMRUFSUyAqLwotI2lmbmRlZiBIQVZFX01SRU1BUAotI2lmZGVmIGxpbnV4Ci0jZGVmaW5lIEhBVkVfTVJFTUFQIDEKLSNlbHNlICAgLyogbGludXggKi8KLSNkZWZpbmUgSEFWRV9NUkVNQVAgMAotI2VuZGlmICAvKiBsaW51eCAqLwotI2VuZGlmICAvKiBIQVZFX01SRU1BUCAqLwotI2lmbmRlZiBNQUxMT0NfRkFJTFVSRV9BQ1RJT04KLSNkZWZpbmUgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICBlcnJubyA9IEVOT01FTTsKLSNlbmRpZiAgLyogTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICovCi0jaWZuZGVmIEhBVkVfTU9SRUNPUkUKLSNpZiBPTkxZX01TUEFDRVMKLSNkZWZpbmUgSEFWRV9NT1JFQ09SRSAwCi0jZWxzZSAgIC8qIE9OTFlfTVNQQUNFUyAqLwotI2RlZmluZSBIQVZFX01PUkVDT1JFIDEKLSNlbmRpZiAgLyogT05MWV9NU1BBQ0VTICovCi0jZW5kaWYgIC8qIEhBVkVfTU9SRUNPUkUgKi8KLSNpZiAhSEFWRV9NT1JFQ09SRQotI2RlZmluZSBNT1JFQ09SRV9DT05USUdVT1VTIDAKLSNlbHNlICAgLyogIUhBVkVfTU9SRUNPUkUgKi8KLSNpZm5kZWYgTU9SRUNPUkUKLSNkZWZpbmUgTU9SRUNPUkUgc2JyawotI2VuZGlmICAvKiBNT1JFQ09SRSAqLwotI2lmbmRlZiBNT1JFQ09SRV9DT05USUdVT1VTCi0jZGVmaW5lIE1PUkVDT1JFX0NPTlRJR1VPVVMgMQotI2VuZGlmICAvKiBNT1JFQ09SRV9DT05USUdVT1VTICovCi0jZW5kaWYgIC8qIEhBVkVfTU9SRUNPUkUgKi8KLSNpZm5kZWYgREVGQVVMVF9HUkFOVUxBUklUWQotI2lmIE1PUkVDT1JFX0NPTlRJR1VPVVMKLSNkZWZpbmUgREVGQVVMVF9HUkFOVUxBUklUWSAoMCkgIC8qIDAgbWVhbnMgdG8gY29tcHV0ZSBpbiBpbml0X21wYXJhbXMgKi8KLSNlbHNlICAgLyogTU9SRUNPUkVfQ09OVElHVU9VUyAqLwotI2RlZmluZSBERUZBVUxUX0dSQU5VTEFSSVRZICgoc2l6ZV90KTY0VSAqIChzaXplX3QpMTAyNFUpCi0jZW5kaWYgIC8qIE1PUkVDT1JFX0NPTlRJR1VPVVMgKi8KLSNlbmRpZiAgLyogREVGQVVMVF9HUkFOVUxBUklUWSAqLwotI2lmbmRlZiBERUZBVUxUX1RSSU1fVEhSRVNIT0xECi0jaWZuZGVmIE1PUkVDT1JFX0NBTk5PVF9UUklNCi0jZGVmaW5lIERFRkFVTFRfVFJJTV9USFJFU0hPTEQgKChzaXplX3QpMlUgKiAoc2l6ZV90KTEwMjRVICogKHNpemVfdCkxMDI0VSkKLSNlbHNlICAgLyogTU9SRUNPUkVfQ0FOTk9UX1RSSU0gKi8KLSNkZWZpbmUgREVGQVVMVF9UUklNX1RIUkVTSE9MRCBNQVhfU0laRV9UCi0jZW5kaWYgIC8qIE1PUkVDT1JFX0NBTk5PVF9UUklNICovCi0jZW5kaWYgIC8qIERFRkFVTFRfVFJJTV9USFJFU0hPTEQgKi8KLSNpZm5kZWYgREVGQVVMVF9NTUFQX1RIUkVTSE9MRAotI2lmIEhBVkVfTU1BUAotI2RlZmluZSBERUZBVUxUX01NQVBfVEhSRVNIT0xEICgoc2l6ZV90KTI1NlUgKiAoc2l6ZV90KTEwMjRVKQotI2Vsc2UgICAvKiBIQVZFX01NQVAgKi8KLSNkZWZpbmUgREVGQVVMVF9NTUFQX1RIUkVTSE9MRCBNQVhfU0laRV9UCi0jZW5kaWYgIC8qIEhBVkVfTU1BUCAqLwotI2VuZGlmICAvKiBERUZBVUxUX01NQVBfVEhSRVNIT0xEICovCi0jaWZuZGVmIFVTRV9CVUlMVElOX0ZGUwotI2RlZmluZSBVU0VfQlVJTFRJTl9GRlMgMAotI2VuZGlmICAvKiBVU0VfQlVJTFRJTl9GRlMgKi8KLSNpZm5kZWYgVVNFX0RFVl9SQU5ET00KLSNkZWZpbmUgVVNFX0RFVl9SQU5ET00gMAotI2VuZGlmICAvKiBVU0VfREVWX1JBTkRPTSAqLwotI2lmbmRlZiBOT19NQUxMSU5GTwotI2RlZmluZSBOT19NQUxMSU5GTyAwCi0jZW5kaWYgIC8qIE5PX01BTExJTkZPICovCi0jaWZuZGVmIE1BTExJTkZPX0ZJRUxEX1RZUEUKLSNkZWZpbmUgTUFMTElORk9fRklFTERfVFlQRSBzaXplX3QKLSNlbmRpZiAgLyogTUFMTElORk9fRklFTERfVFlQRSAqLwotCi0jZGVmaW5lIG1lbXNldAlTRExfbWVtc2V0Ci0jZGVmaW5lIG1lbWNweQlTRExfbWVtY3B5Ci0jZGVmaW5lIG1hbGxvYwlTRExfbWFsbG9jCi0jZGVmaW5lIGNhbGxvYwlTRExfY2FsbG9jCi0jZGVmaW5lIHJlYWxsb2MJU0RMX3JlYWxsb2MKLSNkZWZpbmUgZnJlZQlTRExfZnJlZQotCi0vKgotICBtYWxsb3B0IHR1bmluZyBvcHRpb25zLiAgU1ZJRC9YUEcgZGVmaW5lcyBmb3VyIHN0YW5kYXJkIHBhcmFtZXRlcgotICBudW1iZXJzIGZvciBtYWxsb3B0LCBub3JtYWxseSBkZWZpbmVkIGluIG1hbGxvYy5oLiAgTm9uZSBvZiB0aGVzZQotICBhcmUgdXNlZCBpbiB0aGlzIG1hbGxvYywgc28gc2V0dGluZyB0aGVtIGhhcyBubyBlZmZlY3QuIEJ1dCB0aGlzCi0gIG1hbGxvYyBkb2VzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBvcHRpb25zLgotKi8KLQotI2RlZmluZSBNX1RSSU1fVEhSRVNIT0xEICAgICAoLTEpCi0jZGVmaW5lIE1fR1JBTlVMQVJJVFkgICAgICAgICgtMikKLSNkZWZpbmUgTV9NTUFQX1RIUkVTSE9MRCAgICAgKC0zKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFsbGluZm8gZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgIU5PX01BTExJTkZPCi0vKgotICBUaGlzIHZlcnNpb24gb2YgbWFsbG9jIHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBTVklEL1hQRyBtYWxsaW5mbwotICByb3V0aW5lIHRoYXQgcmV0dXJucyBhIHN0cnVjdCBjb250YWluaW5nIHVzYWdlIHByb3BlcnRpZXMgYW5kCi0gIHN0YXRpc3RpY3MuIEl0IHNob3VsZCB3b3JrIG9uIGFueSBzeXN0ZW0gdGhhdCBoYXMgYQotICAvdXNyL2luY2x1ZGUvbWFsbG9jLmggZGVmaW5pbmcgc3RydWN0IG1hbGxpbmZvLiAgVGhlIG1haW4KLSAgZGVjbGFyYXRpb24gbmVlZGVkIGlzIHRoZSBtYWxsaW5mbyBzdHJ1Y3QgdGhhdCBpcyByZXR1cm5lZCAoYnktY29weSkKLSAgYnkgbWFsbGluZm8oKS4gIFRoZSBtYWxsb2luZm8gc3RydWN0IGNvbnRhaW5zIGEgYnVuY2ggb2YgZmllbGRzIHRoYXQKLSAgYXJlIG5vdCBldmVuIG1lYW5pbmdmdWwgaW4gdGhpcyB2ZXJzaW9uIG9mIG1hbGxvYy4gIFRoZXNlIGZpZWxkcyBhcmUKLSAgYXJlIGluc3RlYWQgZmlsbGVkIGJ5IG1hbGxpbmZvKCkgd2l0aCBvdGhlciBudW1iZXJzIHRoYXQgbWlnaHQgYmUgb2YKLSAgaW50ZXJlc3QuCi0KLSAgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCBzaG91bGQgYmUgc2V0IGlmIHlvdSBoYXZlIGEKLSAgL3Vzci9pbmNsdWRlL21hbGxvYy5oIGZpbGUgdGhhdCBpbmNsdWRlcyBhIGRlY2xhcmF0aW9uIG9mIHN0cnVjdAotICBtYWxsaW5mby4gIElmIHNvLCBpdCBpcyBpbmNsdWRlZDsgZWxzZSBhIGNvbXBsaWFudCB2ZXJzaW9uIGlzCi0gIGRlY2xhcmVkIGJlbG93LiAgVGhlc2UgbXVzdCBiZSBwcmVjaXNlbHkgdGhlIHNhbWUgZm9yIG1hbGxpbmZvKCkgdG8KLSAgd29yay4gIFRoZSBvcmlnaW5hbCBTVklEIHZlcnNpb24gb2YgdGhpcyBzdHJ1Y3QsIGRlZmluZWQgb24gbW9zdAotICBzeXN0ZW1zIHdpdGggbWFsbGluZm8sIGRlY2xhcmVzIGFsbCBmaWVsZHMgYXMgaW50cy4gQnV0IHNvbWUgb3RoZXJzCi0gIGRlZmluZSBhcyB1bnNpZ25lZCBsb25nLiBJZiB5b3VyIHN5c3RlbSBkZWZpbmVzIHRoZSBmaWVsZHMgdXNpbmcgYQotICB0eXBlIG9mIGRpZmZlcmVudCB3aWR0aCB0aGFuIGxpc3RlZCBoZXJlLCB5b3UgTVVTVCAjaW5jbHVkZSB5b3VyCi0gIHN5c3RlbSB2ZXJzaW9uIGFuZCAjZGVmaW5lIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0guCi0qLwotCi0vKiAjZGVmaW5lIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKi8KLQotI2lmZGVmIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0gKLSNpbmNsdWRlICIvdXNyL2luY2x1ZGUvbWFsbG9jLmgiCi0jZWxzZSAvKiBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IICovCi0KLXN0cnVjdCBtYWxsaW5mbyB7Ci0gIE1BTExJTkZPX0ZJRUxEX1RZUEUgYXJlbmE7ICAgIC8qIG5vbi1tbWFwcGVkIHNwYWNlIGFsbG9jYXRlZCBmcm9tIHN5c3RlbSAqLwotICBNQUxMSU5GT19GSUVMRF9UWVBFIG9yZGJsa3M7ICAvKiBudW1iZXIgb2YgZnJlZSBjaHVua3MgKi8KLSAgTUFMTElORk9fRklFTERfVFlQRSBzbWJsa3M7ICAgLyogYWx3YXlzIDAgKi8KLSAgTUFMTElORk9fRklFTERfVFlQRSBoYmxrczsgICAgLyogYWx3YXlzIDAgKi8KLSAgTUFMTElORk9fRklFTERfVFlQRSBoYmxraGQ7ICAgLyogc3BhY2UgaW4gbW1hcHBlZCByZWdpb25zICovCi0gIE1BTExJTkZPX0ZJRUxEX1RZUEUgdXNtYmxrczsgIC8qIG1heGltdW0gdG90YWwgYWxsb2NhdGVkIHNwYWNlICovCi0gIE1BTExJTkZPX0ZJRUxEX1RZUEUgZnNtYmxrczsgIC8qIGFsd2F5cyAwICovCi0gIE1BTExJTkZPX0ZJRUxEX1RZUEUgdW9yZGJsa3M7IC8qIHRvdGFsIGFsbG9jYXRlZCBzcGFjZSAqLwotICBNQUxMSU5GT19GSUVMRF9UWVBFIGZvcmRibGtzOyAvKiB0b3RhbCBmcmVlIHNwYWNlICovCi0gIE1BTExJTkZPX0ZJRUxEX1RZUEUga2VlcGNvc3Q7IC8qIHJlbGVhc2FibGUgKHZpYSBtYWxsb2NfdHJpbSkgc3BhY2UgKi8KLX07Ci0KLSNlbmRpZiAvKiBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IICovCi0jZW5kaWYgLyogTk9fTUFMTElORk8gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaWYgIU9OTFlfTVNQQUNFUwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIERlY2xhcmF0aW9ucyBvZiBwdWJsaWMgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWZuZGVmIFVTRV9ETF9QUkVGSVgKLSNkZWZpbmUgZGxjYWxsb2MgICAgICAgICAgICAgICBjYWxsb2MKLSNkZWZpbmUgZGxmcmVlICAgICAgICAgICAgICAgICBmcmVlCi0jZGVmaW5lIGRsbWFsbG9jICAgICAgICAgICAgICAgbWFsbG9jCi0jZGVmaW5lIGRsbWVtYWxpZ24gICAgICAgICAgICAgbWVtYWxpZ24KLSNkZWZpbmUgZGxyZWFsbG9jICAgICAgICAgICAgICByZWFsbG9jCi0jZGVmaW5lIGRsdmFsbG9jICAgICAgICAgICAgICAgdmFsbG9jCi0jZGVmaW5lIGRscHZhbGxvYyAgICAgICAgICAgICAgcHZhbGxvYwotI2RlZmluZSBkbG1hbGxpbmZvICAgICAgICAgICAgIG1hbGxpbmZvCi0jZGVmaW5lIGRsbWFsbG9wdCAgICAgICAgICAgICAgbWFsbG9wdAotI2RlZmluZSBkbG1hbGxvY190cmltICAgICAgICAgIG1hbGxvY190cmltCi0jZGVmaW5lIGRsbWFsbG9jX3N0YXRzICAgICAgICAgbWFsbG9jX3N0YXRzCi0jZGVmaW5lIGRsbWFsbG9jX3VzYWJsZV9zaXplICAgbWFsbG9jX3VzYWJsZV9zaXplCi0jZGVmaW5lIGRsbWFsbG9jX2Zvb3RwcmludCAgICAgbWFsbG9jX2Zvb3RwcmludAotI2RlZmluZSBkbG1hbGxvY19tYXhfZm9vdHByaW50IG1hbGxvY19tYXhfZm9vdHByaW50Ci0jZGVmaW5lIGRsaW5kZXBlbmRlbnRfY2FsbG9jICAgaW5kZXBlbmRlbnRfY2FsbG9jCi0jZGVmaW5lIGRsaW5kZXBlbmRlbnRfY29tYWxsb2MgaW5kZXBlbmRlbnRfY29tYWxsb2MKLSNlbmRpZiAvKiBVU0VfRExfUFJFRklYICovCi0KLQotLyoKLSAgbWFsbG9jKHNpemVfdCBuKQotICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBjaHVuayBvZiBhdCBsZWFzdCBuIGJ5dGVzLCBvcgotICBudWxsIGlmIG5vIHNwYWNlIGlzIGF2YWlsYWJsZSwgaW4gd2hpY2ggY2FzZSBlcnJubyBpcyBzZXQgdG8gRU5PTUVNCi0gIG9uIEFOU0kgQyBzeXN0ZW1zLgotCi0gIElmIG4gaXMgemVybywgbWFsbG9jIHJldHVybnMgYSBtaW5pbXVtLXNpemVkIGNodW5rLiAoVGhlIG1pbmltdW0KLSAgc2l6ZSBpcyAxNiBieXRlcyBvbiBtb3N0IDMyYml0IHN5c3RlbXMsIGFuZCAzMiBieXRlcyBvbiA2NGJpdAotICBzeXN0ZW1zLikgIE5vdGUgdGhhdCBzaXplX3QgaXMgYW4gdW5zaWduZWQgdHlwZSwgc28gY2FsbHMgd2l0aAotICBhcmd1bWVudHMgdGhhdCB3b3VsZCBiZSBuZWdhdGl2ZSBpZiBzaWduZWQgYXJlIGludGVycHJldGVkIGFzCi0gIHJlcXVlc3RzIGZvciBodWdlIGFtb3VudHMgb2Ygc3BhY2UsIHdoaWNoIHdpbGwgb2Z0ZW4gZmFpbC4gVGhlCi0gIG1heGltdW0gc3VwcG9ydGVkIHZhbHVlIG9mIG4gZGlmZmVycyBhY3Jvc3Mgc3lzdGVtcywgYnV0IGlzIGluIGFsbAotICBjYXNlcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBhIHNpemVfdC4KLSovCi12b2lkKiBkbG1hbGxvYyhzaXplX3QpOwotCi0vKgotICBmcmVlKHZvaWQqIHApCi0gIFJlbGVhc2VzIHRoZSBjaHVuayBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBwLCB0aGF0IGhhZCBiZWVuIHByZXZpb3VzbHkKLSAgYWxsb2NhdGVkIHVzaW5nIG1hbGxvYyBvciBhIHJlbGF0ZWQgcm91dGluZSBzdWNoIGFzIHJlYWxsb2MuCi0gIEl0IGhhcyBubyBlZmZlY3QgaWYgcCBpcyBudWxsLiBJZiBwIHdhcyBub3QgbWFsbG9jZWQgb3IgYWxyZWFkeQotICBmcmVlZCwgZnJlZShwKSB3aWxsIGJ5IGRlZmF1bHQgY2F1c2UgdGhlIGN1cnJlbnQgcHJvZ3JhbSB0byBhYm9ydC4KLSovCi12b2lkICBkbGZyZWUodm9pZCopOwotCi0vKgotICBjYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUpOwotICBSZXR1cm5zIGEgcG9pbnRlciB0byBuX2VsZW1lbnRzICogZWxlbWVudF9zaXplIGJ5dGVzLCB3aXRoIGFsbCBsb2NhdGlvbnMKLSAgc2V0IHRvIHplcm8uCi0qLwotdm9pZCogZGxjYWxsb2Moc2l6ZV90LCBzaXplX3QpOwotCi0vKgotICByZWFsbG9jKHZvaWQqIHAsIHNpemVfdCBuKQotICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIGNodW5rIG9mIHNpemUgbiB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGRhdGEKLSAgYXMgZG9lcyBjaHVuayBwIHVwIHRvIHRoZSBtaW5pbXVtIG9mIChuLCBwJ3Mgc2l6ZSkgYnl0ZXMsIG9yIG51bGwKLSAgaWYgbm8gc3BhY2UgaXMgYXZhaWxhYmxlLgotCi0gIFRoZSByZXR1cm5lZCBwb2ludGVyIG1heSBvciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHAuIFRoZSBhbGdvcml0aG0KLSAgcHJlZmVycyBleHRlbmRpbmcgcCBpbiBtb3N0IGNhc2VzIHdoZW4gcG9zc2libGUsIG90aGVyd2lzZSBpdAotICBlbXBsb3lzIHRoZSBlcXVpdmFsZW50IG9mIGEgbWFsbG9jLWNvcHktZnJlZSBzZXF1ZW5jZS4KLQotICBJZiBwIGlzIG51bGwsIHJlYWxsb2MgaXMgZXF1aXZhbGVudCB0byBtYWxsb2MuCi0KLSAgSWYgc3BhY2UgaXMgbm90IGF2YWlsYWJsZSwgcmVhbGxvYyByZXR1cm5zIG51bGwsIGVycm5vIGlzIHNldCAoaWYgb24KLSAgQU5TSSkgYW5kIHAgaXMgTk9UIGZyZWVkLgotCi0gIGlmIG4gaXMgZm9yIGZld2VyIGJ5dGVzIHRoYW4gYWxyZWFkeSBoZWxkIGJ5IHAsIHRoZSBuZXdseSB1bnVzZWQKLSAgc3BhY2UgaXMgbG9wcGVkIG9mZiBhbmQgZnJlZWQgaWYgcG9zc2libGUuICByZWFsbG9jIHdpdGggYSBzaXplCi0gIGFyZ3VtZW50IG9mIHplcm8gKHJlKWFsbG9jYXRlcyBhIG1pbmltdW0tc2l6ZWQgY2h1bmsuCi0KLSAgVGhlIG9sZCB1bml4IHJlYWxsb2MgY29udmVudGlvbiBvZiBhbGxvd2luZyB0aGUgbGFzdC1mcmVlJ2QgY2h1bmsKLSAgdG8gYmUgdXNlZCBhcyBhbiBhcmd1bWVudCB0byByZWFsbG9jIGlzIG5vdCBzdXBwb3J0ZWQuCi0qLwotCi12b2lkKiBkbHJlYWxsb2Modm9pZCosIHNpemVfdCk7Ci0KLS8qCi0gIG1lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBuKTsKLSAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgY2h1bmsgb2YgbiBieXRlcywgYWxpZ25lZAotICBpbiBhY2NvcmQgd2l0aCB0aGUgYWxpZ25tZW50IGFyZ3VtZW50LgotCi0gIFRoZSBhbGlnbm1lbnQgYXJndW1lbnQgc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvLiBJZiB0aGUgYXJndW1lbnQgaXMKLSAgbm90IGEgcG93ZXIgb2YgdHdvLCB0aGUgbmVhcmVzdCBncmVhdGVyIHBvd2VyIGlzIHVzZWQuCi0gIDgtYnl0ZSBhbGlnbm1lbnQgaXMgZ3VhcmFudGVlZCBieSBub3JtYWwgbWFsbG9jIGNhbGxzLCBzbyBkb24ndAotICBib3RoZXIgY2FsbGluZyBtZW1hbGlnbiB3aXRoIGFuIGFyZ3VtZW50IG9mIDggb3IgbGVzcy4KLQotICBPdmVycmVsaWFuY2Ugb24gbWVtYWxpZ24gaXMgYSBzdXJlIHdheSB0byBmcmFnbWVudCBzcGFjZS4KLSovCi12b2lkKiBkbG1lbWFsaWduKHNpemVfdCwgc2l6ZV90KTsKLQotLyoKLSAgdmFsbG9jKHNpemVfdCBuKTsKLSAgRXF1aXZhbGVudCB0byBtZW1hbGlnbihwYWdlc2l6ZSwgbiksIHdoZXJlIHBhZ2VzaXplIGlzIHRoZSBwYWdlCi0gIHNpemUgb2YgdGhlIHN5c3RlbS4gSWYgdGhlIHBhZ2VzaXplIGlzIHVua25vd24sIDQwOTYgaXMgdXNlZC4KLSovCi12b2lkKiBkbHZhbGxvYyhzaXplX3QpOwotCi0vKgotICBtYWxsb3B0KGludCBwYXJhbWV0ZXJfbnVtYmVyLCBpbnQgcGFyYW1ldGVyX3ZhbHVlKQotICBTZXRzIHR1bmFibGUgcGFyYW1ldGVycyBUaGUgZm9ybWF0IGlzIHRvIHByb3ZpZGUgYQotICAocGFyYW1ldGVyLW51bWJlciwgcGFyYW1ldGVyLXZhbHVlKSBwYWlyLiAgbWFsbG9wdCB0aGVuIHNldHMgdGhlCi0gIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHRvIHRoZSBhcmd1bWVudCB2YWx1ZSBpZiBpdCBjYW4gKGkuZS4sIHNvCi0gIGxvbmcgYXMgdGhlIHZhbHVlIGlzIG1lYW5pbmdmdWwpLCBhbmQgcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwgZWxzZQotICAwLiAgU1ZJRC9YUEcvQU5TSSBkZWZpbmVzIGZvdXIgc3RhbmRhcmQgcGFyYW0gbnVtYmVycyBmb3IgbWFsbG9wdCwKLSAgbm9ybWFsbHkgZGVmaW5lZCBpbiBtYWxsb2MuaC4gIE5vbmUgb2YgdGhlc2UgYXJlIHVzZSBpbiB0aGlzIG1hbGxvYywKLSAgc28gc2V0dGluZyB0aGVtIGhhcyBubyBlZmZlY3QuIEJ1dCB0aGlzIG1hbGxvYyBhbHNvIHN1cHBvcnRzIG90aGVyCi0gIG9wdGlvbnMgaW4gbWFsbG9wdC4gU2VlIGJlbG93IGZvciBkZXRhaWxzLiAgQnJpZWZseSwgc3VwcG9ydGVkCi0gIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3MgKGxpc3RlZCBkZWZhdWx0cyBhcmUgZm9yICJ0eXBpY2FsIgotICBjb25maWd1cmF0aW9ucykuCi0KLSAgU3ltYm9sICAgICAgICAgICAgcGFyYW0gIyAgZGVmYXVsdCAgICBhbGxvd2VkIHBhcmFtIHZhbHVlcwotICBNX1RSSU1fVEhSRVNIT0xEICAgICAtMSAgIDIqMTAyNCoxMDI0ICAgYW55ICAgKE1BWF9TSVpFX1QgZGlzYWJsZXMpCi0gIE1fR1JBTlVMQVJJVFkgICAgICAgIC0yICAgICBwYWdlIHNpemUgICBhbnkgcG93ZXIgb2YgMiA+PSBwYWdlIHNpemUKLSAgTV9NTUFQX1RIUkVTSE9MRCAgICAgLTMgICAgICAyNTYqMTAyNCAgIGFueSAgIChvciAwIGlmIG5vIE1NQVAgc3VwcG9ydCkKLSovCi1pbnQgZGxtYWxsb3B0KGludCwgaW50KTsKLQotLyoKLSAgbWFsbG9jX2Zvb3RwcmludCgpOwotICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2J0YWluZWQgZnJvbSB0aGUgc3lzdGVtLiAgVGhlIHRvdGFsCi0gIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgYnkgbWFsbG9jLCByZWFsbG9jIGV0Yy4sIGlzIGxlc3MgdGhhbiB0aGlzCi0gIHZhbHVlLiBVbmxpa2UgbWFsbGluZm8sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBvbmx5IGEgcHJlY29tcHV0ZWQKLSAgcmVzdWx0LCBzbyBjYW4gYmUgY2FsbGVkIGZyZXF1ZW50bHkgdG8gbW9uaXRvciBtZW1vcnkgY29uc3VtcHRpb24uCi0gIEV2ZW4gaWYgbG9ja3MgYXJlIG90aGVyd2lzZSBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSB0aGVtLAotICBzbyByZXN1bHRzIG1pZ2h0IG5vdCBiZSB1cCB0byBkYXRlLgotKi8KLXNpemVfdCBkbG1hbGxvY19mb290cHJpbnQodm9pZCk7Ci0KLS8qCi0gIG1hbGxvY19tYXhfZm9vdHByaW50KCk7Ci0gIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9idGFpbmVkIGZyb20gdGhlIHN5c3RlbS4gVGhpcwotICB2YWx1ZSB3aWxsIGJlIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGZvb3RwcmludCBpZiBkZWFsbG9jYXRlZCBzcGFjZQotICBoYXMgYmVlbiByZWNsYWltZWQgYnkgdGhlIHN5c3RlbS4gVGhlIHBlYWsgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZAotICBieSBtYWxsb2MsIHJlYWxsb2MgZXRjLiwgaXMgbGVzcyB0aGFuIHRoaXMgdmFsdWUuIFVubGlrZSBtYWxsaW5mbywKLSAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG9ubHkgYSBwcmVjb21wdXRlZCByZXN1bHQsIHNvIGNhbiBiZSBjYWxsZWQKLSAgZnJlcXVlbnRseSB0byBtb25pdG9yIG1lbW9yeSBjb25zdW1wdGlvbi4gIEV2ZW4gaWYgbG9ja3MgYXJlCi0gIG90aGVyd2lzZSBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSB0aGVtLCBzbyByZXN1bHRzIG1pZ2h0Ci0gIG5vdCBiZSB1cCB0byBkYXRlLgotKi8KLXNpemVfdCBkbG1hbGxvY19tYXhfZm9vdHByaW50KHZvaWQpOwotCi0jaWYgIU5PX01BTExJTkZPCi0vKgotICBtYWxsaW5mbygpCi0gIFJldHVybnMgKGJ5IGNvcHkpIGEgc3RydWN0IGNvbnRhaW5pbmcgdmFyaW91cyBzdW1tYXJ5IHN0YXRpc3RpY3M6Ci0KLSAgYXJlbmE6ICAgICBjdXJyZW50IHRvdGFsIG5vbi1tbWFwcGVkIGJ5dGVzIGFsbG9jYXRlZCBmcm9tIHN5c3RlbQotICBvcmRibGtzOiAgIHRoZSBudW1iZXIgb2YgZnJlZSBjaHVua3MKLSAgc21ibGtzOiAgICBhbHdheXMgemVyby4KLSAgaGJsa3M6ICAgICBjdXJyZW50IG51bWJlciBvZiBtbWFwcGVkIHJlZ2lvbnMKLSAgaGJsa2hkOiAgICB0b3RhbCBieXRlcyBoZWxkIGluIG1tYXBwZWQgcmVnaW9ucwotICB1c21ibGtzOiAgIHRoZSBtYXhpbXVtIHRvdGFsIGFsbG9jYXRlZCBzcGFjZS4gVGhpcyB3aWxsIGJlIGdyZWF0ZXIKLSAgICAgICAgICAgICAgICB0aGFuIGN1cnJlbnQgdG90YWwgaWYgdHJpbW1pbmcgaGFzIG9jY3VycmVkLgotICBmc21ibGtzOiAgIGFsd2F5cyB6ZXJvCi0gIHVvcmRibGtzOiAgY3VycmVudCB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UgKG5vcm1hbCBvciBtbWFwcGVkKQotICBmb3JkYmxrczogIHRvdGFsIGZyZWUgc3BhY2UKLSAga2VlcGNvc3Q6ICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBpZGVhbGx5IGJlIHJlbGVhc2VkCi0gICAgICAgICAgICAgICBiYWNrIHRvIHN5c3RlbSB2aWEgbWFsbG9jX3RyaW0uICgiaWRlYWxseSIgbWVhbnMgdGhhdAotICAgICAgICAgICAgICAgaXQgaWdub3JlcyBwYWdlIHJlc3RyaWN0aW9ucyBldGMuKQotCi0gIEJlY2F1c2UgdGhlc2UgZmllbGRzIGFyZSBpbnRzLCBidXQgaW50ZXJuYWwgYm9va2tlZXBpbmcgbWF5Ci0gIGJlIGtlcHQgYXMgbG9uZ3MsIHRoZSByZXBvcnRlZCB2YWx1ZXMgbWF5IHdyYXAgYXJvdW5kIHplcm8gYW5kCi0gIHRodXMgYmUgaW5hY2N1cmF0ZS4KLSovCi1zdHJ1Y3QgbWFsbGluZm8gZGxtYWxsaW5mbyh2b2lkKTsKLSNlbmRpZiAvKiBOT19NQUxMSU5GTyAqLwotCi0vKgotICBpbmRlcGVuZGVudF9jYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUsIHZvaWQqIGNodW5rc1tdKTsKLQotICBpbmRlcGVuZGVudF9jYWxsb2MgaXMgc2ltaWxhciB0byBjYWxsb2MsIGJ1dCBpbnN0ZWFkIG9mIHJldHVybmluZyBhCi0gIHNpbmdsZSBjbGVhcmVkIHNwYWNlLCBpdCByZXR1cm5zIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIG5fZWxlbWVudHMKLSAgaW5kZXBlbmRlbnQgZWxlbWVudHMgdGhhdCBjYW4gaG9sZCBjb250ZW50cyBvZiBzaXplIGVsZW1fc2l6ZSwgZWFjaAotICBvZiB3aGljaCBzdGFydHMgb3V0IGNsZWFyZWQsIGFuZCBjYW4gYmUgaW5kZXBlbmRlbnRseSBmcmVlZCwKLSAgcmVhbGxvYydlZCBldGMuIFRoZSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBhZGphY2VudGx5Ci0gIGFsbG9jYXRlZCAodGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBvY2N1ciB3aXRoIG11bHRpcGxlIGNhbGxvY3Mgb3IKLSAgbWFsbG9jcyksIHdoaWNoIG1heSBhbHNvIGltcHJvdmUgY2FjaGUgbG9jYWxpdHkgaW4gc29tZQotICBhcHBsaWNhdGlvbnMuCi0KLSAgVGhlICJjaHVua3MiIGFyZ3VtZW50IGlzIG9wdGlvbmFsIChpLmUuLCBtYXkgYmUgbnVsbCwgd2hpY2ggaXMKLSAgcHJvYmFibHkgdGhlIG1vc3QgdHlwaWNhbCB1c2FnZSkuIElmIGl0IGlzIG51bGwsIHRoZSByZXR1cm5lZCBhcnJheQotICBpcyBpdHNlbGYgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBzaG91bGQgYWxzbyBiZSBmcmVlZCB3aGVuIGl0IGlzCi0gIG5vIGxvbmdlciBuZWVkZWQuIE90aGVyd2lzZSwgdGhlIGNodW5rcyBhcnJheSBtdXN0IGJlIG9mIGF0IGxlYXN0Ci0gIG5fZWxlbWVudHMgaW4gbGVuZ3RoLiBJdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgcG9pbnRlcnMgdG8gdGhlCi0gIGNodW5rcy4KLQotICBJbiBlaXRoZXIgY2FzZSwgaW5kZXBlbmRlbnRfY2FsbG9jIHJldHVybnMgdGhpcyBwb2ludGVyIGFycmF5LCBvcgotICBudWxsIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZC4gIElmIG5fZWxlbWVudHMgaXMgemVybyBhbmQgImNodW5rcyIKLSAgaXMgbnVsbCwgaXQgcmV0dXJucyBhIGNodW5rIHJlcHJlc2VudGluZyBhbiBhcnJheSB3aXRoIHplcm8gZWxlbWVudHMKLSAgKHdoaWNoIHNob3VsZCBiZSBmcmVlZCBpZiBub3Qgd2FudGVkKS4KLQotICBFYWNoIGVsZW1lbnQgbXVzdCBiZSBpbmRpdmlkdWFsbHkgZnJlZWQgd2hlbiBpdCBpcyBubyBsb25nZXIKLSAgbmVlZGVkLiBJZiB5b3UnZCBsaWtlIHRvIGluc3RlYWQgYmUgYWJsZSB0byBmcmVlIGFsbCBhdCBvbmNlLCB5b3UKLSAgc2hvdWxkIGluc3RlYWQgdXNlIHJlZ3VsYXIgY2FsbG9jIGFuZCBhc3NpZ24gcG9pbnRlcnMgaW50byB0aGlzCi0gIHNwYWNlIHRvIHJlcHJlc2VudCBlbGVtZW50cy4gIChJbiB0aGlzIGNhc2UgdGhvdWdoLCB5b3UgY2Fubm90Ci0gIGluZGVwZW5kZW50bHkgZnJlZSBlbGVtZW50cy4pCi0KLSAgaW5kZXBlbmRlbnRfY2FsbG9jIHNpbXBsaWZpZXMgYW5kIHNwZWVkcyB1cCBpbXBsZW1lbnRhdGlvbnMgb2YgbWFueQotICBraW5kcyBvZiBwb29scy4gIEl0IG1heSBhbHNvIGJlIHVzZWZ1bCB3aGVuIGNvbnN0cnVjdGluZyBsYXJnZSBkYXRhCi0gIHN0cnVjdHVyZXMgdGhhdCBpbml0aWFsbHkgaGF2ZSBhIGZpeGVkIG51bWJlciBvZiBmaXhlZC1zaXplZCBub2RlcywKLSAgYnV0IHRoZSBudW1iZXIgaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZSwgYW5kIHNvbWUgb2YgdGhlIG5vZGVzCi0gIG1heSBsYXRlciBuZWVkIHRvIGJlIGZyZWVkLiBGb3IgZXhhbXBsZToKLQotICBzdHJ1Y3QgTm9kZSB7IGludCBpdGVtOyBzdHJ1Y3QgTm9kZSogbmV4dDsgfTsKLQotICBzdHJ1Y3QgTm9kZSogYnVpbGRfbGlzdCgpIHsKLSAgICBzdHJ1Y3QgTm9kZSoqIHBvb2w7Ci0gICAgaW50IG4gPSByZWFkX251bWJlcl9vZl9ub2Rlc19uZWVkZWQoKTsKLSAgICBpZiAobiA8PSAwKSByZXR1cm4gMDsKLSAgICBwb29sID0gKHN0cnVjdCBOb2RlKiopKGluZGVwZW5kZW50X2NhbGxvYyhuLCBzaXplb2Yoc3RydWN0IE5vZGUpLCAwKTsKLSAgICBpZiAocG9vbCA9PSAwKSBkaWUoKTsKLSAgICAvLyBvcmdhbml6ZSBpbnRvIGEgbGlua2VkIGxpc3QuLi4KLSAgICBzdHJ1Y3QgTm9kZSogZmlyc3QgPSBwb29sWzBdOwotICAgIGZvciAoaSA9IDA7IGkgPCBuLTE7ICsraSkKLSAgICAgIHBvb2xbaV0tPm5leHQgPSBwb29sW2krMV07Ci0gICAgZnJlZShwb29sKTsgICAgIC8vIENhbiBub3cgZnJlZSB0aGUgYXJyYXkgKG9yIG5vdCwgaWYgaXQgaXMgbmVlZGVkIGxhdGVyKQotICAgIHJldHVybiBmaXJzdDsKLSAgfQotKi8KLXZvaWQqKiBkbGluZGVwZW5kZW50X2NhbGxvYyhzaXplX3QsIHNpemVfdCwgdm9pZCoqKTsKLQotLyoKLSAgaW5kZXBlbmRlbnRfY29tYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBzaXplc1tdLCB2b2lkKiBjaHVua3NbXSk7Ci0KLSAgaW5kZXBlbmRlbnRfY29tYWxsb2MgYWxsb2NhdGVzLCBhbGwgYXQgb25jZSwgYSBzZXQgb2Ygbl9lbGVtZW50cwotICBjaHVua3Mgd2l0aCBzaXplcyBpbmRpY2F0ZWQgaW4gdGhlICJzaXplcyIgYXJyYXkuICAgIEl0IHJldHVybnMKLSAgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlc2UgZWxlbWVudHMsIGVhY2ggb2Ygd2hpY2ggY2FuIGJlCi0gIGluZGVwZW5kZW50bHkgZnJlZWQsIHJlYWxsb2MnZWQgZXRjLiBUaGUgZWxlbWVudHMgYXJlIGd1YXJhbnRlZWQgdG8KLSAgYmUgYWRqYWNlbnRseSBhbGxvY2F0ZWQgKHRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aAotICBtdWx0aXBsZSBjYWxsb2NzIG9yIG1hbGxvY3MpLCB3aGljaCBtYXkgYWxzbyBpbXByb3ZlIGNhY2hlIGxvY2FsaXR5Ci0gIGluIHNvbWUgYXBwbGljYXRpb25zLgotCi0gIFRoZSAiY2h1bmtzIiBhcmd1bWVudCBpcyBvcHRpb25hbCAoaS5lLiwgbWF5IGJlIG51bGwpLiBJZiBpdCBpcyBudWxsCi0gIHRoZSByZXR1cm5lZCBhcnJheSBpcyBpdHNlbGYgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBzaG91bGQgYWxzbwotICBiZSBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuIE90aGVyd2lzZSwgdGhlIGNodW5rcyBhcnJheQotICBtdXN0IGJlIG9mIGF0IGxlYXN0IG5fZWxlbWVudHMgaW4gbGVuZ3RoLiBJdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUKLSAgcG9pbnRlcnMgdG8gdGhlIGNodW5rcy4KLQotICBJbiBlaXRoZXIgY2FzZSwgaW5kZXBlbmRlbnRfY29tYWxsb2MgcmV0dXJucyB0aGlzIHBvaW50ZXIgYXJyYXksIG9yCi0gIG51bGwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLiAgSWYgbl9lbGVtZW50cyBpcyB6ZXJvIGFuZCBjaHVua3MgaXMKLSAgbnVsbCwgaXQgcmV0dXJucyBhIGNodW5rIHJlcHJlc2VudGluZyBhbiBhcnJheSB3aXRoIHplcm8gZWxlbWVudHMKLSAgKHdoaWNoIHNob3VsZCBiZSBmcmVlZCBpZiBub3Qgd2FudGVkKS4KLQotICBFYWNoIGVsZW1lbnQgbXVzdCBiZSBpbmRpdmlkdWFsbHkgZnJlZWQgd2hlbiBpdCBpcyBubyBsb25nZXIKLSAgbmVlZGVkLiBJZiB5b3UnZCBsaWtlIHRvIGluc3RlYWQgYmUgYWJsZSB0byBmcmVlIGFsbCBhdCBvbmNlLCB5b3UKLSAgc2hvdWxkIGluc3RlYWQgdXNlIGEgc2luZ2xlIHJlZ3VsYXIgbWFsbG9jLCBhbmQgYXNzaWduIHBvaW50ZXJzIGF0Ci0gIHBhcnRpY3VsYXIgb2Zmc2V0cyBpbiB0aGUgYWdncmVnYXRlIHNwYWNlLiAoSW4gdGhpcyBjYXNlIHRob3VnaCwgeW91Ci0gIGNhbm5vdCBpbmRlcGVuZGVudGx5IGZyZWUgZWxlbWVudHMuKQotCi0gIGluZGVwZW5kZW50X2NvbWFsbGFjIGRpZmZlcnMgZnJvbSBpbmRlcGVuZGVudF9jYWxsb2MgaW4gdGhhdCBlYWNoCi0gIGVsZW1lbnQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgc2l6ZSwgYW5kIGFsc28gdGhhdCBpdCBkb2VzIG5vdAotICBhdXRvbWF0aWNhbGx5IGNsZWFyIGVsZW1lbnRzLgotCi0gIGluZGVwZW5kZW50X2NvbWFsbG9jIGNhbiBiZSB1c2VkIHRvIHNwZWVkIHVwIGFsbG9jYXRpb24gaW4gY2FzZXMKLSAgd2hlcmUgc2V2ZXJhbCBzdHJ1Y3RzIG9yIG9iamVjdHMgbXVzdCBhbHdheXMgYmUgYWxsb2NhdGVkIGF0IHRoZQotICBzYW1lIHRpbWUuICBGb3IgZXhhbXBsZToKLQotICBzdHJ1Y3QgSGVhZCB7IC4uLiB9Ci0gIHN0cnVjdCBGb290IHsgLi4uIH0KLQotICB2b2lkIHNlbmRfbWVzc2FnZShjaGFyKiBtc2cpIHsKLSAgICBpbnQgbXNnbGVuID0gc3RybGVuKG1zZyk7Ci0gICAgc2l6ZV90IHNpemVzWzNdID0geyBzaXplb2Yoc3RydWN0IEhlYWQpLCBtc2dsZW4sIHNpemVvZihzdHJ1Y3QgRm9vdCkgfTsKLSAgICB2b2lkKiBjaHVua3NbM107Ci0gICAgaWYgKGluZGVwZW5kZW50X2NvbWFsbG9jKDMsIHNpemVzLCBjaHVua3MpID09IDApCi0gICAgICBkaWUoKTsKLSAgICBzdHJ1Y3QgSGVhZCogaGVhZCA9IChzdHJ1Y3QgSGVhZCopKGNodW5rc1swXSk7Ci0gICAgY2hhciogICAgICAgIGJvZHkgPSAoY2hhciopKGNodW5rc1sxXSk7Ci0gICAgc3RydWN0IEZvb3QqIGZvb3QgPSAoc3RydWN0IEZvb3QqKShjaHVua3NbMl0pOwotICAgIC8vIC4uLgotICB9Ci0KLSAgSW4gZ2VuZXJhbCB0aG91Z2gsIGluZGVwZW5kZW50X2NvbWFsbG9jIGlzIHdvcnRoIHVzaW5nIG9ubHkgZm9yCi0gIGxhcmdlciB2YWx1ZXMgb2Ygbl9lbGVtZW50cy4gRm9yIHNtYWxsIHZhbHVlcywgeW91IHByb2JhYmx5IHdvbid0Ci0gIGRldGVjdCBlbm91Z2ggZGlmZmVyZW5jZSBmcm9tIHNlcmllcyBvZiBtYWxsb2MgY2FsbHMgdG8gYm90aGVyLgotCi0gIE92ZXJ1c2Ugb2YgaW5kZXBlbmRlbnRfY29tYWxsb2MgY2FuIGluY3JlYXNlIG92ZXJhbGwgbWVtb3J5IHVzYWdlLAotICBzaW5jZSBpdCBjYW5ub3QgcmV1c2UgZXhpc3Rpbmcgbm9uY29udGlndW91cyBzbWFsbCBjaHVua3MgdGhhdAotICBtaWdodCBiZSBhdmFpbGFibGUgZm9yIHNvbWUgb2YgdGhlIGVsZW1lbnRzLgotKi8KLXZvaWQqKiBkbGluZGVwZW5kZW50X2NvbWFsbG9jKHNpemVfdCwgc2l6ZV90Kiwgdm9pZCoqKTsKLQotCi0vKgotICBwdmFsbG9jKHNpemVfdCBuKTsKLSAgRXF1aXZhbGVudCB0byB2YWxsb2MobWluaW11bS1wYWdlLXRoYXQtaG9sZHMobikpLCB0aGF0IGlzLAotICByb3VuZCB1cCBuIHRvIG5lYXJlc3QgcGFnZXNpemUuCi0gKi8KLXZvaWQqICBkbHB2YWxsb2Moc2l6ZV90KTsKLQotLyoKLSAgbWFsbG9jX3RyaW0oc2l6ZV90IHBhZCk7Ci0KLSAgSWYgcG9zc2libGUsIGdpdmVzIG1lbW9yeSBiYWNrIHRvIHRoZSBzeXN0ZW0gKHZpYSBuZWdhdGl2ZSBhcmd1bWVudHMKLSAgdG8gc2JyaykgaWYgdGhlcmUgaXMgdW51c2VkIG1lbW9yeSBhdCB0aGUgYGhpZ2gnIGVuZCBvZiB0aGUgbWFsbG9jCi0gIHBvb2wgb3IgaW4gdW51c2VkIE1NQVAgc2VnbWVudHMuIFlvdSBjYW4gY2FsbCB0aGlzIGFmdGVyIGZyZWVpbmcKLSAgbGFyZ2UgYmxvY2tzIG9mIG1lbW9yeSB0byBwb3RlbnRpYWxseSByZWR1Y2UgdGhlIHN5c3RlbS1sZXZlbCBtZW1vcnkKLSAgcmVxdWlyZW1lbnRzIG9mIGEgcHJvZ3JhbS4gSG93ZXZlciwgaXQgY2Fubm90IGd1YXJhbnRlZSB0byByZWR1Y2UKLSAgbWVtb3J5LiBVbmRlciBzb21lIGFsbG9jYXRpb24gcGF0dGVybnMsIHNvbWUgbGFyZ2UgZnJlZSBibG9ja3Mgb2YKLSAgbWVtb3J5IHdpbGwgYmUgbG9ja2VkIGJldHdlZW4gdHdvIHVzZWQgY2h1bmtzLCBzbyB0aGV5IGNhbm5vdCBiZQotICBnaXZlbiBiYWNrIHRvIHRoZSBzeXN0ZW0uCi0KLSAgVGhlIGBwYWQnIGFyZ3VtZW50IHRvIG1hbGxvY190cmltIHJlcHJlc2VudHMgdGhlIGFtb3VudCBvZiBmcmVlCi0gIHRyYWlsaW5nIHNwYWNlIHRvIGxlYXZlIHVudHJpbW1lZC4gSWYgdGhpcyBhcmd1bWVudCBpcyB6ZXJvLCBvbmx5Ci0gIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBtZW1vcnkgdG8gbWFpbnRhaW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCi0gIHdpbGwgYmUgbGVmdC4gTm9uLXplcm8gYXJndW1lbnRzIGNhbiBiZSBzdXBwbGllZCB0byBtYWludGFpbiBlbm91Z2gKLSAgdHJhaWxpbmcgc3BhY2UgdG8gc2VydmljZSBmdXR1cmUgZXhwZWN0ZWQgYWxsb2NhdGlvbnMgd2l0aG91dCBoYXZpbmcKLSAgdG8gcmUtb2J0YWluIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0uCi0KLSAgTWFsbG9jX3RyaW0gcmV0dXJucyAxIGlmIGl0IGFjdHVhbGx5IHJlbGVhc2VkIGFueSBtZW1vcnksIGVsc2UgMC4KLSovCi1pbnQgIGRsbWFsbG9jX3RyaW0oc2l6ZV90KTsKLQotLyoKLSAgbWFsbG9jX3VzYWJsZV9zaXplKHZvaWQqIHApOwotCi0gIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB5b3UgY2FuIGFjdHVhbGx5IHVzZSBpbgotICBhbiBhbGxvY2F0ZWQgY2h1bmssIHdoaWNoIG1heSBiZSBtb3JlIHRoYW4geW91IHJlcXVlc3RlZCAoYWx0aG91Z2gKLSAgb2Z0ZW4gbm90KSBkdWUgdG8gYWxpZ25tZW50IGFuZCBtaW5pbXVtIHNpemUgY29uc3RyYWludHMuCi0gIFlvdSBjYW4gdXNlIHRoaXMgbWFueSBieXRlcyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0Ci0gIG92ZXJ3cml0aW5nIG90aGVyIGFsbG9jYXRlZCBvYmplY3RzLiBUaGlzIGlzIG5vdCBhIHBhcnRpY3VsYXJseSBncmVhdAotICBwcm9ncmFtbWluZyBwcmFjdGljZS4gbWFsbG9jX3VzYWJsZV9zaXplIGNhbiBiZSBtb3JlIHVzZWZ1bCBpbgotICBkZWJ1Z2dpbmcgYW5kIGFzc2VydGlvbnMsIGZvciBleGFtcGxlOgotCi0gIHAgPSBtYWxsb2Mobik7Ci0gIGFzc2VydChtYWxsb2NfdXNhYmxlX3NpemUocCkgPj0gMjU2KTsKLSovCi1zaXplX3QgZGxtYWxsb2NfdXNhYmxlX3NpemUodm9pZCopOwotCi0vKgotICBtYWxsb2Nfc3RhdHMoKTsKLSAgUHJpbnRzIG9uIHN0ZGVyciB0aGUgYW1vdW50IG9mIHNwYWNlIG9idGFpbmVkIGZyb20gdGhlIHN5c3RlbSAoYm90aAotICB2aWEgc2JyayBhbmQgbW1hcCksIHRoZSBtYXhpbXVtIGFtb3VudCAod2hpY2ggbWF5IGJlIG1vcmUgdGhhbgotICBjdXJyZW50IGlmIG1hbGxvY190cmltIGFuZC9vciBtdW5tYXAgZ290IGNhbGxlZCksIGFuZCB0aGUgY3VycmVudAotICBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIHZpYSBtYWxsb2MgKG9yIHJlYWxsb2MsIGV0YykgYnV0IG5vdCB5ZXQKLSAgZnJlZWQuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkLCBub3QgdGhlCi0gIG51bWJlciByZXF1ZXN0ZWQuIEl0IHdpbGwgYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciByZXF1ZXN0ZWQKLSAgYmVjYXVzZSBvZiBhbGlnbm1lbnQgYW5kIGJvb2trZWVwaW5nIG92ZXJoZWFkLiBCZWNhdXNlIGl0IGluY2x1ZGVzCi0gIGFsaWdubWVudCB3YXN0YWdlIGFzIGJlaW5nIGluIHVzZSwgdGhpcyBmaWd1cmUgbWF5IGJlIGdyZWF0ZXIgdGhhbgotICB6ZXJvIGV2ZW4gd2hlbiBubyB1c2VyLWxldmVsIGNodW5rcyBhcmUgYWxsb2NhdGVkLgotCi0gIFRoZSByZXBvcnRlZCBjdXJyZW50IGFuZCBtYXhpbXVtIHN5c3RlbSBtZW1vcnkgY2FuIGJlIGluYWNjdXJhdGUgaWYKLSAgYSBwcm9ncmFtIG1ha2VzIG90aGVyIGNhbGxzIHRvIHN5c3RlbSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMKLSAgKG5vcm1hbGx5IHNicmspIG91dHNpZGUgb2YgbWFsbG9jLgotCi0gIG1hbGxvY19zdGF0cyBwcmludHMgb25seSB0aGUgbW9zdCBjb21tb25seSBpbnRlcmVzdGluZyBzdGF0aXN0aWNzLgotICBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIG1hbGxpbmZvLgotKi8KLXZvaWQgIGRsbWFsbG9jX3N0YXRzKHZvaWQpOwotCi0jZW5kaWYgLyogT05MWV9NU1BBQ0VTICovCi0KLSNpZiBNU1BBQ0VTCi0KLS8qCi0gIG1zcGFjZSBpcyBhbiBvcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYW4gaW5kZXBlbmRlbnQKLSAgcmVnaW9uIG9mIHNwYWNlIHRoYXQgc3VwcG9ydHMgbXNwYWNlX21hbGxvYywgZXRjLgotKi8KLXR5cGVkZWYgdm9pZCogbXNwYWNlOwotCi0vKgotICBjcmVhdGVfbXNwYWNlIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgaW5kZXBlbmRlbnQgc3BhY2Ugd2l0aCB0aGUKLSAgZ2l2ZW4gaW5pdGlhbCBjYXBhY2l0eSwgb3IsIGlmIDAsIHRoZSBkZWZhdWx0IGdyYW51bGFyaXR5IHNpemUuICBJdAotICByZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3lzdGVtIG1lbW9yeSBhdmFpbGFibGUgdG8gY3JlYXRlIHRoZQotICBzcGFjZS4gIElmIGFyZ3VtZW50IGxvY2tlZCBpcyBub24temVybywgdGhlIHNwYWNlIHVzZXMgYSBzZXBhcmF0ZQotICBsb2NrIHRvIGNvbnRyb2wgYWNjZXNzLiBUaGUgY2FwYWNpdHkgb2YgdGhlIHNwYWNlIHdpbGwgZ3JvdwotICBkeW5hbWljYWxseSBhcyBuZWVkZWQgdG8gc2VydmljZSBtc3BhY2VfbWFsbG9jIHJlcXVlc3RzLiAgWW91IGNhbgotICBjb250cm9sIHRoZSBzaXplcyBvZiBpbmNyZW1lbnRhbCBpbmNyZWFzZXMgb2YgdGhpcyBzcGFjZSBieQotICBjb21waWxpbmcgd2l0aCBhIGRpZmZlcmVudCBERUZBVUxUX0dSQU5VTEFSSVRZIG9yIGR5bmFtaWNhbGx5Ci0gIHNldHRpbmcgd2l0aCBtYWxsb3B0KE1fR1JBTlVMQVJJVFksIHZhbHVlKS4KLSovCi1tc3BhY2UgY3JlYXRlX21zcGFjZShzaXplX3QgY2FwYWNpdHksIGludCBsb2NrZWQpOwotCi0vKgotICBkZXN0cm95X21zcGFjZSBkZXN0cm95cyB0aGUgZ2l2ZW4gc3BhY2UsIGFuZCBhdHRlbXB0cyB0byByZXR1cm4gYWxsCi0gIG9mIGl0cyBtZW1vcnkgYmFjayB0byB0aGUgc3lzdGVtLCByZXR1cm5pbmcgdGhlIHRvdGFsIG51bWJlciBvZgotICBieXRlcyBmcmVlZC4gQWZ0ZXIgZGVzdHJ1Y3Rpb24sIHRoZSByZXN1bHRzIG9mIGFjY2VzcyB0byBhbGwgbWVtb3J5Ci0gIHVzZWQgYnkgdGhlIHNwYWNlIGJlY29tZSB1bmRlZmluZWQuCi0qLwotc2l6ZV90IGRlc3Ryb3lfbXNwYWNlKG1zcGFjZSBtc3ApOwotCi0vKgotICBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZSB1c2VzIHRoZSBtZW1vcnkgc3VwcGxpZWQgYXMgdGhlIGluaXRpYWwgYmFzZQotICBvZiBhIG5ldyBtc3BhY2UuIFBhcnQgKGxlc3MgdGhhbiAxMjgqc2l6ZW9mKHNpemVfdCkgYnl0ZXMpIG9mIHRoaXMKLSAgc3BhY2UgaXMgdXNlZCBmb3IgYm9va2tlZXBpbmcsIHNvIHRoZSBjYXBhY2l0eSBtdXN0IGJlIGF0IGxlYXN0IHRoaXMKLSAgbGFyZ2UuIChPdGhlcndpc2UgMCBpcyByZXR1cm5lZC4pIFdoZW4gdGhpcyBpbml0aWFsIHNwYWNlIGlzCi0gIGV4aGF1c3RlZCwgYWRkaXRpb25hbCBtZW1vcnkgd2lsbCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBzeXN0ZW0uCi0gIERlc3Ryb3lpbmcgdGhpcyBzcGFjZSB3aWxsIGRlYWxsb2NhdGUgYWxsIGFkZGl0aW9uYWxseSBhbGxvY2F0ZWQKLSAgc3BhY2UgKGlmIHBvc3NpYmxlKSBidXQgbm90IHRoZSBpbml0aWFsIGJhc2UuCi0qLwotbXNwYWNlIGNyZWF0ZV9tc3BhY2Vfd2l0aF9iYXNlKHZvaWQqIGJhc2UsIHNpemVfdCBjYXBhY2l0eSwgaW50IGxvY2tlZCk7Ci0KLS8qCi0gIG1zcGFjZV9tYWxsb2MgYmVoYXZlcyBhcyBtYWxsb2MsIGJ1dCBvcGVyYXRlcyB3aXRoaW4KLSAgdGhlIGdpdmVuIHNwYWNlLgotKi8KLXZvaWQqIG1zcGFjZV9tYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IGJ5dGVzKTsKLQotLyoKLSAgbXNwYWNlX2ZyZWUgYmVoYXZlcyBhcyBmcmVlLCBidXQgb3BlcmF0ZXMgd2l0aGluCi0gIHRoZSBnaXZlbiBzcGFjZS4KLQotICBJZiBjb21waWxlZCB3aXRoIEZPT1RFUlM9PTEsIG1zcGFjZV9mcmVlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQuCi0gIGZyZWUgbWF5IGJlIGNhbGxlZCBpbnN0ZWFkIG9mIG1zcGFjZV9mcmVlIGJlY2F1c2UgZnJlZWQgY2h1bmtzIGZyb20KLSAgYW55IHNwYWNlIGFyZSBoYW5kbGVkIGJ5IHRoZWlyIG9yaWdpbmF0aW5nIHNwYWNlcy4KLSovCi12b2lkIG1zcGFjZV9mcmVlKG1zcGFjZSBtc3AsIHZvaWQqIG1lbSk7Ci0KLS8qCi0gIG1zcGFjZV9yZWFsbG9jIGJlaGF2ZXMgYXMgcmVhbGxvYywgYnV0IG9wZXJhdGVzIHdpdGhpbgotICB0aGUgZ2l2ZW4gc3BhY2UuCi0KLSAgSWYgY29tcGlsZWQgd2l0aCBGT09URVJTPT0xLCBtc3BhY2VfcmVhbGxvYyBpcyBub3QgYWN0dWFsbHkKLSAgbmVlZGVkLiAgcmVhbGxvYyBtYXkgYmUgY2FsbGVkIGluc3RlYWQgb2YgbXNwYWNlX3JlYWxsb2MgYmVjYXVzZQotICByZWFsbG9jZWQgY2h1bmtzIGZyb20gYW55IHNwYWNlIGFyZSBoYW5kbGVkIGJ5IHRoZWlyIG9yaWdpbmF0aW5nCi0gIHNwYWNlcy4KLSovCi12b2lkKiBtc3BhY2VfcmVhbGxvYyhtc3BhY2UgbXNwLCB2b2lkKiBtZW0sIHNpemVfdCBuZXdzaXplKTsKLQotLyoKLSAgbXNwYWNlX2NhbGxvYyBiZWhhdmVzIGFzIGNhbGxvYywgYnV0IG9wZXJhdGVzIHdpdGhpbgotICB0aGUgZ2l2ZW4gc3BhY2UuCi0qLwotdm9pZCogbXNwYWNlX2NhbGxvYyhtc3BhY2UgbXNwLCBzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1fc2l6ZSk7Ci0KLS8qCi0gIG1zcGFjZV9tZW1hbGlnbiBiZWhhdmVzIGFzIG1lbWFsaWduLCBidXQgb3BlcmF0ZXMgd2l0aGluCi0gIHRoZSBnaXZlbiBzcGFjZS4KLSovCi12b2lkKiBtc3BhY2VfbWVtYWxpZ24obXNwYWNlIG1zcCwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IGJ5dGVzKTsKLQotLyoKLSAgbXNwYWNlX2luZGVwZW5kZW50X2NhbGxvYyBiZWhhdmVzIGFzIGluZGVwZW5kZW50X2NhbGxvYywgYnV0Ci0gIG9wZXJhdGVzIHdpdGhpbiB0aGUgZ2l2ZW4gc3BhY2UuCi0qLwotdm9pZCoqIG1zcGFjZV9pbmRlcGVuZGVudF9jYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZWxlbV9zaXplLCB2b2lkKiBjaHVua3NbXSk7Ci0KLS8qCi0gIG1zcGFjZV9pbmRlcGVuZGVudF9jb21hbGxvYyBiZWhhdmVzIGFzIGluZGVwZW5kZW50X2NvbWFsbG9jLCBidXQKLSAgb3BlcmF0ZXMgd2l0aGluIHRoZSBnaXZlbiBzcGFjZS4KLSovCi12b2lkKiogbXNwYWNlX2luZGVwZW5kZW50X2NvbWFsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBuX2VsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZXNbXSwgdm9pZCogY2h1bmtzW10pOwotCi0vKgotICBtc3BhY2VfZm9vdHByaW50KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9idGFpbmVkIGZyb20gdGhlCi0gIHN5c3RlbSBmb3IgdGhpcyBzcGFjZS4KLSovCi1zaXplX3QgbXNwYWNlX2Zvb3RwcmludChtc3BhY2UgbXNwKTsKLQotLyoKLSAgbXNwYWNlX21heF9mb290cHJpbnQoKSByZXR1cm5zIHRoZSBwZWFrIG51bWJlciBvZiBieXRlcyBvYnRhaW5lZCBmcm9tIHRoZQotICBzeXN0ZW0gZm9yIHRoaXMgc3BhY2UuCi0qLwotc2l6ZV90IG1zcGFjZV9tYXhfZm9vdHByaW50KG1zcGFjZSBtc3ApOwotCi0KLSNpZiAhTk9fTUFMTElORk8KLS8qCi0gIG1zcGFjZV9tYWxsaW5mbyBiZWhhdmVzIGFzIG1hbGxpbmZvLCBidXQgcmVwb3J0cyBwcm9wZXJ0aWVzIG9mCi0gIHRoZSBnaXZlbiBzcGFjZS4KLSovCi1zdHJ1Y3QgbWFsbGluZm8gbXNwYWNlX21hbGxpbmZvKG1zcGFjZSBtc3ApOwotI2VuZGlmIC8qIE5PX01BTExJTkZPICovCi0KLS8qCi0gIG1zcGFjZV9tYWxsb2Nfc3RhdHMgYmVoYXZlcyBhcyBtYWxsb2Nfc3RhdHMsIGJ1dCByZXBvcnRzCi0gIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIHNwYWNlLgotKi8KLXZvaWQgbXNwYWNlX21hbGxvY19zdGF0cyhtc3BhY2UgbXNwKTsKLQotLyoKLSAgbXNwYWNlX3RyaW0gYmVoYXZlcyBhcyBtYWxsb2NfdHJpbSwgYnV0Ci0gIG9wZXJhdGVzIHdpdGhpbiB0aGUgZ2l2ZW4gc3BhY2UuCi0qLwotaW50IG1zcGFjZV90cmltKG1zcGFjZSBtc3AsIHNpemVfdCBwYWQpOwotCi0vKgotICBBbiBhbGlhcyBmb3IgbWFsbG9wdC4KLSovCi1pbnQgbXNwYWNlX21hbGxvcHQoaW50LCBpbnQpOwotCi0jZW5kaWYgLyogTVNQQUNFUyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX07ICAvKiBlbmQgb2YgZXh0ZXJuICJDIiAqLwotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICBUbyBtYWtlIGEgZnVsbHkgY3VzdG9taXphYmxlIG1hbGxvYy5oIGhlYWRlciBmaWxlLCBjdXQgZXZlcnl0aGluZwotICBhYm92ZSB0aGlzIGxpbmUsIHB1dCBpbnRvIGZpbGUgbWFsbG9jLmgsIGVkaXQgdG8gc3VpdCwgYW5kICNpbmNsdWRlIGl0Ci0gIG9uIHRoZSBuZXh0IGxpbmUsIGFzIHdlbGwgYXMgaW4gcHJvZ3JhbXMgdGhhdCB1c2UgdGhpcyBtYWxsb2MuCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotLyogI2luY2x1ZGUgIm1hbGxvYy5oIiAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpbnRlcm5hbCAjaW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWZkZWYgX01TQ19WRVIKLSNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxNDYgKSAvKiBubyAidW5zaWduZWQiIHdhcm5pbmdzICovCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLQotI2lmbmRlZiBMQUNLU19TVERJT19ICi0jaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgLyogZm9yIHByaW50aW5nIGluIG1hbGxvY19zdGF0cyAqLwotI2VuZGlmCi0KLSNpZm5kZWYgTEFDS1NfRVJSTk9fSAotI2luY2x1ZGUgPGVycm5vLmg+ICAgICAgIC8qIGZvciBNQUxMT0NfRkFJTFVSRV9BQ1RJT04gKi8KLSNlbmRpZiAvKiBMQUNLU19FUlJOT19IICovCi0jaWYgRk9PVEVSUwotI2luY2x1ZGUgPHRpbWUuaD4gICAgICAgIC8qIGZvciBtYWdpYyBpbml0aWFsaXphdGlvbiAqLwotI2VuZGlmIC8qIEZPT1RFUlMgKi8KLSNpZm5kZWYgTEFDS1NfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAvKiBmb3IgYWJvcnQoKSAqLwotI2VuZGlmIC8qIExBQ0tTX1NURExJQl9IICovCi0jaWZkZWYgREVCVUcKLSNpZiBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRQotI2RlZmluZSBhc3NlcnQoeCkgaWYoISh4KSkgQUJPUlQKLSNlbHNlIC8qIEFCT1JUX09OX0FTU0VSVF9GQUlMVVJFICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYgLyogQUJPUlRfT05fQVNTRVJUX0ZBSUxVUkUgKi8KLSNlbHNlICAvKiBERUJVRyAqLwotI2RlZmluZSBhc3NlcnQoeCkKLSNlbmRpZiAvKiBERUJVRyAqLwotI2lmbmRlZiBMQUNLU19TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgIC8qIGZvciBtZW1zZXQgZXRjICovCi0jZW5kaWYgIC8qIExBQ0tTX1NUUklOR19IICovCi0jaWYgVVNFX0JVSUxUSU5fRkZTCi0jaWZuZGVmIExBQ0tTX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4gICAgIC8qIGZvciBmZnMgKi8KLSNlbmRpZiAvKiBMQUNLU19TVFJJTkdTX0ggKi8KLSNlbmRpZiAvKiBVU0VfQlVJTFRJTl9GRlMgKi8KLSNpZiBIQVZFX01NQVAKLSNpZm5kZWYgTEFDS1NfU1lTX01NQU5fSAotI2luY2x1ZGUgPHN5cy9tbWFuLmg+ICAgIC8qIGZvciBtbWFwICovCi0jZW5kaWYgLyogTEFDS1NfU1lTX01NQU5fSCAqLwotI2lmbmRlZiBMQUNLU19GQ05UTF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZiAvKiBMQUNLU19GQ05UTF9IICovCi0jZW5kaWYgLyogSEFWRV9NTUFQICovCi0jaWYgSEFWRV9NT1JFQ09SRQotI2lmbmRlZiBMQUNLU19VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgLyogZm9yIHNicmsgKi8KLSNlbHNlIC8qIExBQ0tTX1VOSVNURF9IICovCi0jaWYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKQotZXh0ZXJuIHZvaWQqICAgICBzYnJrKHB0cmRpZmZfdCk7Ci0jZW5kaWYgLyogRnJlZUJTRCBldGMgKi8KLSNlbmRpZiAvKiBMQUNLU19VTklTVERfSCAqLwotI2VuZGlmIC8qIEhBVkVfTU1BUCAqLwotCi0jaWZuZGVmIFdJTjMyCi0jaWZuZGVmIG1hbGxvY19nZXRwYWdlc2l6ZQotIyAgaWZkZWYgX1NDX1BBR0VTSVpFICAgICAgICAgLyogc29tZSBTVlI0IHN5c3RlbXMgb21pdCBhbiB1bmRlcnNjb3JlICovCi0jICAgIGlmbmRlZiBfU0NfUEFHRV9TSVpFCi0jICAgICAgZGVmaW5lIF9TQ19QQUdFX1NJWkUgX1NDX1BBR0VTSVpFCi0jICAgIGVuZGlmCi0jICBlbmRpZgotIyAgaWZkZWYgX1NDX1BBR0VfU0laRQotIyAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIHN5c2NvbmYoX1NDX1BBR0VfU0laRSkKLSMgIGVsc2UKLSMgICAgaWYgZGVmaW5lZChCU0QpIHx8IGRlZmluZWQoREdVWCkgfHwgZGVmaW5lZChIQVZFX0dFVFBBR0VTSVpFKQotICAgICAgIGV4dGVybiBzaXplX3QgZ2V0cGFnZXNpemUoKTsKLSMgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIGdldHBhZ2VzaXplKCkKLSMgICAgZWxzZQotIyAgICAgIGlmZGVmIFdJTjMyIC8qIHVzZSBzdXBwbGllZCBlbXVsYXRpb24gb2YgZ2V0cGFnZXNpemUgKi8KLSMgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgZ2V0cGFnZXNpemUoKQotIyAgICAgIGVsc2UKLSMgICAgICAgIGlmbmRlZiBMQUNLU19TWVNfUEFSQU1fSAotIyAgICAgICAgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICAgICAgIGVuZGlmCi0jICAgICAgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgRVhFQ19QQUdFU0laRQotIyAgICAgICAgZWxzZQotIyAgICAgICAgICBpZmRlZiBOQlBHCi0jICAgICAgICAgICAgaWZuZGVmIENMU0laRQotIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBOQlBHCi0jICAgICAgICAgICAgZWxzZQotIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSAoTkJQRyAqIENMU0laRSkKLSMgICAgICAgICAgICBlbmRpZgotIyAgICAgICAgICBlbHNlCi0jICAgICAgICAgICAgaWZkZWYgTkJQQwotIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBOQlBDCi0jICAgICAgICAgICAgZWxzZQotIyAgICAgICAgICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBQQUdFU0laRQotIyAgICAgICAgICAgICAgZWxzZSAvKiBqdXN0IGd1ZXNzICovCi0jICAgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgKChzaXplX3QpNDA5NlUpCi0jICAgICAgICAgICAgICBlbmRpZgotIyAgICAgICAgICAgIGVuZGlmCi0jICAgICAgICAgIGVuZGlmCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBzaXplX3QgYW5kIGFsaWdubWVudCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFRoZSBieXRlIGFuZCBiaXQgc2l6ZSBvZiBhIHNpemVfdCAqLwotI2RlZmluZSBTSVpFX1RfU0laRSAgICAgICAgIChzaXplb2Yoc2l6ZV90KSkKLSNkZWZpbmUgU0laRV9UX0JJVFNJWkUgICAgICAoc2l6ZW9mKHNpemVfdCkgPDwgMykKLQotLyogU29tZSBjb25zdGFudHMgY29lcmNlZCB0byBzaXplX3QgKi8KLS8qIEFubm95aW5nIGJ1dCBuZWNlc3NhcnkgdG8gYXZvaWQgZXJyb3JzIG9uIHNvbWUgcGxhZnRvcm1zICovCi0jZGVmaW5lIFNJWkVfVF9aRVJPICAgICAgICAgKChzaXplX3QpMCkKLSNkZWZpbmUgU0laRV9UX09ORSAgICAgICAgICAoKHNpemVfdCkxKQotI2RlZmluZSBTSVpFX1RfVFdPICAgICAgICAgICgoc2l6ZV90KTIpCi0jZGVmaW5lIFRXT19TSVpFX1RfU0laRVMgICAgKFNJWkVfVF9TSVpFPDwxKQotI2RlZmluZSBGT1VSX1NJWkVfVF9TSVpFUyAgIChTSVpFX1RfU0laRTw8MikKLSNkZWZpbmUgU0lYX1NJWkVfVF9TSVpFUyAgICAoRk9VUl9TSVpFX1RfU0laRVMrVFdPX1NJWkVfVF9TSVpFUykKLSNkZWZpbmUgSEFMRl9NQVhfU0laRV9UICAgICAoTUFYX1NJWkVfVCAvIDJVKQotCi0vKiBUaGUgYml0IG1hc2sgdmFsdWUgY29ycmVzcG9uZGluZyB0byBNQUxMT0NfQUxJR05NRU5UICovCi0jZGVmaW5lIENIVU5LX0FMSUdOX01BU0sgICAgKE1BTExPQ19BTElHTk1FTlQgLSBTSVpFX1RfT05FKQotCi0vKiBUcnVlIGlmIGFkZHJlc3MgYSBoYXMgYWNjZXB0YWJsZSBhbGlnbm1lbnQgKi8KLSNkZWZpbmUgaXNfYWxpZ25lZChBKSAgICAgICAoKChzaXplX3QpKChBKSkgJiAoQ0hVTktfQUxJR05fTUFTSykpID09IDApCi0KLS8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gb2Zmc2V0IGFuIGFkZHJlc3MgdG8gYWxpZ24gaXQgKi8KLSNkZWZpbmUgYWxpZ25fb2Zmc2V0KEEpXAotICgoKChzaXplX3QpKEEpICYgQ0hVTktfQUxJR05fTUFTSykgPT0gMCk/IDAgOlwKLSAgKChNQUxMT0NfQUxJR05NRU5UIC0gKChzaXplX3QpKEEpICYgQ0hVTktfQUxJR05fTUFTSykpICYgQ0hVTktfQUxJR05fTUFTSykpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1NQVAgcHJlbGltaW5hcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qCi0gICBJZiBIQVZFX01PUkVDT1JFIG9yIEhBVkVfTU1BUCBhcmUgZmFsc2UsIHdlIGp1c3QgZGVmaW5lIGNhbGxzIGFuZAotICAgY2hlY2tzIHRvIGZhaWwgc28gY29tcGlsZXIgb3B0aW1pemVyIGNhbiBkZWxldGUgY29kZSByYXRoZXIgdGhhbgotICAgdXNpbmcgc28gbWFueSAiI2lmInMuCi0qLwotCi0KLS8qIE1PUkVDT1JFIGFuZCBNTUFQIG11c3QgcmV0dXJuIE1GQUlMIG9uIGZhaWx1cmUgKi8KLSNkZWZpbmUgTUZBSUwgICAgICAgICAgICAgICAgKCh2b2lkKikoTUFYX1NJWkVfVCkpCi0jZGVmaW5lIENNRkFJTCAgICAgICAgICAgICAgICgoY2hhciopKE1GQUlMKSkgLyogZGVmaW5lZCBmb3IgY29udmVuaWVuY2UgKi8KLQotI2lmICFIQVZFX01NQVAKLSNkZWZpbmUgSVNfTU1BUFBFRF9CSVQgICAgICAgKFNJWkVfVF9aRVJPKQotI2RlZmluZSBVU0VfTU1BUF9CSVQgICAgICAgICAoU0laRV9UX1pFUk8pCi0jZGVmaW5lIENBTExfTU1BUChzKSAgICAgICAgIE1GQUlMCi0jZGVmaW5lIENBTExfTVVOTUFQKGEsIHMpICAgICgtMSkKLSNkZWZpbmUgRElSRUNUX01NQVAocykgICAgICAgTUZBSUwKLQotI2Vsc2UgLyogSEFWRV9NTUFQICovCi0jZGVmaW5lIElTX01NQVBQRURfQklUICAgICAgIChTSVpFX1RfT05FKQotI2RlZmluZSBVU0VfTU1BUF9CSVQgICAgICAgICAoU0laRV9UX09ORSkKLQotI2lmbmRlZiBXSU4zMgotI2RlZmluZSBDQUxMX01VTk1BUChhLCBzKSAgICBtdW5tYXAoKGEpLCAocykpCi0jZGVmaW5lIE1NQVBfUFJPVCAgICAgICAgICAgIChQUk9UX1JFQUR8UFJPVF9XUklURSkKLSNpZiAhZGVmaW5lZChNQVBfQU5PTllNT1VTKSAmJiBkZWZpbmVkKE1BUF9BTk9OKQotI2RlZmluZSBNQVBfQU5PTllNT1VTICAgICAgICBNQVBfQU5PTgotI2VuZGlmIC8qIE1BUF9BTk9OICovCi0jaWZkZWYgTUFQX0FOT05ZTU9VUwotI2RlZmluZSBNTUFQX0ZMQUdTICAgICAgICAgICAoTUFQX1BSSVZBVEV8TUFQX0FOT05ZTU9VUykKLSNkZWZpbmUgQ0FMTF9NTUFQKHMpICAgICAgICAgbW1hcCgwLCAocyksIE1NQVBfUFJPVCwgTU1BUF9GTEFHUywgLTEsIDApCi0jZWxzZSAvKiBNQVBfQU5PTllNT1VTICovCi0vKgotICAgTmVhcmx5IGFsbCB2ZXJzaW9ucyBvZiBtbWFwIHN1cHBvcnQgTUFQX0FOT05ZTU9VUywgc28gdGhlIGZvbGxvd2luZwotICAgaXMgdW5saWtlbHkgdG8gYmUgbmVlZGVkLCBidXQgaXMgc3VwcGxpZWQganVzdCBpbiBjYXNlLgotKi8KLSNkZWZpbmUgTU1BUF9GTEFHUyAgICAgICAgICAgKE1BUF9QUklWQVRFKQotc3RhdGljIGludCBkZXZfemVyb19mZCA9IC0xOyAvKiBDYWNoZWQgZmlsZSBkZXNjcmlwdG9yIGZvciAvZGV2L3plcm8uICovCi0jZGVmaW5lIENBTExfTU1BUChzKSAoKGRldl96ZXJvX2ZkIDwgMCkgPyBcCi0gICAgICAgICAgIChkZXZfemVyb19mZCA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRXUiksIFwKLSAgICAgICAgICAgIG1tYXAoMCwgKHMpLCBNTUFQX1BST1QsIE1NQVBfRkxBR1MsIGRldl96ZXJvX2ZkLCAwKSkgOiBcCi0gICAgICAgICAgICBtbWFwKDAsIChzKSwgTU1BUF9QUk9ULCBNTUFQX0ZMQUdTLCBkZXZfemVyb19mZCwgMCkpCi0jZW5kaWYgLyogTUFQX0FOT05ZTU9VUyAqLwotCi0jZGVmaW5lIERJUkVDVF9NTUFQKHMpICAgICAgIENBTExfTU1BUChzKQotI2Vsc2UgLyogV0lOMzIgKi8KLQotLyogV2luMzIgTU1BUCB2aWEgVmlydHVhbEFsbG9jICovCi1zdGF0aWMgdm9pZCogd2luMzJtbWFwKHNpemVfdCBzaXplKSB7Ci0gIHZvaWQqIHB0ciA9IFZpcnR1YWxBbGxvYygwLCBzaXplLCBNRU1fUkVTRVJWRXxNRU1fQ09NTUlULCBQQUdFX1JFQURXUklURSk7Ci0gIHJldHVybiAocHRyICE9IDApPyBwdHI6IE1GQUlMOwotfQotCi0vKiBGb3IgZGlyZWN0IE1NQVAsIHVzZSBNRU1fVE9QX0RPV04gdG8gbWluaW1pemUgaW50ZXJmZXJlbmNlICovCi1zdGF0aWMgdm9pZCogd2luMzJkaXJlY3RfbW1hcChzaXplX3Qgc2l6ZSkgewotICB2b2lkKiBwdHIgPSBWaXJ0dWFsQWxsb2MoMCwgc2l6ZSwgTUVNX1JFU0VSVkV8TUVNX0NPTU1JVHxNRU1fVE9QX0RPV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1JFQURXUklURSk7Ci0gIHJldHVybiAocHRyICE9IDApPyBwdHI6IE1GQUlMOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHJlbGVhc2luZyBjb2FsZXNlZCBzZWdtZW50cyAqLwotc3RhdGljIGludCB3aW4zMm11bm1hcCh2b2lkKiBwdHIsIHNpemVfdCBzaXplKSB7Ci0gIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBtaW5mbzsKLSAgY2hhciogY3B0ciA9IHB0cjsKLSAgd2hpbGUgKHNpemUpIHsKLSAgICBpZiAoVmlydHVhbFF1ZXJ5KGNwdHIsICZtaW5mbywgc2l6ZW9mKG1pbmZvKSkgPT0gMCkKLSAgICAgIHJldHVybiAtMTsKLSAgICBpZiAobWluZm8uQmFzZUFkZHJlc3MgIT0gY3B0ciB8fCBtaW5mby5BbGxvY2F0aW9uQmFzZSAhPSBjcHRyIHx8Ci0gICAgICAgIG1pbmZvLlN0YXRlICE9IE1FTV9DT01NSVQgfHwgbWluZm8uUmVnaW9uU2l6ZSA+IHNpemUpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKFZpcnR1YWxGcmVlKGNwdHIsIDAsIE1FTV9SRUxFQVNFKSA9PSAwKQotICAgICAgcmV0dXJuIC0xOwotICAgIGNwdHIgKz0gbWluZm8uUmVnaW9uU2l6ZTsKLSAgICBzaXplIC09IG1pbmZvLlJlZ2lvblNpemU7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgQ0FMTF9NTUFQKHMpICAgICAgICAgd2luMzJtbWFwKHMpCi0jZGVmaW5lIENBTExfTVVOTUFQKGEsIHMpICAgIHdpbjMybXVubWFwKChhKSwgKHMpKQotI2RlZmluZSBESVJFQ1RfTU1BUChzKSAgICAgICB3aW4zMmRpcmVjdF9tbWFwKHMpCi0jZW5kaWYgLyogV0lOMzIgKi8KLSNlbmRpZiAvKiBIQVZFX01NQVAgKi8KLQotI2lmIEhBVkVfTU1BUCAmJiBIQVZFX01SRU1BUAotI2RlZmluZSBDQUxMX01SRU1BUChhZGRyLCBvc3osIG5zeiwgbXYpIG1yZW1hcCgoYWRkciksIChvc3opLCAobnN6KSwgKG12KSkKLSNlbHNlICAvKiBIQVZFX01NQVAgJiYgSEFWRV9NUkVNQVAgKi8KLSNkZWZpbmUgQ0FMTF9NUkVNQVAoYWRkciwgb3N6LCBuc3osIG12KSBNRkFJTAotI2VuZGlmIC8qIEhBVkVfTU1BUCAmJiBIQVZFX01SRU1BUCAqLwotCi0jaWYgSEFWRV9NT1JFQ09SRQotI2RlZmluZSBDQUxMX01PUkVDT1JFKFMpICAgICBNT1JFQ09SRShTKQotI2Vsc2UgIC8qIEhBVkVfTU9SRUNPUkUgKi8KLSNkZWZpbmUgQ0FMTF9NT1JFQ09SRShTKSAgICAgTUZBSUwKLSNlbmRpZiAvKiBIQVZFX01PUkVDT1JFICovCi0KLS8qIG1zdGF0ZSBiaXQgc2V0IGlmIGNvbnRpbmd1b3VzIG1vcmVjb3JlIGRpc2FibGVkIG9yIGZhaWxlZCAqLwotI2RlZmluZSBVU0VfTk9OQ09OVElHVU9VU19CSVQgKDRVKQotCi0vKiBzZWdtZW50IGJpdCBzZXQgaW4gY3JlYXRlX21zcGFjZV93aXRoX2Jhc2UgKi8KLSNkZWZpbmUgRVhURVJOX0JJVCAgICAgICAgICAgICg4VSkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTG9jayBwcmVsaW1pbmFyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgVVNFX0xPQ0tTCi0KLS8qCi0gIFdoZW4gbG9ja3MgYXJlIGRlZmluZWQsIHRoZXJlIGFyZSB1cCB0byB0d28gZ2xvYmFsIGxvY2tzOgotCi0gICogSWYgSEFWRV9NT1JFQ09SRSwgbW9yZWNvcmVfbXV0ZXggcHJvdGVjdHMgc2VxdWVuY2VzIG9mIGNhbGxzIHRvCi0gICAgTU9SRUNPUkUuICBJbiBtYW55IGNhc2VzIHN5c19hbGxvYyByZXF1aXJlcyB0d28gY2FsbHMsIHRoYXQgc2hvdWxkCi0gICAgbm90IGJlIGludGVybGVhdmVkIHdpdGggY2FsbHMgYnkgb3RoZXIgdGhyZWFkcy4gIFRoaXMgZG9lcyBub3QKLSAgICBwcm90ZWN0IGFnYWluc3QgZGlyZWN0IGNhbGxzIHRvIE1PUkVDT1JFIGJ5IG90aGVyIHRocmVhZHMgbm90Ci0gICAgdXNpbmcgdGhpcyBsb2NrLCBzbyB0aGVyZSBpcyBzdGlsbCBjb2RlIHRvIGNvcGUgdGhlIGJlc3Qgd2UgY2FuIG9uCi0gICAgaW50ZXJmZXJlbmNlLgotCi0gICogbWFnaWNfaW5pdF9tdXRleCBlbnN1cmVzIHRoYXQgbXBhcmFtcy5tYWdpYyBhbmQgb3RoZXIKLSAgICB1bmlxdWUgbXBhcmFtcyB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4KLSovCi0KLSNpZm5kZWYgV0lOMzIKLS8qIEJ5IGRlZmF1bHQgdXNlIHBvc2l4IGxvY2tzICovCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2RlZmluZSBNTE9DS19UIHB0aHJlYWRfbXV0ZXhfdAotI2RlZmluZSBJTklUSUFMX0xPQ0sobCkgICAgICBwdGhyZWFkX211dGV4X2luaXQobCwgTlVMTCkKLSNkZWZpbmUgQUNRVUlSRV9MT0NLKGwpICAgICAgcHRocmVhZF9tdXRleF9sb2NrKGwpCi0jZGVmaW5lIFJFTEVBU0VfTE9DSyhsKSAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKGwpCi0KLSNpZiBIQVZFX01PUkVDT1JFCi1zdGF0aWMgTUxPQ0tfVCBtb3JlY29yZV9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci0jZW5kaWYgLyogSEFWRV9NT1JFQ09SRSAqLwotCi1zdGF0aWMgTUxPQ0tfVCBtYWdpY19pbml0X211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLQotI2Vsc2UgLyogV0lOMzIgKi8KLS8qCi0gICBCZWNhdXNlIGxvY2stcHJvdGVjdGVkIHJlZ2lvbnMgaGF2ZSBib3VuZGVkIHRpbWVzLCBhbmQgdGhlcmUKLSAgIGFyZSBubyByZWN1cnNpdmUgbG9jayBjYWxscywgd2UgY2FuIHVzZSBzaW1wbGUgc3BpbmxvY2tzLgotKi8KLQotI2RlZmluZSBNTE9DS19UIGxvbmcKLXN0YXRpYyBpbnQgd2luMzJfYWNxdWlyZV9sb2NrIChNTE9DS19UICpzbCkgewotICBmb3IgKDs7KSB7Ci0jaWZkZWYgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyCi0gICAgaWYgKCFJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZShzbCwgMSwgMCkpCi0gICAgICByZXR1cm4gMDsKLSNlbHNlICAvKiBVc2Ugb2xkZXIgdm9pZCogdmVyc2lvbiAqLwotICAgIGlmICghSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKHZvaWQqKilzbCwgKHZvaWQqKTEsICh2b2lkKikwKSkKLSAgICAgIHJldHVybiAwOwotI2VuZGlmIC8qIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlciAqLwotICAgIFNsZWVwICgwKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCB3aW4zMl9yZWxlYXNlX2xvY2sgKE1MT0NLX1QgKnNsKSB7Ci0gIEludGVybG9ja2VkRXhjaGFuZ2UgKHNsLCAwKTsKLX0KLQotI2RlZmluZSBJTklUSUFMX0xPQ0sobCkgICAgICAqKGwpPTAKLSNkZWZpbmUgQUNRVUlSRV9MT0NLKGwpICAgICAgd2luMzJfYWNxdWlyZV9sb2NrKGwpCi0jZGVmaW5lIFJFTEVBU0VfTE9DSyhsKSAgICAgIHdpbjMyX3JlbGVhc2VfbG9jayhsKQotI2lmIEhBVkVfTU9SRUNPUkUKLXN0YXRpYyBNTE9DS19UIG1vcmVjb3JlX211dGV4OwotI2VuZGlmIC8qIEhBVkVfTU9SRUNPUkUgKi8KLXN0YXRpYyBNTE9DS19UIG1hZ2ljX2luaXRfbXV0ZXg7Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQotI2RlZmluZSBVU0VfTE9DS19CSVQgICAgICAgICAgICAgICAoMlUpCi0jZWxzZSAgLyogVVNFX0xPQ0tTICovCi0jZGVmaW5lIFVTRV9MT0NLX0JJVCAgICAgICAgICAgICAgICgwVSkKLSNkZWZpbmUgSU5JVElBTF9MT0NLKGwpCi0jZW5kaWYgLyogVVNFX0xPQ0tTICovCi0KLSNpZiBVU0VfTE9DS1MgJiYgSEFWRV9NT1JFQ09SRQotI2RlZmluZSBBQ1FVSVJFX01PUkVDT1JFX0xPQ0soKSAgICBBQ1FVSVJFX0xPQ0soJm1vcmVjb3JlX211dGV4KTsKLSNkZWZpbmUgUkVMRUFTRV9NT1JFQ09SRV9MT0NLKCkgICAgUkVMRUFTRV9MT0NLKCZtb3JlY29yZV9tdXRleCk7Ci0jZWxzZSAvKiBVU0VfTE9DS1MgJiYgSEFWRV9NT1JFQ09SRSAqLwotI2RlZmluZSBBQ1FVSVJFX01PUkVDT1JFX0xPQ0soKQotI2RlZmluZSBSRUxFQVNFX01PUkVDT1JFX0xPQ0soKQotI2VuZGlmIC8qIFVTRV9MT0NLUyAmJiBIQVZFX01PUkVDT1JFICovCi0KLSNpZiBVU0VfTE9DS1MKLSNkZWZpbmUgQUNRVUlSRV9NQUdJQ19JTklUX0xPQ0soKSAgQUNRVUlSRV9MT0NLKCZtYWdpY19pbml0X211dGV4KTsKLSNkZWZpbmUgUkVMRUFTRV9NQUdJQ19JTklUX0xPQ0soKSAgUkVMRUFTRV9MT0NLKCZtYWdpY19pbml0X211dGV4KTsKLSNlbHNlICAvKiBVU0VfTE9DS1MgKi8KLSNkZWZpbmUgQUNRVUlSRV9NQUdJQ19JTklUX0xPQ0soKQotI2RlZmluZSBSRUxFQVNFX01BR0lDX0lOSVRfTE9DSygpCi0jZW5kaWYgLyogVVNFX0xPQ0tTICovCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIENodW5rIHJlcHJlc2VudGF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAgKFRoZSBmb2xsb3dpbmcgaW5jbHVkZXMgbGlnaHRseSBlZGl0ZWQgZXhwbGFuYXRpb25zIGJ5IENvbGluIFBsdW1iLikKLQotICBUaGUgbWFsbG9jX2NodW5rIGRlY2xhcmF0aW9uIGJlbG93IGlzIG1pc2xlYWRpbmcgKGJ1dCBhY2N1cmF0ZSBhbmQKLSAgbmVjZXNzYXJ5KS4gIEl0IGRlY2xhcmVzIGEgInZpZXciIGludG8gbWVtb3J5IGFsbG93aW5nIGFjY2VzcyB0bwotICBuZWNlc3NhcnkgZmllbGRzIGF0IGtub3duIG9mZnNldHMgZnJvbSBhIGdpdmVuIGJhc2UuCi0KLSAgQ2h1bmtzIG9mIG1lbW9yeSBhcmUgbWFpbnRhaW5lZCB1c2luZyBhIGBib3VuZGFyeSB0YWcnIG1ldGhvZCBhcwotICBvcmlnaW5hbGx5IGRlc2NyaWJlZCBieSBLbnV0aC4gIChTZWUgdGhlIHBhcGVyIGJ5IFBhdWwgV2lsc29uCi0gIGZ0cDovL2Z0cC5jcy51dGV4YXMuZWR1L3B1Yi9nYXJiYWdlL2FsbG9jc3J2LnBzIGZvciBhIHN1cnZleSBvZiBzdWNoCi0gIHRlY2huaXF1ZXMuKSAgU2l6ZXMgb2YgZnJlZSBjaHVua3MgYXJlIHN0b3JlZCBib3RoIGluIHRoZSBmcm9udCBvZgotICBlYWNoIGNodW5rIGFuZCBhdCB0aGUgZW5kLiAgVGhpcyBtYWtlcyBjb25zb2xpZGF0aW5nIGZyYWdtZW50ZWQKLSAgY2h1bmtzIGludG8gYmlnZ2VyIGNodW5rcyBmYXN0LiAgVGhlIGhlYWQgZmllbGRzIGFsc28gaG9sZCBiaXRzCi0gIHJlcHJlc2VudGluZyB3aGV0aGVyIGNodW5rcyBhcmUgZnJlZSBvciBpbiB1c2UuCi0KLSAgSGVyZSBhcmUgc29tZSBwaWN0dXJlcyB0byBtYWtlIGl0IGNsZWFyZXIuICBUaGV5IGFyZSAiZXhwbG9kZWQiIHRvCi0gIHNob3cgdGhhdCB0aGUgc3RhdGUgb2YgYSBjaHVuayBjYW4gYmUgdGhvdWdodCBvZiBhcyBleHRlbmRpbmcgZnJvbQotICB0aGUgaGlnaCAzMSBiaXRzIG9mIHRoZSBoZWFkIGZpZWxkIG9mIGl0cyBoZWFkZXIgdGhyb3VnaCB0aGUKLSAgcHJldl9mb290IGFuZCBQSU5VU0VfQklUIGJpdCBvZiB0aGUgZm9sbG93aW5nIGNodW5rIGhlYWRlci4KLQotICBBIGNodW5rIHRoYXQncyBpbiB1c2UgbG9va3MgbGlrZToKLQotICAgY2h1bmstPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgICB8IFNpemUgb2YgcHJldmlvdXMgY2h1bmsgKGlmIFAgPSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rIHxQfAotICAgICAgICAgfCBTaXplIG9mIHRoaXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDF8ICstKwotICAgbWVtLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKwotICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICstICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0rCi0gICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgKy0gICAgICBzaXplIC0gc2l6ZW9mKHNpemVfdCkgYXZhaWxhYmxlIHBheWxvYWQgYnl0ZXMgICAgICAgICAgLSsKLSAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gY2h1bmstPiArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKwotICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rIHwxfAotICAgICAgIHwgU2l6ZSBvZiBuZXh0IGNodW5rIChtYXkgb3IgbWF5IG5vdCBiZSBpbiB1c2UpICAgICAgICAgICAgICAgfCArLSsKLSBtZW0tPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCi0gICAgQW5kIGlmIGl0J3MgZnJlZSwgaXQgbG9va3MgbGlrZSB0aGlzOgotCi0gICBjaHVuay0+ICstICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0rCi0gICAgICAgICAgIHwgVXNlciBwYXlsb2FkIChtdXN0IGJlIGluIHVzZSwgb3Igd2Ugd291bGQgaGF2ZSBtZXJnZWQhKSAgICAgICB8Ci0gICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgfFB8Ci0gICAgICAgICB8IFNpemUgb2YgdGhpcyBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHwgKy0rCi0gICBtZW0tPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgfCBOZXh0IHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICB8IFByZXYgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICArLSAgICAgIHNpemUgLSBzaXplb2Yoc3RydWN0IGNodW5rKSB1bnVzZWQgYnl0ZXMgICAgICAgICAgICAgICAtKwotICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSBjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICB8IFNpemUgb2YgdGhpcyBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgfDB8Ci0gICAgICAgfCBTaXplIG9mIG5leHQgY2h1bmsgKG11c3QgYmUgaW4gdXNlLCBvciB3ZSB3b3VsZCBoYXZlIG1lcmdlZCl8ICstKwotIG1lbS0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICArLSBVc2VyIHBheWxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKwotICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwwfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0rCi0gIE5vdGUgdGhhdCBzaW5jZSB3ZSBhbHdheXMgbWVyZ2UgYWRqYWNlbnQgZnJlZSBjaHVua3MsIHRoZSBjaHVua3MKLSAgYWRqYWNlbnQgdG8gYSBmcmVlIGNodW5rIG11c3QgYmUgaW4gdXNlLgotCi0gIEdpdmVuIGEgcG9pbnRlciB0byBhIGNodW5rICh3aGljaCBjYW4gYmUgZGVyaXZlZCB0cml2aWFsbHkgZnJvbSB0aGUKLSAgcGF5bG9hZCBwb2ludGVyKSB3ZSBjYW4sIGluIE8oMSkgdGltZSwgZmluZCBvdXQgd2hldGhlciB0aGUgYWRqYWNlbnQKLSAgY2h1bmtzIGFyZSBmcmVlLCBhbmQgaWYgc28sIHVubGluayB0aGVtIGZyb20gdGhlIGxpc3RzIHRoYXQgdGhleQotICBhcmUgb24gYW5kIG1lcmdlIHRoZW0gd2l0aCB0aGUgY3VycmVudCBjaHVuay4KLQotICBDaHVua3MgYWx3YXlzIGJlZ2luIG9uIGV2ZW4gd29yZCBib3VuZGFyaWVzLCBzbyB0aGUgbWVtIHBvcnRpb24KLSAgKHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSB1c2VyKSBpcyBhbHNvIG9uIGFuIGV2ZW4gd29yZCBib3VuZGFyeSwgYW5kCi0gIHRodXMgYXQgbGVhc3QgZG91YmxlLXdvcmQgYWxpZ25lZC4KLQotICBUaGUgUCAoUElOVVNFX0JJVCkgYml0LCBzdG9yZWQgaW4gdGhlIHVudXNlZCBsb3ctb3JkZXIgYml0IG9mIHRoZQotICBjaHVuayBzaXplICh3aGljaCBpcyBhbHdheXMgYSBtdWx0aXBsZSBvZiB0d28gd29yZHMpLCBpcyBhbiBpbi11c2UKLSAgYml0IGZvciB0aGUgKnByZXZpb3VzKiBjaHVuay4gIElmIHRoYXQgYml0IGlzICpjbGVhciosIHRoZW4gdGhlCi0gIHdvcmQgYmVmb3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUgY29udGFpbnMgdGhlIHByZXZpb3VzIGNodW5rCi0gIHNpemUsIGFuZCBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSBmcm9udCBvZiB0aGUgcHJldmlvdXMgY2h1bmsuCi0gIFRoZSB2ZXJ5IGZpcnN0IGNodW5rIGFsbG9jYXRlZCBhbHdheXMgaGFzIHRoaXMgYml0IHNldCwgcHJldmVudGluZwotICBhY2Nlc3MgdG8gbm9uLWV4aXN0ZW50IChvciBub24tb3duZWQpIG1lbW9yeS4gSWYgcGludXNlIGlzIHNldCBmb3IKLSAgYW55IGdpdmVuIGNodW5rLCB0aGVuIHlvdSBDQU5OT1QgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZQotICBwcmV2aW91cyBjaHVuaywgYW5kIG1pZ2h0IGV2ZW4gZ2V0IGEgbWVtb3J5IGFkZHJlc3NpbmcgZmF1bHQgd2hlbgotICB0cnlpbmcgdG8gZG8gc28uCi0KLSAgVGhlIEMgKENJTlVTRV9CSVQpIGJpdCwgc3RvcmVkIGluIHRoZSB1bnVzZWQgc2Vjb25kLWxvd2VzdCBiaXQgb2YKLSAgdGhlIGNodW5rIHNpemUgcmVkdW5kYW50bHkgcmVjb3JkcyB3aGV0aGVyIHRoZSBjdXJyZW50IGNodW5rIGlzCi0gIGludXNlLiBUaGlzIHJlZHVuZGFuY3kgZW5hYmxlcyB1c2FnZSBjaGVja3Mgd2l0aGluIGZyZWUgYW5kIHJlYWxsb2MsCi0gIGFuZCByZWR1Y2VzIGluZGlyZWN0aW9uIHdoZW4gZnJlZWluZyBhbmQgY29uc29saWRhdGluZyBjaHVua3MuCi0KLSAgRWFjaCBmcmVzaGx5IGFsbG9jYXRlZCBjaHVuayBtdXN0IGhhdmUgYm90aCBjaW51c2UgYW5kIHBpbnVzZSBzZXQuCi0gIFRoYXQgaXMsIGVhY2ggYWxsb2NhdGVkIGNodW5rIGJvcmRlcnMgZWl0aGVyIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQKLSAgYW5kIHN0aWxsIGluLXVzZSBjaHVuaywgb3IgdGhlIGJhc2Ugb2YgaXRzIG1lbW9yeSBhcmVuYS4gVGhpcyBpcwotICBlbnN1cmVkIGJ5IG1ha2luZyBhbGwgYWxsb2NhdGlvbnMgZnJvbSB0aGUgdGhlIGBsb3dlc3QnIHBhcnQgb2YgYW55Ci0gIGZvdW5kIGNodW5rLiAgRnVydGhlciwgbm8gZnJlZSBjaHVuayBwaHlzaWNhbGx5IGJvcmRlcnMgYW5vdGhlciBvbmUsCi0gIHNvIGVhY2ggZnJlZSBjaHVuayBpcyBrbm93biB0byBiZSBwcmVjZWRlZCBhbmQgZm9sbG93ZWQgYnkgZWl0aGVyCi0gIGludXNlIGNodW5rcyBvciB0aGUgZW5kcyBvZiBtZW1vcnkuCi0KLSAgTm90ZSB0aGF0IHRoZSBgZm9vdCcgb2YgdGhlIGN1cnJlbnQgY2h1bmsgaXMgYWN0dWFsbHkgcmVwcmVzZW50ZWQKLSAgYXMgdGhlIHByZXZfZm9vdCBvZiB0aGUgTkVYVCBjaHVuay4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8KLSAgZGVhbCB3aXRoIGFsaWdubWVudHMgZXRjIGJ1dCBjYW4gYmUgdmVyeSBjb25mdXNpbmcgd2hlbiB0cnlpbmcKLSAgdG8gZXh0ZW5kIG9yIGFkYXB0IHRoaXMgY29kZS4KLQotICBUaGUgZXhjZXB0aW9ucyB0byBhbGwgdGhpcyBhcmUKLQotICAgICAxLiBUaGUgc3BlY2lhbCBjaHVuayBgdG9wJyBpcyB0aGUgdG9wLW1vc3QgYXZhaWxhYmxlIGNodW5rIChpLmUuLAotICAgICAgICB0aGUgb25lIGJvcmRlcmluZyB0aGUgZW5kIG9mIGF2YWlsYWJsZSBtZW1vcnkpLiBJdCBpcyB0cmVhdGVkCi0gICAgICAgIHNwZWNpYWxseS4gIFRvcCBpcyBuZXZlciBpbmNsdWRlZCBpbiBhbnkgYmluLCBpcyB1c2VkIG9ubHkgaWYKLSAgICAgICAgbm8gb3RoZXIgY2h1bmsgaXMgYXZhaWxhYmxlLCBhbmQgaXMgcmVsZWFzZWQgYmFjayB0byB0aGUKLSAgICAgICAgc3lzdGVtIGlmIGl0IGlzIHZlcnkgbGFyZ2UgKHNlZSBNX1RSSU1fVEhSRVNIT0xEKS4gIEluIGVmZmVjdCwKLSAgICAgICAgdGhlIHRvcCBjaHVuayBpcyB0cmVhdGVkIGFzIGxhcmdlciAoYW5kIHRodXMgbGVzcyB3ZWxsCi0gICAgICAgIGZpdHRpbmcpIHRoYW4gYW55IG90aGVyIGF2YWlsYWJsZSBjaHVuay4gIFRoZSB0b3AgY2h1bmsKLSAgICAgICAgZG9lc24ndCB1cGRhdGUgaXRzIHRyYWlsaW5nIHNpemUgZmllbGQgc2luY2UgdGhlcmUgaXMgbm8gbmV4dAotICAgICAgICBjb250aWd1b3VzIGNodW5rIHRoYXQgd291bGQgaGF2ZSB0byBpbmRleCBvZmYgaXQuIEhvd2V2ZXIsCi0gICAgICAgIHNwYWNlIGlzIHN0aWxsIGFsbG9jYXRlZCBmb3IgaXQgKFRPUF9GT09UX1NJWkUpIHRvIGVuYWJsZQotICAgICAgICBzZXBhcmF0aW9uIG9yIG1lcmdpbmcgd2hlbiBzcGFjZSBpcyBleHRlbmRlZC4KLQotICAgICAzLiBDaHVua3MgYWxsb2NhdGVkIHZpYSBtbWFwLCB3aGljaCBoYXZlIHRoZSBsb3dlc3Qtb3JkZXIgYml0Ci0gICAgICAgIChJU19NTUFQUEVEX0JJVCkgc2V0IGluIHRoZWlyIHByZXZfZm9vdCBmaWVsZHMsIGFuZCBkbyBub3Qgc2V0Ci0gICAgICAgIFBJTlVTRV9CSVQgaW4gdGhlaXIgaGVhZCBmaWVsZHMuICBCZWNhdXNlIHRoZXkgYXJlIGFsbG9jYXRlZAotICAgICAgICBvbmUtYnktb25lLCBlYWNoIG11c3QgY2FycnkgaXRzIG93biBwcmV2X2Zvb3QgZmllbGQsIHdoaWNoIGlzCi0gICAgICAgIGFsc28gdXNlZCB0byBob2xkIHRoZSBvZmZzZXQgdGhpcyBjaHVuayBoYXMgd2l0aGluIGl0cyBtbWFwcGVkCi0gICAgICAgIHJlZ2lvbiwgd2hpY2ggaXMgbmVlZGVkIHRvIHByZXNlcnZlIGFsaWdubWVudC4gRWFjaCBtbWFwcGVkCi0gICAgICAgIGNodW5rIGlzIHRyYWlsZWQgYnkgdGhlIGZpcnN0IHR3byBmaWVsZHMgb2YgYSBmYWtlIG5leHQtY2h1bmsKLSAgICAgICAgZm9yIHNha2Ugb2YgdXNhZ2UgY2hlY2tzLgotCi0qLwotCi1zdHJ1Y3QgbWFsbG9jX2NodW5rIHsKLSAgc2l6ZV90ICAgICAgICAgICAgICAgcHJldl9mb290OyAgLyogU2l6ZSBvZiBwcmV2aW91cyBjaHVuayAoaWYgZnJlZSkuICAqLwotICBzaXplX3QgICAgICAgICAgICAgICBoZWFkOyAgICAgICAvKiBTaXplIGFuZCBpbnVzZSBiaXRzLiAqLwotICBzdHJ1Y3QgbWFsbG9jX2NodW5rKiBmZDsgICAgICAgICAvKiBkb3VibGUgbGlua3MgLS0gdXNlZCBvbmx5IGlmIGZyZWUuICovCi0gIHN0cnVjdCBtYWxsb2NfY2h1bmsqIGJrOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX2NodW5rICBtY2h1bms7Ci10eXBlZGVmIHN0cnVjdCBtYWxsb2NfY2h1bmsqIG1jaHVua3B0cjsKLXR5cGVkZWYgc3RydWN0IG1hbGxvY19jaHVuayogc2JpbnB0cjsgIC8qIFRoZSB0eXBlIG9mIGJpbnMgb2YgY2h1bmtzICovCi10eXBlZGVmIHNpemVfdCBiaW5kZXhfdDsgICAgICAgICAgICAgICAvKiBEZXNjcmliZWQgYmVsb3cgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IGJpbm1hcF90OyAgICAgICAgIC8qIERlc2NyaWJlZCBiZWxvdyAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxhZ190OyAgICAgICAgICAgLyogVGhlIHR5cGUgb2YgdmFyaW91cyBiaXQgZmxhZyBzZXRzICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gQ2h1bmtzIHNpemVzIGFuZCBhbGlnbm1lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgTUNIVU5LX1NJWkUgICAgICAgICAoc2l6ZW9mKG1jaHVuaykpCi0KLSNpZiBGT09URVJTCi0jZGVmaW5lIENIVU5LX09WRVJIRUFEICAgICAgKFRXT19TSVpFX1RfU0laRVMpCi0jZWxzZSAvKiBGT09URVJTICovCi0jZGVmaW5lIENIVU5LX09WRVJIRUFEICAgICAgKFNJWkVfVF9TSVpFKQotI2VuZGlmIC8qIEZPT1RFUlMgKi8KLQotLyogTU1hcHBlZCBjaHVua3MgbmVlZCBhIHNlY29uZCB3b3JkIG9mIG92ZXJoZWFkIC4uLiAqLwotI2RlZmluZSBNTUFQX0NIVU5LX09WRVJIRUFEIChUV09fU0laRV9UX1NJWkVTKQotLyogLi4uIGFuZCBhZGRpdGlvbmFsIHBhZGRpbmcgZm9yIGZha2UgbmV4dC1jaHVuayBhdCBmb290ICovCi0jZGVmaW5lIE1NQVBfRk9PVF9QQUQgICAgICAgKEZPVVJfU0laRV9UX1NJWkVTKQotCi0vKiBUaGUgc21hbGxlc3Qgc2l6ZSB3ZSBjYW4gbWFsbG9jIGlzIGFuIGFsaWduZWQgbWluaW1hbCBjaHVuayAqLwotI2RlZmluZSBNSU5fQ0hVTktfU0laRVwKLSAgKChNQ0hVTktfU0laRSArIENIVU5LX0FMSUdOX01BU0spICYgfkNIVU5LX0FMSUdOX01BU0spCi0KLS8qIGNvbnZlcnNpb24gZnJvbSBtYWxsb2MgaGVhZGVycyB0byB1c2VyIHBvaW50ZXJzLCBhbmQgYmFjayAqLwotI2RlZmluZSBjaHVuazJtZW0ocCkgICAgICAgICgodm9pZCopKChjaGFyKikocCkgICAgICAgKyBUV09fU0laRV9UX1NJWkVTKSkKLSNkZWZpbmUgbWVtMmNodW5rKG1lbSkgICAgICAoKG1jaHVua3B0cikoKGNoYXIqKShtZW0pIC0gVFdPX1NJWkVfVF9TSVpFUykpCi0vKiBjaHVuayBhc3NvY2lhdGVkIHdpdGggYWxpZ25lZCBhZGRyZXNzIEEgKi8KLSNkZWZpbmUgYWxpZ25fYXNfY2h1bmsoQSkgICAobWNodW5rcHRyKSgoQSkgKyBhbGlnbl9vZmZzZXQoY2h1bmsybWVtKEEpKSkKLQotLyogQm91bmRzIG9uIHJlcXVlc3QgKG5vdCBjaHVuaykgc2l6ZXMuICovCi0jZGVmaW5lIE1BWF9SRVFVRVNUICAgICAgICAgKCgtTUlOX0NIVU5LX1NJWkUpIDw8IDIpCi0jZGVmaW5lIE1JTl9SRVFVRVNUICAgICAgICAgKE1JTl9DSFVOS19TSVpFIC0gQ0hVTktfT1ZFUkhFQUQgLSBTSVpFX1RfT05FKQotCi0vKiBwYWQgcmVxdWVzdCBieXRlcyBpbnRvIGEgdXNhYmxlIHNpemUgKi8KLSNkZWZpbmUgcGFkX3JlcXVlc3QocmVxKSBcCi0gICAoKChyZXEpICsgQ0hVTktfT1ZFUkhFQUQgKyBDSFVOS19BTElHTl9NQVNLKSAmIH5DSFVOS19BTElHTl9NQVNLKQotCi0vKiBwYWQgcmVxdWVzdCwgY2hlY2tpbmcgZm9yIG1pbmltdW0gKGJ1dCBub3QgbWF4aW11bSkgKi8KLSNkZWZpbmUgcmVxdWVzdDJzaXplKHJlcSkgXAotICAoKChyZXEpIDwgTUlOX1JFUVVFU1QpPyBNSU5fQ0hVTktfU0laRSA6IHBhZF9yZXF1ZXN0KHJlcSkpCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMgb24gaGVhZCBhbmQgZm9vdCBmaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAgVGhlIGhlYWQgZmllbGQgb2YgYSBjaHVuayBpcyBvcidlZCB3aXRoIFBJTlVTRV9CSVQgd2hlbiBwcmV2aW91cwotICBhZGphY2VudCBjaHVuayBpbiB1c2UsIGFuZCBvcidlZCB3aXRoIENJTlVTRV9CSVQgaWYgdGhpcyBjaHVuayBpcyBpbgotICB1c2UuIElmIHRoZSBjaHVuayB3YXMgb2J0YWluZWQgd2l0aCBtbWFwLCB0aGUgcHJldl9mb290IGZpZWxkIGhhcwotICBJU19NTUFQUEVEX0JJVCBzZXQsIG90aGVyd2lzZSBob2xkaW5nIHRoZSBvZmZzZXQgb2YgdGhlIGJhc2Ugb2YgdGhlCi0gIG1tYXBwZWQgcmVnaW9uIHRvIHRoZSBiYXNlIG9mIHRoZSBjaHVuay4KLSovCi0KLSNkZWZpbmUgUElOVVNFX0JJVCAgICAgICAgICAoU0laRV9UX09ORSkKLSNkZWZpbmUgQ0lOVVNFX0JJVCAgICAgICAgICAoU0laRV9UX1RXTykKLSNkZWZpbmUgSU5VU0VfQklUUyAgICAgICAgICAoUElOVVNFX0JJVHxDSU5VU0VfQklUKQotCi0vKiBIZWFkIHZhbHVlIGZvciBmZW5jZXBvc3RzICovCi0jZGVmaW5lIEZFTkNFUE9TVF9IRUFEICAgICAgKElOVVNFX0JJVFN8U0laRV9UX1NJWkUpCi0KLS8qIGV4dHJhY3Rpb24gb2YgZmllbGRzIGZyb20gaGVhZCB3b3JkcyAqLwotI2RlZmluZSBjaW51c2UocCkgICAgICAgICAgICgocCktPmhlYWQgJiBDSU5VU0VfQklUKQotI2RlZmluZSBwaW51c2UocCkgICAgICAgICAgICgocCktPmhlYWQgJiBQSU5VU0VfQklUKQotI2RlZmluZSBjaHVua3NpemUocCkgICAgICAgICgocCktPmhlYWQgJiB+KElOVVNFX0JJVFMpKQotCi0jZGVmaW5lIGNsZWFyX3BpbnVzZShwKSAgICAgKChwKS0+aGVhZCAmPSB+UElOVVNFX0JJVCkKLSNkZWZpbmUgY2xlYXJfY2ludXNlKHApICAgICAoKHApLT5oZWFkICY9IH5DSU5VU0VfQklUKQotCi0vKiBUcmVhdCBzcGFjZSBhdCBwdHIgKy8tIG9mZnNldCBhcyBhIGNodW5rICovCi0jZGVmaW5lIGNodW5rX3BsdXNfb2Zmc2V0KHAsIHMpICAoKG1jaHVua3B0cikoKChjaGFyKikocCkpICsgKHMpKSkKLSNkZWZpbmUgY2h1bmtfbWludXNfb2Zmc2V0KHAsIHMpICgobWNodW5rcHRyKSgoKGNoYXIqKShwKSkgLSAocykpKQotCi0vKiBQdHIgdG8gbmV4dCBvciBwcmV2aW91cyBwaHlzaWNhbCBtYWxsb2NfY2h1bmsuICovCi0jZGVmaW5lIG5leHRfY2h1bmsocCkgKChtY2h1bmtwdHIpKCAoKGNoYXIqKShwKSkgKyAoKHApLT5oZWFkICYgfklOVVNFX0JJVFMpKSkKLSNkZWZpbmUgcHJldl9jaHVuayhwKSAoKG1jaHVua3B0cikoICgoY2hhciopKHApKSAtICgocCktPnByZXZfZm9vdCkgKSkKLQotLyogZXh0cmFjdCBuZXh0IGNodW5rJ3MgcGludXNlIGJpdCAqLwotI2RlZmluZSBuZXh0X3BpbnVzZShwKSAgKChuZXh0X2NodW5rKHApLT5oZWFkKSAmIFBJTlVTRV9CSVQpCi0KLS8qIEdldC9zZXQgc2l6ZSBhdCBmb290ZXIgKi8KLSNkZWZpbmUgZ2V0X2Zvb3QocCwgcykgICgoKG1jaHVua3B0cikoKGNoYXIqKShwKSArIChzKSkpLT5wcmV2X2Zvb3QpCi0jZGVmaW5lIHNldF9mb290KHAsIHMpICAoKChtY2h1bmtwdHIpKChjaGFyKikocCkgKyAocykpKS0+cHJldl9mb290ID0gKHMpKQotCi0vKiBTZXQgc2l6ZSwgcGludXNlIGJpdCwgYW5kIGZvb3QgKi8KLSNkZWZpbmUgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHAsIHMpXAotICAoKHApLT5oZWFkID0gKHN8UElOVVNFX0JJVCksIHNldF9mb290KHAsIHMpKQotCi0vKiBTZXQgc2l6ZSwgcGludXNlIGJpdCwgZm9vdCwgYW5kIGNsZWFyIG5leHQgcGludXNlICovCi0jZGVmaW5lIHNldF9mcmVlX3dpdGhfcGludXNlKHAsIHMsIG4pXAotICAoY2xlYXJfcGludXNlKG4pLCBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgcykpCi0KLSNkZWZpbmUgaXNfbW1hcHBlZChwKVwKLSAgKCEoKHApLT5oZWFkICYgUElOVVNFX0JJVCkgJiYgKChwKS0+cHJldl9mb290ICYgSVNfTU1BUFBFRF9CSVQpKQotCi0vKiBHZXQgdGhlIGludGVybmFsIG92ZXJoZWFkIGFzc29jaWF0ZWQgd2l0aCBjaHVuayBwICovCi0jZGVmaW5lIG92ZXJoZWFkX2ZvcihwKVwKLSAoaXNfbW1hcHBlZChwKT8gTU1BUF9DSFVOS19PVkVSSEVBRCA6IENIVU5LX09WRVJIRUFEKQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBtYWxsb2NlZCBzcGFjZSBpcyBub3QgbmVjZXNzYXJpbHkgY2xlYXJlZCAqLwotI2lmIE1NQVBfQ0xFQVJTCi0jZGVmaW5lIGNhbGxvY19tdXN0X2NsZWFyKHApICghaXNfbW1hcHBlZChwKSkKLSNlbHNlIC8qIE1NQVBfQ0xFQVJTICovCi0jZGVmaW5lIGNhbGxvY19tdXN0X2NsZWFyKHApICgxKQotI2VuZGlmIC8qIE1NQVBfQ0xFQVJTICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3ZlcmxhaWQgZGF0YSBzdHJ1Y3R1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qCi0gIFdoZW4gY2h1bmtzIGFyZSBub3QgaW4gdXNlLCB0aGV5IGFyZSB0cmVhdGVkIGFzIG5vZGVzIG9mIGVpdGhlcgotICBsaXN0cyBvciB0cmVlcy4KLQotICAiU21hbGwiICBjaHVua3MgYXJlIHN0b3JlZCBpbiBjaXJjdWxhciBkb3VibHktbGlua2VkIGxpc3RzLCBhbmQgbG9vawotICBsaWtlIHRoaXM6Ci0KLSAgICBjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAgICB8ICAgICAgICAgICAgIFNpemUgb2YgcHJldmlvdXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICBgaGVhZDonIHwgICAgICAgICAgICAgU2l6ZSBvZiBjaHVuaywgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgfFB8Ci0gICAgICBtZW0tPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgICAgfCAgICAgICAgICAgICBGb3J3YXJkIHBvaW50ZXIgdG8gbmV4dCBjaHVuayBpbiBsaXN0ICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAgICB8ICAgICAgICAgICAgIEJhY2sgcG9pbnRlciB0byBwcmV2aW91cyBjaHVuayBpbiBsaXN0ICAgICAgICAgICAgfAotICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICAgIHwgICAgICAgICAgICAgVW51c2VkIHNwYWNlIChtYXkgYmUgMCBieXRlcyBsb25nKSAgICAgICAgICAgICAgICAuCi0gICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLW5leHRjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgYGZvb3Q6JyB8ICAgICAgICAgICAgIFNpemUgb2YgY2h1bmssIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQotICBMYXJnZXIgY2h1bmtzIGFyZSBrZXB0IGluIGEgZm9ybSBvZiBiaXR3aXNlIGRpZ2l0YWwgdHJlZXMgKGFrYQotICB0cmllcykga2V5ZWQgb24gY2h1bmtzaXplcy4gIEJlY2F1c2UgbWFsbG9jX3RyZWVfY2h1bmtzIGFyZSBvbmx5IGZvcgotICBmcmVlIGNodW5rcyBncmVhdGVyIHRoYW4gMjU2IGJ5dGVzLCB0aGVpciBzaXplIGRvZXNuJ3QgaW1wb3NlIGFueQotICBjb25zdHJhaW50cyBvbiB1c2VyIGNodW5rIHNpemVzLiAgRWFjaCBub2RlIGxvb2tzIGxpa2U6Ci0KLSAgICBjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAgICB8ICAgICAgICAgICAgIFNpemUgb2YgcHJldmlvdXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICBgaGVhZDonIHwgICAgICAgICAgICAgU2l6ZSBvZiBjaHVuaywgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgfFB8Ci0gICAgICBtZW0tPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgICAgfCAgICAgICAgICAgICBGb3J3YXJkIHBvaW50ZXIgdG8gbmV4dCBjaHVuayBvZiBzYW1lIHNpemUgICAgICAgIHwKLSAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAgICB8ICAgICAgICAgICAgIEJhY2sgcG9pbnRlciB0byBwcmV2aW91cyBjaHVuayBvZiBzYW1lIHNpemUgICAgICAgfAotICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICAgIHwgICAgICAgICAgICAgUG9pbnRlciB0byBsZWZ0IGNoaWxkIChjaGlsZFswXSkgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgICAgfCAgICAgICAgICAgICBQb2ludGVyIHRvIHJpZ2h0IGNoaWxkIChjaGlsZFsxXSkgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAgICB8ICAgICAgICAgICAgIFBvaW50ZXIgdG8gcGFyZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICAgIHwgICAgICAgICAgICAgYmluIGluZGV4IG9mIHRoaXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgICAgfCAgICAgICAgICAgICBVbnVzZWQgc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci1uZXh0Y2h1bmstPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgIGBmb290OicgfCAgICAgICAgICAgICBTaXplIG9mIGNodW5rLCBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0KLSAgRWFjaCB0cmVlIGhvbGRpbmcgdHJlZW5vZGVzIGlzIGEgdHJlZSBvZiB1bmlxdWUgY2h1bmsgc2l6ZXMuICBDaHVua3MKLSAgb2YgdGhlIHNhbWUgc2l6ZSBhcmUgYXJyYW5nZWQgaW4gYSBjaXJjdWxhcmx5LWxpbmtlZCBsaXN0LCB3aXRoIG9ubHkKLSAgdGhlIG9sZGVzdCBjaHVuayAodGhlIG5leHQgdG8gYmUgdXNlZCwgaW4gb3VyIEZJRk8gb3JkZXJpbmcpCi0gIGFjdHVhbGx5IGluIHRoZSB0cmVlLiAgKFRyZWUgbWVtYmVycyBhcmUgZGlzdGluZ3Vpc2hlZCBieSBhIG5vbi1udWxsCi0gIHBhcmVudCBwb2ludGVyLikgIElmIGEgY2h1bmsgd2l0aCB0aGUgc2FtZSBzaXplIGFuIGFuIGV4aXN0aW5nIG5vZGUKLSAgaXMgaW5zZXJ0ZWQsIGl0IGlzIGxpbmtlZCBvZmYgdGhlIGV4aXN0aW5nIG5vZGUgdXNpbmcgcG9pbnRlcnMgdGhhdAotICB3b3JrIGluIHRoZSBzYW1lIHdheSBhcyBmZC9iayBwb2ludGVycyBvZiBzbWFsbCBjaHVua3MuCi0KLSAgRWFjaCB0cmVlIGNvbnRhaW5zIGEgcG93ZXIgb2YgMiBzaXplZCByYW5nZSBvZiBjaHVuayBzaXplcyAodGhlCi0gIHNtYWxsZXN0IGlzIDB4MTAwIDw9IHggPCAweDE4MCksIHdoaWNoIGlzIGlzIGRpdmlkZWQgaW4gaGFsZiBhdCBlYWNoCi0gIHRyZWUgbGV2ZWwsIHdpdGggdGhlIGNodW5rcyBpbiB0aGUgc21hbGxlciBoYWxmIG9mIHRoZSByYW5nZSAoMHgxMDAKLSAgPD0geCA8IDB4MTQwIGZvciB0aGUgdG9wIG5vc2UpIGluIHRoZSBsZWZ0IHN1YnRyZWUgYW5kIHRoZSBsYXJnZXIKLSAgaGFsZiAoMHgxNDAgPD0geCA8IDB4MTgwKSBpbiB0aGUgcmlnaHQgc3VidHJlZS4gIFRoaXMgaXMsIG9mIGNvdXJzZSwKLSAgZG9uZSBieSBpbnNwZWN0aW5nIGluZGl2aWR1YWwgYml0cy4KLQotICBVc2luZyB0aGVzZSBydWxlcywgZWFjaCBub2RlJ3MgbGVmdCBzdWJ0cmVlIGNvbnRhaW5zIGFsbCBzbWFsbGVyCi0gIHNpemVzIHRoYW4gaXRzIHJpZ2h0IHN1YnRyZWUuICBIb3dldmVyLCB0aGUgbm9kZSBhdCB0aGUgcm9vdCBvZiBlYWNoCi0gIHN1YnRyZWUgaGFzIG5vIHBhcnRpY3VsYXIgb3JkZXJpbmcgcmVsYXRpb25zaGlwIHRvIGVpdGhlci4gIChUaGUKLSAgZGl2aWRpbmcgbGluZSBiZXR3ZWVuIHRoZSBzdWJ0cmVlIHNpemVzIGlzIGJhc2VkIG9uIHRyaWUgcmVsYXRpb24uKQotICBJZiB3ZSByZW1vdmUgdGhlIGxhc3QgY2h1bmsgb2YgYSBnaXZlbiBzaXplIGZyb20gdGhlIGludGVyaW9yIG9mIHRoZQotICB0cmVlLCB3ZSBuZWVkIHRvIHJlcGxhY2UgaXQgd2l0aCBhIGxlYWYgbm9kZS4gIFRoZSB0cmVlIG9yZGVyaW5nCi0gIHJ1bGVzIHBlcm1pdCBhIG5vZGUgdG8gYmUgcmVwbGFjZWQgYnkgYW55IGxlYWYgYmVsb3cgaXQuCi0KLSAgVGhlIHNtYWxsZXN0IGNodW5rIGluIGEgdHJlZSAoYSBjb21tb24gb3BlcmF0aW9uIGluIGEgYmVzdC1maXQKLSAgYWxsb2NhdG9yKSBjYW4gYmUgZm91bmQgYnkgd2Fsa2luZyBhIHBhdGggdG8gdGhlIGxlZnRtb3N0IGxlYWYgaW4KLSAgdGhlIHRyZWUuICBVbmxpa2UgYSB1c3VhbCBiaW5hcnkgdHJlZSwgd2hlcmUgd2UgZm9sbG93IGxlZnQgY2hpbGQKLSAgcG9pbnRlcnMgdW50aWwgd2UgcmVhY2ggYSBudWxsLCBoZXJlIHdlIGZvbGxvdyB0aGUgcmlnaHQgY2hpbGQKLSAgcG9pbnRlciBhbnkgdGltZSB0aGUgbGVmdCBvbmUgaXMgbnVsbCwgdW50aWwgd2UgcmVhY2ggYSBsZWFmIHdpdGgKLSAgYm90aCBjaGlsZCBwb2ludGVycyBudWxsLiBUaGUgc21hbGxlc3QgY2h1bmsgaW4gdGhlIHRyZWUgd2lsbCBiZQotICBzb21ld2hlcmUgYWxvbmcgdGhhdCBwYXRoLgotCi0gIFRoZSB3b3JzdCBjYXNlIG51bWJlciBvZiBzdGVwcyB0byBhZGQsIGZpbmQsIG9yIHJlbW92ZSBhIG5vZGUgaXMKLSAgYm91bmRlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgZGlmZmVyZW50aWF0aW5nIGNodW5rcyB3aXRoaW4KLSAgYmlucy4gVW5kZXIgY3VycmVudCBiaW4gY2FsY3VsYXRpb25zLCB0aGlzIHJhbmdlcyBmcm9tIDYgdXAgdG8gMjEKLSAgKGZvciAzMiBiaXQgc2l6ZXMpIG9yIHVwIHRvIDUzIChmb3IgNjQgYml0IHNpemVzKS4gVGhlIHR5cGljYWwgY2FzZQotICBpcyBvZiBjb3Vyc2UgbXVjaCBiZXR0ZXIuCi0qLwotCi1zdHJ1Y3QgbWFsbG9jX3RyZWVfY2h1bmsgewotICAvKiBUaGUgZmlyc3QgZm91ciBmaWVsZHMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggbWFsbG9jX2NodW5rICovCi0gIHNpemVfdCAgICAgICAgICAgICAgICAgICAgcHJldl9mb290OwotICBzaXplX3QgICAgICAgICAgICAgICAgICAgIGhlYWQ7Ci0gIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayogZmQ7Ci0gIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayogYms7Ci0KLSAgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiBjaGlsZFsyXTsKLSAgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiBwYXJlbnQ7Ci0gIGJpbmRleF90ICAgICAgICAgICAgICAgICAgaW5kZXg7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayAgdGNodW5rOwotdHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3RyZWVfY2h1bmsqIHRjaHVua3B0cjsKLXR5cGVkZWYgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiB0YmlucHRyOyAvKiBUaGUgdHlwZSBvZiBiaW5zIG9mIHRyZWVzICovCi0KLS8qIEEgbGl0dGxlIGhlbHBlciBtYWNybyBmb3IgdHJlZXMgKi8KLSNkZWZpbmUgbGVmdG1vc3RfY2hpbGQodCkgKCh0KS0+Y2hpbGRbMF0gIT0gMD8gKHQpLT5jaGlsZFswXSA6ICh0KS0+Y2hpbGRbMV0pCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlZ21lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qCi0gIEVhY2ggbWFsbG9jIHNwYWNlIG1heSBpbmNsdWRlIG5vbi1jb250aWd1b3VzIHNlZ21lbnRzLCBoZWxkIGluIGEKLSAgbGlzdCBoZWFkZWQgYnkgYW4gZW1iZWRkZWQgbWFsbG9jX3NlZ21lbnQgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUKLSAgdG9wLW1vc3Qgc3BhY2UuIFNlZ21lbnRzIGFsc28gaW5jbHVkZSBmbGFncyBob2xkaW5nIHByb3BlcnRpZXMgb2YKLSAgdGhlIHNwYWNlLiBMYXJnZSBjaHVua3MgdGhhdCBhcmUgZGlyZWN0bHkgYWxsb2NhdGVkIGJ5IG1tYXAgYXJlIG5vdAotICBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuIFRoZXkgYXJlIGluc3RlYWQgaW5kZXBlbmRlbnRseSBjcmVhdGVkIGFuZAotICBkZXN0cm95ZWQgd2l0aG91dCBvdGhlcndpc2Uga2VlcGluZyB0cmFjayBvZiB0aGVtLgotCi0gIFNlZ21lbnQgbWFuYWdlbWVudCBtYWlubHkgY29tZXMgaW50byBwbGF5IGZvciBzcGFjZXMgYWxsb2NhdGVkIGJ5Ci0gIE1NQVAuICBBbnkgY2FsbCB0byBNTUFQIG1pZ2h0IG9yIG1pZ2h0IG5vdCByZXR1cm4gbWVtb3J5IHRoYXQgaXMKLSAgYWRqYWNlbnQgdG8gYW4gZXhpc3Rpbmcgc2VnbWVudC4gIE1PUkVDT1JFIG5vcm1hbGx5IGNvbnRpZ3VvdXNseQotICBleHRlbmRzIHRoZSBjdXJyZW50IHNwYWNlLCBzbyB0aGlzIHNwYWNlIGlzIGFsbW9zdCBhbHdheXMgYWRqYWNlbnQsCi0gIHdoaWNoIGlzIHNpbXBsZXIgYW5kIGZhc3RlciB0byBkZWFsIHdpdGguIChUaGlzIGlzIHdoeSBNT1JFQ09SRSBpcwotICB1c2VkIHByZWZlcmVudGlhbGx5IHRvIE1NQVAgd2hlbiBib3RoIGFyZSBhdmFpbGFibGUgLS0gc2VlCi0gIHN5c19hbGxvYy4pICBXaGVuIGFsbG9jYXRpbmcgdXNpbmcgTU1BUCwgd2UgZG9uJ3QgdXNlIGFueSBvZiB0aGUKLSAgaGludGluZyBtZWNoYW5pc21zIChpbmNvbnNpc3RlbnRseSkgc3VwcG9ydGVkIGluIHZhcmlvdXMKLSAgaW1wbGVtZW50YXRpb25zIG9mIHVuaXggbW1hcCwgb3IgZGlzdGluZ3Vpc2ggcmVzZXJ2aW5nIGZyb20KLSAgY29tbWl0dGluZyBtZW1vcnkuIEluc3RlYWQsIHdlIGp1c3QgYXNrIGZvciBzcGFjZSwgYW5kIGV4cGxvaXQKLSAgY29udGlndWl0eSB3aGVuIHdlIGdldCBpdC4gIEl0IGlzIHByb2JhYmx5IHBvc3NpYmxlIHRvIGRvCi0gIGJldHRlciB0aGFuIHRoaXMgb24gc29tZSBzeXN0ZW1zLCBidXQgbm8gZ2VuZXJhbCBzY2hlbWUgc2VlbXMKLSAgdG8gYmUgc2lnbmlmaWNhbnRseSBiZXR0ZXIuCi0KLSAgTWFuYWdlbWVudCBlbnRhaWxzIGEgc2ltcGxlciB2YXJpYW50IG9mIHRoZSBjb25zb2xpZGF0aW9uIHNjaGVtZQotICB1c2VkIGZvciBjaHVua3MgdG8gcmVkdWNlIGZyYWdtZW50YXRpb24gLS0gbmV3IGFkamFjZW50IG1lbW9yeSBpcwotICBub3JtYWxseSBwcmVwZW5kZWQgb3IgYXBwZW5kZWQgdG8gYW4gZXhpc3Rpbmcgc2VnbWVudC4gSG93ZXZlciwKLSAgdGhlcmUgYXJlIGxpbWl0YXRpb25zIGNvbXBhcmVkIHRvIGNodW5rIGNvbnNvbGlkYXRpb24gdGhhdCBtb3N0bHkKLSAgcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHNlZ21lbnQgcHJvY2Vzc2luZyBpcyByZWxhdGl2ZWx5IGluZnJlcXVlbnQKLSAgKG9jY3VycmluZyBvbmx5IHdoZW4gZ2V0dGluZyBtZW1vcnkgZnJvbSBzeXN0ZW0pIGFuZCB0aGF0IHdlCi0gIGRvbid0IGV4cGVjdCB0byBoYXZlIGh1Z2UgbnVtYmVycyBvZiBzZWdtZW50czoKLQotICAqIFNlZ21lbnRzIGFyZSBub3QgaW5kZXhlZCwgc28gdHJhdmVyc2FsIHJlcXVpcmVzIGxpbmVhciBzY2Fucy4gIChJdAotICAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluZGV4IHRoZXNlLCBidXQgaXMgbm90IHdvcnRoIHRoZSBleHRyYQotICAgIG92ZXJoZWFkIGFuZCBjb21wbGV4aXR5IGZvciBtb3N0IHByb2dyYW1zIG9uIG1vc3QgcGxhdGZvcm1zLikKLSAgKiBOZXcgc2VnbWVudHMgYXJlIG9ubHkgYXBwZW5kZWQgdG8gb2xkIG9uZXMgd2hlbiBob2xkaW5nIHRvcC1tb3N0Ci0gICAgbWVtb3J5OyBpZiB0aGV5IGNhbm5vdCBiZSBwcmVwZW5kZWQgdG8gb3RoZXJzLCB0aGV5IGFyZSBoZWxkIGluCi0gICAgZGlmZmVyZW50IHNlZ21lbnRzLgotCi0gIEV4Y2VwdCBmb3IgdGhlIHRvcC1tb3N0IHNlZ21lbnQgb2YgYW4gbXN0YXRlLCBlYWNoIHNlZ21lbnQgcmVjb3JkCi0gIGlzIGtlcHQgYXQgdGhlIHRhaWwgb2YgaXRzIHNlZ21lbnQuIFNlZ21lbnRzIGFyZSBhZGRlZCBieSBwdXNoaW5nCi0gIHNlZ21lbnQgcmVjb3JkcyBvbnRvIHRoZSBsaXN0IGhlYWRlZCBieSAmbXN0YXRlLnNlZyBmb3IgdGhlCi0gIGNvbnRhaW5pbmcgbXN0YXRlLgotCi0gIFNlZ21lbnQgZmxhZ3MgY29udHJvbCBhbGxvY2F0aW9uL21lcmdlL2RlYWxsb2NhdGlvbiBwb2xpY2llczoKLSAgKiBJZiBFWFRFUk5fQklUIHNldCwgdGhlbiB3ZSBkaWQgbm90IGFsbG9jYXRlIHRoaXMgc2VnbWVudCwKLSAgICBhbmQgc28gc2hvdWxkIG5vdCB0cnkgdG8gZGVhbGxvY2F0ZSBvciBtZXJnZSB3aXRoIG90aGVycy4KLSAgICAoVGhpcyBjdXJyZW50bHkgaG9sZHMgb25seSBmb3IgdGhlIGluaXRpYWwgc2VnbWVudCBwYXNzZWQKLSAgICBpbnRvIGNyZWF0ZV9tc3BhY2Vfd2l0aF9iYXNlLikKLSAgKiBJZiBJU19NTUFQUEVEX0JJVCBzZXQsIHRoZSBzZWdtZW50IG1heSBiZSBtZXJnZWQgd2l0aAotICAgIG90aGVyIHN1cnJvdW5kaW5nIG1tYXBwZWQgc2VnbWVudHMgYW5kIHRyaW1tZWQvZGUtYWxsb2NhdGVkCi0gICAgdXNpbmcgbXVubWFwLgotICAqIElmIG5laXRoZXIgYml0IGlzIHNldCwgdGhlbiB0aGUgc2VnbWVudCB3YXMgb2J0YWluZWQgdXNpbmcKLSAgICBNT1JFQ09SRSBzbyBjYW4gYmUgbWVyZ2VkIHdpdGggc3Vycm91bmRpbmcgTU9SRUNPUkUnZCBzZWdtZW50cwotICAgIGFuZCBkZWFsbG9jYXRlZC90cmltbWVkIHVzaW5nIE1PUkVDT1JFIHdpdGggbmVnYXRpdmUgYXJndW1lbnRzLgotKi8KLQotc3RydWN0IG1hbGxvY19zZWdtZW50IHsKLSAgY2hhciogICAgICAgIGJhc2U7ICAgICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyAqLwotICBzaXplX3QgICAgICAgc2l6ZTsgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNpemUgKi8KLSAgc3RydWN0IG1hbGxvY19zZWdtZW50KiBuZXh0OyAgIC8qIHB0ciB0byBuZXh0IHNlZ21lbnQgKi8KLSAgZmxhZ190ICAgICAgIHNmbGFnczsgICAgICAgICAgIC8qIG1tYXAgYW5kIGV4dGVybiBmbGFnICovCi19OwotCi0jZGVmaW5lIGlzX21tYXBwZWRfc2VnbWVudChTKSAgKChTKS0+c2ZsYWdzICYgSVNfTU1BUFBFRF9CSVQpCi0jZGVmaW5lIGlzX2V4dGVybl9zZWdtZW50KFMpICAgKChTKS0+c2ZsYWdzICYgRVhURVJOX0JJVCkKLQotdHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQgIG1zZWdtZW50OwotdHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQqIG1zZWdtZW50cHRyOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1hbGxvY19zdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKgotICAgQSBtYWxsb2Nfc3RhdGUgaG9sZHMgYWxsIG9mIHRoZSBib29ra2VlcGluZyBmb3IgYSBzcGFjZS4KLSAgIFRoZSBtYWluIGZpZWxkcyBhcmU6Ci0KLSAgVG9wCi0gICAgVGhlIHRvcG1vc3QgY2h1bmsgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2VnbWVudC4gSXRzIHNpemUgaXMKLSAgICBjYWNoZWQgaW4gdG9wc2l6ZS4gIFRoZSBhY3R1YWwgc2l6ZSBvZiB0b3Btb3N0IHNwYWNlIGlzCi0gICAgdG9wc2l6ZStUT1BfRk9PVF9TSVpFLCB3aGljaCBpbmNsdWRlcyBzcGFjZSByZXNlcnZlZCBmb3IgYWRkaW5nCi0gICAgZmVuY2Vwb3N0cyBhbmQgc2VnbWVudCByZWNvcmRzIGlmIG5lY2Vzc2FyeSB3aGVuIGdldHRpbmcgbW9yZQotICAgIHNwYWNlIGZyb20gdGhlIHN5c3RlbS4gIFRoZSBzaXplIGF0IHdoaWNoIHRvIGF1dG90cmltIHRvcCBpcwotICAgIGNhY2hlZCBmcm9tIG1wYXJhbXMgaW4gdHJpbV9jaGVjaywgZXhjZXB0IHRoYXQgaXQgaXMgZGlzYWJsZWQgaWYKLSAgICBhbiBhdXRvdHJpbSBmYWlscy4KLQotICBEZXNpZ25hdGVkIHZpY3RpbSAoZHYpCi0gICAgVGhpcyBpcyB0aGUgcHJlZmVycmVkIGNodW5rIGZvciBzZXJ2aWNpbmcgc21hbGwgcmVxdWVzdHMgdGhhdAotICAgIGRvbid0IGhhdmUgZXhhY3QgZml0cy4gIEl0IGlzIG5vcm1hbGx5IHRoZSBjaHVuayBzcGxpdCBvZmYgbW9zdAotICAgIHJlY2VudGx5IHRvIHNlcnZpY2UgYW5vdGhlciBzbWFsbCByZXF1ZXN0LiAgSXRzIHNpemUgaXMgY2FjaGVkIGluCi0gICAgZHZzaXplLiBUaGUgbGluayBmaWVsZHMgb2YgdGhpcyBjaHVuayBhcmUgbm90IG1haW50YWluZWQgc2luY2UgaXQKLSAgICBpcyBub3Qga2VwdCBpbiBhIGJpbi4KLQotICBTbWFsbEJpbnMKLSAgICBBbiBhcnJheSBvZiBiaW4gaGVhZGVycyBmb3IgZnJlZSBjaHVua3MuICBUaGVzZSBiaW5zIGhvbGQgY2h1bmtzCi0gICAgd2l0aCBzaXplcyBsZXNzIHRoYW4gTUlOX0xBUkdFX1NJWkUgYnl0ZXMuIEVhY2ggYmluIGNvbnRhaW5zCi0gICAgY2h1bmtzIG9mIGFsbCB0aGUgc2FtZSBzaXplLCBzcGFjZWQgOCBieXRlcyBhcGFydC4gIFRvIHNpbXBsaWZ5Ci0gICAgdXNlIGluIGRvdWJsZS1saW5rZWQgbGlzdHMsIGVhY2ggYmluIGhlYWRlciBhY3RzIGFzIGEgbWFsbG9jX2NodW5rCi0gICAgcG9pbnRpbmcgdG8gdGhlIHJlYWwgZmlyc3Qgbm9kZSwgaWYgaXQgZXhpc3RzIChlbHNlIHBvaW50aW5nIHRvCi0gICAgaXRzZWxmKS4gIFRoaXMgYXZvaWRzIHNwZWNpYWwtY2FzaW5nIGZvciBoZWFkZXJzLiAgQnV0IHRvIGF2b2lkCi0gICAgd2FzdGUsIHdlIGFsbG9jYXRlIG9ubHkgdGhlIGZkL2JrIHBvaW50ZXJzIG9mIGJpbnMsIGFuZCB0aGVuIHVzZQotICAgIHJlcG9zaXRpb25pbmcgdHJpY2tzIHRvIHRyZWF0IHRoZXNlIGFzIHRoZSBmaWVsZHMgb2YgYSBjaHVuay4KLQotICBUcmVlQmlucwotICAgIFRyZWViaW5zIGFyZSBwb2ludGVycyB0byB0aGUgcm9vdHMgb2YgdHJlZXMgaG9sZGluZyBhIHJhbmdlIG9mCi0gICAgc2l6ZXMuIFRoZXJlIGFyZSAyIGVxdWFsbHkgc3BhY2VkIHRyZWViaW5zIGZvciBlYWNoIHBvd2VyIG9mIHR3bwotICAgIGZyb20gVFJFRV9TSElGVCB0byBUUkVFX1NISUZUKzE2LiBUaGUgbGFzdCBiaW4gaG9sZHMgYW55dGhpbmcKLSAgICBsYXJnZXIuCi0KLSAgQmluIG1hcHMKLSAgICBUaGVyZSBpcyBvbmUgYml0IG1hcCBmb3Igc21hbGwgYmlucyAoInNtYWxsbWFwIikgYW5kIG9uZSBmb3IKLSAgICB0cmVlYmlucyAoInRyZWVtYXApLiAgRWFjaCBiaW4gc2V0cyBpdHMgYml0IHdoZW4gbm9uLWVtcHR5LCBhbmQKLSAgICBjbGVhcnMgdGhlIGJpdCB3aGVuIGVtcHR5LiAgQml0IG9wZXJhdGlvbnMgYXJlIHRoZW4gdXNlZCB0byBhdm9pZAotICAgIGJpbi1ieS1iaW4gc2VhcmNoaW5nIC0tIG5lYXJseSBhbGwgInNlYXJjaCIgaXMgZG9uZSB3aXRob3V0IGV2ZXIKLSAgICBsb29raW5nIGF0IGJpbnMgdGhhdCB3b24ndCBiZSBzZWxlY3RlZC4gIFRoZSBiaXQgbWFwcwotICAgIGNvbnNlcnZhdGl2ZWx5IHVzZSAzMiBiaXRzIHBlciBtYXAgd29yZCwgZXZlbiBpZiBvbiA2NGJpdCBzeXN0ZW0uCi0gICAgRm9yIGEgZ29vZCBkZXNjcmlwdGlvbiBvZiBzb21lIG9mIHRoZSBiaXQtYmFzZWQgdGVjaG5pcXVlcyB1c2VkCi0gICAgaGVyZSwgc2VlIEhlbnJ5IFMuIFdhcnJlbiBKcidzIGJvb2sgIkhhY2tlcidzIERlbGlnaHQiIChhbmQKLSAgICBzdXBwbGVtZW50IGF0IGh0dHA6Ly9oYWNrZXJzZGVsaWdodC5vcmcvKS4gTWFueSBvZiB0aGVzZSBhcmUKLSAgICBpbnRlbmRlZCB0byByZWR1Y2UgdGhlIGJyYW5jaGluZXNzIG9mIHBhdGhzIHRocm91Z2ggbWFsbG9jIGV0YywgYXMKLSAgICB3ZWxsIGFzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lbW9yeSBsb2NhdGlvbnMgcmVhZCBvciB3cml0dGVuLgotCi0gIFNlZ21lbnRzCi0gICAgQSBsaXN0IG9mIHNlZ21lbnRzIGhlYWRlZCBieSBhbiBlbWJlZGRlZCBtYWxsb2Nfc2VnbWVudCByZWNvcmQKLSAgICByZXByZXNlbnRpbmcgdGhlIGluaXRpYWwgc3BhY2UuCi0KLSAgQWRkcmVzcyBjaGVjayBzdXBwb3J0Ci0gICAgVGhlIGxlYXN0X2FkZHIgZmllbGQgaXMgdGhlIGxlYXN0IGFkZHJlc3MgZXZlciBvYnRhaW5lZCBmcm9tCi0gICAgTU9SRUNPUkUgb3IgTU1BUC4gQXR0ZW1wdGVkIGZyZWVzIGFuZCByZWFsbG9jcyBvZiBhbnkgYWRkcmVzcyBsZXNzCi0gICAgdGhhbiB0aGlzIGFyZSB0cmFwcGVkICh1bmxlc3MgSU5TRUNVUkUgaXMgZGVmaW5lZCkuCi0KLSAgTWFnaWMgdGFnCi0gICAgQSBjcm9zcy1jaGVjayBmaWVsZCB0aGF0IHNob3VsZCBhbHdheXMgaG9sZCBzYW1lIHZhbHVlIGFzIG1wYXJhbXMubWFnaWMuCi0KLSAgRmxhZ3MKLSAgICBCaXRzIHJlY29yZGluZyB3aGV0aGVyIHRvIHVzZSBNTUFQLCBsb2Nrcywgb3IgY29udGlndW91cyBNT1JFQ09SRQotCi0gIFN0YXRpc3RpY3MKLSAgICBFYWNoIHNwYWNlIGtlZXBzIHRyYWNrIG9mIGN1cnJlbnQgYW5kIG1heGltdW0gc3lzdGVtIG1lbW9yeQotICAgIG9idGFpbmVkIHZpYSBNT1JFQ09SRSBvciBNTUFQLgotCi0gIExvY2tpbmcKLSAgICBJZiBVU0VfTE9DS1MgaXMgZGVmaW5lZCwgdGhlICJtdXRleCIgbG9jayBpcyBhY3F1aXJlZCBhbmQgcmVsZWFzZWQKLSAgICBhcm91bmQgZXZlcnkgcHVibGljIGNhbGwgdXNpbmcgdGhpcyBtc3BhY2UuCi0qLwotCi0vKiBCaW4gdHlwZXMsIHdpZHRocyBhbmQgc2l6ZXMgKi8KLSNkZWZpbmUgTlNNQUxMQklOUyAgICAgICAgKDMyVSkKLSNkZWZpbmUgTlRSRUVCSU5TICAgICAgICAgKDMyVSkKLSNkZWZpbmUgU01BTExCSU5fU0hJRlQgICAgKDNVKQotI2RlZmluZSBTTUFMTEJJTl9XSURUSCAgICAoU0laRV9UX09ORSA8PCBTTUFMTEJJTl9TSElGVCkKLSNkZWZpbmUgVFJFRUJJTl9TSElGVCAgICAgKDhVKQotI2RlZmluZSBNSU5fTEFSR0VfU0laRSAgICAoU0laRV9UX09ORSA8PCBUUkVFQklOX1NISUZUKQotI2RlZmluZSBNQVhfU01BTExfU0laRSAgICAoTUlOX0xBUkdFX1NJWkUgLSBTSVpFX1RfT05FKQotI2RlZmluZSBNQVhfU01BTExfUkVRVUVTVCAoTUFYX1NNQUxMX1NJWkUgLSBDSFVOS19BTElHTl9NQVNLIC0gQ0hVTktfT1ZFUkhFQUQpCi0KLXN0cnVjdCBtYWxsb2Nfc3RhdGUgewotICBiaW5tYXBfdCAgIHNtYWxsbWFwOwotICBiaW5tYXBfdCAgIHRyZWVtYXA7Ci0gIHNpemVfdCAgICAgZHZzaXplOwotICBzaXplX3QgICAgIHRvcHNpemU7Ci0gIGNoYXIqICAgICAgbGVhc3RfYWRkcjsKLSAgbWNodW5rcHRyICBkdjsKLSAgbWNodW5rcHRyICB0b3A7Ci0gIHNpemVfdCAgICAgdHJpbV9jaGVjazsKLSAgc2l6ZV90ICAgICBtYWdpYzsKLSAgbWNodW5rcHRyICBzbWFsbGJpbnNbKE5TTUFMTEJJTlMrMSkqMl07Ci0gIHRiaW5wdHIgICAgdHJlZWJpbnNbTlRSRUVCSU5TXTsKLSAgc2l6ZV90ICAgICBmb290cHJpbnQ7Ci0gIHNpemVfdCAgICAgbWF4X2Zvb3RwcmludDsKLSAgZmxhZ190ICAgICBtZmxhZ3M7Ci0jaWYgVVNFX0xPQ0tTCi0gIE1MT0NLX1QgICAgbXV0ZXg7ICAgICAvKiBsb2NhdGUgbG9jayBhbW9uZyBmaWVsZHMgdGhhdCByYXJlbHkgY2hhbmdlICovCi0jZW5kaWYgLyogVVNFX0xPQ0tTICovCi0gIG1zZWdtZW50ICAgc2VnOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3N0YXRlKiAgICBtc3RhdGU7Ci0KLS8qIC0tLS0tLS0tLS0tLS0gR2xvYmFsIG1hbGxvY19zdGF0ZSBhbmQgbWFsbG9jX3BhcmFtcyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qCi0gIG1hbGxvY19wYXJhbXMgaG9sZHMgZ2xvYmFsIHByb3BlcnRpZXMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGNhbiBiZQotICBkeW5hbWljYWxseSBzZXQgdXNpbmcgbWFsbG9wdC4gVGhlcmUgaXMgYSBzaW5nbGUgaW5zdGFuY2UsIG1wYXJhbXMsCi0gIGluaXRpYWxpemVkIGluIGluaXRfbXBhcmFtcy4KLSovCi0KLXN0cnVjdCBtYWxsb2NfcGFyYW1zIHsKLSAgc2l6ZV90IG1hZ2ljOwotICBzaXplX3QgcGFnZV9zaXplOwotICBzaXplX3QgZ3JhbnVsYXJpdHk7Ci0gIHNpemVfdCBtbWFwX3RocmVzaG9sZDsKLSAgc2l6ZV90IHRyaW1fdGhyZXNob2xkOwotICBmbGFnX3QgZGVmYXVsdF9tZmxhZ3M7Ci19OwotCi1zdGF0aWMgc3RydWN0IG1hbGxvY19wYXJhbXMgbXBhcmFtczsKLQotLyogVGhlIGdsb2JhbCBtYWxsb2Nfc3RhdGUgdXNlZCBmb3IgYWxsIG5vbi0ibXNwYWNlIiBjYWxscyAqLwotc3RhdGljIHN0cnVjdCBtYWxsb2Nfc3RhdGUgX2dtXzsKLSNkZWZpbmUgZ20gICAgICAgICAgICAgICAgICgmX2dtXykKLSNkZWZpbmUgaXNfZ2xvYmFsKE0pICAgICAgICgoTSkgPT0gJl9nbV8pCi0jZGVmaW5lIGlzX2luaXRpYWxpemVkKE0pICAoKE0pLT50b3AgIT0gMCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3lzdGVtIGFsbG9jIHNldHVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogT3BlcmF0aW9ucyBvbiBtZmxhZ3MgKi8KLQotI2RlZmluZSB1c2VfbG9jayhNKSAgICAgICAgICAgKChNKS0+bWZsYWdzICYgICBVU0VfTE9DS19CSVQpCi0jZGVmaW5lIGVuYWJsZV9sb2NrKE0pICAgICAgICAoKE0pLT5tZmxhZ3MgfD0gIFVTRV9MT0NLX0JJVCkKLSNkZWZpbmUgZGlzYWJsZV9sb2NrKE0pICAgICAgICgoTSktPm1mbGFncyAmPSB+VVNFX0xPQ0tfQklUKQotCi0jZGVmaW5lIHVzZV9tbWFwKE0pICAgICAgICAgICAoKE0pLT5tZmxhZ3MgJiAgIFVTRV9NTUFQX0JJVCkKLSNkZWZpbmUgZW5hYmxlX21tYXAoTSkgICAgICAgICgoTSktPm1mbGFncyB8PSAgVVNFX01NQVBfQklUKQotI2RlZmluZSBkaXNhYmxlX21tYXAoTSkgICAgICAgKChNKS0+bWZsYWdzICY9IH5VU0VfTU1BUF9CSVQpCi0KLSNkZWZpbmUgdXNlX25vbmNvbnRpZ3VvdXMoTSkgICgoTSktPm1mbGFncyAmICAgVVNFX05PTkNPTlRJR1VPVVNfQklUKQotI2RlZmluZSBkaXNhYmxlX2NvbnRpZ3VvdXMoTSkgKChNKS0+bWZsYWdzIHw9ICBVU0VfTk9OQ09OVElHVU9VU19CSVQpCi0KLSNkZWZpbmUgc2V0X2xvY2soTSxMKVwKLSAoKE0pLT5tZmxhZ3MgPSAoTCk/XAotICAoKE0pLT5tZmxhZ3MgfCBVU0VfTE9DS19CSVQpIDpcCi0gICgoTSktPm1mbGFncyAmIH5VU0VfTE9DS19CSVQpKQotCi0vKiBwYWdlLWFsaWduIGEgc2l6ZSAqLwotI2RlZmluZSBwYWdlX2FsaWduKFMpXAotICgoKFMpICsgKG1wYXJhbXMucGFnZV9zaXplKSkgJiB+KG1wYXJhbXMucGFnZV9zaXplIC0gU0laRV9UX09ORSkpCi0KLS8qIGdyYW51bGFyaXR5LWFsaWduIGEgc2l6ZSAqLwotI2RlZmluZSBncmFudWxhcml0eV9hbGlnbihTKVwKLSAgKCgoUykgKyAobXBhcmFtcy5ncmFudWxhcml0eSkpICYgfihtcGFyYW1zLmdyYW51bGFyaXR5IC0gU0laRV9UX09ORSkpCi0KLSNkZWZpbmUgaXNfcGFnZV9hbGlnbmVkKFMpXAotICAgKCgoc2l6ZV90KShTKSAmIChtcGFyYW1zLnBhZ2Vfc2l6ZSAtIFNJWkVfVF9PTkUpKSA9PSAwKQotI2RlZmluZSBpc19ncmFudWxhcml0eV9hbGlnbmVkKFMpXAotICAgKCgoc2l6ZV90KShTKSAmIChtcGFyYW1zLmdyYW51bGFyaXR5IC0gU0laRV9UX09ORSkpID09IDApCi0KLS8qICBUcnVlIGlmIHNlZ21lbnQgUyBob2xkcyBhZGRyZXNzIEEgKi8KLSNkZWZpbmUgc2VnbWVudF9ob2xkcyhTLCBBKVwKLSAgKChjaGFyKikoQSkgPj0gUy0+YmFzZSAmJiAoY2hhciopKEEpIDwgUy0+YmFzZSArIFMtPnNpemUpCi0KLS8qIFJldHVybiBzZWdtZW50IGhvbGRpbmcgZ2l2ZW4gYWRkcmVzcyAqLwotc3RhdGljIG1zZWdtZW50cHRyIHNlZ21lbnRfaG9sZGluZyhtc3RhdGUgbSwgY2hhciogYWRkcikgewotICBtc2VnbWVudHB0ciBzcCA9ICZtLT5zZWc7Ci0gIGZvciAoOzspIHsKLSAgICBpZiAoYWRkciA+PSBzcC0+YmFzZSAmJiBhZGRyIDwgc3AtPmJhc2UgKyBzcC0+c2l6ZSkKLSAgICAgIHJldHVybiBzcDsKLSAgICBpZiAoKHNwID0gc3AtPm5leHQpID09IDApCi0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBzZWdtZW50IGNvbnRhaW5zIGEgc2VnbWVudCBsaW5rICovCi1zdGF0aWMgaW50IGhhc19zZWdtZW50X2xpbmsobXN0YXRlIG0sIG1zZWdtZW50cHRyIHNzKSB7Ci0gIG1zZWdtZW50cHRyIHNwID0gJm0tPnNlZzsKLSAgZm9yICg7OykgewotICAgIGlmICgoY2hhciopc3AgPj0gc3MtPmJhc2UgJiYgKGNoYXIqKXNwIDwgc3MtPmJhc2UgKyBzcy0+c2l6ZSkKLSAgICAgIHJldHVybiAxOwotICAgIGlmICgoc3AgPSBzcC0+bmV4dCkgPT0gMCkKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNpZm5kZWYgTU9SRUNPUkVfQ0FOTk9UX1RSSU0KLSNkZWZpbmUgc2hvdWxkX3RyaW0oTSxzKSAgKChzKSA+IChNKS0+dHJpbV9jaGVjaykKLSNlbHNlICAvKiBNT1JFQ09SRV9DQU5OT1RfVFJJTSAqLwotI2RlZmluZSBzaG91bGRfdHJpbShNLHMpICAoMCkKLSNlbmRpZiAvKiBNT1JFQ09SRV9DQU5OT1RfVFJJTSAqLwotCi0vKgotICBUT1BfRk9PVF9TSVpFIGlzIHBhZGRpbmcgYXQgdGhlIGVuZCBvZiBhIHNlZ21lbnQsIGluY2x1ZGluZyBzcGFjZQotICB0aGF0IG1heSBiZSBuZWVkZWQgdG8gcGxhY2Ugc2VnbWVudCByZWNvcmRzIGFuZCBmZW5jZXBvc3RzIHdoZW4gbmV3Ci0gIG5vbmNvbnRpZ3VvdXMgc2VnbWVudHMgYXJlIGFkZGVkLgotKi8KLSNkZWZpbmUgVE9QX0ZPT1RfU0laRVwKLSAgKGFsaWduX29mZnNldChjaHVuazJtZW0oMCkpK3BhZF9yZXF1ZXN0KHNpemVvZihzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQpKStNSU5fQ0hVTktfU0laRSkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBIb29rcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKgotICBQUkVBQ1RJT04gc2hvdWxkIGJlIGRlZmluZWQgdG8gcmV0dXJuIDAgb24gc3VjY2VzcywgYW5kIG5vbnplcm8gb24KLSAgZmFpbHVyZS4gSWYgeW91IGFyZSBub3QgdXNpbmcgbG9ja2luZywgeW91IGNhbiByZWRlZmluZSB0aGVzZSB0byBkbwotICBhbnl0aGluZyB5b3UgbGlrZS4KLSovCi0KLSNpZiBVU0VfTE9DS1MKLQotLyogRW5zdXJlIGxvY2tzIGFyZSBpbml0aWFsaXplZCAqLwotI2RlZmluZSBHTE9CQUxMWV9JTklUSUFMSVpFKCkgKG1wYXJhbXMucGFnZV9zaXplID09IDAgJiYgaW5pdF9tcGFyYW1zKCkpCi0KLSNkZWZpbmUgUFJFQUNUSU9OKE0pICAoKEdMT0JBTExZX0lOSVRJQUxJWkUoKSB8fCB1c2VfbG9jayhNKSk/IEFDUVVJUkVfTE9DSygmKE0pLT5tdXRleCkgOiAwKQotI2RlZmluZSBQT1NUQUNUSU9OKE0pIHsgaWYgKHVzZV9sb2NrKE0pKSBSRUxFQVNFX0xPQ0soJihNKS0+bXV0ZXgpOyB9Ci0jZWxzZSAvKiBVU0VfTE9DS1MgKi8KLQotI2lmbmRlZiBQUkVBQ1RJT04KLSNkZWZpbmUgUFJFQUNUSU9OKE0pICgwKQotI2VuZGlmICAvKiBQUkVBQ1RJT04gKi8KLQotI2lmbmRlZiBQT1NUQUNUSU9OCi0jZGVmaW5lIFBPU1RBQ1RJT04oTSkKLSNlbmRpZiAgLyogUE9TVEFDVElPTiAqLwotCi0jZW5kaWYgLyogVVNFX0xPQ0tTICovCi0KLS8qCi0gIENPUlJVUFRJT05fRVJST1JfQUNUSU9OIGlzIHRyaWdnZXJlZCB1cG9uIGRldGVjdGVkIGJhZCBhZGRyZXNzZXMuCi0gIFVTQUdFX0VSUk9SX0FDVElPTiBpcyB0cmlnZ2VyZWQgb24gZGV0ZWN0ZWQgYmFkIGZyZWVzIGFuZAotICByZWFsbG9jcy4gVGhlIGFyZ3VtZW50IHAgaXMgYW4gYWRkcmVzcyB0aGF0IG1pZ2h0IGhhdmUgdHJpZ2dlcmVkIHRoZQotICBmYXVsdC4gSXQgaXMgaWdub3JlZCBieSB0aGUgdHdvIHByZWRlZmluZWQgYWN0aW9ucywgYnV0IG1pZ2h0IGJlCi0gIHVzZWZ1bCBpbiBjdXN0b20gYWN0aW9ucyB0aGF0IHRyeSB0byBoZWxwIGRpYWdub3NlIGVycm9ycy4KLSovCi0KLSNpZiBQUk9DRUVEX09OX0VSUk9SCi0KLS8qIEEgY291bnQgb2YgdGhlIG51bWJlciBvZiBjb3JydXB0aW9uIGVycm9ycyBjYXVzaW5nIHJlc2V0cyAqLwotaW50IG1hbGxvY19jb3JydXB0aW9uX2Vycm9yX2NvdW50OwotCi0vKiBkZWZhdWx0IGNvcnJ1cHRpb24gYWN0aW9uICovCi1zdGF0aWMgdm9pZCByZXNldF9vbl9lcnJvcihtc3RhdGUgbSk7Ci0KLSNkZWZpbmUgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04obSkgIHJlc2V0X29uX2Vycm9yKG0pCi0jZGVmaW5lIFVTQUdFX0VSUk9SX0FDVElPTihtLCBwKQotCi0jZWxzZSAvKiBQUk9DRUVEX09OX0VSUk9SICovCi0KLSNpZm5kZWYgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04KLSNkZWZpbmUgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04obSkgQUJPUlQKLSNlbmRpZiAvKiBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTiAqLwotCi0jaWZuZGVmIFVTQUdFX0VSUk9SX0FDVElPTgotI2RlZmluZSBVU0FHRV9FUlJPUl9BQ1RJT04obSxwKSBBQk9SVAotI2VuZGlmIC8qIFVTQUdFX0VSUk9SX0FDVElPTiAqLwotCi0jZW5kaWYgLyogUFJPQ0VFRF9PTl9FUlJPUiAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWJ1Z2dpbmcgc2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgISBERUJVRwotCi0jZGVmaW5lIGNoZWNrX2ZyZWVfY2h1bmsoTSxQKQotI2RlZmluZSBjaGVja19pbnVzZV9jaHVuayhNLFApCi0jZGVmaW5lIGNoZWNrX21hbGxvY2VkX2NodW5rKE0sUCxOKQotI2RlZmluZSBjaGVja19tbWFwcGVkX2NodW5rKE0sUCkKLSNkZWZpbmUgY2hlY2tfbWFsbG9jX3N0YXRlKE0pCi0jZGVmaW5lIGNoZWNrX3RvcF9jaHVuayhNLFApCi0KLSNlbHNlIC8qIERFQlVHICovCi0jZGVmaW5lIGNoZWNrX2ZyZWVfY2h1bmsoTSxQKSAgICAgICBkb19jaGVja19mcmVlX2NodW5rKE0sUCkKLSNkZWZpbmUgY2hlY2tfaW51c2VfY2h1bmsoTSxQKSAgICAgIGRvX2NoZWNrX2ludXNlX2NodW5rKE0sUCkKLSNkZWZpbmUgY2hlY2tfdG9wX2NodW5rKE0sUCkgICAgICAgIGRvX2NoZWNrX3RvcF9jaHVuayhNLFApCi0jZGVmaW5lIGNoZWNrX21hbGxvY2VkX2NodW5rKE0sUCxOKSBkb19jaGVja19tYWxsb2NlZF9jaHVuayhNLFAsTikKLSNkZWZpbmUgY2hlY2tfbW1hcHBlZF9jaHVuayhNLFApICAgIGRvX2NoZWNrX21tYXBwZWRfY2h1bmsoTSxQKQotI2RlZmluZSBjaGVja19tYWxsb2Nfc3RhdGUoTSkgICAgICAgZG9fY2hlY2tfbWFsbG9jX3N0YXRlKE0pCi0KLXN0YXRpYyB2b2lkICAgZG9fY2hlY2tfYW55X2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7Ci1zdGF0aWMgdm9pZCAgIGRvX2NoZWNrX3RvcF9jaHVuayhtc3RhdGUgbSwgbWNodW5rcHRyIHApOwotc3RhdGljIHZvaWQgICBkb19jaGVja19tbWFwcGVkX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7Ci1zdGF0aWMgdm9pZCAgIGRvX2NoZWNrX2ludXNlX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7Ci1zdGF0aWMgdm9pZCAgIGRvX2NoZWNrX2ZyZWVfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKTsKLXN0YXRpYyB2b2lkICAgZG9fY2hlY2tfbWFsbG9jZWRfY2h1bmsobXN0YXRlIG0sIHZvaWQqIG1lbSwgc2l6ZV90IHMpOwotc3RhdGljIHZvaWQgICBkb19jaGVja190cmVlKG1zdGF0ZSBtLCB0Y2h1bmtwdHIgdCk7Ci1zdGF0aWMgdm9pZCAgIGRvX2NoZWNrX3RyZWViaW4obXN0YXRlIG0sIGJpbmRleF90IGkpOwotc3RhdGljIHZvaWQgICBkb19jaGVja19zbWFsbGJpbihtc3RhdGUgbSwgYmluZGV4X3QgaSk7Ci1zdGF0aWMgdm9pZCAgIGRvX2NoZWNrX21hbGxvY19zdGF0ZShtc3RhdGUgbSk7Ci1zdGF0aWMgaW50ICAgIGJpbl9maW5kKG1zdGF0ZSBtLCBtY2h1bmtwdHIgeCk7Ci1zdGF0aWMgc2l6ZV90IHRyYXZlcnNlX2FuZF9jaGVjayhtc3RhdGUgbSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmRleGluZyBCaW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2RlZmluZSBpc19zbWFsbChzKSAgICAgICAgICgoKHMpID4+IFNNQUxMQklOX1NISUZUKSA8IE5TTUFMTEJJTlMpCi0jZGVmaW5lIHNtYWxsX2luZGV4KHMpICAgICAgKChzKSAgPj4gU01BTExCSU5fU0hJRlQpCi0jZGVmaW5lIHNtYWxsX2luZGV4MnNpemUoaSkgKChpKSAgPDwgU01BTExCSU5fU0hJRlQpCi0jZGVmaW5lIE1JTl9TTUFMTF9JTkRFWCAgICAgKHNtYWxsX2luZGV4KE1JTl9DSFVOS19TSVpFKSkKLQotLyogYWRkcmVzc2luZyBieSBpbmRleC4gU2VlIGFib3ZlIGFib3V0IHNtYWxsYmluIHJlcG9zaXRpb25pbmcgKi8KLSNkZWZpbmUgc21hbGxiaW5fYXQoTSwgaSkgICAoKHNiaW5wdHIpKChjaGFyKikmKChNKS0+c21hbGxiaW5zWyhpKTw8MV0pKSkKLSNkZWZpbmUgdHJlZWJpbl9hdChNLGkpICAgICAoJigoTSktPnRyZWViaW5zW2ldKSkKLQotLyogYXNzaWduIHRyZWUgaW5kZXggZm9yIHNpemUgUyB0byB2YXJpYWJsZSBJICovCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChpMzg2KQotI2RlZmluZSBjb21wdXRlX3RyZWVfaW5kZXgoUywgSSlcCi17XAotICBzaXplX3QgWCA9IFMgPj4gVFJFRUJJTl9TSElGVDtcCi0gIGlmIChYID09IDApXAotICAgIEkgPSAwO1wKLSAgZWxzZSBpZiAoWCA+IDB4RkZGRilcCi0gICAgSSA9IE5UUkVFQklOUy0xO1wKLSAgZWxzZSB7XAotICAgIHVuc2lnbmVkIGludCBLO1wKLSAgICBfX2FzbV9fKCJic3JsICUxLCUwXG5cdCIgOiAiPXIiIChLKSA6ICJybSIgIChYKSk7XAotICAgIEkgPSAgKGJpbmRleF90KSgoSyA8PCAxKSArICgoUyA+PiAoSyArIChUUkVFQklOX1NISUZULTEpKSAmIDEpKSk7XAotICB9XAotfQotI2Vsc2UgLyogR05VQyAqLwotI2RlZmluZSBjb21wdXRlX3RyZWVfaW5kZXgoUywgSSlcCi17XAotICBzaXplX3QgWCA9IFMgPj4gVFJFRUJJTl9TSElGVDtcCi0gIGlmIChYID09IDApXAotICAgIEkgPSAwO1wKLSAgZWxzZSBpZiAoWCA+IDB4RkZGRilcCi0gICAgSSA9IE5UUkVFQklOUy0xO1wKLSAgZWxzZSB7XAotICAgIHVuc2lnbmVkIGludCBZID0gKHVuc2lnbmVkIGludClYO1wKLSAgICB1bnNpZ25lZCBpbnQgTiA9ICgoWSAtIDB4MTAwKSA+PiAxNikgJiA4O1wKLSAgICB1bnNpZ25lZCBpbnQgSyA9ICgoKFkgPDw9IE4pIC0gMHgxMDAwKSA+PiAxNikgJiA0O1wKLSAgICBOICs9IEs7XAotICAgIE4gKz0gSyA9ICgoKFkgPDw9IEspIC0gMHg0MDAwKSA+PiAxNikgJiAyO1wKLSAgICBLID0gMTQgLSBOICsgKChZIDw8PSBLKSA+PiAxNSk7XAotICAgIEkgPSAoSyA8PCAxKSArICgoUyA+PiAoSyArIChUUkVFQklOX1NISUZULTEpKSAmIDEpKTtcCi0gIH1cCi19Ci0jZW5kaWYgLyogR05VQyAqLwotCi0vKiBCaXQgcmVwcmVzZW50aW5nIG1heGltdW0gcmVzb2x2ZWQgc2l6ZSBpbiBhIHRyZWViaW4gYXQgaSAqLwotI2RlZmluZSBiaXRfZm9yX3RyZWVfaW5kZXgoaSkgXAotICAgKGkgPT0gTlRSRUVCSU5TLTEpPyAoU0laRV9UX0JJVFNJWkUtMSkgOiAoKChpKSA+PiAxKSArIFRSRUVCSU5fU0hJRlQgLSAyKQotCi0vKiBTaGlmdCBwbGFjaW5nIG1heGltdW0gcmVzb2x2ZWQgYml0IGluIGEgdHJlZWJpbiBhdCBpIGFzIHNpZ24gYml0ICovCi0jZGVmaW5lIGxlZnRzaGlmdF9mb3JfdHJlZV9pbmRleChpKSBcCi0gICAoKGkgPT0gTlRSRUVCSU5TLTEpPyAwIDogXAotICAgICgoU0laRV9UX0JJVFNJWkUtU0laRV9UX09ORSkgLSAoKChpKSA+PiAxKSArIFRSRUVCSU5fU0hJRlQgLSAyKSkpCi0KLS8qIFRoZSBzaXplIG9mIHRoZSBzbWFsbGVzdCBjaHVuayBoZWxkIGluIGJpbiB3aXRoIGluZGV4IGkgKi8KLSNkZWZpbmUgbWluc2l6ZV9mb3JfdHJlZV9pbmRleChpKSBcCi0gICAoKFNJWkVfVF9PTkUgPDwgKCgoaSkgPj4gMSkgKyBUUkVFQklOX1NISUZUKSkgfCAgXAotICAgKCgoc2l6ZV90KSgoaSkgJiBTSVpFX1RfT05FKSkgPDwgKCgoaSkgPj4gMSkgKyBUUkVFQklOX1NISUZUIC0gMSkpKQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zIG9uIGJpbiBtYXBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGJpdCBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGluZGV4ICovCi0jZGVmaW5lIGlkeDJiaXQoaSkgICAgICAgICAgICAgICgoYmlubWFwX3QpKDEpIDw8IChpKSkKLQotLyogTWFyay9DbGVhciBiaXRzIHdpdGggZ2l2ZW4gaW5kZXggKi8KLSNkZWZpbmUgbWFya19zbWFsbG1hcChNLGkpICAgICAgKChNKS0+c21hbGxtYXAgfD0gIGlkeDJiaXQoaSkpCi0jZGVmaW5lIGNsZWFyX3NtYWxsbWFwKE0saSkgICAgICgoTSktPnNtYWxsbWFwICY9IH5pZHgyYml0KGkpKQotI2RlZmluZSBzbWFsbG1hcF9pc19tYXJrZWQoTSxpKSAoKE0pLT5zbWFsbG1hcCAmICAgaWR4MmJpdChpKSkKLQotI2RlZmluZSBtYXJrX3RyZWVtYXAoTSxpKSAgICAgICAoKE0pLT50cmVlbWFwICB8PSAgaWR4MmJpdChpKSkKLSNkZWZpbmUgY2xlYXJfdHJlZW1hcChNLGkpICAgICAgKChNKS0+dHJlZW1hcCAgJj0gfmlkeDJiaXQoaSkpCi0jZGVmaW5lIHRyZWVtYXBfaXNfbWFya2VkKE0saSkgICgoTSktPnRyZWVtYXAgICYgICBpZHgyYml0KGkpKQotCi0vKiBpbmRleCBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGJpdCAqLwotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChpMzg2KQotI2RlZmluZSBjb21wdXRlX2JpdDJpZHgoWCwgSSlcCi17XAotICB1bnNpZ25lZCBpbnQgSjtcCi0gIF9fYXNtX18oImJzZmwgJTEsJTBcblx0IiA6ICI9ciIgKEopIDogInJtIiAoWCkpO1wKLSAgSSA9IChiaW5kZXhfdClKO1wKLX0KLQotI2Vsc2UgLyogR05VQyAqLwotI2lmICBVU0VfQlVJTFRJTl9GRlMKLSNkZWZpbmUgY29tcHV0ZV9iaXQyaWR4KFgsIEkpIEkgPSBmZnMoWCktMQotCi0jZWxzZSAvKiBVU0VfQlVJTFRJTl9GRlMgKi8KLSNkZWZpbmUgY29tcHV0ZV9iaXQyaWR4KFgsIEkpXAote1wKLSAgdW5zaWduZWQgaW50IFkgPSBYIC0gMTtcCi0gIHVuc2lnbmVkIGludCBLID0gWSA+PiAoMTYtNCkgJiAxNjtcCi0gIHVuc2lnbmVkIGludCBOID0gSzsgICAgICAgIFkgPj49IEs7XAotICBOICs9IEsgPSBZID4+ICg4LTMpICYgIDg7ICBZID4+PSBLO1wKLSAgTiArPSBLID0gWSA+PiAoNC0yKSAmICA0OyAgWSA+Pj0gSztcCi0gIE4gKz0gSyA9IFkgPj4gKDItMSkgJiAgMjsgIFkgPj49IEs7XAotICBOICs9IEsgPSBZID4+ICgxLTApICYgIDE7ICBZID4+PSBLO1wKLSAgSSA9IChiaW5kZXhfdCkoTiArIFkpO1wKLX0KLSNlbmRpZiAvKiBVU0VfQlVJTFRJTl9GRlMgKi8KLSNlbmRpZiAvKiBHTlVDICovCi0KLS8qIGlzb2xhdGUgdGhlIGxlYXN0IHNldCBiaXQgb2YgYSBiaXRtYXAgKi8KLSNkZWZpbmUgbGVhc3RfYml0KHgpICAgICAgICAgKCh4KSAmIC0oeCkpCi0KLS8qIG1hc2sgd2l0aCBhbGwgYml0cyB0byBsZWZ0IG9mIGxlYXN0IGJpdCBvZiB4IG9uICovCi0jZGVmaW5lIGxlZnRfYml0cyh4KSAgICAgICAgICgoeDw8MSkgfCAtKHg8PDEpKQotCi0vKiBtYXNrIHdpdGggYWxsIGJpdHMgdG8gbGVmdCBvZiBvciBlcXVhbCB0byBsZWFzdCBiaXQgb2YgeCBvbiAqLwotI2RlZmluZSBzYW1lX29yX2xlZnRfYml0cyh4KSAoKHgpIHwgLSh4KSkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSdW50aW1lIENoZWNrIFN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKgotICBGb3Igc2VjdXJpdHksIHRoZSBtYWluIGludmFyaWFudCBpcyB0aGF0IG1hbGxvYy9mcmVlL2V0YyBuZXZlcgotICB3cml0ZXMgdG8gYSBzdGF0aWMgYWRkcmVzcyBvdGhlciB0aGFuIG1hbGxvY19zdGF0ZSwgdW5sZXNzIHN0YXRpYwotICBtYWxsb2Nfc3RhdGUgaXRzZWxmIGhhcyBiZWVuIGNvcnJ1cHRlZCwgd2hpY2ggY2Fubm90IG9jY3VyIHZpYQotICBtYWxsb2MgKGJlY2F1c2Ugb2YgdGhlc2UgY2hlY2tzKS4gSW4gZXNzZW5jZSB0aGlzIG1lYW5zIHRoYXQgd2UKLSAgYmVsaWV2ZSBhbGwgcG9pbnRlcnMsIHNpemVzLCBtYXBzIGV0YyBoZWxkIGluIG1hbGxvY19zdGF0ZSwgYnV0Ci0gIGNoZWNrIGFsbCBvZiB0aG9zZSBsaW5rZWQgb3Igb2Zmc2V0dGVkIGZyb20gb3RoZXIgZW1iZWRkZWQgZGF0YQotICBzdHJ1Y3R1cmVzLiAgVGhlc2UgY2hlY2tzIGFyZSBpbnRlcnNwZXJzZWQgd2l0aCBtYWluIGNvZGUgaW4gYSB3YXkKLSAgdGhhdCB0ZW5kcyB0byBtaW5pbWl6ZSB0aGVpciBydW4tdGltZSBjb3N0LgotCi0gIFdoZW4gRk9PVEVSUyBpcyBkZWZpbmVkLCBpbiBhZGRpdGlvbiB0byByYW5nZSBjaGVja2luZywgd2UgYWxzbwotICB2ZXJpZnkgZm9vdGVyIGZpZWxkcyBvZiBpbnVzZSBjaHVua3MsIHdoaWNoIGNhbiBiZSB1c2VkIGd1YXJhbnRlZQotICB0aGF0IHRoZSBtc3RhdGUgY29udHJvbGxpbmcgbWFsbG9jL2ZyZWUgaXMgaW50YWN0LiAgVGhpcyBpcyBhCi0gIHN0cmVhbWxpbmVkIHZlcnNpb24gb2YgdGhlIGFwcHJvYWNoIGRlc2NyaWJlZCBieSBXaWxsaWFtIFJvYmVydHNvbgotICBldCBhbCBpbiAiUnVuLXRpbWUgRGV0ZWN0aW9uIG9mIEhlYXAtYmFzZWQgT3ZlcmZsb3dzIiBMSVNBJzAzCi0gIGh0dHA6Ly93d3cudXNlbml4Lm9yZy9ldmVudHMvbGlzYTAzL3RlY2gvcm9iZXJ0c29uLmh0bWwgVGhlIGZvb3RlcgotICBvZiBhbiBpbnVzZSBjaHVuayBob2xkcyB0aGUgeG9yIG9mIGl0cyBtc3RhdGUgYW5kIGEgcmFuZG9tIHNlZWQsCi0gIHRoYXQgaXMgY2hlY2tlZCB1cG9uIGNhbGxzIHRvIGZyZWUoKSBhbmQgcmVhbGxvYygpLiAgVGhpcyBpcwotICAocHJvYmFibGlzdGljYWxseSkgdW5ndWVzc2FibGUgZnJvbSBvdXRzaWRlIHRoZSBwcm9ncmFtLCBidXQgY2FuIGJlCi0gIGNvbXB1dGVkIGJ5IGFueSBjb2RlIHN1Y2Nlc3NmdWxseSBtYWxsb2MnaW5nIGFueSBjaHVuaywgc28gZG9lcyBub3QKLSAgaXRzZWxmIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGNvZGUgdGhhdCBoYXMgYWxyZWFkeSBicm9rZW4KLSAgc2VjdXJpdHkgdGhyb3VnaCBzb21lIG90aGVyIG1lYW5zLiAgVW5saWtlIFJvYmVydHNvbiBldCBhbCwgd2UKLSAgYWx3YXlzIGR5bmFtaWNhbGx5IGNoZWNrIGFkZHJlc3NlcyBvZiBhbGwgb2Zmc2V0IGNodW5rcyAocHJldmlvdXMsCi0gIG5leHQsIGV0YykuIFRoaXMgdHVybnMgb3V0IHRvIGJlIGNoZWFwZXIgdGhhbiByZWx5aW5nIG9uIGhhc2hlcy4KLSovCi0KLSNpZiAhSU5TRUNVUkUKLS8qIENoZWNrIGlmIGFkZHJlc3MgYSBpcyBhdCBsZWFzdCBhcyBoaWdoIGFzIGFueSBmcm9tIE1PUkVDT1JFIG9yIE1NQVAgKi8KLSNkZWZpbmUgb2tfYWRkcmVzcyhNLCBhKSAoKGNoYXIqKShhKSA+PSAoTSktPmxlYXN0X2FkZHIpCi0vKiBDaGVjayBpZiBhZGRyZXNzIG9mIG5leHQgY2h1bmsgbiBpcyBoaWdoZXIgdGhhbiBiYXNlIGNodW5rIHAgKi8KLSNkZWZpbmUgb2tfbmV4dChwLCBuKSAgICAoKGNoYXIqKShwKSA8IChjaGFyKikobikpCi0vKiBDaGVjayBpZiBwIGhhcyBpdHMgY2ludXNlIGJpdCBvbiAqLwotI2RlZmluZSBva19jaW51c2UocCkgICAgIGNpbnVzZShwKQotLyogQ2hlY2sgaWYgcCBoYXMgaXRzIHBpbnVzZSBiaXQgb24gKi8KLSNkZWZpbmUgb2tfcGludXNlKHApICAgICBwaW51c2UocCkKLQotI2Vsc2UgLyogIUlOU0VDVVJFICovCi0jZGVmaW5lIG9rX2FkZHJlc3MoTSwgYSkgKDEpCi0jZGVmaW5lIG9rX25leHQoYiwgbikgICAgKDEpCi0jZGVmaW5lIG9rX2NpbnVzZShwKSAgICAgKDEpCi0jZGVmaW5lIG9rX3BpbnVzZShwKSAgICAgKDEpCi0jZW5kaWYgLyogIUlOU0VDVVJFICovCi0KLSNpZiAoRk9PVEVSUyAmJiAhSU5TRUNVUkUpCi0vKiBDaGVjayBpZiAoYWxsZWdlZCkgbXN0YXRlIG0gaGFzIGV4cGVjdGVkIG1hZ2ljIGZpZWxkICovCi0jZGVmaW5lIG9rX21hZ2ljKE0pICAgICAgKChNKS0+bWFnaWMgPT0gbXBhcmFtcy5tYWdpYykKLSNlbHNlICAvKiAoRk9PVEVSUyAmJiAhSU5TRUNVUkUpICovCi0jZGVmaW5lIG9rX21hZ2ljKE0pICAgICAgKDEpCi0jZW5kaWYgLyogKEZPT1RFUlMgJiYgIUlOU0VDVVJFKSAqLwotCi0KLS8qIEluIGdjYywgdXNlIF9fYnVpbHRpbl9leHBlY3QgdG8gbWluaW1pemUgaW1wYWN0IG9mIGNoZWNrcyAqLwotI2lmICFJTlNFQ1VSRQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDMKLSNkZWZpbmUgUlRDSEVDSyhlKSAgX19idWlsdGluX2V4cGVjdChlLCAxKQotI2Vsc2UgLyogR05VQyAqLwotI2RlZmluZSBSVENIRUNLKGUpICAoZSkKLSNlbmRpZiAvKiBHTlVDICovCi0jZWxzZSAvKiAhSU5TRUNVUkUgKi8KLSNkZWZpbmUgUlRDSEVDSyhlKSAgKDEpCi0jZW5kaWYgLyogIUlOU0VDVVJFICovCi0KLS8qIG1hY3JvcyB0byBzZXQgdXAgaW51c2UgY2h1bmtzIHdpdGggb3Igd2l0aG91dCBmb290ZXJzICovCi0KLSNpZiAhRk9PVEVSUwotCi0jZGVmaW5lIG1hcmtfaW51c2VfZm9vdChNLHAscykKLQotLyogU2V0IGNpbnVzZSBiaXQgYW5kIHBpbnVzZSBiaXQgb2YgbmV4dCBjaHVuayAqLwotI2RlZmluZSBzZXRfaW51c2UoTSxwLHMpXAotICAoKHApLT5oZWFkID0gKCgocCktPmhlYWQgJiBQSU5VU0VfQklUKXxzfENJTlVTRV9CSVQpLFwKLSAgKChtY2h1bmtwdHIpKCgoY2hhciopKHApKSArIChzKSkpLT5oZWFkIHw9IFBJTlVTRV9CSVQpCi0KLS8qIFNldCBjaW51c2UgYW5kIHBpbnVzZSBvZiB0aGlzIGNodW5rIGFuZCBwaW51c2Ugb2YgbmV4dCBjaHVuayAqLwotI2RlZmluZSBzZXRfaW51c2VfYW5kX3BpbnVzZShNLHAscylcCi0gICgocCktPmhlYWQgPSAoc3xQSU5VU0VfQklUfENJTlVTRV9CSVQpLFwKLSAgKChtY2h1bmtwdHIpKCgoY2hhciopKHApKSArIChzKSkpLT5oZWFkIHw9IFBJTlVTRV9CSVQpCi0KLS8qIFNldCBzaXplLCBjaW51c2UgYW5kIHBpbnVzZSBiaXQgb2YgdGhpcyBjaHVuayAqLwotI2RlZmluZSBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKE0sIHAsIHMpXAotICAoKHApLT5oZWFkID0gKHN8UElOVVNFX0JJVHxDSU5VU0VfQklUKSkKLQotI2Vsc2UgLyogRk9PVEVSUyAqLwotCi0vKiBTZXQgZm9vdCBvZiBpbnVzZSBjaHVuayB0byBiZSB4b3Igb2YgbXN0YXRlIGFuZCBzZWVkICovCi0jZGVmaW5lIG1hcmtfaW51c2VfZm9vdChNLHAscylcCi0gICgoKG1jaHVua3B0cikoKGNoYXIqKShwKSArIChzKSkpLT5wcmV2X2Zvb3QgPSAoKHNpemVfdCkoTSkgXiBtcGFyYW1zLm1hZ2ljKSkKLQotI2RlZmluZSBnZXRfbXN0YXRlX2ZvcihwKVwKLSAgKChtc3RhdGUpKCgobWNodW5rcHRyKSgoY2hhciopKHApICtcCi0gICAgKGNodW5rc2l6ZShwKSkpKS0+cHJldl9mb290IF4gbXBhcmFtcy5tYWdpYykpCi0KLSNkZWZpbmUgc2V0X2ludXNlKE0scCxzKVwKLSAgKChwKS0+aGVhZCA9ICgoKHApLT5oZWFkICYgUElOVVNFX0JJVCl8c3xDSU5VU0VfQklUKSxcCi0gICgoKG1jaHVua3B0cikoKChjaGFyKikocCkpICsgKHMpKSktPmhlYWQgfD0gUElOVVNFX0JJVCksIFwKLSAgbWFya19pbnVzZV9mb290KE0scCxzKSkKLQotI2RlZmluZSBzZXRfaW51c2VfYW5kX3BpbnVzZShNLHAscylcCi0gICgocCktPmhlYWQgPSAoc3xQSU5VU0VfQklUfENJTlVTRV9CSVQpLFwKLSAgKCgobWNodW5rcHRyKSgoKGNoYXIqKShwKSkgKyAocykpKS0+aGVhZCB8PSBQSU5VU0VfQklUKSxcCi0gbWFya19pbnVzZV9mb290KE0scCxzKSkKLQotI2RlZmluZSBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKE0sIHAsIHMpXAotICAoKHApLT5oZWFkID0gKHN8UElOVVNFX0JJVHxDSU5VU0VfQklUKSxcCi0gIG1hcmtfaW51c2VfZm9vdChNLCBwLCBzKSkKLQotI2VuZGlmIC8qICFGT09URVJTICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2V0dGluZyBtcGFyYW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIEluaXRpYWxpemUgbXBhcmFtcyAqLwotc3RhdGljIGludCBpbml0X21wYXJhbXModm9pZCkgewotICBpZiAobXBhcmFtcy5wYWdlX3NpemUgPT0gMCkgewotICAgIHNpemVfdCBzOwotCi0gICAgbXBhcmFtcy5tbWFwX3RocmVzaG9sZCA9IERFRkFVTFRfTU1BUF9USFJFU0hPTEQ7Ci0gICAgbXBhcmFtcy50cmltX3RocmVzaG9sZCA9IERFRkFVTFRfVFJJTV9USFJFU0hPTEQ7Ci0jaWYgTU9SRUNPUkVfQ09OVElHVU9VUwotICAgIG1wYXJhbXMuZGVmYXVsdF9tZmxhZ3MgPSBVU0VfTE9DS19CSVR8VVNFX01NQVBfQklUOwotI2Vsc2UgIC8qIE1PUkVDT1JFX0NPTlRJR1VPVVMgKi8KLSAgICBtcGFyYW1zLmRlZmF1bHRfbWZsYWdzID0gVVNFX0xPQ0tfQklUfFVTRV9NTUFQX0JJVHxVU0VfTk9OQ09OVElHVU9VU19CSVQ7Ci0jZW5kaWYgLyogTU9SRUNPUkVfQ09OVElHVU9VUyAqLwotCi0jaWYgKEZPT1RFUlMgJiYgIUlOU0VDVVJFKQotICAgIHsKLSNpZiBVU0VfREVWX1JBTkRPTQotICAgICAgaW50IGZkOwotICAgICAgdW5zaWduZWQgY2hhciBidWZbc2l6ZW9mKHNpemVfdCldOwotICAgICAgLyogVHJ5IHRvIHVzZSAvZGV2L3VyYW5kb20sIGVsc2UgZmFsbCBiYWNrIG9uIHVzaW5nIHRpbWUgKi8KLSAgICAgIGlmICgoZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSkpID49IDAgJiYKLSAgICAgICAgICByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSA9PSBzaXplb2YoYnVmKSkgewotICAgICAgICBzID0gKigoc2l6ZV90ICopIGJ1Zik7Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBVU0VfREVWX1JBTkRPTSAqLwotICAgICAgICBzID0gKHNpemVfdCkodGltZSgwKSBeIChzaXplX3QpMHg1NTU1NTU1NVUpOwotCi0gICAgICBzIHw9IChzaXplX3QpOFU7ICAgIC8qIGVuc3VyZSBub256ZXJvICovCi0gICAgICBzICY9IH4oc2l6ZV90KTdVOyAgIC8qIGltcHJvdmUgY2hhbmNlcyBvZiBmYXVsdCBmb3IgYmFkIHZhbHVlcyAqLwotCi0gICAgfQotI2Vsc2UgLyogKEZPT1RFUlMgJiYgIUlOU0VDVVJFKSAqLwotICAgIHMgPSAoc2l6ZV90KTB4NTg1ODU4NThVOwotI2VuZGlmIC8qIChGT09URVJTICYmICFJTlNFQ1VSRSkgKi8KLSAgICBBQ1FVSVJFX01BR0lDX0lOSVRfTE9DSygpOwotICAgIGlmIChtcGFyYW1zLm1hZ2ljID09IDApIHsKLSAgICAgIG1wYXJhbXMubWFnaWMgPSBzOwotICAgICAgLyogU2V0IHVwIGxvY2sgZm9yIG1haW4gbWFsbG9jIGFyZWEgKi8KLSAgICAgIElOSVRJQUxfTE9DSygmZ20tPm11dGV4KTsKLSAgICAgIGdtLT5tZmxhZ3MgPSBtcGFyYW1zLmRlZmF1bHRfbWZsYWdzOwotICAgIH0KLSAgICBSRUxFQVNFX01BR0lDX0lOSVRfTE9DSygpOwotCi0jaWZuZGVmIFdJTjMyCi0gICAgbXBhcmFtcy5wYWdlX3NpemUgPSBtYWxsb2NfZ2V0cGFnZXNpemU7Ci0gICAgbXBhcmFtcy5ncmFudWxhcml0eSA9ICgoREVGQVVMVF9HUkFOVUxBUklUWSAhPSAwKT8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfR1JBTlVMQVJJVFkgOiBtcGFyYW1zLnBhZ2Vfc2l6ZSk7Ci0jZWxzZSAvKiBXSU4zMiAqLwotICAgIHsKLSAgICAgIFNZU1RFTV9JTkZPIHN5c3RlbV9pbmZvOwotICAgICAgR2V0U3lzdGVtSW5mbygmc3lzdGVtX2luZm8pOwotICAgICAgbXBhcmFtcy5wYWdlX3NpemUgPSBzeXN0ZW1faW5mby5kd1BhZ2VTaXplOwotICAgICAgbXBhcmFtcy5ncmFudWxhcml0eSA9IHN5c3RlbV9pbmZvLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5OwotICAgIH0KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0gICAgLyogU2FuaXR5LWNoZWNrIGNvbmZpZ3VyYXRpb246Ci0gICAgICAgc2l6ZV90IG11c3QgYmUgdW5zaWduZWQgYW5kIGFzIHdpZGUgYXMgcG9pbnRlciB0eXBlLgotICAgICAgIGludHMgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVzLgotICAgICAgIGFsaWdubWVudCBtdXN0IGJlIGF0IGxlYXN0IDguCi0gICAgICAgQWxpZ25tZW50LCBtaW4gY2h1bmsgc2l6ZSwgYW5kIHBhZ2Ugc2l6ZSBtdXN0IGFsbCBiZSBwb3dlcnMgb2YgMi4KLSAgICAqLwotICAgIGlmICgoc2l6ZW9mKHNpemVfdCkgIT0gc2l6ZW9mKGNoYXIqKSkgfHwKLSAgICAgICAgKE1BWF9TSVpFX1QgPCBNSU5fQ0hVTktfU0laRSkgIHx8Ci0gICAgICAgIChzaXplb2YoaW50KSA8IDQpICB8fAotICAgICAgICAoTUFMTE9DX0FMSUdOTUVOVCA8IChzaXplX3QpOFUpIHx8Ci0gICAgICAgICgoTUFMTE9DX0FMSUdOTUVOVCAgICAmIChNQUxMT0NfQUxJR05NRU5ULVNJWkVfVF9PTkUpKSAgICAhPSAwKSB8fAotICAgICAgICAoKE1DSFVOS19TSVpFICAgICAgICAgJiAoTUNIVU5LX1NJWkUtU0laRV9UX09ORSkpICAgICAgICAgIT0gMCkgfHwKLSAgICAgICAgKChtcGFyYW1zLmdyYW51bGFyaXR5ICYgKG1wYXJhbXMuZ3JhbnVsYXJpdHktU0laRV9UX09ORSkpICE9IDApIHx8Ci0gICAgICAgICgobXBhcmFtcy5wYWdlX3NpemUgICAmIChtcGFyYW1zLnBhZ2Vfc2l6ZS1TSVpFX1RfT05FKSkgICAhPSAwKSkKLSAgICAgIEFCT1JUOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBzdXBwb3J0IGZvciBtYWxsb3B0ICovCi1zdGF0aWMgaW50IGNoYW5nZV9tcGFyYW0oaW50IHBhcmFtX251bWJlciwgaW50IHZhbHVlKSB7Ci0gIHNpemVfdCB2YWwgPSAoc2l6ZV90KXZhbHVlOwotICBpbml0X21wYXJhbXMoKTsKLSAgc3dpdGNoKHBhcmFtX251bWJlcikgewotICBjYXNlIE1fVFJJTV9USFJFU0hPTEQ6Ci0gICAgbXBhcmFtcy50cmltX3RocmVzaG9sZCA9IHZhbDsKLSAgICByZXR1cm4gMTsKLSAgY2FzZSBNX0dSQU5VTEFSSVRZOgotICAgIGlmICh2YWwgPj0gbXBhcmFtcy5wYWdlX3NpemUgJiYgKCh2YWwgJiAodmFsLTEpKSA9PSAwKSkgewotICAgICAgbXBhcmFtcy5ncmFudWxhcml0eSA9IHZhbDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgY2FzZSBNX01NQVBfVEhSRVNIT0xEOgotICAgIG1wYXJhbXMubW1hcF90aHJlc2hvbGQgPSB2YWw7Ci0gICAgcmV0dXJuIDE7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotI2lmIERFQlVHCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlYnVnZ2luZyBTdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGFueSBjaHVuaywgd2hldGhlciBmcmVlLCBpbnVzZSwgbW1hcHBlZCBldGMgICovCi1zdGF0aWMgdm9pZCBkb19jaGVja19hbnlfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7Ci0gIGFzc2VydCgoaXNfYWxpZ25lZChjaHVuazJtZW0ocCkpKSB8fCAocC0+aGVhZCA9PSBGRU5DRVBPU1RfSEVBRCkpOwotICBhc3NlcnQob2tfYWRkcmVzcyhtLCBwKSk7Ci19Ci0KLS8qIENoZWNrIHByb3BlcnRpZXMgb2YgdG9wIGNodW5rICovCi1zdGF0aWMgdm9pZCBkb19jaGVja190b3BfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7Ci0gIG1zZWdtZW50cHRyIHNwID0gc2VnbWVudF9ob2xkaW5nKG0sIChjaGFyKilwKTsKLSAgc2l6ZV90ICBzeiA9IGNodW5rc2l6ZShwKTsKLSAgYXNzZXJ0KHNwICE9IDApOwotICBhc3NlcnQoKGlzX2FsaWduZWQoY2h1bmsybWVtKHApKSkgfHwgKHAtPmhlYWQgPT0gRkVOQ0VQT1NUX0hFQUQpKTsKLSAgYXNzZXJ0KG9rX2FkZHJlc3MobSwgcCkpOwotICBhc3NlcnQoc3ogPT0gbS0+dG9wc2l6ZSk7Ci0gIGFzc2VydChzeiA+IDApOwotICBhc3NlcnQoc3ogPT0gKChzcC0+YmFzZSArIHNwLT5zaXplKSAtIChjaGFyKilwKSAtIFRPUF9GT09UX1NJWkUpOwotICBhc3NlcnQocGludXNlKHApKTsKLSAgYXNzZXJ0KCFuZXh0X3BpbnVzZShwKSk7Ci19Ci0KLS8qIENoZWNrIHByb3BlcnRpZXMgb2YgKGludXNlKSBtbWFwcGVkIGNodW5rcyAqLwotc3RhdGljIHZvaWQgZG9fY2hlY2tfbW1hcHBlZF9jaHVuayhtc3RhdGUgbSwgbWNodW5rcHRyIHApIHsKLSAgc2l6ZV90ICBzeiA9IGNodW5rc2l6ZShwKTsKLSAgc2l6ZV90IGxlbiA9IChzeiArIChwLT5wcmV2X2Zvb3QgJiB+SVNfTU1BUFBFRF9CSVQpICsgTU1BUF9GT09UX1BBRCk7Ci0gIGFzc2VydChpc19tbWFwcGVkKHApKTsKLSAgYXNzZXJ0KHVzZV9tbWFwKG0pKTsKLSAgYXNzZXJ0KChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpIHx8IChwLT5oZWFkID09IEZFTkNFUE9TVF9IRUFEKSk7Ci0gIGFzc2VydChva19hZGRyZXNzKG0sIHApKTsKLSAgYXNzZXJ0KCFpc19zbWFsbChzeikpOwotICBhc3NlcnQoKGxlbiAmIChtcGFyYW1zLnBhZ2Vfc2l6ZS1TSVpFX1RfT05FKSkgPT0gMCk7Ci0gIGFzc2VydChjaHVua19wbHVzX29mZnNldChwLCBzeiktPmhlYWQgPT0gRkVOQ0VQT1NUX0hFQUQpOwotICBhc3NlcnQoY2h1bmtfcGx1c19vZmZzZXQocCwgc3orU0laRV9UX1NJWkUpLT5oZWFkID09IDApOwotfQotCi0vKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGludXNlIGNodW5rcyAqLwotc3RhdGljIHZvaWQgZG9fY2hlY2tfaW51c2VfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7Ci0gIGRvX2NoZWNrX2FueV9jaHVuayhtLCBwKTsKLSAgYXNzZXJ0KGNpbnVzZShwKSk7Ci0gIGFzc2VydChuZXh0X3BpbnVzZShwKSk7Ci0gIC8qIElmIG5vdCBwaW51c2UgYW5kIG5vdCBtbWFwcGVkLCBwcmV2aW91cyBjaHVuayBoYXMgT0sgb2Zmc2V0ICovCi0gIGFzc2VydChpc19tbWFwcGVkKHApIHx8IHBpbnVzZShwKSB8fCBuZXh0X2NodW5rKHByZXZfY2h1bmsocCkpID09IHApOwotICBpZiAoaXNfbW1hcHBlZChwKSkKLSAgICBkb19jaGVja19tbWFwcGVkX2NodW5rKG0sIHApOwotfQotCi0vKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGZyZWUgY2h1bmtzICovCi1zdGF0aWMgdm9pZCBkb19jaGVja19mcmVlX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCkgewotICBzaXplX3Qgc3ogPSBwLT5oZWFkICYgfihQSU5VU0VfQklUfENJTlVTRV9CSVQpOwotICBtY2h1bmtwdHIgbmV4dCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIHN6KTsKLSAgZG9fY2hlY2tfYW55X2NodW5rKG0sIHApOwotICBhc3NlcnQoIWNpbnVzZShwKSk7Ci0gIGFzc2VydCghbmV4dF9waW51c2UocCkpOwotICBhc3NlcnQgKCFpc19tbWFwcGVkKHApKTsKLSAgaWYgKHAgIT0gbS0+ZHYgJiYgcCAhPSBtLT50b3ApIHsKLSAgICBpZiAoc3ogPj0gTUlOX0NIVU5LX1NJWkUpIHsKLSAgICAgIGFzc2VydCgoc3ogJiBDSFVOS19BTElHTl9NQVNLKSA9PSAwKTsKLSAgICAgIGFzc2VydChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpOwotICAgICAgYXNzZXJ0KG5leHQtPnByZXZfZm9vdCA9PSBzeik7Ci0gICAgICBhc3NlcnQocGludXNlKHApKTsKLSAgICAgIGFzc2VydCAobmV4dCA9PSBtLT50b3AgfHwgY2ludXNlKG5leHQpKTsKLSAgICAgIGFzc2VydChwLT5mZC0+YmsgPT0gcCk7Ci0gICAgICBhc3NlcnQocC0+YmstPmZkID09IHApOwotICAgIH0KLSAgICBlbHNlICAvKiBtYXJrZXJzIGFyZSBhbHdheXMgb2Ygc2l6ZSBTSVpFX1RfU0laRSAqLwotICAgICAgYXNzZXJ0KHN6ID09IFNJWkVfVF9TSVpFKTsKLSAgfQotfQotCi0vKiBDaGVjayBwcm9wZXJ0aWVzIG9mIG1hbGxvY2VkIGNodW5rcyBhdCB0aGUgcG9pbnQgdGhleSBhcmUgbWFsbG9jZWQgKi8KLXN0YXRpYyB2b2lkIGRvX2NoZWNrX21hbGxvY2VkX2NodW5rKG1zdGF0ZSBtLCB2b2lkKiBtZW0sIHNpemVfdCBzKSB7Ci0gIGlmIChtZW0gIT0gMCkgewotICAgIG1jaHVua3B0ciBwID0gbWVtMmNodW5rKG1lbSk7Ci0gICAgc2l6ZV90IHN6ID0gcC0+aGVhZCAmIH4oUElOVVNFX0JJVHxDSU5VU0VfQklUKTsKLSAgICBkb19jaGVja19pbnVzZV9jaHVuayhtLCBwKTsKLSAgICBhc3NlcnQoKHN6ICYgQ0hVTktfQUxJR05fTUFTSykgPT0gMCk7Ci0gICAgYXNzZXJ0KHN6ID49IE1JTl9DSFVOS19TSVpFKTsKLSAgICBhc3NlcnQoc3ogPj0gcyk7Ci0gICAgLyogdW5sZXNzIG1tYXBwZWQsIHNpemUgaXMgbGVzcyB0aGFuIE1JTl9DSFVOS19TSVpFIG1vcmUgdGhhbiByZXF1ZXN0ICovCi0gICAgYXNzZXJ0KGlzX21tYXBwZWQocCkgfHwgc3ogPCAocyArIE1JTl9DSFVOS19TSVpFKSk7Ci0gIH0KLX0KLQotLyogQ2hlY2sgYSB0cmVlIGFuZCBpdHMgc3VidHJlZXMuICAqLwotc3RhdGljIHZvaWQgZG9fY2hlY2tfdHJlZShtc3RhdGUgbSwgdGNodW5rcHRyIHQpIHsKLSAgdGNodW5rcHRyIGhlYWQgPSAwOwotICB0Y2h1bmtwdHIgdSA9IHQ7Ci0gIGJpbmRleF90IHRpbmRleCA9IHQtPmluZGV4OwotICBzaXplX3QgdHNpemUgPSBjaHVua3NpemUodCk7Ci0gIGJpbmRleF90IGlkeDsKLSAgY29tcHV0ZV90cmVlX2luZGV4KHRzaXplLCBpZHgpOwotICBhc3NlcnQodGluZGV4ID09IGlkeCk7Ci0gIGFzc2VydCh0c2l6ZSA+PSBNSU5fTEFSR0VfU0laRSk7Ci0gIGFzc2VydCh0c2l6ZSA+PSBtaW5zaXplX2Zvcl90cmVlX2luZGV4KGlkeCkpOwotICBhc3NlcnQoKGlkeCA9PSBOVFJFRUJJTlMtMSkgfHwgKHRzaXplIDwgbWluc2l6ZV9mb3JfdHJlZV9pbmRleCgoaWR4KzEpKSkpOwotCi0gIGRvIHsgLyogdHJhdmVyc2UgdGhyb3VnaCBjaGFpbiBvZiBzYW1lLXNpemVkIG5vZGVzICovCi0gICAgZG9fY2hlY2tfYW55X2NodW5rKG0sICgobWNodW5rcHRyKXUpKTsKLSAgICBhc3NlcnQodS0+aW5kZXggPT0gdGluZGV4KTsKLSAgICBhc3NlcnQoY2h1bmtzaXplKHUpID09IHRzaXplKTsKLSAgICBhc3NlcnQoIWNpbnVzZSh1KSk7Ci0gICAgYXNzZXJ0KCFuZXh0X3BpbnVzZSh1KSk7Ci0gICAgYXNzZXJ0KHUtPmZkLT5iayA9PSB1KTsKLSAgICBhc3NlcnQodS0+YmstPmZkID09IHUpOwotICAgIGlmICh1LT5wYXJlbnQgPT0gMCkgewotICAgICAgYXNzZXJ0KHUtPmNoaWxkWzBdID09IDApOwotICAgICAgYXNzZXJ0KHUtPmNoaWxkWzFdID09IDApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGFzc2VydChoZWFkID09IDApOyAvKiBvbmx5IG9uZSBub2RlIG9uIGNoYWluIGhhcyBwYXJlbnQgKi8KLSAgICAgIGhlYWQgPSB1OwotICAgICAgYXNzZXJ0KHUtPnBhcmVudCAhPSB1KTsKLSAgICAgIGFzc2VydCAodS0+cGFyZW50LT5jaGlsZFswXSA9PSB1IHx8Ci0gICAgICAgICAgICAgIHUtPnBhcmVudC0+Y2hpbGRbMV0gPT0gdSB8fAotICAgICAgICAgICAgICAqKCh0YmlucHRyKikodS0+cGFyZW50KSkgPT0gdSk7Ci0gICAgICBpZiAodS0+Y2hpbGRbMF0gIT0gMCkgewotICAgICAgICBhc3NlcnQodS0+Y2hpbGRbMF0tPnBhcmVudCA9PSB1KTsKLSAgICAgICAgYXNzZXJ0KHUtPmNoaWxkWzBdICE9IHUpOwotICAgICAgICBkb19jaGVja190cmVlKG0sIHUtPmNoaWxkWzBdKTsKLSAgICAgIH0KLSAgICAgIGlmICh1LT5jaGlsZFsxXSAhPSAwKSB7Ci0gICAgICAgIGFzc2VydCh1LT5jaGlsZFsxXS0+cGFyZW50ID09IHUpOwotICAgICAgICBhc3NlcnQodS0+Y2hpbGRbMV0gIT0gdSk7Ci0gICAgICAgIGRvX2NoZWNrX3RyZWUobSwgdS0+Y2hpbGRbMV0pOwotICAgICAgfQotICAgICAgaWYgKHUtPmNoaWxkWzBdICE9IDAgJiYgdS0+Y2hpbGRbMV0gIT0gMCkgewotICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHUtPmNoaWxkWzBdKSA8IGNodW5rc2l6ZSh1LT5jaGlsZFsxXSkpOwotICAgICAgfQotICAgIH0KLSAgICB1ID0gdS0+ZmQ7Ci0gIH0gd2hpbGUgKHUgIT0gdCk7Ci0gIGFzc2VydChoZWFkICE9IDApOwotfQotCi0vKiAgQ2hlY2sgYWxsIHRoZSBjaHVua3MgaW4gYSB0cmVlYmluLiAgKi8KLXN0YXRpYyB2b2lkIGRvX2NoZWNrX3RyZWViaW4obXN0YXRlIG0sIGJpbmRleF90IGkpIHsKLSAgdGJpbnB0ciogdGIgPSB0cmVlYmluX2F0KG0sIGkpOwotICB0Y2h1bmtwdHIgdCA9ICp0YjsKLSAgaW50IGVtcHR5ID0gKG0tPnRyZWVtYXAgJiAoMVUgPDwgaSkpID09IDA7Ci0gIGlmICh0ID09IDApCi0gICAgYXNzZXJ0KGVtcHR5KTsKLSAgaWYgKCFlbXB0eSkKLSAgICBkb19jaGVja190cmVlKG0sIHQpOwotfQotCi0vKiAgQ2hlY2sgYWxsIHRoZSBjaHVua3MgaW4gYSBzbWFsbGJpbi4gICovCi1zdGF0aWMgdm9pZCBkb19jaGVja19zbWFsbGJpbihtc3RhdGUgbSwgYmluZGV4X3QgaSkgewotICBzYmlucHRyIGIgPSBzbWFsbGJpbl9hdChtLCBpKTsKLSAgbWNodW5rcHRyIHAgPSBiLT5iazsKLSAgdW5zaWduZWQgaW50IGVtcHR5ID0gKG0tPnNtYWxsbWFwICYgKDFVIDw8IGkpKSA9PSAwOwotICBpZiAocCA9PSBiKQotICAgIGFzc2VydChlbXB0eSk7Ci0gIGlmICghZW1wdHkpIHsKLSAgICBmb3IgKDsgcCAhPSBiOyBwID0gcC0+YmspIHsKLSAgICAgIHNpemVfdCBzaXplID0gY2h1bmtzaXplKHApOwotICAgICAgbWNodW5rcHRyIHE7Ci0gICAgICAvKiBlYWNoIGNodW5rIGNsYWltcyB0byBiZSBmcmVlICovCi0gICAgICBkb19jaGVja19mcmVlX2NodW5rKG0sIHApOwotICAgICAgLyogY2h1bmsgYmVsb25ncyBpbiBiaW4gKi8KLSAgICAgIGFzc2VydChzbWFsbF9pbmRleChzaXplKSA9PSBpKTsKLSAgICAgIGFzc2VydChwLT5iayA9PSBiIHx8IGNodW5rc2l6ZShwLT5iaykgPT0gY2h1bmtzaXplKHApKTsKLSAgICAgIC8qIGNodW5rIGlzIGZvbGxvd2VkIGJ5IGFuIGludXNlIGNodW5rICovCi0gICAgICBxID0gbmV4dF9jaHVuayhwKTsKLSAgICAgIGlmIChxLT5oZWFkICE9IEZFTkNFUE9TVF9IRUFEKQotICAgICAgICBkb19jaGVja19pbnVzZV9jaHVuayhtLCBxKTsKLSAgICB9Ci0gIH0KLX0KLQotLyogRmluZCB4IGluIGEgYmluLiBVc2VkIGluIG90aGVyIGNoZWNrIGZ1bmN0aW9ucy4gKi8KLXN0YXRpYyBpbnQgYmluX2ZpbmQobXN0YXRlIG0sIG1jaHVua3B0ciB4KSB7Ci0gIHNpemVfdCBzaXplID0gY2h1bmtzaXplKHgpOwotICBpZiAoaXNfc21hbGwoc2l6ZSkpIHsKLSAgICBiaW5kZXhfdCBzaWR4ID0gc21hbGxfaW5kZXgoc2l6ZSk7Ci0gICAgc2JpbnB0ciBiID0gc21hbGxiaW5fYXQobSwgc2lkeCk7Ci0gICAgaWYgKHNtYWxsbWFwX2lzX21hcmtlZChtLCBzaWR4KSkgewotICAgICAgbWNodW5rcHRyIHAgPSBiOwotICAgICAgZG8gewotICAgICAgICBpZiAocCA9PSB4KQotICAgICAgICAgIHJldHVybiAxOwotICAgICAgfSB3aGlsZSAoKHAgPSBwLT5mZCkgIT0gYik7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIGJpbmRleF90IHRpZHg7Ci0gICAgY29tcHV0ZV90cmVlX2luZGV4KHNpemUsIHRpZHgpOwotICAgIGlmICh0cmVlbWFwX2lzX21hcmtlZChtLCB0aWR4KSkgewotICAgICAgdGNodW5rcHRyIHQgPSAqdHJlZWJpbl9hdChtLCB0aWR4KTsKLSAgICAgIHNpemVfdCBzaXplYml0cyA9IHNpemUgPDwgbGVmdHNoaWZ0X2Zvcl90cmVlX2luZGV4KHRpZHgpOwotICAgICAgd2hpbGUgKHQgIT0gMCAmJiBjaHVua3NpemUodCkgIT0gc2l6ZSkgewotICAgICAgICB0ID0gdC0+Y2hpbGRbKHNpemViaXRzID4+IChTSVpFX1RfQklUU0laRS1TSVpFX1RfT05FKSkgJiAxXTsKLSAgICAgICAgc2l6ZWJpdHMgPDw9IDE7Ci0gICAgICB9Ci0gICAgICBpZiAodCAhPSAwKSB7Ci0gICAgICAgIHRjaHVua3B0ciB1ID0gdDsKLSAgICAgICAgZG8gewotICAgICAgICAgIGlmICh1ID09ICh0Y2h1bmtwdHIpeCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9IHdoaWxlICgodSA9IHUtPmZkKSAhPSB0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRyYXZlcnNlIGVhY2ggY2h1bmsgYW5kIGNoZWNrIGl0OyByZXR1cm4gdG90YWwgKi8KLXN0YXRpYyBzaXplX3QgdHJhdmVyc2VfYW5kX2NoZWNrKG1zdGF0ZSBtKSB7Ci0gIHNpemVfdCBzdW0gPSAwOwotICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsKLSAgICBtc2VnbWVudHB0ciBzID0gJm0tPnNlZzsKLSAgICBzdW0gKz0gbS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkU7Ci0gICAgd2hpbGUgKHMgIT0gMCkgewotICAgICAgbWNodW5rcHRyIHEgPSBhbGlnbl9hc19jaHVuayhzLT5iYXNlKTsKLSAgICAgIG1jaHVua3B0ciBsYXN0cSA9IDA7Ci0gICAgICBhc3NlcnQocGludXNlKHEpKTsKLSAgICAgIHdoaWxlIChzZWdtZW50X2hvbGRzKHMsIHEpICYmCi0gICAgICAgICAgICAgcSAhPSBtLT50b3AgJiYgcS0+aGVhZCAhPSBGRU5DRVBPU1RfSEVBRCkgewotICAgICAgICBzdW0gKz0gY2h1bmtzaXplKHEpOwotICAgICAgICBpZiAoY2ludXNlKHEpKSB7Ci0gICAgICAgICAgYXNzZXJ0KCFiaW5fZmluZChtLCBxKSk7Ci0gICAgICAgICAgZG9fY2hlY2tfaW51c2VfY2h1bmsobSwgcSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgYXNzZXJ0KHEgPT0gbS0+ZHYgfHwgYmluX2ZpbmQobSwgcSkpOwotICAgICAgICAgIGFzc2VydChsYXN0cSA9PSAwIHx8IGNpbnVzZShsYXN0cSkpOyAvKiBOb3QgMiBjb25zZWN1dGl2ZSBmcmVlICovCi0gICAgICAgICAgZG9fY2hlY2tfZnJlZV9jaHVuayhtLCBxKTsKLSAgICAgICAgfQotICAgICAgICBsYXN0cSA9IHE7Ci0gICAgICAgIHEgPSBuZXh0X2NodW5rKHEpOwotICAgICAgfQotICAgICAgcyA9IHMtPm5leHQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzdW07Ci19Ci0KLS8qIENoZWNrIGFsbCBwcm9wZXJ0aWVzIG9mIG1hbGxvY19zdGF0ZS4gKi8KLXN0YXRpYyB2b2lkIGRvX2NoZWNrX21hbGxvY19zdGF0ZShtc3RhdGUgbSkgewotICBiaW5kZXhfdCBpOwotICBzaXplX3QgdG90YWw7Ci0gIC8qIGNoZWNrIGJpbnMgKi8KLSAgZm9yIChpID0gMDsgaSA8IE5TTUFMTEJJTlM7ICsraSkKLSAgICBkb19jaGVja19zbWFsbGJpbihtLCBpKTsKLSAgZm9yIChpID0gMDsgaSA8IE5UUkVFQklOUzsgKytpKQotICAgIGRvX2NoZWNrX3RyZWViaW4obSwgaSk7Ci0KLSAgaWYgKG0tPmR2c2l6ZSAhPSAwKSB7IC8qIGNoZWNrIGR2IGNodW5rICovCi0gICAgZG9fY2hlY2tfYW55X2NodW5rKG0sIG0tPmR2KTsKLSAgICBhc3NlcnQobS0+ZHZzaXplID09IGNodW5rc2l6ZShtLT5kdikpOwotICAgIGFzc2VydChtLT5kdnNpemUgPj0gTUlOX0NIVU5LX1NJWkUpOwotICAgIGFzc2VydChiaW5fZmluZChtLCBtLT5kdikgPT0gMCk7Ci0gIH0KLQotICBpZiAobS0+dG9wICE9IDApIHsgICAvKiBjaGVjayB0b3AgY2h1bmsgKi8KLSAgICBkb19jaGVja190b3BfY2h1bmsobSwgbS0+dG9wKTsKLSAgICBhc3NlcnQobS0+dG9wc2l6ZSA9PSBjaHVua3NpemUobS0+dG9wKSk7Ci0gICAgYXNzZXJ0KG0tPnRvcHNpemUgPiAwKTsKLSAgICBhc3NlcnQoYmluX2ZpbmQobSwgbS0+dG9wKSA9PSAwKTsKLSAgfQotCi0gIHRvdGFsID0gdHJhdmVyc2VfYW5kX2NoZWNrKG0pOwotICBhc3NlcnQodG90YWwgPD0gbS0+Zm9vdHByaW50KTsKLSAgYXNzZXJ0KG0tPmZvb3RwcmludCA8PSBtLT5tYXhfZm9vdHByaW50KTsKLX0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0aXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgIU5PX01BTExJTkZPCi1zdGF0aWMgc3RydWN0IG1hbGxpbmZvIGludGVybmFsX21hbGxpbmZvKG1zdGF0ZSBtKSB7Ci0gIHN0cnVjdCBtYWxsaW5mbyBubSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwotICBpZiAoIVBSRUFDVElPTihtKSkgewotICAgIGNoZWNrX21hbGxvY19zdGF0ZShtKTsKLSAgICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsKLSAgICAgIHNpemVfdCBuZnJlZSA9IFNJWkVfVF9PTkU7IC8qIHRvcCBhbHdheXMgZnJlZSAqLwotICAgICAgc2l6ZV90IG1mcmVlID0gbS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkU7Ci0gICAgICBzaXplX3Qgc3VtID0gbWZyZWU7Ci0gICAgICBtc2VnbWVudHB0ciBzID0gJm0tPnNlZzsKLSAgICAgIHdoaWxlIChzICE9IDApIHsKLSAgICAgICAgbWNodW5rcHRyIHEgPSBhbGlnbl9hc19jaHVuayhzLT5iYXNlKTsKLSAgICAgICAgd2hpbGUgKHNlZ21lbnRfaG9sZHMocywgcSkgJiYKLSAgICAgICAgICAgICAgIHEgIT0gbS0+dG9wICYmIHEtPmhlYWQgIT0gRkVOQ0VQT1NUX0hFQUQpIHsKLSAgICAgICAgICBzaXplX3Qgc3ogPSBjaHVua3NpemUocSk7Ci0gICAgICAgICAgc3VtICs9IHN6OwotICAgICAgICAgIGlmICghY2ludXNlKHEpKSB7Ci0gICAgICAgICAgICBtZnJlZSArPSBzejsKLSAgICAgICAgICAgICsrbmZyZWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHEgPSBuZXh0X2NodW5rKHEpOwotICAgICAgICB9Ci0gICAgICAgIHMgPSBzLT5uZXh0OwotICAgICAgfQotCi0gICAgICBubS5hcmVuYSAgICA9IHN1bTsKLSAgICAgIG5tLm9yZGJsa3MgID0gbmZyZWU7Ci0gICAgICBubS5oYmxraGQgICA9IG0tPmZvb3RwcmludCAtIHN1bTsKLSAgICAgIG5tLnVzbWJsa3MgID0gbS0+bWF4X2Zvb3RwcmludDsKLSAgICAgIG5tLnVvcmRibGtzID0gbS0+Zm9vdHByaW50IC0gbWZyZWU7Ci0gICAgICBubS5mb3JkYmxrcyA9IG1mcmVlOwotICAgICAgbm0ua2VlcGNvc3QgPSBtLT50b3BzaXplOwotICAgIH0KLQotICAgIFBPU1RBQ1RJT04obSk7Ci0gIH0KLSAgcmV0dXJuIG5tOwotfQotI2VuZGlmIC8qICFOT19NQUxMSU5GTyAqLwotCi1zdGF0aWMgdm9pZCBpbnRlcm5hbF9tYWxsb2Nfc3RhdHMobXN0YXRlIG0pIHsKLSAgaWYgKCFQUkVBQ1RJT04obSkpIHsKLSAgICBzaXplX3QgbWF4ZnAgPSAwOwotICAgIHNpemVfdCBmcCA9IDA7Ci0gICAgc2l6ZV90IHVzZWQgPSAwOwotICAgIGNoZWNrX21hbGxvY19zdGF0ZShtKTsKLSAgICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsKLSAgICAgIG1zZWdtZW50cHRyIHMgPSAmbS0+c2VnOwotICAgICAgbWF4ZnAgPSBtLT5tYXhfZm9vdHByaW50OwotICAgICAgZnAgPSBtLT5mb290cHJpbnQ7Ci0gICAgICB1c2VkID0gZnAgLSAobS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkUpOwotCi0gICAgICB3aGlsZSAocyAhPSAwKSB7Ci0gICAgICAgIG1jaHVua3B0ciBxID0gYWxpZ25fYXNfY2h1bmsocy0+YmFzZSk7Ci0gICAgICAgIHdoaWxlIChzZWdtZW50X2hvbGRzKHMsIHEpICYmCi0gICAgICAgICAgICAgICBxICE9IG0tPnRvcCAmJiBxLT5oZWFkICE9IEZFTkNFUE9TVF9IRUFEKSB7Ci0gICAgICAgICAgaWYgKCFjaW51c2UocSkpCi0gICAgICAgICAgICB1c2VkIC09IGNodW5rc2l6ZShxKTsKLSAgICAgICAgICBxID0gbmV4dF9jaHVuayhxKTsKLSAgICAgICAgfQotICAgICAgICBzID0gcy0+bmV4dDsKLSAgICAgIH0KLSAgICB9Ci0KLSNpZm5kZWYgTEFDS1NfU1RESU9fSAotICAgIGZwcmludGYoc3RkZXJyLCAibWF4IHN5c3RlbSBieXRlcyA9ICUxMGx1XG4iLCAodW5zaWduZWQgbG9uZykobWF4ZnApKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInN5c3RlbSBieXRlcyAgICAgPSAlMTBsdVxuIiwgKHVuc2lnbmVkIGxvbmcpKGZwKSk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJpbiB1c2UgYnl0ZXMgICAgID0gJTEwbHVcbiIsICh1bnNpZ25lZCBsb25nKSh1c2VkKSk7Ci0jZW5kaWYKLQotICAgIFBPU1RBQ1RJT04obSk7Ci0gIH0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW9ucyBvbiBzbWFsbGJpbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAgVmFyaW91cyBmb3JtcyBvZiBsaW5raW5nIGFuZCB1bmxpbmtpbmcgYXJlIGRlZmluZWQgYXMgbWFjcm9zLiAgRXZlbgotICB0aGUgb25lcyBmb3IgdHJlZXMsIHdoaWNoIGFyZSB2ZXJ5IGxvbmcgYnV0IGhhdmUgdmVyeSBzaG9ydCB0eXBpY2FsCi0gIHBhdGhzLiAgVGhpcyBpcyB1Z2x5IGJ1dCByZWR1Y2VzIHJlbGlhbmNlIG9uIGlubGluaW5nIHN1cHBvcnQgb2YKLSAgY29tcGlsZXJzLgotKi8KLQotLyogTGluayBhIGZyZWUgY2h1bmsgaW50byBhIHNtYWxsYmluICAqLwotI2RlZmluZSBpbnNlcnRfc21hbGxfY2h1bmsoTSwgUCwgUykge1wKLSAgYmluZGV4X3QgSSAgPSBzbWFsbF9pbmRleChTKTtcCi0gIG1jaHVua3B0ciBCID0gc21hbGxiaW5fYXQoTSwgSSk7XAotICBtY2h1bmtwdHIgRiA9IEI7XAotICBhc3NlcnQoUyA+PSBNSU5fQ0hVTktfU0laRSk7XAotICBpZiAoIXNtYWxsbWFwX2lzX21hcmtlZChNLCBJKSlcCi0gICAgbWFya19zbWFsbG1hcChNLCBJKTtcCi0gIGVsc2UgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBCLT5mZCkpKVwKLSAgICBGID0gQi0+ZmQ7XAotICBlbHNlIHtcCi0gICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAotICB9XAotICBCLT5mZCA9IFA7XAotICBGLT5iayA9IFA7XAotICBQLT5mZCA9IEY7XAotICBQLT5iayA9IEI7XAotfQotCi0vKiBVbmxpbmsgYSBjaHVuayBmcm9tIGEgc21hbGxiaW4gICovCi0jZGVmaW5lIHVubGlua19zbWFsbF9jaHVuayhNLCBQLCBTKSB7XAotICBtY2h1bmtwdHIgRiA9IFAtPmZkO1wKLSAgbWNodW5rcHRyIEIgPSBQLT5iaztcCi0gIGJpbmRleF90IEkgPSBzbWFsbF9pbmRleChTKTtcCi0gIGFzc2VydChQICE9IEIpO1wKLSAgYXNzZXJ0KFAgIT0gRik7XAotICBhc3NlcnQoY2h1bmtzaXplKFApID09IHNtYWxsX2luZGV4MnNpemUoSSkpO1wKLSAgaWYgKEYgPT0gQilcCi0gICAgY2xlYXJfc21hbGxtYXAoTSwgSSk7XAotICBlbHNlIGlmIChSVENIRUNLKChGID09IHNtYWxsYmluX2F0KE0sSSkgfHwgb2tfYWRkcmVzcyhNLCBGKSkgJiZcCi0gICAgICAgICAgICAgICAgICAgKEIgPT0gc21hbGxiaW5fYXQoTSxJKSB8fCBva19hZGRyZXNzKE0sIEIpKSkpIHtcCi0gICAgRi0+YmsgPSBCO1wKLSAgICBCLT5mZCA9IEY7XAotICB9XAotICBlbHNlIHtcCi0gICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAotICB9XAotfQotCi0vKiBVbmxpbmsgdGhlIGZpcnN0IGNodW5rIGZyb20gYSBzbWFsbGJpbiAqLwotI2RlZmluZSB1bmxpbmtfZmlyc3Rfc21hbGxfY2h1bmsoTSwgQiwgUCwgSSkge1wKLSAgbWNodW5rcHRyIEYgPSBQLT5mZDtcCi0gIGFzc2VydChQICE9IEIpO1wKLSAgYXNzZXJ0KFAgIT0gRik7XAotICBhc3NlcnQoY2h1bmtzaXplKFApID09IHNtYWxsX2luZGV4MnNpemUoSSkpO1wKLSAgaWYgKEIgPT0gRilcCi0gICAgY2xlYXJfc21hbGxtYXAoTSwgSSk7XAotICBlbHNlIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgRikpKSB7XAotICAgIEItPmZkID0gRjtcCi0gICAgRi0+YmsgPSBCO1wKLSAgfVwKLSAgZWxzZSB7XAotICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wKLSAgfVwKLX0KLQotLyogUmVwbGFjZSBkdiBub2RlLCBiaW5uaW5nIHRoZSBvbGQgb25lICovCi0vKiBVc2VkIG9ubHkgd2hlbiBkdnNpemUga25vd24gdG8gYmUgc21hbGwgKi8KLSNkZWZpbmUgcmVwbGFjZV9kdihNLCBQLCBTKSB7XAotICBzaXplX3QgRFZTID0gTS0+ZHZzaXplO1wKLSAgaWYgKERWUyAhPSAwKSB7XAotICAgIG1jaHVua3B0ciBEViA9IE0tPmR2O1wKLSAgICBhc3NlcnQoaXNfc21hbGwoRFZTKSk7XAotICAgIGluc2VydF9zbWFsbF9jaHVuayhNLCBEViwgRFZTKTtcCi0gIH1cCi0gIE0tPmR2c2l6ZSA9IFM7XAotICBNLT5kdiA9IFA7XAotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMgb24gdHJlZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBJbnNlcnQgY2h1bmsgaW50byB0cmVlICovCi0jZGVmaW5lIGluc2VydF9sYXJnZV9jaHVuayhNLCBYLCBTKSB7XAotICB0YmlucHRyKiBIO1wKLSAgYmluZGV4X3QgSTtcCi0gIGNvbXB1dGVfdHJlZV9pbmRleChTLCBJKTtcCi0gIEggPSB0cmVlYmluX2F0KE0sIEkpO1wKLSAgWC0+aW5kZXggPSBJO1wKLSAgWC0+Y2hpbGRbMF0gPSBYLT5jaGlsZFsxXSA9IDA7XAotICBpZiAoIXRyZWVtYXBfaXNfbWFya2VkKE0sIEkpKSB7XAotICAgIG1hcmtfdHJlZW1hcChNLCBJKTtcCi0gICAgKkggPSBYO1wKLSAgICBYLT5wYXJlbnQgPSAodGNodW5rcHRyKUg7XAotICAgIFgtPmZkID0gWC0+YmsgPSBYO1wKLSAgfVwKLSAgZWxzZSB7XAotICAgIHRjaHVua3B0ciBUID0gKkg7XAotICAgIHNpemVfdCBLID0gUyA8PCBsZWZ0c2hpZnRfZm9yX3RyZWVfaW5kZXgoSSk7XAotICAgIGZvciAoOzspIHtcCi0gICAgICBpZiAoY2h1bmtzaXplKFQpICE9IFMpIHtcCi0gICAgICAgIHRjaHVua3B0ciogQyA9ICYoVC0+Y2hpbGRbKEsgPj4gKFNJWkVfVF9CSVRTSVpFLVNJWkVfVF9PTkUpKSAmIDFdKTtcCi0gICAgICAgIEsgPDw9IDE7XAotICAgICAgICBpZiAoKkMgIT0gMClcCi0gICAgICAgICAgVCA9ICpDO1wKLSAgICAgICAgZWxzZSBpZiAoUlRDSEVDSyhva19hZGRyZXNzKE0sIEMpKSkge1wKLSAgICAgICAgICAqQyA9IFg7XAotICAgICAgICAgIFgtPnBhcmVudCA9IFQ7XAotICAgICAgICAgIFgtPmZkID0gWC0+YmsgPSBYO1wKLSAgICAgICAgICBicmVhaztcCi0gICAgICAgIH1cCi0gICAgICAgIGVsc2Uge1wKLSAgICAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCi0gICAgICAgICAgYnJlYWs7XAotICAgICAgICB9XAotICAgICAgfVwKLSAgICAgIGVsc2Uge1wKLSAgICAgICAgdGNodW5rcHRyIEYgPSBULT5mZDtcCi0gICAgICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgVCkgJiYgb2tfYWRkcmVzcyhNLCBGKSkpIHtcCi0gICAgICAgICAgVC0+ZmQgPSBGLT5iayA9IFg7XAotICAgICAgICAgIFgtPmZkID0gRjtcCi0gICAgICAgICAgWC0+YmsgPSBUO1wKLSAgICAgICAgICBYLT5wYXJlbnQgPSAwO1wKLSAgICAgICAgICBicmVhaztcCi0gICAgICAgIH1cCi0gICAgICAgIGVsc2Uge1wKLSAgICAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCi0gICAgICAgICAgYnJlYWs7XAotICAgICAgICB9XAotICAgICAgfVwKLSAgICB9XAotICB9XAotfQotCi0vKgotICBVbmxpbmsgc3RlcHM6Ci0KLSAgMS4gSWYgeCBpcyBhIGNoYWluZWQgbm9kZSwgdW5saW5rIGl0IGZyb20gaXRzIHNhbWUtc2l6ZWQgZmQvYmsgbGlua3MKLSAgICAgYW5kIGNob29zZSBpdHMgYmsgbm9kZSBhcyBpdHMgcmVwbGFjZW1lbnQuCi0gIDIuIElmIHggd2FzIHRoZSBsYXN0IG5vZGUgb2YgaXRzIHNpemUsIGJ1dCBub3QgYSBsZWFmIG5vZGUsIGl0IG11c3QKLSAgICAgYmUgcmVwbGFjZWQgd2l0aCBhIGxlYWYgbm9kZSAobm90IG1lcmVseSBvbmUgd2l0aCBhbiBvcGVuIGxlZnQgb3IKLSAgICAgcmlnaHQpLCB0byBtYWtlIHN1cmUgdGhhdCBsZWZ0cyBhbmQgcmlnaHRzIG9mIGRlc2NlbmRlbnRzCi0gICAgIGNvcnJlc3BvbmQgcHJvcGVybHkgdG8gYml0IG1hc2tzLiAgV2UgdXNlIHRoZSByaWdodG1vc3QgZGVzY2VuZGVudAotICAgICBvZiB4LiAgV2UgY291bGQgdXNlIGFueSBvdGhlciBsZWFmLCBidXQgdGhpcyBpcyBlYXN5IHRvIGxvY2F0ZSBhbmQKLSAgICAgdGVuZHMgdG8gY291bnRlcmFjdCByZW1vdmFsIG9mIGxlZnRtb3N0cyBlbHNld2hlcmUsIGFuZCBzbyBrZWVwcwotICAgICBwYXRocyBzaG9ydGVyIHRoYW4gbWluaW1hbGx5IGd1YXJhbnRlZWQuICBUaGlzIGRvZXNuJ3QgbG9vcCBtdWNoCi0gICAgIGJlY2F1c2Ugb24gYXZlcmFnZSBhIG5vZGUgaW4gYSB0cmVlIGlzIG5lYXIgdGhlIGJvdHRvbS4KLSAgMy4gSWYgeCBpcyB0aGUgYmFzZSBvZiBhIGNoYWluIChpLmUuLCBoYXMgcGFyZW50IGxpbmtzKSByZWxpbmsKLSAgICAgeCdzIHBhcmVudCBhbmQgY2hpbGRyZW4gdG8geCdzIHJlcGxhY2VtZW50IChvciBudWxsIGlmIG5vbmUpLgotKi8KLQotI2RlZmluZSB1bmxpbmtfbGFyZ2VfY2h1bmsoTSwgWCkge1wKLSAgdGNodW5rcHRyIFhQID0gWC0+cGFyZW50O1wKLSAgdGNodW5rcHRyIFI7XAotICBpZiAoWC0+YmsgIT0gWCkge1wKLSAgICB0Y2h1bmtwdHIgRiA9IFgtPmZkO1wKLSAgICBSID0gWC0+Yms7XAotICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgRikpKSB7XAotICAgICAgRi0+YmsgPSBSO1wKLSAgICAgIFItPmZkID0gRjtcCi0gICAgfVwKLSAgICBlbHNlIHtcCi0gICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCi0gICAgfVwKLSAgfVwKLSAgZWxzZSB7XAotICAgIHRjaHVua3B0ciogUlA7XAotICAgIGlmICgoKFIgPSAqKFJQID0gJihYLT5jaGlsZFsxXSkpKSAhPSAwKSB8fFwKLSAgICAgICAgKChSID0gKihSUCA9ICYoWC0+Y2hpbGRbMF0pKSkgIT0gMCkpIHtcCi0gICAgICB0Y2h1bmtwdHIqIENQO1wKLSAgICAgIHdoaWxlICgoKihDUCA9ICYoUi0+Y2hpbGRbMV0pKSAhPSAwKSB8fFwKLSAgICAgICAgICAgICAoKihDUCA9ICYoUi0+Y2hpbGRbMF0pKSAhPSAwKSkge1wKLSAgICAgICAgUiA9ICooUlAgPSBDUCk7XAotICAgICAgfVwKLSAgICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgUlApKSlcCi0gICAgICAgICpSUCA9IDA7XAotICAgICAgZWxzZSB7XAotICAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCi0gICAgICB9XAotICAgIH1cCi0gIH1cCi0gIGlmIChYUCAhPSAwKSB7XAotICAgIHRiaW5wdHIqIEggPSB0cmVlYmluX2F0KE0sIFgtPmluZGV4KTtcCi0gICAgaWYgKFggPT0gKkgpIHtcCi0gICAgICBpZiAoKCpIID0gUikgPT0gMCkgXAotICAgICAgICBjbGVhcl90cmVlbWFwKE0sIFgtPmluZGV4KTtcCi0gICAgfVwKLSAgICBlbHNlIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgWFApKSkge1wKLSAgICAgIGlmIChYUC0+Y2hpbGRbMF0gPT0gWCkgXAotICAgICAgICBYUC0+Y2hpbGRbMF0gPSBSO1wKLSAgICAgIGVsc2UgXAotICAgICAgICBYUC0+Y2hpbGRbMV0gPSBSO1wKLSAgICB9XAotICAgIGVsc2VcCi0gICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCi0gICAgaWYgKFIgIT0gMCkge1wKLSAgICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgUikpKSB7XAotICAgICAgICB0Y2h1bmtwdHIgQzAsIEMxO1wKLSAgICAgICAgUi0+cGFyZW50ID0gWFA7XAotICAgICAgICBpZiAoKEMwID0gWC0+Y2hpbGRbMF0pICE9IDApIHtcCi0gICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBDMCkpKSB7XAotICAgICAgICAgICAgUi0+Y2hpbGRbMF0gPSBDMDtcCi0gICAgICAgICAgICBDMC0+cGFyZW50ID0gUjtcCi0gICAgICAgICAgfVwKLSAgICAgICAgICBlbHNlXAotICAgICAgICAgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAotICAgICAgICB9XAotICAgICAgICBpZiAoKEMxID0gWC0+Y2hpbGRbMV0pICE9IDApIHtcCi0gICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBDMSkpKSB7XAotICAgICAgICAgICAgUi0+Y2hpbGRbMV0gPSBDMTtcCi0gICAgICAgICAgICBDMS0+cGFyZW50ID0gUjtcCi0gICAgICAgICAgfVwKLSAgICAgICAgICBlbHNlXAotICAgICAgICAgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAotICAgICAgICB9XAotICAgICAgfVwKLSAgICAgIGVsc2VcCi0gICAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wKLSAgICB9XAotICB9XAotfQotCi0vKiBSZWxheXMgdG8gbGFyZ2UgdnMgc21hbGwgYmluIG9wZXJhdGlvbnMgKi8KLQotI2RlZmluZSBpbnNlcnRfY2h1bmsoTSwgUCwgUylcCi0gIGlmIChpc19zbWFsbChTKSkgaW5zZXJ0X3NtYWxsX2NodW5rKE0sIFAsIFMpXAotICBlbHNlIHsgdGNodW5rcHRyIFRQID0gKHRjaHVua3B0cikoUCk7IGluc2VydF9sYXJnZV9jaHVuayhNLCBUUCwgUyk7IH0KLQotI2RlZmluZSB1bmxpbmtfY2h1bmsoTSwgUCwgUylcCi0gIGlmIChpc19zbWFsbChTKSkgdW5saW5rX3NtYWxsX2NodW5rKE0sIFAsIFMpXAotICBlbHNlIHsgdGNodW5rcHRyIFRQID0gKHRjaHVua3B0cikoUCk7IHVubGlua19sYXJnZV9jaHVuayhNLCBUUCk7IH0KLQotCi0vKiBSZWxheXMgdG8gaW50ZXJuYWwgY2FsbHMgdG8gbWFsbG9jL2ZyZWUgZnJvbSByZWFsbG9jLCBtZW1hbGlnbiBldGMgKi8KLQotI2lmIE9OTFlfTVNQQUNFUwotI2RlZmluZSBpbnRlcm5hbF9tYWxsb2MobSwgYikgbXNwYWNlX21hbGxvYyhtLCBiKQotI2RlZmluZSBpbnRlcm5hbF9mcmVlKG0sIG1lbSkgbXNwYWNlX2ZyZWUobSxtZW0pOwotI2Vsc2UgLyogT05MWV9NU1BBQ0VTICovCi0jaWYgTVNQQUNFUwotI2RlZmluZSBpbnRlcm5hbF9tYWxsb2MobSwgYilcCi0gICAobSA9PSBnbSk/IGRsbWFsbG9jKGIpIDogbXNwYWNlX21hbGxvYyhtLCBiKQotI2RlZmluZSBpbnRlcm5hbF9mcmVlKG0sIG1lbSlcCi0gICBpZiAobSA9PSBnbSkgZGxmcmVlKG1lbSk7IGVsc2UgbXNwYWNlX2ZyZWUobSxtZW0pOwotI2Vsc2UgLyogTVNQQUNFUyAqLwotI2RlZmluZSBpbnRlcm5hbF9tYWxsb2MobSwgYikgZGxtYWxsb2MoYikKLSNkZWZpbmUgaW50ZXJuYWxfZnJlZShtLCBtZW0pIGRsZnJlZShtZW0pCi0jZW5kaWYgLyogTVNQQUNFUyAqLwotI2VuZGlmIC8qIE9OTFlfTVNQQUNFUyAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRGlyZWN0LW1tYXBwaW5nIGNodW5rcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKgotICBEaXJlY3RseSBtbWFwcGVkIGNodW5rcyBhcmUgc2V0IHVwIHdpdGggYW4gb2Zmc2V0IHRvIHRoZSBzdGFydCBvZgotICB0aGUgbW1hcHBlZCByZWdpb24gc3RvcmVkIGluIHRoZSBwcmV2X2Zvb3QgZmllbGQgb2YgdGhlIGNodW5rLiBUaGlzCi0gIGFsbG93cyByZWNvbnN0cnVjdGlvbiBvZiB0aGUgcmVxdWlyZWQgYXJndW1lbnQgdG8gTVVOTUFQIHdoZW4gZnJlZWQsCi0gIGFuZCBhbHNvIGFsbG93cyBhZGp1c3RtZW50IG9mIHRoZSByZXR1cm5lZCBjaHVuayB0byBtZWV0IGFsaWdubWVudAotICByZXF1aXJlbWVudHMgKGVzcGVjaWFsbHkgaW4gbWVtYWxpZ24pLiAgVGhlcmUgaXMgYWxzbyBlbm91Z2ggc3BhY2UKLSAgYWxsb2NhdGVkIHRvIGhvbGQgYSBmYWtlIG5leHQgY2h1bmsgb2Ygc2l6ZSBTSVpFX1RfU0laRSB0byBtYWludGFpbgotICB0aGUgUElOVVNFIGJpdCBzbyBmcmVlcyBjYW4gYmUgY2hlY2tlZC4KLSovCi0KLS8qIE1hbGxvYyB1c2luZyBtbWFwICovCi1zdGF0aWMgdm9pZCogbW1hcF9hbGxvYyhtc3RhdGUgbSwgc2l6ZV90IG5iKSB7Ci0gIHNpemVfdCBtbXNpemUgPSBncmFudWxhcml0eV9hbGlnbihuYiArIFNJWF9TSVpFX1RfU0laRVMgKyBDSFVOS19BTElHTl9NQVNLKTsKLSAgaWYgKG1tc2l6ZSA+IG5iKSB7ICAgICAvKiBDaGVjayBmb3Igd3JhcCBhcm91bmQgMCAqLwotICAgIGNoYXIqIG1tID0gKGNoYXIqKShESVJFQ1RfTU1BUChtbXNpemUpKTsKLSAgICBpZiAobW0gIT0gQ01GQUlMKSB7Ci0gICAgICBzaXplX3Qgb2Zmc2V0ID0gYWxpZ25fb2Zmc2V0KGNodW5rMm1lbShtbSkpOwotICAgICAgc2l6ZV90IHBzaXplID0gbW1zaXplIC0gb2Zmc2V0IC0gTU1BUF9GT09UX1BBRDsKLSAgICAgIG1jaHVua3B0ciBwID0gKG1jaHVua3B0cikobW0gKyBvZmZzZXQpOwotICAgICAgcC0+cHJldl9mb290ID0gb2Zmc2V0IHwgSVNfTU1BUFBFRF9CSVQ7Ci0gICAgICAocCktPmhlYWQgPSAocHNpemV8Q0lOVVNFX0JJVCk7Ci0gICAgICBtYXJrX2ludXNlX2Zvb3QobSwgcCwgcHNpemUpOwotICAgICAgY2h1bmtfcGx1c19vZmZzZXQocCwgcHNpemUpLT5oZWFkID0gRkVOQ0VQT1NUX0hFQUQ7Ci0gICAgICBjaHVua19wbHVzX29mZnNldChwLCBwc2l6ZStTSVpFX1RfU0laRSktPmhlYWQgPSAwOwotCi0gICAgICBpZiAobW0gPCBtLT5sZWFzdF9hZGRyKQotICAgICAgICBtLT5sZWFzdF9hZGRyID0gbW07Ci0gICAgICBpZiAoKG0tPmZvb3RwcmludCArPSBtbXNpemUpID4gbS0+bWF4X2Zvb3RwcmludCkKLSAgICAgICAgbS0+bWF4X2Zvb3RwcmludCA9IG0tPmZvb3RwcmludDsKLSAgICAgIGFzc2VydChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpOwotICAgICAgY2hlY2tfbW1hcHBlZF9jaHVuayhtLCBwKTsKLSAgICAgIHJldHVybiBjaHVuazJtZW0ocCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZWFsbG9jIHVzaW5nIG1tYXAgKi8KLXN0YXRpYyBtY2h1bmtwdHIgbW1hcF9yZXNpemUobXN0YXRlIG0sIG1jaHVua3B0ciBvbGRwLCBzaXplX3QgbmIpIHsKLSAgc2l6ZV90IG9sZHNpemUgPSBjaHVua3NpemUob2xkcCk7Ci0gIGlmIChpc19zbWFsbChuYikpIC8qIENhbid0IHNocmluayBtbWFwIHJlZ2lvbnMgYmVsb3cgc21hbGwgc2l6ZSAqLwotICAgIHJldHVybiAwOwotICAvKiBLZWVwIG9sZCBjaHVuayBpZiBiaWcgZW5vdWdoIGJ1dCBub3QgdG9vIGJpZyAqLwotICBpZiAob2xkc2l6ZSA+PSBuYiArIFNJWkVfVF9TSVpFICYmCi0gICAgICAob2xkc2l6ZSAtIG5iKSA8PSAobXBhcmFtcy5ncmFudWxhcml0eSA8PCAxKSkKLSAgICByZXR1cm4gb2xkcDsKLSAgZWxzZSB7Ci0gICAgc2l6ZV90IG9mZnNldCA9IG9sZHAtPnByZXZfZm9vdCAmIH5JU19NTUFQUEVEX0JJVDsKLSAgICBzaXplX3Qgb2xkbW1zaXplID0gb2xkc2l6ZSArIG9mZnNldCArIE1NQVBfRk9PVF9QQUQ7Ci0gICAgc2l6ZV90IG5ld21tc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgU0lYX1NJWkVfVF9TSVpFUyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIVU5LX0FMSUdOX01BU0spOwotICAgIGNoYXIqIGNwID0gKGNoYXIqKUNBTExfTVJFTUFQKChjaGFyKilvbGRwIC0gb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZG1tc2l6ZSwgbmV3bW1zaXplLCAxKTsKLSAgICBpZiAoY3AgIT0gQ01GQUlMKSB7Ci0gICAgICBtY2h1bmtwdHIgbmV3cCA9IChtY2h1bmtwdHIpKGNwICsgb2Zmc2V0KTsKLSAgICAgIHNpemVfdCBwc2l6ZSA9IG5ld21tc2l6ZSAtIG9mZnNldCAtIE1NQVBfRk9PVF9QQUQ7Ci0gICAgICBuZXdwLT5oZWFkID0gKHBzaXplfENJTlVTRV9CSVQpOwotICAgICAgbWFya19pbnVzZV9mb290KG0sIG5ld3AsIHBzaXplKTsKLSAgICAgIGNodW5rX3BsdXNfb2Zmc2V0KG5ld3AsIHBzaXplKS0+aGVhZCA9IEZFTkNFUE9TVF9IRUFEOwotICAgICAgY2h1bmtfcGx1c19vZmZzZXQobmV3cCwgcHNpemUrU0laRV9UX1NJWkUpLT5oZWFkID0gMDsKLQotICAgICAgaWYgKGNwIDwgbS0+bGVhc3RfYWRkcikKLSAgICAgICAgbS0+bGVhc3RfYWRkciA9IGNwOwotICAgICAgaWYgKChtLT5mb290cHJpbnQgKz0gbmV3bW1zaXplIC0gb2xkbW1zaXplKSA+IG0tPm1heF9mb290cHJpbnQpCi0gICAgICAgIG0tPm1heF9mb290cHJpbnQgPSBtLT5mb290cHJpbnQ7Ci0gICAgICBjaGVja19tbWFwcGVkX2NodW5rKG0sIG5ld3ApOwotICAgICAgcmV0dXJuIG5ld3A7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtc3BhY2UgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBJbml0aWFsaXplIHRvcCBjaHVuayBhbmQgaXRzIHNpemUgKi8KLXN0YXRpYyB2b2lkIGluaXRfdG9wKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCwgc2l6ZV90IHBzaXplKSB7Ci0gIC8qIEVuc3VyZSBhbGlnbm1lbnQgKi8KLSAgc2l6ZV90IG9mZnNldCA9IGFsaWduX29mZnNldChjaHVuazJtZW0ocCkpOwotICBwID0gKG1jaHVua3B0cikoKGNoYXIqKXAgKyBvZmZzZXQpOwotICBwc2l6ZSAtPSBvZmZzZXQ7Ci0KLSAgbS0+dG9wID0gcDsKLSAgbS0+dG9wc2l6ZSA9IHBzaXplOwotICBwLT5oZWFkID0gcHNpemUgfCBQSU5VU0VfQklUOwotICAvKiBzZXQgc2l6ZSBvZiBmYWtlIHRyYWlsaW5nIGNodW5rIGhvbGRpbmcgb3ZlcmhlYWQgc3BhY2Ugb25seSBvbmNlICovCi0gIGNodW5rX3BsdXNfb2Zmc2V0KHAsIHBzaXplKS0+aGVhZCA9IFRPUF9GT09UX1NJWkU7Ci0gIG0tPnRyaW1fY2hlY2sgPSBtcGFyYW1zLnRyaW1fdGhyZXNob2xkOyAvKiByZXNldCBvbiBlYWNoIHVwZGF0ZSAqLwotfQotCi0vKiBJbml0aWFsaXplIGJpbnMgZm9yIGEgbmV3IG1zdGF0ZSB0aGF0IGlzIG90aGVyd2lzZSB6ZXJvZWQgb3V0ICovCi1zdGF0aWMgdm9pZCBpbml0X2JpbnMobXN0YXRlIG0pIHsKLSAgLyogRXN0YWJsaXNoIGNpcmN1bGFyIGxpbmtzIGZvciBzbWFsbGJpbnMgKi8KLSAgYmluZGV4X3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IE5TTUFMTEJJTlM7ICsraSkgewotICAgIHNiaW5wdHIgYmluID0gc21hbGxiaW5fYXQobSxpKTsKLSAgICBiaW4tPmZkID0gYmluLT5iayA9IGJpbjsKLSAgfQotfQotCi0jaWYgUFJPQ0VFRF9PTl9FUlJPUgotCi0vKiBkZWZhdWx0IGNvcnJ1cHRpb24gYWN0aW9uICovCi1zdGF0aWMgdm9pZCByZXNldF9vbl9lcnJvcihtc3RhdGUgbSkgewotICBpbnQgaTsKLSAgKyttYWxsb2NfY29ycnVwdGlvbl9lcnJvcl9jb3VudDsKLSAgLyogUmVpbml0aWFsaXplIGZpZWxkcyB0byBmb3JnZXQgYWJvdXQgYWxsIG1lbW9yeSAqLwotICBtLT5zbWFsbGJpbnMgPSBtLT50cmVlYmlucyA9IDA7Ci0gIG0tPmR2c2l6ZSA9IG0tPnRvcHNpemUgPSAwOwotICBtLT5zZWcuYmFzZSA9IDA7Ci0gIG0tPnNlZy5zaXplID0gMDsKLSAgbS0+c2VnLm5leHQgPSAwOwotICBtLT50b3AgPSBtLT5kdiA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBOVFJFRUJJTlM7ICsraSkKLSAgICAqdHJlZWJpbl9hdChtLCBpKSA9IDA7Ci0gIGluaXRfYmlucyhtKTsKLX0KLSNlbmRpZiAvKiBQUk9DRUVEX09OX0VSUk9SICovCi0KLS8qIEFsbG9jYXRlIGNodW5rIGFuZCBwcmVwZW5kIHJlbWFpbmRlciB3aXRoIGNodW5rIGluIHN1Y2Nlc3NvciBiYXNlLiAqLwotc3RhdGljIHZvaWQqIHByZXBlbmRfYWxsb2MobXN0YXRlIG0sIGNoYXIqIG5ld2Jhc2UsIGNoYXIqIG9sZGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmIpIHsKLSAgbWNodW5rcHRyIHAgPSBhbGlnbl9hc19jaHVuayhuZXdiYXNlKTsKLSAgbWNodW5rcHRyIG9sZGZpcnN0ID0gYWxpZ25fYXNfY2h1bmsob2xkYmFzZSk7Ci0gIHNpemVfdCBwc2l6ZSA9IChjaGFyKilvbGRmaXJzdCAtIChjaGFyKilwOwotICBtY2h1bmtwdHIgcSA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKLSAgc2l6ZV90IHFzaXplID0gcHNpemUgLSBuYjsKLSAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCBwLCBuYik7Ci0KLSAgYXNzZXJ0KChjaGFyKilvbGRmaXJzdCA+IChjaGFyKilxKTsKLSAgYXNzZXJ0KHBpbnVzZShvbGRmaXJzdCkpOwotICBhc3NlcnQocXNpemUgPj0gTUlOX0NIVU5LX1NJWkUpOwotCi0gIC8qIGNvbnNvbGlkYXRlIHJlbWFpbmRlciB3aXRoIGZpcnN0IGNodW5rIG9mIG9sZCBiYXNlICovCi0gIGlmIChvbGRmaXJzdCA9PSBtLT50b3ApIHsKLSAgICBzaXplX3QgdHNpemUgPSBtLT50b3BzaXplICs9IHFzaXplOwotICAgIG0tPnRvcCA9IHE7Ci0gICAgcS0+aGVhZCA9IHRzaXplIHwgUElOVVNFX0JJVDsKLSAgICBjaGVja190b3BfY2h1bmsobSwgcSk7Ci0gIH0KLSAgZWxzZSBpZiAob2xkZmlyc3QgPT0gbS0+ZHYpIHsKLSAgICBzaXplX3QgZHNpemUgPSBtLT5kdnNpemUgKz0gcXNpemU7Ci0gICAgbS0+ZHYgPSBxOwotICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhxLCBkc2l6ZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaWYgKCFjaW51c2Uob2xkZmlyc3QpKSB7Ci0gICAgICBzaXplX3QgbnNpemUgPSBjaHVua3NpemUob2xkZmlyc3QpOwotICAgICAgdW5saW5rX2NodW5rKG0sIG9sZGZpcnN0LCBuc2l6ZSk7Ci0gICAgICBvbGRmaXJzdCA9IGNodW5rX3BsdXNfb2Zmc2V0KG9sZGZpcnN0LCBuc2l6ZSk7Ci0gICAgICBxc2l6ZSArPSBuc2l6ZTsKLSAgICB9Ci0gICAgc2V0X2ZyZWVfd2l0aF9waW51c2UocSwgcXNpemUsIG9sZGZpcnN0KTsKLSAgICBpbnNlcnRfY2h1bmsobSwgcSwgcXNpemUpOwotICAgIGNoZWNrX2ZyZWVfY2h1bmsobSwgcSk7Ci0gIH0KLQotICBjaGVja19tYWxsb2NlZF9jaHVuayhtLCBjaHVuazJtZW0ocCksIG5iKTsKLSAgcmV0dXJuIGNodW5rMm1lbShwKTsKLX0KLQotCi0vKiBBZGQgYSBzZWdtZW50IHRvIGhvbGQgYSBuZXcgbm9uY29udGlndW91cyByZWdpb24gKi8KLXN0YXRpYyB2b2lkIGFkZF9zZWdtZW50KG1zdGF0ZSBtLCBjaGFyKiB0YmFzZSwgc2l6ZV90IHRzaXplLCBmbGFnX3QgbW1hcHBlZCkgewotICAvKiBEZXRlcm1pbmUgbG9jYXRpb25zIGFuZCBzaXplcyBvZiBzZWdtZW50LCBmZW5jZXBvc3RzLCBvbGQgdG9wICovCi0gIGNoYXIqIG9sZF90b3AgPSAoY2hhciopbS0+dG9wOwotICBtc2VnbWVudHB0ciBvbGRzcCA9IHNlZ21lbnRfaG9sZGluZyhtLCBvbGRfdG9wKTsKLSAgY2hhciogb2xkX2VuZCA9IG9sZHNwLT5iYXNlICsgb2xkc3AtPnNpemU7Ci0gIHNpemVfdCBzc2l6ZSA9IHBhZF9yZXF1ZXN0KHNpemVvZihzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQpKTsKLSAgY2hhciogcmF3c3AgPSBvbGRfZW5kIC0gKHNzaXplICsgRk9VUl9TSVpFX1RfU0laRVMgKyBDSFVOS19BTElHTl9NQVNLKTsKLSAgc2l6ZV90IG9mZnNldCA9IGFsaWduX29mZnNldChjaHVuazJtZW0ocmF3c3ApKTsKLSAgY2hhciogYXNwID0gcmF3c3AgKyBvZmZzZXQ7Ci0gIGNoYXIqIGNzcCA9IChhc3AgPCAob2xkX3RvcCArIE1JTl9DSFVOS19TSVpFKSk/IG9sZF90b3AgOiBhc3A7Ci0gIG1jaHVua3B0ciBzcCA9IChtY2h1bmtwdHIpY3NwOwotICBtc2VnbWVudHB0ciBzcyA9IChtc2VnbWVudHB0cikoY2h1bmsybWVtKHNwKSk7Ci0gIG1jaHVua3B0ciB0bmV4dCA9IGNodW5rX3BsdXNfb2Zmc2V0KHNwLCBzc2l6ZSk7Ci0gIG1jaHVua3B0ciBwID0gdG5leHQ7Ci0gIGludCBuZmVuY2VzID0gMDsKLQotICAvKiByZXNldCB0b3AgdG8gbmV3IHNwYWNlICovCi0gIGluaXRfdG9wKG0sIChtY2h1bmtwdHIpdGJhc2UsIHRzaXplIC0gVE9QX0ZPT1RfU0laRSk7Ci0KLSAgLyogU2V0IHVwIHNlZ21lbnQgcmVjb3JkICovCi0gIGFzc2VydChpc19hbGlnbmVkKHNzKSk7Ci0gIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgc3AsIHNzaXplKTsKLSAgKnNzID0gbS0+c2VnOyAvKiBQdXNoIGN1cnJlbnQgcmVjb3JkICovCi0gIG0tPnNlZy5iYXNlID0gdGJhc2U7Ci0gIG0tPnNlZy5zaXplID0gdHNpemU7Ci0gIG0tPnNlZy5zZmxhZ3MgPSBtbWFwcGVkOwotICBtLT5zZWcubmV4dCA9IHNzOwotCi0gIC8qIEluc2VydCB0cmFpbGluZyBmZW5jZXBvc3RzICovCi0gIGZvciAoOzspIHsKLSAgICBtY2h1bmtwdHIgbmV4dHAgPSBjaHVua19wbHVzX29mZnNldChwLCBTSVpFX1RfU0laRSk7Ci0gICAgcC0+aGVhZCA9IEZFTkNFUE9TVF9IRUFEOwotICAgICsrbmZlbmNlczsKLSAgICBpZiAoKGNoYXIqKSgmKG5leHRwLT5oZWFkKSkgPCBvbGRfZW5kKQotICAgICAgcCA9IG5leHRwOwotICAgIGVsc2UKLSAgICAgIGJyZWFrOwotICB9Ci0gIGFzc2VydChuZmVuY2VzID49IDIpOwotCi0gIC8qIEluc2VydCB0aGUgcmVzdCBvZiBvbGQgdG9wIGludG8gYSBiaW4gYXMgYW4gb3JkaW5hcnkgZnJlZSBjaHVuayAqLwotICBpZiAoY3NwICE9IG9sZF90b3ApIHsKLSAgICBtY2h1bmtwdHIgcSA9IChtY2h1bmtwdHIpb2xkX3RvcDsKLSAgICBzaXplX3QgcHNpemUgPSBjc3AgLSBvbGRfdG9wOwotICAgIG1jaHVua3B0ciB0biA9IGNodW5rX3BsdXNfb2Zmc2V0KHEsIHBzaXplKTsKLSAgICBzZXRfZnJlZV93aXRoX3BpbnVzZShxLCBwc2l6ZSwgdG4pOwotICAgIGluc2VydF9jaHVuayhtLCBxLCBwc2l6ZSk7Ci0gIH0KLQotICBjaGVja190b3BfY2h1bmsobSwgbS0+dG9wKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3lzdGVtIGFsbG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogR2V0IG1lbW9yeSBmcm9tIHN5c3RlbSB1c2luZyBNT1JFQ09SRSBvciBNTUFQICovCi1zdGF0aWMgdm9pZCogc3lzX2FsbG9jKG1zdGF0ZSBtLCBzaXplX3QgbmIpIHsKLSAgY2hhciogdGJhc2UgPSBDTUZBSUw7Ci0gIHNpemVfdCB0c2l6ZSA9IDA7Ci0gIGZsYWdfdCBtbWFwX2ZsYWcgPSAwOwotCi0gIGluaXRfbXBhcmFtcygpOwotCi0gIC8qIERpcmVjdGx5IG1hcCBsYXJnZSBjaHVua3MgKi8KLSAgaWYgKHVzZV9tbWFwKG0pICYmIG5iID49IG1wYXJhbXMubW1hcF90aHJlc2hvbGQpIHsKLSAgICB2b2lkKiBtZW0gPSBtbWFwX2FsbG9jKG0sIG5iKTsKLSAgICBpZiAobWVtICE9IDApCi0gICAgICByZXR1cm4gbWVtOwotICB9Ci0KLSAgLyoKLSAgICBUcnkgZ2V0dGluZyBtZW1vcnkgaW4gYW55IG9mIHRocmVlIHdheXMgKGluIG1vc3QtcHJlZmVycmVkIHRvCi0gICAgbGVhc3QtcHJlZmVycmVkIG9yZGVyKToKLSAgICAxLiBBIGNhbGwgdG8gTU9SRUNPUkUgdGhhdCBjYW4gbm9ybWFsbHkgY29udGlndW91c2x5IGV4dGVuZCBtZW1vcnkuCi0gICAgICAgKGRpc2FibGVkIGlmIG5vdCBNT1JFQ09SRV9DT05USUdVT1VTIG9yIG5vdCBIQVZFX01PUkVDT1JFIG9yCi0gICAgICAgb3IgbWFpbiBzcGFjZSBpcyBtbWFwcGVkIG9yIGEgcHJldmlvdXMgY29udGlndW91cyBjYWxsIGZhaWxlZCkKLSAgICAyLiBBIGNhbGwgdG8gTU1BUCBuZXcgc3BhY2UgKGRpc2FibGVkIGlmIG5vdCBIQVZFX01NQVApLgotICAgICAgIE5vdGUgdGhhdCB1bmRlciB0aGUgZGVmYXVsdCBzZXR0aW5ncywgaWYgTU9SRUNPUkUgaXMgdW5hYmxlIHRvCi0gICAgICAgZnVsZmlsbCBhIHJlcXVlc3QsIGFuZCBIQVZFX01NQVAgaXMgdHJ1ZSwgdGhlbiBtbWFwIGlzCi0gICAgICAgdXNlZCBhcyBhIG5vbmNvbnRpZ3VvdXMgc3lzdGVtIGFsbG9jYXRvci4gVGhpcyBpcyBhIHVzZWZ1bCBiYWNrdXAKLSAgICAgICBzdHJhdGVneSBmb3Igc3lzdGVtcyB3aXRoIGhvbGVzIGluIGFkZHJlc3Mgc3BhY2VzIC0tIGluIHRoaXMgY2FzZQotICAgICAgIHNicmsgY2Fubm90IGNvbnRpZ3VvdXNseSBleHBhbmQgdGhlIGhlYXAsIGJ1dCBtbWFwIG1heSBiZSBhYmxlIHRvCi0gICAgICAgZmluZCBzcGFjZS4KLSAgICAzLiBBIGNhbGwgdG8gTU9SRUNPUkUgdGhhdCBjYW5ub3QgdXN1YWxseSBjb250aWd1b3VzbHkgZXh0ZW5kIG1lbW9yeS4KLSAgICAgICAoZGlzYWJsZWQgaWYgbm90IEhBVkVfTU9SRUNPUkUpCi0gICovCi0KLSAgaWYgKE1PUkVDT1JFX0NPTlRJR1VPVVMgJiYgIXVzZV9ub25jb250aWd1b3VzKG0pKSB7Ci0gICAgY2hhciogYnIgPSBDTUZBSUw7Ci0gICAgbXNlZ21lbnRwdHIgc3MgPSAobS0+dG9wID09IDApPyAwIDogc2VnbWVudF9ob2xkaW5nKG0sIChjaGFyKiltLT50b3ApOwotICAgIHNpemVfdCBhc2l6ZSA9IDA7Ci0gICAgQUNRVUlSRV9NT1JFQ09SRV9MT0NLKCk7Ci0KLSAgICBpZiAoc3MgPT0gMCkgeyAgLyogRmlyc3QgdGltZSB0aHJvdWdoIG9yIHJlY292ZXJ5ICovCi0gICAgICBjaGFyKiBiYXNlID0gKGNoYXIqKUNBTExfTU9SRUNPUkUoMCk7Ci0gICAgICBpZiAoYmFzZSAhPSBDTUZBSUwpIHsKLSAgICAgICAgYXNpemUgPSBncmFudWxhcml0eV9hbGlnbihuYiArIFRPUF9GT09UX1NJWkUgKyBNQUxMT0NfQUxJR05NRU5UICsgU0laRV9UX09ORSk7Ci0gICAgICAgIC8qIEFkanVzdCB0byBlbmQgb24gYSBwYWdlIGJvdW5kYXJ5ICovCi0gICAgICAgIGlmICghaXNfcGFnZV9hbGlnbmVkKGJhc2UpKQotICAgICAgICAgIGFzaXplICs9IChwYWdlX2FsaWduKChzaXplX3QpYmFzZSkgLSAoc2l6ZV90KWJhc2UpOwotICAgICAgICAvKiBDYW4ndCBjYWxsIE1PUkVDT1JFIGlmIHNpemUgaXMgbmVnYXRpdmUgd2hlbiB0cmVhdGVkIGFzIHNpZ25lZCAqLwotICAgICAgICBpZiAoYXNpemUgPCBIQUxGX01BWF9TSVpFX1QgJiYKLSAgICAgICAgICAgIChiciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRShhc2l6ZSkpKSA9PSBiYXNlKSB7Ci0gICAgICAgICAgdGJhc2UgPSBiYXNlOwotICAgICAgICAgIHRzaXplID0gYXNpemU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBTdWJ0cmFjdCBvdXQgZXhpc3RpbmcgYXZhaWxhYmxlIHRvcCBzcGFjZSBmcm9tIE1PUkVDT1JFIHJlcXVlc3QuICovCi0gICAgICBhc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iIC0gbS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkUgKyBNQUxMT0NfQUxJR05NRU5UICsgU0laRV9UX09ORSk7Ci0gICAgICAvKiBVc2UgbWVtIGhlcmUgb25seSBpZiBpdCBkaWQgY29udGludW91c2x5IGV4dGVuZCBvbGQgc3BhY2UgKi8KLSAgICAgIGlmIChhc2l6ZSA8IEhBTEZfTUFYX1NJWkVfVCAmJgotICAgICAgICAgIChiciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRShhc2l6ZSkpKSA9PSBzcy0+YmFzZStzcy0+c2l6ZSkgewotICAgICAgICB0YmFzZSA9IGJyOwotICAgICAgICB0c2l6ZSA9IGFzaXplOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh0YmFzZSA9PSBDTUZBSUwpIHsgICAgLyogQ29wZSB3aXRoIHBhcnRpYWwgZmFpbHVyZSAqLwotICAgICAgaWYgKGJyICE9IENNRkFJTCkgeyAgICAvKiBUcnkgdG8gdXNlL2V4dGVuZCB0aGUgc3BhY2Ugd2UgZGlkIGdldCAqLwotICAgICAgICBpZiAoYXNpemUgPCBIQUxGX01BWF9TSVpFX1QgJiYKLSAgICAgICAgICAgIGFzaXplIDwgbmIgKyBUT1BfRk9PVF9TSVpFICsgU0laRV9UX09ORSkgewotICAgICAgICAgIHNpemVfdCBlc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgVE9QX0ZPT1RfU0laRSArIE1BTExPQ19BTElHTk1FTlQgKyBTSVpFX1RfT05FIC0gYXNpemUpOwotICAgICAgICAgIGlmIChlc2l6ZSA8IEhBTEZfTUFYX1NJWkVfVCkgewotICAgICAgICAgICAgY2hhciogZW5kID0gKGNoYXIqKUNBTExfTU9SRUNPUkUoZXNpemUpOwotICAgICAgICAgICAgaWYgKGVuZCAhPSBDTUZBSUwpCi0gICAgICAgICAgICAgIGFzaXplICs9IGVzaXplOwotICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgLyogQ2FuJ3QgdXNlOyB0cnkgdG8gcmVsZWFzZSAqLwotICAgICAgICAgICAgICBlbmQgPSAoY2hhciopQ0FMTF9NT1JFQ09SRSgtYXNpemUpOwotICAgICAgICAgICAgICBiciA9IENNRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChiciAhPSBDTUZBSUwpIHsgICAgLyogVXNlIHRoZSBzcGFjZSB3ZSBkaWQgZ2V0ICovCi0gICAgICAgIHRiYXNlID0gYnI7Ci0gICAgICAgIHRzaXplID0gYXNpemU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGRpc2FibGVfY29udGlndW91cyhtKTsgLyogRG9uJ3QgdHJ5IGNvbnRpZ3VvdXMgcGF0aCBpbiB0aGUgZnV0dXJlICovCi0gICAgfQotCi0gICAgUkVMRUFTRV9NT1JFQ09SRV9MT0NLKCk7Ci0gIH0KLQotICBpZiAoSEFWRV9NTUFQICYmIHRiYXNlID09IENNRkFJTCkgeyAgLyogVHJ5IE1NQVAgKi8KLSAgICBzaXplX3QgcmVxID0gbmIgKyBUT1BfRk9PVF9TSVpFICsgTUFMTE9DX0FMSUdOTUVOVCArIFNJWkVfVF9PTkU7Ci0gICAgc2l6ZV90IHJzaXplID0gZ3JhbnVsYXJpdHlfYWxpZ24ocmVxKTsKLSAgICBpZiAocnNpemUgPiBuYikgeyAvKiBGYWlsIGlmIHdyYXBzIGFyb3VuZCB6ZXJvICovCi0gICAgICBjaGFyKiBtcCA9IChjaGFyKikoQ0FMTF9NTUFQKHJzaXplKSk7Ci0gICAgICBpZiAobXAgIT0gQ01GQUlMKSB7Ci0gICAgICAgIHRiYXNlID0gbXA7Ci0gICAgICAgIHRzaXplID0gcnNpemU7Ci0gICAgICAgIG1tYXBfZmxhZyA9IElTX01NQVBQRURfQklUOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChIQVZFX01PUkVDT1JFICYmIHRiYXNlID09IENNRkFJTCkgeyAvKiBUcnkgbm9uY29udGlndW91cyBNT1JFQ09SRSAqLwotICAgIHNpemVfdCBhc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgVE9QX0ZPT1RfU0laRSArIE1BTExPQ19BTElHTk1FTlQgKyBTSVpFX1RfT05FKTsKLSAgICBpZiAoYXNpemUgPCBIQUxGX01BWF9TSVpFX1QpIHsKLSAgICAgIGNoYXIqIGJyID0gQ01GQUlMOwotICAgICAgY2hhciogZW5kID0gQ01GQUlMOwotICAgICAgQUNRVUlSRV9NT1JFQ09SRV9MT0NLKCk7Ci0gICAgICBiciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRShhc2l6ZSkpOwotICAgICAgZW5kID0gKGNoYXIqKShDQUxMX01PUkVDT1JFKDApKTsKLSAgICAgIFJFTEVBU0VfTU9SRUNPUkVfTE9DSygpOwotICAgICAgaWYgKGJyICE9IENNRkFJTCAmJiBlbmQgIT0gQ01GQUlMICYmIGJyIDwgZW5kKSB7Ci0gICAgICAgIHNpemVfdCBzc2l6ZSA9IGVuZCAtIGJyOwotICAgICAgICBpZiAoc3NpemUgPiBuYiArIFRPUF9GT09UX1NJWkUpIHsKLSAgICAgICAgICB0YmFzZSA9IGJyOwotICAgICAgICAgIHRzaXplID0gc3NpemU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAodGJhc2UgIT0gQ01GQUlMKSB7Ci0KLSAgICBpZiAoKG0tPmZvb3RwcmludCArPSB0c2l6ZSkgPiBtLT5tYXhfZm9vdHByaW50KQotICAgICAgbS0+bWF4X2Zvb3RwcmludCA9IG0tPmZvb3RwcmludDsKLQotICAgIGlmICghaXNfaW5pdGlhbGl6ZWQobSkpIHsgLyogZmlyc3QtdGltZSBpbml0aWFsaXphdGlvbiAqLwotICAgICAgbS0+c2VnLmJhc2UgPSBtLT5sZWFzdF9hZGRyID0gdGJhc2U7Ci0gICAgICBtLT5zZWcuc2l6ZSA9IHRzaXplOwotICAgICAgbS0+c2VnLnNmbGFncyA9IG1tYXBfZmxhZzsKLSAgICAgIG0tPm1hZ2ljID0gbXBhcmFtcy5tYWdpYzsKLSAgICAgIGluaXRfYmlucyhtKTsKLSAgICAgIGlmIChpc19nbG9iYWwobSkpIAotICAgICAgICBpbml0X3RvcChtLCAobWNodW5rcHRyKXRiYXNlLCB0c2l6ZSAtIFRPUF9GT09UX1NJWkUpOwotICAgICAgZWxzZSB7Ci0gICAgICAgIC8qIE9mZnNldCB0b3AgYnkgZW1iZWRkZWQgbWFsbG9jX3N0YXRlICovCi0gICAgICAgIG1jaHVua3B0ciBtbiA9IG5leHRfY2h1bmsobWVtMmNodW5rKG0pKTsKLSAgICAgICAgaW5pdF90b3AobSwgbW4sIChzaXplX3QpKCh0YmFzZSArIHRzaXplKSAtIChjaGFyKiltbikgLVRPUF9GT09UX1NJWkUpOwotICAgICAgfQotICAgIH0KLQotICAgIGVsc2UgewotICAgICAgLyogVHJ5IHRvIG1lcmdlIHdpdGggYW4gZXhpc3Rpbmcgc2VnbWVudCAqLwotICAgICAgbXNlZ21lbnRwdHIgc3AgPSAmbS0+c2VnOwotICAgICAgd2hpbGUgKHNwICE9IDAgJiYgdGJhc2UgIT0gc3AtPmJhc2UgKyBzcC0+c2l6ZSkKLSAgICAgICAgc3AgPSBzcC0+bmV4dDsKLSAgICAgIGlmIChzcCAhPSAwICYmCi0gICAgICAgICAgIWlzX2V4dGVybl9zZWdtZW50KHNwKSAmJgotICAgICAgICAgIChzcC0+c2ZsYWdzICYgSVNfTU1BUFBFRF9CSVQpID09IG1tYXBfZmxhZyAmJgotICAgICAgICAgIHNlZ21lbnRfaG9sZHMoc3AsIG0tPnRvcCkpIHsgLyogYXBwZW5kICovCi0gICAgICAgIHNwLT5zaXplICs9IHRzaXplOwotICAgICAgICBpbml0X3RvcChtLCBtLT50b3AsIG0tPnRvcHNpemUgKyB0c2l6ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKHRiYXNlIDwgbS0+bGVhc3RfYWRkcikKLSAgICAgICAgICBtLT5sZWFzdF9hZGRyID0gdGJhc2U7Ci0gICAgICAgIHNwID0gJm0tPnNlZzsKLSAgICAgICAgd2hpbGUgKHNwICE9IDAgJiYgc3AtPmJhc2UgIT0gdGJhc2UgKyB0c2l6ZSkKLSAgICAgICAgICBzcCA9IHNwLT5uZXh0OwotICAgICAgICBpZiAoc3AgIT0gMCAmJgotICAgICAgICAgICAgIWlzX2V4dGVybl9zZWdtZW50KHNwKSAmJgotICAgICAgICAgICAgKHNwLT5zZmxhZ3MgJiBJU19NTUFQUEVEX0JJVCkgPT0gbW1hcF9mbGFnKSB7Ci0gICAgICAgICAgY2hhciogb2xkYmFzZSA9IHNwLT5iYXNlOwotICAgICAgICAgIHNwLT5iYXNlID0gdGJhc2U7Ci0gICAgICAgICAgc3AtPnNpemUgKz0gdHNpemU7Ci0gICAgICAgICAgcmV0dXJuIHByZXBlbmRfYWxsb2MobSwgdGJhc2UsIG9sZGJhc2UsIG5iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgYWRkX3NlZ21lbnQobSwgdGJhc2UsIHRzaXplLCBtbWFwX2ZsYWcpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChuYiA8IG0tPnRvcHNpemUpIHsgLyogQWxsb2NhdGUgZnJvbSBuZXcgb3IgZXh0ZW5kZWQgdG9wIHNwYWNlICovCi0gICAgICBzaXplX3QgcnNpemUgPSBtLT50b3BzaXplIC09IG5iOwotICAgICAgbWNodW5rcHRyIHAgPSBtLT50b3A7Ci0gICAgICBtY2h1bmtwdHIgciA9IG0tPnRvcCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKLSAgICAgIHItPmhlYWQgPSByc2l6ZSB8IFBJTlVTRV9CSVQ7Ci0gICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIHAsIG5iKTsKLSAgICAgIGNoZWNrX3RvcF9jaHVuayhtLCBtLT50b3ApOwotICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobSwgY2h1bmsybWVtKHApLCBuYik7Ci0gICAgICByZXR1cm4gY2h1bmsybWVtKHApOwotICAgIH0KLSAgfQotCi0gIE1BTExPQ19GQUlMVVJFX0FDVElPTjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBzeXN0ZW0gZGVhbGxvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFVubWFwIGFuZCB1bmxpbmsgYW55IG1tYXBwZWQgc2VnbWVudHMgdGhhdCBkb24ndCBjb250YWluIHVzZWQgY2h1bmtzICovCi1zdGF0aWMgc2l6ZV90IHJlbGVhc2VfdW51c2VkX3NlZ21lbnRzKG1zdGF0ZSBtKSB7Ci0gIHNpemVfdCByZWxlYXNlZCA9IDA7Ci0gIG1zZWdtZW50cHRyIHByZWQgPSAmbS0+c2VnOwotICBtc2VnbWVudHB0ciBzcCA9IHByZWQtPm5leHQ7Ci0gIHdoaWxlIChzcCAhPSAwKSB7Ci0gICAgY2hhciogYmFzZSA9IHNwLT5iYXNlOwotICAgIHNpemVfdCBzaXplID0gc3AtPnNpemU7Ci0gICAgbXNlZ21lbnRwdHIgbmV4dCA9IHNwLT5uZXh0OwotICAgIGlmIChpc19tbWFwcGVkX3NlZ21lbnQoc3ApICYmICFpc19leHRlcm5fc2VnbWVudChzcCkpIHsKLSAgICAgIG1jaHVua3B0ciBwID0gYWxpZ25fYXNfY2h1bmsoYmFzZSk7Ci0gICAgICBzaXplX3QgcHNpemUgPSBjaHVua3NpemUocCk7Ci0gICAgICAvKiBDYW4gdW5tYXAgaWYgZmlyc3QgY2h1bmsgaG9sZHMgZW50aXJlIHNlZ21lbnQgYW5kIG5vdCBwaW5uZWQgKi8KLSAgICAgIGlmICghY2ludXNlKHApICYmIChjaGFyKilwICsgcHNpemUgPj0gYmFzZSArIHNpemUgLSBUT1BfRk9PVF9TSVpFKSB7Ci0gICAgICAgIHRjaHVua3B0ciB0cCA9ICh0Y2h1bmtwdHIpcDsKLSAgICAgICAgYXNzZXJ0KHNlZ21lbnRfaG9sZHMoc3AsIChjaGFyKilzcCkpOwotICAgICAgICBpZiAocCA9PSBtLT5kdikgewotICAgICAgICAgIG0tPmR2ID0gMDsKLSAgICAgICAgICBtLT5kdnNpemUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHVubGlua19sYXJnZV9jaHVuayhtLCB0cCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENBTExfTVVOTUFQKGJhc2UsIHNpemUpID09IDApIHsKLSAgICAgICAgICByZWxlYXNlZCArPSBzaXplOwotICAgICAgICAgIG0tPmZvb3RwcmludCAtPSBzaXplOwotICAgICAgICAgIC8qIHVubGluayBvYnNvbGV0ZWQgcmVjb3JkICovCi0gICAgICAgICAgc3AgPSBwcmVkOwotICAgICAgICAgIHNwLT5uZXh0ID0gbmV4dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsgLyogYmFjayBvdXQgaWYgY2Fubm90IHVubWFwICovCi0gICAgICAgICAgaW5zZXJ0X2xhcmdlX2NodW5rKG0sIHRwLCBwc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcHJlZCA9IHNwOwotICAgIHNwID0gbmV4dDsKLSAgfQotICByZXR1cm4gcmVsZWFzZWQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3lzX3RyaW0obXN0YXRlIG0sIHNpemVfdCBwYWQpIHsKLSAgc2l6ZV90IHJlbGVhc2VkID0gMDsKLSAgaWYgKHBhZCA8IE1BWF9SRVFVRVNUICYmIGlzX2luaXRpYWxpemVkKG0pKSB7Ci0gICAgcGFkICs9IFRPUF9GT09UX1NJWkU7IC8qIGVuc3VyZSBlbm91Z2ggcm9vbSBmb3Igc2VnbWVudCBvdmVyaGVhZCAqLwotCi0gICAgaWYgKG0tPnRvcHNpemUgPiBwYWQpIHsKLSAgICAgIC8qIFNocmluayB0b3Agc3BhY2UgaW4gZ3JhbnVsYXJpdHktc2l6ZSB1bml0cywga2VlcGluZyBhdCBsZWFzdCBvbmUgKi8KLSAgICAgIHNpemVfdCB1bml0ID0gbXBhcmFtcy5ncmFudWxhcml0eTsKLSAgICAgIHNpemVfdCBleHRyYSA9ICgobS0+dG9wc2l6ZSAtIHBhZCArICh1bml0IC0gU0laRV9UX09ORSkpIC8gdW5pdCAtCi0gICAgICAgICAgICAgICAgICAgICAgU0laRV9UX09ORSkgKiB1bml0OwotICAgICAgbXNlZ21lbnRwdHIgc3AgPSBzZWdtZW50X2hvbGRpbmcobSwgKGNoYXIqKW0tPnRvcCk7Ci0KLSAgICAgIGlmICghaXNfZXh0ZXJuX3NlZ21lbnQoc3ApKSB7Ci0gICAgICAgIGlmIChpc19tbWFwcGVkX3NlZ21lbnQoc3ApKSB7Ci0gICAgICAgICAgaWYgKEhBVkVfTU1BUCAmJgotICAgICAgICAgICAgICBzcC0+c2l6ZSA+PSBleHRyYSAmJgotICAgICAgICAgICAgICAhaGFzX3NlZ21lbnRfbGluayhtLCBzcCkpIHsgLyogY2FuJ3Qgc2hyaW5rIGlmIHBpbm5lZCAqLwotICAgICAgICAgICAgc2l6ZV90IG5ld3NpemUgPSBzcC0+c2l6ZSAtIGV4dHJhOwotICAgICAgICAgICAgLyogUHJlZmVyIG1yZW1hcCwgZmFsbCBiYWNrIHRvIG11bm1hcCAqLwotICAgICAgICAgICAgaWYgKChDQUxMX01SRU1BUChzcC0+YmFzZSwgc3AtPnNpemUsIG5ld3NpemUsIDApICE9IE1GQUlMKSB8fAotICAgICAgICAgICAgICAgIChDQUxMX01VTk1BUChzcC0+YmFzZSArIG5ld3NpemUsIGV4dHJhKSA9PSAwKSkgewotICAgICAgICAgICAgICByZWxlYXNlZCA9IGV4dHJhOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChIQVZFX01PUkVDT1JFKSB7Ci0gICAgICAgICAgaWYgKGV4dHJhID49IEhBTEZfTUFYX1NJWkVfVCkgLyogQXZvaWQgd3JhcHBpbmcgbmVnYXRpdmUgKi8KLSAgICAgICAgICAgIGV4dHJhID0gKEhBTEZfTUFYX1NJWkVfVCkgKyBTSVpFX1RfT05FIC0gdW5pdDsKLSAgICAgICAgICBBQ1FVSVJFX01PUkVDT1JFX0xPQ0soKTsKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBNYWtlIHN1cmUgZW5kIG9mIG1lbW9yeSBpcyB3aGVyZSB3ZSBsYXN0IHNldCBpdC4gKi8KLSAgICAgICAgICAgIGNoYXIqIG9sZF9iciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRSgwKSk7Ci0gICAgICAgICAgICBpZiAob2xkX2JyID09IHNwLT5iYXNlICsgc3AtPnNpemUpIHsKLSAgICAgICAgICAgICAgY2hhciogcmVsX2JyID0gKGNoYXIqKShDQUxMX01PUkVDT1JFKC1leHRyYSkpOwotICAgICAgICAgICAgICBjaGFyKiBuZXdfYnIgPSAoY2hhciopKENBTExfTU9SRUNPUkUoMCkpOwotICAgICAgICAgICAgICBpZiAocmVsX2JyICE9IENNRkFJTCAmJiBuZXdfYnIgPCBvbGRfYnIpCi0gICAgICAgICAgICAgICAgcmVsZWFzZWQgPSBvbGRfYnIgLSBuZXdfYnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIFJFTEVBU0VfTU9SRUNPUkVfTE9DSygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZWxlYXNlZCAhPSAwKSB7Ci0gICAgICAgIHNwLT5zaXplIC09IHJlbGVhc2VkOwotICAgICAgICBtLT5mb290cHJpbnQgLT0gcmVsZWFzZWQ7Ci0gICAgICAgIGluaXRfdG9wKG0sIG0tPnRvcCwgbS0+dG9wc2l6ZSAtIHJlbGVhc2VkKTsKLSAgICAgICAgY2hlY2tfdG9wX2NodW5rKG0sIG0tPnRvcCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogVW5tYXAgYW55IHVudXNlZCBtbWFwcGVkIHNlZ21lbnRzICovCi0gICAgaWYgKEhBVkVfTU1BUCkgCi0gICAgICByZWxlYXNlZCArPSByZWxlYXNlX3VudXNlZF9zZWdtZW50cyhtKTsKLQotICAgIC8qIE9uIGZhaWx1cmUsIGRpc2FibGUgYXV0b3RyaW0gdG8gYXZvaWQgcmVwZWF0ZWQgZmFpbGVkIGZ1dHVyZSBjYWxscyAqLwotICAgIGlmIChyZWxlYXNlZCA9PSAwKQotICAgICAgbS0+dHJpbV9jaGVjayA9IE1BWF9TSVpFX1Q7Ci0gIH0KLQotICByZXR1cm4gKHJlbGVhc2VkICE9IDApPyAxIDogMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtYWxsb2Mgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogYWxsb2NhdGUgYSBsYXJnZSByZXF1ZXN0IGZyb20gdGhlIGJlc3QgZml0dGluZyBjaHVuayBpbiBhIHRyZWViaW4gKi8KLXN0YXRpYyB2b2lkKiB0bWFsbG9jX2xhcmdlKG1zdGF0ZSBtLCBzaXplX3QgbmIpIHsKLSAgdGNodW5rcHRyIHYgPSAwOwotICBzaXplX3QgcnNpemUgPSAtbmI7IC8qIFVuc2lnbmVkIG5lZ2F0aW9uICovCi0gIHRjaHVua3B0ciB0OwotICBiaW5kZXhfdCBpZHg7Ci0gIGNvbXB1dGVfdHJlZV9pbmRleChuYiwgaWR4KTsKLQotICBpZiAoKHQgPSAqdHJlZWJpbl9hdChtLCBpZHgpKSAhPSAwKSB7Ci0gICAgLyogVHJhdmVyc2UgdHJlZSBmb3IgdGhpcyBiaW4gbG9va2luZyBmb3Igbm9kZSB3aXRoIHNpemUgPT0gbmIgKi8KLSAgICBzaXplX3Qgc2l6ZWJpdHMgPSBuYiA8PCBsZWZ0c2hpZnRfZm9yX3RyZWVfaW5kZXgoaWR4KTsKLSAgICB0Y2h1bmtwdHIgcnN0ID0gMDsgIC8qIFRoZSBkZWVwZXN0IHVudGFrZW4gcmlnaHQgc3VidHJlZSAqLwotICAgIGZvciAoOzspIHsKLSAgICAgIHRjaHVua3B0ciBydDsKLSAgICAgIHNpemVfdCB0cmVtID0gY2h1bmtzaXplKHQpIC0gbmI7Ci0gICAgICBpZiAodHJlbSA8IHJzaXplKSB7Ci0gICAgICAgIHYgPSB0OwotICAgICAgICBpZiAoKHJzaXplID0gdHJlbSkgPT0gMCkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHJ0ID0gdC0+Y2hpbGRbMV07Ci0gICAgICB0ID0gdC0+Y2hpbGRbKHNpemViaXRzID4+IChTSVpFX1RfQklUU0laRS1TSVpFX1RfT05FKSkgJiAxXTsKLSAgICAgIGlmIChydCAhPSAwICYmIHJ0ICE9IHQpCi0gICAgICAgIHJzdCA9IHJ0OwotICAgICAgaWYgKHQgPT0gMCkgewotICAgICAgICB0ID0gcnN0OyAvKiBzZXQgdCB0byBsZWFzdCBzdWJ0cmVlIGhvbGRpbmcgc2l6ZXMgPiBuYiAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHNpemViaXRzIDw8PSAxOwotICAgIH0KLSAgfQotCi0gIGlmICh0ID09IDAgJiYgdiA9PSAwKSB7IC8qIHNldCB0IHRvIHJvb3Qgb2YgbmV4dCBub24tZW1wdHkgdHJlZWJpbiAqLwotICAgIGJpbm1hcF90IGxlZnRiaXRzID0gbGVmdF9iaXRzKGlkeDJiaXQoaWR4KSkgJiBtLT50cmVlbWFwOwotICAgIGlmIChsZWZ0Yml0cyAhPSAwKSB7Ci0gICAgICBiaW5kZXhfdCBpOwotICAgICAgYmlubWFwX3QgbGVhc3RiaXQgPSBsZWFzdF9iaXQobGVmdGJpdHMpOwotICAgICAgY29tcHV0ZV9iaXQyaWR4KGxlYXN0Yml0LCBpKTsKLSAgICAgIHQgPSAqdHJlZWJpbl9hdChtLCBpKTsKLSAgICB9Ci0gIH0KLQotICB3aGlsZSAodCAhPSAwKSB7IC8qIGZpbmQgc21hbGxlc3Qgb2YgdHJlZSBvciBzdWJ0cmVlICovCi0gICAgc2l6ZV90IHRyZW0gPSBjaHVua3NpemUodCkgLSBuYjsKLSAgICBpZiAodHJlbSA8IHJzaXplKSB7Ci0gICAgICByc2l6ZSA9IHRyZW07Ci0gICAgICB2ID0gdDsKLSAgICB9Ci0gICAgdCA9IGxlZnRtb3N0X2NoaWxkKHQpOwotICB9Ci0KLSAgLyogIElmIGR2IGlzIGEgYmV0dGVyIGZpdCwgcmV0dXJuIDAgc28gbWFsbG9jIHdpbGwgdXNlIGl0ICovCi0gIGlmICh2ICE9IDAgJiYgcnNpemUgPCAoc2l6ZV90KShtLT5kdnNpemUgLSBuYikpIHsKLSAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKG0sIHYpKSkgeyAvKiBzcGxpdCAqLwotICAgICAgbWNodW5rcHRyIHIgPSBjaHVua19wbHVzX29mZnNldCh2LCBuYik7Ci0gICAgICBhc3NlcnQoY2h1bmtzaXplKHYpID09IHJzaXplICsgbmIpOwotICAgICAgaWYgKFJUQ0hFQ0sob2tfbmV4dCh2LCByKSkpIHsKLSAgICAgICAgdW5saW5rX2xhcmdlX2NodW5rKG0sIHYpOwotICAgICAgICBpZiAocnNpemUgPCBNSU5fQ0hVTktfU0laRSkKLSAgICAgICAgICBzZXRfaW51c2VfYW5kX3BpbnVzZShtLCB2LCAocnNpemUgKyBuYikpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIHYsIG5iKTsKLSAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsociwgcnNpemUpOwotICAgICAgICAgIGluc2VydF9jaHVuayhtLCByLCByc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNodW5rMm1lbSh2KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04obSk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIGFsbG9jYXRlIGEgc21hbGwgcmVxdWVzdCBmcm9tIHRoZSBiZXN0IGZpdHRpbmcgY2h1bmsgaW4gYSB0cmVlYmluICovCi1zdGF0aWMgdm9pZCogdG1hbGxvY19zbWFsbChtc3RhdGUgbSwgc2l6ZV90IG5iKSB7Ci0gIHRjaHVua3B0ciB0LCB2OwotICBzaXplX3QgcnNpemU7Ci0gIGJpbmRleF90IGk7Ci0gIGJpbm1hcF90IGxlYXN0Yml0ID0gbGVhc3RfYml0KG0tPnRyZWVtYXApOwotICBjb21wdXRlX2JpdDJpZHgobGVhc3RiaXQsIGkpOwotCi0gIHYgPSB0ID0gKnRyZWViaW5fYXQobSwgaSk7Ci0gIHJzaXplID0gY2h1bmtzaXplKHQpIC0gbmI7Ci0KLSAgd2hpbGUgKCh0ID0gbGVmdG1vc3RfY2hpbGQodCkpICE9IDApIHsKLSAgICBzaXplX3QgdHJlbSA9IGNodW5rc2l6ZSh0KSAtIG5iOwotICAgIGlmICh0cmVtIDwgcnNpemUpIHsKLSAgICAgIHJzaXplID0gdHJlbTsKLSAgICAgIHYgPSB0OwotICAgIH0KLSAgfQotCi0gIGlmIChSVENIRUNLKG9rX2FkZHJlc3MobSwgdikpKSB7Ci0gICAgbWNodW5rcHRyIHIgPSBjaHVua19wbHVzX29mZnNldCh2LCBuYik7Ci0gICAgYXNzZXJ0KGNodW5rc2l6ZSh2KSA9PSByc2l6ZSArIG5iKTsKLSAgICBpZiAoUlRDSEVDSyhva19uZXh0KHYsIHIpKSkgewotICAgICAgdW5saW5rX2xhcmdlX2NodW5rKG0sIHYpOwotICAgICAgaWYgKHJzaXplIDwgTUlOX0NIVU5LX1NJWkUpCi0gICAgICAgIHNldF9pbnVzZV9hbmRfcGludXNlKG0sIHYsIChyc2l6ZSArIG5iKSk7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCB2LCBuYik7Ci0gICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7Ci0gICAgICAgIHJlcGxhY2VfZHYobSwgciwgcnNpemUpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNodW5rMm1lbSh2KTsKLSAgICB9Ci0gIH0KLQotICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihtKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWFsbG9jIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkKiBpbnRlcm5hbF9yZWFsbG9jKG1zdGF0ZSBtLCB2b2lkKiBvbGRtZW0sIHNpemVfdCBieXRlcykgewotICBpZiAoYnl0ZXMgPj0gTUFYX1JFUVVFU1QpIHsKLSAgICBNQUxMT0NfRkFJTFVSRV9BQ1RJT047Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKCFQUkVBQ1RJT04obSkpIHsKLSAgICBtY2h1bmtwdHIgb2xkcCA9IG1lbTJjaHVuayhvbGRtZW0pOwotICAgIHNpemVfdCBvbGRzaXplID0gY2h1bmtzaXplKG9sZHApOwotICAgIG1jaHVua3B0ciBuZXh0ID0gY2h1bmtfcGx1c19vZmZzZXQob2xkcCwgb2xkc2l6ZSk7Ci0gICAgbWNodW5rcHRyIG5ld3AgPSAwOwotICAgIHZvaWQqIGV4dHJhID0gMDsKLQotICAgIC8qIFRyeSB0byBlaXRoZXIgc2hyaW5rIG9yIGV4dGVuZCBpbnRvIHRvcC4gRWxzZSBtYWxsb2MtY29weS1mcmVlICovCi0KLSAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKG0sIG9sZHApICYmIG9rX2NpbnVzZShvbGRwKSAmJgotICAgICAgICAgICAgICAgIG9rX25leHQob2xkcCwgbmV4dCkgJiYgb2tfcGludXNlKG5leHQpKSkgewotICAgICAgc2l6ZV90IG5iID0gcmVxdWVzdDJzaXplKGJ5dGVzKTsKLSAgICAgIGlmIChpc19tbWFwcGVkKG9sZHApKQotICAgICAgICBuZXdwID0gbW1hcF9yZXNpemUobSwgb2xkcCwgbmIpOwotICAgICAgZWxzZSBpZiAob2xkc2l6ZSA+PSBuYikgeyAvKiBhbHJlYWR5IGJpZyBlbm91Z2ggKi8KLSAgICAgICAgc2l6ZV90IHJzaXplID0gb2xkc2l6ZSAtIG5iOwotICAgICAgICBuZXdwID0gb2xkcDsKLSAgICAgICAgaWYgKHJzaXplID49IE1JTl9DSFVOS19TSVpFKSB7Ci0gICAgICAgICAgbWNodW5rcHRyIHJlbWFpbmRlciA9IGNodW5rX3BsdXNfb2Zmc2V0KG5ld3AsIG5iKTsKLSAgICAgICAgICBzZXRfaW51c2UobSwgbmV3cCwgbmIpOwotICAgICAgICAgIHNldF9pbnVzZShtLCByZW1haW5kZXIsIHJzaXplKTsKLSAgICAgICAgICBleHRyYSA9IGNodW5rMm1lbShyZW1haW5kZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXh0ID09IG0tPnRvcCAmJiBvbGRzaXplICsgbS0+dG9wc2l6ZSA+IG5iKSB7Ci0gICAgICAgIC8qIEV4cGFuZCBpbnRvIHRvcCAqLwotICAgICAgICBzaXplX3QgbmV3c2l6ZSA9IG9sZHNpemUgKyBtLT50b3BzaXplOwotICAgICAgICBzaXplX3QgbmV3dG9wc2l6ZSA9IG5ld3NpemUgLSBuYjsKLSAgICAgICAgbWNodW5rcHRyIG5ld3RvcCA9IGNodW5rX3BsdXNfb2Zmc2V0KG9sZHAsIG5iKTsKLSAgICAgICAgc2V0X2ludXNlKG0sIG9sZHAsIG5iKTsKLSAgICAgICAgbmV3dG9wLT5oZWFkID0gbmV3dG9wc2l6ZSB8UElOVVNFX0JJVDsKLSAgICAgICAgbS0+dG9wID0gbmV3dG9wOwotICAgICAgICBtLT50b3BzaXplID0gbmV3dG9wc2l6ZTsKLSAgICAgICAgbmV3cCA9IG9sZHA7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgVVNBR0VfRVJST1JfQUNUSU9OKG0sIG9sZG1lbSk7Ci0gICAgICBQT1NUQUNUSU9OKG0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUE9TVEFDVElPTihtKTsKLQotICAgIGlmIChuZXdwICE9IDApIHsKLSAgICAgIGlmIChleHRyYSAhPSAwKSB7Ci0gICAgICAgIGludGVybmFsX2ZyZWUobSwgZXh0cmEpOwotICAgICAgfQotICAgICAgY2hlY2tfaW51c2VfY2h1bmsobSwgbmV3cCk7Ci0gICAgICByZXR1cm4gY2h1bmsybWVtKG5ld3ApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHZvaWQqIG5ld21lbSA9IGludGVybmFsX21hbGxvYyhtLCBieXRlcyk7Ci0gICAgICBpZiAobmV3bWVtICE9IDApIHsKLSAgICAgICAgc2l6ZV90IG9jID0gb2xkc2l6ZSAtIG92ZXJoZWFkX2ZvcihvbGRwKTsKLSAgICAgICAgbWVtY3B5KG5ld21lbSwgb2xkbWVtLCAob2MgPCBieXRlcyk/IG9jIDogYnl0ZXMpOwotICAgICAgICBpbnRlcm5hbF9mcmVlKG0sIG9sZG1lbSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3bWVtOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lbWFsaWduIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQqIGludGVybmFsX21lbWFsaWduKG1zdGF0ZSBtLCBzaXplX3QgYWxpZ25tZW50LCBzaXplX3QgYnl0ZXMpIHsKLSAgaWYgKGFsaWdubWVudCA8PSBNQUxMT0NfQUxJR05NRU5UKSAgICAvKiBDYW4ganVzdCB1c2UgbWFsbG9jICovCi0gICAgcmV0dXJuIGludGVybmFsX21hbGxvYyhtLCBieXRlcyk7Ci0gIGlmIChhbGlnbm1lbnQgPCAgTUlOX0NIVU5LX1NJWkUpIC8qIG11c3QgYmUgYXQgbGVhc3QgYSBtaW5pbXVtIGNodW5rIHNpemUgKi8KLSAgICBhbGlnbm1lbnQgPSBNSU5fQ0hVTktfU0laRTsKLSAgaWYgKChhbGlnbm1lbnQgJiAoYWxpZ25tZW50LVNJWkVfVF9PTkUpKSAhPSAwKSB7LyogRW5zdXJlIGEgcG93ZXIgb2YgMiAqLwotICAgIHNpemVfdCBhID0gTUFMTE9DX0FMSUdOTUVOVCA8PCAxOwotICAgIHdoaWxlIChhIDwgYWxpZ25tZW50KSBhIDw8PSAxOwotICAgIGFsaWdubWVudCA9IGE7Ci0gIH0KLSAgCi0gIGlmIChieXRlcyA+PSBNQVhfUkVRVUVTVCAtIGFsaWdubWVudCkgewotICAgIGlmIChtICE9IDApICB7IC8qIFRlc3QgaXNuJ3QgbmVlZGVkIGJ1dCBhdm9pZHMgY29tcGlsZXIgd2FybmluZyAqLwotICAgICAgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBzaXplX3QgbmIgPSByZXF1ZXN0MnNpemUoYnl0ZXMpOwotICAgIHNpemVfdCByZXEgPSBuYiArIGFsaWdubWVudCArIE1JTl9DSFVOS19TSVpFIC0gQ0hVTktfT1ZFUkhFQUQ7Ci0gICAgY2hhciogbWVtID0gKGNoYXIqKWludGVybmFsX21hbGxvYyhtLCByZXEpOwotICAgIGlmIChtZW0gIT0gMCkgewotICAgICAgdm9pZCogbGVhZGVyID0gMDsKLSAgICAgIHZvaWQqIHRyYWlsZXIgPSAwOwotICAgICAgbWNodW5rcHRyIHAgPSBtZW0yY2h1bmsobWVtKTsKLQotICAgICAgaWYgKFBSRUFDVElPTihtKSkgcmV0dXJuIDA7Ci0gICAgICBpZiAoKCgoc2l6ZV90KShtZW0pKSAlIGFsaWdubWVudCkgIT0gMCkgeyAvKiBtaXNhbGlnbmVkICovCi0gICAgICAgIC8qCi0gICAgICAgICAgRmluZCBhbiBhbGlnbmVkIHNwb3QgaW5zaWRlIGNodW5rLiAgU2luY2Ugd2UgbmVlZCB0byBnaXZlCi0gICAgICAgICAgYmFjayBsZWFkaW5nIHNwYWNlIGluIGEgY2h1bmsgb2YgYXQgbGVhc3QgTUlOX0NIVU5LX1NJWkUsIGlmCi0gICAgICAgICAgdGhlIGZpcnN0IGNhbGN1bGF0aW9uIHBsYWNlcyB1cyBhdCBhIHNwb3Qgd2l0aCBsZXNzIHRoYW4KLSAgICAgICAgICBNSU5fQ0hVTktfU0laRSBsZWFkZXIsIHdlIGNhbiBtb3ZlIHRvIHRoZSBuZXh0IGFsaWduZWQgc3BvdC4KLSAgICAgICAgICBXZSd2ZSBhbGxvY2F0ZWQgZW5vdWdoIHRvdGFsIHJvb20gc28gdGhhdCB0aGlzIGlzIGFsd2F5cwotICAgICAgICAgIHBvc3NpYmxlLgotICAgICAgICAqLwotICAgICAgICBjaGFyKiBiciA9IChjaGFyKiltZW0yY2h1bmsoKHNpemVfdCkoKChzaXplX3QpKG1lbSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFX1RfT05FKSkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWFsaWdubWVudCkpOwotICAgICAgICBjaGFyKiBwb3MgPSAoKHNpemVfdCkoYnIgLSAoY2hhciopKHApKSA+PSBNSU5fQ0hVTktfU0laRSk/Ci0gICAgICAgICAgYnIgOiBicithbGlnbm1lbnQ7Ci0gICAgICAgIG1jaHVua3B0ciBuZXdwID0gKG1jaHVua3B0cilwb3M7Ci0gICAgICAgIHNpemVfdCBsZWFkc2l6ZSA9IHBvcyAtIChjaGFyKikocCk7Ci0gICAgICAgIHNpemVfdCBuZXdzaXplID0gY2h1bmtzaXplKHApIC0gbGVhZHNpemU7Ci0KLSAgICAgICAgaWYgKGlzX21tYXBwZWQocCkpIHsgLyogRm9yIG1tYXBwZWQgY2h1bmtzLCBqdXN0IGFkanVzdCBvZmZzZXQgKi8KLSAgICAgICAgICBuZXdwLT5wcmV2X2Zvb3QgPSBwLT5wcmV2X2Zvb3QgKyBsZWFkc2l6ZTsKLSAgICAgICAgICBuZXdwLT5oZWFkID0gKG5ld3NpemV8Q0lOVVNFX0JJVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7IC8qIE90aGVyd2lzZSwgZ2l2ZSBiYWNrIGxlYWRlciwgdXNlIHRoZSByZXN0ICovCi0gICAgICAgICAgc2V0X2ludXNlKG0sIG5ld3AsIG5ld3NpemUpOwotICAgICAgICAgIHNldF9pbnVzZShtLCBwLCBsZWFkc2l6ZSk7Ci0gICAgICAgICAgbGVhZGVyID0gY2h1bmsybWVtKHApOwotICAgICAgICB9Ci0gICAgICAgIHAgPSBuZXdwOwotICAgICAgfQotCi0gICAgICAvKiBHaXZlIGJhY2sgc3BhcmUgcm9vbSBhdCB0aGUgZW5kICovCi0gICAgICBpZiAoIWlzX21tYXBwZWQocCkpIHsKLSAgICAgICAgc2l6ZV90IHNpemUgPSBjaHVua3NpemUocCk7Ci0gICAgICAgIGlmIChzaXplID4gbmIgKyBNSU5fQ0hVTktfU0laRSkgewotICAgICAgICAgIHNpemVfdCByZW1haW5kZXJfc2l6ZSA9IHNpemUgLSBuYjsKLSAgICAgICAgICBtY2h1bmtwdHIgcmVtYWluZGVyID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOwotICAgICAgICAgIHNldF9pbnVzZShtLCBwLCBuYik7Ci0gICAgICAgICAgc2V0X2ludXNlKG0sIHJlbWFpbmRlciwgcmVtYWluZGVyX3NpemUpOwotICAgICAgICAgIHRyYWlsZXIgPSBjaHVuazJtZW0ocmVtYWluZGVyKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBhc3NlcnQgKGNodW5rc2l6ZShwKSA+PSBuYik7Ci0gICAgICBhc3NlcnQoKCgoc2l6ZV90KShjaHVuazJtZW0ocCkpKSAlIGFsaWdubWVudCkgPT0gMCk7Ci0gICAgICBjaGVja19pbnVzZV9jaHVuayhtLCBwKTsKLSAgICAgIFBPU1RBQ1RJT04obSk7Ci0gICAgICBpZiAobGVhZGVyICE9IDApIHsKLSAgICAgICAgaW50ZXJuYWxfZnJlZShtLCBsZWFkZXIpOwotICAgICAgfQotICAgICAgaWYgKHRyYWlsZXIgIT0gMCkgewotICAgICAgICBpbnRlcm5hbF9mcmVlKG0sIHRyYWlsZXIpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNodW5rMm1lbShwKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb21hbGxvYy9jb2FsbG9jIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkKiogaWFsbG9jKG1zdGF0ZSBtLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5fZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHNpemVzLAotICAgICAgICAgICAgICAgICAgICAgaW50IG9wdHMsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkKiBjaHVua3NbXSkgewotICAvKgotICAgIFRoaXMgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIGluZGVwZW5kZW50X1ggcm91dGluZXMsIGhhbmRsaW5nCi0gICAgYWxsIG9mIHRoZSBjb21iaW5hdGlvbnMgdGhhdCBjYW4gcmVzdWx0LgotCi0gICAgVGhlIG9wdHMgYXJnIGhhczoKLSAgICBiaXQgMCBzZXQgaWYgYWxsIGVsZW1lbnRzIGFyZSBzYW1lIHNpemUgKHVzaW5nIHNpemVzWzBdKQotICAgIGJpdCAxIHNldCBpZiBlbGVtZW50cyBzaG91bGQgYmUgemVyb2VkCi0gICovCi0KLSAgc2l6ZV90ICAgIGVsZW1lbnRfc2l6ZTsgICAvKiBjaHVua3NpemUgb2YgZWFjaCBlbGVtZW50LCBpZiBhbGwgc2FtZSAqLwotICBzaXplX3QgICAgY29udGVudHNfc2l6ZTsgIC8qIHRvdGFsIHNpemUgb2YgZWxlbWVudHMgKi8KLSAgc2l6ZV90ICAgIGFycmF5X3NpemU7ICAgICAvKiByZXF1ZXN0IHNpemUgb2YgcG9pbnRlciBhcnJheSAqLwotICB2b2lkKiAgICAgbWVtOyAgICAgICAgICAgIC8qIG1hbGxvY2VkIGFnZ3JlZ2F0ZSBzcGFjZSAqLwotICBtY2h1bmtwdHIgcDsgICAgICAgICAgICAgIC8qIGNvcnJlc3BvbmRpbmcgY2h1bmsgKi8KLSAgc2l6ZV90ICAgIHJlbWFpbmRlcl9zaXplOyAvKiByZW1haW5pbmcgYnl0ZXMgd2hpbGUgc3BsaXR0aW5nICovCi0gIHZvaWQqKiAgICBtYXJyYXk7ICAgICAgICAgLyogZWl0aGVyICJjaHVua3MiIG9yIG1hbGxvY2VkIHB0ciBhcnJheSAqLwotICBtY2h1bmtwdHIgYXJyYXlfY2h1bms7ICAgIC8qIGNodW5rIGZvciBtYWxsb2NlZCBwdHIgYXJyYXkgKi8KLSAgZmxhZ190ICAgIHdhc19lbmFibGVkOyAgICAvKiB0byBkaXNhYmxlIG1tYXAgKi8KLSAgc2l6ZV90ICAgIHNpemU7Ci0gIHNpemVfdCAgICBpOwotCi0gIC8qIGNvbXB1dGUgYXJyYXkgbGVuZ3RoLCBpZiBuZWVkZWQgKi8KLSAgaWYgKGNodW5rcyAhPSAwKSB7Ci0gICAgaWYgKG5fZWxlbWVudHMgPT0gMCkKLSAgICAgIHJldHVybiBjaHVua3M7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICBtYXJyYXkgPSBjaHVua3M7Ci0gICAgYXJyYXlfc2l6ZSA9IDA7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogaWYgZW1wdHkgcmVxLCBtdXN0IHN0aWxsIHJldHVybiBjaHVuayByZXByZXNlbnRpbmcgZW1wdHkgYXJyYXkgKi8KLSAgICBpZiAobl9lbGVtZW50cyA9PSAwKQotICAgICAgcmV0dXJuICh2b2lkKiopaW50ZXJuYWxfbWFsbG9jKG0sIDApOwotICAgIG1hcnJheSA9IDA7Ci0gICAgYXJyYXlfc2l6ZSA9IHJlcXVlc3Qyc2l6ZShuX2VsZW1lbnRzICogKHNpemVvZih2b2lkKikpKTsKLSAgfQotCi0gIC8qIGNvbXB1dGUgdG90YWwgZWxlbWVudCBzaXplICovCi0gIGlmIChvcHRzICYgMHgxKSB7IC8qIGFsbC1zYW1lLXNpemUgKi8KLSAgICBlbGVtZW50X3NpemUgPSByZXF1ZXN0MnNpemUoKnNpemVzKTsKLSAgICBjb250ZW50c19zaXplID0gbl9lbGVtZW50cyAqIGVsZW1lbnRfc2l6ZTsKLSAgfQotICBlbHNlIHsgLyogYWRkIHVwIGFsbCB0aGUgc2l6ZXMgKi8KLSAgICBlbGVtZW50X3NpemUgPSAwOwotICAgIGNvbnRlbnRzX3NpemUgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgIT0gbl9lbGVtZW50czsgKytpKQotICAgICAgY29udGVudHNfc2l6ZSArPSByZXF1ZXN0MnNpemUoc2l6ZXNbaV0pOwotICB9Ci0KLSAgc2l6ZSA9IGNvbnRlbnRzX3NpemUgKyBhcnJheV9zaXplOwotCi0gIC8qCi0gICAgIEFsbG9jYXRlIHRoZSBhZ2dyZWdhdGUgY2h1bmsuICBGaXJzdCBkaXNhYmxlIGRpcmVjdC1tbWFwcGluZyBzbwotICAgICBtYWxsb2Mgd29uJ3QgdXNlIGl0LCBzaW5jZSB3ZSB3b3VsZCBub3QgYmUgYWJsZSB0byBsYXRlcgotICAgICBmcmVlL3JlYWxsb2Mgc3BhY2UgaW50ZXJuYWwgdG8gYSBzZWdyZWdhdGVkIG1tYXAgcmVnaW9uLgotICAqLwotICB3YXNfZW5hYmxlZCA9IHVzZV9tbWFwKG0pOwotICBkaXNhYmxlX21tYXAobSk7Ci0gIG1lbSA9IGludGVybmFsX21hbGxvYyhtLCBzaXplIC0gQ0hVTktfT1ZFUkhFQUQpOwotICBpZiAod2FzX2VuYWJsZWQpCi0gICAgZW5hYmxlX21tYXAobSk7Ci0gIGlmIChtZW0gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoUFJFQUNUSU9OKG0pKSByZXR1cm4gMDsKLSAgcCA9IG1lbTJjaHVuayhtZW0pOwotICByZW1haW5kZXJfc2l6ZSA9IGNodW5rc2l6ZShwKTsKLQotICBhc3NlcnQoIWlzX21tYXBwZWQocCkpOwotCi0gIGlmIChvcHRzICYgMHgyKSB7ICAgICAgIC8qIG9wdGlvbmFsbHkgY2xlYXIgdGhlIGVsZW1lbnRzICovCi0gICAgbWVtc2V0KChzaXplX3QqKW1lbSwgMCwgcmVtYWluZGVyX3NpemUgLSBTSVpFX1RfU0laRSAtIGFycmF5X3NpemUpOwotICB9Ci0KLSAgLyogSWYgbm90IHByb3ZpZGVkLCBhbGxvY2F0ZSB0aGUgcG9pbnRlciBhcnJheSBhcyBmaW5hbCBwYXJ0IG9mIGNodW5rICovCi0gIGlmIChtYXJyYXkgPT0gMCkgewotICAgIHNpemVfdCAgYXJyYXlfY2h1bmtfc2l6ZTsKLSAgICBhcnJheV9jaHVuayA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIGNvbnRlbnRzX3NpemUpOwotICAgIGFycmF5X2NodW5rX3NpemUgPSByZW1haW5kZXJfc2l6ZSAtIGNvbnRlbnRzX3NpemU7Ci0gICAgbWFycmF5ID0gKHZvaWQqKikgKGNodW5rMm1lbShhcnJheV9jaHVuaykpOwotICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgYXJyYXlfY2h1bmssIGFycmF5X2NodW5rX3NpemUpOwotICAgIHJlbWFpbmRlcl9zaXplID0gY29udGVudHNfc2l6ZTsKLSAgfQotCi0gIC8qIHNwbGl0IG91dCBlbGVtZW50cyAqLwotICBmb3IgKGkgPSAwOyA7ICsraSkgewotICAgIG1hcnJheVtpXSA9IGNodW5rMm1lbShwKTsKLSAgICBpZiAoaSAhPSBuX2VsZW1lbnRzLTEpIHsKLSAgICAgIGlmIChlbGVtZW50X3NpemUgIT0gMCkKLSAgICAgICAgc2l6ZSA9IGVsZW1lbnRfc2l6ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2l6ZSA9IHJlcXVlc3Qyc2l6ZShzaXplc1tpXSk7Ci0gICAgICByZW1haW5kZXJfc2l6ZSAtPSBzaXplOwotICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCBwLCBzaXplKTsKLSAgICAgIHAgPSBjaHVua19wbHVzX29mZnNldChwLCBzaXplKTsKLSAgICB9Ci0gICAgZWxzZSB7IC8qIHRoZSBmaW5hbCBlbGVtZW50IGFic29yYnMgYW55IG92ZXJhbGxvY2F0aW9uIHNsb3AgKi8KLSAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgcCwgcmVtYWluZGVyX3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSNpZiBERUJVRwotICBpZiAobWFycmF5ICE9IGNodW5rcykgewotICAgIC8qIGZpbmFsIGVsZW1lbnQgbXVzdCBoYXZlIGV4YWN0bHkgZXhoYXVzdGVkIGNodW5rICovCi0gICAgaWYgKGVsZW1lbnRfc2l6ZSAhPSAwKSB7Ci0gICAgICBhc3NlcnQocmVtYWluZGVyX3NpemUgPT0gZWxlbWVudF9zaXplKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBhc3NlcnQocmVtYWluZGVyX3NpemUgPT0gcmVxdWVzdDJzaXplKHNpemVzW2ldKSk7Ci0gICAgfQotICAgIGNoZWNrX2ludXNlX2NodW5rKG0sIG1lbTJjaHVuayhtYXJyYXkpKTsKLSAgfQotICBmb3IgKGkgPSAwOyBpICE9IG5fZWxlbWVudHM7ICsraSkKLSAgICBjaGVja19pbnVzZV9jaHVuayhtLCBtZW0yY2h1bmsobWFycmF5W2ldKSk7Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIFBPU1RBQ1RJT04obSk7Ci0gIHJldHVybiBtYXJyYXk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHVibGljIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmICFPTkxZX01TUEFDRVMKLQotdm9pZCogZGxtYWxsb2Moc2l6ZV90IGJ5dGVzKSB7Ci0gIC8qCi0gICAgIEJhc2ljIGFsZ29yaXRobToKLSAgICAgSWYgYSBzbWFsbCByZXF1ZXN0ICg8IDI1NiBieXRlcyBtaW51cyBwZXItY2h1bmsgb3ZlcmhlYWQpOgotICAgICAgIDEuIElmIG9uZSBleGlzdHMsIHVzZSBhIHJlbWFpbmRlcmxlc3MgY2h1bmsgaW4gYXNzb2NpYXRlZCBzbWFsbGJpbi4KLSAgICAgICAgICAoUmVtYWluZGVybGVzcyBtZWFucyB0aGF0IHRoZXJlIGFyZSB0b28gZmV3IGV4Y2VzcyBieXRlcyB0bwotICAgICAgICAgIHJlcHJlc2VudCBhcyBhIGNodW5rLikKLSAgICAgICAyLiBJZiBpdCBpcyBiaWcgZW5vdWdoLCB1c2UgdGhlIGR2IGNodW5rLCB3aGljaCBpcyBub3JtYWxseSB0aGUKLSAgICAgICAgICBjaHVuayBhZGphY2VudCB0byB0aGUgb25lIHVzZWQgZm9yIHRoZSBtb3N0IHJlY2VudCBzbWFsbCByZXF1ZXN0LgotICAgICAgIDMuIElmIG9uZSBleGlzdHMsIHNwbGl0IHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgY2h1bmsgaW4gYSBiaW4sCi0gICAgICAgICAgc2F2aW5nIHJlbWFpbmRlciBpbiBkdi4KLSAgICAgICA0LiBJZiBpdCBpcyBiaWcgZW5vdWdoLCB1c2UgdGhlIHRvcCBjaHVuay4KLSAgICAgICA1LiBJZiBhdmFpbGFibGUsIGdldCBtZW1vcnkgZnJvbSBzeXN0ZW0gYW5kIHVzZSBpdAotICAgICBPdGhlcndpc2UsIGZvciBhIGxhcmdlIHJlcXVlc3Q6Ci0gICAgICAgMS4gRmluZCB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIGJpbm5lZCBjaHVuayB0aGF0IGZpdHMsIGFuZCB1c2UgaXQKLSAgICAgICAgICBpZiBpdCBpcyBiZXR0ZXIgZml0dGluZyB0aGFuIGR2IGNodW5rLCBzcGxpdHRpbmcgaWYgbmVjZXNzYXJ5LgotICAgICAgIDIuIElmIGJldHRlciBmaXR0aW5nIHRoYW4gYW55IGJpbm5lZCBjaHVuaywgdXNlIHRoZSBkdiBjaHVuay4KLSAgICAgICAzLiBJZiBpdCBpcyBiaWcgZW5vdWdoLCB1c2UgdGhlIHRvcCBjaHVuay4KLSAgICAgICA0LiBJZiByZXF1ZXN0IHNpemUgPj0gbW1hcCB0aHJlc2hvbGQsIHRyeSB0byBkaXJlY3RseSBtbWFwIHRoaXMgY2h1bmsuCi0gICAgICAgNS4gSWYgYXZhaWxhYmxlLCBnZXQgbWVtb3J5IGZyb20gc3lzdGVtIGFuZCB1c2UgaXQKLQotICAgICBUaGUgdWdseSBnb3RvJ3MgaGVyZSBlbnN1cmUgdGhhdCBwb3N0YWN0aW9uIG9jY3VycyBhbG9uZyBhbGwgcGF0aHMuCi0gICovCi0KLSAgaWYgKCFQUkVBQ1RJT04oZ20pKSB7Ci0gICAgdm9pZCogbWVtOwotICAgIHNpemVfdCBuYjsKLSAgICBpZiAoYnl0ZXMgPD0gTUFYX1NNQUxMX1JFUVVFU1QpIHsKLSAgICAgIGJpbmRleF90IGlkeDsKLSAgICAgIGJpbm1hcF90IHNtYWxsYml0czsKLSAgICAgIG5iID0gKGJ5dGVzIDwgTUlOX1JFUVVFU1QpPyBNSU5fQ0hVTktfU0laRSA6IHBhZF9yZXF1ZXN0KGJ5dGVzKTsKLSAgICAgIGlkeCA9IHNtYWxsX2luZGV4KG5iKTsKLSAgICAgIHNtYWxsYml0cyA9IGdtLT5zbWFsbG1hcCA+PiBpZHg7Ci0KLSAgICAgIGlmICgoc21hbGxiaXRzICYgMHgzVSkgIT0gMCkgeyAvKiBSZW1haW5kZXJsZXNzIGZpdCB0byBhIHNtYWxsYmluLiAqLwotICAgICAgICBtY2h1bmtwdHIgYiwgcDsKLSAgICAgICAgaWR4ICs9IH5zbWFsbGJpdHMgJiAxOyAgICAgICAvKiBVc2VzIG5leHQgYmluIGlmIGlkeCBlbXB0eSAqLwotICAgICAgICBiID0gc21hbGxiaW5fYXQoZ20sIGlkeCk7Ci0gICAgICAgIHAgPSBiLT5mZDsKLSAgICAgICAgYXNzZXJ0KGNodW5rc2l6ZShwKSA9PSBzbWFsbF9pbmRleDJzaXplKGlkeCkpOwotICAgICAgICB1bmxpbmtfZmlyc3Rfc21hbGxfY2h1bmsoZ20sIGIsIHAsIGlkeCk7Ci0gICAgICAgIHNldF9pbnVzZV9hbmRfcGludXNlKGdtLCBwLCBzbWFsbF9pbmRleDJzaXplKGlkeCkpOwotICAgICAgICBtZW0gPSBjaHVuazJtZW0ocCk7Ci0gICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKGdtLCBtZW0sIG5iKTsKLSAgICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChuYiA+IGdtLT5kdnNpemUpIHsKLSAgICAgICAgaWYgKHNtYWxsYml0cyAhPSAwKSB7IC8qIFVzZSBjaHVuayBpbiBuZXh0IG5vbmVtcHR5IHNtYWxsYmluICovCi0gICAgICAgICAgbWNodW5rcHRyIGIsIHAsIHI7Ci0gICAgICAgICAgc2l6ZV90IHJzaXplOwotICAgICAgICAgIGJpbmRleF90IGk7Ci0gICAgICAgICAgYmlubWFwX3QgbGVmdGJpdHMgPSAoc21hbGxiaXRzIDw8IGlkeCkgJiBsZWZ0X2JpdHMoaWR4MmJpdChpZHgpKTsKLSAgICAgICAgICBiaW5tYXBfdCBsZWFzdGJpdCA9IGxlYXN0X2JpdChsZWZ0Yml0cyk7Ci0gICAgICAgICAgY29tcHV0ZV9iaXQyaWR4KGxlYXN0Yml0LCBpKTsKLSAgICAgICAgICBiID0gc21hbGxiaW5fYXQoZ20sIGkpOwotICAgICAgICAgIHAgPSBiLT5mZDsKLSAgICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHApID09IHNtYWxsX2luZGV4MnNpemUoaSkpOwotICAgICAgICAgIHVubGlua19maXJzdF9zbWFsbF9jaHVuayhnbSwgYiwgcCwgaSk7Ci0gICAgICAgICAgcnNpemUgPSBzbWFsbF9pbmRleDJzaXplKGkpIC0gbmI7Ci0gICAgICAgICAgLyogRml0IGhlcmUgY2Fubm90IGJlIHJlbWFpbmRlcmxlc3MgaWYgNGJ5dGUgc2l6ZXMgKi8KLSAgICAgICAgICBpZiAoU0laRV9UX1NJWkUgIT0gNCAmJiByc2l6ZSA8IE1JTl9DSFVOS19TSVpFKQotICAgICAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UoZ20sIHAsIHNtYWxsX2luZGV4MnNpemUoaSkpOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhnbSwgcCwgbmIpOwotICAgICAgICAgICAgciA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKLSAgICAgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7Ci0gICAgICAgICAgICByZXBsYWNlX2R2KGdtLCByLCByc2l6ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKLSAgICAgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhnbSwgbWVtLCBuYik7Ci0gICAgICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAoZ20tPnRyZWVtYXAgIT0gMCAmJiAobWVtID0gdG1hbGxvY19zbWFsbChnbSwgbmIpKSAhPSAwKSB7Ci0gICAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOwotICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChieXRlcyA+PSBNQVhfUkVRVUVTVCkKLSAgICAgIG5iID0gTUFYX1NJWkVfVDsgLyogVG9vIGJpZyB0byBhbGxvY2F0ZS4gRm9yY2UgZmFpbHVyZSAoaW4gc3lzIGFsbG9jKSAqLwotICAgIGVsc2UgewotICAgICAgbmIgPSBwYWRfcmVxdWVzdChieXRlcyk7Ci0gICAgICBpZiAoZ20tPnRyZWVtYXAgIT0gMCAmJiAobWVtID0gdG1hbGxvY19sYXJnZShnbSwgbmIpKSAhPSAwKSB7Ci0gICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKGdtLCBtZW0sIG5iKTsKLSAgICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChuYiA8PSBnbS0+ZHZzaXplKSB7Ci0gICAgICBzaXplX3QgcnNpemUgPSBnbS0+ZHZzaXplIC0gbmI7Ci0gICAgICBtY2h1bmtwdHIgcCA9IGdtLT5kdjsKLSAgICAgIGlmIChyc2l6ZSA+PSBNSU5fQ0hVTktfU0laRSkgeyAvKiBzcGxpdCBkdiAqLwotICAgICAgICBtY2h1bmtwdHIgciA9IGdtLT5kdiA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKLSAgICAgICAgZ20tPmR2c2l6ZSA9IHJzaXplOwotICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsociwgcnNpemUpOwotICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKGdtLCBwLCBuYik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsgLyogZXhoYXVzdCBkdiAqLwotICAgICAgICBzaXplX3QgZHZzID0gZ20tPmR2c2l6ZTsKLSAgICAgICAgZ20tPmR2c2l6ZSA9IDA7Ci0gICAgICAgIGdtLT5kdiA9IDA7Ci0gICAgICAgIHNldF9pbnVzZV9hbmRfcGludXNlKGdtLCBwLCBkdnMpOwotICAgICAgfQotICAgICAgbWVtID0gY2h1bmsybWVtKHApOwotICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOwotICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgIH0KLQotICAgIGVsc2UgaWYgKG5iIDwgZ20tPnRvcHNpemUpIHsgLyogU3BsaXQgdG9wICovCi0gICAgICBzaXplX3QgcnNpemUgPSBnbS0+dG9wc2l6ZSAtPSBuYjsKLSAgICAgIG1jaHVua3B0ciBwID0gZ20tPnRvcDsKLSAgICAgIG1jaHVua3B0ciByID0gZ20tPnRvcCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKLSAgICAgIHItPmhlYWQgPSByc2l6ZSB8IFBJTlVTRV9CSVQ7Ci0gICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKGdtLCBwLCBuYik7Ci0gICAgICBtZW0gPSBjaHVuazJtZW0ocCk7Ci0gICAgICBjaGVja190b3BfY2h1bmsoZ20sIGdtLT50b3ApOwotICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOwotICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgIH0KLQotICAgIG1lbSA9IHN5c19hbGxvYyhnbSwgbmIpOwotCi0gIHBvc3RhY3Rpb246Ci0gICAgUE9TVEFDVElPTihnbSk7Ci0gICAgcmV0dXJuIG1lbTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi12b2lkIGRsZnJlZSh2b2lkKiBtZW0pIHsKLSAgLyoKLSAgICAgQ29uc29saWRhdGUgZnJlZWQgY2h1bmtzIHdpdGggcHJlY2VlZGluZyBvciBzdWNjZWVkaW5nIGJvcmRlcmluZwotICAgICBmcmVlIGNodW5rcywgaWYgdGhleSBleGlzdCwgYW5kIHRoZW4gcGxhY2UgaW4gYSBiaW4uICBJbnRlcm1peGVkCi0gICAgIHdpdGggc3BlY2lhbCBjYXNlcyBmb3IgdG9wLCBkdiwgbW1hcHBlZCBjaHVua3MsIGFuZCB1c2FnZSBlcnJvcnMuCi0gICovCi0KLSAgaWYgKG1lbSAhPSAwKSB7Ci0gICAgbWNodW5rcHRyIHAgID0gbWVtMmNodW5rKG1lbSk7Ci0jaWYgRk9PVEVSUwotICAgIG1zdGF0ZSBmbSA9IGdldF9tc3RhdGVfZm9yKHApOwotICAgIGlmICghb2tfbWFnaWMoZm0pKSB7Ci0gICAgICBVU0FHRV9FUlJPUl9BQ1RJT04oZm0sIHApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbHNlIC8qIEZPT1RFUlMgKi8KLSNkZWZpbmUgZm0gZ20KLSNlbmRpZiAvKiBGT09URVJTICovCi0gICAgaWYgKCFQUkVBQ1RJT04oZm0pKSB7Ci0gICAgICBjaGVja19pbnVzZV9jaHVuayhmbSwgcCk7Ci0gICAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKGZtLCBwKSAmJiBva19jaW51c2UocCkpKSB7Ci0gICAgICAgIHNpemVfdCBwc2l6ZSA9IGNodW5rc2l6ZShwKTsKLSAgICAgICAgbWNodW5rcHRyIG5leHQgPSBjaHVua19wbHVzX29mZnNldChwLCBwc2l6ZSk7Ci0gICAgICAgIGlmICghcGludXNlKHApKSB7Ci0gICAgICAgICAgc2l6ZV90IHByZXZzaXplID0gcC0+cHJldl9mb290OwotICAgICAgICAgIGlmICgocHJldnNpemUgJiBJU19NTUFQUEVEX0JJVCkgIT0gMCkgewotICAgICAgICAgICAgcHJldnNpemUgJj0gfklTX01NQVBQRURfQklUOwotICAgICAgICAgICAgcHNpemUgKz0gcHJldnNpemUgKyBNTUFQX0ZPT1RfUEFEOwotICAgICAgICAgICAgaWYgKENBTExfTVVOTUFQKChjaGFyKilwIC0gcHJldnNpemUsIHBzaXplKSA9PSAwKQotICAgICAgICAgICAgICBmbS0+Zm9vdHByaW50IC09IHBzaXplOwotICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG1jaHVua3B0ciBwcmV2ID0gY2h1bmtfbWludXNfb2Zmc2V0KHAsIHByZXZzaXplKTsKLSAgICAgICAgICAgIHBzaXplICs9IHByZXZzaXplOwotICAgICAgICAgICAgcCA9IHByZXY7Ci0gICAgICAgICAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKGZtLCBwcmV2KSkpIHsgLyogY29uc29saWRhdGUgYmFja3dhcmQgKi8KLSAgICAgICAgICAgICAgaWYgKHAgIT0gZm0tPmR2KSB7Ci0gICAgICAgICAgICAgICAgdW5saW5rX2NodW5rKGZtLCBwLCBwcmV2c2l6ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoKG5leHQtPmhlYWQgJiBJTlVTRV9CSVRTKSA9PSBJTlVTRV9CSVRTKSB7Ci0gICAgICAgICAgICAgICAgZm0tPmR2c2l6ZSA9IHBzaXplOwotICAgICAgICAgICAgICAgIHNldF9mcmVlX3dpdGhfcGludXNlKHAsIHBzaXplLCBuZXh0KTsKLSAgICAgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZ290byBlcnJvcmFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoUlRDSEVDSyhva19uZXh0KHAsIG5leHQpICYmIG9rX3BpbnVzZShuZXh0KSkpIHsKLSAgICAgICAgICBpZiAoIWNpbnVzZShuZXh0KSkgeyAgLyogY29uc29saWRhdGUgZm9yd2FyZCAqLwotICAgICAgICAgICAgaWYgKG5leHQgPT0gZm0tPnRvcCkgewotICAgICAgICAgICAgICBzaXplX3QgdHNpemUgPSBmbS0+dG9wc2l6ZSArPSBwc2l6ZTsKLSAgICAgICAgICAgICAgZm0tPnRvcCA9IHA7Ci0gICAgICAgICAgICAgIHAtPmhlYWQgPSB0c2l6ZSB8IFBJTlVTRV9CSVQ7Ci0gICAgICAgICAgICAgIGlmIChwID09IGZtLT5kdikgewotICAgICAgICAgICAgICAgIGZtLT5kdiA9IDA7Ci0gICAgICAgICAgICAgICAgZm0tPmR2c2l6ZSA9IDA7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHNob3VsZF90cmltKGZtLCB0c2l6ZSkpCi0gICAgICAgICAgICAgICAgc3lzX3RyaW0oZm0sIDApOwotICAgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChuZXh0ID09IGZtLT5kdikgewotICAgICAgICAgICAgICBzaXplX3QgZHNpemUgPSBmbS0+ZHZzaXplICs9IHBzaXplOwotICAgICAgICAgICAgICBmbS0+ZHYgPSBwOwotICAgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgZHNpemUpOwotICAgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgc2l6ZV90IG5zaXplID0gY2h1bmtzaXplKG5leHQpOwotICAgICAgICAgICAgICBwc2l6ZSArPSBuc2l6ZTsKLSAgICAgICAgICAgICAgdW5saW5rX2NodW5rKGZtLCBuZXh0LCBuc2l6ZSk7Ci0gICAgICAgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhwLCBwc2l6ZSk7Ci0gICAgICAgICAgICAgIGlmIChwID09IGZtLT5kdikgewotICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSBwc2l6ZTsKLSAgICAgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2V0X2ZyZWVfd2l0aF9waW51c2UocCwgcHNpemUsIG5leHQpOwotICAgICAgICAgIGluc2VydF9jaHVuayhmbSwgcCwgcHNpemUpOwotICAgICAgICAgIGNoZWNrX2ZyZWVfY2h1bmsoZm0sIHApOwotICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsKLSAgICAgICAgfQotICAgICAgfQotICAgIGVycm9yYWN0aW9uOgotICAgICAgVVNBR0VfRVJST1JfQUNUSU9OKGZtLCBwKTsKLSAgICBwb3N0YWN0aW9uOgotICAgICAgUE9TVEFDVElPTihmbSk7Ci0gICAgfQotICB9Ci0jaWYgIUZPT1RFUlMKLSN1bmRlZiBmbQotI2VuZGlmIC8qIEZPT1RFUlMgKi8KLX0KLQotdm9pZCogZGxjYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtX3NpemUpIHsKLSAgdm9pZCogbWVtOwotICBzaXplX3QgcmVxID0gMDsKLSAgaWYgKG5fZWxlbWVudHMgIT0gMCkgewotICAgIHJlcSA9IG5fZWxlbWVudHMgKiBlbGVtX3NpemU7Ci0gICAgaWYgKCgobl9lbGVtZW50cyB8IGVsZW1fc2l6ZSkgJiB+KHNpemVfdCkweGZmZmYpICYmCi0gICAgICAgIChyZXEgLyBuX2VsZW1lbnRzICE9IGVsZW1fc2l6ZSkpCi0gICAgICByZXEgPSBNQVhfU0laRV9UOyAvKiBmb3JjZSBkb3duc3RyZWFtIGZhaWx1cmUgb24gb3ZlcmZsb3cgKi8KLSAgfQotICBtZW0gPSBkbG1hbGxvYyhyZXEpOwotICBpZiAobWVtICE9IDAgJiYgY2FsbG9jX211c3RfY2xlYXIobWVtMmNodW5rKG1lbSkpKQotICAgIG1lbXNldChtZW0sIDAsIHJlcSk7Ci0gIHJldHVybiBtZW07Ci19Ci0KLXZvaWQqIGRscmVhbGxvYyh2b2lkKiBvbGRtZW0sIHNpemVfdCBieXRlcykgewotICBpZiAob2xkbWVtID09IDApCi0gICAgcmV0dXJuIGRsbWFsbG9jKGJ5dGVzKTsKLSNpZmRlZiBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMKLSAgaWYgKGJ5dGVzID09IDApIHsKLSAgICBkbGZyZWUob2xkbWVtKTsKLSAgICByZXR1cm4gMDsKLSAgfQotI2VuZGlmIC8qIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyAqLwotICBlbHNlIHsKLSNpZiAhIEZPT1RFUlMKLSAgICBtc3RhdGUgbSA9IGdtOwotI2Vsc2UgLyogRk9PVEVSUyAqLwotICAgIG1zdGF0ZSBtID0gZ2V0X21zdGF0ZV9mb3IobWVtMmNodW5rKG9sZG1lbSkpOwotICAgIGlmICghb2tfbWFnaWMobSkpIHsKLSAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihtLCBvbGRtZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2VuZGlmIC8qIEZPT1RFUlMgKi8KLSAgICByZXR1cm4gaW50ZXJuYWxfcmVhbGxvYyhtLCBvbGRtZW0sIGJ5dGVzKTsKLSAgfQotfQotCi12b2lkKiBkbG1lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBieXRlcykgewotICByZXR1cm4gaW50ZXJuYWxfbWVtYWxpZ24oZ20sIGFsaWdubWVudCwgYnl0ZXMpOwotfQotCi12b2lkKiogZGxpbmRlcGVuZGVudF9jYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjaHVua3NbXSkgewotICBzaXplX3Qgc3ogPSBlbGVtX3NpemU7IC8qIHNlcnZlcyBhcyAxLWVsZW1lbnQgYXJyYXkgKi8KLSAgcmV0dXJuIGlhbGxvYyhnbSwgbl9lbGVtZW50cywgJnN6LCAzLCBjaHVua3MpOwotfQotCi12b2lkKiogZGxpbmRlcGVuZGVudF9jb21hbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IHNpemVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNodW5rc1tdKSB7Ci0gIHJldHVybiBpYWxsb2MoZ20sIG5fZWxlbWVudHMsIHNpemVzLCAwLCBjaHVua3MpOwotfQotCi12b2lkKiBkbHZhbGxvYyhzaXplX3QgYnl0ZXMpIHsKLSAgc2l6ZV90IHBhZ2VzejsKLSAgaW5pdF9tcGFyYW1zKCk7Ci0gIHBhZ2VzeiA9IG1wYXJhbXMucGFnZV9zaXplOwotICByZXR1cm4gZGxtZW1hbGlnbihwYWdlc3osIGJ5dGVzKTsKLX0KLQotdm9pZCogZGxwdmFsbG9jKHNpemVfdCBieXRlcykgewotICBzaXplX3QgcGFnZXN6OwotICBpbml0X21wYXJhbXMoKTsKLSAgcGFnZXN6ID0gbXBhcmFtcy5wYWdlX3NpemU7Ci0gIHJldHVybiBkbG1lbWFsaWduKHBhZ2VzeiwgKGJ5dGVzICsgcGFnZXN6IC0gU0laRV9UX09ORSkgJiB+KHBhZ2VzeiAtIFNJWkVfVF9PTkUpKTsKLX0KLQotaW50IGRsbWFsbG9jX3RyaW0oc2l6ZV90IHBhZCkgewotICBpbnQgcmVzdWx0ID0gMDsKLSAgaWYgKCFQUkVBQ1RJT04oZ20pKSB7Ci0gICAgcmVzdWx0ID0gc3lzX3RyaW0oZ20sIHBhZCk7Ci0gICAgUE9TVEFDVElPTihnbSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc2l6ZV90IGRsbWFsbG9jX2Zvb3RwcmludCh2b2lkKSB7Ci0gIHJldHVybiBnbS0+Zm9vdHByaW50OwotfQotCi1zaXplX3QgZGxtYWxsb2NfbWF4X2Zvb3RwcmludCh2b2lkKSB7Ci0gIHJldHVybiBnbS0+bWF4X2Zvb3RwcmludDsKLX0KLQotI2lmICFOT19NQUxMSU5GTwotc3RydWN0IG1hbGxpbmZvIGRsbWFsbGluZm8odm9pZCkgewotICByZXR1cm4gaW50ZXJuYWxfbWFsbGluZm8oZ20pOwotfQotI2VuZGlmIC8qIE5PX01BTExJTkZPICovCi0KLXZvaWQgZGxtYWxsb2Nfc3RhdHMoKSB7Ci0gIGludGVybmFsX21hbGxvY19zdGF0cyhnbSk7Ci19Ci0KLXNpemVfdCBkbG1hbGxvY191c2FibGVfc2l6ZSh2b2lkKiBtZW0pIHsKLSAgaWYgKG1lbSAhPSAwKSB7Ci0gICAgbWNodW5rcHRyIHAgPSBtZW0yY2h1bmsobWVtKTsKLSAgICBpZiAoY2ludXNlKHApKQotICAgICAgcmV0dXJuIGNodW5rc2l6ZShwKSAtIG92ZXJoZWFkX2ZvcihwKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IGRsbWFsbG9wdChpbnQgcGFyYW1fbnVtYmVyLCBpbnQgdmFsdWUpIHsKLSAgcmV0dXJuIGNoYW5nZV9tcGFyYW0ocGFyYW1fbnVtYmVyLCB2YWx1ZSk7Ci19Ci0KLSNlbmRpZiAvKiAhT05MWV9NU1BBQ0VTICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHVzZXIgbXNwYWNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpZiBNU1BBQ0VTCi0KLXN0YXRpYyBtc3RhdGUgaW5pdF91c2VyX21zdGF0ZShjaGFyKiB0YmFzZSwgc2l6ZV90IHRzaXplKSB7Ci0gIHNpemVfdCBtc2l6ZSA9IHBhZF9yZXF1ZXN0KHNpemVvZihzdHJ1Y3QgbWFsbG9jX3N0YXRlKSk7Ci0gIG1jaHVua3B0ciBtbjsKLSAgbWNodW5rcHRyIG1zcCA9IGFsaWduX2FzX2NodW5rKHRiYXNlKTsKLSAgbXN0YXRlIG0gPSAobXN0YXRlKShjaHVuazJtZW0obXNwKSk7Ci0gIG1lbXNldChtLCAwLCBtc2l6ZSk7Ci0gIElOSVRJQUxfTE9DSygmbS0+bXV0ZXgpOwotICBtc3AtPmhlYWQgPSAobXNpemV8UElOVVNFX0JJVHxDSU5VU0VfQklUKTsKLSAgbS0+c2VnLmJhc2UgPSBtLT5sZWFzdF9hZGRyID0gdGJhc2U7Ci0gIG0tPnNlZy5zaXplID0gbS0+Zm9vdHByaW50ID0gbS0+bWF4X2Zvb3RwcmludCA9IHRzaXplOwotICBtLT5tYWdpYyA9IG1wYXJhbXMubWFnaWM7Ci0gIG0tPm1mbGFncyA9IG1wYXJhbXMuZGVmYXVsdF9tZmxhZ3M7Ci0gIGRpc2FibGVfY29udGlndW91cyhtKTsKLSAgaW5pdF9iaW5zKG0pOwotICBtbiA9IG5leHRfY2h1bmsobWVtMmNodW5rKG0pKTsKLSAgaW5pdF90b3AobSwgbW4sIChzaXplX3QpKCh0YmFzZSArIHRzaXplKSAtIChjaGFyKiltbikgLSBUT1BfRk9PVF9TSVpFKTsKLSAgY2hlY2tfdG9wX2NodW5rKG0sIG0tPnRvcCk7Ci0gIHJldHVybiBtOwotfQotCi1tc3BhY2UgY3JlYXRlX21zcGFjZShzaXplX3QgY2FwYWNpdHksIGludCBsb2NrZWQpIHsKLSAgbXN0YXRlIG0gPSAwOwotICBzaXplX3QgbXNpemUgPSBwYWRfcmVxdWVzdChzaXplb2Yoc3RydWN0IG1hbGxvY19zdGF0ZSkpOwotICBpbml0X21wYXJhbXMoKTsgLyogRW5zdXJlIHBhZ2VzaXplIGV0YyBpbml0aWFsaXplZCAqLwotCi0gIGlmIChjYXBhY2l0eSA8IChzaXplX3QpIC0obXNpemUgKyBUT1BfRk9PVF9TSVpFICsgbXBhcmFtcy5wYWdlX3NpemUpKSB7Ci0gICAgc2l6ZV90IHJzID0gKChjYXBhY2l0eSA9PSAwKT8gbXBhcmFtcy5ncmFudWxhcml0eSA6Ci0gICAgICAgICAgICAgICAgIChjYXBhY2l0eSArIFRPUF9GT09UX1NJWkUgKyBtc2l6ZSkpOwotICAgIHNpemVfdCB0c2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKHJzKTsKLSAgICBjaGFyKiB0YmFzZSA9IChjaGFyKikoQ0FMTF9NTUFQKHRzaXplKSk7Ci0gICAgaWYgKHRiYXNlICE9IENNRkFJTCkgewotICAgICAgbSA9IGluaXRfdXNlcl9tc3RhdGUodGJhc2UsIHRzaXplKTsKLSAgICAgIG0tPnNlZy5zZmxhZ3MgPSBJU19NTUFQUEVEX0JJVDsKLSAgICAgIHNldF9sb2NrKG0sIGxvY2tlZCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAobXNwYWNlKW07Ci19Ci0KLW1zcGFjZSBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZSh2b2lkKiBiYXNlLCBzaXplX3QgY2FwYWNpdHksIGludCBsb2NrZWQpIHsKLSAgbXN0YXRlIG0gPSAwOwotICBzaXplX3QgbXNpemUgPSBwYWRfcmVxdWVzdChzaXplb2Yoc3RydWN0IG1hbGxvY19zdGF0ZSkpOwotICBpbml0X21wYXJhbXMoKTsgLyogRW5zdXJlIHBhZ2VzaXplIGV0YyBpbml0aWFsaXplZCAqLwotCi0gIGlmIChjYXBhY2l0eSA+IG1zaXplICsgVE9QX0ZPT1RfU0laRSAmJgotICAgICAgY2FwYWNpdHkgPCAoc2l6ZV90KSAtKG1zaXplICsgVE9QX0ZPT1RfU0laRSArIG1wYXJhbXMucGFnZV9zaXplKSkgewotICAgIG0gPSBpbml0X3VzZXJfbXN0YXRlKChjaGFyKiliYXNlLCBjYXBhY2l0eSk7Ci0gICAgbS0+c2VnLnNmbGFncyA9IEVYVEVSTl9CSVQ7Ci0gICAgc2V0X2xvY2sobSwgbG9ja2VkKTsKLSAgfQotICByZXR1cm4gKG1zcGFjZSltOwotfQotCi1zaXplX3QgZGVzdHJveV9tc3BhY2UobXNwYWNlIG1zcCkgewotICBzaXplX3QgZnJlZWQgPSAwOwotICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKLSAgaWYgKG9rX21hZ2ljKG1zKSkgewotICAgIG1zZWdtZW50cHRyIHNwID0gJm1zLT5zZWc7Ci0gICAgd2hpbGUgKHNwICE9IDApIHsKLSAgICAgIGNoYXIqIGJhc2UgPSBzcC0+YmFzZTsKLSAgICAgIHNpemVfdCBzaXplID0gc3AtPnNpemU7Ci0gICAgICBmbGFnX3QgZmxhZyA9IHNwLT5zZmxhZ3M7Ci0gICAgICBzcCA9IHNwLT5uZXh0OwotICAgICAgaWYgKChmbGFnICYgSVNfTU1BUFBFRF9CSVQpICYmICEoZmxhZyAmIEVYVEVSTl9CSVQpICYmCi0gICAgICAgICAgQ0FMTF9NVU5NQVAoYmFzZSwgc2l6ZSkgPT0gMCkKLSAgICAgICAgZnJlZWQgKz0gc2l6ZTsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKLSAgfQotICByZXR1cm4gZnJlZWQ7Ci19Ci0KLS8qCi0gIG1zcGFjZSB2ZXJzaW9ucyBvZiByb3V0aW5lcyBhcmUgbmVhci1jbG9uZXMgb2YgdGhlIGdsb2JhbAotICB2ZXJzaW9ucy4gVGhpcyBpcyBub3Qgc28gbmljZSBidXQgYmV0dGVyIHRoYW4gdGhlIGFsdGVybmF0aXZlcy4KLSovCi0KLQotdm9pZCogbXNwYWNlX21hbGxvYyhtc3BhY2UgbXNwLCBzaXplX3QgYnl0ZXMpIHsKLSAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7Ci0gIGlmICghb2tfbWFnaWMobXMpKSB7Ci0gICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoIVBSRUFDVElPTihtcykpIHsKLSAgICB2b2lkKiBtZW07Ci0gICAgc2l6ZV90IG5iOwotICAgIGlmIChieXRlcyA8PSBNQVhfU01BTExfUkVRVUVTVCkgewotICAgICAgYmluZGV4X3QgaWR4OwotICAgICAgYmlubWFwX3Qgc21hbGxiaXRzOwotICAgICAgbmIgPSAoYnl0ZXMgPCBNSU5fUkVRVUVTVCk/IE1JTl9DSFVOS19TSVpFIDogcGFkX3JlcXVlc3QoYnl0ZXMpOwotICAgICAgaWR4ID0gc21hbGxfaW5kZXgobmIpOwotICAgICAgc21hbGxiaXRzID0gbXMtPnNtYWxsbWFwID4+IGlkeDsKLQotICAgICAgaWYgKChzbWFsbGJpdHMgJiAweDNVKSAhPSAwKSB7IC8qIFJlbWFpbmRlcmxlc3MgZml0IHRvIGEgc21hbGxiaW4uICovCi0gICAgICAgIG1jaHVua3B0ciBiLCBwOwotICAgICAgICBpZHggKz0gfnNtYWxsYml0cyAmIDE7ICAgICAgIC8qIFVzZXMgbmV4dCBiaW4gaWYgaWR4IGVtcHR5ICovCi0gICAgICAgIGIgPSBzbWFsbGJpbl9hdChtcywgaWR4KTsKLSAgICAgICAgcCA9IGItPmZkOwotICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHApID09IHNtYWxsX2luZGV4MnNpemUoaWR4KSk7Ci0gICAgICAgIHVubGlua19maXJzdF9zbWFsbF9jaHVuayhtcywgYiwgcCwgaWR4KTsKLSAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobXMsIHAsIHNtYWxsX2luZGV4MnNpemUoaWR4KSk7Ci0gICAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKLSAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobXMsIG1lbSwgbmIpOwotICAgICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKG5iID4gbXMtPmR2c2l6ZSkgewotICAgICAgICBpZiAoc21hbGxiaXRzICE9IDApIHsgLyogVXNlIGNodW5rIGluIG5leHQgbm9uZW1wdHkgc21hbGxiaW4gKi8KLSAgICAgICAgICBtY2h1bmtwdHIgYiwgcCwgcjsKLSAgICAgICAgICBzaXplX3QgcnNpemU7Ci0gICAgICAgICAgYmluZGV4X3QgaTsKLSAgICAgICAgICBiaW5tYXBfdCBsZWZ0Yml0cyA9IChzbWFsbGJpdHMgPDwgaWR4KSAmIGxlZnRfYml0cyhpZHgyYml0KGlkeCkpOwotICAgICAgICAgIGJpbm1hcF90IGxlYXN0Yml0ID0gbGVhc3RfYml0KGxlZnRiaXRzKTsKLSAgICAgICAgICBjb21wdXRlX2JpdDJpZHgobGVhc3RiaXQsIGkpOwotICAgICAgICAgIGIgPSBzbWFsbGJpbl9hdChtcywgaSk7Ci0gICAgICAgICAgcCA9IGItPmZkOwotICAgICAgICAgIGFzc2VydChjaHVua3NpemUocCkgPT0gc21hbGxfaW5kZXgyc2l6ZShpKSk7Ci0gICAgICAgICAgdW5saW5rX2ZpcnN0X3NtYWxsX2NodW5rKG1zLCBiLCBwLCBpKTsKLSAgICAgICAgICByc2l6ZSA9IHNtYWxsX2luZGV4MnNpemUoaSkgLSBuYjsKLSAgICAgICAgICAvKiBGaXQgaGVyZSBjYW5ub3QgYmUgcmVtYWluZGVybGVzcyBpZiA0Ynl0ZSBzaXplcyAqLwotICAgICAgICAgIGlmIChTSVpFX1RfU0laRSAhPSA0ICYmIHJzaXplIDwgTUlOX0NIVU5LX1NJWkUpCi0gICAgICAgICAgICBzZXRfaW51c2VfYW5kX3BpbnVzZShtcywgcCwgc21hbGxfaW5kZXgyc2l6ZShpKSk7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG1zLCBwLCBuYik7Ci0gICAgICAgICAgICByID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOwotICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHIsIHJzaXplKTsKLSAgICAgICAgICAgIHJlcGxhY2VfZHYobXMsIHIsIHJzaXplKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbWVtID0gY2h1bmsybWVtKHApOwotICAgICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKG1zLCBtZW0sIG5iKTsKLSAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlIGlmIChtcy0+dHJlZW1hcCAhPSAwICYmIChtZW0gPSB0bWFsbG9jX3NtYWxsKG1zLCBuYikpICE9IDApIHsKLSAgICAgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7Ci0gICAgICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGJ5dGVzID49IE1BWF9SRVFVRVNUKQotICAgICAgbmIgPSBNQVhfU0laRV9UOyAvKiBUb28gYmlnIHRvIGFsbG9jYXRlLiBGb3JjZSBmYWlsdXJlIChpbiBzeXMgYWxsb2MpICovCi0gICAgZWxzZSB7Ci0gICAgICBuYiA9IHBhZF9yZXF1ZXN0KGJ5dGVzKTsKLSAgICAgIGlmIChtcy0+dHJlZW1hcCAhPSAwICYmIChtZW0gPSB0bWFsbG9jX2xhcmdlKG1zLCBuYikpICE9IDApIHsKLSAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobXMsIG1lbSwgbmIpOwotICAgICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5iIDw9IG1zLT5kdnNpemUpIHsKLSAgICAgIHNpemVfdCByc2l6ZSA9IG1zLT5kdnNpemUgLSBuYjsKLSAgICAgIG1jaHVua3B0ciBwID0gbXMtPmR2OwotICAgICAgaWYgKHJzaXplID49IE1JTl9DSFVOS19TSVpFKSB7IC8qIHNwbGl0IGR2ICovCi0gICAgICAgIG1jaHVua3B0ciByID0gbXMtPmR2ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOwotICAgICAgICBtcy0+ZHZzaXplID0gcnNpemU7Ci0gICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7Ci0gICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobXMsIHAsIG5iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgeyAvKiBleGhhdXN0IGR2ICovCi0gICAgICAgIHNpemVfdCBkdnMgPSBtcy0+ZHZzaXplOwotICAgICAgICBtcy0+ZHZzaXplID0gMDsKLSAgICAgICAgbXMtPmR2ID0gMDsKLSAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobXMsIHAsIGR2cyk7Ci0gICAgICB9Ci0gICAgICBtZW0gPSBjaHVuazJtZW0ocCk7Ci0gICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7Ci0gICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgfQotCi0gICAgZWxzZSBpZiAobmIgPCBtcy0+dG9wc2l6ZSkgeyAvKiBTcGxpdCB0b3AgKi8KLSAgICAgIHNpemVfdCByc2l6ZSA9IG1zLT50b3BzaXplIC09IG5iOwotICAgICAgbWNodW5rcHRyIHAgPSBtcy0+dG9wOwotICAgICAgbWNodW5rcHRyIHIgPSBtcy0+dG9wID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOwotICAgICAgci0+aGVhZCA9IHJzaXplIHwgUElOVVNFX0JJVDsKLSAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobXMsIHAsIG5iKTsKLSAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKLSAgICAgIGNoZWNrX3RvcF9jaHVuayhtcywgbXMtPnRvcCk7Ci0gICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7Ci0gICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgfQotCi0gICAgbWVtID0gc3lzX2FsbG9jKG1zLCBuYik7Ci0KLSAgcG9zdGFjdGlvbjoKLSAgICBQT1NUQUNUSU9OKG1zKTsKLSAgICByZXR1cm4gbWVtOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbXNwYWNlX2ZyZWUobXNwYWNlIG1zcCwgdm9pZCogbWVtKSB7Ci0gIGlmIChtZW0gIT0gMCkgewotICAgIG1jaHVua3B0ciBwICA9IG1lbTJjaHVuayhtZW0pOwotI2lmIEZPT1RFUlMKLSAgICBtc3RhdGUgZm0gPSBnZXRfbXN0YXRlX2ZvcihwKTsKLSNlbHNlIC8qIEZPT1RFUlMgKi8KLSAgICBtc3RhdGUgZm0gPSAobXN0YXRlKW1zcDsKLSNlbmRpZiAvKiBGT09URVJTICovCi0gICAgaWYgKCFva19tYWdpYyhmbSkpIHsKLSAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihmbSwgcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghUFJFQUNUSU9OKGZtKSkgewotICAgICAgY2hlY2tfaW51c2VfY2h1bmsoZm0sIHApOwotICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcCkgJiYgb2tfY2ludXNlKHApKSkgewotICAgICAgICBzaXplX3QgcHNpemUgPSBjaHVua3NpemUocCk7Ci0gICAgICAgIG1jaHVua3B0ciBuZXh0ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgcHNpemUpOwotICAgICAgICBpZiAoIXBpbnVzZShwKSkgewotICAgICAgICAgIHNpemVfdCBwcmV2c2l6ZSA9IHAtPnByZXZfZm9vdDsKLSAgICAgICAgICBpZiAoKHByZXZzaXplICYgSVNfTU1BUFBFRF9CSVQpICE9IDApIHsKLSAgICAgICAgICAgIHByZXZzaXplICY9IH5JU19NTUFQUEVEX0JJVDsKLSAgICAgICAgICAgIHBzaXplICs9IHByZXZzaXplICsgTU1BUF9GT09UX1BBRDsKLSAgICAgICAgICAgIGlmIChDQUxMX01VTk1BUCgoY2hhciopcCAtIHByZXZzaXplLCBwc2l6ZSkgPT0gMCkKLSAgICAgICAgICAgICAgZm0tPmZvb3RwcmludCAtPSBwc2l6ZTsKLSAgICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtY2h1bmtwdHIgcHJldiA9IGNodW5rX21pbnVzX29mZnNldChwLCBwcmV2c2l6ZSk7Ci0gICAgICAgICAgICBwc2l6ZSArPSBwcmV2c2l6ZTsKLSAgICAgICAgICAgIHAgPSBwcmV2OwotICAgICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcHJldikpKSB7IC8qIGNvbnNvbGlkYXRlIGJhY2t3YXJkICovCi0gICAgICAgICAgICAgIGlmIChwICE9IGZtLT5kdikgewotICAgICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgcCwgcHJldnNpemUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKChuZXh0LT5oZWFkICYgSU5VU0VfQklUUykgPT0gSU5VU0VfQklUUykgewotICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSBwc2l6ZTsKLSAgICAgICAgICAgICAgICBzZXRfZnJlZV93aXRoX3BpbnVzZShwLCBwc2l6ZSwgbmV4dCk7Ci0gICAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGdvdG8gZXJyb3JhY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFJUQ0hFQ0sob2tfbmV4dChwLCBuZXh0KSAmJiBva19waW51c2UobmV4dCkpKSB7Ci0gICAgICAgICAgaWYgKCFjaW51c2UobmV4dCkpIHsgIC8qIGNvbnNvbGlkYXRlIGZvcndhcmQgKi8KLSAgICAgICAgICAgIGlmIChuZXh0ID09IGZtLT50b3ApIHsKLSAgICAgICAgICAgICAgc2l6ZV90IHRzaXplID0gZm0tPnRvcHNpemUgKz0gcHNpemU7Ci0gICAgICAgICAgICAgIGZtLT50b3AgPSBwOwotICAgICAgICAgICAgICBwLT5oZWFkID0gdHNpemUgfCBQSU5VU0VfQklUOwotICAgICAgICAgICAgICBpZiAocCA9PSBmbS0+ZHYpIHsKLSAgICAgICAgICAgICAgICBmbS0+ZHYgPSAwOwotICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSAwOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChzaG91bGRfdHJpbShmbSwgdHNpemUpKQotICAgICAgICAgICAgICAgIHN5c190cmltKGZtLCAwKTsKLSAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PSBmbS0+ZHYpIHsKLSAgICAgICAgICAgICAgc2l6ZV90IGRzaXplID0gZm0tPmR2c2l6ZSArPSBwc2l6ZTsKLSAgICAgICAgICAgICAgZm0tPmR2ID0gcDsKLSAgICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHAsIGRzaXplKTsKLSAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHNpemVfdCBuc2l6ZSA9IGNodW5rc2l6ZShuZXh0KTsKLSAgICAgICAgICAgICAgcHNpemUgKz0gbnNpemU7Ci0gICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgbmV4dCwgbnNpemUpOwotICAgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgcHNpemUpOwotICAgICAgICAgICAgICBpZiAocCA9PSBmbS0+ZHYpIHsKLSAgICAgICAgICAgICAgICBmbS0+ZHZzaXplID0gcHNpemU7Ci0gICAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNldF9mcmVlX3dpdGhfcGludXNlKHAsIHBzaXplLCBuZXh0KTsKLSAgICAgICAgICBpbnNlcnRfY2h1bmsoZm0sIHAsIHBzaXplKTsKLSAgICAgICAgICBjaGVja19mcmVlX2NodW5rKGZtLCBwKTsKLSAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICBlcnJvcmFjdGlvbjoKLSAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihmbSwgcCk7Ci0gICAgcG9zdGFjdGlvbjoKLSAgICAgIFBPU1RBQ1RJT04oZm0pOwotICAgIH0KLSAgfQotfQotCi12b2lkKiBtc3BhY2VfY2FsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBuX2VsZW1lbnRzLCBzaXplX3QgZWxlbV9zaXplKSB7Ci0gIHZvaWQqIG1lbTsKLSAgc2l6ZV90IHJlcSA9IDA7Ci0gIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOwotICBpZiAoIW9rX21hZ2ljKG1zKSkgewotICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKG5fZWxlbWVudHMgIT0gMCkgewotICAgIHJlcSA9IG5fZWxlbWVudHMgKiBlbGVtX3NpemU7Ci0gICAgaWYgKCgobl9lbGVtZW50cyB8IGVsZW1fc2l6ZSkgJiB+KHNpemVfdCkweGZmZmYpICYmCi0gICAgICAgIChyZXEgLyBuX2VsZW1lbnRzICE9IGVsZW1fc2l6ZSkpCi0gICAgICByZXEgPSBNQVhfU0laRV9UOyAvKiBmb3JjZSBkb3duc3RyZWFtIGZhaWx1cmUgb24gb3ZlcmZsb3cgKi8KLSAgfQotICBtZW0gPSBpbnRlcm5hbF9tYWxsb2MobXMsIHJlcSk7Ci0gIGlmIChtZW0gIT0gMCAmJiBjYWxsb2NfbXVzdF9jbGVhcihtZW0yY2h1bmsobWVtKSkpCi0gICAgbWVtc2V0KG1lbSwgMCwgcmVxKTsKLSAgcmV0dXJuIG1lbTsKLX0KLQotdm9pZCogbXNwYWNlX3JlYWxsb2MobXNwYWNlIG1zcCwgdm9pZCogb2xkbWVtLCBzaXplX3QgYnl0ZXMpIHsKLSAgaWYgKG9sZG1lbSA9PSAwKQotICAgIHJldHVybiBtc3BhY2VfbWFsbG9jKG1zcCwgYnl0ZXMpOwotI2lmZGVmIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUwotICBpZiAoYnl0ZXMgPT0gMCkgewotICAgIG1zcGFjZV9mcmVlKG1zcCwgb2xkbWVtKTsKLSAgICByZXR1cm4gMDsKLSAgfQotI2VuZGlmIC8qIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyAqLwotICBlbHNlIHsKLSNpZiBGT09URVJTCi0gICAgbWNodW5rcHRyIHAgID0gbWVtMmNodW5rKG9sZG1lbSk7Ci0gICAgbXN0YXRlIG1zID0gZ2V0X21zdGF0ZV9mb3IocCk7Ci0jZWxzZSAvKiBGT09URVJTICovCi0gICAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7Ci0jZW5kaWYgLyogRk9PVEVSUyAqLwotICAgIGlmICghb2tfbWFnaWMobXMpKSB7Ci0gICAgICBVU0FHRV9FUlJPUl9BQ1RJT04obXMsbXMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBpbnRlcm5hbF9yZWFsbG9jKG1zLCBvbGRtZW0sIGJ5dGVzKTsKLSAgfQotfQotCi12b2lkKiBtc3BhY2VfbWVtYWxpZ24obXNwYWNlIG1zcCwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IGJ5dGVzKSB7Ci0gIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOwotICBpZiAoIW9rX21hZ2ljKG1zKSkgewotICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGludGVybmFsX21lbWFsaWduKG1zLCBhbGlnbm1lbnQsIGJ5dGVzKTsKLX0KLQotdm9pZCoqIG1zcGFjZV9pbmRlcGVuZGVudF9jYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZWxlbV9zaXplLCB2b2lkKiBjaHVua3NbXSkgewotICBzaXplX3Qgc3ogPSBlbGVtX3NpemU7IC8qIHNlcnZlcyBhcyAxLWVsZW1lbnQgYXJyYXkgKi8KLSAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7Ci0gIGlmICghb2tfbWFnaWMobXMpKSB7Ci0gICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gaWFsbG9jKG1zLCBuX2VsZW1lbnRzLCAmc3osIDMsIGNodW5rcyk7Ci19Ci0KLXZvaWQqKiBtc3BhY2VfaW5kZXBlbmRlbnRfY29tYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplc1tdLCB2b2lkKiBjaHVua3NbXSkgewotICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKLSAgaWYgKCFva19tYWdpYyhtcykpIHsKLSAgICBVU0FHRV9FUlJPUl9BQ1RJT04obXMsbXMpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBpYWxsb2MobXMsIG5fZWxlbWVudHMsIHNpemVzLCAwLCBjaHVua3MpOwotfQotCi1pbnQgbXNwYWNlX3RyaW0obXNwYWNlIG1zcCwgc2l6ZV90IHBhZCkgewotICBpbnQgcmVzdWx0ID0gMDsKLSAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7Ci0gIGlmIChva19tYWdpYyhtcykpIHsKLSAgICBpZiAoIVBSRUFDVElPTihtcykpIHsKLSAgICAgIHJlc3VsdCA9IHN5c190cmltKG1zLCBwYWQpOwotICAgICAgUE9TVEFDVElPTihtcyk7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBtc3BhY2VfbWFsbG9jX3N0YXRzKG1zcGFjZSBtc3ApIHsKLSAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7Ci0gIGlmIChva19tYWdpYyhtcykpIHsKLSAgICBpbnRlcm5hbF9tYWxsb2Nfc3RhdHMobXMpOwotICB9Ci0gIGVsc2UgewotICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7Ci0gIH0KLX0KLQotc2l6ZV90IG1zcGFjZV9mb290cHJpbnQobXNwYWNlIG1zcCkgewotICBzaXplX3QgcmVzdWx0OwotICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKLSAgaWYgKG9rX21hZ2ljKG1zKSkgewotICAgIHJlc3VsdCA9IG1zLT5mb290cHJpbnQ7Ci0gIH0KLSAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zaXplX3QgbXNwYWNlX21heF9mb290cHJpbnQobXNwYWNlIG1zcCkgewotICBzaXplX3QgcmVzdWx0OwotICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKLSAgaWYgKG9rX21hZ2ljKG1zKSkgewotICAgIHJlc3VsdCA9IG1zLT5tYXhfZm9vdHByaW50OwotICB9Ci0gIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotI2lmICFOT19NQUxMSU5GTwotc3RydWN0IG1hbGxpbmZvIG1zcGFjZV9tYWxsaW5mbyhtc3BhY2UgbXNwKSB7Ci0gIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOwotICBpZiAoIW9rX21hZ2ljKG1zKSkgewotICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7Ci0gIH0KLSAgcmV0dXJuIGludGVybmFsX21hbGxpbmZvKG1zKTsKLX0KLSNlbmRpZiAvKiBOT19NQUxMSU5GTyAqLwotCi1pbnQgbXNwYWNlX21hbGxvcHQoaW50IHBhcmFtX251bWJlciwgaW50IHZhbHVlKSB7Ci0gIHJldHVybiBjaGFuZ2VfbXBhcmFtKHBhcmFtX251bWJlciwgdmFsdWUpOwotfQotCi0jZW5kaWYgLyogTVNQQUNFUyAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBBbHRlcm5hdGl2ZSBNT1JFQ09SRSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKgotICBHdWlkZWxpbmVzIGZvciBjcmVhdGluZyBhIGN1c3RvbSB2ZXJzaW9uIG9mIE1PUkVDT1JFOgotCi0gICogRm9yIGJlc3QgcGVyZm9ybWFuY2UsIE1PUkVDT1JFIHNob3VsZCBhbGxvY2F0ZSBpbiBtdWx0aXBsZXMgb2YgcGFnZXNpemUuCi0gICogTU9SRUNPUkUgbWF5IGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gcmVxdWVzdGVkLiAoT3IgZXZlbiBsZXNzLAotICAgICAgYnV0IHRoaXMgd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhIG1hbGxvYyBmYWlsdXJlLikKLSAgKiBNT1JFQ09SRSBtdXN0IG5vdCBhbGxvY2F0ZSBtZW1vcnkgd2hlbiBnaXZlbiBhcmd1bWVudCB6ZXJvLCBidXQKLSAgICAgIGluc3RlYWQgcmV0dXJuIG9uZSBwYXN0IHRoZSBlbmQgYWRkcmVzcyBvZiBtZW1vcnkgZnJvbSBwcmV2aW91cwotICAgICAgbm9uemVybyBjYWxsLgotICAqIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBjb25zZWN1dGl2ZSBjYWxscyB0byBNT1JFQ09SRSB3aXRoIHBvc2l0aXZlCi0gICAgICBhcmd1bWVudHMgc2hvdWxkIHJldHVybiBpbmNyZWFzaW5nIGFkZHJlc3NlcywgaW5kaWNhdGluZyB0aGF0Ci0gICAgICBzcGFjZSBoYXMgYmVlbiBjb250aWd1b3VzbHkgZXh0ZW5kZWQuCi0gICogRXZlbiB0aG91Z2ggY29uc2VjdXRpdmUgY2FsbHMgdG8gTU9SRUNPUkUgbmVlZCBub3QgcmV0dXJuIGNvbnRpZ3VvdXMKLSAgICAgIGFkZHJlc3NlcywgaXQgbXVzdCBiZSBPSyBmb3IgbWFsbG9jJ2VkIGNodW5rcyB0byBzcGFuIG11bHRpcGxlCi0gICAgICByZWdpb25zIGluIHRob3NlIGNhc2VzIHdoZXJlIHRoZXkgZG8gaGFwcGVuIHRvIGJlIGNvbnRpZ3VvdXMuCi0gICogTU9SRUNPUkUgbmVlZCBub3QgaGFuZGxlIG5lZ2F0aXZlIGFyZ3VtZW50cyAtLSBpdCBtYXkgaW5zdGVhZAotICAgICAganVzdCByZXR1cm4gTUZBSUwgd2hlbiBnaXZlbiBuZWdhdGl2ZSBhcmd1bWVudHMuCi0gICAgICBOZWdhdGl2ZSBhcmd1bWVudHMgYXJlIGFsd2F5cyBtdWx0aXBsZXMgb2YgcGFnZXNpemUuIE1PUkVDT1JFCi0gICAgICBtdXN0IG5vdCBtaXNpbnRlcnByZXQgbmVnYXRpdmUgYXJncyBhcyBsYXJnZSBwb3NpdGl2ZSB1bnNpZ25lZAotICAgICAgYXJncy4gWW91IGNhbiBzdXBwcmVzcyBhbGwgc3VjaCBjYWxscyBmcm9tIGV2ZW4gb2NjdXJyaW5nIGJ5IGRlZmluaW5nCi0gICAgICBNT1JFQ09SRV9DQU5OT1RfVFJJTSwKLQotICBBcyBhbiBleGFtcGxlIGFsdGVybmF0aXZlIE1PUkVDT1JFLCBoZXJlIGlzIGEgY3VzdG9tIGFsbG9jYXRvcgotICBraW5kbHkgY29udHJpYnV0ZWQgZm9yIHByZS1PU1ggbWFjT1MuICBJdCB1c2VzIHZpcnR1YWxseSBidXQgbm90Ci0gIG5lY2Vzc2FyaWx5IHBoeXNpY2FsbHkgY29udGlndW91cyBub24tcGFnZWQgbWVtb3J5IChsb2NrZWQgaW4sCi0gIHByZXNlbnQgYW5kIHdvbid0IGdldCBzd2FwcGVkIG91dCkuICBZb3UgY2FuIHVzZSBpdCBieSB1bmNvbW1lbnRpbmcKLSAgdGhpcyBzZWN0aW9uLCBhZGRpbmcgc29tZSAjaW5jbHVkZXMsIGFuZCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZQotICBkZWZpbmVzIGFib3ZlOgotCi0gICAgICAjZGVmaW5lIE1PUkVDT1JFIG9zTW9yZUNvcmUKLQotICBUaGVyZSBpcyBhbHNvIGEgc2h1dGRvd24gcm91dGluZSB0aGF0IHNob3VsZCBzb21laG93IGJlIGNhbGxlZCBmb3IKLSAgY2xlYW51cCB1cG9uIHByb2dyYW0gZXhpdC4KLQotICAjZGVmaW5lIE1BWF9QT09MX0VOVFJJRVMgMTAwCi0gICNkZWZpbmUgTUlOSU1VTV9NT1JFQ09SRV9TSVpFICAoNjQgKiAxMDI0VSkKLSAgc3RhdGljIGludCBuZXh0X29zX3Bvb2w7Ci0gIHZvaWQgKm91cl9vc19wb29sc1tNQVhfUE9PTF9FTlRSSUVTXTsKLQotICB2b2lkICpvc01vcmVDb3JlKGludCBzaXplKQotICB7Ci0gICAgdm9pZCAqcHRyID0gMDsKLSAgICBzdGF0aWMgdm9pZCAqc2Jya190b3AgPSAwOwotCi0gICAgaWYgKHNpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzaXplIDwgTUlOSU1VTV9NT1JFQ09SRV9TSVpFKQotICAgICAgICAgc2l6ZSA9IE1JTklNVU1fTU9SRUNPUkVfU0laRTsKLSAgICAgIGlmIChDdXJyZW50RXhlY3V0aW9uTGV2ZWwoKSA9PSBrVGFza0xldmVsKQotICAgICAgICAgcHRyID0gUG9vbEFsbG9jYXRlUmVzaWRlbnQoc2l6ZSArIFJNX1BBR0VfU0laRSwgMCk7Ci0gICAgICBpZiAocHRyID09IDApCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAodm9pZCAqKSBNRkFJTDsKLSAgICAgIH0KLSAgICAgIC8vIHNhdmUgcHRycyBzbyB0aGV5IGNhbiBiZSBmcmVlZCBkdXJpbmcgY2xlYW51cAotICAgICAgb3VyX29zX3Bvb2xzW25leHRfb3NfcG9vbF0gPSBwdHI7Ci0gICAgICBuZXh0X29zX3Bvb2wrKzsKLSAgICAgIHB0ciA9ICh2b2lkICopICgoKChzaXplX3QpIHB0cikgKyBSTV9QQUdFX01BU0spICYgflJNX1BBR0VfTUFTSyk7Ci0gICAgICBzYnJrX3RvcCA9IChjaGFyICopIHB0ciArIHNpemU7Ci0gICAgICByZXR1cm4gcHRyOwotICAgIH0KLSAgICBlbHNlIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICAvLyB3ZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCBzaHJpbmsgYmVoYXZpb3IKLSAgICAgIHJldHVybiAodm9pZCAqKSBNRkFJTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBzYnJrX3RvcDsKLSAgICB9Ci0gIH0KLQotICAvLyBjbGVhbnVwIGFueSBhbGxvY2F0ZWQgbWVtb3J5IHBvb2xzCi0gIC8vIGNhbGxlZCBhcyBsYXN0IHRoaW5nIGJlZm9yZSBzaHV0dGluZyBkb3duIGRyaXZlcgotCi0gIHZvaWQgb3NDbGVhbnVwTWVtKHZvaWQpCi0gIHsKLSAgICB2b2lkICoqcHRyOwotCi0gICAgZm9yIChwdHIgPSBvdXJfb3NfcG9vbHM7IHB0ciA8ICZvdXJfb3NfcG9vbHNbTUFYX1BPT0xfRU5UUklFU107IHB0cisrKQotICAgICAgaWYgKCpwdHIpCi0gICAgICB7Ci0gICAgICAgICBQb29sRGVhbGxvY2F0ZSgqcHRyKTsKLSAgICAgICAgICpwdHIgPSAwOwotICAgICAgfQotICB9Ci0KLSovCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUhpc3Rvcnk6Ci0gICAgVjIuOC4zIFRodSBTZXAgMjIgMTE6MTY6MzIgMjAwNSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCi0gICAgICAqIEFkZCBtYXhfZm9vdHByaW50IGZ1bmN0aW9ucwotICAgICAgKiBFbnN1cmUgYWxsIGFwcHJvcHJpYXRlIGxpdGVyYWxzIGFyZSBzaXplX3QKLSAgICAgICogRml4IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHByb2JsZW0gZm9yIHNvbWUgI2RlZmluZSBzZXR0aW5ncwotICAgICAgKiBBdm9pZCBjb25jYXRlbmF0aW5nIHNlZ21lbnRzIHdpdGggdGhlIG9uZSBwcm92aWRlZAotICAgICAgICBpbiBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZQotICAgICAgKiBSZW5hbWUgc29tZSB2YXJpYWJsZXMgdG8gYXZvaWQgY29tcGlsZXIgc2hhZG93aW5nIHdhcm5pbmdzCi0gICAgICAqIFVzZSBleHBsaWNpdCBsb2NrIGluaXRpYWxpemF0aW9uLgotICAgICAgKiBCZXR0ZXIgaGFuZGxpbmcgb2Ygc2JyayBpbnRlcmZlcmVuY2UuCi0gICAgICAqIFNpbXBsaWZ5IGFuZCBmaXggc2VnbWVudCBpbnNlcnRpb24sIHRyaW1taW5nIGFuZCBtc3BhY2VfZGVzdHJveQotICAgICAgKiBSZWluc3RhdGUgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTIG9wdGlvbiBmcm9tIDIuNy54Ci0gICAgICAqIFRoYW5rcyBlc3BlY2lhbGx5IHRvIERlbm5pcyBGbGFuYWdhbiBmb3IgaGVscCBvbiB0aGVzZS4KLQotICAgIFYyLjguMiBTdW4gSnVuIDEyIDE2OjAxOjEwIDIwMDUgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQotICAgICAgKiBGaXggbWVtYWxpZ24gYnJhY2UgZXJyb3IuCi0KLSAgICBWMi44LjEgV2VkIEp1biAgOCAxNjoxMTo0NiAyMDA1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKLSAgICAgICogRml4IGltcHJvcGVyICNlbmRpZiBuZXN0aW5nIGluIEMrKwotICAgICAgKiBBZGQgZXhwbGljaXQgY2FzdHMgbmVlZGVkIGZvciBDKysKLQotICAgIFYyLjguMCBNb24gTWF5IDMwIDE0OjA5OjAyIDIwMDUgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQotICAgICAgKiBVc2UgdHJlZXMgZm9yIGxhcmdlIGJpbnMKLSAgICAgICogU3VwcG9ydCBtc3BhY2VzCi0gICAgICAqIFVzZSBzZWdtZW50cyB0byB1bmlmeSBzYnJrLWJhc2VkIGFuZCBtbWFwLWJhc2VkIHN5c3RlbSBhbGxvY2F0aW9uLAotICAgICAgICByZW1vdmluZyBuZWVkIGZvciBlbXVsYXRpb24gb24gbW9zdCBwbGF0Zm9ybXMgd2l0aG91dCBzYnJrLgotICAgICAgKiBEZWZhdWx0IHNhZmV0eSBjaGVja3MKLSAgICAgICogT3B0aW9uYWwgZm9vdGVyIGNoZWNrcy4gVGhhbmtzIHRvIFdpbGxpYW0gUm9iZXJ0c29uIGZvciB0aGUgaWRlYS4KLSAgICAgICogSW50ZXJuYWwgY29kZSByZWZhY3RvcmluZwotICAgICAgKiBJbmNvcnBvcmF0ZSBzdWdnZXN0aW9ucyBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgY2hhbmdlcy4KLSAgICAgICAgVGhhbmtzIHRvIERlbm5pcyBGbGFuYWdhbiwgQ29saW4gUGx1bWIsIE5pYWxsIERvdWdsYXMsCi0gICAgICAgIEFhcm9uIEJhY2htYW5uLCAgRW1lcnkgQmVyZ2VyLCBhbmQgb3RoZXJzLgotICAgICAgKiBTcGVlZCB1cCBub24tZmFzdGJpbiBwcm9jZXNzaW5nIGVub3VnaCB0byByZW1vdmUgZmFzdGJpbnMuCi0gICAgICAqIFJlbW92ZSB1c2VsZXNzIGNmcmVlKCkgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIgYXBwcy4KLSAgICAgICogUmVtb3ZlIGludGVybmFsIG1lbWNweSwgbWVtc2V0LiBDb21waWxlcnMgaGFuZGxlIGJ1aWx0aW5zIGJldHRlci4KLSAgICAgICogUmVtb3ZlIHNvbWUgb3B0aW9ucyB0aGF0IG5vIG9uZSBldmVyIHVzZWQgYW5kIHJlbmFtZSBvdGhlcnMuCi0KLSAgICBWMi43LjIgU2F0IEF1ZyAxNyAwOTowNzozMCAyMDAyICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKLSAgICAgICogRml4IG1hbGxvY19zdGF0ZSBiaXRtYXAgYXJyYXkgbWlzZGVjbGFyYXRpb24KLQotICAgIFYyLjcuMSBUaHUgSnVsIDI1IDEwOjU4OjAzIDIwMDIgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQotICAgICAgKiBBbGxvdyB0dW5pbmcgb2YgRklSU1RfU09SVEVEX0JJTl9TSVpFCi0gICAgICAqIFVzZSBQVFJfVUlOVCBhcyB0eXBlIGZvciBhbGwgcHRyLT5pbnQgY2FzdHMuIFRoYW5rcyB0byBKb2huIEJlbG1vbnRlLgotICAgICAgKiBCZXR0ZXIgZGV0ZWN0aW9uIGFuZCBzdXBwb3J0IGZvciBub24tY29udGlndW91c25lc3Mgb2YgTU9SRUNPUkUuCi0gICAgICAgIFRoYW5rcyB0byBBbmRyZWFzIE11ZWxsZXIsIENvbmFsIFdhbHNoLCBhbmQgV29sZnJhbSBHbG9nZXIKLSAgICAgICogQnlwYXNzIG1vc3Qgb2YgbWFsbG9jIGlmIG5vIGZyZWVzLiBUaGFua3MgVG8gRW1lcnkgQmVyZ2VyLgotICAgICAgKiBGaXggZnJlZWluZyBvZiBvbGQgdG9wIG5vbi1jb250aWd1b3VzIGNodW5rIGltIHN5c21hbGxvYy4KLSAgICAgICogUmFpc2VkIGRlZmF1bHQgdHJpbSBhbmQgbWFwIHRocmVzaG9sZHMgdG8gMjU2Sy4KLSAgICAgICogRml4IG1tYXAtcmVsYXRlZCAjZGVmaW5lcy4gVGhhbmtzIHRvIEx1Ym9zIEx1bmFrLgotICAgICAgKiBGaXggY29weSBtYWNyb3M7IGFkZGVkIExBQ0tTX0ZDTlRMX0guIFRoYW5rcyB0byBOZWFsIFdhbGZpZWxkLgotICAgICAgKiBCcmFuY2gtZnJlZSBiaW4gY2FsY3VsYXRpb24KLSAgICAgICogRGVmYXVsdCB0cmltIGFuZCBtbWFwIHRocmVzaG9sZHMgbm93IDI1NksuCi0KLSAgICBWMi43LjAgU3VuIE1hciAxMSAxNDoxNDowNiAyMDAxICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKLSAgICAgICogSW50cm9kdWNlIGluZGVwZW5kZW50X2NvbWFsbG9jIGFuZCBpbmRlcGVuZGVudF9jYWxsb2MuCi0gICAgICAgIFRoYW5rcyB0byBNaWNoYWVsIFBhY2hvcyBmb3IgbW90aXZhdGlvbiBhbmQgaGVscC4KLSAgICAgICogTWFrZSBvcHRpb25hbCAuaCBmaWxlIGF2YWlsYWJsZQotICAgICAgKiBBbGxvdyA+IDJHQiByZXF1ZXN0cyBvbiAzMmJpdCBzeXN0ZW1zLgotICAgICAgKiBuZXcgV0lOMzIgc2JyaywgbW1hcCwgbXVubWFwLCBsb2NrIGNvZGUgZnJvbSA8V2FsdGVyQEdlTmVTeXMtZS5kZT4uCi0gICAgICAgIFRoYW5rcyBhbHNvIHRvIEFuZHJlYXMgTXVlbGxlciA8YS5tdWVsbGVyIGF0IHBhcmFkYXRlYy5kZT4sCi0gICAgICAgIGFuZCBBbm9ueW1vdXMuCi0gICAgICAqIEFsbG93IG92ZXJyaWRlIG9mIE1BTExPQ19BTElHTk1FTlQgKFRoYW5rcyB0byBSdXVkIFdhaWogZm9yCi0gICAgICAgIGhlbHBpbmcgdGVzdCB0aGlzLikKLSAgICAgICogbWVtYWxpZ246IGNoZWNrIGFsaWdubWVudCBhcmcKLSAgICAgICogcmVhbGxvYzogZG9uJ3QgdHJ5IHRvIHNoaWZ0IGNodW5rcyBiYWNrd2FyZHMsIHNpbmNlIHRoaXMKLSAgICAgICAgbGVhZHMgdG8gIG1vcmUgZnJhZ21lbnRhdGlvbiBpbiBzb21lIHByb2dyYW1zIGFuZCBkb2Vzbid0Ci0gICAgICAgIHNlZW0gdG8gaGVscCBpbiBhbnkgb3RoZXJzLgotICAgICAgKiBDb2xsZWN0IGFsbCBjYXNlcyBpbiBtYWxsb2MgcmVxdWlyaW5nIHN5c3RlbSBtZW1vcnkgaW50byBzeXNtYWxsb2MKLSAgICAgICogVXNlIG1tYXAgYXMgYmFja3VwIHRvIHNicmsKLSAgICAgICogUGxhY2UgYWxsIGludGVybmFsIHN0YXRlIGluIG1hbGxvY19zdGF0ZQotICAgICAgKiBJbnRyb2R1Y2UgZmFzdGJpbnMgKGFsdGhvdWdoIHNpbWlsYXIgdG8gMi41LjEpCi0gICAgICAqIE1hbnkgbWlub3IgdHVuaW5ncyBhbmQgY29zbWV0aWMgaW1wcm92ZW1lbnRzCi0gICAgICAqIEludHJvZHVjZSBVU0VfUFVCTElDX01BTExPQ19XUkFQUEVSUywgVVNFX01BTExPQ19MT0NLCi0gICAgICAqIEludHJvZHVjZSBNQUxMT0NfRkFJTFVSRV9BQ1RJT04sIE1PUkVDT1JFX0NPTlRJR1VPVVMKLSAgICAgICAgVGhhbmtzIHRvIFRvbnkgRS4gQmVubmV0dCA8dGJlbm5ldHRAbnZpZGlhLmNvbT4gYW5kIG90aGVycy4KLSAgICAgICogSW5jbHVkZSBlcnJuby5oIHRvIHN1cHBvcnQgZGVmYXVsdCBmYWlsdXJlIGFjdGlvbi4KLQotICAgIFYyLjYuNiBTdW4gRGVjICA1IDA3OjQyOjE5IDE5OTkgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQotICAgICAgKiByZXR1cm4gbnVsbCBmb3IgbmVnYXRpdmUgYXJndW1lbnRzCi0gICAgICAqIEFkZGVkIFNldmVyYWwgV0lOMzIgY2xlYW51cHMgZnJvbSBNYXJ0aW4gQy4gRm9uZyA8bWNmb25nIGF0IHlhaG9vLmNvbT4KLSAgICAgICAgICogQWRkICdMQUNLU19TWVNfUEFSQU1fSCcgZm9yIHRob3NlIHN5c3RlbXMgd2l0aG91dCAnc3lzL3BhcmFtLmgnCi0gICAgICAgICAgKGUuZy4gV0lOMzIgcGxhdGZvcm1zKQotICAgICAgICAgKiBDbGVhbnVwIGhlYWRlciBmaWxlIGluY2x1c2lvbiBmb3IgV0lOMzIgcGxhdGZvcm1zCi0gICAgICAgICAqIENsZWFudXAgY29kZSB0byBhdm9pZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyBjb21waWxlciBjb21wbGFpbnRzCi0gICAgICAgICAqIEFkZCAnVVNFX0RMX1BSRUZJWCcgdG8gcXVpY2tseSBhbGxvdyBjby1leGlzdGVuY2Ugd2l0aCBleGlzdGluZwotICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcwotICAgICAgICAgKiBTZXQgJ21hbGxvY19nZXRwYWdlc2l6ZScgZm9yIFdJTjMyIHBsYXRmb3JtcyAobmVlZHMgbW9yZSB3b3JrKQotICAgICAgICAgKiBVc2UgJ2Fzc2VydCcgcmF0aGVyIHRoYW4gJ0FTU0VSVCcgaW4gV0lOMzIgY29kZSB0byBjb25mb3JtIHRvCi0gICAgICAgICAgIHVzYWdlIG9mICdhc3NlcnQnIGluIG5vbi1XSU4zMiBjb2RlCi0gICAgICAgICAqIEltcHJvdmUgV0lOMzIgJ3NicmsoKScgZW11bGF0aW9uJ3MgJ2ZpbmRSZWdpb24oKScgcm91dGluZSB0bwotICAgICAgICAgICBhdm9pZCBpbmZpbml0ZSBsb29wCi0gICAgICAqIEFsd2F5cyBjYWxsICdmUkVlKCknIHJhdGhlciB0aGFuICdmcmVlKCknCi0KLSAgICBWMi42LjUgV2VkIEp1biAxNyAxNTo1NzozMSAxOTk4ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKLSAgICAgICogRml4ZWQgb3JkZXJpbmcgcHJvYmxlbSB3aXRoIGJvdW5kYXJ5LXN0YW1waW5nCi0KLSAgICBWMi42LjMgU3VuIE1heSAxOSAwODoxNzo1OCAxOTk2ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKLSAgICAgICogQWRkZWQgcHZhbGxvYywgYXMgcmVjb21tZW5kZWQgYnkgSC5KLiBMaXUKLSAgICAgICogQWRkZWQgNjRiaXQgcG9pbnRlciBzdXBwb3J0IG1haW5seSBmcm9tIFdvbGZyYW0gR2xvZ2VyCi0gICAgICAqIEFkZGVkIGFub255bW91c2x5IGRvbmF0ZWQgV0lOMzIgc2JyayBlbXVsYXRpb24KLSAgICAgICogTWFsbG9jLCBjYWxsb2MsIGdldHBhZ2VzaXplOiBhZGQgb3B0aW1pemF0aW9ucyBmcm9tIFJheW1vbmQgTmlqc3NlbgotICAgICAgKiBtYWxsb2NfZXh0ZW5kX3RvcDogZml4IG1hc2sgZXJyb3IgdGhhdCBjYXVzZWQgd2FzdGFnZSBhZnRlcgotICAgICAgICBmb3JlaWduIHNicmtzCi0gICAgICAqIEFkZCBsaW51eCBtcmVtYXAgc3VwcG9ydCBjb2RlIGZyb20gSEogTGl1Ci0KLSAgICBWMi42LjIgVHVlIERlYyAgNSAwNjo1Mjo1NSAxOTk1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKLSAgICAgICogSW50ZWdyYXRlZCBtb3N0IGRvY3VtZW50YXRpb24gd2l0aCB0aGUgY29kZS4KLSAgICAgICogQWRkIHN1cHBvcnQgZm9yIG1tYXAsIHdpdGggaGVscCBmcm9tCi0gICAgICAgIFdvbGZyYW0gR2xvZ2VyIChHbG9nZXJAbHJ6LnVuaS1tdWVuY2hlbi5kZSkuCi0gICAgICAqIFVzZSBsYXN0X3JlbWFpbmRlciBpbiBtb3JlIGNhc2VzLgotICAgICAgKiBQYWNrIGJpbnMgdXNpbmcgaWRlYSBmcm9tICBjb2xpbkBueXgxMC5jcy5kdS5lZHUKLSAgICAgICogVXNlIG9yZGVyZWQgYmlucyBpbnN0ZWFkIG9mIGJlc3QtZml0IHRocmVzaGhvbGQKLSAgICAgICogRWxpbWluYXRlIGJsb2NrLWxvY2FsIGRlY2xzIHRvIHNpbXBsaWZ5IHRyYWNpbmcgYW5kIGRlYnVnZ2luZy4KLSAgICAgICogU3VwcG9ydCBhbm90aGVyIGNhc2Ugb2YgcmVhbGxvYyB2aWEgbW92ZSBpbnRvIHRvcAotICAgICAgKiBGaXggZXJyb3Igb2NjdXJpbmcgd2hlbiBpbml0aWFsIHNicmtfYmFzZSBub3Qgd29yZC1hbGlnbmVkLgotICAgICAgKiBSZWx5IG9uIHBhZ2Ugc2l6ZSBmb3IgdW5pdHMgaW5zdGVhZCBvZiBTQlJLX1VOSVQgdG8KLSAgICAgICAgYXZvaWQgc3VycHJpc2VzIGFib3V0IHNicmsgYWxpZ25tZW50IGNvbnZlbnRpb25zLgotICAgICAgKiBBZGQgbWFsbGluZm8sIG1hbGxvcHQuIFRoYW5rcyB0byBSYXltb25kIE5panNzZW4KLSAgICAgICAgKHJheW1vbmRAZXMuZWxlLnR1ZS5ubCkgZm9yIHRoZSBzdWdnZXN0aW9uLgotICAgICAgKiBBZGQgYHBhZCcgYXJndW1lbnQgdG8gbWFsbG9jX3RyaW0gYW5kIHRvcF9wYWQgbWFsbG9wdCBwYXJhbWV0ZXIuCi0gICAgICAqIE1vcmUgcHJlY2F1dGlvbnMgZm9yIGNhc2VzIHdoZXJlIG90aGVyIHJvdXRpbmVzIGNhbGwgc2JyaywKLSAgICAgICAgY291cnRlc3kgb2YgV29sZnJhbSBHbG9nZXIgKEdsb2dlckBscnoudW5pLW11ZW5jaGVuLmRlKS4KLSAgICAgICogQWRkZWQgbWFjcm9zIGV0Yy4sIGFsbG93aW5nIHVzZSBpbiBsaW51eCBsaWJjIGZyb20KLSAgICAgICAgSC5KLiBMdSAoaGpsQGdudS5haS5taXQuZWR1KQotICAgICAgKiBJbnZlcnRlZCB0aGlzIGhpc3RvcnkgbGlzdAotCi0gICAgVjIuNi4xIFNhdCBEZWMgIDIgMTQ6MTA6NTcgMTk5NSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCi0gICAgICAqIFJlLXR1bmVkIGFuZCBmaXhlZCB0byBiZWhhdmUgbW9yZSBuaWNlbHkgd2l0aCBWMi42LjAgY2hhbmdlcy4KLSAgICAgICogUmVtb3ZlZCBhbGwgcHJlYWxsb2NhdGlvbiBjb2RlIHNpbmNlIHVuZGVyIGN1cnJlbnQgc2NoZW1lCi0gICAgICAgIHRoZSB3b3JrIHJlcXVpcmVkIHRvIHVuZG8gYmFkIHByZWFsbG9jYXRpb25zIGV4Y2VlZHMKLSAgICAgICAgdGhlIHdvcmsgc2F2ZWQgaW4gZ29vZCBjYXNlcyBmb3IgbW9zdCB0ZXN0IHByb2dyYW1zLgotICAgICAgKiBObyBsb25nZXIgdXNlIHJldHVybiBsaXN0IG9yIHVuY29uc29saWRhdGVkIGJpbnMgc2luY2UKLSAgICAgICAgbm8gc2NoZW1lIHVzaW5nIHRoZW0gY29uc2lzdGVudGx5IG91dHBlcmZvcm1zIHRob3NlIHRoYXQgZG9uJ3QKLSAgICAgICAgZ2l2ZW4gYWJvdmUgY2hhbmdlcy4KLSAgICAgICogVXNlIGJlc3QgZml0IGZvciB2ZXJ5IGxhcmdlIGNodW5rcyB0byBwcmV2ZW50IHNvbWUgd29yc3QtY2FzZXMuCi0gICAgICAqIEFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgZGVidWdnaW5nCi0KLSAgICBWMi42LjAgU2F0IE5vdiAgNCAwNzowNToyMyAxOTk1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKLSAgICAgICogUmVtb3ZlZCBmb290ZXJzIHdoZW4gY2h1bmtzIGFyZSBpbiB1c2UuIFRoYW5rcyB0bwotICAgICAgICBQYXVsIFdpbHNvbiAod2lsc29uQGNzLnRleGFzLmVkdSkgZm9yIHRoZSBzdWdnZXN0aW9uLgotCi0gICAgVjIuNS40IFdlZCBOb3YgIDEgMDc6NTQ6NTEgMTk5NSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCi0gICAgICAqIEFkZGVkIG1hbGxvY190cmltLCB3aXRoIGhlbHAgZnJvbSBXb2xmcmFtIEdsb2dlcgotICAgICAgICAod21nbG9ARGVudC5NRUQuVW5pLU11ZW5jaGVuLkRFKS4KLQotICAgIFYyLjUuMyBUdWUgQXByIDI2IDEwOjE2OjAxIDE5OTQgIERvdWcgTGVhICAoZGwgYXQgZykKLQotICAgIFYyLjUuMiBUdWUgQXByICA1IDE2OjIwOjQwIDE5OTQgIERvdWcgTGVhICAoZGwgYXQgZykKLSAgICAgICogcmVhbGxvYzogdHJ5IHRvIGV4cGFuZCBpbiBib3RoIGRpcmVjdGlvbnMKLSAgICAgICogbWFsbG9jOiBzd2FwIG9yZGVyIG9mIGNsZWFuLWJpbiBzdHJhdGVneTsKLSAgICAgICogcmVhbGxvYzogb25seSBjb25kaXRpb25hbGx5IGV4cGFuZCBiYWNrd2FyZHMKLSAgICAgICogVHJ5IG5vdCB0byBzY2F2ZW5nZSB1c2VkIGJpbnMKLSAgICAgICogVXNlIGJpbiBjb3VudHMgYXMgYSBndWlkZSB0byBwcmVhbGxvY2F0aW9uCi0gICAgICAqIE9jY2FzaW9uYWxseSBiaW4gcmV0dXJuIGxpc3QgY2h1bmtzIGluIGZpcnN0IHNjYW4KLSAgICAgICogQWRkIGEgZmV3IG9wdGltaXphdGlvbnMgZnJvbSBjb2xpbkBueXgxMC5jcy5kdS5lZHUKLQotICAgIFYyLjUuMSBTYXQgQXVnIDE0IDE1OjQwOjQzIDE5OTMgIERvdWcgTGVhICAoZGwgYXQgZykKLSAgICAgICogZmFzdGVyIGJpbiBjb21wdXRhdGlvbiAmIHNsaWdodGx5IGRpZmZlcmVudCBiaW5uaW5nCi0gICAgICAqIG1lcmdlZCBhbGwgY29uc29saWRhdGlvbnMgdG8gb25lIHBhcnQgb2YgbWFsbG9jIHByb3BlcgotICAgICAgICAgKGVsaW1pbmF0aW5nIG9sZCBtYWxsb2NfZmluZF9zcGFjZSAmIG1hbGxvY19jbGVhbl9iaW4pCi0gICAgICAqIFNjYW4gMiByZXR1cm5zIGNodW5rcyAobm90IGp1c3QgMSkKLSAgICAgICogUHJvcGFnYXRlIGZhaWx1cmUgaW4gcmVhbGxvYyBpZiBtYWxsb2MgcmV0dXJucyAwCi0gICAgICAqIEFkZCBzdHVmZiB0byBhbGxvdyBjb21waWxhdGlvbiBvbiBub24tQU5TSSBjb21waWxlcnMKLSAgICAgICAgICBmcm9tIGtwdkByZXNlYXJjaC5hdHQuY29tCi0KLSAgICBWMi41IFNhdCBBdWcgIDcgMDc6NDE6NTkgMTk5MyAgRG91ZyBMZWEgIChkbCBhdCBnLm9zd2Vnby5lZHUpCi0gICAgICAqIHJlbW92ZWQgcG90ZW50aWFsIGZvciBvZGQgYWRkcmVzcyBhY2Nlc3MgaW4gcHJldl9jaHVuawotICAgICAgKiByZW1vdmVkIGRlcGVuZGVuY3kgb24gZ2V0cGFnZXNpemUuaAotICAgICAgKiBtaXNjIGNvc21ldGljcyBhbmQgYSBiaXQgbW9yZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uCi0gICAgICAqIGFudGljb3NtZXRpY3M6IG1hbmdsZWQgbmFtZXMgaW4gbWFjcm9zIHRvIGV2YWRlIGRlYnVnZ2VyIHN0cmFuZ2VuZXNzCi0gICAgICAqIHRlc3RlZCBvbiBzcGFyYywgaHAtNzAwLCBkZWMtbWlwcywgcnM2MDAwCi0gICAgICAgICAgd2l0aCBnY2MgJiBuYXRpdmUgY2MgKGhwLCBkZWMgb25seSkgYWxsb3dpbmcKLSAgICAgICAgICBEZXRsZWZzICYgWm9ybiBjb21wYXJpc29uIHN0dWR5IChpbiBTSUdQTEFOIE5vdGljZXMuKQotCi0gICAgVHJpYWwgdmVyc2lvbiBGcmkgQXVnIDI4IDEzOjE0OjI5IDE5OTIgIERvdWcgTGVhICAoZGwgYXQgZy5vc3dlZ28uZWR1KQotICAgICAgKiBCYXNlZCBsb29zZWx5IG9uIGxpYmcrKy0xLjJYIG1hbGxvYy4gKEl0IHJldGFpbnMgc29tZSBvZiB0aGUgb3ZlcmFsbAotICAgICAgICAgc3RydWN0dXJlIG9mIG9sZCB2ZXJzaW9uLCAgYnV0IG1vc3QgZGV0YWlscyBkaWZmZXIuKQotIAotKi8KLQotI2VuZGlmIC8qICFIQVZFX01BTExPQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9zdGRsaWIvU0RMX3Fzb3J0LmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3N0ZGxpYi9TRExfcXNvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3OGQyNS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3N0ZGxpYi9TRExfcXNvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKiBxc29ydC5jCi0gKiAoYykgMTk5OCBHYXJldGggTWNDYXVnaGFuCi0gKgotICogVGhpcyBpcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSBDIGxpYnJhcnkncyB8cXNvcnQoKXwgcm91dGluZS4KLSAqCi0gKiBGZWF0dXJlczoKLSAqICAgLSBNZWRpYW4tb2YtdGhyZWUgcGl2b3RpbmcgKGFuZCBtb3JlKQotICogICAtIFRydW5jYXRpb24gYW5kIGZpbmFsIHBvbGlzaGluZyBieSBhIHNpbmdsZSBpbnNlcnRpb24gc29ydAotICogICAtIEVhcmx5IHRydW5jYXRpb24gd2hlbiBubyBzd2FwcyBuZWVkZWQgaW4gcGl2b3Rpbmcgc3RlcAotICogICAtIEV4cGxpY2l0IHJlY3Vyc2lvbiwgZ3VhcmFudGVlZCBub3QgdG8gb3ZlcmZsb3cKLSAqICAgLSBBIGZldyBsaXR0bGUgd3JpbmtsZXMgc3RvbGVuIGZyb20gdGhlIEdOVSB8cXNvcnQoKXwuCi0gKiAgIC0gc2VwYXJhdGUgY29kZSBmb3Igbm9uLWFsaWduZWQgLyBhbGlnbmVkIC8gd29yZC1zaXplIG9iamVjdHMKLSAqCi0gKiBUaGlzIGNvZGUgbWF5IGJlIHJlcHJvZHVjZWQgZnJlZWx5IHByb3ZpZGVkCi0gKiAgIC0gdGhpcyBmaWxlIGlzIHJldGFpbmVkIHVuYWx0ZXJlZCBhcGFydCBmcm9tIG1pbm9yCi0gKiAgICAgY2hhbmdlcyBmb3IgcG9ydGFiaWxpdHkgYW5kIGVmZmljaWVuY3kKLSAqICAgLSBubyBjaGFuZ2VzIGFyZSBtYWRlIHRvIHRoaXMgY29tbWVudAotICogICAtIGFueSBjaGFuZ2VzIHRoYXQgKmFyZSogbWFkZSBhcmUgY2xlYXJseSBmbGFnZ2VkCi0gKiAgIC0gdGhlIF9JRCBzdHJpbmcgYmVsb3cgaXMgYWx0ZXJlZCBieSBpbnNlcnRpbmcsIGFmdGVyCi0gKiAgICAgdGhlIGRhdGUsIHRoZSBzdHJpbmcgIiBhbHRlcmVkIiBmb2xsb3dlZCBhdCB5b3VyIG9wdGlvbgotICogICAgIGJ5IG90aGVyIG1hdGVyaWFsLiAoRXhjZXB0aW9uczogeW91IG1heSBjaGFuZ2UgdGhlIG5hbWUKLSAqICAgICBvZiB0aGUgZXhwb3J0ZWQgcm91dGluZSB3aXRob3V0IGNoYW5naW5nIHRoZSBJRCBzdHJpbmcuCi0gKiAgICAgWW91IG1heSBjaGFuZ2UgdGhlIHZhbHVlcyBvZiB0aGUgbWFjcm9zIFRSVU5DXyogYW5kCi0gKiAgICAgUElWT1RfVEhSRVNIT0xEIHdpdGhvdXQgY2hhbmdpbmcgdGhlIElEIHN0cmluZywgcHJvdmlkZWQKLSAqICAgICB0aGV5IHJlbWFpbiBjb25zdGFudHMgd2l0aCBUUlVOQ19ub25hbGlnbmVkLCBUUlVOQ19hbGlnbmVkCi0gKiAgICAgYW5kIFRSVU5DX3dvcmRzL1dPUkRfQllURVMgYmV0d2VlbiA4IGFuZCAyNCwgYW5kCi0gKiAgICAgUElWT1RfVEhSRVNIT0xEIGJldHdlZW4gMzIgYW5kIDIwMC4pCi0gKgotICogWW91IG1heSB1c2UgaXQgaW4gYW55dGhpbmcgeW91IGxpa2U7IHlvdSBtYXkgbWFrZSBtb25leQotICogb3V0IG9mIGl0OyB5b3UgbWF5IGRpc3RyaWJ1dGUgaXQgaW4gb2JqZWN0IGZvcm0gb3IgYXMKLSAqIHBhcnQgb2YgYW4gZXhlY3V0YWJsZSB3aXRob3V0IGluY2x1ZGluZyBzb3VyY2UgY29kZTsKLSAqIHlvdSBkb24ndCBoYXZlIHRvIGNyZWRpdCBtZS4gKEJ1dCBpdCB3b3VsZCBiZSBuaWNlIGlmCi0gKiB5b3UgZGlkLikKLSAqCi0gKiBJZiB5b3UgZmluZCBwcm9ibGVtcyB3aXRoIHRoaXMgY29kZSwgb3IgZmluZCB3YXlzIG9mCi0gKiBtYWtpbmcgaXQgc2lnbmlmaWNhbnRseSBmYXN0ZXIsIHBsZWFzZSBsZXQgbWUga25vdyEKLSAqIE15IGUtbWFpbCBhZGRyZXNzLCB2YWxpZCBhcyBvZiBlYXJseSAxOTk4IGFuZCBjZXJ0YWlubHkKLSAqIE9LIGZvciBhdCBsZWFzdCB0aGUgbmV4dCAxOCBtb250aHMsIGlzCi0gKiAgICBnam0xMUBkcG1tcy5jYW0uYWMudWsKLSAqIFRoYW5rcyEKLSAqCi0gKiBHYXJldGggTWNDYXVnaGFuICAgUGV0ZXJob3VzZSAgIENhbWJyaWRnZSAgIDE5OTgKLSAqLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSovCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotCi0jZGVmaW5lIGFzc2VydChYKQotI2RlZmluZSBtYWxsb2MJU0RMX21hbGxvYwotI2RlZmluZSBmcmVlCVNETF9mcmVlCi0jZGVmaW5lIG1lbWNweQlTRExfbWVtY3B5Ci0jZGVmaW5lIG1lbW1vdmUJU0RMX21lbW1vdmUKLSNkZWZpbmUgcXNvcnQJU0RMX3Fzb3J0Ci0KLQotI2lmbmRlZiBIQVZFX1FTT1JUCi0KLXN0YXRpYyBjaGFyIF9JRFtdPSI8cXNvcnQuYyBnam0gMS4xMiAxOTk4LTAzLTE5PiI7Ci0KLS8qIEhvdyBtYW55IGJ5dGVzIGFyZSB0aGVyZSBwZXIgd29yZD8gKE11c3QgYmUgYSBwb3dlciBvZiAyLAotICogYW5kIG11c3QgaW4gZmFjdCBlcXVhbCBzaXplb2YoaW50KS4pCi0gKi8KLSNkZWZpbmUgV09SRF9CWVRFUyBzaXplb2YoaW50KQotCi0vKiBIb3cgYmlnIGRvZXMgb3VyIHN0YWNrIG5lZWQgdG8gYmU/IEFuc3dlcjogb25lIGVudHJ5IHBlcgotICogYml0IGluIGEgfHNpemVfdHwuCi0gKi8KLSNkZWZpbmUgU1RBQ0tfU0laRSAoOCpzaXplb2Yoc2l6ZV90KSkKLQotLyogRGlmZmVyZW50IHNpdHVhdGlvbnMgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzLAotICogYW5kIHdlIG1ha2UgbGlmZSBlcHNpbG9uIGVhc2llciBieSB1c2luZyBkaWZmZXJlbnQgdHJ1bmNhdGlvbgotICogcG9pbnRzIGZvciB0aGUgdGhyZWUgZGlmZmVyZW50IGNhc2VzLgotICogU28gZmFyLCBJIGhhdmUgdHVuZWQgVFJVTkNfd29yZHMgYW5kIGd1ZXNzZWQgdGhhdCB0aGUgc2FtZQotICogdmFsdWUgbWlnaHQgd29yayB3ZWxsIGZvciB0aGUgb3RoZXIgdHdvIGNhc2VzLiBPZiBjb3Vyc2UKLSAqIHdoYXQgd29ya3Mgd2VsbCBvbiBteSBtYWNoaW5lIG1pZ2h0IHdvcmsgYmFkbHkgb24geW91cnMuCi0gKi8KLSNkZWZpbmUgVFJVTkNfbm9uYWxpZ25lZAkxMgotI2RlZmluZSBUUlVOQ19hbGlnbmVkCQkxMgotI2RlZmluZSBUUlVOQ193b3JkcwkJMTIqV09SRF9CWVRFUwkvKiBuYiBkaWZmZXJlbnQgbWVhbmluZyAqLwotCi0vKiBXZSB1c2UgYSBzaW1wbGUgcGl2b3RpbmcgYWxnb3JpdGhtIGZvciBzaG9ydGlzaCBzdWItYXJyYXlzCi0gKiBhbmQgYSBtb3JlIGNvbXBsaWNhdGVkIG9uZSBmb3IgbGFyZ2VyIG9uZXMuIFRoZSB0aHJlc2hvbGQKLSAqIGlzIFBJVk9UX1RIUkVTSE9MRC4KLSAqLwotI2RlZmluZSBQSVZPVF9USFJFU0hPTEQgNDAKLQotdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyICogZmlyc3Q7IGNoYXIgKiBsYXN0OyB9IHN0YWNrX2VudHJ5OwotI2RlZmluZSBwdXNoTGVmdCB7c3RhY2tbc3RhY2t0b3BdLmZpcnN0PWZmaXJzdDtzdGFja1tzdGFja3RvcCsrXS5sYXN0PWxhc3Q7fQotI2RlZmluZSBwdXNoUmlnaHQge3N0YWNrW3N0YWNrdG9wXS5maXJzdD1maXJzdDtzdGFja1tzdGFja3RvcCsrXS5sYXN0PWxsYXN0O30KLSNkZWZpbmUgZG9MZWZ0IHtmaXJzdD1mZmlyc3Q7bGxhc3Q9bGFzdDtjb250aW51ZTt9Ci0jZGVmaW5lIGRvUmlnaHQge2ZmaXJzdD1maXJzdDtsYXN0PWxsYXN0O2NvbnRpbnVlO30KLSNkZWZpbmUgcG9wIHtpZiAoLS1zdGFja3RvcDwwKSBicmVhaztcCi0gIGZpcnN0PWZmaXJzdD1zdGFja1tzdGFja3RvcF0uZmlyc3Q7XAotICBsYXN0PWxsYXN0PXN0YWNrW3N0YWNrdG9wXS5sYXN0O1wKLSAgY29udGludWU7fQotCi0vKiBTb21lIGNvbW1lbnRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAqIDEuIFdoZW4gd2UgZmluaXNoIHBhcnRpdGlvbmluZyB0aGUgYXJyYXkgaW50byAibG93IgotICogICAgYW5kICJoaWdoIiwgd2UgZm9yZ2V0IGVudGlyZWx5IGFib3V0IHNob3J0IHN1YmFycmF5cywKLSAqICAgIGJlY2F1c2UgdGhleSdsbCBiZSBkb25lIGxhdGVyIGJ5IGluc2VydGlvbiBzb3J0LgotICogICAgRG9pbmcgbG90cyBvZiBsaXR0bGUgaW5zZXJ0aW9uIHNvcnRzIG1pZ2h0IGJlIGEgd2luCi0gKiAgICBvbiBsYXJnZSBkYXRhc2V0cyBmb3IgbG9jYWxpdHktb2YtcmVmZXJlbmNlIHJlYXNvbnMsCi0gKiAgICBidXQgaXQgbWFrZXMgdGhlIGNvZGUgbXVjaCBuYXN0aWVyIGFuZCBpbmNyZWFzZXMKLSAqICAgIGJvb2trZWVwaW5nIG92ZXJoZWFkLgotICogMi4gV2UgYWx3YXlzIHNhdmUgdGhlIHNob3J0ZXIgYW5kIGdldCB0byB3b3JrIG9uIHRoZQotICogICAgbG9uZ2VyLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCBldmVyeSB0aW1lIHdlIHB1c2gKLSAqICAgIGFuIGl0ZW0gb250byB0aGUgc3RhY2sgaXRzIHNpemUgaXMgPD0gMS8yIG9mIHRoYXQKLSAqICAgIG9mIGl0cyBwYXJlbnQ7IHNvIHRoZSBzdGFjayBjYW4ndCBuZWVkIG1vcmUgdGhhbgotICogICAgbG9nXzIobWF4LWFycmF5LXNpemUpIGVudHJpZXMuCi0gKiAzLiBXZSBjaG9vc2UgYSBwaXZvdCBieSBsb29raW5nIGF0IHRoZSBmaXJzdCwgbGFzdAotICogICAgYW5kIG1pZGRsZSBlbGVtZW50cy4gV2UgYXJyYW5nZSB0aGVtIGludG8gb3JkZXIKLSAqICAgIGJlY2F1c2UgaXQncyBlYXN5IHRvIGRvIHRoYXQgaW4gY29uanVuY3Rpb24gd2l0aAotICogICAgY2hvb3NpbmcgdGhlIHBpdm90LCBhbmQgaXQgbWFrZXMgdGhpbmdzIGEgbGl0dGxlCi0gKiAgICBlYXNpZXIgaW4gdGhlIHBhcnRpdGlvbmluZyBzdGVwLiBBbnl3YXksIHRoZSBwaXZvdAotICogICAgaXMgdGhlIG1pZGRsZSBvZiB0aGVzZSB0aHJlZS4gSXQncyBzdGlsbCBwb3NzaWJsZQotICogICAgdG8gY29uc3RydWN0IGRhdGFzZXRzIHdoZXJlIHRoZSBhbGdvcml0aG0gdGFrZXMKLSAqICAgIHRpbWUgb2Ygb3JkZXIgbl4yLCBidXQgaXQgc2ltcGx5IG5ldmVyIGhhcHBlbnMgaW4KLSAqICAgIHByYWN0aWNlLgotICogMycgTmV3c2ZsYXNoOiBPbiBmdXJ0aGVyIGludmVzdGlnYXRpb24gSSBmaW5kIHRoYXQKLSAqICAgIGl0J3MgZWFzeSB0byBjb25zdHJ1Y3QgZGF0YXNldHMgd2hlcmUgbWVkaWFuLW9mLTMKLSAqICAgIHNpbXBseSBpc24ndCBnb29kIGVub3VnaC4gU28gb24gbGFyZ2UtaXNoIHN1YmFycmF5cwotICogICAgd2UgZG8gYSBtb3JlIHNvcGhpc3RpY2F0ZWQgcGl2b3Rpbmc6IHdlIHRha2UgdGhyZWUKLSAqICAgIHNldHMgb2YgMyBlbGVtZW50cywgZmluZCB0aGVpciBtZWRpYW5zLCBhbmQgdGhlbgotICogICAgdGFrZSB0aGUgbWVkaWFuIG9mIHRob3NlLgotICogNC4gV2UgY29weSB0aGUgcGl2b3QgZWxlbWVudCB0byBhIHNlcGFyYXRlIHBsYWNlCi0gKiAgICBiZWNhdXNlIHRoYXQgd2F5IHdlIGNhbiBhbHdheXMgZG8gb3VyIGNvbXBhcmlzb25zCi0gKiAgICBkaXJlY3RseSBhZ2FpbnN0IGEgcG9pbnRlciB0byB0aGF0IHNlcGFyYXRlIHBsYWNlLAotICogICAgYW5kIGRvbid0IGhhdmUgdG8gd29uZGVyICJkaWQgd2UgbW92ZSB0aGUgcGl2b3QKLSAqICAgIGVsZW1lbnQ/Ii4gVGhpcyBtYWtlcyB0aGUgaW5uZXIgbG9vcCBiZXR0ZXIuCi0gKiA1LiBJdCdzIHBvc3NpYmxlIHRvIG1ha2UgdGhlIHBpdm90aW5nIGV2ZW4gbW9yZQotICogICAgcmVsaWFibGUgYnkgbG9va2luZyBhdCBtb3JlIGNhbmRpZGF0ZXMgd2hlbiBuCi0gKiAgICBpcyBsYXJnZXIuIChUYWtpbmcgdGhpcyB0byBpdHMgbG9naWNhbCBjb25jbHVzaW9uCi0gKiAgICByZXN1bHRzIGluIGEgdmFyaWFudCBvZiBxdWlja3NvcnQgdGhhdCBkb2Vzbid0Ci0gKiAgICBoYXZlIHRoYXQgbl4yIHdvcnN0IGNhc2UuKSBIb3dldmVyLCB0aGUgb3ZlcmhlYWQKLSAqICAgIGZyb20gdGhlIGV4dHJhIGJvb2trZWVwaW5nIG1lYW5zIHRoYXQgaXQncyBqdXN0Ci0gKiAgICBub3Qgd29ydGggd2hpbGUuCi0gKiA2LiBUaGlzIGlzIHByZXR0eSBjbGVhbiBhbmQgcG9ydGFibGUgY29kZS4gSGVyZSBhcmUKLSAqICAgIGFsbCB0aGUgcG90ZW50aWFsIHBvcnRhYmlsaXR5IHBpdGZhbGxzIGFuZCBwcm9ibGVtcwotICogICAgSSBrbm93IG9mOgotICogICAgICAtIEluIG9uZSBwbGFjZSAodGhlIGluc2VydGlvbiBzb3J0KSBJIGNvbnN0cnVjdAotICogICAgICAgIGEgcG9pbnRlciB0aGF0IHBvaW50cyBqdXN0IHBhc3QgdGhlIGVuZCBvZiB0aGUKLSAqICAgICAgICBzdXBwbGllZCBhcnJheSwgYW5kIGFzc3VtZSB0aGF0IChhKSBpdCB3b24ndAotICogICAgICAgIGNvbXBhcmUgZXF1YWwgdG8gYW55IHBvaW50ZXIgd2l0aGluIHRoZSBhcnJheSwKLSAqICAgICAgICBhbmQgKGIpIGl0IHdpbGwgY29tcGFyZSBlcXVhbCB0byBhIHBvaW50ZXIKLSAqICAgICAgICBvYnRhaW5lZCBieSBzdGVwcGluZyBvZmYgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCi0gKiAgICAgICAgVGhlc2UgbWlnaHQgZmFpbCBvbiBzb21lIHNlZ21lbnRlZCBhcmNoaXRlY3R1cmVzLgotICogICAgICAtIEkgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIDggYml0cyBpbiBhIHxjaGFyfCB3aGVuCi0gKiAgICAgICAgY29tcHV0aW5nIHRoZSBzaXplIG9mIHN0YWNrIG5lZWRlZC4gVGhpcyB3b3VsZAotICogICAgICAgIGZhaWwgb24gbWFjaGluZXMgd2l0aCA5LWJpdCBvciAxNi1iaXQgYnl0ZXMuCi0gKiAgICAgIC0gSSBhc3N1bWUgdGhhdCBpZiB8KChpbnQpYmFzZSYoc2l6ZW9mKGludCktMSkpPT0wfAotICogICAgICAgIGFuZCB8KHNpemUmKHNpemVvZihpbnQpLTEpKT09MHwgdGhlbiBpdCdzIHNhZmUgdG8KLSAqICAgICAgICBnZXQgYXQgYXJyYXkgZWxlbWVudHMgdmlhIHxpbnQqfHMsIGFuZCB0aGF0IGlmCi0gKiAgICAgICAgYWN0dWFsbHkgfHNpemU9PXNpemVvZihpbnQpfCBhcyB3ZWxsIHRoZW4gaXQncwotICogICAgICAgIHNhZmUgdG8gdHJlYXQgdGhlIGVsZW1lbnRzIGFzIHxpbnR8cy4gVGhpcyBtaWdodAotICogICAgICAgIGZhaWwgb24gc3lzdGVtcyB0aGF0IGNvbnZlcnQgcG9pbnRlcnMgdG8gaW50ZWdlcnMKLSAqICAgICAgICBpbiBub24tc3RhbmRhcmQgd2F5cy4KLSAqICAgICAgLSBJIGFzc3VtZSB0aGF0IHw4KnNpemVvZihzaXplX3QpPD1JTlRfTUFYfC4gVGhpcwotICogICAgICAgIHdvdWxkIGJlIGZhbHNlIG9uIGEgbWFjaGluZSB3aXRoIDgtYml0IHxjaGFyfHMsCi0gKiAgICAgICAgMTYtYml0IHxpbnR8cyBhbmQgNDA5Ni1iaXQgfHNpemVfdHxzLiA6LSkKLSAqLwotCi0vKiBUaGUgcmVjdXJzaW9uIGxvZ2ljIGlzIHRoZSBzYW1lIGluIGVhY2ggY2FzZTogKi8KLSNkZWZpbmUgUmVjdXJzZShUcnVuYykJCQkJXAotICAgICAgeyBzaXplX3QgbD1sYXN0LWZmaXJzdCxyPWxsYXN0LWZpcnN0OwlcCi0gICAgICAgIGlmIChsPFRydW5jKSB7CQkJCVwKLSAgICAgICAgICBpZiAocj49VHJ1bmMpIGRvUmlnaHQJCQlcCi0gICAgICAgICAgZWxzZSBwb3AJCQkJXAotICAgICAgICB9CQkJCQlcCi0gICAgICAgIGVsc2UgaWYgKGw8PXIpIHsgcHVzaExlZnQ7IGRvUmlnaHQgfQlcCi0gICAgICAgIGVsc2UgaWYgKHI+PVRydW5jKSB7IHB1c2hSaWdodDsgZG9MZWZ0IH1cCi0gICAgICAgIGVsc2UgZG9MZWZ0CQkJCVwKLSAgICAgIH0KLQotLyogYW5kIHNvIGlzIHRoZSBwaXZvdGluZyBsb2dpYzogKi8KLSNkZWZpbmUgUGl2b3Qoc3dhcHBlcixzeikJCQlcCi0gIGlmICgoc2l6ZV90KShsYXN0LWZpcnN0KT5QSVZPVF9USFJFU0hPTEQqc3opIG1pZD1waXZvdF9iaWcoZmlyc3QsbWlkLGxhc3Qsc3osY29tcGFyZSk7XAotICBlbHNlIHsJXAotICAgIGlmIChjb21wYXJlKGZpcnN0LG1pZCk8MCkgewkJCVwKLSAgICAgIGlmIChjb21wYXJlKG1pZCxsYXN0KT4wKSB7CQlcCi0gICAgICAgIHN3YXBwZXIobWlkLGxhc3QpOwkJCVwKLSAgICAgICAgaWYgKGNvbXBhcmUoZmlyc3QsbWlkKT4wKSBzd2FwcGVyKGZpcnN0LG1pZCk7XAotICAgICAgfQkJCQkJCVwKLSAgICB9CQkJCQkJXAotICAgIGVsc2UgewkJCQkJXAotICAgICAgaWYgKGNvbXBhcmUobWlkLGxhc3QpPjApIHN3YXBwZXIoZmlyc3QsbGFzdClcCi0gICAgICBlbHNlIHsJCQkJCVwKLSAgICAgICAgc3dhcHBlcihmaXJzdCxtaWQpOwkJCVwKLSAgICAgICAgaWYgKGNvbXBhcmUobWlkLGxhc3QpPjApIHN3YXBwZXIobWlkLGxhc3QpO1wKLSAgICAgIH0JCQkJCQlcCi0gICAgfQkJCQkJCVwKLSAgICBmaXJzdCs9c3o7IGxhc3QtPXN6OwkJCVwKLSAgfQotCi0jaWZkZWYgREVCVUdfUVNPUlQKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0KLS8qIGFuZCBzbyBpcyB0aGUgcGFydGl0aW9uaW5nIGxvZ2ljOiAqLwotI2RlZmluZSBQYXJ0aXRpb24oc3dhcHBlcixzeikgewkJCVwKLSAgaW50IHN3YXBwZWQ9MDsJCQkJXAotICBkbyB7CQkJCQkJXAotICAgIHdoaWxlIChjb21wYXJlKGZpcnN0LHBpdm90KTwwKSBmaXJzdCs9c3o7CVwKLSAgICB3aGlsZSAoY29tcGFyZShwaXZvdCxsYXN0KTwwKSBsYXN0LT1zejsJXAotICAgIGlmIChmaXJzdDxsYXN0KSB7CQkJCVwKLSAgICAgIHN3YXBwZXIoZmlyc3QsbGFzdCk7IHN3YXBwZWQ9MTsJCVwKLSAgICAgIGZpcnN0Kz1zejsgbGFzdC09c3o7IH0JCQlcCi0gICAgZWxzZSBpZiAoZmlyc3Q9PWxhc3QpIHsgZmlyc3QrPXN6OyBsYXN0LT1zejsgYnJlYWs7IH1cCi0gIH0gd2hpbGUgKGZpcnN0PD1sYXN0KTsJCQlcCi0gIGlmICghc3dhcHBlZCkgcG9wCQkJCVwKLX0KLQotLyogYW5kIHNvIGlzIHRoZSBwcmUtaW5zZXJ0aW9uLXNvcnQgb3BlcmF0aW9uIG9mIHB1dHRpbmcKLSAqIHRoZSBzbWFsbGVzdCBlbGVtZW50IGludG8gcGxhY2UgYXMgYSBzZW50aW5lbC4KLSAqIERvaW5nIHRoaXMgbWFrZXMgdGhlIGlubmVyIGxvb3AgbmljZXIuIEkgZ290IHRoaXMKLSAqIGlkZWEgZnJvbSB0aGUgR05VIGltcGxlbWVudGF0aW9uIG9mIHFzb3J0KCkuCi0gKi8KLSNkZWZpbmUgUHJlSW5zZXJ0aW9uKHN3YXBwZXIsbGltaXQsc3opCQlcCi0gIGZpcnN0PWJhc2U7CQkJCQlcCi0gIGxhc3Q9Zmlyc3QgKyAobm1lbWI+bGltaXQgPyBsaW1pdCA6IG5tZW1iLTEpKnN6O1wKLSAgd2hpbGUgKGxhc3QhPWJhc2UpIHsJCQkJXAotICAgIGlmIChjb21wYXJlKGZpcnN0LGxhc3QpPjApIGZpcnN0PWxhc3Q7CVwKLSAgICBsYXN0LT1zejsgfQkJCQkJXAotICBpZiAoZmlyc3QhPWJhc2UpIHN3YXBwZXIoZmlyc3QsKGNoYXIqKWJhc2UpOwotCi0vKiBhbmQgc28gaXMgdGhlIGluc2VydGlvbiBzb3J0LCBpbiB0aGUgZmlyc3QgdHdvIGNhc2VzOiAqLwotI2RlZmluZSBJbnNlcnRpb24oc3dhcHBlcikJCQlcCi0gIGxhc3Q9KChjaGFyKiliYXNlKStubWVtYipzaXplOwkJXAotICBmb3IgKGZpcnN0PSgoY2hhciopYmFzZSkrc2l6ZTtmaXJzdCE9bGFzdDtmaXJzdCs9c2l6ZSkgewlcCi0gICAgY2hhciAqdGVzdDsJCQkJCVwKLSAgICAvKiBGaW5kIHRoZSByaWdodCBwbGFjZSBmb3IgfGZpcnN0fC4JXAotICAgICAqIE15IGFwb2xvZ2llcyBmb3IgdmFyIHJldXNlLiAqLwkJXAotICAgIGZvciAodGVzdD1maXJzdC1zaXplO2NvbXBhcmUodGVzdCxmaXJzdCk+MDt0ZXN0LT1zaXplKSA7CVwKLSAgICB0ZXN0Kz1zaXplOwkJCQkJXAotICAgIGlmICh0ZXN0IT1maXJzdCkgewkJCQlcCi0gICAgICAvKiBTaGlmdCBldmVyeXRoaW5nIGluIFt0ZXN0LGZpcnN0KQlcCi0gICAgICAgKiB1cCBieSBvbmUsIGFuZCBwbGFjZSB8Zmlyc3R8CQlcCi0gICAgICAgKiB3aGVyZSB8dGVzdHwgaXMuICovCQkJXAotICAgICAgbWVtY3B5KHBpdm90LGZpcnN0LHNpemUpOwkJCVwKLSAgICAgIG1lbW1vdmUodGVzdCtzaXplLHRlc3QsZmlyc3QtdGVzdCk7CVwKLSAgICAgIG1lbWNweSh0ZXN0LHBpdm90LHNpemUpOwkJCVwKLSAgICB9CQkJCQkJXAotICB9Ci0KLSNkZWZpbmUgU1dBUF9ub25hbGlnbmVkKGEsYikgeyBcCi0gIHJlZ2lzdGVyIGNoYXIgKmFhPShhKSwqYmI9KGIpOyBcCi0gIHJlZ2lzdGVyIHNpemVfdCBzej1zaXplOyBcCi0gIGRvIHsgcmVnaXN0ZXIgY2hhciB0PSphYTsgKmFhKys9KmJiOyAqYmIrKz10OyB9IHdoaWxlICgtLXN6KTsgfQotCi0jZGVmaW5lIFNXQVBfYWxpZ25lZChhLGIpIHsgXAotICByZWdpc3RlciBpbnQgKmFhPShpbnQqKShhKSwqYmI9KGludCopKGIpOyBcCi0gIHJlZ2lzdGVyIHNpemVfdCBzej1zaXplOyBcCi0gIGRvIHsgcmVnaXN0ZXIgaW50IHQ9KmFhOyphYSsrPSpiYjsgKmJiKys9dDsgfSB3aGlsZSAoc3otPVdPUkRfQllURVMpOyB9Ci0KLSNkZWZpbmUgU1dBUF93b3JkcyhhLGIpIHsgXAotICByZWdpc3RlciBpbnQgdD0qKChpbnQqKWEpOyAqKChpbnQqKWEpPSooKGludCopYik7ICooKGludCopYik9dDsgfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBjaGFyICogcGl2b3RfYmlnKGNoYXIgKmZpcnN0LCBjaGFyICptaWQsIGNoYXIgKmxhc3QsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmUoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSB7Ci0gIHNpemVfdCBkPSgoKGxhc3QtZmlyc3QpL3NpemUpPj4zKSpzaXplOwotICBjaGFyICptMSwqbTIsKm0zOwotICB7IGNoYXIgKmE9Zmlyc3QsICpiPWZpcnN0K2QsICpjPWZpcnN0KzIqZDsKLSNpZmRlZiBERUJVR19RU09SVAotZnByaW50ZihzdGRlcnIsIjwgJWQgJWQgJWRcbiIsKihpbnQqKWEsKihpbnQqKWIsKihpbnQqKWMpOwotI2VuZGlmCi0gICAgbTEgPSBjb21wYXJlKGEsYik8MCA/Ci0gICAgICAgICAgIChjb21wYXJlKGIsYyk8MCA/IGIgOiAoY29tcGFyZShhLGMpPDAgPyBjIDogYSkpCi0gICAgICAgICA6IChjb21wYXJlKGEsYyk8MCA/IGEgOiAoY29tcGFyZShiLGMpPDAgPyBjIDogYikpOwotICB9Ci0gIHsgY2hhciAqYT1taWQtZCwgKmI9bWlkLCAqYz1taWQrZDsKLSNpZmRlZiBERUJVR19RU09SVAotZnByaW50ZihzdGRlcnIsIi4gJWQgJWQgJWRcbiIsKihpbnQqKWEsKihpbnQqKWIsKihpbnQqKWMpOwotI2VuZGlmCi0gICAgbTIgPSBjb21wYXJlKGEsYik8MCA/Ci0gICAgICAgICAgIChjb21wYXJlKGIsYyk8MCA/IGIgOiAoY29tcGFyZShhLGMpPDAgPyBjIDogYSkpCi0gICAgICAgICA6IChjb21wYXJlKGEsYyk8MCA/IGEgOiAoY29tcGFyZShiLGMpPDAgPyBjIDogYikpOwotICB9Ci0gIHsgY2hhciAqYT1sYXN0LTIqZCwgKmI9bGFzdC1kLCAqYz1sYXN0OwotI2lmZGVmIERFQlVHX1FTT1JUCi1mcHJpbnRmKHN0ZGVyciwiPiAlZCAlZCAlZFxuIiwqKGludCopYSwqKGludCopYiwqKGludCopYyk7Ci0jZW5kaWYKLSAgICBtMyA9IGNvbXBhcmUoYSxiKTwwID8KLSAgICAgICAgICAgKGNvbXBhcmUoYixjKTwwID8gYiA6IChjb21wYXJlKGEsYyk8MCA/IGMgOiBhKSkKLSAgICAgICAgIDogKGNvbXBhcmUoYSxjKTwwID8gYSA6IChjb21wYXJlKGIsYyk8MCA/IGMgOiBiKSk7Ci0gIH0KLSNpZmRlZiBERUJVR19RU09SVAotZnByaW50ZihzdGRlcnIsIi0+ICVkICVkICVkXG4iLCooaW50KiltMSwqKGludCopbTIsKihpbnQqKW0zKTsKLSNlbmRpZgotICByZXR1cm4gY29tcGFyZShtMSxtMik8MCA/Ci0gICAgICAgICAgIChjb21wYXJlKG0yLG0zKTwwID8gbTIgOiAoY29tcGFyZShtMSxtMyk8MCA/IG0zIDogbTEpKQotICAgICAgICAgOiAoY29tcGFyZShtMSxtMyk8MCA/IG0xIDogKGNvbXBhcmUobTIsbTMpPDAgPyBtMyA6IG0yKSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgcXNvcnRfbm9uYWxpZ25lZCh2b2lkICpiYXNlLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLAotICAgICAgICAgICBpbnQgKCpjb21wYXJlKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIHsKLQotICBzdGFja19lbnRyeSBzdGFja1tTVEFDS19TSVpFXTsKLSAgaW50IHN0YWNrdG9wPTA7Ci0gIGNoYXIgKmZpcnN0LCpsYXN0OwotICBjaGFyICpwaXZvdD1tYWxsb2Moc2l6ZSk7Ci0gIHNpemVfdCB0cnVuYz1UUlVOQ19ub25hbGlnbmVkKnNpemU7Ci0gIGFzc2VydChwaXZvdCE9MCk7Ci0KLSAgZmlyc3Q9KGNoYXIqKWJhc2U7IGxhc3Q9Zmlyc3QrKG5tZW1iLTEpKnNpemU7Ci0KLSAgaWYgKChzaXplX3QpKGxhc3QtZmlyc3QpPnRydW5jKSB7Ci0gICAgY2hhciAqZmZpcnN0PWZpcnN0LCAqbGxhc3Q9bGFzdDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgLyogU2VsZWN0IHBpdm90ICovCi0gICAgICB7IGNoYXIgKiBtaWQ9Zmlyc3Qrc2l6ZSooKGxhc3QtZmlyc3QpL3NpemUgPj4gMSk7Ci0gICAgICAgIFBpdm90KFNXQVBfbm9uYWxpZ25lZCxzaXplKTsKLSAgICAgICAgbWVtY3B5KHBpdm90LG1pZCxzaXplKTsKLSAgICAgIH0KLSAgICAgIC8qIFBhcnRpdGlvbi4gKi8KLSAgICAgIFBhcnRpdGlvbihTV0FQX25vbmFsaWduZWQsc2l6ZSk7Ci0gICAgICAvKiBQcmVwYXJlIHRvIHJlY3Vyc2UvaXRlcmF0ZS4gKi8KLSAgICAgIFJlY3Vyc2UodHJ1bmMpCi0gICAgfQotICB9Ci0gIFByZUluc2VydGlvbihTV0FQX25vbmFsaWduZWQsVFJVTkNfbm9uYWxpZ25lZCxzaXplKTsKLSAgSW5zZXJ0aW9uKFNXQVBfbm9uYWxpZ25lZCk7Ci0gIGZyZWUocGl2b3QpOwotfQotCi1zdGF0aWMgdm9pZCBxc29ydF9hbGlnbmVkKHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgIGludCAoKmNvbXBhcmUpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgewotCi0gIHN0YWNrX2VudHJ5IHN0YWNrW1NUQUNLX1NJWkVdOwotICBpbnQgc3RhY2t0b3A9MDsKLSAgY2hhciAqZmlyc3QsKmxhc3Q7Ci0gIGNoYXIgKnBpdm90PW1hbGxvYyhzaXplKTsKLSAgc2l6ZV90IHRydW5jPVRSVU5DX2FsaWduZWQqc2l6ZTsKLSAgYXNzZXJ0KHBpdm90IT0wKTsKLQotICBmaXJzdD0oY2hhciopYmFzZTsgbGFzdD1maXJzdCsobm1lbWItMSkqc2l6ZTsKLQotICBpZiAoKHNpemVfdCkobGFzdC1maXJzdCk+dHJ1bmMpIHsKLSAgICBjaGFyICpmZmlyc3Q9Zmlyc3QsKmxsYXN0PWxhc3Q7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIC8qIFNlbGVjdCBwaXZvdCAqLwotICAgICAgeyBjaGFyICogbWlkPWZpcnN0K3NpemUqKChsYXN0LWZpcnN0KS9zaXplID4+IDEpOwotICAgICAgICBQaXZvdChTV0FQX2FsaWduZWQsc2l6ZSk7Ci0gICAgICAgIG1lbWNweShwaXZvdCxtaWQsc2l6ZSk7Ci0gICAgICB9Ci0gICAgICAvKiBQYXJ0aXRpb24uICovCi0gICAgICBQYXJ0aXRpb24oU1dBUF9hbGlnbmVkLHNpemUpOwotICAgICAgLyogUHJlcGFyZSB0byByZWN1cnNlL2l0ZXJhdGUuICovCi0gICAgICBSZWN1cnNlKHRydW5jKQotICAgIH0KLSAgfQotICBQcmVJbnNlcnRpb24oU1dBUF9hbGlnbmVkLFRSVU5DX2FsaWduZWQsc2l6ZSk7Ci0gIEluc2VydGlvbihTV0FQX2FsaWduZWQpOwotICBmcmVlKHBpdm90KTsKLX0KLQotc3RhdGljIHZvaWQgcXNvcnRfd29yZHModm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLAotICAgICAgICAgICBpbnQgKCpjb21wYXJlKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIHsKLQotICBzdGFja19lbnRyeSBzdGFja1tTVEFDS19TSVpFXTsKLSAgaW50IHN0YWNrdG9wPTA7Ci0gIGNoYXIgKmZpcnN0LCpsYXN0OwotICBjaGFyICpwaXZvdD1tYWxsb2MoV09SRF9CWVRFUyk7Ci0gIGFzc2VydChwaXZvdCE9MCk7Ci0KLSAgZmlyc3Q9KGNoYXIqKWJhc2U7IGxhc3Q9Zmlyc3QrKG5tZW1iLTEpKldPUkRfQllURVM7Ci0KLSAgaWYgKGxhc3QtZmlyc3Q+VFJVTkNfd29yZHMpIHsKLSAgICBjaGFyICpmZmlyc3Q9Zmlyc3QsICpsbGFzdD1sYXN0OwotICAgIHdoaWxlICgxKSB7Ci0jaWZkZWYgREVCVUdfUVNPUlQKLWZwcmludGYoc3RkZXJyLCJEb2luZyAlZDolZDogIiwKLSAgICAgICAgKGZpcnN0LShjaGFyKiliYXNlKS9XT1JEX0JZVEVTLAotICAgICAgICAobGFzdC0oY2hhciopYmFzZSkvV09SRF9CWVRFUyk7Ci0jZW5kaWYKLSAgICAgIC8qIFNlbGVjdCBwaXZvdCAqLwotICAgICAgeyBjaGFyICogbWlkPWZpcnN0K1dPUkRfQllURVMqKChsYXN0LWZpcnN0KSAvICgyKldPUkRfQllURVMpKTsKLSAgICAgICAgUGl2b3QoU1dBUF93b3JkcyxXT1JEX0JZVEVTKTsKLSAgICAgICAgKihpbnQqKXBpdm90PSooaW50KiltaWQ7Ci0gICAgICB9Ci0jaWZkZWYgREVCVUdfUVNPUlQKLWZwcmludGYoc3RkZXJyLCJwaXZvdD0lZFxuIiwqKGludCopcGl2b3QpOwotI2VuZGlmCi0gICAgICAvKiBQYXJ0aXRpb24uICovCi0gICAgICBQYXJ0aXRpb24oU1dBUF93b3JkcyxXT1JEX0JZVEVTKTsKLSAgICAgIC8qIFByZXBhcmUgdG8gcmVjdXJzZS9pdGVyYXRlLiAqLwotICAgICAgUmVjdXJzZShUUlVOQ193b3JkcykKLSAgICB9Ci0gIH0KLSAgUHJlSW5zZXJ0aW9uKFNXQVBfd29yZHMsKFRSVU5DX3dvcmRzL1dPUkRfQllURVMpLFdPUkRfQllURVMpOwotICAvKiBOb3cgZG8gaW5zZXJ0aW9uIHNvcnQuICovCi0gIGxhc3Q9KChjaGFyKiliYXNlKStubWVtYipXT1JEX0JZVEVTOwotICBmb3IgKGZpcnN0PSgoY2hhciopYmFzZSkrV09SRF9CWVRFUztmaXJzdCE9bGFzdDtmaXJzdCs9V09SRF9CWVRFUykgewotICAgIC8qIEZpbmQgdGhlIHJpZ2h0IHBsYWNlIGZvciB8Zmlyc3R8LiBNeSBhcG9sb2dpZXMgZm9yIHZhciByZXVzZSAqLwotICAgIGludCAqcGw9KGludCopKGZpcnN0LVdPUkRfQllURVMpLCpwcj0oaW50KilmaXJzdDsKLSAgICAqKGludCopcGl2b3Q9KihpbnQqKWZpcnN0OwotICAgIGZvciAoO2NvbXBhcmUocGwscGl2b3QpPjA7cHI9cGwsLS1wbCkgewotICAgICAgKnByPSpwbDsgfQotICAgIGlmIChwciE9KGludCopZmlyc3QpICpwcj0qKGludCopcGl2b3Q7Ci0gIH0KLSAgZnJlZShwaXZvdCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZCBxc29ydCh2b2lkICpiYXNlLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLAotICAgICAgICAgICBpbnQgKCpjb21wYXJlKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIHsKLQotICBpZiAobm1lbWI8PTEpIHJldHVybjsKLSAgaWYgKCgodWludHB0cl90KWJhc2V8c2l6ZSkmKFdPUkRfQllURVMtMSkpCi0gICAgcXNvcnRfbm9uYWxpZ25lZChiYXNlLG5tZW1iLHNpemUsY29tcGFyZSk7Ci0gIGVsc2UgaWYgKHNpemUhPVdPUkRfQllURVMpCi0gICAgcXNvcnRfYWxpZ25lZChiYXNlLG5tZW1iLHNpemUsY29tcGFyZSk7Ci0gIGVsc2UKLSAgICBxc29ydF93b3JkcyhiYXNlLG5tZW1iLGNvbXBhcmUpOwotfQotCi0jZW5kaWYgLyogIUhBVkVfUVNPUlQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvc3RkbGliL1NETF9zdGRsaWIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvc3RkbGliL1NETF9zdGRsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljM2JhYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3N0ZGxpYi9TRExfc3RkbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBwb3J0YWJsZSBzdGRsaWIgZnVuY3Rpb25zIGZvciBTREwgKi8KLQotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLQotI2lmbmRlZiBIQVZFX0xJQkMKLS8qIFRoZXNlIGFyZSBzb21lIEMgcnVudGltZSBpbnRyaW5zaWNzIHRoYXQgbmVlZCB0byBiZSBkZWZpbmVkICovCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotCi0jaWZuZGVmIF9fRkxUVVNFRF9fCi0jZGVmaW5lIF9fRkxUVVNFRF9fCi0jaWZkZWYgX19jcGx1c3BsdXMKLSAgIGV4dGVybiAiQyIKLSNlbmRpZgotCSAgIF9fZGVjbHNwZWMoc2VsZWN0YW55KSBpbnQgX2ZsdHVzZWQ9MTsKLSNlbmRpZgotCi0vKiBGbG9hdCB0byBsb25nICovCi12b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9mdG9sKCkKLXsKLQlfX2FzbSB7Ci0JCXB1c2ggICAgICAgIGVicAotCQltb3YgICAgICAgICBlYnAsZXNwCi0JCXN1YiAgICAgICAgIGVzcCwyMGgKLQkJYW5kICAgICAgICAgZXNwLDBGRkZGRkZGMGgKLQkJZmxkICAgICAgICAgc3QoMCkKLQkJZnN0ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMThoXQotCQlmaXN0cCAgICAgICBxd29yZCBwdHIgW2VzcCsxMGhdCi0JCWZpbGQgICAgICAgIHF3b3JkIHB0ciBbZXNwKzEwaF0KLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE4aF0KLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJdGVzdCAgICAgICAgZWF4LGVheAotCQlqZSAgICAgICAgICBpbnRlZ2VyX1FuYU5fb3JfemVybwotYXJnX2lzX25vdF9pbnRlZ2VyX1FuYU46Ci0JCWZzdWJwICAgICAgIHN0KDEpLHN0Ci0JCXRlc3QgICAgICAgIGVkeCxlZHgKLQkJam5zICAgICAgICAgcG9zaXRpdmUKLQkJZnN0cCAgICAgICAgZHdvcmQgcHRyIFtlc3BdCi0JCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcF0KLQkJeG9yICAgICAgICAgZWN4LDgwMDAwMDAwaAotCQlhZGQgICAgICAgICBlY3gsN0ZGRkZGRkZoCi0JCWFkYyAgICAgICAgIGVheCwwCi0JCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxNGhdCi0JCWFkYyAgICAgICAgIGVkeCwwCi0JCWptcCAgICAgICAgIGxvY2FsZXhpdAotcG9zaXRpdmU6Ci0JCWZzdHAgICAgICAgIGR3b3JkIHB0ciBbZXNwXQotCQltb3YgICAgICAgICBlY3gsZHdvcmQgcHRyIFtlc3BdCi0JCWFkZCAgICAgICAgIGVjeCw3RkZGRkZGRmgKLQkJc2JiICAgICAgICAgZWF4LDAKLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJc2JiICAgICAgICAgZWR4LDAKLQkJam1wICAgICAgICAgbG9jYWxleGl0Ci1pbnRlZ2VyX1FuYU5fb3JfemVybzoKLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJdGVzdCAgICAgICAgZWR4LDdGRkZGRkZGaAotCQlqbmUgICAgICAgICBhcmdfaXNfbm90X2ludGVnZXJfUW5hTgotCQlmc3RwICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCi0JCWZzdHAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzE4aF0KLWxvY2FsZXhpdDoKLQkJbGVhdmUKLQkJcmV0Ci0JfQotfQotdm9pZCBfX2RlY2xzcGVjKG5ha2VkKSBfZnRvbDJfc3NlKCkKLXsKLQlfZnRvbCgpOwotfQotCi0vKiA2NC1iaXQgbWF0aCBvcGVyYXRvcnMgZm9yIDMyLWJpdCBzeXN0ZW1zICovCi12b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9hbGxtdWwoKQotewotCV9fYXNtIHsKLQkJcHVzaCAgICAgICAgZWJwCi0JCW1vdiAgICAgICAgIGVicCxlc3AKLQkJcHVzaCAgICAgICAgZWRpCi0JCXB1c2ggICAgICAgIGVzaQotCQlwdXNoICAgICAgICBlYngKLQkJc3ViICAgICAgICAgZXNwLDBDaAotCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlYnArMTBoXQotCQltb3YgICAgICAgICBlZGksZHdvcmQgcHRyIFtlYnArOF0KLQkJbW92ICAgICAgICAgZWJ4LGVheAotCQltb3YgICAgICAgICBlc2ksZWF4Ci0JCXNhciAgICAgICAgIGVzaSwxRmgKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZWJwKzhdCi0JCW11bCAgICAgICAgIGVieAotCQlpbXVsICAgICAgICBlZGksZXNpCi0JCW1vdiAgICAgICAgIGVjeCxlZHgKLQkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlYnAtMThoXSxlYXgKLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZWJwKzBDaF0KLQkJYWRkICAgICAgICAgZWN4LGVkaQotCQlpbXVsICAgICAgICBlYngsZWR4Ci0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VicC0xOGhdCi0JCWxlYSAgICAgICAgIGVieCxbZWJ4K2VjeF0KLQkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlYnAtMTRoXSxlYngKLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZWJwLTE0aF0KLQkJYWRkICAgICAgICAgZXNwLDBDaAotCQlwb3AgICAgICAgICBlYngKLQkJcG9wICAgICAgICAgZXNpCi0JCXBvcCAgICAgICAgIGVkaQotCQlwb3AgICAgICAgICBlYnAKLQkJcmV0Ci0JfQotfQotdm9pZCBfX2RlY2xzcGVjKG5ha2VkKSBfYWxsZGl2KCkKLXsKLQlfX2FzbSB7Ci0JCXB1c2ggICAgICAgIGVkaQotCQlwdXNoICAgICAgICBlc2kKLQkJcHVzaCAgICAgICAgZWJ4Ci0JCXhvciAgICAgICAgIGVkaSxlZGkKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJb3IgICAgICAgICAgZWF4LGVheAotCQlqZ2UgICAgICAgICBMMQotCQlpbmMgICAgICAgICBlZGkKLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJbmVnICAgICAgICAgZWF4Ci0JCW5lZyAgICAgICAgIGVkeAotCQlzYmIgICAgICAgICBlYXgsMAotCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxNGhdLGVheAotCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxMGhdLGVkeAotTDE6Ci0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxQ2hdCi0JCW9yICAgICAgICAgIGVheCxlYXgKLQkJamdlICAgICAgICAgTDIKLQkJaW5jICAgICAgICAgZWRpCi0JCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxOGhdCi0JCW5lZyAgICAgICAgIGVheAotCQluZWcgICAgICAgICBlZHgKLQkJc2JiICAgICAgICAgZWF4LDAKLQkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMUNoXSxlYXgKLQkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMThoXSxlZHgKLUwyOgotCQlvciAgICAgICAgICBlYXgsZWF4Ci0JCWpuZSAgICAgICAgIEwzCi0JCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxOGhdCi0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxNGhdCi0JCXhvciAgICAgICAgIGVkeCxlZHgKLQkJZGl2ICAgICAgICAgZWN4Ci0JCW1vdiAgICAgICAgIGVieCxlYXgKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJZGl2ICAgICAgICAgZWN4Ci0JCW1vdiAgICAgICAgIGVkeCxlYngKLQkJam1wICAgICAgICAgTDQKLUwzOgotCQltb3YgICAgICAgICBlYngsZWF4Ci0JCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxOGhdCi0JCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxNGhdCi0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxMGhdCi1MNToKLQkJc2hyICAgICAgICAgZWJ4LDEKLQkJcmNyICAgICAgICAgZWN4LDEKLQkJc2hyICAgICAgICAgZWR4LDEKLQkJcmNyICAgICAgICAgZWF4LDEKLQkJb3IgICAgICAgICAgZWJ4LGVieAotCQlqbmUgICAgICAgICBMNQotCQlkaXYgICAgICAgICBlY3gKLQkJbW92ICAgICAgICAgZXNpLGVheAotCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxQ2hdCi0JCW1vdiAgICAgICAgIGVjeCxlYXgKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE4aF0KLQkJbXVsICAgICAgICAgZXNpCi0JCWFkZCAgICAgICAgIGVkeCxlY3gKLQkJamIgICAgICAgICAgTDYKLQkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJamEgICAgICAgICAgTDYKLQkJamIgICAgICAgICAgTDcKLQkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJamJlICAgICAgICAgTDcKLUw2OgotCQlkZWMgICAgICAgICBlc2kKLUw3OgotCQl4b3IgICAgICAgICBlZHgsZWR4Ci0JCW1vdiAgICAgICAgIGVheCxlc2kKLUw0OgotCQlkZWMgICAgICAgICBlZGkKLQkJam5lICAgICAgICAgTDgKLQkJbmVnICAgICAgICAgZWR4Ci0JCW5lZyAgICAgICAgIGVheAotCQlzYmIgICAgICAgICBlZHgsMAotTDg6Ci0JCXBvcCAgICAgICAgIGVieAotCQlwb3AgICAgICAgICBlc2kKLQkJcG9wICAgICAgICAgZWRpCi0JCXJldCAgICAgICAgIDEwaAotCX0KLX0KLXZvaWQgX19kZWNsc3BlYyhuYWtlZCkgX2F1bGxkaXYoKQotewotCV9fYXNtIHsKLQkJcHVzaCAgICAgICAgZWJ4Ci0JCXB1c2ggICAgICAgIGVzaQotCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMThoXQotCQlvciAgICAgICAgICBlYXgsZWF4Ci0JCWpuZSAgICAgICAgIEwxCi0JCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxNGhdCi0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxMGhdCi0JCXhvciAgICAgICAgIGVkeCxlZHgKLQkJZGl2ICAgICAgICAgZWN4Ci0JCW1vdiAgICAgICAgIGVieCxlYXgKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzBDaF0KLQkJZGl2ICAgICAgICAgZWN4Ci0JCW1vdiAgICAgICAgIGVkeCxlYngKLQkJam1wICAgICAgICAgTDIKLUwxOgotCQltb3YgICAgICAgICBlY3gsZWF4Ci0JCW1vdiAgICAgICAgIGVieCxkd29yZCBwdHIgW2VzcCsxNGhdCi0JCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxMGhdCi0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCswQ2hdCi1MMzoKLQkJc2hyICAgICAgICAgZWN4LDEKLQkJcmNyICAgICAgICAgZWJ4LDEKLQkJc2hyICAgICAgICAgZWR4LDEKLQkJcmNyICAgICAgICAgZWF4LDEKLQkJb3IgICAgICAgICAgZWN4LGVjeAotCQlqbmUgICAgICAgICBMMwotCQlkaXYgICAgICAgICBlYngKLQkJbW92ICAgICAgICAgZXNpLGVheAotCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCi0JCW1vdiAgICAgICAgIGVjeCxlYXgKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJbXVsICAgICAgICAgZXNpCi0JCWFkZCAgICAgICAgIGVkeCxlY3gKLQkJamIgICAgICAgICAgTDQKLQkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJamEgICAgICAgICAgTDQKLQkJamIgICAgICAgICAgTDUKLQkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzBDaF0KLQkJamJlICAgICAgICAgTDUKLUw0OgotCQlkZWMgICAgICAgICBlc2kKLUw1OgotCQl4b3IgICAgICAgICBlZHgsZWR4Ci0JCW1vdiAgICAgICAgIGVheCxlc2kKLUwyOgotCQlwb3AgICAgICAgICBlc2kKLQkJcG9wICAgICAgICAgZWJ4Ci0JCXJldCAgICAgICAgIDEwaAotCX0KLX0KLXZvaWQgX19kZWNsc3BlYyhuYWtlZCkgX2FsbHJlbSgpCi17Ci0JX19hc20gewotCQlwdXNoICAgICAgICBlYngKLQkJcHVzaCAgICAgICAgZWRpCi0JCXhvciAgICAgICAgIGVkaSxlZGkKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJb3IgICAgICAgICAgZWF4LGVheAotCQlqZ2UgICAgICAgICBMMQotCQlpbmMgICAgICAgICBlZGkKLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KLQkJbmVnICAgICAgICAgZWF4Ci0JCW5lZyAgICAgICAgIGVkeAotCQlzYmIgICAgICAgICBlYXgsMAotCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxMGhdLGVheAotCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCswQ2hdLGVkeAotTDE6Ci0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxOGhdCi0JCW9yICAgICAgICAgIGVheCxlYXgKLQkJamdlICAgICAgICAgTDIKLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJbmVnICAgICAgICAgZWF4Ci0JCW5lZyAgICAgICAgIGVkeAotCQlzYmIgICAgICAgICBlYXgsMAotCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdLGVheAotCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxNGhdLGVkeAotTDI6Ci0JCW9yICAgICAgICAgIGVheCxlYXgKLQkJam5lICAgICAgICAgTDMKLQkJbW92ICAgICAgICAgZWN4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJeG9yICAgICAgICAgZWR4LGVkeAotCQlkaXYgICAgICAgICBlY3gKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzBDaF0KLQkJZGl2ICAgICAgICAgZWN4Ci0JCW1vdiAgICAgICAgIGVheCxlZHgKLQkJeG9yICAgICAgICAgZWR4LGVkeAotCQlkZWMgICAgICAgICBlZGkKLQkJam5zICAgICAgICAgTDQKLQkJam1wICAgICAgICAgTDgKLUwzOgotCQltb3YgICAgICAgICBlYngsZWF4Ci0JCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxNGhdCi0JCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxMGhdCi0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCswQ2hdCi1MNToKLQkJc2hyICAgICAgICAgZWJ4LDEKLQkJcmNyICAgICAgICAgZWN4LDEKLQkJc2hyICAgICAgICAgZWR4LDEKLQkJcmNyICAgICAgICAgZWF4LDEKLQkJb3IgICAgICAgICAgZWJ4LGVieAotCQlqbmUgICAgICAgICBMNQotCQlkaXYgICAgICAgICBlY3gKLQkJbW92ICAgICAgICAgZWN4LGVheAotCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCi0JCXhjaGcgICAgICAgIGVheCxlY3gKLQkJbXVsICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMTRoXQotCQlhZGQgICAgICAgICBlZHgsZWN4Ci0JCWpiICAgICAgICAgIEw2Ci0JCWNtcCAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxMGhdCi0JCWphICAgICAgICAgIEw2Ci0JCWpiICAgICAgICAgIEw3Ci0JCWNtcCAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCswQ2hdCi0JCWpiZSAgICAgICAgIEw3Ci1MNjoKLQkJc3ViICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE4aF0KLUw3OgotCQlzdWIgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMENoXQotCQlzYmIgICAgICAgICBlZHgsZHdvcmQgcHRyIFtlc3ArMTBoXQotCQlkZWMgICAgICAgICBlZGkKLQkJam5zICAgICAgICAgTDgKLUw0OgotCQluZWcgICAgICAgICBlZHgKLQkJbmVnICAgICAgICAgZWF4Ci0JCXNiYiAgICAgICAgIGVkeCwwCi1MODoKLQkJcG9wICAgICAgICAgZWRpCi0JCXBvcCAgICAgICAgIGVieAotCQlyZXQgICAgICAgICAxMGgKLQl9Ci19Ci12b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9hdWxscmVtKCkKLXsKLQlfX2FzbSB7Ci0JCXB1c2ggICAgICAgIGVieAotCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMTRoXQotCQlvciAgICAgICAgICBlYXgsZWF4Ci0JCWpuZSAgICAgICAgIEwxCi0JCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxMGhdCi0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCswQ2hdCi0JCXhvciAgICAgICAgIGVkeCxlZHgKLQkJZGl2ICAgICAgICAgZWN4Ci0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCs4XQotCQlkaXYgICAgICAgICBlY3gKLQkJbW92ICAgICAgICAgZWF4LGVkeAotCQl4b3IgICAgICAgICBlZHgsZWR4Ci0JCWptcCAgICAgICAgIEwyCi1MMToKLQkJbW92ICAgICAgICAgZWN4LGVheAotCQltb3YgICAgICAgICBlYngsZHdvcmQgcHRyIFtlc3ArMTBoXQotCQltb3YgICAgICAgICBlZHgsZHdvcmQgcHRyIFtlc3ArMENoXQotCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArOF0KLUwzOgotCQlzaHIgICAgICAgICBlY3gsMQotCQlyY3IgICAgICAgICBlYngsMQotCQlzaHIgICAgICAgICBlZHgsMQotCQlyY3IgICAgICAgICBlYXgsMQotCQlvciAgICAgICAgICBlY3gsZWN4Ci0JCWpuZSAgICAgICAgIEwzCi0JCWRpdiAgICAgICAgIGVieAotCQltb3YgICAgICAgICBlY3gsZWF4Ci0JCW11bCAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJeGNoZyAgICAgICAgZWF4LGVjeAotCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxMGhdCi0JCWFkZCAgICAgICAgIGVkeCxlY3gKLQkJamIgICAgICAgICAgTDQKLQkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KLQkJamEgICAgICAgICAgTDQKLQkJamIgICAgICAgICAgTDUKLQkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzhdCi0JCWpiZSAgICAgICAgIEw1Ci1MNDoKLQkJc3ViICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLUw1OgotCQlzdWIgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArOF0KLQkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KLQkJbmVnICAgICAgICAgZWR4Ci0JCW5lZyAgICAgICAgIGVheAotCQlzYmIgICAgICAgICBlZHgsMAotTDI6Ci0JCXBvcCAgICAgICAgIGVieAotCQlyZXQgICAgICAgICAxMGgKLQl9Ci19Ci12b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9hbGxkdnJtKCkKLXsKLQlfX2FzbSB7Ci0JCXB1c2ggICAgICAgIGVkaQotCQlwdXNoICAgICAgICBlc2kKLQkJcHVzaCAgICAgICAgZWJwCi0JCXhvciAgICAgICAgIGVkaSxlZGkKLQkJeG9yICAgICAgICAgZWJwLGVicAotCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMTRoXQotCQlvciAgICAgICAgICBlYXgsZWF4Ci0JCWpnZSAgICAgICAgIEwxCi0JCWluYyAgICAgICAgIGVkaQotCQlpbmMgICAgICAgICBlYnAKLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJbmVnICAgICAgICAgZWF4Ci0JCW5lZyAgICAgICAgIGVkeAotCQlzYmIgICAgICAgICBlYXgsMAotCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxNGhdLGVheAotCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxMGhdLGVkeAotTDE6Ci0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxQ2hdCi0JCW9yICAgICAgICAgIGVheCxlYXgKLQkJamdlICAgICAgICAgTDIKLQkJaW5jICAgICAgICAgZWRpCi0JCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxOGhdCi0JCW5lZyAgICAgICAgIGVheAotCQluZWcgICAgICAgICBlZHgKLQkJc2JiICAgICAgICAgZWF4LDAKLQkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMUNoXSxlYXgKLQkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMThoXSxlZHgKLUwyOgotCQlvciAgICAgICAgICBlYXgsZWF4Ci0JCWpuZSAgICAgICAgIEwzCi0JCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxOGhdCi0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxNGhdCi0JCXhvciAgICAgICAgIGVkeCxlZHgKLQkJZGl2ICAgICAgICAgZWN4Ci0JCW1vdiAgICAgICAgIGVieCxlYXgKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJZGl2ICAgICAgICAgZWN4Ci0JCW1vdiAgICAgICAgIGVzaSxlYXgKLQkJbW92ICAgICAgICAgZWF4LGVieAotCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCi0JCW1vdiAgICAgICAgIGVjeCxlYXgKLQkJbW92ICAgICAgICAgZWF4LGVzaQotCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCi0JCWFkZCAgICAgICAgIGVkeCxlY3gKLQkJam1wICAgICAgICAgTDQKLUwzOgotCQltb3YgICAgICAgICBlYngsZWF4Ci0JCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxOGhdCi0JCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxNGhdCi0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxMGhdCi1MNToKLQkJc2hyICAgICAgICAgZWJ4LDEKLQkJcmNyICAgICAgICAgZWN4LDEKLQkJc2hyICAgICAgICAgZWR4LDEKLQkJcmNyICAgICAgICAgZWF4LDEKLQkJb3IgICAgICAgICAgZWJ4LGVieAotCQlqbmUgICAgICAgICBMNQotCQlkaXYgICAgICAgICBlY3gKLQkJbW92ICAgICAgICAgZXNpLGVheAotCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxQ2hdCi0JCW1vdiAgICAgICAgIGVjeCxlYXgKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE4aF0KLQkJbXVsICAgICAgICAgZXNpCi0JCWFkZCAgICAgICAgIGVkeCxlY3gKLQkJamIgICAgICAgICAgTDYKLQkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJamEgICAgICAgICAgTDYKLQkJamIgICAgICAgICAgTDcKLQkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJamJlICAgICAgICAgTDcKLUw2OgotCQlkZWMgICAgICAgICBlc2kKLQkJc3ViICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE4aF0KLQkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzFDaF0KLUw3OgotCQl4b3IgICAgICAgICBlYngsZWJ4Ci1MNDoKLQkJc3ViICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJZGVjICAgICAgICAgZWJwCi0JCWpucyAgICAgICAgIEw5Ci0JCW5lZyAgICAgICAgIGVkeAotCQluZWcgICAgICAgICBlYXgKLQkJc2JiICAgICAgICAgZWR4LDAKLUw5OgotCQltb3YgICAgICAgICBlY3gsZWR4Ci0JCW1vdiAgICAgICAgIGVkeCxlYngKLQkJbW92ICAgICAgICAgZWJ4LGVjeAotCQltb3YgICAgICAgICBlY3gsZWF4Ci0JCW1vdiAgICAgICAgIGVheCxlc2kKLQkJZGVjICAgICAgICAgZWRpCi0JCWpuZSAgICAgICAgIEw4Ci0JCW5lZyAgICAgICAgIGVkeAotCQluZWcgICAgICAgICBlYXgKLQkJc2JiICAgICAgICAgZWR4LDAKLUw4OgotCQlwb3AgICAgICAgICBlYnAKLQkJcG9wICAgICAgICAgZXNpCi0JCXBvcCAgICAgICAgIGVkaQotCQlyZXQgICAgICAgICAxMGgKLQl9Ci19Ci12b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9hdWxsZHZybSgpCi17Ci0JX19hc20gewotCQlwdXNoICAgICAgICBlc2kKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE0aF0KLQkJb3IgICAgICAgICAgZWF4LGVheAotCQlqbmUgICAgICAgICBMMQotCQltb3YgICAgICAgICBlY3gsZHdvcmQgcHRyIFtlc3ArMTBoXQotCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMENoXQotCQl4b3IgICAgICAgICBlZHgsZWR4Ci0JCWRpdiAgICAgICAgIGVjeAotCQltb3YgICAgICAgICBlYngsZWF4Ci0JCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCs4XQotCQlkaXYgICAgICAgICBlY3gKLQkJbW92ICAgICAgICAgZXNpLGVheAotCQltb3YgICAgICAgICBlYXgsZWJ4Ci0JCW11bCAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJbW92ICAgICAgICAgZWN4LGVheAotCQltb3YgICAgICAgICBlYXgsZXNpCi0JCW11bCAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJYWRkICAgICAgICAgZWR4LGVjeAotCQlqbXAgICAgICAgICBMMgotTDE6Ci0JCW1vdiAgICAgICAgIGVjeCxlYXgKLQkJbW92ICAgICAgICAgZWJ4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzhdCi1MMzoKLQkJc2hyICAgICAgICAgZWN4LDEKLQkJcmNyICAgICAgICAgZWJ4LDEKLQkJc2hyICAgICAgICAgZWR4LDEKLQkJcmNyICAgICAgICAgZWF4LDEKLQkJb3IgICAgICAgICAgZWN4LGVjeAotCQlqbmUgICAgICAgICBMMwotCQlkaXYgICAgICAgICBlYngKLQkJbW92ICAgICAgICAgZXNpLGVheAotCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxNGhdCi0JCW1vdiAgICAgICAgIGVjeCxlYXgKLQkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KLQkJbXVsICAgICAgICAgZXNpCi0JCWFkZCAgICAgICAgIGVkeCxlY3gKLQkJamIgICAgICAgICAgTDQKLQkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KLQkJamEgICAgICAgICAgTDQKLQkJamIgICAgICAgICAgTDUKLQkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzhdCi0JCWpiZSAgICAgICAgIEw1Ci1MNDoKLQkJZGVjICAgICAgICAgZXNpCi0JCXN1YiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxMGhdCi0JCXNiYiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxNGhdCi1MNToKLQkJeG9yICAgICAgICAgZWJ4LGVieAotTDI6Ci0JCXN1YiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCs4XQotCQlzYmIgICAgICAgICBlZHgsZHdvcmQgcHRyIFtlc3ArMENoXQotCQluZWcgICAgICAgICBlZHgKLQkJbmVnICAgICAgICAgZWF4Ci0JCXNiYiAgICAgICAgIGVkeCwwCi0JCW1vdiAgICAgICAgIGVjeCxlZHgKLQkJbW92ICAgICAgICAgZWR4LGVieAotCQltb3YgICAgICAgICBlYngsZWN4Ci0JCW1vdiAgICAgICAgIGVjeCxlYXgKLQkJbW92ICAgICAgICAgZWF4LGVzaQotCQlwb3AgICAgICAgICBlc2kKLQkJcmV0ICAgICAgICAgMTBoCi0JfQotfQotdm9pZCBfX2RlY2xzcGVjKG5ha2VkKSBfYWxsc2hsKCkKLXsKLQlfX2FzbSB7Ci0JCWNtcCAgICAgICAgIGNsLDQwaAotCQlqYWUgICAgICAgICBSRVRaRVJPCi0JCWNtcCAgICAgICAgIGNsLDIwaAotCQlqYWUgICAgICAgICBNT1JFMzIKLQkJc2hsZCAgICAgICAgZWR4LGVheCxjbAotCQlzaGwgICAgICAgICBlYXgsY2wKLQkJcmV0Ci1NT1JFMzI6Ci0JCW1vdiAgICAgICAgIGVkeCxlYXgKLQkJeG9yICAgICAgICAgZWF4LGVheAotCQlhbmQgICAgICAgICBjbCwxRmgKLQkJc2hsICAgICAgICAgZWR4LGNsCi0JCXJldAotUkVUWkVSTzoKLQkJeG9yICAgICAgICAgZWF4LGVheAotCQl4b3IgICAgICAgICBlZHgsZWR4Ci0JCXJldAotCX0KLX0KLXZvaWQgX19kZWNsc3BlYyhuYWtlZCkgX2F1bGxzaHIoKQotewotCV9fYXNtIHsKLQkJY21wICAgICAgICAgY2wsNDBoCi0JCWphZSAgICAgICAgIFJFVFpFUk8KLQkJY21wICAgICAgICAgY2wsMjBoCi0JCWphZSAgICAgICAgIE1PUkUzMgotCQlzaHJkICAgICAgICBlYXgsZWR4LGNsCi0JCXNociAgICAgICAgIGVkeCxjbAotCQlyZXQKLU1PUkUzMjoKLQkJbW92ICAgICAgICAgZWF4LGVkeAotCQl4b3IgICAgICAgICBlZHgsZWR4Ci0JCWFuZCAgICAgICAgIGNsLDFGaAotCQlzaHIgICAgICAgICBlYXgsY2wKLQkJcmV0Ci1SRVRaRVJPOgotCQl4b3IgICAgICAgICBlYXgsZWF4Ci0JCXhvciAgICAgICAgIGVkeCxlZHgKLQkJcmV0Ci0JfQotfQotCi0jZW5kaWYgLyogTVNDX1ZFUiAqLwotCi0jZW5kaWYgLyogIUhBVkVfTElCQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9zdGRsaWIvU0RMX3N0cmluZy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9zdGRsaWIvU0RMX3N0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWI1YWY2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvc3RkbGliL1NETF9zdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNDggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBwb3J0YWJsZSBzdHJpbmcgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBmb3IgU0RMICovCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0KLQotI2RlZmluZSBTRExfaXN1cHBlcmhleChYKSAgICgoKFgpID49ICdBJykgJiYgKChYKSA8PSAnRicpKQotI2RlZmluZSBTRExfaXNsb3dlcmhleChYKSAgICgoKFgpID49ICdhJykgJiYgKChYKSA8PSAnZicpKQotCi0jaWYgIWRlZmluZWQoSEFWRV9TU0NBTkYpIHx8ICFkZWZpbmVkKEhBVkVfU1RSVE9MKQotc3RhdGljIHNpemVfdCBTRExfU2NhbkxvbmcoY29uc3QgY2hhciAqdGV4dCwgaW50IHJhZGl4LCBsb25nICp2YWx1ZXApCi17Ci0gICAgY29uc3QgY2hhciAqdGV4dHN0YXJ0ID0gdGV4dDsKLSAgICBsb25nIHZhbHVlID0gMDsKLSAgICBTRExfYm9vbCBuZWdhdGl2ZSA9IFNETF9GQUxTRTsKLQotICAgIGlmICggKnRleHQgPT0gJy0nICkgewotICAgICAgICBuZWdhdGl2ZSA9IFNETF9UUlVFOwotICAgICAgICArK3RleHQ7Ci0gICAgfQotICAgIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX3N0cm5jbXAodGV4dCwgIjB4IiwgMikgPT0gMCApIHsKLSAgICAgICAgdGV4dCArPSAyOwotICAgIH0KLSAgICBmb3IgKCA7IDsgKSB7Ci0gICAgICAgIGludCB2OwotICAgICAgICBpZiAoIFNETF9pc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqdGV4dCkgKSB7Ci0gICAgICAgICAgICB2ID0gKnRleHQgLSAnMCc7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc3VwcGVyaGV4KCp0ZXh0KSApIHsKLSAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdBJyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc2xvd2VyaGV4KCp0ZXh0KSApIHsKLSAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdhJyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSAqPSByYWRpeDsKLSAgICAgICAgdmFsdWUgKz0gdjsKLSAgICAgICAgKyt0ZXh0OwotICAgIH0KLSAgICBpZiAoIHZhbHVlcCApIHsKLSAgICAgICAgaWYgKCBuZWdhdGl2ZSAmJiB2YWx1ZSApIHsKLSAgICAgICAgICAgICp2YWx1ZXAgPSAtdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICh0ZXh0IC0gdGV4dHN0YXJ0KTsKLX0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9TU0NBTkYpIHx8ICFkZWZpbmVkKEhBVkVfU1RSVE9VTCkgfHwgIWRlZmluZWQoSEFWRV9TVFJUT0QpCi1zdGF0aWMgc2l6ZV90IFNETF9TY2FuVW5zaWduZWRMb25nKGNvbnN0IGNoYXIgKnRleHQsIGludCByYWRpeCwgdW5zaWduZWQgbG9uZyAqdmFsdWVwKQotewotICAgIGNvbnN0IGNoYXIgKnRleHRzdGFydCA9IHRleHQ7Ci0gICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7Ci0KLSAgICBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9zdHJuY21wKHRleHQsICIweCIsIDIpID09IDAgKSB7Ci0gICAgICAgIHRleHQgKz0gMjsKLSAgICB9Ci0gICAgZm9yICggOyA7ICkgewotICAgICAgICBpbnQgdjsKLSAgICAgICAgaWYgKCBTRExfaXNkaWdpdCgodW5zaWduZWQgY2hhcikgKnRleHQpICkgewotICAgICAgICAgICAgdiA9ICp0ZXh0IC0gJzAnOwotICAgICAgICB9IGVsc2UgaWYgKCByYWRpeCA9PSAxNiAmJiBTRExfaXN1cHBlcmhleCgqdGV4dCkgKSB7Ci0gICAgICAgICAgICB2ID0gMTAgKyAoKnRleHQgLSAnQScpOwotICAgICAgICB9IGVsc2UgaWYgKCByYWRpeCA9PSAxNiAmJiBTRExfaXNsb3dlcmhleCgqdGV4dCkgKSB7Ci0gICAgICAgICAgICB2ID0gMTAgKyAoKnRleHQgLSAnYScpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsdWUgKj0gcmFkaXg7Ci0gICAgICAgIHZhbHVlICs9IHY7Ci0gICAgICAgICsrdGV4dDsKLSAgICB9Ci0gICAgaWYgKCB2YWx1ZXAgKSB7Ci0gICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuICh0ZXh0IC0gdGV4dHN0YXJ0KTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1NDQU5GCi1zdGF0aWMgc2l6ZV90IFNETF9TY2FuVWludFB0clQoY29uc3QgY2hhciAqdGV4dCwgaW50IHJhZGl4LCB1aW50cHRyX3QgKnZhbHVlcCkKLXsKLSAgICBjb25zdCBjaGFyICp0ZXh0c3RhcnQgPSB0ZXh0OwotICAgIHVpbnRwdHJfdCB2YWx1ZSA9IDA7Ci0KLSAgICBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9zdHJuY21wKHRleHQsICIweCIsIDIpID09IDAgKSB7Ci0gICAgICAgIHRleHQgKz0gMjsKLSAgICB9Ci0gICAgZm9yICggOyA7ICkgewotICAgICAgICBpbnQgdjsKLSAgICAgICAgaWYgKCBTRExfaXNkaWdpdCgodW5zaWduZWQgY2hhcikgKnRleHQpICkgewotICAgICAgICAgICAgdiA9ICp0ZXh0IC0gJzAnOwotICAgICAgICB9IGVsc2UgaWYgKCByYWRpeCA9PSAxNiAmJiBTRExfaXN1cHBlcmhleCgqdGV4dCkgKSB7Ci0gICAgICAgICAgICB2ID0gMTAgKyAoKnRleHQgLSAnQScpOwotICAgICAgICB9IGVsc2UgaWYgKCByYWRpeCA9PSAxNiAmJiBTRExfaXNsb3dlcmhleCgqdGV4dCkgKSB7Ci0gICAgICAgICAgICB2ID0gMTAgKyAoKnRleHQgLSAnYScpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsdWUgKj0gcmFkaXg7Ci0gICAgICAgIHZhbHVlICs9IHY7Ci0gICAgICAgICsrdGV4dDsKLSAgICB9Ci0gICAgaWYgKCB2YWx1ZXAgKSB7Ci0gICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuICh0ZXh0IC0gdGV4dHN0YXJ0KTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCi0jaWYgIWRlZmluZWQoSEFWRV9TU0NBTkYpIHx8ICFkZWZpbmVkKEhBVkVfU1RSVE9MTCkKLXN0YXRpYyBzaXplX3QgU0RMX1NjYW5Mb25nTG9uZyhjb25zdCBjaGFyICp0ZXh0LCBpbnQgcmFkaXgsIFNpbnQ2NCAqdmFsdWVwKQotewotICAgIGNvbnN0IGNoYXIgKnRleHRzdGFydCA9IHRleHQ7Ci0gICAgU2ludDY0IHZhbHVlID0gMDsKLSAgICBTRExfYm9vbCBuZWdhdGl2ZSA9IFNETF9GQUxTRTsKLQotICAgIGlmICggKnRleHQgPT0gJy0nICkgewotICAgICAgICBuZWdhdGl2ZSA9IFNETF9UUlVFOwotICAgICAgICArK3RleHQ7Ci0gICAgfQotICAgIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX3N0cm5jbXAodGV4dCwgIjB4IiwgMikgPT0gMCApIHsKLSAgICAgICAgdGV4dCArPSAyOwotICAgIH0KLSAgICBmb3IgKCA7IDsgKSB7Ci0gICAgICAgIGludCB2OwotICAgICAgICBpZiAoIFNETF9pc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqdGV4dCkgKSB7Ci0gICAgICAgICAgICB2ID0gKnRleHQgLSAnMCc7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc3VwcGVyaGV4KCp0ZXh0KSApIHsKLSAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdBJyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc2xvd2VyaGV4KCp0ZXh0KSApIHsKLSAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdhJyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSAqPSByYWRpeDsKLSAgICAgICAgdmFsdWUgKz0gdjsKLSAgICAgICAgKyt0ZXh0OwotICAgIH0KLSAgICBpZiAoIHZhbHVlcCApIHsKLSAgICAgICAgaWYgKCBuZWdhdGl2ZSAmJiB2YWx1ZSApIHsKLSAgICAgICAgICAgICp2YWx1ZXAgPSAtdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICh0ZXh0IC0gdGV4dHN0YXJ0KTsKLX0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9TU0NBTkYpIHx8ICFkZWZpbmVkKEhBVkVfU1RSVE9VTEwpCi1zdGF0aWMgc2l6ZV90IFNETF9TY2FuVW5zaWduZWRMb25nTG9uZyhjb25zdCBjaGFyICp0ZXh0LCBpbnQgcmFkaXgsIFVpbnQ2NCAqdmFsdWVwKQotewotICAgIGNvbnN0IGNoYXIgKnRleHRzdGFydCA9IHRleHQ7Ci0gICAgVWludDY0IHZhbHVlID0gMDsKLQotICAgIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX3N0cm5jbXAodGV4dCwgIjB4IiwgMikgPT0gMCApIHsKLSAgICAgICAgdGV4dCArPSAyOwotICAgIH0KLSAgICBmb3IgKCA7IDsgKSB7Ci0gICAgICAgIGludCB2OwotICAgICAgICBpZiAoIFNETF9pc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqdGV4dCkgKSB7Ci0gICAgICAgICAgICB2ID0gKnRleHQgLSAnMCc7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc3VwcGVyaGV4KCp0ZXh0KSApIHsKLSAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdBJyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc2xvd2VyaGV4KCp0ZXh0KSApIHsKLSAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdhJyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSAqPSByYWRpeDsKLSAgICAgICAgdmFsdWUgKz0gdjsKLSAgICAgICAgKyt0ZXh0OwotICAgIH0KLSAgICBpZiAoIHZhbHVlcCApIHsKLSAgICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgIH0KLSAgICByZXR1cm4gKHRleHQgLSB0ZXh0c3RhcnQpOwotfQotI2VuZGlmCi0jZW5kaWYgLyogU0RMX0hBU182NEJJVF9UWVBFICovCi0KLSNpZiAhZGVmaW5lZChIQVZFX1NTQ0FORikgfHwgIWRlZmluZWQoSEFWRV9TVFJUT0QpCi1zdGF0aWMgc2l6ZV90IFNETF9TY2FuRmxvYXQoY29uc3QgY2hhciAqdGV4dCwgZG91YmxlICp2YWx1ZXApCi17Ci0gICAgY29uc3QgY2hhciAqdGV4dHN0YXJ0ID0gdGV4dDsKLSAgICB1bnNpZ25lZCBsb25nIGx2YWx1ZSA9IDA7Ci0gICAgZG91YmxlIHZhbHVlID0gMC4wOwotICAgIFNETF9ib29sIG5lZ2F0aXZlID0gU0RMX0ZBTFNFOwotCi0gICAgaWYgKCAqdGV4dCA9PSAnLScgKSB7Ci0gICAgICAgIG5lZ2F0aXZlID0gU0RMX1RSVUU7Ci0gICAgICAgICsrdGV4dDsKLSAgICB9Ci0gICAgdGV4dCArPSBTRExfU2NhblVuc2lnbmVkTG9uZyh0ZXh0LCAxMCwgJmx2YWx1ZSk7Ci0gICAgdmFsdWUgKz0gbHZhbHVlOwotICAgIGlmICggKnRleHQgPT0gJy4nICkgewotICAgICAgICBpbnQgbXVsdCA9IDEwOwotICAgICAgICArK3RleHQ7Ci0gICAgICAgIHdoaWxlICggU0RMX2lzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICp0ZXh0KSApIHsKLSAgICAgICAgICAgIGx2YWx1ZSA9ICp0ZXh0IC0gJzAnOwotICAgICAgICAgICAgdmFsdWUgKz0gKGRvdWJsZSlsdmFsdWUgLyBtdWx0OwotICAgICAgICAgICAgbXVsdCAqPSAxMDsKLSAgICAgICAgICAgICsrdGV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIHZhbHVlcCApIHsKLSAgICAgICAgaWYgKCBuZWdhdGl2ZSAmJiB2YWx1ZSApIHsKLSAgICAgICAgICAgICp2YWx1ZXAgPSAtdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICh0ZXh0IC0gdGV4dHN0YXJ0KTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIFNETF9tZW1zZXQKLXZvaWQgKlNETF9tZW1zZXQodm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IGxlbikKLXsKLSAgICBzaXplX3QgbGVmdCA9IChsZW4gJSA0KTsKLSAgICBpZiAoIGxlbiA+PSA0ICkgewotICAgICAgICBVaW50MzIgdmFsdWUgPSAwOwotICAgICAgICBVaW50MzIgKmRzdHAgPSAoVWludDMyICopZHN0OwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgICAgICAgICAgdmFsdWUgPDw9IDg7Ci0gICAgICAgICAgICB2YWx1ZSB8PSBjOwotICAgICAgICB9Ci0gICAgICAgIGxlbiAvPSA0OwotICAgICAgICB3aGlsZSAoIGxlbi0tICkgewotICAgICAgICAgICAgKmRzdHArKyA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICggbGVmdCA+IDAgKSB7Ci0gICAgICAgIFVpbnQ4IHZhbHVlID0gKFVpbnQ4KWM7Ci0gICAgICAgIFVpbnQ4ICpkc3RwID0gKFVpbnQ4ICopZHN0OwotCXN3aXRjaChsZWZ0KSB7Ci0JY2FzZSAzOgotICAgICAgICAgICAgKmRzdHArKyA9IHZhbHVlOwotCWNhc2UgMjoKLSAgICAgICAgICAgICpkc3RwKysgPSB2YWx1ZTsKLQljYXNlIDE6Ci0gICAgICAgICAgICAqZHN0cCsrID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRzdDsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIFNETF9tZW1jcHkKLXZvaWQgKlNETF9tZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCi17Ci0gICAgY2hhciAqc3JjcCA9IChjaGFyICopc3JjOwotICAgIGNoYXIgKmRzdHAgPSAoY2hhciAqKWRzdDsKLSAgICB3aGlsZSAoIGxlbi0tICkgewotICAgICAgICAqZHN0cCsrID0gKnNyY3ArKzsKLSAgICB9Ci0gICAgcmV0dXJuIGRzdDsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIFNETF9yZXZjcHkKLXZvaWQgKlNETF9yZXZjcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCi17Ci0gICAgY2hhciAqc3JjcCA9IChjaGFyICopc3JjOwotICAgIGNoYXIgKmRzdHAgPSAoY2hhciAqKWRzdDsKLSAgICBzcmNwICs9IGxlbi0xOwotICAgIGRzdHAgKz0gbGVuLTE7Ci0gICAgd2hpbGUgKCBsZW4tLSApIHsKLSAgICAgICAgKmRzdHAtLSA9ICpzcmNwLS07Ci0gICAgfQotICAgIHJldHVybiBkc3Q7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBTRExfbWVtY21wCi1pbnQgU0RMX21lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pCi17Ci0gICAgY2hhciAqczFwID0gKGNoYXIgKilzMTsKLSAgICBjaGFyICpzMnAgPSAoY2hhciAqKXMyOwotICAgIHdoaWxlICggbGVuLS0gKSB7Ci0gICAgICAgIGlmICggKnMxcCAhPSAqczJwICkgewotICAgICAgICAgICAgcmV0dXJuICgqczFwIC0gKnMycCk7Ci0gICAgfQotICAgICsrczFwOwotICAgICsrczJwOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RSTEVOCi1zaXplX3QgU0RMX3N0cmxlbihjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gICAgc2l6ZV90IGxlbiA9IDA7Ci0gICAgd2hpbGUgKCAqc3RyaW5nKysgKSB7Ci0gICAgICAgICsrbGVuOwotICAgIH0KLSAgICByZXR1cm4gbGVuOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9TVFJMQ1BZCi1zaXplX3QgU0RMX3N0cmxjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBtYXhsZW4pCi17Ci0gICAgc2l6ZV90IHNyY2xlbiA9IFNETF9zdHJsZW4oc3JjKTsKLSAgICBpZiAoIG1heGxlbiA+IDAgKSB7Ci0gICAgICAgIHNpemVfdCBsZW4gPSBTRExfbWluKHNyY2xlbiwgbWF4bGVuLTEpOwotICAgICAgICBTRExfbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotICAgICAgICBkc3RbbGVuXSA9ICdcMCc7Ci0gICAgfQotICAgIHJldHVybiBzcmNsZW47Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUkxDQVQKLXNpemVfdCBTRExfc3RybGNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG1heGxlbikKLXsKLSAgICBzaXplX3QgZHN0bGVuID0gU0RMX3N0cmxlbihkc3QpOwotICAgIHNpemVfdCBzcmNsZW4gPSBTRExfc3RybGVuKHNyYyk7Ci0gICAgaWYgKCBkc3RsZW4gPCBtYXhsZW4gKSB7Ci0gICAgICAgIFNETF9zdHJsY3B5KGRzdCtkc3RsZW4sIHNyYywgbWF4bGVuLWRzdGxlbik7Ci0gICAgfQotICAgIHJldHVybiBkc3RsZW4rc3JjbGVuOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9TVFJEVVAKLWNoYXIgKlNETF9zdHJkdXAoY29uc3QgY2hhciAqc3RyaW5nKQotewotICAgIHNpemVfdCBsZW4gPSBTRExfc3RybGVuKHN0cmluZykrMTsKLSAgICBjaGFyICpuZXdzdHIgPSBTRExfbWFsbG9jKGxlbik7Ci0gICAgaWYgKCBuZXdzdHIgKSB7Ci0gICAgICAgIFNETF9zdHJsY3B5KG5ld3N0ciwgc3RyaW5nLCBsZW4pOwotICAgIH0KLSAgICByZXR1cm4gbmV3c3RyOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9fU1RSUkVWCi1jaGFyICpTRExfc3RycmV2KGNoYXIgKnN0cmluZykKLXsKLSAgICBzaXplX3QgbGVuID0gU0RMX3N0cmxlbihzdHJpbmcpOwotICAgIGNoYXIgKmEgPSAmc3RyaW5nWzBdOwotICAgIGNoYXIgKmIgPSAmc3RyaW5nW2xlbi0xXTsKLSAgICBsZW4gLz0gMjsKLSAgICB3aGlsZSAoIGxlbi0tICkgewotICAgICAgICBjaGFyIGMgPSAqYTsKLSAgICAgICAgKmErKyA9ICpiOwotICAgICAgICAqYi0tID0gYzsKLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfX1NUUlVQUgotY2hhciAqU0RMX3N0cnVwcihjaGFyICpzdHJpbmcpCi17Ci0gICAgY2hhciAqYnVmcCA9IHN0cmluZzsKLSAgICB3aGlsZSAoICpidWZwICkgewotICAgICAgICAqYnVmcCA9IFNETF90b3VwcGVyKCh1bnNpZ25lZCBjaGFyKSAqYnVmcCk7Ci0JKytidWZwOwotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9fU1RSTFdSCi1jaGFyICpTRExfc3RybHdyKGNoYXIgKnN0cmluZykKLXsKLSAgICBjaGFyICpidWZwID0gc3RyaW5nOwotICAgIHdoaWxlICggKmJ1ZnAgKSB7Ci0gICAgICAgICpidWZwID0gU0RMX3RvbG93ZXIoKHVuc2lnbmVkIGNoYXIpICpidWZwKTsKLQkrK2J1ZnA7Ci0gICAgfQotICAgIHJldHVybiBzdHJpbmc7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUkNIUgotY2hhciAqU0RMX3N0cmNocihjb25zdCBjaGFyICpzdHJpbmcsIGludCBjKQotewotICAgIHdoaWxlICggKnN0cmluZyApIHsKLSAgICAgICAgaWYgKCAqc3RyaW5nID09IGMgKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGNoYXIgKilzdHJpbmc7Ci0gICAgICAgIH0KLQkrK3N0cmluZzsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUlJDSFIKLWNoYXIgKlNETF9zdHJyY2hyKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGMpCi17Ci0gICAgY29uc3QgY2hhciAqYnVmcCA9IHN0cmluZyArIFNETF9zdHJsZW4oc3RyaW5nKSAtIDE7Ci0gICAgd2hpbGUgKCBidWZwID49IHN0cmluZyApIHsKLSAgICAgICAgaWYgKCAqYnVmcCA9PSBjICkgewotICAgICAgICAgICAgcmV0dXJuIChjaGFyICopYnVmcDsKLSAgICAgICAgfQotCS0tYnVmcDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUlNUUgotY2hhciAqU0RMX3N0cnN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKQotewotICAgIHNpemVfdCBsZW5ndGggPSBTRExfc3RybGVuKG5lZWRsZSk7Ci0gICAgd2hpbGUgKCAqaGF5c3RhY2sgKSB7Ci0gICAgICAgIGlmICggU0RMX3N0cm5jbXAoaGF5c3RhY2ssIG5lZWRsZSwgbGVuZ3RoKSA9PSAwICkgewotICAgICAgICAgICAgcmV0dXJuIChjaGFyICopaGF5c3RhY2s7Ci0gICAgICAgIH0KLQkrK2hheXN0YWNrOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9fTFRPQSkgIHx8ICFkZWZpbmVkKEhBVkVfX0k2NFRPQSkgfHwgXAotICAgICFkZWZpbmVkKEhBVkVfX1VMVE9BKSB8fCAhZGVmaW5lZChIQVZFX19VSTY0VE9BKQotc3RhdGljIGNvbnN0IGNoYXIgbnRvYV90YWJsZVtdID0gewotICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLSAgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsCi0gICAgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLAotICAgICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicKLX07Ci0jZW5kaWYgLyogbnRvYSgpIGNvbnZlcnNpb24gdGFibGUgKi8KLQotI2lmbmRlZiBIQVZFX19MVE9BCi1jaGFyICpTRExfbHRvYShsb25nIHZhbHVlLCBjaGFyICpzdHJpbmcsIGludCByYWRpeCkKLXsKLSAgICBjaGFyICpidWZwID0gc3RyaW5nOwotCi0gICAgaWYgKCB2YWx1ZSA8IDAgKSB7Ci0gICAgICAgICpidWZwKysgPSAnLSc7Ci0gICAgICAgIHZhbHVlID0gLXZhbHVlOwotICAgIH0KLSAgICBpZiAoIHZhbHVlICkgewotICAgICAgICB3aGlsZSAoIHZhbHVlID4gMCApIHsKLSAgICAgICAgICAgICpidWZwKysgPSBudG9hX3RhYmxlW3ZhbHVlICUgcmFkaXhdOwotICAgICAgICAgICAgdmFsdWUgLz0gcmFkaXg7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAqYnVmcCsrID0gJzAnOwotICAgIH0KLSAgICAqYnVmcCA9ICdcMCc7Ci0KLSAgICAvKiBUaGUgbnVtYmVycyB3ZW50IGludG8gdGhlIHN0cmluZyBiYWNrd2FyZHMuIDopICovCi0gICAgaWYgKCAqc3RyaW5nID09ICctJyApIHsKLSAgICAgICAgU0RMX3N0cnJldihzdHJpbmcrMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU0RMX3N0cnJldihzdHJpbmcpOwotICAgIH0KLQotICAgIHJldHVybiBzdHJpbmc7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX19VTFRPQQotY2hhciAqU0RMX3VsdG9hKHVuc2lnbmVkIGxvbmcgdmFsdWUsIGNoYXIgKnN0cmluZywgaW50IHJhZGl4KQotewotICAgIGNoYXIgKmJ1ZnAgPSBzdHJpbmc7Ci0KLSAgICBpZiAoIHZhbHVlICkgewotICAgICAgICB3aGlsZSAoIHZhbHVlID4gMCApIHsKLSAgICAgICAgICAgICpidWZwKysgPSBudG9hX3RhYmxlW3ZhbHVlICUgcmFkaXhdOwotICAgICAgICAgICAgdmFsdWUgLz0gcmFkaXg7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAqYnVmcCsrID0gJzAnOwotICAgIH0KLSAgICAqYnVmcCA9ICdcMCc7Ci0KLSAgICAvKiBUaGUgbnVtYmVycyB3ZW50IGludG8gdGhlIHN0cmluZyBiYWNrd2FyZHMuIDopICovCi0gICAgU0RMX3N0cnJldihzdHJpbmcpOwotCi0gICAgcmV0dXJuIHN0cmluZzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RSVE9MCi1sb25nIFNETF9zdHJ0b2woY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCi17Ci0gICAgc2l6ZV90IGxlbjsKLSAgICBsb25nIHZhbHVlOwotCi0gICAgaWYgKCAhYmFzZSApIHsKLSAgICAgICAgaWYgKCAoU0RMX3N0cmxlbihzdHJpbmcpID4gMikgJiYgKFNETF9zdHJuY21wKHN0cmluZywgIjB4IiwgMikgPT0gMCkgKSB7Ci0gICAgICAgICAgICBiYXNlID0gMTY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiYXNlID0gMTA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBsZW4gPSBTRExfU2Nhbkxvbmcoc3RyaW5nLCBiYXNlLCAmdmFsdWUpOwotICAgIGlmICggZW5kcCApIHsKLSAgICAgICAgKmVuZHAgPSAoY2hhciAqKXN0cmluZyArIGxlbjsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9TVFJUT1VMCi11bnNpZ25lZCBsb25nIFNETF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQotewotICAgIHNpemVfdCBsZW47Ci0gICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotICAgIGlmICggIWJhc2UgKSB7Ci0gICAgICAgIGlmICggKFNETF9zdHJsZW4oc3RyaW5nKSA+IDIpICYmIChTRExfc3RybmNtcChzdHJpbmcsICIweCIsIDIpID09IDApICkgewotICAgICAgICAgICAgYmFzZSA9IDE2OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYmFzZSA9IDEwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbGVuID0gU0RMX1NjYW5VbnNpZ25lZExvbmcoc3RyaW5nLCBiYXNlLCAmdmFsdWUpOwotICAgIGlmICggZW5kcCApIHsKLSAgICAgICAgKmVuZHAgPSAoY2hhciAqKXN0cmluZyArIGxlbjsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotI2VuZGlmCi0KLSNpZmRlZiBTRExfSEFTXzY0QklUX1RZUEUKLQotI2lmbmRlZiBIQVZFX19JNjRUT0EKLWNoYXIgKlNETF9sbHRvYShTaW50NjQgdmFsdWUsIGNoYXIgKnN0cmluZywgaW50IHJhZGl4KQotewotICAgIGNoYXIgKmJ1ZnAgPSBzdHJpbmc7Ci0KLSAgICBpZiAoIHZhbHVlIDwgMCApIHsKLSAgICAgICAgKmJ1ZnArKyA9ICctJzsKLSAgICAgICAgdmFsdWUgPSAtdmFsdWU7Ci0gICAgfQotICAgIGlmICggdmFsdWUgKSB7Ci0gICAgICAgIHdoaWxlICggdmFsdWUgPiAwICkgewotICAgICAgICAgICAgKmJ1ZnArKyA9IG50b2FfdGFibGVbdmFsdWUgJSByYWRpeF07Ci0gICAgICAgICAgICB2YWx1ZSAvPSByYWRpeDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgICpidWZwKysgPSAnMCc7Ci0gICAgfQotICAgICpidWZwID0gJ1wwJzsKLQotICAgIC8qIFRoZSBudW1iZXJzIHdlbnQgaW50byB0aGUgc3RyaW5nIGJhY2t3YXJkcy4gOikgKi8KLSAgICBpZiAoICpzdHJpbmcgPT0gJy0nICkgewotICAgICAgICBTRExfc3RycmV2KHN0cmluZysxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBTRExfc3RycmV2KHN0cmluZyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0cmluZzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfX1VJNjRUT0EKLWNoYXIgKlNETF91bGx0b2EoVWludDY0IHZhbHVlLCBjaGFyICpzdHJpbmcsIGludCByYWRpeCkKLXsKLSAgICBjaGFyICpidWZwID0gc3RyaW5nOwotCi0gICAgaWYgKCB2YWx1ZSApIHsKLSAgICAgICAgd2hpbGUgKCB2YWx1ZSA+IDAgKSB7Ci0gICAgICAgICAgICAqYnVmcCsrID0gbnRvYV90YWJsZVt2YWx1ZSAlIHJhZGl4XTsKLSAgICAgICAgICAgIHZhbHVlIC89IHJhZGl4OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmJ1ZnArKyA9ICcwJzsKLSAgICB9Ci0gICAgKmJ1ZnAgPSAnXDAnOwotCi0gICAgLyogVGhlIG51bWJlcnMgd2VudCBpbnRvIHRoZSBzdHJpbmcgYmFja3dhcmRzLiA6KSAqLwotICAgIFNETF9zdHJyZXYoc3RyaW5nKTsKLQotICAgIHJldHVybiBzdHJpbmc7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUlRPTEwKLVNpbnQ2NCBTRExfc3RydG9sbChjb25zdCBjaGFyICpzdHJpbmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKLXsKLSAgICBzaXplX3QgbGVuOwotICAgIFNpbnQ2NCB2YWx1ZTsKLQotICAgIGlmICggIWJhc2UgKSB7Ci0gICAgICAgIGlmICggKFNETF9zdHJsZW4oc3RyaW5nKSA+IDIpICYmIChTRExfc3RybmNtcChzdHJpbmcsICIweCIsIDIpID09IDApICkgewotICAgICAgICAgICAgYmFzZSA9IDE2OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYmFzZSA9IDEwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbGVuID0gU0RMX1NjYW5Mb25nTG9uZyhzdHJpbmcsIGJhc2UsICZ2YWx1ZSk7Ci0gICAgaWYgKCBlbmRwICkgewotICAgICAgICAqZW5kcCA9IChjaGFyICopc3RyaW5nICsgbGVuOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUlRPVUxMCi1VaW50NjQgU0RMX3N0cnRvdWxsKGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQotewotICAgIHNpemVfdCBsZW47Ci0gICAgVWludDY0IHZhbHVlOwotCi0gICAgaWYgKCAhYmFzZSApIHsKLSAgICAgICAgaWYgKCAoU0RMX3N0cmxlbihzdHJpbmcpID4gMikgJiYgKFNETF9zdHJuY21wKHN0cmluZywgIjB4IiwgMikgPT0gMCkgKSB7Ci0gICAgICAgICAgICBiYXNlID0gMTY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiYXNlID0gMTA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBsZW4gPSBTRExfU2NhblVuc2lnbmVkTG9uZ0xvbmcoc3RyaW5nLCBiYXNlLCAmdmFsdWUpOwotICAgIGlmICggZW5kcCApIHsKLSAgICAgICAgKmVuZHAgPSAoY2hhciAqKXN0cmluZyArIGxlbjsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBTRExfSEFTXzY0QklUX1RZUEUgKi8KLQotI2lmbmRlZiBIQVZFX1NUUlRPRAotZG91YmxlIFNETF9zdHJ0b2QoY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kcCkKLXsKLSAgICBzaXplX3QgbGVuOwotICAgIGRvdWJsZSB2YWx1ZTsKLQotICAgIGxlbiA9IFNETF9TY2FuRmxvYXQoc3RyaW5nLCAmdmFsdWUpOwotICAgIGlmICggZW5kcCApIHsKLSAgICAgICAgKmVuZHAgPSAoY2hhciAqKXN0cmluZyArIGxlbjsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9TVFJDTVAKLWludCBTRExfc3RyY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpCi17Ci0gICAgd2hpbGUgKCpzdHIxICYmICpzdHIyKSB7Ci0gICAgICAgIGlmICggKnN0cjEgIT0gKnN0cjIgKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICsrc3RyMTsKLSAgICAgICAgKytzdHIyOwotICAgIH0KLSAgICByZXR1cm4gKGludCkoKHVuc2lnbmVkIGNoYXIpKnN0cjEgLSAodW5zaWduZWQgY2hhcikqc3RyMik7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUk5DTVAKLWludCBTRExfc3RybmNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyLCBzaXplX3QgbWF4bGVuKQotewotICAgIHdoaWxlICggKnN0cjEgJiYgKnN0cjIgJiYgbWF4bGVuICkgewotICAgICAgICBpZiAoICpzdHIxICE9ICpzdHIyICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICArK3N0cjE7Ci0gICAgICAgICsrc3RyMjsKLSAgICAgICAgLS1tYXhsZW47Ci0gICAgfQotICAgIGlmICggISBtYXhsZW4gKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKGludCkoKHVuc2lnbmVkIGNoYXIpKnN0cjEgLSAodW5zaWduZWQgY2hhcikqc3RyMik7Ci19Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEhBVkVfU1RSQ0FTRUNNUCkgJiYgIWRlZmluZWQoSEFWRV9fU1RSSUNNUCkKLWludCBTRExfc3RyY2FzZWNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyKQotewotICAgIGNoYXIgYSA9IDA7Ci0gICAgY2hhciBiID0gMDsKLSAgICB3aGlsZSAoICpzdHIxICYmICpzdHIyICkgewotICAgICAgICBhID0gU0RMX3RvbG93ZXIoKHVuc2lnbmVkIGNoYXIpICpzdHIxKTsKLSAgICAgICAgYiA9IFNETF90b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSAqc3RyMik7Ci0gICAgICAgIGlmICggYSAhPSBiICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICArK3N0cjE7Ci0gICAgICAgICsrc3RyMjsKLSAgICB9Ci0gICAgcmV0dXJuIChpbnQpKCh1bnNpZ25lZCBjaGFyKWEgLSAodW5zaWduZWQgY2hhciliKTsKLX0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9TVFJOQ0FTRUNNUCkgJiYgIWRlZmluZWQoSEFWRV9fU1RSTklDTVApCi1pbnQgU0RMX3N0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIsIHNpemVfdCBtYXhsZW4pCi17Ci0gICAgY2hhciBhID0gMDsKLSAgICBjaGFyIGIgPSAwOwotICAgIHdoaWxlICggKnN0cjEgJiYgKnN0cjIgJiYgbWF4bGVuICkgewotICAgICAgICBhID0gU0RMX3RvbG93ZXIoKHVuc2lnbmVkIGNoYXIpICpzdHIxKTsKLSAgICAgICAgYiA9IFNETF90b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSAqc3RyMik7Ci0gICAgICAgIGlmICggYSAhPSBiICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICArK3N0cjE7Ci0gICAgICAgICsrc3RyMjsKLSAgICAgICAgLS1tYXhsZW47Ci0gICAgfQotICAgIHJldHVybiAoaW50KSgodW5zaWduZWQgY2hhcilhIC0gKHVuc2lnbmVkIGNoYXIpYik7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NTQ0FORgotaW50IFNETF9zc2NhbmYoY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcDsKLSAgICBpbnQgcmV0dmFsID0gMDsKLQotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIHdoaWxlICggKmZtdCApIHsKLSAgICAgICAgaWYgKCAqZm10ID09ICcgJyApIHsKLSAgICAgICAgICAgIHdoaWxlICggU0RMX2lzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICp0ZXh0KSApIHsKLSAgICAgICAgICAgICAgICArK3RleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK2ZtdDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICggKmZtdCA9PSAnJScgKSB7Ci0gICAgICAgICAgICBTRExfYm9vbCBkb25lID0gU0RMX0ZBTFNFOwotICAgICAgICAgICAgbG9uZyBjb3VudCA9IDA7Ci0gICAgICAgICAgICBpbnQgcmFkaXggPSAxMDsKLSAgICAgICAgICAgIGVudW0gewotICAgICAgICAgICAgICAgIERPX1NIT1JULAotICAgICAgICAgICAgICAgIERPX0lOVCwKLSAgICAgICAgICAgICAgICBET19MT05HLAotICAgICAgICAgICAgICAgIERPX0xPTkdMT05HCi0gICAgICAgICAgICB9IGludHR5cGUgPSBET19JTlQ7Ci0gICAgICAgICAgICBTRExfYm9vbCBzdXBwcmVzcyA9IFNETF9GQUxTRTsKLQotICAgICAgICAgICAgKytmbXQ7Ci0gICAgICAgICAgICBpZiAoICpmbXQgPT0gJyUnICkgewotICAgICAgICAgICAgICAgIGlmICggKnRleHQgPT0gJyUnICkgewotICAgICAgICAgICAgICAgICAgICArK3RleHQ7Ci0gICAgICAgICAgICAgICAgICAgICsrZm10OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoICpmbXQgPT0gJyonICkgewotICAgICAgICAgICAgICAgIHN1cHByZXNzID0gU0RMX1RSVUU7Ci0gICAgICAgICAgICAgICAgKytmbXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbXQgKz0gU0RMX1NjYW5Mb25nKGZtdCwgMTAsICZjb3VudCk7Ci0KLSAgICAgICAgICAgIGlmICggKmZtdCA9PSAnYycgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCAhIGNvdW50ICkgewotICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICggc3VwcHJlc3MgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICggY291bnQtLSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrdGV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlcCA9IHZhX2FyZyhhcCwgY2hhciopOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGNvdW50LS0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwKysgPSAqdGV4dCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICsrcmV0dmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKCBTRExfaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnRleHQpICkgewotICAgICAgICAgICAgICAgICsrdGV4dDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogRklYTUU6IGltcGxlbWVudCBtb3JlIG9mIHRoZSBmb3JtYXQgc3BlY2lmaWVycyAqLwotICAgICAgICAgICAgd2hpbGUgKCFkb25lKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCpmbXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzcyA9IFNETF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnR0eXBlID4gRE9fU0hPUlQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbnR0eXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2wnOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnR0eXBlIDwgRE9fTE9OR0xPTkcgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbnR0eXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBTRExfc3RybmNtcChmbXQsICJJNjQiLCAzKSA9PSAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdCArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHR5cGUgPSBET19MT05HTE9ORzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdpJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdGV4dFtpbmRleF0gPT0gJy0nICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRleHRbaW5kZXhdID09ICcwJyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBTRExfdG9sb3dlcigodW5zaWduZWQgY2hhcikgdGV4dFtpbmRleCsxXSkgPT0gJ3gnICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXggPSAxNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl4ID0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byAlZCBoYW5kbGluZyAqLwotICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKLSNpZmRlZiBTRExfSEFTXzY0QklUX1RZUEUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW50dHlwZSA9PSBET19MT05HTE9ORyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW50NjQgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBTRExfU2NhbkxvbmdMb25nKHRleHQsIHJhZGl4LCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBzdXBwcmVzcyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ludDY0ICp2YWx1ZXAgPSB2YV9hcmcoYXAsIFNpbnQ2NCopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZiAvKiBTRExfSEFTXzY0QklUX1RZUEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gU0RMX1NjYW5Mb25nKHRleHQsIHJhZGl4LCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBzdXBwcmVzcyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbnR0eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX1NIT1JUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc2hvcnQqIHZhbHVlcCA9IHZhX2FyZyhhcCwgc2hvcnQqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlcCA9IChzaG9ydCl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGludCogdmFsdWVwID0gdmFfYXJnKGFwLCBpbnQqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlcCA9IChpbnQpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBET19MT05HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbG9uZyogdmFsdWVwID0gdmFfYXJnKGFwLCBsb25nKik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX0xPTkdMT05HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhbmRsZWQgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3JldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gU0RMX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJhZGl4ID09IDEwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl4ID0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byB1bnNpZ25lZCBoYW5kbGluZyAqLwotICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJhZGl4ID09IDEwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl4ID0gMTY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gdW5zaWduZWQgaGFuZGxpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6Ci0jaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGludHR5cGUgPT0gRE9fTE9OR0xPTkcgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDY0IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gU0RMX1NjYW5VbnNpZ25lZExvbmdMb25nKHRleHQsIHJhZGl4LCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBzdXBwcmVzcyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDY0ICp2YWx1ZXAgPSB2YV9hcmcoYXAsIFVpbnQ2NCopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZiAvKiBTRExfSEFTXzY0QklUX1RZUEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gU0RMX1NjYW5VbnNpZ25lZExvbmcodGV4dCwgcmFkaXgsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHN1cHByZXNzICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGludHR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fU0hPUlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzaG9ydCogdmFsdWVwID0gdmFfYXJnKGFwLCBzaG9ydCopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwID0gKHNob3J0KXZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fSU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaW50KiB2YWx1ZXAgPSB2YV9hcmcoYXAsIGludCopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwID0gKGludCl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX0xPTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBsb25nKiB2YWx1ZXAgPSB2YV9hcmcoYXAsIGxvbmcqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fTE9OR0xPTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGFuZGxlZCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBTRExfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBTRExfU2NhblVpbnRQdHJUKHRleHQsIDE2LCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBzdXBwcmVzcyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHZhbHVlcCA9IHZhX2FyZyhhcCwgdm9pZCoqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlcCA9ICh2b2lkKil2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytyZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFNETF9TY2FuRmxvYXQodGV4dCwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgc3VwcHJlc3MgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2YWx1ZXAgPSB2YV9hcmcoYXAsIGZsb2F0Kik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZXAgPSAoZmxvYXQpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBTRExfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3VwcHJlc3MgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAhU0RMX2lzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICp0ZXh0KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt0ZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNvdW50ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAtLWNvdW50ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlcCA9IHZhX2FyZyhhcCwgY2hhciopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggIVNETF9pc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqdGV4dCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZXArKyA9ICp0ZXh0Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY291bnQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIC0tY291bnQgPT0gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3JldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBTRExfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICsrZm10OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAqdGV4dCA9PSAqZm10ICkgewotICAgICAgICAgICAgKyt0ZXh0OwotICAgICAgICAgICAgKytmbXQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvKiBUZXh0IGRpZG4ndCBtYXRjaCBmb3JtYXQgc3BlY2lmaWVyICovCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICB2YV9lbmQoYXApOwotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU05QUklOVEYKLWludCBTRExfc25wcmludGYoY2hhciAqdGV4dCwgc2l6ZV90IG1heGxlbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcDsKLSAgICBpbnQgcmV0dmFsOwotCi0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgcmV0dmFsID0gU0RMX3ZzbnByaW50Zih0ZXh0LCBtYXhsZW4sIGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9WU05QUklOVEYKLXN0YXRpYyBzaXplX3QgU0RMX1ByaW50TG9uZyhjaGFyICp0ZXh0LCBsb25nIHZhbHVlLCBpbnQgcmFkaXgsIHNpemVfdCBtYXhsZW4pCi17Ci0gICAgY2hhciBudW1bMTMwXTsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIFNETF9sdG9hKHZhbHVlLCBudW0sIHJhZGl4KTsKLSAgICBzaXplID0gU0RMX3N0cmxlbihudW0pOwotICAgIGlmICggc2l6ZSA+PSBtYXhsZW4gKSB7Ci0gICAgICAgIHNpemUgPSBtYXhsZW4tMTsKLSAgICB9Ci0gICAgU0RMX3N0cmxjcHkodGV4dCwgbnVtLCBzaXplKzEpOwotCi0gICAgcmV0dXJuIHNpemU7Ci19Ci1zdGF0aWMgc2l6ZV90IFNETF9QcmludFVuc2lnbmVkTG9uZyhjaGFyICp0ZXh0LCB1bnNpZ25lZCBsb25nIHZhbHVlLCBpbnQgcmFkaXgsIHNpemVfdCBtYXhsZW4pCi17Ci0gICAgY2hhciBudW1bMTMwXTsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIFNETF91bHRvYSh2YWx1ZSwgbnVtLCByYWRpeCk7Ci0gICAgc2l6ZSA9IFNETF9zdHJsZW4obnVtKTsKLSAgICBpZiAoIHNpemUgPj0gbWF4bGVuICkgewotICAgICAgICBzaXplID0gbWF4bGVuLTE7Ci0gICAgfQotICAgIFNETF9zdHJsY3B5KHRleHQsIG51bSwgc2l6ZSsxKTsKLQotICAgIHJldHVybiBzaXplOwotfQotI2lmZGVmIFNETF9IQVNfNjRCSVRfVFlQRQotc3RhdGljIHNpemVfdCBTRExfUHJpbnRMb25nTG9uZyhjaGFyICp0ZXh0LCBTaW50NjQgdmFsdWUsIGludCByYWRpeCwgc2l6ZV90IG1heGxlbikKLXsKLSAgICBjaGFyIG51bVsxMzBdOwotICAgIHNpemVfdCBzaXplOwotCi0gICAgU0RMX2xsdG9hKHZhbHVlLCBudW0sIHJhZGl4KTsKLSAgICBzaXplID0gU0RMX3N0cmxlbihudW0pOwotICAgIGlmICggc2l6ZSA+PSBtYXhsZW4gKSB7Ci0gICAgICAgIHNpemUgPSBtYXhsZW4tMTsKLSAgICB9Ci0gICAgU0RMX3N0cmxjcHkodGV4dCwgbnVtLCBzaXplKzEpOwotCi0gICAgcmV0dXJuIHNpemU7Ci19Ci1zdGF0aWMgc2l6ZV90IFNETF9QcmludFVuc2lnbmVkTG9uZ0xvbmcoY2hhciAqdGV4dCwgVWludDY0IHZhbHVlLCBpbnQgcmFkaXgsIHNpemVfdCBtYXhsZW4pCi17Ci0gICAgY2hhciBudW1bMTMwXTsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIFNETF91bGx0b2EodmFsdWUsIG51bSwgcmFkaXgpOwotICAgIHNpemUgPSBTRExfc3RybGVuKG51bSk7Ci0gICAgaWYgKCBzaXplID49IG1heGxlbiApIHsKLSAgICAgICAgc2l6ZSA9IG1heGxlbi0xOwotICAgIH0KLSAgICBTRExfc3RybGNweSh0ZXh0LCBudW0sIHNpemUrMSk7Ci0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLSNlbmRpZiAvKiBTRExfSEFTXzY0QklUX1RZUEUgKi8KLXN0YXRpYyBzaXplX3QgU0RMX1ByaW50RmxvYXQoY2hhciAqdGV4dCwgZG91YmxlIGFyZywgc2l6ZV90IG1heGxlbikKLXsKLSAgICBjaGFyICp0ZXh0c3RhcnQgPSB0ZXh0OwotICAgIGlmICggYXJnICkgewotICAgICAgICAvKiBUaGlzIGlzbid0IGVzcGVjaWFsbHkgYWNjdXJhdGUsIGJ1dCBoZXksIGl0J3MgZWFzeS4gOikgKi8KLSAgICAgICAgY29uc3QgZG91YmxlIHByZWNpc2lvbiA9IDAuMDAwMDAwMDE7Ci0gICAgICAgIHNpemVfdCBsZW47Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLSAgICAgICAgaWYgKCBhcmcgPCAwICkgewotICAgICAgICAgICAgKnRleHQrKyA9ICctJzsKLSAgICAgICAgICAgIC0tbWF4bGVuOwotICAgICAgICAgICAgYXJnID0gLWFyZzsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSA9ICh1bnNpZ25lZCBsb25nKWFyZzsKLSAgICAgICAgbGVuID0gU0RMX1ByaW50VW5zaWduZWRMb25nKHRleHQsIHZhbHVlLCAxMCwgbWF4bGVuKTsKLSAgICAgICAgdGV4dCArPSBsZW47Ci0gICAgICAgIG1heGxlbiAtPSBsZW47Ci0gICAgICAgIGFyZyAtPSB2YWx1ZTsKLSAgICAgICAgaWYgKCBhcmcgPiBwcmVjaXNpb24gJiYgbWF4bGVuICkgewotICAgICAgICAgICAgaW50IG11bHQgPSAxMDsKLSAgICAgICAgICAgICp0ZXh0KysgPSAnLic7Ci0gICAgICAgICAgICB3aGlsZSAoIChhcmcgPiBwcmVjaXNpb24pICYmIG1heGxlbiApIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICh1bnNpZ25lZCBsb25nKShhcmcgKiBtdWx0KTsKLSAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRVbnNpZ25lZExvbmcodGV4dCwgdmFsdWUsIDEwLCBtYXhsZW4pOwotICAgICAgICAgICAgICAgIHRleHQgKz0gbGVuOwotICAgICAgICAgICAgICAgIG1heGxlbiAtPSBsZW47Ci0gICAgICAgICAgICAgICAgYXJnIC09IChkb3VibGUpdmFsdWUgLyBtdWx0OwotICAgICAgICAgICAgICAgIG11bHQgKj0gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAqdGV4dCsrID0gJzAnOwotICAgIH0KLSAgICByZXR1cm4gKHRleHQgLSB0ZXh0c3RhcnQpOwotfQotc3RhdGljIHNpemVfdCBTRExfUHJpbnRTdHJpbmcoY2hhciAqdGV4dCwgY29uc3QgY2hhciAqc3RyaW5nLCBzaXplX3QgbWF4bGVuKQotewotICAgIGNoYXIgKnRleHRzdGFydCA9IHRleHQ7Ci0gICAgd2hpbGUgKCAqc3RyaW5nICYmIG1heGxlbi0tICkgewotICAgICAgICAqdGV4dCsrID0gKnN0cmluZysrOwotICAgIH0KLSAgICByZXR1cm4gKHRleHQgLSB0ZXh0c3RhcnQpOwotfQotaW50IFNETF92c25wcmludGYoY2hhciAqdGV4dCwgc2l6ZV90IG1heGxlbiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotICAgIGNoYXIgKnRleHRzdGFydCA9IHRleHQ7Ci0gICAgaWYgKCBtYXhsZW4gPD0gMCApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC0tbWF4bGVuOyAvKiBGb3IgdGhlIHRyYWlsaW5nICdcMCcgKi8KLSAgICB3aGlsZSAoICpmbXQgJiYgbWF4bGVuICkgewotICAgICAgICBpZiAoICpmbXQgPT0gJyUnICkgewotICAgICAgICAgICAgU0RMX2Jvb2wgZG9uZSA9IFNETF9GQUxTRTsKLSAgICAgICAgICAgIHNpemVfdCBsZW4gPSAwOwotICAgICAgICAgICAgU0RMX2Jvb2wgZG9fbG93ZXJjYXNlID0gU0RMX0ZBTFNFOwotICAgICAgICAgICAgaW50IHJhZGl4ID0gMTA7Ci0gICAgICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgICAgICBET19JTlQsCi0gICAgICAgICAgICAgICAgRE9fTE9ORywKLSAgICAgICAgICAgICAgICBET19MT05HTE9ORwotICAgICAgICAgICAgfSBpbnR0eXBlID0gRE9fSU5UOwotCi0gICAgICAgICAgICArK2ZtdDsKLSAgICAgICAgICAgIC8qIEZJWE1FOiBpbXBsZW1lbnQgbW9yZSBvZiB0aGUgZm9ybWF0IHNwZWNpZmllcnMgKi8KLSAgICAgICAgICAgIHdoaWxlICggKmZtdCA9PSAnLicgfHwgKCpmbXQgPj0gJzAnICYmICpmbXQgPD0gJzknKSApIHsKLSAgICAgICAgICAgICAgICArK2ZtdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlICghZG9uZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCgqZm10KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgICAgICAgICAgICAgKnRleHQgPSAnJSc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hhciBpcyBwcm9tb3RlZCB0byBpbnQgd2hlbiBwYXNzZWQgdGhyb3VnaCAoLi4uKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKnRleHQgPSAoY2hhcil2YV9hcmcoYXAsIGludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvcnQgaXMgcHJvbW90ZWQgdG8gaW50IHdoZW4gcGFzc2VkIHRocm91Z2ggKC4uLikgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW50dHlwZSA8IERPX0xPTkdMT05HICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraW50dHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggU0RMX3N0cm5jbXAoZm10LCAiSTY0IiwgMykgPT0gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnR0eXBlID0gRE9fTE9OR0xPTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbnR0eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBET19JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IFNETF9QcmludExvbmcodGV4dCwgKGxvbmcpdmFfYXJnKGFwLCBpbnQpLCByYWRpeCwgbWF4bGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBET19MT05HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRMb25nKHRleHQsIHZhX2FyZyhhcCwgbG9uZyksIHJhZGl4LCBtYXhsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX0xPTkdMT05HOgotI2lmZGVmIFNETF9IQVNfNjRCSVRfVFlQRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRMb25nTG9uZyh0ZXh0LCB2YV9hcmcoYXAsIFNpbnQ2NCksIHJhZGl4LCBtYXhsZW4pOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gU0RMX1ByaW50TG9uZyh0ZXh0LCB2YV9hcmcoYXAsIGxvbmcpLCByYWRpeCwgbWF4bGVuKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBTRExfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb19sb3dlcmNhc2UgPSBTRExfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byAnWCcgaGFuZGxpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJhZGl4ID09IDEwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl4ID0gMTY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICpmbXQgPT0gJ3AnICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHR5cGUgPSBET19MT05HOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIHVuc2lnbmVkIGhhbmRsaW5nICovCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByYWRpeCA9PSAxMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpeCA9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gdW5zaWduZWQgaGFuZGxpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGludHR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gU0RMX1ByaW50VW5zaWduZWRMb25nKHRleHQsICh1bnNpZ25lZCBsb25nKXZhX2FyZyhhcCwgdW5zaWduZWQgaW50KSwgcmFkaXgsIG1heGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fTE9ORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gU0RMX1ByaW50VW5zaWduZWRMb25nKHRleHQsIHZhX2FyZyhhcCwgdW5zaWduZWQgbG9uZyksIHJhZGl4LCBtYXhsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX0xPTkdMT05HOgotI2lmZGVmIFNETF9IQVNfNjRCSVRfVFlQRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRVbnNpZ25lZExvbmdMb25nKHRleHQsIHZhX2FyZyhhcCwgVWludDY0KSwgcmFkaXgsIG1heGxlbik7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRVbnNpZ25lZExvbmcodGV4dCwgdmFfYXJnKGFwLCB1bnNpZ25lZCBsb25nKSwgcmFkaXgsIG1heGxlbik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRvX2xvd2VyY2FzZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfc3RybHdyKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gU0RMX1ByaW50RmxvYXQodGV4dCwgdmFfYXJnKGFwLCBkb3VibGUpLCBtYXhsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gU0RMX1ByaW50U3RyaW5nKHRleHQsIHZhX2FyZyhhcCwgY2hhciopLCBtYXhsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gU0RMX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKytmbXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZXh0ICs9IGxlbjsKLSAgICAgICAgICAgIG1heGxlbiAtPSBsZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqdGV4dCsrID0gKmZtdCsrOwotICAgICAgICAgICAgLS1tYXhsZW47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKnRleHQgPSAnXDAnOwotCi0gICAgcmV0dXJuICh0ZXh0IC0gdGV4dHN0YXJ0KTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvU0RMX3N5c3RocmVhZC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvU0RMX3N5c3RocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk1NDVjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL1NETF9zeXN0aHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBUaGVzZSBhcmUgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHBvcnQgb2YgU0RMICovCi0KLSNpZm5kZWYgX1NETF9zeXN0aHJlYWRfaAotI2RlZmluZSBfU0RMX3N5c3RocmVhZF9oCi0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0KLS8qIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHRocmVhZCwgcGFzc2luZyBhcmdzIHRvIFNETF9SdW5UaHJlYWQoKSwKLSAgIHNhdmVzIGEgc3lzdGVtLWRlcGVuZGVudCB0aHJlYWQgaWQgaW4gdGhyZWFkLT5pZCwgYW5kIHJldHVybnMgMAotICAgb24gc3VjY2Vzcy4KLSovCi0jaWZkZWYgU0RMX1BBU1NFRF9CRUdJTlRIUkVBRF9FTkRUSFJFQUQKLWV4dGVybiBpbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzLCBwZm5TRExfQ3VycmVudEJlZ2luVGhyZWFkIHBmbkJlZ2luVGhyZWFkLCBwZm5TRExfQ3VycmVudEVuZFRocmVhZCBwZm5FbmRUaHJlYWQpOwotI2Vsc2UKLWV4dGVybiBpbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzKTsKLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiB0aGUgY2hpbGQgdGhyZWFkICovCi1leHRlcm4gdm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaCBhbmQgZnJlZXMgYW55IGRhdGEKLSAgIGFsbG9jYXRlZCBieSBTRExfU1lTX0NyZWF0ZVRocmVhZCgpCi0gKi8KLWV4dGVybiB2b2lkIFNETF9TWVNfV2FpdFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGtpbGxzIHRoZSB0aHJlYWQgYW5kIHJldHVybnMgKi8KLWV4dGVybiB2b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpOwotCi0jZW5kaWYgLyogX1NETF9zeXN0aHJlYWRfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvU0RMX3RocmVhZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvU0RMX3RocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWIwN2JiLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL1NETF90aHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogU3lzdGVtIGluZGVwZW5kZW50IHRocmVhZCBtYW5hZ2VtZW50IHJvdXRpbmVzIGZvciBTREwgKi8KLQotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICJTRExfdGhyZWFkX2MuaCIKLSNpbmNsdWRlICJTRExfc3lzdGhyZWFkLmgiCi0KLSNkZWZpbmUgQVJSQVlfQ0hVTktTSVpFCTMyCi0vKiBUaGUgYXJyYXkgb2YgdGhyZWFkcyBjdXJyZW50bHkgYWN0aXZlIGluIHRoZSBhcHBsaWNhdGlvbgotICAgKGV4Y2VwdCB0aGUgbWFpbiB0aHJlYWQpCi0gICBUaGUgbWFuaXB1bGF0aW9uIG9mIGFuIGFycmF5IGhlcmUgaXMgc2FmZXIgdGhhbiB1c2luZyBhIGxpbmtlZCBsaXN0LgotKi8KLXN0YXRpYyBpbnQgU0RMX21heHRocmVhZHMgPSAwOwotc3RhdGljIGludCBTRExfbnVtdGhyZWFkcyA9IDA7Ci1zdGF0aWMgU0RMX1RocmVhZCAqKlNETF9UaHJlYWRzID0gTlVMTDsKLXN0YXRpYyBTRExfbXV0ZXggKnRocmVhZF9sb2NrID0gTlVMTDsKLQotaW50IFNETF9UaHJlYWRzSW5pdCh2b2lkKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSAwOwotCXRocmVhZF9sb2NrID0gU0RMX0NyZWF0ZU11dGV4KCk7Ci0JaWYgKCB0aHJlYWRfbG9jayA9PSBOVUxMICkgewotCQlyZXR2YWwgPSAtMTsKLQl9Ci0JcmV0dXJuKHJldHZhbCk7Ci19Ci0KLS8qIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4uLgotICAgSWYgdGhpcyBpcyBjYWxsZWQgYnkgU0RMX1F1aXQoKSwgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQKLSAgIGNsZWFuIHVwIHRocmVhZHMgaGVyZS4gIElmIGFueSB0aHJlYWRzIGFyZSBzdGlsbCBydW5uaW5nIGFmdGVyIHRoaXMgY2FsbCwKLSAgIHRoZXkgd2lsbCBubyBsb25nZXIgaGF2ZSBhY2Nlc3MgdG8gYW55IHBlci10aHJlYWQgZGF0YS4KLSAqLwotdm9pZCBTRExfVGhyZWFkc1F1aXQodm9pZCkKLXsKLQlTRExfbXV0ZXggKm11dGV4OwotCi0JbXV0ZXggPSB0aHJlYWRfbG9jazsKLQl0aHJlYWRfbG9jayA9IE5VTEw7Ci0JaWYgKCBtdXRleCAhPSBOVUxMICkgewotCQlTRExfRGVzdHJveU11dGV4KG11dGV4KTsKLQl9Ci19Ci0KLS8qIFJvdXRpbmVzIGZvciBtYW5pcHVsYXRpbmcgdGhlIHRocmVhZCBsaXN0ICovCi1zdGF0aWMgdm9pZCBTRExfQWRkVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQkvKiBXQVJOSU5HOgotCSAgIElmIHRoZSB2ZXJ5IGZpcnN0IHRocmVhZHMgYXJlIGNyZWF0ZWQgc2ltdWx0YW5lb3VzbHksIHRoZW4KLQkgICB0aGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIGNhdXNpbmcgbWVtb3J5IGNvcnJ1cHRpb24uCi0JICAgSW4gcHJhY3RpY2UsIHRoaXMgaXNuJ3QgYSBwcm9ibGVtIGJlY2F1c2UgYnkgZGVmaW5pdGlvbiB0aGVyZQotCSAgIGlzIG9ubHkgb25lIHRocmVhZCBydW5uaW5nIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkLgotCSovCi0JaWYgKCAhdGhyZWFkX2xvY2sgKSB7Ci0JCWlmICggU0RMX1RocmVhZHNJbml0KCkgPCAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCVNETF9tdXRleFAodGhyZWFkX2xvY2spOwotCi0JLyogRXhwYW5kIHRoZSBsaXN0IG9mIHRocmVhZHMsIGlmIG5lY2Vzc2FyeSAqLwotI2lmZGVmIERFQlVHX1RIUkVBRFMKLQlwcmludGYoIkFkZGluZyB0aHJlYWQgKCVkIGFscmVhZHkgLSAlZCBtYXgpXG4iLAotCQkJU0RMX251bXRocmVhZHMsIFNETF9tYXh0aHJlYWRzKTsKLSNlbmRpZgotCWlmICggU0RMX251bXRocmVhZHMgPT0gU0RMX21heHRocmVhZHMgKSB7Ci0JCVNETF9UaHJlYWQgKip0aHJlYWRzOwotCQl0aHJlYWRzID0gKFNETF9UaHJlYWQgKiopU0RMX3JlYWxsb2MoU0RMX1RocmVhZHMsCi0JCQkoU0RMX21heHRocmVhZHMrQVJSQVlfQ0hVTktTSVpFKSooc2l6ZW9mICp0aHJlYWRzKSk7Ci0JCWlmICggdGhyZWFkcyA9PSBOVUxMICkgewotCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJU0RMX21heHRocmVhZHMgKz0gQVJSQVlfQ0hVTktTSVpFOwotCQlTRExfVGhyZWFkcyA9IHRocmVhZHM7Ci0JfQotCVNETF9UaHJlYWRzW1NETF9udW10aHJlYWRzKytdID0gdGhyZWFkOwotZG9uZToKLQlTRExfbXV0ZXhWKHRocmVhZF9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgU0RMX0RlbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoICF0aHJlYWRfbG9jayApIHsKLQkJcmV0dXJuOwotCX0KLQlTRExfbXV0ZXhQKHRocmVhZF9sb2NrKTsKLQlmb3IgKCBpPTA7IGk8U0RMX251bXRocmVhZHM7ICsraSApIHsKLQkJaWYgKCB0aHJlYWQgPT0gU0RMX1RocmVhZHNbaV0gKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIGkgPCBTRExfbnVtdGhyZWFkcyApIHsKLQkJaWYgKCAtLVNETF9udW10aHJlYWRzID4gMCApIHsKLQkJCXdoaWxlICggaSA8IFNETF9udW10aHJlYWRzICkgewotCQkJCVNETF9UaHJlYWRzW2ldID0gU0RMX1RocmVhZHNbaSsxXTsKLQkJCQkrK2k7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTRExfbWF4dGhyZWFkcyA9IDA7Ci0JCQlTRExfZnJlZShTRExfVGhyZWFkcyk7Ci0JCQlTRExfVGhyZWFkcyA9IE5VTEw7Ci0JCX0KLSNpZmRlZiBERUJVR19USFJFQURTCi0JCXByaW50ZigiRGVsZXRpbmcgdGhyZWFkICglZCBsZWZ0IC0gJWQgbWF4KVxuIiwKLQkJCQlTRExfbnVtdGhyZWFkcywgU0RMX21heHRocmVhZHMpOwotI2VuZGlmCi0JfQotCVNETF9tdXRleFYodGhyZWFkX2xvY2spOwotCi0JaWYgKCBTRExfVGhyZWFkcyA9PSBOVUxMICkgewotCQlTRExfVGhyZWFkc1F1aXQoKTsKLQl9Ci19Ci0KLS8qIFRoZSBkZWZhdWx0IChub24tdGhyZWFkLXNhZmUpIGdsb2JhbCBlcnJvciB2YXJpYWJsZSAqLwotc3RhdGljIFNETF9lcnJvciBTRExfZ2xvYmFsX2Vycm9yOwotCi0vKiBSb3V0aW5lIHRvIGdldCB0aGUgdGhyZWFkLXNwZWNpZmljIGVycm9yIHZhcmlhYmxlICovCi1TRExfZXJyb3IgKlNETF9HZXRFcnJCdWYodm9pZCkKLXsKLQlTRExfZXJyb3IgKmVycmJ1ZjsKLQotCWVycmJ1ZiA9ICZTRExfZ2xvYmFsX2Vycm9yOwotCWlmICggU0RMX1RocmVhZHMgKSB7Ci0JCWludCBpOwotCQlVaW50MzIgdGhpc190aHJlYWQ7Ci0KLQkJdGhpc190aHJlYWQgPSBTRExfVGhyZWFkSUQoKTsKLQkJU0RMX211dGV4UCh0aHJlYWRfbG9jayk7Ci0JCWZvciAoIGk9MDsgaTxTRExfbnVtdGhyZWFkczsgKytpICkgewotCQkJaWYgKCB0aGlzX3RocmVhZCA9PSBTRExfVGhyZWFkc1tpXS0+dGhyZWFkaWQgKSB7Ci0JCQkJZXJyYnVmID0gJlNETF9UaHJlYWRzW2ldLT5lcnJidWY7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJU0RMX211dGV4Vih0aHJlYWRfbG9jayk7Ci0JfQotCXJldHVybihlcnJidWYpOwotfQotCi0KLS8qIEFyZ3VtZW50cyBhbmQgY2FsbGJhY2sgdG8gc2V0dXAgYW5kIHJ1biB0aGUgdXNlciB0aHJlYWQgZnVuY3Rpb24gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgKFNETENBTEwgKmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqZGF0YTsKLQlTRExfVGhyZWFkICppbmZvOwotCVNETF9zZW0gKndhaXQ7Ci19IHRocmVhZF9hcmdzOwotCi12b2lkIFNETF9SdW5UaHJlYWQodm9pZCAqZGF0YSkKLXsKLQl0aHJlYWRfYXJncyAqYXJnczsKLQlpbnQgKFNETENBTEwgKnVzZXJmdW5jKSh2b2lkICopOwotCXZvaWQgKnVzZXJkYXRhOwotCWludCAqc3RhdHVzbG9jOwotCi0JLyogUGVyZm9ybSBhbnkgc3lzdGVtLWRlcGVuZGVudCBzZXR1cAotCSAgIC0gdGhpcyBmdW5jdGlvbiBjYW5ub3QgZmFpbCwgYW5kIGNhbm5vdCB1c2UgU0RMX1NldEVycm9yKCkKLQkgKi8KLQlTRExfU1lTX1NldHVwVGhyZWFkKCk7Ci0KLQkvKiBHZXQgdGhlIHRocmVhZCBpZCAqLwotCWFyZ3MgPSAodGhyZWFkX2FyZ3MgKilkYXRhOwotCWFyZ3MtPmluZm8tPnRocmVhZGlkID0gU0RMX1RocmVhZElEKCk7Ci0KLQkvKiBGaWd1cmUgb3V0IHdoYXQgZnVuY3Rpb24gdG8gcnVuICovCi0JdXNlcmZ1bmMgPSBhcmdzLT5mdW5jOwotCXVzZXJkYXRhID0gYXJncy0+ZGF0YTsKLQlzdGF0dXNsb2MgPSAmYXJncy0+aW5mby0+c3RhdHVzOwotCi0JLyogV2FrZSB1cCB0aGUgcGFyZW50IHRocmVhZCAqLwotCVNETF9TZW1Qb3N0KGFyZ3MtPndhaXQpOwotCi0JLyogUnVuIHRoZSBmdW5jdGlvbiAqLwotCSpzdGF0dXNsb2MgPSB1c2VyZnVuYyh1c2VyZGF0YSk7Ci19Ci0KLSNpZmRlZiBTRExfUEFTU0VEX0JFR0lOVEhSRUFEX0VORFRIUkVBRAotI3VuZGVmIFNETF9DcmVhdGVUaHJlYWQKLURFQ0xTUEVDIFNETF9UaHJlYWQgKiBTRExDQUxMIFNETF9DcmVhdGVUaHJlYWQoaW50IChTRExDQUxMICpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSwgcGZuU0RMX0N1cnJlbnRCZWdpblRocmVhZCBwZm5CZWdpblRocmVhZCwgcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuRW5kVGhyZWFkKQotI2Vsc2UKLURFQ0xTUEVDIFNETF9UaHJlYWQgKiBTRExDQUxMIFNETF9DcmVhdGVUaHJlYWQoaW50IChTRExDQUxMICpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSkKLSNlbmRpZgotewotCVNETF9UaHJlYWQgKnRocmVhZDsKLQl0aHJlYWRfYXJncyAqYXJnczsKLQlpbnQgcmV0OwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdGhyZWFkIGluZm8gc3RydWN0dXJlICovCi0JdGhyZWFkID0gKFNETF9UaHJlYWQgKilTRExfbWFsbG9jKHNpemVvZigqdGhyZWFkKSk7Ci0JaWYgKCB0aHJlYWQgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JU0RMX21lbXNldCh0aHJlYWQsIDAsIChzaXplb2YgKnRocmVhZCkpOwotCXRocmVhZC0+c3RhdHVzID0gLTE7Ci0KLQkvKiBTZXQgdXAgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIHRocmVhZCAqLwotCWFyZ3MgPSAodGhyZWFkX2FyZ3MgKilTRExfbWFsbG9jKHNpemVvZigqYXJncykpOwotCWlmICggYXJncyA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJU0RMX2ZyZWUodGhyZWFkKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlhcmdzLT5mdW5jID0gZm47Ci0JYXJncy0+ZGF0YSA9IGRhdGE7Ci0JYXJncy0+aW5mbyA9IHRocmVhZDsKLQlhcmdzLT53YWl0ID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSgwKTsKLQlpZiAoIGFyZ3MtPndhaXQgPT0gTlVMTCApIHsKLQkJU0RMX2ZyZWUodGhyZWFkKTsKLQkJU0RMX2ZyZWUoYXJncyk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBBZGQgdGhlIHRocmVhZCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGhyZWFkcyAqLwotCVNETF9BZGRUaHJlYWQodGhyZWFkKTsKLQotCS8qIENyZWF0ZSB0aGUgdGhyZWFkIGFuZCBnbyEgKi8KLSNpZmRlZiBTRExfUEFTU0VEX0JFR0lOVEhSRUFEX0VORFRIUkVBRAotCXJldCA9IFNETF9TWVNfQ3JlYXRlVGhyZWFkKHRocmVhZCwgYXJncywgcGZuQmVnaW5UaHJlYWQsIHBmbkVuZFRocmVhZCk7Ci0jZWxzZQotCXJldCA9IFNETF9TWVNfQ3JlYXRlVGhyZWFkKHRocmVhZCwgYXJncyk7Ci0jZW5kaWYKLQlpZiAoIHJldCA+PSAwICkgewotCQkvKiBXYWl0IGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uIHRvIHVzZSBhcmd1bWVudHMgKi8KLQkJU0RMX1NlbVdhaXQoYXJncy0+d2FpdCk7Ci0JfSBlbHNlIHsKLQkJLyogT29wcywgZmFpbGVkLiAgR290dGEgZnJlZSBldmVyeXRoaW5nICovCi0JCVNETF9EZWxUaHJlYWQodGhyZWFkKTsKLQkJU0RMX2ZyZWUodGhyZWFkKTsKLQkJdGhyZWFkID0gTlVMTDsKLQl9Ci0JU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoYXJncy0+d2FpdCk7Ci0JU0RMX2ZyZWUoYXJncyk7Ci0KLQkvKiBFdmVyeXRoaW5nIGlzIHJ1bm5pbmcgbm93ICovCi0JcmV0dXJuKHRocmVhZCk7Ci19Ci0KLXZvaWQgU0RMX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCBpbnQgKnN0YXR1cykKLXsKLQlpZiAoIHRocmVhZCApIHsKLQkJU0RMX1NZU19XYWl0VGhyZWFkKHRocmVhZCk7Ci0JCWlmICggc3RhdHVzICkgewotCQkJKnN0YXR1cyA9IHRocmVhZC0+c3RhdHVzOwotCQl9Ci0JCVNETF9EZWxUaHJlYWQodGhyZWFkKTsKLQkJU0RMX2ZyZWUodGhyZWFkKTsKLQl9Ci19Ci0KLVVpbnQzMiBTRExfR2V0VGhyZWFkSUQoU0RMX1RocmVhZCAqdGhyZWFkKQotewotCVVpbnQzMiBpZDsKLQotCWlmICggdGhyZWFkICkgewotCQlpZCA9IHRocmVhZC0+dGhyZWFkaWQ7Ci0JfSBlbHNlIHsKLQkJaWQgPSBTRExfVGhyZWFkSUQoKTsKLQl9Ci0JcmV0dXJuKGlkKTsKLX0KLQotdm9pZCBTRExfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0JaWYgKCB0aHJlYWQgKSB7Ci0JCVNETF9TWVNfS2lsbFRocmVhZCh0aHJlYWQpOwotCQlTRExfV2FpdFRocmVhZCh0aHJlYWQsIE5VTEwpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvU0RMX3RocmVhZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9TRExfdGhyZWFkX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyZDhhMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9TRExfdGhyZWFkX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfdGhyZWFkX2NfaAotI2RlZmluZSBfU0RMX3RocmVhZF9jX2gKLQotLyogTmVlZCB0aGUgZGVmaW5pdGlvbnMgb2YgU1lTX1RocmVhZEhhbmRsZSAqLwotI2lmIFNETF9USFJFQURTX0RJU0FCTEVECi0jaW5jbHVkZSAiZ2VuZXJpYy9TRExfc3lzdGhyZWFkX2MuaCIKLSNlbGlmIFNETF9USFJFQURfQkVPUwotI2luY2x1ZGUgImJlb3MvU0RMX3N5c3RocmVhZF9jLmgiCi0jZWxpZiBTRExfVEhSRUFEX0RDCi0jaW5jbHVkZSAiZGMvU0RMX3N5c3RocmVhZF9jLmgiCi0jZWxpZiBTRExfVEhSRUFEX09TMgotI2luY2x1ZGUgIm9zMi9TRExfc3lzdGhyZWFkX2MuaCIKLSNlbGlmIFNETF9USFJFQURfUFRICi0jaW5jbHVkZSAicHRoL1NETF9zeXN0aHJlYWRfYy5oIgotI2VsaWYgU0RMX1RIUkVBRF9QVEhSRUFECi0jaW5jbHVkZSAicHRocmVhZC9TRExfc3lzdGhyZWFkX2MuaCIKLSNlbGlmIFNETF9USFJFQURfU1BST0MKLSNpbmNsdWRlICJpcml4L1NETF9zeXN0aHJlYWRfYy5oIgotI2VsaWYgU0RMX1RIUkVBRF9XSU4zMgotI2luY2x1ZGUgIndpbjMyL1NETF9zeXN0aHJlYWRfYy5oIgotI2VsaWYgU0RMX1RIUkVBRF9TWU1CSUFOCi0jaW5jbHVkZSAic3ltYmlhbi9TRExfc3lzdGhyZWFkX2MuaCIKLSNlbHNlCi0jZXJyb3IgTmVlZCB0aHJlYWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgcGxhdGZvcm0KLSNpbmNsdWRlICJnZW5lcmljL1NETF9zeXN0aHJlYWRfYy5oIgotI2VuZGlmCi0jaW5jbHVkZSAiLi4vU0RMX2Vycm9yX2MuaCIKLQotLyogVGhpcyBpcyB0aGUgc3lzdGVtLWluZGVwZW5kZW50IHRocmVhZCBpbmZvIHN0cnVjdHVyZSAqLwotc3RydWN0IFNETF9UaHJlYWQgewotCVVpbnQzMiB0aHJlYWRpZDsKLQlTWVNfVGhyZWFkSGFuZGxlIGhhbmRsZTsKLQlpbnQgc3RhdHVzOwotCVNETF9lcnJvciBlcnJidWY7Ci0Jdm9pZCAqZGF0YTsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIGNhbGxlZCB0byBydW4gYSB0aHJlYWQgKi8KLWV4dGVybiB2b2lkIFNETF9SdW5UaHJlYWQodm9pZCAqZGF0YSk7Ci0KLSNlbmRpZiAvKiBfU0RMX3RocmVhZF9jX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2FtaWdhb3MvU0RMX3N5c3NlbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvYW1pZ2Fvcy9TRExfc3lzc2VtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMWEyMTMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvYW1pZ2Fvcy9TRExfc3lzc2VtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFuIGltcGxlbWVudGF0aW9uIG9mIHNlbWFwaG9yZXMgdXNpbmcgbXV0ZXhlcyBhbmQgY29uZGl0aW9uIHZhcmlhYmxlcyAqLwotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIlNETF9zeXN0aHJlYWRfYy5oIgotCi0KLXN0cnVjdCBTRExfc2VtYXBob3JlCi17Ci0Jc3RydWN0IFNpZ25hbFNlbWFwaG9yZSBTZW07Ci19OwotCi0jdW5kZWYgRAotCi0jZGVmaW5lIEQoeCkKLQotU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKLXsKLQlTRExfc2VtICpzZW07Ci0KLQlzZW0gPSAoU0RMX3NlbSAqKVNETF9tYWxsb2Moc2l6ZW9mKCpzZW0pKTsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JRChidWcoIkNyZWF0aW5nIHNlbWFwaG9yZSAlbHguLi5cbiIsc2VtKSk7Ci0KLQlTRExfbWVtc2V0KHNlbSwwLHNpemVvZigqc2VtKSk7Ci0KLQlJbml0U2VtYXBob3JlKCZzZW0tPlNlbSk7Ci0KLQlyZXR1cm4oc2VtKTsKLX0KLQotdm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCi17Ci0JRChidWcoIkRlc3Ryb3lpbmcgc2VtYXBob3JlICVseC4uLlxuIixzZW0pKTsKLQotCWlmICggc2VtICkgewotLy8gQ29uZGl6aW9uaSBwZXIgbGliZXJhcmUgaSB0YXNrIGluIGF0dGVzYT8KLQkJU0RMX2ZyZWUoc2VtKTsKLQl9Ci19Ci0KLWludCBTRExfU2VtVHJ5V2FpdChTRExfc2VtICpzZW0pCi17Ci0JaWYgKCAhIHNlbSApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JRChidWcoIlRyeVdhaXQgc2VtYXBob3JlLi4uJWx4XG4iLHNlbSkpOwotCi0JT2J0YWluU2VtYXBob3JlKCZzZW0tPlNlbSk7Ci0vLwlSZWxlYXNlU2VtYXBob3JlKCZzZW0tPlNlbSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IFNETF9TZW1XYWl0VGltZW91dChTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0KQotewotCWludCByZXR2YWw7Ci0KLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCUQoYnVnKCJXYWl0VGltZW91dCAoJWxkKSBzZW1hcGhvcmUuLi4lbHhcbiIsdGltZW91dCxzZW0pKTsKLQotCS8qIEEgdGltZW91dCBvZiAwIGlzIGFuIGVhc3kgY2FzZSAqLwotCWlmICggdGltZW91dCA9PSAwICkgewotCQlPYnRhaW5TZW1hcGhvcmUoJnNlbS0+U2VtKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmKCEocmV0dmFsPUF0dGVtcHRTZW1hcGhvcmUoJnNlbS0+U2VtKSkpCi0JewotCQlTRExfRGVsYXkodGltZW91dCk7Ci0JCXJldHZhbD1BdHRlbXB0U2VtYXBob3JlKCZzZW0tPlNlbSk7Ci0JfQotCi0JaWYocmV0dmFsPT1UUlVFKQotCXsKLS8vCQlSZWxlYXNlU2VtYXBob3JlKCZzZW0tPlNlbSk7Ci0JCXJldHZhbD0xOwotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCi17Ci0JT2J0YWluU2VtYXBob3JlKCZzZW0tPlNlbSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLVVpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQotewotCVVpbnQzMiB2YWx1ZTsKLQotCXZhbHVlID0gMDsKLQlpZiAoIHNlbSApIHsKLQkJI2lmZGVmIFNUT1JNQzRfV09TCi0JCXZhbHVlID0gc2VtLT5TZW0uc3NwcGNfU1Muc3NfTmVzdENvdW50OwotCQkjZWxzZQotCQl2YWx1ZSA9IHNlbS0+U2VtLnNzX05lc3RDb3VudDsKLQkJI2VuZGlmCi0JfQotCXJldHVybiB2YWx1ZTsKLX0KLQotaW50IFNETF9TZW1Qb3N0KFNETF9zZW0gKnNlbSkKLXsKLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JRChidWcoIlNlbVBvc3Qgc2VtYXBob3JlLi4uJWx4XG4iLHNlbSkpOwotCi0JUmVsZWFzZVNlbWFwaG9yZSgmc2VtLT5TZW0pOwotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9hbWlnYW9zL1NETF9zeXN0aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2FtaWdhb3MvU0RMX3N5c3RocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmI0MmU3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2FtaWdhb3MvU0RMX3N5c3RocmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBCZU9TIHRocmVhZCBtYW5hZ2VtZW50IHJvdXRpbmVzIGZvciBTREwgKi8KLQotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICIuLi9TRExfdGhyZWFkX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdGhyZWFkLmgiCi0jaW5jbHVkZSAibXlkZWJ1Zy5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50ICgqZnVuYykodm9pZCAqKTsKLQl2b2lkICpkYXRhOwotCVNETF9UaHJlYWQgKmluZm87Ci0Jc3RydWN0IFRhc2sgKndhaXQ7Ci19IHRocmVhZF9hcmdzOwotCi0jaWZuZGVmIE1PUlBIT1MKLQotI2lmIGRlZmluZWQoX19TQVNDKSAmJiAhZGVmaW5lZChfX1BQQ19fKSAKLV9fc2F2ZWRzIF9fYXNtIFVpbnQzMiBSdW5UaHJlYWQocmVnaXN0ZXIgX19hMCBjaGFyICphcmdzICkKLSNlbGlmIGRlZmluZWQoX19QUENfXykKLVVpbnQzMiBSdW5UaHJlYWQoY2hhciAqYXJncykKLSNlbHNlCi1VaW50MzIgX19zYXZlZHMgUnVuVGhyZWFkKGNoYXIgKmFyZ3MgX19hc20oImEwIikgKQotI2VuZGlmCi17Ci0JI2lmZGVmIFNUT1JNQzRfV09TCi0JdGhyZWFkX2FyZ3MgKmRhdGE9KHRocmVhZF9hcmdzICopYXJnczsKLQkjZWxzZQotCXRocmVhZF9hcmdzICpkYXRhPSh0aHJlYWRfYXJncyAqKWF0b2woYXJncyk7Ci0JI2VuZGlmCi0KLQlzdHJ1Y3QgVGFzayAqRmF0aGVyOwotCi0JRChidWcoIlJlY2VpdmVkIGRhdGE6ICVseFxuIixkYXRhKSk7Ci0JRmF0aGVyPWRhdGEtPndhaXQ7Ci0KLQlTRExfUnVuVGhyZWFkKGRhdGEpOwotCi0JU2lnbmFsKEZhdGhlcixTSUdCUkVBS0ZfQ1RSTF9GKTsKLQlEKGJ1ZygiVGhyZWFkIHdpdGggZGF0YSAlbHggZW5kZWRcbiIsZGF0YSkpOwotCXJldHVybigwKTsKLX0KLQotI2Vsc2UKLQotI2luY2x1ZGUgPGVtdWwvZW11bGludGVyZmFjZS5oPgotCi1VaW50MzIgUnVuVGhlVGhyZWFkKHZvaWQpCi17Ci0JdGhyZWFkX2FyZ3MgKmRhdGE9KHRocmVhZF9hcmdzICopYXRvbCgoY2hhciAqKVJFR19BMCk7Ci0Jc3RydWN0IFRhc2sgKkZhdGhlcjsKLQotCUQoYnVnKCJSZWNlaXZlZCBkYXRhOiAlbHhcbiIsZGF0YSkpOwotCUZhdGhlcj1kYXRhLT53YWl0OwotCi0JU0RMX1J1blRocmVhZChkYXRhKTsKLQotCVNpZ25hbChGYXRoZXIsU0lHQlJFQUtGX0NUUkxfRik7Ci0JRChidWcoIlRocmVhZCB3aXRoIGRhdGEgJWx4IGVuZGVkXG4iLGRhdGEpKTsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0cnVjdCBFbXVsTGliRW50cnkgUnVuVGhyZWFkU3RydWN0PQotewotCVRSQVBfTElCLAotCTAsCi0JKFVMT05HKVJ1blRoZVRocmVhZAotfTsKLQotdm9pZCAqUnVuVGhyZWFkPSZSdW5UaHJlYWRTdHJ1Y3Q7Ci0jZW5kaWYKLQotCi1pbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzKQotewotCS8qIENyZWF0ZSB0aGUgdGhyZWFkIGFuZCBnbyEgKi8KLQljaGFyIGJ1ZmZlclsyMF07Ci0KLQlEKGJ1ZygiU2VuZGluZyAlbHggdG8gdGhlIG5ldyB0aHJlYWQuLi5cbiIsYXJncykpOwotCi0JaWYoYXJncykKLQkJU0RMX3NucHJpbnRmKGJ1ZmZlciwgU0RMX2FycmF5c2l6ZShidWZmZXIpLCIlbGQiLGFyZ3MpOwotCi0JI2lmZGVmIFNUT1JNQzRfV09TCi0JdGhyZWFkLT5oYW5kbGU9Q3JlYXRlVGFza1BQQ1RhZ3MoVEFTS0FUVFJfQ09ERSwJUnVuVGhyZWFkLAotCQkJCQlUQVNLQVRUUl9OQU1FLAkiU0RMIHN1YnRhc2siLAotCQkJCQlUQVNLQVRUUl9TVEFDS1NJWkUsIDEwMDAwMCwKLQkJCQkJKGFyZ3MgPyBUQVNLQVRUUl9SMyA6IFRBR19JR05PUkUpLCBhcmdzLAotCQkJCQlUQVNLQVRUUl9JTkhFUklUUjIsIFRSVUUsCi0JCQkJCVRBR19ET05FKTsKLQkjZWxzZQotCXRocmVhZC0+aGFuZGxlPShzdHJ1Y3QgVGFzayAqKUNyZWF0ZU5ld1Byb2NUYWdzKE5QX091dHB1dCxPdXRwdXQoKSwKLQkJCQkJTlBfTmFtZSwoVUxPTkcpIlNETCBzdWJ0YXNrIiwKLQkJCQkJTlBfQ2xvc2VPdXRwdXQsIEZBTFNFLAotCQkJCQlOUF9TdGFja1NpemUsMjAwMDAsCi0JCQkJCU5QX0VudHJ5LChVTE9ORylSdW5UaHJlYWQsCi0JCQkJCWFyZ3MgPyBOUF9Bcmd1bWVudHMgOiBUQUdfSUdOT1JFLChVTE9ORylidWZmZXIsCi0JCQkJCVRBR19ET05FKTsKLQkjZW5kaWYKLQotCWlmKCF0aHJlYWQtPmhhbmRsZSkKLQl7Ci0JCVNETF9TZXRFcnJvcigiTm90IGVub3VnaCByZXNvdXJjZXMgdG8gY3JlYXRlIHRocmVhZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCi17Ci19Ci0KLVVpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKLXsKLQlyZXR1cm4oKFVpbnQzMilGaW5kVGFzayhOVUxMKSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlTZXRTaWduYWwoMEwsU0lHQlJFQUtGX0NUUkxfRnxTSUdCUkVBS0ZfQ1RSTF9DKTsKLQlXYWl0KFNJR0JSRUFLRl9DVFJMX0Z8U0lHQlJFQUtGX0NUUkxfQyk7Ci19Ci0KLXZvaWQgU0RMX1NZU19LaWxsVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlTaWduYWwoKHN0cnVjdCBUYXNrICopdGhyZWFkLT5oYW5kbGUsU0lHQlJFQUtGX0NUUkxfQyk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9hbWlnYW9zL1NETF9zeXN0aHJlYWRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvYW1pZ2Fvcy9TRExfc3lzdGhyZWFkX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiYTNjOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9hbWlnYW9zL1NETF9zeXN0aHJlYWRfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxleGVjL2V4ZWMuaD4KLSNpbmNsdWRlIDxkb3MvZG9zLmg+Ci0jaW5jbHVkZSA8ZG9zL2Rvc3RhZ3MuaD4KLSNpZiBkZWZpbmVkIChfX1NBU0MpIHx8IGRlZmluZWQoU1RPUk1DNF9XT1MpCi0jaW5jbHVkZSA8cHJvdG8vZG9zLmg+Ci0jaW5jbHVkZSA8cHJvdG8vZXhlYy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxpbmxpbmUvZG9zLmg+Ci0jaW5jbHVkZSA8aW5saW5lL2V4ZWMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibXlkZWJ1Zy5oIgotCi1leHRlcm4gc3RydWN0IEV4ZWNCYXNlICpTeXNCYXNlOwotZXh0ZXJuIHN0cnVjdCBEb3NMaWJyYXJ5ICpET1NCYXNlOwotCi0jaWZkZWYgU1RPUk1DNF9XT1MKLSNpbmNsdWRlIDxwcm90by9wb3dlcnBjLmg+Ci0KLS8qIHVzZSBwb3dlcnBjLmxpYnJhcnkgZnVuY3Rpb25zIGluc3RlYWQgb2cgZXhlYyAqLwotI2RlZmluZSBTWVNfVGhyZWFkSGFuZGxlIHN0cnVjdCBUYXNrUFBDICoKLSNkZWZpbmUgU2lnbmFsIFNpZ25hbFBQQwotI2RlZmluZSBXYWl0IFdhaXRQUEMKLSNkZWZpbmUgVGFzayBUYXNrUFBDCi0jZGVmaW5lIEZpbmRUYXNrIEZpbmRUYXNrUFBDCi0jZGVmaW5lIFNldFNpZ25hbCBTZXRTaWduYWxQUEMKLQotI2RlZmluZSBJbml0U2VtYXBob3JlIEluaXRTZW1hcGhvcmVQUEMKLSNkZWZpbmUgT2J0YWluU2VtYXBob3JlIE9idGFpblNlbWFwaG9yZVBQQwotI2RlZmluZSBBdHRlbXB0U2VtYXBob3JlIEF0dGVtcHRTZW1hcGhvcmVQUEMKLSNkZWZpbmUgUmVsZWFzZVNlbWFwaG9yZSBSZWxlYXNlU2VtYXBob3JlUFBDCi0jZGVmaW5lIFNpZ25hbFNlbWFwaG9yZSBTaWduYWxTZW1hcGhvcmVQUEMKLQotI2Vsc2UKLQotI2RlZmluZSBTWVNfVGhyZWFkSGFuZGxlIHN0cnVjdCBUYXNrICoKLSNlbmRpZiAvKlNUT1JNQzRfV09TKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvYW1pZ2Fvcy9TRExfdGhyZWFkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9hbWlnYW9zL1NETF90aHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5OGY0OS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9hbWlnYW9zL1NETF90aHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogU3lzdGVtIGluZGVwZW5kZW50IHRocmVhZCBtYW5hZ2VtZW50IHJvdXRpbmVzIGZvciBTREwgKi8KLQotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICIuLi9TRExfdGhyZWFkX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdGhyZWFkLmgiCi0KLSNkZWZpbmUgQVJSQVlfQ0hVTktTSVpFCTMyCi0vKiBUaGUgYXJyYXkgb2YgdGhyZWFkcyBjdXJyZW50bHkgYWN0aXZlIGluIHRoZSBhcHBsaWNhdGlvbgotICAgKGV4Y2VwdCB0aGUgbWFpbiB0aHJlYWQpCi0gICBUaGUgbWFuaXB1bGF0aW9uIG9mIGFuIGFycmF5IGhlcmUgaXMgc2FmZXIgdGhhbiB1c2luZyBhIGxpbmtlZCBsaXN0LgotKi8KLXN0YXRpYyBpbnQgU0RMX21heHRocmVhZHMgPSAwOwotc3RhdGljIGludCBTRExfbnVtdGhyZWFkcyA9IDA7Ci1zdGF0aWMgU0RMX1RocmVhZCAqKlNETF9UaHJlYWRzID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgU2lnbmFsU2VtYXBob3JlIHRocmVhZF9sb2NrOwotaW50IHRocmVhZF9sb2NrX2NyZWF0ZWQgPSAwOwotCi1pbnQgU0RMX1RocmVhZHNJbml0KHZvaWQpCi17Ci0JSW5pdFNlbWFwaG9yZSgmdGhyZWFkX2xvY2spOwotCXRocmVhZF9sb2NrX2NyZWF0ZWQ9MTsKLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLi4uCi0gICBJZiB0aGlzIGlzIGNhbGxlZCBieSBTRExfUXVpdCgpLCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZAotICAgY2xlYW4gdXAgdGhyZWFkcyBoZXJlLiAgSWYgYW55IHRocmVhZHMgYXJlIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgdGhpcyBjYWxsLAotICAgdGhleSB3aWxsIG5vIGxvbmdlciBoYXZlIGFjY2VzcyB0byBhbnkgcGVyLXRocmVhZCBkYXRhLgotICovCi12b2lkIFNETF9UaHJlYWRzUXVpdCgpCi17Ci0JdGhyZWFkX2xvY2tfY3JlYXRlZD0wOwotfQotCi0vKiBSb3V0aW5lcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSB0aHJlYWQgbGlzdCAqLwotc3RhdGljIHZvaWQgU0RMX0FkZFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0JU0RMX1RocmVhZCAqKnRocmVhZHM7Ci0KLQkvKiBXQVJOSU5HOgotCSAgIElmIHRoZSB2ZXJ5IGZpcnN0IHRocmVhZHMgYXJlIGNyZWF0ZWQgc2ltdWx0YW5lb3VzbHksIHRoZW4KLQkgICB0aGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIGNhdXNpbmcgbWVtb3J5IGNvcnJ1cHRpb24uCi0JICAgSW4gcHJhY3RpY2UsIHRoaXMgaXNuJ3QgYSBwcm9ibGVtIGJlY2F1c2UgYnkgZGVmaW5pdGlvbiB0aGVyZQotCSAgIGlzIG9ubHkgb25lIHRocmVhZCBydW5uaW5nIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkLgotCSovCi0JaWYgKCAhdGhyZWFkX2xvY2tfY3JlYXRlZCApIHsKLQkJaWYgKCBTRExfVGhyZWFkc0luaXQoKSA8IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JT2J0YWluU2VtYXBob3JlKCZ0aHJlYWRfbG9jayk7Ci0KLQkvKiBFeHBhbmQgdGhlIGxpc3Qgb2YgdGhyZWFkcywgaWYgbmVjZXNzYXJ5ICovCi0jaWZkZWYgREVCVUdfVEhSRUFEUwotCXByaW50ZigiQWRkaW5nIHRocmVhZCAoJWQgYWxyZWFkeSAtICVkIG1heClcbiIsCi0JCQlTRExfbnVtdGhyZWFkcywgU0RMX21heHRocmVhZHMpOwotI2VuZGlmCi0JaWYgKCBTRExfbnVtdGhyZWFkcyA9PSBTRExfbWF4dGhyZWFkcyApIHsKLQkJdGhyZWFkcz0oU0RMX1RocmVhZCAqKilTRExfbWFsbG9jKChTRExfbWF4dGhyZWFkcytBUlJBWV9DSFVOS1NJWkUpKgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mICp0aHJlYWRzKSk7Ci0JCWlmICggdGhyZWFkcyA9PSBOVUxMICkgewotCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJU0RMX21lbWNweSh0aHJlYWRzLCBTRExfVGhyZWFkcywgU0RMX251bXRocmVhZHMqKHNpemVvZiAqdGhyZWFkcykpOwotCQlTRExfbWF4dGhyZWFkcyArPSBBUlJBWV9DSFVOS1NJWkU7Ci0JCWlmICggU0RMX1RocmVhZHMgKSB7Ci0JCQlTRExfZnJlZShTRExfVGhyZWFkcyk7Ci0JCX0KLQkJU0RMX1RocmVhZHMgPSB0aHJlYWRzOwotCX0KLQlTRExfVGhyZWFkc1tTRExfbnVtdGhyZWFkcysrXSA9IHRocmVhZDsKLWRvbmU6Ci0JUmVsZWFzZVNlbWFwaG9yZSgmdGhyZWFkX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBTRExfRGVsVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlpbnQgaTsKLQotCWlmICggdGhyZWFkX2xvY2tfY3JlYXRlZCApIHsKLQkJT2J0YWluU2VtYXBob3JlKCZ0aHJlYWRfbG9jayk7Ci0JCWZvciAoIGk9MDsgaTxTRExfbnVtdGhyZWFkczsgKytpICkgewotCQkJaWYgKCB0aHJlYWQgPT0gU0RMX1RocmVhZHNbaV0gKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCBpIDwgU0RMX251bXRocmVhZHMgKSB7Ci0JCQktLVNETF9udW10aHJlYWRzOwotCQkJd2hpbGUgKCBpIDwgU0RMX251bXRocmVhZHMgKSB7Ci0JCQkJU0RMX1RocmVhZHNbaV0gPSBTRExfVGhyZWFkc1tpKzFdOwotCQkJCSsraTsKLQkJCX0KLSNpZmRlZiBERUJVR19USFJFQURTCi0JCQlwcmludGYoIkRlbGV0aW5nIHRocmVhZCAoJWQgbGVmdCAtICVkIG1heClcbiIsCi0JCQkJCVNETF9udW10aHJlYWRzLCBTRExfbWF4dGhyZWFkcyk7Ci0jZW5kaWYKLQkJfQotCQlSZWxlYXNlU2VtYXBob3JlKCZ0aHJlYWRfbG9jayk7Ci0JfQotfQotCi0vKiBUaGUgZGVmYXVsdCAobm9uLXRocmVhZC1zYWZlKSBnbG9iYWwgZXJyb3IgdmFyaWFibGUgKi8KLXN0YXRpYyBTRExfZXJyb3IgU0RMX2dsb2JhbF9lcnJvcjsKLQotLyogUm91dGluZSB0byBnZXQgdGhlIHRocmVhZC1zcGVjaWZpYyBlcnJvciB2YXJpYWJsZSAqLwotU0RMX2Vycm9yICpTRExfR2V0RXJyQnVmKHZvaWQpCi17Ci0JU0RMX2Vycm9yICplcnJidWY7Ci0KLQllcnJidWYgPSAmU0RMX2dsb2JhbF9lcnJvcjsKLQlpZiAoIFNETF9UaHJlYWRzICkgewotCQlpbnQgaTsKLQkJVWludDMyIHRoaXNfdGhyZWFkOwotCi0JCXRoaXNfdGhyZWFkID0gU0RMX1RocmVhZElEKCk7Ci0JCU9idGFpblNlbWFwaG9yZSgmdGhyZWFkX2xvY2spOwotCQlmb3IgKCBpPTA7IGk8U0RMX251bXRocmVhZHM7ICsraSApIHsKLQkJCWlmICggdGhpc190aHJlYWQgPT0gU0RMX1RocmVhZHNbaV0tPnRocmVhZGlkICkgewotCQkJCWVycmJ1ZiA9ICZTRExfVGhyZWFkc1tpXS0+ZXJyYnVmOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCVJlbGVhc2VTZW1hcGhvcmUoJnRocmVhZF9sb2NrKTsKLQl9Ci0JcmV0dXJuKGVycmJ1Zik7Ci19Ci0KLQotLyogQXJndW1lbnRzIGFuZCBjYWxsYmFjayB0byBzZXR1cCBhbmQgcnVuIHRoZSB1c2VyIHRocmVhZCBmdW5jdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWludCAoKmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqZGF0YTsKLQlTRExfVGhyZWFkICppbmZvOwotCXN0cnVjdCBUYXNrICp3YWl0OwotfSB0aHJlYWRfYXJnczsKLQotdm9pZCBTRExfUnVuVGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0JdGhyZWFkX2FyZ3MgKmFyZ3M7Ci0JaW50ICgqdXNlcmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqdXNlcmRhdGE7Ci0JaW50ICpzdGF0dXNsb2M7Ci0KLQkvKiBQZXJmb3JtIGFueSBzeXN0ZW0tZGVwZW5kZW50IHNldHVwCi0JICAgLSB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsLCBhbmQgY2Fubm90IHVzZSBTRExfU2V0RXJyb3IoKQotCSAqLwotCVNETF9TWVNfU2V0dXBUaHJlYWQoKTsKLQotCS8qIEdldCB0aGUgdGhyZWFkIGlkICovCi0JYXJncyA9ICh0aHJlYWRfYXJncyAqKWRhdGE7Ci0JYXJncy0+aW5mby0+dGhyZWFkaWQgPSBTRExfVGhyZWFkSUQoKTsKLQotCS8qIEZpZ3VyZSBvdXQgd2hhdCBmdW5jdGlvbiB0byBydW4gKi8KLQl1c2VyZnVuYyA9IGFyZ3MtPmZ1bmM7Ci0JdXNlcmRhdGEgPSBhcmdzLT5kYXRhOwotCXN0YXR1c2xvYyA9ICZhcmdzLT5pbmZvLT5zdGF0dXM7Ci0KLQkvKiBXYWtlIHVwIHRoZSBwYXJlbnQgdGhyZWFkICovCi0JU2lnbmFsKGFyZ3MtPndhaXQsU0lHQlJFQUtGX0NUUkxfRSk7Ci0KLQkvKiBSdW4gdGhlIGZ1bmN0aW9uICovCi0JKnN0YXR1c2xvYyA9IHVzZXJmdW5jKHVzZXJkYXRhKTsKLX0KLQotU0RMX1RocmVhZCAqU0RMX0NyZWF0ZVRocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSkKLXsKLQlTRExfVGhyZWFkICp0aHJlYWQ7Ci0JdGhyZWFkX2FyZ3MgKmFyZ3M7Ci0JaW50IHJldDsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHRocmVhZCBpbmZvIHN0cnVjdHVyZSAqLwotCXRocmVhZCA9IChTRExfVGhyZWFkICopU0RMX21hbGxvYyhzaXplb2YoKnRocmVhZCkpOwotCWlmICggdGhyZWFkID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCVNETF9tZW1zZXQodGhyZWFkLCAwLCAoc2l6ZW9mICp0aHJlYWQpKTsKLQl0aHJlYWQtPnN0YXR1cyA9IC0xOwotCi0JLyogU2V0IHVwIHRoZSBhcmd1bWVudHMgZm9yIHRoZSB0aHJlYWQgKi8KLQlhcmdzID0gKHRocmVhZF9hcmdzICopU0RMX21hbGxvYyhzaXplb2YoKmFyZ3MpKTsKLQlpZiAoIGFyZ3MgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCVNETF9mcmVlKHRocmVhZCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JYXJncy0+ZnVuYyA9IGZuOwotCWFyZ3MtPmRhdGEgPSBkYXRhOwotCWFyZ3MtPmluZm8gPSB0aHJlYWQ7Ci0JYXJncy0+d2FpdCA9IEZpbmRUYXNrKE5VTEwpOwotCWlmICggYXJncy0+d2FpdCA9PSBOVUxMICkgewotCQlTRExfZnJlZSh0aHJlYWQpOwotCQlTRExfZnJlZShhcmdzKTsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBBZGQgdGhlIHRocmVhZCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGhyZWFkcyAqLwotCVNETF9BZGRUaHJlYWQodGhyZWFkKTsKLQotCUQoYnVnKCJTdGFydGluZyB0aHJlYWQuLi5cbiIpKTsKLQotCS8qIENyZWF0ZSB0aGUgdGhyZWFkIGFuZCBnbyEgKi8KLQlyZXQgPSBTRExfU1lTX0NyZWF0ZVRocmVhZCh0aHJlYWQsIGFyZ3MpOwotCWlmICggcmV0ID49IDAgKSB7Ci0JCUQoYnVnKCJXYWl0aW5nIGZvciB0aHJlYWQgQ1RSTF9FLi4uXG4iKSk7Ci0JCS8qIFdhaXQgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24gdG8gdXNlIGFyZ3VtZW50cyAqLwotCQlXYWl0KFNJR0JSRUFLRl9DVFJMX0UpOwotCQlEKGJ1ZygiICBBcnJpdmVkLiIpKTsKLQl9IGVsc2UgewotCQkvKiBPb3BzLCBmYWlsZWQuICBHb3R0YSBmcmVlIGV2ZXJ5dGhpbmcgKi8KLQkJU0RMX0RlbFRocmVhZCh0aHJlYWQpOwotCQlTRExfZnJlZSh0aHJlYWQpOwotCQl0aHJlYWQgPSBOVUxMOwotCX0KLQlTRExfZnJlZShhcmdzKTsKLQotCS8qIEV2ZXJ5dGhpbmcgaXMgcnVubmluZyBub3cgKi8KLQlyZXR1cm4odGhyZWFkKTsKLX0KLQotdm9pZCBTRExfV2FpdFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQsIGludCAqc3RhdHVzKQotewotCWlmICggdGhyZWFkICkgewotCQlTRExfU1lTX1dhaXRUaHJlYWQodGhyZWFkKTsKLQkJaWYgKCBzdGF0dXMgKSB7Ci0JCQkqc3RhdHVzID0gdGhyZWFkLT5zdGF0dXM7Ci0JCX0KLQkJU0RMX0RlbFRocmVhZCh0aHJlYWQpOwotCQlTRExfZnJlZSh0aHJlYWQpOwotCX0KLX0KLQotVWludDMyIFNETF9HZXRUaHJlYWRJRChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0JVWludDMyIGlkOwotCi0JaWYgKCB0aHJlYWQgKSB7Ci0JCWlkID0gdGhyZWFkLT50aHJlYWRpZDsKLQl9IGVsc2UgewotCQlpZCA9IFNETF9UaHJlYWRJRCgpOwotCX0KLQlyZXR1cm4oaWQpOwotfQotCi12b2lkIFNETF9LaWxsVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlpZiAoIHRocmVhZCApIHsKLQkJU0RMX1NZU19LaWxsVGhyZWFkKHRocmVhZCk7Ci0JCVNETF9XYWl0VGhyZWFkKHRocmVhZCwgTlVMTCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9iZW9zL1NETF9zeXNzZW0uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Jlb3MvU0RMX3N5c3NlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWE0ZjM3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Jlb3MvU0RMX3N5c3NlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBTZW1hcGhvcmVzIGluIHRoZSBCZU9TIGVudmlyb25tZW50ICovCi0KLSNpbmNsdWRlIDxiZS9rZXJuZWwvT1MuaD4KLQotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLQotCi1zdHJ1Y3QgU0RMX3NlbWFwaG9yZSB7Ci0Jc2VtX2lkIGlkOwotfTsKLQotLyogQ3JlYXRlIGEgY291bnRpbmcgc2VtYXBob3JlICovCi1TRExfc2VtICpTRExfQ3JlYXRlU2VtYXBob3JlKFVpbnQzMiBpbml0aWFsX3ZhbHVlKQotewotCVNETF9zZW0gKnNlbTsKLQotCXNlbSA9IChTRExfc2VtICopU0RMX21hbGxvYyhzaXplb2YoKnNlbSkpOwotCWlmICggc2VtICkgewotCQlzZW0tPmlkID0gY3JlYXRlX3NlbShpbml0aWFsX3ZhbHVlLCAiU0RMIHNlbWFwaG9yZSIpOwotCQlpZiAoIHNlbS0+aWQgPCBCX05PX0VSUk9SICkgewotCQkJU0RMX1NldEVycm9yKCJjcmVhdGVfc2VtKCkgZmFpbGVkIik7Ci0JCQlTRExfZnJlZShzZW0pOwotCQkJc2VtID0gTlVMTDsKLQkJfQotCX0gZWxzZSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCX0KLQlyZXR1cm4oc2VtKTsKLX0KLQotLyogRnJlZSB0aGUgc2VtYXBob3JlICovCi12b2lkIFNETF9EZXN0cm95U2VtYXBob3JlKFNETF9zZW0gKnNlbSkKLXsKLQlpZiAoIHNlbSApIHsKLQkJaWYgKCBzZW0tPmlkID49IEJfTk9fRVJST1IgKSB7Ci0JCQlkZWxldGVfc2VtKHNlbS0+aWQpOwotCQl9Ci0JCVNETF9mcmVlKHNlbSk7Ci0JfQotfQotCi1pbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCi17Ci0JaW50MzIgdmFsOwotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLSAgdHJ5YWdhaW46Ci0JaWYgKCB0aW1lb3V0ID09IFNETF9NVVRFWF9NQVhXQUlUICkgewotCQl2YWwgPSBhY3F1aXJlX3NlbShzZW0tPmlkKTsKLQl9IGVsc2UgewotCQl0aW1lb3V0ICo9IDEwMDA7IC8qIEJlT1MgdXNlcyBhIHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzICovCi0JCXZhbCA9IGFjcXVpcmVfc2VtX2V0YyhzZW0tPmlkLCAxLCBCX1JFTEFUSVZFX1RJTUVPVVQsIHRpbWVvdXQpOwotCX0KLQlzd2l0Y2ggKHZhbCkgewotCSAgICBjYXNlIEJfSU5URVJSVVBURUQ6Ci0JCWdvdG8gdHJ5YWdhaW47Ci0JICAgIGNhc2UgQl9OT19FUlJPUjoKLQkJcmV0dmFsID0gMDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQl9USU1FRF9PVVQ6Ci0JCXJldHZhbCA9IFNETF9NVVRFWF9USU1FRE9VVDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQl9XT1VMRF9CTE9DSzoKLQkJcmV0dmFsID0gU0RMX01VVEVYX1RJTUVET1VUOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJU0RMX1NldEVycm9yKCJhY3F1aXJlX3NlbSgpIGZhaWxlZCIpOwotCQlyZXR2YWwgPSAtMTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotaW50IFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKLXsKLQlyZXR1cm4gU0RMX1NlbVdhaXRUaW1lb3V0KHNlbSwgMCk7Ci19Ci0KLWludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCi17Ci0JcmV0dXJuIFNETF9TZW1XYWl0VGltZW91dChzZW0sIFNETF9NVVRFWF9NQVhXQUlUKTsKLX0KLQotLyogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvZiB0aGUgc2VtYXBob3JlICovCi1VaW50MzIgU0RMX1NlbVZhbHVlKFNETF9zZW0gKnNlbSkKLXsKLQlpbnQzMiBjb3VudDsKLQlVaW50MzIgdmFsdWU7Ci0KLQl2YWx1ZSA9IDA7Ci0JaWYgKCBzZW0gKSB7Ci0JCWdldF9zZW1fY291bnQoc2VtLT5pZCwgJmNvdW50KTsKLQkJaWYgKCBjb3VudCA+IDAgKSB7Ci0JCQl2YWx1ZSA9IChVaW50MzIpY291bnQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIHZhbHVlOwotfQotCi0vKiBBdG9taWNhbGx5IGluY3JlYXNlcyB0aGUgc2VtYXBob3JlJ3MgY291bnQgKG5vdCBibG9ja2luZykgKi8KLWludCBTRExfU2VtUG9zdChTRExfc2VtICpzZW0pCi17Ci0JaWYgKCAhIHNlbSApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCByZWxlYXNlX3NlbShzZW0tPmlkKSAhPSBCX05PX0VSUk9SICkgewotCQlTRExfU2V0RXJyb3IoInJlbGVhc2Vfc2VtKCkgZmFpbGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9iZW9zL1NETF9zeXN0aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Jlb3MvU0RMX3N5c3RocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDRmY2M3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Jlb3MvU0RMX3N5c3RocmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEJlT1MgdGhyZWFkIG1hbmFnZW1lbnQgcm91dGluZXMgZm9yIFNETCAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxiZS9rZXJuZWwvT1MuaD4KLQotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICIuLi9TRExfdGhyZWFkX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdGhyZWFkLmgiCi0KLQotc3RhdGljIGludCBzaWdfbGlzdFtdID0gewotCVNJR0hVUCwgU0lHSU5ULCBTSUdRVUlULCBTSUdQSVBFLCBTSUdBTFJNLCBTSUdURVJNLCBTSUdXSU5DSCwgMAotfTsKLQotdm9pZCBTRExfTWFza1NpZ25hbHMoc2lnc2V0X3QgKm9tYXNrKQotewotCXNpZ3NldF90IG1hc2s7Ci0JaW50IGk7Ci0KLQlzaWdlbXB0eXNldCgmbWFzayk7Ci0JZm9yICggaT0wOyBzaWdfbGlzdFtpXTsgKytpICkgewotCQlzaWdhZGRzZXQoJm1hc2ssIHNpZ19saXN0W2ldKTsKLQl9Ci0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFzaywgb21hc2spOwotfQotdm9pZCBTRExfVW5tYXNrU2lnbmFscyhzaWdzZXRfdCAqb21hc2spCi17Ci0Jc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIG9tYXNrLCBOVUxMKTsKLX0KLQotc3RhdGljIGludDMyIFJ1blRocmVhZCh2b2lkICpkYXRhKQotewotCVNETF9SdW5UaHJlYWQoZGF0YSk7Ci0JcmV0dXJuKDApOwotfQotCi1pbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzKQotewotCS8qIENyZWF0ZSB0aGUgdGhyZWFkIGFuZCBnbyEgKi8KLQl0aHJlYWQtPmhhbmRsZT1zcGF3bl90aHJlYWQoUnVuVGhyZWFkLCAiU0RMIiwgQl9OT1JNQUxfUFJJT1JJVFksIGFyZ3MpOwotCWlmICggKHRocmVhZC0+aGFuZGxlID09IEJfTk9fTU9SRV9USFJFQURTKSB8fAotCSAgICAgKHRocmVhZC0+aGFuZGxlID09IEJfTk9fTUVNT1JZKSApIHsKLQkJU0RMX1NldEVycm9yKCJOb3QgZW5vdWdoIHJlc291cmNlcyB0byBjcmVhdGUgdGhyZWFkIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCXJlc3VtZV90aHJlYWQodGhyZWFkLT5oYW5kbGUpOwotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCi17Ci0JLyogTWFzayBhc3luY2hyb25vdXMgc2lnbmFscyBmb3IgdGhpcyB0aHJlYWQgKi8KLQlTRExfTWFza1NpZ25hbHMoTlVMTCk7Ci19Ci0KLVVpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKLXsKLQlyZXR1cm4oKFVpbnQzMilmaW5kX3RocmVhZChOVUxMKSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlzdGF0dXNfdCB0aGVfc3RhdHVzOwotCi0Jd2FpdF9mb3JfdGhyZWFkKHRocmVhZC0+aGFuZGxlLCAmdGhlX3N0YXR1cyk7Ci19Ci0KLXZvaWQgU0RMX1NZU19LaWxsVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlraWxsX3RocmVhZCh0aHJlYWQtPmhhbmRsZSk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9iZW9zL1NETF9zeXN0aHJlYWRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvYmVvcy9TRExfc3lzdGhyZWFkX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4ZDg1NC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9iZW9zL1NETF9zeXN0aHJlYWRfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxiZS9rZXJuZWwvT1MuaD4KLQotdHlwZWRlZiB0aHJlYWRfaWQgU1lTX1RocmVhZEhhbmRsZTsKLQotLyogRnVuY3Rpb25zIG5lZWRlZCB0byB3b3JrIHdpdGggc3lzdGVtIHRocmVhZHMgaW4gb3RoZXIgcG9ydGlvbnMgb2YgU0RMICovCi1leHRlcm4gdm9pZCBTRExfTWFza1NpZ25hbHMoc2lnc2V0X3QgKm9tYXNrKTsKLWV4dGVybiB2b2lkIFNETF9Vbm1hc2tTaWduYWxzKHNpZ3NldF90ICpvbWFzayk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9kYy9TRExfc3lzY29uZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZGMvU0RMX3N5c2NvbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5ZDJkYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9kYy9TRExfc3lzY29uZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBjb25kaXRpb24gdmFyaWFibGVzIHVzaW5nIHNlbWFwaG9yZXMgYW5kIG11dGV4ZXMgKi8KLS8qCi0gICBUaGlzIGltcGxlbWVudGF0aW9uIGJvcnJvd3MgaGVhdmlseSBmcm9tIHRoZSBCZU9TIGNvbmRpdGlvbiB2YXJpYWJsZQotICAgaW1wbGVtZW50YXRpb24sIHdyaXR0ZW4gYnkgQ2hyaXN0b3BoZXIgVGF0ZSBhbmQgT3dlbiBTbWl0aC4gIFRoYW5rcyEKLSAqLwotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotCi1zdHJ1Y3QgU0RMX2NvbmQKLXsKLQlTRExfbXV0ZXggKmxvY2s7Ci0JaW50IHdhaXRpbmc7Ci0JaW50IHNpZ25hbHM7Ci0JU0RMX3NlbSAqd2FpdF9zZW07Ci0JU0RMX3NlbSAqd2FpdF9kb25lOwotfTsKLQotLyogQ3JlYXRlIGEgY29uZGl0aW9uIHZhcmlhYmxlICovCi1TRExfY29uZCAqIFNETF9DcmVhdGVDb25kKHZvaWQpCi17Ci0JU0RMX2NvbmQgKmNvbmQ7Ci0KLQljb25kID0gKFNETF9jb25kICopIFNETF9tYWxsb2Moc2l6ZW9mKFNETF9jb25kKSk7Ci0JaWYgKCBjb25kICkgewotCQljb25kLT5sb2NrID0gU0RMX0NyZWF0ZU11dGV4KCk7Ci0JCWNvbmQtPndhaXRfc2VtID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSgwKTsKLQkJY29uZC0+d2FpdF9kb25lID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSgwKTsKLQkJY29uZC0+d2FpdGluZyA9IGNvbmQtPnNpZ25hbHMgPSAwOwotCQlpZiAoICEgY29uZC0+bG9jayB8fCAhIGNvbmQtPndhaXRfc2VtIHx8ICEgY29uZC0+d2FpdF9kb25lICkgewotCQkJU0RMX0Rlc3Ryb3lDb25kKGNvbmQpOwotCQkJY29uZCA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQl9Ci0JcmV0dXJuKGNvbmQpOwotfQotCi0vKiBEZXN0cm95IGEgY29uZGl0aW9uIHZhcmlhYmxlICovCi12b2lkIFNETF9EZXN0cm95Q29uZChTRExfY29uZCAqY29uZCkKLXsKLQlpZiAoIGNvbmQgKSB7Ci0JCWlmICggY29uZC0+d2FpdF9zZW0gKSB7Ci0JCQlTRExfRGVzdHJveVNlbWFwaG9yZShjb25kLT53YWl0X3NlbSk7Ci0JCX0KLQkJaWYgKCBjb25kLT53YWl0X2RvbmUgKSB7Ci0JCQlTRExfRGVzdHJveVNlbWFwaG9yZShjb25kLT53YWl0X2RvbmUpOwotCQl9Ci0JCWlmICggY29uZC0+bG9jayApIHsKLQkJCVNETF9EZXN0cm95TXV0ZXgoY29uZC0+bG9jayk7Ci0JCX0KLQkJU0RMX2ZyZWUoY29uZCk7Ci0JfQotfQotCi0vKiBSZXN0YXJ0IG9uZSBvZiB0aGUgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KLWludCBTRExfQ29uZFNpZ25hbChTRExfY29uZCAqY29uZCkKLXsKLQlpZiAoICEgY29uZCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogSWYgdGhlcmUgYXJlIHdhaXRpbmcgdGhyZWFkcyBub3QgYWxyZWFkeSBzaWduYWxsZWQsIHRoZW4KLQkgICBzaWduYWwgdGhlIGNvbmRpdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byByZXNwb25kLgotCSovCi0JU0RMX0xvY2tNdXRleChjb25kLT5sb2NrKTsKLQlpZiAoIGNvbmQtPndhaXRpbmcgPiBjb25kLT5zaWduYWxzICkgewotCQkrK2NvbmQtPnNpZ25hbHM7Ci0JCVNETF9TZW1Qb3N0KGNvbmQtPndhaXRfc2VtKTsKLQkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOwotCQlTRExfU2VtV2FpdChjb25kLT53YWl0X2RvbmUpOwotCX0gZWxzZSB7Ci0JCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogUmVzdGFydCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KLWludCBTRExfQ29uZEJyb2FkY2FzdChTRExfY29uZCAqY29uZCkKLXsKLQlpZiAoICEgY29uZCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogSWYgdGhlcmUgYXJlIHdhaXRpbmcgdGhyZWFkcyBub3QgYWxyZWFkeSBzaWduYWxsZWQsIHRoZW4KLQkgICBzaWduYWwgdGhlIGNvbmRpdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byByZXNwb25kLgotCSovCi0JU0RMX0xvY2tNdXRleChjb25kLT5sb2NrKTsKLQlpZiAoIGNvbmQtPndhaXRpbmcgPiBjb25kLT5zaWduYWxzICkgewotCQlpbnQgaSwgbnVtX3dhaXRpbmc7Ci0KLQkJbnVtX3dhaXRpbmcgPSAoY29uZC0+d2FpdGluZyAtIGNvbmQtPnNpZ25hbHMpOwotCQljb25kLT5zaWduYWxzID0gY29uZC0+d2FpdGluZzsKLQkJZm9yICggaT0wOyBpPG51bV93YWl0aW5nOyArK2kgKSB7Ci0JCQlTRExfU2VtUG9zdChjb25kLT53YWl0X3NlbSk7Ci0JCX0KLQkJLyogTm93IGFsbCByZWxlYXNlZCB0aHJlYWRzIGFyZSBibG9ja2VkIGhlcmUsIHdhaXRpbmcgZm9yIHVzLgotCQkgICBDb2xsZWN0IHRoZW0gYWxsIChhbmQgd2luIGZhYnVsb3VzIHByaXplcyEpIDotKQotCQkgKi8KLQkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOwotCQlmb3IgKCBpPTA7IGk8bnVtX3dhaXRpbmc7ICsraSApIHsKLQkJCVNETF9TZW1XYWl0KGNvbmQtPndhaXRfZG9uZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlTRExfVW5sb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3IgYXQgbW9zdCAnbXMnIG1pbGxpc2Vjb25kcy4KLSAgIFRoZSBtdXRleCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbiEKLSAgIFRoZSBtdXRleCBpcyB1bmxvY2tlZCBkdXJpbmcgdGhlIHdhaXQsIGFuZCBsb2NrZWQgYWdhaW4gYWZ0ZXIgdGhlIHdhaXQuCi0KLVR5cGljYWwgdXNlOgotCi1UaHJlYWQgQToKLQlTRExfTG9ja011dGV4KGxvY2spOwotCXdoaWxlICggISBjb25kaXRpb24gKSB7Ci0JCVNETF9Db25kV2FpdChjb25kKTsKLQl9Ci0JU0RMX1VubG9ja011dGV4KGxvY2spOwotCi1UaHJlYWQgQjoKLQlTRExfTG9ja011dGV4KGxvY2spOwotCS4uLgotCWNvbmRpdGlvbiA9IHRydWU7Ci0JLi4uCi0JU0RMX1VubG9ja011dGV4KGxvY2spOwotICovCi1pbnQgU0RMX0NvbmRXYWl0VGltZW91dChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCwgVWludDMyIG1zKQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgY29uZCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogT2J0YWluIHRoZSBwcm90ZWN0aW9uIG11dGV4LCBhbmQgaW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygd2FpdGVycy4KLQkgICBUaGlzIGFsbG93cyB0aGUgc2lnbmFsIG1lY2hhbmlzbSB0byBvbmx5IHBlcmZvcm0gYSBzaWduYWwgaWYgdGhlcmUKLQkgICBhcmUgd2FpdGluZyB0aHJlYWRzLgotCSAqLwotCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JKytjb25kLT53YWl0aW5nOwotCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKLQotCS8qIFVubG9jayB0aGUgbXV0ZXgsIGFzIGlzIHJlcXVpcmVkIGJ5IGNvbmRpdGlvbiB2YXJpYWJsZSBzZW1hbnRpY3MgKi8KLQlTRExfVW5sb2NrTXV0ZXgobXV0ZXgpOwotCi0JLyogV2FpdCBmb3IgYSBzaWduYWwgKi8KLQlpZiAoIG1zID09IFNETF9NVVRFWF9NQVhXQUlUICkgewotCQlyZXR2YWwgPSBTRExfU2VtV2FpdChjb25kLT53YWl0X3NlbSk7Ci0JfSBlbHNlIHsKLQkJcmV0dmFsID0gU0RMX1NlbVdhaXRUaW1lb3V0KGNvbmQtPndhaXRfc2VtLCBtcyk7Ci0JfQotCi0JLyogTGV0IHRoZSBzaWduYWxlciBrbm93IHdlIGhhdmUgY29tcGxldGVkIHRoZSB3YWl0LCBvdGhlcndpc2UKLSAgICAgICAgICAgdGhlIHNpZ25hbGVyIGNhbiByYWNlIGFoZWFkIGFuZCBnZXQgdGhlIGNvbmRpdGlvbiBzZW1hcGhvcmUKLSAgICAgICAgICAgaWYgd2UgYXJlIHN0b3BwZWQgYmV0d2VlbiB0aGUgbXV0ZXggdW5sb2NrIGFuZCBzZW1hcGhvcmUgd2FpdCwKLSAgICAgICAgICAgZ2l2aW5nIGEgZGVhZGxvY2suICBTZWUgdGhlIGZvbGxvd2luZyBVUkwgZm9yIGRldGFpbHM6Ci0gICAgICAgIGh0dHA6Ly93d3ctY2xhc3NpYy5iZS5jb20vYWJvdXRiZS9iZW5ld3NsZXR0ZXIvdm9sdW1lX0lJSS9Jc3N1ZTQwLmh0bWwKLQkqLwotCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JaWYgKCBjb25kLT5zaWduYWxzID4gMCApIHsKLQkJLyogSWYgd2UgdGltZWQgb3V0LCB3ZSBuZWVkIHRvIGVhdCBhIGNvbmRpdGlvbiBzaWduYWwgKi8KLQkJaWYgKCByZXR2YWwgPiAwICkgewotCQkJU0RMX1NlbVdhaXQoY29uZC0+d2FpdF9zZW0pOwotCQl9Ci0JCS8qIFdlIGFsd2F5cyBub3RpZnkgdGhlIHNpZ25hbCB0aHJlYWQgdGhhdCB3ZSBhcmUgZG9uZSAqLwotCQlTRExfU2VtUG9zdChjb25kLT53YWl0X2RvbmUpOwotCi0JCS8qIFNpZ25hbCBoYW5kc2hha2UgY29tcGxldGUgKi8KLQkJLS1jb25kLT5zaWduYWxzOwotCX0KLQktLWNvbmQtPndhaXRpbmc7Ci0JU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOwotCi0JLyogTG9jayB0aGUgbXV0ZXgsIGFzIGlzIHJlcXVpcmVkIGJ5IGNvbmRpdGlvbiB2YXJpYWJsZSBzZW1hbnRpY3MgKi8KLQlTRExfTG9ja011dGV4KG11dGV4KTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3JldmVyICovCi1pbnQgU0RMX0NvbmRXYWl0KFNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dGV4KQotewotCXJldHVybiBTRExfQ29uZFdhaXRUaW1lb3V0KGNvbmQsIG11dGV4LCBTRExfTVVURVhfTUFYV0FJVCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9kYy9TRExfc3lzY29uZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9kYy9TRExfc3lzY29uZF9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDU1MDkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZGMvU0RMX3N5c2NvbmRfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2RjL1NETF9zeXNtdXRleC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZGMvU0RMX3N5c211dGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlM2Q1ZjcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZGMvU0RMX3N5c211dGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFuIGltcGxlbWVudGF0aW9uIG9mIG11dGV4ZXMgdXNpbmcgc2VtYXBob3JlcyAqLwotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIlNETF9zeXN0aHJlYWRfYy5oIgotCi0jaW5jbHVkZSA8YXJjaC9zcGlubG9jay5oPgotCi1zdHJ1Y3QgU0RMX211dGV4IHsKLQlpbnQgcmVjdXJzaXZlOwotCVVpbnQzMiBvd25lcjsKLQlzcGlubG9ja190IG11dGV4OwotfTsKLQotLyogQ3JlYXRlIGEgbXV0ZXggKi8KLVNETF9tdXRleCAqU0RMX0NyZWF0ZU11dGV4KHZvaWQpCi17Ci0JU0RMX211dGV4ICptdXRleDsKLQotCS8qIEFsbG9jYXRlIG11dGV4IG1lbW9yeSAqLwotCW11dGV4ID0gKFNETF9tdXRleCAqKVNETF9tYWxsb2Moc2l6ZW9mKCptdXRleCkpOwotCWlmICggbXV0ZXggKSB7Ci0JCXNwaW5sb2NrX2luaXQoJm11dGV4LT5tdXRleCk7Ci0JCW11dGV4LT5yZWN1cnNpdmUgPSAwOwotCQltdXRleC0+b3duZXIgPSAwOwotCX0gZWxzZSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCX0KLQlyZXR1cm4gbXV0ZXg7Ci19Ci0KLS8qIEZyZWUgdGhlIG11dGV4ICovCi12b2lkIFNETF9EZXN0cm95TXV0ZXgoU0RMX211dGV4ICptdXRleCkKLXsKLQlpZiAoIG11dGV4ICkgewotCQlTRExfZnJlZShtdXRleCk7Ci0JfQotfQotCi0vKiBMb2NrIHRoZSBzZW1hcGhvcmUgKi8KLWludCBTRExfbXV0ZXhQKFNETF9tdXRleCAqbXV0ZXgpCi17Ci0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLQlyZXR1cm4gIFNETF9hcnJheXNpemUocmV0dXJuICksMDsKLSNlbHNlCi0JVWludDMyIHRoaXNfdGhyZWFkOwotCi0JaWYgKCBtdXRleCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXRoaXNfdGhyZWFkID0gU0RMX1RocmVhZElEKCk7Ci0JaWYgKCBtdXRleC0+b3duZXIgPT0gdGhpc190aHJlYWQgKSB7Ci0JCSsrbXV0ZXgtPnJlY3Vyc2l2ZTsKLQl9IGVsc2UgewotCQkvKiBUaGUgb3JkZXIgb2Ygb3BlcmF0aW9ucyBpcyBpbXBvcnRhbnQuCi0JCSAgIFdlIHNldCB0aGUgbG9ja2luZyB0aHJlYWQgaWQgYWZ0ZXIgd2Ugb2J0YWluIHRoZSBsb2NrCi0JCSAgIHNvIHVubG9ja3MgZnJvbSBvdGhlciB0aHJlYWRzIHdpbGwgZmFpbC4KLQkJKi8KLQkJc3BpbmxvY2tfbG9jaygmbXV0ZXgtPm11dGV4KTsKLQkJbXV0ZXgtPm93bmVyID0gdGhpc190aHJlYWQ7Ci0JCW11dGV4LT5yZWN1cnNpdmUgPSAwOwotCX0KLQotCXJldHVybiAwOwotI2VuZGlmIC8qIFNETF9USFJFQURTX0RJU0FCTEVEICovCi19Ci0KLS8qIFVubG9jayB0aGUgbXV0ZXggKi8KLWludCBTRExfbXV0ZXhWKFNETF9tdXRleCAqbXV0ZXgpCi17Ci0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLQlyZXR1cm4gMDsKLSNlbHNlCi0JaWYgKCBtdXRleCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIElmIHdlIGRvbid0IG93biB0aGUgbXV0ZXgsIHdlIGNhbid0IHVubG9jayBpdCAqLwotCWlmICggU0RMX1RocmVhZElEKCkgIT0gbXV0ZXgtPm93bmVyICkgewotCQlTRExfU2V0RXJyb3IoIm11dGV4IG5vdCBvd25lZCBieSB0aGlzIHRocmVhZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBtdXRleC0+cmVjdXJzaXZlICkgewotCQktLW11dGV4LT5yZWN1cnNpdmU7Ci0JfSBlbHNlIHsKLQkJLyogVGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgaW1wb3J0YW50LgotCQkgICBGaXJzdCByZXNldCB0aGUgb3duZXIgc28gYW5vdGhlciB0aHJlYWQgZG9lc24ndCBsb2NrCi0JCSAgIHRoZSBtdXRleCBhbmQgc2V0IHRoZSBvd25lcnNoaXAgYmVmb3JlIHdlIHJlc2V0IGl0LAotCQkgICB0aGVuIHJlbGVhc2UgdGhlIGxvY2sgc2VtYXBob3JlLgotCQkgKi8KLQkJbXV0ZXgtPm93bmVyID0gMDsKLQkJc3BpbmxvY2tfdW5sb2NrKCZtdXRleC0+bXV0ZXgpOwotCX0KLQlyZXR1cm4gMDsKLSNlbmRpZiAvKiBTRExfVEhSRUFEU19ESVNBQkxFRCAqLwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZGMvU0RMX3N5c211dGV4X2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2RjL1NETF9zeXNtdXRleF9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDU1MDkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZGMvU0RMX3N5c211dGV4X2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9kYy9TRExfc3lzc2VtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9kYy9TRExfc3lzc2VtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ODg4ZjcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZGMvU0RMX3N5c3NlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBzZW1hcGhvcmVzIHVzaW5nIG11dGV4ZXMgYW5kIGNvbmRpdGlvbiB2YXJpYWJsZXMgKi8KLQotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICJTRExfc3lzdGhyZWFkX2MuaCIKLQotCi0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLQotU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKLXsKLQlTRExfU2V0RXJyb3IoIlNETCBub3QgY29uZmlndXJlZCB3aXRoIHRocmVhZCBzdXBwb3J0Iik7Ci0JcmV0dXJuIChTRExfc2VtICopMDsKLX0KLQotdm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCi17Ci0JcmV0dXJuOwotfQotCi1pbnQgU0RMX1NlbVRyeVdhaXQoU0RMX3NlbSAqc2VtKQotewotCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLWludCBTRExfU2VtV2FpdFRpbWVvdXQoU0RMX3NlbSAqc2VtLCBVaW50MzIgdGltZW91dCkKLXsKLQlTRExfU2V0RXJyb3IoIlNETCBub3QgY29uZmlndXJlZCB3aXRoIHRocmVhZCBzdXBwb3J0Iik7Ci0JcmV0dXJuIC0xOwotfQotCi1pbnQgU0RMX1NlbVdhaXQoU0RMX3NlbSAqc2VtKQotewotCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLVVpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQotewotCXJldHVybiAwOwotfQotCi1pbnQgU0RMX1NlbVBvc3QoU0RMX3NlbSAqc2VtKQotewotCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLSNlbHNlCi0KLSNpbmNsdWRlIDxrb3Mvc2VtLmg+Ci0KLXN0cnVjdCBTRExfc2VtYXBob3JlCi17Ci0Jc2VtYXBob3JlX3Qgc2VtOwotfTsKLQotU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKLXsKLQlyZXR1cm4gKFNETF9zZW0gKilzZW1fY3JlYXRlKGluaXRpYWxfdmFsdWUpOwotfQotCi0vKiBXQVJOSU5HOgotICAgWW91IGNhbm5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBhbm90aGVyIHRocmVhZCBpcyB1c2luZyB0aGUgc2VtYXBob3JlLgotKi8KLXZvaWQgU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoU0RMX3NlbSAqc2VtKQotewotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuOwotCX0KLQotCXNlbV9kZXN0cm95KCZzZW0tPnNlbSk7Ci19Ci0KLWludCBTRExfU2VtVHJ5V2FpdChTRExfc2VtICpzZW0pCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHZhbCA9IHNlbV90cnl3YWl0KCZzZW0tPnNlbSk7Ci0JaWYgKHJldHZhbD09MCkgcmV0dXJuIDA7Ci0JZWxzZSByZXR1cm4gU0RMX01VVEVYX1RJTUVET1VUOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotaW50IFNETF9TZW1XYWl0VGltZW91dChTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0KQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBBIHRpbWVvdXQgb2YgMCBpcyBhbiBlYXN5IGNhc2UgKi8KLQlpZiAoIHRpbWVvdXQgPT0gMCApIHsKLQkJcmV0dXJuIFNETF9TZW1UcnlXYWl0KHNlbSk7Ci0JfQotCi0JcmV0dmFsID0gc2VtX3dhaXRfdGltZWQoJnNlbS0+c2VtLHRpbWVvdXQpOwotCWlmIChyZXR2YWw9PS0xKSByZXR2YWw9IFNETF9NVVRFWF9USU1FRE9VVDsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXdoaWxlICggKChyZXR2YWwgPSBzZW1fd2FpdCgmc2VtLT5zZW0pKSA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSApIHt9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotVWludDMyIFNETF9TZW1WYWx1ZShTRExfc2VtICpzZW0pCi17Ci0JaWYgKCAhIHNlbSApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIHNlbV9jb3VudCgmc2VtLT5zZW0pOwotfQotCi1pbnQgU0RMX1NlbVBvc3QoU0RMX3NlbSAqc2VtKQotewotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXNlbV9zaWduYWwoJnNlbS0+c2VtKTsKLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIFNETF9USFJFQURTX0RJU0FCTEVEICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9kYy9TRExfc3lzc2VtX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2RjL1NETF9zeXNzZW1fYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Q1NTA5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2RjL1NETF9zeXNzZW1fYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2RjL1NETF9zeXN0aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2RjL1NETF9zeXN0aHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ODJjYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9kYy9TRExfc3lzdGhyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhyZWFkIG1hbmFnZW1lbnQgcm91dGluZXMgZm9yIFNETCAqLwotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIi4uL1NETF90aHJlYWRfYy5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKLQotI2luY2x1ZGUgPGtvcy90aHJlYWQuaD4KLQotaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncykKLXsKLQl0aHJlYWQtPmhhbmRsZSA9IHRoZF9jcmVhdGUoU0RMX1J1blRocmVhZCxhcmdzKTsKLQlpZiAodGhyZWFkLT5oYW5kbGUgPT0gTlVMTCkgewotCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIFNETF9TWVNfU2V0dXBUaHJlYWQodm9pZCkKLXsKLQlyZXR1cm47Ci19Ci0KLVVpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKLXsKLQlyZXR1cm4gKFVpbnQzMil0aGRfZ2V0X2N1cnJlbnQoKTsKLX0KLQotdm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQotewotCXRoZF93YWl0KHRocmVhZC0+aGFuZGxlKTsKLX0KLQotdm9pZCBTRExfU1lTX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQotewotCXRoZF9kZXN0cm95KHRocmVhZC0+aGFuZGxlKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2RjL1NETF9zeXN0aHJlYWRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZGMvU0RMX3N5c3RocmVhZF9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTU1M2YuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZGMvU0RMX3N5c3RocmVhZF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotdHlwZWRlZiBzdHJ1Y3Qga3RocmVhZCogU1lTX1RocmVhZEhhbmRsZTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Vwb2MvU0RMX3N5c211dGV4LmNwcCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Vwb2MvU0RMX3N5c211dGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5MjAxMi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9lcG9jL1NETF9zeXNtdXRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gICAgU0RMX3N5c211dGV4LmNwcAotCi0gICAgRXBvYyB2ZXJzaW9uIGJ5IE1hcmt1cyBNZXJ0YW1hICh3QGlraS5maSkKLSovCi0KLQotLyogTXV0ZXggZnVuY3Rpb25zIHVzaW5nIHRoZSBXaW4zMiBBUEkgKi8KLQotI2luY2x1ZGU8ZTMyc3RkLmg+Ci0KLSNpbmNsdWRlICJTRExfZXJyb3IuaCIKLSNpbmNsdWRlICJTRExfbXV0ZXguaCIKLQotCi0KLXN0cnVjdCBTRExfbXV0ZXgKLSAgICB7Ci0gICAgVEludCBoYW5kbGU7Ci0gICAgfTsKLQotZXh0ZXJuIFRJbnQgQ3JlYXRlVW5pcXVlKFRJbnQgKCphRnVuYykoY29uc3QgVERlc0MmIGFOYW1lLCBUQW55KiwgVEFueSopLCBUQW55KiwgVEFueSopOwotCi1USW50IE5ld011dGV4KGNvbnN0IFREZXNDJiBhTmFtZSwgVEFueSogYVB0cjEsIFRBbnkqKQotICAgIHsKLSAgICByZXR1cm4gKChSTXV0ZXgqKWFQdHIxKS0+Q3JlYXRlR2xvYmFsKGFOYW1lKTsKLSAgICB9Ci0KLS8qIENyZWF0ZSBhIG11dGV4ICovCi1TRExfbXV0ZXggKlNETF9DcmVhdGVNdXRleCh2b2lkKQotewotICAgIFJNdXRleCBybXV0ZXg7Ci0KLSAgICBUSW50IHN0YXR1cyA9IENyZWF0ZVVuaXF1ZShOZXdNdXRleCwgJnJtdXRleCwgTlVMTCk7Ci0JaWYoc3RhdHVzICE9IEtFcnJOb25lKQotCSAgICB7Ci0JCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBtdXRleCIpOwotCQl9Ci0gICAgU0RMX211dGV4KiBtdXRleCA9IG5ldyAvKihFTGVhdmUpKi8gU0RMX211dGV4OwotICAgIG11dGV4LT5oYW5kbGUgPSBybXV0ZXguSGFuZGxlKCk7Ci0JcmV0dXJuKG11dGV4KTsKLX0KLQotLyogRnJlZSB0aGUgbXV0ZXggKi8KLXZvaWQgU0RMX0Rlc3Ryb3lNdXRleChTRExfbXV0ZXggKm11dGV4KQotewotCWlmICggbXV0ZXggKSAKLQl7Ci0gICAgUk11dGV4IHJtdXRleDsKLSAgICBybXV0ZXguU2V0SGFuZGxlKG11dGV4LT5oYW5kbGUpOwotCXJtdXRleC5TaWduYWwoKTsKLQlybXV0ZXguQ2xvc2UoKTsKLQlkZWxldGUobXV0ZXgpOwotICAgIG11dGV4ID0gTlVMTDsKLQl9Ci19Ci0KLS8qIExvY2sgdGhlIG11dGV4ICovCi1pbnQgU0RMX211dGV4UChTRExfbXV0ZXggKm11dGV4KQotewotCWlmICggbXV0ZXggPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0gICAgUk11dGV4IHJtdXRleDsKLSAgICBybXV0ZXguU2V0SGFuZGxlKG11dGV4LT5oYW5kbGUpOwotCXJtdXRleC5XYWl0KCk7IAotCXJldHVybigwKTsKLX0KLQotLyogVW5sb2NrIHRoZSBtdXRleCAqLwotaW50IFNETF9tdXRleFYoU0RMX211dGV4ICptdXRleCkKLXsKLQlpZiAoIG11dGV4ID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVJNdXRleCBybXV0ZXg7Ci0gICAgcm11dGV4LlNldEhhbmRsZShtdXRleC0+aGFuZGxlKTsKLQlybXV0ZXguU2lnbmFsKCk7Ci0JcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZXBvYy9TRExfc3lzc2VtLmNwcCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Vwb2MvU0RMX3N5c3NlbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTgyZDIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZXBvYy9TRExfc3lzc2VtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAgICBTRExfc3lzc2VtLmNwcAotCi0gICAgRXBvYyB2ZXJzaW9uIGJ5IE1hcmt1cyBNZXJ0YW1hICAod0Bpa2kuZmkpCi0qLwotCi0vKiBTZW1hcGhvcmUgZnVuY3Rpb25zIHVzaW5nIHRoZSBXaW4zMiBBUEkgKi8KLQotI2luY2x1ZGUgPGUzMnN0ZC5oPgotCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotCi0KLSNkZWZpbmUgU0RMX01VVEVYX1RJTUVPVVQgLTIKLQotc3RydWN0IFNETF9zZW1hcGhvcmUKLSB7Ci0gVEludCBoYW5kbGU7Ci0gVEludCBjb3VudDsKLSB9OwotCi1leHRlcm4gVEludCBDcmVhdGVVbmlxdWUoVEludCAoKmFGdW5jKShjb25zdCBURGVzQyYgYU5hbWUsIFRBbnkqLCBUQW55KiksIFRBbnkqLCBUQW55Kik7Ci1leHRlcm4gVEludCBOZXdUaHJlYWQoY29uc3QgVERlc0MmIGFOYW1lLCBUQW55KiBhUHRyMSwgVEFueSogYVB0cjIpOwotCi1USW50IE5ld1NlbWEoY29uc3QgVERlc0MmIGFOYW1lLCBUQW55KiBhUHRyMSwgVEFueSogYVB0cjIpIAotICAgIHsKLSAgICBUSW50IHZhbHVlID0gKigoVEludCopIGFQdHIyKTsKLSAgICByZXR1cm4gKChSU2VtYXBob3JlKilhUHRyMSktPkNyZWF0ZUdsb2JhbChhTmFtZSwgdmFsdWUpOwotICAgIH0KLQotLyogQ3JlYXRlIGEgc2VtYXBob3JlICovCi1TRExfc2VtICpTRExfQ3JlYXRlU2VtYXBob3JlKFVpbnQzMiBpbml0aWFsX3ZhbHVlKQotewotICAgUlNlbWFwaG9yZSBzOwotICAgVEludCBzdGF0dXMgPSBDcmVhdGVVbmlxdWUoTmV3U2VtYSwgJnMsICZpbml0aWFsX3ZhbHVlKTsKLSAgIGlmKHN0YXR1cyAhPSBLRXJyTm9uZSkKLQkgewotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgc2VtYXBob3JlIik7Ci0JfQotICAgIFNETF9zZW1hcGhvcmUqIHNlbSA9IG5ldyAvKihFTGVhdmUpKi8gU0RMX3NlbWFwaG9yZTsgIAotICAgIHNlbS0+aGFuZGxlID0gcy5IYW5kbGUoKTsKLQlzZW0tPmNvdW50ID0gaW5pdGlhbF92YWx1ZTsKLQlyZXR1cm4oc2VtKTsKLX0KLQotLyogRnJlZSB0aGUgc2VtYXBob3JlICovCi12b2lkIFNETF9EZXN0cm95U2VtYXBob3JlKFNETF9zZW0gKnNlbSkKLXsKLQlpZiAoIHNlbSApIAotCXsKLSAgICBSU2VtYXBob3JlIHNlbWE7Ci0gICAgc2VtYS5TZXRIYW5kbGUoc2VtLT5oYW5kbGUpOwotCXNlbWEuU2lnbmFsKHNlbWEuQ291bnQoKSk7Ci0gICAgc2VtYS5DbG9zZSgpOwotICAgIGRlbGV0ZSBzZW07Ci0Jc2VtID0gTlVMTDsKLQl9Ci19Ci0KLQotICBzdHJ1Y3QgVEluZm8KLSAgICB7Ci0gICAgICAgIFRJbmZvKFRJbnQgYVRpbWUsIFRJbnQgYUhhbmRsZSkgOiAKLSAgICAgICAgaVRpbWUoYVRpbWUpLCBpSGFuZGxlKGFIYW5kbGUpLCBpVmFsKDApIHt9Ci0gICAgICAgIFRJbnQgaVRpbWU7Ci0gICAgICAgIFRJbnQgaUhhbmRsZTsKLSAgICAgICAgVEludCBpVmFsOyAKLSAgICB9OwotCi1UQm9vbCBUaHJlYWRSdW4oVEFueSogYUluZm8pCi0gICAgewotICAgICAgICBUSW5mbyogaW5mbyA9IFNUQVRJQ19DQVNUKFRJbmZvKiwgYUluZm8pOwotICAgICAgICBVc2VyOjpBZnRlcihpbmZvLT5pVGltZSk7Ci0gICAgICAgIFJTZW1hcGhvcmUgc2VtYTsKLSAgICAgICAgc2VtYS5TZXRIYW5kbGUoaW5mby0+aUhhbmRsZSk7Ci0gICAgICAgIHNlbWEuU2lnbmFsKCk7Ci0gICAgICAgIGluZm8tPmlWYWwgPSBTRExfTVVURVhfVElNRU9VVDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAKLSAgICAKLSAgICAKLXZvaWQgX1dhaXRBbGwoU0RMX3NlbSAqc2VtKQotICAgIHsKLSAgICAgICAvL3NpbmNlIFNlbVRyeVdhaXQgbWF5IGNoYW5nZWQgdGhlIGNvdW50ZXIuCi0gICAgICAgLy90aGlzIG1heSBub3QgYmUgYXRvbWljLCBidXQgaG9wZXMgaXQgd29ya3MuCi0gICAgUlNlbWFwaG9yZSBzZW1hOwotICAgIHNlbWEuU2V0SGFuZGxlKHNlbS0+aGFuZGxlKTsKLSAgICBzZW1hLldhaXQoKTsKLSAgICB3aGlsZShzZW0tPmNvdW50IDwgMCkKLSAgICAgICAgewotICAgICAgICBzZW1hLldhaXQoKTsKLSAgICAgICAgfSAgICAKLSAgICB9Ci0KLWludCBTRExfU2VtV2FpdFRpbWVvdXQoU0RMX3NlbSAqc2VtLCBVaW50MzIgdGltZW91dCkKLXsKLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIHRpbWVvdXQgPT0gU0RMX01VVEVYX01BWFdBSVQgKQotCSAgICB7Ci0JICAgIF9XYWl0QWxsKHNlbSk7Ci0JCXJldHVybiBTRExfTVVURVhfTUFYV0FJVDsKLQkgICAgfSAKLQkKLQkKLQlSVGhyZWFkIHRocmVhZDsKLQkKLQlUSW5mbyogaW5mbyA9IG5ldyAoRUxlYXZlKVRJbmZvKHRpbWVvdXQsIHNlbS0+aGFuZGxlKTsKLQkKLSAgICBUSW50IHN0YXR1cyA9IENyZWF0ZVVuaXF1ZShOZXdUaHJlYWQsICZ0aHJlYWQsIGluZm8pOwotICAKLQlpZihzdGF0dXMgIT0gS0Vyck5vbmUpCi0JICAgIHJldHVybiBzdGF0dXM7Ci0JCi0JdGhyZWFkLlJlc3VtZSgpOwotCQotCV9XYWl0QWxsKHNlbSk7Ci0JCi0JaWYodGhyZWFkLkV4aXRUeXBlKCkgPT0gRUV4aXRQZW5kaW5nKQotCSAgICB7Ci0JICAgICAgICB0aHJlYWQuS2lsbChTRExfTVVURVhfVElNRU9VVCk7Ci0JICAgIH0KLQkKLQl0aHJlYWQuQ2xvc2UoKTsKLQkKLQlyZXR1cm4gaW5mby0+aVZhbDsKLX0KLQotaW50IFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKLXsKLSAgICBpZihzZW0tPmNvdW50ID4gMCkKLSAgICAgICAgewotICAgICAgICBzZW0tPmNvdW50LS07Ci0gICAgICAgIH0KLSAgICByZXR1cm4gU0RMX01VVEVYX1RJTUVPVVQ7Ci19Ci0KLWludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCi17Ci0JcmV0dXJuIFNETF9TZW1XYWl0VGltZW91dChzZW0sIFNETF9NVVRFWF9NQVhXQUlUKTsKLX0KLQotLyogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvZiB0aGUgc2VtYXBob3JlICovCi1VaW50MzIgU0RMX1NlbVZhbHVlKFNETF9zZW0gKnNlbSkKLXsKLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gc2VtLT5jb3VudDsKLX0KLQotaW50IFNETF9TZW1Qb3N0KFNETF9zZW0gKnNlbSkKLXsKLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2VtLT5jb3VudCsrOwotICAgIFJTZW1hcGhvcmUgc2VtYTsKLSAgICBzZW1hLlNldEhhbmRsZShzZW0tPmhhbmRsZSk7Ci0Jc2VtYS5TaWduYWwoKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Vwb2MvU0RMX3N5c3RocmVhZC5jcHAgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9lcG9jL1NETF9zeXN0aHJlYWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDhmMDA0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Vwb2MvU0RMX3N5c3RocmVhZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAgICBTRExfc3lzdGhyZWFkLmNwcAotICAgIEVwb2MgdGhyZWFkIG1hbmFnZW1lbnQgcm91dGluZXMgZm9yIFNETAotCi0gICAgRXBvYyB2ZXJzaW9uIGJ5IE1hcmt1cyBNZXJ0YW1hICAod0Bpa2kuZmkpCi0qLwotCi0KLWV4dGVybiAiQyIgewotI3VuZGVmIE5VTEwKLSNpbmNsdWRlICJTRExfZXJyb3IuaCIKLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3RocmVhZC5oIgotICAgIH07Ci0KLSNpbmNsdWRlIDxlMzJzdGQuaD4KLQotCi1zdGF0aWMgaW50IG9iamVjdF9jb3VudDsKLQotaW50IFJ1blRocmVhZChUQW55KiBkYXRhKQotewotCVNETF9SdW5UaHJlYWQoZGF0YSk7Ci0JcmV0dXJuKDApOwotfQotCi0KLVRJbnQgTmV3VGhyZWFkKGNvbnN0IFREZXNDJiBhTmFtZSwgVEFueSogYVB0cjEsIFRBbnkqIGFQdHIyKQotICAgIHsKLSAgICByZXR1cm4gKChSVGhyZWFkKikoYVB0cjEpKS0+Q3JlYXRlKGFOYW1lLAotICAgICAgICAgICAgUnVuVGhyZWFkLAotICAgICAgICAgICAgS0RlZmF1bHRTdGFja1NpemUsCi0gICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgYVB0cjIpOwotICAgIH0KLQotaW50IENyZWF0ZVVuaXF1ZShUSW50ICgqYUZ1bmMpKGNvbnN0IFREZXNDJiBhTmFtZSwgVEFueSosIFRBbnkqKSwgVEFueSogYVB0cjEsIFRBbnkqIGFQdHIyKQotICAgIHsKLSAgICBUQnVmPDE2PiBuYW1lOwotICAgIFRJbnQgc3RhdHVzID0gS0Vyck5vbmU7Ci0gICAgZG8KLSAgICAgICAgewotICAgICAgICBvYmplY3RfY291bnQrKzsKLSAgICAgICAgbmFtZS5Gb3JtYXQoX0woIlNETF8leCIpLCBvYmplY3RfY291bnQpOwotICAgICAgICBzdGF0dXMgPSBhRnVuYyhuYW1lLCBhUHRyMSwgYVB0cjIpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlKHN0YXR1cyA9PSBLRXJyQWxyZWFkeUV4aXN0cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLQotaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncykKLXsKLSAgICBSVGhyZWFkIHJ0aHJlYWQ7Ci0gICAKLSAgICBUSW50IHN0YXR1cyA9IENyZWF0ZVVuaXF1ZShOZXdUaHJlYWQsICZydGhyZWFkLCBhcmdzKTsKLSAgICBpZiAoc3RhdHVzICE9IEtFcnJOb25lKSAKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSgoKFJUaHJlYWQqKSh0aHJlYWQtPmhhbmRsZSkpKTsKLSAgICAgICAgdGhyZWFkLT5oYW5kbGUgPSBOVUxMOwotCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcnRocmVhZC5SZXN1bWUoKTsKLSAgICB0aHJlYWQtPmhhbmRsZSA9IHJ0aHJlYWQuSGFuZGxlKCk7Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIFNETF9TWVNfU2V0dXBUaHJlYWQodm9pZCkKLXsKLQlyZXR1cm47Ci19Ci0KLVVpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKLXsKLSAgICBSVGhyZWFkIGN1cnJlbnQ7Ci0gICAgVFRocmVhZElkIGlkID0gY3VycmVudC5JZCgpOwotCXJldHVybiBpZDsKLX0KLQotdm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQotewotICAgIFJVbmRlcnRha2VyIHRha2VyOwotICAgIHRha2VyLkNyZWF0ZSgpOwotICAgIFRSZXF1ZXN0U3RhdHVzIHN0YXR1czsKLSAgICB0YWtlci5Mb2dvbihzdGF0dXMsIHRocmVhZC0+aGFuZGxlKTsKLSAgICBVc2VyOjpXYWl0Rm9yUmVxdWVzdChzdGF0dXMpOwotICAgIHRha2VyLkNsb3NlKCk7Ci19Ci0KLS8qIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGEgbGFzdCByZXNvcnQuCi0gKiBUaHJlYWRzIHNob3VsZCBiZSBzaWduYWxlZCBhbmQgdGhlbiBleGl0IGJ5IHRoZW1zZWx2ZXMuCi0gKiBUZXJtaW5hdGVUaHJlYWQoKSBkb2Vzbid0IHBlcmZvcm0gc3RhY2sgYW5kIERMTCBjbGVhbnVwLgotICovCi12b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0gICAgUlRocmVhZCBydGhyZWFkOwotICAgIHJ0aHJlYWQuU2V0SGFuZGxlKHRocmVhZC0+aGFuZGxlKTsKLQlydGhyZWFkLktpbGwoMCk7Ci0JcnRocmVhZC5DbG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZXBvYy9TRExfc3lzdGhyZWFkX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2Vwb2MvU0RMX3N5c3RocmVhZF9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNWZkOTQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZXBvYy9TRExfc3lzdGhyZWFkX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICAgIFNETF9zeXN0aHJlYWRfYy5oCi0KLSAgICBFcG9jIHZlcnNpb24gYnkgTWFya3VzIE1lcnRhbWEgKHdAaWtpLmZpKQotKi8KLQotdHlwZWRlZiBpbnQgU1lTX1RocmVhZEhhbmRsZTsKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzY29uZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzY29uZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTlkMmRjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2dlbmVyaWMvU0RMX3N5c2NvbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogQW4gaW1wbGVtZW50YXRpb24gb2YgY29uZGl0aW9uIHZhcmlhYmxlcyB1c2luZyBzZW1hcGhvcmVzIGFuZCBtdXRleGVzICovCi0vKgotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBib3Jyb3dzIGhlYXZpbHkgZnJvbSB0aGUgQmVPUyBjb25kaXRpb24gdmFyaWFibGUKLSAgIGltcGxlbWVudGF0aW9uLCB3cml0dGVuIGJ5IENocmlzdG9waGVyIFRhdGUgYW5kIE93ZW4gU21pdGguICBUaGFua3MhCi0gKi8KLQotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLQotc3RydWN0IFNETF9jb25kCi17Ci0JU0RMX211dGV4ICpsb2NrOwotCWludCB3YWl0aW5nOwotCWludCBzaWduYWxzOwotCVNETF9zZW0gKndhaXRfc2VtOwotCVNETF9zZW0gKndhaXRfZG9uZTsKLX07Ci0KLS8qIENyZWF0ZSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLwotU0RMX2NvbmQgKiBTRExfQ3JlYXRlQ29uZCh2b2lkKQotewotCVNETF9jb25kICpjb25kOwotCi0JY29uZCA9IChTRExfY29uZCAqKSBTRExfbWFsbG9jKHNpemVvZihTRExfY29uZCkpOwotCWlmICggY29uZCApIHsKLQkJY29uZC0+bG9jayA9IFNETF9DcmVhdGVNdXRleCgpOwotCQljb25kLT53YWl0X3NlbSA9IFNETF9DcmVhdGVTZW1hcGhvcmUoMCk7Ci0JCWNvbmQtPndhaXRfZG9uZSA9IFNETF9DcmVhdGVTZW1hcGhvcmUoMCk7Ci0JCWNvbmQtPndhaXRpbmcgPSBjb25kLT5zaWduYWxzID0gMDsKLQkJaWYgKCAhIGNvbmQtPmxvY2sgfHwgISBjb25kLT53YWl0X3NlbSB8fCAhIGNvbmQtPndhaXRfZG9uZSApIHsKLQkJCVNETF9EZXN0cm95Q29uZChjb25kKTsKLQkJCWNvbmQgPSBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JfQotCXJldHVybihjb25kKTsKLX0KLQotLyogRGVzdHJveSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLwotdm9pZCBTRExfRGVzdHJveUNvbmQoU0RMX2NvbmQgKmNvbmQpCi17Ci0JaWYgKCBjb25kICkgewotCQlpZiAoIGNvbmQtPndhaXRfc2VtICkgewotCQkJU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoY29uZC0+d2FpdF9zZW0pOwotCQl9Ci0JCWlmICggY29uZC0+d2FpdF9kb25lICkgewotCQkJU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoY29uZC0+d2FpdF9kb25lKTsKLQkJfQotCQlpZiAoIGNvbmQtPmxvY2sgKSB7Ci0JCQlTRExfRGVzdHJveU11dGV4KGNvbmQtPmxvY2spOwotCQl9Ci0JCVNETF9mcmVlKGNvbmQpOwotCX0KLX0KLQotLyogUmVzdGFydCBvbmUgb2YgdGhlIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlICovCi1pbnQgU0RMX0NvbmRTaWduYWwoU0RMX2NvbmQgKmNvbmQpCi17Ci0JaWYgKCAhIGNvbmQgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIElmIHRoZXJlIGFyZSB3YWl0aW5nIHRocmVhZHMgbm90IGFscmVhZHkgc2lnbmFsbGVkLCB0aGVuCi0JICAgc2lnbmFsIHRoZSBjb25kaXRpb24gYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gcmVzcG9uZC4KLQkqLwotCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JaWYgKCBjb25kLT53YWl0aW5nID4gY29uZC0+c2lnbmFscyApIHsKLQkJKytjb25kLT5zaWduYWxzOwotCQlTRExfU2VtUG9zdChjb25kLT53YWl0X3NlbSk7Ci0JCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKLQkJU0RMX1NlbVdhaXQoY29uZC0+d2FpdF9kb25lKTsKLQl9IGVsc2UgewotCQlTRExfVW5sb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJlc3RhcnQgYWxsIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlICovCi1pbnQgU0RMX0NvbmRCcm9hZGNhc3QoU0RMX2NvbmQgKmNvbmQpCi17Ci0JaWYgKCAhIGNvbmQgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIElmIHRoZXJlIGFyZSB3YWl0aW5nIHRocmVhZHMgbm90IGFscmVhZHkgc2lnbmFsbGVkLCB0aGVuCi0JICAgc2lnbmFsIHRoZSBjb25kaXRpb24gYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gcmVzcG9uZC4KLQkqLwotCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JaWYgKCBjb25kLT53YWl0aW5nID4gY29uZC0+c2lnbmFscyApIHsKLQkJaW50IGksIG51bV93YWl0aW5nOwotCi0JCW51bV93YWl0aW5nID0gKGNvbmQtPndhaXRpbmcgLSBjb25kLT5zaWduYWxzKTsKLQkJY29uZC0+c2lnbmFscyA9IGNvbmQtPndhaXRpbmc7Ci0JCWZvciAoIGk9MDsgaTxudW1fd2FpdGluZzsgKytpICkgewotCQkJU0RMX1NlbVBvc3QoY29uZC0+d2FpdF9zZW0pOwotCQl9Ci0JCS8qIE5vdyBhbGwgcmVsZWFzZWQgdGhyZWFkcyBhcmUgYmxvY2tlZCBoZXJlLCB3YWl0aW5nIGZvciB1cy4KLQkJICAgQ29sbGVjdCB0aGVtIGFsbCAoYW5kIHdpbiBmYWJ1bG91cyBwcml6ZXMhKSA6LSkKLQkJICovCi0JCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKLQkJZm9yICggaT0wOyBpPG51bV93YWl0aW5nOyArK2kgKSB7Ci0JCQlTRExfU2VtV2FpdChjb25kLT53YWl0X2RvbmUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgZm9yIGF0IG1vc3QgJ21zJyBtaWxsaXNlY29uZHMuCi0gICBUaGUgbXV0ZXggbXVzdCBiZSBsb2NrZWQgYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuY3Rpb24hCi0gICBUaGUgbXV0ZXggaXMgdW5sb2NrZWQgZHVyaW5nIHRoZSB3YWl0LCBhbmQgbG9ja2VkIGFnYWluIGFmdGVyIHRoZSB3YWl0LgotCi1UeXBpY2FsIHVzZToKLQotVGhyZWFkIEE6Ci0JU0RMX0xvY2tNdXRleChsb2NrKTsKLQl3aGlsZSAoICEgY29uZGl0aW9uICkgewotCQlTRExfQ29uZFdhaXQoY29uZCk7Ci0JfQotCVNETF9VbmxvY2tNdXRleChsb2NrKTsKLQotVGhyZWFkIEI6Ci0JU0RMX0xvY2tNdXRleChsb2NrKTsKLQkuLi4KLQljb25kaXRpb24gPSB0cnVlOwotCS4uLgotCVNETF9VbmxvY2tNdXRleChsb2NrKTsKLSAqLwotaW50IFNETF9Db25kV2FpdFRpbWVvdXQoU0RMX2NvbmQgKmNvbmQsIFNETF9tdXRleCAqbXV0ZXgsIFVpbnQzMiBtcykKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCAhIGNvbmQgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIE9idGFpbiB0aGUgcHJvdGVjdGlvbiBtdXRleCwgYW5kIGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHdhaXRlcnMuCi0JICAgVGhpcyBhbGxvd3MgdGhlIHNpZ25hbCBtZWNoYW5pc20gdG8gb25seSBwZXJmb3JtIGEgc2lnbmFsIGlmIHRoZXJlCi0JICAgYXJlIHdhaXRpbmcgdGhyZWFkcy4KLQkgKi8KLQlTRExfTG9ja011dGV4KGNvbmQtPmxvY2spOwotCSsrY29uZC0+d2FpdGluZzsKLQlTRExfVW5sb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0KLQkvKiBVbmxvY2sgdGhlIG11dGV4LCBhcyBpcyByZXF1aXJlZCBieSBjb25kaXRpb24gdmFyaWFibGUgc2VtYW50aWNzICovCi0JU0RMX1VubG9ja011dGV4KG11dGV4KTsKLQotCS8qIFdhaXQgZm9yIGEgc2lnbmFsICovCi0JaWYgKCBtcyA9PSBTRExfTVVURVhfTUFYV0FJVCApIHsKLQkJcmV0dmFsID0gU0RMX1NlbVdhaXQoY29uZC0+d2FpdF9zZW0pOwotCX0gZWxzZSB7Ci0JCXJldHZhbCA9IFNETF9TZW1XYWl0VGltZW91dChjb25kLT53YWl0X3NlbSwgbXMpOwotCX0KLQotCS8qIExldCB0aGUgc2lnbmFsZXIga25vdyB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgd2FpdCwgb3RoZXJ3aXNlCi0gICAgICAgICAgIHRoZSBzaWduYWxlciBjYW4gcmFjZSBhaGVhZCBhbmQgZ2V0IHRoZSBjb25kaXRpb24gc2VtYXBob3JlCi0gICAgICAgICAgIGlmIHdlIGFyZSBzdG9wcGVkIGJldHdlZW4gdGhlIG11dGV4IHVubG9jayBhbmQgc2VtYXBob3JlIHdhaXQsCi0gICAgICAgICAgIGdpdmluZyBhIGRlYWRsb2NrLiAgU2VlIHRoZSBmb2xsb3dpbmcgVVJMIGZvciBkZXRhaWxzOgotICAgICAgICBodHRwOi8vd3d3LWNsYXNzaWMuYmUuY29tL2Fib3V0YmUvYmVuZXdzbGV0dGVyL3ZvbHVtZV9JSUkvSXNzdWU0MC5odG1sCi0JKi8KLQlTRExfTG9ja011dGV4KGNvbmQtPmxvY2spOwotCWlmICggY29uZC0+c2lnbmFscyA+IDAgKSB7Ci0JCS8qIElmIHdlIHRpbWVkIG91dCwgd2UgbmVlZCB0byBlYXQgYSBjb25kaXRpb24gc2lnbmFsICovCi0JCWlmICggcmV0dmFsID4gMCApIHsKLQkJCVNETF9TZW1XYWl0KGNvbmQtPndhaXRfc2VtKTsKLQkJfQotCQkvKiBXZSBhbHdheXMgbm90aWZ5IHRoZSBzaWduYWwgdGhyZWFkIHRoYXQgd2UgYXJlIGRvbmUgKi8KLQkJU0RMX1NlbVBvc3QoY29uZC0+d2FpdF9kb25lKTsKLQotCQkvKiBTaWduYWwgaGFuZHNoYWtlIGNvbXBsZXRlICovCi0JCS0tY29uZC0+c2lnbmFsczsKLQl9Ci0JLS1jb25kLT53YWl0aW5nOwotCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKLQotCS8qIExvY2sgdGhlIG11dGV4LCBhcyBpcyByZXF1aXJlZCBieSBjb25kaXRpb24gdmFyaWFibGUgc2VtYW50aWNzICovCi0JU0RMX0xvY2tNdXRleChtdXRleCk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgZm9yZXZlciAqLwotaW50IFNETF9Db25kV2FpdChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCkKLXsKLQlyZXR1cm4gU0RMX0NvbmRXYWl0VGltZW91dChjb25kLCBtdXRleCwgU0RMX01VVEVYX01BWFdBSVQpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzbXV0ZXguYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2dlbmVyaWMvU0RMX3N5c211dGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDk5ZDIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzbXV0ZXguYworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogQW4gaW1wbGVtZW50YXRpb24gb2YgbXV0ZXhlcyB1c2luZyBzZW1hcGhvcmVzICovCi0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX3N5c3RocmVhZF9jLmgiCi0KLQotc3RydWN0IFNETF9tdXRleCB7Ci0JaW50IHJlY3Vyc2l2ZTsKLQlVaW50MzIgb3duZXI7Ci0JU0RMX3NlbSAqc2VtOwotfTsKLQotLyogQ3JlYXRlIGEgbXV0ZXggKi8KLVNETF9tdXRleCAqU0RMX0NyZWF0ZU11dGV4KHZvaWQpCi17Ci0JU0RMX211dGV4ICptdXRleDsKLQotCS8qIEFsbG9jYXRlIG11dGV4IG1lbW9yeSAqLwotCW11dGV4ID0gKFNETF9tdXRleCAqKVNETF9tYWxsb2Moc2l6ZW9mKCptdXRleCkpOwotCWlmICggbXV0ZXggKSB7Ci0JCS8qIENyZWF0ZSB0aGUgbXV0ZXggc2VtYXBob3JlLCB3aXRoIGluaXRpYWwgdmFsdWUgMSAqLwotCQltdXRleC0+c2VtID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSgxKTsKLQkJbXV0ZXgtPnJlY3Vyc2l2ZSA9IDA7Ci0JCW11dGV4LT5vd25lciA9IDA7Ci0JCWlmICggISBtdXRleC0+c2VtICkgewotCQkJU0RMX2ZyZWUobXV0ZXgpOwotCQkJbXV0ZXggPSBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JfQotCXJldHVybiBtdXRleDsKLX0KLQotLyogRnJlZSB0aGUgbXV0ZXggKi8KLXZvaWQgU0RMX0Rlc3Ryb3lNdXRleChTRExfbXV0ZXggKm11dGV4KQotewotCWlmICggbXV0ZXggKSB7Ci0JCWlmICggbXV0ZXgtPnNlbSApIHsKLQkJCVNETF9EZXN0cm95U2VtYXBob3JlKG11dGV4LT5zZW0pOwotCQl9Ci0JCVNETF9mcmVlKG11dGV4KTsKLQl9Ci19Ci0KLS8qIExvY2sgdGhlIHNlbWFwaG9yZSAqLwotaW50IFNETF9tdXRleFAoU0RMX211dGV4ICptdXRleCkKLXsKLSNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAotCXJldHVybiAwOwotI2Vsc2UKLQlVaW50MzIgdGhpc190aHJlYWQ7Ci0KLQlpZiAoIG11dGV4ID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JdGhpc190aHJlYWQgPSBTRExfVGhyZWFkSUQoKTsKLQlpZiAoIG11dGV4LT5vd25lciA9PSB0aGlzX3RocmVhZCApIHsKLQkJKyttdXRleC0+cmVjdXJzaXZlOwotCX0gZWxzZSB7Ci0JCS8qIFRoZSBvcmRlciBvZiBvcGVyYXRpb25zIGlzIGltcG9ydGFudC4KLQkJICAgV2Ugc2V0IHRoZSBsb2NraW5nIHRocmVhZCBpZCBhZnRlciB3ZSBvYnRhaW4gdGhlIGxvY2sKLQkJICAgc28gdW5sb2NrcyBmcm9tIG90aGVyIHRocmVhZHMgd2lsbCBmYWlsLgotCQkqLwotCQlTRExfU2VtV2FpdChtdXRleC0+c2VtKTsKLQkJbXV0ZXgtPm93bmVyID0gdGhpc190aHJlYWQ7Ci0JCW11dGV4LT5yZWN1cnNpdmUgPSAwOwotCX0KLQotCXJldHVybiAwOwotI2VuZGlmIC8qIFNETF9USFJFQURTX0RJU0FCTEVEICovCi19Ci0KLS8qIFVubG9jayB0aGUgbXV0ZXggKi8KLWludCBTRExfbXV0ZXhWKFNETF9tdXRleCAqbXV0ZXgpCi17Ci0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLQlyZXR1cm4gMDsKLSNlbHNlCi0JaWYgKCBtdXRleCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIElmIHdlIGRvbid0IG93biB0aGUgbXV0ZXgsIHdlIGNhbid0IHVubG9jayBpdCAqLwotCWlmICggU0RMX1RocmVhZElEKCkgIT0gbXV0ZXgtPm93bmVyICkgewotCQlTRExfU2V0RXJyb3IoIm11dGV4IG5vdCBvd25lZCBieSB0aGlzIHRocmVhZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBtdXRleC0+cmVjdXJzaXZlICkgewotCQktLW11dGV4LT5yZWN1cnNpdmU7Ci0JfSBlbHNlIHsKLQkJLyogVGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgaW1wb3J0YW50LgotCQkgICBGaXJzdCByZXNldCB0aGUgb3duZXIgc28gYW5vdGhlciB0aHJlYWQgZG9lc24ndCBsb2NrCi0JCSAgIHRoZSBtdXRleCBhbmQgc2V0IHRoZSBvd25lcnNoaXAgYmVmb3JlIHdlIHJlc2V0IGl0LAotCQkgICB0aGVuIHJlbGVhc2UgdGhlIGxvY2sgc2VtYXBob3JlLgotCQkgKi8KLQkJbXV0ZXgtPm93bmVyID0gMDsKLQkJU0RMX1NlbVBvc3QobXV0ZXgtPnNlbSk7Ci0JfQotCXJldHVybiAwOwotI2VuZGlmIC8qIFNETF9USFJFQURTX0RJU0FCTEVEICovCi19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXNtdXRleF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXNtdXRleF9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDU1MDkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzbXV0ZXhfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2dlbmVyaWMvU0RMX3N5c3NlbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzc2VtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZmZkM2YuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzc2VtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFuIGltcGxlbWVudGF0aW9uIG9mIHNlbWFwaG9yZXMgdXNpbmcgbXV0ZXhlcyBhbmQgY29uZGl0aW9uIHZhcmlhYmxlcyAqLwotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIlNETF9zeXN0aHJlYWRfYy5oIgotCi0KLSNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAotCi1TRExfc2VtICpTRExfQ3JlYXRlU2VtYXBob3JlKFVpbnQzMiBpbml0aWFsX3ZhbHVlKQotewotCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKLQlyZXR1cm4gKFNETF9zZW0gKikwOwotfQotCi12b2lkIFNETF9EZXN0cm95U2VtYXBob3JlKFNETF9zZW0gKnNlbSkKLXsKLQlyZXR1cm47Ci19Ci0KLWludCBTRExfU2VtVHJ5V2FpdChTRExfc2VtICpzZW0pCi17Ci0JU0RMX1NldEVycm9yKCJTREwgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aHJlYWQgc3VwcG9ydCIpOwotCXJldHVybiAtMTsKLX0KLQotaW50IFNETF9TZW1XYWl0VGltZW91dChTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0KQotewotCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLWludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCi17Ci0JU0RMX1NldEVycm9yKCJTREwgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aHJlYWQgc3VwcG9ydCIpOwotCXJldHVybiAtMTsKLX0KLQotVWludDMyIFNETF9TZW1WYWx1ZShTRExfc2VtICpzZW0pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBTRExfU2VtUG9zdChTRExfc2VtICpzZW0pCi17Ci0JU0RMX1NldEVycm9yKCJTREwgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aHJlYWQgc3VwcG9ydCIpOwotCXJldHVybiAtMTsKLX0KLQotI2Vsc2UKLQotc3RydWN0IFNETF9zZW1hcGhvcmUKLXsKLQlVaW50MzIgY291bnQ7Ci0JVWludDMyIHdhaXRlcnNfY291bnQ7Ci0JU0RMX211dGV4ICpjb3VudF9sb2NrOwotCVNETF9jb25kICpjb3VudF9ub256ZXJvOwotfTsKLQotU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKLXsKLQlTRExfc2VtICpzZW07Ci0KLQlzZW0gPSAoU0RMX3NlbSAqKVNETF9tYWxsb2Moc2l6ZW9mKCpzZW0pKTsKLQlpZiAoICEgc2VtICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNlbS0+Y291bnQgPSBpbml0aWFsX3ZhbHVlOwotCXNlbS0+d2FpdGVyc19jb3VudCA9IDA7Ci0KLQlzZW0tPmNvdW50X2xvY2sgPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLQlzZW0tPmNvdW50X25vbnplcm8gPSBTRExfQ3JlYXRlQ29uZCgpOwotCWlmICggISBzZW0tPmNvdW50X2xvY2sgfHwgISBzZW0tPmNvdW50X25vbnplcm8gKSB7Ci0JCVNETF9EZXN0cm95U2VtYXBob3JlKHNlbSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiBzZW07Ci19Ci0KLS8qIFdBUk5JTkc6Ci0gICBZb3UgY2Fubm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGFub3RoZXIgdGhyZWFkIGlzIHVzaW5nIHRoZSBzZW1hcGhvcmUuCi0qLwotdm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCi17Ci0JaWYgKCBzZW0gKSB7Ci0JCXNlbS0+Y291bnQgPSAweEZGRkZGRkZGOwotCQl3aGlsZSAoIHNlbS0+d2FpdGVyc19jb3VudCA+IDApIHsKLQkJCVNETF9Db25kU2lnbmFsKHNlbS0+Y291bnRfbm9uemVybyk7Ci0JCQlTRExfRGVsYXkoMTApOwotCQl9Ci0JCVNETF9EZXN0cm95Q29uZChzZW0tPmNvdW50X25vbnplcm8pOwotCQlpZiAoIHNlbS0+Y291bnRfbG9jayApIHsKLQkJCVNETF9tdXRleFAoc2VtLT5jb3VudF9sb2NrKTsKLQkJCVNETF9tdXRleFYoc2VtLT5jb3VudF9sb2NrKTsKLQkJCVNETF9EZXN0cm95TXV0ZXgoc2VtLT5jb3VudF9sb2NrKTsKLQkJfQotCQlTRExfZnJlZShzZW0pOwotCX0KLX0KLQotaW50IFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCAhIHNlbSApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dmFsID0gU0RMX01VVEVYX1RJTUVET1VUOwotCVNETF9Mb2NrTXV0ZXgoc2VtLT5jb3VudF9sb2NrKTsKLQlpZiAoIHNlbS0+Y291bnQgPiAwICkgewotCQktLXNlbS0+Y291bnQ7Ci0JCXJldHZhbCA9IDA7Ci0JfQotCVNETF9VbmxvY2tNdXRleChzZW0tPmNvdW50X2xvY2spOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotaW50IFNETF9TZW1XYWl0VGltZW91dChTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0KQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBBIHRpbWVvdXQgb2YgMCBpcyBhbiBlYXN5IGNhc2UgKi8KLQlpZiAoIHRpbWVvdXQgPT0gMCApIHsKLQkJcmV0dXJuIFNETF9TZW1UcnlXYWl0KHNlbSk7Ci0JfQotCi0JU0RMX0xvY2tNdXRleChzZW0tPmNvdW50X2xvY2spOwotCSsrc2VtLT53YWl0ZXJzX2NvdW50OwotCXJldHZhbCA9IDA7Ci0Jd2hpbGUgKCAoc2VtLT5jb3VudCA9PSAwKSAmJiAocmV0dmFsICE9IFNETF9NVVRFWF9USU1FRE9VVCkgKSB7Ci0JCXJldHZhbCA9IFNETF9Db25kV2FpdFRpbWVvdXQoc2VtLT5jb3VudF9ub256ZXJvLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbS0+Y291bnRfbG9jaywgdGltZW91dCk7Ci0JfQotCS0tc2VtLT53YWl0ZXJzX2NvdW50OwotCS0tc2VtLT5jb3VudDsKLQlTRExfVW5sb2NrTXV0ZXgoc2VtLT5jb3VudF9sb2NrKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCi17Ci0JcmV0dXJuIFNETF9TZW1XYWl0VGltZW91dChzZW0sIFNETF9NVVRFWF9NQVhXQUlUKTsKLX0KLQotVWludDMyIFNETF9TZW1WYWx1ZShTRExfc2VtICpzZW0pCi17Ci0JVWludDMyIHZhbHVlOwotCQotCXZhbHVlID0gMDsKLQlpZiAoIHNlbSApIHsKLQkJU0RMX0xvY2tNdXRleChzZW0tPmNvdW50X2xvY2spOwotCQl2YWx1ZSA9IHNlbS0+Y291bnQ7Ci0JCVNETF9VbmxvY2tNdXRleChzZW0tPmNvdW50X2xvY2spOwotCX0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLWludCBTRExfU2VtUG9zdChTRExfc2VtICpzZW0pCi17Ci0JaWYgKCAhIHNlbSApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JU0RMX0xvY2tNdXRleChzZW0tPmNvdW50X2xvY2spOwotCWlmICggc2VtLT53YWl0ZXJzX2NvdW50ID4gMCApIHsKLQkJU0RMX0NvbmRTaWduYWwoc2VtLT5jb3VudF9ub256ZXJvKTsKLQl9Ci0JKytzZW0tPmNvdW50OwotCVNETF9VbmxvY2tNdXRleChzZW0tPmNvdW50X2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBTRExfVEhSRUFEU19ESVNBQkxFRCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzdGhyZWFkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXN0aHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczOWFkNC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXN0aHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBUaHJlYWQgbWFuYWdlbWVudCByb3V0aW5lcyBmb3IgU0RMICovCi0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3RocmVhZC5oIgotCi1pbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzKQotewotCVNETF9TZXRFcnJvcigiVGhyZWFkcyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JcmV0dXJuKC0xKTsKLX0KLQotdm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCi17Ci0JcmV0dXJuOwotfQotCi1VaW50MzIgU0RMX1RocmVhZElEKHZvaWQpCi17Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIFNETF9TWVNfV2FpdFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0JcmV0dXJuOwotfQotCi12b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0JcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXN0aHJlYWRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzdGhyZWFkX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4NzZiMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXN0aHJlYWRfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFN0dWIgdW50aWwgd2UgaW1wbGVtZW50IHRocmVhZHMgb24gdGhpcyBwbGF0Zm9ybSAqLwotdHlwZWRlZiBpbnQgU1lTX1RocmVhZEhhbmRsZTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2lyaXgvU0RMX3N5c3NlbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvaXJpeC9TRExfc3lzc2VtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzMxMWIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvaXJpeC9TRExfc3lzc2VtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zZW0uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotCi0KLXN0cnVjdCBTRExfc2VtYXBob3JlIHsKLQlpbnQgaWQ7Ci19OwotCi0vKiBOb3QgZGVmaW5lZCBieSBtYW55IG9wZXJhdGluZyBzeXN0ZW1zLCB1c2UgY29uZmlndXJlIHRvIGRldGVjdCAqLwotLyoKLSNpZiAhZGVmaW5lZChIQVZFX1NFTVVOKQotdW5pb24gc2VtdW4gewotCWludCB2YWw7Ci0Jc3RydWN0IHNlbWlkX2RzICpidWY7Ci0JdXNob3J0ICphcnJheTsKLX07Ci0jZW5kaWYKLSovCi0KLXN0YXRpYyBzdHJ1Y3Qgc2VtYnVmIG9wX3RyeXdhaXRbMl0gPSB7Ci0JeyAwLCAtMSwgKElQQ19OT1dBSVR8U0VNX1VORE8pIH0gLyogRGVjcmVtZW50IHNlbWFwaG9yZSwgbm8gYmxvY2sgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHNlbWJ1ZiBvcF93YWl0WzJdID0gewotCXsgMCwgLTEsIFNFTV9VTkRPIH0JCS8qIERlY3JlbWVudCBzZW1hcGhvcmUgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHNlbWJ1ZiBvcF9wb3N0WzFdID0gewotCXsgMCwgMSwgKElQQ19OT1dBSVR8U0VNX1VORE8pIH0JLyogSW5jcmVtZW50IHNlbWFwaG9yZSAqLwotfTsKLQotLyogQ3JlYXRlIGEgYmxvY2thYmxlIHNlbWFwaG9yZSAqLwotU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKLXsKLQlleHRlcm4gaW50IF9jcmVhdGluZ190aHJlYWRfbG9jazsJLyogU0RMX3RocmVhZHMuYyAqLwotCVNETF9zZW0gKnNlbTsKLQl1bmlvbiBzZW11biBpbml0OwotCi0Jc2VtID0gKFNETF9zZW0gKilTRExfbWFsbG9jKHNpemVvZigqc2VtKSk7Ci0JaWYgKCBzZW0gPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0Jc2VtLT5pZCA9IHNlbWdldChJUENfUFJJVkFURSwgMSwgKDA2MDB8SVBDX0NSRUFUKSk7Ci0JaWYgKCBzZW0tPmlkIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgc2VtYXBob3JlIik7Ci0JCVNETF9mcmVlKHNlbSk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JaW5pdC52YWwgPSBpbml0aWFsX3ZhbHVlOwkvKiBJbml0aWFsaXplIHNlbWFwaG9yZSAqLwotCXNlbWN0bChzZW0tPmlkLCAwLCBTRVRWQUwsIGluaXQpOwotCXJldHVybihzZW0pOwotfQotCi12b2lkIFNETF9EZXN0cm95U2VtYXBob3JlKFNETF9zZW0gKnNlbSkKLXsKLQlpZiAoIHNlbSApIHsKLSNpZmRlZiBfX0lSSVhfXwotCQlzZW1jdGwoc2VtLT5pZCwgMCwgSVBDX1JNSUQpOwotI2Vsc2UKLQkJdW5pb24gc2VtdW4gZHVtbXk7Ci0JCWR1bW15LnZhbCA9IDA7Ci0JCXNlbWN0bChzZW0tPmlkLCAwLCBJUENfUk1JRCwgZHVtbXkpOwotI2VuZGlmCi0JCVNETF9mcmVlKHNlbSk7Ci0JfQotfQotCi1pbnQgU0RMX1NlbVRyeVdhaXQoU0RMX3NlbSAqc2VtKQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR2YWwgPSAwOwotICB0cnlhZ2FpbjoKLQlpZiAoIHNlbW9wKHNlbS0+aWQsIG9wX3RyeXdhaXQsIDEpIDwgMCApIHsKLQkJaWYgKCBlcnJubyA9PSBFSU5UUiApIHsKLQkJCWdvdG8gdHJ5YWdhaW47Ci0JCX0KLQkJcmV0dmFsID0gU0RMX01VVEVYX1RJTUVET1VUOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgU0RMX1NlbVdhaXQoU0RMX3NlbSAqc2VtKQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR2YWwgPSAwOwotICB0cnlhZ2FpbjoKLQlpZiAoIHNlbW9wKHNlbS0+aWQsIG9wX3dhaXQsIDEpIDwgMCApIHsKLQkJaWYgKCBlcnJubyA9PSBFSU5UUiApIHsKLQkJCWdvdG8gdHJ5YWdhaW47Ci0JCX0KLQkJU0RMX1NldEVycm9yKCJTZW1hcGhvcmUgb3BlcmF0aW9uIGVycm9yIik7Ci0JCXJldHZhbCA9IC0xOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFRyeSB0aGUgZWFzeSBjYXNlcyBmaXJzdCAqLwotCWlmICggdGltZW91dCA9PSAwICkgewotCQlyZXR1cm4gU0RMX1NlbVRyeVdhaXQoc2VtKTsKLQl9Ci0JaWYgKCB0aW1lb3V0ID09IFNETF9NVVRFWF9NQVhXQUlUICkgewotCQlyZXR1cm4gU0RMX1NlbVdhaXQoc2VtKTsKLQl9Ci0KLQkvKiBBY2shICBXZSBoYXZlIHRvIGJ1c3kgd2FpdC4uLiAqLwotCXRpbWVvdXQgKz0gU0RMX0dldFRpY2tzKCk7Ci0JZG8gewotCQlyZXR2YWwgPSBTRExfU2VtVHJ5V2FpdChzZW0pOwotCQlpZiAoIHJldHZhbCA9PSAwICkgewotCQkJYnJlYWs7Ci0JCX0KLQkJU0RMX0RlbGF5KDEpOwotCX0gd2hpbGUgKCBTRExfR2V0VGlja3MoKSA8IHRpbWVvdXQgKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLVVpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQotewotCWludCBzZW12YWw7Ci0JVWludDMyIHZhbHVlOwotCQotCXZhbHVlID0gMDsKLQlpZiAoIHNlbSApIHsKLQkgIHRyeWFnYWluOgotI2lmZGVmIF9fSVJJWF9fCi0JCXNlbXZhbCA9IHNlbWN0bChzZW0tPmlkLCAwLCBHRVRWQUwpOwotI2Vsc2UKLQkJewotCQl1bmlvbiBzZW11biBhcmc7Ci0JCWFyZy52YWwgPSAwOwotCQlzZW12YWwgPSBzZW1jdGwoc2VtLT5pZCwgMCwgR0VUVkFMLCBhcmcpOwotCQl9Ci0jZW5kaWYKLQkJaWYgKCBzZW12YWwgPCAwICkgewotCQkJaWYgKCBlcnJubyA9PSBFSU5UUiApIHsKLQkJCQlnb3RvIHRyeWFnYWluOwotCQkJfQotCQl9IGVsc2UgewotCQkJdmFsdWUgPSAoVWludDMyKXNlbXZhbDsKLQkJfQotCX0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLWludCBTRExfU2VtUG9zdChTRExfc2VtICpzZW0pCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHZhbCA9IDA7Ci0gIHRyeWFnYWluOgotCWlmICggc2Vtb3Aoc2VtLT5pZCwgb3BfcG9zdCwgMSkgPCAwICkgewotCQlpZiAoIGVycm5vID09IEVJTlRSICkgewotCQkJZ290byB0cnlhZ2FpbjsKLQkJfQotCQlTRExfU2V0RXJyb3IoIlNlbWFwaG9yZSBvcGVyYXRpb24gZXJyb3IiKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9pcml4L1NETF9zeXN0aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2lyaXgvU0RMX3N5c3RocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmE4NjU5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2lyaXgvU0RMX3N5c3RocmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIElSSVggdGhyZWFkIG1hbmFnZW1lbnQgcm91dGluZXMgZm9yIFNETCAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKLQotCi1zdGF0aWMgaW50IHNpZ19saXN0W10gPSB7Ci0JU0lHSFVQLCBTSUdJTlQsIFNJR1FVSVQsIFNJR1BJUEUsIFNJR0FMUk0sIFNJR1RFUk0sIFNJR0NMRCwgU0lHV0lOQ0gsCi0JU0lHVlRBTFJNLCBTSUdQUk9GLCAwCi19OwotCi0KLWludCBTRExfU1lTX0NyZWF0ZVRocmVhZChTRExfVGhyZWFkICp0aHJlYWQsIHZvaWQgKmFyZ3MpCi17Ci0JLyogQ3JlYXRlIHRoZSB0aHJlYWQgYW5kIGdvISAqLwotCWlmICggc3Byb2MoU0RMX1J1blRocmVhZCwgUFJfU0FMTCwgYXJncykgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIFNETF9TWVNfU2V0dXBUaHJlYWQodm9pZCkKLXsKLQlpbnQgaTsKLQlzaWdzZXRfdCBtYXNrOwotCi0JLyogTWFzayBhc3luY2hyb25vdXMgc2lnbmFscyBmb3IgdGhpcyB0aHJlYWQgKi8KLQlzaWdlbXB0eXNldCgmbWFzayk7Ci0JZm9yICggaT0wOyBzaWdfbGlzdFtpXTsgKytpICkgewotCQlzaWdhZGRzZXQoJm1hc2ssIHNpZ19saXN0W2ldKTsKLQl9Ci0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFzaywgTlVMTCk7Ci19Ci0KLS8qIFdBUk5JTkc6ICBUaGlzIG1heSBub3Qgd29yayBmb3Igc3lzdGVtcyB3aXRoIDY0LWJpdCBwaWRfdCAqLwotVWludDMyIFNETF9UaHJlYWRJRCh2b2lkKQotewotCXJldHVybigoVWludDMyKWdldHBpZCgpKTsKLX0KLQotLyogV0FSTklORzogIFRoaXMgbWF5IG5vdCB3b3JrIGZvciBzeXN0ZW1zIHdpdGggNjQtYml0IHBpZF90ICovCi12b2lkIFNETF9XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgaW50ICpzdGF0dXMpCi17Ci0JZXJybm8gPSAwOwotCXdoaWxlICggZXJybm8gIT0gRUNISUxEICkgewotCQl3YWl0cGlkKHRocmVhZC0+aGFuZGxlLCBOVUxMLCAwKTsKLQl9Ci19Ci0KLS8qIFdBUk5JTkc6ICBUaGlzIG1heSBub3Qgd29yayBmb3Igc3lzdGVtcyB3aXRoIDY0LWJpdCBwaWRfdCAqLwotdm9pZCBTRExfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0Ja2lsbCh0aHJlYWQtPmhhbmRsZSwgU0lHS0lMTCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2lyaXgvU0RMX3N5c3RocmVhZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9pcml4L1NETF9zeXN0aHJlYWRfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmUxNDFhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL2lyaXgvU0RMX3N5c3RocmVhZF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi10eXBlZGVmIHBpZF90IFNZU19UaHJlYWRIYW5kbGU7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL29zMi9TRExfc3lzY29uZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvb3MyL1NETF9zeXNjb25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTc3ZTQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvb3MyL1NETF9zeXNjb25kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFuIGltcGxlbWVudGF0aW9uIG9mIGNvbmRpdGlvbiB2YXJpYWJsZXMgdXNpbmcgc2VtYXBob3JlcyBhbmQgbXV0ZXhlcyAqLwotLyoKLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gYm9ycm93cyBoZWF2aWx5IGZyb20gdGhlIEJlT1MgY29uZGl0aW9uIHZhcmlhYmxlCi0gICBpbXBsZW1lbnRhdGlvbiwgd3JpdHRlbiBieSBDaHJpc3RvcGhlciBUYXRlIGFuZCBPd2VuIFNtaXRoLiAgVGhhbmtzIQotICovCi0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0KLXN0cnVjdCBTRExfY29uZAotewotCVNETF9tdXRleCAqbG9jazsKLQlpbnQgd2FpdGluZzsKLQlpbnQgc2lnbmFsczsKLQlTRExfc2VtICp3YWl0X3NlbTsKLQlTRExfc2VtICp3YWl0X2RvbmU7Ci19OwotCi0vKiBDcmVhdGUgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KLURFQ0xTUEVDIFNETF9jb25kICogU0RMQ0FMTCBTRExfQ3JlYXRlQ29uZCh2b2lkKQotewotCVNETF9jb25kICpjb25kOwotCi0JY29uZCA9IChTRExfY29uZCAqKSBTRExfbWFsbG9jKHNpemVvZihTRExfY29uZCkpOwotCWlmICggY29uZCApIHsKLQkJY29uZC0+bG9jayA9IFNETF9DcmVhdGVNdXRleCgpOwotCQljb25kLT53YWl0X3NlbSA9IFNETF9DcmVhdGVTZW1hcGhvcmUoMCk7Ci0JCWNvbmQtPndhaXRfZG9uZSA9IFNETF9DcmVhdGVTZW1hcGhvcmUoMCk7Ci0JCWNvbmQtPndhaXRpbmcgPSBjb25kLT5zaWduYWxzID0gMDsKLQkJaWYgKCAhIGNvbmQtPmxvY2sgfHwgISBjb25kLT53YWl0X3NlbSB8fCAhIGNvbmQtPndhaXRfZG9uZSApIHsKLQkJCVNETF9EZXN0cm95Q29uZChjb25kKTsKLQkJCWNvbmQgPSBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JfQotCXJldHVybihjb25kKTsKLX0KLQotLyogRGVzdHJveSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLwotREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9EZXN0cm95Q29uZChTRExfY29uZCAqY29uZCkKLXsKLQlpZiAoIGNvbmQgKSB7Ci0JCWlmICggY29uZC0+d2FpdF9zZW0gKSB7Ci0JCQlTRExfRGVzdHJveVNlbWFwaG9yZShjb25kLT53YWl0X3NlbSk7Ci0JCX0KLQkJaWYgKCBjb25kLT53YWl0X2RvbmUgKSB7Ci0JCQlTRExfRGVzdHJveVNlbWFwaG9yZShjb25kLT53YWl0X2RvbmUpOwotCQl9Ci0JCWlmICggY29uZC0+bG9jayApIHsKLQkJCVNETF9EZXN0cm95TXV0ZXgoY29uZC0+bG9jayk7Ci0JCX0KLQkJU0RMX2ZyZWUoY29uZCk7Ci0JfQotfQotCi0vKiBSZXN0YXJ0IG9uZSBvZiB0aGUgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KLURFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Db25kU2lnbmFsKFNETF9jb25kICpjb25kKQotewotCWlmICggISBjb25kICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBJZiB0aGVyZSBhcmUgd2FpdGluZyB0aHJlYWRzIG5vdCBhbHJlYWR5IHNpZ25hbGxlZCwgdGhlbgotCSAgIHNpZ25hbCB0aGUgY29uZGl0aW9uIGFuZCB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIHJlc3BvbmQuCi0JKi8KLQlTRExfTG9ja011dGV4KGNvbmQtPmxvY2spOwotCWlmICggY29uZC0+d2FpdGluZyA+IGNvbmQtPnNpZ25hbHMgKSB7Ci0JCSsrY29uZC0+c2lnbmFsczsKLQkJU0RMX1NlbVBvc3QoY29uZC0+d2FpdF9zZW0pOwotCQlTRExfVW5sb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JCVNETF9TZW1XYWl0KGNvbmQtPndhaXRfZG9uZSk7Ci0JfSBlbHNlIHsKLQkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBSZXN0YXJ0IGFsbCB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSAqLwotREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NvbmRCcm9hZGNhc3QoU0RMX2NvbmQgKmNvbmQpCi17Ci0JaWYgKCAhIGNvbmQgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIElmIHRoZXJlIGFyZSB3YWl0aW5nIHRocmVhZHMgbm90IGFscmVhZHkgc2lnbmFsbGVkLCB0aGVuCi0JICAgc2lnbmFsIHRoZSBjb25kaXRpb24gYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gcmVzcG9uZC4KLQkqLwotCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JaWYgKCBjb25kLT53YWl0aW5nID4gY29uZC0+c2lnbmFscyApIHsKLQkJaW50IGksIG51bV93YWl0aW5nOwotCi0JCW51bV93YWl0aW5nID0gKGNvbmQtPndhaXRpbmcgLSBjb25kLT5zaWduYWxzKTsKLQkJY29uZC0+c2lnbmFscyA9IGNvbmQtPndhaXRpbmc7Ci0JCWZvciAoIGk9MDsgaTxudW1fd2FpdGluZzsgKytpICkgewotCQkJU0RMX1NlbVBvc3QoY29uZC0+d2FpdF9zZW0pOwotCQl9Ci0JCS8qIE5vdyBhbGwgcmVsZWFzZWQgdGhyZWFkcyBhcmUgYmxvY2tlZCBoZXJlLCB3YWl0aW5nIGZvciB1cy4KLQkJICAgQ29sbGVjdCB0aGVtIGFsbCAoYW5kIHdpbiBmYWJ1bG91cyBwcml6ZXMhKSA6LSkKLQkJICovCi0JCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKLQkJZm9yICggaT0wOyBpPG51bV93YWl0aW5nOyArK2kgKSB7Ci0JCQlTRExfU2VtV2FpdChjb25kLT53YWl0X2RvbmUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgZm9yIGF0IG1vc3QgJ21zJyBtaWxsaXNlY29uZHMuCi0gICBUaGUgbXV0ZXggbXVzdCBiZSBsb2NrZWQgYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuY3Rpb24hCi0gICBUaGUgbXV0ZXggaXMgdW5sb2NrZWQgZHVyaW5nIHRoZSB3YWl0LCBhbmQgbG9ja2VkIGFnYWluIGFmdGVyIHRoZSB3YWl0LgotCi1UeXBpY2FsIHVzZToKLQotVGhyZWFkIEE6Ci0JU0RMX0xvY2tNdXRleChsb2NrKTsKLQl3aGlsZSAoICEgY29uZGl0aW9uICkgewotCQlTRExfQ29uZFdhaXQoY29uZCk7Ci0JfQotCVNETF9VbmxvY2tNdXRleChsb2NrKTsKLQotVGhyZWFkIEI6Ci0JU0RMX0xvY2tNdXRleChsb2NrKTsKLQkuLi4KLQljb25kaXRpb24gPSB0cnVlOwotCS4uLgotCVNETF9VbmxvY2tNdXRleChsb2NrKTsKLSAqLwotREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NvbmRXYWl0VGltZW91dChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCwgVWludDMyIG1zKQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgY29uZCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogT2J0YWluIHRoZSBwcm90ZWN0aW9uIG11dGV4LCBhbmQgaW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygd2FpdGVycy4KLQkgICBUaGlzIGFsbG93cyB0aGUgc2lnbmFsIG1lY2hhbmlzbSB0byBvbmx5IHBlcmZvcm0gYSBzaWduYWwgaWYgdGhlcmUKLQkgICBhcmUgd2FpdGluZyB0aHJlYWRzLgotCSAqLwotCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JKytjb25kLT53YWl0aW5nOwotCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKLQotCS8qIFVubG9jayB0aGUgbXV0ZXgsIGFzIGlzIHJlcXVpcmVkIGJ5IGNvbmRpdGlvbiB2YXJpYWJsZSBzZW1hbnRpY3MgKi8KLQlTRExfVW5sb2NrTXV0ZXgobXV0ZXgpOwotCi0JLyogV2FpdCBmb3IgYSBzaWduYWwgKi8KLQlpZiAoIG1zID09IFNETF9NVVRFWF9NQVhXQUlUICkgewotCQlyZXR2YWwgPSBTRExfU2VtV2FpdChjb25kLT53YWl0X3NlbSk7Ci0JfSBlbHNlIHsKLQkJcmV0dmFsID0gU0RMX1NlbVdhaXRUaW1lb3V0KGNvbmQtPndhaXRfc2VtLCBtcyk7Ci0JfQotCi0JLyogTGV0IHRoZSBzaWduYWxlciBrbm93IHdlIGhhdmUgY29tcGxldGVkIHRoZSB3YWl0LCBvdGhlcndpc2UKLSAgICAgICAgICAgdGhlIHNpZ25hbGVyIGNhbiByYWNlIGFoZWFkIGFuZCBnZXQgdGhlIGNvbmRpdGlvbiBzZW1hcGhvcmUKLSAgICAgICAgICAgaWYgd2UgYXJlIHN0b3BwZWQgYmV0d2VlbiB0aGUgbXV0ZXggdW5sb2NrIGFuZCBzZW1hcGhvcmUgd2FpdCwKLSAgICAgICAgICAgZ2l2aW5nIGEgZGVhZGxvY2suICBTZWUgdGhlIGZvbGxvd2luZyBVUkwgZm9yIGRldGFpbHM6Ci0gICAgICAgIGh0dHA6Ly93d3ctY2xhc3NpYy5iZS5jb20vYWJvdXRiZS9iZW5ld3NsZXR0ZXIvdm9sdW1lX0lJSS9Jc3N1ZTQwLmh0bWwKLQkqLwotCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7Ci0JaWYgKCBjb25kLT5zaWduYWxzID4gMCApIHsKLQkJLyogSWYgd2UgdGltZWQgb3V0LCB3ZSBuZWVkIHRvIGVhdCBhIGNvbmRpdGlvbiBzaWduYWwgKi8KLQkJaWYgKCByZXR2YWwgPiAwICkgewotCQkJU0RMX1NlbVdhaXQoY29uZC0+d2FpdF9zZW0pOwotCQl9Ci0JCS8qIFdlIGFsd2F5cyBub3RpZnkgdGhlIHNpZ25hbCB0aHJlYWQgdGhhdCB3ZSBhcmUgZG9uZSAqLwotCQlTRExfU2VtUG9zdChjb25kLT53YWl0X2RvbmUpOwotCi0JCS8qIFNpZ25hbCBoYW5kc2hha2UgY29tcGxldGUgKi8KLQkJLS1jb25kLT5zaWduYWxzOwotCX0KLQktLWNvbmQtPndhaXRpbmc7Ci0JU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOwotCi0JLyogTG9jayB0aGUgbXV0ZXgsIGFzIGlzIHJlcXVpcmVkIGJ5IGNvbmRpdGlvbiB2YXJpYWJsZSBzZW1hbnRpY3MgKi8KLQlTRExfTG9ja011dGV4KG11dGV4KTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3JldmVyICovCi1ERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfQ29uZFdhaXQoU0RMX2NvbmQgKmNvbmQsIFNETF9tdXRleCAqbXV0ZXgpCi17Ci0JcmV0dXJuIFNETF9Db25kV2FpdFRpbWVvdXQoY29uZCwgbXV0ZXgsIFNETF9NVVRFWF9NQVhXQUlUKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL29zMi9TRExfc3lzY29uZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9vczIvU0RMX3N5c2NvbmRfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Q1NTA5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL29zMi9TRExfc3lzY29uZF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvb3MyL1NETF9zeXNtdXRleC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvb3MyL1NETF9zeXNtdXRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTc1Y2NlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL29zMi9TRExfc3lzbXV0ZXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogTXV0ZXggZnVuY3Rpb25zIHVzaW5nIHRoZSBPUy8yIEFQSSAqLwotCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfRE9TU0VNQVBIT1JFUwotI2luY2x1ZGUgPG9zMi5oPgotCi0jaW5jbHVkZSAiU0RMX211dGV4LmgiCi0KLQotc3RydWN0IFNETF9tdXRleCB7Ci0JSE1UWCBobXR4SUQ7Ci19OwotCi0vKiBDcmVhdGUgYSBtdXRleCAqLwotREVDTFNQRUMgU0RMX211dGV4ICogU0RMQ0FMTCBTRExfQ3JlYXRlTXV0ZXgodm9pZCkKLXsKLSAgU0RMX211dGV4ICptdXRleDsKLSAgQVBJUkVUIHVscmM7Ci0KLSAgLyogQWxsb2NhdGUgbXV0ZXggbWVtb3J5ICovCi0gIG11dGV4ID0gKFNETF9tdXRleCAqKVNETF9tYWxsb2Moc2l6ZW9mKCptdXRleCkpOwotICBpZiAobXV0ZXgpCi0gIHsKLSAgICAvKiBDcmVhdGUgdGhlIG11dGV4LCB3aXRoIGluaXRpYWwgdmFsdWUgc2lnbmFsZWQgKi8KLSAgICB1bHJjID0gRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdW5uYW1lZCBzZW1hcGhvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihtdXRleC0+aG10eElEKSwgICAgICAvLyBQb2ludGVyIHRvIGhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwgICAgICAgICAgICAgICAgICAgIC8vIEZsYWdzOiBjcmVhdGUgaXQgcHJpdmF0ZSAobm90IHNoYXJlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOyAgICAgICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlOiB1bm93bmVkCi0gICAgaWYgKHVscmMhPU5PX0VSUk9SKQotICAgIHsKLSAgICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIG11dGV4Iik7Ci0gICAgICBTRExfZnJlZShtdXRleCk7Ci0gICAgICBtdXRleCA9IE5VTEw7Ci0gICAgfQotICB9IGVsc2UgewotICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICB9Ci0gIHJldHVybihtdXRleCk7Ci19Ci0KLS8qIEZyZWUgdGhlIG11dGV4ICovCi1ERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0Rlc3Ryb3lNdXRleChTRExfbXV0ZXggKm11dGV4KQotewotICBpZiAoIG11dGV4ICkKLSAgewotICAgIGlmICggbXV0ZXgtPmhtdHhJRCApCi0gICAgewotICAgICAgRG9zQ2xvc2VNdXRleFNlbShtdXRleC0+aG10eElEKTsKLSAgICAgIG11dGV4LT5obXR4SUQgPSAwOwotICAgIH0KLSAgICBTRExfZnJlZShtdXRleCk7Ci0gIH0KLX0KLQotLyogTG9jayB0aGUgbXV0ZXggKi8KLURFQ0xTUEVDIGludCBTRExDQUxMIFNETF9tdXRleFAoU0RMX211dGV4ICptdXRleCkKLXsKLSAgaWYgKCBtdXRleCA9PSBOVUxMICkKLSAgewotICAgIFNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoIERvc1JlcXVlc3RNdXRleFNlbShtdXRleC0+aG10eElELCBTRU1fSU5ERUZJTklURV9XQUlUKSAhPSBOT19FUlJPUiApCi0gIHsKLSAgICBTRExfU2V0RXJyb3IoIkNvdWxkbid0IHdhaXQgb24gbXV0ZXgiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuKDApOwotfQotCi0vKiBVbmxvY2sgdGhlIG11dGV4ICovCi1ERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfbXV0ZXhWKFNETF9tdXRleCAqbXV0ZXgpCi17Ci0gIGlmICggbXV0ZXggPT0gTlVMTCApCi0gIHsKLSAgICBTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKCBEb3NSZWxlYXNlTXV0ZXhTZW0obXV0ZXgtPmhtdHhJRCkgIT0gTk9fRVJST1IgKQotICB7Ci0gICAgU0RMX1NldEVycm9yKCJDb3VsZG4ndCByZWxlYXNlIG11dGV4Iik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL29zMi9TRExfc3lzc2VtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9vczIvU0RMX3N5c3NlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ1OTM0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL29zMi9TRExfc3lzc2VtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFNlbWFwaG9yZSBmdW5jdGlvbnMgdXNpbmcgdGhlIE9TLzIgQVBJICovCi0KLSNkZWZpbmUgSU5DTF9ET1MKLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNkZWZpbmUgSU5DTF9ET1NTRU1BUEhPUkVTCi0jaW5jbHVkZSA8b3MyLmg+Ci0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0KLQotc3RydWN0IFNETF9zZW1hcGhvcmUgewotICAgICAgICBITVRYIGlkOwotICAgICAgICBIRVYgIGNoYW5nZWQ7Ci0gICAgICAgIFVpbnQzMiB2YWx1ZTsKLX07Ci0KLQotLyogQ3JlYXRlIGEgc2VtYXBob3JlICovCi1ERUNMU1BFQyBTRExfc2VtICogU0RMQ0FMTCBTRExfQ3JlYXRlU2VtYXBob3JlKFVpbnQzMiBpbml0aWFsX3ZhbHVlKQotewotICAgICAgICBTRExfc2VtICpzZW07Ci0gICAgICAgIFVMT05HIHVscmM7Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgc2VtIG1lbW9yeSAqLwotICAgICAgICBzZW0gPSAoU0RMX3NlbSAqKVNETF9tYWxsb2Moc2l6ZW9mKCpzZW0pKTsKLSAgICAgICAgaWYgKCBzZW0gKSB7Ci0gICAgICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBtdXRleCBzZW1hcGhvcmUgKi8KLSAgICAgICAgICAgICAgICB1bHJjID0gRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwmKHNlbS0+aWQpLDAsVFJVRSk7Ci0gICAgICAgICAgICAgICAgaWYgKCB1bHJjICkgewotICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgc2VtYXBob3JlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRExfZnJlZShzZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VtID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICYoc2VtLT5jaGFuZ2VkKSwgMCwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICBzZW0tPnZhbHVlID0gaW5pdGlhbF92YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKHNlbS0+aWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4oc2VtKTsKLX0KLQotLyogRnJlZSB0aGUgc2VtYXBob3JlICovCi1ERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoU0RMX3NlbSAqc2VtKQotewotICAgICAgICBpZiAoIHNlbSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNlbS0+aWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEb3NDbG9zZUV2ZW50U2VtKHNlbS0+Y2hhbmdlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEb3NDbG9zZU11dGV4U2VtKHNlbS0+aWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VtLT5pZCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNETF9mcmVlKHNlbSk7Ci0gICAgICAgIH0KLX0KLQotREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCi17Ci0gICAgICAgIFVMT05HIHVscmM7Ci0KLSAgICAgICAgaWYgKCAhIHNlbSApIHsKLSAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB0aW1lb3V0ID09IFNETF9NVVRFWF9NQVhXQUlUICkgewotICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICB1bHJjID0gRG9zUmVxdWVzdE11dGV4U2VtKHNlbS0+aWQsIFNFTV9JTkRFRklOSVRFX1dBSVQpOwotICAgICAgICAgICAgICBpZiAodWxyYykgewotICAgICAgICAgICAgICAgICAvKiBpZiBlcnJvciB3YWl0aW5nIG11dGV4ICovCi0gICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigiRG9zUmVxdWVzdE11dGV4U2VtKCkgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZW0tPnZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW0tPnZhbHVlLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oc2VtLT5pZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyB1bFBvc3RDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIERvc1Jlc2V0RXZlbnRTZW0oc2VtLT5jaGFuZ2VkLCAmdWxQb3N0Q291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKHNlbS0+aWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGludWUgd2FpdGluZyB1bnRpbCBzb21lYm9keSBwb3N0cyB0aGUgc2VtYXBob3JlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBEb3NXYWl0RXZlbnRTZW0oc2VtLT5jaGFuZ2VkLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgaWYgKCB0aW1lb3V0ID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1bHJjID0gRG9zUmVxdWVzdE11dGV4U2VtKHNlbS0+aWQsIFNFTV9JTkRFRklOSVRFX1dBSVQpOwotICAgICAgICAgICAgaWYgKHVscmM9PU5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzZW0tPnZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VtLT52YWx1ZS0tOwotICAgICAgICAgICAgICAgICAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oc2VtLT5pZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKHNlbS0+aWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0RMX01VVEVYX1RJTUVET1VUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigiRG9zUmVxdWVzdE11dGV4U2VtKCkgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWxyYyA9IERvc1JlcXVlc3RNdXRleFNlbShzZW0tPmlkLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKLSAgICAgICAgICAgIGlmICh1bHJjKSB7Ci0gICAgICAgICAgICAgICAvKiBpZiBlcnJvciB3YWl0aW5nIG11dGV4ICovCi0gICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIkRvc1JlcXVlc3RNdXRleFNlbSgpIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgIGlmIChzZW0tPnZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgc2VtLT52YWx1ZS0tOwotICAgICAgICAgICAgICAgIERvc1JlbGVhc2VNdXRleFNlbShzZW0tPmlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBVTE9ORyB1bFBvc3RDb3VudDsKLSAgICAgICAgICAgICAgICBEb3NSZXNldEV2ZW50U2VtKHNlbS0+Y2hhbmdlZCwgJnVsUG9zdENvdW50KTsKLSAgICAgICAgICAgICAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oc2VtLT5pZCk7Ci0gICAgICAgICAgICAgICAgLyogY29udGludWUgd2FpdGluZyB1bnRpbCBzb21lYm9keSBwb3N0cyB0aGUgc2VtYXBob3JlICovCi0gICAgICAgICAgICAgICAgdWxyYyA9IERvc1dhaXRFdmVudFNlbShzZW0tPmNoYW5nZWQsIHRpbWVvdXQpOwotICAgICAgICAgICAgICAgIGlmICh1bHJjPT1OT19FUlJPUikKLSAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHJldHVybiBTRExfTVVURVhfVElNRURPVVQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBuZXZlciByZWFjaGVkICovCi0gICAgICAgIHJldHVybiAtMTsKLX0KLQotREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NlbVRyeVdhaXQoU0RMX3NlbSAqc2VtKQotewotICAgICAgICByZXR1cm4gU0RMX1NlbVdhaXRUaW1lb3V0KHNlbSwgMCk7Ci19Ci0KLURFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZW1XYWl0KFNETF9zZW0gKnNlbSkKLXsKLSAgICAgICAgcmV0dXJuIFNETF9TZW1XYWl0VGltZW91dChzZW0sIFNETF9NVVRFWF9NQVhXQUlUKTsKLX0KLQotLyogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvZiB0aGUgc2VtYXBob3JlICovCi1ERUNMU1BFQyBVaW50MzIgU0RMQ0FMTCBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQotewotICAgICAgICBpZiAoICEgc2VtICkgewotICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VtLT52YWx1ZTsKLX0KLQotREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NlbVBvc3QoU0RMX3NlbSAqc2VtKQotewotICAgICAgICBpZiAoICEgc2VtICkgewotICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBEb3NSZXF1ZXN0TXV0ZXhTZW0oc2VtLT5pZCxTRU1fSU5ERUZJTklURV9XQUlUKSApIHsKLSAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIkRvc1JlcXVlc3RNdXRleFNlbSgpIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBzZW0tPnZhbHVlKys7Ci0gICAgICAgIERvc1Bvc3RFdmVudFNlbShzZW0tPmNoYW5nZWQpOwotICAgICAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oc2VtLT5pZCk7Ci0gICAgICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvb3MyL1NETF9zeXN0aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL29zMi9TRExfc3lzdGhyZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTc0ZDkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvb3MyL1NETF9zeXN0aHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogT1MvMiB0aHJlYWQgbWFuYWdlbWVudCByb3V0aW5lcyBmb3IgU0RMICovCi0KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfRE9TUFJPQ0VTUwotI2luY2x1ZGUgPG9zMi5oPgotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKLSNpbmNsdWRlICIuLi9TRExfdGhyZWFkX2MuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgVGhyZWFkU3RhcnRQYXJtcwotewotICB2b2lkICphcmdzOwotICBwZm5TRExfQ3VycmVudEVuZFRocmVhZCBwZm5DdXJyZW50RW5kVGhyZWFkOwotfSB0VGhyZWFkU3RhcnRQYXJtcywgKnBUaHJlYWRTdGFydFBhcm1zOwotCi1zdGF0aWMgdm9pZCB0aHJlYWRmdW5jKHZvaWQgKnBwYXJtKQotewotICBwVGhyZWFkU3RhcnRQYXJtcyBwVGhyZWFkUGFybXMgPSBwcGFybTsKLSAgcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuQ3VycmVudEVuZFRocmVhZCA9IE5VTEw7Ci0KLSAgLy8gQ2FsbCB0aGUgdGhyZWFkIGZ1bmN0aW9uIQotICBTRExfUnVuVGhyZWFkKHBUaHJlYWRQYXJtcy0+YXJncyk7Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IGVuZHRocmVhZCB3ZSBoYXZlIHRvIHVzZSEKLSAgaWYgKHBUaHJlYWRQYXJtcykKLSAgewotICAgIHBmbkN1cnJlbnRFbmRUaHJlYWQgPSBwVGhyZWFkUGFybXMtPnBmbkN1cnJlbnRFbmRUaHJlYWQ7Ci0gICAgU0RMX2ZyZWUocFRocmVhZFBhcm1zKTsKLSAgfQotICAvLyBDYWxsIGVuZHRocmVhZCEKLSAgaWYgKHBmbkN1cnJlbnRFbmRUaHJlYWQpCi0gICAgKCpwZm5DdXJyZW50RW5kVGhyZWFkKSgpOwotfQotCi1pbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzLCBwZm5TRExfQ3VycmVudEJlZ2luVGhyZWFkIHBmbkJlZ2luVGhyZWFkLCBwZm5TRExfQ3VycmVudEVuZFRocmVhZCBwZm5FbmRUaHJlYWQpCi17Ci0gIHBUaHJlYWRTdGFydFBhcm1zIHBUaHJlYWRQYXJtcyA9IFNETF9tYWxsb2Moc2l6ZW9mKHRUaHJlYWRTdGFydFBhcm1zKSk7Ci0gIGlmICghcFRocmVhZFBhcm1zKQotICB7Ci0gICAgU0RMX1NldEVycm9yKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhyZWFkIik7Ci0gICAgcmV0dXJuKC0xKTsKLSAgfQotCi0gIC8vIFNhdmUgdGhlIGZ1bmN0aW9uIHdoaWNoIHdlIHdpbGwgaGF2ZSB0byBjYWxsIHRvIGNsZWFyIHRoZSBSVEwgb2YgY2FsbGluZyBhcHAhCi0gIHBUaHJlYWRQYXJtcy0+cGZuQ3VycmVudEVuZFRocmVhZCA9IHBmbkVuZFRocmVhZDsKLSAgLy8gQWxzbyBzYXZlIHRoZSByZWFsIHBhcmFtZXRlcnMgd2UgaGF2ZSB0byBwYXNzIHRvIHRocmVhZCBmdW5jdGlvbgotICBwVGhyZWFkUGFybXMtPmFyZ3MgPSBhcmdzOwotICAvLyBTdGFydCB0aGUgdGhyZWFkIHVzaW5nIHRoZSBydW50aW1lIGxpYnJhcnkgb2YgY2FsbGluZyBhcHAhCi0gIHRocmVhZC0+dGhyZWFkaWQgPSB0aHJlYWQtPmhhbmRsZSA9ICgqcGZuQmVnaW5UaHJlYWQpKHRocmVhZGZ1bmMsIE5VTEwsIDUxMioxMDI0LCBwVGhyZWFkUGFybXMpOwotICBpZiAoKGludCl0aHJlYWQtPnRocmVhZGlkIDw9IDApCi0gIHsKLSAgICBTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKLSAgICByZXR1cm4oLTEpOwotICB9Ci0gIHJldHVybigwKTsKLX0KLQotdm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCi17Ci0gIHJldHVybjsKLX0KLQotREVDTFNQRUMgVWludDMyIFNETENBTEwgU0RMX1RocmVhZElEKHZvaWQpCi17Ci0gIFBUSUIgdGliOwotICBEb3NHZXRJbmZvQmxvY2tzKCZ0aWIsIE5VTEwpOwotICByZXR1cm4oKFVpbnQzMikgKHRpYi0+dGliX3B0aWIyLT50aWIyX3VsdGlkKSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLSAgVElEIHRpZCA9IHRocmVhZC0+aGFuZGxlOwotICBEb3NXYWl0VGhyZWFkKCZ0aWQsIERDV1dfV0FJVCk7Ci19Ci0KLS8qIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGEgbGFzdCByZXNvcnQuCi0gKiBUaHJlYWRzIHNob3VsZCBiZSBzaWduYWxlZCBhbmQgdGhlbiBleGl0IGJ5IHRoZW1zZWx2ZXMuCi0gKiBUZXJtaW5hdGVUaHJlYWQoKSBkb2Vzbid0IHBlcmZvcm0gc3RhY2sgYW5kIERMTCBjbGVhbnVwLgotICovCi12b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0gIERvc0tpbGxUaHJlYWQodGhyZWFkLT5oYW5kbGUpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvb3MyL1NETF9zeXN0aHJlYWRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvb3MyL1NETF9zeXN0aHJlYWRfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODY0MTlkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL29zMi9TRExfc3lzdGhyZWFkX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNkZWZpbmUgSU5DTF9ET1NQUk9DRVNTCi0jaW5jbHVkZSA8b3MyLmg+Ci0KLXR5cGVkZWYgVElEIFNZU19UaHJlYWRIYW5kbGU7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aC9TRExfc3lzY29uZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRoL1NETF9zeXNjb25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNWFmZjEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRoL1NETF9zeXNjb25kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gKglHTlUgcHRoIGNvbmRpdGlvbnMgdmFyaWFibGVzCi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0jaW5jbHVkZSA8cHRoLmg+Ci0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX3N5c211dGV4X2MuaCIKLQotc3RydWN0IFNETF9jb25kCi17Ci0JcHRoX2NvbmRfdAljb25kcHRoX3A7Ci19OwotCi0vKiBDcmVhdGUgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KLVNETF9jb25kICogU0RMX0NyZWF0ZUNvbmQodm9pZCkKLXsKLQlTRExfY29uZCAqY29uZDsKLQotCWNvbmQgPSAoU0RMX2NvbmQgKikgU0RMX21hbGxvYyhzaXplb2YoU0RMX2NvbmQpKTsKLQlpZiAoIGNvbmQgKSB7Ci0JCWlmICggcHRoX2NvbmRfaW5pdCgmKGNvbmQtPmNvbmRwdGhfcCkpIDwgMCApIHsKLQkJCVNETF9TZXRFcnJvcigicHRocmVhZF9jb25kX2luaXQoKSBmYWlsZWQiKTsKLQkJCVNETF9mcmVlKGNvbmQpOwotCQkJY29uZCA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQl9Ci0JcmV0dXJuKGNvbmQpOwotfQotCi0vKiBEZXN0cm95IGEgY29uZGl0aW9uIHZhcmlhYmxlICovCi12b2lkIFNETF9EZXN0cm95Q29uZChTRExfY29uZCAqY29uZCkKLXsKLQlpZiAoIGNvbmQgKSB7Ci0JCVNETF9mcmVlKGNvbmQpOwotCX0KLX0KLQotLyogUmVzdGFydCBvbmUgb2YgdGhlIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlICovCi1pbnQgU0RMX0NvbmRTaWduYWwoU0RMX2NvbmQgKmNvbmQpCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBjb25kICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR2YWwgPSAwOwotCWlmICggcHRoX2NvbmRfbm90aWZ5KCYoY29uZC0+Y29uZHB0aF9wKSwgRkFMU0UpICE9IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigicHRoX2NvbmRfbm90aWZ5KCkgZmFpbGVkIik7Ci0JCXJldHZhbCA9IC0xOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKiBSZXN0YXJ0IGFsbCB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSAqLwotaW50IFNETF9Db25kQnJvYWRjYXN0KFNETF9jb25kICpjb25kKQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgY29uZCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dmFsID0gMDsKLQlpZiAoIHB0aF9jb25kX25vdGlmeSgmKGNvbmQtPmNvbmRwdGhfcCksIFRSVUUpICE9IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigicHRoX2NvbmRfbm90aWZ5KCkgZmFpbGVkIik7Ci0JCXJldHZhbCA9IC0xOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgZm9yIGF0IG1vc3QgJ21zJyBtaWxsaXNlY29uZHMuCi0gICBUaGUgbXV0ZXggbXVzdCBiZSBsb2NrZWQgYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuY3Rpb24hCi0gICBUaGUgbXV0ZXggaXMgdW5sb2NrZWQgZHVyaW5nIHRoZSB3YWl0LCBhbmQgbG9ja2VkIGFnYWluIGFmdGVyIHRoZSB3YWl0LgotCi1UeXBpY2FsIHVzZToKLQotVGhyZWFkIEE6Ci0JU0RMX0xvY2tNdXRleChsb2NrKTsKLQl3aGlsZSAoICEgY29uZGl0aW9uICkgewotCQlTRExfQ29uZFdhaXQoY29uZCk7Ci0JfQotCVNETF9VbmxvY2tNdXRleChsb2NrKTsKLQotVGhyZWFkIEI6Ci0JU0RMX0xvY2tNdXRleChsb2NrKTsKLQkuLi4KLQljb25kaXRpb24gPSB0cnVlOwotCS4uLgotCVNETF9VbmxvY2tNdXRleChsb2NrKTsKLSAqLwotaW50IFNETF9Db25kV2FpdFRpbWVvdXQoU0RMX2NvbmQgKmNvbmQsIFNETF9tdXRleCAqbXV0ZXgsIFVpbnQzMiBtcykKLXsKLQlpbnQgcmV0dmFsOwotCXB0aF9ldmVudF90IGV2OwotCWludCBzZWM7Ci0KLQlpZiAoICEgY29uZCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dmFsID0gMDsKLQotCXNlYyA9IG1zLzEwMDA7Ci0JZXYgPSBwdGhfZXZlbnQoUFRIX0VWRU5UX1RJTUUsIHB0aF90aW1lb3V0KHNlYywobXMtc2VjKjEwMDApKjEwMDApKTsKLQotCWlmICggcHRoX2NvbmRfYXdhaXQoJihjb25kLT5jb25kcHRoX3ApLCAmKG11dGV4LT5tdXRleHB0aF9wKSwgZXYpICE9IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigicHRoX2NvbmRfYXdhaXQoKSBmYWlsZWQiKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCi0gICAgcHRoX2V2ZW50X2ZyZWUoZXYsIFBUSF9GUkVFX0FMTCk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgZm9yZXZlciAqLwotaW50IFNETF9Db25kV2FpdChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCAhIGNvbmQgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHZhbCA9IDA7Ci0JaWYgKCBwdGhfY29uZF9hd2FpdCgmKGNvbmQtPmNvbmRwdGhfcCksICYobXV0ZXgtPm11dGV4cHRoX3ApLCBOVUxMKSAhPSAwICkgewotCQlTRExfU2V0RXJyb3IoInB0aF9jb25kX2F3YWl0KCkgZmFpbGVkIik7Ci0JCXJldHZhbCA9IC0xOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRoL1NETF9zeXNtdXRleC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRoL1NETF9zeXNtdXRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDViMTk3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aC9TRExfc3lzbXV0ZXguYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICoJR05VIHB0aCBtdXRleGVzCi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0jaW5jbHVkZSA8cHRoLmg+Ci0KLSNpbmNsdWRlICJTRExfbXV0ZXguaCIKLSNpbmNsdWRlICJTRExfc3lzbXV0ZXhfYy5oIgotCi0vKiBDcmVhdGUgYSBtdXRleCAqLwotU0RMX211dGV4ICpTRExfQ3JlYXRlTXV0ZXgodm9pZCkKLXsKLQlTRExfbXV0ZXggKm11dGV4OwotCi0JLyogQWxsb2NhdGUgbXV0ZXggbWVtb3J5ICovCi0JbXV0ZXggPSAoU0RMX211dGV4ICopU0RMX21hbGxvYyhzaXplb2YoKm11dGV4KSk7Ci0JaWYgKCBtdXRleCApIHsKLQkJLyogQ3JlYXRlIHRoZSBtdXRleCwgd2l0aCBpbml0aWFsIHZhbHVlIHNpZ25hbGVkICovCi0JICAgIGlmICghcHRoX211dGV4X2luaXQoJihtdXRleC0+bXV0ZXhwdGhfcCkpKSB7Ci0JCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBtdXRleCIpOwotCQkJU0RMX2ZyZWUobXV0ZXgpOwotCQkJbXV0ZXggPSBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JfQotCXJldHVybihtdXRleCk7Ci19Ci0KLS8qIEZyZWUgdGhlIG11dGV4ICovCi12b2lkIFNETF9EZXN0cm95TXV0ZXgoU0RMX211dGV4ICptdXRleCkKLXsKLQlpZiAoIG11dGV4ICkgewotCQlTRExfZnJlZShtdXRleCk7Ci0JfQotfQotCi0vKiBMb2NrIHRoZSBtdXRleCAqLwotaW50IFNETF9tdXRleFAoU0RMX211dGV4ICptdXRleCkKLXsKLQlpZiAoIG11dGV4ID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHRoX211dGV4X2FjcXVpcmUoJihtdXRleC0+bXV0ZXhwdGhfcCksIEZBTFNFLCBOVUxMKTsKLQotCXJldHVybigwKTsKLX0KLQotLyogVW5sb2NrIHRoZSBtdXRleCAqLwotaW50IFNETF9tdXRleFYoU0RMX211dGV4ICptdXRleCkKLXsKLQlpZiAoIG11dGV4ID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0gICAgcHRoX211dGV4X3JlbGVhc2UoJihtdXRleC0+bXV0ZXhwdGhfcCkpOwotCi0JcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRoL1NETF9zeXNtdXRleF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGgvU0RMX3N5c211dGV4X2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlOWVmNS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGgvU0RMX3N5c211dGV4X2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfU1lTTVVURVhfQ19IXwotI2RlZmluZSBfU0RMX1NZU01VVEVYX0NfSF8KLQotc3RydWN0IFNETF9tdXRleCB7Ci0JcHRoX211dGV4X3QgbXV0ZXhwdGhfcDsKLX07Ci0KLSNlbmRpZiAvKiBfU0RMX1NZU01VVEVYX0NfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aC9TRExfc3lzdGhyZWFkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGgvU0RMX3N5c3RocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODQwMDNhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aC9TRExfc3lzdGhyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gKglHTlUgcHRoIHRocmVhZHMKLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLSNpbmNsdWRlIDxwdGguaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICIuLi9TRExfdGhyZWFkX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdGhyZWFkLmgiCi0KLS8qIExpc3Qgb2Ygc2lnbmFscyB0byBtYXNrIGluIHRoZSBzdWJ0aHJlYWRzICovCi1zdGF0aWMgaW50IHNpZ19saXN0W10gPSB7Ci0JU0lHSFVQLCBTSUdJTlQsIFNJR1FVSVQsIFNJR1BJUEUsIFNJR0FMUk0sIFNJR1RFUk0sIFNJR0NITEQsIFNJR1dJTkNILAotCVNJR1ZUQUxSTSwgU0lHUFJPRiwgMAotfTsKLQotc3RhdGljIHZvaWQgKlJ1blRocmVhZCh2b2lkICpkYXRhKQotewotCVNETF9SdW5UaHJlYWQoZGF0YSk7Ci0JcHRoX2V4aXQoKHZvaWQqKTApOwotCXJldHVybigodm9pZCAqKTApOwkJLyogUHJldmVudCBjb21waWxlciB3YXJuaW5nICovCi19Ci0KLWludCBTRExfU1lTX0NyZWF0ZVRocmVhZChTRExfVGhyZWFkICp0aHJlYWQsIHZvaWQgKmFyZ3MpCi17Ci0JcHRoX2F0dHJfdCB0eXBlOwotCi0JLyogQ3JlYXRlIGEgbmV3IGF0dHJpYnV0ZSAqLwotCXR5cGUgPSBwdGhfYXR0cl9uZXcoKTsKLQlpZiAoIHR5cGUgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBpbml0aWFsaXplIHB0aCBhdHRyaWJ1dGVzIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCXB0aF9hdHRyX3NldCh0eXBlLCBQVEhfQVRUUl9KT0lOQUJMRSwgVFJVRSk7Ci0KLQkvKiBDcmVhdGUgdGhlIHRocmVhZCBhbmQgZ28hICovCi0JdGhyZWFkLT5oYW5kbGUgPSBwdGhfc3Bhd24odHlwZSwgUnVuVGhyZWFkLCBhcmdzKTsKLQlpZiAoIHRocmVhZC0+aGFuZGxlID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiTm90IGVub3VnaCByZXNvdXJjZXMgdG8gY3JlYXRlIHRocmVhZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgU0RMX1NZU19TZXR1cFRocmVhZCh2b2lkKQotewotCWludCBpOwotCXNpZ3NldF90IG1hc2s7Ci0JaW50IG9sZHN0YXRlOwotCi0JLyogTWFzayBhc3luY2hyb25vdXMgc2lnbmFscyBmb3IgdGhpcyB0aHJlYWQgKi8KLQlzaWdlbXB0eXNldCgmbWFzayk7Ci0JZm9yICggaT0wOyBzaWdfbGlzdFtpXTsgKytpICkgewotCQlzaWdhZGRzZXQoJm1hc2ssIHNpZ19saXN0W2ldKTsKLQl9Ci0JcHRoX3NpZ21hc2soU0lHX0JMT0NLLCAmbWFzaywgMCk7Ci0KLQkvKiBBbGxvdyBvdXJzZWx2ZXMgdG8gYmUgYXN5bmNocm9ub3VzbHkgY2FuY2VsbGVkICovCi0JcHRoX2NhbmNlbF9zdGF0ZShQVEhfQ0FOQ0VMX0FTWU5DSFJPTk9VUywgJm9sZHN0YXRlKTsKLX0KLQotLyogV0FSTklORzogIFRoaXMgbWF5IG5vdCB3b3JrIGZvciBzeXN0ZW1zIHdpdGggNjQtYml0IHBpZF90ICovCi1VaW50MzIgU0RMX1RocmVhZElEKHZvaWQpCi17Ci0JcmV0dXJuKChVaW50MzIpcHRoX3NlbGYoKSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlwdGhfam9pbih0aHJlYWQtPmhhbmRsZSwgTlVMTCk7Ci19Ci0KLXZvaWQgU0RMX1NZU19LaWxsVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlwdGhfY2FuY2VsKHRocmVhZC0+aGFuZGxlKTsKLQlwdGhfam9pbih0aHJlYWQtPmhhbmRsZSwgTlVMTCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGgvU0RMX3N5c3RocmVhZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGgvU0RMX3N5c3RocmVhZF9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MWViMWIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRoL1NETF9zeXN0aHJlYWRfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9TWVNUSFJFQURfQ19IXwotI2RlZmluZSBfU0RMX1NZU1RIUkVBRF9DX0hfCi0KLSNpbmNsdWRlIDxwdGguaD4KLQotdHlwZWRlZiBwdGhfdCBTWVNfVGhyZWFkSGFuZGxlOwotCi0jZW5kaWYgLyogX1NETF9TWVNUSFJFQURfQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzY29uZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzY29uZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNmODNjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c2NvbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX3N5c211dGV4X2MuaCIKLQotc3RydWN0IFNETF9jb25kCi17Ci0JcHRocmVhZF9jb25kX3QgY29uZDsKLX07Ci0KLS8qIENyZWF0ZSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLwotU0RMX2NvbmQgKiBTRExfQ3JlYXRlQ29uZCh2b2lkKQotewotCVNETF9jb25kICpjb25kOwotCi0JY29uZCA9IChTRExfY29uZCAqKSBTRExfbWFsbG9jKHNpemVvZihTRExfY29uZCkpOwotCWlmICggY29uZCApIHsKLQkJaWYgKCBwdGhyZWFkX2NvbmRfaW5pdCgmY29uZC0+Y29uZCwgTlVMTCkgPCAwICkgewotCQkJU0RMX1NldEVycm9yKCJwdGhyZWFkX2NvbmRfaW5pdCgpIGZhaWxlZCIpOwotCQkJU0RMX2ZyZWUoY29uZCk7Ci0JCQljb25kID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4oY29uZCk7Ci19Ci0KLS8qIERlc3Ryb3kgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KLXZvaWQgU0RMX0Rlc3Ryb3lDb25kKFNETF9jb25kICpjb25kKQotewotCWlmICggY29uZCApIHsKLQkJcHRocmVhZF9jb25kX2Rlc3Ryb3koJmNvbmQtPmNvbmQpOwotCQlTRExfZnJlZShjb25kKTsKLQl9Ci19Ci0KLS8qIFJlc3RhcnQgb25lIG9mIHRoZSB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSAqLwotaW50IFNETF9Db25kU2lnbmFsKFNETF9jb25kICpjb25kKQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgY29uZCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dmFsID0gMDsKLQlpZiAoIHB0aHJlYWRfY29uZF9zaWduYWwoJmNvbmQtPmNvbmQpICE9IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigicHRocmVhZF9jb25kX3NpZ25hbCgpIGZhaWxlZCIpOwotCQlyZXR2YWwgPSAtMTsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyogUmVzdGFydCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KLWludCBTRExfQ29uZEJyb2FkY2FzdChTRExfY29uZCAqY29uZCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCAhIGNvbmQgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHZhbCA9IDA7Ci0JaWYgKCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjb25kLT5jb25kKSAhPSAwICkgewotCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfY29uZF9icm9hZGNhc3QoKSBmYWlsZWQiKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWludCBTRExfQ29uZFdhaXRUaW1lb3V0KFNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dGV4LCBVaW50MzIgbXMpCi17Ci0JaW50IHJldHZhbDsKLQlzdHJ1Y3QgdGltZXZhbCBkZWx0YTsKLQlzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKLQotCWlmICggISBjb25kICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlnZXR0aW1lb2ZkYXkoJmRlbHRhLCBOVUxMKTsKLQotCWFic3RpbWUudHZfc2VjID0gZGVsdGEudHZfc2VjICsgKG1zLzEwMDApOwotCWFic3RpbWUudHZfbnNlYyA9IChkZWx0YS50dl91c2VjICsgKG1zJTEwMDApICogMTAwMCkgKiAxMDAwOwotICAgICAgICBpZiAoIGFic3RpbWUudHZfbnNlYyA+IDEwMDAwMDAwMDAgKSB7Ci0gICAgICAgICAgYWJzdGltZS50dl9zZWMgKz0gMTsKLSAgICAgICAgICBhYnN0aW1lLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKLSAgICAgICAgfQotCi0gIHRyeWFnYWluOgotCXJldHZhbCA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJmNvbmQtPmNvbmQsICZtdXRleC0+aWQsICZhYnN0aW1lKTsKLQlzd2l0Y2ggKHJldHZhbCkgewotCSAgICBjYXNlIEVJTlRSOgotCQlnb3RvIHRyeWFnYWluOwotCQlicmVhazsKLQkgICAgY2FzZSBFVElNRURPVVQ6Ci0JCXJldHZhbCA9IFNETF9NVVRFWF9USU1FRE9VVDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMDoKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCVNETF9TZXRFcnJvcigicHRocmVhZF9jb25kX3RpbWVkd2FpdCgpIGZhaWxlZCIpOwotCQlyZXR2YWwgPSAtMTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgdW5sb2NraW5nIHRoZSBwcm92aWRlZCBtdXRleC4KLSAgIFRoZSBtdXRleCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbiEKLSAqLwotaW50IFNETF9Db25kV2FpdChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCAhIGNvbmQgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHZhbCA9IDA7Ci0JaWYgKCBwdGhyZWFkX2NvbmRfd2FpdCgmY29uZC0+Y29uZCwgJm11dGV4LT5pZCkgIT0gMCApIHsKLQkJU0RMX1NldEVycm9yKCJwdGhyZWFkX2NvbmRfd2FpdCgpIGZhaWxlZCIpOwotCQlyZXR2YWwgPSAtMTsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c211dGV4LmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXNtdXRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU5OWI0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c211dGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0KLSNpZiAhU0RMX1RIUkVBRF9QVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWCAmJiBcCi0gICAgIVNETF9USFJFQURfUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfTlAKLSNkZWZpbmUgRkFLRV9SRUNVUlNJVkVfTVVURVgKLSNlbmRpZgotCi1zdHJ1Y3QgU0RMX211dGV4IHsKLQlwdGhyZWFkX211dGV4X3QgaWQ7Ci0jaWYgRkFLRV9SRUNVUlNJVkVfTVVURVgKLQlpbnQgcmVjdXJzaXZlOwotCXB0aHJlYWRfdCBvd25lcjsKLSNlbmRpZgotfTsKLQotU0RMX211dGV4ICpTRExfQ3JlYXRlTXV0ZXggKHZvaWQpCi17Ci0JU0RMX211dGV4ICptdXRleDsKLQlwdGhyZWFkX211dGV4YXR0cl90IGF0dHI7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlICovCi0JbXV0ZXggPSAoU0RMX211dGV4ICopU0RMX2NhbGxvYygxLCBzaXplb2YoKm11dGV4KSk7Ci0JaWYgKCBtdXRleCApIHsKLQkJcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmYXR0cik7Ci0jaWYgU0RMX1RIUkVBRF9QVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWAotCQlwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZhdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7Ci0jZWxpZiBTRExfVEhSRUFEX1BUSFJFQURfUkVDVVJTSVZFX01VVEVYX05QCi0JCXB0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAoJmF0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsKLSNlbHNlCi0JCS8qIE5vIGV4dHJhIGF0dHJpYnV0ZXMgbmVjZXNzYXJ5ICovCi0jZW5kaWYKLQkJaWYgKCBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LT5pZCwgJmF0dHIpICE9IDAgKSB7Ci0JCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfbXV0ZXhfaW5pdCgpIGZhaWxlZCIpOwotCQkJU0RMX2ZyZWUobXV0ZXgpOwotCQkJbXV0ZXggPSBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JfQotCXJldHVybihtdXRleCk7Ci19Ci0KLXZvaWQgU0RMX0Rlc3Ryb3lNdXRleChTRExfbXV0ZXggKm11dGV4KQotewotCWlmICggbXV0ZXggKSB7Ci0JCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgtPmlkKTsKLQkJU0RMX2ZyZWUobXV0ZXgpOwotCX0KLX0KLQotLyogTG9jayB0aGUgbXV0ZXggKi8KLWludCBTRExfbXV0ZXhQKFNETF9tdXRleCAqbXV0ZXgpCi17Ci0JaW50IHJldHZhbDsKLSNpZiBGQUtFX1JFQ1VSU0lWRV9NVVRFWAotCXB0aHJlYWRfdCB0aGlzX3RocmVhZDsKLSNlbmRpZgotCi0JaWYgKCBtdXRleCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHZhbCA9IDA7Ci0jaWYgRkFLRV9SRUNVUlNJVkVfTVVURVgKLQl0aGlzX3RocmVhZCA9IHB0aHJlYWRfc2VsZigpOwotCWlmICggbXV0ZXgtPm93bmVyID09IHRoaXNfdGhyZWFkICkgewotCQkrK211dGV4LT5yZWN1cnNpdmU7Ci0JfSBlbHNlIHsKLQkJLyogVGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgaW1wb3J0YW50LgotCQkgICBXZSBzZXQgdGhlIGxvY2tpbmcgdGhyZWFkIGlkIGFmdGVyIHdlIG9idGFpbiB0aGUgbG9jawotCQkgICBzbyB1bmxvY2tzIGZyb20gb3RoZXIgdGhyZWFkcyB3aWxsIGZhaWwuCi0JCSovCi0JCWlmICggcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleC0+aWQpID09IDAgKSB7Ci0JCQltdXRleC0+b3duZXIgPSB0aGlzX3RocmVhZDsKLQkJCW11dGV4LT5yZWN1cnNpdmUgPSAwOwotCQl9IGVsc2UgewotCQkJU0RMX1NldEVycm9yKCJwdGhyZWFkX211dGV4X2xvY2soKSBmYWlsZWQiKTsKLQkJCXJldHZhbCA9IC0xOwotCQl9Ci0JfQotI2Vsc2UKLQlpZiAoIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgtPmlkKSA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigicHRocmVhZF9tdXRleF9sb2NrKCkgZmFpbGVkIik7Ci0JCXJldHZhbCA9IC0xOwotCX0KLSNlbmRpZgotCXJldHVybiByZXR2YWw7Ci19Ci0KLWludCBTRExfbXV0ZXhWKFNETF9tdXRleCAqbXV0ZXgpCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggbXV0ZXggPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR2YWwgPSAwOwotI2lmIEZBS0VfUkVDVVJTSVZFX01VVEVYCi0JLyogV2UgY2FuIG9ubHkgdW5sb2NrIHRoZSBtdXRleCBpZiB3ZSBvd24gaXQgKi8KLQlpZiAoIHB0aHJlYWRfc2VsZigpID09IG11dGV4LT5vd25lciApIHsKLQkJaWYgKCBtdXRleC0+cmVjdXJzaXZlICkgewotCQkJLS1tdXRleC0+cmVjdXJzaXZlOwotCQl9IGVsc2UgewotCQkJLyogVGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgaW1wb3J0YW50LgotCQkJICAgRmlyc3QgcmVzZXQgdGhlIG93bmVyIHNvIGFub3RoZXIgdGhyZWFkIGRvZXNuJ3QgbG9jawotCQkJICAgdGhlIG11dGV4IGFuZCBzZXQgdGhlIG93bmVyc2hpcCBiZWZvcmUgd2UgcmVzZXQgaXQsCi0JCQkgICB0aGVuIHJlbGVhc2UgdGhlIGxvY2sgc2VtYXBob3JlLgotCQkJICovCi0JCQltdXRleC0+b3duZXIgPSAwOwotCQkJcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4LT5pZCk7Ci0JCX0KLQl9IGVsc2UgewotCQlTRExfU2V0RXJyb3IoIm11dGV4IG5vdCBvd25lZCBieSB0aGlzIHRocmVhZCIpOwotCQlyZXR2YWwgPSAtMTsKLQl9Ci0KLSNlbHNlCi0JaWYgKCBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgtPmlkKSA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigicHRocmVhZF9tdXRleF91bmxvY2soKSBmYWlsZWQiKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotI2VuZGlmIC8qIEZBS0VfUkVDVVJTSVZFX01VVEVYICovCi0KLQlyZXR1cm4gcmV0dmFsOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzbXV0ZXhfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzbXV0ZXhfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODdlN2M4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c211dGV4X2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfbXV0ZXhfY19oCi0jZGVmaW5lIF9TRExfbXV0ZXhfY19oCi0KLXN0cnVjdCBTRExfbXV0ZXggewotCXB0aHJlYWRfbXV0ZXhfdCBpZDsKLX07Ci0KLSNlbmRpZiAvKiBfU0RMX211dGV4X2NfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzc2VtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXNzZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzMTk1YS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXNzZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIlNETF90aW1lci5oIgotCi0vKiBXcmFwcGVyIGFyb3VuZCBQT1NJWCAxMDAzLjFiIHNlbWFwaG9yZXMgKi8KLQotI2lmZGVmIF9fTUFDT1NYX18KLS8qIE1hYyBPUyBYIGRvZXNuJ3Qgc3VwcG9ydCBzZW1fZ2V0dmFsdWUoKSBhcyBvZiB2ZXJzaW9uIDEwLjQgKi8KLSNpbmNsdWRlICIuLi9nZW5lcmljL1NETF9zeXNzZW0uYyIKLSNlbHNlCi0KLXN0cnVjdCBTRExfc2VtYXBob3JlIHsKLQlzZW1fdCBzZW07Ci19OwotCi0vKiBDcmVhdGUgYSBzZW1hcGhvcmUsIGluaXRpYWxpemVkIHdpdGggdmFsdWUgKi8KLVNETF9zZW0gKlNETF9DcmVhdGVTZW1hcGhvcmUoVWludDMyIGluaXRpYWxfdmFsdWUpCi17Ci0JU0RMX3NlbSAqc2VtID0gKFNETF9zZW0gKikgU0RMX21hbGxvYyhzaXplb2YoU0RMX3NlbSkpOwotCWlmICggc2VtICkgewotCQlpZiAoIHNlbV9pbml0KCZzZW0tPnNlbSwgMCwgaW5pdGlhbF92YWx1ZSkgPCAwICkgewotCQkJU0RMX1NldEVycm9yKCJzZW1faW5pdCgpIGZhaWxlZCIpOwotCQkJU0RMX2ZyZWUoc2VtKTsKLQkJCXNlbSA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQl9Ci0JcmV0dXJuIHNlbTsKLX0KLQotdm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCi17Ci0JaWYgKCBzZW0gKSB7Ci0JCXNlbV9kZXN0cm95KCZzZW0tPnNlbSk7Ci0JCVNETF9mcmVlKHNlbSk7Ci0JfQotfQotCi1pbnQgU0RMX1NlbVRyeVdhaXQoU0RMX3NlbSAqc2VtKQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dmFsID0gU0RMX01VVEVYX1RJTUVET1VUOwotCWlmICggc2VtX3RyeXdhaXQoJnNlbS0+c2VtKSA9PSAwICkgewotCQlyZXR2YWwgPSAwOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgU0RMX1NlbVdhaXQoU0RMX3NlbSAqc2VtKQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl3aGlsZSAoICgocmV0dmFsID0gc2VtX3dhaXQoJnNlbS0+c2VtKSkgPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikgKSB7fQotCWlmICggcmV0dmFsIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJzZW1fd2FpdCgpIGZhaWxlZCIpOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFRyeSB0aGUgZWFzeSBjYXNlcyBmaXJzdCAqLwotCWlmICggdGltZW91dCA9PSAwICkgewotCQlyZXR1cm4gU0RMX1NlbVRyeVdhaXQoc2VtKTsKLQl9Ci0JaWYgKCB0aW1lb3V0ID09IFNETF9NVVRFWF9NQVhXQUlUICkgewotCQlyZXR1cm4gU0RMX1NlbVdhaXQoc2VtKTsKLQl9Ci0KLQkvKiBBY2shICBXZSBoYXZlIHRvIGJ1c3kgd2FpdC4uLiAqLwotCS8qIEZJWE1FOiBVc2Ugc2VtX3RpbWVkd2FpdCgpPyAqLwotCXRpbWVvdXQgKz0gU0RMX0dldFRpY2tzKCk7Ci0JZG8gewotCQlyZXR2YWwgPSBTRExfU2VtVHJ5V2FpdChzZW0pOwotCQlpZiAoIHJldHZhbCA9PSAwICkgewotCQkJYnJlYWs7Ci0JCX0KLQkJU0RMX0RlbGF5KDEpOwotCX0gd2hpbGUgKCBTRExfR2V0VGlja3MoKSA8IHRpbWVvdXQgKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLVVpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQotewotCWludCByZXQgPSAwOwotCWlmICggc2VtICkgewotCQlzZW1fZ2V0dmFsdWUoJnNlbS0+c2VtLCAmcmV0KTsKLQkJaWYgKCByZXQgPCAwICkgewotCQkJcmV0ID0gMDsKLQkJfQotCX0KLQlyZXR1cm4gKFVpbnQzMilyZXQ7Ci19Ci0KLWludCBTRExfU2VtUG9zdChTRExfc2VtICpzZW0pCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHZhbCA9IHNlbV9wb3N0KCZzZW0tPnNlbSk7Ci0JaWYgKCByZXR2YWwgPCAwICkgewotCQlTRExfU2V0RXJyb3IoInNlbV9wb3N0KCkgZmFpbGVkIik7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLSNlbmRpZiAvKiBfX01BQ09TWF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXN0aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3RocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTkyM2ZhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3RocmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIi4uL1NETF90aHJlYWRfYy5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKLQotLyogTGlzdCBvZiBzaWduYWxzIHRvIG1hc2sgaW4gdGhlIHN1YnRocmVhZHMgKi8KLXN0YXRpYyBpbnQgc2lnX2xpc3RbXSA9IHsKLQlTSUdIVVAsIFNJR0lOVCwgU0lHUVVJVCwgU0lHUElQRSwgU0lHQUxSTSwgU0lHVEVSTSwgU0lHQ0hMRCwgU0lHV0lOQ0gsCi0JU0lHVlRBTFJNLCBTSUdQUk9GLCAwCi19OwotCi0jaWZkZWYgX19SSVNDT1NfXwotLyogUklTQyBPUyBuZWVkcyB0byBrbm93IHRoZSBtYWluIHRocmVhZCBmb3IKLSAqIGl0J3MgdGltZXIgYW5kIGV2ZW50IHByb2Nlc3NpbmcuICovCi1pbnQgcmlzY29zX3VzaW5nX3RocmVhZHMgPSAwOwotVWludDMyIHJpc2Nvc19tYWluX3RocmVhZCA9IDA7IC8qIFRocmVhZCBydW5uaW5nIGV2ZW50cyAqLwotI2VuZGlmCi0gCi0KLXN0YXRpYyB2b2lkICpSdW5UaHJlYWQodm9pZCAqZGF0YSkKLXsKLQlTRExfUnVuVGhyZWFkKGRhdGEpOwotCXB0aHJlYWRfZXhpdCgodm9pZCopMCk7Ci0JcmV0dXJuKCh2b2lkICopMCk7CQkvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcgKi8KLX0KLQotaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncykKLXsKLQlwdGhyZWFkX2F0dHJfdCB0eXBlOwotCi0JLyogU2V0IHRoZSB0aHJlYWQgYXR0cmlidXRlcyAqLwotCWlmICggcHRocmVhZF9hdHRyX2luaXQoJnR5cGUpICE9IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgaW5pdGlhbGl6ZSBwdGhyZWFkIGF0dHJpYnV0ZXMiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0eXBlLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7Ci0KLQkvKiBDcmVhdGUgdGhlIHRocmVhZCBhbmQgZ28hICovCi0JaWYgKCBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLT5oYW5kbGUsICZ0eXBlLCBSdW5UaHJlYWQsIGFyZ3MpICE9IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiTm90IGVub3VnaCByZXNvdXJjZXMgdG8gY3JlYXRlIHRocmVhZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotI2lmZGVmIF9fUklTQ09TX18KLQlpZiAocmlzY29zX3VzaW5nX3RocmVhZHMgPT0gMCkgewotCQlyaXNjb3NfdXNpbmdfdGhyZWFkcyA9IDE7Ci0JCXJpc2Nvc19tYWluX3RocmVhZCA9IFNETF9UaHJlYWRJRCgpOwotCX0KLSNlbmRpZgotCi0JcmV0dXJuKDApOwotfQotCi12b2lkIFNETF9TWVNfU2V0dXBUaHJlYWQodm9pZCkKLXsKLQlpbnQgaTsKLQlzaWdzZXRfdCBtYXNrOwotCi0JLyogTWFzayBhc3luY2hyb25vdXMgc2lnbmFscyBmb3IgdGhpcyB0aHJlYWQgKi8KLQlzaWdlbXB0eXNldCgmbWFzayk7Ci0JZm9yICggaT0wOyBzaWdfbGlzdFtpXTsgKytpICkgewotCQlzaWdhZGRzZXQoJm1hc2ssIHNpZ19saXN0W2ldKTsKLQl9Ci0JcHRocmVhZF9zaWdtYXNrKFNJR19CTE9DSywgJm1hc2ssIDApOwotCi0jaWZkZWYgUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTCi0JLyogQWxsb3cgb3Vyc2VsdmVzIHRvIGJlIGFzeW5jaHJvbm91c2x5IGNhbmNlbGxlZCAqLwotCXsgaW50IG9sZHN0YXRlOwotCQlwdGhyZWFkX3NldGNhbmNlbHR5cGUoUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmb2xkc3RhdGUpOwotCX0KLSNlbmRpZgotfQotCi0vKiBXQVJOSU5HOiAgVGhpcyBtYXkgbm90IHdvcmsgZm9yIHN5c3RlbXMgd2l0aCA2NC1iaXQgcGlkX3QgKi8KLVVpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKLXsKLQlyZXR1cm4oKFVpbnQzMilwdGhyZWFkX3NlbGYoKSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlwdGhyZWFkX2pvaW4odGhyZWFkLT5oYW5kbGUsIDApOwotfQotCi12b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0jaWZkZWYgUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTCi0JcHRocmVhZF9jYW5jZWwodGhyZWFkLT5oYW5kbGUpOwotI2Vsc2UKLSNpZmRlZiBfX0ZSRUVCU0RfXwotI3dhcm5pbmcgRm9yIHNvbWUgcmVhc29uLCB0aGlzIGRvZXNudCBhY3R1YWxseSBraWxsIGEgdGhyZWFkIC0gRnJlZUJTRCAzLjIKLSNlbmRpZgotCXB0aHJlYWRfa2lsbCh0aHJlYWQtPmhhbmRsZSwgU0lHS0lMTCk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3RocmVhZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXN0aHJlYWRfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWFiMjNhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3RocmVhZF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotdHlwZWRlZiBwdGhyZWFkX3QgU1lTX1RocmVhZEhhbmRsZTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzY29uZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXNjb25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNDczOWEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXNjb25kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFJJU0MgT1MgaW1wbGVtZW50YXRpb25zIHVzZXMgcHRocmVhZHMgYmFzZWQgb24gbGludXggY29kZSAqLwotCi0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLSNpbmNsdWRlICIuLi9nZW5lcmljL1NETF9zeXNjb25kLmMiCi0jZWxzZQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIlNETF9zeXNtdXRleF9jLmgiCi0KLXN0cnVjdCBTRExfY29uZAotewotCXB0aHJlYWRfY29uZF90IGNvbmQ7Ci19OwotCi0vKiBDcmVhdGUgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KLVNETF9jb25kICogU0RMX0NyZWF0ZUNvbmQodm9pZCkKLXsKLQlTRExfY29uZCAqY29uZDsKLQotCWNvbmQgPSAoU0RMX2NvbmQgKikgU0RMX21hbGxvYyhzaXplb2YoU0RMX2NvbmQpKTsKLQlpZiAoIGNvbmQgKSB7Ci0JCWlmICggcHRocmVhZF9jb25kX2luaXQoJmNvbmQtPmNvbmQsIE5VTEwpIDwgMCApIHsKLQkJCVNETF9TZXRFcnJvcigicHRocmVhZF9jb25kX2luaXQoKSBmYWlsZWQiKTsKLQkJCVNETF9mcmVlKGNvbmQpOwotCQkJY29uZCA9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuKGNvbmQpOwotfQotCi0vKiBEZXN0cm95IGEgY29uZGl0aW9uIHZhcmlhYmxlICovCi12b2lkIFNETF9EZXN0cm95Q29uZChTRExfY29uZCAqY29uZCkKLXsKLQlpZiAoIGNvbmQgKSB7Ci0JCXB0aHJlYWRfY29uZF9kZXN0cm95KCZjb25kLT5jb25kKTsKLQkJU0RMX2ZyZWUoY29uZCk7Ci0JfQotfQotCi0vKiBSZXN0YXJ0IG9uZSBvZiB0aGUgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KLWludCBTRExfQ29uZFNpZ25hbChTRExfY29uZCAqY29uZCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCAhIGNvbmQgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHZhbCA9IDA7Ci0JaWYgKCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZjb25kLT5jb25kKSAhPSAwICkgewotCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfY29uZF9zaWduYWwoKSBmYWlsZWQiKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qIFJlc3RhcnQgYWxsIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlICovCi1pbnQgU0RMX0NvbmRCcm9hZGNhc3QoU0RMX2NvbmQgKmNvbmQpCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBjb25kICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR2YWwgPSAwOwotCWlmICggcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmY29uZC0+Y29uZCkgIT0gMCApIHsKLQkJU0RMX1NldEVycm9yKCJwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCkgZmFpbGVkIik7Ci0JCXJldHZhbCA9IC0xOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgU0RMX0NvbmRXYWl0VGltZW91dChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCwgVWludDMyIG1zKQotewotCWludCByZXR2YWw7Ci0Jc3RydWN0IHRpbWV2YWwgZGVsdGE7Ci0Jc3RydWN0IHRpbWVzcGVjIGFic3RpbWU7Ci0KLQlpZiAoICEgY29uZCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZ2V0dGltZW9mZGF5KCZkZWx0YSwgTlVMTCk7Ci0KLQlhYnN0aW1lLnR2X3NlYyA9IGRlbHRhLnR2X3NlYyArIChtcy8xMDAwKTsKLQlhYnN0aW1lLnR2X25zZWMgPSAoZGVsdGEudHZfdXNlYyArIChtcyUxMDAwKSAqIDEwMDApICogMTAwMDsKLSAgICAgICAgaWYgKCBhYnN0aW1lLnR2X25zZWMgPiAxMDAwMDAwMDAwICkgewotICAgICAgICAgIGFic3RpbWUudHZfc2VjICs9IDE7Ci0gICAgICAgICAgYWJzdGltZS50dl9uc2VjIC09IDEwMDAwMDAwMDA7Ci0gICAgICAgIH0KLQotICB0cnlhZ2FpbjoKLQlyZXR2YWwgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZjb25kLT5jb25kLCAmbXV0ZXgtPmlkLCAmYWJzdGltZSk7Ci0Jc3dpdGNoIChyZXR2YWwpIHsKLQkgICAgY2FzZSBFSU5UUjoKLQkJZ290byB0cnlhZ2FpbjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRVRJTUVET1VUOgotCQlyZXR2YWwgPSBTRExfTVVURVhfVElNRURPVVQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDA6Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfY29uZF90aW1lZHdhaXQoKSBmYWlsZWQiKTsKLQkJcmV0dmFsID0gLTE7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUsIHVubG9ja2luZyB0aGUgcHJvdmlkZWQgbXV0ZXguCi0gICBUaGUgbXV0ZXggbXVzdCBiZSBsb2NrZWQgYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuY3Rpb24hCi0gKi8KLWludCBTRExfQ29uZFdhaXQoU0RMX2NvbmQgKmNvbmQsIFNETF9tdXRleCAqbXV0ZXgpCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBjb25kICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR2YWwgPSAwOwotCWlmICggcHRocmVhZF9jb25kX3dhaXQoJmNvbmQtPmNvbmQsICZtdXRleC0+aWQpICE9IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigicHRocmVhZF9jb25kX3dhaXQoKSBmYWlsZWQiKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzbXV0ZXguYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzbXV0ZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0ZDY1ZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c211dGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFJJU0MgT1MgaW1wbGVtZW50YXRpb25zIHVzZXMgcHRocmVhZHMgYmFzZWQgb24gbGludXggY29kZSAqLwotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotCi0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLSNpbmNsdWRlICIuLi9nZW5lcmljL1NETF9zeXNtdXRleC5jIgotI2Vsc2UKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotc3RydWN0IFNETF9tdXRleCB7Ci0JcHRocmVhZF9tdXRleF90IGlkOwotI2lmIFNETF9USFJFQURfUFRIUkVBRF9OT19SRUNVUlNJVkVfTVVURVgKLQlpbnQgcmVjdXJzaXZlOwotCXB0aHJlYWRfdCBvd25lcjsKLSNlbmRpZgotfTsKLQotU0RMX211dGV4ICpTRExfQ3JlYXRlTXV0ZXggKHZvaWQpCi17Ci0JU0RMX211dGV4ICptdXRleDsKLQlwdGhyZWFkX211dGV4YXR0cl90IGF0dHI7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlICovCi0JbXV0ZXggPSAoU0RMX211dGV4ICopU0RMX2NhbGxvYygxLCBzaXplb2YoKm11dGV4KSk7Ci0JaWYgKCBtdXRleCApIHsKLQkJcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmYXR0cik7Ci0jaWYgU0RMX1RIUkVBRF9QVEhSRUFEX05PX1JFQ1VSU0lWRV9NVVRFWAotCQkvKiBObyBleHRyYSBhdHRyaWJ1dGVzIG5lY2Vzc2FyeSAqLwotI2Vsc2UKLQkJcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmYXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOwotI2VuZGlmIC8qIFNETF9USFJFQURfUFRIUkVBRF9OT19SRUNVUlNJVkVfTVVURVggKi8KLQkJaWYgKCBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LT5pZCwgJmF0dHIpICE9IDAgKSB7Ci0JCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfbXV0ZXhfaW5pdCgpIGZhaWxlZCIpOwotCQkJU0RMX2ZyZWUobXV0ZXgpOwotCQkJbXV0ZXggPSBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JfQotCXJldHVybihtdXRleCk7Ci19Ci0KLXZvaWQgU0RMX0Rlc3Ryb3lNdXRleChTRExfbXV0ZXggKm11dGV4KQotewotCWlmICggbXV0ZXggKSB7Ci0JCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgtPmlkKTsKLQkJU0RMX2ZyZWUobXV0ZXgpOwotCX0KLX0KLQotLyogTG9jayB0aGUgbXV0ZXggKi8KLWludCBTRExfbXV0ZXhQKFNETF9tdXRleCAqbXV0ZXgpCi17Ci0JaW50IHJldHZhbDsKLSNpZiBTRExfVEhSRUFEX1BUSFJFQURfTk9fUkVDVVJTSVZFX01VVEVYCi0JcHRocmVhZF90IHRoaXNfdGhyZWFkOwotI2VuZGlmCi0KLQlpZiAoIG11dGV4ID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dmFsID0gMDsKLSNpZiBTRExfVEhSRUFEX1BUSFJFQURfTk9fUkVDVVJTSVZFX01VVEVYCi0JdGhpc190aHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKLQlpZiAoIG11dGV4LT5vd25lciA9PSB0aGlzX3RocmVhZCApIHsKLQkJKyttdXRleC0+cmVjdXJzaXZlOwotCX0gZWxzZSB7Ci0JCS8qIFRoZSBvcmRlciBvZiBvcGVyYXRpb25zIGlzIGltcG9ydGFudC4KLQkJICAgV2Ugc2V0IHRoZSBsb2NraW5nIHRocmVhZCBpZCBhZnRlciB3ZSBvYnRhaW4gdGhlIGxvY2sKLQkJICAgc28gdW5sb2NrcyBmcm9tIG90aGVyIHRocmVhZHMgd2lsbCBmYWlsLgotCQkqLwotCQlpZiAoIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgtPmlkKSA9PSAwICkgewotCQkJbXV0ZXgtPm93bmVyID0gdGhpc190aHJlYWQ7Ci0JCQltdXRleC0+cmVjdXJzaXZlID0gMDsKLQkJfSBlbHNlIHsKLQkJCVNETF9TZXRFcnJvcigicHRocmVhZF9tdXRleF9sb2NrKCkgZmFpbGVkIik7Ci0JCQlyZXR2YWwgPSAtMTsKLQkJfQotCX0KLSNlbHNlCi0JaWYgKCBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4LT5pZCkgPCAwICkgewotCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfbXV0ZXhfbG9jaygpIGZhaWxlZCIpOwotCQlyZXR2YWwgPSAtMTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgU0RMX211dGV4VihTRExfbXV0ZXggKm11dGV4KQotewotCWludCByZXR2YWw7Ci0KLQlpZiAoIG11dGV4ID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dmFsID0gMDsKLSNpZiBTRExfVEhSRUFEX1BUSFJFQURfTk9fUkVDVVJTSVZFX01VVEVYCi0JLyogV2UgY2FuIG9ubHkgdW5sb2NrIHRoZSBtdXRleCBpZiB3ZSBvd24gaXQgKi8KLQlpZiAoIHB0aHJlYWRfc2VsZigpID09IG11dGV4LT5vd25lciApIHsKLQkJaWYgKCBtdXRleC0+cmVjdXJzaXZlICkgewotCQkJLS1tdXRleC0+cmVjdXJzaXZlOwotCQl9IGVsc2UgewotCQkJLyogVGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgaW1wb3J0YW50LgotCQkJICAgRmlyc3QgcmVzZXQgdGhlIG93bmVyIHNvIGFub3RoZXIgdGhyZWFkIGRvZXNuJ3QgbG9jawotCQkJICAgdGhlIG11dGV4IGFuZCBzZXQgdGhlIG93bmVyc2hpcCBiZWZvcmUgd2UgcmVzZXQgaXQsCi0JCQkgICB0aGVuIHJlbGVhc2UgdGhlIGxvY2sgc2VtYXBob3JlLgotCQkJICovCi0JCQltdXRleC0+b3duZXIgPSAwOwotCQkJcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4LT5pZCk7Ci0JCX0KLQl9IGVsc2UgewotCQlTRExfU2V0RXJyb3IoIm11dGV4IG5vdCBvd25lZCBieSB0aGlzIHRocmVhZCIpOwotCQlyZXR2YWwgPSAtMTsKLQl9Ci0KLSNlbHNlCi0JaWYgKCBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgtPmlkKSA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigicHRocmVhZF9tdXRleF91bmxvY2soKSBmYWlsZWQiKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotI2VuZGlmIC8qIFNETF9USFJFQURfUFRIUkVBRF9OT19SRUNVUlNJVkVfTVVURVggKi8KLQotCXJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzbXV0ZXhfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXNtdXRleF9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZDAzZDIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXNtdXRleF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX211dGV4X2NfaAotI2RlZmluZSBfU0RMX211dGV4X2NfaAotCi0jaWYgIVNETF9USFJFQURTX0RJU0FCTEVECi1zdHJ1Y3QgU0RMX211dGV4IHsKLQlwdGhyZWFkX211dGV4X3QgaWQ7Ci19OwotI2VuZGlmCi0KLQotI2VuZGlmIC8qIF9TRExfbXV0ZXhfY19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c3NlbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXNzZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1ZWVlMy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c3NlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBSSVNDIE9TIHNlbWlwaG9yZXMgYmFzZWQgb24gbGludXggY29kZSAqLwotCi0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX3N5c3RocmVhZF9jLmgiCi0KLSNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKLQotU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKLXsKLQlTRExfU2V0RXJyb3IoIlNETCBub3QgY29uZmlndXJlZCB3aXRoIHRocmVhZCBzdXBwb3J0Iik7Ci0JcmV0dXJuIChTRExfc2VtICopMDsKLX0KLQotdm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCi17Ci0JcmV0dXJuOwotfQotCi1pbnQgU0RMX1NlbVRyeVdhaXQoU0RMX3NlbSAqc2VtKQotewotCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLWludCBTRExfU2VtV2FpdFRpbWVvdXQoU0RMX3NlbSAqc2VtLCBVaW50MzIgdGltZW91dCkKLXsKLQlTRExfU2V0RXJyb3IoIlNETCBub3QgY29uZmlndXJlZCB3aXRoIHRocmVhZCBzdXBwb3J0Iik7Ci0JcmV0dXJuIC0xOwotfQotCi1pbnQgU0RMX1NlbVdhaXQoU0RMX3NlbSAqc2VtKQotewotCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLVVpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQotewotCXJldHVybiAwOwotfQotCi1pbnQgU0RMX1NlbVBvc3QoU0RMX3NlbSAqc2VtKQotewotCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLSNlbHNlCi0KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgkJCS8qIEZvciBnZXRwaWQoKSAqLwotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KLQotc3RydWN0IFNETF9zZW1hcGhvcmUgewotCXNlbV90ICpzZW07Ci0Jc2VtX3Qgc2VtX2RhdGE7Ci19OwotCi0vKiBDcmVhdGUgYSBzZW1hcGhvcmUsIGluaXRpYWxpemVkIHdpdGggdmFsdWUgKi8KLVNETF9zZW0gKlNETF9DcmVhdGVTZW1hcGhvcmUoVWludDMyIGluaXRpYWxfdmFsdWUpCi17Ci0JU0RMX3NlbSAqc2VtID0gKFNETF9zZW0gKikgU0RMX21hbGxvYyhzaXplb2YoU0RMX3NlbSkpOwotCWlmICggc2VtICkgewotCQlpZiAoIHNlbV9pbml0KCZzZW0tPnNlbV9kYXRhLCAwLCBpbml0aWFsX3ZhbHVlKSA8IDAgKSB7Ci0JCQlTRExfU2V0RXJyb3IoInNlbV9pbml0KCkgZmFpbGVkIik7Ci0JCQlTRExfZnJlZShzZW0pOwotCQkJc2VtID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCXNlbS0+c2VtID0gJnNlbS0+c2VtX2RhdGE7Ci0JCX0KLQl9IGVsc2UgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQl9Ci0JcmV0dXJuIHNlbTsKLX0KLQotdm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCi17Ci0JaWYgKCBzZW0gKSB7Ci0JCXNlbV9kZXN0cm95KHNlbS0+c2VtKTsKLQkJU0RMX2ZyZWUoc2VtKTsKLQl9Ci19Ci0KLWludCBTRExfU2VtVHJ5V2FpdChTRExfc2VtICpzZW0pCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR2YWwgPSBTRExfTVVURVhfVElNRURPVVQ7Ci0JaWYgKCBzZW1fdHJ5d2FpdChzZW0tPnNlbSkgPT0gMCApIHsKLQkJcmV0dmFsID0gMDsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotaW50IFNETF9TZW1XYWl0KFNETF9zZW0gKnNlbSkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCAhIHNlbSApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jd2hpbGUgKCAoKHJldHZhbCA9IHNlbV93YWl0KHNlbS0+c2VtKSkgPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikgKSB7fQotCWlmICggcmV0dmFsIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJzZW1fd2FpdCgpIGZhaWxlZCIpOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFRyeSB0aGUgZWFzeSBjYXNlcyBmaXJzdCAqLwotCWlmICggdGltZW91dCA9PSAwICkgewotCQlyZXR1cm4gU0RMX1NlbVRyeVdhaXQoc2VtKTsKLQl9Ci0JaWYgKCB0aW1lb3V0ID09IFNETF9NVVRFWF9NQVhXQUlUICkgewotCQlyZXR1cm4gU0RMX1NlbVdhaXQoc2VtKTsKLQl9Ci0KLQkvKiBBY2shICBXZSBoYXZlIHRvIGJ1c3kgd2FpdC4uLiAqLwotCXRpbWVvdXQgKz0gU0RMX0dldFRpY2tzKCk7Ci0JZG8gewotCQlyZXR2YWwgPSBTRExfU2VtVHJ5V2FpdChzZW0pOwotCQlpZiAoIHJldHZhbCA9PSAwICkgewotCQkJYnJlYWs7Ci0JCX0KLQkJU0RMX0RlbGF5KDEpOwotCX0gd2hpbGUgKCBTRExfR2V0VGlja3MoKSA8IHRpbWVvdXQgKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLVVpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQotewotCWludCByZXQgPSAwOwotCWlmICggc2VtICkgewotCQlzZW1fZ2V0dmFsdWUoc2VtLT5zZW0sICZyZXQpOwotCQlpZiAoIHJldCA8IDAgKSB7Ci0JCQlyZXQgPSAwOwotCQl9Ci0JfQotCXJldHVybiAoVWludDMyKXJldDsKLX0KLQotaW50IFNETF9TZW1Qb3N0KFNETF9zZW0gKnNlbSkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKCAhIHNlbSApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dmFsID0gc2VtX3Bvc3Qoc2VtLT5zZW0pOwotCWlmICggcmV0dmFsIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJzZW1fcG9zdCgpIGZhaWxlZCIpOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0jZW5kaWYgLyogIVNETF9USFJFQURTX0RJU0FCTEVEICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c3RocmVhZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXN0aHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4YmI5ZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c3RocmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBSSVNDIE9TIHZlcnNpb24gYmFzZWQgb24gcHRocmVhZHMgbGludXggc291cmNlICovCi0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3RocmVhZC5oIgotCi0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLQotaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncykKLXsKLQlTRExfU2V0RXJyb3IoIlRocmVhZHMgaGF2ZSBub3QgYmVlbiBjb21waWxlZCBpbnRvIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSIpOwotCXJldHVybigtMSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19TZXR1cFRocmVhZCh2b2lkKQotewotCXJldHVybjsKLX0KLQotVWludDMyIFNETF9UaHJlYWRJRCh2b2lkKQotewotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQotewotCXJldHVybjsKLX0KLQotdm9pZCBTRExfU1lTX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQotewotCXJldHVybjsKLX0KLQotI2Vsc2UKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBMaXN0IG9mIHNpZ25hbHMgdG8gbWFzayBpbiB0aGUgc3VidGhyZWFkcyAqLwotc3RhdGljIGludCBzaWdfbGlzdFtdID0gewotCVNJR0hVUCwgU0lHSU5ULCBTSUdRVUlULCBTSUdQSVBFLCBTSUdBTFJNLCBTSUdURVJNLCBTSUdDSExELCBTSUdXSU5DSCwKLQlTSUdWVEFMUk0sIFNJR1BST0YsIDAKLX07Ci0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLWludCByaXNjb3NfdXNpbmdfdGhyZWFkcyA9IDA7Ci1VaW50MzIgcmlzY29zX21haW5fdGhyZWFkID0gMDsgLyogVGhyZWFkIHJ1bm5pbmcgZXZlbnRzICovCi0KLXN0YXRpYyB2b2lkICpSdW5UaHJlYWQodm9pZCAqZGF0YSkKLXsKLQlTRExfUnVuVGhyZWFkKGRhdGEpOwotCXB0aHJlYWRfZXhpdCgodm9pZCopMCk7Ci0JcmV0dXJuKCh2b2lkICopMCk7CQkvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcgKi8KLX0KLQotaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncykKLXsKLQlwdGhyZWFkX2F0dHJfdCB0eXBlOwotCi0JLyogU2V0IHRoZSB0aHJlYWQgYXR0cmlidXRlcyAqLwotCWlmICggcHRocmVhZF9hdHRyX2luaXQoJnR5cGUpICE9IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgaW5pdGlhbGl6ZSBwdGhyZWFkIGF0dHJpYnV0ZXMiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0eXBlLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7Ci0KLQkvKiBDcmVhdGUgdGhlIHRocmVhZCBhbmQgZ28hICovCi0JaWYgKCBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLT5oYW5kbGUsICZ0eXBlLCBSdW5UaHJlYWQsIGFyZ3MpICE9IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiTm90IGVub3VnaCByZXNvdXJjZXMgdG8gY3JlYXRlIHRocmVhZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotICAgICAgICBpZiAocmlzY29zX3VzaW5nX3RocmVhZHMgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICByaXNjb3NfdXNpbmdfdGhyZWFkcyA9IDE7Ci0gICAgICAgICAgIHJpc2Nvc19tYWluX3RocmVhZCA9IFNETF9UaHJlYWRJRCgpOwotICAgICAgICB9Ci0gICAgICAKLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgU0RMX1NZU19TZXR1cFRocmVhZCh2b2lkKQotewotCWludCBpOwotCXNpZ3NldF90IG1hc2s7Ci0KLQkvKiBNYXNrIGFzeW5jaHJvbm91cyBzaWduYWxzIGZvciB0aGlzIHRocmVhZCAqLwotCXNpZ2VtcHR5c2V0KCZtYXNrKTsKLQlmb3IgKCBpPTA7IHNpZ19saXN0W2ldOyArK2kgKSB7Ci0JCXNpZ2FkZHNldCgmbWFzaywgc2lnX2xpc3RbaV0pOwotCX0KLQlwdGhyZWFkX3NpZ21hc2soU0lHX0JMT0NLLCAmbWFzaywgMCk7Ci0JCi0jaWZkZWYgUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTCi0JLyogQWxsb3cgb3Vyc2VsdmVzIHRvIGJlIGFzeW5jaHJvbm91c2x5IGNhbmNlbGxlZCAqLwotCXsgaW50IG9sZHN0YXRlOwotCQlwdGhyZWFkX3NldGNhbmNlbHR5cGUoUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmb2xkc3RhdGUpOwotCX0KLSNlbmRpZgotfQotCi1VaW50MzIgU0RMX1RocmVhZElEKHZvaWQpCi17Ci0JcmV0dXJuKChVaW50MzIpcHRocmVhZF9zZWxmKCkpOwotfQotCi12b2lkIFNETF9TWVNfV2FpdFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCi17Ci0JcHRocmVhZF9qb2luKHRocmVhZC0+aGFuZGxlLCAwKTsKLX0KLQotdm9pZCBTRExfU1lTX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQotewotI2lmZGVmIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUwotCXB0aHJlYWRfY2FuY2VsKHRocmVhZC0+aGFuZGxlKTsKLSNlbHNlCi0JcHRocmVhZF9raWxsKHRocmVhZC0+aGFuZGxlLCBTSUdLSUxMKTsKLSNlbmRpZgotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzdGhyZWFkX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzdGhyZWFkX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4NjdhNi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c3RocmVhZF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmIFNETF9USFJFQURTX0RJU0FCTEVECi0KLXR5cGVkZWYgaW50IFNZU19UaHJlYWRIYW5kbGU7Ci0KLSNlbHNlCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLXR5cGVkZWYgcHRocmVhZF90IFNZU19UaHJlYWRIYW5kbGU7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c211dGV4LmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzbXV0ZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4MzgyOS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzbXV0ZXguYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBNdXRleCBmdW5jdGlvbnMgdXNpbmcgdGhlIFdpbjMyIEFQSSAqLwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJTRExfbXV0ZXguaCIKLQotCi1zdHJ1Y3QgU0RMX211dGV4IHsKLQlIQU5ETEUgaWQ7Ci19OwotCi0vKiBDcmVhdGUgYSBtdXRleCAqLwotU0RMX211dGV4ICpTRExfQ3JlYXRlTXV0ZXgodm9pZCkKLXsKLQlTRExfbXV0ZXggKm11dGV4OwotCi0JLyogQWxsb2NhdGUgbXV0ZXggbWVtb3J5ICovCi0JbXV0ZXggPSAoU0RMX211dGV4ICopU0RMX21hbGxvYyhzaXplb2YoKm11dGV4KSk7Ci0JaWYgKCBtdXRleCApIHsKLQkJLyogQ3JlYXRlIHRoZSBtdXRleCwgd2l0aCBpbml0aWFsIHZhbHVlIHNpZ25hbGVkICovCi0JCW11dGV4LT5pZCA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKTsKLQkJaWYgKCAhIG11dGV4LT5pZCApIHsKLQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIG11dGV4Iik7Ci0JCQlTRExfZnJlZShtdXRleCk7Ci0JCQltdXRleCA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQl9Ci0JcmV0dXJuKG11dGV4KTsKLX0KLQotLyogRnJlZSB0aGUgbXV0ZXggKi8KLXZvaWQgU0RMX0Rlc3Ryb3lNdXRleChTRExfbXV0ZXggKm11dGV4KQotewotCWlmICggbXV0ZXggKSB7Ci0JCWlmICggbXV0ZXgtPmlkICkgewotCQkJQ2xvc2VIYW5kbGUobXV0ZXgtPmlkKTsKLQkJCW11dGV4LT5pZCA9IDA7Ci0JCX0KLQkJU0RMX2ZyZWUobXV0ZXgpOwotCX0KLX0KLQotLyogTG9jayB0aGUgbXV0ZXggKi8KLWludCBTRExfbXV0ZXhQKFNETF9tdXRleCAqbXV0ZXgpCi17Ci0JaWYgKCBtdXRleCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIFdhaXRGb3JTaW5nbGVPYmplY3QobXV0ZXgtPmlkLCBJTkZJTklURSkgPT0gV0FJVF9GQUlMRUQgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgd2FpdCBvbiBtdXRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybigwKTsKLX0KLQotLyogVW5sb2NrIHRoZSBtdXRleCAqLwotaW50IFNETF9tdXRleFYoU0RMX211dGV4ICptdXRleCkKLXsKLQlpZiAoIG11dGV4ID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICggUmVsZWFzZU11dGV4KG11dGV4LT5pZCkgPT0gRkFMU0UgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgcmVsZWFzZSBtdXRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3dpbjMyL1NETF9zeXNzZW0uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3dpbjMyL1NETF9zeXNzZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhMWJmZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzc2VtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFNlbWFwaG9yZSBmdW5jdGlvbnMgdXNpbmcgdGhlIFdpbjMyIEFQSSAqLwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAoX1dJTjMyX1dDRSA8IDMwMCkKLSNpbmNsdWRlICJ3aW5fY2Vfc2VtYXBob3JlLmgiCi0jZW5kaWYKLQotCi1zdHJ1Y3QgU0RMX3NlbWFwaG9yZSB7Ci0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAoX1dJTjMyX1dDRSA8IDMwMCkKLQlTWU5DSEhBTkRMRSBpZDsKLSNlbHNlCi0JSEFORExFIGlkOwotI2VuZGlmCi0JVWludDMyIHZvbGF0aWxlIGNvdW50OwotfTsKLQotCi0vKiBDcmVhdGUgYSBzZW1hcGhvcmUgKi8KLVNETF9zZW0gKlNETF9DcmVhdGVTZW1hcGhvcmUoVWludDMyIGluaXRpYWxfdmFsdWUpCi17Ci0JU0RMX3NlbSAqc2VtOwotCi0JLyogQWxsb2NhdGUgc2VtIG1lbW9yeSAqLwotCXNlbSA9IChTRExfc2VtICopU0RMX21hbGxvYyhzaXplb2YoKnNlbSkpOwotCWlmICggc2VtICkgewotCQkvKiBDcmVhdGUgdGhlIHNlbWFwaG9yZSwgd2l0aCBtYXggdmFsdWUgMzJLICovCi0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAoX1dJTjMyX1dDRSA8IDMwMCkKLQkJc2VtLT5pZCA9IENyZWF0ZVNlbWFwaG9yZUNFKE5VTEwsIGluaXRpYWxfdmFsdWUsIDMyKjEwMjQsIE5VTEwpOwotI2Vsc2UKLQkJc2VtLT5pZCA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCBpbml0aWFsX3ZhbHVlLCAzMioxMDI0LCBOVUxMKTsKLSNlbmRpZgotCQlzZW0tPmNvdW50ID0gaW5pdGlhbF92YWx1ZTsKLQkJaWYgKCAhIHNlbS0+aWQgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBzZW1hcGhvcmUiKTsKLQkJCVNETF9mcmVlKHNlbSk7Ci0JCQlzZW0gPSBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JfQotCXJldHVybihzZW0pOwotfQotCi0vKiBGcmVlIHRoZSBzZW1hcGhvcmUgKi8KLXZvaWQgU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoU0RMX3NlbSAqc2VtKQotewotCWlmICggc2VtICkgewotCQlpZiAoIHNlbS0+aWQgKSB7Ci0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAoX1dJTjMyX1dDRSA8IDMwMCkKLQkJCUNsb3NlU3luY2hIYW5kbGUoc2VtLT5pZCk7Ci0jZWxzZQotCQkJQ2xvc2VIYW5kbGUoc2VtLT5pZCk7Ci0jZW5kaWYKLQkJCXNlbS0+aWQgPSAwOwotCQl9Ci0JCVNETF9mcmVlKHNlbSk7Ci0JfQotfQotCi1pbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCi17Ci0JaW50IHJldHZhbDsKLQlEV09SRCBkd01pbGxpc2Vjb25kczsKLQotCWlmICggISBzZW0gKSB7Ci0JCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW0iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICggdGltZW91dCA9PSBTRExfTVVURVhfTUFYV0FJVCApIHsKLQkJZHdNaWxsaXNlY29uZHMgPSBJTkZJTklURTsKLQl9IGVsc2UgewotCQlkd01pbGxpc2Vjb25kcyA9IChEV09SRCl0aW1lb3V0OwotCX0KLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIChfV0lOMzJfV0NFIDwgMzAwKQotCXN3aXRjaCAoV2FpdEZvclNlbWFwaG9yZUNFKHNlbS0+aWQsIGR3TWlsbGlzZWNvbmRzKSkgewotI2Vsc2UKLQlzd2l0Y2ggKFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VtLT5pZCwgZHdNaWxsaXNlY29uZHMpKSB7Ci0jZW5kaWYKLQkgICAgY2FzZSBXQUlUX09CSkVDVF8wOgotCQktLXNlbS0+Y291bnQ7Ci0JCXJldHZhbCA9IDA7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdBSVRfVElNRU9VVDoKLQkJcmV0dmFsID0gU0RMX01VVEVYX1RJTUVET1VUOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJU0RMX1NldEVycm9yKCJXYWl0Rm9yU2luZ2xlT2JqZWN0KCkgZmFpbGVkIik7Ci0JCXJldHZhbCA9IC0xOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotaW50IFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKLXsKLQlyZXR1cm4gU0RMX1NlbVdhaXRUaW1lb3V0KHNlbSwgMCk7Ci19Ci0KLWludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCi17Ci0JcmV0dXJuIFNETF9TZW1XYWl0VGltZW91dChzZW0sIFNETF9NVVRFWF9NQVhXQUlUKTsKLX0KLQotLyogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvZiB0aGUgc2VtYXBob3JlICovCi1VaW50MzIgU0RMX1NlbVZhbHVlKFNETF9zZW0gKnNlbSkKLXsKLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gc2VtLT5jb3VudDsKLX0KLQotaW50IFNETF9TZW1Qb3N0KFNETF9zZW0gKnNlbSkKLXsKLQlpZiAoICEgc2VtICkgewotCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogSW5jcmVhc2UgdGhlIGNvdW50ZXIgaW4gdGhlIGZpcnN0IHBsYWNlLCBiZWNhdXNlCi0JICogYWZ0ZXIgYSBzdWNjZXNzZnVsIHJlbGVhc2UgdGhlIHNlbWFwaG9yZSBtYXkKLQkgKiBpbW1lZGlhdGVseSBnZXQgZGVzdHJveWVkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWNoCi0JICogaXMgd2FpdGluZyBmb3IgdGhpcyBzZW1hcGhvcmUuCi0JICovCi0JKytzZW0tPmNvdW50OwotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgKF9XSU4zMl9XQ0UgPCAzMDApCi0JaWYgKCBSZWxlYXNlU2VtYXBob3JlQ0Uoc2VtLT5pZCwgMSwgTlVMTCkgPT0gRkFMU0UgKSB7Ci0jZWxzZQotCWlmICggUmVsZWFzZVNlbWFwaG9yZShzZW0tPmlkLCAxLCBOVUxMKSA9PSBGQUxTRSApIHsKLSNlbmRpZgotCQktLXNlbS0+Y291bnQ7CS8qIHJlc3RvcmUgKi8KLQkJU0RMX1NldEVycm9yKCJSZWxlYXNlU2VtYXBob3JlKCkgZmFpbGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzdGhyZWFkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzdGhyZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjE3NmQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c3RocmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBXaW4zMiB0aHJlYWQgbWFuYWdlbWVudCByb3V0aW5lcyBmb3IgU0RMICovCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICIuLi9TRExfdGhyZWFkX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdGhyZWFkLmgiCi0KLSNpZm5kZWYgU0RMX1BBU1NFRF9CRUdJTlRIUkVBRF9FTkRUSFJFQUQKLSNpZm5kZWYgX1dJTjMyX1dDRQotLyogV2UnbGwgdXNlIHRoZSBDIGxpYnJhcnkgZnJvbSB0aGlzIERMTCAqLwotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNlbmRpZgotCi0jaWYgX19HTlVDX18KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAoX19jZGVjbCAqcGZuU0RMX0N1cnJlbnRCZWdpblRocmVhZCkgKHZvaWQgKiwgdW5zaWduZWQsCi0gICAgICAgIHVuc2lnbmVkIChfX3N0ZGNhbGwgKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZywgCi0gICAgICAgIHVuc2lnbmVkLCB1bnNpZ25lZCAqdGhyZWFkSUQpOwotdHlwZWRlZiB2b2lkIChfX2NkZWNsICpwZm5TRExfQ3VycmVudEVuZFRocmVhZCkodW5zaWduZWQgY29kZSk7Ci0jZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQotLyogVGhpcyBpcyBmb3IgV2F0Y29tIHRhcmdldHMgZXhjZXB0IE9TMiAqLwotI2lmIF9fV0FUQ09NQ19fIDwgMTI0MAotI2RlZmluZSBfX3dhdGNhbGwKLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBsb25nIChfX3dhdGNhbGwgKnBmblNETF9DdXJyZW50QmVnaW5UaHJlYWQpICh2b2lkICosIHVuc2lnbmVkLAotICAgICAgICB1bnNpZ25lZCAoX19zdGRjYWxsICpmdW5jKSh2b2lkICopLCB2b2lkICphcmcsIAotICAgICAgICB1bnNpZ25lZCwgdW5zaWduZWQgKnRocmVhZElEKTsKLXR5cGVkZWYgdm9pZCAoX193YXRjYWxsICpwZm5TRExfQ3VycmVudEVuZFRocmVhZCkodW5zaWduZWQgY29kZSk7Ci0jZWxzZQotdHlwZWRlZiB1aW50cHRyX3QgKF9fY2RlY2wgKnBmblNETF9DdXJyZW50QmVnaW5UaHJlYWQpICh2b2lkICosIHVuc2lnbmVkLAotICAgICAgICB1bnNpZ25lZCAoX19zdGRjYWxsICpmdW5jKSh2b2lkICopLCB2b2lkICphcmcsIAotICAgICAgICB1bnNpZ25lZCwgdW5zaWduZWQgKnRocmVhZElEKTsKLXR5cGVkZWYgdm9pZCAoX19jZGVjbCAqcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQpKHVuc2lnbmVkIGNvZGUpOwotI2VuZGlmCi0jZW5kaWYgLyogIVNETF9QQVNTRURfQkVHSU5USFJFQURfRU5EVEhSRUFEICovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgVGhyZWFkU3RhcnRQYXJtcwotewotICB2b2lkICphcmdzOwotICBwZm5TRExfQ3VycmVudEVuZFRocmVhZCBwZm5DdXJyZW50RW5kVGhyZWFkOwotfSB0VGhyZWFkU3RhcnRQYXJtcywgKnBUaHJlYWRTdGFydFBhcm1zOwotCi1zdGF0aWMgdW5zaWduZWQgX19zdGRjYWxsIFJ1blRocmVhZCh2b2lkICpkYXRhKQotewotICBwVGhyZWFkU3RhcnRQYXJtcyBwVGhyZWFkUGFybXMgPSAocFRocmVhZFN0YXJ0UGFybXMpZGF0YTsKLSAgcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuQ3VycmVudEVuZFRocmVhZCA9IE5VTEw7Ci0KLSAgLy8gQ2FsbCB0aGUgdGhyZWFkIGZ1bmN0aW9uIQotICBTRExfUnVuVGhyZWFkKHBUaHJlYWRQYXJtcy0+YXJncyk7Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IGVuZHRocmVhZCB3ZSBoYXZlIHRvIHVzZSEKLSAgaWYgKHBUaHJlYWRQYXJtcykKLSAgewotICAgIHBmbkN1cnJlbnRFbmRUaHJlYWQgPSBwVGhyZWFkUGFybXMtPnBmbkN1cnJlbnRFbmRUaHJlYWQ7Ci0gICAgU0RMX2ZyZWUocFRocmVhZFBhcm1zKTsKLSAgfQotICAvLyBDYWxsIGVuZHRocmVhZCEKLSAgaWYgKHBmbkN1cnJlbnRFbmRUaHJlYWQpCi0gICAgKCpwZm5DdXJyZW50RW5kVGhyZWFkKSgwKTsKLSAgcmV0dXJuKDApOwotfQotCi0jaWZkZWYgU0RMX1BBU1NFRF9CRUdJTlRIUkVBRF9FTkRUSFJFQUQKLWludCBTRExfU1lTX0NyZWF0ZVRocmVhZChTRExfVGhyZWFkICp0aHJlYWQsIHZvaWQgKmFyZ3MsIHBmblNETF9DdXJyZW50QmVnaW5UaHJlYWQgcGZuQmVnaW5UaHJlYWQsIHBmblNETF9DdXJyZW50RW5kVGhyZWFkIHBmbkVuZFRocmVhZCkKLXsKLSNlbHNlCi1pbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzKQotewotI2lmZGVmIF9XSU4zMl9XQ0UKLQlwZm5TRExfQ3VycmVudEJlZ2luVGhyZWFkIHBmbkJlZ2luVGhyZWFkID0gTlVMTDsKLQlwZm5TRExfQ3VycmVudEVuZFRocmVhZCBwZm5FbmRUaHJlYWQgPSBOVUxMOwotI2Vsc2UKLQlwZm5TRExfQ3VycmVudEJlZ2luVGhyZWFkIHBmbkJlZ2luVGhyZWFkID0gX2JlZ2ludGhyZWFkZXg7Ci0JcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuRW5kVGhyZWFkID0gX2VuZHRocmVhZGV4OwotI2VuZGlmCi0jZW5kaWYgLyogU0RMX1BBU1NFRF9CRUdJTlRIUkVBRF9FTkRUSFJFQUQgKi8KLQl1bnNpZ25lZCB0aHJlYWRpZDsKLQlwVGhyZWFkU3RhcnRQYXJtcyBwVGhyZWFkUGFybXMgPSAocFRocmVhZFN0YXJ0UGFybXMpU0RMX21hbGxvYyhzaXplb2YodFRocmVhZFN0YXJ0UGFybXMpKTsKLQlpZiAoIXBUaHJlYWRQYXJtcykgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvLyBTYXZlIHRoZSBmdW5jdGlvbiB3aGljaCB3ZSB3aWxsIGhhdmUgdG8gY2FsbCB0byBjbGVhciB0aGUgUlRMIG9mIGNhbGxpbmcgYXBwIQotCXBUaHJlYWRQYXJtcy0+cGZuQ3VycmVudEVuZFRocmVhZCA9IHBmbkVuZFRocmVhZDsKLQkvLyBBbHNvIHNhdmUgdGhlIHJlYWwgcGFyYW1ldGVycyB3ZSBoYXZlIHRvIHBhc3MgdG8gdGhyZWFkIGZ1bmN0aW9uCi0JcFRocmVhZFBhcm1zLT5hcmdzID0gYXJnczsKLQotCWlmIChwZm5CZWdpblRocmVhZCkgewotCQl0aHJlYWQtPmhhbmRsZSA9IChTWVNfVGhyZWFkSGFuZGxlKSBwZm5CZWdpblRocmVhZChOVUxMLCAwLCBSdW5UaHJlYWQsCi0JCQkJcFRocmVhZFBhcm1zLCAwLCAmdGhyZWFkaWQpOwotCX0gZWxzZSB7Ci0JCXRocmVhZC0+aGFuZGxlID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIFJ1blRocmVhZCwgcFRocmVhZFBhcm1zLCAwLCAmdGhyZWFkaWQpOwotCX0KLQlpZiAodGhyZWFkLT5oYW5kbGUgPT0gTlVMTCkgewotCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIFNETF9TWVNfU2V0dXBUaHJlYWQodm9pZCkKLXsKLQlyZXR1cm47Ci19Ci0KLVVpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKLXsKLQlyZXR1cm4oKFVpbnQzMilHZXRDdXJyZW50VGhyZWFkSWQoKSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKLXsKLQlXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZC0+aGFuZGxlLCBJTkZJTklURSk7Ci0JQ2xvc2VIYW5kbGUodGhyZWFkLT5oYW5kbGUpOwotfQotCi0vKiBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIGlzIHJlYWxseSBhIGxhc3QgcmVzb3J0LgotICogVGhyZWFkcyBzaG91bGQgYmUgc2lnbmFsZWQgYW5kIHRoZW4gZXhpdCBieSB0aGVtc2VsdmVzLgotICogVGVybWluYXRlVGhyZWFkKCkgZG9lc24ndCBwZXJmb3JtIHN0YWNrIGFuZCBETEwgY2xlYW51cC4KLSAqLwotdm9pZCBTRExfU1lTX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQotewotCVRlcm1pbmF0ZVRocmVhZCh0aHJlYWQtPmhhbmRsZSwgRkFMU0UpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c3RocmVhZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzdGhyZWFkX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2YTk1OC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzdGhyZWFkX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLXR5cGVkZWYgSEFORExFIFNZU19UaHJlYWRIYW5kbGU7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvU0RMX3N5c3RpbWVyLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL1NETF9zeXN0aW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWM3YjNiLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvU0RMX3N5c3RpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhlIHN5c3RlbSBkZXBlbmRlbnQgdGltZXIgaGFuZGxpbmcgZnVuY3Rpb25zICovCi0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfdGltZXJfYy5oIgotCi0KLS8qIEluaXRpYWxpemUgdGhlIHN5c3RlbSBkZXBlbmRlbnQgdGltZXIgc3Vic3lzdGVtICovCi1leHRlcm4gaW50IFNETF9TWVNfVGltZXJJbml0KHZvaWQpOwotCi0vKiBRdWl0IHRoZSBzeXN0ZW0gZGVwZW5kZW50IHRpbWVyIHN1YnN5c3RlbSAqLwotZXh0ZXJuIHZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCk7Ci0KLS8qIFN0YXJ0IGEgdGltZXIgc2V0IHVwIGJ5IFNETF9TZXRUaW1lcigpICovCi1leHRlcm4gaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKTsKLQotLyogU3RvcCBhIHByZXZpb3VzbHkgc3RhcnRlZCB0aW1lciAqLwotZXh0ZXJuIHZvaWQgU0RMX1NZU19TdG9wVGltZXIodm9pZCk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL1NETF90aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9TRExfdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5ODQzMS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL1NETF90aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX3RpbWVyX2MuaCIKLSNpbmNsdWRlICJTRExfbXV0ZXguaCIKLSNpbmNsdWRlICJTRExfc3lzdGltZXIuaCIKLQotLyogI2RlZmluZSBERUJVR19USU1FUlMgKi8KLQotaW50IFNETF90aW1lcl9zdGFydGVkID0gMDsKLWludCBTRExfdGltZXJfcnVubmluZyA9IDA7Ci0KLS8qIERhdGEgdG8gaGFuZGxlIGEgc2luZ2xlIHBlcmlvZGljIGFsYXJtICovCi1VaW50MzIgU0RMX2FsYXJtX2ludGVydmFsID0gMDsKLVNETF9UaW1lckNhbGxiYWNrIFNETF9hbGFybV9jYWxsYmFjazsKLQotLyogRGF0YSB1c2VkIGZvciBhIHRocmVhZC1iYXNlZCB0aW1lciAqLwotc3RhdGljIGludCBTRExfdGltZXJfdGhyZWFkZWQgPSAwOwotCi1zdHJ1Y3QgX1NETF9UaW1lcklEIHsKLQlVaW50MzIgaW50ZXJ2YWw7Ci0JU0RMX05ld1RpbWVyQ2FsbGJhY2sgY2I7Ci0Jdm9pZCAqcGFyYW07Ci0JVWludDMyIGxhc3RfYWxhcm07Ci0Jc3RydWN0IF9TRExfVGltZXJJRCAqbmV4dDsKLX07Ci0KLXN0YXRpYyBTRExfVGltZXJJRCBTRExfdGltZXJzID0gTlVMTDsKLXN0YXRpYyBTRExfbXV0ZXggKlNETF90aW1lcl9tdXRleDsKLXN0YXRpYyB2b2xhdGlsZSBTRExfYm9vbCBsaXN0X2NoYW5nZWQgPSBTRExfRkFMU0U7Ci0KLS8qIFNldCB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgc2hvdWxkIHVzZSBhIHRocmVhZC4KLSAgIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hpbGUgdGhlIHRpbWVyIHN1YnN5c3RlbSBpcyBydW5uaW5nLgotKi8KLWludCBTRExfU2V0VGltZXJUaHJlYWRlZChpbnQgdmFsdWUpCi17Ci0JaW50IHJldHZhbDsKLQotCWlmICggU0RMX3RpbWVyX3N0YXJ0ZWQgKSB7Ci0JCVNETF9TZXRFcnJvcigiVGltZXIgYWxyZWFkeSBpbml0aWFsaXplZCIpOwotCQlyZXR2YWwgPSAtMTsKLQl9IGVsc2UgewotCQlyZXR2YWwgPSAwOwotCQlTRExfdGltZXJfdGhyZWFkZWQgPSB2YWx1ZTsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotaW50IFNETF9UaW1lckluaXQodm9pZCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gMDsKLQlpZiAoIFNETF90aW1lcl9zdGFydGVkICkgewotCQlTRExfVGltZXJRdWl0KCk7Ci0JfQotCWlmICggISBTRExfdGltZXJfdGhyZWFkZWQgKSB7Ci0JCXJldHZhbCA9IFNETF9TWVNfVGltZXJJbml0KCk7Ci0JfQotCWlmICggU0RMX3RpbWVyX3RocmVhZGVkICkgewotCQlTRExfdGltZXJfbXV0ZXggPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLQl9Ci0JaWYgKCByZXR2YWwgPT0gMCApIHsKLQkJU0RMX3RpbWVyX3N0YXJ0ZWQgPSAxOwotCX0KLQlyZXR1cm4ocmV0dmFsKTsKLX0KLQotdm9pZCBTRExfVGltZXJRdWl0KHZvaWQpCi17Ci0JU0RMX1NldFRpbWVyKDAsIE5VTEwpOwotCWlmICggU0RMX3RpbWVyX3RocmVhZGVkIDwgMiApIHsKLQkJU0RMX1NZU19UaW1lclF1aXQoKTsKLQl9Ci0JaWYgKCBTRExfdGltZXJfdGhyZWFkZWQgKSB7Ci0JCVNETF9EZXN0cm95TXV0ZXgoU0RMX3RpbWVyX211dGV4KTsKLQkJU0RMX3RpbWVyX211dGV4ID0gTlVMTDsKLQl9Ci0JU0RMX3RpbWVyX3N0YXJ0ZWQgPSAwOwotCVNETF90aW1lcl90aHJlYWRlZCA9IDA7Ci19Ci0KLXZvaWQgU0RMX1RocmVhZGVkVGltZXJDaGVjayh2b2lkKQotewotCVVpbnQzMiBub3csIG1zOwotCVNETF9UaW1lcklEIHQsIHByZXYsIG5leHQ7Ci0JU0RMX2Jvb2wgcmVtb3ZlZDsKLQotCVNETF9tdXRleFAoU0RMX3RpbWVyX211dGV4KTsKLQlsaXN0X2NoYW5nZWQgPSBTRExfRkFMU0U7Ci0Jbm93ID0gU0RMX0dldFRpY2tzKCk7Ci0JZm9yICggcHJldiA9IE5VTEwsIHQgPSBTRExfdGltZXJzOyB0OyB0ID0gbmV4dCApIHsKLQkJcmVtb3ZlZCA9IFNETF9GQUxTRTsKLQkJbXMgPSB0LT5pbnRlcnZhbCAtIFNETF9USU1FU0xJQ0U7Ci0JCW5leHQgPSB0LT5uZXh0OwotCQlpZiAoIChpbnQpKG5vdyAtIHQtPmxhc3RfYWxhcm0pID4gKGludCltcyApIHsKLQkJCXN0cnVjdCBfU0RMX1RpbWVySUQgdGltZXI7Ci0KLQkJCWlmICggKG5vdyAtIHQtPmxhc3RfYWxhcm0pIDwgdC0+aW50ZXJ2YWwgKSB7Ci0JCQkJdC0+bGFzdF9hbGFybSArPSB0LT5pbnRlcnZhbDsKLQkJCX0gZWxzZSB7Ci0JCQkJdC0+bGFzdF9hbGFybSA9IG5vdzsKLQkJCX0KLSNpZmRlZiBERUJVR19USU1FUlMKLQkJCXByaW50ZigiRXhlY3V0aW5nIHRpbWVyICVwICh0aHJlYWQgPSAlZClcbiIsCi0JCQkJdCwgU0RMX1RocmVhZElEKCkpOwotI2VuZGlmCi0JCQl0aW1lciA9ICp0OwotCQkJU0RMX211dGV4VihTRExfdGltZXJfbXV0ZXgpOwotCQkJbXMgPSB0aW1lci5jYih0aW1lci5pbnRlcnZhbCwgdGltZXIucGFyYW0pOwotCQkJU0RMX211dGV4UChTRExfdGltZXJfbXV0ZXgpOwotCQkJaWYgKCBsaXN0X2NoYW5nZWQgKSB7Ci0JCQkJLyogQWJvcnQsIGxpc3Qgb2YgdGltZXJzIG1vZGlmaWVkICovCi0JCQkJLyogRklYTUU6IHdoYXQgaWYgbXMgd2FzIGNoYW5nZWQ/ICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIG1zICE9IHQtPmludGVydmFsICkgewotCQkJCWlmICggbXMgKSB7Ci0JCQkJCXQtPmludGVydmFsID0gUk9VTkRfUkVTT0xVVElPTihtcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogUmVtb3ZlIHRpbWVyIGZyb20gdGhlIGxpc3QgKi8KLSNpZmRlZiBERUJVR19USU1FUlMKLQkJCQkJcHJpbnRmKCJTREw6IFJlbW92aW5nIHRpbWVyICVwXG4iLCB0KTsKLSNlbmRpZgotCQkJCQlpZiAoIHByZXYgKSB7Ci0JCQkJCQlwcmV2LT5uZXh0ID0gbmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVNETF90aW1lcnMgPSBuZXh0OwotCQkJCQl9Ci0JCQkJCVNETF9mcmVlKHQpOwotCQkJCQktLVNETF90aW1lcl9ydW5uaW5nOwotCQkJCQlyZW1vdmVkID0gU0RMX1RSVUU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8qIERvbid0IHVwZGF0ZSBwcmV2IGlmIHRoZSB0aW1lciBoYXMgZGlzYXBwZWFyZWQgKi8KLQkJaWYgKCAhIHJlbW92ZWQgKSB7Ci0JCQlwcmV2ID0gdDsKLQkJfQotCX0KLQlTRExfbXV0ZXhWKFNETF90aW1lcl9tdXRleCk7Ci19Ci0KLXN0YXRpYyBTRExfVGltZXJJRCBTRExfQWRkVGltZXJJbnRlcm5hbChVaW50MzIgaW50ZXJ2YWwsIFNETF9OZXdUaW1lckNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwYXJhbSkKLXsKLQlTRExfVGltZXJJRCB0OwotCXQgPSAoU0RMX1RpbWVySUQpIFNETF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBfU0RMX1RpbWVySUQpKTsKLQlpZiAoIHQgKSB7Ci0JCXQtPmludGVydmFsID0gUk9VTkRfUkVTT0xVVElPTihpbnRlcnZhbCk7Ci0JCXQtPmNiID0gY2FsbGJhY2s7Ci0JCXQtPnBhcmFtID0gcGFyYW07Ci0JCXQtPmxhc3RfYWxhcm0gPSBTRExfR2V0VGlja3MoKTsKLQkJdC0+bmV4dCA9IFNETF90aW1lcnM7Ci0JCVNETF90aW1lcnMgPSB0OwotCQkrK1NETF90aW1lcl9ydW5uaW5nOwotCQlsaXN0X2NoYW5nZWQgPSBTRExfVFJVRTsKLQl9Ci0jaWZkZWYgREVCVUdfVElNRVJTCi0JcHJpbnRmKCJTRExfQWRkVGltZXIoJWQpID0gJTA4eCBudW1fdGltZXJzID0gJWRcbiIsIGludGVydmFsLCAoVWludDMyKXQsIFNETF90aW1lcl9ydW5uaW5nKTsKLSNlbmRpZgotCXJldHVybiB0OwotfQotCi1TRExfVGltZXJJRCBTRExfQWRkVGltZXIoVWludDMyIGludGVydmFsLCBTRExfTmV3VGltZXJDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqcGFyYW0pCi17Ci0JU0RMX1RpbWVySUQgdDsKLQlpZiAoICEgU0RMX3RpbWVyX211dGV4ICkgewotCQlpZiAoIFNETF90aW1lcl9zdGFydGVkICkgewotCQkJU0RMX1NldEVycm9yKCJUaGlzIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBsZSB0aW1lcnMiKTsKLQkJfSBlbHNlIHsKLQkJCVNETF9TZXRFcnJvcigiWW91IG11c3QgY2FsbCBTRExfSW5pdChTRExfSU5JVF9USU1FUikgZmlyc3QiKTsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCAhIFNETF90aW1lcl90aHJlYWRlZCApIHsKLQkJU0RMX1NldEVycm9yKCJNdWx0aXBsZSB0aW1lcnMgcmVxdWlyZSB0aHJlYWRlZCBldmVudHMhIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlTRExfbXV0ZXhQKFNETF90aW1lcl9tdXRleCk7Ci0JdCA9IFNETF9BZGRUaW1lckludGVybmFsKGludGVydmFsLCBjYWxsYmFjaywgcGFyYW0pOwotCVNETF9tdXRleFYoU0RMX3RpbWVyX211dGV4KTsKLQlyZXR1cm4gdDsKLX0KLQotU0RMX2Jvb2wgU0RMX1JlbW92ZVRpbWVyKFNETF9UaW1lcklEIGlkKQotewotCVNETF9UaW1lcklEIHQsIHByZXYgPSBOVUxMOwotCVNETF9ib29sIHJlbW92ZWQ7Ci0KLQlyZW1vdmVkID0gU0RMX0ZBTFNFOwotCVNETF9tdXRleFAoU0RMX3RpbWVyX211dGV4KTsKLQkvKiBMb29rIGZvciBpZCBpbiB0aGUgbGlua2VkIGxpc3Qgb2YgdGltZXJzICovCi0JZm9yICh0ID0gU0RMX3RpbWVyczsgdDsgcHJldj10LCB0ID0gdC0+bmV4dCApIHsKLQkJaWYgKCB0ID09IGlkICkgewotCQkJaWYocHJldikgewotCQkJCXByZXYtPm5leHQgPSB0LT5uZXh0OwotCQkJfSBlbHNlIHsKLQkJCQlTRExfdGltZXJzID0gdC0+bmV4dDsKLQkJCX0KLQkJCVNETF9mcmVlKHQpOwotCQkJLS1TRExfdGltZXJfcnVubmluZzsKLQkJCXJlbW92ZWQgPSBTRExfVFJVRTsKLQkJCWxpc3RfY2hhbmdlZCA9IFNETF9UUlVFOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0jaWZkZWYgREVCVUdfVElNRVJTCi0JcHJpbnRmKCJTRExfUmVtb3ZlVGltZXIoJTA4eCkgPSAlZCBudW1fdGltZXJzID0gJWQgdGhyZWFkID0gJWRcbiIsIChVaW50MzIpaWQsIHJlbW92ZWQsIFNETF90aW1lcl9ydW5uaW5nLCBTRExfVGhyZWFkSUQoKSk7Ci0jZW5kaWYKLQlTRExfbXV0ZXhWKFNETF90aW1lcl9tdXRleCk7Ci0JcmV0dXJuIHJlbW92ZWQ7Ci19Ci0KLS8qIE9sZCBzdHlsZSBjYWxsYmFjayBmdW5jdGlvbnMgYXJlIHdyYXBwZWQgdGhyb3VnaCB0aGlzICovCi1zdGF0aWMgVWludDMyIFNETENBTEwgY2FsbGJhY2tfd3JhcHBlcihVaW50MzIgbXMsIHZvaWQgKnBhcmFtKQotewotCVNETF9UaW1lckNhbGxiYWNrIGZ1bmMgPSAoU0RMX1RpbWVyQ2FsbGJhY2spIHBhcmFtOwotCXJldHVybiAoKmZ1bmMpKG1zKTsKLX0KLQotaW50IFNETF9TZXRUaW1lcihVaW50MzIgbXMsIFNETF9UaW1lckNhbGxiYWNrIGNhbGxiYWNrKQotewotCWludCByZXR2YWw7Ci0KLSNpZmRlZiBERUJVR19USU1FUlMKLQlwcmludGYoIlNETF9TZXRUaW1lciglZClcbiIsIG1zKTsKLSNlbmRpZgotCXJldHZhbCA9IDA7Ci0KLQlpZiAoIFNETF90aW1lcl90aHJlYWRlZCApIHsKLQkJU0RMX211dGV4UChTRExfdGltZXJfbXV0ZXgpOwotCX0KLQlpZiAoIFNETF90aW1lcl9ydW5uaW5nICkgewkvKiBTdG9wIGFueSBjdXJyZW50bHkgcnVubmluZyB0aW1lciAqLwotCQlpZiAoIFNETF90aW1lcl90aHJlYWRlZCApIHsKLQkJCXdoaWxlICggU0RMX3RpbWVycyApIHsKLQkJCQlTRExfVGltZXJJRCBmcmVlbWUgPSBTRExfdGltZXJzOwotCQkJCVNETF90aW1lcnMgPSBTRExfdGltZXJzLT5uZXh0OwotCQkJCVNETF9mcmVlKGZyZWVtZSk7Ci0JCQl9Ci0JCQlTRExfdGltZXJfcnVubmluZyA9IDA7Ci0JCQlsaXN0X2NoYW5nZWQgPSBTRExfVFJVRTsKLQkJfSBlbHNlIHsKLQkJCVNETF9TWVNfU3RvcFRpbWVyKCk7Ci0JCQlTRExfdGltZXJfcnVubmluZyA9IDA7Ci0JCX0KLQl9Ci0JaWYgKCBtcyApIHsKLQkJaWYgKCBTRExfdGltZXJfdGhyZWFkZWQgKSB7Ci0JCQlpZiAoIFNETF9BZGRUaW1lckludGVybmFsKG1zLCBjYWxsYmFja193cmFwcGVyLCAodm9pZCAqKWNhbGxiYWNrKSA9PSBOVUxMICkgewotCQkJCXJldHZhbCA9IC0xOwotCQkJfQotCQl9IGVsc2UgewotCQkJU0RMX3RpbWVyX3J1bm5pbmcgPSAxOwotCQkJU0RMX2FsYXJtX2ludGVydmFsID0gbXM7Ci0JCQlTRExfYWxhcm1fY2FsbGJhY2sgPSBjYWxsYmFjazsKLQkJCXJldHZhbCA9IFNETF9TWVNfU3RhcnRUaW1lcigpOwotCQl9Ci0JfQotCWlmICggU0RMX3RpbWVyX3RocmVhZGVkICkgewotCQlTRExfbXV0ZXhWKFNETF90aW1lcl9tdXRleCk7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvU0RMX3RpbWVyX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvU0RMX3RpbWVyX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5Y2QxMi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL1NETF90aW1lcl9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVXNlZnVsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGZyb20gU0RMX3RpbWVyLmMgKi8KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLQotI2RlZmluZSBST1VORF9SRVNPTFVUSU9OKFgpCVwKLQkoKChYK1RJTUVSX1JFU09MVVRJT04tMSkvVElNRVJfUkVTT0xVVElPTikqVElNRVJfUkVTT0xVVElPTikKLQotZXh0ZXJuIGludCBTRExfdGltZXJfc3RhcnRlZDsKLWV4dGVybiBpbnQgU0RMX3RpbWVyX3J1bm5pbmc7Ci0KLS8qIERhdGEgdG8gaGFuZGxlIGEgc2luZ2xlIHBlcmlvZGljIGFsYXJtICovCi1leHRlcm4gVWludDMyIFNETF9hbGFybV9pbnRlcnZhbDsKLWV4dGVybiBTRExfVGltZXJDYWxsYmFjayBTRExfYWxhcm1fY2FsbGJhY2s7Ci0KLS8qIFNldCB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgc2hvdWxkIHVzZSBhIHRocmVhZC4KLSAgIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGlsZSB0aGUgdGltZXIgc3Vic3lzdGVtIGlzIHJ1bm5pbmcuCi0qLwotZXh0ZXJuIGludCBTRExfU2V0VGltZXJUaHJlYWRlZChpbnQgdmFsdWUpOwotCi1leHRlcm4gaW50IFNETF9UaW1lckluaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfVGltZXJRdWl0KHZvaWQpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBTREwgZXZlbnQgdGhyZWFkIGlmIGl0IGlzIGF2YWlsYWJsZSAqLwotZXh0ZXJuIHZvaWQgU0RMX1RocmVhZGVkVGltZXJDaGVjayh2b2lkKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvYW1pZ2Fvcy9TRExfc3lzdGltZXIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvYW1pZ2Fvcy9TRExfc3lzdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxM2I2MS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL2FtaWdhb3MvU0RMX3N5c3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfVElNRVJfQU1JR0EKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXhlYy90eXBlcy5oPgotI2lmZGVmIF9fU0FTQwotI2luY2x1ZGUgPHByb3RvL2Rvcy5oPgotI2luY2x1ZGUgPGNsaWIvZ3JhcGhpY3NfcHJvdG9zLmg+Ci0jaW5jbHVkZSA8cHJhZ21hcy9ncmFwaGljcy5oPgotI2luY2x1ZGUgPGNsaWIvZXhlY19wcm90b3MuaD4KLSNpbmNsdWRlIDxwcmFnbWFzL2V4ZWMuaD4KLSNlbGlmIGRlZmluZWQoU1RPUk1DNF9XT1MpCi0jaW5jbHVkZSA8cHJvdG8vZG9zLmg+Ci0jaW5jbHVkZSA8cHJvdG8vZXhlYy5oPgotI2luY2x1ZGUgPHByb3RvL2dyYXBoaWNzLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGlubGluZS9kb3MuaD4KLSNpbmNsdWRlIDxpbmxpbmUvZXhlYy5oPgotI2luY2x1ZGUgPGlubGluZS9ncmFwaGljcy5oPgotI2VuZGlmCi0jaW5jbHVkZSAibXlkZWJ1Zy5oIgotCi1leHRlcm4gc3RydWN0IERvc0xpYnJhcnkgKkRPU0Jhc2U7Ci1leHRlcm4gc3RydWN0IEV4ZWNCYXNlICpTeXNCYXNlOwotc3RhdGljIHN0cnVjdCBHZnhCYXNlICpHZnhCYXNlOwotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3RpbWVyX2MuaCIKLQotLyogVGhlIGZpcnN0IHRpY2tzIHZhbHVlIG9mIHRoZSBhcHBsaWNhdGlvbiAqLwotCi0jaWYgIWRlZmluZWQoX19QUENfXykgfHwgZGVmaW5lZChTVE9STUM0X1dPUykgfHwgZGVmaW5lZChNT1JQSE9TKQotc3RhdGljIGNsb2NrX3Qgc3RhcnQ7Ci0KLXZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKLXsKLQkvKiBTZXQgZmlyc3QgdGlja3MgdmFsdWUgKi8KLQlzdGFydD1jbG9jaygpOwotfQotCi1VaW50MzIgU0RMX0dldFRpY2tzICh2b2lkKQotewotCWNsb2NrX3QgdGlja3M7Ci0KLQl0aWNrcz1jbG9jaygpLXN0YXJ0OwotCi0jaWZkZWYgX19TQVNDCi0vLyBDTE9DS1NfUEVSX1NFQyA9PSAxMDAwICEKLQotCXJldHVybih0aWNrcyk7Ci0jZWxzZQotLy8gQ0xPQ0tTX1BFUl9TRUMgIT0gMTAwMCAhCi0KLQlyZXR1cm4gdGlja3MqKDEwMDAvQ0xPQ0tTX1BFUl9TRUMpOwotI2VuZGlmCi19Ci0KLXZvaWQgU0RMX0RlbGF5IChVaW50MzIgbXMpCi17Ci0vLyBEbyBhIGJ1c3kgd2FpdCBpZiB0aW1lIGlzIGxlc3MgdGhhbiA1MG1zCi0KLQlpZihtczw1MCkKLQl7Ci0JCWNsb2NrX3QgdG9fd2FpdD1jbG9jaygpOwotCi0jaWZuZGVmIF9fU0FTQwotCQltcyo9KENMT0NLU19QRVJfU0VDLzEwMDApOwotI2VuZGlmCi0JCXRvX3dhaXQrPW1zOwotCi0JCXdoaWxlKGNsb2NrKCk8dG9fd2FpdCk7Ci0JfQotCWVsc2UKLQl7Ci0JCURlbGF5KG1zLzIwKTsKLQl9Ci19Ci0KLSNlbHNlCi0KLVVMT05HIE1ZX0NMT0NLU19QRVJfU0VDOwotCi12b2lkIFBQQ19UaW1lckluaXQodm9pZCk7Ci1BUFRSIE15VGltZXI7Ci0KLVVMT05HIHN0YXJ0WzJdOwotCi12b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCi17Ci0JLyogU2V0IGZpcnN0IHRpY2tzIHZhbHVlICovCi0JaWYoIU15VGltZXIpCi0JCVBQQ19UaW1lckluaXQoKTsKLQotCVBQQ0dldFRpbWVyT2JqZWN0KE15VGltZXIsUFBDVElNRVJUQUdfQ1VSUkVOVFRJQ0tTLHN0YXJ0KTsKLQlzdGFydFsxXT4+PTEwOwotCXN0YXJ0WzFdfD0oKHJlc3VsdFswXSYweDNmZik8PDIyKTsKLQlzdGFydFswXT4+PTEwOwotfQotCi1VaW50MzIgU0RMX0dldFRpY2tzICh2b2lkKQotewotCVVMT05HIHJlc3VsdFsyXTsKLQlQUENHZXRUaW1lck9iamVjdChNeVRpbWVyLFBQQ1RJTUVSVEFHX0NVUlJFTlRUSUNLUyxyZXN1bHQpOwotCi0vLwlQUENBc3I2NHAocmVzdWx0LDEwKTsKLS8vIE5vbiB2YSwgbGEgZW11bG86Ci0KLQlyZXN1bHRbMV0+Pj0xMDsKLQlyZXN1bHRbMV18PSgocmVzdWx0WzBdJjB4M2ZmKTw8MjIpOwotCi0vLyBOb24gbWkgaW50ZXJlc3NhIHBpdScgcmVzdWx0WzBdCi0KLQlyZXR1cm4gcmVzdWx0WzFdKjEwMDAvTVlfQ0xPQ0tTX1BFUl9TRUM7Ci19Ci0KLXZvaWQgU0RMX0RlbGF5IChVaW50MzIgbXMpCi17Ci0vLyBEbyBhIGJ1c3kgd2FpdCBpZiB0aW1lIGlzIGxlc3MgdGhhbiA1MG1zCi0KLQlpZihtczw1MCkKLQl7Ci0JCVVMT05HIHRvX3dhaXRbMl0sYWN0dWFsWzJdOwotCQlQUENHZXRUaW1lck9iamVjdChNeVRpbWVyLFBQQ1RJTUVSVEFHX0NVUlJFTlRUSUNLUyxyZXN1bHQpOwotCQlhY3R1YWxbMV09MDsKLQkJdG9fd2FpdFsxXSs9bXMqMTAwMC9NWV9DTE9DS1NfUEVSX1NFQzsKLQotCQl3aGlsZShhY3R1YWxbMV08dG9fd2FpdFsxXSkKLQkJewotCQkJUFBDR2V0VGltZXJPYmplY3QoTXlUaW1lcixQUENUSU1FUlRBR19DVVJSRU5UVElDS1MsYWN0dWFsKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlEZWxheShtcy81MCk7Ci0JfQotfQotCi12b2lkIFBQQ19UaW1lckluaXQodm9pZCkKLXsKLQlzdHJ1Y3QgVGFnSXRlbSB0YWdzW109Ci0JCXsKLQkJCVBQQ1RJTUVSVEFHX0NQVSxUUlVFLAotCQkJVEFHX0RPTkUsMAotCQl9OwotCi0KLQlpZihNeVRpbWVyPVBQQ0NyZWF0ZVRpbWVyT2JqZWN0KHRhZ3MpKQotCXsKLQkJVUxPTkcgcmVzdWx0WzJdOwotCi0JCVBQQ0dldFRpbWVyT2JqZWN0KE15VGltZXIsUFBDVElNRVJUQUdfVElDS1NQRVJTRUMscmVzdWx0KTsKLQkJRChidWcoIlRpbWVyIGluaXppYWxpenphdG8sIFRQUzogJWx1IC0gJWx1XG4iLHJlc3VsdFswXSxyZXN1bHRbMV0pKTsKLS8vCQlQUENBc3I2NHAocmVzdWx0LDEwKTsKLQkJcmVzdWx0WzFdPj49MTA7Ci0JCXJlc3VsdFsxXXw9KChyZXN1bHRbMF0mMHgzZmYpPDwyMik7Ci0JCXJlc3VsdFswXT4+PTEwOwotCi0JCUQoYnVnKCJTaGlmdGF0byBUUFM6ICVsdSAtICVsdVxuIixyZXN1bHRbMF0scmVzdWx0WzFdKSk7Ci0JCU1ZX0NMT0NLU19QRVJfU0VDPXJlc3VsdFsxXTsKLQotCQlQUENHZXRUaW1lck9iamVjdChNeVRpbWVyLFBQQ1RJTUVSVEFHX0NVUlJFTlRUSUNLUyxyZXN1bHQpOwotCi0JCUQoYnVnKCJDdXJyZW50IHRpY2tzOiAlbHUgLSAlbHVcbiIscmVzdWx0WzBdLHJlc3VsdFsxXSkpOwotCQlyZXN1bHRbMV0+Pj0xMDsKLQkJcmVzdWx0WzFdfD0oKHJlc3VsdFswXSYweDNmZik8PDIyKTsKLQkJcmVzdWx0WzBdPj49MTA7Ci0vLwkJUFBDQXNyNjRwKHJlc3VsdCwxMCk7Ci0JCUQoYnVnKCJTaGlmdGF0bzogJWx1IC0gJWx1XG4iLHJlc3VsdFswXSxyZXN1bHRbMV0pKTsKLQl9Ci0JZWxzZQotCXsKLQkJRChidWcoIkVycm9yZSBuZWxsJ2luaXppYWxpenphemlvbmUgZGVsIHRpbWVyIVxuIikpOwotCX0KLX0KLQotI2VuZGlmCi0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0KLS8qIERhdGEgdG8gaGFuZGxlIGEgc2luZ2xlIHBlcmlvZGljIGFsYXJtICovCi1zdGF0aWMgaW50IHRpbWVyX2FsaXZlID0gMDsKLXN0YXRpYyBTRExfVGhyZWFkICp0aW1lcl90aHJlYWQgPSBOVUxMOwotCi1zdGF0aWMgaW50IFJ1blRpbWVyKHZvaWQgKnVudXNlZCkKLXsKLQlEKGJ1ZygiU1lTVGltZXI6IEVudGVyaW5nIFJ1blRpbWVyIGxvb3AuLi4iKSk7Ci0KLQlpZihHZnhCYXNlPT1OVUxMKQotCQlHZnhCYXNlPShzdHJ1Y3QgR2Z4QmFzZSAqKU9wZW5MaWJyYXJ5KCJncmFwaGljcy5saWJyYXJ5IiwzNyk7Ci0KLQl3aGlsZSAoIHRpbWVyX2FsaXZlICkgewotCQlpZiAoIFNETF90aW1lcl9ydW5uaW5nICkgewotCQkJU0RMX1RocmVhZGVkVGltZXJDaGVjaygpOwotCQl9Ci0JCWlmKEdmeEJhc2UpCi0JCQlXYWl0VE9GKCk7ICAvLyBDaGVjayB0aGUgdGltZXIgZXZlcnkgZmlmdGggb2Ygc2Vjb25kcy4gV2FzIFNETF9EZWxheSgxKS0+QnVzeVdhaXQhCi0JCWVsc2UKLQkJCURlbGF5KDEpOwotCX0KLQlEKGJ1ZygiU1lTVGltZXI6IEVYSVRJTkcgUnVuVGltZXIgbG9vcC4uLiIpKTsKLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIFRoaXMgaXMgb25seSBjYWxsZWQgaWYgdGhlIGV2ZW50IHRocmVhZCBpcyBub3QgcnVubmluZyAqLwotaW50IFNETF9TWVNfVGltZXJJbml0KHZvaWQpCi17Ci0JRChidWcoIkNyZWF0aW5nIHRocmVhZCBmb3IgdGhlIHRpbWVyIChOT0lUSU1FUikuLi5cbiIpKTsKLQotCXRpbWVyX2FsaXZlID0gMTsKLQl0aW1lcl90aHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkKFJ1blRpbWVyLCBOVUxMKTsKLQlpZiAoIHRpbWVyX3RocmVhZCA9PSBOVUxMICkKLQl7Ci0JCUQoYnVnKCJDcmVhemlvbmUgZGVsIHRocmVhZCBmYWxsaXRhLi4uXG4iKSk7Ci0KLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKLX0KLQotdm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQotewotCXRpbWVyX2FsaXZlID0gMDsKLQlpZiAoIHRpbWVyX3RocmVhZCApIHsKLQkJU0RMX1dhaXRUaHJlYWQodGltZXJfdGhyZWFkLCBOVUxMKTsKLQkJdGltZXJfdGhyZWFkID0gTlVMTDsKLQl9Ci19Ci0KLWludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKLXsKLQlTRExfU2V0RXJyb3IoIkludGVybmFsIGxvZ2ljIGVycm9yOiBBbWlnYU9TIHVzZXMgdGhyZWFkZWQgdGltZXIiKTsKLQlyZXR1cm4oLTEpOwotfQotCi12b2lkIFNETF9TWVNfU3RvcFRpbWVyKHZvaWQpCi17Ci0JcmV0dXJuOwotfQotCi0jZW5kaWYgLyogU0RMX1RJTUVSX0FNSUdBICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL2Jlb3MvU0RMX3N5c3RpbWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL2Jlb3MvU0RMX3N5c3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZmY3ZjYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9iZW9zL1NETF9zeXN0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfVElNRVJfQkVPUwotCi0jaW5jbHVkZSA8YmUva2VybmVsL09TLmg+Ci0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3RpbWVyX2MuaCIKLQotc3RhdGljIGJpZ3RpbWVfdCBzdGFydDsKLQotdm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKQotewotCS8qIFNldCBmaXJzdCB0aWNrcyB2YWx1ZSAqLwotCXN0YXJ0ID0gc3lzdGVtX3RpbWUoKTsKLX0KLQotVWludDMyIFNETF9HZXRUaWNrcyh2b2lkKQotewotCXJldHVybigoc3lzdGVtX3RpbWUoKS1zdGFydCkvMTAwMCk7Ci19Ci0KLXZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKLXsKLQlzbm9vemUobXMqMTAwMCk7Ci19Ci0KLS8qIERhdGEgdG8gaGFuZGxlIGEgc2luZ2xlIHBlcmlvZGljIGFsYXJtICovCi1zdGF0aWMgaW50IHRpbWVyX2FsaXZlID0gMDsKLXN0YXRpYyBTRExfVGhyZWFkICp0aW1lciA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgUnVuVGltZXIodm9pZCAqdW51c2VkKQotewotCXdoaWxlICggdGltZXJfYWxpdmUgKSB7Ci0JCWlmICggU0RMX3RpbWVyX3J1bm5pbmcgKSB7Ci0JCQlTRExfVGhyZWFkZWRUaW1lckNoZWNrKCk7Ci0JCX0KLQkJU0RMX0RlbGF5KDEwKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi0vKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBldmVudCB0aHJlYWQgaXMgbm90IHJ1bm5pbmcgKi8KLWludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQotewotCXRpbWVyX2FsaXZlID0gMTsKLQl0aW1lciA9IFNETF9DcmVhdGVUaHJlYWQoUnVuVGltZXIsIE5VTEwpOwotCWlmICggdGltZXIgPT0gTlVMTCApCi0JCXJldHVybigtMSk7Ci0JcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKLX0KLQotdm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQotewotCXRpbWVyX2FsaXZlID0gMDsKLQlpZiAoIHRpbWVyICkgewotCQlTRExfV2FpdFRocmVhZCh0aW1lciwgTlVMTCk7Ci0JCXRpbWVyID0gTlVMTDsKLQl9Ci19Ci0KLWludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKLXsKLQlTRExfU2V0RXJyb3IoIkludGVybmFsIGxvZ2ljIGVycm9yOiBCZU9TIHVzZXMgdGhyZWFkZWQgdGltZXIiKTsKLQlyZXR1cm4oLTEpOwotfQotCi12b2lkIFNETF9TWVNfU3RvcFRpbWVyKHZvaWQpCi17Ci0JcmV0dXJuOwotfQotCi0jZW5kaWYgLyogU0RMX1RJTUVSX0JFT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvZGMvU0RMX3N5c3RpbWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL2RjL1NETF9zeXN0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDRhNjU0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvZGMvU0RMX3N5c3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfVElNRVJfREMKLQotI2luY2x1ZGUgPGtvcy5oPgotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBzdGFydDsKLQotLyogCi0JamlmID0gIG1zICogSFogLzEwMDAKLQltcyAgPSBqaWYgKiAxMDAwL0haCi0qLwotCi12b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCi17Ci0JLyogU2V0IGZpcnN0IHRpY2tzIHZhbHVlICovCi0Jc3RhcnQgPSBqaWZmaWVzOwotfQotCi1VaW50MzIgU0RMX0dldFRpY2tzKHZvaWQpCi17Ci0JcmV0dXJuKChqaWZmaWVzLXN0YXJ0KSoxMDAwL0haKTsKLX0KLQotdm9pZCBTRExfRGVsYXkoVWludDMyIG1zKQotewotCXRoZF9zbGVlcChtcyk7Ci19Ci0KLS8qIERhdGEgdG8gaGFuZGxlIGEgc2luZ2xlIHBlcmlvZGljIGFsYXJtICovCi1zdGF0aWMgaW50IHRpbWVyX2FsaXZlID0gMDsKLXN0YXRpYyBTRExfVGhyZWFkICp0aW1lciA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgUnVuVGltZXIodm9pZCAqdW51c2VkKQotewotCXdoaWxlICggdGltZXJfYWxpdmUgKSB7Ci0JCWlmICggU0RMX3RpbWVyX3J1bm5pbmcgKSB7Ci0JCQlTRExfVGhyZWFkZWRUaW1lckNoZWNrKCk7Ci0JCX0KLQkJU0RMX0RlbGF5KDEwKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi0vKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBldmVudCB0aHJlYWQgaXMgbm90IHJ1bm5pbmcgKi8KLWludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQotewotCXRpbWVyX2FsaXZlID0gMTsKLQl0aW1lciA9IFNETF9DcmVhdGVUaHJlYWQoUnVuVGltZXIsIE5VTEwpOwotCWlmICggdGltZXIgPT0gTlVMTCApCi0JCXJldHVybigtMSk7Ci0JcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKLX0KLQotdm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQotewotCXRpbWVyX2FsaXZlID0gMDsKLQlpZiAoIHRpbWVyICkgewotCQlTRExfV2FpdFRocmVhZCh0aW1lciwgTlVMTCk7Ci0JCXRpbWVyID0gTlVMTDsKLQl9Ci19Ci0KLWludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKLXsKLQlTRExfU2V0RXJyb3IoIkludGVybmFsIGxvZ2ljIGVycm9yOiBEQyB1c2VzIHRocmVhZGVkIHRpbWVyIik7Ci0JcmV0dXJuKC0xKTsKLX0KLQotdm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQotewotCXJldHVybjsKLX0KLQotI2VuZGlmIC8qIFNETF9USU1FUl9EQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9kdW1teS9TRExfc3lzdGltZXIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvZHVtbXkvU0RMX3N5c3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZGFlMDMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9kdW1teS9TRExfc3lzdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChTRExfVElNRVJfRFVNTVkpIHx8IGRlZmluZWQoU0RMX1RJTUVSU19ESVNBQkxFRCkKLQotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCi0KLXZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKLXsKLX0KLQotVWludDMyIFNETF9HZXRUaWNrcyAodm9pZCkKLXsKLQlTRExfVW5zdXBwb3J0ZWQoKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBTRExfRGVsYXkgKFVpbnQzMiBtcykKLXsKLQlTRExfVW5zdXBwb3J0ZWQoKTsKLX0KLQotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLQotLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KLXN0YXRpYyBpbnQgdGltZXJfYWxpdmUgPSAwOwotc3RhdGljIFNETF9UaHJlYWQgKnRpbWVyID0gTlVMTDsKLQotc3RhdGljIGludCBSdW5UaW1lcih2b2lkICp1bnVzZWQpCi17Ci0Jd2hpbGUgKCB0aW1lcl9hbGl2ZSApIHsKLQkJaWYgKCBTRExfdGltZXJfcnVubmluZyApIHsKLQkJCVNETF9UaHJlYWRlZFRpbWVyQ2hlY2soKTsKLQkJfQotCQlTRExfRGVsYXkoMSk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgZXZlbnQgdGhyZWFkIGlzIG5vdCBydW5uaW5nICovCi1pbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKLXsKLQl0aW1lcl9hbGl2ZSA9IDE7Ci0JdGltZXIgPSBTRExfQ3JlYXRlVGhyZWFkKFJ1blRpbWVyLCBOVUxMKTsKLQlpZiAoIHRpbWVyID09IE5VTEwgKQotCQlyZXR1cm4oLTEpOwotCXJldHVybihTRExfU2V0VGltZXJUaHJlYWRlZCgxKSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCkKLXsKLQl0aW1lcl9hbGl2ZSA9IDA7Ci0JaWYgKCB0aW1lciApIHsKLQkJU0RMX1dhaXRUaHJlYWQodGltZXIsIE5VTEwpOwotCQl0aW1lciA9IE5VTEw7Ci0JfQotfQotCi1pbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCi17Ci0JU0RMX1NldEVycm9yKCJJbnRlcm5hbCBsb2dpYyBlcnJvcjogdGhyZWFkZWQgdGltZXIgaW4gdXNlIik7Ci0JcmV0dXJuKC0xKTsKLX0KLQotdm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQotewotCXJldHVybjsKLX0KLQotI2VuZGlmIC8qIFNETF9USU1FUl9EVU1NWSB8fCBTRExfVElNRVJTX0RJU0FCTEVEICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL2Vwb2MvU0RMX3N5c3RpbWVyLmNwcCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvZXBvYy9TRExfc3lzdGltZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTMxMzVjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvZXBvYy9TRExfc3lzdGltZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfVElNRVJfRVBPQwotCi0vKgotICAgIFNETF9zeXN0aW1lci5jcHAKLQotICAgIEVwb2MgdmVyc2lvbiBieSBIYW5udSBWaWl0YWxhIChoYW5udS5qLnZpaXRhbGFAbWJuZXQuZmkpCi0qLwotCi0jaW5jbHVkZSA8ZTMyc3RkLmg+Ci0jaW5jbHVkZSA8ZTMyaGFsLmg+Ci0KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICIuLi9TRExfdGltZXJfYy5oIgotCi1zdGF0aWMgVFVpbnQgc3RhcnQgPSAwOwotc3RhdGljIFRJbnQgdGlja1BlcmlvZE1pbGxpU2Vjb25kczsKLQotCi12b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCi17Ci0JLyogU2V0IGZpcnN0IHRpY2tzIHZhbHVlICovCi0gICAgc3RhcnQgPSBVc2VyOjpUaWNrQ291bnQoKTsKLQotICAgIFRUaW1lSW50ZXJ2YWxNaWNyb1NlY29uZHMzMiBwZXJpb2Q7Ci0JVEludCB0bXAgPSBVc2VySGFsOjpUaWNrUGVyaW9kKHBlcmlvZCk7Ci0gICAgdGlja1BlcmlvZE1pbGxpU2Vjb25kcyA9IHBlcmlvZC5JbnQoKSAvIDEwMDA7Ci19Ci0KLVVpbnQzMiBTRExfR2V0VGlja3Modm9pZCkKLXsKLSAgICBUVWludCBkZWx0YVRpY3MgPSBVc2VyOjpUaWNrQ291bnQoKSAtIHN0YXJ0OwotCXJldHVybihkZWx0YVRpY3MgKiB0aWNrUGVyaW9kTWlsbGlTZWNvbmRzKTsgCi19Ci0KLXZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKLXsKLSAgICAgCi0gICAgVXNlcjo6QWZ0ZXIoVFRpbWVJbnRlcnZhbE1pY3JvU2Vjb25kczMyKG1zKjEwMDApKTsKLX0KLQotLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KLXN0YXRpYyBpbnQgdGltZXJfYWxpdmUgPSAwOwotc3RhdGljIFNETF9UaHJlYWQgKnRpbWVyID0gTlVMTDsKLQotc3RhdGljIGludCBSdW5UaW1lcih2b2lkICp1bnVzZWQpCi17Ci0JVWludDMyIG1zOwotCi0Jd2hpbGUgKCB0aW1lcl9hbGl2ZSApIHsKLQkJaWYgKCBTRExfdGltZXJfcnVubmluZyApIHsKLQkJCVNETF9UaHJlYWRlZFRpbWVyQ2hlY2soKTsKLQkJfQotCQlTRExfRGVsYXkoMTApOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIFRoaXMgaXMgb25seSBjYWxsZWQgaWYgdGhlIGV2ZW50IHRocmVhZCBpcyBub3QgcnVubmluZyAqLwotaW50IFNETF9TWVNfVGltZXJJbml0KHZvaWQpCi17Ci0JdGltZXJfYWxpdmUgPSAxOwotCXRpbWVyID0gU0RMX0NyZWF0ZVRocmVhZChSdW5UaW1lciwgTlVMTCk7Ci0JaWYgKCB0aW1lciA9PSBOVUxMICkKLQkJcmV0dXJuKC0xKTsKLQlyZXR1cm4oU0RMX1NldFRpbWVyVGhyZWFkZWQoMSkpOwotfQotCi12b2lkIFNETF9TWVNfVGltZXJRdWl0KHZvaWQpCi17Ci0JdGltZXJfYWxpdmUgPSAwOwotCWlmICggdGltZXIgKSB7Ci0JCVNETF9XYWl0VGhyZWFkKHRpbWVyLCBOVUxMKTsKLQkJdGltZXIgPSBOVUxMOwotCX0KLX0KLQotaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKQotewotCVNETF9TZXRFcnJvcigiSW50ZXJuYWwgbG9naWMgZXJyb3I6IEVwb2MgdXNlcyB0aHJlYWRlZCB0aW1lciIpOwotCXJldHVybigtMSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19TdG9wVGltZXIodm9pZCkKLXsKLQlyZXR1cm47Ci19Ci0KLX07IC8vIGV4dGVybiAiQyIKLQotI2VuZGlmIC8qIFNETF9USU1FUl9FUE9DICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL21hY29zL0Zhc3RUaW1lcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9tYWNvcy9GYXN0VGltZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViNDI2MC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL21hY29zL0Zhc3RUaW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qIEZpbGUgIkZhc3RUaW1lcy5jIiAtIE9yaWdpbmFsIGNvZGUgYnkgTWF0dCBTbG90IDxmcHJlZmVjdEBhbWJyb3NpYXN3LmNvbT4gICovCi0vKiBDcmVhdGVkIDQvMjQvOTkgICAgLSBUaGlzIGZpbGUgaXMgaGVyZWJ5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiAgICAgICAqLwotLyogVXBkYXRlZCA1LzIxLzk5ICAgIC0gQ2FsaWJyYXRlIHRvIFZJQSwgYWRkIFRCUiBzdXBwb3J0LCByZW5hbWVkIGZ1bmN0aW9ucyAgKi8KLS8qIFVwZGF0ZWQgMTAvNC85OSAgICAtIFVzZSBBYnNvbHV0ZVRvTmFub3NlY29uZHMoKSBpbiBjYXNlIEFic29sdXRlID0gZG91YmxlICovCi0vKiBVcGRhdGVkIDIvMTUvMDAgICAgLSBDaGVjayBmb3IgbmF0aXZlIFRpbWUgTWFuYWdlciwgbm8gbmVlZCB0byBjYWxpYnJhdGUgICAqLwotLyogVXBkYXRlZCAyLzE5LzAwICAgIC0gRml4ZWQgZGVmYXVsdCB2YWx1ZSBmb3IgZ1NjYWxlIHVuZGVyIG5hdGl2ZSBUaW1lIE1nciAgKi8KLS8qIFVwZGF0ZWQgMy8yMS8wMCAgICAtIEZpeGVkIG5zIGNvbnZlcnNpb24sIGNyZWF0ZSAyIGRpZmZlcmVudCBzY2FsZSBmYWN0b3JzICovCi0vKiBVcGRhdGVkIDUvMDMvMDAgICAgLSBBZGRlZCBjb3B5cmlnaHQgYW5kIHBsYWNlZCBpbnRvIFBELiBObyBjb2RlIGNoYW5nZXMgICAqLwotLyogVXBkYXRlZCA4LzAxLzAwICAgIC0gTWFkZSAiQ2FyYm9uLWNvbXBhdGlibGUiIGJ5IHJlcGxhY2luZyBMTUdldFRpY2tzKCkgICAgKi8KLQotLyogVGhpcyBmaWxlIGlzIENvcHlyaWdodCAoQykgTWF0dCBTbG90LCAxOTk5LTIwMDAuIEl0IGlzIGhlcmVieSBwbGFjZWQgaW50byAKLSAgIHRoZSBwdWJsaWMgZG9tYWluLiBUaGUgYXV0aG9yIG1ha2VzIG5vIHdhcnJhbnR5IGFzIHRvIGZpdG5lc3Mgb3Igc3RhYmlsaXR5ICovCi0KLSNpbmNsdWRlIDxHZXN0YWx0Lmg+Ci0jaW5jbHVkZSA8TG93TWVtLmg+Ci0jaW5jbHVkZSA8Q29kZUZyYWdtZW50cy5oPgotI2luY2x1ZGUgPERyaXZlclNlcnZpY2VzLmg+Ci0jaW5jbHVkZSA8VGltZXIuaD4KLQotI2luY2x1ZGUgIkZhc3RUaW1lcy5oIgotCi0jaWZkZWYgVEFSR0VUX0NQVV9QUEMKLSN1bmRlZiBHRU5FUkFUSU5HUE9XRVJQQyAvKiBzdG9wIHdoaW5pbmcgKi8KLSNkZWZpbmUgR0VORVJBVElOR1BPV0VSUEMgVEFSR0VUX0NQVV9QUEMKLSNlbmRpZgotCi0vKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwotLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLS8qCi0JT24gNjgweDAgbWFjaGluZXMsIHdlIGp1c3QgdXNlIE1pY3Jvc2Vjb25kcygpLgotCQotCU9uIFBvd2VyUEMgbWFjaGluZXMsIHdlIHRyeSBzZXZlcmFsIG1ldGhvZHM6Ci0JICAqIERyaXZlclNlcnZpY2VzTGliIGlzIGF2YWlsYWJsZSBvbiBhbGwgUENJIFBvd2VyTWFjcywgYW5kIHBlcmhhcHMKLQkgICAgc29tZSBOdUJ1cyBQb3dlck1hY3MuIElmIGl0IGlzLCB3ZSB1c2UgVXBUaW1lKCkgOiBPdmVyaGVhZCA9IDIuMSC1c2VjLgotCSAgKiBUaGUgUG93ZXJQQyA2MDEgaGFzIGEgYnVpbHQtaW4gInJlYWwgdGltZSBjbG9jayIgUlRDLCBhbmQgd2UgZmFsbAotCSAgICBiYWNrIHRvIHRoYXQsIGFjY2Vzc2luZyBpdCBkaXJlY3RseSBmcm9tIGFzbS4gT3ZlcmhlYWQgPSAxLjMgtXNlYy4KLQkgICogTGF0ZXIgUG93ZXJQQ3MgaGF2ZSBhbiBhY2N1cmF0ZSAidGltZSBiYXNlIHJlZ2lzdGVyIiBUQlIsIGFuZCB3ZSAKLQkgICAgZmFsbCBiYWNrIHRvIHRoYXQsIGFjY2VzcyBpdCBmcm9tIFBvd2VyUEMgYXNtLiBPdmVyaGVhZCA9IDEuMyC1c2VjLgotCSAgKiBXZSBjYW4gYWxzbyB0cnkgTWljcm9zZWNvbmRzKCkgd2hpY2ggaXMgZW11bGF0ZWQgOiBPdmVyaGVhZCA9IDM2ILVzZWMuCi0KLQlPbiBQb3dlclBDIG1hY2hpbmVzLCB3ZSBhdm9pZCB0aGUgZm9sbG93aW5nOgotCSAgKiBPcGVuVHJhbnNwb3J0IGlzIGF2YWlsYWJsZSBvbiBhbGwgUENJIGFuZCBzb21lIE51QnVzIFBvd2VyTWFjcywgYnV0IGl0Ci0JICAgIHVzZXMgVXBUaW1lKCkgaWYgYXZhaWxhYmxlIGFuZCBmYWxscyBiYWNrIHRvIE1pY3Jvc2Vjb25kcygpIG90aGVyd2lzZS4KLQkgICogSW5wdXRTcHJvY2tldCBpcyBhdmFpbGFibGUgb24gbWFueSBQb3dlck1hY3MsIGJ1dCBhZ2FpbiBpdCB1c2VzCi0JICAgIFVwVGltZSgpIGlmIGF2YWlsYWJsZSBhbmQgZmFsbHMgYmFjayB0byBNaWNyb3NlY29uZHMoKSBvdGhlcndpc2UuCi0KLQlBbm90aGVyIFBvd2VyUEMgbm90ZTogY2VydGFpbiBjb25maWd1cmF0aW9ucywgZXNwZWNpYWxseSAzcmQgcGFydHkgdXBncmFkZQotCWNhcmRzLCBtYXkgcmV0dXJuIGluYWNjdXJhdGUgdGltaW5ncyBmb3IgdGhlIENQVSBvciBtZW1vcnkgYnVzIC0tIGNhdXNpbmcKLQlza2V3IGluIHZhcmlvdXMgc3lzdGVtIHJvdXRpbmVzICh1cCB0byAyMCUgZHJpZnQhKS4gVGhlIFZJQSBjaGlwIGlzIHZlcnkKLQlhY2N1cmF0ZSwgYW5kIGl0J3MgdGhlIGJhc2lzIGZvciB0aGUgVGltZSBNYW5hZ2VyIGFuZCBNaWNyb3NlY29uZHMoKS4KLQlVbmZvcnR1bmF0ZWx5LCBpdCdzIGFsc28gdmVyeSBzbG93IGJlY2F1c2UgdGhlIE1hY09TIGhhcyB0byAoYSkgc3dpdGNoIHRvCi0JNjhLIGFuZCAoYikgcG9sbCBmb3IgYSBWSUEgZXZlbnQuCi0JCi0JV2UgY29tcGVuc2F0ZSBmb3IgdGhlIGRyaWZ0IGJ5IGNhbGlicmF0aW5nIGEgZmxvYXRpbmcgcG9pbnQgc2NhbGUgZmFjdG9yCi0JYmV0d2VlbiBvdXIgZmFzdCBtZXRob2QgYW5kIHRoZSBhY2N1cmF0ZSB0aW1lciBhdCBzdGFydHVwLCB0aGVuIGNvbnZlcnQKLQllYWNoIHNhbXBsZSBxdWlja2x5IG9uIHRoZSBmbHkuIEknZCByYXRoZXIgbm90IGhhdmUgdGhlIGluaXRpYWxpemF0aW9uIAotCW92ZXJoZWFkIC0tIGJ1dCBpdCdzIHNpbXBseSBuZWNlc3NhcnkgZm9yIGFjY3VyYXRlIHRpbWluZy4gWW91IGNhbiBkcm9wCi0JaXQgZG93biB0byAzMCB0aWNrcyBpZiB5b3UgcHJlZmVyLCBidXQgdGhhdCdzIGFzIGxvdyBhcyBJJ2QgcmVjb21tZW5kLgotCi0JVW5kZXIgTWFjT1MgOSwgIm5ldyB3b3JsZCIgTWFjcyAoaU1hY3MsIEIrVyBHM3MgYW5kIEcrVyBHNHMpIGhhdmUgYSBuYXRpdmUKLQlUaW1lIE1hbmFnZXIgaW1wbGVtZW50YXRpb246IFVwVGltZSgpLCBNaWNyb3NlY29uZHMoKSwgYW5kIFRpY2tDb3VudCgpIGFyZQotCWFsbCBiYXNlZCBvbiB0aGUgc2FtZSB1bmRlcmx5aW5nIGNvdW50ZXIuIFRoaXMgbWFrZXMgaXQgc2lsbHkgdG8gY2FsaWJyYXRlCi0JVXBUaW1lKCkgYWdhaW5zdCBUaWNrQ291bnQoKS4gV2Ugbm93IGNoZWNrIGZvciB0aGlzIGZlYXR1cmUgdXNpbmcgR2VzdGFsdCgpLAotCWFuZCBza2lwIHRoZSB3aG9sZSBjYWxpYnJhdGlvbiBzdGVwIGlmIHBvc3NpYmxlLgotCi0qLwotLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLS8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi0KLSNkZWZpbmUgUlRDVG9OYW5vKHcpCSgoZG91YmxlKSAodykuaGkgKiAxMDAwMDAwMDAwLjAgKyAoZG91YmxlKSAodykubG8pCi0jZGVmaW5lIFdpZGVUbzY0Yml0KHcpCSgqKFVJbnQ2NCAqKSAmKHcpKQotCi0vKiBMTUdldFRpY2tzKCkgaXMgbm90IGluIENhcmJvbiBhbmQgVGlja0NvdW50KCkgaGFzIGEgZmFpciBiaXQgb2Ygb3ZlcmhlYWQsCi0gICBzbyBmb3Igc3BlZWQgd2UgYWx3YXlzIHJlYWQgbG93bWVtIGRpcmVjdGx5LiBUaGlzIGlzIGEgTWFjIE9TIFggbm8tbm8sIGJ1dCAKLSAgIGl0IGFsd2F5cyB3b3JrIG9uIHRob3NlIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIGEgbmF0aXZlIFRpbWUgTWFuYWdlciAoaWUsCi0gICBhbnl0aGluZyBiZWZvcmUgTWFjT1MgOSkgLS0gcmVnYXJkbGVzcyB3aGV0aGVyIHdlIGFyZSBpbiBDYXJib24gb3Igbm90ISAqLwotI2RlZmluZSBNeUxNR2V0VGlja3MoKQkoKih2b2xhdGlsZSBVSW50MzIgKikgMHgxNkEpCi0KLSNpZiBHRU5FUkFUSU5HUE9XRVJQQwotCi1zdGF0aWMgYXNtIFVuc2lnbmVkV2lkZSBQb2xsUlRDKHZvaWQpOwotc3RhdGljIGFzbSBVbnNpZ25lZFdpZGUgUG9sbFRCUih2b2lkKTsKLXN0YXRpYyBQdHIgRmluZEZ1bmN0aW9uSW5TaGFyZWRMaWIoU3RyaW5nUHRyIGxpYk5hbWUsIFN0cmluZ1B0ciBmdW5jTmFtZSk7Ci0KLXN0YXRpYyBCb29sZWFuCQkJZ0luaXRlZCA9IGZhbHNlOwotc3RhdGljIEJvb2xlYW4JCQlnTmF0aXZlID0gZmFsc2U7Ci1zdGF0aWMgQm9vbGVhbgkJCWdVc2VSVEMgPSBmYWxzZTsKLXN0YXRpYyBCb29sZWFuCQkJZ1VzZVRCUiA9IGZhbHNlOwotc3RhdGljIGRvdWJsZQkJCWdTY2FsZVVTZWMgPSAxLjAgLyAxMDAwLjA7ICAgIC8qIDEgLyAoIG5zZWMgLyB1c2VjKSAqLwotc3RhdGljIGRvdWJsZQkJCWdTY2FsZU1TZWMgPSAxLjAgLyAxMDAwMDAwLjA7IC8qIDEgLyAoIG5zZWMgLyBtc2VjKSAqLwotCi0vKiBGdW5jdGlvbnMgbG9hZGVkIGZyb20gRHJpdmVyU2VydmljZXNMaWIgKi8KLXR5cGVkZWYgQWJzb2x1dGVUaW1lIAkoKlVwVGltZVByb2NQdHIpKHZvaWQpOwotdHlwZWRlZiBOYW5vc2Vjb25kcyAJKCpBMk5TUHJvY1B0cikoQWJzb2x1dGVUaW1lKTsKLXN0YXRpYyBVcFRpbWVQcm9jUHRyIAlnVXBUaW1lID0gTlVMTDsKLXN0YXRpYyBBMk5TUHJvY1B0ciAJCWdBMk5TID0gTlVMTDsKLQotI2VuZGlmIC8qIEdFTkVSQVRJTkdQT1dFUlBDICovCi0KLS8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi0vKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwotCi12b2lkIEZhc3RJbml0aWFsaXplKCkgewotCVNJbnQzMgkJCXJlc3VsdDsKLQotCWlmICghZ0luaXRlZCkgewotCi0jaWYgR0VORVJBVElOR1BPV0VSUEMKLQotCQkvKiBJbml0aWFsaXplIHRoZSBmZWF0dXJlIGZsYWdzICovCi0JCWdOYXRpdmUgPSBnVXNlUlRDID0gZ1VzZVRCUiA9IGZhbHNlOwotCi0JCS8qIFdlIHVzZSBDRk0gdG8gZmluZCBhbmQgbG9hZCBuZWVkZWQgc3ltYm9scyBmcm9tIHNoYXJlZCBsaWJyYXJpZXMsIHNvCi0JCSAgIHRoZSBhcHBsaWNhdGlvbiBkb2Vzbid0IGhhdmUgdG8gd2Vhay1saW5rIHRoZW0sIGZvciBjb252ZW5pZW5jZS4gICAqLwotCQlnVXBUaW1lID0gKFVwVGltZVByb2NQdHIpIEZpbmRGdW5jdGlvbkluU2hhcmVkTGliKAotCQkJCSJccERyaXZlclNlcnZpY2VzTGliIiwgIlxwVXBUaW1lIik7Ci0JCWlmIChnVXBUaW1lKSBnQTJOUyA9IChBMk5TUHJvY1B0cikgRmluZEZ1bmN0aW9uSW5TaGFyZWRMaWIoCi0JCQkJIlxwRHJpdmVyU2VydmljZXNMaWIiLCAiXHBBYnNvbHV0ZVRvTmFub3NlY29uZHMiKTsKLQkJaWYgKCFnQTJOUykgZ1VwVGltZSA9IG5pbDsgLyogUGVkYW50aWMgYnV0IG5lY2Vzc2FyeSAqLwotCi0JCWlmIChnVXBUaW1lKSB7Ci0JCQkvKiBJZiB3ZSBsb2FkZWQgVXBUaW1lKCksIHRoZW4gd2UgbmVlZCB0byBrbm93IGlmIHRoZSBzeXN0ZW0gaGFzCi0JCQkgICBhIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGltZSBNYW5hZ2VyLiBJZiBzbywgdGhlbiBpdCdzCi0JCQkgICBwb2ludGxlc3MgdG8gY2FsY3VsYXRlIGEgc2NhbGUgZmFjdG9yIGFnYWluc3QgdGhlIG1pc3NpbmcgVklBICovCi0KLQkJCS8qIGdlc3RhbHROYXRpdmVUaW1lTWdyID0gNCBpbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXJzICovCi0JCQlpZiAoIUdlc3RhbHQoZ2VzdGFsdFRpbWVNZ3JWZXJzaW9uLCAmcmVzdWx0KSAmJgotCQkJCQkocmVzdWx0ID4gZ2VzdGFsdEV4dGVuZGVkVGltZU1ncikpIAotCQkJCWdOYXRpdmUgPSB0cnVlOwotCQkJfQotCQkgIGVsc2UgewotCQkJLyogSWYgbm8gRHJpdmVyU2VydmljZXNMaWIsIHVzZSBHZXN0YWx0KCkgdG8gZ2V0IHRoZSBwcm9jZXNzb3IgdHlwZS4gCi0JCQkgICBPbmx5IE51QnVzIFBvd2VyTWFjcyB3aXRoIG9sZCBTeXN0ZW0gU29mdHdhcmUgd29uJ3QgaGF2ZSBEU0wsIHNvCi0JCQkgICB3ZSBrbm93IGl0IHNob3VsZCBlaXRoZXIgYmUgYSA2MDEgb3IgNjAzLiAqLwotCi0JCQkvKiBVc2UgdGhlIHByb2Nlc3NvciBnZXN0YWx0IHRvIGRldGVybWluZSB3aGljaCByZWdpc3RlciB0byB1c2UgKi8KLQkJIAlpZiAoIUdlc3RhbHQoZ2VzdGFsdE5hdGl2ZUNQVXR5cGUsICZyZXN1bHQpKSB7Ci0JCQkJaWYgKHJlc3VsdCA9PSBnZXN0YWx0Q1BVNjAxKSBnVXNlUlRDID0gdHJ1ZTsKLQkJCQkgIGVsc2UgaWYgKHJlc3VsdCA+IGdlc3RhbHRDUFU2MDEpIGdVc2VUQlIgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkvKiBOb3cgY2FsY3VsYXRlIGEgc2NhbGUgZmFjdG9yIHRvIGtlZXAgdXMgYWNjdXJhdGUuICovCi0JCWlmICgoZ1VwVGltZSAmJiAhZ05hdGl2ZSkgfHwgZ1VzZVJUQyB8fCBnVXNlVEJSKSB7Ci0JCQlVSW50NjQJCQl0aWNrLCB1c2VjMSwgdXNlYzI7Ci0JCQlVbnNpZ25lZFdpZGUJd2lkZTsKLQotCQkJLyogV2FpdCBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmVyeSBuZXh0IHRpY2sgKi8KLQkJCWZvcih0aWNrID0gTXlMTUdldFRpY2tzKCkgKyAxOyB0aWNrID4gTXlMTUdldFRpY2tzKCk7ICk7Ci0JCQkKLQkJCS8qIFBvbGwgdGhlIHNlbGVjdGVkIHRpbWVyIGFuZCBwcmVwYXJlIGl0IChzaW5jZSB3ZSBoYXZlIHRpbWUpICovCi0JCQl3aWRlID0gKGdVcFRpbWUpID8gKCpnQTJOUykoKCpnVXBUaW1lKSgpKSA6IAotCQkJCQkoKGdVc2VSVEMpID8gUG9sbFJUQygpIDogUG9sbFRCUigpKTsKLQkJCXVzZWMxID0gKGdVc2VSVEMpID8gUlRDVG9OYW5vKHdpZGUpIDogV2lkZVRvNjRiaXQod2lkZSk7Ci0JCQkKLQkJCS8qIFdhaXQgZm9yIHRoZSBleGFjdCA2MHRoIHRpY2sgdG8gcm9sbCBvdmVyICovCi0JCQl3aGlsZSh0aWNrICsgNjAgPiBNeUxNR2V0VGlja3MoKSk7Ci0KLQkJCS8qIFBvbGwgdGhlIHNlbGVjdGVkIHRpbWVyIGFnYWluIGFuZCBwcmVwYXJlIGl0ICAqLwotCQkJd2lkZSA9IChnVXBUaW1lKSA/ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSkgOiAKLQkJCQkJKChnVXNlUlRDKSA/IFBvbGxSVEMoKSA6IFBvbGxUQlIoKSk7Ci0JCQl1c2VjMiA9IChnVXNlUlRDKSA/IFJUQ1RvTmFubyh3aWRlKSA6IFdpZGVUbzY0Yml0KHdpZGUpOwotCQkJCi0JCQkvKiBDYWxjdWxhdGUgYSBzY2FsZSB2YWx1ZSB0aGF0IHdpbGwgZ2l2ZSBtaWNyb3NlY29uZHMgcGVyIHNlY29uZC4KLQkJCSAgIFJlbWVtYmVyLCB0aGVyZSBhcmUgYWN0dWFsbHkgNjAuMTUgdGlja3MgaW4gYSBzZWNvbmQsIG5vdCA2MC4gICovCi0JCQlnU2NhbGVVU2VjID0gKDYwLjAgKiAxMDAwMDAwLjApIC8gKCh1c2VjMiAtIHVzZWMxKSAqIDYwLjE1KTsKLQkJCWdTY2FsZU1TZWMgPSBnU2NhbGVVU2VjIC8gMTAwMC4wOwotCQkJfQotCi0jZW5kaWYgLyogR0VORVJBVElOR1BPV0VSUEMgKi8KLQotCQkvKiBXZSd2ZSBpbml0aWFsaXplZCBvdXIgZ2xvYmFscyAqLwotCQlnSW5pdGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLS8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi0KLVVJbnQ2NCBGYXN0TWljcm9zZWNvbmRzKCkgewotCVVuc2lnbmVkV2lkZQl3aWRlOwotCVVJbnQ2NAkJCXVzZWM7Ci0JCi0jaWYgR0VORVJBVElOR1BPV0VSUEMKLQkvKiBJbml0aWFsaXplIGdsb2JhbHMgdGhlIGZpcnN0IHRpbWUgd2UgYXJlIGNhbGxlZCAqLwotCWlmICghZ0luaXRlZCkgRmFzdEluaXRpYWxpemUoKTsKLQkKLQlpZiAoZ05hdGl2ZSkgewotCQkvKiBVc2UgRHJpdmVyU2VydmljZXMgaWYgaXQncyBhdmFpbGFibGUgLS0gaXQncyBmYXN0IGFuZCBjb21wYXRpYmxlICovCi0JCXdpZGUgPSAoKmdBMk5TKSgoKmdVcFRpbWUpKCkpOwotCQl1c2VjID0gKGRvdWJsZSkgV2lkZVRvNjRiaXQod2lkZSkgKiBnU2NhbGVVU2VjICsgMC41OwotCQl9Ci0JICBlbHNlIGlmIChnVXBUaW1lKSB7Ci0JCS8qIFVzZSBEcml2ZXJTZXJ2aWNlcyBpZiBpdCdzIGF2YWlsYWJsZSAtLSBpdCdzIGZhc3QgYW5kIGNvbXBhdGlibGUgKi8KLQkJd2lkZSA9ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSk7Ci0JCXVzZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZVVTZWMgKyAwLjU7Ci0JCX0KLQkgIGVsc2UgaWYgKGdVc2VUQlIpIHsKLQkJLyogT24gYSByZWNlbnQgUG93ZXJQQywgd2UgcG9sbCB0aGUgVEJSIGRpcmVjdGx5ICovCi0JCXdpZGUgPSBQb2xsVEJSKCk7Ci0JCXVzZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZVVTZWMgKyAwLjU7Ci0JCX0KLQkgIGVsc2UgaWYgKGdVc2VSVEMpIHsKLQkJLyogT24gYSA2MDEsIHdlIGNhbiBwb2xsIHRoZSBSVEMgaW5zdGVhZCAqLwotCQl3aWRlID0gUG9sbFJUQygpOwotCQl1c2VjID0gKGRvdWJsZSkgUlRDVG9OYW5vKHdpZGUpICogZ1NjYWxlVVNlYyArIDAuNTsKLQkJfQotCSAgZWxzZSAKLSNlbmRpZiAvKiBHRU5FUkFUSU5HUE9XRVJQQyAqLwotCQl7Ci0JCS8qIElmIGFsbCBlbHNlIGZhaWxzLCBzdWZmZXIgdGhlIG1peGVkIG1vZGUgb3ZlcmhlYWQgKi8KLQkJTWljcm9zZWNvbmRzKCZ3aWRlKTsKLQkJdXNlYyA9IFdpZGVUbzY0Yml0KHdpZGUpOwotCQl9Ci0KLQlyZXR1cm4odXNlYyk7Ci0JfQotCi0vKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwotLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLQotVUludDY0IEZhc3RNaWxsaXNlY29uZHMoKSB7Ci0JVW5zaWduZWRXaWRlCXdpZGU7Ci0JVUludDY0CQkJbXNlYzsJCi0JCi0jaWYgR0VORVJBVElOR1BPV0VSUEMKLQkvKiBJbml0aWFsaXplIGdsb2JhbHMgdGhlIGZpcnN0IHRpbWUgd2UgYXJlIGNhbGxlZCAqLwotCWlmICghZ0luaXRlZCkgRmFzdEluaXRpYWxpemUoKTsKLQkKLQlpZiAoZ05hdGl2ZSkgewotCQkvKiBVc2UgRHJpdmVyU2VydmljZXMgaWYgaXQncyBhdmFpbGFibGUgLS0gaXQncyBmYXN0IGFuZCBjb21wYXRpYmxlICovCi0JCXdpZGUgPSAoKmdBMk5TKSgoKmdVcFRpbWUpKCkpOwotCQltc2VjID0gKGRvdWJsZSkgV2lkZVRvNjRiaXQod2lkZSkgKiBnU2NhbGVNU2VjICsgMC41OwotCQl9Ci0JICBlbHNlIGlmIChnVXBUaW1lKSB7Ci0JCS8qIFVzZSBEcml2ZXJTZXJ2aWNlcyBpZiBpdCdzIGF2YWlsYWJsZSAtLSBpdCdzIGZhc3QgYW5kIGNvbXBhdGlibGUgKi8KLQkJd2lkZSA9ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSk7Ci0JCW1zZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZU1TZWMgKyAwLjU7Ci0JCX0KLQkgIGVsc2UgaWYgKGdVc2VUQlIpIHsKLQkJLyogT24gYSByZWNlbnQgUG93ZXJQQywgd2UgcG9sbCB0aGUgVEJSIGRpcmVjdGx5ICovCi0JCXdpZGUgPSBQb2xsVEJSKCk7Ci0JCW1zZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZU1TZWMgKyAwLjU7Ci0JCX0KLQkgIGVsc2UgaWYgKGdVc2VSVEMpIHsKLQkJLyogT24gYSA2MDEsIHdlIGNhbiBwb2xsIHRoZSBSVEMgaW5zdGVhZCAqLwotCQl3aWRlID0gUG9sbFJUQygpOwotCQltc2VjID0gKGRvdWJsZSkgUlRDVG9OYW5vKHdpZGUpICogZ1NjYWxlTVNlYyArIDAuNTsKLQkJfQotCSAgZWxzZSAKLSNlbmRpZiAvKiBHRU5FUkFUSU5HUE9XRVJQQyAqLwotCQl7Ci0JCS8qIElmIGFsbCBlbHNlIGZhaWxzLCBzdWZmZXIgdGhlIG1peGVkIG1vZGUgb3ZlcmhlYWQgKi8KLQkJTWljcm9zZWNvbmRzKCZ3aWRlKTsKLQkJbXNlYyA9ICgoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSArIDUwMC4wKSAvIDEwMDAuMDsKLQkJfQotCi0JcmV0dXJuKG1zZWMpOwotCX0KLQotLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLS8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi0KLVN0cmluZ1B0ciBGYXN0TWV0aG9kKCkgewotCVN0cmluZ1B0cgltZXRob2QgPSAiXHA8VW5rbm93bj4iOwotCi0jaWYgR0VORVJBVElOR1BPV0VSUEMKLQkvKiBJbml0aWFsaXplIGdsb2JhbHMgdGhlIGZpcnN0IHRpbWUgd2UgYXJlIGNhbGxlZCAqLwotCWlmICghZ0luaXRlZCkgRmFzdEluaXRpYWxpemUoKTsKLQkKLQlpZiAoZ05hdGl2ZSkgewotCQkvKiBUaGUgVGltZSBNYW5hZ2VyIGFuZCBVcFRpbWUoKSBhcmUgZW50aXJlbHkgbmF0aXZlIG9uIHRoaXMgbWFjaGluZSAqLwotCQltZXRob2QgPSAiXHBOYXRpdmUgVXBUaW1lKCkiOwotCQl9Ci0JICBlbHNlIGlmIChnVXBUaW1lKSB7Ci0JCS8qIFVzZSBEcml2ZXJTZXJ2aWNlcyBpZiBpdCdzIGF2YWlsYWJsZSAtLSBpdCdzIGZhc3QgYW5kIGNvbXBhdGlibGUgKi8KLQkJbWV0aG9kID0gIlxwVXBUaW1lKCkiOwotCQl9Ci0JICBlbHNlIGlmIChnVXNlVEJSKSB7Ci0JCS8qIE9uIGEgcmVjZW50IFBvd2VyUEMsIHdlIHBvbGwgdGhlIFRCUiBkaXJlY3RseSAqLwotCQltZXRob2QgPSAiXHBQb3dlclBDIFRCUiI7Ci0JCX0KLQkgIGVsc2UgaWYgKGdVc2VSVEMpIHsKLQkJLyogT24gYSA2MDEsIHdlIGNhbiBwb2xsIHRoZSBSVEMgaW5zdGVhZCAqLwotCQltZXRob2QgPSAiXHBQb3dlclBDIFJUQyI7Ci0JCX0KLQkgIGVsc2UgCi0jZW5kaWYgLyogR0VORVJBVElOR1BPV0VSUEMgKi8KLQkJewotCQkvKiBJZiBhbGwgZWxzZSBmYWlscywgc3VmZmVyIHRoZSBtaXhlZCBtb2RlIG92ZXJoZWFkICovCi0JCW1ldGhvZCA9ICJccE1pY3Jvc2Vjb25kcygpIjsKLQkJfQotCi0JcmV0dXJuKG1ldGhvZCk7Ci0JfQotCi0vKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwotLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLSNwcmFnbWEgbWFyayAtCi0KLSNpZiBHRU5FUkFUSU5HUE9XRVJQQwotYXNtIHN0YXRpYyBVbnNpZ25lZFdpZGUgUG9sbFJUQ18oKSB7Ci1lbnRyeSBQb2xsUlRDIC8qIEF2b2lkIENvZGVXYXJyaW9yIGdsdWUgKi8KLQltYWNoaW5lIDYwMQotQEFHQUlOOgotCW1mcnRjdQlyNCAvKiBSVENVID0gU1BSIDQgKi8KLQltZnJ0Y2wJcjUgLyogUlRDTCA9IFNQUiA1ICovCi0JbWZydGN1CXI2Ci0JY21wdwlyNCxyNgotCWJuZQkJQEFHQUlOCi0Jc3R3CQlyNCwwKHIzKQotCXN0dwkJcjUsNChyMykKLQlibHIKLQl9Ci0KLS8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi0vKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwotCi1hc20gc3RhdGljIFVuc2lnbmVkV2lkZSBQb2xsVEJSXygpIHsKLWVudHJ5IFBvbGxUQlIgLyogQXZvaWQgQ29kZVdhcnJpb3IgZ2x1ZSAqLwotCW1hY2hpbmUgNjA0Ci1AQUdBSU46Ci0JbWZ0YnUJcjQgLyogVEJSVSA9IFNQUiAyNjggKi8KLQltZnRiCXI1IC8qIFRCUkwgPSBTUFIgMjY5ICovCi0JbWZ0YnUJcjYKLQljbXB3CXI0LHI2Ci0JYm5lCQlAQUdBSU4KLQlzdHcJCXI0LDAocjMpCi0Jc3R3CQlyNSw0KHIzKQotCWJscgotCX0KLQotLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLS8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCi0KLXN0YXRpYyBQdHIgRmluZEZ1bmN0aW9uSW5TaGFyZWRMaWIoU3RyaW5nUHRyIGxpYk5hbWUsIFN0cmluZ1B0ciBmdW5jTmFtZSkgewotCU9TRXJyCQkJCWVycm9yID0gbm9FcnI7Ci0JU3RyMjU1CQkJCWVycm9yU3RyOwotCVB0cgkJCQkJZnVuYyA9IE5VTEw7Ci0JUHRyCQkJCQllbnRyeSA9IE5VTEw7Ci0JQ0ZyYWdTeW1ib2xDbGFzcwlzeW1DbGFzczsKLQlDRnJhZ0Nvbm5lY3Rpb25JRAljb25uSUQ7Ci0JCi0JLyogRmluZCBDRk0gY29udGFpbmVycyBmb3IgdGhlIGN1cnJlbnQgYXJjaGVjdHVyZSAtLSBDRk0tUFBDIG9yIENGTS02OEsgKi8KLQlpZiAoLyogZXJyb3IgPSAqLyBHZXRTaGFyZWRMaWJyYXJ5KGxpYk5hbWUsIGtDb21waWxlZENGcmFnQXJjaCwKLQkJCWtMb2FkQ0ZyYWcsICZjb25uSUQsICZlbnRyeSwgZXJyb3JTdHIpKSByZXR1cm4oTlVMTCk7Ci0JaWYgKC8qIGVycm9yID0gKi8gRmluZFN5bWJvbChjb25uSUQsIGZ1bmNOYW1lLCAmZnVuYywgJnN5bUNsYXNzKSkKLQkJcmV0dXJuKE5VTEwpOwotCQotCXJldHVybihmdW5jKTsKLQl9Ci0jZW5kaWYgLyogR0VORVJBVElOR1BPV0VSUEMgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvbWFjb3MvRmFzdFRpbWVzLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL21hY29zL0Zhc3RUaW1lcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU4ZGI3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvbWFjb3MvRmFzdFRpbWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBGaWxlICJGYXN0VGltZXMuaCIgLSBPcmlnaW5hbCBjb2RlIGJ5IE1hdHQgU2xvdCA8ZnByZWZlY3RAYW1icm9zaWFzdy5jb20+ICAqLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLS8qIENyZWF0ZWQgNC8yNC85OSAgICAtIFRoaXMgZmlsZSBpcyBoZXJlYnkgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluICAgICAgICovCi0vKiBVcGRhdGVkIDUvMjEvOTkgICAgLSBDYWxpYnJhdGUgdG8gVklBLCBhZGQgVEJSIHN1cHBvcnQsIHJlbmFtZWQgZnVuY3Rpb25zICAqLwotLyogVXBkYXRlZCAxMC80Lzk5ICAgIC0gVXNlIEFic29sdXRlVG9OYW5vc2Vjb25kcygpIGluIGNhc2UgQWJzb2x1dGUgPSBkb3VibGUgKi8KLS8qIFVwZGF0ZWQgMi8xNS8wMCAgICAtIENoZWNrIGZvciBuYXRpdmUgVGltZSBNYW5hZ2VyLCBubyBuZWVkIHRvIGNhbGlicmF0ZSAgICovCi0vKiBVcGRhdGVkIDMvMjEvMDAgICAgLSBGaXhlZCBucyBjb252ZXJzaW9uLCBjcmVhdGUgMiBkaWZmZXJlbnQgc2NhbGUgZmFjdG9ycyAqLwotLyogVXBkYXRlZCA1LzAzLzAwICAgIC0gQWRkZWQgY29weXJpZ2h0IGFuZCBwbGFjZWQgaW50byBQRC4gTm8gY29kZSBjaGFuZ2VzICAgKi8KLQotLyogVGhpcyBmaWxlIGlzIENvcHlyaWdodCAoQykgTWF0dCBTbG90LCAxOTk5LTIwMDAuIEl0IGlzIGhlcmVieSBwbGFjZWQgaW50byAKLSAgIHRoZSBwdWJsaWMgZG9tYWluLiBUaGUgYXV0aG9yIG1ha2VzIG5vIHdhcnJhbnR5IGFzIHRvIGZpdG5lc3Mgb3Igc3RhYmlsaXR5ICovCi0KLSNpZm5kZWYgX19GQVNUX1RJTUVTX0hFQURFUl9fCi0jZGVmaW5lIF9fRkFTVF9USU1FU19IRUFERVJfXwotCi0vKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwotLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLQotZXh0ZXJuIHZvaWQJCQlGYXN0SW5pdGlhbGl6ZSh2b2lkKTsKLWV4dGVybiBVSW50NjQJCUZhc3RNaWNyb3NlY29uZHModm9pZCk7Ci1leHRlcm4gVUludDY0CQlGYXN0TWlsbGlzZWNvbmRzKHZvaWQpOwotZXh0ZXJuIFN0cmluZ1B0cglGYXN0TWV0aG9kKHZvaWQpOwotCi0vKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwotLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLQotI2VuZGlmIC8qIF9fRkFTVF9USU1FU19IRUFERVJfXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9tYWNvcy9TRExfTVBXdGltZXIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvbWFjb3MvU0RMX01QV3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWU0YWEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9tYWNvcy9TRExfTVBXdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmZGVmIFNETF9USU1FUl9NQUNPUwotCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNpbmNsdWRlIDxUaW1lci5oPgotI2luY2x1ZGUgPE9TVXRpbHMuaD4KLSNpbmNsdWRlIDxHZXN0YWx0Lmg+Ci0jaW5jbHVkZSA8UHJvY2Vzc2VzLmg+Ci0KLSNpbmNsdWRlIDxMb3dNZW0uaD4KLQotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCi0KLSNkZWZpbmUgTVNfUEVSX1RJQ0sJKDEwMDAvNjApCQkvKiBNYWNPUyB0aWNrID0gMS82MCBzZWNvbmQgKi8KLQotLyogTm90ZTogVGhpcyBpcyBvbmx5IGEgc3RlcCBhYm92ZSB0aGUgb3JpZ2luYWwgMS82MHMgaW1wbGVtZW50YXRpb24uCi0gKiAgICAgICBGb3IgYSBnb29kIGltcGxlbWVudGF0aW9uLCBzZWUgRmFzdFRpbWVzLltjaF0sIGJ5IE1hdHQgU2xvdC4KLSAqLwotI2RlZmluZSBVU0VfTUlDUk9TRUNPTkRTCi0jZGVmaW5lIFdpZGVUbzY0Yml0KHcpCSgqKFVJbnQ2NCAqKSAmKHcpKQotCi1VSW50NjQgc3RhcnQ7Ci0KLXZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKLXsKLSNpZmRlZiBVU0VfTUlDUk9TRUNPTkRTCi0JVW5zaWduZWRXaWRlIG5vdzsKLQkKLQlNaWNyb3NlY29uZHMoJm5vdyk7Ci0Jc3RhcnQgPSBXaWRlVG82NGJpdChub3cpOwotI2Vsc2UKLQkvKiBGSVhNRTogU2hvdWxkIHdlIGltcGxlbWVudCBhIHdyYXBwaW5nIGFsZ29yaXRobSwgbGlrZSBXaW4zMj8gKi8KLSNlbmRpZgotfQotCi1VaW50MzIgU0RMX0dldFRpY2tzKHZvaWQpCi17Ci0jaWZkZWYgVVNFX01JQ1JPU0VDT05EUwotCVVuc2lnbmVkV2lkZSBub3c7Ci0JCi0JTWljcm9zZWNvbmRzKCZub3cpOwotCXJldHVybiAoVWludDMyKSgoV2lkZVRvNjRiaXQobm93KS1zdGFydCkvMTAwMCk7Ci0jZWxzZQotCXJldHVybihMTUdldFRpY2tzKCkqTVNfUEVSX1RJQ0spOwotI2VuZGlmCi19Ci0KLXZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKLXsKLSNpZmRlZiBVU0VfTUlDUk9TRUNPTkRTCi0JVWludDMyIGVuZF9tczsKLQkKLQllbmRfbXMgPSBTRExfR2V0VGlja3MoKSArIG1zOwotCWRvIHsKLQkJLyogRklYTUU6IFlpZWxkIENQVT8gKi8gOwotCX0gd2hpbGUgKCBTRExfR2V0VGlja3MoKSA8IGVuZF9tcyApOwotI2Vsc2UKLQlVSW50MzIJCXVudXNlZDsgLyogTUpTICovCi0JRGVsYXkobXMvTVNfUEVSX1RJQ0ssICZ1bnVzZWQpOwotI2VuZGlmCi19Ci0KLQotLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KLXR5cGVkZWYgc3RydWN0IF9FeHRlbmRlZFRpbWVyUmVjCi17Ci0JVE1UYXNrCQkgICAgIHRtVGFzazsKLQlQcm9jZXNzU2VyaWFsTnVtYmVyICB0YXNrUFNOOwotfSBFeHRlbmRlZFRpbWVyUmVjLCAqRXh0ZW5kZWRUaW1lclB0cjsKLQotc3RhdGljIEV4dGVuZGVkVGltZXJSZWMgZ0V4dGVuZGVkVGltZXJSZWM7Ci0KLQotaW50IFNETF9TWVNfVGltZXJJbml0KHZvaWQpCi17Ci0JLyogV2UgZG9uJ3QgbmVlZCBhIHNldHVwPyAqLwotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQotewotCS8qIFdlIGRvbid0IG5lZWQgYSBjbGVhbnVwPyAqLwotCXJldHVybjsKLX0KLQotLyogT3VyIFN0dWIgcm91dGluZSB0byBzZXQgdXAgYW5kIHRoZW4gY2FsbCB0aGUgcmVhbCByb3V0aW5lLiAqLwotcGFzY2FsIHZvaWQgVGltZXJDYWxsYmFja1Byb2MoVE1UYXNrUHRyIHRtVGFza1B0cikKLXsKLQlVaW50MzIgbXM7Ci0KLQlXYWtlVXBQcm9jZXNzKCYoKEV4dGVuZGVkVGltZXJQdHIpIHRtVGFza1B0ciktPnRhc2tQU04pOwotCi0JbXMgPSBTRExfYWxhcm1fY2FsbGJhY2soU0RMX2FsYXJtX2ludGVydmFsKTsKLQlpZiAoIG1zICkgewotCQlTRExfYWxhcm1faW50ZXJ2YWwgPSBST1VORF9SRVNPTFVUSU9OKG1zKTsKLQkJUHJpbWVUaW1lKChRRWxlbVB0cikmZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLAotCQkgICAgICAgICAgU0RMX2FsYXJtX2ludGVydmFsKTsKLQl9IGVsc2UgewotCQlTRExfYWxhcm1faW50ZXJ2YWwgPSAwOwotCX0KLX0KLQotaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKQotewotCS8qCi0JICogQ29uZmlndXJlIHRoZSBnbG9iYWwgc3RydWN0dXJlIHRoYXQgc3RvcmVzIHRoZSB0aW1pbmcgaW5mb3JtYXRpb24uCi0JICovCi0JZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLnFMaW5rID0gTlVMTDsKLQlnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2sucVR5cGUgPSAwOwotCWdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzay50bUFkZHIgPSBOZXdUaW1lclVQUChUaW1lckNhbGxiYWNrUHJvYyk7Ci0JZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLnRtQ291bnQgPSAwOwotCWdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzay50bVdha2VVcCA9IDA7Ci0JZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLnRtUmVzZXJ2ZWQgPSAwOwotCUdldEN1cnJlbnRQcm9jZXNzKCZnRXh0ZW5kZWRUaW1lclJlYy50YXNrUFNOKTsKLQotCS8qIEluc3RhbGwgdGhlIHRhc2sgcmVjb3JkICovCi0JSW5zWFRpbWUoKFFFbGVtUHRyKSZnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2spOwotCi0JLyogR28hICovCi0JUHJpbWVUaW1lKChRRWxlbVB0cikmZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLCBTRExfYWxhcm1faW50ZXJ2YWwpOwotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQotewotCVJtdlRpbWUoKFFFbGVtUHRyKSZnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2spOwotfQotCi0jZW5kaWYgLyogU0RMX1RJTUVSX01BQ09TICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL21hY29zL1NETF9zeXN0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9tYWNvcy9TRExfc3lzdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmYjY2NC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL21hY29zL1NETF9zeXN0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX1RJTUVSX01BQ09TCi0KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2luY2x1ZGUgPFRpbWVyLmg+Ci0jaW5jbHVkZSA8T1NVdGlscy5oPgotI2luY2x1ZGUgPEdlc3RhbHQuaD4KLSNpbmNsdWRlIDxQcm9jZXNzZXMuaD4KLQotI2luY2x1ZGUgPExvd01lbS5oPgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3RpbWVyX2MuaCIKLQotI2luY2x1ZGUgIkZhc3RUaW1lcy5oIgotCi0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0jZGVmaW5lIE5ld1RpbWVyUHJvYyBOZXdUaW1lclVQUAotI2VuZGlmCi0KLSNkZWZpbmUgTVNfUEVSX1RJQ0sJKDEwMDAuMC82MC4wKQkJLyogTWFjT1MgdGljayA9IDEvNjAgc2Vjb25kICovCi0KLQotI2RlZmluZSBrVHdvUG93ZXIzMiAgICAgKDQyOTQ5NjcyOTYuMCkgICAgICAgICAgLyogMl4zMiAqLwotCi1zdGF0aWMgZG91YmxlIHN0YXJ0X3RpY2s7Ci1zdGF0aWMgaW50ICAgIGlzX2Zhc3RfaW5pdGVkID0gMDsKLQotdm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKQotewotICAgICAgICBpZiAoICEgaXNfZmFzdF9pbml0ZWQgKSAgICAgLy8gaW1wb3J0YW50IHRvIGNoZWNrIG9yIEZhc3RUaW1lIG1heSBoYW5nIG1hY2hpbmUhCi0gICAgICAgICAgICBTRExfU1lTX1RpbWVySW5pdCgpOwotCi0gICAgICAgIHN0YXJ0X3RpY2sgPSBGYXN0TWljcm9zZWNvbmRzKCk7Ci19Ci0KLVVpbnQzMiBTRExfR2V0VGlja3Modm9pZCkKLXsKLSAgICAgICAgCi0gICAgICAgIGlmICggISBpc19mYXN0X2luaXRlZCApCi0gICAgICAgICAgICBTRExfU1lTX1RpbWVySW5pdCgpOwotICAgICAgICAgCi0gICAgICAgIHJldHVybiBGYXN0TWlsbGlzZWNvbmRzKCk7Ci19Ci0KLXZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKLXsKLSAgICAgICAgVWludDMyIHN0b3AsIG5vdzsKLQotICAgICAgICBzdG9wID0gU0RMX0dldFRpY2tzKCkgKyBtczsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgotICAgICAgICAgICAgICAgIE1QWWllbGQoKTsKLSAgICAgICAgICAgICNlbHNlCi0gICAgICAgICAgICAgICAgU3lzdGVtVGFzaygpOwotICAgICAgICAgICAgI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBub3cgPSBTRExfR2V0VGlja3MoKTsKLQotICAgICAgICB9IHdoaWxlICggc3RvcCA+IG5vdyApOwotfQotCi0vKgotdm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKQotewotCS8vIEZJWE1FOiBTaG91bGQgd2UgaW1wbGVtZW50IGEgd3JhcHBpbmcgYWxnb3JpdGhtLCBsaWtlIFdpbjMyPyAKLX0KLQotVWludDMyIFNETF9HZXRUaWNrcyh2b2lkKQotewotCVVuc2lnbmVkV2lkZSBtczsKLQkKLQlNaWNyb3NlY29uZHMgKCZtcyk7Ci0JCi0JcmV0dXJuICggbXMubG8gLyAxMDAwICk7Ci19Ci0KLXZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKLXsKLQkKLQlVbnNpZ25lZFdpZGUgbWljcm9zZWNzOwotCVVJbnQzMiAgICAgICBzdG9wOwotCQotCU1pY3Jvc2Vjb25kcyAoJm1pY3Jvc2Vjcyk7Ci0JCi0Jc3RvcCA9IG1pY3Jvc2Vjcy5sbyArIChtcyAqIDEwMDApOwotCQotCXdoaWxlICggc3RvcCA+IG1pY3Jvc2Vjcy5sbyApIHsKLQkKLQkgICBTeXN0ZW1UYXNrICgpOwotCSAgIAotCSAgIE1pY3Jvc2Vjb25kcyAoJm1pY3Jvc2Vjcyk7Ci0JfQotCi19Ki8KLSAKLS8qIERhdGEgdG8gaGFuZGxlIGEgc2luZ2xlIHBlcmlvZGljIGFsYXJtICovCi10eXBlZGVmIHN0cnVjdCBfRXh0ZW5kZWRUaW1lclJlYwotewotCVRNVGFzawkJICAgICB0bVRhc2s7Ci0JUHJvY2Vzc1NlcmlhbE51bWJlciAgdGFza1BTTjsKLX0gRXh0ZW5kZWRUaW1lclJlYywgKkV4dGVuZGVkVGltZXJQdHI7Ci0KLXN0YXRpYyBFeHRlbmRlZFRpbWVyUmVjIGdFeHRlbmRlZFRpbWVyUmVjOwotCi0KLWludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQotewotCUZhc3RJbml0aWFsaXplICgpOwotCWlzX2Zhc3RfaW5pdGVkID0gMTsKLQkKLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCkKLXsKLQkvKiBXZSBkb24ndCBuZWVkIGEgY2xlYW51cD8gKi8KLQlyZXR1cm47Ci19Ci0KLS8qIE91ciBTdHViIHJvdXRpbmUgdG8gc2V0IHVwIGFuZCB0aGVuIGNhbGwgdGhlIHJlYWwgcm91dGluZS4gKi8KLXBhc2NhbCB2b2lkIFRpbWVyQ2FsbGJhY2tQcm9jKFRNVGFza1B0ciB0bVRhc2tQdHIpCi17Ci0JVWludDMyIG1zOwotCi0JV2FrZVVwUHJvY2VzcygmKChFeHRlbmRlZFRpbWVyUHRyKSB0bVRhc2tQdHIpLT50YXNrUFNOKTsKLQotCW1zID0gU0RMX2FsYXJtX2NhbGxiYWNrKFNETF9hbGFybV9pbnRlcnZhbCk7Ci0JaWYgKCBtcyApIHsKLQkJU0RMX2FsYXJtX2ludGVydmFsID0gUk9VTkRfUkVTT0xVVElPTihtcyk7Ci0JCVByaW1lVGltZSgoUUVsZW1QdHIpJmdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzaywKLQkJICAgICAgICAgIFNETF9hbGFybV9pbnRlcnZhbCk7Ci0JfSBlbHNlIHsKLQkJU0RMX2FsYXJtX2ludGVydmFsID0gMDsKLQl9Ci19Ci0KLWludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKLXsKLQkvKgotCSAqIENvbmZpZ3VyZSB0aGUgZ2xvYmFsIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyB0aGUgdGltaW5nIGluZm9ybWF0aW9uLgotCSAqLwotCWdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzay5xTGluayA9IE5VTEw7Ci0JZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLnFUeXBlID0gMDsKLQlnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2sudG1BZGRyID0gTmV3VGltZXJQcm9jKFRpbWVyQ2FsbGJhY2tQcm9jKTsKLQlnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2sudG1Db3VudCA9IDA7Ci0JZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLnRtV2FrZVVwID0gMDsKLQlnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2sudG1SZXNlcnZlZCA9IDA7Ci0JR2V0Q3VycmVudFByb2Nlc3MoJmdFeHRlbmRlZFRpbWVyUmVjLnRhc2tQU04pOwotCi0JLyogSW5zdGFsbCB0aGUgdGFzayByZWNvcmQgKi8KLQlJbnNYVGltZSgoUUVsZW1QdHIpJmdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzayk7Ci0KLQkvKiBHbyEgKi8KLQlQcmltZVRpbWUoKFFFbGVtUHRyKSZnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2ssIFNETF9hbGFybV9pbnRlcnZhbCk7Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIFNETF9TWVNfU3RvcFRpbWVyKHZvaWQpCi17Ci0JUm12VGltZSgoUUVsZW1QdHIpJmdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzayk7Ci19Ci0KLSNlbmRpZiAvKiBTRExfVElNRVJfTUFDT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvbWludC9TRExfc3lzdGltZXIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvbWludC9TRExfc3lzdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1NjBjNC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL21pbnQvU0RMX3N5c3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfVElNRVJfTUlOVAotCi0vKgotICoJVE9TL01pTlQgdGltZXIgZHJpdmVyCi0gKgliYXNlZCBvbiB2YmwgdmVjdG9yCi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxtaW50L2Nvb2tpZS5oPgotI2luY2x1ZGUgPG1pbnQvc3lzdmFycy5oPgotI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+Ci0jaW5jbHVkZSA8bWludC9taW50YmluZC5oPgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3RpbWVyX2MuaCIKLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0KLSNpbmNsdWRlICJTRExfdmJsdGltZXJfcy5oIgotCi0vKiBmcm9tIGF1ZGlvL21pbnQgKi8KLXZvaWQgU0RMX01pbnRBdWRpb19DaGVja0ZwdSh2b2lkKTsKLQotLyogVGhlIGZpcnN0IHRpY2tzIHZhbHVlIG9mIHRoZSBhcHBsaWNhdGlvbiAqLwotc3RhdGljIFVpbnQzMiBzdGFydDsKLXN0YXRpYyBTRExfYm9vbCByZWFkX2h6MjAwX2Zyb21fdmJsID0gU0RMX0ZBTFNFOwotc3RhdGljIGludCBtaW50X3ByZXNlbnQ7IC8qIGNhbiB3ZSB1c2UgU3lpZWxkKCkgPyAqLwotCi12b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCi17Ci0Jdm9pZCAqb2xkX3N0YWNrOwotCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0KLQkvKiBTZXQgZmlyc3QgdGlja3MgdmFsdWUgKi8KLQlvbGRfc3RhY2sgPSAodm9pZCAqKVN1cGVyKDApOwotCXN0YXJ0ID0gKigodm9sYXRpbGUgbG9uZyAqKV9oel8yMDApOwotCVN1cGVyKG9sZF9zdGFjayk7Ci0KLQlzdGFydCAqPSA1OwkvKiBPbmUgX2h6XzIwMCB0aWMgaXMgNW1zICovCi0KLQltaW50X3ByZXNlbnQgPSAoR2V0Y29va2llKENfTWlOVCwgJmR1bW15KSA9PSBDX0ZPVU5EKTsKLX0KLQotVWludDMyIFNETF9HZXRUaWNrcyAodm9pZCkKLXsKLQlVaW50MzIgbm93ID0gc3RhcnQ7Ci0KLQlpZiAocmVhZF9oejIwMF9mcm9tX3ZibCkgewotCQlub3cgPSBTRExfQXRhcmlfaHoyMDA7Ci0JfSBlbHNlIHsKLQkJdm9pZCAqb2xkX3N0YWNrID0gKHZvaWQgKilTdXBlcigwKTsKLQkJbm93ID0gKigodm9sYXRpbGUgbG9uZyAqKV9oel8yMDApOwotCQlTdXBlcihvbGRfc3RhY2spOwotCX0KLQotCXJldHVybigobm93KjUpLXN0YXJ0KTsKLX0KLQotdm9pZCBTRExfRGVsYXkgKFVpbnQzMiBtcykKLXsKLQlVaW50MzIgbm93OwotCi0Jbm93ID0gU0RMX0dldFRpY2tzKCk7Ci0Jd2hpbGUgKChTRExfR2V0VGlja3MoKS1ub3cpPG1zKXsKLQkJaWYgKG1pbnRfcHJlc2VudCkgewotCQkJU3lpZWxkKCk7Ci0JCX0KLQl9Ci19Ci0KLS8qIERhdGEgdG8gaGFuZGxlIGEgc2luZ2xlIHBlcmlvZGljIGFsYXJtICovCi1zdGF0aWMgU0RMX2Jvb2wgdGltZXJfaW5zdGFsbGVkPVNETF9GQUxTRTsKLQotLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgZXZlbnQgdGhyZWFkIGlzIG5vdCBydW5uaW5nICovCi1pbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKLXsKLQl2b2lkICpvbGRfc3RhY2s7Ci0KLQlTRExfTWludEF1ZGlvX0NoZWNrRnB1KCk7Ci0KLQkvKiBJbnN0YWxsIFJ1blRpbWVyIGluIHZibCB2ZWN0b3IgKi8KLQlvbGRfc3RhY2sgPSAodm9pZCAqKVN1cGVyKDApOwotCXRpbWVyX2luc3RhbGxlZCA9ICFTRExfQXRhcmlWYmxJbnN0YWxsKFNETF9UaHJlYWRlZFRpbWVyQ2hlY2spOwotCVN1cGVyKG9sZF9zdGFjayk7Ci0KLQlpZiAoIXRpbWVyX2luc3RhbGxlZCkgewotCQlyZXR1cm4oLTEpOwotCX0KLQotCXJlYWRfaHoyMDBfZnJvbV92YmwgPSBTRExfVFJVRTsKLQlyZXR1cm4oU0RMX1NldFRpbWVyVGhyZWFkZWQoMCkpOwotfQotCi12b2lkIFNETF9TWVNfVGltZXJRdWl0KHZvaWQpCi17Ci0JLyogVW5pbnN0YWxsIFJ1blRpbWVyIHZibCB2ZWN0b3IgKi8KLQlpZiAodGltZXJfaW5zdGFsbGVkKSB7Ci0JCXZvaWQgKm9sZF9zdGFjayA9ICh2b2lkICopU3VwZXIoMCk7Ci0JCVNETF9BdGFyaVZibFVuaW5zdGFsbChTRExfVGhyZWFkZWRUaW1lckNoZWNrKTsKLQkJU3VwZXIob2xkX3N0YWNrKTsKLQkJdGltZXJfaW5zdGFsbGVkID0gU0RMX0ZBTFNFOwotCX0KLQlyZWFkX2h6MjAwX2Zyb21fdmJsID0gU0RMX0ZBTFNFOwotfQotCi1pbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCi17Ci0JU0RMX1NldEVycm9yKCJJbnRlcm5hbCBsb2dpYyBlcnJvcjogTWlOVCB1c2VzIHZibCB0aW1lciIpOwotCXJldHVybigtMSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19TdG9wVGltZXIodm9pZCkKLXsKLQlyZXR1cm47Ci19Ci0KLSNlbmRpZiAvKiBTRExfVElNRVJfTUlOVCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9taW50L1NETF92Ymx0aW1lci5TIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9taW50L1NETF92Ymx0aW1lci5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWM0YmU5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvbWludC9TRExfdmJsdGltZXIuUworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKgotICoJVkJMIHF1ZXVlIHJvdXRpbmUKLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLSNkZWZpbmUgX3ZibF9xdWV1ZSAweDQ1NgotI2RlZmluZSBfaHpfMjAwICAgIDB4NGJhCi0KLQkudGV4dAotCi0JLmdsb2JsCV9TRExfQXRhcmlWYmxJbnN0YWxsCi0JLmdsb2JsCV9TRExfQXRhcmlWYmxVbmluc3RhbGwKLQotCS5nbG9ibAlfU0RMX01pbnRBdWRpb19oYXNmcHUKLQotLyotLS0gVmVjdG9yIGluc3RhbGxlciAtLS0qLwotCi1fU0RMX0F0YXJpVmJsSW5zdGFsbDoKLQltb3ZlbAlzcEAoNCksbXlfdmVjdG9yCi0JbGVhCQlfbXlfdmJsLGEwCi0KLQljbHJ3CXZibF9tdXRleAotCW1vdmVsCV9oel8yMDAudywgX1NETF9BdGFyaV9oejIwMAotCi0JLyogU3RvcCBpbnRlcnJ1cHRzICovCi0KLQltb3ZldwkjMHgyNzAwLHNyCi0KLQkvKiBSZWFkIHZibF9xdWV1ZSBwb2ludGVyICovCi0JbW92ZWwJX3ZibF9xdWV1ZS53LGExCi0KLQkvKiBTZWFyY2ggYSBmcmVlIHBsYWNlICovCi0JbW92ZXEJIzcsZDAKLWJjbF9zZWFyY2hfcGxhY2U6Ci0JbW92ZWwJKGExKSxkMQotCWJlcXMJcGxhY2VfZm91bmQKLQlhZGRxbAkjNCxhMQotCWRicmEJZDAsYmNsX3NlYXJjaF9wbGFjZQotCi0JLyogTm90IGZvdW5kICovCi0JbW92ZXEJIzEsZDAKLQlicmFzCWV4aXRfdmJsX3F1ZXVlCi0KLQkvKiBUaGVuIGluc3RhbGwgb3Vyc2VsdmVzICovCi1wbGFjZV9mb3VuZDoKLQltb3ZlbAlhMCwoYTEpCi0JbW92ZXEJIzAsZDAJCi0KLWV4aXRfdmJsX3F1ZXVlOgotCS8qIFJlc3RhcnQgaW50ZXJydXB0cyAqLwotCW1vdmV3CSMweDIzMDAsc3IKLQotCXJ0cwotCi0vKi0tLSBWZWN0b3IgdW5pbnN0YWxsZXIgLS0tKi8KLQotX1NETF9BdGFyaVZibFVuaW5zdGFsbDoKLQltb3ZlbAlzcEAoNCksZDAKLQljbXBsCW15X3ZlY3RvcixkMAotCWJuZXMJYmFkdmVjdG9yCi0JCi0JbW92ZWwJI19teV92YmwsZDAKLQotCS8qIFN0b3AgaW50ZXJydXB0cyAqLwotCi0JbW92ZXcJIzB4MjcwMCxzcgotCi0JLyogUmVhZCB2YmxfcXVldWUgcG9pbnRlciAqLwotCW1vdmVsCV92YmxfcXVldWUudyxhMQotCi0JLyogU2VhcmNoIHdoZXJlIHdlIGFyZSAqLwotCW1vdmVxCSM3LGQxCi1iY2wyX3NlYXJjaF9wbGFjZToKLQljbXBsCShhMSksZDAKLQlibmVzCW5leHRfcGxhY2UKLQljbHJsCShhMSkKLQltb3ZlcQkjMCxkMQotbmV4dF9wbGFjZToKLQlhZGRxbAkjNCxhMQotCWRicmEJZDEsYmNsMl9zZWFyY2hfcGxhY2UKLQotCS8qIFJlc3RhcnQgaW50ZXJydXB0cyAqLwotCW1vdmV3CSMweDIzMDAsc3IKLWJhZHZlY3RvcjoKLQlydHMKLQotLyotLS0gT3VyIHZibCAtLS0qLwotCi1fbXlfdmJsOgotCS8qIFVwZGF0ZSBfaHpfMjAwICovCi0JbW92ZWwJX2h6XzIwMC53LCBfU0RMX0F0YXJpX2h6MjAwCi0KLQkvKiBWZXJpZnkgaWYgdGhpcyBpcyBub3QgYWxyZWFkeSBydW5uaW5nICovCi0KLQl0c3R3CXZibF9tdXRleAotCWJuZXMJdmJsX2VuZAotCW5vdHcJdmJsX211dGV4Ci0KLQltb3ZlbWwJZDAtZDcvYTAtYTYsc3BALQotCi0JLyogU2F2ZSBGUFUgaWYgbmVlZGVkICovCi0JdHN0dwlfU0RMX01pbnRBdWRpb19oYXNmcHUKLQliZXFzCVNETF9BdGFyaVZibF9ub2ZwdTEKLQkuY2hpcAk2ODA2MAotCWZzYXZlCXNwQC0KLQlmbW92ZW1sIGZwY3IvZnBzci9mcGlhcixzcEAtCi0JZm1vdmVteAlmcDAtZnA3LHNwQC0KLQkuY2hpcAk2ODAwMAotU0RMX0F0YXJpVmJsX25vZnB1MToKLQotCW1vdmVsCW15X3ZlY3RvcixhMAotCWpzcgkJYTBACi0KLQkvKiBSZXN0b3JlIEZQVSBpZiBuZWVkZWQgKi8KLQl0c3R3CV9TRExfTWludEF1ZGlvX2hhc2ZwdQotCWJlcXMJU0RMX0F0YXJpVmJsX1hiaW9zX25vZnB1MgotCS5jaGlwCTY4MDYwCi0JZm1vdmVteAlzcEArLGZwMC1mcDcKLQlmbW92ZW1sCXNwQCssZnBjci9mcHNyL2ZwaWFyCi0JZnJlc3RvcmUJc3BAKwotCS5jaGlwCTY4MDAwCi1TRExfQXRhcmlWYmxfWGJpb3Nfbm9mcHUyOgotCi0JbW92ZW1sCXNwQCssZDAtZDcvYTAtYTYKLQotCWNscncJdmJsX211dGV4Ci12YmxfZW5kOgotCXJ0cwotCi0JLmRhdGEKLQkuZXZlbgotCS5jb21tCV9TRExfQXRhcmlfaHoyMDAsNCoxCi0JLmV2ZW4KLQkuY29tbQl2YmxfbXV0ZXgsMioxCi0JLmV2ZW4KLQkuY29tbQlteV92ZWN0b3IsNCoxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL21pbnQvU0RMX3ZibHRpbWVyX3MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvbWludC9TRExfdmJsdGltZXJfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODkzZWY1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvbWludC9TRExfdmJsdGltZXJfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gKglUT1MvTWlOVCB0aW1lciBkcml2ZXIKLSAqCWJhc2VkIG9uIHZibCB2ZWN0b3IKLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLWV4dGVybiB2b2xhdGlsZSBsb25nIFNETF9BdGFyaV9oejIwMDsKLQotLyogRnVuY3Rpb25zIHByb3RvdHlwZXMgKi8KLWV4dGVybiBpbnQgU0RMX0F0YXJpVmJsSW5zdGFsbCh2b2lkICpuZXd2ZWN0b3IpOwotZXh0ZXJuIHZvaWQgU0RMX0F0YXJpVmJsVW5pbnN0YWxsKHZvaWQgKm5ld3ZlY3Rvcik7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL29zMi9TRExfc3lzdGltZXIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvb3MyL1NETF9zeXN0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjVjZWQ5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvb3MyL1NETF9zeXN0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX1RJTUVSX09TMgotCi0jZGVmaW5lIElOQ0xfRE9TTUlTQwotI2RlZmluZSBJTkNMX0RPU0VSUk9SUwotI2RlZmluZSBJTkNMX0RPU1NFTUFQSE9SRVMKLSNkZWZpbmUgSU5DTF9ET1NEQVRFVElNRQotI2RlZmluZSBJTkNMX0RPU1BST0NFU1MKLSNkZWZpbmUgSU5DTF9ET1NQUk9GSUxFCi0jZGVmaW5lIElOQ0xfRE9TRVhDRVBUSU9OUwotI2luY2x1ZGUgPG9zMi5oPgotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCi0KLQotI2RlZmluZSBUSU1FX1dSQVBfVkFMVUUgKH4oRFdPUkQpMCkKLQotLyogVGhlIGZpcnN0IGhpZ2gtcmVzb2x1dGlvbiB0aWNrcyB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24gKi8KLXN0YXRpYyBsb25nIGxvbmcgaGlyZXNfc3RhcnRfdGlja3M7Ci0vKiBUaGUgbnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQgb2YgdGhlIGhpZ2gtcmVzb2x1dGlvbiBwZXJmb3JtYW5jZSBjb3VudGVyICovCi1zdGF0aWMgVUxPTkcgaGlyZXNfdGlja3NfcGVyX3NlY29uZDsKLQotdm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKQotewotICAgICAgICBEb3NUbXJRdWVyeUZyZXEoJmhpcmVzX3RpY2tzX3Blcl9zZWNvbmQpOwotICAgICAgICBEb3NUbXJRdWVyeVRpbWUoKFBRV09SRCkmaGlyZXNfc3RhcnRfdGlja3MpOwotfQotCi1ERUNMU1BFQyBVaW50MzIgU0RMQ0FMTCBTRExfR2V0VGlja3Modm9pZCkKLXsKLSAgICAgICAgbG9uZyBsb25nIGhpcmVzX25vdzsKLSAgICAgICAgVUxPTkcgdGlja3MgPSB0aWNrczsKLQotICAgICAgICBEb3NUbXJRdWVyeVRpbWUoKFBRV09SRCkmaGlyZXNfbm93KTsKLS8qCi0gICAgICAgIGhpcmVzX25vdyAtPSBoaXJlc19zdGFydF90aWNrczsKLSAgICAgICAgaGlyZXNfbm93ICo9IDEwMDA7Ci0gICAgICAgIGhpcmVzX25vdyAvPSBoaXJlc190aWNrc19wZXJfc2Vjb25kOwotKi8KLSAgICAgICAgLyogaW5saW5lIGFzbSB0byBhdm9pZCBydW50aW1lIGluY2x1c2lvbiAqLwotICAgICAgICBfYXNtIHsKLSAgICAgICAgICAgcHVzaCBlZHgKLSAgICAgICAgICAgcHVzaCBlYXgKLSAgICAgICAgICAgbW92IGVheCwgZHdvcmQgcHRyIGhpcmVzX25vdwotICAgICAgICAgICBtb3YgZWR4LCBkd29yZCBwdHIgaGlyZXNfbm93KzQKLSAgICAgICAgICAgc3ViIGVheCwgZHdvcmQgcHRyIGhpcmVzX3N0YXJ0X3RpY2tzCi0gICAgICAgICAgIHNiYiBlZHgsIGR3b3JkIHB0ciBoaXJlc19zdGFydF90aWNrcys0Ci0gICAgICAgICAgIG1vdiBlYngsMTAwMAotICAgICAgICAgICBtb3YgZWN4LGVkeAotICAgICAgICAgICBtdWwgZWJ4Ci0gICAgICAgICAgIHB1c2ggZWF4Ci0gICAgICAgICAgIHB1c2ggZWR4Ci0gICAgICAgICAgIG1vdiBlYXgsZWN4Ci0gICAgICAgICAgIG11bCBlYngKLSAgICAgICAgICAgcG9wIGVheAotICAgICAgICAgICBhZGQgZWR4LGVheAotICAgICAgICAgICBwb3AgZWF4Ci0gICAgICAgICAgIG1vdiBlYngsIGR3b3JkIHB0ciBoaXJlc190aWNrc19wZXJfc2Vjb25kCi0gICAgICAgICAgIGRpdiBlYngKLSAgICAgICAgICAgbW92IGR3b3JkIHB0ciB0aWNrcywgZWF4Ci0gICAgICAgICAgIHBvcCBlZHgKLSAgICAgICAgICAgcG9wIGVheAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRpY2tzOwotCi19Ci0KLS8qIEhpZ2ggcmVzb2x1dGlvbiBzbGVlcCwgb3JpZ2luYWxseSBtYWRlIGJ5IElseWEgWmFraGFyZXZpY2ggKi8KLURFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRGVsYXkoVWludDMyIG1zKQotewotICAvKiBUaGlzIGlzIHNpbWlsYXIgdG8gRG9zU2xlZXAoKSwgYnV0IGhhcyA4bXMgZ3JhbnVsYXJpdHkgaW4gdGltZS1jcml0aWNhbAotICAgICB0aHJlYWRzIGV2ZW4gb24gV2FycDMuICovCi0gIEhFViAgICAgaGV2RXZlbnQxICAgICA9IDA7ICAgLyogRXZlbnQgc2VtYXBob3JlIGhhbmRsZSAgICAqLwotICBIVElNRVIgIGh0aW1lckV2ZW50MSAgPSAwOyAgIC8qIFRpbWVyIGhhbmRsZSAgICAgICAgICAgICAgKi8KLSAgQVBJUkVUICByYyAgICAgICAgICAgID0gTk9fRVJST1I7ICAvKiBSZXR1cm4gY29kZSAgICAgICAgICAgICAgICovCi0gIGludCByZXQgPSAxOwotICBVTE9ORyBwcmlvcml0eSA9IDAsIG5lc3Rpbmc7ICAgLyogU2h1dCBkb3duIHRoZSB3YXJuaW5ncyAqLwotICBQUElCIHBpYjsKLSAgUFRJQiB0aWI7Ci0gIGNoYXIgKmUgPSBOVUxMOwotICBBUElSRVQgYmFkcmM7Ci0gIGludCBzd2l0Y2hfcHJpb3JpdHkgPSA1MDsKLQotICBEb3NDcmVhdGVFdmVudFNlbShOVUxMLCAgICAgIC8qIFVubmFtZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgJmhldkV2ZW50MSwgIC8qIEhhbmRsZSBvZiBzZW1hcGhvcmUgcmV0dXJuZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgRENfU0VNX1NIQVJFRCwgLyogU2hhcmVkIG5lZWRlZCBmb3IgRG9zQXN5bmNUaW1lciAqLwotICAgICAgICAgICAgICAgICAgICBGQUxTRSk7ICAgICAgLyogU2VtYXBob3JlIGlzIGluIFJFU0VUIHN0YXRlICAqLwotCi0gIGlmIChtcyA+PSBzd2l0Y2hfcHJpb3JpdHkpCi0gICAgc3dpdGNoX3ByaW9yaXR5ID0gMDsKLSAgaWYgKHN3aXRjaF9wcmlvcml0eSkKLSAgewotICAgIGlmIChEb3NHZXRJbmZvQmxvY2tzKCZ0aWIsICZwaWIpIT1OT19FUlJPUikKLSAgICAgIHN3aXRjaF9wcmlvcml0eSA9IDA7Ci0gICAgZWxzZQotICAgIHsKLSAvKiBJbiBXYXJwMywgdG8gc3dpdGNoIHNjaGVkdWxpbmcgdG8gOG1zIHN0ZXAsIG9uZSBuZWVkcyB0byBkbyAKLSAgICBEb3NBc3luY1RpbWVyKCkgaW4gdGltZS1jcml0aWNhbCB0aHJlYWQuICBPbiBsYXRlcnMgdmVyc2lvbnMsCi0gICAgbW9yZSBhbmQgbW9yZSBjYXNlcyBvZiB3YWl0LWZvci1zb21ldGhpbmcgYXJlIGNvdmVyZWQuCi0KLSAgICBJdCB0dXJucyBvdXQgdGhhdCBvbiBXYXJwM2ZwNDIgaXQgaXMgdGhlIHByaW9yaXR5IGF0IHRoZSB0aW1lCi0gICAgb2YgRG9zQXN5bmNUaW1lcigpIHdoaWNoIG1hdHRlcnMuICBMZXQncyBob3BlIHRoYXQgdGhpcyB3b3JrcwotICAgIHdpdGggbGF0ZXIgdmVyc2lvbnMgdG9vLi4uICBYWFhYCi0gICovCi0gICAgICBwcmlvcml0eSA9ICh0aWItPnRpYl9wdGliMi0+dGliMl91bHByaSk7Ci0gICAgICBpZiAoKHByaW9yaXR5ICYgMHhGRjAwKSA9PSAweDAzMDApIC8qIGFscmVhZHkgdGltZS1jcml0aWNhbCAqLwotICAgICAgICBzd2l0Y2hfcHJpb3JpdHkgPSAwOwotIC8qIE1ha2UgdXMgdGltZS1jcml0aWNhbC4gIEp1c3QgbW9kaWZ5aW5nIFRJQiBpcyBub3QgZW5vdWdoLi4uICovCi0gLyogdGliLT50aWJfcHRpYjItPnRpYjJfdWxwcmkgPSAweDAzMDA7Ki8KLSAvKiBXZSBkbyBub3Qgd2FudCB0byBydW4gYXQgaGlnaCBwcmlvcml0eSBpZiBhIHNpZ25hbCBjYXVzZXMgdXMKLSAgICB0byBsb25nam1wKCkgb3V0IG9mIHRoaXMgc2VjdGlvbi4uLiAqLwotICAgICAgaWYgKERvc0VudGVyTXVzdENvbXBsZXRlKCZuZXN0aW5nKSkKLSAgICAgICAgc3dpdGNoX3ByaW9yaXR5ID0gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgRG9zU2V0UHJpb3JpdHkoUFJUWVNfVEhSRUFELCBQUlRZQ19USU1FQ1JJVElDQUwsIDAsIDApOwotICAgIH0KLSAgfQotCi0gIGlmICgoYmFkcmMgPSBEb3NBc3luY1RpbWVyKG1zLAotICAgICAgICAoSFNFTSkgaGV2RXZlbnQxLCAvKiBTZW1hcGhvcmUgdG8gcG9zdCAgICAgICAgKi8KLSAgICAgICAgJmh0aW1lckV2ZW50MSkpKSAvKiBUaW1lciBoYW5kbGVyIChyZXR1cm5lZCkgKi8KLSAgICBlID0gIkRvc0FzeW5jVGltZXIiOwotCi0gIGlmIChzd2l0Y2hfcHJpb3JpdHkgJiYgdGliLT50aWJfcHRpYjItPnRpYjJfdWxwcmkgPT0gMHgwMzAwKQotICB7Ci0gLyogTm9ib2R5IHN3aXRjaGVkIHByaW9yaXR5IHdoaWxlIHdlIHNsZXB0Li4uICBJZ25vcmUgZXJyb3JzLi4uICovCi0gLyogdGliLT50aWJfcHRpYjItPnRpYjJfdWxwcmkgPSBwcmlvcml0eTsgKi8gLyogR2V0IGJhY2suLi4gKi8KLSAgICBpZiAoIShyYyA9IERvc1NldFByaW9yaXR5KFBSVFlTX1RIUkVBRCwgKHByaW9yaXR5Pj44KSAmIDB4RkYsIDAsIDApKSkKLSAgICAgIHJjID0gRG9zU2V0UHJpb3JpdHkoUFJUWVNfVEhSRUFELCAwLCBwcmlvcml0eSAmIDB4RkYsIDApOwotICB9Ci0gIGlmIChzd2l0Y2hfcHJpb3JpdHkpCi0gICAgcmMgPSBEb3NFeGl0TXVzdENvbXBsZXRlKCZuZXN0aW5nKTsgLyogSWdub3JlIGVycm9ycyAqLwotCi0gIC8qIFRoZSBhY3R1YWwgYmxvY2tpbmcgY2FsbCBpcyBtYWRlIHdpdGggIm5vcm1hbCIgcHJpb3JpdHkuICBUaGlzIHdheSB3ZQotICAgICBzaG91bGQgbm90IGJvdGhlciB3aXRoIERvc1NsZWVwKDApIGV0Yy4gdG8gY29tcGVuc2F0ZSBmb3IgdXMgaW50ZXJydXB0aW5nCi0gICAgIGhpZ2hlci1wcmlvcml0eSB0aHJlYWRzLiAgVGhlIGdvYWwgaXMgdG8gcHJvaGliaXQgdGhlIHN5c3RlbSBzcGVuZGluZyB0b28KLSAgICAgbXVjaCB0aW1lIGhhbHQoKWluZywgbm90IHRvIHJ1biB1cyAibm8gbWF0dGVyIHdoYXQiLiAqLwotICBpZiAoIWUpICAgICAvKiBXYWl0IGZvciBBc3luY1RpbWVyIGV2ZW50ICovCi0gICAgYmFkcmMgPSBEb3NXYWl0RXZlbnRTZW0oaGV2RXZlbnQxLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKLQotICBpZiAoZSkgOyAgICAvKiBEbyBub3RoaW5nICovCi0gIGVsc2UgaWYgKGJhZHJjID09IEVSUk9SX0lOVEVSUlVQVCkKLSAgICByZXQgPSAwOwotICBlbHNlIGlmIChiYWRyYykKLSAgICBlID0gIkRvc1dhaXRFdmVudFNlbSI7Ci0gIGlmICgocmMgPSBEb3NDbG9zZUV2ZW50U2VtKGhldkV2ZW50MSkpICYmICFlKSB7IC8qIEdldCByaWQgb2Ygc2VtYXBob3JlICovCi0gICAgZSA9ICJEb3NDbG9zZUV2ZW50U2VtIjsKLSAgICBiYWRyYyA9IHJjOwotICB9Ci0gIGlmIChlKQotICB7Ci0gICAgU0RMX1NldEVycm9yKCJbU0RMX0RlbGF5XSA6IEhhZCBlcnJvciBpbiAlcygpLCByYyBpcyAweCV4XG4iLCBlLCBiYWRyYyk7Ci0gIH0KLX0KLQotLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KLXN0YXRpYyBpbnQgdGltZXJfYWxpdmUgPSAwOwotc3RhdGljIFNETF9UaHJlYWQgKnRpbWVyID0gTlVMTDsKLQotc3RhdGljIGludCBTRExDQUxMIFJ1blRpbWVyKHZvaWQgKnVudXNlZCkKLXsKLSAgICAgICAgRG9zU2V0UHJpb3JpdHkoUFJUWVNfVEhSRUFELCBQUlRZQ19USU1FQ1JJVElDQUwsIDAsIDApOwotICAgICAgICB3aGlsZSAoIHRpbWVyX2FsaXZlICkgewotICAgICAgICAgICAgICAgIGlmICggU0RMX3RpbWVyX3J1bm5pbmcgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRExfVGhyZWFkZWRUaW1lckNoZWNrKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNETF9EZWxheSgxMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuKDApOwotfQotCi0vKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBldmVudCB0aHJlYWQgaXMgbm90IHJ1bm5pbmcgKi8KLWludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQotewotICAgICAgICB0aW1lcl9hbGl2ZSA9IDE7Ci0gICAgICAgIHRpbWVyID0gU0RMX0NyZWF0ZVRocmVhZChSdW5UaW1lciwgTlVMTCk7Ci0gICAgICAgIGlmICggdGltZXIgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKLSAgICAgICAgcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKLX0KLQotdm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQotewotICAgICAgICB0aW1lcl9hbGl2ZSA9IDA7Ci0gICAgICAgIGlmICggdGltZXIgKSB7Ci0gICAgICAgICAgICAgICAgU0RMX1dhaXRUaHJlYWQodGltZXIsIE5VTEwpOwotICAgICAgICAgICAgICAgIHRpbWVyID0gTlVMTDsKLSAgICAgICAgfQotfQotCi1pbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCi17Ci0gICAgICAgIFNETF9TZXRFcnJvcigiSW50ZXJuYWwgbG9naWMgZXJyb3I6IE9TLzIgdXNlcyB0aHJlYWRlZCB0aW1lciIpOwotICAgICAgICByZXR1cm4oLTEpOwotfQotCi12b2lkIFNETF9TWVNfU3RvcFRpbWVyKHZvaWQpCi17Ci0gICAgICAgIHJldHVybjsKLX0KLQotI2VuZGlmIC8qIFNETF9USU1FUl9PUzIgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGltZXIvcmlzY29zL1NETF9zeXN0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9yaXNjb3MvU0RMX3N5c3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ODJmMzkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci9yaXNjb3MvU0RMX3N5c3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZmRlZiBTRExfVElNRVJfUklTQ09TCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICIuLi9TRExfdGltZXJfYy5oIgotCi0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLS8qIFRpbWVyICBTRExfYXJyYXlzaXplKFRpbWVyICksc3RhcnQvcmVzZXQgdGltZSAqLwotc3RhdGljIFVpbnQzMiB0aW1lclN0YXJ0OwotLyogVGltZXIgcnVubmluZyBmdW5jdGlvbiAqLwotdm9pZCBSSVNDT1NfQ2hlY2tUaW1lcigpOwotI2Vsc2UKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci1leHRlcm4gVWludDMyIHJpc2Nvc19tYWluX3RocmVhZDsKLWV4dGVybiBpbnQgcmlzY29zX3VzaW5nX3RocmVhZHM7Ci1leHRlcm4gVWludDMyIFNETF9UaHJlYWRJRCgpOwotZXh0ZXJuIFVpbnQzMiBTRExfRXZlbnRUaHJlYWRJRCh2b2lkKTsKLSNlbmRpZgotCi0KLWV4dGVybiB2b2lkIFJJU0NPU19CYWNrZ3JvdW5kVGFza3Modm9pZCk7Ci0KLS8qIFRoZSBmaXJzdCB0aWNrcyB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24gKi8KLWNsb2NrX3Qgc3RhcnQ7Ci0KLXZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKLXsKLQkvKiBTZXQgZmlyc3QgdGlja3MgdmFsdWUgKi8KLQlzdGFydCA9IGNsb2NrKCk7Ci19Ci0KLVVpbnQzMiBTRExfR2V0VGlja3MgKHZvaWQpCi17Ci0JY2xvY2tfdCB0aWNrczsKLQotCXRpY2tzPWNsb2NrKCktc3RhcnQ7Ci0KLQotI2lmIENMT0NLU19QRVJfU0VDID09IDEwMDAKLQotCXJldHVybih0aWNrcyk7Ci0KLSNlbGlmIENMT0NLU19QRVJfU0VDID09IDEwMAotCi0JcmV0dXJuICh0aWNrcyAqIDEwKTsKLQotI2Vsc2UKLQotCXJldHVybiB0aWNrcyooMTAwMC9DTE9DS1NfUEVSX1NFQyk7Ci0KLSNlbmRpZgotCi19Ci0KLXZvaWQgU0RMX0RlbGF5IChVaW50MzIgbXMpCi17Ci0gICAgVWludDMyIG5vdyx0aGVuLGVsYXBzZWQ7Ci0jaWYgIVNETF9USFJFQURTX0RJU0FCTEVECi0gICAgaW50IGlzX2V2ZW50X3RocmVhZDsKLSAgICBpZiAocmlzY29zX3VzaW5nX3RocmVhZHMpCi0gICAgewotICAgICAgIGlzX2V2ZW50X3RocmVhZCA9IDA7Ci0gICAgICAgaWYgKFNETF9FdmVudFRocmVhZElEKCkpCi0gICAgICAgewotICAgICAgICAgIGlmIChTRExfRXZlbnRUaHJlYWRJRCgpID09IFNETF9UaHJlYWRJRCgpKSBpc19ldmVudF90aHJlYWQgPSAxOwotICAgICAgIH0gZWxzZSBpZiAoU0RMX1RocmVhZElEKCkgPT0gcmlzY29zX21haW5fdGhyZWFkKSBpc19ldmVudF90aHJlYWQgPSAxOwotICAgIH0gZWxzZSBpc19ldmVudF90aHJlYWQgPSAxOwotI2VuZGlmCi0KLSAgICAgICAgLypUT0RPOiBOZXh0IHZlcnNpb24gb2YgVW5peGxpYiBtYXkgYWxsb3cgdXMgdG8gdXNlIHVzbGVlcCBoZXJlICovCi0gICAgICAgIC8qICAgICAgZm9yIG5vbiBldmVudCB0aHJlYWRzICovCi0KLQkvKiBTZXQgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgLSBMaW51eCBvbmx5IG5lZWRzIHRvIGRvIHRoaXMgb25jZSAqLwotCXRoZW4gPSBTRExfR2V0VGlja3MoKTsKLQotCWRvIHsKLQkJLyogRG8gYmFja2dyb3VuZCB0YXNrcyByZXF1aXJlZCB3aGlsZSBzbGVlcGluZyBhcyB3ZSBhcmUgbm90IG11bHRpdGhyZWFkZWQgKi8KLSNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAotCQlSSVNDT1NfQmFja2dyb3VuZFRhc2tzKCk7Ci0jZWxzZQotCQkvKiBGb3IgdGhyZWFkZWQgYnVpbGQgb25seSBydW4gYmFja2dyb3VuZCB0YXNrcyBpbiBldmVudCB0aHJlYWQgKi8KLQkJaWYgKGlzX2V2ZW50X3RocmVhZCkgUklTQ09TX0JhY2tncm91bmRUYXNrcygpOwotI2VuZGlmCi0KLQkJLyogQ2FsY3VsYXRlIHRoZSB0aW1lIGludGVydmFsIGxlZnQgKGluIGNhc2Ugb2YgaW50ZXJydXB0KSAqLwotCQlub3cgPSBTRExfR2V0VGlja3MoKTsKLQkJZWxhcHNlZCA9IChub3ctdGhlbik7Ci0JCXRoZW4gPSBub3c7Ci0JCWlmICggZWxhcHNlZCA+PSBtcyApIHsKLQkJCWJyZWFrOwotCQl9Ci0JCW1zIC09IGVsYXBzZWQ7Ci0jaWYgIVNETF9USFJFQURTX0RJU0FCTEVECi0gICAgICAgICAgICAvKiBOZWVkIHRvIHlpZWxkIHRvIGxldCBvdGhlciB0aHJlYWRzIGhhdmUgYSBnbyAqLwotICAgICAgICAgICAgaWYgKHJpc2Nvc191c2luZ190aHJlYWRzKSBwdGhyZWFkX3lpZWxkKCk7Ci0jZW5kaWYKLQotCX0gd2hpbGUgKCAxICk7Ci19Ci0KLSNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAotCi0vKiBOb24tdGhyZWFkZWQgdmVyc2lvbiBvZiB0aW1lciAqLwotCi1pbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKLXsKLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCkKLXsKLQlTRExfU2V0VGltZXIoMCwgTlVMTCk7Ci19Ci0KLWludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKLXsKLQl0aW1lclN0YXJ0ID0gU0RMX0dldFRpY2tzKCk7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgU0RMX1NZU19TdG9wVGltZXIodm9pZCkKLXsKLQkvKiBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIHdlIHVzZSBTRExfdGltZXJfcnVubmluZwotCSAgIHRvIGRldGVjdCBpZiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSB0aW1lciAqLwotfQotCi0KLXZvaWQgUklTQ09TX0NoZWNrVGltZXIoKQotewotCWlmIChTRExfdGltZXJfcnVubmluZyAmJiBTRExfR2V0VGlja3MoKSAtIHRpbWVyU3RhcnQgPj0gU0RMX2FsYXJtX2ludGVydmFsKQotCXsKLQkJVWludDMyIG1zOwotCi0JCW1zID0gU0RMX2FsYXJtX2NhbGxiYWNrKFNETF9hbGFybV9pbnRlcnZhbCk7Ci0JCWlmICggbXMgIT0gU0RMX2FsYXJtX2ludGVydmFsICkKLQkJewotCQkJaWYgKCBtcyApCi0JCQl7Ci0JCQkJU0RMX2FsYXJtX2ludGVydmFsID0gUk9VTkRfUkVTT0xVVElPTihtcyk7Ci0JCQl9IGVsc2UKLQkJCXsKLQkJCQlTRExfYWxhcm1faW50ZXJ2YWwgPSAwOwotCQkJCVNETF90aW1lcl9ydW5uaW5nID0gMDsKLQkJCX0KLQkJfQotCQlpZiAoU0RMX2FsYXJtX2ludGVydmFsKSB0aW1lclN0YXJ0ID0gU0RMX0dldFRpY2tzKCk7Ci0JfQotfQotCi0jZWxzZQotCi0vKiBUaHJlYWRlZCB2ZXJzaW9uIG9mIHRpbWVyIC0gYmFzZWQgb24gY29kZSBmb3IgbGludXggKi8KLQotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLQotLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KLXN0YXRpYyBpbnQgdGltZXJfYWxpdmUgPSAwOwotc3RhdGljIFNETF9UaHJlYWQgKnRpbWVyID0gTlVMTDsKLQotc3RhdGljIGludCBSdW5UaW1lcih2b2lkICp1bnVzZWQpCi17Ci0Jd2hpbGUgKCB0aW1lcl9hbGl2ZSApIHsKLQkJaWYgKCBTRExfdGltZXJfcnVubmluZyApIHsKLQkJCVNETF9UaHJlYWRlZFRpbWVyQ2hlY2soKTsKLQkJfQotCQlTRExfRGVsYXkoMSk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgZXZlbnQgdGhyZWFkIGlzIG5vdCBydW5uaW5nICovCi1pbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKLXsKLQl0aW1lcl9hbGl2ZSA9IDE7Ci0JdGltZXIgPSBTRExfQ3JlYXRlVGhyZWFkKFJ1blRpbWVyLCBOVUxMKTsKLQlpZiAoIHRpbWVyID09IE5VTEwgKQotCQlyZXR1cm4oLTEpOwotCXJldHVybihTRExfU2V0VGltZXJUaHJlYWRlZCgxKSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCkKLXsKLQl0aW1lcl9hbGl2ZSA9IDA7Ci0JaWYgKCB0aW1lciApIHsKLQkJU0RMX1dhaXRUaHJlYWQodGltZXIsIE5VTEwpOwotCQl0aW1lciA9IE5VTEw7Ci0JfQotfQotCi1pbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCi17Ci0JU0RMX1NldEVycm9yKCJJbnRlcm5hbCBsb2dpYyBlcnJvcjogUklTQyBPUyB1c2VzIHRocmVhZGVkIHRpbWVyIik7Ci0JcmV0dXJuKC0xKTsKLX0KLQotdm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQotewotCXJldHVybjsKLX0KLQotI2VuZGlmIC8qIFNETF9USFJFQURTX0RJU0FCTEVEICovCi0KLSNlbmRpZiAvKiBTRExfVElNRVJfUklTQ09TICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL3VuaXgvU0RMX3N5c3RpbWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL3VuaXgvU0RMX3N5c3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjUzZWQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci91bml4L1NETF9zeXN0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX1RJTUVSX1VOSVgKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3RpbWVyX2MuaCIKLQotLyogVGhlIGNsb2NrX2dldHRpbWUgcHJvdmlkZXMgbW9ub3Rvbm91cyB0aW1lLCBzbyB3ZSBzaG91bGQgdXNlIGl0IGlmCi0gICBpdCdzIGF2YWlsYWJsZS4gVGhlIGNsb2NrX2dldHRpbWUgZnVuY3Rpb24gaXMgYmVoaW5kIGlmZGVmCi0gICBmb3IgX19VU0VfUE9TSVgxOTkzMDkKLSAgIFRvbW1pIEt5bnRvbGEgKHRvbW1pLmt5bnRvbGFAcmF5LmZpKSAyNy8wOS8yMDA1Ci0qLwotI2lmIEhBVkVfTkFOT1NMRUVQIHx8IEhBVkVfQ0xPQ0tfR0VUVElNRQotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotCi0jaWYgU0RMX1RIUkVBRF9QVEgKLSNpbmNsdWRlIDxwdGguaD4KLSNlbmRpZgotCi0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLSNkZWZpbmUgVVNFX0lUSU1FUgotI2VuZGlmCi0KLS8qIFRoZSBmaXJzdCB0aWNrcyB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24gKi8KLSNpZmRlZiBIQVZFX0NMT0NLX0dFVFRJTUUKLXN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgc3RhcnQ7Ci0jZWxzZQotc3RhdGljIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OwotI2VuZGlmIC8qIEhBVkVfQ0xPQ0tfR0VUVElNRSAqLwotCi0KLXZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKLXsKLQkvKiBTZXQgZmlyc3QgdGlja3MgdmFsdWUgKi8KLSNpZiBIQVZFX0NMT0NLX0dFVFRJTUUKLQljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywmc3RhcnQpOwotI2Vsc2UKLQlnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKLSNlbmRpZgotfQotCi1VaW50MzIgU0RMX0dldFRpY2tzICh2b2lkKQotewotI2lmIEhBVkVfQ0xPQ0tfR0VUVElNRQotCVVpbnQzMiB0aWNrczsKLQlzdHJ1Y3QgdGltZXNwZWMgbm93OwotCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCZub3cpOwotCXRpY2tzPShub3cudHZfc2VjLXN0YXJ0LnR2X3NlYykqMTAwMCsobm93LnR2X25zZWMtc3RhcnQudHZfbnNlYykvMTAwMDAwMDsKLQlyZXR1cm4odGlja3MpOwotI2Vsc2UKLQlVaW50MzIgdGlja3M7Ci0Jc3RydWN0IHRpbWV2YWwgbm93OwotCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKLQl0aWNrcz0obm93LnR2X3NlYy1zdGFydC50dl9zZWMpKjEwMDArKG5vdy50dl91c2VjLXN0YXJ0LnR2X3VzZWMpLzEwMDA7Ci0JcmV0dXJuKHRpY2tzKTsKLSNlbmRpZgotfQotCi12b2lkIFNETF9EZWxheSAoVWludDMyIG1zKQotewotI2lmIFNETF9USFJFQURfUFRICi0JcHRoX3RpbWVfdCB0djsKLQl0di50dl9zZWMgID0gIG1zLzEwMDA7Ci0JdHYudHZfdXNlYyA9IChtcyUxMDAwKSoxMDAwOwotCXB0aF9uYXAodHYpOwotI2Vsc2UKLQlpbnQgd2FzX2Vycm9yOwotCi0jaWYgSEFWRV9OQU5PU0xFRVAKLQlzdHJ1Y3QgdGltZXNwZWMgZWxhcHNlZCwgdHY7Ci0jZWxzZQotCXN0cnVjdCB0aW1ldmFsIHR2OwotCVVpbnQzMiB0aGVuLCBub3csIGVsYXBzZWQ7Ci0jZW5kaWYKLQotCS8qIFNldCB0aGUgdGltZW91dCBpbnRlcnZhbCAqLwotI2lmIEhBVkVfTkFOT1NMRUVQCi0JZWxhcHNlZC50dl9zZWMgPSBtcy8xMDAwOwotCWVsYXBzZWQudHZfbnNlYyA9IChtcyUxMDAwKSoxMDAwMDAwOwotI2Vsc2UKLQl0aGVuID0gU0RMX0dldFRpY2tzKCk7Ci0jZW5kaWYKLQlkbyB7Ci0JCWVycm5vID0gMDsKLQotI2lmIEhBVkVfTkFOT1NMRUVQCi0JCXR2LnR2X3NlYyA9IGVsYXBzZWQudHZfc2VjOwotCQl0di50dl9uc2VjID0gZWxhcHNlZC50dl9uc2VjOwotCQl3YXNfZXJyb3IgPSBuYW5vc2xlZXAoJnR2LCAmZWxhcHNlZCk7Ci0jZWxzZQotCQkvKiBDYWxjdWxhdGUgdGhlIHRpbWUgaW50ZXJ2YWwgbGVmdCAoaW4gY2FzZSBvZiBpbnRlcnJ1cHQpICovCi0JCW5vdyA9IFNETF9HZXRUaWNrcygpOwotCQllbGFwc2VkID0gKG5vdy10aGVuKTsKLQkJdGhlbiA9IG5vdzsKLQkJaWYgKCBlbGFwc2VkID49IG1zICkgewotCQkJYnJlYWs7Ci0JCX0KLQkJbXMgLT0gZWxhcHNlZDsKLQkJdHYudHZfc2VjID0gbXMvMTAwMDsKLQkJdHYudHZfdXNlYyA9IChtcyUxMDAwKSoxMDAwOwotCi0JCXdhc19lcnJvciA9IHNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOwotI2VuZGlmIC8qIEhBVkVfTkFOT1NMRUVQICovCi0JfSB3aGlsZSAoIHdhc19lcnJvciAmJiAoZXJybm8gPT0gRUlOVFIpICk7Ci0jZW5kaWYgLyogU0RMX1RIUkVBRF9QVEggKi8KLX0KLQotI2lmZGVmIFVTRV9JVElNRVIKLQotc3RhdGljIHZvaWQgSGFuZGxlQWxhcm0oaW50IHNpZykKLXsKLQlVaW50MzIgbXM7Ci0KLQlpZiAoIFNETF9hbGFybV9jYWxsYmFjayApIHsKLQkJbXMgPSAoKlNETF9hbGFybV9jYWxsYmFjaykoU0RMX2FsYXJtX2ludGVydmFsKTsKLQkJaWYgKCBtcyAhPSBTRExfYWxhcm1faW50ZXJ2YWwgKSB7Ci0JCQlTRExfU2V0VGltZXIobXMsIFNETF9hbGFybV9jYWxsYmFjayk7Ci0JCX0KLQl9Ci19Ci0KLWludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQotewotCXN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOwotCi0JLyogU2V0IHRoZSBhbGFybSBoYW5kbGVyIChMaW51eCBzcGVjaWZpYykgKi8KLQlTRExfbWVtc2V0KCZhY3Rpb24sIDAsIHNpemVvZihhY3Rpb24pKTsKLQlhY3Rpb24uc2FfaGFuZGxlciA9IEhhbmRsZUFsYXJtOwotCWFjdGlvbi5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7Ci0Jc2lnZW1wdHlzZXQoJmFjdGlvbi5zYV9tYXNrKTsKLQlzaWdhY3Rpb24oU0lHQUxSTSwgJmFjdGlvbiwgTlVMTCk7Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIFNETF9TWVNfVGltZXJRdWl0KHZvaWQpCi17Ci0JU0RMX1NldFRpbWVyKDAsIE5VTEwpOwotfQotCi1pbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCi17Ci0Jc3RydWN0IGl0aW1lcnZhbCB0aW1lcjsKLQotCXRpbWVyLml0X3ZhbHVlLnR2X3NlYyA9IChTRExfYWxhcm1faW50ZXJ2YWwvMTAwMCk7Ci0JdGltZXIuaXRfdmFsdWUudHZfdXNlYyA9IChTRExfYWxhcm1faW50ZXJ2YWwlMTAwMCkqMTAwMDsKLQl0aW1lci5pdF9pbnRlcnZhbC50dl9zZWMgPSAoU0RMX2FsYXJtX2ludGVydmFsLzEwMDApOwotCXRpbWVyLml0X2ludGVydmFsLnR2X3VzZWMgPSAoU0RMX2FsYXJtX2ludGVydmFsJTEwMDApKjEwMDA7Ci0Jc2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmdGltZXIsIE5VTEwpOwotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQotewotCXN0cnVjdCBpdGltZXJ2YWwgdGltZXI7Ci0KLQlTRExfbWVtc2V0KCZ0aW1lciwgMCwgKHNpemVvZiB0aW1lcikpOwotCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnRpbWVyLCBOVUxMKTsKLX0KLQotI2Vsc2UgLyogVVNFX0lUSU1FUiAqLwotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotCi0vKiBEYXRhIHRvIGhhbmRsZSBhIHNpbmdsZSBwZXJpb2RpYyBhbGFybSAqLwotc3RhdGljIGludCB0aW1lcl9hbGl2ZSA9IDA7Ci1zdGF0aWMgU0RMX1RocmVhZCAqdGltZXIgPSBOVUxMOwotCi1zdGF0aWMgaW50IFJ1blRpbWVyKHZvaWQgKnVudXNlZCkKLXsKLQl3aGlsZSAoIHRpbWVyX2FsaXZlICkgewotCQlpZiAoIFNETF90aW1lcl9ydW5uaW5nICkgewotCQkJU0RMX1RocmVhZGVkVGltZXJDaGVjaygpOwotCQl9Ci0JCVNETF9EZWxheSgxKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi0vKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBldmVudCB0aHJlYWQgaXMgbm90IHJ1bm5pbmcgKi8KLWludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQotewotCXRpbWVyX2FsaXZlID0gMTsKLQl0aW1lciA9IFNETF9DcmVhdGVUaHJlYWQoUnVuVGltZXIsIE5VTEwpOwotCWlmICggdGltZXIgPT0gTlVMTCApCi0JCXJldHVybigtMSk7Ci0JcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKLX0KLQotdm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQotewotCXRpbWVyX2FsaXZlID0gMDsKLQlpZiAoIHRpbWVyICkgewotCQlTRExfV2FpdFRocmVhZCh0aW1lciwgTlVMTCk7Ci0JCXRpbWVyID0gTlVMTDsKLQl9Ci19Ci0KLWludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKLXsKLQlTRExfU2V0RXJyb3IoIkludGVybmFsIGxvZ2ljIGVycm9yOiBMaW51eCB1c2VzIHRocmVhZGVkIHRpbWVyIik7Ci0JcmV0dXJuKC0xKTsKLX0KLQotdm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQotewotCXJldHVybjsKLX0KLQotI2VuZGlmIC8qIFVTRV9JVElNRVIgKi8KLQotI2VuZGlmIC8qIFNETF9USU1FUl9VTklYICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL3dpbjMyL1NETF9zeXN0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci93aW4zMi9TRExfc3lzdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyNGQxMy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL3dpbjMyL1NETF9zeXN0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX1RJTUVSX1dJTjMyCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3RpbWVyX2MuaCIKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLSAgI2Vycm9yIFRoaXMgaXMgV2luQ0UuIFBsZWFzZSB1c2Ugc3JjL3RpbWVyL3dpbmNlL1NETF9zeXN0aW1lci5jIGluc3RlYWQuCi0jZW5kaWYKLQotI2RlZmluZSBUSU1FX1dSQVBfVkFMVUUJKH4oRFdPUkQpMCkKLQotLyogVGhlIGZpcnN0IChsb3ctcmVzb2x1dGlvbikgdGlja3MgdmFsdWUgb2YgdGhlIGFwcGxpY2F0aW9uICovCi1zdGF0aWMgRFdPUkQgc3RhcnQ7Ci0KLSNpZm5kZWYgVVNFX0dFVFRJQ0tDT1VOVAotLyogU3RvcmUgaWYgYSBoaWdoLXJlc29sdXRpb24gcGVyZm9ybWFuY2UgY291bnRlciBleGlzdHMgb24gdGhlIHN5c3RlbSAqLwotc3RhdGljIEJPT0wgaGlyZXNfdGltZXJfYXZhaWxhYmxlOwotLyogVGhlIGZpcnN0IGhpZ2gtcmVzb2x1dGlvbiB0aWNrcyB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24gKi8KLXN0YXRpYyBMQVJHRV9JTlRFR0VSIGhpcmVzX3N0YXJ0X3RpY2tzOwotLyogVGhlIG51bWJlciBvZiB0aWNrcyBwZXIgc2Vjb25kIG9mIHRoZSBoaWdoLXJlc29sdXRpb24gcGVyZm9ybWFuY2UgY291bnRlciAqLwotc3RhdGljIExBUkdFX0lOVEVHRVIgaGlyZXNfdGlja3NfcGVyX3NlY29uZDsKLSNlbmRpZgotCi12b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCi17Ci0JLyogU2V0IGZpcnN0IHRpY2tzIHZhbHVlICovCi0jaWZkZWYgVVNFX0dFVFRJQ0tDT1VOVAotCXN0YXJ0ID0gR2V0VGlja0NvdW50KCk7Ci0jZWxzZQotI2lmIDAgLyogQXBwYXJlbnRseSB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCBRUEMgb24gV2luMksgKi8KLQlpZiAoUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmaGlyZXNfdGlja3NfcGVyX3NlY29uZCkgPT0gVFJVRSkKLQl7Ci0JCWhpcmVzX3RpbWVyX2F2YWlsYWJsZSA9IFRSVUU7Ci0JCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZoaXJlc19zdGFydF90aWNrcyk7Ci0JfQotCWVsc2UKLSNlbmRpZgotCXsKLQkJaGlyZXNfdGltZXJfYXZhaWxhYmxlID0gRkFMU0U7Ci0JCXRpbWVCZWdpblBlcmlvZCgxKTsJCS8qIHVzZSAxIG1zIHRpbWVyIHByZWNpc2lvbiAqLwotCQlzdGFydCA9IHRpbWVHZXRUaW1lKCk7Ci0JfQotI2VuZGlmCi19Ci0KLVVpbnQzMiBTRExfR2V0VGlja3Modm9pZCkKLXsKLQlEV09SRCBub3csIHRpY2tzOwotI2lmbmRlZiBVU0VfR0VUVElDS0NPVU5UCi0JTEFSR0VfSU5URUdFUiBoaXJlc19ub3c7Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9HRVRUSUNLQ09VTlQKLQlub3cgPSBHZXRUaWNrQ291bnQoKTsKLSNlbHNlCi0JaWYgKGhpcmVzX3RpbWVyX2F2YWlsYWJsZSkKLQl7Ci0JCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZoaXJlc19ub3cpOwotCi0JCWhpcmVzX25vdy5RdWFkUGFydCAtPSBoaXJlc19zdGFydF90aWNrcy5RdWFkUGFydDsKLQkJaGlyZXNfbm93LlF1YWRQYXJ0ICo9IDEwMDA7Ci0JCWhpcmVzX25vdy5RdWFkUGFydCAvPSBoaXJlc190aWNrc19wZXJfc2Vjb25kLlF1YWRQYXJ0OwotCi0JCXJldHVybiAoRFdPUkQpaGlyZXNfbm93LlF1YWRQYXJ0OwotCX0KLQllbHNlCi0JewotCQlub3cgPSB0aW1lR2V0VGltZSgpOwotCX0KLSNlbmRpZgotCi0JaWYgKCBub3cgPCBzdGFydCApIHsKLQkJdGlja3MgPSAoVElNRV9XUkFQX1ZBTFVFLXN0YXJ0KSArIG5vdzsKLQl9IGVsc2UgewotCQl0aWNrcyA9IChub3cgLSBzdGFydCk7Ci0JfQotCXJldHVybih0aWNrcyk7Ci19Ci0KLXZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKLXsKLQlTbGVlcChtcyk7Ci19Ci0KLS8qIERhdGEgdG8gaGFuZGxlIGEgc2luZ2xlIHBlcmlvZGljIGFsYXJtICovCi1zdGF0aWMgVUlOVCB0aW1lcklEID0gMDsKLQotc3RhdGljIHZvaWQgQ0FMTEJBQ0sgSGFuZGxlQWxhcm0oVUlOVCB1SUQsICBVSU5UIHVNc2csIERXT1JEX1BUUiBkd1VzZXIsCi0JCQkJCQlEV09SRF9QVFIgZHcxLCBEV09SRF9QVFIgZHcyKQotewotCVNETF9UaHJlYWRlZFRpbWVyQ2hlY2soKTsKLX0KLQotCi1pbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKLXsKLQlNTVJFU1VMVCByZXN1bHQ7Ci0KLQkvKiBTZXQgdGltZXIgcmVzb2x1dGlvbiAqLwotCXJlc3VsdCA9IHRpbWVCZWdpblBlcmlvZChUSU1FUl9SRVNPTFVUSU9OKTsKLQlpZiAoIHJlc3VsdCAhPSBUSU1FUlJfTk9FUlJPUiApIHsKLQkJU0RMX1NldEVycm9yKCJXYXJuaW5nOiBDYW4ndCBzZXQgJWQgbXMgdGltZXIgcmVzb2x1dGlvbiIsCi0JCQkJCQkJVElNRVJfUkVTT0xVVElPTik7Ci0JfQotCS8qIEFsbG93IDEwIG1zIG9mIGRyaWZ0IHNvIHdlIGRvbid0IGNoZXcgb24gQ1BVICovCi0JdGltZXJJRCA9IHRpbWVTZXRFdmVudChUSU1FUl9SRVNPTFVUSU9OLDEsSGFuZGxlQWxhcm0sMCxUSU1FX1BFUklPRElDKTsKLQlpZiAoICEgdGltZXJJRCApIHsKLQkJU0RMX1NldEVycm9yKCJ0aW1lU2V0RXZlbnQoKSBmYWlsZWQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKLX0KLQotdm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQotewotCWlmICggdGltZXJJRCApIHsKLQkJdGltZUtpbGxFdmVudCh0aW1lcklEKTsKLQl9Ci0JdGltZUVuZFBlcmlvZChUSU1FUl9SRVNPTFVUSU9OKTsKLX0KLQotaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKQotewotCVNETF9TZXRFcnJvcigiSW50ZXJuYWwgbG9naWMgZXJyb3I6IFdpbjMyIHVzZXMgdGhyZWFkZWQgdGltZXIiKTsKLQlyZXR1cm4oLTEpOwotfQotCi12b2lkIFNETF9TWVNfU3RvcFRpbWVyKHZvaWQpCi17Ci0JcmV0dXJuOwotfQotCi0jZW5kaWYgLyogU0RMX1RJTUVSX1dJTjMyICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL3dpbmNlL1NETF9zeXN0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy90aW1lci93aW5jZS9TRExfc3lzdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxMjlkYi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RpbWVyL3dpbmNlL1NETF9zeXN0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZkZWYgU0RMX1RJTUVSX1dJTkNFCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCi0KLXN0YXRpYyBVaW50NjQgc3RhcnRfZGF0ZTsKLXN0YXRpYyBVaW50NjQgc3RhcnRfdGlja3M7Ci0KLXN0YXRpYyBVaW50NjQgd2NlX3RpY2tzKHZvaWQpCi17Ci0gIHJldHVybigoVWludDY0KUdldFRpY2tDb3VudCgpKTsKLX0KLQotc3RhdGljIFVpbnQ2NCB3Y2VfZGF0ZSh2b2lkKQotewotICB1bmlvbgotICB7Ci0JRklMRVRJTUUgZnRpbWU7Ci0JVWludDY0IGl0aW1lOwotICB9IGZ0aW1lOwotICBTWVNURU1USU1FIHN0aW1lOwotCi0gIEdldFN5c3RlbVRpbWUoJnN0aW1lKTsKLSAgU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN0aW1lLCZmdGltZS5mdGltZSk7Ci0gIGZ0aW1lLml0aW1lLz0xMDAwMDsgLy8gQ29udmVydCAxMDBucyBpbnRlcnZhbHMgdG8gMW1zIGludGVydmFscwotICAvLyBSZW1vdmUgbXMgcG9ydGlvbiwgd2hpY2ggY2FuJ3QgYmUgcmVsaWVkIG9uCi0gIGZ0aW1lLml0aW1lIC09IChmdGltZS5pdGltZSAlIDEwMDApOwotICByZXR1cm4oZnRpbWUuaXRpbWUpOwotfQotCi1zdGF0aWMgU2ludDMyIHdjZV9yZWxfdGlja3Modm9pZCkKLXsKLSAgcmV0dXJuKChTaW50MzIpKHdjZV90aWNrcygpLXN0YXJ0X3RpY2tzKSk7Ci19Ci0KLXN0YXRpYyBTaW50MzIgd2NlX3JlbF9kYXRlKHZvaWQpCi17Ci0gIHJldHVybigoU2ludDMyKSh3Y2VfZGF0ZSgpLXN0YXJ0X2RhdGUpKTsKLX0KLQotLyogUmV0dXJuIHRpbWUgaW4gbXMgcmVsYXRpdmUgdG8gd2hlbiBTREwgd2FzIHN0YXJ0ZWQgKi8KLVVpbnQzMiBTRExfR2V0VGlja3MoKQotewotICBTaW50MzIgb2Zmc2V0PXdjZV9yZWxfZGF0ZSgpLXdjZV9yZWxfdGlja3MoKTsKLSAgaWYoKG9mZnNldCA8IC0xMDAwKSB8fCAob2Zmc2V0ID4gMTAwMCkpCi0gIHsKLS8vICAgIGZwcmludGYoc3RkZXJyLCJUaW1lIGRlc3luYyglK2QpLCByZXN5bmNpbmdcbiIsb2Zmc2V0LzEwMDApOwotCXN0YXJ0X3RpY2tzLT1vZmZzZXQ7Ci0gIH0KLQotICByZXR1cm4oKFVpbnQzMil3Y2VfcmVsX3RpY2tzKCkpOwotfQotCi0vKiBHaXZlIHVwIGFwcHJveC4gZ2l2ZW0gbWlsbGlzZWNvbmRzIHRvIHRoZSBPUy4gKi8KLXZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKLXsKLSAgU2xlZXAobXMpOwotfQotCi0vKiBSZWNhcmQgc3RhcnQtdGltZSBvZiBhcHBsaWNhdGlvbiBmb3IgcmVmZXJlbmNlICovCi12b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCi17Ci0gIHN0YXJ0X2RhdGU9d2NlX2RhdGUoKTsKLSAgc3RhcnRfdGlja3M9d2NlX3RpY2tzKCk7Ci19Ci0KLXN0YXRpYyBVSU5UIFdJTl90aW1lcjsKLQotI2lmICggX1dJTjMyX1dDRSA8PSA0MjAgKQotCi1zdGF0aWMgSEFORExFIHRpbWVyc1RocmVhZCA9IDA7Ci1zdGF0aWMgSEFORExFIHRpbWVyc1F1aXRFdmVudCA9IDA7Ci0KLURXT1JEIFRpbWVyc1RocmVhZFByb2Modm9pZCAqZGF0YSkKLXsKLQl3aGlsZShXYWl0Rm9yU2luZ2xlT2JqZWN0KHRpbWVyc1F1aXRFdmVudCwgMTApID09IFdBSVRfVElNRU9VVCkKLQl7Ci0JCVNETF9UaHJlYWRlZFRpbWVyQ2hlY2soKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQotewotCS8vIGNyZWF0ZSBhIHRocmVhZCB0byBwcm9jZXNzIGEgdGhyZWFkZWQgdGltZXJzCi0JLy8gU2V0VGltZXIgZG9lcyBub3Qgc3VpdCB0aGUgbmVlZHMgYmVjYXVzZSAKLQkvLyBUaW1lckNhbGxiYWNrUHJvYyB3aWxsIGJlIGNhbGxlZCBvbmx5IHdoZW4gV01fVElNRVIgb2NjdXJlZAotCi0JdGltZXJzUXVpdEV2ZW50ID0gQ3JlYXRlRXZlbnQoMCwgVFJVRSwgRkFMU0UsIDApOwotCWlmKCAhdGltZXJzUXVpdEV2ZW50ICkKLQl7Ci0JCVNETF9TZXRFcnJvcigiQ2Fubm90IGNyZWF0ZSBldmVudCBmb3IgdGltZXJzIHRocmVhZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXRpbWVyc1RocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCBUaW1lcnNUaHJlYWRQcm9jLCAwLCAwLCAwKTsKLQlpZiggIXRpbWVyc1RocmVhZCApCi0JewotCQlTRExfU2V0RXJyb3IoIkNhbm5vdCBjcmVhdGUgdGltZXJzIHRocmVhZCwgY2hlY2sgYW1vdW50IG9mIFJBTSBhdmFpbGFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlTZXRUaHJlYWRQcmlvcml0eSh0aW1lcnNUaHJlYWQsIFRIUkVBRF9QUklPUklUWV9ISUdIRVNUKTsKLQotCXJldHVybihTRExfU2V0VGltZXJUaHJlYWRlZCgxKSk7Ci19Ci0KLXZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCkKLXsKLQlTZXRFdmVudCh0aW1lcnNRdWl0RXZlbnQpOwotCWlmKCBXYWl0Rm9yU2luZ2xlT2JqZWN0KHRpbWVyc1RocmVhZCwgMjAwMCkgPT0gV0FJVF9USU1FT1VUICkKLQkJVGVybWluYXRlVGhyZWFkKHRpbWVyc1RocmVhZCwgMCk7Ci0JQ2xvc2VIYW5kbGUodGltZXJzVGhyZWFkKTsKLQlDbG9zZUhhbmRsZSh0aW1lcnNRdWl0RXZlbnQpOwotCXJldHVybjsKLX0KLQotI2Vsc2UKLQotI3ByYWdtYSBjb21tZW50KGxpYiwgIm1tdGltZXIubGliIikKLQotLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KLXN0YXRpYyBVSU5UIHRpbWVySUQgPSAwOwotCi1zdGF0aWMgdm9pZCBDQUxMQkFDSyBIYW5kbGVBbGFybShVSU5UIHVJRCwgIFVJTlQgdU1zZywgRFdPUkQgZHdVc2VyLAotCQkJCQkJRFdPUkQgZHcxLCBEV09SRCBkdzIpCi17Ci0JU0RMX1RocmVhZGVkVGltZXJDaGVjaygpOwotfQotCi0KLWludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQotewotCU1NUkVTVUxUIHJlc3VsdDsKLQotCS8qIFNldCB0aW1lciByZXNvbHV0aW9uICovCi0JcmVzdWx0ID0gdGltZUJlZ2luUGVyaW9kKFRJTUVSX1JFU09MVVRJT04pOwotCWlmICggcmVzdWx0ICE9IFRJTUVSUl9OT0VSUk9SICkgewotCQlTRExfU2V0RXJyb3IoIldhcm5pbmc6IENhbid0IHNldCAlZCBtcyB0aW1lciByZXNvbHV0aW9uIiwKLQkJCQkJCQlUSU1FUl9SRVNPTFVUSU9OKTsKLQl9Ci0JLyogQWxsb3cgMTAgbXMgb2YgZHJpZnQgc28gd2UgZG9uJ3QgY2hldyBvbiBDUFUgKi8KLQl0aW1lcklEID0gdGltZVNldEV2ZW50KFRJTUVSX1JFU09MVVRJT04sMSxIYW5kbGVBbGFybSwwLFRJTUVfUEVSSU9ESUMpOwotCWlmICggISB0aW1lcklEICkgewotCQlTRExfU2V0RXJyb3IoInRpbWVTZXRFdmVudCgpIGZhaWxlZCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oU0RMX1NldFRpbWVyVGhyZWFkZWQoMSkpOwotfQotCi12b2lkIFNETF9TWVNfVGltZXJRdWl0KHZvaWQpCi17Ci0JaWYgKCB0aW1lcklEICkgewotCQl0aW1lS2lsbEV2ZW50KHRpbWVySUQpOwotCX0KLQl0aW1lRW5kUGVyaW9kKFRJTUVSX1JFU09MVVRJT04pOwotfQotCi0jZW5kaWYKLQotaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKQotewotCVNETF9TZXRFcnJvcigiSW50ZXJuYWwgbG9naWMgZXJyb3I6IFdpbkNFIHVzZXMgdGhyZWFkZWQgdGltZXIiKTsKLQlyZXR1cm4oLTEpOwotfQotCi12b2lkIFNETF9TWVNfU3RvcFRpbWVyKHZvaWQpCi17Ci0JcmV0dXJuOwotfQotCi0jZW5kaWYgLyogU0RMX1RJTUVSX1dJTkNFICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9STEVhY2NlbC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfUkxFYWNjZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzMzM1Mi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9STEVhY2NlbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAqIFJMRSBlbmNvZGluZyBmb3Igc29mdHdhcmUgY29sb3JrZXkgYW5kIGFscGhhLWNoYW5uZWwgYWNjZWxlcmF0aW9uCi0gKgotICogT3JpZ2luYWwgdmVyc2lvbiBieSBTYW0gTGFudGluZ2EKLSAqCi0gKiBNYXR0aWFzIEVuZ2RlZ+VyZCAoWW9yaWNrKTogUmV3cml0ZS4gTmV3IGVuY29kaW5nIGZvcm1hdCwgZW5jb2RlciBhbmQKLSAqIGRlY29kZXIuIEFkZGVkIHBlci1zdXJmYWNlIGFscGhhIGJsaXR0ZXIuIEFkZGVkIHBlci1waXhlbCBhbHBoYQotICogZm9ybWF0LCBlbmNvZGVyIGFuZCBibGl0dGVyLgotICoKLSAqIE1hbnkgdGhhbmtzIHRvIFhhcmsgYW5kIGpvaG5zIGZvciBoaW50cywgYmVuY2htYXJrcyBhbmQgdXNlZnVsIGNvbW1lbnRzCi0gKiBsZWFkaW5nIHRvIHRoaXMgY29kZS4KLSAqCi0gKiBXZWxjb21lIHRvIE1hY3JvIE1heWhlbS4KLSAqLwotCi0vKgotICogVGhlIGVuY29kaW5nIHRyYW5zbGF0ZXMgdGhlIGltYWdlIGRhdGEgdG8gYSBzdHJlYW0gb2Ygc2VnbWVudHMgb2YgdGhlIGZvcm0KLSAqCi0gKiA8c2tpcD4gPHJ1bj4gPGRhdGE+Ci0gKgotICogd2hlcmUgPHNraXA+IGlzIHRoZSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgcGl4ZWxzIHRvIHNraXAsCi0gKiAgICAgICA8cnVuPiAgaXMgdGhlIG51bWJlciBvZiBvcGFxdWUgcGl4ZWxzIHRvIGJsaXQsCi0gKiBhbmQgICA8ZGF0YT4gYXJlIHRoZSBwaXhlbHMgdGhlbXNlbHZlcy4KLSAqCi0gKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyB1c2VkIGJvdGggZm9yIGNvbG9ya2V5ZWQgc3VyZmFjZXMsIHVzZWQgZm9yIHNpbXBsZQotICogYmluYXJ5IHRyYW5zcGFyZW5jeSBhbmQgZm9yIHBlci1zdXJmYWNlIGFscGhhIGJsZW5kaW5nLCBhbmQgZm9yIHN1cmZhY2VzCi0gKiB3aXRoIHBlci1waXhlbCBhbHBoYS4gVGhlIGRldGFpbHMgZGlmZmVyLCBob3dldmVyOgotICoKLSAqIEVuY29kaW5nIG9mIGNvbG9ya2V5ZWQgc3VyZmFjZXM6Ci0gKgotICogICBFbmNvZGVkIHBpeGVscyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHRhcmdldCBzdXJmYWNlLgotICogICA8c2tpcD4gYW5kIDxydW4+IGFyZSB1bnNpZ25lZCA4IGJpdCBpbnRlZ2VycywgZXhjZXB0IGZvciAzMiBiaXQgZGVwdGgKLSAqICAgd2hlcmUgdGhleSBhcmUgMTYgYml0LiBUaGlzIG1ha2VzIHRoZSBwaXhlbCBkYXRhIGFsaWduZWQgYXQgYWxsIHRpbWVzLgotICogICBTZWdtZW50cyBuZXZlciB3cmFwIGFyb3VuZCBmcm9tIG9uZSBzY2FuIGxpbmUgdG8gdGhlIG5leHQuCi0gKgotICogICBUaGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSBpcyBtYXJrZWQgYnkgYSB6ZXJvIDxza2lwPiw8cnVuPiBwYWlyIGF0IHRoZSAqCi0gKiAgIGJlZ2lubmluZyBvZiBhIGxpbmUuCi0gKgotICogRW5jb2Rpbmcgb2Ygc3VyZmFjZXMgd2l0aCBwZXItcGl4ZWwgYWxwaGE6Ci0gKgotICogICBUaGUgc2VxdWVuY2UgYmVnaW5zIHdpdGggYSBzdHJ1Y3QgUkxFRGVzdEZvcm1hdCBkZXNjcmliaW5nIHRoZSB0YXJnZXQKLSAqICAgcGl4ZWwgZm9ybWF0LCB0byBwcm92aWRlIHJlbGlhYmxlIHVuLWVuY29kaW5nLgotICoKLSAqICAgRWFjaCBzY2FuIGxpbmUgaXMgZW5jb2RlZCB0d2ljZTogRmlyc3QgYWxsIGNvbXBsZXRlbHkgb3BhcXVlIHBpeGVscywKLSAqICAgZW5jb2RlZCBpbiB0aGUgdGFyZ2V0IGZvcm1hdCBhcyBkZXNjcmliZWQgYWJvdmUsIGFuZCB0aGVuIGFsbAotICogICBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKHRyYW5zbHVjZW50KSBwaXhlbHMgKHdoZXJlIDEgPD0gYWxwaGEgPD0gMjU0KSwKLSAqICAgaW4gdGhlIGZvbGxvd2luZyAzMi1iaXQgZm9ybWF0OgotICoKLSAqICAgRm9yIDMyLWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQgYnV0IHdpdGgKLSAqICAgdGhlIGFscGhhIHZhbHVlIG9jY3VweWluZyB0aGUgaGlnaGVzdCA4IGJpdHMuIFRoZSA8c2tpcD4gYW5kIDxydW4+Ci0gKiAgIGNvdW50cyBhcmUgMTYgYml0LgotICogCi0gKiAgIEZvciAxNi1iaXQgdGFyZ2V0cywgZWFjaCBwaXhlbCBoYXMgdGhlIHRhcmdldCBSR0IgZm9ybWF0LCBidXQgd2l0aAotICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKLSAqICAgYW5kIHRoZSBob2xlIGZpbGxlZCB3aXRoIHRoZSA1IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgYWxwaGEgdmFsdWUuCi0gKiAgIGkuZS4gaWYgdGhlIHRhcmdldCBoYXMgdGhlIGZvcm1hdCAgICAgICAgIHJycnJyZ2dnZ2dnYmJiYmIsCi0gKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCi0gKiAgIFRoZSA8c2tpcD4gYW5kIDxydW4+IGNvdW50cyBhcmUgOCBiaXQgZm9yIHRoZSBvcGFxdWUgbGluZXMsIDE2IGJpdAotICogICBmb3IgdGhlIHRyYW5zbHVjZW50IGxpbmVzLiBUd28gcGFkZGluZyBieXRlcyBtYXkgYmUgaW5zZXJ0ZWQKLSAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCi0gKgotICogICBUaGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSBpcyBtYXJrZWQgYnkgYSB6ZXJvIDxza2lwPiw8cnVuPiBwYWlyIGF0IHRoZQotICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCi0gKi8KLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIlNETF9ibGl0LmgiCi0jaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKSAmJiBTRExfQVNTRU1CTFlfUk9VVElORVMKLSNkZWZpbmUgTU1YX0FTTUJMSVQKLSNlbmRpZgotCi0jaWZkZWYgTU1YX0FTTUJMSVQKLSNpbmNsdWRlICJtbXguaCIKLSNpbmNsdWRlICJTRExfY3B1aW5mby5oIgotI2VuZGlmCi0KLSNpZm5kZWYgTUFYCi0jZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0jaWZuZGVmIE1JTgotI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi0jZGVmaW5lIFBJWEVMX0NPUFkodG8sIGZyb20sIGxlbiwgYnBwKQkJCVwKLWRvIHsJCQkJCQkJXAotICAgIGlmKGJwcCA9PSA0KSB7CQkJCQlcCi0JU0RMX21lbWNweTQodG8sIGZyb20sIChzaXplX3QpKGxlbikpOwkJXAotICAgIH0gZWxzZSB7CQkJCQkJXAotCVNETF9tZW1jcHkodG8sIGZyb20sIChzaXplX3QpKGxlbikgKiAoYnBwKSk7CVwKLSAgICB9CQkJCQkJCVwKLX0gd2hpbGUoMCkKLQotLyoKLSAqIFZhcmlvdXMgY29sb3JrZXkgYmxpdCBtZXRob2RzLCBmb3Igb3BhcXVlIGFuZCBwZXItc3VyZmFjZSBhbHBoYQotICovCi0KLSNkZWZpbmUgT1BBUVVFX0JMSVQodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAotICAgIFBJWEVMX0NPUFkodG8sIGZyb20sIGxlbmd0aCwgYnBwKQotCi0jaWZkZWYgTU1YX0FTTUJMSVQKLQotI2RlZmluZSBBTFBIQV9CTElUMzJfODg4TU1YKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKLSAgICBkbyB7CQkJCQkJCVwKLQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopKGZyb20pOwkJCVwKLQlVaW50MzIgKmRzdHAgPSAoVWludDMyICopKHRvKTsJCQkJXAotICAgICAgICBpbnQgaSA9IDB4MDBGRjAwRkY7CQkJCQlcCi0gICAgICAgIG1vdmRfbTJyKCooJmkpLCBtbTMpOwkJCQkJXAotICAgICAgICBwdW5wY2tsZHFfcjJyKG1tMywgbW0zKTsJCQkJXAotICAgICAgICBpID0gMHhGRjAwMDAwMDsJCQkJCQlcCi0gICAgICAgIG1vdmRfbTJyKCooJmkpLCBtbTcpOwkJCQkJXAotICAgICAgICBwdW5wY2tsZHFfcjJyKG1tNywgbW03KTsJCQkJXAotICAgICAgICBpID0gYWxwaGEgfCBhbHBoYSA8PCAxNjsJCQkJXAotICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW00KTsJCQkJCVwKLSAgICAgICAgcHVucGNrbGRxX3IycihtbTQsIG1tNCk7CQkJCVwKLQlwY21wZXFkX3IycihtbTUsbW01KTsgLyogc2V0IG1tNSB0byAiMSIgKi8JCVwKLQlweG9yX3IycihtbTcsIG1tNSk7IC8qIG1ha2UgY2xlYXIgYWxwaGEgbWFzayAqLwkJXAotICAgICAgICBpID0gbGVuZ3RoOwkJCQkJCVwKLQlpZihpICYgMSkgewkJCQkJCVwKLSAgICAgICAgICBtb3ZkX20ycigoKnNyY3ApLCBtbTEpOyAvKiBzcmMgLT4gbW0xICovCQlcCi0gICAgICAgICAgcHVucGNrbGJ3X3IycihtbTEsIG1tMSk7CQkJCVwKLSAgICAgICAgICBwYW5kX3IycihtbTMsIG1tMSk7CQkJCQlcCi0JICBtb3ZkX20ycigoKmRzdHApLCBtbTIpOyAvKiBkc3QgLT4gbW0yICovCQlcCi0gICAgICAgICAgcHVucGNrbGJ3X3IycihtbTIsIG1tMik7CQkJCVwKLSAgICAgICAgICBwYW5kX3IycihtbTMsIG1tMik7CQkJCQlcCi0JICBwc3Vid19yMnIobW0yLCBtbTEpOwkJCQkJXAotCSAgcG11bGx3X3IycihtbTQsIG1tMSk7CQkJCQlcCi0JICBwc3Jsd19pMnIoOCwgbW0xKTsJCQkJCVwKLQkgIHBhZGR3X3IycihtbTEsIG1tMik7CQkJCQlcCi0JICBwYW5kX3IycihtbTMsIG1tMik7CQkJCQlcCi0JICBwYWNrdXN3Yl9yMnIobW0yLCBtbTIpOwkJCQlcCi0JICBwYW5kX3IycihtbTUsIG1tMik7IC8qIDAwMDAwUkdCIC0+IG1tMiAqLwkJXAotCSAgbW92ZF9yMm0obW0yLCAqZHN0cCk7CQkJCQlcCi0JICArK3NyY3A7CQkJCQkJXAotCSAgKytkc3RwOwkJCQkJCVwKLQkgIGktLTsJCQkJCQkJXAotCX0JCQkJCQkJXAotCWZvcig7IGkgPiAwOyAtLWkpIHsJCQkJCVwKLSAgICAgICAgICBtb3ZxX20ycigoKnNyY3ApLCBtbTApOwkJCQlcCi0JICBtb3ZxX3IycihtbTAsIG1tMSk7CQkJCQlcCi0gICAgICAgICAgcHVucGNrbGJ3X3IycihtbTAsIG1tMCk7CQkJCVwKLQkgIG1vdnFfbTJyKCgqZHN0cCksIG1tMik7CQkJCVwKLQkgIHB1bnBja2hid19yMnIobW0xLCBtbTEpOwkJCQlcCi0JICBtb3ZxX3IycihtbTIsIG1tNik7CQkJCQlcCi0gICAgICAgICAgcGFuZF9yMnIobW0zLCBtbTApOwkJCQkJXAotICAgICAgICAgIHB1bnBja2xid19yMnIobW0yLCBtbTIpOwkJCQlcCi0JICBwYW5kX3IycihtbTMsIG1tMSk7CQkJCQlcCi0JICBwdW5wY2toYndfcjJyKG1tNiwgbW02KTsJCQkJXAotICAgICAgICAgIHBhbmRfcjJyKG1tMywgbW0yKTsJCQkJCVwKLQkgIHBzdWJ3X3IycihtbTIsIG1tMCk7CQkJCQlcCi0JICBwbXVsbHdfcjJyKG1tNCwgbW0wKTsJCQkJCVwKLQkgIHBhbmRfcjJyKG1tMywgbW02KTsJCQkJCVwKLQkgIHBzdWJ3X3IycihtbTYsIG1tMSk7CQkJCQlcCi0JICBwbXVsbHdfcjJyKG1tNCwgbW0xKTsJCQkJCVwKLQkgIHBzcmx3X2kycig4LCBtbTApOwkJCQkJXAotCSAgcGFkZHdfcjJyKG1tMCwgbW0yKTsJCQkJCVwKLQkgIHBzcmx3X2kycig4LCBtbTEpOwkJCQkJXAotCSAgcGFkZHdfcjJyKG1tMSwgbW02KTsJCQkJCVwKLQkgIHBhbmRfcjJyKG1tMywgbW0yKTsJCQkJCVwKLQkgIHBhbmRfcjJyKG1tMywgbW02KTsJCQkJCVwKLQkgIHBhY2t1c3diX3IycihtbTIsIG1tMik7CQkJCVwKLQkgIHBhY2t1c3diX3IycihtbTYsIG1tNik7CQkJCVwKLQkgIHBzcmxxX2kycigzMiwgbW0yKTsJCQkJCVwKLQkgIHBzbGxxX2kycigzMiwgbW02KTsJCQkJCVwKLQkgIHBvcl9yMnIobW02LCBtbTIpOwkJCQkJXAotCSAgcGFuZF9yMnIobW01LCBtbTIpOyAvKiAwMDAwMFJHQiAtPiBtbTIgKi8JCVwKLSAgICAgICAgIG1vdnFfcjJtKG1tMiwgKmRzdHApOwkJCQkJXAotCSAgc3JjcCArPSAyOwkJCQkJCVwKLQkgIGRzdHAgKz0gMjsJCQkJCQlcCi0JICBpLS07CQkJCQkJCVwKLQl9CQkJCQkJCVwKLQllbW1zKCk7CQkJCQkJCVwKLSAgICB9IHdoaWxlKDApCi0KLSNkZWZpbmUgQUxQSEFfQkxJVDE2XzU2NU1NWCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCi0gICAgZG8gewkJCQkJCVwKLSAgICAgICAgaW50IGksIG4gPSAwOwkJCQkJXAotCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKikoZnJvbSk7CQlcCi0JVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKSh0byk7CQkJXAotICAgICAgICBVaW50MzIgQUxQSEEgPSAweEY4MDA7CQkJCVwKLQltb3ZkX20ycigqKCZBTFBIQSksIG1tMSk7CQkJXAotICAgICAgICBwdW5wY2tsd2RfcjJyKG1tMSwgbW0xKTsJCQlcCi0gICAgICAgIHB1bnBja2x3ZF9yMnIobW0xLCBtbTEpOwkJCVwKLQlBTFBIQSA9IDB4MDdFMDsJCQkJCVwKLQltb3ZkX20ycigqKCZBTFBIQSksIG1tNCk7CQkJXAotICAgICAgICBwdW5wY2tsd2RfcjJyKG1tNCwgbW00KTsJCQlcCi0gICAgICAgIHB1bnBja2x3ZF9yMnIobW00LCBtbTQpOwkJCVwKLQlBTFBIQSA9IDB4MDAxRjsJCQkJCVwKLQltb3ZkX20ycigqKCZBTFBIQSksIG1tNyk7CQkJXAotICAgICAgICBwdW5wY2tsd2RfcjJyKG1tNywgbW03KTsJCQlcCi0gICAgICAgIHB1bnBja2x3ZF9yMnIobW03LCBtbTcpOwkJCVwKLQlhbHBoYSAmPSB+KDErMis0KTsJCQkJXAotICAgICAgICBpID0gKFVpbnQzMilhbHBoYSB8IChVaW50MzIpYWxwaGEgPDwgMTY7CVwKLSAgICAgICAgbW92ZF9tMnIoKigmaSksIG1tMCk7CQkJCVwKLSAgICAgICAgcHVucGNrbGRxX3IycihtbTAsIG1tMCk7CQkJXAotICAgICAgICBBTFBIQSA9IGFscGhhID4+IDM7CQkJCVwKLSAgICAgICAgaSA9ICgoaW50KShsZW5ndGgpICYgMyk7CQkJXAotCWZvcig7IGkgPiAwOyAtLWkpIHsJCQkJXAotCSAgICBVaW50MzIgcyA9ICpzcmNwKys7CQkJCVwKLQkgICAgVWludDMyIGQgPSAqZHN0cDsJCQkJXAotCSAgICBzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7CQlcCi0JICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsJCVwKLQkgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsJCQlcCi0JICAgIGQgJj0gMHgwN2UwZjgxZjsJCQkJXAotCSAgICAqZHN0cCsrID0gZCB8IGQgPj4gMTY7CQkJXAotCSAgICBuKys7CQkJCQlcCi0JfQkJCQkJCVwKLQlpID0gKGludCkobGVuZ3RoKSAtIG47CQkJCVwKLQlmb3IoOyBpID4gMDsgLS1pKSB7CQkJCVwKLQkgIG1vdnFfbTJyKCgqZHN0cCksIG1tMyk7CQkJXAotCSAgbW92cV9tMnIoKCpzcmNwKSwgbW0yKTsJCQlcCi0JICBtb3ZxX3IycihtbTIsIG1tNSk7CQkJCVwKLQkgIHBhbmRfcjJyKG1tMSAsIG1tNSk7CQkJCVwKLQkgIHBzcmxxX2kycigxMSwgbW01KTsJCQkJXAotCSAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCi0JICBwYW5kX3IycihtbTEgLCBtbTYpOwkJCQlcCi0JICBwc3JscV9pMnIoMTEsIG1tNik7CQkJCVwKLQkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKLQkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCi0JICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAotCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAotCSAgcHNsbHFfaTJyKDExLCBtbTYpOwkJCQlcCi0JICBwYW5kX3IycihtbTEsIG1tNik7CQkJCVwKLQkgIG1vdnFfcjJyKG1tNCwgbW01KTsJCQkJXAotCSAgcG9yX3IycihtbTcsIG1tNSk7CQkJCVwKLQkgIHBhbmRfcjJyKG1tNSwgbW0zKTsJCQkJXAotCSAgcG9yX3IycihtbTYsIG1tMyk7CQkJCVwKLQkgIG1vdnFfcjJyKG1tMiwgbW01KTsJCQkJXAotCSAgcGFuZF9yMnIobW00ICwgbW01KTsJCQkJXAotCSAgcHNybHFfaTJyKDUsIG1tNSk7CQkJCVwKLQkgIG1vdnFfcjJyKG1tMywgbW02KTsJCQkJXAotCSAgcGFuZF9yMnIobW00ICwgbW02KTsJCQkJXAotCSAgcHNybHFfaTJyKDUsIG1tNik7CQkJCVwKLQkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKLQkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCi0JICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAotCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAotCSAgcHNsbHFfaTJyKDUsIG1tNik7CQkJCVwKLQkgIHBhbmRfcjJyKG1tNCwgbW02KTsJCQkJXAotCSAgbW92cV9yMnIobW0xLCBtbTUpOwkJCQlcCi0JICBwb3JfcjJyKG1tNywgbW01KTsJCQkJXAotCSAgcGFuZF9yMnIobW01LCBtbTMpOwkJCQlcCi0JICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAotCSAgbW92cV9yMnIobW0yLCBtbTUpOwkJCQlcCi0JICBwYW5kX3IycihtbTcgLCBtbTUpOwkJCQlcCi0gICAgICAgICAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCi0JICBwYW5kX3IycihtbTcgLCBtbTYpOwkJCQlcCi0JICBwc3Vid19yMnIobW02LCBtbTUpOwkJCQlcCi0JICBwbXVsbHdfcjJyKG1tMCwgbW01KTsJCQkJXAotCSAgcHNybHdfaTJyKDgsIG1tNSk7CQkJCVwKLQkgIHBhZGR3X3IycihtbTUsIG1tNik7CQkJCVwKLQkgIHBhbmRfcjJyKG1tNywgbW02KTsJCQkJXAotCSAgbW92cV9yMnIobW0xLCBtbTUpOwkJCQlcCi0JICBwb3JfcjJyKG1tNCwgbW01KTsJCQkJXAotCSAgcGFuZF9yMnIobW01LCBtbTMpOwkJCQlcCi0JICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAotCSAgbW92cV9yMm0obW0zLCAqZHN0cCk7CQkJCVwKLQkgIHNyY3AgKz0gNDsJCQkJCVwKLQkgIGRzdHAgKz0gNDsJCQkJCVwKLQkgIGkgLT0gMzsJCQkJCVwKLQl9CQkJCQkJXAotCWVtbXMoKTsJCQkJCQlcCi0gICAgfSB3aGlsZSgwKQotCi0jZGVmaW5lIEFMUEhBX0JMSVQxNl81NTVNTVgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAotICAgIGRvIHsJCQkJCQlcCi0gICAgICAgIGludCBpLCBuID0gMDsJCQkJCVwKLQlVaW50MTYgKnNyY3AgPSAoVWludDE2ICopKGZyb20pOwkJXAotCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKikodG8pOwkJCVwKLSAgICAgICAgVWludDMyIEFMUEhBID0gMHg3QzAwOwkJCQlcCi0JbW92ZF9tMnIoKigmQUxQSEEpLCBtbTEpOwkJCVwKLSAgICAgICAgcHVucGNrbHdkX3IycihtbTEsIG1tMSk7CQkJXAotICAgICAgICBwdW5wY2tsd2RfcjJyKG1tMSwgbW0xKTsJCQlcCi0JQUxQSEEgPSAweDAzRTA7CQkJCQlcCi0gICAgICAgIG1vdmRfbTJyKCooJkFMUEhBKSwgbW00KTsJCQlcCi0gICAgICAgIHB1bnBja2x3ZF9yMnIobW00LCBtbTQpOwkJCVwKLSAgICAgICAgcHVucGNrbHdkX3IycihtbTQsIG1tNCk7CQkJXAotCUFMUEhBID0gMHgwMDFGOwkJCQkJXAotCW1vdmRfbTJyKCooJkFMUEhBKSwgbW03KTsJCQlcCi0gICAgICAgIHB1bnBja2x3ZF9yMnIobW03LCBtbTcpOwkJCVwKLSAgICAgICAgcHVucGNrbHdkX3IycihtbTcsIG1tNyk7CQkJXAotCWFscGhhICY9IH4oMSsyKzQpOwkJCQlcCi0gICAgICAgIGkgPSAoVWludDMyKWFscGhhIHwgKFVpbnQzMilhbHBoYSA8PCAxNjsJXAotICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW0wKTsJCQkJXAotICAgICAgICBwdW5wY2tsZHFfcjJyKG1tMCwgbW0wKTsJCQlcCi0gICAgICAgIGkgPSAoKGludCkobGVuZ3RoKSAmIDMpOwkJCQlcCi0gICAgICAgIEFMUEhBID0gYWxwaGEgPj4gMzsJCQkJXAotCWZvcig7IGkgPiAwOyAtLWkpIHsJCQkJXAotCSAgICBVaW50MzIgcyA9ICpzcmNwKys7CQkJCVwKLQkgICAgVWludDMyIGQgPSAqZHN0cDsJCQkJXAotCSAgICBzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDNlMDdjMWY7CQlcCi0JICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsJCVwKLQkgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsJCQlcCi0JICAgIGQgJj0gMHgwM2UwN2MxZjsJCQkJXAotCSAgICAqZHN0cCsrID0gZCB8IGQgPj4gMTY7CQkJXAotCSAgICBuKys7CQkJCQlcCi0JfQkJCQkJCVwKLQlpID0gKGludCkobGVuZ3RoKSAtIG47CQkJCVwKLQlmb3IoOyBpID4gMDsgLS1pKSB7CQkJCVwKLQkgIG1vdnFfbTJyKCgqZHN0cCksIG1tMyk7CQkJXAotCSAgbW92cV9tMnIoKCpzcmNwKSwgbW0yKTsJCQlcCi0JICBtb3ZxX3IycihtbTIsIG1tNSk7CQkJCVwKLQkgIHBhbmRfcjJyKG1tMSAsIG1tNSk7CQkJCVwKLQkgIHBzcmxxX2kycigxMCwgbW01KTsJCQkJXAotCSAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCi0JICBwYW5kX3IycihtbTEgLCBtbTYpOwkJCQlcCi0JICBwc3JscV9pMnIoMTAsIG1tNik7CQkJCVwKLQkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKLQkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCi0JICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAotCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAotCSAgcHNsbHFfaTJyKDEwLCBtbTYpOwkJCQlcCi0JICBwYW5kX3IycihtbTEsIG1tNik7CQkJCVwKLQkgIG1vdnFfcjJyKG1tNCwgbW01KTsJCQkJXAotCSAgcG9yX3IycihtbTcsIG1tNSk7CQkJCVwKLQkgIHBhbmRfcjJyKG1tNSwgbW0zKTsJCQkJXAotCSAgcG9yX3IycihtbTYsIG1tMyk7CQkJCVwKLQkgIG1vdnFfcjJyKG1tMiwgbW01KTsJCQkJXAotCSAgcGFuZF9yMnIobW00ICwgbW01KTsJCQkJXAotCSAgcHNybHFfaTJyKDUsIG1tNSk7CQkJCVwKLQkgIG1vdnFfcjJyKG1tMywgbW02KTsJCQkJXAotCSAgcGFuZF9yMnIobW00ICwgbW02KTsJCQkJXAotCSAgcHNybHFfaTJyKDUsIG1tNik7CQkJCVwKLQkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKLQkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCi0JICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAotCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAotCSAgcHNsbHFfaTJyKDUsIG1tNik7CQkJCVwKLQkgIHBhbmRfcjJyKG1tNCwgbW02KTsJCQkJXAotCSAgbW92cV9yMnIobW0xLCBtbTUpOwkJCQlcCi0JICBwb3JfcjJyKG1tNywgbW01KTsJCQkJXAotCSAgcGFuZF9yMnIobW01LCBtbTMpOwkJCQlcCi0JICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAotCSAgbW92cV9yMnIobW0yLCBtbTUpOwkJCQlcCi0JICBwYW5kX3IycihtbTcgLCBtbTUpOwkJCQlcCi0gICAgICAgICAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCi0JICBwYW5kX3IycihtbTcgLCBtbTYpOwkJCQlcCi0JICBwc3Vid19yMnIobW02LCBtbTUpOwkJCQlcCi0JICBwbXVsbHdfcjJyKG1tMCwgbW01KTsJCQkJXAotCSAgcHNybHdfaTJyKDgsIG1tNSk7CQkJCVwKLQkgIHBhZGR3X3IycihtbTUsIG1tNik7CQkJCVwKLQkgIHBhbmRfcjJyKG1tNywgbW02KTsJCQkJXAotCSAgbW92cV9yMnIobW0xLCBtbTUpOwkJCQlcCi0JICBwb3JfcjJyKG1tNCwgbW01KTsJCQkJXAotCSAgcGFuZF9yMnIobW01LCBtbTMpOwkJCQlcCi0JICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAotCSAgbW92cV9yMm0obW0zLCAqZHN0cCk7CQkJCVwKLQkgIHNyY3AgKz0gNDsJCQkJCVwKLQkgIGRzdHAgKz0gNDsJCQkJCVwKLQkgIGkgLT0gMzsJCQkJCVwKLQl9CQkJCQkJXAotCWVtbXMoKTsJCQkJCQlcCi0gICAgfSB3aGlsZSgwKQotCi0jZW5kaWYKLQotLyoKLSAqIEZvciAzMmJwcCBwaXhlbHMgb24gdGhlIGZvcm0gMHgwMHJyZ2diYjoKLSAqIElmIHdlIHRyZWF0IHRoZSBtaWRkbGUgY29tcG9uZW50IHNlcGFyYXRlbHksIHdlIGNhbiBwcm9jZXNzIHRoZSB0d28KLSAqIHJlbWFpbmluZyBpbiBwYXJhbGxlbC4gVGhpcyBpcyBzYWZlIHRvIGRvIGJlY2F1c2Ugb2YgdGhlIGdhcCB0byB0aGUgbGVmdAotICogb2YgZWFjaCBjb21wb25lbnQsIHNvIHRoZSBiaXRzIGZyb20gdGhlIG11bHRpcGxpY2F0aW9uIGRvbid0IGNvbGxpZGUuCi0gKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbnkgUkdCIHBlcm11dGF0aW9uIG9mIGNvdXJzZS4KLSAqLwotI2RlZmluZSBBTFBIQV9CTElUMzJfODg4KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCQlcCi0gICAgZG8gewkJCQkJCQlcCi0gICAgICAgIGludCBpOwkJCQkJCQlcCi0JVWludDMyICpzcmMgPSAoVWludDMyICopKGZyb20pOwkJCQlcCi0JVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsJCQkJXAotCWZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgewkJCVwKLQkgICAgVWludDMyIHMgPSAqc3JjKys7CQkJCQlcCi0JICAgIFVpbnQzMiBkID0gKmRzdDsJCQkJCVwKLQkgICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOwkJCQlcCi0JICAgIFVpbnQzMiBkMSA9IGQgJiAweGZmMDBmZjsJCQkJXAotCSAgICBkMSA9IChkMSArICgoczEgLSBkMSkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDBmZjsJXAotCSAgICBzICY9IDB4ZmYwMDsJCQkJCVwKLQkgICAgZCAmPSAweGZmMDA7CQkJCQlcCi0JICAgIGQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOwkJXAotCSAgICAqZHN0KysgPSBkMSB8IGQ7CQkJCQlcCi0JfQkJCQkJCQlcCi0gICAgfSB3aGlsZSgwKQotCi0vKgotICogRm9yIDE2YnBwIHBpeGVscyB3ZSBjYW4gZ28gYSBzdGVwIGZ1cnRoZXI6IHB1dCB0aGUgbWlkZGxlIGNvbXBvbmVudAotICogaW4gdGhlIGhpZ2ggMTYgYml0cyBvZiBhIDMyIGJpdCB3b3JkLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCi0gKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuIFNpbmNlIHRoZSBzbWFsbGVzdCBnYXAgaXMgaGVyZSBqdXN0Ci0gKiA1IGJpdHMsIHdlIGhhdmUgdG8gc2NhbGUgYWxwaGEgZG93biB0byA1IGJpdHMgYXMgd2VsbC4KLSAqLwotI2RlZmluZSBBTFBIQV9CTElUMTZfNTY1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKLSAgICBkbyB7CQkJCQkJXAotICAgICAgICBpbnQgaTsJCQkJCQlcCi0JVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOwkJCVwKLQlVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOwkJCVwKLQlVaW50MzIgQUxQSEEgPSBhbHBoYSA+PiAzOwkJCVwKLQlmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsJCVwKLQkgICAgVWludDMyIHMgPSAqc3JjKys7CQkJCVwKLQkgICAgVWludDMyIGQgPSAqZHN0OwkJCQlcCi0JICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsJCVwKLQkgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOwkJXAotCSAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OwkJCVwKLQkgICAgZCAmPSAweDA3ZTBmODFmOwkJCQlcCi0JICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsJCQlcCi0JfQkJCQkJCVwKLSAgICB9IHdoaWxlKDApCi0KLSNkZWZpbmUgQUxQSEFfQkxJVDE2XzU1NSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCi0gICAgZG8gewkJCQkJCVwKLSAgICAgICAgaW50IGk7CQkJCQkJXAotCVVpbnQxNiAqc3JjID0gKFVpbnQxNiAqKShmcm9tKTsJCQlcCi0JVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsJCQlcCi0JVWludDMyIEFMUEhBID0gYWxwaGEgPj4gMzsJCQlcCi0JZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7CQlcCi0JICAgIFVpbnQzMiBzID0gKnNyYysrOwkJCQlcCi0JICAgIFVpbnQzMiBkID0gKmRzdDsJCQkJXAotCSAgICBzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDNlMDdjMWY7CQlcCi0JICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsJCVwKLQkgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsJCQlcCi0JICAgIGQgJj0gMHgwM2UwN2MxZjsJCQkJXAotCSAgICAqZHN0KysgPSAoVWludDE2KShkIHwgZCA+PiAxNik7CQkJXAotCX0JCQkJCQlcCi0gICAgfSB3aGlsZSgwKQotCi0vKgotICogVGhlIGdlbmVyYWwgc2xvdyBjYXRjaC1hbGwgZnVuY3Rpb24sIGZvciByZW1haW5pbmcgZGVwdGhzIGFuZCBmb3JtYXRzCi0gKi8KLSNkZWZpbmUgQUxQSEFfQkxJVF9BTlkodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJCQlcCi0gICAgZG8gewkJCQkJCQkJXAotICAgICAgICBpbnQgaTsJCQkJCQkJCVwKLQlVaW50OCAqc3JjID0gZnJvbTsJCQkJCQlcCi0JVWludDggKmRzdCA9IHRvOwkJCQkJCVwKLQlmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsJCQkJXAotCSAgICBVaW50MzIgcywgZDsJCQkJCQlcCi0JICAgIHVuc2lnbmVkIHJzLCBncywgYnMsIHJkLCBnZCwgYmQ7CQkJCVwKLQkgICAgc3dpdGNoKGJwcCkgewkJCQkJCVwKLQkgICAgY2FzZSAyOgkJCQkJCQlcCi0JCXMgPSAqKFVpbnQxNiAqKXNyYzsJCQkJCVwKLQkJZCA9ICooVWludDE2ICopZHN0OwkJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCSAgICBjYXNlIDM6CQkJCQkJCVwKLQkJaWYoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgewkJCVwKLQkJICAgIHMgPSAoc3JjWzBdIDw8IDE2KSB8IChzcmNbMV0gPDwgOCkgfCBzcmNbMl07CVwKLQkJICAgIGQgPSAoZHN0WzBdIDw8IDE2KSB8IChkc3RbMV0gPDwgOCkgfCBkc3RbMl07CVwKLQkJfSBlbHNlIHsJCQkJCQlcCi0JCSAgICBzID0gKHNyY1syXSA8PCAxNikgfCAoc3JjWzFdIDw8IDgpIHwgc3JjWzBdOwlcCi0JCSAgICBkID0gKGRzdFsyXSA8PCAxNikgfCAoZHN0WzFdIDw8IDgpIHwgZHN0WzBdOwlcCi0JCX0JCQkJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCSAgICBjYXNlIDQ6CQkJCQkJCVwKLQkJcyA9ICooVWludDMyICopc3JjOwkJCQkJXAotCQlkID0gKihVaW50MzIgKilkc3Q7CQkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JICAgIH0JCQkJCQkJCVwKLQkgICAgUkdCX0ZST01fUElYRUwocywgZm10LCBycywgZ3MsIGJzKTsJCQkJXAotCSAgICBSR0JfRlJPTV9QSVhFTChkLCBmbXQsIHJkLCBnZCwgYmQpOwkJCQlcCi0JICAgIHJkICs9IChycyAtIHJkKSAqIGFscGhhID4+IDg7CQkJCVwKLQkgICAgZ2QgKz0gKGdzIC0gZ2QpICogYWxwaGEgPj4gODsJCQkJXAotCSAgICBiZCArPSAoYnMgLSBiZCkgKiBhbHBoYSA+PiA4OwkJCQlcCi0JICAgIFBJWEVMX0ZST01fUkdCKGQsIGZtdCwgcmQsIGdkLCBiZCk7CQkJCVwKLQkgICAgc3dpdGNoKGJwcCkgewkJCQkJCVwKLQkgICAgY2FzZSAyOgkJCQkJCQlcCi0JCSooVWludDE2ICopZHN0ID0gKFVpbnQxNilkOwkJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCSAgICBjYXNlIDM6CQkJCQkJCVwKLQkJaWYoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgewkJCVwKLQkJICAgIGRzdFswXSA9IChVaW50OCkoZCA+PiAxNik7CQkJCQlcCi0JCSAgICBkc3RbMV0gPSAoVWludDgpKGQgPj4gOCk7CQkJCQlcCi0JCSAgICBkc3RbMl0gPSAoVWludDgpKGQpOwkJCQkJCVwKLQkJfSBlbHNlIHsJCQkJCQlcCi0JCSAgICBkc3RbMF0gPSAoVWludDgpZDsJCQkJCQlcCi0JCSAgICBkc3RbMV0gPSAoVWludDgpKGQgPj4gOCk7CQkJCQlcCi0JCSAgICBkc3RbMl0gPSAoVWludDgpKGQgPj4gMTYpOwkJCQkJXAotCQl9CQkJCQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQkgICAgY2FzZSA0OgkJCQkJCQlcCi0JCSooVWludDMyICopZHN0ID0gZDsJCQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQkgICAgfQkJCQkJCQkJXAotCSAgICBzcmMgKz0gYnBwOwkJCQkJCQlcCi0JICAgIGRzdCArPSBicHA7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0gICAgfSB3aGlsZSgwKQotCi0jaWZkZWYgTU1YX0FTTUJMSVQKLQotI2RlZmluZSBBTFBIQV9CTElUMzJfODg4XzUwTU1YKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCQlcCi0gICAgZG8gewkJCQkJCQkJXAotCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKikoZnJvbSk7CQkJCVwKLQlVaW50MzIgKmRzdHAgPSAoVWludDMyICopKHRvKTsJCQkJCVwKLSAgICAgICAgaW50IGkgPSAweDAwZmVmZWZlOwkJCQkJCVwKLSAgICAgICAgbW92ZF9tMnIoKigmaSksIG1tNCk7CQkJCQkJXAotICAgICAgICBwdW5wY2tsZHFfcjJyKG1tNCwgbW00KTsJCQkJCVwKLSAgICAgICAgaSA9IDB4MDAwMTAxMDE7CQkJCQkJCVwKLSAgICAgICAgbW92ZF9tMnIoKigmaSksIG1tMyk7CQkJCQkJXAotICAgICAgICBwdW5wY2tsZHFfcjJyKG1tMywgbW0zKTsJCQkJCVwKLSAgICAgICAgaSA9IChpbnQpKGxlbmd0aCk7CQkJCQkJXAotICAgICAgICBpZiggaSAmIDEgKSB7CQkJCQkJCVwKLQkgIFVpbnQzMiBzID0gKnNyY3ArKzsJCQkJCQlcCi0JICBVaW50MzIgZCA9ICpkc3RwOwkJCQkJCVwKLQkgICpkc3RwKysgPSAoKChzICYgMHgwMGZlZmVmZSkgKyAoZCAmIDB4MDBmZWZlZmUpKSA+PiAxKQlcCi0JCSAgICAgKyAocyAmIGQgJiAweDAwMDEwMTAxKTsJCQkJXAotCSAgaS0tOwkJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQlmb3IoOyBpID4gMDsgLS1pKSB7CQkJCQkJXAotCSAgICBtb3ZxX20ycigoKmRzdHApLCBtbTIpOyAvKiBkc3QgLT4gbW0yICovCQkJXAotCSAgICBtb3ZxX3IycihtbTIsIG1tNik7CS8qIGRzdCAtPiBtbTYgKi8JCQlcCi0JICAgIG1vdnFfbTJyKCgqc3JjcCksIG1tMSk7IC8qIHNyYyAtPiBtbTEgKi8JCQlcCi0JICAgIG1vdnFfcjJyKG1tMSwgbW01KTsJLyogc3JjIC0+IG1tNSAqLwkJCVwKLQkgICAgcGFuZF9yMnIobW00LCBtbTYpOwkvKiBkc3QgJiAweDAwZmVmZWZlIC0+IG1tNiAqLwkJXAotCSAgICBwYW5kX3IycihtbTQsIG1tNSk7IC8qIHNyYyAmIDB4MDBmZWZlZmUgLT4gbW01ICovCQlcCi0JICAgIHBhZGRkX3IycihtbTYsIG1tNSk7IC8qIChkc3QgJiAweDAwZmVmZWZlKSArIChkc3QgJiAweDAwZmVmZWZlKSAtPiBtbTUgKi8JXAotCSAgICBwc3JsZF9pMnIoMSwgbW01KTsJCQkJCQlcCi0JICAgIHBhbmRfcjJyKG1tMSwgbW0yKTsJLyogcyAmIGQgLT4gbW0yICovCQkJXAotCSAgICBwYW5kX3IycihtbTMsIG1tMik7CS8qIHMgJiBkICYgMHgwMDAxMDEwMSAtPiBtbTIgKi8JCVwKLQkgICAgcGFkZGRfcjJyKG1tNSwgbW0yKTsJCQkJCVwKLQkgICAgbW92cV9yMm0obW0yLCAoKmRzdHApKTsJCQkJCVwKLQkgICAgZHN0cCArPSAyOwkJCQkJCQlcCi0JICAgIHNyY3AgKz0gMjsJCQkJCQkJXAotCSAgICBpLS07CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JZW1tcygpOwkJCQkJCQkJXAotICAgIH0gd2hpbGUoMCkKLQotI2VuZGlmCi0gICAgCi0vKgotICogU3BlY2lhbCBjYXNlOiA1MCUgYWxwaGEgKGFscGhhPTEyOCkKLSAqIFRoaXMgaXMgdHJlYXRlZCBzcGVjaWFsbHkgYmVjYXVzZSBpdCBjYW4gYmUgb3B0aW1pemVkIHZlcnkgd2VsbCwgYW5kCi0gKiBzaW5jZSBpdCBpcyBnb29kIGZvciBtYW55IGNhc2VzIG9mIHNlbWktdHJhbnNsdWNlbmN5LgotICogVGhlIHRoZW9yeSBpcyB0byBkbyBhbGwgdGhyZWUgY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lOgotICogRmlyc3QgemVybyB0aGUgbG93ZXN0IGJpdCBvZiBlYWNoIGNvbXBvbmVudCwgd2hpY2ggZ2l2ZXMgdXMgcm9vbSB0bwotICogYWRkIHRoZW0uIFRoZW4gc2hpZnQgcmlnaHQgYW5kIGFkZCB0aGUgc3VtIG9mIHRoZSBsb3dlc3QgYml0cy4KLSAqLwotI2RlZmluZSBBTFBIQV9CTElUMzJfODg4XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCQlcCi0gICAgZG8gewkJCQkJCQkJXAotICAgICAgICBpbnQgaTsJCQkJCQkJCVwKLQlVaW50MzIgKnNyYyA9IChVaW50MzIgKikoZnJvbSk7CQkJCQlcCi0JVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsJCQkJCVwKLQlmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsJCQkJXAotCSAgICBVaW50MzIgcyA9ICpzcmMrKzsJCQkJCQlcCi0JICAgIFVpbnQzMiBkID0gKmRzdDsJCQkJCQlcCi0JICAgICpkc3QrKyA9ICgoKHMgJiAweDAwZmVmZWZlKSArIChkICYgMHgwMGZlZmVmZSkpID4+IDEpCVwKLQkJICAgICArIChzICYgZCAmIDB4MDAwMTAxMDEpOwkJCQlcCi0JfQkJCQkJCQkJXAotICAgIH0gd2hpbGUoMCkKLQotLyoKLSAqIEZvciAxNmJwcCwgd2UgY2FuIGFjdHVhbGx5IGJsZW5kIHR3byBwaXhlbHMgaW4gcGFyYWxsZWwsIGlmIHdlIHRha2UKLSAqIGNhcmUgdG8gc2hpZnQgYmVmb3JlIHdlIGFkZCwgbm90IGFmdGVyLgotICovCi0KLS8qIGhlbHBlcjogYmxlbmQgYSBzaW5nbGUgMTYgYml0IHBpeGVsIGF0IDUwJSAqLwotI2RlZmluZSBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKQkJCVwKLSAgICBkbyB7CQkJCQkJXAotCVVpbnQzMiBzID0gKnNyYysrOwkJCQlcCi0JVWludDMyIGQgPSAqZHN0OwkJCQlcCi0JKmRzdCsrID0gKFVpbnQxNikoKCgocyAmIG1hc2spICsgKGQgJiBtYXNrKSkgPj4gMSkgKwlcCi0JICAgICAgICAgICAgICAgICAgKHMgJiBkICYgKH5tYXNrICYgMHhmZmZmKSkpOwkJXAotICAgIH0gd2hpbGUoMCkKLQotLyogYmFzaWMgMTZicHAgYmxlbmRlci4gbWFzayBpcyB0aGUgcGl4ZWxzIHRvIGtlZXAgd2hlbiBhZGRpbmcuICovCi0jZGVmaW5lIEFMUEhBX0JMSVQxNl81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhLCBtYXNrKQkJXAotICAgIGRvIHsJCQkJCQkJCVwKLQl1bnNpZ25lZCBuID0gKGxlbmd0aCk7CQkJCQkJXAotCVVpbnQxNiAqc3JjID0gKFVpbnQxNiAqKShmcm9tKTsJCQkJCVwKLQlVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOwkJCQkJXAotCWlmKCgodWludHB0cl90KXNyYyBeICh1aW50cHRyX3QpZHN0KSAmIDMpIHsJCQlcCi0JICAgIC8qIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbm90IGluIHBoYXNlLCBibGl0IG9uZSBieSBvbmUgKi8JXAotCSAgICB3aGlsZShuLS0pCQkJCQkJCVwKLQkJQkxFTkQxNl81MChkc3QsIHNyYywgbWFzayk7CQkJCVwKLQl9IGVsc2UgewkJCQkJCQlcCi0JICAgIGlmKCh1aW50cHRyX3Qpc3JjICYgMykgewkJCQkJXAotCQkvKiBmaXJzdCBvZGQgcGl4ZWwgKi8JCQkJCVwKLQkJQkxFTkQxNl81MChkc3QsIHNyYywgbWFzayk7CQkJCVwKLQkJbi0tOwkJCQkJCQlcCi0JICAgIH0JCQkJCQkJCVwKLQkgICAgZm9yKDsgbiA+IDE7IG4gLT0gMikgewkJCQkJXAotCQlVaW50MzIgcyA9ICooVWludDMyICopc3JjOwkJCQlcCi0JCVVpbnQzMiBkID0gKihVaW50MzIgKilkc3Q7CQkJCVwKLQkJKihVaW50MzIgKilkc3QgPSAoKHMgJiAobWFzayB8IG1hc2sgPDwgMTYpKSA+PiAxKQlcCi0JCSAgICAgICAgICAgICAgICsgKChkICYgKG1hc2sgfCBtYXNrIDw8IDE2KSkgPj4gMSkJXAotCQkgICAgICAgICAgICAgICArIChzICYgZCAmICh+KG1hc2sgfCBtYXNrIDw8IDE2KSkpOwlcCi0JCXNyYyArPSAyOwkJCQkJCVwKLQkJZHN0ICs9IDI7CQkJCQkJXAotCSAgICB9CQkJCQkJCQlcCi0JICAgIGlmKG4pCQkJCQkJCVwKLQkJQkxFTkQxNl81MChkc3QsIHNyYywgbWFzayk7IC8qIGxhc3Qgb2RkIHBpeGVsICovCVwKLQl9CQkJCQkJCQlcCi0gICAgfSB3aGlsZSgwKQotCi0jZGVmaW5lIEFMUEhBX0JMSVQxNl81NjVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAotICAgIEFMUEhBX0JMSVQxNl81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhLCAweGY3ZGUpCi0KLSNkZWZpbmUgQUxQSEFfQkxJVDE2XzU1NV81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCi0gICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZmJkZSkKLQotI2lmZGVmIE1NWF9BU01CTElUCi0KLSNkZWZpbmUgQ0hPT1NFX0JMSVQoYmxpdHRlciwgYWxwaGEsIGZtdCkJCQkJXAotICAgIGRvIHsJCQkJCQkJCVwKLSAgICAgICAgaWYoYWxwaGEgPT0gMjU1KSB7CQkJCQkJXAotCSAgICBzd2l0Y2goZm10LT5CeXRlc1BlclBpeGVsKSB7CQkJCVwKLQkgICAgY2FzZSAxOiBibGl0dGVyKDEsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAotCSAgICBjYXNlIDI6IGJsaXR0ZXIoMiwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCi0JICAgIGNhc2UgMzogYmxpdHRlcigzLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKLQkgICAgY2FzZSA0OiBibGl0dGVyKDQsIFVpbnQxNiwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKLQkgICAgfQkJCQkJCQkJXAotCX0gZWxzZSB7CQkJCQkJCVwKLQkgICAgc3dpdGNoKGZtdC0+Qnl0ZXNQZXJQaXhlbCkgewkJCQlcCi0JICAgIGNhc2UgMToJCQkJCQkJXAotCQkvKiBObyA4YnBwIGFscGhhIGJsaXR0aW5nICovCQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQkgICAgY2FzZSAyOgkJCQkJCQlcCi0JCXN3aXRjaChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spIHsJCVwKLQkJY2FzZSAweGZmZmY6CQkJCQkJXAotCQkgICAgaWYoZm10LT5HbWFzayA9PSAweDA3ZTAJCQkJXAotCQkgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDA3ZTAJCQkJXAotCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDA3ZTApIHsJCQlcCi0JCQlpZihhbHBoYSA9PSAxMjgpCQkJCVwKLQkJCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1XzUwKTsJXAotCQkJZWxzZSB7CQkJCQkJXAotCQkJICAgIGlmKFNETF9IYXNNTVgoKSkJCQkJXAotCQkJCWJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjVNTVgpOwlcCi0JCQkgICAgZWxzZQkJCQkJXAotCQkJCWJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjUpOwlcCi0JCQl9CQkJCQkJXAotCQkgICAgfSBlbHNlCQkJCQkJXAotCQkJZ290byBnZW5lcmFsMTY7CQkJCQlcCi0JCSAgICBicmVhazsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JCWNhc2UgMHg3ZmZmOgkJCQkJCVwKLQkJICAgIGlmKGZtdC0+R21hc2sgPT0gMHgwM2UwCQkJCVwKLQkJICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwM2UwCQkJCVwKLQkJICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHgwM2UwKSB7CQkJXAotCQkJaWYoYWxwaGEgPT0gMTI4KQkJCQlcCi0JCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NV81MCk7CVwKLQkJCWVsc2UgewkJCQkJCVwKLQkJCSAgICBpZihTRExfSGFzTU1YKCkpCQkJCVwKLQkJCQlibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1TU1YKTsJXAotCQkJICAgIGVsc2UJCQkJCVwKLQkJCQlibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1KTsJXAotCQkJfQkJCQkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJICAgIH0JCQkJCQkJXAotCQkgICAgLyogZmFsbHRocm91Z2ggKi8JCQkJCVwKLQkJCQkJCQkJCVwKLQkJZGVmYXVsdDoJCQkJCQlcCi0JCWdlbmVyYWwxNjoJCQkJCQlcCi0JCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUX0FOWSk7CQkJXAotCQl9CQkJCQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQkgICAgY2FzZSAzOgkJCQkJCQlcCi0JCWJsaXR0ZXIoMywgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JICAgIGNhc2UgNDoJCQkJCQkJXAotCQlpZigoZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSA9PSAweDAwZmZmZmZmCVwKLQkJICAgJiYgKGZtdC0+R21hc2sgPT0gMHhmZjAwIHx8IGZtdC0+Um1hc2sgPT0gMHhmZjAwCVwKLQkJICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHhmZjAwKSkgewkJCVwKLQkJICAgIGlmKGFscGhhID09IDEyOCkJCQkJCVwKLQkJICAgIHsJCQkJCQkJXAotCQkJaWYoU0RMX0hhc01NWCgpKQkJCQlcCi0JCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODhfNTBNTVgpO1wKLQkJCWVsc2UJCQkJCQlcCi0JCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODhfNTApO1wKLQkJICAgIH0JCQkJCQkJXAotCQkgICAgZWxzZQkJCQkJCVwKLQkJICAgIHsJCQkJCQkJXAotCQkJaWYoU0RMX0hhc01NWCgpKQkJCQlcCi0JCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODhNTVgpO1wKLQkJCWVsc2UJCQkJCQlcCi0JCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODgpOwlcCi0JCSAgICB9CQkJCQkJCVwKLQkJfSBlbHNlCQkJCQkJCVwKLQkJICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUX0FOWSk7CQkJXAotCQlicmVhazsJCQkJCQkJXAotCSAgICB9CQkJCQkJCQlcCi0JfQkJCQkJCQkJXAotICAgIH0gd2hpbGUoMCkKLQotI2Vsc2UKLQkKLSNkZWZpbmUgQ0hPT1NFX0JMSVQoYmxpdHRlciwgYWxwaGEsIGZtdCkJCQkJXAotICAgIGRvIHsJCQkJCQkJCVwKLSAgICAgICAgaWYoYWxwaGEgPT0gMjU1KSB7CQkJCQkJXAotCSAgICBzd2l0Y2goZm10LT5CeXRlc1BlclBpeGVsKSB7CQkJCVwKLQkgICAgY2FzZSAxOiBibGl0dGVyKDEsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAotCSAgICBjYXNlIDI6IGJsaXR0ZXIoMiwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCi0JICAgIGNhc2UgMzogYmxpdHRlcigzLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKLQkgICAgY2FzZSA0OiBibGl0dGVyKDQsIFVpbnQxNiwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKLQkgICAgfQkJCQkJCQkJXAotCX0gZWxzZSB7CQkJCQkJCVwKLQkgICAgc3dpdGNoKGZtdC0+Qnl0ZXNQZXJQaXhlbCkgewkJCQlcCi0JICAgIGNhc2UgMToJCQkJCQkJXAotCQkvKiBObyA4YnBwIGFscGhhIGJsaXR0aW5nICovCQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQkgICAgY2FzZSAyOgkJCQkJCQlcCi0JCXN3aXRjaChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spIHsJCVwKLQkJY2FzZSAweGZmZmY6CQkJCQkJXAotCQkgICAgaWYoZm10LT5HbWFzayA9PSAweDA3ZTAJCQkJXAotCQkgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDA3ZTAJCQkJXAotCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDA3ZTApIHsJCQlcCi0JCQlpZihhbHBoYSA9PSAxMjgpCQkJCVwKLQkJCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1XzUwKTsJXAotCQkJZWxzZSB7CQkJCQkJXAotCQkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjUpOwlcCi0JCQl9CQkJCQkJXAotCQkgICAgfSBlbHNlCQkJCQkJXAotCQkJZ290byBnZW5lcmFsMTY7CQkJCQlcCi0JCSAgICBicmVhazsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JCWNhc2UgMHg3ZmZmOgkJCQkJCVwKLQkJICAgIGlmKGZtdC0+R21hc2sgPT0gMHgwM2UwCQkJCVwKLQkJICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwM2UwCQkJCVwKLQkJICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHgwM2UwKSB7CQkJXAotCQkJaWYoYWxwaGEgPT0gMTI4KQkJCQlcCi0JCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NV81MCk7CVwKLQkJCWVsc2UgewkJCQkJCVwKLQkJCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1KTsJXAotCQkJfQkJCQkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJICAgIH0JCQkJCQkJXAotCQkgICAgLyogZmFsbHRocm91Z2ggKi8JCQkJCVwKLQkJCQkJCQkJCVwKLQkJZGVmYXVsdDoJCQkJCQlcCi0JCWdlbmVyYWwxNjoJCQkJCQlcCi0JCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUX0FOWSk7CQkJXAotCQl9CQkJCQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQkgICAgY2FzZSAzOgkJCQkJCQlcCi0JCWJsaXR0ZXIoMywgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JICAgIGNhc2UgNDoJCQkJCQkJXAotCQlpZigoZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSA9PSAweDAwZmZmZmZmCVwKLQkJICAgJiYgKGZtdC0+R21hc2sgPT0gMHhmZjAwIHx8IGZtdC0+Um1hc2sgPT0gMHhmZjAwCVwKLQkJICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHhmZjAwKSkgewkJCVwKLQkJICAgIGlmKGFscGhhID09IDEyOCkJCQkJCVwKLQkJCWJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4XzUwKTsJXAotCQkgICAgZWxzZQkJCQkJCVwKLQkJCWJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4KTsJCVwKLQkJfSBlbHNlCQkJCQkJCVwKLQkJICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUX0FOWSk7CQkJXAotCQlicmVhazsJCQkJCQkJXAotCSAgICB9CQkJCQkJCQlcCi0JfQkJCQkJCQkJXAotICAgIH0gd2hpbGUoMCkKLQotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIGNhc2Ugd2hlbiB0aGUgc3VyZmFjZSBpcyBjbGlwcGVkIG9uIHRoZSBsZWZ0IGFuZC9vcgotICogcmlnaHQuIFRvcCBjbGlwcGluZyBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCi0gKi8KLXN0YXRpYyB2b2lkIFJMRUNsaXBCbGl0KGludCB3LCBVaW50OCAqc3JjYnVmLCBTRExfU3VyZmFjZSAqZHN0LAotCQkJVWludDggKmRzdGJ1ZiwgU0RMX1JlY3QgKnNyY3JlY3QsIHVuc2lnbmVkIGFscGhhKQotewotICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gZHN0LT5mb3JtYXQ7Ci0KLSNkZWZpbmUgUkxFQ0xJUEJMSVQoYnBwLCBUeXBlLCBkb19ibGl0KQkJCQkJICAgXAotICAgIGRvIHsJCQkJCQkJCSAgIFwKLQlpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsJCQkJCSAgIFwKLQlpbnQgb2ZzID0gMDsJCQkJCQkJICAgXAotCWludCBsZWZ0ID0gc3JjcmVjdC0+eDsJCQkJCQkgICBcCi0JaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7CQkJCQkgICBcCi0JZHN0YnVmIC09IGxlZnQgKiBicHA7CQkJCQkJICAgXAotCWZvcig7OykgewkJCQkJCQkgICBcCi0JICAgIGludCBydW47CQkJCQkJCSAgIFwKLQkgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsJCQkJCSAgIFwKLQkgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsJCQkJCSAgIFwKLQkgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoVHlwZSk7CQkJCQkgICBcCi0JICAgIGlmKHJ1bikgewkJCQkJCQkgICBcCi0JCS8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLwkJCSAgIFwKLQkJaWYob2ZzIDwgcmlnaHQpIHsJCQkJCSAgIFwKLQkJICAgIGludCBzdGFydCA9IDA7CQkJCQkgICBcCi0JCSAgICBpbnQgbGVuID0gcnVuOwkJCQkJICAgXAotCQkgICAgaW50IHN0YXJ0Y29sOwkJCQkJICAgXAotCQkgICAgaWYobGVmdCAtIG9mcyA+IDApIHsJCQkJICAgXAotCQkJc3RhcnQgPSBsZWZ0IC0gb2ZzOwkJCQkgICBcCi0JCQlsZW4gLT0gc3RhcnQ7CQkJCQkgICBcCi0JCQlpZihsZW4gPD0gMCkJCQkJCSAgIFwKLQkJCSAgICBnb3RvIG5vY29weSAjIyBicHAgIyMgZG9fYmxpdDsJCSAgIFwKLQkJICAgIH0JCQkJCQkJICAgXAotCQkgICAgc3RhcnRjb2wgPSBvZnMgKyBzdGFydDsJCQkJICAgXAotCQkgICAgaWYobGVuID4gcmlnaHQgLSBzdGFydGNvbCkJCQkJICAgXAotCQkJbGVuID0gcmlnaHQgLSBzdGFydGNvbDsJCQkJICAgXAotCQkgICAgZG9fYmxpdChkc3RidWYgKyBzdGFydGNvbCAqIGJwcCwgc3JjYnVmICsgc3RhcnQgKiBicHAsIFwKLQkJCSAgICBsZW4sIGJwcCwgYWxwaGEpOwkJCQkgICBcCi0JCX0JCQkJCQkJICAgXAotCSAgICBub2NvcHkgIyMgYnBwICMjIGRvX2JsaXQ6CQkJCQkgICBcCi0JCXNyY2J1ZiArPSBydW4gKiBicHA7CQkJCQkgICBcCi0JCW9mcyArPSBydW47CQkJCQkJICAgXAotCSAgICB9IGVsc2UgaWYoIW9mcykJCQkJCQkgICBcCi0JCWJyZWFrOwkJCQkJCQkgICBcCi0JICAgIGlmKG9mcyA9PSB3KSB7CQkJCQkJICAgXAotCQlvZnMgPSAwOwkJCQkJCSAgIFwKLQkJZHN0YnVmICs9IGRzdC0+cGl0Y2g7CQkJCQkgICBcCi0JCWlmKCEtLWxpbmVjb3VudCkJCQkJCSAgIFwKLQkJICAgIGJyZWFrOwkJCQkJCSAgIFwKLQkgICAgfQkJCQkJCQkJICAgXAotCX0JCQkJCQkJCSAgIFwKLSAgICB9IHdoaWxlKDApCi0KLSAgICBDSE9PU0VfQkxJVChSTEVDTElQQkxJVCwgYWxwaGEsIGZtdCk7Ci0KLSN1bmRlZiBSTEVDTElQQkxJVAotCi19Ci0KLQotLyogYmxpdCBhIGNvbG9ya2V5ZWQgUkxFIHN1cmZhY2UgKi8KLWludCBTRExfUkxFQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLQkJU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCi17Ci0JVWludDggKmRzdGJ1ZjsKLQlVaW50OCAqc3JjYnVmOwotCWludCB4LCB5OwotCWludCB3ID0gc3JjLT53OwotCXVuc2lnbmVkIGFscGhhOwotCi0JLyogTG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKLQkJaWYgKCBTRExfTG9ja1N1cmZhY2UoZHN0KSA8IDAgKSB7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzICovCi0JeCA9IGRzdHJlY3QtPng7Ci0JeSA9IGRzdHJlY3QtPnk7Ci0JZHN0YnVmID0gKFVpbnQ4ICopZHN0LT5waXhlbHMKLQkgICAgICAgICArIHkgKiBkc3QtPnBpdGNoICsgeCAqIHNyYy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCXNyY2J1ZiA9IChVaW50OCAqKXNyYy0+bWFwLT5zd19kYXRhLT5hdXhfZGF0YTsKLQotCXsKLQkgICAgLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Nlc3NhcnkgKi8KLQkgICAgaW50IHZza2lwID0gc3JjcmVjdC0+eTsKLQkgICAgaW50IG9mcyA9IDA7Ci0JICAgIGlmKHZza2lwKSB7Ci0KLSNkZWZpbmUgUkxFU0tJUChicHAsIFR5cGUpCQkJXAotCQlmb3IoOzspIHsJCQlcCi0JCSAgICBpbnQgcnVuOwkJCVwKLQkJICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7CVwKLQkJICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07CVwKLQkJICAgIHNyY2J1ZiArPSBzaXplb2YoVHlwZSkgKiAyOwlcCi0JCSAgICBpZihydW4pIHsJCQlcCi0JCQlzcmNidWYgKz0gcnVuICogYnBwOwlcCi0JCQlvZnMgKz0gcnVuOwkJXAotCQkgICAgfSBlbHNlIGlmKCFvZnMpCQlcCi0JCQlnb3RvIGRvbmU7CQlcCi0JCSAgICBpZihvZnMgPT0gdykgewkJXAotCQkJb2ZzID0gMDsJCVwKLQkJCWlmKCEtLXZza2lwKQkJXAotCQkJICAgIGJyZWFrOwkJXAotCQkgICAgfQkJCQlcCi0JCX0KLQotCQlzd2l0Y2goc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpIHsKLQkJY2FzZSAxOiBSTEVTS0lQKDEsIFVpbnQ4KTsgYnJlYWs7Ci0JCWNhc2UgMjogUkxFU0tJUCgyLCBVaW50OCk7IGJyZWFrOwotCQljYXNlIDM6IFJMRVNLSVAoMywgVWludDgpOyBicmVhazsKLQkJY2FzZSA0OiBSTEVTS0lQKDQsIFVpbnQxNik7IGJyZWFrOwotCQl9Ci0KLSN1bmRlZiBSTEVTS0lQCi0KLQkgICAgfQotCX0KLQotCWFscGhhID0gKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQQotCSAgICAgICAgPyBzcmMtPmZvcm1hdC0+YWxwaGEgOiAyNTU7Ci0JLyogaWYgbGVmdCBvciByaWdodCBlZGdlIGNsaXBwaW5nIG5lZWRlZCwgY2FsbCBjbGlwIGJsaXQgKi8KLQlpZiAoIHNyY3JlY3QtPnggfHwgc3JjcmVjdC0+dyAhPSBzcmMtPncgKSB7Ci0JICAgIFJMRUNsaXBCbGl0KHcsIHNyY2J1ZiwgZHN0LCBkc3RidWYsIHNyY3JlY3QsIGFscGhhKTsKLQl9IGVsc2UgewotCSAgICBTRExfUGl4ZWxGb3JtYXQgKmZtdCA9IHNyYy0+Zm9ybWF0OwotCi0jZGVmaW5lIFJMRUJMSVQoYnBwLCBUeXBlLCBkb19ibGl0KQkJCQkJICAgICAgXAotCSAgICBkbyB7CQkJCQkJCSAgICAgIFwKLQkJaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7CQkJCSAgICAgIFwKLQkJaW50IG9mcyA9IDA7CQkJCQkJICAgICAgXAotCQlmb3IoOzspIHsJCQkJCQkgICAgICBcCi0JCSAgICB1bnNpZ25lZCBydW47CQkJCQkgICAgICBcCi0JCSAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOwkJCQkgICAgICBcCi0JCSAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOwkJCQkgICAgICBcCi0JCSAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsJCQkJICAgICAgXAotCQkgICAgaWYocnVuKSB7CQkJCQkJICAgICAgXAotCQkJZG9fYmxpdChkc3RidWYgKyBvZnMgKiBicHAsIHNyY2J1ZiwgcnVuLCBicHAsIGFscGhhKTsgXAotCQkJc3JjYnVmICs9IHJ1biAqIGJwcDsJCQkJICAgICAgXAotCQkJb2ZzICs9IHJ1bjsJCQkJCSAgICAgIFwKLQkJICAgIH0gZWxzZSBpZighb2ZzKQkJCQkJICAgICAgXAotCQkJYnJlYWs7CQkJCQkJICAgICAgXAotCQkgICAgaWYob2ZzID09IHcpIHsJCQkJCSAgICAgIFwKLQkJCW9mcyA9IDA7CQkJCQkgICAgICBcCi0JCQlkc3RidWYgKz0gZHN0LT5waXRjaDsJCQkJICAgICAgXAotCQkJaWYoIS0tbGluZWNvdW50KQkJCQkgICAgICBcCi0JCQkgICAgYnJlYWs7CQkJCQkgICAgICBcCi0JCSAgICB9CQkJCQkJCSAgICAgIFwKLQkJfQkJCQkJCQkgICAgICBcCi0JICAgIH0gd2hpbGUoMCkKLQotCSAgICBDSE9PU0VfQkxJVChSTEVCTElULCBhbHBoYSwgZm10KTsKLQotI3VuZGVmIFJMRUJMSVQKLQl9Ci0KLWRvbmU6Ci0JLyogVW5sb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoIFNETF9NVVNUTE9DSyhkc3QpICkgewotCQlTRExfVW5sb2NrU3VyZmFjZShkc3QpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLSN1bmRlZiBPUEFRVUVfQkxJVAotCi0vKgotICogUGVyLXBpeGVsIGJsaXR0aW5nIG1hY3JvcyBmb3IgdHJhbnNsdWNlbnQgcGl4ZWxzOgotICogVGhlc2UgdXNlIHRoZSBzYW1lIHRlY2huaXF1ZXMgYXMgdGhlIHBlci1zdXJmYWNlIGJsaXR0aW5nIG1hY3JvcwotICovCi0KLS8qCi0gKiBGb3IgMzJicHAgcGl4ZWxzLCB3ZSBoYXZlIG1hZGUgc3VyZSB0aGUgYWxwaGEgaXMgc3RvcmVkIGluIHRoZSB0b3AKLSAqIDggYml0cywgc28gcHJvY2VlZCBhcyB1c3VhbAotICovCi0jZGVmaW5lIEJMSVRfVFJBTlNMXzg4OChzcmMsIGRzdCkJCQkJXAotICAgIGRvIHsJCQkJCQkJXAotICAgICAgICBVaW50MzIgcyA9IHNyYzsJCQkJCQlcCi0JVWludDMyIGQgPSBkc3Q7CQkJCQkJXAotCXVuc2lnbmVkIGFscGhhID0gcyA+PiAyNDsJCQkJXAotCVVpbnQzMiBzMSA9IHMgJiAweGZmMDBmZjsJCQkJXAotCVVpbnQzMiBkMSA9IGQgJiAweGZmMDBmZjsJCQkJXAotCWQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOwlcCi0JcyAmPSAweGZmMDA7CQkJCQkJXAotCWQgJj0gMHhmZjAwOwkJCQkJCVwKLQlkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsJCVwKLQlkc3QgPSBkMSB8IGQ7CQkJCQkJXAotICAgIH0gd2hpbGUoMCkKLQotLyoKLSAqIEZvciAxNmJwcCBwaXhlbHMsIHdlIGhhdmUgc3RvcmVkIHRoZSA1IG1vc3Qgc2lnbmlmaWNhbnQgYWxwaGEgYml0cyBpbgotICogYml0cyA1LTEwLiBBcyBiZWZvcmUsIHdlIGNhbiBwcm9jZXNzIGFsbCAzIFJHQiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCi0gKi8KLSNkZWZpbmUgQkxJVF9UUkFOU0xfNTY1KHNyYywgZHN0KQkJXAotICAgIGRvIHsJCQkJCVwKLQlVaW50MzIgcyA9IHNyYzsJCQkJXAotCVVpbnQzMiBkID0gZHN0OwkJCQlcCi0JdW5zaWduZWQgYWxwaGEgPSAocyAmIDB4M2UwKSA+PiA1OwlcCi0JcyAmPSAweDA3ZTBmODFmOwkJCVwKLQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7CQlcCi0JZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsJCVwKLQlkICY9IDB4MDdlMGY4MWY7CQkJXAotCWRzdCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsJCQlcCi0gICAgfSB3aGlsZSgwKQotCi0jZGVmaW5lIEJMSVRfVFJBTlNMXzU1NShzcmMsIGRzdCkJCVwKLSAgICBkbyB7CQkJCQlcCi0JVWludDMyIHMgPSBzcmM7CQkJCVwKLQlVaW50MzIgZCA9IGRzdDsJCQkJXAotCXVuc2lnbmVkIGFscGhhID0gKHMgJiAweDNlMCkgPj4gNTsJXAotCXMgJj0gMHgwM2UwN2MxZjsJCQlcCi0JZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOwkJXAotCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7CQlcCi0JZCAmPSAweDAzZTA3YzFmOwkJCVwKLQlkc3QgPSAoVWludDE2KShkIHwgZCA+PiAxNik7CQkJXAotICAgIH0gd2hpbGUoMCkKLQotLyogdXNlZCB0byBzYXZlIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgaW4gdGhlIGVuY29kaW5nLiBEZXNpZ25lZCB0byBiZQotICAgbWFjcm8tY29tcGF0aWJsZSB3aXRoIFNETF9QaXhlbEZvcm1hdCBidXQgd2l0aG91dCB0aGUgdW5uZWVkZWQgZmllbGRzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JVWludDggIEJ5dGVzUGVyUGl4ZWw7Ci0JVWludDggIFJsb3NzOwotCVVpbnQ4ICBHbG9zczsKLQlVaW50OCAgQmxvc3M7Ci0JVWludDggIFJzaGlmdDsKLQlVaW50OCAgR3NoaWZ0OwotCVVpbnQ4ICBCc2hpZnQ7Ci0JVWludDggIEFzaGlmdDsKLQlVaW50MzIgUm1hc2s7Ci0JVWludDMyIEdtYXNrOwotCVVpbnQzMiBCbWFzazsKLQlVaW50MzIgQW1hc2s7Ci19IFJMRURlc3RGb3JtYXQ7Ci0KLS8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSBjbGlwcGVkIGF0IHRoZSByaWdodCBhbmQvb3IgbGVmdCBlZGdlcyAqLwotc3RhdGljIHZvaWQgUkxFQWxwaGFDbGlwQmxpdChpbnQgdywgVWludDggKnNyY2J1ZiwgU0RMX1N1cmZhY2UgKmRzdCwKLQkJCSAgICAgVWludDggKmRzdGJ1ZiwgU0RMX1JlY3QgKnNyY3JlY3QpCi17Ci0gICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IGRzdC0+Zm9ybWF0OwotICAgIC8qCi0gICAgICogY2xpcHBlZCBibGl0dGVyOiBQdHlwZSBpcyB0aGUgZGVzdGluYXRpb24gcGl4ZWwgdHlwZSwKLSAgICAgKiBDdHlwZSB0aGUgdHJhbnNsdWNlbnQgY291bnQgdHlwZSwgYW5kIGRvX2JsZW5kIHRoZSBtYWNybwotICAgICAqIHRvIGJsZW5kIG9uZSBwaXhlbC4KLSAgICAgKi8KLSNkZWZpbmUgUkxFQUxQSEFDTElQQkxJVChQdHlwZSwgQ3R5cGUsIGRvX2JsZW5kKQkJCSAgXAotICAgIGRvIHsJCQkJCQkJCSAgXAotCWludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOwkJCQkJICBcCi0JaW50IGxlZnQgPSBzcmNyZWN0LT54OwkJCQkJCSAgXAotCWludCByaWdodCA9IGxlZnQgKyBzcmNyZWN0LT53OwkJCQkJICBcCi0JZHN0YnVmIC09IGxlZnQgKiBzaXplb2YoUHR5cGUpOwkJCQkJICBcCi0JZG8gewkJCQkJCQkJICBcCi0JICAgIGludCBvZnMgPSAwOwkJCQkJCSAgXAotCSAgICAvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8JCQkgIFwKLQkgICAgZG8gewkJCQkJCQkgIFwKLQkJdW5zaWduZWQgcnVuOwkJCQkJCSAgXAotCQlvZnMgKz0gKChDdHlwZSAqKXNyY2J1ZilbMF07CQkJCSAgXAotCQlydW4gPSAoKEN0eXBlICopc3JjYnVmKVsxXTsJCQkJICBcCi0JCXNyY2J1ZiArPSAyICogc2l6ZW9mKEN0eXBlKTsJCQkJICBcCi0JCWlmKHJ1bikgewkJCQkJCSAgXAotCQkgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovCQkgIFwKLQkJICAgIGludCBjb2ZzID0gb2ZzOwkJCQkJICBcCi0JCSAgICBpbnQgY3J1biA9IHJ1bjsJCQkJCSAgXAotCQkgICAgaWYobGVmdCAtIGNvZnMgPiAwKSB7CQkJCSAgXAotCQkJY3J1biAtPSBsZWZ0IC0gY29mczsJCQkJICBcCi0JCQljb2ZzID0gbGVmdDsJCQkJCSAgXAotCQkgICAgfQkJCQkJCQkgIFwKLQkJICAgIGlmKGNydW4gPiByaWdodCAtIGNvZnMpCQkJCSAgXAotCQkJY3J1biA9IHJpZ2h0IC0gY29mczsJCQkJICBcCi0JCSAgICBpZihjcnVuID4gMCkJCQkJCSAgXAotCQkJUElYRUxfQ09QWShkc3RidWYgKyBjb2ZzICogc2l6ZW9mKFB0eXBlKSwJICBcCi0JCQkJICAgc3JjYnVmICsgKGNvZnMgLSBvZnMpICogc2l6ZW9mKFB0eXBlKSwgXAotCQkJCSAgICh1bnNpZ25lZCljcnVuLCBzaXplb2YoUHR5cGUpKTsJICBcCi0JCSAgICBzcmNidWYgKz0gcnVuICogc2l6ZW9mKFB0eXBlKTsJCQkgIFwKLQkJICAgIG9mcyArPSBydW47CQkJCQkJICBcCi0JCX0gZWxzZSBpZighb2ZzKQkJCQkJCSAgXAotCQkgICAgcmV0dXJuOwkJCQkJCSAgXAotCSAgICB9IHdoaWxlKG9mcyA8IHcpOwkJCQkJCSAgXAotCSAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovCQkJCSAgXAotCSAgICBpZihzaXplb2YoUHR5cGUpID09IDIpCQkJCQkgIFwKLQkJc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsJCQkgIFwKLQkgICAgLyogYmxpdCB0cmFuc2x1Y2VudCBwaXhlbHMgb24gdGhlIHNhbWUgbGluZSAqLwkJICBcCi0JICAgIG9mcyA9IDA7CQkJCQkJCSAgXAotCSAgICBkbyB7CQkJCQkJCSAgXAotCQl1bnNpZ25lZCBydW47CQkJCQkJICBcCi0JCW9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07CQkJCSAgXAotCQlydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07CQkJCSAgXAotCQlzcmNidWYgKz0gNDsJCQkJCQkgIFwKLQkJaWYocnVuKSB7CQkJCQkJICBcCi0JCSAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8JCSAgXAotCQkgICAgaW50IGNvZnMgPSBvZnM7CQkJCQkgIFwKLQkJICAgIGludCBjcnVuID0gcnVuOwkJCQkJICBcCi0JCSAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsJCQkJICBcCi0JCQljcnVuIC09IGxlZnQgLSBjb2ZzOwkJCQkgIFwKLQkJCWNvZnMgPSBsZWZ0OwkJCQkJICBcCi0JCSAgICB9CQkJCQkJCSAgXAotCQkgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykJCQkJICBcCi0JCQljcnVuID0gcmlnaHQgLSBjb2ZzOwkJCQkgIFwKLQkJICAgIGlmKGNydW4gPiAwKSB7CQkJCQkgIFwKLQkJCVB0eXBlICpkc3QgPSAoUHR5cGUgKilkc3RidWYgKyBjb2ZzOwkJICBcCi0JCQlVaW50MzIgKnNyYyA9IChVaW50MzIgKilzcmNidWYgKyAoY29mcyAtIG9mcyk7CSAgXAotCQkJaW50IGk7CQkJCQkJICBcCi0JCQlmb3IoaSA9IDA7IGkgPCBjcnVuOyBpKyspCQkJICBcCi0JCQkgICAgZG9fYmxlbmQoc3JjW2ldLCBkc3RbaV0pOwkJCSAgXAotCQkgICAgfQkJCQkJCQkgIFwKLQkJICAgIHNyY2J1ZiArPSBydW4gKiA0OwkJCQkJICBcCi0JCSAgICBvZnMgKz0gcnVuOwkJCQkJCSAgXAotCQl9CQkJCQkJCSAgXAotCSAgICB9IHdoaWxlKG9mcyA8IHcpOwkJCQkJCSAgXAotCSAgICBkc3RidWYgKz0gZHN0LT5waXRjaDsJCQkJCSAgXAotCX0gd2hpbGUoLS1saW5lY291bnQpOwkJCQkJCSAgXAotICAgIH0gd2hpbGUoMCkKLQotICAgIHN3aXRjaChkZi0+Qnl0ZXNQZXJQaXhlbCkgewotICAgIGNhc2UgMjoKLQlpZihkZi0+R21hc2sgPT0gMHgwN2UwIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAKLQkgICB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQotCSAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU2NSk7Ci0JZWxzZQotCSAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU1NSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSA0OgotCVJMRUFMUEhBQ0xJUEJMSVQoVWludDMyLCBVaW50MTYsIEJMSVRfVFJBTlNMXzg4OCk7Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0vKiBibGl0IGEgcGl4ZWwtYWxwaGEgUkxFIHN1cmZhY2UgKi8KLWludCBTRExfUkxFQWxwaGFCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAotCQkgICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KQotewotICAgIGludCB4LCB5OwotICAgIGludCB3ID0gc3JjLT53OwotICAgIFVpbnQ4ICpzcmNidWYsICpkc3RidWY7Ci0gICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IGRzdC0+Zm9ybWF0OwotCi0gICAgLyogTG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKLQlpZiAoIFNETF9Mb2NrU3VyZmFjZShkc3QpIDwgMCApIHsKLQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgICB4ID0gZHN0cmVjdC0+eDsKLSAgICB5ID0gZHN0cmVjdC0+eTsKLSAgICBkc3RidWYgPSAoVWludDggKilkc3QtPnBpeGVscwotCSAgICAgKyB5ICogZHN0LT5waXRjaCArIHggKiBkZi0+Qnl0ZXNQZXJQaXhlbDsKLSAgICBzcmNidWYgPSAoVWludDggKilzcmMtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGEgKyBzaXplb2YoUkxFRGVzdEZvcm1hdCk7Ci0KLSAgICB7Ci0JLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Vzc2FyeSAqLwotCWludCB2c2tpcCA9IHNyY3JlY3QtPnk7Ci0JaWYodnNraXApIHsKLQkgICAgaW50IG9mczsKLQkgICAgaWYoZGYtPkJ5dGVzUGVyUGl4ZWwgPT0gMikgewotCQkvKiB0aGUgMTYvMzIgaW50ZXJsZWF2ZWQgZm9ybWF0ICovCi0JCWRvIHsKLQkJICAgIC8qIHNraXAgb3BhcXVlIGxpbmUgKi8KLQkJICAgIG9mcyA9IDA7Ci0JCSAgICBkbyB7Ci0JCQlpbnQgcnVuOwotCQkJb2ZzICs9IHNyY2J1ZlswXTsKLQkJCXJ1biA9IHNyY2J1ZlsxXTsKLQkJCXNyY2J1ZiArPSAyOwotCQkJaWYocnVuKSB7Ci0JCQkgICAgc3JjYnVmICs9IDIgKiBydW47Ci0JCQkgICAgb2ZzICs9IHJ1bjsKLQkJCX0gZWxzZSBpZighb2ZzKQotCQkJICAgIGdvdG8gZG9uZTsKLQkJICAgIH0gd2hpbGUob2ZzIDwgdyk7Ci0KLQkJICAgIC8qIHNraXAgcGFkZGluZyAqLwotCQkgICAgc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsKLQotCQkgICAgLyogc2tpcCB0cmFuc2x1Y2VudCBsaW5lICovCi0JCSAgICBvZnMgPSAwOwotCQkgICAgZG8gewotCQkJaW50IHJ1bjsKLQkJCW9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07Ci0JCQlydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07Ci0JCQlzcmNidWYgKz0gNCAqIChydW4gKyAxKTsKLQkJCW9mcyArPSBydW47Ci0JCSAgICB9IHdoaWxlKG9mcyA8IHcpOwotCQl9IHdoaWxlKC0tdnNraXApOwotCSAgICB9IGVsc2UgewotCQkvKiB0aGUgMzIvMzIgaW50ZXJsZWF2ZWQgZm9ybWF0ICovCi0JCXZza2lwIDw8PSAxOwkvKiBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IGhhdmUgc2FtZSBmb3JtYXQgKi8KLQkJZG8gewotCQkgICAgb2ZzID0gMDsKLQkJICAgIGRvIHsKLQkJCWludCBydW47Ci0JCQlvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOwotCQkJcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOwotCQkJc3JjYnVmICs9IDQ7Ci0JCQlpZihydW4pIHsKLQkJCSAgICBzcmNidWYgKz0gNCAqIHJ1bjsKLQkJCSAgICBvZnMgKz0gcnVuOwotCQkJfSBlbHNlIGlmKCFvZnMpCi0JCQkgICAgZ290byBkb25lOwotCQkgICAgfSB3aGlsZShvZnMgPCB3KTsKLQkJfSB3aGlsZSgtLXZza2lwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKiBpZiBsZWZ0IG9yIHJpZ2h0IGVkZ2UgY2xpcHBpbmcgbmVlZGVkLCBjYWxsIGNsaXAgYmxpdCAqLwotICAgIGlmKHNyY3JlY3QtPnggfHwgc3JjcmVjdC0+dyAhPSBzcmMtPncpIHsKLQlSTEVBbHBoYUNsaXBCbGl0KHcsIHNyY2J1ZiwgZHN0LCBkc3RidWYsIHNyY3JlY3QpOwotICAgIH0gZWxzZSB7Ci0KLQkvKgotCSAqIG5vbi1jbGlwcGVkIGJsaXR0ZXIuIFB0eXBlIGlzIHRoZSBkZXN0aW5hdGlvbiBwaXhlbCB0eXBlLAotCSAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlCi0JICogbWFjcm8gdG8gYmxlbmQgb25lIHBpeGVsLgotCSAqLwotI2RlZmluZSBSTEVBTFBIQUJMSVQoUHR5cGUsIEN0eXBlLCBkb19ibGVuZCkJCQkJIFwKLQlkbyB7CQkJCQkJCQkgXAotCSAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsJCQkJCSBcCi0JICAgIGRvIHsJCQkJCQkJIFwKLQkJaW50IG9mcyA9IDA7CQkJCQkJIFwKLQkJLyogYmxpdCBvcGFxdWUgcGl4ZWxzIG9uIG9uZSBsaW5lICovCQkJIFwKLQkJZG8gewkJCQkJCQkgXAotCQkgICAgdW5zaWduZWQgcnVuOwkJCQkJIFwKLQkJICAgIG9mcyArPSAoKEN0eXBlICopc3JjYnVmKVswXTsJCQkgXAotCQkgICAgcnVuID0gKChDdHlwZSAqKXNyY2J1ZilbMV07CQkJCSBcCi0JCSAgICBzcmNidWYgKz0gMiAqIHNpemVvZihDdHlwZSk7CQkJIFwKLQkJICAgIGlmKHJ1bikgewkJCQkJCSBcCi0JCQlQSVhFTF9DT1BZKGRzdGJ1ZiArIG9mcyAqIHNpemVvZihQdHlwZSksIHNyY2J1ZiwgXAotCQkJCSAgIHJ1biwgc2l6ZW9mKFB0eXBlKSk7CQkJIFwKLQkJCXNyY2J1ZiArPSBydW4gKiBzaXplb2YoUHR5cGUpOwkJCSBcCi0JCQlvZnMgKz0gcnVuOwkJCQkJIFwKLQkJICAgIH0gZWxzZSBpZighb2ZzKQkJCQkJIFwKLQkJCWdvdG8gZG9uZTsJCQkJCSBcCi0JCX0gd2hpbGUob2ZzIDwgdyk7CQkJCQkgXAotCQkvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovCQkJCSBcCi0JCWlmKHNpemVvZihQdHlwZSkgPT0gMikJCQkJCSBcCi0JCSAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOwkJIAkgXAotCQkvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovCQkgXAotCQlvZnMgPSAwOwkJCQkJCSBcCi0JCWRvIHsJCQkJCQkJIFwKLQkJICAgIHVuc2lnbmVkIHJ1bjsJCQkJCSBcCi0JCSAgICBvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOwkJCSBcCi0JCSAgICBydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07CQkJIFwKLQkJICAgIHNyY2J1ZiArPSA0OwkJCQkJIFwKLQkJICAgIGlmKHJ1bikgewkJCQkJCSBcCi0JCQlQdHlwZSAqZHN0ID0gKFB0eXBlICopZHN0YnVmICsgb2ZzOwkJIFwKLQkJCXVuc2lnbmVkIGk7CQkJCQkgXAotCQkJZm9yKGkgPSAwOyBpIDwgcnVuOyBpKyspIHsJCQkgXAotCQkJICAgIFVpbnQzMiBzcmMgPSAqKFVpbnQzMiAqKXNyY2J1ZjsJCSBcCi0JCQkgICAgZG9fYmxlbmQoc3JjLCAqZHN0KTsJCQkgXAotCQkJICAgIHNyY2J1ZiArPSA0OwkJCQkgXAotCQkJICAgIGRzdCsrOwkJCQkJIFwKLQkJCX0JCQkJCQkgXAotCQkJb2ZzICs9IHJ1bjsJCQkJCSBcCi0JCSAgICB9CQkJCQkJCSBcCi0JCX0gd2hpbGUob2ZzIDwgdyk7CQkJCQkgXAotCQlkc3RidWYgKz0gZHN0LT5waXRjaDsJCQkJCSBcCi0JICAgIH0gd2hpbGUoLS1saW5lY291bnQpOwkJCQkJIFwKLQl9IHdoaWxlKDApCi0KLQlzd2l0Y2goZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKLQljYXNlIDI6Ci0JICAgIGlmKGRmLT5HbWFzayA9PSAweDA3ZTAgfHwgZGYtPlJtYXNrID09IDB4MDdlMAotCSAgICAgICB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQotCQlSTEVBTFBIQUJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTY1KTsKLQkgICAgZWxzZQotCQlSTEVBTFBIQUJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTU1KTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBSTEVBTFBIQUJMSVQoVWludDMyLCBVaW50MTYsIEJMSVRfVFJBTlNMXzg4OCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSBkb25lOgotICAgIC8qIFVubG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKLQlTRExfVW5sb2NrU3VyZmFjZShkc3QpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIEF1eGlsaWFyeSBmdW5jdGlvbnM6Ci0gKiBUaGUgZW5jb2RpbmcgZnVuY3Rpb25zIHRha2UgMzJicHAgcmdiICsgYSwgYW5kCi0gKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uLgotICogVGhlIGRlY29kaW5nIGZ1bmN0aW9ucyBjb3B5IHRvIDMyYnBwIHJnYiArIGEsIGFuZAotICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGZyb20gdGhlIHNvdXJjZS4KLSAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGVuY29kZXIgYW5kIHVuLVJMRSBjb2RlIGFuZCBhcmUgdGhlcmVmb3JlIG5vdAotICogaGlnaGx5IG9wdGltaXNlZC4KLSAqLwotCi0vKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDE2YnBwIHJnYiwgbG9zaW5nIGFscGhhICovCi1zdGF0aWMgaW50IGNvcHlfb3BhcXVlXzE2KHZvaWQgKmRzdCwgVWludDMyICpzcmMsIGludCBuLAotCQkJICBTRExfUGl4ZWxGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKLXsKLSAgICBpbnQgaTsKLSAgICBVaW50MTYgKmQgPSBkc3Q7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JdW5zaWduZWQgciwgZywgYjsKLQlSR0JfRlJPTV9QSVhFTCgqc3JjLCBzZm10LCByLCBnLCBiKTsKLQlQSVhFTF9GUk9NX1JHQigqZCwgZGZtdCwgciwgZywgYik7Ci0Jc3JjKys7Ci0JZCsrOwotICAgIH0KLSAgICByZXR1cm4gbiAqIDI7Ci19Ci0KLS8qIGRlY29kZSBvcGFxdWUgcGl4ZWxzIGZyb20gMTZicHAgdG8gMzJicHAgcmdiICsgYSAqLwotc3RhdGljIGludCB1bmNvcHlfb3BhcXVlXzE2KFVpbnQzMiAqZHN0LCB2b2lkICpzcmMsIGludCBuLAotCQkJICAgIFJMRURlc3RGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKLXsKLSAgICBpbnQgaTsKLSAgICBVaW50MTYgKnMgPSBzcmM7Ci0gICAgdW5zaWduZWQgYWxwaGEgPSBkZm10LT5BbWFzayA/IDI1NSA6IDA7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JdW5zaWduZWQgciwgZywgYjsKLQlSR0JfRlJPTV9QSVhFTCgqcywgc2ZtdCwgciwgZywgYik7Ci0JUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGFscGhhKTsKLQlzKys7Ci0JZHN0Kys7Ci0gICAgfQotICAgIHJldHVybiBuICogMjsKLX0KLQotCi0KLS8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMzJicHAgRzBSQUIgZm9ybWF0IGZvciBibGl0dGluZyBpbnRvIDU2NSAqLwotc3RhdGljIGludCBjb3B5X3RyYW5zbF81NjUodm9pZCAqZHN0LCBVaW50MzIgKnNyYywgaW50IG4sCi0JCQkgICBTRExfUGl4ZWxGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKLXsKLSAgICBpbnQgaTsKLSAgICBVaW50MzIgKmQgPSBkc3Q7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JdW5zaWduZWQgciwgZywgYiwgYTsKLQlVaW50MTYgcGl4OwotCVJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwotCVBJWEVMX0ZST01fUkdCKHBpeCwgZGZtdCwgciwgZywgYik7Ci0JKmQgPSAoKHBpeCAmIDB4N2UwKSA8PCAxNikgfCAocGl4ICYgMHhmODFmKSB8ICgoYSA8PCAyKSAmIDB4N2UwKTsKLQlzcmMrKzsKLQlkKys7Ci0gICAgfQotICAgIHJldHVybiBuICogNDsKLX0KLQotLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAzMmJwcCBHMFJBQiBmb3JtYXQgZm9yIGJsaXR0aW5nIGludG8gNTU1ICovCi1zdGF0aWMgaW50IGNvcHlfdHJhbnNsXzU1NSh2b2lkICpkc3QsIFVpbnQzMiAqc3JjLCBpbnQgbiwKLQkJCSAgIFNETF9QaXhlbEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQotewotICAgIGludCBpOwotICAgIFVpbnQzMiAqZCA9IGRzdDsKLSAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQl1bnNpZ25lZCByLCBnLCBiLCBhOwotCVVpbnQxNiBwaXg7Ci0JUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7Ci0JUElYRUxfRlJPTV9SR0IocGl4LCBkZm10LCByLCBnLCBiKTsKLQkqZCA9ICgocGl4ICYgMHgzZTApIDw8IDE2KSB8IChwaXggJiAweGZjMWYpIHwgKChhIDw8IDIpICYgMHgzZTApOwotCXNyYysrOwotCWQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG4gKiA0OwotfQotCi0vKiBkZWNvZGUgdHJhbnNsdWNlbnQgcGl4ZWxzIGZyb20gMzJicHAgR09SQUIgdG8gMzJicHAgcmdiICsgYSAqLwotc3RhdGljIGludCB1bmNvcHlfdHJhbnNsXzE2KFVpbnQzMiAqZHN0LCB2b2lkICpzcmMsIGludCBuLAotCQkJICAgIFJMRURlc3RGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKLXsKLSAgICBpbnQgaTsKLSAgICBVaW50MzIgKnMgPSBzcmM7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JdW5zaWduZWQgciwgZywgYiwgYTsKLQlVaW50MzIgcGl4ID0gKnMrKzsKLQlhID0gKHBpeCAmIDB4M2UwKSA+PiAyOwotCXBpeCA9IChwaXggJiB+MHgzZTApIHwgcGl4ID4+IDE2OwotCVJHQl9GUk9NX1BJWEVMKHBpeCwgc2ZtdCwgciwgZywgYik7Ci0JUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGEpOwotCWRzdCsrOwotICAgIH0KLSAgICByZXR1cm4gbiAqIDQ7Ci19Ci0KLS8qIGVuY29kZSAzMmJwcCByZ2JhIGludG8gMzJicHAgcmdiYSwga2VlcGluZyBhbHBoYSAoZHVhbCBwdXJwb3NlKSAqLwotc3RhdGljIGludCBjb3B5XzMyKHZvaWQgKmRzdCwgVWludDMyICpzcmMsIGludCBuLAotCQkgICBTRExfUGl4ZWxGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKLXsKLSAgICBpbnQgaTsKLSAgICBVaW50MzIgKmQgPSBkc3Q7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JdW5zaWduZWQgciwgZywgYiwgYTsKLQlVaW50MzIgcGl4ZWw7Ci0JUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7Ci0JUElYRUxfRlJPTV9SR0IocGl4ZWwsIGRmbXQsIHIsIGcsIGIpOwotCSpkKysgPSBwaXhlbCB8IGEgPDwgMjQ7Ci0Jc3JjKys7Ci0gICAgfQotICAgIHJldHVybiBuICogNDsKLX0KLQotLyogZGVjb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCi1zdGF0aWMgaW50IHVuY29weV8zMihVaW50MzIgKmRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKLQkJICAgICBSTEVEZXN0Rm9ybWF0ICpzZm10LCBTRExfUGl4ZWxGb3JtYXQgKmRmbXQpCi17Ci0gICAgaW50IGk7Ci0gICAgVWludDMyICpzID0gc3JjOwotICAgIGZvcihpID0gMDsgaSA8IG47IGkrKykgewotCXVuc2lnbmVkIHIsIGcsIGIsIGE7Ci0JVWludDMyIHBpeGVsID0gKnMrKzsKLQlSR0JfRlJPTV9QSVhFTChwaXhlbCwgc2ZtdCwgciwgZywgYik7Ci0JYSA9IHBpeGVsID4+IDI0OwotCVBJWEVMX0ZST01fUkdCQSgqZHN0LCBkZm10LCByLCBnLCBiLCBhKTsKLQlkc3QrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG4gKiA0OwotfQotCi0jZGVmaW5lIElTT1BBUVVFKHBpeGVsLCBmbXQpICgoKChwaXhlbCkgJiBmbXQtPkFtYXNrKSA+PiBmbXQtPkFzaGlmdCkgPT0gMjU1KQotCi0jZGVmaW5lIElTVFJBTlNMKHBpeGVsLCBmbXQpCVwKLSAgICAoKHVuc2lnbmVkKSgoKChwaXhlbCkgJiBmbXQtPkFtYXNrKSA+PiBmbXQtPkFzaGlmdCkgLSAxVSkgPCAyNTRVKQotCi0vKiBjb252ZXJ0IHN1cmZhY2UgdG8gYmUgcXVpY2tseSBhbHBoYS1ibGl0dGFibGUgb250byBkZXN0LCBpZiBwb3NzaWJsZSAqLwotc3RhdGljIGludCBSTEVBbHBoYVN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0gICAgU0RMX1N1cmZhY2UgKmRlc3Q7Ci0gICAgU0RMX1BpeGVsRm9ybWF0ICpkZjsKLSAgICBpbnQgbWF4c2l6ZSA9IDA7Ci0gICAgaW50IG1heF9vcGFxdWVfcnVuOwotICAgIGludCBtYXhfdHJhbnNsX3J1biA9IDY1NTM1OwotICAgIHVuc2lnbmVkIG1hc2tzdW07Ci0gICAgVWludDggKnJsZWJ1ZiwgKmRzdDsKLSAgICBpbnQgKCpjb3B5X29wYXF1ZSkodm9pZCAqLCBVaW50MzIgKiwgaW50LAotCQkgICAgICAgU0RMX1BpeGVsRm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKLSAgICBpbnQgKCpjb3B5X3RyYW5zbCkodm9pZCAqLCBVaW50MzIgKiwgaW50LAotCQkgICAgICAgU0RMX1BpeGVsRm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKLQotICAgIGRlc3QgPSBzdXJmYWNlLT5tYXAtPmRzdDsKLSAgICBpZighZGVzdCkKLQlyZXR1cm4gLTE7Ci0gICAgZGYgPSBkZXN0LT5mb3JtYXQ7Ci0gICAgaWYoc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gMzIpCi0JcmV0dXJuIC0xOwkJLyogb25seSAzMmJwcCBzb3VyY2Ugc3VwcG9ydGVkICovCi0KLSAgICAvKiBmaW5kIG91dCB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpcyBvbmUgd2Ugc3VwcG9ydCwKLSAgICAgICBhbmQgZGV0ZXJtaW5lIHRoZSBtYXggc2l6ZSBvZiB0aGUgZW5jb2RlZCByZXN1bHQgKi8KLSAgICBtYXNrc3VtID0gZGYtPlJtYXNrIHwgZGYtPkdtYXNrIHwgZGYtPkJtYXNrOwotICAgIHN3aXRjaChkZi0+Qnl0ZXNQZXJQaXhlbCkgewotICAgIGNhc2UgMjoKLQkvKiAxNmJwcDogb25seSBzdXBwb3J0IDU2NSBhbmQgNTU1IGZvcm1hdHMgKi8KLQlzd2l0Y2gobWFza3N1bSkgewotCWNhc2UgMHhmZmZmOgotCSAgICBpZihkZi0+R21hc2sgPT0gMHgwN2UwCi0JICAgICAgIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkgewotCQljb3B5X29wYXF1ZSA9IGNvcHlfb3BhcXVlXzE2OwotCQljb3B5X3RyYW5zbCA9IGNvcHlfdHJhbnNsXzU2NTsKLQkgICAgfSBlbHNlCi0JCXJldHVybiAtMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweDdmZmY6Ci0JICAgIGlmKGRmLT5HbWFzayA9PSAweDAzZTAKLQkgICAgICAgfHwgZGYtPlJtYXNrID09IDB4MDNlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwM2UwKSB7Ci0JCWNvcHlfb3BhcXVlID0gY29weV9vcGFxdWVfMTY7Ci0JCWNvcHlfdHJhbnNsID0gY29weV90cmFuc2xfNTU1OwotCSAgICB9IGVsc2UKLQkJcmV0dXJuIC0xOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICByZXR1cm4gLTE7Ci0JfQotCW1heF9vcGFxdWVfcnVuID0gMjU1OwkvKiBydW5zIHN0b3JlZCBhcyBieXRlcyAqLwotCi0JLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IHBpeGVscywKLQkgICB3aXRoIHJvb20gZm9yIGFsaWdubWVudCBwYWRkaW5nIGJldHdlZW4gbGluZXMgKi8KLQltYXhzaXplID0gc3VyZmFjZS0+aCAqICgyICsgKDQgKyAyKSAqIChzdXJmYWNlLT53ICsgMSkpICsgMjsKLQlicmVhazsKLSAgICBjYXNlIDQ6Ci0JaWYobWFza3N1bSAhPSAweDAwZmZmZmZmKQotCSAgICByZXR1cm4gLTE7CQkvKiByZXF1aXJlcyB1bnVzZWQgaGlnaCBieXRlICovCi0JY29weV9vcGFxdWUgPSBjb3B5XzMyOwotCWNvcHlfdHJhbnNsID0gY29weV8zMjsKLQltYXhfb3BhcXVlX3J1biA9IDI1NTsJLyogcnVucyBzdG9yZWQgYXMgc2hvcnQgaW50cyAqLwotCi0JLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IHBpeGVscyAqLwotCW1heHNpemUgPSBzdXJmYWNlLT5oICogMiAqIDQgKiAoc3VyZmFjZS0+dyArIDEpICsgNDsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCXJldHVybiAtMTsJCS8qIGFueXRoaW5nIGVsc2UgdW5zdXBwb3J0ZWQgcmlnaHQgbm93ICovCi0gICAgfQotCi0gICAgbWF4c2l6ZSArPSBzaXplb2YoUkxFRGVzdEZvcm1hdCk7Ci0gICAgcmxlYnVmID0gKFVpbnQ4ICopU0RMX21hbGxvYyhtYXhzaXplKTsKLSAgICBpZighcmxlYnVmKSB7Ci0JU0RMX091dE9mTWVtb3J5KCk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICB7Ci0JLyogc2F2ZSB0aGUgZGVzdGluYXRpb24gZm9ybWF0IHNvIHdlIGNhbiB1bmRvIHRoZSBlbmNvZGluZyBsYXRlciAqLwotCVJMRURlc3RGb3JtYXQgKnIgPSAoUkxFRGVzdEZvcm1hdCAqKXJsZWJ1ZjsKLQlyLT5CeXRlc1BlclBpeGVsID0gZGYtPkJ5dGVzUGVyUGl4ZWw7Ci0Jci0+Umxvc3MgPSBkZi0+Umxvc3M7Ci0Jci0+R2xvc3MgPSBkZi0+R2xvc3M7Ci0Jci0+Qmxvc3MgPSBkZi0+Qmxvc3M7Ci0Jci0+UnNoaWZ0ID0gZGYtPlJzaGlmdDsKLQlyLT5Hc2hpZnQgPSBkZi0+R3NoaWZ0OwotCXItPkJzaGlmdCA9IGRmLT5Cc2hpZnQ7Ci0Jci0+QXNoaWZ0ID0gZGYtPkFzaGlmdDsKLQlyLT5SbWFzayA9IGRmLT5SbWFzazsKLQlyLT5HbWFzayA9IGRmLT5HbWFzazsKLQlyLT5CbWFzayA9IGRmLT5CbWFzazsKLQlyLT5BbWFzayA9IGRmLT5BbWFzazsKLSAgICB9Ci0gICAgZHN0ID0gcmxlYnVmICsgc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwotCi0gICAgLyogRG8gdGhlIGFjdHVhbCBlbmNvZGluZyAqLwotICAgIHsKLQlpbnQgeCwgeTsKLQlpbnQgaCA9IHN1cmZhY2UtPmgsIHcgPSBzdXJmYWNlLT53OwotCVNETF9QaXhlbEZvcm1hdCAqc2YgPSBzdXJmYWNlLT5mb3JtYXQ7Ci0JVWludDMyICpzcmMgPSAoVWludDMyICopc3VyZmFjZS0+cGl4ZWxzOwotCVVpbnQ4ICpsYXN0bGluZSA9IGRzdDsJLyogZW5kIG9mIGxhc3Qgbm9uLWJsYW5rIGxpbmUgKi8KLQotCS8qIG9wYXF1ZSBjb3VudHMgYXJlIDggb3IgMTYgYml0cywgZGVwZW5kaW5nIG9uIHRhcmdldCBkZXB0aCAqLwotI2RlZmluZSBBRERfT1BBUVVFX0NPVU5UUyhuLCBtKQkJCVwKLQlpZihkZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0KSB7CQlcCi0JICAgICgoVWludDE2ICopZHN0KVswXSA9IG47CQlcCi0JICAgICgoVWludDE2ICopZHN0KVsxXSA9IG07CQlcCi0JICAgIGRzdCArPSA0OwkJCQlcCi0JfSBlbHNlIHsJCQkJXAotCSAgICBkc3RbMF0gPSBuOwkJCQlcCi0JICAgIGRzdFsxXSA9IG07CQkJCVwKLQkgICAgZHN0ICs9IDI7CQkJCVwKLQl9Ci0KLQkvKiB0cmFuc2x1Y2VudCBjb3VudHMgYXJlIGFsd2F5cyAxNiBiaXQgKi8KLSNkZWZpbmUgQUREX1RSQU5TTF9DT1VOVFMobiwgbSkJCVwKLQkoKChVaW50MTYgKilkc3QpWzBdID0gbiwgKChVaW50MTYgKilkc3QpWzFdID0gbSwgZHN0ICs9IDQpCi0KLQlmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKLQkgICAgaW50IHJ1bnN0YXJ0LCBza2lwc3RhcnQ7Ci0JICAgIGludCBibGFua2xpbmUgPSAwOwotCSAgICAvKiBGaXJzdCBlbmNvZGUgYWxsIG9wYXF1ZSBwaXhlbHMgb2YgYSBzY2FuIGxpbmUgKi8KLQkgICAgeCA9IDA7Ci0JICAgIGRvIHsKLQkJaW50IHJ1biwgc2tpcCwgbGVuOwotCQlza2lwc3RhcnQgPSB4OwotCQl3aGlsZSh4IDwgdyAmJiAhSVNPUEFRVUUoc3JjW3hdLCBzZikpCi0JCSAgICB4Kys7Ci0JCXJ1bnN0YXJ0ID0geDsKLQkJd2hpbGUoeCA8IHcgJiYgSVNPUEFRVUUoc3JjW3hdLCBzZikpCi0JCSAgICB4Kys7Ci0JCXNraXAgPSBydW5zdGFydCAtIHNraXBzdGFydDsKLQkJaWYoc2tpcCA9PSB3KQotCQkgICAgYmxhbmtsaW5lID0gMTsKLQkJcnVuID0geCAtIHJ1bnN0YXJ0OwotCQl3aGlsZShza2lwID4gbWF4X29wYXF1ZV9ydW4pIHsKLQkJICAgIEFERF9PUEFRVUVfQ09VTlRTKG1heF9vcGFxdWVfcnVuLCAwKTsKLQkJICAgIHNraXAgLT0gbWF4X29wYXF1ZV9ydW47Ci0JCX0KLQkJbGVuID0gTUlOKHJ1biwgbWF4X29wYXF1ZV9ydW4pOwotCQlBRERfT1BBUVVFX0NPVU5UUyhza2lwLCBsZW4pOwotCQlkc3QgKz0gY29weV9vcGFxdWUoZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwotCQlydW5zdGFydCArPSBsZW47Ci0JCXJ1biAtPSBsZW47Ci0JCXdoaWxlKHJ1bikgewotCQkgICAgbGVuID0gTUlOKHJ1biwgbWF4X29wYXF1ZV9ydW4pOwotCQkgICAgQUREX09QQVFVRV9DT1VOVFMoMCwgbGVuKTsKLQkJICAgIGRzdCArPSBjb3B5X29wYXF1ZShkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7Ci0JCSAgICBydW5zdGFydCArPSBsZW47Ci0JCSAgICBydW4gLT0gbGVuOwotCQl9Ci0JICAgIH0gd2hpbGUoeCA8IHcpOwotCi0JICAgIC8qIE1ha2Ugc3VyZSB0aGUgbmV4dCBvdXRwdXQgYWRkcmVzcyBpcyAzMi1iaXQgYWxpZ25lZCAqLwotCSAgICBkc3QgKz0gKHVpbnRwdHJfdClkc3QgJiAyOwotCi0JICAgIC8qIE5leHQsIGVuY29kZSBhbGwgdHJhbnNsdWNlbnQgcGl4ZWxzIG9mIHRoZSBzYW1lIHNjYW4gbGluZSAqLwotCSAgICB4ID0gMDsKLQkgICAgZG8gewotCQlpbnQgcnVuLCBza2lwLCBsZW47Ci0JCXNraXBzdGFydCA9IHg7Ci0JCXdoaWxlKHggPCB3ICYmICFJU1RSQU5TTChzcmNbeF0sIHNmKSkKLQkJICAgIHgrKzsKLQkJcnVuc3RhcnQgPSB4OwotCQl3aGlsZSh4IDwgdyAmJiBJU1RSQU5TTChzcmNbeF0sIHNmKSkKLQkJICAgIHgrKzsKLQkJc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwotCQlibGFua2xpbmUgJj0gKHNraXAgPT0gdyk7Ci0JCXJ1biA9IHggLSBydW5zdGFydDsKLQkJd2hpbGUoc2tpcCA+IG1heF90cmFuc2xfcnVuKSB7Ci0JCSAgICBBRERfVFJBTlNMX0NPVU5UUyhtYXhfdHJhbnNsX3J1biwgMCk7Ci0JCSAgICBza2lwIC09IG1heF90cmFuc2xfcnVuOwotCQl9Ci0JCWxlbiA9IE1JTihydW4sIG1heF90cmFuc2xfcnVuKTsKLQkJQUREX1RSQU5TTF9DT1VOVFMoc2tpcCwgbGVuKTsKLQkJZHN0ICs9IGNvcHlfdHJhbnNsKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKLQkJcnVuc3RhcnQgKz0gbGVuOwotCQlydW4gLT0gbGVuOwotCQl3aGlsZShydW4pIHsKLQkJICAgIGxlbiA9IE1JTihydW4sIG1heF90cmFuc2xfcnVuKTsKLQkJICAgIEFERF9UUkFOU0xfQ09VTlRTKDAsIGxlbik7Ci0JCSAgICBkc3QgKz0gY29weV90cmFuc2woZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwotCQkgICAgcnVuc3RhcnQgKz0gbGVuOwotCQkgICAgcnVuIC09IGxlbjsKLQkJfQotCQlpZighYmxhbmtsaW5lKQotCQkgICAgbGFzdGxpbmUgPSBkc3Q7Ci0JICAgIH0gd2hpbGUoeCA8IHcpOwotCi0JICAgIHNyYyArPSBzdXJmYWNlLT5waXRjaCA+PiAyOwotCX0KLQlkc3QgPSBsYXN0bGluZTsJCS8qIGJhY2sgdXAgcGFzdCB0cmFpbGluZyBibGFuayBsaW5lcyAqLwotCUFERF9PUEFRVUVfQ09VTlRTKDAsIDApOwotICAgIH0KLQotI3VuZGVmIEFERF9PUEFRVUVfQ09VTlRTCi0jdW5kZWYgQUREX1RSQU5TTF9DT1VOVFMKLQotICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgaXQgZW5jb2RlZCwgcmVsZWFzZSB0aGUgb3JpZ2luYWwgcGl4ZWxzICovCi0gICAgaWYoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1BSRUFMTE9DKSAhPSBTRExfUFJFQUxMT0MKLSAgICAgICAmJiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSAhPSBTRExfSFdTVVJGQUNFKSB7Ci0JU0RMX2ZyZWUoIHN1cmZhY2UtPnBpeGVscyApOwotCXN1cmZhY2UtPnBpeGVscyA9IE5VTEw7Ci0gICAgfQotCi0gICAgLyogcmVhbGxvYyB0aGUgYnVmZmVyIHRvIHJlbGVhc2UgdW51c2VkIG1lbW9yeSAqLwotICAgIHsKLQlVaW50OCAqcCA9IFNETF9yZWFsbG9jKHJsZWJ1ZiwgZHN0IC0gcmxlYnVmKTsKLQlpZighcCkKLQkgICAgcCA9IHJsZWJ1ZjsKLQlzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhID0gcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFVpbnQzMiBnZXRwaXhfOChVaW50OCAqc3JjYnVmKQotewotICAgIHJldHVybiAqc3JjYnVmOwotfQotCi1zdGF0aWMgVWludDMyIGdldHBpeF8xNihVaW50OCAqc3JjYnVmKQotewotICAgIHJldHVybiAqKFVpbnQxNiAqKXNyY2J1ZjsKLX0KLQotc3RhdGljIFVpbnQzMiBnZXRwaXhfMjQoVWludDggKnNyY2J1ZikKLXsKLSNpZiBTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOCi0gICAgcmV0dXJuIHNyY2J1ZlswXSArIChzcmNidWZbMV0gPDwgOCkgKyAoc3JjYnVmWzJdIDw8IDE2KTsKLSNlbHNlCi0gICAgcmV0dXJuIChzcmNidWZbMF0gPDwgMTYpICsgKHNyY2J1ZlsxXSA8PCA4KSArIHNyY2J1ZlsyXTsKLSNlbmRpZgotfQotCi1zdGF0aWMgVWludDMyIGdldHBpeF8zMihVaW50OCAqc3JjYnVmKQotewotICAgIHJldHVybiAqKFVpbnQzMiAqKXNyY2J1ZjsKLX0KLQotdHlwZWRlZiBVaW50MzIgKCpnZXRwaXhfZnVuYykoVWludDggKik7Ci0KLXN0YXRpYyBnZXRwaXhfZnVuYyBnZXRwaXhlc1s0XSA9IHsKLSAgICBnZXRwaXhfOCwgZ2V0cGl4XzE2LCBnZXRwaXhfMjQsIGdldHBpeF8zMgotfTsKLQotc3RhdGljIGludCBSTEVDb2xvcmtleVN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0gICAgICAgIFVpbnQ4ICpybGVidWYsICpkc3Q7Ci0JaW50IG1heG47Ci0JaW50IHk7Ci0JVWludDggKnNyY2J1ZiwgKmN1cmJ1ZiwgKmxhc3RsaW5lOwotCWludCBtYXhzaXplID0gMDsKLQlpbnQgc2tpcCwgcnVuOwotCWludCBicHAgPSBzdXJmYWNlLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JZ2V0cGl4X2Z1bmMgZ2V0cGl4OwotCVVpbnQzMiBja2V5LCByZ2JtYXNrOwotCWludCB3LCBoOwotCi0JLyogY2FsY3VsYXRlIHRoZSB3b3JzdCBjYXNlIHNpemUgZm9yIHRoZSBjb21wcmVzc2VkIHN1cmZhY2UgKi8KLQlzd2l0Y2goYnBwKSB7Ci0JY2FzZSAxOgotCSAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgcGl4ZWxzLAotCSAgICAgICBzdGFydGluZyB3aXRoIGFuIG9wYXF1ZSBwaXhlbCAqLwotCSAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqIDMgKiAoc3VyZmFjZS0+dyAvIDIgKyAxKSArIDI7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQljYXNlIDM6Ci0JICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCAyNTUgcGl4ZWxzIHdpZGUgKi8KLQkgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoMiAqIChzdXJmYWNlLT53IC8gMjU1ICsgMSkKLQkJCQkgICAgKyBzdXJmYWNlLT53ICogYnBwKSArIDI7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgLyogd29yc3QgY2FzZSBpcyBzb2xpZCBydW5zLCBhdCBtb3N0IDY1NTM1IHBpeGVscyB3aWRlICovCi0JICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDQgKiAoc3VyZmFjZS0+dyAvIDY1NTM1ICsgMSkKLQkJCQkgICAgKyBzdXJmYWNlLT53ICogNCkgKyA0OwotCSAgICBicmVhazsKLQl9Ci0KLQlybGVidWYgPSAoVWludDggKilTRExfbWFsbG9jKG1heHNpemUpOwotCWlmICggcmxlYnVmID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFNldCB1cCB0aGUgY29udmVyc2lvbiAqLwotCXNyY2J1ZiA9IChVaW50OCAqKXN1cmZhY2UtPnBpeGVsczsKLQljdXJidWYgPSBzcmNidWY7Ci0JbWF4biA9IGJwcCA9PSA0ID8gNjU1MzUgOiAyNTU7Ci0Jc2tpcCA9IHJ1biA9IDA7Ci0JZHN0ID0gcmxlYnVmOwotCXJnYm1hc2sgPSB+c3VyZmFjZS0+Zm9ybWF0LT5BbWFzazsKLQlja2V5ID0gc3VyZmFjZS0+Zm9ybWF0LT5jb2xvcmtleSAmIHJnYm1hc2s7Ci0JbGFzdGxpbmUgPSBkc3Q7Ci0JZ2V0cGl4ID0gZ2V0cGl4ZXNbYnBwIC0gMV07Ci0JdyA9IHN1cmZhY2UtPnc7Ci0JaCA9IHN1cmZhY2UtPmg7Ci0KLSNkZWZpbmUgQUREX0NPVU5UUyhuLCBtKQkJCVwKLQlpZihicHAgPT0gNCkgewkJCQlcCi0JICAgICgoVWludDE2ICopZHN0KVswXSA9IG47CQlcCi0JICAgICgoVWludDE2ICopZHN0KVsxXSA9IG07CQlcCi0JICAgIGRzdCArPSA0OwkJCQlcCi0JfSBlbHNlIHsJCQkJXAotCSAgICBkc3RbMF0gPSBuOwkJCQlcCi0JICAgIGRzdFsxXSA9IG07CQkJCVwKLQkgICAgZHN0ICs9IDI7CQkJCVwKLQl9Ci0KLQlmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKLQkgICAgaW50IHggPSAwOwotCSAgICBpbnQgYmxhbmtsaW5lID0gMDsKLQkgICAgZG8gewotCQlpbnQgcnVuLCBza2lwLCBsZW47Ci0JCWludCBydW5zdGFydDsKLQkJaW50IHNraXBzdGFydCA9IHg7Ci0KLQkJLyogZmluZCBydW4gb2YgdHJhbnNwYXJlbnQsIHRoZW4gb3BhcXVlIHBpeGVscyAqLwotCQl3aGlsZSh4IDwgdyAmJiAoZ2V0cGl4KHNyY2J1ZiArIHggKiBicHApICYgcmdibWFzaykgPT0gY2tleSkKLQkJICAgIHgrKzsKLQkJcnVuc3RhcnQgPSB4OwotCQl3aGlsZSh4IDwgdyAmJiAoZ2V0cGl4KHNyY2J1ZiArIHggKiBicHApICYgcmdibWFzaykgIT0gY2tleSkKLQkJICAgIHgrKzsKLQkJc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwotCQlpZihza2lwID09IHcpCi0JCSAgICBibGFua2xpbmUgPSAxOwotCQlydW4gPSB4IC0gcnVuc3RhcnQ7Ci0KLQkJLyogZW5jb2RlIHNlZ21lbnQgKi8KLQkJd2hpbGUoc2tpcCA+IG1heG4pIHsKLQkJICAgIEFERF9DT1VOVFMobWF4biwgMCk7Ci0JCSAgICBza2lwIC09IG1heG47Ci0JCX0KLQkJbGVuID0gTUlOKHJ1biwgbWF4bik7Ci0JCUFERF9DT1VOVFMoc2tpcCwgbGVuKTsKLQkJU0RMX21lbWNweShkc3QsIHNyY2J1ZiArIHJ1bnN0YXJ0ICogYnBwLCBsZW4gKiBicHApOwotCQlkc3QgKz0gbGVuICogYnBwOwotCQlydW4gLT0gbGVuOwotCQlydW5zdGFydCArPSBsZW47Ci0JCXdoaWxlKHJ1bikgewotCQkgICAgbGVuID0gTUlOKHJ1biwgbWF4bik7Ci0JCSAgICBBRERfQ09VTlRTKDAsIGxlbik7Ci0JCSAgICBTRExfbWVtY3B5KGRzdCwgc3JjYnVmICsgcnVuc3RhcnQgKiBicHAsIGxlbiAqIGJwcCk7Ci0JCSAgICBkc3QgKz0gbGVuICogYnBwOwotCQkgICAgcnVuc3RhcnQgKz0gbGVuOwotCQkgICAgcnVuIC09IGxlbjsKLQkJfQotCQlpZighYmxhbmtsaW5lKQotCQkgICAgbGFzdGxpbmUgPSBkc3Q7Ci0JICAgIH0gd2hpbGUoeCA8IHcpOwotCi0JICAgIHNyY2J1ZiArPSBzdXJmYWNlLT5waXRjaDsKLQl9Ci0JZHN0ID0gbGFzdGxpbmU7CQkvKiBiYWNrIHVwIGJhc3QgdHJhaWxpbmcgYmxhbmsgbGluZXMgKi8KLQlBRERfQ09VTlRTKDAsIDApOwotCi0jdW5kZWYgQUREX0NPVU5UUwotCi0JLyogTm93IHRoYXQgd2UgaGF2ZSBpdCBlbmNvZGVkLCByZWxlYXNlIHRoZSBvcmlnaW5hbCBwaXhlbHMgKi8KLQlpZigoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpICE9IFNETF9QUkVBTExPQwotCSAgICYmIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICE9IFNETF9IV1NVUkZBQ0UpIHsKLQkgICAgU0RMX2ZyZWUoIHN1cmZhY2UtPnBpeGVscyApOwotCSAgICBzdXJmYWNlLT5waXhlbHMgPSBOVUxMOwotCX0KLQotCS8qIHJlYWxsb2MgdGhlIGJ1ZmZlciB0byByZWxlYXNlIHVudXNlZCBtZW1vcnkgKi8KLQl7Ci0JICAgIC8qIElmIHJlYWxsb2MgcmV0dXJucyBOVUxMLCB0aGUgb3JpZ2luYWwgYmxvY2sgaXMgbGVmdCBpbnRhY3QgKi8KLQkgICAgVWludDggKnAgPSBTRExfcmVhbGxvYyhybGVidWYsIGRzdCAtIHJsZWJ1Zik7Ci0JICAgIGlmKCFwKQotCQlwID0gcmxlYnVmOwotCSAgICBzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhID0gcDsKLQl9Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLWludCBTRExfUkxFU3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpbnQgcmV0Y29kZTsKLQotCS8qIENsZWFyIGFueSBwcmV2aW91cyBSTEUgY29udmVyc2lvbiAqLwotCWlmICggKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwgKSB7Ci0JCVNETF9VblJMRVN1cmZhY2Uoc3VyZmFjZSwgMSk7Ci0JfQotCi0JLyogV2UgZG9uJ3Qgc3VwcG9ydCBSTEUgZW5jb2Rpbmcgb2YgYml0bWFwcyAqLwotCWlmICggc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPCA4ICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIExvY2sgdGhlIHN1cmZhY2UgaWYgaXQncyBpbiBoYXJkd2FyZSAqLwotCWlmICggU0RMX01VU1RMT0NLKHN1cmZhY2UpICkgewotCQlpZiAoIFNETF9Mb2NrU3VyZmFjZShzdXJmYWNlKSA8IDAgKSB7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JfQotCi0JLyogRW5jb2RlICovCi0JaWYoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkpIHsKLQkgICAgcmV0Y29kZSA9IFJMRUNvbG9ya2V5U3VyZmFjZShzdXJmYWNlKTsKLQl9IGVsc2UgewotCSAgICBpZigoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQQotCSAgICAgICAmJiBzdXJmYWNlLT5mb3JtYXQtPkFtYXNrICE9IDApCi0JCXJldGNvZGUgPSBSTEVBbHBoYVN1cmZhY2Uoc3VyZmFjZSk7Ci0JICAgIGVsc2UKLQkJcmV0Y29kZSA9IC0xOwkvKiBubyBSTEUgZm9yIHBlci1zdXJmYWNlIGFscGhhIHNhbnMgY2tleSAqLwotCX0KLQotCS8qIFVubG9jayB0aGUgc3VyZmFjZSBpZiBpdCdzIGluIGhhcmR3YXJlICovCi0JaWYgKCBTRExfTVVTVExPQ0soc3VyZmFjZSkgKSB7Ci0JCVNETF9VbmxvY2tTdXJmYWNlKHN1cmZhY2UpOwotCX0KLQotCWlmKHJldGNvZGUgPCAwKQotCSAgICByZXR1cm4gLTE7Ci0KLQkvKiBUaGUgc3VyZmFjZSBpcyBub3cgYWNjZWxlcmF0ZWQgKi8KLQlzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qCi0gKiBVbi1STEUgYSBzdXJmYWNlIHdpdGggcGl4ZWwgYWxwaGEKLSAqIFRoaXMgbWF5IG5vdCBnaXZlIGJhY2sgZXhhY3RseSB0aGUgaW1hZ2UgYmVmb3JlIFJMRS1lbmNvZGluZzsgYWxsCi0gKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHBpeGVscyB3aWxsIGJlIGxvc3QsIGFuZCBjb2xvdXIgYW5kIGFscGhhIGRlcHRoCi0gKiBtYXkgaGF2ZSBiZWVuIHJlZHVjZWQgKHdoZW4gZW5jb2RpbmcgZm9yIDE2YnBwIHRhcmdldHMpLgotICovCi1zdGF0aWMgU0RMX2Jvb2wgVW5STEVBbHBoYShTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLSAgICBVaW50OCAqc3JjYnVmOwotICAgIFVpbnQzMiAqZHN0OwotICAgIFNETF9QaXhlbEZvcm1hdCAqc2YgPSBzdXJmYWNlLT5mb3JtYXQ7Ci0gICAgUkxFRGVzdEZvcm1hdCAqZGYgPSBzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhOwotICAgIGludCAoKnVuY29weV9vcGFxdWUpKFVpbnQzMiAqLCB2b2lkICosIGludCwKLQkJCSBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKLSAgICBpbnQgKCp1bmNvcHlfdHJhbnNsKShVaW50MzIgKiwgdm9pZCAqLCBpbnQsCi0JCQkgUkxFRGVzdEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7Ci0gICAgaW50IHcgPSBzdXJmYWNlLT53OwotICAgIGludCBicHAgPSBkZi0+Qnl0ZXNQZXJQaXhlbDsKLQotICAgIGlmKGJwcCA9PSAyKSB7Ci0JdW5jb3B5X29wYXF1ZSA9IHVuY29weV9vcGFxdWVfMTY7Ci0JdW5jb3B5X3RyYW5zbCA9IHVuY29weV90cmFuc2xfMTY7Ci0gICAgfSBlbHNlIHsKLQl1bmNvcHlfb3BhcXVlID0gdW5jb3B5X3RyYW5zbCA9IHVuY29weV8zMjsKLSAgICB9Ci0KLSAgICBzdXJmYWNlLT5waXhlbHMgPSBTRExfbWFsbG9jKHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7Ci0gICAgaWYgKCAhc3VyZmFjZS0+cGl4ZWxzICkgewotICAgICAgICByZXR1cm4oU0RMX0ZBTFNFKTsKLSAgICB9Ci0gICAgLyogZmlsbCBiYWNrZ3JvdW5kIHdpdGggdHJhbnNwYXJlbnQgcGl4ZWxzICovCi0gICAgU0RMX21lbXNldChzdXJmYWNlLT5waXhlbHMsIDAsIHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7Ci0KLSAgICBkc3QgPSBzdXJmYWNlLT5waXhlbHM7Ci0gICAgc3JjYnVmID0gKFVpbnQ4ICopKGRmICsgMSk7Ci0gICAgZm9yKDs7KSB7Ci0JLyogY29weSBvcGFxdWUgcGl4ZWxzICovCi0JaW50IG9mcyA9IDA7Ci0JZG8gewotCSAgICB1bnNpZ25lZCBydW47Ci0JICAgIGlmKGJwcCA9PSAyKSB7Ci0JCW9mcyArPSBzcmNidWZbMF07Ci0JCXJ1biA9IHNyY2J1ZlsxXTsKLQkJc3JjYnVmICs9IDI7Ci0JICAgIH0gZWxzZSB7Ci0JCW9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07Ci0JCXJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsKLQkJc3JjYnVmICs9IDQ7Ci0JICAgIH0KLQkgICAgaWYocnVuKSB7Ci0JCXNyY2J1ZiArPSB1bmNvcHlfb3BhcXVlKGRzdCArIG9mcywgc3JjYnVmLCBydW4sIGRmLCBzZik7Ci0JCW9mcyArPSBydW47Ci0JICAgIH0gZWxzZSBpZighb2ZzKQotCQlyZXR1cm4oU0RMX1RSVUUpOwotCX0gd2hpbGUob2ZzIDwgdyk7Ci0KLQkvKiBza2lwIHBhZGRpbmcgaWYgbmVlZGVkICovCi0JaWYoYnBwID09IDIpCi0JICAgIHNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7Ci0JCi0JLyogY29weSB0cmFuc2x1Y2VudCBwaXhlbHMgKi8KLQlvZnMgPSAwOwotCWRvIHsKLQkgICAgdW5zaWduZWQgcnVuOwotCSAgICBvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOwotCSAgICBydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07Ci0JICAgIHNyY2J1ZiArPSA0OwotCSAgICBpZihydW4pIHsKLQkJc3JjYnVmICs9IHVuY29weV90cmFuc2woZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKLQkJb2ZzICs9IHJ1bjsKLQkgICAgfQotCX0gd2hpbGUob2ZzIDwgdyk7Ci0JZHN0ICs9IHN1cmZhY2UtPnBpdGNoID4+IDI7Ci0gICAgfQotICAgIC8qIE1ha2UgdGhlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgcmV0dXJuKFNETF9UUlVFKTsKLX0KLQotdm9pZCBTRExfVW5STEVTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgcmVjb2RlKQotewotICAgIGlmICggKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwgKSB7Ci0Jc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9STEVBQ0NFTDsKLQotCWlmKHJlY29kZSAmJiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpICE9IFNETF9QUkVBTExPQwotCSAgICYmIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICE9IFNETF9IV1NVUkZBQ0UpIHsKLQkgICAgaWYoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkpIHsKLQkJU0RMX1JlY3QgZnVsbDsKLQkJdW5zaWduZWQgYWxwaGFfZmxhZzsKLQotCQkvKiByZS1jcmVhdGUgdGhlIG9yaWdpbmFsIHN1cmZhY2UgKi8KLQkJc3VyZmFjZS0+cGl4ZWxzID0gU0RMX21hbGxvYyhzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwotCQlpZiAoICFzdXJmYWNlLT5waXhlbHMgKSB7Ci0JCQkvKiBPaCBjcmFwLi4uICovCi0JCQlzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBmaWxsIGl0IHdpdGggdGhlIGJhY2tncm91bmQgY29sb3VyICovCi0JCVNETF9GaWxsUmVjdChzdXJmYWNlLCBOVUxMLCBzdXJmYWNlLT5mb3JtYXQtPmNvbG9ya2V5KTsKLQotCQkvKiBub3cgcmVuZGVyIHRoZSBlbmNvZGVkIHN1cmZhY2UgKi8KLQkJZnVsbC54ID0gZnVsbC55ID0gMDsKLQkJZnVsbC53ID0gc3VyZmFjZS0+dzsKLQkJZnVsbC5oID0gc3VyZmFjZS0+aDsKLQkJYWxwaGFfZmxhZyA9IHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0FMUEhBOwotCQlzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1NSQ0FMUEhBOyAvKiBvcGFxdWUgYmxpdCAqLwotCQlTRExfUkxFQmxpdChzdXJmYWNlLCAmZnVsbCwgc3VyZmFjZSwgJmZ1bGwpOwotCQlzdXJmYWNlLT5mbGFncyB8PSBhbHBoYV9mbGFnOwotCSAgICB9IGVsc2UgewotCQlpZiAoICFVblJMRUFscGhhKHN1cmZhY2UpICkgewotCQkgICAgLyogT2ggY3JhcC4uLiAqLwotCQkgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwotCQkgICAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0KLQlpZiAoIHN1cmZhY2UtPm1hcCAmJiBzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhICkgewotCSAgICBTRExfZnJlZShzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhKTsKLQkgICAgc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5hdXhfZGF0YSA9IE5VTEw7Ci0JfQotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9STEVhY2NlbF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9STEVhY2NlbF9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOWQzNWQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfUkxFYWNjZWxfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFVzZWZ1bCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBmcm9tIFNETF9STEVhY2NlbC5jICovCi0KLWV4dGVybiBpbnQgU0RMX1JMRVN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotZXh0ZXJuIGludCBTRExfUkxFQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpOwotZXh0ZXJuIGludCBTRExfUkxFQWxwaGFCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAotCQkJICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KTsKLWV4dGVybiB2b2lkIFNETF9VblJMRVN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCByZWNvZGUpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfYmxpdC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfYmxpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWU0NzM4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2JsaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIlNETF9ibGl0LmgiCi0jaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKLSNpbmNsdWRlICJTRExfcGl4ZWxzX2MuaCIKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKSAmJiBTRExfQVNTRU1CTFlfUk9VVElORVMKLSNkZWZpbmUgTU1YX0FTTUJMSVQKLSNpZiAoX19HTlVDX18gPiAyKSAgLyogU1NFIGluc3RydWN0aW9ucyBhcmVuJ3QgaW4gR0NDIDIuICovCi0jZGVmaW5lIFNTRV9BU01CTElUCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChNTVhfQVNNQkxJVCkKLSNpbmNsdWRlICJTRExfY3B1aW5mby5oIgotI2luY2x1ZGUgIm1teC5oIgotI2VuZGlmCi0KLS8qIFRoZSBnZW5lcmFsIHB1cnBvc2Ugc29mdHdhcmUgYmxpdCByb3V0aW5lICovCi1zdGF0aWMgaW50IFNETF9Tb2Z0QmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLQkJCVNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KQotewotCWludCBva2F5OwotCWludCBzcmNfbG9ja2VkOwotCWludCBkc3RfbG9ja2VkOwotCi0JLyogRXZlcnl0aGluZyBpcyBva2F5IGF0IHRoZSBiZWdpbm5pbmcuLi4gICovCi0Jb2theSA9IDE7Ci0KLQkvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCdzIGluIGhhcmR3YXJlICovCi0JZHN0X2xvY2tlZCA9IDA7Ci0JaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKLQkJaWYgKCBTRExfTG9ja1N1cmZhY2UoZHN0KSA8IDAgKSB7Ci0JCQlva2F5ID0gMDsKLQkJfSBlbHNlIHsKLQkJCWRzdF9sb2NrZWQgPSAxOwotCQl9Ci0JfQotCS8qIExvY2sgdGhlIHNvdXJjZSBpZiBpdCdzIGluIGhhcmR3YXJlICovCi0Jc3JjX2xvY2tlZCA9IDA7Ci0JaWYgKCBTRExfTVVTVExPQ0soc3JjKSApIHsKLQkJaWYgKCBTRExfTG9ja1N1cmZhY2Uoc3JjKSA8IDAgKSB7Ci0JCQlva2F5ID0gMDsKLQkJfSBlbHNlIHsKLQkJCXNyY19sb2NrZWQgPSAxOwotCQl9Ci0JfQotCi0JLyogU2V0IHVwIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVyIHBvaW50ZXJzLCBhbmQgQkxJVCEgKi8KLQlpZiAoIG9rYXkgICYmIHNyY3JlY3QtPncgJiYgc3JjcmVjdC0+aCApIHsKLQkJU0RMX0JsaXRJbmZvIGluZm87Ci0JCVNETF9sb2JsaXQgUnVuQmxpdDsKLQotCQkvKiBTZXQgdXAgdGhlIGJsaXQgaW5mb3JtYXRpb24gKi8KLQkJaW5mby5zX3BpeGVscyA9IChVaW50OCAqKXNyYy0+cGl4ZWxzICsKLQkJCQkoVWludDE2KXNyY3JlY3QtPnkqc3JjLT5waXRjaCArCi0JCQkJKFVpbnQxNilzcmNyZWN0LT54KnNyYy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCQlpbmZvLnNfd2lkdGggPSBzcmNyZWN0LT53OwotCQlpbmZvLnNfaGVpZ2h0ID0gc3JjcmVjdC0+aDsKLQkJaW5mby5zX3NraXA9c3JjLT5waXRjaC1pbmZvLnNfd2lkdGgqc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JCWluZm8uZF9waXhlbHMgPSAoVWludDggKilkc3QtPnBpeGVscyArCi0JCQkJKFVpbnQxNilkc3RyZWN0LT55KmRzdC0+cGl0Y2ggKwotCQkJCShVaW50MTYpZHN0cmVjdC0+eCpkc3QtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLQkJaW5mby5kX3dpZHRoID0gZHN0cmVjdC0+dzsKLQkJaW5mby5kX2hlaWdodCA9IGRzdHJlY3QtPmg7Ci0JCWluZm8uZF9za2lwPWRzdC0+cGl0Y2gtaW5mby5kX3dpZHRoKmRzdC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCQlpbmZvLmF1eF9kYXRhID0gc3JjLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhOwotCQlpbmZvLnNyYyA9IHNyYy0+Zm9ybWF0OwotCQlpbmZvLnRhYmxlID0gc3JjLT5tYXAtPnRhYmxlOwotCQlpbmZvLmRzdCA9IGRzdC0+Zm9ybWF0OwotCQlSdW5CbGl0ID0gc3JjLT5tYXAtPnN3X2RhdGEtPmJsaXQ7Ci0KLQkJLyogUnVuIHRoZSBhY3R1YWwgc29mdHdhcmUgYmxpdCAqLwotCQlSdW5CbGl0KCZpbmZvKTsKLQl9Ci0KLQkvKiBXZSBuZWVkIHRvIHVubG9jayB0aGUgc3VyZmFjZXMgaWYgdGhleSdyZSBsb2NrZWQgKi8KLQlpZiAoIGRzdF9sb2NrZWQgKSB7Ci0JCVNETF9VbmxvY2tTdXJmYWNlKGRzdCk7Ci0JfQotCWlmICggc3JjX2xvY2tlZCApIHsKLQkJU0RMX1VubG9ja1N1cmZhY2Uoc3JjKTsKLQl9Ci0JLyogQmxpdCBpcyBkb25lISAqLwotCXJldHVybihva2F5ID8gMCA6IC0xKTsKLX0KLQotI2lmZGVmIE1NWF9BU01CTElUCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIFNETF9tZW1jcHlNTVgoVWludDggKnRvLCBjb25zdCBVaW50OCAqZnJvbSwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQotCWZvcihpPTA7IGk8bGVuLzg7IGkrKykgewotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSIJbW92cSAoJTApLCAlJW1tMFxuIgotCQkiCW1vdnEgJSVtbTAsICglMSlcbiIKLQkJOiA6ICJyIiAoZnJvbSksICJyIiAodG8pIDogIm1lbW9yeSIpOwotCQlmcm9tKz04OwotCQl0bys9ODsKLQl9Ci0JaWYgKGxlbiY3KQotCQlTRExfbWVtY3B5KHRvLCBmcm9tLCBsZW4mNyk7Ci19Ci0KLSNpZmRlZiBTU0VfQVNNQkxJVAotc3RhdGljIF9faW5saW5lX18gdm9pZCBTRExfbWVtY3B5U1NFKFVpbnQ4ICp0bywgY29uc3QgVWludDggKmZyb20sIGludCBsZW4pCi17Ci0JaW50IGk7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JIglwcmVmZXRjaG50YSAoJTApXG4iCi0JIglwcmVmZXRjaG50YSA2NCglMClcbiIKLQkiCXByZWZldGNobnRhIDEyOCglMClcbiIKLQkiCXByZWZldGNobnRhIDE5MiglMClcbiIKLQk6IDogInIiIChmcm9tKSApOwotCi0JZm9yKGk9MDsgaTxsZW4vODsgaSsrKSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIglwcmVmZXRjaG50YSAyNTYoJTApXG4iCi0JCSIJbW92cSAoJTApLCAlJW1tMFxuIgotCQkiCW1vdm50cSAlJW1tMCwgKCUxKVxuIgotCQk6IDogInIiIChmcm9tKSwgInIiICh0bykgOiAibWVtb3J5Iik7Ci0JCWZyb20rPTg7Ci0JCXRvKz04OwotCX0KLQlpZiAobGVuJjcpCi0JCVNETF9tZW1jcHkodG8sIGZyb20sIGxlbiY3KTsKLX0KLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIFNETF9CbGl0Q29weShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JVWludDggKnNyYywgKmRzdDsKLQlpbnQgdywgaDsKLQlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKLQotCXcgPSBpbmZvLT5kX3dpZHRoKmluZm8tPmRzdC0+Qnl0ZXNQZXJQaXhlbDsKLQloID0gaW5mby0+ZF9oZWlnaHQ7Ci0Jc3JjID0gaW5mby0+c19waXhlbHM7Ci0JZHN0ID0gaW5mby0+ZF9waXhlbHM7Ci0Jc3Jjc2tpcCA9IHcraW5mby0+c19za2lwOwotCWRzdHNraXAgPSB3K2luZm8tPmRfc2tpcDsKLQotI2lmZGVmIFNTRV9BU01CTElUCi0JaWYoU0RMX0hhc1NTRSgpKQotCXsKLQkJd2hpbGUgKCBoLS0gKSB7Ci0JCQlTRExfbWVtY3B5U1NFKGRzdCwgc3JjLCB3KTsKLQkJCXNyYyArPSBzcmNza2lwOwotCQkJZHN0ICs9IGRzdHNraXA7Ci0JCX0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkiCWVtbXNcbiIKLQkJOjopOwotCX0KLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBNTVhfQVNNQkxJVAotCWlmKFNETF9IYXNNTVgoKSkKLQl7Ci0JCXdoaWxlICggaC0tICkgewotCQkJU0RMX21lbWNweU1NWChkc3QsIHNyYywgdyk7Ci0JCQlzcmMgKz0gc3Jjc2tpcDsKLQkJCWRzdCArPSBkc3Rza2lwOwotCQl9Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIgllbW1zXG4iCi0JCTo6KTsKLQl9Ci0JZWxzZQotI2VuZGlmCi0Jd2hpbGUgKCBoLS0gKSB7Ci0JCVNETF9tZW1jcHkoZHN0LCBzcmMsIHcpOwotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBTRExfQmxpdENvcHlPdmVybGFwKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlVaW50OCAqc3JjLCAqZHN0OwotCWludCB3LCBoOwotCWludCBzcmNza2lwLCBkc3Rza2lwOwotCi0JdyA9IGluZm8tPmRfd2lkdGgqaW5mby0+ZHN0LT5CeXRlc1BlclBpeGVsOwotCWggPSBpbmZvLT5kX2hlaWdodDsKLQlzcmMgPSBpbmZvLT5zX3BpeGVsczsKLQlkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlzcmNza2lwID0gdytpbmZvLT5zX3NraXA7Ci0JZHN0c2tpcCA9IHcraW5mby0+ZF9za2lwOwotCWlmICggZHN0IDwgc3JjICkgewotCQl3aGlsZSAoIGgtLSApIHsKLQkJCVNETF9tZW1jcHkoZHN0LCBzcmMsIHcpOwotCQkJc3JjICs9IHNyY3NraXA7Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCX0gZWxzZSB7Ci0JCXNyYyArPSAoKGgtMSkgKiBzcmNza2lwKTsKLQkJZHN0ICs9ICgoaC0xKSAqIGRzdHNraXApOwotCQl3aGlsZSAoIGgtLSApIHsKLQkJCVNETF9yZXZjcHkoZHN0LCBzcmMsIHcpOwotCQkJc3JjIC09IHNyY3NraXA7Ci0JCQlkc3QgLT0gZHN0c2tpcDsKLQkJfQotCX0KLX0KLQotLyogRmlndXJlIG91dCB3aGljaCBvZiBtYW55IGJsaXQgcm91dGluZXMgdG8gc2V0IHVwIG9uIGEgc3VyZmFjZSAqLwotaW50IFNETF9DYWxjdWxhdGVCbGl0KFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWludCBibGl0X2luZGV4OwotCi0JLyogQ2xlYW4gZXZlcnl0aGluZyBvdXQgdG8gc3RhcnQgKi8KLQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9STEVBQ0NFTCkgPT0gU0RMX1JMRUFDQ0VMICkgewotCQlTRExfVW5STEVTdXJmYWNlKHN1cmZhY2UsIDEpOwotCX0KLQlzdXJmYWNlLT5tYXAtPnN3X2JsaXQgPSBOVUxMOwotCi0JLyogRmlndXJlIG91dCBpZiBhbiBhY2NlbGVyYXRlZCBoYXJkd2FyZSBibGl0IGlzIHBvc3NpYmxlICovCi0Jc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOwotCWlmICggc3VyZmFjZS0+bWFwLT5pZGVudGl0eSApIHsKLQkJaW50IGh3X2JsaXRfb2s7Ci0KLQkJaWYgKCAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgewotCQkJLyogV2Ugb25seSBzdXBwb3J0IGFjY2VsZXJhdGVkIGJsaXR0aW5nIHRvIGhhcmR3YXJlICovCi0JCQlpZiAoIHN1cmZhY2UtPm1hcC0+ZHN0LT5mbGFncyAmIFNETF9IV1NVUkZBQ0UgKSB7Ci0JCQkJaHdfYmxpdF9vayA9IGN1cnJlbnRfdmlkZW8tPmluZm8uYmxpdF9odzsKLQkJCX0gZWxzZSB7Ci0JCQkJaHdfYmxpdF9vayA9IDA7Ci0JCQl9Ci0JCQlpZiAoaHdfYmxpdF9vayAmJiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpKSB7Ci0JCQkJaHdfYmxpdF9vayA9IGN1cnJlbnRfdmlkZW8tPmluZm8uYmxpdF9od19DQzsKLQkJCX0KLQkJCWlmICggaHdfYmxpdF9vayAmJiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpICkgewotCQkJCWh3X2JsaXRfb2sgPSBjdXJyZW50X3ZpZGVvLT5pbmZvLmJsaXRfaHdfQTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIFdlIG9ubHkgc3VwcG9ydCBhY2NlbGVyYXRlZCBibGl0dGluZyB0byBoYXJkd2FyZSAqLwotCQkJaWYgKCBzdXJmYWNlLT5tYXAtPmRzdC0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFICkgewotCQkJCWh3X2JsaXRfb2sgPSBjdXJyZW50X3ZpZGVvLT5pbmZvLmJsaXRfc3c7Ci0JCQl9IGVsc2UgewotCQkJCWh3X2JsaXRfb2sgPSAwOwotCQkJfQotCQkJaWYgKGh3X2JsaXRfb2sgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSkgewotCQkJCWh3X2JsaXRfb2sgPSBjdXJyZW50X3ZpZGVvLT5pbmZvLmJsaXRfc3dfQ0M7Ci0JCQl9Ci0JCQlpZiAoIGh3X2JsaXRfb2sgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0FMUEhBKSApIHsKLQkJCQlod19ibGl0X29rID0gY3VycmVudF92aWRlby0+aW5mby5ibGl0X3N3X0E7Ci0JCQl9Ci0JCX0KLQkJaWYgKCBod19ibGl0X29rICkgewotCQkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQkJCXZpZGVvLT5DaGVja0hXQmxpdCh0aGlzLCBzdXJmYWNlLCBzdXJmYWNlLT5tYXAtPmRzdCk7Ci0JCX0KLQl9Ci0JCi0JLyogaWYgYW4gYWxwaGEgcGl4ZWwgZm9ybWF0IGlzIHNwZWNpZmllZCwgd2UgY2FuIGFjY2VsZXJhdGUgYWxwaGEgYmxpdHMgKi8KLQlpZiAoKChzdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UgKSYmKGN1cnJlbnRfdmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsKSkgCi0JewotCQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgKSAKLQkJCWlmICggY3VycmVudF92aWRlby0+aW5mby5ibGl0X2h3X0EgKSB7Ci0JCQkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JCQkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87Ci0JCQkJdmlkZW8tPkNoZWNrSFdCbGl0KHRoaXMsIHN1cmZhY2UsIHN1cmZhY2UtPm1hcC0+ZHN0KTsKLQkJCX0KLQl9Ci0KLQkvKiBHZXQgdGhlIGJsaXQgZnVuY3Rpb24gaW5kZXgsIGJhc2VkIG9uIHN1cmZhY2UgbW9kZSAqLwotCS8qIHsgMCA9IG5vdGhpbmcsIDEgPSBjb2xvcmtleSwgMiA9IGFscGhhLCAzID0gY29sb3JrZXkrYWxwaGEgfSAqLwotCWJsaXRfaW5kZXggPSAwOwotCWJsaXRfaW5kZXggfD0gKCEhKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSkgICAgICA8PCAwOwotCWlmICggc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEKLQkgICAgICYmIChzdXJmYWNlLT5mb3JtYXQtPmFscGhhICE9IFNETF9BTFBIQV9PUEFRVUUKLQkJIHx8IHN1cmZhY2UtPmZvcm1hdC0+QW1hc2spICkgewotCSAgICAgICAgYmxpdF9pbmRleCB8PSAyOwotCX0KLQotCS8qIENoZWNrIGZvciBzcGVjaWFsICJpZGVudGl0eSIgY2FzZSAtLSBjb3B5IGJsaXQgKi8KLQlpZiAoIHN1cmZhY2UtPm1hcC0+aWRlbnRpdHkgJiYgYmxpdF9pbmRleCA9PSAwICkgewotCSAgICAgICAgc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5ibGl0ID0gU0RMX0JsaXRDb3B5OwotCi0JCS8qIEhhbmRsZSBvdmVybGFwcGluZyBibGl0cyBvbiB0aGUgc2FtZSBzdXJmYWNlICovCi0JCWlmICggc3VyZmFjZSA9PSBzdXJmYWNlLT5tYXAtPmRzdCApIHsKLQkJICAgICAgICBzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmJsaXQgPSBTRExfQmxpdENvcHlPdmVybGFwOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDggKSB7Ci0JCQlzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmJsaXQgPQotCQkJICAgIFNETF9DYWxjdWxhdGVCbGl0MChzdXJmYWNlLCBibGl0X2luZGV4KTsKLQkJfSBlbHNlIHsKLQkJCXN3aXRjaCAoIHN1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCApIHsKLQkJCSAgICBjYXNlIDE6Ci0JCQkJc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5ibGl0ID0KLQkJCQkgICAgU0RMX0NhbGN1bGF0ZUJsaXQxKHN1cmZhY2UsIGJsaXRfaW5kZXgpOwotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgMjoKLQkJCSAgICBjYXNlIDM6Ci0JCQkgICAgY2FzZSA0OgotCQkJCXN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YmxpdCA9Ci0JCQkJICAgIFNETF9DYWxjdWxhdGVCbGl0TihzdXJmYWNlLCBibGl0X2luZGV4KTsKLQkJCQlicmVhazsKLQkJCSAgICBkZWZhdWx0OgotCQkJCXN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YmxpdCA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBibGl0IGZ1bmN0aW9uICovCi0JaWYgKCBzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmJsaXQgPT0gTlVMTCApIHsKLQkJU0RMX0ludmFsaWRhdGVNYXAoc3VyZmFjZS0+bWFwKTsKLQkJU0RMX1NldEVycm9yKCJCbGl0IGNvbWJpbmF0aW9uIG5vdCBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBDaG9vc2Ugc29mdHdhcmUgYmxpdHRpbmcgZnVuY3Rpb24gKi8KLQlpZihzdXJmYWNlLT5mbGFncyAmIFNETF9STEVBQ0NFTE9LCi0JICAgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX0hXQUNDRUwpICE9IFNETF9IV0FDQ0VMKSB7Ci0KLQkgICAgICAgIGlmKHN1cmZhY2UtPm1hcC0+aWRlbnRpdHkKLQkJICAgJiYgKGJsaXRfaW5kZXggPT0gMQotCQkgICAgICAgfHwgKGJsaXRfaW5kZXggPT0gMyAmJiAhc3VyZmFjZS0+Zm9ybWF0LT5BbWFzaykpKSB7Ci0JCSAgICAgICAgaWYgKCBTRExfUkxFU3VyZmFjZShzdXJmYWNlKSA9PSAwICkKLQkJCSAgICAgICAgc3VyZmFjZS0+bWFwLT5zd19ibGl0ID0gU0RMX1JMRUJsaXQ7Ci0JCX0gZWxzZSBpZihibGl0X2luZGV4ID09IDIgJiYgc3VyZmFjZS0+Zm9ybWF0LT5BbWFzaykgewotCQkgICAgICAgIGlmICggU0RMX1JMRVN1cmZhY2Uoc3VyZmFjZSkgPT0gMCApCi0JCQkgICAgICAgIHN1cmZhY2UtPm1hcC0+c3dfYmxpdCA9IFNETF9STEVBbHBoYUJsaXQ7Ci0JCX0KLQl9Ci0JCi0JaWYgKCBzdXJmYWNlLT5tYXAtPnN3X2JsaXQgPT0gTlVMTCApIHsKLQkJc3VyZmFjZS0+bWFwLT5zd19ibGl0ID0gU0RMX1NvZnRCbGl0OwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2JsaXQuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2JsaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0M2NlMi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9ibGl0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9ibGl0X2gKLSNkZWZpbmUgX1NETF9ibGl0X2gKLQotI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKLQotLyogVGhlIHN0cnVjdHVyZSBwYXNzZWQgdG8gdGhlIGxvdyBsZXZlbCBibGl0IGZ1bmN0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCVVpbnQ4ICpzX3BpeGVsczsKLQlpbnQgc193aWR0aDsKLQlpbnQgc19oZWlnaHQ7Ci0JaW50IHNfc2tpcDsKLQlVaW50OCAqZF9waXhlbHM7Ci0JaW50IGRfd2lkdGg7Ci0JaW50IGRfaGVpZ2h0OwotCWludCBkX3NraXA7Ci0Jdm9pZCAqYXV4X2RhdGE7Ci0JU0RMX1BpeGVsRm9ybWF0ICpzcmM7Ci0JVWludDggKnRhYmxlOwotCVNETF9QaXhlbEZvcm1hdCAqZHN0OwotfSBTRExfQmxpdEluZm87Ci0KLS8qIFRoZSB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBsb3cgbGV2ZWwgYmxpdCBmdW5jdGlvbnMgKi8KLXR5cGVkZWYgdm9pZCAoKlNETF9sb2JsaXQpKFNETF9CbGl0SW5mbyAqaW5mbyk7Ci0KLS8qIFRoaXMgaXMgdGhlIHByaXZhdGUgaW5mbyBzdHJ1Y3R1cmUgZm9yIHNvZnR3YXJlIGFjY2VsZXJhdGVkIGJsaXRzICovCi1zdHJ1Y3QgcHJpdmF0ZV9zd2FjY2VsIHsKLQlTRExfbG9ibGl0IGJsaXQ7Ci0Jdm9pZCAqYXV4X2RhdGE7Ci19OwotCi0vKiBCbGl0IG1hcHBpbmcgZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgU0RMX0JsaXRNYXAgewotCVNETF9TdXJmYWNlICpkc3Q7Ci0JaW50IGlkZW50aXR5OwotCVVpbnQ4ICp0YWJsZTsKLQlTRExfYmxpdCBod19ibGl0OwotCVNETF9ibGl0IHN3X2JsaXQ7Ci0Jc3RydWN0IHByaXZhdGVfaHdhY2NlbCAqaHdfZGF0YTsKLQlzdHJ1Y3QgcHJpdmF0ZV9zd2FjY2VsICpzd19kYXRhOwotCi0JLyogdGhlIHZlcnNpb24gY291bnQgbWF0Y2hlcyB0aGUgZGVzdGluYXRpb247IG1pc21hdGNoIGluZGljYXRlcwotCSAgIGFuIGludmFsaWQgbWFwcGluZyAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0X3ZlcnNpb247Ci19IFNETF9CbGl0TWFwOwotCi0KLS8qIEZ1bmN0aW9ucyBmb3VuZCBpbiBTRExfYmxpdC5jICovCi1leHRlcm4gaW50IFNETF9DYWxjdWxhdGVCbGl0KFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLQotLyogRnVuY3Rpb25zIGZvdW5kIGluIFNETF9ibGl0X3swLDEsTixBfS5jICovCi1leHRlcm4gU0RMX2xvYmxpdCBTRExfQ2FsY3VsYXRlQmxpdDAoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCBjb21wbGV4KTsKLWV4dGVybiBTRExfbG9ibGl0IFNETF9DYWxjdWxhdGVCbGl0MShTRExfU3VyZmFjZSAqc3VyZmFjZSwgaW50IGNvbXBsZXgpOwotZXh0ZXJuIFNETF9sb2JsaXQgU0RMX0NhbGN1bGF0ZUJsaXROKFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgY29tcGxleCk7Ci1leHRlcm4gU0RMX2xvYmxpdCBTRExfQ2FsY3VsYXRlQWxwaGFCbGl0KFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgY29tcGxleCk7Ci0KLS8qCi0gKiBVc2VmdWwgbWFjcm9zIGZvciBibGl0dGluZyByb3V0aW5lcwotICovCi0KLSNkZWZpbmUgRk9STUFUX0VRVUFMKEEsIEIpCQkJCQkJXAotICAgICgoQSktPkJpdHNQZXJQaXhlbCA9PSAoQiktPkJpdHNQZXJQaXhlbAkJCQlcCi0gICAgICYmICgoQSktPlJtYXNrID09IChCKS0+Um1hc2spICYmICgoQSktPkFtYXNrID09IChCKS0+QW1hc2spKQotCi0vKiBMb2FkIHBpeGVsIG9mIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGZyb20gYSBidWZmZXIgYW5kIGdldCBpdHMgUi1HLUIgdmFsdWVzICovCi0vKiBGSVhNRTogcmVzY2FsZSB2YWx1ZXMgdG8gMC4uMjU1IGhlcmU/ICovCi0jZGVmaW5lIFJHQl9GUk9NX1BJWEVMKFBpeGVsLCBmbXQsIHIsIGcsIGIpCQkJCVwKLXsJCQkJCQkJCQlcCi0JciA9ICgoKFBpeGVsJmZtdC0+Um1hc2spPj5mbXQtPlJzaGlmdCk8PGZtdC0+Umxvc3MpOyAJCVwKLQlnID0gKCgoUGl4ZWwmZm10LT5HbWFzayk+PmZtdC0+R3NoaWZ0KTw8Zm10LT5HbG9zcyk7IAkJXAotCWIgPSAoKChQaXhlbCZmbXQtPkJtYXNrKT4+Zm10LT5Cc2hpZnQpPDxmbXQtPkJsb3NzKTsgCQlcCi19Ci0jZGVmaW5lIFJHQl9GUk9NX1JHQjU2NShQaXhlbCwgciwgZywgYikJCQkJCVwKLXsJCQkJCQkJCQlcCi0JciA9ICgoKFBpeGVsJjB4RjgwMCk+PjExKTw8Myk7CQkgCQkJXAotCWcgPSAoKChQaXhlbCYweDA3RTApPj41KTw8Mik7IAkJCQkJXAotCWIgPSAoKFBpeGVsJjB4MDAxRik8PDMpOyAJCQkJCVwKLX0KLSNkZWZpbmUgUkdCX0ZST01fUkdCNTU1KFBpeGVsLCByLCBnLCBiKQkJCQkJXAotewkJCQkJCQkJCVwKLQlyID0gKCgoUGl4ZWwmMHg3QzAwKT4+MTApPDwzKTsJCSAJCQlcCi0JZyA9ICgoKFBpeGVsJjB4MDNFMCk+PjUpPDwzKTsgCQkJCQlcCi0JYiA9ICgoUGl4ZWwmMHgwMDFGKTw8Myk7IAkJCQkJXAotfQotI2RlZmluZSBSR0JfRlJPTV9SR0I4ODgoUGl4ZWwsIHIsIGcsIGIpCQkJCQlcCi17CQkJCQkJCQkJXAotCXIgPSAoKFBpeGVsJjB4RkYwMDAwKT4+MTYpOwkJIAkJCVwKLQlnID0gKChQaXhlbCYweEZGMDApPj44KTsJCSAJCQlcCi0JYiA9IChQaXhlbCYweEZGKTsJCQkgCQkJXAotfQotI2RlZmluZSBSRVRSSUVWRV9SR0JfUElYRUwoYnVmLCBicHAsIFBpeGVsKQkJCQkgICBcCi1kbyB7CQkJCQkJCQkJICAgXAotCXN3aXRjaCAoYnBwKSB7CQkJCQkJCSAgIFwKLQkJY2FzZSAyOgkJCQkJCQkgICBcCi0JCQlQaXhlbCA9ICooKFVpbnQxNiAqKShidWYpKTsJCQkgICBcCi0JCWJyZWFrOwkJCQkJCQkgICBcCi0JCQkJCQkJCQkgICBcCi0JCWNhc2UgMzogewkJCQkJCSAgIFwKLQkJICAgICAgICBVaW50OCAqQiA9IChVaW50OCAqKShidWYpOwkJCSAgIFwKLQkJCWlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCSAgIFwKLQkJCSAgICAgICAgUGl4ZWwgPSBCWzBdICsgKEJbMV0gPDwgOCkgKyAoQlsyXSA8PCAxNik7IFwKLQkJCX0gZWxzZSB7CQkJCQkgICBcCi0JCQkgICAgICAgIFBpeGVsID0gKEJbMF0gPDwgMTYpICsgKEJbMV0gPDwgOCkgKyBCWzJdOyBcCi0JCQl9CQkJCQkJICAgXAotCQl9CQkJCQkJCSAgIFwKLQkJYnJlYWs7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQkJY2FzZSA0OgkJCQkJCQkgICBcCi0JCQlQaXhlbCA9ICooKFVpbnQzMiAqKShidWYpKTsJCQkgICBcCi0JCWJyZWFrOwkJCQkJCQkgICBcCi0JCQkJCQkJCQkgICBcCi0JCWRlZmF1bHQ6CQkJCQkJICAgXAotCQkJUGl4ZWwgPSAwOyAvKiBhcHBlYXNlIGdjYyAqLwkJCSAgIFwKLQkJYnJlYWs7CQkJCQkJCSAgIFwKLQl9CQkJCQkJCQkgICBcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgRElTRU1CTEVfUkdCKGJ1ZiwgYnBwLCBmbXQsIFBpeGVsLCByLCBnLCBiKQkJCSAgIFwKLWRvIHsJCQkJCQkJCQkgICBcCi0Jc3dpdGNoIChicHApIHsJCQkJCQkJICAgXAotCQljYXNlIDI6CQkJCQkJCSAgIFwKLQkJCVBpeGVsID0gKigoVWludDE2ICopKGJ1ZikpOwkJCSAgIFwKLQkJYnJlYWs7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQkJY2FzZSAzOiB7CQkJCQkJICAgXAotCQkgICAgICAgIFVpbnQ4ICpCID0gKFVpbnQ4ICopYnVmOwkJCSAgIFwKLQkJCWlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCSAgIFwKLQkJCSAgICAgICAgUGl4ZWwgPSBCWzBdICsgKEJbMV0gPDwgOCkgKyAoQlsyXSA8PCAxNik7IFwKLQkJCX0gZWxzZSB7CQkJCQkgICBcCi0JCQkgICAgICAgIFBpeGVsID0gKEJbMF0gPDwgMTYpICsgKEJbMV0gPDwgOCkgKyBCWzJdOyBcCi0JCQl9CQkJCQkJICAgXAotCQl9CQkJCQkJCSAgIFwKLQkJYnJlYWs7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQkJY2FzZSA0OgkJCQkJCQkgICBcCi0JCQlQaXhlbCA9ICooKFVpbnQzMiAqKShidWYpKTsJCQkgICBcCi0JCWJyZWFrOwkJCQkJCQkgICBcCi0JCQkJCQkJCQkgICBcCi0JICAgICAgICBkZWZhdWx0OgkJCQkJCSAgIFwKLQkJICAgICAgICBQaXhlbCA9IDA7CS8qIHByZXZlbnQgZ2NjIGZyb20gY29tcGxhaW5pbmcgKi8gXAotCQlicmVhazsJCQkJCQkJICAgXAotCX0JCQkJCQkJCSAgIFwKLQlSR0JfRlJPTV9QSVhFTChQaXhlbCwgZm10LCByLCBnLCBiKTsJCQkJICAgXAotfSB3aGlsZSgwKQotCi0vKiBBc3NlbWJsZSBSLUctQiB2YWx1ZXMgaW50byBhIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQgYW5kIHN0b3JlIHRoZW0gKi8KLSNpZmRlZiBfX05EU19fIC8vIEZJWE1FCi0jZGVmaW5lIFBJWEVMX0ZST01fUkdCKFBpeGVsLCBmbXQsIHIsIGcsIGIpCQkJCVwKLXsJCQkJCQkJCQlcCi0JUGl4ZWwgPSAoKHI+PmZtdC0+Umxvc3MpPDxmbXQtPlJzaGlmdCl8CQkJCVwKLQkJKChnPj5mbXQtPkdsb3NzKTw8Zm10LT5Hc2hpZnQpfAkJCQlcCi0JCSgoYj4+Zm10LT5CbG9zcyk8PGZtdC0+QnNoaWZ0KSB8ICgxPDwxNSk7CQkJCVwKLX0KLSNlbHNlCi0jZGVmaW5lIFBJWEVMX0ZST01fUkdCKFBpeGVsLCBmbXQsIHIsIGcsIGIpCQkJCVwKLXsJCQkJCQkJCQlcCi0JUGl4ZWwgPSAoKHI+PmZtdC0+Umxvc3MpPDxmbXQtPlJzaGlmdCl8CQkJCVwKLQkJKChnPj5mbXQtPkdsb3NzKTw8Zm10LT5Hc2hpZnQpfAkJCQlcCi0JCSgoYj4+Zm10LT5CbG9zcyk8PGZtdC0+QnNoaWZ0KTsJCQkJXAotfQotI2VuZGlmIC8vIF9fTkRTX18gRklYTUUKLSNkZWZpbmUgUkdCNTY1X0ZST01fUkdCKFBpeGVsLCByLCBnLCBiKQkJCQkJXAotewkJCQkJCQkJCVwKLQlQaXhlbCA9ICgocj4+Myk8PDExKXwoKGc+PjIpPDw1KXwoYj4+Myk7CQkJXAotfQotI2RlZmluZSBSR0I1NTVfRlJPTV9SR0IoUGl4ZWwsIHIsIGcsIGIpCQkJCQlcCi17CQkJCQkJCQkJXAotCVBpeGVsID0gKChyPj4zKTw8MTApfCgoZz4+Myk8PDUpfChiPj4zKTsJCQlcCi19Ci0jZGVmaW5lIFJHQjg4OF9GUk9NX1JHQihQaXhlbCwgciwgZywgYikJCQkJCVwKLXsJCQkJCQkJCQlcCi0JUGl4ZWwgPSAocjw8MTYpfChnPDw4KXxiOwkJCQkJXAotfQotI2RlZmluZSBBU1NFTUJMRV9SR0IoYnVmLCBicHAsIGZtdCwgciwgZywgYikgCQkJCVwKLXsJCQkJCQkJCQlcCi0Jc3dpdGNoIChicHApIHsJCQkJCQkJXAotCQljYXNlIDI6IHsJCQkJCQlcCi0JCQlVaW50MTYgUGl4ZWw7CQkJCQlcCi0JCQkJCQkJCQlcCi0JCQlQSVhFTF9GUk9NX1JHQihQaXhlbCwgZm10LCByLCBnLCBiKTsJCVwKLQkJCSooKFVpbnQxNiAqKShidWYpKSA9IFBpeGVsOwkJCVwKLQkJfQkJCQkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JCWNhc2UgMzogewkJCQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCVwKLQkJCSAgICAgICAgKigoYnVmKStmbXQtPlJzaGlmdC84KSA9IHI7CQlcCi0JCQkJKigoYnVmKStmbXQtPkdzaGlmdC84KSA9IGc7CQlcCi0JCQkJKigoYnVmKStmbXQtPkJzaGlmdC84KSA9IGI7CQlcCi0JCQl9IGVsc2UgewkJCQkJXAotCQkJICAgICAgICAqKChidWYpKzItZm10LT5Sc2hpZnQvOCkgPSByOwkJXAotCQkJCSooKGJ1ZikrMi1mbXQtPkdzaGlmdC84KSA9IGc7CQlcCi0JCQkJKigoYnVmKSsyLWZtdC0+QnNoaWZ0LzgpID0gYjsJCVwKLQkJCX0JCQkJCQlcCi0JCX0JCQkJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCQkJCQkJCQkJXAotCQljYXNlIDQ6IHsJCQkJCQlcCi0JCQlVaW50MzIgUGl4ZWw7CQkJCQlcCi0JCQkJCQkJCQlcCi0JCQlQSVhFTF9GUk9NX1JHQihQaXhlbCwgZm10LCByLCBnLCBiKTsJCVwKLQkJCSooKFVpbnQzMiAqKShidWYpKSA9IFBpeGVsOwkJCVwKLQkJfQkJCQkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotfQotI2RlZmluZSBBU1NFTUJMRV9SR0JfQU1BU0soYnVmLCBicHAsIGZtdCwgciwgZywgYiwgQW1hc2spCQlcCi17CQkJCQkJCQkJXAotCXN3aXRjaCAoYnBwKSB7CQkJCQkJCVwKLQkJY2FzZSAyOiB7CQkJCQkJXAotCQkJVWludDE2ICpidWZwOwkJCQkJXAotCQkJVWludDE2IFBpeGVsOwkJCQkJXAotCQkJCQkJCQkJXAotCQkJYnVmcCA9IChVaW50MTYgKilidWY7CQkJCVwKLQkJCVBJWEVMX0ZST01fUkdCKFBpeGVsLCBmbXQsIHIsIGcsIGIpOwkJXAotCQkJKmJ1ZnAgPSBQaXhlbCB8ICgqYnVmcCAmIEFtYXNrKTsJCVwKLQkJfQkJCQkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JCWNhc2UgMzogewkJCQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCVwKLQkJCSAgICAgICAgKigoYnVmKStmbXQtPlJzaGlmdC84KSA9IHI7CQlcCi0JCQkJKigoYnVmKStmbXQtPkdzaGlmdC84KSA9IGc7CQlcCi0JCQkJKigoYnVmKStmbXQtPkJzaGlmdC84KSA9IGI7CQlcCi0JCQl9IGVsc2UgewkJCQkJXAotCQkJICAgICAgICAqKChidWYpKzItZm10LT5Sc2hpZnQvOCkgPSByOwkJXAotCQkJCSooKGJ1ZikrMi1mbXQtPkdzaGlmdC84KSA9IGc7CQlcCi0JCQkJKigoYnVmKSsyLWZtdC0+QnNoaWZ0LzgpID0gYjsJCVwKLQkJCX0JCQkJCQlcCi0JCX0JCQkJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCQkJCQkJCQkJXAotCQljYXNlIDQ6IHsJCQkJCQlcCi0JCQlVaW50MzIgKmJ1ZnA7CQkJCQlcCi0JCQlVaW50MzIgUGl4ZWw7CQkJCQlcCi0JCQkJCQkJCQlcCi0JCQlidWZwID0gKFVpbnQzMiAqKWJ1ZjsJCQkJXAotCQkJUElYRUxfRlJPTV9SR0IoUGl4ZWwsIGZtdCwgciwgZywgYik7CQlcCi0JCQkqYnVmcCA9IFBpeGVsIHwgKCpidWZwICYgQW1hc2spOwkJXAotCQl9CQkJCQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi19Ci0KLS8qIEZJWE1FOiBTaG91bGQgd2UgcmVzY2FsZSBhbHBoYSBpbnRvIDAuLjI1NSBoZXJlPyAqLwotI2RlZmluZSBSR0JBX0ZST01fUElYRUwoUGl4ZWwsIGZtdCwgciwgZywgYiwgYSkJCQkJXAotewkJCQkJCQkJCVwKLQlyID0gKChQaXhlbCZmbXQtPlJtYXNrKT4+Zm10LT5Sc2hpZnQpPDxmbXQtPlJsb3NzOyAJCVwKLQlnID0gKChQaXhlbCZmbXQtPkdtYXNrKT4+Zm10LT5Hc2hpZnQpPDxmbXQtPkdsb3NzOyAJCVwKLQliID0gKChQaXhlbCZmbXQtPkJtYXNrKT4+Zm10LT5Cc2hpZnQpPDxmbXQtPkJsb3NzOyAJCVwKLQlhID0gKChQaXhlbCZmbXQtPkFtYXNrKT4+Zm10LT5Bc2hpZnQpPDxmbXQtPkFsb3NzOwkgCVwKLX0KLSNkZWZpbmUgUkdCQV9GUk9NXzg4ODgoUGl4ZWwsIGZtdCwgciwgZywgYiwgYSkJXAotewkJCQkJCVwKLQlyID0gKFBpeGVsJmZtdC0+Um1hc2spPj5mbXQtPlJzaGlmdDsJXAotCWcgPSAoUGl4ZWwmZm10LT5HbWFzayk+PmZtdC0+R3NoaWZ0OwlcCi0JYiA9IChQaXhlbCZmbXQtPkJtYXNrKT4+Zm10LT5Cc2hpZnQ7CVwKLQlhID0gKFBpeGVsJmZtdC0+QW1hc2spPj5mbXQtPkFzaGlmdDsJXAotfQotI2RlZmluZSBSR0JBX0ZST01fUkdCQTg4ODgoUGl4ZWwsIHIsIGcsIGIsIGEpCQkJCVwKLXsJCQkJCQkJCQlcCi0JciA9IChQaXhlbD4+MjQpOwkJCQkJCVwKLQlnID0gKChQaXhlbD4+MTYpJjB4RkYpOwkJCQkJCVwKLQliID0gKChQaXhlbD4+OCkmMHhGRik7CQkJCQkJXAotCWEgPSAoUGl4ZWwmMHhGRik7CQkJCQkJXAotfQotI2RlZmluZSBSR0JBX0ZST01fQVJHQjg4ODgoUGl4ZWwsIHIsIGcsIGIsIGEpCQkJCVwKLXsJCQkJCQkJCQlcCi0JciA9ICgoUGl4ZWw+PjE2KSYweEZGKTsJCQkJCQlcCi0JZyA9ICgoUGl4ZWw+PjgpJjB4RkYpOwkJCQkJCVwKLQliID0gKFBpeGVsJjB4RkYpOwkJCQkJCVwKLQlhID0gKFBpeGVsPj4yNCk7CQkJCQkJXAotfQotI2RlZmluZSBSR0JBX0ZST01fQUJHUjg4ODgoUGl4ZWwsIHIsIGcsIGIsIGEpCQkJCVwKLXsJCQkJCQkJCQlcCi0JciA9IChQaXhlbCYweEZGKTsJCQkJCQlcCi0JZyA9ICgoUGl4ZWw+PjgpJjB4RkYpOwkJCQkJCVwKLQliID0gKChQaXhlbD4+MTYpJjB4RkYpOwkJCQkJCVwKLQlhID0gKFBpeGVsPj4yNCk7CQkJCQkJXAotfQotI2RlZmluZSBESVNFTUJMRV9SR0JBKGJ1ZiwgYnBwLCBmbXQsIFBpeGVsLCByLCBnLCBiLCBhKQkJCSAgIFwKLWRvIHsJCQkJCQkJCQkgICBcCi0Jc3dpdGNoIChicHApIHsJCQkJCQkJICAgXAotCQljYXNlIDI6CQkJCQkJCSAgIFwKLQkJCVBpeGVsID0gKigoVWludDE2ICopKGJ1ZikpOwkJCSAgIFwKLQkJYnJlYWs7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQkJY2FzZSAzOgl7LyogRklYTUU6IGJyb2tlbiBjb2RlIChubyBhbHBoYSkgKi8JCSAgIFwKLQkJICAgICAgICBVaW50OCAqYiA9IChVaW50OCAqKWJ1ZjsJCQkgICBcCi0JCQlpZihTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOKSB7CQkgICBcCi0JCQkgICAgICAgIFBpeGVsID0gYlswXSArIChiWzFdIDw8IDgpICsgKGJbMl0gPDwgMTYpOyBcCi0JCQl9IGVsc2UgewkJCQkJICAgXAotCQkJICAgICAgICBQaXhlbCA9IChiWzBdIDw8IDE2KSArIChiWzFdIDw8IDgpICsgYlsyXTsgXAotCQkJfQkJCQkJCSAgIFwKLQkJfQkJCQkJCQkgICBcCi0JCWJyZWFrOwkJCQkJCQkgICBcCi0JCQkJCQkJCQkgICBcCi0JCWNhc2UgNDoJCQkJCQkJICAgXAotCQkJUGl4ZWwgPSAqKChVaW50MzIgKikoYnVmKSk7CQkJICAgXAotCQlicmVhazsJCQkJCQkJICAgXAotCQkJCQkJCQkJICAgXAotCQlkZWZhdWx0OgkJCQkJCSAgIFwKLQkJICAgICAgICBQaXhlbCA9IDA7IC8qIHN0b3AgZ2NjIGNvbXBsYWludHMgKi8JCSAgIFwKLQkJYnJlYWs7CQkJCQkJCSAgIFwKLQl9CQkJCQkJCQkgICBcCi0JUkdCQV9GUk9NX1BJWEVMKFBpeGVsLCBmbXQsIHIsIGcsIGIsIGEpOwkJCSAgIFwKLQlQaXhlbCAmPSB+Zm10LT5BbWFzazsJCQkJCQkgICBcCi19IHdoaWxlKDApCi0KLS8qIEZJWE1FOiB0aGlzIGlzbid0IGNvcnJlY3QsIGVzcGVjaWFsbHkgZm9yIEFscGhhIChtYXhpbXVtICE9IDI1NSkgKi8KLSNpZmRlZiBfX05EU19fIC8vIEZJWE1FCi0jZGVmaW5lIFBJWEVMX0ZST01fUkdCQShQaXhlbCwgZm10LCByLCBnLCBiLCBhKQkJCQlcCi17CQkJCQkJCQkJXAotCVBpeGVsID0gKChyPj5mbXQtPlJsb3NzKTw8Zm10LT5Sc2hpZnQpfAkJCQlcCi0JCSgoZz4+Zm10LT5HbG9zcyk8PGZtdC0+R3NoaWZ0KXwJCQkJXAotCQkoKGI+PmZtdC0+Qmxvc3MpPDxmbXQtPkJzaGlmdCl8CQkJCVwKLQkJKChhPj5mbXQtPkFsb3NzKTw8Zm10LT5Bc2hpZnQpIHwgKDE8PDE1KTsJCQkJXAotfQotI2Vsc2UKLSNkZWZpbmUgUElYRUxfRlJPTV9SR0JBKFBpeGVsLCBmbXQsIHIsIGcsIGIsIGEpCQkJCVwKLXsJCQkJCQkJCQlcCi0JUGl4ZWwgPSAoKHI+PmZtdC0+Umxvc3MpPDxmbXQtPlJzaGlmdCl8CQkJCVwKLQkJKChnPj5mbXQtPkdsb3NzKTw8Zm10LT5Hc2hpZnQpfAkJCQlcCi0JCSgoYj4+Zm10LT5CbG9zcyk8PGZtdC0+QnNoaWZ0KXwJCQkJXAotCQkoKGE+PmZtdC0+QWxvc3MpPDxmbXQtPkFzaGlmdCk7CQkJCVwKLX0KLSNlbmRpZiAvLyBfX05EU19fIEZJWE1FCi0jZGVmaW5lIEFTU0VNQkxFX1JHQkEoYnVmLCBicHAsIGZtdCwgciwgZywgYiwgYSkJCQlcCi17CQkJCQkJCQkJXAotCXN3aXRjaCAoYnBwKSB7CQkJCQkJCVwKLQkJY2FzZSAyOiB7CQkJCQkJXAotCQkJVWludDE2IFBpeGVsOwkJCQkJXAotCQkJCQkJCQkJXAotCQkJUElYRUxfRlJPTV9SR0JBKFBpeGVsLCBmbXQsIHIsIGcsIGIsIGEpOwlcCi0JCQkqKChVaW50MTYgKikoYnVmKSkgPSBQaXhlbDsJCQlcCi0JCX0JCQkJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCQkJCQkJCQkJXAotCQljYXNlIDM6IHsgLyogRklYTUU6IGJyb2tlbiBjb2RlIChubyBhbHBoYSkgKi8JCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCVwKLQkJCSAgICAgICAgKigoYnVmKStmbXQtPlJzaGlmdC84KSA9IHI7CQlcCi0JCQkJKigoYnVmKStmbXQtPkdzaGlmdC84KSA9IGc7CQlcCi0JCQkJKigoYnVmKStmbXQtPkJzaGlmdC84KSA9IGI7CQlcCi0JCQl9IGVsc2UgewkJCQkJXAotCQkJICAgICAgICAqKChidWYpKzItZm10LT5Sc2hpZnQvOCkgPSByOwkJXAotCQkJCSooKGJ1ZikrMi1mbXQtPkdzaGlmdC84KSA9IGc7CQlcCi0JCQkJKigoYnVmKSsyLWZtdC0+QnNoaWZ0LzgpID0gYjsJCVwKLQkJCX0JCQkJCQlcCi0JCX0JCQkJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCQkJCQkJCQkJXAotCQljYXNlIDQ6IHsJCQkJCQlcCi0JCQlVaW50MzIgUGl4ZWw7CQkJCQlcCi0JCQkJCQkJCQlcCi0JCQlQSVhFTF9GUk9NX1JHQkEoUGl4ZWwsIGZtdCwgciwgZywgYiwgYSk7CVwKLQkJCSooKFVpbnQzMiAqKShidWYpKSA9IFBpeGVsOwkJCVwKLQkJfQkJCQkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotfQotCi0vKiBCbGVuZCB0aGUgUkdCIHZhbHVlcyBvZiB0d28gUGl4ZWxzIGJhc2VkIG9uIGEgc291cmNlIGFscGhhIHZhbHVlICovCi0jZGVmaW5lIEFMUEhBX0JMRU5EKHNSLCBzRywgc0IsIEEsIGRSLCBkRywgZEIpCVwKLWRvIHsJCQkJCQlcCi0JZFIgPSAoKChzUi1kUikqKEEpKT4+OCkrZFI7CQlcCi0JZEcgPSAoKChzRy1kRykqKEEpKT4+OCkrZEc7CQlcCi0JZEIgPSAoKChzQi1kQikqKEEpKT4+OCkrZEI7CQlcCi19IHdoaWxlKDApCi0KLS8qIEJsZW5kIHRoZSBSR0IgdmFsdWVzIG9mIHR3byBQaXhlbHMgYmFzZWQgb24gYSBzb3VyY2UgYWxwaGEgdmFsdWUgKi8KLSNkZWZpbmUgQUNDVVJBVEVfQUxQSEFfQkxFTkQoc1IsIHNHLCBzQiwgc0EsIGRSLCBkRywgZEIpCVwKLWRvIHsJCQkJCQlcCi0gICAgdW5zaWduZWQgdFIsIHRHLCB0QiwgdEE7IFwKLSAgICB0QSA9IDI1NSAtIHNBOyBcCi0gICAgdFIgPSAxICsgKHNSICogc0EpICsgKGRSICogdEEpOyBcCi0gICAgZFIgPSAodFIgKyAodFIgPj4gOCkpID4+IDg7IFwKLSAgICB0RyA9IDEgKyAoc0cgKiBzQSkgKyAoZEcgKiB0QSk7IFwKLSAgICBkRyA9ICh0RyArICh0RyA+PiA4KSkgPj4gODsgXAotICAgIHRCID0gMSArIChzQiAqIHNBKSArIChkQiAqIHRBKTsgXAotICAgIGRCID0gKHRCICsgKHRCID4+IDgpKSA+PiA4OyBcCi19IHdoaWxlKDApCi0KLQotLyogVGhpcyBpcyBhIHZlcnkgdXNlZnVsIGxvb3AgZm9yIG9wdGltaXppbmcgYmxpdHRlcnMgKi8KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPT0gMTMwMCkKLS8qIFRoZXJlJ3MgYSBidWcgaW4gdGhlIFZpc3VhbCBDKysgNyBvcHRpbWl6ZXIgd2hlbiBjb21waWxpbmcgdGhpcyBjb2RlICovCi0jZWxzZQotI2RlZmluZSBVU0VfRFVGRlNfTE9PUAotI2VuZGlmCi0jaWZkZWYgVVNFX0RVRkZTX0xPT1AKLQotLyogOC10aW1lcyB1bnJvbGxlZCBsb29wICovCi0jZGVmaW5lIERVRkZTX0xPT1A4KHBpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJCQlcCi17IGludCBuID0gKHdpZHRoKzcpLzg7CQkJCQkJCVwKLQlzd2l0Y2ggKHdpZHRoICYgNykgewkJCQkJCVwKLQljYXNlIDA6IGRvIHsJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKLQljYXNlIDc6CQlwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJXAotCWNhc2UgNjoJCXBpeGVsX2NvcHlfaW5jcmVtZW50OwkJCQlcCi0JY2FzZSA1OgkJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKLQljYXNlIDQ6CQlwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJXAotCWNhc2UgMzoJCXBpeGVsX2NvcHlfaW5jcmVtZW50OwkJCQlcCi0JY2FzZSAyOgkJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKLQljYXNlIDE6CQlwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJXAotCQl9IHdoaWxlICggLS1uID4gMCApOwkJCQkJXAotCX0JCQkJCQkJCVwKLX0KLQotLyogNC10aW1lcyB1bnJvbGxlZCBsb29wICovCi0jZGVmaW5lIERVRkZTX0xPT1A0KHBpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJCQlcCi17IGludCBuID0gKHdpZHRoKzMpLzQ7CQkJCQkJCVwKLQlzd2l0Y2ggKHdpZHRoICYgMykgewkJCQkJCVwKLQljYXNlIDA6IGRvIHsJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKLQljYXNlIDM6CQlwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJXAotCWNhc2UgMjoJCXBpeGVsX2NvcHlfaW5jcmVtZW50OwkJCQlcCi0JY2FzZSAxOgkJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKLQkJfSB3aGlsZSAoIC0tbiA+IDAgKTsJCQkJCVwKLQl9CQkJCQkJCQlcCi19Ci0KLS8qIDIgLSB0aW1lcyB1bnJvbGxlZCBsb29wICovCi0jZGVmaW5lIERVRkZTX0xPT1BfRE9VQkxFMihwaXhlbF9jb3B5X2luY3JlbWVudCwJCQlcCi0JCQkJZG91YmxlX3BpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJXAoteyBpbnQgbiwgdyA9IHdpZHRoOwkJCQkJCQlcCi0JaWYoIHcgJiAxICkgewkJCQkJCQlcCi0JICAgIHBpeGVsX2NvcHlfaW5jcmVtZW50OwkJCQkJXAotCSAgICB3LS07CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JaWYgKCB3ID4gMCApCXsJCQkJCQlcCi0JICAgIG4gPSAoIHcgKyAyKSAvIDQ7CQkJCQkJXAotCSAgICBzd2l0Y2goIHcgJiAyICkgewkJCQkJCVwKLQkgICAgY2FzZSAwOiBkbyB7CWRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudDsJCVwKLQkgICAgY2FzZSAyOgkJZG91YmxlX3BpeGVsX2NvcHlfaW5jcmVtZW50OwkJXAotCQkgICAgfSB3aGlsZSAoIC0tbiA+IDAgKTsJCQkJCVwKLQkgICAgfQkJCQkJCQkJXAotCX0JCQkJCQkJCVwKLX0KLQotLyogMiAtIHRpbWVzIHVucm9sbGVkIGxvb3AgNCBwaXhlbHMgKi8KLSNkZWZpbmUgRFVGRlNfTE9PUF9RVUFUUk8yKHBpeGVsX2NvcHlfaW5jcmVtZW50LAkJCVwKLQkJCQlkb3VibGVfcGl4ZWxfY29weV9pbmNyZW1lbnQsCQlcCi0JCQkJcXVhdHJvX3BpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJXAoteyBpbnQgbiwgdyA9IHdpZHRoOwkJCQkJCQkJXAotICAgICAgICBpZih3ICYgMSkgewkJCQkJCQlcCi0JICBwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCQlcCi0JICB3LS07CQkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWlmKHcgJiAyKSB7CQkJCQkJCVwKLQkgIGRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCVwKLQkgIHcgLT0gMjsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQlpZiAoIHcgPiAwICkgewkJCQkJCQlcCi0JICAgIG4gPSAoIHcgKyA3ICkgLyA4OwkJCQkJCVwKLQkgICAgc3dpdGNoKCB3ICYgNCApIHsJCQkJCQlcCi0JICAgIGNhc2UgMDogZG8gewlxdWF0cm9fcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQlcCi0JICAgIGNhc2UgNDoJCXF1YXRyb19waXhlbF9jb3B5X2luY3JlbWVudDsJCVwKLQkJICAgIH0gd2hpbGUgKCAtLW4gPiAwICk7CQkJCQlcCi0JICAgIH0JCQkJCQkJCVwKLQl9CQkJCQkJCQlcCi19Ci0KLS8qIFVzZSB0aGUgOC10aW1lcyB2ZXJzaW9uIG9mIHRoZSBsb29wIGJ5IGRlZmF1bHQgKi8KLSNkZWZpbmUgRFVGRlNfTE9PUChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQkJCVwKLQlEVUZGU19MT09QOChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCi0KLSNlbHNlCi0KLS8qIERvbid0IHVzZSBEdWZmJ3MgZGV2aWNlIHRvIHVucm9sbCBsb29wcyAqLwotI2RlZmluZSBEVUZGU19MT09QX0RPVUJMRTIocGl4ZWxfY29weV9pbmNyZW1lbnQsCQkJXAotCQkJIGRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQlcCi17IGludCBuID0gd2lkdGg7CQkJCQkJCQlcCi0gICAgaWYoIG4gJiAxICkgewkJCQkJCQlcCi0JcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCQkJXAotCW4tLTsJCQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICAgIG49bj4+MTsJCQkJCQkJCVwKLSAgICBmb3IoOyBuID4gMDsgLS1uKSB7ICAgCQkJCQkJXAotCWRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotfQotCi0vKiBEb24ndCB1c2UgRHVmZidzIGRldmljZSB0byB1bnJvbGwgbG9vcHMgKi8KLSNkZWZpbmUgRFVGRlNfTE9PUF9RVUFUUk8yKHBpeGVsX2NvcHlfaW5jcmVtZW50LAkJCVwKLQkJCQlkb3VibGVfcGl4ZWxfY29weV9pbmNyZW1lbnQsCQlcCi0JCQkJcXVhdHJvX3BpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJXAoteyBpbnQgbiA9IHdpZHRoOwkJCQkJCQkJXAotICAgICAgICBpZihuICYgMSkgewkJCQkJCQlcCi0JICBwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCQlcCi0JICBuLS07CQkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWlmKG4gJiAyKSB7CQkJCQkJCVwKLQkgIGRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCVwKLQkgIG4gLT0gMjsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQluPW4+PjI7CQkJCQkJCQlcCi0JZm9yKDsgbiA+IDA7IC0tbikgeyAgIAkJCQkJCVwKLQkgIHF1YXRyb19waXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCVwKLSAgICAgICAgfQkJCQkJCQkJXAotfQotCi0vKiBEb24ndCB1c2UgRHVmZidzIGRldmljZSB0byB1bnJvbGwgbG9vcHMgKi8KLSNkZWZpbmUgRFVGRlNfTE9PUChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQkJCVwKLXsgaW50IG47CQkJCQkJCQlcCi0JZm9yICggbj13aWR0aDsgbiA+IDA7IC0tbiApIHsJCQkJCVwKLQkJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCQlcCi0JfQkJCQkJCQkJXAotfQotI2RlZmluZSBEVUZGU19MT09QOChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQkJXAotCURVRkZTX0xPT1AocGl4ZWxfY29weV9pbmNyZW1lbnQsIHdpZHRoKQotI2RlZmluZSBEVUZGU19MT09QNChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQkJXAotCURVRkZTX0xPT1AocGl4ZWxfY29weV9pbmNyZW1lbnQsIHdpZHRoKQotCi0jZW5kaWYgLyogVVNFX0RVRkZTX0xPT1AgKi8KLQotLyogUHJldmVudCBWaXN1YWwgQysrIDYuMCBmcm9tIHByaW50aW5nIG91dCBzdHVwaWQgd2FybmluZ3MgKi8KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gNjAwKQotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ1NTApCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TRExfYmxpdF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9ibGl0XzAuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2JsaXRfMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FiM2RmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2JsaXRfMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2JsaXQuaCIKLQotLyogRnVuY3Rpb25zIHRvIGJsaXQgZnJvbSBiaXRtYXBzIHRvIG90aGVyIHN1cmZhY2VzICovCi0KLXN0YXRpYyB2b2lkIEJsaXRCdG8xKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgYzsKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlVaW50OCAqc3JjLCAqbWFwLCAqZHN0OwotCWludCBzcmNza2lwLCBkc3Rza2lwOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCXNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCXNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JZHN0ID0gaW5mby0+ZF9waXhlbHM7Ci0JZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQltYXAgPSBpbmZvLT50YWJsZTsKLQlzcmNza2lwICs9IHdpZHRoLSh3aWR0aCs3KS84OwotCi0JaWYgKCBtYXAgKSB7Ci0JCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JCSAgICAgICAgVWludDggYnl0ZSA9IDAsIGJpdDsKLQkgICAgCQlmb3IgKCBjPTA7IGM8d2lkdGg7ICsrYyApIHsKLQkJCQlpZiAoIChjJjcpID09IDAgKSB7Ci0JCQkJCWJ5dGUgPSAqc3JjKys7Ci0JCQkJfQotCQkJCWJpdCA9IChieXRlJjB4ODApPj43OwotCQkJCWlmICggMSApIHsKLQkJCQkgICpkc3QgPSBtYXBbYml0XTsKLQkJCQl9Ci0JCQkJZHN0Kys7Ci0JCQkJYnl0ZSA8PD0gMTsKLQkJCX0KLQkJCXNyYyArPSBzcmNza2lwOwotCQkJZHN0ICs9IGRzdHNraXA7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoIGhlaWdodC0tICkgewotCQkgICAgICAgIFVpbnQ4IGJ5dGUgPSAwLCBiaXQ7Ci0JICAgIAkJZm9yICggYz0wOyBjPHdpZHRoOyArK2MgKSB7Ci0JCQkJaWYgKCAoYyY3KSA9PSAwICkgewotCQkJCQlieXRlID0gKnNyYysrOwotCQkJCX0KLQkJCQliaXQgPSAoYnl0ZSYweDgwKT4+NzsKLQkJCQlpZiAoIDEgKSB7Ci0JCQkJICAqZHN0ID0gYml0OwotCQkJCX0KLQkJCQlkc3QrKzsKLQkJCQlieXRlIDw8PSAxOwotCQkJfQotCQkJc3JjICs9IHNyY3NraXA7Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCX0KLX0KLXN0YXRpYyB2b2lkIEJsaXRCdG8yKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgYzsKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlVaW50OCAqc3JjOwotCVVpbnQxNiAqbWFwLCAqZHN0OwotCWludCBzcmNza2lwLCBkc3Rza2lwOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCXNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCXNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JZHN0ID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOwotCWRzdHNraXAgPSBpbmZvLT5kX3NraXAvMjsKLQltYXAgPSAoVWludDE2ICopaW5mby0+dGFibGU7Ci0Jc3Jjc2tpcCArPSB3aWR0aC0od2lkdGgrNykvODsKLQotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JICAgICAgICBVaW50OCBieXRlID0gMCwgYml0OwotCSAgICAJZm9yICggYz0wOyBjPHdpZHRoOyArK2MgKSB7Ci0JCQlpZiAoIChjJjcpID09IDAgKSB7Ci0JCQkJYnl0ZSA9ICpzcmMrKzsKLQkJCX0KLQkJCWJpdCA9IChieXRlJjB4ODApPj43OwotCQkJaWYgKCAxICkgewotCQkJCSpkc3QgPSBtYXBbYml0XTsKLQkJCX0KLQkJCWJ5dGUgPDw9IDE7Ci0JCQlkc3QrKzsKLQkJfQotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotfQotc3RhdGljIHZvaWQgQmxpdEJ0bzMoU0RMX0JsaXRJbmZvICppbmZvKQotewotCWludCBjLCBvOwotCWludCB3aWR0aCwgaGVpZ2h0OwotCVVpbnQ4ICpzcmMsICptYXAsICpkc3Q7Ci0JaW50IHNyY3NraXAsIGRzdHNraXA7Ci0KLQkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KLQl3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0Jc3JjID0gaW5mby0+c19waXhlbHM7Ci0Jc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCW1hcCA9IGluZm8tPnRhYmxlOwotCXNyY3NraXAgKz0gd2lkdGgtKHdpZHRoKzcpLzg7Ci0KLQl3aGlsZSAoIGhlaWdodC0tICkgewotCSAgICAgICAgVWludDggYnl0ZSA9IDAsIGJpdDsKLQkgICAgCWZvciAoIGM9MDsgYzx3aWR0aDsgKytjICkgewotCQkJaWYgKCAoYyY3KSA9PSAwICkgewotCQkJCWJ5dGUgPSAqc3JjKys7Ci0JCQl9Ci0JCQliaXQgPSAoYnl0ZSYweDgwKT4+NzsKLQkJCWlmICggMSApIHsKLQkJCQlvID0gYml0ICogNDsKLQkJCQlkc3RbMF0gPSBtYXBbbysrXTsKLQkJCQlkc3RbMV0gPSBtYXBbbysrXTsKLQkJCQlkc3RbMl0gPSBtYXBbbysrXTsKLQkJCX0KLQkJCWJ5dGUgPDw9IDE7Ci0JCQlkc3QgKz0gMzsKLQkJfQotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotfQotc3RhdGljIHZvaWQgQmxpdEJ0bzQoU0RMX0JsaXRJbmZvICppbmZvKQotewotCWludCB3aWR0aCwgaGVpZ2h0OwotCVVpbnQ4ICpzcmM7Ci0JVWludDMyICptYXAsICpkc3Q7Ci0JaW50IHNyY3NraXAsIGRzdHNraXA7Ci0JaW50IGM7Ci0KLQkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KLQl3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0Jc3JjID0gaW5mby0+c19waXhlbHM7Ci0Jc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlkc3QgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0JZHN0c2tpcCA9IGluZm8tPmRfc2tpcC80OwotCW1hcCA9IChVaW50MzIgKilpbmZvLT50YWJsZTsKLQlzcmNza2lwICs9IHdpZHRoLSh3aWR0aCs3KS84OwotCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkgICAgICAgIFVpbnQ4IGJ5dGUgPSAwLCBiaXQ7Ci0JICAgIAlmb3IgKCBjPTA7IGM8d2lkdGg7ICsrYyApIHsKLQkJCWlmICggKGMmNykgPT0gMCApIHsKLQkJCQlieXRlID0gKnNyYysrOwotCQkJfQotCQkJYml0ID0gKGJ5dGUmMHg4MCk+Pjc7Ci0JCQlpZiAoIDEgKSB7Ci0JCQkJKmRzdCA9IG1hcFtiaXRdOwotCQkJfQotCQkJYnl0ZSA8PD0gMTsKLQkJCWRzdCsrOwotCQl9Ci0JCXNyYyArPSBzcmNza2lwOwotCQlkc3QgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJsaXRCdG8xS2V5KFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLSAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlVaW50MzIgY2tleSA9IGluZm8tPnNyYy0+Y29sb3JrZXk7Ci0JVWludDggKnBhbG1hcCA9IGluZm8tPnRhYmxlOwotCWludCBjOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jc3Jjc2tpcCArPSB3aWR0aC0od2lkdGgrNykvODsKLQotCWlmICggcGFsbWFwICkgewotCQl3aGlsZSAoIGhlaWdodC0tICkgewotCQkgICAgICAgIFVpbnQ4ICBieXRlID0gMCwgYml0OwotCSAgICAJCWZvciAoIGM9MDsgYzx3aWR0aDsgKytjICkgewotCQkJCWlmICggKGMmNykgPT0gMCApIHsKLQkJCQkJYnl0ZSA9ICpzcmMrKzsKLQkJCQl9Ci0JCQkJYml0ID0gKGJ5dGUmMHg4MCk+Pjc7Ci0JCQkJaWYgKCBiaXQgIT0gY2tleSApIHsKLQkJCQkgICpkc3QgPSBwYWxtYXBbYml0XTsKLQkJCQl9Ci0JCQkJZHN0Kys7Ci0JCQkJYnl0ZSA8PD0gMTsKLQkJCX0KLQkJCXNyYyArPSBzcmNza2lwOwotCQkJZHN0ICs9IGRzdHNraXA7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoIGhlaWdodC0tICkgewotCQkgICAgICAgIFVpbnQ4ICBieXRlID0gMCwgYml0OwotCSAgICAJCWZvciAoIGM9MDsgYzx3aWR0aDsgKytjICkgewotCQkJCWlmICggKGMmNykgPT0gMCApIHsKLQkJCQkJYnl0ZSA9ICpzcmMrKzsKLQkJCQl9Ci0JCQkJYml0ID0gKGJ5dGUmMHg4MCk+Pjc7Ci0JCQkJaWYgKCBiaXQgIT0gY2tleSApIHsKLQkJCQkgICpkc3QgPSBiaXQ7Ci0JCQkJfQotCQkJCWRzdCsrOwotCQkJCWJ5dGUgPDw9IDE7Ci0JCQl9Ci0JCQlzcmMgKz0gc3Jjc2tpcDsKLQkJCWRzdCArPSBkc3Rza2lwOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBCbGl0QnRvMktleShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0gICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKLQlVaW50MTYgKmRzdHAgPSAoVWludDE2ICopaW5mby0+ZF9waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7Ci0JVWludDMyIGNrZXkgPSBpbmZvLT5zcmMtPmNvbG9ya2V5OwotCVVpbnQ4ICpwYWxtYXAgPSBpbmZvLT50YWJsZTsKLQlpbnQgYzsKLQotCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLwotCXNyY3NraXAgKz0gd2lkdGgtKHdpZHRoKzcpLzg7Ci0JZHN0c2tpcCAvPSAyOwotCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkgICAgICAgIFVpbnQ4IGJ5dGUgPSAwLCBiaXQ7Ci0JICAgIAlmb3IgKCBjPTA7IGM8d2lkdGg7ICsrYyApIHsKLQkJCWlmICggKGMmNykgPT0gMCApIHsKLQkJCQlieXRlID0gKnNyYysrOwotCQkJfQotCQkJYml0ID0gKGJ5dGUmMHg4MCk+Pjc7Ci0JCQlpZiAoIGJpdCAhPSBja2V5ICkgewotCQkJCSpkc3RwPSgoVWludDE2ICopcGFsbWFwKVtiaXRdOwotCQkJfQotCQkJYnl0ZSA8PD0gMTsKLQkJCWRzdHArKzsKLQkJfQotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0cCArPSBkc3Rza2lwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQmxpdEJ0bzNLZXkoU0RMX0JsaXRJbmZvICppbmZvKQotewotICAgICAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7Ci0JVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKLQlVaW50OCAqcGFsbWFwID0gaW5mby0+dGFibGU7Ci0JaW50IGM7Ci0KLQkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KLQlzcmNza2lwICs9IHdpZHRoLSh3aWR0aCs3KS84OwotCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkgICAgICAgIFVpbnQ4ICBieXRlID0gMCwgYml0OwotCSAgICAJZm9yICggYz0wOyBjPHdpZHRoOyArK2MgKSB7Ci0JCQlpZiAoIChjJjcpID09IDAgKSB7Ci0JCQkJYnl0ZSA9ICpzcmMrKzsKLQkJCX0KLQkJCWJpdCA9IChieXRlJjB4ODApPj43OwotCQkJaWYgKCBiaXQgIT0gY2tleSApIHsKLQkJCQlTRExfbWVtY3B5KGRzdCwgJnBhbG1hcFtiaXQqNF0sIDMpOwotCQkJfQotCQkJYnl0ZSA8PD0gMTsKLQkJCWRzdCArPSAzOwotCQl9Ci0JCXNyYyArPSBzcmNza2lwOwotCQlkc3QgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJsaXRCdG80S2V5KFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLSAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlVaW50MzIgY2tleSA9IGluZm8tPnNyYy0+Y29sb3JrZXk7Ci0JVWludDggKnBhbG1hcCA9IGluZm8tPnRhYmxlOwotCWludCBjOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jc3Jjc2tpcCArPSB3aWR0aC0od2lkdGgrNykvODsKLQlkc3Rza2lwIC89IDQ7Ci0KLQl3aGlsZSAoIGhlaWdodC0tICkgewotCSAgICAgICAgVWludDggYnl0ZSA9IDAsIGJpdDsKLQkgICAgCWZvciAoIGM9MDsgYzx3aWR0aDsgKytjICkgewotCQkJaWYgKCAoYyY3KSA9PSAwICkgewotCQkJCWJ5dGUgPSAqc3JjKys7Ci0JCQl9Ci0JCQliaXQgPSAoYnl0ZSYweDgwKT4+NzsKLQkJCWlmICggYml0ICE9IGNrZXkgKSB7Ci0JCQkJKmRzdHA9KChVaW50MzIgKilwYWxtYXApW2JpdF07Ci0JCQl9Ci0JCQlieXRlIDw8PSAxOwotCQkJZHN0cCsrOwotCQl9Ci0JCXNyYyArPSBzcmNza2lwOwotCQlkc3RwICs9IGRzdHNraXA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBCbGl0QnRvTkFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLSAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQljb25zdCBTRExfQ29sb3IgKnNyY3BhbAk9IGluZm8tPnNyYy0+cGFsZXR0ZS0+Y29sb3JzOwotCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OwotCWludCAgZHN0YnBwOwotCWludCBjOwotCWNvbnN0IGludCBBID0gaW5mby0+c3JjLT5hbHBoYTsKLQotCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLwotCWRzdGJwcCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQlzcmNza2lwICs9IHdpZHRoLSh3aWR0aCs3KS84OwotCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkgICAgICAgIFVpbnQ4IGJ5dGUgPSAwLCBiaXQ7Ci0JICAgIAlmb3IgKCBjPTA7IGM8d2lkdGg7ICsrYyApIHsKLQkJCWlmICggKGMmNykgPT0gMCApIHsKLQkJCQlieXRlID0gKnNyYysrOwotCQkJfQotCQkJYml0ID0gKGJ5dGUmMHg4MCk+Pjc7Ci0JCQlpZiAoIDEgKSB7Ci0JCQkgICAgICAgIFVpbnQzMiBwaXhlbDsKLQkJCSAgICAgICAgdW5zaWduZWQgc1IsIHNHLCBzQjsKLQkJCQl1bnNpZ25lZCBkUiwgZEcsIGRCOwotCQkJCXNSID0gc3JjcGFsW2JpdF0ucjsKLQkJCQlzRyA9IHNyY3BhbFtiaXRdLmc7Ci0JCQkJc0IgPSBzcmNwYWxbYml0XS5iOwotCQkJCURJU0VNQkxFX1JHQihkc3QsIGRzdGJwcCwgZHN0Zm10LAotCQkJCQkJCXBpeGVsLCBkUiwgZEcsIGRCKTsKLQkJCQlBTFBIQV9CTEVORChzUiwgc0csIHNCLCBBLCBkUiwgZEcsIGRCKTsKLQkJCSAgCUFTU0VNQkxFX1JHQihkc3QsIGRzdGJwcCwgZHN0Zm10LCBkUiwgZEcsIGRCKTsKLQkJCX0KLQkJCWJ5dGUgPDw9IDE7Ci0JCQlkc3QgKz0gZHN0YnBwOwotCQl9Ci0JCXNyYyArPSBzcmNza2lwOwotCQlkc3QgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJsaXRCdG9OQWxwaGFLZXkoU0RMX0JsaXRJbmZvICppbmZvKQotewotICAgICAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7Ci0JVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCVNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOwotCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OwotCWNvbnN0IFNETF9Db2xvciAqc3JjcGFsCT0gc3JjZm10LT5wYWxldHRlLT5jb2xvcnM7Ci0JaW50IGRzdGJwcDsKLQlpbnQgYzsKLQljb25zdCBpbnQgQSA9IHNyY2ZtdC0+YWxwaGE7Ci0JVWludDMyIGNrZXkgPSBzcmNmbXQtPmNvbG9ya2V5OwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0JZHN0YnBwID0gZHN0Zm10LT5CeXRlc1BlclBpeGVsOwotCXNyY3NraXAgKz0gd2lkdGgtKHdpZHRoKzcpLzg7Ci0KLQl3aGlsZSAoIGhlaWdodC0tICkgewotCSAgICAgICAgVWludDggIGJ5dGUgPSAwLCBiaXQ7Ci0JICAgIAlmb3IgKCBjPTA7IGM8d2lkdGg7ICsrYyApIHsKLQkJCWlmICggKGMmNykgPT0gMCApIHsKLQkJCQlieXRlID0gKnNyYysrOwotCQkJfQotCQkJYml0ID0gKGJ5dGUmMHg4MCk+Pjc7Ci0JCQlpZiAoIGJpdCAhPSBja2V5ICkgewotCQkJICAgICAgICBpbnQgc1IsIHNHLCBzQjsKLQkJCQlpbnQgZFIsIGRHLCBkQjsKLQkJCQlVaW50MzIgcGl4ZWw7Ci0JCQkJc1IgPSBzcmNwYWxbYml0XS5yOwotCQkJCXNHID0gc3JjcGFsW2JpdF0uZzsKLQkJCQlzQiA9IHNyY3BhbFtiaXRdLmI7Ci0JCQkJRElTRU1CTEVfUkdCKGRzdCwgZHN0YnBwLCBkc3RmbXQsCi0JCQkJCQkJcGl4ZWwsIGRSLCBkRywgZEIpOwotCQkJCUFMUEhBX0JMRU5EKHNSLCBzRywgc0IsIEEsIGRSLCBkRywgZEIpOwotCQkJICAJQVNTRU1CTEVfUkdCKGRzdCwgZHN0YnBwLCBkc3RmbXQsIGRSLCBkRywgZEIpOwotCQkJfQotCQkJYnl0ZSA8PD0gMTsKLQkJCWRzdCArPSBkc3RicHA7Ci0JCX0KLQkJc3JjICs9IHNyY3NraXA7Ci0JCWRzdCArPSBkc3Rza2lwOwotCX0KLX0KLQotc3RhdGljIFNETF9sb2JsaXQgYml0bWFwX2JsaXRbXSA9IHsKLQlOVUxMLCBCbGl0QnRvMSwgQmxpdEJ0bzIsIEJsaXRCdG8zLCBCbGl0QnRvNAotfTsKLQotc3RhdGljIFNETF9sb2JsaXQgY29sb3JrZXlfYmxpdFtdID0gewotICAgIE5VTEwsIEJsaXRCdG8xS2V5LCBCbGl0QnRvMktleSwgQmxpdEJ0bzNLZXksIEJsaXRCdG80S2V5Ci19OwotCi1TRExfbG9ibGl0IFNETF9DYWxjdWxhdGVCbGl0MChTRExfU3VyZmFjZSAqc3VyZmFjZSwgaW50IGJsaXRfaW5kZXgpCi17Ci0JaW50IHdoaWNoOwotCi0JaWYgKCBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSAxICkgewotCQkvKiBXZSBkb24ndCBzdXBwb3J0IHN1YiA4LWJpdCBwYWNrZWQgcGl4ZWwgbW9kZXMgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggc3VyZmFjZS0+bWFwLT5kc3QtPmZvcm1hdC0+Qml0c1BlclBpeGVsIDwgOCApIHsKLQkJd2hpY2ggPSAwOwotCX0gZWxzZSB7Ci0JCXdoaWNoID0gc3VyZmFjZS0+bWFwLT5kc3QtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLQl9Ci0Jc3dpdGNoKGJsaXRfaW5kZXgpIHsKLQljYXNlIDA6CQkJLyogY29weSAqLwotCSAgICByZXR1cm4gYml0bWFwX2JsaXRbd2hpY2hdOwotCi0JY2FzZSAxOgkJCS8qIGNvbG9ya2V5ICovCi0JICAgIHJldHVybiBjb2xvcmtleV9ibGl0W3doaWNoXTsKLQotCWNhc2UgMjoJCQkvKiBhbHBoYSAqLwotCSAgICByZXR1cm4gd2hpY2ggPj0gMiA/IEJsaXRCdG9OQWxwaGEgOiBOVUxMOwotCi0JY2FzZSA0OgkJCS8qIGFscGhhICsgY29sb3JrZXkgKi8KLQkgICAgcmV0dXJuIHdoaWNoID49IDIgPyBCbGl0QnRvTkFscGhhS2V5IDogTlVMTDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2JsaXRfMS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfYmxpdF8xLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMTEyNmIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfYmxpdF8xLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfYmxpdC5oIgotI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJsaXQgZnJvbSA4LWJpdCBzdXJmYWNlcyB0byBvdGhlciBzdXJmYWNlcyAqLwotCi1zdGF0aWMgdm9pZCBCbGl0MXRvMShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0jaWZuZGVmIFVTRV9EVUZGU19MT09QCi0JaW50IGM7Ci0jZW5kaWYKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlVaW50OCAqc3JjLCAqbWFwLCAqZHN0OwotCWludCBzcmNza2lwLCBkc3Rza2lwOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCXNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCXNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JZHN0ID0gaW5mby0+ZF9waXhlbHM7Ci0JZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQltYXAgPSBpbmZvLT50YWJsZTsKLQotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0jaWZkZWYgVVNFX0RVRkZTX0xPT1AKLQkJRFVGRlNfTE9PUCgKLQkJCXsKLQkJCSAgKmRzdCA9IG1hcFsqc3JjXTsKLQkJCX0KLQkJCWRzdCsrOwotCQkJc3JjKys7Ci0JCSwgd2lkdGgpOwotI2Vsc2UKLQkJZm9yICggYz13aWR0aDsgYzsgLS1jICkgewotCQkgICAgICAgICpkc3QgPSBtYXBbKnNyY107Ci0JCQlkc3QrKzsKLQkJCXNyYysrOwotCQl9Ci0jZW5kaWYKLQkJc3JjICs9IHNyY3NraXA7Ci0JCWRzdCArPSBkc3Rza2lwOwotCX0KLX0KLS8qIFRoaXMgaXMgbm93IGVuZGlhbiBkZXBlbmRlbnQgKi8KLSNpZiAoIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4gKQotI2RlZmluZSBISQkxCi0jZGVmaW5lIExPCTAKLSNlbHNlIC8qICggU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTiApICovCi0jZGVmaW5lIEhJCTAKLSNkZWZpbmUgTE8JMQotI2VuZGlmCi1zdGF0aWMgdm9pZCBCbGl0MXRvMihTRExfQmxpdEluZm8gKmluZm8pCi17Ci0jaWZuZGVmIFVTRV9EVUZGU19MT09QCi0JaW50IGM7Ci0jZW5kaWYKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlVaW50OCAqc3JjLCAqZHN0OwotCVVpbnQxNiAqbWFwOwotCWludCBzcmNza2lwLCBkc3Rza2lwOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCXNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCXNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JZHN0ID0gaW5mby0+ZF9waXhlbHM7Ci0JZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQltYXAgPSAoVWludDE2ICopaW5mby0+dGFibGU7Ci0KLSNpZmRlZiBVU0VfRFVGRlNfTE9PUAotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JCURVRkZTX0xPT1AoCi0JCXsKLQkJCSooVWludDE2ICopZHN0ID0gbWFwWypzcmMrK107Ci0JCQlkc3QgKz0gMjsKLQkJfSwKLQkJd2lkdGgpOwotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotI2Vsc2UKLQkvKiBNZW1vcnkgYWxpZ24gYXQgNC1ieXRlIGJvdW5kYXJ5LCBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoIChsb25nKWRzdCAmIDB4MDMgKSB7Ci0JCS8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdpZHRoIGlzIDAgKi8KLQkJaWYgKCB3aWR0aCA9PSAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS0td2lkdGg7Ci0KLQkJd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJCS8qIFBlcmZvcm0gY29weSBhbGlnbm1lbnQgKi8KLQkJCSooVWludDE2ICopZHN0ID0gbWFwWypzcmMrK107Ci0JCQlkc3QgKz0gMjsKLQotCQkJLyogQ29weSBpbiA0IHBpeGVsIGNodW5rcyAqLwotCQkJZm9yICggYz13aWR0aC80OyBjOyAtLWMgKSB7Ci0JCQkJKihVaW50MzIgKilkc3QgPQotCQkJCQkobWFwW3NyY1tISV1dPDwxNil8KG1hcFtzcmNbTE9dXSk7Ci0JCQkJc3JjICs9IDI7Ci0JCQkJZHN0ICs9IDQ7Ci0JCQkJKihVaW50MzIgKilkc3QgPQotCQkJCQkobWFwW3NyY1tISV1dPDwxNil8KG1hcFtzcmNbTE9dXSk7Ci0JCQkJc3JjICs9IDI7Ci0JCQkJZHN0ICs9IDQ7Ci0JCQl9Ci0JCQkvKiBHZXQgYW55IGxlZnRvdmVycyAqLwotCQkJc3dpdGNoICh3aWR0aCAmIDMpIHsKLQkJCQljYXNlIDM6Ci0JCQkJCSooVWludDE2ICopZHN0ID0gbWFwWypzcmMrK107Ci0JCQkJCWRzdCArPSAyOwotCQkJCWNhc2UgMjoKLQkJCQkJKihVaW50MzIgKilkc3QgPQotCQkJCQkgIChtYXBbc3JjW0hJXV08PDE2KXwobWFwW3NyY1tMT11dKTsKLQkJCQkJc3JjICs9IDI7Ci0JCQkJCWRzdCArPSA0OwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCSooVWludDE2ICopZHN0ID0gbWFwWypzcmMrK107Ci0JCQkJCWRzdCArPSAyOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCXNyYyArPSBzcmNza2lwOwotCQkJZHN0ICs9IGRzdHNraXA7Ci0JCX0KLQl9IGVsc2UgeyAKLQkJd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJCS8qIENvcHkgaW4gNCBwaXhlbCBjaHVua3MgKi8KLQkJCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgewotCQkJCSooVWludDMyICopZHN0ID0KLQkJCQkJKG1hcFtzcmNbSEldXTw8MTYpfChtYXBbc3JjW0xPXV0pOwotCQkJCXNyYyArPSAyOwotCQkJCWRzdCArPSA0OwotCQkJCSooVWludDMyICopZHN0ID0KLQkJCQkJKG1hcFtzcmNbSEldXTw8MTYpfChtYXBbc3JjW0xPXV0pOwotCQkJCXNyYyArPSAyOwotCQkJCWRzdCArPSA0OwotCQkJfQotCQkJLyogR2V0IGFueSBsZWZ0b3ZlcnMgKi8KLQkJCXN3aXRjaCAod2lkdGggJiAzKSB7Ci0JCQkJY2FzZSAzOgotCQkJCQkqKFVpbnQxNiAqKWRzdCA9IG1hcFsqc3JjKytdOwotCQkJCQlkc3QgKz0gMjsKLQkJCQljYXNlIDI6Ci0JCQkJCSooVWludDMyICopZHN0ID0KLQkJCQkJICAobWFwW3NyY1tISV1dPDwxNil8KG1hcFtzcmNbTE9dXSk7Ci0JCQkJCXNyYyArPSAyOwotCQkJCQlkc3QgKz0gNDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQkqKFVpbnQxNiAqKWRzdCA9IG1hcFsqc3JjKytdOwotCQkJCQlkc3QgKz0gMjsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzcmMgKz0gc3Jjc2tpcDsKLQkJCWRzdCArPSBkc3Rza2lwOwotCQl9Ci0JfQotI2VuZGlmIC8qIFVTRV9EVUZGU19MT09QICovCi19Ci1zdGF0aWMgdm9pZCBCbGl0MXRvMyhTRExfQmxpdEluZm8gKmluZm8pCi17Ci0jaWZuZGVmIFVTRV9EVUZGU19MT09QCi0JaW50IGM7Ci0jZW5kaWYKLQlpbnQgbzsKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlVaW50OCAqc3JjLCAqbWFwLCAqZHN0OwotCWludCBzcmNza2lwLCBkc3Rza2lwOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCXNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCXNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JZHN0ID0gaW5mby0+ZF9waXhlbHM7Ci0JZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQltYXAgPSBpbmZvLT50YWJsZTsKLQotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0jaWZkZWYgVVNFX0RVRkZTX0xPT1AKLQkJRFVGRlNfTE9PUCgKLQkJCXsKLQkJCQlvID0gKnNyYyAqIDQ7Ci0JCQkJZHN0WzBdID0gbWFwW28rK107Ci0JCQkJZHN0WzFdID0gbWFwW28rK107Ci0JCQkJZHN0WzJdID0gbWFwW28rK107Ci0JCQl9Ci0JCQlzcmMrKzsKLQkJCWRzdCArPSAzOwotCQksIHdpZHRoKTsKLSNlbHNlCi0JCWZvciAoIGM9d2lkdGg7IGM7IC0tYyApIHsKLQkJCW8gPSAqc3JjICogNDsKLQkJCWRzdFswXSA9IG1hcFtvKytdOwotCQkJZHN0WzFdID0gbWFwW28rK107Ci0JCQlkc3RbMl0gPSBtYXBbbysrXTsKLQkJCXNyYysrOwotCQkJZHN0ICs9IDM7Ci0JCX0KLSNlbmRpZiAvKiBVU0VfRFVGRlNfTE9PUCAqLwotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotfQotc3RhdGljIHZvaWQgQmxpdDF0bzQoU0RMX0JsaXRJbmZvICppbmZvKQotewotI2lmbmRlZiBVU0VfRFVGRlNfTE9PUAotCWludCBjOwotI2VuZGlmCi0JaW50IHdpZHRoLCBoZWlnaHQ7Ci0JVWludDggKnNyYzsKLQlVaW50MzIgKm1hcCwgKmRzdDsKLQlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKLQotCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLwotCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlzcmMgPSBpbmZvLT5zX3BpeGVsczsKLQlzcmNza2lwID0gaW5mby0+c19za2lwOwotCWRzdCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKLQlkc3Rza2lwID0gaW5mby0+ZF9za2lwLzQ7Ci0JbWFwID0gKFVpbnQzMiAqKWluZm8tPnRhYmxlOwotCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLSNpZmRlZiBVU0VfRFVGRlNfTE9PUAotCQlEVUZGU19MT09QKAotCQkJKmRzdCsrID0gbWFwWypzcmMrK107Ci0JCSwgd2lkdGgpOwotI2Vsc2UKLQkJZm9yICggYz13aWR0aC80OyBjOyAtLWMgKSB7Ci0JCQkqZHN0KysgPSBtYXBbKnNyYysrXTsKLQkJCSpkc3QrKyA9IG1hcFsqc3JjKytdOwotCQkJKmRzdCsrID0gbWFwWypzcmMrK107Ci0JCQkqZHN0KysgPSBtYXBbKnNyYysrXTsKLQkJfQotCQlzd2l0Y2ggKCB3aWR0aCAmIDMgKSB7Ci0JCQljYXNlIDM6Ci0JCQkJKmRzdCsrID0gbWFwWypzcmMrK107Ci0JCQljYXNlIDI6Ci0JCQkJKmRzdCsrID0gbWFwWypzcmMrK107Ci0JCQljYXNlIDE6Ci0JCQkJKmRzdCsrID0gbWFwWypzcmMrK107Ci0JCX0KLSNlbmRpZiAvKiBVU0VfRFVGRlNfTE9PUCAqLwotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBCbGl0MXRvMUtleShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlVaW50OCAqcGFsbWFwID0gaW5mby0+dGFibGU7Ci0JVWludDMyIGNrZXkgPSBpbmZvLT5zcmMtPmNvbG9ya2V5OwotICAgICAgICAKLQlpZiAoIHBhbG1hcCApIHsKLQkJd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJCURVRkZTX0xPT1AoCi0JCQl7Ci0JCQkJaWYgKCAqc3JjICE9IGNrZXkgKSB7Ci0JCQkJICAqZHN0ID0gcGFsbWFwWypzcmNdOwotCQkJCX0KLQkJCQlkc3QrKzsKLQkJCQlzcmMrKzsKLQkJCX0sCi0JCQl3aWR0aCk7Ci0JCQlzcmMgKz0gc3Jjc2tpcDsKLQkJCWRzdCArPSBkc3Rza2lwOwotCQl9Ci0JfSBlbHNlIHsKLQkJd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJCURVRkZTX0xPT1AoCi0JCQl7Ci0JCQkJaWYgKCAqc3JjICE9IGNrZXkgKSB7Ci0JCQkJICAqZHN0ID0gKnNyYzsKLQkJCQl9Ci0JCQkJZHN0Kys7Ci0JCQkJc3JjKys7Ci0JCQl9LAotCQkJd2lkdGgpOwotCQkJc3JjICs9IHNyY3NraXA7Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgQmxpdDF0bzJLZXkoU0RMX0JsaXRJbmZvICppbmZvKQotewotCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlVaW50MTYgKmRzdHAgPSAoVWludDE2ICopaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7Ci0JVWludDE2ICpwYWxtYXAgPSAoVWludDE2ICopaW5mby0+dGFibGU7Ci0JVWludDMyIGNrZXkgPSBpbmZvLT5zcmMtPmNvbG9ya2V5OwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0JZHN0c2tpcCAvPSAyOwotCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJRFVGRlNfTE9PUCgKLQkJewotCQkJaWYgKCAqc3JjICE9IGNrZXkgKSB7Ci0JCQkJKmRzdHA9cGFsbWFwWypzcmNdOwotCQkJfQotCQkJc3JjKys7Ci0JCQlkc3RwKys7Ci0JCX0sCi0JCXdpZHRoKTsKLQkJc3JjICs9IHNyY3NraXA7Ci0JCWRzdHAgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJsaXQxdG8zS2V5KFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCVVpbnQ4ICpwYWxtYXAgPSBpbmZvLT50YWJsZTsKLQlVaW50MzIgY2tleSA9IGluZm8tPnNyYy0+Y29sb3JrZXk7Ci0JaW50IG87Ci0KLQl3aGlsZSAoIGhlaWdodC0tICkgewotCQlEVUZGU19MT09QKAotCQl7Ci0JCQlpZiAoICpzcmMgIT0gY2tleSApIHsKLQkJCQlvID0gKnNyYyAqIDQ7Ci0JCQkJZHN0WzBdID0gcGFsbWFwW28rK107Ci0JCQkJZHN0WzFdID0gcGFsbWFwW28rK107Ci0JCQkJZHN0WzJdID0gcGFsbWFwW28rK107Ci0JCQl9Ci0JCQlzcmMrKzsKLQkJCWRzdCArPSAzOwotCQl9LAotCQl3aWR0aCk7Ci0JCXNyYyArPSBzcmNza2lwOwotCQlkc3QgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJsaXQxdG80S2V5KFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCVVpbnQzMiAqcGFsbWFwID0gKFVpbnQzMiAqKWluZm8tPnRhYmxlOwotCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKLQotCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLwotCWRzdHNraXAgLz0gNDsKLQotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JCURVRkZTX0xPT1AoCi0JCXsKLQkJCWlmICggKnNyYyAhPSBja2V5ICkgewotCQkJCSpkc3RwID0gcGFsbWFwWypzcmNdOwotCQkJfQotCQkJc3JjKys7Ci0JCQlkc3RwKys7Ci0JCX0sCi0JCXdpZHRoKTsKLQkJc3JjICs9IHNyY3NraXA7Ci0JCWRzdHAgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJsaXQxdG9OQWxwaGEoU0RMX0JsaXRJbmZvICppbmZvKQotewotCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7Ci0JU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7Ci0JY29uc3QgU0RMX0NvbG9yICpzcmNwYWwJPSBpbmZvLT5zcmMtPnBhbGV0dGUtPmNvbG9yczsKLQlpbnQgZHN0YnBwOwotCWNvbnN0IGludCBBID0gaW5mby0+c3JjLT5hbHBoYTsKLQotCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLwotCWRzdGJwcCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JICAgICAgICBpbnQgc1IsIHNHLCBzQjsKLQkJaW50IGRSLCBkRywgZEI7Ci0JICAgIAlEVUZGU19MT09QNCgKLQkJCXsKLQkJCSAgICAgICAgVWludDMyIHBpeGVsOwotCQkJCXNSID0gc3JjcGFsWypzcmNdLnI7Ci0JCQkJc0cgPSBzcmNwYWxbKnNyY10uZzsKLQkJCQlzQiA9IHNyY3BhbFsqc3JjXS5iOwotCQkJCURJU0VNQkxFX1JHQihkc3QsIGRzdGJwcCwgZHN0Zm10LAotCQkJCQkgICAgIHBpeGVsLCBkUiwgZEcsIGRCKTsKLQkJCQlBTFBIQV9CTEVORChzUiwgc0csIHNCLCBBLCBkUiwgZEcsIGRCKTsKLQkJCSAgCUFTU0VNQkxFX1JHQihkc3QsIGRzdGJwcCwgZHN0Zm10LCBkUiwgZEcsIGRCKTsKLQkJCQlzcmMrKzsKLQkJCQlkc3QgKz0gZHN0YnBwOwotCQkJfSwKLQkJCXdpZHRoKTsKLQkJc3JjICs9IHNyY3NraXA7Ci0JCWRzdCArPSBkc3Rza2lwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQmxpdDF0b05BbHBoYUtleShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLQlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKLQljb25zdCBTRExfQ29sb3IgKnNyY3BhbAk9IGluZm8tPnNyYy0+cGFsZXR0ZS0+Y29sb3JzOwotCVVpbnQzMiBja2V5ID0gc3JjZm10LT5jb2xvcmtleTsKLQlpbnQgZHN0YnBwOwotCWNvbnN0IGludCBBID0gc3JjZm10LT5hbHBoYTsKLQotCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLwotCWRzdGJwcCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JICAgICAgICBpbnQgc1IsIHNHLCBzQjsKLQkJaW50IGRSLCBkRywgZEI7Ci0JCURVRkZTX0xPT1AoCi0JCXsKLQkJCWlmICggKnNyYyAhPSBja2V5ICkgewotCQkJICAgICAgICBVaW50MzIgcGl4ZWw7Ci0JCQkJc1IgPSBzcmNwYWxbKnNyY10ucjsKLQkJCQlzRyA9IHNyY3BhbFsqc3JjXS5nOwotCQkJCXNCID0gc3JjcGFsWypzcmNdLmI7Ci0JCQkJRElTRU1CTEVfUkdCKGRzdCwgZHN0YnBwLCBkc3RmbXQsCi0JCQkJCQkJcGl4ZWwsIGRSLCBkRywgZEIpOwotCQkJCUFMUEhBX0JMRU5EKHNSLCBzRywgc0IsIEEsIGRSLCBkRywgZEIpOwotCQkJICAJQVNTRU1CTEVfUkdCKGRzdCwgZHN0YnBwLCBkc3RmbXQsIGRSLCBkRywgZEIpOwotCQkJfQotCQkJc3JjKys7Ci0JCQlkc3QgKz0gZHN0YnBwOwotCQl9LAotCQl3aWR0aCk7Ci0JCXNyYyArPSBzcmNza2lwOwotCQlkc3QgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLXN0YXRpYyBTRExfbG9ibGl0IG9uZV9ibGl0W10gPSB7Ci0JTlVMTCwgQmxpdDF0bzEsIEJsaXQxdG8yLCBCbGl0MXRvMywgQmxpdDF0bzQKLX07Ci0KLXN0YXRpYyBTRExfbG9ibGl0IG9uZV9ibGl0a2V5W10gPSB7Ci0gICAgICAgIE5VTEwsIEJsaXQxdG8xS2V5LCBCbGl0MXRvMktleSwgQmxpdDF0bzNLZXksIEJsaXQxdG80S2V5Ci19OwotCi1TRExfbG9ibGl0IFNETF9DYWxjdWxhdGVCbGl0MShTRExfU3VyZmFjZSAqc3VyZmFjZSwgaW50IGJsaXRfaW5kZXgpCi17Ci0JaW50IHdoaWNoOwotCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10OwotCi0JZHN0Zm10ID0gc3VyZmFjZS0+bWFwLT5kc3QtPmZvcm1hdDsKLQlpZiAoIGRzdGZtdC0+Qml0c1BlclBpeGVsIDwgOCApIHsKLQkJd2hpY2ggPSAwOwotCX0gZWxzZSB7Ci0JCXdoaWNoID0gZHN0Zm10LT5CeXRlc1BlclBpeGVsOwotCX0KLQlzd2l0Y2goYmxpdF9pbmRleCkgewotCWNhc2UgMDoJCQkvKiBjb3B5ICovCi0JICAgIHJldHVybiBvbmVfYmxpdFt3aGljaF07Ci0KLQljYXNlIDE6CQkJLyogY29sb3JrZXkgKi8KLQkgICAgcmV0dXJuIG9uZV9ibGl0a2V5W3doaWNoXTsKLQotCWNhc2UgMjoJCQkvKiBhbHBoYSAqLwotCSAgICAvKiBTdXBwb3J0aW5nIDhicHAtPjhicHAgYWxwaGEgaXMgZG9hYmxlIGJ1dCByZXF1aXJlcyBsb3RzIG9mCi0JICAgICAgIHRhYmxlcyB3aGljaCBjb25zdW1lIHNwYWNlIGFuZCB0YWtlcyB0aW1lIHRvIHByZWNvbXB1dGUsCi0JICAgICAgIHNvIGlzIGJldHRlciBsZWZ0IHRvIHRoZSB1c2VyICovCi0JICAgIHJldHVybiB3aGljaCA+PSAyID8gQmxpdDF0b05BbHBoYSA6IE5VTEw7Ci0KLQljYXNlIDM6CQkJLyogYWxwaGEgKyBjb2xvcmtleSAqLwotCSAgICByZXR1cm4gd2hpY2ggPj0gMiA/IEJsaXQxdG9OQWxwaGFLZXkgOiBOVUxMOwotCi0JfQotCXJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfYmxpdF9BLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9ibGl0X0EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2ZDNmNi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9ibGl0X0EuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NzIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfYmxpdC5oIgotCi0vKgotICBJbiBWaXN1YWwgQywgVkM2IGhhcyBtbWludHJpbi5oIGluIHRoZSAiUHJvY2Vzc29yIFBhY2siIGFkZC1vbi4KLSAgIENoZWNraW5nIGlmIF9tbV9mcmVlIGlzICNkZWZpbmVkIGluIG1hbGxvYy5oIGlzIGlzIHRoZSBvbmx5IHdheSB0bwotICAgZGV0ZXJtaW5lIGlmIHRoZSBQcm9jZXNzb3IgUGFjayBpcyBpbnN0YWxsZWQsIGFzIGZhciBhcyBJIGNhbiB0ZWxsLgotKi8KLQotI2lmIFNETF9BU1NFTUJMWV9ST1VUSU5FUwotIyAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCi0jICAgIGRlZmluZSBNTVhfQVNNQkxJVCAxCi0jICAgIGRlZmluZSBHQ0NfQVNNQkxJVCAxCi0jICBlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikKLSMgICAgaWYgKF9NU0NfVkVSIDw9IDEyMDApICAKLSMgICAgICBpbmNsdWRlIDxtYWxsb2MuaD4gICAKLSMgICAgICBpZiBkZWZpbmVkKF9tbV9mcmVlKQotIyAgICAgICAgICBkZWZpbmUgSEFWRV9NTUlOVFJJTl9IIDEKLSMgICAgICBlbmRpZgotIyAgICBlbHNlICAvKiBWaXN1YWwgU3R1ZGlvID4gVkM2IGFsd2F5cyBoYXMgbW1pbnRyaW4uaCAqLwotIyAgICAgIGRlZmluZSBIQVZFX01NSU5UUklOX0ggMQotIyAgICBlbmRpZgotIyAgICBpZiBIQVZFX01NSU5UUklOX0gKLSMgICAgICBkZWZpbmUgTU1YX0FTTUJMSVQgMQotIyAgICAgIGRlZmluZSBNU1ZDX0FTTUJMSVQgMQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZiAvKiBTRExfQVNTRU1CTFlfUk9VVElORVMgKi8KLQotLyogRnVuY3Rpb24gdG8gY2hlY2sgdGhlIENQVSBmbGFncyAqLwotI2luY2x1ZGUgIlNETF9jcHVpbmZvLmgiCi0jaWYgR0NDX0FTTUJMSVQKLSNpbmNsdWRlICJtbXguaCIKLSNlbGlmIE1TVkNfQVNNQkxJVAotI2luY2x1ZGUgPG1taW50cmluLmg+Ci0jaW5jbHVkZSA8bW0zZG5vdy5oPgotI2VuZGlmCi0KLS8qIEZ1bmN0aW9ucyB0byBwZXJmb3JtIGFscGhhIGJsZW5kZWQgYmxpdHRpbmcgKi8KLQotLyogTi0+MSBibGVuZGluZyB3aXRoIHBlci1zdXJmYWNlIGFscGhhICovCi1zdGF0aWMgdm9pZCBCbGl0TnRvMVN1cmZhY2VBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlVaW50OCAqcGFsbWFwID0gaW5mby0+dGFibGU7Ci0JU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7Ci0JU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7Ci0JaW50IHNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQotCWNvbnN0IHVuc2lnbmVkIEEgPSBzcmNmbXQtPmFscGhhOwotCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkgICAgRFVGRlNfTE9PUDQoCi0JICAgIHsKLQkJVWludDMyIFBpeGVsOwotCQl1bnNpZ25lZCBzUjsKLQkJdW5zaWduZWQgc0c7Ci0JCXVuc2lnbmVkIHNCOwotCQl1bnNpZ25lZCBkUjsKLQkJdW5zaWduZWQgZEc7Ci0JCXVuc2lnbmVkIGRCOwotCQlESVNFTUJMRV9SR0Ioc3JjLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsIHNSLCBzRywgc0IpOwotCQlkUiA9IGRzdGZtdC0+cGFsZXR0ZS0+Y29sb3JzWypkc3RdLnI7Ci0JCWRHID0gZHN0Zm10LT5wYWxldHRlLT5jb2xvcnNbKmRzdF0uZzsKLQkJZEIgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5iOwotCQlBTFBIQV9CTEVORChzUiwgc0csIHNCLCBBLCBkUiwgZEcsIGRCKTsKLQkJZFIgJj0gMHhmZjsKLQkJZEcgJj0gMHhmZjsKLQkJZEIgJj0gMHhmZjsKLQkJLyogUGFjayBSR0IgaW50byA4Yml0IHBpeGVsICovCi0JCWlmICggcGFsbWFwID09IE5VTEwgKSB7Ci0JCSAgICAqZHN0ID0oKGRSPj41KTw8KDMrMikpfAotCQkJICAoKGRHPj41KTw8KDIpKXwKLQkJCSAgKChkQj4+Nik8PCgwKSk7Ci0JCX0gZWxzZSB7Ci0JCSAgICAqZHN0ID0gcGFsbWFwWygoZFI+PjUpPDwoMysyKSl8Ci0JCQkJICAoKGRHPj41KTw8KDIpKSAgfAotCQkJCSAgKChkQj4+Nik8PCgwKSldOwotCQl9Ci0JCWRzdCsrOwotCQlzcmMgKz0gc3JjYnBwOwotCSAgICB9LAotCSAgICB3aWR0aCk7Ci0JICAgIHNyYyArPSBzcmNza2lwOwotCSAgICBkc3QgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLS8qIE4tPjEgYmxlbmRpbmcgd2l0aCBwaXhlbCBhbHBoYSAqLwotc3RhdGljIHZvaWQgQmxpdE50bzFQaXhlbEFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCVVpbnQ4ICpwYWxtYXAgPSBpbmZvLT50YWJsZTsKLQlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLQlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKLQlpbnQgc3JjYnBwID0gc3JjZm10LT5CeXRlc1BlclBpeGVsOwotCi0JLyogRklYTUU6IGZpeCBhbHBoYSBiaXQgZmllbGQgZXhwYW5zaW9uIGhlcmUgdG9vPyAqLwotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JICAgIERVRkZTX0xPT1A0KAotCSAgICB7Ci0JCVVpbnQzMiBQaXhlbDsKLQkJdW5zaWduZWQgc1I7Ci0JCXVuc2lnbmVkIHNHOwotCQl1bnNpZ25lZCBzQjsKLQkJdW5zaWduZWQgc0E7Ci0JCXVuc2lnbmVkIGRSOwotCQl1bnNpZ25lZCBkRzsKLQkJdW5zaWduZWQgZEI7Ci0JCURJU0VNQkxFX1JHQkEoc3JjLHNyY2JwcCxzcmNmbXQsUGl4ZWwsc1Isc0csc0Isc0EpOwotCQlkUiA9IGRzdGZtdC0+cGFsZXR0ZS0+Y29sb3JzWypkc3RdLnI7Ci0JCWRHID0gZHN0Zm10LT5wYWxldHRlLT5jb2xvcnNbKmRzdF0uZzsKLQkJZEIgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5iOwotCQlBTFBIQV9CTEVORChzUiwgc0csIHNCLCBzQSwgZFIsIGRHLCBkQik7Ci0JCWRSICY9IDB4ZmY7Ci0JCWRHICY9IDB4ZmY7Ci0JCWRCICY9IDB4ZmY7Ci0JCS8qIFBhY2sgUkdCIGludG8gOGJpdCBwaXhlbCAqLwotCQlpZiAoIHBhbG1hcCA9PSBOVUxMICkgewotCQkgICAgKmRzdCA9KChkUj4+NSk8PCgzKzIpKXwKLQkJCSAgKChkRz4+NSk8PCgyKSl8Ci0JCQkgICgoZEI+PjYpPDwoMCkpOwotCQl9IGVsc2UgewotCQkgICAgKmRzdCA9IHBhbG1hcFsoKGRSPj41KTw8KDMrMikpfAotCQkJCSAgKChkRz4+NSk8PCgyKSkgIHwKLQkJCQkgICgoZEI+PjYpPDwoMCkpICBdOwotCQl9Ci0JCWRzdCsrOwotCQlzcmMgKz0gc3JjYnBwOwotCSAgICB9LAotCSAgICB3aWR0aCk7Ci0JICAgIHNyYyArPSBzcmNza2lwOwotCSAgICBkc3QgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLS8qIGNvbG9ya2V5ZWQgTi0+MSBibGVuZGluZyB3aXRoIHBlci1zdXJmYWNlIGFscGhhICovCi1zdGF0aWMgdm9pZCBCbGl0TnRvMVN1cmZhY2VBbHBoYUtleShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlVaW50OCAqcGFsbWFwID0gaW5mby0+dGFibGU7Ci0JU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7Ci0JU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7Ci0JaW50IHNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQlVaW50MzIgY2tleSA9IHNyY2ZtdC0+Y29sb3JrZXk7Ci0KLQljb25zdCBpbnQgQSA9IHNyY2ZtdC0+YWxwaGE7Ci0KLQl3aGlsZSAoIGhlaWdodC0tICkgewotCSAgICBEVUZGU19MT09QKAotCSAgICB7Ci0JCVVpbnQzMiBQaXhlbDsKLQkJdW5zaWduZWQgc1I7Ci0JCXVuc2lnbmVkIHNHOwotCQl1bnNpZ25lZCBzQjsKLQkJdW5zaWduZWQgZFI7Ci0JCXVuc2lnbmVkIGRHOwotCQl1bnNpZ25lZCBkQjsKLQkJRElTRU1CTEVfUkdCKHNyYywgc3JjYnBwLCBzcmNmbXQsIFBpeGVsLCBzUiwgc0csIHNCKTsKLQkJaWYgKCBQaXhlbCAhPSBja2V5ICkgewotCQkgICAgZFIgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5yOwotCQkgICAgZEcgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5nOwotCQkgICAgZEIgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5iOwotCQkgICAgQUxQSEFfQkxFTkQoc1IsIHNHLCBzQiwgQSwgZFIsIGRHLCBkQik7Ci0JCSAgICBkUiAmPSAweGZmOwotCQkgICAgZEcgJj0gMHhmZjsKLQkJICAgIGRCICY9IDB4ZmY7Ci0JCSAgICAvKiBQYWNrIFJHQiBpbnRvIDhiaXQgcGl4ZWwgKi8KLQkJICAgIGlmICggcGFsbWFwID09IE5VTEwgKSB7Ci0JCQkqZHN0ID0oKGRSPj41KTw8KDMrMikpfAotCQkJICAgICAgKChkRz4+NSk8PCgyKSkgfAotCQkJICAgICAgKChkQj4+Nik8PCgwKSk7Ci0JCSAgICB9IGVsc2UgewotCQkJKmRzdCA9IHBhbG1hcFsoKGRSPj41KTw8KDMrMikpfAotCQkJCSAgICAgICgoZEc+PjUpPDwoMikpICB8Ci0JCQkJICAgICAgKChkQj4+Nik8PCgwKSkgIF07Ci0JCSAgICB9Ci0JCX0KLQkJZHN0Kys7Ci0JCXNyYyArPSBzcmNicHA7Ci0JICAgIH0sCi0JICAgIHdpZHRoKTsKLQkgICAgc3JjICs9IHNyY3NraXA7Ci0JICAgIGRzdCArPSBkc3Rza2lwOwotCX0KLX0KLQotI2lmIEdDQ19BU01CTElUCi0vKiBmYXN0IFJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYT0xMjggc3BlY2lhbCBjYXNlICovCi1zdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JTdXJmYWNlQWxwaGExMjhNTVgoU0RMX0JsaXRJbmZvICppbmZvKQotewotCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOwotCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOwotCVVpbnQzMiBkYWxwaGEgPSBpbmZvLT5kc3QtPkFtYXNrOwotCVVpbnQ4IGxvYWRbOF07Ci0KLQkqKFVpbnQ2NCAqKWxvYWQgPSAweDAwZmVmZWZlMDBmZWZlZmVVTEw7LyogYWxwaGExMjggbWFzayAqLwotCW1vdnFfbTJyKCpsb2FkLCBtbTQpOyAvKiBhbHBoYTEyOCBtYXNrIC0+IG1tNCAqLwotCSooVWludDY0ICopbG9hZCA9IDB4MDAwMTAxMDEwMDAxMDEwMVVMTDsvKiAhYWxwaGExMjggbWFzayAqLwotCW1vdnFfbTJyKCpsb2FkLCBtbTMpOyAvKiAhYWxwaGExMjggbWFzayAtPiBtbTMgKi8KLQltb3ZkX20ycihkYWxwaGEsIG1tNyk7IC8qIGRzdCBhbHBoYSBtYXNrICovCi0JcHVucGNrbGRxX3IycihtbTcsIG1tNyk7IC8qIGRzdCBhbHBoYSBtYXNrIHwgZHN0IGFscGhhIG1hc2sgLT4gbW03ICovCi0Jd2hpbGUoaGVpZ2h0LS0pIHsKLQkJRFVGRlNfTE9PUF9ET1VCTEUyKAotCQl7Ci0JCQlVaW50MzIgcyA9ICpzcmNwKys7Ci0JCQlVaW50MzIgZCA9ICpkc3RwOwotCQkJKmRzdHArKyA9ICgoKChzICYgMHgwMGZlZmVmZSkgKyAoZCAmIDB4MDBmZWZlZmUpKSA+PiAxKQotCQkJCSAgICsgKHMgJiBkICYgMHgwMDAxMDEwMSkpIHwgZGFscGhhOwotCQl9LHsKLQkJCW1vdnFfbTJyKCgqZHN0cCksIG1tMik7LyogMiB4IGRzdCAtPiBtbTIoQVJHQkFSR0IpICovCi0JCQltb3ZxX3IycihtbTIsIG1tNik7IC8qIDIgeCBkc3QgLT4gbW02KEFSR0JBUkdCKSAqLwotCi0JCQltb3ZxX20ycigoKnNyY3ApLCBtbTEpOy8qIDIgeCBzcmMgLT4gbW0xKEFSR0JBUkdCKSAqLwotCQkJbW92cV9yMnIobW0xLCBtbTUpOyAvKiAyIHggc3JjIC0+IG1tNShBUkdCQVJHQikgKi8KLQotCQkJcGFuZF9yMnIobW00LCBtbTYpOyAvKiBkc3QgJiBtYXNrIC0+IG1tNiAqLwotCQkJcGFuZF9yMnIobW00LCBtbTUpOyAvKiBzcmMgJiBtYXNrIC0+IG1tNSAqLwotCQkJcGFkZGRfcjJyKG1tNiwgbW01KTsgLyogbW02ICsgbW01IC0+IG1tNSAqLwotCQkJcGFuZF9yMnIobW0xLCBtbTIpOyAvKiBzcmMgJiBkc3QgLT4gbW0yICovCi0JCQlwc3JsZF9pMnIoMSwgbW01KTsgLyogbW01ID4+IDEgLT4gbW01ICovCi0JCQlwYW5kX3IycihtbTMsIG1tMik7IC8qIG1tMiAmICFtYXNrIC0+IG1tMiAqLwotCQkJcGFkZGRfcjJyKG1tNSwgbW0yKTsgLyogbW01ICsgbW0yIC0+IG1tMiAqLwotCQkJCi0JCQlwb3JfcjJyKG1tNywgbW0yKTsgLyogbW03KGZ1bGwgYWxwaGEpIHwgbW0yIC0+IG1tMiAqLwotCQkJbW92cV9yMm0obW0yLCAoKmRzdHApKTsvKiBtbTIgLT4gMiB4IGRzdCBwaXhlbHMgKi8KLQkJCWRzdHAgKz0gMjsKLQkJCXNyY3AgKz0gMjsKLQkJfSwgd2lkdGgpOwotCQlzcmNwICs9IHNyY3NraXA7Ci0JCWRzdHAgKz0gZHN0c2tpcDsKLQl9Ci0JZW1tcygpOwotfQotCi0vKiBmYXN0IFJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYSAqLwotc3RhdGljIHZvaWQgQmxpdFJHQnRvUkdCU3VyZmFjZUFscGhhTU1YKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlTRExfUGl4ZWxGb3JtYXQqIGRmID0gaW5mby0+ZHN0OwotCXVuc2lnbmVkIGFscGhhID0gaW5mby0+c3JjLT5hbHBoYTsKLQotCWlmIChhbHBoYSA9PSAxMjggJiYgKGRmLT5SbWFzayB8IGRmLT5HbWFzayB8IGRmLT5CbWFzaykgPT0gMHgwMEZGRkZGRikgewotCQkJLyogb25seSBjYWxsIGExMjggdmVyc2lvbiB3aGVuIFIsRyxCIG9jY3VweSBsb3dlciBiaXRzICovCi0JCUJsaXRSR0J0b1JHQlN1cmZhY2VBbHBoYTEyOE1NWChpbmZvKTsKLQl9IGVsc2UgewotCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKLQkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLQkJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOwotCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOwotCi0JCXB4b3JfcjJyKG1tNSwgbW01KTsgLyogMCAtPiBtbTUgKi8KLQkJLyogZm9ybSB0aGUgYWxwaGEgbXVsdCAqLwotCQltb3ZkX20ycihhbHBoYSwgbW00KTsgLyogMDAwMDAwMEEgLT4gbW00ICovCi0JCXB1bnBja2x3ZF9yMnIobW00LCBtbTQpOyAvKiAwMDAwMEEwQSAtPiBtbTQgKi8KLQkJcHVucGNrbGRxX3IycihtbTQsIG1tNCk7IC8qIDBBMEEwQTBBIC0+IG1tNCAqLwotCQlhbHBoYSA9ICgweGZmIDw8IGRmLT5Sc2hpZnQpIHwgKDB4ZmYgPDwgZGYtPkdzaGlmdCkgfCAoMHhmZiA8PCBkZi0+QnNoaWZ0KTsKLQkJbW92ZF9tMnIoYWxwaGEsIG1tMCk7IC8qIDAwMDAwRkZGIC0+IG1tMCAqLwotCQlwdW5wY2tsYndfcjJyKG1tMCwgbW0wKTsgLyogMDBGRkZGRkYgLT4gbW0wICovCi0JCXBhbmRfcjJyKG1tMCwgbW00KTsgLyogMEEwQTBBMEEgLT4gbW00LCBtaW51cyAxIGNoYW4gKi8KLQkJCS8qIGF0IHRoaXMgcG9pbnQgbW00IGNhbiBiZSAwMDBBMEEwQSBvciAwQTBBMEEwMCBvciBhbm90aGVyIGNvbWJvICovCi0JCW1vdmRfbTJyKGRmLT5BbWFzaywgbW03KTsgLyogZHN0IGFscGhhIG1hc2sgKi8KLQkJcHVucGNrbGRxX3IycihtbTcsIG1tNyk7IC8qIGRzdCBhbHBoYSBtYXNrIHwgZHN0IGFscGhhIG1hc2sgLT4gbW03ICovCi0JCQotCQl3aGlsZShoZWlnaHQtLSkgewotCQkJRFVGRlNfTE9PUF9ET1VCTEUyKHsKLQkJCQkvKiBPbmUgUGl4ZWwgQmxlbmQgKi8KLQkJCQltb3ZkX20ycigoKnNyY3ApLCBtbTEpOy8qIHNyYyhBUkdCKSAtPiBtbTEgKDAwMDBBUkdCKSovCi0JCQkJbW92ZF9tMnIoKCpkc3RwKSwgbW0yKTsvKiBkc3QoQVJHQikgLT4gbW0yICgwMDAwQVJHQikqLwotCQkJCXB1bnBja2xid19yMnIobW01LCBtbTEpOyAvKiAwQTBSMEcwQiAtPiBtbTEoc3JjKSAqLwotCQkJCXB1bnBja2xid19yMnIobW01LCBtbTIpOyAvKiAwQTBSMEcwQiAtPiBtbTIoZHN0KSAqLwotCi0JCQkJcHN1YndfcjJyKG1tMiwgbW0xKTsvKiBzcmMgLSBkc3QgLT4gbW0xICovCi0JCQkJcG11bGx3X3IycihtbTQsIG1tMSk7IC8qIG1tMSAqIGFscGhhIC0+IG1tMSAqLwotCQkJCXBzcmx3X2kycig4LCBtbTEpOyAvKiBtbTEgPj4gOCAtPiBtbTEgKi8KLQkJCQlwYWRkYl9yMnIobW0xLCBtbTIpOyAvKiBtbTEgKyBtbTIoZHN0KSAtPiBtbTIgKi8KLQotCQkJCXBhY2t1c3diX3IycihtbTUsIG1tMik7ICAvKiBBUkdCQVJHQiAtPiBtbTIgKi8KLQkJCQlwb3JfcjJyKG1tNywgbW0yKTsgLyogbW03KGZ1bGwgYWxwaGEpIHwgbW0yIC0+IG1tMiAqLwotCQkJCW1vdmRfcjJtKG1tMiwgKmRzdHApOy8qIG1tMiAtPiBwaXhlbCAqLwotCQkJCSsrc3JjcDsKLQkJCQkrK2RzdHA7Ci0JCQl9LHsKLQkJCQkvKiBUd28gUGl4ZWxzIEJsZW5kICovCi0JCQkJbW92cV9tMnIoKCpzcmNwKSwgbW0wKTsvKiAyIHggc3JjIC0+IG1tMChBUkdCQVJHQikqLwotCQkJCW1vdnFfbTJyKCgqZHN0cCksIG1tMik7LyogMiB4IGRzdCAtPiBtbTIoQVJHQkFSR0IpICovCi0JCQkJbW92cV9yMnIobW0wLCBtbTEpOyAvKiAyIHggc3JjIC0+IG1tMShBUkdCQVJHQikgKi8KLQkJCQltb3ZxX3IycihtbTIsIG1tNik7IC8qIDIgeCBkc3QgLT4gbW02KEFSR0JBUkdCKSAqLwotCi0JCQkJcHVucGNrbGJ3X3IycihtbTUsIG1tMCk7IC8qIGxvdyAtIDBBMFIwRzBCIC0+IG1tMChzcmMxKSAqLwotCQkJCXB1bnBja2hid19yMnIobW01LCBtbTEpOyAvKiBoaWdoIC0gMEEwUjBHMEIgLT4gbW0xKHNyYzIpICovCi0JCQkJcHVucGNrbGJ3X3IycihtbTUsIG1tMik7IC8qIGxvdyAtIDBBMFIwRzBCIC0+IG1tMihkc3QxKSAqLwotCQkJCXB1bnBja2hid19yMnIobW01LCBtbTYpOyAvKiBoaWdoIC0gMEEwUjBHMEIgLT4gbW02KGRzdDIpICovCi0KLQkJCQlwc3Vid19yMnIobW0yLCBtbTApOy8qIHNyYzEgLSBkc3QxIC0+IG1tMCAqLwotCQkJCXBtdWxsd19yMnIobW00LCBtbTApOyAvKiBtbTAgKiBhbHBoYSAtPiBtbTAgKi8KLQkJCQlwc3Jsd19pMnIoOCwgbW0wKTsgLyogbW0wID4+IDggLT4gbW0xICovCi0JCQkJcGFkZGJfcjJyKG1tMCwgbW0yKTsgLyogbW0wICsgbW0yKGRzdDEpIC0+IG1tMiAqLwotCi0JCQkJcHN1YndfcjJyKG1tNiwgbW0xKTsvKiBzcmMyIC0gZHN0MiAtPiBtbTEgKi8KLQkJCQlwbXVsbHdfcjJyKG1tNCwgbW0xKTsgLyogbW0xICogYWxwaGEgLT4gbW0xICovCi0JCQkJcHNybHdfaTJyKDgsIG1tMSk7IC8qIG1tMSA+PiA4IC0+IG1tMSAqLwotCQkJCXBhZGRiX3IycihtbTEsIG1tNik7IC8qIG1tMSArIG1tNihkc3QyKSAtPiBtbTYgKi8KLQotCQkJCXBhY2t1c3diX3IycihtbTYsIG1tMik7ICAvKiBBUkdCQVJHQiAtPiBtbTIgKi8KLQkJCQlwb3JfcjJyKG1tNywgbW0yKTsgLyogbW03KGRzdCBhbHBoYSkgfCBtbTIgLT4gbW0yICovCi0JCQkJCi0JCQkJbW92cV9yMm0obW0yLCAqZHN0cCk7LyogbW0yIC0+IDIgeCBwaXhlbCAqLwotCi0gIAkJCQlzcmNwICs9IDI7Ci0gIAkJCQlkc3RwICs9IDI7Ci0gIAkJCX0sIHdpZHRoKTsKLQkJCXNyY3AgKz0gc3Jjc2tpcDsKLQkJCWRzdHAgKz0gZHN0c2tpcDsKLQkJfQotCQllbW1zKCk7Ci0JfQotfQotCi0vKiBmYXN0IEFSR0I4ODgtPihBKVJHQjg4OCBibGVuZGluZyB3aXRoIHBpeGVsIGFscGhhICovCi1zdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JQaXhlbEFscGhhTU1YKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLQlVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKLQlTRExfUGl4ZWxGb3JtYXQqIHNmID0gaW5mby0+c3JjOwotCVVpbnQzMiBhbWFzayA9IHNmLT5BbWFzazsKLQotCXB4b3JfcjJyKG1tNiwgbW02KTsgLyogMCAtPiBtbTYgKi8KLQkvKiBmb3JtIG11bHRpcGxpY2F0aW9uIG1hc2sgKi8KLQltb3ZkX20ycihzZi0+QW1hc2ssIG1tNyk7IC8qIDAwMDBGMDAwIC0+IG1tNyAqLwotCXB1bnBja2xid19yMnIobW03LCBtbTcpOyAvKiBGRjAwMDAwMCAtPiBtbTcgKi8KLQlwY21wZXFiX3IycihtbTAsIG1tMCk7IC8qIEZGRkZGRkZGIC0+IG1tMCAqLwotCW1vdnFfcjJyKG1tMCwgbW0zKTsgLyogRkZGRkZGRkYgLT4gbW0zIChmb3IgbGF0ZXIpICovCi0JcHhvcl9yMnIobW0wLCBtbTcpOyAvKiAwMEZGRkZGRiAtPiBtbTcgKG11bHQgbWFzaykgKi8KLQkvKiBmb3JtIGNoYW5uZWwgbWFza3MgKi8KLQltb3ZxX3IycihtbTcsIG1tMCk7IC8qIDAwRkZGRkZGIC0+IG1tMCAqLwotCXBhY2tzc3diX3IycihtbTYsIG1tMCk7IC8qIDAwMDAwRkZGIC0+IG1tMCAoY2hhbm5lbCBtYXNrKSAqLwotCXBhY2tzc3diX3IycihtbTYsIG1tMyk7IC8qIDAwMDBGRkZGIC0+IG1tMyAqLwotCXB4b3JfcjJyKG1tMCwgbW0zKTsgLyogMDAwMEYwMDAgLT4gbW0zICh+Y2hhbm5lbCBtYXNrKSAqLwotCS8qIGdldCBhbHBoYSBjaGFubmVsIHNoaWZ0ICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkibW92ZCAlMCwgJSVtbTUiCi0JCTogOiAicm0iICgoVWludDMyKSBzZi0+QXNoaWZ0KSApOyAvKiBBc2hpZnQgLT4gbW01ICovCi0KLQl3aGlsZShoZWlnaHQtLSkgewotCSAgICBEVUZGU19MT09QNCh7Ci0JCVVpbnQzMiBhbHBoYSA9ICpzcmNwICYgYW1hc2s7Ci0JCS8qIEZJWE1FOiBIZXJlIHdlIHNwZWNpYWwtY2FzZSBvcGFxdWUgYWxwaGEgc2luY2UgdGhlCi0JCQljb21wb3NpdGlvbmluZyB1c2VkICg+PjggaW5zdGVhZCBvZiAvMjU1KSBkb2Vzbid0IGhhbmRsZQotCQkJaXQgY29ycmVjdGx5LiBBbHNvIHNwZWNpYWwtY2FzZSBhbHBoYT0wIGZvciBzcGVlZD8KLQkJCUJlbmNobWFyayB0aGlzISAqLwotCQlpZihhbHBoYSA9PSAwKSB7Ci0JCQkvKiBkbyBub3RoaW5nICovCi0JCX0gZWxzZSBpZihhbHBoYSA9PSBhbWFzaykgewotCQkJLyogb3BhcXVlIGFscGhhIC0tIGNvcHkgUkdCLCBrZWVwIGRzdCBhbHBoYSAqLwotCQkJLyogdXNpbmcgTU1YIGhlcmUgdG8gZnJlZSB1cCByZWd1bGFyIHJlZ2lzdGVycyBmb3Igb3RoZXIgdGhpbmdzICovCi0JCQltb3ZkX20ycigoKnNyY3ApLCBtbTEpOy8qIHNyYyhBUkdCKSAtPiBtbTEgKDAwMDBBUkdCKSovCi0JCQltb3ZkX20ycigoKmRzdHApLCBtbTIpOy8qIGRzdChBUkdCKSAtPiBtbTIgKDAwMDBBUkdCKSovCi0JCQlwYW5kX3IycihtbTAsIG1tMSk7IC8qIHNyYyAmIGNoYW5tYXNrIC0+IG1tMSAqLwotCQkJcGFuZF9yMnIobW0zLCBtbTIpOyAvKiBkc3QgJiB+Y2hhbm1hc2sgLT4gbW0yICovCi0JCQlwb3JfcjJyKG1tMSwgbW0yKTsgLyogc3JjIHwgZHN0IC0+IG1tMiAqLwotCQkJbW92ZF9yMm0obW0yLCAoKmRzdHApKTsgLyogbW0yIC0+IGRzdCAqLwotCQl9IGVsc2UgewotCQkJbW92ZF9tMnIoKCpzcmNwKSwgbW0xKTsvKiBzcmMoQVJHQikgLT4gbW0xICgwMDAwQVJHQikqLwotCQkJcHVucGNrbGJ3X3IycihtbTYsIG1tMSk7IC8qIDBBMFIwRzBCIC0+IG1tMSAqLwotCi0JCQltb3ZkX20ycigoKmRzdHApLCBtbTIpOy8qIGRzdChBUkdCKSAtPiBtbTIgKDAwMDBBUkdCKSovCi0JCQlwdW5wY2tsYndfcjJyKG1tNiwgbW0yKTsgLyogMEEwUjBHMEIgLT4gbW0yICovCi0KLQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJCQkibW92ZCAlMCwgJSVtbTQiCi0JCQkJOiA6ICJyIiAoYWxwaGEpICk7IC8qIDAwMDBBMDAwIC0+IG1tNCAqLwotCQkJcHNybGRfcjJyKG1tNSwgbW00KTsgLyogbW00ID4+IG1tNSAtPiBtbTQgKDAwMDAwMDBBKSAqLwotCQkJcHVucGNrbHdkX3IycihtbTQsIG1tNCk7IC8qIDAwMDAwQTBBIC0+IG1tNCAqLwotCQkJcHVucGNrbHdkX3IycihtbTQsIG1tNCk7IC8qIDBBMEEwQTBBIC0+IG1tNCAqLwotCQkJcGFuZF9yMnIobW03LCBtbTQpOyAvKiAwMDBBMEEwQSAtPiBtbTQsIHByZXNlcnZlIGRzdCBhbHBoYSBvbiBhZGQgKi8KLQotCQkJLyogYmxlbmQgKi8JCSAgICAKLQkJCXBzdWJ3X3IycihtbTIsIG1tMSk7Lyogc3JjIC0gZHN0IC0+IG1tMSAqLwotCQkJcG11bGx3X3IycihtbTQsIG1tMSk7IC8qIG1tMSAqIGFscGhhIC0+IG1tMSAqLwotCQkJcHNybHdfaTJyKDgsIG1tMSk7IC8qIG1tMSA+PiA4IC0+IG1tMSgwMDBSMEcwQikgKi8KLQkJCXBhZGRiX3IycihtbTEsIG1tMik7IC8qIG1tMSArIG1tMihkc3QpIC0+IG1tMiAqLwotCQkJCi0JCQlwYWNrdXN3Yl9yMnIobW02LCBtbTIpOyAgLyogMDAwMEFSR0IgLT4gbW0yICovCi0JCQltb3ZkX3IybShtbTIsICpkc3RwKTsvKiBtbTIgLT4gZHN0ICovCi0JCX0KLQkJKytzcmNwOwotCQkrK2RzdHA7Ci0JICAgIH0sIHdpZHRoKTsKLQkgICAgc3JjcCArPSBzcmNza2lwOwotCSAgICBkc3RwICs9IGRzdHNraXA7Ci0JfQotCWVtbXMoKTsKLX0KLS8qIEVuZCBHQ0NfQVNNQkxJVCAqLwotCi0jZWxpZiBNU1ZDX0FTTUJMSVQKLS8qIGZhc3QgUkdCODg4LT4oQSlSR0I4ODggYmxlbmRpbmcgd2l0aCBzdXJmYWNlIGFscGhhPTEyOCBzcGVjaWFsIGNhc2UgKi8KLXN0YXRpYyB2b2lkIEJsaXRSR0J0b1JHQlN1cmZhY2VBbHBoYTEyOE1NWChTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7Ci0JVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7Ci0JVWludDMyIGRhbHBoYSA9IGluZm8tPmRzdC0+QW1hc2s7Ci0KLQlfX202NCBzcmMxLCBzcmMyLCBkc3QxLCBkc3QyLCBsbWFzaywgaG1hc2ssIGRzdGE7Ci0JCi0JaG1hc2sgPSBfbW1fc2V0X3BpMzIoMHgwMGZlZmVmZSwgMHgwMGZlZmVmZSk7IC8qIGFscGhhMTI4IG1hc2sgLT4gaG1hc2sgKi8KLQlsbWFzayA9IF9tbV9zZXRfcGkzMigweDAwMDEwMTAxLCAweDAwMDEwMTAxKTsgLyogIWFscGhhMTI4IG1hc2sgLT4gbG1hc2sgKi8KLQlkc3RhID0gX21tX3NldF9waTMyKGRhbHBoYSwgZGFscGhhKTsgLyogZHN0IGFscGhhIG1hc2sgLT4gZHN0YSAqLwotCi0Jd2hpbGUgKGhlaWdodC0tKSB7Ci0JCWludCBuID0gd2lkdGg7Ci0JCWlmICggbiAmIDEgKSB7Ci0JCQlVaW50MzIgcyA9ICpzcmNwKys7Ci0JCQlVaW50MzIgZCA9ICpkc3RwOwotCQkJKmRzdHArKyA9ICgoKChzICYgMHgwMGZlZmVmZSkgKyAoZCAmIDB4MDBmZWZlZmUpKSA+PiAxKQotCQkJCSAgICsgKHMgJiBkICYgMHgwMDAxMDEwMSkpIHwgZGFscGhhOwotCQkJbi0tOwotCQl9Ci0JCQotCQlmb3IgKG4gPj49IDE7IG4gPiAwOyAtLW4pIHsKLQkJCWRzdDEgPSAqKF9fbTY0Kilkc3RwOyAvKiAyIHggZHN0IC0+IGRzdDEoQVJHQkFSR0IpICovCi0JCQlkc3QyID0gZHN0MTsgICAvKiAyIHggZHN0IC0+IGRzdDIoQVJHQkFSR0IpICovCi0KLQkJCXNyYzEgPSAqKF9fbTY0KilzcmNwOyAvKiAyIHggc3JjIC0+IHNyYzEoQVJHQkFSR0IpICovCi0JCQlzcmMyID0gc3JjMTsgLyogMiB4IHNyYyAtPiBzcmMyKEFSR0JBUkdCKSAqLwotCi0JCQlkc3QyID0gX21tX2FuZF9zaTY0KGRzdDIsIGhtYXNrKTsgLyogZHN0ICYgbWFzayAtPiBkc3QyICovCi0JCQlzcmMyID0gX21tX2FuZF9zaTY0KHNyYzIsIGhtYXNrKTsgLyogc3JjICYgbWFzayAtPiBzcmMyICovCi0JCQlzcmMyID0gX21tX2FkZF9waTMyKHNyYzIsIGRzdDIpOyAvKiBkc3QyICsgc3JjMiAtPiBzcmMyICovCi0JCQlzcmMyID0gX21tX3NybGlfcGkzMihzcmMyLCAxKTsgLyogc3JjMiA+PiAxIC0+IHNyYzIgKi8KLQotCQkJZHN0MSA9IF9tbV9hbmRfc2k2NChkc3QxLCBzcmMxKTsgLyogc3JjICYgZHN0IC0+IGRzdDEgKi8KLQkJCWRzdDEgPSBfbW1fYW5kX3NpNjQoZHN0MSwgbG1hc2spOyAvKiBkc3QxICYgIW1hc2sgLT4gZHN0MSAqLwotCQkJZHN0MSA9IF9tbV9hZGRfcGkzMihkc3QxLCBzcmMyKTsgLyogc3JjMiArIGRzdDEgLT4gZHN0MSAqLwotCQkJZHN0MSA9IF9tbV9vcl9zaTY0KGRzdDEsIGRzdGEpOyAvKiBkc3RhKGZ1bGwgYWxwaGEpIHwgZHN0MSAtPiBkc3QxICovCi0JCQkKLQkJCSooX19tNjQqKWRzdHAgPSBkc3QxOyAvKiBkc3QxIC0+IDIgeCBkc3QgcGl4ZWxzICovCi0JCQlkc3RwICs9IDI7Ci0JCQlzcmNwICs9IDI7Ci0JCX0KLQkJCi0JCXNyY3AgKz0gc3Jjc2tpcDsKLQkJZHN0cCArPSBkc3Rza2lwOwotCX0KLQlfbW1fZW1wdHkoKTsKLX0KLQotLyogZmFzdCBSR0I4ODgtPihBKVJHQjg4OCBibGVuZGluZyB3aXRoIHN1cmZhY2UgYWxwaGEgKi8KLXN0YXRpYyB2b2lkIEJsaXRSR0J0b1JHQlN1cmZhY2VBbHBoYU1NWChTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JU0RMX1BpeGVsRm9ybWF0KiBkZiA9IGluZm8tPmRzdDsKLQlVaW50MzIgY2hhbm1hc2sgPSBkZi0+Um1hc2sgfCBkZi0+R21hc2sgfCBkZi0+Qm1hc2s7Ci0JdW5zaWduZWQgYWxwaGEgPSBpbmZvLT5zcmMtPmFscGhhOwotCi0JaWYgKGFscGhhID09IDEyOCAmJiAoZGYtPlJtYXNrIHwgZGYtPkdtYXNrIHwgZGYtPkJtYXNrKSA9PSAweDAwRkZGRkZGKSB7Ci0JCQkvKiBvbmx5IGNhbGwgYTEyOCB2ZXJzaW9uIHdoZW4gUixHLEIgb2NjdXB5IGxvd2VyIGJpdHMgKi8KLQkJQmxpdFJHQnRvUkdCU3VyZmFjZUFscGhhMTI4TU1YKGluZm8pOwotCX0gZWxzZSB7Ci0JCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQkJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOwotCQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOwotCQlVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0JCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7Ci0JCVVpbnQzMiBkYWxwaGEgPSBkZi0+QW1hc2s7Ci0JCVVpbnQzMiBhbXVsdDsKLQotCQlfX202NCBzcmMxLCBzcmMyLCBkc3QxLCBkc3QyLCBtbV9hbHBoYSwgbW1femVybywgZHN0YTsKLQkJCi0JCW1tX3plcm8gPSBfbW1fc2V0emVyb19zaTY0KCk7IC8qIDAgLT4gbW1femVybyAqLwotCQkvKiBmb3JtIHRoZSBhbHBoYSBtdWx0ICovCi0JCWFtdWx0ID0gYWxwaGEgfCAoYWxwaGEgPDwgOCk7Ci0JCWFtdWx0ID0gYW11bHQgfCAoYW11bHQgPDwgMTYpOwotCQljaGFubWFzayA9ICgweGZmIDw8IGRmLT5Sc2hpZnQpIHwgKDB4ZmYgPDwgZGYtPkdzaGlmdCkgfCAoMHhmZiA8PCBkZi0+QnNoaWZ0KTsKLQkJbW1fYWxwaGEgPSBfbW1fc2V0X3BpMzIoMCwgYW11bHQgJiBjaGFubWFzayk7IC8qIDAwMDBBQUFBIC0+IG1tX2FscGhhLCBtaW51cyAxIGNoYW4gKi8KLQkJbW1fYWxwaGEgPSBfbW1fdW5wYWNrbG9fcGk4KG1tX2FscGhhLCBtbV96ZXJvKTsgLyogMEEwQTBBMEEgLT4gbW1fYWxwaGEsIG1pbnVzIDEgY2hhbiAqLwotCQkJLyogYXQgdGhpcyBwb2ludCBtbV9hbHBoYSBjYW4gYmUgMDAwQTBBMEEgb3IgMEEwQTBBMDAgb3IgYW5vdGhlciBjb21ibyAqLwotCQlkc3RhID0gX21tX3NldF9waTMyKGRhbHBoYSwgZGFscGhhKTsgLyogZHN0IGFscGhhIG1hc2sgLT4gZHN0YSAqLwotCQkKLQkJd2hpbGUgKGhlaWdodC0tKSB7Ci0JCQlpbnQgbiA9IHdpZHRoOwotCQkJaWYgKG4gJiAxKSB7Ci0JCQkJLyogT25lIFBpeGVsIEJsZW5kICovCi0JCQkJc3JjMiA9IF9tbV9jdnRzaTMyX3NpNjQoKnNyY3ApOyAvKiBzcmMoQVJHQikgLT4gc3JjMiAoMDAwMEFSR0IpKi8KLQkJCQlzcmMyID0gX21tX3VucGFja2xvX3BpOChzcmMyLCBtbV96ZXJvKTsgLyogMEEwUjBHMEIgLT4gc3JjMiAqLwotCi0JCQkJZHN0MSA9IF9tbV9jdnRzaTMyX3NpNjQoKmRzdHApOyAvKiBkc3QoQVJHQikgLT4gZHN0MSAoMDAwMEFSR0IpKi8KLQkJCQlkc3QxID0gX21tX3VucGFja2xvX3BpOChkc3QxLCBtbV96ZXJvKTsgLyogMEEwUjBHMEIgLT4gZHN0MSAqLwotCi0JCQkJc3JjMiA9IF9tbV9zdWJfcGkxNihzcmMyLCBkc3QxKTsgLyogc3JjMiAtIGRzdDIgLT4gc3JjMiAqLwotCQkJCXNyYzIgPSBfbW1fbXVsbG9fcGkxNihzcmMyLCBtbV9hbHBoYSk7IC8qIHNyYzIgKiBhbHBoYSAtPiBzcmMyICovCi0JCQkJc3JjMiA9IF9tbV9zcmxpX3BpMTYoc3JjMiwgOCk7IC8qIHNyYzIgPj4gOCAtPiBzcmMyICovCi0JCQkJZHN0MSA9IF9tbV9hZGRfcGk4KHNyYzIsIGRzdDEpOyAvKiBzcmMyICsgZHN0MSAtPiBkc3QxICovCi0JCQkJCi0JCQkJZHN0MSA9IF9tbV9wYWNrc19wdTE2KGRzdDEsIG1tX3plcm8pOyAgLyogMDAwMEFSR0IgLT4gZHN0MSAqLwotCQkJCWRzdDEgPSBfbW1fb3Jfc2k2NChkc3QxLCBkc3RhKTsgLyogZHN0YSB8IGRzdDEgLT4gZHN0MSAqLwotCQkJCSpkc3RwID0gX21tX2N2dHNpNjRfc2kzMihkc3QxKTsgLyogZHN0MSAtPiBwaXhlbCAqLwotCi0JCQkJKytzcmNwOwotCQkJCSsrZHN0cDsKLQkJCQkKLQkJCQluLS07Ci0JCQl9Ci0KLQkJCWZvciAobiA+Pj0gMTsgbiA+IDA7IC0tbikgewotCQkJCS8qIFR3byBQaXhlbHMgQmxlbmQgKi8KLQkJCQlzcmMxID0gKihfX202NCopc3JjcDsgLyogMiB4IHNyYyAtPiBzcmMxKEFSR0JBUkdCKSovCi0JCQkJc3JjMiA9IHNyYzE7IC8qIDIgeCBzcmMgLT4gc3JjMihBUkdCQVJHQikgKi8KLQkJCQlzcmMxID0gX21tX3VucGFja2xvX3BpOChzcmMxLCBtbV96ZXJvKTsgLyogbG93IC0gMEEwUjBHMEIgLT4gc3JjMSAqLwotCQkJCXNyYzIgPSBfbW1fdW5wYWNraGlfcGk4KHNyYzIsIG1tX3plcm8pOyAvKiBoaWdoIC0gMEEwUjBHMEIgLT4gc3JjMiAqLwotCi0JCQkJZHN0MSA9ICooX19tNjQqKWRzdHA7LyogMiB4IGRzdCAtPiBkc3QxKEFSR0JBUkdCKSAqLwotCQkJCWRzdDIgPSBkc3QxOyAvKiAyIHggZHN0IC0+IGRzdDIoQVJHQkFSR0IpICovCi0JCQkJZHN0MSA9IF9tbV91bnBhY2tsb19waTgoZHN0MSwgbW1femVybyk7IC8qIGxvdyAtIDBBMFIwRzBCIC0+IGRzdDEgKi8KLQkJCQlkc3QyID0gX21tX3VucGFja2hpX3BpOChkc3QyLCBtbV96ZXJvKTsgLyogaGlnaCAtIDBBMFIwRzBCIC0+IGRzdDIgKi8KLQotCQkJCXNyYzEgPSBfbW1fc3ViX3BpMTYoc3JjMSwgZHN0MSk7Lyogc3JjMSAtIGRzdDEgLT4gc3JjMSAqLwotCQkJCXNyYzEgPSBfbW1fbXVsbG9fcGkxNihzcmMxLCBtbV9hbHBoYSk7IC8qIHNyYzEgKiBhbHBoYSAtPiBzcmMxICovCi0JCQkJc3JjMSA9IF9tbV9zcmxpX3BpMTYoc3JjMSwgOCk7IC8qIHNyYzEgPj4gOCAtPiBzcmMxICovCi0JCQkJZHN0MSA9IF9tbV9hZGRfcGk4KHNyYzEsIGRzdDEpOyAvKiBzcmMxICsgZHN0MShkc3QxKSAtPiBkc3QxICovCi0KLQkJCQlzcmMyID0gX21tX3N1Yl9waTE2KHNyYzIsIGRzdDIpOy8qIHNyYzIgLSBkc3QyIC0+IHNyYzIgKi8KLQkJCQlzcmMyID0gX21tX211bGxvX3BpMTYoc3JjMiwgbW1fYWxwaGEpOyAvKiBzcmMyICogYWxwaGEgLT4gc3JjMiAqLwotCQkJCXNyYzIgPSBfbW1fc3JsaV9waTE2KHNyYzIsIDgpOyAvKiBzcmMyID4+IDggLT4gc3JjMiAqLwotCQkJCWRzdDIgPSBfbW1fYWRkX3BpOChzcmMyLCBkc3QyKTsgLyogc3JjMiArIGRzdDIoZHN0MikgLT4gZHN0MiAqLwotCQkJCQotCQkJCWRzdDEgPSBfbW1fcGFja3NfcHUxNihkc3QxLCBkc3QyKTsgLyogMEEwUjBHMEIocmVzMSksIDBBMFIwRzBCKHJlczIpIC0+IGRzdDEoQVJHQkFSR0IpICovCi0JCQkJZHN0MSA9IF9tbV9vcl9zaTY0KGRzdDEsIGRzdGEpOyAvKiBkc3RhIHwgZHN0MSAtPiBkc3QxICovCi0KLQkJCQkqKF9fbTY0Kilkc3RwID0gZHN0MTsgLyogZHN0MSAtPiAyIHggcGl4ZWwgKi8KLQotCQkJCXNyY3AgKz0gMjsKLQkJCQlkc3RwICs9IDI7Ci0JCQl9Ci0JCQlzcmNwICs9IHNyY3NraXA7Ci0JCQlkc3RwICs9IGRzdHNraXA7Ci0JCX0KLQkJX21tX2VtcHR5KCk7Ci0JfQotfQotCi0vKiBmYXN0IEFSR0I4ODgtPihBKVJHQjg4OCBibGVuZGluZyB3aXRoIHBpeGVsIGFscGhhICovCi1zdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JQaXhlbEFscGhhTU1YKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLQlVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKLQlTRExfUGl4ZWxGb3JtYXQqIHNmID0gaW5mby0+c3JjOwotCVVpbnQzMiBjaGFubWFzayA9IHNmLT5SbWFzayB8IHNmLT5HbWFzayB8IHNmLT5CbWFzazsKLQlVaW50MzIgYW1hc2sgPSBzZi0+QW1hc2s7Ci0JVWludDMyIGFzaGlmdCA9IHNmLT5Bc2hpZnQ7Ci0JVWludDY0IG11bHRtYXNrOwotCi0JX19tNjQgc3JjMSwgZHN0MSwgbW1fYWxwaGEsIG1tX3plcm8sIGRtYXNrOwotCi0JbW1femVybyA9IF9tbV9zZXR6ZXJvX3NpNjQoKTsgLyogMCAtPiBtbV96ZXJvICovCi0JbXVsdG1hc2sgPSB+KDB4RkZGRmk2NCA8PCAoYXNoaWZ0ICogMikpOwotCWRtYXNrID0gKihfX202NCopICZtdWx0bWFzazsgLyogZHN0IGFscGhhIG1hc2sgLT4gZG1hc2sgKi8KLQotCXdoaWxlKGhlaWdodC0tKSB7Ci0JCURVRkZTX0xPT1A0KHsKLQkJVWludDMyIGFscGhhID0gKnNyY3AgJiBhbWFzazsKLQkJaWYgKGFscGhhID09IDApIHsKLQkJCS8qIGRvIG5vdGhpbmcgKi8KLQkJfSBlbHNlIGlmIChhbHBoYSA9PSBhbWFzaykgewotCQkJLyogb3BhcXVlIGFscGhhIC0tIGNvcHkgUkdCLCBrZWVwIGRzdCBhbHBoYSAqLwotCQkJKmRzdHAgPSAoKnNyY3AgJiBjaGFubWFzaykgfCAoKmRzdHAgJiB+Y2hhbm1hc2spOwotCQl9IGVsc2UgewotCQkJc3JjMSA9IF9tbV9jdnRzaTMyX3NpNjQoKnNyY3ApOyAvKiBzcmMoQVJHQikgLT4gc3JjMSAoMDAwMEFSR0IpKi8KLQkJCXNyYzEgPSBfbW1fdW5wYWNrbG9fcGk4KHNyYzEsIG1tX3plcm8pOyAvKiAwQTBSMEcwQiAtPiBzcmMxICovCi0KLQkJCWRzdDEgPSBfbW1fY3Z0c2kzMl9zaTY0KCpkc3RwKTsgLyogZHN0KEFSR0IpIC0+IGRzdDEgKDAwMDBBUkdCKSovCi0JCQlkc3QxID0gX21tX3VucGFja2xvX3BpOChkc3QxLCBtbV96ZXJvKTsgLyogMEEwUjBHMEIgLT4gZHN0MSAqLwotCi0JCQltbV9hbHBoYSA9IF9tbV9jdnRzaTMyX3NpNjQoYWxwaGEpOyAvKiBhbHBoYSAtPiBtbV9hbHBoYSAoMDAwMDAwMEEpICovCi0JCQltbV9hbHBoYSA9IF9tbV9zcmxpX3NpNjQobW1fYWxwaGEsIGFzaGlmdCk7IC8qIG1tX2FscGhhID4+IGFzaGlmdCAtPiBtbV9hbHBoYSgwMDAwMDAwQSkgKi8KLQkJCW1tX2FscGhhID0gX21tX3VucGFja2xvX3BpMTYobW1fYWxwaGEsIG1tX2FscGhhKTsgLyogMDAwMDBBMEEgLT4gbW1fYWxwaGEgKi8KLQkJCW1tX2FscGhhID0gX21tX3VucGFja2xvX3BpMzIobW1fYWxwaGEsIG1tX2FscGhhKTsgLyogMEEwQTBBMEEgLT4gbW1fYWxwaGEgKi8KLQkJCW1tX2FscGhhID0gX21tX2FuZF9zaTY0KG1tX2FscGhhLCBkbWFzayk7IC8qIDAwMEEwQTBBIC0+IG1tX2FscGhhLCBwcmVzZXJ2ZSBkc3QgYWxwaGEgb24gYWRkICovCi0KLQkJCS8qIGJsZW5kICovCQkgICAgCi0JCQlzcmMxID0gX21tX3N1Yl9waTE2KHNyYzEsIGRzdDEpOy8qIHNyYzEgLSBkc3QxIC0+IHNyYzEgKi8KLQkJCXNyYzEgPSBfbW1fbXVsbG9fcGkxNihzcmMxLCBtbV9hbHBoYSk7IC8qIChzcmMxIC0gZHN0MSkgKiBhbHBoYSAtPiBzcmMxICovCi0JCQlzcmMxID0gX21tX3NybGlfcGkxNihzcmMxLCA4KTsgLyogc3JjMSA+PiA4IC0+IHNyYzEoMDAwUjBHMEIpICovCi0JCQlkc3QxID0gX21tX2FkZF9waTgoc3JjMSwgZHN0MSk7IC8qIHNyYzEgKyBkc3QxIC0+IGRzdDEoMEEwUjBHMEIpICovCi0JCQlkc3QxID0gX21tX3BhY2tzX3B1MTYoZHN0MSwgbW1femVybyk7ICAvKiAwMDAwQVJHQiAtPiBkc3QxICovCi0JCQkKLQkJCSpkc3RwID0gX21tX2N2dHNpNjRfc2kzMihkc3QxKTsgLyogZHN0MSAtPiBwaXhlbCAqLwotCQl9Ci0JCSsrc3JjcDsKLQkJKytkc3RwOwotCSAgICB9LCB3aWR0aCk7Ci0JICAgIHNyY3AgKz0gc3Jjc2tpcDsKLQkgICAgZHN0cCArPSBkc3Rza2lwOwotCX0KLQlfbW1fZW1wdHkoKTsKLX0KLS8qIEVuZCBNU1ZDX0FTTUJMSVQgKi8KLQotI2VuZGlmIC8qIEdDQ19BU01CTElULCBNU1ZDX0FTTUJMSVQgKi8KLQotI2lmIFNETF9BTFRJVkVDX0JMSVRURVJTCi0jaWYgX19NV0VSS1NfXwotI3ByYWdtYSBhbHRpdmVjX21vZGVsIG9uCi0jZW5kaWYKLSNpZiBIQVZFX0FMVElWRUNfSAotI2luY2x1ZGUgPGFsdGl2ZWMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaWYgKGRlZmluZWQoX19NQUNPU1hfXykgJiYgKF9fR05VQ19fIDwgNCkpCi0gICAgI2RlZmluZSBWRUNVSU5UOF9MSVRFUkFMKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHApIFwKLSAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSAoIGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAgKQotICAgICNkZWZpbmUgVkVDVUlOVDE2X0xJVEVSQUwoYSxiLGMsZCxlLGYsZyxoKSBcCi0gICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpICggYSxiLGMsZCxlLGYsZyxoICkKLSNlbHNlCi0gICAgI2RlZmluZSBWRUNVSU5UOF9MSVRFUkFMKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHApIFwKLSAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSB7IGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAgfQotICAgICNkZWZpbmUgVkVDVUlOVDE2X0xJVEVSQUwoYSxiLGMsZCxlLGYsZyxoKSBcCi0gICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIHsgYSxiLGMsZCxlLGYsZyxoIH0KLSNlbmRpZgotCi0jZGVmaW5lIFVOQUxJR05FRF9QVFIoeCkgKCgoc2l6ZV90KSB4KSAmIDB4MDAwMDAwMEYpCi0jZGVmaW5lIFZFQ1BSSU5UKG1zZywgdikgZG8geyBcCi0gICAgdmVjdG9yIHVuc2lnbmVkIGludCB0bXB2ZWMgPSAodmVjdG9yIHVuc2lnbmVkIGludCkodik7IFwKLSAgICB1bnNpZ25lZCBpbnQgKnZwID0gKHVuc2lnbmVkIGludCAqKSZ0bXB2ZWM7IFwKLSAgICBwcmludGYoIiVzID0gJTA4WCAlMDhYICUwOFggJTA4WFxuIiwgbXNnLCB2cFswXSwgdnBbMV0sIHZwWzJdLCB2cFszXSk7IFwKLX0gd2hpbGUgKDApCi0KLS8qIHRoZSBwZXJtdWF0aW9uIHZlY3RvciB0aGF0IHRha2VzIHRoZSBoaWdoIGJ5dGVzIG91dCBvZiBhbGwgdGhlIGFwcHJvcHJpYXRlIHNob3J0cyAKLSAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKAotICAgICAgICAweDAwLCAweDEwLCAweDAyLCAweDEyLAotICAgICAgICAweDA0LCAweDE0LCAweDA2LCAweDE2LAotICAgICAgICAweDA4LCAweDE4LCAweDBBLCAweDFBLAotICAgICAgICAweDBDLCAweDFDLCAweDBFLCAweDFFICk7Ci0qLwotI2RlZmluZSBWRUNfTUVSR0VfUEVSTVVURSgpICh2ZWNfYWRkKHZlY19sdnNsKDAsIChpbnQqKU5VTEwpLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3NwbGF0X3UxNigweDBGKSkpCi0jZGVmaW5lIFZFQ19VMzJfMjQoKSAodmVjX2FkZCh2ZWNfc3BsYXRfdTMyKDEyKSwgdmVjX3NwbGF0X3UzMigxMikpKQotI2RlZmluZSBWRUNfQUxQSEFfTUFTSygpICgodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3NsKCh2ZWN0b3IgdW5zaWduZWQgaW50KXZlY19zcGxhdF9zOCgtMSksIFZFQ19VMzJfMjQoKSkpCi0jZGVmaW5lIFZFQ19BTElHTkVSKHNyYykgKChVTkFMSUdORURfUFRSKHNyYykpIFwKLSAgICA/IHZlY19sdnNsKDAsIHNyYykgXAotICAgIDogdmVjX2FkZCh2ZWNfbHZzbCg4LCBzcmMpLCB2ZWNfc3BsYXRfdTgoOCkpKQotCi0gICAKLSNkZWZpbmUgVkVDX01VTFRJUExZX0FMUEhBKHZzLCB2ZCwgdmFscGhhLCBtZXJnZVBlcm11dGUsIHYxXzE2LCB2OF8xNikgZG8geyBcCi0gICAgLyogdnRlbXAxIGNvbnRhaW5zIHNvdXJjZSBBQUdHQUFHR0FBR0dBQUdHICovIFwKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdnRlbXAxID0gdmVjX211bGUodnMsIHZhbHBoYSk7IFwKLSAgICAvKiB2dGVtcDIgY29udGFpbnMgc291cmNlIFJSQkJSUkJCUlJCQlJSQkIgKi8gXAotICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2dGVtcDIgPSB2ZWNfbXVsbyh2cywgdmFscGhhKTsgXAotICAgIC8qIHZhbHBoYTIgaXMgMjU1LWFscGhhICovIFwKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGEyID0gdmVjX25vcih2YWxwaGEsIHZhbHBoYSk7IFwKLSAgICAvKiB2dGVtcDMgY29udGFpbnMgZGVzdCBBQUdHQUFHR0FBR0dBQUdHICovIFwKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdnRlbXAzID0gdmVjX211bGUodmQsIHZhbHBoYTIpOyBcCi0gICAgLyogdnRlbXA0IGNvbnRhaW5zIGRlc3QgUlJCQlJSQkJSUkJCUlJCQiAqLyBcCi0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZ0ZW1wNCA9IHZlY19tdWxvKHZkLCB2YWxwaGEyKTsgXAotICAgIC8qIGFkZCBzb3VyY2UgYW5kIGRlc3QgKi8gXAotICAgIHZ0ZW1wMSA9IHZlY19hZGQodnRlbXAxLCB2dGVtcDMpOyBcCi0gICAgdnRlbXAyID0gdmVjX2FkZCh2dGVtcDIsIHZ0ZW1wNCk7IFwKLSAgICAvKiB2dGVtcDEgPSAodnRlbXAxICsgMSkgKyAoKHZ0ZW1wMSArIDEpID4+IDgpICovIFwKLSAgICB2dGVtcDEgPSB2ZWNfYWRkKHZ0ZW1wMSwgdjFfMTYpOyBcCi0gICAgdnRlbXAzID0gdmVjX3NyKHZ0ZW1wMSwgdjhfMTYpOyBcCi0gICAgdnRlbXAxID0gdmVjX2FkZCh2dGVtcDEsIHZ0ZW1wMyk7IFwKLSAgICAvKiB2dGVtcDIgPSAodnRlbXAyICsgMSkgKyAoKHZ0ZW1wMiArIDEpID4+IDgpICovIFwKLSAgICB2dGVtcDIgPSB2ZWNfYWRkKHZ0ZW1wMiwgdjFfMTYpOyBcCi0gICAgdnRlbXA0ID0gdmVjX3NyKHZ0ZW1wMiwgdjhfMTYpOyBcCi0gICAgdnRlbXAyID0gdmVjX2FkZCh2dGVtcDIsIHZ0ZW1wNCk7IFwKLSAgICAvKiAoPj44KSBhbmQgZ2V0IEFSR0JBUkdCQVJHQkFSR0IgKi8gXAotICAgIHZkID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19wZXJtKHZ0ZW1wMSwgdnRlbXAyLCBtZXJnZVBlcm11dGUpOyBcCi19IHdoaWxlICgwKQotIAotLyogQ2FsY3VsYXRlIHRoZSBwZXJtdXRlIHZlY3RvciB1c2VkIGZvciAzMi0+MzIgc3dpenpsaW5nICovCi1zdGF0aWMgdmVjdG9yIHVuc2lnbmVkIGNoYXIgY2FsY19zd2l6emxlMzIoY29uc3QgU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQpCi17Ci0gICAgLyoKLSAgICAgKiBXZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZSBiaXRzIHRoYXQgYXJlbid0IHVzZWQgYnkgb3RoZXIKLSAgICAgKiAgY29sb3JzIGlzIGFscGhhLCBhbmQgaXQncyBvbmUgY29tcGxldGUgYnl0ZSwgc2luY2Ugc29tZSBmb3JtYXRzCi0gICAgICogIGxlYXZlIGFscGhhIHdpdGggYSB6ZXJvIG1hc2ssIGJ1dCB3ZSBzaG91bGQgc3RpbGwgc3dpenpsZSB0aGUgYml0cy4KLSAgICAgKi8KLSAgICAvKiBBUkdCICovCi0gICAgY29uc3Qgc3RhdGljIHN0cnVjdCBTRExfUGl4ZWxGb3JtYXQgZGVmYXVsdF9waXhlbF9mb3JtYXQgPSB7Ci0gICAgICAgIE5VTEwsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsCi0gICAgICAgIDE2LCA4LCAwLCAyNCwKLSAgICAgICAgMHgwMEZGMDAwMCwgMHgwMDAwRkYwMCwgMHgwMDAwMDBGRiwgMHhGRjAwMDAwMCwKLSAgICAgICAgMCwgMH07Ci0gICAgaWYgKCFzcmNmbXQpIHsKLSAgICAgICAgc3JjZm10ID0gJmRlZmF1bHRfcGl4ZWxfZm9ybWF0OwotICAgIH0KLSAgICBpZiAoIWRzdGZtdCkgewotICAgICAgICBkc3RmbXQgPSAmZGVmYXVsdF9waXhlbF9mb3JtYXQ7Ci0gICAgfQotICAgIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHBsdXMgPSBWRUNVSU5UOF9MSVRFUkFMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0LCAweDA0LCAweDA0LCAweDA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQywgMHgwQywgMHgwQywgMHgwQyApOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzd2l6OwotICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgc3JjdmVjOwotI2RlZmluZSBSRVNISUZUKFgpICgzIC0gKChYKSA+PiAzKSkKLSAgICBVaW50MzIgcm1hc2sgPSBSRVNISUZUKHNyY2ZtdC0+UnNoaWZ0KSA8PCAoZHN0Zm10LT5Sc2hpZnQpOwotICAgIFVpbnQzMiBnbWFzayA9IFJFU0hJRlQoc3JjZm10LT5Hc2hpZnQpIDw8IChkc3RmbXQtPkdzaGlmdCk7Ci0gICAgVWludDMyIGJtYXNrID0gUkVTSElGVChzcmNmbXQtPkJzaGlmdCkgPDwgKGRzdGZtdC0+QnNoaWZ0KTsKLSAgICBVaW50MzIgYW1hc2s7Ci0gICAgLyogVXNlIHplcm8gZm9yIGFscGhhIGlmIGVpdGhlciBzdXJmYWNlIGRvZXNuJ3QgaGF2ZSBhbHBoYSAqLwotICAgIGlmIChkc3RmbXQtPkFtYXNrKSB7Ci0gICAgICAgIGFtYXNrID0gKChzcmNmbXQtPkFtYXNrKSA/IFJFU0hJRlQoc3JjZm10LT5Bc2hpZnQpIDogMHgxMCkgPDwgKGRzdGZtdC0+QXNoaWZ0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBhbWFzayA9IDB4MTAxMDEwMTAgJiAoKGRzdGZtdC0+Um1hc2sgfCBkc3RmbXQtPkdtYXNrIHwgZHN0Zm10LT5CbWFzaykgXiAweEZGRkZGRkZGKTsKLSAgICB9Ci0jdW5kZWYgUkVTSElGVCAgCi0gICAgKCh1bnNpZ25lZCBpbnQgKikoY2hhciopJnNyY3ZlYylbMF0gPSAocm1hc2sgfCBnbWFzayB8IGJtYXNrIHwgYW1hc2spOwotICAgIHZzd2l6ID0gdmVjX2FkZChwbHVzLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3NwbGF0KHNyY3ZlYywgMCkpOwotICAgIHJldHVybih2c3dpeik7Ci19Ci0KLXN0YXRpYyB2b2lkIEJsaXQzMnRvNTY1UGl4ZWxBbHBoYUFsdGl2ZWMoU0RMX0JsaXRJbmZvICppbmZvKQotewotICAgIGludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLSAgICBVaW50OCAqc3JjID0gKFVpbnQ4ICopaW5mby0+c19waXhlbHM7Ci0gICAgaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0gICAgVWludDggKmRzdCA9IChVaW50OCAqKWluZm8tPmRfcGl4ZWxzOwotICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotICAgIFNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOwotCi0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdjAgPSB2ZWNfc3BsYXRfdTgoMCk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHY4XzE2ID0gdmVjX3NwbGF0X3UxNig4KTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjFfMTYgPSB2ZWNfc3BsYXRfdTE2KDEpOwotICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2Ml8xNiA9IHZlY19zcGxhdF91MTYoMik7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYzXzE2ID0gdmVjX3NwbGF0X3UxNigzKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHY4XzMyID0gdmVjX3NwbGF0X3UzMig4KTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHYxNl8zMiA9IHZlY19hZGQodjhfMzIsIHY4XzMyKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjNmID0gVkVDVUlOVDE2X0xJVEVSQUwoCi0gICAgICAgIDB4MDAzZiwgMHgwMDNmLCAweDAwM2YsIDB4MDAzZiwKLSAgICAgICAgMHgwMDNmLCAweDAwM2YsIDB4MDAzZiwgMHgwMDNmKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdmZjID0gVkVDVUlOVDE2X0xJVEVSQUwoCi0gICAgICAgIDB4MDBmYywgMHgwMGZjLCAweDAwZmMsIDB4MDBmYywKLSAgICAgICAgMHgwMGZjLCAweDAwZmMsIDB4MDBmYywgMHgwMGZjKTsKLQotICAgIC8qIAotICAgICAgICAweDEwIC0gMHgxZiBpcyB0aGUgYWxwaGEKLSAgICAgICAgMHgwMCAtIDB4MGUgZXZlbnMgYXJlIHRoZSByZWQKLSAgICAgICAgMHgwMSAtIDB4MGYgb2RkcyBhcmUgemVybwotICAgICovCi0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnJlZGFscGhhMSA9IFZFQ1VJTlQ4X0xJVEVSQUwoCi0gICAgICAgIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MTAsIDB4MDIsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MTAsIDB4MDQsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MTAsIDB4MDYsIDB4MDEsIDB4MDEKLSAgICApOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZyZWRhbHBoYTIgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKAotICAgICAgICB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgaW50KXZyZWRhbHBoYTEsIHZlY19zbCh2OF8zMiwgdjE2XzMyKSkKLSAgICApOwotICAgIC8qCi0gICAgICAgIDB4MDAgLSAweDBmIGlzIEFSeHggQVJ4eCBBUnh4IEFSeHgKLSAgICAgICAgMHgxMSAtIDB4MGYgb2RkcyBhcmUgYmx1ZQotICAgICovCi0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJsdWUxID0gVkVDVUlOVDhfTElURVJBTCgKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgxMSwKLSAgICAgICAgMHgwNCwgMHgwNSwgMHgwNiwgMHgxMywKLSAgICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgxNSwKLSAgICAgICAgMHgwYywgMHgwZCwgMHgwZSwgMHgxNwotICAgICk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJsdWUyID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgKLSAgICAgICAgdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIGludCl2Ymx1ZTEsIHY4XzMyKQotICAgICk7Ci0gICAgLyoKLSAgICAgICAgMHgwMCAtIDB4MGYgaXMgQVJ4QiBBUnhCIEFSeEIgQVJ4QgotICAgICAgICAweDEwIC0gMHgwZSBldmVucyBhcmUgZ3JlZW4KLSAgICAqLwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZncmVlbjEgPSBWRUNVSU5UOF9MSVRFUkFMKAotICAgICAgICAweDAwLCAweDAxLCAweDEwLCAweDAzLAotICAgICAgICAweDA0LCAweDA1LCAweDEyLCAweDA3LAotICAgICAgICAweDA4LCAweDA5LCAweDE0LCAweDBiLAotICAgICAgICAweDBjLCAweDBkLCAweDE2LCAweDBmCi0gICAgKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Z3JlZW4yID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgKLSAgICAgICAgdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIGludCl2Z3JlZW4xLCB2ZWNfc2wodjhfMzIsIHY4XzMyKSkKLSAgICApOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZnbWVyZ2UgPSBWRUNVSU5UOF9MSVRFUkFMKAotICAgICAgICAweDAwLCAweDAyLCAweDAwLCAweDA2LAotICAgICAgICAweDAwLCAweDBhLCAweDAwLCAweDBlLAotICAgICAgICAweDAwLCAweDEyLCAweDAwLCAweDE2LAotICAgICAgICAweDAwLCAweDFhLCAweDAwLCAweDFlKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtZXJnZVBlcm11dGUgPSBWRUNfTUVSR0VfUEVSTVVURSgpOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZwZXJtdXRlID0gY2FsY19zd2l6emxlMzIoc3JjZm10LCBOVUxMKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGFQZXJtdXRlID0gdmVjX2FuZCh2ZWNfbHZzbCgwLCAoaW50ICopTlVMTCksIHZlY19zcGxhdF91OCgweEMpKTsKLQotICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2ZjgwMCA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX3NwbGF0X3U4KC03KTsKLSAgICB2ZjgwMCA9IHZlY19zbCh2ZjgwMCwgdmVjX3NwbGF0X3UxNig4KSk7Ci0KLSAgICB3aGlsZShoZWlnaHQtLSkgewotICAgICAgICBpbnQgZXh0cmF3aWR0aDsKLSAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFsaWduZXI7Ci0gICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzcmM7Ci0gICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZvdmVyZmxvdzsKLSAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQotI2RlZmluZSBPTkVfUElYRUxfQkxFTkQoY29uZGl0aW9uLCB3aWR0aHZhcikgXAotICAgICAgICB3aGlsZSAoY29uZGl0aW9uKSB7IFwKLSAgICAgICAgICAgIFVpbnQzMiBQaXhlbDsgXAotICAgICAgICAgICAgdW5zaWduZWQgc1IsIHNHLCBzQiwgZFIsIGRHLCBkQiwgc0E7IFwKLSAgICAgICAgICAgIERJU0VNQkxFX1JHQkEoc3JjLCA0LCBzcmNmbXQsIFBpeGVsLCBzUiwgc0csIHNCLCBzQSk7IFwKLSAgICAgICAgICAgIGlmKHNBKSB7IFwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkc3RwaXhlbCA9ICooKHVuc2lnbmVkIHNob3J0ICopZHN0KTsgXAotICAgICAgICAgICAgICAgIGRSID0gKGRzdHBpeGVsID4+IDgpICYgMHhmODsgXAotICAgICAgICAgICAgICAgIGRHID0gKGRzdHBpeGVsID4+IDMpICYgMHhmYzsgXAotICAgICAgICAgICAgICAgIGRCID0gKGRzdHBpeGVsIDw8IDMpICYgMHhmODsgXAotICAgICAgICAgICAgICAgIEFDQ1VSQVRFX0FMUEhBX0JMRU5EKHNSLCBzRywgc0IsIHNBLCBkUiwgZEcsIGRCKTsgXAotICAgICAgICAgICAgICAgICooKHVuc2lnbmVkIHNob3J0ICopZHN0KSA9ICggXAotICAgICAgICAgICAgICAgICAgICAoKGRSICYgMHhmOCkgPDwgOCkgfCAoKGRHICYgMHhmYykgPDwgMykgfCAoZEIgPj4gMykgXAotICAgICAgICAgICAgICAgICk7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgc3JjICs9IDQ7IFwKLSAgICAgICAgICAgIGRzdCArPSAyOyBcCi0gICAgICAgICAgICB3aWR0aHZhci0tOyBcCi0gICAgICAgIH0KLSAgICAgICAgT05FX1BJWEVMX0JMRU5EKChVTkFMSUdORURfUFRSKGRzdCkpICYmICh3aWR0aCksIHdpZHRoKTsKLSAgICAgICAgZXh0cmF3aWR0aCA9ICh3aWR0aCAlIDgpOwotICAgICAgICB2YWxpZ25lciA9IFZFQ19BTElHTkVSKHNyYyk7Ci0gICAgICAgIHZzcmMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDAsIHNyYyk7Ci0gICAgICAgIHdpZHRoIC09IGV4dHJhd2lkdGg7Ci0gICAgICAgIHdoaWxlICh3aWR0aCkgewotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhOwotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnNyYzEsIHZzcmMyOwotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmRzdDEsIHZkc3QyOwotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZSLCB2RywgdkI7Ci0gICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdnBpeGVsLCB2cnBpeGVsLCB2Z3BpeGVsLCB2YnBpeGVsOwotCi0gICAgICAgICAgICAvKiBMb2FkIDggcGl4ZWxzIGZyb20gc3JjIGFzIEFSR0IgKi8KLSAgICAgICAgICAgIHZvdmVyZmxvdyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMTUsIHNyYyk7Ci0gICAgICAgICAgICB2c3JjID0gdmVjX3Blcm0odnNyYywgdm92ZXJmbG93LCB2YWxpZ25lcik7Ci0gICAgICAgICAgICB2c3JjMSA9IHZlY19wZXJtKHZzcmMsIHZzcmMsIHZwZXJtdXRlKTsKLSAgICAgICAgICAgIHNyYyArPSAxNjsKLSAgICAgICAgICAgIHZzcmMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDE1LCBzcmMpOwotICAgICAgICAgICAgdm92ZXJmbG93ID0gdmVjX3Blcm0odm92ZXJmbG93LCB2c3JjLCB2YWxpZ25lcik7Ci0gICAgICAgICAgICB2c3JjMiA9IHZlY19wZXJtKHZvdmVyZmxvdywgdm92ZXJmbG93LCB2cGVybXV0ZSk7Ci0gICAgICAgICAgICBzcmMgKz0gMTY7Ci0KLSAgICAgICAgICAgIC8qIExvYWQgOCBwaXhlbHMgZnJvbSBkc3QgYXMgWFJHQiAqLwotICAgICAgICAgICAgdm92ZXJmbG93ID0gdmVjX2xkKDAsIGRzdCk7Ci0gICAgICAgICAgICB2UiA9IHZlY19hbmQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2b3ZlcmZsb3csIHZmODAwKTsKLSAgICAgICAgICAgIHZCID0gdmVjX3NsKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdm92ZXJmbG93LCB2M18xNik7Ci0gICAgICAgICAgICB2RyA9IHZlY19zbCh2QiwgdjJfMTYpOwotICAgICAgICAgICAgdmRzdDEgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZSLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdlIsIHZyZWRhbHBoYTEpOwotICAgICAgICAgICAgdmRzdDEgPSB2ZWNfcGVybSh2ZHN0MSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZCLCB2Ymx1ZTEpOwotICAgICAgICAgICAgdmRzdDEgPSB2ZWNfcGVybSh2ZHN0MSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZHLCB2Z3JlZW4xKTsKLSAgICAgICAgICAgIHZkc3QyID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcil2UiwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZSLCB2cmVkYWxwaGEyKTsKLSAgICAgICAgICAgIHZkc3QyID0gdmVjX3Blcm0odmRzdDIsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2QiwgdmJsdWUyKTsKLSAgICAgICAgICAgIHZkc3QyID0gdmVjX3Blcm0odmRzdDIsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2RywgdmdyZWVuMik7Ci0KLSAgICAgICAgICAgIC8qIEFscGhhIGJsZW5kIDggcGl4ZWxzIGFzIEFSR0IgKi8KLSAgICAgICAgICAgIHZhbHBoYSA9IHZlY19wZXJtKHZzcmMxLCB2MCwgdmFscGhhUGVybXV0ZSk7Ci0gICAgICAgICAgICBWRUNfTVVMVElQTFlfQUxQSEEodnNyYzEsIHZkc3QxLCB2YWxwaGEsIG1lcmdlUGVybXV0ZSwgdjFfMTYsIHY4XzE2KTsKLSAgICAgICAgICAgIHZhbHBoYSA9IHZlY19wZXJtKHZzcmMyLCB2MCwgdmFscGhhUGVybXV0ZSk7Ci0gICAgICAgICAgICBWRUNfTVVMVElQTFlfQUxQSEEodnNyYzIsIHZkc3QyLCB2YWxwaGEsIG1lcmdlUGVybXV0ZSwgdjFfMTYsIHY4XzE2KTsKLQotICAgICAgICAgICAgLyogQ29udmVydCA4IHBpeGVscyB0byA1NjUgKi8KLSAgICAgICAgICAgIHZwaXhlbCA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX3BhY2tweCgodmVjdG9yIHVuc2lnbmVkIGludCl2ZHN0MSwgKHZlY3RvciB1bnNpZ25lZCBpbnQpdmRzdDIpOwotICAgICAgICAgICAgdmdwaXhlbCA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX3Blcm0odmRzdDEsIHZkc3QyLCB2Z21lcmdlKTsKLSAgICAgICAgICAgIHZncGl4ZWwgPSB2ZWNfYW5kKHZncGl4ZWwsIHZmYyk7Ci0gICAgICAgICAgICB2Z3BpeGVsID0gdmVjX3NsKHZncGl4ZWwsIHYzXzE2KTsKLSAgICAgICAgICAgIHZycGl4ZWwgPSB2ZWNfc2wodnBpeGVsLCB2MV8xNik7Ci0gICAgICAgICAgICB2cnBpeGVsID0gdmVjX2FuZCh2cnBpeGVsLCB2ZjgwMCk7Ci0gICAgICAgICAgICB2YnBpeGVsID0gdmVjX2FuZCh2cGl4ZWwsIHYzZik7Ci0gICAgICAgICAgICB2ZHN0MSA9IHZlY19vcigodmVjdG9yIHVuc2lnbmVkIGNoYXIpdnJwaXhlbCwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZncGl4ZWwpOwotICAgICAgICAgICAgdmRzdDEgPSB2ZWNfb3IodmRzdDEsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2YnBpeGVsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogU3RvcmUgOCBwaXhlbHMgKi8KLSAgICAgICAgICAgIHZlY19zdCh2ZHN0MSwgMCwgZHN0KTsKLQotICAgICAgICAgICAgd2lkdGggLT0gODsKLSAgICAgICAgICAgIGRzdCArPSAxNjsKLSAgICAgICAgfQotICAgICAgICBPTkVfUElYRUxfQkxFTkQoKGV4dHJhd2lkdGgpLCBleHRyYXdpZHRoKTsKLSN1bmRlZiBPTkVfUElYRUxfQkxFTkQKLSAgICAgICAgc3JjICs9IHNyY3NraXA7Ci0gICAgICAgIGRzdCArPSBkc3Rza2lwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgQmxpdDMydG8zMlN1cmZhY2VBbHBoYUtleUFsdGl2ZWMoU0RMX0JsaXRJbmZvICppbmZvKQotewotICAgIHVuc2lnbmVkIGFscGhhID0gaW5mby0+c3JjLT5hbHBoYTsKLSAgICBpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0gICAgVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOwotICAgIGludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7Ci0gICAgVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOwotICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7Ci0gICAgU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7Ci0gICAgU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7Ci0gICAgdW5zaWduZWQgc0EgPSBzcmNmbXQtPmFscGhhOwotICAgIHVuc2lnbmVkIGRBID0gZHN0Zm10LT5BbWFzayA/IFNETF9BTFBIQV9PUEFRVUUgOiAwOwotICAgIFVpbnQzMiByZ2JtYXNrID0gc3JjZm10LT5SbWFzayB8IHNyY2ZtdC0+R21hc2sgfCBzcmNmbXQtPkJtYXNrOwotICAgIFVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtZXJnZVBlcm11dGU7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnNyY1Blcm11dGU7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmRzdFBlcm11dGU7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnNkc3RQZXJtdXRlOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGFtYXNrOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZiaXRzOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHYwOwotICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2MTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjg7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGludCB2Y2tleTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZyZ2JtYXNrOwotCi0gICAgbWVyZ2VQZXJtdXRlID0gVkVDX01FUkdFX1BFUk1VVEUoKTsKLSAgICB2MCA9IHZlY19zcGxhdF91OCgwKTsKLSAgICB2MSA9IHZlY19zcGxhdF91MTYoMSk7Ci0gICAgdjggPSB2ZWNfc3BsYXRfdTE2KDgpOwotCi0gICAgLyogc2V0IHRoZSBhbHBoYSB0byAyNTUgb24gdGhlIGRlc3RpbmF0aW9uIHN1cmYgKi8KLSAgICB2YWxwaGFtYXNrID0gVkVDX0FMUEhBX01BU0soKTsKLQotICAgIHZzcmNQZXJtdXRlID0gY2FsY19zd2l6emxlMzIoc3JjZm10LCBOVUxMKTsKLSAgICB2ZHN0UGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKE5VTEwsIGRzdGZtdCk7Ci0gICAgdnNkc3RQZXJtdXRlID0gY2FsY19zd2l6emxlMzIoZHN0Zm10LCBOVUxMKTsKLQotICAgIC8qIHNldCBhIHZlY3RvciBmdWxsIG9mIGFscGhhIGFuZCAyNTUtYWxwaGEgKi8KLSAgICAoKHVuc2lnbmVkIGNoYXIgKikmdmFscGhhKVswXSA9IGFscGhhOwotICAgIHZhbHBoYSA9IHZlY19zcGxhdCh2YWxwaGEsIDApOwotICAgIHZiaXRzID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19zcGxhdF9zOCgtMSk7Ci0KLSAgICBja2V5ICY9IHJnYm1hc2s7Ci0gICAgKCh1bnNpZ25lZCBpbnQgKikoY2hhciopJnZja2V5KVswXSA9IGNrZXk7Ci0gICAgdmNrZXkgPSB2ZWNfc3BsYXQodmNrZXksIDApOwotICAgICgodW5zaWduZWQgaW50ICopKGNoYXIqKSZ2cmdibWFzaylbMF0gPSByZ2JtYXNrOwotICAgIHZyZ2JtYXNrID0gdmVjX3NwbGF0KHZyZ2JtYXNrLCAwKTsKLQotICAgIHdoaWxlKGhlaWdodC0tKSB7Ci0gICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0jZGVmaW5lIE9ORV9QSVhFTF9CTEVORChjb25kaXRpb24sIHdpZHRodmFyKSBcCi0gICAgICAgIHdoaWxlIChjb25kaXRpb24pIHsgXAotICAgICAgICAgICAgVWludDMyIFBpeGVsOyBcCi0gICAgICAgICAgICB1bnNpZ25lZCBzUiwgc0csIHNCLCBkUiwgZEcsIGRCOyBcCi0gICAgICAgICAgICBSRVRSSUVWRV9SR0JfUElYRUwoKChVaW50OCAqKXNyY3ApLCA0LCBQaXhlbCk7IFwKLSAgICAgICAgICAgIGlmKHNBICYmIFBpeGVsICE9IGNrZXkpIHsgXAotICAgICAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKFBpeGVsLCBzcmNmbXQsIHNSLCBzRywgc0IpOyBcCi0gICAgICAgICAgICAgICAgRElTRU1CTEVfUkdCKCgoVWludDggKilkc3RwKSwgNCwgZHN0Zm10LCBQaXhlbCwgZFIsIGRHLCBkQik7IFwKLSAgICAgICAgICAgICAgICBBQ0NVUkFURV9BTFBIQV9CTEVORChzUiwgc0csIHNCLCBzQSwgZFIsIGRHLCBkQik7IFwKLSAgICAgICAgICAgICAgICBBU1NFTUJMRV9SR0JBKCgoVWludDggKilkc3RwKSwgNCwgZHN0Zm10LCBkUiwgZEcsIGRCLCBkQSk7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgZHN0cCsrOyBcCi0gICAgICAgICAgICBzcmNwKys7IFwKLSAgICAgICAgICAgIHdpZHRodmFyLS07IFwKLSAgICAgICAgfQotICAgICAgICBPTkVfUElYRUxfQkxFTkQoKFVOQUxJR05FRF9QVFIoZHN0cCkpICYmICh3aWR0aCksIHdpZHRoKTsKLSAgICAgICAgaWYgKHdpZHRoID4gMCkgewotICAgICAgICAgICAgaW50IGV4dHJhd2lkdGggPSAod2lkdGggJSA0KTsKLSAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyID0gVkVDX0FMSUdORVIoc3JjcCk7Ci0gICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMCwgc3JjcCk7Ci0gICAgICAgICAgICB3aWR0aCAtPSBleHRyYXdpZHRoOwotICAgICAgICAgICAgd2hpbGUgKHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnNlbDsKLSAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2b3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmQ7Ci0gICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmRfb3JpZzsKLQotICAgICAgICAgICAgICAgIC8qIHMgPSAqc3JjcCAqLwotICAgICAgICAgICAgICAgIHZvdmVyZmxvdyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMTUsIHNyY3ApOwotICAgICAgICAgICAgICAgIHZzID0gdmVjX3Blcm0odnMsIHZvdmVyZmxvdywgdmFsaWduZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qIHZzZWwgaXMgc2V0IGZvciBpdGVtcyB0aGF0IG1hdGNoIHRoZSBrZXkgKi8KLSAgICAgICAgICAgICAgICB2c2VsID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19hbmQoKHZlY3RvciB1bnNpZ25lZCBpbnQpdnMsIHZyZ2JtYXNrKTsKLSAgICAgICAgICAgICAgICB2c2VsID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19jbXBlcSgodmVjdG9yIHVuc2lnbmVkIGludCl2c2VsLCB2Y2tleSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBwZXJtdXRlIHRvIHNvdXJjZSBmb3JtYXQgKi8KLSAgICAgICAgICAgICAgICB2cyA9IHZlY19wZXJtKHZzLCB2YWxwaGEsIHZzcmNQZXJtdXRlKTsKLQotICAgICAgICAgICAgICAgIC8qIGQgPSAqZHN0cCAqLwotICAgICAgICAgICAgICAgIHZkID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgwLCBkc3RwKTsKLSAgICAgICAgICAgICAgICB2ZF9vcmlnID0gdmQgPSB2ZWNfcGVybSh2ZCwgdjAsIHZzZHN0UGVybXV0ZSk7Ci0KLSAgICAgICAgICAgICAgICBWRUNfTVVMVElQTFlfQUxQSEEodnMsIHZkLCB2YWxwaGEsIG1lcmdlUGVybXV0ZSwgdjEsIHY4KTsKLQotICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgYWxwaGEgY2hhbm5lbCB0byBmdWxsIG9uICovCi0gICAgICAgICAgICAgICAgdmQgPSB2ZWNfb3IodmQsIHZhbHBoYW1hc2spOwotCi0gICAgICAgICAgICAgICAgLyogbWFzayBvdXQgY29sb3Iga2V5ICovCi0gICAgICAgICAgICAgICAgdmQgPSB2ZWNfc2VsKHZkLCB2ZF9vcmlnLCB2c2VsKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKiBwZXJtdXRlIHRvIGRlc3QgZm9ybWF0ICovCi0gICAgICAgICAgICAgICAgdmQgPSB2ZWNfcGVybSh2ZCwgdmJpdHMsIHZkc3RQZXJtdXRlKTsKLQotICAgICAgICAgICAgICAgIC8qICpkc3RwID0gcmVzICovCi0gICAgICAgICAgICAgICAgdmVjX3N0KCh2ZWN0b3IgdW5zaWduZWQgaW50KXZkLCAwLCBkc3RwKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzcmNwICs9IDQ7Ci0gICAgICAgICAgICAgICAgZHN0cCArPSA0OwotICAgICAgICAgICAgICAgIHdpZHRoIC09IDQ7Ci0gICAgICAgICAgICAgICAgdnMgPSB2b3ZlcmZsb3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPTkVfUElYRUxfQkxFTkQoKGV4dHJhd2lkdGgpLCBleHRyYXdpZHRoKTsKLSAgICAgICAgfQotI3VuZGVmIE9ORV9QSVhFTF9CTEVORAotIAotICAgICAgICBzcmNwICs9IHNyY3NraXA7Ci0gICAgICAgIGRzdHAgKz0gZHN0c2tpcDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgQmxpdDMydG8zMlBpeGVsQWxwaGFBbHRpdmVjKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLSAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotICAgIGludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLSAgICBVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7Ci0gICAgaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLSAgICBVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0gICAgaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKLSAgICBTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLSAgICBTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtZXJnZVBlcm11dGU7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhUGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c3JjUGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZHN0UGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c2RzdFBlcm11dGU7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhbWFzazsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cGl4ZWxtYXNrOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHYwOwotICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2MTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjg7Ci0KLSAgICB2MCA9IHZlY19zcGxhdF91OCgwKTsKLSAgICB2MSA9IHZlY19zcGxhdF91MTYoMSk7Ci0gICAgdjggPSB2ZWNfc3BsYXRfdTE2KDgpOwotICAgIG1lcmdlUGVybXV0ZSA9IFZFQ19NRVJHRV9QRVJNVVRFKCk7Ci0gICAgdmFscGhhbWFzayA9IFZFQ19BTFBIQV9NQVNLKCk7Ci0gICAgdmFscGhhUGVybXV0ZSA9IHZlY19hbmQodmVjX2x2c2woMCwgKGludCAqKU5VTEwpLCB2ZWNfc3BsYXRfdTgoMHhDKSk7Ci0gICAgdnBpeGVsbWFzayA9IHZlY19ub3IodmFscGhhbWFzaywgdjApOwotICAgIHZzcmNQZXJtdXRlID0gY2FsY19zd2l6emxlMzIoc3JjZm10LCBOVUxMKTsKLSAgICB2ZHN0UGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKE5VTEwsIGRzdGZtdCk7Ci0gICAgdnNkc3RQZXJtdXRlID0gY2FsY19zd2l6emxlMzIoZHN0Zm10LCBOVUxMKTsKLQotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0gICAgICAgIHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLSNkZWZpbmUgT05FX1BJWEVMX0JMRU5EKGNvbmRpdGlvbiwgd2lkdGh2YXIpIHdoaWxlICgoY29uZGl0aW9uKSkgeyBcCi0gICAgICAgICAgICBVaW50MzIgUGl4ZWw7IFwKLSAgICAgICAgICAgIHVuc2lnbmVkIHNSLCBzRywgc0IsIGRSLCBkRywgZEIsIHNBLCBkQTsgXAotICAgICAgICAgICAgRElTRU1CTEVfUkdCQSgoVWludDggKilzcmNwLCA0LCBzcmNmbXQsIFBpeGVsLCBzUiwgc0csIHNCLCBzQSk7IFwKLSAgICAgICAgICAgIGlmKHNBKSB7IFwKLSAgICAgICAgICAgICAgRElTRU1CTEVfUkdCQSgoVWludDggKilkc3RwLCA0LCBkc3RmbXQsIFBpeGVsLCBkUiwgZEcsIGRCLCBkQSk7IFwKLSAgICAgICAgICAgICAgQUNDVVJBVEVfQUxQSEFfQkxFTkQoc1IsIHNHLCBzQiwgc0EsIGRSLCBkRywgZEIpOyBcCi0gICAgICAgICAgICAgIEFTU0VNQkxFX1JHQkEoKFVpbnQ4ICopZHN0cCwgNCwgZHN0Zm10LCBkUiwgZEcsIGRCLCBkQSk7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgKytzcmNwOyBcCi0gICAgICAgICAgICArK2RzdHA7IFwKLSAgICAgICAgICAgIHdpZHRodmFyLS07IFwKLSAgICAgICAgfQotICAgICAgICBPTkVfUElYRUxfQkxFTkQoKFVOQUxJR05FRF9QVFIoZHN0cCkpICYmICh3aWR0aCksIHdpZHRoKTsKLSAgICAgICAgaWYgKHdpZHRoID4gMCkgewotICAgICAgICAgICAgLyogdnNyY1Blcm11dGUgKi8KLSAgICAgICAgICAgIC8qIHZkc3RQZXJtdXRlICovCi0gICAgICAgICAgICBpbnQgZXh0cmF3aWR0aCA9ICh3aWR0aCAlIDQpOwotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFsaWduZXIgPSBWRUNfQUxJR05FUihzcmNwKTsKLSAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgwLCBzcmNwKTsKLSAgICAgICAgICAgIHdpZHRoIC09IGV4dHJhd2lkdGg7Ci0gICAgICAgICAgICB3aGlsZSAod2lkdGgpIHsKLSAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2b3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmQ7Ci0gICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhOwotICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkc3RhbHBoYTsKLSAgICAgICAgICAgICAgICAvKiBzID0gKnNyY3AgKi8KLSAgICAgICAgICAgICAgICB2b3ZlcmZsb3cgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDE1LCBzcmNwKTsKLSAgICAgICAgICAgICAgICB2cyA9IHZlY19wZXJtKHZzLCB2b3ZlcmZsb3csIHZhbGlnbmVyKTsKLSAgICAgICAgICAgICAgICB2cyA9IHZlY19wZXJtKHZzLCB2MCwgdnNyY1Blcm11dGUpOwotCi0gICAgICAgICAgICAgICAgdmFscGhhID0gdmVjX3Blcm0odnMsIHYwLCB2YWxwaGFQZXJtdXRlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKiBkID0gKmRzdHAgKi8KLSAgICAgICAgICAgICAgICB2ZCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMCwgZHN0cCk7Ci0gICAgICAgICAgICAgICAgdmQgPSB2ZWNfcGVybSh2ZCwgdjAsIHZzZHN0UGVybXV0ZSk7Ci0gICAgICAgICAgICAgICAgdmRzdGFscGhhID0gdmVjX2FuZCh2ZCwgdmFscGhhbWFzayk7Ci0KLSAgICAgICAgICAgICAgICBWRUNfTVVMVElQTFlfQUxQSEEodnMsIHZkLCB2YWxwaGEsIG1lcmdlUGVybXV0ZSwgdjEsIHY4KTsKLQotICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgYWxwaGEgdG8gdGhlIGRlc3QgYWxwaGEgKi8KLSAgICAgICAgICAgICAgICB2ZCA9IHZlY19hbmQodmQsIHZwaXhlbG1hc2spOwotICAgICAgICAgICAgICAgIHZkID0gdmVjX29yKHZkLCB2ZHN0YWxwaGEpOwotICAgICAgICAgICAgICAgIHZkID0gdmVjX3Blcm0odmQsIHYwLCB2ZHN0UGVybXV0ZSk7Ci0KLSAgICAgICAgICAgICAgICAvKiAqZHN0cCA9IHJlcyAqLwotICAgICAgICAgICAgICAgIHZlY19zdCgodmVjdG9yIHVuc2lnbmVkIGludCl2ZCwgMCwgZHN0cCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3JjcCArPSA0OwotICAgICAgICAgICAgICAgIGRzdHAgKz0gNDsKLSAgICAgICAgICAgICAgICB3aWR0aCAtPSA0OwotICAgICAgICAgICAgICAgIHZzID0gdm92ZXJmbG93OwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPTkVfUElYRUxfQkxFTkQoKGV4dHJhd2lkdGgpLCBleHRyYXdpZHRoKTsKLSAgICAgICAgfQotCSAgICBzcmNwICs9IHNyY3NraXA7Ci0JICAgIGRzdHAgKz0gZHN0c2tpcDsKLSN1bmRlZiBPTkVfUElYRUxfQkxFTkQKLQl9Ci19Ci0KLS8qIGZhc3QgQVJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nIHdpdGggcGl4ZWwgYWxwaGEgKi8KLXN0YXRpYyB2b2lkIEJsaXRSR0J0b1JHQlBpeGVsQWxwaGFBbHRpdmVjKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLQlVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtZXJnZVBlcm11dGU7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhUGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGFtYXNrOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZwaXhlbG1hc2s7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdjA7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYxOwotICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2ODsKLSAgICB2MCA9IHZlY19zcGxhdF91OCgwKTsKLSAgICB2MSA9IHZlY19zcGxhdF91MTYoMSk7Ci0gICAgdjggPSB2ZWNfc3BsYXRfdTE2KDgpOwotICAgIG1lcmdlUGVybXV0ZSA9IFZFQ19NRVJHRV9QRVJNVVRFKCk7Ci0gICAgdmFscGhhbWFzayA9IFZFQ19BTFBIQV9NQVNLKCk7Ci0gICAgdmFscGhhUGVybXV0ZSA9IHZlY19hbmQodmVjX2x2c2woMCwgKGludCAqKU5VTEwpLCB2ZWNfc3BsYXRfdTgoMHhDKSk7Ci0gICAgCi0gCi0gICAgdnBpeGVsbWFzayA9IHZlY19ub3IodmFscGhhbWFzaywgdjApOwotCXdoaWxlKGhlaWdodC0tKSB7Ci0gICAgICAgIHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLSNkZWZpbmUgT05FX1BJWEVMX0JMRU5EKGNvbmRpdGlvbiwgd2lkdGh2YXIpIFwKLSAgICAgICAgd2hpbGUgKChjb25kaXRpb24pKSB7IFwKLSAgICAgICAgICAgIFVpbnQzMiBkYWxwaGE7IFwKLSAgICAgICAgICAgIFVpbnQzMiBkOyBcCi0gICAgICAgICAgICBVaW50MzIgczE7IFwKLSAgICAgICAgICAgIFVpbnQzMiBkMTsgXAotICAgICAgICAgICAgVWludDMyIHMgPSAqc3JjcDsgXAotICAgICAgICAgICAgVWludDMyIGFscGhhID0gcyA+PiAyNDsgXAotICAgICAgICAgICAgaWYoYWxwaGEpIHsgXAotICAgICAgICAgICAgICBpZihhbHBoYSA9PSBTRExfQUxQSEFfT1BBUVVFKSB7IFwKLSAgICAgICAgICAgICAgICAqZHN0cCA9IChzICYgMHgwMGZmZmZmZikgfCAoKmRzdHAgJiAweGZmMDAwMDAwKTsgXAotICAgICAgICAgICAgICB9IGVsc2UgeyBcCi0gICAgICAgICAgICAgICAgZCA9ICpkc3RwOyBcCi0gICAgICAgICAgICAgICAgZGFscGhhID0gZCAmIDB4ZmYwMDAwMDA7IFwKLSAgICAgICAgICAgICAgICBzMSA9IHMgJiAweGZmMDBmZjsgXAotICAgICAgICAgICAgICAgIGQxID0gZCAmIDB4ZmYwMGZmOyBcCi0gICAgICAgICAgICAgICAgZDEgPSAoZDEgKyAoKHMxIC0gZDEpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwZmY7IFwKLSAgICAgICAgICAgICAgICBzICY9IDB4ZmYwMDsgXAotICAgICAgICAgICAgICAgIGQgJj0gMHhmZjAwOyBcCi0gICAgICAgICAgICAgICAgZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7IFwKLSAgICAgICAgICAgICAgICAqZHN0cCA9IGQxIHwgZCB8IGRhbHBoYTsgXAotICAgICAgICAgICAgICB9IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgKytzcmNwOyBcCi0gICAgICAgICAgICArK2RzdHA7IFwKLSAgICAgICAgICAgIHdpZHRodmFyLS07IFwKLQkgICAgfQotICAgICAgICBPTkVfUElYRUxfQkxFTkQoKFVOQUxJR05FRF9QVFIoZHN0cCkpICYmICh3aWR0aCksIHdpZHRoKTsKLSAgICAgICAgaWYgKHdpZHRoID4gMCkgewotICAgICAgICAgICAgaW50IGV4dHJhd2lkdGggPSAod2lkdGggJSA0KTsKLSAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyID0gVkVDX0FMSUdORVIoc3JjcCk7Ci0gICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMCwgc3JjcCk7Ci0gICAgICAgICAgICB3aWR0aCAtPSBleHRyYXdpZHRoOwotICAgICAgICAgICAgd2hpbGUgKHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdm92ZXJmbG93OwotICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkOwotICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYTsKLSAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZHN0YWxwaGE7Ci0gICAgICAgICAgICAgICAgLyogcyA9ICpzcmNwICovCi0gICAgICAgICAgICAgICAgdm92ZXJmbG93ID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgxNSwgc3JjcCk7Ci0gICAgICAgICAgICAgICAgdnMgPSB2ZWNfcGVybSh2cywgdm92ZXJmbG93LCB2YWxpZ25lcik7Ci0KLSAgICAgICAgICAgICAgICB2YWxwaGEgPSB2ZWNfcGVybSh2cywgdjAsIHZhbHBoYVBlcm11dGUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qIGQgPSAqZHN0cCAqLwotICAgICAgICAgICAgICAgIHZkID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgwLCBkc3RwKTsKLSAgICAgICAgICAgICAgICB2ZHN0YWxwaGEgPSB2ZWNfYW5kKHZkLCB2YWxwaGFtYXNrKTsKLQotICAgICAgICAgICAgICAgIFZFQ19NVUxUSVBMWV9BTFBIQSh2cywgdmQsIHZhbHBoYSwgbWVyZ2VQZXJtdXRlLCB2MSwgdjgpOwotCi0gICAgICAgICAgICAgICAgLyogc2V0IHRoZSBhbHBoYSB0byB0aGUgZGVzdCBhbHBoYSAqLwotICAgICAgICAgICAgICAgIHZkID0gdmVjX2FuZCh2ZCwgdnBpeGVsbWFzayk7Ci0gICAgICAgICAgICAgICAgdmQgPSB2ZWNfb3IodmQsIHZkc3RhbHBoYSk7Ci0KLSAgICAgICAgICAgICAgICAvKiAqZHN0cCA9IHJlcyAqLwotICAgICAgICAgICAgICAgIHZlY19zdCgodmVjdG9yIHVuc2lnbmVkIGludCl2ZCwgMCwgZHN0cCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3JjcCArPSA0OwotICAgICAgICAgICAgICAgIGRzdHAgKz0gNDsKLSAgICAgICAgICAgICAgICB3aWR0aCAtPSA0OwotICAgICAgICAgICAgICAgIHZzID0gdm92ZXJmbG93OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT05FX1BJWEVMX0JMRU5EKChleHRyYXdpZHRoKSwgZXh0cmF3aWR0aCk7Ci0gICAgICAgIH0KLQkgICAgc3JjcCArPSBzcmNza2lwOwotCSAgICBkc3RwICs9IGRzdHNraXA7Ci0JfQotI3VuZGVmIE9ORV9QSVhFTF9CTEVORAotfQotCi1zdGF0aWMgdm9pZCBCbGl0MzJ0bzMyU3VyZmFjZUFscGhhQWx0aXZlYyhTRExfQmxpdEluZm8gKmluZm8pCi17Ci0gICAgLyogWFhYIDogNiAqLwotCXVuc2lnbmVkIGFscGhhID0gaW5mby0+c3JjLT5hbHBoYTsKLSAgICBpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0gICAgVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOwotICAgIGludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7Ci0gICAgVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOwotICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7Ci0gICAgU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7Ci0gICAgU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7Ci0JdW5zaWduZWQgc0EgPSBzcmNmbXQtPmFscGhhOwotCXVuc2lnbmVkIGRBID0gZHN0Zm10LT5BbWFzayA/IFNETF9BTFBIQV9PUEFRVUUgOiAwOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIG1lcmdlUGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c3JjUGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZHN0UGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c2RzdFBlcm11dGU7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYW1hc2s7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJpdHM7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYxOwotICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2ODsKLQotICAgIG1lcmdlUGVybXV0ZSA9IFZFQ19NRVJHRV9QRVJNVVRFKCk7Ci0gICAgdjEgPSB2ZWNfc3BsYXRfdTE2KDEpOwotICAgIHY4ID0gdmVjX3NwbGF0X3UxNig4KTsKLQotICAgIC8qIHNldCB0aGUgYWxwaGEgdG8gMjU1IG9uIHRoZSBkZXN0aW5hdGlvbiBzdXJmICovCi0gICAgdmFscGhhbWFzayA9IFZFQ19BTFBIQV9NQVNLKCk7Ci0KLSAgICB2c3JjUGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKHNyY2ZtdCwgTlVMTCk7Ci0gICAgdmRzdFBlcm11dGUgPSBjYWxjX3N3aXp6bGUzMihOVUxMLCBkc3RmbXQpOwotICAgIHZzZHN0UGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKGRzdGZtdCwgTlVMTCk7Ci0KLSAgICAvKiBzZXQgYSB2ZWN0b3IgZnVsbCBvZiBhbHBoYSBhbmQgMjU1LWFscGhhICovCi0gICAgKCh1bnNpZ25lZCBjaGFyICopJnZhbHBoYSlbMF0gPSBhbHBoYTsKLSAgICB2YWxwaGEgPSB2ZWNfc3BsYXQodmFscGhhLCAwKTsKLSAgICB2Yml0cyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfc3BsYXRfczgoLTEpOwotCi0gICAgd2hpbGUoaGVpZ2h0LS0pIHsKLSAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLSNkZWZpbmUgT05FX1BJWEVMX0JMRU5EKGNvbmRpdGlvbiwgd2lkdGh2YXIpIHdoaWxlICgoY29uZGl0aW9uKSkgeyBcCi0gICAgICAgICAgICBVaW50MzIgUGl4ZWw7IFwKLSAgICAgICAgICAgIHVuc2lnbmVkIHNSLCBzRywgc0IsIGRSLCBkRywgZEI7IFwKLSAgICAgICAgICAgIERJU0VNQkxFX1JHQigoKFVpbnQ4ICopc3JjcCksIDQsIHNyY2ZtdCwgUGl4ZWwsIHNSLCBzRywgc0IpOyBcCi0gICAgICAgICAgICBESVNFTUJMRV9SR0IoKChVaW50OCAqKWRzdHApLCA0LCBkc3RmbXQsIFBpeGVsLCBkUiwgZEcsIGRCKTsgXAotICAgICAgICAgICAgQUNDVVJBVEVfQUxQSEFfQkxFTkQoc1IsIHNHLCBzQiwgc0EsIGRSLCBkRywgZEIpOyBcCi0gICAgICAgICAgICBBU1NFTUJMRV9SR0JBKCgoVWludDggKilkc3RwKSwgNCwgZHN0Zm10LCBkUiwgZEcsIGRCLCBkQSk7IFwKLSAgICAgICAgICAgICsrc3JjcDsgXAotICAgICAgICAgICAgKytkc3RwOyBcCi0gICAgICAgICAgICB3aWR0aHZhci0tOyBcCi0gICAgICAgIH0KLSAgICAgICAgT05FX1BJWEVMX0JMRU5EKChVTkFMSUdORURfUFRSKGRzdHApKSAmJiAod2lkdGgpLCB3aWR0aCk7Ci0gICAgICAgIGlmICh3aWR0aCA+IDApIHsKLSAgICAgICAgICAgIGludCBleHRyYXdpZHRoID0gKHdpZHRoICUgNCk7Ci0gICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxpZ25lciA9IFZFQ19BTElHTkVSKHNyY3ApOwotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDAsIHNyY3ApOwotICAgICAgICAgICAgd2lkdGggLT0gZXh0cmF3aWR0aDsKLSAgICAgICAgICAgIHdoaWxlICh3aWR0aCkgewotICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZDsKLQotICAgICAgICAgICAgICAgIC8qIHMgPSAqc3JjcCAqLwotICAgICAgICAgICAgICAgIHZvdmVyZmxvdyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMTUsIHNyY3ApOwotICAgICAgICAgICAgICAgIHZzID0gdmVjX3Blcm0odnMsIHZvdmVyZmxvdywgdmFsaWduZXIpOwotICAgICAgICAgICAgICAgIHZzID0gdmVjX3Blcm0odnMsIHZhbHBoYSwgdnNyY1Blcm11dGUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qIGQgPSAqZHN0cCAqLwotICAgICAgICAgICAgICAgIHZkID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgwLCBkc3RwKTsKLSAgICAgICAgICAgICAgICB2ZCA9IHZlY19wZXJtKHZkLCB2ZCwgdnNkc3RQZXJtdXRlKTsKLQotICAgICAgICAgICAgICAgIFZFQ19NVUxUSVBMWV9BTFBIQSh2cywgdmQsIHZhbHBoYSwgbWVyZ2VQZXJtdXRlLCB2MSwgdjgpOwotCi0gICAgICAgICAgICAgICAgLyogc2V0IHRoZSBhbHBoYSBjaGFubmVsIHRvIGZ1bGwgb24gKi8KLSAgICAgICAgICAgICAgICB2ZCA9IHZlY19vcih2ZCwgdmFscGhhbWFzayk7Ci0gICAgICAgICAgICAgICAgdmQgPSB2ZWNfcGVybSh2ZCwgdmJpdHMsIHZkc3RQZXJtdXRlKTsKLQotICAgICAgICAgICAgICAgIC8qICpkc3RwID0gcmVzICovCi0gICAgICAgICAgICAgICAgdmVjX3N0KCh2ZWN0b3IgdW5zaWduZWQgaW50KXZkLCAwLCBkc3RwKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzcmNwICs9IDQ7Ci0gICAgICAgICAgICAgICAgZHN0cCArPSA0OwotICAgICAgICAgICAgICAgIHdpZHRoIC09IDQ7Ci0gICAgICAgICAgICAgICAgdnMgPSB2b3ZlcmZsb3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPTkVfUElYRUxfQkxFTkQoKGV4dHJhd2lkdGgpLCBleHRyYXdpZHRoKTsKLSAgICAgICAgfQotI3VuZGVmIE9ORV9QSVhFTF9CTEVORAotIAotICAgICAgICBzcmNwICs9IHNyY3NraXA7Ci0gICAgICAgIGRzdHAgKz0gZHN0c2tpcDsKLSAgICB9Ci0KLX0KLQotCi0vKiBmYXN0IFJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nICovCi1zdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JTdXJmYWNlQWxwaGFBbHRpdmVjKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQl1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7Ci0gICAgaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotICAgIFVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKLSAgICBpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOwotICAgIFVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKLSAgICBpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIG1lcmdlUGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGE7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhbWFzazsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjE7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHY4OwotCi0gICAgbWVyZ2VQZXJtdXRlID0gVkVDX01FUkdFX1BFUk1VVEUoKTsKLSAgICB2MSA9IHZlY19zcGxhdF91MTYoMSk7Ci0gICAgdjggPSB2ZWNfc3BsYXRfdTE2KDgpOwotCi0gICAgLyogc2V0IHRoZSBhbHBoYSB0byAyNTUgb24gdGhlIGRlc3RpbmF0aW9uIHN1cmYgKi8KLSAgICB2YWxwaGFtYXNrID0gVkVDX0FMUEhBX01BU0soKTsKLQotICAgIC8qIHNldCBhIHZlY3RvciBmdWxsIG9mIGFscGhhIGFuZCAyNTUtYWxwaGEgKi8KLSAgICAoKHVuc2lnbmVkIGNoYXIgKikmdmFscGhhKVswXSA9IGFscGhhOwotICAgIHZhbHBoYSA9IHZlY19zcGxhdCh2YWxwaGEsIDApOwotCi0gICAgd2hpbGUoaGVpZ2h0LS0pIHsKLSAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLSNkZWZpbmUgT05FX1BJWEVMX0JMRU5EKGNvbmRpdGlvbiwgd2lkdGh2YXIpIHdoaWxlICgoY29uZGl0aW9uKSkgeyBcCi0gICAgICAgICAgICBVaW50MzIgcyA9ICpzcmNwOyBcCi0gICAgICAgICAgICBVaW50MzIgZCA9ICpkc3RwOyBcCi0gICAgICAgICAgICBVaW50MzIgczEgPSBzICYgMHhmZjAwZmY7IFwKLSAgICAgICAgICAgIFVpbnQzMiBkMSA9IGQgJiAweGZmMDBmZjsgXAotICAgICAgICAgICAgZDEgPSAoZDEgKyAoKHMxIC0gZDEpICogYWxwaGEgPj4gOCkpIFwKLSAgICAgICAgICAgICAgICAgJiAweGZmMDBmZjsgXAotICAgICAgICAgICAgcyAmPSAweGZmMDA7IFwKLSAgICAgICAgICAgIGQgJj0gMHhmZjAwOyBcCi0gICAgICAgICAgICBkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsgXAotICAgICAgICAgICAgKmRzdHAgPSBkMSB8IGQgfCAweGZmMDAwMDAwOyBcCi0gICAgICAgICAgICArK3NyY3A7IFwKLSAgICAgICAgICAgICsrZHN0cDsgXAotICAgICAgICAgICAgd2lkdGh2YXItLTsgXAotICAgICAgICB9Ci0gICAgICAgIE9ORV9QSVhFTF9CTEVORCgoVU5BTElHTkVEX1BUUihkc3RwKSkgJiYgKHdpZHRoKSwgd2lkdGgpOwotICAgICAgICBpZiAod2lkdGggPiAwKSB7Ci0gICAgICAgICAgICBpbnQgZXh0cmF3aWR0aCA9ICh3aWR0aCAlIDQpOwotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFsaWduZXIgPSBWRUNfQUxJR05FUihzcmNwKTsKLSAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgwLCBzcmNwKTsKLSAgICAgICAgICAgIHdpZHRoIC09IGV4dHJhd2lkdGg7Ci0gICAgICAgICAgICB3aGlsZSAod2lkdGgpIHsKLSAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2b3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBzID0gKnNyY3AgKi8KLSAgICAgICAgICAgICAgICB2b3ZlcmZsb3cgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDE1LCBzcmNwKTsKLSAgICAgICAgICAgICAgICB2cyA9IHZlY19wZXJtKHZzLCB2b3ZlcmZsb3csIHZhbGlnbmVyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKiBkID0gKmRzdHAgKi8KLSAgICAgICAgICAgICAgICB2ZCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMCwgZHN0cCk7Ci0KLSAgICAgICAgICAgICAgICBWRUNfTVVMVElQTFlfQUxQSEEodnMsIHZkLCB2YWxwaGEsIG1lcmdlUGVybXV0ZSwgdjEsIHY4KTsKLQotICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgYWxwaGEgY2hhbm5lbCB0byBmdWxsIG9uICovCi0gICAgICAgICAgICAgICAgdmQgPSB2ZWNfb3IodmQsIHZhbHBoYW1hc2spOwotCi0gICAgICAgICAgICAgICAgLyogKmRzdHAgPSByZXMgKi8KLSAgICAgICAgICAgICAgICB2ZWNfc3QoKHZlY3RvciB1bnNpZ25lZCBpbnQpdmQsIDAsIGRzdHApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNyY3AgKz0gNDsKLSAgICAgICAgICAgICAgICBkc3RwICs9IDQ7Ci0gICAgICAgICAgICAgICAgd2lkdGggLT0gNDsKLSAgICAgICAgICAgICAgICB2cyA9IHZvdmVyZmxvdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9ORV9QSVhFTF9CTEVORCgoZXh0cmF3aWR0aCksIGV4dHJhd2lkdGgpOwotICAgICAgICB9Ci0jdW5kZWYgT05FX1BJWEVMX0JMRU5ECi0gCi0gICAgICAgIHNyY3AgKz0gc3Jjc2tpcDsKLSAgICAgICAgZHN0cCArPSBkc3Rza2lwOwotICAgIH0KLX0KLSNpZiBfX01XRVJLU19fCi0jcHJhZ21hIGFsdGl2ZWNfbW9kZWwgb2ZmCi0jZW5kaWYKLSNlbmRpZiAvKiBTRExfQUxUSVZFQ19CTElUVEVSUyAqLwotCi0vKiBmYXN0IFJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYT0xMjggc3BlY2lhbCBjYXNlICovCi1zdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JTdXJmYWNlQWxwaGExMjgoU0RMX0JsaXRJbmZvICppbmZvKQotewotCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOwotCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOwotCi0Jd2hpbGUoaGVpZ2h0LS0pIHsKLQkgICAgRFVGRlNfTE9PUDQoewotCQkgICAgVWludDMyIHMgPSAqc3JjcCsrOwotCQkgICAgVWludDMyIGQgPSAqZHN0cDsKLQkJICAgICpkc3RwKysgPSAoKCgocyAmIDB4MDBmZWZlZmUpICsgKGQgJiAweDAwZmVmZWZlKSkgPj4gMSkKLQkJCSAgICAgICArIChzICYgZCAmIDB4MDAwMTAxMDEpKSB8IDB4ZmYwMDAwMDA7Ci0JICAgIH0sIHdpZHRoKTsKLQkgICAgc3JjcCArPSBzcmNza2lwOwotCSAgICBkc3RwICs9IGRzdHNraXA7Ci0JfQotfQotCi0vKiBmYXN0IFJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYSAqLwotc3RhdGljIHZvaWQgQmxpdFJHQnRvUkdCU3VyZmFjZUFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQl1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7Ci0JaWYoYWxwaGEgPT0gMTI4KSB7Ci0JCUJsaXRSR0J0b1JHQlN1cmZhY2VBbHBoYTEyOChpbmZvKTsKLQl9IGVsc2UgewotCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKLQkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLQkJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOwotCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOwotCQlVaW50MzIgczsKLQkJVWludDMyIGQ7Ci0JCVVpbnQzMiBzMTsKLQkJVWludDMyIGQxOwotCi0JCXdoaWxlKGhlaWdodC0tKSB7Ci0JCQlEVUZGU19MT09QX0RPVUJMRTIoewotCQkJCS8qIE9uZSBQaXhlbCBCbGVuZCAqLwotCQkJCXMgPSAqc3JjcDsKLQkJCQlkID0gKmRzdHA7Ci0JCQkJczEgPSBzICYgMHhmZjAwZmY7Ci0JCQkJZDEgPSBkICYgMHhmZjAwZmY7Ci0JCQkJZDEgPSAoZDEgKyAoKHMxIC0gZDEpICogYWxwaGEgPj4gOCkpCi0JCQkJICAgICAmIDB4ZmYwMGZmOwotCQkJCXMgJj0gMHhmZjAwOwotCQkJCWQgJj0gMHhmZjAwOwotCQkJCWQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOwotCQkJCSpkc3RwID0gZDEgfCBkIHwgMHhmZjAwMDAwMDsKLQkJCQkrK3NyY3A7Ci0JCQkJKytkc3RwOwotCQkJfSx7Ci0JCQkgICAgICAgIC8qIFR3byBQaXhlbHMgQmxlbmQgKi8KLQkJCQlzID0gKnNyY3A7Ci0JCQkJZCA9ICpkc3RwOwotCQkJCXMxID0gcyAmIDB4ZmYwMGZmOwotCQkJCWQxID0gZCAmIDB4ZmYwMGZmOwotCQkJCWQxICs9IChzMSAtIGQxKSAqIGFscGhhID4+IDg7Ci0JCQkJZDEgJj0gMHhmZjAwZmY7Ci0JCQkJICAgICAKLQkJCQlzID0gKChzICYgMHhmZjAwKSA+PiA4KSB8IAotCQkJCQkoKHNyY3BbMV0gJiAweGZmMDApIDw8IDgpOwotCQkJCWQgPSAoKGQgJiAweGZmMDApID4+IDgpIHwKLQkJCQkJKChkc3RwWzFdICYgMHhmZjAwKSA8PCA4KTsKLQkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA4OwotCQkJCWQgJj0gMHgwMGZmMDBmZjsKLQkJCQkKLQkJCQkqZHN0cCsrID0gZDEgfCAoKGQgPDwgOCkgJiAweGZmMDApIHwgMHhmZjAwMDAwMDsKLQkJCQkrK3NyY3A7Ci0JCQkJCi0JCQkgICAgICAgIHMxID0gKnNyY3A7Ci0JCQkJZDEgPSAqZHN0cDsKLQkJCQlzMSAmPSAweGZmMDBmZjsKLQkJCQlkMSAmPSAweGZmMDBmZjsKLQkJCQlkMSArPSAoczEgLSBkMSkgKiBhbHBoYSA+PiA4OwotCQkJCWQxICY9IDB4ZmYwMGZmOwotCQkJCQotCQkJCSpkc3RwID0gZDEgfCAoKGQgPj4gOCkgJiAweGZmMDApIHwgMHhmZjAwMDAwMDsKLQkJCQkrK3NyY3A7Ci0JCQkJKytkc3RwOwotCQkJfSwgd2lkdGgpOwotCQkJc3JjcCArPSBzcmNza2lwOwotCQkJZHN0cCArPSBkc3Rza2lwOwotCQl9Ci0JfQotfQotCi0vKiBmYXN0IEFSR0I4ODgtPihBKVJHQjg4OCBibGVuZGluZyB3aXRoIHBpeGVsIGFscGhhICovCi1zdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JQaXhlbEFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLQlVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKLQotCXdoaWxlKGhlaWdodC0tKSB7Ci0JICAgIERVRkZTX0xPT1A0KHsKLQkJVWludDMyIGRhbHBoYTsKLQkJVWludDMyIGQ7Ci0JCVVpbnQzMiBzMTsKLQkJVWludDMyIGQxOwotCQlVaW50MzIgcyA9ICpzcmNwOwotCQlVaW50MzIgYWxwaGEgPSBzID4+IDI0OwotCQkvKiBGSVhNRTogSGVyZSB3ZSBzcGVjaWFsLWNhc2Ugb3BhcXVlIGFscGhhIHNpbmNlIHRoZQotCQkgICBjb21wb3NpdGlvbmluZyB1c2VkICg+PjggaW5zdGVhZCBvZiAvMjU1KSBkb2Vzbid0IGhhbmRsZQotCQkgICBpdCBjb3JyZWN0bHkuIEFsc28gc3BlY2lhbC1jYXNlIGFscGhhPTAgZm9yIHNwZWVkPwotCQkgICBCZW5jaG1hcmsgdGhpcyEgKi8KLQkJaWYoYWxwaGEpIHsgICAKLQkJICBpZihhbHBoYSA9PSBTRExfQUxQSEFfT1BBUVVFKSB7Ci0JCSAgICAqZHN0cCA9IChzICYgMHgwMGZmZmZmZikgfCAoKmRzdHAgJiAweGZmMDAwMDAwKTsKLQkJICB9IGVsc2UgewotCQkgICAgLyoKLQkJICAgICAqIHRha2Ugb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbiksIGFuZCBwcm9jZXNzCi0JCSAgICAgKiB0aGUgb3RoZXIgdHdvIGluIHBhcmFsbGVsLiBPbmUgbXVsdGlwbHkgbGVzcy4KLQkJICAgICAqLwotCQkgICAgZCA9ICpkc3RwOwotCQkgICAgZGFscGhhID0gZCAmIDB4ZmYwMDAwMDA7Ci0JCSAgICBzMSA9IHMgJiAweGZmMDBmZjsKLQkJICAgIGQxID0gZCAmIDB4ZmYwMGZmOwotCQkgICAgZDEgPSAoZDEgKyAoKHMxIC0gZDEpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwZmY7Ci0JCSAgICBzICY9IDB4ZmYwMDsKLQkJICAgIGQgJj0gMHhmZjAwOwotCQkgICAgZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7Ci0JCSAgICAqZHN0cCA9IGQxIHwgZCB8IGRhbHBoYTsKLQkJICB9Ci0JCX0KLQkJKytzcmNwOwotCQkrK2RzdHA7Ci0JICAgIH0sIHdpZHRoKTsKLQkgICAgc3JjcCArPSBzcmNza2lwOwotCSAgICBkc3RwICs9IGRzdHNraXA7Ci0JfQotfQotCi0jaWYgR0NDX0FTTUJMSVQKLS8qIGZhc3QgKGFzIGluIE1NWCB3aXRoIHByZWZldGNoKSBBUkdCODg4LT4oQSlSR0I4ODggYmxlbmRpbmcgd2l0aCBwaXhlbCBhbHBoYSAqLwotc3RhdGljIHZvaWQgQmxpdFJHQnRvUkdCUGl4ZWxBbHBoYU1NWDNETk9XKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLQlVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKLQlTRExfUGl4ZWxGb3JtYXQqIHNmID0gaW5mby0+c3JjOwotCVVpbnQzMiBhbWFzayA9IHNmLT5BbWFzazsKLQotCV9fYXNtX18gKAotCS8qIG1ha2UgbW02IGFsbCB6ZXJvcy4gKi8KLQkicHhvciAgICAgICAlJW1tNiwgJSVtbTZcbiIKLQkKLQkvKiBNYWtlIGEgbWFzayB0byBwcmVzZXJ2ZSB0aGUgYWxwaGEuICovCi0JIm1vdmQgICAgICAlMCwgJSVtbTdcblx0IiAgICAgICAgICAgLyogMDAwMEYwMDAgLT4gbW03ICovCi0JInB1bnBja2xidyAlJW1tNywgJSVtbTdcblx0IiAgICAgICAgLyogRkYwMDAwMDAgLT4gbW03ICovCi0JInBjbXBlcWIgICAlJW1tNCwgJSVtbTRcblx0IiAgICAgICAgLyogRkZGRkZGRkYgLT4gbW00ICovCi0JIm1vdnEgICAgICAlJW1tNCwgJSVtbTNcblx0IiAgICAgICAgLyogRkZGRkZGRkYgLT4gbW0zIChmb3IgbGF0ZXIpICovCi0JInB4b3IgICAgICAlJW1tNCwgJSVtbTdcblx0IiAgICAgICAgLyogMDBGRkZGRkYgLT4gbW03IChtdWx0IG1hc2spICovCi0KLQkvKiBmb3JtIGNoYW5uZWwgbWFza3MgKi8KLQkibW92cSAgICAgICUlbW03LCAlJW1tNFxuXHQiICAgICAgICAvKiAwMEZGRkZGRiAtPiBtbTQgKi8KLQkicGFja3Nzd2IgICUlbW02LCAlJW1tNFxuXHQiICAgICAgICAvKiAwMDAwMEZGRiAtPiBtbTQgKGNoYW5uZWwgbWFzaykgKi8KLQkicGFja3Nzd2IgICUlbW02LCAlJW1tM1xuXHQiICAgICAgICAvKiAwMDAwRkZGRiAtPiBtbTMgKi8KLQkicHhvciAgICAgICUlbW00LCAlJW1tM1xuXHQiICAgICAgICAvKiAwMDAwRjAwMCAtPiBtbTMgKH5jaGFubmVsIG1hc2spICovCi0JCi0JLyogZ2V0IGFscGhhIGNoYW5uZWwgc2hpZnQgKi8KLQkibW92ZCAgICAgICUxLCAlJW1tNVxuXHQiIC8qIEFzaGlmdCAtPiBtbTUgKi8KLQotCSAgOiAvKiBub3RoaW5nICovIDogInJtIiAoYW1hc2spLCAicm0iICgoVWludDMyKSBzZi0+QXNoaWZ0KSApOwotCi0Jd2hpbGUoaGVpZ2h0LS0pIHsKLQotCSAgICBEVUZGU19MT09QNCh7Ci0JCVVpbnQzMiBhbHBoYTsKLQotCQlfX2FzbV9fICgKLQkJInByZWZldGNoIDY0KCUwKVxuIgotCQkicHJlZmV0Y2ggNjQoJTEpXG4iCi0JCQk6IDogInIiIChzcmNwKSwgInIiIChkc3RwKSApOwotCi0JCWFscGhhID0gKnNyY3AgJiBhbWFzazsKLQkJLyogRklYTUU6IEhlcmUgd2Ugc3BlY2lhbC1jYXNlIG9wYXF1ZSBhbHBoYSBzaW5jZSB0aGUKLQkJICAgY29tcG9zaXRpb25pbmcgdXNlZCAoPj44IGluc3RlYWQgb2YgLzI1NSkgZG9lc24ndCBoYW5kbGUKLQkJICAgaXQgY29ycmVjdGx5LiBBbHNvIHNwZWNpYWwtY2FzZSBhbHBoYT0wIGZvciBzcGVlZD8KLQkJICAgQmVuY2htYXJrIHRoaXMhICovCi0JCWlmKGFscGhhID09IDApIHsKLQkJICAgIC8qIGRvIG5vdGhpbmcgKi8KLQkJfQotCQllbHNlIGlmKGFscGhhID09IGFtYXNrKSB7Ci0JCQkvKiBvcGFxdWUgYWxwaGEgLS0gY29weSBSR0IsIGtlZXAgZHN0IGFscGhhICovCi0JCSAgICAvKiB1c2luZyBNTVggaGVyZSB0byBmcmVlIHVwIHJlZ3VsYXIgcmVnaXN0ZXJzIGZvciBvdGhlciB0aGluZ3MgKi8KLQkJCSAgICBfX2FzbV9fICgKLQkJICAgICJtb3ZkICAgICAgKCUwKSwgICUlbW0wXG5cdCIgLyogc3JjKEFSR0IpIC0+IG1tMCAoMDAwMEFSR0IpKi8KLQkJICAgICJtb3ZkICAgICAgKCUxKSwgICUlbW0xXG5cdCIgLyogZHN0KEFSR0IpIC0+IG1tMSAoMDAwMEFSR0IpKi8KLQkJICAgICJwYW5kICAgICAgJSVtbTQsICUlbW0wXG5cdCIgLyogc3JjICYgY2hhbm1hc2sgLT4gbW0wICovCi0JCSAgICAicGFuZCAgICAgICUlbW0zLCAlJW1tMVxuXHQiIC8qIGRzdCAmIH5jaGFubWFzayAtPiBtbTIgKi8KLQkJICAgICJwb3IgICAgICAgJSVtbTAsICUlbW0xXG5cdCIgLyogc3JjIHwgZHN0IC0+IG1tMSAqLwotCQkgICAgIm1vdmQgICAgICAlJW1tMSwgKCUxKSBcblx0IiAvKiBtbTEgLT4gZHN0ICovCi0KLQkJICAgICA6IDogInIiIChzcmNwKSwgInIiIChkc3RwKSApOwotCQl9IAotCi0JCWVsc2UgewotCQkJICAgIF9fYXNtX18gKAotCQkgICAgLyogbG9hZCBpbiB0aGUgc291cmNlLCBhbmQgZHN0LiAqLwotCQkgICAgIm1vdmQgICAgICAoJTApLCAlJW1tMFxuIgkJICAgIC8qIG1tMChzKSA9IDAgMCAwIDAgfCBBcyBScyBHcyBCcyAqLwotCQkgICAgIm1vdmQgICAgICAoJTEpLCAlJW1tMVxuIgkJICAgIC8qIG1tMShkKSA9IDAgMCAwIDAgfCBBZCBSZCBHZCBCZCAqLwotCi0JCSAgICAvKiBNb3ZlIHRoZSBzcmMgYWxwaGEgaW50byBtbTIgKi8KLQotCQkgICAgLyogaWYgc3VwcG9ydGluZyBwc2h1ZncgKi8KLQkJICAgIC8qInBzaHVmdyAgICAgJDB4NTUsICUlbW0wLCAlJW1tMlxuIiAqLyAvKiBtbTIgPSAwIEFzIDAgQXMgfCAgMCBBcyAgMCAgQXMgKi8KLQkJICAgIC8qInBzcmx3ICAgICAkOCwgJSVtbTJcbiIgKi8KLQkJICAgIAotCQkgICAgLyogZWxzZTogKi8KLQkJICAgICJtb3ZkICAgICAgICUyLCAgICAlJW1tMlxuIgotCQkgICAgInBzcmxkICAgICAgJSVtbTUsICUlbW0yXG4iICAgICAgICAgICAgICAgIC8qIG1tMiA9IDAgMCAwIDAgfCAwICAwICAwICBBcyAqLwotCQkgICAgInB1bnBja2x3ZAklJW1tMiwgJSVtbTJcbiIJICAgICAgICAgICAgLyogbW0yID0gMCAwIDAgMCB8ICAwIEFzICAwICBBcyAqLwotCQkgICAgInB1bnBja2xkcQklJW1tMiwgJSVtbTJcbiIgICAgICAgICAgICAgLyogbW0yID0gMCBBcyAwIEFzIHwgIDAgQXMgIDAgIEFzICovCi0JCSAgICAicGFuZCAgICAgICAlJW1tNywgJSVtbTJcbiIgICAgICAgICAgICAgIC8qIHRvIHByZXNlcnZlIGRlc3QgYWxwaGEgKi8KLQotCQkgICAgLyogbW92ZSB0aGUgY29sb3JzIGludG8gd29yZHMuICovCi0JCSAgICAicHVucGNrbGJ3ICUlbW02LCAlJW1tMFxuIgkJICAgIC8qIG1tMCA9IDAgQXMgMCBScyB8IDAgR3MgMCBCcyAqLwotCQkgICAgInB1bnBja2xidyAlJW1tNiwgJSVtbTFcbiIgICAgICAgICAgICAgIC8qIG1tMCA9IDAgQWQgMCBSZCB8IDAgR2QgMCBCZCAqLwotCi0JCSAgICAvKiBzcmMgLSBkc3QgKi8KLQkJICAgICJwc3VidyAgICAlJW1tMSwgJSVtbTBcbiIJCSAgICAvKiBtbTAgPSBBcy1BZCBScy1SZCB8IEdzLUdkICBCcy1CZCAqLwotCi0JCSAgICAvKiBBICogKHNyYy1kc3QpICovCi0JCSAgICAicG11bGx3ICAgICUlbW0yLCAlJW1tMFxuIgkJICAgIC8qIG1tMCA9IDAqQXMtZCBBcypScy1kIHwgQXMqR3MtZCAgQXMqQnMtZCAqLwotCQkgICAgInBzcmx3ICAgICAkOCwgICAgJSVtbTBcbiIJCSAgICAvKiBtbTAgPSAwPj44IFJjPj44IHwgR2M+PjggIEJjPj44ICovCi0JCSAgICAicGFkZGIgICAgICUlbW0xLCAlJW1tMFxuIgkJICAgIC8qIG1tMCA9IDArQWQgUmMrUmQgfCBHYytHZCAgQmMrQmQgKi8KLQotCQkgICAgInBhY2t1c3diICAlJW1tMCwgJSVtbTBcbiIgICAgICAgICAgICAgIC8qIG1tMCA9ICAgICAgICAgICAgIHwgQWMgUmMgR2MgQmMgKi8KLQkJICAgIAotCQkgICAgIm1vdmQgICAgICAlJW1tMCwgKCUxKVxuIiAgICAgICAgICAgICAgIC8qIHJlc3VsdCBpbiBtbTAgKi8KLQotCQkgICAgIDogOiAiciIgKHNyY3ApLCAiciIgKGRzdHApLCAiciIgKGFscGhhKSApOwotCi0JCX0KLQkJKytzcmNwOwotCQkrK2RzdHA7Ci0JICAgIH0sIHdpZHRoKTsKLQkgICAgc3JjcCArPSBzcmNza2lwOwotCSAgICBkc3RwICs9IGRzdHNraXA7Ci0JfQotCi0JX19hc21fXyAoCi0JImVtbXNcbiIKLQkJOiAgICk7Ci19Ci0vKiBFbmQgR0NDX0FTTUJMSVQqLwotCi0jZWxpZiBNU1ZDX0FTTUJMSVQKLS8qIGZhc3QgKGFzIGluIE1NWCB3aXRoIHByZWZldGNoKSBBUkdCODg4LT4oQSlSR0I4ODggYmxlbmRpbmcgd2l0aCBwaXhlbCBhbHBoYSAqLwotc3RhdGljIHZvaWQgQmxpdFJHQnRvUkdCUGl4ZWxBbHBoYU1NWDNETk9XKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLQlVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKLQlTRExfUGl4ZWxGb3JtYXQqIHNmID0gaW5mby0+c3JjOwotCVVpbnQzMiBjaGFubWFzayA9IHNmLT5SbWFzayB8IHNmLT5HbWFzayB8IHNmLT5CbWFzazsKLQlVaW50MzIgYW1hc2sgPSBzZi0+QW1hc2s7Ci0JVWludDMyIGFzaGlmdCA9IHNmLT5Bc2hpZnQ7Ci0JVWludDY0IG11bHRtYXNrOwotCQotCV9fbTY0IHNyYzEsIGRzdDEsIG1tX2FscGhhLCBtbV96ZXJvLCBkbWFzazsKLQotCW1tX3plcm8gPSBfbW1fc2V0emVyb19zaTY0KCk7IC8qIDAgLT4gbW1femVybyAqLwotCW11bHRtYXNrID0gfigweEZGRkZpNjQgPDwgKGFzaGlmdCAqIDIpKTsKLQlkbWFzayA9ICooX19tNjQqKSAmbXVsdG1hc2s7IC8qIGRzdCBhbHBoYSBtYXNrIC0+IGRtYXNrICovCi0KLQl3aGlsZShoZWlnaHQtLSkgewotCSAgICBEVUZGU19MT09QNCh7Ci0JCVVpbnQzMiBhbHBoYTsKLQotCQlfbV9wcmVmZXRjaChzcmNwICsgMTYpOwotCQlfbV9wcmVmZXRjaChkc3RwICsgMTYpOwotCi0JCWFscGhhID0gKnNyY3AgJiBhbWFzazsKLQkJaWYgKGFscGhhID09IDApIHsKLQkJCS8qIGRvIG5vdGhpbmcgKi8KLQkJfSBlbHNlIGlmIChhbHBoYSA9PSBhbWFzaykgewotCQkJLyogY29weSBSR0IsIGtlZXAgZHN0IGFscGhhICovCi0JCQkqZHN0cCA9ICgqc3JjcCAmIGNoYW5tYXNrKSB8ICgqZHN0cCAmIH5jaGFubWFzayk7Ci0JCX0gZWxzZSB7Ci0JCQlzcmMxID0gX21tX2N2dHNpMzJfc2k2NCgqc3JjcCk7IC8qIHNyYyhBUkdCKSAtPiBzcmMxICgwMDAwQVJHQikqLwotCQkJc3JjMSA9IF9tbV91bnBhY2tsb19waTgoc3JjMSwgbW1femVybyk7IC8qIDBBMFIwRzBCIC0+IHNyYzEgKi8KLQotCQkJZHN0MSA9IF9tbV9jdnRzaTMyX3NpNjQoKmRzdHApOyAvKiBkc3QoQVJHQikgLT4gZHN0MSAoMDAwMEFSR0IpKi8KLQkJCWRzdDEgPSBfbW1fdW5wYWNrbG9fcGk4KGRzdDEsIG1tX3plcm8pOyAvKiAwQTBSMEcwQiAtPiBkc3QxICovCi0KLQkJCW1tX2FscGhhID0gX21tX2N2dHNpMzJfc2k2NChhbHBoYSk7IC8qIGFscGhhIC0+IG1tX2FscGhhICgwMDAwMDAwQSkgKi8KLQkJCW1tX2FscGhhID0gX21tX3NybGlfc2k2NChtbV9hbHBoYSwgYXNoaWZ0KTsgLyogbW1fYWxwaGEgPj4gYXNoaWZ0IC0+IG1tX2FscGhhKDAwMDAwMDBBKSAqLwotCQkJbW1fYWxwaGEgPSBfbW1fdW5wYWNrbG9fcGkxNihtbV9hbHBoYSwgbW1fYWxwaGEpOyAvKiAwMDAwMEEwQSAtPiBtbV9hbHBoYSAqLwotCQkJbW1fYWxwaGEgPSBfbW1fdW5wYWNrbG9fcGkzMihtbV9hbHBoYSwgbW1fYWxwaGEpOyAvKiAwQTBBMEEwQSAtPiBtbV9hbHBoYSAqLwotCQkJbW1fYWxwaGEgPSBfbW1fYW5kX3NpNjQobW1fYWxwaGEsIGRtYXNrKTsgLyogMDAwQTBBMEEgLT4gbW1fYWxwaGEsIHByZXNlcnZlIGRzdCBhbHBoYSBvbiBhZGQgKi8KLQotCQkJLyogYmxlbmQgKi8JCSAgICAKLQkJCXNyYzEgPSBfbW1fc3ViX3BpMTYoc3JjMSwgZHN0MSk7Lyogc3JjIC0gZHN0IC0+IHNyYzEgKi8KLQkJCXNyYzEgPSBfbW1fbXVsbG9fcGkxNihzcmMxLCBtbV9hbHBoYSk7IC8qIChzcmMgLSBkc3QpICogYWxwaGEgLT4gc3JjMSAqLwotCQkJc3JjMSA9IF9tbV9zcmxpX3BpMTYoc3JjMSwgOCk7IC8qIHNyYzEgPj4gOCAtPiBzcmMxKDAwMFIwRzBCKSAqLwotCQkJZHN0MSA9IF9tbV9hZGRfcGk4KHNyYzEsIGRzdDEpOyAvKiBzcmMxICsgZHN0MShkc3QpIC0+IGRzdDEoMEEwUjBHMEIpICovCi0JCQlkc3QxID0gX21tX3BhY2tzX3B1MTYoZHN0MSwgbW1femVybyk7ICAvKiAwMDAwQVJHQiAtPiBkc3QxICovCi0JCQkKLQkJCSpkc3RwID0gX21tX2N2dHNpNjRfc2kzMihkc3QxKTsgLyogZHN0MSAtPiBwaXhlbCAqLwotCQl9Ci0JCSsrc3JjcDsKLQkJKytkc3RwOwotCSAgICB9LCB3aWR0aCk7Ci0JICAgIHNyY3AgKz0gc3Jjc2tpcDsKLQkgICAgZHN0cCArPSBkc3Rza2lwOwotCX0KLQlfbW1fZW1wdHkoKTsKLX0KLS8qIEVuZCBNU1ZDX0FTTUJMSVQgKi8KLQotI2VuZGlmIC8qIEdDQ19BU01CTElULCBNU1ZDX0FTTUJMSVQgKi8KLQotLyogMTZicHAgc3BlY2lhbCBjYXNlIGZvciBwZXItc3VyZmFjZSBhbHBoYT01MCU6IGJsZW5kIDIgcGl4ZWxzIGluIHBhcmFsbGVsICovCi0KLS8qIGJsZW5kIGEgc2luZ2xlIDE2IGJpdCBwaXhlbCBhdCA1MCUgKi8KLSNkZWZpbmUgQkxFTkQxNl81MChkLCBzLCBtYXNrKQkJCQkJCVwKLQkoKCgocyAmIG1hc2spICsgKGQgJiBtYXNrKSkgPj4gMSkgKyAocyAmIGQgJiAofm1hc2sgJiAweGZmZmYpKSkKLQotLyogYmxlbmQgdHdvIDE2IGJpdCBwaXhlbHMgYXQgNTAlICovCi0jZGVmaW5lIEJMRU5EMngxNl81MChkLCBzLCBtYXNrKQkJCQkJICAgICBcCi0JKCgocyAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpICsgKChkICYgKG1hc2sgfCBtYXNrIDw8IDE2KSkgPj4gMSkgXAotCSArIChzICYgZCAmICh+KG1hc2sgfCBtYXNrIDw8IDE2KSkpKQotCi1zdGF0aWMgdm9pZCBCbGl0MTZ0bzE2U3VyZmFjZUFscGhhMTI4KFNETF9CbGl0SW5mbyAqaW5mbywgVWludDE2IG1hc2spCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDE2ICpzcmNwID0gKFVpbnQxNiAqKWluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDE7Ci0JVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDE7Ci0KLQl3aGlsZShoZWlnaHQtLSkgewotCQlpZigoKHVpbnRwdHJfdClzcmNwIF4gKHVpbnRwdHJfdClkc3RwKSAmIDIpIHsKLQkJCS8qCi0JCQkgKiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG5vdCBhbGlnbmVkLCBwaXBlbGluZSBpdC4KLQkJCSAqIFRoaXMgaXMgbW9zdGx5IGEgd2luIGZvciBiaWcgYmxpdHMgYnV0IG5vIGxvc3MgZm9yCi0JCQkgKiBzbWFsbCBvbmVzCi0JCQkgKi8KLQkJCVVpbnQzMiBwcmV2X3N3OwotCQkJaW50IHcgPSB3aWR0aDsKLQotCQkJLyogaGFuZGxlIG9kZCBkZXN0aW5hdGlvbiAqLwotCQkJaWYoKHVpbnRwdHJfdClkc3RwICYgMikgewotCQkJCVVpbnQxNiBkID0gKmRzdHAsIHMgPSAqc3JjcDsKLQkJCQkqZHN0cCA9IEJMRU5EMTZfNTAoZCwgcywgbWFzayk7Ci0JCQkJZHN0cCsrOwotCQkJCXNyY3ArKzsKLQkJCQl3LS07Ci0JCQl9Ci0JCQlzcmNwKys7CS8qIHNyY3AgaXMgbm93IDMyLWJpdCBhbGlnbmVkICovCi0KLQkJCS8qIGJvb3RzdHJhcCBwaXBlbGluZSB3aXRoIGZpcnN0IGhhbGZ3b3JkICovCi0JCQlwcmV2X3N3ID0gKChVaW50MzIgKilzcmNwKVstMV07Ci0KLQkJCXdoaWxlKHcgPiAxKSB7Ci0JCQkJVWludDMyIHN3LCBkdywgczsKLQkJCQlzdyA9ICooVWludDMyICopc3JjcDsKLQkJCQlkdyA9ICooVWludDMyICopZHN0cDsKLSNpZiBTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOCi0JCQkJcyA9IChwcmV2X3N3IDw8IDE2KSArIChzdyA+PiAxNik7Ci0jZWxzZQotCQkJCXMgPSAocHJldl9zdyA+PiAxNikgKyAoc3cgPDwgMTYpOwotI2VuZGlmCi0JCQkJcHJldl9zdyA9IHN3OwotCQkJCSooVWludDMyICopZHN0cCA9IEJMRU5EMngxNl81MChkdywgcywgbWFzayk7Ci0JCQkJZHN0cCArPSAyOwotCQkJCXNyY3AgKz0gMjsKLQkJCQl3IC09IDI7Ci0JCQl9Ci0KLQkJCS8qIGZpbmFsIHBpeGVsIGlmIGFueSAqLwotCQkJaWYodykgewotCQkJCVVpbnQxNiBkID0gKmRzdHAsIHM7Ci0jaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTgotCQkJCXMgPSAoVWludDE2KXByZXZfc3c7Ci0jZWxzZQotCQkJCXMgPSAoVWludDE2KShwcmV2X3N3ID4+IDE2KTsKLSNlbmRpZgotCQkJCSpkc3RwID0gQkxFTkQxNl81MChkLCBzLCBtYXNrKTsKLQkJCQlzcmNwKys7Ci0JCQkJZHN0cCsrOwotCQkJfQotCQkJc3JjcCArPSBzcmNza2lwIC0gMTsKLQkJCWRzdHAgKz0gZHN0c2tpcDsKLQkJfSBlbHNlIHsKLQkJCS8qIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGFsaWduZWQgKi8KLQkJCWludCB3ID0gd2lkdGg7Ci0KLQkJCS8qIGZpcnN0IG9kZCBwaXhlbD8gKi8KLQkJCWlmKCh1aW50cHRyX3Qpc3JjcCAmIDIpIHsKLQkJCQlVaW50MTYgZCA9ICpkc3RwLCBzID0gKnNyY3A7Ci0JCQkJKmRzdHAgPSBCTEVORDE2XzUwKGQsIHMsIG1hc2spOwotCQkJCXNyY3ArKzsKLQkJCQlkc3RwKys7Ci0JCQkJdy0tOwotCQkJfQotCQkJLyogc3JjcCBhbmQgZHN0cCBhcmUgbm93IDMyLWJpdCBhbGlnbmVkICovCi0KLQkJCXdoaWxlKHcgPiAxKSB7Ci0JCQkJVWludDMyIHN3ID0gKihVaW50MzIgKilzcmNwOwotCQkJCVVpbnQzMiBkdyA9ICooVWludDMyICopZHN0cDsKLQkJCQkqKFVpbnQzMiAqKWRzdHAgPSBCTEVORDJ4MTZfNTAoZHcsIHN3LCBtYXNrKTsKLQkJCQlzcmNwICs9IDI7Ci0JCQkJZHN0cCArPSAyOwotCQkJCXcgLT0gMjsKLQkJCX0KLQotCQkJLyogbGFzdCBvZGQgcGl4ZWw/ICovCi0JCQlpZih3KSB7Ci0JCQkJVWludDE2IGQgPSAqZHN0cCwgcyA9ICpzcmNwOwotCQkJCSpkc3RwID0gQkxFTkQxNl81MChkLCBzLCBtYXNrKTsKLQkJCQlzcmNwKys7Ci0JCQkJZHN0cCsrOwotCQkJfQotCQkJc3JjcCArPSBzcmNza2lwOwotCQkJZHN0cCArPSBkc3Rza2lwOwotCQl9Ci0JfQotfQotCi0jaWYgR0NDX0FTTUJMSVQKLS8qIGZhc3QgUkdCNTY1LT5SR0I1NjUgYmxlbmRpbmcgd2l0aCBzdXJmYWNlIGFscGhhICovCi1zdGF0aWMgdm9pZCBCbGl0NTY1dG81NjVTdXJmYWNlQWxwaGFNTVgoU0RMX0JsaXRJbmZvICppbmZvKQotewotCXVuc2lnbmVkIGFscGhhID0gaW5mby0+c3JjLT5hbHBoYTsgLyogZG93bnNjYWxlIGFscGhhIHRvIDUgYml0cyAqLwotCWlmKGFscGhhID09IDEyOCkgewotCQlCbGl0MTZ0bzE2U3VyZmFjZUFscGhhMTI4KGluZm8sIDB4ZjdkZSk7Ci0JfSBlbHNlIHsKLQkJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQkJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCQlVaW50MTYgKnNyY3AgPSAoVWludDE2ICopaW5mby0+c19waXhlbHM7Ci0JCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDE7Ci0JCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKLQkJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMTsKLQkJVWludDMyIHMsIGQ7Ci0JCVVpbnQ4IGxvYWRbOF07Ci0JICAKLQkJYWxwaGEgJj0gfigxKzIrNCk7CQkvKiBjdXQgYWxwaGEgdG8gZ2V0IHRoZSBleGFjdCBzYW1lIGJlaGF2aW91ciAqLwotCQkqKFVpbnQ2NCAqKWxvYWQgPSBhbHBoYTsKLQkJYWxwaGEgPj49IDM7CQkvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCi0KLQkJbW92cV9tMnIoKmxvYWQsIG1tMCk7IC8qIGFscGhhKDAwMDAwMDBBKSAtPiBtbTAgKi8KLQkJcHVucGNrbHdkX3IycihtbTAsIG1tMCk7IC8qIDAwMDAwQTBBIC0+IG1tMCAqLwotCQlwdW5wY2tsd2RfcjJyKG1tMCwgbW0wKTsgLyogMEEwQTBBMEEgLT4gbW0wICovCi0JCS8qIHBvc2l0aW9uIGFscGhhIHRvIGFsbG93IGZvciBtdWxsbyBhbmQgbXVsaGkgb24gZGlmZiBjaGFubmVscwotCQkgICB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBvcGVyYXRpb25zICovCi0JCXBzbGxxX2kycigzLCBtbTApOwotCSAgCi0JCS8qIFNldHVwIHRoZSA1NjUgY29sb3IgY2hhbm5lbCBtYXNrcyAqLwotCQkqKFVpbnQ2NCAqKWxvYWQgPSAweDA3RTAwN0UwMDdFMDA3RTBVTEw7Ci0JCW1vdnFfbTJyKCpsb2FkLCBtbTQpOyAvKiBNQVNLR1JFRU4gLT4gbW00ICovCi0JCSooVWludDY0ICopbG9hZCA9IDB4MDAxRjAwMUYwMDFGMDAxRlVMTDsKLQkJbW92cV9tMnIoKmxvYWQsIG1tNyk7IC8qIE1BU0tCTFVFIC0+IG1tNyAqLwotCQl3aGlsZShoZWlnaHQtLSkgewotCQkJRFVGRlNfTE9PUF9RVUFUUk8yKAotCQkJewotCQkJCXMgPSAqc3JjcCsrOwotCQkJCWQgPSAqZHN0cDsKLQkJCQkvKgotCQkJCSAqIHNoaWZ0IG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pIHRvCi0JCQkJICogdGhlIGhpZ2ggMTYgYml0cywgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgotCQkJCSAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KLQkJCQkgKi8KLQkJCQlzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7Ci0JCQkJZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOwotCQkJCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7Ci0JCQkJZCAmPSAweDA3ZTBmODFmOwotCQkJCSpkc3RwKysgPSBkIHwgZCA+PiAxNjsKLQkJCX0sewotCQkJCXMgPSAqc3JjcCsrOwotCQkJCWQgPSAqZHN0cDsKLQkJCQkvKgotCQkJCSAqIHNoaWZ0IG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pIHRvCi0JCQkJICogdGhlIGhpZ2ggMTYgYml0cywgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgotCQkJCSAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KLQkJCQkgKi8KLQkJCQlzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7Ci0JCQkJZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOwotCQkJCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7Ci0JCQkJZCAmPSAweDA3ZTBmODFmOwotCQkJCSpkc3RwKysgPSBkIHwgZCA+PiAxNjsKLQkJCQlzID0gKnNyY3ArKzsKLQkJCQlkID0gKmRzdHA7Ci0JCQkJLyoKLQkJCQkgKiBzaGlmdCBvdXQgdGhlIG1pZGRsZSBjb21wb25lbnQgKGdyZWVuKSB0bwotCQkJCSAqIHRoZSBoaWdoIDE2IGJpdHMsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKLQkJCQkgKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCi0JCQkJICovCi0JCQkJcyA9IChzIHwgcyA8PCAxNikgJiAweDA3ZTBmODFmOwotCQkJCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsKLQkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OwotCQkJCWQgJj0gMHgwN2UwZjgxZjsKLQkJCQkqZHN0cCsrID0gZCB8IGQgPj4gMTY7Ci0JCQl9LHsKLQkJCQltb3ZxX20ycigoKnNyY3ApLCBtbTIpOy8qIDQgc3JjIHBpeGVscyAtPiBtbTIgKi8KLQkJCQltb3ZxX20ycigoKmRzdHApLCBtbTMpOy8qIDQgZHN0IHBpeGVscyAtPiBtbTMgKi8KLQotCQkJCS8qIHJlZCAtLSBkb2VzIG5vdCBuZWVkIGEgbWFzayBzaW5jZSB0aGUgcmlnaHQgc2hpZnQgY2xlYXJzCi0JCQkJICAgdGhlIHVuaW50ZXJlc3RpbmcgYml0cyAqLwotCQkJCW1vdnFfcjJyKG1tMiwgbW01KTsgLyogc3JjIC0+IG1tNSAqLwotCQkJCW1vdnFfcjJyKG1tMywgbW02KTsgLyogZHN0IC0+IG1tNiAqLwotCQkJCXBzcmx3X2kycigxMSwgbW01KTsgLyogbW01ID4+IDExIC0+IG1tNSBbMDAwciAwMDByIDAwMHIgMDAwcl0gKi8KLQkJCQlwc3Jsd19pMnIoMTEsIG1tNik7IC8qIG1tNiA+PiAxMSAtPiBtbTYgWzAwMHIgMDAwciAwMDByIDAwMHJdICovCi0KLQkJCQkvKiBibGVuZCAqLwotCQkJCXBzdWJ3X3IycihtbTYsIG1tNSk7Lyogc3JjIC0gZHN0IC0+IG1tNSAqLwotCQkJCXBtdWxsd19yMnIobW0wLCBtbTUpOyAvKiBtbTUgKiBhbHBoYSAtPiBtbTUgKi8KLQkJCQkvKiBhbHBoYSB1c2VkIGlzIGFjdHVhbGx5IDExIGJpdHMKLQkJCQkgICAxMSArIDUgPSAxNiBiaXRzLCBzbyB0aGUgc2lnbiBiaXRzIGFyZSBsb3N0ICovCi0JCQkJcHNybHdfaTJyKDExLCBtbTUpOyAvKiBtbTUgPj4gMTEgLT4gbW01ICovCi0JCQkJcGFkZHdfcjJyKG1tNSwgbW02KTsgLyogbW01ICsgbW02KGRzdCkgLT4gbW02ICovCi0JCQkJcHNsbHdfaTJyKDExLCBtbTYpOyAvKiBtbTYgPDwgMTEgLT4gbW02ICovCi0KLQkJCQltb3ZxX3IycihtbTYsIG1tMSk7IC8qIHNhdmUgbmV3IHJlZHMgaW4gZHN0cyAqLwotCi0JCQkJLyogZ3JlZW4gLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLwotCQkJCW1vdnFfcjJyKG1tMiwgbW01KTsgLyogc3JjIC0+IG1tNSAqLwotCQkJCW1vdnFfcjJyKG1tMywgbW02KTsgLyogZHN0IC0+IG1tNiAqLwotCQkJCXBhbmRfcjJyKG1tNCwgbW01KTsgLyogc3JjICYgTUFTS0dSRUVOIC0+IG1tNSAqLwotCQkJCXBhbmRfcjJyKG1tNCwgbW02KTsgLyogZHN0ICYgTUFTS0dSRUVOIC0+IG1tNiAqLwotCi0JCQkJLyogYmxlbmQgKi8KLQkJCQlwc3Vid19yMnIobW02LCBtbTUpOy8qIHNyYyAtIGRzdCAtPiBtbTUgKi8KLQkJCQlwbXVsaHdfcjJyKG1tMCwgbW01KTsgLyogbW01ICogYWxwaGEgLT4gbW01ICovCi0JCQkJLyogMTEgKyAxMSAtIDE2ID0gNiBiaXRzLCBzbyBhbGwgdGhlIGxvd2VyIHVuaW50ZXJlc3RpbmcKLQkJCQkgICBiaXRzIGFyZSBnb25lIGFuZCB0aGUgc2lnbiBiaXRzIHByZXNlbnQgKi8KLQkJCQlwc2xsd19pMnIoNSwgbW01KTsgLyogbW01IDw8IDUgLT4gbW01ICovCi0JCQkJcGFkZHdfcjJyKG1tNSwgbW02KTsgLyogbW01ICsgbW02KGRzdCkgLT4gbW02ICovCi0KLQkJCQlwb3JfcjJyKG1tNiwgbW0xKTsgLyogc2F2ZSBuZXcgZ3JlZW5zIGluIGRzdHMgKi8KLQotCQkJCS8qIGJsdWUgKi8KLQkJCQltb3ZxX3IycihtbTIsIG1tNSk7IC8qIHNyYyAtPiBtbTUgKi8KLQkJCQltb3ZxX3IycihtbTMsIG1tNik7IC8qIGRzdCAtPiBtbTYgKi8KLQkJCQlwYW5kX3IycihtbTcsIG1tNSk7IC8qIHNyYyAmIE1BU0tCTFVFIC0+IG1tNVswMDBiIDAwMGIgMDAwYiAwMDBiXSAqLwotCQkJCXBhbmRfcjJyKG1tNywgbW02KTsgLyogZHN0ICYgTUFTS0JMVUUgLT4gbW02WzAwMGIgMDAwYiAwMDBiIDAwMGJdICovCi0KLQkJCQkvKiBibGVuZCAqLwotCQkJCXBzdWJ3X3IycihtbTYsIG1tNSk7Lyogc3JjIC0gZHN0IC0+IG1tNSAqLwotCQkJCXBtdWxsd19yMnIobW0wLCBtbTUpOyAvKiBtbTUgKiBhbHBoYSAtPiBtbTUgKi8KLQkJCQkvKiAxMSArIDUgPSAxNiBiaXRzLCBzbyB0aGUgc2lnbiBiaXRzIGFyZSBsb3N0IGFuZAotCQkJCSAgIHRoZSBpbnRlcmVzdGluZyBiaXRzIHdpbGwgbmVlZCB0byBiZSBNQVNLZWQgKi8KLQkJCQlwc3Jsd19pMnIoMTEsIG1tNSk7IC8qIG1tNSA+PiAxMSAtPiBtbTUgKi8KLQkJCQlwYWRkd19yMnIobW01LCBtbTYpOyAvKiBtbTUgKyBtbTYoZHN0KSAtPiBtbTYgKi8KLQkJCQlwYW5kX3IycihtbTcsIG1tNik7IC8qIG1tNiAmIE1BU0tCTFVFIC0+IG1tNlswMDBiIDAwMGIgMDAwYiAwMDBiXSAqLwotCi0JCQkJcG9yX3IycihtbTYsIG1tMSk7IC8qIHNhdmUgbmV3IGJsdWVzIGluIGRzdHMgKi8KLQotCQkJCW1vdnFfcjJtKG1tMSwgKmRzdHApOyAvKiBtbTEgLT4gNCBkc3QgcGl4ZWxzICovCi0KLQkJCQlzcmNwICs9IDQ7Ci0JCQkJZHN0cCArPSA0OwotCQkJfSwgd2lkdGgpOwkJCQotCQkJc3JjcCArPSBzcmNza2lwOwotCQkJZHN0cCArPSBkc3Rza2lwOwotCQl9Ci0JCWVtbXMoKTsKLQl9Ci19Ci0KLS8qIGZhc3QgUkdCNTU1LT5SR0I1NTUgYmxlbmRpbmcgd2l0aCBzdXJmYWNlIGFscGhhICovCi1zdGF0aWMgdm9pZCBCbGl0NTU1dG81NTVTdXJmYWNlQWxwaGFNTVgoU0RMX0JsaXRJbmZvICppbmZvKQotewotCXVuc2lnbmVkIGFscGhhID0gaW5mby0+c3JjLT5hbHBoYTsgLyogZG93bnNjYWxlIGFscGhhIHRvIDUgYml0cyAqLwotCWlmKGFscGhhID09IDEyOCkgewotCQlCbGl0MTZ0bzE2U3VyZmFjZUFscGhhMTI4KGluZm8sIDB4ZmJkZSk7Ci0JfSBlbHNlIHsKLQkJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQkJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCQlVaW50MTYgKnNyY3AgPSAoVWludDE2ICopaW5mby0+c19waXhlbHM7Ci0JCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDE7Ci0JCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKLQkJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMTsKLQkJVWludDMyIHMsIGQ7Ci0JCVVpbnQ4IGxvYWRbOF07Ci0JICAKLQkJYWxwaGEgJj0gfigxKzIrNCk7CQkvKiBjdXQgYWxwaGEgdG8gZ2V0IHRoZSBleGFjdCBzYW1lIGJlaGF2aW91ciAqLwotCQkqKFVpbnQ2NCAqKWxvYWQgPSBhbHBoYTsKLQkJYWxwaGEgPj49IDM7CQkvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCi0KLQkJbW92cV9tMnIoKmxvYWQsIG1tMCk7IC8qIGFscGhhKDAwMDAwMDBBKSAtPiBtbTAgKi8KLQkJcHVucGNrbHdkX3IycihtbTAsIG1tMCk7IC8qIDAwMDAwQTBBIC0+IG1tMCAqLwotCQlwdW5wY2tsd2RfcjJyKG1tMCwgbW0wKTsgLyogMEEwQTBBMEEgLT4gbW0wICovCi0JCS8qIHBvc2l0aW9uIGFscGhhIHRvIGFsbG93IGZvciBtdWxsbyBhbmQgbXVsaGkgb24gZGlmZiBjaGFubmVscwotCQkgICB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBvcGVyYXRpb25zICovCi0JCXBzbGxxX2kycigzLCBtbTApOwotCi0JCS8qIFNldHVwIHRoZSA1NTUgY29sb3IgY2hhbm5lbCBtYXNrcyAqLwotCQkqKFVpbnQ2NCAqKWxvYWQgPSAweDAzRTAwM0UwMDNFMDAzRTBVTEw7Ci0JCW1vdnFfbTJyKCpsb2FkLCBtbTQpOyAvKiBNQVNLR1JFRU4gLT4gbW00ICovCi0JCSooVWludDY0ICopbG9hZCA9IDB4MDAxRjAwMUYwMDFGMDAxRlVMTDsKLQkJbW92cV9tMnIoKmxvYWQsIG1tNyk7IC8qIE1BU0tCTFVFIC0+IG1tNyAqLwotCQl3aGlsZShoZWlnaHQtLSkgewotCQkJRFVGRlNfTE9PUF9RVUFUUk8yKAotCQkJewotCQkJCXMgPSAqc3JjcCsrOwotCQkJCWQgPSAqZHN0cDsKLQkJCQkvKgotCQkJCSAqIHNoaWZ0IG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pIHRvCi0JCQkJICogdGhlIGhpZ2ggMTYgYml0cywgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgotCQkJCSAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KLQkJCQkgKi8KLQkJCQlzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDNlMDdjMWY7Ci0JCQkJZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOwotCQkJCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7Ci0JCQkJZCAmPSAweDAzZTA3YzFmOwotCQkJCSpkc3RwKysgPSBkIHwgZCA+PiAxNjsKLQkJCX0sewotCQkJCXMgPSAqc3JjcCsrOwotCQkJCWQgPSAqZHN0cDsKLQkJCQkvKgotCQkJCSAqIHNoaWZ0IG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pIHRvCi0JCQkJICogdGhlIGhpZ2ggMTYgYml0cywgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgotCQkJCSAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KLQkJCQkgKi8KLQkJCQlzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDNlMDdjMWY7Ci0JCQkJZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOwotCQkJCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7Ci0JCQkJZCAmPSAweDAzZTA3YzFmOwotCQkJCSpkc3RwKysgPSBkIHwgZCA+PiAxNjsKLQkJCSAgICAgICAgcyA9ICpzcmNwKys7Ci0JCQkJZCA9ICpkc3RwOwotCQkJCS8qCi0JCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KLQkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCi0JCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgotCQkJCSAqLwotCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsKLQkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7Ci0JCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKLQkJCQlkICY9IDB4MDNlMDdjMWY7Ci0JCQkJKmRzdHArKyA9IGQgfCBkID4+IDE2OwotCQkJfSx7Ci0JCQkJbW92cV9tMnIoKCpzcmNwKSwgbW0yKTsvKiA0IHNyYyBwaXhlbHMgLT4gbW0yICovCi0JCQkJbW92cV9tMnIoKCpkc3RwKSwgbW0zKTsvKiA0IGRzdCBwaXhlbHMgLT4gbW0zICovCi0KLQkJCQkvKiByZWQgLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLwotCQkJCXBzbGxxX2kycig1LCBtbTQpOyAvKiB0dXJuIE1BU0tHUkVFTiBpbnRvIE1BU0tSRUQgKi8KLQkJCQkJLyogYnkgcmV1c2luZyB0aGUgR1JFRU4gbWFzayB3ZSBmcmVlIHVwIGFub3RoZXIgbW14Ci0JCQkJCSAgIHJlZ2lzdGVyIHRvIGFjY3VtdWxhdGUgdGhlIHJlc3VsdCAqLwotCi0JCQkJbW92cV9yMnIobW0yLCBtbTUpOyAvKiBzcmMgLT4gbW01ICovCi0JCQkJbW92cV9yMnIobW0zLCBtbTYpOyAvKiBkc3QgLT4gbW02ICovCi0JCQkJcGFuZF9yMnIobW00LCBtbTUpOyAvKiBzcmMgJiBNQVNLUkVEIC0+IG1tNSAqLwotCQkJCXBhbmRfcjJyKG1tNCwgbW02KTsgLyogZHN0ICYgTUFTS1JFRCAtPiBtbTYgKi8KLQotCQkJCS8qIGJsZW5kICovCi0JCQkJcHN1YndfcjJyKG1tNiwgbW01KTsvKiBzcmMgLSBkc3QgLT4gbW01ICovCi0JCQkJcG11bGh3X3IycihtbTAsIG1tNSk7IC8qIG1tNSAqIGFscGhhIC0+IG1tNSAqLwotCQkJCS8qIDExICsgMTUgLSAxNiA9IDEwIGJpdHMsIHVuaW50ZXJlc3RpbmcgYml0cyB3aWxsIGJlCi0JCQkJICAgY2xlYXJlZCBieSBhIE1BU0sgYmVsb3cgKi8KLQkJCQlwc2xsd19pMnIoNSwgbW01KTsgLyogbW01IDw8IDUgLT4gbW01ICovCi0JCQkJcGFkZHdfcjJyKG1tNSwgbW02KTsgLyogbW01ICsgbW02KGRzdCkgLT4gbW02ICovCi0JCQkJcGFuZF9yMnIobW00LCBtbTYpOyAvKiBtbTYgJiBNQVNLUkVEIC0+IG1tNiAqLwotCi0JCQkJcHNybHFfaTJyKDUsIG1tNCk7IC8qIHR1cm4gTUFTS1JFRCBiYWNrIGludG8gTUFTS0dSRUVOICovCi0KLQkJCQltb3ZxX3IycihtbTYsIG1tMSk7IC8qIHNhdmUgbmV3IHJlZHMgaW4gZHN0cyAqLwotCi0JCQkJLyogZ3JlZW4gLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLwotCQkJCW1vdnFfcjJyKG1tMiwgbW01KTsgLyogc3JjIC0+IG1tNSAqLwotCQkJCW1vdnFfcjJyKG1tMywgbW02KTsgLyogZHN0IC0+IG1tNiAqLwotCQkJCXBhbmRfcjJyKG1tNCwgbW01KTsgLyogc3JjICYgTUFTS0dSRUVOIC0+IG1tNSAqLwotCQkJCXBhbmRfcjJyKG1tNCwgbW02KTsgLyogZHN0ICYgTUFTS0dSRUVOIC0+IG1tNiAqLwotCi0JCQkJLyogYmxlbmQgKi8KLQkJCQlwc3Vid19yMnIobW02LCBtbTUpOy8qIHNyYyAtIGRzdCAtPiBtbTUgKi8KLQkJCQlwbXVsaHdfcjJyKG1tMCwgbW01KTsgLyogbW01ICogYWxwaGEgLT4gbW01ICovCi0JCQkJLyogMTEgKyAxMCAtIDE2ID0gNSBiaXRzLCAgc28gYWxsIHRoZSBsb3dlciB1bmludGVyZXN0aW5nCi0JCQkJICAgYml0cyBhcmUgZ29uZSBhbmQgdGhlIHNpZ24gYml0cyBwcmVzZW50ICovCi0JCQkJcHNsbHdfaTJyKDUsIG1tNSk7IC8qIG1tNSA8PCA1IC0+IG1tNSAqLwotCQkJCXBhZGR3X3IycihtbTUsIG1tNik7IC8qIG1tNSArIG1tNihkc3QpIC0+IG1tNiAqLwotCi0JCQkJcG9yX3IycihtbTYsIG1tMSk7IC8qIHNhdmUgbmV3IGdyZWVucyBpbiBkc3RzICovCi0KLQkJCQkvKiBibHVlICovCi0JCQkJbW92cV9yMnIobW0yLCBtbTUpOyAvKiBzcmMgLT4gbW01ICovCi0JCQkJbW92cV9yMnIobW0zLCBtbTYpOyAvKiBkc3QgLT4gbW02ICovCi0JCQkJcGFuZF9yMnIobW03LCBtbTUpOyAvKiBzcmMgJiBNQVNLQkxVRSAtPiBtbTVbMDAwYiAwMDBiIDAwMGIgMDAwYl0gKi8KLQkJCQlwYW5kX3IycihtbTcsIG1tNik7IC8qIGRzdCAmIE1BU0tCTFVFIC0+IG1tNlswMDBiIDAwMGIgMDAwYiAwMDBiXSAqLwotCi0JCQkJLyogYmxlbmQgKi8KLQkJCQlwc3Vid19yMnIobW02LCBtbTUpOy8qIHNyYyAtIGRzdCAtPiBtbTUgKi8KLQkJCQlwbXVsbHdfcjJyKG1tMCwgbW01KTsgLyogbW01ICogYWxwaGEgLT4gbW01ICovCi0JCQkJLyogMTEgKyA1ID0gMTYgYml0cywgc28gdGhlIHNpZ24gYml0cyBhcmUgbG9zdCBhbmQKLQkJCQkgICB0aGUgaW50ZXJlc3RpbmcgYml0cyB3aWxsIG5lZWQgdG8gYmUgTUFTS2VkICovCi0JCQkJcHNybHdfaTJyKDExLCBtbTUpOyAvKiBtbTUgPj4gMTEgLT4gbW01ICovCi0JCQkJcGFkZHdfcjJyKG1tNSwgbW02KTsgLyogbW01ICsgbW02KGRzdCkgLT4gbW02ICovCi0JCQkJcGFuZF9yMnIobW03LCBtbTYpOyAvKiBtbTYgJiBNQVNLQkxVRSAtPiBtbTZbMDAwYiAwMDBiIDAwMGIgMDAwYl0gKi8KLQotCQkJCXBvcl9yMnIobW02LCBtbTEpOyAvKiBzYXZlIG5ldyBibHVlcyBpbiBkc3RzICovCi0KLQkJCQltb3ZxX3IybShtbTEsICpkc3RwKTsvKiBtbTEgLT4gNCBkc3QgcGl4ZWxzICovCi0KLQkJCQlzcmNwICs9IDQ7Ci0JCQkJZHN0cCArPSA0OwotCQkJfSwgd2lkdGgpOwkJCQotCQkJc3JjcCArPSBzcmNza2lwOwotCQkJZHN0cCArPSBkc3Rza2lwOwotCQl9Ci0JCWVtbXMoKTsKLQl9Ci19Ci0vKiBFbmQgR0NDX0FTTUJMSVQgKi8KLQotI2VsaWYgTVNWQ19BU01CTElUCi0vKiBmYXN0IFJHQjU2NS0+UkdCNTY1IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYSAqLwotc3RhdGljIHZvaWQgQmxpdDU2NXRvNTY1U3VyZmFjZUFscGhhTU1YKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQl1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7Ci0JaWYoYWxwaGEgPT0gMTI4KSB7Ci0JCUJsaXQxNnRvMTZTdXJmYWNlQWxwaGExMjgoaW5mbywgMHhmN2RlKTsKLQl9IGVsc2UgewotCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKilpbmZvLT5zX3BpeGVsczsKLQkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMTsKLQkJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOwotCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOwotCQlVaW50MzIgcywgZDsKLQkgIAotCQlfX202NCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBnbWFzaywgYm1hc2ssIG1tX3JlcywgbW1fYWxwaGE7Ci0KLQkJYWxwaGEgJj0gfigxKzIrNCk7CQkvKiBjdXQgYWxwaGEgdG8gZ2V0IHRoZSBleGFjdCBzYW1lIGJlaGF2aW91ciAqLwotCQltbV9hbHBoYSA9IF9tbV9zZXRfcGkzMigwLCBhbHBoYSk7IC8qIDAwMDAwMDBBIC0+IG1tX2FscGhhICovCi0JCWFscGhhID4+PSAzOwkJLyogZG93bnNjYWxlIGFscGhhIHRvIDUgYml0cyAqLwotCi0JCW1tX2FscGhhID0gX21tX3VucGFja2xvX3BpMTYobW1fYWxwaGEsIG1tX2FscGhhKTsgLyogMDAwMDBBMEEgLT4gbW1fYWxwaGEgKi8KLQkJbW1fYWxwaGEgPSBfbW1fdW5wYWNrbG9fcGkzMihtbV9hbHBoYSwgbW1fYWxwaGEpOyAvKiAwQTBBMEEwQSAtPiBtbV9hbHBoYSAqLwotCQkvKiBwb3NpdGlvbiBhbHBoYSB0byBhbGxvdyBmb3IgbXVsbG8gYW5kIG11bGhpIG9uIGRpZmYgY2hhbm5lbHMKLQkJICAgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyAqLwotCQltbV9hbHBoYSA9IF9tbV9zbGxpX3NpNjQobW1fYWxwaGEsIDMpOwotCSAgCi0JCS8qIFNldHVwIHRoZSA1NjUgY29sb3IgY2hhbm5lbCBtYXNrcyAqLwotCQlnbWFzayA9IF9tbV9zZXRfcGkzMigweDA3RTAwN0UwLCAweDA3RTAwN0UwKTsgLyogTUFTS0dSRUVOIC0+IGdtYXNrICovCi0JCWJtYXNrID0gX21tX3NldF9waTMyKDB4MDAxRjAwMUYsIDB4MDAxRjAwMUYpOyAvKiBNQVNLQkxVRSAtPiBibWFzayAqLwotCQkKLQkJd2hpbGUoaGVpZ2h0LS0pIHsKLQkJCURVRkZTX0xPT1BfUVVBVFJPMigKLQkJCXsKLQkJCQlzID0gKnNyY3ArKzsKLQkJCQlkID0gKmRzdHA7Ci0JCQkJLyoKLQkJCQkgKiBzaGlmdCBvdXQgdGhlIG1pZGRsZSBjb21wb25lbnQgKGdyZWVuKSB0bwotCQkJCSAqIHRoZSBoaWdoIDE2IGJpdHMsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKLQkJCQkgKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCi0JCQkJICovCi0JCQkJcyA9IChzIHwgcyA8PCAxNikgJiAweDA3ZTBmODFmOwotCQkJCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsKLQkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OwotCQkJCWQgJj0gMHgwN2UwZjgxZjsKLQkJCQkqZHN0cCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOwotCQkJfSx7Ci0JCQkJcyA9ICpzcmNwKys7Ci0JCQkJZCA9ICpkc3RwOwotCQkJCS8qCi0JCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KLQkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCi0JCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgotCQkJCSAqLwotCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsKLQkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7Ci0JCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKLQkJCQlkICY9IDB4MDdlMGY4MWY7Ci0JCQkJKmRzdHArKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKLQkJCQlzID0gKnNyY3ArKzsKLQkJCQlkID0gKmRzdHA7Ci0JCQkJLyoKLQkJCQkgKiBzaGlmdCBvdXQgdGhlIG1pZGRsZSBjb21wb25lbnQgKGdyZWVuKSB0bwotCQkJCSAqIHRoZSBoaWdoIDE2IGJpdHMsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKLQkJCQkgKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCi0JCQkJICovCi0JCQkJcyA9IChzIHwgcyA8PCAxNikgJiAweDA3ZTBmODFmOwotCQkJCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsKLQkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OwotCQkJCWQgJj0gMHgwN2UwZjgxZjsKLQkJCQkqZHN0cCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOwotCQkJfSx7Ci0JCQkJc3JjMSA9ICooX19tNjQqKXNyY3A7IC8qIDQgc3JjIHBpeGVscyAtPiBzcmMxICovCi0JCQkJZHN0MSA9ICooX19tNjQqKWRzdHA7IC8qIDQgZHN0IHBpeGVscyAtPiBkc3QxICovCi0KLQkJCQkvKiByZWQgKi8KLQkJCQlzcmMyID0gc3JjMTsKLQkJCQlzcmMyID0gX21tX3NybGlfcGkxNihzcmMyLCAxMSk7IC8qIHNyYzIgPj4gMTEgLT4gc3JjMiBbMDAwciAwMDByIDAwMHIgMDAwcl0gKi8KLQotCQkJCWRzdDIgPSBkc3QxOwotCQkJCWRzdDIgPSBfbW1fc3JsaV9waTE2KGRzdDIsIDExKTsgLyogZHN0MiA+PiAxMSAtPiBkc3QyIFswMDByIDAwMHIgMDAwciAwMDByXSAqLwotCi0JCQkJLyogYmxlbmQgKi8KLQkJCQlzcmMyID0gX21tX3N1Yl9waTE2KHNyYzIsIGRzdDIpOy8qIHNyYyAtIGRzdCAtPiBzcmMyICovCi0JCQkJc3JjMiA9IF9tbV9tdWxsb19waTE2KHNyYzIsIG1tX2FscGhhKTsgLyogc3JjMiAqIGFscGhhIC0+IHNyYzIgKi8KLQkJCQlzcmMyID0gX21tX3NybGlfcGkxNihzcmMyLCAxMSk7IC8qIHNyYzIgPj4gMTEgLT4gc3JjMiAqLwotCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KLQkJCQlkc3QyID0gX21tX3NsbGlfcGkxNihkc3QyLCAxMSk7IC8qIGRzdDIgPDwgMTEgLT4gZHN0MiAqLwotCi0JCQkJbW1fcmVzID0gZHN0MjsgLyogUkVEIC0+IG1tX3JlcyAqLwotCi0JCQkJLyogZ3JlZW4gLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLwotCQkJCXNyYzIgPSBzcmMxOwotCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgZ21hc2spOyAvKiBzcmMgJiBNQVNLR1JFRU4gLT4gc3JjMiAqLwotCi0JCQkJZHN0MiA9IGRzdDE7Ci0JCQkJZHN0MiA9IF9tbV9hbmRfc2k2NChkc3QyLCBnbWFzayk7IC8qIGRzdCAmIE1BU0tHUkVFTiAtPiBkc3QyICovCi0KLQkJCQkvKiBibGVuZCAqLwotCQkJCXNyYzIgPSBfbW1fc3ViX3BpMTYoc3JjMiwgZHN0Mik7Lyogc3JjIC0gZHN0IC0+IHNyYzIgKi8KLQkJCQlzcmMyID0gX21tX211bGhpX3BpMTYoc3JjMiwgbW1fYWxwaGEpOyAvKiBzcmMyICogYWxwaGEgLT4gc3JjMiAqLwotCQkJCXNyYzIgPSBfbW1fc2xsaV9waTE2KHNyYzIsIDUpOyAvKiBzcmMyIDw8IDUgLT4gc3JjMiAqLwotCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KLQotCQkJCW1tX3JlcyA9IF9tbV9vcl9zaTY0KG1tX3JlcywgZHN0Mik7IC8qIFJFRCB8IEdSRUVOIC0+IG1tX3JlcyAqLwotCi0JCQkJLyogYmx1ZSAqLwotCQkJCXNyYzIgPSBzcmMxOwotCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgYm1hc2spOyAvKiBzcmMgJiBNQVNLQkxVRSAtPiBzcmMyWzAwMGIgMDAwYiAwMDBiIDAwMGJdICovCi0KLQkJCQlkc3QyID0gZHN0MTsKLQkJCQlkc3QyID0gX21tX2FuZF9zaTY0KGRzdDIsIGJtYXNrKTsgLyogZHN0ICYgTUFTS0JMVUUgLT4gZHN0MlswMDBiIDAwMGIgMDAwYiAwMDBiXSAqLwotCi0JCQkJLyogYmxlbmQgKi8KLQkJCQlzcmMyID0gX21tX3N1Yl9waTE2KHNyYzIsIGRzdDIpOy8qIHNyYyAtIGRzdCAtPiBzcmMyICovCi0JCQkJc3JjMiA9IF9tbV9tdWxsb19waTE2KHNyYzIsIG1tX2FscGhhKTsgLyogc3JjMiAqIGFscGhhIC0+IHNyYzIgKi8KLQkJCQlzcmMyID0gX21tX3NybGlfcGkxNihzcmMyLCAxMSk7IC8qIHNyYzIgPj4gMTEgLT4gc3JjMiAqLwotCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KLQkJCQlkc3QyID0gX21tX2FuZF9zaTY0KGRzdDIsIGJtYXNrKTsgLyogZHN0MiAmIE1BU0tCTFVFIC0+IGRzdDIgKi8KLQotCQkJCW1tX3JlcyA9IF9tbV9vcl9zaTY0KG1tX3JlcywgZHN0Mik7IC8qIFJFRCB8IEdSRUVOIHwgQkxVRSAtPiBtbV9yZXMgKi8KLQotCQkJCSooX19tNjQqKWRzdHAgPSBtbV9yZXM7IC8qIG1tX3JlcyAtPiA0IGRzdCBwaXhlbHMgKi8KLQotCQkJCXNyY3AgKz0gNDsKLQkJCQlkc3RwICs9IDQ7Ci0JCQl9LCB3aWR0aCk7CQkJCi0JCQlzcmNwICs9IHNyY3NraXA7Ci0JCQlkc3RwICs9IGRzdHNraXA7Ci0JCX0KLQkJX21tX2VtcHR5KCk7Ci0JfQotfQotCi0vKiBmYXN0IFJHQjU1NS0+UkdCNTU1IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYSAqLwotc3RhdGljIHZvaWQgQmxpdDU1NXRvNTU1U3VyZmFjZUFscGhhTU1YKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQl1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7Ci0JaWYoYWxwaGEgPT0gMTI4KSB7Ci0JCUJsaXQxNnRvMTZTdXJmYWNlQWxwaGExMjgoaW5mbywgMHhmYmRlKTsKLQl9IGVsc2UgewotCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKilpbmZvLT5zX3BpeGVsczsKLQkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMTsKLQkJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOwotCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOwotCQlVaW50MzIgcywgZDsKLQkgIAotCQlfX202NCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBybWFzaywgZ21hc2ssIGJtYXNrLCBtbV9yZXMsIG1tX2FscGhhOwotCi0JCWFscGhhICY9IH4oMSsyKzQpOwkJLyogY3V0IGFscGhhIHRvIGdldCB0aGUgZXhhY3Qgc2FtZSBiZWhhdmlvdXIgKi8KLQkJbW1fYWxwaGEgPSBfbW1fc2V0X3BpMzIoMCwgYWxwaGEpOyAvKiAwMDAwMDAwQSAtPiBtbV9hbHBoYSAqLwotCQlhbHBoYSA+Pj0gMzsJCS8qIGRvd25zY2FsZSBhbHBoYSB0byA1IGJpdHMgKi8KLQotCQltbV9hbHBoYSA9IF9tbV91bnBhY2tsb19waTE2KG1tX2FscGhhLCBtbV9hbHBoYSk7IC8qIDAwMDAwQTBBIC0+IG1tX2FscGhhICovCi0JCW1tX2FscGhhID0gX21tX3VucGFja2xvX3BpMzIobW1fYWxwaGEsIG1tX2FscGhhKTsgLyogMEEwQTBBMEEgLT4gbW1fYWxwaGEgKi8KLQkJLyogcG9zaXRpb24gYWxwaGEgdG8gYWxsb3cgZm9yIG11bGxvIGFuZCBtdWxoaSBvbiBkaWZmIGNoYW5uZWxzCi0JCSAgIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgKi8KLQkJbW1fYWxwaGEgPSBfbW1fc2xsaV9zaTY0KG1tX2FscGhhLCAzKTsKLQkgIAotCQkvKiBTZXR1cCB0aGUgNTU1IGNvbG9yIGNoYW5uZWwgbWFza3MgKi8KLQkJcm1hc2sgPSBfbW1fc2V0X3BpMzIoMHg3QzAwN0MwMCwgMHg3QzAwN0MwMCk7IC8qIE1BU0tSRUQgLT4gcm1hc2sgKi8KLQkJZ21hc2sgPSBfbW1fc2V0X3BpMzIoMHgwM0UwMDNFMCwgMHgwM0UwMDNFMCk7IC8qIE1BU0tHUkVFTiAtPiBnbWFzayAqLwotCQlibWFzayA9IF9tbV9zZXRfcGkzMigweDAwMUYwMDFGLCAweDAwMUYwMDFGKTsgLyogTUFTS0JMVUUgLT4gYm1hc2sgKi8KLQotCQl3aGlsZShoZWlnaHQtLSkgewotCQkJRFVGRlNfTE9PUF9RVUFUUk8yKAotCQkJewotCQkJCXMgPSAqc3JjcCsrOwotCQkJCWQgPSAqZHN0cDsKLQkJCQkvKgotCQkJCSAqIHNoaWZ0IG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pIHRvCi0JCQkJICogdGhlIGhpZ2ggMTYgYml0cywgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgotCQkJCSAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KLQkJCQkgKi8KLQkJCQlzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDNlMDdjMWY7Ci0JCQkJZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOwotCQkJCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7Ci0JCQkJZCAmPSAweDAzZTA3YzFmOwotCQkJCSpkc3RwKysgPSAoVWludDE2KShkIHwgZCA+PiAxNik7Ci0JCQl9LHsKLQkJCQlzID0gKnNyY3ArKzsKLQkJCQlkID0gKmRzdHA7Ci0JCQkJLyoKLQkJCQkgKiBzaGlmdCBvdXQgdGhlIG1pZGRsZSBjb21wb25lbnQgKGdyZWVuKSB0bwotCQkJCSAqIHRoZSBoaWdoIDE2IGJpdHMsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKLQkJCQkgKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCi0JCQkJICovCi0JCQkJcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOwotCQkJCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsKLQkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OwotCQkJCWQgJj0gMHgwM2UwN2MxZjsKLQkJCQkqZHN0cCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOwotCQkJICAgICAgICBzID0gKnNyY3ArKzsKLQkJCQlkID0gKmRzdHA7Ci0JCQkJLyoKLQkJCQkgKiBzaGlmdCBvdXQgdGhlIG1pZGRsZSBjb21wb25lbnQgKGdyZWVuKSB0bwotCQkJCSAqIHRoZSBoaWdoIDE2IGJpdHMsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKLQkJCQkgKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCi0JCQkJICovCi0JCQkJcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOwotCQkJCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsKLQkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OwotCQkJCWQgJj0gMHgwM2UwN2MxZjsKLQkJCQkqZHN0cCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOwotCQkJfSx7Ci0JCQkJc3JjMSA9ICooX19tNjQqKXNyY3A7IC8qIDQgc3JjIHBpeGVscyAtPiBzcmMxICovCi0JCQkJZHN0MSA9ICooX19tNjQqKWRzdHA7IC8qIDQgZHN0IHBpeGVscyAtPiBkc3QxICovCi0KLQkJCQkvKiByZWQgLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLwotCQkJCXNyYzIgPSBzcmMxOwotCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgcm1hc2spOyAvKiBzcmMgJiBNQVNLUkVEIC0+IHNyYzIgKi8KLQotCQkJCWRzdDIgPSBkc3QxOwotCQkJCWRzdDIgPSBfbW1fYW5kX3NpNjQoZHN0Miwgcm1hc2spOyAvKiBkc3QgJiBNQVNLUkVEIC0+IGRzdDIgKi8KLQotCQkJCS8qIGJsZW5kICovCi0JCQkJc3JjMiA9IF9tbV9zdWJfcGkxNihzcmMyLCBkc3QyKTsvKiBzcmMgLSBkc3QgLT4gc3JjMiAqLwotCQkJCXNyYzIgPSBfbW1fbXVsaGlfcGkxNihzcmMyLCBtbV9hbHBoYSk7IC8qIHNyYzIgKiBhbHBoYSAtPiBzcmMyICovCi0JCQkJc3JjMiA9IF9tbV9zbGxpX3BpMTYoc3JjMiwgNSk7IC8qIHNyYzIgPDwgNSAtPiBzcmMyICovCi0JCQkJZHN0MiA9IF9tbV9hZGRfcGkxNihzcmMyLCBkc3QyKTsgLyogc3JjMiArIGRzdDIgLT4gZHN0MiAqLwotCQkJCWRzdDIgPSBfbW1fYW5kX3NpNjQoZHN0Miwgcm1hc2spOyAvKiBkc3QyICYgTUFTS1JFRCAtPiBkc3QyICovCi0KLQkJCQltbV9yZXMgPSBkc3QyOyAvKiBSRUQgLT4gbW1fcmVzICovCi0JCQkJCi0JCQkJLyogZ3JlZW4gLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLwotCQkJCXNyYzIgPSBzcmMxOwotCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgZ21hc2spOyAvKiBzcmMgJiBNQVNLR1JFRU4gLT4gc3JjMiAqLwotCi0JCQkJZHN0MiA9IGRzdDE7Ci0JCQkJZHN0MiA9IF9tbV9hbmRfc2k2NChkc3QyLCBnbWFzayk7IC8qIGRzdCAmIE1BU0tHUkVFTiAtPiBkc3QyICovCi0KLQkJCQkvKiBibGVuZCAqLwotCQkJCXNyYzIgPSBfbW1fc3ViX3BpMTYoc3JjMiwgZHN0Mik7Lyogc3JjIC0gZHN0IC0+IHNyYzIgKi8KLQkJCQlzcmMyID0gX21tX211bGhpX3BpMTYoc3JjMiwgbW1fYWxwaGEpOyAvKiBzcmMyICogYWxwaGEgLT4gc3JjMiAqLwotCQkJCXNyYzIgPSBfbW1fc2xsaV9waTE2KHNyYzIsIDUpOyAvKiBzcmMyIDw8IDUgLT4gc3JjMiAqLwotCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KLQotCQkJCW1tX3JlcyA9IF9tbV9vcl9zaTY0KG1tX3JlcywgZHN0Mik7IC8qIFJFRCB8IEdSRUVOIC0+IG1tX3JlcyAqLwotCi0JCQkJLyogYmx1ZSAqLwotCQkJCXNyYzIgPSBzcmMxOyAvKiBzcmMgLT4gc3JjMiAqLwotCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgYm1hc2spOyAvKiBzcmMgJiBNQVNLQkxVRSAtPiBzcmMyWzAwMGIgMDAwYiAwMDBiIDAwMGJdICovCi0KLQkJCQlkc3QyID0gZHN0MTsgLyogZHN0IC0+IGRzdDIgKi8KLQkJCQlkc3QyID0gX21tX2FuZF9zaTY0KGRzdDIsIGJtYXNrKTsgLyogZHN0ICYgTUFTS0JMVUUgLT4gZHN0MlswMDBiIDAwMGIgMDAwYiAwMDBiXSAqLwotCi0JCQkJLyogYmxlbmQgKi8KLQkJCQlzcmMyID0gX21tX3N1Yl9waTE2KHNyYzIsIGRzdDIpOy8qIHNyYyAtIGRzdCAtPiBzcmMyICovCi0JCQkJc3JjMiA9IF9tbV9tdWxsb19waTE2KHNyYzIsIG1tX2FscGhhKTsgLyogc3JjMiAqIGFscGhhIC0+IHNyYzIgKi8KLQkJCQlzcmMyID0gX21tX3NybGlfcGkxNihzcmMyLCAxMSk7IC8qIHNyYzIgPj4gMTEgLT4gc3JjMiAqLwotCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KLQkJCQlkc3QyID0gX21tX2FuZF9zaTY0KGRzdDIsIGJtYXNrKTsgLyogZHN0MiAmIE1BU0tCTFVFIC0+IGRzdDIgKi8KLQotCQkJCW1tX3JlcyA9IF9tbV9vcl9zaTY0KG1tX3JlcywgZHN0Mik7IC8qIFJFRCB8IEdSRUVOIHwgQkxVRSAtPiBtbV9yZXMgKi8KLQotCQkJCSooX19tNjQqKWRzdHAgPSBtbV9yZXM7IC8qIG1tX3JlcyAtPiA0IGRzdCBwaXhlbHMgKi8KLQotCQkJCXNyY3AgKz0gNDsKLQkJCQlkc3RwICs9IDQ7Ci0JCQl9LCB3aWR0aCk7CQkJCi0JCQlzcmNwICs9IHNyY3NraXA7Ci0JCQlkc3RwICs9IGRzdHNraXA7Ci0JCX0KLQkJX21tX2VtcHR5KCk7Ci0JfQotfQotI2VuZGlmIC8qIEdDQ19BU01CTElULCBNU1ZDX0FTTUJMSVQgKi8KLQotLyogZmFzdCBSR0I1NjUtPlJHQjU2NSBibGVuZGluZyB3aXRoIHN1cmZhY2UgYWxwaGEgKi8KLXN0YXRpYyB2b2lkIEJsaXQ1NjV0bzU2NVN1cmZhY2VBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JdW5zaWduZWQgYWxwaGEgPSBpbmZvLT5zcmMtPmFscGhhOwotCWlmKGFscGhhID09IDEyOCkgewotCQlCbGl0MTZ0bzE2U3VyZmFjZUFscGhhMTI4KGluZm8sIDB4ZjdkZSk7Ci0JfSBlbHNlIHsKLQkJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQkJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCQlVaW50MTYgKnNyY3AgPSAoVWludDE2ICopaW5mby0+c19waXhlbHM7Ci0JCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDE7Ci0JCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKLQkJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMTsKLQkJYWxwaGEgPj49IDM7CS8qIGRvd25zY2FsZSBhbHBoYSB0byA1IGJpdHMgKi8KLQotCQl3aGlsZShoZWlnaHQtLSkgewotCQkJRFVGRlNfTE9PUDQoewotCQkJCVVpbnQzMiBzID0gKnNyY3ArKzsKLQkJCQlVaW50MzIgZCA9ICpkc3RwOwotCQkJCS8qCi0JCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KLQkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCi0JCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgotCQkJCSAqLwotCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsKLQkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7Ci0JCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKLQkJCQlkICY9IDB4MDdlMGY4MWY7Ci0JCQkJKmRzdHArKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKLQkJCX0sIHdpZHRoKTsKLQkJCXNyY3AgKz0gc3Jjc2tpcDsKLQkJCWRzdHAgKz0gZHN0c2tpcDsKLQkJfQotCX0KLX0KLQotLyogZmFzdCBSR0I1NTUtPlJHQjU1NSBibGVuZGluZyB3aXRoIHN1cmZhY2UgYWxwaGEgKi8KLXN0YXRpYyB2b2lkIEJsaXQ1NTV0bzU1NVN1cmZhY2VBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JdW5zaWduZWQgYWxwaGEgPSBpbmZvLT5zcmMtPmFscGhhOyAvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCi0JaWYoYWxwaGEgPT0gMTI4KSB7Ci0JCUJsaXQxNnRvMTZTdXJmYWNlQWxwaGExMjgoaW5mbywgMHhmYmRlKTsKLQl9IGVsc2UgewotCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKilpbmZvLT5zX3BpeGVsczsKLQkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMTsKLQkJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOwotCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOwotCQlhbHBoYSA+Pj0gMzsJCS8qIGRvd25zY2FsZSBhbHBoYSB0byA1IGJpdHMgKi8KLQotCQl3aGlsZShoZWlnaHQtLSkgewotCQkJRFVGRlNfTE9PUDQoewotCQkJCVVpbnQzMiBzID0gKnNyY3ArKzsKLQkJCQlVaW50MzIgZCA9ICpkc3RwOwotCQkJCS8qCi0JCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KLQkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCi0JCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgotCQkJCSAqLwotCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsKLQkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7Ci0JCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKLQkJCQlkICY9IDB4MDNlMDdjMWY7Ci0JCQkJKmRzdHArKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKLQkJCX0sIHdpZHRoKTsKLQkJCXNyY3AgKz0gc3Jjc2tpcDsKLQkJCWRzdHAgKz0gZHN0c2tpcDsKLQkJfQotCX0KLX0KLQotLyogZmFzdCBBUkdCODg4OC0+UkdCNTY1IGJsZW5kaW5nIHdpdGggcGl4ZWwgYWxwaGEgKi8KLXN0YXRpYyB2b2lkIEJsaXRBUkdCdG81NjVQaXhlbEFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKLQlVaW50MTYgKmRzdHAgPSAoVWludDE2ICopaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMTsKLQotCXdoaWxlKGhlaWdodC0tKSB7Ci0JICAgIERVRkZTX0xPT1A0KHsKLQkJVWludDMyIHMgPSAqc3JjcDsKLQkJdW5zaWduZWQgYWxwaGEgPSBzID4+IDI3OyAvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCi0JCS8qIEZJWE1FOiBIZXJlIHdlIHNwZWNpYWwtY2FzZSBvcGFxdWUgYWxwaGEgc2luY2UgdGhlCi0JCSAgIGNvbXBvc2l0aW9uaW5nIHVzZWQgKD4+OCBpbnN0ZWFkIG9mIC8yNTUpIGRvZXNuJ3QgaGFuZGxlCi0JCSAgIGl0IGNvcnJlY3RseS4gQWxzbyBzcGVjaWFsLWNhc2UgYWxwaGE9MCBmb3Igc3BlZWQ/Ci0JCSAgIEJlbmNobWFyayB0aGlzISAqLwotCQlpZihhbHBoYSkgeyAgIAotCQkgIGlmKGFscGhhID09IChTRExfQUxQSEFfT1BBUVVFID4+IDMpKSB7Ci0JCSAgICAqZHN0cCA9IChVaW50MTYpKChzID4+IDggJiAweGY4MDApICsgKHMgPj4gNSAmIDB4N2UwKSArIChzID4+IDMgICYgMHgxZikpOwotCQkgIH0gZWxzZSB7Ci0JCSAgICBVaW50MzIgZCA9ICpkc3RwOwotCQkgICAgLyoKLQkJICAgICAqIGNvbnZlcnQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0byBHMFJBQjY1NTY1Ci0JCSAgICAgKiBhbmQgYmxlbmQgYWxsIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZQotCQkgICAgICovCi0JCSAgICBzID0gKChzICYgMHhmYzAwKSA8PCAxMSkgKyAocyA+PiA4ICYgMHhmODAwKQotCQkgICAgICArIChzID4+IDMgJiAweDFmKTsKLQkJICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsKLQkJICAgIGQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7Ci0JCSAgICBkICY9IDB4MDdlMGY4MWY7Ci0JCSAgICAqZHN0cCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKLQkJICB9Ci0JCX0KLQkJc3JjcCsrOwotCQlkc3RwKys7Ci0JICAgIH0sIHdpZHRoKTsKLQkgICAgc3JjcCArPSBzcmNza2lwOwotCSAgICBkc3RwICs9IGRzdHNraXA7Ci0JfQotfQotCi0vKiBmYXN0IEFSR0I4ODg4LT5SR0I1NTUgYmxlbmRpbmcgd2l0aCBwaXhlbCBhbHBoYSAqLwotc3RhdGljIHZvaWQgQmxpdEFSR0J0bzU1NVBpeGVsQWxwaGEoU0RMX0JsaXRJbmZvICppbmZvKQotewotCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOwotCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOwotCi0Jd2hpbGUoaGVpZ2h0LS0pIHsKLQkgICAgRFVGRlNfTE9PUDQoewotCQl1bnNpZ25lZCBhbHBoYTsKLQkJVWludDMyIHMgPSAqc3JjcDsKLQkJYWxwaGEgPSBzID4+IDI3OyAvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCi0JCS8qIEZJWE1FOiBIZXJlIHdlIHNwZWNpYWwtY2FzZSBvcGFxdWUgYWxwaGEgc2luY2UgdGhlCi0JCSAgIGNvbXBvc2l0aW9uaW5nIHVzZWQgKD4+OCBpbnN0ZWFkIG9mIC8yNTUpIGRvZXNuJ3QgaGFuZGxlCi0JCSAgIGl0IGNvcnJlY3RseS4gQWxzbyBzcGVjaWFsLWNhc2UgYWxwaGE9MCBmb3Igc3BlZWQ/Ci0JCSAgIEJlbmNobWFyayB0aGlzISAqLwotCQlpZihhbHBoYSkgeyAgIAotCQkgIGlmKGFscGhhID09IChTRExfQUxQSEFfT1BBUVVFID4+IDMpKSB7Ci0JCSAgICAqZHN0cCA9IChVaW50MTYpKChzID4+IDkgJiAweDdjMDApICsgKHMgPj4gNiAmIDB4M2UwKSArIChzID4+IDMgICYgMHgxZikpOwotCQkgIH0gZWxzZSB7Ci0JCSAgICBVaW50MzIgZCA9ICpkc3RwOwotCQkgICAgLyoKLQkJICAgICAqIGNvbnZlcnQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0byBHMFJBQjY1NTY1Ci0JCSAgICAgKiBhbmQgYmxlbmQgYWxsIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZQotCQkgICAgICovCi0JCSAgICBzID0gKChzICYgMHhmODAwKSA8PCAxMCkgKyAocyA+PiA5ICYgMHg3YzAwKQotCQkgICAgICArIChzID4+IDMgJiAweDFmKTsKLQkJICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsKLQkJICAgIGQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7Ci0JCSAgICBkICY9IDB4MDNlMDdjMWY7Ci0JCSAgICAqZHN0cCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKLQkJICB9Ci0JCX0KLQkJc3JjcCsrOwotCQlkc3RwKys7Ci0JICAgIH0sIHdpZHRoKTsKLQkgICAgc3JjcCArPSBzcmNza2lwOwotCSAgICBkc3RwICs9IGRzdHNraXA7Ci0JfQotfQotCi0vKiBHZW5lcmFsIChzbG93KSBOLT5OIGJsZW5kaW5nIHdpdGggcGVyLXN1cmZhY2UgYWxwaGEgKi8KLXN0YXRpYyB2b2lkIEJsaXROdG9OU3VyZmFjZUFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCVNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOwotCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OwotCWludCBzcmNicHAgPSBzcmNmbXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JaW50IGRzdGJwcCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQl1bnNpZ25lZCBzQSA9IHNyY2ZtdC0+YWxwaGE7Ci0JdW5zaWduZWQgZEEgPSBkc3RmbXQtPkFtYXNrID8gU0RMX0FMUEhBX09QQVFVRSA6IDA7Ci0KLQlpZihzQSkgewotCSAgd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkgICAgRFVGRlNfTE9PUDQoCi0JICAgIHsKLQkJVWludDMyIFBpeGVsOwotCQl1bnNpZ25lZCBzUjsKLQkJdW5zaWduZWQgc0c7Ci0JCXVuc2lnbmVkIHNCOwotCQl1bnNpZ25lZCBkUjsKLQkJdW5zaWduZWQgZEc7Ci0JCXVuc2lnbmVkIGRCOwotCQlESVNFTUJMRV9SR0Ioc3JjLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsIHNSLCBzRywgc0IpOwotCQlESVNFTUJMRV9SR0IoZHN0LCBkc3RicHAsIGRzdGZtdCwgUGl4ZWwsIGRSLCBkRywgZEIpOwotCQlBTFBIQV9CTEVORChzUiwgc0csIHNCLCBzQSwgZFIsIGRHLCBkQik7Ci0JCUFTU0VNQkxFX1JHQkEoZHN0LCBkc3RicHAsIGRzdGZtdCwgZFIsIGRHLCBkQiwgZEEpOwotCQlzcmMgKz0gc3JjYnBwOwotCQlkc3QgKz0gZHN0YnBwOwotCSAgICB9LAotCSAgICB3aWR0aCk7Ci0JICAgIHNyYyArPSBzcmNza2lwOwotCSAgICBkc3QgKz0gZHN0c2tpcDsKLQkgIH0KLQl9Ci19Ci0KLS8qIEdlbmVyYWwgKHNsb3cpIGNvbG9ya2V5ZWQgTi0+TiBibGVuZGluZyB3aXRoIHBlci1zdXJmYWNlIGFscGhhICovCi1zdGF0aWMgdm9pZCBCbGl0TnRvTlN1cmZhY2VBbHBoYUtleShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLQlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKLQlVaW50MzIgY2tleSA9IHNyY2ZtdC0+Y29sb3JrZXk7Ci0JaW50IHNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQlpbnQgZHN0YnBwID0gZHN0Zm10LT5CeXRlc1BlclBpeGVsOwotCXVuc2lnbmVkIHNBID0gc3JjZm10LT5hbHBoYTsKLQl1bnNpZ25lZCBkQSA9IGRzdGZtdC0+QW1hc2sgPyBTRExfQUxQSEFfT1BBUVVFIDogMDsKLQotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JICAgIERVRkZTX0xPT1A0KAotCSAgICB7Ci0JCVVpbnQzMiBQaXhlbDsKLQkJdW5zaWduZWQgc1I7Ci0JCXVuc2lnbmVkIHNHOwotCQl1bnNpZ25lZCBzQjsKLQkJdW5zaWduZWQgZFI7Ci0JCXVuc2lnbmVkIGRHOwotCQl1bnNpZ25lZCBkQjsKLQkJUkVUUklFVkVfUkdCX1BJWEVMKHNyYywgc3JjYnBwLCBQaXhlbCk7Ci0JCWlmKHNBICYmIFBpeGVsICE9IGNrZXkpIHsKLQkJICAgIFJHQl9GUk9NX1BJWEVMKFBpeGVsLCBzcmNmbXQsIHNSLCBzRywgc0IpOwotCQkgICAgRElTRU1CTEVfUkdCKGRzdCwgZHN0YnBwLCBkc3RmbXQsIFBpeGVsLCBkUiwgZEcsIGRCKTsKLQkJICAgIEFMUEhBX0JMRU5EKHNSLCBzRywgc0IsIHNBLCBkUiwgZEcsIGRCKTsKLQkJICAgIEFTU0VNQkxFX1JHQkEoZHN0LCBkc3RicHAsIGRzdGZtdCwgZFIsIGRHLCBkQiwgZEEpOwotCQl9Ci0JCXNyYyArPSBzcmNicHA7Ci0JCWRzdCArPSBkc3RicHA7Ci0JICAgIH0sCi0JICAgIHdpZHRoKTsKLQkgICAgc3JjICs9IHNyY3NraXA7Ci0JICAgIGRzdCArPSBkc3Rza2lwOwotCX0KLX0KLQotLyogR2VuZXJhbCAoc2xvdykgTi0+TiBibGVuZGluZyB3aXRoIHBpeGVsIGFscGhhICovCi1zdGF0aWMgdm9pZCBCbGl0TnRvTlBpeGVsQWxwaGEoU0RMX0JsaXRJbmZvICppbmZvKQotewotCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7Ci0JU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7Ci0JU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7Ci0KLQlpbnQgIHNyY2JwcDsKLQlpbnQgIGRzdGJwcDsKLQotCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLwotCXNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQlkc3RicHAgPSBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWw7Ci0KLQkvKiBGSVhNRTogZm9yIDhicHAgc291cmNlIGFscGhhLCB0aGlzIGRvZXNuJ3QgZ2V0IG9wYXF1ZSB2YWx1ZXMKLQkgICBxdWl0ZSByaWdodC4gZm9yIDw4YnBwIHNvdXJjZSBhbHBoYSwgaXQgZ2V0cyB0aGVtIHZlcnkgd3JvbmcKLQkgICAoY2hlY2sgYWxsIG1hY3JvcyEpCi0JICAgSXQgaXMgdW5jbGVhciB3aGV0aGVyIHRoZXJlIGlzIGEgZ29vZCBnZW5lcmFsIHNvbHV0aW9uIHRoYXQgZG9lc24ndAotCSAgIG5lZWQgYSBicmFuY2ggKG9yIGEgZGl2aWRlKS4gKi8KLQl3aGlsZSAoIGhlaWdodC0tICkgewotCSAgICBEVUZGU19MT09QNCgKLQkgICAgewotCQlVaW50MzIgUGl4ZWw7Ci0JCXVuc2lnbmVkIHNSOwotCQl1bnNpZ25lZCBzRzsKLQkJdW5zaWduZWQgc0I7Ci0JCXVuc2lnbmVkIGRSOwotCQl1bnNpZ25lZCBkRzsKLQkJdW5zaWduZWQgZEI7Ci0JCXVuc2lnbmVkIHNBOwotCQl1bnNpZ25lZCBkQTsKLQkJRElTRU1CTEVfUkdCQShzcmMsIHNyY2JwcCwgc3JjZm10LCBQaXhlbCwgc1IsIHNHLCBzQiwgc0EpOwotCQlpZihzQSkgewotCQkgIERJU0VNQkxFX1JHQkEoZHN0LCBkc3RicHAsIGRzdGZtdCwgUGl4ZWwsIGRSLCBkRywgZEIsIGRBKTsKLQkJICBBTFBIQV9CTEVORChzUiwgc0csIHNCLCBzQSwgZFIsIGRHLCBkQik7Ci0JCSAgQVNTRU1CTEVfUkdCQShkc3QsIGRzdGJwcCwgZHN0Zm10LCBkUiwgZEcsIGRCLCBkQSk7Ci0JCX0KLQkJc3JjICs9IHNyY2JwcDsKLQkJZHN0ICs9IGRzdGJwcDsKLQkgICAgfSwKLQkgICAgd2lkdGgpOwotCSAgICBzcmMgKz0gc3Jjc2tpcDsKLQkgICAgZHN0ICs9IGRzdHNraXA7Ci0JfQotfQotCi0KLVNETF9sb2JsaXQgU0RMX0NhbGN1bGF0ZUFscGhhQmxpdChTRExfU3VyZmFjZSAqc3VyZmFjZSwgaW50IGJsaXRfaW5kZXgpCi17Ci0gICAgU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKLSAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gc3VyZmFjZS0+bWFwLT5kc3QtPmZvcm1hdDsKLQotICAgIGlmKHNmLT5BbWFzayA9PSAwKSB7Ci0JaWYoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkpIHsKLQkgICAgaWYoZGYtPkJ5dGVzUGVyUGl4ZWwgPT0gMSkKLQkJcmV0dXJuIEJsaXROdG8xU3VyZmFjZUFscGhhS2V5OwotCSAgICBlbHNlCi0jaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMKLQlpZiAoc2YtPkJ5dGVzUGVyUGl4ZWwgPT0gNCAmJiBkZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0ICYmCi0JICAgICEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgJiYgU0RMX0hhc0FsdGlWZWMoKSkKLSAgICAgICAgICAgIHJldHVybiBCbGl0MzJ0bzMyU3VyZmFjZUFscGhhS2V5QWx0aXZlYzsKLSAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICByZXR1cm4gQmxpdE50b05TdXJmYWNlQWxwaGFLZXk7Ci0JfSBlbHNlIHsKLQkgICAgLyogUGVyLXN1cmZhY2UgYWxwaGEgYmxpdHMgKi8KLQkgICAgc3dpdGNoKGRmLT5CeXRlc1BlclBpeGVsKSB7Ci0JICAgIGNhc2UgMToKLQkJcmV0dXJuIEJsaXROdG8xU3VyZmFjZUFscGhhOwotCi0JICAgIGNhc2UgMjoKLQkJaWYoc3VyZmFjZS0+bWFwLT5pZGVudGl0eSkgewotCQkgICAgaWYoZGYtPkdtYXNrID09IDB4N2UwKQotCQkgICAgewotI2lmIE1NWF9BU01CTElUCi0JCWlmKFNETF9IYXNNTVgoKSkKLQkJCXJldHVybiBCbGl0NTY1dG81NjVTdXJmYWNlQWxwaGFNTVg7Ci0JCWVsc2UKLSNlbmRpZgotCQkJcmV0dXJuIEJsaXQ1NjV0bzU2NVN1cmZhY2VBbHBoYTsKLQkJICAgIH0KLQkJICAgIGVsc2UgaWYoZGYtPkdtYXNrID09IDB4M2UwKQotCQkgICAgewotI2lmIE1NWF9BU01CTElUCi0JCWlmKFNETF9IYXNNTVgoKSkKLQkJCXJldHVybiBCbGl0NTU1dG81NTVTdXJmYWNlQWxwaGFNTVg7Ci0JCWVsc2UKLSNlbmRpZgotCQkJcmV0dXJuIEJsaXQ1NTV0bzU1NVN1cmZhY2VBbHBoYTsKLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gQmxpdE50b05TdXJmYWNlQWxwaGE7Ci0KLQkgICAgY2FzZSA0OgotCQlpZihzZi0+Um1hc2sgPT0gZGYtPlJtYXNrCi0JCSAgICYmIHNmLT5HbWFzayA9PSBkZi0+R21hc2sKLQkJICAgJiYgc2YtPkJtYXNrID09IGRmLT5CbWFzawotCQkgICAmJiBzZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0KQotCQl7Ci0jaWYgTU1YX0FTTUJMSVQKLQkJCWlmKHNmLT5Sc2hpZnQgJSA4ID09IDAKLQkJCSAgICYmIHNmLT5Hc2hpZnQgJSA4ID09IDAKLQkJCSAgICYmIHNmLT5Cc2hpZnQgJSA4ID09IDAKLQkJCSAgICYmIFNETF9IYXNNTVgoKSkKLQkJCSAgICByZXR1cm4gQmxpdFJHQnRvUkdCU3VyZmFjZUFscGhhTU1YOwotI2VuZGlmCi0JCQlpZigoc2YtPlJtYXNrIHwgc2YtPkdtYXNrIHwgc2YtPkJtYXNrKSA9PSAweGZmZmZmZikKLQkJCXsKLSNpZiBTRExfQUxUSVZFQ19CTElUVEVSUwotCQkJCWlmKCEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkKLQkJCQkJJiYgU0RMX0hhc0FsdGlWZWMoKSkKLQkJCQkJcmV0dXJuIEJsaXRSR0J0b1JHQlN1cmZhY2VBbHBoYUFsdGl2ZWM7Ci0jZW5kaWYKLQkJCQlyZXR1cm4gQmxpdFJHQnRvUkdCU3VyZmFjZUFscGhhOwotCQkJfQotCQl9Ci0jaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMKLQkJaWYoKHNmLT5CeXRlc1BlclBpeGVsID09IDQpICYmCi0JCSAgICEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgJiYgU0RMX0hhc0FsdGlWZWMoKSkKLQkJCXJldHVybiBCbGl0MzJ0bzMyU3VyZmFjZUFscGhhQWx0aXZlYzsKLQkJZWxzZQotI2VuZGlmCi0JCQlyZXR1cm4gQmxpdE50b05TdXJmYWNlQWxwaGE7Ci0KLQkgICAgY2FzZSAzOgotCSAgICBkZWZhdWx0OgotCQlyZXR1cm4gQmxpdE50b05TdXJmYWNlQWxwaGE7Ci0JICAgIH0KLQl9Ci0gICAgfSBlbHNlIHsKLQkvKiBQZXItcGl4ZWwgYWxwaGEgYmxpdHMgKi8KLQlzd2l0Y2goZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKLQljYXNlIDE6Ci0JICAgIHJldHVybiBCbGl0TnRvMVBpeGVsQWxwaGE7Ci0KLQljYXNlIDI6Ci0jaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMKLQlpZihzZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0ICYmICEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgJiYKLSAgICAgICAgICAgZGYtPkdtYXNrID09IDB4N2UwICYmCi0JICAgZGYtPkJtYXNrID09IDB4MWYgJiYgU0RMX0hhc0FsdGlWZWMoKSkKLSAgICAgICAgICAgIHJldHVybiBCbGl0MzJ0bzU2NVBpeGVsQWxwaGFBbHRpdmVjOwotICAgICAgICBlbHNlCi0jZW5kaWYKLQkgICAgaWYoc2YtPkJ5dGVzUGVyUGl4ZWwgPT0gNCAmJiBzZi0+QW1hc2sgPT0gMHhmZjAwMDAwMAotCSAgICAgICAmJiBzZi0+R21hc2sgPT0gMHhmZjAwCi0JICAgICAgICYmICgoc2YtPlJtYXNrID09IDB4ZmYgJiYgZGYtPlJtYXNrID09IDB4MWYpCi0JCSAgIHx8IChzZi0+Qm1hc2sgPT0gMHhmZiAmJiBkZi0+Qm1hc2sgPT0gMHgxZikpKSB7Ci0JCWlmKGRmLT5HbWFzayA9PSAweDdlMCkKLQkJICAgIHJldHVybiBCbGl0QVJHQnRvNTY1UGl4ZWxBbHBoYTsKLQkJZWxzZSBpZihkZi0+R21hc2sgPT0gMHgzZTApCi0JCSAgICByZXR1cm4gQmxpdEFSR0J0bzU1NVBpeGVsQWxwaGE7Ci0JICAgIH0KLQkgICAgcmV0dXJuIEJsaXROdG9OUGl4ZWxBbHBoYTsKLQotCWNhc2UgNDoKLQkgICAgaWYoc2YtPlJtYXNrID09IGRmLT5SbWFzawotCSAgICAgICAmJiBzZi0+R21hc2sgPT0gZGYtPkdtYXNrCi0JICAgICAgICYmIHNmLT5CbWFzayA9PSBkZi0+Qm1hc2sKLQkgICAgICAgJiYgc2YtPkJ5dGVzUGVyUGl4ZWwgPT0gNCkKLQkgICAgewotI2lmIE1NWF9BU01CTElUCi0JCWlmKHNmLT5Sc2hpZnQgJSA4ID09IDAKLQkJICAgJiYgc2YtPkdzaGlmdCAlIDggPT0gMAotCQkgICAmJiBzZi0+QnNoaWZ0ICUgOCA9PSAwCi0JCSAgICYmIHNmLT5Bc2hpZnQgJSA4ID09IDAKLQkJICAgJiYgc2YtPkFsb3NzID09IDApCi0JCXsKLQkJCWlmKFNETF9IYXMzRE5vdygpKQotCQkJCXJldHVybiBCbGl0UkdCdG9SR0JQaXhlbEFscGhhTU1YM0ROT1c7Ci0JCQlpZihTRExfSGFzTU1YKCkpCi0JCQkJcmV0dXJuIEJsaXRSR0J0b1JHQlBpeGVsQWxwaGFNTVg7Ci0JCX0KLSNlbmRpZgotCQlpZihzZi0+QW1hc2sgPT0gMHhmZjAwMDAwMCkKLQkJewotI2lmIFNETF9BTFRJVkVDX0JMSVRURVJTCi0JCQlpZighKHN1cmZhY2UtPm1hcC0+ZHN0LT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpCi0JCQkJJiYgU0RMX0hhc0FsdGlWZWMoKSkKLQkJCQlyZXR1cm4gQmxpdFJHQnRvUkdCUGl4ZWxBbHBoYUFsdGl2ZWM7Ci0jZW5kaWYKLQkJCXJldHVybiBCbGl0UkdCdG9SR0JQaXhlbEFscGhhOwotCQl9Ci0JICAgIH0KLSNpZiBTRExfQUxUSVZFQ19CTElUVEVSUwotCSAgICBpZiAoc2YtPkFtYXNrICYmIHNmLT5CeXRlc1BlclBpeGVsID09IDQgJiYKLQkgICAgICAgICEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgJiYgU0RMX0hhc0FsdGlWZWMoKSkKLQkJcmV0dXJuIEJsaXQzMnRvMzJQaXhlbEFscGhhQWx0aXZlYzsKLQkgICAgZWxzZQotI2VuZGlmCi0JCXJldHVybiBCbGl0TnRvTlBpeGVsQWxwaGE7Ci0KLQljYXNlIDM6Ci0JZGVmYXVsdDoKLQkgICAgcmV0dXJuIEJsaXROdG9OUGl4ZWxBbHBoYTsKLQl9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9ibGl0X04uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2JsaXRfTi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQ2NmVlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2JsaXRfTi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKLSNpbmNsdWRlICJTRExfY3B1aW5mby5oIgotI2luY2x1ZGUgIlNETF9ibGl0LmgiCi0KLS8qIEZ1bmN0aW9ucyB0byBibGl0IGZyb20gTi1iaXQgc3VyZmFjZXMgdG8gb3RoZXIgc3VyZmFjZXMgKi8KLQotI2lmIFNETF9BTFRJVkVDX0JMSVRURVJTCi0jaWYgX19NV0VSS1NfXwotI3ByYWdtYSBhbHRpdmVjX21vZGVsIG9uCi0jZW5kaWYKLSNpZmRlZiBIQVZFX0FMVElWRUNfSAotI2luY2x1ZGUgPGFsdGl2ZWMuaD4KLSNlbmRpZgotI2RlZmluZSBhc3NlcnQoWCkKLSNpZmRlZiBfX01BQ09TWF9fCi0jaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgotc3RhdGljIHNpemVfdCBHZXRMM0NhY2hlU2l6ZSggdm9pZCApCi17Ci0gICAgY29uc3QgY2hhciBrZXlbXSA9ICJody5sM2NhY2hlc2l6ZSI7Ci0gICAgdV9pbnQ2NF90IHJlc3VsdCA9IDA7Ci0gICAgc2l6ZV90IHR5cGVTaXplID0gc2l6ZW9mKCByZXN1bHQgKTsKLQotCi0gICAgaW50IGVyciA9IHN5c2N0bGJ5bmFtZSgga2V5LCAmcmVzdWx0LCAmdHlwZVNpemUsIE5VTEwsIDAgKTsKLSAgICBpZiggMCAhPSBlcnIgKSByZXR1cm4gMDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0jZWxzZQotc3RhdGljIHNpemVfdCBHZXRMM0NhY2hlU2l6ZSggdm9pZCApCi17Ci0gICAgLyogWFhYOiBKdXN0IGd1ZXNzIEc0ICovCi0gICAgcmV0dXJuIDIwOTcxNTI7Ci19Ci0jZW5kaWYgLyogX19NQUNPU1hfXyAqLwotCi0jaWYgKGRlZmluZWQoX19NQUNPU1hfXykgJiYgKF9fR05VQ19fIDwgNCkpCi0gICAgI2RlZmluZSBWRUNVSU5UOF9MSVRFUkFMKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHApIFwKLSAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSAoIGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAgKQotICAgICNkZWZpbmUgVkVDVUlOVDE2X0xJVEVSQUwoYSxiLGMsZCxlLGYsZyxoKSBcCi0gICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpICggYSxiLGMsZCxlLGYsZyxoICkKLSNlbHNlCi0gICAgI2RlZmluZSBWRUNVSU5UOF9MSVRFUkFMKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHApIFwKLSAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSB7IGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAgfQotICAgICNkZWZpbmUgVkVDVUlOVDE2X0xJVEVSQUwoYSxiLGMsZCxlLGYsZyxoKSBcCi0gICAgICAgICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpIHsgYSxiLGMsZCxlLGYsZyxoIH0KLSNlbmRpZgotCi0jZGVmaW5lIFVOQUxJR05FRF9QVFIoeCkgKCgoc2l6ZV90KSB4KSAmIDB4MDAwMDAwMEYpCi0jZGVmaW5lIFZTV0laWkxFMzIoYSxiLGMsZCkgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAweDAwK2EsIDB4MDArYiwgMHgwMCtjLCAweDAwK2QsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQrYSwgMHgwNCtiLCAweDA0K2MsIDB4MDQrZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCthLCAweDA4K2IsIDB4MDgrYywgMHgwOCtkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBDK2EsIDB4MEMrYiwgMHgwQytjLCAweDBDK2QgKQotCi0jZGVmaW5lIE1BS0U4ODg4KGRzdGZtdCwgciwgZywgYiwgYSkgIFwKLSAgICAoICgocjw8ZHN0Zm10LT5Sc2hpZnQpJmRzdGZtdC0+Um1hc2spIHwgXAotICAgICAgKChnPDxkc3RmbXQtPkdzaGlmdCkmZHN0Zm10LT5HbWFzaykgfCBcCi0gICAgICAoKGI8PGRzdGZtdC0+QnNoaWZ0KSZkc3RmbXQtPkJtYXNrKSB8IFwKLSAgICAgICgoYTw8ZHN0Zm10LT5Bc2hpZnQpJmRzdGZtdC0+QW1hc2spICkKLQotLyoKLSAqIERhdGEgU3RyZWFtIFRvdWNoLi4uQWx0aXZlYyBjYWNoZSBwcmVmZXRjaGluZy4KLSAqCi0gKiAgRG9uJ3QgdXNlIHRoaXMgb24gYSBHNS4uLmhvd2V2ZXIsIHRoZSBzcGVlZCBib29zdCBpcyB2ZXJ5IHNpZ25pZmljYW50Ci0gKiAgIG9uIGEgRzQuCi0gKi8KLSNkZWZpbmUgRFNUX0NIQU5fU1JDIDEKLSNkZWZpbmUgRFNUX0NIQU5fREVTVCAyCi0KLS8qIG1hY3JvIHRvIHNldCBEU1QgY29udHJvbCB3b3JkIHZhbHVlLi4uICovCi0jZGVmaW5lIERTVF9DVFJMKHNpemUsIGNvdW50LCBzdHJpZGUpIFwKLSAgICAoKChzaXplKSA8PCAyNCkgfCAoKGNvdW50KSA8PCAxNikgfCAoc3RyaWRlKSkKLQotI2RlZmluZSBWRUNfQUxJR05FUihzcmMpICgoVU5BTElHTkVEX1BUUihzcmMpKSBcCi0gICAgPyB2ZWNfbHZzbCgwLCBzcmMpIFwKLSAgICA6IHZlY19hZGQodmVjX2x2c2woOCwgc3JjKSwgdmVjX3NwbGF0X3U4KDgpKSkKLQotLyogQ2FsY3VsYXRlIHRoZSBwZXJtdXRlIHZlY3RvciB1c2VkIGZvciAzMi0+MzIgc3dpenpsaW5nICovCi1zdGF0aWMgdmVjdG9yIHVuc2lnbmVkIGNoYXIgY2FsY19zd2l6emxlMzIoY29uc3QgU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQpCi17Ci0gICAgLyoKLSAgICAqIFdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIGJpdHMgdGhhdCBhcmVuJ3QgdXNlZCBieSBvdGhlcgotICAgICAqICBjb2xvcnMgaXMgYWxwaGEsIGFuZCBpdCdzIG9uZSBjb21wbGV0ZSBieXRlLCBzaW5jZSBzb21lIGZvcm1hdHMKLSAgICAgKiAgbGVhdmUgYWxwaGEgd2l0aCBhIHplcm8gbWFzaywgYnV0IHdlIHNob3VsZCBzdGlsbCBzd2l6emxlIHRoZSBiaXRzLgotICAgICAqLwotICAgIC8qIEFSR0IgKi8KLSAgICBjb25zdCBzdGF0aWMgc3RydWN0IFNETF9QaXhlbEZvcm1hdCBkZWZhdWx0X3BpeGVsX2Zvcm1hdCA9IHsKLSAgICAgICAgTlVMTCwgMCwgMCwKLSAgICAgICAgMCwgMCwgMCwgMCwKLSAgICAgICAgMTYsIDgsIDAsIDI0LAotICAgICAgICAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGLCAweEZGMDAwMDAwLAotICAgICAgICAwLCAwfTsKLSAgICBpZiAoIXNyY2ZtdCkgewotICAgICAgICBzcmNmbXQgPSAmZGVmYXVsdF9waXhlbF9mb3JtYXQ7Ci0gICAgfQotICAgIGlmICghZHN0Zm10KSB7Ci0gICAgICAgIGRzdGZtdCA9ICZkZWZhdWx0X3BpeGVsX2Zvcm1hdDsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcGx1cyA9IFZFQ1VJTlQ4X0xJVEVSQUwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMsIDB4MEMsIDB4MEMsIDB4MEMgKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c3dpejsKLSAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHNyY3ZlYzsKLSNkZWZpbmUgUkVTSElGVChYKSAoMyAtICgoWCkgPj4gMykpCi0gICAgVWludDMyIHJtYXNrID0gUkVTSElGVChzcmNmbXQtPlJzaGlmdCkgPDwgKGRzdGZtdC0+UnNoaWZ0KTsKLSAgICBVaW50MzIgZ21hc2sgPSBSRVNISUZUKHNyY2ZtdC0+R3NoaWZ0KSA8PCAoZHN0Zm10LT5Hc2hpZnQpOwotICAgIFVpbnQzMiBibWFzayA9IFJFU0hJRlQoc3JjZm10LT5Cc2hpZnQpIDw8IChkc3RmbXQtPkJzaGlmdCk7Ci0gICAgVWludDMyIGFtYXNrOwotICAgIC8qIFVzZSB6ZXJvIGZvciBhbHBoYSBpZiBlaXRoZXIgc3VyZmFjZSBkb2Vzbid0IGhhdmUgYWxwaGEgKi8KLSAgICBpZiAoZHN0Zm10LT5BbWFzaykgewotICAgICAgICBhbWFzayA9ICgoc3JjZm10LT5BbWFzaykgPyBSRVNISUZUKHNyY2ZtdC0+QXNoaWZ0KSA6IDB4MTApIDw8IChkc3RmbXQtPkFzaGlmdCk7Ci0gICAgfSBlbHNlIHsgICAgCi0gICAgICAgIGFtYXNrID0gMHgxMDEwMTAxMCAmICgoZHN0Zm10LT5SbWFzayB8IGRzdGZtdC0+R21hc2sgfCBkc3RmbXQtPkJtYXNrKSBeIDB4RkZGRkZGRkYpOwotICAgIH0gICAgICAgICAgIAotI3VuZGVmIFJFU0hJRlQgIAotICAgICgodW5zaWduZWQgaW50ICopKGNoYXIqKSZzcmN2ZWMpWzBdID0gKHJtYXNrIHwgZ21hc2sgfCBibWFzayB8IGFtYXNrKTsKLSAgICB2c3dpeiA9IHZlY19hZGQocGx1cywgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19zcGxhdChzcmN2ZWMsIDApKTsKLSAgICByZXR1cm4odnN3aXopOwotfQotCi1zdGF0aWMgdm9pZCBCbGl0X1JHQjg4OF9SR0I1NjUoU0RMX0JsaXRJbmZvICppbmZvKTsKLXN0YXRpYyB2b2lkIEJsaXRfUkdCODg4X1JHQjU2NUFsdGl2ZWMoU0RMX0JsaXRJbmZvICppbmZvKSB7Ci0gICAgaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotICAgIFVpbnQ4ICpzcmMgPSAoVWludDggKikgaW5mby0+c19waXhlbHM7Ci0gICAgaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0gICAgVWludDggKmRzdCA9IChVaW50OCAqKSBpbmZvLT5kX3BpeGVsczsKLSAgICBpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLSAgICBTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGEgPSB2ZWNfc3BsYXRfdTgoMCk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnBlcm11dGUgPSBjYWxjX3N3aXp6bGUzMihzcmNmbXQsIE5VTEwpOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZnbWVyZ2UgPSBWRUNVSU5UOF9MSVRFUkFMKAotICAgICAgICAweDAwLCAweDAyLCAweDAwLCAweDA2LAotICAgICAgICAweDAwLCAweDBhLCAweDAwLCAweDBlLAotICAgICAgICAweDAwLCAweDEyLCAweDAwLCAweDE2LAotICAgICAgICAweDAwLCAweDFhLCAweDAwLCAweDFlKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjEgPSB2ZWNfc3BsYXRfdTE2KDEpOwotICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2MyA9IHZlY19zcGxhdF91MTYoMyk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYzZiA9IFZFQ1VJTlQxNl9MSVRFUkFMKAotICAgICAgICAweDAwM2YsIDB4MDAzZiwgMHgwMDNmLCAweDAwM2YsCi0gICAgICAgIDB4MDAzZiwgMHgwMDNmLCAweDAwM2YsIDB4MDAzZik7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZmYyA9IFZFQ1VJTlQxNl9MSVRFUkFMKAotICAgICAgICAweDAwZmMsIDB4MDBmYywgMHgwMGZjLCAweDAwZmMsCi0gICAgICAgIDB4MDBmYywgMHgwMGZjLCAweDAwZmMsIDB4MDBmYyk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZmODAwID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2ZWNfc3BsYXRfdTgoLTcpOwotICAgIHZmODAwID0gdmVjX3NsKHZmODAwLCB2ZWNfc3BsYXRfdTE2KDgpKTsKLQotICAgIHdoaWxlIChoZWlnaHQtLSkgewotICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxpZ25lcjsKLSAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdm92ZXJmbG93OwotICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c3JjOwotCi0gICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0gICAgICAgIGludCBleHRyYXdpZHRoOwotCi0gICAgICAgIC8qIGRvIHNjYWxhciB1bnRpbCB3ZSBjYW4gYWxpZ24uLi4gKi8KLSNkZWZpbmUgT05FX1BJWEVMX0JMRU5EKGNvbmRpdGlvbiwgd2lkdGh2YXIpIFwKLSAgICAgICAgd2hpbGUgKGNvbmRpdGlvbikgeyBcCi0gICAgICAgICAgICBVaW50MzIgUGl4ZWw7IFwKLSAgICAgICAgICAgIHVuc2lnbmVkIHNSLCBzRywgc0IsIHNBOyBcCi0gICAgICAgICAgICBESVNFTUJMRV9SR0JBKChVaW50OCAqKXNyYywgNCwgc3JjZm10LCBQaXhlbCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBzUiwgc0csIHNCLCBzQSk7IFwKLSAgICAgICAgICAgICooVWludDE2ICopKGRzdCkgPSAoKChzUiA8PCA4KSAmIDB4MDAwMEY4MDApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNHIDw8IDMpICYgMHgwMDAwMDdFMCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc0IgPj4gMykgJiAweDAwMDAwMDFGKSk7IFwKLSAgICAgICAgICAgIGRzdCArPSAyOyBcCi0gICAgICAgICAgICBzcmMgKz0gNDsgXAotICAgICAgICAgICAgd2lkdGh2YXItLTsgXAotICAgICAgICB9Ci0KLSAgICAgICAgT05FX1BJWEVMX0JMRU5EKCgoVU5BTElHTkVEX1BUUihkc3QpKSAmJiAod2lkdGgpKSwgd2lkdGgpOwotCi0gICAgICAgIC8qIEFmdGVyIGFsbCB0aGF0IHdvcmssIGhlcmUncyB0aGUgdmVjdG9yIHBhcnQhICovCi0gICAgICAgIGV4dHJhd2lkdGggPSAod2lkdGggJSA4KTsgIC8qIHRyYWlsaW5nIHVuYWxpZ25lZCBzdG9yZXMgKi8KLSAgICAgICAgd2lkdGggLT0gZXh0cmF3aWR0aDsKLSAgICAgICAgdnNyYyA9IHZlY19sZCgwLCBzcmMpOwotICAgICAgICB2YWxpZ25lciA9IFZFQ19BTElHTkVSKHNyYyk7Ci0KLSAgICAgICAgd2hpbGUgKHdpZHRoKSB7Ci0gICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdnBpeGVsLCB2cnBpeGVsLCB2Z3BpeGVsLCB2YnBpeGVsOwotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2c3JjMSwgdnNyYzI7Ci0gICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZHN0OwotCi0gICAgICAgICAgICB2b3ZlcmZsb3cgPSB2ZWNfbGQoMTUsIHNyYyk7Ci0gICAgICAgICAgICB2c3JjID0gdmVjX3Blcm0odnNyYywgdm92ZXJmbG93LCB2YWxpZ25lcik7Ci0gICAgICAgICAgICB2c3JjMSA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KXZlY19wZXJtKHZzcmMsIHZhbHBoYSwgdnBlcm11dGUpOwotICAgICAgICAgICAgc3JjICs9IDE2OwotICAgICAgICAgICAgdnNyYyA9IHZvdmVyZmxvdzsKLSAgICAgICAgICAgIHZvdmVyZmxvdyA9IHZlY19sZCgxNSwgc3JjKTsKLSAgICAgICAgICAgIHZzcmMgPSB2ZWNfcGVybSh2c3JjLCB2b3ZlcmZsb3csIHZhbGlnbmVyKTsKLSAgICAgICAgICAgIHZzcmMyID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpdmVjX3Blcm0odnNyYywgdmFscGhhLCB2cGVybXV0ZSk7Ci0gICAgICAgICAgICAvKiAxNTU1ICovCi0gICAgICAgICAgICB2cGl4ZWwgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19wYWNrcHgodnNyYzEsIHZzcmMyKTsKLSAgICAgICAgICAgIHZncGl4ZWwgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19wZXJtKHZzcmMxLCB2c3JjMiwgdmdtZXJnZSk7Ci0gICAgICAgICAgICB2Z3BpeGVsID0gdmVjX2FuZCh2Z3BpeGVsLCB2ZmMpOwotICAgICAgICAgICAgdmdwaXhlbCA9IHZlY19zbCh2Z3BpeGVsLCB2Myk7Ci0gICAgICAgICAgICB2cnBpeGVsID0gdmVjX3NsKHZwaXhlbCwgdjEpOwotICAgICAgICAgICAgdnJwaXhlbCA9IHZlY19hbmQodnJwaXhlbCwgdmY4MDApOwotICAgICAgICAgICAgdmJwaXhlbCA9IHZlY19hbmQodnBpeGVsLCB2M2YpOwotICAgICAgICAgICAgdmRzdCA9IHZlY19vcigodmVjdG9yIHVuc2lnbmVkIGNoYXIpdnJwaXhlbCwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZncGl4ZWwpOwotICAgICAgICAgICAgLyogNTY1ICovCi0gICAgICAgICAgICB2ZHN0ID0gdmVjX29yKHZkc3QsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2YnBpeGVsKTsKLSAgICAgICAgICAgIHZlY19zdCh2ZHN0LCAwLCBkc3QpOwotCi0gICAgICAgICAgICB3aWR0aCAtPSA4OwotICAgICAgICAgICAgc3JjICs9IDE2OwotICAgICAgICAgICAgZHN0ICs9IDE2OwotICAgICAgICAgICAgdnNyYyA9IHZvdmVyZmxvdzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCh3aWR0aCA9PSAwKTsKLQotICAgICAgICAvKiBkbyBzY2FsYXIgdW50aWwgd2UgY2FuIGFsaWduLi4uICovCi0gICAgICAgIE9ORV9QSVhFTF9CTEVORCgoZXh0cmF3aWR0aCksIGV4dHJhd2lkdGgpOwotI3VuZGVmIE9ORV9QSVhFTF9CTEVORAotCi0gICAgICAgIHNyYyArPSBzcmNza2lwOyAgLyogbW92ZSB0byBuZXh0IHJvdywgYWNjb3VudGluZyBmb3IgcGl0Y2guICovCi0gICAgICAgIGRzdCArPSBkc3Rza2lwOwotICAgIH0KLQotCi19Ci0KLXN0YXRpYyB2b2lkIEJsaXRfUkdCNTY1XzMyQWx0aXZlYyhTRExfQmxpdEluZm8gKmluZm8pIHsKLSAgICBpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0gICAgVWludDggKnNyYyA9IChVaW50OCAqKSBpbmZvLT5zX3BpeGVsczsKLSAgICBpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLSAgICBVaW50OCAqZHN0ID0gKFVpbnQ4ICopIGluZm8tPmRfcGl4ZWxzOwotICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotICAgIFNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOwotICAgIFNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OwotICAgIHVuc2lnbmVkIGFscGhhOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdmY4MDA7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGludCB2OCA9IHZlY19zcGxhdF91MzIoOCk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGludCB2MTYgPSB2ZWNfYWRkKHY4LCB2OCk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYyID0gdmVjX3NwbGF0X3UxNigyKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjMgPSB2ZWNfc3BsYXRfdTE2KDMpOwotICAgIC8qIAotICAgICAgICAweDEwIC0gMHgxZiBpcyB0aGUgYWxwaGEKLSAgICAgICAgMHgwMCAtIDB4MGUgZXZlbnMgYXJlIHRoZSByZWQKLSAgICAgICAgMHgwMSAtIDB4MGYgb2RkcyBhcmUgemVybwotICAgICovCi0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnJlZGFscGhhMSA9IFZFQ1VJTlQ4X0xJVEVSQUwoCi0gICAgICAgIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MTAsIDB4MDIsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MTAsIDB4MDQsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MTAsIDB4MDYsIDB4MDEsIDB4MDEKLSAgICApOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZyZWRhbHBoYTIgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpICgKLSAgICAgICAgdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIGludCl2cmVkYWxwaGExLCB2ZWNfc2wodjgsIHYxNikpCi0gICAgKTsKLSAgICAvKgotICAgICAgICAweDAwIC0gMHgwZiBpcyBBUnh4IEFSeHggQVJ4eCBBUnh4Ci0gICAgICAgIDB4MTEgLSAweDBmIG9kZHMgYXJlIGJsdWUKLSAgICAqLwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZibHVlMSA9IFZFQ1VJTlQ4X0xJVEVSQUwoCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MTEsCi0gICAgICAgIDB4MDQsIDB4MDUsIDB4MDYsIDB4MTMsCi0gICAgICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MTUsCi0gICAgICAgIDB4MGMsIDB4MGQsIDB4MGUsIDB4MTcKLSAgICApOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZibHVlMiA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoCi0gICAgICAgIHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBpbnQpdmJsdWUxLCB2OCkKLSAgICApOwotICAgIC8qCi0gICAgICAgIDB4MDAgLSAweDBmIGlzIEFSeEIgQVJ4QiBBUnhCIEFSeEIKLSAgICAgICAgMHgxMCAtIDB4MGUgZXZlbnMgYXJlIGdyZWVuCi0gICAgKi8KLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Z3JlZW4xID0gVkVDVUlOVDhfTElURVJBTCgKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgxMCwgMHgwMywKLSAgICAgICAgMHgwNCwgMHgwNSwgMHgxMiwgMHgwNywKLSAgICAgICAgMHgwOCwgMHgwOSwgMHgxNCwgMHgwYiwKLSAgICAgICAgMHgwYywgMHgwZCwgMHgxNiwgMHgwZgotICAgICk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmdyZWVuMiA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoCi0gICAgICAgIHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBpbnQpdmdyZWVuMSwgdmVjX3NsKHY4LCB2OCkpCi0gICAgKTsKLSAgICAKLQotICAgIGFzc2VydChzcmNmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gMik7Ci0gICAgYXNzZXJ0KGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbCA9PSA0KTsKLQotICAgIHZmODAwID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2ZWNfc3BsYXRfdTgoLTcpOwotICAgIHZmODAwID0gdmVjX3NsKHZmODAwLCB2ZWNfc3BsYXRfdTE2KDgpKTsKLQotICAgIGlmIChkc3RmbXQtPkFtYXNrICYmIHNyY2ZtdC0+YWxwaGEpIHsKLSAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopJnZhbHBoYSlbMF0gPSBhbHBoYSA9IHNyY2ZtdC0+YWxwaGE7Ci0gICAgICAgIHZhbHBoYSA9IHZlY19zcGxhdCh2YWxwaGEsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFscGhhID0gMDsKLSAgICAgICAgdmFscGhhID0gdmVjX3NwbGF0X3U4KDApOwotICAgIH0KLQotICAgIHZwZXJtdXRlID0gY2FsY19zd2l6emxlMzIoTlVMTCwgZHN0Zm10KTsKLSAgICB3aGlsZSAoaGVpZ2h0LS0pIHsKLSAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFsaWduZXI7Ci0gICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZvdmVyZmxvdzsKLSAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnNyYzsKLQotICAgICAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotICAgICAgICBpbnQgZXh0cmF3aWR0aDsKLQotICAgICAgICAvKiBkbyBzY2FsYXIgdW50aWwgd2UgY2FuIGFsaWduLi4uICovCi0jZGVmaW5lIE9ORV9QSVhFTF9CTEVORChjb25kaXRpb24sIHdpZHRodmFyKSBcCi0gICAgICAgIHdoaWxlIChjb25kaXRpb24pIHsgXAotICAgICAgICAgICAgdW5zaWduZWQgc1IsIHNHLCBzQjsgXAotICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgUGl4ZWwgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKXNyYyk7IFwKLSAgICAgICAgICAgIHNSID0gKFBpeGVsID4+IDgpICYgMHhmODsgXAotICAgICAgICAgICAgc0cgPSAoUGl4ZWwgPj4gMykgJiAweGZjOyBcCi0gICAgICAgICAgICBzQiA9IChQaXhlbCA8PCAzKSAmIDB4Zjg7IFwKLSAgICAgICAgICAgIEFTU0VNQkxFX1JHQkEoZHN0LCA0LCBkc3RmbXQsIHNSLCBzRywgc0IsIGFscGhhKTsgXAotICAgICAgICAgICAgc3JjICs9IDI7IFwKLSAgICAgICAgICAgIGRzdCArPSA0OyBcCi0gICAgICAgICAgICB3aWR0aHZhci0tOyBcCi0gICAgICAgIH0KLSAgICAgICAgT05FX1BJWEVMX0JMRU5EKCgoVU5BTElHTkVEX1BUUihkc3QpKSAmJiAod2lkdGgpKSwgd2lkdGgpOwotCi0gICAgICAgIC8qIEFmdGVyIGFsbCB0aGF0IHdvcmssIGhlcmUncyB0aGUgdmVjdG9yIHBhcnQhICovCi0gICAgICAgIGV4dHJhd2lkdGggPSAod2lkdGggJSA4KTsgIC8qIHRyYWlsaW5nIHVuYWxpZ25lZCBzdG9yZXMgKi8KLSAgICAgICAgd2lkdGggLT0gZXh0cmF3aWR0aDsKLSAgICAgICAgdnNyYyA9IHZlY19sZCgwLCBzcmMpOwotICAgICAgICB2YWxpZ25lciA9IFZFQ19BTElHTkVSKHNyYyk7Ci0KLSAgICAgICAgd2hpbGUgKHdpZHRoKSB7Ci0gICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdlIsIHZHLCB2QjsKLSAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkc3QxLCB2ZHN0MjsKLQotICAgICAgICAgICAgdm92ZXJmbG93ID0gdmVjX2xkKDE1LCBzcmMpOwotICAgICAgICAgICAgdnNyYyA9IHZlY19wZXJtKHZzcmMsIHZvdmVyZmxvdywgdmFsaWduZXIpOwotCi0gICAgICAgICAgICB2UiA9IHZlY19hbmQoKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2c3JjLCB2ZjgwMCk7Ci0gICAgICAgICAgICB2QiA9IHZlY19zbCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZzcmMsIHYzKTsKLSAgICAgICAgICAgIHZHID0gdmVjX3NsKHZCLCB2Mik7Ci0KLSAgICAgICAgICAgIHZkc3QxID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcil2UiwgdmFscGhhLCB2cmVkYWxwaGExKTsKLSAgICAgICAgICAgIHZkc3QxID0gdmVjX3Blcm0odmRzdDEsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2QiwgdmJsdWUxKTsKLSAgICAgICAgICAgIHZkc3QxID0gdmVjX3Blcm0odmRzdDEsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2RywgdmdyZWVuMSk7Ci0gICAgICAgICAgICB2ZHN0MSA9IHZlY19wZXJtKHZkc3QxLCB2YWxwaGEsIHZwZXJtdXRlKTsKLSAgICAgICAgICAgIHZlY19zdCh2ZHN0MSwgMCwgZHN0KTsKLQotICAgICAgICAgICAgdmRzdDIgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZSLCB2YWxwaGEsIHZyZWRhbHBoYTIpOwotICAgICAgICAgICAgdmRzdDIgPSB2ZWNfcGVybSh2ZHN0MiwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZCLCB2Ymx1ZTIpOwotICAgICAgICAgICAgdmRzdDIgPSB2ZWNfcGVybSh2ZHN0MiwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZHLCB2Z3JlZW4yKTsKLSAgICAgICAgICAgIHZkc3QyID0gdmVjX3Blcm0odmRzdDIsIHZhbHBoYSwgdnBlcm11dGUpOwotICAgICAgICAgICAgdmVjX3N0KHZkc3QyLCAxNiwgZHN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2lkdGggLT0gODsKLSAgICAgICAgICAgIGRzdCArPSAzMjsKLSAgICAgICAgICAgIHNyYyArPSAxNjsKLSAgICAgICAgICAgIHZzcmMgPSB2b3ZlcmZsb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQod2lkdGggPT0gMCk7Ci0KLQotICAgICAgICAvKiBkbyBzY2FsYXIgdW50aWwgd2UgY2FuIGFsaWduLi4uICovCi0gICAgICAgIE9ORV9QSVhFTF9CTEVORCgoZXh0cmF3aWR0aCksIGV4dHJhd2lkdGgpOwotI3VuZGVmIE9ORV9QSVhFTF9CTEVORAotCi0gICAgICAgIHNyYyArPSBzcmNza2lwOyAgLyogbW92ZSB0byBuZXh0IHJvdywgYWNjb3VudGluZyBmb3IgcGl0Y2guICovCi0gICAgICAgIGRzdCArPSBkc3Rza2lwOwotICAgIH0KLQotfQotCi0KLXN0YXRpYyB2b2lkIEJsaXRfUkdCNTU1XzMyQWx0aXZlYyhTRExfQmxpdEluZm8gKmluZm8pIHsKLSAgICBpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0gICAgVWludDggKnNyYyA9IChVaW50OCAqKSBpbmZvLT5zX3BpeGVsczsKLSAgICBpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLSAgICBVaW50OCAqZHN0ID0gKFVpbnQ4ICopIGluZm8tPmRfcGl4ZWxzOwotICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotICAgIFNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOwotICAgIFNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OwotICAgIHVuc2lnbmVkIGFscGhhOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cGVybXV0ZTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdmY4MDA7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGludCB2OCA9IHZlY19zcGxhdF91MzIoOCk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGludCB2MTYgPSB2ZWNfYWRkKHY4LCB2OCk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYxID0gdmVjX3NwbGF0X3UxNigxKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjMgPSB2ZWNfc3BsYXRfdTE2KDMpOwotICAgIC8qIAotICAgICAgICAweDEwIC0gMHgxZiBpcyB0aGUgYWxwaGEKLSAgICAgICAgMHgwMCAtIDB4MGUgZXZlbnMgYXJlIHRoZSByZWQKLSAgICAgICAgMHgwMSAtIDB4MGYgb2RkcyBhcmUgemVybwotICAgICovCi0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnJlZGFscGhhMSA9IFZFQ1VJTlQ4X0xJVEVSQUwoCi0gICAgICAgIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MTAsIDB4MDIsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MTAsIDB4MDQsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MTAsIDB4MDYsIDB4MDEsIDB4MDEKLSAgICApOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZyZWRhbHBoYTIgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKAotICAgICAgICB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgaW50KXZyZWRhbHBoYTEsIHZlY19zbCh2OCwgdjE2KSkKLSAgICApOwotICAgIC8qCi0gICAgICAgIDB4MDAgLSAweDBmIGlzIEFSeHggQVJ4eCBBUnh4IEFSeHgKLSAgICAgICAgMHgxMSAtIDB4MGYgb2RkcyBhcmUgYmx1ZQotICAgICovCi0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJsdWUxID0gVkVDVUlOVDhfTElURVJBTCgKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgxMSwKLSAgICAgICAgMHgwNCwgMHgwNSwgMHgwNiwgMHgxMywKLSAgICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgxNSwKLSAgICAgICAgMHgwYywgMHgwZCwgMHgwZSwgMHgxNwotICAgICk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJsdWUyID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgKLSAgICAgICAgdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIGludCl2Ymx1ZTEsIHY4KQotICAgICk7Ci0gICAgLyoKLSAgICAgICAgMHgwMCAtIDB4MGYgaXMgQVJ4QiBBUnhCIEFSeEIgQVJ4QgotICAgICAgICAweDEwIC0gMHgwZSBldmVucyBhcmUgZ3JlZW4KLSAgICAqLwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZncmVlbjEgPSBWRUNVSU5UOF9MSVRFUkFMKAotICAgICAgICAweDAwLCAweDAxLCAweDEwLCAweDAzLAotICAgICAgICAweDA0LCAweDA1LCAweDEyLCAweDA3LAotICAgICAgICAweDA4LCAweDA5LCAweDE0LCAweDBiLAotICAgICAgICAweDBjLCAweDBkLCAweDE2LCAweDBmCi0gICAgKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Z3JlZW4yID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgKLSAgICAgICAgdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIGludCl2Z3JlZW4xLCB2ZWNfc2wodjgsIHY4KSkKLSAgICApOwotICAgIAotCi0gICAgYXNzZXJ0KHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbCA9PSAyKTsKLSAgICBhc3NlcnQoZHN0Zm10LT5CeXRlc1BlclBpeGVsID09IDQpOwotCi0gICAgdmY4MDAgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19zcGxhdF91OCgtNyk7Ci0gICAgdmY4MDAgPSB2ZWNfc2wodmY4MDAsIHZlY19zcGxhdF91MTYoOCkpOwotCi0gICAgaWYgKGRzdGZtdC0+QW1hc2sgJiYgc3JjZm10LT5hbHBoYSkgewotICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikmdmFscGhhKVswXSA9IGFscGhhID0gc3JjZm10LT5hbHBoYTsKLSAgICAgICAgdmFscGhhID0gdmVjX3NwbGF0KHZhbHBoYSwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWxwaGEgPSAwOwotICAgICAgICB2YWxwaGEgPSB2ZWNfc3BsYXRfdTgoMCk7Ci0gICAgfQotCi0gICAgdnBlcm11dGUgPSBjYWxjX3N3aXp6bGUzMihOVUxMLCBkc3RmbXQpOwotICAgIHdoaWxlIChoZWlnaHQtLSkgewotICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxpZ25lcjsKLSAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdm92ZXJmbG93OwotICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c3JjOwotCi0gICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0gICAgICAgIGludCBleHRyYXdpZHRoOwotCi0gICAgICAgIC8qIGRvIHNjYWxhciB1bnRpbCB3ZSBjYW4gYWxpZ24uLi4gKi8KLSNkZWZpbmUgT05FX1BJWEVMX0JMRU5EKGNvbmRpdGlvbiwgd2lkdGh2YXIpIFwKLSAgICAgICAgd2hpbGUgKGNvbmRpdGlvbikgeyBcCi0gICAgICAgICAgICB1bnNpZ25lZCBzUiwgc0csIHNCOyBcCi0gICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBQaXhlbCA9ICooKHVuc2lnbmVkIHNob3J0ICopc3JjKTsgXAotICAgICAgICAgICAgc1IgPSAoUGl4ZWwgPj4gNykgJiAweGY4OyBcCi0gICAgICAgICAgICBzRyA9IChQaXhlbCA+PiAyKSAmIDB4Zjg7IFwKLSAgICAgICAgICAgIHNCID0gKFBpeGVsIDw8IDMpICYgMHhmODsgXAotICAgICAgICAgICAgQVNTRU1CTEVfUkdCQShkc3QsIDQsIGRzdGZtdCwgc1IsIHNHLCBzQiwgYWxwaGEpOyBcCi0gICAgICAgICAgICBzcmMgKz0gMjsgXAotICAgICAgICAgICAgZHN0ICs9IDQ7IFwKLSAgICAgICAgICAgIHdpZHRodmFyLS07IFwKLSAgICAgICAgfQotICAgICAgICBPTkVfUElYRUxfQkxFTkQoKChVTkFMSUdORURfUFRSKGRzdCkpICYmICh3aWR0aCkpLCB3aWR0aCk7Ci0KLSAgICAgICAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgaGVyZSdzIHRoZSB2ZWN0b3IgcGFydCEgKi8KLSAgICAgICAgZXh0cmF3aWR0aCA9ICh3aWR0aCAlIDgpOyAgLyogdHJhaWxpbmcgdW5hbGlnbmVkIHN0b3JlcyAqLwotICAgICAgICB3aWR0aCAtPSBleHRyYXdpZHRoOwotICAgICAgICB2c3JjID0gdmVjX2xkKDAsIHNyYyk7Ci0gICAgICAgIHZhbGlnbmVyID0gVkVDX0FMSUdORVIoc3JjKTsKLQotICAgICAgICB3aGlsZSAod2lkdGgpIHsKLSAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2UiwgdkcsIHZCOwotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmRzdDEsIHZkc3QyOwotCi0gICAgICAgICAgICB2b3ZlcmZsb3cgPSB2ZWNfbGQoMTUsIHNyYyk7Ci0gICAgICAgICAgICB2c3JjID0gdmVjX3Blcm0odnNyYywgdm92ZXJmbG93LCB2YWxpZ25lcik7Ci0KLSAgICAgICAgICAgIHZSID0gdmVjX2FuZCh2ZWNfc2woKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2c3JjLHYxKSwgdmY4MDApOwotICAgICAgICAgICAgdkIgPSB2ZWNfc2woKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2c3JjLCB2Myk7Ci0gICAgICAgICAgICB2RyA9IHZlY19zbCh2QiwgdjMpOwotCi0gICAgICAgICAgICB2ZHN0MSA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfcGVybSgodmVjdG9yIHVuc2lnbmVkIGNoYXIpdlIsIHZhbHBoYSwgdnJlZGFscGhhMSk7Ci0gICAgICAgICAgICB2ZHN0MSA9IHZlY19wZXJtKHZkc3QxLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdkIsIHZibHVlMSk7Ci0gICAgICAgICAgICB2ZHN0MSA9IHZlY19wZXJtKHZkc3QxLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdkcsIHZncmVlbjEpOwotICAgICAgICAgICAgdmRzdDEgPSB2ZWNfcGVybSh2ZHN0MSwgdmFscGhhLCB2cGVybXV0ZSk7Ci0gICAgICAgICAgICB2ZWNfc3QodmRzdDEsIDAsIGRzdCk7Ci0KLSAgICAgICAgICAgIHZkc3QyID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcil2UiwgdmFscGhhLCB2cmVkYWxwaGEyKTsKLSAgICAgICAgICAgIHZkc3QyID0gdmVjX3Blcm0odmRzdDIsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2QiwgdmJsdWUyKTsKLSAgICAgICAgICAgIHZkc3QyID0gdmVjX3Blcm0odmRzdDIsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2RywgdmdyZWVuMik7Ci0gICAgICAgICAgICB2ZHN0MiA9IHZlY19wZXJtKHZkc3QyLCB2YWxwaGEsIHZwZXJtdXRlKTsKLSAgICAgICAgICAgIHZlY19zdCh2ZHN0MiwgMTYsIGRzdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdpZHRoIC09IDg7Ci0gICAgICAgICAgICBkc3QgKz0gMzI7Ci0gICAgICAgICAgICBzcmMgKz0gMTY7Ci0gICAgICAgICAgICB2c3JjID0gdm92ZXJmbG93OwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0KHdpZHRoID09IDApOwotCi0KLSAgICAgICAgLyogZG8gc2NhbGFyIHVudGlsIHdlIGNhbiBhbGlnbi4uLiAqLwotICAgICAgICBPTkVfUElYRUxfQkxFTkQoKGV4dHJhd2lkdGgpLCBleHRyYXdpZHRoKTsKLSN1bmRlZiBPTkVfUElYRUxfQkxFTkQKLQotICAgICAgICBzcmMgKz0gc3Jjc2tpcDsgIC8qIG1vdmUgdG8gbmV4dCByb3csIGFjY291bnRpbmcgZm9yIHBpdGNoLiAqLwotICAgICAgICBkc3QgKz0gZHN0c2tpcDsKLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQgQmxpdE50b05LZXkoU0RMX0JsaXRJbmZvICppbmZvKTsKLXN0YXRpYyB2b2lkIEJsaXROdG9OS2V5Q29weUFscGhhKFNETF9CbGl0SW5mbyAqaW5mbyk7Ci1zdGF0aWMgdm9pZCBCbGl0MzJ0bzMyS2V5QWx0aXZlYyhTRExfQmxpdEluZm8gKmluZm8pCi17Ci0gICAgaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotICAgIFVpbnQzMiAqc3JjcCA9IChVaW50MzIgKikgaW5mby0+c19waXhlbHM7Ci0gICAgaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0gICAgVWludDMyICpkc3RwID0gKFVpbnQzMiAqKSBpbmZvLT5kX3BpeGVsczsKLSAgICBpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLSAgICBTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLSAgICBpbnQgc3JjYnBwID0gc3JjZm10LT5CeXRlc1BlclBpeGVsOwotICAgIFNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OwotICAgIGludCBkc3RicHAgPSBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWw7Ci0gICAgaW50IGNvcHlfYWxwaGEgPSAoc3JjZm10LT5BbWFzayAmJiBkc3RmbXQtPkFtYXNrKTsKLQl1bnNpZ25lZCBhbHBoYSA9IGRzdGZtdC0+QW1hc2sgPyBzcmNmbXQtPmFscGhhIDogMDsKLSAgICBVaW50MzIgcmdibWFzayA9IHNyY2ZtdC0+Um1hc2sgfCBzcmNmbXQtPkdtYXNrIHwgc3JjZm10LT5CbWFzazsKLQlVaW50MzIgY2tleSA9IGluZm8tPnNyYy0+Y29sb3JrZXk7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGludCB2YWxwaGE7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnBlcm11dGU7Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnplcm87Ci0gICAgdmVjdG9yIHVuc2lnbmVkIGludCB2Y2tleTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZyZ2JtYXNrOwotICAgIHZwZXJtdXRlID0gY2FsY19zd2l6emxlMzIoc3JjZm10LCBkc3RmbXQpOwotICAgIGlmIChpbmZvLT5kX3dpZHRoIDwgMTYpIHsKLSAgICAgICAgaWYoY29weV9hbHBoYSkgewotICAgICAgICAgICAgQmxpdE50b05LZXlDb3B5QWxwaGEoaW5mbyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBCbGl0TnRvTktleShpbmZvKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHZ6ZXJvID0gdmVjX3NwbGF0X3U4KDApOwotICAgIGlmIChhbHBoYSkgewotICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikmdmFscGhhKVswXSA9ICh1bnNpZ25lZCBjaGFyKWFscGhhOwotICAgICAgICB2YWxwaGEgPSAodmVjdG9yIHVuc2lnbmVkIGludCl2ZWNfc3BsYXQoKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZhbHBoYSwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFscGhhID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpdnplcm87Ci0gICAgfQotICAgIGNrZXkgJj0gcmdibWFzazsKLSAgICAoKHVuc2lnbmVkIGludCAqKShjaGFyKikmdmNrZXkpWzBdID0gY2tleTsKLSAgICB2Y2tleSA9IHZlY19zcGxhdCh2Y2tleSwgMCk7Ci0gICAgKCh1bnNpZ25lZCBpbnQgKikoY2hhciopJnZyZ2JtYXNrKVswXSA9IHJnYm1hc2s7Ci0gICAgdnJnYm1hc2sgPSB2ZWNfc3BsYXQodnJnYm1hc2ssIDApOwotCi0gICAgd2hpbGUgKGhlaWdodC0tKSB7Ci0jZGVmaW5lIE9ORV9QSVhFTF9CTEVORChjb25kaXRpb24sIHdpZHRodmFyKSBcCi0gICAgICAgIGlmIChjb3B5X2FscGhhKSB7IFwKLSAgICAgICAgICAgIHdoaWxlIChjb25kaXRpb24pIHsgXAotICAgICAgICAgICAgICAgIFVpbnQzMiBQaXhlbDsgXAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNSLCBzRywgc0IsIHNBOyBcCi0gICAgICAgICAgICAgICAgRElTRU1CTEVfUkdCQSgoVWludDggKilzcmNwLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc1IsIHNHLCBzQiwgc0EpOyBcCi0gICAgICAgICAgICAgICAgaWYgKCAoUGl4ZWwgJiByZ2JtYXNrKSAhPSBja2V5ICkgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgQVNTRU1CTEVfUkdCQSgoVWludDggKilkc3RwLCBkc3RicHAsIGRzdGZtdCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNSLCBzRywgc0IsIHNBKTsgXAotICAgICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgICAgIGRzdHAgPSAoVWludDMyICopICgoKFVpbnQ4ICopIGRzdHApICsgZHN0YnBwKTsgXAotICAgICAgICAgICAgICAgIHNyY3AgPSAoVWludDMyICopICgoKFVpbnQ4ICopIHNyY3ApICsgc3JjYnBwKTsgXAotICAgICAgICAgICAgICAgIHdpZHRodmFyLS07IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICB9IGVsc2UgeyBcCi0gICAgICAgICAgICB3aGlsZSAoY29uZGl0aW9uKSB7IFwKLSAgICAgICAgICAgICAgICBVaW50MzIgUGl4ZWw7IFwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBzUiwgc0csIHNCOyBcCi0gICAgICAgICAgICAgICAgUkVUUklFVkVfUkdCX1BJWEVMKChVaW50OCAqKXNyY3AsIHNyY2JwcCwgUGl4ZWwpOyBcCi0gICAgICAgICAgICAgICAgaWYgKCBQaXhlbCAhPSBja2V5ICkgeyBcCi0gICAgICAgICAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKFBpeGVsLCBzcmNmbXQsIHNSLCBzRywgc0IpOyBcCi0gICAgICAgICAgICAgICAgICAgIEFTU0VNQkxFX1JHQkEoKFVpbnQ4ICopZHN0cCwgZHN0YnBwLCBkc3RmbXQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNSLCBzRywgc0IsIGFscGhhKTsgXAotICAgICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgICAgIGRzdHAgPSAoVWludDMyICopICgoKFVpbnQ4ICopZHN0cCkgKyBkc3RicHApOyBcCi0gICAgICAgICAgICAgICAgc3JjcCA9IChVaW50MzIgKikgKCgoVWludDggKilzcmNwKSArIHNyY2JwcCk7IFwKLSAgICAgICAgICAgICAgICB3aWR0aHZhci0tOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfQotICAgICAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotICAgICAgICBPTkVfUElYRUxfQkxFTkQoKFVOQUxJR05FRF9QVFIoZHN0cCkpICYmICh3aWR0aCksIHdpZHRoKTsKLSAgICAgICAgYXNzZXJ0KHdpZHRoID4gMCk7Ci0gICAgICAgIGlmICh3aWR0aCA+IDApIHsKLSAgICAgICAgICAgIGludCBleHRyYXdpZHRoID0gKHdpZHRoICUgNCk7Ci0gICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxpZ25lciA9IFZFQ19BTElHTkVSKHNyY3ApOwotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2cyA9IHZlY19sZCgwLCBzcmNwKTsKLSAgICAgICAgICAgIHdpZHRoIC09IGV4dHJhd2lkdGg7Ci0gICAgICAgICAgICBhc3NlcnQod2lkdGggPj0gNCk7Ci0gICAgICAgICAgICB3aGlsZSAod2lkdGgpIHsKLSAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c2VsOwotICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgdmQ7Ci0gICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2b3ZlcmZsb3cgPSB2ZWNfbGQoMTUsIHNyY3ApOwotICAgICAgICAgICAgICAgIC8qIGxvYWQgdGhlIHNvdXJjZSB2ZWMgKi8KLSAgICAgICAgICAgICAgICB2cyA9IHZlY19wZXJtKHZzLCB2b3ZlcmZsb3csIHZhbGlnbmVyKTsKLSAgICAgICAgICAgICAgICAvKiB2c2VsIGlzIHNldCBmb3IgaXRlbXMgdGhhdCBtYXRjaCB0aGUga2V5ICovCi0gICAgICAgICAgICAgICAgdnNlbCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfYW5kKHZzLCB2cmdibWFzayk7Ci0gICAgICAgICAgICAgICAgdnNlbCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfY21wZXEodnMsIHZja2V5KTsKLSAgICAgICAgICAgICAgICAvKiBwZXJtdXRlIHRoZSBzcmMgdmVjIHRvIHRoZSBkZXN0IGZvcm1hdCAqLwotICAgICAgICAgICAgICAgIHZzID0gdmVjX3Blcm0odnMsIHZhbHBoYSwgdnBlcm11dGUpOwotICAgICAgICAgICAgICAgIC8qIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHZlYyAqLwotICAgICAgICAgICAgICAgIHZkID0gdmVjX2xkKDAsIGRzdHApOwotICAgICAgICAgICAgICAgIC8qIHNlbGVjdCB0aGUgc291cmNlIGFuZCBkZXN0IGludG8gdnMgKi8KLSAgICAgICAgICAgICAgICB2ZCA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KXZlY19zZWwoKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZzLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmQsIHZzZWwpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHZlY19zdCh2ZCwgMCwgZHN0cCk7Ci0gICAgICAgICAgICAgICAgc3JjcCArPSA0OwotICAgICAgICAgICAgICAgIHdpZHRoIC09IDQ7Ci0gICAgICAgICAgICAgICAgZHN0cCArPSA0OwotICAgICAgICAgICAgICAgIHZzID0gdm92ZXJmbG93OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT05FX1BJWEVMX0JMRU5EKChleHRyYXdpZHRoKSwgZXh0cmF3aWR0aCk7Ci0jdW5kZWYgT05FX1BJWEVMX0JMRU5ECi0gICAgICAgICAgICBzcmNwICs9IHNyY3NraXAgPj4gMjsKLSAgICAgICAgICAgIGRzdHAgKz0gZHN0c2tpcCA+PiAyOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBBbHRpdmVjIGNvZGUgdG8gc3dpenpsZSBvbmUgMzItYml0IHN1cmZhY2UgdG8gYSBkaWZmZXJlbnQgMzItYml0IGZvcm1hdC4gKi8KLS8qIFVzZSB0aGlzIG9uIGEgRzUgKi8KLXN0YXRpYyB2b2lkIENvbnZlcnRBbHRpdmVjMzJ0bzMyX25vcHJlZmV0Y2goU0RMX0JsaXRJbmZvICppbmZvKQotewotICAgIGludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLSAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKikgaW5mby0+c19waXhlbHM7Ci0gICAgaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0gICAgVWludDMyICpkc3QgPSAoVWludDMyICopIGluZm8tPmRfcGl4ZWxzOwotICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotICAgIFNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOwotICAgIFNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OwotICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgdnplcm8gPSB2ZWNfc3BsYXRfdTMyKDApOwotICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZwZXJtdXRlID0gY2FsY19zd2l6emxlMzIoc3JjZm10LCBkc3RmbXQpOwotICAgIGlmIChkc3RmbXQtPkFtYXNrICYmICFzcmNmbXQtPkFtYXNrKSB7Ci0gICAgICAgIGlmIChzcmNmbXQtPmFscGhhKSB7Ci0gICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGE7Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikmdmFscGhhKVswXSA9IHNyY2ZtdC0+YWxwaGE7Ci0gICAgICAgICAgICB2emVybyA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KXZlY19zcGxhdCh2YWxwaGEsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXNzZXJ0KHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbCA9PSA0KTsKLSAgICBhc3NlcnQoZHN0Zm10LT5CeXRlc1BlclBpeGVsID09IDQpOwotCi0gICAgd2hpbGUgKGhlaWdodC0tKSB7Ci0gICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyOwotICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZiaXRzOwotICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZvdmVyZmxvdzsKLSAgICAgICAgVWludDMyIGJpdHM7Ci0gICAgICAgIFVpbnQ4IHIsIGcsIGIsIGE7Ci0KLSAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLSAgICAgICAgaW50IGV4dHJhd2lkdGg7Ci0KLSAgICAgICAgLyogZG8gc2NhbGFyIHVudGlsIHdlIGNhbiBhbGlnbi4uLiAqLwotICAgICAgICB3aGlsZSAoKFVOQUxJR05FRF9QVFIoZHN0KSkgJiYgKHdpZHRoKSkgewotICAgICAgICAgICAgYml0cyA9ICooc3JjKyspOwotICAgICAgICAgICAgUkdCQV9GUk9NXzg4ODgoYml0cywgc3JjZm10LCByLCBnLCBiLCBhKTsKLSAgICAgICAgICAgICooZHN0KyspID0gTUFLRTg4ODgoZHN0Zm10LCByLCBnLCBiLCBhKTsKLSAgICAgICAgICAgIHdpZHRoLS07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBZnRlciBhbGwgdGhhdCB3b3JrLCBoZXJlJ3MgdGhlIHZlY3RvciBwYXJ0ISAqLwotICAgICAgICBleHRyYXdpZHRoID0gKHdpZHRoICUgNCk7Ci0gICAgICAgIHdpZHRoIC09IGV4dHJhd2lkdGg7Ci0gICAgICAgIHZhbGlnbmVyID0gVkVDX0FMSUdORVIoc3JjKTsKLSAgICAgICAgdmJpdHMgPSB2ZWNfbGQoMCwgc3JjKTsKLQotICAgICAgIHdoaWxlICh3aWR0aCkgewotICAgICAgICAgICAgdm92ZXJmbG93ID0gdmVjX2xkKDE1LCBzcmMpOwotICAgICAgICAgICAgc3JjICs9IDQ7Ci0gICAgICAgICAgICB3aWR0aCAtPSA0OwotICAgICAgICAgICAgdmJpdHMgPSB2ZWNfcGVybSh2Yml0cywgdm92ZXJmbG93LCB2YWxpZ25lcik7ICAvKiBzcmMgaXMgcmVhZHkuICovCi0gICAgICAgICAgICB2Yml0cyA9IHZlY19wZXJtKHZiaXRzLCB2emVybywgdnBlcm11dGUpOyAgLyogc3dpenpsZSBpdC4gKi8KLSAgICAgICAgICAgIHZlY19zdCh2Yml0cywgMCwgZHN0KTsgIC8qIHN0b3JlIGl0IGJhY2sgb3V0LiAqLwotICAgICAgICAgICAgZHN0ICs9IDQ7Ci0gICAgICAgICAgICB2Yml0cyA9IHZvdmVyZmxvdzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCh3aWR0aCA9PSAwKTsKLQotICAgICAgICAvKiBjb3ZlciBwaXhlbHMgYXQgdGhlIGVuZCBvZiB0aGUgcm93IHRoYXQgZGlkbid0IGZpdCBpbiAxNiBieXRlcy4gKi8KLSAgICAgICAgd2hpbGUgKGV4dHJhd2lkdGgpIHsKLSAgICAgICAgICAgIGJpdHMgPSAqKHNyYysrKTsgIC8qIG1heCA3IHBpeGVscywgZG9uJ3QgYm90aGVyIHdpdGggcHJlZmV0Y2guICovCi0gICAgICAgICAgICBSR0JBX0ZST01fODg4OChiaXRzLCBzcmNmbXQsIHIsIGcsIGIsIGEpOwotICAgICAgICAgICAgKihkc3QrKykgPSBNQUtFODg4OChkc3RmbXQsIHIsIGcsIGIsIGEpOwotICAgICAgICAgICAgZXh0cmF3aWR0aC0tOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjICs9IHNyY3NraXAgPj4gMjsgIC8qIG1vdmUgdG8gbmV4dCByb3csIGFjY291bnRpbmcgZm9yIHBpdGNoLiAqLwotICAgICAgICBkc3QgKz0gZHN0c2tpcCA+PiAyOwotICAgIH0KLQotfQotCi0vKiBBbHRpdmVjIGNvZGUgdG8gc3dpenpsZSBvbmUgMzItYml0IHN1cmZhY2UgdG8gYSBkaWZmZXJlbnQgMzItYml0IGZvcm1hdC4gKi8KLS8qIFVzZSB0aGlzIG9uIGEgRzQgKi8KLXN0YXRpYyB2b2lkIENvbnZlcnRBbHRpdmVjMzJ0bzMyX3ByZWZldGNoKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLSAgICBjb25zdCBpbnQgc2NhbGFyX2RzdF9sZWFkID0gc2l6ZW9mIChVaW50MzIpICogNDsKLSAgICBjb25zdCBpbnQgdmVjdG9yX2RzdF9sZWFkID0gc2l6ZW9mIChVaW50MzIpICogMTY7Ci0KLSAgICBpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0gICAgVWludDMyICpzcmMgPSAoVWludDMyICopIGluZm8tPnNfcGl4ZWxzOwotICAgIGludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotICAgIFVpbnQzMiAqZHN0ID0gKFVpbnQzMiAqKSBpbmZvLT5kX3BpeGVsczsKLSAgICBpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLSAgICBTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLSAgICBTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKLSAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZ6ZXJvID0gdmVjX3NwbGF0X3UzMigwKTsKLSAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKHNyY2ZtdCwgZHN0Zm10KTsKLSAgICBpZiAoZHN0Zm10LT5BbWFzayAmJiAhc3JjZm10LT5BbWFzaykgewotICAgICAgICBpZiAoc3JjZm10LT5hbHBoYSkgewotICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhOwotICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopJnZhbHBoYSlbMF0gPSBzcmNmbXQtPmFscGhhOwotICAgICAgICAgICAgdnplcm8gPSAodmVjdG9yIHVuc2lnbmVkIGludCl2ZWNfc3BsYXQodmFscGhhLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGFzc2VydChzcmNmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gNCk7Ci0gICAgYXNzZXJ0KGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbCA9PSA0KTsKLQotICAgIHdoaWxlIChoZWlnaHQtLSkgewotICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxpZ25lcjsKLSAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2Yml0czsKLSAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2b3ZlcmZsb3c7Ci0gICAgICAgIFVpbnQzMiBiaXRzOwotICAgICAgICBVaW50OCByLCBnLCBiLCBhOwotCi0gICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0gICAgICAgIGludCBleHRyYXdpZHRoOwotCi0gICAgICAgIC8qIGRvIHNjYWxhciB1bnRpbCB3ZSBjYW4gYWxpZ24uLi4gKi8KLSAgICAgICAgd2hpbGUgKChVTkFMSUdORURfUFRSKGRzdCkpICYmICh3aWR0aCkpIHsKLSAgICAgICAgICAgIHZlY19kc3R0KHNyYytzY2FsYXJfZHN0X2xlYWQsIERTVF9DVFJMKDIsMzIsMTAyNCksIERTVF9DSEFOX1NSQyk7Ci0gICAgICAgICAgICB2ZWNfZHN0c3QoZHN0K3NjYWxhcl9kc3RfbGVhZCwgRFNUX0NUUkwoMiwzMiwxMDI0KSwgRFNUX0NIQU5fREVTVCk7Ci0gICAgICAgICAgICBiaXRzID0gKihzcmMrKyk7Ci0gICAgICAgICAgICBSR0JBX0ZST01fODg4OChiaXRzLCBzcmNmbXQsIHIsIGcsIGIsIGEpOwotICAgICAgICAgICAgKihkc3QrKykgPSBNQUtFODg4OChkc3RmbXQsIHIsIGcsIGIsIGEpOwotICAgICAgICAgICAgd2lkdGgtLTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFmdGVyIGFsbCB0aGF0IHdvcmssIGhlcmUncyB0aGUgdmVjdG9yIHBhcnQhICovCi0gICAgICAgIGV4dHJhd2lkdGggPSAod2lkdGggJSA0KTsKLSAgICAgICAgd2lkdGggLT0gZXh0cmF3aWR0aDsKLSAgICAgICAgdmFsaWduZXIgPSBWRUNfQUxJR05FUihzcmMpOwotICAgICAgICB2Yml0cyA9IHZlY19sZCgwLCBzcmMpOwotCi0gICAgICAgIHdoaWxlICh3aWR0aCkgewotICAgICAgICAgICAgdmVjX2RzdHQoc3JjK3ZlY3Rvcl9kc3RfbGVhZCwgRFNUX0NUUkwoMiwzMiwxMDI0KSwgRFNUX0NIQU5fU1JDKTsKLSAgICAgICAgICAgIHZlY19kc3RzdChkc3QrdmVjdG9yX2RzdF9sZWFkLCBEU1RfQ1RSTCgyLDMyLDEwMjQpLCBEU1RfQ0hBTl9ERVNUKTsKLSAgICAgICAgICAgIHZvdmVyZmxvdyA9IHZlY19sZCgxNSwgc3JjKTsKLSAgICAgICAgICAgIHNyYyArPSA0OwotICAgICAgICAgICAgd2lkdGggLT0gNDsKLSAgICAgICAgICAgIHZiaXRzID0gdmVjX3Blcm0odmJpdHMsIHZvdmVyZmxvdywgdmFsaWduZXIpOyAgLyogc3JjIGlzIHJlYWR5LiAqLwotICAgICAgICAgICAgdmJpdHMgPSB2ZWNfcGVybSh2Yml0cywgdnplcm8sIHZwZXJtdXRlKTsgIC8qIHN3aXp6bGUgaXQuICovCi0gICAgICAgICAgICB2ZWNfc3QodmJpdHMsIDAsIGRzdCk7ICAvKiBzdG9yZSBpdCBiYWNrIG91dC4gKi8KLSAgICAgICAgICAgIGRzdCArPSA0OwotICAgICAgICAgICAgdmJpdHMgPSB2b3ZlcmZsb3c7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCh3aWR0aCA9PSAwKTsKLQotICAgICAgICAvKiBjb3ZlciBwaXhlbHMgYXQgdGhlIGVuZCBvZiB0aGUgcm93IHRoYXQgZGlkbid0IGZpdCBpbiAxNiBieXRlcy4gKi8KLSAgICAgICAgd2hpbGUgKGV4dHJhd2lkdGgpIHsKLSAgICAgICAgICAgIGJpdHMgPSAqKHNyYysrKTsgIC8qIG1heCA3IHBpeGVscywgZG9uJ3QgYm90aGVyIHdpdGggcHJlZmV0Y2guICovCi0gICAgICAgICAgICBSR0JBX0ZST01fODg4OChiaXRzLCBzcmNmbXQsIHIsIGcsIGIsIGEpOwotICAgICAgICAgICAgKihkc3QrKykgPSBNQUtFODg4OChkc3RmbXQsIHIsIGcsIGIsIGEpOwotICAgICAgICAgICAgZXh0cmF3aWR0aC0tOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjICs9IHNyY3NraXAgPj4gMjsgIC8qIG1vdmUgdG8gbmV4dCByb3csIGFjY291bnRpbmcgZm9yIHBpdGNoLiAqLwotICAgICAgICBkc3QgKz0gZHN0c2tpcCA+PiAyOwotICAgIH0KLQotICAgIHZlY19kc3MoRFNUX0NIQU5fU1JDKTsKLSAgICB2ZWNfZHNzKERTVF9DSEFOX0RFU1QpOwotfQotCi1zdGF0aWMgVWludDMyIEdldEJsaXRGZWF0dXJlcyggdm9pZCApCi17Ci0gICAgc3RhdGljIFVpbnQzMiBmZWF0dXJlcyA9IDB4ZmZmZmZmZmY7Ci0gICAgaWYgKGZlYXR1cmVzID09IDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgLyogUHJvdmlkZSBhbiBvdmVycmlkZSBmb3IgdGVzdGluZyAuLiAqLwotICAgICAgICBjaGFyICpvdmVycmlkZSA9IFNETF9nZXRlbnYoIlNETF9BTFRJVkVDX0JMSVRfRkVBVFVSRVMiKTsKLSAgICAgICAgaWYgKG92ZXJyaWRlKSB7Ci0gICAgICAgICAgICBmZWF0dXJlcyA9IDA7Ci0gICAgICAgICAgICBTRExfc3NjYW5mKG92ZXJyaWRlLCAiJXUiLCAmZmVhdHVyZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmVhdHVyZXMgPSAoIDAKLSAgICAgICAgICAgICAgICAvKiBGZWF0dXJlIDEgaXMgaGFzLU1NWCAqLwotICAgICAgICAgICAgICAgIHwgKChTRExfSGFzTU1YKCkpID8gMSA6IDApCi0gICAgICAgICAgICAgICAgLyogRmVhdHVyZSAyIGlzIGhhcy1BbHRpVmVjICovCi0gICAgICAgICAgICAgICAgfCAoKFNETF9IYXNBbHRpVmVjKCkpID8gMiA6IDApCi0gICAgICAgICAgICAgICAgLyogRmVhdHVyZSA0IGlzIGRvbnQtdXNlLXByZWZldGNoICovCi0gICAgICAgICAgICAgICAgLyogISEhISBGSVhNRTogQ2hlY2sgZm9yIEc1IG9yIGxhdGVyLCBub3QgdGhlIGNhY2hlIHNpemUhIEFsd2F5cyBwcmVmZXRjaCBvbiBhIEc0LiAqLwotICAgICAgICAgICAgICAgIHwgKChHZXRMM0NhY2hlU2l6ZSgpID09IDApID8gNCA6IDApCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmZWF0dXJlczsKLX0KLSNpZiBfX01XRVJLU19fCi0jcHJhZ21hIGFsdGl2ZWNfbW9kZWwgb2ZmCi0jZW5kaWYKLSNlbHNlCi0vKiBGZWF0dXJlIDEgaXMgaGFzLU1NWCAqLwotI2RlZmluZSBHZXRCbGl0RmVhdHVyZXMoKSAoKFVpbnQzMikoU0RMX0hhc01NWCgpID8gMSA6IDApKQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgbm93IGVuZGlhbiBkZXBlbmRlbnQgKi8KLSNpZiBTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOCi0jZGVmaW5lIEhJCTEKLSNkZWZpbmUgTE8JMAotI2Vsc2UgLyogU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTiAqLwotI2RlZmluZSBISQkwCi0jZGVmaW5lIExPCTEKLSNlbmRpZgotCi0jaWYgU0RMX0hFUk1FU19CTElUVEVSUwotCi0vKiBIZWhlaGVoLCB3ZSBjb2VyY2UgSGVybWVzIGludG8gdXNpbmcgU0RMIGJsaXQgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgWDg2X0FTU0VNQkxFUgotI2RlZmluZSBIZXJtZXNDb252ZXJ0ZXJJbnRlcmZhY2UJU0RMX0JsaXRJbmZvCi0jZGVmaW5lIEhlcm1lc0NsZWFySW50ZXJmYWNlCQl2b2lkCi0jZGVmaW5lIFNUQUNLQ0FMTAotCi0jaW5jbHVkZSAiLi4vaGVybWVzL0hlYWRNTVguaCIKLSNpbmNsdWRlICIuLi9oZXJtZXMvSGVhZFg4Ni5oIgotCi0jZWxzZQotCi0vKiBTcGVjaWFsIG9wdGltaXplZCBibGl0IGZvciBSR0IgOC04LTggLS0+IFJHQiAzLTMtMiAqLwotI2RlZmluZSBSR0I4ODhfUkdCMzMyKGRzdCwgc3JjKSB7IFwKLQlkc3QgPSAoVWludDgpKCgoKHNyYykmMHgwMEUwMDAwMCk+PjE2KXwgXAotCSAgICAgICAgICAgICAgKCgoc3JjKSYweDAwMDBFMDAwKT4+MTEpfCBcCi0JICAgICAgICAgICAgICAoKChzcmMpJjB4MDAwMDAwQzApPj42KSk7IFwKLX0KLXN0YXRpYyB2b2lkIEJsaXRfUkdCODg4X2luZGV4OChTRExfQmxpdEluZm8gKmluZm8pCi17Ci0jaWZuZGVmIFVTRV9EVUZGU19MT09QCi0JaW50IGM7Ci0jZW5kaWYKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlVaW50MzIgKnNyYzsKLQljb25zdCBVaW50OCAqbWFwOwotCVVpbnQ4ICpkc3Q7Ci0JaW50IHNyY3NraXAsIGRzdHNraXA7Ci0KLQkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KLQl3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0Jc3JjID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOwotCXNyY3NraXAgPSBpbmZvLT5zX3NraXAvNDsKLQlkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCW1hcCA9IGluZm8tPnRhYmxlOwotCi0JaWYgKCBtYXAgPT0gTlVMTCApIHsKLQkJd2hpbGUgKCBoZWlnaHQtLSApIHsKLSNpZmRlZiBVU0VfRFVGRlNfTE9PUAotCQkJRFVGRlNfTE9PUCgKLQkJCQlSR0I4ODhfUkdCMzMyKCpkc3QrKywgKnNyYyk7Ci0JCQksIHdpZHRoKTsKLSNlbHNlCi0JCQlmb3IgKCBjPXdpZHRoLzQ7IGM7IC0tYyApIHsKLQkJCQkvKiBQYWNrIFJHQiBpbnRvIDhiaXQgcGl4ZWwgKi8KLQkJCQkrK3NyYzsKLQkJCQlSR0I4ODhfUkdCMzMyKCpkc3QrKywgKnNyYyk7Ci0JCQkJKytzcmM7Ci0JCQkJUkdCODg4X1JHQjMzMigqZHN0KyssICpzcmMpOwotCQkJCSsrc3JjOwotCQkJCVJHQjg4OF9SR0IzMzIoKmRzdCsrLCAqc3JjKTsKLQkJCQkrK3NyYzsKLQkJCX0KLQkJCXN3aXRjaCAoIHdpZHRoICYgMyApIHsKLQkJCQljYXNlIDM6Ci0JCQkJCVJHQjg4OF9SR0IzMzIoKmRzdCsrLCAqc3JjKTsKLQkJCQkJKytzcmM7Ci0JCQkJY2FzZSAyOgotCQkJCQlSR0I4ODhfUkdCMzMyKCpkc3QrKywgKnNyYyk7Ci0JCQkJCSsrc3JjOwotCQkJCWNhc2UgMToKLQkJCQkJUkdCODg4X1JHQjMzMigqZHN0KyssICpzcmMpOwotCQkJCQkrK3NyYzsKLQkJCX0KLSNlbmRpZiAvKiBVU0VfRFVGRlNfTE9PUCAqLwotCQkJc3JjICs9IHNyY3NraXA7Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCX0gZWxzZSB7Ci0JCWludCBQaXhlbDsKLQotCQl3aGlsZSAoIGhlaWdodC0tICkgewotI2lmZGVmIFVTRV9EVUZGU19MT09QCi0JCQlEVUZGU19MT09QKAotCQkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOwotCQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07Ci0JCQkJKytzcmM7Ci0JCQksIHdpZHRoKTsKLSNlbHNlCi0JCQlmb3IgKCBjPXdpZHRoLzQ7IGM7IC0tYyApIHsKLQkJCQkvKiBQYWNrIFJHQiBpbnRvIDhiaXQgcGl4ZWwgKi8KLQkJCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKLQkJCQkqZHN0KysgPSBtYXBbUGl4ZWxdOwotCQkJCSsrc3JjOwotCQkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOwotCQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07Ci0JCQkJKytzcmM7Ci0JCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7Ci0JCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKLQkJCQkrK3NyYzsKLQkJCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKLQkJCQkqZHN0KysgPSBtYXBbUGl4ZWxdOwotCQkJCSsrc3JjOwotCQkJfQotCQkJc3dpdGNoICggd2lkdGggJiAzICkgewotCQkJCWNhc2UgMzoKLQkJCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7Ci0JCQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07Ci0JCQkJCSsrc3JjOwotCQkJCWNhc2UgMjoKLQkJCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7Ci0JCQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07Ci0JCQkJCSsrc3JjOwotCQkJCWNhc2UgMToKLQkJCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7Ci0JCQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07Ci0JCQkJCSsrc3JjOwotCQkJfQotI2VuZGlmIC8qIFVTRV9EVUZGU19MT09QICovCi0JCQlzcmMgKz0gc3Jjc2tpcDsKLQkJCWRzdCArPSBkc3Rza2lwOwotCQl9Ci0JfQotfQotLyogU3BlY2lhbCBvcHRpbWl6ZWQgYmxpdCBmb3IgUkdCIDgtOC04IC0tPiBSR0IgNS01LTUgKi8KLSNkZWZpbmUgUkdCODg4X1JHQjU1NShkc3QsIHNyYykgeyBcCi0JKihVaW50MTYgKikoZHN0KSA9IChVaW50MTYpKCgoKCpzcmMpJjB4MDBGODAwMDApPj45KXwgXAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgqc3JjKSYweDAwMDBGODAwKT4+Nil8IFwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKnNyYykmMHgwMDAwMDBGOCk+PjMpKTsgXAotfQotI2RlZmluZSBSR0I4ODhfUkdCNTU1X1RXTyhkc3QsIHNyYykgeyBcCi0JKihVaW50MzIgKikoZHN0KSA9ICgoKCgoc3JjW0hJXSkmMHgwMEY4MDAwMCk+PjkpfCBcCi0JICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0hJXSkmMHgwMDAwRjgwMCk+PjYpfCBcCi0JICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0hJXSkmMHgwMDAwMDBGOCk+PjMpKTw8MTYpfCBcCi0JICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0xPXSkmMHgwMEY4MDAwMCk+PjkpfCBcCi0JICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0xPXSkmMHgwMDAwRjgwMCk+PjYpfCBcCi0JICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0xPXSkmMHgwMDAwMDBGOCk+PjMpOyBcCi19Ci1zdGF0aWMgdm9pZCBCbGl0X1JHQjg4OF9SR0I1NTUoU0RMX0JsaXRJbmZvICppbmZvKQotewotI2lmbmRlZiBVU0VfRFVGRlNfTE9PUAotCWludCBjOwotI2VuZGlmCi0JaW50IHdpZHRoLCBoZWlnaHQ7Ci0JVWludDMyICpzcmM7Ci0JVWludDE2ICpkc3Q7Ci0JaW50IHNyY3NraXAsIGRzdHNraXA7Ci0KLQkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KLQl3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0Jc3JjID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOwotCXNyY3NraXAgPSBpbmZvLT5zX3NraXAvNDsKLQlkc3QgPSAoVWludDE2ICopaW5mby0+ZF9waXhlbHM7Ci0JZHN0c2tpcCA9IGluZm8tPmRfc2tpcC8yOwotCi0jaWZkZWYgVVNFX0RVRkZTX0xPT1AKLQl3aGlsZSAoIGhlaWdodC0tICkgewotCQlEVUZGU19MT09QKAotCQkJUkdCODg4X1JHQjU1NShkc3QsIHNyYyk7Ci0JCQkrK3NyYzsKLQkJCSsrZHN0OwotCQksIHdpZHRoKTsKLQkJc3JjICs9IHNyY3NraXA7Ci0JCWRzdCArPSBkc3Rza2lwOwotCX0KLSNlbHNlCi0JLyogTWVtb3J5IGFsaWduIGF0IDQtYnl0ZSBib3VuZGFyeSwgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCAobG9uZylkc3QgJiAweDAzICkgewotCQkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3aWR0aCBpcyAwICovCi0JCWlmICggd2lkdGggPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQktLXdpZHRoOwotCi0JCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JCQkvKiBQZXJmb3JtIGNvcHkgYWxpZ25tZW50ICovCi0JCQlSR0I4ODhfUkdCNTU1KGRzdCwgc3JjKTsKLQkJCSsrc3JjOwotCQkJKytkc3Q7Ci0KLQkJCS8qIENvcHkgaW4gNCBwaXhlbCBjaHVua3MgKi8KLQkJCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgewotCQkJCVJHQjg4OF9SR0I1NTVfVFdPKGRzdCwgc3JjKTsKLQkJCQlzcmMgKz0gMjsKLQkJCQlkc3QgKz0gMjsKLQkJCQlSR0I4ODhfUkdCNTU1X1RXTyhkc3QsIHNyYyk7Ci0JCQkJc3JjICs9IDI7Ci0JCQkJZHN0ICs9IDI7Ci0JCQl9Ci0JCQkvKiBHZXQgYW55IGxlZnRvdmVycyAqLwotCQkJc3dpdGNoICh3aWR0aCAmIDMpIHsKLQkJCQljYXNlIDM6Ci0JCQkJCVJHQjg4OF9SR0I1NTUoZHN0LCBzcmMpOwotCQkJCQkrK3NyYzsKLQkJCQkJKytkc3Q7Ci0JCQkJY2FzZSAyOgotCQkJCQlSR0I4ODhfUkdCNTU1X1RXTyhkc3QsIHNyYyk7Ci0JCQkJCXNyYyArPSAyOwotCQkJCQlkc3QgKz0gMjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQlSR0I4ODhfUkdCNTU1KGRzdCwgc3JjKTsKLQkJCQkJKytzcmM7Ci0JCQkJCSsrZHN0OwotCQkJCQlicmVhazsKLQkJCX0KLQkJCXNyYyArPSBzcmNza2lwOwotCQkJZHN0ICs9IGRzdHNraXA7Ci0JCX0KLQl9IGVsc2UgeyAKLQkJd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJCS8qIENvcHkgaW4gNCBwaXhlbCBjaHVua3MgKi8KLQkJCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgewotCQkJCVJHQjg4OF9SR0I1NTVfVFdPKGRzdCwgc3JjKTsKLQkJCQlzcmMgKz0gMjsKLQkJCQlkc3QgKz0gMjsKLQkJCQlSR0I4ODhfUkdCNTU1X1RXTyhkc3QsIHNyYyk7Ci0JCQkJc3JjICs9IDI7Ci0JCQkJZHN0ICs9IDI7Ci0JCQl9Ci0JCQkvKiBHZXQgYW55IGxlZnRvdmVycyAqLwotCQkJc3dpdGNoICh3aWR0aCAmIDMpIHsKLQkJCQljYXNlIDM6Ci0JCQkJCVJHQjg4OF9SR0I1NTUoZHN0LCBzcmMpOwotCQkJCQkrK3NyYzsKLQkJCQkJKytkc3Q7Ci0JCQkJY2FzZSAyOgotCQkJCQlSR0I4ODhfUkdCNTU1X1RXTyhkc3QsIHNyYyk7Ci0JCQkJCXNyYyArPSAyOwotCQkJCQlkc3QgKz0gMjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQlSR0I4ODhfUkdCNTU1KGRzdCwgc3JjKTsKLQkJCQkJKytzcmM7Ci0JCQkJCSsrZHN0OwotCQkJCQlicmVhazsKLQkJCX0KLQkJCXNyYyArPSBzcmNza2lwOwotCQkJZHN0ICs9IGRzdHNraXA7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogVVNFX0RVRkZTX0xPT1AgKi8KLX0KLS8qIFNwZWNpYWwgb3B0aW1pemVkIGJsaXQgZm9yIFJHQiA4LTgtOCAtLT4gUkdCIDUtNi01ICovCi0jZGVmaW5lIFJHQjg4OF9SR0I1NjUoZHN0LCBzcmMpIHsgXAotCSooVWludDE2ICopKGRzdCkgPSAoVWludDE2KSgoKCgqc3JjKSYweDAwRjgwMDAwKT4+OCl8IFwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKnNyYykmMHgwMDAwRkMwMCk+PjUpfCBcCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCpzcmMpJjB4MDAwMDAwRjgpPj4zKSk7IFwKLX0KLSNkZWZpbmUgUkdCODg4X1JHQjU2NV9UV08oZHN0LCBzcmMpIHsgXAotCSooVWludDMyICopKGRzdCkgPSAoKCgoKHNyY1tISV0pJjB4MDBGODAwMDApPj44KXwgXAotCSAgICAgICAgICAgICAgICAgICAgICgoKHNyY1tISV0pJjB4MDAwMEZDMDApPj41KXwgXAotCSAgICAgICAgICAgICAgICAgICAgICgoKHNyY1tISV0pJjB4MDAwMDAwRjgpPj4zKSk8PDE2KXwgXAotCSAgICAgICAgICAgICAgICAgICAgICgoKHNyY1tMT10pJjB4MDBGODAwMDApPj44KXwgXAotCSAgICAgICAgICAgICAgICAgICAgICgoKHNyY1tMT10pJjB4MDAwMEZDMDApPj41KXwgXAotCSAgICAgICAgICAgICAgICAgICAgICgoKHNyY1tMT10pJjB4MDAwMDAwRjgpPj4zKTsgXAotfQotc3RhdGljIHZvaWQgQmxpdF9SR0I4ODhfUkdCNTY1KFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLSNpZm5kZWYgVVNFX0RVRkZTX0xPT1AKLQlpbnQgYzsKLSNlbmRpZgotCWludCB3aWR0aCwgaGVpZ2h0OwotCVVpbnQzMiAqc3JjOwotCVVpbnQxNiAqZHN0OwotCWludCBzcmNza2lwLCBkc3Rza2lwOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCXNyYyA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKLQlzcmNza2lwID0gaW5mby0+c19za2lwLzQ7Ci0JZHN0ID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOwotCWRzdHNraXAgPSBpbmZvLT5kX3NraXAvMjsKLQotI2lmZGVmIFVTRV9EVUZGU19MT09QCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJRFVGRlNfTE9PUCgKLQkJCVJHQjg4OF9SR0I1NjUoZHN0LCBzcmMpOwotCQkJKytzcmM7Ci0JCQkrK2RzdDsKLQkJLCB3aWR0aCk7Ci0JCXNyYyArPSBzcmNza2lwOwotCQlkc3QgKz0gZHN0c2tpcDsKLQl9Ci0jZWxzZQotCS8qIE1lbW9yeSBhbGlnbiBhdCA0LWJ5dGUgYm91bmRhcnksIGlmIG5lY2Vzc2FyeSAqLwotCWlmICggKGxvbmcpZHN0ICYgMHgwMyApIHsKLQkJLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2lkdGggaXMgMCAqLwotCQlpZiAoIHdpZHRoID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLS13aWR0aDsKLQotCQl3aGlsZSAoIGhlaWdodC0tICkgewotCQkJLyogUGVyZm9ybSBjb3B5IGFsaWdubWVudCAqLwotCQkJUkdCODg4X1JHQjU2NShkc3QsIHNyYyk7Ci0JCQkrK3NyYzsKLQkJCSsrZHN0OwotCi0JCQkvKiBDb3B5IGluIDQgcGl4ZWwgY2h1bmtzICovCi0JCQlmb3IgKCBjPXdpZHRoLzQ7IGM7IC0tYyApIHsKLQkJCQlSR0I4ODhfUkdCNTY1X1RXTyhkc3QsIHNyYyk7Ci0JCQkJc3JjICs9IDI7Ci0JCQkJZHN0ICs9IDI7Ci0JCQkJUkdCODg4X1JHQjU2NV9UV08oZHN0LCBzcmMpOwotCQkJCXNyYyArPSAyOwotCQkJCWRzdCArPSAyOwotCQkJfQotCQkJLyogR2V0IGFueSBsZWZ0b3ZlcnMgKi8KLQkJCXN3aXRjaCAod2lkdGggJiAzKSB7Ci0JCQkJY2FzZSAzOgotCQkJCQlSR0I4ODhfUkdCNTY1KGRzdCwgc3JjKTsKLQkJCQkJKytzcmM7Ci0JCQkJCSsrZHN0OwotCQkJCWNhc2UgMjoKLQkJCQkJUkdCODg4X1JHQjU2NV9UV08oZHN0LCBzcmMpOwotCQkJCQlzcmMgKz0gMjsKLQkJCQkJZHN0ICs9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJUkdCODg4X1JHQjU2NShkc3QsIHNyYyk7Ci0JCQkJCSsrc3JjOwotCQkJCQkrK2RzdDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzcmMgKz0gc3Jjc2tpcDsKLQkJCWRzdCArPSBkc3Rza2lwOwotCQl9Ci0JfSBlbHNlIHsgCi0JCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JCQkvKiBDb3B5IGluIDQgcGl4ZWwgY2h1bmtzICovCi0JCQlmb3IgKCBjPXdpZHRoLzQ7IGM7IC0tYyApIHsKLQkJCQlSR0I4ODhfUkdCNTY1X1RXTyhkc3QsIHNyYyk7Ci0JCQkJc3JjICs9IDI7Ci0JCQkJZHN0ICs9IDI7Ci0JCQkJUkdCODg4X1JHQjU2NV9UV08oZHN0LCBzcmMpOwotCQkJCXNyYyArPSAyOwotCQkJCWRzdCArPSAyOwotCQkJfQotCQkJLyogR2V0IGFueSBsZWZ0b3ZlcnMgKi8KLQkJCXN3aXRjaCAod2lkdGggJiAzKSB7Ci0JCQkJY2FzZSAzOgotCQkJCQlSR0I4ODhfUkdCNTY1KGRzdCwgc3JjKTsKLQkJCQkJKytzcmM7Ci0JCQkJCSsrZHN0OwotCQkJCWNhc2UgMjoKLQkJCQkJUkdCODg4X1JHQjU2NV9UV08oZHN0LCBzcmMpOwotCQkJCQlzcmMgKz0gMjsKLQkJCQkJZHN0ICs9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJUkdCODg4X1JHQjU2NShkc3QsIHNyYyk7Ci0JCQkJCSsrc3JjOwotCQkJCQkrK2RzdDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzcmMgKz0gc3Jjc2tpcDsKLQkJCWRzdCArPSBkc3Rza2lwOwotCQl9Ci0JfQotI2VuZGlmIC8qIFVTRV9EVUZGU19MT09QICovCi19Ci0KLSNlbmRpZiAvKiBTRExfSEVSTUVTX0JMSVRURVJTICovCi0KLQotLyogU3BlY2lhbCBvcHRpbWl6ZWQgYmxpdCBmb3IgUkdCIDUtNi01IC0tPiAzMi1iaXQgUkdCIHN1cmZhY2VzICovCi0jZGVmaW5lIFJHQjU2NV8zMihkc3QsIHNyYywgbWFwKSAobWFwW3NyY1tMT10qMl0gKyBtYXBbc3JjW0hJXSoyKzFdKQotc3RhdGljIHZvaWQgQmxpdF9SR0I1NjVfMzIoU0RMX0JsaXRJbmZvICppbmZvLCBjb25zdCBVaW50MzIgKm1hcCkKLXsKLSNpZm5kZWYgVVNFX0RVRkZTX0xPT1AKLQlpbnQgYzsKLSNlbmRpZgotCWludCB3aWR0aCwgaGVpZ2h0OwotCVVpbnQ4ICpzcmM7Ci0JVWludDMyICpkc3Q7Ci0JaW50IHNyY3NraXAsIGRzdHNraXA7Ci0KLQkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KLQl3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0Jc3JjID0gKFVpbnQ4ICopaW5mby0+c19waXhlbHM7Ci0Jc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlkc3QgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7Ci0JZHN0c2tpcCA9IGluZm8tPmRfc2tpcC80OwotCi0jaWZkZWYgVVNFX0RVRkZTX0xPT1AKLQl3aGlsZSAoIGhlaWdodC0tICkgewotCQlEVUZGU19MT09QKAotCQl7Ci0JCQkqZHN0KysgPSBSR0I1NjVfMzIoZHN0LCBzcmMsIG1hcCk7Ci0JCQlzcmMgKz0gMjsKLQkJfSwKLQkJd2lkdGgpOwotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotI2Vsc2UKLQl3aGlsZSAoIGhlaWdodC0tICkgewotCQkvKiBDb3B5IGluIDQgcGl4ZWwgY2h1bmtzICovCi0JCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgewotCQkJKmRzdCsrID0gUkdCNTY1XzMyKGRzdCwgc3JjLCBtYXApOwotCQkJc3JjICs9IDI7Ci0JCQkqZHN0KysgPSBSR0I1NjVfMzIoZHN0LCBzcmMsIG1hcCk7Ci0JCQlzcmMgKz0gMjsKLQkJCSpkc3QrKyA9IFJHQjU2NV8zMihkc3QsIHNyYywgbWFwKTsKLQkJCXNyYyArPSAyOwotCQkJKmRzdCsrID0gUkdCNTY1XzMyKGRzdCwgc3JjLCBtYXApOwotCQkJc3JjICs9IDI7Ci0JCX0KLQkJLyogR2V0IGFueSBsZWZ0b3ZlcnMgKi8KLQkJc3dpdGNoICh3aWR0aCAmIDMpIHsKLQkJCWNhc2UgMzoKLQkJCQkqZHN0KysgPSBSR0I1NjVfMzIoZHN0LCBzcmMsIG1hcCk7Ci0JCQkJc3JjICs9IDI7Ci0JCQljYXNlIDI6Ci0JCQkJKmRzdCsrID0gUkdCNTY1XzMyKGRzdCwgc3JjLCBtYXApOwotCQkJCXNyYyArPSAyOwotCQkJY2FzZSAxOgotCQkJCSpkc3QrKyA9IFJHQjU2NV8zMihkc3QsIHNyYywgbWFwKTsKLQkJCQlzcmMgKz0gMjsKLQkJCQlicmVhazsKLQkJfQotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotI2VuZGlmIC8qIFVTRV9EVUZGU19MT09QICovCi19Ci0KLS8qIFNwZWNpYWwgb3B0aW1pemVkIGJsaXQgZm9yIFJHQiA1LTYtNSAtLT4gQVJHQiA4LTgtOC04ICovCi1zdGF0aWMgY29uc3QgVWludDMyIFJHQjU2NV9BUkdCODg4OF9MVVRbNTEyXSA9IHsKLQkJMHgwMDAwMDAwMCwgMHhmZjAwMDAwMCwgMHgwMDAwMDAwOCwgMHhmZjAwMjAwMCwKLQkJMHgwMDAwMDAxMCwgMHhmZjAwNDAwMCwgMHgwMDAwMDAxOCwgMHhmZjAwNjEwMCwKLQkJMHgwMDAwMDAyMCwgMHhmZjAwODEwMCwgMHgwMDAwMDAyOSwgMHhmZjAwYTEwMCwKLQkJMHgwMDAwMDAzMSwgMHhmZjAwYzIwMCwgMHgwMDAwMDAzOSwgMHhmZjAwZTIwMCwKLQkJMHgwMDAwMDA0MSwgMHhmZjA4MDAwMCwgMHgwMDAwMDA0YSwgMHhmZjA4MjAwMCwKLQkJMHgwMDAwMDA1MiwgMHhmZjA4NDAwMCwgMHgwMDAwMDA1YSwgMHhmZjA4NjEwMCwKLQkJMHgwMDAwMDA2MiwgMHhmZjA4ODEwMCwgMHgwMDAwMDA2YSwgMHhmZjA4YTEwMCwKLQkJMHgwMDAwMDA3MywgMHhmZjA4YzIwMCwgMHgwMDAwMDA3YiwgMHhmZjA4ZTIwMCwKLQkJMHgwMDAwMDA4MywgMHhmZjEwMDAwMCwgMHgwMDAwMDA4YiwgMHhmZjEwMjAwMCwKLQkJMHgwMDAwMDA5NCwgMHhmZjEwNDAwMCwgMHgwMDAwMDA5YywgMHhmZjEwNjEwMCwKLQkJMHgwMDAwMDBhNCwgMHhmZjEwODEwMCwgMHgwMDAwMDBhYywgMHhmZjEwYTEwMCwKLQkJMHgwMDAwMDBiNCwgMHhmZjEwYzIwMCwgMHgwMDAwMDBiZCwgMHhmZjEwZTIwMCwKLQkJMHgwMDAwMDBjNSwgMHhmZjE4MDAwMCwgMHgwMDAwMDBjZCwgMHhmZjE4MjAwMCwKLQkJMHgwMDAwMDBkNSwgMHhmZjE4NDAwMCwgMHgwMDAwMDBkZSwgMHhmZjE4NjEwMCwKLQkJMHgwMDAwMDBlNiwgMHhmZjE4ODEwMCwgMHgwMDAwMDBlZSwgMHhmZjE4YTEwMCwKLQkJMHgwMDAwMDBmNiwgMHhmZjE4YzIwMCwgMHgwMDAwMDBmZiwgMHhmZjE4ZTIwMCwKLQkJMHgwMDAwMDQwMCwgMHhmZjIwMDAwMCwgMHgwMDAwMDQwOCwgMHhmZjIwMjAwMCwKLQkJMHgwMDAwMDQxMCwgMHhmZjIwNDAwMCwgMHgwMDAwMDQxOCwgMHhmZjIwNjEwMCwKLQkJMHgwMDAwMDQyMCwgMHhmZjIwODEwMCwgMHgwMDAwMDQyOSwgMHhmZjIwYTEwMCwKLQkJMHgwMDAwMDQzMSwgMHhmZjIwYzIwMCwgMHgwMDAwMDQzOSwgMHhmZjIwZTIwMCwKLQkJMHgwMDAwMDQ0MSwgMHhmZjI5MDAwMCwgMHgwMDAwMDQ0YSwgMHhmZjI5MjAwMCwKLQkJMHgwMDAwMDQ1MiwgMHhmZjI5NDAwMCwgMHgwMDAwMDQ1YSwgMHhmZjI5NjEwMCwKLQkJMHgwMDAwMDQ2MiwgMHhmZjI5ODEwMCwgMHgwMDAwMDQ2YSwgMHhmZjI5YTEwMCwKLQkJMHgwMDAwMDQ3MywgMHhmZjI5YzIwMCwgMHgwMDAwMDQ3YiwgMHhmZjI5ZTIwMCwKLQkJMHgwMDAwMDQ4MywgMHhmZjMxMDAwMCwgMHgwMDAwMDQ4YiwgMHhmZjMxMjAwMCwKLQkJMHgwMDAwMDQ5NCwgMHhmZjMxNDAwMCwgMHgwMDAwMDQ5YywgMHhmZjMxNjEwMCwKLQkJMHgwMDAwMDRhNCwgMHhmZjMxODEwMCwgMHgwMDAwMDRhYywgMHhmZjMxYTEwMCwKLQkJMHgwMDAwMDRiNCwgMHhmZjMxYzIwMCwgMHgwMDAwMDRiZCwgMHhmZjMxZTIwMCwKLQkJMHgwMDAwMDRjNSwgMHhmZjM5MDAwMCwgMHgwMDAwMDRjZCwgMHhmZjM5MjAwMCwKLQkJMHgwMDAwMDRkNSwgMHhmZjM5NDAwMCwgMHgwMDAwMDRkZSwgMHhmZjM5NjEwMCwKLQkJMHgwMDAwMDRlNiwgMHhmZjM5ODEwMCwgMHgwMDAwMDRlZSwgMHhmZjM5YTEwMCwKLQkJMHgwMDAwMDRmNiwgMHhmZjM5YzIwMCwgMHgwMDAwMDRmZiwgMHhmZjM5ZTIwMCwKLQkJMHgwMDAwMDgwMCwgMHhmZjQxMDAwMCwgMHgwMDAwMDgwOCwgMHhmZjQxMjAwMCwKLQkJMHgwMDAwMDgxMCwgMHhmZjQxNDAwMCwgMHgwMDAwMDgxOCwgMHhmZjQxNjEwMCwKLQkJMHgwMDAwMDgyMCwgMHhmZjQxODEwMCwgMHgwMDAwMDgyOSwgMHhmZjQxYTEwMCwKLQkJMHgwMDAwMDgzMSwgMHhmZjQxYzIwMCwgMHgwMDAwMDgzOSwgMHhmZjQxZTIwMCwKLQkJMHgwMDAwMDg0MSwgMHhmZjRhMDAwMCwgMHgwMDAwMDg0YSwgMHhmZjRhMjAwMCwKLQkJMHgwMDAwMDg1MiwgMHhmZjRhNDAwMCwgMHgwMDAwMDg1YSwgMHhmZjRhNjEwMCwKLQkJMHgwMDAwMDg2MiwgMHhmZjRhODEwMCwgMHgwMDAwMDg2YSwgMHhmZjRhYTEwMCwKLQkJMHgwMDAwMDg3MywgMHhmZjRhYzIwMCwgMHgwMDAwMDg3YiwgMHhmZjRhZTIwMCwKLQkJMHgwMDAwMDg4MywgMHhmZjUyMDAwMCwgMHgwMDAwMDg4YiwgMHhmZjUyMjAwMCwKLQkJMHgwMDAwMDg5NCwgMHhmZjUyNDAwMCwgMHgwMDAwMDg5YywgMHhmZjUyNjEwMCwKLQkJMHgwMDAwMDhhNCwgMHhmZjUyODEwMCwgMHgwMDAwMDhhYywgMHhmZjUyYTEwMCwKLQkJMHgwMDAwMDhiNCwgMHhmZjUyYzIwMCwgMHgwMDAwMDhiZCwgMHhmZjUyZTIwMCwKLQkJMHgwMDAwMDhjNSwgMHhmZjVhMDAwMCwgMHgwMDAwMDhjZCwgMHhmZjVhMjAwMCwKLQkJMHgwMDAwMDhkNSwgMHhmZjVhNDAwMCwgMHgwMDAwMDhkZSwgMHhmZjVhNjEwMCwKLQkJMHgwMDAwMDhlNiwgMHhmZjVhODEwMCwgMHgwMDAwMDhlZSwgMHhmZjVhYTEwMCwKLQkJMHgwMDAwMDhmNiwgMHhmZjVhYzIwMCwgMHgwMDAwMDhmZiwgMHhmZjVhZTIwMCwKLQkJMHgwMDAwMGMwMCwgMHhmZjYyMDAwMCwgMHgwMDAwMGMwOCwgMHhmZjYyMjAwMCwKLQkJMHgwMDAwMGMxMCwgMHhmZjYyNDAwMCwgMHgwMDAwMGMxOCwgMHhmZjYyNjEwMCwKLQkJMHgwMDAwMGMyMCwgMHhmZjYyODEwMCwgMHgwMDAwMGMyOSwgMHhmZjYyYTEwMCwKLQkJMHgwMDAwMGMzMSwgMHhmZjYyYzIwMCwgMHgwMDAwMGMzOSwgMHhmZjYyZTIwMCwKLQkJMHgwMDAwMGM0MSwgMHhmZjZhMDAwMCwgMHgwMDAwMGM0YSwgMHhmZjZhMjAwMCwKLQkJMHgwMDAwMGM1MiwgMHhmZjZhNDAwMCwgMHgwMDAwMGM1YSwgMHhmZjZhNjEwMCwKLQkJMHgwMDAwMGM2MiwgMHhmZjZhODEwMCwgMHgwMDAwMGM2YSwgMHhmZjZhYTEwMCwKLQkJMHgwMDAwMGM3MywgMHhmZjZhYzIwMCwgMHgwMDAwMGM3YiwgMHhmZjZhZTIwMCwKLQkJMHgwMDAwMGM4MywgMHhmZjczMDAwMCwgMHgwMDAwMGM4YiwgMHhmZjczMjAwMCwKLQkJMHgwMDAwMGM5NCwgMHhmZjczNDAwMCwgMHgwMDAwMGM5YywgMHhmZjczNjEwMCwKLQkJMHgwMDAwMGNhNCwgMHhmZjczODEwMCwgMHgwMDAwMGNhYywgMHhmZjczYTEwMCwKLQkJMHgwMDAwMGNiNCwgMHhmZjczYzIwMCwgMHgwMDAwMGNiZCwgMHhmZjczZTIwMCwKLQkJMHgwMDAwMGNjNSwgMHhmZjdiMDAwMCwgMHgwMDAwMGNjZCwgMHhmZjdiMjAwMCwKLQkJMHgwMDAwMGNkNSwgMHhmZjdiNDAwMCwgMHgwMDAwMGNkZSwgMHhmZjdiNjEwMCwKLQkJMHgwMDAwMGNlNiwgMHhmZjdiODEwMCwgMHgwMDAwMGNlZSwgMHhmZjdiYTEwMCwKLQkJMHgwMDAwMGNmNiwgMHhmZjdiYzIwMCwgMHgwMDAwMGNmZiwgMHhmZjdiZTIwMCwKLQkJMHgwMDAwMTAwMCwgMHhmZjgzMDAwMCwgMHgwMDAwMTAwOCwgMHhmZjgzMjAwMCwKLQkJMHgwMDAwMTAxMCwgMHhmZjgzNDAwMCwgMHgwMDAwMTAxOCwgMHhmZjgzNjEwMCwKLQkJMHgwMDAwMTAyMCwgMHhmZjgzODEwMCwgMHgwMDAwMTAyOSwgMHhmZjgzYTEwMCwKLQkJMHgwMDAwMTAzMSwgMHhmZjgzYzIwMCwgMHgwMDAwMTAzOSwgMHhmZjgzZTIwMCwKLQkJMHgwMDAwMTA0MSwgMHhmZjhiMDAwMCwgMHgwMDAwMTA0YSwgMHhmZjhiMjAwMCwKLQkJMHgwMDAwMTA1MiwgMHhmZjhiNDAwMCwgMHgwMDAwMTA1YSwgMHhmZjhiNjEwMCwKLQkJMHgwMDAwMTA2MiwgMHhmZjhiODEwMCwgMHgwMDAwMTA2YSwgMHhmZjhiYTEwMCwKLQkJMHgwMDAwMTA3MywgMHhmZjhiYzIwMCwgMHgwMDAwMTA3YiwgMHhmZjhiZTIwMCwKLQkJMHgwMDAwMTA4MywgMHhmZjk0MDAwMCwgMHgwMDAwMTA4YiwgMHhmZjk0MjAwMCwKLQkJMHgwMDAwMTA5NCwgMHhmZjk0NDAwMCwgMHgwMDAwMTA5YywgMHhmZjk0NjEwMCwKLQkJMHgwMDAwMTBhNCwgMHhmZjk0ODEwMCwgMHgwMDAwMTBhYywgMHhmZjk0YTEwMCwKLQkJMHgwMDAwMTBiNCwgMHhmZjk0YzIwMCwgMHgwMDAwMTBiZCwgMHhmZjk0ZTIwMCwKLQkJMHgwMDAwMTBjNSwgMHhmZjljMDAwMCwgMHgwMDAwMTBjZCwgMHhmZjljMjAwMCwKLQkJMHgwMDAwMTBkNSwgMHhmZjljNDAwMCwgMHgwMDAwMTBkZSwgMHhmZjljNjEwMCwKLQkJMHgwMDAwMTBlNiwgMHhmZjljODEwMCwgMHgwMDAwMTBlZSwgMHhmZjljYTEwMCwKLQkJMHgwMDAwMTBmNiwgMHhmZjljYzIwMCwgMHgwMDAwMTBmZiwgMHhmZjljZTIwMCwKLQkJMHgwMDAwMTQwMCwgMHhmZmE0MDAwMCwgMHgwMDAwMTQwOCwgMHhmZmE0MjAwMCwKLQkJMHgwMDAwMTQxMCwgMHhmZmE0NDAwMCwgMHgwMDAwMTQxOCwgMHhmZmE0NjEwMCwKLQkJMHgwMDAwMTQyMCwgMHhmZmE0ODEwMCwgMHgwMDAwMTQyOSwgMHhmZmE0YTEwMCwKLQkJMHgwMDAwMTQzMSwgMHhmZmE0YzIwMCwgMHgwMDAwMTQzOSwgMHhmZmE0ZTIwMCwKLQkJMHgwMDAwMTQ0MSwgMHhmZmFjMDAwMCwgMHgwMDAwMTQ0YSwgMHhmZmFjMjAwMCwKLQkJMHgwMDAwMTQ1MiwgMHhmZmFjNDAwMCwgMHgwMDAwMTQ1YSwgMHhmZmFjNjEwMCwKLQkJMHgwMDAwMTQ2MiwgMHhmZmFjODEwMCwgMHgwMDAwMTQ2YSwgMHhmZmFjYTEwMCwKLQkJMHgwMDAwMTQ3MywgMHhmZmFjYzIwMCwgMHgwMDAwMTQ3YiwgMHhmZmFjZTIwMCwKLQkJMHgwMDAwMTQ4MywgMHhmZmI0MDAwMCwgMHgwMDAwMTQ4YiwgMHhmZmI0MjAwMCwKLQkJMHgwMDAwMTQ5NCwgMHhmZmI0NDAwMCwgMHgwMDAwMTQ5YywgMHhmZmI0NjEwMCwKLQkJMHgwMDAwMTRhNCwgMHhmZmI0ODEwMCwgMHgwMDAwMTRhYywgMHhmZmI0YTEwMCwKLQkJMHgwMDAwMTRiNCwgMHhmZmI0YzIwMCwgMHgwMDAwMTRiZCwgMHhmZmI0ZTIwMCwKLQkJMHgwMDAwMTRjNSwgMHhmZmJkMDAwMCwgMHgwMDAwMTRjZCwgMHhmZmJkMjAwMCwKLQkJMHgwMDAwMTRkNSwgMHhmZmJkNDAwMCwgMHgwMDAwMTRkZSwgMHhmZmJkNjEwMCwKLQkJMHgwMDAwMTRlNiwgMHhmZmJkODEwMCwgMHgwMDAwMTRlZSwgMHhmZmJkYTEwMCwKLQkJMHgwMDAwMTRmNiwgMHhmZmJkYzIwMCwgMHgwMDAwMTRmZiwgMHhmZmJkZTIwMCwKLQkJMHgwMDAwMTgwMCwgMHhmZmM1MDAwMCwgMHgwMDAwMTgwOCwgMHhmZmM1MjAwMCwKLQkJMHgwMDAwMTgxMCwgMHhmZmM1NDAwMCwgMHgwMDAwMTgxOCwgMHhmZmM1NjEwMCwKLQkJMHgwMDAwMTgyMCwgMHhmZmM1ODEwMCwgMHgwMDAwMTgyOSwgMHhmZmM1YTEwMCwKLQkJMHgwMDAwMTgzMSwgMHhmZmM1YzIwMCwgMHgwMDAwMTgzOSwgMHhmZmM1ZTIwMCwKLQkJMHgwMDAwMTg0MSwgMHhmZmNkMDAwMCwgMHgwMDAwMTg0YSwgMHhmZmNkMjAwMCwKLQkJMHgwMDAwMTg1MiwgMHhmZmNkNDAwMCwgMHgwMDAwMTg1YSwgMHhmZmNkNjEwMCwKLQkJMHgwMDAwMTg2MiwgMHhmZmNkODEwMCwgMHgwMDAwMTg2YSwgMHhmZmNkYTEwMCwKLQkJMHgwMDAwMTg3MywgMHhmZmNkYzIwMCwgMHgwMDAwMTg3YiwgMHhmZmNkZTIwMCwKLQkJMHgwMDAwMTg4MywgMHhmZmQ1MDAwMCwgMHgwMDAwMTg4YiwgMHhmZmQ1MjAwMCwKLQkJMHgwMDAwMTg5NCwgMHhmZmQ1NDAwMCwgMHgwMDAwMTg5YywgMHhmZmQ1NjEwMCwKLQkJMHgwMDAwMThhNCwgMHhmZmQ1ODEwMCwgMHgwMDAwMThhYywgMHhmZmQ1YTEwMCwKLQkJMHgwMDAwMThiNCwgMHhmZmQ1YzIwMCwgMHgwMDAwMThiZCwgMHhmZmQ1ZTIwMCwKLQkJMHgwMDAwMThjNSwgMHhmZmRlMDAwMCwgMHgwMDAwMThjZCwgMHhmZmRlMjAwMCwKLQkJMHgwMDAwMThkNSwgMHhmZmRlNDAwMCwgMHgwMDAwMThkZSwgMHhmZmRlNjEwMCwKLQkJMHgwMDAwMThlNiwgMHhmZmRlODEwMCwgMHgwMDAwMThlZSwgMHhmZmRlYTEwMCwKLQkJMHgwMDAwMThmNiwgMHhmZmRlYzIwMCwgMHgwMDAwMThmZiwgMHhmZmRlZTIwMCwKLQkJMHgwMDAwMWMwMCwgMHhmZmU2MDAwMCwgMHgwMDAwMWMwOCwgMHhmZmU2MjAwMCwKLQkJMHgwMDAwMWMxMCwgMHhmZmU2NDAwMCwgMHgwMDAwMWMxOCwgMHhmZmU2NjEwMCwKLQkJMHgwMDAwMWMyMCwgMHhmZmU2ODEwMCwgMHgwMDAwMWMyOSwgMHhmZmU2YTEwMCwKLQkJMHgwMDAwMWMzMSwgMHhmZmU2YzIwMCwgMHgwMDAwMWMzOSwgMHhmZmU2ZTIwMCwKLQkJMHgwMDAwMWM0MSwgMHhmZmVlMDAwMCwgMHgwMDAwMWM0YSwgMHhmZmVlMjAwMCwKLQkJMHgwMDAwMWM1MiwgMHhmZmVlNDAwMCwgMHgwMDAwMWM1YSwgMHhmZmVlNjEwMCwKLQkJMHgwMDAwMWM2MiwgMHhmZmVlODEwMCwgMHgwMDAwMWM2YSwgMHhmZmVlYTEwMCwKLQkJMHgwMDAwMWM3MywgMHhmZmVlYzIwMCwgMHgwMDAwMWM3YiwgMHhmZmVlZTIwMCwKLQkJMHgwMDAwMWM4MywgMHhmZmY2MDAwMCwgMHgwMDAwMWM4YiwgMHhmZmY2MjAwMCwKLQkJMHgwMDAwMWM5NCwgMHhmZmY2NDAwMCwgMHgwMDAwMWM5YywgMHhmZmY2NjEwMCwKLQkJMHgwMDAwMWNhNCwgMHhmZmY2ODEwMCwgMHgwMDAwMWNhYywgMHhmZmY2YTEwMCwKLQkJMHgwMDAwMWNiNCwgMHhmZmY2YzIwMCwgMHgwMDAwMWNiZCwgMHhmZmY2ZTIwMCwKLQkJMHgwMDAwMWNjNSwgMHhmZmZmMDAwMCwgMHgwMDAwMWNjZCwgMHhmZmZmMjAwMCwKLQkJMHgwMDAwMWNkNSwgMHhmZmZmNDAwMCwgMHgwMDAwMWNkZSwgMHhmZmZmNjEwMCwKLQkJMHgwMDAwMWNlNiwgMHhmZmZmODEwMCwgMHgwMDAwMWNlZSwgMHhmZmZmYTEwMCwKLQkJMHgwMDAwMWNmNiwgMHhmZmZmYzIwMCwgMHgwMDAwMWNmZiwgMHhmZmZmZTIwMAotfTsKLXN0YXRpYyB2b2lkIEJsaXRfUkdCNTY1X0FSR0I4ODg4KFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLSAgICBCbGl0X1JHQjU2NV8zMihpbmZvLCBSR0I1NjVfQVJHQjg4ODhfTFVUKTsKLX0KLQotLyogU3BlY2lhbCBvcHRpbWl6ZWQgYmxpdCBmb3IgUkdCIDUtNi01IC0tPiBBQkdSIDgtOC04LTggKi8KLXN0YXRpYyBjb25zdCBVaW50MzIgUkdCNTY1X0FCR1I4ODg4X0xVVFs1MTJdID0gewotCQkweGZmMDAwMDAwLCAweDAwMDAwMDAwLCAweGZmMDgwMDAwLCAweDAwMDAyMDAwLAotCQkweGZmMTAwMDAwLCAweDAwMDA0MDAwLCAweGZmMTgwMDAwLCAweDAwMDA2MTAwLAotCQkweGZmMjAwMDAwLCAweDAwMDA4MTAwLCAweGZmMjkwMDAwLCAweDAwMDBhMTAwLAotCQkweGZmMzEwMDAwLCAweDAwMDBjMjAwLCAweGZmMzkwMDAwLCAweDAwMDBlMjAwLAotCQkweGZmNDEwMDAwLCAweDAwMDAwMDA4LCAweGZmNGEwMDAwLCAweDAwMDAyMDA4LAotCQkweGZmNTIwMDAwLCAweDAwMDA0MDA4LCAweGZmNWEwMDAwLCAweDAwMDA2MTA4LAotCQkweGZmNjIwMDAwLCAweDAwMDA4MTA4LCAweGZmNmEwMDAwLCAweDAwMDBhMTA4LAotCQkweGZmNzMwMDAwLCAweDAwMDBjMjA4LCAweGZmN2IwMDAwLCAweDAwMDBlMjA4LAotCQkweGZmODMwMDAwLCAweDAwMDAwMDEwLCAweGZmOGIwMDAwLCAweDAwMDAyMDEwLAotCQkweGZmOTQwMDAwLCAweDAwMDA0MDEwLCAweGZmOWMwMDAwLCAweDAwMDA2MTEwLAotCQkweGZmYTQwMDAwLCAweDAwMDA4MTEwLCAweGZmYWMwMDAwLCAweDAwMDBhMTEwLAotCQkweGZmYjQwMDAwLCAweDAwMDBjMjEwLCAweGZmYmQwMDAwLCAweDAwMDBlMjEwLAotCQkweGZmYzUwMDAwLCAweDAwMDAwMDE4LCAweGZmY2QwMDAwLCAweDAwMDAyMDE4LAotCQkweGZmZDUwMDAwLCAweDAwMDA0MDE4LCAweGZmZGUwMDAwLCAweDAwMDA2MTE4LAotCQkweGZmZTYwMDAwLCAweDAwMDA4MTE4LCAweGZmZWUwMDAwLCAweDAwMDBhMTE4LAotCQkweGZmZjYwMDAwLCAweDAwMDBjMjE4LCAweGZmZmYwMDAwLCAweDAwMDBlMjE4LAotCQkweGZmMDAwNDAwLCAweDAwMDAwMDIwLCAweGZmMDgwNDAwLCAweDAwMDAyMDIwLAotCQkweGZmMTAwNDAwLCAweDAwMDA0MDIwLCAweGZmMTgwNDAwLCAweDAwMDA2MTIwLAotCQkweGZmMjAwNDAwLCAweDAwMDA4MTIwLCAweGZmMjkwNDAwLCAweDAwMDBhMTIwLAotCQkweGZmMzEwNDAwLCAweDAwMDBjMjIwLCAweGZmMzkwNDAwLCAweDAwMDBlMjIwLAotCQkweGZmNDEwNDAwLCAweDAwMDAwMDI5LCAweGZmNGEwNDAwLCAweDAwMDAyMDI5LAotCQkweGZmNTIwNDAwLCAweDAwMDA0MDI5LCAweGZmNWEwNDAwLCAweDAwMDA2MTI5LAotCQkweGZmNjIwNDAwLCAweDAwMDA4MTI5LCAweGZmNmEwNDAwLCAweDAwMDBhMTI5LAotCQkweGZmNzMwNDAwLCAweDAwMDBjMjI5LCAweGZmN2IwNDAwLCAweDAwMDBlMjI5LAotCQkweGZmODMwNDAwLCAweDAwMDAwMDMxLCAweGZmOGIwNDAwLCAweDAwMDAyMDMxLAotCQkweGZmOTQwNDAwLCAweDAwMDA0MDMxLCAweGZmOWMwNDAwLCAweDAwMDA2MTMxLAotCQkweGZmYTQwNDAwLCAweDAwMDA4MTMxLCAweGZmYWMwNDAwLCAweDAwMDBhMTMxLAotCQkweGZmYjQwNDAwLCAweDAwMDBjMjMxLCAweGZmYmQwNDAwLCAweDAwMDBlMjMxLAotCQkweGZmYzUwNDAwLCAweDAwMDAwMDM5LCAweGZmY2QwNDAwLCAweDAwMDAyMDM5LAotCQkweGZmZDUwNDAwLCAweDAwMDA0MDM5LCAweGZmZGUwNDAwLCAweDAwMDA2MTM5LAotCQkweGZmZTYwNDAwLCAweDAwMDA4MTM5LCAweGZmZWUwNDAwLCAweDAwMDBhMTM5LAotCQkweGZmZjYwNDAwLCAweDAwMDBjMjM5LCAweGZmZmYwNDAwLCAweDAwMDBlMjM5LAotCQkweGZmMDAwODAwLCAweDAwMDAwMDQxLCAweGZmMDgwODAwLCAweDAwMDAyMDQxLAotCQkweGZmMTAwODAwLCAweDAwMDA0MDQxLCAweGZmMTgwODAwLCAweDAwMDA2MTQxLAotCQkweGZmMjAwODAwLCAweDAwMDA4MTQxLCAweGZmMjkwODAwLCAweDAwMDBhMTQxLAotCQkweGZmMzEwODAwLCAweDAwMDBjMjQxLCAweGZmMzkwODAwLCAweDAwMDBlMjQxLAotCQkweGZmNDEwODAwLCAweDAwMDAwMDRhLCAweGZmNGEwODAwLCAweDAwMDAyMDRhLAotCQkweGZmNTIwODAwLCAweDAwMDA0MDRhLCAweGZmNWEwODAwLCAweDAwMDA2MTRhLAotCQkweGZmNjIwODAwLCAweDAwMDA4MTRhLCAweGZmNmEwODAwLCAweDAwMDBhMTRhLAotCQkweGZmNzMwODAwLCAweDAwMDBjMjRhLCAweGZmN2IwODAwLCAweDAwMDBlMjRhLAotCQkweGZmODMwODAwLCAweDAwMDAwMDUyLCAweGZmOGIwODAwLCAweDAwMDAyMDUyLAotCQkweGZmOTQwODAwLCAweDAwMDA0MDUyLCAweGZmOWMwODAwLCAweDAwMDA2MTUyLAotCQkweGZmYTQwODAwLCAweDAwMDA4MTUyLCAweGZmYWMwODAwLCAweDAwMDBhMTUyLAotCQkweGZmYjQwODAwLCAweDAwMDBjMjUyLCAweGZmYmQwODAwLCAweDAwMDBlMjUyLAotCQkweGZmYzUwODAwLCAweDAwMDAwMDVhLCAweGZmY2QwODAwLCAweDAwMDAyMDVhLAotCQkweGZmZDUwODAwLCAweDAwMDA0MDVhLCAweGZmZGUwODAwLCAweDAwMDA2MTVhLAotCQkweGZmZTYwODAwLCAweDAwMDA4MTVhLCAweGZmZWUwODAwLCAweDAwMDBhMTVhLAotCQkweGZmZjYwODAwLCAweDAwMDBjMjVhLCAweGZmZmYwODAwLCAweDAwMDBlMjVhLAotCQkweGZmMDAwYzAwLCAweDAwMDAwMDYyLCAweGZmMDgwYzAwLCAweDAwMDAyMDYyLAotCQkweGZmMTAwYzAwLCAweDAwMDA0MDYyLCAweGZmMTgwYzAwLCAweDAwMDA2MTYyLAotCQkweGZmMjAwYzAwLCAweDAwMDA4MTYyLCAweGZmMjkwYzAwLCAweDAwMDBhMTYyLAotCQkweGZmMzEwYzAwLCAweDAwMDBjMjYyLCAweGZmMzkwYzAwLCAweDAwMDBlMjYyLAotCQkweGZmNDEwYzAwLCAweDAwMDAwMDZhLCAweGZmNGEwYzAwLCAweDAwMDAyMDZhLAotCQkweGZmNTIwYzAwLCAweDAwMDA0MDZhLCAweGZmNWEwYzAwLCAweDAwMDA2MTZhLAotCQkweGZmNjIwYzAwLCAweDAwMDA4MTZhLCAweGZmNmEwYzAwLCAweDAwMDBhMTZhLAotCQkweGZmNzMwYzAwLCAweDAwMDBjMjZhLCAweGZmN2IwYzAwLCAweDAwMDBlMjZhLAotCQkweGZmODMwYzAwLCAweDAwMDAwMDczLCAweGZmOGIwYzAwLCAweDAwMDAyMDczLAotCQkweGZmOTQwYzAwLCAweDAwMDA0MDczLCAweGZmOWMwYzAwLCAweDAwMDA2MTczLAotCQkweGZmYTQwYzAwLCAweDAwMDA4MTczLCAweGZmYWMwYzAwLCAweDAwMDBhMTczLAotCQkweGZmYjQwYzAwLCAweDAwMDBjMjczLCAweGZmYmQwYzAwLCAweDAwMDBlMjczLAotCQkweGZmYzUwYzAwLCAweDAwMDAwMDdiLCAweGZmY2QwYzAwLCAweDAwMDAyMDdiLAotCQkweGZmZDUwYzAwLCAweDAwMDA0MDdiLCAweGZmZGUwYzAwLCAweDAwMDA2MTdiLAotCQkweGZmZTYwYzAwLCAweDAwMDA4MTdiLCAweGZmZWUwYzAwLCAweDAwMDBhMTdiLAotCQkweGZmZjYwYzAwLCAweDAwMDBjMjdiLCAweGZmZmYwYzAwLCAweDAwMDBlMjdiLAotCQkweGZmMDAxMDAwLCAweDAwMDAwMDgzLCAweGZmMDgxMDAwLCAweDAwMDAyMDgzLAotCQkweGZmMTAxMDAwLCAweDAwMDA0MDgzLCAweGZmMTgxMDAwLCAweDAwMDA2MTgzLAotCQkweGZmMjAxMDAwLCAweDAwMDA4MTgzLCAweGZmMjkxMDAwLCAweDAwMDBhMTgzLAotCQkweGZmMzExMDAwLCAweDAwMDBjMjgzLCAweGZmMzkxMDAwLCAweDAwMDBlMjgzLAotCQkweGZmNDExMDAwLCAweDAwMDAwMDhiLCAweGZmNGExMDAwLCAweDAwMDAyMDhiLAotCQkweGZmNTIxMDAwLCAweDAwMDA0MDhiLCAweGZmNWExMDAwLCAweDAwMDA2MThiLAotCQkweGZmNjIxMDAwLCAweDAwMDA4MThiLCAweGZmNmExMDAwLCAweDAwMDBhMThiLAotCQkweGZmNzMxMDAwLCAweDAwMDBjMjhiLCAweGZmN2IxMDAwLCAweDAwMDBlMjhiLAotCQkweGZmODMxMDAwLCAweDAwMDAwMDk0LCAweGZmOGIxMDAwLCAweDAwMDAyMDk0LAotCQkweGZmOTQxMDAwLCAweDAwMDA0MDk0LCAweGZmOWMxMDAwLCAweDAwMDA2MTk0LAotCQkweGZmYTQxMDAwLCAweDAwMDA4MTk0LCAweGZmYWMxMDAwLCAweDAwMDBhMTk0LAotCQkweGZmYjQxMDAwLCAweDAwMDBjMjk0LCAweGZmYmQxMDAwLCAweDAwMDBlMjk0LAotCQkweGZmYzUxMDAwLCAweDAwMDAwMDljLCAweGZmY2QxMDAwLCAweDAwMDAyMDljLAotCQkweGZmZDUxMDAwLCAweDAwMDA0MDljLCAweGZmZGUxMDAwLCAweDAwMDA2MTljLAotCQkweGZmZTYxMDAwLCAweDAwMDA4MTljLCAweGZmZWUxMDAwLCAweDAwMDBhMTljLAotCQkweGZmZjYxMDAwLCAweDAwMDBjMjljLCAweGZmZmYxMDAwLCAweDAwMDBlMjljLAotCQkweGZmMDAxNDAwLCAweDAwMDAwMGE0LCAweGZmMDgxNDAwLCAweDAwMDAyMGE0LAotCQkweGZmMTAxNDAwLCAweDAwMDA0MGE0LCAweGZmMTgxNDAwLCAweDAwMDA2MWE0LAotCQkweGZmMjAxNDAwLCAweDAwMDA4MWE0LCAweGZmMjkxNDAwLCAweDAwMDBhMWE0LAotCQkweGZmMzExNDAwLCAweDAwMDBjMmE0LCAweGZmMzkxNDAwLCAweDAwMDBlMmE0LAotCQkweGZmNDExNDAwLCAweDAwMDAwMGFjLCAweGZmNGExNDAwLCAweDAwMDAyMGFjLAotCQkweGZmNTIxNDAwLCAweDAwMDA0MGFjLCAweGZmNWExNDAwLCAweDAwMDA2MWFjLAotCQkweGZmNjIxNDAwLCAweDAwMDA4MWFjLCAweGZmNmExNDAwLCAweDAwMDBhMWFjLAotCQkweGZmNzMxNDAwLCAweDAwMDBjMmFjLCAweGZmN2IxNDAwLCAweDAwMDBlMmFjLAotCQkweGZmODMxNDAwLCAweDAwMDAwMGI0LCAweGZmOGIxNDAwLCAweDAwMDAyMGI0LAotCQkweGZmOTQxNDAwLCAweDAwMDA0MGI0LCAweGZmOWMxNDAwLCAweDAwMDA2MWI0LAotCQkweGZmYTQxNDAwLCAweDAwMDA4MWI0LCAweGZmYWMxNDAwLCAweDAwMDBhMWI0LAotCQkweGZmYjQxNDAwLCAweDAwMDBjMmI0LCAweGZmYmQxNDAwLCAweDAwMDBlMmI0LAotCQkweGZmYzUxNDAwLCAweDAwMDAwMGJkLCAweGZmY2QxNDAwLCAweDAwMDAyMGJkLAotCQkweGZmZDUxNDAwLCAweDAwMDA0MGJkLCAweGZmZGUxNDAwLCAweDAwMDA2MWJkLAotCQkweGZmZTYxNDAwLCAweDAwMDA4MWJkLCAweGZmZWUxNDAwLCAweDAwMDBhMWJkLAotCQkweGZmZjYxNDAwLCAweDAwMDBjMmJkLCAweGZmZmYxNDAwLCAweDAwMDBlMmJkLAotCQkweGZmMDAxODAwLCAweDAwMDAwMGM1LCAweGZmMDgxODAwLCAweDAwMDAyMGM1LAotCQkweGZmMTAxODAwLCAweDAwMDA0MGM1LCAweGZmMTgxODAwLCAweDAwMDA2MWM1LAotCQkweGZmMjAxODAwLCAweDAwMDA4MWM1LCAweGZmMjkxODAwLCAweDAwMDBhMWM1LAotCQkweGZmMzExODAwLCAweDAwMDBjMmM1LCAweGZmMzkxODAwLCAweDAwMDBlMmM1LAotCQkweGZmNDExODAwLCAweDAwMDAwMGNkLCAweGZmNGExODAwLCAweDAwMDAyMGNkLAotCQkweGZmNTIxODAwLCAweDAwMDA0MGNkLCAweGZmNWExODAwLCAweDAwMDA2MWNkLAotCQkweGZmNjIxODAwLCAweDAwMDA4MWNkLCAweGZmNmExODAwLCAweDAwMDBhMWNkLAotCQkweGZmNzMxODAwLCAweDAwMDBjMmNkLCAweGZmN2IxODAwLCAweDAwMDBlMmNkLAotCQkweGZmODMxODAwLCAweDAwMDAwMGQ1LCAweGZmOGIxODAwLCAweDAwMDAyMGQ1LAotCQkweGZmOTQxODAwLCAweDAwMDA0MGQ1LCAweGZmOWMxODAwLCAweDAwMDA2MWQ1LAotCQkweGZmYTQxODAwLCAweDAwMDA4MWQ1LCAweGZmYWMxODAwLCAweDAwMDBhMWQ1LAotCQkweGZmYjQxODAwLCAweDAwMDBjMmQ1LCAweGZmYmQxODAwLCAweDAwMDBlMmQ1LAotCQkweGZmYzUxODAwLCAweDAwMDAwMGRlLCAweGZmY2QxODAwLCAweDAwMDAyMGRlLAotCQkweGZmZDUxODAwLCAweDAwMDA0MGRlLCAweGZmZGUxODAwLCAweDAwMDA2MWRlLAotCQkweGZmZTYxODAwLCAweDAwMDA4MWRlLCAweGZmZWUxODAwLCAweDAwMDBhMWRlLAotCQkweGZmZjYxODAwLCAweDAwMDBjMmRlLCAweGZmZmYxODAwLCAweDAwMDBlMmRlLAotCQkweGZmMDAxYzAwLCAweDAwMDAwMGU2LCAweGZmMDgxYzAwLCAweDAwMDAyMGU2LAotCQkweGZmMTAxYzAwLCAweDAwMDA0MGU2LCAweGZmMTgxYzAwLCAweDAwMDA2MWU2LAotCQkweGZmMjAxYzAwLCAweDAwMDA4MWU2LCAweGZmMjkxYzAwLCAweDAwMDBhMWU2LAotCQkweGZmMzExYzAwLCAweDAwMDBjMmU2LCAweGZmMzkxYzAwLCAweDAwMDBlMmU2LAotCQkweGZmNDExYzAwLCAweDAwMDAwMGVlLCAweGZmNGExYzAwLCAweDAwMDAyMGVlLAotCQkweGZmNTIxYzAwLCAweDAwMDA0MGVlLCAweGZmNWExYzAwLCAweDAwMDA2MWVlLAotCQkweGZmNjIxYzAwLCAweDAwMDA4MWVlLCAweGZmNmExYzAwLCAweDAwMDBhMWVlLAotCQkweGZmNzMxYzAwLCAweDAwMDBjMmVlLCAweGZmN2IxYzAwLCAweDAwMDBlMmVlLAotCQkweGZmODMxYzAwLCAweDAwMDAwMGY2LCAweGZmOGIxYzAwLCAweDAwMDAyMGY2LAotCQkweGZmOTQxYzAwLCAweDAwMDA0MGY2LCAweGZmOWMxYzAwLCAweDAwMDA2MWY2LAotCQkweGZmYTQxYzAwLCAweDAwMDA4MWY2LCAweGZmYWMxYzAwLCAweDAwMDBhMWY2LAotCQkweGZmYjQxYzAwLCAweDAwMDBjMmY2LCAweGZmYmQxYzAwLCAweDAwMDBlMmY2LAotCQkweGZmYzUxYzAwLCAweDAwMDAwMGZmLCAweGZmY2QxYzAwLCAweDAwMDAyMGZmLAotCQkweGZmZDUxYzAwLCAweDAwMDA0MGZmLCAweGZmZGUxYzAwLCAweDAwMDA2MWZmLAotCQkweGZmZTYxYzAwLCAweDAwMDA4MWZmLCAweGZmZWUxYzAwLCAweDAwMDBhMWZmLAotCQkweGZmZjYxYzAwLCAweDAwMDBjMmZmLCAweGZmZmYxYzAwLCAweDAwMDBlMmZmCi19Owotc3RhdGljIHZvaWQgQmxpdF9SR0I1NjVfQUJHUjg4ODgoU0RMX0JsaXRJbmZvICppbmZvKQotewotICAgIEJsaXRfUkdCNTY1XzMyKGluZm8sIFJHQjU2NV9BQkdSODg4OF9MVVQpOwotfQotCi0vKiBTcGVjaWFsIG9wdGltaXplZCBibGl0IGZvciBSR0IgNS02LTUgLS0+IFJHQkEgOC04LTgtOCAqLwotc3RhdGljIGNvbnN0IFVpbnQzMiBSR0I1NjVfUkdCQTg4ODhfTFVUWzUxMl0gPSB7Ci0JCTB4MDAwMDAwZmYsIDB4MDAwMDAwMDAsIDB4MDAwMDA4ZmYsIDB4MDAyMDAwMDAsCi0JCTB4MDAwMDEwZmYsIDB4MDA0MDAwMDAsIDB4MDAwMDE4ZmYsIDB4MDA2MTAwMDAsCi0JCTB4MDAwMDIwZmYsIDB4MDA4MTAwMDAsIDB4MDAwMDI5ZmYsIDB4MDBhMTAwMDAsCi0JCTB4MDAwMDMxZmYsIDB4MDBjMjAwMDAsIDB4MDAwMDM5ZmYsIDB4MDBlMjAwMDAsCi0JCTB4MDAwMDQxZmYsIDB4MDgwMDAwMDAsIDB4MDAwMDRhZmYsIDB4MDgyMDAwMDAsCi0JCTB4MDAwMDUyZmYsIDB4MDg0MDAwMDAsIDB4MDAwMDVhZmYsIDB4MDg2MTAwMDAsCi0JCTB4MDAwMDYyZmYsIDB4MDg4MTAwMDAsIDB4MDAwMDZhZmYsIDB4MDhhMTAwMDAsCi0JCTB4MDAwMDczZmYsIDB4MDhjMjAwMDAsIDB4MDAwMDdiZmYsIDB4MDhlMjAwMDAsCi0JCTB4MDAwMDgzZmYsIDB4MTAwMDAwMDAsIDB4MDAwMDhiZmYsIDB4MTAyMDAwMDAsCi0JCTB4MDAwMDk0ZmYsIDB4MTA0MDAwMDAsIDB4MDAwMDljZmYsIDB4MTA2MTAwMDAsCi0JCTB4MDAwMGE0ZmYsIDB4MTA4MTAwMDAsIDB4MDAwMGFjZmYsIDB4MTBhMTAwMDAsCi0JCTB4MDAwMGI0ZmYsIDB4MTBjMjAwMDAsIDB4MDAwMGJkZmYsIDB4MTBlMjAwMDAsCi0JCTB4MDAwMGM1ZmYsIDB4MTgwMDAwMDAsIDB4MDAwMGNkZmYsIDB4MTgyMDAwMDAsCi0JCTB4MDAwMGQ1ZmYsIDB4MTg0MDAwMDAsIDB4MDAwMGRlZmYsIDB4MTg2MTAwMDAsCi0JCTB4MDAwMGU2ZmYsIDB4MTg4MTAwMDAsIDB4MDAwMGVlZmYsIDB4MThhMTAwMDAsCi0JCTB4MDAwMGY2ZmYsIDB4MThjMjAwMDAsIDB4MDAwMGZmZmYsIDB4MThlMjAwMDAsCi0JCTB4MDAwNDAwZmYsIDB4MjAwMDAwMDAsIDB4MDAwNDA4ZmYsIDB4MjAyMDAwMDAsCi0JCTB4MDAwNDEwZmYsIDB4MjA0MDAwMDAsIDB4MDAwNDE4ZmYsIDB4MjA2MTAwMDAsCi0JCTB4MDAwNDIwZmYsIDB4MjA4MTAwMDAsIDB4MDAwNDI5ZmYsIDB4MjBhMTAwMDAsCi0JCTB4MDAwNDMxZmYsIDB4MjBjMjAwMDAsIDB4MDAwNDM5ZmYsIDB4MjBlMjAwMDAsCi0JCTB4MDAwNDQxZmYsIDB4MjkwMDAwMDAsIDB4MDAwNDRhZmYsIDB4MjkyMDAwMDAsCi0JCTB4MDAwNDUyZmYsIDB4Mjk0MDAwMDAsIDB4MDAwNDVhZmYsIDB4Mjk2MTAwMDAsCi0JCTB4MDAwNDYyZmYsIDB4Mjk4MTAwMDAsIDB4MDAwNDZhZmYsIDB4MjlhMTAwMDAsCi0JCTB4MDAwNDczZmYsIDB4MjljMjAwMDAsIDB4MDAwNDdiZmYsIDB4MjllMjAwMDAsCi0JCTB4MDAwNDgzZmYsIDB4MzEwMDAwMDAsIDB4MDAwNDhiZmYsIDB4MzEyMDAwMDAsCi0JCTB4MDAwNDk0ZmYsIDB4MzE0MDAwMDAsIDB4MDAwNDljZmYsIDB4MzE2MTAwMDAsCi0JCTB4MDAwNGE0ZmYsIDB4MzE4MTAwMDAsIDB4MDAwNGFjZmYsIDB4MzFhMTAwMDAsCi0JCTB4MDAwNGI0ZmYsIDB4MzFjMjAwMDAsIDB4MDAwNGJkZmYsIDB4MzFlMjAwMDAsCi0JCTB4MDAwNGM1ZmYsIDB4MzkwMDAwMDAsIDB4MDAwNGNkZmYsIDB4MzkyMDAwMDAsCi0JCTB4MDAwNGQ1ZmYsIDB4Mzk0MDAwMDAsIDB4MDAwNGRlZmYsIDB4Mzk2MTAwMDAsCi0JCTB4MDAwNGU2ZmYsIDB4Mzk4MTAwMDAsIDB4MDAwNGVlZmYsIDB4MzlhMTAwMDAsCi0JCTB4MDAwNGY2ZmYsIDB4MzljMjAwMDAsIDB4MDAwNGZmZmYsIDB4MzllMjAwMDAsCi0JCTB4MDAwODAwZmYsIDB4NDEwMDAwMDAsIDB4MDAwODA4ZmYsIDB4NDEyMDAwMDAsCi0JCTB4MDAwODEwZmYsIDB4NDE0MDAwMDAsIDB4MDAwODE4ZmYsIDB4NDE2MTAwMDAsCi0JCTB4MDAwODIwZmYsIDB4NDE4MTAwMDAsIDB4MDAwODI5ZmYsIDB4NDFhMTAwMDAsCi0JCTB4MDAwODMxZmYsIDB4NDFjMjAwMDAsIDB4MDAwODM5ZmYsIDB4NDFlMjAwMDAsCi0JCTB4MDAwODQxZmYsIDB4NGEwMDAwMDAsIDB4MDAwODRhZmYsIDB4NGEyMDAwMDAsCi0JCTB4MDAwODUyZmYsIDB4NGE0MDAwMDAsIDB4MDAwODVhZmYsIDB4NGE2MTAwMDAsCi0JCTB4MDAwODYyZmYsIDB4NGE4MTAwMDAsIDB4MDAwODZhZmYsIDB4NGFhMTAwMDAsCi0JCTB4MDAwODczZmYsIDB4NGFjMjAwMDAsIDB4MDAwODdiZmYsIDB4NGFlMjAwMDAsCi0JCTB4MDAwODgzZmYsIDB4NTIwMDAwMDAsIDB4MDAwODhiZmYsIDB4NTIyMDAwMDAsCi0JCTB4MDAwODk0ZmYsIDB4NTI0MDAwMDAsIDB4MDAwODljZmYsIDB4NTI2MTAwMDAsCi0JCTB4MDAwOGE0ZmYsIDB4NTI4MTAwMDAsIDB4MDAwOGFjZmYsIDB4NTJhMTAwMDAsCi0JCTB4MDAwOGI0ZmYsIDB4NTJjMjAwMDAsIDB4MDAwOGJkZmYsIDB4NTJlMjAwMDAsCi0JCTB4MDAwOGM1ZmYsIDB4NWEwMDAwMDAsIDB4MDAwOGNkZmYsIDB4NWEyMDAwMDAsCi0JCTB4MDAwOGQ1ZmYsIDB4NWE0MDAwMDAsIDB4MDAwOGRlZmYsIDB4NWE2MTAwMDAsCi0JCTB4MDAwOGU2ZmYsIDB4NWE4MTAwMDAsIDB4MDAwOGVlZmYsIDB4NWFhMTAwMDAsCi0JCTB4MDAwOGY2ZmYsIDB4NWFjMjAwMDAsIDB4MDAwOGZmZmYsIDB4NWFlMjAwMDAsCi0JCTB4MDAwYzAwZmYsIDB4NjIwMDAwMDAsIDB4MDAwYzA4ZmYsIDB4NjIyMDAwMDAsCi0JCTB4MDAwYzEwZmYsIDB4NjI0MDAwMDAsIDB4MDAwYzE4ZmYsIDB4NjI2MTAwMDAsCi0JCTB4MDAwYzIwZmYsIDB4NjI4MTAwMDAsIDB4MDAwYzI5ZmYsIDB4NjJhMTAwMDAsCi0JCTB4MDAwYzMxZmYsIDB4NjJjMjAwMDAsIDB4MDAwYzM5ZmYsIDB4NjJlMjAwMDAsCi0JCTB4MDAwYzQxZmYsIDB4NmEwMDAwMDAsIDB4MDAwYzRhZmYsIDB4NmEyMDAwMDAsCi0JCTB4MDAwYzUyZmYsIDB4NmE0MDAwMDAsIDB4MDAwYzVhZmYsIDB4NmE2MTAwMDAsCi0JCTB4MDAwYzYyZmYsIDB4NmE4MTAwMDAsIDB4MDAwYzZhZmYsIDB4NmFhMTAwMDAsCi0JCTB4MDAwYzczZmYsIDB4NmFjMjAwMDAsIDB4MDAwYzdiZmYsIDB4NmFlMjAwMDAsCi0JCTB4MDAwYzgzZmYsIDB4NzMwMDAwMDAsIDB4MDAwYzhiZmYsIDB4NzMyMDAwMDAsCi0JCTB4MDAwYzk0ZmYsIDB4NzM0MDAwMDAsIDB4MDAwYzljZmYsIDB4NzM2MTAwMDAsCi0JCTB4MDAwY2E0ZmYsIDB4NzM4MTAwMDAsIDB4MDAwY2FjZmYsIDB4NzNhMTAwMDAsCi0JCTB4MDAwY2I0ZmYsIDB4NzNjMjAwMDAsIDB4MDAwY2JkZmYsIDB4NzNlMjAwMDAsCi0JCTB4MDAwY2M1ZmYsIDB4N2IwMDAwMDAsIDB4MDAwY2NkZmYsIDB4N2IyMDAwMDAsCi0JCTB4MDAwY2Q1ZmYsIDB4N2I0MDAwMDAsIDB4MDAwY2RlZmYsIDB4N2I2MTAwMDAsCi0JCTB4MDAwY2U2ZmYsIDB4N2I4MTAwMDAsIDB4MDAwY2VlZmYsIDB4N2JhMTAwMDAsCi0JCTB4MDAwY2Y2ZmYsIDB4N2JjMjAwMDAsIDB4MDAwY2ZmZmYsIDB4N2JlMjAwMDAsCi0JCTB4MDAxMDAwZmYsIDB4ODMwMDAwMDAsIDB4MDAxMDA4ZmYsIDB4ODMyMDAwMDAsCi0JCTB4MDAxMDEwZmYsIDB4ODM0MDAwMDAsIDB4MDAxMDE4ZmYsIDB4ODM2MTAwMDAsCi0JCTB4MDAxMDIwZmYsIDB4ODM4MTAwMDAsIDB4MDAxMDI5ZmYsIDB4ODNhMTAwMDAsCi0JCTB4MDAxMDMxZmYsIDB4ODNjMjAwMDAsIDB4MDAxMDM5ZmYsIDB4ODNlMjAwMDAsCi0JCTB4MDAxMDQxZmYsIDB4OGIwMDAwMDAsIDB4MDAxMDRhZmYsIDB4OGIyMDAwMDAsCi0JCTB4MDAxMDUyZmYsIDB4OGI0MDAwMDAsIDB4MDAxMDVhZmYsIDB4OGI2MTAwMDAsCi0JCTB4MDAxMDYyZmYsIDB4OGI4MTAwMDAsIDB4MDAxMDZhZmYsIDB4OGJhMTAwMDAsCi0JCTB4MDAxMDczZmYsIDB4OGJjMjAwMDAsIDB4MDAxMDdiZmYsIDB4OGJlMjAwMDAsCi0JCTB4MDAxMDgzZmYsIDB4OTQwMDAwMDAsIDB4MDAxMDhiZmYsIDB4OTQyMDAwMDAsCi0JCTB4MDAxMDk0ZmYsIDB4OTQ0MDAwMDAsIDB4MDAxMDljZmYsIDB4OTQ2MTAwMDAsCi0JCTB4MDAxMGE0ZmYsIDB4OTQ4MTAwMDAsIDB4MDAxMGFjZmYsIDB4OTRhMTAwMDAsCi0JCTB4MDAxMGI0ZmYsIDB4OTRjMjAwMDAsIDB4MDAxMGJkZmYsIDB4OTRlMjAwMDAsCi0JCTB4MDAxMGM1ZmYsIDB4OWMwMDAwMDAsIDB4MDAxMGNkZmYsIDB4OWMyMDAwMDAsCi0JCTB4MDAxMGQ1ZmYsIDB4OWM0MDAwMDAsIDB4MDAxMGRlZmYsIDB4OWM2MTAwMDAsCi0JCTB4MDAxMGU2ZmYsIDB4OWM4MTAwMDAsIDB4MDAxMGVlZmYsIDB4OWNhMTAwMDAsCi0JCTB4MDAxMGY2ZmYsIDB4OWNjMjAwMDAsIDB4MDAxMGZmZmYsIDB4OWNlMjAwMDAsCi0JCTB4MDAxNDAwZmYsIDB4YTQwMDAwMDAsIDB4MDAxNDA4ZmYsIDB4YTQyMDAwMDAsCi0JCTB4MDAxNDEwZmYsIDB4YTQ0MDAwMDAsIDB4MDAxNDE4ZmYsIDB4YTQ2MTAwMDAsCi0JCTB4MDAxNDIwZmYsIDB4YTQ4MTAwMDAsIDB4MDAxNDI5ZmYsIDB4YTRhMTAwMDAsCi0JCTB4MDAxNDMxZmYsIDB4YTRjMjAwMDAsIDB4MDAxNDM5ZmYsIDB4YTRlMjAwMDAsCi0JCTB4MDAxNDQxZmYsIDB4YWMwMDAwMDAsIDB4MDAxNDRhZmYsIDB4YWMyMDAwMDAsCi0JCTB4MDAxNDUyZmYsIDB4YWM0MDAwMDAsIDB4MDAxNDVhZmYsIDB4YWM2MTAwMDAsCi0JCTB4MDAxNDYyZmYsIDB4YWM4MTAwMDAsIDB4MDAxNDZhZmYsIDB4YWNhMTAwMDAsCi0JCTB4MDAxNDczZmYsIDB4YWNjMjAwMDAsIDB4MDAxNDdiZmYsIDB4YWNlMjAwMDAsCi0JCTB4MDAxNDgzZmYsIDB4YjQwMDAwMDAsIDB4MDAxNDhiZmYsIDB4YjQyMDAwMDAsCi0JCTB4MDAxNDk0ZmYsIDB4YjQ0MDAwMDAsIDB4MDAxNDljZmYsIDB4YjQ2MTAwMDAsCi0JCTB4MDAxNGE0ZmYsIDB4YjQ4MTAwMDAsIDB4MDAxNGFjZmYsIDB4YjRhMTAwMDAsCi0JCTB4MDAxNGI0ZmYsIDB4YjRjMjAwMDAsIDB4MDAxNGJkZmYsIDB4YjRlMjAwMDAsCi0JCTB4MDAxNGM1ZmYsIDB4YmQwMDAwMDAsIDB4MDAxNGNkZmYsIDB4YmQyMDAwMDAsCi0JCTB4MDAxNGQ1ZmYsIDB4YmQ0MDAwMDAsIDB4MDAxNGRlZmYsIDB4YmQ2MTAwMDAsCi0JCTB4MDAxNGU2ZmYsIDB4YmQ4MTAwMDAsIDB4MDAxNGVlZmYsIDB4YmRhMTAwMDAsCi0JCTB4MDAxNGY2ZmYsIDB4YmRjMjAwMDAsIDB4MDAxNGZmZmYsIDB4YmRlMjAwMDAsCi0JCTB4MDAxODAwZmYsIDB4YzUwMDAwMDAsIDB4MDAxODA4ZmYsIDB4YzUyMDAwMDAsCi0JCTB4MDAxODEwZmYsIDB4YzU0MDAwMDAsIDB4MDAxODE4ZmYsIDB4YzU2MTAwMDAsCi0JCTB4MDAxODIwZmYsIDB4YzU4MTAwMDAsIDB4MDAxODI5ZmYsIDB4YzVhMTAwMDAsCi0JCTB4MDAxODMxZmYsIDB4YzVjMjAwMDAsIDB4MDAxODM5ZmYsIDB4YzVlMjAwMDAsCi0JCTB4MDAxODQxZmYsIDB4Y2QwMDAwMDAsIDB4MDAxODRhZmYsIDB4Y2QyMDAwMDAsCi0JCTB4MDAxODUyZmYsIDB4Y2Q0MDAwMDAsIDB4MDAxODVhZmYsIDB4Y2Q2MTAwMDAsCi0JCTB4MDAxODYyZmYsIDB4Y2Q4MTAwMDAsIDB4MDAxODZhZmYsIDB4Y2RhMTAwMDAsCi0JCTB4MDAxODczZmYsIDB4Y2RjMjAwMDAsIDB4MDAxODdiZmYsIDB4Y2RlMjAwMDAsCi0JCTB4MDAxODgzZmYsIDB4ZDUwMDAwMDAsIDB4MDAxODhiZmYsIDB4ZDUyMDAwMDAsCi0JCTB4MDAxODk0ZmYsIDB4ZDU0MDAwMDAsIDB4MDAxODljZmYsIDB4ZDU2MTAwMDAsCi0JCTB4MDAxOGE0ZmYsIDB4ZDU4MTAwMDAsIDB4MDAxOGFjZmYsIDB4ZDVhMTAwMDAsCi0JCTB4MDAxOGI0ZmYsIDB4ZDVjMjAwMDAsIDB4MDAxOGJkZmYsIDB4ZDVlMjAwMDAsCi0JCTB4MDAxOGM1ZmYsIDB4ZGUwMDAwMDAsIDB4MDAxOGNkZmYsIDB4ZGUyMDAwMDAsCi0JCTB4MDAxOGQ1ZmYsIDB4ZGU0MDAwMDAsIDB4MDAxOGRlZmYsIDB4ZGU2MTAwMDAsCi0JCTB4MDAxOGU2ZmYsIDB4ZGU4MTAwMDAsIDB4MDAxOGVlZmYsIDB4ZGVhMTAwMDAsCi0JCTB4MDAxOGY2ZmYsIDB4ZGVjMjAwMDAsIDB4MDAxOGZmZmYsIDB4ZGVlMjAwMDAsCi0JCTB4MDAxYzAwZmYsIDB4ZTYwMDAwMDAsIDB4MDAxYzA4ZmYsIDB4ZTYyMDAwMDAsCi0JCTB4MDAxYzEwZmYsIDB4ZTY0MDAwMDAsIDB4MDAxYzE4ZmYsIDB4ZTY2MTAwMDAsCi0JCTB4MDAxYzIwZmYsIDB4ZTY4MTAwMDAsIDB4MDAxYzI5ZmYsIDB4ZTZhMTAwMDAsCi0JCTB4MDAxYzMxZmYsIDB4ZTZjMjAwMDAsIDB4MDAxYzM5ZmYsIDB4ZTZlMjAwMDAsCi0JCTB4MDAxYzQxZmYsIDB4ZWUwMDAwMDAsIDB4MDAxYzRhZmYsIDB4ZWUyMDAwMDAsCi0JCTB4MDAxYzUyZmYsIDB4ZWU0MDAwMDAsIDB4MDAxYzVhZmYsIDB4ZWU2MTAwMDAsCi0JCTB4MDAxYzYyZmYsIDB4ZWU4MTAwMDAsIDB4MDAxYzZhZmYsIDB4ZWVhMTAwMDAsCi0JCTB4MDAxYzczZmYsIDB4ZWVjMjAwMDAsIDB4MDAxYzdiZmYsIDB4ZWVlMjAwMDAsCi0JCTB4MDAxYzgzZmYsIDB4ZjYwMDAwMDAsIDB4MDAxYzhiZmYsIDB4ZjYyMDAwMDAsCi0JCTB4MDAxYzk0ZmYsIDB4ZjY0MDAwMDAsIDB4MDAxYzljZmYsIDB4ZjY2MTAwMDAsCi0JCTB4MDAxY2E0ZmYsIDB4ZjY4MTAwMDAsIDB4MDAxY2FjZmYsIDB4ZjZhMTAwMDAsCi0JCTB4MDAxY2I0ZmYsIDB4ZjZjMjAwMDAsIDB4MDAxY2JkZmYsIDB4ZjZlMjAwMDAsCi0JCTB4MDAxY2M1ZmYsIDB4ZmYwMDAwMDAsIDB4MDAxY2NkZmYsIDB4ZmYyMDAwMDAsCi0JCTB4MDAxY2Q1ZmYsIDB4ZmY0MDAwMDAsIDB4MDAxY2RlZmYsIDB4ZmY2MTAwMDAsCi0JCTB4MDAxY2U2ZmYsIDB4ZmY4MTAwMDAsIDB4MDAxY2VlZmYsIDB4ZmZhMTAwMDAsCi0JCTB4MDAxY2Y2ZmYsIDB4ZmZjMjAwMDAsIDB4MDAxY2ZmZmYsIDB4ZmZlMjAwMDAsCi19Owotc3RhdGljIHZvaWQgQmxpdF9SR0I1NjVfUkdCQTg4ODgoU0RMX0JsaXRJbmZvICppbmZvKQotewotICAgIEJsaXRfUkdCNTY1XzMyKGluZm8sIFJHQjU2NV9SR0JBODg4OF9MVVQpOwotfQotCi0vKiBTcGVjaWFsIG9wdGltaXplZCBibGl0IGZvciBSR0IgNS02LTUgLS0+IEJHUkEgOC04LTgtOCAqLwotc3RhdGljIGNvbnN0IFVpbnQzMiBSR0I1NjVfQkdSQTg4ODhfTFVUWzUxMl0gPSB7Ci0JCTB4MDAwMDAwMDAsIDB4MDAwMDAwZmYsIDB4MDgwMDAwMDAsIDB4MDAyMDAwZmYsCi0JCTB4MTAwMDAwMDAsIDB4MDA0MDAwZmYsIDB4MTgwMDAwMDAsIDB4MDA2MTAwZmYsCi0JCTB4MjAwMDAwMDAsIDB4MDA4MTAwZmYsIDB4MjkwMDAwMDAsIDB4MDBhMTAwZmYsCi0JCTB4MzEwMDAwMDAsIDB4MDBjMjAwZmYsIDB4MzkwMDAwMDAsIDB4MDBlMjAwZmYsCi0JCTB4NDEwMDAwMDAsIDB4MDAwMDA4ZmYsIDB4NGEwMDAwMDAsIDB4MDAyMDA4ZmYsCi0JCTB4NTIwMDAwMDAsIDB4MDA0MDA4ZmYsIDB4NWEwMDAwMDAsIDB4MDA2MTA4ZmYsCi0JCTB4NjIwMDAwMDAsIDB4MDA4MTA4ZmYsIDB4NmEwMDAwMDAsIDB4MDBhMTA4ZmYsCi0JCTB4NzMwMDAwMDAsIDB4MDBjMjA4ZmYsIDB4N2IwMDAwMDAsIDB4MDBlMjA4ZmYsCi0JCTB4ODMwMDAwMDAsIDB4MDAwMDEwZmYsIDB4OGIwMDAwMDAsIDB4MDAyMDEwZmYsCi0JCTB4OTQwMDAwMDAsIDB4MDA0MDEwZmYsIDB4OWMwMDAwMDAsIDB4MDA2MTEwZmYsCi0JCTB4YTQwMDAwMDAsIDB4MDA4MTEwZmYsIDB4YWMwMDAwMDAsIDB4MDBhMTEwZmYsCi0JCTB4YjQwMDAwMDAsIDB4MDBjMjEwZmYsIDB4YmQwMDAwMDAsIDB4MDBlMjEwZmYsCi0JCTB4YzUwMDAwMDAsIDB4MDAwMDE4ZmYsIDB4Y2QwMDAwMDAsIDB4MDAyMDE4ZmYsCi0JCTB4ZDUwMDAwMDAsIDB4MDA0MDE4ZmYsIDB4ZGUwMDAwMDAsIDB4MDA2MTE4ZmYsCi0JCTB4ZTYwMDAwMDAsIDB4MDA4MTE4ZmYsIDB4ZWUwMDAwMDAsIDB4MDBhMTE4ZmYsCi0JCTB4ZjYwMDAwMDAsIDB4MDBjMjE4ZmYsIDB4ZmYwMDAwMDAsIDB4MDBlMjE4ZmYsCi0JCTB4MDAwNDAwMDAsIDB4MDAwMDIwZmYsIDB4MDgwNDAwMDAsIDB4MDAyMDIwZmYsCi0JCTB4MTAwNDAwMDAsIDB4MDA0MDIwZmYsIDB4MTgwNDAwMDAsIDB4MDA2MTIwZmYsCi0JCTB4MjAwNDAwMDAsIDB4MDA4MTIwZmYsIDB4MjkwNDAwMDAsIDB4MDBhMTIwZmYsCi0JCTB4MzEwNDAwMDAsIDB4MDBjMjIwZmYsIDB4MzkwNDAwMDAsIDB4MDBlMjIwZmYsCi0JCTB4NDEwNDAwMDAsIDB4MDAwMDI5ZmYsIDB4NGEwNDAwMDAsIDB4MDAyMDI5ZmYsCi0JCTB4NTIwNDAwMDAsIDB4MDA0MDI5ZmYsIDB4NWEwNDAwMDAsIDB4MDA2MTI5ZmYsCi0JCTB4NjIwNDAwMDAsIDB4MDA4MTI5ZmYsIDB4NmEwNDAwMDAsIDB4MDBhMTI5ZmYsCi0JCTB4NzMwNDAwMDAsIDB4MDBjMjI5ZmYsIDB4N2IwNDAwMDAsIDB4MDBlMjI5ZmYsCi0JCTB4ODMwNDAwMDAsIDB4MDAwMDMxZmYsIDB4OGIwNDAwMDAsIDB4MDAyMDMxZmYsCi0JCTB4OTQwNDAwMDAsIDB4MDA0MDMxZmYsIDB4OWMwNDAwMDAsIDB4MDA2MTMxZmYsCi0JCTB4YTQwNDAwMDAsIDB4MDA4MTMxZmYsIDB4YWMwNDAwMDAsIDB4MDBhMTMxZmYsCi0JCTB4YjQwNDAwMDAsIDB4MDBjMjMxZmYsIDB4YmQwNDAwMDAsIDB4MDBlMjMxZmYsCi0JCTB4YzUwNDAwMDAsIDB4MDAwMDM5ZmYsIDB4Y2QwNDAwMDAsIDB4MDAyMDM5ZmYsCi0JCTB4ZDUwNDAwMDAsIDB4MDA0MDM5ZmYsIDB4ZGUwNDAwMDAsIDB4MDA2MTM5ZmYsCi0JCTB4ZTYwNDAwMDAsIDB4MDA4MTM5ZmYsIDB4ZWUwNDAwMDAsIDB4MDBhMTM5ZmYsCi0JCTB4ZjYwNDAwMDAsIDB4MDBjMjM5ZmYsIDB4ZmYwNDAwMDAsIDB4MDBlMjM5ZmYsCi0JCTB4MDAwODAwMDAsIDB4MDAwMDQxZmYsIDB4MDgwODAwMDAsIDB4MDAyMDQxZmYsCi0JCTB4MTAwODAwMDAsIDB4MDA0MDQxZmYsIDB4MTgwODAwMDAsIDB4MDA2MTQxZmYsCi0JCTB4MjAwODAwMDAsIDB4MDA4MTQxZmYsIDB4MjkwODAwMDAsIDB4MDBhMTQxZmYsCi0JCTB4MzEwODAwMDAsIDB4MDBjMjQxZmYsIDB4MzkwODAwMDAsIDB4MDBlMjQxZmYsCi0JCTB4NDEwODAwMDAsIDB4MDAwMDRhZmYsIDB4NGEwODAwMDAsIDB4MDAyMDRhZmYsCi0JCTB4NTIwODAwMDAsIDB4MDA0MDRhZmYsIDB4NWEwODAwMDAsIDB4MDA2MTRhZmYsCi0JCTB4NjIwODAwMDAsIDB4MDA4MTRhZmYsIDB4NmEwODAwMDAsIDB4MDBhMTRhZmYsCi0JCTB4NzMwODAwMDAsIDB4MDBjMjRhZmYsIDB4N2IwODAwMDAsIDB4MDBlMjRhZmYsCi0JCTB4ODMwODAwMDAsIDB4MDAwMDUyZmYsIDB4OGIwODAwMDAsIDB4MDAyMDUyZmYsCi0JCTB4OTQwODAwMDAsIDB4MDA0MDUyZmYsIDB4OWMwODAwMDAsIDB4MDA2MTUyZmYsCi0JCTB4YTQwODAwMDAsIDB4MDA4MTUyZmYsIDB4YWMwODAwMDAsIDB4MDBhMTUyZmYsCi0JCTB4YjQwODAwMDAsIDB4MDBjMjUyZmYsIDB4YmQwODAwMDAsIDB4MDBlMjUyZmYsCi0JCTB4YzUwODAwMDAsIDB4MDAwMDVhZmYsIDB4Y2QwODAwMDAsIDB4MDAyMDVhZmYsCi0JCTB4ZDUwODAwMDAsIDB4MDA0MDVhZmYsIDB4ZGUwODAwMDAsIDB4MDA2MTVhZmYsCi0JCTB4ZTYwODAwMDAsIDB4MDA4MTVhZmYsIDB4ZWUwODAwMDAsIDB4MDBhMTVhZmYsCi0JCTB4ZjYwODAwMDAsIDB4MDBjMjVhZmYsIDB4ZmYwODAwMDAsIDB4MDBlMjVhZmYsCi0JCTB4MDAwYzAwMDAsIDB4MDAwMDYyZmYsIDB4MDgwYzAwMDAsIDB4MDAyMDYyZmYsCi0JCTB4MTAwYzAwMDAsIDB4MDA0MDYyZmYsIDB4MTgwYzAwMDAsIDB4MDA2MTYyZmYsCi0JCTB4MjAwYzAwMDAsIDB4MDA4MTYyZmYsIDB4MjkwYzAwMDAsIDB4MDBhMTYyZmYsCi0JCTB4MzEwYzAwMDAsIDB4MDBjMjYyZmYsIDB4MzkwYzAwMDAsIDB4MDBlMjYyZmYsCi0JCTB4NDEwYzAwMDAsIDB4MDAwMDZhZmYsIDB4NGEwYzAwMDAsIDB4MDAyMDZhZmYsCi0JCTB4NTIwYzAwMDAsIDB4MDA0MDZhZmYsIDB4NWEwYzAwMDAsIDB4MDA2MTZhZmYsCi0JCTB4NjIwYzAwMDAsIDB4MDA4MTZhZmYsIDB4NmEwYzAwMDAsIDB4MDBhMTZhZmYsCi0JCTB4NzMwYzAwMDAsIDB4MDBjMjZhZmYsIDB4N2IwYzAwMDAsIDB4MDBlMjZhZmYsCi0JCTB4ODMwYzAwMDAsIDB4MDAwMDczZmYsIDB4OGIwYzAwMDAsIDB4MDAyMDczZmYsCi0JCTB4OTQwYzAwMDAsIDB4MDA0MDczZmYsIDB4OWMwYzAwMDAsIDB4MDA2MTczZmYsCi0JCTB4YTQwYzAwMDAsIDB4MDA4MTczZmYsIDB4YWMwYzAwMDAsIDB4MDBhMTczZmYsCi0JCTB4YjQwYzAwMDAsIDB4MDBjMjczZmYsIDB4YmQwYzAwMDAsIDB4MDBlMjczZmYsCi0JCTB4YzUwYzAwMDAsIDB4MDAwMDdiZmYsIDB4Y2QwYzAwMDAsIDB4MDAyMDdiZmYsCi0JCTB4ZDUwYzAwMDAsIDB4MDA0MDdiZmYsIDB4ZGUwYzAwMDAsIDB4MDA2MTdiZmYsCi0JCTB4ZTYwYzAwMDAsIDB4MDA4MTdiZmYsIDB4ZWUwYzAwMDAsIDB4MDBhMTdiZmYsCi0JCTB4ZjYwYzAwMDAsIDB4MDBjMjdiZmYsIDB4ZmYwYzAwMDAsIDB4MDBlMjdiZmYsCi0JCTB4MDAxMDAwMDAsIDB4MDAwMDgzZmYsIDB4MDgxMDAwMDAsIDB4MDAyMDgzZmYsCi0JCTB4MTAxMDAwMDAsIDB4MDA0MDgzZmYsIDB4MTgxMDAwMDAsIDB4MDA2MTgzZmYsCi0JCTB4MjAxMDAwMDAsIDB4MDA4MTgzZmYsIDB4MjkxMDAwMDAsIDB4MDBhMTgzZmYsCi0JCTB4MzExMDAwMDAsIDB4MDBjMjgzZmYsIDB4MzkxMDAwMDAsIDB4MDBlMjgzZmYsCi0JCTB4NDExMDAwMDAsIDB4MDAwMDhiZmYsIDB4NGExMDAwMDAsIDB4MDAyMDhiZmYsCi0JCTB4NTIxMDAwMDAsIDB4MDA0MDhiZmYsIDB4NWExMDAwMDAsIDB4MDA2MThiZmYsCi0JCTB4NjIxMDAwMDAsIDB4MDA4MThiZmYsIDB4NmExMDAwMDAsIDB4MDBhMThiZmYsCi0JCTB4NzMxMDAwMDAsIDB4MDBjMjhiZmYsIDB4N2IxMDAwMDAsIDB4MDBlMjhiZmYsCi0JCTB4ODMxMDAwMDAsIDB4MDAwMDk0ZmYsIDB4OGIxMDAwMDAsIDB4MDAyMDk0ZmYsCi0JCTB4OTQxMDAwMDAsIDB4MDA0MDk0ZmYsIDB4OWMxMDAwMDAsIDB4MDA2MTk0ZmYsCi0JCTB4YTQxMDAwMDAsIDB4MDA4MTk0ZmYsIDB4YWMxMDAwMDAsIDB4MDBhMTk0ZmYsCi0JCTB4YjQxMDAwMDAsIDB4MDBjMjk0ZmYsIDB4YmQxMDAwMDAsIDB4MDBlMjk0ZmYsCi0JCTB4YzUxMDAwMDAsIDB4MDAwMDljZmYsIDB4Y2QxMDAwMDAsIDB4MDAyMDljZmYsCi0JCTB4ZDUxMDAwMDAsIDB4MDA0MDljZmYsIDB4ZGUxMDAwMDAsIDB4MDA2MTljZmYsCi0JCTB4ZTYxMDAwMDAsIDB4MDA4MTljZmYsIDB4ZWUxMDAwMDAsIDB4MDBhMTljZmYsCi0JCTB4ZjYxMDAwMDAsIDB4MDBjMjljZmYsIDB4ZmYxMDAwMDAsIDB4MDBlMjljZmYsCi0JCTB4MDAxNDAwMDAsIDB4MDAwMGE0ZmYsIDB4MDgxNDAwMDAsIDB4MDAyMGE0ZmYsCi0JCTB4MTAxNDAwMDAsIDB4MDA0MGE0ZmYsIDB4MTgxNDAwMDAsIDB4MDA2MWE0ZmYsCi0JCTB4MjAxNDAwMDAsIDB4MDA4MWE0ZmYsIDB4MjkxNDAwMDAsIDB4MDBhMWE0ZmYsCi0JCTB4MzExNDAwMDAsIDB4MDBjMmE0ZmYsIDB4MzkxNDAwMDAsIDB4MDBlMmE0ZmYsCi0JCTB4NDExNDAwMDAsIDB4MDAwMGFjZmYsIDB4NGExNDAwMDAsIDB4MDAyMGFjZmYsCi0JCTB4NTIxNDAwMDAsIDB4MDA0MGFjZmYsIDB4NWExNDAwMDAsIDB4MDA2MWFjZmYsCi0JCTB4NjIxNDAwMDAsIDB4MDA4MWFjZmYsIDB4NmExNDAwMDAsIDB4MDBhMWFjZmYsCi0JCTB4NzMxNDAwMDAsIDB4MDBjMmFjZmYsIDB4N2IxNDAwMDAsIDB4MDBlMmFjZmYsCi0JCTB4ODMxNDAwMDAsIDB4MDAwMGI0ZmYsIDB4OGIxNDAwMDAsIDB4MDAyMGI0ZmYsCi0JCTB4OTQxNDAwMDAsIDB4MDA0MGI0ZmYsIDB4OWMxNDAwMDAsIDB4MDA2MWI0ZmYsCi0JCTB4YTQxNDAwMDAsIDB4MDA4MWI0ZmYsIDB4YWMxNDAwMDAsIDB4MDBhMWI0ZmYsCi0JCTB4YjQxNDAwMDAsIDB4MDBjMmI0ZmYsIDB4YmQxNDAwMDAsIDB4MDBlMmI0ZmYsCi0JCTB4YzUxNDAwMDAsIDB4MDAwMGJkZmYsIDB4Y2QxNDAwMDAsIDB4MDAyMGJkZmYsCi0JCTB4ZDUxNDAwMDAsIDB4MDA0MGJkZmYsIDB4ZGUxNDAwMDAsIDB4MDA2MWJkZmYsCi0JCTB4ZTYxNDAwMDAsIDB4MDA4MWJkZmYsIDB4ZWUxNDAwMDAsIDB4MDBhMWJkZmYsCi0JCTB4ZjYxNDAwMDAsIDB4MDBjMmJkZmYsIDB4ZmYxNDAwMDAsIDB4MDBlMmJkZmYsCi0JCTB4MDAxODAwMDAsIDB4MDAwMGM1ZmYsIDB4MDgxODAwMDAsIDB4MDAyMGM1ZmYsCi0JCTB4MTAxODAwMDAsIDB4MDA0MGM1ZmYsIDB4MTgxODAwMDAsIDB4MDA2MWM1ZmYsCi0JCTB4MjAxODAwMDAsIDB4MDA4MWM1ZmYsIDB4MjkxODAwMDAsIDB4MDBhMWM1ZmYsCi0JCTB4MzExODAwMDAsIDB4MDBjMmM1ZmYsIDB4MzkxODAwMDAsIDB4MDBlMmM1ZmYsCi0JCTB4NDExODAwMDAsIDB4MDAwMGNkZmYsIDB4NGExODAwMDAsIDB4MDAyMGNkZmYsCi0JCTB4NTIxODAwMDAsIDB4MDA0MGNkZmYsIDB4NWExODAwMDAsIDB4MDA2MWNkZmYsCi0JCTB4NjIxODAwMDAsIDB4MDA4MWNkZmYsIDB4NmExODAwMDAsIDB4MDBhMWNkZmYsCi0JCTB4NzMxODAwMDAsIDB4MDBjMmNkZmYsIDB4N2IxODAwMDAsIDB4MDBlMmNkZmYsCi0JCTB4ODMxODAwMDAsIDB4MDAwMGQ1ZmYsIDB4OGIxODAwMDAsIDB4MDAyMGQ1ZmYsCi0JCTB4OTQxODAwMDAsIDB4MDA0MGQ1ZmYsIDB4OWMxODAwMDAsIDB4MDA2MWQ1ZmYsCi0JCTB4YTQxODAwMDAsIDB4MDA4MWQ1ZmYsIDB4YWMxODAwMDAsIDB4MDBhMWQ1ZmYsCi0JCTB4YjQxODAwMDAsIDB4MDBjMmQ1ZmYsIDB4YmQxODAwMDAsIDB4MDBlMmQ1ZmYsCi0JCTB4YzUxODAwMDAsIDB4MDAwMGRlZmYsIDB4Y2QxODAwMDAsIDB4MDAyMGRlZmYsCi0JCTB4ZDUxODAwMDAsIDB4MDA0MGRlZmYsIDB4ZGUxODAwMDAsIDB4MDA2MWRlZmYsCi0JCTB4ZTYxODAwMDAsIDB4MDA4MWRlZmYsIDB4ZWUxODAwMDAsIDB4MDBhMWRlZmYsCi0JCTB4ZjYxODAwMDAsIDB4MDBjMmRlZmYsIDB4ZmYxODAwMDAsIDB4MDBlMmRlZmYsCi0JCTB4MDAxYzAwMDAsIDB4MDAwMGU2ZmYsIDB4MDgxYzAwMDAsIDB4MDAyMGU2ZmYsCi0JCTB4MTAxYzAwMDAsIDB4MDA0MGU2ZmYsIDB4MTgxYzAwMDAsIDB4MDA2MWU2ZmYsCi0JCTB4MjAxYzAwMDAsIDB4MDA4MWU2ZmYsIDB4MjkxYzAwMDAsIDB4MDBhMWU2ZmYsCi0JCTB4MzExYzAwMDAsIDB4MDBjMmU2ZmYsIDB4MzkxYzAwMDAsIDB4MDBlMmU2ZmYsCi0JCTB4NDExYzAwMDAsIDB4MDAwMGVlZmYsIDB4NGExYzAwMDAsIDB4MDAyMGVlZmYsCi0JCTB4NTIxYzAwMDAsIDB4MDA0MGVlZmYsIDB4NWExYzAwMDAsIDB4MDA2MWVlZmYsCi0JCTB4NjIxYzAwMDAsIDB4MDA4MWVlZmYsIDB4NmExYzAwMDAsIDB4MDBhMWVlZmYsCi0JCTB4NzMxYzAwMDAsIDB4MDBjMmVlZmYsIDB4N2IxYzAwMDAsIDB4MDBlMmVlZmYsCi0JCTB4ODMxYzAwMDAsIDB4MDAwMGY2ZmYsIDB4OGIxYzAwMDAsIDB4MDAyMGY2ZmYsCi0JCTB4OTQxYzAwMDAsIDB4MDA0MGY2ZmYsIDB4OWMxYzAwMDAsIDB4MDA2MWY2ZmYsCi0JCTB4YTQxYzAwMDAsIDB4MDA4MWY2ZmYsIDB4YWMxYzAwMDAsIDB4MDBhMWY2ZmYsCi0JCTB4YjQxYzAwMDAsIDB4MDBjMmY2ZmYsIDB4YmQxYzAwMDAsIDB4MDBlMmY2ZmYsCi0JCTB4YzUxYzAwMDAsIDB4MDAwMGZmZmYsIDB4Y2QxYzAwMDAsIDB4MDAyMGZmZmYsCi0JCTB4ZDUxYzAwMDAsIDB4MDA0MGZmZmYsIDB4ZGUxYzAwMDAsIDB4MDA2MWZmZmYsCi0JCTB4ZTYxYzAwMDAsIDB4MDA4MWZmZmYsIDB4ZWUxYzAwMDAsIDB4MDBhMWZmZmYsCi0JCTB4ZjYxYzAwMDAsIDB4MDBjMmZmZmYsIDB4ZmYxYzAwMDAsIDB4MDBlMmZmZmYKLX07Ci1zdGF0aWMgdm9pZCBCbGl0X1JHQjU2NV9CR1JBODg4OChTRExfQmxpdEluZm8gKmluZm8pCi17Ci0gICAgQmxpdF9SR0I1NjVfMzIoaW5mbywgUkdCNTY1X0JHUkE4ODg4X0xVVCk7Ci19Ci0KLS8qIFNwZWNpYWwgb3B0aW1pemVkIGJsaXQgZm9yIFJHQiA4LTgtOCAtLT4gUkdCIDMtMy0yICovCi0jaWZuZGVmIFJHQjg4OF9SR0IzMzIKLSNkZWZpbmUgUkdCODg4X1JHQjMzMihkc3QsIHNyYykgeyBcCi0JZHN0ID0gKCgoc3JjKSYweDAwRTAwMDAwKT4+MTYpfCBcCi0JICAgICAgKCgoc3JjKSYweDAwMDBFMDAwKT4+MTEpfCBcCi0JICAgICAgKCgoc3JjKSYweDAwMDAwMEMwKT4+Nik7IFwKLX0KLSNlbmRpZgotc3RhdGljIHZvaWQgQmxpdF9SR0I4ODhfaW5kZXg4X21hcChTRExfQmxpdEluZm8gKmluZm8pCi17Ci0jaWZuZGVmIFVTRV9EVUZGU19MT09QCi0JaW50IGM7Ci0jZW5kaWYKLQlpbnQgUGl4ZWw7Ci0JaW50IHdpZHRoLCBoZWlnaHQ7Ci0JVWludDMyICpzcmM7Ci0JY29uc3QgVWludDggKm1hcDsKLQlVaW50OCAqZHN0OwotCWludCBzcmNza2lwLCBkc3Rza2lwOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCXNyYyA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKLQlzcmNza2lwID0gaW5mby0+c19za2lwLzQ7Ci0JZHN0ID0gaW5mby0+ZF9waXhlbHM7Ci0JZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQltYXAgPSBpbmZvLT50YWJsZTsKLQotI2lmZGVmIFVTRV9EVUZGU19MT09QCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJRFVGRlNfTE9PUCgKLQkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOwotCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKLQkJCSsrc3JjOwotCQksIHdpZHRoKTsKLQkJc3JjICs9IHNyY3NraXA7Ci0JCWRzdCArPSBkc3Rza2lwOwotCX0KLSNlbHNlCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJZm9yICggYz13aWR0aC80OyBjOyAtLWMgKSB7Ci0JCQkvKiBQYWNrIFJHQiBpbnRvIDhiaXQgcGl4ZWwgKi8KLQkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOwotCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKLQkJCSsrc3JjOwotCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7Ci0JCQkqZHN0KysgPSBtYXBbUGl4ZWxdOwotCQkJKytzcmM7Ci0JCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKLQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07Ci0JCQkrK3NyYzsKLQkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOwotCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKLQkJCSsrc3JjOwotCQl9Ci0JCXN3aXRjaCAoIHdpZHRoICYgMyApIHsKLQkJCWNhc2UgMzoKLQkJCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKLQkJCQkqZHN0KysgPSBtYXBbUGl4ZWxdOwotCQkJCSsrc3JjOwotCQkJY2FzZSAyOgotCQkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOwotCQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07Ci0JCQkJKytzcmM7Ci0JCQljYXNlIDE6Ci0JCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7Ci0JCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKLQkJCQkrK3NyYzsKLQkJfQotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotI2VuZGlmIC8qIFVTRV9EVUZGU19MT09QICovCi19Ci1zdGF0aWMgdm9pZCBCbGl0TnRvMShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0jaWZuZGVmIFVTRV9EVUZGU19MT09QCi0JaW50IGM7Ci0jZW5kaWYKLQlpbnQgd2lkdGgsIGhlaWdodDsKLQlVaW50OCAqc3JjOwotCWNvbnN0IFVpbnQ4ICptYXA7Ci0JVWludDggKmRzdDsKLQlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKLQlpbnQgc3JjYnBwOwotCVVpbnQzMiBQaXhlbDsKLQlpbnQgIHNSLCBzRywgc0I7Ci0JU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQ7Ci0KLQkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KLQl3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0Jc3JjID0gaW5mby0+c19waXhlbHM7Ci0Jc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCW1hcCA9IGluZm8tPnRhYmxlOwotCXNyY2ZtdCA9IGluZm8tPnNyYzsKLQlzcmNicHAgPSBzcmNmbXQtPkJ5dGVzUGVyUGl4ZWw7Ci0KLQlpZiAoIG1hcCA9PSBOVUxMICkgewotCQl3aGlsZSAoIGhlaWdodC0tICkgewotI2lmZGVmIFVTRV9EVUZGU19MT09QCi0JCQlEVUZGU19MT09QKAotCQkJCURJU0VNQkxFX1JHQihzcmMsIHNyY2JwcCwgc3JjZm10LCBQaXhlbCwKLQkJCQkJCQkJc1IsIHNHLCBzQik7Ci0JCQkJaWYgKCAxICkgewotCQkJCSAgCS8qIFBhY2sgUkdCIGludG8gOGJpdCBwaXhlbCAqLwotCQkJCSAgCSpkc3QgPSAoKHNSPj41KTw8KDMrMikpfAotCQkJCQkgICAgICAgICgoc0c+PjUpPDwoMikpIHwKLQkJCQkJICAgICAgICAoKHNCPj42KTw8KDApKSA7Ci0JCQkJfQotCQkJCWRzdCsrOwotCQkJCXNyYyArPSBzcmNicHA7Ci0JCQksIHdpZHRoKTsKLSNlbHNlCi0JCQlmb3IgKCBjPXdpZHRoOyBjOyAtLWMgKSB7Ci0JCQkJRElTRU1CTEVfUkdCKHNyYywgc3JjYnBwLCBzcmNmbXQsIFBpeGVsLAotCQkJCQkJCQlzUiwgc0csIHNCKTsKLQkJCQlpZiAoIDEgKSB7Ci0JCQkJICAJLyogUGFjayBSR0IgaW50byA4Yml0IHBpeGVsICovCi0JCQkJICAJKmRzdCA9ICgoc1I+PjUpPDwoMysyKSl8Ci0JCQkJCSAgICAgICAgKChzRz4+NSk8PCgyKSkgfAotCQkJCQkgICAgICAgICgoc0I+PjYpPDwoMCkpIDsKLQkJCQl9Ci0JCQkJZHN0Kys7Ci0JCQkJc3JjICs9IHNyY2JwcDsKLQkJCX0KLSNlbmRpZgotCQkJc3JjICs9IHNyY3NraXA7Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCX0gZWxzZSB7Ci0JCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0jaWZkZWYgVVNFX0RVRkZTX0xPT1AKLQkJCURVRkZTX0xPT1AoCi0JCQkJRElTRU1CTEVfUkdCKHNyYywgc3JjYnBwLCBzcmNmbXQsIFBpeGVsLAotCQkJCQkJCQlzUiwgc0csIHNCKTsKLQkJCQlpZiAoIDEgKSB7Ci0JCQkJICAJLyogUGFjayBSR0IgaW50byA4Yml0IHBpeGVsICovCi0JCQkJICAJKmRzdCA9IG1hcFsoKHNSPj41KTw8KDMrMikpfAotCQkJCQkJICAgKChzRz4+NSk8PCgyKSkgIHwKLQkJCQkJCSAgICgoc0I+PjYpPDwoMCkpICBdOwotCQkJCX0KLQkJCQlkc3QrKzsKLQkJCQlzcmMgKz0gc3JjYnBwOwotCQkJLCB3aWR0aCk7Ci0jZWxzZQotCQkJZm9yICggYz13aWR0aDsgYzsgLS1jICkgewotCQkJCURJU0VNQkxFX1JHQihzcmMsIHNyY2JwcCwgc3JjZm10LCBQaXhlbCwKLQkJCQkJCQkJc1IsIHNHLCBzQik7Ci0JCQkJaWYgKCAxICkgewotCQkJCSAgCS8qIFBhY2sgUkdCIGludG8gOGJpdCBwaXhlbCAqLwotCQkJCSAgCSpkc3QgPSBtYXBbKChzUj4+NSk8PCgzKzIpKXwKLQkJCQkJCSAgICgoc0c+PjUpPDwoMikpICB8Ci0JCQkJCQkgICAoKHNCPj42KTw8KDApKSAgXTsKLQkJCQl9Ci0JCQkJZHN0Kys7Ci0JCQkJc3JjICs9IHNyY2JwcDsKLQkJCX0KLSNlbmRpZiAvKiBVU0VfRFVGRlNfTE9PUCAqLwotCQkJc3JjICs9IHNyY3NraXA7Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCX0KLX0KLQotLyogYmxpdHMgMzIgYml0IFJHQjwtPlJHQkEgd2l0aCBib3RoIHN1cmZhY2VzIGhhdmluZyB0aGUgc2FtZSBSLEcsQiBmaWVsZHMgKi8KLXN0YXRpYyB2b2lkIEJsaXQ0dG80TWFza0FscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50MzIgKnNyYyA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlVaW50MzIgKmRzdCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLQlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKLQotCWlmIChkc3RmbXQtPkFtYXNrKSB7Ci0JCS8qIFJHQi0+UkdCQSwgU0VUX0FMUEhBICovCi0JCVVpbnQzMiBtYXNrID0gKHNyY2ZtdC0+YWxwaGEgPj4gZHN0Zm10LT5BbG9zcykgPDwgZHN0Zm10LT5Bc2hpZnQ7Ci0KLQkJd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJCURVRkZTX0xPT1AoCi0JCQl7Ci0JCQkJKmRzdCA9ICpzcmMgfCBtYXNrOwotCQkJCSsrZHN0OwotCQkJCSsrc3JjOwotCQkJfSwKLQkJCXdpZHRoKTsKLQkJCXNyYyA9IChVaW50MzIqKSgoVWludDgqKXNyYyArIHNyY3NraXApOwotCQkJZHN0ID0gKFVpbnQzMiopKChVaW50OCopZHN0ICsgZHN0c2tpcCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBSR0JBLT5SR0IsIE5PX0FMUEhBICovCi0JCVVpbnQzMiBtYXNrID0gc3JjZm10LT5SbWFzayB8IHNyY2ZtdC0+R21hc2sgfCBzcmNmbXQtPkJtYXNrOwotCi0JCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JCQlEVUZGU19MT09QKAotCQkJewotCQkJCSpkc3QgPSAqc3JjICYgbWFzazsKLQkJCQkrK2RzdDsKLQkJCQkrK3NyYzsKLQkJCX0sCi0JCQl3aWR0aCk7Ci0JCQlzcmMgPSAoVWludDMyKikoKFVpbnQ4KilzcmMgKyBzcmNza2lwKTsKLQkJCWRzdCA9IChVaW50MzIqKSgoVWludDgqKWRzdCArIGRzdHNraXApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBCbGl0TnRvTihTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLQlpbnQgc3JjYnBwID0gc3JjZm10LT5CeXRlc1BlclBpeGVsOwotCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OwotCWludCBkc3RicHAgPSBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JdW5zaWduZWQgYWxwaGEgPSBkc3RmbXQtPkFtYXNrID8gc3JjZm10LT5hbHBoYSA6IDA7Ci0KLQl3aGlsZSAoIGhlaWdodC0tICkgewotCQlEVUZGU19MT09QKAotCQl7Ci0JCSAgICAgICAgVWludDMyIFBpeGVsOwotCQkJdW5zaWduZWQgc1I7Ci0JCQl1bnNpZ25lZCBzRzsKLQkJCXVuc2lnbmVkIHNCOwotCQkJRElTRU1CTEVfUkdCKHNyYywgc3JjYnBwLCBzcmNmbXQsIFBpeGVsLCBzUiwgc0csIHNCKTsKLQkJCUFTU0VNQkxFX1JHQkEoZHN0LCBkc3RicHAsIGRzdGZtdCwgc1IsIHNHLCBzQiwgYWxwaGEpOwotCQkJZHN0ICs9IGRzdGJwcDsKLQkJCXNyYyArPSBzcmNicHA7Ci0JCX0sCi0JCXdpZHRoKTsKLQkJc3JjICs9IHNyY3NraXA7Ci0JCWRzdCArPSBkc3Rza2lwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQmxpdE50b05Db3B5QWxwaGEoU0RMX0JsaXRJbmZvICppbmZvKQotewotCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7Ci0JaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OwotCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKLQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKLQlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7Ci0JaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7Ci0JU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7Ci0JaW50IHNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKLQlpbnQgZHN0YnBwID0gZHN0Zm10LT5CeXRlc1BlclBpeGVsOwotCWludCBjOwotCi0JLyogRklYTUU6IHNob3VsZCBtYXAgYWxwaGEgdG8gWzAuLjI1NV0gY29ycmVjdGx5ISAqLwotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JCWZvciAoIGM9d2lkdGg7IGM7IC0tYyApIHsKLQkJICAgICAgICBVaW50MzIgUGl4ZWw7Ci0JCQl1bnNpZ25lZCBzUiwgc0csIHNCLCBzQTsKLQkJCURJU0VNQkxFX1JHQkEoc3JjLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsCi0JCQkJICAgICAgc1IsIHNHLCBzQiwgc0EpOwotCQkJQVNTRU1CTEVfUkdCQShkc3QsIGRzdGJwcCwgZHN0Zm10LAotCQkJCSAgICAgIHNSLCBzRywgc0IsIHNBKTsKLQkJCWRzdCArPSBkc3RicHA7Ci0JCQlzcmMgKz0gc3JjYnBwOwotCQl9Ci0JCXNyYyArPSBzcmNza2lwOwotCQlkc3QgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJsaXROdG8xS2V5KFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCVNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOwotCWNvbnN0IFVpbnQ4ICpwYWxtYXAgPSBpbmZvLT50YWJsZTsKLQlVaW50MzIgY2tleSA9IHNyY2ZtdC0+Y29sb3JrZXk7Ci0JVWludDMyIHJnYm1hc2sgPSB+c3JjZm10LT5BbWFzazsKLQlpbnQgc3JjYnBwOwotCVVpbnQzMiBQaXhlbDsKLQl1bnNpZ25lZCBzUiwgc0csIHNCOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jc3JjYnBwID0gc3JjZm10LT5CeXRlc1BlclBpeGVsOwotCWNrZXkgJj0gcmdibWFzazsKLQotCWlmICggcGFsbWFwID09IE5VTEwgKSB7Ci0JCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JCQlEVUZGU19MT09QKAotCQkJewotCQkJCURJU0VNQkxFX1JHQihzcmMsIHNyY2JwcCwgc3JjZm10LCBQaXhlbCwKLQkJCQkJCQkJc1IsIHNHLCBzQik7Ci0JCQkJaWYgKCAoUGl4ZWwgJiByZ2JtYXNrKSAhPSBja2V5ICkgewotCQkJCSAgCS8qIFBhY2sgUkdCIGludG8gOGJpdCBwaXhlbCAqLwotCQkJCSAgCSpkc3QgPSAoVWludDgpKCgoc1I+PjUpPDwoMysyKSl8Ci0JCQkJCQkgICAgICAgICAgICgoc0c+PjUpPDwoMikpIHwKLQkJCQkJCSAgICAgICAgICAgKChzQj4+Nik8PCgwKSkpOwotCQkJCX0KLQkJCQlkc3QrKzsKLQkJCQlzcmMgKz0gc3JjYnBwOwotCQkJfSwKLQkJCXdpZHRoKTsKLQkJCXNyYyArPSBzcmNza2lwOwotCQkJZHN0ICs9IGRzdHNraXA7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoIGhlaWdodC0tICkgewotCQkJRFVGRlNfTE9PUCgKLQkJCXsKLQkJCQlESVNFTUJMRV9SR0Ioc3JjLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsCi0JCQkJCQkJCXNSLCBzRywgc0IpOwotCQkJCWlmICggKFBpeGVsICYgcmdibWFzaykgIT0gY2tleSApIHsKLQkJCQkgIAkvKiBQYWNrIFJHQiBpbnRvIDhiaXQgcGl4ZWwgKi8KLQkJCQkgIAkqZHN0ID0gKFVpbnQ4KXBhbG1hcFsoKHNSPj41KTw8KDMrMikpfAotCQkJCQkJCSAgICAgICAgICAgICAoKHNHPj41KTw8KDIpKSAgfAotCQkJCQkJCSAgICAgICAgICAgICAoKHNCPj42KTw8KDApKSAgXTsKLQkJCQl9Ci0JCQkJZHN0Kys7Ci0JCQkJc3JjICs9IHNyY2JwcDsKLQkJCX0sCi0JCQl3aWR0aCk7Ci0JCQlzcmMgKz0gc3Jjc2tpcDsKLQkJCWRzdCArPSBkc3Rza2lwOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBCbGl0MnRvMktleShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDE2ICpzcmNwID0gKFVpbnQxNiAqKWluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlVaW50MzIgY2tleSA9IGluZm8tPnNyYy0+Y29sb3JrZXk7Ci0JVWludDMyIHJnYm1hc2sgPSB+aW5mby0+c3JjLT5BbWFzazsKLQotCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLwotICAgICAgICBzcmNza2lwIC89IDI7Ci0gICAgICAgIGRzdHNraXAgLz0gMjsKLQlja2V5ICY9IHJnYm1hc2s7Ci0KLQl3aGlsZSAoIGhlaWdodC0tICkgewotCQlEVUZGU19MT09QKAotCQl7Ci0JCQlpZiAoICgqc3JjcCAmIHJnYm1hc2spICE9IGNrZXkgKSB7Ci0JCQkJKmRzdHAgPSAqc3JjcDsKLQkJCX0KLQkJCWRzdHArKzsKLQkJCXNyY3ArKzsKLQkJfSwKLQkJd2lkdGgpOwotCQlzcmNwICs9IHNyY3NraXA7Ci0JCWRzdHAgKz0gZHN0c2tpcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJsaXROdG9OS2V5KFNETF9CbGl0SW5mbyAqaW5mbykKLXsKLQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOwotCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKLQlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7Ci0JaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7Ci0JVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOwotCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOwotCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKLQlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKLQlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKLQlpbnQgc3JjYnBwID0gc3JjZm10LT5CeXRlc1BlclBpeGVsOwotCWludCBkc3RicHAgPSBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JdW5zaWduZWQgYWxwaGEgPSBkc3RmbXQtPkFtYXNrID8gc3JjZm10LT5hbHBoYSA6IDA7Ci0JVWludDMyIHJnYm1hc2sgPSB+c3JjZm10LT5BbWFzazsKLQotCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLwotCWNrZXkgJj0gcmdibWFzazsKLQotCXdoaWxlICggaGVpZ2h0LS0gKSB7Ci0JCURVRkZTX0xPT1AoCi0JCXsKLQkJICAgICAgICBVaW50MzIgUGl4ZWw7Ci0JCQl1bnNpZ25lZCBzUjsKLQkJCXVuc2lnbmVkIHNHOwotCQkJdW5zaWduZWQgc0I7Ci0JCQlSRVRSSUVWRV9SR0JfUElYRUwoc3JjLCBzcmNicHAsIFBpeGVsKTsKLQkJCWlmICggKFBpeGVsICYgcmdibWFzaykgIT0gY2tleSApIHsKLQkJCSAgICAgICAgUkdCX0ZST01fUElYRUwoUGl4ZWwsIHNyY2ZtdCwgc1IsIHNHLCBzQik7Ci0JCQkJQVNTRU1CTEVfUkdCQShkc3QsIGRzdGJwcCwgZHN0Zm10LAotCQkJCQkgICAgICBzUiwgc0csIHNCLCBhbHBoYSk7Ci0JCQl9Ci0JCQlkc3QgKz0gZHN0YnBwOwotCQkJc3JjICs9IHNyY2JwcDsKLQkJfSwKLQkJd2lkdGgpOwotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBCbGl0TnRvTktleUNvcHlBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCi17Ci0JaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKLQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7Ci0JVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOwotCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOwotCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKLQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKLQlVaW50MzIgY2tleSA9IGluZm8tPnNyYy0+Y29sb3JrZXk7Ci0JU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7Ci0JU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7Ci0JVWludDMyIHJnYm1hc2sgPSB+c3JjZm10LT5BbWFzazsKLQotCVVpbnQ4IHNyY2JwcDsKLQlVaW50OCBkc3RicHA7Ci0JVWludDMyIFBpeGVsOwotCXVuc2lnbmVkIHNSLCBzRywgc0IsIHNBOwotCi0JLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCi0Jc3JjYnBwID0gc3JjZm10LT5CeXRlc1BlclBpeGVsOwotCWRzdGJwcCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKLQlja2V5ICY9IHJnYm1hc2s7Ci0KLQkvKiBGSVhNRTogc2hvdWxkIG1hcCBhbHBoYSB0byBbMC4uMjU1XSBjb3JyZWN0bHkhICovCi0Jd2hpbGUgKCBoZWlnaHQtLSApIHsKLQkJRFVGRlNfTE9PUCgKLQkJewotCQkJRElTRU1CTEVfUkdCQShzcmMsIHNyY2JwcCwgc3JjZm10LCBQaXhlbCwKLQkJCQkgICAgICBzUiwgc0csIHNCLCBzQSk7Ci0JCQlpZiAoIChQaXhlbCAmIHJnYm1hc2spICE9IGNrZXkgKSB7Ci0JCQkJICBBU1NFTUJMRV9SR0JBKGRzdCwgZHN0YnBwLCBkc3RmbXQsCi0JCQkJCQlzUiwgc0csIHNCLCBzQSk7Ci0JCQl9Ci0JCQlkc3QgKz0gZHN0YnBwOwotCQkJc3JjICs9IHNyY2JwcDsKLQkJfSwKLQkJd2lkdGgpOwotCQlzcmMgKz0gc3Jjc2tpcDsKLQkJZHN0ICs9IGRzdHNraXA7Ci0JfQotfQotCi0vKiBOb3JtYWwgTiB0byBOIG9wdGltaXplZCBibGl0dGVycyAqLwotc3RydWN0IGJsaXRfdGFibGUgewotCVVpbnQzMiBzcmNSLCBzcmNHLCBzcmNCOwotCWludCBkc3RicHA7Ci0JVWludDMyIGRzdFIsIGRzdEcsIGRzdEI7Ci0JVWludDMyIGJsaXRfZmVhdHVyZXM7Ci0Jdm9pZCAqYXV4X2RhdGE7Ci0JU0RMX2xvYmxpdCBibGl0ZnVuYzsKLQllbnVtIHsgTk9fQUxQSEE9MSwgU0VUX0FMUEhBPTIsIENPUFlfQUxQSEE9NCB9IGFscGhhOwotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmxpdF90YWJsZSBub3JtYWxfYmxpdF8xW10gPSB7Ci0JLyogRGVmYXVsdCBmb3IgOC1iaXQgUkdCIHNvdXJjZSwgYW4gaW52YWxpZCBjb21iaW5hdGlvbiAqLwotCXsgMCwwLDAsIDAsIDAsMCwwLCAwLCBOVUxMLCBOVUxMIH0sCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBibGl0X3RhYmxlIG5vcm1hbF9ibGl0XzJbXSA9IHsKLSNpZiBTRExfSEVSTUVTX0JMSVRURVJTCi0gICAgeyAweDAwMDBGODAwLDB4MDAwMDA3RTAsMHgwMDAwMDAxRiwgMiwgMHgwMDAwMDAxRiwweDAwMDAwN0UwLDB4MDAwMEY4MDAsCi0gICAgICAwLCBDb252ZXJ0WDg2cDE2XzE2QkdSNTY1LCBDb252ZXJ0WDg2LCBOT19BTFBIQSB9LAotICAgIHsgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsIDIsIDB4MDAwMDdDMDAsMHgwMDAwMDNFMCwweDAwMDAwMDFGLAotICAgICAgMCwgQ29udmVydFg4NnAxNl8xNlJHQjU1NSwgQ29udmVydFg4NiwgTk9fQUxQSEEgfSwKLSAgICB7IDB4MDAwMEY4MDAsMHgwMDAwMDdFMCwweDAwMDAwMDFGLCAyLCAweDAwMDAwMDFGLDB4MDAwMDAzRTAsMHgwMDAwN0MwMCwKLSAgICAgIDAsIENvbnZlcnRYODZwMTZfMTZCR1I1NTUsIENvbnZlcnRYODYsIE5PX0FMUEhBIH0sCi0jZWxpZiBTRExfQUxUSVZFQ19CTElUVEVSUwotICAgIC8qIGhhcy1hbHRpdmVjICovCi0gICAgeyAweDAwMDBGODAwLDB4MDAwMDA3RTAsMHgwMDAwMDAxRiwgNCwgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0gICAgICAyLCBOVUxMLCBCbGl0X1JHQjU2NV8zMkFsdGl2ZWMsIE5PX0FMUEhBIHwgQ09QWV9BTFBIQSB8IFNFVF9BTFBIQSB9LAotICAgIHsgMHgwMDAwN0MwMCwweDAwMDAwM0UwLDB4MDAwMDAwMUYsIDQsIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotICAgICAgMiwgTlVMTCwgQmxpdF9SR0I1NTVfMzJBbHRpdmVjLCBOT19BTFBIQSB8IENPUFlfQUxQSEEgfCBTRVRfQUxQSEEgfSwKLSNlbmRpZgotICAgIHsgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsIDQsIDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLAotICAgICAgMCwgTlVMTCwgQmxpdF9SR0I1NjVfQVJHQjg4ODgsIFNFVF9BTFBIQSB9LAotICAgIHsgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsIDQsIDB4MDAwMDAwRkYsMHgwMDAwRkYwMCwweDAwRkYwMDAwLAotICAgICAgMCwgTlVMTCwgQmxpdF9SR0I1NjVfQUJHUjg4ODgsIFNFVF9BTFBIQSB9LAotICAgIHsgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsIDQsIDB4RkYwMDAwMDAsMHgwMEZGMDAwMCwweDAwMDBGRjAwLAotICAgICAgMCwgTlVMTCwgQmxpdF9SR0I1NjVfUkdCQTg4ODgsIFNFVF9BTFBIQSB9LAotICAgIHsgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsIDQsIDB4MDAwMEZGMDAsMHgwMEZGMDAwMCwweEZGMDAwMDAwLAotICAgICAgMCwgTlVMTCwgQmxpdF9SR0I1NjVfQkdSQTg4ODgsIFNFVF9BTFBIQSB9LAotCi0gICAgLyogRGVmYXVsdCBmb3IgMTYtYml0IFJHQiBzb3VyY2UsIHVzZWQgaWYgbm8gb3RoZXIgYmxpdHRlciBtYXRjaGVzICovCi0gICAgeyAwLDAsMCwgMCwgMCwwLDAsIDAsIE5VTEwsIEJsaXROdG9OLCAwIH0KLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGJsaXRfdGFibGUgbm9ybWFsX2JsaXRfM1tdID0gewotCS8qIERlZmF1bHQgZm9yIDI0LWJpdCBSR0Igc291cmNlLCBuZXZlciBvcHRpbWl6ZWQgKi8KLSAgICB7IDAsMCwwLCAwLCAwLDAsMCwgMCwgTlVMTCwgQmxpdE50b04sIDAgfQotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmxpdF90YWJsZSBub3JtYWxfYmxpdF80W10gPSB7Ci0jaWYgU0RMX0hFUk1FU19CTElUVEVSUwotICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDIsIDB4MDAwMEY4MDAsMHgwMDAwMDdFMCwweDAwMDAwMDFGLAotICAgICAgMSwgQ29udmVydE1NWHBJSTMyXzE2UkdCNTY1LCBDb252ZXJ0TU1YLCBOT19BTFBIQSB9LAotICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDIsIDB4MDAwMEY4MDAsMHgwMDAwMDdFMCwweDAwMDAwMDFGLAotICAgICAgMCwgQ29udmVydFg4NnAzMl8xNlJHQjU2NSwgQ29udmVydFg4NiwgTk9fQUxQSEEgfSwKLSAgICB7IDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLCAyLCAweDAwMDAwMDFGLDB4MDAwMDA3RTAsMHgwMDAwRjgwMCwKLSAgICAgIDEsIENvbnZlcnRNTVhwSUkzMl8xNkJHUjU2NSwgQ29udmVydE1NWCwgTk9fQUxQSEEgfSwKLSAgICB7IDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLCAyLCAweDAwMDAwMDFGLDB4MDAwMDA3RTAsMHgwMDAwRjgwMCwKLSAgICAgIDAsIENvbnZlcnRYODZwMzJfMTZCR1I1NjUsIENvbnZlcnRYODYsIE5PX0FMUEhBIH0sCi0gICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgMiwgMHgwMDAwN0MwMCwweDAwMDAwM0UwLDB4MDAwMDAwMUYsCi0gICAgICAxLCBDb252ZXJ0TU1YcElJMzJfMTZSR0I1NTUsIENvbnZlcnRNTVgsIE5PX0FMUEhBIH0sCi0gICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgMiwgMHgwMDAwN0MwMCwweDAwMDAwM0UwLDB4MDAwMDAwMUYsCi0gICAgICAwLCBDb252ZXJ0WDg2cDMyXzE2UkdCNTU1LCBDb252ZXJ0WDg2LCBOT19BTFBIQSB9LAotICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDIsIDB4MDAwMDAwMUYsMHgwMDAwMDNFMCwweDAwMDA3QzAwLAotICAgICAgMSwgQ29udmVydE1NWHBJSTMyXzE2QkdSNTU1LCBDb252ZXJ0TU1YLCBOT19BTFBIQSB9LAotICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDIsIDB4MDAwMDAwMUYsMHgwMDAwMDNFMCwweDAwMDA3QzAwLAotICAgICAgMCwgQ29udmVydFg4NnAzMl8xNkJHUjU1NSwgQ29udmVydFg4NiwgTk9fQUxQSEEgfSwKLSAgICB7IDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLCAzLCAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwKLSAgICAgIDAsIENvbnZlcnRYODZwMzJfMjRSR0I4ODgsIENvbnZlcnRYODYsIE5PX0FMUEhBIH0sCi0gICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgMywgMHgwMDAwMDBGRiwweDAwMDBGRjAwLDB4MDBGRjAwMDAsCi0gICAgICAwLCBDb252ZXJ0WDg2cDMyXzI0QkdSODg4LCBDb252ZXJ0WDg2LCBOT19BTFBIQSB9LAotICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDQsIDB4MDAwMDAwRkYsMHgwMDAwRkYwMCwweDAwRkYwMDAwLAotICAgICAgMCwgQ29udmVydFg4NnAzMl8zMkJHUjg4OCwgQ29udmVydFg4NiwgTk9fQUxQSEEgfSwKLSAgICB7IDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLCA0LCAweEZGMDAwMDAwLDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwKLSAgICAgIDAsIENvbnZlcnRYODZwMzJfMzJSR0JBODg4LCBDb252ZXJ0WDg2LCBOT19BTFBIQSB9LAotICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDQsIDB4MDAwMEZGMDAsMHgwMEZGMDAwMCwweEZGMDAwMDAwLAotICAgICAgMCwgQ29udmVydFg4NnAzMl8zMkJHUkE4ODgsIENvbnZlcnRYODYsIE5PX0FMUEhBIH0sCi0jZWxzZQotI2lmIFNETF9BTFRJVkVDX0JMSVRURVJTCi0gICAgLyogaGFzLWFsdGl2ZWMgfCBkb250LXVzZS1wcmVmZXRjaCAqLwotICAgIHsgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsIDQsIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotICAgICAgNiwgTlVMTCwgQ29udmVydEFsdGl2ZWMzMnRvMzJfbm9wcmVmZXRjaCwgTk9fQUxQSEEgfCBDT1BZX0FMUEhBIHwgU0VUX0FMUEhBIH0sCi0gICAgLyogaGFzLWFsdGl2ZWMgKi8KLSAgICB7IDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLCA0LCAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLSAgICAgIDIsIE5VTEwsIENvbnZlcnRBbHRpdmVjMzJ0bzMyX3ByZWZldGNoLCBOT19BTFBIQSB8IENPUFlfQUxQSEEgfCBTRVRfQUxQSEEgfSwKLSAgICAvKiBoYXMtYWx0aXZlYyAqLwotICAgIHsgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsIDIsIDB4MDAwMEY4MDAsMHgwMDAwMDdFMCwweDAwMDAwMDFGLAotICAgICAgMiwgTlVMTCwgQmxpdF9SR0I4ODhfUkdCNTY1QWx0aXZlYywgTk9fQUxQSEEgfSwKLSNlbmRpZgotICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDIsIDB4MDAwMEY4MDAsMHgwMDAwMDdFMCwweDAwMDAwMDFGLAotICAgICAgMCwgTlVMTCwgQmxpdF9SR0I4ODhfUkdCNTY1LCBOT19BTFBIQSB9LAotICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDIsIDB4MDAwMDdDMDAsMHgwMDAwMDNFMCwweDAwMDAwMDFGLAotICAgICAgMCwgTlVMTCwgQmxpdF9SR0I4ODhfUkdCNTU1LCBOT19BTFBIQSB9LAotI2VuZGlmCi0JLyogRGVmYXVsdCBmb3IgMzItYml0IFJHQiBzb3VyY2UsIHVzZWQgaWYgbm8gb3RoZXIgYmxpdHRlciBtYXRjaGVzICovCi0JeyAwLDAsMCwgMCwgMCwwLDAsIDAsIE5VTEwsIEJsaXROdG9OLCAwIH0KLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGJsaXRfdGFibGUgKm5vcm1hbF9ibGl0W10gPSB7Ci0Jbm9ybWFsX2JsaXRfMSwgbm9ybWFsX2JsaXRfMiwgbm9ybWFsX2JsaXRfMywgbm9ybWFsX2JsaXRfNAotfTsKLQotLyogTWFzayBtYXRjaGVzIHRhYmxlLCBvciB0YWJsZSBlbnRyeSBpcyB6ZXJvICovCi0jZGVmaW5lIE1BU0tPSyh4LCB5KSAoKCh4KSA9PSAoeSkpIHx8ICgoeSkgPT0gMHgwMDAwMDAwMCkpCi0KLVNETF9sb2JsaXQgU0RMX0NhbGN1bGF0ZUJsaXROKFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgYmxpdF9pbmRleCkKLXsKLQlzdHJ1Y3QgcHJpdmF0ZV9zd2FjY2VsICpzZGF0YTsKLQlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdDsKLQlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdDsKLQljb25zdCBzdHJ1Y3QgYmxpdF90YWJsZSAqdGFibGU7Ci0JaW50IHdoaWNoOwotCVNETF9sb2JsaXQgYmxpdGZ1bjsKLQotCS8qIFNldCB1cCBkYXRhIGZvciBjaG9vc2luZyB0aGUgYmxpdCAqLwotCXNkYXRhID0gc3VyZmFjZS0+bWFwLT5zd19kYXRhOwotCXNyY2ZtdCA9IHN1cmZhY2UtPmZvcm1hdDsKLQlkc3RmbXQgPSBzdXJmYWNlLT5tYXAtPmRzdC0+Zm9ybWF0OwotCi0JaWYgKCBibGl0X2luZGV4ICYgMiApIHsKLQkgICAgICAgIC8qIGFscGhhIG9yIGFscGhhK2NvbG9ya2V5ICovCi0JICAgICAgICByZXR1cm4gU0RMX0NhbGN1bGF0ZUFscGhhQmxpdChzdXJmYWNlLCBibGl0X2luZGV4KTsKLQl9Ci0KLQkvKiBXZSBkb24ndCBzdXBwb3J0IGRlc3RpbmF0aW9ucyBsZXNzIHRoYW4gOC1iaXRzICovCi0JaWYgKCBkc3RmbXQtPkJpdHNQZXJQaXhlbCA8IDggKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JCi0JaWYoYmxpdF9pbmRleCA9PSAxKSB7Ci0JICAgIC8qIGNvbG9ya2V5IGJsaXQ6IEhlcmUgd2UgZG9uJ3QgaGF2ZSB0b28gbWFueSBvcHRpb25zLCBtb3N0bHkKLQkgICAgICAgYmVjYXVzZSBSTEUgaXMgdGhlIHByZWZlcnJlZCBmYXN0IHdheSB0byBkZWFsIHdpdGggdGhpcy4KLQkgICAgICAgSWYgYSBwYXJ0aWN1bGFyIGNhc2UgdHVybnMgb3V0IHRvIGJlIHVzZWZ1bCB3ZSdsbCBhZGQgaXQuICovCi0KLQkgICAgaWYoc3JjZm10LT5CeXRlc1BlclBpeGVsID09IDIKLQkgICAgICAgJiYgc3VyZmFjZS0+bWFwLT5pZGVudGl0eSkKLQkJcmV0dXJuIEJsaXQydG8yS2V5OwotCSAgICBlbHNlIGlmKGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbCA9PSAxKQotCQlyZXR1cm4gQmxpdE50bzFLZXk7Ci0JICAgIGVsc2UgewotI2lmIFNETF9BTFRJVkVDX0JMSVRURVJTCi0gICAgICAgIGlmKChzcmNmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gNCkgJiYgKGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbCA9PSA0KSAmJiBTRExfSGFzQWx0aVZlYygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQmxpdDMydG8zMktleUFsdGl2ZWM7Ci0gICAgICAgIH0gZWxzZQotI2VuZGlmCi0KLQkJaWYoc3JjZm10LT5BbWFzayAmJiBkc3RmbXQtPkFtYXNrKQotCQkgICAgcmV0dXJuIEJsaXROdG9OS2V5Q29weUFscGhhOwotCQllbHNlCi0JCSAgICByZXR1cm4gQmxpdE50b05LZXk7Ci0JICAgIH0KLQl9Ci0KLQlibGl0ZnVuID0gTlVMTDsKLQlpZiAoIGRzdGZtdC0+Qml0c1BlclBpeGVsID09IDggKSB7Ci0JCS8qIFdlIGFzc3VtZSA4LWJpdCBkZXN0aW5hdGlvbnMgYXJlIHBhbGV0dGl6ZWQgKi8KLQkJaWYgKCAoc3JjZm10LT5CeXRlc1BlclBpeGVsID09IDQpICYmCi0JCSAgICAgKHNyY2ZtdC0+Um1hc2sgPT0gMHgwMEZGMDAwMCkgJiYKLQkJICAgICAoc3JjZm10LT5HbWFzayA9PSAweDAwMDBGRjAwKSAmJgotCQkgICAgIChzcmNmbXQtPkJtYXNrID09IDB4MDAwMDAwRkYpICkgewotCQkJaWYgKCBzdXJmYWNlLT5tYXAtPnRhYmxlICkgewotCQkJCWJsaXRmdW4gPSBCbGl0X1JHQjg4OF9pbmRleDhfbWFwOwotCQkJfSBlbHNlIHsKLSNpZiBTRExfSEVSTUVTX0JMSVRURVJTCi0JCQkJc2RhdGEtPmF1eF9kYXRhID0gQ29udmVydFg4NnAzMl84UkdCMzMyOwotCQkJCWJsaXRmdW4gPSBDb252ZXJ0WDg2OwotI2Vsc2UKLQkJCQlibGl0ZnVuID0gQmxpdF9SR0I4ODhfaW5kZXg4OwotI2VuZGlmCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlibGl0ZnVuID0gQmxpdE50bzE7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBOb3cgdGhlIG1lYXQsIGNob29zZSB0aGUgYmxpdHRlciB3ZSB3YW50ICovCi0JCWludCBhX25lZWQgPSBOT19BTFBIQTsKLQkJaWYoZHN0Zm10LT5BbWFzaykKLQkJICAgIGFfbmVlZCA9IHNyY2ZtdC0+QW1hc2sgPyBDT1BZX0FMUEhBIDogU0VUX0FMUEhBOwotCQl0YWJsZSA9IG5vcm1hbF9ibGl0W3NyY2ZtdC0+Qnl0ZXNQZXJQaXhlbC0xXTsKLQkJZm9yICggd2hpY2g9MDsgdGFibGVbd2hpY2hdLmRzdGJwcDsgKyt3aGljaCApIHsKLQkJCWlmICggTUFTS09LKHNyY2ZtdC0+Um1hc2ssIHRhYmxlW3doaWNoXS5zcmNSKSAmJgotCQkJICAgIE1BU0tPSyhzcmNmbXQtPkdtYXNrLCB0YWJsZVt3aGljaF0uc3JjRykgJiYKLQkJCSAgICBNQVNLT0soc3JjZm10LT5CbWFzaywgdGFibGVbd2hpY2hdLnNyY0IpICYmCi0JCQkgICAgTUFTS09LKGRzdGZtdC0+Um1hc2ssIHRhYmxlW3doaWNoXS5kc3RSKSAmJgotCQkJICAgIE1BU0tPSyhkc3RmbXQtPkdtYXNrLCB0YWJsZVt3aGljaF0uZHN0RykgJiYKLQkJCSAgICBNQVNLT0soZHN0Zm10LT5CbWFzaywgdGFibGVbd2hpY2hdLmRzdEIpICYmCi0JCQkgICAgZHN0Zm10LT5CeXRlc1BlclBpeGVsID09IHRhYmxlW3doaWNoXS5kc3RicHAgJiYKLQkJCSAgICAoYV9uZWVkICYgdGFibGVbd2hpY2hdLmFscGhhKSA9PSBhX25lZWQgJiYKLQkJCSAgICAoKHRhYmxlW3doaWNoXS5ibGl0X2ZlYXR1cmVzICYgR2V0QmxpdEZlYXR1cmVzKCkpID09IHRhYmxlW3doaWNoXS5ibGl0X2ZlYXR1cmVzKSApCi0JCQkJYnJlYWs7Ci0JCX0KLQkJc2RhdGEtPmF1eF9kYXRhID0gdGFibGVbd2hpY2hdLmF1eF9kYXRhOwotCQlibGl0ZnVuID0gdGFibGVbd2hpY2hdLmJsaXRmdW5jOwotCi0JCWlmKGJsaXRmdW4gPT0gQmxpdE50b04pIHsgIC8qIGRlZmF1bHQgQyBmYWxsYmFjayBjYXRjaC1hbGwuIFNsb3chICovCi0JCQkvKiBGYXN0cGF0aCBDIGZhbGxiYWNrOiAzMmJpdCBSR0I8LT5SR0JBIGJsaXQgd2l0aCBtYXRjaGluZyBSR0IgKi8KLQkJCWlmICggc3JjZm10LT5CeXRlc1BlclBpeGVsID09IDQgJiYgZHN0Zm10LT5CeXRlc1BlclBpeGVsID09IDQgJiYKLQkJCSAgICAgc3JjZm10LT5SbWFzayA9PSBkc3RmbXQtPlJtYXNrICYmCi0JCQkgICAgIHNyY2ZtdC0+R21hc2sgPT0gZHN0Zm10LT5HbWFzayAmJgotCQkJICAgICBzcmNmbXQtPkJtYXNrID09IGRzdGZtdC0+Qm1hc2sgKSB7Ci0JCQkJYmxpdGZ1biA9IEJsaXQ0dG80TWFza0FscGhhOwotCQkJfSBlbHNlIGlmICggYV9uZWVkID09IENPUFlfQUxQSEEgKSB7Ci0JCQkgICAgYmxpdGZ1biA9IEJsaXROdG9OQ29weUFscGhhOwotCQkJfQotCQl9Ci0JfQotCi0jaWZkZWYgREVCVUdfQVNNCi0jaWYgU0RMX0hFUk1FU19CTElUVEVSUwotCWlmICggYmxpdGZ1biA9PSBDb252ZXJ0TU1YICkKLQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBtbXggYmxpdFxuIik7Ci0JZWxzZQotCWlmICggYmxpdGZ1biA9PSBDb252ZXJ0WDg2ICkKLQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBhc20gYmxpdFxuIik7Ci0JZWxzZQotI2VuZGlmCi0JaWYgKCAoYmxpdGZ1biA9PSBCbGl0TnRvTikgfHwgKGJsaXRmdW4gPT0gQmxpdE50bzEpICkKLQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBDIGJsaXRcbiIpOwotCWVsc2UKLQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBvcHRpbWl6ZWQgQyBibGl0XG4iKTsKLSNlbmRpZiAvKiBERUJVR19BU00gKi8KLQotCXJldHVybihibGl0ZnVuKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2JtcC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfYm1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NGNiMjcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfYm1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIAotICAgQ29kZSB0byBsb2FkIGFuZCBzYXZlIHN1cmZhY2VzIGluIFdpbmRvd3MgQk1QIGZvcm1hdC4KLQotICAgV2h5IHN1cHBvcnQgQk1QIGZvcm1hdD8gIFdlbGwsIGl0J3MgYSBuYXRpdmUgZm9ybWF0IGZvciBXaW5kb3dzLCBhbmQKLSAgIG1vc3QgaW1hZ2UgcHJvY2Vzc2luZyBwcm9ncmFtcyBjYW4gcmVhZCBhbmQgd3JpdGUgaXQuICBJdCB3b3VsZCBiZSBuaWNlCi0gICB0byBiZSBhYmxlIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGltYWdlIGZvcm1hdCB0aGF0IHdlIGNhbiBuYXRpdmVseSBsb2FkCi0gICBhbmQgc2F2ZSwgYW5kIHNpbmNlIFBORyBpcyBzbyBjb21wbGV4IHRoYXQgaXQgd291bGQgYmxvYXQgdGhlIGxpYnJhcnksCi0gICBCTVAgaXMgYSBnb29kIGFsdGVybmF0aXZlLiAKLQotICAgVGhpcyBjb2RlIGN1cnJlbnRseSBzdXBwb3J0cyBXaW4zMiBESUJzIGluIHVuY29tcHJlc3NlZCA4IGFuZCAyNCBicHAuCi0qLwotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgotCi0vKiBDb21wcmVzc2lvbiBlbmNvZGluZ3MgZm9yIEJNUCBmaWxlcyAqLwotI2lmbmRlZiBCSV9SR0IKLSNkZWZpbmUgQklfUkdCCQkwCi0jZGVmaW5lIEJJX1JMRTgJCTEKLSNkZWZpbmUgQklfUkxFNAkJMgotI2RlZmluZSBCSV9CSVRGSUVMRFMJMwotI2VuZGlmCi0KLQotU0RMX1N1cmZhY2UgKiBTRExfTG9hZEJNUF9SVyAoU0RMX1JXb3BzICpzcmMsIGludCBmcmVlc3JjKQotewotCWludCB3YXNfZXJyb3I7Ci0JbG9uZyBmcF9vZmZzZXQ7Ci0JaW50IGJtcFBpdGNoOwotCWludCBpLCBwYWQ7Ci0JU0RMX1N1cmZhY2UgKnN1cmZhY2U7Ci0JVWludDMyIFJtYXNrOwotCVVpbnQzMiBHbWFzazsKLQlVaW50MzIgQm1hc2s7Ci0JU0RMX1BhbGV0dGUgKnBhbGV0dGU7Ci0JVWludDggKmJpdHM7Ci0JaW50IEV4cGFuZEJNUDsKLQotCS8qIFRoZSBXaW4zMiBCTVAgZmlsZSBoZWFkZXIgKDE0IGJ5dGVzKSAqLwotCWNoYXIgICBtYWdpY1syXTsKLQlVaW50MzIgYmZTaXplOwotCVVpbnQxNiBiZlJlc2VydmVkMTsKLQlVaW50MTYgYmZSZXNlcnZlZDI7Ci0JVWludDMyIGJmT2ZmQml0czsKLQotCS8qIFRoZSBXaW4zMiBCSVRNQVBJTkZPSEVBREVSIHN0cnVjdCAoNDAgYnl0ZXMpICovCi0JVWludDMyIGJpU2l6ZTsKLQlTaW50MzIgYmlXaWR0aDsKLQlTaW50MzIgYmlIZWlnaHQ7Ci0JVWludDE2IGJpUGxhbmVzOwotCVVpbnQxNiBiaUJpdENvdW50OwotCVVpbnQzMiBiaUNvbXByZXNzaW9uOwotCVVpbnQzMiBiaVNpemVJbWFnZTsKLQlTaW50MzIgYmlYUGVsc1Blck1ldGVyOwotCVNpbnQzMiBiaVlQZWxzUGVyTWV0ZXI7Ci0JVWludDMyIGJpQ2xyVXNlZDsKLQlVaW50MzIgYmlDbHJJbXBvcnRhbnQ7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgYXJlIHBhc3NlZCBhIHZhbGlkIGRhdGEgc291cmNlICovCi0Jc3VyZmFjZSA9IE5VTEw7Ci0Jd2FzX2Vycm9yID0gMDsKLQlpZiAoIHNyYyA9PSBOVUxMICkgewotCQl3YXNfZXJyb3IgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogUmVhZCBpbiB0aGUgQk1QIGZpbGUgaGVhZGVyICovCi0JZnBfb2Zmc2V0ID0gU0RMX1JXdGVsbChzcmMpOwotCVNETF9DbGVhckVycm9yKCk7Ci0JaWYgKCBTRExfUldyZWFkKHNyYywgbWFnaWMsIDEsIDIpICE9IDIgKSB7Ci0JCVNETF9FcnJvcihTRExfRUZSRUFEKTsKLQkJd2FzX2Vycm9yID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIFNETF9zdHJuY21wKG1hZ2ljLCAiQk0iLCAyKSAhPSAwICkgewotCQlTRExfU2V0RXJyb3IoIkZpbGUgaXMgbm90IGEgV2luZG93cyBCTVAgZmlsZSIpOwotCQl3YXNfZXJyb3IgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCWJmU2l6ZQkJPSBTRExfUmVhZExFMzIoc3JjKTsKLQliZlJlc2VydmVkMQk9IFNETF9SZWFkTEUxNihzcmMpOwotCWJmUmVzZXJ2ZWQyCT0gU0RMX1JlYWRMRTE2KHNyYyk7Ci0JYmZPZmZCaXRzCT0gU0RMX1JlYWRMRTMyKHNyYyk7Ci0KLQkvKiBSZWFkIHRoZSBXaW4zMiBCSVRNQVBJTkZPSEVBREVSICovCi0JYmlTaXplCQk9IFNETF9SZWFkTEUzMihzcmMpOwotCWlmICggYmlTaXplID09IDEyICkgewotCQliaVdpZHRoCQk9IChVaW50MzIpU0RMX1JlYWRMRTE2KHNyYyk7Ci0JCWJpSGVpZ2h0CT0gKFVpbnQzMilTRExfUmVhZExFMTYoc3JjKTsKLQkJYmlQbGFuZXMJPSBTRExfUmVhZExFMTYoc3JjKTsKLQkJYmlCaXRDb3VudAk9IFNETF9SZWFkTEUxNihzcmMpOwotCQliaUNvbXByZXNzaW9uCT0gQklfUkdCOwotCQliaVNpemVJbWFnZQk9IDA7Ci0JCWJpWFBlbHNQZXJNZXRlcgk9IDA7Ci0JCWJpWVBlbHNQZXJNZXRlcgk9IDA7Ci0JCWJpQ2xyVXNlZAk9IDA7Ci0JCWJpQ2xySW1wb3J0YW50CT0gMDsKLQl9IGVsc2UgewotCQliaVdpZHRoCQk9IFNETF9SZWFkTEUzMihzcmMpOwotCQliaUhlaWdodAk9IFNETF9SZWFkTEUzMihzcmMpOwotCQliaVBsYW5lcwk9IFNETF9SZWFkTEUxNihzcmMpOwotCQliaUJpdENvdW50CT0gU0RMX1JlYWRMRTE2KHNyYyk7Ci0JCWJpQ29tcHJlc3Npb24JPSBTRExfUmVhZExFMzIoc3JjKTsKLQkJYmlTaXplSW1hZ2UJPSBTRExfUmVhZExFMzIoc3JjKTsKLQkJYmlYUGVsc1Blck1ldGVyCT0gU0RMX1JlYWRMRTMyKHNyYyk7Ci0JCWJpWVBlbHNQZXJNZXRlcgk9IFNETF9SZWFkTEUzMihzcmMpOwotCQliaUNsclVzZWQJPSBTRExfUmVhZExFMzIoc3JjKTsKLQkJYmlDbHJJbXBvcnRhbnQJPSBTRExfUmVhZExFMzIoc3JjKTsKLQl9Ci0KLQkvKiBDaGVjayBmb3IgcmVhZCBlcnJvciAqLwotCWlmICggU0RMX3N0cmNtcChTRExfR2V0RXJyb3IoKSwgIiIpICE9IDAgKSB7Ci0JCXdhc19lcnJvciA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBFeHBhbmQgMSBhbmQgNCBiaXQgYml0bWFwcyB0byA4IGJpdHMgcGVyIHBpeGVsICovCi0Jc3dpdGNoIChiaUJpdENvdW50KSB7Ci0JCWNhc2UgMToKLQkJY2FzZSA0OgotCQkJRXhwYW5kQk1QID0gYmlCaXRDb3VudDsKLQkJCWJpQml0Q291bnQgPSA4OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlFeHBhbmRCTVAgPSAwOwotCQkJYnJlYWs7Ci0JfQotCi0JLyogV2UgZG9uJ3Qgc3VwcG9ydCBhbnkgQk1QIGNvbXByZXNzaW9uIHJpZ2h0IG5vdyAqLwotCVJtYXNrID0gR21hc2sgPSBCbWFzayA9IDA7Ci0Jc3dpdGNoIChiaUNvbXByZXNzaW9uKSB7Ci0JCWNhc2UgQklfUkdCOgotCQkJLyogSWYgdGhlcmUgYXJlIG5vIG1hc2tzLCB1c2UgdGhlIGRlZmF1bHRzICovCi0JCQlpZiAoIGJmT2ZmQml0cyA9PSAoMTQrYmlTaXplKSApIHsKLQkJCQkvKiBEZWZhdWx0IHZhbHVlcyBmb3IgdGhlIEJNUCBmb3JtYXQgKi8KLQkJCQlzd2l0Y2ggKGJpQml0Q291bnQpIHsKLQkJCQkJY2FzZSAxNToKLQkJCQkJY2FzZSAxNjoKLQkJCQkJCVJtYXNrID0gMHg3QzAwOwotCQkJCQkJR21hc2sgPSAweDAzRTA7Ci0JCQkJCQlCbWFzayA9IDB4MDAxRjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI0OgotI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KLQkJCQkJICAgICAgICBSbWFzayA9IDB4MDAwMDAwRkY7Ci0JCQkJCSAgICAgICAgR21hc2sgPSAweDAwMDBGRjAwOwotCQkJCQkgICAgICAgIEJtYXNrID0gMHgwMEZGMDAwMDsKLQkJCQkJCWJyZWFrOwotI2VuZGlmCi0JCQkJCWNhc2UgMzI6Ci0JCQkJCQlSbWFzayA9IDB4MDBGRjAwMDA7Ci0JCQkJCQlHbWFzayA9IDB4MDAwMEZGMDA7Ci0JCQkJCQlCbWFzayA9IDB4MDAwMDAwRkY7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIEZhbGwgdGhyb3VnaCAtLSByZWFkIHRoZSBSR0IgbWFza3MgKi8KLQotCQljYXNlIEJJX0JJVEZJRUxEUzoKLQkJCXN3aXRjaCAoYmlCaXRDb3VudCkgewotCQkJCWNhc2UgMTU6Ci0JCQkJY2FzZSAxNjoKLQkJCQljYXNlIDMyOgotCQkJCQlSbWFzayA9IFNETF9SZWFkTEUzMihzcmMpOwotCQkJCQlHbWFzayA9IFNETF9SZWFkTEUzMihzcmMpOwotCQkJCQlCbWFzayA9IFNETF9SZWFkTEUzMihzcmMpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJU0RMX1NldEVycm9yKCJDb21wcmVzc2VkIEJNUCBmaWxlcyBub3Qgc3VwcG9ydGVkIik7Ci0JCQl3YXNfZXJyb3IgPSAxOwotCQkJZ290byBkb25lOwotCX0KLQotCS8qIENyZWF0ZSBhIGNvbXBhdGlibGUgc3VyZmFjZSwgbm90ZSB0aGF0IHRoZSBjb2xvcnMgYXJlIFJHQiBvcmRlcmVkICovCi0Jc3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsCi0JCQliaVdpZHRoLCBiaUhlaWdodCwgYmlCaXRDb3VudCwgUm1hc2ssIEdtYXNrLCBCbWFzaywgMCk7Ci0JaWYgKCBzdXJmYWNlID09IE5VTEwgKSB7Ci0JCXdhc19lcnJvciA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBMb2FkIHRoZSBwYWxldHRlLCBpZiBhbnkgKi8KLQlwYWxldHRlID0gKHN1cmZhY2UtPmZvcm1hdCktPnBhbGV0dGU7Ci0JaWYgKCBwYWxldHRlICkgewotCQlpZiAoIGJpQ2xyVXNlZCA9PSAwICkgewotCQkJYmlDbHJVc2VkID0gMSA8PCBiaUJpdENvdW50OwotCQl9Ci0JCWlmICggYmlTaXplID09IDEyICkgewotCQkJZm9yICggaSA9IDA7IGkgPCAoaW50KWJpQ2xyVXNlZDsgKytpICkgewotCQkJCVNETF9SV3JlYWQoc3JjLCAmcGFsZXR0ZS0+Y29sb3JzW2ldLmIsIDEsIDEpOwotCQkJCVNETF9SV3JlYWQoc3JjLCAmcGFsZXR0ZS0+Y29sb3JzW2ldLmcsIDEsIDEpOwotCQkJCVNETF9SV3JlYWQoc3JjLCAmcGFsZXR0ZS0+Y29sb3JzW2ldLnIsIDEsIDEpOwotCQkJCXBhbGV0dGUtPmNvbG9yc1tpXS51bnVzZWQgPSAwOwotCQkJfQkKLQkJfSBlbHNlIHsKLQkJCWZvciAoIGkgPSAwOyBpIDwgKGludCliaUNsclVzZWQ7ICsraSApIHsKLQkJCQlTRExfUldyZWFkKHNyYywgJnBhbGV0dGUtPmNvbG9yc1tpXS5iLCAxLCAxKTsKLQkJCQlTRExfUldyZWFkKHNyYywgJnBhbGV0dGUtPmNvbG9yc1tpXS5nLCAxLCAxKTsKLQkJCQlTRExfUldyZWFkKHNyYywgJnBhbGV0dGUtPmNvbG9yc1tpXS5yLCAxLCAxKTsKLQkJCQlTRExfUldyZWFkKHNyYywgJnBhbGV0dGUtPmNvbG9yc1tpXS51bnVzZWQsIDEsIDEpOwotCQkJfQkKLQkJfQotCQlwYWxldHRlLT5uY29sb3JzID0gYmlDbHJVc2VkOwotCX0KLQotCS8qIFJlYWQgdGhlIHN1cmZhY2UgcGl4ZWxzLiAgTm90ZSB0aGF0IHRoZSBibXAgaW1hZ2UgaXMgdXBzaWRlIGRvd24gKi8KLQlpZiAoIFNETF9SV3NlZWsoc3JjLCBmcF9vZmZzZXQrYmZPZmZCaXRzLCBSV19TRUVLX1NFVCkgPCAwICkgewotCQlTRExfRXJyb3IoU0RMX0VGU0VFSyk7Ci0JCXdhc19lcnJvciA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYml0cyA9IChVaW50OCAqKXN1cmZhY2UtPnBpeGVscysoc3VyZmFjZS0+aCpzdXJmYWNlLT5waXRjaCk7Ci0Jc3dpdGNoIChFeHBhbmRCTVApIHsKLQkJY2FzZSAxOgotCQkJYm1wUGl0Y2ggPSAoYmlXaWR0aCArIDcpID4+IDM7Ci0JCQlwYWQgID0gKCgoYm1wUGl0Y2gpJTQpID8gKDQtKChibXBQaXRjaCklNCkpIDogMCk7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJYm1wUGl0Y2ggPSAoYmlXaWR0aCArIDEpID4+IDE7Ci0JCQlwYWQgID0gKCgoYm1wUGl0Y2gpJTQpID8gKDQtKChibXBQaXRjaCklNCkpIDogMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXBhZCAgPSAoKHN1cmZhY2UtPnBpdGNoJTQpID8KLQkJCQkJKDQtKHN1cmZhY2UtPnBpdGNoJTQpKSA6IDApOwotCQkJYnJlYWs7Ci0JfQotCXdoaWxlICggYml0cyA+IChVaW50OCAqKXN1cmZhY2UtPnBpeGVscyApIHsKLQkJYml0cyAtPSBzdXJmYWNlLT5waXRjaDsKLQkJc3dpdGNoIChFeHBhbmRCTVApIHsKLQkJCWNhc2UgMToKLQkJCWNhc2UgNDogewotCQkJVWludDggcGl4ZWwgPSAwOwotCQkJaW50ICAgc2hpZnQgPSAoOC1FeHBhbmRCTVApOwotCQkJZm9yICggaT0wOyBpPHN1cmZhY2UtPnc7ICsraSApIHsKLQkJCQlpZiAoIGklKDgvRXhwYW5kQk1QKSA9PSAwICkgewotCQkJCQlpZiAoICFTRExfUldyZWFkKHNyYywgJnBpeGVsLCAxLCAxKSApIHsKLQkJCQkJCVNETF9TZXRFcnJvcigKLQkJCQkJIkVycm9yIHJlYWRpbmcgZnJvbSBCTVAiKTsKLQkJCQkJCXdhc19lcnJvciA9IDE7Ci0JCQkJCQlnb3RvIGRvbmU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJKihiaXRzK2kpID0gKHBpeGVsPj5zaGlmdCk7Ci0JCQkJcGl4ZWwgPDw9IEV4cGFuZEJNUDsKLQkJCX0gfQotCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQlpZiAoIFNETF9SV3JlYWQoc3JjLCBiaXRzLCAxLCBzdXJmYWNlLT5waXRjaCkKLQkJCQkJCQkgIT0gc3VyZmFjZS0+cGl0Y2ggKSB7Ci0JCQkJU0RMX0Vycm9yKFNETF9FRlJFQUQpOwotCQkJCXdhc19lcnJvciA9IDE7Ci0JCQkJZ290byBkb25lOwotCQkJfQotI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KLQkJCS8qIEJ5dGUtc3dhcCB0aGUgcGl4ZWxzIGlmIG5lZWRlZC4gTm90ZSB0aGF0IHRoZSAyNGJwcAotCQkJICAgY2FzZSBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YgYWJvdmUuICovCi0JCQlzd2l0Y2goYmlCaXRDb3VudCkgewotCQkJCWNhc2UgMTU6Ci0JCQkJY2FzZSAxNjogewotCQkJCSAgICAgICAgVWludDE2ICpwaXggPSAoVWludDE2ICopYml0czsKLQkJCQkJZm9yKGkgPSAwOyBpIDwgc3VyZmFjZS0+dzsgaSsrKQotCQkJCQkgICAgICAgIHBpeFtpXSA9IFNETF9Td2FwMTYocGl4W2ldKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSAzMjogewotCQkJCSAgICAgICAgVWludDMyICpwaXggPSAoVWludDMyICopYml0czsKLQkJCQkJZm9yKGkgPSAwOyBpIDwgc3VyZmFjZS0+dzsgaSsrKQotCQkJCQkgICAgICAgIHBpeFtpXSA9IFNETF9Td2FwMzIocGl4W2ldKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotI2VuZGlmCi0JCQlicmVhazsKLQkJfQotCQkvKiBTa2lwIHBhZGRpbmcgYnl0ZXMsIHVnaCAqLwotCQlpZiAoIHBhZCApIHsKLQkJCVVpbnQ4IHBhZGJ5dGU7Ci0JCQlmb3IgKCBpPTA7IGk8cGFkOyArK2kgKSB7Ci0JCQkJU0RMX1JXcmVhZChzcmMsICZwYWRieXRlLCAxLCAxKTsKLQkJCX0KLQkJfQotCX0KLWRvbmU6Ci0JaWYgKCB3YXNfZXJyb3IgKSB7Ci0JCWlmICggc3JjICkgewotCQkJU0RMX1JXc2VlayhzcmMsIGZwX29mZnNldCwgUldfU0VFS19TRVQpOwotCQl9Ci0JCWlmICggc3VyZmFjZSApIHsKLQkJCVNETF9GcmVlU3VyZmFjZShzdXJmYWNlKTsKLQkJfQotCQlzdXJmYWNlID0gTlVMTDsKLQl9Ci0JaWYgKCBmcmVlc3JjICYmIHNyYyApIHsKLQkJU0RMX1JXY2xvc2Uoc3JjKTsKLQl9Ci0JcmV0dXJuKHN1cmZhY2UpOwotfQotCi1pbnQgU0RMX1NhdmVCTVBfUlcgKFNETF9TdXJmYWNlICpzYXZlbWUsIFNETF9SV29wcyAqZHN0LCBpbnQgZnJlZWRzdCkKLXsKLQlsb25nIGZwX29mZnNldDsKLQlpbnQgaSwgcGFkOwotCVNETF9TdXJmYWNlICpzdXJmYWNlOwotCVVpbnQ4ICpiaXRzOwotCi0JLyogVGhlIFdpbjMyIEJNUCBmaWxlIGhlYWRlciAoMTQgYnl0ZXMpICovCi0JY2hhciAgIG1hZ2ljWzJdID0geyAnQicsICdNJyB9OwotCVVpbnQzMiBiZlNpemU7Ci0JVWludDE2IGJmUmVzZXJ2ZWQxOwotCVVpbnQxNiBiZlJlc2VydmVkMjsKLQlVaW50MzIgYmZPZmZCaXRzOwotCi0JLyogVGhlIFdpbjMyIEJJVE1BUElORk9IRUFERVIgc3RydWN0ICg0MCBieXRlcykgKi8KLQlVaW50MzIgYmlTaXplOwotCVNpbnQzMiBiaVdpZHRoOwotCVNpbnQzMiBiaUhlaWdodDsKLQlVaW50MTYgYmlQbGFuZXM7Ci0JVWludDE2IGJpQml0Q291bnQ7Ci0JVWludDMyIGJpQ29tcHJlc3Npb247Ci0JVWludDMyIGJpU2l6ZUltYWdlOwotCVNpbnQzMiBiaVhQZWxzUGVyTWV0ZXI7Ci0JU2ludDMyIGJpWVBlbHNQZXJNZXRlcjsKLQlVaW50MzIgYmlDbHJVc2VkOwotCVVpbnQzMiBiaUNsckltcG9ydGFudDsKLQotCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV3aGVyZSB0byBzYXZlICovCi0Jc3VyZmFjZSA9IE5VTEw7Ci0JaWYgKCBkc3QgKSB7Ci0JCWlmICggc2F2ZW1lLT5mb3JtYXQtPnBhbGV0dGUgKSB7Ci0JCQlpZiAoIHNhdmVtZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gOCApIHsKLQkJCQlzdXJmYWNlID0gc2F2ZW1lOwotCQkJfSBlbHNlIHsKLQkJCQlTRExfU2V0RXJyb3IoIiVkIGJwcCBCTVAgZmlsZXMgbm90IHN1cHBvcnRlZCIsCi0JCQkJCQlzYXZlbWUtPmZvcm1hdC0+Qml0c1BlclBpeGVsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICggKHNhdmVtZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gMjQpICYmCi0jaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgotCQkJCShzYXZlbWUtPmZvcm1hdC0+Um1hc2sgPT0gMHgwMEZGMDAwMCkgJiYKLQkJCQkoc2F2ZW1lLT5mb3JtYXQtPkdtYXNrID09IDB4MDAwMEZGMDApICYmCi0JCQkJKHNhdmVtZS0+Zm9ybWF0LT5CbWFzayA9PSAweDAwMDAwMEZGKQotI2Vsc2UKLQkJCQkoc2F2ZW1lLT5mb3JtYXQtPlJtYXNrID09IDB4MDAwMDAwRkYpICYmCi0JCQkJKHNhdmVtZS0+Zm9ybWF0LT5HbWFzayA9PSAweDAwMDBGRjAwKSAmJgotCQkJCShzYXZlbWUtPmZvcm1hdC0+Qm1hc2sgPT0gMHgwMEZGMDAwMCkKLSNlbmRpZgotCQkJICApIHsKLQkJCXN1cmZhY2UgPSBzYXZlbWU7Ci0JCX0gZWxzZSB7Ci0JCQlTRExfUmVjdCBib3VuZHM7Ci0KLQkJCS8qIENvbnZlcnQgdG8gMjQgYml0cyBwZXIgcGl4ZWwgKi8KLQkJCXN1cmZhY2UgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLAotCQkJCQlzYXZlbWUtPncsIHNhdmVtZS0+aCwgMjQsCi0jaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgotCQkJCQkweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGLAotI2Vsc2UKLQkJCQkJMHgwMDAwMDBGRiwgMHgwMDAwRkYwMCwgMHgwMEZGMDAwMCwKLSNlbmRpZgotCQkJCQkwKTsKLQkJCWlmICggc3VyZmFjZSAhPSBOVUxMICkgewotCQkJCWJvdW5kcy54ID0gMDsKLQkJCQlib3VuZHMueSA9IDA7Ci0JCQkJYm91bmRzLncgPSBzYXZlbWUtPnc7Ci0JCQkJYm91bmRzLmggPSBzYXZlbWUtPmg7Ci0JCQkJaWYgKCBTRExfTG93ZXJCbGl0KHNhdmVtZSwgJmJvdW5kcywgc3VyZmFjZSwKLQkJCQkJCQkmYm91bmRzKSA8IDAgKSB7Ci0JCQkJCVNETF9GcmVlU3VyZmFjZShzdXJmYWNlKTsKLQkJCQkJU0RMX1NldEVycm9yKAotCQkJCQkiQ291bGRuJ3QgY29udmVydCBpbWFnZSB0byAyNCBicHAiKTsKLQkJCQkJc3VyZmFjZSA9IE5VTEw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCBzdXJmYWNlICYmIChTRExfTG9ja1N1cmZhY2Uoc3VyZmFjZSkgPT0gMCkgKSB7Ci0JCWNvbnN0IGludCBidyA9IHN1cmZhY2UtPncqc3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCi0JCS8qIFNldCB0aGUgQk1QIGZpbGUgaGVhZGVyIHZhbHVlcyAqLwotCQliZlNpemUgPSAwOwkJIC8qIFdlJ2xsIHdyaXRlIHRoaXMgd2hlbiB3ZSdyZSBkb25lICovCi0JCWJmUmVzZXJ2ZWQxID0gMDsKLQkJYmZSZXNlcnZlZDIgPSAwOwotCQliZk9mZkJpdHMgPSAwOwkJLyogV2UnbGwgd3JpdGUgdGhpcyB3aGVuIHdlJ3JlIGRvbmUgKi8KLQotCQkvKiBXcml0ZSB0aGUgQk1QIGZpbGUgaGVhZGVyIHZhbHVlcyAqLwotCQlmcF9vZmZzZXQgPSBTRExfUld0ZWxsKGRzdCk7Ci0JCVNETF9DbGVhckVycm9yKCk7Ci0JCVNETF9SV3dyaXRlKGRzdCwgbWFnaWMsIDIsIDEpOwotCQlTRExfV3JpdGVMRTMyKGRzdCwgYmZTaXplKTsKLQkJU0RMX1dyaXRlTEUxNihkc3QsIGJmUmVzZXJ2ZWQxKTsKLQkJU0RMX1dyaXRlTEUxNihkc3QsIGJmUmVzZXJ2ZWQyKTsKLQkJU0RMX1dyaXRlTEUzMihkc3QsIGJmT2ZmQml0cyk7Ci0KLQkJLyogU2V0IHRoZSBCTVAgaW5mbyB2YWx1ZXMgKi8KLQkJYmlTaXplID0gNDA7Ci0JCWJpV2lkdGggPSBzdXJmYWNlLT53OwotCQliaUhlaWdodCA9IHN1cmZhY2UtPmg7Ci0JCWJpUGxhbmVzID0gMTsKLQkJYmlCaXRDb3VudCA9IHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCQliaUNvbXByZXNzaW9uID0gQklfUkdCOwotCQliaVNpemVJbWFnZSA9IHN1cmZhY2UtPmgqc3VyZmFjZS0+cGl0Y2g7Ci0JCWJpWFBlbHNQZXJNZXRlciA9IDA7Ci0JCWJpWVBlbHNQZXJNZXRlciA9IDA7Ci0JCWlmICggc3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlICkgewotCQkJYmlDbHJVc2VkID0gc3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5uY29sb3JzOwotCQl9IGVsc2UgewotCQkJYmlDbHJVc2VkID0gMDsKLQkJfQotCQliaUNsckltcG9ydGFudCA9IDA7Ci0KLQkJLyogV3JpdGUgdGhlIEJNUCBpbmZvIHZhbHVlcyAqLwotCQlTRExfV3JpdGVMRTMyKGRzdCwgYmlTaXplKTsKLQkJU0RMX1dyaXRlTEUzMihkc3QsIGJpV2lkdGgpOwotCQlTRExfV3JpdGVMRTMyKGRzdCwgYmlIZWlnaHQpOwotCQlTRExfV3JpdGVMRTE2KGRzdCwgYmlQbGFuZXMpOwotCQlTRExfV3JpdGVMRTE2KGRzdCwgYmlCaXRDb3VudCk7Ci0JCVNETF9Xcml0ZUxFMzIoZHN0LCBiaUNvbXByZXNzaW9uKTsKLQkJU0RMX1dyaXRlTEUzMihkc3QsIGJpU2l6ZUltYWdlKTsKLQkJU0RMX1dyaXRlTEUzMihkc3QsIGJpWFBlbHNQZXJNZXRlcik7Ci0JCVNETF9Xcml0ZUxFMzIoZHN0LCBiaVlQZWxzUGVyTWV0ZXIpOwotCQlTRExfV3JpdGVMRTMyKGRzdCwgYmlDbHJVc2VkKTsKLQkJU0RMX1dyaXRlTEUzMihkc3QsIGJpQ2xySW1wb3J0YW50KTsKLQotCQkvKiBXcml0ZSB0aGUgcGFsZXR0ZSAoaW4gQkdSIGNvbG9yIG9yZGVyKSAqLwotCQlpZiAoIHN1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZSApIHsKLQkJCVNETF9Db2xvciAqY29sb3JzOwotCQkJaW50ICAgICAgIG5jb2xvcnM7Ci0KLQkJCWNvbG9ycyA9IHN1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzOwotCQkJbmNvbG9ycyA9IHN1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsKLQkJCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7Ci0JCQkJU0RMX1JXd3JpdGUoZHN0LCAmY29sb3JzW2ldLmIsIDEsIDEpOwotCQkJCVNETF9SV3dyaXRlKGRzdCwgJmNvbG9yc1tpXS5nLCAxLCAxKTsKLQkJCQlTRExfUld3cml0ZShkc3QsICZjb2xvcnNbaV0uciwgMSwgMSk7Ci0JCQkJU0RMX1JXd3JpdGUoZHN0LCAmY29sb3JzW2ldLnVudXNlZCwgMSwgMSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBXcml0ZSB0aGUgYml0bWFwIG9mZnNldCAqLwotCQliZk9mZkJpdHMgPSBTRExfUld0ZWxsKGRzdCktZnBfb2Zmc2V0OwotCQlpZiAoIFNETF9SV3NlZWsoZHN0LCBmcF9vZmZzZXQrMTAsIFJXX1NFRUtfU0VUKSA8IDAgKSB7Ci0JCQlTRExfRXJyb3IoU0RMX0VGU0VFSyk7Ci0JCX0KLQkJU0RMX1dyaXRlTEUzMihkc3QsIGJmT2ZmQml0cyk7Ci0JCWlmICggU0RMX1JXc2Vlayhkc3QsIGZwX29mZnNldCtiZk9mZkJpdHMsIFJXX1NFRUtfU0VUKSA8IDAgKSB7Ci0JCQlTRExfRXJyb3IoU0RMX0VGU0VFSyk7Ci0JCX0KLQotCQkvKiBXcml0ZSB0aGUgYml0bWFwIGltYWdlIHVwc2lkZSBkb3duICovCi0JCWJpdHMgPSAoVWludDggKilzdXJmYWNlLT5waXhlbHMrKHN1cmZhY2UtPmgqc3VyZmFjZS0+cGl0Y2gpOwotCQlwYWQgID0gKChidyU0KSA/ICg0LShidyU0KSkgOiAwKTsKLQkJd2hpbGUgKCBiaXRzID4gKFVpbnQ4ICopc3VyZmFjZS0+cGl4ZWxzICkgewotCQkJYml0cyAtPSBzdXJmYWNlLT5waXRjaDsKLQkJCWlmICggU0RMX1JXd3JpdGUoZHN0LCBiaXRzLCAxLCBidykgIT0gYncpIHsKLQkJCQlTRExfRXJyb3IoU0RMX0VGV1JJVEUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCBwYWQgKSB7Ci0JCQkJY29uc3QgVWludDggcGFkYnl0ZSA9IDA7Ci0JCQkJZm9yICggaT0wOyBpPHBhZDsgKytpICkgewotCQkJCQlTRExfUld3cml0ZShkc3QsICZwYWRieXRlLCAxLCAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKiBXcml0ZSB0aGUgQk1QIGZpbGUgc2l6ZSAqLwotCQliZlNpemUgPSBTRExfUld0ZWxsKGRzdCktZnBfb2Zmc2V0OwotCQlpZiAoIFNETF9SV3NlZWsoZHN0LCBmcF9vZmZzZXQrMiwgUldfU0VFS19TRVQpIDwgMCApIHsKLQkJCVNETF9FcnJvcihTRExfRUZTRUVLKTsKLQkJfQotCQlTRExfV3JpdGVMRTMyKGRzdCwgYmZTaXplKTsKLQkJaWYgKCBTRExfUldzZWVrKGRzdCwgZnBfb2Zmc2V0K2JmU2l6ZSwgUldfU0VFS19TRVQpIDwgMCApIHsKLQkJCVNETF9FcnJvcihTRExfRUZTRUVLKTsKLQkJfQotCi0JCS8qIENsb3NlIGl0IHVwLi4gKi8KLQkJU0RMX1VubG9ja1N1cmZhY2Uoc3VyZmFjZSk7Ci0JCWlmICggc3VyZmFjZSAhPSBzYXZlbWUgKSB7Ci0JCQlTRExfRnJlZVN1cmZhY2Uoc3VyZmFjZSk7Ci0JCX0KLQl9Ci0KLQlpZiAoIGZyZWVkc3QgJiYgZHN0ICkgewotCQlTRExfUldjbG9zZShkc3QpOwotCX0KLQlyZXR1cm4oKFNETF9zdHJjbXAoU0RMX0dldEVycm9yKCksICIiKSA9PSAwKSA/IDAgOiAtMSk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9jdXJzb3IuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2N1cnNvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWY4NjAzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2N1cnNvci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBHZW5lcmFsIGN1cnNvciBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KLQotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIlNETF9ibGl0LmgiCi0jaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2N1cnNvcl9jLmgiCi0jaW5jbHVkZSAiU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiZGVmYXVsdF9jdXJzb3IuaCIKLSNpbmNsdWRlICIuLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIi4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotLyogVGhlc2UgYXJlIHN0YXRpYyBmb3Igb3VyIGN1cnNvciBoYW5kbGluZyBjb2RlICovCi12b2xhdGlsZSBpbnQgU0RMX2N1cnNvcnN0YXRlID0gQ1VSU09SX1ZJU0lCTEU7Ci1TRExfQ3Vyc29yICpTRExfY3Vyc29yID0gTlVMTDsKLXN0YXRpYyBTRExfQ3Vyc29yICpTRExfZGVmY3Vyc29yID0gTlVMTDsKLVNETF9tdXRleCAqU0RMX2N1cnNvcmxvY2sgPSBOVUxMOwotCi0vKiBQdWJsaWMgZnVuY3Rpb25zICovCi12b2lkIFNETF9DdXJzb3JRdWl0KHZvaWQpCi17Ci0JaWYgKCBTRExfY3Vyc29yICE9IE5VTEwgKSB7Ci0JCVNETF9DdXJzb3IgKmN1cnNvcjsKLQotCQlTRExfY3Vyc29yc3RhdGUgJj0gfkNVUlNPUl9WSVNJQkxFOwotCQlpZiAoIFNETF9jdXJzb3IgIT0gU0RMX2RlZmN1cnNvciApIHsKLQkJCVNETF9GcmVlQ3Vyc29yKFNETF9jdXJzb3IpOwotCQl9Ci0JCVNETF9jdXJzb3IgPSBOVUxMOwotCQlpZiAoIFNETF9kZWZjdXJzb3IgIT0gTlVMTCApIHsKLQkJCWN1cnNvciA9IFNETF9kZWZjdXJzb3I7Ci0JCQlTRExfZGVmY3Vyc29yID0gTlVMTDsKLQkJCVNETF9GcmVlQ3Vyc29yKGN1cnNvcik7Ci0JCX0KLQl9Ci0JaWYgKCBTRExfY3Vyc29ybG9jayAhPSBOVUxMICkgewotCQlTRExfRGVzdHJveU11dGV4KFNETF9jdXJzb3Jsb2NrKTsKLQkJU0RMX2N1cnNvcmxvY2sgPSBOVUxMOwotCX0KLX0KLWludCBTRExfQ3Vyc29ySW5pdChVaW50MzIgbXVsdGl0aHJlYWRlZCkKLXsKLQkvKiBXZSBkb24ndCBoYXZlIG1vdXNlIGZvY3VzLCBhbmQgdGhlIGN1cnNvciBpc24ndCBkcmF3biB5ZXQgKi8KLSNpZm5kZWYgSVBPRAotCVNETF9jdXJzb3JzdGF0ZSA9IENVUlNPUl9WSVNJQkxFOwotI2VuZGlmCi0KLQkvKiBDcmVhdGUgdGhlIGRlZmF1bHQgY3Vyc29yICovCi0JaWYgKCBTRExfZGVmY3Vyc29yID09IE5VTEwgKSB7Ci0JCVNETF9kZWZjdXJzb3IgPSBTRExfQ3JlYXRlQ3Vyc29yKGRlZmF1bHRfY2RhdGEsIGRlZmF1bHRfY21hc2ssCi0JCQkJCURFRkFVTFRfQ1dJRFRILCBERUZBVUxUX0NIRUlHSFQsCi0JCQkJCQlERUZBVUxUX0NIT1RYLCBERUZBVUxUX0NIT1RZKTsKLQkJU0RMX1NldEN1cnNvcihTRExfZGVmY3Vyc29yKTsKLQl9Ci0KLQkvKiBDcmVhdGUgYSBsb2NrIGlmIG5lY2Vzc2FyeSAqLwotCWlmICggbXVsdGl0aHJlYWRlZCApIHsKLQkJU0RMX2N1cnNvcmxvY2sgPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLQl9Ci0KLQkvKiBUaGF0J3MgaXQhICovCi0JcmV0dXJuKDApOwotfQotCi0vKiBNdWx0aS10aHJlYWQgc3VwcG9ydCBmb3IgY3Vyc29ycyAqLwotI2lmbmRlZiBTRExfTG9ja0N1cnNvcgotdm9pZCBTRExfTG9ja0N1cnNvcih2b2lkKQotewotCWlmICggU0RMX2N1cnNvcmxvY2sgKSB7Ci0JCVNETF9tdXRleFAoU0RMX2N1cnNvcmxvY2spOwotCX0KLX0KLSNlbmRpZgotI2lmbmRlZiBTRExfVW5sb2NrQ3Vyc29yCi12b2lkIFNETF9VbmxvY2tDdXJzb3Iodm9pZCkKLXsKLQlpZiAoIFNETF9jdXJzb3Jsb2NrICkgewotCQlTRExfbXV0ZXhWKFNETF9jdXJzb3Jsb2NrKTsKLQl9Ci19Ci0jZW5kaWYKLQotLyogU29mdHdhcmUgY3Vyc29yIGRyYXdpbmcgc3VwcG9ydCAqLwotU0RMX0N1cnNvciAqIFNETF9DcmVhdGVDdXJzb3IgKFVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgCi0JCQkJCWludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JaW50IHNhdmVsZW47Ci0JaW50IGk7Ci0JU0RMX0N1cnNvciAqY3Vyc29yOwotCi0JLyogTWFrZSBzdXJlIHRoZSB3aWR0aCBpcyBhIG11bHRpcGxlIG9mIDggKi8KLQl3ID0gKCh3KzcpJn43KTsKLQotCS8qIFNhbml0eSBjaGVjayB0aGUgaG90IHNwb3QgKi8KLQlpZiAoIChob3RfeCA8IDApIHx8IChob3RfeSA8IDApIHx8IChob3RfeCA+PSB3KSB8fCAoaG90X3kgPj0gaCkgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ3Vyc29yIGhvdCBzcG90IGRvZXNuJ3QgbGllIHdpdGhpbiBjdXJzb3IiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGN1cnNvciAqLwotCWN1cnNvciA9IChTRExfQ3Vyc29yICopU0RMX21hbGxvYyhzaXplb2YgKmN1cnNvcik7Ci0JaWYgKCBjdXJzb3IgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0Jc2F2ZWxlbiA9ICh3KjQpKmg7Ci0JY3Vyc29yLT5hcmVhLnggPSAwOwotCWN1cnNvci0+YXJlYS55ID0gMDsKLQljdXJzb3ItPmFyZWEudyA9IHc7Ci0JY3Vyc29yLT5hcmVhLmggPSBoOwotCWN1cnNvci0+aG90X3ggPSBob3RfeDsKLQljdXJzb3ItPmhvdF95ID0gaG90X3k7Ci0JY3Vyc29yLT5kYXRhID0gKFVpbnQ4ICopU0RMX21hbGxvYygody84KSpoKjIpOwotCWN1cnNvci0+bWFzayA9IGN1cnNvci0+ZGF0YSsoKHcvOCkqaCk7Ci0JY3Vyc29yLT5zYXZlWzBdID0gKFVpbnQ4ICopU0RMX21hbGxvYyhzYXZlbGVuKjIpOwotCWN1cnNvci0+c2F2ZVsxXSA9IGN1cnNvci0+c2F2ZVswXSArIHNhdmVsZW47Ci0JY3Vyc29yLT53bV9jdXJzb3IgPSBOVUxMOwotCWlmICggISBjdXJzb3ItPmRhdGEgfHwgISBjdXJzb3ItPnNhdmVbMF0gKSB7Ci0JCVNETF9GcmVlQ3Vyc29yKGN1cnNvcik7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCWZvciAoIGk9KCh3LzgpKmgpLTE7IGk+PTA7IC0taSApIHsKLQkJY3Vyc29yLT5kYXRhW2ldID0gZGF0YVtpXTsKLQkJY3Vyc29yLT5tYXNrW2ldID0gbWFza1tpXSB8IGRhdGFbaV07Ci0JfQotCVNETF9tZW1zZXQoY3Vyc29yLT5zYXZlWzBdLCAwLCBzYXZlbGVuKjIpOwotCi0JLyogSWYgdGhlIHdpbmRvdyBtYW5hZ2VyIGdpdmVzIHVzIGEgZ29vZCBjdXJzb3IsIHdlJ3JlIGRvbmUhICovCi0JaWYgKCB2aWRlby0+Q3JlYXRlV01DdXJzb3IgKSB7Ci0JCWN1cnNvci0+d21fY3Vyc29yID0gdmlkZW8tPkNyZWF0ZVdNQ3Vyc29yKHZpZGVvLCBkYXRhLCBtYXNrLAotCQkJCQkJCXcsIGgsIGhvdF94LCBob3RfeSk7Ci0JfSBlbHNlIHsKLQkJY3Vyc29yLT53bV9jdXJzb3IgPSBOVUxMOwotCX0KLQlyZXR1cm4oY3Vyc29yKTsKLX0KLQotLyogU0RMX1NldEN1cnNvcihOVUxMKSBjYW4gYmUgdXNlZCB0byBmb3JjZSB0aGUgY3Vyc29yIHJlZHJhdywKLSAgIGlmIHRoaXMgaXMgZGVzaXJlZCBmb3IgYW55IHJlYXNvbi4gIFRoaXMgaXMgdXNlZCB3aGVuIHNldHRpbmcKLSAgIHRoZSB2aWRlbyBtb2RlIGFuZCB3aGVuIHRoZSBTREwgd2luZG93IGdhaW5zIHRoZSBtb3VzZSBmb2N1cy4KLSAqLwotdm9pZCBTRExfU2V0Q3Vyc29yIChTRExfQ3Vyc29yICpjdXJzb3IpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgdmlkZW8gc3Vic3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkICovCi0JaWYgKCAhIHZpZGVvICkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogUHJldmVudCB0aGUgZXZlbnQgdGhyZWFkIGZyb20gbW92aW5nIHRoZSBtb3VzZSAqLwotCVNETF9Mb2NrQ3Vyc29yKCk7Ci0KLQkvKiBTZXQgdGhlIG5ldyBjdXJzb3IgKi8KLQlpZiAoIGN1cnNvciAmJiAoY3Vyc29yICE9IFNETF9jdXJzb3IpICkgewotCQkvKiBFcmFzZSB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbiAqLwotCQlpZiAoIFNIT1VMRF9EUkFXQ1VSU09SKFNETF9jdXJzb3JzdGF0ZSkgKSB7Ci0JCQlTRExfRXJhc2VDdXJzb3IoU0RMX1ZpZGVvU3VyZmFjZSk7Ci0JCX0gZWxzZSBpZiAoIHZpZGVvLT5Nb3ZlV01DdXJzb3IgKSB7Ci0JCQkvKiBJZiB0aGUgdmlkZW8gZHJpdmVyIGlzIG1vdmluZyB0aGUgY3Vyc29yIGRpcmVjdGx5LAotCQkJICAgaXQgbmVlZHMgdG8gaGlkZSB0aGUgb2xkIGN1cnNvciBiZWZvcmUgKHBvc3NpYmx5KQotCQkJICAgc2hvd2luZyB0aGUgbmV3IG9uZS4gIChCdXQgZG9uJ3QgZXJhc2UgTlVMTCBjdXJzb3IpCi0JCQkgKi8KLQkJCWlmICggU0RMX2N1cnNvciAmJiB2aWRlby0+U2hvd1dNQ3Vyc29yICkgewotCQkJCXZpZGVvLT5TaG93V01DdXJzb3IodGhpcywgTlVMTCk7Ci0JCQl9Ci0JCX0KLQkJU0RMX2N1cnNvciA9IGN1cnNvcjsKLQl9Ci0KLQkvKiBEcmF3IHRoZSBuZXcgbW91c2UgY3Vyc29yICovCi0JaWYgKCBTRExfY3Vyc29yICYmIChTRExfY3Vyc29yc3RhdGUmQ1VSU09SX1ZJU0lCTEUpICkgewotCQkvKiBVc2Ugd2luZG93IG1hbmFnZXIgY3Vyc29yIGlmIHBvc3NpYmxlICovCi0JCWludCBzaG93X3dtX2N1cnNvciA9IDA7Ci0JCWlmICggU0RMX2N1cnNvci0+d21fY3Vyc29yICYmIHZpZGVvLT5TaG93V01DdXJzb3IgKSB7Ci0JCQlzaG93X3dtX2N1cnNvciA9IHZpZGVvLT5TaG93V01DdXJzb3IodGhpcywgU0RMX2N1cnNvci0+d21fY3Vyc29yKTsKLQkJfQotCQlpZiAoIHNob3dfd21fY3Vyc29yICkgewotCQkJU0RMX2N1cnNvcnN0YXRlICY9IH5DVVJTT1JfVVNJTkdTVzsKLQkJfSBlbHNlIHsKLQkJCVNETF9jdXJzb3JzdGF0ZSB8PSBDVVJTT1JfVVNJTkdTVzsKLQkJCWlmICggdmlkZW8tPlNob3dXTUN1cnNvciApIHsKLQkJCQl2aWRlby0+U2hvd1dNQ3Vyc29yKHRoaXMsIE5VTEwpOwotCQkJfQotCQkJeyBpbnQgeCwgeTsKLQkJCQlTRExfR2V0TW91c2VTdGF0ZSgmeCwgJnkpOwotCQkJCVNETF9jdXJzb3ItPmFyZWEueCA9ICh4IC0gU0RMX2N1cnNvci0+aG90X3gpOwotCQkJCVNETF9jdXJzb3ItPmFyZWEueSA9ICh5IC0gU0RMX2N1cnNvci0+aG90X3kpOwotCQkJfQotCQkJU0RMX0RyYXdDdXJzb3IoU0RMX1ZpZGVvU3VyZmFjZSk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBFcmFzZSB3aW5kb3cgbWFuYWdlciBtb3VzZSAoY3Vyc29yIG5vdCB2aXNpYmxlKSAqLwotCQlpZiAoIFNETF9jdXJzb3IgJiYgKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9VU0lOR1NXKSApIHsKLQkJCVNETF9FcmFzZUN1cnNvcihTRExfVmlkZW9TdXJmYWNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICggdmlkZW8gKSB7Ci0JCQkJaWYgKCB2aWRlby0+U2hvd1dNQ3Vyc29yICkgewotCQkJCQl2aWRlby0+U2hvd1dNQ3Vyc29yKHRoaXMsIE5VTEwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlTRExfVW5sb2NrQ3Vyc29yKCk7Ci19Ci0KLVNETF9DdXJzb3IgKiBTRExfR2V0Q3Vyc29yICh2b2lkKQotewotCXJldHVybihTRExfY3Vyc29yKTsKLX0KLQotdm9pZCBTRExfRnJlZUN1cnNvciAoU0RMX0N1cnNvciAqY3Vyc29yKQotewotCWlmICggY3Vyc29yICkgewotCQlpZiAoIGN1cnNvciA9PSBTRExfY3Vyc29yICkgewotCQkJU0RMX1NldEN1cnNvcihTRExfZGVmY3Vyc29yKTsKLQkJfQotCQlpZiAoIGN1cnNvciAhPSBTRExfZGVmY3Vyc29yICkgewotCQkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQotCQkJaWYgKCBjdXJzb3ItPmRhdGEgKSB7Ci0JCQkJU0RMX2ZyZWUoY3Vyc29yLT5kYXRhKTsKLQkJCX0KLQkJCWlmICggY3Vyc29yLT5zYXZlWzBdICkgewotCQkJCVNETF9mcmVlKGN1cnNvci0+c2F2ZVswXSk7Ci0JCQl9Ci0JCQlpZiAoIHZpZGVvICYmIGN1cnNvci0+d21fY3Vyc29yICkgewotCQkJCWlmICggdmlkZW8tPkZyZWVXTUN1cnNvciApIHsKLQkJCQkJdmlkZW8tPkZyZWVXTUN1cnNvcih0aGlzLCBjdXJzb3ItPndtX2N1cnNvcik7Ci0JCQkJfQotCQkJfQotCQkJU0RMX2ZyZWUoY3Vyc29yKTsKLQkJfQotCX0KLX0KLQotaW50IFNETF9TaG93Q3Vyc29yIChpbnQgdG9nZ2xlKQotewotCWludCBzaG93aW5nOwotCi0Jc2hvd2luZyA9IChTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSk7Ci0JaWYgKCB0b2dnbGUgPj0gMCApIHsKLQkJU0RMX0xvY2tDdXJzb3IoKTsKLQkJaWYgKCB0b2dnbGUgKSB7Ci0JCQlTRExfY3Vyc29yc3RhdGUgfD0gQ1VSU09SX1ZJU0lCTEU7Ci0JCX0gZWxzZSB7Ci0JCQlTRExfY3Vyc29yc3RhdGUgJj0gfkNVUlNPUl9WSVNJQkxFOwotCQl9Ci0JCVNETF9VbmxvY2tDdXJzb3IoKTsKLQkJaWYgKCAoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICE9IHNob3dpbmcgKSB7Ci0JCQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQkJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwotCi0JCQlTRExfU2V0Q3Vyc29yKE5VTEwpOwotCQkJaWYgKCB2aWRlbyAmJiB2aWRlby0+Q2hlY2tNb3VzZU1vZGUgKSB7Ci0JCQkJdmlkZW8tPkNoZWNrTW91c2VNb2RlKHRoaXMpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJLyogUXVlcnkgY3VycmVudCBzdGF0ZSAqLyA7Ci0JfQotCXJldHVybihzaG93aW5nID8gMSA6IDApOwotfQotCi12b2lkIFNETF9XYXJwTW91c2UgKFVpbnQxNiB4LCBVaW50MTYgeSkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQotCWlmICggIXZpZGVvIHx8ICFTRExfUHVibGljU3VyZmFjZSApIHsKLQkJU0RMX1NldEVycm9yKCJBIHZpZGVvIG1vZGUgbXVzdCBiZSBzZXQgYmVmb3JlIHdhcnBpbmcgbW91c2UiKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIElmIHdlIGhhdmUgYW4gb2Zmc2V0IHZpZGVvIG1vZGUsIG9mZnNldCB0aGUgbW91c2UgY29vcmRpbmF0ZXMgKi8KLQlpZiAodGhpcy0+c2NyZWVuLT5waXRjaCA9PSAwKSB7Ci0JCXggKz0gdGhpcy0+c2NyZWVuLT5vZmZzZXQgLyB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLQkJeSArPSB0aGlzLT5zY3JlZW4tPm9mZnNldDsKLQl9IGVsc2UgewotCQl4ICs9ICh0aGlzLT5zY3JlZW4tPm9mZnNldCAlIHRoaXMtPnNjcmVlbi0+cGl0Y2gpIC8KLQkJICAgICAgdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JCXkgKz0gKHRoaXMtPnNjcmVlbi0+b2Zmc2V0IC8gdGhpcy0+c2NyZWVuLT5waXRjaCk7Ci0JfQotCi0JLyogVGhpcyBnZW5lcmF0ZXMgYSBtb3VzZSBtb3Rpb24gZXZlbnQgKi8KLQlpZiAoIHZpZGVvLT5XYXJwV01DdXJzb3IgKSB7Ci0JCXZpZGVvLT5XYXJwV01DdXJzb3IodGhpcywgeCwgeSk7Ci0JfSBlbHNlIHsKLQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCB4LCB5KTsKLQl9Ci19Ci0KLXZvaWQgU0RMX01vdmVDdXJzb3IoaW50IHgsIGludCB5KQotewotCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCi0JLyogRXJhc2UgYW5kIHVwZGF0ZSB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbiAqLwotCWlmICggU0hPVUxEX0RSQVdDVVJTT1IoU0RMX2N1cnNvcnN0YXRlKSApIHsKLQkJLyogRXJhc2UgYW5kIHJlZHJhdyBtb3VzZSBjdXJzb3IgaW4gbmV3IHBvc2l0aW9uICovCi0JCVNETF9Mb2NrQ3Vyc29yKCk7Ci0JCVNETF9FcmFzZUN1cnNvcihTRExfVmlkZW9TdXJmYWNlKTsKLQkJU0RMX2N1cnNvci0+YXJlYS54ID0gKHggLSBTRExfY3Vyc29yLT5ob3RfeCk7Ci0JCVNETF9jdXJzb3ItPmFyZWEueSA9ICh5IC0gU0RMX2N1cnNvci0+aG90X3kpOwotCQlTRExfRHJhd0N1cnNvcihTRExfVmlkZW9TdXJmYWNlKTsKLQkJU0RMX1VubG9ja0N1cnNvcigpOwotCX0gZWxzZSBpZiAoIHZpZGVvLT5Nb3ZlV01DdXJzb3IgKSB7Ci0JCXZpZGVvLT5Nb3ZlV01DdXJzb3IodmlkZW8sIHgsIHkpOwotCX0KLX0KLQotLyogS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBjdXJzb3IgY29sb3JzICovCi1zdGF0aWMgaW50IHBhbGV0dGVfY2hhbmdlZCA9IDE7Ci1zdGF0aWMgVWludDggcGl4ZWxzOFsyXTsKLQotdm9pZCBTRExfQ3Vyc29yUGFsZXR0ZUNoYW5nZWQodm9pZCkKLXsKLQlwYWxldHRlX2NoYW5nZWQgPSAxOwotfQotCi12b2lkIFNETF9Nb3VzZVJlY3QoU0RMX1JlY3QgKmFyZWEpCi17Ci0JaW50IGNsaXBfZGlmZjsKLQotCSphcmVhID0gU0RMX2N1cnNvci0+YXJlYTsKLQlpZiAoIGFyZWEtPnggPCAwICkgewotCQlhcmVhLT53ICs9IGFyZWEtPng7Ci0JCWFyZWEtPnggPSAwOwotCX0KLQlpZiAoIGFyZWEtPnkgPCAwICkgewotCQlhcmVhLT5oICs9IGFyZWEtPnk7Ci0JCWFyZWEtPnkgPSAwOwotCX0KLQljbGlwX2RpZmYgPSAoYXJlYS0+eCthcmVhLT53KS1TRExfVmlkZW9TdXJmYWNlLT53OwotCWlmICggY2xpcF9kaWZmID4gMCApIHsKLQkJYXJlYS0+dyA9IGFyZWEtPncgPCBjbGlwX2RpZmYgPyAwIDogYXJlYS0+dy1jbGlwX2RpZmY7Ci0JfQotCWNsaXBfZGlmZiA9IChhcmVhLT55K2FyZWEtPmgpLVNETF9WaWRlb1N1cmZhY2UtPmg7Ci0JaWYgKCBjbGlwX2RpZmYgPiAwICkgewotCQlhcmVhLT5oID0gYXJlYS0+aCA8IGNsaXBfZGlmZiA/IDAgOiBhcmVhLT5oLWNsaXBfZGlmZjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIFNETF9EcmF3Q3Vyc29yRmFzdChTRExfU3VyZmFjZSAqc2NyZWVuLCBTRExfUmVjdCAqYXJlYSkKLXsKLQljb25zdCBVaW50MzIgcGl4ZWxzWzJdID0geyAweEZGRkZGRkZGLCAweDAwMDAwMDAwIH07Ci0JaW50IGksIHcsIGg7Ci0JVWludDggKmRhdGEsIGRhdGFiOwotCVVpbnQ4ICptYXNrLCBtYXNrYjsKLQotCWRhdGEgPSBTRExfY3Vyc29yLT5kYXRhICsgYXJlYS0+eSAqIFNETF9jdXJzb3ItPmFyZWEudy84OwotCW1hc2sgPSBTRExfY3Vyc29yLT5tYXNrICsgYXJlYS0+eSAqIFNETF9jdXJzb3ItPmFyZWEudy84OwotCXN3aXRjaCAoc2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpIHsKLQotCSAgICBjYXNlIDE6IHsKLQkJVWludDggKmRzdDsKLQkJaW50IGRzdHNraXA7Ci0KLQkJaWYgKCBwYWxldHRlX2NoYW5nZWQgKSB7Ci0JCQlwaXhlbHM4WzBdID0gKFVpbnQ4KVNETF9NYXBSR0Ioc2NyZWVuLT5mb3JtYXQsIDI1NSwgMjU1LCAyNTUpOwotCQkJcGl4ZWxzOFsxXSA9IChVaW50OClTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCAwLCAwLCAwKTsKLQkJCXBhbGV0dGVfY2hhbmdlZCA9IDA7Ci0JCX0KLQkJZHN0ID0gKFVpbnQ4ICopc2NyZWVuLT5waXhlbHMgKwotICAgICAgICAgICAgICAgICAgICAgICAoU0RMX2N1cnNvci0+YXJlYS55K2FyZWEtPnkpKnNjcmVlbi0+cGl0Y2ggKwotICAgICAgICAgICAgICAgICAgICAgICBTRExfY3Vyc29yLT5hcmVhLng7Ci0JCWRzdHNraXAgPSBzY3JlZW4tPnBpdGNoLWFyZWEtPnc7Ci0KLQkJZm9yICggaD1hcmVhLT5oOyBoOyBoLS0gKSB7Ci0JCQlmb3IgKCB3PWFyZWEtPncvODsgdzsgdy0tICkgewotCQkJCW1hc2tiID0gKm1hc2srKzsKLQkJCQlkYXRhYiA9ICpkYXRhKys7Ci0JCQkJZm9yICggaT0wOyBpPDg7ICsraSApIHsKLQkJCQkJaWYgKCBtYXNrYiAmIDB4ODAgKSB7Ci0JCQkJCQkqZHN0ID0gcGl4ZWxzOFtkYXRhYj4+N107Ci0JCQkJCX0KLQkJCQkJbWFza2IgPDw9IDE7Ci0JCQkJCWRhdGFiIDw8PSAxOwotCQkJCQlkc3QrKzsKLQkJCQl9Ci0JCQl9Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMjogewotCQlVaW50MTYgKmRzdDsKLQkJaW50IGRzdHNraXA7Ci0KLQkJZHN0ID0gKFVpbnQxNiAqKXNjcmVlbi0+cGl4ZWxzICsKLSAgICAgICAgICAgICAgICAgICAgICAgKFNETF9jdXJzb3ItPmFyZWEueSthcmVhLT55KSpzY3JlZW4tPnBpdGNoLzIgKwotICAgICAgICAgICAgICAgICAgICAgICBTRExfY3Vyc29yLT5hcmVhLng7Ci0JCWRzdHNraXAgPSAoc2NyZWVuLT5waXRjaC8yKS1hcmVhLT53OwotCi0JCWZvciAoIGg9YXJlYS0+aDsgaDsgaC0tICkgewotCQkJZm9yICggdz1hcmVhLT53Lzg7IHc7IHctLSApIHsKLQkJCQltYXNrYiA9ICptYXNrKys7Ci0JCQkJZGF0YWIgPSAqZGF0YSsrOwotCQkJCWZvciAoIGk9MDsgaTw4OyArK2kgKSB7Ci0JCQkJCWlmICggbWFza2IgJiAweDgwICkgewotCQkJCQkJKmRzdCA9IChVaW50MTYpcGl4ZWxzW2RhdGFiPj43XTsKLQkJCQkJfQotCQkJCQltYXNrYiA8PD0gMTsKLQkJCQkJZGF0YWIgPDw9IDE7Ci0JCQkJCWRzdCsrOwotCQkJCX0KLQkJCX0KLQkJCWRzdCArPSBkc3Rza2lwOwotCQl9Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAzOiB7Ci0JCVVpbnQ4ICpkc3Q7Ci0JCWludCBkc3Rza2lwOwotCi0JCWRzdCA9IChVaW50OCAqKXNjcmVlbi0+cGl4ZWxzICsKLSAgICAgICAgICAgICAgICAgICAgICAgKFNETF9jdXJzb3ItPmFyZWEueSthcmVhLT55KSpzY3JlZW4tPnBpdGNoICsKLSAgICAgICAgICAgICAgICAgICAgICAgU0RMX2N1cnNvci0+YXJlYS54KjM7Ci0JCWRzdHNraXAgPSBzY3JlZW4tPnBpdGNoLWFyZWEtPncqMzsKLQotCQlmb3IgKCBoPWFyZWEtPmg7IGg7IGgtLSApIHsKLQkJCWZvciAoIHc9YXJlYS0+dy84OyB3OyB3LS0gKSB7Ci0JCQkJbWFza2IgPSAqbWFzaysrOwotCQkJCWRhdGFiID0gKmRhdGErKzsKLQkJCQlmb3IgKCBpPTA7IGk8ODsgKytpICkgewotCQkJCQlpZiAoIG1hc2tiICYgMHg4MCApIHsKLQkJCQkJCVNETF9tZW1zZXQoZHN0LHBpeGVsc1tkYXRhYj4+N10sMyk7Ci0JCQkJCX0KLQkJCQkJbWFza2IgPDw9IDE7Ci0JCQkJCWRhdGFiIDw8PSAxOwotCQkJCQlkc3QgKz0gMzsKLQkJCQl9Ci0JCQl9Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIGNhc2UgNDogewotCQlVaW50MzIgKmRzdDsKLQkJaW50IGRzdHNraXA7Ci0KLQkJZHN0ID0gKFVpbnQzMiAqKXNjcmVlbi0+cGl4ZWxzICsKLSAgICAgICAgICAgICAgICAgICAgICAgKFNETF9jdXJzb3ItPmFyZWEueSthcmVhLT55KSpzY3JlZW4tPnBpdGNoLzQgKwotICAgICAgICAgICAgICAgICAgICAgICBTRExfY3Vyc29yLT5hcmVhLng7Ci0JCWRzdHNraXAgPSAoc2NyZWVuLT5waXRjaC80KS1hcmVhLT53OwotCi0JCWZvciAoIGg9YXJlYS0+aDsgaDsgaC0tICkgewotCQkJZm9yICggdz1hcmVhLT53Lzg7IHc7IHctLSApIHsKLQkJCQltYXNrYiA9ICptYXNrKys7Ci0JCQkJZGF0YWIgPSAqZGF0YSsrOwotCQkJCWZvciAoIGk9MDsgaTw4OyArK2kgKSB7Ci0JCQkJCWlmICggbWFza2IgJiAweDgwICkgewotCQkJCQkJKmRzdCA9IHBpeGVsc1tkYXRhYj4+N107Ci0JCQkJCX0KLQkJCQkJbWFza2IgPDw9IDE7Ci0JCQkJCWRhdGFiIDw8PSAxOwotCQkJCQlkc3QrKzsKLQkJCQl9Ci0JCQl9Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgU0RMX0RyYXdDdXJzb3JTbG93KFNETF9TdXJmYWNlICpzY3JlZW4sIFNETF9SZWN0ICphcmVhKQotewotCWNvbnN0IFVpbnQzMiBwaXhlbHNbMl0gPSB7IDB4RkZGRkZGLCAweDAwMDAwMCB9OwotCWludCBoOwotCWludCB4LCBtaW54LCBtYXh4OwotCVVpbnQ4ICpkYXRhLCBkYXRhYiA9IDA7Ci0JVWludDggKm1hc2ssIG1hc2tiID0gMDsKLQlVaW50OCAqZHN0OwotCWludCBkc3RicHAsIGRzdHNraXA7Ci0KLQlkYXRhID0gU0RMX2N1cnNvci0+ZGF0YSArIGFyZWEtPnkgKiBTRExfY3Vyc29yLT5hcmVhLncvODsKLQltYXNrID0gU0RMX2N1cnNvci0+bWFzayArIGFyZWEtPnkgKiBTRExfY3Vyc29yLT5hcmVhLncvODsKLQlkc3RicHAgPSBzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLQlkc3QgPSAoVWludDggKilzY3JlZW4tPnBpeGVscyArCi0gICAgICAgICAgICAgICAgICAgICAgIChTRExfY3Vyc29yLT5hcmVhLnkrYXJlYS0+eSkqc2NyZWVuLT5waXRjaCArCi0gICAgICAgICAgICAgICAgICAgICAgIFNETF9jdXJzb3ItPmFyZWEueCpkc3RicHA7Ci0JZHN0c2tpcCA9IHNjcmVlbi0+cGl0Y2gtU0RMX2N1cnNvci0+YXJlYS53KmRzdGJwcDsKLQotCW1pbnggPSBhcmVhLT54OwotCW1heHggPSBhcmVhLT54K2FyZWEtPnc7Ci0JaWYgKCBzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9PSAxICkgewotCQlpZiAoIHBhbGV0dGVfY2hhbmdlZCApIHsKLQkJCXBpeGVsczhbMF0gPSAoVWludDgpU0RMX01hcFJHQihzY3JlZW4tPmZvcm1hdCwgMjU1LCAyNTUsIDI1NSk7Ci0JCQlwaXhlbHM4WzFdID0gKFVpbnQ4KVNETF9NYXBSR0Ioc2NyZWVuLT5mb3JtYXQsIDAsIDAsIDApOwotCQkJcGFsZXR0ZV9jaGFuZ2VkID0gMDsKLQkJfQotCQlmb3IgKCBoPWFyZWEtPmg7IGg7IGgtLSApIHsKLQkJCWZvciAoIHg9MDsgeDxTRExfY3Vyc29yLT5hcmVhLnc7ICsreCApIHsKLQkJCQlpZiAoICh4JTgpID09IDAgKSB7Ci0JCQkJCW1hc2tiID0gKm1hc2srKzsKLQkJCQkJZGF0YWIgPSAqZGF0YSsrOwotCQkJCX0KLQkJCQlpZiAoICh4ID49IG1pbngpICYmICh4IDwgbWF4eCkgKSB7Ci0JCQkJCWlmICggbWFza2IgJiAweDgwICkgewotCQkJCQkJU0RMX21lbXNldChkc3QsIHBpeGVsczhbZGF0YWI+PjddLCBkc3RicHApOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1hc2tiIDw8PSAxOwotCQkJCWRhdGFiIDw8PSAxOwotCQkJCWRzdCArPSBkc3RicHA7Ci0JCQl9Ci0JCQlkc3QgKz0gZHN0c2tpcDsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoIGg9YXJlYS0+aDsgaDsgaC0tICkgewotCQkJZm9yICggeD0wOyB4PFNETF9jdXJzb3ItPmFyZWEudzsgKyt4ICkgewotCQkJCWlmICggKHglOCkgPT0gMCApIHsKLQkJCQkJbWFza2IgPSAqbWFzaysrOwotCQkJCQlkYXRhYiA9ICpkYXRhKys7Ci0JCQkJfQotCQkJCWlmICggKHggPj0gbWlueCkgJiYgKHggPCBtYXh4KSApIHsKLQkJCQkJaWYgKCBtYXNrYiAmIDB4ODAgKSB7Ci0JCQkJCQlTRExfbWVtc2V0KGRzdCwgcGl4ZWxzW2RhdGFiPj43XSwgZHN0YnBwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQltYXNrYiA8PD0gMTsKLQkJCQlkYXRhYiA8PD0gMTsKLQkJCQlkc3QgKz0gZHN0YnBwOwotCQkJfQotCQkJZHN0ICs9IGRzdHNraXA7Ci0JCX0KLQl9Ci19Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgdWdseSB3b3JrIG9mIGNvbnZlcnRpbmcgdGhlIHNhdmVkIGN1cnNvciBiYWNrZ3JvdW5kIGZyb20KLSAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIHNoYWRvdyBzdXJmYWNlIHRvIHRoYXQgb2YgdGhlIHZpZGVvIHN1cmZhY2UuCi0gICBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYmxpdHRpbmcgZnJvbSBhIHNoYWRvdyBzdXJmYWNlIG9mIGEgZGlmZmVyZW50Ci0gICBwaXhlbCBmb3JtYXQgdGhhbiB0aGUgdmlkZW8gc3VyZmFjZSwgYW5kIHVzaW5nIGEgc29mdHdhcmUgcmVuZGVyZWQgY3Vyc29yLgotKi8KLXN0YXRpYyB2b2lkIFNETF9Db252ZXJ0Q3Vyc29yU2F2ZShTRExfU3VyZmFjZSAqc2NyZWVuLCBpbnQgdywgaW50IGgpCi17Ci0JU0RMX0JsaXRJbmZvIGluZm87Ci0JU0RMX2xvYmxpdCBSdW5CbGl0OwotCi0JLyogTWFrZSBzdXJlIHdlIGNhbiBzdGVhbCB0aGUgYmxpdCBtYXBwaW5nICovCi0JaWYgKCBzY3JlZW4tPm1hcC0+ZHN0ICE9IFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIGJsaXQgaW5mb3JtYXRpb24gKi8KLQlpbmZvLnNfcGl4ZWxzID0gU0RMX2N1cnNvci0+c2F2ZVsxXTsKLQlpbmZvLnNfd2lkdGggPSB3OwotCWluZm8uc19oZWlnaHQgPSBoOwotCWluZm8uc19za2lwID0gMDsKLQlpbmZvLmRfcGl4ZWxzID0gU0RMX2N1cnNvci0+c2F2ZVswXTsKLQlpbmZvLmRfd2lkdGggPSB3OwotCWluZm8uZF9oZWlnaHQgPSBoOwotCWluZm8uZF9za2lwID0gMDsKLQlpbmZvLmF1eF9kYXRhID0gc2NyZWVuLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhOwotCWluZm8uc3JjID0gc2NyZWVuLT5mb3JtYXQ7Ci0JaW5mby50YWJsZSA9IHNjcmVlbi0+bWFwLT50YWJsZTsKLQlpbmZvLmRzdCA9IFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdDsKLQlSdW5CbGl0ID0gc2NyZWVuLT5tYXAtPnN3X2RhdGEtPmJsaXQ7Ci0KLQkvKiBSdW4gdGhlIGFjdHVhbCBzb2Z0d2FyZSBibGl0ICovCi0JUnVuQmxpdCgmaW5mbyk7Ci19Ci0KLXZvaWQgU0RMX0RyYXdDdXJzb3JOb0xvY2soU0RMX1N1cmZhY2UgKnNjcmVlbikKLXsKLQlTRExfUmVjdCBhcmVhOwotCi0JLyogR2V0IHRoZSBtb3VzZSByZWN0YW5nbGUsIGNsaXBwZWQgdG8gdGhlIHNjcmVlbiAqLwotCVNETF9Nb3VzZVJlY3QoJmFyZWEpOwotCWlmICggKGFyZWEudyA9PSAwKSB8fCAoYXJlYS5oID09IDApICkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogQ29weSBtb3VzZSBiYWNrZ3JvdW5kICovCi0JeyBpbnQgdywgaCwgc2NyZWVuYnBwOwotCSAgVWludDggKnNyYywgKmRzdDsKLQotCSAgLyogU2V0IHVwIHRoZSBjb3B5IHBvaW50ZXJzICovCi0JICBzY3JlZW5icHAgPSBzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLQkgIGlmICggKHNjcmVlbiA9PSBTRExfVmlkZW9TdXJmYWNlKSB8fAotCSAgICAgICAgICBGT1JNQVRfRVFVQUwoc2NyZWVuLT5mb3JtYXQsIFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdCkgKSB7Ci0JCWRzdCA9IFNETF9jdXJzb3ItPnNhdmVbMF07Ci0JICB9IGVsc2UgewotCQlkc3QgPSBTRExfY3Vyc29yLT5zYXZlWzFdOwotCSAgfQotCSAgc3JjID0gKFVpbnQ4ICopc2NyZWVuLT5waXhlbHMgKyBhcmVhLnkgKiBzY3JlZW4tPnBpdGNoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEueCAqIHNjcmVlbmJwcDsKLQotCSAgLyogUGVyZm9ybSB0aGUgY29weSAqLwotCSAgdyA9IGFyZWEudypzY3JlZW5icHA7Ci0JICBoID0gYXJlYS5oOwotCSAgd2hpbGUgKCBoLS0gKSB7Ci0JCSAgU0RMX21lbWNweShkc3QsIHNyYywgdyk7Ci0JCSAgZHN0ICs9IHc7Ci0JCSAgc3JjICs9IHNjcmVlbi0+cGl0Y2g7Ci0JICB9Ci0JfQotCi0JLyogRHJhdyB0aGUgbW91c2UgY3Vyc29yICovCi0JYXJlYS54IC09IFNETF9jdXJzb3ItPmFyZWEueDsKLQlhcmVhLnkgLT0gU0RMX2N1cnNvci0+YXJlYS55OwotCWlmICggKGFyZWEueCA9PSAwKSAmJiAoYXJlYS53ID09IFNETF9jdXJzb3ItPmFyZWEudykgKSB7Ci0JCVNETF9EcmF3Q3Vyc29yRmFzdChzY3JlZW4sICZhcmVhKTsKLQl9IGVsc2UgewotCQlTRExfRHJhd0N1cnNvclNsb3coc2NyZWVuLCAmYXJlYSk7Ci0JfQotfQotCi12b2lkIFNETF9EcmF3Q3Vyc29yKFNETF9TdXJmYWNlICpzY3JlZW4pCi17Ci0JLyogTG9jayB0aGUgc2NyZWVuIGlmIG5lY2Vzc2FyeSAqLwotCWlmICggc2NyZWVuID09IE5VTEwgKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCBTRExfTVVTVExPQ0soc2NyZWVuKSApIHsKLQkJaWYgKCBTRExfTG9ja1N1cmZhY2Uoc2NyZWVuKSA8IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlTRExfRHJhd0N1cnNvck5vTG9jayhzY3JlZW4pOwotCi0JLyogVW5sb2NrIHRoZSBzY3JlZW4gYW5kIHVwZGF0ZSBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoIFNETF9NVVNUTE9DSyhzY3JlZW4pICkgewotCQlTRExfVW5sb2NrU3VyZmFjZShzY3JlZW4pOwotCX0KLQlpZiAoIChzY3JlZW4gPT0gU0RMX1ZpZGVvU3VyZmFjZSkgJiYKLQkgICAgICgoc2NyZWVuLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICE9IFNETF9IV1NVUkZBQ0UpICkgewotCQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87Ci0JCVNETF9SZWN0IGFyZWE7Ci0KLQkJU0RMX01vdXNlUmVjdCgmYXJlYSk7Ci0KLQkJLyogVGhpcyBjYW4gYmUgY2FsbGVkIGJlZm9yZSBhIHZpZGVvIG1vZGUgaXMgc2V0ICovCi0JCWlmICggdmlkZW8tPlVwZGF0ZVJlY3RzICkgewotCQkJdmlkZW8tPlVwZGF0ZVJlY3RzKHRoaXMsIDEsICZhcmVhKTsKLQkJfQotCX0KLX0KLQotdm9pZCBTRExfRXJhc2VDdXJzb3JOb0xvY2soU0RMX1N1cmZhY2UgKnNjcmVlbikKLXsKLQlTRExfUmVjdCBhcmVhOwotCi0JLyogR2V0IHRoZSBtb3VzZSByZWN0YW5nbGUsIGNsaXBwZWQgdG8gdGhlIHNjcmVlbiAqLwotCVNETF9Nb3VzZVJlY3QoJmFyZWEpOwotCWlmICggKGFyZWEudyA9PSAwKSB8fCAoYXJlYS5oID09IDApICkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogQ29weSBtb3VzZSBiYWNrZ3JvdW5kICovCi0JeyBpbnQgdywgaCwgc2NyZWVuYnBwOwotCSAgVWludDggKnNyYywgKmRzdDsKLQotCSAgLyogU2V0IHVwIHRoZSBjb3B5IHBvaW50ZXJzICovCi0JICBzY3JlZW5icHAgPSBzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLQkgIGlmICggKHNjcmVlbiA9PSBTRExfVmlkZW9TdXJmYWNlKSB8fAotCSAgICAgICAgICBGT1JNQVRfRVFVQUwoc2NyZWVuLT5mb3JtYXQsIFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdCkgKSB7Ci0JCXNyYyA9IFNETF9jdXJzb3ItPnNhdmVbMF07Ci0JICB9IGVsc2UgewotCQlzcmMgPSBTRExfY3Vyc29yLT5zYXZlWzFdOwotCSAgfQotCSAgZHN0ID0gKFVpbnQ4ICopc2NyZWVuLT5waXhlbHMgKyBhcmVhLnkgKiBzY3JlZW4tPnBpdGNoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEueCAqIHNjcmVlbmJwcDsKLQotCSAgLyogUGVyZm9ybSB0aGUgY29weSAqLwotCSAgdyA9IGFyZWEudypzY3JlZW5icHA7Ci0JICBoID0gYXJlYS5oOwotCSAgd2hpbGUgKCBoLS0gKSB7Ci0JCSAgU0RMX21lbWNweShkc3QsIHNyYywgdyk7Ci0JCSAgc3JjICs9IHc7Ci0JCSAgZHN0ICs9IHNjcmVlbi0+cGl0Y2g7Ci0JICB9Ci0KLQkgIC8qIFBlcmZvcm0gcGl4ZWwgY29udmVyc2lvbiBvbiBjdXJzb3IgYmFja2dyb3VuZCAqLwotCSAgaWYgKCBzcmMgPiBTRExfY3Vyc29yLT5zYXZlWzFdICkgewotCQlTRExfQ29udmVydEN1cnNvclNhdmUoc2NyZWVuLCBhcmVhLncsIGFyZWEuaCk7Ci0JICB9Ci0JfQotfQotCi12b2lkIFNETF9FcmFzZUN1cnNvcihTRExfU3VyZmFjZSAqc2NyZWVuKQotewotCS8qIExvY2sgdGhlIHNjcmVlbiBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoIHNjcmVlbiA9PSBOVUxMICkgewotCQlyZXR1cm47Ci0JfQotCWlmICggU0RMX01VU1RMT0NLKHNjcmVlbikgKSB7Ci0JCWlmICggU0RMX0xvY2tTdXJmYWNlKHNjcmVlbikgPCAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JU0RMX0VyYXNlQ3Vyc29yTm9Mb2NrKHNjcmVlbik7Ci0KLQkvKiBVbmxvY2sgdGhlIHNjcmVlbiBhbmQgdXBkYXRlIGlmIG5lY2Vzc2FyeSAqLwotCWlmICggU0RMX01VU1RMT0NLKHNjcmVlbikgKSB7Ci0JCVNETF9VbmxvY2tTdXJmYWNlKHNjcmVlbik7Ci0JfQotCWlmICggKHNjcmVlbiA9PSBTRExfVmlkZW9TdXJmYWNlKSAmJgotCSAgICAgKChzY3JlZW4tPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gU0RMX0hXU1VSRkFDRSkgKSB7Ci0JCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQkJU0RMX1JlY3QgYXJlYTsKLQotCQlTRExfTW91c2VSZWN0KCZhcmVhKTsKLQkJaWYgKCB2aWRlby0+VXBkYXRlUmVjdHMgKSB7Ci0JCQl2aWRlby0+VXBkYXRlUmVjdHModGhpcywgMSwgJmFyZWEpOwotCQl9Ci0JfQotfQotCi0vKiBSZXNldCB0aGUgY3Vyc29yIG9uIHZpZGVvIG1vZGUgY2hhbmdlCi0gICBGSVhNRTogIEtlZXAgdHJhY2sgb2YgYWxsIGN1cnNvcnMsIGFuZCByZXNldCB0aGVtIGFsbC4KLSAqLwotdm9pZCBTRExfUmVzZXRDdXJzb3Iodm9pZCkKLXsKLQlpbnQgc2F2ZWxlbjsKLQotCWlmICggU0RMX2N1cnNvciApIHsKLQkJc2F2ZWxlbiA9IFNETF9jdXJzb3ItPmFyZWEudyo0KlNETF9jdXJzb3ItPmFyZWEuaDsKLQkJU0RMX2N1cnNvci0+YXJlYS54ID0gMDsKLQkJU0RMX2N1cnNvci0+YXJlYS55ID0gMDsKLQkJU0RMX21lbXNldChTRExfY3Vyc29yLT5zYXZlWzBdLCAwLCBzYXZlbGVuKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9jdXJzb3JfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfY3Vyc29yX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5ODNlMi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9jdXJzb3JfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFVzZWZ1bCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBmcm9tIFNETF9jdXJzb3IuYyAqLwotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotCi1leHRlcm4gaW50ICBTRExfQ3Vyc29ySW5pdChVaW50MzIgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgU0RMX0N1cnNvclBhbGV0dGVDaGFuZ2VkKHZvaWQpOwotZXh0ZXJuIHZvaWQgU0RMX0RyYXdDdXJzb3IoU0RMX1N1cmZhY2UgKnNjcmVlbik7Ci1leHRlcm4gdm9pZCBTRExfRHJhd0N1cnNvck5vTG9jayhTRExfU3VyZmFjZSAqc2NyZWVuKTsKLWV4dGVybiB2b2lkIFNETF9FcmFzZUN1cnNvcihTRExfU3VyZmFjZSAqc2NyZWVuKTsKLWV4dGVybiB2b2lkIFNETF9FcmFzZUN1cnNvck5vTG9jayhTRExfU3VyZmFjZSAqc2NyZWVuKTsKLWV4dGVybiB2b2lkIFNETF9VcGRhdGVDdXJzb3IoU0RMX1N1cmZhY2UgKnNjcmVlbik7Ci1leHRlcm4gdm9pZCBTRExfUmVzZXRDdXJzb3Iodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfTW92ZUN1cnNvcihpbnQgeCwgaW50IHkpOwotZXh0ZXJuIHZvaWQgU0RMX0N1cnNvclF1aXQodm9pZCk7Ci0KLSNkZWZpbmUgSU5MSU5FX01PVVNFTE9DSwotI2lmZGVmIElOTElORV9NT1VTRUxPQ0sKLS8qIElubGluZSAobWFjcm8pIHZlcnNpb25zIG9mIHRoZSBtb3VzZSBsb2NrIGZ1bmN0aW9ucyAqLwotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotCi1leHRlcm4gU0RMX211dGV4ICpTRExfY3Vyc29ybG9jazsKLQotI2RlZmluZSBTRExfTG9ja0N1cnNvcigpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKCBTRExfY3Vyc29ybG9jayApIHsJCQkJCVwKLQkJCVNETF9tdXRleFAoU0RMX2N1cnNvcmxvY2spOwkJCVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoIDAgKQotI2RlZmluZSBTRExfVW5sb2NrQ3Vyc29yKCkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoIFNETF9jdXJzb3Jsb2NrICkgewkJCQkJXAotCQkJU0RMX211dGV4VihTRExfY3Vyc29ybG9jayk7CQkJXAotCQl9CQkJCQkJCVwKLQl9IHdoaWxlICggMCApCi0jZWxzZQotZXh0ZXJuIHZvaWQgU0RMX0xvY2tDdXJzb3Iodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfVW5sb2NrQ3Vyc29yKHZvaWQpOwotI2VuZGlmIC8qIElOTElORV9NT1VTRUxPQ0sgKi8KLQotLyogT25seSBmb3IgbG93LWxldmVsIG1vdXNlIGN1cnNvciBkcmF3aW5nICovCi1leHRlcm4gU0RMX0N1cnNvciAqU0RMX2N1cnNvcjsKLWV4dGVybiB2b2lkIFNETF9Nb3VzZVJlY3QoU0RMX1JlY3QgKmFyZWEpOwotCi0vKiBTdGF0ZSBkZWZpbml0aW9ucyBmb3IgdGhlIFNETCBjdXJzb3IgKi8KLSNkZWZpbmUgQ1VSU09SX1ZJU0lCTEUJMHgwMQotI2RlZmluZSBDVVJTT1JfVVNJTkdTVwkweDEwCi0jZGVmaW5lIFNIT1VMRF9EUkFXQ1VSU09SKFgpIAkJCQkJCVwKLQkJCSgoKFgpJihDVVJTT1JfVklTSUJMRXxDVVJTT1JfVVNJTkdTVykpID09ICAJXAotCQkJCQkoQ1VSU09SX1ZJU0lCTEV8Q1VSU09SX1VTSU5HU1cpKQotCi1leHRlcm4gdm9sYXRpbGUgaW50IFNETF9jdXJzb3JzdGF0ZTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2dhbW1hLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9nYW1tYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzBhMWY1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2dhbW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEdhbW1hIGNvcnJlY3Rpb24gc3VwcG9ydCAqLwotCi0jaWZkZWYgSEFWRV9NQVRIX0gKLSNpbmNsdWRlIDxtYXRoLmg+CS8qIFVzZWQgZm9yIGNhbGN1bGF0aW5nIGdhbW1hIHJhbXBzICovCi0jZWxzZQotLyogTWF0aCByb3V0aW5lcyBmcm9tIHVDbGliYzogaHR0cDovL3d3dy51Y2xpYmMub3JnICovCi0jaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCi0jaW5jbHVkZSAiZV9zcXJ0LmgiCi0jaW5jbHVkZSAiZV9wb3cuaCIKLSNpbmNsdWRlICJlX2xvZy5oIgotI2RlZmluZSBwb3coeCwgeSkJX19pZWVlNzU0X3Bvdyh4LCB5KQotI2RlZmluZSBsb2coeCkJCV9faWVlZTc1NF9sb2coeCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCi0KLQotc3RhdGljIHZvaWQgQ2FsY3VsYXRlR2FtbWFSYW1wKGZsb2F0IGdhbW1hLCBVaW50MTYgKnJhbXApCi17Ci0JaW50IGk7Ci0KLQkvKiAwLjAgZ2FtbWEgaXMgYWxsIGJsYWNrICovCi0JaWYgKCBnYW1tYSA8PSAwLjBmICkgewotCQlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7Ci0JCQlyYW1wW2ldID0gMDsKLQkJfQotCQlyZXR1cm47Ci0JfSBlbHNlCi0JLyogMS4wIGdhbW1hIGlzIGlkZW50aXR5ICovCi0JaWYgKCBnYW1tYSA9PSAxLjBmICkgewotCQlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7Ci0JCQlyYW1wW2ldID0gKGkgPDwgOCkgfCBpOwotCQl9Ci0JCXJldHVybjsKLQl9IGVsc2UKLQkvKiBDYWxjdWxhdGUgYSByZWFsIGdhbW1hIHJhbXAgKi8KLQl7IGludCB2YWx1ZTsKLQkJZ2FtbWEgPSAxLjBmIC8gZ2FtbWE7Ci0JCWZvciAoIGk9MDsgaTwyNTY7ICsraSApIHsKLQkJCXZhbHVlID0gKGludCkocG93KChkb3VibGUpaS8yNTYuMCwgZ2FtbWEpKjY1NTM1LjArMC41KTsKLQkJCWlmICggdmFsdWUgPiA2NTUzNSApIHsKLQkJCQl2YWx1ZSA9IDY1NTM1OwotCQkJfQotCQkJcmFtcFtpXSA9IChVaW50MTYpdmFsdWU7Ci0JCX0KLQl9Ci19Ci1zdGF0aWMgdm9pZCBDYWxjdWxhdGVHYW1tYUZyb21SYW1wKGZsb2F0ICpnYW1tYSwgVWludDE2ICpyYW1wKQotewotCS8qIFRoZSBmb2xsb3dpbmcgaXMgYWRhcHRlZCBmcm9tIGEgcG9zdCBieSBHYXJyZXR0IEJhc3Mgb24gT3BlbkdMCi0JICAgR2FtZWRldiBsaXN0LCBNYXJjaCA0LCAyMDAwLgotCSAqLwotCWZsb2F0IHN1bSA9IDAuMGY7Ci0JaW50IGksIGNvdW50ID0gMDsKLQotCSpnYW1tYSA9IDEuMDsKLQlmb3IgKCBpID0gMTsgaSA8IDI1NjsgKytpICkgewotCSAgICBpZiAoIChyYW1wW2ldICE9IDApICYmIChyYW1wW2ldICE9IDY1NTM1KSApIHsKLQkgICAgICAgIGRvdWJsZSBCID0gKGRvdWJsZSlpIC8gMjU2LjA7Ci0JICAgICAgICBkb3VibGUgQSA9IHJhbXBbaV0gLyA2NTUzNS4wOwotCSAgICAgICAgc3VtICs9IChmbG9hdCkgKCBsb2coQSkgLyBsb2coQikgKTsKLQkgICAgICAgIGNvdW50Kys7Ci0JICAgIH0KLQl9Ci0JaWYgKCBjb3VudCAmJiBzdW0gPiAwLjBmICkgewotCQkqZ2FtbWEgPSAxLjBmIC8gKHN1bSAvIGNvdW50KTsKLQl9Ci19Ci0KLWludCBTRExfU2V0R2FtbWEoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSkKLXsKLQlpbnQgc3VjY2VlZGVkOwotCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwkKLQotCXN1Y2NlZWRlZCA9IC0xOwotCS8qIFByZWZlciB1c2luZyBTZXRHYW1tYVJhbXAoKSwgYXMgaXQncyBtb3JlIGZsZXhpYmxlICovCi0JewotCQlVaW50MTYgcmFtcFszXVsyNTZdOwotCi0JCUNhbGN1bGF0ZUdhbW1hUmFtcChyZWQsIHJhbXBbMF0pOwotCQlDYWxjdWxhdGVHYW1tYVJhbXAoZ3JlZW4sIHJhbXBbMV0pOwotCQlDYWxjdWxhdGVHYW1tYVJhbXAoYmx1ZSwgcmFtcFsyXSk7Ci0JCXN1Y2NlZWRlZCA9IFNETF9TZXRHYW1tYVJhbXAocmFtcFswXSwgcmFtcFsxXSwgcmFtcFsyXSk7Ci0JfQotCWlmICggKHN1Y2NlZWRlZCA8IDApICYmIHZpZGVvLT5TZXRHYW1tYSApIHsKLQkJU0RMX0NsZWFyRXJyb3IoKTsKLQkJc3VjY2VlZGVkID0gdmlkZW8tPlNldEdhbW1hKHRoaXMsIHJlZCwgZ3JlZW4sIGJsdWUpOwotCX0KLQlyZXR1cm4gc3VjY2VlZGVkOwotfQotCi0vKiBDYWxjdWxhdGluZyB0aGUgZ2FtbWEgYnkgaW50ZWdyYXRpbmcgdGhlIGdhbW1hIHJhbXBzIGlzbid0IGV4YWN0LAotICAgc28gdGhpcyBmdW5jdGlvbiBpc24ndCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4KLSovCi1pbnQgU0RMX0dldEdhbW1hKGZsb2F0ICpyZWQsIGZsb2F0ICpncmVlbiwgZmxvYXQgKmJsdWUpCi17Ci0JaW50IHN1Y2NlZWRlZDsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsJCi0KLQlzdWNjZWVkZWQgPSAtMTsKLQkvKiBQcmVmZXIgdXNpbmcgR2V0R2FtbWFSYW1wKCksIGFzIGl0J3MgbW9yZSBmbGV4aWJsZSAqLwotCXsKLQkJVWludDE2IHJhbXBbM11bMjU2XTsKLQotCQlzdWNjZWVkZWQgPSBTRExfR2V0R2FtbWFSYW1wKHJhbXBbMF0sIHJhbXBbMV0sIHJhbXBbMl0pOwotCQlpZiAoIHN1Y2NlZWRlZCA+PSAwICkgewotCQkJQ2FsY3VsYXRlR2FtbWFGcm9tUmFtcChyZWQsIHJhbXBbMF0pOwotCQkJQ2FsY3VsYXRlR2FtbWFGcm9tUmFtcChncmVlbiwgcmFtcFsxXSk7Ci0JCQlDYWxjdWxhdGVHYW1tYUZyb21SYW1wKGJsdWUsIHJhbXBbMl0pOwotCQl9Ci0JfQotCWlmICggKHN1Y2NlZWRlZCA8IDApICYmIHZpZGVvLT5HZXRHYW1tYSApIHsKLQkJU0RMX0NsZWFyRXJyb3IoKTsKLQkJc3VjY2VlZGVkID0gdmlkZW8tPkdldEdhbW1hKHRoaXMsIHJlZCwgZ3JlZW4sIGJsdWUpOwotCX0KLQlyZXR1cm4gc3VjY2VlZGVkOwotfQotCi1pbnQgU0RMX1NldEdhbW1hUmFtcChjb25zdCBVaW50MTYgKnJlZCwgY29uc3QgVWludDE2ICpncmVlbiwgY29uc3QgVWludDE2ICpibHVlKQotewotCWludCBzdWNjZWVkZWQ7Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CQotCVNETF9TdXJmYWNlICpzY3JlZW4gPSBTRExfUHVibGljU3VyZmFjZTsKLQotCS8qIFZlcmlmeSB0aGUgc2NyZWVuIHBhcmFtZXRlciAqLwotCWlmICggIXNjcmVlbiApIHsKLQkJU0RMX1NldEVycm9yKCJObyB2aWRlbyBtb2RlIGhhcyBiZWVuIHNldCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogTGF6aWx5IGFsbG9jYXRlIHRoZSBnYW1tYSB0YWJsZXMgKi8KLQlpZiAoICEgdmlkZW8tPmdhbW1hICkgewotCQlTRExfR2V0R2FtbWFSYW1wKDAsIDAsIDApOwotCX0KLQotCS8qIEZpbGwgdGhlIGdhbW1hIHRhYmxlIHdpdGggdGhlIG5ldyB2YWx1ZXMgKi8KLQlpZiAoIHJlZCApIHsKLQkJU0RMX21lbWNweSgmdmlkZW8tPmdhbW1hWzAqMjU2XSwgcmVkLCAyNTYqc2l6ZW9mKCp2aWRlby0+Z2FtbWEpKTsKLQl9Ci0JaWYgKCBncmVlbiApIHsKLQkJU0RMX21lbWNweSgmdmlkZW8tPmdhbW1hWzEqMjU2XSwgZ3JlZW4sIDI1NipzaXplb2YoKnZpZGVvLT5nYW1tYSkpOwotCX0KLQlpZiAoIGJsdWUgKSB7Ci0JCVNETF9tZW1jcHkoJnZpZGVvLT5nYW1tYVsyKjI1Nl0sIGJsdWUsIDI1NipzaXplb2YoKnZpZGVvLT5nYW1tYSkpOwotCX0KLQotCS8qIEdhbW1hIGNvcnJlY3Rpb24gYWx3YXlzIHBvc3NpYmxlIG9uIHNwbGl0IHBhbGV0dGVzICovCi0JaWYgKCAoc2NyZWVuLT5mbGFncyAmIFNETF9IV1BBTEVUVEUpID09IFNETF9IV1BBTEVUVEUgKSB7Ci0JCVNETF9QYWxldHRlICpwYWwgPSBzY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZTsKLQotCQkvKiBJZiBwaHlzaWNhbCBwYWxldHRlIGhhcyBiZWVuIHNldCBpbmRlcGVuZGVudGx5LCB1c2UgaXQgKi8KLQkJaWYodmlkZW8tPnBoeXNwYWwpCi0JCSAgICAgICAgcGFsID0gdmlkZW8tPnBoeXNwYWw7Ci0JCSAgICAgIAotCQlTRExfU2V0UGFsZXR0ZShzY3JlZW4sIFNETF9QSFlTUEFMLAotCQkJICAgICAgIHBhbC0+Y29sb3JzLCAwLCBwYWwtPm5jb2xvcnMpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBUcnkgdG8gc2V0IHRoZSBnYW1tYSByYW1wIGluIHRoZSBkcml2ZXIgKi8KLQlzdWNjZWVkZWQgPSAtMTsKLQlpZiAoIHZpZGVvLT5TZXRHYW1tYVJhbXAgKSB7Ci0JCXN1Y2NlZWRlZCA9IHZpZGVvLT5TZXRHYW1tYVJhbXAodGhpcywgdmlkZW8tPmdhbW1hKTsKLQl9IGVsc2UgewotCQlTRExfU2V0RXJyb3IoIkdhbW1hIHJhbXAgbWFuaXB1bGF0aW9uIG5vdCBzdXBwb3J0ZWQiKTsKLQl9Ci0JcmV0dXJuIHN1Y2NlZWRlZDsKLX0KLQotaW50IFNETF9HZXRHYW1tYVJhbXAoVWludDE2ICpyZWQsIFVpbnQxNiAqZ3JlZW4sIFVpbnQxNiAqYmx1ZSkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsJCi0KLQkvKiBMYXppbHkgYWxsb2NhdGUgdGhlIGdhbW1hIHRhYmxlICovCi0JaWYgKCAhIHZpZGVvLT5nYW1tYSApIHsKLQkJdmlkZW8tPmdhbW1hID0gU0RMX21hbGxvYygzKjI1NipzaXplb2YoKnZpZGVvLT5nYW1tYSkpOwotCQlpZiAoICEgdmlkZW8tPmdhbW1hICkgewotCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKCB2aWRlby0+R2V0R2FtbWFSYW1wICkgewotCQkJLyogR2V0IHRoZSByZWFsIGhhcmR3YXJlIGdhbW1hICovCi0JCQl2aWRlby0+R2V0R2FtbWFSYW1wKHRoaXMsIHZpZGVvLT5nYW1tYSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBBc3N1bWUgYW4gaWRlbnRpdHkgZ2FtbWEgKi8KLQkJCWludCBpOwotCQkJZm9yICggaT0wOyBpPDI1NjsgKytpICkgewotCQkJCXZpZGVvLT5nYW1tYVswKjI1NitpXSA9IChpIDw8IDgpIHwgaTsKLQkJCQl2aWRlby0+Z2FtbWFbMSoyNTYraV0gPSAoaSA8PCA4KSB8IGk7Ci0JCQkJdmlkZW8tPmdhbW1hWzIqMjU2K2ldID0gKGkgPDwgOCkgfCBpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogSnVzdCBjb3B5IGZyb20gb3VyIGludGVybmFsIHRhYmxlICovCi0JaWYgKCByZWQgKSB7Ci0JCVNETF9tZW1jcHkocmVkLCAmdmlkZW8tPmdhbW1hWzAqMjU2XSwgMjU2KnNpemVvZigqcmVkKSk7Ci0JfQotCWlmICggZ3JlZW4gKSB7Ci0JCVNETF9tZW1jcHkoZ3JlZW4sICZ2aWRlby0+Z2FtbWFbMSoyNTZdLCAyNTYqc2l6ZW9mKCpncmVlbikpOwotCX0KLQlpZiAoIGJsdWUgKSB7Ci0JCVNETF9tZW1jcHkoYmx1ZSwgJnZpZGVvLT5nYW1tYVsyKjI1Nl0sIDI1NipzaXplb2YoKmJsdWUpKTsKLQl9Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9sZWFrcy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfbGVha3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1MTY0Ni4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9sZWFrcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHN1cmZhY2UgbGVhayBkZXRlY3Rpb24gY29kZSBlbmFibGVkICovCi0vKiNkZWZpbmUgQ0hFQ0tfTEVBS1MqLwotCi0vKiBHbG9iYWwgdmFyaWFibGVzIHVzZWQgdG8gY2hlY2sgbGVha3MgaW4gY29kZSB1c2luZyBTREwgKi8KLQotI2lmZGVmIENIRUNLX0xFQUtTCi1leHRlcm4gaW50IHN1cmZhY2VzX2FsbG9jYXRlZDsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfcGl4ZWxzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9waXhlbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjMTZlNi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9waXhlbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDYyNSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogR2VuZXJhbCAobW9zdGx5IGludGVybmFsKSBwaXhlbC9jb2xvciBtYW5pcHVsYXRpb24gcm91dGluZXMgZm9yIFNETCAqLwotCi0jaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIlNETF9ibGl0LmgiCi0jaW5jbHVkZSAiU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKLQotLyogSGVscGVyIGZ1bmN0aW9ucyAqLwotLyoKLSAqIEFsbG9jYXRlIGEgcGl4ZWwgZm9ybWF0IHN0cnVjdHVyZSBhbmQgZmlsbCBpdCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGluZm8uCi0gKi8KLVNETF9QaXhlbEZvcm1hdCAqU0RMX0FsbG9jRm9ybWF0KGludCBicHAsCi0JCQlVaW50MzIgUm1hc2ssIFVpbnQzMiBHbWFzaywgVWludDMyIEJtYXNrLCBVaW50MzIgQW1hc2spCi17Ci0JU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQ7Ci0JVWludDMyIG1hc2s7Ci0KLQkvKiBBbGxvY2F0ZSBhbiBlbXB0eSBwaXhlbCBmb3JtYXQgc3RydWN0dXJlICovCi0JZm9ybWF0ID0gU0RMX21hbGxvYyhzaXplb2YoKmZvcm1hdCkpOwotCWlmICggZm9ybWF0ID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCVNETF9tZW1zZXQoZm9ybWF0LCAwLCBzaXplb2YoKmZvcm1hdCkpOwotCWZvcm1hdC0+YWxwaGEgPSBTRExfQUxQSEFfT1BBUVVFOwotCi0JLyogU2V0IHVwIHRoZSBmb3JtYXQgKi8KLQlmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IGJwcDsKLQlmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPSAoYnBwKzcpLzg7Ci0JaWYgKCBSbWFzayB8fCBCbWFzayB8fCBHbWFzayApIHsgLyogUGFja2VkIHBpeGVscyB3aXRoIGN1c3RvbSBtYXNrICovCi0JCWZvcm1hdC0+cGFsZXR0ZSA9IE5VTEw7Ci0JCWZvcm1hdC0+UnNoaWZ0ID0gMDsKLQkJZm9ybWF0LT5SbG9zcyA9IDg7Ci0JCWlmICggUm1hc2sgKSB7Ci0JCQlmb3IgKCBtYXNrID0gUm1hc2s7ICEobWFzayYweDAxKTsgbWFzayA+Pj0gMSApCi0JCQkJKytmb3JtYXQtPlJzaGlmdDsKLQkJCWZvciAoIDsgKG1hc2smMHgwMSk7IG1hc2sgPj49IDEgKQotCQkJCS0tZm9ybWF0LT5SbG9zczsKLQkJfQotCQlmb3JtYXQtPkdzaGlmdCA9IDA7Ci0JCWZvcm1hdC0+R2xvc3MgPSA4OwotCQlpZiAoIEdtYXNrICkgewotCQkJZm9yICggbWFzayA9IEdtYXNrOyAhKG1hc2smMHgwMSk7IG1hc2sgPj49IDEgKQotCQkJCSsrZm9ybWF0LT5Hc2hpZnQ7Ci0JCQlmb3IgKCA7IChtYXNrJjB4MDEpOyBtYXNrID4+PSAxICkKLQkJCQktLWZvcm1hdC0+R2xvc3M7Ci0JCX0KLQkJZm9ybWF0LT5Cc2hpZnQgPSAwOwotCQlmb3JtYXQtPkJsb3NzID0gODsKLQkJaWYgKCBCbWFzayApIHsKLQkJCWZvciAoIG1hc2sgPSBCbWFzazsgIShtYXNrJjB4MDEpOyBtYXNrID4+PSAxICkKLQkJCQkrK2Zvcm1hdC0+QnNoaWZ0OwotCQkJZm9yICggOyAobWFzayYweDAxKTsgbWFzayA+Pj0gMSApCi0JCQkJLS1mb3JtYXQtPkJsb3NzOwotCQl9Ci0JCWZvcm1hdC0+QXNoaWZ0ID0gMDsKLQkJZm9ybWF0LT5BbG9zcyA9IDg7Ci0JCWlmICggQW1hc2sgKSB7Ci0JCQlmb3IgKCBtYXNrID0gQW1hc2s7ICEobWFzayYweDAxKTsgbWFzayA+Pj0gMSApCi0JCQkJKytmb3JtYXQtPkFzaGlmdDsKLQkJCWZvciAoIDsgKG1hc2smMHgwMSk7IG1hc2sgPj49IDEgKQotCQkJCS0tZm9ybWF0LT5BbG9zczsKLQkJfQotCQlmb3JtYXQtPlJtYXNrID0gUm1hc2s7Ci0JCWZvcm1hdC0+R21hc2sgPSBHbWFzazsKLQkJZm9ybWF0LT5CbWFzayA9IEJtYXNrOwotCQlmb3JtYXQtPkFtYXNrID0gQW1hc2s7Ci0JfSBlbHNlIGlmICggYnBwID4gOCApIHsJCS8qIFBhY2tlZCBwaXhlbHMgd2l0aCBzdGFuZGFyZCBtYXNrICovCi0JCS8qIFItRy1CICovCi0JCWlmICggYnBwID4gMjQgKQotCQkJYnBwID0gMjQ7Ci0JCWZvcm1hdC0+Umxvc3MgPSA4LShicHAvMyk7Ci0JCWZvcm1hdC0+R2xvc3MgPSA4LShicHAvMyktKGJwcCUzKTsKLQkJZm9ybWF0LT5CbG9zcyA9IDgtKGJwcC8zKTsKLQkJZm9ybWF0LT5Sc2hpZnQgPSAoKGJwcC8zKSsoYnBwJTMpKSsoYnBwLzMpOwotCQlmb3JtYXQtPkdzaGlmdCA9IChicHAvMyk7Ci0JCWZvcm1hdC0+QnNoaWZ0ID0gMDsKLQkJZm9ybWF0LT5SbWFzayA9ICgoMHhGRj4+Zm9ybWF0LT5SbG9zcyk8PGZvcm1hdC0+UnNoaWZ0KTsKLQkJZm9ybWF0LT5HbWFzayA9ICgoMHhGRj4+Zm9ybWF0LT5HbG9zcyk8PGZvcm1hdC0+R3NoaWZ0KTsKLQkJZm9ybWF0LT5CbWFzayA9ICgoMHhGRj4+Zm9ybWF0LT5CbG9zcyk8PGZvcm1hdC0+QnNoaWZ0KTsKLQl9IGVsc2UgewotCQkvKiBQYWxldHRpemVkIGZvcm1hdHMgaGF2ZSBubyBtYXNrIGluZm8gKi8KLQkJZm9ybWF0LT5SbG9zcyA9IDg7Ci0JCWZvcm1hdC0+R2xvc3MgPSA4OwotCQlmb3JtYXQtPkJsb3NzID0gODsKLQkJZm9ybWF0LT5BbG9zcyA9IDg7Ci0JCWZvcm1hdC0+UnNoaWZ0ID0gMDsKLQkJZm9ybWF0LT5Hc2hpZnQgPSAwOwotCQlmb3JtYXQtPkJzaGlmdCA9IDA7Ci0JCWZvcm1hdC0+QXNoaWZ0ID0gMDsKLQkJZm9ybWF0LT5SbWFzayA9IDA7Ci0JCWZvcm1hdC0+R21hc2sgPSAwOwotCQlmb3JtYXQtPkJtYXNrID0gMDsKLQkJZm9ybWF0LT5BbWFzayA9IDA7Ci0JfQotCWlmICggYnBwIDw9IDggKSB7CQkJLyogUGFsZXR0aXplZCBtb2RlICovCi0JCWludCBuY29sb3JzID0gMTw8YnBwOwotI2lmZGVmIERFQlVHX1BBTEVUVEUKLQkJZnByaW50ZihzdGRlcnIsImJwcD0lZCBuY29sb3JzPSVkXG4iLGJwcCxuY29sb3JzKTsKLSNlbmRpZgotCQlmb3JtYXQtPnBhbGV0dGUgPSAoU0RMX1BhbGV0dGUgKilTRExfbWFsbG9jKHNpemVvZihTRExfUGFsZXR0ZSkpOwotCQlpZiAoIGZvcm1hdC0+cGFsZXR0ZSA9PSBOVUxMICkgewotCQkJU0RMX0ZyZWVGb3JtYXQoZm9ybWF0KTsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJcmV0dXJuKE5VTEwpOwotCQl9Ci0JCShmb3JtYXQtPnBhbGV0dGUpLT5uY29sb3JzID0gbmNvbG9yczsKLQkJKGZvcm1hdC0+cGFsZXR0ZSktPmNvbG9ycyA9IChTRExfQ29sb3IgKilTRExfbWFsbG9jKAotCQkJCShmb3JtYXQtPnBhbGV0dGUpLT5uY29sb3JzKnNpemVvZihTRExfQ29sb3IpKTsKLQkJaWYgKCAoZm9ybWF0LT5wYWxldHRlKS0+Y29sb3JzID09IE5VTEwgKSB7Ci0JCQlTRExfRnJlZUZvcm1hdChmb3JtYXQpOwotCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQlyZXR1cm4oTlVMTCk7Ci0JCX0KLQkJaWYgKCBSbWFzayB8fCBCbWFzayB8fCBHbWFzayApIHsKLQkJCS8qIGNyZWF0ZSBwYWxldHRlIGFjY29yZGluZyB0byBtYXNrcyAqLwotCQkJaW50IGk7Ci0JCQlpbnQgUm09MCxHbT0wLEJtPTA7Ci0JCQlpbnQgUnc9MCxHdz0wLEJ3PTA7Ci0jaWZkZWYgRU5BQkxFX1BBTEVUVEVfQUxQSEEKLQkJCWludCBBbT0wLEF3PTA7Ci0jZW5kaWYKLQkJCWlmKFJtYXNrKQotCQkJewotCQkJCVJ3PTgtZm9ybWF0LT5SbG9zczsKLQkJCQlmb3IoaT1mb3JtYXQtPlJsb3NzO2k+MDtpLT1SdykKLQkJCQkJUm18PTE8PGk7Ci0JCQl9Ci0jaWZkZWYgREVCVUdfUEFMRVRURQotCQkJZnByaW50ZihzdGRlcnIsIlJ3PSVkIFJtPTB4JTAyWFxuIixSdyxSbSk7Ci0jZW5kaWYKLQkJCWlmKEdtYXNrKQotCQkJewotCQkJCUd3PTgtZm9ybWF0LT5HbG9zczsKLQkJCQlmb3IoaT1mb3JtYXQtPkdsb3NzO2k+MDtpLT1HdykKLQkJCQkJR218PTE8PGk7Ci0JCQl9Ci0jaWZkZWYgREVCVUdfUEFMRVRURQotCQkJZnByaW50ZihzdGRlcnIsIkd3PSVkIEdtPTB4JTAyWFxuIixHdyxHbSk7Ci0jZW5kaWYKLQkJCWlmKEJtYXNrKQotCQkJewotCQkJCUJ3PTgtZm9ybWF0LT5CbG9zczsKLQkJCQlmb3IoaT1mb3JtYXQtPkJsb3NzO2k+MDtpLT1CdykKLQkJCQkJQm18PTE8PGk7Ci0JCQl9Ci0jaWZkZWYgREVCVUdfUEFMRVRURQotCQkJZnByaW50ZihzdGRlcnIsIkJ3PSVkIEJtPTB4JTAyWFxuIixCdyxCbSk7Ci0jZW5kaWYKLSNpZmRlZiBFTkFCTEVfUEFMRVRURV9BTFBIQQotCQkJaWYoQW1hc2spCi0JCQl7Ci0JCQkJQXc9OC1mb3JtYXQtPkFsb3NzOwotCQkJCWZvcihpPWZvcm1hdC0+QWxvc3M7aT4wO2ktPUF3KQotCQkJCQlBbXw9MTw8aTsKLQkJCX0KLSMgaWZkZWYgREVCVUdfUEFMRVRURQotCQkJZnByaW50ZihzdGRlcnIsIkF3PSVkIEFtPTB4JTAyWFxuIixBdyxBbSk7Ci0jIGVuZGlmCi0jZW5kaWYKLQkJCWZvcihpPTA7IGkgPCBuY29sb3JzOyArK2kpIHsKLQkJCQlpbnQgcixnLGI7Ci0JCQkJcj0oaSZSbWFzayk+PmZvcm1hdC0+UnNoaWZ0OwotCQkJCXI9KHI8PGZvcm1hdC0+Umxvc3MpfCgocipSbSk+PlJ3KTsKLQkJCQlmb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tpXS5yPXI7Ci0KLQkJCQlnPShpJkdtYXNrKT4+Zm9ybWF0LT5Hc2hpZnQ7Ci0JCQkJZz0oZzw8Zm9ybWF0LT5HbG9zcyl8KChnKkdtKT4+R3cpOwotCQkJCWZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2ldLmc9ZzsKLQotCQkJCWI9KGkmQm1hc2spPj5mb3JtYXQtPkJzaGlmdDsKLQkJCQliPShiPDxmb3JtYXQtPkJsb3NzKXwoKGIqQm0pPj5Cdyk7Ci0JCQkJZm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbaV0uYj1iOwotCi0jaWZkZWYgRU5BQkxFX1BBTEVUVEVfQUxQSEEKLQkJCQlhPShpJkFtYXNrKT4+Zm9ybWF0LT5Bc2hpZnQ7Ci0JCQkJYT0oYTw8Zm9ybWF0LT5BbG9zcyl8KChhKkFtKT4+QXcpOwotCQkJCWZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2ldLnVudXNlZD1hOwotI2Vsc2UKLQkJCQlmb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tpXS51bnVzZWQ9MDsKLSNlbmRpZgotCQkJfQotCQl9IGVsc2UgaWYgKCBuY29sb3JzID09IDIgKSB7Ci0JCQkvKiBDcmVhdGUgYSBibGFjayBhbmQgd2hpdGUgYml0bWFwIHBhbGV0dGUgKi8KLQkJCWZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzWzBdLnIgPSAweEZGOwotCQkJZm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbMF0uZyA9IDB4RkY7Ci0JCQlmb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1swXS5iID0gMHhGRjsKLQkJCWZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzWzFdLnIgPSAweDAwOwotCQkJZm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbMV0uZyA9IDB4MDA7Ci0JCQlmb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1sxXS5iID0gMHgwMDsKLQkJfSBlbHNlIHsKLQkJCS8qIENyZWF0ZSBhbiBlbXB0eSBwYWxldHRlICovCi0JCQlTRExfbWVtc2V0KChmb3JtYXQtPnBhbGV0dGUpLT5jb2xvcnMsIDAsCi0JCQkJKGZvcm1hdC0+cGFsZXR0ZSktPm5jb2xvcnMqc2l6ZW9mKFNETF9Db2xvcikpOwotCQl9Ci0JfQotCXJldHVybihmb3JtYXQpOwotfQotU0RMX1BpeGVsRm9ybWF0ICpTRExfUmVhbGxvY0Zvcm1hdChTRExfU3VyZmFjZSAqc3VyZmFjZSwgaW50IGJwcCwKLQkJCVVpbnQzMiBSbWFzaywgVWludDMyIEdtYXNrLCBVaW50MzIgQm1hc2ssIFVpbnQzMiBBbWFzaykKLXsKLQlpZiAoIHN1cmZhY2UtPmZvcm1hdCApIHsKLQkJU0RMX0ZyZWVGb3JtYXQoc3VyZmFjZS0+Zm9ybWF0KTsKLQkJU0RMX0Zvcm1hdENoYW5nZWQoc3VyZmFjZSk7Ci0JfQotCXN1cmZhY2UtPmZvcm1hdCA9IFNETF9BbGxvY0Zvcm1hdChicHAsIFJtYXNrLCBHbWFzaywgQm1hc2ssIEFtYXNrKTsKLQlyZXR1cm4gc3VyZmFjZS0+Zm9ybWF0OwotfQotCi0vKgotICogQ2hhbmdlIGFueSBwcmV2aW91cyBtYXBwaW5ncyBmcm9tL3RvIHRoZSBuZXcgc3VyZmFjZSBmb3JtYXQKLSAqLwotdm9pZCBTRExfRm9ybWF0Q2hhbmdlZChTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlzdGF0aWMgaW50IGZvcm1hdF92ZXJzaW9uID0gMDsKLQkrK2Zvcm1hdF92ZXJzaW9uOwotCWlmICggZm9ybWF0X3ZlcnNpb24gPCAwICkgeyAvKiBJdCB3cmFwcGVkLi4uICovCi0JCWZvcm1hdF92ZXJzaW9uID0gMTsKLQl9Ci0Jc3VyZmFjZS0+Zm9ybWF0X3ZlcnNpb24gPSBmb3JtYXRfdmVyc2lvbjsKLQlTRExfSW52YWxpZGF0ZU1hcChzdXJmYWNlLT5tYXApOwotfQotLyoKLSAqIEZyZWUgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBmb3JtYXQgc3RydWN0dXJlCi0gKi8KLXZvaWQgU0RMX0ZyZWVGb3JtYXQoU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQpCi17Ci0JaWYgKCBmb3JtYXQgKSB7Ci0JCWlmICggZm9ybWF0LT5wYWxldHRlICkgewotCQkJaWYgKCBmb3JtYXQtPnBhbGV0dGUtPmNvbG9ycyApIHsKLQkJCQlTRExfZnJlZShmb3JtYXQtPnBhbGV0dGUtPmNvbG9ycyk7Ci0JCQl9Ci0JCQlTRExfZnJlZShmb3JtYXQtPnBhbGV0dGUpOwotCQl9Ci0JCVNETF9mcmVlKGZvcm1hdCk7Ci0JfQotfQotLyoKLSAqIENhbGN1bGF0ZSBhbiA4LWJpdCAoMyByZWQsIDMgZ3JlZW4sIDIgYmx1ZSkgZGl0aGVyZWQgcGFsZXR0ZSBvZiBjb2xvcnMKLSAqLwotdm9pZCBTRExfRGl0aGVyQ29sb3JzKFNETF9Db2xvciAqY29sb3JzLCBpbnQgYnBwKQotewotCWludCBpOwotCWlmKGJwcCAhPSA4KQotCQlyZXR1cm47CQkvKiBvbmx5IDhicHAgc3VwcG9ydGVkIHJpZ2h0IG5vdyAqLwotCi0JZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJaW50IHIsIGcsIGI7Ci0JCS8qIG1hcCBlYWNoIGJpdCBmaWVsZCB0byB0aGUgZnVsbCBbMCwgMjU1XSBpbnRlcnZhbCwKLQkJICAgc28gMCBpcyBtYXBwZWQgdG8gKDAsIDAsIDApIGFuZCAyNTUgdG8gKDI1NSwgMjU1LCAyNTUpICovCi0JCXIgPSBpICYgMHhlMDsKLQkJciB8PSByID4+IDMgfCByID4+IDY7Ci0JCWNvbG9yc1tpXS5yID0gcjsKLQkJZyA9IChpIDw8IDMpICYgMHhlMDsKLQkJZyB8PSBnID4+IDMgfCBnID4+IDY7Ci0JCWNvbG9yc1tpXS5nID0gZzsKLQkJYiA9IGkgJiAweDM7Ci0JCWIgfD0gYiA8PCAyOwotCQliIHw9IGIgPDwgNDsKLQkJY29sb3JzW2ldLmIgPSBiOwotCX0KLX0KLS8qIAotICogQ2FsY3VsYXRlIHRoZSBwYWQtYWxpZ25lZCBzY2FubGluZSB3aWR0aCBvZiBhIHN1cmZhY2UKLSAqLwotVWludDE2IFNETF9DYWxjdWxhdGVQaXRjaChTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlVaW50MTYgcGl0Y2g7Ci0KLQkvKiBTdXJmYWNlIHNob3VsZCBiZSA0LWJ5dGUgYWxpZ25lZCBmb3Igc3BlZWQgKi8KLQlwaXRjaCA9IHN1cmZhY2UtPncqc3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCXN3aXRjaCAoc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpIHsKLQkJY2FzZSAxOgotCQkJcGl0Y2ggPSAocGl0Y2grNykvODsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlwaXRjaCA9IChwaXRjaCsxKS8yOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0JcGl0Y2ggPSAocGl0Y2ggKyAzKSAmIH4zOwkvKiA0LWJ5dGUgYWxpZ25pbmcgKi8KLQlyZXR1cm4ocGl0Y2gpOwotfQotLyoKLSAqIE1hdGNoIGFuIFJHQiB2YWx1ZSB0byBhIHBhcnRpY3VsYXIgcGFsZXR0ZSBpbmRleAotICovCi1VaW50OCBTRExfRmluZENvbG9yKFNETF9QYWxldHRlICpwYWwsIFVpbnQ4IHIsIFVpbnQ4IGcsIFVpbnQ4IGIpCi17Ci0JLyogRG8gY29sb3JzcGFjZSBkaXN0YW5jZSBtYXRjaGluZyAqLwotCXVuc2lnbmVkIGludCBzbWFsbGVzdDsKLQl1bnNpZ25lZCBpbnQgZGlzdGFuY2U7Ci0JaW50IHJkLCBnZCwgYmQ7Ci0JaW50IGk7Ci0JVWludDggcGl4ZWw9MDsKLQkJCi0Jc21hbGxlc3QgPSB+MDsKLQlmb3IgKCBpPTA7IGk8cGFsLT5uY29sb3JzOyArK2kgKSB7Ci0JCXJkID0gcGFsLT5jb2xvcnNbaV0uciAtIHI7Ci0JCWdkID0gcGFsLT5jb2xvcnNbaV0uZyAtIGc7Ci0JCWJkID0gcGFsLT5jb2xvcnNbaV0uYiAtIGI7Ci0JCWRpc3RhbmNlID0gKHJkKnJkKSsoZ2QqZ2QpKyhiZCpiZCk7Ci0JCWlmICggZGlzdGFuY2UgPCBzbWFsbGVzdCApIHsKLQkJCXBpeGVsID0gaTsKLQkJCWlmICggZGlzdGFuY2UgPT0gMCApIHsgLyogUGVyZmVjdCBtYXRjaCEgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJCXNtYWxsZXN0ID0gZGlzdGFuY2U7Ci0JCX0KLQl9Ci0JcmV0dXJuKHBpeGVsKTsKLX0KLQotLyogRmluZCB0aGUgb3BhcXVlIHBpeGVsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gUkdCIHRyaXBsZSAqLwotVWludDMyIFNETF9NYXBSR0IKLShjb25zdCBTRExfUGl4ZWxGb3JtYXQgKiBjb25zdCBmb3JtYXQsCi0gY29uc3QgVWludDggciwgY29uc3QgVWludDggZywgY29uc3QgVWludDggYikKLXsKLQlpZiAoIGZvcm1hdC0+cGFsZXR0ZSA9PSBOVUxMICkgewotCQlyZXR1cm4gKHIgPj4gZm9ybWF0LT5SbG9zcykgPDwgZm9ybWF0LT5Sc2hpZnQKLQkJICAgICAgIHwgKGcgPj4gZm9ybWF0LT5HbG9zcykgPDwgZm9ybWF0LT5Hc2hpZnQKLQkJICAgICAgIHwgKGIgPj4gZm9ybWF0LT5CbG9zcykgPDwgZm9ybWF0LT5Cc2hpZnQKLQkJICAgICAgIHwgZm9ybWF0LT5BbWFzazsKLQl9IGVsc2UgewotCQlyZXR1cm4gU0RMX0ZpbmRDb2xvcihmb3JtYXQtPnBhbGV0dGUsIHIsIGcsIGIpOwotCX0KLX0KLQotLyogRmluZCB0aGUgcGl4ZWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiBSR0JBIHF1YWRydXBsZSAqLwotVWludDMyIFNETF9NYXBSR0JBCi0oY29uc3QgU0RMX1BpeGVsRm9ybWF0ICogY29uc3QgZm9ybWF0LAotIGNvbnN0IFVpbnQ4IHIsIGNvbnN0IFVpbnQ4IGcsIGNvbnN0IFVpbnQ4IGIsIGNvbnN0IFVpbnQ4IGEpCi17Ci0JaWYgKCBmb3JtYXQtPnBhbGV0dGUgPT0gTlVMTCApIHsKLQkgICAgICAgIHJldHVybiAociA+PiBmb3JtYXQtPlJsb3NzKSA8PCBmb3JtYXQtPlJzaGlmdAotCQkgICAgfCAoZyA+PiBmb3JtYXQtPkdsb3NzKSA8PCBmb3JtYXQtPkdzaGlmdAotCQkgICAgfCAoYiA+PiBmb3JtYXQtPkJsb3NzKSA8PCBmb3JtYXQtPkJzaGlmdAotCQkgICAgfCAoKGEgPj4gZm9ybWF0LT5BbG9zcykgPDwgZm9ybWF0LT5Bc2hpZnQgJiBmb3JtYXQtPkFtYXNrKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gU0RMX0ZpbmRDb2xvcihmb3JtYXQtPnBhbGV0dGUsIHIsIGcsIGIpOwotCX0KLX0KLQotdm9pZCBTRExfR2V0UkdCQShVaW50MzIgcGl4ZWwsIFNETF9QaXhlbEZvcm1hdCAqZm10LAotCQkgVWludDggKnIsIFVpbnQ4ICpnLCBVaW50OCAqYiwgVWludDggKmEpCi17Ci0JaWYgKCBmbXQtPnBhbGV0dGUgPT0gTlVMTCApIHsKLQkgICAgICAgIC8qCi0JCSAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSByZXN1bHQgaXMgbWFwcGVkIHRvIHRoZQotCQkgKiBpbnRlcnZhbCBbMC4uMjU1XSwgYW5kIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBlYWNoCi0JCSAqIGNvbXBvbmVudCBpcyAyNTUuIFRoaXMgaXMgaW1wb3J0YW50IHRvIG1ha2Ugc3VyZQotCQkgKiB0aGF0IHdoaXRlIGlzIGluZGVlZCByZXBvcnRlZCBhcyAoMjU1LCAyNTUsIDI1NSksCi0JCSAqIGFuZCB0aGF0IG9wYXF1ZSBhbHBoYSBpcyAyNTUuCi0JCSAqIFRoaXMgb25seSB3b3JrcyBmb3IgUkdCIGJpdCBmaWVsZHMgYXQgbGVhc3QgNCBiaXQKLQkJICogd2lkZSwgd2hpY2ggaXMgYWxtb3N0IGFsd2F5cyB0aGUgY2FzZS4KLQkJICovCi0JICAgICAgICB1bnNpZ25lZCB2OwotCQl2ID0gKHBpeGVsICYgZm10LT5SbWFzaykgPj4gZm10LT5Sc2hpZnQ7Ci0JCSpyID0gKHYgPDwgZm10LT5SbG9zcykgKyAodiA+PiAoOCAtIChmbXQtPlJsb3NzIDw8IDEpKSk7Ci0JCXYgPSAocGl4ZWwgJiBmbXQtPkdtYXNrKSA+PiBmbXQtPkdzaGlmdDsKLQkJKmcgPSAodiA8PCBmbXQtPkdsb3NzKSArICh2ID4+ICg4IC0gKGZtdC0+R2xvc3MgPDwgMSkpKTsKLQkJdiA9IChwaXhlbCAmIGZtdC0+Qm1hc2spID4+IGZtdC0+QnNoaWZ0OwotCQkqYiA9ICh2IDw8IGZtdC0+Qmxvc3MpICsgKHYgPj4gKDggLSAoZm10LT5CbG9zcyA8PCAxKSkpOwotCQlpZihmbXQtPkFtYXNrKSB7Ci0JCSAgICAgICAgdiA9IChwaXhlbCAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0OwotCQkJKmEgPSAodiA8PCBmbXQtPkFsb3NzKSArICh2ID4+ICg4IC0gKGZtdC0+QWxvc3MgPDwgMSkpKTsKLQkJfSBlbHNlIHsKLQkJICAgICAgICAqYSA9IFNETF9BTFBIQV9PUEFRVUU7Ci0gICAgICAgICAgICAgICAgfQotCX0gZWxzZSB7Ci0JCSpyID0gZm10LT5wYWxldHRlLT5jb2xvcnNbcGl4ZWxdLnI7Ci0JCSpnID0gZm10LT5wYWxldHRlLT5jb2xvcnNbcGl4ZWxdLmc7Ci0JCSpiID0gZm10LT5wYWxldHRlLT5jb2xvcnNbcGl4ZWxdLmI7Ci0JCSphID0gU0RMX0FMUEhBX09QQVFVRTsKLQl9Ci19Ci0KLXZvaWQgU0RMX0dldFJHQihVaW50MzIgcGl4ZWwsIFNETF9QaXhlbEZvcm1hdCAqZm10LCBVaW50OCAqcixVaW50OCAqZyxVaW50OCAqYikKLXsKLQlpZiAoIGZtdC0+cGFsZXR0ZSA9PSBOVUxMICkgewotCSAgICAgICAgLyogdGhlIG5vdGUgZm9yIFNETF9HZXRSR0JBIGFib3ZlIGFwcGxpZXMgaGVyZSB0b28gKi8KLQkgICAgICAgIHVuc2lnbmVkIHY7Ci0JCXYgPSAocGl4ZWwgJiBmbXQtPlJtYXNrKSA+PiBmbXQtPlJzaGlmdDsKLQkJKnIgPSAodiA8PCBmbXQtPlJsb3NzKSArICh2ID4+ICg4IC0gKGZtdC0+Umxvc3MgPDwgMSkpKTsKLQkJdiA9IChwaXhlbCAmIGZtdC0+R21hc2spID4+IGZtdC0+R3NoaWZ0OwotCQkqZyA9ICh2IDw8IGZtdC0+R2xvc3MpICsgKHYgPj4gKDggLSAoZm10LT5HbG9zcyA8PCAxKSkpOwotCQl2ID0gKHBpeGVsICYgZm10LT5CbWFzaykgPj4gZm10LT5Cc2hpZnQ7Ci0JCSpiID0gKHYgPDwgZm10LT5CbG9zcykgKyAodiA+PiAoOCAtIChmbXQtPkJsb3NzIDw8IDEpKSk7Ci0JfSBlbHNlIHsKLQkJKnIgPSBmbXQtPnBhbGV0dGUtPmNvbG9yc1twaXhlbF0ucjsKLQkJKmcgPSBmbXQtPnBhbGV0dGUtPmNvbG9yc1twaXhlbF0uZzsKLQkJKmIgPSBmbXQtPnBhbGV0dGUtPmNvbG9yc1twaXhlbF0uYjsKLQl9Ci19Ci0KLS8qIEFwcGx5IGdhbW1hIHRvIGEgc2V0IG9mIGNvbG9ycyAtIHRoaXMgaXMgZWFzeS4gOikgKi8KLXZvaWQgU0RMX0FwcGx5R2FtbWEoVWludDE2ICpnYW1tYSwgU0RMX0NvbG9yICpjb2xvcnMsIFNETF9Db2xvciAqb3V0cHV0LAotCQkJCQkJCWludCBuY29sb3JzKQotewotCWludCBpOwotCi0JZm9yICggaT0wOyBpPG5jb2xvcnM7ICsraSApIHsKLQkJb3V0cHV0W2ldLnIgPSBnYW1tYVswKjI1NiArIGNvbG9yc1tpXS5yXSA+PiA4OwotCQlvdXRwdXRbaV0uZyA9IGdhbW1hWzEqMjU2ICsgY29sb3JzW2ldLmddID4+IDg7Ci0JCW91dHB1dFtpXS5iID0gZ2FtbWFbMioyNTYgKyBjb2xvcnNbaV0uYl0gPj4gODsKLQl9Ci19Ci0KLS8qIE1hcCBmcm9tIFBhbGV0dGUgdG8gUGFsZXR0ZSAqLwotc3RhdGljIFVpbnQ4ICpNYXAxdG8xKFNETF9QYWxldHRlICpzcmMsIFNETF9QYWxldHRlICpkc3QsIGludCAqaWRlbnRpY2FsKQotewotCVVpbnQ4ICptYXA7Ci0JaW50IGk7Ci0KLQlpZiAoIGlkZW50aWNhbCApIHsKLQkJaWYgKCBzcmMtPm5jb2xvcnMgPD0gZHN0LT5uY29sb3JzICkgewotCQkJLyogSWYgYW4gaWRlbnRpY2FsIHBhbGV0dGUsIG5vIG5lZWQgdG8gbWFwICovCi0JCQlpZiAoIFNETF9tZW1jbXAoc3JjLT5jb2xvcnMsIGRzdC0+Y29sb3JzLCBzcmMtPm5jb2xvcnMqCi0JCQkJCQlzaXplb2YoU0RMX0NvbG9yKSkgPT0gMCApIHsKLQkJCQkqaWRlbnRpY2FsID0gMTsKLQkJCQlyZXR1cm4oTlVMTCk7Ci0JCQl9Ci0JCX0KLQkJKmlkZW50aWNhbCA9IDA7Ci0JfQotCW1hcCA9IChVaW50OCAqKVNETF9tYWxsb2Moc3JjLT5uY29sb3JzKTsKLQlpZiAoIG1hcCA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlmb3IgKCBpPTA7IGk8c3JjLT5uY29sb3JzOyArK2kgKSB7Ci0JCW1hcFtpXSA9IFNETF9GaW5kQ29sb3IoZHN0LAotCQkJc3JjLT5jb2xvcnNbaV0uciwgc3JjLT5jb2xvcnNbaV0uZywgc3JjLT5jb2xvcnNbaV0uYik7Ci0JfQotCXJldHVybihtYXApOwotfQotLyogTWFwIGZyb20gUGFsZXR0ZSB0byBCaXRGaWVsZCAqLwotc3RhdGljIFVpbnQ4ICpNYXAxdG9OKFNETF9QaXhlbEZvcm1hdCAqc3JjLCBTRExfUGl4ZWxGb3JtYXQgKmRzdCkKLXsKLQlVaW50OCAqbWFwOwotCWludCBpOwotCWludCAgYnBwOwotCXVuc2lnbmVkIGFscGhhOwotCVNETF9QYWxldHRlICpwYWwgPSBzcmMtPnBhbGV0dGU7Ci0KLQlicHAgPSAoKGRzdC0+Qnl0ZXNQZXJQaXhlbCA9PSAzKSA/IDQgOiBkc3QtPkJ5dGVzUGVyUGl4ZWwpOwotCW1hcCA9IChVaW50OCAqKVNETF9tYWxsb2MocGFsLT5uY29sb3JzKmJwcCk7Ci0JaWYgKCBtYXAgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQlhbHBoYSA9IGRzdC0+QW1hc2sgPyBzcmMtPmFscGhhIDogMDsKLQkvKiBXZSBtZW1vcnkgY29weSB0byB0aGUgcGl4ZWwgbWFwIHNvIHRoZSBlbmRpYW5uZXNzIGlzIHByZXNlcnZlZCAqLwotCWZvciAoIGk9MDsgaTxwYWwtPm5jb2xvcnM7ICsraSApIHsKLQkJQVNTRU1CTEVfUkdCQSgmbWFwW2kqYnBwXSwgZHN0LT5CeXRlc1BlclBpeGVsLCBkc3QsCi0JCQkgICAgICBwYWwtPmNvbG9yc1tpXS5yLCBwYWwtPmNvbG9yc1tpXS5nLAotCQkJICAgICAgcGFsLT5jb2xvcnNbaV0uYiwgYWxwaGEpOwotCX0KLQlyZXR1cm4obWFwKTsKLX0KLS8qIE1hcCBmcm9tIEJpdEZpZWxkIHRvIERpdGhlcmVkLVBhbGV0dGUgdG8gUGFsZXR0ZSAqLwotc3RhdGljIFVpbnQ4ICpNYXBOdG8xKFNETF9QaXhlbEZvcm1hdCAqc3JjLCBTRExfUGl4ZWxGb3JtYXQgKmRzdCwgaW50ICppZGVudGljYWwpCi17Ci0JLyogR2VuZXJhdGUgYSAyNTYgY29sb3IgZGl0aGVyIHBhbGV0dGUgKi8KLQlTRExfUGFsZXR0ZSBkaXRoZXJlZDsKLQlTRExfQ29sb3IgY29sb3JzWzI1Nl07Ci0JU0RMX1BhbGV0dGUgKnBhbCA9IGRzdC0+cGFsZXR0ZTsKLQkKLQkvKiBTRExfRGl0aGVyQ29sb3JzIGRvZXMgbm90IGluaXRpYWxpemUgdGhlICd1bnVzZWQnIGNvbXBvbmVudCBvZiBjb2xvcnMsCi0JICAgYnV0IE1hcDF0bzEgY29tcGFyZXMgaXQgYWdhaW5zdCBwYWwsIHNvIHdlIHNob3VsZCBpbml0aWFsaXplIGl0LiAqLyAgCi0JU0RMX21lbXNldChjb2xvcnMsIDAsIHNpemVvZihjb2xvcnMpKTsKLQotCWRpdGhlcmVkLm5jb2xvcnMgPSAyNTY7Ci0JU0RMX0RpdGhlckNvbG9ycyhjb2xvcnMsIDgpOwotCWRpdGhlcmVkLmNvbG9ycyA9IGNvbG9yczsKLQlyZXR1cm4oTWFwMXRvMSgmZGl0aGVyZWQsIHBhbCwgaWRlbnRpY2FsKSk7Ci19Ci0KLVNETF9CbGl0TWFwICpTRExfQWxsb2NCbGl0TWFwKHZvaWQpCi17Ci0JU0RMX0JsaXRNYXAgKm1hcDsKLQotCS8qIEFsbG9jYXRlIHRoZSBlbXB0eSBtYXAgKi8KLQltYXAgPSAoU0RMX0JsaXRNYXAgKilTRExfbWFsbG9jKHNpemVvZigqbWFwKSk7Ci0JaWYgKCBtYXAgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JU0RMX21lbXNldChtYXAsIDAsIHNpemVvZigqbWFwKSk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgc29mdHdhcmUgYmxpdCBkYXRhICovCi0JbWFwLT5zd19kYXRhID0gKHN0cnVjdCBwcml2YXRlX3N3YWNjZWwgKilTRExfbWFsbG9jKHNpemVvZigqbWFwLT5zd19kYXRhKSk7Ci0JaWYgKCBtYXAtPnN3X2RhdGEgPT0gTlVMTCApIHsKLQkJU0RMX0ZyZWVCbGl0TWFwKG1hcCk7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCVNETF9tZW1zZXQobWFwLT5zd19kYXRhLCAwLCBzaXplb2YoKm1hcC0+c3dfZGF0YSkpOwotCi0JLyogSXQncyByZWFkeSB0byBnbyAqLwotCXJldHVybihtYXApOwotfQotdm9pZCBTRExfSW52YWxpZGF0ZU1hcChTRExfQmxpdE1hcCAqbWFwKQotewotCWlmICggISBtYXAgKSB7Ci0JCXJldHVybjsKLQl9Ci0JbWFwLT5kc3QgPSBOVUxMOwotCW1hcC0+Zm9ybWF0X3ZlcnNpb24gPSAodW5zaWduZWQgaW50KS0xOwotCWlmICggbWFwLT50YWJsZSApIHsKLQkJU0RMX2ZyZWUobWFwLT50YWJsZSk7Ci0JCW1hcC0+dGFibGUgPSBOVUxMOwotCX0KLX0KLWludCBTRExfTWFwU3VyZmFjZSAoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1N1cmZhY2UgKmRzdCkKLXsKLQlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdDsKLQlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdDsKLQlTRExfQmxpdE1hcCAqbWFwOwotCi0JLyogQ2xlYXIgb3V0IGFueSBwcmV2aW91cyBtYXBwaW5nICovCi0JbWFwID0gc3JjLT5tYXA7Ci0JaWYgKCAoc3JjLT5mbGFncyAmIFNETF9STEVBQ0NFTCkgPT0gU0RMX1JMRUFDQ0VMICkgewotCQlTRExfVW5STEVTdXJmYWNlKHNyYywgMSk7Ci0JfQotCVNETF9JbnZhbGlkYXRlTWFwKG1hcCk7Ci0KLQkvKiBGaWd1cmUgb3V0IHdoYXQga2luZCBvZiBtYXBwaW5nIHdlJ3JlIGRvaW5nICovCi0JbWFwLT5pZGVudGl0eSA9IDA7Ci0Jc3JjZm10ID0gc3JjLT5mb3JtYXQ7Ci0JZHN0Zm10ID0gZHN0LT5mb3JtYXQ7Ci0Jc3dpdGNoIChzcmNmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsKLQkgICAgY2FzZSAxOgotCQlzd2l0Y2ggKGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbCkgewotCQkgICAgY2FzZSAxOgotCQkJLyogUGFsZXR0ZSAtLT4gUGFsZXR0ZSAqLwotCQkJLyogSWYgYm90aCBTRExfSFdTVVJGQUNFLCBhc3N1bWUgaGF2ZSBzYW1lIHBhbGV0dGUgKi8KLQkJCWlmICggKChzcmMtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX0hXU1VSRkFDRSkgJiYKLQkJCSAgICAgKChkc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX0hXU1VSRkFDRSkgKSB7Ci0JCQkJbWFwLT5pZGVudGl0eSA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCW1hcC0+dGFibGUgPSBNYXAxdG8xKHNyY2ZtdC0+cGFsZXR0ZSwKLQkJCQkJZHN0Zm10LT5wYWxldHRlLCAmbWFwLT5pZGVudGl0eSk7Ci0JCQl9Ci0JCQlpZiAoICEgbWFwLT5pZGVudGl0eSApIHsKLQkJCQlpZiAoIG1hcC0+dGFibGUgPT0gTlVMTCApIHsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc3JjZm10LT5CaXRzUGVyUGl4ZWwhPWRzdGZtdC0+Qml0c1BlclBpeGVsKQotCQkJCW1hcC0+aWRlbnRpdHkgPSAwOwotCQkJYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCQkvKiBQYWxldHRlIC0tPiBCaXRGaWVsZCAqLwotCQkJbWFwLT50YWJsZSA9IE1hcDF0b04oc3JjZm10LCBkc3RmbXQpOwotCQkJaWYgKCBtYXAtPnRhYmxlID09IE5VTEwgKSB7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXN3aXRjaCAoZHN0Zm10LT5CeXRlc1BlclBpeGVsKSB7Ci0JCSAgICBjYXNlIDE6Ci0JCQkvKiBCaXRGaWVsZCAtLT4gUGFsZXR0ZSAqLwotCQkJbWFwLT50YWJsZSA9IE1hcE50bzEoc3JjZm10LCBkc3RmbXQsICZtYXAtPmlkZW50aXR5KTsKLQkJCWlmICggISBtYXAtPmlkZW50aXR5ICkgewotCQkJCWlmICggbWFwLT50YWJsZSA9PSBOVUxMICkgewotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCX0KLQkJCW1hcC0+aWRlbnRpdHkgPSAwOwkvKiBEb24ndCBvcHRpbWl6ZSB0byBjb3B5ICovCi0JCQlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCQkvKiBCaXRGaWVsZCAtLT4gQml0RmllbGQgKi8KLQkJCWlmICggRk9STUFUX0VRVUFMKHNyY2ZtdCwgZHN0Zm10KSApCi0JCQkJbWFwLT5pZGVudGl0eSA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQltYXAtPmRzdCA9IGRzdDsKLQltYXAtPmZvcm1hdF92ZXJzaW9uID0gZHN0LT5mb3JtYXRfdmVyc2lvbjsKLQotCS8qIENob29zZSB5b3VyIGJsaXR0ZXJzIHdpc2VseSAqLwotCXJldHVybihTRExfQ2FsY3VsYXRlQmxpdChzcmMpKTsKLX0KLXZvaWQgU0RMX0ZyZWVCbGl0TWFwKFNETF9CbGl0TWFwICptYXApCi17Ci0JaWYgKCBtYXAgKSB7Ci0JCVNETF9JbnZhbGlkYXRlTWFwKG1hcCk7Ci0JCWlmICggbWFwLT5zd19kYXRhICE9IE5VTEwgKSB7Ci0JCQlTRExfZnJlZShtYXAtPnN3X2RhdGEpOwotCQl9Ci0JCVNETF9mcmVlKG1hcCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfcGl4ZWxzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3BpeGVsc19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjU2YjEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfcGl4ZWxzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBVc2VmdWwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZnJvbSBTRExfcGl4ZWwuYyAqLwotCi0jaW5jbHVkZSAiU0RMX2JsaXQuaCIKLQotLyogUGl4ZWwgZm9ybWF0IGZ1bmN0aW9ucyAqLwotZXh0ZXJuIFNETF9QaXhlbEZvcm1hdCAqU0RMX0FsbG9jRm9ybWF0KGludCBicHAsCi0JCVVpbnQzMiBSbWFzaywgVWludDMyIEdtYXNrLCBVaW50MzIgQm1hc2ssIFVpbnQzMiBBbWFzayk7Ci1leHRlcm4gU0RMX1BpeGVsRm9ybWF0ICpTRExfUmVhbGxvY0Zvcm1hdChTRExfU3VyZmFjZSAqc3VyZmFjZSwgaW50IGJwcCwKLQkJVWludDMyIFJtYXNrLCBVaW50MzIgR21hc2ssIFVpbnQzMiBCbWFzaywgVWludDMyIEFtYXNrKTsKLWV4dGVybiB2b2lkIFNETF9Gb3JtYXRDaGFuZ2VkKFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLWV4dGVybiB2b2lkIFNETF9GcmVlRm9ybWF0KFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0KTsKLQotLyogQmxpdCBtYXBwaW5nIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIFNETF9CbGl0TWFwICpTRExfQWxsb2NCbGl0TWFwKHZvaWQpOwotZXh0ZXJuIHZvaWQgU0RMX0ludmFsaWRhdGVNYXAoU0RMX0JsaXRNYXAgKm1hcCk7Ci1leHRlcm4gaW50IFNETF9NYXBTdXJmYWNlIChTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KTsKLWV4dGVybiB2b2lkIFNETF9GcmVlQmxpdE1hcChTRExfQmxpdE1hcCAqbWFwKTsKLQotLyogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgKi8KLWV4dGVybiBVaW50MTYgU0RMX0NhbGN1bGF0ZVBpdGNoKFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLWV4dGVybiB2b2lkIFNETF9EaXRoZXJDb2xvcnMoU0RMX0NvbG9yICpjb2xvcnMsIGludCBicHApOwotZXh0ZXJuIFVpbnQ4IFNETF9GaW5kQ29sb3IoU0RMX1BhbGV0dGUgKnBhbCwgVWludDggciwgVWludDggZywgVWludDggYik7Ci1leHRlcm4gdm9pZCBTRExfQXBwbHlHYW1tYShVaW50MTYgKmdhbW1hLCBTRExfQ29sb3IgKmNvbG9ycywgU0RMX0NvbG9yICpvdXRwdXQsIGludCBuY29sb3JzKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3N0cmV0Y2guYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3N0cmV0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUwOGMxMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9zdHJldGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoaXMgYSBzdHJldGNoIGJsaXQgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gaWRlYXMgZ2l2ZW4gdG8gbWUgYnkKLSAgIFRvbWFzeiBDZWpuZXIgLSB0aGFua3MhIDopCi0KLSAgIEFwcmlsIDI3LCAyMDAwIC0gU2FtIExhbnRpbmdhCi0qLwotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2JsaXQuaCIKLQotLyogVGhpcyBpc24ndCByZWFkeSBmb3IgZ2VuZXJhbCBjb25zdW1wdGlvbiB5ZXQgLSBpdCBzaG91bGQgYmUgZm9sZGVkCi0gICBpbnRvIHRoZSBnZW5lcmFsIGJsaXR0aW5nIG1lY2hhbmlzbS4KLSovCi0KLSNpZiAoKGRlZmluZWQoX01GQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikvKiAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKSBzdGlsbCBuZWVkZWQ/ICovKSB8fCBcCi0gICAgIGRlZmluZWQoX19XQVRDT01DX18pIHx8IFwKLSAgICAgKGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pKSkgJiYgU0RMX0FTU0VNQkxZX1JPVVRJTkVTCi0jZGVmaW5lIFVTRV9BU01fU1RSRVRDSAotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQVNNX1NUUkVUQ0gKLQotI2lmIGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChpMzg2KQotI2RlZmluZSBQUkVGSVgxNgkweDY2Ci0jZGVmaW5lIFNUT1JFX0JZVEUJMHhBQQotI2RlZmluZSBTVE9SRV9XT1JECTB4QUIKLSNkZWZpbmUgTE9BRF9CWVRFCTB4QUMKLSNkZWZpbmUgTE9BRF9XT1JECTB4QUQKLSNkZWZpbmUgUkVUVVJOCQkweEMzCi0jZWxzZQotI2Vycm9yIE5lZWQgYXNzZW1ibHkgb3Bjb2RlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBjb3B5X3Jvd1s0MDk2XTsKLQotc3RhdGljIGludCBnZW5lcmF0ZV9yb3dieXRlcyhpbnQgc3JjX3csIGludCBkc3RfdywgaW50IGJwcCkKLXsKLQlzdGF0aWMgc3RydWN0IHsKLQkJaW50IGJwcDsKLQkJaW50IHNyY193OwotCQlpbnQgZHN0X3c7Ci0JfSBsYXN0OwotCi0JaW50IGk7Ci0JaW50IHBvcywgaW5jOwotCXVuc2lnbmVkIGNoYXIgKmVpcDsKLQl1bnNpZ25lZCBjaGFyIGxvYWQsIHN0b3JlOwotCi0JLyogU2VlIGlmIHdlIG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgY29weSBidWZmZXIgKi8KLQlpZiAoIChzcmNfdyA9PSBsYXN0LnNyY193KSAmJgotCSAgICAgKGRzdF93ID09IGxhc3QuZHN0X3cpICYmIChicHAgPT0gbGFzdC5icHApICkgewotCQlyZXR1cm4oMCk7Ci0JfQotCWxhc3QuYnBwID0gYnBwOwotCWxhc3Quc3JjX3cgPSBzcmNfdzsKLQlsYXN0LmRzdF93ID0gZHN0X3c7Ci0KLQlzd2l0Y2ggKGJwcCkgewotCSAgICBjYXNlIDE6Ci0JCWxvYWQgPSBMT0FEX0JZVEU7Ci0JCXN0b3JlID0gU1RPUkVfQllURTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgY2FzZSA0OgotCQlsb2FkID0gTE9BRF9XT1JEOwotCQlzdG9yZSA9IFNUT1JFX1dPUkQ7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlTRExfU2V0RXJyb3IoIkFTTSBzdHJldGNoIG9mICVkIGJ5dGVzIGlzbid0IHN1cHBvcnRlZFxuIiwgYnBwKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcG9zID0gMHgxMDAwMDsKLQlpbmMgPSAoc3JjX3cgPDwgMTYpIC8gZHN0X3c7Ci0JZWlwID0gY29weV9yb3c7Ci0JZm9yICggaT0wOyBpPGRzdF93OyArK2kgKSB7Ci0JCXdoaWxlICggcG9zID49IDB4MTAwMDBMICkgewotCQkJaWYgKCBicHAgPT0gMiApIHsKLQkJCQkqZWlwKysgPSBQUkVGSVgxNjsKLQkJCX0KLQkJCSplaXArKyA9IGxvYWQ7Ci0JCQlwb3MgLT0gMHgxMDAwMEw7Ci0JCX0KLQkJaWYgKCBicHAgPT0gMiApIHsKLQkJCSplaXArKyA9IFBSRUZJWDE2OwotCQl9Ci0JCSplaXArKyA9IHN0b3JlOwotCQlwb3MgKz0gaW5jOwotCX0KLQkqZWlwKysgPSBSRVRVUk47Ci0KLQkvKiBWZXJpZnkgdGhhdCB3ZSBkaWRuJ3Qgb3ZlcmZsb3cgKHRvbyBsYXRlKSAqLwotCWlmICggZWlwID4gKGNvcHlfcm93K3NpemVvZihjb3B5X3JvdykpICkgewotCQlTRExfU2V0RXJyb3IoIkNvcHkgYnVmZmVyIG92ZXJmbG93Iik7Ci0JCXJldHVybigtMSk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotI2Vsc2UKLQotI2RlZmluZSBERUZJTkVfQ09QWV9ST1cobmFtZSwgdHlwZSkJCQlcCi12b2lkIG5hbWUodHlwZSAqc3JjLCBpbnQgc3JjX3csIHR5cGUgKmRzdCwgaW50IGRzdF93KQlcCi17CQkJCQkJCVwKLQlpbnQgaTsJCQkJCQlcCi0JaW50IHBvcywgaW5jOwkJCQkJXAotCXR5cGUgcGl4ZWwgPSAwOwkJCQkJXAotCQkJCQkJCVwKLQlwb3MgPSAweDEwMDAwOwkJCQkJXAotCWluYyA9IChzcmNfdyA8PCAxNikgLyBkc3RfdzsJCQlcCi0JZm9yICggaT1kc3RfdzsgaT4wOyAtLWkgKSB7CQkJXAotCQl3aGlsZSAoIHBvcyA+PSAweDEwMDAwTCApIHsJCVwKLQkJCXBpeGVsID0gKnNyYysrOwkJCVwKLQkJCXBvcyAtPSAweDEwMDAwTDsJCVwKLQkJfQkJCQkJXAotCQkqZHN0KysgPSBwaXhlbDsJCQkJXAotCQlwb3MgKz0gaW5jOwkJCQlcCi0JfQkJCQkJCVwKLX0KLURFRklORV9DT1BZX1JPVyhjb3B5X3JvdzEsIFVpbnQ4KQotREVGSU5FX0NPUFlfUk9XKGNvcHlfcm93MiwgVWludDE2KQotREVGSU5FX0NPUFlfUk9XKGNvcHlfcm93NCwgVWludDMyKQotCi0jZW5kaWYgLyogVVNFX0FTTV9TVFJFVENIICovCi0KLS8qIFRoZSBBU00gY29kZSBkb2Vzbid0IGhhbmRsZSAyNC1icHAgc3RyZXRjaCBibGl0cyAqLwotdm9pZCBjb3B5X3JvdzMoVWludDggKnNyYywgaW50IHNyY193LCBVaW50OCAqZHN0LCBpbnQgZHN0X3cpCi17Ci0JaW50IGk7Ci0JaW50IHBvcywgaW5jOwotCVVpbnQ4IHBpeGVsWzNdID0geyAwLCAwLCAwIH07Ci0KLQlwb3MgPSAweDEwMDAwOwotCWluYyA9IChzcmNfdyA8PCAxNikgLyBkc3RfdzsKLQlmb3IgKCBpPWRzdF93OyBpPjA7IC0taSApIHsKLQkJd2hpbGUgKCBwb3MgPj0gMHgxMDAwMEwgKSB7Ci0JCQlwaXhlbFswXSA9ICpzcmMrKzsKLQkJCXBpeGVsWzFdID0gKnNyYysrOwotCQkJcGl4ZWxbMl0gPSAqc3JjKys7Ci0JCQlwb3MgLT0gMHgxMDAwMEw7Ci0JCX0KLQkJKmRzdCsrID0gcGl4ZWxbMF07Ci0JCSpkc3QrKyA9IHBpeGVsWzFdOwotCQkqZHN0KysgPSBwaXhlbFsyXTsKLQkJcG9zICs9IGluYzsKLQl9Ci19Ci0KLS8qIFBlcmZvcm0gYSBzdHJldGNoIGJsaXQgYmV0d2VlbiB0d28gc3VyZmFjZXMgb2YgdGhlIHNhbWUgZm9ybWF0LgotICAgTk9URTogIFRoaXMgZnVuY3Rpb24gaXMgbm90IHNhZmUgdG8gY2FsbCBmcm9tIG11bHRpcGxlIHRocmVhZHMhCi0qLwotaW50IFNETF9Tb2Z0U3RyZXRjaChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCi17Ci0JaW50IHNyY19sb2NrZWQ7Ci0JaW50IGRzdF9sb2NrZWQ7Ci0JaW50IHBvcywgaW5jOwotCWludCBkc3Rfd2lkdGg7Ci0JaW50IGRzdF9tYXhyb3c7Ci0JaW50IHNyY19yb3csIGRzdF9yb3c7Ci0JVWludDggKnNyY3AgPSBOVUxMOwotCVVpbnQ4ICpkc3RwOwotCVNETF9SZWN0IGZ1bGxfc3JjOwotCVNETF9SZWN0IGZ1bGxfZHN0OwotI2lmIGRlZmluZWQoVVNFX0FTTV9TVFJFVENIKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotCWludCB1MSwgdTI7Ci0jZW5kaWYKLQljb25zdCBpbnQgYnBwID0gZHN0LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7Ci0KLQlpZiAoIHNyYy0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gZHN0LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCApIHsKLQkJU0RMX1NldEVycm9yKCJPbmx5IHdvcmtzIHdpdGggc2FtZSBmb3JtYXQgc3VyZmFjZXMiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBWZXJpZnkgdGhlIGJsaXQgcmVjdGFuZ2xlcyAqLwotCWlmICggc3JjcmVjdCApIHsKLQkJaWYgKCAoc3JjcmVjdC0+eCA8IDApIHx8IChzcmNyZWN0LT55IDwgMCkgfHwKLQkJICAgICAoKHNyY3JlY3QtPngrc3JjcmVjdC0+dykgPiBzcmMtPncpIHx8Ci0JCSAgICAgKChzcmNyZWN0LT55K3NyY3JlY3QtPmgpID4gc3JjLT5oKSApIHsKLQkJCVNETF9TZXRFcnJvcigiSW52YWxpZCBzb3VyY2UgYmxpdCByZWN0YW5nbGUiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9IGVsc2UgewotCQlmdWxsX3NyYy54ID0gMDsKLQkJZnVsbF9zcmMueSA9IDA7Ci0JCWZ1bGxfc3JjLncgPSBzcmMtPnc7Ci0JCWZ1bGxfc3JjLmggPSBzcmMtPmg7Ci0JCXNyY3JlY3QgPSAmZnVsbF9zcmM7Ci0JfQotCWlmICggZHN0cmVjdCApIHsKLQkJaWYgKCAoZHN0cmVjdC0+eCA8IDApIHx8IChkc3RyZWN0LT55IDwgMCkgfHwKLQkJICAgICAoKGRzdHJlY3QtPngrZHN0cmVjdC0+dykgPiBkc3QtPncpIHx8Ci0JCSAgICAgKChkc3RyZWN0LT55K2RzdHJlY3QtPmgpID4gZHN0LT5oKSApIHsKLQkJCVNETF9TZXRFcnJvcigiSW52YWxpZCBkZXN0aW5hdGlvbiBibGl0IHJlY3RhbmdsZSIpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZ1bGxfZHN0LnggPSAwOwotCQlmdWxsX2RzdC55ID0gMDsKLQkJZnVsbF9kc3QudyA9IGRzdC0+dzsKLQkJZnVsbF9kc3QuaCA9IGRzdC0+aDsKLQkJZHN0cmVjdCA9ICZmdWxsX2RzdDsKLQl9Ci0KLQkvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCdzIGluIGhhcmR3YXJlICovCi0JZHN0X2xvY2tlZCA9IDA7Ci0JaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKLQkJaWYgKCBTRExfTG9ja1N1cmZhY2UoZHN0KSA8IDAgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBsb2NrIGRlc3RpbmF0aW9uIHN1cmZhY2UiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJZHN0X2xvY2tlZCA9IDE7Ci0JfQotCS8qIExvY2sgdGhlIHNvdXJjZSBpZiBpdCdzIGluIGhhcmR3YXJlICovCi0Jc3JjX2xvY2tlZCA9IDA7Ci0JaWYgKCBTRExfTVVTVExPQ0soc3JjKSApIHsKLQkJaWYgKCBTRExfTG9ja1N1cmZhY2Uoc3JjKSA8IDAgKSB7Ci0JCQlpZiAoIGRzdF9sb2NrZWQgKSB7Ci0JCQkJU0RMX1VubG9ja1N1cmZhY2UoZHN0KTsKLQkJCX0KLQkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGxvY2sgc291cmNlIHN1cmZhY2UiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJc3JjX2xvY2tlZCA9IDE7Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBkYXRhLi4uICovCi0JcG9zID0gMHgxMDAwMDsKLQlpbmMgPSAoc3JjcmVjdC0+aCA8PCAxNikgLyBkc3RyZWN0LT5oOwotCXNyY19yb3cgPSBzcmNyZWN0LT55OwotCWRzdF9yb3cgPSBkc3RyZWN0LT55OwotCWRzdF93aWR0aCA9IGRzdHJlY3QtPncqYnBwOwotCi0jaWZkZWYgVVNFX0FTTV9TVFJFVENICi0JLyogV3JpdGUgdGhlIG9wY29kZXMgZm9yIHRoaXMgc3RyZXRjaCAqLwotCWlmICggKGJwcCAhPSAzKSAmJgotCSAgICAgKGdlbmVyYXRlX3Jvd2J5dGVzKHNyY3JlY3QtPncsIGRzdHJlY3QtPncsIGJwcCkgPCAwKSApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0jZW5kaWYKLQotCS8qIFBlcmZvcm0gdGhlIHN0cmV0Y2ggYmxpdCAqLwotCWZvciAoIGRzdF9tYXhyb3cgPSBkc3Rfcm93K2RzdHJlY3QtPmg7IGRzdF9yb3c8ZHN0X21heHJvdzsgKytkc3Rfcm93ICkgewotCQlkc3RwID0gKFVpbnQ4ICopZHN0LT5waXhlbHMgKyAoZHN0X3Jvdypkc3QtPnBpdGNoKQotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZHN0cmVjdC0+eCpicHApOwotCQl3aGlsZSAoIHBvcyA+PSAweDEwMDAwTCApIHsKLQkJCXNyY3AgPSAoVWludDggKilzcmMtPnBpeGVscyArIChzcmNfcm93KnNyYy0+cGl0Y2gpCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc3JjcmVjdC0+eCpicHApOwotCQkJKytzcmNfcm93OwotCQkJcG9zIC09IDB4MTAwMDBMOwotCQl9Ci0jaWZkZWYgVVNFX0FTTV9TVFJFVENICi0JCXN3aXRjaCAoYnBwKSB7Ci0JCSAgICBjYXNlIDM6Ci0JCQljb3B5X3JvdzMoc3JjcCwgc3JjcmVjdC0+dywgZHN0cCwgZHN0cmVjdC0+dyk7Ci0JCQlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0jaWZkZWYgX19HTlVDX18KLQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJCSJjYWxsIColNCIKLQkJCTogIj0mRCIgKHUxKSwgIj0mUyIgKHUyKQotCQkJOiAiMCIgKGRzdHApLCAiMSIgKHNyY3ApLCAiciIgKGNvcHlfcm93KQotCQkJOiAibWVtb3J5IiApOwotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX1dBVENPTUNfXykKLQkJeyB2b2lkICpjb2RlID0gY29weV9yb3c7Ci0JCQlfX2FzbSB7Ci0JCQkJcHVzaCBlZGkKLQkJCQlwdXNoIGVzaQotCQotCQkJCW1vdiBlZGksIGRzdHAKLQkJCQltb3YgZXNpLCBzcmNwCi0JCQkJY2FsbCBkd29yZCBwdHIgY29kZQotCi0JCQkJcG9wIGVzaQotCQkJCXBvcCBlZGkKLQkJCX0KLQkJfQotI2Vsc2UKLSNlcnJvciBOZWVkIGlubGluZSBhc3NlbWJseSBmb3IgdGhpcyBjb21waWxlcgotI2VuZGlmCi0JCQlicmVhazsKLQkJfQotI2Vsc2UKLQkJc3dpdGNoIChicHApIHsKLQkJICAgIGNhc2UgMToKLQkJCWNvcHlfcm93MShzcmNwLCBzcmNyZWN0LT53LCBkc3RwLCBkc3RyZWN0LT53KTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSAyOgotCQkJY29weV9yb3cyKChVaW50MTYgKilzcmNwLCBzcmNyZWN0LT53LAotCQkJICAgICAgICAgIChVaW50MTYgKilkc3RwLCBkc3RyZWN0LT53KTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSAzOgotCQkJY29weV9yb3czKHNyY3AsIHNyY3JlY3QtPncsIGRzdHAsIGRzdHJlY3QtPncpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDQ6Ci0JCQljb3B5X3JvdzQoKFVpbnQzMiAqKXNyY3AsIHNyY3JlY3QtPncsCi0JCQkgICAgICAgICAgKFVpbnQzMiAqKWRzdHAsIGRzdHJlY3QtPncpOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZgotCQlwb3MgKz0gaW5jOwotCX0KLQotCS8qIFdlIG5lZWQgdG8gdW5sb2NrIHRoZSBzdXJmYWNlcyBpZiB0aGV5J3JlIGxvY2tlZCAqLwotCWlmICggZHN0X2xvY2tlZCApIHsKLQkJU0RMX1VubG9ja1N1cmZhY2UoZHN0KTsKLQl9Ci0JaWYgKCBzcmNfbG9ja2VkICkgewotCQlTRExfVW5sb2NrU3VyZmFjZShzcmMpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3N0cmV0Y2hfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfc3RyZXRjaF9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDZiMjYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfc3RyZXRjaF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogUGVyZm9ybSBhIHN0cmV0Y2ggYmxpdCBiZXR3ZWVuIHR3byBzdXJmYWNlcyBvZiB0aGUgc2FtZSBmb3JtYXQuCi0gICBOT1RFOiAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgc2FmZSB0byBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyEKLSovCi1leHRlcm4gaW50IFNETF9Tb2Z0U3RyZXRjaChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KTsKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfc3VyZmFjZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfc3VyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWY4NTY1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3N1cmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDk0MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIlNETF9jdXJzb3JfYy5oIgotI2luY2x1ZGUgIlNETF9ibGl0LmgiCi0jaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKLSNpbmNsdWRlICJTRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICJTRExfbGVha3MuaCIKLQotCi0vKiBQdWJsaWMgcm91dGluZXMgKi8KLS8qCi0gKiBDcmVhdGUgYW4gZW1wdHkgUkdCIHN1cmZhY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIGRlcHRoCi0gKi8KLVNETF9TdXJmYWNlICogU0RMX0NyZWF0ZVJHQlN1cmZhY2UgKFVpbnQzMiBmbGFncywKLQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLAotCQkJVWludDMyIFJtYXNrLCBVaW50MzIgR21hc2ssIFVpbnQzMiBCbWFzaywgVWludDMyIEFtYXNrKQotewotCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwotCVNETF9TdXJmYWNlICpzY3JlZW47Ci0JU0RMX1N1cmZhY2UgKnN1cmZhY2U7Ci0KLQkvKiBNYWtlIHN1cmUgdGhlIHNpemUgcmVxdWVzdGVkIGRvZXNuJ3Qgb3ZlcmZsb3cgb3VyIGRhdGF0eXBlcyAqLwotCS8qIE5leHQgdGltZSBJIHdyaXRlIGEgbGlicmFyeSBsaWtlIFNETCwgSSdsbCB1c2UgaW50IGZvciBzaXplLiA6KSAqLwotCWlmICggd2lkdGggPj0gMTYzODQgfHwgaGVpZ2h0ID49IDY1NTM2ICkgewotCQlTRExfU2V0RXJyb3IoIldpZHRoIG9yIGhlaWdodCBpcyB0b28gbGFyZ2UiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBkZXNpcmUgdGhlIHN1cmZhY2UgaW4gdmlkZW8gbWVtb3J5ICovCi0JaWYgKCB2aWRlbyApIHsKLQkJc2NyZWVuID0gU0RMX1B1YmxpY1N1cmZhY2U7Ci0JfSBlbHNlIHsKLQkJc2NyZWVuID0gTlVMTDsKLQl9Ci0JaWYgKCBzY3JlZW4gJiYgKChzY3JlZW4tPmZsYWdzJlNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UpICkgewotCQlpZiAoIChmbGFncyYoU0RMX1NSQ0NPTE9SS0VZfFNETF9TUkNBTFBIQSkpICE9IDAgKSB7Ci0JCQlmbGFncyB8PSBTRExfSFdTVVJGQUNFOwotCQl9Ci0JCWlmICggKGZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKSB7Ci0JCQlpZiAoICEgY3VycmVudF92aWRlby0+aW5mby5ibGl0X2h3X0NDICkgewotCQkJCWZsYWdzICY9IH5TRExfSFdTVVJGQUNFOwotCQkJfQotCQl9Ci0JCWlmICggKGZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7Ci0JCQlpZiAoICEgY3VycmVudF92aWRlby0+aW5mby5ibGl0X2h3X0EgKSB7Ci0JCQkJZmxhZ3MgJj0gflNETF9IV1NVUkZBQ0U7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlmbGFncyAmPSB+U0RMX0hXU1VSRkFDRTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgc3VyZmFjZSAqLwotCXN1cmZhY2UgPSAoU0RMX1N1cmZhY2UgKilTRExfbWFsbG9jKHNpemVvZigqc3VyZmFjZSkpOwotCWlmICggc3VyZmFjZSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlzdXJmYWNlLT5mbGFncyA9IFNETF9TV1NVUkZBQ0U7Ci0JaWYgKCAoZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgewotCQlpZiAoKEFtYXNrKSAmJiAodmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsKSkKLQkJewotCQkJZGVwdGggPSB2aWRlby0+ZGlzcGxheWZvcm1hdGFscGhhcGl4ZWwtPkJpdHNQZXJQaXhlbDsKLQkJCVJtYXNrID0gdmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsLT5SbWFzazsKLQkJCUdtYXNrID0gdmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsLT5HbWFzazsKLQkJCUJtYXNrID0gdmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsLT5CbWFzazsKLQkJCUFtYXNrID0gdmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsLT5BbWFzazsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWRlcHRoID0gc2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKLQkJCVJtYXNrID0gc2NyZWVuLT5mb3JtYXQtPlJtYXNrOwotCQkJR21hc2sgPSBzY3JlZW4tPmZvcm1hdC0+R21hc2s7Ci0JCQlCbWFzayA9IHNjcmVlbi0+Zm9ybWF0LT5CbWFzazsKLQkJCUFtYXNrID0gc2NyZWVuLT5mb3JtYXQtPkFtYXNrOwotCQl9Ci0JfQotCXN1cmZhY2UtPmZvcm1hdCA9IFNETF9BbGxvY0Zvcm1hdChkZXB0aCwgUm1hc2ssIEdtYXNrLCBCbWFzaywgQW1hc2spOwotCWlmICggc3VyZmFjZS0+Zm9ybWF0ID09IE5VTEwgKSB7Ci0JCVNETF9mcmVlKHN1cmZhY2UpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCWlmICggQW1hc2sgKSB7Ci0JCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9TUkNBTFBIQTsKLQl9Ci0Jc3VyZmFjZS0+dyA9IHdpZHRoOwotCXN1cmZhY2UtPmggPSBoZWlnaHQ7Ci0Jc3VyZmFjZS0+cGl0Y2ggPSBTRExfQ2FsY3VsYXRlUGl0Y2goc3VyZmFjZSk7Ci0Jc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKLQlzdXJmYWNlLT5vZmZzZXQgPSAwOwotCXN1cmZhY2UtPmh3ZGF0YSA9IE5VTEw7Ci0Jc3VyZmFjZS0+bG9ja2VkID0gMDsKLQlzdXJmYWNlLT5tYXAgPSBOVUxMOwotCXN1cmZhY2UtPnVudXNlZDEgPSAwOwotCVNETF9TZXRDbGlwUmVjdChzdXJmYWNlLCBOVUxMKTsKLQlTRExfRm9ybWF0Q2hhbmdlZChzdXJmYWNlKTsKLQotCS8qIEdldCB0aGUgcGl4ZWxzICovCi0JaWYgKCAoKGZsYWdzJlNETF9IV1NVUkZBQ0UpID09IFNETF9TV1NVUkZBQ0UpIHx8IAotCQkJCSh2aWRlby0+QWxsb2NIV1N1cmZhY2UodGhpcywgc3VyZmFjZSkgPCAwKSApIHsKLQkJaWYgKCBzdXJmYWNlLT53ICYmIHN1cmZhY2UtPmggKSB7Ci0JCQlzdXJmYWNlLT5waXhlbHMgPSBTRExfbWFsbG9jKHN1cmZhY2UtPmgqc3VyZmFjZS0+cGl0Y2gpOwotCQkJaWYgKCBzdXJmYWNlLT5waXhlbHMgPT0gTlVMTCApIHsKLQkJCQlTRExfRnJlZVN1cmZhY2Uoc3VyZmFjZSk7Ci0JCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQkJcmV0dXJuKE5VTEwpOwotCQkJfQotCQkJLyogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGJpdG1hcHMgKi8KLQkJCVNETF9tZW1zZXQoc3VyZmFjZS0+cGl4ZWxzLCAwLCBzdXJmYWNlLT5oKnN1cmZhY2UtPnBpdGNoKTsKLQkJfQotCX0KLQotCS8qIEFsbG9jYXRlIGFuIGVtcHR5IG1hcHBpbmcgKi8KLQlzdXJmYWNlLT5tYXAgPSBTRExfQWxsb2NCbGl0TWFwKCk7Ci0JaWYgKCBzdXJmYWNlLT5tYXAgPT0gTlVMTCApIHsKLQkJU0RMX0ZyZWVTdXJmYWNlKHN1cmZhY2UpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogVGhlIHN1cmZhY2UgaXMgcmVhZHkgdG8gZ28gKi8KLQlzdXJmYWNlLT5yZWZjb3VudCA9IDE7Ci0jaWZkZWYgQ0hFQ0tfTEVBS1MKLQkrK3N1cmZhY2VzX2FsbG9jYXRlZDsKLSNlbmRpZgotCXJldHVybihzdXJmYWNlKTsKLX0KLS8qCi0gKiBDcmVhdGUgYW4gUkdCIHN1cmZhY2UgZnJvbSBhbiBleGlzdGluZyBtZW1vcnkgYnVmZmVyCi0gKi8KLVNETF9TdXJmYWNlICogU0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tICh2b2lkICpwaXhlbHMsCi0JCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHBpdGNoLAotCQkJVWludDMyIFJtYXNrLCBVaW50MzIgR21hc2ssIFVpbnQzMiBCbWFzaywgVWludDMyIEFtYXNrKQotewotCVNETF9TdXJmYWNlICpzdXJmYWNlOwotCi0Jc3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsIDAsIDAsIGRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSbWFzaywgR21hc2ssIEJtYXNrLCBBbWFzayk7Ci0JaWYgKCBzdXJmYWNlICE9IE5VTEwgKSB7Ci0JCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9QUkVBTExPQzsKLQkJc3VyZmFjZS0+cGl4ZWxzID0gcGl4ZWxzOwotCQlzdXJmYWNlLT53ID0gd2lkdGg7Ci0JCXN1cmZhY2UtPmggPSBoZWlnaHQ7Ci0JCXN1cmZhY2UtPnBpdGNoID0gcGl0Y2g7Ci0JCVNETF9TZXRDbGlwUmVjdChzdXJmYWNlLCBOVUxMKTsKLQl9Ci0JcmV0dXJuKHN1cmZhY2UpOwotfQotLyoKLSAqIFNldCB0aGUgY29sb3Iga2V5IGluIGEgYmxpdHRhYmxlIHN1cmZhY2UKLSAqLwotaW50IFNETF9TZXRDb2xvcktleSAoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBmbGFnLCBVaW50MzIga2V5KQotewotCS8qIFNhbml0eSBjaGVjayB0aGUgZmxhZyBhcyBpdCBnZXRzIHBhc3NlZCBpbiAqLwotCWlmICggZmxhZyAmIFNETF9TUkNDT0xPUktFWSApIHsKLQkJaWYgKCBmbGFnICYgKFNETF9STEVBQ0NFTHxTRExfUkxFQUNDRUxPSykgKSB7Ci0JCQlmbGFnID0gKFNETF9TUkNDT0xPUktFWSB8IFNETF9STEVBQ0NFTE9LKTsKLQkJfSBlbHNlIHsKLQkJCWZsYWcgPSBTRExfU1JDQ09MT1JLRVk7Ci0JCX0KLQl9IGVsc2UgewotCQlmbGFnID0gMDsKLQl9Ci0KLQkvKiBPcHRpbWl6ZSBhd2F5IG9wZXJhdGlvbnMgdGhhdCBkb24ndCBjaGFuZ2UgYW55dGhpbmcgKi8KLQlpZiAoIChmbGFnID09IChzdXJmYWNlLT5mbGFncyAmIChTRExfU1JDQ09MT1JLRVl8U0RMX1JMRUFDQ0VMT0spKSkgJiYKLQkgICAgIChrZXkgPT0gc3VyZmFjZS0+Zm9ybWF0LT5jb2xvcmtleSkgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBVblJMRSBzdXJmYWNlcyBiZWZvcmUgd2UgY2hhbmdlIHRoZSBjb2xvcmtleSAqLwotCWlmICggc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwgKSB7Ci0JICAgICAgICBTRExfVW5STEVTdXJmYWNlKHN1cmZhY2UsIDEpOwotCX0KLQotCWlmICggZmxhZyApIHsKLQkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwotCi0KLQkJc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1NSQ0NPTE9SS0VZOwotCQlzdXJmYWNlLT5mb3JtYXQtPmNvbG9ya2V5ID0ga2V5OwotCQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV0FDQ0VMKSA9PSBTRExfSFdBQ0NFTCApIHsKLQkJCWlmICggKHZpZGVvLT5TZXRIV0NvbG9yS2V5ID09IE5VTEwpIHx8Ci0JCQkgICAgICh2aWRlby0+U2V0SFdDb2xvcktleSh0aGlzLCBzdXJmYWNlLCBrZXkpIDwgMCkgKSB7Ci0JCQkJc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOwotCQkJfQotCQl9Ci0JCWlmICggZmxhZyAmIFNETF9STEVBQ0NFTE9LICkgewotCQkJc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMT0s7Ci0JCX0gZWxzZSB7Ci0JCQlzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1JMRUFDQ0VMT0s7Ci0JCX0KLQl9IGVsc2UgewotCQlzdXJmYWNlLT5mbGFncyAmPSB+KFNETF9TUkNDT0xPUktFWXxTRExfUkxFQUNDRUxPSyk7Ci0JCXN1cmZhY2UtPmZvcm1hdC0+Y29sb3JrZXkgPSAwOwotCX0KLQlTRExfSW52YWxpZGF0ZU1hcChzdXJmYWNlLT5tYXApOwotCXJldHVybigwKTsKLX0KLS8qIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYWxwaGEgY2hhbm5lbCBvZiBhIHN1cmZhY2UgKi8KLWludCBTRExfU2V0QWxwaGEgKFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIgZmxhZywgVWludDggdmFsdWUpCi17Ci0JVWludDMyIG9sZGZsYWdzID0gc3VyZmFjZS0+ZmxhZ3M7Ci0JVWludDMyIG9sZGFscGhhID0gc3VyZmFjZS0+Zm9ybWF0LT5hbHBoYTsKLQotCS8qIFNhbml0eSBjaGVjayB0aGUgZmxhZyBhcyBpdCBnZXRzIHBhc3NlZCBpbiAqLwotCWlmICggZmxhZyAmIFNETF9TUkNBTFBIQSApIHsKLQkJaWYgKCBmbGFnICYgKFNETF9STEVBQ0NFTHxTRExfUkxFQUNDRUxPSykgKSB7Ci0JCQlmbGFnID0gKFNETF9TUkNBTFBIQSB8IFNETF9STEVBQ0NFTE9LKTsKLQkJfSBlbHNlIHsKLQkJCWZsYWcgPSBTRExfU1JDQUxQSEE7Ci0JCX0KLQl9IGVsc2UgewotCQlmbGFnID0gMDsKLQl9Ci0KLQkvKiBPcHRpbWl6ZSBhd2F5IG9wZXJhdGlvbnMgdGhhdCBkb24ndCBjaGFuZ2UgYW55dGhpbmcgKi8KLQlpZiAoIChmbGFnID09IChzdXJmYWNlLT5mbGFncyAmIChTRExfU1JDQUxQSEF8U0RMX1JMRUFDQ0VMT0spKSkgJiYKLQkgICAgICghZmxhZyB8fCB2YWx1ZSA9PSBvbGRhbHBoYSkgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQlpZighKGZsYWcgJiBTRExfUkxFQUNDRUxPSykgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSkKLQkJU0RMX1VuUkxFU3VyZmFjZShzdXJmYWNlLCAxKTsKLQotCWlmICggZmxhZyApIHsKLQkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwotCi0JCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9TUkNBTFBIQTsKLQkJc3VyZmFjZS0+Zm9ybWF0LT5hbHBoYSA9IHZhbHVlOwotCQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV0FDQ0VMKSA9PSBTRExfSFdBQ0NFTCApIHsKLQkJCWlmICggKHZpZGVvLT5TZXRIV0FscGhhID09IE5VTEwpIHx8Ci0JCQkgICAgICh2aWRlby0+U2V0SFdBbHBoYSh0aGlzLCBzdXJmYWNlLCB2YWx1ZSkgPCAwKSApIHsKLQkJCQlzdXJmYWNlLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7Ci0JCQl9Ci0JCX0KLQkJaWYgKCBmbGFnICYgU0RMX1JMRUFDQ0VMT0sgKSB7Ci0JCSAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMT0s7Ci0JCX0gZWxzZSB7Ci0JCSAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9STEVBQ0NFTE9LOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9TUkNBTFBIQTsKLQkJc3VyZmFjZS0+Zm9ybWF0LT5hbHBoYSA9IFNETF9BTFBIQV9PUEFRVUU7Ci0JfQotCS8qCi0JICogVGhlIHJlcHJlc2VudGF0aW9uIGZvciBzb2Z0d2FyZSBzdXJmYWNlcyBpcyBpbmRlcGVuZGVudCBvZgotCSAqIHBlci1zdXJmYWNlIGFscGhhLCBzbyBubyBuZWVkIHRvIGludmFsaWRhdGUgdGhlIGJsaXQgbWFwcGluZwotCSAqIGlmIGp1c3QgdGhlIGFscGhhIHZhbHVlIHdhcyBjaGFuZ2VkLiAoSWYgZWl0aGVyIGlzIDI1NSwgd2Ugc3RpbGwKLQkgKiBuZWVkIHRvIGludmFsaWRhdGUuKQotCSAqLwotCWlmKChzdXJmYWNlLT5mbGFncyAmIFNETF9IV0FDQ0VMKSA9PSBTRExfSFdBQ0NFTAotCSAgIHx8IG9sZGZsYWdzICE9IHN1cmZhY2UtPmZsYWdzCi0JICAgfHwgKCgob2xkYWxwaGEgKyAxKSBeICh2YWx1ZSArIDEpKSAmIDB4MTAwKSkKLQkJU0RMX0ludmFsaWRhdGVNYXAoc3VyZmFjZS0+bWFwKTsKLQlyZXR1cm4oMCk7Ci19Ci1pbnQgU0RMX1NldEFscGhhQ2hhbm5lbChTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDggdmFsdWUpCi17Ci0JaW50IHJvdywgY29sOwotCWludCBvZmZzZXQ7Ci0JVWludDggKmJ1ZjsKLQotCWlmICggKHN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgIT0gMHhGRjAwMDAwMCkgJiYKLQkgICAgIChzdXJmYWNlLT5mb3JtYXQtPkFtYXNrICE9IDB4MDAwMDAwRkYpICkgewotCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIHN1cmZhY2UgYWxwaGEgbWFzayBmb3JtYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KLQlpZiAoIHN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgPT0gMHhGRjAwMDAwMCApIHsKLQkJCW9mZnNldCA9IDM7Ci0JfSBlbHNlIHsKLQkJCW9mZnNldCA9IDA7Ci0JfQotI2Vsc2UKLQlpZiAoIHN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgPT0gMHhGRjAwMDAwMCApIHsKLQkJCW9mZnNldCA9IDA7Ci0JfSBlbHNlIHsKLQkJCW9mZnNldCA9IDM7Ci0JfQotI2VuZGlmIC8qIEJ5dGUgb3JkZXJpbmcgKi8KLQotCS8qIFF1aWNrbHkgc2V0IHRoZSBhbHBoYSBjaGFubmVsIG9mIGFuIFJHQkEgb3IgQVJHQiBzdXJmYWNlICovCi0JaWYgKCBTRExfTVVTVExPQ0soc3VyZmFjZSkgKSB7Ci0JCWlmICggU0RMX0xvY2tTdXJmYWNlKHN1cmZhY2UpIDwgMCApIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlyb3cgPSBzdXJmYWNlLT5oOwotCXdoaWxlIChyb3ctLSkgewotCQljb2wgPSBzdXJmYWNlLT53OwotCQlidWYgPSAoVWludDggKilzdXJmYWNlLT5waXhlbHMgKyByb3cgKiBzdXJmYWNlLT5waXRjaCArIG9mZnNldDsKLQkJd2hpbGUoY29sLS0pIHsKLQkJCSpidWYgPSB2YWx1ZTsKLQkJCWJ1ZiArPSA0OwotCQl9Ci0JfQotCWlmICggU0RMX01VU1RMT0NLKHN1cmZhY2UpICkgewotCQlTRExfVW5sb2NrU3VyZmFjZShzdXJmYWNlKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBBIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byByZWN0YW5nbGVzOgotICogcmV0dXJuIHRydWUgaWYgdGhlIHJlY3RhbmdsZXMgaW50ZXJzZWN0LCBmYWxzZSBvdGhlcndpc2UKLSAqLwotc3RhdGljIF9faW5saW5lX18KLVNETF9ib29sIFNETF9JbnRlcnNlY3RSZWN0KGNvbnN0IFNETF9SZWN0ICpBLCBjb25zdCBTRExfUmVjdCAqQiwgU0RMX1JlY3QgKmludGVyc2VjdGlvbikKLXsKLQlpbnQgQW1pbiwgQW1heCwgQm1pbiwgQm1heDsKLQotCS8qIEhvcml6b250YWwgaW50ZXJzZWN0aW9uICovCi0JQW1pbiA9IEEtPng7Ci0JQW1heCA9IEFtaW4gKyBBLT53OwotCUJtaW4gPSBCLT54OwotCUJtYXggPSBCbWluICsgQi0+dzsKLQlpZihCbWluID4gQW1pbikKLQkgICAgICAgIEFtaW4gPSBCbWluOwotCWludGVyc2VjdGlvbi0+eCA9IEFtaW47Ci0JaWYoQm1heCA8IEFtYXgpCi0JICAgICAgICBBbWF4ID0gQm1heDsKLQlpbnRlcnNlY3Rpb24tPncgPSBBbWF4IC0gQW1pbiA+IDAgPyBBbWF4IC0gQW1pbiA6IDA7Ci0KLQkvKiBWZXJ0aWNhbCBpbnRlcnNlY3Rpb24gKi8KLQlBbWluID0gQS0+eTsKLQlBbWF4ID0gQW1pbiArIEEtPmg7Ci0JQm1pbiA9IEItPnk7Ci0JQm1heCA9IEJtaW4gKyBCLT5oOwotCWlmKEJtaW4gPiBBbWluKQotCSAgICAgICAgQW1pbiA9IEJtaW47Ci0JaW50ZXJzZWN0aW9uLT55ID0gQW1pbjsKLQlpZihCbWF4IDwgQW1heCkKLQkgICAgICAgIEFtYXggPSBCbWF4OwotCWludGVyc2VjdGlvbi0+aCA9IEFtYXggLSBBbWluID4gMCA/IEFtYXggLSBBbWluIDogMDsKLQotCXJldHVybiAoaW50ZXJzZWN0aW9uLT53ICYmIGludGVyc2VjdGlvbi0+aCk7Ci19Ci0vKgotICogU2V0IHRoZSBjbGlwcGluZyByZWN0YW5nbGUgZm9yIGEgYmxpdHRhYmxlIHN1cmZhY2UKLSAqLwotU0RMX2Jvb2wgU0RMX1NldENsaXBSZWN0KFNETF9TdXJmYWNlICpzdXJmYWNlLCBjb25zdCBTRExfUmVjdCAqcmVjdCkKLXsKLQlTRExfUmVjdCBmdWxsX3JlY3Q7Ci0KLQkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSdzIG5vIHN1cmZhY2UgdG8gYWN0IG9uICovCi0JaWYgKCAhIHN1cmZhY2UgKSB7Ci0JCXJldHVybiBTRExfRkFMU0U7Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBmdWxsIHN1cmZhY2UgcmVjdGFuZ2xlICovCi0JZnVsbF9yZWN0LnggPSAwOwotCWZ1bGxfcmVjdC55ID0gMDsKLQlmdWxsX3JlY3QudyA9IHN1cmZhY2UtPnc7Ci0JZnVsbF9yZWN0LmggPSBzdXJmYWNlLT5oOwotCi0JLyogU2V0IHRoZSBjbGlwcGluZyByZWN0YW5nbGUgKi8KLQlpZiAoICEgcmVjdCApIHsKLQkJc3VyZmFjZS0+Y2xpcF9yZWN0ID0gZnVsbF9yZWN0OwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIFNETF9JbnRlcnNlY3RSZWN0KHJlY3QsICZmdWxsX3JlY3QsICZzdXJmYWNlLT5jbGlwX3JlY3QpOwotfQotdm9pZCBTRExfR2V0Q2xpcFJlY3QoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFNETF9SZWN0ICpyZWN0KQotewotCWlmICggc3VyZmFjZSAmJiByZWN0ICkgewotCQkqcmVjdCA9IHN1cmZhY2UtPmNsaXBfcmVjdDsKLQl9Ci19Ci0vKiAKLSAqIFNldCB1cCBhIGJsaXQgYmV0d2VlbiB0d28gc3VyZmFjZXMgLS0gc3BsaXQgaW50byB0aHJlZSBwYXJ0czoKLSAqIFRoZSB1cHBlciBwYXJ0LCBTRExfVXBwZXJCbGl0KCksIHBlcmZvcm1zIGNsaXBwaW5nIGFuZCByZWN0YW5nbGUgCi0gKiB2ZXJpZmljYXRpb24uICBUaGUgbG93ZXIgcGFydCBpcyBhIHBvaW50ZXIgdG8gYSBsb3cgbGV2ZWwKLSAqIGFjY2VsZXJhdGVkIGJsaXR0aW5nIGZ1bmN0aW9uLgotICoKLSAqIFRoZXNlIHBhcnRzIGFyZSBzZXBhcmF0ZWQgb3V0IGFuZCBlYWNoIHVzZWQgaW50ZXJuYWxseSBieSB0aGlzIAotICogbGlicmFyeSBpbiB0aGUgb3B0aW1pbXVtIHBsYWNlcy4gIFRoZXkgYXJlIGV4cG9ydGVkIHNvIHRoYXQgaWYKLSAqIHlvdSBrbm93IGV4YWN0bHkgd2hhdCB5b3UgYXJlIGRvaW5nLCB5b3UgY2FuIG9wdGltaXplIHlvdXIgY29kZQotICogYnkgY2FsbGluZyB0aGUgb25lKHMpIHlvdSBuZWVkLgotICovCi1pbnQgU0RMX0xvd2VyQmxpdCAoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCi0JCQkJU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCi17Ci0JU0RMX2JsaXQgZG9fYmxpdDsKLQlTRExfUmVjdCBod19zcmNyZWN0OwotCVNETF9SZWN0IGh3X2RzdHJlY3Q7Ci0KLQkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGJsaXQgbWFwcGluZyBpcyB2YWxpZCAqLwotCWlmICggKHNyYy0+bWFwLT5kc3QgIT0gZHN0KSB8fAotICAgICAgICAgICAgIChzcmMtPm1hcC0+ZHN0LT5mb3JtYXRfdmVyc2lvbiAhPSBzcmMtPm1hcC0+Zm9ybWF0X3ZlcnNpb24pICkgewotCQlpZiAoIFNETF9NYXBTdXJmYWNlKHNyYywgZHN0KSA8IDAgKSB7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JfQotCi0JLyogRmlndXJlIG91dCB3aGljaCBibGl0dGVyIHRvIHVzZSAqLwotCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfSFdBQ0NFTCkgPT0gU0RMX0hXQUNDRUwgKSB7Ci0JCWlmICggc3JjID09IFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCQlod19zcmNyZWN0ID0gKnNyY3JlY3Q7Ci0JCQlod19zcmNyZWN0LnggKz0gY3VycmVudF92aWRlby0+b2Zmc2V0X3g7Ci0JCQlod19zcmNyZWN0LnkgKz0gY3VycmVudF92aWRlby0+b2Zmc2V0X3k7Ci0JCQlzcmNyZWN0ID0gJmh3X3NyY3JlY3Q7Ci0JCX0KLQkJaWYgKCBkc3QgPT0gU0RMX1ZpZGVvU3VyZmFjZSApIHsKLQkJCWh3X2RzdHJlY3QgPSAqZHN0cmVjdDsKLQkJCWh3X2RzdHJlY3QueCArPSBjdXJyZW50X3ZpZGVvLT5vZmZzZXRfeDsKLQkJCWh3X2RzdHJlY3QueSArPSBjdXJyZW50X3ZpZGVvLT5vZmZzZXRfeTsKLQkJCWRzdHJlY3QgPSAmaHdfZHN0cmVjdDsKLQkJfQotCQlkb19ibGl0ID0gc3JjLT5tYXAtPmh3X2JsaXQ7Ci0JfSBlbHNlIHsKLQkJZG9fYmxpdCA9IHNyYy0+bWFwLT5zd19ibGl0OwotCX0KLQlyZXR1cm4oZG9fYmxpdChzcmMsIHNyY3JlY3QsIGRzdCwgZHN0cmVjdCkpOwotfQotCi0KLWludCBTRExfVXBwZXJCbGl0IChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLQkJICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCi17Ci0gICAgICAgIFNETF9SZWN0IGZ1bGxkc3Q7Ci0JaW50IHNyY3gsIHNyY3ksIHcsIGg7Ci0KLQkvKiBNYWtlIHN1cmUgdGhlIHN1cmZhY2VzIGFyZW4ndCBsb2NrZWQgKi8KLQlpZiAoICEgc3JjIHx8ICEgZHN0ICkgewotCQlTRExfU2V0RXJyb3IoIlNETF9VcHBlckJsaXQ6IHBhc3NlZCBhIE5VTEwgc3VyZmFjZSIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlpZiAoIHNyYy0+bG9ja2VkIHx8IGRzdC0+bG9ja2VkICkgewotCQlTRExfU2V0RXJyb3IoIlN1cmZhY2VzIG11c3Qgbm90IGJlIGxvY2tlZCBkdXJpbmcgYmxpdCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIElmIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgaXMgTlVMTCwgdXNlIHRoZSBlbnRpcmUgZGVzdCBzdXJmYWNlICovCi0JaWYgKCBkc3RyZWN0ID09IE5VTEwgKSB7Ci0JICAgICAgICBmdWxsZHN0LnggPSBmdWxsZHN0LnkgPSAwOwotCQlkc3RyZWN0ID0gJmZ1bGxkc3Q7Ci0JfQotCi0JLyogY2xpcCB0aGUgc291cmNlIHJlY3RhbmdsZSB0byB0aGUgc291cmNlIHN1cmZhY2UgKi8KLQlpZihzcmNyZWN0KSB7Ci0JICAgICAgICBpbnQgbWF4dywgbWF4aDsKLQkKLQkJc3JjeCA9IHNyY3JlY3QtPng7Ci0JCXcgPSBzcmNyZWN0LT53OwotCQlpZihzcmN4IDwgMCkgewotCQkgICAgICAgIHcgKz0gc3JjeDsKLQkJCWRzdHJlY3QtPnggLT0gc3JjeDsKLQkJCXNyY3ggPSAwOwotCQl9Ci0JCW1heHcgPSBzcmMtPncgLSBzcmN4OwotCQlpZihtYXh3IDwgdykKLQkJCXcgPSBtYXh3OwotCi0JCXNyY3kgPSBzcmNyZWN0LT55OwotCQloID0gc3JjcmVjdC0+aDsKLQkJaWYoc3JjeSA8IDApIHsKLQkJICAgICAgICBoICs9IHNyY3k7Ci0JCQlkc3RyZWN0LT55IC09IHNyY3k7Ci0JCQlzcmN5ID0gMDsKLQkJfQotCQltYXhoID0gc3JjLT5oIC0gc3JjeTsKLQkJaWYobWF4aCA8IGgpCi0JCQloID0gbWF4aDsKLQkgICAgCi0JfSBlbHNlIHsKLQkgICAgICAgIHNyY3ggPSBzcmN5ID0gMDsKLQkJdyA9IHNyYy0+dzsKLQkJaCA9IHNyYy0+aDsKLQl9Ci0KLQkvKiBjbGlwIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgYWdhaW5zdCB0aGUgY2xpcCByZWN0YW5nbGUgKi8KLQl7Ci0JICAgICAgICBTRExfUmVjdCAqY2xpcCA9ICZkc3QtPmNsaXBfcmVjdDsKLQkJaW50IGR4LCBkeTsKLQotCQlkeCA9IGNsaXAtPnggLSBkc3RyZWN0LT54OwotCQlpZihkeCA+IDApIHsKLQkJCXcgLT0gZHg7Ci0JCQlkc3RyZWN0LT54ICs9IGR4OwotCQkJc3JjeCArPSBkeDsKLQkJfQotCQlkeCA9IGRzdHJlY3QtPnggKyB3IC0gY2xpcC0+eCAtIGNsaXAtPnc7Ci0JCWlmKGR4ID4gMCkKLQkJCXcgLT0gZHg7Ci0KLQkJZHkgPSBjbGlwLT55IC0gZHN0cmVjdC0+eTsKLQkJaWYoZHkgPiAwKSB7Ci0JCQloIC09IGR5OwotCQkJZHN0cmVjdC0+eSArPSBkeTsKLQkJCXNyY3kgKz0gZHk7Ci0JCX0KLQkJZHkgPSBkc3RyZWN0LT55ICsgaCAtIGNsaXAtPnkgLSBjbGlwLT5oOwotCQlpZihkeSA+IDApCi0JCQloIC09IGR5OwotCX0KLQotCWlmKHcgPiAwICYmIGggPiAwKSB7Ci0JICAgICAgICBTRExfUmVjdCBzcjsKLQkgICAgICAgIHNyLnggPSBzcmN4OwotCQlzci55ID0gc3JjeTsKLQkJc3IudyA9IGRzdHJlY3QtPncgPSB3OwotCQlzci5oID0gZHN0cmVjdC0+aCA9IGg7Ci0JCXJldHVybiBTRExfTG93ZXJCbGl0KHNyYywgJnNyLCBkc3QsIGRzdHJlY3QpOwotCX0KLQlkc3RyZWN0LT53ID0gZHN0cmVjdC0+aCA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgU0RMX0ZpbGxSZWN0MShTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCwgVWludDMyIGNvbG9yKQotewotCS8qIEZJWE1FOiBXZSBoYXZlIHRvIHdvcnJ5IGFib3V0IHBhY2tpbmcgb3JkZXIuLiAqc2lnaCogKi8KLQlTRExfU2V0RXJyb3IoIjEtYnBwIHJlY3QgZmlsbCBub3QgeWV0IGltcGxlbWVudGVkIik7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IFNETF9GaWxsUmVjdDQoU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QsIFVpbnQzMiBjb2xvcikKLXsKLQkvKiBGSVhNRTogV2UgaGF2ZSB0byB3b3JyeSBhYm91dCBwYWNraW5nIG9yZGVyLi4gKnNpZ2gqICovCi0JU0RMX1NldEVycm9yKCI0LWJwcCByZWN0IGZpbGwgbm90IHlldCBpbXBsZW1lbnRlZCIpOwotCXJldHVybiAtMTsKLX0KLQotLyogCi0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZmFzdCBmaWxsIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUgd2l0aCAnY29sb3InCi0gKi8KLWludCBTRExfRmlsbFJlY3QoU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QsIFVpbnQzMiBjb2xvcikKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQlpbnQgeCwgeTsKLQlVaW50OCAqcm93OwotCi0JLyogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHdvcmsgb24gc3VyZmFjZXMgPCA4IGJwcCAqLwotCWlmICggZHN0LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDggKSB7Ci0JCXN3aXRjaChkc3QtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSB7Ci0JCSAgICBjYXNlIDE6Ci0JCQlyZXR1cm4gU0RMX0ZpbGxSZWN0MShkc3QsIGRzdHJlY3QsIGNvbG9yKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSA0OgotCQkJcmV0dXJuIFNETF9GaWxsUmVjdDQoZHN0LCBkc3RyZWN0LCBjb2xvcik7Ci0JCQlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCQlTRExfU2V0RXJyb3IoIkZpbGwgcmVjdCBvbiB1bnN1cHBvcnRlZCBzdXJmYWNlIGZvcm1hdCIpOwotCQkJcmV0dXJuKC0xKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogSWYgJ2RzdHJlY3QnID09IE5VTEwsIHRoZW4gZmlsbCB0aGUgd2hvbGUgc3VyZmFjZSAqLwotCWlmICggZHN0cmVjdCApIHsKLQkJLyogUGVyZm9ybSBjbGlwcGluZyAqLwotCQlpZiAoICFTRExfSW50ZXJzZWN0UmVjdChkc3RyZWN0LCAmZHN0LT5jbGlwX3JlY3QsIGRzdHJlY3QpICkgewotCQkJcmV0dXJuKDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJZHN0cmVjdCA9ICZkc3QtPmNsaXBfcmVjdDsKLQl9Ci0KLQkvKiBDaGVjayBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uICovCi0JaWYgKCAoKGRzdC0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFKSAmJgotCQkJCQl2aWRlby0+aW5mby5ibGl0X2ZpbGwgKSB7Ci0JCVNETF9SZWN0IGh3X3JlY3Q7Ci0JCWlmICggZHN0ID09IFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCQlod19yZWN0ID0gKmRzdHJlY3Q7Ci0JCQlod19yZWN0LnggKz0gY3VycmVudF92aWRlby0+b2Zmc2V0X3g7Ci0JCQlod19yZWN0LnkgKz0gY3VycmVudF92aWRlby0+b2Zmc2V0X3k7Ci0JCQlkc3RyZWN0ID0gJmh3X3JlY3Q7Ci0JCX0KLQkJcmV0dXJuKHZpZGVvLT5GaWxsSFdSZWN0KHRoaXMsIGRzdCwgZHN0cmVjdCwgY29sb3IpKTsKLQl9Ci0KLQkvKiBQZXJmb3JtIHNvZnR3YXJlIGZpbGwgKi8KLQlpZiAoIFNETF9Mb2NrU3VyZmFjZShkc3QpICE9IDAgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCXJvdyA9IChVaW50OCAqKWRzdC0+cGl4ZWxzK2RzdHJlY3QtPnkqZHN0LT5waXRjaCsKLQkJCWRzdHJlY3QtPngqZHN0LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JaWYgKCBkc3QtPmZvcm1hdC0+cGFsZXR0ZSB8fCAoY29sb3IgPT0gMCkgKSB7Ci0JCXggPSBkc3RyZWN0LT53KmRzdC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCQlpZiAoICFjb2xvciAmJiAhKCh1aW50cHRyX3Qpcm93JjMpICYmICEoeCYzKSAmJiAhKGRzdC0+cGl0Y2gmMykgKSB7Ci0JCQlpbnQgbiA9IHggPj4gMjsKLQkJCWZvciAoIHk9ZHN0cmVjdC0+aDsgeTsgLS15ICkgewotCQkJCVNETF9tZW1zZXQ0KHJvdywgMCwgbik7Ci0JCQkJcm93ICs9IGRzdC0+cGl0Y2g7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0jaWZkZWYgX19wb3dlcnBjX18KLQkJCS8qCi0JCQkgKiBTRExfbWVtc2V0KCkgb24gUFBDIChib3RoIGdsaWJjIGFuZCBjb2Rld2FycmlvcikgdXNlcwotCQkJICogdGhlIGRjYnogKERhdGEgQ2FjaGUgQmxvY2sgWmVybykgaW5zdHJ1Y3Rpb24sIHdoaWNoCi0JCQkgKiBjYXVzZXMgYW4gYWxpZ25tZW50IGV4Y2VwdGlvbiBpZiB0aGUgZGVzdGluYXRpb24gaXMKLQkJCSAqIHVuY2FjaGFibGUsIHNvIG9ubHkgdXNlIGl0IG9uIHNvZnR3YXJlIHN1cmZhY2VzCi0JCQkgKi8KLQkJCWlmKChkc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX0hXU1VSRkFDRSkgewotCQkJCWlmKGRzdHJlY3QtPncgPj0gOCkgewotCQkJCQkvKgotCQkJCQkgKiA2NC1iaXQgc3RvcmVzIGFyZSBwcm9iYWJseSBtb3N0Ci0JCQkJCSAqIGVmZmljaWVudCB0byB1bmNhY2hlZCB2aWRlbyBtZW1vcnkKLQkJCQkJICovCi0JCQkJCWRvdWJsZSBmaWxsOwotCQkJCQlTRExfbWVtc2V0KCZmaWxsLCBjb2xvciwgKHNpemVvZiBmaWxsKSk7Ci0JCQkJCWZvcih5ID0gZHN0cmVjdC0+aDsgeTsgeS0tKSB7Ci0JCQkJCQlVaW50OCAqZCA9IHJvdzsKLQkJCQkJCXVuc2lnbmVkIG4gPSB4OwotCQkJCQkJdW5zaWduZWQgbm47Ci0JCQkJCQlVaW50OCBjID0gY29sb3I7Ci0JCQkJCQlkb3VibGUgZiA9IGZpbGw7Ci0JCQkJCQl3aGlsZSgodW5zaWduZWQgbG9uZylkCi0JCQkJCQkgICAgICAmIChzaXplb2YoZG91YmxlKSAtIDEpKSB7Ci0JCQkJCQkJKmQrKyA9IGM7Ci0JCQkJCQkJbi0tOwotCQkJCQkJfQotCQkJCQkJbm4gPSBuIC8gKHNpemVvZihkb3VibGUpICogNCk7Ci0JCQkJCQl3aGlsZShubikgewotCQkJCQkJCSgoZG91YmxlICopZClbMF0gPSBmOwotCQkJCQkJCSgoZG91YmxlICopZClbMV0gPSBmOwotCQkJCQkJCSgoZG91YmxlICopZClbMl0gPSBmOwotCQkJCQkJCSgoZG91YmxlICopZClbM10gPSBmOwotCQkJCQkJCWQgKz0gNCpzaXplb2YoZG91YmxlKTsKLQkJCQkJCQlubi0tOwotCQkJCQkJfQotCQkJCQkJbiAmPSB+KHNpemVvZihkb3VibGUpICogNCAtIDEpOwotCQkJCQkJbm4gPSBuIC8gc2l6ZW9mKGRvdWJsZSk7Ci0JCQkJCQl3aGlsZShubikgewotCQkJCQkJCSooZG91YmxlICopZCA9IGY7Ci0JCQkJCQkJZCArPSBzaXplb2YoZG91YmxlKTsKLQkJCQkJCQlubi0tOwotCQkJCQkJfQotCQkJCQkJbiAmPSB+KHNpemVvZihkb3VibGUpIC0gMSk7Ci0JCQkJCQl3aGlsZShuKSB7Ci0JCQkJCQkJKmQrKyA9IGM7Ci0JCQkJCQkJbi0tOwotCQkJCQkJfQotCQkJCQkJcm93ICs9IGRzdC0+cGl0Y2g7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvKiBuYXJyb3cgYm94ZXMgKi8KLQkJCQkJZm9yKHkgPSBkc3RyZWN0LT5oOyB5OyB5LS0pIHsKLQkJCQkJCVVpbnQ4ICpkID0gcm93OwotCQkJCQkJVWludDggYyA9IGNvbG9yOwotCQkJCQkJaW50IG4gPSB4OwotCQkJCQkJd2hpbGUobikgewotCQkJCQkJCSpkKysgPSBjOwotCQkJCQkJCW4tLTsKLQkJCQkJCX0KLQkJCQkJCXJvdyArPSBkc3QtPnBpdGNoOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlCi0jZW5kaWYgLyogX19wb3dlcnBjX18gKi8KLQkJCXsKLQkJCQlmb3IoeSA9IGRzdHJlY3QtPmg7IHk7IHktLSkgewotCQkJCQlTRExfbWVtc2V0KHJvdywgY29sb3IsIHgpOwotCQkJCQlyb3cgKz0gZHN0LT5waXRjaDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKGRzdC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7Ci0JCSAgICBjYXNlIDI6Ci0JCQlmb3IgKCB5PWRzdHJlY3QtPmg7IHk7IC0teSApIHsKLQkJCQlVaW50MTYgKnBpeGVscyA9IChVaW50MTYgKilyb3c7Ci0JCQkJVWludDE2IGMgPSAoVWludDE2KWNvbG9yOwotCQkJCVVpbnQzMiBjYyA9IChVaW50MzIpYyA8PCAxNiB8IGM7Ci0JCQkJaW50IG4gPSBkc3RyZWN0LT53OwotCQkJCWlmKCh1aW50cHRyX3QpcGl4ZWxzICYgMykgewotCQkJCQkqcGl4ZWxzKysgPSBjOwotCQkJCQluLS07Ci0JCQkJfQotCQkJCWlmKG4gPj4gMSkKLQkJCQkJU0RMX21lbXNldDQocGl4ZWxzLCBjYywgbiA+PiAxKTsKLQkJCQlpZihuICYgMSkKLQkJCQkJcGl4ZWxzW24gLSAxXSA9IGM7Ci0JCQkJcm93ICs9IGRzdC0+cGl0Y2g7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQkgICAgY2FzZSAzOgotCQkJI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KLQkJCQljb2xvciA8PD0gODsKLQkJCSNlbmRpZgotCQkJZm9yICggeT1kc3RyZWN0LT5oOyB5OyAtLXkgKSB7Ci0JCQkJVWludDggKnBpeGVscyA9IHJvdzsKLQkJCQlmb3IgKCB4PWRzdHJlY3QtPnc7IHg7IC0teCApIHsKLQkJCQkJU0RMX21lbWNweShwaXhlbHMsICZjb2xvciwgMyk7Ci0JCQkJCXBpeGVscyArPSAzOwotCQkJCX0KLQkJCQlyb3cgKz0gZHN0LT5waXRjaDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCSAgICBjYXNlIDQ6Ci0JCQlmb3IoeSA9IGRzdHJlY3QtPmg7IHk7IC0teSkgewotCQkJCVNETF9tZW1zZXQ0KHJvdywgY29sb3IsIGRzdHJlY3QtPncpOwotCQkJCXJvdyArPSBkc3QtPnBpdGNoOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JU0RMX1VubG9ja1N1cmZhY2UoZHN0KTsKLQotCS8qIFdlJ3JlIGRvbmUhICovCi0JcmV0dXJuKDApOwotfQotCi0vKgotICogTG9jayBhIHN1cmZhY2UgdG8gZGlyZWN0bHkgYWNjZXNzIHRoZSBwaXhlbHMKLSAqLwotaW50IFNETF9Mb2NrU3VyZmFjZSAoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYgKCAhIHN1cmZhY2UtPmxvY2tlZCApIHsKLQkJLyogUGVyZm9ybSB0aGUgbG9jayAqLwotCQlpZiAoIHN1cmZhY2UtPmZsYWdzICYgKFNETF9IV1NVUkZBQ0V8U0RMX0FTWU5DQkxJVCkgKSB7Ci0JCQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQkJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwotCQkJaWYgKCB2aWRlby0+TG9ja0hXU3VyZmFjZSh0aGlzLCBzdXJmYWNlKSA8IDAgKSB7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJfQotCQlpZiAoIHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMICkgewotCQkJU0RMX1VuUkxFU3VyZmFjZShzdXJmYWNlLCAxKTsKLQkJCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsJLyogc2F2ZSBhY2NlbCdkIHN0YXRlICovCi0JCX0KLQkJLyogVGhpcyBuZWVkcyB0byBiZSBkb25lIGhlcmUgaW4gY2FzZSBwaXhlbHMgY2hhbmdlcyB2YWx1ZSAqLwotCQlzdXJmYWNlLT5waXhlbHMgPSAoVWludDggKilzdXJmYWNlLT5waXhlbHMgKyBzdXJmYWNlLT5vZmZzZXQ7Ci0JfQotCi0JLyogSW5jcmVtZW50IHRoZSBzdXJmYWNlIGxvY2sgY291bnQsIGZvciByZWN1cnNpdmUgbG9ja3MgKi8KLQkrK3N1cmZhY2UtPmxvY2tlZDsKLQotCS8qIFJlYWR5IHRvIGdvLi4gKi8KLQlyZXR1cm4oMCk7Ci19Ci0vKgotICogVW5sb2NrIGEgcHJldmlvdXNseSBsb2NrZWQgc3VyZmFjZQotICovCi12b2lkIFNETF9VbmxvY2tTdXJmYWNlIChTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQkvKiBPbmx5IHBlcmZvcm0gYW4gdW5sb2NrIGlmIHdlIGFyZSBsb2NrZWQgKi8KLQlpZiAoICEgc3VyZmFjZS0+bG9ja2VkIHx8ICgtLXN1cmZhY2UtPmxvY2tlZCA+IDApICkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogUGVyZm9ybSB0aGUgdW5sb2NrICovCi0Jc3VyZmFjZS0+cGl4ZWxzID0gKFVpbnQ4ICopc3VyZmFjZS0+cGl4ZWxzIC0gc3VyZmFjZS0+b2Zmc2V0OwotCi0JLyogVW5sb2NrIGhhcmR3YXJlIG9yIGFjY2VsZXJhdGVkIHN1cmZhY2VzICovCi0JaWYgKCBzdXJmYWNlLT5mbGFncyAmIChTRExfSFdTVVJGQUNFfFNETF9BU1lOQ0JMSVQpICkgewotCQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87Ci0JCXZpZGVvLT5VbmxvY2tIV1N1cmZhY2UodGhpcywgc3VyZmFjZSk7Ci0JfSBlbHNlIHsKLQkJLyogVXBkYXRlIFJMRSBlbmNvZGVkIHN1cmZhY2Ugd2l0aCBuZXcgZGF0YSAqLwotCQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9STEVBQ0NFTCkgPT0gU0RMX1JMRUFDQ0VMICkgewotCQkgICAgICAgIHN1cmZhY2UtPmZsYWdzICY9IH5TRExfUkxFQUNDRUw7IC8qIHN0b3AgbHlpbmcgKi8KLQkJCVNETF9STEVTdXJmYWNlKHN1cmZhY2UpOwotCQl9Ci0JfQotfQotCi0vKiAKLSAqIENvbnZlcnQgYSBzdXJmYWNlIGludG8gdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQuCi0gKi8KLVNETF9TdXJmYWNlICogU0RMX0NvbnZlcnRTdXJmYWNlIChTRExfU3VyZmFjZSAqc3VyZmFjZSwKLQkJCQkJU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQlTRExfU3VyZmFjZSAqY29udmVydDsKLQlVaW50MzIgY29sb3JrZXkgPSAwOwotCVVpbnQ4IGFscGhhID0gMDsKLQlVaW50MzIgc3VyZmFjZV9mbGFnczsKLQlTRExfUmVjdCBib3VuZHM7Ci0KLQkvKiBDaGVjayBmb3IgZW1wdHkgZGVzdGluYXRpb24gcGFsZXR0ZSEgKHJlc3VsdHMgaW4gZW1wdHkgaW1hZ2UpICovCi0JaWYgKCBmb3JtYXQtPnBhbGV0dGUgIT0gTlVMTCApIHsKLQkJaW50IGk7Ci0JCWZvciAoIGk9MDsgaTxmb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnM7ICsraSApIHsKLQkJCWlmICggKGZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2ldLnIgIT0gMCkgfHwKLQkJCSAgICAgKGZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2ldLmcgIT0gMCkgfHwKLQkJCSAgICAgKGZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2ldLmIgIT0gMCkgKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICggaSA9PSBmb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnMgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIkVtcHR5IGRlc3RpbmF0aW9uIHBhbGV0dGUiKTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCX0KLQotCS8qIE9ubHkgY3JlYXRlIGh3IHN1cmZhY2VzIHdpdGggYWxwaGEgY2hhbm5lbCBpZiBodyBhbHBoYSBibGl0cwotCSAgIGFyZSBzdXBwb3J0ZWQgKi8KLQlpZihmb3JtYXQtPkFtYXNrICE9IDAgJiYgKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkpIHsKLQkJY29uc3QgU0RMX1ZpZGVvSW5mbyAqdmkgPSBTRExfR2V0VmlkZW9JbmZvKCk7Ci0JCWlmKCF2aSB8fCAhdmktPmJsaXRfaHdfQSkKLQkJCWZsYWdzICY9IH5TRExfSFdTVVJGQUNFOwotCX0KLQotCS8qIENyZWF0ZSBhIG5ldyBzdXJmYWNlIHdpdGggdGhlIGRlc2lyZWQgZm9ybWF0ICovCi0JY29udmVydCA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKGZsYWdzLAotCQkJCXN1cmZhY2UtPncsIHN1cmZhY2UtPmgsIGZvcm1hdC0+Qml0c1BlclBpeGVsLAotCQlmb3JtYXQtPlJtYXNrLCBmb3JtYXQtPkdtYXNrLCBmb3JtYXQtPkJtYXNrLCBmb3JtYXQtPkFtYXNrKTsKLQlpZiAoIGNvbnZlcnQgPT0gTlVMTCApIHsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIENvcHkgdGhlIHBhbGV0dGUgaWYgYW55ICovCi0JaWYgKCBmb3JtYXQtPnBhbGV0dGUgJiYgY29udmVydC0+Zm9ybWF0LT5wYWxldHRlICkgewotCQlTRExfbWVtY3B5KGNvbnZlcnQtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzLAotCQkJCWZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzLAotCQkJCWZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9ycypzaXplb2YoU0RMX0NvbG9yKSk7Ci0JCWNvbnZlcnQtPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9ycyA9IGZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsKLQl9Ci0KLQkvKiBTYXZlIHRoZSBvcmlnaW5hbCBzdXJmYWNlIGNvbG9yIGtleSBhbmQgYWxwaGEgKi8KLQlzdXJmYWNlX2ZsYWdzID0gc3VyZmFjZS0+ZmxhZ3M7Ci0JaWYgKCAoc3VyZmFjZV9mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgewotCQkvKiBDb252ZXJ0IGNvbG91cmtleWVkIHN1cmZhY2VzIHRvIFJHQkEgaWYgcmVxdWVzdGVkICovCi0JCWlmKChmbGFncyAmIFNETF9TUkNDT0xPUktFWSkgIT0gU0RMX1NSQ0NPTE9SS0VZCi0JCSAgICYmIGZvcm1hdC0+QW1hc2spIHsKLQkJCXN1cmZhY2VfZmxhZ3MgJj0gflNETF9TUkNDT0xPUktFWTsKLQkJfSBlbHNlIHsKLQkJCWNvbG9ya2V5ID0gc3VyZmFjZS0+Zm9ybWF0LT5jb2xvcmtleTsKLQkJCVNETF9TZXRDb2xvcktleShzdXJmYWNlLCAwLCAwKTsKLQkJfQotCX0KLQlpZiAoIChzdXJmYWNlX2ZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7Ci0JCS8qIENvcHkgb3ZlciB0aGUgYWxwaGEgY2hhbm5lbCB0byBSR0JBIGlmIHJlcXVlc3RlZCAqLwotCQlpZiAoIGZvcm1hdC0+QW1hc2sgKSB7Ci0JCQlzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1NSQ0FMUEhBOwotCQl9IGVsc2UgewotCQkJYWxwaGEgPSBzdXJmYWNlLT5mb3JtYXQtPmFscGhhOwotCQkJU0RMX1NldEFscGhhKHN1cmZhY2UsIDAsIDApOwotCQl9Ci0JfQotCi0JLyogQ29weSBvdmVyIHRoZSBpbWFnZSBkYXRhICovCi0JYm91bmRzLnggPSAwOwotCWJvdW5kcy55ID0gMDsKLQlib3VuZHMudyA9IHN1cmZhY2UtPnc7Ci0JYm91bmRzLmggPSBzdXJmYWNlLT5oOwotCVNETF9Mb3dlckJsaXQoc3VyZmFjZSwgJmJvdW5kcywgY29udmVydCwgJmJvdW5kcyk7Ci0KLQkvKiBDbGVhbiB1cCB0aGUgb3JpZ2luYWwgc3VyZmFjZSwgYW5kIHVwZGF0ZSBjb252ZXJ0ZWQgc3VyZmFjZSAqLwotCWlmICggY29udmVydCAhPSBOVUxMICkgewotCQlTRExfU2V0Q2xpcFJlY3QoY29udmVydCwgJnN1cmZhY2UtPmNsaXBfcmVjdCk7Ci0JfQotCWlmICggKHN1cmZhY2VfZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSApIHsKLQkJVWludDMyIGNmbGFncyA9IHN1cmZhY2VfZmxhZ3MmKFNETF9TUkNDT0xPUktFWXxTRExfUkxFQUNDRUxPSyk7Ci0JCWlmICggY29udmVydCAhPSBOVUxMICkgewotCQkJVWludDgga2V5Uiwga2V5Rywga2V5QjsKLQotCQkJU0RMX0dldFJHQihjb2xvcmtleSxzdXJmYWNlLT5mb3JtYXQsJmtleVIsJmtleUcsJmtleUIpOwotCQkJU0RMX1NldENvbG9yS2V5KGNvbnZlcnQsIGNmbGFnc3woZmxhZ3MmU0RMX1JMRUFDQ0VMT0spLAotCQkJCVNETF9NYXBSR0IoY29udmVydC0+Zm9ybWF0LCBrZXlSLCBrZXlHLCBrZXlCKSk7Ci0JCX0KLQkJU0RMX1NldENvbG9yS2V5KHN1cmZhY2UsIGNmbGFncywgY29sb3JrZXkpOwotCX0KLQlpZiAoIChzdXJmYWNlX2ZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7Ci0JCVVpbnQzMiBhZmxhZ3MgPSBzdXJmYWNlX2ZsYWdzJihTRExfU1JDQUxQSEF8U0RMX1JMRUFDQ0VMT0spOwotCQlpZiAoIGNvbnZlcnQgIT0gTlVMTCApIHsKLQkJICAgICAgICBTRExfU2V0QWxwaGEoY29udmVydCwgYWZsYWdzfChmbGFncyZTRExfUkxFQUNDRUxPSyksCi0JCQkJYWxwaGEpOwotCQl9Ci0JCWlmICggZm9ybWF0LT5BbWFzayApIHsKLQkJCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9TUkNBTFBIQTsKLQkJfSBlbHNlIHsKLQkJCVNETF9TZXRBbHBoYShzdXJmYWNlLCBhZmxhZ3MsIGFscGhhKTsKLQkJfQotCX0KLQotCS8qIFdlJ3JlIHJlYWR5IHRvIGdvISAqLwotCXJldHVybihjb252ZXJ0KTsKLX0KLQotLyoKLSAqIEZyZWUgYSBzdXJmYWNlIGNyZWF0ZWQgYnkgdGhlIGFib3ZlIGZ1bmN0aW9uLgotICovCi12b2lkIFNETF9GcmVlU3VyZmFjZSAoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JLyogRnJlZSBhbnl0aGluZyB0aGF0J3Mgbm90IE5VTEwsIGFuZCBub3QgdGhlIHNjcmVlbiBzdXJmYWNlICovCi0JaWYgKChzdXJmYWNlID09IE5VTEwpIHx8Ci0JICAgIChjdXJyZW50X3ZpZGVvICYmCi0JICAgICgoc3VyZmFjZSA9PSBTRExfU2hhZG93U3VyZmFjZSl8fChzdXJmYWNlID09IFNETF9WaWRlb1N1cmZhY2UpKSkpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIC0tc3VyZmFjZS0+cmVmY291bnQgPiAwICkgewotCQlyZXR1cm47Ci0JfQotCXdoaWxlICggc3VyZmFjZS0+bG9ja2VkID4gMCApIHsKLQkJU0RMX1VubG9ja1N1cmZhY2Uoc3VyZmFjZSk7Ci0JfQotCWlmICggKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwgKSB7Ci0JICAgICAgICBTRExfVW5STEVTdXJmYWNlKHN1cmZhY2UsIDApOwotCX0KLQlpZiAoIHN1cmZhY2UtPmZvcm1hdCApIHsKLQkJU0RMX0ZyZWVGb3JtYXQoc3VyZmFjZS0+Zm9ybWF0KTsKLQkJc3VyZmFjZS0+Zm9ybWF0ID0gTlVMTDsKLQl9Ci0JaWYgKCBzdXJmYWNlLT5tYXAgIT0gTlVMTCApIHsKLQkJU0RMX0ZyZWVCbGl0TWFwKHN1cmZhY2UtPm1hcCk7Ci0JCXN1cmZhY2UtPm1hcCA9IE5VTEw7Ci0JfQotCWlmICggc3VyZmFjZS0+aHdkYXRhICkgewotCQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87Ci0JCXZpZGVvLT5GcmVlSFdTdXJmYWNlKHRoaXMsIHN1cmZhY2UpOwotCX0KLQlpZiAoIHN1cmZhY2UtPnBpeGVscyAmJgotCSAgICAgKChzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykgIT0gU0RMX1BSRUFMTE9DKSApIHsKLQkJU0RMX2ZyZWUoc3VyZmFjZS0+cGl4ZWxzKTsKLQl9Ci0JU0RMX2ZyZWUoc3VyZmFjZSk7Ci0jaWZkZWYgQ0hFQ0tfTEVBS1MKLQktLXN1cmZhY2VzX2FsbG9jYXRlZDsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfc3lzdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3N5c3ZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTBiNTYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfc3lzdmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX3N5c3ZpZGVvX2gKLSNkZWZpbmUgX1NETF9zeXN2aWRlb19oCi0KLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNkZWZpbmUgU0RMX1BST1RPVFlQRVNfT05MWQotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI3VuZGVmIFNETF9QUk9UT1RZUEVTX09OTFkKLQotLyogVGhpcyBmaWxlIHByb3RvdHlwZXMgdGhlIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KLSAgIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgZWFzaWx5IGNvbnZlcnRlZCB0byBDKysgaW4gdGhlIGZ1dHVyZS4KLSAqLwotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotI2luY2x1ZGUgIlNETF9vcGVuZ2wuaCIKLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi0KLS8qIFRoZSBTREwgdmlkZW8gZHJpdmVyICovCi10eXBlZGVmIHN0cnVjdCBTRExfVmlkZW9EZXZpY2UgU0RMX1ZpZGVvRGV2aWNlOwotCi0vKiBEZWZpbmUgdGhlIFNETCB2aWRlbyBkcml2ZXIgc3RydWN0dXJlICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqX3RoaXMKLSNpZm5kZWYgX1NUQVRVUwotI2RlZmluZSBfU1RBVFVTCVNETF9zdGF0dXMgKnN0YXR1cwotI2VuZGlmCi1zdHJ1Y3QgU0RMX1ZpZGVvRGV2aWNlIHsKLQkvKiAqICogKi8KLQkvKiBUaGUgbmFtZSBvZiB0aGlzIHZpZGVvIGRyaXZlciAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkvKiAqICogKi8KLQkvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KLQotCS8qIEluaXRpYWxpemUgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0sIGZpbGxpbmcgJ3Zmb3JtYXQnIHdpdGggdGhlIAotCSAgICJiZXN0IiBkaXNwbGF5IHBpeGVsIGZvcm1hdCwgcmV0dXJuaW5nIDAgb3IgLTEgaWYgdGhlcmUncyBhbiBlcnJvci4KLQkgKi8KLQlpbnQgKCpWaWRlb0luaXQpKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOwotCi0JLyogTGlzdCB0aGUgYXZhaWxhYmxlIHZpZGVvIG1vZGVzIGZvciB0aGUgZ2l2ZW4gcGl4ZWwgZm9ybWF0LCBzb3J0ZWQKLQkgICBmcm9tIGxhcmdlc3QgdG8gc21hbGxlc3QuCi0JICovCi0JU0RMX1JlY3QgKiooKkxpc3RNb2RlcykoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotCi0JLyogU2V0IHRoZSByZXF1ZXN0ZWQgdmlkZW8gbW9kZSwgcmV0dXJuaW5nIGEgc3VyZmFjZSB3aGljaCB3aWxsIGJlCi0JICAgc2V0IHRvIHRoZSBTRExfVmlkZW9TdXJmYWNlLiAgVGhlIHdpZHRoIGFuZCBoZWlnaHQgd2lsbCBhbHJlYWR5Ci0JICAgYmUgdmVyaWZpZWQgYnkgTGlzdE1vZGVzKCksIGFuZCB0aGUgdmlkZW8gc3Vic3lzdGVtIGlzIGZyZWUgdG8KLQkgICBzZXQgdGhlIG1vZGUgdG8gYSBzdXBwb3J0ZWQgYml0IGRlcHRoIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUKLQkgICBzcGVjaWZpZWQgLS0gdGhlIGRlc2lyZWQgYnBwIHdpbGwgYmUgZW11bGF0ZWQgd2l0aCBhIHNoYWRvdwotCSAgIHN1cmZhY2UgaWYgbmVjZXNzYXJ5LiAgSWYgYSBuZXcgbW9kZSBpcyByZXR1cm5lZCwgdGhpcyBmdW5jdGlvbgotCSAgIHNob3VsZCB0YWtlIGNhcmUgb2YgY2xlYW5pbmcgdXAgdGhlIGN1cnJlbnQgbW9kZS4KLQkgKi8KLQlTRExfU3VyZmFjZSAqKCpTZXRWaWRlb01vZGUpKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci0KLQkvKiBUb2dnbGUgdGhlIGZ1bGxzY3JlZW4gbW9kZSAqLwotCWludCAoKlRvZ2dsZUZ1bGxTY3JlZW4pKF9USElTLCBpbnQgb24pOwotCi0JLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHZpZGVvIG1vZGUgaGFzIGJlZW4gc2V0LCB0byBnZXQgdGhlCi0JICAgaW5pdGlhbCBtb3VzZSBzdGF0ZS4gIEl0IHNob3VsZCBxdWV1ZSBldmVudHMgYXMgbmVjZXNzYXJ5IHRvCi0JICAgcHJvcGVybHkgcmVwcmVzZW50IHRoZSBjdXJyZW50IG1vdXNlIGZvY3VzIGFuZCBwb3NpdGlvbi4KLQkgKi8KLQl2b2lkICgqVXBkYXRlTW91c2UpKF9USElTKTsKLQotCS8qIENyZWF0ZSBhIFlVViB2aWRlbyBzdXJmYWNlIChwb3NzaWJseSBvdmVybGF5KSBvZiB0aGUgZ2l2ZW4KLQkgICBmb3JtYXQuICBUaGUgaGFyZHdhcmUgc2hvdWxkIGJlIGFibGUgdG8gcGVyZm9ybSBhdCBsZWFzdCAyeAotCSAgIHNjYWxpbmcgb24gZGlzcGxheS4KLQkgKi8KLQlTRExfT3ZlcmxheSAqKCpDcmVhdGVZVVZPdmVybGF5KShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KTsKLQotICAgICAgICAvKiBTZXRzIHRoZSBjb2xvciBlbnRyaWVzIHsgZmlyc3Rjb2xvciAuLiAoZmlyc3Rjb2xvcituY29sb3JzLTEpIH0KLQkgICBvZiB0aGUgcGh5c2ljYWwgcGFsZXR0ZSB0byB0aG9zZSBpbiAnY29sb3JzJy4gSWYgdGhlIGRldmljZSBpcwotCSAgIHVzaW5nIGEgc29mdHdhcmUgcGFsZXR0ZSAoU0RMX0hXUEFMRVRURSBub3Qgc2V0KSwgdGhlbiB0aGUKLQkgICBjaGFuZ2VzIGFyZSByZWZsZWN0ZWQgaW4gdGhlIGxvZ2ljYWwgcGFsZXR0ZSBvZiB0aGUgc2NyZWVuCi0JICAgYXMgd2VsbC4KLQkgICBUaGUgcmV0dXJuIHZhbHVlIGlzIDEgaWYgYWxsIGVudHJpZXMgY291bGQgYmUgc2V0IHByb3Blcmx5Ci0JICAgb3IgMCBvdGhlcndpc2UuCi0JKi8KLQlpbnQgKCpTZXRDb2xvcnMpKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsCi0JCQkgU0RMX0NvbG9yICpjb2xvcnMpOwotCi0JLyogVGhpcyBwb2ludGVyIHNob3VsZCBleGlzdCBpbiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSBhbmQgc2hvdWxkCi0JICAgcG9pbnQgdG8gYW4gYXBwcm9wcmlhdGUgdXBkYXRlIGZ1bmN0aW9uIGZvciB0aGUgY3VycmVudCB2aWRlbyBtb2RlCi0JICovCi0Jdm9pZCAoKlVwZGF0ZVJlY3RzKShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotCi0JLyogUmV2ZXJzZSB0aGUgZWZmZWN0cyBWaWRlb0luaXQoKSAtLSBjYWxsZWQgaWYgVmlkZW9Jbml0KCkgZmFpbHMKLQkgICBvciBpZiB0aGUgYXBwbGljYXRpb24gaXMgc2h1dHRpbmcgZG93biB0aGUgdmlkZW8gc3Vic3lzdGVtLgotCSovCi0Jdm9pZCAoKlZpZGVvUXVpdCkoX1RISVMpOwotCi0JLyogKiAqICovCi0JLyogSGFyZHdhcmUgYWNjZWxlcmF0aW9uIGZ1bmN0aW9ucyAqLwotCi0JLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpZGVvIGhhcmR3YXJlICovCi0JU0RMX1ZpZGVvSW5mbyBpbmZvOwotCi0JLyogVGhlIHBpeGVsIGZvcm1hdCB1c2VkIHdoZW4gU0RMX0NyZWF0ZVJHQlN1cmZhY2UgY3JlYXRlcyBTRExfSFdTVVJGQUNFcyB3aXRoIGFscGhhICovCi0JU0RMX1BpeGVsRm9ybWF0KiBkaXNwbGF5Zm9ybWF0YWxwaGFwaXhlbDsKLQkKLQkvKiBBbGxvY2F0ZXMgYSBzdXJmYWNlIGluIHZpZGVvIG1lbW9yeSAqLwotCWludCAoKkFsbG9jSFdTdXJmYWNlKShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0JLyogU2V0cyB0aGUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgYmxpdCBmdW5jdGlvbiwgaWYgYW55LCBiYXNlZAotCSAgIG9uIHRoZSBjdXJyZW50IGZsYWdzIG9mIHRoZSBzdXJmYWNlIChjb2xvcmtleSwgYWxwaGEsIGV0Yy4pCi0JICovCi0JaW50ICgqQ2hlY2tIV0JsaXQpKF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KTsKLQotCS8qIEZpbGxzIGEgc3VyZmFjZSByZWN0YW5nbGUgd2l0aCB0aGUgZ2l2ZW4gY29sb3IgKi8KLQlpbnQgKCpGaWxsSFdSZWN0KShfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcik7Ci0KLQkvKiBTZXRzIHZpZGVvIG1lbSBjb2xvcmtleSBhbmQgYWNjZWxlcmF0ZWQgYmxpdCBmdW5jdGlvbiAqLwotCWludCAoKlNldEhXQ29sb3JLZXkpKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDMyIGtleSk7Ci0KLQkvKiBTZXRzIHBlciBzdXJmYWNlIGhhcmR3YXJlIGFscGhhIHZhbHVlICovCi0JaW50ICgqU2V0SFdBbHBoYSkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50OCB2YWx1ZSk7Ci0KLQkvKiBSZXR1cm5zIGEgcmVhZGFibGUvd3JpdGFibGUgc3VyZmFjZSAqLwotCWludCAoKkxvY2tIV1N1cmZhY2UpKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0Jdm9pZCAoKlVubG9ja0hXU3VyZmFjZSkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLQotCS8qIFBlcmZvcm1zIGhhcmR3YXJlIGZsaXBwaW5nICovCi0JaW50ICgqRmxpcEhXU3VyZmFjZSkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLQotCS8qIEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgdmlkZW8gc3VyZmFjZSAqLwotCXZvaWQgKCpGcmVlSFdTdXJmYWNlKShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0JLyogKiAqICovCi0JLyogR2FtbWEgc3VwcG9ydCAqLwotCi0JVWludDE2ICpnYW1tYTsKLQotCS8qIFNldCB0aGUgZ2FtbWEgY29ycmVjdGlvbiBkaXJlY3RseSAoZW11bGF0ZWQgd2l0aCBnYW1tYSByYW1wcykgKi8KLQlpbnQgKCpTZXRHYW1tYSkoX1RISVMsIGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpOwotCi0JLyogR2V0IHRoZSBnYW1tYSBjb3JyZWN0aW9uIGRpcmVjdGx5IChlbXVsYXRlZCB3aXRoIGdhbW1hIHJhbXBzKSAqLwotCWludCAoKkdldEdhbW1hKShfVEhJUywgZmxvYXQgKnJlZCwgZmxvYXQgKmdyZWVuLCBmbG9hdCAqYmx1ZSk7Ci0KLQkvKiBTZXQgdGhlIGdhbW1hIHJhbXAgKi8KLQlpbnQgKCpTZXRHYW1tYVJhbXApKF9USElTLCBVaW50MTYgKnJhbXApOwotCi0JLyogR2V0IHRoZSBnYW1tYSByYW1wICovCi0JaW50ICgqR2V0R2FtbWFSYW1wKShfVEhJUywgVWludDE2ICpyYW1wKTsKLQotCS8qICogKiAqLwotCS8qIE9wZW5HTCBzdXBwb3J0ICovCi0KLQkvKiBTZXRzIHRoZSBkbGwgdG8gdXNlIGZvciBPcGVuR0wgYW5kIGxvYWRzIGl0ICovCi0JaW50ICgqR0xfTG9hZExpYnJhcnkpKF9USElTLCBjb25zdCBjaGFyICpwYXRoKTsKLQotCS8qIFJldHJpZXZlcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIGluIHRoZSBnbCBsaWJyYXJ5ICovCi0Jdm9pZCogKCpHTF9HZXRQcm9jQWRkcmVzcykoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpOwotCi0JLyogR2V0IGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3aW5kb3dpbmcgc3lzdGVtLiAqLwotCWludCAoKkdMX0dldEF0dHJpYnV0ZSkoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKTsKLQotCS8qIE1ha2UgdGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZHJpdmVyIGN1cnJlbnQgKi8KLQlpbnQgKCpHTF9NYWtlQ3VycmVudCkoX1RISVMpOwotCi0JLyogU3dhcCB0aGUgY3VycmVudCBidWZmZXJzIGluIGRvdWJsZSBidWZmZXIgbW9kZS4gKi8KLQl2b2lkICgqR0xfU3dhcEJ1ZmZlcnMpKF9USElTKTsKLQotICAJLyogT3BlbkdMIGZ1bmN0aW9ucyBmb3IgU0RMX09QRU5HTEJMSVQgKi8KLSNpZiBTRExfVklERU9fT1BFTkdMCi0jaWYgIWRlZmluZWQoX19XSU4zMl9fKQotI2RlZmluZSBXSU5BUEkKLSNlbmRpZgotI2RlZmluZSBTRExfUFJPQyhyZXQsZnVuYyxwYXJhbXMpIHJldCAoV0lOQVBJICpmdW5jKSBwYXJhbXM7Ci0jaW5jbHVkZSAiU0RMX2dsZnVuY3MuaCIKLSN1bmRlZiBTRExfUFJPQwotCi0JLyogVGV4dHVyZSBpZCAqLwotCUdMdWludCB0ZXh0dXJlOwotI2VuZGlmCi0JaW50IGlzXzMyYml0OwotIAotCS8qICogKiAqLwotCS8qIFdpbmRvdyBtYW5hZ2VyIGZ1bmN0aW9ucyAqLwotCi0JLyogU2V0IHRoZSB0aXRsZSBhbmQgaWNvbiB0ZXh0ICovCi0Jdm9pZCAoKlNldENhcHRpb24pKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7Ci0KLQkvKiBTZXQgdGhlIHdpbmRvdyBpY29uIGltYWdlICovCi0Jdm9pZCAoKlNldEljb24pKF9USElTLCBTRExfU3VyZmFjZSAqaWNvbiwgVWludDggKm1hc2spOwotCi0JLyogSWNvbmlmeSB0aGUgd2luZG93LgotCSAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRoZXJlIGlzIGEgd2luZG93IG1hbmFnZXIgYW5kIHRoZQotCSAgIHdpbmRvdyB3YXMgYWN0dWFsbHkgaWNvbmlmaWVkLCBpdCByZXR1cm5zIDAgb3RoZXJ3aXNlLgotCSovCi0JaW50ICgqSWNvbmlmeVdpbmRvdykoX1RISVMpOwotCi0JLyogR3JhYiBvciB1bmdyYWIga2V5Ym9hcmQgYW5kIG1vdXNlIGlucHV0ICovCi0JU0RMX0dyYWJNb2RlICgqR3JhYklucHV0KShfVEhJUywgU0RMX0dyYWJNb2RlIG1vZGUpOwotCi0JLyogR2V0IHNvbWUgcGxhdGZvcm0gZGVwZW5kZW50IHdpbmRvdyBpbmZvcm1hdGlvbiAqLwotCWludCAoKkdldFdNSW5mbykoX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pOwotCi0gICAgLyogc2V0IHdpbmRvdyBwb3NpdGlvbiAqLwotICAgIHZvaWQgKCpTZXRXaW5kb3dQb3MpKF9USElTLCBpbnQgIHgsIGludCAgeSk7Ci0KLSAgICAvKiBnZXQgd2luZG93IHBvc2l0aW9uICovCi0gICAgdm9pZCAoKkdldFdpbmRvd1BvcykoX1RISVMsIGludCAgKnB4LCBpbnQgICpweSk7Ci0KLSAgICAvKiBkZXRlcm1pbmUgaWYgdGhlIHdpbmRvdyBpcyBmdWxseSB2aXNpYmxlIG9uIHNjcmVlbiAqLwotICAgIGludCAgKCpJc1dpbmRvd1Zpc2libGUpKF9USElTLCBpbnQgIHJlY2VudGVyKTsKLQotICAgIC8qIGdldCBtYWluIG1vbml0b3IncyByZXNvbHV0aW9uICovCi0gICAgaW50ICAoKkdldE1vbml0b3JEUEkpKF9USElTLCBpbnQgICp4ZHBpLCBpbnQgICp5ZHBpKTsKLQotICAgIC8qIGdldCBuZWFyZXN0IG1vbml0b3IncyByZWN0YW5nbGUgKi8KLSAgICBpbnQgICgqR2V0TW9uaXRvclJlY3QpKF9USElTLCBTRExfUmVjdCogIHJlY3QpOwotCi0JLyogKiAqICovCi0JLyogQ3Vyc29yIG1hbmFnZXIgZnVuY3Rpb25zICovCi0KLQkvKiBGcmVlIGEgd2luZG93IG1hbmFnZXIgY3Vyc29yCi0JICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgTlVMTCBpZiBDcmVhdGVXTUN1cnNvciBpcyBhbHNvIE5VTEwuCi0JICovCi0Jdm9pZCAoKkZyZWVXTUN1cnNvcikoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOwotCi0JLyogSWYgbm90IE5VTEwsIGNyZWF0ZSBhIGJsYWNrL3doaXRlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLwotCVdNY3Vyc29yICooKkNyZWF0ZVdNQ3Vyc29yKShfVEhJUywKLQkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKLQotCS8qIFNob3cgdGhlIHNwZWNpZmllZCBjdXJzb3IsIG9yIGhpZGUgaWYgY3Vyc29yIGlzIE5VTEwgKi8KLQlpbnQgKCpTaG93V01DdXJzb3IpKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLQotCS8qIFdhcnAgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciB0byAoeCx5KQotCSAgIElmIE5VTEwsIGEgbW91c2UgbW90aW9uIGV2ZW50IGlzIHBvc3RlZCBpbnRlcm5hbGx5LgotCSAqLwotCXZvaWQgKCpXYXJwV01DdXJzb3IpKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpOwotCi0JLyogSWYgbm90IE5VTEwsIHRoaXMgaXMgY2FsbGVkIHdoZW4gYSBtb3VzZSBtb3Rpb24gZXZlbnQgb2NjdXJzICovCi0Jdm9pZCAoKk1vdmVXTUN1cnNvcikoX1RISVMsIGludCB4LCBpbnQgeSk7Ci0KLQkvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgbW91c2Ugc2hvdWxkIGJlIGluIHJlbGF0aXZlIG1vZGUgb3Igbm90LgotCSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGlucHV0IGdyYWIgc3RhdGUgb3IgY3Vyc29yCi0JICAgdmlzaWJpbGl0eSBzdGF0ZSBjaGFuZ2VzLgotCSAgIElmIHRoZSBjdXJzb3IgaXMgbm90IHZpc2libGUsIGFuZCB0aGUgaW5wdXQgaXMgZ3JhYmJlZCwgdGhlCi0JICAgZHJpdmVyIGNhbiBwbGFjZSB0aGUgbW91c2UgaW4gcmVsYXRpdmUgbW9kZSwgd2hpY2ggbWF5IHJlc3VsdAotCSAgIGluIGhpZ2hlciBhY2N1cmFjeSBzYW1wbGluZyBvZiB0aGUgcG9pbnRlciBtb3Rpb24uCi0JKi8KLQl2b2lkICgqQ2hlY2tNb3VzZU1vZGUpKF9USElTKTsKLQotCS8qICogKiAqLwotCS8qIEV2ZW50IG1hbmFnZXIgZnVuY3Rpb25zICovCi0KLQkvKiBJbml0aWFsaXplIGtleWJvYXJkIG1hcHBpbmcgZm9yIHRoaXMgZHJpdmVyICovCi0Jdm9pZCAoKkluaXRPU0tleW1hcCkoX1RISVMpOwotCi0JLyogSGFuZGxlIGFueSBxdWV1ZWQgT1MgZXZlbnRzICovCi0Jdm9pZCAoKlB1bXBFdmVudHMpKF9USElTKTsKLQotCS8qICogKiAqLwotCS8qIERhdGEgY29tbW9uIHRvIGFsbCBkcml2ZXJzICovCi0JU0RMX1N1cmZhY2UgKnNjcmVlbjsKLQlTRExfU3VyZmFjZSAqc2hhZG93OwotCVNETF9TdXJmYWNlICp2aXNpYmxlOwotICAgICAgICBTRExfUGFsZXR0ZSAqcGh5c3BhbDsJLyogcGh5c2ljYWwgcGFsZXR0ZSwgaWYgIT0gbG9naWNhbCBwYWxldHRlICovCi0gICAgICAgIFNETF9Db2xvciAqZ2FtbWFjb2xzOwkvKiBnYW1tYS1jb3JyZWN0ZWQgY29sb3Vycywgb3IgTlVMTCAqLwotCWNoYXIgKndtX3RpdGxlOwotCWNoYXIgKndtX2ljb247Ci0JaW50IG9mZnNldF94OwotCWludCBvZmZzZXRfeTsKLQlTRExfR3JhYk1vZGUgaW5wdXRfZ3JhYjsKLQotCS8qIERyaXZlciBpbmZvcm1hdGlvbiBmbGFncyAqLwotCWludCBoYW5kbGVzX2FueV9zaXplOwkvKiBEcml2ZXIgaGFuZGxlcyBhbnkgc2l6ZSB2aWRlbyBtb2RlICovCi0KLQkvKiAqICogKi8KLQkvKiBEYXRhIHVzZWQgYnkgdGhlIEdMIGRyaXZlcnMgKi8KLQlzdHJ1Y3QgewotCQlpbnQgcmVkX3NpemU7Ci0JCWludCBncmVlbl9zaXplOwotCQlpbnQgYmx1ZV9zaXplOwotCQlpbnQgYWxwaGFfc2l6ZTsKLQkJaW50IGRlcHRoX3NpemU7Ci0JCWludCBidWZmZXJfc2l6ZTsKLQkJaW50IHN0ZW5jaWxfc2l6ZTsKLQkJaW50IGRvdWJsZV9idWZmZXI7Ci0JCWludCBhY2N1bV9yZWRfc2l6ZTsKLQkJaW50IGFjY3VtX2dyZWVuX3NpemU7Ci0JCWludCBhY2N1bV9ibHVlX3NpemU7Ci0JCWludCBhY2N1bV9hbHBoYV9zaXplOwotCQlpbnQgc3RlcmVvOwotCQlpbnQgbXVsdGlzYW1wbGVidWZmZXJzOwotCQlpbnQgbXVsdGlzYW1wbGVzYW1wbGVzOwotCQlpbnQgYWNjZWxlcmF0ZWQ7Ci0JCWludCBzd2FwX2NvbnRyb2w7Ci0JCWludCBkcml2ZXJfbG9hZGVkOwotCQljaGFyIGRyaXZlcl9wYXRoWzI1Nl07Ci0JCXZvaWQqIGRsbF9oYW5kbGU7Ci0JfSBnbF9jb25maWc7Ci0KLQkvKiAqICogKi8KLQkvKiBEYXRhIHByaXZhdGUgdG8gdGhpcyBkcml2ZXIgKi8KLQlzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKmhpZGRlbjsKLQlzdHJ1Y3QgU0RMX1ByaXZhdGVHTERhdGEgKmdsX2RhdGE7Ci0KLQkvKiAqICogKi8KLQkvKiBUaGUgZnVuY3Rpb24gdXNlZCB0byBkaXNwb3NlIG9mIHRoaXMgc3RydWN0dXJlICovCi0Jdm9pZCAoKmZyZWUpKF9USElTKTsKLX07Ci0jdW5kZWYgX1RISVMKLQotdHlwZWRlZiBzdHJ1Y3QgVmlkZW9Cb290U3RyYXAgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqZGVzYzsKLQlpbnQgKCphdmFpbGFibGUpKHZvaWQpOwotCVNETF9WaWRlb0RldmljZSAqKCpjcmVhdGUpKGludCBkZXZpbmRleCk7Ci19IFZpZGVvQm9vdFN0cmFwOwotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9RVUFSVFoKLWV4dGVybiBWaWRlb0Jvb3RTdHJhcCBRWl9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMQotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIFgxMV9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX0RHQQotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIERHQV9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX05BTk9YCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgTlhfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9JUE9ECi1leHRlcm4gVmlkZW9Cb290U3RyYXAgaVBvZF9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1FUT1BJQQotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIFF0b3BpYV9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1dTQ09OUwotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIFdTQ09OU19ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX0ZCQ09OCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgRkJDT05fYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9ESVJFQ1RGQgotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIERpcmVjdEZCX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfUFMyR1MKLWV4dGVybiBWaWRlb0Jvb3RTdHJhcCBQUzJHU19ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX0dHSQotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIEdHSV9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1ZHTAotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIFZHTF9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1NWR0FMSUIKLWV4dGVybiBWaWRlb0Jvb3RTdHJhcCBTVkdBTElCX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfR0FQSQotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIEdBUElfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9XSU5ESUIKLWV4dGVybiBWaWRlb0Jvb3RTdHJhcCBXSU5ESUJfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9ERFJBVwotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIERJUkVDVFhfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9CV0lORE9XCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgQldJTkRPV19ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1RPT0xCT1gKLWV4dGVybiBWaWRlb0Jvb3RTdHJhcCBUT09MQk9YX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfRFJBV1NQUk9DS0VUCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgRFNwX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfUEhPVE9OCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgcGhfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9FUE9DCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgRVBPQ19ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1hCSU9TCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgWEJJT1NfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9HRU0KLWV4dGVybiBWaWRlb0Jvb3RTdHJhcCBHRU1fYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9QSUNPR1VJCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgUEdfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9EQwotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIERDX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfTkRTCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgTkRTX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfUklTQ09TCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgUklTQ09TX2Jvb3RzdHJhcDsKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfT1MyRlMKLWV4dGVybiBWaWRlb0Jvb3RTdHJhcCBPUzJGU0xpYl9ib290c3RyYXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX0FBTElCCi1leHRlcm4gVmlkZW9Cb290U3RyYXAgQUFMSUJfYm9vdHN0cmFwOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9EVU1NWQotZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIERVTU1ZX2Jvb3RzdHJhcDsKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBjdXJyZW50IHZpZGVvIGRldmljZSAqLwotZXh0ZXJuIFNETF9WaWRlb0RldmljZSAqY3VycmVudF92aWRlbzsKLQotI2RlZmluZSBTRExfVmlkZW9TdXJmYWNlCShjdXJyZW50X3ZpZGVvLT5zY3JlZW4pCi0jZGVmaW5lIFNETF9TaGFkb3dTdXJmYWNlCShjdXJyZW50X3ZpZGVvLT5zaGFkb3cpCi0jZGVmaW5lIFNETF9QdWJsaWNTdXJmYWNlCShjdXJyZW50X3ZpZGVvLT52aXNpYmxlKQotCi0jZW5kaWYgLyogX1NETF9zeXN2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF92aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3YmY2My4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF92aWRlby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAwOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhlIGhpZ2gtbGV2ZWwgdmlkZW8gZHJpdmVyIHN1YnN5c3RlbSAqLwotCi0jaW5jbHVkZSAiU0RMLmgiCi0jaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2JsaXQuaCIKLSNpbmNsdWRlICJTRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICJTRExfY3Vyc29yX2MuaCIKLSNpbmNsdWRlICIuLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIi4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotLyogQXZhaWxhYmxlIHZpZGVvIGRyaXZlcnMgKi8KLXN0YXRpYyBWaWRlb0Jvb3RTdHJhcCAqYm9vdHN0cmFwW10gPSB7Ci0jaWYgU0RMX1ZJREVPX0RSSVZFUl9RVUFSVFoKLQkmUVpfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTEKLQkmWDExX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfREdBCi0JJkRHQV9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX05BTk9YCi0JJk5YX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfSVBPRAotCSZpUG9kX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfUVRPUElBCi0JJlF0b3BpYV9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1dTQ09OUwotCSZXU0NPTlNfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9GQkNPTgotCSZGQkNPTl9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX0RJUkVDVEZCCi0JJkRpcmVjdEZCX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfUFMyR1MKLQkmUFMyR1NfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9HR0kKLQkmR0dJX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfVkdMCi0JJlZHTF9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1NWR0FMSUIKLQkmU1ZHQUxJQl9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX0dBUEkKLQkmR0FQSV9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1dJTkRJQgotCSZXSU5ESUJfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9ERFJBVwotCSZESVJFQ1RYX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfQldJTkRPVwotCSZCV0lORE9XX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfVE9PTEJPWAotCSZUT09MQk9YX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfRFJBV1NQUk9DS0VUCi0JJkRTcF9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1BIT1RPTgotCSZwaF9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX0VQT0MKLQkmRVBPQ19ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1hCSU9TCi0JJlhCSU9TX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfR0VNCi0JJkdFTV9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1BJQ09HVUkKLQkmUEdfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9EQwotCSZEQ19ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX05EUwotCSZORFNfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9SSVNDT1MKLQkmUklTQ09TX2Jvb3RzdHJhcCwKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfT1MyRlMKLQkmT1MyRlNMaWJfYm9vdHN0cmFwLAotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9BQUxJQgotCSZBQUxJQl9ib290c3RyYXAsCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX0RVTU1ZCi0JJkRVTU1ZX2Jvb3RzdHJhcCwKLSNlbmRpZgotCU5VTEwKLX07Ci0KLVNETF9WaWRlb0RldmljZSAqY3VycmVudF92aWRlbyA9IE5VTEw7Ci0KLS8qIFZhcmlvdXMgbG9jYWwgZnVuY3Rpb25zICovCi1pbnQgU0RMX1ZpZGVvSW5pdChjb25zdCBjaGFyICpkcml2ZXJfbmFtZSwgVWludDMyIGZsYWdzKTsKLXZvaWQgU0RMX1ZpZGVvUXVpdCh2b2lkKTsKLXZvaWQgU0RMX0dMX1VwZGF0ZVJlY3RzTG9jayhTRExfVmlkZW9EZXZpY2UqIHRoaXMsIGludCBudW1yZWN0cywgU0RMX1JlY3QqIHJlY3RzKTsKLQotc3RhdGljIFNETF9HcmFiTW9kZSBTRExfV01fR3JhYklucHV0T2ZmKHZvaWQpOwotI2lmIFNETF9WSURFT19PUEVOR0wKLXN0YXRpYyBpbnQgbG9ja19jb3VudCA9IDA7Ci0jZW5kaWYKLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gYW5kIGV2ZW50IHN1YnN5c3RlbXMgLS0gZGV0ZXJtaW5lIG5hdGl2ZSBwaXhlbCBmb3JtYXQKLSAqLwotaW50IFNETF9WaWRlb0luaXQgKGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lLCBVaW50MzIgZmxhZ3MpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbzsKLQlpbnQgaW5kZXg7Ci0JaW50IGk7Ci0JU0RMX1BpeGVsRm9ybWF0IHZmb3JtYXQ7Ci0JVWludDMyIHZpZGVvX2ZsYWdzOwotCi0JLyogVG9nZ2xlIHRoZSBldmVudCB0aHJlYWQgZmxhZ3MsIGJhc2VkIG9uIE9TIHJlcXVpcmVtZW50cyAqLwotI2lmIGRlZmluZWQoTVVTVF9USFJFQURfRVZFTlRTKQotCWZsYWdzIHw9IFNETF9JTklUX0VWRU5UVEhSRUFEOwotI2VsaWYgZGVmaW5lZChDQU5UX1RIUkVBRF9FVkVOVFMpCi0JaWYgKCAoZmxhZ3MgJiBTRExfSU5JVF9FVkVOVFRIUkVBRCkgPT0gU0RMX0lOSVRfRVZFTlRUSFJFQUQgKSB7Ci0JCVNETF9TZXRFcnJvcigiT1MgZG9lc24ndCBzdXBwb3J0IHRocmVhZGVkIGV2ZW50cyIpOwotCQlyZXR1cm4oLTEpOwotCX0KLSNlbmRpZgotCi0JLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJ3cml0ZSAnY3VycmVudF92aWRlbycgKi8KLQlpZiAoIGN1cnJlbnRfdmlkZW8gIT0gTlVMTCApIHsKLQkJU0RMX1ZpZGVvUXVpdCgpOwotCX0KLQotCS8qIFNlbGVjdCB0aGUgcHJvcGVyIHZpZGVvIGRyaXZlciAqLwotCWluZGV4ID0gMDsKLQl2aWRlbyA9IE5VTEw7Ci0JaWYgKCBkcml2ZXJfbmFtZSAhPSBOVUxMICkgewotI2lmIDAJLyogVGhpcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBiZXR0ZXIgZHJpdmVyIHNlbGVjdGlvbiBBUEkgKi8KLQkJaWYgKCBTRExfc3RycmNocihkcml2ZXJfbmFtZSwgJzonKSAhPSBOVUxMICkgewotCQkJaW5kZXggPSBhdG9pKFNETF9zdHJyY2hyKGRyaXZlcl9uYW1lLCAnOicpKzEpOwotCQl9Ci0jZW5kaWYKLQkJZm9yICggaT0wOyBib290c3RyYXBbaV07ICsraSApIHsKLQkJCWlmICggU0RMX3N0cmNhc2VjbXAoYm9vdHN0cmFwW2ldLT5uYW1lLCBkcml2ZXJfbmFtZSkgPT0gMCkgewotCQkJCWlmICggYm9vdHN0cmFwW2ldLT5hdmFpbGFibGUoKSApIHsKLQkJCQkJdmlkZW8gPSBib290c3RyYXBbaV0tPmNyZWF0ZShpbmRleCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoIGk9MDsgYm9vdHN0cmFwW2ldOyArK2kgKSB7Ci0JCQlpZiAoIGJvb3RzdHJhcFtpXS0+YXZhaWxhYmxlKCkgKSB7Ci0JCQkJdmlkZW8gPSBib290c3RyYXBbaV0tPmNyZWF0ZShpbmRleCk7Ci0JCQkJaWYgKCB2aWRlbyAhPSBOVUxMICkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCB2aWRlbyA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIk5vIGF2YWlsYWJsZSB2aWRlbyBkZXZpY2UiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JY3VycmVudF92aWRlbyA9IHZpZGVvOwotCWN1cnJlbnRfdmlkZW8tPm5hbWUgPSBib290c3RyYXBbaV0tPm5hbWU7Ci0KLQkvKiBEbyBzb21lIGJhc2ljIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uICovCi0JdmlkZW8tPnNjcmVlbiA9IE5VTEw7Ci0JdmlkZW8tPnNoYWRvdyA9IE5VTEw7Ci0JdmlkZW8tPnZpc2libGUgPSBOVUxMOwotCXZpZGVvLT5waHlzcGFsID0gTlVMTDsKLQl2aWRlby0+Z2FtbWFjb2xzID0gTlVMTDsKLQl2aWRlby0+Z2FtbWEgPSBOVUxMOwotCXZpZGVvLT53bV90aXRsZSA9IE5VTEw7Ci0JdmlkZW8tPndtX2ljb24gID0gTlVMTDsKLQl2aWRlby0+b2Zmc2V0X3ggPSAwOwotCXZpZGVvLT5vZmZzZXRfeSA9IDA7Ci0JU0RMX21lbXNldCgmdmlkZW8tPmluZm8sIDAsIChzaXplb2YgdmlkZW8tPmluZm8pKTsKLQotCXZpZGVvLT5kaXNwbGF5Zm9ybWF0YWxwaGFwaXhlbCA9IE5VTEw7Ci0KLQkvKiBTZXQgc29tZSB2ZXJ5IHNhbmUgR0wgZGVmYXVsdHMgKi8KLQl2aWRlby0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAwOwotCXZpZGVvLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IE5VTEw7Ci0JdmlkZW8tPmdsX2NvbmZpZy5yZWRfc2l6ZSA9IDM7Ci0JdmlkZW8tPmdsX2NvbmZpZy5ncmVlbl9zaXplID0gMzsKLQl2aWRlby0+Z2xfY29uZmlnLmJsdWVfc2l6ZSA9IDI7Ci0JdmlkZW8tPmdsX2NvbmZpZy5hbHBoYV9zaXplID0gMDsKLQl2aWRlby0+Z2xfY29uZmlnLmJ1ZmZlcl9zaXplID0gMDsKLQl2aWRlby0+Z2xfY29uZmlnLmRlcHRoX3NpemUgPSAxNjsKLQl2aWRlby0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZSA9IDA7Ci0JdmlkZW8tPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyID0gMTsKLQl2aWRlby0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplID0gMDsKLQl2aWRlby0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemUgPSAwOwotCXZpZGVvLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplID0gMDsKLQl2aWRlby0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemUgPSAwOwotCXZpZGVvLT5nbF9jb25maWcuc3RlcmVvID0gMDsKLQl2aWRlby0+Z2xfY29uZmlnLm11bHRpc2FtcGxlYnVmZmVycyA9IDA7Ci0JdmlkZW8tPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXMgPSAwOwotCXZpZGVvLT5nbF9jb25maWcuYWNjZWxlcmF0ZWQgPSAtMTsgLyogbm90IGtub3duLCBkb24ndCBzZXQgKi8KLQl2aWRlby0+Z2xfY29uZmlnLnN3YXBfY29udHJvbCA9IC0xOyAvKiBub3Qga25vd24sIGRvbid0IHNldCAqLwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gc3Vic3lzdGVtICovCi0JU0RMX21lbXNldCgmdmZvcm1hdCwgMCwgc2l6ZW9mKHZmb3JtYXQpKTsKLQlpZiAoIHZpZGVvLT5WaWRlb0luaXQodmlkZW8sICZ2Zm9ybWF0KSA8IDAgKSB7Ci0JCVNETF9WaWRlb1F1aXQoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBDcmVhdGUgYSB6ZXJvIHNpemVkIHZpZGVvIHN1cmZhY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCAqLwotCXZpZGVvX2ZsYWdzID0gU0RMX1NXU1VSRkFDRTsKLQlTRExfVmlkZW9TdXJmYWNlID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UodmlkZW9fZmxhZ3MsIDAsIDAsCi0JCQkJdmZvcm1hdC5CaXRzUGVyUGl4ZWwsCi0JCQkJdmZvcm1hdC5SbWFzaywgdmZvcm1hdC5HbWFzaywgdmZvcm1hdC5CbWFzaywgMCk7Ci0JaWYgKCBTRExfVmlkZW9TdXJmYWNlID09IE5VTEwgKSB7Ci0JCVNETF9WaWRlb1F1aXQoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JU0RMX1B1YmxpY1N1cmZhY2UgPSBOVUxMOwkvKiBVbnRpbCBTRExfU2V0VmlkZW9Nb2RlKCkgKi8KLQotI2lmIDAgLyogRG9uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IHBhbGV0dGUgLSBtYXkgYmUgdXNlZCBieSBvdGhlciBwcm9ncmFtcy4KLSAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSBkaXNwbGF5IHN1cmZhY2UgdW50aWwKLSAgICAgICAqIGEgdmlkZW8gbW9kZSBoYXMgYmVlbiBzZXQgYW55d2F5LiA6KQotICAgICAgICovCi0JLyogSWYgd2UgaGF2ZSBhIHBhbGV0dGl6ZWQgc3VyZmFjZSwgY3JlYXRlIGEgZGVmYXVsdCBwYWxldHRlICovCi0JaWYgKCBTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUgKSB7Ci0JCVNETF9QaXhlbEZvcm1hdCAqdmYgPSBTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQ7Ci0JCVNETF9EaXRoZXJDb2xvcnModmYtPnBhbGV0dGUtPmNvbG9ycywgdmYtPkJpdHNQZXJQaXhlbCk7Ci0JCXZpZGVvLT5TZXRDb2xvcnModmlkZW8sCi0JCQkJIDAsIHZmLT5wYWxldHRlLT5uY29sb3JzLCB2Zi0+cGFsZXR0ZS0+Y29sb3JzKTsKLQl9Ci0jZW5kaWYKLQl2aWRlby0+aW5mby52Zm10ID0gU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0OwotCi0JLyogU3RhcnQgdGhlIGV2ZW50IGxvb3AgKi8KLQlpZiAoIFNETF9TdGFydEV2ZW50TG9vcChmbGFncykgPCAwICkgewotCQlTRExfVmlkZW9RdWl0KCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCVNETF9DdXJzb3JJbml0KGZsYWdzICYgU0RMX0lOSVRfRVZFTlRUSFJFQUQpOwotCi0JLyogV2UncmUgcmVhZHkgdG8gZ28hICovCi0JcmV0dXJuKDApOwotfQotCi1jaGFyICpTRExfVmlkZW9Ecml2ZXJOYW1lKGNoYXIgKm5hbWVidWYsIGludCBtYXhsZW4pCi17Ci0JaWYgKCBjdXJyZW50X3ZpZGVvICE9IE5VTEwgKSB7Ci0JCVNETF9zdHJsY3B5KG5hbWVidWYsIGN1cnJlbnRfdmlkZW8tPm5hbWUsIG1heGxlbik7Ci0JCXJldHVybihuYW1lYnVmKTsKLQl9Ci0JcmV0dXJuKE5VTEwpOwotfQotCi0vKgotICogR2V0IHRoZSBjdXJyZW50IGRpc3BsYXkgc3VyZmFjZQotICovCi1TRExfU3VyZmFjZSAqU0RMX0dldFZpZGVvU3VyZmFjZSh2b2lkKQotewotCVNETF9TdXJmYWNlICp2aXNpYmxlOwotCi0JdmlzaWJsZSA9IE5VTEw7Ci0JaWYgKCBjdXJyZW50X3ZpZGVvICkgewotCQl2aXNpYmxlID0gY3VycmVudF92aWRlby0+dmlzaWJsZTsKLQl9Ci0JcmV0dXJuKHZpc2libGUpOwotfQotCi0vKgotICogR2V0IHRoZSBjdXJyZW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyBoYXJkd2FyZQotICovCi1jb25zdCBTRExfVmlkZW9JbmZvICpTRExfR2V0VmlkZW9JbmZvKHZvaWQpCi17Ci0JY29uc3QgU0RMX1ZpZGVvSW5mbyAqaW5mbzsKLQotCWluZm8gPSBOVUxMOwotCWlmICggY3VycmVudF92aWRlbyApIHsKLQkJaW5mbyA9ICZjdXJyZW50X3ZpZGVvLT5pbmZvOwotCX0KLQlyZXR1cm4oaW5mbyk7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGF2YWlsYWJsZSBzY3JlZW4gZGltZW5zaW9ucyBmb3IgdGhlCi0gKiBnaXZlbiBmb3JtYXQsIHNvcnRlZCBsYXJnZXN0IHRvIHNtYWxsZXN0LiAgUmV0dXJucyBOVUxMIGlmIHRoZXJlIGFyZQotICogbm8gZGltZW5zaW9ucyBhdmFpbGFibGUgZm9yIGEgcGFydGljdWxhciBmb3JtYXQsIG9yIChTRExfUmVjdCAqKiktMQotICogaWYgYW55IGRpbWVuc2lvbiBpcyBva2F5IGZvciB0aGUgZ2l2ZW4gZm9ybWF0LiAgSWYgJ2Zvcm1hdCcgaXMgTlVMTCwKLSAqIHRoZSBtb2RlIGxpc3Qgd2lsbCBiZSBmb3IgdGhlIGZvcm1hdCBnaXZlbiBieSBTRExfR2V0VmlkZW9JbmZvKCktPnZmbXQKLSAqLwotU0RMX1JlY3QgKiogU0RMX0xpc3RNb2RlcyAoU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQlTRExfUmVjdCAqKm1vZGVzOwotCi0JbW9kZXMgPSBOVUxMOwotCWlmICggU0RMX1ZpZGVvU3VyZmFjZSApIHsKLQkJaWYgKCBmb3JtYXQgPT0gTlVMTCApIHsKLQkJCWZvcm1hdCA9IFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdDsKLQkJfQotCQltb2RlcyA9IHZpZGVvLT5MaXN0TW9kZXModGhpcywgZm9ybWF0LCBmbGFncyk7Ci0JfQotCXJldHVybihtb2Rlcyk7Ci19Ci0KLS8qCi0gKiBDaGVjayB0byBzZWUgaWYgYSBwYXJ0aWN1bGFyIHZpZGVvIG1vZGUgaXMgc3VwcG9ydGVkLgotICogSXQgcmV0dXJucyAwIGlmIHRoZSByZXF1ZXN0ZWQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBiaXQgZGVwdGgsCi0gKiBvciByZXR1cm5zIHRoZSBiaXRzLXBlci1waXhlbCBvZiB0aGUgY2xvc2VzdCBhdmFpbGFibGUgbW9kZSB3aXRoIHRoZQotICogZ2l2ZW4gd2lkdGggYW5kIGhlaWdodC4gIElmIHRoaXMgYml0cy1wZXItcGl4ZWwgaXMgZGlmZmVyZW50IGZyb20gdGhlCi0gKiBvbmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIHZpZGVvIG1vZGUsIFNETF9TZXRWaWRlb01vZGUoKSB3aWxsIHN1Y2NlZWQsCi0gKiBidXQgd2lsbCBlbXVsYXRlIHRoZSByZXF1ZXN0ZWQgYml0cy1wZXItcGl4ZWwgd2l0aCBhIHNoYWRvdyBzdXJmYWNlLgotICovCi1zdGF0aWMgVWludDggU0RMX2Nsb3Nlc3RfZGVwdGhzWzRdWzhdID0gewotCS8qIDggYml0IGNsb3Nlc3QgZGVwdGggb3JkZXJpbmcgKi8KLQl7IDAsIDgsIDE2LCAxNSwgMzIsIDI0LCAwLCAwIH0sCi0JLyogMTUsMTYgYml0IGNsb3Nlc3QgZGVwdGggb3JkZXJpbmcgKi8KLQl7IDAsIDE2LCAxNSwgMzIsIDI0LCA4LCAwLCAwIH0sCi0JLyogMjQgYml0IGNsb3Nlc3QgZGVwdGggb3JkZXJpbmcgKi8KLQl7IDAsIDI0LCAzMiwgMTYsIDE1LCA4LCAwLCAwIH0sCi0JLyogMzIgYml0IGNsb3Nlc3QgZGVwdGggb3JkZXJpbmcgKi8KLQl7IDAsIDMyLCAxNiwgMTUsIDI0LCA4LCAwLCAwIH0KLX07Ci0KLQotI2lmZGVmIF9fTUFDT1NfXyAvKiBNUFcgb3B0aW1pemF0aW9uIGJ1Zz8gKi8KLSNkZWZpbmUgTkVHQVRJVkVfT05FIDB4RkZGRkZGRkYKLSNlbHNlCi0jZGVmaW5lIE5FR0FUSVZFX09ORSAtMQotI2VuZGlmCi0KLWludCBTRExfVmlkZW9Nb2RlT0sgKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQotewotCWludCB0YWJsZSwgYiwgaTsKLQlpbnQgc3VwcG9ydGVkOwotCVNETF9QaXhlbEZvcm1hdCBmb3JtYXQ7Ci0JU0RMX1JlY3QgKipzaXplczsKLQotCS8qIEN1cnJlbnRseSAxIGFuZCA0IGJwcCBhcmUgbm90IHN1cHBvcnRlZCAqLwotCWlmICggYnBwIDwgOCB8fCBicHAgPiAzMiApIHsKLQkJcmV0dXJuKDApOwotCX0KLQlpZiAoICh3aWR0aCA8PSAwKSB8fCAoaGVpZ2h0IDw9IDApICkgewotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyogU2VhcmNoIHRocm91Z2ggdGhlIGxpc3QgdmFsaWQgb2YgbW9kZXMgKi8KLQlTRExfbWVtc2V0KCZmb3JtYXQsIDAsIHNpemVvZihmb3JtYXQpKTsKLQlzdXBwb3J0ZWQgPSAwOwotCXRhYmxlID0gKChicHArNykvOCktMTsKLQlTRExfY2xvc2VzdF9kZXB0aHNbdGFibGVdWzBdID0gYnBwOwotCVNETF9jbG9zZXN0X2RlcHRoc1t0YWJsZV1bN10gPSAwOwotCWZvciAoIGIgPSAwOyAhc3VwcG9ydGVkICYmIFNETF9jbG9zZXN0X2RlcHRoc1t0YWJsZV1bYl07ICsrYiApIHsKLQkJZm9ybWF0LkJpdHNQZXJQaXhlbCA9IFNETF9jbG9zZXN0X2RlcHRoc1t0YWJsZV1bYl07Ci0JCXNpemVzID0gU0RMX0xpc3RNb2RlcygmZm9ybWF0LCBmbGFncyk7Ci0JCWlmICggc2l6ZXMgPT0gKFNETF9SZWN0ICoqKTAgKSB7Ci0JCQkvKiBObyBzaXplcyBzdXBwb3J0ZWQgYXQgdGhpcyBiaXQtZGVwdGggKi8KLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UKLQkJaWYgKHNpemVzID09IChTRExfUmVjdCAqKilORUdBVElWRV9PTkUpIHsKLQkJCS8qIEFueSBzaXplIHN1cHBvcnRlZCBhdCB0aGlzIGJpdC1kZXB0aCAqLwotCQkJc3VwcG9ydGVkID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGN1cnJlbnRfdmlkZW8tPmhhbmRsZXNfYW55X3NpemUpIHsKLQkJCS8qIERyaXZlciBjYW4gY2VudGVyIGEgc21hbGxlciBzdXJmYWNlIHRvIHNpbXVsYXRlIGZ1bGxzY3JlZW4gKi8KLQkJCWZvciAoIGk9MDsgc2l6ZXNbaV07ICsraSApIHsKLQkJCQlpZiAoKHNpemVzW2ldLT53ID49IHdpZHRoKSAmJiAoc2l6ZXNbaV0tPmggPj0gaGVpZ2h0KSkgewotCQkJCQlzdXBwb3J0ZWQgPSAxOyAvKiB0aGlzIG1vZGUgY2FuIGZpdCB0aGUgY2VudGVyZWQgd2luZG93LiAqLwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZQotCQlmb3IgKCBpPTA7IHNpemVzW2ldOyArK2kgKSB7Ci0JCQlpZiAoKHNpemVzW2ldLT53ID09IHdpZHRoKSAmJiAoc2l6ZXNbaV0tPmggPT0gaGVpZ2h0KSkgewotCQkJCXN1cHBvcnRlZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCBzdXBwb3J0ZWQgKSB7Ci0JCS0tYjsKLQkJcmV0dXJuKFNETF9jbG9zZXN0X2RlcHRoc1t0YWJsZV1bYl0pOwotCX0gZWxzZSB7Ci0JCXJldHVybigwKTsKLQl9Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIGNsb3Nlc3Qgbm9uLWVtdWxhdGVkIHZpZGVvIG1vZGUgdG8gdGhlIG9uZSByZXF1ZXN0ZWQKLSAqLwotc3RhdGljIGludCBTRExfR2V0VmlkZW9Nb2RlIChpbnQgKncsIGludCAqaCwgaW50ICpCaXRzUGVyUGl4ZWwsIFVpbnQzMiBmbGFncykKLXsKLQlpbnQgdGFibGUsIGIsIGk7Ci0JaW50IHN1cHBvcnRlZDsKLQlpbnQgbmF0aXZlX2JwcDsKLQlTRExfUGl4ZWxGb3JtYXQgZm9ybWF0OwotCVNETF9SZWN0ICoqc2l6ZXM7Ci0KLQkvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0JaWYgKCAqQml0c1BlclBpeGVsIDwgOCB8fCAqQml0c1BlclBpeGVsID4gMzIgKSB7Ci0JCVNETF9TZXRFcnJvcigiSW52YWxpZCBiaXRzIHBlciBwaXhlbCAocmFuZ2UgaXMgezguLi4zMn0pIik7Ci0JCXJldHVybigwKTsKLQl9Ci0JaWYgKCgqdyA8PSAwKSB8fCAoKmggPD0gMCkpIHsKLQkJU0RMX1NldEVycm9yKCJJbnZhbGlkIHdpZHRoIG9yIGhlaWdodCIpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyogVHJ5IHRoZSBvcmlnaW5hbCB2aWRlbyBtb2RlLCBnZXQgdGhlIGNsb3Nlc3QgZGVwdGggKi8KLQluYXRpdmVfYnBwID0gU0RMX1ZpZGVvTW9kZU9LKCp3LCAqaCwgKkJpdHNQZXJQaXhlbCwgZmxhZ3MpOwotCWlmICggbmF0aXZlX2JwcCA9PSAqQml0c1BlclBpeGVsICkgewotCQlyZXR1cm4oMSk7Ci0JfQotCWlmICggbmF0aXZlX2JwcCA+IDAgKSB7Ci0JCSpCaXRzUGVyUGl4ZWwgPSBuYXRpdmVfYnBwOwotCQlyZXR1cm4oMSk7Ci0JfQotCi0JLyogTm8gZXhhY3Qgc2l6ZSBtYXRjaCBhdCBhbnkgZGVwdGgsIGxvb2sgZm9yIGNsb3Nlc3QgbWF0Y2ggKi8KLQlTRExfbWVtc2V0KCZmb3JtYXQsIDAsIHNpemVvZihmb3JtYXQpKTsKLQlzdXBwb3J0ZWQgPSAwOwotCXRhYmxlID0gKCgqQml0c1BlclBpeGVsKzcpLzgpLTE7Ci0JU0RMX2Nsb3Nlc3RfZGVwdGhzW3RhYmxlXVswXSA9ICpCaXRzUGVyUGl4ZWw7Ci0JU0RMX2Nsb3Nlc3RfZGVwdGhzW3RhYmxlXVs3XSA9IFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCWZvciAoIGIgPSAwOyAhc3VwcG9ydGVkICYmIFNETF9jbG9zZXN0X2RlcHRoc1t0YWJsZV1bYl07ICsrYiApIHsKLQkJaW50IGJlc3Q7Ci0KLQkJZm9ybWF0LkJpdHNQZXJQaXhlbCA9IFNETF9jbG9zZXN0X2RlcHRoc1t0YWJsZV1bYl07Ci0JCXNpemVzID0gU0RMX0xpc3RNb2RlcygmZm9ybWF0LCBmbGFncyk7Ci0JCWlmICggc2l6ZXMgPT0gKFNETF9SZWN0ICoqKTAgKSB7Ci0JCQkvKiBObyBzaXplcyBzdXBwb3J0ZWQgYXQgdGhpcyBiaXQtZGVwdGggKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWJlc3Q9MDsKLQkJZm9yICggaT0wOyBzaXplc1tpXTsgKytpICkgewotCQkJLyogTW9kZSB3aXRoIGJvdGggZGltZW5zaW9ucyBiaWdnZXIgb3IgZXF1YWwgdGhhbiBhc2tlZCA/ICovCi0JCQlpZiAoKHNpemVzW2ldLT53ID49ICp3KSAmJiAoc2l6ZXNbaV0tPmggPj0gKmgpKSB7Ci0JCQkJLyogTW9kZSB3aXRoIGFueSBkaW1lbnNpb24gc21hbGxlciBvciBlcXVhbCB0aGFuIGN1cnJlbnQgYmVzdCA/ICovCi0JCQkJaWYgKChzaXplc1tpXS0+dyA8PSBzaXplc1tiZXN0XS0+dykgfHwgKHNpemVzW2ldLT5oIDw9IHNpemVzW2Jlc3RdLT5oKSkgewotCQkJCQkvKiBOb3cgY2hvb3NlIHRoZSBtb2RlIHRoYXQgaGFzIGxlc3MgcGl4ZWxzICovCi0JCQkJCWlmICgoc2l6ZXNbaV0tPncgKiBzaXplc1tpXS0+aCkgPD0gKHNpemVzW2Jlc3RdLT53ICogc2l6ZXNbYmVzdF0tPmgpKSB7Ci0JCQkJCQliZXN0PWk7Ci0JCQkJCQlzdXBwb3J0ZWQgPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzdXBwb3J0ZWQpIHsKLQkJCSp3PXNpemVzW2Jlc3RdLT53OwotCQkJKmg9c2l6ZXNbYmVzdF0tPmg7Ci0JCQkqQml0c1BlclBpeGVsID0gU0RMX2Nsb3Nlc3RfZGVwdGhzW3RhYmxlXVtiXTsKLQkJfQotCX0KLQlpZiAoICEgc3VwcG9ydGVkICkgewotCQlTRExfU2V0RXJyb3IoIk5vIHZpZGVvIG1vZGUgbGFyZ2UgZW5vdWdoIGZvciAlZHglZCIsICp3LCAqaCk7Ci0JfQotCXJldHVybihzdXBwb3J0ZWQpOwotfQotCi0vKiBUaGlzIHNob3VsZCBwcm9iYWJseSBnbyBzb21ld2hlcmUgZWxzZSAtLSBsaWtlIFNETF9zdXJmYWNlLmMgKi8KLXN0YXRpYyB2b2lkIFNETF9DbGVhclN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JVWludDMyIGJsYWNrOwotCi0JYmxhY2sgPSBTRExfTWFwUkdCKHN1cmZhY2UtPmZvcm1hdCwgMCwgMCwgMCk7Ci0JU0RMX0ZpbGxSZWN0KHN1cmZhY2UsIE5VTEwsIGJsYWNrKTsKLQlpZiAoKHN1cmZhY2UtPmZsYWdzJlNETF9IV1NVUkZBQ0UpICYmIChzdXJmYWNlLT5mbGFncyZTRExfRE9VQkxFQlVGKSkgewotCQlTRExfRmxpcChzdXJmYWNlKTsKLQkJU0RMX0ZpbGxSZWN0KHN1cmZhY2UsIE5VTEwsIGJsYWNrKTsKLQl9Ci0JU0RMX0ZsaXAoc3VyZmFjZSk7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYSBzaGFkb3cgc3VyZmFjZSBzdWl0YWJsZSBmb3IgZm9vbGluZyB0aGUgYXBwLiA6LSkKLSAqLwotc3RhdGljIHZvaWQgU0RMX0NyZWF0ZVNoYWRvd1N1cmZhY2UoaW50IGRlcHRoKQotewotCVVpbnQzMiBSbWFzaywgR21hc2ssIEJtYXNrOwotCi0JLyogQWxsb2NhdGUgdGhlIHNoYWRvdyBzdXJmYWNlICovCi0JaWYgKCBkZXB0aCA9PSAoU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0KS0+Qml0c1BlclBpeGVsICkgewotCQlSbWFzayA9IChTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQpLT5SbWFzazsKLQkJR21hc2sgPSAoU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0KS0+R21hc2s7Ci0JCUJtYXNrID0gKFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdCktPkJtYXNrOwotCX0gZWxzZSB7Ci0JCVJtYXNrID0gR21hc2sgPSBCbWFzayA9IDA7Ci0JfQotCVNETF9TaGFkb3dTdXJmYWNlID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwKLQkJCQlTRExfVmlkZW9TdXJmYWNlLT53LCBTRExfVmlkZW9TdXJmYWNlLT5oLAotCQkJCQkJZGVwdGgsIFJtYXNrLCBHbWFzaywgQm1hc2ssIDApOwotCWlmICggU0RMX1NoYWRvd1N1cmZhY2UgPT0gTlVMTCApIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qIDgtYml0IHNoYWRvdyBzdXJmYWNlcyByZXBvcnQgdGhhdCB0aGV5IGhhdmUgZXhjbHVzaXZlIHBhbGV0dGUgKi8KLQlpZiAoIFNETF9TaGFkb3dTdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUgKSB7Ci0JCVNETF9TaGFkb3dTdXJmYWNlLT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOwotCQlpZiAoIGRlcHRoID09IChTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQpLT5CaXRzUGVyUGl4ZWwgKSB7Ci0JCQlTRExfbWVtY3B5KFNETF9TaGFkb3dTdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9ycywKLQkJCQlTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9ycywKLQkJCQlTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnMqCi0JCQkJCQkJc2l6ZW9mKFNETF9Db2xvcikpOwotCQl9IGVsc2UgewotCQkJU0RMX0RpdGhlckNvbG9ycygKLQkJCVNETF9TaGFkb3dTdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9ycywgZGVwdGgpOwotCQl9Ci0JfQotCi0JLyogSWYgdGhlIHZpZGVvIHN1cmZhY2UgaXMgcmVzaXphYmxlLCB0aGUgc2hhZG93IHNob3VsZCBzYXkgc28gKi8KLQlpZiAoIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9SRVNJWkFCTEUpID09IFNETF9SRVNJWkFCTEUgKSB7Ci0JCVNETF9TaGFkb3dTdXJmYWNlLT5mbGFncyB8PSBTRExfUkVTSVpBQkxFOwotCX0KLQkvKiBJZiB0aGUgdmlkZW8gc3VyZmFjZSBoYXMgbm8gZnJhbWUsIHRoZSBzaGFkb3cgc2hvdWxkIHNheSBzbyAqLwotCWlmICggKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX05PRlJBTUUpID09IFNETF9OT0ZSQU1FICkgewotCQlTRExfU2hhZG93U3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX05PRlJBTUU7Ci0JfQotCS8qIElmIHRoZSB2aWRlbyBzdXJmYWNlIGlzIGZ1bGxzY3JlZW4sIHRoZSBzaGFkb3cgc2hvdWxkIHNheSBzbyAqLwotCWlmICggKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgewotCQlTRExfU2hhZG93U3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47Ci0JfQotCS8qIElmIHRoZSB2aWRlbyBzdXJmYWNlIGlzIGZsaXBwYWJsZSwgdGhlIHNoYWRvdyBzaG91bGQgc2F5IHNvICovCi0JaWYgKCAoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGICkgewotCQlTRExfU2hhZG93U3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX0RPVUJMRUJVRjsKLQl9Ci0JcmV0dXJuOwotfQotCi0jaWZkZWYgX19RTlhOVE9fXwotICAgICNpbmNsdWRlIDxzeXMvbmV1dHJpbm8uaD4KLSNlbmRpZiAvKiBfX1FOWE5UT19fICovCi0KLS8qCi0gKiBTZXQgdGhlIHJlcXVlc3RlZCB2aWRlbyBtb2RlLCBhbGxvY2F0aW5nIGEgc2hhZG93IGJ1ZmZlciBpZiBuZWNlc3NhcnkuCi0gKi8KLVNETF9TdXJmYWNlICogU0RMX1NldFZpZGVvTW9kZSAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbywgKnRoaXM7Ci0JU0RMX1N1cmZhY2UgKnByZXZfbW9kZSwgKm1vZGU7Ci0JaW50IHZpZGVvX3c7Ci0JaW50IHZpZGVvX2g7Ci0JaW50IHZpZGVvX2JwcDsKLQlpbnQgaXNfb3BlbmdsOwotCVNETF9HcmFiTW9kZSBzYXZlZF9ncmFiOwotCi0JLyogU3RhcnQgdXAgdGhlIHZpZGVvIGRyaXZlciwgaWYgbmVjZXNzYXJ5Li4KLQkgICBXQVJOSU5HOiBUaGlzIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIHByb3RlY3RlZCB0aGlzIHdheSEKLQkgKi8KLQlpZiAoICEgY3VycmVudF92aWRlbyApIHsKLQkJaWYgKCBTRExfSW5pdChTRExfSU5JVF9WSURFT3xTRExfSU5JVF9OT1BBUkFDSFVURSkgPCAwICkgewotCQkJcmV0dXJuKE5VTEwpOwotCQl9Ci0JfQotCXRoaXMgPSB2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0KLQkvKiBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IHdpZHRoIGFuZCBoZWlnaHQgKi8KLQlpZiAoIHdpZHRoID09IDAgKSB7Ci0JCXdpZHRoID0gdmlkZW8tPmluZm8uY3VycmVudF93OwotCX0KLQlpZiAoIGhlaWdodCA9PSAwICkgewotCQloZWlnaHQgPSB2aWRlby0+aW5mby5jdXJyZW50X2g7Ci0JfQotCS8qIERlZmF1bHQgdG8gdGhlIGN1cnJlbnQgdmlkZW8gYnBwICovCi0JaWYgKCBicHAgPT0gMCApIHsKLQkJZmxhZ3MgfD0gU0RMX0FOWUZPUk1BVDsKLQkJYnBwID0gU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7Ci0JfQotCi0JLyogR2V0IGEgZ29vZCB2aWRlbyBtb2RlLCB0aGUgY2xvc2VzdCBvbmUgcG9zc2libGUgKi8KLQl2aWRlb193ID0gd2lkdGg7Ci0JdmlkZW9faCA9IGhlaWdodDsKLQl2aWRlb19icHAgPSBicHA7Ci0JaWYgKCAhIFNETF9HZXRWaWRlb01vZGUoJnZpZGVvX3csICZ2aWRlb19oLCAmdmlkZW9fYnBwLCBmbGFncykgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBDaGVjayB0aGUgcmVxdWVzdGVkIGZsYWdzICovCi0JLyogVGhlcmUncyBubyBwYWxldHRlIGluID4gOCBiaXRzLXBlci1waXhlbCBtb2RlICovCi0JaWYgKCB2aWRlb19icHAgPiA4ICkgewotCQlmbGFncyAmPSB+U0RMX0hXUEFMRVRURTsKLQl9Ci0jaWYgMAotCWlmICggKGZsYWdzJlNETF9GVUxMU0NSRUVOKSAhPSBTRExfRlVMTFNDUkVFTiApIHsKLQkJLyogVGhlcmUncyBubyB3aW5kb3dlZCBkb3VibGUtYnVmZmVyaW5nICovCi0JCWZsYWdzICY9IH5TRExfRE9VQkxFQlVGOwotCX0KLSNlbmRpZgotCWlmICggKGZsYWdzJlNETF9ET1VCTEVCVUYpID09IFNETF9ET1VCTEVCVUYgKSB7Ci0JCS8qIFVzZSBoYXJkd2FyZSBzdXJmYWNlcyB3aGVuIGRvdWJsZS1idWZmZXJpbmcgKi8KLQkJZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKLQl9Ci0KLQlpc19vcGVuZ2wgPSAoICggZmxhZ3MgJiBTRExfT1BFTkdMICkgPT0gU0RMX09QRU5HTCApOwotCWlmICggaXNfb3BlbmdsICkgewotCQkvKiBUaGVzZSBmbGFncyBhcmUgZm9yIDJEIHZpZGVvIG1vZGVzIG9ubHkgKi8KLQkJZmxhZ3MgJj0gfihTRExfSFdTVVJGQUNFfFNETF9ET1VCTEVCVUYpOwotCX0KLQotCS8qIFJlc2V0IHRoZSBrZXlib2FyZCBoZXJlIHNvIGV2ZW50IGNhbGxiYWNrcyBjYW4gcnVuICovCi0JU0RMX1Jlc2V0S2V5Ym9hcmQoKTsKLQlTRExfUmVzZXRNb3VzZSgpOwotCVNETF9jdXJzb3JzdGF0ZSAmPSB+Q1VSU09SX1VTSU5HU1c7Ci0KLQkvKiBDbGVhbiB1cCBhbnkgcHJldmlvdXMgdmlkZW8gbW9kZSAqLwotCWlmICggU0RMX1B1YmxpY1N1cmZhY2UgIT0gTlVMTCApIHsKLQkJU0RMX1B1YmxpY1N1cmZhY2UgPSBOVUxMOwotCX0KLQlpZiAoIFNETF9TaGFkb3dTdXJmYWNlICE9IE5VTEwgKSB7Ci0JCVNETF9TdXJmYWNlICpyZWFkeV90b19nbzsKLQkJcmVhZHlfdG9fZ28gPSBTRExfU2hhZG93U3VyZmFjZTsKLQkJU0RMX1NoYWRvd1N1cmZhY2UgPSBOVUxMOwotCQlTRExfRnJlZVN1cmZhY2UocmVhZHlfdG9fZ28pOwotCX0KLQlpZiAoIHZpZGVvLT5waHlzcGFsICkgewotCQlTRExfZnJlZSh2aWRlby0+cGh5c3BhbC0+Y29sb3JzKTsKLQkJU0RMX2ZyZWUodmlkZW8tPnBoeXNwYWwpOwotCQl2aWRlby0+cGh5c3BhbCA9IE5VTEw7Ci0JfQotCWlmKCB2aWRlby0+Z2FtbWFjb2xzKSB7Ci0JCVNETF9mcmVlKHZpZGVvLT5nYW1tYWNvbHMpOwotCQl2aWRlby0+Z2FtbWFjb2xzID0gTlVMTDsKLQl9Ci0KLQkvKiBTYXZlIHRoZSBwcmV2aW91cyBncmFiIHN0YXRlIGFuZCB0dXJuIG9mZiBncmFiIGZvciBtb2RlIHN3aXRjaCAqLwotCXNhdmVkX2dyYWIgPSBTRExfV01fR3JhYklucHV0T2ZmKCk7Ci0KLQkvKiBUcnkgdG8gc2V0IHRoZSB2aWRlbyBtb2RlLCBhbG9uZyB3aXRoIG9mZnNldCBhbmQgY2xpcHBpbmcgKi8KLQlwcmV2X21vZGUgPSBTRExfVmlkZW9TdXJmYWNlOwotCVNETF9Mb2NrQ3Vyc29yKCk7Ci0JU0RMX1ZpZGVvU3VyZmFjZSA9IE5VTEw7CS8qIEluIGNhc2UgaXQncyBmcmVlZCBieSBkcml2ZXIgKi8KLQltb2RlID0gdmlkZW8tPlNldFZpZGVvTW9kZSh0aGlzLCBwcmV2X21vZGUsdmlkZW9fdyx2aWRlb19oLHZpZGVvX2JwcCxmbGFncyk7Ci0JaWYgKCBtb2RlICkgeyAvKiBQcmV2ZW50IHJlc2l6ZSBldmVudHMgZnJvbSBtb2RlIGNoYW5nZSAqLwotICAgICAgICAgIC8qIEJ1dCBub3Qgb24gT1MvMiAqLwotI2lmbmRlZiBfX09TMl9fCi0JICAgIFNETF9Qcml2YXRlUmVzaXplKG1vZGUtPncsIG1vZGUtPmgpOwotI2VuZGlmCi0KLQkgICAgLyogU2FtIC0gSWYgd2UgYXNrZWQgZm9yIE9wZW5HTCBtb2RlLCBhbmQgZGlkbid0IGdldCBpdCwgZmFpbCAqLwotCSAgICBpZiAoIGlzX29wZW5nbCAmJiAhKG1vZGUtPmZsYWdzICYgU0RMX09QRU5HTCkgKSB7Ci0JCW1vZGUgPSBOVUxMOwotCQlTRExfU2V0RXJyb3IoIk9wZW5HTCBub3QgYXZhaWxhYmxlIik7Ci0JICAgIH0KLQl9Ci0JLyoKLQkgKiByY2cxMTI5MjAwMAotCSAqIElmIHlvdSB0cnkgdG8gc2V0IGFuIFNETF9PUEVOR0wgc3VyZmFjZSwgYW5kIGZhaWwgdG8gZmluZCBhCi0JICogbWF0Y2hpbmcgIHZpc3VhbCwgdGhlbiB0aGUgbmV4dCBjYWxsIHRvIFNETF9TZXRWaWRlb01vZGUoKQotCSAqIHdpbGwgc2VnZmF1bHQsIHNpbmNlICB3ZSBubyBsb25nZXIgcG9pbnQgdG8gYSBkdW1teSBzdXJmYWNlLAotCSAqIGJ1dCByYXRoZXIgTlVMTC4KLQkgKiBTYW0gMTEvMjkvMDAKLQkgKiBXQVJOSU5HLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwcmV2aW91cyBtb2RlIGhhc24ndAotCSAqIGFscmVhZHkgYmVlbiBmcmVlZCBieSB0aGUgdmlkZW8gZHJpdmVyLiAgV2hhdCBkbyB3ZSBkbyBpbgotCSAqIHRoYXQgY2FzZT8gIFNob3VsZCB3ZSBjYWxsIFNETF9WaWRlb0luaXQoKSBhZ2Fpbj8KLQkgKi8KLQlTRExfVmlkZW9TdXJmYWNlID0gKG1vZGUgIT0gTlVMTCkgPyBtb2RlIDogcHJldl9tb2RlOwotCi0JaWYgKCAobW9kZSAhPSBOVUxMKSAmJiAoIWlzX29wZW5nbCkgKSB7Ci0JCS8qIFNhbml0eSBjaGVjayAqLwotCQlpZiAoIChtb2RlLT53IDwgd2lkdGgpIHx8IChtb2RlLT5oIDwgaGVpZ2h0KSApIHsKLQkJCVNETF9TZXRFcnJvcigiVmlkZW8gbW9kZSBzbWFsbGVyIHRoYW4gcmVxdWVzdGVkIik7Ci0JCQlyZXR1cm4oTlVMTCk7Ci0JCX0KLQotCQkvKiBJZiB3ZSBoYXZlIGEgcGFsZXR0aXplZCBzdXJmYWNlLCBjcmVhdGUgYSBkZWZhdWx0IHBhbGV0dGUgKi8KLQkJaWYgKCBtb2RlLT5mb3JtYXQtPnBhbGV0dGUgKSB7Ci0JCQlTRExfUGl4ZWxGb3JtYXQgKnZmID0gbW9kZS0+Zm9ybWF0OwotCQkJU0RMX0RpdGhlckNvbG9ycyh2Zi0+cGFsZXR0ZS0+Y29sb3JzLCB2Zi0+Qml0c1BlclBpeGVsKTsKLQkJCXZpZGVvLT5TZXRDb2xvcnModGhpcywgMCwgdmYtPnBhbGV0dGUtPm5jb2xvcnMsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICB2Zi0+cGFsZXR0ZS0+Y29sb3JzKTsKLQkJfQotCi0JCS8qIENsZWFyIHRoZSBzdXJmYWNlIHRvIGJsYWNrICovCi0JCXZpZGVvLT5vZmZzZXRfeCA9IDA7Ci0JCXZpZGVvLT5vZmZzZXRfeSA9IDA7Ci0JCW1vZGUtPm9mZnNldCA9IDA7Ci0JCVNETF9TZXRDbGlwUmVjdChtb2RlLCBOVUxMKTsKLQkJU0RMX0NsZWFyU3VyZmFjZShtb2RlKTsKLQotCQkvKiBOb3cgYWRqdXN0IHRoZSBvZmZzZXRzIHRvIG1hdGNoIHRoZSBkZXNpcmVkIG1vZGUgKi8KLQkJdmlkZW8tPm9mZnNldF94ID0gKG1vZGUtPnctd2lkdGgpLzI7Ci0JCXZpZGVvLT5vZmZzZXRfeSA9IChtb2RlLT5oLWhlaWdodCkvMjsKLQkJbW9kZS0+b2Zmc2V0ID0gdmlkZW8tPm9mZnNldF95Km1vZGUtPnBpdGNoICsKLQkJCQl2aWRlby0+b2Zmc2V0X3gqbW9kZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotI2lmZGVmIERFQlVHX1ZJREVPCi0gIGZwcmludGYoc3RkZXJyLAotCSJSZXF1ZXN0ZWQgbW9kZTogJWR4JWR4JWQsIG9idGFpbmVkIG1vZGUgJWR4JWR4JWQgKG9mZnNldCAlZClcbiIsCi0JCXdpZHRoLCBoZWlnaHQsIGJwcCwKLQkJbW9kZS0+dywgbW9kZS0+aCwgbW9kZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwsIG1vZGUtPm9mZnNldCk7Ci0jZW5kaWYKLQkJbW9kZS0+dyA9IHdpZHRoOwotCQltb2RlLT5oID0gaGVpZ2h0OwotCQlTRExfU2V0Q2xpcFJlY3QobW9kZSwgTlVMTCk7Ci0JfQotCVNETF9SZXNldEN1cnNvcigpOwotCVNETF9VbmxvY2tDdXJzb3IoKTsKLQotCS8qIElmIHdlIGZhaWxlZCBzZXR0aW5nIGEgdmlkZW8gbW9kZSwgcmV0dXJuIE5VTEwuLi4gKFVoIE9oISkgKi8KLQlpZiAoIG1vZGUgPT0gTlVMTCApIHsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIElmIHRoZXJlIGlzIG5vIHdpbmRvdyBtYW5hZ2VyLCBzZXQgdGhlIFNETF9OT0ZSQU1FIGZsYWcgKi8KLQlpZiAoICEgdmlkZW8tPmluZm8ud21fYXZhaWxhYmxlICkgewotCQltb2RlLT5mbGFncyB8PSBTRExfTk9GUkFNRTsKLQl9Ci0KLQkvKiBSZXNldCB0aGUgbW91c2UgY3Vyc29yIGFuZCBncmFiIGZvciBuZXcgdmlkZW8gbW9kZSAqLwotCVNETF9TZXRDdXJzb3IoTlVMTCk7Ci0JaWYgKCB2aWRlby0+VXBkYXRlTW91c2UgKSB7Ci0JCXZpZGVvLT5VcGRhdGVNb3VzZSh0aGlzKTsKLQl9Ci0JU0RMX1dNX0dyYWJJbnB1dChzYXZlZF9ncmFiKTsKLQlTRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlKE5VTEwsIE5VTEwpOyAvKiBDbGVhciBmaXJzdCBsYXJnZSBkZWx0YSAqLwotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotCS8qIExvYWQgR0wgc3ltYm9scyAoYmVmb3JlIE1ha2VDdXJyZW50LCB3aGVyZSB3ZSBuZWVkIGdsR2V0U3RyaW5nKS4gKi8KLQlpZiAoIGZsYWdzICYgKFNETF9PUEVOR0wgfCBTRExfT1BFTkdMQkxJVCkgKSB7Ci0KLSNpZiBkZWZpbmVkKF9fUU5YTlRPX18pICYmIChfTlRPX1ZFUlNJT04gPCA2MzApCi0jZGVmaW5lIF9fU0RMX05PR0VUUFJPQ0FERFJfXwotI2VsaWYgZGVmaW5lZChfX01JTlRfXykKLSNkZWZpbmUgX19TRExfTk9HRVRQUk9DQUREUl9fCi0jZW5kaWYKLSNpZmRlZiBfX1NETF9OT0dFVFBST0NBRERSX18KLSAgICAjZGVmaW5lIFNETF9QUk9DKHJldCxmdW5jLHBhcmFtcykgdmlkZW8tPmZ1bmM9ZnVuYzsKLSNlbHNlCi0gICAgI2RlZmluZSBTRExfUFJPQyhyZXQsZnVuYyxwYXJhbXMpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgdmlkZW8tPmZ1bmMgPSBTRExfR0xfR2V0UHJvY0FkZHJlc3MoI2Z1bmMpOyBcCi0gICAgICAgIGlmICggISB2aWRlby0+ZnVuYyApIHsgXAotICAgICAgICAgICAgU0RMX1NldEVycm9yKCJDb3VsZG4ndCBsb2FkIEdMIGZ1bmN0aW9uICVzOiAlc1xuIiwgI2Z1bmMsIFNETF9HZXRFcnJvcigpKTsgXAotICAgICAgICByZXR1cm4oTlVMTCk7IFwKLSAgICAgICAgfSBcCi0gICAgfSB3aGlsZSAoIDAgKTsKLQotI2VuZGlmIC8qIF9fU0RMX05PR0VUUFJPQ0FERFJfXyAqLwotCi0jaW5jbHVkZSAiU0RMX2dsZnVuY3MuaCIKLSN1bmRlZiBTRExfUFJPQwotCX0KLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi0KLQkvKiBJZiB3ZSdyZSBydW5uaW5nIE9wZW5HTCwgbWFrZSB0aGUgY29udGV4dCBjdXJyZW50ICovCi0JaWYgKCAodmlkZW8tPnNjcmVlbi0+ZmxhZ3MgJiBTRExfT1BFTkdMKSAmJgotCSAgICAgIHZpZGVvLT5HTF9NYWtlQ3VycmVudCApIHsKLQkJaWYgKCB2aWRlby0+R0xfTWFrZUN1cnJlbnQodGhpcykgPCAwICkgewotCQkJcmV0dXJuKE5VTEwpOwotCQl9Ci0JfQotCi0JLyogU2V0IHVwIGEgZmFrZSBTREwgc3VyZmFjZSBmb3IgT3BlbkdMICJibGl0dGluZyIgKi8KLQlpZiAoIChmbGFncyAmIFNETF9PUEVOR0xCTElUKSA9PSBTRExfT1BFTkdMQkxJVCApIHsKLQkJLyogTG9hZCBHTCBmdW5jdGlvbnMgZm9yIHBlcmZvcm1pbmcgdGhlIHRleHR1cmUgdXBkYXRlcyAqLwotI2lmIFNETF9WSURFT19PUEVOR0wKLQotCQkvKiBDcmVhdGUgYSBzb2Z0d2FyZSBzdXJmYWNlIGZvciBibGl0dGluZyAqLwotI2lmZGVmIEdMX1ZFUlNJT05fMV8yCi0JCS8qIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBlaXRoZXIgc3VwcG9ydHMgdGhlIHBhY2tlZCBwaXhlbHMKLQkJICAgZXh0ZW5zaW9uLCBvciBpbXBsZW1lbnRzIHRoZSBjb3JlIE9wZW5HTCAxLjIgQVBJLCBpdCB3aWxsCi0JCSAgIHN1cHBvcnQgdGhlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81IHRleHR1cmUgZm9ybWF0LgotCQkgKi8KLQkJaWYgKCAoYnBwID09IDE2KSAmJgotCQkgICAgIChTRExfc3Ryc3RyKChjb25zdCBjaGFyICopdmlkZW8tPmdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpLCAiR0xfRVhUX3BhY2tlZF9waXhlbHMiKSB8fAotCQkgICAgIChTRExfYXRvZigoY29uc3QgY2hhciAqKXZpZGVvLT5nbEdldFN0cmluZyhHTF9WRVJTSU9OKSkgPj0gMS4yZikpCi0JCSAgICkgewotCQkJdmlkZW8tPmlzXzMyYml0ID0gMDsKLQkJCVNETF9WaWRlb1N1cmZhY2UgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZSgKLQkJCQlmbGFncywKLQkJCQl3aWR0aCwKLQkJCQloZWlnaHQsCi0JCQkJMTYsCi0JCQkJMzEgPDwgMTEsCi0JCQkJNjMgPDwgNSwKLQkJCQkzMSwKLQkJCQkwCi0JCQkJKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLyogT3BlbkdMIDEuMiAqLwotCQl7Ci0JCQl2aWRlby0+aXNfMzJiaXQgPSAxOwotCQkJU0RMX1ZpZGVvU3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKAotCQkJCWZsYWdzLAotCQkJCXdpZHRoLAotCQkJCWhlaWdodCwKLQkJCQkzMiwKLSNpZiBTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOCi0JCQkJMHgwMDAwMDBGRiwKLQkJCQkweDAwMDBGRjAwLAotCQkJCTB4MDBGRjAwMDAsCi0JCQkJMHhGRjAwMDAwMAotI2Vsc2UKLQkJCQkweEZGMDAwMDAwLAotCQkJCTB4MDBGRjAwMDAsCi0JCQkJMHgwMDAwRkYwMCwKLQkJCQkweDAwMDAwMEZGCi0jZW5kaWYKLQkJCQkpOwotCQl9Ci0JCWlmICggISBTRExfVmlkZW9TdXJmYWNlICkgewotCQkJcmV0dXJuKE5VTEwpOwotCQl9Ci0JCVNETF9WaWRlb1N1cmZhY2UtPmZsYWdzID0gbW9kZS0+ZmxhZ3MgfCBTRExfT1BFTkdMQkxJVDsKLQotCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCB2aWRlbyBtb2RlIHN1cmZhY2UgKGlzIHRoaXMgc2FmZT8pICovCi0JCVNETF9GcmVlU3VyZmFjZShtb2RlKTsKLQotCQkvKiBTZXQgdGhlIHN1cmZhY2UgY29tcGxldGVseSBvcGFxdWUgJiB3aGl0ZSBieSBkZWZhdWx0ICovCi0JCVNETF9tZW1zZXQoIFNETF9WaWRlb1N1cmZhY2UtPnBpeGVscywgMjU1LCBTRExfVmlkZW9TdXJmYWNlLT5oICogU0RMX1ZpZGVvU3VyZmFjZS0+cGl0Y2ggKTsKLQkJdmlkZW8tPmdsR2VuVGV4dHVyZXMoIDEsICZ2aWRlby0+dGV4dHVyZSApOwotCQl2aWRlby0+Z2xCaW5kVGV4dHVyZSggR0xfVEVYVFVSRV8yRCwgdmlkZW8tPnRleHR1cmUgKTsKLQkJdmlkZW8tPmdsVGV4SW1hZ2UyRCgKLQkJCUdMX1RFWFRVUkVfMkQsCi0JCQkwLAotCQkJdmlkZW8tPmlzXzMyYml0ID8gR0xfUkdCQSA6IEdMX1JHQiwKLQkJCTI1NiwKLQkJCTI1NiwKLQkJCTAsCi0JCQl2aWRlby0+aXNfMzJiaXQgPyBHTF9SR0JBIDogR0xfUkdCLAotI2lmZGVmIEdMX1ZFUlNJT05fMV8yCi0JCQl2aWRlby0+aXNfMzJiaXQgPyBHTF9VTlNJR05FRF9CWVRFIDogR0xfVU5TSUdORURfU0hPUlRfNV82XzUsCi0jZWxzZQotCQkJR0xfVU5TSUdORURfQllURSwKLSNlbmRpZgotCQkJTlVMTCk7Ci0KLQkJdmlkZW8tPlVwZGF0ZVJlY3RzID0gU0RMX0dMX1VwZGF0ZVJlY3RzTG9jazsKLSNlbHNlCi0JCVNETF9TZXRFcnJvcigiU29tZWJvZHkgZm9yZ290IHRvICNkZWZpbmUgU0RMX1ZJREVPX09QRU5HTCIpOwotCQlyZXR1cm4oTlVMTCk7Ci0jZW5kaWYKLQl9Ci0KLQkvKiBDcmVhdGUgYSBzaGFkb3cgc3VyZmFjZSBpZiBuZWNlc3NhcnkgKi8KLQkvKiBUaGVyZSBhcmUgdGhyZWUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB3ZSBjcmVhdGUgYSBzaGFkb3cgc3VyZmFjZToKLQkJMS4gIFdlIG5lZWQgYSBwYXJ0aWN1bGFyIGJpdHMtcGVyLXBpeGVsIHRoYXQgd2UgZGlkbid0IGdldC4KLQkJMi4gIFdlIG5lZWQgYSBoYXJkd2FyZSBwYWxldHRlIGFuZCBkaWRuJ3QgZ2V0IG9uZS4KLQkJMy4gIFdlIG5lZWQgYSBzb2Z0d2FyZSBzdXJmYWNlIGFuZCBnb3QgYSBoYXJkd2FyZSBzdXJmYWNlLgotCSovCi0JaWYgKCAhKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCkgJiYKLQkgICAgICgKLQkgICAgICggICEoZmxhZ3MmU0RMX0FOWUZPUk1BVCkgJiYKLQkJCShTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSBicHApKSB8fAotCSAgICAgKCAgIChmbGFncyZTRExfSFdQQUxFVFRFKSAmJgotCQkJCSEoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MmU0RMX0hXUEFMRVRURSkpIHx8Ci0JCS8qIElmIHRoZSBzdXJmYWNlIGlzIGluIGhhcmR3YXJlLCB2aWRlbyB3cml0ZXMgYXJlIHZpc2libGUKLQkJICAgYXMgc29vbiBhcyB0aGV5IGFyZSBwZXJmb3JtZWQsIHNvIHdlIG5lZWQgdG8gYnVmZmVyIHRoZW0KLQkJICovCi0JICAgICAoICAgKChmbGFncyZTRExfSFdTVVJGQUNFKSA9PSBTRExfU1dTVVJGQUNFKSAmJgotCQkJCShTRExfVmlkZW9TdXJmYWNlLT5mbGFncyZTRExfSFdTVVJGQUNFKSkgfHwKLQkgICAgICggICAoZmxhZ3MmU0RMX0RPVUJMRUJVRikgJiYKLQkJCQkoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MmU0RMX0hXU1VSRkFDRSkgJiYKLQkJCQkhKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzJlNETF9ET1VCTEVCVUYpKQotCSAgICAgKSApIHsKLQkJU0RMX0NyZWF0ZVNoYWRvd1N1cmZhY2UoYnBwKTsKLQkJaWYgKCBTRExfU2hhZG93U3VyZmFjZSA9PSBOVUxMICkgewotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgc2hhZG93IHN1cmZhY2UiKTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCQlTRExfUHVibGljU3VyZmFjZSA9IFNETF9TaGFkb3dTdXJmYWNlOwotCX0gZWxzZSB7Ci0JCVNETF9QdWJsaWNTdXJmYWNlID0gU0RMX1ZpZGVvU3VyZmFjZTsKLQl9Ci0JdmlkZW8tPmluZm8udmZtdCA9IFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdDsKLQl2aWRlby0+aW5mby5jdXJyZW50X3cgPSBTRExfVmlkZW9TdXJmYWNlLT53OwotCXZpZGVvLT5pbmZvLmN1cnJlbnRfaCA9IFNETF9WaWRlb1N1cmZhY2UtPmg7Ci0KLQkvKiBXZSdyZSBkb25lISAqLwotCXJldHVybihTRExfUHVibGljU3VyZmFjZSk7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgc3VyZmFjZSBpbnRvIHRoZSB2aWRlbyBwaXhlbCBmb3JtYXQuCi0gKi8KLVNETF9TdXJmYWNlICogU0RMX0Rpc3BsYXlGb3JtYXQgKFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCVVpbnQzMiBmbGFnczsKLQotCWlmICggISBTRExfUHVibGljU3VyZmFjZSApIHsKLQkJU0RMX1NldEVycm9yKCJObyB2aWRlbyBtb2RlIGhhcyBiZWVuIHNldCIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCS8qIFNldCB0aGUgZmxhZ3MgYXBwcm9wcmlhdGUgZm9yIGNvcHlpbmcgdG8gZGlzcGxheSBzdXJmYWNlICovCi0JaWYgKCgoU0RMX1B1YmxpY1N1cmZhY2UtPmZsYWdzJlNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UpICYmIGN1cnJlbnRfdmlkZW8tPmluZm8uYmxpdF9odykKLQkJZmxhZ3MgPSBTRExfSFdTVVJGQUNFOwotCWVsc2UKLQkJZmxhZ3MgPSBTRExfU1dTVVJGQUNFOwotI2lmZGVmIEFVVE9STEVfRElTUExBWUZPUk1BVAotCWZsYWdzIHw9IChzdXJmYWNlLT5mbGFncyAmIChTRExfU1JDQ09MT1JLRVl8U0RMX1NSQ0FMUEhBKSk7Ci0JZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMT0s7Ci0jZWxzZQotCWZsYWdzIHw9IHN1cmZhY2UtPmZsYWdzICYgKFNETF9TUkNDT0xPUktFWXxTRExfU1JDQUxQSEF8U0RMX1JMRUFDQ0VMT0spOwotI2VuZGlmCi0JcmV0dXJuKFNETF9Db252ZXJ0U3VyZmFjZShzdXJmYWNlLCBTRExfUHVibGljU3VyZmFjZS0+Zm9ybWF0LCBmbGFncykpOwotfQotCi0vKgotICogQ29udmVydCBhIHN1cmZhY2UgaW50byBhIGZvcm1hdCB0aGF0J3Mgc3VpdGFibGUgZm9yIGJsaXR0aW5nIHRvCi0gKiB0aGUgc2NyZWVuLCBidXQgaW5jbHVkaW5nIGFuIGFscGhhIGNoYW5uZWwuCi0gKi8KLVNETF9TdXJmYWNlICpTRExfRGlzcGxheUZvcm1hdEFscGhhKFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCVNETF9QaXhlbEZvcm1hdCAqdmY7Ci0JU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQ7Ci0JU0RMX1N1cmZhY2UgKmNvbnZlcnRlZDsKLQlVaW50MzIgZmxhZ3M7Ci0JLyogZGVmYXVsdCB0byBBUkdCODg4OCAqLwotCVVpbnQzMiBhbWFzayA9IDB4ZmYwMDAwMDA7Ci0JVWludDMyIHJtYXNrID0gMHgwMGZmMDAwMDsKLQlVaW50MzIgZ21hc2sgPSAweDAwMDBmZjAwOwotCVVpbnQzMiBibWFzayA9IDB4MDAwMDAwZmY7Ci0KLQlpZiAoICEgU0RMX1B1YmxpY1N1cmZhY2UgKSB7Ci0JCVNETF9TZXRFcnJvcigiTm8gdmlkZW8gbW9kZSBoYXMgYmVlbiBzZXQiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQl2ZiA9IFNETF9QdWJsaWNTdXJmYWNlLT5mb3JtYXQ7Ci0KLQlzd2l0Y2godmYtPkJ5dGVzUGVyUGl4ZWwpIHsKLQkgICAgY2FzZSAyOgotCQkvKiBGb3IgWEdZNVs1Nl01LCB1c2UsIEFYR1k4ODg4LCB3aGVyZSB7WCwgWX0gPSB7UiwgQn0uCi0JCSAgIEZvciBhbnl0aGluZyBlbHNlIChsaWtlIEFSR0I0NDQ0KSBpdCBkb2Vzbid0IG1hdHRlcgotCQkgICBzaW5jZSB3ZSBoYXZlIG5vIHNwZWNpYWwgY29kZSBmb3IgaXQgYW55d2F5ICovCi0JCWlmICggKHZmLT5SbWFzayA9PSAweDFmKSAmJgotCQkgICAgICh2Zi0+Qm1hc2sgPT0gMHhmODAwIHx8IHZmLT5CbWFzayA9PSAweDdjMDApKSB7Ci0JCQlybWFzayA9IDB4ZmY7Ci0JCQlibWFzayA9IDB4ZmYwMDAwOwotCQl9Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgMzoKLQkgICAgY2FzZSA0OgotCQkvKiBLZWVwIHRoZSB2aWRlbyBmb3JtYXQsIGFzIGxvbmcgYXMgdGhlIGhpZ2ggOCBiaXRzIGFyZQotCQkgICB1bnVzZWQgb3IgYWxwaGEgKi8KLQkJaWYgKCAodmYtPlJtYXNrID09IDB4ZmYpICYmICh2Zi0+Qm1hc2sgPT0gMHhmZjAwMDApICkgewotCQkJcm1hc2sgPSAweGZmOwotCQkJYm1hc2sgPSAweGZmMDAwMDsKLQkJfQotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCQkvKiBXZSBoYXZlIG5vIG90aGVyIG9wdGltaXNlZCBmb3JtYXRzIHJpZ2h0IG5vdy4gV2hlbi9pZiBhIG5ldwotCQkgICBvcHRpbWlzZWQgYWxwaGEgZm9ybWF0IGlzIHdyaXR0ZW4sIGFkZCB0aGUgY29udmVydGVyIGhlcmUgKi8KLQkJYnJlYWs7Ci0JfQotCWZvcm1hdCA9IFNETF9BbGxvY0Zvcm1hdCgzMiwgcm1hc2ssIGdtYXNrLCBibWFzaywgYW1hc2spOwotCWZsYWdzID0gU0RMX1B1YmxpY1N1cmZhY2UtPmZsYWdzICYgU0RMX0hXU1VSRkFDRTsKLQlmbGFncyB8PSBzdXJmYWNlLT5mbGFncyAmIChTRExfU1JDQUxQSEEgfCBTRExfUkxFQUNDRUxPSyk7Ci0JY29udmVydGVkID0gU0RMX0NvbnZlcnRTdXJmYWNlKHN1cmZhY2UsIGZvcm1hdCwgZmxhZ3MpOwotCVNETF9GcmVlRm9ybWF0KGZvcm1hdCk7Ci0JcmV0dXJuKGNvbnZlcnRlZCk7Ci19Ci0KLS8qCi0gKiBVcGRhdGUgYSBzcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBwaHlzaWNhbCBzY3JlZW4KLSAqLwotdm9pZCBTRExfVXBkYXRlUmVjdChTRExfU3VyZmFjZSAqc2NyZWVuLCBTaW50MzIgeCwgU2ludDMyIHksIFVpbnQzMiB3LCBVaW50MzIgaCkKLXsKLQlpZiAoIHNjcmVlbiApIHsKLQkJU0RMX1JlY3QgcmVjdDsKLQotCQkvKiBQZXJmb3JtIHNvbWUgY2hlY2tpbmcgKi8KLQkJaWYgKCB3ID09IDAgKQotCQkJdyA9IHNjcmVlbi0+dzsKLQkJaWYgKCBoID09IDAgKQotCQkJaCA9IHNjcmVlbi0+aDsKLQkJaWYgKCAoaW50KSh4K3cpID4gc2NyZWVuLT53ICkKLQkJCXJldHVybjsKLQkJaWYgKCAoaW50KSh5K2gpID4gc2NyZWVuLT5oICkKLQkJCXJldHVybjsKLQotCQkvKiBGaWxsIHRoZSByZWN0YW5nbGUgKi8KLQkJcmVjdC54ID0gKFNpbnQxNil4OwotCQlyZWN0LnkgPSAoU2ludDE2KXk7Ci0JCXJlY3QudyA9IChVaW50MTYpdzsKLQkJcmVjdC5oID0gKFVpbnQxNiloOwotCQlTRExfVXBkYXRlUmVjdHMoc2NyZWVuLCAxLCAmcmVjdCk7Ci0JfQotfQotdm9pZCBTRExfVXBkYXRlUmVjdHMgKFNETF9TdXJmYWNlICpzY3JlZW4sIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCWludCBpOwotCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87Ci0KLQlpZiAoIChzY3JlZW4tPmZsYWdzICYgKFNETF9PUEVOR0wgfCBTRExfT1BFTkdMQkxJVCkpID09IFNETF9PUEVOR0wgKSB7Ci0JCVNETF9TZXRFcnJvcigiT3BlbkdMIGFjdGl2ZSwgdXNlIFNETF9HTF9Td2FwQnVmZmVycygpIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCBzY3JlZW4gPT0gU0RMX1NoYWRvd1N1cmZhY2UgKSB7Ci0JCS8qIEJsaXQgdGhlIHNoYWRvdyBzdXJmYWNlIHVzaW5nIHNhdmVkIG1hcHBpbmcgKi8KLQkJU0RMX1BhbGV0dGUgKnBhbCA9IHNjcmVlbi0+Zm9ybWF0LT5wYWxldHRlOwotCQlTRExfQ29sb3IgKnNhdmVkX2NvbG9ycyA9IE5VTEw7Ci0JCWlmICggcGFsICYmICEoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFKSApIHsKLQkJCS8qIHNpbXVsYXRlZCA4YnBwLCB1c2UgY29ycmVjdCBwaHlzaWNhbCBwYWxldHRlICovCi0JCQlzYXZlZF9jb2xvcnMgPSBwYWwtPmNvbG9yczsKLQkJCWlmICggdmlkZW8tPmdhbW1hY29scyApIHsKLQkJCQkvKiBnYW1tYS1jb3JyZWN0ZWQgcGFsZXR0ZSAqLwotCQkJCXBhbC0+Y29sb3JzID0gdmlkZW8tPmdhbW1hY29sczsKLQkJCX0gZWxzZSBpZiAoIHZpZGVvLT5waHlzcGFsICkgewotCQkJCS8qIHBoeXNpY2FsIHBhbGV0dGUgZGlmZmVyZW50IGZyb20gbG9naWNhbCAqLwotCQkJCXBhbC0+Y29sb3JzID0gdmlkZW8tPnBoeXNwYWwtPmNvbG9yczsKLQkJCX0KLQkJfQotCQlpZiAoIFNIT1VMRF9EUkFXQ1VSU09SKFNETF9jdXJzb3JzdGF0ZSkgKSB7Ci0JCQlTRExfTG9ja0N1cnNvcigpOwotCQkJU0RMX0RyYXdDdXJzb3IoU0RMX1NoYWRvd1N1cmZhY2UpOwotCQkJZm9yICggaT0wOyBpPG51bXJlY3RzOyArK2kgKSB7Ci0JCQkJU0RMX0xvd2VyQmxpdChTRExfU2hhZG93U3VyZmFjZSwgJnJlY3RzW2ldLAotCQkJCQkJU0RMX1ZpZGVvU3VyZmFjZSwgJnJlY3RzW2ldKTsKLQkJCX0KLQkJCVNETF9FcmFzZUN1cnNvcihTRExfU2hhZG93U3VyZmFjZSk7Ci0JCQlTRExfVW5sb2NrQ3Vyc29yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIHsKLQkJCQlTRExfTG93ZXJCbGl0KFNETF9TaGFkb3dTdXJmYWNlLCAmcmVjdHNbaV0sCi0JCQkJCQlTRExfVmlkZW9TdXJmYWNlLCAmcmVjdHNbaV0pOwotCQkJfQotCQl9Ci0JCWlmICggc2F2ZWRfY29sb3JzICkgewotCQkJcGFsLT5jb2xvcnMgPSBzYXZlZF9jb2xvcnM7Ci0JCX0KLQotCQkvKiBGYWxsIHRocm91Z2ggdG8gdmlkZW8gc3VyZmFjZSB1cGRhdGUgKi8KLQkJc2NyZWVuID0gU0RMX1ZpZGVvU3VyZmFjZTsKLQl9Ci0JaWYgKCBzY3JlZW4gPT0gU0RMX1ZpZGVvU3VyZmFjZSApIHsKLQkJLyogVXBkYXRlIHRoZSB2aWRlbyBzdXJmYWNlICovCi0JCWlmICggc2NyZWVuLT5vZmZzZXQgKSB7Ci0JCQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIHsKLQkJCQlyZWN0c1tpXS54ICs9IHZpZGVvLT5vZmZzZXRfeDsKLQkJCQlyZWN0c1tpXS55ICs9IHZpZGVvLT5vZmZzZXRfeTsKLQkJCX0KLQkJCXZpZGVvLT5VcGRhdGVSZWN0cyh0aGlzLCBudW1yZWN0cywgcmVjdHMpOwotCQkJZm9yICggaT0wOyBpPG51bXJlY3RzOyArK2kgKSB7Ci0JCQkJcmVjdHNbaV0ueCAtPSB2aWRlby0+b2Zmc2V0X3g7Ci0JCQkJcmVjdHNbaV0ueSAtPSB2aWRlby0+b2Zmc2V0X3k7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl2aWRlby0+VXBkYXRlUmVjdHModGhpcywgbnVtcmVjdHMsIHJlY3RzKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFBlcmZvcm1zIGhhcmR3YXJlIGRvdWJsZSBidWZmZXJpbmcsIGlmIHBvc3NpYmxlLCBvciBhIGZ1bGwgdXBkYXRlIGlmIG5vdC4KLSAqLwotaW50IFNETF9GbGlwKFNETF9TdXJmYWNlICpzY3JlZW4pCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JLyogQ29weSB0aGUgc2hhZG93IHN1cmZhY2UgdG8gdGhlIHZpZGVvIHN1cmZhY2UgKi8KLQlpZiAoIHNjcmVlbiA9PSBTRExfU2hhZG93U3VyZmFjZSApIHsKLQkJU0RMX1JlY3QgcmVjdDsKLQkJU0RMX1BhbGV0dGUgKnBhbCA9IHNjcmVlbi0+Zm9ybWF0LT5wYWxldHRlOwotCQlTRExfQ29sb3IgKnNhdmVkX2NvbG9ycyA9IE5VTEw7Ci0JCWlmICggcGFsICYmICEoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFKSApIHsKLQkJCS8qIHNpbXVsYXRlZCA4YnBwLCB1c2UgY29ycmVjdCBwaHlzaWNhbCBwYWxldHRlICovCi0JCQlzYXZlZF9jb2xvcnMgPSBwYWwtPmNvbG9yczsKLQkJCWlmICggdmlkZW8tPmdhbW1hY29scyApIHsKLQkJCQkvKiBnYW1tYS1jb3JyZWN0ZWQgcGFsZXR0ZSAqLwotCQkJCXBhbC0+Y29sb3JzID0gdmlkZW8tPmdhbW1hY29sczsKLQkJCX0gZWxzZSBpZiAoIHZpZGVvLT5waHlzcGFsICkgewotCQkJCS8qIHBoeXNpY2FsIHBhbGV0dGUgZGlmZmVyZW50IGZyb20gbG9naWNhbCAqLwotCQkJCXBhbC0+Y29sb3JzID0gdmlkZW8tPnBoeXNwYWwtPmNvbG9yczsKLQkJCX0KLQkJfQotCi0JCXJlY3QueCA9IDA7Ci0JCXJlY3QueSA9IDA7Ci0JCXJlY3QudyA9IHNjcmVlbi0+dzsKLQkJcmVjdC5oID0gc2NyZWVuLT5oOwotCQlpZiAoIFNIT1VMRF9EUkFXQ1VSU09SKFNETF9jdXJzb3JzdGF0ZSkgKSB7Ci0JCQlTRExfTG9ja0N1cnNvcigpOwotCQkJU0RMX0RyYXdDdXJzb3IoU0RMX1NoYWRvd1N1cmZhY2UpOwotCQkJU0RMX0xvd2VyQmxpdChTRExfU2hhZG93U3VyZmFjZSwgJnJlY3QsCi0JCQkJCVNETF9WaWRlb1N1cmZhY2UsICZyZWN0KTsKLQkJCVNETF9FcmFzZUN1cnNvcihTRExfU2hhZG93U3VyZmFjZSk7Ci0JCQlTRExfVW5sb2NrQ3Vyc29yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlTRExfTG93ZXJCbGl0KFNETF9TaGFkb3dTdXJmYWNlLCAmcmVjdCwKLQkJCQkJU0RMX1ZpZGVvU3VyZmFjZSwgJnJlY3QpOwotCQl9Ci0JCWlmICggc2F2ZWRfY29sb3JzICkgewotCQkJcGFsLT5jb2xvcnMgPSBzYXZlZF9jb2xvcnM7Ci0JCX0KLQotCQkvKiBGYWxsIHRocm91Z2ggdG8gdmlkZW8gc3VyZmFjZSB1cGRhdGUgKi8KLQkJc2NyZWVuID0gU0RMX1ZpZGVvU3VyZmFjZTsKLQl9Ci0JaWYgKCAoc2NyZWVuLT5mbGFncyAmIFNETF9ET1VCTEVCVUYpID09IFNETF9ET1VCTEVCVUYgKSB7Ci0JCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwotCQlyZXR1cm4odmlkZW8tPkZsaXBIV1N1cmZhY2UodGhpcywgU0RMX1ZpZGVvU3VyZmFjZSkpOwotCX0gZWxzZSB7Ci0JCVNETF9VcGRhdGVSZWN0KHNjcmVlbiwgMCwgMCwgMCwgMCk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgU2V0UGFsZXR0ZV9sb2dpY2FsKFNETF9TdXJmYWNlICpzY3JlZW4sIFNETF9Db2xvciAqY29sb3JzLAotCQkJICAgICAgIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycykKLXsKLQlTRExfUGFsZXR0ZSAqcGFsID0gc2NyZWVuLT5mb3JtYXQtPnBhbGV0dGU7Ci0JU0RMX1BhbGV0dGUgKnZpZHBhbDsKLQotCWlmICggY29sb3JzICE9IChwYWwtPmNvbG9ycyArIGZpcnN0Y29sb3IpICkgewotCQlTRExfbWVtY3B5KHBhbC0+Y29sb3JzICsgZmlyc3Rjb2xvciwgY29sb3JzLAotCQkgICAgICAgbmNvbG9ycyAqIHNpemVvZigqY29sb3JzKSk7Ci0JfQotCi0JaWYgKCBjdXJyZW50X3ZpZGVvICYmIFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCXZpZHBhbCA9IFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZTsKLQkJaWYgKCAoc2NyZWVuID09IFNETF9TaGFkb3dTdXJmYWNlKSAmJiB2aWRwYWwgKSB7Ci0JCQkvKgotCQkJICogVGhpcyBpcyBhIHNoYWRvdyBzdXJmYWNlLCBhbmQgdGhlIHBoeXNpY2FsCi0JCQkgKiBmcmFtZWJ1ZmZlciBpcyBhbHNvIGluZGV4ZWQuIFByb3BhZ2F0ZSB0aGUKLQkJCSAqIGNoYW5nZXMgdG8gaXRzIGxvZ2ljYWwgcGFsZXR0ZSBzbyB0aGF0Ci0JCQkgKiB1cGRhdGVzIGFyZSBhbHdheXMgaWRlbnRpdHkgYmxpdHMKLQkJCSAqLwotCQkJU0RMX21lbWNweSh2aWRwYWwtPmNvbG9ycyArIGZpcnN0Y29sb3IsIGNvbG9ycywKLQkJCSAgICAgICBuY29sb3JzICogc2l6ZW9mKCpjb2xvcnMpKTsKLQkJfQotCX0KLQlTRExfRm9ybWF0Q2hhbmdlZChzY3JlZW4pOwotfQotCi1zdGF0aWMgaW50IFNldFBhbGV0dGVfcGh5c2ljYWwoU0RMX1N1cmZhY2UgKnNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfQ29sb3IgKmNvbG9ycywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzKQotewotCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCWludCBnb3RhbGwgPSAxOwotCi0JaWYgKCB2aWRlby0+cGh5c3BhbCApIHsKLQkJLyogV2UgbmVlZCB0byBjb3B5IHRoZSBuZXcgY29sb3JzLCBzaW5jZSB3ZSBoYXZlbid0Ci0JCSAqIGFscmVhZHkgZG9uZSB0aGUgY29weSBpbiB0aGUgbG9naWNhbCBzZXQgYWJvdmUuCi0JCSAqLwotCQlTRExfbWVtY3B5KHZpZGVvLT5waHlzcGFsLT5jb2xvcnMgKyBmaXJzdGNvbG9yLAotCQkgICAgICAgY29sb3JzLCBuY29sb3JzICogc2l6ZW9mKCpjb2xvcnMpKTsKLQl9Ci0JaWYgKCBzY3JlZW4gPT0gU0RMX1NoYWRvd1N1cmZhY2UgKSB7Ci0JCWlmICggU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFICkgewotCQkJLyoKLQkJCSAqIFRoZSByZWFsIHNjcmVlbiBpcyBhbHNvIGluZGV4ZWQgLSBzZXQgaXRzIHBoeXNpY2FsCi0JCQkgKiBwYWxldHRlLiBUaGUgcGh5c2ljYWwgcGFsZXR0ZSBkb2VzIG5vdCBpbmNsdWRlIHRoZQotCQkJICogZ2FtbWEgbW9kaWZpY2F0aW9uLCB3ZSBhcHBseSBpdCBkaXJlY3RseSBpbnN0ZWFkLAotCQkJICogYnV0IHRoaXMgb25seSBoYXBwZW5zIGlmIHdlIGhhdmUgaGFyZHdhcmUgcGFsZXR0ZS4KLQkJCSAqLwotCQkJc2NyZWVuID0gU0RMX1ZpZGVvU3VyZmFjZTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBUaGUgdmlkZW8gc3VyZmFjZSBpcyBub3QgaW5kZXhlZCAtIGludmFsaWRhdGUgYW55Ci0JCQkgKiBhY3RpdmUgc2hhZG93LXRvLXZpZGVvIGJsaXQgbWFwcGluZ3MuCi0JCQkgKi8KLQkJCWlmICggc2NyZWVuLT5tYXAtPmRzdCA9PSBTRExfVmlkZW9TdXJmYWNlICkgewotCQkJCVNETF9JbnZhbGlkYXRlTWFwKHNjcmVlbi0+bWFwKTsKLQkJCX0KLQkJCWlmICggdmlkZW8tPmdhbW1hICkgewotCQkJCWlmKCAhIHZpZGVvLT5nYW1tYWNvbHMgKSB7Ci0JCQkJCVNETF9QYWxldHRlICpwcCA9IHZpZGVvLT5waHlzcGFsOwotCQkJCQlpZighcHApCi0JCQkJCQlwcCA9IHNjcmVlbi0+Zm9ybWF0LT5wYWxldHRlOwotCQkJCQl2aWRlby0+Z2FtbWFjb2xzID0gU0RMX21hbGxvYyhwcC0+bmNvbG9ycwotCQkJCQkJCSAgKiBzaXplb2YoU0RMX0NvbG9yKSk7Ci0JCQkJCVNETF9BcHBseUdhbW1hKHZpZGVvLT5nYW1tYSwKLQkJCQkJCSAgICAgICBwcC0+Y29sb3JzLAotCQkJCQkJICAgICAgIHZpZGVvLT5nYW1tYWNvbHMsCi0JCQkJCQkgICAgICAgcHAtPm5jb2xvcnMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVNETF9BcHBseUdhbW1hKHZpZGVvLT5nYW1tYSwgY29sb3JzLAotCQkJCQkJICAgICAgIHZpZGVvLT5nYW1tYWNvbHMKLQkJCQkJCSAgICAgICArIGZpcnN0Y29sb3IsCi0JCQkJCQkgICAgICAgbmNvbG9ycyk7Ci0JCQkJfQotCQkJfQotCQkJU0RMX1VwZGF0ZVJlY3Qoc2NyZWVuLCAwLCAwLCAwLCAwKTsKLQkJfQotCX0KLQotCWlmICggc2NyZWVuID09IFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCVNETF9Db2xvciBnY29sb3JzWzI1Nl07Ci0KLQkJaWYgKCB2aWRlby0+Z2FtbWEgKSB7Ci0JCQlTRExfQXBwbHlHYW1tYSh2aWRlby0+Z2FtbWEsIGNvbG9ycywgZ2NvbG9ycywgbmNvbG9ycyk7Ci0JCQljb2xvcnMgPSBnY29sb3JzOwotCQl9Ci0JCWdvdGFsbCA9IHZpZGVvLT5TZXRDb2xvcnModmlkZW8sIGZpcnN0Y29sb3IsIG5jb2xvcnMsIGNvbG9ycyk7Ci0JCWlmICggISBnb3RhbGwgKSB7Ci0JCQkvKiBUaGUgdmlkZW8gZmxhZ3Mgc2hvdWxkbid0IGhhdmUgU0RMX0hXUEFMRVRURSwgYW5kCi0JCQkgICB0aGUgdmlkZW8gZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBjb3B5aW5nIGJhY2sgdGhlCi0JCQkgICBjb3JyZWN0IGNvbG9ycyBpbnRvIHRoZSB2aWRlbyBzdXJmYWNlIHBhbGV0dGUuCi0JCQkqLwotCQkJOwotCQl9Ci0JCVNETF9DdXJzb3JQYWxldHRlQ2hhbmdlZCgpOwotCX0KLQlyZXR1cm4gZ290YWxsOwotfQotCi0vKgotICogU2V0IHRoZSBwaHlzaWNhbCBhbmQvb3IgbG9naWNhbCBjb2xvcm1hcCBvZiBhIHN1cmZhY2U6Ci0gKiBPbmx5IHRoZSBzY3JlZW4gaGFzIGEgcGh5c2ljYWwgY29sb3JtYXAuIEl0IGRldGVybWluZXMgd2hhdCBpcyBhY3R1YWxseQotICogc2VudCB0byB0aGUgZGlzcGxheS4KLSAqIFRoZSBsb2dpY2FsIGNvbG9ybWFwIGlzIHVzZWQgdG8gbWFwIGJsaXRzIHRvL2Zyb20gdGhlIHN1cmZhY2UuCi0gKiAnd2hpY2gnIGlzIG9uZSBvciBib3RoIG9mIFNETF9MT0dQQUwsIFNETF9QSFlTUEFMCi0gKgotICogUmV0dXJuIG5vbnplcm8gaWYgYWxsIGNvbG91cnMgd2VyZSBzZXQgYXMgcmVxdWVzdGVkLCBvciAwIG90aGVyd2lzZS4KLSAqLwotaW50IFNETF9TZXRQYWxldHRlKFNETF9TdXJmYWNlICpzY3JlZW4sIGludCB3aGljaCwKLQkJICAgU0RMX0NvbG9yICpjb2xvcnMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycykKLXsKLQlTRExfUGFsZXR0ZSAqcGFsOwotCWludCBnb3RhbGw7Ci0JaW50IHBhbHNpemU7Ci0KLQlpZiAoICFzY3JlZW4gKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoICFjdXJyZW50X3ZpZGVvIHx8IHNjcmVlbiAhPSBTRExfUHVibGljU3VyZmFjZSApIHsKLQkJLyogb25seSBzY3JlZW5zIGhhdmUgcGh5c2ljYWwgcGFsZXR0ZXMgKi8KLQkJd2hpY2ggJj0gflNETF9QSFlTUEFMOwotCX0gZWxzZSBpZiAoIChzY3JlZW4tPmZsYWdzICYgU0RMX0hXUEFMRVRURSkgIT0gU0RMX0hXUEFMRVRURSApIHsKLQkJLyogaGFyZHdhcmUgcGFsZXR0ZXMgcmVxdWlyZWQgZm9yIHNwbGl0IGNvbG9ybWFwcyAqLwotCQl3aGljaCB8PSBTRExfUEhZU1BBTCB8IFNETF9MT0dQQUw7Ci0JfQotCi0JLyogVmVyaWZ5IHRoZSBwYXJhbWV0ZXJzICovCi0JcGFsID0gc2NyZWVuLT5mb3JtYXQtPnBhbGV0dGU7Ci0JaWYoICFwYWwgKSB7Ci0JCXJldHVybiAwOwkvKiBub3QgYSBwYWxldHRpemVkIHN1cmZhY2UgKi8KLQl9Ci0JZ290YWxsID0gMTsKLQlwYWxzaXplID0gMSA8PCBzY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCWlmICggbmNvbG9ycyA+IChwYWxzaXplIC0gZmlyc3Rjb2xvcikgKSB7Ci0JCW5jb2xvcnMgPSAocGFsc2l6ZSAtIGZpcnN0Y29sb3IpOwotCQlnb3RhbGwgPSAwOwotCX0KLQotCWlmICggd2hpY2ggJiBTRExfTE9HUEFMICkgewotCQkvKgotCQkgKiBMb2dpY2FsIHBhbGV0dGUgY2hhbmdlOiBUaGUgYWN0dWFsIHNjcmVlbiBpc24ndCBhZmZlY3RlZCwKLQkJICogYnV0IHRoZSBpbnRlcm5hbCBjb2xvcm1hcCBpcyBhbHRlcmVkIHNvIHRoYXQgdGhlCi0JCSAqIGludGVycHJldGF0aW9uIG9mIHRoZSBwaXhlbCB2YWx1ZXMgKGZvciBibGl0cyBldGMpIGlzCi0JCSAqIGNoYW5nZWQuCi0JCSAqLwotCQlTZXRQYWxldHRlX2xvZ2ljYWwoc2NyZWVuLCBjb2xvcnMsIGZpcnN0Y29sb3IsIG5jb2xvcnMpOwotCX0KLQlpZiAoIHdoaWNoICYgU0RMX1BIWVNQQUwgKSB7Ci0JCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCQkvKgotCQkgKiBQaHlzaWNhbCBwYWxldHRlIGNoYW5nZTogVGhpcyBkb2Vzbid0IGFmZmVjdCB0aGUKLQkJICogcHJvZ3JhbSdzIGlkZWEgb2Ygd2hhdCB0aGUgc2NyZWVuIGxvb2tzIGxpa2UsIGJ1dCBjaGFuZ2VzCi0JCSAqIGl0cyBhY3R1YWwgYXBwZWFyYW5jZS4KLQkJICovCi0JCWlmICggIXZpZGVvLT5waHlzcGFsICYmICEod2hpY2ggJiBTRExfTE9HUEFMKSApIHsKLQkJCS8qIExhenkgcGh5c2ljYWwgcGFsZXR0ZSBhbGxvY2F0aW9uICovCi0JCQlpbnQgc2l6ZTsKLQkJCVNETF9QYWxldHRlICpwcCA9IFNETF9tYWxsb2Moc2l6ZW9mKCpwcCkpOwotCQkJaWYgKCAhcHAgKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQl2aWRlby0+cGh5c3BhbCA9IHBwOwotCQkJcHAtPm5jb2xvcnMgPSBwYWwtPm5jb2xvcnM7Ci0JCQlzaXplID0gcHAtPm5jb2xvcnMgKiBzaXplb2YoU0RMX0NvbG9yKTsKLQkJCXBwLT5jb2xvcnMgPSBTRExfbWFsbG9jKHNpemUpOwotCQkJaWYgKCAhcHAtPmNvbG9ycyApIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCVNETF9tZW1jcHkocHAtPmNvbG9ycywgcGFsLT5jb2xvcnMsIHNpemUpOwotCQl9Ci0JCWlmICggISBTZXRQYWxldHRlX3BoeXNpY2FsKHNjcmVlbiwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzLCBmaXJzdGNvbG9yLCBuY29sb3JzKSApIHsKLQkJCWdvdGFsbCA9IDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIGdvdGFsbDsKLX0KLQotaW50IFNETF9TZXRDb2xvcnMoU0RMX1N1cmZhY2UgKnNjcmVlbiwgU0RMX0NvbG9yICpjb2xvcnMsIGludCBmaXJzdGNvbG9yLAotCQkgIGludCBuY29sb3JzKQotewotCXJldHVybiBTRExfU2V0UGFsZXR0ZShzY3JlZW4sIFNETF9MT0dQQUwgfCBTRExfUEhZU1BBTCwKLQkJCSAgICAgIGNvbG9ycywgZmlyc3Rjb2xvciwgbmNvbG9ycyk7Ci19Ci0KLS8qCi0gKiBDbGVhbiB1cCB0aGUgdmlkZW8gc3Vic3lzdGVtCi0gKi8KLXZvaWQgU0RMX1ZpZGVvUXVpdCAodm9pZCkKLXsKLQlTRExfU3VyZmFjZSAqcmVhZHlfdG9fZ287Ci0KLQlpZiAoIGN1cnJlbnRfdmlkZW8gKSB7Ci0JCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQotCQkvKiBIYWx0IGV2ZW50IHByb2Nlc3NpbmcgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UgKi8KLQkJU0RMX1N0b3BFdmVudExvb3AoKTsKLQotCQkvKiBDbGVhbiB1cCBhbGxvY2F0ZWQgd2luZG93IG1hbmFnZXIgaXRlbXMgKi8KLQkJaWYgKCBTRExfUHVibGljU3VyZmFjZSApIHsKLQkJCVNETF9QdWJsaWNTdXJmYWNlID0gTlVMTDsKLQkJfQotCQlTRExfQ3Vyc29yUXVpdCgpOwotCi0JCS8qIEp1c3QgaW4gY2FzZS4uLiAqLwotCQlTRExfV01fR3JhYklucHV0T2ZmKCk7Ci0KLQkJLyogQ2xlYW4gdXAgdGhlIHN5c3RlbSB2aWRlbyAqLwotCQl2aWRlby0+VmlkZW9RdWl0KHRoaXMpOwotCi0JCS8qIEZyZWUgYW55IGxpbmdlcmluZyBzdXJmYWNlcyAqLwotCQlyZWFkeV90b19nbyA9IFNETF9TaGFkb3dTdXJmYWNlOwotCQlTRExfU2hhZG93U3VyZmFjZSA9IE5VTEw7Ci0JCVNETF9GcmVlU3VyZmFjZShyZWFkeV90b19nbyk7Ci0JCWlmICggU0RMX1ZpZGVvU3VyZmFjZSAhPSBOVUxMICkgewotCQkJcmVhZHlfdG9fZ28gPSBTRExfVmlkZW9TdXJmYWNlOwotCQkJU0RMX1ZpZGVvU3VyZmFjZSA9IE5VTEw7Ci0JCQlTRExfRnJlZVN1cmZhY2UocmVhZHlfdG9fZ28pOwotCQl9Ci0JCVNETF9QdWJsaWNTdXJmYWNlID0gTlVMTDsKLQotCQkvKiBDbGVhbiB1cCBtaXNjZWxsYW5lb3VzIG1lbW9yeSAqLwotCQlpZiAoIHZpZGVvLT5waHlzcGFsICkgewotCQkJU0RMX2ZyZWUodmlkZW8tPnBoeXNwYWwtPmNvbG9ycyk7Ci0JCQlTRExfZnJlZSh2aWRlby0+cGh5c3BhbCk7Ci0JCQl2aWRlby0+cGh5c3BhbCA9IE5VTEw7Ci0JCX0KLQkJaWYgKCB2aWRlby0+Z2FtbWFjb2xzICkgewotCQkJU0RMX2ZyZWUodmlkZW8tPmdhbW1hY29scyk7Ci0JCQl2aWRlby0+Z2FtbWFjb2xzID0gTlVMTDsKLQkJfQotCQlpZiAoIHZpZGVvLT5nYW1tYSApIHsKLQkJCVNETF9mcmVlKHZpZGVvLT5nYW1tYSk7Ci0JCQl2aWRlby0+Z2FtbWEgPSBOVUxMOwotCQl9Ci0JCWlmICggdmlkZW8tPndtX3RpdGxlICE9IE5VTEwgKSB7Ci0JCQlTRExfZnJlZSh2aWRlby0+d21fdGl0bGUpOwotCQkJdmlkZW8tPndtX3RpdGxlID0gTlVMTDsKLQkJfQotCQlpZiAoIHZpZGVvLT53bV9pY29uICE9IE5VTEwgKSB7Ci0JCQlTRExfZnJlZSh2aWRlby0+d21faWNvbik7Ci0JCQl2aWRlby0+d21faWNvbiA9IE5VTEw7Ci0JCX0KLQotCQkvKiBGaW5pc2ggY2xlYW5pbmcgdXAgdmlkZW8gc3Vic3lzdGVtICovCi0JCXZpZGVvLT5mcmVlKHRoaXMpOwotCQljdXJyZW50X3ZpZGVvID0gTlVMTDsKLQl9Ci0JcmV0dXJuOwotfQotCi0vKiBMb2FkIHRoZSBHTCBkcml2ZXIgbGlicmFyeSAqLwotaW50IFNETF9HTF9Mb2FkTGlicmFyeShjb25zdCBjaGFyICpwYXRoKQotewotCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87Ci0JaW50IHJldHZhbDsKLQotCXJldHZhbCA9IC0xOwotCWlmICggdmlkZW8gPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJWaWRlbyBzdWJzeXN0ZW0gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIik7Ci0JfSBlbHNlIHsKLQkJaWYgKCB2aWRlby0+R0xfTG9hZExpYnJhcnkgKSB7Ci0JCQlyZXR2YWwgPSB2aWRlby0+R0xfTG9hZExpYnJhcnkodGhpcywgcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlTRExfU2V0RXJyb3IoIk5vIGR5bmFtaWMgR0wgc3VwcG9ydCBpbiB2aWRlbyBkcml2ZXIiKTsKLQkJfQotCX0KLQlyZXR1cm4ocmV0dmFsKTsKLX0KLQotdm9pZCAqU0RMX0dMX0dldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIqIHByb2MpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gY3VycmVudF92aWRlbzsKLQl2b2lkICpmdW5jOwotCi0JZnVuYyA9IE5VTEw7Ci0JaWYgKCB2aWRlby0+R0xfR2V0UHJvY0FkZHJlc3MgKSB7Ci0JCWlmICggdmlkZW8tPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkICkgewotCQkJZnVuYyA9IHZpZGVvLT5HTF9HZXRQcm9jQWRkcmVzcyh0aGlzLCBwcm9jKTsKLQkJfSBlbHNlIHsKLQkJCVNETF9TZXRFcnJvcigiTm8gR0wgZHJpdmVyIGhhcyBiZWVuIGxvYWRlZCIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX1NldEVycm9yKCJObyBkeW5hbWljIEdMIHN1cHBvcnQgaW4gdmlkZW8gZHJpdmVyIik7Ci0JfQotCXJldHVybiBmdW5jOwotfQotCi0vKiBTZXQgdGhlIHNwZWNpZmllZCBHTCBhdHRyaWJ1dGUgZm9yIHNldHRpbmcgdXAgYSBHTCB2aWRlbyBtb2RlICovCi1pbnQgU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMYXR0ciBhdHRyLCBpbnQgdmFsdWUgKQotewotCWludCByZXR2YWw7Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0KLQlyZXR2YWwgPSAwOwotCXN3aXRjaCAoYXR0cikgewotCQljYXNlIFNETF9HTF9SRURfU0laRToKLQkJCXZpZGVvLT5nbF9jb25maWcucmVkX3NpemUgPSB2YWx1ZTsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9HUkVFTl9TSVpFOgotCQkJdmlkZW8tPmdsX2NvbmZpZy5ncmVlbl9zaXplID0gdmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQkxVRV9TSVpFOgotCQkJdmlkZW8tPmdsX2NvbmZpZy5ibHVlX3NpemUgPSB2YWx1ZTsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9BTFBIQV9TSVpFOgotCQkJdmlkZW8tPmdsX2NvbmZpZy5hbHBoYV9zaXplID0gdmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfRE9VQkxFQlVGRkVSOgotCQkJdmlkZW8tPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyID0gdmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQlVGRkVSX1NJWkU6Ci0JCQl2aWRlby0+Z2xfY29uZmlnLmJ1ZmZlcl9zaXplID0gdmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfREVQVEhfU0laRToKLQkJCXZpZGVvLT5nbF9jb25maWcuZGVwdGhfc2l6ZSA9IHZhbHVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX1NURU5DSUxfU0laRToKLQkJCXZpZGVvLT5nbF9jb25maWcuc3RlbmNpbF9zaXplID0gdmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQUNDVU1fUkVEX1NJWkU6Ci0JCQl2aWRlby0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplID0gdmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQUNDVU1fR1JFRU5fU0laRToKLQkJCXZpZGVvLT5nbF9jb25maWcuYWNjdW1fZ3JlZW5fc2l6ZSA9IHZhbHVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0FDQ1VNX0JMVUVfU0laRToKLQkJCXZpZGVvLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplID0gdmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQUNDVU1fQUxQSEFfU0laRToKLQkJCXZpZGVvLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZSA9IHZhbHVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX1NURVJFTzoKLQkJCXZpZGVvLT5nbF9jb25maWcuc3RlcmVvID0gdmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfTVVMVElTQU1QTEVCVUZGRVJTOgotCQkJdmlkZW8tPmdsX2NvbmZpZy5tdWx0aXNhbXBsZWJ1ZmZlcnMgPSB2YWx1ZTsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9NVUxUSVNBTVBMRVNBTVBMRVM6Ci0JCQl2aWRlby0+Z2xfY29uZmlnLm11bHRpc2FtcGxlc2FtcGxlcyA9IHZhbHVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0FDQ0VMRVJBVEVEX1ZJU1VBTDoKLQkJCXZpZGVvLT5nbF9jb25maWcuYWNjZWxlcmF0ZWQgPSB2YWx1ZTsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9TV0FQX0NPTlRST0w6Ci0JCQl2aWRlby0+Z2xfY29uZmlnLnN3YXBfY29udHJvbCA9IHZhbHVlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlTRExfU2V0RXJyb3IoIlVua25vd24gT3BlbkdMIGF0dHJpYnV0ZSIpOwotCQkJcmV0dmFsID0gLTE7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuKHJldHZhbCk7Ci19Ci0KLS8qIFJldHJpZXZlIGFuIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIHRoZSB3aW5kb3dpbmcgc3lzdGVtLiAqLwotaW50IFNETF9HTF9HZXRBdHRyaWJ1dGUoU0RMX0dMYXR0ciBhdHRyLCBpbnQqIHZhbHVlKQotewotCWludCByZXR2YWwgPSAtMTsKLQlTRExfVmlkZW9EZXZpY2UqIHZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UqIHRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCi0JaWYgKCB2aWRlby0+R0xfR2V0QXR0cmlidXRlICkgewotCQlyZXR2YWwgPSB0aGlzLT5HTF9HZXRBdHRyaWJ1dGUodGhpcywgYXR0ciwgdmFsdWUpOwotCX0gZWxzZSB7Ci0JCSp2YWx1ZSA9IDA7Ci0JCVNETF9TZXRFcnJvcigiR0xfR2V0QXR0cmlidXRlIG5vdCBzdXBwb3J0ZWQiKTsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyogUGVyZm9ybSBhIEdMIGJ1ZmZlciBzd2FwIG9uIHRoZSBjdXJyZW50IEdMIGNvbnRleHQgKi8KLXZvaWQgU0RMX0dMX1N3YXBCdWZmZXJzKHZvaWQpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gY3VycmVudF92aWRlbzsKLQotCWlmICggdmlkZW8tPnNjcmVlbi0+ZmxhZ3MgJiBTRExfT1BFTkdMICkgewotCQl2aWRlby0+R0xfU3dhcEJ1ZmZlcnModGhpcyk7Ci0JfSBlbHNlIHsKLQkJU0RMX1NldEVycm9yKCJPcGVuR0wgdmlkZW8gbW9kZSBoYXMgbm90IGJlZW4gc2V0Iik7Ci0JfQotfQotCi0vKiBVcGRhdGUgcmVjdHMgd2l0aCBsb2NraW5nICovCi12b2lkIFNETF9HTF9VcGRhdGVSZWN0c0xvY2soU0RMX1ZpZGVvRGV2aWNlKiB0aGlzLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLQlTRExfR0xfTG9jaygpOwotIAlTRExfR0xfVXBkYXRlUmVjdHMobnVtcmVjdHMsIHJlY3RzKTsKLQlTRExfR0xfVW5sb2NrKCk7Ci19Ci0KLS8qIFVwZGF0ZSByZWN0cyB3aXRob3V0IHN0YXRlIHNldHRpbmcgYW5kIGNoYW5naW5nICh0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBpdCkgKi8KLXZvaWQgU0RMX0dMX1VwZGF0ZVJlY3RzKGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCVNETF9SZWN0IHVwZGF0ZSwgdG1wOwotCWludCB4LCB5LCBpOwotCi0JZm9yICggaSA9IDA7IGkgPCBudW1yZWN0czsgaSsrICkKLQl7Ci0JCXRtcC55ID0gcmVjdHNbaV0ueTsKLQkJdG1wLmggPSByZWN0c1tpXS5oOwotCQlmb3IgKCB5ID0gMDsgeSA8PSByZWN0c1tpXS5oIC8gMjU2OyB5KysgKQotCQl7Ci0JCQl0bXAueCA9IHJlY3RzW2ldLng7Ci0JCQl0bXAudyA9IHJlY3RzW2ldLnc7Ci0JCQlmb3IgKCB4ID0gMDsgeCA8PSByZWN0c1tpXS53IC8gMjU2OyB4KysgKQotCQkJewotCQkJCXVwZGF0ZS54ID0gdG1wLng7Ci0JCQkJdXBkYXRlLnkgPSB0bXAueTsKLQkJCQl1cGRhdGUudyA9IHRtcC53OwotCQkJCXVwZGF0ZS5oID0gdG1wLmg7Ci0KLQkJCQlpZiAoIHVwZGF0ZS53ID4gMjU2ICkKLQkJCQkJdXBkYXRlLncgPSAyNTY7Ci0KLQkJCQlpZiAoIHVwZGF0ZS5oID4gMjU2ICkKLQkJCQkJdXBkYXRlLmggPSAyNTY7Ci0KLQkJCQl0aGlzLT5nbEZsdXNoKCk7Ci0JCQkJdGhpcy0+Z2xUZXhTdWJJbWFnZTJEKAotCQkJCQlHTF9URVhUVVJFXzJELAotCQkJCQkwLAotCQkJCQkwLAotCQkJCQkwLAotCQkJCQl1cGRhdGUudywKLQkJCQkJdXBkYXRlLmgsCi0JCQkJCXRoaXMtPmlzXzMyYml0PyBHTF9SR0JBIDogR0xfUkdCLAotI2lmZGVmIEdMX1ZFUlNJT05fMV8yCi0JCQkJCXRoaXMtPmlzXzMyYml0ID8gR0xfVU5TSUdORURfQllURSA6IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LAotI2Vsc2UKLQkJCQkJR0xfVU5TSUdORURfQllURSwKLSNlbmRpZgotCQkJCQkoVWludDggKil0aGlzLT5zY3JlZW4tPnBpeGVscyArCi0JCQkJCQl0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCAqIHVwZGF0ZS54ICsKLQkJCQkJCXVwZGF0ZS55ICogdGhpcy0+c2NyZWVuLT5waXRjaCApOwotCi0JCQkJdGhpcy0+Z2xGbHVzaCgpOwotCQkJCS8qCi0JCQkJKiBOb3RlIHRoZSBwYXJlbnMgYXJvdW5kIHRoZSBmdW5jdGlvbiBuYW1lOgotCQkJCSogVGhpcyBpcyBiZWNhdXNlIHNvbWUgT3BlbkdMIGltcGxlbWVudGF0aW9ucyBkZWZpbmUgZ2xUZXhDb29yZCBldGMKLQkJCQkqIGFzIG1hY3JvcywgYW5kIHdlIGRvbid0IHdhbnQgdGhlbSBleHBhbmRlZCBoZXJlLgotCQkJCSovCi0JCQkJdGhpcy0+Z2xCZWdpbihHTF9UUklBTkdMRV9TVFJJUCk7Ci0JCQkJCSh0aGlzLT5nbFRleENvb3JkMmYpKCAwLjAsIDAuMCApOwotCQkJCQkodGhpcy0+Z2xWZXJ0ZXgyaSkoIHVwZGF0ZS54LCB1cGRhdGUueSApOwotCQkJCQkodGhpcy0+Z2xUZXhDb29yZDJmKSggKGZsb2F0KSh1cGRhdGUudyAvIDI1Ni4wKSwgMC4wICk7Ci0JCQkJCSh0aGlzLT5nbFZlcnRleDJpKSggdXBkYXRlLnggKyB1cGRhdGUudywgdXBkYXRlLnkgKTsKLQkJCQkJKHRoaXMtPmdsVGV4Q29vcmQyZikoIDAuMCwgKGZsb2F0KSh1cGRhdGUuaCAvIDI1Ni4wKSApOwotCQkJCQkodGhpcy0+Z2xWZXJ0ZXgyaSkoIHVwZGF0ZS54LCB1cGRhdGUueSArIHVwZGF0ZS5oICk7Ci0JCQkJCSh0aGlzLT5nbFRleENvb3JkMmYpKCAoZmxvYXQpKHVwZGF0ZS53IC8gMjU2LjApLCAoZmxvYXQpKHVwZGF0ZS5oIC8gMjU2LjApICk7Ci0JCQkJCSh0aGlzLT5nbFZlcnRleDJpKSggdXBkYXRlLnggKyB1cGRhdGUudwksIHVwZGF0ZS55ICsgdXBkYXRlLmggKTsKLQkJCQl0aGlzLT5nbEVuZCgpOwotCi0JCQkJdG1wLnggKz0gMjU2OwotCQkJCXRtcC53IC09IDI1NjsKLQkJCX0KLQkJCXRtcC55ICs9IDI1NjsKLQkJCXRtcC5oIC09IDI1NjsKLQkJfQotCX0KLSNlbmRpZgotfQotCi0vKiBMb2NrID09IHNhdmUgY3VycmVudCBzdGF0ZSAqLwotdm9pZCBTRExfR0xfTG9jaygpCi17Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCWxvY2tfY291bnQtLTsKLQlpZiAobG9ja19jb3VudD09LTEpCi0JewotCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCi0JCXRoaXMtPmdsUHVzaEF0dHJpYiggR0xfQUxMX0FUVFJJQl9CSVRTICk7CS8qIFRPRE86IG5hcnJvdyByYW5nZSBvZiB3aGF0IGlzIHNhdmVkICovCi0jaWZkZWYgR0xfQ0xJRU5UX1BJWEVMX1NUT1JFX0JJVAotCQl0aGlzLT5nbFB1c2hDbGllbnRBdHRyaWIoIEdMX0NMSUVOVF9QSVhFTF9TVE9SRV9CSVQgKTsKLSNlbmRpZgotCi0JCXRoaXMtPmdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotCQl0aGlzLT5nbEVuYWJsZShHTF9CTEVORCk7Ci0JCXRoaXMtPmdsRGlzYWJsZShHTF9GT0cpOwotCQl0aGlzLT5nbERpc2FibGUoR0xfQUxQSEFfVEVTVCk7Ci0JCXRoaXMtPmdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLQkJdGhpcy0+Z2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0JCXRoaXMtPmdsRGlzYWJsZShHTF9TVEVOQ0lMX1RFU1QpOwotCQl0aGlzLT5nbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKLQotCQl0aGlzLT5nbEJpbmRUZXh0dXJlKCBHTF9URVhUVVJFXzJELCB0aGlzLT50ZXh0dXJlICk7Ci0JCXRoaXMtPmdsVGV4RW52ZiggR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX01PRFVMQVRFICk7Ci0JCXRoaXMtPmdsVGV4UGFyYW1ldGVyaSggR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUICk7Ci0JCXRoaXMtPmdsVGV4UGFyYW1ldGVyaSggR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUICk7Ci0JCXRoaXMtPmdsVGV4UGFyYW1ldGVyaSggR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCApOwotCQl0aGlzLT5nbFRleFBhcmFtZXRlcmkoIEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQgKTsKLQotCQl0aGlzLT5nbFBpeGVsU3RvcmVpKCBHTF9VTlBBQ0tfUk9XX0xFTkdUSCwgdGhpcy0+c2NyZWVuLT5waXRjaCAvIHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsICk7Ci0JCXRoaXMtPmdsQmxlbmRGdW5jKEdMX1NSQ19BTFBIQSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCSh0aGlzLT5nbENvbG9yNGYpKDEuMCwgMS4wLCAxLjAsIDEuMCk7CQkvKiBTb2xhcmlzIHdvcmthcm91bmQgKi8KLQotCQl0aGlzLT5nbFZpZXdwb3J0KDAsIDAsIHRoaXMtPnNjcmVlbi0+dywgdGhpcy0+c2NyZWVuLT5oKTsKLQkJdGhpcy0+Z2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotCQl0aGlzLT5nbFB1c2hNYXRyaXgoKTsKLQkJdGhpcy0+Z2xMb2FkSWRlbnRpdHkoKTsKLQotCQl0aGlzLT5nbE9ydGhvKDAuMCwgKEdMZG91YmxlKSB0aGlzLT5zY3JlZW4tPncsIChHTGRvdWJsZSkgdGhpcy0+c2NyZWVuLT5oLCAwLjAsIDAuMCwgMS4wKTsKLQotCQl0aGlzLT5nbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLQkJdGhpcy0+Z2xQdXNoTWF0cml4KCk7Ci0JCXRoaXMtPmdsTG9hZElkZW50aXR5KCk7Ci0JfQotI2VuZGlmCi19Ci0KLS8qIFVubG9jayA9PSByZXN0b3JlIHNhdmVkIHN0YXRlICovCi12b2lkIFNETF9HTF9VbmxvY2soKQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLQlsb2NrX2NvdW50Kys7Ci0JaWYgKGxvY2tfY291bnQ9PTApCi0JewotCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCi0JCXRoaXMtPmdsUG9wTWF0cml4KCk7Ci0JCXRoaXMtPmdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLQkJdGhpcy0+Z2xQb3BNYXRyaXgoKTsKLQotCQl0aGlzLT5nbFBvcENsaWVudEF0dHJpYigpOwotCQl0aGlzLT5nbFBvcEF0dHJpYigpOwotCX0KLSNlbmRpZgotfQotCi0vKgotICogU2V0cy9HZXRzIHRoZSB0aXRsZSBhbmQgaWNvbiB0ZXh0IG9mIHRoZSBkaXNwbGF5IHdpbmRvdywgaWYgYW55LgotICovCi12b2lkIFNETF9XTV9TZXRDYXB0aW9uIChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQotCWlmICggdmlkZW8gKSB7Ci0JCWlmICggdGl0bGUgKSB7Ci0JCQlpZiAoIHZpZGVvLT53bV90aXRsZSApIHsKLQkJCQlTRExfZnJlZSh2aWRlby0+d21fdGl0bGUpOwotCQkJfQotCQkJdmlkZW8tPndtX3RpdGxlID0gU0RMX3N0cmR1cCh0aXRsZSk7Ci0JCX0KLQkJaWYgKCBpY29uICkgewotCQkJaWYgKCB2aWRlby0+d21faWNvbiApIHsKLQkJCQlTRExfZnJlZSh2aWRlby0+d21faWNvbik7Ci0JCQl9Ci0JCQl2aWRlby0+d21faWNvbiA9IFNETF9zdHJkdXAoaWNvbik7Ci0JCX0KLQkJaWYgKCAodGl0bGUgfHwgaWNvbikgJiYgKHZpZGVvLT5TZXRDYXB0aW9uICE9IE5VTEwpICkgewotCQkJdmlkZW8tPlNldENhcHRpb24odGhpcywgdmlkZW8tPndtX3RpdGxlLHZpZGVvLT53bV9pY29uKTsKLQkJfQotCX0KLX0KLXZvaWQgU0RMX1dNX0dldENhcHRpb24gKGNoYXIgKip0aXRsZSwgY2hhciAqKmljb24pCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0KLQlpZiAoIHZpZGVvICkgewotCQlpZiAoIHRpdGxlICkgewotCQkJKnRpdGxlID0gdmlkZW8tPndtX3RpdGxlOwotCQl9Ci0JCWlmICggaWNvbiApIHsKLQkJCSppY29uID0gdmlkZW8tPndtX2ljb247Ci0JCX0KLQl9Ci19Ci0KLS8qIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBTRExfV01fU2V0SWNvbigpOwotICogZmxhZ3MgJiAxIGZvciBjb2xvciBrZXksIGZsYWdzICYgMiBmb3IgYWxwaGEgY2hhbm5lbC4gKi8KLXN0YXRpYyB2b2lkIENyZWF0ZU1hc2tGcm9tQ29sb3JLZXlPckFscGhhKFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzaywgaW50IGZsYWdzKQotewotCWludCB4LCB5OwotCVVpbnQzMiBjb2xvcmtleTsKLSNkZWZpbmUgU0VUX01BU0tCSVQoaWNvbiwgeCwgeSwgbWFzaykgXAotCW1hc2tbKHkqKChpY29uLT53KzcpLzgpKSsoeC84KV0gJj0gfigweDAxPDwoNy0oeCU4KSkpCi0KLQljb2xvcmtleSA9IGljb24tPmZvcm1hdC0+Y29sb3JrZXk7Ci0Jc3dpdGNoIChpY29uLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpIHsKLQkJY2FzZSAxOiB7IFVpbnQ4ICpwaXhlbHM7Ci0JCQlmb3IgKCB5PTA7IHk8aWNvbi0+aDsgKyt5ICkgewotCQkJCXBpeGVscyA9IChVaW50OCAqKWljb24tPnBpeGVscyArIHkqaWNvbi0+cGl0Y2g7Ci0JCQkJZm9yICggeD0wOyB4PGljb24tPnc7ICsreCApIHsKLQkJCQkJaWYgKCAqcGl4ZWxzKysgPT0gY29sb3JrZXkgKSB7Ci0JCQkJCQlTRVRfTUFTS0JJVChpY29uLCB4LCB5LCBtYXNrKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQotCQljYXNlIDI6IHsgVWludDE2ICpwaXhlbHM7Ci0JCQlmb3IgKCB5PTA7IHk8aWNvbi0+aDsgKyt5ICkgewotCQkJCXBpeGVscyA9IChVaW50MTYgKilpY29uLT5waXhlbHMgKwotCQkJCSAgICAgICAgICAgICAgICAgICB5Kmljb24tPnBpdGNoLzI7Ci0JCQkJZm9yICggeD0wOyB4PGljb24tPnc7ICsreCApIHsKLQkJCQkJaWYgKCAoZmxhZ3MgJiAxKSAmJiAqcGl4ZWxzID09IGNvbG9ya2V5ICkgewotCQkJCQkJU0VUX01BU0tCSVQoaWNvbiwgeCwgeSwgbWFzayk7Ci0JCQkJCX0gZWxzZSBpZigoZmxhZ3MgJiAyKSAmJiAoKnBpeGVscyAmIGljb24tPmZvcm1hdC0+QW1hc2spID09IDApIHsKLQkJCQkJCVNFVF9NQVNLQklUKGljb24sIHgsIHksIG1hc2spOwotCQkJCQl9Ci0JCQkJCXBpeGVscysrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQotCQljYXNlIDQ6IHsgVWludDMyICpwaXhlbHM7Ci0JCQlmb3IgKCB5PTA7IHk8aWNvbi0+aDsgKyt5ICkgewotCQkJCXBpeGVscyA9IChVaW50MzIgKilpY29uLT5waXhlbHMgKwotCQkJCSAgICAgICAgICAgICAgICAgICB5Kmljb24tPnBpdGNoLzQ7Ci0JCQkJZm9yICggeD0wOyB4PGljb24tPnc7ICsreCApIHsKLQkJCQkJaWYgKCAoZmxhZ3MgJiAxKSAmJiAqcGl4ZWxzID09IGNvbG9ya2V5ICkgewotCQkJCQkJU0VUX01BU0tCSVQoaWNvbiwgeCwgeSwgbWFzayk7Ci0JCQkJCX0gZWxzZSBpZigoZmxhZ3MgJiAyKSAmJiAoKnBpeGVscyAmIGljb24tPmZvcm1hdC0+QW1hc2spID09IDApIHsKLQkJCQkJCVNFVF9NQVNLQklUKGljb24sIHgsIHksIG1hc2spOwotCQkJCQl9Ci0JCQkJCXBpeGVscysrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0gKiBTZXRzIHRoZSB3aW5kb3cgbWFuYWdlciBpY29uIGZvciB0aGUgZGlzcGxheSB3aW5kb3cuCi0gKi8KLXZvaWQgU0RMX1dNX1NldEljb24gKFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzaykKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQotCWlmICggaWNvbiAmJiB2aWRlby0+U2V0SWNvbiApIHsKLQkJLyogR2VuZXJhdGUgYSBtYXNrIGlmIG5lY2Vzc2FyeSwgYW5kIGNyZWF0ZSB0aGUgaWNvbiEgKi8KLQkJaWYgKCBtYXNrID09IE5VTEwgKSB7Ci0JCQlpbnQgbWFza19sZW4gPSBpY29uLT5oKihpY29uLT53KzcpLzg7Ci0JCQlpbnQgZmxhZ3MgPSAwOwotCQkJbWFzayA9IChVaW50OCAqKVNETF9tYWxsb2MobWFza19sZW4pOwotCQkJaWYgKCBtYXNrID09IE5VTEwgKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU0RMX21lbXNldChtYXNrLCB+MCwgbWFza19sZW4pOwotCQkJaWYgKCBpY29uLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSApIGZsYWdzIHw9IDE7Ci0JCQlpZiAoIGljb24tPmZsYWdzICYgU0RMX1NSQ0FMUEhBICkgZmxhZ3MgfD0gMjsKLQkJCWlmKCBmbGFncyApIHsKLQkJCQlDcmVhdGVNYXNrRnJvbUNvbG9yS2V5T3JBbHBoYShpY29uLCBtYXNrLCBmbGFncyk7Ci0JCQl9Ci0JCQl2aWRlby0+U2V0SWNvbih2aWRlbywgaWNvbiwgbWFzayk7Ci0JCQlTRExfZnJlZShtYXNrKTsKLQkJfSBlbHNlIHsKLQkJCXZpZGVvLT5TZXRJY29uKHRoaXMsIGljb24sIG1hc2spOwotCQl9Ci0JfQotfQotCi0vKgotICogR3JhYiBvciB1bmdyYWIgdGhlIGtleWJvYXJkIGFuZCBtb3VzZSBpbnB1dC4KLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmluYWwgZ3JhYiBtb2RlIGFmdGVyIGNhbGxpbmcgdGhlCi0gKiBkcml2ZXIgZGVwZW5kZW50IGZ1bmN0aW9uLgotICovCi1zdGF0aWMgU0RMX0dyYWJNb2RlIFNETF9XTV9HcmFiSW5wdXRSYXcoU0RMX0dyYWJNb2RlIG1vZGUpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0JU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87Ci0KLQkvKiBPbmx5IGRvIHNvbWV0aGluZyBpZiB3ZSBoYXZlIHN1cHBvcnQgZm9yIGdyYWJzICovCi0JaWYgKCB2aWRlby0+R3JhYklucHV0ID09IE5VTEwgKSB7Ci0JCXJldHVybih2aWRlby0+aW5wdXRfZ3JhYik7Ci0JfQotCi0JLyogSWYgdGhlIGZpbmFsIGdyYWIgbW9kZSBpZiBvZmYsIG9ubHkgdGhlbiBkbyB3ZSBhY3R1YWxseSBncmFiICovCi0jaWZkZWYgREVCVUdfR1JBQgotICBwcmludGYoIlNETF9XTV9HcmFiSW5wdXRSYXcoJWQpIC4uLiAiLCBtb2RlKTsKLSNlbmRpZgotCWlmICggbW9kZSA9PSBTRExfR1JBQl9PRkYgKSB7Ci0JCWlmICggdmlkZW8tPmlucHV0X2dyYWIgIT0gU0RMX0dSQUJfT0ZGICkgewotCQkJbW9kZSA9IHZpZGVvLT5HcmFiSW5wdXQodGhpcywgbW9kZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIHZpZGVvLT5pbnB1dF9ncmFiID09IFNETF9HUkFCX09GRiApIHsKLQkJCW1vZGUgPSB2aWRlby0+R3JhYklucHV0KHRoaXMsIG1vZGUpOwotCQl9Ci0JfQotCWlmICggbW9kZSAhPSB2aWRlby0+aW5wdXRfZ3JhYiApIHsKLQkJdmlkZW8tPmlucHV0X2dyYWIgPSBtb2RlOwotCQlpZiAoIHZpZGVvLT5DaGVja01vdXNlTW9kZSApIHsKLQkJCXZpZGVvLT5DaGVja01vdXNlTW9kZSh0aGlzKTsKLQkJfQotCX0KLSNpZmRlZiBERUJVR19HUkFCCi0gIHByaW50ZigiRmluYWwgbW9kZSAlZFxuIiwgdmlkZW8tPmlucHV0X2dyYWIpOwotI2VuZGlmCi0KLQkvKiBSZXR1cm4gdGhlIGZpbmFsIGdyYWIgc3RhdGUgKi8KLQlpZiAoIG1vZGUgPj0gU0RMX0dSQUJfRlVMTFNDUkVFTiApIHsKLQkJbW9kZSAtPSBTRExfR1JBQl9GVUxMU0NSRUVOOwotCX0KLQlyZXR1cm4obW9kZSk7Ci19Ci1TRExfR3JhYk1vZGUgU0RMX1dNX0dyYWJJbnB1dChTRExfR3JhYk1vZGUgbW9kZSkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQotCS8qIElmIHRoZSB2aWRlbyBpc24ndCBpbml0aWFsaXplZCB5ZXQsIHdlIGNhbid0IGRvIGFueXRoaW5nICovCi0JaWYgKCAhIHZpZGVvICkgewotCQlyZXR1cm4gU0RMX0dSQUJfT0ZGOwotCX0KLQotCS8qIFJldHVybiB0aGUgY3VycmVudCBtb2RlIG9uIHF1ZXJ5ICovCi0JaWYgKCBtb2RlID09IFNETF9HUkFCX1FVRVJZICkgewotCQltb2RlID0gdmlkZW8tPmlucHV0X2dyYWI7Ci0JCWlmICggbW9kZSA+PSBTRExfR1JBQl9GVUxMU0NSRUVOICkgewotCQkJbW9kZSAtPSBTRExfR1JBQl9GVUxMU0NSRUVOOwotCQl9Ci0JCXJldHVybihtb2RlKTsKLQl9Ci0KLSNpZmRlZiBERUJVR19HUkFCCi0gIHByaW50ZigiU0RMX1dNX0dyYWJJbnB1dCglZCkgLi4uICIsIG1vZGUpOwotI2VuZGlmCi0JLyogSWYgdGhlIHZpZGVvIHN1cmZhY2UgaXMgZnVsbHNjcmVlbiwgd2UgYWx3YXlzIGdyYWIgKi8KLQlpZiAoIG1vZGUgPj0gU0RMX0dSQUJfRlVMTFNDUkVFTiApIHsKLQkJbW9kZSAtPSBTRExfR1JBQl9GVUxMU0NSRUVOOwotCX0KLQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgJiYgKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkgewotCQltb2RlICs9IFNETF9HUkFCX0ZVTExTQ1JFRU47Ci0JfQotCXJldHVybihTRExfV01fR3JhYklucHV0UmF3KG1vZGUpKTsKLX0KLXN0YXRpYyBTRExfR3JhYk1vZGUgU0RMX1dNX0dyYWJJbnB1dE9mZih2b2lkKQotewotCVNETF9HcmFiTW9kZSBtb2RlOwotCi0JLyogRmlyc3QgcXVlcnkgdGhlIGN1cnJlbnQgZ3JhYiBzdGF0ZSAqLwotCW1vZGUgPSBTRExfV01fR3JhYklucHV0KFNETF9HUkFCX1FVRVJZKTsKLQotCS8qIE5vdyBleHBsaWNpdGx5IHR1cm4gb2ZmIGlucHV0IGdyYWIgKi8KLQlTRExfV01fR3JhYklucHV0UmF3KFNETF9HUkFCX09GRik7Ci0KLQkvKiBSZXR1cm4gdGhlIG9sZCBzdGF0ZSAqLwotCXJldHVybihtb2RlKTsKLX0KLQotLyoKLSAqIEljb25pZnkgdGhlIHdpbmRvdyBpbiB3aW5kb3cgbWFuYWdlZCBlbnZpcm9ubWVudHMuCi0gKiBBIHN1Y2Nlc3NmdWwgaWNvbmlmaWNhdGlvbiB3aWxsIHJlc3VsdCBpbiBhbiBTRExfQVBQQUNUSVZFIGxvc3MgZXZlbnQuCi0gKi8KLWludCBTRExfV01fSWNvbmlmeVdpbmRvdyh2b2lkKQotewotCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSAwOwotCWlmICggdmlkZW8tPkljb25pZnlXaW5kb3cgKSB7Ci0JCXJldHZhbCA9IHZpZGVvLT5JY29uaWZ5V2luZG93KHRoaXMpOwotCX0KLQlyZXR1cm4ocmV0dmFsKTsKLX0KLQotLyoKLSAqIFRvZ2dsZSBmdWxsc2NyZWVuIG1vZGUKLSAqLwotaW50IFNETF9XTV9Ub2dnbGVGdWxsU2NyZWVuKFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwotCWludCB0b2dnbGVkOwotCi0JdG9nZ2xlZCA9IDA7Ci0JaWYgKCBTRExfUHVibGljU3VyZmFjZSAmJiAoc3VyZmFjZSA9PSBTRExfUHVibGljU3VyZmFjZSkgJiYKLQkgICAgIHZpZGVvLT5Ub2dnbGVGdWxsU2NyZWVuICkgewotCQlpZiAoIHN1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQl0b2dnbGVkID0gdmlkZW8tPlRvZ2dsZUZ1bGxTY3JlZW4odGhpcywgMCk7Ci0JCQlpZiAoIHRvZ2dsZWQgKSB7Ci0JCQkJU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9GVUxMU0NSRUVOOwotCQkJCVNETF9QdWJsaWNTdXJmYWNlLT5mbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0b2dnbGVkID0gdmlkZW8tPlRvZ2dsZUZ1bGxTY3JlZW4odGhpcywgMSk7Ci0JCQlpZiAoIHRvZ2dsZWQgKSB7Ci0JCQkJU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47Ci0JCQkJU0RMX1B1YmxpY1N1cmZhY2UtPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOwotCQkJfQotCQl9Ci0JCS8qIERvdWJsZS1jaGVjayB0aGUgZ3JhYiBzdGF0ZSBpbnNpZGUgU0RMX1dNX0dyYWJJbnB1dCgpICovCi0JCWlmICggdG9nZ2xlZCApIHsKLQkJCVNETF9XTV9HcmFiSW5wdXQodmlkZW8tPmlucHV0X2dyYWIpOwotCQl9Ci0JfQotCXJldHVybih0b2dnbGVkKTsKLX0KLQotLyoKLSAqICBTZXQgd2luZG93IHBvc2l0aW9uCi0gKi8KLXZvaWQgIFNETF9XTV9TZXRQb3MoaW50ICB4LCBpbnQgIHkpCi17Ci0gICAgU0RMX1ZpZGVvRGV2aWNlKiAgdmlkZW8gPSBjdXJyZW50X3ZpZGVvOwotCi0gICAgaWYgKHZpZGVvICYmIHZpZGVvLT5TZXRXaW5kb3dQb3MpCi0gICAgICAgIHZpZGVvLT5TZXRXaW5kb3dQb3ModmlkZW8sIHgsIHkpOwotfQotCi0vKgotICogR2V0IHdpbmRvdyBwb3NpdGlvbgotICovCi12b2lkICBTRExfV01fR2V0UG9zKGludCAgKnB4LCBpbnQgICpweSkKLXsKLSAgICBTRExfVmlkZW9EZXZpY2UqICB2aWRlbyA9IGN1cnJlbnRfdmlkZW87Ci0KLSAgICBpZiAodmlkZW8gJiYgdmlkZW8tPkdldFdpbmRvd1BvcykKLSAgICAgICAgdmlkZW8tPkdldFdpbmRvd1Bvcyh2aWRlbywgcHgsIHB5KTsKLSAgICBlbHNlIHsKLSAgICAgICAgKnB4ID0gMTAwOwotICAgICAgICAqcHkgPSAxMDA7Ci0gICAgfQotfQotCi1pbnQgICBTRExfV01fSXNGdWxseVZpc2libGUoIGludCAgcmVjZW50ZXIgKQotewotICAgIGludCAgcmVzdWx0ID0gMTsKLQotICAgIFNETF9WaWRlb0RldmljZSogIHZpZGVvID0gY3VycmVudF92aWRlbzsKLQotICAgIGlmICh2aWRlbyAmJiB2aWRlby0+SXNXaW5kb3dWaXNpYmxlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHZpZGVvLT5Jc1dpbmRvd1Zpc2libGUodmlkZW8sIHJlY2VudGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50ICAgU0RMX1dNX0dldE1vbml0b3JEUEkoIGludCAgKnhEcGksIGludCAgKnlEcGkgKQotewotICAgIGludCAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOwotICAgIFNETF9WaWRlb0RldmljZSogIHZpZGVvICA9IGN1cnJlbnRfdmlkZW87Ci0KLSAgICBpZiAodmlkZW8gJiYgdmlkZW8tPkdldE1vbml0b3JEUEkpIHsKLSAgICAgICAgcmVzdWx0ID0gdmlkZW8tPkdldE1vbml0b3JEUEkodmlkZW8sIHhEcGksIHlEcGkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgICBTRExfV01fR2V0TW9uaXRvclJlY3QoIFNETF9SZWN0ICAqcmVjdCApCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgU0RMX1ZpZGVvRGV2aWNlKiAgdmlkZW8gID0gY3VycmVudF92aWRlbzsKLQotICAgIGlmICh2aWRlbyAmJiB2aWRlby0+R2V0TW9uaXRvclJlY3QpIHsKLSAgICAgICAgcmVzdWx0ID0gdmlkZW8tPkdldE1vbml0b3JSZWN0KHZpZGVvLCByZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIEdldCBzb21lIHBsYXRmb3JtIGRlcGVuZGVudCB3aW5kb3cgbWFuYWdlciBpbmZvcm1hdGlvbgotICovCi1pbnQgU0RMX0dldFdNSW5mbyAoU0RMX1N5c1dNaW5mbyAqaW5mbykKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQotCWlmICggdmlkZW8gJiYgdmlkZW8tPkdldFdNSW5mbyApIHsKLQkJcmV0dXJuKHZpZGVvLT5HZXRXTUluZm8odGhpcywgaW5mbykpOwotCX0gZWxzZSB7Ci0JCXJldHVybigwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF95dXYuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3l1di5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTM2Y2ViLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3l1di5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgWVVWIHZpZGVvIHN1cmZhY2Ugc3VwcG9ydCAqLwotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3l1dmZ1bmNzLmgiCi0jaW5jbHVkZSAiU0RMX3l1dl9zd19jLmgiCi0KLQotU0RMX092ZXJsYXkgKlNETF9DcmVhdGVZVVZPdmVybGF5KGludCB3LCBpbnQgaCwgVWludDMyIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZGlzcGxheSkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKLQljb25zdCBjaGFyICp5dXZfaHdhY2NlbDsKLQlTRExfT3ZlcmxheSAqb3ZlcmxheTsKLQotCWlmICggKGRpc3BsYXktPmZsYWdzICYgU0RMX09QRU5HTCkgPT0gU0RMX09QRU5HTCApIHsKLQkJU0RMX1NldEVycm9yKCJZVVYgb3ZlcmxheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gT3BlbkdMIG1vZGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogRGlzcGxheSBkaXJlY3RseSBvbiB2aWRlbyBzdXJmYWNlLCBpZiBwb3NzaWJsZSAqLwotCWlmICggU0RMX2dldGVudigiU0RMX1ZJREVPX1lVVl9ESVJFQ1QiKSApIHsKLQkJaWYgKCAoZGlzcGxheSA9PSBTRExfUHVibGljU3VyZmFjZSkgJiYKLQkJICAgICAoKFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9PSAyKSB8fAotCQkgICAgICAoU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID09IDQpKSApIHsKLQkJCWRpc3BsYXkgPSBTRExfVmlkZW9TdXJmYWNlOwotCQl9Ci0JfQotCW92ZXJsYXkgPSBOVUxMOwotICAgICAgICB5dXZfaHdhY2NlbCA9IFNETF9nZXRlbnYoIlNETF9WSURFT19ZVVZfSFdBQ0NFTCIpOwotCWlmICggKChkaXNwbGF5ID09IFNETF9WaWRlb1N1cmZhY2UpICYmIHZpZGVvLT5DcmVhdGVZVVZPdmVybGF5KSAmJgotCSAgICAgKCF5dXZfaHdhY2NlbCB8fCAoU0RMX2F0b2koeXV2X2h3YWNjZWwpID4gMCkpICkgewotCQlvdmVybGF5ID0gdmlkZW8tPkNyZWF0ZVlVVk92ZXJsYXkodGhpcywgdywgaCwgZm9ybWF0LCBkaXNwbGF5KTsKLQl9Ci0JLyogSWYgaGFyZHdhcmUgWVVWIG92ZXJsYXkgZmFpbGVkIC4uLiAqLwotCWlmICggb3ZlcmxheSA9PSBOVUxMICkgewotCQlvdmVybGF5ID0gU0RMX0NyZWF0ZVlVVl9TVyh0aGlzLCB3LCBoLCBmb3JtYXQsIGRpc3BsYXkpOwotCX0KLQlyZXR1cm4gb3ZlcmxheTsKLX0KLQotaW50IFNETF9Mb2NrWVVWT3ZlcmxheShTRExfT3ZlcmxheSAqb3ZlcmxheSkKLXsKLQlpZiAoIG92ZXJsYXkgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgTlVMTCBvdmVybGF5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIG92ZXJsYXktPmh3ZnVuY3MtPkxvY2soY3VycmVudF92aWRlbywgb3ZlcmxheSk7Ci19Ci0KLXZvaWQgU0RMX1VubG9ja1lVVk92ZXJsYXkoU0RMX092ZXJsYXkgKm92ZXJsYXkpCi17Ci0JaWYgKCBvdmVybGF5ID09IE5VTEwgKSB7Ci0JCXJldHVybjsKLQl9Ci0Jb3ZlcmxheS0+aHdmdW5jcy0+VW5sb2NrKGN1cnJlbnRfdmlkZW8sIG92ZXJsYXkpOwotfQotCi1pbnQgU0RMX0Rpc3BsYXlZVVZPdmVybGF5KFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqZHN0cmVjdCkKLXsKLQlTRExfUmVjdCBzcmMsIGRzdDsKLQlpbnQgc3JjeCwgc3JjeSwgc3Jjdywgc3JjaDsKLQlpbnQgZHN0eCwgZHN0eSwgZHN0dywgZHN0aDsKLQotCWlmICggb3ZlcmxheSA9PSBOVUxMIHx8IGRzdHJlY3QgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJQYXNzZWQgTlVMTCBvdmVybGF5IG9yIGRzdHJlY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIENsaXAgdGhlIHJlY3RhbmdsZSB0byB0aGUgc2NyZWVuIGFyZWEgKi8KLQlzcmN4ID0gMDsKLQlzcmN5ID0gMDsKLQlzcmN3ID0gb3ZlcmxheS0+dzsKLQlzcmNoID0gb3ZlcmxheS0+aDsKLQlkc3R4ID0gZHN0cmVjdC0+eDsKLQlkc3R5ID0gZHN0cmVjdC0+eTsKLQlkc3R3ID0gZHN0cmVjdC0+dzsKLQlkc3RoID0gZHN0cmVjdC0+aDsKLQlpZiAoIGRzdHggPCAwICkgewotCQlzcmN3ICs9IChkc3R4ICogb3ZlcmxheS0+dykgLyBkc3RyZWN0LT53OwotCQlkc3R3ICs9IGRzdHg7Ci0JCXNyY3ggLT0gKGRzdHggKiBvdmVybGF5LT53KSAvIGRzdHJlY3QtPnc7Ci0JCWRzdHggPSAwOwotCX0KLQlpZiAoIChkc3R4K2RzdHcpID4gY3VycmVudF92aWRlby0+c2NyZWVuLT53ICkgewotCQlpbnQgZXh0cmEgPSAoZHN0eCtkc3R3IC0gY3VycmVudF92aWRlby0+c2NyZWVuLT53KTsKLQkJc3JjdyAtPSAoZXh0cmEgKiBvdmVybGF5LT53KSAvIGRzdHJlY3QtPnc7Ci0JCWRzdHcgLT0gZXh0cmE7Ci0JfQotCWlmICggZHN0eSA8IDAgKSB7Ci0JCXNyY2ggKz0gKGRzdHkgKiBvdmVybGF5LT5oKSAvIGRzdHJlY3QtPmg7Ci0JCWRzdGggKz0gZHN0eTsKLQkJc3JjeSAtPSAoZHN0eSAqIG92ZXJsYXktPmgpIC8gZHN0cmVjdC0+aDsKLQkJZHN0eSA9IDA7Ci0JfQotCWlmICggKGRzdHkrZHN0aCkgPiBjdXJyZW50X3ZpZGVvLT5zY3JlZW4tPmggKSB7Ci0JCWludCBleHRyYSA9IChkc3R5K2RzdGggLSBjdXJyZW50X3ZpZGVvLT5zY3JlZW4tPmgpOwotCQlzcmNoIC09IChleHRyYSAqIG92ZXJsYXktPmgpIC8gZHN0cmVjdC0+aDsKLQkJZHN0aCAtPSBleHRyYTsKLQl9Ci0JaWYgKCBzcmN3IDw9IDAgfHwgc3JjaCA8PSAwIHx8Ci0JICAgICBzcmNoIDw9IDAgfHwgZHN0aCA8PSAwICkgewotCQlyZXR1cm4gMDsKLQl9Ci0JLyogVWdoLCBJIGNhbid0IHdhaXQgZm9yIFNETF9SZWN0IHRvIGJlIGludCB2YWx1ZXMgKi8KLQlzcmMueCA9IHNyY3g7Ci0Jc3JjLnkgPSBzcmN5OwotCXNyYy53ID0gc3JjdzsKLQlzcmMuaCA9IHNyY2g7Ci0JZHN0LnggPSBkc3R4OwotCWRzdC55ID0gZHN0eTsKLQlkc3QudyA9IGRzdHc7Ci0JZHN0LmggPSBkc3RoOwotCXJldHVybiBvdmVybGF5LT5od2Z1bmNzLT5EaXNwbGF5KGN1cnJlbnRfdmlkZW8sIG92ZXJsYXksICZzcmMsICZkc3QpOwotfQotCi12b2lkIFNETF9GcmVlWVVWT3ZlcmxheShTRExfT3ZlcmxheSAqb3ZlcmxheSkKLXsKLQlpZiAoIG92ZXJsYXkgPT0gTlVMTCApIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIG92ZXJsYXktPmh3ZnVuY3MgKSB7Ci0JCW92ZXJsYXktPmh3ZnVuY3MtPkZyZWVIVyhjdXJyZW50X3ZpZGVvLCBvdmVybGF5KTsKLQl9Ci0JU0RMX2ZyZWUob3ZlcmxheSk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF95dXZfbW14LmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF95dXZfbW14LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OWRkNTAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfeXV2X21teC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWYgKF9fR05VQ19fID4gMikgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgX19PUFRJTUlaRV9fICYmIFNETF9BU1NFTUJMWV9ST1VUSU5FUwotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotCi0jaW5jbHVkZSAibW14LmgiCi0KLS8qICpJTkRFTlQtT0ZGKiAqLwotCi1zdGF0aWMgbW14X3QgTU1YXzAwODB3ICAgID0geyAudWQgPSB7MHgwMDgwMDA4MCwgMHgwMDgwMDA4MH0gfTsKLXN0YXRpYyBtbXhfdCBNTVhfMDBGRncgICAgPSB7IC51ZCA9IHsweDAwZmYwMGZmLCAweDAwZmYwMGZmfSB9Owotc3RhdGljIG1teF90IE1NWF9GRjAwdyAgICA9IHsgLnVkID0gezB4ZmYwMGZmMDAsIDB4ZmYwMGZmMDB9IH07Ci0KLXN0YXRpYyBtbXhfdCBNTVhfWWNvZWZmICAgPSB7IC51dyA9IHsweDAwNGEsIDB4MDA0YSwgMHgwMDRhLCAweDAwNGF9IH07Ci0KLXN0YXRpYyBtbXhfdCBNTVhfVWJsdVJHQiAgPSB7IC51dyA9IHsweDAwNzIsIDB4MDA3MiwgMHgwMDcyLCAweDAwNzJ9IH07Ci1zdGF0aWMgbW14X3QgTU1YX1ZyZWRSR0IgID0geyAudXcgPSB7MHgwMDU5LCAweDAwNTksIDB4MDA1OSwgMHgwMDU5fSB9Owotc3RhdGljIG1teF90IE1NWF9VZ3JuUkdCICA9IHsgLnV3ID0gezB4ZmZlYSwgMHhmZmVhLCAweGZmZWEsIDB4ZmZlYX0gfTsKLXN0YXRpYyBtbXhfdCBNTVhfVmdyblJHQiAgPSB7IC51dyA9IHsweGZmZDIsIDB4ZmZkMiwgMHhmZmQyLCAweGZmZDJ9IH07Ci0KLXN0YXRpYyBtbXhfdCBNTVhfVWJsdTV4NSAgPSB7IC51dyA9IHsweDAwODEsIDB4MDA4MSwgMHgwMDgxLCAweDAwODF9IH07Ci1zdGF0aWMgbW14X3QgTU1YX1ZyZWQ1eDUgID0geyAudXcgPSB7MHgwMDY2LCAweDAwNjYsIDB4MDA2NiwgMHgwMDY2fSB9Owotc3RhdGljIG1teF90IE1NWF9VZ3JuNTY1ICA9IHsgLnV3ID0gezB4ZmZlOCwgMHhmZmU4LCAweGZmZTgsIDB4ZmZlOH0gfTsKLXN0YXRpYyBtbXhfdCBNTVhfVmdybjU2NSAgPSB7IC51dyA9IHsweGZmY2QsIDB4ZmZjZCwgMHhmZmNkLCAweGZmY2R9IH07Ci0KLXN0YXRpYyBtbXhfdCBNTVhfcmVkNTY1ICAgPSB7IC51dyA9IHsweGY4MDAsIDB4ZjgwMCwgMHhmODAwLCAweGY4MDB9IH07Ci1zdGF0aWMgbW14X3QgTU1YX2dybjU2NSAgID0geyAudXcgPSB7MHgwN2UwLCAweDA3ZTAsIDB4MDdlMCwgMHgwN2UwfSB9OwotCi0vKioKLSAgIFRoaXMgTU1YIGFzc2VtYmxlciBpcyBteSBmaXJzdCBhc3NlbWJsZXIvTU1YIHByb2dyYW0gZXZlci4KLSAgIFRodXMgaXQgbWF5YmUgYnVnZ3kuCi0gICBTZW5kIHBhdGNoZXMgdG86Ci0gICBtdm9ndEByaHJrLnVuaS1rbC5kZQotCi0gICBBZnRlciBpdCB3b3JrZWQgZmluZSBJIGhhdmUgIm9iZnVzY2F0ZWQiIHRoZSBjb2RlIGEgYml0IHRvIGhhdmUKLSAgIG1vcmUgcGFyYWxsaXNtIGluIHRoZSBNTVggdW5pdHMuIFRoaXMgbWVhbnMgSSBtb3ZlZAotICAgaW5pdGlsaXNhdGlvbiBhcm91bmQgYW5kIGRlbGF5ZWQgb3RoZXIgaW5zdHJ1Y3Rpb24uCi0gICBQZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBkaWQgbm90IHNob3cgdGhhdCB0aGlzIGJyb3VnaHQgYW55IGFkdmFudGFnZQotICAgYnV0IGluIHRoZW9yeSBpdCBfc2hvdWxkXyBiZSBmYXN0ZXIgdGhpcyB3YXkuCi0KLSAgIFRoZSBvdmVyYWxsIHBlcmZvcm1hbnZlIGdhaW4gdG8gdGhlIEMgYmFzZWQgZGl0aGVyIHdhcyAzMCUtNDAlLgotICAgVGhlIE1NWCByb3V0aW5lIGNhbGN1bGF0ZXMgMjU2Yml0PThSR0IgdmFsdWVzIGluIGVhY2ggY3ljbGUKLSAgICg0IGZvciByb3cxICYgNCBmb3Igcm93MikKLQotICAgVGhlIHJlZC9ncmVlbi9ibHVlLi4gY29lZmZpY2VudHMgYXJlIHRha2VuIGZyb20gdGhlIG1wZWdfcGxheSAKLSAgIHBsYXllci4gVGhleSBsb29rIG5pY2UsIGJ1dCBJIGRvbnQga25vdyBpZiB5b3UgY2FuIGhhdmUKLSAgIGJldHRlciB2YWx1ZXMsIHRvIGF2b2lkIGludGVnZXIgcm91bmRpbmcgZXJyb3JzLgotICAgCi0KLSAgIElNUE9SVEFOVDoKLSAgID09PT09PT09PT0KLQotICAgSXQgaXMgYSByZXF1aXJlbWVudCB0aGF0IHRoZSBjci9jYi9sdW0gYXJlIDggYnl0ZSBhbGlnbmVkIGFuZAotICAgdGhlIG91dCBhcmUgMTZieXRlIGFsaWduZWQgb3IgeW91IHdpbGwvbWF5IGdldCBzZWdmYXVsdHMKLQotKi8KLQotdm9pZCBDb2xvclJHQkRpdGhlcllWMTJNTVgxWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCi17Ci0JVWludDMyICpyb3cxOwotCVVpbnQzMiAqcm93MjsKLQotCXVuc2lnbmVkIGNoYXIqIHkgPSBsdW0gK2NvbHMqcm93czsgICAgLy8gUG9pbnRlciB0byB0aGUgZW5kCi0JaW50IHggPSAwOwotCXJvdzEgPSAoVWludDMyICopb3V0OyAgICAgICAgICAgICAgICAgLy8gMzIgYml0IHRhcmdldAotCXJvdzIgPSAoVWludDMyICopb3V0K2NvbHMrbW9kOyAgICAgICAgLy8gc3RhcnQgb2Ygc2Vjb25kIHJvdwotCW1vZCA9IChtb2QrY29scyttb2QpKjQ7ICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGZvciByb3cxIGluIGJ5dGUKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJLy8gdGFwIGRhbmNlIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSB0byB1c2UgJSVlYnggYXQgd2lsbC4uLgotCQkvLyAgbW92ZSBvbmUgdGhpbmcgdG8gdGhlIHN0YWNrLi4uCi0JCSJwdXNobCAkMFxuIiAgLy8gc2F2ZSBhIHNsb3Qgb24gdGhlIHN0YWNrLgotCQkicHVzaGwgJSVlYnhcbiIgIC8vIHNhdmUgJSVlYnguCi0JCSJtb3ZsICUwLCAlJWVieFxuIiAgLy8gcHV0IHRoZSB0aGluZyBpbiBlYnguCi0JCSJtb3ZsICUlZWJ4LDQoJSVlc3ApXG4iICAvLyBwdXQgdGhlIHRoaW5nIGluIHRoZSBzdGFjayBzbG90LgotCQkicG9wbCAlJWVieFxuIiAgLy8gZ2V0IGJhY2sgJSVlYnggKHRoZSBQSUMgcmVnaXN0ZXIpLgotCi0JCSIuYWxpZ24gOFxuIgotCQkiMTpcbiIKLQotCQkvLyBjcmVhdGUgQ3IgKHJlc3VsdCBpbiBtbTEpCi0JCSJwdXNobCAlJWVieFxuIgotCQkibW92bCA0KCUlZXNwKSwlJWVieFxuIgotCQkibW92ZCAoJSVlYngpLCUlbW0xXG4iICAgLy8gICAgICAgICAwICAwICAwICAwICB2MyB2MiB2MSB2MAotCQkicG9wbCAlJWVieFxuIgotCQkicHhvciAlJW1tNywlJW1tN1xuIiAgICAgIC8vICAgICAgICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKLQkJIm1vdmQgKCUyKSwgJSVtbTJcbiIgICAgICAgICAgIC8vICAgIDAgIDAgIDAgIDAgbDMgbDIgbDEgbDAKLQkJInB1bnBja2xidyAlJW1tNywlJW1tMVxuIiAvLyAgICAgICAgIDAgIHYzIDAgIHYyIDAwIHYxIDAwIHYwCi0JCSJwdW5wY2tsZHEgJSVtbTEsJSVtbTFcbiIgLy8gICAgICAgICAwMCB2MSAwMCB2MCAwMCB2MSAwMCB2MAotCQkicHN1YncgJTksJSVtbTFcbiIgICAgICAgIC8vIG1tMS0xMjg6cjEgcjEgcjAgcjAgcjEgcjEgcjAgcjAKLQotCQkgLy8gY3JlYXRlIENyX2cgKHJlc3VsdCBpbiBtbTApCi0JCSJtb3ZxICUlbW0xLCUlbW0wXG4iICAgICAgICAgICAvLyByMSByMSByMCByMCByMSByMSByMCByMAotCQkicG11bGx3ICUxMCwlJW1tMFxuIiAgICAgICAgICAgLy8gcmVkKi00NmRlYz0wLjcxMzYqNjQKLQkJInBtdWxsdyAlMTEsJSVtbTFcbiIgICAgICAgICAgIC8vIHJlZCo4OWRlYz0xLjQwMTMqNjQKLQkJInBzcmF3ICAkNiwgJSVtbTBcbiIgICAgICAgICAgIC8vIHJlZD1yZWQvNjQKLQkJInBzcmF3ICAkNiwgJSVtbTFcbiIgICAgICAgICAgIC8vIHJlZD1yZWQvNjQKLQotCQkvLyBjcmVhdGUgTDEgTDIgKHJlc3VsdCBpbiBtbTIsbW00KQotCQkvLyBMMj1sdW0rY29scwotCQkibW92cSAoJTIsJTQpLCUlbW0zXG4iICAgICAgICAgLy8gICAgMCAgMCAgMCAgMCBMMyBMMiBMMSBMMAotCQkicHVucGNrbGRxICUlbW0zLCUlbW0yXG4iICAgICAgLy8gICBMMyBMMiBMMSBMMCBsMyBsMiBsMSBsMAotCQkibW92cSAlJW1tMiwlJW1tNFxuIiAgICAgICAgICAgLy8gICBMMyBMMiBMMSBMMCBsMyBsMiBsMSBsMAotCQkicGFuZCAlMTIsJSVtbTJcbiIgICAgICAgICAgICAgLy8gICBMMyAwICBMMSAgMCBsMyAgMCBsMSAgMAotCQkicGFuZCAlMTMsJSVtbTRcbiIgICAgICAgICAgICAgLy8gICAwICBMMiAgMCBMMCAgMCBsMiAgMCBsMAotCQkicHNybHcgJDgsJSVtbTJcbiIgICAgICAgICAgICAgLy8gICAwICBMMyAgMCBMMSAgMCBsMyAgMCBsMQotCi0JCS8vIGNyZWF0ZSBSIChyZXN1bHQgaW4gbW02KQotCQkibW92cSAlJW1tMiwlJW1tNVxuIiAgICAgICAgICAgLy8gICAwIEwzICAwIEwxICAwIGwzICAwIGwxCi0JCSJtb3ZxICUlbW00LCUlbW02XG4iICAgICAgICAgICAvLyAgIDAgTDIgIDAgTDAgIDAgbDIgIDAgbDAKLQkJInBhZGRzdyAgJSVtbTEsICUlbW01XG4iICAgICAgIC8vIGx1bTErcmVkOnggUjMgeCBSMSB4IHIzIHggcjEKLQkJInBhZGRzdyAgJSVtbTEsICUlbW02XG4iICAgICAgIC8vIGx1bTErcmVkOnggUjIgeCBSMCB4IHIyIHggcjAKLQkJInBhY2t1c3diICUlbW01LCUlbW01XG4iICAgICAgIC8vICBSMyBSMSByMyByMSBSMyBSMSByMyByMQotCQkicGFja3Vzd2IgJSVtbTYsJSVtbTZcbiIgICAgICAgLy8gIFIyIFIwIHIyIHIwIFIyIFIwIHIyIHIwCi0JCSJweG9yICUlbW03LCUlbW03XG4iICAgICAgLy8gICAgICAgICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAotCQkicHVucGNrbGJ3ICUlbW01LCUlbW02XG4iICAgICAgLy8gIFIzIFIyIFIxIFIwIHIzIHIyIHIxIHIwCi0KLQkJLy8gY3JlYXRlIENiIChyZXN1bHQgaW4gbW0xKQotCQkibW92ZCAoJTEpLCAlJW1tMVxuIiAgICAgIC8vICAgICAgICAgMCAgMCAgMCAgMCAgdTMgdTIgdTEgdTAKLQkJInB1bnBja2xidyAlJW1tNywlJW1tMVxuIiAvLyAgICAgICAgIDAgIHUzIDAgIHUyIDAwIHUxIDAwIHUwCi0JCSJwdW5wY2tsZHEgJSVtbTEsJSVtbTFcbiIgLy8gICAgICAgICAwMCB1MSAwMCB1MCAwMCB1MSAwMCB1MAotCQkicHN1YncgJTksJSVtbTFcbiIgICAgICAgIC8vIG1tMS0xMjg6dTEgdTEgdTAgdTAgdTEgdTEgdTAgdTAKLQkJLy8gY3JlYXRlIENiX2cgKHJlc3VsdCBpbiBtbTUpCi0JCSJtb3ZxICUlbW0xLCUlbW01XG4iICAgICAgICAgICAgLy8gdTEgdTEgdTAgdTAgdTEgdTEgdTAgdTAKLQkJInBtdWxsdyAlMTQsJSVtbTVcbiIgICAgICAgICAgICAvLyBibHVlKi0xMDlkZWM9MS43MTI5KjY0Ci0JCSJwbXVsbHcgJTE1LCUlbW0xXG4iICAgICAgICAgICAgLy8gYmx1ZSoxMTRkZWM9MS43ODEyNSo2NAotCQkicHNyYXcgICQ2LCAlJW1tNVxuIiAgICAgICAgICAgIC8vIGJsdWU9cmVkLzY0Ci0JCSJwc3JhdyAgJDYsICUlbW0xXG4iICAgICAgICAgICAgLy8gYmx1ZT1ibHVlLzY0Ci0KLQkJLy8gY3JlYXRlIEcgKHJlc3VsdCBpbiBtbTcpCi0JCSJtb3ZxICUlbW0yLCUlbW0zXG4iICAgICAgLy8gICAwICBMMyAgMCBMMSAgMCBsMyAgMCBsMQotCQkibW92cSAlJW1tNCwlJW1tN1xuIiAgICAgIC8vICAgMCAgTDIgIDAgTDAgIDAgbDIgIDAgbDEKLQkJInBhZGRzdyAgJSVtbTUsICUlbW0zXG4iICAvLyBsdW0xK0NiX2c6eCBHM3QgeCBHMXQgeCBnM3QgeCBnMXQKLQkJInBhZGRzdyAgJSVtbTUsICUlbW03XG4iICAvLyBsdW0xK0NiX2c6eCBHMnQgeCBHMHQgeCBnMnQgeCBnMHQKLQkJInBhZGRzdyAgJSVtbTAsICUlbW0zXG4iICAvLyBsdW0xK0NyX2c6eCBHMyAgeCBHMSAgeCBnMyAgeCBnMQotCQkicGFkZHN3ICAlJW1tMCwgJSVtbTdcbiIgIC8vIGx1bTErYmx1ZTp4IEcyICB4IEcwICB4IGcyICB4IGcwCi0JCSJwYWNrdXN3YiAlJW1tMywlJW1tM1xuIiAgLy8gRzMgRzEgZzMgZzEgRzMgRzEgZzMgZzEKLQkJInBhY2t1c3diICUlbW03LCUlbW03XG4iICAvLyBHMiBHMCBnMiBnMCBHMiBHMCBnMiBnMAotCQkicHVucGNrbGJ3ICUlbW0zLCUlbW03XG4iIC8vIEczIEcyIEcxIEcwIGczIGcyIGcxIGcwCi0KLQkJLy8gY3JlYXRlIEIgKHJlc3VsdCBpbiBtbTUpCi0JCSJtb3ZxICUlbW0yLCUlbW0zXG4iICAgICAgICAgLy8gICAwICBMMyAgMCBMMSAgMCBsMyAgMCBsMQotCQkibW92cSAlJW1tNCwlJW1tNVxuIiAgICAgICAgIC8vICAgMCAgTDIgIDAgTDAgIDAgbDIgIDAgbDEKLQkJInBhZGRzdyAgJSVtbTEsICUlbW0zXG4iICAgICAvLyBsdW0xK2JsdWU6eCBCMyB4IEIxIHggYjMgeCBiMQotCQkicGFkZHN3ICAlJW1tMSwgJSVtbTVcbiIgICAgIC8vIGx1bTErYmx1ZTp4IEIyIHggQjAgeCBiMiB4IGIwCi0JCSJwYWNrdXN3YiAlJW1tMywlJW1tM1xuIiAgICAgLy8gQjMgQjEgYjMgYjEgQjMgQjEgYjMgYjEKLQkJInBhY2t1c3diICUlbW01LCUlbW01XG4iICAgICAvLyBCMiBCMCBiMiBiMCBCMiBCMCBiMiBiMAotCQkicHVucGNrbGJ3ICUlbW0zLCUlbW01XG4iICAgIC8vIEIzIEIyIEIxIEIwIGIzIGIyIGIxIGIwCi0KLQkJLy8gZmlsbCBkZXN0aW5hdGlvbiByb3cxIChuZWVkZWQgYXJlIG1tNj1ScixtbTc9R2csbW01PUJiKQotCi0JCSJweG9yICUlbW0yLCUlbW0yXG4iICAgICAgICAgICAvLyAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMAotCQkicHhvciAlJW1tNCwlJW1tNFxuIiAgICAgICAgICAgLy8gIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAKLQkJIm1vdnEgJSVtbTYsJSVtbTFcbiIgICAgICAgICAgIC8vIFIzIFIyIFIxIFIwIHIzIHIyIHIxIHIwCi0JCSJtb3ZxICUlbW01LCUlbW0zXG4iICAgICAgICAgICAvLyBCMyBCMiBCMSBCMCBiMyBiMiBiMSBiMAotCQkvLyBwcm9jZXNzIGxvd2VyIGx1bQotCQkicHVucGNrbGJ3ICUlbW00LCUlbW0xXG4iICAgICAgLy8gIDAgcjMgIDAgcjIgIDAgcjEgIDAgcjAKLQkJInB1bnBja2xidyAlJW1tNCwlJW1tM1xuIiAgICAgIC8vICAwIGIzICAwIGIyICAwIGIxICAwIGIwCi0JCSJtb3ZxICUlbW0xLCUlbW0yXG4iICAgICAgICAgICAvLyAgMCByMyAgMCByMiAgMCByMSAgMCByMAotCQkibW92cSAlJW1tMywlJW1tMFxuIiAgICAgICAgICAgLy8gIDAgYjMgIDAgYjIgIDAgYjEgIDAgYjAKLQkJInB1bnBja2x3ZCAlJW1tMSwlJW1tM1xuIiAgICAgIC8vICAwIHIxICAwIGIxICAwIHIwICAwIGIwCi0JCSJwdW5wY2tod2QgJSVtbTIsJSVtbTBcbiIgICAgICAvLyAgMCByMyAgMCBiMyAgMCByMiAgMCBiMgotCi0JCSJweG9yICUlbW0yLCUlbW0yXG4iICAgICAgICAgICAvLyAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMAotCQkibW92cSAlJW1tNywlJW1tMVxuIiAgICAgICAgICAgLy8gRzMgRzIgRzEgRzAgZzMgZzIgZzEgZzAKLQkJInB1bnBja2xidyAlJW1tMSwlJW1tMlxuIiAgICAgIC8vIGczICAwIGcyICAwIGcxICAwIGcwICAwCi0JCSJwdW5wY2tsd2QgJSVtbTQsJSVtbTJcbiIgICAgICAvLyAgMCAgMCBnMSAgMCAgMCAgMCBnMCAgMAotCQkicG9yICUlbW0zLCAlJW1tMlxuIiAgICAgICAgICAvLyAgMCByMSBnMSBiMSAgMCByMCBnMCBiMAotCQkibW92cSAlJW1tMiwoJTMpXG4iICAgICAgICAgIC8vIHdyb3RlIG91dCAhIHJvdzEKLQotCQkicHhvciAlJW1tMiwlJW1tMlxuIiAgICAgICAgICAgLy8gIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAKLQkJInB1bnBja2xidyAlJW1tMSwlJW1tNFxuIiAgICAgIC8vIGczICAwIGcyICAwIGcxICAwIGcwICAwCi0JCSJwdW5wY2tod2QgJSVtbTIsJSVtbTRcbiIgICAgICAvLyAgMCAgMCBnMyAgMCAgMCAgMCBnMiAgMAotCQkicG9yICUlbW0wLCAlJW1tNFxuIiAgICAgICAgICAvLyAgMCByMyBnMyBiMyAgMCByMiBnMiBiMgotCQkibW92cSAlJW1tNCw4KCUzKVxuIiAgICAgICAgIC8vIHdyb3RlIG91dCAhIHJvdzEKLQkJIAotCQkvLyBmaWxsIGRlc3RpbmF0aW9uIHJvdzIgKG5lZWRlZCBhcmUgbW02PVJyLG1tNz1HZyxtbTU9QmIpCi0JCS8vIHRoaXMgY2FuIGJlIGRvbmUgImRlc3RydWN0aXZlIgotCQkicHhvciAlJW1tMiwlJW1tMlxuIiAgICAgICAgICAgLy8gIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAKLQkJInB1bnBja2hidyAlJW1tMiwlJW1tNlxuIiAgICAgIC8vICAwIFIzICAwIFIyICAwIFIxICAwIFIwCi0JCSJwdW5wY2toYncgJSVtbTEsJSVtbTVcbiIgICAgICAvLyBHMyBCMyBHMiBCMiBHMSBCMSBHMCBCMAotCQkibW92cSAlJW1tNSwlJW1tMVxuIiAgICAgICAgICAgLy8gRzMgQjMgRzIgQjIgRzEgQjEgRzAgQjAKLQkJInB1bnBja2x3ZCAlJW1tNiwlJW1tMVxuIiAgICAgIC8vICAwIFIxIEcxIEIxICAwIFIwIEcwIEIwCi0JCSJtb3ZxICUlbW0xLCglNSlcbiIgICAgICAgICAgLy8gd3JvdGUgb3V0ICEgcm93MgotCQkicHVucGNraHdkICUlbW02LCUlbW01XG4iICAgICAgLy8gIDAgUjMgRzMgQjMgIDAgUjIgRzIgQjIKLQkJIm1vdnEgJSVtbTUsOCglNSlcbiIgICAgICAgICAvLyB3cm90ZSBvdXQgISByb3cyCi0JCSAKLQkJImFkZGwgJDQsJTJcbiIgICAgICAgICAgICAvLyBsdW0rNAotCQkibGVhbCAxNiglMyksJTNcbiIgICAgICAgIC8vIHJvdzErMTYKLQkJImxlYWwgMTYoJTUpLCU1XG4iICAgICAgICAvLyByb3cyKzE2Ci0JCSJhZGRsICQyLCglJWVzcClcbiIgICAgICAgIC8vIGNyKzIKLQkJImFkZGwgJDIsJTFcbiIgICAgICAgICAgIC8vIGNiKzIKLQotCQkiYWRkbCAkNCwlNlxuIiAgICAgICAgICAgIC8vIHgrNAotCQkiY21wbCAlNCwlNlxuIgotCi0JCSJqbCAxYlxuIgotCQkiYWRkbCAlNCwlMlxuIiAvLyBsdW0gKz0gY29scwotCQkiYWRkbCAlOCwlM1xuIiAvLyByb3cxKz0gbW9kCi0JCSJhZGRsICU4LCU1XG4iIC8vIHJvdzIrPSBtb2QKLQkJIm1vdmwgJDAsJTZcbiIgLy8geD0wCi0JCSJjbXBsICU3LCUyXG4iCi0JCSJqbCAxYlxuIgotCi0JCSJhZGRsICQ0LCUlZXNwXG4iICAvLyBnZXQgcmlkIG9mIHRoZSBzdGFjayBzbG90IHdlIHJlc2VydmVkLgotCQkiZW1tc1xuIiAgLy8gcmVzZXQgTU1YIHJlZ2lzdGVycy4KLQkJOgotCQk6ICJtIiAoY3IpLCAiciIoY2IpLCJyIihsdW0pLAotCQkgICJyIihyb3cxKSwiciIoY29scyksInIiKHJvdzIpLCJtIih4KSwibSIoeSksIm0iKG1vZCksCi0JCSAgIm0iKE1NWF8wMDgwdyksIm0iKE1NWF9WZ3JuUkdCKSwibSIoTU1YX1ZyZWRSR0IpLAotCQkgICJtIihNTVhfRkYwMHcpLCJtIihNTVhfMDBGRncpLCJtIihNTVhfVWdyblJHQiksCi0JCSAgIm0iKE1NWF9VYmx1UkdCKQotCSk7Ci19Ci0KLXZvaWQgQ29sb3I1NjVEaXRoZXJZVjEyTU1YMVgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKQotewotCVVpbnQxNiAqcm93MTsKLQlVaW50MTYgKnJvdzI7Ci0KLQl1bnNpZ25lZCBjaGFyKiB5ID0gbHVtICtjb2xzKnJvd3M7ICAgIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCAqLwotCWludCB4ID0gMDsKLQlyb3cxID0gKFVpbnQxNiAqKW91dDsgICAgICAgICAgICAgICAgIC8qIDE2IGJpdCB0YXJnZXQgKi8KLQlyb3cyID0gKFVpbnQxNiAqKW91dCtjb2xzK21vZDsgICAgICAgIC8qIHN0YXJ0IG9mIHNlY29uZCByb3cgICovCi0JbW9kID0gKG1vZCtjb2xzK21vZCkqMjsgICAgICAgICAgICAgICAvKiBpbmNyZW1lbnQgZm9yIHJvdzEgaW4gYnl0ZSAqLwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCS8vIHRhcCBkYW5jZSB0byB3b3JrYXJvdW5kIHRoZSBpbmFiaWxpdHkgdG8gdXNlICUlZWJ4IGF0IHdpbGwuLi4KLQkJLy8gIG1vdmUgb25lIHRoaW5nIHRvIHRoZSBzdGFjay4uLgotCQkicHVzaGwgJDBcbiIgIC8vIHNhdmUgYSBzbG90IG9uIHRoZSBzdGFjay4KLQkJInB1c2hsICUlZWJ4XG4iICAvLyBzYXZlICUlZWJ4LgotCQkibW92bCAlMCwgJSVlYnhcbiIgIC8vIHB1dCB0aGUgdGhpbmcgaW4gZWJ4LgotCQkibW92bCAlJWVieCwgNCglJWVzcClcbiIgIC8vIHB1dCB0aGUgdGhpbmcgaW4gdGhlIHN0YWNrIHNsb3QuCi0JCSJwb3BsICUlZWJ4XG4iICAvLyBnZXQgYmFjayAlJWVieCAodGhlIFBJQyByZWdpc3RlcikuCi0KLQkJIi5hbGlnbiA4XG4iCi0JCSIxOlxuIgotCQkibW92ZCAgICAgICAgICAgKCUxKSwgICAgICAgICAgICAgICAgICAgJSVtbTBcbiIgLy8gNCBDYiAgICAgICAgIDAgIDAgIDAgIDAgdTMgdTIgdTEgdTAKLQkJInB4b3IgICAgICAgICAgICUlbW03LCAgICAgICAgICAgICAgICAgICUlbW03XG4iCi0JCSJwdXNobCAlJWVieFxuIgotCQkibW92bCA0KCUlZXNwKSwgJSVlYnhcbiIKLQkJIm1vdmQgKCUlZWJ4KSwgJSVtbTFcbiIgICAvLyA0IENyICAgICAgICAgICAgICAgIDAgIDAgIDAgIDAgdjMgdjIgdjEgdjAKLQkJInBvcGwgJSVlYnhcbiIKLQotCQkicHVucGNrbGJ3ICAgICAgJSVtbTcsICAgICAgICAgICAgICAgICAgJSVtbTBcbiIgLy8gNCBXIGNiICAgMCB1MyAgMCB1MiAgMCB1MSAgMCB1MAotCQkicHVucGNrbGJ3ICAgICAgJSVtbTcsICAgICAgICAgICAgICAgICAgJSVtbTFcbiIgLy8gNCBXIGNyICAgMCB2MyAgMCB2MiAgMCB2MSAgMCB2MAotCQkicHN1YncgICAgICAgICAgJTksICAgICAgICAgICAgICAgICAgICAgJSVtbTBcbiIKLQkJInBzdWJ3ICAgICAgICAgICU5LCAgICAgICAgICAgICAgICAgICAgICUlbW0xXG4iCi0JCSJtb3ZxICAgICAgICAgICAlJW1tMCwgICAgICAgICAgICAgICAgICAlJW1tMlxuIiAvLyBDYiAgICAgICAgICAgICAgICAgICAwIHUzICAwIHUyICAwIHUxICAwIHUwCi0JCSJtb3ZxICAgICAgICAgICAlJW1tMSwgICAgICAgICAgICAgICAgICAlJW1tM1xuIiAvLyBDcgotCQkicG11bGx3ICAgICAgICAgJTEwLCAgICAgICAgICAgICAgICAgICAgJSVtbTJcbiIgLy8gQ2IyZ3JlZW4gMCBSMyAgMCBSMiAgMCBSMSAgMCBSMAotCQkibW92cSAgICAgICAgICAgKCUyKSwgICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gTDEgICAgICBsNyBMNiBMNSBMNCBMMyBMMiBMMSBMMAotCQkicG11bGx3ICAgICAgICAgJTExLCAgICAgICAgICAgICAgICAgICAgJSVtbTBcbiIgLy8gQ2IyYmx1ZQotCQkicGFuZCAgICAgICAgICAgJTEyLCAgICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gTDEgICAgICAwMCBMNiAwMCBMNCAwMCBMMiAwMCBMMAotCQkicG11bGx3ICAgICAgICAgJTEzLCAgICAgICAgICAgICAgICAgICAgJSVtbTNcbiIgLy8gQ3IyZ3JlZW4KLQkJIm1vdnEgICAgICAgICAgICglMiksICAgICAgICAgICAgICAgICAgICUlbW03XG4iIC8vIEwyCi0JCSJwbXVsbHcgICAgICAgICAlMTQsICAgICAgICAgICAgICAgICAgICAlJW1tMVxuIiAvLyBDcjJyZWQKLQkJInBzcmx3ICAgICAgICAgICQ4LCAgICAgICAgICAgICAgICAgICAgICUlbW03XG4iICAgICAgICAvLyBMMiAgICAgICAgICAgMDAgTDcgMDAgTDUgMDAgTDMgMDAgTDEKLQkJInBtdWxsdyAgICAgICAgICUxNSwgICAgICAgICAgICAgICAgICAgICUlbW02XG4iIC8vIGx1bTEKLQkJInBhZGR3ICAgICAgICAgICUlbW0zLCAgICAgICAgICAgICAgICAgICUlbW0yXG4iIC8vIENiMmdyZWVuICsgQ3IyZ3JlZW4gPT0gZ3JlZW4KLQkJInBtdWxsdyAgICAgICAgICUxNSwgICAgICAgICAgICAgICAgICAgICUlbW03XG4iIC8vIGx1bTIKLQotCQkibW92cSAgICAgICAgICAgJSVtbTYsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIgLy8gbHVtMQotCQkicGFkZHcgICAgICAgICAgJSVtbTAsICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gbHVtMSArYmx1ZSAwMCBCNiAwMCBCNCAwMCBCMiAwMCBCMAotCQkibW92cSAgICAgICAgICAgJSVtbTQsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIgLy8gbHVtMQotCQkicGFkZHcgICAgICAgICAgJSVtbTEsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIgLy8gbHVtMSArcmVkICAwMCBSNiAwMCBSNCAwMCBSMiAwMCBSMAotCQkicGFkZHcgICAgICAgICAgJSVtbTIsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIgLy8gbHVtMSArZ3JlZW4gMDAgRzYgMDAgRzQgMDAgRzIgMDAgRzAKLQkJInBzcmF3ICAgICAgICAgICQ2LCAgICAgICAgICAgICAgICAgICAgICUlbW00XG4iIC8vIFIxIDAgLi4gNjQKLQkJIm1vdnEgICAgICAgICAgICUlbW03LCAgICAgICAgICAgICAgICAgICUlbW0zXG4iIC8vIGx1bTIgICAgICAgICAgICAgICAgICAgICAgIDAwIEw3IDAwIEw1IDAwIEwzIDAwIEwxCi0JCSJwc3JhdyAgICAgICAgICAkNiwgICAgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBHMSAgLSAuLiArCi0JCSJwYWRkdyAgICAgICAgICAlJW1tMCwgICAgICAgICAgICAgICAgICAlJW1tN1xuIiAvLyBMdW0yICtibHVlIDAwIEI3IDAwIEI1IDAwIEIzIDAwIEIxCi0JCSJwc3JhdyAgICAgICAgICAkNiwgICAgICAgICAgICAgICAgICAgICAlJW1tNlxuIiAvLyBCMSAgICAgICAgIDAgLi4gNjQKLQkJInBhY2t1c3diICAgICAgICUlbW00LCAgICAgICAgICAgICAgICAgICUlbW00XG4iIC8vIFIxIFIxCi0JCSJwYWNrdXN3YiAgICAgICAlJW1tNSwgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBHMSBHMQotCQkicGFja3Vzd2IgICAgICAgJSVtbTYsICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gQjEgQjEKLQkJInB1bnBja2xidyAgICAgICUlbW00LCAgICAgICAgICAgICAgICAgICUlbW00XG4iCi0JCSJwdW5wY2tsYncgICAgICAlJW1tNSwgICAgICAgICAgICAgICAgICAlJW1tNVxuIgotCi0JCSJwYW5kICAgICAgICAgICAlMTYsICAgICAgICAgICAgICAgICAgICAlJW1tNFxuIgotCQkicHNsbHcgICAgICAgICAgJDMsICAgICAgICAgICAgICAgICAgICAgJSVtbTVcbiIgLy8gR1JFRU4gICAgICAgMQotCQkicHVucGNrbGJ3ICAgICAgJSVtbTYsICAgICAgICAgICAgICAgICAgJSVtbTZcbiIKLQkJInBhbmQgICAgICAgICAgICUxNywgICAgICAgICAgICAgICAgICAgICUlbW01XG4iCi0JCSJwYW5kICAgICAgICAgICAlMTYsICAgICAgICAgICAgICAgICAgICAlJW1tNlxuIgotCQkicG9yICAgICAgICAgICAgJSVtbTUsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIgLy8KLQkJInBzcmx3ICAgICAgICAgICQxMSwgICAgICAgICAgICAgICAgICAgICUlbW02XG4iIC8vIEJMVUUgICAgICAgIDEKLQkJIm1vdnEgICAgICAgICAgICUlbW0zLCAgICAgICAgICAgICAgICAgICUlbW01XG4iIC8vIGx1bTIKLQkJInBhZGR3ICAgICAgICAgICUlbW0xLCAgICAgICAgICAgICAgICAgICUlbW0zXG4iIC8vIGx1bTIgK3JlZCAgICAgIDAwIFI3IDAwIFI1IDAwIFIzIDAwIFIxCi0JCSJwYWRkdyAgICAgICAgICAlJW1tMiwgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBsdW0yICtncmVlbiAwMCBHNyAwMCBHNSAwMCBHMyAwMCBHMQotCQkicHNyYXcgICAgICAgICAgJDYsICAgICAgICAgICAgICAgICAgICAgJSVtbTNcbiIgLy8gUjIKLQkJInBvciAgICAgICAgICAgICUlbW02LCAgICAgICAgICAgICAgICAgICUlbW00XG4iIC8vIE1NNAotCQkicHNyYXcgICAgICAgICAgJDYsICAgICAgICAgICAgICAgICAgICAgJSVtbTVcbiIgLy8gRzIKLQkJIm1vdnEgICAgICAgICAgICglMiwgJTQpLCAgICAgICAgICAgICAgICUlbW02XG4iIC8vIEwzIGxvYWQgbHVtMgotCQkicHNyYXcgICAgICAgICAgJDYsICAgICAgICAgICAgICAgICAgICAgJSVtbTdcbiIKLQkJInBhY2t1c3diICAgICAgICUlbW0zLCAgICAgICAgICAgICAgICAgICUlbW0zXG4iCi0JCSJwYWNrdXN3YiAgICAgICAlJW1tNSwgICAgICAgICAgICAgICAgICAlJW1tNVxuIgotCQkicGFja3Vzd2IgICAgICAgJSVtbTcsICAgICAgICAgICAgICAgICAgJSVtbTdcbiIKLQkJInBhbmQgICAgICAgICAgICUxMiwgICAgICAgICAgICAgICAgICAgICUlbW02XG4iIC8vIEwzCi0JCSJwdW5wY2tsYncgICAgICAlJW1tMywgICAgICAgICAgICAgICAgICAlJW1tM1xuIgotCQkicHVucGNrbGJ3ICAgICAgJSVtbTUsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIKLQkJInBtdWxsdyAgICAgICAgICUxNSwgICAgICAgICAgICAgICAgICAgICUlbW02XG4iIC8vIGx1bTMKLQkJInB1bnBja2xidyAgICAgICUlbW03LCAgICAgICAgICAgICAgICAgICUlbW03XG4iCi0JCSJwc2xsdyAgICAgICAgICAkMywgICAgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBHUkVFTiAyCi0JCSJwYW5kICAgICAgICAgICAlMTYsICAgICAgICAgICAgICAgICAgICAlJW1tN1xuIgotCQkicGFuZCAgICAgICAgICAgJTE2LCAgICAgICAgICAgICAgICAgICAgJSVtbTNcbiIKLQkJInBzcmx3ICAgICAgICAgICQxMSwgICAgICAgICAgICAgICAgICAgICUlbW03XG4iIC8vIEJMVUUgIDIKLQkJInBhbmQgICAgICAgICAgICUxNywgICAgICAgICAgICAgICAgICAgICUlbW01XG4iCi0JCSJwb3IgICAgICAgICAgICAlJW1tNywgICAgICAgICAgICAgICAgICAlJW1tM1xuIgotCQkibW92cSAgICAgICAgICAgKCUyLCU0KSwgICAgICAgICAgICAgICAgJSVtbTdcbiIgLy8gTDQgbG9hZCBsdW0yCi0JCSJwb3IgICAgICAgICAgICAlJW1tNSwgICAgICAgICAgICAgICAgICAlJW1tM1xuIiAvLwotCQkicHNybHcgICAgICAgICAgJDgsICAgICAgICAgICAgICAgICAgICAgJSVtbTdcbiIgLy8gTDQKLQkJIm1vdnEgICAgICAgICAgICUlbW00LCAgICAgICAgICAgICAgICAgICUlbW01XG4iCi0JCSJwdW5wY2tsd2QgICAgICAlJW1tMywgICAgICAgICAgICAgICAgICAlJW1tNFxuIgotCQkicG11bGx3ICAgICAgICAgJTE1LCAgICAgICAgICAgICAgICAgICAgJSVtbTdcbiIgLy8gbHVtNAotCQkicHVucGNraHdkICAgICAgJSVtbTMsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIKLQotCQkibW92cSAgICAgICAgICAgJSVtbTQsICAgICAgICAgICAgICAgICAgKCUzKVxuIiAgLy8gd3JpdGUgcm93MQotCQkibW92cSAgICAgICAgICAgJSVtbTUsICAgICAgICAgICAgICAgICAgOCglMylcbiIgLy8gd3JpdGUgcm93MQotCi0JCSJtb3ZxICAgICAgICAgICAlJW1tNiwgICAgICAgICAgICAgICAgICAlJW1tNFxuIiAvLyBMdW0zCi0JCSJwYWRkdyAgICAgICAgICAlJW1tMCwgICAgICAgICAgICAgICAgICAlJW1tNlxuIiAvLyBMdW0zICtibHVlCi0KLQkJIm1vdnEgICAgICAgICAgICUlbW00LCAgICAgICAgICAgICAgICAgICUlbW01XG4iIC8vIEx1bTMKLQkJInBhZGR3ICAgICAgICAgICUlbW0xLCAgICAgICAgICAgICAgICAgICUlbW00XG4iIC8vIEx1bTMgK3JlZAotCQkicGFkZHcgICAgICAgICAgJSVtbTIsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIgLy8gTHVtMyArZ3JlZW4KLQkJInBzcmF3ICAgICAgICAgICQ2LCAgICAgICAgICAgICAgICAgICAgICUlbW00XG4iCi0JCSJtb3ZxICAgICAgICAgICAlJW1tNywgICAgICAgICAgICAgICAgICAlJW1tM1xuIiAvLyBMdW00Ci0JCSJwc3JhdyAgICAgICAgICAkNiwgICAgICAgICAgICAgICAgICAgICAlJW1tNVxuIgotCQkicGFkZHcgICAgICAgICAgJSVtbTAsICAgICAgICAgICAgICAgICAgJSVtbTdcbiIgLy8gTHVtNCArYmx1ZQotCQkicHNyYXcgICAgICAgICAgJDYsICAgICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gTHVtMyArYmx1ZQotCQkibW92cSAgICAgICAgICAgJSVtbTMsICAgICAgICAgICAgICAgICAgJSVtbTBcbiIgLy8gTHVtNAotCQkicGFja3Vzd2IgICAgICAgJSVtbTQsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIKLQkJInBhZGR3ICAgICAgICAgICUlbW0xLCAgICAgICAgICAgICAgICAgICUlbW0zXG4iIC8vIEx1bTQgK3JlZAotCQkicGFja3Vzd2IgICAgICAgJSVtbTUsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIKLQkJInBhZGR3ICAgICAgICAgICUlbW0yLCAgICAgICAgICAgICAgICAgICUlbW0wXG4iIC8vIEx1bTQgK2dyZWVuCi0JCSJwYWNrdXN3YiAgICAgICAlJW1tNiwgICAgICAgICAgICAgICAgICAlJW1tNlxuIgotCQkicHVucGNrbGJ3ICAgICAgJSVtbTQsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIKLQkJInB1bnBja2xidyAgICAgICUlbW01LCAgICAgICAgICAgICAgICAgICUlbW01XG4iCi0JCSJwdW5wY2tsYncgICAgICAlJW1tNiwgICAgICAgICAgICAgICAgICAlJW1tNlxuIgotCQkicHNsbHcgICAgICAgICAgJDMsICAgICAgICAgICAgICAgICAgICAgJSVtbTVcbiIgLy8gR1JFRU4gMwotCQkicGFuZCAgICAgICAgICAgJTE2LCAgICAgICAgICAgICAgICAgICAgJSVtbTRcbiIKLQkJInBzcmF3ICAgICAgICAgICQ2LCAgICAgICAgICAgICAgICAgICAgICUlbW0zXG4iIC8vIHBzciA2Ci0JCSJwc3JhdyAgICAgICAgICAkNiwgICAgICAgICAgICAgICAgICAgICAlJW1tMFxuIgotCQkicGFuZCAgICAgICAgICAgJTE2LCAgICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gQkxVRQotCQkicGFuZCAgICAgICAgICAgJTE3LCAgICAgICAgICAgICAgICAgICAgJSVtbTVcbiIKLQkJInBzcmx3ICAgICAgICAgICQxMSwgICAgICAgICAgICAgICAgICAgICUlbW02XG4iIC8vIEJMVUUgIDMKLQkJInBvciAgICAgICAgICAgICUlbW01LCAgICAgICAgICAgICAgICAgICUlbW00XG4iCi0JCSJwc3JhdyAgICAgICAgICAkNiwgICAgICAgICAgICAgICAgICAgICAlJW1tN1xuIgotCQkicG9yICAgICAgICAgICAgJSVtbTYsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIKLQkJInBhY2t1c3diICAgICAgICUlbW0zLCAgICAgICAgICAgICAgICAgICUlbW0zXG4iCi0JCSJwYWNrdXN3YiAgICAgICAlJW1tMCwgICAgICAgICAgICAgICAgICAlJW1tMFxuIgotCQkicGFja3Vzd2IgICAgICAgJSVtbTcsICAgICAgICAgICAgICAgICAgJSVtbTdcbiIKLQkJInB1bnBja2xidyAgICAgICUlbW0zLCAgICAgICAgICAgICAgICAgICUlbW0zXG4iCi0JCSJwdW5wY2tsYncgICAgICAlJW1tMCwgICAgICAgICAgICAgICAgICAlJW1tMFxuIgotCQkicHVucGNrbGJ3ICAgICAgJSVtbTcsICAgICAgICAgICAgICAgICAgJSVtbTdcbiIKLQkJInBhbmQgICAgICAgICAgICUxNiwgICAgICAgICAgICAgICAgICAgICUlbW0zXG4iCi0JCSJwYW5kICAgICAgICAgICAlMTYsICAgICAgICAgICAgICAgICAgICAlJW1tN1xuIiAvLyBCTFVFCi0JCSJwc2xsdyAgICAgICAgICAkMywgICAgICAgICAgICAgICAgICAgICAlJW1tMFxuIiAvLyBHUkVFTiA0Ci0JCSJwc3JsdyAgICAgICAgICAkMTEsICAgICAgICAgICAgICAgICAgICAlJW1tN1xuIgotCQkicGFuZCAgICAgICAgICAgJTE3LCAgICAgICAgICAgICAgICAgICAgJSVtbTBcbiIKLQkJInBvciAgICAgICAgICAgICUlbW03LCAgICAgICAgICAgICAgICAgICUlbW0zXG4iCi0JCSJwb3IgICAgICAgICAgICAlJW1tMCwgICAgICAgICAgICAgICAgICAlJW1tM1xuIgotCi0JCSJtb3ZxICAgICAgICAgICAlJW1tNCwgICAgICAgICAgICAgICAgICAlJW1tNVxuIgotCi0JCSJwdW5wY2tsd2QgICAgICAlJW1tMywgICAgICAgICAgICAgICAgICAlJW1tNFxuIgotCQkicHVucGNraHdkICAgICAgJSVtbTMsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIKLQotCQkibW92cSAgICAgICAgICAgJSVtbTQsICAgICAgICAgICAgICAgICAgKCU1KVxuIgotCQkibW92cSAgICAgICAgICAgJSVtbTUsICAgICAgICAgICAgICAgICAgOCglNSlcbiIKLQotCQkiYWRkbCAgICAgICAgICAgJDgsICAgICAgICAgICAgICAgICAgICAgJTZcbiIKLQkJImFkZGwgICAgICAgICAgICQ4LCAgICAgICAgICAgICAgICAgICAgICUyXG4iCi0JCSJhZGRsICAgICAgICAgICAkNCwgICAgICAgICAgICAgICAgICAgICAoJSVlc3ApXG4iCi0JCSJhZGRsICAgICAgICAgICAkNCwgICAgICAgICAgICAgICAgICAgICAlMVxuIgotCQkiY21wbCAgICAgICAgICAgJTQsICAgICAgICAgICAgICAgICAgICAgJTZcbiIKLQkJImxlYWwgICAgICAgICAgIDE2KCUzKSwgICAgICAgICAgICAgICAgICUzXG4iCi0JCSJsZWFsICAgICAgICAgICAxNiglNSksJTVcbiIgLy8gcm93MisxNgotCi0JCSJqbCAgICAgICAgICAgICAxYlxuIgotCQkiYWRkbCAgICAgICAgICAgJTQsICAgICAlMlxuIiAvLyBsdW0gKz0gY29scwotCQkiYWRkbCAgICAgICAgICAgJTgsICAgICAlM1xuIiAvLyByb3cxKz0gbW9kCi0JCSJhZGRsICAgICAgICAgICAlOCwgICAgICU1XG4iIC8vIHJvdzIrPSBtb2QKLQkJIm1vdmwgICAgICAgICAgICQwLCAgICAgJTZcbiIgLy8geD0wCi0JCSJjbXBsICAgICAgICAgICAlNywgICAgICUyXG4iCi0JCSJqbCAgICAgICAgICAgICAxYlxuIgotCQkiYWRkbCAkNCwgJSVlc3BcbiIgIC8vIGdldCByaWQgb2YgdGhlIHN0YWNrIHNsb3Qgd2UgcmVzZXJ2ZWQuCi0JCSJlbW1zXG4iCi0JCToKLQkJOiAibSIgKGNyKSwgInIiKGNiKSwiciIobHVtKSwKLQkJICAiciIocm93MSksInIiKGNvbHMpLCJyIihyb3cyKSwibSIoeCksIm0iKHkpLCJtIihtb2QpLAotCQkgICJtIihNTVhfMDA4MHcpLCJtIihNTVhfVWdybjU2NSksIm0iKE1NWF9VYmx1NXg1KSwKLQkJICAibSIoTU1YXzAwRkZ3KSwibSIoTU1YX1Zncm41NjUpLCJtIihNTVhfVnJlZDV4NSksCi0JCSAgIm0iKE1NWF9ZY29lZmYpLCJtIihNTVhfcmVkNTY1KSwibSIoTU1YX2dybjU2NSkKLQkpOwotfQotCi0vKiAqSU5ERU5ULU9OKiAqLwotCi0jZW5kaWYgLyogR0NDMyBpMzg2IGlubGluZSBhc3NlbWJseSAqLwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF95dXZfc3cuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3l1dl9zdy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2M0YTkyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3l1dl9zdy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBpcyB0aGUgc29mdHdhcmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFlVViB2aWRlbyBvdmVybGF5IHN1cHBvcnQgKi8KLQotLyogVGhpcyBjb2RlIHdhcyBkZXJpdmVkIGZyb20gY29kZSBjYXJyeWluZyB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBub3RpY2VzOgotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBhbmQgd2l0aG91dCB3cml0dGVuIGFncmVlbWVudCBpcwotICogaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcKLSAqIHR3byBwYXJhZ3JhcGhzIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoaXMgc29mdHdhcmUuCi0gKiAKLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBVTklWRVJTSVRZIE9GIENBTElGT1JOSUEgQkUgTElBQkxFIFRPIEFOWSBQQVJUWSBGT1IKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwgRVZFTiBJRiBUSEUgVU5JVkVSU0lUWSBPRgotICogQ0FMSUZPUk5JQSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqIAotICogVEhFIFVOSVZFUlNJVFkgT0YgQ0FMSUZPUk5JQSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTCi0gKiBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgVEhFIFVOSVZFUlNJVFkgT0YgQ0FMSUZPUk5JQSBIQVMgTk8gT0JMSUdBVElPTiBUTwotICogUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgRXJpayBDb3JyeQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIGFuZCB3aXRob3V0IHdyaXR0ZW4gYWdyZWVtZW50IGlzCi0gKiBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZwotICogdHdvIHBhcmFncmFwaHMgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhpcyBzb2Z0d2FyZS4KLSAqIAotICogSU4gTk8gRVZFTlQgU0hBTEwgRVJJSyBDT1JSWSBCRSBMSUFCTEUgVE8gQU5ZIFBBUlRZIEZPUiBESVJFQ1QsIElORElSRUNULAotICogU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLCBFVkVOIElGIEVSSUsgQ09SUlkgSEFTIEJFRU4gQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogCi0gKiBFUklLIENPUlJZIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKLSAqIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMgT04gQU4gIkFTIElTIgotICogQkFTSVMsIEFORCBFUklLIENPUlJZIEhBUyBOTyBPQkxJR0FUSU9OIFRPIFBST1ZJREUgTUFJTlRFTkFOQ0UsIFNVUFBPUlQsCi0gKiBVUERBVEVTLCBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCi0KLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgQ29weXJpZ2h0IChjKSAxOTk1IEJyb3duIFVuaXZlcnNpdHkuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgYW5kIHdpdGhvdXQgd3JpdHRlbiBhZ3JlZW1lbnQKLSAqIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGUKLSAqIGZvbGxvd2luZyB0d28gcGFyYWdyYXBocyBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGlzIHNvZnR3YXJlLgotICogCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBCUk9XTiBVTklWRVJTSVRZIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SCi0gKiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYgQlJPV04KLSAqIFVOSVZFUlNJVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiAKLSAqIEJST1dOIFVOSVZFUlNJVFkgU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQotICogUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUyBPTiBBTiAiQVMgSVMiCi0gKiBCQVNJUywgQU5EIEJST1dOIFVOSVZFUlNJVFkgSEFTIE5PIE9CTElHQVRJT04gVE8gUFJPVklERSBNQUlOVEVOQU5DRSwKLSAqIFNVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywgT1IgTU9ESUZJQ0FUSU9OUy4KLSAqLwotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2NwdWluZm8uaCIKLSNpbmNsdWRlICJTRExfc3RyZXRjaF9jLmgiCi0jaW5jbHVkZSAiU0RMX3l1dmZ1bmNzLmgiCi0jaW5jbHVkZSAiU0RMX3l1dl9zd19jLmgiCi0KLS8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBtYW5pcHVsYXRlIHNvZnR3YXJlIHZpZGVvIG92ZXJsYXlzICovCi1zdGF0aWMgc3RydWN0IHByaXZhdGVfeXV2aHdmdW5jcyBzd195dXZmdW5jcyA9IHsKLQlTRExfTG9ja1lVVl9TVywKLQlTRExfVW5sb2NrWVVWX1NXLAotCVNETF9EaXNwbGF5WVVWX1NXLAotCVNETF9GcmVlWVVWX1NXCi19OwotCi0vKiBSR0IgY29udmVyc2lvbiBsb29rdXAgdGFibGVzICovCi1zdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgewotCVNETF9TdXJmYWNlICpzdHJldGNoOwotCVNETF9TdXJmYWNlICpkaXNwbGF5OwotCVVpbnQ4ICpwaXhlbHM7Ci0JaW50ICpjb2xvcnRhYjsKLQlVaW50MzIgKnJnYl8yX3BpeDsKLQl2b2lkICgqRGlzcGxheTFYKShpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICk7Ci0Jdm9pZCAoKkRpc3BsYXkyWCkoaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCi0JICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICk7Ci0KLQkvKiBUaGVzZSBhcmUganVzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIHRoZW0gc2VwYXJhdGVseSAqLwotCVVpbnQxNiBwaXRjaGVzWzNdOwotCVVpbnQ4ICpwbGFuZXNbM107Ci19OwotCi0KLS8qIFRoZSBjb2xvcnNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCi0KLSNpZiAoX19HTlVDX18gPiAyKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBfX09QVElNSVpFX18gJiYgU0RMX0FTU0VNQkxZX1JPVVRJTkVTCi1leHRlcm4gdm9pZCBDb2xvcjU2NURpdGhlcllWMTJNTVgxWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApOwotZXh0ZXJuIHZvaWQgQ29sb3JSR0JEaXRoZXJZVjEyTU1YMVgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKTsKLSNlbmRpZiAKLQotc3RhdGljIHZvaWQgQ29sb3IxNkRpdGhlcllWMTJNb2QxWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCi17Ci0gICAgdW5zaWduZWQgc2hvcnQqIHJvdzE7Ci0gICAgdW5zaWduZWQgc2hvcnQqIHJvdzI7Ci0gICAgdW5zaWduZWQgY2hhciogbHVtMjsKLSAgICBpbnQgeCwgeTsKLSAgICBpbnQgY3JfcjsKLSAgICBpbnQgY3JiX2c7Ci0gICAgaW50IGNiX2I7Ci0gICAgaW50IGNvbHNfMiA9IGNvbHMgLyAyOwotCi0gICAgcm93MSA9ICh1bnNpZ25lZCBzaG9ydCopIG91dDsKLSAgICByb3cyID0gcm93MSArIGNvbHMgKyBtb2Q7Ci0gICAgbHVtMiA9IGx1bSArIGNvbHM7Ci0KLSAgICBtb2QgKz0gY29scyArIG1vZDsKLQotICAgIHkgPSByb3dzIC8gMjsKLSAgICB3aGlsZSggeS0tICkKLSAgICB7Ci0gICAgICAgIHggPSBjb2xzXzI7Ci0gICAgICAgIHdoaWxlKCB4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKLQotICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07Ci0gICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07Ci0gICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKLSAgICAgICAgICAgICsrY3I7ICsrY2I7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtKys7Ci0gICAgICAgICAgICAqcm93MSsrID0gKHVuc2lnbmVkIHNob3J0KShyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotCi0gICAgICAgICAgICBMID0gKmx1bSsrOwotICAgICAgICAgICAgKnJvdzErKyA9ICh1bnNpZ25lZCBzaG9ydCkocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLQotCi0gICAgICAgICAgICAvKiBOb3csIGRvIHNlY29uZCByb3cuICAqLwotCi0gICAgICAgICAgICBMID0gKmx1bTIrKzsKLSAgICAgICAgICAgICpyb3cyKysgPSAodW5zaWduZWQgc2hvcnQpKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtMisrOwotICAgICAgICAgICAgKnJvdzIrKyA9ICh1bnNpZ25lZCBzaG9ydCkocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZXNlIHZhbHVlcyBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUsIChkdWUKLSAgICAgICAgICogdG8gdGhlICsrJ3MgYWJvdmUpLGJ1dCB0aGV5IG5lZWQgdG8gYmUgYXQgdGhlIHN0YXJ0Ci0gICAgICAgICAqIG9mIHRoZSBsaW5lIGFmdGVyIHRoYXQuCi0gICAgICAgICAqLwotICAgICAgICBsdW0gICs9IGNvbHM7Ci0gICAgICAgIGx1bTIgKz0gY29sczsKLSAgICAgICAgcm93MSArPSBtb2Q7Ci0gICAgICAgIHJvdzIgKz0gbW9kOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgQ29sb3IyNERpdGhlcllWMTJNb2QxWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCi17Ci0gICAgdW5zaWduZWQgaW50IHZhbHVlOwotICAgIHVuc2lnbmVkIGNoYXIqIHJvdzE7Ci0gICAgdW5zaWduZWQgY2hhciogcm93MjsKLSAgICB1bnNpZ25lZCBjaGFyKiBsdW0yOwotICAgIGludCB4LCB5OwotICAgIGludCBjcl9yOwotICAgIGludCBjcmJfZzsKLSAgICBpbnQgY2JfYjsKLSAgICBpbnQgY29sc18yID0gY29scyAvIDI7Ci0KLSAgICByb3cxID0gb3V0OwotICAgIHJvdzIgPSByb3cxICsgY29scyozICsgbW9kKjM7Ci0gICAgbHVtMiA9IGx1bSArIGNvbHM7Ci0KLSAgICBtb2QgKz0gY29scyArIG1vZDsKLSAgICBtb2QgKj0gMzsKLQotICAgIHkgPSByb3dzIC8gMjsKLSAgICB3aGlsZSggeS0tICkKLSAgICB7Ci0gICAgICAgIHggPSBjb2xzXzI7Ci0gICAgICAgIHdoaWxlKCB4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKLQotICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07Ci0gICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07Ci0gICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKLSAgICAgICAgICAgICsrY3I7ICsrY2I7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtKys7Ci0gICAgICAgICAgICB2YWx1ZSA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAotICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotICAgICAgICAgICAgKnJvdzErKyA9ICh2YWx1ZSAgICAgICkgJiAweEZGOwotICAgICAgICAgICAgKnJvdzErKyA9ICh2YWx1ZSA+PiAgOCkgJiAweEZGOwotICAgICAgICAgICAgKnJvdzErKyA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOwotCi0gICAgICAgICAgICBMID0gKmx1bSsrOwotICAgICAgICAgICAgdmFsdWUgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgICAgICpyb3cxKysgPSAodmFsdWUgICAgICApICYgMHhGRjsKLSAgICAgICAgICAgICpyb3cxKysgPSAodmFsdWUgPj4gIDgpICYgMHhGRjsKLSAgICAgICAgICAgICpyb3cxKysgPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKLQotCi0gICAgICAgICAgICAvKiBOb3csIGRvIHNlY29uZCByb3cuICAqLwotCi0gICAgICAgICAgICBMID0gKmx1bTIrKzsKLSAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0gICAgICAgICAgICAqcm93MisrID0gKHZhbHVlICAgICAgKSAmIDB4RkY7Ci0gICAgICAgICAgICAqcm93MisrID0gKHZhbHVlID4+ICA4KSAmIDB4RkY7Ci0gICAgICAgICAgICAqcm93MisrID0gKHZhbHVlID4+IDE2KSAmIDB4RkY7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtMisrOwotICAgICAgICAgICAgdmFsdWUgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgICAgICpyb3cyKysgPSAodmFsdWUgICAgICApICYgMHhGRjsKLSAgICAgICAgICAgICpyb3cyKysgPSAodmFsdWUgPj4gIDgpICYgMHhGRjsKLSAgICAgICAgICAgICpyb3cyKysgPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZXNlIHZhbHVlcyBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUsIChkdWUKLSAgICAgICAgICogdG8gdGhlICsrJ3MgYWJvdmUpLGJ1dCB0aGV5IG5lZWQgdG8gYmUgYXQgdGhlIHN0YXJ0Ci0gICAgICAgICAqIG9mIHRoZSBsaW5lIGFmdGVyIHRoYXQuCi0gICAgICAgICAqLwotICAgICAgICBsdW0gICs9IGNvbHM7Ci0gICAgICAgIGx1bTIgKz0gY29sczsKLSAgICAgICAgcm93MSArPSBtb2Q7Ci0gICAgICAgIHJvdzIgKz0gbW9kOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgQ29sb3IzMkRpdGhlcllWMTJNb2QxWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCi17Ci0gICAgdW5zaWduZWQgaW50KiByb3cxOwotICAgIHVuc2lnbmVkIGludCogcm93MjsKLSAgICB1bnNpZ25lZCBjaGFyKiBsdW0yOwotICAgIGludCB4LCB5OwotICAgIGludCBjcl9yOwotICAgIGludCBjcmJfZzsKLSAgICBpbnQgY2JfYjsKLSAgICBpbnQgY29sc18yID0gY29scyAvIDI7Ci0KLSAgICByb3cxID0gKHVuc2lnbmVkIGludCopIG91dDsKLSAgICByb3cyID0gcm93MSArIGNvbHMgKyBtb2Q7Ci0gICAgbHVtMiA9IGx1bSArIGNvbHM7Ci0KLSAgICBtb2QgKz0gY29scyArIG1vZDsKLQotICAgIHkgPSByb3dzIC8gMjsKLSAgICB3aGlsZSggeS0tICkKLSAgICB7Ci0gICAgICAgIHggPSBjb2xzXzI7Ci0gICAgICAgIHdoaWxlKCB4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKLQotICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07Ci0gICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07Ci0gICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKLSAgICAgICAgICAgICsrY3I7ICsrY2I7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtKys7Ci0gICAgICAgICAgICAqcm93MSsrID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotCi0gICAgICAgICAgICBMID0gKmx1bSsrOwotICAgICAgICAgICAgKnJvdzErKyA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAotICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLQotCi0gICAgICAgICAgICAvKiBOb3csIGRvIHNlY29uZCByb3cuICAqLwotCi0gICAgICAgICAgICBMID0gKmx1bTIrKzsKLSAgICAgICAgICAgICpyb3cyKysgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtMisrOwotICAgICAgICAgICAgKnJvdzIrKyA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAotICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZXNlIHZhbHVlcyBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUsIChkdWUKLSAgICAgICAgICogdG8gdGhlICsrJ3MgYWJvdmUpLGJ1dCB0aGV5IG5lZWQgdG8gYmUgYXQgdGhlIHN0YXJ0Ci0gICAgICAgICAqIG9mIHRoZSBsaW5lIGFmdGVyIHRoYXQuCi0gICAgICAgICAqLwotICAgICAgICBsdW0gICs9IGNvbHM7Ci0gICAgICAgIGx1bTIgKz0gY29sczsKLSAgICAgICAgcm93MSArPSBtb2Q7Ci0gICAgICAgIHJvdzIgKz0gbW9kOwotICAgIH0KLX0KLQotLyoKLSAqIEluIHRoaXMgZnVuY3Rpb24gSSBtYWtlIHVzZSBvZiBhIG5hc3R5IHRyaWNrLiBUaGUgdGFibGVzIGhhdmUgdGhlIGxvd2VyCi0gKiAxNiBiaXRzIHJlcGxpY2F0ZWQgaW4gdGhlIHVwcGVyIDE2LiBUaGlzIG1lYW5zIEkgY2FuIHdyaXRlIGludHMgYW5kIGdldAotICogdGhlIGhvcmlzb250YWwgZG91YmxpbmcgZm9yIGZyZWUgKGFsbW9zdCkuCi0gKi8KLXN0YXRpYyB2b2lkIENvbG9yMTZEaXRoZXJZVjEyTW9kMlgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKQotewotICAgIHVuc2lnbmVkIGludCogcm93MSA9ICh1bnNpZ25lZCBpbnQqKSBvdXQ7Ci0gICAgY29uc3QgaW50IG5leHRfcm93ID0gY29scysobW9kLzIpOwotICAgIHVuc2lnbmVkIGludCogcm93MiA9IHJvdzEgKyAyKm5leHRfcm93OwotICAgIHVuc2lnbmVkIGNoYXIqIGx1bTI7Ci0gICAgaW50IHgsIHk7Ci0gICAgaW50IGNyX3I7Ci0gICAgaW50IGNyYl9nOwotICAgIGludCBjYl9iOwotICAgIGludCBjb2xzXzIgPSBjb2xzIC8gMjsKLQotICAgIGx1bTIgPSBsdW0gKyBjb2xzOwotCi0gICAgbW9kID0gKG5leHRfcm93ICogMykgKyAobW9kLzIpOwotCi0gICAgeSA9IHJvd3MgLyAyOwotICAgIHdoaWxlKCB5LS0gKQotICAgIHsKLSAgICAgICAgeCA9IGNvbHNfMjsKLSAgICAgICAgd2hpbGUoIHgtLSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyIGludCBMOwotCi0gICAgICAgICAgICBjcl9yICAgPSAwKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMCoyNTYgXTsKLSAgICAgICAgICAgIGNyYl9nICA9IDEqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAxKjI1NiBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb2xvcnRhYlsgKmNiICsgMioyNTYgXTsKLSAgICAgICAgICAgIGNiX2IgICA9IDIqNzY4KzI1NiArIGNvbG9ydGFiWyAqY2IgKyAzKjI1NiBdOwotICAgICAgICAgICAgKytjcjsgKytjYjsKLQotICAgICAgICAgICAgTCA9ICpsdW0rKzsKLSAgICAgICAgICAgIHJvdzFbMF0gPSByb3cxW25leHRfcm93XSA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0gICAgICAgICAgICByb3cxKys7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtKys7Ci0gICAgICAgICAgICByb3cxWzBdID0gcm93MVtuZXh0X3Jvd10gPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotICAgICAgICAgICAgcm93MSsrOwotCi0KLSAgICAgICAgICAgIC8qIE5vdywgZG8gc2Vjb25kIHJvdy4gKi8KLQotICAgICAgICAgICAgTCA9ICpsdW0yKys7Ci0gICAgICAgICAgICByb3cyWzBdID0gcm93MltuZXh0X3Jvd10gPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotICAgICAgICAgICAgcm93MisrOwotCi0gICAgICAgICAgICBMID0gKmx1bTIrKzsKLSAgICAgICAgICAgIHJvdzJbMF0gPSByb3cyW25leHRfcm93XSA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0gICAgICAgICAgICByb3cyKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGVzZSB2YWx1ZXMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLCAoZHVlCi0gICAgICAgICAqIHRvIHRoZSArKydzIGFib3ZlKSxidXQgdGhleSBuZWVkIHRvIGJlIGF0IHRoZSBzdGFydAotICAgICAgICAgKiBvZiB0aGUgbGluZSBhZnRlciB0aGF0LgotICAgICAgICAgKi8KLSAgICAgICAgbHVtICArPSBjb2xzOwotICAgICAgICBsdW0yICs9IGNvbHM7Ci0gICAgICAgIHJvdzEgKz0gbW9kOwotICAgICAgICByb3cyICs9IG1vZDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbG9yMjREaXRoZXJZVjEyTW9kMlgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKQotewotICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLSAgICB1bnNpZ25lZCBjaGFyKiByb3cxID0gb3V0OwotICAgIGNvbnN0IGludCBuZXh0X3JvdyA9IChjb2xzKjIgKyBtb2QpICogMzsKLSAgICB1bnNpZ25lZCBjaGFyKiByb3cyID0gcm93MSArIDIqbmV4dF9yb3c7Ci0gICAgdW5zaWduZWQgY2hhciogbHVtMjsKLSAgICBpbnQgeCwgeTsKLSAgICBpbnQgY3JfcjsKLSAgICBpbnQgY3JiX2c7Ci0gICAgaW50IGNiX2I7Ci0gICAgaW50IGNvbHNfMiA9IGNvbHMgLyAyOwotCi0gICAgbHVtMiA9IGx1bSArIGNvbHM7Ci0KLSAgICBtb2QgPSBuZXh0X3JvdyozICsgbW9kKjM7Ci0KLSAgICB5ID0gcm93cyAvIDI7Ci0gICAgd2hpbGUoIHktLSApCi0gICAgewotICAgICAgICB4ID0gY29sc18yOwotICAgICAgICB3aGlsZSggeC0tICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7Ci0KLSAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOwotICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOwotICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07Ci0gICAgICAgICAgICArK2NyOyArK2NiOwotCi0gICAgICAgICAgICBMID0gKmx1bSsrOwotICAgICAgICAgICAgdmFsdWUgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgICAgIHJvdzFbMCswXSA9IHJvdzFbMyswXSA9IHJvdzFbbmV4dF9yb3crMF0gPSByb3cxW25leHRfcm93KzMrMF0gPQotICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICAgICAgKSAmIDB4RkY7Ci0gICAgICAgICAgICByb3cxWzArMV0gPSByb3cxWzMrMV0gPSByb3cxW25leHRfcm93KzFdID0gcm93MVtuZXh0X3JvdyszKzFdID0KLSAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA+PiAgOCkgJiAweEZGOwotICAgICAgICAgICAgcm93MVswKzJdID0gcm93MVszKzJdID0gcm93MVtuZXh0X3JvdysyXSA9IHJvdzFbbmV4dF9yb3crMysyXSA9Ci0gICAgICAgICAgICAgICAgICAgICAodmFsdWUgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgIHJvdzEgKz0gMiozOwotCi0gICAgICAgICAgICBMID0gKmx1bSsrOwotICAgICAgICAgICAgdmFsdWUgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgICAgIHJvdzFbMCswXSA9IHJvdzFbMyswXSA9IHJvdzFbbmV4dF9yb3crMF0gPSByb3cxW25leHRfcm93KzMrMF0gPQotICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICAgICAgKSAmIDB4RkY7Ci0gICAgICAgICAgICByb3cxWzArMV0gPSByb3cxWzMrMV0gPSByb3cxW25leHRfcm93KzFdID0gcm93MVtuZXh0X3JvdyszKzFdID0KLSAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA+PiAgOCkgJiAweEZGOwotICAgICAgICAgICAgcm93MVswKzJdID0gcm93MVszKzJdID0gcm93MVtuZXh0X3JvdysyXSA9IHJvdzFbbmV4dF9yb3crMysyXSA9Ci0gICAgICAgICAgICAgICAgICAgICAodmFsdWUgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgIHJvdzEgKz0gMiozOwotCi0KLSAgICAgICAgICAgIC8qIE5vdywgZG8gc2Vjb25kIHJvdy4gKi8KLQotICAgICAgICAgICAgTCA9ICpsdW0yKys7Ci0gICAgICAgICAgICB2YWx1ZSA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAotICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotICAgICAgICAgICAgcm93MlswKzBdID0gcm93MlszKzBdID0gcm93MltuZXh0X3JvdyswXSA9IHJvdzJbbmV4dF9yb3crMyswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAodmFsdWUgICAgICApICYgMHhGRjsKLSAgICAgICAgICAgIHJvdzJbMCsxXSA9IHJvdzJbMysxXSA9IHJvdzJbbmV4dF9yb3crMV0gPSByb3cyW25leHRfcm93KzMrMV0gPQotICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID4+ICA4KSAmIDB4RkY7Ci0gICAgICAgICAgICByb3cyWzArMl0gPSByb3cyWzMrMl0gPSByb3cyW25leHRfcm93KzJdID0gcm93MltuZXh0X3JvdyszKzJdID0KLSAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA+PiAxNikgJiAweEZGOwotICAgICAgICAgICAgcm93MiArPSAyKjM7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtMisrOwotICAgICAgICAgICAgdmFsdWUgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgICAgIHJvdzJbMCswXSA9IHJvdzJbMyswXSA9IHJvdzJbbmV4dF9yb3crMF0gPSByb3cyW25leHRfcm93KzMrMF0gPQotICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICAgICAgKSAmIDB4RkY7Ci0gICAgICAgICAgICByb3cyWzArMV0gPSByb3cyWzMrMV0gPSByb3cyW25leHRfcm93KzFdID0gcm93MltuZXh0X3JvdyszKzFdID0KLSAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA+PiAgOCkgJiAweEZGOwotICAgICAgICAgICAgcm93MlswKzJdID0gcm93MlszKzJdID0gcm93MltuZXh0X3JvdysyXSA9IHJvdzJbbmV4dF9yb3crMysyXSA9Ci0gICAgICAgICAgICAgICAgICAgICAodmFsdWUgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgIHJvdzIgKz0gMiozOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlc2UgdmFsdWVzIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbGluZSwgKGR1ZQotICAgICAgICAgKiB0byB0aGUgKysncyBhYm92ZSksYnV0IHRoZXkgbmVlZCB0byBiZSBhdCB0aGUgc3RhcnQKLSAgICAgICAgICogb2YgdGhlIGxpbmUgYWZ0ZXIgdGhhdC4KLSAgICAgICAgICovCi0gICAgICAgIGx1bSAgKz0gY29sczsKLSAgICAgICAgbHVtMiArPSBjb2xzOwotICAgICAgICByb3cxICs9IG1vZDsKLSAgICAgICAgcm93MiArPSBtb2Q7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBDb2xvcjMyRGl0aGVyWVYxMk1vZDJYKCBpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICkKLXsKLSAgICB1bnNpZ25lZCBpbnQqIHJvdzEgPSAodW5zaWduZWQgaW50Kikgb3V0OwotICAgIGNvbnN0IGludCBuZXh0X3JvdyA9IGNvbHMqMittb2Q7Ci0gICAgdW5zaWduZWQgaW50KiByb3cyID0gcm93MSArIDIqbmV4dF9yb3c7Ci0gICAgdW5zaWduZWQgY2hhciogbHVtMjsKLSAgICBpbnQgeCwgeTsKLSAgICBpbnQgY3JfcjsKLSAgICBpbnQgY3JiX2c7Ci0gICAgaW50IGNiX2I7Ci0gICAgaW50IGNvbHNfMiA9IGNvbHMgLyAyOwotCi0gICAgbHVtMiA9IGx1bSArIGNvbHM7Ci0KLSAgICBtb2QgPSAobmV4dF9yb3cgKiAzKSArIG1vZDsKLQotICAgIHkgPSByb3dzIC8gMjsKLSAgICB3aGlsZSggeS0tICkKLSAgICB7Ci0gICAgICAgIHggPSBjb2xzXzI7Ci0gICAgICAgIHdoaWxlKCB4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKLQotICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07Ci0gICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07Ci0gICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKLSAgICAgICAgICAgICsrY3I7ICsrY2I7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtKys7Ci0gICAgICAgICAgICByb3cxWzBdID0gcm93MVsxXSA9IHJvdzFbbmV4dF9yb3ddID0gcm93MVtuZXh0X3JvdysxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotICAgICAgICAgICAgcm93MSArPSAyOwotCi0gICAgICAgICAgICBMID0gKmx1bSsrOwotICAgICAgICAgICAgcm93MVswXSA9IHJvdzFbMV0gPSByb3cxW25leHRfcm93XSA9IHJvdzFbbmV4dF9yb3crMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgICAgIHJvdzEgKz0gMjsKLQotCi0gICAgICAgICAgICAvKiBOb3csIGRvIHNlY29uZCByb3cuICovCi0KLSAgICAgICAgICAgIEwgPSAqbHVtMisrOwotICAgICAgICAgICAgcm93MlswXSA9IHJvdzJbMV0gPSByb3cyW25leHRfcm93XSA9IHJvdzJbbmV4dF9yb3crMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgICAgIHJvdzIgKz0gMjsKLQotICAgICAgICAgICAgTCA9ICpsdW0yKys7Ci0gICAgICAgICAgICByb3cyWzBdID0gcm93MlsxXSA9IHJvdzJbbmV4dF9yb3ddID0gcm93MltuZXh0X3JvdysxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotICAgICAgICAgICAgcm93MiArPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlc2UgdmFsdWVzIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbGluZSwgKGR1ZQotICAgICAgICAgKiB0byB0aGUgKysncyBhYm92ZSksYnV0IHRoZXkgbmVlZCB0byBiZSBhdCB0aGUgc3RhcnQKLSAgICAgICAgICogb2YgdGhlIGxpbmUgYWZ0ZXIgdGhhdC4KLSAgICAgICAgICovCi0gICAgICAgIGx1bSAgKz0gY29sczsKLSAgICAgICAgbHVtMiArPSBjb2xzOwotICAgICAgICByb3cxICs9IG1vZDsKLSAgICAgICAgcm93MiArPSBtb2Q7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBDb2xvcjE2RGl0aGVyWVVZMk1vZDFYKCBpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCogcm93OwotICAgIGludCB4LCB5OwotICAgIGludCBjcl9yOwotICAgIGludCBjcmJfZzsKLSAgICBpbnQgY2JfYjsKLSAgICBpbnQgY29sc18yID0gY29scyAvIDI7Ci0KLSAgICByb3cgPSAodW5zaWduZWQgc2hvcnQqKSBvdXQ7Ci0KLSAgICB5ID0gcm93czsKLSAgICB3aGlsZSggeS0tICkKLSAgICB7Ci0gICAgICAgIHggPSBjb2xzXzI7Ci0gICAgICAgIHdoaWxlKCB4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKLQotICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07Ci0gICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07Ci0gICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKLSAgICAgICAgICAgIGNyICs9IDQ7IGNiICs9IDQ7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKLSAgICAgICAgICAgICpyb3crKyA9ICh1bnNpZ25lZCBzaG9ydCkocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKLSAgICAgICAgICAgICpyb3crKyA9ICh1bnNpZ25lZCBzaG9ydCkocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJvdyArPSBtb2Q7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBDb2xvcjI0RGl0aGVyWVVZMk1vZDFYKCBpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICkKLXsKLSAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0gICAgdW5zaWduZWQgY2hhciogcm93OwotICAgIGludCB4LCB5OwotICAgIGludCBjcl9yOwotICAgIGludCBjcmJfZzsKLSAgICBpbnQgY2JfYjsKLSAgICBpbnQgY29sc18yID0gY29scyAvIDI7Ci0KLSAgICByb3cgPSAodW5zaWduZWQgY2hhciopIG91dDsKLSAgICBtb2QgKj0gMzsKLSAgICB5ID0gcm93czsKLSAgICB3aGlsZSggeS0tICkKLSAgICB7Ci0gICAgICAgIHggPSBjb2xzXzI7Ci0gICAgICAgIHdoaWxlKCB4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKLQotICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07Ci0gICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07Ci0gICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKLSAgICAgICAgICAgIGNyICs9IDQ7IGNiICs9IDQ7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKLSAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0gICAgICAgICAgICAqcm93KysgPSAodmFsdWUgICAgICApICYgMHhGRjsKLSAgICAgICAgICAgICpyb3crKyA9ICh2YWx1ZSA+PiAgOCkgJiAweEZGOwotICAgICAgICAgICAgKnJvdysrID0gKHZhbHVlID4+IDE2KSAmIDB4RkY7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKLSAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0gICAgICAgICAgICAqcm93KysgPSAodmFsdWUgICAgICApICYgMHhGRjsKLSAgICAgICAgICAgICpyb3crKyA9ICh2YWx1ZSA+PiAgOCkgJiAweEZGOwotICAgICAgICAgICAgKnJvdysrID0gKHZhbHVlID4+IDE2KSAmIDB4RkY7Ci0KLSAgICAgICAgfQotICAgICAgICByb3cgKz0gbW9kOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgQ29sb3IzMkRpdGhlcllVWTJNb2QxWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCi17Ci0gICAgdW5zaWduZWQgaW50KiByb3c7Ci0gICAgaW50IHgsIHk7Ci0gICAgaW50IGNyX3I7Ci0gICAgaW50IGNyYl9nOwotICAgIGludCBjYl9iOwotICAgIGludCBjb2xzXzIgPSBjb2xzIC8gMjsKLQotICAgIHJvdyA9ICh1bnNpZ25lZCBpbnQqKSBvdXQ7Ci0gICAgeSA9IHJvd3M7Ci0gICAgd2hpbGUoIHktLSApCi0gICAgewotICAgICAgICB4ID0gY29sc18yOwotICAgICAgICB3aGlsZSggeC0tICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7Ci0KLSAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOwotICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOwotICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07Ci0gICAgICAgICAgICBjciArPSA0OyBjYiArPSA0OwotCi0gICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7Ci0gICAgICAgICAgICAqcm93KysgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKLSAgICAgICAgICAgICpyb3crKyA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAotICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLQotCi0gICAgICAgIH0KLSAgICAgICAgcm93ICs9IG1vZDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBJbiB0aGlzIGZ1bmN0aW9uIEkgbWFrZSB1c2Ugb2YgYSBuYXN0eSB0cmljay4gVGhlIHRhYmxlcyBoYXZlIHRoZSBsb3dlcgotICogMTYgYml0cyByZXBsaWNhdGVkIGluIHRoZSB1cHBlciAxNi4gVGhpcyBtZWFucyBJIGNhbiB3cml0ZSBpbnRzIGFuZCBnZXQKLSAqIHRoZSBob3Jpc29udGFsIGRvdWJsaW5nIGZvciBmcmVlIChhbG1vc3QpLgotICovCi1zdGF0aWMgdm9pZCBDb2xvcjE2RGl0aGVyWVVZMk1vZDJYKCBpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICkKLXsKLSAgICB1bnNpZ25lZCBpbnQqIHJvdyA9ICh1bnNpZ25lZCBpbnQqKSBvdXQ7Ci0gICAgY29uc3QgaW50IG5leHRfcm93ID0gY29scysobW9kLzIpOwotICAgIGludCB4LCB5OwotICAgIGludCBjcl9yOwotICAgIGludCBjcmJfZzsKLSAgICBpbnQgY2JfYjsKLSAgICBpbnQgY29sc18yID0gY29scyAvIDI7Ci0KLSAgICB5ID0gcm93czsKLSAgICB3aGlsZSggeS0tICkKLSAgICB7Ci0gICAgICAgIHggPSBjb2xzXzI7Ci0gICAgICAgIHdoaWxlKCB4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKLQotICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07Ci0gICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07Ci0gICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKLSAgICAgICAgICAgIGNyICs9IDQ7IGNiICs9IDQ7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKLSAgICAgICAgICAgIHJvd1swXSA9IHJvd1tuZXh0X3Jvd10gPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotICAgICAgICAgICAgcm93Kys7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKLSAgICAgICAgICAgIHJvd1swXSA9IHJvd1tuZXh0X3Jvd10gPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOwotICAgICAgICAgICAgcm93Kys7Ci0KLSAgICAgICAgfQotICAgICAgICByb3cgKz0gbmV4dF9yb3c7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBDb2xvcjI0RGl0aGVyWVVZMk1vZDJYKCBpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICkKLXsKLSAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0gICAgdW5zaWduZWQgY2hhciogcm93ID0gb3V0OwotICAgIGNvbnN0IGludCBuZXh0X3JvdyA9IChjb2xzKjIgKyBtb2QpICogMzsKLSAgICBpbnQgeCwgeTsKLSAgICBpbnQgY3JfcjsKLSAgICBpbnQgY3JiX2c7Ci0gICAgaW50IGNiX2I7Ci0gICAgaW50IGNvbHNfMiA9IGNvbHMgLyAyOwotICAgIHkgPSByb3dzOwotICAgIHdoaWxlKCB5LS0gKQotICAgIHsKLSAgICAgICAgeCA9IGNvbHNfMjsKLSAgICAgICAgd2hpbGUoIHgtLSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyIGludCBMOwotCi0gICAgICAgICAgICBjcl9yICAgPSAwKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMCoyNTYgXTsKLSAgICAgICAgICAgIGNyYl9nICA9IDEqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAxKjI1NiBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb2xvcnRhYlsgKmNiICsgMioyNTYgXTsKLSAgICAgICAgICAgIGNiX2IgICA9IDIqNzY4KzI1NiArIGNvbG9ydGFiWyAqY2IgKyAzKjI1NiBdOwotICAgICAgICAgICAgY3IgKz0gNDsgY2IgKz0gNDsKLQotICAgICAgICAgICAgTCA9ICpsdW07IGx1bSArPSAyOwotICAgICAgICAgICAgdmFsdWUgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgICAgIHJvd1swKzBdID0gcm93WzMrMF0gPSByb3dbbmV4dF9yb3crMF0gPSByb3dbbmV4dF9yb3crMyswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAodmFsdWUgICAgICApICYgMHhGRjsKLSAgICAgICAgICAgIHJvd1swKzFdID0gcm93WzMrMV0gPSByb3dbbmV4dF9yb3crMV0gPSByb3dbbmV4dF9yb3crMysxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAodmFsdWUgPj4gIDgpICYgMHhGRjsKLSAgICAgICAgICAgIHJvd1swKzJdID0gcm93WzMrMl0gPSByb3dbbmV4dF9yb3crMl0gPSByb3dbbmV4dF9yb3crMysyXSA9Ci0gICAgICAgICAgICAgICAgICAgICAodmFsdWUgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgIHJvdyArPSAyKjM7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKLSAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKLSAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0gICAgICAgICAgICByb3dbMCswXSA9IHJvd1szKzBdID0gcm93W25leHRfcm93KzBdID0gcm93W25leHRfcm93KzMrMF0gPQotICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICAgICAgKSAmIDB4RkY7Ci0gICAgICAgICAgICByb3dbMCsxXSA9IHJvd1szKzFdID0gcm93W25leHRfcm93KzFdID0gcm93W25leHRfcm93KzMrMV0gPQotICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID4+ICA4KSAmIDB4RkY7Ci0gICAgICAgICAgICByb3dbMCsyXSA9IHJvd1szKzJdID0gcm93W25leHRfcm93KzJdID0gcm93W25leHRfcm93KzMrMl0gPQotICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID4+IDE2KSAmIDB4RkY7Ci0gICAgICAgICAgICByb3cgKz0gMiozOwotCi0gICAgICAgIH0KLSAgICAgICAgcm93ICs9IG5leHRfcm93OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgQ29sb3IzMkRpdGhlcllVWTJNb2QyWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCi17Ci0gICAgdW5zaWduZWQgaW50KiByb3cgPSAodW5zaWduZWQgaW50Kikgb3V0OwotICAgIGNvbnN0IGludCBuZXh0X3JvdyA9IGNvbHMqMittb2Q7Ci0gICAgaW50IHgsIHk7Ci0gICAgaW50IGNyX3I7Ci0gICAgaW50IGNyYl9nOwotICAgIGludCBjYl9iOwotICAgIGludCBjb2xzXzIgPSBjb2xzIC8gMjsKLSAgICBtb2QrPW1vZDsKLSAgICB5ID0gcm93czsKLSAgICB3aGlsZSggeS0tICkKLSAgICB7Ci0gICAgICAgIHggPSBjb2xzXzI7Ci0gICAgICAgIHdoaWxlKCB4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKLQotICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07Ci0gICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07Ci0gICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKLSAgICAgICAgICAgIGNyICs9IDQ7IGNiICs9IDQ7Ci0KLSAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKLSAgICAgICAgICAgIHJvd1swXSA9IHJvd1sxXSA9IHJvd1tuZXh0X3Jvd10gPSByb3dbbmV4dF9yb3crMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKLSAgICAgICAgICAgIHJvdyArPSAyOwotCi0gICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7Ci0gICAgICAgICAgICByb3dbMF0gPSByb3dbMV0gPSByb3dbbmV4dF9yb3ddID0gcm93W25leHRfcm93KzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7Ci0gICAgICAgICAgICByb3cgKz0gMjsKLQotCi0gICAgICAgIH0KLQotICAgICAgICByb3cgKz0gbmV4dF9yb3c7Ci0gICAgfQotfQotCi0vKgotICogSG93IG1hbnkgMSBiaXRzIGFyZSB0aGVyZSBpbiB0aGUgVWludDMyLgotICogTG93IHBlcmZvcm1hbmNlLCBkbyBub3QgY2FsbCBvZnRlbi4KLSAqLwotc3RhdGljIGludCBudW1iZXJfb2ZfYml0c19zZXQoIFVpbnQzMiBhICkKLXsKLSAgICBpZighYSkgcmV0dXJuIDA7Ci0gICAgaWYoYSAmIDEpIHJldHVybiAxICsgbnVtYmVyX29mX2JpdHNfc2V0KGEgPj4gMSk7Ci0gICAgcmV0dXJuKG51bWJlcl9vZl9iaXRzX3NldChhID4+IDEpKTsKLX0KLQotLyoKLSAqIEhvdyBtYW55IDAgYml0cyBhcmUgdGhlcmUgYXQgbGVhc3Qgc2lnbmlmaWNhbnQgZW5kIG9mIFVpbnQzMi4KLSAqIExvdyBwZXJmb3JtYW5jZSwgZG8gbm90IGNhbGwgb2Z0ZW4uCi0gKi8KLXN0YXRpYyBpbnQgZnJlZV9iaXRzX2F0X2JvdHRvbSggVWludDMyIGEgKQotewotICAgICAgLyogYXNzdW1lIGNoYXIgaXMgOCBiaXRzICovCi0gICAgaWYoIWEpIHJldHVybiBzaXplb2YoVWludDMyKSAqIDg7Ci0gICAgaWYoKChTaW50MzIpYSkgJiAxbCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDEgKyBmcmVlX2JpdHNfYXRfYm90dG9tICggYSA+PiAxKTsKLX0KLQotCi1TRExfT3ZlcmxheSAqU0RMX0NyZWF0ZVlVVl9TVyhfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBVaW50MzIgZm9ybWF0LCBTRExfU3VyZmFjZSAqZGlzcGxheSkKLXsKLQlTRExfT3ZlcmxheSAqb3ZlcmxheTsKLQlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKnN3ZGF0YTsKLQlpbnQgKkNyX3JfdGFiOwotCWludCAqQ3JfZ190YWI7Ci0JaW50ICpDYl9nX3RhYjsKLQlpbnQgKkNiX2JfdGFiOwotCVVpbnQzMiAqcl8yX3BpeF9hbGxvYzsKLQlVaW50MzIgKmdfMl9waXhfYWxsb2M7Ci0JVWludDMyICpiXzJfcGl4X2FsbG9jOwotCWludCBpOwotCWludCBDUiwgQ0I7Ci0JVWludDMyIFJtYXNrLCBHbWFzaywgQm1hc2s7Ci0KLQkvKiBPbmx5IFJHQiBwYWNrZWQgcGl4ZWwgY29udmVyc2lvbiBzdXBwb3J0ZWQgKi8KLQlpZiAoIChkaXNwbGF5LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgIT0gMikgJiYKLQkgICAgIChkaXNwbGF5LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgIT0gMykgJiYKLQkgICAgIChkaXNwbGF5LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgIT0gNCkgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ2FuJ3QgdXNlIFlVViBkYXRhIG9uIG5vbiAxNi8yNC8zMiBiaXQgc3VyZmFjZXMiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIFZlcmlmeSB0aGF0IHdlIHN1cHBvcnQgdGhlIGZvcm1hdCAqLwotCXN3aXRjaCAoZm9ybWF0KSB7Ci0JICAgIGNhc2UgU0RMX1lWMTJfT1ZFUkxBWToKLQkgICAgY2FzZSBTRExfSVlVVl9PVkVSTEFZOgotCSAgICBjYXNlIFNETF9ZVVkyX09WRVJMQVk6Ci0JICAgIGNhc2UgU0RMX1VZVllfT1ZFUkxBWToKLQkgICAgY2FzZSBTRExfWVZZVV9PVkVSTEFZOgotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBZVVYgZm9ybWF0Iik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBDcmVhdGUgdGhlIG92ZXJsYXkgc3RydWN0dXJlICovCi0Jb3ZlcmxheSA9IChTRExfT3ZlcmxheSAqKVNETF9tYWxsb2Moc2l6ZW9mICpvdmVybGF5KTsKLQlpZiAoIG92ZXJsYXkgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JU0RMX21lbXNldChvdmVybGF5LCAwLCAoc2l6ZW9mICpvdmVybGF5KSk7Ci0KLQkvKiBGaWxsIGluIHRoZSBiYXNpYyBtZW1iZXJzICovCi0Jb3ZlcmxheS0+Zm9ybWF0ID0gZm9ybWF0OwotCW92ZXJsYXktPncgPSB3aWR0aDsKLQlvdmVybGF5LT5oID0gaGVpZ2h0OwotCi0JLyogU2V0IHVwIHRoZSBZVVYgc3VyZmFjZSBmdW5jdGlvbiBzdHJ1Y3R1cmUgKi8KLQlvdmVybGF5LT5od2Z1bmNzID0gJnN3X3l1dmZ1bmNzOwotCi0JLyogQ3JlYXRlIHRoZSBwaXhlbCBkYXRhIGFuZCBsb29rdXAgdGFibGVzICovCi0Jc3dkYXRhID0gKHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqKVNETF9tYWxsb2Moc2l6ZW9mICpzd2RhdGEpOwotCW92ZXJsYXktPmh3ZGF0YSA9IHN3ZGF0YTsKLQlpZiAoIHN3ZGF0YSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCXN3ZGF0YS0+c3RyZXRjaCA9IE5VTEw7Ci0Jc3dkYXRhLT5kaXNwbGF5ID0gZGlzcGxheTsKLQlzd2RhdGEtPnBpeGVscyA9IChVaW50OCAqKSBTRExfbWFsbG9jKHdpZHRoKmhlaWdodCoyKTsKLQlzd2RhdGEtPmNvbG9ydGFiID0gKGludCAqKVNETF9tYWxsb2MoNCoyNTYqc2l6ZW9mKGludCkpOwotCUNyX3JfdGFiID0gJnN3ZGF0YS0+Y29sb3J0YWJbMCoyNTZdOwotCUNyX2dfdGFiID0gJnN3ZGF0YS0+Y29sb3J0YWJbMSoyNTZdOwotCUNiX2dfdGFiID0gJnN3ZGF0YS0+Y29sb3J0YWJbMioyNTZdOwotCUNiX2JfdGFiID0gJnN3ZGF0YS0+Y29sb3J0YWJbMyoyNTZdOwotCXN3ZGF0YS0+cmdiXzJfcGl4ID0gKFVpbnQzMiAqKVNETF9tYWxsb2MoMyo3Njgqc2l6ZW9mKFVpbnQzMikpOwotCXJfMl9waXhfYWxsb2MgPSAmc3dkYXRhLT5yZ2JfMl9waXhbMCo3NjhdOwotCWdfMl9waXhfYWxsb2MgPSAmc3dkYXRhLT5yZ2JfMl9waXhbMSo3NjhdOwotCWJfMl9waXhfYWxsb2MgPSAmc3dkYXRhLT5yZ2JfMl9waXhbMio3NjhdOwotCWlmICggISBzd2RhdGEtPnBpeGVscyB8fCAhIHN3ZGF0YS0+Y29sb3J0YWIgfHwgISBzd2RhdGEtPnJnYl8yX3BpeCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIEdlbmVyYXRlIHRoZSB0YWJsZXMgZm9yIHRoZSBkaXNwbGF5IHN1cmZhY2UgKi8KLQlmb3IgKGk9MDsgaTwyNTY7IGkrKykgewotCQkvKiBHYW1tYSBjb3JyZWN0aW9uIChsdW1pbmVzY2VuY2UgdGFibGUpIGFuZCBjaHJvbWEgY29ycmVjdGlvbgotCQkgICB3b3VsZCBiZSBkb25lIGhlcmUuICBTZWUgdGhlIEJlcmtlbGV5IG1wZWdfcGxheSBzb3VyY2VzLgotCQkqLwotCQlDQiA9IENSID0gKGktMTI4KTsKLQkJQ3Jfcl90YWJbaV0gPSAoaW50KSAoICgwLjQxOS8wLjI5OSkgKiBDUik7Ci0JCUNyX2dfdGFiW2ldID0gKGludCkgKC0oMC4yOTkvMC40MTkpICogQ1IpOwotCQlDYl9nX3RhYltpXSA9IChpbnQpICgtKDAuMTE0LzAuMzMxKSAqIENCKTsgCi0JCUNiX2JfdGFiW2ldID0gKGludCkgKCAoMC41ODcvMC4zMzEpICogQ0IpOwotCX0KLQotCS8qIAotCSAqIFNldCB1cCBlbnRyaWVzIDAtMjU1IGluIHJnYi10by1waXhlbCB2YWx1ZSB0YWJsZXMuCi0JICovCi0JUm1hc2sgPSBkaXNwbGF5LT5mb3JtYXQtPlJtYXNrOwotCUdtYXNrID0gZGlzcGxheS0+Zm9ybWF0LT5HbWFzazsKLQlCbWFzayA9IGRpc3BsYXktPmZvcm1hdC0+Qm1hc2s7Ci0JZm9yICggaT0wOyBpPDI1NjsgKytpICkgewotCQlyXzJfcGl4X2FsbG9jW2krMjU2XSA9IGkgPj4gKDggLSBudW1iZXJfb2ZfYml0c19zZXQoUm1hc2spKTsKLQkJcl8yX3BpeF9hbGxvY1tpKzI1Nl0gPDw9IGZyZWVfYml0c19hdF9ib3R0b20oUm1hc2spOwotCQlnXzJfcGl4X2FsbG9jW2krMjU2XSA9IGkgPj4gKDggLSBudW1iZXJfb2ZfYml0c19zZXQoR21hc2spKTsKLQkJZ18yX3BpeF9hbGxvY1tpKzI1Nl0gPDw9IGZyZWVfYml0c19hdF9ib3R0b20oR21hc2spOwotCQliXzJfcGl4X2FsbG9jW2krMjU2XSA9IGkgPj4gKDggLSBudW1iZXJfb2ZfYml0c19zZXQoQm1hc2spKTsKLQkJYl8yX3BpeF9hbGxvY1tpKzI1Nl0gPDw9IGZyZWVfYml0c19hdF9ib3R0b20oQm1hc2spOwotCX0KLQotCS8qCi0JICogSWYgd2UgaGF2ZSAxNi1iaXQgb3V0cHV0IGRlcHRoLCB0aGVuIHdlIGRvdWJsZSB0aGUgdmFsdWUKLQkgKiBpbiB0aGUgdG9wIHdvcmQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW4gd3JpdGUgb3V0IGJvdGgKLQkgKiBwaXhlbHMgaW4gdGhlIHBpeGVsIGRvdWJsaW5nIG1vZGUgd2l0aCBvbmUgb3AuIEl0IGlzIAotCSAqIGhhcm1sZXNzIGluIHRoZSBub3JtYWwgY2FzZSBhcyBzdG9yaW5nIGEgMzItYml0IHZhbHVlCi0JICogdGhyb3VnaCBhIHNob3J0IHBvaW50ZXIgd2lsbCBsb3NlIHRoZSB0b3AgYml0cyBhbnl3YXkuCi0JICovCi0JaWYoIGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9PSAyICkgewotCQlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7Ci0JCQlyXzJfcGl4X2FsbG9jW2krMjU2XSB8PSAocl8yX3BpeF9hbGxvY1tpKzI1Nl0pIDw8IDE2OwotCQkJZ18yX3BpeF9hbGxvY1tpKzI1Nl0gfD0gKGdfMl9waXhfYWxsb2NbaSsyNTZdKSA8PCAxNjsKLQkJCWJfMl9waXhfYWxsb2NbaSsyNTZdIHw9IChiXzJfcGl4X2FsbG9jW2krMjU2XSkgPDwgMTY7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNwcmVhZCBvdXQgdGhlIHZhbHVlcyB3ZSBoYXZlIHRvIHRoZSByZXN0IG9mIHRoZSBhcnJheSBzbyB0aGF0Ci0JICogd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93LgotCSAqLwotCWZvciAoIGk9MDsgaTwyNTY7ICsraSApIHsKLQkJcl8yX3BpeF9hbGxvY1tpXSA9IHJfMl9waXhfYWxsb2NbMjU2XTsKLQkJcl8yX3BpeF9hbGxvY1tpKzUxMl0gPSByXzJfcGl4X2FsbG9jWzUxMV07Ci0JCWdfMl9waXhfYWxsb2NbaV0gPSBnXzJfcGl4X2FsbG9jWzI1Nl07Ci0JCWdfMl9waXhfYWxsb2NbaSs1MTJdID0gZ18yX3BpeF9hbGxvY1s1MTFdOwotCQliXzJfcGl4X2FsbG9jW2ldID0gYl8yX3BpeF9hbGxvY1syNTZdOwotCQliXzJfcGl4X2FsbG9jW2krNTEyXSA9IGJfMl9waXhfYWxsb2NbNTExXTsKLQl9Ci0KLQkvKiBZb3UgaGF2ZSBjaG9zZW4gd2lzZWx5Li4uICovCi0Jc3dpdGNoIChmb3JtYXQpIHsKLQkgICAgY2FzZSBTRExfWVYxMl9PVkVSTEFZOgotCSAgICBjYXNlIFNETF9JWVVWX09WRVJMQVk6Ci0JCWlmICggZGlzcGxheS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID09IDIgKSB7Ci0jaWYgKF9fR05VQ19fID4gMikgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgX19PUFRJTUlaRV9fICYmIFNETF9BU1NFTUJMWV9ST1VUSU5FUwotCQkJLyogaW5saW5lIGFzc2VtYmx5IGZ1bmN0aW9ucyAqLwotCQkJaWYgKCBTRExfSGFzTU1YKCkgJiYgKFJtYXNrID09IDB4RjgwMCkgJiYKLQkJCSAgICAgICAgICAgICAgICAgICAgIChHbWFzayA9PSAweDA3RTApICYmCi0JCQkJICAgICAgICAgICAgIChCbWFzayA9PSAweDAwMUYpICYmCi0JCQkgICAgICAgICAgICAgICAgICAgICAod2lkdGggJiAxNSkgPT0gMCkgewotLypwcmludGYoIlVzaW5nIE1NWCAxNi1iaXQgNTY1IGRpdGhlclxuIik7Ki8KLQkJCQlzd2RhdGEtPkRpc3BsYXkxWCA9IENvbG9yNTY1RGl0aGVyWVYxMk1NWDFYOwotCQkJfSBlbHNlIHsKLS8qcHJpbnRmKCJVc2luZyBDIDE2LWJpdCBkaXRoZXJcbiIpOyovCi0JCQkJc3dkYXRhLT5EaXNwbGF5MVggPSBDb2xvcjE2RGl0aGVyWVYxMk1vZDFYOwotCQkJfQotI2Vsc2UKLQkJCXN3ZGF0YS0+RGlzcGxheTFYID0gQ29sb3IxNkRpdGhlcllWMTJNb2QxWDsKLSNlbmRpZgotCQkJc3dkYXRhLT5EaXNwbGF5MlggPSBDb2xvcjE2RGl0aGVyWVYxMk1vZDJYOwotCQl9Ci0JCWlmICggZGlzcGxheS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID09IDMgKSB7Ci0JCQlzd2RhdGEtPkRpc3BsYXkxWCA9IENvbG9yMjREaXRoZXJZVjEyTW9kMVg7Ci0JCQlzd2RhdGEtPkRpc3BsYXkyWCA9IENvbG9yMjREaXRoZXJZVjEyTW9kMlg7Ci0JCX0KLQkJaWYgKCBkaXNwbGF5LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPT0gNCApIHsKLSNpZiAoX19HTlVDX18gPiAyKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBfX09QVElNSVpFX18gJiYgU0RMX0FTU0VNQkxZX1JPVVRJTkVTCi0JCQkvKiBpbmxpbmUgYXNzZW1ibHkgZnVuY3Rpb25zICovCi0JCQlpZiAoIFNETF9IYXNNTVgoKSAmJiAoUm1hc2sgPT0gMHgwMEZGMDAwMCkgJiYKLQkJCSAgICAgICAgICAgICAgICAgICAgIChHbWFzayA9PSAweDAwMDBGRjAwKSAmJgotCQkJCSAgICAgICAgICAgICAoQm1hc2sgPT0gMHgwMDAwMDBGRikgJiYgCi0JCQkgICAgICAgICAgICAgICAgICAgICAod2lkdGggJiAxNSkgPT0gMCkgewotLypwcmludGYoIlVzaW5nIE1NWCAzMi1iaXQgZGl0aGVyXG4iKTsqLwotCQkJCXN3ZGF0YS0+RGlzcGxheTFYID0gQ29sb3JSR0JEaXRoZXJZVjEyTU1YMVg7Ci0JCQl9IGVsc2UgewotLypwcmludGYoIlVzaW5nIEMgMzItYml0IGRpdGhlclxuIik7Ki8KLQkJCQlzd2RhdGEtPkRpc3BsYXkxWCA9IENvbG9yMzJEaXRoZXJZVjEyTW9kMVg7Ci0JCQl9Ci0jZWxzZQotCQkJc3dkYXRhLT5EaXNwbGF5MVggPSBDb2xvcjMyRGl0aGVyWVYxMk1vZDFYOwotI2VuZGlmCi0JCQlzd2RhdGEtPkRpc3BsYXkyWCA9IENvbG9yMzJEaXRoZXJZVjEyTW9kMlg7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX1lVWTJfT1ZFUkxBWToKLQkgICAgY2FzZSBTRExfVVlWWV9PVkVSTEFZOgotCSAgICBjYXNlIFNETF9ZVllVX09WRVJMQVk6Ci0JCWlmICggZGlzcGxheS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID09IDIgKSB7Ci0JCQlzd2RhdGEtPkRpc3BsYXkxWCA9IENvbG9yMTZEaXRoZXJZVVkyTW9kMVg7Ci0JCQlzd2RhdGEtPkRpc3BsYXkyWCA9IENvbG9yMTZEaXRoZXJZVVkyTW9kMlg7Ci0JCX0KLQkJaWYgKCBkaXNwbGF5LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPT0gMyApIHsKLQkJCXN3ZGF0YS0+RGlzcGxheTFYID0gQ29sb3IyNERpdGhlcllVWTJNb2QxWDsKLQkJCXN3ZGF0YS0+RGlzcGxheTJYID0gQ29sb3IyNERpdGhlcllVWTJNb2QyWDsKLQkJfQotCQlpZiAoIGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9PSA0ICkgewotCQkJc3dkYXRhLT5EaXNwbGF5MVggPSBDb2xvcjMyRGl0aGVyWVVZMk1vZDFYOwotCQkJc3dkYXRhLT5EaXNwbGF5MlggPSBDb2xvcjMyRGl0aGVyWVVZMk1vZDJYOwotCQl9Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKGNhdWdodCBhYm92ZSkgKi8KLQkJYnJlYWs7Ci0JfQotCi0JLyogRmluZCB0aGUgcGl0Y2ggYW5kIG9mZnNldCB2YWx1ZXMgZm9yIHRoZSBvdmVybGF5ICovCi0Jb3ZlcmxheS0+cGl0Y2hlcyA9IHN3ZGF0YS0+cGl0Y2hlczsKLQlvdmVybGF5LT5waXhlbHMgPSBzd2RhdGEtPnBsYW5lczsKLQlzd2l0Y2ggKGZvcm1hdCkgewotCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0JICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKLQkJb3ZlcmxheS0+cGl0Y2hlc1swXSA9IG92ZXJsYXktPnc7Ci0JCW92ZXJsYXktPnBpdGNoZXNbMV0gPSBvdmVybGF5LT5waXRjaGVzWzBdIC8gMjsKLQkJb3ZlcmxheS0+cGl0Y2hlc1syXSA9IG92ZXJsYXktPnBpdGNoZXNbMF0gLyAyOwotCSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzBdID0gc3dkYXRhLT5waXhlbHM7Ci0JICAgICAgICBvdmVybGF5LT5waXhlbHNbMV0gPSBvdmVybGF5LT5waXhlbHNbMF0gKwotCQkgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LT5waXRjaGVzWzBdICogb3ZlcmxheS0+aDsKLQkgICAgICAgIG92ZXJsYXktPnBpeGVsc1syXSA9IG92ZXJsYXktPnBpeGVsc1sxXSArCi0JCSAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMV0gKiBvdmVybGF5LT5oIC8gMjsKLQkJb3ZlcmxheS0+cGxhbmVzID0gMzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX1lVWTJfT1ZFUkxBWToKLQkgICAgY2FzZSBTRExfVVlWWV9PVkVSTEFZOgotCSAgICBjYXNlIFNETF9ZVllVX09WRVJMQVk6Ci0JCW92ZXJsYXktPnBpdGNoZXNbMF0gPSBvdmVybGF5LT53KjI7Ci0JICAgICAgICBvdmVybGF5LT5waXhlbHNbMF0gPSBzd2RhdGEtPnBpeGVsczsKLQkJb3ZlcmxheS0+cGxhbmVzID0gMTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAoY2F1Z2h0IGFib3ZlKSAqLwotCQlicmVhazsKLQl9Ci0KLQkvKiBXZSdyZSBhbGwgZG9uZS4uICovCi0JcmV0dXJuKG92ZXJsYXkpOwotfQotCi1pbnQgU0RMX0xvY2tZVVZfU1coX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQotewotCXJldHVybigwKTsKLX0KLQotdm9pZCBTRExfVW5sb2NrWVVWX1NXKF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSkKLXsKLQlyZXR1cm47Ci19Ci0KLWludCBTRExfRGlzcGxheVlVVl9TVyhfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXksIFNETF9SZWN0ICpzcmMsIFNETF9SZWN0ICpkc3QpCi17Ci0Jc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICpzd2RhdGE7Ci0JaW50IHN0cmV0Y2g7Ci0JaW50IHNjYWxlXzJ4OwotCVNETF9TdXJmYWNlICpkaXNwbGF5OwotCVVpbnQ4ICpsdW0sICpDciwgKkNiOwotCVVpbnQ4ICpkc3RwOwotCWludCBtb2Q7Ci0KLQlzd2RhdGEgPSBvdmVybGF5LT5od2RhdGE7Ci0Jc3RyZXRjaCA9IDA7Ci0Jc2NhbGVfMnggPSAwOwotCWlmICggc3JjLT54IHx8IHNyYy0+eSB8fCBzcmMtPncgPCBvdmVybGF5LT53IHx8IHNyYy0+aCA8IG92ZXJsYXktPmggKSB7Ci0JCS8qIFRoZSBzb3VyY2UgcmVjdGFuZ2xlIGhhcyBiZWVuIGNsaXBwZWQuCi0JCSAgIFVzaW5nIGEgc2NyYXRjaCBzdXJmYWNlIGlzIGVhc2llciB0aGFuIGFkZGluZyBjbGlwcGVkCi0JCSAgIHNvdXJjZSBzdXBwb3J0IHRvIGFsbCB0aGUgYmxpdHRlcnMsIHBsdXMgdGhhdCB3b3VsZAotCQkgICBzbG93IHRoZW0gZG93biBpbiB0aGUgZ2VuZXJhbCB1bmNsaXBwZWQgY2FzZS4KLQkJKi8KLQkJc3RyZXRjaCA9IDE7Ci0JfSBlbHNlIGlmICggKHNyYy0+dyAhPSBkc3QtPncpIHx8IChzcmMtPmggIT0gZHN0LT5oKSApIHsKLQkJaWYgKCAoZHN0LT53ID09IDIqc3JjLT53KSAmJgotCQkgICAgIChkc3QtPmggPT0gMipzcmMtPmgpICkgewotCQkJc2NhbGVfMnggPSAxOwotCQl9IGVsc2UgewotCQkJc3RyZXRjaCA9IDE7Ci0JCX0KLQl9Ci0JaWYgKCBzdHJldGNoICkgewotCQlpZiAoICEgc3dkYXRhLT5zdHJldGNoICkgewotCQkJZGlzcGxheSA9IHN3ZGF0YS0+ZGlzcGxheTsKLQkJCXN3ZGF0YS0+c3RyZXRjaCA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKAotCQkJCVNETF9TV1NVUkZBQ0UsCi0JCQkJb3ZlcmxheS0+dywgb3ZlcmxheS0+aCwKLQkJCQlkaXNwbGF5LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCwKLQkJCQlkaXNwbGF5LT5mb3JtYXQtPlJtYXNrLAotCQkJCWRpc3BsYXktPmZvcm1hdC0+R21hc2ssCi0JCQkJZGlzcGxheS0+Zm9ybWF0LT5CbWFzaywgMCk7Ci0JCQlpZiAoICEgc3dkYXRhLT5zdHJldGNoICkgewotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCX0KLQkJZGlzcGxheSA9IHN3ZGF0YS0+c3RyZXRjaDsKLQl9IGVsc2UgewotCQlkaXNwbGF5ID0gc3dkYXRhLT5kaXNwbGF5OwotCX0KLQlzd2l0Y2ggKG92ZXJsYXktPmZvcm1hdCkgewotCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0JCWx1bSA9IG92ZXJsYXktPnBpeGVsc1swXTsKLQkJQ3IgPSAgb3ZlcmxheS0+cGl4ZWxzWzFdOwotCQlDYiA9ICBvdmVybGF5LT5waXhlbHNbMl07Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9JWVVWX09WRVJMQVk6Ci0JCWx1bSA9IG92ZXJsYXktPnBpeGVsc1swXTsKLQkJQ3IgPSAgb3ZlcmxheS0+cGl4ZWxzWzJdOwotCQlDYiA9ICBvdmVybGF5LT5waXhlbHNbMV07Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9ZVVkyX09WRVJMQVk6Ci0JCWx1bSA9IG92ZXJsYXktPnBpeGVsc1swXTsKLQkJQ3IgPSBsdW0gKyAzOwotCQlDYiA9IGx1bSArIDE7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9VWVZZX09WRVJMQVk6Ci0JCWx1bSA9IG92ZXJsYXktPnBpeGVsc1swXSsxOwotCQlDciA9IGx1bSArIDE7Ci0JCUNiID0gbHVtIC0gMTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX1lWWVVfT1ZFUkxBWToKLQkJbHVtID0gb3ZlcmxheS0+cGl4ZWxzWzBdOwotCQlDciA9IGx1bSArIDE7Ci0JCUNiID0gbHVtICsgMzsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgWVVWIGZvcm1hdCBpbiBibGl0Iik7Ci0JCXJldHVybigtMSk7Ci0JfQotCWlmICggU0RMX01VU1RMT0NLKGRpc3BsYXkpICkgewotICAgICAgICAJaWYgKCBTRExfTG9ja1N1cmZhY2UoZGlzcGxheSkgPCAwICkgewotCQkJcmV0dXJuKC0xKTsKLQkJfQotCX0KLQlpZiAoIHN0cmV0Y2ggKSB7Ci0JCWRzdHAgPSAoVWludDggKilzd2RhdGEtPnN0cmV0Y2gtPnBpeGVsczsKLQl9IGVsc2UgewotCQlkc3RwID0gKFVpbnQ4ICopZGlzcGxheS0+cGl4ZWxzCi0JCQkrIGRzdC0+eCAqIGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbAotCQkJKyBkc3QtPnkgKiBkaXNwbGF5LT5waXRjaDsKLQl9Ci0JbW9kID0gKGRpc3BsYXktPnBpdGNoIC8gZGlzcGxheS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKTsKLQotCWlmICggc2NhbGVfMnggKSB7Ci0JCW1vZCAtPSAob3ZlcmxheS0+dyAqIDIpOwotCQlzd2RhdGEtPkRpc3BsYXkyWChzd2RhdGEtPmNvbG9ydGFiLCBzd2RhdGEtPnJnYl8yX3BpeCwKLQkJICAgICAgICAgICAgICAgICAgbHVtLCBDciwgQ2IsIGRzdHAsIG92ZXJsYXktPmgsIG92ZXJsYXktPncsIG1vZCk7Ci0JfSBlbHNlIHsKLQkJbW9kIC09IG92ZXJsYXktPnc7Ci0JCXN3ZGF0YS0+RGlzcGxheTFYKHN3ZGF0YS0+Y29sb3J0YWIsIHN3ZGF0YS0+cmdiXzJfcGl4LAotCQkgICAgICAgICAgICAgICAgICBsdW0sIENyLCBDYiwgZHN0cCwgb3ZlcmxheS0+aCwgb3ZlcmxheS0+dywgbW9kKTsKLQl9Ci0JaWYgKCBTRExfTVVTVExPQ0soZGlzcGxheSkgKSB7Ci0JCVNETF9VbmxvY2tTdXJmYWNlKGRpc3BsYXkpOwotCX0KLQlpZiAoIHN0cmV0Y2ggKSB7Ci0JCWRpc3BsYXkgPSBzd2RhdGEtPmRpc3BsYXk7Ci0JCVNETF9Tb2Z0U3RyZXRjaChzd2RhdGEtPnN0cmV0Y2gsIHNyYywgZGlzcGxheSwgZHN0KTsKLQl9Ci0JU0RMX1VwZGF0ZVJlY3RzKGRpc3BsYXksIDEsIGRzdCk7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgU0RMX0ZyZWVZVVZfU1coX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQotewotCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqc3dkYXRhOwotCi0Jc3dkYXRhID0gb3ZlcmxheS0+aHdkYXRhOwotCWlmICggc3dkYXRhICkgewotCQlpZiAoIHN3ZGF0YS0+c3RyZXRjaCApIHsKLQkJCVNETF9GcmVlU3VyZmFjZShzd2RhdGEtPnN0cmV0Y2gpOwotCQl9Ci0JCWlmICggc3dkYXRhLT5waXhlbHMgKSB7Ci0JCQlTRExfZnJlZShzd2RhdGEtPnBpeGVscyk7Ci0JCX0KLQkJaWYgKCBzd2RhdGEtPmNvbG9ydGFiICkgewotCQkJU0RMX2ZyZWUoc3dkYXRhLT5jb2xvcnRhYik7Ci0JCX0KLQkJaWYgKCBzd2RhdGEtPnJnYl8yX3BpeCApIHsKLQkJCVNETF9mcmVlKHN3ZGF0YS0+cmdiXzJfcGl4KTsKLQkJfQotCQlTRExfZnJlZShzd2RhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3l1dl9zd19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF95dXZfc3dfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRmNTFkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3l1dl9zd19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgotCi0vKiBUaGlzIGlzIHRoZSBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgWVVWIHZpZGVvIG92ZXJsYXkgc3VwcG9ydCAqLwotCi1leHRlcm4gU0RMX092ZXJsYXkgKlNETF9DcmVhdGVZVVZfU1coX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpOwotCi1leHRlcm4gaW50IFNETF9Mb2NrWVVWX1NXKF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7Ci0KLWV4dGVybiB2b2lkIFNETF9VbmxvY2tZVVZfU1coX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKLQotZXh0ZXJuIGludCBTRExfRGlzcGxheVlVVl9TVyhfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXksIFNETF9SZWN0ICpzcmMsIFNETF9SZWN0ICpkc3QpOwotCi1leHRlcm4gdm9pZCBTRExfRnJlZVlVVl9TVyhfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfeXV2ZnVuY3MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX3l1dmZ1bmNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OGFmM2YuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9TRExfeXV2ZnVuY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBZVVYgdmlkZW8gc3VyZmFjZSBmdW5jdGlvbiBzdHJ1Y3R1cmUgKi8KLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgotCi0jaWZuZGVmIF9USElTCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqX3RoaXMKLSNlbmRpZgotc3RydWN0IHByaXZhdGVfeXV2aHdmdW5jcyB7Ci0JaW50ICgqTG9jaykoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKLQl2b2lkICgqVW5sb2NrKShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOwotCWludCAoKkRpc3BsYXkpKF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSwgU0RMX1JlY3QgKnNyYywgU0RMX1JlY3QgKmRzdCk7Ci0Jdm9pZCAoKkZyZWVIVykoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKLX07CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWE1FL3htZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L1hNRS94bWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2NzRkNS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWE1FL3htZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5My0yMDAxIGJ5IFhpIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFBsZWFzZSBzZWUgdGhlIExJQ0VOU0UgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcyBkaXN0cmlidXRpb24gZm9yIGxpY2Vuc2luZyAKLSAqIGluZm9ybWF0aW9uLiAKLSAqCi0gKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIGZpeGVzIGFuZCBtb2RpZmljYXRpb25zIHRvIHNyY0B4aWcuY29tLgotICoKLSAqICRYaUdJZDogeG1lLmMsdiAxLjIgMjAwMS8xMS8zMCAyMTo1Njo1OSBqb24gRXhwICQKLSAqCi0gKi8KLQotI2RlZmluZSBORUVEX0VWRU5UUwotI2RlZmluZSBORUVEX1JFUExJRVMKLQotI2luY2x1ZGUgPFgxMS9YbGliaW50Lmg+Ci0jaW5jbHVkZSA8WDExL1h0aHJlYWRzLmg+Ci0jaW5jbHVkZSA8WDExL1htZC5oPgotI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4KLSNpbmNsdWRlICIuLi9leHRlbnNpb25zL1hleHQuaCIKLSNpbmNsdWRlICIuLi9leHRlbnNpb25zL2V4dHV0aWwuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUJWElHTUlTQ19QUk9UT0NPTF9OQU1FIAkJICAgICAiWGlHLVNVTkRSWS1OT05TVEFOREFSRCIKLSNkZWZpbmUgWElHTUlTQ19NQUpPUl9WRVJTSU9OCSAgICAgICAgICAgICAyCi0jZGVmaW5lIFhJR01JU0NfTUlOT1JfVkVSU0lPTiAJICAgICAgICAgICAgIDAKLQotI2RlZmluZSBYaUdNaXNjTnVtYmVyRXZlbnRzCSAgICAgICAgICAgICAwCi0KLSNkZWZpbmUJWF9YaUdNaXNjUXVlcnlWZXJzaW9uCQkgICAgIDAKLSNkZWZpbmUJWF9YaUdNaXNjUXVlcnlWaWV3cwkJICAgICAxCi0jZGVmaW5lIFhfWGlHTWlzY1F1ZXJ5UmVzb2x1dGlvbnMgICAgICAgICAgICAyCi0jZGVmaW5lIFhfWGlHTWlzY0NoYW5nZVJlc29sdXRpb24gICAgICAgICAgICAzCi0jZGVmaW5lIFhfWGlHTWlzY0Z1bGxTY3JlZW4gICAgICAgICAgICAgICAgICA0Ci0KLSNkZWZpbmUgc3pfeFhpR01pc2NRdWVyeVZlcnNpb25SZXEJICAgICA4Ci0jZGVmaW5lIHN6X3hYaUdNaXNjUXVlcnlWaWV3c1JlcQkgICAgIDgKLSNkZWZpbmUgc3pfeFhpR01pc2NRdWVyeVJlc29sdXRpb25zUmVxICAgICAgIDgKLSNkZWZpbmUgc3pfeFhpR01pc2NDaGFuZ2VSZXNvbHV0aW9uUmVxICAgICAgIDE2Ci0jZGVmaW5lIHN6X3hYaUdNaXNjRnVsbFNjcmVlblJlcSAgICAgICAgICAgICAxNgotCi0jZGVmaW5lIHN6X3hYaUdNaXNjUXVlcnlWZXJzaW9uUmVwbHkJICAgICAzMgotI2RlZmluZSBzel94WGlHTWlzY1F1ZXJ5Vmlld3NSZXBseQkgICAgIDMyCi0jZGVmaW5lIHN6X3hYaUdNaXNjUXVlcnlSZXNvbHV0aW9uc1JlcGx5ICAgICAzMgotI2RlZmluZSBzel94WGlHTWlzY1F1ZXJ5RnVsbFNjcmVlblJlcGx5ICAgICAgMzIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQ0FSRDggICAgICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAgICAgICAgKi8KLSAgQ0FSRDggICAgICAgICB4aWdtaXNjUmVxVHlwZTsgICAgICAgICAvKiBhbHdheXMgWF9YaUdNaXNjUXVlcnlWZXJzaW9uICAgICAgKi8KLSAgQ0FSRDE2ICAgICAgICBsZW5ndGg7Ci0gIENBUkQxNiAgICAgICAgbWFqb3I7Ci0gIENBUkQxNiAgICAgICAgbWlub3I7Ci19IHhYaUdNaXNjUXVlcnlWZXJzaW9uUmVxOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIENBUkQ4ICAgICAgICAgcmVxVHlwZTsgICAgICAgICAgICAgICAgLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgICAgICAgICovCi0gIENBUkQ4ICAgICAgICAgeGlnbWlzY1JlcVR5cGU7ICAgICAgICAgLyogYWx3YXlzIFhfWGlHTWlzY1F1ZXJ5Vmlld3MgICAgICAgICovCi0gIENBUkQxNiAgICAgICAgbGVuZ3RoOwotICBDQVJEOAkJc2NyZWVuOwotICBDQVJEOAkJcGFkMDsKLSAgQ0FSRDE2CXBhZDE7Ci19IHhYaUdNaXNjUXVlcnlWaWV3c1JlcTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBDQVJEOCAgICAgICAgIHJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICAgICAgICAqLwotICBDQVJEOCAgICAgICAgIHhpZ21pc2NSZXFUeXBlOyAgICAgICAgIC8qIGFsd2F5cyBYX1hpR01pc2NRdWVyeVJlc29sdXRpb25zICAqLwotICBDQVJEMTYgICAgICAgIGxlbmd0aDsKLSAgQ0FSRDgJCXNjcmVlbjsKLSAgQ0FSRDgJCXZpZXc7Ci0gIENBUkQxNglwYWQwOwotfSB4WGlHTWlzY1F1ZXJ5UmVzb2x1dGlvbnNSZXE7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQ0FSRDggICAgICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAgICAgICAgKi8KLSAgQ0FSRDggICAgICAgICB4aWdtaXNjUmVxVHlwZTsgICAgICAgICAvKiBhbHdheXMgWF9YaUdNaXNjQ2hhbmdlUmVzb2x1dGlvbiAgKi8KLSAgQ0FSRDE2ICAgICAgICBsZW5ndGg7Ci0gIENBUkQ4CQlzY3JlZW47Ci0gIENBUkQ4CQl2aWV3OwotICBDQVJEMTYJcGFkMDsKLSAgQ0FSRDE2ICAgICAgICB3aWR0aDsKLSAgQ0FSRDE2ICAgICAgICBoZWlnaHQ7Ci0gIElOVDMyICAgICAgICAgcmVmcmVzaDsKLX0geFhpR01pc2NDaGFuZ2VSZXNvbHV0aW9uUmVxOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIENBUkQ4ICAgICAgICAgcmVxVHlwZTsgICAgICAgICAgICAgICAgLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgICAgICAgICovCi0gIENBUkQ4ICAgICAgICAgeGlnbWlzY1JlcVR5cGU7ICAgICAgICAgLyogYWx3YXlzIFhfWGlHTWlzY0Z1bGxTY3JlZW4gICAgICAgICovCi0gIENBUkQxNiAgICAgICAgbGVuZ3RoOwotICBDQVJEOAkJc2NyZWVuOwotICBDQVJEOAkJcGFkMDsKLSAgQ0FSRDE2CXBhZDE7Ci0gIENBUkQzMgl3aW5kb3c7Ci0gIENBUkQzMgljbWFwOwotfSB4WGlHTWlzY0Z1bGxTY3JlZW5SZXE7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7ICAgICAgICAKLSAgQllURSAgICAgICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiBYX1JlcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQ0FSRDggICAgICAgICBwYWQwOwotICBDQVJEMTYgICAgICAgIHNlcXVlbmNlTnVtYmVyOwotICBDQVJEMzIgICAgICAgIGxlbmd0aDsKLSAgQ0FSRDE2ICAgICAgICBtYWpvcjsKLSAgQ0FSRDE2ICAgICAgICBtaW5vcjsKLSAgQ0FSRDMyICAgICAgICBwYWQxOwotICBDQVJEMzIgICAgICAgIHBhZDI7Ci0gIENBUkQzMiAgICAgICAgcGFkMzsKLSAgQ0FSRDMyICAgICAgICBwYWQ0OwotICBDQVJEMzIgICAgICAgIHBhZDU7Ci19IHhYaUdNaXNjUXVlcnlWZXJzaW9uUmVwbHk7Ci0KLXR5cGVkZWYgc3RydWN0IHsgICAgICAgIAotICBCWVRFICAgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFhfUmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBDQVJEOCAgICAgICAgIHBhZDA7Ci0gIENBUkQxNiAgICAgICAgc2VxdWVuY2VOdW1iZXI7Ci0gIENBUkQzMiAgICAgICAgbGVuZ3RoOwotICBDQVJEMzIgICAgICAgIG52aWV3czsKLSAgQ0FSRDMyICAgICAgICBwYWQxOwotICBDQVJEMzIgICAgICAgIHBhZDI7Ci0gIENBUkQzMiAgICAgICAgcGFkMzsKLSAgQ0FSRDMyICAgICAgICBwYWQ0OwotICBDQVJEMzIgICAgICAgIHBhZDU7Ci19IHhYaUdNaXNjUXVlcnlWaWV3c1JlcGx5OwotCi10eXBlZGVmIHN0cnVjdCB7ICAgICAgICAKLSAgQllURSAgICAgICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiBYX1JlcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQ0FSRDggICAgICAgICBwYWQwOwotICBDQVJEMTYgICAgICAgIHNlcXVlbmNlTnVtYmVyOwotICBDQVJEMzIgICAgICAgIGxlbmd0aDsKLSAgQ0FSRDE2ICAgICAgICBhY3RpdmU7Ci0gIENBUkQxNiAgICAgICAgbnJlc29sdXRpb25zOwotICBDQVJEMzIgICAgICAgIHBhZDE7Ci0gIENBUkQzMiAgICAgICAgcGFkMjsKLSAgQ0FSRDMyICAgICAgICBwYWQzOwotICBDQVJEMzIgICAgICAgIHBhZDQ7Ci0gIENBUkQzMiAgICAgICAgcGFkNTsKLX0geFhpR01pc2NRdWVyeVJlc29sdXRpb25zUmVwbHk7Ci0KLXR5cGVkZWYgc3RydWN0IHsgICAgICAgIAotICBCWVRFICAgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFhfUmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBCT09MICAgICAgICAgIHN1Y2Nlc3M7Ci0gIENBUkQxNiAgICAgICAgc2VxdWVuY2VOdW1iZXI7Ci0gIENBUkQzMiAgICAgICAgbGVuZ3RoOwotICBDQVJEMzIgICAgICAgIHBhZDE7Ci0gIENBUkQzMiAgICAgICAgcGFkMjsKLSAgQ0FSRDMyICAgICAgICBwYWQzOwotICBDQVJEMzIgICAgICAgIHBhZDQ7Ci0gIENBUkQzMiAgICAgICAgcGFkNTsKLSAgQ0FSRDMyICAgICAgICBwYWQ2OwotfSB4WGlHTWlzY0Z1bGxTY3JlZW5SZXBseTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IHsgICAgICAgIAotICBJTlQxNgkJeDsKLSAgSU5UMTYJCXk7Ci0gIENBUkQxNgl3OwotICBDQVJEMTYJaDsKLX0gWGlHTWlzY1ZpZXdJbmZvOwotCi10eXBlZGVmIHN0cnVjdCB7ICAgICAgICAKLSAgQ0FSRDE2ICAgICAgICB3aWR0aDsKLSAgQ0FSRDE2ICAgICAgICBoZWlnaHQ7Ci0gIElOVDMyICAgICAgICAgcmVmcmVzaDsKLX0gWGlHTWlzY1Jlc29sdXRpb25JbmZvOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBYRXh0ZW5zaW9uSW5mbyAqeGlnbWlzY19pbmZvID0gTlVMTDsKLXN0YXRpYyBjaGFyICp4aWdtaXNjX2V4dGVuc2lvbl9uYW1lID0gWElHTUlTQ19QUk9UT0NPTF9OQU1FOwotCi0jZGVmaW5lIFhpR01pc2NDaGVja0V4dGVuc2lvbihkcHksaSx2YWwpIFwKLSAgWGV4dENoZWNrRXh0ZW5zaW9uIChkcHksIGksIHhpZ21pc2NfZXh0ZW5zaW9uX25hbWUsIHZhbCkKLSNkZWZpbmUgWGlHTWlzY1NpbXBsZUNoZWNrRXh0ZW5zaW9uKGRweSxpKSBcCi0gIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpLCB4aWdtaXNjX2V4dGVuc2lvbl9uYW1lKQotCi0jaWYgZGVmaW5lZChfX1NURENfXykgJiYgIWRlZmluZWQoVU5JWENQUCkKLSNkZWZpbmUgWGlHTWlzY0dldFJlcShuYW1lLHJlcSxpbmZvKSBHZXRSZXEgKG5hbWUsIHJlcSk7IFwKLSAgICAgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsgXAotICAgICAgICByZXEtPnhpZ21pc2NSZXFUeXBlID0gWF8jI25hbWU7Ci0KLSNkZWZpbmUgWGlHTWlzY0dldFJlcUV4dHJhKG5hbWUsbixyZXEsaW5mbykgR2V0UmVxRXh0cmEgKG5hbWUsIG4sIHJlcSk7IFwKLSAgICAgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsgXAotICAgICAgICByZXEtPnhpZ21pY1JlcVR5cGUgPSBYXyMjbmFtZTsKLSNlbHNlCi0jZGVmaW5lIFhpR01pc2NHZXRSZXEobmFtZSxyZXEsaW5mbykgR2V0UmVxIChuYW1lLCByZXEpOyBcCi0gICAgICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7IFwKLSAgICAgICAgcmVxLT54aWdtaXNjUmVxVHlwZSA9IFhfLyoqL25hbWU7Ci0jZGVmaW5lIFhpR01pc2NHZXRSZXFFeHRyYShuYW1lLG4scmVxLGluZm8pIEdldFJlcUV4dHJhIChuYW1lLCBuLCByZXEpOyBcCi0gICAgICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7IFwKLSAgICAgICAgcmVxLT54aWdtaXNjUmVxVHlwZSA9IFhfLyoqL25hbWU7Ci0jZW5kaWYKLQotCi0KLS8qCi0gKiBmaW5kX2Rpc3BsYXkgLSBsb2NhdGUgdGhlIGRpc3BsYXkgaW5mbyBibG9jawotICovCi1zdGF0aWMgaW50IFhpR01pc2NDbG9zZURpc3BsYXkoKTsKLQotc3RhdGljIFhFeHRlbnNpb25Ib29rcyB4aWdtaXNjX2V4dGVuc2lvbl9ob29rcyA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGVfZ2MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5X2djICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmx1c2hfZ2MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVlX2djICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlX2ZvbnQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVlX2ZvbnQgKi8KLSAgICBYaUdNaXNjQ2xvc2VEaXNwbGF5LCAgICAgICAgICAgICAgICAvKiBjbG9zZV9kaXNwbGF5ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2lyZV90b19ldmVudCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW50X3RvX3dpcmUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yX3N0cmluZyAqLwotfTsKLQotCi1zdGF0aWMgWEVYVF9HRU5FUkFURV9DTE9TRV9ESVNQTEFZIChYaUdNaXNjQ2xvc2VEaXNwbGF5LCB4aWdtaXNjX2luZm8pCi0KLXN0YXRpYyBYRVhUX0dFTkVSQVRFX0ZJTkRfRElTUExBWSAoWGlHTWlzY0ZpbmREaXNwbGF5LCB4aWdtaXNjX2luZm8sCi0JCQkJICAgeGlnbWlzY19leHRlbnNpb25fbmFtZSwgCi0JCQkJICAgJnhpZ21pc2NfZXh0ZW5zaW9uX2hvb2tzLCBYaUdNaXNjTnVtYmVyRXZlbnRzLCBOVUxMKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQm9vbCBYaUdNaXNjUXVlcnlWZXJzaW9uKERpc3BsYXkgKmRweSwgaW50ICptYWpvciwgaW50ICptaW5vcikKLXsKLSAgaW50IG9wY29kZSwgZXZlbnQsIGVycm9yOwotICB4WGlHTWlzY1F1ZXJ5VmVyc2lvblJlcSAqcmVxOwotICB4WGlHTWlzY1F1ZXJ5VmVyc2lvblJlcGx5IHJlcDsKLSAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gWGlHTWlzY0ZpbmREaXNwbGF5KGRweSk7Ci0KLSAgaWYgKCFYUXVlcnlFeHRlbnNpb24oZHB5LCBYSUdNSVNDX1BST1RPQ09MX05BTUUsICZvcGNvZGUsICZldmVudCwgJmVycm9yKSkKLSAgICByZXR1cm4geEZhbHNlOwotCi0gIFhpR01pc2NDaGVja0V4dGVuc2lvbihkcHksIGluZm8sIHhGYWxzZSk7Ci0KLSAgTG9ja0Rpc3BsYXkgKGRweSk7Ci0gIFhpR01pc2NHZXRSZXEgKFhpR01pc2NRdWVyeVZlcnNpb24sIHJlcSwgaW5mbyk7Ci0KLSAgcmVxLT5tYWpvciA9IFhJR01JU0NfTUFKT1JfVkVSU0lPTjsKLSAgcmVxLT5taW5vciA9IFhJR01JU0NfTUlOT1JfVkVSU0lPTjsKLQotICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhUcnVlKSkgewotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIHhGYWxzZTsKLSAgfQotCi0gICptYWpvciA9IHJlcC5tYWpvcjsKLSAgKm1pbm9yID0gcmVwLm1pbm9yOwotICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gIFN5bmNIYW5kbGUoKTsKLQotICByZXR1cm4geFRydWU7Ci19Ci0KLWludCBYaUdNaXNjUXVlcnlWaWV3cyhEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIFhpR01pc2NWaWV3SW5mbyAqKnB2aWV3cykKLXsKLSAgaW50IG4sIHNpemU7Ci0gIFhpR01pc2NWaWV3SW5mbyAqdmlld3M7Ci0gIHhYaUdNaXNjUXVlcnlWaWV3c1JlcSAqcmVxOwotICB4WGlHTWlzY1F1ZXJ5Vmlld3NSZXBseSByZXA7Ci0gIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFhpR01pc2NGaW5kRGlzcGxheShkcHkpOwotICBYaUdNaXNjQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvLCAwKTsKLQotICBMb2NrRGlzcGxheSAoZHB5KTsKLSAgWGlHTWlzY0dldFJlcSAoWGlHTWlzY1F1ZXJ5Vmlld3MsIHJlcSwgaW5mbyk7Ci0gIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotCi0gIGlmICghX1hSZXBseSAoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgewotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBuID0gcmVwLm52aWV3czsKLQotICBpZiAobiA+IDApIHsKLSAgICBzaXplID0gc2l6ZW9mKFhpR01pc2NWaWV3SW5mbykgKiBuOwotICAgIHZpZXdzID0gKFhpR01pc2NWaWV3SW5mbyopWG1hbGxvYyhzaXplKTsKLSAgICBpZiAoIXZpZXdzKSB7Ci0gICAgICBfWEVhdERhdGEoZHB5LCAodW5zaWduZWQgbG9uZylzaXplKTsKLSAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICAgIFN5bmNIYW5kbGUoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIF9YUmVhZFBhZChkcHksICh2b2lkKil2aWV3cywgc2l6ZSk7Ci0KLSAgICAqcHZpZXdzID0gdmlld3M7Ci0gIH0KLQotICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gIFN5bmNIYW5kbGUoKTsKLQotICByZXR1cm4gbjsKLX0KLQotaW50IFhpR01pc2NRdWVyeVJlc29sdXRpb25zKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50IHZpZXcsIGludCAqcGFjdGl2ZSwgWGlHTWlzY1Jlc29sdXRpb25JbmZvICoqcHJlc29sdXRpb25zKQotewotICBpbnQgbiwgc2l6ZTsKLSAgWGlHTWlzY1Jlc29sdXRpb25JbmZvICpyZXNvbHV0aW9uczsKLSAgeFhpR01pc2NRdWVyeVJlc29sdXRpb25zUmVxICpyZXE7Ci0gIHhYaUdNaXNjUXVlcnlSZXNvbHV0aW9uc1JlcGx5IHJlcDsKLSAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gWGlHTWlzY0ZpbmREaXNwbGF5KGRweSk7Ci0gIFhpR01pc2NDaGVja0V4dGVuc2lvbihkcHksIGluZm8sIDApOwotCi0gIExvY2tEaXNwbGF5IChkcHkpOwotICBYaUdNaXNjR2V0UmVxIChYaUdNaXNjUXVlcnlSZXNvbHV0aW9ucywgcmVxLCBpbmZvKTsKLSAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gIHJlcS0+dmlldyAgID0gdmlldzsKLQotICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgbiA9IHJlcC5ucmVzb2x1dGlvbnM7Ci0KLSAgaWYgKG4gPiAwKSB7Ci0gICAgc2l6ZSA9IHNpemVvZihYaUdNaXNjUmVzb2x1dGlvbkluZm8pICogbjsKLSAgICByZXNvbHV0aW9ucyA9IChYaUdNaXNjUmVzb2x1dGlvbkluZm8qKVhtYWxsb2Moc2l6ZSk7Ci0gICAgaWYgKCFyZXNvbHV0aW9ucykgewotICAgICAgX1hFYXREYXRhKGRweSwgKHVuc2lnbmVkIGxvbmcpc2l6ZSk7Ci0gICAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgICBTeW5jSGFuZGxlKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBfWFJlYWRQYWQoZHB5LCAodm9pZCopcmVzb2x1dGlvbnMsIHNpemUpOwotCi0gICAgKnByZXNvbHV0aW9ucyA9IHJlc29sdXRpb25zOwotICAgICpwYWN0aXZlID0gcmVwLmFjdGl2ZTsKLSAgfQotCi0gIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgU3luY0hhbmRsZSgpOwotCi0gIHJldHVybiBuOwotfQotCi12b2lkIFhpR01pc2NDaGFuZ2VSZXNvbHV0aW9uKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHJlZnJlc2gpCi17Ci0gIHhYaUdNaXNjQ2hhbmdlUmVzb2x1dGlvblJlcSAqcmVxOwotICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBYaUdNaXNjRmluZERpc3BsYXkoZHB5KTsKLQotICBYaUdNaXNjU2ltcGxlQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvKTsKLQotICBMb2NrRGlzcGxheSAoZHB5KTsKLSAgWGlHTWlzY0dldFJlcSAoWGlHTWlzY0NoYW5nZVJlc29sdXRpb24sIHJlcSwgaW5mbyk7Ci0gIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICByZXEtPnZpZXcgPSB2aWV3OwotICByZXEtPndpZHRoID0gd2lkdGg7Ci0gIHJlcS0+aGVpZ2h0ID0gaGVpZ2h0OwotICByZXEtPnJlZnJlc2ggPSByZWZyZXNoOwotCi0gIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgU3luY0hhbmRsZSgpOwotfQotCi0KLUJvb2wgWGlHTWlzY0Z1bGxTY3JlZW4oRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBYSUQgd2luZG93LCBYSUQgY21hcCkKLXsKLSAgeFhpR01pc2NGdWxsU2NyZWVuUmVxICpyZXE7Ci0gIHhYaUdNaXNjRnVsbFNjcmVlblJlcGx5IHJlcDsKLSAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gWGlHTWlzY0ZpbmREaXNwbGF5KGRweSk7Ci0KLSAgWGlHTWlzY0NoZWNrRXh0ZW5zaW9uKGRweSwgaW5mbywgeEZhbHNlKTsKLQotICBMb2NrRGlzcGxheSAoZHB5KTsKLSAgWGlHTWlzY0dldFJlcSAoWGlHTWlzY0Z1bGxTY3JlZW4sIHJlcSwgaW5mbyk7Ci0gIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICByZXEtPnBhZDAgPSAwOwotICByZXEtPnBhZDEgPSAwOwotICByZXEtPndpbmRvdyA9IHdpbmRvdzsKLSAgcmVxLT5jbWFwID0gY21hcDsKLQotICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhUcnVlKSkgewotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIHhGYWxzZTsKLSAgfQotCi0gIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgU3luY0hhbmRsZSgpOwotCi0gIHJldHVybiAocmVwLnN1Y2Nlc3MgPyB4VHJ1ZSA6IHhGYWxzZSk7Ci19Ci0KLQotLyogU0RMIGFkZGl0aW9uIGZyb20gUnlhbjogZnJlZSBtZW1vcnkgdXNlZCBieSB4bWUuICovCi12b2lkIFhpR01pc2NEZXN0cm95KHZvaWQpCi17Ci0gICAgaWYgKHhpZ21pc2NfaW5mbykgewotICAgICAgICBYZXh0RGVzdHJveUV4dGVuc2lvbih4aWdtaXNjX2luZm8pOwotICAgICAgICB4aWdtaXNjX2luZm8gPSBOVUxMOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L1hpbmVyYW1hL1hpbmVyYW1hLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWGluZXJhbWEvWGluZXJhbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5YmU0NS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWGluZXJhbWEvWGluZXJhbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKiAkWG9yZzogWFBhbm9yYW1pWC5jLHYgMS40IDIwMDAvMDgvMTcgMTk6NDU6NTEgY3BxYmxkIEV4cCAkICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUNvcHlyaWdodCAoYykgMTk5MSwgMTk5NyBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMsIElOQ0xVRElORywKLUJVVCBOT1QgTElNSVRFRCBUTyBDT05TRVFVRU5USUFMIE9SIElOQ0lERU5UQUwgREFNQUdFUywgT1IgT1RIRVIgTElBQklMSVRZLAotV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUgotSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24KLXNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIKLWRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBEaWdpdGFsCi1FcXVpcG1lbnQgQ29ycG9yYXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAkWEZyZWU4NjogeGMvbGliL1hpbmVyYW1hL1hpbmVyYW1hLmMsdiAxLjIgMjAwMS8wNy8yMyAxNzoyMDoyOCBkYXdlcyBFeHAgJCAqLwotCi0jZGVmaW5lIE5FRURfRVZFTlRTCi0jZGVmaW5lIE5FRURfUkVQTElFUwotCi0jaW5jbHVkZSA8WDExL1hsaWJpbnQuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLSNpbmNsdWRlICIuLi9leHRlbnNpb25zL1hleHQuaCIKLSNpbmNsdWRlICIuLi9leHRlbnNpb25zL2V4dHV0aWwuaCIJCQkvKiBpbiAuLi9pbmNsdWRlICovCi0jaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy9wYW5vcmFtaVhleHQuaCIKLSNpbmNsdWRlICIuLi9leHRlbnNpb25zL3Bhbm9yYW1pWHByb3RvLmgiCQkvKiBpbiAuLi9pbmNsdWRlICovCi0jaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy9YaW5lcmFtYS5oIgotCi1zdGF0aWMgWEV4dGVuc2lvbkluZm8gX3Bhbm9yYW1pWF9leHRfaW5mb19kYXRhOwotc3RhdGljIFhFeHRlbnNpb25JbmZvICpwYW5vcmFtaVhfZXh0X2luZm8gPSAmX3Bhbm9yYW1pWF9leHRfaW5mb19kYXRhOwotc3RhdGljIC8qIGNvbnN0ICovIGNoYXIgKnBhbm9yYW1pWF9leHRlbnNpb25fbmFtZSA9IFBBTk9SQU1JWF9QUk9UT0NPTF9OQU1FOwotCi0jZGVmaW5lIFBhbm9yYW1pWENoZWNrRXh0ZW5zaW9uKGRweSxpLHZhbCkgXAotICBYZXh0Q2hlY2tFeHRlbnNpb24gKGRweSwgaSwgcGFub3JhbWlYX2V4dGVuc2lvbl9uYW1lLCB2YWwpCi0jZGVmaW5lIFBhbm9yYW1pWFNpbXBsZUNoZWNrRXh0ZW5zaW9uKGRweSxpKSBcCi0gIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpLCBwYW5vcmFtaVhfZXh0ZW5zaW9uX25hbWUpCi0KLXN0YXRpYyBpbnQgY2xvc2VfZGlzcGxheSgpOwotc3RhdGljIC8qIGNvbnN0ICovIFhFeHRlbnNpb25Ib29rcyBwYW5vcmFtaVhfZXh0ZW5zaW9uX2hvb2tzID0gewotICAgIE5VTEwsCQkJCS8qIGNyZWF0ZV9nYyAqLwotICAgIE5VTEwsCQkJCS8qIGNvcHlfZ2MgKi8KLSAgICBOVUxMLAkJCQkvKiBmbHVzaF9nYyAqLwotICAgIE5VTEwsCQkJCS8qIGZyZWVfZ2MgKi8KLSAgICBOVUxMLAkJCQkvKiBjcmVhdGVfZm9udCAqLwotICAgIE5VTEwsCQkJCS8qIGZyZWVfZm9udCAqLwotICAgIGNsb3NlX2Rpc3BsYXksCQkJLyogY2xvc2VfZGlzcGxheSAqLwotICAgIE5VTEwsCQkJCS8qIHdpcmVfdG9fZXZlbnQgKi8KLSAgICBOVUxMLAkJCQkvKiBldmVudF90b193aXJlICovCi0gICAgTlVMTCwJCQkJLyogZXJyb3IgKi8KLSAgICBOVUxMLAkJCQkvKiBlcnJvcl9zdHJpbmcgKi8KLX07Ci0KLXN0YXRpYyBYRVhUX0dFTkVSQVRFX0ZJTkRfRElTUExBWSAoZmluZF9kaXNwbGF5LCBwYW5vcmFtaVhfZXh0X2luZm8sCi0JCQkJICAgcGFub3JhbWlYX2V4dGVuc2lvbl9uYW1lLCAKLQkJCQkgICAmcGFub3JhbWlYX2V4dGVuc2lvbl9ob29rcywKLQkJCQkgICAwLCBOVUxMKQotCi1zdGF0aWMgWEVYVF9HRU5FUkFURV9DTE9TRV9ESVNQTEFZIChjbG9zZV9kaXNwbGF5LCBwYW5vcmFtaVhfZXh0X2luZm8pCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqCQkJICAgIFBhbm9yYW1pWCBwdWJsaWMgaW50ZXJmYWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUJvb2wgU0RMX05BTUUoWFBhbm9yYW1pWFF1ZXJ5RXh0ZW5zaW9uKSAoCi0gICAgRGlzcGxheSAqZHB5LAotICAgIGludCAqZXZlbnRfYmFzZXAsCi0gICAgaW50ICplcnJvcl9iYXNlcAotKQotewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKLQotICAgIGlmIChYZXh0SGFzRXh0ZW5zaW9uKGluZm8pKSB7Ci0JKmV2ZW50X2Jhc2VwID0gaW5mby0+Y29kZXMtPmZpcnN0X2V2ZW50OwotCSplcnJvcl9iYXNlcCA9IGluZm8tPmNvZGVzLT5maXJzdF9lcnJvcjsKLQlyZXR1cm4gVHJ1ZTsKLSAgICB9IGVsc2UgewotCXJldHVybiBGYWxzZTsKLSAgICB9Ci19Ci0KLQotU3RhdHVzIFNETF9OQU1FKFhQYW5vcmFtaVhRdWVyeVZlcnNpb24pKAotICAgIERpc3BsYXkgKmRweSwKLSAgICBpbnQJICAgICptYWpvcl92ZXJzaW9ucCwgCi0gICAgaW50ICptaW5vcl92ZXJzaW9ucAotKQotewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKLSAgICB4UGFub3JhbWlYUXVlcnlWZXJzaW9uUmVwbHkJICAgIHJlcDsKLSAgICByZWdpc3RlciB4UGFub3JhbWlYUXVlcnlWZXJzaW9uUmVxICAqcmVxOwotCi0gICAgUGFub3JhbWlYQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgMCk7Ci0KLSAgICBMb2NrRGlzcGxheSAoZHB5KTsKLSAgICBHZXRSZXEgKFBhbm9yYW1pWFF1ZXJ5VmVyc2lvbiwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+cGFub3JhbWlYUmVxVHlwZSA9IFhfUGFub3JhbWlYUXVlcnlWZXJzaW9uOwotICAgIHJlcS0+Y2xpZW50TWFqb3IgPSBQQU5PUkFNSVhfTUFKT1JfVkVSU0lPTjsKLSAgICByZXEtPmNsaWVudE1pbm9yID0gUEFOT1JBTUlYX01JTk9SX1ZFUlNJT047Ci0gICAgaWYgKCFfWFJlcGx5IChkcHksICh4UmVwbHkgKikgJnJlcCwgMCwgeFRydWUpKSB7Ci0JVW5sb2NrRGlzcGxheSAoZHB5KTsKLQlTeW5jSGFuZGxlICgpOwotCXJldHVybiAwOwotICAgIH0KLSAgICAqbWFqb3JfdmVyc2lvbnAgPSByZXAubWFqb3JWZXJzaW9uOwotICAgICptaW5vcl92ZXJzaW9ucCA9IHJlcC5taW5vclZlcnNpb247Ci0gICAgVW5sb2NrRGlzcGxheSAoZHB5KTsKLSAgICBTeW5jSGFuZGxlICgpOwotICAgIHJldHVybiAxOwotfQotCi1TRExfTkFNRShYUGFub3JhbWlYSW5mbykgKlNETF9OQU1FKFhQYW5vcmFtaVhBbGxvY0luZm8pKHZvaWQpCi17Ci0JcmV0dXJuIChTRExfTkFNRShYUGFub3JhbWlYSW5mbykgKikgWG1hbGxvYyAoc2l6ZW9mIChTRExfTkFNRShYUGFub3JhbWlYSW5mbykpKTsKLX0KLQotU3RhdHVzIFNETF9OQU1FKFhQYW5vcmFtaVhHZXRTdGF0ZSkgKAotICAgIERpc3BsYXkJCSpkcHksCi0gICAgRHJhd2FibGUJCWRyYXdhYmxlLAotICAgIFNETF9OQU1FKFhQYW5vcmFtaVhJbmZvKQkqcGFub3JhbWlYX2luZm8KLSkKLXsKLSAgICBYRXh0RGlzcGxheUluZm8JCQkqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKLSAgICB4UGFub3JhbWlYR2V0U3RhdGVSZXBseQlyZXA7Ci0gICAgcmVnaXN0ZXIgeFBhbm9yYW1pWEdldFN0YXRlUmVxCSpyZXE7Ci0KLSAgICBQYW5vcmFtaVhDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCAwKTsKLQotICAgIExvY2tEaXNwbGF5IChkcHkpOwotICAgIEdldFJlcSAoUGFub3JhbWlYR2V0U3RhdGUsIHJlcSk7Ci0gICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLSAgICByZXEtPnBhbm9yYW1pWFJlcVR5cGUgPSBYX1Bhbm9yYW1pWEdldFN0YXRlOwotICAgIHJlcS0+d2luZG93ID0gZHJhd2FibGU7Ci0gICAgaWYgKCFfWFJlcGx5IChkcHksICh4UmVwbHkgKikgJnJlcCwgMCwgeFRydWUpKSB7Ci0JVW5sb2NrRGlzcGxheSAoZHB5KTsKLQlTeW5jSGFuZGxlICgpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBVbmxvY2tEaXNwbGF5IChkcHkpOwotICAgIFN5bmNIYW5kbGUgKCk7Ci0gICAgcGFub3JhbWlYX2luZm8tPndpbmRvdyA9IHJlcC53aW5kb3c7Ci0gICAgcGFub3JhbWlYX2luZm8tPlN0YXRlID0gcmVwLnN0YXRlOwotICAgIHJldHVybiAxOwotfQotCi1TdGF0dXMgU0RMX05BTUUoWFBhbm9yYW1pWEdldFNjcmVlbkNvdW50KSAoCi0gICAgRGlzcGxheQkJKmRweSwKLSAgICBEcmF3YWJsZQkJZHJhd2FibGUsCi0gICAgU0RMX05BTUUoWFBhbm9yYW1pWEluZm8pCSpwYW5vcmFtaVhfaW5mbwotKQotewotICAgIFhFeHREaXNwbGF5SW5mbwkJCSppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOwotICAgIHhQYW5vcmFtaVhHZXRTY3JlZW5Db3VudFJlcGx5CXJlcDsKLSAgICByZWdpc3RlciB4UGFub3JhbWlYR2V0U2NyZWVuQ291bnRSZXEJKnJlcTsKLQotICAgIFBhbm9yYW1pWENoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIDApOwotCi0gICAgTG9ja0Rpc3BsYXkgKGRweSk7Ci0gICAgR2V0UmVxIChQYW5vcmFtaVhHZXRTY3JlZW5Db3VudCwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+cGFub3JhbWlYUmVxVHlwZSA9IFhfUGFub3JhbWlYR2V0U2NyZWVuQ291bnQ7Ci0gICAgcmVxLT53aW5kb3cgPSBkcmF3YWJsZTsKLSAgICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSAmcmVwLCAwLCB4VHJ1ZSkpIHsKLQlVbmxvY2tEaXNwbGF5IChkcHkpOwotCVN5bmNIYW5kbGUgKCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7Ci0gICAgU3luY0hhbmRsZSAoKTsKLSAgICBwYW5vcmFtaVhfaW5mby0+d2luZG93ID0gcmVwLndpbmRvdzsKLSAgICBwYW5vcmFtaVhfaW5mby0+U2NyZWVuQ291bnQgPSByZXAuU2NyZWVuQ291bnQ7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLVN0YXR1cyBTRExfTkFNRShYUGFub3JhbWlYR2V0U2NyZWVuU2l6ZSkgKAotICAgIERpc3BsYXkJCSpkcHksCi0gICAgRHJhd2FibGUJCWRyYXdhYmxlLAotICAgIGludAkJCXNjcmVlbl9udW0sCi0gICAgU0RMX05BTUUoWFBhbm9yYW1pWEluZm8pCSpwYW5vcmFtaVhfaW5mbwotKQotewotICAgIFhFeHREaXNwbGF5SW5mbwkJCSppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOwotICAgIHhQYW5vcmFtaVhHZXRTY3JlZW5TaXplUmVwbHkJcmVwOwotICAgIHJlZ2lzdGVyIHhQYW5vcmFtaVhHZXRTY3JlZW5TaXplUmVxCSpyZXE7Ci0KLSAgICBQYW5vcmFtaVhDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCAwKTsKLQotICAgIExvY2tEaXNwbGF5IChkcHkpOwotICAgIEdldFJlcSAoUGFub3JhbWlYR2V0U2NyZWVuU2l6ZSwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+cGFub3JhbWlYUmVxVHlwZSA9IFhfUGFub3JhbWlYR2V0U2NyZWVuU2l6ZTsKLSAgICByZXEtPndpbmRvdyA9IGRyYXdhYmxlOwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuX251bTsJCQkvKiBuZWVkIHRvIGRlZmluZSAqLyAKLSAgICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSAmcmVwLCAwLCB4VHJ1ZSkpIHsKLQlVbmxvY2tEaXNwbGF5IChkcHkpOwotCVN5bmNIYW5kbGUgKCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7Ci0gICAgU3luY0hhbmRsZSAoKTsKLSAgICBwYW5vcmFtaVhfaW5mby0+d2luZG93ID0gcmVwLndpbmRvdzsKLSAgICBwYW5vcmFtaVhfaW5mby0+c2NyZWVuID0gcmVwLnNjcmVlbjsKLSAgICBwYW5vcmFtaVhfaW5mby0+d2lkdGggPSAgcmVwLndpZHRoOwotICAgIHBhbm9yYW1pWF9pbmZvLT5oZWlnaHQgPSByZXAuaGVpZ2h0OwotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAgQWx0ZXJuYXRlIGludGVyZmFjZSB0byBtYWtlIHVwIGZvciBzaG9ydGNvbWluZ3MgaW4gdGhlIG9yaWdpbmFsLAotICBuYW1lbHksIHRoZSBvbWlzc2lvbiBvZiB0aGUgc2NyZWVuIG9yaWdpbi4gIFRoZSBuZXcgaW50ZXJmYWNlIGlzCi0gIGluIHRoZSAiWGluZXJhbWEiIG5hbWVzcGFjZSBpbnN0ZWFkIG9mICJQYW5vcmFtaVgiLgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUJvb2wgU0RMX05BTUUoWGluZXJhbWFRdWVyeUV4dGVuc2lvbikgKAotICAgRGlzcGxheSAqZHB5LAotICAgaW50ICAgICAqZXZlbnRfYmFzZSwKLSAgIGludCAgICAgKmVycm9yX2Jhc2UKLSkKLXsKLSAgIHJldHVybiBTRExfTkFNRShYUGFub3JhbWlYUXVlcnlFeHRlbnNpb24pKGRweSwgZXZlbnRfYmFzZSwgZXJyb3JfYmFzZSk7Ci19Ci0KLVN0YXR1cyBTRExfTkFNRShYaW5lcmFtYVF1ZXJ5VmVyc2lvbikoCi0gICBEaXNwbGF5ICpkcHksCi0gICBpbnQgICAgICptYWpvciwKLSAgIGludCAgICAgKm1pbm9yCi0pCi17Ci0gICByZXR1cm4gU0RMX05BTUUoWFBhbm9yYW1pWFF1ZXJ5VmVyc2lvbikoZHB5LCBtYWpvciwgbWlub3IpOwotfQotCi1Cb29sIFNETF9OQU1FKFhpbmVyYW1hSXNBY3RpdmUpKERpc3BsYXkgKmRweSkKLXsKLSAgICB4WGluZXJhbWFJc0FjdGl2ZVJlcGx5CXJlcDsKLSAgICB4WGluZXJhbWFJc0FjdGl2ZVJlcSAgCSpyZXE7Ci0gICAgWEV4dERpc3BsYXlJbmZvIAkJKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0KLSAgICBpZighWGV4dEhhc0V4dGVuc2lvbihpbmZvKSkKLQlyZXR1cm4gRmFsc2U7ICAvKiBzZXJ2ZXIgZG9lc24ndCBldmVuIGhhdmUgdGhlIGV4dGVuc2lvbiAqLwotCi0gICAgTG9ja0Rpc3BsYXkgKGRweSk7Ci0gICAgR2V0UmVxIChYaW5lcmFtYUlzQWN0aXZlLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5wYW5vcmFtaVhSZXFUeXBlID0gWF9YaW5lcmFtYUlzQWN0aXZlOwotICAgIGlmICghX1hSZXBseSAoZHB5LCAoeFJlcGx5ICopICZyZXAsIDAsIHhUcnVlKSkgewotCVVubG9ja0Rpc3BsYXkgKGRweSk7Ci0JU3luY0hhbmRsZSAoKTsKLQlyZXR1cm4gRmFsc2U7Ci0gICAgfQotICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7Ci0gICAgU3luY0hhbmRsZSAoKTsKLSAgICByZXR1cm4gcmVwLnN0YXRlOwotfQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotU0RMX05BTUUoWGluZXJhbWFTY3JlZW5JbmZvKSAqIAotU0RMX05BTUUoWGluZXJhbWFRdWVyeVNjcmVlbnMpKAotICAgRGlzcGxheSAqZHB5LAotICAgaW50ICAgICAqbnVtYmVyCi0pCi17Ci0gICAgWEV4dERpc3BsYXlJbmZvCQkqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKLSAgICB4WGluZXJhbWFRdWVyeVNjcmVlbnNSZXBseQlyZXA7Ci0gICAgeFhpbmVyYW1hUXVlcnlTY3JlZW5zUmVxCSpyZXE7Ci0gICAgU0RMX05BTUUoWGluZXJhbWFTY3JlZW5JbmZvKQkJKnNjcm5JbmZvID0gTlVMTDsKLQotICAgIFBhbm9yYW1pWENoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIDApOwotCi0gICAgTG9ja0Rpc3BsYXkgKGRweSk7Ci0gICAgR2V0UmVxIChYaW5lcmFtYVF1ZXJ5U2NyZWVucywgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+cGFub3JhbWlYUmVxVHlwZSA9IFhfWGluZXJhbWFRdWVyeVNjcmVlbnM7Ci0gICAgaWYgKCFfWFJlcGx5IChkcHksICh4UmVwbHkgKikgJnJlcCwgMCwgeEZhbHNlKSkgewotCVVubG9ja0Rpc3BsYXkgKGRweSk7Ci0JU3luY0hhbmRsZSAoKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihyZXAubnVtYmVyKSB7Ci0JaWYoKHNjcm5JbmZvID0gWG1hbGxvYyhzaXplb2YoU0RMX05BTUUoWGluZXJhbWFTY3JlZW5JbmZvKSkgKiByZXAubnVtYmVyKSkpIHsKLQkgICAgeFhpbmVyYW1hU2NyZWVuSW5mbyBzY3JhdGNoOwotCSAgICBpbnQgaTsKLQotCSAgICBmb3IoaSA9IDA7IGkgPCByZXAubnVtYmVyOyBpKyspIHsKLQkJX1hSZWFkKGRweSwgKGNoYXIqKSgmc2NyYXRjaCksIHN6X1hpbmVyYW1hU2NyZWVuSW5mbyk7Ci0JCXNjcm5JbmZvW2ldLnNjcmVlbl9udW1iZXIgPSBpOwotCQlzY3JuSW5mb1tpXS54X29yZyAJICA9IHNjcmF0Y2gueF9vcmc7Ci0JCXNjcm5JbmZvW2ldLnlfb3JnIAkgID0gc2NyYXRjaC55X29yZzsKLQkJc2NybkluZm9baV0ud2lkdGggCSAgPSBzY3JhdGNoLndpZHRoOwotCQlzY3JuSW5mb1tpXS5oZWlnaHQgCSAgPSBzY3JhdGNoLmhlaWdodDsKLQkgICAgfQotCi0JICAgICpudW1iZXIgPSByZXAubnVtYmVyOwotCX0gZWxzZQotCSAgICBfWEVhdERhdGEoZHB5LCByZXAubGVuZ3RoIDw8IDIpOwotICAgIH0KLQotICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7Ci0gICAgU3luY0hhbmRsZSAoKTsKLSAgICByZXR1cm4gc2NybkluZm87Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWHYvWHZsaWJpbnQuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9Ydi9YdmxpYmludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJiNzA4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9Ydi9YdmxpYmludC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Db3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cywKLWFuZCB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgQ2FtYnJpZGdlLCBNYXNzYWNodXNldHRzLgotCi0gICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKLWRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCi1wcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCi1zdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBEaWdpdGFsIG9yIE1JVCBub3QgYmUKLXVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQotc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCi0KLURJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwotQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCi1ESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgotQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAotV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAotQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwotU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICRYRnJlZTg2OiB4Yy9saWIvWHYvWHZsaWJpbnQuaCx2IDEuNSAyMDAxLzA3LzI1IDE1OjA0OjUzIGRhd2VzIEV4cCAkICovCi0KLSNpZm5kZWYgWFZMSUJJTlRfSAotI2RlZmluZSBYVkxJQklOVF9ICi0vKgotKiogRmlsZTogCi0qKgotKiogICBYdmxpYmludC5oIC0tLSBYdiBsaWJyYXJ5IGludGVybmFsIGhlYWRlciBmaWxlCi0qKgotKiogQXV0aG9yOiAKLSoqCi0qKiAgIERhdmlkIENhcnZlciAoRGlnaXRhbCBXb3Jrc3RhdGlvbiBFbmdpbmVlcmluZy9Qcm9qZWN0IEF0aGVuYSkKLSoqCi0qKiBSZXZpc2lvbnM6Ci0qKgotKiogICAwMS4yNC45MSBDYXJ2ZXIKLSoqICAgICAtIHZlcnNpb24gMS40IHVwZ3JhZGUKLSoqCi0qLwotCi0jZGVmaW5lIE5FRURfUkVQTElFUwotCi0jaW5jbHVkZSA8WDExL1hsaWJpbnQuaD4KLSNpbmNsdWRlICIuLi9leHRlbnNpb25zL1h2cHJvdG8uaCIKLSNpbmNsdWRlICIuLi9leHRlbnNpb25zL1h2bGliLmgiCi0KLSNpZiAhZGVmaW5lZChVTklYQ1BQKQotI2RlZmluZSBYdkdldFJlcShuYW1lLCByZXEpIFwKLSAgICAgICAgV09SRDY0QUxJR05cCi0JaWYgKChkcHktPmJ1ZnB0ciArIFNJWkVPRih4diMjbmFtZSMjUmVxKSkgPiBkcHktPmJ1Zm1heClcCi0JCV9YRmx1c2goZHB5KTtcCi0JcmVxID0gKHh2IyNuYW1lIyNSZXEgKikoZHB5LT5sYXN0X3JlcSA9IGRweS0+YnVmcHRyKTtcCi0JcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTtcCi0gICAgICAgIHJlcS0+eHZSZXFUeXBlID0geHZfIyNuYW1lOyBcCi0gICAgICAgIHJlcS0+bGVuZ3RoID0gKFNJWkVPRih4diMjbmFtZSMjUmVxKSk+PjI7XAotCWRweS0+YnVmcHRyICs9IFNJWkVPRih4diMjbmFtZSMjUmVxKTtcCi0JZHB5LT5yZXF1ZXN0KysKLQotI2Vsc2UgIC8qIG5vbi1BTlNJIEMgdXNlcyBlbXB0eSBjb21tZW50IGluc3RlYWQgb2YgIiMjIiBmb3IgdG9rZW4gY29uY2F0ZW5hdGlvbiAqLwotI2RlZmluZSBYdkdldFJlcShuYW1lLCByZXEpIFwKLSAgICAgICAgV09SRDY0QUxJR05cCi0JaWYgKChkcHktPmJ1ZnB0ciArIFNJWkVPRih4di8qKi9uYW1lLyoqL1JlcSkpID4gZHB5LT5idWZtYXgpXAotCQlfWEZsdXNoKGRweSk7XAotCXJlcSA9ICh4di8qKi9uYW1lLyoqL1JlcSAqKShkcHktPmxhc3RfcmVxID0gZHB5LT5idWZwdHIpO1wKLQlyZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlO1wKLQlyZXEtPnh2UmVxVHlwZSA9IHh2Xy8qKi9uYW1lO1wKLQlyZXEtPmxlbmd0aCA9IChTSVpFT0YoeHYvKiovbmFtZS8qKi9SZXEpKT4+MjtcCi0JZHB5LT5idWZwdHIgKz0gU0laRU9GKHh2LyoqL25hbWUvKiovUmVxKTtcCi0JZHB5LT5yZXF1ZXN0KysKLSNlbmRpZgotCi0KLSNlbmRpZiAvKiBYVkxJQklOVF9IICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWHhmODZkZ2EvWEY4NkRHQS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L1h4Zjg2ZGdhL1hGODZER0EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhYmJiMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWHhmODZkZ2EvWEY4NkRHQS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qICRYRnJlZTg2OiB4Yy9saWIvWHhmODZkZ2EvWEY4NkRHQS5jLHYgMy4xOSAyMDAxLzA4LzE4IDAyOjQxOjMwIGRhd2VzIEV4cCAkICovCi0vKgotCi1Db3B5cmlnaHQgKGMpIDE5OTUgIEpvbiBUb21icwotQ29weXJpZ2h0IChjKSAxOTk1LDE5OTYgIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYwotCi0qLwotCi0vKiBUSElTIElTIE5PVCBBTiBYIENPTlNPUlRJVU0gU1RBTkRBUkQgKi8KLQotI2lmZGVmIF9fRU1YX18gLyogbmVlZGVkIGhlcmUgdG8gb3ZlcnJpZGUgY2VydGFpbiBjb25zdGFudHMgaW4gWCBoZWFkZXJzICovCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfRE9TSU9DVEwKLSNpbmNsdWRlIDxvczIuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChsaW51eCkKLSNkZWZpbmUgSEFTX01NQVBfQU5PTgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0vKiNpbmNsdWRlIDxhc20vcGFnZS5oPiovICAgLyogUEFHRV9TSVpFICovCi0jZGVmaW5lIEhBU19TQ19QQUdFU0laRSAvKiBfU0NfUEFHRVNJWkUgbWF5IGJlIGFuIGVudW0gZm9yIExpbnV4ICovCi0jZGVmaW5lIEhBU19HRVRQQUdFU0laRQotI2VuZGlmIC8qIGxpbnV4ICovCi0KLSNpZiBkZWZpbmVkKENTUkdfQkFTRUQpCi0jZGVmaW5lIEhBU19NTUFQX0FOT04KLSNkZWZpbmUgSEFTX0dFVFBBR0VTSVpFCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZiAvKiBDU1JHX0JBU0VEICovCi0KLSNpZiBkZWZpbmVkKERHVVgpCi0jZGVmaW5lIEhBU19HRVRQQUdFU0laRQotI2RlZmluZSBNTUFQX0RFVl9aRVJPCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAvKiBER1VYICovCi0KLSNpZiBkZWZpbmVkKFNWUjQpICYmICFkZWZpbmVkKERHVVgpCi0jZGVmaW5lIE1NQVBfREVWX1pFUk8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIFNWUjQgJiYgIURHVVggKi8KLQotI2lmIGRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChTVlI0KSAvKiBTdW5PUyAqLwotI2RlZmluZSBNTUFQX0RFVl9aRVJPICAgLyogZG9lc24ndCBTdW5PUyBoYXZlIE1BUF9BTk9OID8/ICovCi0jZGVmaW5lIEhBU19HRVRQQUdFU0laRQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jZW5kaWYgLyogc3VuICYmICFTVlI0ICovCi0KLSNpZmRlZiBYTk9fU1lTQ09ORgotI3VuZGVmIF9TQ19QQUdFU0laRQotI2VuZGlmCi0KLSNkZWZpbmUgTkVFRF9FVkVOVFMKLSNkZWZpbmUgTkVFRF9SRVBMSUVTCi0KLSNpbmNsdWRlIDxYMTEvWGxpYmludC5oPgotI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMveGY4NmRnYS5oIgotI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMveGY4NmRnYXN0ci5oIgotI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMvWGV4dC5oIgotI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMvZXh0dXRpbC5oIgotCi1leHRlcm4gWEV4dERpc3BsYXlJbmZvKiBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkoRGlzcGxheSopOwotZXh0ZXJuIGNoYXIgKlNETF9OQU1FKHhkZ2FfZXh0ZW5zaW9uX25hbWUpOwotCi0jZGVmaW5lIFhGODZER0FDaGVja0V4dGVuc2lvbihkcHksaSx2YWwpIFwKLSAgWGV4dENoZWNrRXh0ZW5zaW9uIChkcHksIGksIFNETF9OQU1FKHhkZ2FfZXh0ZW5zaW9uX25hbWUpLCB2YWwpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKgkJICAgIHB1YmxpYyBYRnJlZTg2LURHQSBFeHRlbnNpb24gcm91dGluZXMgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1Cb29sIFNETF9OQU1FKFhGODZER0FRdWVyeUV4dGVuc2lvbikgKAotICAgIERpc3BsYXkgKmRweSwKLSAgICBpbnQgKmV2ZW50X2Jhc2VwLAotICAgIGludCAqZXJyb3JfYmFzZXAKLSl7Ci0gICAgcmV0dXJuIFNETF9OQU1FKFhER0FRdWVyeUV4dGVuc2lvbikoZHB5LCBldmVudF9iYXNlcCwgZXJyb3JfYmFzZXApOwotfQotCi1Cb29sIFNETF9OQU1FKFhGODZER0FRdWVyeVZlcnNpb24pKAotICAgIERpc3BsYXkqIGRweSwKLSAgICBpbnQqIG1ham9yVmVyc2lvbiwgCi0gICAgaW50KiBtaW5vclZlcnNpb24KLSl7Ci0gICAgcmV0dXJuIFNETF9OQU1FKFhER0FRdWVyeVZlcnNpb24pKGRweSwgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb24pOwotfQotCi1Cb29sIFNETF9OQU1FKFhGODZER0FHZXRWaWRlb0xMKSgKLSAgICBEaXNwbGF5KiBkcHksCi0gICAgaW50IHNjcmVlbiwKLSAgICBpbnQgKm9mZnNldCwKLSAgICBpbnQgKndpZHRoLCAKLSAgICBpbnQgKmJhbmtfc2l6ZSwgCi0gICAgaW50ICpyYW1fc2l6ZQotKXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhGODZER0FHZXRWaWRlb0xMUmVwbHkgcmVwOwotICAgIHhYRjg2REdBR2V0VmlkZW9MTFJlcSAqcmVxOwotCi0gICAgWEY4NkRHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgR2V0UmVxKFhGODZER0FHZXRWaWRlb0xMLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YRjg2REdBR2V0VmlkZW9MTDsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgewotCVVubG9ja0Rpc3BsYXkoZHB5KTsKLQlTeW5jSGFuZGxlKCk7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLQotICAgICpvZmZzZXQgPSAvKihjaGFyICopKi9yZXAub2Zmc2V0OwotICAgICp3aWR0aCA9IHJlcC53aWR0aDsKLSAgICAqYmFua19zaXplID0gcmVwLmJhbmtfc2l6ZTsKLSAgICAqcmFtX3NpemUgPSByZXAucmFtX3NpemU7Ci0JCi0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLSAgICByZXR1cm4gVHJ1ZTsKLX0KLQotICAgIAotQm9vbCBTRExfTkFNRShYRjg2REdBRGlyZWN0VmlkZW9MTCkoCi0gICAgRGlzcGxheSogZHB5LAotICAgIGludCBzY3JlZW4sCi0gICAgaW50IGVuYWJsZQotKXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhGODZER0FEaXJlY3RWaWRlb1JlcSAqcmVxOwotCi0gICAgWEY4NkRHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgR2V0UmVxKFhGODZER0FEaXJlY3RWaWRlbywgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWEY4NkRHQURpcmVjdFZpZGVvOwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICAgIHJlcS0+ZW5hYmxlID0gZW5hYmxlOwotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgWFN5bmMoZHB5LEZhbHNlKTsKLSAgICByZXR1cm4gVHJ1ZTsKLX0KLQotQm9vbCBTRExfTkFNRShYRjg2REdBR2V0Vmlld1BvcnRTaXplKSgKLSAgICBEaXNwbGF5KiBkcHksCi0gICAgaW50IHNjcmVlbiwKLSAgICBpbnQgKndpZHRoLCAKLSAgICBpbnQgKmhlaWdodAotKXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhGODZER0FHZXRWaWV3UG9ydFNpemVSZXBseSByZXA7Ci0gICAgeFhGODZER0FHZXRWaWV3UG9ydFNpemVSZXEgKnJlcTsKLQotICAgIFhGODZER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYRjg2REdBR2V0Vmlld1BvcnRTaXplLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YRjg2REdBR2V0Vmlld1BvcnRTaXplOwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7Ci0JVW5sb2NrRGlzcGxheShkcHkpOwotCVN5bmNIYW5kbGUoKTsKLQlyZXR1cm4gRmFsc2U7Ci0gICAgfQotCi0gICAgKndpZHRoID0gcmVwLndpZHRoOwotICAgICpoZWlnaHQgPSByZXAuaGVpZ2h0OwotCQotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0gICAgCi0gICAgCi1Cb29sIFNETF9OQU1FKFhGODZER0FTZXRWaWV3UG9ydCkoCi0gICAgRGlzcGxheSogZHB5LAotICAgIGludCBzY3JlZW4sCi0gICAgaW50IHgsIAotICAgIGludCB5Ci0pewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKLSAgICB4WEY4NkRHQVNldFZpZXdQb3J0UmVxICpyZXE7Ci0KLSAgICBYRjg2REdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NkRHQVNldFZpZXdQb3J0LCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YRjg2REdBU2V0Vmlld1BvcnQ7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgcmVxLT54ID0geDsKLSAgICByZXEtPnkgPSB5OwotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgWFN5bmMoZHB5LEZhbHNlKTsKLSAgICByZXR1cm4gVHJ1ZTsKLX0KLQotICAgIAotQm9vbCBTRExfTkFNRShYRjg2REdBR2V0VmlkUGFnZSkoCi0gICAgRGlzcGxheSogZHB5LAotICAgIGludCBzY3JlZW4sCi0gICAgaW50ICp2cGFnZQotKXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhGODZER0FHZXRWaWRQYWdlUmVwbHkgcmVwOwotICAgIHhYRjg2REdBR2V0VmlkUGFnZVJlcSAqcmVxOwotCi0gICAgWEY4NkRHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgR2V0UmVxKFhGODZER0FHZXRWaWRQYWdlLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YRjg2REdBR2V0VmlkUGFnZTsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgewotCVVubG9ja0Rpc3BsYXkoZHB5KTsKLQlTeW5jSGFuZGxlKCk7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLQotICAgICp2cGFnZSA9IHJlcC52cGFnZTsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBUcnVlOwotfQotCi0gICAgCi1Cb29sIFNETF9OQU1FKFhGODZER0FTZXRWaWRQYWdlKSgKLSAgICBEaXNwbGF5KiBkcHksCi0gICAgaW50IHNjcmVlbiwKLSAgICBpbnQgdnBhZ2UKLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotICAgIHhYRjg2REdBU2V0VmlkUGFnZVJlcSAqcmVxOwotCi0gICAgWEY4NkRHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgR2V0UmVxKFhGODZER0FTZXRWaWRQYWdlLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YRjg2REdBU2V0VmlkUGFnZTsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICByZXEtPnZwYWdlID0gdnBhZ2U7Ci0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLSAgICBYU3luYyhkcHksRmFsc2UpOwotICAgIHJldHVybiBUcnVlOwotfQotCi1Cb29sIFNETF9OQU1FKFhGODZER0FJbnN0YWxsQ29sb3JtYXApKAotICAgIERpc3BsYXkqIGRweSwKLSAgICBpbnQgc2NyZWVuLAotICAgIENvbG9ybWFwIGNtYXAKLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotICAgIHhYRjg2REdBSW5zdGFsbENvbG9ybWFwUmVxICpyZXE7Ci0KLSAgICBYRjg2REdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NkRHQUluc3RhbGxDb2xvcm1hcCwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWEY4NkRHQUluc3RhbGxDb2xvcm1hcDsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICByZXEtPmlkID0gY21hcDsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIFhTeW5jKGRweSxGYWxzZSk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0KLUJvb2wgU0RMX05BTUUoWEY4NkRHQVF1ZXJ5RGlyZWN0VmlkZW8pKAotICAgIERpc3BsYXkgKmRweSwKLSAgICBpbnQgc2NyZWVuLAotICAgIGludCAqZmxhZ3MKLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotICAgIHhYRjg2REdBUXVlcnlEaXJlY3RWaWRlb1JlcGx5IHJlcDsKLSAgICB4WEY4NkRHQVF1ZXJ5RGlyZWN0VmlkZW9SZXEgKnJlcTsKLQotICAgIFhGODZER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYRjg2REdBUXVlcnlEaXJlY3RWaWRlbywgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWEY4NkRHQVF1ZXJ5RGlyZWN0VmlkZW87Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKLQlVbmxvY2tEaXNwbGF5KGRweSk7Ci0JU3luY0hhbmRsZSgpOwotCXJldHVybiBGYWxzZTsKLSAgICB9Ci0gICAgKmZsYWdzID0gcmVwLmZsYWdzOwotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0KLUJvb2wgU0RMX05BTUUoWEY4NkRHQVZpZXdQb3J0Q2hhbmdlZCkoCi0gICAgRGlzcGxheSAqZHB5LAotICAgIGludCBzY3JlZW4sCi0gICAgaW50IG4KLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotICAgIHhYRjg2REdBVmlld1BvcnRDaGFuZ2VkUmVwbHkgcmVwOwotICAgIHhYRjg2REdBVmlld1BvcnRDaGFuZ2VkUmVxICpyZXE7Ci0KLSAgICBYRjg2REdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NkRHQVZpZXdQb3J0Q2hhbmdlZCwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWEY4NkRHQVZpZXdQb3J0Q2hhbmdlZDsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICByZXEtPm4gPSBuOwotICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7Ci0JVW5sb2NrRGlzcGxheShkcHkpOwotCVN5bmNIYW5kbGUoKTsKLQlyZXR1cm4gRmFsc2U7Ci0gICAgfQotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIHJlcC5yZXN1bHQ7Ci19Ci0KLQotCi0vKiBIZWxwZXIgZnVuY3Rpb25zICovCi0KLSNpbmNsdWRlIDxYMTEvWG1kLmg+Ci0jaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy94Zjg2ZGdhLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmIGRlZmluZWQoSVNDKSAKLSMgZGVmaW5lIEhBU19TVlIzX01NQVAKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPGVycm5vLmg+Ci0KLSMgaW5jbHVkZSA8c3lzL2F0X2Fuc2kuaD4KLSMgaW5jbHVkZSA8c3lzL2tkLmg+Ci0KLSMgaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgotIyBpbmNsdWRlIDxzeXMvaW1tdS5oPgotIyBpbmNsdWRlIDxzeXMvcmVnaW9uLmg+Ci0KLSMgaW5jbHVkZSA8c3lzL21tYXAuaD4KLSNlbHNlCi0jIGlmICFkZWZpbmVkKEx5bngpCi0jICBpZiAhZGVmaW5lZChfX0VNWF9fKQotIyAgIGluY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jICBlbmRpZgotIyBlbHNlCi0jICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgIGluY2x1ZGUgPGVycm5vLmg+Ci0jICBpbmNsdWRlIDxzbWVtLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaWYgZGVmaW5lZChTVlI0KSAmJiAhZGVmaW5lZChzdW4pICYmICFkZWZpbmVkKFNDTzMyNSkKLSNkZWZpbmUgREVWX01FTSAiL2Rldi9wbWVtIgotI2VsaWYgZGVmaW5lZChTVlI0KSAmJiBkZWZpbmVkKHN1bikKLSNkZWZpbmUgREVWX01FTSAiL2Rldi94c3ZjIgotI2Vsc2UKLSNkZWZpbmUgREVWX01FTSAiL2Rldi9tZW0iCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGxvbmcgcGh5c2FkZHI7CS8qIGFjdHVhbCByZXF1ZXN0ZWQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsJCS8qIGFjdHVhbCByZXF1ZXN0ZWQgbWFwIHNpemUgKi8KLSAgICB1bnNpZ25lZCBsb25nIGRlbHRhOwkvKiBkZWx0YSB0byBhY2NvdW50IGZvciBwYWdlIGFsaWdubWVudCAqLwotICAgIHZvaWQgKgkgIHZhZGRyOwkvKiBtYXBwZWQgYWRkcmVzcywgd2l0aG91dCB0aGUgZGVsdGEgKi8KLSAgICBpbnQJCSAgcmVmY291bnQ7CS8qIHJlZmVyZW5jZSBjb3VudCAqLwotfSBNYXBSZWMsICpNYXBQdHI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBEaXNwbGF5ICoJZGlzcGxheTsKLSAgICBpbnQJCXNjcmVlbjsKLSAgICBNYXBQdHIJbWFwOwotfSBTY3JSZWMsICpTY3JQdHI7Ci0KLXN0YXRpYyBpbnQgbWFwRmQgPSAtMTsKLXN0YXRpYyBpbnQgbnVtTWFwcyA9IDA7Ci1zdGF0aWMgaW50IG51bVNjcnMgPSAwOwotc3RhdGljIE1hcFB0ciAqbWFwTGlzdCA9IE5VTEw7Ci1zdGF0aWMgU2NyUHRyICpzY3JMaXN0ID0gTlVMTDsKLQotc3RhdGljIE1hcFB0cgotQWRkTWFwKHZvaWQpCi17Ci0gICAgTWFwUHRyICpvbGQ7Ci0KLSAgICBvbGQgPSBtYXBMaXN0OwotICAgIG1hcExpc3QgPSByZWFsbG9jKG1hcExpc3QsIHNpemVvZihNYXBQdHIpICogKG51bU1hcHMgKyAxKSk7Ci0gICAgaWYgKCFtYXBMaXN0KSB7Ci0JbWFwTGlzdCA9IG9sZDsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbWFwTGlzdFtudW1NYXBzXSA9IG1hbGxvYyhzaXplb2YoTWFwUmVjKSk7Ci0gICAgaWYgKCFtYXBMaXN0W251bU1hcHNdKQotCXJldHVybiBOVUxMOwotICAgIHJldHVybiBtYXBMaXN0W251bU1hcHMrK107Ci19Ci0KLXN0YXRpYyBTY3JQdHIKLUFkZFNjcih2b2lkKQotewotICAgIFNjclB0ciAqb2xkOwotCi0gICAgb2xkID0gc2NyTGlzdDsKLSAgICBzY3JMaXN0ID0gcmVhbGxvYyhzY3JMaXN0LCBzaXplb2YoU2NyUHRyKSAqIChudW1TY3JzICsgMSkpOwotICAgIGlmICghc2NyTGlzdCkgewotCXNjckxpc3QgPSBvbGQ7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHNjckxpc3RbbnVtU2Nyc10gPSBtYWxsb2Moc2l6ZW9mKFNjclJlYykpOwotICAgIGlmICghc2NyTGlzdFtudW1TY3JzXSkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gc2NyTGlzdFtudW1TY3JzKytdOwotfQotCi1zdGF0aWMgTWFwUHRyCi1GaW5kTWFwKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHM7IGkrKykgewotCWlmIChtYXBMaXN0W2ldLT5waHlzYWRkciA9PSBhZGRyZXNzICYmCi0JICAgIG1hcExpc3RbaV0tPnNpemUgPT0gc2l6ZSkKLQkgICAgcmV0dXJuIG1hcExpc3RbaV07Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgU2NyUHRyCi1GaW5kU2NyKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4pCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU2NyczsgaSsrKSB7Ci0JaWYgKHNjckxpc3RbaV0tPmRpc3BsYXkgPT0gZGlzcGxheSAmJgotCSAgICBzY3JMaXN0W2ldLT5zY3JlZW4gPT0gc2NyZWVuKQotCSAgICByZXR1cm4gc2NyTGlzdFtpXTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkICoKLU1hcFBoeXNBZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplKQotewotICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBkZWx0YTsKLSAgICBpbnQgcGFnZXNpemUgPSAtMTsKLSAgICB2b2lkICp2YWRkcjsKLSAgICBNYXBQdHIgbXA7Ci0jaWYgZGVmaW5lZChJU0MpICYmIGRlZmluZWQoSEFTX1NWUjNfTU1BUCkKLSAgICBzdHJ1Y3Qga2RfbWVtbG9jIG1sb2M7Ci0jZWxpZiBkZWZpbmVkKF9fRU1YX18pCi0gICAgQVBJUkVUIHJjOwotICAgIFVMT05HIGFjdGlvbjsKLSAgICBIRklMRSBoZmQ7Ci0jZW5kaWYKLQotICAgIGlmICgobXAgPSBGaW5kTWFwKGFkZHJlc3MsIHNpemUpKSkgewotCW1wLT5yZWZjb3VudCsrOwotCXJldHVybiAodm9pZCAqKSgodW5zaWduZWQgbG9uZyltcC0+dmFkZHIgKyBtcC0+ZGVsdGEpOwotICAgIH0KLQotI2lmIGRlZmluZWQoX1NDX1BBR0VTSVpFKSAmJiBkZWZpbmVkKEhBU19TQ19QQUdFU0laRSkKLSAgICBwYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKLSNlbmRpZgotI2lmZGVmIF9TQ19QQUdFX1NJWkUKLSAgICBpZiAocGFnZXNpemUgPT0gLTEpCi0JcGFnZXNpemUgPSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpOwotI2VuZGlmCi0jaWZkZWYgSEFTX0dFVFBBR0VTSVpFCi0gICAgaWYgKHBhZ2VzaXplID09IC0xKQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLSNlbmRpZgotI2lmZGVmIFBBR0VfU0laRQotICAgIGlmIChwYWdlc2l6ZSA9PSAtMSkKLQlwYWdlc2l6ZSA9IFBBR0VfU0laRTsKLSNlbmRpZgotICAgIGlmIChwYWdlc2l6ZSA9PSAtMSkKLQlwYWdlc2l6ZSA9IDQwOTY7Ci0KLSAgIGRlbHRhID0gYWRkcmVzcyAlIHBhZ2VzaXplOwotICAgb2Zmc2V0ID0gYWRkcmVzcyAtIGRlbHRhOwotCi0jaWYgZGVmaW5lZChJU0MpICYmIGRlZmluZWQoSEFTX1NWUjNfTU1BUCkKLSAgICBpZiAobWFwRmQgPCAwKSB7Ci0JaWYgKChtYXBGZCA9IG9wZW4oIi9kZXYvbW1hcCIsIE9fUkRXUikpIDwgMCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIG1sb2MudmFkZHIgPSAoY2hhciAqKTA7Ci0gICAgbWxvYy5waHlzYWRkciA9IChjaGFyICopb2Zmc2V0OwotICAgIG1sb2MubGVuZ3RoID0gc2l6ZSArIGRlbHRhOwotICAgIG1sb2MuaW9mbGc9MTsKLQotICAgIGlmICgodmFkZHIgPSAodm9pZCAqKWlvY3RsKG1hcEZkLCBNQVAsICZtbG9jKSkgPT0gKHZvaWQgKiktMSkKLQlyZXR1cm4gTlVMTDsKLSNlbGlmIGRlZmluZWQgKF9fRU1YX18pCi0gICAgLyoKLSAgICAgKiBEcmFnb24gd2FybmluZyBoZXJlISAvZGV2L3BtYXAkIGlzIG5ldmVyIGNsb3NlZCwgZXhjZXB0IG9uIHByb2dhbSBleGl0LgotICAgICAqIENvbnNlY3V0aXZlIGNhbGxpbmcgb2YgdGhpcyByb3V0aW5lIHdpbGwgbWFrZSBQTUFQJCBkcml2ZXIgcnVuIG91dAotICAgICAqIG9mIG1lbW9yeSBoYW5kbGVzLiBTb21lIHVtYXAvY2xvc2UgbWVjaGFuaXNtIHNob3VsZCBiZSBwcm92aWRlZAotICAgICAqLwotCi0gICAgcmMgPSBEb3NPcGVuKCIvZGV2L3BtYXAkIiwgJmhmZCwgJmFjdGlvbiwgMCwgRklMRV9OT1JNQUwsIEZJTEVfT1BFTiwKLQkJIE9QRU5fQUNDRVNTX1JFQURXUklURSB8IE9QRU5fU0hBUkVfREVOWU5PTkUsIChQRUFPUDIpTlVMTCk7Ci0gICAgaWYgKHJjICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgewotCXN0cnVjdCBtYXBfaW9jdGwgewotCQl1bmlvbiB7Ci0JCQlVTE9ORyBwaHlzOwotCQkJdm9pZCogdXNlcjsKLQkJfSBhOwotCQlVTE9ORyBzaXplOwotCX0gcG1hcCxkbWFwOwotCVVMT05HIHBsZW4sZGxlbjsKLSNkZWZpbmUgWEZSRUU4Nl9QTUFQCTB4NzYKLSNkZWZpbmUgUE1BUF9NQVAJMHg0NAotCi0JcG1hcC5hLnBoeXMgPSBvZmZzZXQ7Ci0JcG1hcC5zaXplID0gc2l6ZSArIGRlbHRhOwotCXJjID0gRG9zRGV2SU9DdGwoaGZkLCBYRlJFRTg2X1BNQVAsIFBNQVBfTUFQLAotCQkJIChQVUxPTkcpJnBtYXAsIHNpemVvZihwbWFwKSwgJnBsZW4sCi0JCQkgKFBVTE9ORykmZG1hcCwgc2l6ZW9mKGRtYXApLCAmZGxlbik7Ci0JaWYgKHJjID09IDApIHsKLQkJdmFkZHIgPSBkbWFwLmEudXNlcjsKLQl9Ci0gICB9Ci0gICBpZiAocmMgIT0gMCkKLQlyZXR1cm4gTlVMTDsKLSNlbGlmIGRlZmluZWQgKEx5bngpCi0gICAgdmFkZHIgPSAodm9pZCAqKXNtZW1fY3JlYXRlKCJYRjg2REdBIiwgKGNoYXIgKilvZmZzZXQsIAotCQkJCXNpemUgKyBkZWx0YSwgU01fUkVBRHxTTV9XUklURSk7Ci0jZWxzZQotI2lmbmRlZiBNQVBfRklMRQotI2RlZmluZSBNQVBfRklMRSAwCi0jZW5kaWYKLSAgICBpZiAobWFwRmQgPCAwKSB7Ci0JaWYgKChtYXBGZCA9IG9wZW4oREVWX01FTSwgT19SRFdSKSkgPCAwKQotCSAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdmFkZHIgPSAodm9pZCAqKW1tYXAoTlVMTCwgc2l6ZSArIGRlbHRhLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0ZJTEUgfCBNQVBfU0hBUkVELCBtYXBGZCwgKG9mZl90KW9mZnNldCk7Ci0gICAgaWYgKHZhZGRyID09ICh2b2lkICopLTEpCi0JcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLQotICAgIGlmICghdmFkZHIpIHsKLQlpZiAoIShtcCA9IEFkZE1hcCgpKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JbXAtPnBoeXNhZGRyID0gYWRkcmVzczsKLQltcC0+c2l6ZSA9IHNpemU7Ci0JbXAtPmRlbHRhID0gZGVsdGE7Ci0JbXAtPnZhZGRyID0gdmFkZHI7Ci0JbXAtPnJlZmNvdW50ID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXZhZGRyICsgZGVsdGEpOwotfQotCi0vKgotICogU3RpbGwgbmVlZCB0byBmaW5kIGEgY2xlYW4gd2F5IG9mIGRldGVjdGluZyB0aGUgZGVhdGggb2YgYSBER0EgYXBwCi0gKiBhbmQgcmV0dXJuaW5nIHRoaW5ncyB0byBub3JtYWwgLSBKb24KLSAqIFRoaXMgaXMgaGVyZSB0byBoZWxwIGRlYnVnZ2luZyB3aXRob3V0IHJlYm9vdGluZy4uLiBBbHNvIEMtQS1CUwotICogc2hvdWxkIHJlc3RvcmUgdGV4dCBtb2RlLgotICovCi0KLWludAotU0RMX05BTUUoWEY4NkRHQUZvcmtBcHApKGludCBzY3JlZW4pCi17Ci0gICAgcGlkX3QgcGlkOwotICAgIGludCBzdGF0dXM7Ci0gICAgaW50IGk7Ci0KLSAgICAgLyogZm9yayB0aGUgYXBwLCBwYXJlbnQgaGFuZ3MgYXJvdW5kIHRvIGNsZWFuIHVwICovCi0gICAgaWYgKChwaWQgPSBmb3JrKCkpID4gMCkgewotCVNjclB0ciBzcDsKLQotCXdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtU2NyczsgaSsrKSB7Ci0JICAgIHNwID0gc2NyTGlzdFtpXTsKLQkgICAgU0RMX05BTUUoWEY4NkRHQURpcmVjdFZpZGVvTEwpKHNwLT5kaXNwbGF5LCBzcC0+c2NyZWVuLCAwKTsKLQkgICAgWFN5bmMoc3AtPmRpc3BsYXksIEZhbHNlKTsKLQl9Ci0gICAgICAgIGlmIChXSUZFWElURUQoc3RhdHVzKSkKLQkgICAgZXhpdCgwKTsKLQllbHNlCi0JICAgIGV4aXQoLTEpOwotICAgIH0KLSAgICByZXR1cm4gcGlkOwotfQotCi0KLUJvb2wKLVNETF9OQU1FKFhGODZER0FEaXJlY3RWaWRlbykoCi0gICAgRGlzcGxheSAqZGlzLAotICAgIGludCBzY3JlZW4sCi0gICAgaW50IGVuYWJsZQotKXsKLSAgICBTY3JQdHIgc3A7Ci0gICAgTWFwUHRyIG1wID0gTlVMTDsKLQotICAgIGlmICgoc3AgPSBGaW5kU2NyKGRpcywgc2NyZWVuKSkpCi0JbXAgPSBzcC0+bWFwOwotCi0gICAgaWYgKGVuYWJsZSAmIFhGODZER0FEaXJlY3RHcmFwaGljcykgewotI2lmICFkZWZpbmVkKElTQykgJiYgIWRlZmluZWQoSEFTX1NWUjNfTU1BUCkgJiYgIWRlZmluZWQoTHlueCkgXAotCSYmICFkZWZpbmVkKF9fRU1YX18pCi0JaWYgKG1wICYmIG1wLT52YWRkcikKLQkgICAgbXByb3RlY3QobXAtPnZhZGRyLCBtcC0+c2l6ZSArIG1wLT5kZWx0YSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotI2lmICFkZWZpbmVkKElTQykgJiYgIWRlZmluZWQoSEFTX1NWUjNfTU1BUCkgJiYgIWRlZmluZWQoTHlueCkgXAotCSYmICFkZWZpbmVkKF9fRU1YX18pCi0JaWYgKG1wICYmIG1wLT52YWRkcikKLQkgICAgbXByb3RlY3QobXAtPnZhZGRyLCBtcC0+c2l6ZSArIG1wLT5kZWx0YSwgUFJPVF9SRUFEKTsKLSNlbGlmIGRlZmluZWQoTHlueCkKLQkvKiBYWFggdGhpcyBkb2Vzbid0IGFsbG93IGVuYWJsZSBhZnRlciBkaXNhYmxlICovCi0Jc21lbV9jcmVhdGUoTlVMTCwgbXAtPnZhZGRyLCBtcC0+c2l6ZSArIG1wLT5kZWx0YSwgU01fREVUQUNIKTsKLQlzbWVtX3JlbW92ZSgiWEY4NkRHQSIpOwotI2VuZGlmCi0gICAgfQotCi0gICAgU0RMX05BTUUoWEY4NkRHQURpcmVjdFZpZGVvTEwpKGRpcywgc2NyZWVuLCBlbmFibGUpOwotICAgIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB2b2lkCi1YRjg2Y2xlYW51cChpbnQgc2lnKQotewotICAgIFNjclB0ciBzcDsKLSAgICBpbnQgaTsKLSAgICBzdGF0aWMgY2hhciBiZWVuaGVyZSA9IDA7Ci0KLSAgICBpZiAoYmVlbmhlcmUpCi0JZXhpdCgzKTsKLSAgICBiZWVuaGVyZSA9IDE7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU2NyczsgaSsrKSB7Ci0Jc3AgPSBzY3JMaXN0W2ldOwotCVNETF9OQU1FKFhGODZER0FEaXJlY3RWaWRlbykoc3AtPmRpc3BsYXksIHNwLT5zY3JlZW4sIDApOwotCVhTeW5jKHNwLT5kaXNwbGF5LCBGYWxzZSk7Ci0gICAgfQotICAgIGV4aXQoMyk7Ci19Ci0KLUJvb2wKLVNETF9OQU1FKFhGODZER0FHZXRWaWRlbykoCi0gICAgRGlzcGxheSAqZGlzLAotICAgIGludCBzY3JlZW4sCi0gICAgY2hhciAqKmFkZHIsCi0gICAgaW50ICp3aWR0aCwgCi0gICAgaW50ICpiYW5rLCAKLSAgICBpbnQgKnJhbQotKXsKLSAgICAvKnVuc2lnbmVkIGxvbmcqLyBpbnQgb2Zmc2V0OwotICAgIHN0YXRpYyBpbnQgYmVlbkhlcmUgPSAwOwotICAgIFNjclB0ciBzcDsKLSAgICBNYXBQdHIgbXA7Ci0KLSAgICBpZiAoIShzcCA9IEZpbmRTY3IoZGlzLCBzY3JlZW4pKSkgewotCWlmICghKHNwID0gQWRkU2NyKCkpKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiWEY4NkRHQUdldFZpZGVvOiBtYWxsb2MgZmFpbHVyZVxuIik7Ci0JICAgIGV4aXQoLTIpOwotCX0KLQlzcC0+ZGlzcGxheSA9IGRpczsKLQlzcC0+c2NyZWVuID0gc2NyZWVuOwotCXNwLT5tYXAgPSBOVUxMOwotICAgIH0KLQotICAgIFNETF9OQU1FKFhGODZER0FHZXRWaWRlb0xMKShkaXMsIHNjcmVlbiAsICZvZmZzZXQsIHdpZHRoLCBiYW5rLCByYW0pOwotCi0gICAgKmFkZHIgPSBNYXBQaHlzQWRkcmVzcyhvZmZzZXQsICpiYW5rKTsKLSAgICBpZiAoKmFkZHIgPT0gTlVMTCkgewotCWZwcmludGYoc3RkZXJyLCAiWEY4NkRHQUdldFZpZGVvOiBmYWlsZWQgdG8gbWFwIHZpZGVvIG1lbW9yeSAoJXMpXG4iLAotCQlzdHJlcnJvcihlcnJubykpOwotCWV4aXQoLTIpOwotICAgIH0KLQotICAgIGlmICgobXAgPSBGaW5kTWFwKG9mZnNldCwgKmJhbmspKSkKLQlzcC0+bWFwID0gbXA7Ci0KLSAgICBpZiAoIWJlZW5IZXJlKSB7Ci0JYmVlbkhlcmUgPSAxOwotCWF0ZXhpdCgodm9pZCgqKSh2b2lkKSlYRjg2Y2xlYW51cCk7Ci0JLyogb25lIHNob3QgWEY4NmNsZWFudXAgYXR0ZW1wdHMgKi8KLQlzaWduYWwoU0lHU0VHViwgWEY4NmNsZWFudXApOwotI2lmZGVmIFNJR0JVUwotCXNpZ25hbChTSUdCVVMsIFhGODZjbGVhbnVwKTsKLSNlbmRpZgotCXNpZ25hbChTSUdIVVAsIFhGODZjbGVhbnVwKTsKLQlzaWduYWwoU0lHRlBFLCBYRjg2Y2xlYW51cCk7ICAKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L1h4Zjg2ZGdhL1hGODZER0EyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWHhmODZkZ2EvWEY4NkRHQTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjZjlmOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWHhmODZkZ2EvWEY4NkRHQTIuYworKysgL2Rldi9udWxsCkBAIC0xLDk4OCArMCwwIEBACi0vKiAkWEZyZWU4NjogeGMvbGliL1h4Zjg2ZGdhL1hGODZER0EyLmMsdiAxLjE4IDIwMDEvMDgvMTcgMTM6Mjc6NTEgZGF3ZXMgRXhwICQgKi8KLS8qCi0KLUNvcHlyaWdodCAoYykgMTk5NSAgSm9uIFRvbWJzCi1Db3B5cmlnaHQgKGMpIDE5OTUsMTk5NiAgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jCi0KLSovCi0KLS8qIFRISVMgSVMgTk9UIEFOIFggQ09OU09SVElVTSBTVEFOREFSRCAqLwotCi0jaWZkZWYgX19FTVhfXyAvKiBuZWVkZWQgaGVyZSB0byBvdmVycmlkZSBjZXJ0YWluIGNvbnN0YW50cyBpbiBYIGhlYWRlcnMgKi8KLSNkZWZpbmUgSU5DTF9ET1MKLSNkZWZpbmUgSU5DTF9ET1NJT0NUTAotI2luY2x1ZGUgPG9zMi5oPgotI2VuZGlmCi0KLSNkZWZpbmUgTkVFRF9FVkVOVFMKLSNkZWZpbmUgTkVFRF9SRVBMSUVTCi0KLSNpbmNsdWRlIDxYMTEvWGxpYmludC5oPgotI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMveGY4NmRnYS5oIgotI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMveGY4NmRnYXN0ci5oIgotI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMvWGV4dC5oIgotI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMvZXh0dXRpbC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBkZWZpbmVkKEVOQUJMRV9GQkNPTikgIC8qIE5lZWRlZCBmb3IgZnJhbWVidWZmZXIgY29uc29sZSBzdXBwb3J0ICovCi0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNlbmRpZgotCi0vKiBJZiB5b3UgY2hhbmdlIHRoaXMsIGNoYW5nZSB0aGUgQmFzZXNbXSBhcnJheSBiZWxvdyBhcyB3ZWxsICovCi0jZGVmaW5lIE1BWF9IRUFEUyAxNgotCi1jaGFyICpTRExfTkFNRSh4ZGdhX2V4dGVuc2lvbl9uYW1lKSA9IFhGODZER0FOQU1FOwotCi1zdGF0aWMgWEV4dGVuc2lvbkluZm8gX3hkZ2FfaW5mb19kYXRhOwotc3RhdGljIFhFeHRlbnNpb25JbmZvICp4ZGdhX2luZm8gPSAmX3hkZ2FfaW5mb19kYXRhOwotCi0gCi1Cb29sIFNETF9OQU1FKFhER0FNYXBGcmFtZWJ1ZmZlcikoaW50LCBjaGFyICosIHVuc2lnbmVkIGNoYXIqLCBDQVJEMzIsIENBUkQzMiwgQ0FSRDMyKTsKLXZvaWQgU0RMX05BTUUoWERHQVVubWFwRnJhbWVidWZmZXIpKGludCk7Ci11bnNpZ25lZCBjaGFyKiBTRExfTkFNRShYREdBR2V0TWFwcGVkTWVtb3J5KShpbnQpOwotCi0jZGVmaW5lIFhER0FDaGVja0V4dGVuc2lvbihkcHksaSx2YWwpIFwKLSAgWGV4dENoZWNrRXh0ZW5zaW9uIChkcHksIGksIFNETF9OQU1FKHhkZ2FfZXh0ZW5zaW9uX25hbWUpLCB2YWwpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKgkJCSAgIHByaXZhdGUgdXRpbGl0eSByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgeGRnYV9jbG9zZV9kaXNwbGF5KERpc3BsYXkgKmRweSwgWEV4dENvZGVzICpjb2Rlcyk7Ci1zdGF0aWMgQm9vbCB4ZGdhX3dpcmVfdG9fZXZlbnQoRGlzcGxheSAqZHB5LCBYRXZlbnQgKmV2ZW50LCB4RXZlbnQgKndpcmVfZXYpOwotc3RhdGljIFN0YXR1cyB4ZGdhX2V2ZW50X3RvX3dpcmUoRGlzcGxheSAqZHB5LCBYRXZlbnQgKmV2ZW50LCB4RXZlbnQgKndpcmVfZXYpOwotCi1zdGF0aWMgWEV4dGVuc2lvbkhvb2tzIHhkZ2FfZXh0ZW5zaW9uX2hvb2tzID0gewotICAgIE5VTEwsCQkJCS8qIGNyZWF0ZV9nYyAqLwotICAgIE5VTEwsCQkJCS8qIGNvcHlfZ2MgKi8KLSAgICBOVUxMLAkJCQkvKiBmbHVzaF9nYyAqLwotICAgIE5VTEwsCQkJCS8qIGZyZWVfZ2MgKi8KLSAgICBOVUxMLAkJCQkvKiBjcmVhdGVfZm9udCAqLwotICAgIE5VTEwsCQkJCS8qIGZyZWVfZm9udCAqLwotICAgIHhkZ2FfY2xvc2VfZGlzcGxheSwJCQkvKiBjbG9zZV9kaXNwbGF5ICovCi0gICAgeGRnYV93aXJlX3RvX2V2ZW50LAkJCS8qIHdpcmVfdG9fZXZlbnQgKi8KLSAgICB4ZGdhX2V2ZW50X3RvX3dpcmUsCQkJLyogZXZlbnRfdG9fd2lyZSAqLwotICAgIE5VTEwsCQkJCS8qIGVycm9yICovCi0gICAgTlVMTCwJCQkJLyogZXJyb3Jfc3RyaW5nICovCi19OwotCi1zdGF0aWMgWEVYVF9HRU5FUkFURV9DTE9TRV9ESVNQTEFZICh4ZGdhX2Nsb3NlX2Rpc3BsYXksIHhkZ2FfaW5mbykKLQotCi1YRVhUX0dFTkVSQVRFX0ZJTkRfRElTUExBWSAoU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpLCB4ZGdhX2luZm8sIAotCQkJCSAgICJYRnJlZTg2LURHQSIsIAotCQkJCSAgICZ4ZGdhX2V4dGVuc2lvbl9ob29rcywgCi0JCQkJICAgMCwgTlVMTCkKLQotCi1zdGF0aWMgU3RhdHVzCi14ZGdhX2V2ZW50X3RvX3dpcmUoCi0gIERpc3BsYXkgKmRweSwKLSAgWEV2ZW50ICpldmVudCwKLSAgeEV2ZW50ICp3aXJlX2V2Ci0pewotICAgIHJldHVybiBUcnVlOwotfQotCi1zdGF0aWMgQm9vbAoteGRnYV93aXJlX3RvX2V2ZW50KAotICBEaXNwbGF5ICpkcHksCi0gIFhFdmVudCAqZXZlbnQsCi0gIHhFdmVudCAqd2lyZV9ldgotKXsKLSAgZGdhRXZlbnQgKndpcmUgPSAoZGdhRXZlbnQgKikgd2lyZV9ldjsKLSAgU0RMX05BTUUoWERHQUJ1dHRvbkV2ZW50KSAqYmV2ZW50OwotICBTRExfTkFNRShYREdBS2V5RXZlbnQpICprZXZlbnQ7Ci0gIFNETF9OQU1FKFhER0FNb3Rpb25FdmVudCkgKm1ldmVudDsKLSAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotCi0gIFhER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7Ci0KLSAgc3dpdGNoKCh3aXJlLT51LnUudHlwZSAmIDB4N2YpIC0gaW5mby0+Y29kZXMtPmZpcnN0X2V2ZW50KSB7Ci0gIGNhc2UgTW90aW9uTm90aWZ5OgotCW1ldmVudCA9IChTRExfTkFNRShYREdBTW90aW9uRXZlbnQpKilldmVudDsKLQltZXZlbnQtPnR5cGUgPSB3aXJlLT51LnUudHlwZSAmIDB4N0Y7Ci0JbWV2ZW50LT5zZXJpYWwgPSBfWFNldExhc3RSZXF1ZXN0UmVhZChkcHksICh4R2VuZXJpY1JlcGx5ICopd2lyZSk7Ci0JbWV2ZW50LT5kaXNwbGF5ID0gZHB5OwotCW1ldmVudC0+c2NyZWVuID0gd2lyZS0+dS5ldmVudC5zY3JlZW47Ci0JbWV2ZW50LT50aW1lID0gd2lyZS0+dS5ldmVudC50aW1lOwotCW1ldmVudC0+c3RhdGUgPSB3aXJlLT51LmV2ZW50LnN0YXRlOwotCW1ldmVudC0+ZHggPSB3aXJlLT51LmV2ZW50LmR4OwotCW1ldmVudC0+ZHkgPSB3aXJlLT51LmV2ZW50LmR5OwotCXJldHVybiBUcnVlOwotICBjYXNlIEJ1dHRvblByZXNzOgotICBjYXNlIEJ1dHRvblJlbGVhc2U6Ci0JYmV2ZW50ID0gKFNETF9OQU1FKFhER0FCdXR0b25FdmVudCkqKWV2ZW50OwotCWJldmVudC0+dHlwZSA9IHdpcmUtPnUudS50eXBlICYgMHg3RjsKLQliZXZlbnQtPnNlcmlhbCA9IF9YU2V0TGFzdFJlcXVlc3RSZWFkKGRweSwgKHhHZW5lcmljUmVwbHkgKil3aXJlKTsKLQliZXZlbnQtPmRpc3BsYXkgPSBkcHk7Ci0JYmV2ZW50LT5zY3JlZW4gPSB3aXJlLT51LmV2ZW50LnNjcmVlbjsKLQliZXZlbnQtPnRpbWUgPSB3aXJlLT51LmV2ZW50LnRpbWU7Ci0JYmV2ZW50LT5zdGF0ZSA9IHdpcmUtPnUuZXZlbnQuc3RhdGU7Ci0JYmV2ZW50LT5idXR0b24gPSB3aXJlLT51LnUuZGV0YWlsOwotCXJldHVybiBUcnVlOwotICBjYXNlIEtleVByZXNzOgotICBjYXNlIEtleVJlbGVhc2U6Ci0Ja2V2ZW50ID0gKFNETF9OQU1FKFhER0FLZXlFdmVudCkqKWV2ZW50OwotCWtldmVudC0+dHlwZSA9IHdpcmUtPnUudS50eXBlICYgMHg3RjsKLQlrZXZlbnQtPnNlcmlhbCA9IF9YU2V0TGFzdFJlcXVlc3RSZWFkKGRweSwgKHhHZW5lcmljUmVwbHkgKil3aXJlKTsKLQlrZXZlbnQtPmRpc3BsYXkgPSBkcHk7Ci0Ja2V2ZW50LT5zY3JlZW4gPSB3aXJlLT51LmV2ZW50LnNjcmVlbjsKLQlrZXZlbnQtPnRpbWUgPSB3aXJlLT51LmV2ZW50LnRpbWU7Ci0Ja2V2ZW50LT5zdGF0ZSA9IHdpcmUtPnUuZXZlbnQuc3RhdGU7Ci0Ja2V2ZW50LT5rZXljb2RlID0gd2lyZS0+dS51LmRldGFpbDsKLQlyZXR1cm4gVHJ1ZTsKLSAgfQotCi0gIHJldHVybiBGYWxzZTsKLX0KLQotCi1Cb29sIFNETF9OQU1FKFhER0FRdWVyeUV4dGVuc2lvbikgKAotICAgIERpc3BsYXkgKmRweSwKLSAgICBpbnQgKmV2ZW50X2Jhc2VwLAotICAgIGludCAqZXJyb3JfYmFzZXAKLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotCi0gICAgaWYgKFhleHRIYXNFeHRlbnNpb24oaW5mbykpIHsKLQkqZXZlbnRfYmFzZXAgPSBpbmZvLT5jb2Rlcy0+Zmlyc3RfZXZlbnQ7Ci0JKmVycm9yX2Jhc2VwID0gaW5mby0+Y29kZXMtPmZpcnN0X2Vycm9yOwotCXJldHVybiBUcnVlOwotICAgIH0gZWxzZSB7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLX0KLQotCi1Cb29sIFNETF9OQU1FKFhER0FRdWVyeVZlcnNpb24pKAotICAgIERpc3BsYXkgKmRweSwKLSAgICBpbnQgKm1ham9yVmVyc2lvbiwgCi0gICAgaW50ICptaW5vclZlcnNpb24KLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotICAgIHhYREdBUXVlcnlWZXJzaW9uUmVwbHkgcmVwOwotICAgIHhYREdBUXVlcnlWZXJzaW9uUmVxICpyZXE7Ci0KLSAgICBYREdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWERHQVF1ZXJ5VmVyc2lvbiwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWERHQVF1ZXJ5VmVyc2lvbjsKLSAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgewotCVVubG9ja0Rpc3BsYXkoZHB5KTsKLQlTeW5jSGFuZGxlKCk7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLSAgICAqbWFqb3JWZXJzaW9uID0gcmVwLm1ham9yVmVyc2lvbjsKLSAgICAqbWlub3JWZXJzaW9uID0gcmVwLm1pbm9yVmVyc2lvbjsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIGlmICgqbWFqb3JWZXJzaW9uID49IDIpCi0gICAgewotCWludCBpLCBqOwotCi0JZm9yIChpID0gMCwgaiA9IGluZm8tPmNvZGVzLT5maXJzdF9ldmVudDsKLQkgICAgIGkgPCBYRjg2REdBTnVtYmVyRXZlbnRzOwotCSAgICAgaSsrLCBqKyspIAotCXsKLQkgICAgWEVTZXRXaXJlVG9FdmVudChkcHksIGosIHhkZ2Ffd2lyZV90b19ldmVudCk7Ci0JICAgIFhFU2V0RXZlbnRUb1dpcmUoZHB5LCBqLCB4ZGdhX2V2ZW50X3RvX3dpcmUpOwotCX0KLQlTRExfTkFNRShYREdBU2V0Q2xpZW50VmVyc2lvbikoZHB5KTsKLSAgICB9Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0KLUJvb2wgU0RMX05BTUUoWERHQVNldENsaWVudFZlcnNpb24pKAotICAgIERpc3BsYXkJKmRweQotKXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhER0FTZXRDbGllbnRWZXJzaW9uUmVxICpyZXE7Ci0KLSAgICBYREdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWERHQVNldENsaWVudFZlcnNpb24sIHJlcSk7Ci0gICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLSAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FTZXRDbGllbnRWZXJzaW9uOwotICAgIHJlcS0+bWFqb3IgPSBYREdBX01BSk9SX1ZFUlNJT047Ci0gICAgcmVxLT5taW5vciA9IFhER0FfTUlOT1JfVkVSU0lPTjsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBUcnVlOwotfQotCi1Cb29sIFNETF9OQU1FKFhER0FPcGVuRnJhbWVidWZmZXIpKAotICAgIERpc3BsYXkJKmRweSwKLSAgICBpbnQgCXNjcmVlbgotKXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhER0FPcGVuRnJhbWVidWZmZXJSZXBseSByZXA7Ci0gICAgeFhER0FPcGVuRnJhbWVidWZmZXJSZXEgKnJlcTsKLSAgICBjaGFyICpkZXZpY2VOYW1lID0gTlVMTDsKLSAgICBCb29sIHJldDsKLQotICAgIFhER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYREdBT3BlbkZyYW1lYnVmZmVyLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBT3BlbkZyYW1lYnVmZmVyOwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7Ci0JVW5sb2NrRGlzcGxheShkcHkpOwotCVN5bmNIYW5kbGUoKTsKLQlyZXR1cm4gRmFsc2U7Ci0gICAgfQotCi0gICAgaWYocmVwLmxlbmd0aCkgewotCWRldmljZU5hbWUgPSBYbWFsbG9jKHJlcC5sZW5ndGggPDwgMik7Ci0JX1hSZWFkKGRweSwgZGV2aWNlTmFtZSwgcmVwLmxlbmd0aCA8PCAyKTsKLSAgICB9Ci0KLSAgICByZXQgPSBTRExfTkFNRShYREdBTWFwRnJhbWVidWZmZXIpKHNjcmVlbiwgZGV2aWNlTmFtZSwKLQkJCQkodW5zaWduZWQgY2hhciopKGxvbmcpcmVwLm1lbTEsIAotCQkJCXJlcC5zaXplLCByZXAub2Zmc2V0LCByZXAuZXh0cmEpOwotCi0gICAgaWYoZGV2aWNlTmFtZSkKLQlYZnJlZShkZXZpY2VOYW1lKTsJCi0KLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgU0RMX05BTUUoWERHQUNsb3NlRnJhbWVidWZmZXIpKAotICAgIERpc3BsYXkJKmRweSwKLSAgICBpbnQJCXNjcmVlbgotKXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhER0FDbG9zZUZyYW1lYnVmZmVyUmVxICpyZXE7Ci0KLSAgICBYZXh0U2ltcGxlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgU0RMX05BTUUoeGRnYV9leHRlbnNpb25fbmFtZSkpOwotCi0gICAgU0RMX05BTUUoWERHQVVubWFwRnJhbWVidWZmZXIpKHNjcmVlbik7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYREdBQ2xvc2VGcmFtZWJ1ZmZlciwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWERHQUNsb3NlRnJhbWVidWZmZXI7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLX0KLQotCi0KLVNETF9OQU1FKFhER0FNb2RlKSogU0RMX05BTUUoWERHQVF1ZXJ5TW9kZXMpKAotICAgIERpc3BsYXkgKmRweSwKLSAgICBpbnQgc2NyZWVuLAotICAgIGludCAqbnVtCi0pewotICAgIFhFeHREaXNwbGF5SW5mbyAqZGluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhER0FRdWVyeU1vZGVzUmVwbHkgcmVwOwotICAgIHhYREdBUXVlcnlNb2Rlc1JlcSAqcmVxOwotICAgIFNETF9OQU1FKFhER0FNb2RlKSAqbW9kZXMgPSBOVUxMOwotCi0gICAgKm51bSA9IDA7Ci0KLSAgICBYREdBQ2hlY2tFeHRlbnNpb24gKGRweSwgZGluZm8sIE5VTEwpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWERHQVF1ZXJ5TW9kZXMsIHJlcSk7Ci0gICAgcmVxLT5yZXFUeXBlID0gZGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBUXVlcnlNb2RlczsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLQotICAgIGlmIChfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKLQlpZihyZXAubGVuZ3RoKSB7Ci0JICAgeFhER0FNb2RlSW5mbyBpbmZvOwotCSAgIGludCBpLCBzaXplOwotCSAgIGNoYXIgKm9mZnNldDsKLQotCSAgIHNpemUgPSByZXAubGVuZ3RoIDw8IDI7Ci0JICAgc2l6ZSAtPSByZXAubnVtYmVyICogc3pfeFhER0FNb2RlSW5mbzsgLyogZmluZCB0ZXh0IHNpemUgKi8KLQkgICBtb2RlcyA9IChTRExfTkFNRShYREdBTW9kZSkqKVhtYWxsb2MoKHJlcC5udW1iZXIgKiBzaXplb2YoU0RMX05BTUUoWERHQU1vZGUpKSkgKyBzaXplKTsKLQkgICBvZmZzZXQgPSAoY2hhciopKCZtb2Rlc1tyZXAubnVtYmVyXSk7IC8qIHN0YXJ0IG9mIHRleHQgKi8KLQotCi0JICAgaWYobW9kZXMpIHsJCi0JICAgICAgZm9yKGkgPSAwOyBpIDwgcmVwLm51bWJlcjsgaSsrKSB7Ci0JCV9YUmVhZChkcHksIChjaGFyKikoJmluZm8pLCBzel94WERHQU1vZGVJbmZvKTsKLQotCQltb2Rlc1tpXS5udW0gPSBpbmZvLm51bTsKLQkJbW9kZXNbaV0udmVydGljYWxSZWZyZXNoID0gCi0JCQkoZmxvYXQpaW5mby52c3luY19udW0gLyAoZmxvYXQpaW5mby52c3luY19kZW47Ci0JCW1vZGVzW2ldLmZsYWdzID0gaW5mby5mbGFnczsKLQkJbW9kZXNbaV0uaW1hZ2VXaWR0aCA9IGluZm8uaW1hZ2Vfd2lkdGg7Ci0JCW1vZGVzW2ldLmltYWdlSGVpZ2h0ID0gaW5mby5pbWFnZV9oZWlnaHQ7Ci0JCW1vZGVzW2ldLnBpeG1hcFdpZHRoID0gaW5mby5waXhtYXBfd2lkdGg7Ci0JCW1vZGVzW2ldLnBpeG1hcEhlaWdodCA9IGluZm8ucGl4bWFwX2hlaWdodDsKLQkJbW9kZXNbaV0uYnl0ZXNQZXJTY2FubGluZSA9IGluZm8uYnl0ZXNfcGVyX3NjYW5saW5lOwotCQltb2Rlc1tpXS5ieXRlT3JkZXIgPSBpbmZvLmJ5dGVfb3JkZXI7Ci0JCW1vZGVzW2ldLmRlcHRoID0gaW5mby5kZXB0aDsKLQkJbW9kZXNbaV0uYml0c1BlclBpeGVsID0gaW5mby5icHA7Ci0JCW1vZGVzW2ldLnJlZE1hc2sgPSBpbmZvLnJlZF9tYXNrOwotCQltb2Rlc1tpXS5ncmVlbk1hc2sgPSBpbmZvLmdyZWVuX21hc2s7Ci0JCW1vZGVzW2ldLmJsdWVNYXNrID0gaW5mby5ibHVlX21hc2s7Ci0JCW1vZGVzW2ldLnZpc3VhbENsYXNzID0gaW5mby52aXN1YWxfY2xhc3M7Ci0JCW1vZGVzW2ldLnZpZXdwb3J0V2lkdGggPSBpbmZvLnZpZXdwb3J0X3dpZHRoOwotCQltb2Rlc1tpXS52aWV3cG9ydEhlaWdodCA9IGluZm8udmlld3BvcnRfaGVpZ2h0OwotCQltb2Rlc1tpXS54Vmlld3BvcnRTdGVwID0gaW5mby52aWV3cG9ydF94c3RlcDsKLQkJbW9kZXNbaV0ueVZpZXdwb3J0U3RlcCA9IGluZm8udmlld3BvcnRfeXN0ZXA7Ci0JCW1vZGVzW2ldLm1heFZpZXdwb3J0WCA9IGluZm8udmlld3BvcnRfeG1heDsKLQkJbW9kZXNbaV0ubWF4Vmlld3BvcnRZID0gaW5mby52aWV3cG9ydF95bWF4OwotCQltb2Rlc1tpXS52aWV3cG9ydEZsYWdzID0gaW5mby52aWV3cG9ydF9mbGFnczsKLQkJbW9kZXNbaV0ucmVzZXJ2ZWQxID0gaW5mby5yZXNlcnZlZDE7Ci0JCW1vZGVzW2ldLnJlc2VydmVkMiA9IGluZm8ucmVzZXJ2ZWQyOwkKLQotCQlfWFJlYWQoZHB5LCBvZmZzZXQsIGluZm8ubmFtZV9zaXplKTsKLQkJbW9kZXNbaV0ubmFtZSA9IG9mZnNldDsKLQkJb2Zmc2V0ICs9IGluZm8ubmFtZV9zaXplOwotCSAgICAgIH0KLQkgICAgICAqbnVtID0gcmVwLm51bWJlcjsKLQkgICB9IGVsc2UKLQkJX1hFYXREYXRhKGRweSwgcmVwLmxlbmd0aCA8PCAyKTsKLQl9Ci0gICAgfQotCi0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLQotICAgIHJldHVybiBtb2RlczsKLX0KLQotCi1TRExfTkFNRShYREdBRGV2aWNlKSAqIAotU0RMX05BTUUoWERHQVNldE1vZGUpKAotICAgIERpc3BsYXkJKmRweSwKLSAgICBpbnQJCXNjcmVlbiwKLSAgICBpbnQJCW1vZGUKLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICpkaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKLSAgICB4WERHQVNldE1vZGVSZXBseSByZXA7Ci0gICAgeFhER0FTZXRNb2RlUmVxICpyZXE7Ci0gICAgU0RMX05BTUUoWERHQURldmljZSkgKmRldiA9IE5VTEw7Ci0gICAgUGl4bWFwIHBpZDsKLQotICAgIFhER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBkaW5mbywgTlVMTCk7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYREdBU2V0TW9kZSwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBkaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLSAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FTZXRNb2RlOwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICAgIHJlcS0+bW9kZSA9IG1vZGU7Ci0gICAgcmVxLT5waWQgPSBwaWQgPSBYQWxsb2NJRChkcHkpOwotICAgIAotICAgIGlmIChfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKLQlpZihyZXAubGVuZ3RoKSB7Ci0JICAgeFhER0FNb2RlSW5mbyBpbmZvOwotCSAgIGludCBzaXplOwotCi0JICAgc2l6ZSA9IHJlcC5sZW5ndGggPDwgMjsKLQkgICBzaXplIC09IHN6X3hYREdBTW9kZUluZm87IC8qIGdldCB0ZXh0IHNpemUgKi8KLQotCSAgIGRldiA9IChTRExfTkFNRShYREdBRGV2aWNlKSopWG1hbGxvYyhzaXplb2YoU0RMX05BTUUoWERHQURldmljZSkpICsgc2l6ZSk7Ci0JICAgIAotCSAgIGlmKGRldikgewotCQlfWFJlYWQoZHB5LCAoY2hhciopKCZpbmZvKSwgc3pfeFhER0FNb2RlSW5mbyk7Ci0KLQkJZGV2LT5tb2RlLm51bSA9IGluZm8ubnVtOwotCQlkZXYtPm1vZGUudmVydGljYWxSZWZyZXNoID0gCi0JCQkJKGZsb2F0KWluZm8udnN5bmNfbnVtIC8gKGZsb2F0KWluZm8udnN5bmNfZGVuOwotCQlkZXYtPm1vZGUuZmxhZ3MgPSBpbmZvLmZsYWdzOwotCQlkZXYtPm1vZGUuaW1hZ2VXaWR0aCA9IGluZm8uaW1hZ2Vfd2lkdGg7Ci0JCWRldi0+bW9kZS5pbWFnZUhlaWdodCA9IGluZm8uaW1hZ2VfaGVpZ2h0OwotCQlkZXYtPm1vZGUucGl4bWFwV2lkdGggPSBpbmZvLnBpeG1hcF93aWR0aDsKLQkJZGV2LT5tb2RlLnBpeG1hcEhlaWdodCA9IGluZm8ucGl4bWFwX2hlaWdodDsKLQkJZGV2LT5tb2RlLmJ5dGVzUGVyU2NhbmxpbmUgPSBpbmZvLmJ5dGVzX3Blcl9zY2FubGluZTsKLQkJZGV2LT5tb2RlLmJ5dGVPcmRlciA9IGluZm8uYnl0ZV9vcmRlcjsKLQkJZGV2LT5tb2RlLmRlcHRoID0gaW5mby5kZXB0aDsKLQkJZGV2LT5tb2RlLmJpdHNQZXJQaXhlbCA9IGluZm8uYnBwOwotCQlkZXYtPm1vZGUucmVkTWFzayA9IGluZm8ucmVkX21hc2s7Ci0JCWRldi0+bW9kZS5ncmVlbk1hc2sgPSBpbmZvLmdyZWVuX21hc2s7Ci0JCWRldi0+bW9kZS5ibHVlTWFzayA9IGluZm8uYmx1ZV9tYXNrOwotCQlkZXYtPm1vZGUudmlzdWFsQ2xhc3MgPSBpbmZvLnZpc3VhbF9jbGFzczsKLQkJZGV2LT5tb2RlLnZpZXdwb3J0V2lkdGggPSBpbmZvLnZpZXdwb3J0X3dpZHRoOwotCQlkZXYtPm1vZGUudmlld3BvcnRIZWlnaHQgPSBpbmZvLnZpZXdwb3J0X2hlaWdodDsKLQkJZGV2LT5tb2RlLnhWaWV3cG9ydFN0ZXAgPSBpbmZvLnZpZXdwb3J0X3hzdGVwOwotCQlkZXYtPm1vZGUueVZpZXdwb3J0U3RlcCA9IGluZm8udmlld3BvcnRfeXN0ZXA7Ci0JCWRldi0+bW9kZS5tYXhWaWV3cG9ydFggPSBpbmZvLnZpZXdwb3J0X3htYXg7Ci0JCWRldi0+bW9kZS5tYXhWaWV3cG9ydFkgPSBpbmZvLnZpZXdwb3J0X3ltYXg7Ci0JCWRldi0+bW9kZS52aWV3cG9ydEZsYWdzID0gaW5mby52aWV3cG9ydF9mbGFnczsKLQkJZGV2LT5tb2RlLnJlc2VydmVkMSA9IGluZm8ucmVzZXJ2ZWQxOwotCQlkZXYtPm1vZGUucmVzZXJ2ZWQyID0gaW5mby5yZXNlcnZlZDI7Ci0KLQkJZGV2LT5tb2RlLm5hbWUgPSAoY2hhciopKCZkZXZbMV0pOwkKLQkJX1hSZWFkKGRweSwgZGV2LT5tb2RlLm5hbWUsIGluZm8ubmFtZV9zaXplKTsKLQotCQlkZXYtPnBpeG1hcCA9IChyZXAuZmxhZ3MgJiBYREdBUGl4bWFwKSA/IHBpZCA6IDA7Ci0JCWRldi0+ZGF0YSA9IFNETF9OQU1FKFhER0FHZXRNYXBwZWRNZW1vcnkpKHNjcmVlbik7Ci0KLQkJaWYoZGV2LT5kYXRhKQotCQkgICAgZGV2LT5kYXRhICs9IHJlcC5vZmZzZXQ7Ci0JICAgfSAKLQkgICAvKiBub3Qgc3VyZSB3aGF0IHRvIGRvIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzICovCi0JfQotICAgIH0KLQotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0KLSAgICByZXR1cm4gZGV2OwotfQotCi0KLXZvaWQgU0RMX05BTUUoWERHQVNldFZpZXdwb3J0KSgKLSAgICBEaXNwbGF5CSpkcHksCi0gICAgaW50CQlzY3JlZW4sCi0gICAgaW50CQl4LAotICAgIGludAkJeSwKLSAgICBpbnQJCWZsYWdzCi0pewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKLSAgICB4WERHQVNldFZpZXdwb3J0UmVxICpyZXE7Ci0KLSAgICBYZXh0U2ltcGxlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgU0RMX05BTUUoeGRnYV9leHRlbnNpb25fbmFtZSkpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWERHQVNldFZpZXdwb3J0LCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBU2V0Vmlld3BvcnQ7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgcmVxLT54ID0geDsKLSAgICByZXEtPnkgPSB5OwotICAgIHJlcS0+ZmxhZ3MgPSBmbGFnczsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotfQotCi0KLXZvaWQgU0RMX05BTUUoWERHQUluc3RhbGxDb2xvcm1hcCkoCi0gICAgRGlzcGxheQkqZHB5LAotICAgIGludAkJc2NyZWVuLAotICAgIENvbG9ybWFwCWNtYXAKLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotICAgIHhYREdBSW5zdGFsbENvbG9ybWFwUmVxICpyZXE7Ci0KLSAgICBYZXh0U2ltcGxlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgU0RMX05BTUUoeGRnYV9leHRlbnNpb25fbmFtZSkpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWERHQUluc3RhbGxDb2xvcm1hcCwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWERHQUluc3RhbGxDb2xvcm1hcDsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICByZXEtPmNtYXAgPSBjbWFwOwotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci19Ci0KLXZvaWQgU0RMX05BTUUoWERHQVNlbGVjdElucHV0KSgKLSAgICBEaXNwbGF5CSpkcHksCi0gICAgaW50CQlzY3JlZW4sCi0gICAgbG9uZwltYXNrCi0pewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKLSAgICB4WERHQVNlbGVjdElucHV0UmVxICpyZXE7Ci0KLSAgICBYZXh0U2ltcGxlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgU0RMX05BTUUoeGRnYV9leHRlbnNpb25fbmFtZSkpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWERHQVNlbGVjdElucHV0LCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBU2VsZWN0SW5wdXQ7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgcmVxLT5tYXNrID0gbWFzazsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotfQotCi12b2lkIFNETF9OQU1FKFhER0FGaWxsUmVjdGFuZ2xlKSgKLSAgICBEaXNwbGF5CSpkcHksCi0gICAgaW50CQlzY3JlZW4sCi0gICAgaW50CQl4LAotICAgIGludAkJeSwKLSAgICB1bnNpZ25lZCBpbnQJd2lkdGgsCi0gICAgdW5zaWduZWQgaW50CWhlaWdodCwKLSAgICB1bnNpZ25lZCBsb25nCWNvbG9yCi0pewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKLSAgICB4WERHQUZpbGxSZWN0YW5nbGVSZXEgKnJlcTsKLQotICAgIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBTRExfTkFNRSh4ZGdhX2V4dGVuc2lvbl9uYW1lKSk7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYREdBRmlsbFJlY3RhbmdsZSwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWERHQUZpbGxSZWN0YW5nbGU7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgcmVxLT54ID0geDsKLSAgICByZXEtPnkgPSB5OwotICAgIHJlcS0+d2lkdGggPSB3aWR0aDsKLSAgICByZXEtPmhlaWdodCA9IGhlaWdodDsKLSAgICByZXEtPmNvbG9yID0gY29sb3I7Ci0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLX0KLQotdm9pZCBTRExfTkFNRShYREdBQ29weUFyZWEpKAotICAgIERpc3BsYXkJKmRweSwKLSAgICBpbnQJCXNjcmVlbiwKLSAgICBpbnQJCXNyY3gsCi0gICAgaW50CQlzcmN5LAotICAgIHVuc2lnbmVkIGludAl3aWR0aCwKLSAgICB1bnNpZ25lZCBpbnQJaGVpZ2h0LAotICAgIGludAkJZHN0eCwKLSAgICBpbnQJCWRzdHkKLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotICAgIHhYREdBQ29weUFyZWFSZXEgKnJlcTsKLQotICAgIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBTRExfTkFNRSh4ZGdhX2V4dGVuc2lvbl9uYW1lKSk7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYREdBQ29weUFyZWEsIHJlcSk7Ci0gICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLSAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FDb3B5QXJlYTsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICByZXEtPnNyY3ggPSBzcmN4OwotICAgIHJlcS0+c3JjeSA9IHNyY3k7Ci0gICAgcmVxLT53aWR0aCA9IHdpZHRoOwotICAgIHJlcS0+aGVpZ2h0ID0gaGVpZ2h0OwotICAgIHJlcS0+ZHN0eCA9IGRzdHg7Ci0gICAgcmVxLT5kc3R5ID0gZHN0eTsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotfQotCi12b2lkIFNETF9OQU1FKFhER0FDb3B5VHJhbnNwYXJlbnRBcmVhKSgKLSAgICBEaXNwbGF5CSpkcHksCi0gICAgaW50CQlzY3JlZW4sCi0gICAgaW50CQlzcmN4LAotICAgIGludAkJc3JjeSwKLSAgICB1bnNpZ25lZCBpbnQJd2lkdGgsCi0gICAgdW5zaWduZWQgaW50CWhlaWdodCwKLSAgICBpbnQJCWRzdHgsCi0gICAgaW50CQlkc3R5LAotICAgIHVuc2lnbmVkIGxvbmcga2V5Ci0pewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKLSAgICB4WERHQUNvcHlUcmFuc3BhcmVudEFyZWFSZXEgKnJlcTsKLQotICAgIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBTRExfTkFNRSh4ZGdhX2V4dGVuc2lvbl9uYW1lKSk7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYREdBQ29weVRyYW5zcGFyZW50QXJlYSwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWERHQUNvcHlUcmFuc3BhcmVudEFyZWE7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgcmVxLT5zcmN4ID0gc3JjeDsKLSAgICByZXEtPnNyY3kgPSBzcmN5OwotICAgIHJlcS0+d2lkdGggPSB3aWR0aDsKLSAgICByZXEtPmhlaWdodCA9IGhlaWdodDsKLSAgICByZXEtPmRzdHggPSBkc3R4OwotICAgIHJlcS0+ZHN0eSA9IGRzdHk7Ci0gICAgcmVxLT5rZXkgPSBrZXk7Ci0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLX0KLQotCi1pbnQgU0RMX05BTUUoWERHQUdldFZpZXdwb3J0U3RhdHVzKSgKLSAgICBEaXNwbGF5ICpkcHksCi0gICAgaW50IHNjcmVlbiAKLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotICAgIHhYREdBR2V0Vmlld3BvcnRTdGF0dXNSZXBseSByZXA7Ci0gICAgeFhER0FHZXRWaWV3cG9ydFN0YXR1c1JlcSAqcmVxOwotICAgIGludCBzdGF0dXMgPSAwOwotCi0gICAgWERHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIDApOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWERHQUdldFZpZXdwb3J0U3RhdHVzLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBR2V0Vmlld3BvcnRTdGF0dXM7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpCi0Jc3RhdHVzID0gcmVwLnN0YXR1czsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgU0RMX05BTUUoWERHQVN5bmMpKAotICAgIERpc3BsYXkgKmRweSwKLSAgICBpbnQgc2NyZWVuIAotKXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhER0FTeW5jUmVwbHkgcmVwOwotICAgIHhYREdBU3luY1JlcSAqcmVxOwotCi0gICAgWGV4dFNpbXBsZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIFNETF9OQU1FKHhkZ2FfZXh0ZW5zaW9uX25hbWUpKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgR2V0UmVxKFhER0FTeW5jLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBU3luYzsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICBfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSk7Ci0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLX0KLQotCi12b2lkIFNETF9OQU1FKFhER0FDaGFuZ2VQaXhtYXBNb2RlKSgKLSAgICBEaXNwbGF5ICpkcHksCi0gICAgaW50IHNjcmVlbiwKLSAgICBpbnQgKngsCi0gICAgaW50ICp5LAotICAgIGludCBtb2RlIAotKXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7Ci0gICAgeFhER0FDaGFuZ2VQaXhtYXBNb2RlUmVxICpyZXE7Ci0gICAgeFhER0FDaGFuZ2VQaXhtYXBNb2RlUmVwbHkgcmVwOwotCi0gICAgWGV4dFNpbXBsZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIFNETF9OQU1FKHhkZ2FfZXh0ZW5zaW9uX25hbWUpKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgR2V0UmVxKFhER0FDaGFuZ2VQaXhtYXBNb2RlLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBQ2hhbmdlUGl4bWFwTW9kZTsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICByZXEtPnggPSAqeDsKLSAgICByZXEtPnkgPSAqeTsKLSAgICByZXEtPmZsYWdzID0gbW9kZTsKLSAgICBfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSk7Ci0gICAgKnggPSByZXAueDsKLSAgICAqeSA9IHJlcC55OwotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci19Ci0KLUNvbG9ybWFwIFNETF9OQU1FKFhER0FDcmVhdGVDb2xvcm1hcCkoCi0gICAgRGlzcGxheSAqZHB5LAotICAgIGludCBzY3JlZW4sCi0gICAgU0RMX05BTUUoWERHQURldmljZSkgKmRldiwKLSAgICBpbnQJYWxsb2MKLSl7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOwotICAgIHhYREdBQ3JlYXRlQ29sb3JtYXBSZXEgKnJlcTsKLSAgICBDb2xvcm1hcCBjaWQ7Ci0KLSAgICBYREdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgLTEpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWERHQUNyZWF0ZUNvbG9ybWFwLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBQ3JlYXRlQ29sb3JtYXA7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgcmVxLT5tb2RlID0gZGV2LT5tb2RlLm51bTsKLSAgICByZXEtPmFsbG9jID0gYWxsb2M7Ci0gICAgY2lkID0gcmVxLT5pZCA9IFhBbGxvY0lEKGRweSk7Ci0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLQotICAgIHJldHVybiBjaWQ7Ci19Ci0KLQotdm9pZCBTRExfTkFNRShYREdBS2V5RXZlbnRUb1hLZXlFdmVudCkoCi0gICAgU0RMX05BTUUoWERHQUtleUV2ZW50KSogZGssIAotICAgIFhLZXlFdmVudCogeGsKLSl7Ci0gICAgeGstPnR5cGUgPSBkay0+dHlwZTsKLSAgICB4ay0+c2VyaWFsID0gZGstPnNlcmlhbDsKLSAgICB4ay0+c2VuZF9ldmVudCA9IEZhbHNlOwotICAgIHhrLT5kaXNwbGF5ID0gZGstPmRpc3BsYXk7Ci0gICAgeGstPndpbmRvdyA9IFJvb3RXaW5kb3coZGstPmRpc3BsYXksIGRrLT5zY3JlZW4pOwotICAgIHhrLT5yb290ID0geGstPndpbmRvdzsKLSAgICB4ay0+c3Vid2luZG93ID0gTm9uZTsKLSAgICB4ay0+dGltZSA9IGRrLT50aW1lOwotICAgIHhrLT54ID0geGstPnkgPSB4ay0+eF9yb290ID0geGstPnlfcm9vdCA9IDA7Ci0gICAgeGstPnN0YXRlID0gZGstPnN0YXRlOwotICAgIHhrLT5rZXljb2RlID0gZGstPmtleWNvZGU7Ci0gICAgeGstPnNhbWVfc2NyZWVuID0gVHJ1ZTsKLX0KLQotI2luY2x1ZGUgPFgxMS9YbWQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWYgZGVmaW5lZChJU0MpIAotIyBkZWZpbmUgSEFTX1NWUjNfTU1BUAotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8ZXJybm8uaD4KLQotIyBpbmNsdWRlIDxzeXMvYXRfYW5zaS5oPgotIyBpbmNsdWRlIDxzeXMva2QuaD4KLQotIyBpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+Ci0jIGluY2x1ZGUgPHN5cy9pbW11Lmg+Ci0jIGluY2x1ZGUgPHN5cy9yZWdpb24uaD4KLQotIyBpbmNsdWRlIDxzeXMvbW1hcC5oPgotI2Vsc2UKLSMgaWYgIWRlZmluZWQoTHlueCkKLSMgIGlmICFkZWZpbmVkKF9fRU1YX18pCi0jICAgaW5jbHVkZSA8c3lzL21tYW4uaD4KLSMgIGVuZGlmCi0jIGVsc2UKLSMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyAgaW5jbHVkZSA8ZXJybm8uaD4KLSMgIGluY2x1ZGUgPHNtZW0uaD4KLSMgZW5kaWYKLSNlbmRpZgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpZiBkZWZpbmVkKFNWUjQpICYmICFkZWZpbmVkKHN1bikgJiYgIWRlZmluZWQoU0NPMzI1KQotI2RlZmluZSBERVZfTUVNICIvZGV2L3BtZW0iCi0jZWxpZiBkZWZpbmVkKFNWUjQpICYmIGRlZmluZWQoc3VuKQotI2RlZmluZSBERVZfTUVNICIvZGV2L3hzdmMiCi0jZWxzZQotI2RlZmluZSBERVZfTUVNICIvZGV2L21lbSIKLSNlbmRpZgotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX0RHQU1hcFJlY3sKLSAgdW5zaWduZWQgY2hhciAqcGh5c2ljYWw7Ci0gIHVuc2lnbmVkIGNoYXIgKnZpcnR1YWw7Ci0gIENBUkQzMiBzaXplOwotICBpbnQgZmQ7Ci0gIGludCBzY3JlZW47Ci0gIHN0cnVjdCBfREdBTWFwUmVjICpuZXh0OwotfSBER0FNYXBSZWMsICpER0FNYXBQdHI7Ci0KLXN0YXRpYyBCb29sCi1ER0FNYXBQaHlzaWNhbChpbnQsIGNoYXIqLCB1bnNpZ25lZCBjaGFyKiwgQ0FSRDMyLCBDQVJEMzIsIENBUkQzMiwgREdBTWFwUHRyKTsgCi1zdGF0aWMgdm9pZCBER0FVbm1hcFBoeXNpY2FsKERHQU1hcFB0cik7Ci0KLXN0YXRpYyBER0FNYXBQdHIgX01hcHMgPSBOVUxMOwotCi0KLXVuc2lnbmVkIGNoYXIqCi1TRExfTkFNRShYREdBR2V0TWFwcGVkTWVtb3J5KShpbnQgc2NyZWVuKQotewotICAgIERHQU1hcFB0ciBwTWFwID0gX01hcHM7Ci0gICAgdW5zaWduZWQgY2hhciAqcG50ciA9IE5VTEw7Ci0KLSAgICB3aGlsZShwTWFwICE9IE5VTEwpIHsKLQlpZihwTWFwLT5zY3JlZW4gPT0gc2NyZWVuKSB7Ci0JICAgIHBudHIgPSBwTWFwLT52aXJ0dWFsOwotCSAgICBicmVhazsKLQl9Ci0JcE1hcCA9IHBNYXAtPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBudHI7Ci19Ci0KLUJvb2wKLVNETF9OQU1FKFhER0FNYXBGcmFtZWJ1ZmZlcikoCi0gICBpbnQgc2NyZWVuLAotICAgY2hhciAqbmFtZSwJCQkvKiBvcHRpb25hbCBkZXZpY2UgbmFtZSAqLwotICAgdW5zaWduZWQgY2hhciogYmFzZSwJCS8qIHBoeXNpY2FsIG1lbW9yeSAqLwotICAgQ0FSRDMyIHNpemUsCQkJLyogc2l6ZSAqLwotICAgQ0FSRDMyIG9mZnNldCwJCS8qIG9wdGlvbmFsIG9mZnNldCAqLwotICAgQ0FSRDMyIGV4dHJhCQkJLyogb3B0aW9uYWwgZXh0cmEgZGF0YSAqLwotKXsKLSAgIERHQU1hcFB0ciBwTWFwID0gX01hcHM7Ci0gICBCb29sIHJlc3VsdDsKLSAgIAotICAgLyogaXMgaXQgYWxyZWFkeSBtYXBwZWQgPyAqLwotICAgd2hpbGUocE1hcCAhPSBOVUxMKSB7Ci0gICAgIGlmKHBNYXAtPnNjcmVlbiA9PSBzY3JlZW4pCi0JcmV0dXJuIFRydWU7Ci0gICAgIHBNYXAgPSBwTWFwLT5uZXh0OwotICAgfQotCi0gICBpZihleHRyYSAmIFhER0FOZWVkUm9vdCkgewotICAgIC8qIHdlIHNob3VsZCBwcm9iYWJseSBjaGVjayBpZiB3ZSBoYXZlIHJvb3QgcGVybWlzc2lvbnMgYW5kCi0gICAgICAgcmV0dXJuIEZhbHNlIGhlcmUgKi8KLQotICAgfQotCi0gICBwTWFwID0gKERHQU1hcFB0cilYbWFsbG9jKHNpemVvZihER0FNYXBSZWMpKTsKLQotICAgcmVzdWx0ID0gREdBTWFwUGh5c2ljYWwoc2NyZWVuLCBuYW1lLCBiYXNlLCBzaXplLCBvZmZzZXQsIGV4dHJhLCBwTWFwKTsKLQotICAgaWYocmVzdWx0KSB7Ci0gICAgICBwTWFwLT5uZXh0ID0gX01hcHM7Ci0gICAgICBfTWFwcyA9IHBNYXA7Ci0gICB9IGVsc2UgCi0gICAgICBYZnJlZShwTWFwKTsKLSAgIAotICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZAotU0RMX05BTUUoWERHQVVubWFwRnJhbWVidWZmZXIpKGludCBzY3JlZW4pCi17Ci0gICBER0FNYXBQdHIgcE1hcCA9IF9NYXBzOwotICAgREdBTWFwUHRyIHBQcmV2ID0gTlVMTDsKLQotICAgLyogaXMgaXQgYWxyZWFkeSBtYXBwZWQgKi8KLSAgICB3aGlsZShwTWFwICE9IE5VTEwpIHsKLQlpZihwTWFwLT5zY3JlZW4gPT0gc2NyZWVuKQotCSAgICBicmVhazsKLQlwUHJldiA9IHBNYXA7Ci0JcE1hcCA9IHBNYXAtPm5leHQ7Ci0gICAgfQotCi0gICAgaWYoIXBNYXApCi0JcmV0dXJuOwotCi0gICAgREdBVW5tYXBQaHlzaWNhbChwTWFwKTsKLQotICAgIGlmKCFwUHJldikKLQlfTWFwcyA9IHBNYXAtPm5leHQ7Ci0gICAgZWxzZQotCXBQcmV2LT5uZXh0ID0gcE1hcC0+bmV4dDsKLQotICAgIFhmcmVlKHBNYXApOwotfQotCi0KLXN0YXRpYyBCb29sCi1ER0FNYXBQaHlzaWNhbCgKLSAgIGludCBzY3JlZW4sCi0gICBjaGFyICpuYW1lLAkJCS8qIG9wdGlvbmFsIGRldmljZSBuYW1lICovCi0gICB1bnNpZ25lZCBjaGFyKiBiYXNlLAkJLyogcGh5c2ljYWwgbWVtb3J5ICovCi0gICBDQVJEMzIgc2l6ZSwJCQkvKiBzaXplICovCi0gICBDQVJEMzIgb2Zmc2V0LAkJLyogb3B0aW9uYWwgb2Zmc2V0ICovCi0gICBDQVJEMzIgZXh0cmEsCQkvKiBvcHRpb25hbCBleHRyYSBkYXRhICovCi0gICBER0FNYXBQdHIgcE1hcAotKSB7Ci0jaWYgZGVmaW5lZChJU0MpICYmIGRlZmluZWQoSEFTX1NWUjNfTU1BUCkKLSAgICBzdHJ1Y3Qga2RfbWVtbG9jIG1sb2M7Ci0jZWxpZiBkZWZpbmVkKF9fRU1YX18pCi0gICAgQVBJUkVUIHJjOwotICAgIFVMT05HIGFjdGlvbjsKLSAgICBIRklMRSBoZmQ7Ci0jZW5kaWYKLSAgCi0gICAgYmFzZSArPSBvZmZzZXQ7Ci0KLSAgICBwTWFwLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgcE1hcC0+cGh5c2ljYWwgPSBiYXNlOwotICAgIHBNYXAtPnNpemUgPSBzaXplOwotCi0jaWYgZGVmaW5lZChJU0MpICYmIGRlZmluZWQoSEFTX1NWUjNfTU1BUCkKLSAgICBpZiAoKHBNYXAtPmZkID0gb3BlbigiL2Rldi9tbWFwIiwgT19SRFdSKSkgPCAwKQotCXJldHVybiBGYWxzZTsKLSAgICBtbG9jLnZhZGRyID0gKGNoYXIgKikwOwotICAgIG1sb2MucGh5c2FkZHIgPSAoY2hhciAqKWJhc2U7Ci0gICAgbWxvYy5sZW5ndGggPSBzaXplOwotICAgIG1sb2MuaW9mbGc9MTsKLQotICAgIGlmICgocE1hcC0+dmlydHVhbCA9ICh2b2lkICopaW9jdGwocE1hcC0+ZmQsIE1BUCwgJm1sb2MpKSA9PSAodm9pZCAqKS0xKQotCXJldHVybiBGYWxzZTsKLSNlbGlmIGRlZmluZWQgKF9fRU1YX18pCi0gICAgLyoKLSAgICAgKiBEcmFnb24gd2FybmluZyBoZXJlISAvZGV2L3BtYXAkIGlzIG5ldmVyIGNsb3NlZCwgZXhjZXB0IG9uIHByb2dhbSBleGl0LgotICAgICAqIENvbnNlY3V0aXZlIGNhbGxpbmcgb2YgdGhpcyByb3V0aW5lIHdpbGwgbWFrZSBQTUFQJCBkcml2ZXIgcnVuIG91dAotICAgICAqIG9mIG1lbW9yeSBoYW5kbGVzLiBTb21lIHVtYXAvY2xvc2UgbWVjaGFuaXNtIHNob3VsZCBiZSBwcm92aWRlZAotICAgICAqLwotCi0gICAgcmMgPSBEb3NPcGVuKCIvZGV2L3BtYXAkIiwgJmhmZCwgJmFjdGlvbiwgMCwgRklMRV9OT1JNQUwsIEZJTEVfT1BFTiwKLQkJIE9QRU5fQUNDRVNTX1JFQURXUklURSB8IE9QRU5fU0hBUkVfREVOWU5PTkUsIChQRUFPUDIpTlVMTCk7Ci0gICAgaWYgKHJjICE9IDApCi0JcmV0dXJuIEZhbHNlOwotICAgIHsKLQlzdHJ1Y3QgbWFwX2lvY3RsIHsKLQkJdW5pb24gewotCQkJVUxPTkcgcGh5czsKLQkJCXZvaWQqIHVzZXI7Ci0JCX0gYTsKLQkJVUxPTkcgc2l6ZTsKLQl9IHBtYXAsZG1hcDsKLQlVTE9ORyBwbGVuLGRsZW47Ci0jZGVmaW5lIFhGUkVFODZfUE1BUAkweDc2Ci0jZGVmaW5lIFBNQVBfTUFQCTB4NDQKLQotCXBtYXAuYS5waHlzID0gYmFzZTsKLQlwbWFwLnNpemUgPSBzaXplOwotCXJjID0gRG9zRGV2SU9DdGwoaGZkLCBYRlJFRTg2X1BNQVAsIFBNQVBfTUFQLAotCQkJIChQVUxPTkcpJnBtYXAsIHNpemVvZihwbWFwKSwgJnBsZW4sCi0JCQkgKFBVTE9ORykmZG1hcCwgc2l6ZW9mKGRtYXApLCAmZGxlbik7Ci0JaWYgKHJjID09IDApIHsKLQkJcE1hcC0+dmlydHVhbCA9IGRtYXAuYS51c2VyOwotCX0KLSAgIH0KLSAgIGlmIChyYyAhPSAwKQotCXJldHVybiBGYWxzZTsKLSNlbGlmIGRlZmluZWQgKEx5bngpCi0gICAgcE1hcC0+dmlydHVhbCA9IHNtZW1fY3JlYXRlKCJYRjg2REdBIiwgKGNoYXIqKWJhc2UsIHNpemUsIFNNX1JFQUR8U01fV1JJVEUpOwotI2Vsc2UKLSNpZm5kZWYgTUFQX0ZJTEUKLSNkZWZpbmUgTUFQX0ZJTEUgMAotI2VuZGlmCi0gICAgaWYgKCFuYW1lKQotCSAgICBuYW1lID0gREVWX01FTTsKLSAgICBpZiAoKHBNYXAtPmZkID0gb3BlbihuYW1lLCBPX1JEV1IpKSA8IDApCi0jaWYgZGVmaW5lZChFTkFCTEVfRkJDT04pCi0gICAgeyAvKiAvZGV2L2ZiMCBmYWxsYmFjayBhZGRlZCBieSBTYW0gTGFudGluZ2EgPGhlcmN1bGVzQGxva2lnYW1lcy5jb20+ICovCi0gICAgICAgIC8qIFRyeSB0byBmYWxsIGJhY2sgdG8gL2Rldi9mYiBvbiBMaW51eCAtIEZJWE1FOiB2ZXJpZnkgdGhlIGRldmljZSAqLwotICAgICAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gZmluZm87Ci0KLSAgICAgICAgaWYgKChwTWFwLT5mZCA9IG9wZW4oIi9kZXYvZmIwIiwgT19SRFdSKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogVGhlIHVzZWFibGUgZnJhbWVidWZmZXIgY29uc29sZSBtZW1vcnkgbWF5IG5vdCBiZSB0aGUgd2hvbGUKLSAgICAgICAgICAgZnJhbWVidWZmZXIgdGhhdCBYIGhhcyBhY2Nlc3MgdG8uIDotKAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBpb2N0bChwTWFwLT5mZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywgJmZpbmZvKSA8IDAgKSB7Ci0gICAgICAgICAgICBjbG9zZShwTWFwLT5mZCk7Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogV2FybmluZzogT24gUFBDLCB0aGUgc2l6ZSBhbmQgdmlydHVhbCBuZWVkIHRvIGJlIG9mZnNldCBieToKLSAgICAgICAgICAgKCgobG9uZylmaW5mby5zbWVtX3N0YXJ0KSAtCi0gICAgICAgICAgICgoKGxvbmcpZmluZm8uc21lbV9zdGFydCkmfihQQUdFX1NJWkUtMSkpKQotICAgICAgICAgKi8KLSAgICAgICAgYmFzZSA9IDA7Ci0gICAgICAgIHNpemUgPSBwTWFwLT5zaXplID0gZmluZm8uc21lbV9sZW47Ci0gICAgfQotI2Vsc2UKLQlyZXR1cm4gRmFsc2U7Ci0jZW5kaWYKLSAgICBwTWFwLT52aXJ0dWFsID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCAKLQkJCU1BUF9GSUxFIHwgTUFQX1NIQVJFRCwgcE1hcC0+ZmQsIChvZmZfdCliYXNlKTsKLSAgICBpZiAocE1hcC0+dmlydHVhbCA9PSAodm9pZCAqKS0xKQotCXJldHVybiBGYWxzZTsKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSVNDKSAmJiAhZGVmaW5lZChIQVNfU1ZSM19NTUFQKSAmJiAhZGVmaW5lZChMeW54KSBcCi0JJiYgIWRlZmluZWQoX19FTVhfXykKLSAgICBtcHJvdGVjdChwTWFwLT52aXJ0dWFsLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIFRydWU7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZAotREdBVW5tYXBQaHlzaWNhbChER0FNYXBQdHIgcE1hcCkKLXsKLSNpZiAhZGVmaW5lZChJU0MpICYmICFkZWZpbmVkKEhBU19TVlIzX01NQVApICYmICFkZWZpbmVkKEx5bngpIFwKLQkmJiAhZGVmaW5lZChfX0VNWF9fKQotICAgIG1wcm90ZWN0KHBNYXAtPnZpcnR1YWwscE1hcC0+c2l6ZSwgUFJPVF9SRUFEKTsKLSNlbGlmIGRlZmluZWQoTHlueCkKLQkvKiBYWFggdGhpcyBkb2Vzbid0IGFsbG93IGVuYWJsZSBhZnRlciBkaXNhYmxlICovCi0gICAgc21lbV9jcmVhdGUoTlVMTCwgcE1hcC0+dmlydHVhbCwgcE1hcC0+c2l6ZSwgU01fREVUQUNIKTsKLSAgICBzbWVtX3JlbW92ZSgiWEY4NkRHQSIpOwotI2VuZGlmCi0KLQotICAgLyogV2UgbmVlZCB0byB1bm1hcCBhbmQgY2xvc2UgdG9vICEhISEhISEhISEqLwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L1h4Zjg2dm0vWEY4NlZNb2RlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWHhmODZ2bS9YRjg2Vk1vZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwMTk5MS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWHhmODZ2bS9YRjg2Vk1vZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMjMgKzAsMCBAQAotLyogJFhDb25zb3J0aXVtOiBYRjg2Vk1vZGUuYyAvbWFpbi8yIDE5OTUvMTEvMTQgMTg6MTc6NTgga2FsZWIgJCAqLwotLyogJFhGcmVlODY6IHhjL2xpYi9YeGY4NnZtL1hGODZWTW9kZS5jLHYgMy4zMiAyMDAxLzA3LzI1IDE1OjA0OjU0IGRhd2VzIEV4cCAkICovCi0vKgotCi1Db3B5cmlnaHQgKGMpIDE5OTUgIEthbGViIFMuIEtFSVRITEVZCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0iU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi13aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi1kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLXBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQotaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi1JTiBOTyBFVkVOVCBTSEFMTCBLYWxlYiBTLiBLRUlUSExFWSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyAKLU9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi1PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLUV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIEthbGViIFMuIEtFSVRITEVZIAotc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSAKLW9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLWZyb20gS2FsZWIgUy4gS0VJVEhMRVkuCi0KLSovCi0vKiAkWENvbnNvcnRpdW06IFhGODZWTW9kZS5jIC9tYWluLzQgMTk5Ni8wMS8xNiAwNzo1MjoyNSBrYWxlYiBDSEVDS0VET1VUICQgKi8KLQotLyogVEhJUyBJUyBOT1QgQU4gWCBDT05TT1JUSVVNIFNUQU5EQVJEICovCi0KLSNkZWZpbmUgTkVFRF9FVkVOVFMKLSNkZWZpbmUgTkVFRF9SRVBMSUVTCi0KLSNpZm5kZWYgWEJVSUxEX0lOX0NMSUVOVAotI2luY2x1ZGUgPFgxMS9YbGliaW50Lmg+Ci0jaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy94Zjg2dm1zdHIuaCIKLSNpbmNsdWRlICIuLi9leHRlbnNpb25zL1hleHQuaCIKLSNpbmNsdWRlICIuLi9leHRlbnNpb25zL2V4dHV0aWwuaCIKLSNlbHNlCi0jaW5jbHVkZSAibGliL1gxMS9YbGliaW50LmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9leHRlbnNpb25zL3hmODZ2bXN0ci5oIgotI2luY2x1ZGUgImluY2x1ZGUvZXh0ZW5zaW9ucy9YZXh0LmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9leHRlbnNpb25zL2V4dHV0aWwuaCIKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0KLSNpZm5kZWYgTU9ERV9CQUQKLSNkZWZpbmUgTU9ERV9CQUQgMjU1Ci0jZW5kaWYKLQotc3RhdGljIFhFeHRlbnNpb25JbmZvIF94Zjg2dmlkbW9kZV9pbmZvX2RhdGE7Ci1zdGF0aWMgWEV4dGVuc2lvbkluZm8gKnhmODZ2aWRtb2RlX2luZm8gPSAmX3hmODZ2aWRtb2RlX2luZm9fZGF0YTsKLXN0YXRpYyBjaGFyICp4Zjg2dmlkbW9kZV9leHRlbnNpb25fbmFtZSA9IFhGODZWSURNT0RFTkFNRTsKLQotI2RlZmluZSBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uKGRweSxpLHZhbCkgXAotICBYZXh0Q2hlY2tFeHRlbnNpb24gKGRweSwgaSwgeGY4NnZpZG1vZGVfZXh0ZW5zaW9uX25hbWUsIHZhbCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqCQkJICAgcHJpdmF0ZSB1dGlsaXR5IHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIFhFWFRfQ0xPU0VfRElTUExBWV9QUk9UTyhjbG9zZV9kaXNwbGF5KTsKLXN0YXRpYyAvKiBjb25zdCAqLyBYRXh0ZW5zaW9uSG9va3MgeGY4NnZpZG1vZGVfZXh0ZW5zaW9uX2hvb2tzID0gewotICAgIE5VTEwsCQkJCS8qIGNyZWF0ZV9nYyAqLwotICAgIE5VTEwsCQkJCS8qIGNvcHlfZ2MgKi8KLSAgICBOVUxMLAkJCQkvKiBmbHVzaF9nYyAqLwotICAgIE5VTEwsCQkJCS8qIGZyZWVfZ2MgKi8KLSAgICBOVUxMLAkJCQkvKiBjcmVhdGVfZm9udCAqLwotICAgIE5VTEwsCQkJCS8qIGZyZWVfZm9udCAqLwotICAgIGNsb3NlX2Rpc3BsYXksCQkJLyogY2xvc2VfZGlzcGxheSAqLwotICAgIE5VTEwsCQkJCS8qIHdpcmVfdG9fZXZlbnQgKi8KLSAgICBOVUxMLAkJCQkvKiBldmVudF90b193aXJlICovCi0gICAgTlVMTCwJCQkJLyogZXJyb3IgKi8KLSAgICBOVUxMLAkJCQkvKiBlcnJvcl9zdHJpbmcgKi8KLX07Ci0KLXN0YXRpYyBYRVhUX0dFTkVSQVRFX0ZJTkRfRElTUExBWSAoZmluZF9kaXNwbGF5LCB4Zjg2dmlkbW9kZV9pbmZvLCAKLQkJCQkgICB4Zjg2dmlkbW9kZV9leHRlbnNpb25fbmFtZSwgCi0JCQkJICAgJnhmODZ2aWRtb2RlX2V4dGVuc2lvbl9ob29rcywgCi0JCQkJICAgMCwgTlVMTCkKLQotc3RhdGljIFhFWFRfR0VORVJBVEVfQ0xPU0VfRElTUExBWSAoY2xvc2VfZGlzcGxheSwgeGY4NnZpZG1vZGVfaW5mbykKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoJCSAgICBwdWJsaWMgWEZyZWU4Ni1WaWRNb2RlIEV4dGVuc2lvbiByb3V0aW5lcyAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQm9vbAotU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeUV4dGVuc2lvbikgKGRweSwgZXZlbnRfYmFzZXAsIGVycm9yX2Jhc2VwKQotICAgIERpc3BsYXkgKmRweTsKLSAgICBpbnQgKmV2ZW50X2Jhc2VwLCAqZXJyb3JfYmFzZXA7Ci17Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOwotCi0gICAgaWYgKFhleHRIYXNFeHRlbnNpb24oaW5mbykpIHsKLQkqZXZlbnRfYmFzZXAgPSBpbmZvLT5jb2Rlcy0+Zmlyc3RfZXZlbnQ7Ci0JKmVycm9yX2Jhc2VwID0gaW5mby0+Y29kZXMtPmZpcnN0X2Vycm9yOwotCXJldHVybiBUcnVlOwotICAgIH0gZWxzZSB7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLX0KLQotQm9vbAotU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb24pCi0gICAgRGlzcGxheSogZHB5OwotICAgIGludCogbWFqb3JWZXJzaW9uOyAKLSAgICBpbnQqIG1pbm9yVmVyc2lvbjsKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlUXVlcnlWZXJzaW9uUmVwbHkgcmVwOwotICAgIHhYRjg2VmlkTW9kZVF1ZXJ5VmVyc2lvblJlcSAqcmVxOwotCi0gICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYRjg2VmlkTW9kZVF1ZXJ5VmVyc2lvbiwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZVF1ZXJ5VmVyc2lvbjsKLSAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgewotCVVubG9ja0Rpc3BsYXkoZHB5KTsKLQlTeW5jSGFuZGxlKCk7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLSAgICAqbWFqb3JWZXJzaW9uID0gcmVwLm1ham9yVmVyc2lvbjsKLSAgICAqbWlub3JWZXJzaW9uID0gcmVwLm1pbm9yVmVyc2lvbjsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIGlmICgqbWFqb3JWZXJzaW9uID49IDIpCi0JU0RMX05BTUUoWEY4NlZpZE1vZGVTZXRDbGllbnRWZXJzaW9uKShkcHkpOwotICAgIHJldHVybiBUcnVlOwotfQotCi1Cb29sCi1TRExfTkFNRShYRjg2VmlkTW9kZVNldENsaWVudFZlcnNpb24pKERpc3BsYXkgKmRweSkKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkoZHB5KTsKLSAgICB4WEY4NlZpZE1vZGVTZXRDbGllbnRWZXJzaW9uUmVxICpyZXE7Ci0KLSAgICBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NlZpZE1vZGVTZXRDbGllbnRWZXJzaW9uLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlU2V0Q2xpZW50VmVyc2lvbjsKLSAgICByZXEtPm1ham9yID0gWEY4NlZJRE1PREVfTUFKT1JfVkVSU0lPTjsKLSAgICByZXEtPm1pbm9yID0gWEY4NlZJRE1PREVfTUlOT1JfVkVSU0lPTjsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBUcnVlOwotfQotCi1Cb29sCi1TRExfTkFNRShYRjg2VmlkTW9kZVNldEdhbW1hKShEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIFNETF9OQU1FKFhGODZWaWRNb2RlR2FtbWEpICpHYW1tYSkKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkoZHB5KTsKLSAgICB4WEY4NlZpZE1vZGVTZXRHYW1tYVJlcSAqcmVxOwotCi0gICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbihkcHksIGluZm8sIEZhbHNlKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgR2V0UmVxKFhGODZWaWRNb2RlU2V0R2FtbWEsIHJlcSk7Ci0gICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLSAgICByZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVTZXRHYW1tYTsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICByZXEtPnJlZCA9IChDQVJEMzIpKEdhbW1hLT5yZWQgKiAxMDAwMC4pOwotICAgIHJlcS0+Z3JlZW4gPSAoQ0FSRDMyKShHYW1tYS0+Z3JlZW4gKiAxMDAwMC4pOwotICAgIHJlcS0+Ymx1ZSA9IChDQVJEMzIpKEdhbW1hLT5ibHVlICogMTAwMDAuKTsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBUcnVlOwotfQotCi1Cb29sCi1TRExfTkFNRShYRjg2VmlkTW9kZUdldEdhbW1hKShEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIFNETF9OQU1FKFhGODZWaWRNb2RlR2FtbWEpICpHYW1tYSkKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlR2V0R2FtbWFSZXBseSByZXA7Ci0gICAgeFhGODZWaWRNb2RlR2V0R2FtbWFSZXEgKnJlcTsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRHYW1tYSwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZUdldEdhbW1hOwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7Ci0JVW5sb2NrRGlzcGxheShkcHkpOwotCVN5bmNIYW5kbGUoKTsKLQlyZXR1cm4gRmFsc2U7Ci0gICAgfQotICAgIEdhbW1hLT5yZWQgPSAoKGZsb2F0KXJlcC5yZWQpIC8gMTAwMDAuOwotICAgIEdhbW1hLT5ncmVlbiA9ICgoZmxvYXQpcmVwLmdyZWVuKSAvIDEwMDAwLjsKLSAgICBHYW1tYS0+Ymx1ZSA9ICgoZmxvYXQpcmVwLmJsdWUpIC8gMTAwMDAuOwotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0KLUJvb2wKLVNETF9OQU1FKFhGODZWaWRNb2RlR2V0TW9kZUxpbmUpKGRweSwgc2NyZWVuLCBkb3RjbG9jaywgbW9kZWxpbmUpCi0gICAgRGlzcGxheSogZHB5OwotICAgIGludCBzY3JlZW47Ci0gICAgaW50KiBkb3RjbG9jazsgCi0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlTGluZSkqIG1vZGVsaW5lOwotewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKLSAgICB4WEY4NlZpZE1vZGVHZXRNb2RlTGluZVJlcGx5IHJlcDsKLSAgICB4WEY4Nk9sZFZpZE1vZGVHZXRNb2RlTGluZVJlcGx5IG9sZHJlcDsKLSAgICB4WEY4NlZpZE1vZGVHZXRNb2RlTGluZVJlcSAqcmVxOwotICAgIGludCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbjsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotICAgIFNETF9OQU1FKFhGODZWaWRNb2RlUXVlcnlWZXJzaW9uKShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRNb2RlTGluZSwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZUdldE1vZGVMaW5lOwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICAgIAotICAgIGlmIChtYWpvclZlcnNpb24gPCAyKSB7Ci0JaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZvbGRyZXAsIAotICAgICAgICAgICAgKFNJWkVPRih4WEY4Nk9sZFZpZE1vZGVHZXRNb2RlTGluZVJlcGx5KSAtIFNJWkVPRih4UmVwbHkpKSA+PiAyLCB4RmFsc2UpKSB7Ci0JICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLQkgICAgU3luY0hhbmRsZSgpOwotCSAgICByZXR1cm4gRmFsc2U7Ci0JfQotCSpkb3RjbG9jayA9IG9sZHJlcC5kb3RjbG9jazsKLQltb2RlbGluZS0+aGRpc3BsYXkgICA9IG9sZHJlcC5oZGlzcGxheTsKLQltb2RlbGluZS0+aHN5bmNzdGFydCA9IG9sZHJlcC5oc3luY3N0YXJ0OwotCW1vZGVsaW5lLT5oc3luY2VuZCAgID0gb2xkcmVwLmhzeW5jZW5kOwotCW1vZGVsaW5lLT5odG90YWwgICAgID0gb2xkcmVwLmh0b3RhbDsKLQltb2RlbGluZS0+aHNrZXcgICAgICA9IDA7Ci0JbW9kZWxpbmUtPnZkaXNwbGF5ICAgPSBvbGRyZXAudmRpc3BsYXk7Ci0JbW9kZWxpbmUtPnZzeW5jc3RhcnQgPSBvbGRyZXAudnN5bmNzdGFydDsKLQltb2RlbGluZS0+dnN5bmNlbmQgICA9IG9sZHJlcC52c3luY2VuZDsKLQltb2RlbGluZS0+dnRvdGFsICAgICA9IG9sZHJlcC52dG90YWw7Ci0JbW9kZWxpbmUtPmZsYWdzICAgICAgPSBvbGRyZXAuZmxhZ3M7Ci0JbW9kZWxpbmUtPnByaXZzaXplICAgPSBvbGRyZXAucHJpdnNpemU7Ci0gICAgfSBlbHNlIHsKLQlpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgCi0gICAgICAgICAgICAoU0laRU9GKHhYRjg2VmlkTW9kZUdldE1vZGVMaW5lUmVwbHkpIC0gU0laRU9GKHhSZXBseSkpID4+IDIsIHhGYWxzZSkpIHsKLQkgICAgVW5sb2NrRGlzcGxheShkcHkpOwotCSAgICBTeW5jSGFuZGxlKCk7Ci0JICAgIHJldHVybiBGYWxzZTsKLQl9Ci0JKmRvdGNsb2NrID0gcmVwLmRvdGNsb2NrOwotCW1vZGVsaW5lLT5oZGlzcGxheSAgID0gcmVwLmhkaXNwbGF5OwotCW1vZGVsaW5lLT5oc3luY3N0YXJ0ID0gcmVwLmhzeW5jc3RhcnQ7Ci0JbW9kZWxpbmUtPmhzeW5jZW5kICAgPSByZXAuaHN5bmNlbmQ7Ci0JbW9kZWxpbmUtPmh0b3RhbCAgICAgPSByZXAuaHRvdGFsOwotCW1vZGVsaW5lLT5oc2tldyAgICAgID0gcmVwLmhza2V3OwotCW1vZGVsaW5lLT52ZGlzcGxheSAgID0gcmVwLnZkaXNwbGF5OwotCW1vZGVsaW5lLT52c3luY3N0YXJ0ID0gcmVwLnZzeW5jc3RhcnQ7Ci0JbW9kZWxpbmUtPnZzeW5jZW5kICAgPSByZXAudnN5bmNlbmQ7Ci0JbW9kZWxpbmUtPnZ0b3RhbCAgICAgPSByZXAudnRvdGFsOwotCW1vZGVsaW5lLT5mbGFncyAgICAgID0gcmVwLmZsYWdzOwotCW1vZGVsaW5lLT5wcml2c2l6ZSAgID0gcmVwLnByaXZzaXplOwotICAgIH0KLSAgICAKLSAgICBpZiAobW9kZWxpbmUtPnByaXZzaXplID4gMCkgewotCWlmICghKG1vZGVsaW5lLT5wcml2YXRlID0gWGNhbGxvYyhtb2RlbGluZS0+cHJpdnNpemUsIHNpemVvZihJTlQzMikpKSkgewotCSAgICBfWEVhdERhdGEoZHB5LCAobW9kZWxpbmUtPnByaXZzaXplKSAqIHNpemVvZihJTlQzMikpOwotCSAgICBYZnJlZShtb2RlbGluZS0+cHJpdmF0ZSk7Ci0JICAgIHJldHVybiBGYWxzZTsKLQl9Ci0JX1hSZWFkKGRweSwgKGNoYXIqKW1vZGVsaW5lLT5wcml2YXRlLCBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKLSAgICB9IGVsc2UgewotCW1vZGVsaW5lLT5wcml2YXRlID0gTlVMTDsKLSAgICB9Ci0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLSAgICByZXR1cm4gVHJ1ZTsKLX0KLQotQm9vbAotU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXMpKGRweSwgc2NyZWVuLCBtb2RlY291bnQsIG1vZGVsaW5lc1B0cikKLSAgICBEaXNwbGF5KiBkcHk7Ci0gICAgaW50IHNjcmVlbjsKLSAgICBpbnQqIG1vZGVjb3VudDsgCi0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKioqbW9kZWxpbmVzUHRyOwotewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKLSAgICB4WEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXNSZXBseSByZXA7Ci0gICAgeFhGODZWaWRNb2RlR2V0QWxsTW9kZUxpbmVzUmVxICpyZXE7Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKm1kaW5mcHRyLCAqKm1vZGVsaW5lczsKLSAgICB4WEY4NlZpZE1vZGVNb2RlSW5mbyB4bWRsaW5lOwotICAgIHhYRjg2T2xkVmlkTW9kZU1vZGVJbmZvIG9sZHhtZGxpbmU7Ci0gICAgaW50IGk7Ci0gICAgaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOwotICAgIEJvb2wgcHJvdG9jb2xCdWcgPSBGYWxzZTsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgLyoKLSAgICAgKiBOb3RlOiBUaGVyZSB3YXMgYSBidWcgaW4gdGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGluIHZlcnNpb25zCi0gICAgICogMC54IHdpdGggeCA8IDggKHRoZSAucHJpdmF0ZSBmaWVsZCB3YXNuJ3QgYmVpbmcgcGFzc2VkIG92ZXIgdGhlIHdpcmUpLgotICAgICAqIENoZWNrIHRoZSBzZXJ2ZXIncyB2ZXJzaW9uLCBhbmQgYWNjZXB0IHRoZSBvbGQgZm9ybWF0IGlmIGFwcHJvcHJpYXRlLgotICAgICAqLwotCi0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgaWYgKG1ham9yVmVyc2lvbiA9PSAwICYmIG1pbm9yVmVyc2lvbiA8IDgpIHsKLQlwcm90b2NvbEJ1ZyA9IFRydWU7Ci0jaWZkZWYgREVCVUcKLQlmcHJpbnRmKHN0ZGVyciwgIlhGODZWaWRNb2RlR2V0QWxsTW9kZUxpbmVzOiBXYXJuaW5nOiBYc2VydmVyIGlzIgotCQkicnVubmluZyBhbiBvbGQgdmVyc2lvbiAoJWQuJWQpXG4iLCBtYWpvclZlcnNpb24sCi0JCW1pbm9yVmVyc2lvbik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXMsIHJlcSk7Ci0gICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLSAgICByZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXM7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIAotICAgICAgICAoU0laRU9GKHhYRjg2VmlkTW9kZUdldEFsbE1vZGVMaW5lc1JlcGx5KSAtIFNJWkVPRih4UmVwbHkpKSA+PiAyLCB4RmFsc2UpKSB7Ci0gICAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLQlTeW5jSGFuZGxlKCk7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLQotICAgICptb2RlY291bnQgPSByZXAubW9kZWNvdW50OwotCi0gICAgaWYgKCEobW9kZWxpbmVzID0gKFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pICoqKSBYY2FsbG9jKHJlcC5tb2RlY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtzaXplb2YoU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykpKSkpIHsKLQlpZiAobWFqb3JWZXJzaW9uIDwgMikKLSAgICAgICAgICAgIF9YRWF0RGF0YShkcHksIChyZXAubW9kZWNvdW50KSAqIHNpemVvZih4WEY4Nk9sZFZpZE1vZGVNb2RlSW5mbykpOwotCWVsc2UKLSAgICAgICAgICAgIF9YRWF0RGF0YShkcHksIChyZXAubW9kZWNvdW50KSAqIHNpemVvZih4WEY4NlZpZE1vZGVNb2RlSW5mbykpOwotICAgICAgICBYZnJlZShtb2RlbGluZXMpOwotICAgICAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgICAgIFN5bmNIYW5kbGUoKTsKLSAgICAgICAgcmV0dXJuIEZhbHNlOwotICAgIH0KLSAgICBtZGluZnB0ciA9IChTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVJbmZvKSAqKSAoCi0JCQkgICAgKGNoYXIgKikgbW9kZWxpbmVzCi0JCQkgICAgKyByZXAubW9kZWNvdW50KnNpemVvZihTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVJbmZvKSAqKQotCQkgICAgKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCByZXAubW9kZWNvdW50OyBpKyspIHsKLSAgICAgICAgbW9kZWxpbmVzW2ldID0gbWRpbmZwdHIrKzsKLQlpZiAobWFqb3JWZXJzaW9uIDwgMikgewotICAgICAgICAgICAgX1hSZWFkKGRweSwgKGNoYXIqKSZvbGR4bWRsaW5lLCBzaXplb2YoeFhGODZPbGRWaWRNb2RlTW9kZUluZm8pKTsKLQkgICAgbW9kZWxpbmVzW2ldLT5kb3RjbG9jayAgID0gb2xkeG1kbGluZS5kb3RjbG9jazsKLQkgICAgbW9kZWxpbmVzW2ldLT5oZGlzcGxheSAgID0gb2xkeG1kbGluZS5oZGlzcGxheTsKLQkgICAgbW9kZWxpbmVzW2ldLT5oc3luY3N0YXJ0ID0gb2xkeG1kbGluZS5oc3luY3N0YXJ0OwotCSAgICBtb2RlbGluZXNbaV0tPmhzeW5jZW5kICAgPSBvbGR4bWRsaW5lLmhzeW5jZW5kOwotCSAgICBtb2RlbGluZXNbaV0tPmh0b3RhbCAgICAgPSBvbGR4bWRsaW5lLmh0b3RhbDsKLQkgICAgbW9kZWxpbmVzW2ldLT5oc2tldyAgICAgID0gMDsKLQkgICAgbW9kZWxpbmVzW2ldLT52ZGlzcGxheSAgID0gb2xkeG1kbGluZS52ZGlzcGxheTsKLQkgICAgbW9kZWxpbmVzW2ldLT52c3luY3N0YXJ0ID0gb2xkeG1kbGluZS52c3luY3N0YXJ0OwotCSAgICBtb2RlbGluZXNbaV0tPnZzeW5jZW5kICAgPSBvbGR4bWRsaW5lLnZzeW5jZW5kOwotCSAgICBtb2RlbGluZXNbaV0tPnZ0b3RhbCAgICAgPSBvbGR4bWRsaW5lLnZ0b3RhbDsKLQkgICAgbW9kZWxpbmVzW2ldLT5mbGFncyAgICAgID0gb2xkeG1kbGluZS5mbGFnczsKLQkgICAgaWYgKHByb3RvY29sQnVnKSB7Ci0JCW1vZGVsaW5lc1tpXS0+cHJpdnNpemUgPSAwOwotCQltb2RlbGluZXNbaV0tPnByaXZhdGUgPSBOVUxMOwotCSAgICB9IGVsc2UgewotCQltb2RlbGluZXNbaV0tPnByaXZzaXplICAgPSBvbGR4bWRsaW5lLnByaXZzaXplOwotCQlpZiAob2xkeG1kbGluZS5wcml2c2l6ZSA+IDApIHsKLQkgICAgICAgICAgICBpZiAoIShtb2RlbGluZXNbaV0tPnByaXZhdGUgPQotCQkJICAgIFhjYWxsb2Mob2xkeG1kbGluZS5wcml2c2l6ZSwgc2l6ZW9mKElOVDMyKSkpKSB7Ci0JCQlfWEVhdERhdGEoZHB5LCAob2xkeG1kbGluZS5wcml2c2l6ZSkgKiBzaXplb2YoSU5UMzIpKTsKLQkJCVhmcmVlKG1vZGVsaW5lc1tpXS0+cHJpdmF0ZSk7Ci0JCSAgICB9IGVsc2UgewotCQkJX1hSZWFkKGRweSwgKGNoYXIqKW1vZGVsaW5lc1tpXS0+cHJpdmF0ZSwKLQkJCSAgICAgb2xkeG1kbGluZS5wcml2c2l6ZSAqIHNpemVvZihJTlQzMikpOwotCQkgICAgfQotCQl9IGVsc2UgewotCQkgIG1vZGVsaW5lc1tpXS0+cHJpdmF0ZSA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCX0gZWxzZSB7Ci0gICAgICAgICAgICBfWFJlYWQoZHB5LCAoY2hhciopJnhtZGxpbmUsIHNpemVvZih4WEY4NlZpZE1vZGVNb2RlSW5mbykpOwotCSAgICBtb2RlbGluZXNbaV0tPmRvdGNsb2NrICAgPSB4bWRsaW5lLmRvdGNsb2NrOwotCSAgICBtb2RlbGluZXNbaV0tPmhkaXNwbGF5ICAgPSB4bWRsaW5lLmhkaXNwbGF5OwotCSAgICBtb2RlbGluZXNbaV0tPmhzeW5jc3RhcnQgPSB4bWRsaW5lLmhzeW5jc3RhcnQ7Ci0JICAgIG1vZGVsaW5lc1tpXS0+aHN5bmNlbmQgICA9IHhtZGxpbmUuaHN5bmNlbmQ7Ci0JICAgIG1vZGVsaW5lc1tpXS0+aHRvdGFsICAgICA9IHhtZGxpbmUuaHRvdGFsOwotCSAgICBtb2RlbGluZXNbaV0tPmhza2V3ICAgICAgPSB4bWRsaW5lLmhza2V3OwotCSAgICBtb2RlbGluZXNbaV0tPnZkaXNwbGF5ICAgPSB4bWRsaW5lLnZkaXNwbGF5OwotCSAgICBtb2RlbGluZXNbaV0tPnZzeW5jc3RhcnQgPSB4bWRsaW5lLnZzeW5jc3RhcnQ7Ci0JICAgIG1vZGVsaW5lc1tpXS0+dnN5bmNlbmQgICA9IHhtZGxpbmUudnN5bmNlbmQ7Ci0JICAgIG1vZGVsaW5lc1tpXS0+dnRvdGFsICAgICA9IHhtZGxpbmUudnRvdGFsOwotCSAgICBtb2RlbGluZXNbaV0tPmZsYWdzICAgICAgPSB4bWRsaW5lLmZsYWdzOwotCSAgICBpZiAocHJvdG9jb2xCdWcpIHsKLQkJbW9kZWxpbmVzW2ldLT5wcml2c2l6ZSA9IDA7Ci0JCW1vZGVsaW5lc1tpXS0+cHJpdmF0ZSA9IE5VTEw7Ci0JICAgIH0gZWxzZSB7Ci0JCW1vZGVsaW5lc1tpXS0+cHJpdnNpemUgICA9IHhtZGxpbmUucHJpdnNpemU7Ci0JCWlmICh4bWRsaW5lLnByaXZzaXplID4gMCkgewotCQkgICAgaWYgKCEobW9kZWxpbmVzW2ldLT5wcml2YXRlID0KLQkJCSAgICBYY2FsbG9jKHhtZGxpbmUucHJpdnNpemUsIHNpemVvZihJTlQzMikpKSkgewotCQkJX1hFYXREYXRhKGRweSwgKHhtZGxpbmUucHJpdnNpemUpICogc2l6ZW9mKElOVDMyKSk7Ci0JCQlYZnJlZShtb2RlbGluZXNbaV0tPnByaXZhdGUpOwotCQkgICAgfSBlbHNlIHsKLQkJCV9YUmVhZChkcHksIChjaGFyKiltb2RlbGluZXNbaV0tPnByaXZhdGUsCi0JCQkgICAgIHhtZGxpbmUucHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIG1vZGVsaW5lc1tpXS0+cHJpdmF0ZSA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gICAgKm1vZGVsaW5lc1B0ciA9IG1vZGVsaW5lczsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBUcnVlOwotfQotCi0vKgotICogR2V0UmVxIHJlcGxhY2VtZW50IGZvciB1c2Ugd2l0aCBWaWRNb2RlIHByb3RvY29scyBlYXJsaWVyIHRoYW4gMi4wCi0gKi8KLSNpZiAhZGVmaW5lZChVTklYQ1BQKSB8fCBkZWZpbmVkKEFOU0lDUFApCi0jZGVmaW5lIEdldE9sZFJlcShuYW1lLCBvbGRuYW1lLCByZXEpIFwKLSAgICAgICAgV09SRDY0QUxJR05cCi0JaWYgKChkcHktPmJ1ZnB0ciArIFNJWkVPRih4IyNvbGRuYW1lIyNSZXEpKSA+IGRweS0+YnVmbWF4KVwKLQkJX1hGbHVzaChkcHkpO1wKLQlyZXEgPSAoeCMjb2xkbmFtZSMjUmVxICopKGRweS0+bGFzdF9yZXEgPSBkcHktPmJ1ZnB0cik7XAotCXJlcS0+cmVxVHlwZSA9IFhfIyNuYW1lO1wKLQlyZXEtPmxlbmd0aCA9IChTSVpFT0YoeCMjb2xkbmFtZSMjUmVxKSk+PjI7XAotCWRweS0+YnVmcHRyICs9IFNJWkVPRih4IyNvbGRuYW1lIyNSZXEpO1wKLQlkcHktPnJlcXVlc3QrKwotCi0jZWxzZSAgLyogbm9uLUFOU0kgQyB1c2VzIGVtcHR5IGNvbW1lbnQgaW5zdGVhZCBvZiAiIyMiIGZvciB0b2tlbiBjb25jYXRlbmF0aW9uICovCi0jZGVmaW5lIEdldE9sZFJlcShuYW1lLCBvbGRuYW1lLCByZXEpIFwKLSAgICAgICAgV09SRDY0QUxJR05cCi0JaWYgKChkcHktPmJ1ZnB0ciArIFNJWkVPRih4LyoqL29sZG5hbWUvKiovUmVxKSkgPiBkcHktPmJ1Zm1heClcCi0JCV9YRmx1c2goZHB5KTtcCi0JcmVxID0gKHgvKiovb2xkbmFtZS8qKi9SZXEgKikoZHB5LT5sYXN0X3JlcSA9IGRweS0+YnVmcHRyKTtcCi0JcmVxLT5yZXFUeXBlID0gWF8vKiovbmFtZTtcCi0JcmVxLT5sZW5ndGggPSAoU0laRU9GKHgvKiovb2xkbmFtZS8qKi9SZXEpKT4+MjtcCi0JZHB5LT5idWZwdHIgKz0gU0laRU9GKHgvKiovb2xkbmFtZS8qKi9SZXEpO1wKLQlkcHktPnJlcXVlc3QrKwotI2VuZGlmCi0KLUJvb2wKLVNETF9OQU1FKFhGODZWaWRNb2RlQWRkTW9kZUxpbmUpIChkcHksIHNjcmVlbiwgbmV3bW9kZWxpbmUsIGFmdGVybW9kZWxpbmUpCi0gICAgRGlzcGxheSAqZHB5OwotICAgIGludCBzY3JlZW47Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykqIG5ld21vZGVsaW5lOwotICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiBhZnRlcm1vZGVsaW5lOwotewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKLSAgICB4WEY4NlZpZE1vZGVBZGRNb2RlTGluZVJlcSAqcmVxOwotICAgIHhYRjg2T2xkVmlkTW9kZUFkZE1vZGVMaW5lUmVxICpvbGRyZXE7Ci0gICAgaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOwotCi0gICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIGlmIChtYWpvclZlcnNpb24gPCAyKSB7Ci0JR2V0T2xkUmVxKFhGODZWaWRNb2RlQWRkTW9kZUxpbmUsIFhGODZPbGRWaWRNb2RlQWRkTW9kZUxpbmUsIG9sZHJlcSk7Ci0Jb2xkcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLQlvbGRyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVBZGRNb2RlTGluZTsKLQlvbGRyZXEtPnNjcmVlbiA9IHNjcmVlbjsKLQlvbGRyZXEtPmRvdGNsb2NrID0JbmV3bW9kZWxpbmUtPmRvdGNsb2NrOwotCW9sZHJlcS0+aGRpc3BsYXkgPQluZXdtb2RlbGluZS0+aGRpc3BsYXk7Ci0Jb2xkcmVxLT5oc3luY3N0YXJ0ID0JbmV3bW9kZWxpbmUtPmhzeW5jc3RhcnQ7Ci0Jb2xkcmVxLT5oc3luY2VuZCA9CW5ld21vZGVsaW5lLT5oc3luY2VuZDsKLQlvbGRyZXEtPmh0b3RhbCA9CW5ld21vZGVsaW5lLT5odG90YWw7Ci0Jb2xkcmVxLT52ZGlzcGxheSA9CW5ld21vZGVsaW5lLT52ZGlzcGxheTsKLQlvbGRyZXEtPnZzeW5jc3RhcnQgPQluZXdtb2RlbGluZS0+dnN5bmNzdGFydDsKLQlvbGRyZXEtPnZzeW5jZW5kID0JbmV3bW9kZWxpbmUtPnZzeW5jZW5kOwotCW9sZHJlcS0+dnRvdGFsID0JbmV3bW9kZWxpbmUtPnZ0b3RhbDsKLQlvbGRyZXEtPmZsYWdzID0JCW5ld21vZGVsaW5lLT5mbGFnczsKLQlvbGRyZXEtPnByaXZzaXplID0JbmV3bW9kZWxpbmUtPnByaXZzaXplOwotCWlmIChhZnRlcm1vZGVsaW5lICE9IE5VTEwpIHsKLQkgICAgb2xkcmVxLT5hZnRlcl9kb3RjbG9jayA9CWFmdGVybW9kZWxpbmUtPmRvdGNsb2NrOwotCSAgICBvbGRyZXEtPmFmdGVyX2hkaXNwbGF5ID0JYWZ0ZXJtb2RlbGluZS0+aGRpc3BsYXk7Ci0JICAgIG9sZHJlcS0+YWZ0ZXJfaHN5bmNzdGFydCA9CWFmdGVybW9kZWxpbmUtPmhzeW5jc3RhcnQ7Ci0JICAgIG9sZHJlcS0+YWZ0ZXJfaHN5bmNlbmQgPQlhZnRlcm1vZGVsaW5lLT5oc3luY2VuZDsKLQkgICAgb2xkcmVxLT5hZnRlcl9odG90YWwgPQlhZnRlcm1vZGVsaW5lLT5odG90YWw7Ci0JICAgIG9sZHJlcS0+YWZ0ZXJfdmRpc3BsYXkgPQlhZnRlcm1vZGVsaW5lLT52ZGlzcGxheTsKLQkgICAgb2xkcmVxLT5hZnRlcl92c3luY3N0YXJ0ID0JYWZ0ZXJtb2RlbGluZS0+dnN5bmNzdGFydDsKLQkgICAgb2xkcmVxLT5hZnRlcl92c3luY2VuZCA9CWFmdGVybW9kZWxpbmUtPnZzeW5jZW5kOwotCSAgICBvbGRyZXEtPmFmdGVyX3Z0b3RhbCA9CWFmdGVybW9kZWxpbmUtPnZ0b3RhbDsKLQkgICAgb2xkcmVxLT5hZnRlcl9mbGFncyA9CWFmdGVybW9kZWxpbmUtPmZsYWdzOwotCX0gZWxzZSB7Ci0JICAgIG9sZHJlcS0+YWZ0ZXJfZG90Y2xvY2sgPQkwOwotCSAgICBvbGRyZXEtPmFmdGVyX2hkaXNwbGF5ID0JMDsKLQkgICAgb2xkcmVxLT5hZnRlcl9oc3luY3N0YXJ0ID0JMDsKLQkgICAgb2xkcmVxLT5hZnRlcl9oc3luY2VuZCA9CTA7Ci0JICAgIG9sZHJlcS0+YWZ0ZXJfaHRvdGFsID0JMDsKLQkgICAgb2xkcmVxLT5hZnRlcl92ZGlzcGxheSA9CTA7Ci0JICAgIG9sZHJlcS0+YWZ0ZXJfdnN5bmNzdGFydCA9CTA7Ci0JICAgIG9sZHJlcS0+YWZ0ZXJfdnN5bmNlbmQgPQkwOwotCSAgICBvbGRyZXEtPmFmdGVyX3Z0b3RhbCA9CTA7Ci0JICAgIG9sZHJlcS0+YWZ0ZXJfZmxhZ3MgPQkwOwotCX0KLQlpZiAobmV3bW9kZWxpbmUtPnByaXZzaXplKSB7Ci0JICAgIG9sZHJlcS0+bGVuZ3RoICs9IG5ld21vZGVsaW5lLT5wcml2c2l6ZTsKLQkgICAgRGF0YTMyKGRweSwgKGxvbmcgKikgbmV3bW9kZWxpbmUtPnByaXZhdGUsCi0JICAgICAgIG5ld21vZGVsaW5lLT5wcml2c2l6ZSAqIHNpemVvZihJTlQzMikpOwotCX0KLSAgICB9IGVsc2UgewotCUdldFJlcShYRjg2VmlkTW9kZUFkZE1vZGVMaW5lLCByZXEpOwotCXJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0JcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlQWRkTW9kZUxpbmU7Ci0JcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0JcmVxLT5kb3RjbG9jayA9CQluZXdtb2RlbGluZS0+ZG90Y2xvY2s7Ci0JcmVxLT5oZGlzcGxheSA9CQluZXdtb2RlbGluZS0+aGRpc3BsYXk7Ci0JcmVxLT5oc3luY3N0YXJ0ID0JbmV3bW9kZWxpbmUtPmhzeW5jc3RhcnQ7Ci0JcmVxLT5oc3luY2VuZCA9CQluZXdtb2RlbGluZS0+aHN5bmNlbmQ7Ci0JcmVxLT5odG90YWwgPQkJbmV3bW9kZWxpbmUtPmh0b3RhbDsKLQlyZXEtPmhza2V3ID0JCW5ld21vZGVsaW5lLT5oc2tldzsKLQlyZXEtPnZkaXNwbGF5ID0JCW5ld21vZGVsaW5lLT52ZGlzcGxheTsKLQlyZXEtPnZzeW5jc3RhcnQgPQluZXdtb2RlbGluZS0+dnN5bmNzdGFydDsKLQlyZXEtPnZzeW5jZW5kID0JCW5ld21vZGVsaW5lLT52c3luY2VuZDsKLQlyZXEtPnZ0b3RhbCA9CQluZXdtb2RlbGluZS0+dnRvdGFsOwotCXJlcS0+ZmxhZ3MgPQkJbmV3bW9kZWxpbmUtPmZsYWdzOwotCXJlcS0+cHJpdnNpemUgPQkJbmV3bW9kZWxpbmUtPnByaXZzaXplOwotCWlmIChhZnRlcm1vZGVsaW5lICE9IE5VTEwpIHsKLQkgICAgcmVxLT5hZnRlcl9kb3RjbG9jayA9CWFmdGVybW9kZWxpbmUtPmRvdGNsb2NrOwotCSAgICByZXEtPmFmdGVyX2hkaXNwbGF5ID0JYWZ0ZXJtb2RlbGluZS0+aGRpc3BsYXk7Ci0JICAgIHJlcS0+YWZ0ZXJfaHN5bmNzdGFydCA9CWFmdGVybW9kZWxpbmUtPmhzeW5jc3RhcnQ7Ci0JICAgIHJlcS0+YWZ0ZXJfaHN5bmNlbmQgPQlhZnRlcm1vZGVsaW5lLT5oc3luY2VuZDsKLQkgICAgcmVxLT5hZnRlcl9odG90YWwgPQkJYWZ0ZXJtb2RlbGluZS0+aHRvdGFsOwotCSAgICByZXEtPmFmdGVyX2hza2V3ID0JCWFmdGVybW9kZWxpbmUtPmhza2V3OwotCSAgICByZXEtPmFmdGVyX3ZkaXNwbGF5ID0JYWZ0ZXJtb2RlbGluZS0+dmRpc3BsYXk7Ci0JICAgIHJlcS0+YWZ0ZXJfdnN5bmNzdGFydCA9CWFmdGVybW9kZWxpbmUtPnZzeW5jc3RhcnQ7Ci0JICAgIHJlcS0+YWZ0ZXJfdnN5bmNlbmQgPQlhZnRlcm1vZGVsaW5lLT52c3luY2VuZDsKLQkgICAgcmVxLT5hZnRlcl92dG90YWwgPQkJYWZ0ZXJtb2RlbGluZS0+dnRvdGFsOwotCSAgICByZXEtPmFmdGVyX2ZsYWdzID0JCWFmdGVybW9kZWxpbmUtPmZsYWdzOwotCX0gZWxzZSB7Ci0JICAgIHJlcS0+YWZ0ZXJfZG90Y2xvY2sgPQkwOwotCSAgICByZXEtPmFmdGVyX2hkaXNwbGF5ID0JMDsKLQkgICAgcmVxLT5hZnRlcl9oc3luY3N0YXJ0ID0JMDsKLQkgICAgcmVxLT5hZnRlcl9oc3luY2VuZCA9CTA7Ci0JICAgIHJlcS0+YWZ0ZXJfaHRvdGFsID0JCTA7Ci0JICAgIHJlcS0+YWZ0ZXJfaHNrZXcgPQkJMDsKLQkgICAgcmVxLT5hZnRlcl92ZGlzcGxheSA9CTA7Ci0JICAgIHJlcS0+YWZ0ZXJfdnN5bmNzdGFydCA9CTA7Ci0JICAgIHJlcS0+YWZ0ZXJfdnN5bmNlbmQgPQkwOwotCSAgICByZXEtPmFmdGVyX3Z0b3RhbCA9CQkwOwotCSAgICByZXEtPmFmdGVyX2ZsYWdzID0JCTA7Ci0JfQotCWlmIChuZXdtb2RlbGluZS0+cHJpdnNpemUpIHsKLQkgICAgcmVxLT5sZW5ndGggKz0gbmV3bW9kZWxpbmUtPnByaXZzaXplOwotCSAgICBEYXRhMzIoZHB5LCAobG9uZyAqKSBuZXdtb2RlbGluZS0+cHJpdmF0ZSwKLQkgICAgICAgbmV3bW9kZWxpbmUtPnByaXZzaXplICogc2l6ZW9mKElOVDMyKSk7Ci0JfQotICAgIH0KLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBUcnVlOwotfQotCi1Cb29sCi1TRExfTkFNRShYRjg2VmlkTW9kZURlbGV0ZU1vZGVMaW5lKSAoZHB5LCBzY3JlZW4sIG1vZGVsaW5lKQotICAgIERpc3BsYXkgKmRweTsKLSAgICBpbnQgc2NyZWVuOwotICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiBtb2RlbGluZTsKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlRGVsZXRlTW9kZUxpbmVSZXEgKnJlcTsKLSAgICB4WEY4Nk9sZFZpZE1vZGVEZWxldGVNb2RlTGluZVJlcSAqb2xkcmVxOwotICAgIGludCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbjsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgMCk7Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIGlmIChtYWpvclZlcnNpb24gPCAyKSB7Ci0JR2V0T2xkUmVxKFhGODZWaWRNb2RlRGVsZXRlTW9kZUxpbmUsIFhGODZPbGRWaWRNb2RlRGVsZXRlTW9kZUxpbmUsIG9sZHJlcSk7Ci0Jb2xkcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLQlvbGRyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVEZWxldGVNb2RlTGluZTsKLQlvbGRyZXEtPnNjcmVlbiA9IHNjcmVlbjsKLQlvbGRyZXEtPmRvdGNsb2NrID0JbW9kZWxpbmUtPmRvdGNsb2NrOwotCW9sZHJlcS0+aGRpc3BsYXkgPQltb2RlbGluZS0+aGRpc3BsYXk7Ci0Jb2xkcmVxLT5oc3luY3N0YXJ0ID0JbW9kZWxpbmUtPmhzeW5jc3RhcnQ7Ci0Jb2xkcmVxLT5oc3luY2VuZCA9CW1vZGVsaW5lLT5oc3luY2VuZDsKLQlvbGRyZXEtPmh0b3RhbCA9CW1vZGVsaW5lLT5odG90YWw7Ci0Jb2xkcmVxLT52ZGlzcGxheSA9CW1vZGVsaW5lLT52ZGlzcGxheTsKLQlvbGRyZXEtPnZzeW5jc3RhcnQgPQltb2RlbGluZS0+dnN5bmNzdGFydDsKLQlvbGRyZXEtPnZzeW5jZW5kID0JbW9kZWxpbmUtPnZzeW5jZW5kOwotCW9sZHJlcS0+dnRvdGFsID0JbW9kZWxpbmUtPnZ0b3RhbDsKLQlvbGRyZXEtPmZsYWdzID0JCW1vZGVsaW5lLT5mbGFnczsKLQlvbGRyZXEtPnByaXZzaXplID0JbW9kZWxpbmUtPnByaXZzaXplOwotCWlmIChtb2RlbGluZS0+cHJpdnNpemUpIHsKLQkgICAgb2xkcmVxLT5sZW5ndGggKz0gbW9kZWxpbmUtPnByaXZzaXplOwotCSAgICBEYXRhMzIoZHB5LCAobG9uZyAqKSBtb2RlbGluZS0+cHJpdmF0ZSwKLQkgICAgICAgbW9kZWxpbmUtPnByaXZzaXplICogc2l6ZW9mKElOVDMyKSk7Ci0JfQotICAgIH0gZWxzZSB7Ci0JR2V0UmVxKFhGODZWaWRNb2RlRGVsZXRlTW9kZUxpbmUsIHJlcSk7Ci0JcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLQlyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVEZWxldGVNb2RlTGluZTsKLQlyZXEtPnNjcmVlbiA9IHNjcmVlbjsKLQlyZXEtPmRvdGNsb2NrID0JCW1vZGVsaW5lLT5kb3RjbG9jazsKLQlyZXEtPmhkaXNwbGF5ID0JCW1vZGVsaW5lLT5oZGlzcGxheTsKLQlyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKLQlyZXEtPmhzeW5jZW5kID0JCW1vZGVsaW5lLT5oc3luY2VuZDsKLQlyZXEtPmh0b3RhbCA9CQltb2RlbGluZS0+aHRvdGFsOwotCXJlcS0+aHNrZXcgPQkJbW9kZWxpbmUtPmhza2V3OwotCXJlcS0+dmRpc3BsYXkgPQkJbW9kZWxpbmUtPnZkaXNwbGF5OwotCXJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OwotCXJlcS0+dnN5bmNlbmQgPQkJbW9kZWxpbmUtPnZzeW5jZW5kOwotCXJlcS0+dnRvdGFsID0JCW1vZGVsaW5lLT52dG90YWw7Ci0JcmVxLT5mbGFncyA9CQltb2RlbGluZS0+ZmxhZ3M7Ci0JcmVxLT5wcml2c2l6ZSA9CQltb2RlbGluZS0+cHJpdnNpemU7Ci0JaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgewotCSAgICByZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7Ci0JICAgIERhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAotCSAgICAgICBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKLQl9Ci0gICAgfQotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0KLUJvb2wKLVNETF9OQU1FKFhGODZWaWRNb2RlTW9kTW9kZUxpbmUpIChkcHksIHNjcmVlbiwgbW9kZWxpbmUpCi0gICAgRGlzcGxheSAqZHB5OwotICAgIGludCBzY3JlZW47Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlTGluZSkqIG1vZGVsaW5lOwotewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKLSAgICB4WEY4NlZpZE1vZGVNb2RNb2RlTGluZVJlcSAqcmVxOwotICAgIHhYRjg2T2xkVmlkTW9kZU1vZE1vZGVMaW5lUmVxICpvbGRyZXE7Ci0gICAgaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOwotCi0gICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCAwKTsKLSAgICBTRExfTkFNRShYRjg2VmlkTW9kZVF1ZXJ5VmVyc2lvbikoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgaWYgKG1ham9yVmVyc2lvbiA8IDIpIHsKLQlHZXRPbGRSZXEoWEY4NlZpZE1vZGVNb2RNb2RlTGluZSwgWEY4Nk9sZFZpZE1vZGVNb2RNb2RlTGluZSwgb2xkcmVxKTsKLQlvbGRyZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotCW9sZHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZU1vZE1vZGVMaW5lOwotCW9sZHJlcS0+c2NyZWVuID0gc2NyZWVuOwotCW9sZHJlcS0+aGRpc3BsYXkgPQltb2RlbGluZS0+aGRpc3BsYXk7Ci0Jb2xkcmVxLT5oc3luY3N0YXJ0ID0JbW9kZWxpbmUtPmhzeW5jc3RhcnQ7Ci0Jb2xkcmVxLT5oc3luY2VuZCA9CW1vZGVsaW5lLT5oc3luY2VuZDsKLQlvbGRyZXEtPmh0b3RhbCA9CW1vZGVsaW5lLT5odG90YWw7Ci0Jb2xkcmVxLT52ZGlzcGxheSA9CW1vZGVsaW5lLT52ZGlzcGxheTsKLQlvbGRyZXEtPnZzeW5jc3RhcnQgPQltb2RlbGluZS0+dnN5bmNzdGFydDsKLQlvbGRyZXEtPnZzeW5jZW5kID0JbW9kZWxpbmUtPnZzeW5jZW5kOwotCW9sZHJlcS0+dnRvdGFsID0JbW9kZWxpbmUtPnZ0b3RhbDsKLQlvbGRyZXEtPmZsYWdzID0JCW1vZGVsaW5lLT5mbGFnczsKLQlvbGRyZXEtPnByaXZzaXplID0JbW9kZWxpbmUtPnByaXZzaXplOwotCWlmIChtb2RlbGluZS0+cHJpdnNpemUpIHsKLQkgICAgb2xkcmVxLT5sZW5ndGggKz0gbW9kZWxpbmUtPnByaXZzaXplOwotCSAgICBEYXRhMzIoZHB5LCAobG9uZyAqKSBtb2RlbGluZS0+cHJpdmF0ZSwKLQkgICAgICAgbW9kZWxpbmUtPnByaXZzaXplICogc2l6ZW9mKElOVDMyKSk7Ci0JfQotICAgIH0gZWxzZSB7Ci0JR2V0UmVxKFhGODZWaWRNb2RlTW9kTW9kZUxpbmUsIHJlcSk7Ci0JcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLQlyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVNb2RNb2RlTGluZTsKLQlyZXEtPnNjcmVlbiA9IHNjcmVlbjsKLQlyZXEtPmhkaXNwbGF5ID0JCW1vZGVsaW5lLT5oZGlzcGxheTsKLQlyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKLQlyZXEtPmhzeW5jZW5kID0JCW1vZGVsaW5lLT5oc3luY2VuZDsKLQlyZXEtPmh0b3RhbCA9CQltb2RlbGluZS0+aHRvdGFsOwotCXJlcS0+aHNrZXcgPQkJbW9kZWxpbmUtPmhza2V3OwotCXJlcS0+dmRpc3BsYXkgPQkJbW9kZWxpbmUtPnZkaXNwbGF5OwotCXJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OwotCXJlcS0+dnN5bmNlbmQgPQkJbW9kZWxpbmUtPnZzeW5jZW5kOwotCXJlcS0+dnRvdGFsID0JCW1vZGVsaW5lLT52dG90YWw7Ci0JcmVxLT5mbGFncyA9CQltb2RlbGluZS0+ZmxhZ3M7Ci0JcmVxLT5wcml2c2l6ZSA9CQltb2RlbGluZS0+cHJpdnNpemU7Ci0JaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgewotCSAgICByZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7Ci0JICAgIERhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAotCSAgICAgICBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKLQl9Ci0gICAgfQotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0KLVN0YXR1cwotU0RMX05BTUUoWEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lKSAoZHB5LCBzY3JlZW4sIG1vZGVsaW5lKQotICAgIERpc3BsYXkgKmRweTsKLSAgICBpbnQgc2NyZWVuOwotICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiBtb2RlbGluZTsKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlVmFsaWRhdGVNb2RlTGluZVJlcSAqcmVxOwotICAgIHhYRjg2T2xkVmlkTW9kZVZhbGlkYXRlTW9kZUxpbmVSZXEgKm9sZHJlcTsKLSAgICB4WEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lUmVwbHkgcmVwOwotICAgIGludCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbjsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgMCk7Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotCi0gICAgaWYgKG1ham9yVmVyc2lvbiA8IDIpIHsKLQlHZXRPbGRSZXEoWEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lLCBYRjg2T2xkVmlkTW9kZVZhbGlkYXRlTW9kZUxpbmUsIG9sZHJlcSk7Ci0Jb2xkcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLQlvbGRyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lOwotCW9sZHJlcS0+c2NyZWVuID0gc2NyZWVuOwotCW9sZHJlcS0+ZG90Y2xvY2sgPQltb2RlbGluZS0+ZG90Y2xvY2s7Ci0Jb2xkcmVxLT5oZGlzcGxheSA9CW1vZGVsaW5lLT5oZGlzcGxheTsKLQlvbGRyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKLQlvbGRyZXEtPmhzeW5jZW5kID0JbW9kZWxpbmUtPmhzeW5jZW5kOwotCW9sZHJlcS0+aHRvdGFsID0JbW9kZWxpbmUtPmh0b3RhbDsKLQlvbGRyZXEtPnZkaXNwbGF5ID0JbW9kZWxpbmUtPnZkaXNwbGF5OwotCW9sZHJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OwotCW9sZHJlcS0+dnN5bmNlbmQgPQltb2RlbGluZS0+dnN5bmNlbmQ7Ci0Jb2xkcmVxLT52dG90YWwgPQltb2RlbGluZS0+dnRvdGFsOwotCW9sZHJlcS0+ZmxhZ3MgPQkJbW9kZWxpbmUtPmZsYWdzOwotCW9sZHJlcS0+cHJpdnNpemUgPQltb2RlbGluZS0+cHJpdnNpemU7Ci0JaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgewotCSAgICBvbGRyZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7Ci0JICAgIERhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAotCSAgICAgICBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKLQl9Ci0gICAgfSBlbHNlIHsKLQlHZXRSZXEoWEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lLCByZXEpOwotCXJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0JcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlVmFsaWRhdGVNb2RlTGluZTsKLQlyZXEtPnNjcmVlbiA9IHNjcmVlbjsKLQlyZXEtPmRvdGNsb2NrID0JCW1vZGVsaW5lLT5kb3RjbG9jazsKLQlyZXEtPmhkaXNwbGF5ID0JCW1vZGVsaW5lLT5oZGlzcGxheTsKLQlyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKLQlyZXEtPmhzeW5jZW5kID0JCW1vZGVsaW5lLT5oc3luY2VuZDsKLQlyZXEtPmh0b3RhbCA9CQltb2RlbGluZS0+aHRvdGFsOwotCXJlcS0+aHNrZXcgPQkJbW9kZWxpbmUtPmhza2V3OwotCXJlcS0+dmRpc3BsYXkgPQkJbW9kZWxpbmUtPnZkaXNwbGF5OwotCXJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OwotCXJlcS0+dnN5bmNlbmQgPQkJbW9kZWxpbmUtPnZzeW5jZW5kOwotCXJlcS0+dnRvdGFsID0JCW1vZGVsaW5lLT52dG90YWw7Ci0JcmVxLT5mbGFncyA9CQltb2RlbGluZS0+ZmxhZ3M7Ci0JcmVxLT5wcml2c2l6ZSA9CQltb2RlbGluZS0+cHJpdnNpemU7Ci0JaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgewotCSAgICByZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7Ci0JICAgIERhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAotCSAgICAgICBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKLQl9Ci0gICAgfQotICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7Ci0JVW5sb2NrRGlzcGxheShkcHkpOwotCVN5bmNIYW5kbGUoKTsKLQlyZXR1cm4gTU9ERV9CQUQ7Ci0gICAgfQotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIHJlcC5zdGF0dXM7Ci19Ci0KLUJvb2wKLVNETF9OQU1FKFhGODZWaWRNb2RlU3dpdGNoTW9kZSkoZHB5LCBzY3JlZW4sIHpvb20pCi0gICAgRGlzcGxheSogZHB5OwotICAgIGludCBzY3JlZW47Ci0gICAgaW50IHpvb207Ci17Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOwotICAgIHhYRjg2VmlkTW9kZVN3aXRjaE1vZGVSZXEgKnJlcTsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NlZpZE1vZGVTd2l0Y2hNb2RlLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlU3dpdGNoTW9kZTsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICByZXEtPnpvb20gPSB6b29tOwotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0gICAgCi1Cb29sCi1TRExfTkFNRShYRjg2VmlkTW9kZVN3aXRjaFRvTW9kZSkoZHB5LCBzY3JlZW4sIG1vZGVsaW5lKQotICAgIERpc3BsYXkqIGRweTsKLSAgICBpbnQgc2NyZWVuOwotICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiBtb2RlbGluZTsKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlU3dpdGNoVG9Nb2RlUmVxICpyZXE7Ci0gICAgeFhGODZPbGRWaWRNb2RlU3dpdGNoVG9Nb2RlUmVxICpvbGRyZXE7Ci0gICAgaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOwotICAgIEJvb2wgcHJvdG9jb2xCdWcgPSBGYWxzZTsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgLyoKLSAgICAgKiBOb3RlOiBUaGVyZSB3YXMgYSBidWcgaW4gdGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGluIHZlcnNpb25zCi0gICAgICogMC54IHdpdGggeCA8IDggKHRoZSAucHJpdmF0ZSBmaWVsZCB3YXNuJ3QgZXhwZWN0ZWQgdG8gYmUgc2VudCBvdmVyCi0gICAgICogdGhlIHdpcmUpLiAgQ2hlY2sgdGhlIHNlcnZlcidzIHZlcnNpb24sIGFuZCBhY2NlcHQgdGhlIG9sZCBmb3JtYXQKLSAgICAgKiBpZiBhcHByb3ByaWF0ZS4KLSAgICAgKi8KLQotICAgIFNETF9OQU1FKFhGODZWaWRNb2RlUXVlcnlWZXJzaW9uKShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgIGlmIChtYWpvclZlcnNpb24gPT0gMCAmJiBtaW5vclZlcnNpb24gPCA4KSB7Ci0JcHJvdG9jb2xCdWcgPSBUcnVlOwotI2lmZGVmIERFQlVHCi0JZnByaW50ZihzdGRlcnIsICJYRjg2VmlkTW9kZVN3aXRjaFRvTW9kZTogV2FybmluZzogWHNlcnZlciBpcyIKLQkJInJ1bm5pbmcgYW4gb2xkIHZlcnNpb24gKCVkLiVkKVxuIiwgbWFqb3JWZXJzaW9uLAotCQltaW5vclZlcnNpb24pOwotI2VuZGlmCi0gICAgfQotICAgIAotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgaWYgKG1ham9yVmVyc2lvbiA8IDIpIHsKLQlHZXRPbGRSZXEoWEY4NlZpZE1vZGVTd2l0Y2hUb01vZGUsIFhGODZPbGRWaWRNb2RlU3dpdGNoVG9Nb2RlLCBvbGRyZXEpOwotCW9sZHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0Jb2xkcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlU3dpdGNoVG9Nb2RlOwotCW9sZHJlcS0+c2NyZWVuID0gc2NyZWVuOwotCW9sZHJlcS0+ZG90Y2xvY2sgPQltb2RlbGluZS0+ZG90Y2xvY2s7Ci0Jb2xkcmVxLT5oZGlzcGxheSA9CW1vZGVsaW5lLT5oZGlzcGxheTsKLQlvbGRyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKLQlvbGRyZXEtPmhzeW5jZW5kID0JbW9kZWxpbmUtPmhzeW5jZW5kOwotCW9sZHJlcS0+aHRvdGFsID0JbW9kZWxpbmUtPmh0b3RhbDsKLQlvbGRyZXEtPnZkaXNwbGF5ID0JbW9kZWxpbmUtPnZkaXNwbGF5OwotCW9sZHJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OwotCW9sZHJlcS0+dnN5bmNlbmQgPQltb2RlbGluZS0+dnN5bmNlbmQ7Ci0Jb2xkcmVxLT52dG90YWwgPQltb2RlbGluZS0+dnRvdGFsOwotCW9sZHJlcS0+ZmxhZ3MgPQltb2RlbGluZS0+ZmxhZ3M7Ci0JaWYgKHByb3RvY29sQnVnKSB7Ci0JICAgIG9sZHJlcS0+cHJpdnNpemUgPSAwOwotCX0gZWxzZSB7Ci0JICAgIG9sZHJlcS0+cHJpdnNpemUgPQltb2RlbGluZS0+cHJpdnNpemU7Ci0JICAgIGlmIChtb2RlbGluZS0+cHJpdnNpemUpIHsKLQkJb2xkcmVxLT5sZW5ndGggKz0gbW9kZWxpbmUtPnByaXZzaXplOwotCQlEYXRhMzIoZHB5LCAobG9uZyAqKSBtb2RlbGluZS0+cHJpdmF0ZSwKLQkgICAgICAgICAgIG1vZGVsaW5lLT5wcml2c2l6ZSAqIHNpemVvZihJTlQzMikpOwotCSAgICB9Ci0JfQotICAgIH0gZWxzZSB7Ci0JR2V0UmVxKFhGODZWaWRNb2RlU3dpdGNoVG9Nb2RlLCByZXEpOwotCXJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0JcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlU3dpdGNoVG9Nb2RlOwotCXJlcS0+c2NyZWVuID0gc2NyZWVuOwotCXJlcS0+ZG90Y2xvY2sgPQltb2RlbGluZS0+ZG90Y2xvY2s7Ci0JcmVxLT5oZGlzcGxheSA9CW1vZGVsaW5lLT5oZGlzcGxheTsKLQlyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKLQlyZXEtPmhzeW5jZW5kID0JbW9kZWxpbmUtPmhzeW5jZW5kOwotCXJlcS0+aHRvdGFsID0JbW9kZWxpbmUtPmh0b3RhbDsKLQlyZXEtPmhza2V3ID0JbW9kZWxpbmUtPmhza2V3OwotCXJlcS0+dmRpc3BsYXkgPQltb2RlbGluZS0+dmRpc3BsYXk7Ci0JcmVxLT52c3luY3N0YXJ0ID0JbW9kZWxpbmUtPnZzeW5jc3RhcnQ7Ci0JcmVxLT52c3luY2VuZCA9CW1vZGVsaW5lLT52c3luY2VuZDsKLQlyZXEtPnZ0b3RhbCA9CW1vZGVsaW5lLT52dG90YWw7Ci0JcmVxLT5mbGFncyA9CW1vZGVsaW5lLT5mbGFnczsKLQlpZiAocHJvdG9jb2xCdWcpIHsKLQkgICAgcmVxLT5wcml2c2l6ZSA9IDA7Ci0JfSBlbHNlIHsKLQkgICAgcmVxLT5wcml2c2l6ZSA9CW1vZGVsaW5lLT5wcml2c2l6ZTsKLQkgICAgaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgewotCQlyZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7Ci0JCURhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAotCSAgICAgICAgICAgbW9kZWxpbmUtPnByaXZzaXplICogc2l6ZW9mKElOVDMyKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0gICAgCi1Cb29sCi1TRExfTkFNRShYRjg2VmlkTW9kZUxvY2tNb2RlU3dpdGNoKShkcHksIHNjcmVlbiwgbG9jaykKLSAgICBEaXNwbGF5KiBkcHk7Ci0gICAgaW50IHNjcmVlbjsKLSAgICBpbnQgbG9jazsKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlTG9ja01vZGVTd2l0Y2hSZXEgKnJlcTsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NlZpZE1vZGVMb2NrTW9kZVN3aXRjaCwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZUxvY2tNb2RlU3dpdGNoOwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICAgIHJlcS0+bG9jayA9IGxvY2s7Ci0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLSAgICByZXR1cm4gVHJ1ZTsKLX0KLSAgICAKLUJvb2wKLVNETF9OQU1FKFhGODZWaWRNb2RlR2V0TW9uaXRvcikoZHB5LCBzY3JlZW4sIG1vbml0b3IpCi0gICAgRGlzcGxheSogZHB5OwotICAgIGludCBzY3JlZW47Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb25pdG9yKSogbW9uaXRvcjsKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlR2V0TW9uaXRvclJlcGx5IHJlcDsKLSAgICB4WEY4NlZpZE1vZGVHZXRNb25pdG9yUmVxICpyZXE7Ci0gICAgQ0FSRDMyIHN5bmNyYW5nZTsKLSAgICBpbnQgaTsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRNb25pdG9yLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlR2V0TW9uaXRvcjsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgewotCVVubG9ja0Rpc3BsYXkoZHB5KTsKLQlTeW5jSGFuZGxlKCk7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLSAgICBtb25pdG9yLT5uaHN5bmMgPSByZXAubmhzeW5jOwotICAgIG1vbml0b3ItPm52c3luYyA9IHJlcC5udnN5bmM7Ci0jaWYgMAotICAgIG1vbml0b3ItPmJhbmR3aWR0aCA9IChmbG9hdClyZXAuYmFuZHdpZHRoIC8gMWU2OwotI2VuZGlmCi0gICAgaWYgKHJlcC52ZW5kb3JMZW5ndGgpIHsKLQlpZiAoIShtb25pdG9yLT52ZW5kb3IgPSAoY2hhciAqKVhjYWxsb2MocmVwLnZlbmRvckxlbmd0aCArIDEsIDEpKSkgewotCSAgICBfWEVhdERhdGEoZHB5LCAocmVwLm5oc3luYyArIHJlcC5udnN5bmMpICogNCArCi0JCSAgICAgICgocmVwLnZlbmRvckxlbmd0aCszKSAmIH4zKSArICgocmVwLm1vZGVsTGVuZ3RoKzMpICYgfjMpKTsKLSAgICAgICAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICAgICAgICAgIFN5bmNIYW5kbGUoKTsKLQkgICAgcmV0dXJuIEZhbHNlOwotCX0KLSAgICB9IGVsc2UgewotCW1vbml0b3ItPnZlbmRvciA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChyZXAubW9kZWxMZW5ndGgpIHsKLQlpZiAoIShtb25pdG9yLT5tb2RlbCA9IFhjYWxsb2MocmVwLm1vZGVsTGVuZ3RoICsgMSwgMSkpKSB7Ci0JICAgIF9YRWF0RGF0YShkcHksIChyZXAubmhzeW5jICsgcmVwLm52c3luYykgKiA0ICsKLQkJICAgICAgKChyZXAudmVuZG9yTGVuZ3RoKzMpICYgfjMpICsgKChyZXAubW9kZWxMZW5ndGgrMykgJiB+MykpOwotCSAgICBpZiAobW9uaXRvci0+dmVuZG9yKQotCQlYZnJlZShtb25pdG9yLT52ZW5kb3IpOwotICAgICAgICAgICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgICAgICAgICAgU3luY0hhbmRsZSgpOwotCSAgICByZXR1cm4gRmFsc2U7Ci0JfQotICAgIH0gZWxzZSB7Ci0JbW9uaXRvci0+bW9kZWwgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoIShtb25pdG9yLT5oc3luYyA9IFhjYWxsb2MocmVwLm5oc3luYywgc2l6ZW9mKFNETF9OQU1FKFhGODZWaWRNb2RlU3luY1JhbmdlKSkpKSkgewotCV9YRWF0RGF0YShkcHksIChyZXAubmhzeW5jICsgcmVwLm52c3luYykgKiA0ICsKLQkJICAoKHJlcC52ZW5kb3JMZW5ndGgrMykgJiB+MykgKyAoKHJlcC5tb2RlbExlbmd0aCszKSAmIH4zKSk7Ci0JCi0JaWYgKG1vbml0b3ItPnZlbmRvcikKLQkgICAgWGZyZWUobW9uaXRvci0+dmVuZG9yKTsKLQlpZiAobW9uaXRvci0+bW9kZWwpCi0JICAgIFhmcmVlKG1vbml0b3ItPm1vZGVsKTsKLSAgICAgICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgICAgICBTeW5jSGFuZGxlKCk7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLSAgICBpZiAoIShtb25pdG9yLT52c3luYyA9IFhjYWxsb2MocmVwLm52c3luYywgc2l6ZW9mKFNETF9OQU1FKFhGODZWaWRNb2RlU3luY1JhbmdlKSkpKSkgewotCV9YRWF0RGF0YShkcHksIChyZXAubmhzeW5jICsgcmVwLm52c3luYykgKiA0ICsKLQkJICAoKHJlcC52ZW5kb3JMZW5ndGgrMykgJiB+MykgKyAoKHJlcC5tb2RlbExlbmd0aCszKSAmIH4zKSk7Ci0JaWYgKG1vbml0b3ItPnZlbmRvcikKLQkgICAgWGZyZWUobW9uaXRvci0+dmVuZG9yKTsKLQlpZiAobW9uaXRvci0+bW9kZWwpCi0JICAgIFhmcmVlKG1vbml0b3ItPm1vZGVsKTsKLQlYZnJlZShtb25pdG9yLT5oc3luYyk7Ci0gICAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICAgICAgU3luY0hhbmRsZSgpOwotCXJldHVybiBGYWxzZTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IHJlcC5uaHN5bmM7IGkrKykgewotCV9YUmVhZChkcHksIChjaGFyICopJnN5bmNyYW5nZSwgNCk7Ci0JbW9uaXRvci0+aHN5bmNbaV0ubG8gPSAoZmxvYXQpKHN5bmNyYW5nZSAmIDB4RkZGRikgLyAxMDAuMDsKLQltb25pdG9yLT5oc3luY1tpXS5oaSA9IChmbG9hdCkoc3luY3JhbmdlID4+IDE2KSAvIDEwMC4wOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVwLm52c3luYzsgaSsrKSB7Ci0JX1hSZWFkKGRweSwgKGNoYXIgKikmc3luY3JhbmdlLCA0KTsKLQltb25pdG9yLT52c3luY1tpXS5sbyA9IChmbG9hdCkoc3luY3JhbmdlICYgMHhGRkZGKSAvIDEwMC4wOwotCW1vbml0b3ItPnZzeW5jW2ldLmhpID0gKGZsb2F0KShzeW5jcmFuZ2UgPj4gMTYpIC8gMTAwLjA7Ci0gICAgfQotICAgIGlmIChyZXAudmVuZG9yTGVuZ3RoKQotCV9YUmVhZFBhZChkcHksIG1vbml0b3ItPnZlbmRvciwgcmVwLnZlbmRvckxlbmd0aCk7Ci0gICAgZWxzZQotCW1vbml0b3ItPnZlbmRvciA9ICIiOwotICAgIGlmIChyZXAubW9kZWxMZW5ndGgpCi0JX1hSZWFkUGFkKGRweSwgbW9uaXRvci0+bW9kZWwsIHJlcC5tb2RlbExlbmd0aCk7Ci0gICAgZWxzZQotCW1vbml0b3ItPm1vZGVsID0gIiI7Ci0JCi0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLSAgICByZXR1cm4gVHJ1ZTsKLX0KLQotQm9vbAotU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRWaWV3UG9ydCkoZHB5LCBzY3JlZW4sIHgsIHkpCi0gICAgRGlzcGxheSogZHB5OwotICAgIGludCBzY3JlZW47Ci0gICAgaW50ICp4LCAqeTsKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlR2V0Vmlld1BvcnRSZXBseSByZXA7Ci0gICAgeFhGODZWaWRNb2RlR2V0Vmlld1BvcnRSZXEgKnJlcTsKLSAgICBpbnQgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb247Ci0gICAgQm9vbCBwcm90b2NvbEJ1ZyA9IEZhbHNlOwotCi0gICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7Ci0KLSAgICAvKgotICAgICAqIE5vdGU6IFRoZXJlIHdhcyBhIGJ1ZyBpbiB0aGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gaW4gdmVyc2lvbnMKLSAgICAgKiAwLnggd2l0aCB4IDwgOCAobm8gcmVwbHkgd2FzIHNlbnQsIHNvIHRoZSBjbGllbnQgd291bGQgaGFuZykKLSAgICAgKiBDaGVjayB0aGUgc2VydmVyJ3MgdmVyc2lvbiwgYW5kIGRvbid0IHdhaXQgZm9yIGEgcmVwbHkgd2l0aCBvbGRlcgotICAgICAqIHZlcnNpb25zLgotICAgICAqLwotCi0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgaWYgKG1ham9yVmVyc2lvbiA9PSAwICYmIG1pbm9yVmVyc2lvbiA8IDgpIHsKLQlwcm90b2NvbEJ1ZyA9IFRydWU7Ci0jaWZkZWYgREVCVUcKLQlmcHJpbnRmKHN0ZGVyciwgIlhGODZWaWRNb2RlR2V0Vmlld1BvcnQ6IFdhcm5pbmc6IFhzZXJ2ZXIgaXMiCi0JCSJydW5uaW5nIGFuIG9sZCB2ZXJzaW9uICglZC4lZClcbiIsIG1ham9yVmVyc2lvbiwKLQkJbWlub3JWZXJzaW9uKTsKLSNlbmRpZgotICAgIH0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYRjg2VmlkTW9kZUdldFZpZXdQb3J0LCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlR2V0Vmlld1BvcnQ7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgaWYgKHByb3RvY29sQnVnKSB7Ci0JKnggPSAwOwotCSp5ID0gMDsKLSAgICB9IGVsc2UgewotCWlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7Ci0JICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLQkgICAgU3luY0hhbmRsZSgpOwotCSAgICByZXR1cm4gRmFsc2U7Ci0JfQotCSp4ID0gcmVwLng7Ci0JKnkgPSByZXAueTsKLSAgICB9Ci0KLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBUcnVlOwotfQotCi1Cb29sCi1TRExfTkFNRShYRjg2VmlkTW9kZVNldFZpZXdQb3J0KShkcHksIHNjcmVlbiwgeCwgeSkKLSAgICBEaXNwbGF5KiBkcHk7Ci0gICAgaW50IHNjcmVlbjsKLSAgICBpbnQgeCwgeTsKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlU2V0Vmlld1BvcnRSZXEgKnJlcTsKLQotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NlZpZE1vZGVTZXRWaWV3UG9ydCwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZVNldFZpZXdQb3J0OwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICAgIHJlcS0+eCA9IHg7Ci0gICAgcmVxLT55ID0geTsKLQotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0KLUJvb2wKLVNETF9OQU1FKFhGODZWaWRNb2RlR2V0RG90Q2xvY2tzKShkcHksIHNjcmVlbiwKLQkgICAgZmxhZ3NQdHIsIG51bWNsb2Nrc1B0ciwgbWF4Y2xvY2tzUHRyLCBjbG9ja3NQdHIpCi0gICAgRGlzcGxheSogZHB5OwotICAgIGludCBzY3JlZW47Ci0gICAgaW50ICpmbGFnc1B0ciwgKm51bWNsb2Nrc1B0ciwgKm1heGNsb2Nrc1B0ciwgKmNsb2Nrc1B0cltdOyAKLXsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlR2V0RG90Q2xvY2tzUmVwbHkgcmVwOwotICAgIHhYRjg2VmlkTW9kZUdldERvdENsb2Nrc1JlcSAqcmVxOwotICAgIGludCBpLCAqZG90Y2xvY2tzOwotICAgIENBUkQzMiBkb3RjbGs7Ci0KLSAgICBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgR2V0UmVxKFhGODZWaWRNb2RlR2V0RG90Q2xvY2tzLCByZXEpOwotICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7Ci0gICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlR2V0RG90Q2xvY2tzOwotICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwotICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAKLSAgICAgICAgKFNJWkVPRih4WEY4NlZpZE1vZGVHZXREb3RDbG9ja3NSZXBseSkgLSBTSVpFT0YoeFJlcGx5KSkgPj4gMiwgeEZhbHNlKSkKLSAgICB7Ci0gICAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICAgICAgU3luY0hhbmRsZSgpOwotICAgICAgICByZXR1cm4gRmFsc2U7Ci0gICAgfQotICAgICpudW1jbG9ja3NQdHIgPSByZXAuY2xvY2tzOwotICAgICptYXhjbG9ja3NQdHIgPSByZXAubWF4Y2xvY2tzOwotICAgICpmbGFnc1B0ciAgICAgPSByZXAuZmxhZ3M7Ci0KLSAgICBpZiAoIShkb3RjbG9ja3MgPSAoaW50KikgWGNhbGxvYyhyZXAuY2xvY2tzLCBzaXplb2YoaW50KSkpKSB7Ci0gICAgICAgIF9YRWF0RGF0YShkcHksIChyZXAuY2xvY2tzKSAqIDQpOwotICAgICAgICBYZnJlZShkb3RjbG9ja3MpOwotICAgICAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgICAgIFN5bmNIYW5kbGUoKTsKLSAgICAgICAgcmV0dXJuIEZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCByZXAuY2xvY2tzOyBpKyspIHsKLSAgICAgICAgX1hSZWFkKGRweSwgKGNoYXIqKSZkb3RjbGssIDQpOwotCWRvdGNsb2Nrc1tpXSA9IGRvdGNsazsKLSAgICB9Ci0gICAgKmNsb2Nrc1B0ciA9IGRvdGNsb2NrczsKLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBUcnVlOwotfQotCi1Cb29sCi1TRExfTkFNRShYRjg2VmlkTW9kZVNldEdhbW1hUmFtcCkgKAotICAgIERpc3BsYXkgKmRweSwKLSAgICBpbnQgc2NyZWVuLAotICAgIGludCBzaXplLAotICAgIHVuc2lnbmVkIHNob3J0ICpyZWQsCi0gICAgdW5zaWduZWQgc2hvcnQgKmdyZWVuLAotICAgIHVuc2lnbmVkIHNob3J0ICpibHVlCi0pCi17Ci0gICAgaW50IGxlbmd0aCA9IChzaXplICsgMSkgJiB+MTsKLSAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7Ci0gICAgeFhGODZWaWRNb2RlU2V0R2FtbWFSYW1wUmVxICpyZXE7Ci0KLSAgICBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShYRjg2VmlkTW9kZVNldEdhbW1hUmFtcCwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZVNldEdhbW1hUmFtcDsKLSAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKLSAgICByZXEtPmxlbmd0aCArPSAobGVuZ3RoID4+IDEpICogMzsKLSAgICByZXEtPnNpemUgPSBzaXplOwotICAgIF9YU2VuZChkcHksIChjaGFyKilyZWQsIHNpemUgKiAyKTsKLSAgICBfWFNlbmQoZHB5LCAoY2hhciopZ3JlZW4sIHNpemUgKiAyKTsKLSAgICBfWFNlbmQoZHB5LCAoY2hhciopYmx1ZSwgc2l6ZSAqIDIpOwotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0gICAgcmV0dXJuIFRydWU7Ci19Ci0KLQotQm9vbAotU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRHYW1tYVJhbXApICgKLSAgICBEaXNwbGF5ICpkcHksCi0gICAgaW50IHNjcmVlbiwKLSAgICBpbnQgc2l6ZSwKLSAgICB1bnNpZ25lZCBzaG9ydCAqcmVkLAotICAgIHVuc2lnbmVkIHNob3J0ICpncmVlbiwKLSAgICB1bnNpZ25lZCBzaG9ydCAqYmx1ZQotKQotewotICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKLSAgICB4WEY4NlZpZE1vZGVHZXRHYW1tYVJhbXBSZXEgKnJlcTsKLSAgICB4WEY4NlZpZE1vZGVHZXRHYW1tYVJhbXBSZXBseSByZXA7Ci0gIAotICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOwotCi0gICAgTG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRHYW1tYVJhbXAsIHJlcSk7Ci0gICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKLSAgICByZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVHZXRHYW1tYVJhbXA7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgcmVxLT5zaXplID0gc2l6ZTsKLSAgICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSAmcmVwLCAwLCB4RmFsc2UpKSB7Ci0gICAgICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7Ci0gICAgICAgIFN5bmNIYW5kbGUgKCk7Ci0gICAgICAgIHJldHVybiBGYWxzZTsKLSAgICB9Ci0gICAgaWYocmVwLnNpemUpIHsKLQlfWFJlYWQoZHB5LCAoY2hhciopcmVkLCByZXAuc2l6ZSA8PCAxKTsKLQlfWFJlYWQoZHB5LCAoY2hhciopZ3JlZW4sIHJlcC5zaXplIDw8IDEpOwotCV9YUmVhZChkcHksIChjaGFyKilibHVlLCByZXAuc2l6ZSA8PCAxKTsKLSAgICB9Ci0KLSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgU3luY0hhbmRsZSgpOwotICAgIHJldHVybiBUcnVlOwotfQotCi1Cb29sIFNETF9OQU1FKFhGODZWaWRNb2RlR2V0R2FtbWFSYW1wU2l6ZSkoCi0gICAgRGlzcGxheSAqZHB5LAotICAgIGludCBzY3JlZW4sCi0gICAgaW50ICpzaXplCi0pCi17Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOwotICAgIHhYRjg2VmlkTW9kZUdldEdhbW1hUmFtcFNpemVSZXEgKnJlcTsKLSAgICB4WEY4NlZpZE1vZGVHZXRHYW1tYVJhbXBTaXplUmVwbHkgcmVwOwotICAKLSAgICAqc2l6ZSA9IDA7Ci0KLSAgICBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0gICAgR2V0UmVxKFhGODZWaWRNb2RlR2V0R2FtbWFSYW1wU2l6ZSwgcmVxKTsKLSAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOwotICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZUdldEdhbW1hUmFtcFNpemU7Ci0gICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47Ci0gICAgaWYgKCFfWFJlcGx5IChkcHksICh4UmVwbHkgKikgJnJlcCwgMCwgeFRydWUpKSB7Ci0gICAgICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7Ci0gICAgICAgIFN5bmNIYW5kbGUgKCk7Ci0gICAgICAgIHJldHVybiBGYWxzZTsgCi0gICAgfQotICAgICpzaXplID0gcmVwLnNpemU7Ci0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLSAgICByZXR1cm4gVHJ1ZTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hYWxpYi9TRExfYWFldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTFmMTkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hYWxpYi9TRExfYWFldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgQUEgZXZlbnRzIGludG8gU0RMIGV2ZW50cyAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGFhbGliLmg+Ci0KLSNpbmNsdWRlICJTREwuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfYWF2aWRlby5oIgotI2luY2x1ZGUgIlNETF9hYWV2ZW50c19jLmgiCi0KLS8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZXMgZnJvbSBhIGNvbnNvbGUgc2NhbmNvZGUgdG8gYSBTREwga2V5c3ltICovCi1zdGF0aWMgU0RMS2V5IGtleW1hcFs0MDFdOwotCi1zdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKTsKLQotCi12b2lkIEFBX1B1bXBFdmVudHMoX1RISVMpCi17Ci0JaW50IHBvc3RlZCA9IDA7Ci0JaW50IG1vdXNlX2J1dHRvbiwgbW91c2VfeCwgbW91c2VfeTsKLQlpbnQgZXZ0OwotCVNETF9rZXlzeW0ga2V5c3ltOwotCi0Jc3RhdGljIGludCBwcmV2X2J1dHRvbiA9IC0xLCBwcmV2X3ggPSAtMSwgcHJldl95ID0gLTE7Ci0KLQlpZiggISB0aGlzLT5zY3JlZW4gKSAvKiBXYWl0IHRpbGwgd2UgZ290IHRoZSBzY3JlZW4gaW5pdGlhbGl6ZWQgKi8KLQkgIHJldHVybjsKLQotCWRvIHsKLQkJcG9zdGVkID0gMDsKLQkJLyogR2F0aGVyIGV2ZW50cyAqLwotCi0JCS8qIEdldCBtb3VzZSBzdGF0dXMgKi8KLQkJU0RMX211dGV4UChBQV9tdXRleCk7Ci0JCWFhX2dldG1vdXNlIChBQV9jb250ZXh0LCAmbW91c2VfeCwgJm1vdXNlX3ksICZtb3VzZV9idXR0b24pOwotCQlTRExfbXV0ZXhWKEFBX211dGV4KTsKLQkJbW91c2VfeCA9IG1vdXNlX3ggKiB0aGlzLT5zY3JlZW4tPncgLyBhYV9zY3J3aWR0aCAoQUFfY29udGV4dCk7Ci0JCW1vdXNlX3kgPSBtb3VzZV95ICogdGhpcy0+c2NyZWVuLT5oIC8gYWFfc2NyaGVpZ2h0IChBQV9jb250ZXh0KTsKLQotCQkvKiBDb21wYXJlIGFnYWluc3QgcHJldmlvdXMgc3RhdGUgYW5kIGdlbmVyYXRlIGV2ZW50cyAqLwotCQlpZiggcHJldl9idXR0b24gIT0gbW91c2VfYnV0dG9uICkgewotCQkJaWYoIG1vdXNlX2J1dHRvbiAmIEFBX0JVVFRPTjEgKSB7Ci0JCQkJaWYgKCAhIChwcmV2X2J1dHRvbiAmIEFBX0JVVFRPTjEpICkgewotCQkJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgMSwgMCwgMCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIHByZXZfYnV0dG9uICYgQUFfQlVUVE9OMSApIHsKLQkJCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCAxLCAwLCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiggbW91c2VfYnV0dG9uICYgQUFfQlVUVE9OMiApIHsKLQkJCQlpZiAoICEgKHByZXZfYnV0dG9uICYgQUFfQlVUVE9OMikgKSB7Ci0JCQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCAyLCAwLCAwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICggcHJldl9idXR0b24gJiBBQV9CVVRUT04yICkgewotCQkJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIDIsIDAsIDApOwotCQkJCX0KLQkJCX0KLQkJCWlmKCBtb3VzZV9idXR0b24gJiBBQV9CVVRUT04zICkgewotCQkJCWlmICggISAocHJldl9idXR0b24gJiBBQV9CVVRUT04zKSApIHsKLQkJCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIDMsIDAsIDApOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCBwcmV2X2J1dHRvbiAmIEFBX0JVVFRPTjMgKSB7Ci0JCQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgMywgMCwgMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICggcHJldl94ICE9IG1vdXNlX3ggfHwgcHJldl95ICE9IG1vdXNlX3kgKSB7Ci0JCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCBtb3VzZV94LCBtb3VzZV95KTsKLQkJfQotCi0JCXByZXZfYnV0dG9uID0gbW91c2VfYnV0dG9uOwotCQlwcmV2X3ggPSBtb3VzZV94OyBwcmV2X3kgPSBtb3VzZV95OwotCi0JCS8qIEdldCBrZXlib2FyZCBldmVudCAqLwotCQlTRExfbXV0ZXhQKEFBX211dGV4KTsKLQkJZXZ0ID0gYWFfZ2V0ZXZlbnQoQUFfY29udGV4dCwgMCk7Ci0JCVNETF9tdXRleFYoQUFfbXV0ZXgpOwotCQlpZiAoIChldnQgPiBBQV9OT05FKSAmJiAoZXZ0IDwgQUFfUkVMRUFTRSkgJiYgKGV2dCAhPSBBQV9NT1VTRSkgJiYgKGV2dCAhPSBBQV9SRVNJWkUpICkgewotCQkJLyogS2V5IHByZXNzZWQgKi8KLS8qICAgIAkJCXByaW50ZigiS2V5IHByZXNzZWQ6ICVkICglYylcbiIsIGV2dCwgZXZ0KTsgKi8KLQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELCBUcmFuc2xhdGVLZXkoZXZ0LCAma2V5c3ltKSk7Ci0JCX0gZWxzZSBpZiAoIGV2dCA+PSBBQV9SRUxFQVNFICkgewotCQkJLyogS2V5IHJlbGVhc2VkICovCi0JCQlldnQgJj0gfkFBX1JFTEVBU0U7Ci0vKiAgCQkJcHJpbnRmKCJLZXkgcmVsZWFzZWQ6ICVkICglYylcbiIsIGV2dCwgZXZ0KTsgKi8KLQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgVHJhbnNsYXRlS2V5KGV2dCwgJmtleXN5bSkpOwotCQl9Ci0JfSB3aGlsZSAoIHBvc3RlZCApOwotfQotCi12b2lkIEFBX0luaXRPU0tleW1hcChfVEhJUykKLXsKLQlpbnQgaTsKLQlzdGF0aWMgY29uc3QgY2hhciAqc3RkX2tleXMgPSAiIDAxMjM0NTY3ODkwJiMnKClfLXwkKistPS9cXDo7LiwhPzw+e31bXUB+JV5ceDkiOwotCWNvbnN0IGNoYXIgKnN0ZDsKLQotCS8qIEluaXRpYWxpemUgdGhlIEFBbGliIGtleSB0cmFuc2xhdGlvbiB0YWJsZSAqLwotCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKGtleW1hcCk7ICsraSApCi0JCWtleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKLQotCS8qIEFscGhhYmV0IGtleXMgKi8KLQlmb3IgKCBpID0gMDsgaTwyNjsgKytpICl7Ci0JCWtleW1hcFsnYScgKyBpXSA9IFNETEtfYStpOwotCQlrZXltYXBbJ0EnICsgaV0gPSBTRExLX2EraTsKLQl9Ci0JLyogRnVuY3Rpb24ga2V5cyAqLwotCWZvciAoIGkgPSAwOyBpPDEyOyArK2kgKXsKLQkJa2V5bWFwWzMzNCArIGldID0gU0RMS19GMStpOwotCX0KLQkvKiBLZXlzIHRoYXQgaGF2ZSB0aGUgc2FtZSBzeW1ib2xzIGFuZCBkb24ndCBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQgKi8KLQlmb3IoIHN0ZCA9IHN0ZF9rZXlzOyAqc3RkOyBzdGQgKysgKSB7Ci0JCWtleW1hcFsqc3RkXSA9ICpzdGQ7Ci0JfQotCi0Ja2V5bWFwWzEzXSA9IFNETEtfUkVUVVJOOwotCWtleW1hcFtBQV9CQUNLU1BBQ0VdID0gU0RMS19CQUNLU1BBQ0U7Ci0KLQlrZXltYXBbMzY5XSA9IFNETEtfTFNISUZUOwotCWtleW1hcFszNzBdID0gU0RMS19SU0hJRlQ7Ci0Ja2V5bWFwWzM3MV0gPSBTRExLX0xDVFJMOwotCWtleW1hcFszNzJdID0gU0RMS19SQ1RSTDsKLQlrZXltYXBbMzc3XSA9IFNETEtfTEFMVDsKLQlrZXltYXBbMjcwXSA9IFNETEtfUkFMVDsKLQlrZXltYXBbMjcxXSA9IFNETEtfTlVNTE9DSzsKLQlrZXltYXBbMzczXSA9IFNETEtfQ0FQU0xPQ0s7Ci0Ja2V5bWFwWzE2NF0gPSBTRExLX1NDUk9MTE9DSzsKLQotCWtleW1hcFsyNDNdID0gU0RMS19JTlNFUlQ7Ci0Ja2V5bWFwWzMwNF0gPSBTRExLX0RFTEVURTsKLQlrZXltYXBbMjI0XSA9IFNETEtfSE9NRTsKLQlrZXltYXBbMjMxXSA9IFNETEtfRU5EOwotCWtleW1hcFsyMjldID0gU0RMS19QQUdFVVA7Ci0Ja2V5bWFwWzIzMF0gPSBTRExLX1BBR0VET1dOOwotCi0Ja2V5bWFwWzI0MV0gPSBTRExLX1BSSU5UOwotCWtleW1hcFsxNjNdID0gU0RMS19CUkVBSzsKLQotCWtleW1hcFszMDJdID0gU0RMS19LUDA7Ci0Ja2V5bWFwWzMwMF0gPSBTRExLX0tQMTsKLQlrZXltYXBbMjk3XSA9IFNETEtfS1AyOwotCWtleW1hcFsyOTldID0gU0RMS19LUDM7Ci0Ja2V5bWFwWzI5NF0gPSBTRExLX0tQNDsKLQlrZXltYXBbMzAxXSA9IFNETEtfS1A1OwotCWtleW1hcFsyOTZdID0gU0RMS19LUDY7Ci0Ja2V5bWFwWzI5M10gPSBTRExLX0tQNzsKLQlrZXltYXBbMjk1XSA9IFNETEtfS1A4OwotCWtleW1hcFsyOThdID0gU0RMS19LUDk7Ci0KLQlrZXltYXBbQUFfRVNDXSA9IFNETEtfRVNDQVBFOwotCWtleW1hcFtBQV9VUF0gPSBTRExLX1VQOwotCWtleW1hcFtBQV9ET1dOXSA9IFNETEtfRE9XTjsKLQlrZXltYXBbQUFfTEVGVF0gPSBTRExLX0xFRlQ7Ci0Ja2V5bWFwW0FBX1JJR0hUXSA9IFNETEtfUklHSFQ7Ci19Ci0KLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0pCi17Ci0JLyogU2FuaXR5IGNoZWNrICovCi0JaWYgKCBzY2FuY29kZSA+PSBTRExfYXJyYXlzaXplKGtleW1hcCkgKQotCQlzY2FuY29kZSA9IEFBX1VOS05PV047Ci0KLQkvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLwotCWtleXN5bS0+c2NhbmNvZGUgPSBzY2FuY29kZTsKLQlrZXlzeW0tPnN5bSA9IGtleW1hcFtzY2FuY29kZV07Ci0Ja2V5c3ltLT5tb2QgPSBLTU9EX05PTkU7Ci0KLQkvKiBJZiBVTklDT0RFIGlzIG9uLCBnZXQgdGhlIFVOSUNPREUgdmFsdWUgZm9yIHRoZSBrZXkgKi8KLQlrZXlzeW0tPnVuaWNvZGUgPSAwOwotCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSB7Ci0JCS8qIFBvcHVsYXRlIHRoZSB1bmljb2RlIGZpZWxkIHdpdGggdGhlIEFTQ0lJIHZhbHVlICovCi0JCWtleXN5bS0+dW5pY29kZSA9IHNjYW5jb2RlOwotCX0KLQlyZXR1cm4oa2V5c3ltKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhMWMyZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2FhbGliL1NETF9hYWV2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9hYXZpZGVvLmgiCi0KLS8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFNETF9zeXNldmVudHMuYyB0byBvdGhlciBwYXJ0cyAKLSAgIG9mIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIChTRExfc3lzdmlkZW8uYykKLSovCi1leHRlcm4gdm9pZCBBQV9pbml0a2V5bWFwcyhpbnQgZmQpOwotZXh0ZXJuIHZvaWQgQUFfbW91c2VjYWxsYmFjayhpbnQgYnV0dG9uLCBpbnQgZHgsIGludCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1MSxpbnQgdTIsaW50IHUzLCBpbnQgdTQpOwotZXh0ZXJuIHZvaWQgQUFfa2V5Ym9hcmRjYWxsYmFjayhpbnQgc2NhbmNvZGUsIGludCBwcmVzc2VkKTsKLQotZXh0ZXJuIHZvaWQgQUFfSW5pdE9TS2V5bWFwKF9USElTKTsKLWV4dGVybiB2b2lkIEFBX1B1bXBFdmVudHMoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hYWxpYi9TRExfYWFtb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hYWxpYi9TRExfYWFtb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWQxOTdkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhbW91c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotI2luY2x1ZGUgIlNETF9hYW1vdXNlX2MuaCIKLQotCi0vKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KLXN0cnVjdCBXTWN1cnNvciB7Ci0JaW50IHVudXNlZDsKLX07CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2FhbGliL1NETF9hYW1vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhbW91c2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTA2Y2YyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhbW91c2VfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfYWF2aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjMzIyZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2FhbGliL1NETF9hYXZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFBbGliIGJhc2VkIFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb24uCi0qLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotCi0jaW5jbHVkZSAiU0RMX2FhdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfYWFldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9hYW1vdXNlX2MuaCIKLQotI2luY2x1ZGUgPGFhbGliLmg+Ci0KLS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBBQV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKipBQV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIFNETF9TdXJmYWNlICpBQV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgaW50IEFBX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgdm9pZCBBQV9WaWRlb1F1aXQoX1RISVMpOwotCi0vKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBBQV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBBQV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IEFBX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIEFBX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgQUFfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0vKiBDYWNoZSB0aGUgVmlkZW9EZXZpY2Ugc3RydWN0ICovCi1zdGF0aWMgc3RydWN0IFNETF9WaWRlb0RldmljZSAqbG9jYWxfdGhpczsKLQotLyogQUFsaWIgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBBQV9BdmFpbGFibGUodm9pZCkKLXsKLQlyZXR1cm4gMTsgLyogQWx3YXlzIGF2YWlsYWJsZSAhICovCi19Ci0KLXN0YXRpYyB2b2lkIEFBX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKLXsKLQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0JU0RMX2ZyZWUoZGV2aWNlKTsKLX0KLQotc3RhdGljIFNETF9WaWRlb0RldmljZSAqQUFfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotCWlmICggZGV2aWNlICkgewotCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7Ci0JCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQl9Ci0JaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWlmICggZGV2aWNlICkgewotCQkJU0RMX2ZyZWUoZGV2aWNlKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JZGV2aWNlLT5WaWRlb0luaXQgPSBBQV9WaWRlb0luaXQ7Ci0JZGV2aWNlLT5MaXN0TW9kZXMgPSBBQV9MaXN0TW9kZXM7Ci0JZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBBQV9TZXRWaWRlb01vZGU7Ci0JZGV2aWNlLT5DcmVhdGVZVVZPdmVybGF5ID0gTlVMTDsKLQlkZXZpY2UtPlNldENvbG9ycyA9IEFBX1NldENvbG9yczsKLQlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKLQlkZXZpY2UtPlZpZGVvUXVpdCA9IEFBX1ZpZGVvUXVpdDsKLQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gQUFfQWxsb2NIV1N1cmZhY2U7Ci0JZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7Ci0JZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOwotCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7Ci0JZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gQUFfTG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IEFBX1VubG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOwotCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IEFBX0ZyZWVIV1N1cmZhY2U7Ci0JZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKLQlkZXZpY2UtPlNldEljb24gPSBOVUxMOwotCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7Ci0JZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOwotCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IEFBX0luaXRPU0tleW1hcDsKLQlkZXZpY2UtPlB1bXBFdmVudHMgPSBBQV9QdW1wRXZlbnRzOwotCi0JZGV2aWNlLT5mcmVlID0gQUFfRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIGRldmljZTsKLX0KLQotVmlkZW9Cb290U3RyYXAgQUFMSUJfYm9vdHN0cmFwID0gewotCSJhYWxpYiIsICJBU0NJSSBBcnQgTGlicmFyeSIsCi0JQUFfQXZhaWxhYmxlLCBBQV9DcmVhdGVEZXZpY2UKLX07Ci0KLXN0YXRpYyB2b2lkIEFBX1Jlc2l6ZUhhbmRsZXIoYWFfY29udGV4dCAqKTsKLQotaW50IEFBX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotCWludCBrZXlib2FyZDsKLQlpbnQgaTsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JZm9yICggaT0wOyBpPFNETF9OVU1NT0RFUzsgKytpICkgewotCQlTRExfbW9kZWxpc3RbaV0gPSBTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpOwotCQlTRExfbW9kZWxpc3RbaV0tPnggPSBTRExfbW9kZWxpc3RbaV0tPnkgPSAwOwotCX0KLQkvKiBNb2RlcyBzb3J0ZWQgbGFyZ2VzdCB0byBzbWFsbGVzdCAqLwotCVNETF9tb2RlbGlzdFswXS0+dyA9IDEwMjQ7IFNETF9tb2RlbGlzdFswXS0+aCA9IDc2ODsKLQlTRExfbW9kZWxpc3RbMV0tPncgPSA4MDA7IFNETF9tb2RlbGlzdFsxXS0+aCA9IDYwMDsKLQlTRExfbW9kZWxpc3RbMl0tPncgPSA2NDA7IFNETF9tb2RlbGlzdFsyXS0+aCA9IDQ4MDsKLQlTRExfbW9kZWxpc3RbM10tPncgPSAzMjA7IFNETF9tb2RlbGlzdFszXS0+aCA9IDQwMDsKLQlTRExfbW9kZWxpc3RbNF0tPncgPSAzMjA7IFNETF9tb2RlbGlzdFs0XS0+aCA9IDI0MDsKLQlTRExfbW9kZWxpc3RbNV0tPncgPSAzMjA7IFNETF9tb2RlbGlzdFs1XS0+aCA9IDIwMDsKLQlTRExfbW9kZWxpc3RbNl0gPSBOVUxMOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSAqLwotCi0JQUFfbXV0ZXggPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLQotCWFhX3BhcnNlb3B0aW9ucyAoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0KLQlBQV9jb250ZXh0ID0gYWFfYXV0b2luaXQoJmFhX2RlZnBhcmFtcyk7Ci0JaWYgKCAhIEFBX2NvbnRleHQgKSB7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUgQUFsaWIiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBFbmFibGUgbW91c2UgYW5kIGtleWJvYXJkIHN1cHBvcnQgKi8KLQotCWlmICggISBhYV9hdXRvaW5pdGtiZCAoQUFfY29udGV4dCwgQUFfU0VORFJFTEVBU0UpICkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBpbml0aWFsaXplIEFBbGliIGtleWJvYXJkIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCWlmICggISBhYV9hdXRvaW5pdG1vdXNlIChBQV9jb250ZXh0LCBBQV9TRU5EUkVMRUFTRSkgKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJXYXJuaW5nOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBBQWxpYiBtb3VzZSIpOwotCX0KLQlBQV9ycGFyYW1zID0gYWFfZ2V0cmVuZGVycGFyYW1zKCk7Ci0KLQlsb2NhbF90aGlzID0gdGhpczsKLQotCWFhX3Jlc2l6ZWhhbmRsZXIoQUFfY29udGV4dCwgQUFfUmVzaXplSGFuZGxlcik7Ci0KLQlmcHJpbnRmKHN0ZGVyciwiVXNpbmcgQUFsaWIgZHJpdmVyOiAlcyAoJXMpXG4iLCBBQV9jb250ZXh0LT5kcml2ZXItPm5hbWUsIEFBX2NvbnRleHQtPmRyaXZlci0+c2hvcnRuYW1lKTsKLQotCUFBX2luX3gxMSA9IChTRExfc3RyY21wKEFBX2NvbnRleHQtPmRyaXZlci0+c2hvcnRuYW1lLCJYMTEiKSA9PSAwKTsKLQkvKiBEZXRlcm1pbmUgdGhlIHNjcmVlbiBkZXB0aCAodXNlIGRlZmF1bHQgOC1iaXQgZGVwdGgpICovCi0JdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gODsKLQl2Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gMTsKLQotCS8qIFdlJ3JlIGRvbmUhICovCi0JcmV0dXJuKDApOwotfQotCi1TRExfUmVjdCAqKkFBX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLSAgICAgaWYoZm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gOCkKLSAJCXJldHVybiBOVUxMOwotCi0JIGlmICggZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKLQkJIHJldHVybiBTRExfbW9kZWxpc3Q7Ci0JIH0gZWxzZSB7Ci0JCSByZXR1cm4gKFNETF9SZWN0ICoqKSAtMTsKLQkgfQotfQotCi0vKiBGcm9tIGFhdmdhLmMKLSAgIEFBbGliIGRvZXMgbm90IGdpdmUgdXMgdGhlIGNob2ljZSBvZiB0aGUgYWN0dWFsIHJlc29sdXRpb24sIHRodXMgd2UgaGF2ZSB0byBzaW11bGF0ZSBhZGRpdGlvbmFsCi0gICByZXNvbHV0aW9uIGJ5IHNjYWxpbmcgZG93biBtYW51YWxseSBlYWNoIGZyYW1lCi0qLwotc3RhdGljIHZvaWQgZmFzdHNjYWxlIChyZWdpc3RlciBjaGFyICpiMSwgcmVnaXN0ZXIgY2hhciAqYjIsIGludCB4MSwgaW50IHgyLCBpbnQgeTEsIGludCB5MikKLXsKLQlyZWdpc3RlciBpbnQgZXgsIHNweCA9IDAsIGRkeCwgZGR4MTsKLQlpbnQgZGR5MSwgZGR5LCBzcHkgPSAwLCBleTsKLQlpbnQgeDsKLQljaGFyICpiYjEgPSBiMTsKLQlpZiAoIXgxIHx8ICF4MiB8fCAheTEgfHwgIXkyKQotCQlyZXR1cm47Ci0JZGR4ID0geDEgKyB4MTsKLQlkZHgxID0geDIgKyB4MjsKLQlpZiAoZGR4MSA8IGRkeCkKLQkJc3B4ID0gZGR4IC8gZGR4MSwgZGR4ICU9IGRkeDE7Ci0JZGR5ID0geTEgKyB5MTsKLQlkZHkxID0geTIgKyB5MjsKLQlpZiAoZGR5MSA8IGRkeSkKLQkJc3B5ID0gKGRkeSAvIGRkeTEpICogeDEsIGRkeSAlPSBkZHkxOwotCWV5ID0gLWRkeTE7Ci0JZm9yICg7IHkyOyB5Mi0tKSB7Ci0JCWV4ID0gLWRkeDE7Ci0JCWZvciAoeCA9IHgyOyB4OyB4LS0pIHsKLQkJCSpiMiA9ICpiMTsKLQkJCWIyKys7Ci0JCQliMSArPSBzcHg7Ci0JCQlleCArPSBkZHg7Ci0JCQlpZiAoZXggPiAwKSB7Ci0JCQkJYjErKzsKLQkJCQlleCAtPSBkZHgxOwotCQkJfQotCQl9Ci0JCWJiMSArPSBzcHk7Ci0JCWV5ICs9IGRkeTsKLQkJaWYgKGV5ID4gMCkgewotCQkJYmIxICs9IHgxOwotCQkJZXkgLT0gZGR5MTsKLQkJfQotCQliMSA9IGJiMTsKLQl9Ci19Ci0KLS8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCi1zdGF0aWMgdm9pZCBBQV9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotU0RMX1N1cmZhY2UgKkFBX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JaW50IG1vZGU7Ci0KLQlpZiAoIEFBX2J1ZmZlciApIHsKLQkJU0RMX2ZyZWUoIEFBX2J1ZmZlciApOwotCX0KLQotCUFBX2J1ZmZlciA9IFNETF9tYWxsb2Mod2lkdGggKiBoZWlnaHQpOwotCWlmICggISBBQV9idWZmZXIgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgYnVmZmVyIGZvciByZXF1ZXN0ZWQgbW9kZSIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0vKiAJcHJpbnRmKCJTZXR0aW5nIG1vZGUgJWR4JWRcbiIsIHdpZHRoLCBoZWlnaHQpOyAqLwotCi0JU0RMX21lbXNldChhYV9pbWFnZShBQV9jb250ZXh0KSwgMCwgYWFfaW1nd2lkdGgoQUFfY29udGV4dCkgKiBhYV9pbWdoZWlnaHQoQUFfY29udGV4dCkpOwotCVNETF9tZW1zZXQoQUFfYnVmZmVyLCAwLCB3aWR0aCAqIGhlaWdodCk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgdGhlIHNjcmVlbiAqLwotCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCA4LCAwLCAwLCAwLCAwKSApIHsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KLQljdXJyZW50LT5mbGFncyA9IFNETF9GVUxMU0NSRUVOOwotCUFBX3cgPSBjdXJyZW50LT53ID0gd2lkdGg7Ci0JQUFfaCA9IGN1cnJlbnQtPmggPSBoZWlnaHQ7Ci0JY3VycmVudC0+cGl0Y2ggPSBjdXJyZW50LT53OwotCWN1cnJlbnQtPnBpeGVscyA9IEFBX2J1ZmZlcjsKLQotCUFBX3hfcmF0aW8gPSAoKGRvdWJsZSlhYV9pbWd3aWR0aChBQV9jb250ZXh0KSkgLyAoKGRvdWJsZSl3aWR0aCk7Ci0JQUFfeV9yYXRpbyA9ICgoZG91YmxlKWFhX2ltZ2hlaWdodChBQV9jb250ZXh0KSkgLyAoKGRvdWJsZSloZWlnaHQpOwotCi0JLyogU2V0IHRoZSBibGl0IGZ1bmN0aW9uICovCi0JdGhpcy0+VXBkYXRlUmVjdHMgPSBBQV9EaXJlY3RVcGRhdGU7Ci0KLQkvKiBXZSdyZSBkb25lICovCi0JcmV0dXJuKGN1cnJlbnQpOwotfQotCi1zdGF0aWMgdm9pZCBBQV9SZXNpemVIYW5kbGVyKGFhX2NvbnRleHQgKmNvbnRleHQpCi17Ci0JYWFfcmVzaXplKGNvbnRleHQpOwotCWxvY2FsX3RoaXMtPmhpZGRlbi0+eF9yYXRpbyA9ICgoZG91YmxlKWFhX2ltZ3dpZHRoKGNvbnRleHQpKSAvICgoZG91YmxlKWxvY2FsX3RoaXMtPnNjcmVlbi0+dyk7Ci0JbG9jYWxfdGhpcy0+aGlkZGVuLT55X3JhdGlvID0gKChkb3VibGUpYWFfaW1naGVpZ2h0KGNvbnRleHQpKSAvICgoZG91YmxlKWxvY2FsX3RoaXMtPnNjcmVlbi0+aCk7Ci0KLQlmYXN0c2NhbGUgKGxvY2FsX3RoaXMtPmhpZGRlbi0+YnVmZmVyLCBhYV9pbWFnZShjb250ZXh0KSwgbG9jYWxfdGhpcy0+aGlkZGVuLT53LCBhYV9pbWd3aWR0aCAoY29udGV4dCksIGxvY2FsX3RoaXMtPmhpZGRlbi0+aCwgYWFfaW1naGVpZ2h0IChjb250ZXh0KSk7Ci0JYWFfcmVuZGVycGFsZXR0ZShjb250ZXh0LCBsb2NhbF90aGlzLT5oaWRkZW4tPnBhbGV0dGUsIGxvY2FsX3RoaXMtPmhpZGRlbi0+cnBhcmFtcywgMCwgMCwgYWFfc2Nyd2lkdGgoY29udGV4dCksIGFhX3NjcmhlaWdodChjb250ZXh0KSk7Ci0JYWFfZmx1c2goY29udGV4dCk7Ci19Ci0KLS8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCi1zdGF0aWMgaW50IEFBX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4oLTEpOwotfQotc3RhdGljIHZvaWQgQUFfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotCi0vKiBXZSBuZWVkIHRvIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2Ugb24gcGFnZSBmbGlwcGVkIGRpc3BsYXlzICovCi1zdGF0aWMgaW50IEFBX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCS8qIFRPRE8gPyAqLwotCXJldHVybigwKTsKLX0KLXN0YXRpYyB2b2lkIEFBX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotCi0vKiBGSVhNRTogSG93IGlzIHRoaXMgZG9uZSB3aXRoIEFBbGliPyAqLwotc3RhdGljIGludCBBQV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlTRExfbXV0ZXhQKEFBX211dGV4KTsKLQlhYV9mbHVzaChBQV9jb250ZXh0KTsKLQlTRExfbXV0ZXhWKEFBX211dGV4KTsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEFBX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JaW50IGk7Ci0JU0RMX1JlY3QgKnJlY3Q7Ci0KLQlmYXN0c2NhbGUgKEFBX2J1ZmZlciwgYWFfaW1hZ2UoQUFfY29udGV4dCksIEFBX3csIGFhX2ltZ3dpZHRoIChBQV9jb250ZXh0KSwgQUFfaCwgYWFfaW1naGVpZ2h0IChBQV9jb250ZXh0KSk7Ci0jaWYgMQotCWFhX3JlbmRlcnBhbGV0dGUoQUFfY29udGV4dCwgQUFfcGFsZXR0ZSwgQUFfcnBhcmFtcywgMCwgMCwgYWFfc2Nyd2lkdGgoQUFfY29udGV4dCksIGFhX3NjcmhlaWdodChBQV9jb250ZXh0KSk7Ci0jZWxzZQotCS8qIFJlbmRlciBvbmx5IHRoZSByZWN0YW5nbGVzIGluIHRoZSBsaXN0ICovCi0JcHJpbnRmKCJVcGRhdGUgcmVjdHMgOiAiKTsKLQlmb3IgKCBpPTA7IGkgPCBudW1yZWN0czsgKytpICkgewotCQlyZWN0ID0gJnJlY3RzW2ldOwotCQlwcmludGYoIiglZCwlZC0lZCwlZCkiLCByZWN0LT54LCByZWN0LT55LCByZWN0LT53LCByZWN0LT5oKTsKLQkJYWFfcmVuZGVycGFsZXR0ZShBQV9jb250ZXh0LCBBQV9wYWxldHRlLCBBQV9ycGFyYW1zLCByZWN0LT54ICogQUFfeF9yYXRpbywgcmVjdC0+eSAqIEFBX3lfcmF0aW8sIHJlY3QtPncgKiBBQV94X3JhdGlvLCByZWN0LT5oICogQUFfeV9yYXRpbyk7Ci0JfQotCXByaW50ZigiXG4iKTsKLSNlbmRpZgotCVNETF9tdXRleFAoQUFfbXV0ZXgpOwotCWFhX2ZsdXNoKEFBX2NvbnRleHQpOwotCVNETF9tdXRleFYoQUFfbXV0ZXgpOwotCXJldHVybjsKLX0KLQotaW50IEFBX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKLXsKLQlpbnQgaTsKLQotCWZvciAoIGk9MDsgaSA8IG5jb2xvcnM7IGkrKyApIHsKLQkgICAgICAgIGFhX3NldHBhbGV0dGUoQUFfcGFsZXR0ZSwgZmlyc3Rjb2xvciArIGksCi0JCQkgICAgICBjb2xvcnNbaV0ucj4+MiwKLQkJCSAgICAgIGNvbG9yc1tpXS5nPj4yLAotCQkJICAgICAgY29sb3JzW2ldLmI+PjIpOwotCX0KLQlyZXR1cm4oMSk7Ci19Ci0KLS8qIE5vdGU6ICBJZiB3ZSBhcmUgdGVybWluYXRlZCwgdGhpcyBjb3VsZCBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZgotICAgYW5vdGhlciBTREwgdmlkZW8gcm91dGluZSAtLSBub3RhYmx5IFVwZGF0ZVJlY3RzLgotKi8KLXZvaWQgQUFfVmlkZW9RdWl0KF9USElTKQotewotCWludCBpOwotCi0JYWFfdW5pbml0a2JkKEFBX2NvbnRleHQpOwotCWFhX3VuaW5pdG1vdXNlKEFBX2NvbnRleHQpOwotCi0JLyogRnJlZSB2aWRlbyBtb2RlIGxpc3RzICovCi0JZm9yICggaT0wOyBpPFNETF9OVU1NT0RFUzsgKytpICkgewotCQlpZiAoIFNETF9tb2RlbGlzdFtpXSAhPSBOVUxMICkgewotCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKLQkJCVNETF9tb2RlbGlzdFtpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0JCi0JYWFfY2xvc2UoQUFfY29udGV4dCk7Ci0KLQlTRExfRGVzdHJveU11dGV4KEFBX211dGV4KTsKLQotCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsJCi19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2FhbGliL1NETF9hYXZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2FhbGliL1NETF9hYXZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzBjOWYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hYWxpYi9TRExfYWF2aWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9hYXZpZGVvX2gKLSNkZWZpbmUgX1NETF9hYXZpZGVvX2gKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0jaW5jbHVkZSA8YWFsaWIuaD4KLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi0jZGVmaW5lIFNETF9OVU1NT0RFUyA2Ci0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotCVNETF9SZWN0ICpTRExfbW9kZWxpc3RbU0RMX05VTU1PREVTKzFdOwotCWFhX2NvbnRleHQgKmNvbnRleHQ7Ci0JYWFfcGFsZXR0ZSBwYWxldHRlOwotCWFhX3JlbmRlcnBhcmFtcyAqcnBhcmFtczsKLQlkb3VibGUgeF9yYXRpbywgeV9yYXRpbzsKLSAgICBpbnQgdywgaDsKLSAgICBTRExfbXV0ZXggKm11dGV4OwotICAgIGludCBpbl94MTE7Ci0gICAgdm9pZCAqYnVmZmVyOwotfTsKLQotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIFNETF9tb2RlbGlzdAkJKHRoaXMtPmhpZGRlbi0+U0RMX21vZGVsaXN0KQotI2RlZmluZSBBQV9jb250ZXh0CQkgICAgKHRoaXMtPmhpZGRlbi0+Y29udGV4dCkKLSNkZWZpbmUgQUFfcGFsZXR0ZQkJICAgICh0aGlzLT5oaWRkZW4tPnBhbGV0dGUpCi0jZGVmaW5lIEFBX3JwYXJhbXMJCSAgICAodGhpcy0+aGlkZGVuLT5ycGFyYW1zKQotI2RlZmluZSBBQV9idWZmZXIJCSAgICAodGhpcy0+aGlkZGVuLT5idWZmZXIpCi0KLSNkZWZpbmUgQUFfeF9yYXRpbwkJICAgICh0aGlzLT5oaWRkZW4tPnhfcmF0aW8pCi0jZGVmaW5lIEFBX3lfcmF0aW8JCSAgICAodGhpcy0+aGlkZGVuLT55X3JhdGlvKQotCi0jZGVmaW5lIEFBX211dGV4CQkgICAgKHRoaXMtPmhpZGRlbi0+bXV0ZXgpCi0jZGVmaW5lIEFBX2luX3gxMQkJICAgICh0aGlzLT5oaWRkZW4tPmluX3gxMSkKLSNkZWZpbmUgQUFfdyAgICAgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT53KQotI2RlZmluZSBBQV9oICAgICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPmgpCi0KLSNlbmRpZiAvKiBfU0RMX2FhdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmljMnAuUyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpYzJwLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MDEyYjMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmljMnAuUworKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKgotCUNodW5reSB0byBwbGFuYXIgY29udmVyc2lvbiByb3V0aW5lCi0JMSBieXRlL3BpeGVsIC0+IDQgb3IgOCBiaXQgcGxhbmVzCi0KLQlQYXRyaWNlIE1hbmRpbgotCVhhdmllciBKb3ViZXJ0Ci0JTWlrYWVsIEthbG1zCi0qLwotCi0JLmdsb2JsCV9TRExfQXRhcmlfQzJwQ29udmVydAotCS5nbG9ibAlfU0RMX0F0YXJpX0MycENvbnZlcnQ4Ci0JLmdsb2JsCV9TRExfQXRhcmlfQzJwQ29udmVydDQKLQkuZ2xvYmwJX1NETF9BdGFyaV9DMnBDb252ZXJ0NF9wYWwKLQotLyogLS0tLS0tLS0tLS0tCUNvbnZlcnNpb24gQzJQLCA4IGJpdHMgLS0tLS0tLS0tLS0tICovCi0KLQkudGV4dAotX1NETF9BdGFyaV9DMnBDb252ZXJ0ODoKLQltb3ZlbAlzcEAoNCksYzJwX3NvdXJjZQotCW1vdmVsCXNwQCg4KSxjMnBfZGVzdAotCW1vdmVsCXNwQCgxMiksYzJwX3dpZHRoCi0JbW92ZWwJc3BAKDE2KSxjMnBfaGVpZ2h0Ci0JbW92ZWwJc3BAKDIwKSxjMnBfZGJsbGlnbmUKLQltb3ZlbAlzcEAoMjQpLGMycF9zcmNwaXRjaAotCW1vdmVsCXNwQCgyOCksYzJwX2RzdHBpdGNoCi0KLQltb3ZlbWwJZDItZDcvYTItYTYsc3BALQotCi0JbW92ZWwJYzJwX3NvdXJjZSxjMnBfY3Vyc3JjCi0JbW92ZWwJYzJwX2Rlc3QsYzJwX2N1cmRzdAotCW1vdmVsCSMweDBmMGYwZjBmLGQ0Ci0JbW92ZWwJIzB4MDBmZjAwZmYsZDUKLQltb3ZlbAkjMHg1NTU1NTU1NSxkNgotCW1vdmV3CWMycF9oZWlnaHQrMixjMnBfcm93Ci0JbW92ZXcJYzJwX3dpZHRoKzIsZDAKLQlhbmR3CSMtOCxkMAotCW1vdmV3CWQwLGMycF9yb3dsZW4KLQotU0RMX0F0YXJpX0MycDhfcm93bG9vcDoKLQotCW1vdmVsCWMycF9jdXJzcmMsYTAKLQltb3ZlbAljMnBfY3VyZHN0LGExCi0KLQltb3ZlbAlhMCxhMgotCWFkZHcJYzJwX3Jvd2xlbixhMgotCi0JbW92ZWwJYTBAKyxkMAotCW1vdmVsCWEwQCssZDEKLQltb3ZlbAlhMEArLGQyCi0JbW92ZWwJYTBAKyxkMwotLyoKLQlkMCA9IGE3YTZhNWE0YTNhMmExYTAgYjdiNmI1YjRiM2IyYjFiMCBjN2M2YzVjNGMzYzJjMWMwIGQ3ZDZkNWQ0ZDNkMmQxZDAKLQlkMSA9IGU3ZTZlNWU0ZTNlMmUxZTAgZjdmNmY1ZjRmM2YyZjFmMCBnN2c2ZzVnNGczZzJnMWcwIGg3aDZoNWg0aDNoMmgxaDAKLQlkMiA9IGk3aTZpNWk0aTNpMmkxaTAgajdqNmo1ajRqM2oyajFqMCBrN2s2azVrNGszazJrMWswIGw3bDZsNWw0bDNsMmwxbDAKLQlkMyA9IG03bTZtNW00bTNtMm0xbTAgbjduNm41bjRuM24ybjFuMCBvN282bzVvNG8zbzJvMW8wIHA3cDZwNXA0cDNwMnAxcDAKLSovCi0JbW92ZWwJZDEsZDcKLQlsc3JsCSM0LGQ3Ci0JZW9ybAlkMCxkNwotCWFuZGwJZDQsZDcKLQllb3JsCWQ3LGQwCi0JbHNsbAkjNCxkNwotCWVvcmwJZDcsZDEKLQotCW1vdmVsCWQzLGQ3Ci0JbHNybAkjNCxkNwotCWVvcmwJZDIsZDcKLQlhbmRsCWQ0LGQ3Ci0JZW9ybAlkNyxkMgotCWxzbGwJIzQsZDcKLQllb3JsCWQ3LGQzCi0KLQltb3ZlbAlkMixkNwotCWxzcmwJIzgsZDcKLQllb3JsCWQwLGQ3Ci0gCWFuZGwJZDUsZDcKLQllb3JsCWQ3LGQwCi0JbHNsbAkjOCxkNwotCWVvcmwJZDcsZDIKLQotCW1vdmVsCWQzLGQ3Ci0JbHNybAkjOCxkNwotCWVvcmwJZDEsZDcKLSAJYW5kbAlkNSxkNwotCWVvcmwJZDcsZDEKLQlsc2xsCSM4LGQ3Ci0JZW9ybAlkNyxkMwotLyoKLQlkMCA9IGE3YTZhNWE0ZTdlNmU1ZTQgaTdpNmk1aTRtN202bTVtNCBjN2M2YzVjNGc3ZzZnNWc0IGs3azZrNWs0bzdvNm81bzQKLQlkMSA9IGEzYTJhMWEwZTNlMmUxZTAgaTNpMmkxaTBtM20ybTFtMCBjM2MyYzFjMGczZzJnMWcwIGszazJrMWswbzNvMm8xbzAKLQlkMiA9IGI3YjZiNWI0ZjdmNmY1ZjQgajdqNmo1ajRuN242bjVuNCBkN2Q2ZDVkNGg3aDZoNWg0IGw3bDZsNWw0cDdwNnA1cDQKLQlkMyA9IGIzYjJiMWIwZjNmMmYxZjAgajNqMmoxajBuM24ybjFuMCBkM2QyZDFkMGgzaDJoMWgwIGwzbDJsMWwwcDNwMnAxcDAKLSovCi0JYnJhcwlTRExfQXRhcmlfQzJwOF9zdGFydAotCi1TRExfQXRhcmlfQzJwOF9waXgxNjoKLQotCW1vdmVsCWEwQCssZDAKLQltb3ZlbAlhMEArLGQxCi0JbW92ZWwJYTBAKyxkMgotCW1vdmVsCWEwQCssZDMKLS8qCi0JZDAgPSBhN2E2YTVhNGEzYTJhMWEwIGI3YjZiNWI0YjNiMmIxYjAgYzdjNmM1YzRjM2MyYzFjMCBkN2Q2ZDVkNGQzZDJkMWQwCi0JZDEgPSBlN2U2ZTVlNGUzZTJlMWUwIGY3ZjZmNWY0ZjNmMmYxZjAgZzdnNmc1ZzRnM2cyZzFnMCBoN2g2aDVoNGgzaDJoMWgwCi0JZDIgPSBpN2k2aTVpNGkzaTJpMWkwIGo3ajZqNWo0ajNqMmoxajAgazdrNms1azRrM2syazFrMCBsN2w2bDVsNGwzbDJsMWwwCi0JZDMgPSBtN202bTVtNG0zbTJtMW0wIG43bjZuNW40bjNuMm4xbjAgbzdvNm81bzRvM28ybzFvMCBwN3A2cDVwNHAzcDJwMXAwCi0qLwotCW1vdmVsCWQxLGQ3Ci0JbHNybAkjNCxkNwotCW1vdmVsCWEzLGExQCsKLQllb3JsCWQwLGQ3Ci0JYW5kbAlkNCxkNwotCWVvcmwJZDcsZDAKLQlsc2xsCSM0LGQ3Ci0JZW9ybAlkNyxkMQotCi0JbW92ZWwJZDMsZDcKLQlsc3JsCSM0LGQ3Ci0JZW9ybAlkMixkNwotCWFuZGwJZDQsZDcKLQllb3JsCWQ3LGQyCi0JbW92ZWwJYTQsYTFAKwotCWxzbGwJIzQsZDcKLQllb3JsCWQ3LGQzCi0KLQltb3ZlbAlkMixkNwotCWxzcmwJIzgsZDcKLQllb3JsCWQwLGQ3Ci0JYW5kbAlkNSxkNwotCWVvcmwJZDcsZDAKLQltb3ZlbAlhNSxhMUArCi0JbHNsbAkjOCxkNwotCWVvcmwJZDcsZDIKLQotCW1vdmVsCWQzLGQ3Ci0JbHNybAkjOCxkNwotCWVvcmwJZDEsZDcKLQlhbmRsCWQ1LGQ3Ci0JZW9ybAlkNyxkMQotCW1vdmVsCWE2LGExQCsKLQlsc2xsCSM4LGQ3Ci0JZW9ybAlkNyxkMwotLyoKLQlkMCA9IGE3YTZhNWE0ZTdlNmU1ZTQgaTdpNmk1aTRtN202bTVtNCBjN2M2YzVjNGc3ZzZnNWc0IGs3azZrNWs0bzdvNm81bzQKLQlkMSA9IGEzYTJhMWEwZTNlMmUxZTAgaTNpMmkxaTBtM20ybTFtMCBjM2MyYzFjMGczZzJnMWcwIGszazJrMWswbzNvMm8xbzAKLQlkMiA9IGI3YjZiNWI0ZjdmNmY1ZjQgajdqNmo1ajRuN242bjVuNCBkN2Q2ZDVkNGg3aDZoNWg0IGw3bDZsNWw0cDdwNnA1cDQKLQlkMyA9IGIzYjJiMWIwZjNmMmYxZjAgajNqMmoxajBuM24ybjFuMCBkM2QyZDFkMGgzaDJoMWgwIGwzbDJsMWwwcDNwMnAxcDAKLSovCi0KLVNETF9BdGFyaV9DMnA4X3N0YXJ0OgotCi0JbW92ZWwJZDIsZDcKLQlsc3JsCSMxLGQ3Ci0JZW9ybAlkMCxkNwotCWFuZGwJZDYsZDcKLQllb3JsCWQ3LGQwCi0JYWRkbAlkNyxkNwotCWVvcmwJZDcsZDIKLQotCW1vdmVsCWQzLGQ3Ci0JbHNybAkjMSxkNwotCWVvcmwJZDEsZDcKLQlhbmRsCWQ2LGQ3Ci0JZW9ybAlkNyxkMQotCWFkZGwJZDcsZDcKLQllb3JsCWQ3LGQzCi0vKgotCWQwID0gYTdiN2E1YjVlN2Y3ZTVmNSBpN2o3aTVqNW03bjdtNW41IGM3ZDdjNWQ1ZzdoN2c1aDUgazdsN2s1bDVvN3A3bzVwNQotCWQxID0gYTNiM2ExYjFlM2YzZTFmMSBpM2ozaTFqMW0zbjNtMW4xIGMzZDNjMWQxZzNoM2cxaDEgazNsM2sxbDFvM3AzbzFwMQotCWQyID0gYTZiNmE0YjRlNmY2ZTRmNCBpNmo2aTRqNG02bjZtNG40IGM2ZDZjNGQ0ZzZoNmc0aDQgazZsNms0bDRvNnA2bzRwNAotCWQzID0gYTJiMmEwYjBlMmYyZTBmMCBpMmoyaTBqMG0ybjJtMG4wIGMyZDJjMGQwZzJoMmcwaDAgazJsMmswbDBvMnAybzBwMAotKi8KLQltb3ZldwlkMixkNwotCW1vdmV3CWQwLGQyCi0Jc3dhcAlkMgotCW1vdmV3CWQyLGQwCi0JbW92ZXcJZDcsZDIKLQotCW1vdmV3CWQzLGQ3Ci0JbW92ZXcJZDEsZDMKLQlzd2FwCWQzCi0JbW92ZXcJZDMsZDEKLQltb3ZldwlkNyxkMwotLyoKLQlkMCA9IGE3YjdhNWI1ZTdmN2U1ZjUgaTdqN2k1ajVtN243bTVuNSBhNmI2YTRiNGU2ZjZlNGY0IGk2ajZpNGo0bTZuNm00bjQKLQlkMSA9IGEzYjNhMWIxZTNmM2UxZjEgaTNqM2kxajFtM24zbTFuMSBhMmIyYTBiMGUyZjJlMGYwIGkyajJpMGowbTJuMm0wbjAKLQlkMiA9IGM3ZDdjNWQ1ZzdoN2c1aDUgazdsN2s1bDVvN3A3bzVwNSBjNmQ2YzRkNGc2aDZnNGg0IGs2bDZrNGw0bzZwNm80cDQKLQlkMyA9IGMzZDNjMWQxZzNoM2cxaDEgazNsM2sxbDFvM3AzbzFwMSBjMmQyYzBkMGcyaDJnMGgwIGsybDJrMGwwbzJwMm8wcDAKLSovCi0JbW92ZWwJZDIsZDcKLQlsc3JsCSMyLGQ3Ci0JZW9ybAlkMCxkNwotCWFuZGwJIzB4MzMzMzMzMzMsZDcKLQllb3JsCWQ3LGQwCi0JbHNsbAkjMixkNwotCWVvcmwJZDcsZDIKLQotCW1vdmVsCWQzLGQ3Ci0JbHNybAkjMixkNwotCWVvcmwJZDEsZDcKLQlhbmRsCSMweDMzMzMzMzMzLGQ3Ci0JZW9ybAlkNyxkMQotCWxzbGwJIzIsZDcKLQllb3JsCWQ3LGQzCi0vKgotCWQwID0gYTdiN2M3ZDdlN2Y3ZzdoNyBpN2o3azdsN203bjdvN3A3IGE2YjZjNmQ2ZTZmNmc2aDYgaTZqNms2bDZtNm42bzZwNgotCWQxID0gYTNiM2MzZDNlM2YzZzNoMyBpM2ozazNsM20zbjNvM3AzIGEyYjJjMmQyZTJmMmcyaDIgaTJqMmsybDJtMm4ybzJwMgotCWQyID0gYTViNWM1ZDVlNWY1ZzVoNSBpNWo1azVsNW01bjVvNXA1IGE0YjRjNGQ0ZTRmNGc0aDQgaTRqNGs0bDRtNG40bzRwNAotCWQzID0gYTFiMWMxZDFlMWYxZzFoMSBpMWoxazFsMW0xbjFvMXAxIGEwYjBjMGQwZTBmMGcwaDAgaTBqMGswbDBtMG4wbzBwMAotKi8KLQlzd2FwCWQwCi0Jc3dhcAlkMQotCXN3YXAJZDIKLQlzd2FwCWQzCi0KLQltb3ZlbAlkMCxhNgotCW1vdmVsCWQyLGE1Ci0JbW92ZWwJZDEsYTQKLQltb3ZlbAlkMyxhMwotCi0JY21wbAlhMCxhMgotCWJndAkJU0RMX0F0YXJpX0MycDhfcGl4MTYKLQotCW1vdmVsCWEzLGExQCsKLQltb3ZlbAlhNCxhMUArCi0JbW92ZWwJYTUsYTFAKwotCW1vdmVsCWE2LGExQCsKLQotCS8qIERvdWJsZSB0aGUgbGluZSA/ICovCi0KLQltb3ZlbAljMnBfc3JjcGl0Y2gsZDAKLQltb3ZlbAljMnBfZHN0cGl0Y2gsZDEKLQotCXRzdGwJYzJwX2RibGxpZ25lCi0JYmVxcwlTRExfQXRhcmlfQzJwOF9ub2RibGxpbmUKLQotCW1vdmVsCWMycF9jdXJkc3QsYTAKLQltb3ZlbAlhMCxhMQotCWFkZGwJZDEsYTEKLQotCW1vdmV3CWMycF93aWR0aCsyLGQ3Ci0JbHNydwkjNCxkNwotCXN1YnFsCSMxLGQ3Ci1TRExfQXRhcmlfQzJwOF9kYmxsb29wOgotCW1vdmVsCWEwQCssYTFAKwotCW1vdmVsCWEwQCssYTFAKwotCW1vdmVsCWEwQCssYTFAKwotCW1vdmVsCWEwQCssYTFAKwotCWRicmEJZDcsU0RMX0F0YXJpX0MycDhfZGJsbG9vcAotCi0JYWRkbAlkMSxjMnBfY3VyZHN0Ci0KLVNETF9BdGFyaV9DMnA4X25vZGJsbGluZToKLQotCS8qIE5leHQgbGluZSAqLwotCi0JYWRkbAlkMCxjMnBfY3Vyc3JjCi0JYWRkbAlkMSxjMnBfY3VyZHN0Ci0KLQlzdWJxdwkjMSxjMnBfcm93Ci0JYm5lCQlTRExfQXRhcmlfQzJwOF9yb3dsb29wCQotCi0JbW92ZW1sCXNwQCssZDItZDcvYTItYTYKLQlydHMKLQotLyogLS0tLS0tLS0tLS0tCUNvbnZlcnNpb24gQzJQLCA0IGJpdHMgLS0tLS0tLS0tLS0tICovCi0KLV9TRExfQXRhcmlfQzJwQ29udmVydDQ6Ci0JbW92ZWwJc3BAKDQpLGMycF9zb3VyY2UKLQltb3ZlbAlzcEAoOCksYzJwX2Rlc3QKLQltb3ZlbAlzcEAoMTIpLGMycF93aWR0aAotCW1vdmVsCXNwQCgxNiksYzJwX2hlaWdodAotCW1vdmVsCXNwQCgyMCksYzJwX2RibGxpZ25lCi0JbW92ZWwJc3BAKDI0KSxjMnBfc3JjcGl0Y2gKLQltb3ZlbAlzcEAoMjgpLGMycF9kc3RwaXRjaAotCi0JbW92ZW1sCWQyLWQ3L2EyLWE2LHNwQC0KLQotCW1vdmVsCWMycF9zb3VyY2UsYTAKLQltb3ZlbAljMnBfZGVzdCxhMQotCWxlYQlfU0RMX0F0YXJpX3RhYmxlX2MycCxhMgotCW1vdmVsCSMweDAwMDcwMDAxLGQzCi0jaWYgZGVmaW5lZChfX002ODAyMF9fKQotCW1vdmVxCSMwLGQwCi0jZW5kaWYKLQkKLQltb3ZlbAljMnBfaGVpZ2h0LGQ3Ci0Jc3VicWwJIzEsZDcKLWMycDRfYmNseToKLQltb3ZlbAlhMCxhNAl8IFNhdmUgc3RhcnQgYWRkcmVzcyBvZiBzb3VyY2UKLQltb3ZlbAlhMSxhNQl8IFNhdmUgc3RhcnQgYWRkcmVzcyBvZiBkZXN0Ci0KLQl8IENvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgCQkJCi0JbW92ZWwJYzJwX3dpZHRoLGQ2Ci0JbHNydwkjNCxkNgotCXN1YnFsCSMxLGQ2Ci1jMnA0X2JjbHg6Ci0JfCBPY3RldHMgMC03Ci0JCi0JbW92ZXEJIzAsZDEKLQltb3ZlcQkjNyxkNQotYzJwNF9iY2wwNzoKLSNpZiBkZWZpbmVkKF9fTTY4MDIwX18pCi0JbW92ZWIJYTBAKyxkMAotCWxlYQkJYTJAKDAsZDA6dzo0KSxhMwotI2Vsc2UKLQltb3ZlcQkjMCxkMAotCW1vdmViCWEwQCssZDAKLQlsc2x3CSMyLGQwCi0JbGVhCQlhMkAoMCxkMDp3KSxhMwotI2VuZGlmCi0JbHNsbAkjMSxkMQotCW9ybAkJYTNALGQxCi0JZGJyYQlkNSxjMnA0X2JjbDA3Ci0KLQltb3ZlcGwJZDEsYTFAKDApCi0JYWRkdwlkMyxhMQotCXN3YXAJZDMKLQkKLQl8IE9jdGV0cyA4LTE1Ci0KLQltb3ZlcQkjMCxkMQotCW1vdmVxCSM3LGQ1Ci1jMnA0X2JjbDgxNToKLSNpZiBkZWZpbmVkKF9fTTY4MDIwX18pCi0JbW92ZWIJYTBAKyxkMAotCWxlYQkJYTJAKDAsZDA6dzo0KSxhMwotI2Vsc2UKLQltb3ZlcQkjMCxkMAotCW1vdmViCWEwQCssZDAKLQlsc2x3CSMyLGQwCi0JbGVhCQlhMkAoMCxkMDp3KSxhMwotI2VuZGlmCi0JbHNsbAkjMSxkMQotCW9ybAkJYTNALGQxCi0JZGJyYQlkNSxjMnA0X2JjbDgxNQotCi0JbW92ZXBsCWQxLGExQCgwKQotCWFkZHcJZDMsYTEKLQlzd2FwCWQzCi0KLQlkYnJhCWQ2LGMycDRfYmNseAotCi0JfCBEb3VibGUgbGluZSA/Ci0KLQl0c3RsCWMycF9kYmxsaWduZQotCWJlcXMJYzJwNF9ub2RibGxpZ25lCi0KLQltb3ZlbAlhNSxhNgkJCXwgc3JjIGxpbmUKLQltb3ZlbAlhNSxhMQkJCXwgZGVzdCBsaW5lCi0JYWRkbAljMnBfZHN0cGl0Y2gsYTEKLQotCW1vdmVsCWMycF93aWR0aCxkNgotCWxzcncJIzMsZDYKLQlzdWJxbAkjMSxkNgotYzJwNF9jb3B5ZGJsOgotCW1vdmVsCWE2QCssYTFAKwotCWRicmEJZDYsYzJwNF9jb3B5ZGJsCi0KLQlhZGRsCWMycF9kc3RwaXRjaCxhNQotYzJwNF9ub2RibGxpZ25lOgotCi0JfCBOZXh0IGxpbmUKLQotCW1vdmVsCWE0LGEwCQkKLQlhZGRsCWMycF9zcmNwaXRjaCxhMAotCW1vdmVsCWE1LGExCi0JYWRkbAljMnBfZHN0cGl0Y2gsYTEKLQotCWRicmEJZDcsYzJwNF9iY2x5Ci0KLQltb3ZlbWwJc3BAKyxkMi1kNy9hMi1hNgotCXJ0cwotCi0vKiAtLS0tLS0tLS0tLS0JQ29udmVyc2lvbiBvZiBhIGxpZ2h0IHBhbGV0dGUgaW4gNCBiaXRzIC0tLS0tLS0tLS0tLSAqLwotCi1fU0RMX0F0YXJpX0MycENvbnZlcnQ0X3BhbDoKLQkvKiBhMCBpcyBhIDI1Ni13b3JkIGxpZ2h0IHBhbGV0dGUgKi8KLQltb3ZlbAlzcEAoNCksYTAKLQotCW1vdmVtbAlkMi1kMyxzcEAtCi0KLQlsZWEJCV9TRExfQXRhcmlfdGFibGVfYzJwLGExCi0JbW92ZXcJIzI1NSxkMwotYzJwX3BhbF9pbml0YmNsOgotCW1vdmV3CWEwQCssZDAKLQlsc3J3CSM0LGQwCi0JYW5kdwkjMTUsZDAKLQotCW1vdmVxCSMzLGQxCi1jMnBfcGFsX2luaXRieXRlOgotCWJ0c3QJZDEsZDAKLQlzbmUJCWQyCi0JbmVndwlkMgotCW1vdmViCWQyLGExQCgwLGQxOncpCi0KLQlkYnJhCWQxLGMycF9wYWxfaW5pdGJ5dGUKLQotCWFkZHFsCSM0LGExCi0JZGJyYQlkMyxjMnBfcGFsX2luaXRiY2wKLQotCW1vdmVtbAlzcEArLGQyLWQzCi0KLQlydHMKLQotLyogLS0tLS0tLS0tLS0tCUJ1ZmZlcnMgLS0tLS0tLS0tLS0tICovCi0KLQkuYnNzCi0KLQkuZXZlbgotCS5jb21tCV9TRExfQXRhcmlfQzJwQ29udmVydCw0Ci0JLmNvbW0JX1NETF9BdGFyaV90YWJsZV9jMnAsMTAyNAotCi0JLmNvbW0JYzJwX3NvdXJjZSw0CS8qIFNvdXJjZSBmcmFtZWJ1ZmZlciAqLwotCS5jb21tCWMycF9kZXN0LDQJCS8qIERlc3RpbmF0aW9uIGZyYW1lYnVmZmVyICovCi0JLmNvbW0JYzJwX3dpZHRoLDQJCS8qIFdpZHRoIG9mIHpvbmUgdG8gY29udmVydCAqLwotCS5jb21tCWMycF9oZWlnaHQsNAkvKiBIZWlnaHQgb2Ygem9uZSB0byBjb252ZXJ0ICovCi0JLmNvbW0JYzJwX2RibGxpZ25lLDQJLyogRG91YmxlIHRoZSBsaW5lcyB3aGlsZSBjb252ZXJ0aW5nID8gKi8KLQkuY29tbQljMnBfc3JjcGl0Y2gsNAkvKiBTb3VyY2UgcGl0Y2ggKi8KLQkuY29tbQljMnBfZHN0cGl0Y2gsNAkvKiBEZXN0aW5hdGlvbiBwaXRjaCAqLwotCS5jb21tCWMycF9jdXJzcmMsNAkvKiBDdXJyZW50IHNvdXJjZSBsaW5lICovCi0JLmNvbW0JYzJwX2N1cmRzdCw0CS8qIEN1cnJlbnQgZGVzdGluYXRpb24gbGluZSAqLwotCS5jb21tCWMycF9yb3dsZW4sMgkvKiBMaW5lIGxlbmd0aCBpbiBieXRlcyAqLwotCS5jb21tCWMycF9yb3csMgkJLyogQ3VycmVudCBsaW5lIG51bWJlciAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmljMnBfcy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmljMnBfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGY5N2UyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpYzJwX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9BVEFSSV9DMlBfaAotI2RlZmluZSBfQVRBUklfQzJQX2gKLQotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLQotLyotLS0gRnVuY3Rpb25zIHBvaW50ZXJzIC0tLSovCi0KLS8qIENvbnZlcnQgYSBjaHVua3kgc2NyZWVuIHRvIGJpdHBsYW5lIHNjcmVlbiAqLwotCi1leHRlcm4gdm9pZCAoKlNETF9BdGFyaV9DMnBDb252ZXJ0KSgKLQlVaW50OCAqc3JjLAkJCS8qIFNvdXJjZSBzY3JlZW4gKG9uZSBieXRlPW9uZSBwaXhlbCkgKi8KLQlVaW50OCAqZGVzdCwJCS8qIERlc3RpbmF0aW9uICg0LzggYml0cyBwbGFuZXMpICovCi0JVWludDMyIHdpZHRoLAkJLyogRGltZW5zaW9ucyBvZiBzY3JlZW4gdG8gY29udmVydCAqLwotCVVpbnQzMiBoZWlnaHQsCi0JVWludDMyIGRibGxpZ25lLAkvKiBEb3VibGUgdGhlIGxpbmVzIHdoZW4gY29udmVydGluZyA/ICovCi0JVWludDMyIHNyY3BpdGNoLAkvKiBMZW5ndGggb2Ygb25lIHNvdXJjZSBsaW5lIGluIGJ5dGVzICovCi0JVWludDMyIGRzdHBpdGNoCQkvKiBMZW5ndGggb2Ygb25lIGRlc3RpbmF0aW9uIGxpbmUgaW4gYnl0ZXMgKi8KLSk7Ci0KLS8qLS0tIDggYml0cyBmdW5jdGlvbnMgLS0tKi8KLQotLyogQ29udmVydCBhIGNodW5reSBzY3JlZW4gdG8gYml0cGxhbmUgc2NyZWVuICovCi0KLXZvaWQgU0RMX0F0YXJpX0MycENvbnZlcnQ4KAotCVVpbnQ4ICpzcmMsCQkJLyogU291cmNlIHNjcmVlbiAob25lIGJ5dGU9b25lIHBpeGVsKSAqLwotCVVpbnQ4ICpkZXN0LAkJLyogRGVzdGluYXRpb24gKDggYml0cyBwbGFuZXMpICovCi0JVWludDMyIHdpZHRoLAkJLyogRGltZW5zaW9ucyBvZiBzY3JlZW4gdG8gY29udmVydCAqLwotCVVpbnQzMiBoZWlnaHQsCi0JVWludDMyIGRibGxpZ25lLAkvKiBEb3VibGUgdGhlIGxpbmVzIHdoZW4gY29udmVydGluZyA/ICovCi0JVWludDMyIHNyY3BpdGNoLAkvKiBMZW5ndGggb2Ygb25lIHNvdXJjZSBsaW5lIGluIGJ5dGVzICovCi0JVWludDMyIGRzdHBpdGNoCQkvKiBMZW5ndGggb2Ygb25lIGRlc3RpbmF0aW9uIGxpbmUgaW4gYnl0ZXMgKi8KLSk7Ci0KLS8qLS0tIDQgYml0cyBmdW5jdGlvbnMgLS0tKi8KLQotLyogQ29udmVydCBhIGNodW5reSBzY3JlZW4gdG8gYml0cGxhbmUgc2NyZWVuICovCi0KLXZvaWQgU0RMX0F0YXJpX0MycENvbnZlcnQ0KAotCVVpbnQ4ICpzcmMsCQkJLyogU291cmNlIHNjcmVlbiAob25lIGJ5dGU9b25lIHBpeGVsKSAqLwotCVVpbnQ4ICpkZXN0LAkJLyogRGVzdGluYXRpb24gKDQgYml0cyBwbGFuZXMpICovCi0JVWludDMyIHdpZHRoLAkJLyogRGltZW5zaW9ucyBvZiBzY3JlZW4gdG8gY29udmVydCAqLwotCVVpbnQzMiBoZWlnaHQsCi0JVWludDMyIGRibGxpZ25lLAkvKiBEb3VibGUgdGhlIGxpbmVzIHdoZW4gY29udmVydGluZyA/ICovCi0JVWludDMyIHNyY3BpdGNoLAkvKiBMZW5ndGggb2Ygb25lIHNvdXJjZSBsaW5lIGluIGJ5dGVzICovCi0JVWludDMyIGRzdHBpdGNoCQkvKiBMZW5ndGggb2Ygb25lIGRlc3RpbmF0aW9uIGxpbmUgaW4gYnl0ZXMgKi8KLSk7Ci0KLS8qIENvbnZlcnNpb24gcGFsZXR0ZSAqLwotCi12b2lkIFNETF9BdGFyaV9DMnBDb252ZXJ0NF9wYWwoVWludDE2ICpsaWdodHBhbGV0dGUpOwotCi0jZW5kaWYgLyogX0FUQVJJX0MyUF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWRldm1vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWRldm1vdXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTczNTcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlkZXZtb3VzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotCU1pTlQgL2Rldi9tb3VzZSBkcml2ZXIKLQotCVBhdHJpY2UgTWFuZGluCi0qLwotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfYXRhcmlkZXZtb3VzZV9jLmgiCi0KLS8qIERlZmluZXMgKi8KLQotI2RlZmluZSBERVZJQ0VfTkFNRQkiL2Rldi9tb3VzZSIKLQotLyogTG9jYWwgdmFyaWFibGVzICovCi0KLXN0YXRpYyBpbnQgaGFuZGxlID0gLTE7Ci1zdGF0aWMgaW50IG1vdXNlYiwgcHJldl9tb3VzZWI7Ci0KLS8qIEZ1bmN0aW9ucyAqLwotCi1pbnQgU0RMX0F0YXJpRGV2TW91c2VfT3Blbih2b2lkKQotewotCWludCByOwotCWNvbnN0IGNoYXIgKm1vdXNlZGV2OwotCi0JLyoKLQkJVE9ETzogRml4IHRoZSBNaU5UIGRldmljZSBkcml2ZXIsIHRoYXQgbG9ja3MgbW91c2UgZm9yIG90aGVyCi0JCWFwcGxpY2F0aW9ucywgc28gdGhpcyBpcyBkaXNhYmxlZCB0aWxsIGZpeGVkCi0JICovCi0JcmV0dXJuIDA7Ci0KLQkvKiBGaXJzdCwgdHJ5IFNETF9NT1VTRURFViBkZXZpY2UgKi8KLQltb3VzZWRldiA9IFNETF9nZXRlbnYoIlNETF9NT1VTRURFViIpOwotCWlmICghbW91c2VkZXYpIHsKLQkJaGFuZGxlID0gb3Blbihtb3VzZWRldiwgMCk7Ci0JfQotCi0JLyogRmFpbGVkLCB0cnkgZGVmYXVsdCBkZXZpY2UgKi8KLQlpZiAoaGFuZGxlPDApIHsKLQkJaGFuZGxlID0gb3BlbihERVZJQ0VfTkFNRSwgMCk7Ci0JfQotCi0JaWYgKGhhbmRsZTwwKSB7Ci0JCWhhbmRsZSA9IC0xOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBTZXQgbm9uIGJsb2NraW5nIG1vZGUgKi8KLQlyID0gZmNudGwoaGFuZGxlLCBGX0dFVEZMLCAwKTsKLQlpZiAocjwwKSB7Ci0JCWNsb3NlKGhhbmRsZSk7Ci0JCWhhbmRsZSA9IC0xOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyIHw9IE9fTkRFTEFZOwotCi0JciA9IGZjbnRsKGhhbmRsZSwgRl9TRVRGTCwgcik7Ci0JaWYgKHI8MCkgewotCQljbG9zZShoYW5kbGUpOwotCQloYW5kbGUgPSAtMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJldl9tb3VzZWIgPSA3OwotCXJldHVybiAxOwotfQotCi12b2lkIFNETF9BdGFyaURldk1vdXNlX0Nsb3NlKHZvaWQpCi17Ci0JaWYgKGhhbmRsZT4wKSB7Ci0JCWNsb3NlKGhhbmRsZSk7Ci0JCWhhbmRsZSA9IC0xOwotCX0KLX0KLQotc3RhdGljIGludCBhdGFyaV9HZXRCdXR0b24oaW50IGJ1dHRvbikKLXsKLQlzd2l0Y2goYnV0dG9uKQotCXsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIFNETF9CVVRUT05fUklHSFQ7Ci0JCWNhc2UgMToKLQkJCXJldHVybiBTRExfQlVUVE9OX01JRERMRTsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBTRExfQlVUVE9OX0xFRlQ7Ci19Ci0KLXZvaWQgU0RMX0F0YXJpRGV2TW91c2VfUG9zdE1vdXNlRXZlbnRzKF9USElTLCBTRExfYm9vbCBidXR0b25FdmVudHMpCi17Ci0JdW5zaWduZWQgY2hhciBidWZmZXJbM107Ci0JaW50IG1vdXNleCwgbW91c2V5OwotCi0JaWYgKGhhbmRsZTwwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQltb3VzZXggPSBtb3VzZXkgPSAwOwotCXdoaWxlIChyZWFkKGhhbmRsZSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk9PXNpemVvZihidWZmZXIpKSB7Ci0JCW1vdXNlYiA9IGJ1ZmZlclswXSAmIDc7Ci0JCW1vdXNleCArPSAoY2hhcikgYnVmZmVyWzFdOwotCQltb3VzZXkgKz0gKGNoYXIpIGJ1ZmZlclsyXTsKLQotCQkvKiBNb3VzZSBidXR0b24gZXZlbnRzICovCi0JCWlmIChidXR0b25FdmVudHMgJiYgKG1vdXNlYiAhPSBwcmV2X21vdXNlYikpIHsKLQkJCWludCBpOwotCi0JCQlmb3IgKGk9MDtpPDM7aSsrKSB7Ci0JCQkJaW50IGN1cmJ1dHRvbiwgcHJldmJ1dHRvbjsKLQotCQkJCWN1cmJ1dHRvbiA9IG1vdXNlYiAmICgxPDxpKTsKLQkJCQlwcmV2YnV0dG9uID0gcHJldl9tb3VzZWIgJiAoMTw8aSk7Ci0JCQkKLQkJCQlpZiAoY3VyYnV0dG9uICYmICFwcmV2YnV0dG9uKSB7Ci0JCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBhdGFyaV9HZXRCdXR0b24oaSksIDAsIDApOwotCQkJCX0KLQkJCQlpZiAoIWN1cmJ1dHRvbiAmJiBwcmV2YnV0dG9uKSB7Ci0JCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIGF0YXJpX0dldEJ1dHRvbihpKSwgMCwgMCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwcmV2X21vdXNlYiA9IG1vdXNlYjsKLQkJfQotCX0KLQotCS8qIE1vdXNlIG1vdGlvbiBldmVudCAqLwotCWlmIChtb3VzZXggfHwgbW91c2V5KSB7Ci0JCVNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgbW91c2V4LCAtbW91c2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWRldm1vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZGV2bW91c2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODRhYjc5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZGV2bW91c2VfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0JTWlOVCAvZGV2L21vdXNlIGRyaXZlcgotCi0JUGF0cmljZSBNYW5kaW4KLSovCi0KLSNpZm5kZWYgX1NETF9BVEFSSV9ERVZNT1VTRV9IXwotI2RlZmluZSBfU0RMX0FUQVJJX0RFVk1PVVNFX0hfCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi1leHRlcm4gaW50IFNETF9BdGFyaURldk1vdXNlX09wZW4odm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfQXRhcmlEZXZNb3VzZV9DbG9zZSh2b2lkKTsKLWV4dGVybiB2b2lkIFNETF9BdGFyaURldk1vdXNlX1Bvc3RNb3VzZUV2ZW50cyhfVEhJUywgU0RMX2Jvb2wgYnV0dG9uRXZlbnRzKTsKLQotI2VuZGlmIC8qIF9TRExfQVRBUklfREVWTU9VU0VfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZWRkaS5TIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmllZGRpLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0N2NiNmUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmllZGRpLlMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKgotICoJUmVhZCBFZERJIHZlcnNpb24KLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLQkudGV4dAotCi0JLmdsb2JsCV9BdGFyaV9nZXRfRWRESV92ZXJzaW9uCi0KLS8qLS0tIFZlY3RvciBpbnN0YWxsZXIgLS0tKi8KLQotX0F0YXJpX2dldF9FZERJX3ZlcnNpb246Ci0JbW92ZWwJc3BAKDQpLGEwCS8qIFZhbHVlIG9mIEVkREkgY29va2llICovCi0KLQkvKiBDYWxsIEVkREkgZnVuY3Rpb24gIzAgKi8KLQljbHJ3CWQwCi0JanNyCShhMCkKLQotCXJ0cwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmllZGRpX3MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZWRkaV9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDMxYmQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmllZGRpX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfQXRhcmlfZWRkaV9zX2gKLSNkZWZpbmUgX1NETF9BdGFyaV9lZGRpX3NfaAotCi0vKi0tLSBEZWZpbmVzIC0tLSovCi0KLS8qIEVkREkgdmVyc2lvbnMgKi8KLQotI2RlZmluZSBFRERJXzEwCSgweDAxMDApCi0jZGVmaW5lIEVERElfMTEgKDB4MDExMCkKLQotLyogU2NyZWVuIGZvcm1hdCAqLwotCi1lbnVtIHsKLQlWRElfRk9STUFUX1VOS05PV049LTEsCi0JVkRJX0ZPUk1BVF9JTlRFUj0wLAkvKiBJbnRlcmxlYXZlZCBiaXRwbGFuZXMgKi8KLQlWRElfRk9STUFUX1ZEST0xLAkvKiBWREkgaW5kZXBlbmRlbnQgKi8KLQlWRElfRk9STUFUX1BBQ0s9MgkvKiBQYWNrZWQgcGl4ZWxzICovCi19OwotCi0vKiBDTFVUIHR5cGVzICovCi1lbnVtIHsKLQlWRElfQ0xVVF9OT05FPTAsCS8qIE1vbm9jaHJvbWUgbW9kZSAqLwotCVZESV9DTFVUX0hBUkRXQVJFLAkvKiA8MjU2IGNvbG91cnMgbW9kZSAqLwotCVZESV9DTFVUX1NPRlRXQVJFCS8qIFRydWUgY29sb3VyIG1vZGUgKi8KLX07Ci0KLS8qLS0tIEZ1bmN0aW9ucyAtLS0qLwotCi11bnNpZ25lZCBsb25nIEF0YXJpX2dldF9FZERJX3ZlcnNpb24odm9pZCAqZnVuY3Rpb25fcG9pbnRlcik7Ci0KLSNlbmRpZiAvKiBfU0RMX0F0YXJpX2VkZGlfc19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlldmVudHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxZGQ0ZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWV2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICoJQXRhcmkga2V5Ym9hcmQgZXZlbnRzIG1hbmFnZXIKLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICoKLSAqCVRoaXMgcm91dGluZXMgY2hvb3NlIHdoYXQgdGhlIGZpbmFsIGV2ZW50IG1hbmFnZXIgd2lsbCBiZQotICovCi0KLSNpbmNsdWRlIDxtaW50L2Nvb2tpZS5oPgotI2luY2x1ZGUgPG1pbnQvb3N0cnVjdC5oPgotI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+Ci0KLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotI2luY2x1ZGUgIlNETF9hdGFyaWtleXMuaCIKLSNpbmNsdWRlICJTRExfYXRhcmlldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9iaW9zZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfZ2VtZG9zZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfaWtiZGV2ZW50c19jLmgiCi0KLWVudW0gewotCU1DSF9TVD0wLAotCU1DSF9TVEUsCi0JTUNIX1RULAotCU1DSF9GMzAsCi0JTUNIX0NMT05FLAotCU1DSF9BUkFOWU0KLX07Ci0KLSNpZm5kZWYgS1RfTk9DSEFOR0UKLSMgZGVmaW5lIEtUX05PQ0hBTkdFIC0xCi0jZW5kaWYKLQotLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlcyBmcm9tIGEgY29uc29sZSBzY2FuY29kZSB0byBhIFNETCBrZXlzeW0gKi8KLXN0YXRpYyBTRExLZXkga2V5bWFwW0FUQVJJQklPU19NQVhLRVlTXTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICprZXl0YWJfbm9ybWFsOwotCi12b2lkICgqQXRhcmlfU2h1dGRvd25FdmVudHMpKHZvaWQpOwotCi1zdGF0aWMgdm9pZCBBdGFyaV9Jbml0aWFsaXplRXZlbnRzKF9USElTKQotewotCWNvbnN0IGNoYXIgKmVudnI7Ci0JdW5zaWduZWQgbG9uZyBjb29raWVfbWNoOwotCi0JLyogVGVzdCBpZiB3ZSBhcmUgb24gYW4gQXRhcmkgbWFjaGluZSBvciBub3QgKi8KLQlpZiAoR2V0Y29va2llKENfX01DSCwgJmNvb2tpZV9tY2gpID09IENfTk9URk9VTkQpIHsKLQkJY29va2llX21jaCA9IDA7Ci0JfQotCWNvb2tpZV9tY2ggPj49IDE2OwotCi0JLyogRGVmYXVsdCBpcyBJa2JkLCB0aGUgZmFzdGVyIGV4Y2VwdCBmb3IgY2xvbmVzICovCi0Jc3dpdGNoKGNvb2tpZV9tY2gpIHsKLQkJY2FzZSBNQ0hfU1Q6Ci0JCWNhc2UgTUNIX1NURToKLQkJY2FzZSBNQ0hfVFQ6Ci0JCWNhc2UgTUNIX0YzMDoKLQkJY2FzZSBNQ0hfQVJBTllNOgotCQkJdGhpcy0+SW5pdE9TS2V5bWFwPUF0YXJpSWtiZF9Jbml0T1NLZXltYXA7Ci0JCQl0aGlzLT5QdW1wRXZlbnRzPUF0YXJpSWtiZF9QdW1wRXZlbnRzOwotCQkJQXRhcmlfU2h1dGRvd25FdmVudHM9QXRhcmlJa2JkX1NodXRkb3duRXZlbnRzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl0aGlzLT5Jbml0T1NLZXltYXA9QXRhcmlHZW1kb3NfSW5pdE9TS2V5bWFwOwotCQkJdGhpcy0+UHVtcEV2ZW50cz1BdGFyaUdlbWRvc19QdW1wRXZlbnRzOwotCQkJQXRhcmlfU2h1dGRvd25FdmVudHM9QXRhcmlHZW1kb3NfU2h1dGRvd25FdmVudHM7Ci0JCQlicmVhazsKLQl9Ci0KLQllbnZyID0gU0RMX2dldGVudigiU0RMX0FUQVJJX0VWRU5UU0RSSVZFUiIpOwotCi0gCWlmICghZW52cikgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKFNETF9zdHJjbXAoZW52ciwgImlrYmQiKSA9PSAwKSB7Ci0JCXRoaXMtPkluaXRPU0tleW1hcD1BdGFyaUlrYmRfSW5pdE9TS2V5bWFwOwotCQl0aGlzLT5QdW1wRXZlbnRzPUF0YXJpSWtiZF9QdW1wRXZlbnRzOwotCQlBdGFyaV9TaHV0ZG93bkV2ZW50cz1BdGFyaUlrYmRfU2h1dGRvd25FdmVudHM7Ci0JfQotCi0JaWYgKFNETF9zdHJjbXAoZW52ciwgImdlbWRvcyIpID09IDApIHsKLQkJdGhpcy0+SW5pdE9TS2V5bWFwPUF0YXJpR2VtZG9zX0luaXRPU0tleW1hcDsKLQkJdGhpcy0+UHVtcEV2ZW50cz1BdGFyaUdlbWRvc19QdW1wRXZlbnRzOwotCQlBdGFyaV9TaHV0ZG93bkV2ZW50cz1BdGFyaUdlbWRvc19TaHV0ZG93bkV2ZW50czsKLQl9Ci0KLQlpZiAoU0RMX3N0cmNtcChlbnZyLCAiYmlvcyIpID09IDApIHsKLQkJdGhpcy0+SW5pdE9TS2V5bWFwPUF0YXJpQmlvc19Jbml0T1NLZXltYXA7Ci0JCXRoaXMtPlB1bXBFdmVudHM9QXRhcmlCaW9zX1B1bXBFdmVudHM7Ci0JCUF0YXJpX1NodXRkb3duRXZlbnRzPUF0YXJpQmlvc19TaHV0ZG93bkV2ZW50czsKLQl9Ci19Ci0KLXZvaWQgQXRhcmlfSW5pdE9TS2V5bWFwKF9USElTKQotewotCUF0YXJpX0luaXRpYWxpemVFdmVudHModGhpcyk7Ci0KLQlTRExfQXRhcmlfSW5pdEludGVybmFsS2V5bWFwKHRoaXMpOwotCi0JLyogQ2FsbCBjaG9vc2VuIHJvdXRpbmUgKi8KLQl0aGlzLT5Jbml0T1NLZXltYXAodGhpcyk7Ci19Ci0KLXZvaWQgU0RMX0F0YXJpX0luaXRJbnRlcm5hbEtleW1hcChfVEhJUykKLXsKLQlpbnQgaTsKLQlfS0VZVEFCICprZXlfdGFibGVzOwotCi0JLyogUmVhZCBzeXN0ZW0gdGFibGVzIGZvciBzY2FuY29kZSAtPiBhc2NpaSB0cmFuc2xhdGlvbiAqLwotCWtleV90YWJsZXMgPSAoX0tFWVRBQiAqKSBLZXl0YmwoS1RfTk9DSEFOR0UsIEtUX05PQ0hBTkdFLCBLVF9OT0NIQU5HRSk7Ci0Ja2V5dGFiX25vcm1hbCA9IGtleV90YWJsZXMtPnVuc2hpZnQ7Ci0KLQkvKiBJbml0aWFsaXplIGtleW1hcCAqLwotCWZvciAoIGk9MDsgaTxBVEFSSUJJT1NfTUFYS0VZUzsgaSsrICkKLQkJa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOwotCi0JLyogRnVuY3Rpb25zIGtleXMgKi8KLQlmb3IgKCBpID0gMDsgaTwxMDsgaSsrICkKLQkJa2V5bWFwW1NDQU5DT0RFX0YxICsgaV0gPSBTRExLX0YxK2k7Ci0KLQkvKiBDdXJzb3Iga2V5cGFkICovCi0Ja2V5bWFwW1NDQU5DT0RFX0hFTFBdID0gU0RMS19IRUxQOwotCWtleW1hcFtTQ0FOQ09ERV9VTkRPXSA9IFNETEtfVU5ETzsKLQlrZXltYXBbU0NBTkNPREVfSU5TRVJUXSA9IFNETEtfSU5TRVJUOwotCWtleW1hcFtTQ0FOQ09ERV9DTFJIT01FXSA9IFNETEtfSE9NRTsKLQlrZXltYXBbU0NBTkNPREVfVVBdID0gU0RMS19VUDsKLQlrZXltYXBbU0NBTkNPREVfRE9XTl0gPSBTRExLX0RPV047Ci0Ja2V5bWFwW1NDQU5DT0RFX1JJR0hUXSA9IFNETEtfUklHSFQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0xFRlRdID0gU0RMS19MRUZUOwotCi0JLyogU3BlY2lhbCBrZXlzICovCi0Ja2V5bWFwW1NDQU5DT0RFX0VTQ0FQRV0gPSBTRExLX0VTQ0FQRTsKLQlrZXltYXBbU0NBTkNPREVfQkFDS1NQQUNFXSA9IFNETEtfQkFDS1NQQUNFOwotCWtleW1hcFtTQ0FOQ09ERV9UQUJdID0gU0RMS19UQUI7Ci0Ja2V5bWFwW1NDQU5DT0RFX0VOVEVSXSA9IFNETEtfUkVUVVJOOwotCWtleW1hcFtTQ0FOQ09ERV9ERUxFVEVdID0gU0RMS19ERUxFVEU7Ci0Ja2V5bWFwW1NDQU5DT0RFX0xFRlRDT05UUk9MXSA9IFNETEtfTENUUkw7Ci0Ja2V5bWFwW1NDQU5DT0RFX0xFRlRTSElGVF0gPSBTRExLX0xTSElGVDsKLQlrZXltYXBbU0NBTkNPREVfUklHSFRTSElGVF0gPSBTRExLX1JTSElGVDsKLQlrZXltYXBbU0NBTkNPREVfTEVGVEFMVF0gPSBTRExLX0xBTFQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NBUFNMT0NLXSA9IFNETEtfQ0FQU0xPQ0s7Ci19Ci0KLXZvaWQgQXRhcmlfUHVtcEV2ZW50cyhfVEhJUykKLXsKLQlBdGFyaV9Jbml0aWFsaXplRXZlbnRzKHRoaXMpOwotCi0JLyogQ2FsbCBjaG9vc2VuIHJvdXRpbmUgKi8KLQl0aGlzLT5QdW1wRXZlbnRzKHRoaXMpOwotfQotCi0vKiBBdGFyaSB0byBVbmljb2RlIGNoYXJzZXQgdHJhbnNsYXRpb24gdGFibGUgKi8KLQotVWludDE2IFNETF9BdGFyaVRvVW5pY29kZVRhYmxlWzI1Nl09ewotCS8qIFN0YW5kYXJkIEFTQ0lJIGNoYXJhY3RlcnMgZnJvbSAweDAwIHRvIDB4N2UgKi8KLQkvKiBVbmljb2RlIHN0dWZmIGZyb20gMHg3ZiB0byAweGZmICovCi0KLQkweDAwMDAsMHgwMDAxLDB4MDAwMiwweDAwMDMsMHgwMDA0LDB4MDAwNSwweDAwMDYsMHgwMDA3LAotCTB4MDAwOCwweDAwMDksMHgwMDBBLDB4MDAwQiwweDAwMEMsMHgwMDBELDB4MDAwRSwweDAwMEYsCi0JMHgwMDEwLDB4MDAxMSwweDAwMTIsMHgwMDEzLDB4MDAxNCwweDAwMTUsMHgwMDE2LDB4MDAxNywKLQkweDAwMTgsMHgwMDE5LDB4MDAxQSwweDAwMUIsMHgwMDFDLDB4MDAxRCwweDAwMUUsMHgwMDFGLAotCTB4MDAyMCwweDAwMjEsMHgwMDIyLDB4MDAyMywweDAwMjQsMHgwMDI1LDB4MDAyNiwweDAwMjcsCi0JMHgwMDI4LDB4MDAyOSwweDAwMkEsMHgwMDJCLDB4MDAyQywweDAwMkQsMHgwMDJFLDB4MDAyRiwKLQkweDAwMzAsMHgwMDMxLDB4MDAzMiwweDAwMzMsMHgwMDM0LDB4MDAzNSwweDAwMzYsMHgwMDM3LAotCTB4MDAzOCwweDAwMzksMHgwMDNBLDB4MDAzQiwweDAwM0MsMHgwMDNELDB4MDAzRSwweDAwM0YsCi0KLQkweDAwNDAsMHgwMDQxLDB4MDA0MiwweDAwNDMsMHgwMDQ0LDB4MDA0NSwweDAwNDYsMHgwMDQ3LAotCTB4MDA0OCwweDAwNDksMHgwMDRBLDB4MDA0QiwweDAwNEMsMHgwMDRELDB4MDA0RSwweDAwNEYsCi0JMHgwMDUwLDB4MDA1MSwweDAwNTIsMHgwMDUzLDB4MDA1NCwweDAwNTUsMHgwMDU2LDB4MDA1NywKLQkweDAwNTgsMHgwMDU5LDB4MDA1QSwweDAwNUIsMHgwMDVDLDB4MDA1RCwweDAwNUUsMHgwMDVGLAotCTB4MDA2MCwweDAwNjEsMHgwMDYyLDB4MDA2MywweDAwNjQsMHgwMDY1LDB4MDA2NiwweDAwNjcsCi0JMHgwMDY4LDB4MDA2OSwweDAwNkEsMHgwMDZCLDB4MDA2QywweDAwNkQsMHgwMDZFLDB4MDA2RiwKLQkweDAwNzAsMHgwMDcxLDB4MDA3MiwweDAwNzMsMHgwMDc0LDB4MDA3NSwweDAwNzYsMHgwMDc3LAotCTB4MDA3OCwweDAwNzksMHgwMDdBLDB4MDA3QiwweDAwN0MsMHgwMDdELDB4MDA3RSwweDAzOTQsCi0KLQkweDAwQzcsMHgwMEZDLDB4MDBFOSwweDAwRTIsMHgwMEU0LDB4MDBFMCwweDAwRTUsMHgwMEU3LAotCTB4MDBFQSwweDAwRUIsMHgwMEU4LDB4MDBFRiwweDAwRUUsMHgwMEVDLDB4MDBDNCwweDAwQzUsCi0JMHgwMEM5LDB4MDBFNiwweDAwQzYsMHgwMEY0LDB4MDBGNiwweDAwRjIsMHgwMEZCLDB4MDBGOSwKLQkweDAwRkYsMHgwMEQ2LDB4MDBEQywweDAwQTIsMHgwMEEzLDB4MDBBNSwweDAwREYsMHgwMTkyLAotCTB4MDBFMSwweDAwRUQsMHgwMEYzLDB4MDBGQSwweDAwRjEsMHgwMEQxLDB4MDBBQSwweDAwQkEsCi0JMHgwMEJGLDB4MjMxMCwweDAwQUMsMHgwMEJELDB4MDBCQywweDAwQTEsMHgwMEFCLDB4MDBCQiwKLQkweDAwQzMsMHgwMEY1LDB4MDBEOCwweDAwRjgsMHgwMTUzLDB4MDE1MiwweDAwQzAsMHgwMEMzLAotCTB4MDBENSwweDAwQTgsMHgwMEI0LDB4MjAyMCwweDAwQjYsMHgwMEE5LDB4MDBBRSwweDIxMjIsCi0KLQkweDAxMzMsMHgwMTMyLDB4MDVEMCwweDA1RDEsMHgwNUQyLDB4MDVEMywweDA1RDQsMHgwNUQ1LAotCTB4MDVENiwweDA1RDcsMHgwNUQ4LDB4MDVEOSwweDA1REIsMHgwNURDLDB4MDVERSwweDA1RTAsCi0JMHgwNUUxLDB4MDVFMiwweDA1RTQsMHgwNUU2LDB4MDVFNywweDA1RTgsMHgwNUU5LDB4MDVFQSwKLQkweDA1REYsMHgwNURBLDB4MDVERCwweDA1RTMsMHgwNUU1LDB4MDBBNywweDIwMzgsMHgyMjFFLAotCTB4MDNCMSwweDAzQjIsMHgwMzkzLDB4MDNDMCwweDAzQTMsMHgwM0MzLDB4MDBCNSwweDAzQzQsCi0JMHgwM0E2LDB4MDM5OCwweDAzQTksMHgwM0I0LDB4MjIyRSwweDAzQzYsMHgyMjA4LDB4MjIyOSwKLQkweDIyNjEsMHgwMEIxLDB4MjI2NSwweDIyNjQsMHgyMzIwLDB4MjMyMSwweDAwRjcsMHgyMjQ4LAotCTB4MDBCMCwweDIwMjIsMHgwMEI3LDB4MjIxQSwweDIwN0YsMHgwMEIyLDB4MDBCMywweDAwQUYKLX07Ci0KLVNETF9rZXlzeW0gKlNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0sCi0JU0RMX2Jvb2wgcHJlc3NlZCkKLXsKLQlpbnQgYXNjaWljb2RlID0gMDsKLQotCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCi0Ja2V5c3ltLT5zY2FuY29kZSA9IHNjYW5jb2RlOwotCWtleXN5bS0+bW9kID0gS01PRF9OT05FOwotCWtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKLQlrZXlzeW0tPnVuaWNvZGUgPSAwOwotCi0JaWYgKGtleXN5bS0+c3ltID09IFNETEtfVU5LTk9XTikgewotCQlrZXlzeW0tPnN5bSA9IGFzY2lpY29kZSA9IGtleXRhYl9ub3JtYWxbc2NhbmNvZGVdOwkJCi0JfQotCi0JaWYgKFNETF9UcmFuc2xhdGVVTklDT0RFICYmIHByZXNzZWQpIHsKLQkJa2V5c3ltLT51bmljb2RlID0gU0RMX0F0YXJpVG9Vbmljb2RlVGFibGVbYXNjaWljb2RlXTsKLQl9Ci0KLQlyZXR1cm4oa2V5c3ltKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmMDZlYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWV2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAqCUF0YXJpIGtleWJvYXJkIGV2ZW50cyBtYW5hZ2VyCi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0jaWZuZGVmIF9TRExfQVRBUklfRVZFTlRTX0hfCi0jZGVmaW5lIF9TRExfQVRBUklfRVZFTlRTX0hfCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi0jZGVmaW5lIEFUQVJJQklPU19NQVhLRVlTIDEyOAotCi0vKiBTcGVjaWFsIGtleXMgc3RhdGUgKi8KLSNpZm5kZWYgS19SU0hJRlQKLWVudW0gewotCUtfUlNISUZUPTAsCi0JS19MU0hJRlQsCi0JS19DVFJMLAotCUtfQUxULAotCUtfQ0FQU0xPQ0ssCi0JS19DTFJIT01FLAotCUtfSU5TRVJUCi19OwotI2VuZGlmCi0KLWV4dGVybiB2b2lkICgqQXRhcmlfU2h1dGRvd25FdmVudHMpKHZvaWQpOwotCi1leHRlcm4gdm9pZCBBdGFyaV9Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgQXRhcmlfUHVtcEV2ZW50cyhfVEhJUyk7Ci0KLWV4dGVybiB2b2lkIFNETF9BdGFyaV9Jbml0SW50ZXJuYWxLZXltYXAoX1RISVMpOwotCi0vKiBBdGFyaSB0byBVbmljb2RlIGNoYXJzZXQgdHJhbnNsYXRpb24gdGFibGUgKi8KLWV4dGVybiBVaW50MTYgU0RMX0F0YXJpVG9Vbmljb2RlVGFibGVbMjU2XTsKLVNETF9rZXlzeW0gKlNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0sCi0JU0RMX2Jvb2wgcHJlc3NlZCk7Ci0KLSNlbmRpZiAvKiBfU0RMX0FUQVJJX0VWRU5UU19IXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlnbC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlnbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M4ZDIyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDEwODggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEF0YXJpIE9TTWVzYS5sZGcgaW1wbGVtZW50YXRpb24gb2YgU0RMIE9wZW5HTCBzdXBwb3J0ICovCi0KLS8qLS0tIEluY2x1ZGVzIC0tLSovCi0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0jaW5jbHVkZSA8R0wvb3NtZXNhLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+Ci0KLSNpbmNsdWRlICJTRExfZW5kaWFuLmgiCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2F0YXJpZ2xfYy5oIgotI2lmIFNETF9WSURFT19PUEVOR0xfT1NNRVNBX0RZTkFNSUMKLSNpbmNsdWRlICJTRExfbG9hZHNvLmgiCi0jZW5kaWYKLQotLyotLS0gRGVmaW5lcyAtLS0qLwotCi0jZGVmaW5lIFBBVEhfT1NNRVNBX0xERwkib3NtZXNhLmxkZyIKLSNkZWZpbmUgUEFUSF9NRVNBR0xfTERHCSJtZXNhX2dsLmxkZyIKLSNkZWZpbmUgUEFUSF9USU5ZR0xfTERHCSJ0aW55X2dsLmxkZyIKLQotI2RlZmluZSBWRElfUkdCCTB4ZgotCi0vKi0tLSBGdW5jdGlvbnMgcHJvdG90eXBlcyAtLS0qLwotCi1zdGF0aWMgdm9pZCBTRExfQXRhcmlHTF9VbmxvYWRMaWJyYXJ5KF9USElTKTsKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLXN0YXRpYyB2b2lkIENvcHlTaGFkb3dOdWxsKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBDb3B5U2hhZG93RGlyZWN0KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBDb3B5U2hhZG93UkdCVG81NTUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUbzU2NShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlN3YXAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUb0FSR0IoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUb0FCR1IoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUb0JHUkEoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUb1JHQkEoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIENvcHlTaGFkb3c4ODg4VG81NTUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIENvcHlTaGFkb3c4ODg4VG81NjUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLQotc3RhdGljIHZvaWQgQ29udmVydE51bGwoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIENvbnZlcnQ1NjVUbzU1NWJlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBDb252ZXJ0NTY1VG81NTVsZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgQ29udmVydDU2NWxlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvQUJHUihfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi1zdGF0aWMgaW50IEluaXROZXcoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50KTsKLXN0YXRpYyBpbnQgSW5pdE9sZChfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQpOwotI2VuZGlmCi0KLS8qLS0tIFB1YmxpYyBmdW5jdGlvbnMgLS0tKi8KLQotaW50IFNETF9BdGFyaUdMX0luaXQoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50KQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLQlpZiAoZ2xfb2xkbWVzYSkgewotCQlnbF9hY3RpdmUgPSBJbml0T2xkKHRoaXMsIGN1cnJlbnQpOwkJCi0JfSBlbHNlIHsKLQkJZ2xfYWN0aXZlID0gSW5pdE5ldyh0aGlzLCBjdXJyZW50KTsJCQotCX0KLSNlbmRpZgotCi0JcmV0dXJuIChnbF9hY3RpdmUpOwotfQotCi12b2lkIFNETF9BdGFyaUdMX1F1aXQoX1RISVMsIFNETF9ib29sIHVubG9hZCkKLXsKLSNpZiBTRExfVklERU9fT1BFTkdMCi0JaWYgKGdsX29sZG1lc2EpIHsKLQkJLyogT2xkIG1lc2EgaW1wbGVtZW50YXRpb25zICovCi0JCWlmICh0aGlzLT5nbF9kYXRhLT5PU01lc2FEZXN0cm95TERHKSB7Ci0JCQl0aGlzLT5nbF9kYXRhLT5PU01lc2FEZXN0cm95TERHKCk7Ci0JCX0KLQkJaWYgKGdsX3NoYWRvdykgewotCQkJTWZyZWUoZ2xfc2hhZG93KTsKLQkJCWdsX3NoYWRvdyA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBOZXcgbWVzYSBpbXBsZW1lbnRhdGlvbiAqLwotCQlpZiAoZ2xfY3R4KSB7Ci0JCQlpZiAodGhpcy0+Z2xfZGF0YS0+T1NNZXNhRGVzdHJveUNvbnRleHQpIHsKLQkJCQl0aGlzLT5nbF9kYXRhLT5PU01lc2FEZXN0cm95Q29udGV4dChnbF9jdHgpOwotCQkJfQotCQkJZ2xfY3R4ID0gTlVMTDsKLQkJfQotCX0KLQotCWlmICh1bmxvYWQpIHsKLQkJU0RMX0F0YXJpR0xfVW5sb2FkTGlicmFyeSh0aGlzKTsKLQl9Ci0KLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi0JZ2xfYWN0aXZlID0gMDsKLX0KLQotaW50IFNETF9BdGFyaUdMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyICpwYXRoKQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLQotI2lmIFNETF9WSURFT19PUEVOR0xfT1NNRVNBX0RZTkFNSUMKLQl2b2lkICpoYW5kbGU7Ci0JU0RMX2Jvb2wgY2FuY2VsX2xvYWQ7Ci0KLQlpZiAoZ2xfYWN0aXZlKSB7Ci0JCVNETF9TZXRFcnJvcigiT3BlbkdMIGNvbnRleHQgYWxyZWFkeSBjcmVhdGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBVbmxvYWQgcHJldmlvdXMgZHJpdmVyICovCi0JU0RMX0F0YXJpR0xfVW5sb2FkTGlicmFyeSh0aGlzKTsKLQotCS8qIExvYWQgbGlicmFyeSBnaXZlbiBieSBwYXRoICovCi0JaGFuZGxlID0gU0RMX0xvYWRPYmplY3QocGF0aCk7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCS8qIFRyeSB0byBsb2FkIGFub3RoZXIgb25lICovCi0JCXBhdGggPSBTRExfZ2V0ZW52KCJTRExfVklERU9fR0xfRFJJVkVSIik7Ci0JCWlmICggcGF0aCAhPSBOVUxMICkgewotCQkJaGFuZGxlID0gU0RMX0xvYWRPYmplY3QocGF0aCk7Ci0JCX0KLQotCQkvKiBJZiBpdCBkb2VzIG5vdCB3b3JrLCB0cnkgc29tZSBvdGhlciAqLwotCQlpZiAoaGFuZGxlID09IE5VTEwpIHsKLQkJCXBhdGggPSBQQVRIX09TTUVTQV9MREc7Ci0JCQloYW5kbGUgPSBTRExfTG9hZE9iamVjdChwYXRoKTsKLQkJfQotCi0JCWlmIChoYW5kbGUgPT0gTlVMTCkgewotCQkJcGF0aCA9IFBBVEhfTUVTQUdMX0xERzsKLQkJCWhhbmRsZSA9IFNETF9Mb2FkT2JqZWN0KHBhdGgpOwotCQl9Ci0KLQkJaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCQlwYXRoID0gUEFUSF9USU5ZR0xfTERHOwotCQkJaGFuZGxlID0gU0RMX0xvYWRPYmplY3QocGF0aCk7Ci0JCX0KLQl9Ci0KLQlpZiAoaGFuZGxlID09IE5VTEwpIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZCBub3QgbG9hZCBPcGVuR0wgbGlicmFyeSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JdGhpcy0+Z2xfZGF0YS0+Z2xHZXRJbnRlZ2VydiA9IFNETF9Mb2FkRnVuY3Rpb24oaGFuZGxlLCAiZ2xHZXRJbnRlZ2VydiIpOwotCXRoaXMtPmdsX2RhdGEtPmdsRmluaXNoID0gU0RMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJnbEZpbmlzaCIpOwotCXRoaXMtPmdsX2RhdGEtPmdsRmx1c2ggPSBTRExfTG9hZEZ1bmN0aW9uKGhhbmRsZSwgImdsRmx1c2giKTsKLQotCWNhbmNlbF9sb2FkID0gU0RMX0ZBTFNFOwotCWlmICh0aGlzLT5nbF9kYXRhLT5nbEdldEludGVnZXJ2ID09IE5VTEwpIHsKLQkJY2FuY2VsX2xvYWQgPSBTRExfVFJVRTsKLQl9IGVsc2UgewotCQkvKiBXZSBuZWVkIGVpdGhlciBnbEZpbmlzaCAoT1NNZXNhKSBvciBnbEZsdXNoIChUaW55R0wpICovCi0JCWlmICgodGhpcy0+Z2xfZGF0YS0+Z2xGaW5pc2ggPT0gTlVMTCkgJiYKLQkJCSh0aGlzLT5nbF9kYXRhLT5nbEZsdXNoID09IE5VTEwpKSB7Ci0JCQkJY2FuY2VsX2xvYWQgPSBTRExfVFJVRTsKLQkJfQotCX0KLQlpZiAoY2FuY2VsX2xvYWQpIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZCBub3QgcmV0cmlldmUgT3BlbkdMIGZ1bmN0aW9ucyIpOwotCQlTRExfVW5sb2FkT2JqZWN0KGhhbmRsZSk7Ci0JCS8qIFJlc3RvcmUgcG9pbnRlcnMgdG8gc3RhdGljIGxpYnJhcnkgKi8KLQkJU0RMX0F0YXJpR0xfSW5pdFBvaW50ZXJzKHRoaXMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogTG9hZCBmdW5jdGlvbnMgcG9pbnRlcnMgKG9zbWVzYS5sZGcpICovCi0JdGhpcy0+Z2xfZGF0YS0+T1NNZXNhQ3JlYXRlQ29udGV4dEV4dCA9IFNETF9Mb2FkRnVuY3Rpb24oaGFuZGxlLCAiT1NNZXNhQ3JlYXRlQ29udGV4dEV4dCIpOwotCXRoaXMtPmdsX2RhdGEtPk9TTWVzYURlc3Ryb3lDb250ZXh0ID0gU0RMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJPU01lc2FEZXN0cm95Q29udGV4dCIpOwotCXRoaXMtPmdsX2RhdGEtPk9TTWVzYU1ha2VDdXJyZW50ID0gU0RMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJPU01lc2FNYWtlQ3VycmVudCIpOwotCXRoaXMtPmdsX2RhdGEtPk9TTWVzYVBpeGVsU3RvcmUgPSBTRExfTG9hZEZ1bmN0aW9uKGhhbmRsZSwgIk9TTWVzYVBpeGVsU3RvcmUiKTsKLQl0aGlzLT5nbF9kYXRhLT5PU01lc2FHZXRQcm9jQWRkcmVzcyA9IFNETF9Mb2FkRnVuY3Rpb24oaGFuZGxlLCAiT1NNZXNhR2V0UHJvY0FkZHJlc3MiKTsKLQotCS8qIExvYWQgb2xkIGZ1bmN0aW9ucyBwb2ludGVycyAobWVzYV9nbC5sZGcsIHRpbnlfZ2wubGRnKSAqLwotCXRoaXMtPmdsX2RhdGEtPk9TTWVzYUNyZWF0ZUxERyA9IFNETF9Mb2FkRnVuY3Rpb24oaGFuZGxlLCAiT1NNZXNhQ3JlYXRlTERHIik7Ci0JdGhpcy0+Z2xfZGF0YS0+T1NNZXNhRGVzdHJveUxERyA9IFNETF9Mb2FkRnVuY3Rpb24oaGFuZGxlLCAiT1NNZXNhRGVzdHJveUxERyIpOwotCi0JZ2xfb2xkbWVzYSA9IDA7Ci0KLQlpZiAoICh0aGlzLT5nbF9kYXRhLT5PU01lc2FDcmVhdGVDb250ZXh0RXh0ID09IE5VTEwpIHx8IAotCSAgICAgKHRoaXMtPmdsX2RhdGEtPk9TTWVzYURlc3Ryb3lDb250ZXh0ID09IE5VTEwpIHx8Ci0JICAgICAodGhpcy0+Z2xfZGF0YS0+T1NNZXNhTWFrZUN1cnJlbnQgPT0gTlVMTCkgfHwKLQkgICAgICh0aGlzLT5nbF9kYXRhLT5PU01lc2FQaXhlbFN0b3JlID09IE5VTEwpIHx8Ci0JICAgICAodGhpcy0+Z2xfZGF0YS0+T1NNZXNhR2V0UHJvY0FkZHJlc3MgPT0gTlVMTCkpIHsKLQkJLyogSHVtLCBtYXliZSBvbGQgbGlicmFyeSA/ICovCi0JCWlmICggKHRoaXMtPmdsX2RhdGEtPk9TTWVzYUNyZWF0ZUxERyA9PSBOVUxMKSB8fCAKLQkJICAgICAodGhpcy0+Z2xfZGF0YS0+T1NNZXNhRGVzdHJveUxERyA9PSBOVUxMKSkgewotCQkJU0RMX1NldEVycm9yKCJDb3VsZCBub3QgcmV0cmlldmUgT1NNZXNhIGZ1bmN0aW9ucyIpOwotCQkJU0RMX1VubG9hZE9iamVjdChoYW5kbGUpOwotCQkJLyogUmVzdG9yZSBwb2ludGVycyB0byBzdGF0aWMgbGlicmFyeSAqLwotCQkJU0RMX0F0YXJpR0xfSW5pdFBvaW50ZXJzKHRoaXMpOwotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgewotCQkJZ2xfb2xkbWVzYSA9IDE7Ci0JCX0KLQl9Ci0KLQl0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IGhhbmRsZTsKLQlpZiAoIHBhdGggKSB7Ci0JCVNETF9zdHJsY3B5KHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCwgcGF0aCwKLQkJCVNETF9hcnJheXNpemUodGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoKSk7Ci0JfSBlbHNlIHsKLQkJKnRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCA9ICdcMCc7Ci0JfQotCi0jZW5kaWYKLQl0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7Ci0KLQlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIC0xOwotI2VuZGlmCi19Ci0KLXZvaWQgKlNETF9BdGFyaUdMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyICpwcm9jKQotewotCXZvaWQgKmZ1bmMgPSBOVUxMOwotI2lmIFNETF9WSURFT19PUEVOR0wKLQotCWlmICh0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSkgewotCQlmdW5jID0gU0RMX0xvYWRGdW5jdGlvbih0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSwgKHZvaWQgKilwcm9jKTsKLQl9IGVsc2UgaWYgKHRoaXMtPmdsX2RhdGEtPk9TTWVzYUdldFByb2NBZGRyZXNzKSB7Ci0JCWZ1bmMgPSB0aGlzLT5nbF9kYXRhLT5PU01lc2FHZXRQcm9jQWRkcmVzcyhwcm9jKTsKLQl9Ci0KLSNlbmRpZgotCXJldHVybiBmdW5jOwotfQotCi1pbnQgU0RMX0F0YXJpR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSkKLXsKLSNpZiBTRExfVklERU9fT1BFTkdMCi0JR0xlbnVtIG1lc2FfYXR0cmliOwotCVNETF9TdXJmYWNlICpzdXJmYWNlOwotCi0JaWYgKCFnbF9hY3RpdmUpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXN3aXRjaChhdHRyaWIpIHsKLQkJY2FzZSBTRExfR0xfUkVEX1NJWkU6Ci0JCQltZXNhX2F0dHJpYiA9IEdMX1JFRF9CSVRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0dSRUVOX1NJWkU6Ci0JCQltZXNhX2F0dHJpYiA9IEdMX0dSRUVOX0JJVFM7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQkxVRV9TSVpFOgotCQkJbWVzYV9hdHRyaWIgPSBHTF9CTFVFX0JJVFM7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQUxQSEFfU0laRToKLQkJCW1lc2FfYXR0cmliID0gR0xfQUxQSEFfQklUUzsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9ET1VCTEVCVUZGRVI6Ci0JCQlzdXJmYWNlID0gdGhpcy0+c2NyZWVuOwotCQkJKnZhbHVlID0gKChzdXJmYWNlLT5mbGFncyAmIFNETF9ET1VCTEVCVUYpPT1TRExfRE9VQkxFQlVGKTsKLQkJCXJldHVybiAwOwotCQljYXNlIFNETF9HTF9ERVBUSF9TSVpFOgotCQkJbWVzYV9hdHRyaWIgPSBHTF9ERVBUSF9CSVRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX1NURU5DSUxfU0laRToKLQkJCW1lc2FfYXR0cmliID0gR0xfU1RFTkNJTF9CSVRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0FDQ1VNX1JFRF9TSVpFOgotCQkJbWVzYV9hdHRyaWIgPSBHTF9BQ0NVTV9SRURfQklUUzsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9BQ0NVTV9HUkVFTl9TSVpFOgotCQkJbWVzYV9hdHRyaWIgPSBHTF9BQ0NVTV9HUkVFTl9CSVRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0FDQ1VNX0JMVUVfU0laRToKLQkJCW1lc2FfYXR0cmliID0gR0xfQUNDVU1fQkxVRV9CSVRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0FDQ1VNX0FMUEhBX1NJWkU6Ci0JCQltZXNhX2F0dHJpYiA9IEdMX0FDQ1VNX0FMUEhBX0JJVFM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdCA6Ci0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JdGhpcy0+Z2xfZGF0YS0+Z2xHZXRJbnRlZ2VydihtZXNhX2F0dHJpYiwgdmFsdWUpOwotCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gLTE7Ci0jZW5kaWYKLX0KLQotaW50IFNETF9BdGFyaUdMX01ha2VDdXJyZW50KF9USElTKQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLQlTRExfU3VyZmFjZSAqc3VyZmFjZTsKLQlHTGVudW0gdHlwZTsKLQotCWlmIChnbF9vbGRtZXNhICYmIGdsX2FjdGl2ZSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAodGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUpIHsKLQkJaWYgKCh0aGlzLT5nbF9kYXRhLT5PU01lc2FNYWtlQ3VycmVudCA9PSBOVUxMKSB8fAotCQkJKHRoaXMtPmdsX2RhdGEtPk9TTWVzYVBpeGVsU3RvcmUgPT0gTlVMTCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCWlmICghZ2xfYWN0aXZlKSB7Ci0JCVNETF9TZXRFcnJvcigiSW52YWxpZCBPcGVuR0wgY29udGV4dCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3VyZmFjZSA9IHRoaXMtPnNjcmVlbjsKLQkKLQlpZiAoKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsID09IDE1KSB8fCAoc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gMTYpKSB7Ci0JCXR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKLQl9IGVsc2UgewotCQl0eXBlID0gR0xfVU5TSUdORURfQllURTsKLQl9Ci0KLQlpZiAoISh0aGlzLT5nbF9kYXRhLT5PU01lc2FNYWtlQ3VycmVudChnbF9jdHgsIHN1cmZhY2UtPnBpeGVscywgdHlwZSwgc3VyZmFjZS0+dywgc3VyZmFjZS0+aCkpKSB7Ci0JCVNETF9TZXRFcnJvcigiQ2FuIG5vdCBtYWtlIE9wZW5HTCBjb250ZXh0IGN1cnJlbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIE9TTWVzYSBkcmF3cyB1cHNpZGUgZG93biAqLwotCXRoaXMtPmdsX2RhdGEtPk9TTWVzYVBpeGVsU3RvcmUoT1NNRVNBX1lfVVAsIDApOwotCi0JcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZgotfQotCi12b2lkIFNETF9BdGFyaUdMX1N3YXBCdWZmZXJzKF9USElTKQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLQlpZiAoZ2xfYWN0aXZlKSB7Ci0JCWlmICh0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSkgewotCQkJaWYgKHRoaXMtPmdsX2RhdGEtPmdsRmluaXNoKSB7Ci0JCQkJdGhpcy0+Z2xfZGF0YS0+Z2xGaW5pc2goKTsKLQkJCX0gZWxzZSBpZiAodGhpcy0+Z2xfZGF0YS0+Z2xGbHVzaCkgewotCQkJCXRoaXMtPmdsX2RhdGEtPmdsRmx1c2goKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMtPmdsX2RhdGEtPmdsRmluaXNoKCk7Ci0JCX0KLQkJZ2xfY29weXNoYWRvdyh0aGlzLCB0aGlzLT5zY3JlZW4pOwotCQlnbF9jb252ZXJ0KHRoaXMsIHRoaXMtPnNjcmVlbik7Ci0JfQotI2VuZGlmCi19Ci0KLXZvaWQgU0RMX0F0YXJpR0xfSW5pdFBvaW50ZXJzKF9USElTKQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLQl0aGlzLT5nbF9kYXRhLT5PU01lc2FDcmVhdGVDb250ZXh0RXh0ID0gT1NNZXNhQ3JlYXRlQ29udGV4dEV4dDsKLQl0aGlzLT5nbF9kYXRhLT5PU01lc2FEZXN0cm95Q29udGV4dCA9IE9TTWVzYURlc3Ryb3lDb250ZXh0OwotCXRoaXMtPmdsX2RhdGEtPk9TTWVzYU1ha2VDdXJyZW50ID0gT1NNZXNhTWFrZUN1cnJlbnQ7Ci0JdGhpcy0+Z2xfZGF0YS0+T1NNZXNhUGl4ZWxTdG9yZSA9IE9TTWVzYVBpeGVsU3RvcmU7Ci0JdGhpcy0+Z2xfZGF0YS0+T1NNZXNhR2V0UHJvY0FkZHJlc3MgPSBPU01lc2FHZXRQcm9jQWRkcmVzczsKLQotCXRoaXMtPmdsX2RhdGEtPmdsR2V0SW50ZWdlcnYgPSBnbEdldEludGVnZXJ2OwotCXRoaXMtPmdsX2RhdGEtPmdsRmluaXNoID0gZ2xGaW5pc2g7Ci0JdGhpcy0+Z2xfZGF0YS0+Z2xGbHVzaCA9IGdsRmx1c2g7Ci0KLQl0aGlzLT5nbF9kYXRhLT5PU01lc2FDcmVhdGVMREcgPSBOVUxMOwotCXRoaXMtPmdsX2RhdGEtPk9TTWVzYURlc3Ryb3lMREcgPSBOVUxMOwotI2VuZGlmCi19Ci0KLS8qLS0tIFByaXZhdGUgZnVuY3Rpb25zIC0tLSovCi0KLXN0YXRpYyB2b2lkIFNETF9BdGFyaUdMX1VubG9hZExpYnJhcnkoX1RISVMpCi17Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCWlmICh0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSkgewotCQlTRExfVW5sb2FkT2JqZWN0KHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKTsKLQkJdGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUgPSBOVUxMOwotCi0JCS8qIFJlc3RvcmUgcG9pbnRlcnMgdG8gc3RhdGljIGxpYnJhcnkgKi8KLQkJU0RMX0F0YXJpR0xfSW5pdFBvaW50ZXJzKHRoaXMpOwotCX0KLSNlbmRpZgotfQotCi0vKi0tLSBDcmVhdGlvbiBvZiBhbiBPcGVuR0wgY29udGV4dCB1c2luZyBuZXcvb2xkIGZ1bmN0aW9ucyAtLS0qLwotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotc3RhdGljIGludCBJbml0TmV3KF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCkKLXsKLQlHTGVudW0gb3NtZXNhX2Zvcm1hdDsKLQlTRExfUGl4ZWxGb3JtYXQgKnBpeGVsX2Zvcm1hdDsKLQlVaW50MzIJcmVkbWFzazsKLQlpbnQgcmVjcmVhdGVjb250ZXh0OwotCUdMaW50IG5ld2FjY3Vtc2l6ZTsKLQotCWlmICh0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSkgewotCQlpZiAodGhpcy0+Z2xfZGF0YS0+T1NNZXNhQ3JlYXRlQ29udGV4dEV4dCA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qIEluaXQgT3BlbkdMIGNvbnRleHQgdXNpbmcgT1NNZXNhICovCi0JZ2xfY29udmVydCA9IENvbnZlcnROdWxsOwotCWdsX2NvcHlzaGFkb3cgPSBDb3B5U2hhZG93TnVsbDsKLQlnbF91cHNpZGVkb3duID0gU0RMX0ZBTFNFOwotCi0JcGl4ZWxfZm9ybWF0ID0gY3VycmVudC0+Zm9ybWF0OwotCXJlZG1hc2sgPSBwaXhlbF9mb3JtYXQtPlJtYXNrOwotCXN3aXRjaCAocGl4ZWxfZm9ybWF0LT5CaXRzUGVyUGl4ZWwpIHsKLQkJY2FzZSAxNToKLQkJCS8qIDE1NTUsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiwgdW5zdXBwb3J0ZWQgKi8KLQkJCWdsX3BpeGVsc2l6ZSA9IDI7Ci0JCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX1JHQl81NjU7Ci0JCQlpZiAocmVkbWFzayA9PSAzMTw8MTApIHsKLQkJCQlnbF9jb252ZXJ0ID0gQ29udmVydDU2NVRvNTU1YmU7Ci0JCQl9IGVsc2UgewotCQkJCWdsX2NvbnZlcnQgPSBDb252ZXJ0NTY1VG81NTVsZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQkJZ2xfcGl4ZWxzaXplID0gMjsKLQkJCWlmIChyZWRtYXNrID09IDMxPDwxMSkgewotCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfUkdCXzU2NTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogNTY1LCBsaXR0bGUgZW5kaWFuLCB1bnN1cHBvcnRlZCAqLwotCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfUkdCXzU2NTsKLQkJCQlnbF9jb252ZXJ0ID0gQ29udmVydDU2NWxlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMjQ6Ci0JCQlnbF9waXhlbHNpemUgPSAzOwotCQkJaWYgKHJlZG1hc2sgPT0gMjU1PDwxNikgewotCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfUkdCOwotCQkJfSBlbHNlIHsKLQkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX0JHUjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDMyOgotCQkJZ2xfcGl4ZWxzaXplID0gNDsKLQkJCWlmIChyZWRtYXNrID09IDI1NTw8MTYpIHsKLQkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX0FSR0I7Ci0JCQl9IGVsc2UgaWYgKHJlZG1hc2sgPT0gMjU1PDw4KSB7Ci0JCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9CR1JBOwotCQkJfSBlbHNlIGlmIChyZWRtYXNrID09IDI1NTw8MjQpIHsKLQkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX1JHQkE7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEFCR1IgZm9ybWF0IHVuc3VwcG9ydGVkICovCi0JCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9CR1JBOwotCQkJCWdsX2NvbnZlcnQgPSBDb252ZXJ0QkdSQVRvQUJHUjsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZ2xfcGl4ZWxzaXplID0gMTsKLQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfQ09MT1JfSU5ERVg7Ci0JCQlicmVhazsKLQl9Ci0KLQkvKiBUcnkgdG8ga2VlcCBjdXJyZW50IGNvbnRleHQgaWYgcG9zc2libGUgKi8KLQluZXdhY2N1bXNpemUgPQotCQl0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemUgKwotCQl0aGlzLT5nbF9jb25maWcuYWNjdW1fZ3JlZW5fc2l6ZSArCi0JCXRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemUgKwotCQl0aGlzLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZTsKLQlyZWNyZWF0ZWNvbnRleHQ9MTsKLQlpZiAoZ2xfY3R4ICYmCi0JCShnbF9jdXJmb3JtYXQgPT0gb3NtZXNhX2Zvcm1hdCkgJiYKLQkJKGdsX2N1cmRlcHRoID09IHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplKSAmJgotCQkoZ2xfY3Vyc3RlbmNpbCA9PSB0aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplKSAmJgotCQkoZ2xfY3VyYWNjdW0gPT0gbmV3YWNjdW1zaXplKSkgewotCQlyZWNyZWF0ZWNvbnRleHQgPSAwOwotCX0KLQlpZiAocmVjcmVhdGVjb250ZXh0KSB7Ci0JCVNETF9BdGFyaUdMX1F1aXQodGhpcywgU0RMX0ZBTFNFKTsKLQotCQlnbF9jdHggPSB0aGlzLT5nbF9kYXRhLT5PU01lc2FDcmVhdGVDb250ZXh0RXh0KAotCQkJb3NtZXNhX2Zvcm1hdCwgdGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemUsCi0JCQl0aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplLCBuZXdhY2N1bXNpemUsIE5VTEwgKTsKLQotCQlpZiAoZ2xfY3R4KSB7Ci0JCQlnbF9jdXJmb3JtYXQgPSBvc21lc2FfZm9ybWF0OwotCQkJZ2xfY3VyZGVwdGggPSB0aGlzLT5nbF9jb25maWcuZGVwdGhfc2l6ZTsKLQkJCWdsX2N1cnN0ZW5jaWwgPSB0aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplOwotCQkJZ2xfY3VyYWNjdW0gPSBuZXdhY2N1bXNpemU7Ci0JCX0gZWxzZSB7Ci0JCQlnbF9jdXJmb3JtYXQgPSAwOwotCQkJZ2xfY3VyZGVwdGggPSAwOwotCQkJZ2xfY3Vyc3RlbmNpbCA9IDA7Ci0JCQlnbF9jdXJhY2N1bSA9IDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKGdsX2N0eCAhPSBOVUxMKTsKLX0KLQotCi1zdGF0aWMgaW50IEluaXRPbGQoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50KQotewotCUdMZW51bSBvc21lc2FfZm9ybWF0OwotCVNETF9QaXhlbEZvcm1hdCAqcGl4ZWxfZm9ybWF0OwotCVVpbnQzMglyZWRtYXNrOwotCWludCByZWNyZWF0ZWNvbnRleHQsIHRpbnlnbF9wcmVzZW50OwotCi0JaWYgKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKSB7Ci0JCWlmICh0aGlzLT5nbF9kYXRhLT5PU01lc2FDcmVhdGVMREcgPT0gTlVMTCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkvKiBUaW55R0wgb25seSBzdXBwb3J0cyBWRElfUkdCIChPU01FU0FfUkdCKSAqLwotCXRpbnlnbF9wcmVzZW50PTA7Ci0JaWYgKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKSB7Ci0JCWlmICh0aGlzLT5nbF9kYXRhLT5nbEZpbmlzaCA9PSBOVUxMKSB7Ci0JCQl0aW55Z2xfcHJlc2VudD0xOwotCQl9Ci0JfQotCi0JLyogSW5pdCBPcGVuR0wgY29udGV4dCB1c2luZyBPU01lc2EgKi8KLQlnbF9jb252ZXJ0ID0gQ29udmVydE51bGw7Ci0JZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dOdWxsOwotCWdsX3Vwc2lkZWRvd24gPSBTRExfRkFMU0U7Ci0KLQlwaXhlbF9mb3JtYXQgPSBjdXJyZW50LT5mb3JtYXQ7Ci0JcmVkbWFzayA9IHBpeGVsX2Zvcm1hdC0+Um1hc2s7Ci0Jc3dpdGNoIChwaXhlbF9mb3JtYXQtPkJpdHNQZXJQaXhlbCkgewotCQljYXNlIDE1OgotCQkJLyogMTUgYml0cyB1bnN1cHBvcnRlZCAqLwotCQkJaWYgKHRpbnlnbF9wcmVzZW50KSB7Ci0JCQkJZ2xfcGl4ZWxzaXplID0gMzsKLQkJCQlvc21lc2FfZm9ybWF0ID0gVkRJX1JHQjsKLQkJCQlpZiAocmVkbWFzayA9PSAzMTw8MTApIHsKLQkJCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dSR0JUbzU1NTsKLQkJCQl9IGVsc2UgewotCQkJCQlnbF9jb3B5c2hhZG93ID0gQ29weVNoYWRvd1JHQlRvNTY1OwotCQkJCQlnbF9jb252ZXJ0ID0gQ29udmVydDU2NVRvNTU1bGU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlnbF9waXhlbHNpemUgPSA0OwotCQkJCWdsX3Vwc2lkZWRvd24gPSBTRExfVFJVRTsKLQkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX0FSR0I7Ci0JCQkJaWYgKHJlZG1hc2sgPT0gMzE8PDEwKSB7Ci0JCQkJCWdsX2NvcHlzaGFkb3cgPSBDb3B5U2hhZG93ODg4OFRvNTU1OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWdsX2NvcHlzaGFkb3cgPSBDb3B5U2hhZG93ODg4OFRvNTY1OwotCQkJCQlnbF9jb252ZXJ0ID0gQ29udmVydDU2NVRvNTU1bGU7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQkvKiAxNiBiaXRzIHVuc3VwcG9ydGVkICovCi0JCQlpZiAodGlueWdsX3ByZXNlbnQpIHsKLQkJCQlnbF9waXhlbHNpemUgPSAzOwotCQkJCW9zbWVzYV9mb3JtYXQgPSBWRElfUkdCOwotCQkJCWdsX2NvcHlzaGFkb3cgPSBDb3B5U2hhZG93UkdCVG81NjU7Ci0JCQkJaWYgKHJlZG1hc2sgIT0gMzE8PDExKSB7Ci0JCQkJCS8qIDU2NSwgbGl0dGxlIGVuZGlhbiwgdW5zdXBwb3J0ZWQgKi8KLQkJCQkJZ2xfY29udmVydCA9IENvbnZlcnQ1NjVsZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWdsX3BpeGVsc2l6ZSA9IDQ7Ci0JCQkJZ2xfdXBzaWRlZG93biA9IFNETF9UUlVFOwotCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfQVJHQjsKLQkJCQlnbF9jb3B5c2hhZG93ID0gQ29weVNoYWRvdzg4ODhUbzU2NTsKLQkJCQlpZiAocmVkbWFzayAhPSAzMTw8MTEpIHsKLQkJCQkJLyogNTY1LCBsaXR0bGUgZW5kaWFuLCB1bnN1cHBvcnRlZCAqLwotCQkJCQlnbF9jb252ZXJ0ID0gQ29udmVydDU2NWxlOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDI0OgotCQkJZ2xfcGl4ZWxzaXplID0gMzsKLQkJCWlmICh0aW55Z2xfcHJlc2VudCkgewotCQkJCW9zbWVzYV9mb3JtYXQgPSBWRElfUkdCOwotCQkJCWdsX2NvcHlzaGFkb3cgPSBDb3B5U2hhZG93RGlyZWN0OwotCQkJCWlmIChyZWRtYXNrICE9IDI1NTw8MTYpIHsKLQkJCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dSR0JTd2FwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dEaXJlY3Q7Ci0JCQkJZ2xfdXBzaWRlZG93biA9IFNETF9UUlVFOwotCQkJCWlmIChyZWRtYXNrID09IDI1NTw8MTYpIHsKLQkJCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9SR0I7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9CR1I7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMzI6Ci0JCQlpZiAodGlueWdsX3ByZXNlbnQpIHsKLQkJCQlnbF9waXhlbHNpemUgPSAzOwotCQkJCW9zbWVzYV9mb3JtYXQgPSBWRElfUkdCOwotCQkJCWdsX2NvcHlzaGFkb3cgPSBDb3B5U2hhZG93UkdCVG9BUkdCOwotCQkJCWlmIChyZWRtYXNrID09IDI1NSkgewotCQkJCQlnbF9jb252ZXJ0ID0gQ29weVNoYWRvd1JHQlRvQUJHUjsKLQkJCQl9IGVsc2UgaWYgKHJlZG1hc2sgPT0gMjU1PDw4KSB7Ci0JCQkJCWdsX2NvbnZlcnQgPSBDb3B5U2hhZG93UkdCVG9CR1JBOwotCQkJCX0gZWxzZSBpZiAocmVkbWFzayA9PSAyNTU8PDI0KSB7Ci0JCQkJCWdsX2NvbnZlcnQgPSBDb3B5U2hhZG93UkdCVG9SR0JBOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZ2xfcGl4ZWxzaXplID0gNDsKLQkJCQlnbF91cHNpZGVkb3duID0gU0RMX1RSVUU7Ci0JCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dEaXJlY3Q7Ci0JCQkJaWYgKHJlZG1hc2sgPT0gMjU1PDwxNikgewotCQkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX0FSR0I7Ci0JCQkJfSBlbHNlIGlmIChyZWRtYXNrID09IDI1NTw8OCkgewotCQkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX0JHUkE7Ci0JCQkJfSBlbHNlIGlmIChyZWRtYXNrID09IDI1NTw8MjQpIHsKLQkJCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9SR0JBOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIEFCR1IgZm9ybWF0IHVuc3VwcG9ydGVkICovCi0JCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfQkdSQTsKLQkJCQkJZ2xfY29udmVydCA9IENvbnZlcnRCR1JBVG9BQkdSOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKHRpbnlnbF9wcmVzZW50KSB7Ci0JCQkJU0RMX0F0YXJpR0xfUXVpdCh0aGlzLCBTRExfRkFMU0UpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZ2xfcGl4ZWxzaXplID0gMTsKLQkJCWdsX2NvcHlzaGFkb3cgPSBDb3B5U2hhZG93RGlyZWN0OwotCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9DT0xPUl9JTkRFWDsKLQkJCWJyZWFrOwotCX0KLQotCS8qIFRyeSB0byBrZWVwIGN1cnJlbnQgY29udGV4dCBpZiBwb3NzaWJsZSAqLwotCXJlY3JlYXRlY29udGV4dD0xOwotCWlmIChnbF9zaGFkb3cgJiYKLQkJKGdsX2N1cmZvcm1hdCA9PSBvc21lc2FfZm9ybWF0KSAmJgotCQkoZ2xfY3Vyd2lkdGggPT0gY3VycmVudC0+dykgJiYKLQkJKGdsX2N1cmhlaWdodCA9PSBjdXJyZW50LT5oKSkgewotCQlyZWNyZWF0ZWNvbnRleHQgPSAwOwotCX0KLQlpZiAocmVjcmVhdGVjb250ZXh0KSB7Ci0JCVNETF9BdGFyaUdMX1F1aXQodGhpcywgU0RMX0ZBTFNFKTsKLQotCQlnbF9zaGFkb3cgPSB0aGlzLT5nbF9kYXRhLT5PU01lc2FDcmVhdGVMREcoCi0JCQlvc21lc2FfZm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFLCBjdXJyZW50LT53LCBjdXJyZW50LT5oCi0JCSk7Ci0KLQkJaWYgKGdsX3NoYWRvdykgewotCQkJZ2xfY3VyZm9ybWF0ID0gb3NtZXNhX2Zvcm1hdDsKLQkJCWdsX2N1cndpZHRoID0gY3VycmVudC0+dzsKLQkJCWdsX2N1cmhlaWdodCA9IGN1cnJlbnQtPmg7Ci0JCX0gZWxzZSB7Ci0JCQlnbF9jdXJmb3JtYXQgPSAwOwotCQkJZ2xfY3Vyd2lkdGggPSAwOwotCQkJZ2xfY3VyaGVpZ2h0ID0gMDsKLQkJfQotCX0KLQotCXJldHVybiAoZ2xfc2hhZG93ICE9IE5VTEwpOwotfQotCi0vKi0tLSBDb252ZXJzaW9ucyByb3V0aW5lcyBmcm9tIHNoYWRvdyBidWZmZXIgdG8gdGhlIHNjcmVlbiAtLS0qLwotCi1zdGF0aWMgdm9pZCBDb3B5U2hhZG93TnVsbChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlTaGFkb3dEaXJlY3QoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWludCB5LCBzcmNwaXRjaCwgZHN0cGl0Y2g7Ci0JVWludDggKnNyY2xpbmUsICpkc3RsaW5lOwotCi0Jc3JjbGluZSA9IGdsX3NoYWRvdzsKLQlzcmNwaXRjaCA9IHN1cmZhY2UtPncgKiBnbF9waXhlbHNpemU7Ci0JZHN0bGluZSA9IHN1cmZhY2UtPnBpeGVsczsKLQlkc3RwaXRjaCA9IHN1cmZhY2UtPnBpdGNoOwotCWlmIChnbF91cHNpZGVkb3duKSB7Ci0JCXNyY2xpbmUgKz0gKHN1cmZhY2UtPmgtMSkqc3JjcGl0Y2g7Ci0JCXNyY3BpdGNoID0gLXNyY3BpdGNoOwotCX0KLQotCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgewotCQlTRExfbWVtY3B5KGRzdGxpbmUsIHNyY2xpbmUsIHNyY3BpdGNoKTsKLQotCQlzcmNsaW5lICs9IHNyY3BpdGNoOwotCQlkc3RsaW5lICs9IGRzdHBpdGNoOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlRvNTU1KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpbnQgeCx5LCBzcmNwaXRjaCwgZHN0cGl0Y2g7Ci0JVWludDE2ICpkc3RsaW5lLCAqZHN0Y29sOwotCVVpbnQ4ICpzcmNsaW5lLCAqc3JjY29sOwotCi0Jc3JjbGluZSA9IChVaW50OCAqKWdsX3NoYWRvdzsKLQlzcmNwaXRjaCA9IHN1cmZhY2UtPncgKiBnbF9waXhlbHNpemU7Ci0JZHN0bGluZSA9IHN1cmZhY2UtPnBpeGVsczsKLQlkc3RwaXRjaCA9IHN1cmZhY2UtPnBpdGNoID4+MTsKLQlpZiAoZ2xfdXBzaWRlZG93bikgewotCQlzcmNsaW5lICs9IChzdXJmYWNlLT5oLTEpKnNyY3BpdGNoOwotCQlzcmNwaXRjaCA9IC1zcmNwaXRjaDsKLQl9Ci0KLQlmb3IgKHk9MDsgeTxzdXJmYWNlLT5oOyB5KyspIHsKLQkJc3JjY29sID0gc3JjbGluZTsKLQkJZHN0Y29sID0gZHN0bGluZTsKLQkJZm9yICh4PTA7IHg8c3VyZmFjZS0+dzsgeCsrKSB7Ci0JCQlVaW50MTYgZHN0Y29sb3I7Ci0JCQkKLQkJCWRzdGNvbG9yID0gKCgqc3JjY29sKyspPDw3KSAmICgzMTw8MTApOwotCQkJZHN0Y29sb3IgfD0gKCgqc3JjY29sKyspPDwyKSAmICgzMTw8NSk7Ci0JCQlkc3Rjb2xvciB8PSAoKCpzcmNjb2wrKyk+PjMpICYgMzE7Ci0JCQkqZHN0Y29sKysgPSBkc3Rjb2xvcjsKLQkJfQotCi0JCXNyY2xpbmUgKz0gc3JjcGl0Y2g7Ci0JCWRzdGxpbmUgKz0gZHN0cGl0Y2g7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBDb3B5U2hhZG93UkdCVG81NjUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWludCB4LHksIHNyY3BpdGNoLCBkc3RwaXRjaDsKLQlVaW50MTYgKmRzdGxpbmUsICpkc3Rjb2w7Ci0JVWludDggKnNyY2xpbmUsICpzcmNjb2w7Ci0KLQlzcmNsaW5lID0gKFVpbnQ4ICopZ2xfc2hhZG93OwotCXNyY3BpdGNoID0gc3VyZmFjZS0+dyAqIGdsX3BpeGVsc2l6ZTsKLQlkc3RsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOwotCWRzdHBpdGNoID0gc3VyZmFjZS0+cGl0Y2ggPj4xOwotCWlmIChnbF91cHNpZGVkb3duKSB7Ci0JCXNyY2xpbmUgKz0gKHN1cmZhY2UtPmgtMSkqc3JjcGl0Y2g7Ci0JCXNyY3BpdGNoID0gLXNyY3BpdGNoOwotCX0KLQotCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgewotCQlzcmNjb2wgPSBzcmNsaW5lOwotCQlkc3Rjb2wgPSBkc3RsaW5lOwotCi0JCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgewotCQkJVWludDE2IGRzdGNvbG9yOwotCQkJCi0JCQlkc3Rjb2xvciA9ICgoKnNyY2NvbCsrKTw8OCkgJiAoMzE8PDExKTsKLQkJCWRzdGNvbG9yIHw9ICgoKnNyY2NvbCsrKTw8MykgJiAoNjM8PDUpOwotCQkJZHN0Y29sb3IgfD0gKCgqc3JjY29sKyspPj4zKSAmIDMxOwotCQkJKmRzdGNvbCsrID0gZHN0Y29sb3I7Ci0JCX0KLQotCQlzcmNsaW5lICs9IHNyY3BpdGNoOwotCQlkc3RsaW5lICs9IGRzdHBpdGNoOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlN3YXAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWludCB4LHksIHNyY3BpdGNoLCBkc3RwaXRjaDsKLQlVaW50OCAqZHN0bGluZSwgKmRzdGNvbDsKLQlVaW50OCAqc3JjbGluZSwgKnNyY2NvbDsKLQotCXNyY2xpbmUgPSAoVWludDggKilnbF9zaGFkb3c7Ci0Jc3JjcGl0Y2ggPSBzdXJmYWNlLT53ICogZ2xfcGl4ZWxzaXplOwotCWRzdGxpbmUgPSBzdXJmYWNlLT5waXhlbHM7Ci0JZHN0cGl0Y2ggPSBzdXJmYWNlLT5waXRjaDsKLQlpZiAoZ2xfdXBzaWRlZG93bikgewotCQlzcmNsaW5lICs9IChzdXJmYWNlLT5oLTEpKnNyY3BpdGNoOwotCQlzcmNwaXRjaCA9IC1zcmNwaXRjaDsKLQl9Ci0KLQlmb3IgKHk9MDsgeTxzdXJmYWNlLT5oOyB5KyspIHsKLQkJc3JjY29sID0gc3JjbGluZTsKLQkJZHN0Y29sID0gZHN0bGluZTsKLQotCQlmb3IgKHg9MDsgeDxzdXJmYWNlLT53OyB4KyspIHsKLQkJCSpkc3Rjb2wrKyA9IHNyY2NvbFsyXTsKLQkJCSpkc3Rjb2wrKyA9IHNyY2NvbFsxXTsKLQkJCSpkc3Rjb2wrKyA9IHNyY2NvbFswXTsKLQkJCXNyY2NvbCArPSAzOwotCQl9Ci0KLQkJc3JjbGluZSArPSBzcmNwaXRjaDsKLQkJZHN0bGluZSArPSBkc3RwaXRjaDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUb0FSR0IoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWludCB4LHksIHNyY3BpdGNoLCBkc3RwaXRjaDsKLQlVaW50MzIgKmRzdGxpbmUsICpkc3Rjb2w7Ci0JVWludDggKnNyY2xpbmUsICpzcmNjb2w7Ci0KLQlzcmNsaW5lID0gKFVpbnQ4ICopZ2xfc2hhZG93OwotCXNyY3BpdGNoID0gc3VyZmFjZS0+dyAqIGdsX3BpeGVsc2l6ZTsKLQlkc3RsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOwotCWRzdHBpdGNoID0gc3VyZmFjZS0+cGl0Y2ggPj4yOwotCWlmIChnbF91cHNpZGVkb3duKSB7Ci0JCXNyY2xpbmUgKz0gKHN1cmZhY2UtPmgtMSkqc3JjcGl0Y2g7Ci0JCXNyY3BpdGNoID0gLXNyY3BpdGNoOwotCX0KLQotCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgewotCQlzcmNjb2wgPSBzcmNsaW5lOwotCQlkc3Rjb2wgPSBkc3RsaW5lOwotCi0JCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgewotCQkJVWludDMyCWRzdGNvbG9yOwotCi0JCQlkc3Rjb2xvciA9ICgqc3JjY29sKyspPDwxNjsKLQkJCWRzdGNvbG9yIHw9ICgqc3JjY29sKyspPDw4OwotCQkJZHN0Y29sb3IgfD0gKnNyY2NvbCsrOwotCi0JCQkqZHN0Y29sKysgPSBkc3Rjb2xvcjsKLQkJfQotCi0JCXNyY2xpbmUgKz0gc3JjcGl0Y2g7Ci0JCWRzdGxpbmUgKz0gZHN0cGl0Y2g7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBDb3B5U2hhZG93UkdCVG9BQkdSKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpbnQgeCx5LCBzcmNwaXRjaCwgZHN0cGl0Y2g7Ci0JVWludDMyICpkc3RsaW5lLCAqZHN0Y29sOwotCVVpbnQ4ICpzcmNsaW5lLCAqc3JjY29sOwotCi0Jc3JjbGluZSA9IChVaW50OCAqKWdsX3NoYWRvdzsKLQlzcmNwaXRjaCA9IHN1cmZhY2UtPncgKiBnbF9waXhlbHNpemU7Ci0JZHN0bGluZSA9IHN1cmZhY2UtPnBpeGVsczsKLQlkc3RwaXRjaCA9IHN1cmZhY2UtPnBpdGNoID4+MjsKLQlpZiAoZ2xfdXBzaWRlZG93bikgewotCQlzcmNsaW5lICs9IChzdXJmYWNlLT5oLTEpKnNyY3BpdGNoOwotCQlzcmNwaXRjaCA9IC1zcmNwaXRjaDsKLQl9Ci0KLQlmb3IgKHk9MDsgeTxzdXJmYWNlLT5oOyB5KyspIHsKLQkJc3JjY29sID0gc3JjbGluZTsKLQkJZHN0Y29sID0gZHN0bGluZTsKLQotCQlmb3IgKHg9MDsgeDxzdXJmYWNlLT53OyB4KyspIHsKLQkJCVVpbnQzMglkc3Rjb2xvcjsKLQotCQkJZHN0Y29sb3IgPSAqc3JjY29sKys7Ci0JCQlkc3Rjb2xvciB8PSAoKnNyY2NvbCsrKTw8ODsKLQkJCWRzdGNvbG9yIHw9ICgqc3JjY29sKyspPDwxNjsKLQotCQkJKmRzdGNvbCsrID0gZHN0Y29sb3I7Ci0JCX0KLQotCQlzcmNsaW5lICs9IHNyY3BpdGNoOwotCQlkc3RsaW5lICs9IGRzdHBpdGNoOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlRvQkdSQShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaW50IHgseSwgc3JjcGl0Y2gsIGRzdHBpdGNoOwotCVVpbnQzMiAqZHN0bGluZSwgKmRzdGNvbDsKLQlVaW50OCAqc3JjbGluZSwgKnNyY2NvbDsKLQotCXNyY2xpbmUgPSAoVWludDggKilnbF9zaGFkb3c7Ci0Jc3JjcGl0Y2ggPSBzdXJmYWNlLT53ICogZ2xfcGl4ZWxzaXplOwotCWRzdGxpbmUgPSBzdXJmYWNlLT5waXhlbHM7Ci0JZHN0cGl0Y2ggPSBzdXJmYWNlLT5waXRjaCA+PjI7Ci0JaWYgKGdsX3Vwc2lkZWRvd24pIHsKLQkJc3JjbGluZSArPSAoc3VyZmFjZS0+aC0xKSpzcmNwaXRjaDsKLQkJc3JjcGl0Y2ggPSAtc3JjcGl0Y2g7Ci0JfQotCi0JZm9yICh5PTA7IHk8c3VyZmFjZS0+aDsgeSsrKSB7Ci0JCXNyY2NvbCA9IHNyY2xpbmU7Ci0JCWRzdGNvbCA9IGRzdGxpbmU7Ci0KLQkJZm9yICh4PTA7IHg8c3VyZmFjZS0+dzsgeCsrKSB7Ci0JCQlVaW50MzIJZHN0Y29sb3I7Ci0KLQkJCWRzdGNvbG9yID0gKCpzcmNjb2wrKyk8PDg7Ci0JCQlkc3Rjb2xvciB8PSAoKnNyY2NvbCsrKTw8MTY7Ci0JCQlkc3Rjb2xvciB8PSAoKnNyY2NvbCsrKTw8MjQ7Ci0KLQkJCSpkc3Rjb2wrKyA9IGRzdGNvbG9yOwotCQl9Ci0KLQkJc3JjbGluZSArPSBzcmNwaXRjaDsKLQkJZHN0bGluZSArPSBkc3RwaXRjaDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUb1JHQkEoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWludCB4LHksIHNyY3BpdGNoLCBkc3RwaXRjaDsKLQlVaW50MzIgKmRzdGxpbmUsICpkc3Rjb2w7Ci0JVWludDggKnNyY2xpbmUsICpzcmNjb2w7Ci0KLQlzcmNsaW5lID0gKFVpbnQ4ICopZ2xfc2hhZG93OwotCXNyY3BpdGNoID0gc3VyZmFjZS0+dyAqIGdsX3BpeGVsc2l6ZTsKLQlkc3RsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOwotCWRzdHBpdGNoID0gc3VyZmFjZS0+cGl0Y2ggPj4yOwotCWlmIChnbF91cHNpZGVkb3duKSB7Ci0JCXNyY2xpbmUgKz0gKHN1cmZhY2UtPmgtMSkqc3JjcGl0Y2g7Ci0JCXNyY3BpdGNoID0gLXNyY3BpdGNoOwotCX0KLQotCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgewotCQlzcmNjb2wgPSBzcmNsaW5lOwotCQlkc3Rjb2wgPSBkc3RsaW5lOwotCi0JCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgewotCQkJVWludDMyCWRzdGNvbG9yOwotCi0JCQlkc3Rjb2xvciA9ICgqc3JjY29sKyspPDwyNDsKLQkJCWRzdGNvbG9yIHw9ICgqc3JjY29sKyspPDwxNjsKLQkJCWRzdGNvbG9yIHw9ICgqc3JjY29sKyspPDw4OwotCi0JCQkqZHN0Y29sKysgPSBkc3Rjb2xvcjsKLQkJfQotCi0JCXNyY2xpbmUgKz0gc3JjcGl0Y2g7Ci0JCWRzdGxpbmUgKz0gZHN0cGl0Y2g7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBDb3B5U2hhZG93ODg4OFRvNTU1KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpbnQgeCx5LCBzcmNwaXRjaCwgZHN0cGl0Y2g7Ci0JVWludDE2ICpkc3RsaW5lLCAqZHN0Y29sOwotCVVpbnQzMiAqc3JjbGluZSwgKnNyY2NvbDsKLQotCXNyY2xpbmUgPSAoVWludDMyICopZ2xfc2hhZG93OwotCXNyY3BpdGNoID0gKHN1cmZhY2UtPncgKiBnbF9waXhlbHNpemUpID4+MjsKLQlkc3RsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOwotCWRzdHBpdGNoID0gc3VyZmFjZS0+cGl0Y2ggPj4xOwotCWlmIChnbF91cHNpZGVkb3duKSB7Ci0JCXNyY2xpbmUgKz0gKHN1cmZhY2UtPmgtMSkqc3JjcGl0Y2g7Ci0JCXNyY3BpdGNoID0gLXNyY3BpdGNoOwotCX0KLQotCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgewotCQlzcmNjb2wgPSBzcmNsaW5lOwotCQlkc3Rjb2wgPSBkc3RsaW5lOwotCQlmb3IgKHg9MDsgeDxzdXJmYWNlLT53OyB4KyspIHsKLQkJCVVpbnQzMiBzcmNjb2xvcjsKLQkJCVVpbnQxNiBkc3Rjb2xvcjsKLQkJCQotCQkJc3JjY29sb3IgPSAqc3JjY29sKys7Ci0JCQlkc3Rjb2xvciA9IChzcmNjb2xvcj4+OSkgJiAoMzE8PDEwKTsKLQkJCWRzdGNvbG9yIHw9IChzcmNjb2xvcj4+NikgJiAoMzE8PDUpOwotCQkJZHN0Y29sb3IgfD0gKHNyY2NvbG9yPj4zKSAmIDMxOwotCQkJKmRzdGNvbCsrID0gZHN0Y29sb3I7Ci0JCX0KLQotCQlzcmNsaW5lICs9IHNyY3BpdGNoOwotCQlkc3RsaW5lICs9IGRzdHBpdGNoOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQ29weVNoYWRvdzg4ODhUbzU2NShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaW50IHgseSwgc3JjcGl0Y2gsIGRzdHBpdGNoOwotCVVpbnQxNiAqZHN0bGluZSwgKmRzdGNvbDsKLQlVaW50MzIgKnNyY2xpbmUsICpzcmNjb2w7Ci0KLQlzcmNsaW5lID0gKFVpbnQzMiAqKWdsX3NoYWRvdzsKLQlzcmNwaXRjaCA9IChzdXJmYWNlLT53ICogZ2xfcGl4ZWxzaXplKSA+PiAyOwotCWRzdGxpbmUgPSBzdXJmYWNlLT5waXhlbHM7Ci0JZHN0cGl0Y2ggPSBzdXJmYWNlLT5waXRjaCA+PjE7Ci0JaWYgKGdsX3Vwc2lkZWRvd24pIHsKLQkJc3JjbGluZSArPSAoc3VyZmFjZS0+aC0xKSpzcmNwaXRjaDsKLQkJc3JjcGl0Y2ggPSAtc3JjcGl0Y2g7Ci0JfQotCi0JZm9yICh5PTA7IHk8c3VyZmFjZS0+aDsgeSsrKSB7Ci0JCXNyY2NvbCA9IHNyY2xpbmU7Ci0JCWRzdGNvbCA9IGRzdGxpbmU7Ci0KLQkJZm9yICh4PTA7IHg8c3VyZmFjZS0+dzsgeCsrKSB7Ci0JCQlVaW50MzIgc3JjY29sb3I7Ci0JCQlVaW50MTYgZHN0Y29sb3I7Ci0JCQkKLQkJCXNyY2NvbG9yID0gKnNyY2NvbCsrOwotCQkJZHN0Y29sb3IgPSAoc3JjY29sb3I+PjgpICYgKDMxPDwxMSk7Ci0JCQlkc3Rjb2xvciB8PSAoc3JjY29sb3I+PjUpICYgKDYzPDw1KTsKLQkJCWRzdGNvbG9yIHw9IChzcmNjb2xvcj4+MykgJiAzMTsKLQkJCSpkc3Rjb2wrKyA9IGRzdGNvbG9yOwotCQl9Ci0KLQkJc3JjbGluZSArPSBzcmNwaXRjaDsKLQkJZHN0bGluZSArPSBkc3RwaXRjaDsKLQl9Ci19Ci0KLS8qLS0tIENvbnZlcnNpb25zIHJvdXRpbmVzIGluIHRoZSBzY3JlZW4gLS0tKi8KLQotc3RhdGljIHZvaWQgQ29udmVydE51bGwoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotfQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0NTY1VG81NTViZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaW50IHgseSwgcGl0Y2g7Ci0JdW5zaWduZWQgc2hvcnQgKmxpbmUsICpwaXhlbDsKLQotCWxpbmUgPSBzdXJmYWNlLT5waXhlbHM7Ci0JcGl0Y2ggPSBzdXJmYWNlLT5waXRjaCA+PiAxOwotCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgewotCQlwaXhlbCA9IGxpbmU7Ci0JCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgewotCQkJdW5zaWduZWQgc2hvcnQgY29sb3IgPSAqcGl4ZWw7Ci0KLQkJCSpwaXhlbCsrID0gKGNvbG9yICYgMHgxZil8KChjb2xvcj4+MSkgJiAweGZmZTApOwotCQl9Ci0KLQkJbGluZSArPSBwaXRjaDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnQ1NjVUbzU1NWxlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpbnQgeCx5LCBwaXRjaDsKLQl1bnNpZ25lZCBzaG9ydCAqbGluZSwgKnBpeGVsOwotCi0JbGluZSA9IHN1cmZhY2UtPnBpeGVsczsKLQlwaXRjaCA9IHN1cmZhY2UtPnBpdGNoID4+MTsKLQlmb3IgKHk9MDsgeTxzdXJmYWNlLT5oOyB5KyspIHsKLQkJcGl4ZWwgPSBsaW5lOwotCQlmb3IgKHg9MDsgeDxzdXJmYWNlLT53OyB4KyspIHsKLQkJCXVuc2lnbmVkIHNob3J0IGNvbG9yID0gKnBpeGVsOwotCi0JCQljb2xvciA9IChjb2xvciAmIDB4MWYpfCgoY29sb3I+PjEpICYgMHhmZmUwKTsKLQkJCSpwaXhlbCsrID0gU0RMX1N3YXAxNihjb2xvcik7Ci0JCX0KLQotCQlsaW5lICs9IHBpdGNoOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQ29udmVydDU2NWxlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpbnQgeCx5LCBwaXRjaDsKLQl1bnNpZ25lZCBzaG9ydCAqbGluZSwgKnBpeGVsOwotCi0JbGluZSA9IHN1cmZhY2UtPnBpeGVsczsKLQlwaXRjaCA9IHN1cmZhY2UtPnBpdGNoID4+MTsKLQlmb3IgKHk9MDsgeTxzdXJmYWNlLT5oOyB5KyspIHsKLQkJcGl4ZWwgPSBsaW5lOwotCQlmb3IgKHg9MDsgeDxzdXJmYWNlLT53OyB4KyspIHsKLQkJCXVuc2lnbmVkIHNob3J0IGNvbG9yID0gKnBpeGVsOwotCi0JCQkqcGl4ZWwrKyA9IFNETF9Td2FwMTYoY29sb3IpOwotCQl9Ci0KLQkJbGluZSArPSBwaXRjaDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9BQkdSKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpbnQgeCx5LCBwaXRjaDsKLQl1bnNpZ25lZCBsb25nICpsaW5lLCAqcGl4ZWw7Ci0KLQlsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOwotCXBpdGNoID0gc3VyZmFjZS0+cGl0Y2ggPj4yOwotCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgewotCQlwaXhlbCA9IGxpbmU7Ci0JCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgewotCQkJdW5zaWduZWQgbG9uZyBjb2xvciA9ICpwaXhlbDsKLQotCQkJKnBpeGVsKysgPSAoY29sb3I8PDI0KXwoY29sb3I+PjgpOwotCQl9Ci0KLQkJbGluZSArPSBwaXRjaDsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWdsX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZ2xfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjI2ZDQ0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZ2xfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBBdGFyaSBPU01lc2EubGRnIGltcGxlbWVudGF0aW9uIG9mIFNETCBPcGVuR0wgc3VwcG9ydCAqLwotCi0jaWZuZGVmIF9TRExfQVRBUklHTF9IXwotI2RlZmluZSBfU0RMX0FUQVJJR0xfSF8KLQotI2lmIFNETF9WSURFT19PUEVOR0wKLSNpbmNsdWRlIDxHTC9vc21lc2EuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUyAgIFNETF9WaWRlb0RldmljZSAqdGhpcwotCi1zdHJ1Y3QgU0RMX1ByaXZhdGVHTERhdGEgewotCi0gICAgaW50IGdsX2FjdGl2ZTsgCS8qIHRvIHN0b3Agc3dpdGNoaW5nIGRyaXZlcnMgd2hpbGUgd2UgaGF2ZSBhIHZhbGlkIGNvbnRleHQgKi8KLQkKLQlpbnQgZ2xfb2xkbWVzYTsJLyogT2xkIE9wZW5HTCBzdXBwb3J0ID8gKi8KLQotCWludAlnbF9waXhlbHNpemU7CS8qIGZvciBDb3B5U2hhZG93IGZ1bmN0aW9ucyAqLwotCi0JU0RMX2Jvb2wgZ2xfdXBzaWRlZG93bjsgLyogU29tZSBpbXBsZW1lbnRhdGlvbnMgZHJhdyB1cHNpZGUgZG93biAqLwotCi0JVWludDggKmdsX3NoYWRvdzsJLyogU2hhZG93IGJ1ZmZlciBmb3Igb2xkIGltcGxlbWVudGF0aW9ucyAqLwotCi0JLyogZm9yIHVuc3VwcG9ydGVkIE9TTWVzYSBidWZmZXIgZm9ybWF0cyAqLwotCXZvaWQgKCpDb252ZXJ0U3VyZmFjZSkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsJCi0KLQkvKiB0byBjb252ZXJ0IHRoZSBzaGFkb3cgYnVmZmVyIHRvIHRoZSBzY3JlZW4gZm9ybWF0ICovCi0Jdm9pZCAoKkNvcHlTaGFkb3cpKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CQotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotCU9TTWVzYUNvbnRleHQJY3R4OwotCi0JLyogT3BlbkdMIGZ1bmN0aW9ucyAqLwotCXZvaWQgKCpnbEdldEludGVnZXJ2KSggR0xlbnVtIHBuYW1lLCBHTGludCAqdmFsdWUgKTsKLQl2b2lkICgqZ2xGaW5pc2gpKHZvaWQpOwotCXZvaWQgKCpnbEZsdXNoKSh2b2lkKTsKLQotCS8qIG9zbWVzYS5sZGcgKi8KLQlPU01lc2FDb250ZXh0ICgqT1NNZXNhQ3JlYXRlQ29udGV4dEV4dCkoIEdMZW51bSBmb3JtYXQsIEdMaW50IGRlcHRoQml0cywgR0xpbnQgc3RlbmNpbEJpdHMsIEdMaW50IGFjY3VtQml0cywgT1NNZXNhQ29udGV4dCBzaGFyZWxpc3QpOwotCXZvaWQgKCpPU01lc2FEZXN0cm95Q29udGV4dCkoIE9TTWVzYUNvbnRleHQgY3R4ICk7Ci0JR0xib29sZWFuICgqT1NNZXNhTWFrZUN1cnJlbnQpKCBPU01lc2FDb250ZXh0IGN0eCwgdm9pZCAqYnVmZmVyLCBHTGVudW0gdHlwZSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKTsKLQl2b2lkICgqT1NNZXNhUGl4ZWxTdG9yZSkoIEdMaW50IHBuYW1lLCBHTGludCB2YWx1ZSApOwotCXZvaWQgKiAoKk9TTWVzYUdldFByb2NBZGRyZXNzKSggY29uc3QgY2hhciAqZnVuY05hbWUgKTsKLQotCS8qIG1lc2FfZ2wubGRnLCB0aW55X2dsLmxkZyAqLwotCXZvaWQgKigqT1NNZXNhQ3JlYXRlTERHKSggbG9uZyBmb3JtYXQsIGxvbmcgdHlwZSwgbG9uZyB3aWR0aCwgbG9uZyBoZWlnaHQgKTsKLQl2b2lkICgqT1NNZXNhRGVzdHJveUxERykodm9pZCk7Ci0KLQkvKiBJbmZvIG5lZWRlZCB0byBjb21wYXJlIGV4aXN0aW5nIGNvbnRleHQgd2l0aCBuZXcgYXNrZWQgb25lICovCi0JaW50IHdpZHRoLCBoZWlnaHQ7Ci0JR0xlbnVtIGZvcm1hdDsKLQlHTGludCBkZXB0aCxzdGVuY2lsLGFjY3VtOwotI2VuZGlmCi19OwotCi0vKiBWYXJpYWJsZSBuYW1lcyAqLwotI2RlZmluZSBnbF9hY3RpdmUJCSh0aGlzLT5nbF9kYXRhLT5nbF9hY3RpdmUpCi0jZGVmaW5lIGdsX2N0eAkJCSh0aGlzLT5nbF9kYXRhLT5jdHgpCi0jZGVmaW5lIGdsX29sZG1lc2EJCSh0aGlzLT5nbF9kYXRhLT5nbF9vbGRtZXNhKQotI2RlZmluZSBnbF9waXhlbHNpemUJKHRoaXMtPmdsX2RhdGEtPmdsX3BpeGVsc2l6ZSkKLSNkZWZpbmUgZ2xfdXBzaWRlZG93bgkodGhpcy0+Z2xfZGF0YS0+Z2xfdXBzaWRlZG93bikKLSNkZWZpbmUgZ2xfc2hhZG93CQkodGhpcy0+Z2xfZGF0YS0+Z2xfc2hhZG93KQotI2RlZmluZSBnbF9jb252ZXJ0CQkodGhpcy0+Z2xfZGF0YS0+Q29udmVydFN1cmZhY2UpCi0jZGVmaW5lIGdsX2NvcHlzaGFkb3cJKHRoaXMtPmdsX2RhdGEtPkNvcHlTaGFkb3cpCi0jZGVmaW5lIGdsX2N1cmZvcm1hdAkodGhpcy0+Z2xfZGF0YS0+Zm9ybWF0KQotI2RlZmluZSBnbF9jdXJkZXB0aAkJKHRoaXMtPmdsX2RhdGEtPmRlcHRoKQotI2RlZmluZSBnbF9jdXJzdGVuY2lsCSh0aGlzLT5nbF9kYXRhLT5zdGVuY2lsKQotI2RlZmluZSBnbF9jdXJhY2N1bQkJKHRoaXMtPmdsX2RhdGEtPmFjY3VtKQotI2RlZmluZSBnbF9jdXJ3aWR0aAkJKHRoaXMtPmdsX2RhdGEtPndpZHRoKQotI2RlZmluZSBnbF9jdXJoZWlnaHQJKHRoaXMtPmdsX2RhdGEtPmhlaWdodCkKLQotLyogT3BlbkdMIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCBTRExfQXRhcmlHTF9Jbml0KF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCk7Ci1leHRlcm4gdm9pZCBTRExfQXRhcmlHTF9RdWl0KF9USElTLCBTRExfYm9vbCB1bmxvYWQpOwotZXh0ZXJuIHZvaWQgU0RMX0F0YXJpR0xfSW5pdFBvaW50ZXJzKF9USElTKTsKLQotZXh0ZXJuIGludCBTRExfQXRhcmlHTF9Mb2FkTGlicmFyeShfVEhJUywgY29uc3QgY2hhciAqcGF0aCk7Ci1leHRlcm4gdm9pZCAqU0RMX0F0YXJpR0xfR2V0UHJvY0FkZHJlc3MoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpOwotZXh0ZXJuIGludCBTRExfQXRhcmlHTF9HZXRBdHRyaWJ1dGUoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKTsKLWV4dGVybiBpbnQgU0RMX0F0YXJpR0xfTWFrZUN1cnJlbnQoX1RISVMpOwotZXh0ZXJuIHZvaWQgU0RMX0F0YXJpR0xfU3dhcEJ1ZmZlcnMoX1RISVMpOwotCi0jZW5kaWYgLyogX1NETF9BVEFSSUdMX0hfICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWtleXMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpa2V5cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWVlZTVhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpa2V5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qCi0gKglBdGFyaSBTY2FuY29kZSBkZWZpbml0aW9ucwotICoKLSAqCVBhdHJpY2UgTWFuZGluCi0gKi8KLQotI2lmbmRlZiBfU0RMX0FUQVJJS0VZU19IXwotI2RlZmluZSBfU0RMX0FUQVJJS0VZU19IXyAKLQotLyogLS0tIEtleWJvYXJkIHNjYW5jb2RlcyAtLS0gKi8KLS8qIHRha2VuIGZyb20gc3ZnYWxpYi92Z2FrZXlib2FyZC5oICovCi0KLSNkZWZpbmUgU0NBTkNPREVfRVNDQVBFCQkweDAxCi0jZGVmaW5lIFNDQU5DT0RFXzEJCTB4MDIKLSNkZWZpbmUgU0NBTkNPREVfMgkJMHgwMwotI2RlZmluZSBTQ0FOQ09ERV8zCQkweDA0Ci0jZGVmaW5lIFNDQU5DT0RFXzQJCTB4MDUKLSNkZWZpbmUgU0NBTkNPREVfNQkJMHgwNgotI2RlZmluZSBTQ0FOQ09ERV82CQkweDA3Ci0jZGVmaW5lIFNDQU5DT0RFXzcJCTB4MDgKLSNkZWZpbmUgU0NBTkNPREVfOAkJMHgwOQotI2RlZmluZSBTQ0FOQ09ERV85CQkweDBhCi0jZGVmaW5lIFNDQU5DT0RFXzAJCTB4MGIKLSNkZWZpbmUgU0NBTkNPREVfTUlOVVMJCTB4MGMKLSNkZWZpbmUgU0NBTkNPREVfRVFVQUwJCTB4MGQKLSNkZWZpbmUgU0NBTkNPREVfQkFDS1NQQUNFCTB4MGUKLQotI2RlZmluZSBTQ0FOQ09ERV9UQUIJCTB4MGYKLSNkZWZpbmUgU0NBTkNPREVfUQkJMHgxMAotI2RlZmluZSBTQ0FOQ09ERV9XCQkweDExCi0jZGVmaW5lIFNDQU5DT0RFX0UJCTB4MTIKLSNkZWZpbmUgU0NBTkNPREVfUgkJMHgxMwotI2RlZmluZSBTQ0FOQ09ERV9UCQkweDE0Ci0jZGVmaW5lIFNDQU5DT0RFX1kJCTB4MTUKLSNkZWZpbmUgU0NBTkNPREVfVQkJMHgxNgotI2RlZmluZSBTQ0FOQ09ERV9JCQkweDE3Ci0jZGVmaW5lIFNDQU5DT0RFX08JCTB4MTgKLSNkZWZpbmUgU0NBTkNPREVfUAkJMHgxOQotI2RlZmluZSBTQ0FOQ09ERV9CUkFDS0VUX0xFRlQJMHgxYQotI2RlZmluZSBTQ0FOQ09ERV9CUkFDS0VUX1JJR0hUCTB4MWIKLSNkZWZpbmUgU0NBTkNPREVfRU5URVIJCTB4MWMKLSNkZWZpbmUgU0NBTkNPREVfREVMRVRFCQkweDUzCi0KLSNkZWZpbmUgU0NBTkNPREVfTEVGVENPTlRST0wJMHgxZAotI2RlZmluZSBTQ0FOQ09ERV9BCQkweDFlCi0jZGVmaW5lIFNDQU5DT0RFX1MJCTB4MWYKLSNkZWZpbmUgU0NBTkNPREVfRAkJMHgyMAotI2RlZmluZSBTQ0FOQ09ERV9GCQkweDIxCi0jZGVmaW5lIFNDQU5DT0RFX0cJCTB4MjIKLSNkZWZpbmUgU0NBTkNPREVfSAkJMHgyMwotI2RlZmluZSBTQ0FOQ09ERV9KCQkweDI0Ci0jZGVmaW5lIFNDQU5DT0RFX0sJCTB4MjUKLSNkZWZpbmUgU0NBTkNPREVfTAkJMHgyNgotI2RlZmluZSBTQ0FOQ09ERV9TRU1JQ09MT04JMHgyNwotI2RlZmluZSBTQ0FOQ09ERV9BUE9TVFJPUEhFCTB4MjgKLSNkZWZpbmUgU0NBTkNPREVfR1JBVkUJCTB4MjkKLQotI2RlZmluZSBTQ0FOQ09ERV9MRUZUU0hJRlQJMHgyYQotI2RlZmluZSBTQ0FOQ09ERV9CQUNLU0xBU0gJMHgyYgotI2RlZmluZSBTQ0FOQ09ERV9aCQkweDJjCi0jZGVmaW5lIFNDQU5DT0RFX1gJCTB4MmQKLSNkZWZpbmUgU0NBTkNPREVfQwkJMHgyZQotI2RlZmluZSBTQ0FOQ09ERV9WCQkweDJmCi0jZGVmaW5lIFNDQU5DT0RFX0IJCTB4MzAKLSNkZWZpbmUgU0NBTkNPREVfTgkJMHgzMQotI2RlZmluZSBTQ0FOQ09ERV9NCQkweDMyCi0jZGVmaW5lIFNDQU5DT0RFX0NPTU1BCQkweDMzCi0jZGVmaW5lIFNDQU5DT0RFX1BFUklPRAkJMHgzNAotI2RlZmluZSBTQ0FOQ09ERV9TTEFTSAkJMHgzNQotI2RlZmluZSBTQ0FOQ09ERV9SSUdIVFNISUZUCTB4MzYKLQotI2RlZmluZSBTQ0FOQ09ERV9MRUZUQUxUCTB4MzgKLSNkZWZpbmUgU0NBTkNPREVfU1BBQ0UJCTB4MzkKLSNkZWZpbmUgU0NBTkNPREVfQ0FQU0xPQ0sJMHgzYQotCi0vKiBGdW5jdGlvbnMga2V5cyAqLwotI2RlZmluZSBTQ0FOQ09ERV9GMQkJMHgzYgotI2RlZmluZSBTQ0FOQ09ERV9GMgkJMHgzYwotI2RlZmluZSBTQ0FOQ09ERV9GMwkJMHgzZAotI2RlZmluZSBTQ0FOQ09ERV9GNAkJMHgzZQotI2RlZmluZSBTQ0FOQ09ERV9GNQkJMHgzZgotI2RlZmluZSBTQ0FOQ09ERV9GNgkJMHg0MAotI2RlZmluZSBTQ0FOQ09ERV9GNwkJMHg0MQotI2RlZmluZSBTQ0FOQ09ERV9GOAkJMHg0MgotI2RlZmluZSBTQ0FOQ09ERV9GOQkJMHg0MwotI2RlZmluZSBTQ0FOQ09ERV9GMTAJMHg0NAotCi0vKiBOdW1lcmljIGtleXBhZCAqLwotI2RlZmluZSBTQ0FOQ09ERV9LUDAJCQkweDcwCi0jZGVmaW5lIFNDQU5DT0RFX0tQMQkJCTB4NmQKLSNkZWZpbmUgU0NBTkNPREVfS1AyCQkJMHg2ZQotI2RlZmluZSBTQ0FOQ09ERV9LUDMJCQkweDZmCi0jZGVmaW5lIFNDQU5DT0RFX0tQNAkJCTB4NmEKLSNkZWZpbmUgU0NBTkNPREVfS1A1CQkJMHg2YgotI2RlZmluZSBTQ0FOQ09ERV9LUDYJCQkweDZjCi0jZGVmaW5lIFNDQU5DT0RFX0tQNwkJCTB4NjcKLSNkZWZpbmUgU0NBTkNPREVfS1A4CQkJMHg2OAotI2RlZmluZSBTQ0FOQ09ERV9LUDkJCQkweDY5Ci0jZGVmaW5lIFNDQU5DT0RFX0tQX1BFUklPRAkJMHg3MQotI2RlZmluZSBTQ0FOQ09ERV9LUF9ESVZJREUJCTB4NjUKLSNkZWZpbmUgU0NBTkNPREVfS1BfTVVMVElQTFkJMHg2NgotI2RlZmluZSBTQ0FOQ09ERV9LUF9NSU5VUwkJMHg0YQotI2RlZmluZSBTQ0FOQ09ERV9LUF9QTFVTCQkweDRlCi0jZGVmaW5lIFNDQU5DT0RFX0tQX0VOVEVSCQkweDcyCi0jZGVmaW5lIFNDQU5DT0RFX0tQX0xFRlRQQVJFTgkweDYzCi0jZGVmaW5lIFNDQU5DT0RFX0tQX1JJR0hUUEFSRU4JMHg2NAotCi0vKiBDdXJzb3Iga2V5cGFkICovCi0jZGVmaW5lIFNDQU5DT0RFX0hFTFAJCTB4NjIKLSNkZWZpbmUgU0NBTkNPREVfVU5ETwkJMHg2MQotI2RlZmluZSBTQ0FOQ09ERV9JTlNFUlQJCTB4NTIKLSNkZWZpbmUgU0NBTkNPREVfQ0xSSE9NRQkweDQ3Ci0jZGVmaW5lIFNDQU5DT0RFX1VQCQkJMHg0OAotI2RlZmluZSBTQ0FOQ09ERV9ET1dOCQkweDUwCi0jZGVmaW5lIFNDQU5DT0RFX1JJR0hUCQkweDRkCi0jZGVmaW5lIFNDQU5DT0RFX0xFRlQJCTB4NGIKLQotI2VuZGlmIC8qIF9TRExfQVRBUklLRVlTX0hfICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaW14YWxsb2MuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZiNWFlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gKglNZW1vcnkgYWxsb2NhdGlvbgotICoKLSAqCVBhdHJpY2UgTWFuZGluCi0gKi8KLQotI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+Ci0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0KLS8qLS0tIFZhcmlhYmxlcyAtLS0qLwotCi1zdGF0aWMgaW50IGF0YXJpX214YWxsb2NfYXZhaWw9LTE7Ci0KLS8qLS0tIEZ1bmN0aW9ucyAtLS0qLwotCi12b2lkICpBdGFyaV9TeXNNYWxsb2MoVWludDMyIHNpemUsIFVpbnQxNiBhbGxvY190eXBlKQotewotCS8qIFRlc3QgaWYgTXhhbGxvYygpIGF2YWlsYWJsZSAqLwotCWlmIChhdGFyaV9teGFsbG9jX2F2YWlsPDApIHsKLQkJYXRhcmlfbXhhbGxvY19hdmFpbCA9ICgoU3ZlcnNpb24oKSYweEZGKT49MHgwMSkgfCAoU3ZlcnNpb24oKT49MHgxOTAwKTsKLQl9Ci0KLQlpZiAoYXRhcmlfbXhhbGxvY19hdmFpbCkgewotCQlyZXR1cm4gKHZvaWQgKikgTXhhbGxvYyhzaXplLCBhbGxvY190eXBlKTsKLQl9IGVsc2UgeyBcCi0JCXJldHVybiAodm9pZCAqKSBNYWxsb2Moc2l6ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlteGFsbG9jX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvY19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZTZlMWEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlteGFsbG9jX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICoJTWVtb3J5IGFsbG9jYXRpb24KLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLSNpZm5kZWYgX1NETF9BVEFSSV9NWEFMTE9DX0hfCi0jZGVmaW5lIF9TRExfQVRBUklfTVhBTExPQ19IXwotCi0vKi0tLSBEZWZpbmVzIC0tLSovCi0KLS8qIE14YWxsb2MgcGFyYW1ldGVycyAqLwotI2RlZmluZSBNWF9TVFJBTSAwCi0jZGVmaW5lIE1YX1RUUkFNIDEKLSNkZWZpbmUgTVhfUFJFRlNUUkFNIDIKLSNkZWZpbmUgTVhfUFJFRlRUUkFNIDMKLQotLyotLS0gRnVuY3Rpb25zIC0tLSovCi0KLWV4dGVybiB2b2lkICpBdGFyaV9TeXNNYWxsb2MoVWludDMyIHNpemUsIFVpbnQxNiBhbGxvY190eXBlKTsKLQotI2VuZGlmIC8qIF9TRExfQVRBUklfTVhBTExPQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYmlvc2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYmlvc2V2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRmMWUxLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2Jpb3NldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAqCUF0YXJpIGtleWJvYXJkIGV2ZW50cyBtYW5hZ2VyLCB1c2luZyBCSU9TCi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0vKiBNaW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KLSNpbmNsdWRlIDxtaW50L2Nvb2tpZS5oPgotCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0KLSNpbmNsdWRlICJTRExfYXRhcmlrZXlzLmgiCi0jaW5jbHVkZSAiU0RMX2F0YXJpZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfeGJpb3NldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9hdGFyaWRldm1vdXNlX2MuaCIKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYmlvc19jdXJyZW50a2V5Ym9hcmRbQVRBUklCSU9TX01BWEtFWVNdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgYmlvc19wcmV2aW91c2tleWJvYXJkW0FUQVJJQklPU19NQVhLRVlTXTsKLXN0YXRpYyBTRExfYm9vbCB1c2VfZGV2X21vdXNlID0gU0RMX0ZBTFNFOwotCi1zdGF0aWMgdm9pZCBVcGRhdGVTcGVjaWFsS2V5cyhpbnQgc3BlY2lhbF9rZXlzX3N0YXRlKTsKLQotdm9pZCBBdGFyaUJpb3NfSW5pdE9TS2V5bWFwKF9USElTKQotewotCWludCBpLCB2ZWN0b3JzX21hc2s7Ci0JdW5zaWduZWQgbG9uZyBkdW1teTsKLQotCVNETF9tZW1zZXQoYmlvc19jdXJyZW50a2V5Ym9hcmQsIDAsIHNpemVvZihiaW9zX2N1cnJlbnRrZXlib2FyZCkpOwotCVNETF9tZW1zZXQoYmlvc19wcmV2aW91c2tleWJvYXJkLCAwLCBzaXplb2YoYmlvc19wcmV2aW91c2tleWJvYXJkKSk7Ci0KLQl1c2VfZGV2X21vdXNlID0gKFNETF9BdGFyaURldk1vdXNlX09wZW4oKSE9MCkgPyBTRExfVFJVRSA6IFNETF9GQUxTRTsKLQotCXZlY3RvcnNfbWFzayA9IEFUQVJJX1hCSU9TX0pPWVNUSUNLRVZFTlRTOwkvKiBYQklPUyBqb3lzdGljayBldmVudHMgKi8KLQlpZiAoIXVzZV9kZXZfbW91c2UpIHsKLQkJdmVjdG9yc19tYXNrIHw9IEFUQVJJX1hCSU9TX01PVVNFRVZFTlRTOwkvKiBYQklPUyBtb3VzZSBldmVudHMgKi8KLQl9Ci0vKglpZiAoR2V0Y29va2llKENfTWlOVCwgJmR1bW15KT09Q19GT1VORCkgewotCQl2ZWN0b3JzX21hc2sgPSAwOwotCX0qLwotCi0JU0RMX0F0YXJpWGJpb3NfSW5zdGFsbFZlY3RvcnModmVjdG9yc19tYXNrKTsKLX0KLQotdm9pZCBBdGFyaUJpb3NfUHVtcEV2ZW50cyhfVEhJUykKLXsKLQlpbnQgaTsKLQlTRExfa2V5c3ltIGtleXN5bTsKLQotCS8qIFVwZGF0ZSBwcmVzc2VkIGtleXMgKi8KLQlTRExfbWVtc2V0KGJpb3NfY3VycmVudGtleWJvYXJkLCAwLCBBVEFSSUJJT1NfTUFYS0VZUyk7Ci0KLQl3aGlsZSAoQmNvbnN0YXQoX0NPTikpIHsKLQkJdW5zaWduZWQgbG9uZyBrZXlfcHJlc3NlZDsKLQkJa2V5X3ByZXNzZWQ9QmNvbmluKF9DT04pOwotCQliaW9zX2N1cnJlbnRrZXlib2FyZFsoa2V5X3ByZXNzZWQ+PjE2KSYoQVRBUklCSU9TX01BWEtFWVMtMSldPTB4RkY7Ci0JfQotCi0JLyogUmVhZCBzcGVjaWFsIGtleXMgKi8KLQlVcGRhdGVTcGVjaWFsS2V5cyhLYnNoaWZ0KC0xKSk7Ci0KLQkvKiBOb3cgZ2VuZXJhdGUgZXZlbnRzICovCi0JZm9yIChpPTA7IGk8QVRBUklCSU9TX01BWEtFWVM7IGkrKykgewotCQkvKiBLZXkgcHJlc3NlZCA/ICovCi0JCWlmIChiaW9zX2N1cnJlbnRrZXlib2FyZFtpXSAmJiAhYmlvc19wcmV2aW91c2tleWJvYXJkW2ldKQotCQkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwKLQkJCQlTRExfQXRhcmlfVHJhbnNsYXRlS2V5KGksICZrZXlzeW0sIFNETF9UUlVFKSk7Ci0JCQkKLQkJLyogS2V5IHVucHJlc3NlZCA/ICovCi0JCWlmIChiaW9zX3ByZXZpb3Vza2V5Ym9hcmRbaV0gJiYgIWJpb3NfY3VycmVudGtleWJvYXJkW2ldKQotCQkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsCi0JCQkJU0RMX0F0YXJpX1RyYW5zbGF0ZUtleShpLCAma2V5c3ltLCBTRExfRkFMU0UpKTsKLQl9Ci0KLQlpZiAodXNlX2Rldl9tb3VzZSkgewotCQlTRExfQXRhcmlEZXZNb3VzZV9Qb3N0TW91c2VFdmVudHModGhpcywgU0RMX1RSVUUpOwotCX0gZWxzZSB7Ci0JCVNETF9BdGFyaVhiaW9zX1Bvc3RNb3VzZUV2ZW50cyh0aGlzLCBTRExfVFJVRSk7Ci0JfQotCi0JLyogV2lsbCBiZSBwcmV2aW91cyB0YWJsZSAqLwotCVNETF9tZW1jcHkoYmlvc19wcmV2aW91c2tleWJvYXJkLCBiaW9zX2N1cnJlbnRrZXlib2FyZCwgc2l6ZW9mKGJpb3NfcHJldmlvdXNrZXlib2FyZCkpOwotfQotCi1zdGF0aWMgdm9pZCBVcGRhdGVTcGVjaWFsS2V5cyhpbnQgc3BlY2lhbF9rZXlzX3N0YXRlKQotewotI2RlZmluZSBVUERBVEVfU1BFQ0lBTF9LRVlTKG51bWJpdCxzY2FuY29kZSkgXAotCXsJXAotCQlpZiAoc3BlY2lhbF9rZXlzX3N0YXRlICYgKDE8PChudW1iaXQpKSkgeyBcCi0JCQliaW9zX2N1cnJlbnRrZXlib2FyZFtzY2FuY29kZV09MHhGRjsgXAotCQl9CVwKLQl9Ci0KLQlVUERBVEVfU1BFQ0lBTF9LRVlTKEtfUlNISUZULCBTQ0FOQ09ERV9SSUdIVFNISUZUKTsKLQlVUERBVEVfU1BFQ0lBTF9LRVlTKEtfTFNISUZULCBTQ0FOQ09ERV9MRUZUU0hJRlQpOwotCVVQREFURV9TUEVDSUFMX0tFWVMoS19DVFJMLCBTQ0FOQ09ERV9MRUZUQ09OVFJPTCk7Ci0JVVBEQVRFX1NQRUNJQUxfS0VZUyhLX0FMVCwgU0NBTkNPREVfTEVGVEFMVCk7Ci0JVVBEQVRFX1NQRUNJQUxfS0VZUyhLX0NBUFNMT0NLLCBTQ0FOQ09ERV9DQVBTTE9DSyk7Ci19Ci0KLXZvaWQgQXRhcmlCaW9zX1NodXRkb3duRXZlbnRzKHZvaWQpCi17Ci0JU0RMX0F0YXJpWGJpb3NfUmVzdG9yZVZlY3RvcnMoKTsKLQlpZiAodXNlX2Rldl9tb3VzZSkgewotCQlTRExfQXRhcmlEZXZNb3VzZV9DbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2Jpb3NldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYmlvc2V2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxN2VjZjAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYmlvc2V2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAqCUF0YXJpIGtleWJvYXJkIGV2ZW50cyBtYW5hZ2VyLCB1c2luZyBCSU9TCi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0jaWZuZGVmIF9TRExfQVRBUklfQklPU0VWRU5UU19IXwotI2RlZmluZSBfU0RMX0FUQVJJX0JJT1NFVkVOVFNfSF8KLQotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0KLWV4dGVybiB2b2lkIEF0YXJpQmlvc19Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgQXRhcmlCaW9zX1B1bXBFdmVudHMoX1RISVMpOwotZXh0ZXJuIHZvaWQgQXRhcmlCaW9zX1NodXRkb3duRXZlbnRzKHZvaWQpOwotCi0jZW5kaWYgLyogX1NETF9BVEFSSV9CSU9TRVZFTlRTX0hfICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9nZW1kb3NldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2dlbWRvc2V2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OThkZmY3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2dlbWRvc2V2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICoJQXRhcmkga2V5Ym9hcmQgZXZlbnRzIG1hbmFnZXIsIHVzaW5nIEdlbWRvcwotICoKLSAqCVBhdHJpY2UgTWFuZGluCi0gKi8KLQotLyogTWludCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+Ci0jaW5jbHVkZSA8bWludC9jb29raWUuaD4KLQotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotCi0jaW5jbHVkZSAiU0RMX2F0YXJpa2V5cy5oIgotI2luY2x1ZGUgIlNETF9hdGFyaWV2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3hiaW9zZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfYXRhcmlkZXZtb3VzZV9jLmgiCi0KLS8qIFRvIHNhdmUgc3RhdGUgb2Yga2V5Ym9hcmQgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2VtZG9zX2N1cnJlbnRrZXlib2FyZFtBVEFSSUJJT1NfTUFYS0VZU107Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBnZW1kb3NfcHJldmlvdXNrZXlib2FyZFtBVEFSSUJJT1NfTUFYS0VZU107Ci1zdGF0aWMgU0RMX2Jvb2wgdXNlX2Rldl9tb3VzZSA9IFNETF9GQUxTRTsKLQotZW51bSB7Ci0JREVWX0JVU1k9MCwKLQlERVZfUkVBRFkKLX07Ci0KLXN0YXRpYyB2b2lkIFVwZGF0ZVNwZWNpYWxLZXlzKGludCBzcGVjaWFsX2tleXNfc3RhdGUpOwotCi12b2lkIEF0YXJpR2VtZG9zX0luaXRPU0tleW1hcChfVEhJUykKLXsKLQlpbnQgaSwgdmVjdG9yc19tYXNrOwotCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0KLQlTRExfbWVtc2V0KGdlbWRvc19jdXJyZW50a2V5Ym9hcmQsIDAsIHNpemVvZihnZW1kb3NfY3VycmVudGtleWJvYXJkKSk7Ci0JU0RMX21lbXNldChnZW1kb3NfcHJldmlvdXNrZXlib2FyZCwgMCwgc2l6ZW9mKGdlbWRvc19wcmV2aW91c2tleWJvYXJkKSk7Ci0KLQl1c2VfZGV2X21vdXNlID0gKFNETF9BdGFyaURldk1vdXNlX09wZW4oKSE9MCkgPyBTRExfVFJVRSA6IFNETF9GQUxTRTsKLQotCXZlY3RvcnNfbWFzayA9IEFUQVJJX1hCSU9TX0pPWVNUSUNLRVZFTlRTOwkvKiBYQklPUyBqb3lzdGljayBldmVudHMgKi8KLQlpZiAoIXVzZV9kZXZfbW91c2UpIHsKLQkJdmVjdG9yc19tYXNrIHw9IEFUQVJJX1hCSU9TX01PVVNFRVZFTlRTOwkvKiBYQklPUyBtb3VzZSBldmVudHMgKi8KLQl9Ci0vKglpZiAoR2V0Y29va2llKENfTWlOVCwgJmR1bW15KT09Q19GT1VORCkgewotCQl2ZWN0b3JzX21hc2sgPSAwOwotCX0qLwotCVNETF9BdGFyaVhiaW9zX0luc3RhbGxWZWN0b3JzKHZlY3RvcnNfbWFzayk7Ci19Ci0KLXZvaWQgQXRhcmlHZW1kb3NfUHVtcEV2ZW50cyhfVEhJUykKLXsKLQlpbnQgaTsKLQlTRExfa2V5c3ltIGtleXN5bTsKLQotCS8qIFVwZGF0ZSBwcmVzc2VkIGtleXMgKi8KLQlTRExfbWVtc2V0KGdlbWRvc19jdXJyZW50a2V5Ym9hcmQsIDAsIEFUQVJJQklPU19NQVhLRVlTKTsKLQotCXdoaWxlIChDY29uaXMoKSE9REVWX0JVU1kpIHsKLQkJdW5zaWduZWQgbG9uZyBrZXlfcHJlc3NlZDsKLQkJa2V5X3ByZXNzZWQ9Q25lY2luKCk7Ci0JCWdlbWRvc19jdXJyZW50a2V5Ym9hcmRbKGtleV9wcmVzc2VkPj4xNikmKEFUQVJJQklPU19NQVhLRVlTLTEpXT0weEZGOwotCX0KLQotCS8qIFJlYWQgc3BlY2lhbCBrZXlzICovCi0JVXBkYXRlU3BlY2lhbEtleXMoS2JzaGlmdCgtMSkpOwotCi0JLyogTm93IGdlbmVyYXRlIGV2ZW50cyAqLwotCWZvciAoaT0wOyBpPEFUQVJJQklPU19NQVhLRVlTOyBpKyspIHsKLQkJLyogS2V5IHByZXNzZWQgPyAqLwotCQlpZiAoZ2VtZG9zX2N1cnJlbnRrZXlib2FyZFtpXSAmJiAhZ2VtZG9zX3ByZXZpb3Vza2V5Ym9hcmRbaV0pCi0JCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELAotCQkJCVNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaSwgJmtleXN5bSwgU0RMX1RSVUUpKTsKLQkJCQotCQkvKiBLZXkgdW5wcmVzc2VkID8gKi8KLQkJaWYgKGdlbWRvc19wcmV2aW91c2tleWJvYXJkW2ldICYmICFnZW1kb3NfY3VycmVudGtleWJvYXJkW2ldKQotCQkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsCi0JCQkJU0RMX0F0YXJpX1RyYW5zbGF0ZUtleShpLCAma2V5c3ltLCBTRExfRkFMU0UpKTsKLQl9Ci0KLQlpZiAodXNlX2Rldl9tb3VzZSkgewotCQlTRExfQXRhcmlEZXZNb3VzZV9Qb3N0TW91c2VFdmVudHModGhpcywgU0RMX1RSVUUpOwotCX0gZWxzZSB7Ci0JCVNETF9BdGFyaVhiaW9zX1Bvc3RNb3VzZUV2ZW50cyh0aGlzLCBTRExfVFJVRSk7Ci0JfQotCi0JLyogV2lsbCBiZSBwcmV2aW91cyB0YWJsZSAqLwotCVNETF9tZW1jcHkoZ2VtZG9zX3ByZXZpb3Vza2V5Ym9hcmQsIGdlbWRvc19jdXJyZW50a2V5Ym9hcmQsIHNpemVvZihnZW1kb3NfcHJldmlvdXNrZXlib2FyZCkpOwotfQotCi1zdGF0aWMgdm9pZCBVcGRhdGVTcGVjaWFsS2V5cyhpbnQgc3BlY2lhbF9rZXlzX3N0YXRlKQotewotI2RlZmluZSBVUERBVEVfU1BFQ0lBTF9LRVlTKG51bWJpdCxzY2FuY29kZSkgXAotCXsJXAotCQlpZiAoc3BlY2lhbF9rZXlzX3N0YXRlICYgKDE8PChudW1iaXQpKSkgeyBcCi0JCQlnZW1kb3NfY3VycmVudGtleWJvYXJkW3NjYW5jb2RlXT0weEZGOyBcCi0JCX0JXAotCX0KLQotCVVQREFURV9TUEVDSUFMX0tFWVMoS19SU0hJRlQsIFNDQU5DT0RFX1JJR0hUU0hJRlQpOwotCVVQREFURV9TUEVDSUFMX0tFWVMoS19MU0hJRlQsIFNDQU5DT0RFX0xFRlRTSElGVCk7Ci0JVVBEQVRFX1NQRUNJQUxfS0VZUyhLX0NUUkwsIFNDQU5DT0RFX0xFRlRDT05UUk9MKTsKLQlVUERBVEVfU1BFQ0lBTF9LRVlTKEtfQUxULCBTQ0FOQ09ERV9MRUZUQUxUKTsKLQlVUERBVEVfU1BFQ0lBTF9LRVlTKEtfQ0FQU0xPQ0ssIFNDQU5DT0RFX0NBUFNMT0NLKTsKLX0KLQotdm9pZCBBdGFyaUdlbWRvc19TaHV0ZG93bkV2ZW50cyh2b2lkKQotewotCVNETF9BdGFyaVhiaW9zX1Jlc3RvcmVWZWN0b3JzKCk7Ci0JaWYgKHVzZV9kZXZfbW91c2UpIHsKLQkJU0RMX0F0YXJpRGV2TW91c2VfQ2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9nZW1kb3NldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfZ2VtZG9zZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1ZDlkNi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9nZW1kb3NldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gKglBdGFyaSBrZXlib2FyZCBldmVudHMgbWFuYWdlciwgdXNpbmcgR2VtZG9zCi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0jaWZuZGVmIF9TRExfQVRBUklfR0VNRE9TRVZFTlRTX0hfCi0jZGVmaW5lIF9TRExfQVRBUklfR0VNRE9TRVZFTlRTX0hfCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi1leHRlcm4gdm9pZCBBdGFyaUdlbWRvc19Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgQXRhcmlHZW1kb3NfUHVtcEV2ZW50cyhfVEhJUyk7Ci1leHRlcm4gdm9pZCBBdGFyaUdlbWRvc19TaHV0ZG93bkV2ZW50cyh2b2lkKTsKLQotI2VuZGlmIC8qIF9TRExfQVRBUklfR0VNRE9TRVZFTlRTX0hfICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9pa2JkZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9pa2JkZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYTc2NjAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGV2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICoJQXRhcmkga2V5Ym9hcmQgZXZlbnRzIG1hbmFnZXIsIHVzaW5nIGhhcmR3YXJlIElLQkQKLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLS8qIE1pbnQgaW5jbHVkZXMgKi8KLSNpbmNsdWRlIDxtaW50L29zYmluZC5oPgotCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0KLSNpbmNsdWRlICJTRExfYXRhcmlrZXlzLmgiCi0jaW5jbHVkZSAiU0RMX2F0YXJpZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfaWtiZGludGVycnVwdF9zLmgiCi0KLSNkZWZpbmUgS0VZX1BSRVNTRUQJCTB4ZmYKLSNkZWZpbmUgS0VZX1VOREVGSU5FRAkweDgwCi0jZGVmaW5lIEtFWV9SRUxFQVNFRAkweDAwCi0KLXN0YXRpYyBVaW50MTYgYXRhcmlfcHJldm1vdXNlYjsJLyogc2F2ZSBzdGF0ZSBvZiBtb3VzZSBidXR0b25zICovCi0KLXZvaWQgQXRhcmlJa2JkX0luaXRPU0tleW1hcChfVEhJUykKLXsKLQlpbnQgaTsKLQotCVNETF9tZW1zZXQoU0RMX0F0YXJpSWtiZF9rZXlib2FyZCwgS0VZX1VOREVGSU5FRCwgc2l6ZW9mKFNETF9BdGFyaUlrYmRfa2V5Ym9hcmQpKTsKLQotCS8qIE5vdyBpbnN0YWxsIG91ciBoYW5kbGVyICovCi0JU0RMX0F0YXJpSWtiZF9tb3VzZWIgPSBTRExfQXRhcmlJa2JkX21vdXNleCA9IFNETF9BdGFyaUlrYmRfbW91c2V5ID0gMDsKLQlhdGFyaV9wcmV2bW91c2ViID0gMDsKLQotCVN1cGV4ZWMoU0RMX0F0YXJpSWtiZEluc3RhbGwpOwotfQotCi1zdGF0aWMgaW50IGF0YXJpX0dldEJ1dHRvbihpbnQgYnV0dG9uKQotewotCXN3aXRjaChidXR0b24pCi0JewotCQljYXNlIDA6Ci0JCQlyZXR1cm4gU0RMX0JVVFRPTl9SSUdIVDsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gU0RMX0JVVFRPTl9MRUZUOwotCQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIEF0YXJpSWtiZF9QdW1wRXZlbnRzKF9USElTKQotewotCWludCBpLCBzcGVjaWFsa2V5czsKLQlTRExfa2V5c3ltIGtleXN5bTsKLQotCS8qLS0tIFNlbmQga2V5Ym9hcmQgZXZlbnRzIC0tLSovCi0KLQlmb3IgKGk9MDsgaTxBVEFSSUJJT1NfTUFYS0VZUzsgaSsrKSB7Ci0JCS8qIEtleSBwcmVzc2VkID8gKi8KLQkJaWYgKFNETF9BdGFyaUlrYmRfa2V5Ym9hcmRbaV09PUtFWV9QUkVTU0VEKSB7Ci0JCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELAotCQkJCVNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaSwgJmtleXN5bSwgU0RMX1RSVUUpKTsKLQkJCVNETF9BdGFyaUlrYmRfa2V5Ym9hcmRbaV09S0VZX1VOREVGSU5FRDsKLQkJfQotCQkJCi0JCS8qIEtleSByZWxlYXNlZCA/ICovCi0JCWlmIChTRExfQXRhcmlJa2JkX2tleWJvYXJkW2ldPT1LRVlfUkVMRUFTRUQpIHsKLQkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELAotCQkJCVNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaSwgJmtleXN5bSwgU0RMX0ZBTFNFKSk7Ci0JCQlTRExfQXRhcmlJa2JkX2tleWJvYXJkW2ldPUtFWV9VTkRFRklORUQ7Ci0JCX0KLQl9Ci0KLQkvKi0tLSBTZW5kIG1vdXNlIGV2ZW50cyAtLS0qLwotCi0JLyogTW91c2UgbW90aW9uID8gKi8KLQlpZiAoU0RMX0F0YXJpSWtiZF9tb3VzZXggfHwgU0RMX0F0YXJpSWtiZF9tb3VzZXkpIHsKLQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLCBTRExfQXRhcmlJa2JkX21vdXNleCwgU0RMX0F0YXJpSWtiZF9tb3VzZXkpOwotCQlTRExfQXRhcmlJa2JkX21vdXNleCA9IFNETF9BdGFyaUlrYmRfbW91c2V5ID0gMDsKLQl9Ci0KLQkvKiBNb3VzZSBidXR0b24gPyAqLwotCWlmIChTRExfQXRhcmlJa2JkX21vdXNlYiAhPSBhdGFyaV9wcmV2bW91c2ViKSB7Ci0JCWZvciAoaT0wO2k8MjtpKyspIHsKLQkJCWludCBjdXJidXR0b24sIHByZXZidXR0b247Ci0KLQkJCWN1cmJ1dHRvbiA9IFNETF9BdGFyaUlrYmRfbW91c2ViICYgKDE8PGkpOwotCQkJcHJldmJ1dHRvbiA9IGF0YXJpX3ByZXZtb3VzZWIgJiAoMTw8aSk7Ci0KLQkJCWlmIChjdXJidXR0b24gJiYgIXByZXZidXR0b24pIHsKLQkJCQlTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBhdGFyaV9HZXRCdXR0b24oaSksIDAsIDApOwotCQkJfQotCQkJaWYgKCFjdXJidXR0b24gJiYgcHJldmJ1dHRvbikgewotCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBhdGFyaV9HZXRCdXR0b24oaSksIDAsIDApOwotCQkJfQotCQl9Ci0JCWF0YXJpX3ByZXZtb3VzZWIgPSBTRExfQXRhcmlJa2JkX21vdXNlYjsKLQl9Ci19Ci0KLXZvaWQgQXRhcmlJa2JkX1NodXRkb3duRXZlbnRzKHZvaWQpCi17Ci0JU3VwZXhlYyhTRExfQXRhcmlJa2JkVW5pbnN0YWxsKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2lrYmRldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGV2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MzEwZGYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGV2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAqCUF0YXJpIGtleWJvYXJkIGV2ZW50cyBtYW5hZ2VyLCB1c2luZyBoYXJkd2FyZSBJS0JECi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0jaWZuZGVmIF9TRExfQVRBUklfSUtCREVWRU5UU19IXwotI2RlZmluZSBfU0RMX0FUQVJJX0lLQkRFVkVOVFNfSF8KLQotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0KLWV4dGVybiB2b2lkIEF0YXJpSWtiZF9Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgQXRhcmlJa2JkX1B1bXBFdmVudHMoX1RISVMpOwotZXh0ZXJuIHZvaWQgQXRhcmlJa2JkX1NodXRkb3duRXZlbnRzKHZvaWQpOwotCi0jZW5kaWYgLyogX1NETF9BVEFSSV9JS0JERVZFTlRTX0hfICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9pa2JkaW50ZXJydXB0LlMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9pa2JkaW50ZXJydXB0LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYmY1OTMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGludGVycnVwdC5TCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qCi0gKglJS0JEIDYzMDEgaW50ZXJydXB0IHJvdXRpbmUKLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLQkudGV4dAotCi0JLmdsb2JsCV9TRExfQXRhcmlJa2JkSW5zdGFsbAotCS5nbG9ibAlfU0RMX0F0YXJpSWtiZFVuaW5zdGFsbAotCi0JLmdsb2JsCV9TRExfQXRhcmlJa2JkX2tleWJvYXJkCi0JLmdsb2JsCV9TRExfQXRhcmlJa2JkX21vdXNlYgotCS5nbG9ibAlfU0RMX0F0YXJpSWtiZF9tb3VzZXgKLQkuZ2xvYmwJX1NETF9BdGFyaUlrYmRfbW91c2V5Ci0JLmdsb2JsCV9TRExfQXRhcmlJa2JkX2pveXN0aWNrCi0KLQkuZ2xvYmwJX1NETF9BdGFyaUlrYmRfZW5hYmxlZAotCi0vKi0tLSBJbnN0YWxsIG91ciBJS0JEIHZlY3RvciAtLS0qLwotCi1fU0RMX0F0YXJpSWtiZEluc3RhbGw6Ci0JbW92ZW1sCWQwLWQxL2EwLWExLHNwQC0KLQotCXwgRGlzYWJsZSBpbnRlcnJ1cHRzCi0KLQltb3ZldwkjMHgyNzAwLHNyCi0KLQl8IFNhdmUgTUZQIHJlZ2lzdGVycyB1c2VkIGZvciBrZXlib2FyZAotCi0JbGVhCTB4ZmZmZmZhMDA6dyxhMAotCWJ0c3QJIzYsYTBAKDB4MDkpCi0Jc25lCQlpa2JkX2llcmIKLQlidHN0CSM2LGEwQCgweDE1KQotCXNuZQkJaWtiZF9pbXJiCi0KLQl8IFNldCBvdXIgcm91dGluZQotCi0JbW92ZWwJMHgxMTg6dyxvbGRfaWtiZAotCW1vdmVsCSNpa2JkLDB4MTE4OncKLQlic2V0CSM2LDB4ZmZmZmZhMDk6dwl8IElFUkIKLQlic2V0CSM2LDB4ZmZmZmZhMTU6dwl8IElNUkIKLQotCXwgU2V0IG1vdXNlIHJlbGF0aXZlIG1vZGUKLQotCW1vdmViCSM4LDB4ZmZmZmZjMDI6dwotCi0JfCBSZWVuYWJsZSBpbnRlcnJ1cHRzCi0KLQltb3ZldwkjMHgyMzAwLHNyCi0KLQl8IEludGVycnVwdHMgZG9uZQotCi0JbW92ZXcJIzB4ZmZmZixfU0RMX0F0YXJpSWtiZF9lbmFibGVkCi0KLQltb3ZlbWwJc3BAKyxkMC1kMS9hMC1hMQotCXJ0cwotCi0vKi0tLSBVbmluc3RhbGwgb3VyIElLQkQgdmVjdG9yIC0tLSovCi0KLV9TRExfQXRhcmlJa2JkVW5pbnN0YWxsOgotCW1vdmVsCWEwLHNwQC0KLQotCXwgRGlzYWJsZSBpbnRlcnJ1cHRzCi0KLQltb3ZldwkjMHgyNzAwLHNyCi0KLQl8IFJlc3RvcmUgcHJldmlvdXMgTUZQIHJlZ2lzdGVycwotCi0JbGVhCTB4ZmZmZmZhMDA6dyxhMAotCi0JYmNscgkjNixhMEAoMHgwOSkKLQl0c3RiCWlrYmRfaWVyYgotCWJlcXMJaWtiZF9yZXN0b3JlaWVyYgotCWJzZXQJIzYsYTBAKDB4MDkpCi1pa2JkX3Jlc3RvcmVpZXJiOgotCi0JYmNscgkjNixhMEAoMHgxNSkKLQl0c3RiCWlrYmRfaW1yYgotCWJlcXMJaWtiZF9yZXN0b3JlaW1yYgotCWJzZXQJIzYsYTBAKDB4MTUpCi1pa2JkX3Jlc3RvcmVpbXJiOgotCi0JbW92ZWwJb2xkX2lrYmQsMHgxMTg6dwotCi0JfCBDbGVhciBrZXlib2FyZCBidWZmZXIKLQotCWxlYQkweGZmZmZmYzAwOncsYTAKLWlrYmRfdmlkZWJ1ZmZlcjoKLQlidHN0CSMwLGEwQAotCWJlcXMJaWtiZF9maW5idWZmZXIKLQl0c3RiCWEwQCgweDAyKQotCWJyYXMJaWtiZF92aWRlYnVmZmVyCi1pa2JkX2ZpbmJ1ZmZlcjoKLQotCXwgUmVlbmFibGUgaW50ZXJydXB0cwotCi0JbW92ZXcJIzB4MjMwMCxzcgotCi0JbW92ZWwJc3BAKyxhMAotCXJ0cwotCi0JLmJzcwotCi0JLmV2ZW4KLQkuY29tbQlpa2JkX2llcmIsMQotCS5jb21tCWlrYmRfaW1yYiwxCi0KLS8qLS0tIE91ciBjdXN0b20gSUtCRCB2ZWN0b3IgLS0tKi8KLQotCS50ZXh0Ci0JLmV2ZW4KLQkuYXNjaWkJIlhCUkEiCi0JLmFzY2lpCSJMU0RMIgotCS5jb21tCW9sZF9pa2JkLDQqMQotaWtiZDoKLQl8IENoZWNrIGlmIHNvdXJjZSBpcyBJS0JEIG9yIE1JREkKLQlidHN0CSMwLDB4ZmZmZmZjMDAudwotCWJlcXMJaWtiZF9vbGRtaWRpCi0KLQltb3ZlbWwJZDAtZDEvYTAsc3BALQotCW1vdmViCTB4ZmZmZmZjMDI6dyxkMAotCi0JfCBKb3lzdGljayBwYWNrZXQgPwotCQotCWNtcGIJIzB4ZmYsZDAKLQliZXFzCWlrYmRfeWVzX2pveXN0aWNrCi0KLQl8IE1vdXNlIHBhY2tldCA/Ci0KLQljbXBiCSMweGY4LGQwCi0JYm1pcwlpa2JkX25vX21vdXNlCi0JY21wYgkjMHhmYyxkMAotCWJwbHMJaWtiZF9ub19tb3VzZQotCi0JfCBNb3VzZSBwYWNrZXQsIGJ5dGUgIzEKLQotaWtiZF95ZXNfbW91c2U6Ci0JYW5kdwkjMyxkMAotCW1vdmV3CWQwLF9TRExfQXRhcmlJa2JkX21vdXNlYgotCi0JbW92ZWwJI2lrYmRfbW91c2V4LDB4MTE4OncKLQlicmFzCWlrYmRfZW5kaXRfc3RhY2sKLQotCXwgSm95c3RpY2sgcGFja2V0LCBieXRlICMxCi0KLWlrYmRfeWVzX2pveXN0aWNrOgotCW1vdmVsCSNpa2JkX2pveXN0aWNrLDB4MTE4OncKLQlicmFzCWlrYmRfZW5kaXRfc3RhY2sKLQotCXwgS2V5Ym9hcmQgcHJlc3MvcmVsZWFzZQotCi1pa2JkX25vX21vdXNlOgotCW1vdmViCWQwLGQxCi0JbGVhCQlfU0RMX0F0YXJpSWtiZF9rZXlib2FyZCxhMAotCWFuZHcJIzB4N2YsZDEKLQl0YXMJCWQwCi0Jc3BsCQlhMEAoMCxkMTp3KQotCi0JfCBFbmQgb2YgaW50ZXJydXB0Ci0KLWlrYmRfZW5kaXRfc3RhY2s6Ci0JbW92ZW1sCXNwQCssZDAtZDEvYTAKLWlrYmRfZW5kaXQ6Ci0JYmNscgkjNiwweGZmZmZmYTExOncKLQlydGUKLQotCXwgQ2FsbCBvbGQgTUlESSBpbnRlcnJ1cHQKLQotaWtiZF9vbGRtaWRpOgotCW1vdmVsCW9sZF9pa2JkLHNwQC0KLQlydHMKLQotCXwgTW91c2UgcGFja2V0LCBieXRlICMyCi0KLWlrYmRfbW91c2V4OgotCi0JfCBDaGVjayBpZiBzb3VyY2UgaXMgSUtCRCBvciBNSURJCi0JYnRzdAkjMCwweGZmZmZmYzAwLncKLQliZXFzCWlrYmRfb2xkbWlkaQotCi0JbW92ZXcJZDAsc3BALQotCi0JbW92ZWIJMHhmZmZmZmMwMjp3LGQwCi0JZXh0dwlkMAotCWFkZHcJZDAsX1NETF9BdGFyaUlrYmRfbW91c2V4Ci0KLQltb3ZldwlzcEArLGQwCi0KLQltb3ZlbAkjaWtiZF9tb3VzZXksMHgxMTg6dwotCWJyYXMJaWtiZF9lbmRpdAotCi0JfCBNb3VzZSBwYWNrZXQsIGJ5dGUgIzMKLQotaWtiZF9tb3VzZXk6Ci0KLQl8IENoZWNrIGlmIHNvdXJjZSBpcyBJS0JEIG9yIE1JREkKLQlidHN0CSMwLDB4ZmZmZmZjMDAudwotCWJlcXMJaWtiZF9vbGRtaWRpCi0KLQltb3ZldwlkMCxzcEAtCi0KLQltb3ZlYgkweGZmZmZmYzAyOncsZDAKLQlleHR3CWQwCi0JYWRkdwlkMCxfU0RMX0F0YXJpSWtiZF9tb3VzZXkKLQotCW1vdmV3CXNwQCssZDAKLQotCW1vdmVsCSNpa2JkLDB4MTE4OncKLQlicmFzCWlrYmRfZW5kaXQKLQotCXwgSm95c3RpY2sgcGFja2V0LCBieXRlICMyCi0KLWlrYmRfam95c3RpY2s6Ci0KLQl8IENoZWNrIGlmIHNvdXJjZSBpcyBJS0JEIG9yIE1JREkKLQlidHN0CSMwLDB4ZmZmZmZjMDAudwotCWJlcXMJaWtiZF9vbGRtaWRpCi0KLQltb3ZlYgkweGZmZmZmYzAyOncsX1NETF9BdGFyaUlrYmRfam95c3RpY2srMQotCi0JbW92ZWwJI2lrYmQsMHgxMTg6dwotCWJyYXMJaWtiZF9lbmRpdAotCi0JLmRhdGEKLQkKLQkuZXZlbgotX1NETF9BdGFyaUlrYmRfZW5hYmxlZDoKLQkud29yZAkwCi0KLQkuYnNzCi0KLQkuZXZlbgotCS5jb21tCV9TRExfQXRhcmlJa2JkX2tleWJvYXJkLDEyOAotCS5jb21tCV9TRExfQXRhcmlJa2JkX21vdXNleCwyCi0JLmNvbW0JX1NETF9BdGFyaUlrYmRfbW91c2V5LDIKLQkuY29tbQlfU0RMX0F0YXJpSWtiZF9tb3VzZWIsMgotCS5jb21tCV9TRExfQXRhcmlJa2JkX2pveXN0aWNrLDIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2lrYmRpbnRlcnJ1cHRfcy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGludGVycnVwdF9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODU5YzYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGludGVycnVwdF9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAqCU1vdXNlIHZlY3RvcgotICoKLSAqCVBhdHJpY2UgTWFuZGluCi0gKi8KLQotI2lmbmRlZiBfU0RMX0lLQkRJTlRFUlJVUFRfU19IXwotI2RlZmluZSBfU0RMX0lLQkRJTlRFUlJVUFRfU19IXwotCi0jaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KLQotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLQotLyogQ29uc3QgKi8KLQotI2RlZmluZSBJS0JEX0pPWV9VUAkJKDE8PDApCi0jZGVmaW5lIElLQkRfSk9ZX0RPV04JKDE8PDEpCi0jZGVmaW5lIElLQkRfSk9ZX0xFRlQJKDE8PDIpCi0jZGVmaW5lIElLQkRfSk9ZX1JJR0hUCSgxPDwzKQotI2RlZmluZSBJS0JEX0pPWV9GSVJFCSgxPDw3KQotCi0vKiBWYXJpYWJsZXMgKi8KLQotZXh0ZXJuIHZvbGF0aWxlIFVpbnQ4ICBTRExfQXRhcmlJa2JkX2tleWJvYXJkWzEyOF07CS8qIEtleWJvYXJkIHRhYmxlICovCi1leHRlcm4gdm9sYXRpbGUgVWludDE2IFNETF9BdGFyaUlrYmRfbW91c2ViOwkvKiBNb3VzZSBvbiBwb3J0IDAsIGJ1dHRvbnMgKi8KLWV4dGVybiB2b2xhdGlsZSBTaW50MTYgU0RMX0F0YXJpSWtiZF9tb3VzZXg7CS8qIE1vdXNlIFggcmVsYXRpdmUgbW90aW9uICovCi1leHRlcm4gdm9sYXRpbGUgU2ludDE2IFNETF9BdGFyaUlrYmRfbW91c2V5OwkvKiBNb3VzZSBZIHJlbGF0aXZlIG1vdGlvbiAqLwotZXh0ZXJuIHZvbGF0aWxlIFVpbnQxNiBTRExfQXRhcmlJa2JkX2pveXN0aWNrOwkvKiBKb3lzdGljayBvbiBwb3J0IDEgKi8KLQotLyogRm9yIGpveXN0aWNrIGRyaXZlciB0byBrbm93IGlmIHRoaXMgaXMgdXNhYmxlICovCi1leHRlcm4gVWludDE2IFNETF9BdGFyaUlrYmRfZW5hYmxlZDsKLQkJCQkJCQkJCQkKLS8qIEZ1bmN0aW9ucyAqLyAKLQotZXh0ZXJuIHZvaWQgU0RMX0F0YXJpSWtiZEluc3RhbGwodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfQXRhcmlJa2JkVW5pbnN0YWxsKHZvaWQpOwotCi0jZW5kaWYgLyogX1NETF9JS0JESU5URVJSVVBUX1NfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2V2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFmYTNjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gKglYQklPUyBtb3VzZSAmIGpveXN0aWNrIHZlY3RvcnMKLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLSNpbmNsdWRlIDxtaW50L29zYmluZC5oPgotCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF94Ymlvc2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3hiaW9zaW50ZXJydXB0X3MuaCIKLQotLyogVmFyaWFibGVzICovCi0KLWludCBTRExfQXRhcmlYYmlvc19lbmFibGVkPTA7Ci0KLS8qIExvY2FsIHZhcmlhYmxlcyAqLwotCi1zdGF0aWMgX0tCRFZFQ1MgKmtiZHZlY3M7CQkvKiBQb2ludGVyIHRvIGFjY2VzcyBzeXN0ZW0gdmVjdG9ycyAqLwotc3RhdGljIFVpbnQxNiBhdGFyaV9wcmV2bW91c2ViOwkvKiBidXR0b25zICovCi0KLS8qIEZ1bmN0aW9ucyAqLwotCi12b2lkIFNETF9BdGFyaVhiaW9zX0luc3RhbGxWZWN0b3JzKGludCB2ZWN0b3JzX21hc2spCi17Ci0Jdm9pZCAqb2xkcGlsZTsKLQotCS8qIENsZWFyIHZhcmlhYmxlcyAqLwotCVNETF9BdGFyaVhiaW9zX21vdXNlbG9jayA9Ci0JCVNETF9BdGFyaVhiaW9zX21vdXNlYiA9Ci0JCVNETF9BdGFyaVhiaW9zX21vdXNleCA9Ci0JCVNETF9BdGFyaVhiaW9zX21vdXNleSA9Ci0JCVNETF9BdGFyaVhiaW9zX2pveXN0aWNrID0KLQkJYXRhcmlfcHJldm1vdXNlYiA9IDA7Ci0KLQlpZiAodmVjdG9yc19tYXNrPT0wKSB7Ci0JCVNETF9BdGFyaVhiaW9zX2VuYWJsZWQ9MDsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFJlYWQgSUtCRCB2ZWN0b3JzIGJhc2UgKi8KLQlrYmR2ZWNzPUtiZHZiYXNlKCk7Ci0KLQkvKiBHbyB0byBzdXBlcnZpc29yIG1vZGUgKi8KLQlvbGRwaWxlPSh2b2lkICopU3VwZXIoMCk7Ci0KLQkvKiBJbnN0YWxsIG91ciB2ZWN0b3JzICovCi0JU0RMX0F0YXJpWGJpb3NfSW5zdGFsbCgKLQkJa2JkdmVjcywKLQkJKHZlY3RvcnNfbWFzayAmIEFUQVJJX1hCSU9TX01PVVNFRVZFTlRTKSA/IFNETF9BdGFyaVhiaW9zX01vdXNlVmVjdG9yIDogTlVMTCwKLQkJKHZlY3RvcnNfbWFzayAmIEFUQVJJX1hCSU9TX0pPWVNUSUNLRVZFTlRTKSA/IFNETF9BdGFyaVhiaW9zX0pveXN0aWNrVmVjdG9yIDogTlVMTAotCSk7Ci0KLQkvKiBCYWNrIHRvIHVzZXIgbW9kZSAqLwotCVN1cGVyKG9sZHBpbGUpOwotCi0JU0RMX0F0YXJpWGJpb3NfZW5hYmxlZD0xOwotfQotCi12b2lkIFNETF9BdGFyaVhiaW9zX1Jlc3RvcmVWZWN0b3JzKHZvaWQpCi17Ci0Jdm9pZCAqb2xkcGlsZTsKLQotCWlmIChTRExfQXRhcmlYYmlvc19lbmFibGVkPT0wKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBSZWFkIElLQkQgdmVjdG9ycyBiYXNlICovCi0Ja2JkdmVjcz1LYmR2YmFzZSgpOwotCi0JLyogR28gdG8gc3VwZXJ2aXNvciBtb2RlICovCi0Jb2xkcGlsZT0odm9pZCAqKVN1cGVyKE5VTEwpOwotCi0JLyogUmVpbnN0YWxsIHN5c3RlbSB2ZWN0b3IgKi8KLQlTRExfQXRhcmlYYmlvc19SZXN0b3JlKGtiZHZlY3MpOwotCi0JLyogQmFjayB0byB1c2VyIG1vZGUgKi8KLQlTdXBlcihvbGRwaWxlKTsKLX0KLQotc3RhdGljIGludCBhdGFyaV9HZXRCdXR0b24oaW50IGJ1dHRvbikKLXsKLQlzd2l0Y2goYnV0dG9uKQotCXsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIFNETF9CVVRUT05fUklHSFQ7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQlkZWZhdWx0OgotCQkJcmV0dXJuIFNETF9CVVRUT05fTEVGVDsKLQkJCWJyZWFrOwotCX0KLX0KLQotdm9pZCBTRExfQXRhcmlYYmlvc19Qb3N0TW91c2VFdmVudHMoX1RISVMsIFNETF9ib29sIGJ1dHRvbkV2ZW50cykKLXsKLQlpZiAoU0RMX0F0YXJpWGJpb3NfZW5hYmxlZD09MCkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogTW91c2UgbW90aW9uID8gKi8KLQlpZiAoU0RMX0F0YXJpWGJpb3NfbW91c2V4IHx8IFNETF9BdGFyaVhiaW9zX21vdXNleSkgewotCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDEsIFNETF9BdGFyaVhiaW9zX21vdXNleCwgU0RMX0F0YXJpWGJpb3NfbW91c2V5KTsKLQkJU0RMX0F0YXJpWGJpb3NfbW91c2V4ID0gU0RMX0F0YXJpWGJpb3NfbW91c2V5ID0gMDsKLQl9Ci0JCi0JLyogTW91c2UgYnV0dG9uID8gKi8KLQlpZiAoYnV0dG9uRXZlbnRzICYmIChTRExfQXRhcmlYYmlvc19tb3VzZWIgIT0gYXRhcmlfcHJldm1vdXNlYikpIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpPTA7aTwyO2krKykgewotCQkJaW50IGN1cmJ1dHRvbiwgcHJldmJ1dHRvbjsKLQotCQkJY3VyYnV0dG9uID0gU0RMX0F0YXJpWGJpb3NfbW91c2ViICYgKDE8PGkpOwotCQkJcHJldmJ1dHRvbiA9IGF0YXJpX3ByZXZtb3VzZWIgJiAoMTw8aSk7Ci0KLQkJCWlmIChjdXJidXR0b24gJiYgIXByZXZidXR0b24pIHsKLQkJCQlTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBhdGFyaV9HZXRCdXR0b24oaSksIDAsIDApOwotCQkJfQotCQkJaWYgKCFjdXJidXR0b24gJiYgcHJldmJ1dHRvbikgewotCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBhdGFyaV9HZXRCdXR0b24oaSksIDAsIDApOwotCQkJfQotCQl9Ci0JCWF0YXJpX3ByZXZtb3VzZWIgPSBTRExfQXRhcmlYYmlvc19tb3VzZWI7Ci0JfQotfQotCi12b2lkIFNETF9BdGFyaVhiaW9zX0xvY2tNb3VzZVBvc2l0aW9uKFNETF9ib29sIGxvY2tQb3NpdGlvbikKLXsKLQlTRExfQXRhcmlYYmlvc19tb3VzZWxvY2sgPSBsb2NrUG9zaXRpb247Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2V2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzQ2ZmIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfeGJpb3NldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gKglYYmlvcyBtb3VzZSAmIGpveXN0aWNrIHZlY3RvcnMKLSAqCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLSNpZm5kZWYgX1NETF9BVEFSSV9YQklPU0VWRU5UU19IXwotI2RlZmluZSBfU0RMX0FUQVJJX1hCSU9TRVZFTlRTX0hfCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi0jZGVmaW5lIEFUQVJJX1hCSU9TX01PVVNFRVZFTlRTICgxPDwwKQotI2RlZmluZSBBVEFSSV9YQklPU19KT1lTVElDS0VWRU5UUyAoMTw8MSkKLQotZXh0ZXJuIGludCBTRExfQXRhcmlYYmlvc19lbmFibGVkOwotCi1leHRlcm4gdm9pZCBTRExfQXRhcmlYYmlvc19JbnN0YWxsVmVjdG9ycyhpbnQgdmVjdG9yc19tYXNrKTsKLWV4dGVybiB2b2lkIFNETF9BdGFyaVhiaW9zX1Jlc3RvcmVWZWN0b3JzKHZvaWQpOwotZXh0ZXJuIHZvaWQgU0RMX0F0YXJpWGJpb3NfUG9zdE1vdXNlRXZlbnRzKF9USElTLCBTRExfYm9vbCBidXR0b25FdmVudHMpOwotZXh0ZXJuIHZvaWQgU0RMX0F0YXJpWGJpb3NfTG9ja01vdXNlUG9zaXRpb24oU0RMX2Jvb2wgbG9ja1Bvc2l0aW9uKTsKLQotI2VuZGlmIC8qIF9TRExfWEJJT1NFVkVOVFNfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zaW50ZXJydXB0LlMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2ludGVycnVwdC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzZkZjM3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zaW50ZXJydXB0LlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyoKLSAqCVhCSU9TIG1vdXNlICYgam95c3RpY2sgdmVjdG9ycwotICoKLSAqCVBhdHJpY2UgTWFuZGluCi0gKi8KLQotCS50ZXh0Ci0KLQkuZ2xvYmwJX1NETF9BdGFyaVhiaW9zX0luc3RhbGwKLQkuZ2xvYmwJX1NETF9BdGFyaVhiaW9zX1Jlc3RvcmUKLQkuZ2xvYmwJX1NETF9BdGFyaVhiaW9zX01vdXNlVmVjdG9yCi0JLmdsb2JsCV9TRExfQXRhcmlYYmlvc19Kb3lzdGlja1ZlY3RvcgotCi0JLmdsb2JsCV9TRExfQXRhcmlYYmlvc19tb3VzZWxvY2sKLQkuZ2xvYmwJX1NETF9BdGFyaVhiaW9zX21vdXNlYgotCS5nbG9ibAlfU0RMX0F0YXJpWGJpb3NfbW91c2V4Ci0JLmdsb2JsCV9TRExfQXRhcmlYYmlvc19tb3VzZXkKLQkuZ2xvYmwJX1NETF9BdGFyaVhiaW9zX2pveXN0aWNrCi0KLS8qLS0tIFZlY3RvciBpbnN0YWxsZXIgLS0tKi8KLQotX1NETF9BdGFyaVhiaW9zX0luc3RhbGw6Ci0JbW92ZWwJc3BAKDQpLGEwCi0KLQkvKiBTdG9wIGludGVycnVwdHMgKi8KLQotCW1vdmV3CSMweDI3MDAsc3IKLQotCS8qIFNhdmUgb2xkIG1vdXNlIHZlY3Rvciwgc2V0IG91ciByb3V0aW5lICovCi0KLQljbHJsCW9sZG1vdXNldmVjdG9yCi0JbW92ZWwJc3BAKDgpLGQwCi0JYmVxcwlub19uZXdfbW91c2VfdmVjdG9yCi0JbW92ZWwJYTBAKDE2KSxvbGRtb3VzZXZlY3RvcgotCW1vdmVsCWQwLGEwQCgxNikKLW5vX25ld19tb3VzZV92ZWN0b3I6Ci0KLQkvKiBTYXZlIG9sZCBqb3lzdGljayB2ZWN0b3IsIHNldCBvdXIgcm91dGluZSAqLwotCi0JY2xybAlvbGRqb3lzdGlja3ZlY3RvcgotCW1vdmVsCXNwQCgxMiksZDAKLQliZXFzCW5vX25ld19qb3lzdGlja192ZWN0b3IKLQltb3ZlbAlhMEAoMjQpLG9sZGpveXN0aWNrdmVjdG9yCi0JbW92ZWwJZDAsYTBAKDI0KQotbm9fbmV3X2pveXN0aWNrX3ZlY3RvcjoKLQotCS8qIFJlc3RhcnQgaW50ZXJydXB0cyAqLwotCi0JbW92ZXcJIzB4MjMwMCxzcgotCi0JcnRzCi0KLS8qLS0tIFZlY3RvciByZXN0b3JlciAtLS0qLwotCi1fU0RMX0F0YXJpWGJpb3NfUmVzdG9yZToKLQltb3ZlbAlzcEAoNCksYTAKLQotCS8qIFN0b3AgaW50ZXJydXB0cyAqLwotCi0JbW92ZXcJIzB4MjcwMCxzcgotCi0JLyogUmVzdG9yZSBtb3VzZSB2ZWN0b3IgKi8KLQotCW1vdmVsCW9sZG1vdXNldmVjdG9yLGQwCi0JYmVxcwlub19yZXN0b3JlX21vdXNlCi0JbW92ZWwJZDAsYTBAKDE2KQotbm9fcmVzdG9yZV9tb3VzZToKLQotCS8qIFJlc3RvcmUgam95c3RpY2sgdmVjdG9yICovCi0KLQltb3ZlbAlvbGRqb3lzdGlja3ZlY3RvcixkMAotCWJlcXMJbm9fcmVzdG9yZV9qb3lzdGljawotCW1vdmVsCWQwLGEwQCgyNCkKLW5vX3Jlc3RvcmVfam95c3RpY2s6Ci0KLQkvKiBSZXN0YXJ0IGludGVycnVwdHMgKi8KLQotCW1vdmV3CSMweDIzMDAsc3IKLQotCXJ0cwotCi0vKi0tLSBPdXIgbW91c2UgdmVjdG9yIC0tLSovCi0KLQkudGV4dAotCS5ldmVuCi0JLmFzY2lpICJYQlJBIgotCS5hc2NpaSAiTFNETCIKLQkuY29tbQlvbGRtb3VzZXZlY3Rvciw0KjEKLV9TRExfQXRhcmlYYmlvc19Nb3VzZVZlY3RvcjoKLQltb3ZlbAlkMCxzcEAtCi0KLQkvKiBNb3VzZSBidXR0b25zICovCi0JbW92ZWIJKGEwKSxkMAotCWFuZHcJIzMsZDAKLQltb3ZldwlkMCxfU0RMX0F0YXJpWGJpb3NfbW91c2ViCi0KLQkvKiBYIG1vdmVtZW50ICovCi0JbW92ZWIJYTBAKDEpLGQwCi0JZXh0dwlkMAotCWFkZHcJZDAsX1NETF9BdGFyaVhiaW9zX21vdXNleAotCi0JLyogWSBtb3ZlbWVudCAqLwotCW1vdmViCWEwQCgyKSxkMAotCWV4dHcJZDAKLQlhZGR3CWQwLF9TRExfQXRhcmlYYmlvc19tb3VzZXkKLQotCS8qIExvY2sgbW91c2UgcG9zaXRpb24gPyAqLwotCXRzdHcJX1NETF9BdGFyaVhiaW9zX21vdXNlbG9jawotCWJlcS5zCW5vX21vdXNlX2xvY2sKLQljbHJiCWEwQCgxKQotCWNscmIJYTBAKDIpCi1ub19tb3VzZV9sb2NrOgotCi0JLyogSnVtcCB0aHJvdWdoIG9sZCB2ZWN0b3IgKi8KLQltb3ZlbAlzcEArLGQwCi0KLQltb3ZlbAlvbGRtb3VzZXZlY3RvcixzcEAtCi0JcnRzCi0KLQkuZGF0YQotCS5ldmVuCi0JLmNvbW0JX1NETF9BdGFyaVhiaW9zX21vdXNlbG9jaywyKjEKLQkuY29tbQlfU0RMX0F0YXJpWGJpb3NfbW91c2V4LDIqMQotCS5jb21tCV9TRExfQXRhcmlYYmlvc19tb3VzZXksMioxCi0JLmNvbW0JX1NETF9BdGFyaVhiaW9zX21vdXNlYiwyKjEKLQotLyotLS0gT3VyIGpveXN0aWNrIHZlY3RvciAtLS0qLwotCi0JLnRleHQKLQkuZXZlbgotCS5hc2NpaSAiWEJSQSIKLQkuYXNjaWkgIkxTREwiCi0JLmNvbW0Jb2xkam95c3RpY2t2ZWN0b3IsNCoxCi1fU0RMX0F0YXJpWGJpb3NfSm95c3RpY2tWZWN0b3I6Ci0JbW92ZWwJZDAsc3BALQotCi0JLyogTmV3IGpveXN0aWNrIHN0YXRlICovCi0JbW92ZWIJYTBAKDIpLGQwCi0JYW5kdwkjMHg4ZixkMAotCW1vdmV3CWQwLF9TRExfQXRhcmlYYmlvc19qb3lzdGljawotCi0JLyogSnVtcCB0aHJvdWdoIG9sZCB2ZWN0b3IgKi8KLQltb3ZlbAlzcEArLGQwCi0KLQltb3ZlbAlvbGRqb3lzdGlja3ZlY3RvcixzcEAtCi0JcnRzCi0KLQkuZGF0YQotCS5ldmVuCi0JLmNvbW0JX1NETF9BdGFyaVhiaW9zX2pveXN0aWNrLDIqMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfeGJpb3NpbnRlcnJ1cHRfcy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfeGJpb3NpbnRlcnJ1cHRfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjljMTcwLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zaW50ZXJydXB0X3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICoJTW91c2UgdmVjdG9yCi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0jaWZuZGVmIF9TRExfWEJJT1NJTlRFUlJVUFRfU19IXwotI2RlZmluZSBfU0RMX1hCSU9TSU5URVJSVVBUX1NfSF8KLQotI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+Ci0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0KLS8qIFZhcmlhYmxlcyAqLwotCi1leHRlcm4gdm9sYXRpbGUgVWludDE2IFNETF9BdGFyaVhiaW9zX21vdXNlbG9jazsJLyogbW91c2UgbG9jayBwb3NpdGlvbiAqLwotZXh0ZXJuIHZvbGF0aWxlIFVpbnQxNiBTRExfQXRhcmlYYmlvc19tb3VzZWI7CS8qIGJ1dHRvbnMgKi8KLWV4dGVybiB2b2xhdGlsZSBTaW50MTYgU0RMX0F0YXJpWGJpb3NfbW91c2V4OwkvKiBYIHJlbGF0aXZlIG1vdGlvbiAqLwotZXh0ZXJuIHZvbGF0aWxlIFNpbnQxNiBTRExfQXRhcmlYYmlvc19tb3VzZXk7CS8qIFkgcmVsYXRpdmUgbW90aW9uICovCi1leHRlcm4gdm9sYXRpbGUgVWludDE2IFNETF9BdGFyaVhiaW9zX2pveXN0aWNrOwkvKiBKb3lzdGljayAqLwotCi0vKiBGdW5jdGlvbnMgKi8gCi0KLWV4dGVybiB2b2lkIFNETF9BdGFyaVhiaW9zX0luc3RhbGwoX0tCRFZFQ1MgKmtiZHZlY3Msdm9pZCAqbmV3bW91c2V2ZWN0b3Isdm9pZCAqbmV3am95c3RpY2t2ZWN0b3IpOwotZXh0ZXJuIHZvaWQgU0RMX0F0YXJpWGJpb3NfUmVzdG9yZShfS0JEVkVDUyAqa2JkdmVjcyk7Ci1leHRlcm4gdm9pZCBTRExfQXRhcmlYYmlvc19Nb3VzZVZlY3Rvcih2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgU0RMX0F0YXJpWGJpb3NfSm95c3RpY2tWZWN0b3Iodm9pZCAqYnVmKTsKLQotI2VuZGlmIC8qIF9TRExfWEJJT1NJTlRFUlJVUFRfU19IXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9ibGFua19jdXJzb3IuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYmxhbmtfY3Vyc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2M2ZhZTMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9ibGFua19jdXJzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAKLSAqIEEgZGVmYXVsdCBibGFuayA4eDggY3Vyc29yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBCTEFOS19DV0lEVEgJOAotI2RlZmluZSBCTEFOS19DSEVJR0hUCTgKLSNkZWZpbmUgQkxBTktfQ0hPVFgJMAotI2RlZmluZSBCTEFOS19DSE9UWQkwCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJsYW5rX2NkYXRhWzhdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBibGFua19jbWFza1s4XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX0JWaWV3LmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX0JWaWV3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NGQwNjQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9CVmlldy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfQlZpZXdfaAotI2RlZmluZSBfU0RMX0JWaWV3X2gKLQotLyogVGhpcyBpcyB0aGUgZXZlbnQgaGFuZGxpbmcgYW5kIGdyYXBoaWNzIHVwZGF0ZSBwb3J0aW9uIG9mIFNETF9CV2luICovCi0KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLX07Ci0KLWNsYXNzIFNETF9CVmlldyA6IHB1YmxpYyBCVmlldwotewotcHVibGljOgotCVNETF9CVmlldyhCUmVjdCBmcmFtZSkgOiAKLQkJQlZpZXcoZnJhbWUsICJTREwgVmlldyIsIEJfRk9MTE9XX0FMTF9TSURFUywKLQkJCQkJKEJfV0lMTF9EUkFXfEJfRlJBTUVfRVZFTlRTKSkgewotCQlpbWFnZSA9IE5VTEw7Ci0JCXhvZmYgPSB5b2ZmID0gMDsKLQkJU2V0Vmlld0NvbG9yKDAsMCwwLDApOwotCQlTZXRIaWdoQ29sb3IoMCwwLDAsMCk7Ci0JfQotCXZpcnR1YWwgflNETF9CVmlldygpIHsKLQkJU2V0Qml0bWFwKE5VTEwpOwotCX0KLQkvKiBTZXQgZHJhd2luZyBvZmZzZXRzIGZvciBmdWxsc2NyZWVuIG1vZGUgKi8KLQl2aXJ0dWFsIHZvaWQgU2V0WFlPZmZzZXQoaW50IHgsIGludCB5KSB7Ci0JCXhvZmYgPSB4OwotCQl5b2ZmID0geTsKLQl9Ci0JdmlydHVhbCB2b2lkIEdldFhZT2Zmc2V0KGludCAmeCwgaW50ICZ5KSB7Ci0JCXggPSB4b2ZmOwotCQl5ID0geW9mZjsKLQl9Ci0JdmlydHVhbCB2b2lkIEdldFhZT2Zmc2V0KGZsb2F0ICZ4LCBmbG9hdCAmeSkgewotCQl4ID0gKGZsb2F0KXhvZmY7Ci0JCXkgPSAoZmxvYXQpeW9mZjsKLQl9Ci0JLyogVGhlIHZpZXcgY2hhbmdlZCBzaXplLiBJZiBpdCBtZWFucyB3ZSdyZSBpbiBmdWxsc2NyZWVuLCB3ZQotCSAqIGRyYXcgYSBuaWNlIGJsYWNrIGJveCBpbiB0aGUgZW50aXJlIHZpZXcgdG8gZ2V0IGJsYWNrIGJvcmRlcnMuCi0JICovCi0JdmlydHVhbCB2b2lkIEZyYW1lUmVzaXplZChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0KSB7Ci0JCUJSZWN0IGJvdW5kczsKLQkJYm91bmRzLnRvcCA9IGJvdW5kcy5sZWZ0ID0gMDsKLQkJYm91bmRzLnJpZ2h0ID0gd2lkdGg7Ci0JCWJvdW5kcy5ib3R0b20gPSBoZWlnaHQ7Ci0JCS8qIEZpbGwgdGhlIGVudGlyZSB2aWV3IHdpdGggYmxhY2sgKi8gCi0JCUZpbGxSZWN0KGJvdW5kcywgQl9TT0xJRF9ISUdIKTsKLQkJLyogQW5kIGlmIHRoZXJlJ3MgYW4gaW1hZ2UsIHJlZHJhdyBpdC4gKi8KLQkJaWYoIGltYWdlICkgewotCQkJYm91bmRzID0gaW1hZ2UtPkJvdW5kcygpOwotCQkJRHJhdyhib3VuZHMpOwotCQl9Ci0JfQotCQotCS8qIERyYXdpbmcgcG9ydGlvbiBvZiB0aGlzIGNvbXBsZXRlIGJyZWFrZmFzdC4gOikgKi8KLQl2aXJ0dWFsIHZvaWQgU2V0Qml0bWFwKEJCaXRtYXAgKmJpdG1hcCkgewotCQlpZiAoIGltYWdlICkgewotCQkJZGVsZXRlIGltYWdlOwotCQl9Ci0JCWltYWdlID0gYml0bWFwOwotCX0KLQl2aXJ0dWFsIHZvaWQgRHJhdyhCUmVjdCB1cGRhdGVSZWN0KSB7Ci0JCWlmICggaW1hZ2UgKSB7Ci0JCQlpZih4b2ZmIHx8IHlvZmYpIHsJCi0JCQkJQlJlY3QgZGVzdDsKLQkJCQlkZXN0LnRvcCAgICA9IHVwZGF0ZVJlY3QudG9wICsgeW9mZjsKLQkJCQlkZXN0LmxlZnQgICA9IHVwZGF0ZVJlY3QubGVmdCArIHhvZmY7Ci0JCQkJZGVzdC5ib3R0b20gPSB1cGRhdGVSZWN0LmJvdHRvbSArIHlvZmY7Ci0JCQkJZGVzdC5yaWdodCAgPSB1cGRhdGVSZWN0LnJpZ2h0ICsgeG9mZjsKLQkJCQlEcmF3Qml0bWFwKGltYWdlLCB1cGRhdGVSZWN0LCBkZXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJRHJhd0JpdG1hcChpbWFnZSwgdXBkYXRlUmVjdCwgdXBkYXRlUmVjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JdmlydHVhbCB2b2lkIERyYXdBc3luYyhCUmVjdCB1cGRhdGVSZWN0KSB7Ci0JCWlmKHhvZmYgfHwgeW9mZikgewkKLQkJCUJSZWN0IGRlc3Q7Ci0JCQlkZXN0LnRvcCAgICA9IHVwZGF0ZVJlY3QudG9wICsgeW9mZjsKLQkJCWRlc3QubGVmdCAgID0gdXBkYXRlUmVjdC5sZWZ0ICsgeG9mZjsKLQkJCWRlc3QuYm90dG9tID0gdXBkYXRlUmVjdC5ib3R0b20gKyB5b2ZmOwotCQkJZGVzdC5yaWdodCAgPSB1cGRhdGVSZWN0LnJpZ2h0ICsgeG9mZjs7Ci0JCQlEcmF3Qml0bWFwQXN5bmMoaW1hZ2UsIHVwZGF0ZVJlY3QsIGRlc3QpOwotCQl9IGVsc2UgewotCQkJRHJhd0JpdG1hcEFzeW5jKGltYWdlLCB1cGRhdGVSZWN0LCB1cGRhdGVSZWN0KTsKLQkJfQotCX0KLQotcHJpdmF0ZToKLQlCQml0bWFwICppbWFnZTsKLQlpbnQgeG9mZiwgeW9mZjsKLX07Ci0KLSNlbmRpZiAvKiBfU0RMX0JWaWV3X2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfQldpbi5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9CV2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmQ1YTIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9CV2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotI2lmbmRlZiBfU0RMX0JXaW5faAotI2RlZmluZSBfU0RMX0JXaW5faAotCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxBcHBLaXQuaD4KLSNpbmNsdWRlIDxJbnRlcmZhY2VLaXQuaD4KLSNpbmNsdWRlIDxiZS9nYW1lL0RpcmVjdFdpbmRvdy5oPgotI2lmIFNETF9WSURFT19PUEVOR0wKLSNpbmNsdWRlIDxiZS9vcGVuZ2wvR0xWaWV3Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdXBwb3J0L1VURjguaD4KLQotI2luY2x1ZGUgIi4uLy4uL21haW4vYmVvcy9TRExfQmVBcHAuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzLmgiCi0jaW5jbHVkZSAiU0RMX0JWaWV3LmgiCi0KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotZXh0ZXJuIGludCBtb3VzZV9yZWxhdGl2ZTsKLX07Ci0KLWNsYXNzIFNETF9CV2luIDogcHVibGljIEJEaXJlY3RXaW5kb3cKLXsKLXB1YmxpYzoKLQlTRExfQldpbihCUmVjdCBib3VuZHMpIDoKLQkJCUJEaXJlY3RXaW5kb3coYm91bmRzLCAiVW50aXRsZWQiLCBCX1RJVExFRF9XSU5ET1csIDApIHsKLQkJbGFzdF9idXR0b25zID0gMDsKLQkJdGhlX3ZpZXcgPSBOVUxMOwotI2lmIFNETF9WSURFT19PUEVOR0wKLQkJU0RMX0dMVmlldyA9IE5VTEw7Ci0jZW5kaWYKLQkJU0RMX1ZpZXcgPSBOVUxMOwotCQlVbmxvY2soKTsKLQkJc2hvd24gPSBmYWxzZTsKLQkJaW5oaWJpdF9yZXNpemUgPSBmYWxzZTsKLQl9Ci0KLQl2aXJ0dWFsIH5TRExfQldpbigpIHsKLQkJTG9jaygpOwotCQlpZiAoIHRoZV92aWV3ICkgewotI2lmIFNETF9WSURFT19PUEVOR0wKLQkJCWlmICggdGhlX3ZpZXcgPT0gU0RMX0dMVmlldyApIHsKLQkJCQlTRExfR0xWaWV3LT5VbmxvY2tHTCgpOwotCQkJfQotI2VuZGlmCi0JCQlSZW1vdmVDaGlsZCh0aGVfdmlldyk7Ci0JCQl0aGVfdmlldyA9IE5VTEw7Ci0JCX0KLQkJVW5sb2NrKCk7Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCQlpZiAoIFNETF9HTFZpZXcgKSB7Ci0JCQlkZWxldGUgU0RMX0dMVmlldzsKLQkJfQotI2VuZGlmCi0JCWlmICggU0RMX1ZpZXcgKSB7Ci0JCQlkZWxldGUgU0RMX1ZpZXc7Ci0JCX0KLQl9Ci0JCi0KLQkvKiBPdmVycmlkZSB0aGUgU2hvdygpIG1ldGhvZCBzbyB3ZSBjYW4gdGVsbCB3aGVuIHdlJ3ZlIGJlZW4gc2hvd24gKi8KLQl2aXJ0dWFsIHZvaWQgU2hvdyh2b2lkKSB7Ci0JCUJXaW5kb3c6OlNob3coKTsKLQkJc2hvd24gPSB0cnVlOwotCX0KLQl2aXJ0dWFsIGJvb2wgU2hvd24odm9pZCkgewotCQlyZXR1cm4gKHNob3duKTsKLQl9Ci0JLyogSWYgY2FsbGVkLCB0aGUgbmV4dCByZXNpemUgZXZlbnQgd2lsbCBub3QgYmUgZm9yd2FyZGVkIHRvIFNETC4gKi8KLQl2aXJ0dWFsIHZvaWQgSW5oaWJpdFJlc2l6ZSh2b2lkKSB7Ci0JCWluaGliaXRfcmVzaXplPXRydWU7Ci0JfQotCS8qIEhhbmRsZSByZXNpemluZyBvZiB0aGUgd2luZG93ICovCi0JdmlydHVhbCB2b2lkIEZyYW1lUmVzaXplZChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0KSB7Ci0JCWlmKGluaGliaXRfcmVzaXplKQotCQkJaW5oaWJpdF9yZXNpemUgPSBmYWxzZTsKLQkJZWxzZSAKLQkJCVNETF9Qcml2YXRlUmVzaXplKChpbnQpd2lkdGgsIChpbnQpaGVpZ2h0KTsKLQl9Ci0JdmlydHVhbCBpbnQgQ3JlYXRlVmlldyhVaW50MzIgZmxhZ3MsIFVpbnQzMiBnbF9mbGFncykgewotCQlpbnQgcmV0dmFsOwotCi0JCXJldHZhbCA9IDA7Ci0JCUxvY2soKTsKLQkJaWYgKCBmbGFncyAmIFNETF9PUEVOR0wgKSB7Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCQkJaWYgKCBTRExfR0xWaWV3ID09IE5VTEwgKSB7Ci0JCQkJU0RMX0dMVmlldyA9IG5ldyBCR0xWaWV3KEJvdW5kcygpLCAiU0RMIEdMVmlldyIsCi0JCQkJCSAJQl9GT0xMT1dfQUxMX1NJREVTLCAoQl9XSUxMX0RSQVd8Ql9GUkFNRV9FVkVOVFMpLAotCQkJCQkgCWdsX2ZsYWdzKTsKLQkJCQlTRExfR0xWaWV3LT5FbmFibGVEaXJlY3RNb2RlKHRydWUpOwotCQkJfQotCQkJaWYgKCB0aGVfdmlldyAhPSBTRExfR0xWaWV3ICkgewotCQkJCWlmICggdGhlX3ZpZXcgKSB7Ci0JCQkJCVJlbW92ZUNoaWxkKHRoZV92aWV3KTsKLQkJCQl9Ci0JCQkJQWRkQ2hpbGQoU0RMX0dMVmlldyk7Ci0JCQkJU0RMX0dMVmlldy0+TG9ja0dMKCk7Ci0JCQkJdGhlX3ZpZXcgPSBTRExfR0xWaWV3OwotCQkJfQotI2Vsc2UKLQkJCVNETF9TZXRFcnJvcigiT3BlbkdMIHN1cHBvcnQgbm90IGVuYWJsZWQiKTsKLQkJCXJldHZhbCA9IC0xOwotI2VuZGlmCi0JCX0gZWxzZSB7Ci0JCQlpZiAoIFNETF9WaWV3ID09IE5VTEwgKSB7Ci0JCQkJU0RMX1ZpZXcgPSBuZXcgU0RMX0JWaWV3KEJvdW5kcygpKTsKLQkJCX0KLQkJCWlmICggdGhlX3ZpZXcgIT0gU0RMX1ZpZXcgKSB7Ci0JCQkJaWYgKCB0aGVfdmlldyApIHsKLSNpZiBTRExfVklERU9fT1BFTkdMCi0JCQkJCWlmICggdGhlX3ZpZXcgPT0gU0RMX0dMVmlldyApIHsKLQkJCQkJCVNETF9HTFZpZXctPlVubG9ja0dMKCk7Ci0JCQkJCX0KLSNlbmRpZgotCQkJCQlSZW1vdmVDaGlsZCh0aGVfdmlldyk7Ci0JCQkJfQotCQkJCUFkZENoaWxkKFNETF9WaWV3KTsKLQkJCQl0aGVfdmlldyA9IFNETF9WaWV3OwotCQkJfQotCQl9Ci0JCVVubG9jaygpOwotCQlyZXR1cm4ocmV0dmFsKTsKLQl9Ci0JdmlydHVhbCB2b2lkIFNldEJpdG1hcChCQml0bWFwICpiaXRtYXApIHsKLQkJU0RMX1ZpZXctPlNldEJpdG1hcChiaXRtYXApOwotCX0KLQl2aXJ0dWFsIHZvaWQgU2V0WFlPZmZzZXQoaW50IHgsIGludCB5KSB7Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCQlpZiAoIHRoZV92aWV3ID09IFNETF9HTFZpZXcgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLSNlbmRpZgotCQlTRExfVmlldy0+U2V0WFlPZmZzZXQoeCwgeSk7Ci0JfQotCXZpcnR1YWwgdm9pZCBHZXRYWU9mZnNldChpbnQgJngsIGludCAmeSkgewotI2lmIFNETF9WSURFT19PUEVOR0wKLQkJaWYgKCB0aGVfdmlldyA9PSBTRExfR0xWaWV3ICkgewotCQkJeCA9IDA7Ci0JCQl5ID0gMDsKLQkJCXJldHVybjsKLQkJfQotI2VuZGlmCi0JCVNETF9WaWV3LT5HZXRYWU9mZnNldCh4LCB5KTsKLQl9Ci0JdmlydHVhbCB2b2lkIEdldFhZT2Zmc2V0KGZsb2F0ICZ4LCBmbG9hdCAmeSkgewotI2lmIFNETF9WSURFT19PUEVOR0wKLQkJaWYgKCB0aGVfdmlldyA9PSBTRExfR0xWaWV3ICkgewotCQkJeCA9IDAuMGY7Ci0JCQl5ID0gMC4wZjsKLQkJCXJldHVybjsKLQkJfQotI2VuZGlmCi0JCVNETF9WaWV3LT5HZXRYWU9mZnNldCh4LCB5KTsKLQl9Ci0JdmlydHVhbCBib29sIEJlZ2luRHJhdyh2b2lkKSB7Ci0JCXJldHVybihMb2NrKCkpOwotCX0KLQl2aXJ0dWFsIHZvaWQgRHJhd0FzeW5jKEJSZWN0IHVwZGF0ZVJlY3QpIHsKLQkJU0RMX1ZpZXctPkRyYXdBc3luYyh1cGRhdGVSZWN0KTsKLQl9Ci0JdmlydHVhbCB2b2lkIEVuZERyYXcodm9pZCkgewotCQlTRExfVmlldy0+U3luYygpOwotCQlVbmxvY2soKTsKLQl9Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCXZpcnR1YWwgdm9pZCBTd2FwQnVmZmVycyh2b2lkKSB7Ci0JCVNETF9HTFZpZXctPlVubG9ja0dMKCk7Ci0JCVNETF9HTFZpZXctPkxvY2tHTCgpOwotCQlTRExfR0xWaWV3LT5Td2FwQnVmZmVycygpOwotCX0KLSNlbmRpZgotCXZpcnR1YWwgQlZpZXcgKlZpZXcodm9pZCkgewotCQlyZXR1cm4odGhlX3ZpZXcpOwotCX0KLQotCS8qIEhvb2sgZnVuY3Rpb25zIC0tIG92ZXJyaWRkZW4gKi8KLQl2aXJ0dWFsIHZvaWQgTWluaW1pemUoYm9vbCBtaW5pbWl6ZSkgewotCQkvKiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gbWltaW1pemVkLCBub3Qgd2hlbiByZXN0b3JlZCAqLwotCQkvL1NETF9Qcml2YXRlQXBwQWN0aXZlKG1pbmltaXplLCBTRExfQVBQQUNUSVZFKTsKLQkJQldpbmRvdzo6TWluaW1pemUobWluaW1pemUpOwotCX0KLQl2aXJ0dWFsIHZvaWQgV2luZG93QWN0aXZhdGVkKGJvb2wgYWN0aXZlKSB7Ci0JCVNETF9Qcml2YXRlQXBwQWN0aXZlKGFjdGl2ZSwgU0RMX0FQUElOUFVURk9DVVMpOwotCX0KLQl2aXJ0dWFsIGJvb2wgUXVpdFJlcXVlc3RlZCh2b2lkKSB7Ci0JCWlmICggU0RMX0JlQXBwQWN0aXZlID4gMCApIHsKLQkJCVNETF9Qcml2YXRlUXVpdCgpOwotCQkJLyogV2UgZG9uJ3QgZXZlciBhY3R1YWxseSBjbG9zZSB0aGUgd2luZG93IGhlcmUgYmVjYXVzZQotCQkJICAgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXNwb25kIHRvIHRoZSBxdWl0IHJlcXVlc3QsCi0JCQkgICBvciBpZ25vcmUgaXQgYXMgZGVzaXJlZC4KLQkJCSAqLwotCQkJcmV0dXJuKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4odHJ1ZSk7CS8qIENsb3NlIHRoZSBhcHAgd2luZG93ICovCi0JfQotCXZpcnR1YWwgdm9pZCBRdWl0KCkgewotCQlpZiAoIUlzTG9ja2VkKCkpCi0JCQlMb2NrKCk7Ci0JCUJEaXJlY3RXaW5kb3c6OlF1aXQoKTsKLQl9Ci0KLQl2aXJ0dWFsIGludDE2IFRyYW5zbGF0ZTJVbmljb2RlKGNvbnN0IGNoYXIgKmJ1ZikgewotCQlpbnQzMiBzdGF0ZSwgc3JjbGVuLCBkc3RsZW47Ci0JCXVuc2lnbmVkIGNoYXIgZGVzdGJ1ZlsyXTsKLQkJVWludDE2IHVuaWNvZGUgPSAwOwotCi0JCWlmICgodWNoYXIpYnVmWzBdID4gMTI3KSB7Ci0JCQlzdGF0ZSA9IDA7Ci0JCQlzcmNsZW4gPSBTRExfc3RybGVuKGJ1Zik7Ci0JCQlkc3RsZW4gPSBzaXplb2YoZGVzdGJ1Zik7Ci0JCQljb252ZXJ0X2Zyb21fdXRmOChCX1VOSUNPREVfQ09OVkVSU0lPTiwgYnVmLCAmc3JjbGVuLCAoY2hhciAqKWRlc3RidWYsICZkc3RsZW4sICZzdGF0ZSk7Ci0JCQl1bmljb2RlID0gZGVzdGJ1ZlswXTsKLQkJCXVuaWNvZGUgPDw9IDg7Ci0JCQl1bmljb2RlIHw9IGRlc3RidWZbMV07Ci0JCX0gZWxzZQotCQkJdW5pY29kZSA9IGJ1ZlswXTsKLQotCQkvKiBGb3Igc29tZSByZWFzb24gZnVuY3Rpb24ga2V5cyBtYXAgdG8gY29udHJvbCBjaGFyYWN0ZXJzICovCi0jIGRlZmluZSBDVFJMKFgpCSgoWCktJ0AnKQotCQlzd2l0Y2ggKHVuaWNvZGUpIHsKLQkJICAgIGNhc2UgQ1RSTCgnQScpOgotCQkgICAgY2FzZSBDVFJMKCdCJyk6Ci0JCSAgICBjYXNlIENUUkwoJ0MnKToKLQkJICAgIGNhc2UgQ1RSTCgnRCcpOgotCQkgICAgY2FzZSBDVFJMKCdFJyk6Ci0JCSAgICBjYXNlIENUUkwoJ0snKToKLQkJICAgIGNhc2UgQ1RSTCgnTCcpOgotCQkgICAgY2FzZSBDVFJMKCdQJyk6Ci0JCQlpZiAoICEgKFNETF9HZXRNb2RTdGF0ZSgpICYgS01PRF9DVFJMKSApCi0JCQkJdW5pY29kZSA9IDA7Ci0JCQlicmVhazsKLQkJCS8qIEtleWJvYXJkIGlucHV0IG1hcHMgbmV3bGluZSB0byBjYXJyaWFnZSByZXR1cm4gKi8KLQkJCWNhc2UgJ1xuJzoKLQkJCQl1bmljb2RlID0gJ1xyJzsKLQkJCWJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIHVuaWNvZGU7Ci0JfQotCi0JdmlydHVhbCB2b2lkIERpc3BhdGNoTWVzc2FnZShCTWVzc2FnZSAqbXNnLCBCSGFuZGxlciAqdGFyZ2V0KTsKLQotcHJpdmF0ZToKLSNpZiBTRExfVklERU9fT1BFTkdMCi0JQkdMVmlldyAqU0RMX0dMVmlldzsKLSNlbmRpZgotCVNETF9CVmlldyAqU0RMX1ZpZXc7Ci0JQlZpZXcgKnRoZV92aWV3OwotCWJvb2wgc2hvd247Ci0JYm9vbCBpbmhpYml0X3Jlc2l6ZTsKLQlpbnQzMiBsYXN0X2J1dHRvbnM7Ci19OwotCi0jZW5kaWYgLyogX1NETF9CV2luX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfbG93dmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfbG93dmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmMDA0Yi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX2xvd3ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2xvd3ZpZGVvX2gKLSNkZWZpbmUgX1NETF9sb3d2aWRlb19oCi0KLSNpbmNsdWRlICJTRExfQldpbi5oIgotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICpfdGhpcwotCi0vKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLwotc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKLQkvKiBUaGUgbWFpbiB3aW5kb3cgKi8KLQlTRExfQldpbiAqU0RMX1dpbjsKLQotCS8qIFRoZSBmdWxsc2NyZWVuIG1vZGUgbGlzdCAqLwotCWRpc3BsYXlfbW9kZSBzYXZlZF9tb2RlOwotI2RlZmluZSBOVU1fTU9ERUxJU1RTCTQJCS8qIDgsIDE2LCAyNCwgYW5kIDMyIGJpdHMtcGVyLXBpeGVsICovCi0JaW50IFNETF9udW1tb2Rlc1tOVU1fTU9ERUxJU1RTXTsKLQlTRExfUmVjdCAqKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXTsKLQotCS8qIEEgY29tcGxldGVseSBjbGVhciBjdXJzb3IgKi8KLQlXTWN1cnNvciAqQmxhbmtDdXJzb3I7Ci0KLQlTRExfT3ZlcmxheSAqb3ZlcmxheTsKLX07Ci0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgU0RMX1dpbgkJKF90aGlzLT5oaWRkZW4tPlNETF9XaW4pCi0jZGVmaW5lIHNhdmVkX21vZGUJKF90aGlzLT5oaWRkZW4tPnNhdmVkX21vZGUpCi0jZGVmaW5lIFNETF9udW1tb2RlcwkoX3RoaXMtPmhpZGRlbi0+U0RMX251bW1vZGVzKQotI2RlZmluZSBTRExfbW9kZWxpc3QJKF90aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKLSNkZWZpbmUgU0RMX0JsYW5rQ3Vyc29yCShfdGhpcy0+aGlkZGVuLT5CbGFua0N1cnNvcikKLSNkZWZpbmUgY3VycmVudF9vdmVybGF5IChfdGhpcy0+aGlkZGVuLT5vdmVybGF5KQotCi0jZW5kaWYgLyogX1NETF9sb3d2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c2V2ZW50cy5jYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzZXZlbnRzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDExYzU3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzZXZlbnRzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3VwcG9ydC9VVEY4Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJTRExfZXJyb3IuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzLmgiCi0jaW5jbHVkZSAiU0RMX0JXaW4uaCIKLSNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKLQotc3RhdGljIFNETEtleSBrZXltYXBbMTI4XTsKLWludCBtb3VzZV9yZWxhdGl2ZSA9IDA7Ci1leHRlcm4gIkMiIHsKLQotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9zeXNldmVudHNfYy5oIgotCi12b2lkIEJFX1B1bXBFdmVudHMoX1RISVMpCi17Ci19Ci0KLXZvaWQgQkVfSW5pdE9TS2V5bWFwKF9USElTKQotewotCQlmb3IgKCB1aW50IGk9MDsgaTxTRExfVEFCTEVTSVpFKGtleW1hcCk7ICsraSApCi0JCQlrZXltYXBbaV0gPSBTRExLX1VOS05PV047Ci0KLQkJa2V5bWFwWzB4MDFdCQk9IFNETEtfRVNDQVBFOwotCQlrZXltYXBbQl9GMV9LRVldCT0gU0RMS19GMTsKLQkJa2V5bWFwW0JfRjJfS0VZXQk9IFNETEtfRjI7Ci0JCWtleW1hcFtCX0YzX0tFWV0JPSBTRExLX0YzOwotCQlrZXltYXBbQl9GNF9LRVldCT0gU0RMS19GNDsKLQkJa2V5bWFwW0JfRjVfS0VZXQk9IFNETEtfRjU7Ci0JCWtleW1hcFtCX0Y2X0tFWV0JPSBTRExLX0Y2OwotCQlrZXltYXBbQl9GN19LRVldCT0gU0RMS19GNzsKLQkJa2V5bWFwW0JfRjhfS0VZXQk9IFNETEtfRjg7Ci0JCWtleW1hcFtCX0Y5X0tFWV0JPSBTRExLX0Y5OwotCQlrZXltYXBbQl9GMTBfS0VZXQk9IFNETEtfRjEwOwotCQlrZXltYXBbQl9GMTFfS0VZXQk9IFNETEtfRjExOwotCQlrZXltYXBbQl9GMTJfS0VZXQk9IFNETEtfRjEyOwotCQlrZXltYXBbQl9QUklOVF9LRVldCT0gU0RMS19QUklOVDsKLQkJa2V5bWFwW0JfU0NST0xMX0tFWV0JPSBTRExLX1NDUk9MTE9DSzsKLQkJa2V5bWFwW0JfUEFVU0VfS0VZXQk9IFNETEtfUEFVU0U7Ci0JCWtleW1hcFsweDExXQkJPSBTRExLX0JBQ0tRVU9URTsKLQkJa2V5bWFwWzB4MTJdCQk9IFNETEtfMTsKLQkJa2V5bWFwWzB4MTNdCQk9IFNETEtfMjsKLQkJa2V5bWFwWzB4MTRdCQk9IFNETEtfMzsKLQkJa2V5bWFwWzB4MTVdCQk9IFNETEtfNDsKLQkJa2V5bWFwWzB4MTZdCQk9IFNETEtfNTsKLQkJa2V5bWFwWzB4MTddCQk9IFNETEtfNjsKLQkJa2V5bWFwWzB4MThdCQk9IFNETEtfNzsKLQkJa2V5bWFwWzB4MTldCQk9IFNETEtfODsKLQkJa2V5bWFwWzB4MWFdCQk9IFNETEtfOTsKLQkJa2V5bWFwWzB4MWJdCQk9IFNETEtfMDsKLQkJa2V5bWFwWzB4MWNdCQk9IFNETEtfTUlOVVM7Ci0JCWtleW1hcFsweDFkXQkJPSBTRExLX0VRVUFMUzsKLQkJa2V5bWFwWzB4MWVdCQk9IFNETEtfQkFDS1NQQUNFOwotCQlrZXltYXBbMHgxZl0JCT0gU0RMS19JTlNFUlQ7Ci0JCWtleW1hcFsweDIwXQkJPSBTRExLX0hPTUU7Ci0JCWtleW1hcFsweDIxXQkJPSBTRExLX1BBR0VVUDsKLQkJa2V5bWFwWzB4MjJdCQk9IFNETEtfTlVNTE9DSzsKLQkJa2V5bWFwWzB4MjNdCQk9IFNETEtfS1BfRElWSURFOwotCQlrZXltYXBbMHgyNF0JCT0gU0RMS19LUF9NVUxUSVBMWTsKLQkJa2V5bWFwWzB4MjVdCQk9IFNETEtfS1BfTUlOVVM7Ci0JCWtleW1hcFsweDI2XQkJPSBTRExLX1RBQjsKLQkJa2V5bWFwWzB4MjddCQk9IFNETEtfcTsKLQkJa2V5bWFwWzB4MjhdCQk9IFNETEtfdzsKLQkJa2V5bWFwWzB4MjldCQk9IFNETEtfZTsKLQkJa2V5bWFwWzB4MmFdCQk9IFNETEtfcjsKLQkJa2V5bWFwWzB4MmJdCQk9IFNETEtfdDsKLQkJa2V5bWFwWzB4MmNdCQk9IFNETEtfeTsKLQkJa2V5bWFwWzB4MmRdCQk9IFNETEtfdTsKLQkJa2V5bWFwWzB4MmVdCQk9IFNETEtfaTsKLQkJa2V5bWFwWzB4MmZdCQk9IFNETEtfbzsKLQkJa2V5bWFwWzB4MzBdCQk9IFNETEtfcDsKLQkJa2V5bWFwWzB4MzFdCQk9IFNETEtfTEVGVEJSQUNLRVQ7Ci0JCWtleW1hcFsweDMyXQkJPSBTRExLX1JJR0hUQlJBQ0tFVDsKLQkJa2V5bWFwWzB4MzNdCQk9IFNETEtfQkFDS1NMQVNIOwotCQlrZXltYXBbMHgzNF0JCT0gU0RMS19ERUxFVEU7Ci0JCWtleW1hcFsweDM1XQkJPSBTRExLX0VORDsKLQkJa2V5bWFwWzB4MzZdCQk9IFNETEtfUEFHRURPV047Ci0JCWtleW1hcFsweDM3XQkJPSBTRExLX0tQNzsKLQkJa2V5bWFwWzB4MzhdCQk9IFNETEtfS1A4OwotCQlrZXltYXBbMHgzOV0JCT0gU0RMS19LUDk7Ci0JCWtleW1hcFsweDNhXQkJPSBTRExLX0tQX1BMVVM7Ci0JCWtleW1hcFsweDNiXQkJPSBTRExLX0NBUFNMT0NLOwotCQlrZXltYXBbMHgzY10JCT0gU0RMS19hOwotCQlrZXltYXBbMHgzZF0JCT0gU0RMS19zOwotCQlrZXltYXBbMHgzZV0JCT0gU0RMS19kOwotCQlrZXltYXBbMHgzZl0JCT0gU0RMS19mOwotCQlrZXltYXBbMHg0MF0JCT0gU0RMS19nOwotCQlrZXltYXBbMHg0MV0JCT0gU0RMS19oOwotCQlrZXltYXBbMHg0Ml0JCT0gU0RMS19qOwotCQlrZXltYXBbMHg0M10JCT0gU0RMS19rOwotCQlrZXltYXBbMHg0NF0JCT0gU0RMS19sOwotCQlrZXltYXBbMHg0NV0JCT0gU0RMS19TRU1JQ09MT047Ci0JCWtleW1hcFsweDQ2XQkJPSBTRExLX1FVT1RFOwotCQlrZXltYXBbMHg0N10JCT0gU0RMS19SRVRVUk47Ci0JCWtleW1hcFsweDQ4XQkJPSBTRExLX0tQNDsKLQkJa2V5bWFwWzB4NDldCQk9IFNETEtfS1A1OwotCQlrZXltYXBbMHg0YV0JCT0gU0RMS19LUDY7Ci0JCWtleW1hcFsweDRiXQkJPSBTRExLX0xTSElGVDsKLQkJa2V5bWFwWzB4NGNdCQk9IFNETEtfejsKLQkJa2V5bWFwWzB4NGRdCQk9IFNETEtfeDsKLQkJa2V5bWFwWzB4NGVdCQk9IFNETEtfYzsKLQkJa2V5bWFwWzB4NGZdCQk9IFNETEtfdjsKLQkJa2V5bWFwWzB4NTBdCQk9IFNETEtfYjsKLQkJa2V5bWFwWzB4NTFdCQk9IFNETEtfbjsKLQkJa2V5bWFwWzB4NTJdCQk9IFNETEtfbTsKLQkJa2V5bWFwWzB4NTNdCQk9IFNETEtfQ09NTUE7Ci0JCWtleW1hcFsweDU0XQkJPSBTRExLX1BFUklPRDsKLQkJa2V5bWFwWzB4NTVdCQk9IFNETEtfU0xBU0g7Ci0JCWtleW1hcFsweDU2XQkJPSBTRExLX1JTSElGVDsKLQkJa2V5bWFwWzB4NTddCQk9IFNETEtfVVA7Ci0JCWtleW1hcFsweDU4XQkJPSBTRExLX0tQMTsKLQkJa2V5bWFwWzB4NTldCQk9IFNETEtfS1AyOwotCQlrZXltYXBbMHg1YV0JCT0gU0RMS19LUDM7Ci0JCWtleW1hcFsweDViXQkJPSBTRExLX0tQX0VOVEVSOwotCQlrZXltYXBbMHg1Y10JCT0gU0RMS19MQ1RSTDsKLQkJa2V5bWFwWzB4NWRdCQk9IFNETEtfTEFMVDsKLQkJa2V5bWFwWzB4NWVdCQk9IFNETEtfU1BBQ0U7Ci0JCWtleW1hcFsweDVmXQkJPSBTRExLX1JBTFQ7Ci0JCWtleW1hcFsweDYwXQkJPSBTRExLX1JDVFJMOwotCQlrZXltYXBbMHg2MV0JCT0gU0RMS19MRUZUOwotCQlrZXltYXBbMHg2Ml0JCT0gU0RMS19ET1dOOwotCQlrZXltYXBbMHg2M10JCT0gU0RMS19SSUdIVDsKLQkJa2V5bWFwWzB4NjRdCQk9IFNETEtfS1AwOwotCQlrZXltYXBbMHg2NV0JCT0gU0RMS19LUF9QRVJJT0Q7Ci0JCWtleW1hcFsweDY2XQkJPSBTRExLX0xNRVRBOwotCQlrZXltYXBbMHg2N10JCT0gU0RMS19STUVUQTsKLQkJa2V5bWFwWzB4NjhdCQk9IFNETEtfTUVOVTsKLQkJa2V5bWFwWzB4NjldCQk9IFNETEtfRVVSTzsKLQkJa2V5bWFwWzB4NmFdCQk9IFNETEtfS1BfRVFVQUxTOwotCQlrZXltYXBbMHg2Yl0JCT0gU0RMS19QT1dFUjsKLX0KLQotfTsgLyogRXh0ZXJuIEMgKi8KLQotdm9pZCBTRExfQldpbjo6RGlzcGF0Y2hNZXNzYWdlKEJNZXNzYWdlICptc2csIEJIYW5kbGVyICp0YXJnZXQpCi17Ci0Jc3dpdGNoIChtc2ctPndoYXQpIHsKLQkJY2FzZSBCX01PVVNFX01PVkVEOgotCQl7Ci0JCQlTRExfVmlkZW9EZXZpY2UgKnZpZXcgPSBjdXJyZW50X3ZpZGVvOwotCQkJQlBvaW50IHdoZXJlOwotCQkJaW50MzIgdHJhbnNpdDsKLQkJCWlmIChtc2ctPkZpbmRQb2ludCgid2hlcmUiLCAmd2hlcmUpID09IEJfT0sgJiYgbXNnLT5GaW5kSW50MzIoImJlOnRyYW5zaXQiLCAmdHJhbnNpdCkgPT0gQl9PSykgewotCQkJCWludCB4LCB5OwotCi0JCQkJR2V0WFlPZmZzZXQoeCwgeSk7Ci0JCQkJeCA9IChpbnQpd2hlcmUueCAtIHg7Ci0JCQkJeSA9IChpbnQpd2hlcmUueSAtIHk7Ci0KLQkJCQkvL0JlU21hbjogSSBuZWVkIGFub3RoZXIgbWV0aG9kIGZvciBjdXJzb3IgY2F0Y2hpbmcgISEhCi0JCQkJaWYgKHZpZXctPmlucHV0X2dyYWIgIT0gU0RMX0dSQUJfT0ZGKQotCQkJCXsKLQkJCQkJYm9vbCBjbGlwcGVkID0gZmFsc2U7Ci0JCQkJCWlmICggeCA8IDAgKSB7Ci0JCQkJCQl4ID0gMDsKLQkJCQkJCWNsaXBwZWQgPSB0cnVlOwotCQkJCQl9IGVsc2UgaWYgKCB4ID49IFNETF9WaWRlb1N1cmZhY2UtPncgKSB7Ci0JCQkJCQl4ID0gKFNETF9WaWRlb1N1cmZhY2UtPnctMSk7Ci0JCQkJCQljbGlwcGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoIHkgPCAwICkgewotCQkJCQkJeSA9IDA7Ci0JCQkJCQljbGlwcGVkID0gdHJ1ZTsKLQkJCQkJfSBlbHNlIGlmICggeSA+PSBTRExfVmlkZW9TdXJmYWNlLT5oICkgewotCQkJCQkJeSA9IChTRExfVmlkZW9TdXJmYWNlLT5oLTEpOwotCQkJCQkJY2xpcHBlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKCBjbGlwcGVkICkgewotCQkJCQkJQlBvaW50IGVkZ2U7Ci0JCQkJCQlHZXRYWU9mZnNldChlZGdlLngsIGVkZ2UueSk7Ci0JCQkJCQllZGdlLnggKz0geDsKLQkJCQkJCWVkZ2UueSArPSB5OwotCQkJCQkJQ29udmVydFRvU2NyZWVuKCZlZGdlKTsKLQkJCQkJCXNldF9tb3VzZV9wb3NpdGlvbigoaW50KWVkZ2UueCwgKGludCllZGdlLnkpOwotCQkJCQl9Ci0JCQkJCXRyYW5zaXQgPSBCX0lOU0lERV9WSUVXOwotCQkJCX0KLQkJCQlpZiAodHJhbnNpdCA9PSBCX0VYSVRFRF9WSUVXKSB7Ci0JCQkJCWlmICggU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUyApIHsKLQkJCQkJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQkJCQkJCWJlX2FwcC0+U2V0Q3Vyc29yKEJfSEFORF9DVVJTT1IpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCAhKFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUE1PVVNFRk9DVVMpICkgewotCQkJCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOwotCQkJCQkJU0RMX1NldEN1cnNvcihOVUxMKTsKLQkJCQkJfQotCi0JCQkJCWlmICggbW91c2VfcmVsYXRpdmUgKSB7Ci0JCQkJCQlpbnQgaGFsZl93ID0gKFNETF9WaWRlb1N1cmZhY2UtPncvMik7Ci0JCQkJCQlpbnQgaGFsZl9oID0gKFNETF9WaWRlb1N1cmZhY2UtPmgvMik7Ci0JCQkJCQl4IC09IGhhbGZfdzsKLQkJCQkJCXkgLT0gaGFsZl9oOwotCQkJCQkJaWYgKCB4IHx8IHkgKSB7Ci0JCQkJCQkJQlBvaW50IGNlbnRlcjsKLQkJCQkJCQlHZXRYWU9mZnNldChjZW50ZXIueCwgY2VudGVyLnkpOwotCQkJCQkJCWNlbnRlci54ICs9IGhhbGZfdzsKLQkJCQkJCQljZW50ZXIueSArPSBoYWxmX2g7Ci0JCQkJCQkJQ29udmVydFRvU2NyZWVuKCZjZW50ZXIpOwotCQkJCQkJCXNldF9tb3VzZV9wb3NpdGlvbigoaW50KWNlbnRlci54LCAoaW50KWNlbnRlci55KTsKLQkJCQkJCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDEsIHgsIHkpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCB4LCB5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBCX01PVVNFX0RPV046Ci0JCXsKLQkJCS8qCWl0IGxvb2tzIGxpa2UgbW91c2UgZG93biBpcyBzZW5kIG9ubHkgZm9yIGZpcnN0IGNsaWNrZWQKLQkJCQlidXR0b24sIGVhY2ggbmV4dCBpcyBub3Qgc2VuZCB3aGlsZSBsYXN0IG9uZSBpcyBob2xkZWQgKi8KLQkJCWludDMyIGJ1dHRvbnM7Ci0JCQlpbnQgc2RsX2J1dHRvbnMgPSAwOwotCQkJaWYgKG1zZy0+RmluZEludDMyKCJidXR0b25zIiwgJmJ1dHRvbnMpID09IEJfT0spIHsKLQkJCQkvKiBBZGQgYW55IG1vdXNlIGJ1dHRvbiBldmVudHMgKi8KLQkJCQlpZiAoYnV0dG9ucyAmIEJfUFJJTUFSWV9NT1VTRV9CVVRUT04pIHsKLQkJCQkJc2RsX2J1dHRvbnMgfD0gU0RMX0JVVFRPTl9MRUZUOwotCQkJCX0KLQkJCQlpZiAoYnV0dG9ucyAmIEJfU0VDT05EQVJZX01PVVNFX0JVVFRPTikgewotCQkJCQlzZGxfYnV0dG9ucyB8PSBTRExfQlVUVE9OX1JJR0hUOwotCQkJCX0KLQkJCQlpZiAoYnV0dG9ucyAmIEJfVEVSVElBUllfTU9VU0VfQlVUVE9OKSB7Ci0JCQkJCXNkbF9idXR0b25zIHw9IFNETF9CVVRUT05fTUlERExFOwotCQkJCX0KLQkJCQlTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBzZGxfYnV0dG9ucywgMCwgMCk7Ci0KLQkJCQlsYXN0X2J1dHRvbnMgPSBidXR0b25zOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIEJfTU9VU0VfVVA6Ci0JCXsKLQkJCS8qCW1vdXNlIHVwIGRvZXNuJ3QgZ2l2ZSB3aGljaCBidXR0b24gd2FzIHJlbGVhc2VkLAotCQkJCW9ubHkgc3RhdGUgb2YgYnV0dG9ucyAoYWZ0ZXIgcmVsZWFzZSwgc28gaXQncyBhbHdheXMgPSAwKSwKLQkJCQl3aGljaCBpcyBub3Qgd2hhdCB3ZSBuZWVkIDtdCi0JCQkJU28gd2UgbmVlZCB0byBzdG9yZSBidXR0b24gaW4gbW91c2UgZG93biwgYW5kIHJlc3RvcmUKLQkJCQlpbiBtb3VzZSB1cCA6KAotCQkJCW1vdXNlIHVwIGlzIChzaW1pbGFybHkgdG8gbW91c2UgZG93bikgc2VuZCBvbmx5IGZvcgotCQkJCWZpcnN0IGJ1dHRvbiBkb3duIChpZS4gaXQncyBubyBzZW5kIGlmIHdlIGNsaWNrIGFub3RoZXIgYnV0dG9uCi0JCQkJd2l0aG91dCByZWxlYXNpbmcgcHJldmlvdXMgb25lIGZpcnN0KSAtIGJ1dCB0aGF0J3MgcHJvYmFibHkKLQkJCQliZWNhdXNlIG9mIGhvdyBkcml2ZXJzIGFyZSB3cml0dGVuPywgbm90IEJlT1MgaXRzZWxmLiAqLwotCQkJaW50MzIgYnV0dG9uczsKLQkJCWludCBzZGxfYnV0dG9ucyA9IDA7Ci0JCQlpZiAobXNnLT5GaW5kSW50MzIoImJ1dHRvbnMiLCAmYnV0dG9ucykgPT0gQl9PSykgewotCQkJCS8qIEFkZCBhbnkgbW91c2UgYnV0dG9uIGV2ZW50cyAqLwotCQkJCWlmICgoYnV0dG9ucyBeIEJfUFJJTUFSWV9NT1VTRV9CVVRUT04pICYgbGFzdF9idXR0b25zKSB7Ci0JCQkJCXNkbF9idXR0b25zIHw9IFNETF9CVVRUT05fTEVGVDsKLQkJCQl9Ci0JCQkJaWYgKChidXR0b25zIF4gQl9TRUNPTkRBUllfTU9VU0VfQlVUVE9OKSAmIGxhc3RfYnV0dG9ucykgewotCQkJCQlzZGxfYnV0dG9ucyB8PSBTRExfQlVUVE9OX1JJR0hUOwotCQkJCX0KLQkJCQlpZiAoKGJ1dHRvbnMgXiBCX1RFUlRJQVJZX01PVVNFX0JVVFRPTikgJiBsYXN0X2J1dHRvbnMpIHsKLQkJCQkJc2RsX2J1dHRvbnMgfD0gU0RMX0JVVFRPTl9NSURETEU7Ci0JCQkJfQotCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBzZGxfYnV0dG9ucywgMCwgMCk7Ci0KLQkJCQlsYXN0X2J1dHRvbnMgPSBidXR0b25zOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIEJfTU9VU0VfV0hFRUxfQ0hBTkdFRDoKLQkJewotCQkJZmxvYXQgeCwgeTsKLQkJCXggPSB5ID0gMDsKLQkJCWlmIChtc2ctPkZpbmRGbG9hdCgiYmU6d2hlZWxfZGVsdGFfeCIsICZ4KSA9PSBCX09LICYmIG1zZy0+RmluZEZsb2F0KCJiZTp3aGVlbF9kZWx0YV95IiwgJnkpID09IEJfT0spIHsKLQkJCQlpZiAoeCA8IDAgfHwgeSA8IDApIHsKLQkJCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgU0RMX0JVVFRPTl9XSEVFTERPV04sIDAsIDApOwotCQkJCQlTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgU0RMX0JVVFRPTl9XSEVFTERPV04sIDAsIDApOwotCQkJCX0gZWxzZSBpZiAoeCA+IDAgfHwgeSA+IDApIHsKLQkJCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgU0RMX0JVVFRPTl9XSEVFTFVQLCAwLCAwKTsKLQkJCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIFNETF9CVVRUT05fV0hFRUxVUCwgMCwgMCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIEJfS0VZX0RPV046Ci0JCWNhc2UgQl9VTk1BUFBFRF9LRVlfRE9XTjogLyogbW9kaWZpZXIga2V5cyBhcmUgdW5tYXBwZWQgKi8KLQkJewotCQkJaW50MzIga2V5OwotCQkJaW50MzIgbW9kaWZpZXJzOwotCQkJaW50MzIga2V5X3JlcGVhdDsKLQkJCS8qIFdvcmthcm91bmQgZm9yIFNETCBtZXNzYWdlIHF1ZXVlIGJlaW5nIGZpbGxlZCB0b28gZmFzdCBiZWNhdXNlIG9mIEJlT1Mgb3duIGtleS1yZXBlYXQgbWVjaGFuaXNtICovCi0JCQlpZiAobXNnLT5GaW5kSW50MzIoImJlOmtleV9yZXBlYXQiLCAma2V5X3JlcGVhdCkgPT0gQl9PSyAmJiBrZXlfcmVwZWF0ID4gMCkKLQkJCQlicmVhazsKLQotCQkJaWYgKG1zZy0+RmluZEludDMyKCJrZXkiLCAma2V5KSA9PSBCX09LICYmIG1zZy0+RmluZEludDMyKCJtb2RpZmllcnMiLCAmbW9kaWZpZXJzKSA9PSBCX09LKSB7Ci0JCQkJU0RMX2tleXN5bSBrZXlzeW07Ci0JCQkJa2V5c3ltLnNjYW5jb2RlID0ga2V5OwotCQkJCWlmIChrZXkgPCAxMjgpIHsKLQkJCQkJa2V5c3ltLnN5bSA9IGtleW1hcFtrZXldOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWtleXN5bS5zeW0gPSBTRExLX1VOS05PV047Ci0JCQkJfQotCQkJCS8qCUZJWCBUSElTPwotCQkJCQlpdCBzZWVtcyBTRExfUHJpdmF0ZUtleWJvYXJkKCkgY2hhbmdlcyBtb2QgdmFsdWUKLQkJCQkJYW55d2F5LCBhbmQgZG9lc24ndCBjYXJlIGFib3V0IHdoYXQgd2Ugc2V0dXAgaGVyZSAqLwotCQkJCWtleXN5bS5tb2QgPSBLTU9EX05PTkU7Ci0JCQkJa2V5c3ltLnVuaWNvZGUgPSAwOwotCQkJCWlmIChTRExfVHJhbnNsYXRlVU5JQ09ERSkgewotCQkJCQljb25zdCBjaGFyICpieXRlczsKLQkJCQkJaWYgKG1zZy0+RmluZFN0cmluZygiYnl0ZXMiLCAmYnl0ZXMpID09IEJfT0spIHsKLQkJCQkJCS8qCUZJWCBUSElTPwotCQkJCQkJCXRoaXMgY2FyZXMgb25seSBhYm91dCBmaXJzdCAibGV0dGVyIiwKLQkJCQkJCQlzbyBpZiBzb21lb25lIG1hcHMgc29tZSBrZXkgdG8gcHJpbnQKLQkJCQkJCQkiQmVPUyBydWxleiEiIG9ubHkgIkIiIHdpbGwgYmUgdXNlZC4gKi8KLQkJCQkJCWtleXN5bS51bmljb2RlID0gVHJhbnNsYXRlMlVuaWNvZGUoYnl0ZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsICZrZXlzeW0pOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIEJfS0VZX1VQOgotCQljYXNlIEJfVU5NQVBQRURfS0VZX1VQOiAvKiBtb2RpZmllciBrZXlzIGFyZSB1bm1hcHBlZCAqLwotCQl7Ci0JCQlpbnQzMiBrZXk7Ci0JCQlpbnQzMiBtb2RpZmllcnM7Ci0JCQlpZiAobXNnLT5GaW5kSW50MzIoImtleSIsICZrZXkpID09IEJfT0sgJiYgbXNnLT5GaW5kSW50MzIoIm1vZGlmaWVycyIsICZtb2RpZmllcnMpID09IEJfT0spIHsKLQkJCQlTRExfa2V5c3ltIGtleXN5bTsKLQkJCQlrZXlzeW0uc2NhbmNvZGUgPSBrZXk7Ci0JCQkJaWYgKGtleSA8IDEyOCkgewotCQkJCQlrZXlzeW0uc3ltID0ga2V5bWFwW2tleV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJa2V5c3ltLnN5bSA9IFNETEtfVU5LTk9XTjsKLQkJCQl9Ci0JCQkJa2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsgLyogRklYIFRISVM/ICovCi0JCQkJa2V5c3ltLnVuaWNvZGUgPSAwOwotCQkJCWlmIChTRExfVHJhbnNsYXRlVU5JQ09ERSkgewotCQkJCQljb25zdCBjaGFyICpieXRlczsKLQkJCQkJaWYgKG1zZy0+RmluZFN0cmluZygiYnl0ZXMiLCAmYnl0ZXMpID09IEJfT0spIHsKLQkJCQkJCWtleXN5bS51bmljb2RlID0gVHJhbnNsYXRlMlVuaWNvZGUoYnl0ZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELCAma2V5c3ltKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJZGVmYXVsdDoKLQkJCS8qIG1vdmUgaXQgYWZ0ZXIgc3dpdGNoe30gc28gaXQncyBhbHdheXMgaGFuZGxlZAotCQkJCXRoYXQgd2F5IHdlIGtlZXAgQmVPUyBmZWF1dHVyZXMgbGlrZToKLQkJCQktIENUUkwrUSB0byBjbG9zZSB3aW5kb3cgKGFuZCBvdGhlciBzaG9ydGN1dHMpCi0JCQkJLSBQcmludFNjcmVlbiB0byBtYWtlIHNjcmVlbnNob3QgaW50byAvYm9vdC9ob21lCi0JCQkJLSBldGMuLiAqLwotCQkJLy9CRGlyZWN0V2luZG93OjpEaXNwYXRjaE1lc3NhZ2UobXNnLCB0YXJnZXQpOwotCQkJYnJlYWs7Ci0JfQotCUJEaXJlY3RXaW5kb3c6OkRpc3BhdGNoTWVzc2FnZShtc2csIHRhcmdldCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c2V2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZWYzZjUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9zeXNldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKLQotLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAotICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQotKi8KLQotZXh0ZXJuIHZvaWQgQkVfSW5pdE9TS2V5bWFwKF9USElTKTsKLWV4dGVybiB2b2lkIEJFX1B1bXBFdmVudHMoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9zeXNtb3VzZS5jYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzbW91c2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjE4NmQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9zeXNtb3VzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgPEFwcEtpdC5oPgotI2luY2x1ZGUgPEdhbWVLaXQuaD4KLQotI2luY2x1ZGUgIlNETF9CV2luLmgiCi0KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIi4uL1NETF9jdXJzb3JfYy5oIgotI2luY2x1ZGUgIlNETF9zeXNtb3VzZV9jLmgiCi0KLS8qIENvbnZlcnQgYml0cyB0byBwYWRkZWQgYnl0ZXMgKi8KLSNkZWZpbmUgUEFEREVEX0JJVFMoYml0cykgICgoYml0cys3KS84KQotCi0vKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KLXN0cnVjdCBXTWN1cnNvciB7Ci0JY2hhciAqYml0czsKLX07Ci0KLS8qIENhbiB0aGlzIGJlIGRvbmUgaW4gdGhlIEJlT1M/ICovCi1XTWN1cnNvciAqQkVfQ3JlYXRlV01DdXJzb3IoX1RISVMsCi0JCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKLXsKLQlXTWN1cnNvciAqY3Vyc29yOwotCWludCBhbGxvd2VkX3g7Ci0JaW50IGFsbG93ZWRfeTsKLQlpbnQgcnVuLCBwYWQsIGk7Ci0JY2hhciAqY3B0cjsKLQotCWFsbG93ZWRfeCA9IDE2OwkvKiBCZU9TIGxpbWl0YXRpb24gKi8KLQlhbGxvd2VkX3kgPSAxNjsJLyogQmVPUyBsaW1pdGF0aW9uICovCi0JaWYgKCAodyA+IGFsbG93ZWRfeCkgfHwgKGggPiBhbGxvd2VkX3kpICkgewotCQlTRExfU2V0RXJyb3IoIk9ubHkgY3Vyc29ycyBvZiBkaW1lbnNpb24gKCVkeCVkKSBhcmUgYWxsb3dlZCIsCi0JCQkJCQkJYWxsb3dlZF94LCBhbGxvd2VkX3kpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogQWxsb2NhdGUgdGhlIGN1cnNvciAqLwotCWN1cnNvciA9IChXTWN1cnNvciAqKVNETF9tYWxsb2Moc2l6ZW9mKFdNY3Vyc29yKSk7Ci0JaWYgKCBjdXJzb3IgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JY3Vyc29yLT5iaXRzID0gKGNoYXIgKilTRExfbWFsbG9jKDQrMiooKGFsbG93ZWRfeC84KSphbGxvd2VkX3kpKTsKLQlpZiAoIGN1cnNvci0+Yml0cyA9PSBOVUxMICkgewotCQlTRExfZnJlZShjdXJzb3IpOwotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQljdXJzb3ItPmJpdHNbMF0gPSBhbGxvd2VkX3k7CQkvKiBTaXplIG9mIHRoZSBjdXJzb3IgKi8KLQljdXJzb3ItPmJpdHNbMV0gPSAxOwkJCS8qIEJpdCBkZXB0aCBvZiBjdXJzb3IgKi8KLQljdXJzb3ItPmJpdHNbMl0gPSBob3RfeTsKLQljdXJzb3ItPmJpdHNbM10gPSBob3RfeDsKLQljcHRyID0gJmN1cnNvci0+Yml0c1s0XTsKLQotCS8qIFBhZCBvdXQgdG8gdGhlIG5vcm1hbCBjdXJzb3Igc2l6ZSAqLwotCXJ1biA9IFBBRERFRF9CSVRTKHcpOwotCXBhZCA9IFBBRERFRF9CSVRTKGFsbG93ZWRfeCktcnVuOwotCWZvciAoIGk9MDsgaTxoOyArK2kgKSB7Ci0JCVNETF9tZW1jcHkoY3B0ciwgZGF0YSwgcnVuKTsKLQkJU0RMX21lbXNldChjcHRyK3J1biwgMCwgcGFkKTsKLQkJZGF0YSArPSBydW47Ci0JCWNwdHIgKz0gKHJ1bitwYWQpOwotCX0KLQlmb3IgKCA7IGk8YWxsb3dlZF95OyArK2kgKSB7Ci0JCVNETF9tZW1zZXQoY3B0ciwgMCwgcnVuK3BhZCk7Ci0JCWNwdHIgKz0gKHJ1bitwYWQpOwotCX0KLQlmb3IgKCBpPTA7IGk8aDsgKytpICkgewotCQkvKiBGSVhNRTogVGhlIG1hc2sgc2hvdWxkIGJlIE9SJ2Qgd2l0aCB0aGUgZGF0YSB0byB0dXJuIAotCQkgICBpbnZlcnRlZCBjb2xvciBwaXhlbHMgYmxhY2ssIHNpbmNlIGludmVydGVkIGNvbG9yIHBpeGVscwotCQkgICBhcmVuJ3Qgc3VwcG9ydGVkIHVuZGVyIEJlT1MuCi0JCSAqLwotCQlTRExfbWVtY3B5KGNwdHIsIG1hc2ssIHJ1bik7Ci0JCVNETF9tZW1zZXQoY3B0citydW4sIDAsIHBhZCk7Ci0JCW1hc2sgKz0gcnVuOwotCQljcHRyICs9IChydW4rcGFkKTsKLQl9Ci0JZm9yICggOyBpPGFsbG93ZWRfeTsgKytpICkgewotCQlTRExfbWVtc2V0KGNwdHIsIDAsIHJ1bitwYWQpOwotCQljcHRyICs9IChydW4rcGFkKTsKLQl9Ci0JcmV0dXJuKGN1cnNvcik7Ci19Ci0KLWludCBCRV9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCi17Ci0JaWYgKCBiZV9hcHAtPkxvY2soKSApIHsKLQkJaWYgKCBjdXJzb3IgPT0gTlVMTCApIHsKLQkJCWlmICggU0RMX0JsYW5rQ3Vyc29yICE9IE5VTEwgKSB7Ci0JCQkJYmVfYXBwLT5TZXRDdXJzb3IoU0RMX0JsYW5rQ3Vyc29yLT5iaXRzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJlX2FwcC0+U2V0Q3Vyc29yKGN1cnNvci0+Yml0cyk7Ci0JCX0KLQkJYmVfYXBwLT5VbmxvY2soKTsKLQl9Ci0JcmV0dXJuKDEpOwotfQotCi12b2lkIEJFX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKLXsKLQlTRExfZnJlZShjdXJzb3ItPmJpdHMpOwotCVNETF9mcmVlKGN1cnNvcik7Ci19Ci0KLS8qIEltcGxlbWVudGF0aW9uIGJ5IENocmlzdGlhbiBCYXVlciA8Y2JhdWVyQHN0dWRlbnQucGh5c2lrLnVuaS1tYWluei5kZT4gKi8KLXZvaWQgQkVfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCi17Ci0JQlBvaW50IHB0OwotCVNETF9XaW4tPkdldFhZT2Zmc2V0KHB0LngsIHB0LnkpOwotCXB0LnggKz0geDsKLQlwdC55ICs9IHk7Ci0JU0RMX1dpbi0+TG9jaygpOwotCVNETF9XaW4tPkNvbnZlcnRUb1NjcmVlbigmcHQpOwotCVNETF9XaW4tPlVubG9jaygpOwotCXNldF9tb3VzZV9wb3NpdGlvbigoaW50MzIpcHQueCwgKGludDMyKXB0LnkpOwotfQotCi0vKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBlbnRlciBvciBsZWF2ZSBtb3VzZSByZWxhdGl2ZSBtb2RlICovCi12b2lkIEJFX0NoZWNrTW91c2VNb2RlKF9USElTKQotewotICAgICAgICAvKiBJZiB0aGUgbW91c2UgaXMgaGlkZGVuIGFuZCBpbnB1dCBpcyBncmFiYmVkLCB3ZSB1c2UgcmVsYXRpdmUgbW9kZSAqLwotICAgICAgICBpZiAoICEoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICYmCi0gICAgICAgICAgICAgKF90aGlzLT5pbnB1dF9ncmFiICE9IFNETF9HUkFCX09GRikgKSB7Ci0gICAgICAgICAgICAgICAgbW91c2VfcmVsYXRpdmUgPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1vdXNlX3JlbGF0aXZlID0gMDsKLSAgICAgICAgfQotfQotCi19OyAvKiBFeHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9zeXNtb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c21vdXNlX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0ODQ0ZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c21vdXNlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX2xvd3ZpZGVvLmgiCi0KLS8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLwotZXh0ZXJuIHZvaWQgQkVfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiBXTWN1cnNvciAqQkVfQ3JlYXRlV01DdXJzb3IoX1RISVMsCi0JCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSk7Ci1leHRlcm4gaW50IEJFX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7Ci1leHRlcm4gdm9pZCBCRV9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci1leHRlcm4gdm9pZCBCRV9DaGVja01vdXNlTW9kZShfVEhJUyk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzdmlkZW8uY2MgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3ZpZGVvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWVkZWM2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzdmlkZW8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MjkgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEJXaW5kb3cgYmFzZWQgZnJhbWVidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiU0RMX0JXaW4uaCIKLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLQotZXh0ZXJuICJDIiB7Ci0KLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3N5c2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3N5c21vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfc3lzd21fYy5oIgotI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgotI2luY2x1ZGUgIi4uL1NETF95dXZmdW5jcy5oIgotI2luY2x1ZGUgIlNETF9zeXN5dXYuaCIKLSNpbmNsdWRlICIuLi9ibGFua19jdXJzb3IuaCIKLQotI2RlZmluZSBCRU9TX0hJRERFTl9TSVpFCTMyCS8qIHN0YXJ0aW5nIGhpZGRlbiB3aW5kb3cgc2l6ZSAqLwotCi0vKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgQkVfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOwotc3RhdGljIFNETF9SZWN0ICoqQkVfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqQkVfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIHZvaWQgQkVfVXBkYXRlTW91c2UoX1RISVMpOwotc3RhdGljIGludCBCRV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpOwotc3RhdGljIHZvaWQgQkVfVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgQkVfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgQkVfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgQkVfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBCRV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0KLXN0YXRpYyBpbnQgQkVfVG9nZ2xlRnVsbFNjcmVlbihfVEhJUywgaW50IGZ1bGxzY3JlZW4pOwotc3RhdGljIFNETF9PdmVybGF5ICpCRV9DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KTsKLQotLyogT3BlbkdMIGZ1bmN0aW9ucyAqLwotI2lmIFNETF9WSURFT19PUEVOR0wKLXN0YXRpYyBpbnQgQkVfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIgKnBhdGgpOwotc3RhdGljIHZvaWQqIEJFX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyICpwcm9jKTsKLXN0YXRpYyBpbnQgQkVfR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSk7Ci1zdGF0aWMgaW50IEJFX0dMX01ha2VDdXJyZW50KF9USElTKTsKLXN0YXRpYyB2b2lkIEJFX0dMX1N3YXBCdWZmZXJzKF9USElTKTsKLSNlbmRpZgotCi0vKiBGQiBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEJFX0F2YWlsYWJsZSh2b2lkKQotewotCXJldHVybigxKTsKLX0KLQotc3RhdGljIHZvaWQgQkVfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpCRV9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7Ci0JaWYgKCBkZXZpY2UgKSB7Ci0JCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLQkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCX0KLQlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCBkZXZpY2UgKSB7Ci0JCQlTRExfZnJlZShkZXZpY2UpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQkvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KLQlkZXZpY2UtPlZpZGVvSW5pdCA9IEJFX1ZpZGVvSW5pdDsKLQlkZXZpY2UtPkxpc3RNb2RlcyA9IEJFX0xpc3RNb2RlczsKLQlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IEJFX1NldFZpZGVvTW9kZTsKLQlkZXZpY2UtPlRvZ2dsZUZ1bGxTY3JlZW4gPSBCRV9Ub2dnbGVGdWxsU2NyZWVuOwotCWRldmljZS0+VXBkYXRlTW91c2UgPSBCRV9VcGRhdGVNb3VzZTsKLQlkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBCRV9DcmVhdGVZVVZPdmVybGF5OwotCWRldmljZS0+U2V0Q29sb3JzID0gQkVfU2V0Q29sb3JzOwotCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOwotCWRldmljZS0+VmlkZW9RdWl0ID0gQkVfVmlkZW9RdWl0OwotCS8qIEhhcmR3YXJlIGFjY2VsZXJhdGlvbiBmdW5jdGlvbnMgKi8KLQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gQkVfQWxsb2NIV1N1cmZhY2U7Ci0JZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7Ci0JZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOwotCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7Ci0JZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gQkVfTG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IEJFX1VubG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOwotCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IEJFX0ZyZWVIV1N1cmZhY2U7Ci0JLyogR2FtbWEgc3VwcG9ydCAqLwotI2lmIFNETF9WSURFT19PUEVOR0wKLQkvKiBPcGVuR0wgc3VwcG9ydCAqLwotCWRldmljZS0+R0xfTG9hZExpYnJhcnkgPSBCRV9HTF9Mb2FkTGlicmFyeTsKLQlkZXZpY2UtPkdMX0dldFByb2NBZGRyZXNzID0gQkVfR0xfR2V0UHJvY0FkZHJlc3M7Ci0JZGV2aWNlLT5HTF9HZXRBdHRyaWJ1dGUgPSBCRV9HTF9HZXRBdHRyaWJ1dGU7Ci0JZGV2aWNlLT5HTF9NYWtlQ3VycmVudCA9IEJFX0dMX01ha2VDdXJyZW50OwotCWRldmljZS0+R0xfU3dhcEJ1ZmZlcnMgPSBCRV9HTF9Td2FwQnVmZmVyczsKLSNlbmRpZgotCS8qIFdpbmRvdyBtYW5hZ2VyIGZ1bmN0aW9ucyAqLwotCWRldmljZS0+U2V0Q2FwdGlvbiA9IEJFX1NldFdNQ2FwdGlvbjsKLQlkZXZpY2UtPlNldEljb24gPSBOVUxMOwotCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IEJFX0ljb25pZnlXaW5kb3c7Ci0JZGV2aWNlLT5HcmFiSW5wdXQgPSBCRV9HcmFiSW5wdXQ7Ci0JZGV2aWNlLT5HZXRXTUluZm8gPSBCRV9HZXRXTUluZm87Ci0JLyogQ3Vyc29yIG1hbmFnZXIgZnVuY3Rpb25zICovCi0JZGV2aWNlLT5GcmVlV01DdXJzb3IgPSBCRV9GcmVlV01DdXJzb3I7Ci0JZGV2aWNlLT5DcmVhdGVXTUN1cnNvciA9IEJFX0NyZWF0ZVdNQ3Vyc29yOwotCWRldmljZS0+U2hvd1dNQ3Vyc29yID0gQkVfU2hvd1dNQ3Vyc29yOwotCWRldmljZS0+V2FycFdNQ3Vyc29yID0gQkVfV2FycFdNQ3Vyc29yOwotCWRldmljZS0+TW92ZVdNQ3Vyc29yID0gTlVMTDsKLQlkZXZpY2UtPkNoZWNrTW91c2VNb2RlID0gQkVfQ2hlY2tNb3VzZU1vZGU7Ci0JLyogRXZlbnQgbWFuYWdlciBmdW5jdGlvbnMgKi8KLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IEJFX0luaXRPU0tleW1hcDsKLQlkZXZpY2UtPlB1bXBFdmVudHMgPSBCRV9QdW1wRXZlbnRzOwotCi0JZGV2aWNlLT5mcmVlID0gQkVfRGVsZXRlRGV2aWNlOwotCi0JLyogU2V0IHRoZSBkcml2ZXIgZmxhZ3MgKi8KLQlkZXZpY2UtPmhhbmRsZXNfYW55X3NpemUgPSAxOwotCQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLVZpZGVvQm9vdFN0cmFwIEJXSU5ET1dfYm9vdHN0cmFwID0gewotCSJid2luZG93IiwgIkJEaXJlY3RXaW5kb3cgZ3JhcGhpY3MiLAotCUJFX0F2YWlsYWJsZSwgQkVfQ3JlYXRlRGV2aWNlCi19OwotCi1zdGF0aWMgaW5saW5lIGludCBDb2xvclNwYWNlVG9CaXRzUGVyUGl4ZWwodWludDMyIGNvbG9yc3BhY2UpCi17Ci0JaW50IGJpdHNwZXJwaXhlbDsKLQotCWJpdHNwZXJwaXhlbCA9IDA7Ci0Jc3dpdGNoIChjb2xvcnNwYWNlKSB7Ci0JICAgIGNhc2UgQl9DTUFQODoKLQkJYml0c3BlcnBpeGVsID0gODsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQl9SR0IxNToKLQkgICAgY2FzZSBCX1JHQkExNToKLQkgICAgY2FzZSBCX1JHQjE1X0JJRzoKLQkgICAgY2FzZSBCX1JHQkExNV9CSUc6Ci0JCWJpdHNwZXJwaXhlbCA9IDE1OwotCQlicmVhazsKLQkgICAgY2FzZSBCX1JHQjE2OgotCSAgICBjYXNlIEJfUkdCMTZfQklHOgotCQliaXRzcGVycGl4ZWwgPSAxNjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQl9SR0IzMjoKLQkgICAgY2FzZSBCX1JHQkEzMjoKLQkgICAgY2FzZSBCX1JHQjMyX0JJRzoKLQkgICAgY2FzZSBCX1JHQkEzMl9CSUc6Ci0JCWJpdHNwZXJwaXhlbCA9IDMyOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybihiaXRzcGVycGl4ZWwpOwotfQotCi0vKiBGdW5jdGlvbiB0byBzb3J0IHRoZSBkaXNwbGF5X2xpc3QgaW4gYnNjcmVlbiAqLwotc3RhdGljIGludCBDb21wYXJlTW9kZXMoY29uc3Qgdm9pZCAqQSwgY29uc3Qgdm9pZCAqQikKLXsKLQljb25zdCBkaXNwbGF5X21vZGUgKmEgPSAoZGlzcGxheV9tb2RlICopQTsKLQljb25zdCBkaXNwbGF5X21vZGUgKmIgPSAoZGlzcGxheV9tb2RlICopQjsKLQotCWlmICggYS0+c3BhY2UgPT0gYi0+c3BhY2UgKSB7Ci0JCXJldHVybigoYi0+dmlydHVhbF93aWR0aCpiLT52aXJ0dWFsX2hlaWdodCktCi0JCSAgICAgICAoYS0+dmlydHVhbF93aWR0aCphLT52aXJ0dWFsX2hlaWdodCkpOwotCX0gZWxzZSB7Ci0JCXJldHVybihDb2xvclNwYWNlVG9CaXRzUGVyUGl4ZWwoYi0+c3BhY2UpLQotCQkgICAgICAgQ29sb3JTcGFjZVRvQml0c1BlclBpeGVsKGEtPnNwYWNlKSk7Ci0JfQotfQotCi0vKiBZZXMsIHRoaXMgaXNuJ3QgdGhlIGZhc3Rlc3QgaXQgY291bGQgYmUsIGJ1dCBpdCB3b3JrcyBuaWNlbHkgKi8KLXN0YXRpYyBpbnQgQkVfQWRkTW9kZShfVEhJUywgaW50IGluZGV4LCB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgpCi17Ci0JU0RMX1JlY3QgKm1vZGU7Ci0JaW50IGk7Ci0JaW50IG5leHRfbW9kZTsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBtb2RlICovCi0JaWYgKCBTRExfbnVtbW9kZXNbaW5kZXhdID4gMCApIHsKLQkJZm9yICggaT1TRExfbnVtbW9kZXNbaW5kZXhdLTE7IGkgPj0gMDsgLS1pICkgewotCQkJbW9kZSA9IFNETF9tb2RlbGlzdFtpbmRleF1baV07Ci0JCQlpZiAoIChtb2RlLT53ID09IHcpICYmIChtb2RlLT5oID09IGgpICkgewotI2lmZGVmIEJXSU5ET1dfREVCVUcKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIldlIGFscmVhZHkgaGF2ZSBtb2RlICVkeCVkIGF0ICVkIGJ5dGVzIHBlciBwaXhlbFxuIiwgdywgaCwgaW5kZXgrMSk7Ci0jZW5kaWYKLQkJCQlyZXR1cm4oMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIG5ldyB2aWRlbyBtb2RlIHJlY3RhbmdsZSAqLwotCW1vZGUgPSAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZiAqbW9kZSk7Ci0JaWYgKCBtb2RlID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oLTEpOwotCX0KLQltb2RlLT54ID0gMDsKLQltb2RlLT55ID0gMDsKLQltb2RlLT53ID0gdzsKLQltb2RlLT5oID0gaDsKLSNpZmRlZiBCV0lORE9XX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJBZGRpbmcgbW9kZSAlZHglZCBhdCAlZCBieXRlcyBwZXIgcGl4ZWxcbiIsIHcsIGgsIGluZGV4KzEpOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSB0aGUgbmV3IGxpc3Qgb2YgbW9kZXMsIGFuZCBmaWxsIGluIHRoZSBuZXcgbW9kZSAqLwotCW5leHRfbW9kZSA9IFNETF9udW1tb2Rlc1tpbmRleF07Ci0JU0RMX21vZGVsaXN0W2luZGV4XSA9IChTRExfUmVjdCAqKikKLQkgICAgICAgU0RMX3JlYWxsb2MoU0RMX21vZGVsaXN0W2luZGV4XSwgKDErbmV4dF9tb2RlKzEpKnNpemVvZihTRExfUmVjdCAqKSk7Ci0JaWYgKCBTRExfbW9kZWxpc3RbaW5kZXhdID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlTRExfbnVtbW9kZXNbaW5kZXhdID0gMDsKLQkJU0RMX2ZyZWUobW9kZSk7Ci0JCXJldHVybigtMSk7Ci0JfQotCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlXSA9IG1vZGU7Ci0JU0RMX21vZGVsaXN0W2luZGV4XVtuZXh0X21vZGUrMV0gPSBOVUxMOwotCVNETF9udW1tb2Rlc1tpbmRleF0rKzsKLQotCXJldHVybigwKTsKLX0KLQotaW50IEJFX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotCWRpc3BsYXlfbW9kZSAqbW9kZXM7Ci0JdWludDMyIGksIG5tb2RlczsKLQlpbnQgYnBwOwotCUJSZWN0IGJvdW5kczsKLQotCS8qIEluaXRpYWxpemUgdGhlIEJlIEFwcGxpY2F0aW9uIGZvciBhcHBzZXJ2ZXIgaW50ZXJhY3Rpb24gKi8KLQlpZiAoIFNETF9Jbml0QmVBcHAoKSA8IDAgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyBiZSBjcmVhdGVkIGFmdGVyIFNETF9Jbml0QmVBcHAoKSAqLwotCUJTY3JlZW4gYnNjcmVlbjsKLQotCS8qIFNhdmUgdGhlIGN1cnJlbnQgZGlzcGxheSBtb2RlICovCi0JYnNjcmVlbi5HZXRNb2RlKCZzYXZlZF9tb2RlKTsKLQlfdGhpcy0+aW5mby5jdXJyZW50X3cgPSBzYXZlZF9tb2RlLnZpcnR1YWxfd2lkdGg7Ci0JX3RoaXMtPmluZm8uY3VycmVudF9oID0gc2F2ZWRfbW9kZS52aXJ0dWFsX2hlaWdodDsKLQotCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICovCi0JdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gQ29sb3JTcGFjZVRvQml0c1BlclBpeGVsKGJzY3JlZW4uQ29sb3JTcGFjZSgpKTsKLQlpZiAoIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9PSAwICkgewotCQlTRExfU2V0RXJyb3IoIlVua25vd24gQlNjcmVlbiBjb2xvcnNwYWNlOiAweCV4IiwKLQkJCQkJCWJzY3JlZW4uQ29sb3JTcGFjZSgpKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIHZpZGVvIG1vZGVzIHdlIGNhbiBzd2l0Y2ggdG8gaW4gZnVsbHNjcmVlbiBtb2RlICovCi0JYnNjcmVlbi5HZXRNb2RlTGlzdCgmbW9kZXMsICZubW9kZXMpOwotCVNETF9xc29ydChtb2Rlcywgbm1vZGVzLCBzaXplb2YgKm1vZGVzLCBDb21wYXJlTW9kZXMpOwotCWZvciAoIGk9MDsgaTxubW9kZXM7ICsraSApIHsKLQkJYnBwID0gQ29sb3JTcGFjZVRvQml0c1BlclBpeGVsKG1vZGVzW2ldLnNwYWNlKTsKLQkJLy9pZiAoIGJwcCAhPSAwICkgeyAvLyBUaGVyZSBhcmUgYnVncyBpbiBjaGFuZ2luZyBjb2xvcnNwYWNlCi0JCWlmICggbW9kZXNbaV0uc3BhY2UgPT0gc2F2ZWRfbW9kZS5zcGFjZSApIHsKLQkJCUJFX0FkZE1vZGUoX3RoaXMsICgoYnBwKzcpLzgpLTEsCi0JCQkJbW9kZXNbaV0udmlydHVhbF93aWR0aCwKLQkJCQltb2Rlc1tpXS52aXJ0dWFsX2hlaWdodCk7Ci0JCX0KLQl9Ci0KLQkvKiBDcmVhdGUgdGhlIHdpbmRvdyBhbmQgdmlldyAqLwotCWJvdW5kcy50b3AgPSAwOyBib3VuZHMubGVmdCA9IDA7Ci0JYm91bmRzLnJpZ2h0ID0gQkVPU19ISURERU5fU0laRTsKLQlib3VuZHMuYm90dG9tID0gQkVPU19ISURERU5fU0laRTsKLQlTRExfV2luID0gbmV3IFNETF9CV2luKGJvdW5kcyk7Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0JLyogdGVzdGdsIGFwcGxpY2F0aW9uIGRvZXNuJ3QgbG9hZCBsaWJyYXJ5LCBqdXN0IHRyaWVzIHRvIGxvYWQgc3ltYm9scyAqLwotCS8qIGlzIGl0IGNvcnJlY3Q/IGlmIHNvIHdlIGhhdmUgdG8gbG9hZCBsaWJyYXJ5IGhlcmUgKi8KLQlCRV9HTF9Mb2FkTGlicmFyeShfdGhpcywgTlVMTCk7Ci0jZW5kaWYKLQotCS8qIENyZWF0ZSB0aGUgY2xlYXIgY3Vyc29yICovCi0JU0RMX0JsYW5rQ3Vyc29yID0gQkVfQ3JlYXRlV01DdXJzb3IoX3RoaXMsIGJsYW5rX2NkYXRhLCBibGFua19jbWFzaywKLQkJCUJMQU5LX0NXSURUSCwgQkxBTktfQ0hFSUdIVCwgQkxBTktfQ0hPVFgsIEJMQU5LX0NIT1RZKTsKLQotCS8qIEZpbGwgaW4gc29tZSB3aW5kb3cgbWFuYWdlciBjYXBhYmlsaXRpZXMgKi8KLQlfdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAxOwotCi0JLyogV2UncmUgZG9uZSEgKi8KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIFdlIHN1cHBvcnQgYW55IGRpbWVuc2lvbiBhdCBvdXIgYml0LWRlcHRoICovCi1TRExfUmVjdCAqKkJFX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQlTRExfUmVjdCAqKm1vZGVzOwotCi0JbW9kZXMgPSAoKFNETF9SZWN0ICoqKTApOwotCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgewotCQltb2RlcyA9IFNETF9tb2RlbGlzdFsoKGZvcm1hdC0+Qml0c1BlclBpeGVsKzcpLzgpLTFdOwotCX0gZWxzZSB7Ci0JCWlmICggZm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0KLQkJCV90aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsICkgewotCQkJbW9kZXMgPSAoKFNETF9SZWN0ICoqKS0xKTsKLQkJfQotCX0KLQlyZXR1cm4obW9kZXMpOwotfQotCi0vKiBWYXJpb3VzIHNjcmVlbiB1cGRhdGUgZnVuY3Rpb25zIGF2YWlsYWJsZSAqLwotc3RhdGljIHZvaWQgQkVfTm9ybWFsVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci0KLQotLyogRmluZCB0aGUgY2xvc2VzdCBkaXNwbGF5IG1vZGUgZm9yIGZ1bGxzY3JlZW4gKi8KLXN0YXRpYyBib29sIEJFX0ZpbmRDbG9zZXN0RlNNb2RlKF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsCi0JCQkJCSBkaXNwbGF5X21vZGUgKm1vZGUpCi17Ci0JQlNjcmVlbiBic2NyZWVuOwotCXVpbnQzMiBpLCBubW9kZXM7Ci0JU0RMX1JlY3QgKiptb2RlczsKLQlkaXNwbGF5X21vZGUgKmRtb2RlczsKLQlkaXNwbGF5X21vZGUgY3VycmVudDsKLQlmbG9hdCBjdXJyZW50X3JlZnJlc2g7Ci0JYnNjcmVlbi5HZXRNb2RlKCZjdXJyZW50KTsKLQljdXJyZW50X3JlZnJlc2ggPSAoMTAwMCAqIGN1cnJlbnQudGltaW5nLnBpeGVsX2Nsb2NrKSAvIAotCSAgICAgICAgICAgICAgICAgIChjdXJyZW50LnRpbWluZy5oX3RvdGFsICogY3VycmVudC50aW1pbmcudl90b3RhbCk7Ci0KLQltb2RlcyA9IFNETF9tb2RlbGlzdFsoKGJwcCs3KS84KS0xXTsKLQlmb3IgKCBpPTA7IG1vZGVzW2ldICYmIChtb2Rlc1tpXS0+dyA+IHdpZHRoKSAmJgotCQkgICAgICAobW9kZXNbaV0tPmggPiBoZWlnaHQpOyArK2kgKSB7Ci0JCS8qIHN0aWxsIGxvb2tpbmcgKi8KLQl9Ci0JaWYgKCAhIG1vZGVzW2ldIHx8IChtb2Rlc1tpXS0+dyA8IHdpZHRoKSB8fCAobW9kZXNbaV0tPmggPCB3aWR0aCkgKSB7Ci0JCS0taTsJLyogV2Ugd2VudCB0b28gZmFyICovCi0JfQotCi0Jd2lkdGggPSBtb2Rlc1tpXS0+dzsKLQloZWlnaHQgPSBtb2Rlc1tpXS0+aDsgICAgICAKLQotCWJzY3JlZW4uR2V0TW9kZUxpc3QoJmRtb2RlcywgJm5tb2Rlcyk7Ci0JZm9yICggaSA9IDA7IGkgPCBubW9kZXM7ICsraSApIHsKLQkJaWYgKCAoYnBwID09IENvbG9yU3BhY2VUb0JpdHNQZXJQaXhlbChkbW9kZXNbaV0uc3BhY2UpKSAmJgotCQkgICAgICh3aWR0aCA9PSBkbW9kZXNbaV0udmlydHVhbF93aWR0aCkgJiYKLQkJICAgICAoaGVpZ2h0ID09IGRtb2Rlc1tpXS52aXJ0dWFsX2hlaWdodCkgKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIGkgIT0gbm1vZGVzICkgewotCQkqbW9kZSA9IGRtb2Rlc1tpXTsKLQkJaWYgKChtb2RlLT52aXJ0dWFsX3dpZHRoIDw9IGN1cnJlbnQudmlydHVhbF93aWR0aCkgJiYKLQkJICAgIChtb2RlLT52aXJ0dWFsX2hlaWdodCA8PSBjdXJyZW50LnZpcnR1YWxfaGVpZ2h0KSkgewotCQkJZmxvYXQgbmV3X3JlZnJlc2ggPSAoMTAwMCAqIG1vZGUtPnRpbWluZy5waXhlbF9jbG9jaykgLwotCQkJICAgICAgICAgICAgICAgICAgICAobW9kZS0+dGltaW5nLmhfdG90YWwgKiBtb2RlLT50aW1pbmcudl90b3RhbCk7Ci0JCQlpZiAobmV3X3JlZnJlc2ggPCBjdXJyZW50X3JlZnJlc2gpIHsKLQkJCQltb2RlLT50aW1pbmcucGl4ZWxfY2xvY2sgPSAodWludDMyKSgobW9kZS0+dGltaW5nLmhfdG90YWwgKiBtb2RlLT50aW1pbmcudl90b3RhbCkKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGN1cnJlbnRfcmVmcmVzaCAvIDEwMDApOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotfQotCi1zdGF0aWMgaW50IEJFX1NldEZ1bGxTY3JlZW4oX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4sIGludCBmdWxsc2NyZWVuKQotewotCWludCB3YXNfZnVsbHNjcmVlbjsKLQlib29sIG5lZWRzX3VubG9jazsKLQlCU2NyZWVuIGJzY3JlZW47Ci0JQlJlY3QgYm91bmRzOwotCWRpc3BsYXlfbW9kZSBtb2RlOwotCWludCB3aWR0aCwgaGVpZ2h0LCBicHA7Ci0KLQkvKiBTZXQgdGhlIGZ1bGxzY3JlZW4gbW9kZSAqLwotCXdhc19mdWxsc2NyZWVuID0gU0RMX1dpbi0+SXNGdWxsU2NyZWVuKCk7Ci0JU0RMX1dpbi0+U2V0RnVsbFNjcmVlbihmdWxsc2NyZWVuKTsKLQlmdWxsc2NyZWVuID0gU0RMX1dpbi0+SXNGdWxsU2NyZWVuKCk7Ci0KLQl3aWR0aCA9IHNjcmVlbi0+dzsKLQloZWlnaHQgPSBzY3JlZW4tPmg7Ci0KLQkvKiBTZXQgdGhlIGFwcHJvcHJpYXRlIHZpZGVvIG1vZGUgKi8KLQlpZiAoIGZ1bGxzY3JlZW4gKSB7Ci0JCWJwcCA9IHNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7Ci0JCWJzY3JlZW4uR2V0TW9kZSgmbW9kZSk7Ci0JCWlmICggKGJwcCAhPSBDb2xvclNwYWNlVG9CaXRzUGVyUGl4ZWwobW9kZS5zcGFjZSkpIHx8Ci0JCSAgICAgKHdpZHRoICE9IG1vZGUudmlydHVhbF93aWR0aCkgfHwKLQkJICAgICAoaGVpZ2h0ICE9IG1vZGUudmlydHVhbF9oZWlnaHQpKSB7Ci0JCQlpZihCRV9GaW5kQ2xvc2VzdEZTTW9kZShfdGhpcywgd2lkdGgsIGhlaWdodCwgYnBwLCAmbW9kZSkpIHsKLQkJCQlic2NyZWVuLlNldE1vZGUoJm1vZGUpOwotCQkJCS8qIFRoaXMgc2ltcGx5IHN0b3BzIHRoZSBuZXh0IHJlc2l6ZSBldmVudCBmcm9tIGJlaW5nCi0JCQkJICogc2VudCB0byB0aGUgU0RMIGhhbmRsZXIuCi0JCQkJICovCi0JCQkJU0RMX1dpbi0+SW5oaWJpdFJlc2l6ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlmdWxsc2NyZWVuID0gMDsKLQkJCQlTRExfV2luLT5TZXRGdWxsU2NyZWVuKGZ1bGxzY3JlZW4pOwotCQkJfQotCQl9Ci0JfQotCWlmICggd2FzX2Z1bGxzY3JlZW4gJiYgISBmdWxsc2NyZWVuICkgewotCQlic2NyZWVuLlNldE1vZGUoJnNhdmVkX21vZGUpOwotCX0KLQotCWlmICggU0RMX1dpbi0+TG9jaygpICkgewotCQlpbnQgY3gsIGN5OwotCQlpZiAoIFNETF9XaW4tPlNob3duKCkgKSB7Ci0JCQluZWVkc191bmxvY2sgPSAxOwotCQkJU0RMX1dpbi0+SGlkZSgpOwotCQl9IGVsc2UgewotCQkJbmVlZHNfdW5sb2NrID0gMDsKLQkJfQotCQkvKiBUaGlzIHJlc2l6ZXMgdGhlIHdpbmRvdyBhbmQgdmlldyBhcmVhLCBidXQgaW5oaWJpdHMgcmVzaXppbmcKLQkJICogb2YgdGhlIEJCaXRtYXAgZHVlIHRvIHRoZSBJbmhpYml0UmVzaXplIGNhbGwgYWJvdmUuIFRodXMgdGhlCi0JCSAqIGJpdG1hcCAocGl4ZWwgZGF0YSkgbmV2ZXIgY2hhbmdlcy4KLQkJICovCi0JCVNETF9XaW4tPlJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpOwotCQlib3VuZHMgPSBic2NyZWVuLkZyYW1lKCk7Ci0JCS8qIENhbGN1bGF0ZSBvZmZzZXRzIC0gdXNlZCBlaXRoZXIgdG8gY2VudGVyIHdpbmRvdwotCQkgKiAod2luZG93ZWQgbW9kZSkgb3IgdG8gc2V0IGRyYXdpbmcgb2Zmc2V0cyAoZnVsbHNjcmVlbiBtb2RlKQotCQkgKi8KLQkJY3ggPSAoYm91bmRzLkludGVnZXJXaWR0aCgpIC0gd2lkdGgpLzI7Ci0JCWN5ID0gKGJvdW5kcy5JbnRlZ2VySGVpZ2h0KCkgLSBoZWlnaHQpLzI7Ci0KLQkJaWYgKCBmdWxsc2NyZWVuICkgewotCQkJLyogU2V0IG9mZnNldCBmb3IgZHJhd2luZyAqLwotCQkJU0RMX1dpbi0+U2V0WFlPZmZzZXQoY3gsIGN5KTsKLQkJfSBlbHNlIHsKLQkJCVNETF9XaW4tPlNldFhZT2Zmc2V0KDAsIDApOwotCQl9Ci0JCWlmICggISBuZWVkc191bmxvY2sgfHwgd2FzX2Z1bGxzY3JlZW4gKSB7Ci0JCQkvKiBDZW50ZXIgdGhlIHdpbmRvdyB0aGUgZmlyc3QgdGltZSAqLwotCQkJU0RMX1dpbi0+TW92ZVRvKGN4LCBjeSk7Ci0JCX0KLQkJU0RMX1dpbi0+U2hvdygpOwotCQkKLQkJLyogVW5sb2NrIHRoZSB3aW5kb3cgbWFudWFsbHkgYWZ0ZXIgdGhlIGZpcnN0IFNob3coKSAqLwotCQlpZiAoIG5lZWRzX3VubG9jayApIHsKLQkJCVNETF9XaW4tPlVubG9jaygpOwotCQl9Ci0JfQotCi0JLyogU2V0IHRoZSBmdWxsc2NyZWVuIGZsYWcgaW4gdGhlIHNjcmVlbiBzdXJmYWNlICovCi0JaWYgKCBmdWxsc2NyZWVuICkgewotCQlzY3JlZW4tPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOwotCX0gZWxzZSB7Ci0JCXNjcmVlbi0+ZmxhZ3MgJj0gflNETF9GVUxMU0NSRUVOOyAKLQl9Ci0JcmV0dXJuKDEpOwotfQotCi1zdGF0aWMgaW50IEJFX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBmdWxsc2NyZWVuKQotewotCXJldHVybiBCRV9TZXRGdWxsU2NyZWVuKF90aGlzLCBfdGhpcy0+c2NyZWVuLCBmdWxsc2NyZWVuKTsKLX0KLQotLyogRklYTUU6IGNoZWNrIHJldHVybiB2YWx1ZXMgYW5kIGNsZWFudXAgaGVyZSAqLwotU0RMX1N1cmZhY2UgKkJFX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JQlNjcmVlbiBic2NyZWVuOwotCUJCaXRtYXAgKmJiaXRtYXA7Ci0JQlJlY3QgYm91bmRzOwotCVVpbnQzMiBnbF9mbGFncyA9IDA7Ci0KLQkvKiBPbmx5IFJHQiB3b3JrcyBvbiByNSBjdXJyZW50bHkgKi8KLQlnbF9mbGFncyA9IEJHTF9SR0I7Ci0JaWYgKF90aGlzLT5nbF9jb25maWcuZG91YmxlX2J1ZmZlcikKLQkJZ2xfZmxhZ3MgfD0gQkdMX0RPVUJMRTsKLQllbHNlCi0JCWdsX2ZsYWdzIHw9IEJHTF9TSU5HTEU7Ci0JaWYgKF90aGlzLT5nbF9jb25maWcuYWxwaGFfc2l6ZSA+IDAgfHwgYnBwID09IDMyKQotCQlnbF9mbGFncyB8PSBCR0xfQUxQSEE7Ci0JaWYgKF90aGlzLT5nbF9jb25maWcuZGVwdGhfc2l6ZSA+IDApCi0JCWdsX2ZsYWdzIHw9IEJHTF9ERVBUSDsKLQlpZiAoX3RoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemUgPiAwKQotCQlnbF9mbGFncyB8PSBCR0xfU1RFTkNJTDsKLQlpZiAoX3RoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZSA+IDAKLQkJfHwgX3RoaXMtPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplID4gMAotCQl8fCBfdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2JsdWVfc2l6ZSA+IDAKLQkJfHwgX3RoaXMtPmdsX2NvbmZpZy5hY2N1bV9hbHBoYV9zaXplID4gMCkKLQkJZ2xfZmxhZ3MgfD0gQkdMX0FDQ1VNOwotCi0JLyogQ3JlYXRlIHRoZSB2aWV3IGZvciB0aGlzIHdpbmRvdywgdXNpbmcgZm91bmQgZmxhZ3MgKi8KLQlpZiAoIFNETF9XaW4tPkNyZWF0ZVZpZXcoZmxhZ3MsIGdsX2ZsYWdzKSA8IDAgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQljdXJyZW50LT5mbGFncyA9IDA7CQkvKiBDbGVhciBmbGFncyAqLwotCWN1cnJlbnQtPncgPSB3aWR0aDsKLQljdXJyZW50LT5oID0gaGVpZ2h0OwotCVNETF9XaW4tPlNldFR5cGUoQl9USVRMRURfV0lORE9XKTsKLQlpZiAoIGZsYWdzICYgU0RMX05PRlJBTUUgKSB7Ci0JCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9OT0ZSQU1FOwotCQlTRExfV2luLT5TZXRMb29rKEJfTk9fQk9SREVSX1dJTkRPV19MT09LKTsKLQl9IGVsc2UgewotCQlpZiAoIChmbGFncyAmIFNETF9SRVNJWkFCTEUpICYmICEoZmxhZ3MgJiBTRExfT1BFTkdMKSApICB7Ci0JCQljdXJyZW50LT5mbGFncyB8PSBTRExfUkVTSVpBQkxFOwotCQkJLyogV2UgZG9uJ3Qgd2FudCBvcGFxdWUgcmVzaXppbmcgKFRNKS4gOi0pICovCi0JCQlTRExfV2luLT5TZXRGbGFncyhCX09VVExJTkVfUkVTSVpFKTsKLQkJfSBlbHNlIHsKLQkJCVNETF9XaW4tPlNldEZsYWdzKEJfTk9UX1JFU0laQUJMRXxCX05PVF9aT09NQUJMRSk7Ci0JCX0KLQl9Ci0KLQlpZiAoIGZsYWdzICYgU0RMX09QRU5HTCApIHsKLQkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX09QRU5HTDsKLQkJY3VycmVudC0+cGl0Y2ggPSAwOwotCQljdXJyZW50LT5waXhlbHMgPSBOVUxMOwotCQlfdGhpcy0+VXBkYXRlUmVjdHMgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCS8qIENyZWF0ZSB0aGUgQkJpdG1hcCBmcmFtZWJ1ZmZlciAqLwotCQlib3VuZHMudG9wID0gMDsgYm91bmRzLmxlZnQgPSAwOwotCQlib3VuZHMucmlnaHQgPSB3aWR0aC0xOwotCQlib3VuZHMuYm90dG9tID0gaGVpZ2h0LTE7Ci0JCWJiaXRtYXAgPSBuZXcgQkJpdG1hcChib3VuZHMsIGJzY3JlZW4uQ29sb3JTcGFjZSgpKTsKLQkJaWYgKCAhIGJiaXRtYXAtPklzVmFsaWQoKSApIHsKLQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNjcmVlbiBiaXRtYXAiKTsKLQkJCWRlbGV0ZSBiYml0bWFwOwotCQkJcmV0dXJuKE5VTEwpOwotCQl9Ci0JCWN1cnJlbnQtPnBpdGNoID0gYmJpdG1hcC0+Qnl0ZXNQZXJSb3coKTsKLQkJY3VycmVudC0+cGl4ZWxzID0gKHZvaWQgKiliYml0bWFwLT5CaXRzKCk7Ci0JCVNETF9XaW4tPlNldEJpdG1hcChiYml0bWFwKTsKLQkJX3RoaXMtPlVwZGF0ZVJlY3RzID0gQkVfTm9ybWFsVXBkYXRlOwotCX0KLQotCS8qIFNldCB0aGUgY29ycmVjdCBmdWxsc2NyZWVuIG1vZGUgKi8KLQlCRV9TZXRGdWxsU2NyZWVuKF90aGlzLCBjdXJyZW50LCBmbGFncyAmIFNETF9GVUxMU0NSRUVOID8gMSA6IDApOwotCi0JLyogV2UncmUgZG9uZSAqLwotCXJldHVybihjdXJyZW50KTsKLX0KLQotLyogVXBkYXRlIHRoZSBjdXJyZW50IG1vdXNlIHN0YXRlIGFuZCBwb3NpdGlvbiAqLwotdm9pZCBCRV9VcGRhdGVNb3VzZShfVEhJUykKLXsKLQlCUG9pbnQgcG9pbnQ7Ci0JdWludDMyIGJ1dHRvbnM7Ci0KLQlpZiAoIFNETF9XaW4tPkxvY2soKSApIHsKLQkJLyogR2V0IG5ldyBpbnB1dCBzdGF0ZSwgaWYgc3RpbGwgYWN0aXZlICovCi0JCWlmICggU0RMX1dpbi0+SXNBY3RpdmUoKSApIHsKLQkJCShTRExfV2luLT5WaWV3KCkpLT5HZXRNb3VzZSgmcG9pbnQsICZidXR0b25zLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXBvaW50LnggPSAtMTsKLQkJCXBvaW50LnkgPSAtMTsKLQkJfQotCQlTRExfV2luLT5VbmxvY2soKTsKLQotCQlpZiAoIChwb2ludC54ID49IDApICYmIChwb2ludC54IDwgU0RMX1ZpZGVvU3VyZmFjZS0+dykgJiYKLQkJICAgICAocG9pbnQueSA+PSAwKSAmJiAocG9pbnQueSA8IFNETF9WaWRlb1N1cmZhY2UtPmgpICkgewotCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOwotCQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLAotCQkJCQkoU2ludDE2KXBvaW50LngsIChTaW50MTYpcG9pbnQueSk7Ci0JCX0gZWxzZSB7Ci0JCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQTU9VU0VGT0NVUyk7Ci0JCX0KLQl9Ci19Ci0KLS8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCi1zdGF0aWMgaW50IEJFX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4oLTEpOwotfQotc3RhdGljIHZvaWQgQkVfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotc3RhdGljIGludCBCRV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4oMCk7Ci19Ci1zdGF0aWMgdm9pZCBCRV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgQkVfTm9ybWFsVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLQlpZiAoIFNETF9XaW4tPkJlZ2luRHJhdygpICkgewotCQlpbnQgaTsKLQotCQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIHsKLQkJCUJSZWN0IHJlY3Q7Ci0KLQkJCXJlY3QudG9wID0gcmVjdHNbaV0ueTsKLQkJCXJlY3QubGVmdCA9IHJlY3RzW2ldLng7Ci0JCQlyZWN0LmJvdHRvbSA9IHJlY3QudG9wK3JlY3RzW2ldLmgtMTsKLQkJCXJlY3QucmlnaHQgPSByZWN0LmxlZnQrcmVjdHNbaV0udy0xOwotCQkJU0RMX1dpbi0+RHJhd0FzeW5jKHJlY3QpOwotCQl9Ci0JCVNETF9XaW4tPkVuZERyYXcoKTsKLQl9Ci19Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0vKiBQYXNzaW5nIGEgTlVMTCBwYXRoIG1lYW5zIGxvYWQgcG9pbnRlcnMgZnJvbSB0aGUgYXBwbGljYXRpb24gKi8KLWludCBCRV9HTF9Mb2FkTGlicmFyeShfVEhJUywgY29uc3QgY2hhciAqcGF0aCkKLXsKLQlpZiAocGF0aCA9PSBOVUxMKSB7Ci0JCWlmIChfdGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUgPT0gTlVMTCkgewotCQkJaW1hZ2VfaW5mbyBpbmZvOwotCQkJaW50MzIgY29va2llID0gMDsKLQkJCXdoaWxlIChnZXRfbmV4dF9pbWFnZV9pbmZvKDAsJmNvb2tpZSwmaW5mbykgPT0gQl9PSykgewotCQkJCXZvaWQgKmxvY2F0aW9uID0gTlVMTDsKLQkJCQlpZiAoZ2V0X2ltYWdlX3N5bWJvbCgoaW1hZ2VfaWQpY29va2llLCJnbEJlZ2luIixCX1NZTUJPTF9UWVBFX0FOWSwmbG9jYXRpb24pID09IEJfT0spIHsKLQkJCQkJX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlID0gKHZvaWQqKWNvb2tpZTsKLQkJCQkJX3RoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMTsKLQkJCQkJU0RMX3N0cmxjcHkoX3RoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCwgImxpYkdMLnNvIiwgU0RMX2FycmF5c2l6ZShfdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJCUZJWE1FIE5vbmUgb2YgQmVPUyBsaWJHTC5zbyBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBleHBvcnRlZCBmdW5jdGlvbnMgCi0JCQl0byBsb2FkIEJHTFZpZXcsIHdoaWNoIHNob3VsZCBiZSByZWxvYWRlZCBmcm9tIG5ldyBsaWIuCi0JCQlTbyBmb3Igbm93IGp1c3QgImxvYWQiIGxpbmtlZCBsaWJHTC5zbyA6KAotCQkqLwotCQlpZiAoX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlID09IE5VTEwpIHsKLQkJCXJldHVybiBCRV9HTF9Mb2FkTGlicmFyeShfdGhpcywgTlVMTCk7Ci0JCX0KLQotCQkvKiBVbmxvYWQgb2xkIGZpcnN0ICovCi0JCS8qaWYgKF90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSAhPSBOVUxMKSB7Ki8KLQkJCS8qIERvIG5vdCB0cnkgdG8gdW5sb2FkIGFwcGxpY2F0aW9uIGl0c2VsZiAoaWYgTG9hZExpYnJhcnkgd2FzIGNhbGxlZCBiZWZvcmUgd2l0aCBOVUxMIDspICovCi0JCS8qCWltYWdlX2luZm8gaW5mbzsKLQkJCWlmIChnZXRfaW1hZ2VfaW5mbygoaW1hZ2VfaWQpX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlLCAmaW5mbykgPT0gQl9PSykgewotCQkJCWlmIChpbmZvLnR5cGUgIT0gQl9BUFBfSU1BR0UpIHsKLQkJCQkJdW5sb2FkX2FkZF9vbigoaW1hZ2VfaWQpX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCi0JCWlmICgoX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlID0gKHZvaWQqKWxvYWRfYWRkX29uKHBhdGgpKSAhPSAodm9pZCopQl9FUlJPUikgewotCQkJX3RoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMTsKLQkJCVNETF9zdHJsY3B5KF90aGlzLT5nbF9jb25maWcuZHJpdmVyX3BhdGgsIHBhdGgsIFNETF9hcnJheXNpemUoX3RoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCkpOwotCQl9Ki8KLQl9Ci0KLQlpZiAoX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlICE9IE5VTEwpIHsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlID0gTlVMTDsKLQkJX3RoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMDsKLQkJKl90aGlzLT5nbF9jb25maWcuZHJpdmVyX3BhdGggPSAnXDAnOwotCQlyZXR1cm4gLTE7Ci0JfQotfQotCi12b2lkKiBCRV9HTF9HZXRQcm9jQWRkcmVzcyhfVEhJUywgY29uc3QgY2hhciAqcHJvYykKLXsKLQlpZiAoX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlICE9IE5VTEwpIHsKLQkJdm9pZCAqbG9jYXRpb24gPSBOVUxMOwotCQlzdGF0dXNfdCBlcnI7Ci0JCWlmICgoZXJyID0gZ2V0X2ltYWdlX3N5bWJvbCgoaW1hZ2VfaWQpX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlLCBwcm9jLCBCX1NZTUJPTF9UWVBFX0FOWSwgJmxvY2F0aW9uKSkgPT0gQl9PSykgewotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9IGVsc2UgewotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBmaW5kIE9wZW5HTCBzeW1ib2wiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJU0RMX1NldEVycm9yKCJPcGVuR0wgbGlicmFyeSBub3QgbG9hZGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLX0KLQotaW50IEJFX0dMX0dldEF0dHJpYnV0ZShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpCi17Ci0JLyoKLQkJRklYTUU/IFJpZ2h0IG5vdyBCRV9HTF9HZXRBdHRyaWJ1dGUgc2hvdWxkbid0IGJlIGNhbGxlZCBiZXR3ZWVuIGdsQmVnaW4oKSBhbmQgZ2xFbmQoKSAtIGl0IGRvZXNuJ3QgdXNlICJjYWNoZWQiIHZhbHVlcwotCSovCi0Jc3dpdGNoIChhdHRyaWIpCi0gICAgewotCQljYXNlIFNETF9HTF9SRURfU0laRToKLQkJCWdsR2V0SW50ZWdlcnYoR0xfUkVEX0JJVFMsIChHTGludCopdmFsdWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0dSRUVOX1NJWkU6Ci0JCQlnbEdldEludGVnZXJ2KEdMX0dSRUVOX0JJVFMsIChHTGludCopdmFsdWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0JMVUVfU0laRToKLQkJCWdsR2V0SW50ZWdlcnYoR0xfQkxVRV9CSVRTLCAoR0xpbnQqKXZhbHVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9BTFBIQV9TSVpFOgotCQkJZ2xHZXRJbnRlZ2VydihHTF9BTFBIQV9CSVRTLCAoR0xpbnQqKXZhbHVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9ET1VCTEVCVUZGRVI6Ci0JCQlnbEdldEJvb2xlYW52KEdMX0RPVUJMRUJVRkZFUiwgKEdMYm9vbGVhbiopdmFsdWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0JVRkZFUl9TSVpFOgotCQkJaW50IHY7Ci0JCQlnbEdldEludGVnZXJ2KEdMX1JFRF9CSVRTLCAoR0xpbnQqKSZ2KTsKLQkJCSp2YWx1ZSA9IHY7Ci0JCQlnbEdldEludGVnZXJ2KEdMX0dSRUVOX0JJVFMsIChHTGludCopJnYpOwotCQkJKnZhbHVlICs9IHY7Ci0JCQlnbEdldEludGVnZXJ2KEdMX0JMVUVfQklUUywgKEdMaW50Kikmdik7Ci0JCQkqdmFsdWUgKz0gdjsKLQkJCWdsR2V0SW50ZWdlcnYoR0xfQUxQSEFfQklUUywgKEdMaW50Kikmdik7Ci0JCQkqdmFsdWUgKz0gdjsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9ERVBUSF9TSVpFOgotCQkJZ2xHZXRJbnRlZ2VydihHTF9ERVBUSF9CSVRTLCAoR0xpbnQqKXZhbHVlKTsgLyogTWVzYSBjcmVhdGVzIDE2IG9ubHk/IHI1IGFsd2F5cyAzMiAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX1NURU5DSUxfU0laRToKLQkJCWdsR2V0SW50ZWdlcnYoR0xfU1RFTkNJTF9CSVRTLCAoR0xpbnQqKXZhbHVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9BQ0NVTV9SRURfU0laRToKLQkJCWdsR2V0SW50ZWdlcnYoR0xfQUNDVU1fUkVEX0JJVFMsIChHTGludCopdmFsdWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkU6Ci0JCQlnbEdldEludGVnZXJ2KEdMX0FDQ1VNX0dSRUVOX0JJVFMsIChHTGludCopdmFsdWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0FDQ1VNX0JMVUVfU0laRToKLQkJCWdsR2V0SW50ZWdlcnYoR0xfQUNDVU1fQkxVRV9CSVRTLCAoR0xpbnQqKXZhbHVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9BQ0NVTV9BTFBIQV9TSVpFOgotCQkJZ2xHZXRJbnRlZ2VydihHTF9BQ0NVTV9BTFBIQV9CSVRTLCAoR0xpbnQqKXZhbHVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9TVEVSRU86Ci0JCWNhc2UgU0RMX0dMX01VTFRJU0FNUExFQlVGRkVSUzoKLQkJY2FzZSBTRExfR0xfTVVMVElTQU1QTEVTQU1QTEVTOgotCQlkZWZhdWx0OgotCQkJKnZhbHVlPTA7Ci0JCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IEJFX0dMX01ha2VDdXJyZW50KF9USElTKQotewotCS8qIEZJWE1FOiBzaG91bGQgd2UgZ2x2aWV3LT51bmxvY2sgYW5kIHRoZW4gZ2x2aWV3LT5sb2NrKCk/ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQkVfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpCi17Ci0JU0RMX1dpbi0+U3dhcEJ1ZmZlcnMoKTsKLX0KLSNlbmRpZgotCi0vKiBJcyB0aGUgc3lzdGVtIHBhbGV0dGUgc2V0dGFibGU/ICovCi1pbnQgQkVfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQotewotCWludCBpOwotCVNETF9QYWxldHRlICpwYWxldHRlOwotCWNvbnN0IGNvbG9yX21hcCAqY21hcCA9IEJTY3JlZW4oKS5Db2xvck1hcCgpOwotCi0JLyogR2V0IHRoZSBzY3JlZW4gY29sb3JtYXAgKi8KLQlwYWxldHRlID0gX3RoaXMtPnNjcmVlbi0+Zm9ybWF0LT5wYWxldHRlOwotCWZvciAoIGk9MDsgaTwyNTY7ICsraSApIHsKLQkJcGFsZXR0ZS0+Y29sb3JzW2ldLnIgPSBjbWFwLT5jb2xvcl9saXN0W2ldLnJlZDsKLQkJcGFsZXR0ZS0+Y29sb3JzW2ldLmcgPSBjbWFwLT5jb2xvcl9saXN0W2ldLmdyZWVuOwotCQlwYWxldHRlLT5jb2xvcnNbaV0uYiA9IGNtYXAtPmNvbG9yX2xpc3RbaV0uYmx1ZTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIEJFX1ZpZGVvUXVpdChfVEhJUykKLXsKLQlpbnQgaSwgajsKLQotCVNETF9XaW4tPlF1aXQoKTsKLQlTRExfV2luID0gTlVMTDsKLQotCWlmICggU0RMX0JsYW5rQ3Vyc29yICE9IE5VTEwgKSB7Ci0JCUJFX0ZyZWVXTUN1cnNvcihfdGhpcywgU0RMX0JsYW5rQ3Vyc29yKTsKLQkJU0RMX0JsYW5rQ3Vyc29yID0gTlVMTDsKLQl9Ci0JZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKLQkJaWYgKCBTRExfbW9kZWxpc3RbaV0gKSB7Ci0JCQlmb3IgKCBqPTA7IFNETF9tb2RlbGlzdFtpXVtqXTsgKytqICkgewotCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXVtqXSk7Ci0JCQl9Ci0JCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOwotCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKLQkJfQotCX0KLQkvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB2aWRlbyBtb2RlICovCi0JaWYgKCBfdGhpcy0+c2NyZWVuICkgewotCQlpZiAoIChfdGhpcy0+c2NyZWVuLT5mbGFncyZTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQlCU2NyZWVuIGJzY3JlZW47Ci0JCQlic2NyZWVuLlNldE1vZGUoJnNhdmVkX21vZGUpOwotCQl9Ci0JCV90aGlzLT5zY3JlZW4tPnBpeGVscyA9IE5VTEw7Ci0JfQotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotCWlmIChfdGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUgIT0gTlVMTCkKLQkJdW5sb2FkX2FkZF9vbigoaW1hZ2VfaWQpX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKTsKLSNlbmRpZgotCi0JU0RMX1F1aXRCZUFwcCgpOwotfQotCi19OyAvKiBFeHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9zeXN3bS5jYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzd20uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODNjYWYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9zeXN3bS5jYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX0JXaW4uaCIKLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiU0RMX3N5c3dtX2MuaCIKLSNpbmNsdWRlICJTRExfZXJyb3IuaCIKLSNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKLQotdm9pZCBCRV9TZXRXTUNhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKQotewotCVNETF9XaW4tPlNldFRpdGxlKHRpdGxlKTsKLX0KLQotaW50IEJFX0ljb25pZnlXaW5kb3coX1RISVMpCi17Ci0JU0RMX1dpbi0+TWluaW1pemUodHJ1ZSk7Ci19Ci0KLVNETF9HcmFiTW9kZSBCRV9HcmFiSW5wdXQoX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKQotewotCWlmICggbW9kZSA9PSBTRExfR1JBQl9PRkYgKSB7Ci0vLwkJYmVfYXBwLT5TaG93Q3Vyc29yKCk7Ci0JCWlmICggIShTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSkgKSB7Ci0JCS8qCUJlU21hbjogSmFuIDIsIDIwMDYKLQkJCW11c3QgYmUgbGVhdmluZyByZWxhdGl2ZSBtb2RlLCBtb3ZlIG1vdXNlIGZyb20KLQkJCWNlbnRlciBvZiB3aW5kb3cgdG8gd2hlcmUgaXQgYmVsb25ncyAuLi4gKi8KLQkJCUJQb2ludCBwdDsKLQkJCWludCB4LCB5OwotCQkJU0RMX0dldE1vdXNlU3RhdGUoJngsJnkpOwotCQkJcHQueCA9IHg7Ci0JCQlwdC55ID0geTsKLQkJCVNETF9XaW4tPkxvY2soKTsKLQkJCVNETF9XaW4tPkNvbnZlcnRUb1NjcmVlbigmcHQpOwotCQkJU0RMX1dpbi0+VW5sb2NrKCk7Ci0JCQlzZXRfbW91c2VfcG9zaXRpb24oKGludClwdC54LCAoaW50KXB0LnkpOwotCQl9Ci0JfSBlbHNlIHsKLS8vCQliZV9hcHAtPkhpZGVDdXJzb3IoKTsKLQkJaWYgKCAhKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9WSVNJQkxFKSApIHsKLQkJLyoJQmVTbWFuOiBKYW4gMiwgMjAwNgotCQkJbXVzdCBiZSBlbnRlcmluZyByZWxhdGl2ZSBtb2RlLCBnZXQgcmVhZHkgYnkKLQkJCW1vdmluZyBtb3VzZSB0bwljZW50ZXIgb2Ygd2luZG93IC4uLiAqLwotCQkJQlBvaW50IHB0OwotCQkJcHQueCA9IChTRExfVmlkZW9TdXJmYWNlLT53LzIpOwotCQkJcHQueSA9IChTRExfVmlkZW9TdXJmYWNlLT5oLzIpOwotCQkJU0RMX1dpbi0+TG9jaygpOwotCQkJU0RMX1dpbi0+Q29udmVydFRvU2NyZWVuKCZwdCk7Ci0JCQlTRExfV2luLT5VbmxvY2soKTsKLQkJCXNldF9tb3VzZV9wb3NpdGlvbigoaW50KXB0LngsIChpbnQpcHQueSk7Ci0JCX0KLQl9Ci0JcmV0dXJuKG1vZGUpOwotfQotCi1pbnQgQkVfR2V0V01JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKQotewotICAgIGlmIChpbmZvLT52ZXJzaW9uLm1ham9yIDw9IFNETF9NQUpPUl9WRVJTSU9OKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiQXBwbGljYXRpb24gbm90IGNvbXBpbGVkIHdpdGggU0RMICVkLiVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIFNETF9NQUpPUl9WRVJTSU9OLCBTRExfTUlOT1JfVkVSU0lPTik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLX07IC8qIEV4dGVybiBDICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3dtX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzd21fYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDMzYzVlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzd21fYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfc3lzd20uaCIKLSNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKLQotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KLWV4dGVybiB2b2lkIEJFX1NldFdNQ2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pOwotZXh0ZXJuIGludCBCRV9JY29uaWZ5V2luZG93KF9USElTKTsKLWV4dGVybiBpbnQgQkVfR2V0V01JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKTsKLWV4dGVybiBTRExfR3JhYk1vZGUgQkVfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9zeXN5dXYuY2MgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3l1di5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU3YTEyMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3l1di5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBpcyB0aGUgQmVPUyB2ZXJzaW9uIG9mIFNETCBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN5dXYuaCIKLSNpbmNsdWRlICIuLi9TRExfeXV2ZnVuY3MuaCIKLQotZXh0ZXJuICJDIiB7Ci0KLS8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBtYW5pcHVsYXRlIHNvZnR3YXJlIHZpZGVvIG92ZXJsYXlzICovCi1zdGF0aWMgc3RydWN0IHByaXZhdGVfeXV2aHdmdW5jcyBiZV95dXZmdW5jcyA9Ci17Ci0gICAgQkVfTG9ja1lVVk92ZXJsYXksCi0gICAgQkVfVW5sb2NrWVVWT3ZlcmxheSwKLSAgICBCRV9EaXNwbGF5WVVWT3ZlcmxheSwKLSAgICBCRV9GcmVlWVVWT3ZlcmxheQotfTsKLQotQkJpdG1hcCAqIEJFX0dldE92ZXJsYXlCaXRtYXAoQlJlY3QgYm91bmRzLCBjb2xvcl9zcGFjZSBjcykgewotCUJCaXRtYXAgKmJiaXRtYXA7Ci0JYmJpdG1hcCA9IG5ldyBCQml0bWFwKGJvdW5kcyxCX0JJVE1BUF9XSUxMX09WRVJMQVksY3MpOwotCWlmICghYmJpdG1hcCB8fCBiYml0bWFwLT5Jbml0Q2hlY2soKSAhPSBCX09LKSB7Ci0JCWRlbGV0ZSBiYml0bWFwOwotCQlyZXR1cm4gMDsKLQl9Ci0Jb3ZlcmxheV9yZXN0cmljdGlvbnMgcjsKLQliYml0bWFwLT5HZXRPdmVybGF5UmVzdHJpY3Rpb25zKCZyKTsKLQl1aW50MzIgd2lkdGggPSBib3VuZHMuSW50ZWdlcldpZHRoKCkgKyAxOwotCXVpbnQzMiBoZWlnaHQgPSBib3VuZHMuSW50ZWdlckhlaWdodCgpICsgMTsKLQl1aW50MzIgd2lkdGhfcGFkZGluZyA9IDA7Ci0JdWludDMyIGhlaWdodF9wYWRkaW5nID0gMDsKLQlpZiAoKHIuc291cmNlLmhvcml6b250YWxfYWxpZ25tZW50ICE9IDApIHx8Ci0JICAgIChyLnNvdXJjZS52ZXJ0aWNhbF9hbGlnbm1lbnQgIT0gMCkpIHsKLQkJZGVsZXRlIGJiaXRtYXA7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoci5zb3VyY2Uud2lkdGhfYWxpZ25tZW50ICE9IDApIHsKLQkJdWludDMyIGFsaWduZWRfd2lkdGggPSByLnNvdXJjZS53aWR0aF9hbGlnbm1lbnQgKyAxOwotCQlpZiAod2lkdGggJSBhbGlnbmVkX3dpZHRoID4gMCkgewotCQkJd2lkdGhfcGFkZGluZyA9IGFsaWduZWRfd2lkdGggLSB3aWR0aCAlIGFsaWduZWRfd2lkdGg7Ci0JCX0KLQl9Ci0JaWYgKHIuc291cmNlLmhlaWdodF9hbGlnbm1lbnQgIT0gMCkgewotCQl1aW50MzIgYWxpZ25lZF9oZWlnaHQgPSByLnNvdXJjZS5oZWlnaHRfYWxpZ25tZW50ICsgMTsKLQkJaWYgKGhlaWdodCAlIGFsaWduZWRfaGVpZ2h0ID4gMCkgewotCQkJZnByaW50ZihzdGRlcnIsIkdldE92ZXJsYXlCaXRtYXAgZmFpbGVkIGhlaWdodCBhbGlnbm1lbnRcbiIpOwotCQkJZnByaW50ZihzdGRlcnIsIi0gaGVpZ2h0ID0gJWx1LCBhbGlnbmVkX2hlaWdodCA9ICVsdVxuIixoZWlnaHQsYWxpZ25lZF9oZWlnaHQpOwotCQkJZGVsZXRlIGJiaXRtYXA7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAoKHIuc291cmNlLm1pbl93aWR0aCA+IHdpZHRoKSB8fAotCSAgICAoci5zb3VyY2UubWluX2hlaWdodCA+IGhlaWdodCkgfHwKLQkgICAgKHIuc291cmNlLm1heF93aWR0aCA8IHdpZHRoKSB8fAotCSAgICAoci5zb3VyY2UubWF4X2hlaWdodCA8IGhlaWdodCkpIHsKLQkJZnByaW50ZihzdGRlcnIsIkdldE92ZXJsYXlCaXRtYXAgZmFpbGVkIGJvdW5kcyB0ZXN0c1xuIik7Ci0JICAgIGRlbGV0ZSBiYml0bWFwOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JaWYgKCh3aWR0aF9wYWRkaW5nICE9IDApIHx8IChoZWlnaHRfcGFkZGluZyAhPSAwKSkgewotCQlkZWxldGUgYmJpdG1hcDsKLQkJYm91bmRzLlNldChib3VuZHMubGVmdCxib3VuZHMudG9wLGJvdW5kcy5yaWdodCt3aWR0aF9wYWRkaW5nLGJvdW5kcy5ib3R0b20raGVpZ2h0X3BhZGRpbmcpOwotCQliYml0bWFwID0gbmV3IEJCaXRtYXAoYm91bmRzLEJfQklUTUFQX1dJTExfT1ZFUkxBWSxjcyk7Ci0JCWlmICghYmJpdG1hcCB8fCBiYml0bWFwLT5Jbml0Q2hlY2soKSAhPSBCX09LKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwiR2V0T3ZlcmxheUJpdG1hcCBmYWlsZWQgbGF0ZVxuIik7Ci0JCQlkZWxldGUgYmJpdG1hcDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQkJCi0JcmV0dXJuIGJiaXRtYXA7CSAgICAKLX0KLQotLy8gU2VlIDxHcmFwaGljc0RlZnMuaD4gW2J0dzogQ2I9VSwgQ3I9Vl0KLS8vIFNlZSBhbHNvIGh0dHA6Ly93d3cuZm91cmNjLm9yZy9pbmRleHl1di5odG0KLWVudW0gY29sb3Jfc3BhY2UgY29udmVydF9jb2xvcl9zcGFjZShVaW50MzIgZm9ybWF0KSB7Ci0Jc3dpdGNoIChmb3JtYXQpIHsKLQljYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0JCXJldHVybiBCX1lVVjk7Ci0JY2FzZSBTRExfSVlVVl9PVkVSTEFZOgotCQlyZXR1cm4gQl9ZVVYxMjsKLQljYXNlIFNETF9ZVVkyX09WRVJMQVk6Ci0JCXJldHVybiBCX1lDYkNyNDIyOwotCWNhc2UgU0RMX1VZVllfT1ZFUkxBWToKLQkJcmV0dXJuIEJfWVVWNDIyOwotCWNhc2UgU0RMX1lWWVVfT1ZFUkxBWTogLy8gbm90IHN1cHBvcnRlZCBvbiBiZW9zPwotCQlyZXR1cm4gQl9OT19DT0xPUl9TUEFDRTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gQl9OT19DT0xPUl9TUEFDRTsKLQl9Ci19Ci0KLS8vIFNlZSBTRExfdmlkZW8uaAotaW50IGNvdW50X3BsYW5lcyhVaW50MzIgZm9ybWF0KSB7Ci0Jc3dpdGNoIChmb3JtYXQpIHsKLQljYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0JY2FzZSBTRExfSVlVVl9PVkVSTEFZOgotCQlyZXR1cm4gMzsKLQljYXNlIFNETF9ZVVkyX09WRVJMQVk6Ci0JY2FzZSBTRExfVVlWWV9PVkVSTEFZOgotCWNhc2UgU0RMX1lWWVVfT1ZFUkxBWToKLQkJcmV0dXJuIDE7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQkJCi0KLVNETF9PdmVybGF5ICpCRV9DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KSB7Ci0JU0RMX092ZXJsYXkqIG92ZXJsYXk7Ci0Jc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhKiBod2RhdGE7Ci0JQkJpdG1hcCAqYmJpdG1hcDsKLQlpbnQgcGxhbmVzOwotCUJSZWN0IGJvdW5kczsKLQljb2xvcl9zcGFjZSBjczsKLQkKLQkvKiBmaW5kIHRoZSBhcHByb3ByaWF0ZSBCZU9TIGNvbG9yc3BhY2UgZGVzY3JpcHRvciAqLwotCWNzID0gY29udmVydF9jb2xvcl9zcGFjZShmb3JtYXQpOwotCWlmIChjcyA9PSBCX05PX0NPTE9SX1NQQUNFKQotCXsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCS8qIGNvdW50IHBsYW5lcyAqLwotCXBsYW5lcyA9IGNvdW50X3BsYW5lcyhmb3JtYXQpOwotCWlmIChwbGFuZXMgPT0gMCkKLQl7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBUT0RPOiBmaWd1cmUgb3V0IHBsYW5hciBtb2RlcywgaWYgYW55b25lIGNhcmVzICovCi0JaWYgKHBsYW5lcyA9PSAzKQotCXsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgLyogQ3JlYXRlIHRoZSBvdmVybGF5IHN0cnVjdHVyZSAqLwotICAgIG92ZXJsYXkgPSAoU0RMX092ZXJsYXkqKVNETF9jYWxsb2MoMSwgc2l6ZW9mKFNETF9PdmVybGF5KSk7Ci0KLSAgICBpZiAob3ZlcmxheSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIEZpbGwgaW4gdGhlIGJhc2ljIG1lbWJlcnMgKi8KLSAgICBvdmVybGF5LT5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgb3ZlcmxheS0+dyA9IHdpZHRoOwotICAgIG92ZXJsYXktPmggPSBoZWlnaHQ7Ci0gICAgb3ZlcmxheS0+aHdkYXRhID0gTlVMTDsKLQkKLSAgICAvKiBTZXQgdXAgdGhlIFlVViBzdXJmYWNlIGZ1bmN0aW9uIHN0cnVjdHVyZSAqLwotICAgIG92ZXJsYXktPmh3ZnVuY3MgPSAmYmVfeXV2ZnVuY3M7Ci0KLSAgICAvKiBDcmVhdGUgdGhlIHBpeGVsIGRhdGEgYW5kIGxvb2t1cCB0YWJsZXMgKi8KLSAgICBod2RhdGEgPSAoc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhKilTRExfY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEpKTsKLQotICAgIGlmIChod2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIG92ZXJsYXktPmh3ZGF0YSA9IGh3ZGF0YTsKLQlvdmVybGF5LT5od2RhdGEtPmRpc3BsYXkgPSBkaXNwbGF5OwotCW92ZXJsYXktPmh3ZGF0YS0+YnZpZXcgPSBOVUxMOwotCW92ZXJsYXktPmh3ZGF0YS0+YmJpdG1hcCA9IE5VTEw7Ci0Jb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQgPSAwOwotCi0JLyogQ3JlYXRlIHRoZSBCQml0bWFwIGZyYW1lYnVmZmVyICovCi0JYm91bmRzLnRvcCA9IDA7CWJvdW5kcy5sZWZ0ID0gMDsKLQlib3VuZHMucmlnaHQgPSB3aWR0aC0xOwotCWJvdW5kcy5ib3R0b20gPSBoZWlnaHQtMTsKLQkKLQlCVmlldyAqIGJ2aWV3ID0gbmV3IEJWaWV3KGJvdW5kcywib3ZlcmxheSIsQl9GT0xMT1dfTk9ORSxCX1dJTExfRFJBVyk7IAotCWlmICghYnZpZXcpIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgIFNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCW92ZXJsYXktPmh3ZGF0YS0+YnZpZXcgPSBidmlldzsKLQlvdmVybGF5LT5od2RhdGEtPmZpcnN0X2Rpc3BsYXkgPSB0cnVlOwotCWJ2aWV3LT5IaWRlKCk7Ci0JCi0JYmJpdG1hcCA9IEJFX0dldE92ZXJsYXlCaXRtYXAoYm91bmRzLGNzKTsKLQlpZiAoIWJiaXRtYXApIHsKLQkJb3ZlcmxheS0+aHdkYXRhLT5iYml0bWFwID0gTlVMTDsKLQkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3ZlcmxheS0+aHdkYXRhLT5iYml0bWFwID0gYmJpdG1hcDsKLQkKLQlvdmVybGF5LT5wbGFuZXMgPSBwbGFuZXM7Ci0Jb3ZlcmxheS0+cGl0Y2hlcyA9IChVaW50MTYqKVNETF9jYWxsb2Mob3ZlcmxheS0+cGxhbmVzLCBzaXplb2YoVWludDE2KSk7Ci0Jb3ZlcmxheS0+cGl4ZWxzICA9IChVaW50OCoqKVNETF9jYWxsb2Mob3ZlcmxheS0+cGxhbmVzLCBzaXplb2YoVWludDgqKSk7Ci0JaWYgKCFvdmVybGF5LT5waXRjaGVzIHx8ICFvdmVybGF5LT5waXhlbHMpCi0JewotICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotICAgICAgICByZXR1cm4oTlVMTCk7Ci0gICAgfQotCi0gICAJb3ZlcmxheS0+cGl0Y2hlc1swXSA9IGJiaXRtYXAtPkJ5dGVzUGVyUm93KCk7Ci0gICAJb3ZlcmxheS0+cGl4ZWxzWzBdICA9IChVaW50OCAqKWJiaXRtYXAtPkJpdHMoKTsKLQlvdmVybGF5LT5od19vdmVybGF5ID0gMTsKLQkKLQlpZiAoU0RMX1dpbi0+TG9ja1dpdGhUaW1lb3V0KDEwMDAwMDApICE9IEJfT0spIHsKLSAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotICAgICAgICByZXR1cm4oTlVMTCk7Ci0gICAgfQotCUJWaWV3ICogdmlldyA9IFNETF9XaW4tPlZpZXcoKTsKLSAgICB2aWV3LT5BZGRDaGlsZChidmlldyk7Ci0gICAgcmdiX2NvbG9yIGtleTsKLSAgICBidmlldy0+U2V0Vmlld092ZXJsYXkoYmJpdG1hcCxib3VuZHMsYnZpZXctPkJvdW5kcygpLCZrZXksQl9GT0xMT1dfQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJfT1ZFUkxBWV9GSUxURVJfSE9SSVpPTlRBTHxCX09WRVJMQVlfRklMVEVSX1ZFUlRJQ0FMKTsKLSAgICBidmlldy0+U2V0Vmlld0NvbG9yKGtleSk7Ci0gICAgYnZpZXctPkZsdXNoKCk7Ci0JU0RMX1dpbi0+VW5sb2NrKCk7Ci0JCi0JY3VycmVudF9vdmVybGF5PW92ZXJsYXk7Ci0gICAgICAgIAotCXJldHVybiBvdmVybGF5OwotfQotCi1pbnQgQkVfTG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5KiBvdmVybGF5KQotewotICAgIGlmIChvdmVybGF5ID09IE5VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBvdmVybGF5LT5od2RhdGEtPmxvY2tlZCA9IDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQkVfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXkpCi17Ci0gICAgaWYgKG92ZXJsYXkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQgPSAwOwotfQotCi1pbnQgQkVfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5KiBvdmVybGF5LCBTRExfUmVjdCogc3JjLCBTRExfUmVjdCAqZHN0KQotewotICAgIGlmICgob3ZlcmxheSA9PSBOVUxMKSB8fCAob3ZlcmxheS0+aHdkYXRhPT1OVUxMKQotICAgICAgICB8fCAob3ZlcmxheS0+aHdkYXRhLT5idmlldz09TlVMTCkgfHwgKFNETF9XaW4tPlZpZXcoKSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKFNETF9XaW4tPkxvY2tXaXRoVGltZW91dCg1MDAwMCkgIT0gQl9PSykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQlZpZXcgKiBidmlldyA9IG92ZXJsYXktPmh3ZGF0YS0+YnZpZXc7Ci0gICAgaWYgKFNETF9XaW4tPklzRnVsbFNjcmVlbigpKSB7Ci0gICAgCWludCBsZWZ0LHRvcDsKLSAgICAJU0RMX1dpbi0+R2V0WFlPZmZzZXQobGVmdCx0b3ApOwotCSAgICBidmlldy0+TW92ZVRvKGxlZnQrZHN0LT54LHRvcCtkc3QtPnkpOwotICAgIH0gZWxzZSB7Ci0JICAgIGJ2aWV3LT5Nb3ZlVG8oZHN0LT54LGRzdC0+eSk7Ci0gICAgfQotICAgIGJ2aWV3LT5SZXNpemVUbyhkc3QtPncsZHN0LT5oKTsKLSAgICBidmlldy0+Rmx1c2goKTsKLQlpZiAob3ZlcmxheS0+aHdkYXRhLT5maXJzdF9kaXNwbGF5KSB7Ci0JCWJ2aWV3LT5TaG93KCk7Ci0JCW92ZXJsYXktPmh3ZGF0YS0+Zmlyc3RfZGlzcGxheSA9IGZhbHNlOwotCX0KLSAgICBTRExfV2luLT5VbmxvY2soKTsKLSAgICAKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBCRV9GcmVlWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCi17Ci0gICAgaWYgKG92ZXJsYXkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAob3ZlcmxheS0+aHdkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY3VycmVudF9vdmVybGF5PU5VTEw7Ci0KLQlkZWxldGUgb3ZlcmxheS0+aHdkYXRhLT5iYml0bWFwOwotCi0gICAgU0RMX2ZyZWUob3ZlcmxheS0+aHdkYXRhKTsKLX0KLQotfTsgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9zeXN5dXYuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzeXV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODU5ZjIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9id2luZG93L1NETF9zeXN5dXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0KLSNpZm5kZWYgX19TRExfU1lTX1lVVl9IX18KLSNkZWZpbmUgX19TRExfU1lTX1lVVl9IX18KLQotLyogVGhpcyBpcyB0aGUgQmVPUyBpbXBsZW1lbnRhdGlvbiBvZiBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgotCi1leHRlcm4gIkMiIHsKLQotc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhCi17Ci0vKiAgRlJBTUVEQVRBKiBDdXJyZW50RnJhbWVEYXRhOwotICAgIEZSQU1FREFUQSogRnJhbWVEYXRhMDsKLSAgICBGUkFNRURBVEEqIEZyYW1lRGF0YTE7Ci0gICAgUGdTY2FsZXJQcm9wc190ICAgcHJvcHM7Ci0gICAgUGdTY2FsZXJDYXBzX3QgICAgY2FwczsKLSAgICBQZ1ZpZGVvQ2hhbm5lbF90KiBjaGFubmVsOwotICAgIFBoQXJlYV90IEN1cnJlbnRWaWV3UG9ydDsKLSAgICBQaFBvaW50X3QgQ3VycmVudFdpbmRvd1BvczsKLSAgICBsb25nIGZvcm1hdDsKLSAgICBpbnQgc2NhbGVyX29uOwotICAgIGludCBjdXJyZW50OwotICAgIGxvbmcgWVN0cmlkZTsKLSAgICBsb25nIFZTdHJpZGU7Ci0gICAgbG9uZyBVU3RyaWRlOwotICAgIGludCBpc2Nocm9tYWtleTsKLSAgICBsb25nIGNocm9tYWtleTsKLSAgICBpbnQgZm9yY2VkcmVkcmF3OwotICAgIHVuc2lnbmVkIGxvbmcgU3RhdGU7Ci0gICAgbG9uZyBmbGFnczsKLSovCi0JU0RMX1N1cmZhY2UgKmRpc3BsYXk7Ci0JQlZpZXcgKmJ2aWV3OwotCWJvb2wgZmlyc3RfZGlzcGxheTsKLQlCQml0bWFwICpiYml0bWFwOwotICAgIGludCBsb2NrZWQ7Ci19OwotCi1leHRlcm4gQkJpdG1hcCAqIEJFX0dldE92ZXJsYXlCaXRtYXAoQlJlY3QgYm91bmRzLCBjb2xvcl9zcGFjZSBjcyk7Ci1leHRlcm4gU0RMX092ZXJsYXkqIEJFX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UqIGRpc3BsYXkpOwotZXh0ZXJuIGludCBCRV9Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXkpOwotZXh0ZXJuIHZvaWQgQkVfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXkpOwotZXh0ZXJuIGludCBCRV9EaXNwbGF5WVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXksIFNETF9SZWN0KiBzcmMsIFNETF9SZWN0KiBkc3QpOwotZXh0ZXJuIHZvaWQgQkVfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5KiBvdmVybGF5KTsKLQotfTsKLQotI2VuZGlmIC8qIF9fU0RMX1BIX1lVVl9IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2FtaWdhZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9hbWlnYWV2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNkMGZhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2FtaWdhZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEhhbmRsZSB0aGUgZXZlbnQgc3RyZWFtLCBjb252ZXJ0aW5nIEFtaWdhIGV2ZW50cyBpbnRvIFNETCBldmVudHMgKi8KLSNpbmNsdWRlICJTREwuaCIKLQotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9jZ3h2aWRlby5oIgotI2luY2x1ZGUgIlNETF9jZ3htb2Rlc19jLmgiCi0jaW5jbHVkZSAiU0RMX2NneGltYWdlX2MuaCIKLSNpbmNsdWRlICJTRExfY2d4d21fYy5oIgotI2luY2x1ZGUgIlNETF9hbWlnYWV2ZW50c19jLmgiCi0KLQotLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlcyBmcm9tIGFuIEFtaWdhIGtleXN5bSB0byBhIFNETCBrZXlzeW0gKi8KLXN0YXRpYyBTRExLZXkgTUlTQ19rZXltYXBbMjU2XTsKLVNETF9rZXlzeW0gKmFtaWdhX1RyYW5zbGF0ZUtleShpbnQgY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKTsKLXN0cnVjdCBJT1N0ZFJlcSAqQ29uUmVxPU5VTEw7Ci1zdHJ1Y3QgTXNnUG9ydCAqQ29uUG9ydD1OVUxMOwotCi0vKiBOb3RlOiAgVGhlIFggc2VydmVyIGJ1ZmZlcnMgYW5kIGFjY3VtdWxhdGVzIG1vdXNlIG1vdGlvbiBldmVudHMsIHNvCi0gICB0aGUgbW90aW9uIGV2ZW50IGdlbmVyYXRlZCBieSB0aGUgd2FycCBtYXkgbm90IGFwcGVhciBleGFjdGx5IGFzIHdlCi0gICBleHBlY3QgaXQgdG8uICBXZSB3b3JrIGFyb3VuZCB0aGlzIChhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZSkgYnkgb25seQotICAgd2FycGluZyB0aGUgcG9pbnRlciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVkZ2UsIGFuZCB0aGVuIHdhaXQgZm9yIGl0LgotKi8KLSNkZWZpbmUgTU9VU0VfRlVER0VfRkFDVE9SCTgKLQotI2lmIDAKLQotc3RhdGljIGlubGluZSBpbnQgYW1pZ2FfV2FycGVkTW90aW9uKF9USElTLCBzdHJ1Y3QgSW50dWlNZXNzYWdlICptKQotewotCWludCB3LCBoLCBpOwotCWludCBkZWx0YXgsIGRlbHRheTsKLQlpbnQgcG9zdGVkOwotCi0JdyA9IFNETF9WaWRlb1N1cmZhY2UtPnc7Ci0JaCA9IFNETF9WaWRlb1N1cmZhY2UtPmg7Ci0JZGVsdGF4ID0geGV2ZW50LT54bW90aW9uLnggLSBtb3VzZV9sYXN0Lng7Ci0JZGVsdGF5ID0geGV2ZW50LT54bW90aW9uLnkgLSBtb3VzZV9sYXN0Lnk7Ci0jaWZkZWYgREVCVUdfTU9USU9OCi0gIHByaW50ZigiV2FycGVkIG1vdXNlIG1vdGlvbjogJWQsJWRcbiIsIGRlbHRheCwgZGVsdGF5KTsKLSNlbmRpZgotCW1vdXNlX2xhc3QueCA9IHhldmVudC0+eG1vdGlvbi54OwotCW1vdXNlX2xhc3QueSA9IHhldmVudC0+eG1vdGlvbi55OwotCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgZGVsdGF4LCBkZWx0YXkpOwotCi0JaWYgKCAoeGV2ZW50LT54bW90aW9uLnggPCBNT1VTRV9GVURHRV9GQUNUT1IpIHx8Ci0JICAgICAoeGV2ZW50LT54bW90aW9uLnggPiAody1NT1VTRV9GVURHRV9GQUNUT1IpKSB8fAotCSAgICAgKHhldmVudC0+eG1vdGlvbi55IDwgTU9VU0VfRlVER0VfRkFDVE9SKSB8fAotCSAgICAgKHhldmVudC0+eG1vdGlvbi55ID4gKGgtTU9VU0VfRlVER0VfRkFDVE9SKSkgKSB7Ci0JCS8qIEdldCB0aGUgZXZlbnRzIHRoYXQgaGF2ZSBhY2N1bXVsYXRlZCAqLwotCQl3aGlsZSAoIFhDaGVja1R5cGVkRXZlbnQoU0RMX0Rpc3BsYXksIE1vdGlvbk5vdGlmeSwgeGV2ZW50KSApIHsKLQkJCWRlbHRheCA9IHhldmVudC0+eG1vdGlvbi54IC0gbW91c2VfbGFzdC54OwotCQkJZGVsdGF5ID0geGV2ZW50LT54bW90aW9uLnkgLSBtb3VzZV9sYXN0Lnk7Ci0jaWZkZWYgREVCVUdfTU9USU9OCi0gIHByaW50ZigiRXh0cmEgbW91c2UgbW90aW9uOiAlZCwlZFxuIiwgZGVsdGF4LCBkZWx0YXkpOwotI2VuZGlmCi0JCQltb3VzZV9sYXN0LnggPSB4ZXZlbnQtPnhtb3Rpb24ueDsKLQkJCW1vdXNlX2xhc3QueSA9IHhldmVudC0+eG1vdGlvbi55OwotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgZGVsdGF4LCBkZWx0YXkpOwotCQl9Ci0JCW1vdXNlX2xhc3QueCA9IHcvMjsKLQkJbW91c2VfbGFzdC55ID0gaC8yOwotCQlYV2FycFBvaW50ZXIoU0RMX0Rpc3BsYXksIE5vbmUsIFNETF9XaW5kb3csIDAsIDAsIDAsIDAsCi0JCQkJCW1vdXNlX2xhc3QueCwgbW91c2VfbGFzdC55KTsKLQkJZm9yICggaT0wOyBpPDEwOyArK2kgKSB7Ci0gICAgICAgIAkJWE1hc2tFdmVudChTRExfRGlzcGxheSwgUG9pbnRlck1vdGlvbk1hc2ssIHhldmVudCk7Ci0JCQlpZiAoICh4ZXZlbnQtPnhtb3Rpb24ueCA+Ci0JCQkgICAgICAgICAgKG1vdXNlX2xhc3QueC1NT1VTRV9GVURHRV9GQUNUT1IpKSAmJgotCQkJICAgICAoeGV2ZW50LT54bW90aW9uLnggPAotCQkJICAgICAgICAgIChtb3VzZV9sYXN0LngrTU9VU0VfRlVER0VfRkFDVE9SKSkgJiYKLQkJCSAgICAgKHhldmVudC0+eG1vdGlvbi55ID4KLQkJCSAgICAgICAgICAobW91c2VfbGFzdC55LU1PVVNFX0ZVREdFX0ZBQ1RPUikpICYmCi0JCQkgICAgICh4ZXZlbnQtPnhtb3Rpb24ueSA8Ci0JCQkgICAgICAgICAgKG1vdXNlX2xhc3QueStNT1VTRV9GVURHRV9GQUNUT1IpKSApIHsKLQkJCQlicmVhazsKLQkJCX0KLSNpZmRlZiBERUJVR19YRVZFTlRTCi0gIHByaW50ZigiTG9zdCBtb3VzZSBtb3Rpb246ICVkLCVkXG4iLCB4ZXZlbnQtPnhtb3Rpb24ueCwgeGV2ZW50LT54bW90aW9uLnkpOwotI2VuZGlmCi0JCX0KLSNpZmRlZiBERUJVR19YRVZFTlRTCi0JCWlmICggaSA9PSAxMCApIHsKLQkJCXByaW50ZigiV2FybmluZzogZGlkbid0IGRldGVjdCBtb3VzZSB3YXJwIG1vdGlvblxuIik7Ci0JCX0KLSNlbmRpZgotCX0KLQlyZXR1cm4ocG9zdGVkKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYW1pZ2FfR2V0QnV0dG9uKGludCBjb2RlKQotewotCXN3aXRjaChjb2RlKQotCXsKLQkJY2FzZSBJRUNPREVfTUJVVFRPTjoKLQkJCXJldHVybiBTRExfQlVUVE9OX01JRERMRTsKLQkJY2FzZSBJRUNPREVfUkJVVFRPTjoKLQkJCXJldHVybiBTRExfQlVUVE9OX1JJR0hUOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIFNETF9CVVRUT05fTEVGVDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYW1pZ2FfRGlzcGF0Y2hFdmVudChfVEhJUyxzdHJ1Y3QgSW50dWlNZXNzYWdlICptc2cpCi17Ci0JaW50IGNsYXNzPW1zZy0+Q2xhc3MsY29kZT1tc2ctPkNvZGU7Ci0JaW50IHBvc3RlZDsKLQotCXBvc3RlZCA9IDA7Ci0Jc3dpdGNoIChjbGFzcykgewotCSAgICAvKiBHYWluaW5nIG1vdXNlIGNvdmVyYWdlPyAqLwotCSAgICBjYXNlIElEQ01QX0FDVElWRVdJTkRPVzoKLQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQkJCWJyZWFrOwotCi0JICAgIC8qIExvc2luZyBtb3VzZSBjb3ZlcmFnZT8gKi8KLQkgICAgY2FzZSBJRENNUF9JTkFDVElWRVdJTkRPVzoKLQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQkJCWJyZWFrOwotI2lmIDAKLQkgICAgLyogR2FpbmluZyBpbnB1dCBmb2N1cz8gKi8KLQkgICAgY2FzZSBJRENNUF9BQ1RJVkVXSU5ET1c6Ci0JCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQSU5QVVRGT0NVUyk7Ci0KLQkJCS8qIFF1ZXVlIGVudHJ5IGludG8gZnVsbHNjcmVlbiBtb2RlICovCi0JCQlzd2l0Y2hfd2FpdGluZyA9IDB4MDEgfCBTRExfRlVMTFNDUkVFTjsKLQkJCXN3aXRjaF90aW1lID0gU0RMX0dldFRpY2tzKCkgKyAxNTAwOwotCQkgICAgYnJlYWs7Ci0KLQkgICAgLyogTG9zaW5nIGlucHV0IGZvY3VzPyAqLwotCSAgICBjYXNlIElEQ01QX0lOQUNUSVZFV0lORE9XOgotCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUElOUFVURk9DVVMpOwotCi0JCS8qIFF1ZXVlIGxlYXZpbmcgZnVsbHNjcmVlbiBtb2RlICovCi0JCQlzd2l0Y2hfd2FpdGluZyA9IDB4MDE7Ci0JCQlzd2l0Y2hfdGltZSA9IFNETF9HZXRUaWNrcygpICsgMjAwOwotCQkgICAgYnJlYWs7Ci0jZW5kaWYKLQkgICAgLyogTW91c2UgbW90aW9uPyAqLwotCSAgICBjYXNlIElEQ01QX01PVVNFTU9WRToKLQkJCWlmICggU0RMX1ZpZGVvU3VyZmFjZSApIHsKLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsCi0JCQkJCQltc2ctPk1vdXNlWC1TRExfV2luZG93LT5Cb3JkZXJMZWZ0LAotCQkJCQkJbXNnLT5Nb3VzZVktU0RMX1dpbmRvdy0+Qm9yZGVyVG9wKTsKLQkJCX0KLQkgICAgCWJyZWFrOwotCi0JICAgIC8qIE1vdXNlIGJ1dHRvbiBwcmVzcz8gKi8KLQkJY2FzZSBJRENNUF9NT1VTRUJVVFRPTlM6Ci0KLQkJCWlmKCEoY29kZSZJRUNPREVfVVBfUFJFRklYKSkKLQkJCXsKLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELAotCQkJCQkJYW1pZ2FfR2V0QnV0dG9uKGNvZGUpLCAwLCAwKTsKLQkJCSAgICB9Ci0JICAgIC8qIE1vdXNlIGJ1dHRvbiByZWxlYXNlPyAqLwotCQkJZWxzZQotCQkJewotCQkJCWNvZGUmPX5JRUNPREVfVVBfUFJFRklYOwotCQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELAotCQkJCQkJYW1pZ2FfR2V0QnV0dG9uKGNvZGUpLCAwLCAwKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JICAgIGNhc2UgSURDTVBfUkFXS0VZOgotCi0JCSAgICAvKiBLZXkgcHJlc3M/ICovCi0KLQkJICAgIGlmKCAhKGNvZGUmSUVDT0RFX1VQX1BSRUZJWCkgKQotCQkgICAgewotCQkJCVNETF9rZXlzeW0ga2V5c3ltOwotCQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsCi0JCQkJCWFtaWdhX1RyYW5zbGF0ZUtleShjb2RlLCAma2V5c3ltKSk7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICB7Ci0JICAgIC8qIEtleSByZWxlYXNlPyAqLwotCi0JCQkJU0RMX2tleXN5bSBrZXlzeW07Ci0JCQkJY29kZSY9fklFQ09ERV9VUF9QUkVGSVg7Ci0KLQkJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgcmVwZWF0ZWQga2V5ICovCi0vKgkJCWlmICggISBYMTFfS2V5UmVwZWF0KFNETF9EaXNwbGF5LCAmeGV2ZW50KSApICAqLwotCi0JCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsCi0JCQkJCWFtaWdhX1RyYW5zbGF0ZUtleShjb2RlLCAma2V5c3ltKSk7Ci0JCSAgICB9Ci0JCSAgICBicmVhazsKLQkgICAgLyogSGF2ZSB3ZSBiZWVuIGljb25pZmllZD8gKi8KLSNpZiAwCi0JICAgIGNhc2UgVW5tYXBOb3RpZnk6IHsKLSNpZmRlZiBERUJVR19YRVZFTlRTCi1wcmludGYoIlVubWFwTm90aWZ5IVxuIik7Ci0jZW5kaWYKLQkJcG9zdGVkPVNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBBQ1RJVkV8U0RMX0FQUElOUFVURk9DVVMpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIC8qIEhhdmUgd2UgYmVlbiByZXN0b3JlZD8gKi8KLQotCSAgICBjYXNlIE1hcE5vdGlmeTogewotI2lmZGVmIERFQlVHX1hFVkVOVFMKLXByaW50ZigiTWFwTm90aWZ5IVxuIik7Ci0jZW5kaWYKLQotCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQQUNUSVZFKTsKLQotCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgJiYKLQkJICAgICAoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgKQotCQl7Ci0JCQlDR1hfRW50ZXJGdWxsU2NyZWVuKHRoaXMpOwotCQl9IGVsc2UgewotCQkJWDExX0dyYWJJbnB1dE5vTG9jayh0aGlzLCB0aGlzLT5pbnB1dF9ncmFiKTsKLQkJfQotCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCQlDR1hfUmVmcmVzaERpc3BsYXkodGhpcyk7Ci0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQkgICAgY2FzZSBFeHBvc2U6Ci0JCWlmICggU0RMX1ZpZGVvU3VyZmFjZSAmJiAoeGV2ZW50LnhleHBvc2UuY291bnQgPT0gMCkgKSB7Ci0JCQlDR1hfUmVmcmVzaERpc3BsYXkodGhpcyk7Ci0JCX0KLQkJYnJlYWs7Ci0jZW5kaWYKLQotCSAgICAvKiBIYXZlIHdlIGJlZW4gcmVzaXplZD8gKi8KLQkgICAgY2FzZSBJRENNUF9ORVdTSVpFOgotCQkJU0RMX1ByaXZhdGVSZXNpemUoU0RMX1dpbmRvdy0+V2lkdGgtU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdC1TRExfV2luZG93LT5Cb3JkZXJSaWdodCwKLQkJICAgICAgICAgICAgICAgICAgU0RMX1dpbmRvdy0+SGVpZ2h0LVNETF9XaW5kb3ctPkJvcmRlclRvcC1TRExfV2luZG93LT5Cb3JkZXJCb3R0b20pOwotCi0JCQlicmVhazsKLQotCSAgICAvKiBIYXZlIHdlIGJlZW4gcmVxdWVzdGVkIHRvIHF1aXQ/ICovCi0JICAgIGNhc2UgSURDTVBfQ0xPU0VXSU5ET1c6Ci0JCXBvc3RlZCA9IFNETF9Qcml2YXRlUXVpdCgpOwotCQlicmVhazsKLQotCSAgICAvKiBEbyB3ZSBuZWVkIHRvIHJlZnJlc2ggb3Vyc2VsdmVzPyAqLwotCi0JICAgIGRlZmF1bHQ6IHsKLQkJLyogT25seSBwb3N0IHRoZSBldmVudCBpZiB3ZSdyZSB3YXRjaGluZyBmb3IgaXQgKi8KLQkJaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tTRExfU1lTV01FVkVOVF0gPT0gU0RMX0VOQUJMRSApIHsKLQkJCVNETF9TeXNXTW1zZyB3bW1zZzsKLQotCQkJU0RMX1ZFUlNJT04oJndtbXNnLnZlcnNpb24pOwotI2lmIDAKLQkJCXdtbXNnLnN1YnN5c3RlbSA9IFNETF9TWVNXTV9DR1g7Ci0JCQl3bW1zZy5ldmVudC54ZXZlbnQgPSB4ZXZlbnQ7Ci0jZW5kaWYKLQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlU3lzV01FdmVudCgmd21tc2cpOwotCQl9Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCVJlcGx5TXNnKChzdHJ1Y3QgTWVzc2FnZSAqKW1zZyk7Ci0KLQotCXJldHVybihwb3N0ZWQpOwotfQotCi12b2lkIGFtaWdhX1B1bXBFdmVudHMoX1RISVMpCi17Ci0JaW50IHBlbmRpbmc7Ci0Jc3RydWN0IEludHVpTWVzc2FnZSAqbTsKLQotCS8qIEtlZXAgcHJvY2Vzc2luZyBwZW5kaW5nIGV2ZW50cyAqLwotCXBlbmRpbmcgPSAwOwotCXdoaWxlICggbT0oc3RydWN0IEludHVpTWVzc2FnZSAqKUdldE1zZyhTRExfV2luZG93LT5Vc2VyUG9ydCkgKSB7Ci0JCWFtaWdhX0Rpc3BhdGNoRXZlbnQodGhpcyxtKTsKLQkJKytwZW5kaW5nOwotCX0KLX0KLQotdm9pZCBhbWlnYV9Jbml0S2V5bWFwKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQkvKiBNYXAgdGhlIG1pc2NlbGxhbmVvdXMga2V5cyAqLwotCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKE1JU0Nfa2V5bWFwKTsgKytpICkKLQkJTUlTQ19rZXltYXBbaV0gPSBTRExLX1VOS05PV047Ci0KLQkvKiBUaGVzZSBYIGtleXN5bXMgaGF2ZSAweEZGIGFzIHRoZSBoaWdoIGJ5dGUgKi8KLQlNSVNDX2tleW1hcFs2NV0gPSBTRExLX0JBQ0tTUEFDRTsKLQlNSVNDX2tleW1hcFs2Nl0gPSBTRExLX1RBQjsKLQlNSVNDX2tleW1hcFs3MF0gPSBTRExLX0NMRUFSOwotCU1JU0Nfa2V5bWFwWzcwXSA9IFNETEtfREVMRVRFOwotCU1JU0Nfa2V5bWFwWzY4XSA9IFNETEtfUkVUVVJOOwotLy8JTUlTQ19rZXltYXBbWEtfUGF1c2UmMHhGRl0gPSBTRExLX1BBVVNFOwotCU1JU0Nfa2V5bWFwWzY5XSA9IFNETEtfRVNDQVBFOwotCU1JU0Nfa2V5bWFwWzcwXSA9IFNETEtfREVMRVRFOwotLyoKLQlTRExLX1NQQUNFCQk9IDMyLAotCVNETEtfTUlOVVMJCT0gNDUsCi0JU0RMS19MRVNTCQk9IDYwLAotCVNETEtfQ09NTUEJCT0gNDQsCi0JU0RMS19QRVJJT0QJCT0gNDYsCi0JU0RMS18wCQkJPSA0OCwKLQlTRExLXzEJCQk9IDQ5LAotCVNETEtfMgkJCT0gNTAsCi0JU0RMS18zCQkJPSA1MSwKLQlTRExLXzQJCQk9IDUyLAotCVNETEtfNQkJCT0gNTMsCi0JU0RMS182CQkJPSA1NCwKLQlTRExLXzcJCQk9IDU1LAotCVNETEtfOAkJCT0gNTYsCi0JU0RMS185CQkJPSA1NywKLQlTRExLX0JBQ0tRVU9URQkJPSA5NiwKLQlTRExLX0JBQ0tTTEFTSAkJPSA5MiwKLQlTRExLX2EJCQk9IDk3LAotCVNETEtfYgkJCT0gOTgsCi0JU0RMS19jCQkJPSA5OSwKLQlTRExLX2QJCQk9IDEwMCwKLQlTRExLX2UJCQk9IDEwMSwKLQlTRExLX2YJCQk9IDEwMiwKLQlTRExLX2cJCQk9IDEwMywKLQlTRExLX2gJCQk9IDEwNCwKLQlTRExLX2kJCQk9IDEwNSwKLQlTRExLX2oJCQk9IDEwNiwKLQlTRExLX2sJCQk9IDEwNywKLQlTRExLX2wJCQk9IDEwOCwKLQlTRExLX20JCQk9IDEwOSwKLQlTRExLX24JCQk9IDExMCwKLQlTRExLX28JCQk9IDExMSwKLQlTRExLX3AJCQk9IDExMiwKLQlTRExLX3EJCQk9IDExMywKLQlTRExLX3IJCQk9IDExNCwKLQlTRExLX3MJCQk9IDExNSwKLQlTRExLX3QJCQk9IDExNiwKLQlTRExLX3UJCQk9IDExNywKLQlTRExLX3YJCQk9IDExOCwKLQlTRExLX3cJCQk9IDExOSwKLQlTRExLX3gJCQk9IDEyMCwKLQlTRExLX3kJCQk9IDEyMSwKLQlTRExLX3oJCQk9IDEyMiwKLSovCi0JTUlTQ19rZXltYXBbMTVdID0gU0RMS19LUDA7CQkvKiBLZXlwYWQgMC05ICovCi0JTUlTQ19rZXltYXBbMjldID0gU0RMS19LUDE7Ci0JTUlTQ19rZXltYXBbMzBdID0gU0RMS19LUDI7Ci0JTUlTQ19rZXltYXBbMzFdID0gU0RMS19LUDM7Ci0JTUlTQ19rZXltYXBbNDVdID0gU0RMS19LUDQ7Ci0JTUlTQ19rZXltYXBbNDZdID0gU0RMS19LUDU7Ci0JTUlTQ19rZXltYXBbNDddID0gU0RMS19LUDY7Ci0JTUlTQ19rZXltYXBbNjFdID0gU0RMS19LUDc7Ci0JTUlTQ19rZXltYXBbNjJdID0gU0RMS19LUDg7Ci0JTUlTQ19rZXltYXBbNjNdID0gU0RMS19LUDk7Ci0JTUlTQ19rZXltYXBbNjBdID0gU0RMS19LUF9QRVJJT0Q7Ci0JTUlTQ19rZXltYXBbOTJdID0gU0RMS19LUF9ESVZJREU7Ci0JTUlTQ19rZXltYXBbOTNdID0gU0RMS19LUF9NVUxUSVBMWTsKLQlNSVNDX2tleW1hcFs3NF0gPSBTRExLX0tQX01JTlVTOwotCU1JU0Nfa2V5bWFwWzk0XSA9IFNETEtfS1BfUExVUzsKLQlNSVNDX2tleW1hcFs2N10gPSBTRExLX0tQX0VOVEVSOwotLy8JTUlTQ19rZXltYXBbWEtfS1BfRXF1YWwmMHhGRl0gPSBTRExLX0tQX0VRVUFMUzsKLQotCU1JU0Nfa2V5bWFwWzc2XSA9IFNETEtfVVA7Ci0JTUlTQ19rZXltYXBbNzddID0gU0RMS19ET1dOOwotCU1JU0Nfa2V5bWFwWzc4XSA9IFNETEtfUklHSFQ7Ci0JTUlTQ19rZXltYXBbNzldID0gU0RMS19MRUZUOwotLyoKLQlNSVNDX2tleW1hcFtYS19JbnNlcnQmMHhGRl0gPSBTRExLX0lOU0VSVDsKLQlNSVNDX2tleW1hcFtYS19Ib21lJjB4RkZdID0gU0RMS19IT01FOwotCU1JU0Nfa2V5bWFwW1hLX0VuZCYweEZGXSA9IFNETEtfRU5EOwotKi8KLS8vIE1hcHBhdGkgc3VsbGUgcGFyZW50ZXNpIGRlbCB0YWFzdGllcmlubwotCU1JU0Nfa2V5bWFwWzkwXSA9IFNETEtfUEFHRVVQOwotCU1JU0Nfa2V5bWFwWzkxXSA9IFNETEtfUEFHRURPV047Ci0KLQlNSVNDX2tleW1hcFs4MF0gPSBTRExLX0YxOwotCU1JU0Nfa2V5bWFwWzgxXSA9IFNETEtfRjI7Ci0JTUlTQ19rZXltYXBbODJdID0gU0RMS19GMzsKLQlNSVNDX2tleW1hcFs4M10gPSBTRExLX0Y0OwotCU1JU0Nfa2V5bWFwWzg0XSA9IFNETEtfRjU7Ci0JTUlTQ19rZXltYXBbODVdID0gU0RMS19GNjsKLQlNSVNDX2tleW1hcFs4Nl0gPSBTRExLX0Y3OwotCU1JU0Nfa2V5bWFwWzg3XSA9IFNETEtfRjg7Ci0JTUlTQ19rZXltYXBbODhdID0gU0RMS19GOTsKLQlNSVNDX2tleW1hcFs4OV0gPSBTRExLX0YxMDsKLS8vCU1JU0Nfa2V5bWFwW1hLX0YxMSYweEZGXSA9IFNETEtfRjExOwotLy8JTUlTQ19rZXltYXBbWEtfRjEyJjB4RkZdID0gU0RMS19GMTI7Ci0vLwlNSVNDX2tleW1hcFtYS19GMTMmMHhGRl0gPSBTRExLX0YxMzsKLS8vCU1JU0Nfa2V5bWFwW1hLX0YxNCYweEZGXSA9IFNETEtfRjE0OwotLy8JTUlTQ19rZXltYXBbWEtfRjE1JjB4RkZdID0gU0RMS19GMTU7Ci0KLS8vCU1JU0Nfa2V5bWFwW1hLX051bV9Mb2NrJjB4RkZdID0gU0RMS19OVU1MT0NLOwotCU1JU0Nfa2V5bWFwWzk4XSA9IFNETEtfQ0FQU0xPQ0s7Ci0vLwlNSVNDX2tleW1hcFtYS19TY3JvbGxfTG9jayYweEZGXSA9IFNETEtfU0NST0xMT0NLOwotCU1JU0Nfa2V5bWFwWzk3XSA9IFNETEtfUlNISUZUOwotCU1JU0Nfa2V5bWFwWzk2XSA9IFNETEtfTFNISUZUOwotCU1JU0Nfa2V5bWFwWzk5XSA9IFNETEtfTENUUkw7Ci0JTUlTQ19rZXltYXBbOTldID0gU0RMS19MQ1RSTDsKLQlNSVNDX2tleW1hcFsxMDFdID0gU0RMS19SQUxUOwotCU1JU0Nfa2V5bWFwWzEwMF0gPSBTRExLX0xBTFQ7Ci0vLwlNSVNDX2tleW1hcFtYS19NZXRhX1ImMHhGRl0gPSBTRExLX1JNRVRBOwotLy8JTUlTQ19rZXltYXBbWEtfTWV0YV9MJjB4RkZdID0gU0RMS19MTUVUQTsKLQlNSVNDX2tleW1hcFsxMDNdID0gU0RMS19MU1VQRVI7IC8qIExlZnQgIldpbmRvd3MiICovCi0JTUlTQ19rZXltYXBbMTAyXSA9IFNETEtfUlNVUEVSOyAvKiBSaWdodCAiV2luZG93cyAqLwotCi0JTUlTQ19rZXltYXBbOTVdID0gU0RMS19IRUxQOwotfQotCi1TRExfa2V5c3ltICphbWlnYV9UcmFuc2xhdGVLZXkoaW50IGNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSkKLXsKLQkjaWZkZWYgU1RPUk1DNF9XT1MKLQlzdGF0aWMgc3RydWN0IExpYnJhcnkgKktleW1hcEJhc2U9TlVMTDsgLyogTGlua2luZyBmYWlsZWQgaW4gV09TIHZlcnNpb24gaWYgQ29uc29sZURldmljZSB3YXMgdXNlZCAqLwotCSNlbHNlCi0Jc3RhdGljIHN0cnVjdCBMaWJyYXJ5ICpDb25zb2xlRGV2aWNlPU5VTEw7Ci0JI2VuZGlmCi0KLQkvKiBHZXQgdGhlIHJhdyBrZXlib2FyZCBzY2FuY29kZSAqLwotCWtleXN5bS0+c2NhbmNvZGUgPSBjb2RlOwotCWtleXN5bS0+c3ltID0gTUlTQ19rZXltYXBbY29kZV07Ci0KLSNpZmRlZiBERUJVR19LRVlTCi0JZnByaW50ZihzdGRlcnIsICJUcmFuc2xhdGluZyBrZXkgMHglLjR4ICglZClcbiIsIHhzeW0sIHhrZXktPmtleWNvZGUpOwotI2VuZGlmCi0JLyogR2V0IHRoZSB0cmFuc2xhdGVkIFNETCB2aXJ0dWFsIGtleXN5bSAqLwotCWlmICgga2V5c3ltLT5zeW09PVNETEtfVU5LTk9XTiApCi0JewotCQkjaWZkZWYgU1RPUk1DNF9XT1MKLQkJaWYoIUtleW1hcEJhc2UpCi0JCSNlbHNlCi0JCWlmKCFDb25zb2xlRGV2aWNlKQotCQkjZW5kaWYKLQkJewotCQkJI2lmZGVmIFNUT1JNQzRfV09TCi0JCQlLZXltYXBCYXNlPU9wZW5MaWJyYXJ5KCJrZXltYXAubGlicmFyeSIsIDBMKTsKLQkJCSNlbHNlCi0JCQlpZihDb25Qb3J0PUNyZWF0ZU1zZ1BvcnQoKSkKLQkJCXsKLQkJCQlpZihDb25SZXE9Q3JlYXRlSU9SZXF1ZXN0KENvblBvcnQsc2l6ZW9mKHN0cnVjdCBJT1N0ZFJlcSkpKQotCQkJCXsKLQkJCQkJaWYoIU9wZW5EZXZpY2UoImNvbnNvbGUuZGV2aWNlIiwtMSwoc3RydWN0IElPUmVxdWVzdCAqKUNvblJlcSwwKSkKLQkJCQkJCUNvbnNvbGVEZXZpY2U9KHN0cnVjdCBMaWJyYXJ5ICopQ29uUmVxLT5pb19EZXZpY2U7Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJRGVsZXRlSU9SZXF1ZXN0KENvblJlcSk7Ci0JCQkJCQlDb25SZXE9TlVMTDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlEZWxldGVNc2dQb3J0KENvblBvcnQpOwotCQkJCQlDb25Qb3J0PU5VTEw7Ci0JCQkJfQotCQkJfQotCQkJI2VuZGlmCi0JCX0KLQotCQkjaWZkZWYgU1RPUk1DNF9XT1MKLQkJaWYoS2V5bWFwQmFzZSkKLQkJI2Vsc2UKLQkJaWYoQ29uc29sZURldmljZSkKLQkJI2VuZGlmCi0JCXsKLQkJCXN0cnVjdCBJbnB1dEV2ZW50IGV2ZW50OwotCQkJbG9uZyBhY3R1YWw7Ci0JCQljaGFyIGJ1ZmZlcls1XTsKLQotCQkJZXZlbnQuaWVfUXVhbGlmaWVyPTA7Ci0JCQlldmVudC5pZV9DbGFzcz1JRUNMQVNTX1JBV0tFWTsKLQkJCWV2ZW50LmllX1N1YkNsYXNzPTBMOwotCQkJZXZlbnQuaWVfQ29kZT1jb2RlOwotCQkJZXZlbnQuaWVfWD1ldmVudC5pZV9ZPTA7Ci0JCQlldmVudC5pZV9FdmVudEFkZHJlc3M9TlVMTDsKLQkJCWV2ZW50LmllX05leHRFdmVudD1OVUxMOwotCQkJZXZlbnQuaWVfUHJldjFEb3duQ29kZT1ldmVudC5pZV9QcmV2MURvd25RdWFsPWV2ZW50LmllX1ByZXYyRG93bkNvZGU9ZXZlbnQuaWVfUHJldjJEb3duUXVhbD0wOwotCi0JCQkjaWZkZWYgU1RPUk1DNF9XT1MKLQkJCWlmKCAoYWN0dWFsPU1hcFJhd0tleSgmZXZlbnQsYnVmZmVyLDUsTlVMTCkpPj0wKQotCQkJI2Vsc2UKLQkJCWlmKCAoYWN0dWFsPVJhd0tleUNvbnZlcnQoJmV2ZW50LGJ1ZmZlciw1LE5VTEwpKT49MCkKLQkJCSNlbmRpZgotCQkJewotCQkJCWlmKGFjdHVhbD4xKQotCQkJCXsKLQkJCQkJRChidWcoIldhcm5pbmcgKCVsZCkgY2hhcmFjdGVyIGNvbnZlcnNpb24hXG4iLGFjdHVhbCkpOwotCQkJCX0KLQkJCQllbHNlIGlmKGFjdHVhbD09MSkKLQkJCQl7Ci0JCQkJCWtleXN5bS0+c3ltPSpidWZmZXI7Ci0JCQkJCUQoYnVnKCJDb252ZXJ0ZWQgcmF3Y29kZSAlbGQgdG8gPCVsYz5cbiIsY29kZSwqYnVmZmVyKSk7Ci0vLyBCdWZmZXJpenpvIHggbGUgc3VjY2Vzc2l2ZSBjaGlhbWF0ZSEKLQkJCQkJTUlTQ19rZXltYXBbY29kZV09KmJ1ZmZlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQlrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKLQotCS8qIElmIFVOSUNPREUgaXMgb24sIGdldCB0aGUgVU5JQ09ERSB2YWx1ZSBmb3IgdGhlIGtleSAqLwotCWtleXN5bS0+dW5pY29kZSA9IDA7Ci0JaWYgKCBTRExfVHJhbnNsYXRlVU5JQ09ERSApIHsKLSNpZiAwCi0JCXN0YXRpYyBYQ29tcG9zZVN0YXR1cyBzdGF0ZTsKLQkJLyogVW50aWwgd2UgaGFuZGxlIHRoZSBJTSBwcm90b2NvbCwgdXNlIFhMb29rdXBTdHJpbmcoKSAqLwotCQl1bnNpZ25lZCBjaGFyIGtleWJ1ZlszMl07Ci0JCWlmICggWExvb2t1cFN0cmluZyh4a2V5LCAoY2hhciAqKWtleWJ1Ziwgc2l6ZW9mKGtleWJ1ZiksCi0JCQkJCQkJTlVMTCwgJnN0YXRlKSApIHsKLQkJCWtleXN5bS0+dW5pY29kZSA9IGtleWJ1ZlswXTsKLQkJfQotI2VuZGlmCi0JfQotCXJldHVybihrZXlzeW0pOwotfQotCi12b2lkIGFtaWdhX0luaXRPU0tleW1hcChfVEhJUykKLXsKLQlhbWlnYV9Jbml0S2V5bWFwKCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9hbWlnYWV2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9hbWlnYWV2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjg2YjUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfYW1pZ2FldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfY2d4dmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBhbWlnYV9Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgYW1pZ2FfUHVtcEV2ZW50cyhfVEhJUyk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2FtaWdhbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2FtaWdhbW91c2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5NDBhOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9hbWlnYW1vdXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKLSNpbmNsdWRlICJTRExfYW1pZ2Ftb3VzZV9jLmgiCi0KLQotLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCi0KLXR5cGVkZWYgdm9pZCAqIFdNQ3Vyc29yOwotCi12b2lkIGFtaWdhX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKLXsKLX0KLQotV01jdXJzb3IgKmFtaWdhX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAotCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpCi17Ci0JcmV0dXJuIChXTWN1cnNvciAqKTE7IC8vIEFtaWdhIGhhcyBhbiBIYXJkd2FyZSBjdXJzb3IsIHNvIGl0J3Mgb2sgdG8gcmV0dXJuIHNvbWV0aGluZyB1bnVzZWZ1bCBidXQgdHJ1ZQotfQotCi1pbnQgYW1pZ2FfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotCS8qIERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBkaXNwbGF5IGlzIGdvbmUgKi8KLQlpZiAoIFNETF9EaXNwbGF5ID09IE5VTEwpIHsKLQkJcmV0dXJuKDApOwotCX0KLQotCS8qIFNldCB0aGUgQW1pZ2EgcHJlZnMgY3Vyc29yIGN1cnNvciwgb3IgYmxhbmsgaWYgY3Vyc29yIGlzIE5VTEwgKi8KLQotCWlmICggU0RMX1dpbmRvdyApIHsKLQkJU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKLQkJaWYgKCBjdXJzb3IgPT0gTlVMTCApIHsKLQkJCWlmICggU0RMX0JsYW5rQ3Vyc29yICE9IE5VTEwgKSB7Ci0vLyBIaWRlIGN1cnNvciBIRVJFCi0JCQkJU2V0UG9pbnRlcihTRExfV2luZG93LChVV09SRCAqKVNETF9CbGFua0N1cnNvciwxLDEsMCwwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLS8vIFNob3cgY3Vyc29yCi0JCQlDbGVhclBvaW50ZXIoU0RMX1dpbmRvdyk7Ci0JCX0KLQkJU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotCX0KLQlyZXR1cm4oMSk7Ci19Ci0KLXZvaWQgYW1pZ2FfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCi17Ci0vKiBGSVhNRTogTm90IGltcGxlbWVudGVkICovCi19Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGVudGVyIG9yIGxlYXZlIG1vdXNlIHJlbGF0aXZlIG1vZGUgKi8KLXZvaWQgYW1pZ2FfQ2hlY2tNb3VzZU1vZGUoX1RISVMpCi17Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9hbWlnYW1vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2FtaWdhbW91c2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWQxOWI2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2FtaWdhbW91c2VfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfY2d4dmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBhbWlnYV9GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOwotZXh0ZXJuIFdNY3Vyc29yICphbWlnYV9DcmVhdGVXTUN1cnNvcihfVEhJUywKLQkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKLWV4dGVybiBpbnQgYW1pZ2FfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiB2b2lkIGFtaWdhX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KTsKLWV4dGVybiB2b2lkIGFtaWdhX0NoZWNrTW91c2VNb2RlKF9USElTKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneGFjY2VsLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9jZ3hhY2NlbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDYwNWUzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneGFjY2VsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfZW5kaWFuLmgiCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2JsaXQuaCIKLSNpbmNsdWRlICJTRExfY2d4dmlkZW8uaCIKLQotc3RhdGljIGludCBDR1hfSFdBY2NlbEJsaXQoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCi0JCQkJCVNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KTsKLQotLy8gVGhlc2UgYXJlIG5lZWRlZCB0byBhdm9pZCByZWdpc3RlciB0cm91YmxlcyB3aXRoIGdjYyAtTzIhCi0KLSNpZiBkZWZpbmVkKF9fU0FTQykgfHwgZGVmaW5lZChfX1BQQ19fKSB8fCBkZWZpbmVkKE1PUlBIT1MpCi0jZGVmaW5lIEJNS0JSUChhLGIsYyxkLGUsZixnLGgsaSxqKSBCbHRNYXNrQml0TWFwUmFzdFBvcnQoYSxiLGMsZCxlLGYsZyxoLGksaikKLSNkZWZpbmUJQkJSUChhLGIsYyxkLGUsZixnLGgsaSkgQmx0Qml0TWFwUmFzdFBvcnQoYSxiLGMsZCxlLGYsZyxoLGkpCi0jZGVmaW5lIEJCQihhLGIsYyxkLGUsZixnLGgsaSxqLGspIEJsdEJpdE1hcChhLGIsYyxkLGUsZixnLGgsaSxqLGspCi0jZWxzZQotdm9pZCBCTUtCUlAoc3RydWN0IEJpdE1hcCAqYSxXT1JEIGIsIFdPUkQgYyxzdHJ1Y3QgUmFzdFBvcnQgKmQsV09SRCBlLFdPUkQgZixXT1JEIGcsV09SRCBoLFVCWVRFIGksQVBUUiBqKQote0JsdE1hc2tCaXRNYXBSYXN0UG9ydChhLGIsYyxkLGUsZixnLGgsaSxqKTt9Ci0KLXZvaWQgQkJSUChzdHJ1Y3QgQml0TWFwICphLFdPUkQgYiwgV09SRCBjLHN0cnVjdCBSYXN0UG9ydCAqZCxXT1JEIGUsV09SRCBmLFdPUkQgZyxXT1JEIGgsVUJZVEUgaSkKLXtCbHRCaXRNYXBSYXN0UG9ydChhLGIsYyxkLGUsZixnLGgsaSk7fQotCi12b2lkIEJCQihzdHJ1Y3QgQml0TWFwICphLFdPUkQgYiwgV09SRCBjLHN0cnVjdCBCaXRNYXAgKmQsV09SRCBlLFdPUkQgZixXT1JEIGcsV09SRCBoLFVCWVRFIGksVUJZVEUgaixVV09SRCAqaykKLXtCbHRCaXRNYXAoYSxiLGMsZCxlLGYsZyxoLGksaixrKTt9Ci0jZW5kaWYKLQotaW50IENHWF9TZXRIV0NvbG9yS2V5KF9USElTLFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIga2V5KQotewotCWlmKHN1cmZhY2UtPmh3ZGF0YSkKLQl7Ci0JCWlmKHN1cmZhY2UtPmh3ZGF0YS0+bWFzaykKLQkJCVNETF9mcmVlKHN1cmZhY2UtPmh3ZGF0YS0+bWFzayk7Ci0KLQkJaWYoc3VyZmFjZS0+aHdkYXRhLT5tYXNrPVNETF9tYWxsb2MoUkFTU0laRShzdXJmYWNlLT53LHN1cmZhY2UtPmgpKSkKLQkJewotCQkJVWludDMyIHBpdGNoLG9rPTA7Ci0JCQlBUFRSIGxvY2s7Ci0KLQkJCVNETF9tZW1zZXQoc3VyZmFjZS0+aHdkYXRhLT5tYXNrLDI1NSxSQVNTSVpFKHN1cmZhY2UtPncsc3VyZmFjZS0+aCkpOwotCi0JCQlEKGJ1ZygiQnVpbGRpbmcgY29sb3JrZXkgbWFzazogY29sb3I6ICVsZCwgc2l6ZTogJWxkIHggJWxkLCAlbGQgYnl0ZXMuLi5CcHA6JWxkXG4iLGtleSxzdXJmYWNlLT53LHN1cmZhY2UtPmgsUkFTU0laRShzdXJmYWNlLT53LHN1cmZhY2UtPmgpLHN1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCkpOwotCi0JCQlpZihsb2NrPUxvY2tCaXRNYXBUYWdzKHN1cmZhY2UtPmh3ZGF0YS0+Ym1hcCxMQk1JX0JBU0VBRERSRVNTLChVTE9ORykmc3VyZmFjZS0+cGl4ZWxzLAotCQkJCQlMQk1JX0JZVEVTUEVSUk9XLChVTE9ORykmcGl0Y2gsVEFHX0RPTkUpKQotCQkJewotCQkJCXN3aXRjaChzdXJmYWNlLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpCi0JCQkJewotCQkJCQljYXNlIDE6Ci0JCQkJCXsKLQkJCQkJCXVuc2lnbmVkIGNoYXIgaz1rZXk7Ci0JCQkJCQlyZWdpc3RlciBpbnQgaSxqLHQ7Ci0JCQkJCQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpkZXN0PXN1cmZhY2UtPmh3ZGF0YS0+bWFzaywqbWFwPXN1cmZhY2UtPnBpeGVsczsKLQotCQkJCQkJcGl0Y2gtPXN1cmZhY2UtPnc7Ci0KLQkJCQkJCWZvcihpPTA7aTxzdXJmYWNlLT5oO2krKykKLQkJCQkJCXsKLQkJCQkJCQlmb3IodD0xMjgsaj0wO2o8c3VyZmFjZS0+dztqKyspCi0JCQkJCQkJewotCQkJCQkJCQlpZigqbWFwPT1rKQotCQkJCQkJCQkJKmRlc3QmPX50OwkKLQotCQkJCQkJCQl0Pj49MTsKLQotCQkJCQkJCQlpZih0PT0wKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlkZXN0Kys7Ci0JCQkJCQkJCQl0PTEyODsKLQkJCQkJCQkJfQotCQkJCQkJCQltYXArKzsKLQkJCQkJCQl9Ci0JCQkJCQkJbWFwKz1waXRjaDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQl7Ci0JCQkJCQlVaW50MTYgaz1rZXksKm1hcHc7Ci0JCQkJCQlyZWdpc3RlciBpbnQgaSxqLHQ7Ci0JCQkJCQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpkZXN0PXN1cmZhY2UtPmh3ZGF0YS0+bWFzaywqbWFwPXN1cmZhY2UtPnBpeGVsczsKLQotCQkJCQkJZm9yKGk9c3VyZmFjZS0+aDtpOy0taSkKLQkJCQkJCXsKLQkJCQkJCQltYXB3PShVaW50MTYgKiltYXA7Ci0KLQkJCQkJCQlmb3IodD0xMjgsaj1zdXJmYWNlLT53O2o7LS1qKQotCQkJCQkJCXsKLQkJCQkJCQkJaWYoKm1hcHc9PWspCi0JCQkJCQkJCQkqZGVzdCY9fnQ7Ci0KLQkJCQkJCQkJdD4+PTE7Ci0KLQkJCQkJCQkJaWYodD09MCkKLQkJCQkJCQkJewotCQkJCQkJCQkJZGVzdCsrOwotCQkJCQkJCQkJdD0xMjg7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbWFwdysrOwotCQkJCQkJCX0KLQkJCQkJCQltYXArPXBpdGNoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCXsKLQkJCQkJCVVpbnQzMiAqbWFwbDsKLQkJCQkJCXJlZ2lzdGVyIGludCBpLGosdDsKLQkJCQkJCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmRlc3Q9c3VyZmFjZS0+aHdkYXRhLT5tYXNrLCptYXA9c3VyZmFjZS0+cGl4ZWxzOwotCi0JCQkJCQlmb3IoaT1zdXJmYWNlLT5oO2k7LS1pKQotCQkJCQkJewotCQkJCQkJCW1hcGw9KFVpbnQzMiAqKW1hcDsKLQotCQkJCQkJCWZvcih0PTEyOCxqPXN1cmZhY2UtPnc7ajstLWopCi0JCQkJCQkJewotCQkJCQkJCQlpZigqbWFwbD09a2V5KQotCQkJCQkJCQkJKmRlc3QmPX50OwotCi0JCQkJCQkJCXQ+Pj0xOwotCi0JCQkJCQkJCWlmKHQ9PTApCi0JCQkJCQkJCXsKLQkJCQkJCQkJCWRlc3QrKzsKLQkJCQkJCQkJCXQ9MTI4OwotCQkJCQkJCQl9Ci0JCQkJCQkJCW1hcGwrKzsKLQkJCQkJCQl9Ci0JCQkJCQkJbWFwKz1waXRjaDsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJRChidWcoIlBpeGVsIG1vZGUgbm9uIHN1cHBvcnRlZCBmb3IgY29sb3Iga2V5Li4uIikpOwotCQkJCQkJU0RMX2ZyZWUoc3VyZmFjZS0+aHdkYXRhLT5tYXNrKTsKLQkJCQkJCXN1cmZhY2UtPmh3ZGF0YS0+bWFzaz1OVUxMOwotCQkJCQkJb2s9LTE7Ci0JCQkJfQotCQkJCVVuTG9ja0JpdE1hcChsb2NrKTsKLQkJCQlEKGJ1ZygiLi4uQ29sb3JrZXkgYnVpbHQhXG4iKSk7Ci0JCQkJcmV0dXJuIG9rOwotCQkJfQotCQl9Ci0JfQotCUQoYnVnKCJIVyBjb2xvcmtleSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGRlcHRoXG4iKSk7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLWludCBDR1hfQ2hlY2tIV0JsaXQoX1RISVMsU0RMX1N1cmZhY2UgKnNyYyxTRExfU3VyZmFjZSAqZHN0KQotewotLy8gRG9lc24ndCBzdXBwb3J0IHlldCBhbHBoYSBibGl0dGluZwotCi0JaWYoc3JjLT5od2RhdGEmJiAhKHNyYy0+ZmxhZ3MgJiAoU0RMX1NSQ0FMUEhBKSkpCi0JewotCQlEKGJ1ZygiQ2hlY2tIVyBibGl0Li4uIE9LIVxuIikpOwotCi0JCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSApIHsKLQkJCWlmICggQ0dYX1NldEhXQ29sb3JLZXkodGhpcywgc3JjLCBzcmMtPmZvcm1hdC0+Y29sb3JrZXkpIDwgMCApIHsKLQkJCQlzcmMtPmZsYWdzICY9IH5TRExfSFdBQ0NFTDsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQotCQlzcmMtPmZsYWdzfD1TRExfSFdBQ0NFTDsKLQkJc3JjLT5tYXAtPmh3X2JsaXQgPSBDR1hfSFdBY2NlbEJsaXQ7Ci0JCXJldHVybiAxOwotCX0KLQllbHNlCi0JCXNyYy0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOwotCi0JRChidWcoIkNoZWNrSFcgYmxpdC4uLiBOTyFcbiIpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRlbXBycF9pbml0PTA7Ci1zdGF0aWMgc3RydWN0IFJhc3RQb3J0IHRlbXBycDsKLQotc3RhdGljIGludCBDR1hfSFdBY2NlbEJsaXQoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCi0JCQkJCVNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KQotewotCXN0cnVjdCBTRExfVmlkZW9EZXZpY2UgKnRoaXM9c3JjLT5od2RhdGEtPnZpZGVvZGF0YTsKLQotLy8JRChidWcoIkFjY2VsIGJsaXQhXG4iKSk7Ci0KLQlpZihzcmMtPmZsYWdzJlNETF9TUkNDT0xPUktFWSAmJiBzcmMtPmh3ZGF0YS0+bWFzaykKLQl7Ci0JCWlmKGRzdD09U0RMX1ZpZGVvU3VyZmFjZSkKLQkJewotCQkJQk1LQlJQKHNyYy0+aHdkYXRhLT5ibWFwLHNyY3JlY3QtPngsc3JjcmVjdC0+eSwKLQkJCQkJCVNETF9SYXN0UG9ydCxkc3RyZWN0LT54K1NETF9XaW5kb3ctPkJvcmRlckxlZnQsZHN0cmVjdC0+eStTRExfV2luZG93LT5Cb3JkZXJUb3AsCi0JCQkJCQlzcmNyZWN0LT53LHNyY3JlY3QtPmgsMHhjMCxzcmMtPmh3ZGF0YS0+bWFzayk7Ci0JCX0KLQkJZWxzZSBpZihkc3QtPmh3ZGF0YSkKLQkJewotCQkJaWYoIXRlbXBycF9pbml0KQotCQkJewotCQkJCUluaXRSYXN0UG9ydCgmdGVtcHJwKTsKLQkJCQl0ZW1wcnBfaW5pdD0xOwotCQkJfQotCQkJdGVtcHJwLkJpdE1hcD0oc3RydWN0IEJpdE1hcCAqKWRzdC0+aHdkYXRhLT5ibWFwOwotCi0JCQlCTUtCUlAoc3JjLT5od2RhdGEtPmJtYXAsc3JjcmVjdC0+eCxzcmNyZWN0LT55LAotCQkJCQkJJnRlbXBycCxkc3RyZWN0LT54LGRzdHJlY3QtPnksCi0JCQkJCQlzcmNyZWN0LT53LHNyY3JlY3QtPmgsMHhjMCxzcmMtPmh3ZGF0YS0+bWFzayk7Ci0JCQkKLQkJfQotCX0KLQllbHNlIGlmKGRzdD09U0RMX1ZpZGVvU3VyZmFjZSkKLQl7Ci0JCUJCUlAoc3JjLT5od2RhdGEtPmJtYXAsc3JjcmVjdC0+eCxzcmNyZWN0LT55LFNETF9SYXN0UG9ydCxkc3RyZWN0LT54K1NETF9XaW5kb3ctPkJvcmRlckxlZnQsZHN0cmVjdC0+eStTRExfV2luZG93LT5Cb3JkZXJUb3Asc3JjcmVjdC0+dyxzcmNyZWN0LT5oLDB4YzApOwotCX0KLQllbHNlIGlmKGRzdC0+aHdkYXRhKQotCQlCQkIoc3JjLT5od2RhdGEtPmJtYXAsc3JjcmVjdC0+eCxzcmNyZWN0LT55LGRzdC0+aHdkYXRhLT5ibWFwLGRzdHJlY3QtPngsZHN0cmVjdC0+eSxzcmNyZWN0LT53LHNyY3JlY3QtPmgsMHhjMCwweGZmLE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBDR1hfRmlsbEhXUmVjdChfVEhJUyxTRExfU3VyZmFjZSAqZHN0LFNETF9SZWN0ICpkc3RyZWN0LFVpbnQzMiBjb2xvcikKLXsKLQlpZihkc3Q9PVNETF9WaWRlb1N1cmZhY2UpCi0JewotCQlGaWxsUGl4ZWxBcnJheShTRExfUmFzdFBvcnQsZHN0cmVjdC0+eCtTRExfV2luZG93LT5Cb3JkZXJMZWZ0LGRzdHJlY3QtPnkrU0RMX1dpbmRvdy0+Qm9yZGVyVG9wLGRzdHJlY3QtPncsZHN0cmVjdC0+aCxjb2xvcik7Ci0JfQotCWVsc2UgaWYoZHN0LT5od2RhdGEpCi0JewotCQlpZighdGVtcHJwX2luaXQpCi0JCXsKLQkJCUluaXRSYXN0UG9ydCgmdGVtcHJwKTsKLQkJCXRlbXBycF9pbml0PTE7Ci0JCX0KLQotCQl0ZW1wcnAuQml0TWFwPShzdHJ1Y3QgQml0TWFwICopZHN0LT5od2RhdGEtPmJtYXA7Ci0KLQkJRmlsbFBpeGVsQXJyYXkoJnRlbXBycCxkc3RyZWN0LT54LGRzdHJlY3QtPnksZHN0cmVjdC0+dyxkc3RyZWN0LT5oLGNvbG9yKTsKLQl9Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9jZ3hnbC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4Z2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5NjE0Yi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9jZ3hnbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBTdG9ybU1lc2EgaW1wbGVtZW50YXRpb24gb2YgU0RMIE9wZW5HTCBzdXBwb3J0ICovCi0KLSNpbmNsdWRlICJTRExfY2d4Z2xfYy5oIgotI2luY2x1ZGUgIlNETF9jZ3h2aWRlby5oIgotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotQW1pZ2FNZXNhQ29udGV4dCBnbGNvbnQ9TlVMTDsKLSNlbmRpZgotCi0vKiBJbml0IE9wZW5HTCAqLwotaW50IENHWF9HTF9Jbml0KF9USElTKQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLSAgIGludCBpID0gMDsKLQlzdHJ1Y3QgVGFnSXRlbSBhdHRyaWJ1dGVzIFsgMTQgXTsgLyogMTQgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2ggOikgKi8KLSAgIHN0cnVjdCBXaW5kb3cgKndpbiA9IChzdHJ1Y3QgV2luZG93ICopU0RMX1dpbmRvdzsKLQotCS8vIGRlZmF1bHQgY29uZmlnLiBBbHdheXMgdXNlZC4uLgotCWF0dHJpYnV0ZXNbaV0udGlfVGFnID0gQU1BX1dpbmRvdzsJYXR0cmlidXRlc1tpKytdLnRpX0RhdGEgPSAodW5zaWduZWQgbG9uZyl3aW47Ci0JYXR0cmlidXRlc1tpXS50aV9UYWcgPSBBTUFfTGVmdDsJCWF0dHJpYnV0ZXNbaSsrXS50aV9EYXRhID0gMDsKLQlhdHRyaWJ1dGVzW2ldLnRpX1RhZyA9IEFNQV9Cb3R0b207CWF0dHJpYnV0ZXNbaSsrXS50aV9EYXRhID0gMDsKLQlhdHRyaWJ1dGVzW2ldLnRpX1RhZyA9IEFNQV9XaWR0aDsJYXR0cmlidXRlc1tpKytdLnRpX0RhdGEgPSB3aW4tPldpZHRoLXdpbi0+Qm9yZGVyTGVmdC13aW4tPkJvcmRlclJpZ2h0OwotCWF0dHJpYnV0ZXNbaV0udGlfVGFnID0gQU1BX0hlaWdodDsJYXR0cmlidXRlc1tpKytdLnRpX0RhdGEgPSB3aW4tPkhlaWdodC13aW4tPkJvcmRlckJvdHRvbS13aW4tPkJvcmRlclRvcDsKLQlhdHRyaWJ1dGVzW2ldLnRpX1RhZyA9IEFNQV9EaXJlY3RSZW5kZXI7IGF0dHJpYnV0ZXNbaSsrXS50aV9EYXRhID0gR0xfVFJVRTsKLQotCS8vIGRvdWJsZSBidWZmZXIgPwotCWF0dHJpYnV0ZXNbaV0udGlfVGFnID0gQU1BX0RvdWJsZUJ1ZjsKLQlpZiAoIHRoaXMtPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyICkgewotCQlhdHRyaWJ1dGVzW2krK10udGlfRGF0YSA9IEdMX1RSVUU7Ci0JfQotCWVsc2UgewotCQlhdHRyaWJ1dGVzW2krK10udGlfRGF0YSA9IEdMX0ZBTFNFOwotCX0KLQkvLyBSR0IoQSkgTW9kZSA/Ci0JYXR0cmlidXRlc1tpXS50aV9UYWcgPSBBTUFfUkdCTW9kZTsKLQlpZiAoIHRoaXMtPmdsX2NvbmZpZy5yZWRfc2l6ZSAgICE9IDAgJiYKLQkgICAgIHRoaXMtPmdsX2NvbmZpZy5ibHVlX3NpemUgICE9IDAgJiYKLQkgICAgIHRoaXMtPmdsX2NvbmZpZy5ncmVlbl9zaXplICE9IDAgKSB7Ci0JCWF0dHJpYnV0ZXNbaSsrXS50aV9EYXRhID0gR0xfVFJVRTsKLQl9Ci0JZWxzZSB7Ci0JCWF0dHJpYnV0ZXNbaSsrXS50aV9EYXRhID0gR0xfRkFMU0U7Ci0JfQotCS8vIG5vIGRlcHRoIGJ1ZmZlciA/Ci0JaWYgKCB0aGlzLT5nbF9jb25maWcuZGVwdGhfc2l6ZSA9PSAwICkgewotCQlhdHRyaWJ1dGVzW2ldLnRpX1RhZyA9IEFNQV9Ob0RlcHRoOwotCQlhdHRyaWJ1dGVzW2krK10udGlfRGF0YSA9IEdMX1RSVUU7Ci0JfQotCS8vIG5vIHN0ZW5jaWwgYnVmZmVyID8KLQlpZiAoIHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemUgPT0gMCApIHsKLQkJYXR0cmlidXRlc1tpXS50aV9UYWcgPSBBTUFfTm9TdGVuY2lsOwotCQlhdHRyaWJ1dGVzW2krK10udGlfRGF0YSA9IEdMX1RSVUU7Ci0JfQotCS8vIG5vIGFjY3VtIGJ1ZmZlciA/Ci0JaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemUgICAhPSAwICYmCi0JICAgICB0aGlzLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplICAhPSAwICYmCi0JICAgICB0aGlzLT5nbF9jb25maWcuYWNjdW1fZ3JlZW5fc2l6ZSAhPSAwICkgewotCQlhdHRyaWJ1dGVzW2ldLnRpX1RhZyA9IEFNQV9Ob0FjY3VtOwotCQlhdHRyaWJ1dGVzW2krK10udGlfRGF0YSA9IEdMX1RSVUU7Ci0JfQotCS8vIGRvbmUuLi4KLQlhdHRyaWJ1dGVzW2ldLnRpX1RhZwk9IFRBR19ET05FOwotCi0JZ2xjb250ID0gQW1pZ2FNZXNhQ3JlYXRlQ29udGV4dChhdHRyaWJ1dGVzKTsKLQlpZiAoIGdsY29udCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBPcGVuR0wgY29udGV4dCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQl0aGlzLT5nbF9kYXRhLT5nbF9hY3RpdmUgPSAxOwotCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMTsKLQotCXJldHVybigwKTsKLSNlbHNlCi0JU0RMX1NldEVycm9yKCJPcGVuR0wgc3VwcG9ydCBub3QgY29uZmlndXJlZCIpOwotCXJldHVybigtMSk7Ci0jZW5kaWYKLX0KLQotLyogUXVpdCBPcGVuR0wgKi8KLXZvaWQgQ0dYX0dMX1F1aXQoX1RISVMpCi17Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCWlmICggZ2xjb250ICE9IE5VTEwgKSB7Ci0JCUFtaWdhTWVzYURlc3Ryb3lDb250ZXh0KGdsY29udCk7Ci0JCWdsY29udCA9IE5VTEw7Ci0JCXRoaXMtPmdsX2RhdGEtPmdsX2FjdGl2ZSA9IDA7Ci0JCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMDsKLQl9Ci0jZW5kaWYKLX0KLQotLyogQXR0YWNoIGNvbnRleHQgdG8gYW5vdGhlciB3aW5kb3cgKi8KLWludCBDR1hfR0xfVXBkYXRlKF9USElTKQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLQlzdHJ1Y3QgVGFnSXRlbSB0YWdzWzJdOwotCXN0cnVjdCBXaW5kb3cgKndpbiA9IChzdHJ1Y3QgV2luZG93KilTRExfV2luZG93OwotCWlmKGdsY29udCA9PSBOVUxMKSB7Ci0JCXJldHVybiAtMTsgLy9zaG91bGQgbmV2ZXIgaGFwcGVuCi0JfQotCXRhZ3NbMF0udGlfVGFnID0gQU1BX1dpbmRvdzsKLQl0YWdzWzBdLnRpX0RhdGEgPSAodW5zaWduZWQgbG9uZyl3aW47Ci0JdGFnc1sxXS50aV9UYWcgPSBUQUdfRE9ORTsKLQlBbWlnYU1lc2FTZXRSYXN0KGdsY29udCwgdGFncyk7Ci0KLQlyZXR1cm4gMDsKLSNlbHNlCi0JU0RMX1NldEVycm9yKCJPcGVuR0wgc3VwcG9ydCBub3QgY29uZmlndXJlZCIpOwotCXJldHVybiAtMTsKLSNlbmRpZgotfQotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotCi0vKiBNYWtlIHRoZSBjdXJyZW50IGNvbnRleHQgYWN0aXZlICovCi1pbnQgQ0dYX0dMX01ha2VDdXJyZW50KF9USElTKQotewotCWlmKGdsY29udCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlBbWlnYU1lc2FNYWtlQ3VycmVudChnbGNvbnQsIGdsY29udC0+YnVmZmVyKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBDR1hfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpCi17Ci0JQW1pZ2FNZXNhU3dhcEJ1ZmZlcnMoZ2xjb250KTsKLX0KLQotaW50IENHWF9HTF9HZXRBdHRyaWJ1dGUoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKSB7Ci0JR0xlbnVtIG1lc2FfYXR0cmliOwotCi0Jc3dpdGNoKGF0dHJpYikgewotCQljYXNlIFNETF9HTF9SRURfU0laRToKLQkJCW1lc2FfYXR0cmliID0gR0xfUkVEX0JJVFM7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfR1JFRU5fU0laRToKLQkJCW1lc2FfYXR0cmliID0gR0xfR1JFRU5fQklUUzsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9CTFVFX1NJWkU6Ci0JCQltZXNhX2F0dHJpYiA9IEdMX0JMVUVfQklUUzsKLQkJCWJyZWFrOwotCQljYXNlIFNETF9HTF9BTFBIQV9TSVpFOgotCQkJbWVzYV9hdHRyaWIgPSBHTF9BTFBIQV9CSVRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0RPVUJMRUJVRkZFUjoKLQkJCW1lc2FfYXR0cmliID0gR0xfRE9VQkxFQlVGRkVSOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0RFUFRIX1NJWkU6Ci0JCQltZXNhX2F0dHJpYiA9IEdMX0RFUFRIX0JJVFM7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfU1RFTkNJTF9TSVpFOgotCQkJbWVzYV9hdHRyaWIgPSBHTF9TVEVOQ0lMX0JJVFM7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQUNDVU1fUkVEX1NJWkU6Ci0JCQltZXNhX2F0dHJpYiA9IEdMX0FDQ1VNX1JFRF9CSVRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkU6Ci0JCQltZXNhX2F0dHJpYiA9IEdMX0FDQ1VNX0dSRUVOX0JJVFM7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQUNDVU1fQkxVRV9TSVpFOgotCQkJbWVzYV9hdHRyaWIgPSBHTF9BQ0NVTV9CTFVFX0JJVFM7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfR0xfQUNDVU1fQUxQSEFfU0laRToKLQkJCW1lc2FfYXR0cmliID0gR0xfQUNDVU1fQUxQSEFfQklUUzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0IDoKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlBbWlnYU1lc2FHZXRDb25maWcoZ2xjb250LT52aXN1YWwsIG1lc2FfYXR0cmliLCB2YWx1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgKkNHWF9HTF9HZXRQcm9jQWRkcmVzcyhfVEhJUywgY29uc3QgY2hhciAqcHJvYykgewotCXZvaWQgKmZ1bmMgPSBOVUxMOwotCWZ1bmMgPSBBbWlHZXRHTFByb2MocHJvYyk7Ci0JcmV0dXJuIGZ1bmM7Ci19Ci0KLWludCBDR1hfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIgKnBhdGgpIHsKLQkvKiBMaWJyYXJ5IGlzIGFsd2F5cyBvcGVuICovCi0JdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneGdsX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneGdsX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwNGY1OS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9jZ3hnbF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogU3Rvcm1NZXNhIGltcGxlbWVudGF0aW9uIG9mIFNETCBPcGVuR0wgc3VwcG9ydCAqLwotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0KLSNkZWZpbmUgX1RISVMgICBTRExfVmlkZW9EZXZpY2UgKl90aGlzCi0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0jaW5jbHVkZSA8R0wvQW1pZ2FtZXNhLmg+Ci1leHRlcm4gdm9pZCAqQW1pR2V0R0xQcm9jKGNvbnN0IGNoYXIgKnByb2MpOwotI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KLQotc3RydWN0IFNETF9Qcml2YXRlR0xEYXRhIHsKLQlpbnQgZ2xfYWN0aXZlOwotfTsKLQotLyogT3BlbkdMIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCBDR1hfR0xfSW5pdChfVEhJUyk7Ci1leHRlcm4gdm9pZCBDR1hfR0xfUXVpdChfVEhJUyk7Ci1leHRlcm4gaW50IENHWF9HTF9VcGRhdGUoX1RISVMpOwotI2lmIFNETF9WSURFT19PUEVOR0wKLWV4dGVybiBpbnQgQ0dYX0dMX01ha2VDdXJyZW50KF9USElTKTsKLWV4dGVybiBpbnQgQ0dYX0dMX0dldEF0dHJpYnV0ZShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOwotZXh0ZXJuIHZvaWQgQ0dYX0dMX1N3YXBCdWZmZXJzKF9USElTKTsKLWV4dGVybiB2b2lkICpDR1hfR0xfR2V0UHJvY0FkZHJlc3MoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpOwotZXh0ZXJuIGludCBDR1hfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIgKnBhdGgpOwotI2VuZGlmCi0KLSN1bmRlZiBfVEhJUwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4aW1hZ2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneGltYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlODkzOGUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4aW1hZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDkwNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKLSNpbmNsdWRlICJTRExfY2d4aW1hZ2VfYy5oIgotCi0jaWZkZWYgSEFWRV9LU1RBVAotI2luY2x1ZGUgPGtzdGF0Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9DR1hfV1JJVEVMVVRQSVhFTAotI2lmIGRlZmluZWQoX19TQVNDKSB8fCBkZWZpbmVkKF9fUFBDX18pCi0JI2RlZmluZSBXTFVUIFdyaXRlTFVUUGl4ZWxBcnJheQotI2Vsc2UKLXZvaWQgV0xVVChBUFRSIGEsVVdPUkQgYixVV09SRCBjLFVXT1JEIGQsc3RydWN0IFJhc3RQb3J0ICplLEFQVFIgZixVV09SRCBnLFVXT1JEIGgsVVdPUkQgaSxVV09SRCBsLFVCWVRFIG0pCi17CVdyaXRlTFVUUGl4ZWxBcnJheShhLGIsYyxkLGUsZixnLGgsaSxsLG0pOyB9Ci0jZW5kaWYKLQotI2VuZGlmCi0KLS8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCi1zdGF0aWMgdm9pZCBDR1hfTm9ybWFsVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci1zdGF0aWMgdm9pZCBDR1hfRmFrZVVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotCi1CT09MIFNhZmVEaXNwPVRSVUUsU2FmZUNoYW5nZT1UUlVFOwotc3RydWN0IE1zZ1BvcnQgKnNhZmVwb3J0PU5VTEwsKmRpc3Bwb3J0PU5VTEw7Ci1VTE9ORyBzYWZlX3NpZ2JpdCxkaXNwX3NpZ2JpdDsKLWludCB1c2VfcGljYXNzbzk2PTE7Ci0KLWludCBDR1hfU2V0dXBJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbikKLXsKLQlTRExfWGltYWdlPU5VTEw7Ci0KLQlpZihzY3JlZW4tPmZsYWdzJlNETF9IV1NVUkZBQ0UpIHsKLQkJVUxPTkcgcGl0Y2g7Ci0KLQkJaWYoIXNjcmVlbi0+aHdkYXRhKSB7Ci0JCQlpZighKHNjcmVlbi0+aHdkYXRhPVNETF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcml2YXRlX2h3ZGF0YSkpKSkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCUQoYnVnKCJDcmVhdGluZyBzeXN0ZW0gYWNjZWwgc3RydWN0XG4iKSk7Ci0JCX0KLQkJc2NyZWVuLT5od2RhdGEtPmxvY2s9TlVMTDsKLQkJc2NyZWVuLT5od2RhdGEtPmFsbG9jYXRlZD0wOwotCQlzY3JlZW4tPmh3ZGF0YS0+bWFzaz1OVUxMOwotCQlzY3JlZW4tPmh3ZGF0YS0+Ym1hcD1TRExfUmFzdFBvcnQtPkJpdE1hcDsKLQkJc2NyZWVuLT5od2RhdGEtPnZpZGVvZGF0YT10aGlzOwotCi0JCWlmKCEoc2NyZWVuLT5od2RhdGEtPmxvY2s9TG9ja0JpdE1hcFRhZ3Moc2NyZWVuLT5od2RhdGEtPmJtYXAsCi0JCQkJTEJNSV9CQVNFQUREUkVTUywoVUxPTkcpJnNjcmVlbi0+cGl4ZWxzLAotCQkJCUxCTUlfQllURVNQRVJST1csKFVMT05HKSZwaXRjaCxUQUdfRE9ORSkpKSB7Ci0JCQlTRExfZnJlZShzY3JlZW4tPmh3ZGF0YSk7Ci0JCQlzY3JlZW4tPmh3ZGF0YT1OVUxMOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJVW5Mb2NrQml0TWFwKHNjcmVlbi0+aHdkYXRhLT5sb2NrKTsKLQkJCXNjcmVlbi0+aHdkYXRhLT5sb2NrPU5VTEw7Ci0JCX0KLQotCQlzY3JlZW4tPnBpdGNoPXBpdGNoOwotCi0JCXRoaXMtPlVwZGF0ZVJlY3RzID0gQ0dYX0Zha2VVcGRhdGU7Ci0KLQkJRChidWcoIkFjY2VsIHZpZGVvIGltYWdlIGNvbmZpZ3VyZWQgKCVseCwgcGl0Y2ggJWxkKS5cbiIsc2NyZWVuLT5waXhlbHMsc2NyZWVuLT5waXRjaCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzY3JlZW4tPnBpeGVscyA9IFNETF9tYWxsb2Moc2NyZWVuLT5oKnNjcmVlbi0+cGl0Y2gpOwotCi0JaWYgKCBzY3JlZW4tPnBpeGVscyA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQlTRExfWGltYWdlPXNjcmVlbi0+cGl4ZWxzOwotCi0JaWYgKCBTRExfWGltYWdlID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIFhJbWFnZSIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCXRoaXMtPlVwZGF0ZVJlY3RzID0gQ0dYX05vcm1hbFVwZGF0ZTsKLQotCXJldHVybigwKTsKLX0KLQotdm9pZCBDR1hfRGVzdHJveUltYWdlKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKQotewotCWlmICggU0RMX1hpbWFnZSApIHsKLQkJU0RMX2ZyZWUoU0RMX1hpbWFnZSk7Ci0JCVNETF9YaW1hZ2UgPSBOVUxMOwotCX0KLQlpZiAoIHNjcmVlbiApIHsKLQkJc2NyZWVuLT5waXhlbHMgPSBOVUxMOwotCi0JCWlmKHNjcmVlbi0+aHdkYXRhKSB7Ci0JCQlTRExfZnJlZShzY3JlZW4tPmh3ZGF0YSk7Ci0JCQlzY3JlZW4tPmh3ZGF0YT1OVUxMOwotCQl9Ci0JfQotfQotCi0vKiBUaGlzIGlzIGEgaGFjayB0byBzZWUgd2hldGhlciB0aGlzIHN5c3RlbSBoYXMgbW9yZSB0aGFuIDEgQ1BVICovCi1zdGF0aWMgaW50IG51bV9DUFUodm9pZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotaW50IENHWF9SZXNpemVJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbiwgVWludDMyIGZsYWdzKQotewotCWludCByZXR2YWw7Ci0KLQlEKGJ1ZygiQ2FsbGluZyBSZXNpemVJbWFnZSgpXG4iKSk7Ci0KLQlDR1hfRGVzdHJveUltYWdlKHRoaXMsIHNjcmVlbik7Ci0KLQlpZiAoIGZsYWdzICYgU0RMX09QRU5HTCApIHsgIC8qIE5vIGltYWdlIHdoZW4gdXNpbmcgR0wgKi8KLSAgICAgICAgCXJldHZhbCA9IDA7Ci0JfSBlbHNlIHsKLQkJcmV0dmFsID0gQ0dYX1NldHVwSW1hZ2UodGhpcywgc2NyZWVuKTsKLQkJLyogV2Ugc3VwcG9ydCBhc3luY2hyb25vdXMgYmxpdHRpbmcgb24gdGhlIGRpc3BsYXkgKi8KLQkJaWYgKCBmbGFncyAmIFNETF9BU1lOQ0JMSVQgKSB7Ci0JCQlpZiAoIG51bV9DUFUoKSA+IDEgKSB7Ci0JCQkJc2NyZWVuLT5mbGFncyB8PSBTRExfQVNZTkNCTElUOwotCQkJfQotCQl9Ci0JfQotCXJldHVybihyZXR2YWwpOwotfQotCi1pbnQgQ0dYX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlEKGJ1ZygiQWxsb2MgSFcgc3VyZmFjZS4uLiVsZCB4ICVsZCB4ICVsZCFcbiIsc3VyZmFjZS0+dyxzdXJmYWNlLT5oLHRoaXMtPmhpZGRlbi0+ZGVwdGgpKTsKLQotCWlmKHN1cmZhY2U9PVNETF9WaWRlb1N1cmZhY2UpCi0JewotCQlEKGJ1ZygiQWxsb2NhdGlvbiBza2lwcGVkLCBpdCdzIHN5c3RlbSBvbmUhXG4iKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmKCFzdXJmYWNlLT5od2RhdGEpCi0JewotCQlpZighKHN1cmZhY2UtPmh3ZGF0YT1TRExfbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEpKSkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3VyZmFjZS0+aHdkYXRhLT5tYXNrPU5VTEw7Ci0Jc3VyZmFjZS0+aHdkYXRhLT5sb2NrPU5VTEw7Ci0Jc3VyZmFjZS0+aHdkYXRhLT52aWRlb2RhdGE9dGhpczsKLQlzdXJmYWNlLT5od2RhdGEtPmFsbG9jYXRlZD0wOwotCi0JaWYoc3VyZmFjZS0+aHdkYXRhLT5ibWFwPUFsbG9jQml0TWFwKHN1cmZhY2UtPncsc3VyZmFjZS0+aCx0aGlzLT5oaWRkZW4tPmRlcHRoLEJNRl9NSU5QTEFORVMsU0RMX0Rpc3BsYXktPlJhc3RQb3J0LkJpdE1hcCkpCi0JewotCQlzdXJmYWNlLT5od2RhdGEtPmFsbG9jYXRlZD0xOwotCQlzdXJmYWNlLT5mbGFnc3w9U0RMX0hXU1VSRkFDRTsKLQkJRChidWcoIi4uLk9LXG4iKSk7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlCi0JewotCQlTRExfZnJlZShzdXJmYWNlLT5od2RhdGEpOwotCQlzdXJmYWNlLT5od2RhdGE9TlVMTDsKLQl9Ci0KLQlyZXR1cm4oLTEpOwotfQotdm9pZCBDR1hfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYoc3VyZmFjZSAmJiBzdXJmYWNlIT1TRExfVmlkZW9TdXJmYWNlICYmIHN1cmZhY2UtPmh3ZGF0YSkKLQl7Ci0JCUQoYnVnKCJGcmVlIGh3IHN1cmZhY2UuXG4iKSk7Ci0KLQkJaWYoc3VyZmFjZS0+aHdkYXRhLT5tYXNrKQotCQkJU0RMX2ZyZWUoc3VyZmFjZS0+aHdkYXRhLT5tYXNrKTsKLQotCQlpZihzdXJmYWNlLT5od2RhdGEtPmJtYXAmJnN1cmZhY2UtPmh3ZGF0YS0+YWxsb2NhdGVkKQotCQkJRnJlZUJpdE1hcChzdXJmYWNlLT5od2RhdGEtPmJtYXApOwotCi0JCVNETF9mcmVlKHN1cmZhY2UtPmh3ZGF0YSk7Ci0JCXN1cmZhY2UtPmh3ZGF0YT1OVUxMOwotCQlzdXJmYWNlLT5waXhlbHM9TlVMTDsKLQkJRChidWcoImVuZCBvZiBmcmVlIGh3IHN1cmZhY2VcbiIpKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1pbnQgQ0dYX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWlmIChzdXJmYWNlLT5od2RhdGEpCi0JewotLy8JCUQoYnVnKCJMb2NraW5nIGEgYml0bWFwLi4uXG4iKSk7Ci0JCWlmKCFzdXJmYWNlLT5od2RhdGEtPmxvY2spCi0JCXsJCi0JCQlVaW50MzIgcGl0Y2g7Ci0KLQkJCWlmKCEoc3VyZmFjZS0+aHdkYXRhLT5sb2NrPUxvY2tCaXRNYXBUYWdzKHN1cmZhY2UtPmh3ZGF0YS0+Ym1hcCwKLQkJCQkJTEJNSV9CQVNFQUREUkVTUywoVUxPTkcpJnN1cmZhY2UtPnBpeGVscywKLQkJCQkJTEJNSV9CWVRFU1BFUlJPVywoVUxPTkcpJnBpdGNoLFRBR19ET05FKSkpCi0JCQkJcmV0dXJuIC0xOwotCi0vLyBzdXJmYWNlLT5waXRjaCBlJyBhIDE2Yml0IQotCi0JCQlzdXJmYWNlLT5waXRjaD1waXRjaDsKLQotCQkJaWYoIWN1cnJlbnRseV9mdWxsc2NyZWVuJiZzdXJmYWNlPT1TRExfVmlkZW9TdXJmYWNlKQotCQkJCXN1cmZhY2UtPnBpeGVscz0oKGNoYXIgKilzdXJmYWNlLT5waXhlbHMpKyhzdXJmYWNlLT5waXRjaCooU0RMX1dpbmRvdy0+Qm9yZGVyVG9wK1NETF9XaW5kb3ctPlRvcEVkZ2UpKwotCQkJCQlzdXJmYWNlLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwqKFNETF9XaW5kb3ctPkJvcmRlckxlZnQrU0RMX1dpbmRvdy0+TGVmdEVkZ2UpKTsKLQkJfQotCQlEKGVsc2UgYnVnKCJBbHJlYWR5IGxvY2tlZCEhIVxuIikpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgQ0dYX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYoc3VyZmFjZS0+aHdkYXRhICYmIHN1cmZhY2UtPmh3ZGF0YS0+bG9jaykKLQl7Ci0JCVVuTG9ja0JpdE1hcChzdXJmYWNlLT5od2RhdGEtPmxvY2spOwotCQlzdXJmYWNlLT5od2RhdGEtPmxvY2s9TlVMTDsKLS8vCQlzdXJmYWNlLT5waXhlbHM9TlVMTDsKLQl9Ci19Ci0KLWludCBDR1hfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0Jc3RhdGljIGludCBjdXJyZW50PTA7Ci0KLQlpZih0aGlzLT5oaWRkZW4tPmRidWZmZXIpCi0JewotCQlpZighU2FmZUNoYW5nZSkKLQkJewotCQkJV2FpdChkaXNwX3NpZ2JpdCk7Ci0vLyBOb24gZmFjY2lvIG51bGxhLCB2dW90byBzb2xvIGxhIHBvcnRhCi0JCQl3aGlsZShHZXRNc2coZGlzcHBvcnQpIT1OVUxMKSAKLQkJCQk7Ci0JCQlTYWZlQ2hhbmdlPVRSVUU7Ci0JCX0KLQotCQlpZihDaGFuZ2VTY3JlZW5CdWZmZXIoU0RMX0Rpc3BsYXksdGhpcy0+aGlkZGVuLT5TQltjdXJyZW50XjFdKSkKLQkJewotCQkJc3VyZmFjZS0+aHdkYXRhLT5ibWFwPVNETF9SYXN0UG9ydC0+Qml0TWFwPXRoaXMtPmhpZGRlbi0+U0JbY3VycmVudF0tPnNiX0JpdE1hcDsKLQkJCVNhZmVDaGFuZ2U9RkFMU0U7Ci0JCQlTYWZlRGlzcD1GQUxTRTsKLQkJCWN1cnJlbnRePTE7Ci0JCX0KLQotCQlpZighU2FmZURpc3ApCi0JCXsKLQkJCVdhaXQoc2FmZV9zaWdiaXQpOwotCQkJd2hpbGUoR2V0TXNnKHNhZmVwb3J0KSE9TlVMTCkgCi0JCQkJOwotCQkJU2FmZURpc3A9VFJVRTsKLQkJfQotCi0JfQotCXJldHVybigwKTsKLX0KLQotLyogQnl0ZS1zd2FwIHRoZSBwaXhlbHMgaW4gdGhlIGRpc3BsYXkgaW1hZ2UgKi8KLXN0YXRpYyB2b2lkIENHWF9Td2FwQWxsUGl4ZWxzKFNETF9TdXJmYWNlICpzY3JlZW4pCi17Ci0JaW50IHgsIHk7Ci0KLQlzd2l0Y2ggKHNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7Ci0JICAgIGNhc2UgMjogewotCQlVaW50MTYgKnNwb3Q7Ci0JCWZvciAoIHk9MDsgeTxzY3JlZW4tPmg7ICsreSApIHsKLQkJCXNwb3QgPSAoVWludDE2ICopICgoVWludDggKilzY3JlZW4tPnBpeGVscyArCi0JCQkJCQl5ICogc2NyZWVuLT5waXRjaCk7Ci0JCQlmb3IgKCB4PTA7IHg8c2NyZWVuLT53OyArK3gsICsrc3BvdCApIHsKLQkJCQkqc3BvdCA9IFNETF9Td2FwMTYoKnNwb3QpOwotCQkJfQotCQl9Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSA0OiB7Ci0JCVVpbnQzMiAqc3BvdDsKLQkJZm9yICggeT0wOyB5PHNjcmVlbi0+aDsgKyt5ICkgewotCQkJc3BvdCA9IChVaW50MzIgKikgKChVaW50OCAqKXNjcmVlbi0+cGl4ZWxzICsKLQkJCQkJCXkgKiBzY3JlZW4tPnBpdGNoKTsKLQkJCWZvciAoIHg9MDsgeDxzY3JlZW4tPnc7ICsreCwgKytzcG90ICkgewotCQkJCSpzcG90ID0gU0RMX1N3YXAzMigqc3BvdCk7Ci0JCQl9Ci0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCQkvKiBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KLQkJYnJlYWs7Ci0JfQotfQotc3RhdGljIHZvaWQgQ0dYX1N3YXBQaXhlbHMoU0RMX1N1cmZhY2UgKnNjcmVlbiwgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JaW50IGk7Ci0JaW50IHgsIG1pbngsIG1heHg7Ci0JaW50IHksIG1pbnksIG1heHk7Ci0KLQlzd2l0Y2ggKHNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7Ci0JICAgIGNhc2UgMjogewotCQlVaW50MTYgKnNwb3Q7Ci0JCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgewotCQkJbWlueCA9IHJlY3RzW2ldLng7Ci0JCQltYXh4ID0gcmVjdHNbaV0ueCtyZWN0c1tpXS53OwotCQkJbWlueSA9IHJlY3RzW2ldLnk7Ci0JCQltYXh5ID0gcmVjdHNbaV0ueStyZWN0c1tpXS5oOwotCQkJZm9yICggeT1taW55OyB5PG1heHk7ICsreSApIHsKLQkJCQlzcG90ID0gKFVpbnQxNiAqKSAoKFVpbnQ4ICopc2NyZWVuLT5waXhlbHMgKwotCQkJCQkJeSAqIHNjcmVlbi0+cGl0Y2ggKyBtaW54ICogMik7Ci0JCQkJZm9yICggeD1taW54OyB4PG1heHg7ICsreCwgKytzcG90ICkgewotCQkJCQkqc3BvdCA9IFNETF9Td2FwMTYoKnNwb3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIGNhc2UgNDogewotCQlVaW50MzIgKnNwb3Q7Ci0JCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgewotCQkJbWlueCA9IHJlY3RzW2ldLng7Ci0JCQltYXh4ID0gcmVjdHNbaV0ueCtyZWN0c1tpXS53OwotCQkJbWlueSA9IHJlY3RzW2ldLnk7Ci0JCQltYXh5ID0gcmVjdHNbaV0ueStyZWN0c1tpXS5oOwotCQkJZm9yICggeT1taW55OyB5PG1heHk7ICsreSApIHsKLQkJCQlzcG90ID0gKFVpbnQzMiAqKSAoKFVpbnQ4ICopc2NyZWVuLT5waXhlbHMgKwotCQkJCQkJeSAqIHNjcmVlbi0+cGl0Y2ggKyBtaW54ICogNCk7Ci0JCQkJZm9yICggeD1taW54OyB4PG1heHg7ICsreCwgKytzcG90ICkgewotCQkJCQkqc3BvdCA9IFNETF9Td2FwMzIoKnNwb3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JCS8qIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLwotCQlicmVhazsKLQl9Ci19Ci0KLSNpZmRlZiBfX1NBU0MKLQotI2RlZmluZSBVU0VfV1BBIFdyaXRlUGl4ZWxBcnJheQotI2Vsc2UKLQotdm9pZCBVU0VfV1BBKGNoYXIgKmEsaW50IGIsaW50IGMsaW50IGQsIHN0cnVjdCBSYXN0UG9ydCAqZSxpbnQgZixpbnQgZywgaW50IGgsIGludCBpLCBVaW50MzIgbCkKLXsKLQkJV3JpdGVQaXhlbEFycmF5KGEsYixjLGQsZSxmLGcsaCxpLGwpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgQ0dYX0Zha2VVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotfQotCi1zdGF0aWMgdm9pZCBDR1hfTm9ybWFsVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLQlpbnQgaSxmb3JtYXQsY3VzdG9tcm91dGluZT0wOwotI2lmbmRlZiBVU0VfQ0dYX1dSSVRFTFVUUElYRUwKLQlpbnQgYnBwOwotI2VuZGlmCi0JaWYodGhpcy0+aGlkZGVuLT5zYW1lX2Zvcm1hdCAmJiAhdXNlX3BpY2Fzc285NikKLQl7Ci0JCWZvcm1hdD1SRUNURk1UX1JBVzsKLQl9Ci0JZWxzZSBzd2l0Y2godGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpCi0JewotCQljYXNlIDQ6Ci0JCQlmb3JtYXQ9UkVDVEZNVF9SR0JBOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWZvcm1hdD1SRUNURk1UX1JHQjsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQljdXN0b21yb3V0aW5lPTE7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotLy8JCQlEKGJ1Zygic29mdCBkZXB0aDogOCBoYXJkYnBwOiAlbGRcbiIsdGhpcy0+aGlkZGVuLT5kZXB0aCkpOwotCQkJaWYodGhpcy0+aGlkZGVuLT5kZXB0aD44KQotCQkJewotI2lmbmRlZiBVU0VfQ0dYX1dSSVRFTFVUUElYRUwKLQkJCQlpZih0aGlzLT5oaWRkZW4tPmRlcHRoPjMyKQotCQkJCQljdXN0b21yb3V0aW5lPTQ7Ci0JCQkJZWxzZSBpZih0aGlzLT5oaWRkZW4tPmRlcHRoPjE2KQotCQkJCXsKLQkJCQkJYnBwPXRoaXMtPmhpZGRlbi0+Qnl0ZXNQZXJQaXhlbDsgLy8gVGhhdCBvbmUgaXMgdGhlIG9ubHkgb25lIHRoYXQgbmVlZHMgYnBwCi0JCQkJCWN1c3RvbXJvdXRpbmU9MjsgLy8gVGhlIHNsb3cgb25lIQotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWN1c3RvbXJvdXRpbmU9MzsKLSNlbHNlCi0KLQkJCQljdXN0b21yb3V0aW5lPTI7Ci0jZW5kaWYKLQkJCQkKLS8vCQkJCWZvcm1hdD1SRUNURk1UX0xVVDg7ICAgVmVjY2hpYSBmdW56aW9uZSB4IHVzYXJlIGxhIFdyaXRlUGl4ZWxBcnJheS4KLQkJCX0KLQkJCWVsc2UKLQkJCQljdXN0b21yb3V0aW5lPTE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUQoYnVnKCJVbmFibGUgdG8gYmxpdCB0aGlzIHN1cmZhY2UhXG4iKSk7CQotCQkJcmV0dXJuOwotCX0KLQotCS8qIENoZWNrIGZvciBlbmRpYW4tc3dhcHBlZCBYIHNlcnZlciwgc3dhcCBpZiBuZWNlc3NhcnkgKFZFUlkgc2xvdyEpICovCi0JaWYgKCBzd2FwX3BpeGVscyAmJgotCSAgICAgKCh0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCUyKSA9PSAwKSApIHsKLQkJRChidWcoIlNvZnR3YXJlIFN3YXBwaW5nISBTTE9PT1chXG4iKSk7Ci0JCUNHWF9Td2FwUGl4ZWxzKHRoaXMtPnNjcmVlbiwgbnVtcmVjdHMsIHJlY3RzKTsKLQkJZm9yICggaT0wOyBpPG51bXJlY3RzOyArK2kgKSB7Ci0JCQlpZiAoICEgcmVjdHNbaV0udyApIHsgLyogQ2xpcHBlZD8gKi8KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVVTRV9XUEEodGhpcy0+c2NyZWVuLT5waXhlbHMscmVjdHNbaV0ueCwgcmVjdHNbaV0ueSx0aGlzLT5zY3JlZW4tPnBpdGNoLAotCQkJCQlTRExfUmFzdFBvcnQsU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdCtyZWN0c1tpXS54LFNETF9XaW5kb3ctPkJvcmRlclRvcCtyZWN0c1tpXS55LAotCQkJCQlyZWN0c1tpXS53LHJlY3RzW2ldLmgsZm9ybWF0KTsKLQkJfQotCQlDR1hfU3dhcFBpeGVscyh0aGlzLT5zY3JlZW4sIG51bXJlY3RzLCByZWN0cyk7Ci0JfQotCWVsc2UgaWYgKGN1c3RvbXJvdXRpbmU9PTIpCi0JewotI2lmZGVmIFVTRV9DR1hfV1JJVEVMVVRQSVhFTAotCQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIHsKLQkJCWlmICggISByZWN0c1tpXS53ICkgeyAvKiBDbGlwcGVkPyAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlXTFVUKHRoaXMtPnNjcmVlbi0+cGl4ZWxzLHJlY3RzW2ldLngsIHJlY3RzW2ldLnksdGhpcy0+c2NyZWVuLT5waXRjaCwKLQkJCQkJU0RMX1Jhc3RQb3J0LFNETF9YUGl4ZWxzLFNETF9XaW5kb3ctPkJvcmRlckxlZnQrcmVjdHNbaV0ueCxTRExfV2luZG93LT5Cb3JkZXJUb3ArcmVjdHNbaV0ueSwKLQkJCQkJcmVjdHNbaV0udyxyZWN0c1tpXS5oLENUQUJGTVRfWFJHQjgpOwotCQl9Ci0jZWxzZQotCQl1bnNpZ25lZCBjaGFyICpibV9hZGRyZXNzOwotCQlVaW50MzIJZGVzdHBpdGNoOwotCQlBUFRSIGhhbmRsZTsKLQotCQlpZihoYW5kbGU9TG9ja0JpdE1hcFRhZ3MoU0RMX1Jhc3RQb3J0LT5CaXRNYXAsTEJNSV9CQVNFQUREUkVTUywmYm1fYWRkcmVzcywKLQkJCQkJCQkJTEJNSV9CWVRFU1BFUlJPVywmZGVzdHBpdGNoLFRBR19ET05FKSkKLQkJewotCQkJaW50IHNyY3dpZHRoOwotCQkJdW5zaWduZWQgY2hhciAqZGVzdGJhc2U7Ci0JCQlyZWdpc3RlciBpbnQgaixrLHQ7Ci0JCQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICptYXNrLCpkc3Q7Ci0JCQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzcmMsKmRlc3Q7Ci0KLS8vIEFnZ2l1bmdvIGlsIGJvcmRvIGRlbGxhIGZpbmVzdHJhIHNlIHNvbm8gZnVsbHNjcmVlbi4KLQkJCWlmKGN1cnJlbnRseV9mdWxsc2NyZWVuKQotCQkJCWRlc3RiYXNlPWJtX2FkZHJlc3M7Ci0JCQllbHNlCi0JCQkJZGVzdGJhc2U9Ym1fYWRkcmVzcysoU0RMX1dpbmRvdy0+VG9wRWRnZStTRExfV2luZG93LT5Cb3JkZXJUb3ApKmRlc3RwaXRjaCsoU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdCtTRExfV2luZG93LT5MZWZ0RWRnZSkqdGhpcy0+aGlkZGVuLT5CeXRlc1BlclBpeGVsOwotCi0JCQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIAotCQkJewotCQkJCXNyY3dpZHRoPXJlY3RzW2ldLnc7Ci0KLQkJCQlpZiAoICFzcmN3aWR0aCApIHsgLyogQ2xpcHBlZD8gKi8KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZGVzdD1kZXN0YmFzZStyZWN0c1tpXS54KnRoaXMtPmhpZGRlbi0+Qnl0ZXNQZXJQaXhlbDsKLQkJCQlkZXN0Kz0ocmVjdHNbaV0ueSpkZXN0cGl0Y2gpOwotCQkJCXNyYz0oKGNoYXIgKikodGhpcy0+c2NyZWVuLT5waXhlbHMpKStyZWN0c1tpXS54OwotCQkJCXNyYys9KHJlY3RzW2ldLnkqdGhpcy0+c2NyZWVuLT5waXRjaCk7Ci0JCQkJCi0JCQkJZm9yKGo9cmVjdHNbaV0uaDtqOy0taikKLQkJCQl7Ci0JCQkJCWRzdD1kZXN0OwotLy8gU0xPVyByb3V0aW5lLCB1c2VkIGZvciA4LT4yNCBiaXQgbWFwcGluZwotCQkJCQlmb3Ioaz0wO2s8c3Jjd2lkdGg7aysrKQotCQkJCQl7Ci0JCQkJCQltYXNrPSh1bnNpZ25lZCBjaGFyICopKCZTRExfWFBpeGVsc1tzcmNba11dKTsKLQkJCQkJCWZvcih0PTA7dDxicHA7dCsrKQotCQkJCQkJewotCQkJCQkJCWRzdFt0XT1tYXNrW3RdOwotCQkJCQkJfQotCQkJCQkJZHN0Kz1icHA7Ci0JCQkJCX0KLQkJCQkJc3JjKz10aGlzLT5zY3JlZW4tPnBpdGNoOwotCQkJCQlkZXN0Kz1kZXN0cGl0Y2g7Ci0JCQkJfQotCQkJfQotCQkJVW5Mb2NrQml0TWFwKGhhbmRsZSk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoY3VzdG9tcm91dGluZT09MykKLQl7Ci0JCXVuc2lnbmVkIGNoYXIgKmJtX2FkZHJlc3M7Ci0JCVVpbnQzMglkZXN0cGl0Y2g7Ci0JCUFQVFIgaGFuZGxlOwotCi0JCWlmKGhhbmRsZT1Mb2NrQml0TWFwVGFncyhTRExfUmFzdFBvcnQtPkJpdE1hcCxMQk1JX0JBU0VBRERSRVNTLCZibV9hZGRyZXNzLAotCQkJCQkJCQlMQk1JX0JZVEVTUEVSUk9XLCZkZXN0cGl0Y2gsVEFHX0RPTkUpKQotCQl7Ci0JCQlpbnQgc3Jjd2lkdGg7Ci0JCQl1bnNpZ25lZCBjaGFyICpkZXN0YmFzZTsKLQkJCXJlZ2lzdGVyIGludCBqLGs7Ci0JCQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzcmMsKmRlc3Q7Ci0JCQlyZWdpc3RlciBVaW50MTYgKmRlc3RsLCpzcmNsOwotCi0JCQlpZihjdXJyZW50bHlfZnVsbHNjcmVlbikKLQkJCQlkZXN0YmFzZT1ibV9hZGRyZXNzOwotCQkJZWxzZQotCQkJCWRlc3RiYXNlPWJtX2FkZHJlc3MrKFNETF9XaW5kb3ctPlRvcEVkZ2UrU0RMX1dpbmRvdy0+Qm9yZGVyVG9wKSpkZXN0cGl0Y2grKFNETF9XaW5kb3ctPkJvcmRlckxlZnQrU0RMX1dpbmRvdy0+TGVmdEVkZ2UpKnRoaXMtPmhpZGRlbi0+Qnl0ZXNQZXJQaXhlbDsKLQotCQkJZm9yICggaT0wOyBpPG51bXJlY3RzOyArK2kgKSAKLQkJCXsKLQkJCQlzcmN3aWR0aD1yZWN0c1tpXS53OwotCi0JCQkJaWYgKCAhc3Jjd2lkdGggKSB7IC8qIENsaXBwZWQ/ICovCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWRlc3Q9ZGVzdGJhc2UrcmVjdHNbaV0ueCp0aGlzLT5oaWRkZW4tPkJ5dGVzUGVyUGl4ZWw7Ci0JCQkJZGVzdCs9KHJlY3RzW2ldLnkqZGVzdHBpdGNoKTsKLQkJCQlzcmM9KChjaGFyICopKHRoaXMtPnNjcmVlbi0+cGl4ZWxzKSkrcmVjdHNbaV0ueDsKLQkJCQlzcmMrPShyZWN0c1tpXS55KnRoaXMtPnNjcmVlbi0+cGl0Y2gpOwotCQkJCQotLy8gVGhpcyBpcyB0aGUgZmFzdCwgd2VsbCBub3QgdG9vIHNsb3csIHJlbWFwcGluZyBjb2RlIGZvciAxNmJpdCBkaXNwbGF5cwotCi0JCQkJZm9yKGo9cmVjdHNbaV0uaDtqOy0taikKLQkJCQl7Ci0JCQkJCWRlc3RsPShVaW50MTYgKilkZXN0OwotCi0JCQkJCWZvcihrPTA7azxzcmN3aWR0aDtrKyspCi0JCQkJCXsKLQkJCQkJCXNyY2w9KFVpbnQxNiAqKSZTRExfWFBpeGVsc1tzcmNba11dOwotCQkJCQkJKmRlc3RsPSpzcmNsOwotCQkJCQkJZGVzdGwrKzsKLQkJCQkJfQotCQkJCQlzcmMrPXRoaXMtPnNjcmVlbi0+cGl0Y2g7Ci0JCQkJCWRlc3QrPWRlc3RwaXRjaDsKLQkJCQl9Ci0JCQl9Ci0JCQlVbkxvY2tCaXRNYXAoaGFuZGxlKTsKLQkJfQotCX0KLQllbHNlIGlmIChjdXN0b21yb3V0aW5lPT00KQotCXsKLQkJdW5zaWduZWQgY2hhciAqYm1fYWRkcmVzczsKLQkJVWludDMyCWRlc3RwaXRjaDsKLQkJQVBUUiBoYW5kbGU7Ci0KLQkJaWYoaGFuZGxlPUxvY2tCaXRNYXBUYWdzKFNETF9SYXN0UG9ydC0+Qml0TWFwLExCTUlfQkFTRUFERFJFU1MsJmJtX2FkZHJlc3MsCi0JCQkJCQkJCUxCTUlfQllURVNQRVJST1csJmRlc3RwaXRjaCxUQUdfRE9ORSkpCi0JCXsKLQkJCWludCBzcmN3aWR0aDsKLQkJCXVuc2lnbmVkIGNoYXIgKmRlc3RiYXNlOwotCQkJcmVnaXN0ZXIgaW50IGosazsKLQkJCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnNyYywqZGVzdDsKLQkJCXJlZ2lzdGVyIFVpbnQzMiAqZGVzdGwsKnNyY2w7Ci0KLQkJCWlmKGN1cnJlbnRseV9mdWxsc2NyZWVuKQotCQkJCWRlc3RiYXNlPWJtX2FkZHJlc3M7Ci0JCQllbHNlCi0JCQkJZGVzdGJhc2U9Ym1fYWRkcmVzcysoU0RMX1dpbmRvdy0+VG9wRWRnZStTRExfV2luZG93LT5Cb3JkZXJUb3ApKmRlc3RwaXRjaCsoU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdCtTRExfV2luZG93LT5MZWZ0RWRnZSkqdGhpcy0+aGlkZGVuLT5CeXRlc1BlclBpeGVsOwotCi0JCQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIAotCQkJewotCQkJCXNyY3dpZHRoPXJlY3RzW2ldLnc7Ci0KLQkJCQlpZiAoICFzcmN3aWR0aCApIHsgLyogQ2xpcHBlZD8gKi8KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZGVzdD1kZXN0YmFzZStyZWN0c1tpXS54KnRoaXMtPmhpZGRlbi0+Qnl0ZXNQZXJQaXhlbDsKLQkJCQlkZXN0Kz0ocmVjdHNbaV0ueSpkZXN0cGl0Y2gpOwotCQkJCXNyYz0oKGNoYXIgKikodGhpcy0+c2NyZWVuLT5waXhlbHMpKStyZWN0c1tpXS54OwotCQkJCXNyYys9KHJlY3RzW2ldLnkqdGhpcy0+c2NyZWVuLT5waXRjaCk7Ci0JCQkJCi0vLyBUaGlzIGlzIHRoZSBmYXN0LCB3ZWxsIG5vdCB0b28gc2xvdywgcmVtYXBwaW5nIGNvZGUgZm9yIDMyYml0IGRpc3BsYXlzCi0KLQkJCQlmb3Ioaj1yZWN0c1tpXS5oO2o7LS1qKQotCQkJCXsKLQkJCQkJZGVzdGw9KFVpbnQzMiAqKWRlc3Q7Ci0KLQkJCQkJZm9yKGs9MDtrPHNyY3dpZHRoO2srKykKLQkJCQkJewotCQkJCQkJc3JjbD0oVWludDMyICopJlNETF9YUGl4ZWxzW3NyY1trXV07Ci0JCQkJCQkqZGVzdGw9KnNyY2w7Ci0JCQkJCQlkZXN0bCsrOwotCQkJCQl9Ci0JCQkJCXNyYys9dGhpcy0+c2NyZWVuLT5waXRjaDsKLQkJCQkJZGVzdCs9ZGVzdHBpdGNoOwotCQkJCX0KLQkJCX0KLQkJCVVuTG9ja0JpdE1hcChoYW5kbGUpOwotCQl9Ci0jZW5kaWYKLQl9Ci0JZWxzZSBpZihjdXN0b21yb3V0aW5lKQotCXsKLQkJdW5zaWduZWQgY2hhciAqYm1fYWRkcmVzczsKLQkJVWludDMyCWRlc3RwaXRjaDsKLQkJQVBUUiBoYW5kbGU7Ci0KLS8vCQlEKGJ1ZygiVXNpbmcgY3VzdG9tcm91dGluZSFcbiIpKTsKLQotCQlpZihoYW5kbGU9TG9ja0JpdE1hcFRhZ3MoU0RMX1Jhc3RQb3J0LT5CaXRNYXAsTEJNSV9CQVNFQUREUkVTUywoVUxPTkcpJmJtX2FkZHJlc3MsCi0JCQkJCQkJCUxCTUlfQllURVNQRVJST1csKFVMT05HKSZkZXN0cGl0Y2gsVEFHX0RPTkUpKQotCQl7Ci0JCQl1bnNpZ25lZCBjaGFyICpkZXN0YmFzZTsKLQkJCXJlZ2lzdGVyIGludCBqLHNyY3dpZHRoOwotCQkJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqc3JjLCpkZXN0OwotCi0vLyBBZ2dpdW5nbyBpbCBib3JkbyBkZWxsYSBmaW5lc3RyYSBzZSBzb25vIGZ1bGxzY3JlZW4uCi0JCQlpZihjdXJyZW50bHlfZnVsbHNjcmVlbikKLQkJCQlkZXN0YmFzZT1ibV9hZGRyZXNzOwotCQkJZWxzZQotCQkJCWRlc3RiYXNlPWJtX2FkZHJlc3MrKFNETF9XaW5kb3ctPlRvcEVkZ2UrU0RMX1dpbmRvdy0+Qm9yZGVyVG9wKSpkZXN0cGl0Y2grKFNETF9XaW5kb3ctPkJvcmRlckxlZnQrU0RMX1dpbmRvdy0+TGVmdEVkZ2UpKnRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCi0JCQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIAotCQkJewotCQkJCXNyY3dpZHRoPXJlY3RzW2ldLnc7Ci0KLQkJCQlpZiAoICFzcmN3aWR0aCApIHsgLyogQ2xpcHBlZD8gKi8KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZGVzdD1kZXN0YmFzZStyZWN0c1tpXS54KnRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCQkJCWRlc3QrPShyZWN0c1tpXS55KmRlc3RwaXRjaCk7Ci0JCQkJc3JjPSgoY2hhciAqKSh0aGlzLT5zY3JlZW4tPnBpeGVscykpK3JlY3RzW2ldLngqdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JCQkJc3JjKz0ocmVjdHNbaV0ueSp0aGlzLT5zY3JlZW4tPnBpdGNoKTsKLQkJCQkKLQkJCQlzcmN3aWR0aCo9dGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7Ci0KLS8vCQkJCUQoYnVnKCJSZWN0czogJWxkLCVsZCAlbGQsJWxkIFNyYzolbHggRGVzdDolbHhcbiIscmVjdHNbaV0ueCxyZWN0c1tpXS55LHJlY3RzW2ldLncscmVjdHNbaV0uaCxzcmMsZGVzdCkpOwotCi0JCQkJZm9yKGo9cmVjdHNbaV0uaDtqOy0taikKLQkJCQl7Ci0JCQkJCVNETF9tZW1jcHkoZGVzdCxzcmMsc3Jjd2lkdGgpOwotCQkJCQlzcmMrPXRoaXMtPnNjcmVlbi0+cGl0Y2g7Ci0JCQkJCWRlc3QrPWRlc3RwaXRjaDsKLQkJCQl9Ci0JCQl9Ci0JCQlVbkxvY2tCaXRNYXAoaGFuZGxlKTsKLS8vCQkJRChidWcoIlJlY3RibGl0IGFkZHI6ICVseCBwaXRjaDogJWxkIHJlY3RzOiVsZCBzcmNwdHI6ICVseCBzcmNwaXRjaDogJWxkXG4iLGJtX2FkZHJlc3MsZGVzdHBpdGNoLG51bXJlY3RzLHRoaXMtPnNjcmVlbi0+cGl4ZWxzLHRoaXMtPnNjcmVlbi0+cGl0Y2gpKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIHsKLQkJCWlmICggISByZWN0c1tpXS53ICkgeyAvKiBDbGlwcGVkPyAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJVVNFX1dQQSh0aGlzLT5zY3JlZW4tPnBpeGVscyxyZWN0c1tpXS54LCByZWN0c1tpXS55LHRoaXMtPnNjcmVlbi0+cGl0Y2gsCi0JCQkJCVNETF9SYXN0UG9ydCxTRExfV2luZG93LT5Cb3JkZXJMZWZ0K3JlY3RzW2ldLngsU0RMX1dpbmRvdy0+Qm9yZGVyVG9wK3JlY3RzW2ldLnksCi0JCQkJCXJlY3RzW2ldLncscmVjdHNbaV0uaCxmb3JtYXQpOwotCQl9Ci0JfQotfQotCi12b2lkIENHWF9SZWZyZXNoRGlzcGxheShfVEhJUykKLXsKLQlpbnQgZm9ybWF0LGN1c3RvbXJvdXRpbmU9MDsKLSNpZm5kZWYgVVNFX0NHWF9XUklURUxVVFBJWEVMCi0JaW50IGJwcDsKLSNlbmRpZgotCS8qIERvbid0IHJlZnJlc2ggYSBkaXNwbGF5IHRoYXQgZG9lc24ndCBoYXZlIGFuIGltYWdlIChsaWtlIEdMKSAqLwotCWlmICggISBTRExfWGltYWdlICkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYodGhpcy0+aGlkZGVuLT5zYW1lX2Zvcm1hdCAmJiAhdXNlX3BpY2Fzc285NikKLQl7Ci0JCWZvcm1hdD1SRUNURk1UX1JBVzsKLQl9Ci0JZWxzZSBzd2l0Y2godGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpCi0JewotCQljYXNlIDQ6Ci0JCQlmb3JtYXQ9UkVDVEZNVF9SR0JBOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWZvcm1hdD1SRUNURk1UX1JHQjsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQljdXN0b21yb3V0aW5lPTE7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotLy8JCQlEKGJ1Zygic29mdCBkZXB0aDogOCBoYXJkYnBwOiAlbGRcbiIsdGhpcy0+aGlkZGVuLT5kZXB0aCkpOwotCQkJaWYodGhpcy0+aGlkZGVuLT5kZXB0aD44KQotCQkJewotI2lmbmRlZiBVU0VfQ0dYX1dSSVRFTFVUUElYRUwKLQkJCQlpZih0aGlzLT5oaWRkZW4tPmRlcHRoPjMyKQotCQkJCQljdXN0b21yb3V0aW5lPTQ7Ci0JCQkJZWxzZSBpZih0aGlzLT5oaWRkZW4tPmRlcHRoPjE2KQotCQkJCXsKLQkJCQkJYnBwPXRoaXMtPmhpZGRlbi0+Qnl0ZXNQZXJQaXhlbDsgLy8gVGhhdCBvbmUgaXMgdGhlIG9ubHkgb25lIHRoYXQgbmVlZHMgYnBwCi0JCQkJCWN1c3RvbXJvdXRpbmU9MjsgLy8gVGhlIHNsb3cgb25lIQotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWN1c3RvbXJvdXRpbmU9MzsKLSNlbHNlCi0KLQkJCQljdXN0b21yb3V0aW5lPTI7Ci0jZW5kaWYKLS8vCQkJCWZvcm1hdD1SRUNURk1UX0xVVDg7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY3VzdG9tcm91dGluZT0xOwotCQkJYnJlYWs7Ci0KLQl9Ci0KLQkJLyogQ2hlY2sgZm9yIGVuZGlhbi1zd2FwcGVkIFggc2VydmVyLCBzd2FwIGlmIG5lY2Vzc2FyeSAqLwotCWlmICggc3dhcF9waXhlbHMgJiYKLQkgICAgICgodGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwlMikgPT0gMCkgKSB7Ci0JCUNHWF9Td2FwQWxsUGl4ZWxzKHRoaXMtPnNjcmVlbik7Ci0JCVVTRV9XUEEodGhpcy0+c2NyZWVuLT5waXhlbHMsMCwwLHRoaXMtPnNjcmVlbi0+cGl0Y2gsCi0JCQkJU0RMX1Jhc3RQb3J0LFNETF9XaW5kb3ctPkJvcmRlckxlZnQsU0RMX1dpbmRvdy0+Qm9yZGVyVG9wLAotCQkJCXRoaXMtPnNjcmVlbi0+dyx0aGlzLT5zY3JlZW4tPmgsZm9ybWF0KTsKLQkJQ0dYX1N3YXBBbGxQaXhlbHModGhpcy0+c2NyZWVuKTsKLQl9Ci0JZWxzZSBpZiAoY3VzdG9tcm91dGluZT09MikKLQl7Ci0jaWZkZWYgVVNFX0NHWF9XUklURUxVVFBJWEVMCi0JCVdMVVQodGhpcy0+c2NyZWVuLT5waXhlbHMsMCwwLHRoaXMtPnNjcmVlbi0+cGl0Y2gsCi0JCQkJCVNETF9SYXN0UG9ydCxTRExfWFBpeGVscyxTRExfV2luZG93LT5Cb3JkZXJMZWZ0LFNETF9XaW5kb3ctPkJvcmRlclRvcCwKLQkJCQkJdGhpcy0+c2NyZWVuLT53LHRoaXMtPnNjcmVlbi0+aCxDVEFCRk1UX1hSR0I4KTsKLSNlbHNlCi0JCXVuc2lnbmVkIGNoYXIgKmJtX2FkZHJlc3M7Ci0JCVVpbnQzMglkZXN0cGl0Y2g7Ci0JCUFQVFIgaGFuZGxlOwotCi0JCWlmKGhhbmRsZT1Mb2NrQml0TWFwVGFncyhTRExfUmFzdFBvcnQtPkJpdE1hcCxMQk1JX0JBU0VBRERSRVNTLChVTE9ORykmYm1fYWRkcmVzcywKLQkJCQkJCQkJTEJNSV9CWVRFU1BFUlJPVywoVUxPTkcpJmRlc3RwaXRjaCxUQUdfRE9ORSkpCi0JCXsKLQkJCXJlZ2lzdGVyIGludCBqLGssdDsKLQkJCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm1hc2ssKmRzdDsKLQkJCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnNyYywqZGVzdDsKLQotLy8gQWdnaXVuZ28gaWwgYm9yZG8gZGVsbGEgZmluZXN0cmEgc2Ugc29ubyBmdWxsc2NyZWVuLgotCQkJaWYoIWN1cnJlbnRseV9mdWxsc2NyZWVuKQotCQkJCWRlc3Q9Ym1fYWRkcmVzcysoU0RMX1dpbmRvdy0+VG9wRWRnZStTRExfV2luZG93LT5Cb3JkZXJUb3ApKmRlc3RwaXRjaCsoU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdCtTRExfV2luZG93LT5MZWZ0RWRnZSkqdGhpcy0+aGlkZGVuLT5CeXRlc1BlclBpeGVsOwotCQkJZWxzZQotCQkJCWRlc3Q9Ym1fYWRkcmVzczsKLQotCQkJc3JjPXRoaXMtPnNjcmVlbi0+cGl4ZWxzOwotCQkJCQotCQkJZm9yKGo9dGhpcy0+c2NyZWVuLT5oO2o7LS1qKQotCQkJewotCQkJCWRzdD1kZXN0OwotLy8gU0xPVyByb3V0aW5lLCB1c2VkIGZvciA4LT4yNCBiaXQgbWFwcGluZwotCQkJCWZvcihrPTA7azx0aGlzLT5zY3JlZW4tPnc7aysrKQotCQkJCXsKLQkJCQkJbWFzaz0odW5zaWduZWQgY2hhciAqKSgmU0RMX1hQaXhlbHNbc3JjW2tdXSk7Ci0JCQkJCWZvcih0PTA7dDxicHA7dCsrKQotCQkJCQl7Ci0JCQkJCQlkc3RbdF09bWFza1t0XTsKLQkJCQkJfQotCQkJCQlkc3QrPWJwcDsKLQkJCQl9Ci0JCQkJc3JjKz10aGlzLT5zY3JlZW4tPnBpdGNoOwotCQkJCWRlc3QrPWRlc3RwaXRjaDsKLQkJCX0KLQkJCVVuTG9ja0JpdE1hcChoYW5kbGUpOwotCQl9Ci0JfQotCWVsc2UgaWYgKGN1c3RvbXJvdXRpbmU9PTMpCi0JewotCQl1bnNpZ25lZCBjaGFyICpibV9hZGRyZXNzOwotCQlVaW50MzIJZGVzdHBpdGNoOwotCQlBUFRSIGhhbmRsZTsKLQotCQlpZihoYW5kbGU9TG9ja0JpdE1hcFRhZ3MoU0RMX1Jhc3RQb3J0LT5CaXRNYXAsTEJNSV9CQVNFQUREUkVTUywoVUxPTkcpJmJtX2FkZHJlc3MsCi0JCQkJCQkJCUxCTUlfQllURVNQRVJST1csKFVMT05HKSZkZXN0cGl0Y2gsVEFHX0RPTkUpKQotCQl7Ci0JCQlyZWdpc3RlciBpbnQgaixrOwotCQkJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqc3JjLCpkZXN0OwotCQkJcmVnaXN0ZXIgVWludDE2ICpkZXN0bCwqc3JjbDsKLQotCQkJaWYoIWN1cnJlbnRseV9mdWxsc2NyZWVuKQotCQkJCWRlc3Q9Ym1fYWRkcmVzcysoU0RMX1dpbmRvdy0+VG9wRWRnZStTRExfV2luZG93LT5Cb3JkZXJUb3ApKmRlc3RwaXRjaCsoU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdCtTRExfV2luZG93LT5MZWZ0RWRnZSkqdGhpcy0+aGlkZGVuLT5CeXRlc1BlclBpeGVsOwotCQkJZWxzZQotCQkJCWRlc3Q9Ym1fYWRkcmVzczsKLQotCQkJc3JjPXRoaXMtPnNjcmVlbi0+cGl4ZWxzOwotCQkJCQotLy8gVGhpcyBpcyB0aGUgZmFzdCwgd2VsbCBub3QgdG9vIHNsb3csIHJlbWFwcGluZyBjb2RlIGZvciAxNmJpdCBkaXNwbGF5cwotCi0JCQlmb3Ioaj10aGlzLT5zY3JlZW4tPmg7ajstLWopCi0JCQl7Ci0JCQkJZGVzdGw9KFVpbnQxNiAqKWRlc3Q7Ci0KLQkJCQlmb3Ioaz0wO2s8dGhpcy0+c2NyZWVuLT53O2srKykKLQkJCQl7Ci0JCQkJCXNyY2w9KFVpbnQxNiAqKSZTRExfWFBpeGVsc1tzcmNba11dOwotCQkJCQkqZGVzdGw9KnNyY2w7Ci0JCQkJCWRlc3RsKys7Ci0JCQkJfQotCQkJCXNyYys9dGhpcy0+c2NyZWVuLT5waXRjaDsKLQkJCQlkZXN0Kz1kZXN0cGl0Y2g7Ci0JCQl9Ci0JCQlVbkxvY2tCaXRNYXAoaGFuZGxlKTsKLQkJfQotCX0KLQllbHNlIGlmIChjdXN0b21yb3V0aW5lPT00KQotCXsKLQkJdW5zaWduZWQgY2hhciAqYm1fYWRkcmVzczsKLQkJVWludDMyCWRlc3RwaXRjaDsKLQkJQVBUUiBoYW5kbGU7Ci0KLQkJaWYoaGFuZGxlPUxvY2tCaXRNYXBUYWdzKFNETF9SYXN0UG9ydC0+Qml0TWFwLExCTUlfQkFTRUFERFJFU1MsKFVMT05HKSZibV9hZGRyZXNzLAotCQkJCQkJCQlMQk1JX0JZVEVTUEVSUk9XLChVTE9ORykmZGVzdHBpdGNoLFRBR19ET05FKSkKLQkJewotCQkJcmVnaXN0ZXIgaW50IGosazsKLQkJCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnNyYywqZGVzdDsKLQkJCXJlZ2lzdGVyIFVpbnQzMiAqZGVzdGwsKnNyY2w7Ci0KLQkJCWlmKCFjdXJyZW50bHlfZnVsbHNjcmVlbikKLQkJCQlkZXN0PWJtX2FkZHJlc3MrKFNETF9XaW5kb3ctPlRvcEVkZ2UrU0RMX1dpbmRvdy0+Qm9yZGVyVG9wKSpkZXN0cGl0Y2grKFNETF9XaW5kb3ctPkJvcmRlckxlZnQrU0RMX1dpbmRvdy0+TGVmdEVkZ2UpKnRoaXMtPmhpZGRlbi0+Qnl0ZXNQZXJQaXhlbDsKLQkJCWVsc2UKLQkJCQlkZXN0PWJtX2FkZHJlc3M7Ci0KLQkJCXNyYz10aGlzLT5zY3JlZW4tPnBpeGVsczsKLQkJCQkKLS8vIFRoaXMgaXMgdGhlIGZhc3QsIHdlbGwgbm90IHRvbyBzbG93LCByZW1hcHBpbmcgY29kZSBmb3IgMzJiaXQgZGlzcGxheXMKLQotCQkJZm9yKGo9dGhpcy0+c2NyZWVuLT5oO2o7LS1qKQotCQkJewotCQkJCWRlc3RsPShVaW50MzIgKilkZXN0OwotCi0JCQkJZm9yKGs9MDtrPHRoaXMtPnNjcmVlbi0+dztrKyspCi0JCQkJewotCQkJCQlzcmNsPShVaW50MzIgKikmU0RMX1hQaXhlbHNbc3JjW2tdXTsKLQkJCQkJKmRlc3RsPSpzcmNsOwotCQkJCQlkZXN0bCsrOwotCQkJCX0KLQkJCQlzcmMrPXRoaXMtPnNjcmVlbi0+cGl0Y2g7Ci0JCQkJZGVzdCs9ZGVzdHBpdGNoOwotCQkJfQotCQkJVW5Mb2NrQml0TWFwKGhhbmRsZSk7Ci0JCX0KLSNlbmRpZgotCX0KLQllbHNlIGlmKGN1c3RvbXJvdXRpbmUpCi0JewotCQl1bnNpZ25lZCBjaGFyICpibV9hZGRyZXNzOwotCQlVaW50MzIJZGVzdHBpdGNoOwotCQlBUFRSIGhhbmRsZTsKLQotCQlpZihoYW5kbGU9TG9ja0JpdE1hcFRhZ3MoU0RMX1Jhc3RQb3J0LT5CaXRNYXAsCi0JCQkJCUxCTUlfQkFTRUFERFJFU1MsKFVMT05HKSZibV9hZGRyZXNzLAotCQkJCQlMQk1JX0JZVEVTUEVSUk9XLChVTE9ORykmZGVzdHBpdGNoLFRBR19ET05FKSkKLQkJewotCQkJcmVnaXN0ZXIgaW50IGo7Ci0JCQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzcmMsKmRlc3Q7Ci0KLQkJCWlmKCFjdXJyZW50bHlfZnVsbHNjcmVlbikKLQkJCQlkZXN0PWJtX2FkZHJlc3MrKFNETF9XaW5kb3ctPlRvcEVkZ2UrU0RMX1dpbmRvdy0+Qm9yZGVyVG9wKSpkZXN0cGl0Y2grKFNETF9XaW5kb3ctPkJvcmRlckxlZnQrU0RMX1dpbmRvdy0+TGVmdEVkZ2UpKnRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCQkJZWxzZQotCQkJCWRlc3Q9Ym1fYWRkcmVzczsKLQotCQkJc3JjPXRoaXMtPnNjcmVlbi0+cGl4ZWxzOwotCQkJCQotLy8JCQlEKGJ1ZygiYWRkcjogJWx4IHBpdGNoOiAlbGQgc3JjOiVseCBzcmNwaXRjaDogJWxkXG4iLGRlc3QsZGVzdHBpdGNoLHRoaXMtPnNjcmVlbi0+cGl4ZWxzLHRoaXMtPnNjcmVlbi0+cGl0Y2gpKTsKLQotCQkJaWYodGhpcy0+c2NyZWVuLT5waXRjaD09ZGVzdHBpdGNoKQotCQkJewotCQkJCVNETF9tZW1jcHkoZGVzdCxzcmMsdGhpcy0+c2NyZWVuLT5waXRjaCp0aGlzLT5zY3JlZW4tPmgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZvcihqPXRoaXMtPnNjcmVlbi0+aDtqOy0taikKLQkJCQl7Ci0JCQkJCVNETF9tZW1jcHkoZGVzdCxzcmMsdGhpcy0+c2NyZWVuLT5waXRjaCk7Ci0JCQkJCXNyYys9dGhpcy0+c2NyZWVuLT5waXRjaDsKLQkJCQkJZGVzdCs9ZGVzdHBpdGNoOwotCQkJCX0KLQkJCX0KLQotCQkJVW5Mb2NrQml0TWFwKGhhbmRsZSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJVVNFX1dQQSh0aGlzLT5zY3JlZW4tPnBpeGVscywwLDAsdGhpcy0+c2NyZWVuLT5waXRjaCwKLQkJCQlTRExfUmFzdFBvcnQsU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdCxTRExfV2luZG93LT5Cb3JkZXJUb3AsCi0JCQkJdGhpcy0+c2NyZWVuLT53LHRoaXMtPnNjcmVlbi0+aCxmb3JtYXQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4aW1hZ2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4aW1hZ2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGRjN2E0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneGltYWdlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX2NneHZpZGVvLmgiCi0KLWV4dGVybiBpbnQgQ0dYX1NldHVwSW1hZ2UoX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4pOwotZXh0ZXJuIHZvaWQgQ0dYX0Rlc3Ryb3lJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbik7Ci1leHRlcm4gaW50IENHWF9SZXNpemVJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbiwgVWludDMyIGZsYWdzKTsKLQotZXh0ZXJuIGludCBDR1hfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLWV4dGVybiB2b2lkIENHWF9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1leHRlcm4gaW50IENHWF9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1leHRlcm4gdm9pZCBDR1hfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1leHRlcm4gaW50IENHWF9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0KLWV4dGVybiB2b2lkIENHWF9SZWZyZXNoRGlzcGxheShfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9jZ3htb2Rlcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4bW9kZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmN2RiZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9jZ3htb2Rlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBVdGlsaXRpZXMgZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIFggZGlzcGxheSBtb2RlICovCi0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9jZ3h2aWRlby5oIgotI2luY2x1ZGUgIlNETF9jZ3h3bV9jLmgiCi0jaW5jbHVkZSAiU0RMX2NneG1vZGVzX2MuaCIKLQotI2RlZmluZSBDR1hfREVCVUcKLQotc3RhdGljIHZvaWQgc2V0X2Jlc3RfcmVzb2x1dGlvbihfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotCVVpbnQzMiBpZG9rOwotCWludCBkZXB0aD04OwotCi0JaWYoU0RMX0Rpc3BsYXkpCi0JCWRlcHRoPUdldEN5YmVyTWFwQXR0cihTRExfRGlzcGxheS0+UmFzdFBvcnQuQml0TWFwLENZQlJNQVRUUl9ERVBUSCk7Ci0KLQlpZG9rPUJlc3RDTW9kZUlEVGFncyhDWUJSQklEVEdfTm9taW5hbFdpZHRoLHdpZHRoLAotCQkJCUNZQlJCSURUR19Ob21pbmFsSGVpZ2h0LGhlaWdodCwKLQkJCQlDWUJSQklEVEdfRGVwdGgsZGVwdGgsCi0JCQkJVEFHX0RPTkUpOwotCi0JaWYoaWRvayE9SU5WQUxJRF9JRCkKLQl7Ci0JCWlmKFNETF9EaXNwbGF5KQotCQl7Ci0JCQlpZihjdXJyZW50bHlfZnVsbHNjcmVlbikKLQkJCQlDbG9zZVNjcmVlbihTRExfRGlzcGxheSk7Ci0JCQllbHNlCi0JCQkJVW5sb2NrUHViU2NyZWVuKE5VTEwsU0RMX0Rpc3BsYXkpOwotCQl9Ci0JCVNETF9EaXNwbGF5PUdGWF9EaXNwbGF5PU9wZW5TY3JlZW5UYWdzKE5VTEwsU0FfV2lkdGgsd2lkdGgsU0FfSGVpZ2h0LGhlaWdodCwKLQkJCQkJCQkJCQkJU0FfRGVwdGgsZGVwdGgsU0FfRGlzcGxheUlELGlkb2ssCi0JCQkJCQkJCQkJCVNBX1Nob3dUaXRsZSxGQUxTRSwKLQkJCQkJCQkJCQkJVEFHX0RPTkUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZ2V0X3JlYWxfcmVzb2x1dGlvbihfVEhJUywgaW50KiB3LCBpbnQqIGgpCi17Ci0gICAgKncgPSAvKlNETF9EaXNwbGF5LT5XaWR0aCovIFNETF9XaW5kb3ctPldpZHRoLVNETF9XaW5kb3ctPkJvcmRlckxlZnQtU0RMX1dpbmRvdy0+Qm9yZGVyUmlnaHQ7Ci0gICAgKmggPSAvKlNETF9EaXNwbGF5LT5IZWlnaHQqLyBTRExfV2luZG93LT5IZWlnaHQtU0RMX1dpbmRvdy0+Qm9yZGVyQm90dG9tLVNETF9XaW5kb3ctPkJvcmRlclRvcDsKLX0KLQotc3RhdGljIHZvaWQgbW92ZV9jdXJzb3JfdG8oX1RISVMsIGludCB4LCBpbnQgeSkKLXsKLS8qICAgIFhXYXJwUG9pbnRlcihTRExfRGlzcGxheSwgTm9uZSwgU0RMX1Jvb3QsIDAsIDAsIDAsIDAsIHgsIHkpOyAqLwotCi0vKiBEQSBGQVJFISAqLwotfQotCi1zdGF0aWMgdm9pZCBhZGRfdmlzdWFsKF9USElTLCBpbnQgZGVwdGgsIGludCBjbGFzcykKLXsKLQlVaW50MzIgdElEOwotCi0JdElEPUJlc3RDTW9kZUlEVGFncyhDWUJSQklEVEdfRGVwdGgsZGVwdGgsCi0JCQkJCQlDWUJSQklEVEdfTm9taW5hbFdpZHRoLDY0MCwKLQkJCQkJCUNZQlJCSURUR19Ob21pbmFsSGVpZ2h0LDQ4MCwKLQkJCQkJCVRBR19ET05FKTsKLQotCWlmKHRJRCE9SU5WQUxJRF9JRCkKLQl7Ci0JCWludCBuID0gdGhpcy0+aGlkZGVuLT5udmlzdWFsczsKLQotCQl0aGlzLT5oaWRkZW4tPnZpc3VhbHNbbl0uZGVwdGggPSBkZXB0aDsKLQkJdGhpcy0+aGlkZGVuLT52aXN1YWxzW25dLnZpc3VhbCA9IHRJRDsKLQkJdGhpcy0+aGlkZGVuLT52aXN1YWxzW25dLmJwcCA9IEdldEN5YmVySURBdHRyKENZQlJJREFUVFJfQlBQSVgsdElEKTsKLQkJdGhpcy0+aGlkZGVuLT5udmlzdWFscysrOwotCX0KLX0KLQotI2RlZmluZSBUcnVlQ29sb3IgMQotI2RlZmluZSBQc2V1ZG9Db2xvciAyCi0KLWludCBDR1hfR2V0VmlkZW9Nb2RlcyhfVEhJUykKLXsKLSAgICBpbnQgaTsKLQlVTE9ORyBuZXh0aWQ7Ci0JaW50IG5tb2Rlcz0wOwotCi0JU0RMX21vZGVsaXN0PU5VTEw7Ci0KLQluZXh0aWQ9TmV4dERpc3BsYXlJbmZvKElOVkFMSURfSUQpOwotCi0Jd2hpbGUobmV4dGlkIT1JTlZBTElEX0lEKQotCXsKLQkJaWYoSXNDeWJlck1vZGVJRChuZXh0aWQpKQotCQl7Ci0JCQlEaXNwbGF5SW5mb0hhbmRsZSBoOwotCi0JCQlpZihoPUZpbmREaXNwbGF5SW5mbyhuZXh0aWQpKQotCQkJewotCQkJCXN0cnVjdCBEaW1lbnNpb25JbmZvIGluZm87Ci0KLQkJCQlpZihHZXREaXNwbGF5SW5mb0RhdGEoaCwoY2hhciAqKSZpbmZvLHNpemVvZihzdHJ1Y3QgRGltZW5zaW9uSW5mbyksRFRBR19ESU1TLE5VTEwpKQotCQkJCXsKLQkJCQkJaW50IG9rPTA7Ci0KLQkJCQkJZm9yKGk9MDtpPG5tb2RlcztpKyspCi0JCQkJCXsKLQkJCQkJCWlmKAlTRExfbW9kZWxpc3RbaV0tPncgPT0gKGluZm8uTm9taW5hbC5NYXhYKzEpICYmCi0JCQkJCQkJU0RMX21vZGVsaXN0W2ldLT5oID09IChpbmZvLk5vbWluYWwuTWF4WSsxKSApCi0JCQkJCQkJb2s9MTsKLQkJCQkJfQotCi0JCQkJCWlmKCFvaykKLQkJCQkJewotCQkJCQkJbm1vZGVzKys7Ci0KLQkJCQkJCVNETF9tb2RlbGlzdCA9IChTRExfUmVjdCAqKilTRExfcmVhbGxvYyhTRExfbW9kZWxpc3QsKG5tb2RlcysxKSpzaXplb2YoU0RMX1JlY3QgKikpOwotCQkJCQkJU0RMX21vZGVsaXN0W25tb2Rlc109TlVMTDsKLQotCQkJCQkJaWYgKCBTRExfbW9kZWxpc3QgKQotCQkJCQkJewotCQkJCQkJCVNETF9tb2RlbGlzdFtubW9kZXMtMV0gPSAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpOwotCi0JCQkJCQkJaWYgKCBTRExfbW9kZWxpc3Rbbm1vZGVzLTFdID09IE5VTEwgKQotCQkJCQkJCQlicmVhazsKLQotCQkJCQkJCVNETF9tb2RlbGlzdFtubW9kZXMtMV0tPnggPSAwOwotCQkJCQkJCVNETF9tb2RlbGlzdFtubW9kZXMtMV0tPnkgPSAwOwotCQkJCQkJCVNETF9tb2RlbGlzdFtubW9kZXMtMV0tPncgPSBpbmZvLk5vbWluYWwuTWF4WCsxOwotCQkJCQkJCVNETF9tb2RlbGlzdFtubW9kZXMtMV0tPmggPSBpbmZvLk5vbWluYWwuTWF4WSsxOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW5leHRpZD1OZXh0RGlzcGxheUluZm8obmV4dGlkKTsKLQl9Ci0KLQotCXRoaXMtPmhpZGRlbi0+bnZpc3VhbHMgPSAwOwotCS8qIFNlYXJjaCBmb3IgdGhlIHZpc3VhbHMgaW4gZGVlcGVzdC1maXJzdCBvcmRlciwgc28gdGhhdCB0aGUgZmlyc3QKLQkgICB3aWxsIGJlIHRoZSByaWNoZXN0IG9uZSAqLwotCWFkZF92aXN1YWwodGhpcywgMzIsIFRydWVDb2xvcik7Ci0JYWRkX3Zpc3VhbCh0aGlzLCAyNCwgVHJ1ZUNvbG9yKTsKLQlhZGRfdmlzdWFsKHRoaXMsIDE2LCBUcnVlQ29sb3IpOwotCWFkZF92aXN1YWwodGhpcywgMTUsIFRydWVDb2xvcik7Ci0JYWRkX3Zpc3VhbCh0aGlzLCA4LCBQc2V1ZG9Db2xvcik7Ci0KLQlpZih0aGlzLT5oaWRkZW4tPm52aXN1YWxzID09IDApIHsKLQkgICAgU0RMX1NldEVycm9yKCJGb3VuZCBubyBzdWZmaWNpZW50bHkgY2FwYWJsZSBDR1ggdmlzdWFscyIpOwotCQkgICAgcmV0dXJuIC0xOwotCX0KLQotICAgIGlmICggU0RMX21vZGVsaXN0ID09IE5VTEwgKSB7Ci0gICAgICAgIFNETF9tb2RlbGlzdCA9IChTRExfUmVjdCAqKilTRExfbWFsbG9jKCgxKzEpKnNpemVvZihTRExfUmVjdCAqKSk7Ci0gICAgICAgIGkgPSAwOwotICAgICAgICBpZiAoIFNETF9tb2RlbGlzdCApIHsKLSAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7Ci0gICAgICAgICAgICBpZiAoIFNETF9tb2RlbGlzdFtpXSApIHsKLSAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPnggPSAwOwotICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+eSA9IDA7Ci0gICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldLT53ID0gU0RMX0Rpc3BsYXktPldpZHRoOwotICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+aCA9IFNETF9EaXNwbGF5LT5IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgKytpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEQoIGlmICggU0RMX21vZGVsaXN0ICkgewotICAgICAgICBidWcoIkNHWCB2aWRlbyBtb2RlIGxpc3Q6ICglbGQpXG4iLG5tb2Rlcyk7Ci0gICAgICAgIGZvciAoIGk9MDsgU0RMX21vZGVsaXN0W2ldOyArK2kgKSB7Ci0gICAgICAgICAgICBidWcoICJcdCVsZCB4ICVsZFxuIiwKLSAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPncsIFNETF9tb2RlbGlzdFtpXS0+aCk7Ci0gICAgICAgIH0KLSAgICAJfQotICAgICk7Ci0KLSAgICBEKCAgeyBidWcoIkNHWCB2aXN1YWxzIGxpc3Q6ICglbGQpXG4iLHRoaXMtPmhpZGRlbi0+bnZpc3VhbHMpOwotCi0JZm9yKGk9MDtpPHRoaXMtPmhpZGRlbi0+bnZpc3VhbHM7aSsrKQotCQlidWcoIlx0JWx4IC0gZGVwdGg6ICVsZCBicHA6ICVsZFxuIix0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0udmlzdWFsLHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5kZXB0aCx0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uYnBwKTsKLQl9Ci0gICAgKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IENHWF9TdXBwb3J0ZWRWaXN1YWwoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0KQotewotICAgIGludCBpOwotICAgIGZvcihpID0gMDsgaSA8IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHM7IGkrKykKLQl7Ci0JCWlmKHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5kZXB0aCA9PSBmb3JtYXQtPkJpdHNQZXJQaXhlbCkgLy8gRXJhIGJwcAotCQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1TRExfUmVjdCAqKkNHWF9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCi17Ci0gICAgaWYgKCBDR1hfU3VwcG9ydGVkVmlzdWFsKHRoaXMsIGZvcm1hdCkgKSB7Ci0gICAgICAgIGlmICggZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKLSAgICAgICAgICAgIHJldHVybihTRExfbW9kZWxpc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuKChTRExfUmVjdCAqKiktMSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4oKFNETF9SZWN0ICoqKTApOwotICAgIH0KLX0KLQotdm9pZCBDR1hfRnJlZVZpZGVvTW9kZXMoX1RISVMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIFNETF9tb2RlbGlzdCApIHsKLSAgICAgICAgZm9yICggaT0wOyBTRExfbW9kZWxpc3RbaV07ICsraSApIHsKLSAgICAgICAgICAgIFNETF9mcmVlKFNETF9tb2RlbGlzdFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgU0RMX2ZyZWUoU0RMX21vZGVsaXN0KTsKLSAgICAgICAgU0RMX21vZGVsaXN0ID0gTlVMTDsKLSAgICB9Ci19Ci0KLWludCBDR1hfUmVzaXplRnVsbFNjcmVlbihfVEhJUykKLXsKLSAgICBpbnQgeCwgeTsKLSAgICBpbnQgcmVhbF93LCByZWFsX2g7Ci0KLSAgICBpZiAoIGN1cnJlbnRseV9mdWxsc2NyZWVuICkgewotLyogUGVyIG9yYSBub24gZmFjY2lvIG51bGxhIHF1aSAqLwotICAgIH0KLSAgICByZXR1cm4oMSk7Ci19Ci0KLXZvaWQgX1F1ZXVlRW50ZXJGdWxsU2NyZWVuKF9USElTKQotewotfQotCi1pbnQgQ0dYX0VudGVyRnVsbFNjcmVlbihfVEhJUykKLXsKLSAgICBpbnQgb2theTsKLQkgVWludDMyIHNhdmVkX2ZsYWdzOwotCi0gICAgb2theSA9IDE7Ci0gICAgc2F2ZWRfZmxhZ3MgPSB0aGlzLT5zY3JlZW4tPmZsYWdzOwotCi0gICAgaWYgKCAhIGN1cnJlbnRseV9mdWxsc2NyZWVuICkKLQl7Ci0gICAgICAgIGludCByZWFsX3csIHJlYWxfaDsKLQotICAgICAgICAvKiBNYXAgdGhlIGZ1bGxzY3JlZW4gd2luZG93IHRvIGJsYW5rIHRoZSBzY3JlZW4gKi8KLSAgICAgICAgZ2V0X3JlYWxfcmVzb2x1dGlvbih0aGlzLCAmcmVhbF93LCAmcmVhbF9oKTsKLQotCQlDR1hfRGVzdHJveVdpbmRvdyh0aGlzLHRoaXMtPnNjcmVlbik7Ci0JCXNldF9iZXN0X3Jlc29sdXRpb24odGhpcywgcmVhbF93LHJlYWxfaCk7Ci0KLSAgICAgICAgY3VycmVudGx5X2Z1bGxzY3JlZW4gPSAxOwotCQkgIHRoaXMtPnNjcmVlbi0+ZmxhZ3MgPSBzYXZlZF9mbGFnczsKLQotCQkgIENHWF9DcmVhdGVXaW5kb3codGhpcyx0aGlzLT5zY3JlZW4scmVhbF93LHJlYWxfaCxHZXRDeWJlck1hcEF0dHIoU0RMX0Rpc3BsYXktPlJhc3RQb3J0LkJpdE1hcCxDWUJSTUFUVFJfREVQVEgpLHRoaXMtPnNjcmVlbi0+ZmxhZ3MpOwotCi0gICAgICAgIC8qIFNldCB0aGUgbmV3IHJlc29sdXRpb24gKi8KLSAgICAgICAgb2theSA9IENHWF9SZXNpemVGdWxsU2NyZWVuKHRoaXMpOwotICAgICAgICBpZiAoICEgb2theSApIHsKLSAgICAgICAgICAgIENHWF9MZWF2ZUZ1bGxTY3JlZW4odGhpcyk7Ci0gICAgICAgIH0KLQkvKiBTZXQgdGhlIGNvbG9ybWFwICovCi0vKgotCQlpZiAoIFNETF9YQ29sb3JNYXAgKSB7Ci0JCQlYSW5zdGFsbENvbG9ybWFwKFNETF9EaXNwbGF5LCBTRExfWENvbG9yTWFwKTsKLQkJfQotKi8KLSAgICB9Ci0vLyAgICBDR1hfR3JhYklucHV0Tm9Mb2NrKHRoaXMsIHRoaXMtPmlucHV0X2dyYWIgfCBTRExfR1JBQl9GVUxMU0NSRUVOKTsKLSAgICByZXR1cm4ob2theSk7Ci19Ci0KLWludCBDR1hfTGVhdmVGdWxsU2NyZWVuKF9USElTKQotewotICAgIGlmICggY3VycmVudGx5X2Z1bGxzY3JlZW4gKSB7Ci0JCWludCB3aWR0aCxoZWlnaHQ7Ci0JCWlmICggU0RMX1dpbmRvdyApIHsKLQkJCUNsb3NlV2luZG93KFNETF9XaW5kb3cpOwotCQkJU0RMX1dpbmRvdz1OVUxMOwotCQl9Ci0JCUNsb3NlU2NyZWVuKFNETF9EaXNwbGF5KTsKLQotCQlHRlhfRGlzcGxheT1TRExfRGlzcGxheT1Mb2NrUHViU2NyZWVuKE5VTEwpOwotCi0JICAgICAgICBjdXJyZW50bHlfZnVsbHNjcmVlbiA9IDA7Ci0KLQkJQ0dYX0NyZWF0ZVdpbmRvdyh0aGlzLHRoaXMtPnNjcmVlbix0aGlzLT5zY3JlZW4tPncsdGhpcy0+c2NyZWVuLT5oLEdldEN5YmVyTWFwQXR0cihTRExfRGlzcGxheS0+UmFzdFBvcnQuQml0TWFwLENZQlJNQVRUUl9ERVBUSCksdGhpcy0+c2NyZWVuLT5mbGFncyk7Ci0JCUNHWF9SZXNpemVJbWFnZSh0aGlzLHRoaXMtPnNjcmVlbiwwTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4bW9kZXNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4bW9kZXNfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzZmNDg1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneG1vZGVzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBVdGlsaXRpZXMgZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIFggZGlzcGxheSBtb2RlICovCi0KLSNpbmNsdWRlICJTRExfY2d4dmlkZW8uaCIKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gZ3JhYiB0aGUga2V5Ym9hcmQgaW4gZnVsbHNjcmVlbiBtb2RlLgotICAgSWYgeW91IGRvIG5vdCBkZWZpbmUgdGhpcywgU0RMIHdpbGwgcmV0dXJuIGZyb20gU0RMX1NldFZpZGVvTW9kZSgpCi0gICBpbW1lZGlhdGVseSwgYnV0IHdpbGwgbm90IGFjdHVhbGx5IGdvIGZ1bGxzY3JlZW4gdW50aWwgdGhlIHdpbmRvdwotICAgbWFuYWdlciBpcyBpZGxlLgotKi8KLSNkZWZpbmUgR1JBQl9GVUxMU0NSRUVOCi0KLWV4dGVybiBpbnQgQ0dYX0dldFZpZGVvTW9kZXMoX1RISVMpOwotZXh0ZXJuIFNETF9SZWN0ICoqQ0dYX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7Ci1leHRlcm4gdm9pZCBDR1hfRnJlZVZpZGVvTW9kZXMoX1RISVMpOwotZXh0ZXJuIGludCBDR1hfUmVzaXplRnVsbFNjcmVlbihfVEhJUyk7Ci0vKgotZXh0ZXJuIHZvaWQgQ0dYX1dhaXRNYXBwZWQoX1RISVMsIFdpbmRvdyB3aW4pOwotZXh0ZXJuIHZvaWQgQ0dYX1dhaXRVbm1hcHBlZChfVEhJUywgV2luZG93IHdpbik7Ci1leHRlcm4gdm9pZCBDR1hfUXVldWVFbnRlckZ1bGxTY3JlZW4oX1RISVMpOwotKi8KLWV4dGVybiBpbnQgQ0dYX0VudGVyRnVsbFNjcmVlbihfVEhJUyk7Ci1leHRlcm4gaW50IENHWF9MZWF2ZUZ1bGxTY3JlZW4oX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4dmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneHZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDY3NDYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4dmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDEzNzUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gKiBDR1ggYmFzZWQgU0RMIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBieSBHYWJyaWVsZSBHcmVjbwotICogZ2FicmllbGUuZ3JlY29AYXJ1YmEuaXQKLSAqLwotCi0jaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX2NneGdsX2MuaCIKLSNpbmNsdWRlICJTRExfY2d4dmlkZW8uaCIKLSNpbmNsdWRlICJTRExfY2d4d21fYy5oIgotI2luY2x1ZGUgIlNETF9hbWlnYW1vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfYW1pZ2FldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9jZ3htb2Rlc19jLmgiCi0jaW5jbHVkZSAiU0RMX2NneGltYWdlX2MuaCIKLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IENHWF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1N1cmZhY2UgKkNHWF9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgaW50IENHWF9Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgb24pOwotc3RhdGljIHZvaWQgQ0dYX1VwZGF0ZU1vdXNlKF9USElTKTsKLXN0YXRpYyBpbnQgQ0dYX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgdm9pZCBDR1hfVmlkZW9RdWl0KF9USElTKTsKLQotLyogQ0dYIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCi0KLXN0cnVjdCBMaWJyYXJ5ICpDeWJlckdmeEJhc2U9TlVMTDsKLXN0cnVjdCBJbnR1aXRpb25CYXNlICpJbnR1aXRpb25CYXNlPU5VTEw7Ci1zdHJ1Y3QgR2Z4QmFzZSAqR2Z4QmFzZT1OVUxMOwotCi1pbnQgQ0dYX1NldEdhbW1hKF9USElTLCBmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlKQotewotICAgIFNETF9TZXRFcnJvcigiR2FtbWEgY29ycmVjdGlvbiBub3Qgc3VwcG9ydGVkIik7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1pbnQgQ0dYX0dldEdhbW1hKF9USElTLCBmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlKQotewotICAgIFNETF9TZXRFcnJvcigiR2FtbWEgY29ycmVjdGlvbiBub3Qgc3VwcG9ydGVkIik7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1pbnQgQ0dYX1NldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKQotewotI2lmIDAKLQlJbnQgaSwgbmNvbG9yczsKLQlYQ29sb3IgeGNtYXBbMjU2XTsKLQotCS8qIFNlZSBpZiBhY3R1YWxseSBzZXR0aW5nIHRoZSBnYW1tYSBpcyBzdXBwb3J0ZWQgKi8KLQlpZiAoIFNETF9WaXN1YWwtPmNsYXNzICE9IERpcmVjdENvbG9yICkgewotCSAgICBTRExfU2V0RXJyb3IoIkdhbW1hIGNvcnJlY3Rpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHZpc3VhbCIpOwotCSAgICByZXR1cm4oLTEpOwotCX0KLQotCS8qIENhbGN1bGF0ZSB0aGUgYXBwcm9wcmlhdGUgcGFsZXR0ZSBmb3IgdGhlIGdpdmVuIGdhbW1hIHJhbXAgKi8KLQluY29sb3JzID0gU0RMX1Zpc3VhbC0+bWFwX2VudHJpZXM7Ci0JZm9yICggaT0wOyBpPG5jb2xvcnM7ICsraSApIHsKLQkJVWludDggYyA9ICgyNTYgKiBpIC8gbmNvbG9ycyk7Ci0JCXhjbWFwW2ldLnBpeGVsID0gU0RMX01hcFJHQih0aGlzLT5zY3JlZW4tPmZvcm1hdCwgYywgYywgYyk7Ci0JCXhjbWFwW2ldLnJlZCAgID0gcmFtcFswKjI1NitjXTsKLQkJeGNtYXBbaV0uZ3JlZW4gPSByYW1wWzEqMjU2K2NdOwotCQl4Y21hcFtpXS5ibHVlICA9IHJhbXBbMioyNTYrY107Ci0JCXhjbWFwW2ldLmZsYWdzID0gKERvUmVkfERvR3JlZW58RG9CbHVlKTsKLQl9Ci0JWFN0b3JlQ29sb3JzKEdGWF9EaXNwbGF5LCBTRExfWENvbG9yTWFwLCB4Y21hcCwgbmNvbG9ycyk7Ci0JWFN5bmMoR0ZYX0Rpc3BsYXksIEZhbHNlKTsKLQotCXJldHVybigwKTsKLQotI2Vsc2UKLSAgICBTRExfU2V0RXJyb3IoIkdhbW1hIGNvcnJlY3Rpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHZpc3VhbCIpOwotICAgIHJldHVybigtMSk7Ci0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBEZXN0cm95U2NyZWVuKF9USElTKQotewotICAJaWYoY3VycmVudGx5X2Z1bGxzY3JlZW4pCi0JewotCQlpZih0aGlzLT5oaWRkZW4tPmRidWZmZXIpCi0JCXsKLQkJCWV4dGVybiBzdHJ1Y3QgTXNnUG9ydCAqc2FmZXBvcnQsKmRpc3Bwb3J0OwotCi0JCQl0aGlzLT5oaWRkZW4tPmRidWZmZXI9MDsKLQotCQkJaWYoc2FmZXBvcnQpCi0JCQl7Ci0JCQkJd2hpbGUoR2V0TXNnKHNhZmVwb3J0KSE9TlVMTCk7Ci0JCQkJRGVsZXRlTXNnUG9ydChzYWZlcG9ydCk7Ci0JCQl9Ci0JCQlpZihkaXNwcG9ydCkKLQkJCXsKLQkJCQl3aGlsZShHZXRNc2coZGlzcHBvcnQpIT1OVUxMKTsKLQkJCQlEZWxldGVNc2dQb3J0KGRpc3Bwb3J0KTsKLQkJCX0KLQotCQkJdGhpcy0+aGlkZGVuLT5TQlswXS0+c2JfREJ1ZkluZm8tPmRiaV9TYWZlTWVzc2FnZS5tbl9SZXBseVBvcnQ9dGhpcy0+aGlkZGVuLT5TQlswXS0+c2JfREJ1ZkluZm8tPmRiaV9EaXNwTWVzc2FnZS5tbl9SZXBseVBvcnQ9TlVMTDsKLQkJCXRoaXMtPmhpZGRlbi0+U0JbMV0tPnNiX0RCdWZJbmZvLT5kYmlfU2FmZU1lc3NhZ2UubW5fUmVwbHlQb3J0PXRoaXMtPmhpZGRlbi0+U0JbMV0tPnNiX0RCdWZJbmZvLT5kYmlfRGlzcE1lc3NhZ2UubW5fUmVwbHlQb3J0PU5VTEw7Ci0KLQkJCWlmKHRoaXMtPmhpZGRlbi0+U0JbMV0pCi0JCQkJRnJlZVNjcmVlbkJ1ZmZlcihTRExfRGlzcGxheSx0aGlzLT5oaWRkZW4tPlNCWzFdKTsKLQkJCWlmKHRoaXMtPmhpZGRlbi0+U0JbMF0pCi0JCQkJRnJlZVNjcmVlbkJ1ZmZlcihTRExfRGlzcGxheSx0aGlzLT5oaWRkZW4tPlNCWzBdKTsKLQotCi0JCQl0aGlzLT5oaWRkZW4tPlNCWzBdPXRoaXMtPmhpZGRlbi0+U0JbMV09TlVMTDsKLQotCQkJaWYoU0RMX1Jhc3RQb3J0ICYmIFNETF9SYXN0UG9ydCAhPSAmU0RMX0Rpc3BsYXktPlJhc3RQb3J0KQotCQkJCVNETF9mcmVlKFNETF9SYXN0UG9ydCk7Ci0KLQkJCVNETF9SYXN0UG9ydD1OVUxMOwotCQl9Ci0JCUNsb3NlU2NyZWVuKEdGWF9EaXNwbGF5KTsKLQkJY3VycmVudGx5X2Z1bGxzY3JlZW49MDsKLQl9Ci0JZWxzZSBpZihHRlhfRGlzcGxheSkKLQkJVW5sb2NrUHViU2NyZWVuKE5VTEwsR0ZYX0Rpc3BsYXkpOwotCi0JR0ZYX0Rpc3BsYXkgPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IENHWF9BdmFpbGFibGUodm9pZCkKLXsKLQlzdHJ1Y3QgTGlicmFyeSAqbDsKLQotCWwgPSBPcGVuTGlicmFyeSgiY3liZXJncmFwaGljcy5saWJyYXJ5IiwwTCk7Ci0KLQlpZiAoIGwgIT0gTlVMTCApIHsKLQkJRChidWcoIkNHWCB2aWRlbyBkZXZpY2UgQVZBSUxBQkxFXG4iKSk7Ci0JCUNsb3NlTGlicmFyeShsKTsKLQl9Ci0JRChlbHNlIGJ1ZygiKipDR1ggdmlkZW8gZGV2aWNlIFVOQVZBSUxBQkxFXG4iKSk7Ci0KLQlyZXR1cm4obCAhPSBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgQ0dYX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKLXsKLQlpZiAoIGRldmljZSApIHsKLQkJaWYgKCBkZXZpY2UtPmhpZGRlbiApIHsKLQkJCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQkJfQotCQlpZiAoIGRldmljZS0+Z2xfZGF0YSApIHsKLQkJCVNETF9mcmVlKGRldmljZS0+Z2xfZGF0YSk7Ci0JCX0KLQkJU0RMX2ZyZWUoZGV2aWNlKTsKLQl9Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKkNHWF9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7Ci0JaWYgKCBkZXZpY2UgKSB7Ci0JCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLQkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCQlkZXZpY2UtPmdsX2RhdGEgPSAoc3RydWN0IFNETF9Qcml2YXRlR0xEYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmdsX2RhdGEpKTsKLQl9Ci0JaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSB8fAotCSAgICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWNlLT5nbF9kYXRhID09IE5VTEwpICkgewotCQlEKGJ1ZygiVW5hYmxlIHRvIGNyZWF0ZSB2aWRlbyBkZXZpY2UhXG4iKSk7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlDR1hfRGVsZXRlRGV2aWNlKGRldmljZSk7Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgc2l6ZW9mKCpkZXZpY2UtPmhpZGRlbikpOwotCVNETF9tZW1zZXQoZGV2aWNlLT5nbF9kYXRhLCAwLCBzaXplb2YoKmRldmljZS0+Z2xfZGF0YSkpOwotCi0JLyogU2V0IHRoZSBkcml2ZXIgZmxhZ3MgKi8KLQlkZXZpY2UtPmhhbmRsZXNfYW55X3NpemUgPSAxOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCWRldmljZS0+VmlkZW9Jbml0ID0gQ0dYX1ZpZGVvSW5pdDsKLQlkZXZpY2UtPkxpc3RNb2RlcyA9IENHWF9MaXN0TW9kZXM7Ci0JZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBDR1hfU2V0VmlkZW9Nb2RlOwotCWRldmljZS0+VG9nZ2xlRnVsbFNjcmVlbiA9IENHWF9Ub2dnbGVGdWxsU2NyZWVuOwotCWRldmljZS0+VXBkYXRlTW91c2UgPSBDR1hfVXBkYXRlTW91c2U7Ci0JZGV2aWNlLT5TZXRDb2xvcnMgPSBDR1hfU2V0Q29sb3JzOwotCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOwotCWRldmljZS0+VmlkZW9RdWl0ID0gQ0dYX1ZpZGVvUXVpdDsKLQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gQ0dYX0FsbG9jSFdTdXJmYWNlOwotCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBDR1hfQ2hlY2tIV0JsaXQ7Ci0JZGV2aWNlLT5GaWxsSFdSZWN0ID0gQ0dYX0ZpbGxIV1JlY3Q7Ci0JZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gQ0dYX1NldEhXQ29sb3JLZXk7Ci0JZGV2aWNlLT5TZXRIV0FscGhhID0gTlVMTDsKLQlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBDR1hfTG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IENHWF9VbmxvY2tIV1N1cmZhY2U7Ci0JZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gQ0dYX0ZsaXBIV1N1cmZhY2U7Ci0JZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gQ0dYX0ZyZWVIV1N1cmZhY2U7Ci0JZGV2aWNlLT5TZXRHYW1tYSA9IENHWF9TZXRHYW1tYTsKLQlkZXZpY2UtPkdldEdhbW1hID0gQ0dYX0dldEdhbW1hOwotCWRldmljZS0+U2V0R2FtbWFSYW1wID0gQ0dYX1NldEdhbW1hUmFtcDsKLQlkZXZpY2UtPkdldEdhbW1hUmFtcCA9IE5VTEw7Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCWRldmljZS0+R0xfTG9hZExpYnJhcnkgPSBDR1hfR0xfTG9hZExpYnJhcnk7Ci0JZGV2aWNlLT5HTF9HZXRQcm9jQWRkcmVzcyA9IENHWF9HTF9HZXRQcm9jQWRkcmVzczsKLQlkZXZpY2UtPkdMX0dldEF0dHJpYnV0ZSA9IENHWF9HTF9HZXRBdHRyaWJ1dGU7Ci0JZGV2aWNlLT5HTF9NYWtlQ3VycmVudCA9IENHWF9HTF9NYWtlQ3VycmVudDsKLQlkZXZpY2UtPkdMX1N3YXBCdWZmZXJzID0gQ0dYX0dMX1N3YXBCdWZmZXJzOwotI2VuZGlmCi0JZGV2aWNlLT5TZXRJY29uID0gQ0dYX1NldEljb247Ci0JZGV2aWNlLT5TZXRDYXB0aW9uID0gQ0dYX1NldENhcHRpb247Ci0JZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gTlVMTDsgLyogQ0dYX0ljb25pZnlXaW5kb3c7ICovCi0JZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMIC8qIENHWF9HcmFiSW5wdXQqLzsKLQlkZXZpY2UtPkdldFdNSW5mbyA9IENHWF9HZXRXTUluZm87Ci0JZGV2aWNlLT5GcmVlV01DdXJzb3IgPSBhbWlnYV9GcmVlV01DdXJzb3I7Ci0JZGV2aWNlLT5DcmVhdGVXTUN1cnNvciA9IGFtaWdhX0NyZWF0ZVdNQ3Vyc29yOwotCWRldmljZS0+U2hvd1dNQ3Vyc29yID0gYW1pZ2FfU2hvd1dNQ3Vyc29yOwotCWRldmljZS0+V2FycFdNQ3Vyc29yID0gYW1pZ2FfV2FycFdNQ3Vyc29yOwotCWRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBhbWlnYV9DaGVja01vdXNlTW9kZTsKLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IGFtaWdhX0luaXRPU0tleW1hcDsKLQlkZXZpY2UtPlB1bXBFdmVudHMgPSBhbWlnYV9QdW1wRXZlbnRzOwotCi0JZGV2aWNlLT5mcmVlID0gQ0dYX0RlbGV0ZURldmljZTsKLQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLVZpZGVvQm9vdFN0cmFwIENHWF9ib290c3RyYXAgPSB7Ci0JIkNHWCIsICJBbWlnYU9TIEN5YmVyR3JhcGhpY3MiLCBDR1hfQXZhaWxhYmxlLCBDR1hfQ3JlYXRlRGV2aWNlCi19OwotCi1VaW50MzIgTWFrZUJpdE1hc2soX1RISVMsaW50IHR5cGUsaW50IGZvcm1hdCxpbnQgKmJwcCkKLXsKLQlEKGlmKHR5cGU9PTApYnVnKCJSRUFMIHBpeGVsIGZvcm1hdDogIikpOwotCi0JaWYodGhpcy0+aGlkZGVuLT5kZXB0aD09KmJwcCkKLQl7Ci0KLQlzd2l0Y2goZm9ybWF0KQotICAgIAl7Ci0JCWNhc2UgUElYRk1UX0xVVDg6Ci0JCQlEKGlmKHR5cGU9PTApYnVnKCJMVVQ4XG4iKSk7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBQSVhGTVRfQkdSMTU6Ci0JCWNhc2UgUElYRk1UX1JHQjE1UEM6Ci0JCQlzd2l0Y2godHlwZSkKLQkJCXsKLQkJCQljYXNlIDA6Ci0JCQkJCUQoYnVnKCJSR0IxNVBDL0JHUjE1XG4iKSk7Ci0JCQkJCXJldHVybiAzMTsKLQkJCQljYXNlIDE6Ci0JCQkJCXJldHVybiA5OTI7Ci0JCQkJY2FzZSAyOgotCQkJCQlyZXR1cm4gMzE3NDQ7Ci0JCQl9Ci0JCWNhc2UgUElYRk1UX1JHQjE1OgotCQljYXNlIFBJWEZNVF9CR1IxNVBDOgotCQkJc3dpdGNoKHR5cGUpCi0JCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlEKGJ1ZygiUkdCMTUvQkdSMTVQQ1xuIikpOwotCQkJCQlyZXR1cm4gMzE3NDQ7Ci0JCQkJY2FzZSAxOgotCQkJCQlyZXR1cm4gOTkyOwotCQkJCWNhc2UgMjoKLQkJCQkJcmV0dXJuIDMxOwotCQkJfQotCQljYXNlIFBJWEZNVF9CR1IxNlBDOgotCQljYXNlIFBJWEZNVF9SR0IxNjoKLQkJCXN3aXRjaCh0eXBlKQotCQkJewotCQkJCWNhc2UgMDoKLQkJCQkJRChidWcoIlJHQjE2UENcbiIpKTsKLQkJCQkJcmV0dXJuIDYzNDg4OwotCQkJCWNhc2UgMToKLQkJCQkJcmV0dXJuIDIwMTY7Ci0JCQkJY2FzZSAyOgotCQkJCQlyZXR1cm4gMzE7Ci0JCQl9Ci0JCWNhc2UgUElYRk1UX0JHUjE2OgotCQljYXNlIFBJWEZNVF9SR0IxNlBDOgotCQkJc3dpdGNoKHR5cGUpCi0JCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlEKGJ1ZygiUkdCMTZQQy9CR1IxNlxuIikpOwotCQkJCQlyZXR1cm4gMzE7Ci0JCQkJY2FzZSAxOgotCQkJCQlyZXR1cm4gMjAxNjsKLQkJCQljYXNlIDI6Ci0JCQkJCXJldHVybiA2MzQ4ODsKLQkJCX0KLQotCQljYXNlIFBJWEZNVF9SR0IyNDoKLQkJCXN3aXRjaCh0eXBlKQotCQkJewotCQkJCWNhc2UgMDoKLQkJCQkJRChidWcoIlJHQjI0L0JHUjI0XG4iKSk7Ci0JCQkJCXJldHVybiAweGZmMDAwMDsKLQkJCQljYXNlIDE6Ci0JCQkJCXJldHVybiAweGZmMDA7Ci0JCQkJY2FzZSAyOgotCQkJCQlyZXR1cm4gMHhmZjsKLQkJCX0KLQkJY2FzZSBQSVhGTVRfQkdSMjQ6Ci0JCQlzd2l0Y2godHlwZSkKLQkJCXsKLQkJCQljYXNlIDA6Ci0JCQkJCUQoYnVnKCJCR1IyNFxuIikpOwotCQkJCQlyZXR1cm4gMHhmZjsKLQkJCQljYXNlIDE6Ci0JCQkJCXJldHVybiAweGZmMDA7Ci0JCQkJY2FzZSAyOgotCQkJCQlyZXR1cm4gMHhmZjAwMDA7Ci0JCQl9Ci0JCWNhc2UgUElYRk1UX0FSR0IzMjoKLQkJCXN3aXRjaCh0eXBlKQotCQkJewotCQkJCWNhc2UgMDoKLQkJCQkJRChidWcoIkFSR0IzMlxuIikpOwotCQkJCQlyZXR1cm4gMHhmZjAwMDA7Ci0JCQkJY2FzZSAxOgotCQkJCQlyZXR1cm4gMHhmZjAwOwotCQkJCWNhc2UgMjoKLQkJCQkJcmV0dXJuIDB4ZmY7Ci0JCQl9Ci0JCWNhc2UgUElYRk1UX0JHUkEzMjoKLQkJCXN3aXRjaCh0eXBlKQotCQkJewotCQkJCWNhc2UgMDoKLQkJCQkJRChidWcoIkJHUkEzMlxuIikpOwotCQkJCQlyZXR1cm4gMHhmZjAwOwotCQkJCWNhc2UgMToKLQkJCQkJcmV0dXJuIDB4ZmYwMDAwOwotCQkJCWNhc2UgMjoKLQkJCQkJcmV0dXJuIDB4ZmYwMDAwMDA7Ci0JCQl9Ci0JCWNhc2UgUElYRk1UX1JHQkEzMjoKLQkJCXN3aXRjaCh0eXBlKQotCQkJewotCQkJCWNhc2UgMDoKLQkJCQkJRChidWcoIlJHQkEzMlxuIikpOwotCQkJCQlyZXR1cm4gMHhmZjAwMDAwMDsKLQkJCQljYXNlIDE6Ci0JCQkJCXJldHVybiAweGZmMDAwMDsKLQkJCQljYXNlIDI6Ci0JCQkJCXJldHVybiAweGZmMDA7Ci0JCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlEKGJ1ZygiVW5rbm93biBwaXhlbCBmb3JtYXQhIERlZmF1bHQgdG8gMjRiaXRcbiIpKTsKLQkJCXJldHVybiAoVWludDMyKSAoMjU1PDwodHlwZSo4KSk7Ci0JfQotCX0KLQllbHNlCi0JewotCQlEKGlmKHR5cGU9PTApYnVnKCJESUZGRVJFTlQgZnJvbSBzY3JlZW4uXG5BbGxvY2F0ZWQgc2NyZWVuIGZvcm1hdDogIikpOwotCi0JCXN3aXRjaCgqYnBwKQotCQl7Ci0JCQljYXNlIDMyOgotCQkJCUQoaWYodHlwZT09MCkgYnVnKCJSR0JBMzJcbiIpKTsKLQkJCQlzd2l0Y2godHlwZSkKLQkJCQl7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXJldHVybiAweGZmMDAwMDAwOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlyZXR1cm4gMHhmZjAwMDA7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXJldHVybiAweGZmMDA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLXVzZV90cnVlY29sb3I6Ci0JCQkJc3dpdGNoKHR5cGUpCi0JCQkJewotCQkJCQljYXNlIDA6Ci0JCQkJCQlEKGJ1ZygiUkdCMjRcbiIpKTsKLQkJCQkJCXJldHVybiAweGZmMDAwMDsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcmV0dXJuIDB4ZmYwMDsKLQkJCQkJY2FzZSAyOgotCQkJCQkJcmV0dXJuIDB4ZmY7Ci0JCQkJfQotCQkJY2FzZSAxNjoKLQkJCWNhc2UgMTU6Ci0JCQkJRChpZih0eXBlPT0wKSBidWcoIk5vdCBzdXBwb3J0ZWQsIHN3aXRjaGluZyB0byAyNGJpdCFcbiIpKTsKLQkJCQkqYnBwPTI0OwotCQkJCWdvdG8gdXNlX3RydWVjb2xvcjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJRChpZih0eXBlPT0wKWJ1ZygiVGhpcyBpcyBhIGNodW5reSBkaXNwbGF5XG4iKSk7Ci0vLyBGb3IgY2h1bmt5IGRpc3BsYXkgbWFzayBpcyBhbHdheXMgMDsKLQkJCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBDR1hfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IExpYnJhcnkgKlJUR0Jhc2U7Ci0KLQlEKGJ1ZygiVmlkZW9Jbml0Li4uIE9wZW5pbmcgbGlicmFyaWVzXG4iKSk7Ci0KLQlpZighSW50dWl0aW9uQmFzZSkgewotCQlpZiggIShJbnR1aXRpb25CYXNlPShzdHJ1Y3QgSW50dWl0aW9uQmFzZSAqKU9wZW5MaWJyYXJ5KCJpbnR1aXRpb24ubGlicmFyeSIsMzlMKSkpIHsKLQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiBpbnR1aXRpb24gVjM5KyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JaWYoIUdmeEJhc2UpIHsKLQkJaWYoICEoR2Z4QmFzZT0oc3RydWN0IEdmeEJhc2UgKilPcGVuTGlicmFyeSgiZ3JhcGhpY3MubGlicmFyeSIsMzlMKSkpIHsKLQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiBncmFwaGljcyBWMzkrIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlpZighQ3liZXJHZnhCYXNlKSB7Ci0JCWlmKCAhKEN5YmVyR2Z4QmFzZT1PcGVuTGlicmFyeSgiY3liZXJncmFwaGljcy5saWJyYXJ5Iiw0MEwpKSkgewotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuIGN5YmVyZ3JhcGhpY3MuIik7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JfQotCi0JaWYoUlRHQmFzZT1PcGVuTGlicmFyeSgibGliczpwaWNhc3NvOTYvcnRnLmxpYnJhcnkiLDBMKSkgewotCQlleHRlcm4gaW50IHVzZV9waWNhc3NvOTY7Ci0KLQkJQ2xvc2VMaWJyYXJ5KFJUR0Jhc2UpOwotCQl1c2VfcGljYXNzbzk2PTE7Ci0JfQotCi0JRChidWcoIkxpYnJhcnkgaW50aWFsaXplZCwgbG9ja2luZyBzY3JlZW4uLi5cbiIpKTsKLQotCVNETF9EaXNwbGF5ID0gTG9ja1B1YlNjcmVlbihOVUxMKTsKLQotCWlmICggU0RMX0Rpc3BsYXkgPT0gTlVMTCApIHsKLQkJRChidWcoIkNhbm5vdCBsb2NrIGRpc3BsYXkuLi5cbiIpKTsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBsb2NrIHRoZSBkaXNwbGF5Iik7Ci0JCXJldHVybigtMSk7Ci0JfQotCXRoaXMtPmluZm8uY3VycmVudF93ID0gU0RMX0Rpc3BsYXktPldpZHRoOwotCXRoaXMtPmluZm8uY3VycmVudF9oID0gU0RMX0Rpc3BsYXktPkhlaWdodDsKLQotCUQoYnVnKCJDaGVja2luZyBpZiB3ZSBhcmUgdXNpbmcgYSBDR1ggbmF0aXZlIGRpc3BsYXkuLi5cbiIpKTsKLQotCWlmKCFJc0N5YmVyTW9kZUlEKEdldFZQTW9kZUlEKCZTRExfRGlzcGxheS0+Vmlld1BvcnQpKSkKLQl7Ci0JCVVpbnQzMiBva2lkPUJlc3RDTW9kZUlEVGFncyhDWUJSQklEVEdfTm9taW5hbFdpZHRoLFNETF9EaXNwbGF5LT5XaWR0aCwKLQkJCQlDWUJSQklEVEdfTm9taW5hbEhlaWdodCxTRExfRGlzcGxheS0+SGVpZ2h0LAotCQkJCUNZQlJCSURUR19EZXB0aCw4LAotCQkJCVRBR19ET05FKTsKLQotCQlEKGJ1ZygiRGVmYXVsdCB2aXN1YWwgaXMgbm90IENHWCBuYXRpdmUhXG4iKSk7Ci0KLQkJVW5sb2NrUHViU2NyZWVuKE5VTEwsU0RMX0Rpc3BsYXkpOwotCi0JCUdGWF9EaXNwbGF5PU5VTEw7Ci0KLQkJaWYob2tpZCE9SU5WQUxJRF9JRCkKLQkJewotCQkJR0ZYX0Rpc3BsYXk9T3BlblNjcmVlblRhZ3MoTlVMTCwKLQkJCQkJCQkJCVNBX1dpZHRoLFNETF9EaXNwbGF5LT5XaWR0aCwKLQkJCQkJCQkJCVNBX0hlaWdodCxTRExfRGlzcGxheS0+SGVpZ2h0LAotCQkJCQkJCQkJU0FfRGVwdGgsOCxTQV9RdWlldCxUUlVFLAotCQkJCQkJCQkJU0FfU2hvd1RpdGxlLEZBTFNFLAotCQkJCQkJCQkJU0FfRGlzcGxheUlELG9raWQsCi0JCQkJCQkJCQlUQUdfRE9ORSk7Ci0JCX0KLQotCQlpZighR0ZYX0Rpc3BsYXkpCi0JCXsKLQkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gYSBzdWl0ZWQgQ0dYIGRpc3BsYXkiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIFNETF9EaXNwbGF5PUdGWF9EaXNwbGF5OwotCi0JfQotCWVsc2UgR0ZYX0Rpc3BsYXkgPSBTRExfRGlzcGxheTsKLQotCi0JLyogU2VlIHdoZXRoZXIgb3Igbm90IHdlIG5lZWQgdG8gc3dhcCBwaXhlbHMgKi8KLQotCXN3YXBfcGl4ZWxzID0gMDsKLQotLy8gTm9uIGUnIGRldHRvIGNoZSBzaWEgY29zaScgcGVybycsIGFsY3VuZSBzY2hlZGUgcG90cmViYmVybyBnZXN0aXJlIGkgbW9kaSBpbiBtb2RvIGRpZmZlcmVudGUKLQotCWlmICggU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTiApIHsKLQkJc3dhcF9waXhlbHMgPSAxOwotCX0KLQotCUQoYnVnKCJCZWZvcmUgR2V0VmlkZW9Nb2Rlcy4uLi5cbiIpKTsKLQotCS8qIEdldCB0aGUgYXZhaWxhYmxlIHZpZGVvIG1vZGVzICovCi0JaWYoQ0dYX0dldFZpZGVvTW9kZXModGhpcykgPCAwKQotCSAgICByZXR1cm4gLTE7Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgc2NyZWVuIGRlcHRoOgotCSAgIFVzZSB0aGUgZGVmYXVsdCB2aXN1YWwgKG9yIGF0IGxlYXN0IG9uZSB3aXRoIHRoZSBzYW1lIGRlcHRoKSAqLwotCi0JZm9yKGkgPSAwOyBpIDwgdGhpcy0+aGlkZGVuLT5udmlzdWFsczsgaSsrKQotCSAgICBpZih0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uZGVwdGggPT0gR2V0Q3liZXJNYXBBdHRyKFNETF9EaXNwbGF5LT5SYXN0UG9ydC5CaXRNYXAsQ1lCUk1BVFRSX0RFUFRIKSkKLQkJCQkJYnJlYWs7Ci0JaWYoaSA9PSB0aGlzLT5oaWRkZW4tPm52aXN1YWxzKSB7Ci0JICAgIC8qIGRlZmF1bHQgdmlzdWFsIHdhcyB1c2VsZXNzLCB0YWtlIHRoZSBkZWVwZXN0IG9uZSBpbnN0ZWFkICovCi0JICAgIGkgPSAwOwotCX0KLQlTRExfVmlzdWFsID0gdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLnZpc3VhbDsKLQotLy8JU0RMX1hDb2xvck1hcCA9IFNETF9EaXNwbGF5Q29sb3JtYXA7Ci0KLQl0aGlzLT5oaWRkZW4tPmRlcHRoID0gdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLmRlcHRoOwotCUQoYnVnKCJJbml0OiBTZXR0aW5nIHNjcmVlbiBkZXB0aCB0bzogJWxkXG4iLHRoaXMtPmhpZGRlbi0+ZGVwdGgpKTsKLQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uZGVwdGg7IC8qIHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5icHA7ICovCi0KLQl7Ci0JCWludCBmb3JtOwotCQlBUFRSIGhhbmRsZTsKLQkJc3RydWN0IERpc3BsYXlJbmZvIGluZm87Ci0KLQkJaWYoIShoYW5kbGU9RmluZERpc3BsYXlJbmZvKHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS52aXN1YWwpKSkKLQkJewotCQkJRChidWcoIlVuYWJsZSB0byBnZXQgdmlzdWFsIGluZm8uLi5cbiIpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWlmKCFHZXREaXNwbGF5SW5mb0RhdGEoaGFuZGxlLChjaGFyICopJmluZm8sc2l6ZW9mKHN0cnVjdCBEaXNwbGF5SW5mbyksRFRBR19ESVNQLE5VTEwpKSB7Ci0JCQlEKGJ1ZygiVW5hYmxlIHRvIGdldCB2aXN1YWwgaW5mbyBkYXRhLi4uXG4iKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlmb3JtPUdldEN5YmVySURBdHRyKENZQlJJREFUVFJfUElYRk1ULFNETF9WaXN1YWwpOwotCi0vLyBJbiB0aGlzIGNhc2UgSSB1c2UgbWFrZWJpdG1hc2sgaW4gYSB3YXkgdGhhdCBJJ20gc3VyZSBJJ2xsIGdldCBQSVhGTVQgcGl4ZWwgbWFzawotCi0JCWlmICggdmZvcm1hdC0+Qml0c1BlclBpeGVsID4gOCApCi0JCXsKLQkJCXZmb3JtYXQtPlJtYXNrID0gTWFrZUJpdE1hc2sodGhpcywwLGZvcm0sJnRoaXMtPmhpZGRlbi0+ZGVwdGgpOwotCSAgCQl2Zm9ybWF0LT5HbWFzayA9IE1ha2VCaXRNYXNrKHRoaXMsMSxmb3JtLCZ0aGlzLT5oaWRkZW4tPmRlcHRoKTsKLQkJICAJdmZvcm1hdC0+Qm1hc2sgPSBNYWtlQml0TWFzayh0aGlzLDIsZm9ybSwmdGhpcy0+aGlkZGVuLT5kZXB0aCk7Ci0JCX0KLQl9Ci0KLQkvKiBTZWUgaWYgd2UgaGF2ZSBiZWVuIHBhc3NlZCBhIHdpbmRvdyB0byB1c2UgKi8KLS8qCVNETF93aW5kb3dpZCA9IFNETF9nZXRlbnYoIlNETF9XSU5ET1dJRCIpOyAqLwotCVNETF93aW5kb3dpZD1OVUxMOwotCi0JLyogQ3JlYXRlIHRoZSBibGFuayBjdXJzb3IgKi8KLQlTRExfQmxhbmtDdXJzb3IgPSBBbGxvY01lbSgxNixNRU1GX0NISVB8TUVNRl9DTEVBUik7Ci0KLQkvKiBGaWxsIGluIHNvbWUgd2luZG93IG1hbmFnZXIgY2FwYWJpbGl0aWVzICovCi0JdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAxOwotCXRoaXMtPmluZm8uYmxpdF9odyA9IDE7Ci0JdGhpcy0+aW5mby5ibGl0X2h3X0NDID0gMTsKLQl0aGlzLT5pbmZvLmJsaXRfc3cgPSAxOwotCXRoaXMtPmluZm8uYmxpdF9maWxsID0gMTsKLQl0aGlzLT5pbmZvLnZpZGVvX21lbT0yMDAwMDAwOyAvLyBOb3QgYWx3YXlzIHRydWUgYnV0IGFsbW9zdCBhbnkgQW1pZ2EgY2FyZCBoYXMgdGhpcyBtZW1vcnkhCi0KLQl0aGlzLT5oaWRkZW4tPnNhbWVfZm9ybWF0PTA7Ci0JU0RMX1Jhc3RQb3J0PSZTRExfRGlzcGxheS0+UmFzdFBvcnQ7Ci0JLyogV2UncmUgZG9uZSEgKi8KLQlEKGJ1ZygiRW5kIG9mIENHWF9WaWRlb0luaXRcbiIpKTsKLQotCXJldHVybigwKTsKLX0KLQotdm9pZCBDR1hfRGVzdHJveVdpbmRvdyhfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbikKLXsKLQlEKGJ1ZygiRGVzdHJveSBXaW5kb3cuLi5cbiIpKTsKLQotCWlmICggISBTRExfd2luZG93aWQgKSB7Ci0JCS8qIEhpZGUgdGhlIG1hbmFnZWQgd2luZG93ICovCi0JCWludCB3YXNfZnVsbHNjcmVlbj0wOwotCi0JCS8qIENsZWFuIHVwIE9wZW5HTCAqLwotCQlpZiAoIHNjcmVlbiApIHsKLQkJc2NyZWVuLT5mbGFncyAmPSB+KFNETF9PUEVOR0x8U0RMX09QRU5HTEJMSVQpOwotCQl9Ci0KLQkJaWYgKCBzY3JlZW4gJiYgKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgKSB7Ci0JCQl3YXNfZnVsbHNjcmVlbj0xOwotCQkJc2NyZWVuLT5mbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0vLwkJCUNHWF9MZWF2ZUZ1bGxTY3JlZW4odGhpcyk7IHRvbHRvIHggY3Jhc2gKLQkJfQotCi0JCS8qIERlc3Ryb3kgdGhlIG91dHB1dCB3aW5kb3cgKi8KLQkJaWYgKCBTRExfV2luZG93ICkgewotCQkJQ2xvc2VXaW5kb3coU0RMX1dpbmRvdyk7Ci0JCQlTRExfV2luZG93PU5VTEw7Ci0JCX0KLQotCQkvKiBGcmVlIHRoZSBjb2xvcm1hcCBlbnRyaWVzICovCi0JCWlmICggU0RMX1hQaXhlbHMgKSB7Ci0JCQlpbnQgbnVtY29sb3JzOwotCQkJdW5zaWduZWQgbG9uZyBwaXhlbDsKLQotCQkJaWYodGhpcy0+c2NyZWVuLT5mb3JtYXQmJnRoaXMtPmhpZGRlbi0+ZGVwdGg9PTgmJiF3YXNfZnVsbHNjcmVlbikKLQkJCXsKLQkJCQludW1jb2xvcnMgPSAxPDx0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCi0JCQkJaWYobnVtY29sb3JzPjI1NikKLQkJCQkJbnVtY29sb3JzPTI1NjsKLQotCQkJCWlmKCF3YXNfZnVsbHNjcmVlbiYmdGhpcy0+aGlkZGVuLT5kZXB0aD09OCkKLQkJCQl7Ci0JCQkJCWZvciAoIHBpeGVsPTA7IHBpeGVsPG51bWNvbG9yczsgcGl4ZWwrKyApCi0JCQkJCXsKLQkJCQkJCWlmKFNETF9YUGl4ZWxzW3BpeGVsXT49MCkKLQkJCQkJCQlSZWxlYXNlUGVuKEdGWF9EaXNwbGF5LT5WaWV3UG9ydC5Db2xvck1hcCxTRExfWFBpeGVsc1twaXhlbF0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJU0RMX2ZyZWUoU0RMX1hQaXhlbHMpOwotCQkJU0RMX1hQaXhlbHMgPSBOVUxMOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBDR1hfU2V0U2l6ZUhpbnRzKF9USElTLCBpbnQgdywgaW50IGgsIFVpbnQzMiBmbGFncykKLXsKLQlpZiAoIGZsYWdzICYgU0RMX1JFU0laQUJMRSApIHsKLQkJV2luZG93TGltaXRzKFNETF9XaW5kb3csIDMyLCAzMiw0MDk2LDQwOTYpOwotCX0gZWxzZSB7Ci0JCVdpbmRvd0xpbWl0cyhTRExfV2luZG93LCB3LGgsdyxoKTsKLQl9Ci0JaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgewotCQlmbGFncyY9flNETF9SRVNJWkFCTEU7Ci0JfSBlbHNlIGlmICggU0RMX2dldGVudigiU0RMX1ZJREVPX0NFTlRFUkVEIikgKSB7Ci0JCWludCBkaXNwbGF5X3csIGRpc3BsYXlfaDsKLQotCQlkaXNwbGF5X3cgPSBTRExfRGlzcGxheS0+V2lkdGg7Ci0JCWRpc3BsYXlfaCA9IFNETF9EaXNwbGF5LT5IZWlnaHQ7Ci0JCUNoYW5nZVdpbmRvd0JveChTRExfV2luZG93LChkaXNwbGF5X3cgLSB3IC0gU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdC1TRExfV2luZG93LT5Cb3JkZXJSaWdodCkvMiwKLQkJCQkJKGRpc3BsYXlfaCAtIGggLSBTRExfV2luZG93LT5Cb3JkZXJUb3AtU0RMX1dpbmRvdy0+Qm9yZGVyQm90dG9tKS8yLAotCQkJCQl3K1NETF9XaW5kb3ctPkJvcmRlckxlZnQrU0RMX1dpbmRvdy0+Qm9yZGVyUmlnaHQsCi0JCQkJCWgrU0RMX1dpbmRvdy0+Qm9yZGVyVG9wK1NETF9XaW5kb3ctPkJvcmRlckJvdHRvbSk7Ci0JfQotfQotCi1pbnQgQ0dYX0NyZWF0ZVdpbmRvdyhfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbiwKLQkJCSAgICBpbnQgdywgaW50IGgsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLSNpZiAwCi0JaW50IGksIGRlcHRoOwotCVVpbnQzMiB2aXM7Ci0jZW5kaWYKLQlEKGJ1ZygiQ0dYX0NyZWF0ZVdpbmRvd1xuIikpOwotCi0JLyogSWYgYSB3aW5kb3cgaXMgYWxyZWFkeSBwcmVzZW50LCBkZXN0cm95IGl0IGFuZCBzdGFydCBmcmVzaCAqLwotCWlmICggU0RMX1dpbmRvdyApIHsKLQkJQ0dYX0Rlc3Ryb3lXaW5kb3codGhpcywgc2NyZWVuKTsKLQl9Ci0KLQkvKiBTZWUgaWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgd2luZG93IGlkICovCi0JaWYgKCBTRExfd2luZG93aWQgKSB7Ci0JCVNETF9XaW5kb3cgPSAoc3RydWN0IFdpbmRvdyAqKWF0b2woU0RMX3dpbmRvd2lkKTsKLQl9IGVsc2UgewotCQlTRExfV2luZG93ID0gMDsKLQl9Ci0KLQkvKiBmaW5kIG91dCB3aGljaCB2aXN1YWwgd2UgYXJlIGdvaW5nIHRvIHVzZSAqLwotI2lmIDAKLS8qIHF1ZXN0byBsJ2hvIHNwb3N0YXRvIG5lbGwnYXBlcnR1cmEgZGVsbG8gc2NoZXJtbywgaW4gcXVhbnRvIHN1IEFtaWdhIGxlIGZpbmVzdHJlCi0gICBoYW5ubyBpbCBwaXhlbCBtb2RlIGRlZ2xpIHNjaGVybWkuCi0gKi8KLQkvKmlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgewotCQlTRExfU2V0RXJyb3IoIk9wZW5HTCBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBBbWlnYSBTREwhIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ki8KLQkJZm9yICggaSA9IDA7IGkgPCB0aGlzLT5oaWRkZW4tPm52aXN1YWxzOyBpKysgKSB7Ci0JCQlpZiAoIHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5kZXB0aCA9PSBicHAgKSAvKiBlcmEgLmRlcHRoICovCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCBpID09IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHMgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIk5vIG1hdGNoaW5nIHZpc3VhbCBmb3IgcmVxdWVzdGVkIGRlcHRoIik7Ci0JCQlyZXR1cm4gLTE7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLQkJfQotCQl2aXMgPSB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0udmlzdWFsOwotCQlkZXB0aCA9IHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5kZXB0aDsKLS8vCX0KLQlTRExfVmlzdWFsID0gdmlzOwotCXRoaXMtPmhpZGRlbi0+ZGVwdGggPSBkZXB0aDsKLQlEKGJ1ZygiU2V0dGluZyBzY3JlZW4gZGVwdGggdG86ICVsZFxuIix0aGlzLT5oaWRkZW4tPmRlcHRoKSk7Ci0jZW5kaWYKLQotCS8qIEFsbG9jYXRlIHRoZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciB0aGlzIHZpZGVvIG1vZGUgKi8KLQl7Ci0JCVVpbnQzMiBmb3JtOwotCQlBUFRSIGhhbmRsZTsKLQkJc3RydWN0IERpc3BsYXlJbmZvIGluZm87Ci0KLQkJaWYoIShoYW5kbGU9RmluZERpc3BsYXlJbmZvKFNETF9WaXN1YWwpKSkKLQkJCXJldHVybiAtMTsKLQotCQlpZighR2V0RGlzcGxheUluZm9EYXRhKGhhbmRsZSwoY2hhciAqKSZpbmZvLHNpemVvZihzdHJ1Y3QgRGlzcGxheUluZm8pLERUQUdfRElTUCxOVUxMKSkKLQkJCXJldHVybiAtMTsKLQotCQlmb3JtPUdldEN5YmVySURBdHRyKENZQlJJREFUVFJfUElYRk1ULFNETF9WaXN1YWwpOwotCi0JCWlmKGZsYWdzJlNETF9IV1NVUkZBQ0UpCi0JCXsKLQkJCWlmKGJwcCE9dGhpcy0+aGlkZGVuLT5kZXB0aCkKLQkJCXsKLQkJCQlicHA9dGhpcy0+aGlkZGVuLT5kZXB0aDsKLQkJCQlEKGJ1ZygiQWNjZWwgZm9yY2VzIGJwcCB0byBiZSBlcXVhbCAoJWxkKVxuIixicHApKTsKLQkJCX0KLQkJfQotCi0JCUQoYnVnKCJCRUZPUkUgc2NyZWVuIGFsbG9jYXRpb246IGJwcDolbGQgKHJlYWw6JWxkKVxuIixicHAsdGhpcy0+aGlkZGVuLT5kZXB0aCkpOwotCi0vKiBXaXRoIHRoaXMgY2FsbCBpZiBuZWVkZWQgSSdsbCByZXZlcnQgdGhlIHdhbnRlZCBicHAgdG8gYSBicHAgYmVzdCBzdWl0ZWQgZm9yIHRoZSBkaXNwbGF5LCBhY3R1YWxseSBvY2N1cnMKLSAgIG9ubHkgd2l0aCByZXF1ZXN0ZWQgZm9ybWF0IDE1LzE2Yml0IGFuZCBkaXNwbGF5IGZvcm1hdCAhPSAxNS8xNmJpdAotICovCi0KLQkJaWYgKCAhIFNETF9SZWFsbG9jRm9ybWF0KHNjcmVlbiwgYnBwLAotCQkJCU1ha2VCaXRNYXNrKHRoaXMsMCxmb3JtLCZicHApLCBNYWtlQml0TWFzayh0aGlzLDEsZm9ybSwmYnBwKSwgTWFrZUJpdE1hc2sodGhpcywyLGZvcm0sJmJwcCksIDApICkKLQkJCXJldHVybiAtMTsKLQotCQlEKGJ1ZygiQUZURVIgc2NyZWVuIGFsbG9jYXRpb246IGJwcDolbGQgKHJlYWw6JWxkKVxuIixicHAsdGhpcy0+aGlkZGVuLT5kZXB0aCkpOwotCi0JfQotCi0JLyogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjb2xvcm1hcCAqLwotLyoKLQlpZiAoIFNETF9YQ29sb3JNYXAgIT0gU0RMX0Rpc3BsYXlDb2xvcm1hcCApIHsKLQkJWEZyZWVDb2xvcm1hcChTRExfRGlzcGxheSwgU0RMX1hDb2xvck1hcCk7Ci0JfQotKi8KLQlpZiAoIEdldEN5YmVyTWFwQXR0cihTRExfRGlzcGxheS0+UmFzdFBvcnQuQml0TWFwLENZQlJNQVRUUl9QSVhGTVQpPT1QSVhGTVRfTFVUOCB8fCBicHA9PTggKSB7Ci0JICAgIGludCBuY29sb3JzLGk7Ci0JICAgIEQoYnVnKCJYUGl4ZWxzIHBhbGV0dGUgYWxsb2NhdGlvbi4uLlxuIikpOwotCi0JICAgIC8qIEFsbG9jYXRlIHRoZSBwaXhlbCBmbGFncyAqLwotCi0JICAgIGlmKGJwcD09OCkKLQkJbmNvbG9ycz0yNTY7Ci0JICAgIGVsc2UKLQkJbmNvbG9ycyA9IDEgPDwgc2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKLQotCSAgICBTRExfWFBpeGVscyA9IChTaW50MzIgKilTRExfbWFsbG9jKG5jb2xvcnMgKiBzaXplb2YoU2ludDMyKSk7Ci0KLQkgICAgaWYoU0RMX1hQaXhlbHMgPT0gTlVMTCkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCSAgICB9Ci0KLQotCSAgICBmb3IoaT0wO2k8bmNvbG9ycztpKyspCi0JCSAgICBTRExfWFBpeGVsc1tpXT0tMTsKLQotCSAgICAvKiBhbHdheXMgYWxsb2NhdGUgYSBwcml2YXRlIGNvbG9ybWFwIG9uIG5vbi1kZWZhdWx0IHZpc3VhbHMgKi8KLQkgICAgaWYoYnBwPT04KQotCQlmbGFncyB8PSBTRExfSFdQQUxFVFRFOwotCi0JICAgIGlmICggZmxhZ3MgJiBTRExfSFdQQUxFVFRFICkKLQkJCXNjcmVlbi0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKLQl9IAotCi0JLyogcmVzaXplIHRoZSAocG9zc2libHkgbmV3KSB3aW5kb3cgbWFuYWdlciB3aW5kb3cgKi8KLQotCS8qIENyZWF0ZSAob3IgdXNlKSB0aGUgWDExIGRpc3BsYXkgd2luZG93ICovCi0KLQlpZiAoICFTRExfd2luZG93aWQgKSB7Ci0JCQlpZiggZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApCi0JCQl7Ci0JCQkJU0RMX1dpbmRvdyA9IE9wZW5XaW5kb3dUYWdzKE5VTEwsV0FfV2lkdGgsdyxXQV9IZWlnaHQsaCwKLQkJCQkJCQkJCQkJV0FfRmxhZ3MsV0ZMR19BQ1RJVkFURXxXRkxHX1JNQlRSQVB8V0ZMR19CT1JERVJMRVNTfFdGTEdfQkFDS0RST1B8V0ZMR19SRVBPUlRNT1VTRSwKLQkJCQkJCQkJCQkJV0FfSURDTVAsSURDTVBfUkFXS0VZfElEQ01QX01PVVNFQlVUVE9OU3xJRENNUF9NT1VTRU1PVkUsCi0JCQkJCQkJCQkJCVdBX0N1c3RvbVNjcmVlbiwoVUxPTkcpU0RMX0Rpc3BsYXksCi0JCQkJCQkJCQkJCVRBR19ET05FKTsKLQotCQkJCUQoYnVnKCJPcGVuaW5nIGJhY2tkcm9wIHdpbmRvdyAlbGR4JWxkIG9uIGRpc3BsYXkgJWx4IVxuIix3LGgsU0RMX0Rpc3BsYXkpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvKiBDcmVhdGUgR2ltbWVaZXJvWmVybyB3aW5kb3cgd2hlbiBPcGVuR0wgaXMgdXNlZCAqLwotCQkJCXVuc2lnbmVkIGxvbmcgZ3p6ID0gRkFMU0U7Ci0JCQkJaWYoIGZsYWdzICYgU0RMX09QRU5HTCApIHsKLQkJCQkJZ3p6ID0gVFJVRTsKLQkJCQl9Ci0KLQkJCQlTRExfV2luZG93ID0gT3BlbldpbmRvd1RhZ3MoTlVMTCxXQV9Jbm5lcldpZHRoLHcsV0FfSW5uZXJIZWlnaHQsaCwKLQkJCQkJCQkJCQkJV0FfRmxhZ3MsV0ZMR19SRVBPUlRNT1VTRXxXRkxHX0FDVElWQVRFfFdGTEdfUk1CVFJBUCB8ICgoZmxhZ3MmU0RMX05PRlJBTUUpID8gMCA6IChXRkxHX0RFUFRIR0FER0VUfFdGTEdfQ0xPU0VHQURHRVR8V0ZMR19EUkFHQkFSIHwgKChmbGFncyZTRExfUkVTSVpBQkxFKSA/IFdGTEdfU0laRUdBREdFVHxXRkxHX1NJWkVCQk9UVE9NIDogMCkpKSwKLQkJCQkJCQkJCQkJV0FfSURDTVAsSURDTVBfUkFXS0VZfElEQ01QX0NMT1NFV0lORE9XfElEQ01QX01PVVNFQlVUVE9OU3xJRENNUF9ORVdTSVpFfElEQ01QX01PVVNFTU9WRSwKLQkJCQkJCQkJCQkJV0FfUHViU2NyZWVuLChVTE9ORylTRExfRGlzcGxheSwKLQkJCQkJCQkJCQkJV0FfR2ltbWVaZXJvWmVybywgZ3p6LAotCQkJCQkJCQkJCQkJCQlUQUdfRE9ORSk7Ci0JCQkJRChidWcoIk9wZW5pbmcgV0Igd2luZG93IG9mIHNpemU6ICVsZHglbGQhXG4iLHcsaCkpOwotCQkJfQotCi0JCWlmKCFTRExfV2luZG93KQotCQkJcmV0dXJuIC0xOwotCX0KLQotCXRoaXMtPmhpZGRlbi0+Qnl0ZXNQZXJQaXhlbD1HZXRDeWJlck1hcEF0dHIoU0RMX1dpbmRvdy0+UlBvcnQtPkJpdE1hcCxDWUJSTUFUVFJfQlBQSVgpOwotCi0JaWYoc2NyZWVuLT5mbGFncyAmIFNETF9ET1VCTEVCVUYpCi0JewotCQlpZihTRExfUmFzdFBvcnQ9U0RMX21hbGxvYyhzaXplb2Yoc3RydWN0IFJhc3RQb3J0KSkpCi0JCXsKLQkJCUluaXRSYXN0UG9ydChTRExfUmFzdFBvcnQpOwotCQkJU0RMX1Jhc3RQb3J0LT5CaXRNYXA9dGhpcy0+aGlkZGVuLT5TQlsxXS0+c2JfQml0TWFwOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSBTRExfUmFzdFBvcnQ9U0RMX1dpbmRvdy0+UlBvcnQ7Ci0KLQlpZihmbGFncyZTRExfSFdTVVJGQUNFKQotCQlzY3JlZW4tPmZsYWdzfD1TRExfSFdTVVJGQUNFOwotCi0JaWYoICFTRExfd2luZG93aWQgKSB7Ci0JICAgIENHWF9TZXRTaXplSGludHModGhpcywgdywgaCwgZmxhZ3MpOwotCX0KLQotCS8qIFNldCBvdXIgY29sb3JtYXBzIHdoZW4gbm90IHNldHRpbmcgYSBHTCBtb2RlICovCi0vKgotCWlmICggISAoZmxhZ3MgJiBTRExfT1BFTkdMKSApIHsKLQkJWFNldFdpbmRvd0NvbG9ybWFwKFNETF9EaXNwbGF5LCBTRExfV2luZG93LCBTRExfWENvbG9yTWFwKTsKLQl9Ci0qLwotCi0JLyogTWFwIHRoZW0gYm90aCBhbmQgZ28gZnVsbHNjcmVlbiwgaWYgcmVxdWVzdGVkICovCi0JaWYgKCAhIFNETF93aW5kb3dpZCApIHsKLQkJaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgewotCQkJc2NyZWVuLT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKLQkJCWN1cnJlbnRseV9mdWxsc2NyZWVuPTE7Ci0vLwkJCUNHWF9FbnRlckZ1bGxTY3JlZW4odGhpcyk7IENpIHNpYW1vIGdpYSchCi0JCX0gZWxzZSB7Ci0JCQlzY3JlZW4tPmZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKLQkJfQotCX0KLQlzY3JlZW4tPncgPSB3OwotCXNjcmVlbi0+aCA9IGg7Ci0Jc2NyZWVuLT5waXRjaCA9IFNETF9DYWxjdWxhdGVQaXRjaChzY3JlZW4pOwotCUNHWF9SZXNpemVJbWFnZSh0aGlzLCBzY3JlZW4sIGZsYWdzKTsKLQotCS8qIE1ha2UgT3BlbkdMIENvbnRleHQgaWYgbmVlZGVkKi8KLQlpZihmbGFncyAmIFNETF9PUEVOR0wpIHsKLQkJaWYodGhpcy0+Z2xfZGF0YS0+Z2xfYWN0aXZlID09IDApIHsKLQkJCWlmKENHWF9HTF9Jbml0KHRoaXMpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQllbHNlCi0JCQkJc2NyZWVuLT5mbGFncyB8PSBTRExfT1BFTkdMOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoQ0dYX0dMX1VwZGF0ZSh0aGlzKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJZWxzZQotCQkJCXNjcmVlbi0+ZmxhZ3MgfD0gU0RMX09QRU5HTDsKLQkJfQotCX0KLX0KLQotaW50IENHWF9SZXNpemVXaW5kb3coX1RISVMsCi0JCQlTRExfU3VyZmFjZSAqc2NyZWVuLCBpbnQgdywgaW50IGgsIFVpbnQzMiBmbGFncykKLXsKLQlEKGJ1ZygiQ0dYX1Jlc2l6ZVdpbmRvd1xuIikpOwotCi0JaWYgKCAhIFNETF93aW5kb3dpZCApIHsKLQkJLyogUmVzaXplIHRoZSB3aW5kb3cgbWFuYWdlciB3aW5kb3cgKi8KLQkJQ0dYX1NldFNpemVIaW50cyh0aGlzLCB3LCBoLCBmbGFncyk7Ci0KLQkJQ2hhbmdlV2luZG93Qm94KFNETF9XaW5kb3csU0RMX1dpbmRvdy0+TGVmdEVkZ2UsU0RMX1dpbmRvdy0+VG9wRWRnZSwgdytTRExfV2luZG93LT5Cb3JkZXJMZWZ0K1NETF9XaW5kb3ctPkJvcmRlclJpZ2h0LAotCQkJCQloK1NETF9XaW5kb3ctPkJvcmRlclRvcCtTRExfV2luZG93LT5Cb3JkZXJCb3R0b20pOwotCi0JCXNjcmVlbi0+dyA9IHc7Ci0JCXNjcmVlbi0+aCA9IGg7Ci0JCXNjcmVlbi0+cGl0Y2ggPSBTRExfQ2FsY3VsYXRlUGl0Y2goc2NyZWVuKTsKLQkJQ0dYX1Jlc2l6ZUltYWdlKHRoaXMsIHNjcmVlbiwgZmxhZ3MpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBTRExfU3VyZmFjZSAqQ0dYX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JVWludDMyIHNhdmVkX2ZsYWdzOwotCWludCBuZWVkY3JlYXRlPTA7Ci0KLQlEKGJ1ZygiQ0dYX1NldFZpZGVvTW9kZSBjdXJyZW50OiVseFxuIixjdXJyZW50KSk7Ci0KLQkvKiBMb2NrIHRoZSBldmVudCB0aHJlYWQsIGluIG11bHRpLXRocmVhZGluZyBlbnZpcm9ubWVudHMgKi8KLQlTRExfTG9ja19FdmVudFRocmVhZCgpOwotCi0vLyBDaGVjayBpZiB0aGUgd2luZG93IG5lZWRzIHRvIGJlIGNsb3NlZCBvciBjYW4gYmUgcmVzaXplZAotCi0JaWYoIChmbGFncyZTRExfRlVMTFNDUkVFTikgfHwgKGN1cnJlbnQgJiYgY3VycmVudC0+ZmxhZ3MmU0RMX0ZVTExTQ1JFRU4gJiYgIShmbGFncyZTRExfRlVMTFNDUkVFTikpKQotCQluZWVkY3JlYXRlPTE7Ci0KLS8vIENoZWNrIGlmIHdlIG5lZWQgdG8gY2xvc2UgYW4gYWxyZWFkeSBleGlzdGluZyB2aWRlb21vZGUuLi4KLQotCWlmKGN1cnJlbnQgJiYgY3VycmVudC0+ZmxhZ3MmU0RMX0ZVTExTQ1JFRU4gJiYgIShmbGFncyZTRExfRlVMTFNDUkVFTikpIHsKLQkJdW5zaWduZWQgbG9uZyBpOwotCQlEKGJ1ZygiRGVzdHJveWluZyBpbWFnZSwgd2luZG93ICYgc2NyZWVuIVxuIikpOwotCi0JCUNHWF9EZXN0cm95SW1hZ2UodGhpcyxjdXJyZW50KTsKLQkJQ0dYX0Rlc3Ryb3lXaW5kb3codGhpcyxjdXJyZW50KTsKLQkJRGVzdHJveVNjcmVlbih0aGlzKTsKLQkJR0ZYX0Rpc3BsYXk9U0RMX0Rpc3BsYXk9TG9ja1B1YlNjcmVlbihOVUxMKTsKLQotCQlicHA9dGhpcy0+aGlkZGVuLT5kZXB0aD1HZXRDeWJlck1hcEF0dHIoU0RMX0Rpc3BsYXktPlJhc3RQb3J0LkJpdE1hcCxDWUJSTUFUVFJfREVQVEgpOwotCi0JCWZvciAoIGkgPSAwOyBpIDwgdGhpcy0+aGlkZGVuLT5udmlzdWFsczsgaSsrICkgewotCQkJaWYgKCB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uZGVwdGggPT0gYnBwICkgLyogZXJhIC5kZXB0aCAqLwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICggaSA9PSB0aGlzLT5oaWRkZW4tPm52aXN1YWxzICkgewotCQkJU0RMX1NldEVycm9yKCJObyBtYXRjaGluZyB2aXN1YWwgZm9yIHJlcXVlc3RlZCBkZXB0aCIpOwotCQkJcmV0dXJuIE5VTEw7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLQkJfQotCQlTRExfVmlzdWFsID0gdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLnZpc3VhbDsKLQotCQlEKGJ1ZygiU2V0dGluZyBzY3JlZW4gZGVwdGggdG86ICVsZFxuIix0aGlzLT5oaWRkZW4tPmRlcHRoKSk7Ci0KLQl9Ci0JLyogQ2hlY2sgdGhlIGNvbWJpbmF0aW9uIG9mIGZsYWdzIHdlIHdlcmUgcGFzc2VkICovCi0JaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgewotCQlpbnQgaTsKLQotCQkvKiBDbGVhciBmdWxsc2NyZWVuIGZsYWcgaWYgbm90IHN1cHBvcnRlZCAqLwotCQlpZiAoIFNETF93aW5kb3dpZCApIHsKLQkJCWZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKLQkJfQotCQllbHNlIGlmKGN1cnJlbnQgJiYgY3VycmVudC0+ZmxhZ3MmU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQlpZihjdXJyZW50LT53IT13aWR0aCB8fAotCQkJCWN1cnJlbnQtPmghPWhlaWdodCB8fAotCQkJCSh0aGlzLT5oaWRkZW4gJiYgdGhpcy0+aGlkZGVuLT5kZXB0aCE9YnBwKSkKLQkJCXsKLQkJCQlEKGJ1ZygiRGVsZXRpbmcgcHJldmlvdXMgd2luZG93Li4uXG4iKSk7Ci0JCQkJQ0dYX0Rlc3Ryb3lJbWFnZSh0aGlzLGN1cnJlbnQpOwotCQkJCUNHWF9EZXN0cm95V2luZG93KHRoaXMsY3VycmVudCk7Ci0JCQkJRGVzdHJveVNjcmVlbih0aGlzKTsKLQkJCQlnb3RvIGJ1aWxkbmV3c2NyZWVuOwotCQkJfQotCQl9Ci0JCWVsc2UKLWJ1aWxkbmV3c2NyZWVuOgotCQl7Ci0JCQlVaW50MzIgb2tpZD1CZXN0Q01vZGVJRFRhZ3MoQ1lCUkJJRFRHX05vbWluYWxXaWR0aCx3aWR0aCwKLQkJCQlDWUJSQklEVEdfTm9taW5hbEhlaWdodCxoZWlnaHQsCi0JCQkJQ1lCUkJJRFRHX0RlcHRoLGJwcCwKLQkJCQlUQUdfRE9ORSk7Ci0KLQkJCUdGWF9EaXNwbGF5PU5VTEw7Ci0KLQkJCUQoYnVnKCJPcGVuaW5nIHNjcmVlbi4uLlxuIikpOwotCi0JCQlpZihva2lkIT1JTlZBTElEX0lEKQotCQkJCUdGWF9EaXNwbGF5PU9wZW5TY3JlZW5UYWdzKE5VTEwsCi0JCQkJCQkJCVNBX1dpZHRoLHdpZHRoLAotCQkJCQkJCQlTQV9IZWlnaHQsaGVpZ2h0LAotCQkJCQkJCQlTQV9RdWlldCxUUlVFLFNBX1Nob3dUaXRsZSxGQUxTRSwKLQkJCQkJCQkJU0FfRGVwdGgsYnBwLAotCQkJCQkJCQlTQV9EaXNwbGF5SUQsb2tpZCwKLQkJCQkJCQkJVEFHX0RPTkUpOwotCi0JCQlpZighR0ZYX0Rpc3BsYXkpIHsKLQkJCQlHRlhfRGlzcGxheT1TRExfRGlzcGxheTsKLQkJCQlmbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0JCQkJZmxhZ3MgJj0gflNETF9ET1VCTEVCVUY7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlVbmxvY2tQdWJTY3JlZW4oTlVMTCxTRExfRGlzcGxheSk7Ci0JCQkJU0RMX0Rpc3BsYXk9R0ZYX0Rpc3BsYXk7Ci0JCi0JCQkJRChidWcoIlNjcmVlbiBvcGVuZWQuXG4iKSk7Ci0KLQkJCQlpZihmbGFncyZTRExfRE9VQkxFQlVGKSB7Ci0JCQkJCWludCBvaz0wOwotCQkJCQlEKGJ1ZygiU3RhcnQgb2YgREJ1ZmZlcmluZyBhbGxvY2F0aW9ucy4uLlxuIikpOwotCi0JCQkJCWlmKHRoaXMtPmhpZGRlbi0+U0JbMF09QWxsb2NTY3JlZW5CdWZmZXIoU0RMX0Rpc3BsYXksTlVMTCxTQl9TQ1JFRU5fQklUTUFQKSkgewotCi0JCQkJCQlpZih0aGlzLT5oaWRkZW4tPlNCWzFdPUFsbG9jU2NyZWVuQnVmZmVyKFNETF9EaXNwbGF5LE5VTEwsMEwpKSB7Ci0JCQkJCQkJZXh0ZXJuIHN0cnVjdCBNc2dQb3J0ICpzYWZlcG9ydCwqZGlzcHBvcnQ7Ci0KLQkJCQkJCQlzYWZlcG9ydD1DcmVhdGVNc2dQb3J0KCk7Ci0JCQkJCQkJZGlzcHBvcnQ9Q3JlYXRlTXNnUG9ydCgpOwotCi0JCQkJCQkJaWYoIXNhZmVwb3J0IHx8ICFkaXNwcG9ydCkgewotCQkJCQkJCQlpZihzYWZlcG9ydCkgewotCQkJCQkJCQkJRGVsZXRlTXNnUG9ydChzYWZlcG9ydCk7Ci0JCQkJCQkJCQlzYWZlcG9ydD1OVUxMOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKGRpc3Bwb3J0KSB7Ci0JCQkJCQkJCQlEZWxldGVNc2dQb3J0KGRpc3Bwb3J0KTsKLQkJCQkJCQkJCWRpc3Bwb3J0PU5VTEw7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJRnJlZVNjcmVlbkJ1ZmZlcihTRExfRGlzcGxheSx0aGlzLT5oaWRkZW4tPlNCWzBdKTsKLQkJCQkJCQkJRnJlZVNjcmVlbkJ1ZmZlcihTRExfRGlzcGxheSx0aGlzLT5oaWRkZW4tPlNCWzFdKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWV4dGVybiBVTE9ORyBzYWZlX3NpZ2JpdCxkaXNwX3NpZ2JpdDsKLQkJCQkJCQkJaW50IGk7Ci0KLQkJCQkJCQkJc2FmZV9zaWdiaXQ9MUw8PCBzYWZlcG9ydC0+bXBfU2lnQml0OwotCQkJCQkJCQlkaXNwX3NpZ2JpdD0xTDw8IGRpc3Bwb3J0LT5tcF9TaWdCaXQ7Ci0KLQkJCQkJCQkJZm9yKGk9MDtpPDI7aSsrKSB7Ci0JCQkJCQkJCQl0aGlzLT5oaWRkZW4tPlNCW2ldLT5zYl9EQnVmSW5mby0+ZGJpX1NhZmVNZXNzYWdlLm1uX1JlcGx5UG9ydD1zYWZlcG9ydDsKLQkJCQkJCQkJCXRoaXMtPmhpZGRlbi0+U0JbaV0tPnNiX0RCdWZJbmZvLT5kYmlfRGlzcE1lc3NhZ2UubW5fUmVwbHlQb3J0PWRpc3Bwb3J0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJb2s9MTsKLQkJCQkJCQkJRChidWcoIkRidWZmZXJpbmcgZW5hYmxlZCFcbiIpKTsKLQkJCQkJCQkJdGhpcy0+aGlkZGVuLT5kYnVmZmVyPTE7Ci0JCQkJCQkJCWN1cnJlbnQtPmZsYWdzfD1TRExfRE9VQkxFQlVGOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUZyZWVTY3JlZW5CdWZmZXIoU0RMX0Rpc3BsYXksdGhpcy0+aGlkZGVuLT5TQlsxXSk7Ci0JCQkJCQkJdGhpcy0+aGlkZGVuLT5TQlswXT1OVUxMOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYoIW9rKQotCQkJCQkJZmxhZ3MmPX5TRExfRE9VQkxFQlVGOwotCQkJCX0KLQkJCX0KLQotCQkJaWYoR2V0Q3liZXJNYXBBdHRyKFNETF9EaXNwbGF5LT5SYXN0UG9ydC5CaXRNYXAsQ1lCUk1BVFRSX0RFUFRIKT09YnBwKQotCQkJCXRoaXMtPmhpZGRlbi0+c2FtZV9mb3JtYXQ9MTsKLQkJfQotCi0JCWJwcD10aGlzLT5oaWRkZW4tPmRlcHRoPUdldEN5YmVyTWFwQXR0cihTRExfRGlzcGxheS0+UmFzdFBvcnQuQml0TWFwLENZQlJNQVRUUl9ERVBUSCk7Ci0JCUQoYnVnKCJTZXR0aW5nIHNjcmVlbiBkZXB0aCB0bzogJWxkXG4iLHRoaXMtPmhpZGRlbi0+ZGVwdGgpKTsKLQotCQlmb3IgKCBpID0gMDsgaSA8IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHM7IGkrKyApCi0JCQlpZiAoIHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5kZXB0aCA9PSBicHAgKSAvKiBlcmEgLmRlcHRoICovCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKCBpID09IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHMgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIk5vIG1hdGNoaW5nIHZpc3VhbCBmb3IgcmVxdWVzdGVkIGRlcHRoIik7Ci0JCQlyZXR1cm4gTlVMTDsJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCQl9Ci0JCVNETF9WaXN1YWwgPSB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0udmlzdWFsOwotCi0JfQotCi0JLyogU2V0IHVwIHRoZSBYMTEgd2luZG93ICovCi0Jc2F2ZWRfZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKLQotCWlmIChTRExfV2luZG93ICYmIChzYXZlZF9mbGFncyZTRExfT1BFTkdMKSA9PSAoZmxhZ3MmU0RMX09QRU5HTCkKLQkgICAgJiYgYnBwID09IGN1cnJlbnQtPmZvcm1hdC0+Qml0c1BlclBpeGVsICYmICFuZWVkY3JlYXRlKSB7Ci0JCWlmIChDR1hfUmVzaXplV2luZG93KHRoaXMsIGN1cnJlbnQsIHdpZHRoLCBoZWlnaHQsIGZsYWdzKSA8IDApIHsKLQkJCWN1cnJlbnQgPSBOVUxMOwotCQkJZ290byBkb25lOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKENHWF9DcmVhdGVXaW5kb3codGhpcyxjdXJyZW50LHdpZHRoLGhlaWdodCxicHAsZmxhZ3MpIDwgMCkgewotCQkJY3VycmVudCA9IE5VTEw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLSNpZiAwCi0JLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLwotCWlmICggKChjdXJyZW50LT53ICE9IHdpZHRoKSB8fCAoY3VycmVudC0+aCAhPSBoZWlnaHQpKSB8fAotICAgICAgICAgICAgICgoc2F2ZWRfZmxhZ3MmU0RMX09QRU5HTCkgIT0gKGZsYWdzJlNETF9PUEVOR0wpKSApIHsKLQkJY3VycmVudC0+dyA9IHdpZHRoOwotCQljdXJyZW50LT5oID0gaGVpZ2h0OwotCQljdXJyZW50LT5waXRjaCA9IFNETF9DYWxjdWxhdGVQaXRjaChjdXJyZW50KTsKLQkJQ0dYX1Jlc2l6ZUltYWdlKHRoaXMsIGN1cnJlbnQsIGZsYWdzKTsKLQl9Ci0jZW5kaWYKLQotCWN1cnJlbnQtPmZsYWdzIHw9IChmbGFncyZTRExfUkVTSVpBQkxFKTsgLy8gUmVzaXphYmxlIG9ubHkgaWYgdGhlIHVzZXIgYXNrZWQgaXQKLQotICBkb25lOgotCS8qIFJlbGVhc2UgdGhlIGV2ZW50IHRocmVhZCAqLwotCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKLQotCS8qIFdlJ3JlIGRvbmUhICovCi0JcmV0dXJuKGN1cnJlbnQpOwotfQotCi1zdGF0aWMgaW50IENHWF9Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgb24pCi17Ci0JVWludDMyIGV2ZW50X3RocmVhZDsKLQotCS8qIERvbid0IHN3aXRjaCBpZiB3ZSBkb24ndCBvd24gdGhlIHdpbmRvdyAqLwotCWlmICggU0RMX3dpbmRvd2lkICkgewotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyogRG9uJ3QgbG9jayBpZiB3ZSBhcmUgdGhlIGV2ZW50IHRocmVhZCAqLwotCWV2ZW50X3RocmVhZCA9IFNETF9FdmVudFRocmVhZElEKCk7Ci0JaWYgKCBldmVudF90aHJlYWQgJiYgKFNETF9UaHJlYWRJRCgpID09IGV2ZW50X3RocmVhZCkgKSB7Ci0JCWV2ZW50X3RocmVhZCA9IDA7Ci0JfQotCWlmICggZXZlbnRfdGhyZWFkICkgewotCQlTRExfTG9ja19FdmVudFRocmVhZCgpOwotCX0KLQlpZiAoIG9uICkgewotCQl0aGlzLT5zY3JlZW4tPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOwotCQlDR1hfRW50ZXJGdWxsU2NyZWVuKHRoaXMpOwotCX0gZWxzZSB7Ci0JCXRoaXMtPnNjcmVlbi0+ZmxhZ3MgJj0gflNETF9GVUxMU0NSRUVOOwotCQlDR1hfTGVhdmVGdWxsU2NyZWVuKHRoaXMpOwotCX0KLQotCUNHWF9SZWZyZXNoRGlzcGxheSh0aGlzKTsKLQlpZiAoIGV2ZW50X3RocmVhZCApIHsKLQkJU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotCX0KLQotCVNETF9SZXNldEtleWJvYXJkKCk7Ci0KLQlyZXR1cm4oMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNldFNpbmdsZUNvbG9yKFVpbnQzMiBmbXQsIHVuc2lnbmVkIGNoYXIgciwgdW5zaWduZWQgY2hhciBnLCB1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgKmMpCi17Ci0Jc3dpdGNoKGZtdCkKLQl7Ci0JCWNhc2UgUElYRk1UX0JHUjE1OgotCQljYXNlIFBJWEZNVF9SR0IxNVBDOgotCQkJewotCQkJCVVpbnQxNiAqdD0oVWludDE2ICopYzsKLQkJCQkqdD0ocj4+MykgfCAoKGc+PjMpPDw1KSB8ICgoYj4+Myk8PDEwKSA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQSVhGTVRfUkdCMTU6Ci0JCWNhc2UgUElYRk1UX0JHUjE1UEM6Ci0JCQl7Ci0JCQkJVWludDE2ICp0PShVaW50MTYgKiljOwotCQkJCSp0PShiPj4zKSB8ICgoZz4+Myk8PDUpIHwgKChyPj4zKTw8MTApIDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBJWEZNVF9CR1IxNlBDOgotCQljYXNlIFBJWEZNVF9SR0IxNjoKLQkJCXsKLQkJCQlVaW50MTYgKnQ9KFVpbnQxNiAqKWM7Ci0JCQkJKnQ9KGI+PjMpIHwgKChnPj4yKTw8NSkgfCAoKHI+PjMpPDwxMSkgOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUElYRk1UX0JHUjE2OgotCQljYXNlIFBJWEZNVF9SR0IxNlBDOgotCQkJewotCQkJCVVpbnQxNiAqdD0oVWludDE2ICopYzsKLQkJCQkqdD0ocj4+MykgfCAoKGc+PjIpPDw1KSB8ICgoYj4+Myk8PDExKSA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQSVhGTVRfUkdCMjQ6Ci0JCQljWzBdPXI7Ci0JCQljWzFdPWc7Ci0JCQljWzJdPWI7Ci0JCQljWzNdPTA7Ci0JCQlicmVhazsKLQkJY2FzZSBQSVhGTVRfQkdSMjQ6Ci0JCQljWzBdPWI7Ci0JCQljWzFdPWc7Ci0JCQljWzJdPXI7Ci0JCQljWzNdPTA7Ci0JCQlicmVhazsKLQkJY2FzZSBQSVhGTVRfQVJHQjMyOgotCQkJY1swXT0wOwotCQkJY1sxXT1yOwotCQkJY1syXT1nOwotCQkJY1szXT1iOwotCQkJYnJlYWs7Ci0JCWNhc2UgUElYRk1UX0JHUkEzMjoKLQkJCWNbMF09YjsKLQkJCWNbMV09ZzsKLQkJCWNbMl09cjsKLQkJCWNbM109MDsKLQkJCWJyZWFrOwotCQljYXNlIFBJWEZNVF9SR0JBMzI6Ci0JCQljWzBdPXI7Ci0JCQljWzFdPWc7Ci0JCQljWzJdPWI7Ci0JCQljWzNdPTA7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJRChidWcoIkVycm9yLCBTZXRTaW5nbGVDb2xvciB3aXRoIFBJWEZNVCAlbGQhXG4iLGZtdCkpOwotCX0KLX0KLQotLyogVXBkYXRlIHRoZSBjdXJyZW50IG1vdXNlIHN0YXRlIGFuZCBwb3NpdGlvbiAqLwotc3RhdGljIHZvaWQgQ0dYX1VwZGF0ZU1vdXNlKF9USElTKQotewotCS8qIExvY2sgdGhlIGV2ZW50IHRocmVhZCwgaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50cyAqLwotCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLQlpZihjdXJyZW50bHlfZnVsbHNjcmVlbikKLQl7Ci0JCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7Ci0JCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIFNETF9EaXNwbGF5LT5Nb3VzZVgsIFNETF9EaXNwbGF5LT5Nb3VzZVkpOwotCX0KLQllbHNlCi0JewotCQlpZigJU0RMX0Rpc3BsYXktPk1vdXNlWD49KFNETF9XaW5kb3ctPkxlZnRFZGdlK1NETF9XaW5kb3ctPkJvcmRlckxlZnQpICYmIFNETF9EaXNwbGF5LT5Nb3VzZVg8KFNETF9XaW5kb3ctPkxlZnRFZGdlK1NETF9XaW5kb3ctPldpZHRoLVNETF9XaW5kb3ctPkJvcmRlclJpZ2h0KSAmJgotCQkJU0RMX0Rpc3BsYXktPk1vdXNlWT49KFNETF9XaW5kb3ctPlRvcEVkZ2UrU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdCkgJiYgU0RMX0Rpc3BsYXktPk1vdXNlWTwoU0RMX1dpbmRvdy0+VG9wRWRnZStTRExfV2luZG93LT5IZWlnaHQtU0RMX1dpbmRvdy0+Qm9yZGVyQm90dG9tKQotCQkJKQotCQl7Ci0JCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7Ci0JCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIFNETF9EaXNwbGF5LT5Nb3VzZVgtU0RMX1dpbmRvdy0+TGVmdEVkZ2UtU0RMX1dpbmRvdy0+Qm9yZGVyTGVmdCwKLQkJCQkJCQkJCQlTRExfRGlzcGxheS0+TW91c2VZLVNETF9XaW5kb3ctPlRvcEVkZ2UtU0RMX1dpbmRvdy0+Qm9yZGVyVG9wKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQkJfQotCX0KLQlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci19Ci0KLXN0YXRpYyBpbnQgQ0dYX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKLXsKLQlpbnQgICAgICBpOwotCi0JLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBjb2xvcm1hcCBhbGxvY2F0ZWQgKi8KLQotCS8qIEl0J3MgZWFzeSBpZiB3ZSBoYXZlIGEgaGlkZGVuIGNvbG9ybWFwICovCi0JaWYgKCAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9IV1BBTEVUVEUpICYmIGN1cnJlbnRseV9mdWxsc2NyZWVuICkKLQl7Ci0JCVVMT05HICB4Y21hcFsyNTYqMysyXTsKLQotCQl4Y21hcFswXT0obmNvbG9yczw8MTYpOwotCQl4Y21hcFswXSs9Zmlyc3Rjb2xvcjsKLQotLy8JCUQoYnVnKCJTZXR0aW5nICVsZCBjb2xvcnMgb24gYW4gSFdQQUxFVFRFIHNjcmVlblxuIixuY29sb3JzKSk7Ci0KLQkJZm9yICggaT0wOyBpPG5jb2xvcnM7IGkrKyApIHsKLQkJCXhjbWFwW2kqMysxXSA9IGNvbG9yc1tpK2ZpcnN0Y29sb3JdLnI8PDI0OwotCQkJeGNtYXBbaSozKzJdID0gY29sb3JzW2krZmlyc3Rjb2xvcl0uZzw8MjQ7Ci0JCQl4Y21hcFtpKjMrM10gPSBjb2xvcnNbaStmaXJzdGNvbG9yXS5iPDwyNDsKLQkJfQotCQl4Y21hcFtuY29sb3JzKjMrMV09MDsKLQkJTG9hZFJHQjMyKCZHRlhfRGlzcGxheS0+Vmlld1BvcnQseGNtYXApOwotCX0gZWxzZSB7Ci0vLyBYUGl4ZWxzIGFyZSBub3QgbmVlZGVkIG9uIDhiaXQgc2NyZWVuIHdpdGggaHdwYWxldHRlCi0JCXVuc2lnbmVkIGxvbmcgcGl4ZWw7Ci0KLQkJaWYgKCBTRExfWFBpeGVscyA9PSBOVUxMICkgewotCQkJRChidWcoIlNldENvbG9ycyB3aXRob3V0IGNvbG9ybWFwISIpKTsKLQkJCXJldHVybigwKTsKLQkJfQotCi0JCWlmKHRoaXMtPmhpZGRlbi0+ZGVwdGg9PTgpCi0JCXsKLS8vIEluIHRoaXMgY2FzZSBJIGhhdmUgdG8gdW5hbGxvYyBhbmQgcmVhbGxvYyB0aGUgZnVsbCBwYWxldHRlCi0JCQlEKGJ1ZygiT2J0YWluaW5nICVsZCBjb2xvcnMgb24gdGhlIHNjcmVlblxuIixuY29sb3JzKSk7Ci0KLQkJLyogRnJlZSBleGlzdGluZyBhbGxvY2F0ZWQgY29sb3JzICovCi0JCQlmb3IgKCBwaXhlbD0wOyBwaXhlbDx0aGlzLT5zY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsgKytwaXhlbCApIHsKLQkJCQlpZihTRExfWFBpeGVsc1twaXhlbF0+PTApCi0JCQkJCVJlbGVhc2VQZW4oR0ZYX0Rpc3BsYXktPlZpZXdQb3J0LkNvbG9yTWFwLFNETF9YUGl4ZWxzW3BpeGVsXSk7Ci0JCQl9Ci0KLQkJLyogVHJ5IHRvIGFsbG9jYXRlIGFsbCB0aGUgY29sb3JzICovCi0JCQlmb3IgKCBpPTA7IGk8dGhpcy0+c2NyZWVuLT5mb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnM7ICsraSApIHsKLQkJCQlTRExfWFBpeGVsc1tpXT1PYnRhaW5CZXN0UGVuQShHRlhfRGlzcGxheS0+Vmlld1BvcnQuQ29sb3JNYXAsY29sb3JzW2ldLnI8PDI0LGNvbG9yc1tpXS5nPDwyNCxjb2xvcnNbaV0uYjw8MjQsTlVMTCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0jaWZuZGVmIFVTRV9DR1hfV1JJVEVMVVRQSVhFTAotCQkJVWludDMyIGZtdDsKLQkJCUQoYnVnKCJQcmVwYXJpbmcgYSBjb252ZXJzaW9uIHBpeGVsIHRhYmxlLi4uXG4iKSk7Ci0KLQkJCWZtdD1HZXRDeWJlck1hcEF0dHIoU0RMX0Rpc3BsYXktPlJhc3RQb3J0LkJpdE1hcCxDWUJSTUFUVFJfUElYRk1UKTsKLQotCQkJZm9yKGk9MDtpPG5jb2xvcnM7aSsrKQotCQkJewotCQkJCVNldFNpbmdsZUNvbG9yKGZtdCxjb2xvcnNbZmlyc3Rjb2xvcitpXS5yLGNvbG9yc1tmaXJzdGNvbG9yK2ldLmcsY29sb3JzW2ZpcnN0Y29sb3IraV0uYiwodW5zaWduZWQgY2hhciAqKSZTRExfWFBpeGVsc1tmaXJzdGNvbG9yK2ldKTsKLQkJCX0KLSNlbHNlCi0vLwkJCUQoYnVnKCJFeGVjdXRpbmcgWFBpeGVsKCVseCkgcmVtYXBwaW5nOiAoZnJvbSAlbGQsICVsZCBjb2xvcnMpIGZpcnN0OiByJWxkIGclbGQgYiVsZFxuIixTRExfWFBpeGVscyxmaXJzdGNvbG9yLG5jb2xvcnMsY29sb3JzW2ZpcnN0Y29sb3JdLnIsY29sb3JzW2ZpcnN0Y29sb3JdLmcsY29sb3JzW2ZpcnN0Y29sb3JdLmIpKTsKLQkJCWZvcihpPTA7aTxuY29sb3JzO2krKykKLQkJCQlTRExfWFBpeGVsc1tpK2ZpcnN0Y29sb3JdPShjb2xvcnNbZmlyc3Rjb2xvcitpXS5yPDwxNikrKGNvbG9yc1tmaXJzdGNvbG9yK2ldLmc8PDgpK2NvbG9yc1tmaXJzdGNvbG9yK2ldLmI7Ci0jZW5kaWYKLQkJfQotCX0KLQotLy8gQWN0dWFsbHkgaXQgY2Fubm90IGZhaWwhCi0KLQlyZXR1cm4gMTsKLX0KLQotLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCi0gICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCi0qLwotc3RhdGljIHZvaWQgQ0dYX1ZpZGVvUXVpdChfVEhJUykKLXsKLQkvKiBTaHV0ZG93biBldmVyeXRoaW5nIHRoYXQncyBzdGlsbCB1cCAqLwotCS8qIFRoZSBldmVudCB0aHJlYWQgc2hvdWxkIGJlIGRvbmUsIHNvIHdlIGNhbiB0b3VjaCBTRExfRGlzcGxheSAqLwotCUQoYnVnKCJDR1hfVmlkZW9RdWl0XG4iKSk7Ci0KLQlpZiAoIFNETF9EaXNwbGF5ICE9IE5VTEwgKSB7Ci0JCS8qIENsZWFuIHVwIE9wZW5HTCAqLwotCQlpZih0aGlzLT5nbF9kYXRhLT5nbF9hY3RpdmUgPT0gMSkgewotCQkJQ0dYX0dMX1F1aXQodGhpcyk7Ci0JCX0KLQkJLyogU3RhcnQgc2h1dHRpbmcgZG93biB0aGUgd2luZG93cyAqLwotCQlEKGJ1ZygiRGVzdHJveWluZyBpbWFnZS4uLlxuIikpOwotCQlDR1hfRGVzdHJveUltYWdlKHRoaXMsIHRoaXMtPnNjcmVlbik7Ci0JCUQoYnVnKCJEZXN0cm95aW5nIHdpbmRvdy4uLlxuIikpOwotCQlDR1hfRGVzdHJveVdpbmRvdyh0aGlzLCB0aGlzLT5zY3JlZW4pOwotLy8gT3RoZXJ3aXNlIFNETF9WaWRlb1F1aXQgd2lsbCB0cnkgdG8gZnJlZSBpdCEKLQkJU0RMX1ZpZGVvU3VyZmFjZT1OVUxMOwotCi0JCUNHWF9GcmVlVmlkZW9Nb2Rlcyh0aGlzKTsKLQotCQkvKiBGcmVlIHRoYXQgYmxhbmsgY3Vyc29yICovCi0JCWlmICggU0RMX0JsYW5rQ3Vyc29yICE9IE5VTEwgKSB7Ci0JCQlGcmVlTWVtKFNETF9CbGFua0N1cnNvciwxNik7Ci0JCQlTRExfQmxhbmtDdXJzb3IgPSBOVUxMOwotCQl9Ci0KLQkJLyogQ2xvc2UgdGhlIFgxMSBncmFwaGljcyBjb25uZWN0aW9uICovCi0JCXRoaXMtPmhpZGRlbi0+c2FtZV9mb3JtYXQ9MDsKLQotCQlEKGJ1ZygiRGVzdHJveWluZyBzY3JlZW4uLi5cbiIpKTsKLQotCQlpZiAoIEdGWF9EaXNwbGF5ICE9IE5VTEwgKQotCQkJRGVzdHJveVNjcmVlbih0aGlzKTsKLQotCQkvKiBDbG9zZSB0aGUgWDExIGRpc3BsYXkgY29ubmVjdGlvbiAqLwotCQlTRExfRGlzcGxheSA9IE5VTEw7Ci0KLQkJLyogVW5sb2FkIEdMIGxpYnJhcnkgYWZ0ZXIgWDExIHNodXRzIGRvd24gKi8KLQl9Ci0KLQlEKGJ1ZygiQ2xvc2luZyBsaWJyYXJpZXMuLi5cbiIpKTsKLQotCWlmKCBDeWJlckdmeEJhc2UpIHsKLQkJQ2xvc2VMaWJyYXJ5KEN5YmVyR2Z4QmFzZSk7Ci0JCUN5YmVyR2Z4QmFzZT1OVUxMOwotCX0KLQotCWlmIChJbnR1aXRpb25CYXNlKSB7Ci0JCUNsb3NlTGlicmFyeSgoc3RydWN0IExpYnJhcnkgKilJbnR1aXRpb25CYXNlKTsKLQkJSW50dWl0aW9uQmFzZT1OVUxMOwotCX0KLQlpZiAoR2Z4QmFzZSkgewotCQlDbG9zZUxpYnJhcnkoKHN0cnVjdCBMaWJyYXJ5ICopR2Z4QmFzZSk7Ci0JCUdmeEJhc2U9TlVMTDsKLQl9Ci0KLQlpZiAoIHRoaXMtPnNjcmVlbiAmJiAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICkgewotCQkvKiBEaXJlY3Qgc2NyZWVuIGFjY2Vzcywgbm8gbWVtb3J5IGJ1ZmZlciAqLwotCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IE5VTEw7Ci0JfQotCUQoYnVnKCJFbmQgb2YgQ0dYX1ZpZGVvUXVpdC5cbiIpKTsKLQotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9jZ3h2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4dmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmNzZlYS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9jZ3h2aWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfY2d4dmlkZW9faAotI2RlZmluZSBfU0RMX2NneHZpZGVvX2gKLQotCi0jaW5jbHVkZSA8ZXhlYy9leGVjLmg+Ci0jaW5jbHVkZSA8Y3liZXJncmFwaHgvY3liZXJncmFwaGljcy5oPgotI2luY2x1ZGUgPGdyYXBoaWNzL3NjYWxlLmg+Ci0jaW5jbHVkZSA8Z3JhcGhpY3MvZ2Z4Lmg+Ci0jaW5jbHVkZSA8aW50dWl0aW9uL2ludHVpdGlvbi5oPgotI2lmIGRlZmluZWQoX19TQVNDKSB8fCBkZWZpbmVkKFNUT1JNQzRfV09TKQotI2luY2x1ZGUgPHByb3RvL2V4ZWMuaD4KLSNpbmNsdWRlIDxwcm90by9jeWJlcmdyYXBoaWNzLmg+Ci0jaW5jbHVkZSA8cHJvdG8vZ3JhcGhpY3MuaD4KLSNpbmNsdWRlIDxwcm90by9pbnR1aXRpb24uaD4KLSNpbmNsdWRlIDxwcm90by9jb25zb2xlLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGlubGluZS9leGVjLmg+Ci0jaW5jbHVkZSA8aW5saW5lL2N5YmVyZ3JhcGhpY3MuaD4KLSNpbmNsdWRlIDxpbmxpbmUvZ3JhcGhpY3MuaD4KLSNpbmNsdWRlIDxpbmxpbmUvaW50dWl0aW9uLmg+Ci0jaW5jbHVkZSA8aW5saW5lL2NvbnNvbGUuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAibXlkZWJ1Zy5oIgotCi0jZGVmaW5lIFVTRV9DR1hfV1JJVEVMVVRQSVhFTAotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotICAgIHN0cnVjdCBTY3JlZW4gKlB1YmxpY19EaXNwbGF5OyAvKiBVc2VkIGZvciBldmVudHMgYW5kIHdpbmRvdyBtYW5hZ2VtZW50ICovCi0gICAgc3RydWN0IFNjcmVlbiAqR0ZYX0Rpc3BsYXk7CS8qIFVzZWQgZm9yIGdyYXBoaWNzIGFuZCBjb2xvcm1hcCBzdHVmZiAqLwotICAgIFVpbnQzMiBTRExfVmlzdWFsVW51c2VkOwkJLyogVGhlIHZpc3VhbCB1c2VkIGJ5IG91ciB3aW5kb3cgKi8KLSAgICBzdHJ1Y3QgV2luZG93ICpTRExfV2luZG93OwkvKiBTaGFyZWQgYnkgYm90aCBkaXNwbGF5cyAobm8gWCBzZWN1cml0eT8pICovCi0gICAgdW5zaWduZWQgY2hhciAqQmxhbmtDdXJzb3I7CS8qIFRoZSBpbnZpc2libGUgY3Vyc29yICovCi0KLSAgICBjaGFyICpTRExfd2luZG93aWQ7CQkvKiBGbGFnOiB0cnVlIGlmIHdlIGhhdmUgYmVlbiBwYXNzZWQgYSB3aW5kb3cgKi8KLQotICAgIC8qIFRoZSB2YXJpYWJsZXMgdXNlZCBmb3IgZGlzcGxheWluZyBncmFwaGljcyAqLwotICAgIFVpbnQ4ICpYaW1hZ2U7CQkvKiBUaGUgWCBpbWFnZSBmb3Igb3VyIHdpbmRvdyAqLwotICAgIGludCBzd2FwX3BpeGVsczsJCS8qIEZsYWc6IHRydWUgaWYgZGlzcGxheSBpcyBzd2FwcGVkIGVuZGlhbiAqLwotCi0gICAgLyogU3VwcG9ydCBmb3IgaW50ZXJuYWwgbW91c2Ugd2FycGluZyAqLwotICAgIHN0cnVjdCB7Ci0gICAgICAgIGludCB4OwotICAgICAgICBpbnQgeTsKLSAgICB9IG1vdXNlX2xhc3Q7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgaW50IG51bWVyYXRvcjsKLSAgICAgICAgaW50IGRlbm9taW5hdG9yOwotICAgICAgICBpbnQgdGhyZXNob2xkOwotICAgIH0gbW91c2VfYWNjZWw7Ci0gICAgaW50IG1vdXNlX3JlbGF0aXZlOwotCi0gICAgLyogVGhlIGN1cnJlbnQgbGlzdCBvZiBhdmFpbGFibGUgdmlkZW8gbW9kZXMgKi8KLSAgICBTRExfUmVjdCAqKm1vZGVsaXN0OwotCi0gICAgLyogYXZhaWxhYmxlIHZpc3VhbHMgb2YgaW50ZXJlc3QgdG8gdXMsIHNvcnRlZCBkZWVwZXN0IGZpcnN0ICovCi0gICAgc3RydWN0IHsKLQkJVWludDMyIHZpc3VhbDsKLQkJaW50IGRlcHRoOwkJLyogbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMvcGl4ZWwgKi8KLQkJaW50IGJwcDsJCS8qIHBpeGVsIHF1YW50dW0gaW4gYml0cyAqLwotICAgIH0gdmlzdWFsc1s1XTsJCS8qIGF0IG1vc3QgZW50cmllcyBmb3IgOCwgMTUsIDE2LCAyNCAqLwotICAgIGludCBudmlzdWFsczsKLQotICAgIFVpbnQzMiB2aXM7CQkvKiBjdXJyZW50IHZpc3VhbCBpbiB1c2UgKi8KLSAgICBpbnQgZGVwdGg7CQkJLyogY3VycmVudCB2aXN1YWwgZGVwdGggKG5vdCBicHApICovCi0gICAgaW50IEJ5dGVzUGVyUGl4ZWw7Ci0gICAgaW50IGN1cnJlbnRseV9mdWxsc2NyZWVuLHNhbWVfZm9ybWF0LGRidWZmZXI7Ci0KLSAgICAvKiBBdXRvbWF0aWMgbW9kZSBzd2l0Y2hpbmcgc3VwcG9ydCAoZW50ZXJpbmcvbGVhdmluZyBmdWxsc2NyZWVuKSAqLwotICAgIFVpbnQzMiBzd2l0Y2hfd2FpdGluZzsKLSAgICBVaW50MzIgc3dpdGNoX3RpbWU7Ci0KLSAgICAvKiBQcmV2ZW50IHRvbyBtYW55IFhTeW5jKCkgY2FsbHMgKi8KLSAgICBpbnQgYmxpdF9xdWV1ZWQ7Ci0KLSAgICAvKiBDb2xvcm1hcCBoYW5kbGluZyAqLwotICAgIExPTkcgUGVuczsKLSAgICBTaW50MzIgKlhQaXhlbHM7CQkvKiBBIGxpc3Qgb2YgcGl4ZWxzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCwgdGhlIHNpemUgZGVwZW5kcyBvbiB0aGUgc2NyZWVuIGZvcm1hdCAqLwotCXN0cnVjdCBTY3JlZW5CdWZmZXIgKlNCWzJdOwotCXN0cnVjdCBSYXN0UG9ydCAqUlA7Ci0gICAgc2hvcnQgKmljb25jb2xvcnM7CQkvKiBMaXN0IG9mIGNvbG9ycyB1c2VkIGJ5IHRoZSBpY29uICovCi19OwotCi0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgbG9jYWxfWDExCQkodGhpcy0+aGlkZGVuLT5sb2NhbF9YMTEpCi0jZGVmaW5lIFNETF9EaXNwbGF5CQkodGhpcy0+aGlkZGVuLT5QdWJsaWNfRGlzcGxheSkKLSNkZWZpbmUgR0ZYX0Rpc3BsYXkJCSh0aGlzLT5oaWRkZW4tPkdGWF9EaXNwbGF5KQotI2RlZmluZSBTRExfU2NyZWVuCQlEZWZhdWx0U2NyZWVuKHRoaXMtPmhpZGRlbi0+UHVibGljX0Rpc3BsYXkpCi0KLSNkZWZpbmUgU0RMX1Zpc3VhbAkJKHRoaXMtPmhpZGRlbi0+dmlzKQotCi0jZGVmaW5lIFNETF9Sb290CQlSb290V2luZG93KFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKQotI2RlZmluZSBXTXdpbmRvdwkJKHRoaXMtPmhpZGRlbi0+V013aW5kb3cpCi0jZGVmaW5lIEZTd2luZG93CQkodGhpcy0+aGlkZGVuLT5GU3dpbmRvdykKLSNkZWZpbmUgU0RMX1dpbmRvdwkJKHRoaXMtPmhpZGRlbi0+U0RMX1dpbmRvdykKLSNkZWZpbmUgV01fREVMRVRFX1dJTkRPVwkodGhpcy0+aGlkZGVuLT5XTV9ERUxFVEVfV0lORE9XKQotI2RlZmluZSBTRExfQmxhbmtDdXJzb3IJCSh0aGlzLT5oaWRkZW4tPkJsYW5rQ3Vyc29yKQotI2RlZmluZSBTRExfd2luZG93aWQJCSh0aGlzLT5oaWRkZW4tPlNETF93aW5kb3dpZCkKLSNkZWZpbmUgU0RMX1hpbWFnZQkJKHRoaXMtPmhpZGRlbi0+WGltYWdlKQotI2RlZmluZSBTRExfR0MJCQkodGhpcy0+aGlkZGVuLT5nYykKLSNkZWZpbmUgc3dhcF9waXhlbHMJCSh0aGlzLT5oaWRkZW4tPnN3YXBfcGl4ZWxzKQotI2RlZmluZSBtb3VzZV9sYXN0CQkodGhpcy0+aGlkZGVuLT5tb3VzZV9sYXN0KQotI2RlZmluZSBtb3VzZV9hY2NlbAkJKHRoaXMtPmhpZGRlbi0+bW91c2VfYWNjZWwpCi0jZGVmaW5lIG1vdXNlX3JlbGF0aXZlCQkodGhpcy0+aGlkZGVuLT5tb3VzZV9yZWxhdGl2ZSkKLSNkZWZpbmUgU0RMX21vZGVsaXN0CQkodGhpcy0+aGlkZGVuLT5tb2RlbGlzdCkKLSNkZWZpbmUgU0RMX1Jhc3RQb3J0CQkodGhpcy0+aGlkZGVuLT5SUCkKLSNkZWZpbmUgc2F2ZWRfbW9kZQkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfbW9kZSkKLSNkZWZpbmUgc2F2ZWRfdmlldwkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfdmlldykKLSNkZWZpbmUgY3VycmVudGx5X2Z1bGxzY3JlZW4JKHRoaXMtPmhpZGRlbi0+Y3VycmVudGx5X2Z1bGxzY3JlZW4pCi0jZGVmaW5lIGJsaXRfcXVldWVkCQkodGhpcy0+aGlkZGVuLT5ibGl0X3F1ZXVlZCkKLSNkZWZpbmUgU0RMX0Rpc3BsYXlDb2xvcm1hcAkodGhpcy0+aGlkZGVuLT5HRlhfRGlzcGxheS0+Vmlld1BvcnQuQ29sb3JNYXApCi0jZGVmaW5lIFNETF9YUGl4ZWxzCQkodGhpcy0+aGlkZGVuLT5YUGl4ZWxzKQotI2RlZmluZSBTRExfaWNvbmNvbG9ycwkJKHRoaXMtPmhpZGRlbi0+aWNvbmNvbG9ycykKLQotLyogVXNlZCB0byBnZXQgdGhlIFggY3Vyc29yIGZyb20gYSB3aW5kb3ctbWFuYWdlciBzcGVjaWZpYyBjdXJzb3IgKi8KLS8vIGV4dGVybiBDdXJzb3IgU0RMX0dldFdNWEN1cnNvcihXTWN1cnNvciAqY3Vyc29yKTsKLQotZXh0ZXJuIGludCBDR1hfQ3JlYXRlV2luZG93KF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuLAotCQkJICAgIGludCB3LCBpbnQgaCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLWV4dGVybiBpbnQgQ0dYX1Jlc2l6ZVdpbmRvdyhfVEhJUywKLQkJCVNETF9TdXJmYWNlICpzY3JlZW4sIGludCB3LCBpbnQgaCwgVWludDMyIGZsYWdzKTsKLQotZXh0ZXJuIHZvaWQgQ0dYX0Rlc3Ryb3lXaW5kb3coX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4pOwotCi1leHRlcm4gc3RydWN0IExpYnJhcnkgKkN5YmVyR2Z4QmFzZTsKLWV4dGVybiBzdHJ1Y3QgSW50dWl0aW9uQmFzZSAqSW50dWl0aW9uQmFzZTsKLWV4dGVybiBzdHJ1Y3QgR2Z4QmFzZSAqR2Z4QmFzZTsKLWV4dGVybiBzdHJ1Y3QgRXhlY0Jhc2UgKlN5c0Jhc2U7Ci1leHRlcm4gc3RydWN0IERvc0xpYnJhcnkgKkRPU0Jhc2U7Ci0KLXN0cnVjdCBwcml2YXRlX2h3ZGF0YQotewotCXN0cnVjdCBCaXRNYXAgKmJtYXA7Ci0JQVBUUiBsb2NrOwotCXN0cnVjdCBTRExfVmlkZW9EZXZpY2UgKnZpZGVvZGF0YTsKLQlBUFRSIG1hc2s7Ci0JaW50IGFsbG9jYXRlZDsKLX07Ci0KLWludCBDR1hfQ2hlY2tIV0JsaXQoX1RISVMsU0RMX1N1cmZhY2UgKnNyYyxTRExfU3VyZmFjZSAqZHN0KTsKLWludCBDR1hfRmlsbEhXUmVjdChfVEhJUyxTRExfU3VyZmFjZSAqZHN0LFNETF9SZWN0ICpkc3RyZWN0LFVpbnQzMiBjb2xvcik7Ci1pbnQgQ0dYX1NldEhXQ29sb3JLZXkoX1RISVMsU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBrZXkpOwotI2VuZGlmIC8qIF9TRExfeDExdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4d20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneHdtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YTdkNjAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9jeWJlcmdmeC9TRExfY2d4d20uYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3ZlcnNpb24uaCIKLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfc3lzd20uaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiU0RMX2NneG1vZGVzX2MuaCIKLSNpbmNsdWRlICJTRExfY2d4d21fYy5oIgotCi0vKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3Igd29ya2luZyBwcm9wZXJseSB3aXRoIEVubGlnaHRlbm1lbnQsIGV0Yy4gKi8KLSNkZWZpbmUgVVNFX0lDT05fV0lORE9XCi0KLXZvaWQgQ0dYX1NldEljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzaykKLXsKLS8qIE5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KLX0KLQotdm9pZCBDR1hfU2V0Q2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pCi17Ci0JaWYoU0RMX1dpbmRvdykKLQkJU2V0V2luZG93VGl0bGVzKFNETF9XaW5kb3csKGNoYXIgKil0aXRsZSxOVUxMKTsKLX0KLQotLyogSWNvbmlmeSB0aGUgd2luZG93ICovCi1pbnQgQ0dYX0ljb25pZnlXaW5kb3coX1RISVMpCi17Ci0vKiBOb3QgeWV0IGltcGxlbWVudGVkICovCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBDR1hfR2V0V01JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKQotewotCWlmICggaW5mby0+dmVyc2lvbi5tYWpvciA8PSBTRExfTUFKT1JfVkVSU0lPTiApIHsKLQkJcmV0dXJuKDEpOwotCX0gZWxzZSB7Ci0JCVNETF9TZXRFcnJvcigiQXBwbGljYXRpb24gbm90IGNvbXBpbGVkIHdpdGggU0RMICVkLiVkXG4iLAotCQkJCQlTRExfTUFKT1JfVkVSU0lPTiwgU0RMX01JTk9SX1ZFUlNJT04pOwotCQlyZXR1cm4oLTEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneHdtX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vY3liZXJnZngvU0RMX2NneHdtX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkMWE2MS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2N5YmVyZ2Z4L1NETF9jZ3h3bV9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9jZ3h2aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KLWV4dGVybiB2b2lkIENHWF9TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7Ci1leHRlcm4gdm9pZCBDR1hfU2V0SWNvbihfVEhJUywgU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKTsKLWV4dGVybiBpbnQgQ0dYX0ljb25pZnlXaW5kb3coX1RISVMpOwotZXh0ZXJuIFNETF9HcmFiTW9kZSBDR1hfR3JhYklucHV0Tm9Mb2NrKF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7Ci1leHRlcm4gU0RMX0dyYWJNb2RlIENHWF9HcmFiSW5wdXQoX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKTsKLWV4dGVybiBpbnQgQ0dYX0dldFdNSW5mbyhfVEhJUywgU0RMX1N5c1dNaW5mbyAqaW5mbyk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGMvU0RMX2RjZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RjL1NETF9kY2V2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZThlMmI1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGMvU0RMX2RjZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTREwuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfZGN2aWRlby5oIgotI2luY2x1ZGUgIlNETF9kY2V2ZW50c19jLmgiCi0KLSNpbmNsdWRlIDxkYy9tYXBsZS5oPgotI2luY2x1ZGUgPGRjL21hcGxlL21vdXNlLmg+Ci0jaW5jbHVkZSA8ZGMvbWFwbGUva2V5Ym9hcmQuaD4KLQotY29uc3Qgc3RhdGljIHVuc2lnbmVkIHNob3J0IHNkbF9rZXlbXT0gewotCS8qMCovCTAsIDAsIDAsIDAsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsCi0JCSdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLAotCQkndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLAotCS8qMWUqLwknMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMCcsCi0JLyoyOCovCVNETEtfUkVUVVJOLCBTRExLX0VTQ0FQRSwgU0RMS19CQUNLU1BBQ0UsIFNETEtfVEFCLCBTRExLX1NQQUNFLCBTRExLX01JTlVTLCBTRExLX1BMVVMsIFNETEtfTEVGVEJSQUNLRVQsIAotCVNETEtfUklHSFRCUkFDS0VULCBTRExLX0JBQ0tTTEFTSCAsIDAsIFNETEtfU0VNSUNPTE9OLCBTRExLX1FVT1RFLAotCS8qMzUqLwknficsIFNETEtfQ09NTUEsIFNETEtfUEVSSU9ELCBTRExLX1NMQVNILCBTRExLX0NBUFNMT0NLLCAKLQlTRExLX0YxLCBTRExLX0YyLCBTRExLX0YzLCBTRExLX0Y0LCBTRExLX0Y1LCBTRExLX0Y2LCBTRExLX0Y3LCBTRExLX0Y4LCBTRExLX0Y5LCBTRExLX0YxMCwgU0RMS19GMTEsIFNETEtfRjEyLAotCS8qNDYqLwlTRExLX1BSSU5ULCBTRExLX1NDUk9MTE9DSywgU0RMS19QQVVTRSwgU0RMS19JTlNFUlQsIFNETEtfSE9NRSwgU0RMS19QQUdFVVAsIFNETEtfREVMRVRFLCBTRExLX0VORCwgU0RMS19QQUdFRE9XTiwgU0RMS19SSUdIVCwgU0RMS19MRUZULCBTRExLX0RPV04sIFNETEtfVVAsCi0JLyo1MyovCVNETEtfTlVNTE9DSywgU0RMS19LUF9ESVZJREUsIFNETEtfS1BfTVVMVElQTFksIFNETEtfS1BfTUlOVVMsIFNETEtfS1BfUExVUywgU0RMS19LUF9FTlRFUiwgCi0JU0RMS19LUDEsIFNETEtfS1AyLCBTRExLX0tQMywgU0RMS19LUDQsIFNETEtfS1A1LCBTRExLX0tQNiwKLQkvKjVmKi8JU0RMS19LUDcsIFNETEtfS1A4LCBTRExLX0tQOSwgU0RMS19LUDAsIFNETEtfS1BfUEVSSU9ELCAwIC8qIFMzICovCi19OwotCi1jb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2RsX3NoaWZ0W10gPSB7Ci0JU0RMS19MQ1RSTCxTRExLX0xTSElGVCxTRExLX0xBTFQsMCAvKiBTMSAqLywKLQlTRExLX1JDVFJMLFNETEtfUlNISUZULFNETEtfUkFMVCwwIC8qIFMyICovLAotfTsKLQotI2RlZmluZQlNT1VTRV9XSEVFTFVQIAkoMTw8NCkKLSNkZWZpbmUJTU9VU0VfV0hFRUxET1dOCSgxPDw1KQotCi1zdGF0aWMgdm9pZCBtb3VzZV91cGRhdGUodm9pZCkKLXsKLWNvbnN0CXN0YXRpYyBjaGFyIHNkbF9tb3VzZWJ0bltdID0gewotCU1PVVNFX0xFRlRCVVRUT04sCi0JTU9VU0VfUklHSFRCVVRUT04sCi0JTU9VU0VfU0lERUJVVFRPTiwKLQlNT1VTRV9XSEVFTFVQLAotCU1PVVNFX1dIRUVMRE9XTgotfTsKLQotCXVpbnQ4IGFkZHI7Ci0JbW91c2VfY29uZF90CWNvbmQ7Ci0KLQlzdGF0aWMgaW50IHByZXZfYnV0dG9uczsKLQlpbnQgYnV0dG9ucyxjaGFuZ2VkOwotCWludCBpOwotCi0JaWYgKChhZGRyID0gbWFwbGVfZmlyc3RfbW91c2UoKSk9PTAgfHwgbW91c2VfZ2V0X2NvbmQoYWRkciwgJmNvbmQpPDApIHJldHVybjsKLQotCWJ1dHRvbnMgPSBjb25kLmJ1dHRvbnNeMHhmZjsKLQlpZiAoY29uZC5kejwwKSBidXR0b25zfD1NT1VTRV9XSEVFTFVQOwotCWlmIChjb25kLmR6PjApIGJ1dHRvbnN8PU1PVVNFX1dIRUVMRE9XTjsKLQotCWlmIChjb25kLmR4fHxjb25kLmR5KSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsMSxjb25kLmR4LGNvbmQuZHkpOwotCi0JY2hhbmdlZCA9IGJ1dHRvbnNecHJldl9idXR0b25zOwotCWZvcihpPTA7aTxzaXplb2Yoc2RsX21vdXNlYnRuKTtpKyspIHsKLQkJaWYgKGNoYW5nZWQgJiBzZGxfbW91c2VidG5baV0pIHsKLQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oKGJ1dHRvbnMgJiBzZGxfbW91c2VidG5baV0pP1NETF9QUkVTU0VEOlNETF9SRUxFQVNFRCxpLDAsMCk7Ci0JCX0KLQl9Ci0JcHJldl9idXR0b25zID0gYnV0dG9uczsKLX0KLQotc3RhdGljIHZvaWQga2V5Ym9hcmRfdXBkYXRlKHZvaWQpCi17Ci0Jc3RhdGljIGtiZF9zdGF0ZV90CW9sZF9zdGF0ZTsKLQlzdGF0aWMgdWludDggb2xkX2FkZHI7Ci0KLQlrYmRfc3RhdGVfdAkqc3RhdGU7Ci0JdWludDgJYWRkcjsKLQlpbnQJcG9ydCx1bml0OwotCi0JaW50IHNoaWZ0a2V5czsKLQlTRExfa2V5c3ltIGtleXN5bTsKLQotCWludCBpOwotCi0JYWRkciA9IG1hcGxlX2ZpcnN0X2tiKCk7Ci0KLQlpZiAoYWRkcj09MCkgcmV0dXJuOwotCi0JaWYgKGFkZHIhPW9sZF9hZGRyKSB7Ci0JCW9sZF9hZGRyID0gYWRkcjsKLQkJU0RMX21lbXNldCgmb2xkX3N0YXRlLDAsc2l6ZW9mKG9sZF9zdGF0ZSkpOwotCX0KLQotCW1hcGxlX3JhZGRyKGFkZHIsJnBvcnQsJnVuaXQpOwotCi0Jc3RhdGUgPSBtYXBsZV9kZXZfc3RhdGUocG9ydCx1bml0KTsKLQlpZiAoIXN0YXRlKSByZXR1cm47Ci0KLQlzaGlmdGtleXMgPSBzdGF0ZS0+c2hpZnRfa2V5cyBeIG9sZF9zdGF0ZS5zaGlmdF9rZXlzOwotCWZvcihpPTA7aTxzaXplb2Yoc2RsX3NoaWZ0KTtpKyspIHsKLQkJaWYgKChzaGlmdGtleXM+PmkpJjEpIHsKLQkJCWtleXN5bS5zeW0gPSBzZGxfc2hpZnRbaV07Ci0JCQlTRExfUHJpdmF0ZUtleWJvYXJkKCgoc3RhdGUtPnNoaWZ0X2tleXM+PmkpJjEpP1NETF9QUkVTU0VEOlNETF9SRUxFQVNFRCwma2V5c3ltKTsKLQkJfQotCX0KLQotCWZvcihpPTA7aTxzaXplb2Yoc2RsX2tleSk7aSsrKSB7Ci0JCWlmIChzdGF0ZS0+bWF0cml4W2ldIT1vbGRfc3RhdGUubWF0cml4W2ldKSB7Ci0JCQlpbnQga2V5ID0gc2RsX2tleVtpXTsKLQkJCWlmIChrZXkpIHsKLQkJCQlrZXlzeW0uc3ltID0ga2V5OwotCQkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoc3RhdGUtPm1hdHJpeFtpXT9TRExfUFJFU1NFRDpTRExfUkVMRUFTRUQsJmtleXN5bSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlvbGRfc3RhdGUgPSAqc3RhdGU7Ci19Ci0KLXZvaWQgRENfUHVtcEV2ZW50cyhfVEhJUykKLXsKLQlrZXlib2FyZF91cGRhdGUoKTsKLQltb3VzZV91cGRhdGUoKTsKLX0KLQotdm9pZCBEQ19Jbml0T1NLZXltYXAoX1RISVMpCi17Ci0JLyogZG8gbm90aGluZy4gKi8KLX0KLQotLyogZW5kIG9mIFNETF9kY2V2ZW50cy5jIC4uLiAqLwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RjL1NETF9kY2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RjL1NETF9kY2V2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGM2ZDYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kYy9TRExfZGNldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfZGN2aWRlby5oIgotCi0vKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfc3lzZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCi0gICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX3N5c3ZpZGVvLmMpCi0qLwotZXh0ZXJuIHZvaWQgRENfSW5pdE9TS2V5bWFwKF9USElTKTsKLWV4dGVybiB2b2lkIERDX1B1bXBFdmVudHMoX1RISVMpOwotCi0vKiBlbmQgb2YgU0RMX2RjZXZlbnRzX2MuaCAuLi4gKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kYy9TRExfZGNtb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kYy9TRExfZGNtb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2I5NjlkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGMvU0RMX2RjbW91c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotI2luY2x1ZGUgIlNETF9kY21vdXNlX2MuaCIKLQotCi0vKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KLXN0cnVjdCBXTWN1cnNvciB7Ci0JaW50IHVudXNlZDsKLX07CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RjL1NETF9kY21vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGMvU0RMX2RjbW91c2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTg1Yzc1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGMvU0RMX2RjbW91c2VfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfZGN2aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGMvU0RMX2RjdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGMvU0RMX2RjdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4ODRjMy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RjL1NETF9kY3ZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0KLSNpbmNsdWRlICJTRExfZGN2aWRlby5oIgotI2luY2x1ZGUgIlNETF9kY2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX2RjbW91c2VfYy5oIgotCi0jaW5jbHVkZSA8ZGMvdmlkZW8uaD4KLSNpbmNsdWRlIDxkYy9wdnIuaD4KLQotCi0vKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRENfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOwotc3RhdGljIFNETF9SZWN0ICoqRENfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqRENfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIGludCBEQ19TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpOwotc3RhdGljIHZvaWQgRENfVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRENfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgRENfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgRENfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBEQ19GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IERDX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLQotLyogZXRjLiAqLwotc3RhdGljIHZvaWQgRENfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotLyogT3BlbkdMICovCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotc3RhdGljIHZvaWQgKkRDX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyICpwcm9jKTsKLXN0YXRpYyBpbnQgRENfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIgKnBhdGgpOwotc3RhdGljIGludCBEQ19HTF9HZXRBdHRyaWJ1dGUoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKTsKLXN0YXRpYyB2b2lkIERDX0dMX1N3YXBCdWZmZXJzKF9USElTKTsKLSNlbmRpZgotCi0vKiBEQyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IERDX0F2YWlsYWJsZSh2b2lkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBEQ19EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKkRDX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLQlpZiAoIGRldmljZSApIHsKLQkJU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOwotCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0JfQotCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIGRldmljZSApIHsKLQkJCVNETF9mcmVlKGRldmljZSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCWRldmljZS0+VmlkZW9Jbml0ID0gRENfVmlkZW9Jbml0OwotCWRldmljZS0+TGlzdE1vZGVzID0gRENfTGlzdE1vZGVzOwotCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gRENfU2V0VmlkZW9Nb2RlOwotCWRldmljZS0+Q3JlYXRlWVVWT3ZlcmxheSA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRDb2xvcnMgPSBEQ19TZXRDb2xvcnM7Ci0JZGV2aWNlLT5VcGRhdGVSZWN0cyA9IERDX1VwZGF0ZVJlY3RzOwotCWRldmljZS0+VmlkZW9RdWl0ID0gRENfVmlkZW9RdWl0OwotCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBEQ19BbGxvY0hXU3VyZmFjZTsKLQlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gTlVMTDsKLQlkZXZpY2UtPkZpbGxIV1JlY3QgPSBOVUxMOwotCWRldmljZS0+U2V0SFdDb2xvcktleSA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRIV0FscGhhID0gTlVMTDsKLQlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBEQ19Mb2NrSFdTdXJmYWNlOwotCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gRENfVW5sb2NrSFdTdXJmYWNlOwotCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IERDX0ZsaXBIV1N1cmZhY2U7Ci0JZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gRENfRnJlZUhXU3VyZmFjZTsKLSNpZiBTRExfVklERU9fT1BFTkdMCi0JZGV2aWNlLT5HTF9Mb2FkTGlicmFyeSA9IERDX0dMX0xvYWRMaWJyYXJ5OwotCWRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBEQ19HTF9HZXRQcm9jQWRkcmVzczsKLQlkZXZpY2UtPkdMX0dldEF0dHJpYnV0ZSA9IERDX0dMX0dldEF0dHJpYnV0ZTsKLQlkZXZpY2UtPkdMX01ha2VDdXJyZW50ID0gTlVMTDsKLQlkZXZpY2UtPkdMX1N3YXBCdWZmZXJzID0gRENfR0xfU3dhcEJ1ZmZlcnM7Ci0jZW5kaWYKLQlkZXZpY2UtPlNldENhcHRpb24gPSBOVUxMOwotCWRldmljZS0+U2V0SWNvbiA9IE5VTEw7Ci0JZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKLQlkZXZpY2UtPkdyYWJJbnB1dCA9IE5VTEw7Ci0JZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOwotCWRldmljZS0+SW5pdE9TS2V5bWFwID0gRENfSW5pdE9TS2V5bWFwOwotCWRldmljZS0+UHVtcEV2ZW50cyA9IERDX1B1bXBFdmVudHM7Ci0KLQlkZXZpY2UtPmZyZWUgPSBEQ19EZWxldGVEZXZpY2U7Ci0KLQlyZXR1cm4gZGV2aWNlOwotfQotCi1WaWRlb0Jvb3RTdHJhcCBEQ19ib290c3RyYXAgPSB7Ci0JImRjdmlkZW8iLCAiRHJlYW1jYXN0IFZpZGVvIiwKLQlEQ19BdmFpbGFibGUsIERDX0NyZWF0ZURldmljZQotfTsKLQotCi1pbnQgRENfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCi17Ci0JLyogRGV0ZXJtaW5lIHRoZSBzY3JlZW4gZGVwdGggKHVzZSBkZWZhdWx0IDE2LWJpdCBkZXB0aCkgKi8KLQkvKiB3ZSBjaGFuZ2UgdGhpcyBkdXJpbmcgdGhlIFNETF9TZXRWaWRlb01vZGUgaW1wbGVtZW50YXRpb24uLi4gKi8KLQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSAxNjsKLQl2Zm9ybWF0LT5SbWFzayA9IDB4MDAwMGY4MDA7Ci0JdmZvcm1hdC0+R21hc2sgPSAweDAwMDAwN2UwOwotCXZmb3JtYXQtPkJtYXNrID0gMHgwMDAwMDAxZjsKLQotCS8qIFdlJ3JlIGRvbmUhICovCi0JcmV0dXJuKDApOwotfQotCi1jb25zdCBzdGF0aWMgU0RMX1JlY3QKLQlSRUNUXzgwMHg2MDAgPSB7MCwwLDgwMCw2MDB9LAotCVJFQ1RfNjQweDQ4MCA9IHswLDAsNjQwLDQ4MH0sCi0JUkVDVF8zMjB4MjQwID0gezAsMCwzMjAsMjQwfTsKLWNvbnN0IHN0YXRpYyBTRExfUmVjdCAqdmlkX21vZGVzW10gPSB7Ci0JJlJFQ1RfODAweDYwMCwKLQkmUkVDVF82NDB4NDgwLAotCSZSRUNUXzMyMHgyNDAsCi0JTlVMTAotfTsKLQotU0RMX1JlY3QgKipEQ19MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCi17Ci0Jc3dpdGNoKGZvcm1hdC0+Qml0c1BlclBpeGVsKSB7Ci0JY2FzZSAxNToKLQljYXNlIDE2OgotCQlyZXR1cm4gJnZpZF9tb2RlczsKLQljYXNlIDMyOgotCQlpZiAoIShmbGFncyAmIFNETF9PUEVOR0wpKQotCQlyZXR1cm4gJnZpZF9tb2RlczsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTlVMTDsKLQl9Ci0vLwlyZXR1cm4gKFNETF9SZWN0ICoqKSAtMTsKLX0KLQotcHZyX2luaXRfcGFyYW1zX3QgcGFyYW1zID0gewotICAgICAgICAvKiBFbmFibGUgb3BhcXVlIGFuZCB0cmFuc2x1Y2VudCBwb2x5Z29ucyB3aXRoIHNpemUgMTYgKi8KLSAgICAgICAgeyBQVlJfQklOU0laRV8xNiwgUFZSX0JJTlNJWkVfMCwgUFZSX0JJTlNJWkVfMTYsIFBWUl9CSU5TSVpFXzAsIFBWUl9CSU5TSVpFXzE2IH0sCi0KLSAgICAgICAgLyogVmVydGV4IGJ1ZmZlciBzaXplICovCi0gICAgICAgIDUxMioxMDI0Ci19OwotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotc3RhdGljIGludCBwdnJfaW5pdGVkOwotI2VuZGlmCi0KLVNETF9TdXJmYWNlICpEQ19TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAotCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQotewotCWludCBkaXNwX21vZGUscGl4ZWxfbW9kZSxwaXRjaDsKLQlVaW50MzIgUm1hc2ssIEdtYXNrLCBCbWFzazsKLQotCWlmICh3aWR0aD09MzIwICYmIGhlaWdodD09MjQwKSBkaXNwX21vZGU9RE1fMzIweDI0MDsKLQllbHNlIGlmICh3aWR0aD09NjQwICYmIGhlaWdodD09NDgwKSBkaXNwX21vZGU9RE1fNjQweDQ4MDsKLQllbHNlIGlmICh3aWR0aD09ODAwICYmIGhlaWdodD09NjAwKSBkaXNwX21vZGU9RE1fODAweDYwODsKLQllbHNlIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBmaW5kIHJlcXVlc3RlZCBtb2RlIGluIGxpc3QiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCXN3aXRjaChicHApIHsKLQljYXNlIDE1OiBwaXhlbF9tb2RlID0gUE1fUkdCNTU1OyBwaXRjaCA9IHdpZHRoKjI7Ci0JCS8qIDUtNS01ICovCi0JCVJtYXNrID0gMHgwMDAwN2MwMDsKLQkJR21hc2sgPSAweDAwMDAwM2UwOwotCQlCbWFzayA9IDB4MDAwMDAwMWY7Ci0JCWJyZWFrOwotCWNhc2UgMTY6IHBpeGVsX21vZGUgPSBQTV9SR0I1NjU7IHBpdGNoID0gd2lkdGgqMjsKLQkJLyogNS02LTUgKi8KLQkJUm1hc2sgPSAweDAwMDBmODAwOwotCQlHbWFzayA9IDB4MDAwMDA3ZTA7Ci0JCUJtYXNrID0gMHgwMDAwMDAxZjsKLQkJYnJlYWs7Ci0JY2FzZSAyNDogYnBwID0gMzI7Ci0JY2FzZSAzMjogcGl4ZWxfbW9kZSA9IFBNX1JHQjg4ODsgcGl0Y2ggPSB3aWR0aCo0OwotCQlSbWFzayA9IDB4MDBmZjAwMDA7Ci0JCUdtYXNrID0gMHgwMDAwZmYwMDsKLQkJQm1hc2sgPSAweDAwMDAwMGZmOwotI2lmIFNETF9WSURFT19PUEVOR0wKLQkJaWYgKCEoZmxhZ3MgJiBTRExfT1BFTkdMKSkKLSNlbmRpZgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGZpbmQgcmVxdWVzdGVkIG1vZGUgaW4gbGlzdCIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0vLyAgaWYgKCBicHAgIT0gY3VycmVudC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgKSB7Ci0JaWYgKCAhIFNETF9SZWFsbG9jRm9ybWF0KGN1cnJlbnQsIGJwcCwgUm1hc2ssIEdtYXNrLCBCbWFzaywgMCkgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0vLyAgfQotCi0JLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLwotCWN1cnJlbnQtPmZsYWdzID0gKFNETF9GVUxMU0NSRUVOfFNETF9IV1NVUkZBQ0UpOwotCWN1cnJlbnQtPncgPSB3aWR0aDsKLQljdXJyZW50LT5oID0gaGVpZ2h0OwotCWN1cnJlbnQtPnBpdGNoID0gcGl0Y2g7Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0JaWYgKHB2cl9pbml0ZWQpIHsKLQkJcHZyX2luaXRlZCA9IDA7Ci0JCXB2cl9zaHV0ZG93bigpOwotCX0KLSNlbmRpZgotCi0JdmlkX3NldF9tb2RlKGRpc3BfbW9kZSxwaXhlbF9tb2RlKTsKLQotCWN1cnJlbnQtPnBpeGVscyA9IHZyYW1fczsKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLQlpZiAoZmxhZ3MgJiBTRExfT1BFTkdMKSB7Ci0JCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMTsKLQkJY3VycmVudC0+ZmxhZ3MgPSBTRExfRlVMTFNDUkVFTiB8IFNETF9PUEVOR0w7Ci0JCWN1cnJlbnQtPnBpeGVscyA9IE5VTEw7Ci0JCXB2cl9pbml0ZWQgPSAxOwotCQlwdnJfaW5pdCgmcGFyYW1zKTsKLQkJZ2xLb3NJbml0KCk7Ci0JCWdsS29zQmVnaW5GcmFtZSgpOwotCX0gZWxzZQotI2VuZGlmCi0JaWYgKGZsYWdzIHwgU0RMX0RPVUJMRUJVRikgewotCQljdXJyZW50LT5mbGFncyB8PSBTRExfRE9VQkxFQlVGOwotCQljdXJyZW50LT5waXhlbHMgPSAodm9pZCopKChpbnQpY3VycmVudC0+cGl4ZWxzIHwgMHg0MDAwMDApOwotCX0KLQotCS8qIFdlJ3JlIGRvbmUgKi8KLQlyZXR1cm4oY3VycmVudCk7Ci19Ci0KLS8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCi1zdGF0aWMgaW50IERDX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4oLTEpOwotfQotc3RhdGljIHZvaWQgRENfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotCi0vKiBXZSBuZWVkIHRvIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2Ugb24gcGFnZSBmbGlwcGVkIGRpc3BsYXlzICovCi1zdGF0aWMgaW50IERDX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgRENfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgRENfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgewotCQl2aWRfc2V0X3N0YXJ0KChpbnQpc3VyZmFjZS0+cGl4ZWxzICYgMHhmZmZmZmYpOwotCQlzdXJmYWNlLT5waXhlbHMgPSAodm9pZCopKChpbnQpc3VyZmFjZS0+cGl4ZWxzIF4gMHg0MDAwMDApOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIERDX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLQkvKiBkbyBub3RoaW5nLiAqLwotfQotCi1zdGF0aWMgaW50IERDX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKLXsKLQkvKiBkbyBub3RoaW5nIG9mIG5vdGUuICovCi0JcmV0dXJuKDEpOwotfQotCi0vKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKLSAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KLSovCi1zdGF0aWMgdm9pZCBEQ19WaWRlb1F1aXQoX1RISVMpCi17Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCWlmIChwdnJfaW5pdGVkKSB7Ci0JCXB2cl9pbml0ZWQgPSAwOwotCQlwdnJfc2h1dGRvd24oKTsKLQl9Ci0jZW5kaWYKLX0KLQotI2lmIFNETF9WSURFT19PUEVOR0wKLQotdm9pZCBkbXlmdW5jKHZvaWQpIHt9Ci0KLXR5cGVkZWYgdm9pZCAoKmZ1bmNwdHIpKCk7Ci1jb25zdCBzdGF0aWMgc3RydWN0IHsKLQljaGFyICpuYW1lOwotCWZ1bmNwdHIgYWRkcjsKLX0gZ2xmdW5jc1tdID0gewotI2RlZmluZQlERUYoZnVuYykJeyNmdW5jLCZmdW5jfQotCURFRihnbEJlZ2luKSwKLQlERUYoZ2xCaW5kVGV4dHVyZSksCi0JREVGKGdsQmxlbmRGdW5jKSwKLQlERUYoZ2xDb2xvcjRmKSwKLS8vCURFRihnbENvcHlJbWFnZUlEKSwKLQlERUYoZ2xEaXNhYmxlKSwKLQlERUYoZ2xFbmFibGUpLAotCURFRihnbEVuZCksCi0JREVGKGdsRmx1c2gpLAotCURFRihnbEdlblRleHR1cmVzKSwKLQlERUYoZ2xHZXRTdHJpbmcpLAotCURFRihnbExvYWRJZGVudGl0eSksCi0JREVGKGdsTWF0cml4TW9kZSksCi0JREVGKGdsT3J0aG8pLAotCURFRihnbFBpeGVsU3RvcmVpKSwKLS8vCURFRihnbFBvcEF0dHJpYiksCi0vLwlERUYoZ2xQb3BDbGllbnRBdHRyaWIpLAotCXsiZ2xQb3BBdHRyaWIiLCZkbXlmdW5jfSwKLQl7ImdsUG9wQ2xpZW50QXR0cmliIiwmZG15ZnVuY30sCi0JREVGKGdsUG9wTWF0cml4KSwKLS8vCURFRihnbFB1c2hBdHRyaWIpLAotLy8JREVGKGdsUHVzaENsaWVudEF0dHJpYiksCi0JeyJnbFB1c2hBdHRyaWIiLCZkbXlmdW5jfSwKLQl7ImdsUHVzaENsaWVudEF0dHJpYiIsJmRteWZ1bmN9LAotCURFRihnbFB1c2hNYXRyaXgpLAotCURFRihnbFRleENvb3JkMmYpLAotCURFRihnbFRleEVudmYpLAotCURFRihnbFRleEltYWdlMkQpLAotCURFRihnbFRleFBhcmFtZXRlcmkpLAotCURFRihnbFRleFN1YkltYWdlMkQpLAotCURFRihnbFZlcnRleDJpKSwKLQlERUYoZ2xWaWV3cG9ydCksCi0jdW5kZWYJREVGCi19OwotCi1zdGF0aWMgdm9pZCAqRENfR0xfR2V0UHJvY0FkZHJlc3MoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpCi17Ci0Jdm9pZCAqcmV0OwotCWludCBpOwotCi0JcmV0ID0gZ2xLb3NHZXRQcm9jQWRkcmVzcyhwcm9jKTsKLQlpZiAocmV0KSByZXR1cm4gcmV0OwotCi0JZm9yKGk9MDtpPHNpemVvZihnbGZ1bmNzKS9zaXplb2YoZ2xmdW5jc1swXSk7aSsrKSB7Ci0JCWlmIChTRExfc3RyY21wKHByb2MsZ2xmdW5jc1tpXS5uYW1lKT09MCkgcmV0dXJuIGdsZnVuY3NbaV0uYWRkcjsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBEQ19HTF9Mb2FkTGlicmFyeShfVEhJUywgY29uc3QgY2hhciAqcGF0aCkKLXsKLQl0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBEQ19HTF9HZXRBdHRyaWJ1dGUoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKQotewotCUdMZW51bSBtZXNhX2F0dHJpYjsKLQlpbnQgdmFsOwotCi0Jc3dpdGNoKGF0dHJpYikgewotCWNhc2UgU0RMX0dMX1JFRF9TSVpFOgotCQl2YWwgPSA1OwotCQlicmVhazsKLQljYXNlIFNETF9HTF9HUkVFTl9TSVpFOgotCQl2YWwgPSA2OwotCQlicmVhazsKLQljYXNlIFNETF9HTF9CTFVFX1NJWkU6Ci0JCXZhbCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgU0RMX0dMX0FMUEhBX1NJWkU6Ci0JCXZhbCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgU0RMX0dMX0RPVUJMRUJVRkZFUjoKLQkJdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTRExfR0xfREVQVEhfU0laRToKLQkJdmFsID0gMTY7IC8qIG9yIDMyPyAqLwotCQlicmVhazsKLQljYXNlIFNETF9HTF9TVEVOQ0lMX1NJWkU6Ci0JCXZhbCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgU0RMX0dMX0FDQ1VNX1JFRF9TSVpFOgotCQl2YWwgPSAwOwotCQlicmVhazsKLQljYXNlIFNETF9HTF9BQ0NVTV9HUkVFTl9TSVpFOgotCQl2YWwgPSAwOwotCWNhc2UgU0RMX0dMX0FDQ1VNX0JMVUVfU0laRToKLQkJdmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTRExfR0xfQUNDVU1fQUxQSEFfU0laRToKLQkJdmFsID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdCA6Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnZhbHVlID0gdmFsOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBEQ19HTF9Td2FwQnVmZmVycyhfVEhJUykKLXsKLQlnbEtvc0ZpbmlzaEZyYW1lKCk7Ci0JZ2xLb3NCZWdpbkZyYW1lKCk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGMvU0RMX2RjdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGMvU0RMX2RjdmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3YmYyNS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RjL1NETF9kY3ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2RjdmlkZW9faAotI2RlZmluZSBfU0RMX2RjdmlkZW9faAotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiU0RMX211dGV4LmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKLQotCi0vKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLwotCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotICAgIGludCB3LCBoOwotICAgIHZvaWQgKmJ1ZmZlcjsKLX07Ci0KLSNlbmRpZiAvKiBfU0RMX2RjdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZWZhdWx0X2N1cnNvci5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZWZhdWx0X2N1cnNvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTUzZTAxLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGVmYXVsdF9jdXJzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogCi0gKiBEZWZhdWx0IGN1cnNvciAtIGl0IGhhcHBlbnMgdG8gYmUgdGhlIE1hYyBjdXJzb3IsIGJ1dCBjb3VsZCBiZSBhbnl0aGluZyAgICovCi0KLSNkZWZpbmUgREVGQVVMVF9DV0lEVEgJMTYKLSNkZWZpbmUgREVGQVVMVF9DSEVJR0hUCTE2Ci0jZGVmaW5lIERFRkFVTFRfQ0hPVFgJMAotI2RlZmluZSBERUZBVUxUX0NIT1RZCTAKLQotLyogQWRkZWQgYSByZWFsIE1hY09TIGN1cnNvciwgYXQgdGhlIHJlcXVlc3Qgb2YgTHVjLU9saXZpZXIgZGUgQ2hhcnJp6HJlICovCi0jZGVmaW5lIFVTRV9NQUNPU19DVVJTT1IKLQotI2lmZGVmIFVTRV9NQUNPU19DVVJTT1IKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZGVmYXVsdF9jZGF0YVtdID0KLXsKLSAweDAwLDB4MDAsCi0gMHg0MCwweDAwLAotIDB4NjAsMHgwMCwKLSAweDcwLDB4MDAsCi0gMHg3OCwweDAwLAotIDB4N0MsMHgwMCwKLSAweDdFLDB4MDAsCi0gMHg3RiwweDAwLAotIDB4N0YsMHg4MCwKLSAweDdDLDB4MDAsCi0gMHg2QywweDAwLAotIDB4NDYsMHgwMCwKLSAweDA2LDB4MDAsCi0gMHgwMywweDAwLAotIDB4MDMsMHgwMCwKLSAweDAwLDB4MDAKLX07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBkZWZhdWx0X2NtYXNrW10gPQotewotIDB4QzAsMHgwMCwKLSAweEUwLDB4MDAsCi0gMHhGMCwweDAwLAotIDB4RjgsMHgwMCwKLSAweEZDLDB4MDAsCi0gMHhGRSwweDAwLAotIDB4RkYsMHgwMCwKLSAweEZGLDB4ODAsCi0gMHhGRiwweEMwLAotIDB4RkYsMHhFMCwKLSAweEZFLDB4MDAsCi0gMHhFRiwweDAwLAotIDB4Q0YsMHgwMCwKLSAweDg3LDB4ODAsCi0gMHgwNywweDgwLAotIDB4MDMsMHgwMAotfTsKLQotI2Vsc2UKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZGVmYXVsdF9jZGF0YVtdID0KLXsKLSAweDAwLDB4MDAsCi0gMHg0MCwweDAwLAotIDB4NjAsMHgwMCwKLSAweDcwLDB4MDAsCi0gMHg3OCwweDAwLAotIDB4N0MsMHgwMCwKLSAweDdFLDB4MDAsCi0gMHg3RiwweDAwLAotIDB4N0YsMHg4MCwKLSAweDdDLDB4MDAsCi0gMHg2QywweDAwLAotIDB4NDYsMHgwMCwKLSAweDA2LDB4MDAsCi0gMHgwMywweDAwLAotIDB4MDMsMHgwMCwKLSAweDAwLDB4MDAKLX07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBkZWZhdWx0X2NtYXNrW10gPQotewotIDB4NDAsMHgwMCwKLSAweEUwLDB4MDAsCi0gMHhGMCwweDAwLAotIDB4RjgsMHgwMCwKLSAweEZDLDB4MDAsCi0gMHhGRSwweDAwLAotIDB4RkYsMHgwMCwKLSAweEZGLDB4ODAsCi0gMHhGRiwweEMwLAotIDB4RkYsMHg4MCwKLSAweEZFLDB4MDAsCi0gMHhFRiwweDAwLAotIDB4NEYsMHgwMCwKLSAweDA3LDB4ODAsCi0gMHgwNywweDgwLAotIDB4MDMsMHgwMAotfTsKLQotI2VuZGlmIC8qIFRSVUVfTUFDSU5UT1NIX0NVUlNPUiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZ2EvU0RMX2RnYWV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZ2EvU0RMX2RnYWV2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWJkMjFlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGdhL1NETF9kZ2FldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgREdBIGV2ZW50cyBpbnRvIFNETCBldmVudHMgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMveGY4NmRnYS5oIgotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9kZ2F2aWRlby5oIgotI2luY2x1ZGUgIlNETF9kZ2FldmVudHNfYy5oIgotCi0vKiBnZXQgZnVuY3Rpb24gcG9pbnRlcnMuLi4gKi8KLSNpbmNsdWRlICIuLi94MTEvU0RMX3gxMWR5bi5oIgotCi0vKiBIZWhlaCB3ZSdyZSB1c2luZyBYMTEgZXZlbnQgY29kZSAqLwotZXh0ZXJuIGludCBYMTFfUGVuZGluZyhEaXNwbGF5ICpkaXNwbGF5KTsKLWV4dGVybiB2b2lkIFgxMV9Jbml0S2V5bWFwKHZvaWQpOwotZXh0ZXJuIFNETEtleSBYMTFfVHJhbnNsYXRlS2V5Y29kZShEaXNwbGF5ICpkaXNwbGF5LCBLZXlDb2RlIGtjKTsKLQotc3RhdGljIGludCBER0FfRGlzcGF0Y2hFdmVudChfVEhJUykKLXsKLQlpbnQgcG9zdGVkOwotCVNETF9OQU1FKFhER0FFdmVudCkgeGV2ZW50OwotCi0JWE5leHRFdmVudChER0FfRGlzcGxheSwgKFhFdmVudCAqKSZ4ZXZlbnQpOwotCi0JcG9zdGVkID0gMDsKLQl4ZXZlbnQudHlwZSAtPSBER0FfZXZlbnRfYmFzZTsKLQlzd2l0Y2ggKHhldmVudC50eXBlKSB7Ci0KLQkgICAgLyogTW91c2UgbW90aW9uPyAqLwotCSAgICBjYXNlIE1vdGlvbk5vdGlmeTogewotCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDEsCi0JCQkJCXhldmVudC54bW90aW9uLmR4LCB4ZXZlbnQueG1vdGlvbi5keSk7Ci0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICAvKiBNb3VzZSBidXR0b24gcHJlc3M/ICovCi0JICAgIGNhc2UgQnV0dG9uUHJlc3M6IHsKLQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgCi0JCQkJCXhldmVudC54YnV0dG9uLmJ1dHRvbiwgMCwgMCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgLyogTW91c2UgYnV0dG9uIHJlbGVhc2U/ICovCi0JICAgIGNhc2UgQnV0dG9uUmVsZWFzZTogewotCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgCi0JCQkJCXhldmVudC54YnV0dG9uLmJ1dHRvbiwgMCwgMCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgLyogS2V5IHByZXNzPyAqLwotCSAgICBjYXNlIEtleVByZXNzOiB7Ci0JCVNETF9rZXlzeW0ga2V5c3ltOwotCQlLZXlDb2RlIGtleWNvZGU7Ci0JCVhLZXlFdmVudCB4a2V5OwotCi0JCVNETF9OQU1FKFhER0FLZXlFdmVudFRvWEtleUV2ZW50KSgmeGV2ZW50LnhrZXksICZ4a2V5KTsKLQkJa2V5Y29kZSA9IHhrZXkua2V5Y29kZTsKLSNpZmRlZiBERUJVR19YRVZFTlRTCi1wcmludGYoIktleVByZXNzIChYMTEga2V5Y29kZSA9IDB4JVgpXG4iLCB4a2V5LmtleWNvZGUpOwotI2VuZGlmCi0JCS8qIEdldCB0aGUgdHJhbnNsYXRlZCBTREwgdmlydHVhbCBrZXlzeW0gKi8KLQkJa2V5c3ltLnNjYW5jb2RlID0ga2V5Y29kZTsKLQkJa2V5c3ltLnN5bSA9IFgxMV9UcmFuc2xhdGVLZXljb2RlKERHQV9EaXNwbGF5LCBrZXljb2RlKTsKLQkJa2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsKLQkJa2V5c3ltLnVuaWNvZGUgPSAwOwotCi0JCS8qIExvb2sgdXAgdGhlIHRyYW5zbGF0ZWQgdmFsdWUgZm9yIHRoZSBrZXkgZXZlbnQgKi8KLQkJaWYgKCBTRExfVHJhbnNsYXRlVU5JQ09ERSApIHsKLQkJCXN0YXRpYyBYQ29tcG9zZVN0YXR1cyBzdGF0ZTsKLQkJCWNoYXIga2V5YnVmWzMyXTsKLQotCQkJaWYgKCBYTG9va3VwU3RyaW5nKCZ4a2V5LCBrZXlidWYsIHNpemVvZihrZXlidWYpLCBOVUxMLCAmc3RhdGUpICkgewotCQkJCS8qCi0JCQkJKiBGSVhNRTogWExvb2t1cFN0cmluZygpIG1heSB5aWVsZCBtb3JlIHRoYW4gb25lCi0JCQkJKiBjaGFyYWN0ZXIsIHNvIHdlIG5lZWQgYSBtZWNoYW5pc20gdG8gYWxsb3cgZm9yCi0JCQkJKiB0aGlzIChwZXJoYXBzIG51bGwga2V5cHJlc3MgZXZlbnRzIHdpdGggYQotCQkJCSogdW5pY29kZSB2YWx1ZSkKLQkJCQkqLwotCQkJCWtleXN5bS51bmljb2RlID0gKFVpbnQ4KWtleWJ1ZlswXTsKLQkJCX0KLQkJfQotCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELCAma2V5c3ltKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICAvKiBLZXkgcmVsZWFzZT8gKi8KLQkgICAgY2FzZSBLZXlSZWxlYXNlOiB7Ci0JCVNETF9rZXlzeW0ga2V5c3ltOwotCQlLZXlDb2RlIGtleWNvZGU7Ci0JCVhLZXlFdmVudCB4a2V5OwotCi0JCVNETF9OQU1FKFhER0FLZXlFdmVudFRvWEtleUV2ZW50KSgmeGV2ZW50LnhrZXksICZ4a2V5KTsKLQkJa2V5Y29kZSA9IHhrZXkua2V5Y29kZTsKLSNpZmRlZiBERUJVR19YRVZFTlRTCi1wcmludGYoIktleVJlbGVhc2UgKFgxMSBrZXljb2RlID0gMHglWClcbiIsIHhrZXkua2V5Y29kZSk7Ci0jZW5kaWYKLQkJLyogR2V0IHRoZSB0cmFuc2xhdGVkIFNETCB2aXJ0dWFsIGtleXN5bSAqLwotCQlrZXlzeW0uc2NhbmNvZGUgPSBrZXljb2RlOwotCQlrZXlzeW0uc3ltID0gWDExX1RyYW5zbGF0ZUtleWNvZGUoREdBX0Rpc3BsYXksIGtleWNvZGUpOwotCQlrZXlzeW0ubW9kID0gS01PRF9OT05FOwotCQlrZXlzeW0udW5pY29kZSA9IDA7Ci0JCXBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELCAma2V5c3ltKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JcmV0dXJuKHBvc3RlZCk7Ci19Ci0KLXZvaWQgREdBX1B1bXBFdmVudHMoX1RISVMpCi17Ci0JLyogS2VlcCBwcm9jZXNzaW5nIHBlbmRpbmcgZXZlbnRzICovCi0JTE9DS19ESVNQTEFZKCk7Ci0Jd2hpbGUgKCBYMTFfUGVuZGluZyhER0FfRGlzcGxheSkgKSB7Ci0JCURHQV9EaXNwYXRjaEV2ZW50KHRoaXMpOwotCX0KLQlVTkxPQ0tfRElTUExBWSgpOwotfQotCi12b2lkIERHQV9Jbml0T1NLZXltYXAoX1RISVMpCi17Ci0JWDExX0luaXRLZXltYXAoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZ2EvU0RMX2RnYWV2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RnYS9TRExfZGdhZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlNDdmNy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RnYS9TRExfZGdhZXZlbnRzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX2RnYXZpZGVvLmgiCi0KLS8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLwotZXh0ZXJuIHZvaWQgREdBX1B1bXBFdmVudHMoX1RISVMpOwotZXh0ZXJuIHZvaWQgREdBX0luaXRPU0tleW1hcChfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RnYS9TRExfZGdhbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGdhL1NETF9kZ2Ftb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjk5NTYzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGdhL1NETF9kZ2Ftb3VzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9kZ2F2aWRlby5oIgotI2luY2x1ZGUgIlNETF9kZ2Ftb3VzZV9jLmgiCi0KLQotLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCi1zdHJ1Y3QgV01jdXJzb3IgewotCWludCB1bnVzZWQ7Ci19OwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZ2EvU0RMX2RnYW1vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGdhL1NETF9kZ2Ftb3VzZV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjNmNmEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZ2EvU0RMX2RnYW1vdXNlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX2RnYXZpZGVvLmgiCi0KLS8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZ2EvU0RMX2RnYXZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RnYS9TRExfZGdhdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxZmNkMi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RnYS9TRExfZGdhdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDExMDAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIERHQSAyLjAgYmFzZWQgU0RMIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMveGY4NmRnYS5oIgotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9kZ2F2aWRlby5oIgotI2luY2x1ZGUgIlNETF9kZ2Ftb3VzZV9jLmgiCi0jaW5jbHVkZSAiU0RMX2RnYWV2ZW50c19jLmgiCi0KLS8qIGdldCBmdW5jdGlvbiBwb2ludGVycy4uLiAqLwotI2luY2x1ZGUgIi4uL3gxMS9TRExfeDExZHluLmgiCi0KLS8qI2RlZmluZSBER0FfREVCVUcqLwotCi0vKiBIZWhlaCB3ZSdyZSB1c2luZyBYMTEgZXZlbnQgY29kZSAqLwotZXh0ZXJuIHZvaWQgWDExX1NhdmVTY3JlZW5TYXZlcihEaXNwbGF5ICpkaXNwbGF5LCBpbnQgKnNhdmVkX3RpbWVvdXQsIEJPT0wgKmRwbXMpOwotZXh0ZXJuIHZvaWQgWDExX0Rpc2FibGVTY3JlZW5TYXZlcihEaXNwbGF5ICpkaXNwbGF5KTsKLWV4dGVybiB2b2lkIFgxMV9SZXN0b3JlU2NyZWVuU2F2ZXIoRGlzcGxheSAqZGlzcGxheSwgaW50IHNhdmVkX3RpbWVvdXQsIEJPT0wgZHBtcyk7Ci0KLS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBER0FfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOwotc3RhdGljIFNETF9SZWN0ICoqREdBX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgU0RMX1N1cmZhY2UgKkRHQV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgaW50IERHQV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywKLQkJCSBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgaW50IERHQV9TZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCk7Ci1zdGF0aWMgdm9pZCBER0FfVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgREdBX0luaXRIV1N1cmZhY2VzKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuLCBVaW50OCAqYmFzZSwgaW50IHNpemUpOwotc3RhdGljIHZvaWQgREdBX0ZyZWVIV1N1cmZhY2VzKF9USElTKTsKLXN0YXRpYyBpbnQgREdBX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IERHQV9GaWxsSFdSZWN0KF9USElTLCBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqcmVjdCwgVWludDMyIGNvbG9yKTsKLXN0YXRpYyBpbnQgREdBX0NoZWNrSFdCbGl0KF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KTsKLXN0YXRpYyBpbnQgREdBX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIERHQV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIERHQV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IERHQV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0KLS8qIERHQSBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IERHQV9BdmFpbGFibGUodm9pZCkKLXsKLQljb25zdCBjaGFyICpkaXNwbGF5ID0gTlVMTDsKLQlEaXNwbGF5ICpkcHkgPSBOVUxMOwotCWludCBhdmFpbGFibGUgPSAwOwotCi0JLyogVGhlIGRyaXZlciBpcyBhdmFpbGFibGUgaXMgYXZhaWxhYmxlIGlmIHRoZSBkaXNwbGF5IGlzIGxvY2FsCi0JICAgYW5kIHRoZSBER0EgMi4wKyBleHRlbnNpb24gaXMgYXZhaWxhYmxlLCBhbmQgd2UgY2FuIG1hcCBtZW0uCi0JKi8KLQlpZiAoIFNETF9YMTFfTG9hZFN5bWJvbHMoKSApIHsKLQkJaWYgKCAoU0RMX3N0cm5jbXAoWERpc3BsYXlOYW1lKGRpc3BsYXkpLCAiOiIsIDEpID09IDApIHx8Ci0JCSAgICAgKFNETF9zdHJuY21wKFhEaXNwbGF5TmFtZShkaXNwbGF5KSwgInVuaXg6IiwgNSkgPT0gMCkgKSB7Ci0JCQlkcHkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheSk7Ci0JCQlpZiAoIGRweSApIHsKLQkJCQlpbnQgZXZlbnRzLCBlcnJvcnMsIG1ham9yLCBtaW5vcjsKLQotCQkJCWlmICggU0RMX05BTUUoWERHQVF1ZXJ5RXh0ZW5zaW9uKShkcHksICZldmVudHMsICZlcnJvcnMpICYmCi0JCQkJICAgICBTRExfTkFNRShYREdBUXVlcnlWZXJzaW9uKShkcHksICZtYWpvciwgJm1pbm9yKSApIHsKLQkJCQkJaW50IHNjcmVlbjsKLQotCQkJCQlzY3JlZW4gPSBEZWZhdWx0U2NyZWVuKGRweSk7Ci0JCQkJCWlmICggKG1ham9yID49IDIpICYmIAotCQkJCQkgICAgIFNETF9OQU1FKFhER0FPcGVuRnJhbWVidWZmZXIpKGRweSwgc2NyZWVuKSApIHsKLQkJCQkJCWF2YWlsYWJsZSA9IDE7Ci0JCQkJCQlTRExfTkFNRShYREdBQ2xvc2VGcmFtZWJ1ZmZlcikoZHB5LCBzY3JlZW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJCVhDbG9zZURpc3BsYXkoZHB5KTsKLQkJCX0KLQkJfQotCQlTRExfWDExX1VubG9hZFN5bWJvbHMoKTsKLQl9Ci0JcmV0dXJuKGF2YWlsYWJsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERHQV9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JaWYgKGRldmljZSAhPSBOVUxMKSB7Ci0JCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQkJU0RMX2ZyZWUoZGV2aWNlKTsKLQkJU0RMX1gxMV9VbmxvYWRTeW1ib2xzKCk7Ci0JfQotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpER0FfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKmRldmljZSA9IE5VTEw7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCWlmIChTRExfWDExX0xvYWRTeW1ib2xzKCkpIHsKLQkJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotCQlpZiAoIGRldmljZSApIHsKLQkJCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLQkJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQotCQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0JCX0KLQkJaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJaWYgKCBkZXZpY2UgKSB7Ci0JCQkJU0RMX2ZyZWUoZGV2aWNlKTsKLQkJCX0KLQkJCVNETF9YMTFfVW5sb2FkU3ltYm9scygpOwotCQkJcmV0dXJuKDApOwotCQl9Ci0JCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0KLQkJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCQlkZXZpY2UtPlZpZGVvSW5pdCA9IERHQV9WaWRlb0luaXQ7Ci0JCWRldmljZS0+TGlzdE1vZGVzID0gREdBX0xpc3RNb2RlczsKLQkJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBER0FfU2V0VmlkZW9Nb2RlOwotCQlkZXZpY2UtPlNldENvbG9ycyA9IERHQV9TZXRDb2xvcnM7Ci0JCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOwotCQlkZXZpY2UtPlZpZGVvUXVpdCA9IERHQV9WaWRlb1F1aXQ7Ci0JCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBER0FfQWxsb2NIV1N1cmZhY2U7Ci0JCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBER0FfQ2hlY2tIV0JsaXQ7Ci0JCWRldmljZS0+RmlsbEhXUmVjdCA9IERHQV9GaWxsSFdSZWN0OwotCQlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOwotCQlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOwotCQlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBER0FfTG9ja0hXU3VyZmFjZTsKLQkJZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBER0FfVW5sb2NrSFdTdXJmYWNlOwotCQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBER0FfRmxpcEhXU3VyZmFjZTsKLQkJZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gREdBX0ZyZWVIV1N1cmZhY2U7Ci0JCWRldmljZS0+U2V0R2FtbWFSYW1wID0gREdBX1NldEdhbW1hUmFtcDsKLQkJZGV2aWNlLT5HZXRHYW1tYVJhbXAgPSBOVUxMOwotCQlkZXZpY2UtPlNldENhcHRpb24gPSBOVUxMOwotCQlkZXZpY2UtPlNldEljb24gPSBOVUxMOwotCQlkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBOVUxMOwotCQlkZXZpY2UtPkdyYWJJbnB1dCA9IE5VTEw7Ci0JCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKLQkJZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBER0FfSW5pdE9TS2V5bWFwOwotCQlkZXZpY2UtPlB1bXBFdmVudHMgPSBER0FfUHVtcEV2ZW50czsKLQotCQlkZXZpY2UtPmZyZWUgPSBER0FfRGVsZXRlRGV2aWNlOwotCX0KLQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLVZpZGVvQm9vdFN0cmFwIERHQV9ib290c3RyYXAgPSB7Ci0JImRnYSIsICJYRnJlZTg2IERHQSAyLjAiLAotCURHQV9BdmFpbGFibGUsIERHQV9DcmVhdGVEZXZpY2UKLX07Ci0KLXN0YXRpYyBpbnQgREdBX0FkZE1vZGUoX1RISVMsIGludCBicHAsIGludCB3LCBpbnQgaCkKLXsKLQlTRExfUmVjdCAqbW9kZTsKLQlpbnQgaW5kZXg7Ci0JaW50IG5leHRfbW9kZTsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBtb2RlICovCi0JaWYgKCBicHAgPCA4ICkgeyAgLyogTm90IHN1cHBvcnRlZCAqLwotCQlyZXR1cm4oMCk7Ci0JfQotCWluZGV4ID0gKChicHArNykvOCktMTsKLQlpZiAoIFNETF9udW1tb2Rlc1tpbmRleF0gPiAwICkgewotCQltb2RlID0gU0RMX21vZGVsaXN0W2luZGV4XVtTRExfbnVtbW9kZXNbaW5kZXhdLTFdOwotCQlpZiAoIChtb2RlLT53ID09IHcpICYmIChtb2RlLT5oID09IGgpICkgewotCQkJcmV0dXJuKDApOwotCQl9Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBuZXcgdmlkZW8gbW9kZSByZWN0YW5nbGUgKi8KLQltb2RlID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YgKm1vZGUpOwotCWlmICggbW9kZSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JbW9kZS0+eCA9IDA7Ci0JbW9kZS0+eSA9IDA7Ci0JbW9kZS0+dyA9IHc7Ci0JbW9kZS0+aCA9IGg7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgbmV3IGxpc3Qgb2YgbW9kZXMsIGFuZCBmaWxsIGluIHRoZSBuZXcgbW9kZSAqLwotCW5leHRfbW9kZSA9IFNETF9udW1tb2Rlc1tpbmRleF07Ci0JU0RMX21vZGVsaXN0W2luZGV4XSA9IChTRExfUmVjdCAqKikKLQkgICAgICAgU0RMX3JlYWxsb2MoU0RMX21vZGVsaXN0W2luZGV4XSwgKDErbmV4dF9tb2RlKzEpKnNpemVvZihTRExfUmVjdCAqKSk7Ci0JaWYgKCBTRExfbW9kZWxpc3RbaW5kZXhdID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlTRExfbnVtbW9kZXNbaW5kZXhdID0gMDsKLQkJU0RMX2ZyZWUobW9kZSk7Ci0JCXJldHVybigtMSk7Ci0JfQotCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlXSA9IG1vZGU7Ci0JU0RMX21vZGVsaXN0W2luZGV4XVtuZXh0X21vZGUrMV0gPSBOVUxMOwotCVNETF9udW1tb2Rlc1tpbmRleF0rKzsKLQotCXJldHVybigwKTsKLX0KLQotLyogVGhpcyB3aG9sZSBmdW5jdGlvbiBpcyBhIGhhY2suIDopICovCi1zdGF0aWMgVWludDMyIGdldF92aWRlb19zaXplKF9USElTKQotewotCS8qIFRoaXMgaXMgYSBub24tZXhwb3J0ZWQgZnVuY3Rpb24gZnJvbSBsaWJYeGY4NmRnYS5hICovCi0JZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKlNETF9OQU1FKFhER0FHZXRNYXBwZWRNZW1vcnkpKGludCBzY3JlZW4pOwotCUZJTEUgKnByb2M7Ci0JdW5zaWduZWQgbG9uZyBtZW07Ci0JdW5zaWduZWQgc3RhcnQsIHN0b3A7Ci0JY2hhciBsaW5lW0JVRlNJWl07Ci0JVWludDMyIHNpemU7Ci0KLQltZW0gPSAodW5zaWduZWQgbG9uZylTRExfTkFNRShYREdBR2V0TWFwcGVkTWVtb3J5KShER0FfU2NyZWVuKTsKLQlzaXplID0gMDsKLQlwcm9jID0gZm9wZW4oIi9wcm9jL3NlbGYvbWFwcyIsICJyIik7Ci0JaWYgKCBwcm9jICkgewotCQl3aGlsZSAoIGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKS0xLCBwcm9jKSApIHsKLQkJCVNETF9zc2NhbmYobGluZSwgIiV4LSV4IiwgJnN0YXJ0LCAmc3RvcCk7Ci0JCQlpZiAoIHN0YXJ0ID09IG1lbSApIHsKLQkJCQlzaXplID0gKFVpbnQzMikoKHN0b3Atc3RhcnQpLzEwMjQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWZjbG9zZShwcm9jKTsKLQl9Ci0JcmV0dXJuKHNpemUpOwotfQotCi0jaWZkZWYgREdBX0RFQlVHCi1zdGF0aWMgdm9pZCBQcmludE1vZGUoU0RMX05BTUUoWERHQU1vZGUpICptb2RlKQotewotCXByaW50ZigiTW9kZTogJXMgKCVkeCVkKSBhdCAlZCBicHAgKCVmIHJlZnJlc2gsICVkIHBpdGNoKSBudW06ICVkXG4iLAotCQltb2RlLT5uYW1lLAotCQltb2RlLT52aWV3cG9ydFdpZHRoLCBtb2RlLT52aWV3cG9ydEhlaWdodCwKLQkJbW9kZS0+ZGVwdGggPT0gMjQgPyBtb2RlLT5iaXRzUGVyUGl4ZWwgOiBtb2RlLT5kZXB0aCwKLQkJbW9kZS0+dmVydGljYWxSZWZyZXNoLCBtb2RlLT5ieXRlc1BlclNjYW5saW5lLCBtb2RlLT5udW0pOwotCXByaW50ZigiXHRSR0I6IDB4JTguOHggMHglOC44eCAweCU4Ljh4ICglZCAtICVzKVxuIiwKLQkJbW9kZS0+cmVkTWFzaywgbW9kZS0+Z3JlZW5NYXNrLCBtb2RlLT5ibHVlTWFzaywKLQkJbW9kZS0+dmlzdWFsQ2xhc3MsCi0JCW1vZGUtPnZpc3VhbENsYXNzID09IFRydWVDb2xvciA/ICJ0cnVlY29sb3IiIDoKLQkJbW9kZS0+dmlzdWFsQ2xhc3MgPT0gRGlyZWN0Q29sb3IgPyAiZGlyZWN0Y29sb3IiIDoKLQkJbW9kZS0+dmlzdWFsQ2xhc3MgPT0gUHNldWRvQ29sb3IgPyAicHNldWRvY29sb3IiIDogInVua25vd24iKTsKLQlwcmludGYoIlx0RmxhZ3M6ICIpOwotCWlmICggbW9kZS0+ZmxhZ3MgJiBYREdBQ29uY3VycmVudEFjY2VzcyApCi0JCXByaW50ZigiIFhER0FDb25jdXJyZW50QWNjZXNzIik7Ci0JaWYgKCBtb2RlLT5mbGFncyAmIFhER0FTb2xpZEZpbGxSZWN0ICkKLQkJcHJpbnRmKCIgWERHQVNvbGlkRmlsbFJlY3QiKTsKLQlpZiAoIG1vZGUtPmZsYWdzICYgWERHQUJsaXRSZWN0ICkKLQkJcHJpbnRmKCIgWERHQUJsaXRSZWN0Iik7Ci0JaWYgKCBtb2RlLT5mbGFncyAmIFhER0FCbGl0VHJhbnNSZWN0ICkKLQkJcHJpbnRmKCIgWERHQUJsaXRUcmFuc1JlY3QiKTsKLQlpZiAoIG1vZGUtPmZsYWdzICYgWERHQVBpeG1hcCApCi0JCXByaW50ZigiIFhER0FQaXhtYXAiKTsKLQlpZiAoIG1vZGUtPmZsYWdzICYgWERHQUludGVybGFjZWQgKQotCQlwcmludGYoIiBYREdBSW50ZXJsYWNlZCIpOwotCWlmICggbW9kZS0+ZmxhZ3MgJiBYREdBRG91Ymxlc2NhbiApCi0JCXByaW50ZigiIFhER0FEb3VibGVzY2FuIik7Ci0JaWYgKCBtb2RlLT52aWV3cG9ydEZsYWdzICYgWERHQUZsaXBSZXRyYWNlICkKLQkJcHJpbnRmKCIgWERHQUZsaXBSZXRyYWNlIik7Ci0JaWYgKCBtb2RlLT52aWV3cG9ydEZsYWdzICYgWERHQUZsaXBJbW1lZGlhdGUgKQotCQlwcmludGYoIiBYREdBRmxpcEltbWVkaWF0ZSIpOwotCXByaW50ZigiXG4iKTsKLX0KLSNlbmRpZiAvKiBER0FfREVCVUcgKi8KLQotc3RhdGljIGludCBjbXBtb2Rlcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCi17Ci0gICAgY29uc3QgU0RMX05BTUUoWERHQU1vZGUpICphID0gKGNvbnN0IFNETF9OQU1FKFhER0FNb2RlKSAqKXZhOwotICAgIGNvbnN0IFNETF9OQU1FKFhER0FNb2RlKSAqYiA9IChjb25zdCBTRExfTkFNRShYREdBTW9kZSkgKil2YjsKLQotICAgIGlmICggKGEtPnZpZXdwb3J0V2lkdGggPT0gYi0+dmlld3BvcnRXaWR0aCkgJiYKLSAgICAgICAgIChiLT52aWV3cG9ydEhlaWdodCA9PSBhLT52aWV3cG9ydEhlaWdodCkgKSB7Ci0gICAgICAgIC8qIFByZWZlciAzMiBicHAgb3ZlciAyNCBicHAsIDE2IGJwcCBvdmVyIDE1IGJwcCAqLwotICAgICAgICBpbnQgYV9icHAgPSBhLT5kZXB0aCA9PSAyNCA/IGEtPmJpdHNQZXJQaXhlbCA6IGEtPmRlcHRoOwotICAgICAgICBpbnQgYl9icHAgPSBiLT5kZXB0aCA9PSAyNCA/IGItPmJpdHNQZXJQaXhlbCA6IGItPmRlcHRoOwotICAgICAgICBpZiAoIGFfYnBwICE9IGJfYnBwICkgewotICAgICAgICAgICAgcmV0dXJuIGJfYnBwIC0gYV9icHA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogUHJlZmVyIERpcmVjdENvbG9yIHZpc3VhbHMsIGZvciBnYW1tYSBzdXBwb3J0ICovCi0gICAgICAgIGlmICggYS0+dmlzdWFsQ2xhc3MgPT0gRGlyZWN0Q29sb3IgJiYgYi0+dmlzdWFsQ2xhc3MgIT0gRGlyZWN0Q29sb3IgKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoIGItPnZpc3VhbENsYXNzID09IERpcmVjdENvbG9yICYmIGEtPnZpc3VhbENsYXNzICE9IERpcmVjdENvbG9yICkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAvKiBNYWludGFpbiBzZXJ2ZXIgcmVmcmVzaCByYXRlIHNvcnRpbmcgKi8KLSAgICAgICAgcmV0dXJuIGEtPm51bSAtIGItPm51bTsKLSAgICB9IGVsc2UgaWYgKCBhLT52aWV3cG9ydFdpZHRoID09IGItPnZpZXdwb3J0V2lkdGggKSB7Ci0gICAgICAgIHJldHVybiBiLT52aWV3cG9ydEhlaWdodCAtIGEtPnZpZXdwb3J0SGVpZ2h0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBiLT52aWV3cG9ydFdpZHRoIC0gYS0+dmlld3BvcnRXaWR0aDsKLSAgICB9Ci19Ci1zdGF0aWMgdm9pZCBVcGRhdGVIV0luZm8oX1RISVMsIFNETF9OQU1FKFhER0FNb2RlKSAqbW9kZSkKLXsKLQl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDA7Ci0JdGhpcy0+aW5mby5od19hdmFpbGFibGUgPSAxOwotCWlmICggbW9kZS0+ZmxhZ3MgJiBYREdBQmxpdFJlY3QgKSB7Ci0JCXRoaXMtPmluZm8uYmxpdF9odyA9IDE7Ci0JfSBlbHNlIHsKLQkJdGhpcy0+aW5mby5ibGl0X2h3ID0gMDsKLQl9Ci0JaWYgKCBtb2RlLT5mbGFncyAmIFhER0FCbGl0VHJhbnNSZWN0ICkgewotCQl0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgPSAxOwotCX0gZWxzZSB7Ci0JCXRoaXMtPmluZm8uYmxpdF9od19DQyA9IDA7Ci0JfQotCWlmICggbW9kZS0+ZmxhZ3MgJiBYREdBU29saWRGaWxsUmVjdCApIHsKLQkJdGhpcy0+aW5mby5ibGl0X2ZpbGwgPSAxOwotCX0gZWxzZSB7Ci0JCXRoaXMtPmluZm8uYmxpdF9maWxsID0gMDsKLQl9Ci0JdGhpcy0+aW5mby52aWRlb19tZW0gPSBnZXRfdmlkZW9fc2l6ZSh0aGlzKTsKLX0KLQotc3RhdGljIGludCBER0FfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCi17Ci0JY29uc3QgY2hhciAqZGlzcGxheTsKLQlpbnQgZXZlbnRfYmFzZSwgZXJyb3JfYmFzZTsKLQlpbnQgbWFqb3JfdmVyc2lvbiwgbWlub3JfdmVyc2lvbjsKLQlWaXN1YWwgKnZpc3VhbDsKLQlTRExfTkFNRShYREdBTW9kZSkgKm1vZGVzOwotCWludCBpLCBudW1fbW9kZXM7Ci0KLQkvKiBPcGVuIHRoZSBYMTEgZGlzcGxheSAqLwotCWRpc3BsYXkgPSBOVUxMOwkJLyogR2V0IGl0IGZyb20gRElTUExBWSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLwotCi0JREdBX0Rpc3BsYXkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheSk7Ci0JaWYgKCBER0FfRGlzcGxheSA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gWDExIGRpc3BsYXkiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBDaGVjayBmb3IgdGhlIERHQSBleHRlbnNpb24gKi8KLQlpZiAoICEgU0RMX05BTUUoWERHQVF1ZXJ5RXh0ZW5zaW9uKShER0FfRGlzcGxheSwgJmV2ZW50X2Jhc2UsICZlcnJvcl9iYXNlKSB8fAotCSAgICAgISBTRExfTkFNRShYREdBUXVlcnlWZXJzaW9uKShER0FfRGlzcGxheSwgJm1ham9yX3ZlcnNpb24sICZtaW5vcl92ZXJzaW9uKSApIHsKLQkJU0RMX1NldEVycm9yKCJER0EgZXh0ZW5zaW9uIG5vdCBhdmFpbGFibGUiKTsKLQkJWENsb3NlRGlzcGxheShER0FfRGlzcGxheSk7Ci0JCXJldHVybigtMSk7Ci0JfQotCWlmICggbWFqb3JfdmVyc2lvbiA8IDIgKSB7Ci0JCVNETF9TZXRFcnJvcigiREdBIGRyaXZlciByZXF1aXJlcyBER0EgMi4wIG9yIG5ld2VyIik7Ci0JCVhDbG9zZURpc3BsYXkoREdBX0Rpc3BsYXkpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlER0FfZXZlbnRfYmFzZSA9IGV2ZW50X2Jhc2U7Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUgKi8KLQl0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IERpc3BsYXlXaWR0aChER0FfRGlzcGxheSwgREdBX1NjcmVlbik7Ci0JdGhpcy0+aW5mby5jdXJyZW50X2ggPSBEaXNwbGF5SGVpZ2h0KERHQV9EaXNwbGF5LCBER0FfU2NyZWVuKTsKLQotCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gZGVwdGggKi8KLQl2aXN1YWwgPSBEZWZhdWx0VmlzdWFsKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuKTsKLQl7Ci0JCVhQaXhtYXBGb3JtYXRWYWx1ZXMgKnBpeF9mb3JtYXQ7Ci0JCWludCBpLCBudW1fZm9ybWF0czsKLQotCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBEZWZhdWx0RGVwdGgoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4pOwotCQlwaXhfZm9ybWF0ID0gWExpc3RQaXhtYXBGb3JtYXRzKERHQV9EaXNwbGF5LCAmbnVtX2Zvcm1hdHMpOwotCQlpZiAoIHBpeF9mb3JtYXQgPT0gTlVMTCApIHsKLQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZGV0ZXJtaW5lIHNjcmVlbiBmb3JtYXRzIik7Ci0JCQlYQ2xvc2VEaXNwbGF5KERHQV9EaXNwbGF5KTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJZm9yICggaT0wOyBpPG51bV9mb3JtYXRzOyArK2kgKSB7Ci0JCQlpZiAoIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9PSBwaXhfZm9ybWF0W2ldLmRlcHRoICkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoIGkgIT0gbnVtX2Zvcm1hdHMgKQotCQkJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gcGl4X2Zvcm1hdFtpXS5iaXRzX3Blcl9waXhlbDsKLQkJWEZyZWUoKGNoYXIgKilwaXhfZm9ybWF0KTsKLQl9Ci0JaWYgKCB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPiA4ICkgewotCQl2Zm9ybWF0LT5SbWFzayA9IHZpc3VhbC0+cmVkX21hc2s7Ci0JCXZmb3JtYXQtPkdtYXNrID0gdmlzdWFsLT5ncmVlbl9tYXNrOwotCQl2Zm9ybWF0LT5CbWFzayA9IHZpc3VhbC0+Ymx1ZV9tYXNrOwotCX0KLQotCS8qIE9wZW4gYWNjZXNzIHRvIHRoZSBmcmFtZWJ1ZmZlciAqLwotCWlmICggISBTRExfTkFNRShYREdBT3BlbkZyYW1lYnVmZmVyKShER0FfRGlzcGxheSwgREdBX1NjcmVlbikgKSB7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG1hcCB0aGUgdmlkZW8gbWVtb3J5Iik7Ci0JCVhDbG9zZURpc3BsYXkoREdBX0Rpc3BsYXkpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFNhdmUgRFBNUyBhbmQgc2NyZWVuc2F2ZXIgc2V0dGluZ3MgKi8KLQlYMTFfU2F2ZVNjcmVlblNhdmVyKERHQV9EaXNwbGF5LCAmc2NyZWVuc2F2ZXJfdGltZW91dCwgJmRwbXNfZW5hYmxlZCk7Ci0JWDExX0Rpc2FibGVTY3JlZW5TYXZlcihER0FfRGlzcGxheSk7Ci0KLQkvKiBRdWVyeSBmb3IgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHZpZGVvIG1vZGVzICovCi0JbW9kZXMgPSBTRExfTkFNRShYREdBUXVlcnlNb2RlcykoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sICZudW1fbW9kZXMpOwotCVNETF9xc29ydChtb2RlcywgbnVtX21vZGVzLCBzaXplb2YgKm1vZGVzLCBjbXBtb2Rlcyk7Ci0JZm9yICggaT0wOyBpPG51bV9tb2RlczsgKytpICkgewotCQlpZiAoICgobW9kZXNbaV0udmlzdWFsQ2xhc3MgPT0gUHNldWRvQ29sb3IpIHx8Ci0JCSAgICAgIChtb2Rlc1tpXS52aXN1YWxDbGFzcyA9PSBEaXJlY3RDb2xvcikgfHwKLQkJICAgICAgKG1vZGVzW2ldLnZpc3VhbENsYXNzID09IFRydWVDb2xvcikpICYmIAotCQkgICAgICEobW9kZXNbaV0uZmxhZ3MgJiAoWERHQUludGVybGFjZWR8WERHQURvdWJsZXNjYW4pKSApIHsKLSNpZmRlZiBER0FfREVCVUcKLQkJCVByaW50TW9kZSgmbW9kZXNbaV0pOwotI2VuZGlmCi0JCQlER0FfQWRkTW9kZSh0aGlzLCBtb2Rlc1tpXS5iaXRzUGVyUGl4ZWwsCi0JCQkgICAgICAgICAgICBtb2Rlc1tpXS52aWV3cG9ydFdpZHRoLAotCQkJICAgICAgICAgICAgbW9kZXNbaV0udmlld3BvcnRIZWlnaHQpOwotCQl9Ci0JfQotCVVwZGF0ZUhXSW5mbyh0aGlzLCBtb2Rlcyk7Ci0JWEZyZWUobW9kZXMpOwotCi0JLyogQ3JlYXRlIHRoZSBoYXJkd2FyZSBzdXJmYWNlIGxvY2sgbXV0ZXggKi8KLQlod19sb2NrID0gU0RMX0NyZWF0ZU11dGV4KCk7Ci0JaWYgKCBod19sb2NrID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBsb2NrIG11dGV4Iik7Ci0JCURHQV9WaWRlb1F1aXQodGhpcyk7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0jaWZkZWYgTE9DS19ER0FfRElTUExBWQotCS8qIENyZWF0ZSB0aGUgZXZlbnQgbG9jayBzbyB3ZSdyZSB0aHJlYWQtc2FmZS4uIDotLyAqLwotCWV2ZW50X2xvY2sgPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLSNlbmRpZiAvKiBMT0NLX0RHQV9ESVNQTEFZICovCi0KLQkvKiBXZSdyZSBkb25lISAqLwotCXJldHVybigwKTsKLX0KLQotU0RMX1JlY3QgKipER0FfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQotewotCXJldHVybihTRExfbW9kZWxpc3RbKChmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xXSk7Ci19Ci0KLS8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCi1zdGF0aWMgdm9pZCBER0FfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci0KLVNETF9TdXJmYWNlICpER0FfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLQlTRExfTkFNRShYREdBTW9kZSkgKm1vZGVzOwotCWludCBpLCBudW1fbW9kZXM7Ci0JU0RMX05BTUUoWERHQURldmljZSkgKm1vZGU7Ci0JaW50IHNjcmVlbl9sZW47Ci0JVWludDggKnN1cmZhY2VzX21lbTsKLQlpbnQgc3VyZmFjZXNfbGVuOwotCi0JLyogRnJlZSBhbnkgcHJldmlvdXMgY29sb3JtYXAgKi8KLQlpZiAoIERHQV9jb2xvcm1hcCApIHsKLQkJWEZyZWVDb2xvcm1hcChER0FfRGlzcGxheSwgREdBX2NvbG9ybWFwKTsKLQkJREdBX2NvbG9ybWFwID0gMDsKLQl9Ci0KLQkvKiBTZWFyY2ggZm9yIGEgbWF0Y2hpbmcgdmlkZW8gbW9kZSAqLwotCW1vZGVzID0gU0RMX05BTUUoWERHQVF1ZXJ5TW9kZXMpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuLCAmbnVtX21vZGVzKTsKLQlTRExfcXNvcnQobW9kZXMsIG51bV9tb2Rlcywgc2l6ZW9mICptb2RlcywgY21wbW9kZXMpOwotCWZvciAoIGk9MDsgaTxudW1fbW9kZXM7ICsraSApIHsKLQkJaW50IGRlcHRoOwotCi0JCWRlcHRoID0gbW9kZXNbaV0uZGVwdGg7Ci0JCWlmICggZGVwdGggPT0gMjQgKSB7IC8qIERpc3Rpbmd1aXNoIGJldHdlZW4gMjQgYW5kIDMyIGJwcCAqLwotCQkJZGVwdGggPSBtb2Rlc1tpXS5iaXRzUGVyUGl4ZWw7Ci0JCX0KLQkJaWYgKCAoZGVwdGggPT0gYnBwKSAmJgotCQkgICAgIChtb2Rlc1tpXS52aWV3cG9ydFdpZHRoID09IHdpZHRoKSAmJgotCQkgICAgIChtb2Rlc1tpXS52aWV3cG9ydEhlaWdodCA9PSBoZWlnaHQpICYmCi0JCSAgICAgKChtb2Rlc1tpXS52aXN1YWxDbGFzcyA9PSBQc2V1ZG9Db2xvcikgfHwKLQkJICAgICAgKG1vZGVzW2ldLnZpc3VhbENsYXNzID09IERpcmVjdENvbG9yKSB8fAotCQkgICAgICAobW9kZXNbaV0udmlzdWFsQ2xhc3MgPT0gVHJ1ZUNvbG9yKSkgJiYKLQkJICAgICAhKG1vZGVzW2ldLmZsYWdzICYgKFhER0FJbnRlcmxhY2VkfFhER0FEb3VibGVzY2FuKSkgKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIGkgPT0gbnVtX21vZGVzICkgewotCQlTRExfU2V0RXJyb3IoIk5vIG1hdGNoaW5nIHZpZGVvIG1vZGUgZm91bmQiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLSNpZmRlZiBER0FfREVCVUcKLQlQcmludE1vZGUoJm1vZGVzW2ldKTsKLSNlbmRpZgotCi0JLyogU2V0IHRoZSB2aWRlbyBtb2RlICovCi0JbW9kZSA9IFNETF9OQU1FKFhER0FTZXRNb2RlKShER0FfRGlzcGxheSwgREdBX1NjcmVlbiwgbW9kZXNbaV0ubnVtKTsKLQlYRnJlZShtb2Rlcyk7Ci0JaWYgKCBtb2RlID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIHN3aXRjaCB0byByZXF1ZXN0ZWQgbW9kZSIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCURHQV92aXN1YWxDbGFzcyA9IG1vZGUtPm1vZGUudmlzdWFsQ2xhc3M7Ci0JbWVtb3J5X2Jhc2UgPSAoVWludDggKiltb2RlLT5kYXRhOwotCW1lbW9yeV9waXRjaCA9IG1vZGUtPm1vZGUuYnl0ZXNQZXJTY2FubGluZTsKLQotCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KLQljdXJyZW50LT5mbGFncyA9IChTRExfRlVMTFNDUkVFTnxTRExfSFdTVVJGQUNFKTsKLQljdXJyZW50LT53ID0gbW9kZS0+bW9kZS52aWV3cG9ydFdpZHRoOwotCWN1cnJlbnQtPmggPSBtb2RlLT5tb2RlLnZpZXdwb3J0SGVpZ2h0OwotCWN1cnJlbnQtPnBpdGNoID0gbWVtb3J5X3BpdGNoOwotCWN1cnJlbnQtPnBpeGVscyA9IG1lbW9yeV9iYXNlOwotCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBtb2RlLT5tb2RlLmJpdHNQZXJQaXhlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS0+bW9kZS5yZWRNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLT5tb2RlLmdyZWVuTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS0+bW9kZS5ibHVlTWFzaywgMCkgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0Jc2NyZWVuX2xlbiA9IGN1cnJlbnQtPmgqY3VycmVudC0+cGl0Y2g7Ci0KLQkvKiBDcmVhdGUgYSBjb2xvcm1hcCBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoIChER0FfdmlzdWFsQ2xhc3MgPT0gUHNldWRvQ29sb3IpIHx8Ci0gICAgICAgICAgICAgKERHQV92aXN1YWxDbGFzcyA9PSBEaXJlY3RDb2xvcikgKSB7Ci0JCURHQV9jb2xvcm1hcCA9IFNETF9OQU1FKFhER0FDcmVhdGVDb2xvcm1hcCkoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sCi0JCQkJCQkJbW9kZSwgQWxsb2NBbGwpOwotCQlpZiAoIERHQV92aXN1YWxDbGFzcyA9PSBQc2V1ZG9Db2xvciApIHsKLQkJCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9IV1BBTEVUVEU7Ci0JCX0gZWxzZSB7Ci0JICAgIAkJLyogSW5pdGlhbGl6ZSB0aGUgY29sb3JtYXAgdG8gdGhlIGlkZW50aXR5IG1hcHBpbmcgKi8KLQkgICAgCQlTRExfR2V0R2FtbWFSYW1wKDAsIDAsIDApOwotCSAgICAJCXRoaXMtPnNjcmVlbiA9IGN1cnJlbnQ7Ci0JICAgIAkJREdBX1NldEdhbW1hUmFtcCh0aGlzLCB0aGlzLT5nYW1tYSk7Ci0JCQl0aGlzLT5zY3JlZW4gPSBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJREdBX2NvbG9ybWFwID0gU0RMX05BTUUoWERHQUNyZWF0ZUNvbG9ybWFwKShER0FfRGlzcGxheSwgREdBX1NjcmVlbiwKLQkJCQkJCQltb2RlLCBBbGxvY05vbmUpOwotCX0KLQlTRExfTkFNRShYREdBSW5zdGFsbENvbG9ybWFwKShER0FfRGlzcGxheSwgREdBX1NjcmVlbiwgREdBX2NvbG9ybWFwKTsKLQotCS8qIFVwZGF0ZSB0aGUgaGFyZHdhcmUgY2FwYWJpbGl0aWVzICovCi0JVXBkYXRlSFdJbmZvKHRoaXMsICZtb2RlLT5tb2RlKTsKLQotCS8qIFNldCB1cCB0aGUgaW5mb3JtYXRpb24gZm9yIGhhcmR3YXJlIHN1cmZhY2VzICovCi0Jc3VyZmFjZXNfbWVtID0gKFVpbnQ4ICopY3VycmVudC0+cGl4ZWxzICsgc2NyZWVuX2xlbjsKLQlzdXJmYWNlc19sZW4gPSAobW9kZS0+bW9kZS5pbWFnZUhlaWdodCpjdXJyZW50LT5waXRjaCAtIHNjcmVlbl9sZW4pOwotCi0JLyogVXBkYXRlIGZvciBkb3VibGUtYnVmZmVyaW5nLCBpZiB3ZSBjYW4gKi8KLQlTRExfTkFNRShYREdBU2V0Vmlld3BvcnQpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuLCAwLCAwLCBYREdBRmxpcFJldHJhY2UpOwotCWlmICggZmxhZ3MgJiBTRExfRE9VQkxFQlVGICkgewotCQlpZiAoIG1vZGUtPm1vZGUuaW1hZ2VIZWlnaHQgPj0gKGN1cnJlbnQtPmgqMikgKSB7Ci0JCQljdXJyZW50LT5mbGFncyB8PSBTRExfRE9VQkxFQlVGOwotCQkJZmxpcF9wYWdlID0gMDsKLQkJCWZsaXBfeW9mZnNldFswXSA9IDA7Ci0JCQlmbGlwX3lvZmZzZXRbMV0gPSBjdXJyZW50LT5oOwotCQkJZmxpcF9hZGRyZXNzWzBdID0gbWVtb3J5X2Jhc2U7Ci0JCQlmbGlwX2FkZHJlc3NbMV0gPSBtZW1vcnlfYmFzZStzY3JlZW5fbGVuOwotCQkJc3VyZmFjZXNfbWVtICs9IHNjcmVlbl9sZW47Ci0JCQlzdXJmYWNlc19sZW4gLT0gc2NyZWVuX2xlbjsKLQkJfQotCX0KLQotCS8qIEFsbG9jYXRlIG1lbW9yeSB0cmFja2luZyBmb3IgaGFyZHdhcmUgc3VyZmFjZXMgKi8KLQlER0FfRnJlZUhXU3VyZmFjZXModGhpcyk7Ci0JaWYgKCBzdXJmYWNlc19sZW4gPCAwICkgewotCQlzdXJmYWNlc19sZW4gPSAwOwotCX0KLQlER0FfSW5pdEhXU3VyZmFjZXModGhpcywgY3VycmVudCwgc3VyZmFjZXNfbWVtLCBzdXJmYWNlc19sZW4pOwotCi0JLyogRXhwb3NlIHRoZSBiYWNrIGJ1ZmZlciBhcyBzdXJmYWNlIG1lbW9yeSAqLwotCWlmICggY3VycmVudC0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGICkgewotCQl0aGlzLT5zY3JlZW4gPSBjdXJyZW50OwotCQlER0FfRmxpcEhXU3VyZmFjZSh0aGlzLCBjdXJyZW50KTsKLQkJdGhpcy0+c2NyZWVuID0gTlVMTDsKLQl9Ci0KLQkvKiBTZXQgdGhlIHVwZGF0ZSByZWN0YW5nbGUgZnVuY3Rpb24gKi8KLQl0aGlzLT5VcGRhdGVSZWN0cyA9IERHQV9EaXJlY3RVcGRhdGU7Ci0KLQkvKiBFbmFibGUgbW91c2UgYW5kIGtleWJvYXJkIHN1cHBvcnQgKi8KLQl7IGxvbmcgaW5wdXRfbWFzazsKLQkgIGlucHV0X21hc2sgPSAoS2V5UHJlc3NNYXNrIHwgS2V5UmVsZWFzZU1hc2spOwotCSAgaW5wdXRfbWFzayB8PSAoQnV0dG9uUHJlc3NNYXNrIHwgQnV0dG9uUmVsZWFzZU1hc2spOwotCSAgaW5wdXRfbWFzayB8PSBQb2ludGVyTW90aW9uTWFzazsKLQkgIFNETF9OQU1FKFhER0FTZWxlY3RJbnB1dCkoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sIGlucHV0X21hc2spOwotCX0KLQotCS8qIFdlJ3JlIGRvbmUgKi8KLQlyZXR1cm4oY3VycmVudCk7Ci19Ci0KLSNpZmRlZiBER0FfREVCVUcKLXN0YXRpYyB2b2lkIERHQV9EdW1wSFdTdXJmYWNlcyhfVEhJUykKLXsKLQl2aWRtZW1fYnVja2V0ICpidWNrZXQ7Ci0KLQlwcmludGYoIk1lbW9yeSBsZWZ0OiAlZCAoJWQgdG90YWwpXG4iLCBzdXJmYWNlc19tZW1sZWZ0LCBzdXJmYWNlc19tZW10b3RhbCk7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiICAgICAgICAgQmFzZSAgU2l6ZVxuIik7Ci0JZm9yICggYnVja2V0PSZzdXJmYWNlczsgYnVja2V0OyBidWNrZXQ9YnVja2V0LT5uZXh0ICkgewotCQlwcmludGYoIkJ1Y2tldDogICVwLCAlZCAoJXMpXG4iLCBidWNrZXQtPmJhc2UsIGJ1Y2tldC0+c2l6ZSwgYnVja2V0LT51c2VkID8gInVzZWQiIDogImZyZWUiKTsKLQkJaWYgKCBidWNrZXQtPnByZXYgKSB7Ci0JCQlpZiAoIGJ1Y2tldC0+YmFzZSAhPSBidWNrZXQtPnByZXYtPmJhc2UrYnVja2V0LT5wcmV2LT5zaXplICkgewotCQkJCXByaW50ZigiV2FybmluZywgY29ycnVwdCBidWNrZXQgbGlzdCEgKHByZXYpXG4iKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICggYnVja2V0ICE9ICZzdXJmYWNlcyApIHsKLQkJCQlwcmludGYoIldhcm5pbmcsIGNvcnJ1cHQgYnVja2V0IGxpc3QhICghcHJldilcbiIpOwotCQkJfQotCQl9Ci0JCWlmICggYnVja2V0LT5uZXh0ICkgewotCQkJaWYgKCBidWNrZXQtPm5leHQtPmJhc2UgIT0gYnVja2V0LT5iYXNlK2J1Y2tldC0+c2l6ZSApIHsKLQkJCQlwcmludGYoIldhcm5pbmcsIGNvcnJ1cHQgYnVja2V0IGxpc3QhIChuZXh0KVxuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpbnRmKCJcbiIpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgREdBX0luaXRIV1N1cmZhY2VzKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuLCBVaW50OCAqYmFzZSwgaW50IHNpemUpCi17Ci0JdmlkbWVtX2J1Y2tldCAqYnVja2V0OwotCi0Jc3VyZmFjZXNfbWVtdG90YWwgPSBzaXplOwotCXN1cmZhY2VzX21lbWxlZnQgPSBzaXplOwotCi0JaWYgKCBzdXJmYWNlc19tZW1sZWZ0ID4gMCApIHsKLQkJYnVja2V0ID0gKHZpZG1lbV9idWNrZXQgKilTRExfbWFsbG9jKHNpemVvZigqYnVja2V0KSk7Ci0JCWlmICggYnVja2V0ID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJYnVja2V0LT5wcmV2ID0gJnN1cmZhY2VzOwotCQlidWNrZXQtPnVzZWQgPSAwOwotCQlidWNrZXQtPmRpcnR5ID0gMDsKLQkJYnVja2V0LT5iYXNlID0gYmFzZTsKLQkJYnVja2V0LT5zaXplID0gc2l6ZTsKLQkJYnVja2V0LT5uZXh0ID0gTlVMTDsKLQl9IGVsc2UgewotCQlidWNrZXQgPSBOVUxMOwotCX0KLQotCXN1cmZhY2VzLnByZXYgPSBOVUxMOwotCXN1cmZhY2VzLnVzZWQgPSAxOwotCXN1cmZhY2VzLmRpcnR5ID0gMDsKLQlzdXJmYWNlcy5iYXNlID0gc2NyZWVuLT5waXhlbHM7Ci0Jc3VyZmFjZXMuc2l6ZSA9ICh1bnNpZ25lZCBpbnQpKChsb25nKWJhc2UgLSAobG9uZylzdXJmYWNlcy5iYXNlKTsKLQlzdXJmYWNlcy5uZXh0ID0gYnVja2V0OwotCXNjcmVlbi0+aHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX2h3ZGF0YSAqKSZzdXJmYWNlczsKLQlyZXR1cm4oMCk7Ci19Ci1zdGF0aWMgdm9pZCBER0FfRnJlZUhXU3VyZmFjZXMoX1RISVMpCi17Ci0JdmlkbWVtX2J1Y2tldCAqYnVja2V0LCAqZnJlZWFibGU7Ci0KLQlidWNrZXQgPSBzdXJmYWNlcy5uZXh0OwotCXdoaWxlICggYnVja2V0ICkgewotCQlmcmVlYWJsZSA9IGJ1Y2tldDsKLQkJYnVja2V0ID0gYnVja2V0LT5uZXh0OwotCQlTRExfZnJlZShmcmVlYWJsZSk7Ci0JfQotCXN1cmZhY2VzLm5leHQgPSBOVUxMOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIERHQV9BZGRCdXN5U3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQkoKHZpZG1lbV9idWNrZXQgKilzdXJmYWNlLT5od2RhdGEpLT5kaXJ0eSA9IDE7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBER0FfSXNTdXJmYWNlQnVzeShTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4gKCh2aWRtZW1fYnVja2V0ICopc3VyZmFjZS0+aHdkYXRhKS0+ZGlydHk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgREdBX1dhaXRCdXN5U3VyZmFjZXMoX1RISVMpCi17Ci0JdmlkbWVtX2J1Y2tldCAqYnVja2V0OwotCi0JLyogV2FpdCBmb3IgZ3JhcGhpYyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlICovCi0JU0RMX05BTUUoWERHQVN5bmMpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuKTsKLQotCS8qIENsZWFyIGFsbCBzdXJmYWNlIGRpcnR5IGJpdHMgKi8KLQlmb3IgKCBidWNrZXQ9JnN1cmZhY2VzOyBidWNrZXQ7IGJ1Y2tldD1idWNrZXQtPm5leHQgKSB7Ci0JCWJ1Y2tldC0+ZGlydHkgPSAwOwotCX0KLX0KLQotc3RhdGljIGludCBER0FfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXZpZG1lbV9idWNrZXQgKmJ1Y2tldDsKLQlpbnQgc2l6ZTsKLQlpbnQgZXh0cmE7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLS8qIFRlbXBvcmFyaWx5LCB3ZSBvbmx5IGFsbG93IHN1cmZhY2VzIHRoZSBzYW1lIHdpZHRoIGFzIGRpc3BsYXkuCi0gICBTb21lIGJsaXR0ZXJzIHJlcXVpcmUgdGhlIHBpdGNoIGJldHdlZW4gdHdvIGhhcmR3YXJlIHN1cmZhY2VzCi0gICB0byBiZSB0aGUgc2FtZS4gIE90aGVycyBoYXZlIGludGVyZXN0aW5nIGFsaWdubWVudCByZXN0cmljdGlvbnMuCi0qLwotaWYgKCBzdXJmYWNlLT5waXRjaCA+IFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoICkgewotCVNETF9TZXRFcnJvcigiU3VyZmFjZSByZXF1ZXN0ZWQgd2lkZXIgdGhhbiBzY3JlZW4iKTsKLQlyZXR1cm4oLTEpOwotfQotc3VyZmFjZS0+cGl0Y2ggPSBTRExfVmlkZW9TdXJmYWNlLT5waXRjaDsKLQlzaXplID0gc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoOwotI2lmZGVmIERHQV9ERUJVRwotCWZwcmludGYoc3RkZXJyLCAiQWxsb2NhdGluZyBidWNrZXQgb2YgJWQgYnl0ZXNcbiIsIHNpemUpOwotI2VuZGlmCi0JTE9DS19ESVNQTEFZKCk7Ci0KLQkvKiBRdWljayBjaGVjayBmb3IgYXZhaWxhYmxlIG1lbSAqLwotCWlmICggc2l6ZSA+IHN1cmZhY2VzX21lbWxlZnQgKSB7Ci0JCVNETF9TZXRFcnJvcigiTm90IGVub3VnaCB2aWRlbyBtZW1vcnkiKTsKLQkJcmV0dmFsID0gLTE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBTZWFyY2ggZm9yIGFuIGVtcHR5IGJ1Y2tldCBiaWcgZW5vdWdoICovCi0JZm9yICggYnVja2V0PSZzdXJmYWNlczsgYnVja2V0OyBidWNrZXQ9YnVja2V0LT5uZXh0ICkgewotCQlpZiAoICEgYnVja2V0LT51c2VkICYmIChzaXplIDw9IGJ1Y2tldC0+c2l6ZSkgKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIGJ1Y2tldCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIlZpZGVvIG1lbW9yeSB0b28gZnJhZ21lbnRlZCIpOwotCQlyZXR2YWwgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIENyZWF0ZSBhIG5ldyBidWNrZXQgZm9yIGxlZnQtb3ZlciBtZW1vcnkgKi8KLQlleHRyYSA9IChidWNrZXQtPnNpemUgLSBzaXplKTsKLQlpZiAoIGV4dHJhICkgewotCQl2aWRtZW1fYnVja2V0ICpuZXdidWNrZXQ7Ci0KLSNpZmRlZiBER0FfREVCVUcKLQlmcHJpbnRmKHN0ZGVyciwgIkFkZGluZyBuZXcgZnJlZSBidWNrZXQgb2YgJWQgYnl0ZXNcbiIsIGV4dHJhKTsKLSNlbmRpZgotCQluZXdidWNrZXQgPSAodmlkbWVtX2J1Y2tldCAqKVNETF9tYWxsb2Moc2l6ZW9mKCpuZXdidWNrZXQpKTsKLQkJaWYgKCBuZXdidWNrZXQgPT0gTlVMTCApIHsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJcmV0dmFsID0gLTE7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJbmV3YnVja2V0LT5wcmV2ID0gYnVja2V0OwotCQluZXdidWNrZXQtPnVzZWQgPSAwOwotCQluZXdidWNrZXQtPmJhc2UgPSBidWNrZXQtPmJhc2Urc2l6ZTsKLQkJbmV3YnVja2V0LT5zaXplID0gZXh0cmE7Ci0JCW5ld2J1Y2tldC0+bmV4dCA9IGJ1Y2tldC0+bmV4dDsKLQkJaWYgKCBidWNrZXQtPm5leHQgKSB7Ci0JCQlidWNrZXQtPm5leHQtPnByZXYgPSBuZXdidWNrZXQ7Ci0JCX0KLQkJYnVja2V0LT5uZXh0ID0gbmV3YnVja2V0OwotCX0KLQotCS8qIFNldCB0aGUgY3VycmVudCBidWNrZXQgdmFsdWVzIGFuZCByZXR1cm4gaXQhICovCi0JYnVja2V0LT51c2VkID0gMTsKLQlidWNrZXQtPnNpemUgPSBzaXplOwotCWJ1Y2tldC0+ZGlydHkgPSAwOwotI2lmZGVmIERHQV9ERUJVRwotCWZwcmludGYoc3RkZXJyLCAiQWxsb2NhdGVkICVkIGJ5dGVzIGF0ICVwXG4iLCBidWNrZXQtPnNpemUsIGJ1Y2tldC0+YmFzZSk7Ci0jZW5kaWYKLQlzdXJmYWNlc19tZW1sZWZ0IC09IHNpemU7Ci0Jc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKLQlzdXJmYWNlLT5waXhlbHMgPSBidWNrZXQtPmJhc2U7Ci0Jc3VyZmFjZS0+aHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX2h3ZGF0YSAqKWJ1Y2tldDsKLWRvbmU6Ci0JVU5MT0NLX0RJU1BMQVkoKTsKLQlyZXR1cm4ocmV0dmFsKTsKLX0KLXN0YXRpYyB2b2lkIERHQV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQl2aWRtZW1fYnVja2V0ICpidWNrZXQsICpmcmVlYWJsZTsKLQotCS8qIFdhaXQgZm9yIGFueSBwZW5kaW5nIG9wZXJhdGlvbnMgaW52b2x2aW5nIHRoaXMgc3VyZmFjZSAqLwotCWlmICggREdBX0lzU3VyZmFjZUJ1c3koc3VyZmFjZSkgKSB7Ci0JCUxPQ0tfRElTUExBWSgpOwotCQlER0FfV2FpdEJ1c3lTdXJmYWNlcyh0aGlzKTsKLQkJVU5MT0NLX0RJU1BMQVkoKTsKLQl9Ci0KLQkvKiBMb29rIGZvciB0aGUgYnVja2V0IGluIHRoZSBjdXJyZW50IGxpc3QgKi8KLQlmb3IgKCBidWNrZXQ9JnN1cmZhY2VzOyBidWNrZXQ7IGJ1Y2tldD1idWNrZXQtPm5leHQgKSB7Ci0JCWlmICggYnVja2V0ID09ICh2aWRtZW1fYnVja2V0ICopc3VyZmFjZS0+aHdkYXRhICkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCBidWNrZXQgJiYgYnVja2V0LT51c2VkICkgewotCQkvKiBBZGQgdGhlIG1lbW9yeSBiYWNrIHRvIHRoZSB0b3RhbCAqLwotI2lmZGVmIERHQV9ERUJVRwotCXByaW50ZigiRnJlZWluZyBidWNrZXQgb2YgJWQgYnl0ZXNcbiIsIGJ1Y2tldC0+c2l6ZSk7Ci0jZW5kaWYKLQkJc3VyZmFjZXNfbWVtbGVmdCArPSBidWNrZXQtPnNpemU7Ci0KLQkJLyogQ2FuIHdlIG1lcmdlIHRoZSBzcGFjZSB3aXRoIHN1cnJvdW5kaW5nIGJ1Y2tldHM/ICovCi0JCWJ1Y2tldC0+dXNlZCA9IDA7Ci0JCWlmICggYnVja2V0LT5uZXh0ICYmICEgYnVja2V0LT5uZXh0LT51c2VkICkgewotI2lmZGVmIERHQV9ERUJVRwotCXByaW50ZigiTWVyZ2luZyB3aXRoIG5leHQgYnVja2V0LCBmb3IgJWQgdG90YWwgYnl0ZXNcbiIsIGJ1Y2tldC0+c2l6ZStidWNrZXQtPm5leHQtPnNpemUpOwotI2VuZGlmCi0JCQlmcmVlYWJsZSA9IGJ1Y2tldC0+bmV4dDsKLQkJCWJ1Y2tldC0+c2l6ZSArPSBidWNrZXQtPm5leHQtPnNpemU7Ci0JCQlidWNrZXQtPm5leHQgPSBidWNrZXQtPm5leHQtPm5leHQ7Ci0JCQlpZiAoIGJ1Y2tldC0+bmV4dCApIHsKLQkJCQlidWNrZXQtPm5leHQtPnByZXYgPSBidWNrZXQ7Ci0JCQl9Ci0JCQlTRExfZnJlZShmcmVlYWJsZSk7Ci0JCX0KLQkJaWYgKCBidWNrZXQtPnByZXYgJiYgISBidWNrZXQtPnByZXYtPnVzZWQgKSB7Ci0jaWZkZWYgREdBX0RFQlVHCi0JcHJpbnRmKCJNZXJnaW5nIHdpdGggcHJldmlvdXMgYnVja2V0LCBmb3IgJWQgdG90YWwgYnl0ZXNcbiIsIGJ1Y2tldC0+cHJldi0+c2l6ZStidWNrZXQtPnNpemUpOwotI2VuZGlmCi0JCQlmcmVlYWJsZSA9IGJ1Y2tldDsKLQkJCWJ1Y2tldC0+cHJldi0+c2l6ZSArPSBidWNrZXQtPnNpemU7Ci0JCQlidWNrZXQtPnByZXYtPm5leHQgPSBidWNrZXQtPm5leHQ7Ci0JCQlpZiAoIGJ1Y2tldC0+bmV4dCApIHsKLQkJCQlidWNrZXQtPm5leHQtPnByZXYgPSBidWNrZXQtPnByZXY7Ci0JCQl9Ci0JCQlTRExfZnJlZShmcmVlYWJsZSk7Ci0JCX0KLQl9Ci0Jc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKLQlzdXJmYWNlLT5od2RhdGEgPSBOVUxMOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIERHQV9kc3RfdG9feHkoX1RISVMsIFNETF9TdXJmYWNlICpkc3QsIGludCAqeCwgaW50ICp5KQotewotCSp4ID0gKGxvbmcpKChVaW50OCAqKWRzdC0+cGl4ZWxzIC0gbWVtb3J5X2Jhc2UpJW1lbW9yeV9waXRjaDsKLQkqeSA9IChsb25nKSgoVWludDggKilkc3QtPnBpeGVscyAtIG1lbW9yeV9iYXNlKS9tZW1vcnlfcGl0Y2g7Ci19Ci0KLXN0YXRpYyBpbnQgREdBX0ZpbGxIV1JlY3QoX1RISVMsIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpyZWN0LCBVaW50MzIgY29sb3IpCi17Ci0JaW50IHgsIHk7Ci0JdW5zaWduZWQgaW50IHcsIGg7Ci0KLQkvKiBEb24ndCBmaWxsIHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlIHNjcmVlbiwgd2FpdCB1bnRpbCBmbGlwcGVkICovCi0JTE9DS19ESVNQTEFZKCk7Ci0JaWYgKCB3YXNfZmxpcHBlZCAmJiAoZHN0ID09IHRoaXMtPnNjcmVlbikgKSB7Ci0JCXdoaWxlICggU0RMX05BTUUoWERHQUdldFZpZXdwb3J0U3RhdHVzKShER0FfRGlzcGxheSwgREdBX1NjcmVlbikgKQotCQkJLyogS2VlcCB3YWl0aW5nIGZvciB0aGUgaGFyZHdhcmUgLi4uICovIDsKLQkJd2FzX2ZsaXBwZWQgPSAwOwotCX0KLQlER0FfZHN0X3RvX3h5KHRoaXMsIGRzdCwgJngsICZ5KTsKLQl4ICs9IHJlY3QtPng7Ci0JeSArPSByZWN0LT55OwotCXcgPSByZWN0LT53OwotCWggPSByZWN0LT5oOwotI2lmIDAKLSAgcHJpbnRmKCJIYXJkd2FyZSBhY2NlbGVyYXRlZCByZWN0YW5nbGUgZmlsbDogJWR4JWQgYXQgJWQsJWRcbiIsIHcsIGgsIHgsIHkpOwotI2VuZGlmCi0JU0RMX05BTUUoWERHQUZpbGxSZWN0YW5nbGUpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuLCB4LCB5LCB3LCBoLCBjb2xvcik7Ci0JaWYgKCAhKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSApIHsKLQkJWEZsdXNoKERHQV9EaXNwbGF5KTsKLQl9Ci0JREdBX0FkZEJ1c3lTdXJmYWNlKGRzdCk7Ci0JVU5MT0NLX0RJU1BMQVkoKTsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgSFdBY2NlbEJsaXQoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KQotewotCVNETF9WaWRlb0RldmljZSAqdGhpczsKLQlpbnQgc3JjeCwgc3JjeTsKLQlpbnQgZHN0eCwgZHN0eTsKLQl1bnNpZ25lZCBpbnQgdywgaDsKLQotCXRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCS8qIERvbid0IGJsaXQgdG8gdGhlIHZpc2libGUgcGFydCBvZiB0aGUgc2NyZWVuLCB3YWl0IHVudGlsIGZsaXBwZWQgKi8KLQlMT0NLX0RJU1BMQVkoKTsKLQlpZiAoIHdhc19mbGlwcGVkICYmIChkc3QgPT0gdGhpcy0+c2NyZWVuKSApIHsKLQkJd2hpbGUgKCBTRExfTkFNRShYREdBR2V0Vmlld3BvcnRTdGF0dXMpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuKSApCi0JCQkvKiBLZWVwIHdhaXRpbmcgZm9yIHRoZSBoYXJkd2FyZSAuLi4gKi8gOwotCQl3YXNfZmxpcHBlZCA9IDA7Ci0JfQotCURHQV9kc3RfdG9feHkodGhpcywgc3JjLCAmc3JjeCwgJnNyY3kpOwotCXNyY3ggKz0gc3JjcmVjdC0+eDsKLQlzcmN5ICs9IHNyY3JlY3QtPnk7Ci0JREdBX2RzdF90b194eSh0aGlzLCBkc3QsICZkc3R4LCAmZHN0eSk7Ci0JZHN0eCArPSBkc3RyZWN0LT54OwotCWRzdHkgKz0gZHN0cmVjdC0+eTsKLQl3ID0gc3JjcmVjdC0+dzsKLQloID0gc3JjcmVjdC0+aDsKLSNpZiAwCi0gIHByaW50ZigiQmxpdHRpbmcgJWR4JWQgZnJvbSAlZCwlZCB0byAlZCwlZFxuIiwgdywgaCwgc3JjeCwgc3JjeSwgZHN0eCwgZHN0eSk7Ci0jZW5kaWYKLQlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKSB7Ci0JCVNETF9OQU1FKFhER0FDb3B5VHJhbnNwYXJlbnRBcmVhKShER0FfRGlzcGxheSwgREdBX1NjcmVlbiwKLQkJCXNyY3gsIHNyY3ksIHcsIGgsIGRzdHgsIGRzdHksIHNyYy0+Zm9ybWF0LT5jb2xvcmtleSk7Ci0JfSBlbHNlIHsKLQkJU0RMX05BTUUoWERHQUNvcHlBcmVhKShER0FfRGlzcGxheSwgREdBX1NjcmVlbiwKLQkJCXNyY3gsIHNyY3ksIHcsIGgsIGRzdHgsIGRzdHkpOwotCX0KLQlpZiAoICEodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9ET1VCTEVCVUYpICkgewotCQlYRmx1c2goREdBX0Rpc3BsYXkpOwotCX0KLQlER0FfQWRkQnVzeVN1cmZhY2Uoc3JjKTsKLQlER0FfQWRkQnVzeVN1cmZhY2UoZHN0KTsKLQlVTkxPQ0tfRElTUExBWSgpOwotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBER0FfQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkc3QpCi17Ci0JaW50IGFjY2VsZXJhdGVkOwotCi0JLyogU2V0IGluaXRpYWwgYWNjZWxlcmF0aW9uIG9uICovCi0Jc3JjLT5mbGFncyB8PSBTRExfSFdBQ0NFTDsKLQotCS8qIFNldCB0aGUgc3VyZmFjZSBhdHRyaWJ1dGVzICovCi0JaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBICkgewotCQlpZiAoICEgdGhpcy0+aW5mby5ibGl0X2h3X0EgKSB7Ci0JCQlzcmMtPmZsYWdzICY9IH5TRExfSFdBQ0NFTDsKLQkJfQotCX0KLQlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKSB7Ci0JCWlmICggISB0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgKSB7Ci0JCQlzcmMtPmZsYWdzICY9IH5TRExfSFdBQ0NFTDsKLQkJfQotCX0KLQotCS8qIENoZWNrIHRvIHNlZSBpZiBmaW5hbCBzdXJmYWNlIGJsaXQgaXMgYWNjZWxlcmF0ZWQgKi8KLQlhY2NlbGVyYXRlZCA9ICEhKHNyYy0+ZmxhZ3MgJiBTRExfSFdBQ0NFTCk7Ci0JaWYgKCBhY2NlbGVyYXRlZCApIHsKLQkJc3JjLT5tYXAtPmh3X2JsaXQgPSBIV0FjY2VsQmxpdDsKLQl9Ci0JcmV0dXJuKGFjY2VsZXJhdGVkKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBER0FfV2FpdEZsaXAoX1RISVMpCi17Ci0JaWYgKCB3YXNfZmxpcHBlZCApIHsKLQkJd2hpbGUgKCBTRExfTkFNRShYREdBR2V0Vmlld3BvcnRTdGF0dXMpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuKSApCi0JCQkvKiBLZWVwIHdhaXRpbmcgZm9yIHRoZSBoYXJkd2FyZSAuLi4gKi8gOwotCQl3YXNfZmxpcHBlZCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IERHQV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpZiAoIHN1cmZhY2UgPT0gdGhpcy0+c2NyZWVuICkgewotCQlTRExfbXV0ZXhQKGh3X2xvY2spOwotCQlMT0NLX0RJU1BMQVkoKTsKLQkJaWYgKCBER0FfSXNTdXJmYWNlQnVzeShzdXJmYWNlKSApIHsKLQkJCURHQV9XYWl0QnVzeVN1cmZhY2VzKHRoaXMpOwotCQl9Ci0JCURHQV9XYWl0RmxpcCh0aGlzKTsKLQkJVU5MT0NLX0RJU1BMQVkoKTsKLQl9IGVsc2UgewotCQlpZiAoIERHQV9Jc1N1cmZhY2VCdXN5KHN1cmZhY2UpICkgewotCQkJTE9DS19ESVNQTEFZKCk7Ci0JCQlER0FfV2FpdEJ1c3lTdXJmYWNlcyh0aGlzKTsKLQkJCVVOTE9DS19ESVNQTEFZKCk7Ci0JCX0KLQl9Ci0JcmV0dXJuKDApOwotfQotc3RhdGljIHZvaWQgREdBX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYgKCBzdXJmYWNlID09IHRoaXMtPnNjcmVlbiApIHsKLQkJU0RMX211dGV4Vihod19sb2NrKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgREdBX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCS8qIFdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UgYW5kIHRoZW4gZmxpcCBkaXNwbGF5ICovCi0JTE9DS19ESVNQTEFZKCk7Ci0JaWYgKCBER0FfSXNTdXJmYWNlQnVzeSh0aGlzLT5zY3JlZW4pICkgewotCQlER0FfV2FpdEJ1c3lTdXJmYWNlcyh0aGlzKTsKLQl9Ci0JREdBX1dhaXRGbGlwKHRoaXMpOwotCVNETF9OQU1FKFhER0FTZXRWaWV3cG9ydCkoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sCi0JICAgICAgICAgICAgICAgIDAsIGZsaXBfeW9mZnNldFtmbGlwX3BhZ2VdLCBYREdBRmxpcFJldHJhY2UpOwotCVhGbHVzaChER0FfRGlzcGxheSk7Ci0JVU5MT0NLX0RJU1BMQVkoKTsKLQl3YXNfZmxpcHBlZCA9IDE7Ci0JZmxpcF9wYWdlID0gIWZsaXBfcGFnZTsKLQotCXN1cmZhY2UtPnBpeGVscyA9IGZsaXBfYWRkcmVzc1tmbGlwX3BhZ2VdOwotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgREdBX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JLyogVGhlIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgdXBkYXRpbmcgdGhlIHZpc2libGUgdmlkZW8gbWVtb3J5ICovCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IERHQV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0gICAgICAgIGludCBpOwotCVhDb2xvciAgKnhjbWFwOwotCi0JLyogVGhpcyBoYXBwZW5zIG9uIGluaXRpYWxpemF0aW9uICovCi0JaWYgKCAhIERHQV9jb2xvcm1hcCApIHsKLQkJcmV0dXJuKDApOwotCX0KLQl4Y21hcCA9IFNETF9zdGFja19hbGxvYyhYQ29sb3IsIG5jb2xvcnMpOwotCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7Ci0JCXhjbWFwW2ldLnBpeGVsID0gZmlyc3Rjb2xvciArIGk7Ci0JCXhjbWFwW2ldLnJlZCAgID0gKGNvbG9yc1tpXS5yPDw4KXxjb2xvcnNbaV0ucjsKLQkJeGNtYXBbaV0uZ3JlZW4gPSAoY29sb3JzW2ldLmc8PDgpfGNvbG9yc1tpXS5nOwotCQl4Y21hcFtpXS5ibHVlICA9IChjb2xvcnNbaV0uYjw8OCl8Y29sb3JzW2ldLmI7Ci0JCXhjbWFwW2ldLmZsYWdzID0gKERvUmVkfERvR3JlZW58RG9CbHVlKTsKLQl9Ci0JTE9DS19ESVNQTEFZKCk7Ci0JWFN0b3JlQ29sb3JzKERHQV9EaXNwbGF5LCBER0FfY29sb3JtYXAsIHhjbWFwLCBuY29sb3JzKTsKLQlYU3luYyhER0FfRGlzcGxheSwgRmFsc2UpOwotCVVOTE9DS19ESVNQTEFZKCk7Ci0JU0RMX3N0YWNrX2ZyZWUoeGNtYXApOwotCi0JLyogVGhhdCB3YXMgZWFzeS4gOikgKi8KLQlyZXR1cm4oMSk7Ci19Ci0KLWludCBER0FfU2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApCi17Ci0JaW50IGksIG5jb2xvcnM7Ci0JWENvbG9yIHhjbWFwWzI1Nl07Ci0KLQkvKiBTZWUgaWYgYWN0dWFsbHkgc2V0dGluZyB0aGUgZ2FtbWEgaXMgc3VwcG9ydGVkICovCi0JaWYgKCBER0FfdmlzdWFsQ2xhc3MgIT0gRGlyZWN0Q29sb3IgKSB7Ci0JICAgIFNETF9TZXRFcnJvcigiR2FtbWEgY29ycmVjdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdmlzdWFsIik7Ci0JICAgIHJldHVybigtMSk7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSBwYWxldHRlIGZvciB0aGUgZ2l2ZW4gZ2FtbWEgcmFtcCAqLwotCWlmICggdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA8PSAxNiApIHsKLQkJbmNvbG9ycyA9IDY0OyAvKiBJcyB0aGlzIHJpZ2h0PyAqLwotCX0gZWxzZSB7Ci0JCW5jb2xvcnMgPSAyNTY7Ci0JfQotCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7Ci0JCVVpbnQ4IGMgPSAoMjU2ICogaSAvIG5jb2xvcnMpOwotCQl4Y21hcFtpXS5waXhlbCA9IFNETF9NYXBSR0IodGhpcy0+c2NyZWVuLT5mb3JtYXQsIGMsIGMsIGMpOwotCQl4Y21hcFtpXS5yZWQgICA9IHJhbXBbMCoyNTYrY107Ci0JCXhjbWFwW2ldLmdyZWVuID0gcmFtcFsxKjI1NitjXTsKLQkJeGNtYXBbaV0uYmx1ZSAgPSByYW1wWzIqMjU2K2NdOwotCQl4Y21hcFtpXS5mbGFncyA9IChEb1JlZHxEb0dyZWVufERvQmx1ZSk7Ci0JfQotCUxPQ0tfRElTUExBWSgpOwotCVhTdG9yZUNvbG9ycyhER0FfRGlzcGxheSwgREdBX2NvbG9ybWFwLCB4Y21hcCwgbmNvbG9ycyk7Ci0JWFN5bmMoREdBX0Rpc3BsYXksIEZhbHNlKTsKLQlVTkxPQ0tfRElTUExBWSgpOwotCXJldHVybigwKTsKLX0KLQotdm9pZCBER0FfVmlkZW9RdWl0KF9USElTKQotewotCWludCBpLCBqOwotCi0JaWYgKCBER0FfRGlzcGxheSApIHsKLQkJLyogRnJlZSBjb2xvcm1hcCwgaWYgbmVjZXNzYXJ5ICovCi0JCWlmICggREdBX2NvbG9ybWFwICkgewotCQkJWEZyZWVDb2xvcm1hcChER0FfRGlzcGxheSwgREdBX2NvbG9ybWFwKTsKLQkJCURHQV9jb2xvcm1hcCA9IDA7Ci0JCX0KLQotCQkvKiBVbm1hcCBtZW1vcnkgYW5kIHJlc2V0IHZpZGVvIG1vZGUgKi8KLQkJU0RMX05BTUUoWERHQUNsb3NlRnJhbWVidWZmZXIpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuKTsKLQkJaWYgKCB0aGlzLT5zY3JlZW4gKSB7Ci0JCQkvKiBUZWxsIFNETCBub3QgdG8gZnJlZSB0aGUgcGl4ZWxzICovCi0JCQlER0FfRnJlZUhXU3VyZmFjZSh0aGlzLCB0aGlzLT5zY3JlZW4pOwotCQl9Ci0JCVNETF9OQU1FKFhER0FTZXRNb2RlKShER0FfRGlzcGxheSwgREdBX1NjcmVlbiwgMCk7Ci0KLQkJLyogQ2xlYXIgdGhlIGxvY2sgbXV0ZXggKi8KLQkJaWYgKCBod19sb2NrICE9IE5VTEwgKSB7Ci0JCQlTRExfRGVzdHJveU11dGV4KGh3X2xvY2spOwotCQkJaHdfbG9jayA9IE5VTEw7Ci0JCX0KLSNpZmRlZiBMT0NLX0RHQV9ESVNQTEFZCi0JCWlmICggZXZlbnRfbG9jayAhPSBOVUxMICkgewotCQkJU0RMX0Rlc3Ryb3lNdXRleChldmVudF9sb2NrKTsKLQkJCWV2ZW50X2xvY2sgPSBOVUxMOwotCQl9Ci0jZW5kaWYgLyogTE9DS19ER0FfRElTUExBWSAqLwotCi0JCS8qIENsZWFuIHVwIGRlZmluZWQgdmlkZW8gbW9kZXMgKi8KLQkJZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKLQkJCWlmICggU0RMX21vZGVsaXN0W2ldICE9IE5VTEwgKSB7Ci0JCQkJZm9yICggaj0wOyBTRExfbW9kZWxpc3RbaV1bal07ICsraiApIHsKLQkJCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldW2pdKTsKLQkJCQl9Ci0JCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKLQkJCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOwotCQkJfQotCQl9Ci0KLQkJLyogQ2xlYW4gdXAgdGhlIG1lbW9yeSBidWNrZXQgbGlzdCAqLwotCQlER0FfRnJlZUhXU3VyZmFjZXModGhpcyk7Ci0KLQkJLyogUmVzdG9yZSBEUE1TIGFuZCBzY3JlZW5zYXZlciBzZXR0aW5ncyAqLwotCQlYMTFfUmVzdG9yZVNjcmVlblNhdmVyKERHQV9EaXNwbGF5LCBzY3JlZW5zYXZlcl90aW1lb3V0LCBkcG1zX2VuYWJsZWQpOwotCi0JCS8qIENsb3NlIHVwIHRoZSBkaXNwbGF5ICovCi0JCVhDbG9zZURpc3BsYXkoREdBX0Rpc3BsYXkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGdhL1NETF9kZ2F2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZ2EvU0RMX2RnYXZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTE1ZGEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kZ2EvU0RMX2RnYXZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9kZ2F2aWRlb19oCi0jZGVmaW5lIF9TRExfZGdhdmlkZW9faAotCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYmludC5oPgotI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4KLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFBNUwotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2RwbXMuaD4KLSNlbmRpZgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSBuZWVkIHRoZSBER0EgZHJpdmVyIHRvIGJlIHRocmVhZC1zYWZlICovCi0jZGVmaW5lIExPQ0tfREdBX0RJU1BMQVkKLSNpZmRlZiBMT0NLX0RHQV9ESVNQTEFZCi0jZGVmaW5lIExPQ0tfRElTUExBWSgpCQlTRExfbXV0ZXhQKGV2ZW50X2xvY2spCi0jZGVmaW5lIFVOTE9DS19ESVNQTEFZKCkJU0RMX211dGV4VihldmVudF9sb2NrKQotI2Vsc2UKLSNkZWZpbmUgTE9DS19ESVNQTEFZKCkKLSNkZWZpbmUgVU5MT0NLX0RJU1BMQVkoKQotI2VuZGlmCi0KLQotLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdlIHVzZSB0byBrZWVwIHRyYWNrIG9mIHZpZGVvIG1lbW9yeSAqLwotdHlwZWRlZiBzdHJ1Y3QgdmlkbWVtX2J1Y2tldCB7Ci0Jc3RydWN0IHZpZG1lbV9idWNrZXQgKnByZXY7Ci0JaW50IHVzZWQ7Ci0JaW50IGRpcnR5OwotCVVpbnQ4ICpiYXNlOwotCXVuc2lnbmVkIGludCBzaXplOwotCXN0cnVjdCB2aWRtZW1fYnVja2V0ICpuZXh0OwotfSB2aWRtZW1fYnVja2V0OwotCi0vKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLwotc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKLQlEaXNwbGF5ICpER0FfRGlzcGxheTsKLQlDb2xvcm1hcCBER0FfY29sb3JtYXA7Ci0JaW50IHZpc3VhbENsYXNzOwotCi0jZGVmaW5lIE5VTV9NT0RFTElTVFMJNAkJLyogOCwgMTYsIDI0LCBhbmQgMzIgYml0cy1wZXItcGl4ZWwgKi8KLQlpbnQgU0RMX251bW1vZGVzW05VTV9NT0RFTElTVFNdOwotCVNETF9SZWN0ICoqU0RMX21vZGVsaXN0W05VTV9NT0RFTElTVFNdOwotCi0JLyogSW5mb3JtYXRpb24gZm9yIHRoZSB2aWRlbyBzdXJmYWNlICovCi0JVWludDggKm1lbW9yeV9iYXNlOwotCWludCBtZW1vcnlfcGl0Y2g7Ci0JU0RMX211dGV4ICpod19sb2NrOwotCWludCBzeW5jX25lZWRlZDsKLQlpbnQgd2FzX2ZsaXBwZWQ7Ci0KLQkvKiBJbmZvcm1hdGlvbiBmb3IgaGFyZHdhcmUgc3VyZmFjZXMgKi8KLQl2aWRtZW1fYnVja2V0IHN1cmZhY2VzOwotCWludCBzdXJmYWNlc19tZW10b3RhbDsKLQlpbnQgc3VyZmFjZXNfbWVtbGVmdDsKLQotCS8qIEluZm9ybWF0aW9uIGZvciBkb3VibGUtYnVmZmVyaW5nICovCi0JaW50IGZsaXBfcGFnZTsKLQlpbnQgZmxpcF95b2Zmc2V0WzJdOwotCVVpbnQ4ICpmbGlwX2FkZHJlc3NbMl07Ci0KLQkvKiBVc2VkIHRvIGhhbmRsZSBER0EgZXZlbnRzICovCi0JaW50IGV2ZW50X2Jhc2U7Ci0jaWZkZWYgTE9DS19ER0FfRElTUExBWQotCVNETF9tdXRleCAqZXZlbnRfbG9jazsKLSNlbmRpZgotCi0JLyogU2NyZWVuc2F2ZXIgc2V0dGluZ3MgKi8KLQlpbnQgc2NyZWVuc2F2ZXJfdGltZW91dDsKLQlCT09MIGRwbXNfZW5hYmxlZDsKLX07Ci0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgREdBX0Rpc3BsYXkJCSh0aGlzLT5oaWRkZW4tPkRHQV9EaXNwbGF5KQotI2RlZmluZSBER0FfU2NyZWVuCQlEZWZhdWx0U2NyZWVuKERHQV9EaXNwbGF5KQotI2RlZmluZSBER0FfY29sb3JtYXAJCSh0aGlzLT5oaWRkZW4tPkRHQV9jb2xvcm1hcCkKLSNkZWZpbmUgREdBX3Zpc3VhbENsYXNzCQkodGhpcy0+aGlkZGVuLT52aXN1YWxDbGFzcykKLSNkZWZpbmUgbWVtb3J5X2Jhc2UJCSh0aGlzLT5oaWRkZW4tPm1lbW9yeV9iYXNlKQotI2RlZmluZSBtZW1vcnlfcGl0Y2gJCSh0aGlzLT5oaWRkZW4tPm1lbW9yeV9waXRjaCkKLSNkZWZpbmUgZmxpcF9wYWdlCQkodGhpcy0+aGlkZGVuLT5mbGlwX3BhZ2UpCi0jZGVmaW5lIGZsaXBfeW9mZnNldAkJKHRoaXMtPmhpZGRlbi0+ZmxpcF95b2Zmc2V0KQotI2RlZmluZSBmbGlwX2FkZHJlc3MJCSh0aGlzLT5oaWRkZW4tPmZsaXBfYWRkcmVzcykKLSNkZWZpbmUgc3luY19uZWVkZWQJCSh0aGlzLT5oaWRkZW4tPnN5bmNfbmVlZGVkKQotI2RlZmluZSB3YXNfZmxpcHBlZAkJKHRoaXMtPmhpZGRlbi0+d2FzX2ZsaXBwZWQpCi0jZGVmaW5lIFNETF9udW1tb2RlcwkJKHRoaXMtPmhpZGRlbi0+U0RMX251bW1vZGVzKQotI2RlZmluZSBTRExfbW9kZWxpc3QJCSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKLSNkZWZpbmUgc3VyZmFjZXMJCSh0aGlzLT5oaWRkZW4tPnN1cmZhY2VzKQotI2RlZmluZSBzdXJmYWNlc19tZW10b3RhbAkodGhpcy0+aGlkZGVuLT5zdXJmYWNlc19tZW10b3RhbCkKLSNkZWZpbmUgc3VyZmFjZXNfbWVtbGVmdAkodGhpcy0+aGlkZGVuLT5zdXJmYWNlc19tZW1sZWZ0KQotI2RlZmluZSBod19sb2NrCQkJKHRoaXMtPmhpZGRlbi0+aHdfbG9jaykKLSNkZWZpbmUgREdBX2V2ZW50X2Jhc2UJCSh0aGlzLT5oaWRkZW4tPmV2ZW50X2Jhc2UpCi0jZGVmaW5lIGV2ZW50X2xvY2sJCSh0aGlzLT5oaWRkZW4tPmV2ZW50X2xvY2spCi0jZGVmaW5lIHNjcmVlbnNhdmVyX3RpbWVvdXQJKHRoaXMtPmhpZGRlbi0+c2NyZWVuc2F2ZXJfdGltZW91dCkKLSNkZWZpbmUgZHBtc19lbmFibGVkCQkodGhpcy0+aGlkZGVuLT5kcG1zX2VuYWJsZWQpCi0KLSNlbmRpZiAvKiBfU0RMX2RnYXZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NjRkOWEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEhhbmRsZSB0aGUgZXZlbnQgc3RyZWFtLCBjb252ZXJ0aW5nIERpcmVjdEZCIGlucHV0IGV2ZW50cyBpbnRvIFNETCBldmVudHMgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0KLSNpbmNsdWRlIDxkaXJlY3RmYi5oPgotCi0jaW5jbHVkZSAiU0RMLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX0RpcmVjdEZCX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX0RpcmVjdEZCX2V2ZW50cy5oIgotCi0vKiBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBEaXJlY3RGQiBrZXljb2RlIHRvIGEgU0RMIGtleXN5bSAqLwotc3RhdGljIFNETEtleSBrZXltYXBbMjU2XTsKLXN0YXRpYyBTRExfa2V5c3ltICpEaXJlY3RGQl9UcmFuc2xhdGVLZXkgKERGQklucHV0RXZlbnQgKmV2LCBTRExfa2V5c3ltICprZXlzeW0pOwotc3RhdGljIGludCBEaXJlY3RGQl9UcmFuc2xhdGVCdXR0b24gKERGQklucHV0RXZlbnQgKmV2KTsKLQotc3RhdGljIGludCBwb3N0ZWQgPSAwOwotCi0KLXZvaWQgRGlyZWN0RkJfUHVtcEV2ZW50cyAoX1RISVMpCi17Ci0gIERGQklucHV0RXZlbnQgZXZ0OwotCi0gIHdoaWxlIChISURERU4tPmV2ZW50YnVmZmVyLT5HZXRFdmVudCAoSElEREVOLT5ldmVudGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERkJfRVZFTlQgKCZldnQpKSA9PSBERkJfT0spCi0gICAgewotICAgICAgU0RMX2tleXN5bSBrZXlzeW07Ci0KLSAgICAgIHN3aXRjaCAoZXZ0LnR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBESUVUX0JVVFRPTlBSRVNTOgotICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdEZCX1RyYW5zbGF0ZUJ1dHRvbiAoJmV2dCksIDAsIDApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERJRVRfQlVUVE9OUkVMRUFTRToKLSAgICAgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0RkJfVHJhbnNsYXRlQnV0dG9uICgmZXZ0KSwgMCwgMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRElFVF9LRVlQUkVTUzoKLSAgICAgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgRGlyZWN0RkJfVHJhbnNsYXRlS2V5KCZldnQsICZrZXlzeW0pKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBESUVUX0tFWVJFTEVBU0U6Ci0gICAgICAgICAgcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELCBEaXJlY3RGQl9UcmFuc2xhdGVLZXkoJmV2dCwgJmtleXN5bSkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERJRVRfQVhJU01PVElPTjoKLSAgICAgICAgICBpZiAoZXZ0LmZsYWdzICYgRElFRl9BWElTUkVMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZXZ0LmF4aXMgPT0gRElBSV9YKQotICAgICAgICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDEsIGV2dC5heGlzcmVsLCAwKTsKLSAgICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LmF4aXMgPT0gRElBSV9ZKQotICAgICAgICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDEsIDAsIGV2dC5heGlzcmVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgRGlyZWN0RkJfSW5pdE9TS2V5bWFwIChfVEhJUykKLXsKLSAgaW50IGk7Ci0JCi0gIC8qIEluaXRpYWxpemUgdGhlIERpcmVjdEZCIGtleSB0cmFuc2xhdGlvbiB0YWJsZSAqLwotICBmb3IgKGk9MDsgaTxTRExfYXJyYXlzaXplKGtleW1hcCk7ICsraSkKLSAgICBrZXltYXBbaV0gPSBTRExLX1VOS05PV047Ci0KLSAga2V5bWFwW0RJS0lfQSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX2E7Ci0gIGtleW1hcFtESUtJX0IgLSBESUtJX1VOS05PV05dID0gU0RMS19iOwotICBrZXltYXBbRElLSV9DIC0gRElLSV9VTktOT1dOXSA9IFNETEtfYzsKLSAga2V5bWFwW0RJS0lfRCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX2Q7Ci0gIGtleW1hcFtESUtJX0UgLSBESUtJX1VOS05PV05dID0gU0RMS19lOwotICBrZXltYXBbRElLSV9GIC0gRElLSV9VTktOT1dOXSA9IFNETEtfZjsKLSAga2V5bWFwW0RJS0lfRyAtIERJS0lfVU5LTk9XTl0gPSBTRExLX2c7Ci0gIGtleW1hcFtESUtJX0ggLSBESUtJX1VOS05PV05dID0gU0RMS19oOwotICBrZXltYXBbRElLSV9JIC0gRElLSV9VTktOT1dOXSA9IFNETEtfaTsKLSAga2V5bWFwW0RJS0lfSiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX2o7Ci0gIGtleW1hcFtESUtJX0sgLSBESUtJX1VOS05PV05dID0gU0RMS19rOwotICBrZXltYXBbRElLSV9MIC0gRElLSV9VTktOT1dOXSA9IFNETEtfbDsKLSAga2V5bWFwW0RJS0lfTSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX207Ci0gIGtleW1hcFtESUtJX04gLSBESUtJX1VOS05PV05dID0gU0RMS19uOwotICBrZXltYXBbRElLSV9PIC0gRElLSV9VTktOT1dOXSA9IFNETEtfbzsKLSAga2V5bWFwW0RJS0lfUCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX3A7Ci0gIGtleW1hcFtESUtJX1EgLSBESUtJX1VOS05PV05dID0gU0RMS19xOwotICBrZXltYXBbRElLSV9SIC0gRElLSV9VTktOT1dOXSA9IFNETEtfcjsKLSAga2V5bWFwW0RJS0lfUyAtIERJS0lfVU5LTk9XTl0gPSBTRExLX3M7Ci0gIGtleW1hcFtESUtJX1QgLSBESUtJX1VOS05PV05dID0gU0RMS190OwotICBrZXltYXBbRElLSV9VIC0gRElLSV9VTktOT1dOXSA9IFNETEtfdTsKLSAga2V5bWFwW0RJS0lfViAtIERJS0lfVU5LTk9XTl0gPSBTRExLX3Y7Ci0gIGtleW1hcFtESUtJX1cgLSBESUtJX1VOS05PV05dID0gU0RMS193OwotICBrZXltYXBbRElLSV9YIC0gRElLSV9VTktOT1dOXSA9IFNETEtfeDsKLSAga2V5bWFwW0RJS0lfWSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX3k7Ci0gIGtleW1hcFtESUtJX1ogLSBESUtJX1VOS05PV05dID0gU0RMS196OwotICAKLSAga2V5bWFwW0RJS0lfMCAtIERJS0lfVU5LTk9XTl0gPSBTRExLXzA7Ci0gIGtleW1hcFtESUtJXzEgLSBESUtJX1VOS05PV05dID0gU0RMS18xOwotICBrZXltYXBbRElLSV8yIC0gRElLSV9VTktOT1dOXSA9IFNETEtfMjsKLSAga2V5bWFwW0RJS0lfMyAtIERJS0lfVU5LTk9XTl0gPSBTRExLXzM7Ci0gIGtleW1hcFtESUtJXzQgLSBESUtJX1VOS05PV05dID0gU0RMS180OwotICBrZXltYXBbRElLSV81IC0gRElLSV9VTktOT1dOXSA9IFNETEtfNTsKLSAga2V5bWFwW0RJS0lfNiAtIERJS0lfVU5LTk9XTl0gPSBTRExLXzY7Ci0gIGtleW1hcFtESUtJXzcgLSBESUtJX1VOS05PV05dID0gU0RMS183OwotICBrZXltYXBbRElLSV84IC0gRElLSV9VTktOT1dOXSA9IFNETEtfODsKLSAga2V5bWFwW0RJS0lfOSAtIERJS0lfVU5LTk9XTl0gPSBTRExLXzk7Ci0gIAotICBrZXltYXBbRElLSV9GMSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0YxOwotICBrZXltYXBbRElLSV9GMiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0YyOwotICBrZXltYXBbRElLSV9GMyAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0YzOwotICBrZXltYXBbRElLSV9GNCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0Y0OwotICBrZXltYXBbRElLSV9GNSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0Y1OwotICBrZXltYXBbRElLSV9GNiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0Y2OwotICBrZXltYXBbRElLSV9GNyAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0Y3OwotICBrZXltYXBbRElLSV9GOCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0Y4OwotICBrZXltYXBbRElLSV9GOSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0Y5OwotICBrZXltYXBbRElLSV9GMTAgLSBESUtJX1VOS05PV05dID0gU0RMS19GMTA7Ci0gIGtleW1hcFtESUtJX0YxMSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0YxMTsKLSAga2V5bWFwW0RJS0lfRjEyIC0gRElLSV9VTktOT1dOXSA9IFNETEtfRjEyOwotICAKLSAga2V5bWFwW0RJS0lfRVNDQVBFIC0gRElLSV9VTktOT1dOXSA9IFNETEtfRVNDQVBFOwotICBrZXltYXBbRElLSV9MRUZUIC0gRElLSV9VTktOT1dOXSA9IFNETEtfTEVGVDsKLSAga2V5bWFwW0RJS0lfUklHSFQgLSBESUtJX1VOS05PV05dID0gU0RMS19SSUdIVDsKLSAga2V5bWFwW0RJS0lfVVAgLSBESUtJX1VOS05PV05dID0gU0RMS19VUDsKLSAga2V5bWFwW0RJS0lfRE9XTiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0RPV047Ci0gIGtleW1hcFtESUtJX0NPTlRST0xfTCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0xDVFJMOwotICBrZXltYXBbRElLSV9DT05UUk9MX1IgLSBESUtJX1VOS05PV05dID0gU0RMS19SQ1RSTDsKLSAga2V5bWFwW0RJS0lfU0hJRlRfTCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0xTSElGVDsKLSAga2V5bWFwW0RJS0lfU0hJRlRfUiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX1JTSElGVDsKLSAga2V5bWFwW0RJS0lfQUxUX0wgLSBESUtJX1VOS05PV05dID0gU0RMS19MQUxUOwotICBrZXltYXBbRElLSV9BTFRfUiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX1JBTFQ7Ci0gIGtleW1hcFtESUtJX1RBQiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX1RBQjsKLSAga2V5bWFwW0RJS0lfRU5URVIgLSBESUtJX1VOS05PV05dID0gU0RMS19SRVRVUk47Ci0gIGtleW1hcFtESUtJX1NQQUNFIC0gRElLSV9VTktOT1dOXSA9IFNETEtfU1BBQ0U7Ci0gIGtleW1hcFtESUtJX0JBQ0tTUEFDRSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0JBQ0tTUEFDRTsKLSAga2V5bWFwW0RJS0lfSU5TRVJUIC0gRElLSV9VTktOT1dOXSA9IFNETEtfSU5TRVJUOwotICBrZXltYXBbRElLSV9ERUxFVEUgLSBESUtJX1VOS05PV05dID0gU0RMS19ERUxFVEU7Ci0gIGtleW1hcFtESUtJX0hPTUUgLSBESUtJX1VOS05PV05dID0gU0RMS19IT01FOwotICBrZXltYXBbRElLSV9FTkQgLSBESUtJX1VOS05PV05dID0gU0RMS19FTkQ7Ci0gIGtleW1hcFtESUtJX1BBR0VfVVAgLSBESUtJX1VOS05PV05dID0gU0RMS19QQUdFVVA7Ci0gIGtleW1hcFtESUtJX1BBR0VfRE9XTiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX1BBR0VET1dOOwotICBrZXltYXBbRElLSV9DQVBTX0xPQ0sgLSBESUtJX1VOS05PV05dID0gU0RMS19DQVBTTE9DSzsKLSAga2V5bWFwW0RJS0lfTlVNX0xPQ0sgLSBESUtJX1VOS05PV05dID0gU0RMS19OVU1MT0NLOwotICBrZXltYXBbRElLSV9TQ1JPTExfTE9DSyAtIERJS0lfVU5LTk9XTl0gPSBTRExLX1NDUk9MTE9DSzsKLSAga2V5bWFwW0RJS0lfUFJJTlQgLSBESUtJX1VOS05PV05dID0gU0RMS19QUklOVDsKLSAga2V5bWFwW0RJS0lfUEFVU0UgLSBESUtJX1VOS05PV05dID0gU0RMS19QQVVTRTsKLSAga2V5bWFwW0RJS0lfS1BfRElWIC0gRElLSV9VTktOT1dOXSA9IFNETEtfS1BfRElWSURFOwotICBrZXltYXBbRElLSV9LUF9NVUxUIC0gRElLSV9VTktOT1dOXSA9IFNETEtfS1BfTVVMVElQTFk7Ci0gIGtleW1hcFtESUtJX0tQX01JTlVTIC0gRElLSV9VTktOT1dOXSA9IFNETEtfS1BfTUlOVVM7Ci0gIGtleW1hcFtESUtJX0tQX1BMVVMgLSBESUtJX1VOS05PV05dID0gU0RMS19LUF9QTFVTOwotICBrZXltYXBbRElLSV9LUF9FTlRFUiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0tQX0VOVEVSOwotfQotCi0KLXN0YXRpYyBTRExfa2V5c3ltICpEaXJlY3RGQl9UcmFuc2xhdGVLZXkgKERGQklucHV0RXZlbnQgKmV2LCBTRExfa2V5c3ltICprZXlzeW0pCi17Ci0gIC8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCi0gIGtleXN5bS0+c2NhbmNvZGUgPSBldi0+a2V5X2lkOwotICBrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsgLyogRklYTUUgKi8KLSAga2V5c3ltLT51bmljb2RlID0gKERGQl9LRVlfVFlQRSAoZXYtPmtleV9zeW1ib2wpID09IERJS1RfVU5JQ09ERSkgPyBldi0+a2V5X3N5bWJvbCA6IDA7Ci0KLSAgaWYgKGV2LT5rZXlfc3ltYm9sID4gMCAmJiBldi0+a2V5X3N5bWJvbCA8IDEyOCkKLSAgICBrZXlzeW0tPnN5bSA9IGV2LT5rZXlfc3ltYm9sOwotICBlbHNlCi0gICAga2V5c3ltLT5zeW0gPSBrZXltYXBbZXYtPmtleV9pZCAtIERJS0lfVU5LTk9XTl07Ci0KLSAgcmV0dXJuIGtleXN5bTsKLX0KLQotc3RhdGljIGludCBEaXJlY3RGQl9UcmFuc2xhdGVCdXR0b24gKERGQklucHV0RXZlbnQgKmV2KQotewotICBzd2l0Y2ggKGV2LT5idXR0b24pCi0gICAgewotICAgIGNhc2UgRElCSV9MRUZUOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBESUJJX01JRERMRToKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgRElCSV9SSUdIVDoKLSAgICAgIHJldHVybiAzOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl9ldmVudHMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX2V2ZW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGI0MzcwLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX2V2ZW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfRGlyZWN0RkJfdmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBEaXJlY3RGQl9Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgRGlyZWN0RkJfUHVtcEV2ZW50cyhfVEhJUyk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX3ZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl92aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjU5MmMxLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX3ZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLQotCU1HQSBDUlRDMiBzdXBwb3J0IGJ5IFRob21hcyBKYXJvc2NoIC0gdG9takBzaW1vbnYuY29tCi0JQ1JUQzIgc3VwcG9ydCBpcyBpbnNwaXJlZCBieSBtcGxheWVyJ3MgZGZibWdhIGRyaXZlcgotCXdyaXR0ZW4gYnkgVmlsbGUgU3lyau+/ve+/vTxzeXJqYWxhQHNjaS5maT4KLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBEaXJlY3RGQiB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb24uCi0qLwotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaW5jbHVkZSA8ZGlyZWN0ZmIuaD4KLSNpbmNsdWRlIDxkaXJlY3RmYl92ZXJzaW9uLmg+Ci0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX0RpcmVjdEZCX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX0RpcmVjdEZCX2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF9EaXJlY3RGQl95dXYuaCIKLQotLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCi1zdHJ1Y3QgV01jdXJzb3IgewotCWludCB1bnVzZWQ7Ci19OwotCi0KLS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBEaXJlY3RGQl9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKipEaXJlY3RGQl9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIFNETF9TdXJmYWNlICpEaXJlY3RGQl9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgaW50IERpcmVjdEZCX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAotCQkJIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyB2b2lkIERpcmVjdEZCX1ZpZGVvUXVpdChfVEhJUyk7Ci0KLS8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IERpcmVjdEZCX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IERpcmVjdEZCX0ZpbGxIV1JlY3QoX1RISVMsIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0LCBVaW50MzIgY29sb3IpOwotc3RhdGljIGludCBEaXJlY3RGQl9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBEaXJlY3RGQl9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIERpcmVjdEZCX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgRGlyZWN0RkJfQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkc3QpOwotc3RhdGljIGludCBEaXJlY3RGQl9IV0FjY2VsQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpOwotc3RhdGljIGludCBEaXJlY3RGQl9TZXRIV0NvbG9yS2V5KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDMyIGtleSk7Ci1zdGF0aWMgaW50IERpcmVjdEZCX1NldEhXQWxwaGEoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50OCBhbHBoYSk7Ci1zdGF0aWMgaW50IERpcmVjdEZCX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgRGlyZWN0RkJfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLQotLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KLXN0YXRpYyB2b2lkIERpcmVjdEZCX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotc3RhdGljIHZvaWQgRGlyZWN0RkJfV2luZG93ZWRVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotLyogVGhpcyBpcyB0aGUgcmVjdCBFbnVtTW9kZXMyIHVzZXMgKi8KLXN0cnVjdCBEaXJlY3RGQkVudW1SZWN0IHsKLQlTRExfUmVjdCByOwotCXN0cnVjdCBEaXJlY3RGQkVudW1SZWN0KiBuZXh0OwotfTsKLQotc3RhdGljIHN0cnVjdCBEaXJlY3RGQkVudW1SZWN0ICplbnVtbGlzdCA9IE5VTEw7Ci0KLQotLyogRGlyZWN0RkIgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBEaXJlY3RGQl9BdmFpbGFibGUodm9pZCkKLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIERpcmVjdEZCX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKLXsKLSAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotICBTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpEaXJlY3RGQl9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotICBTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKLQotICAvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotICBkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7Ci0gIGlmIChkZXZpY2UpCi0gICAgewotICAgICAgU0RMX21lbXNldCAoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLSAgICAgIGRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKSBtYWxsb2MgKHNpemVvZiAoKmRldmljZS0+aGlkZGVuKSk7Ci0gICAgfQotICBpZiAoZGV2aWNlID09IE5VTEwgIHx8ICBkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgaWYgKGRldmljZSkKLSAgICAgICAgewotICAgICAgICAgIGZyZWUgKGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgIHJldHVybigwKTsKLSAgICB9Ci0gIFNETF9tZW1zZXQgKGRldmljZS0+aGlkZGVuLCAwLCBzaXplb2YgKCpkZXZpY2UtPmhpZGRlbikpOwotCi0gIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgZGV2aWNlLT5WaWRlb0luaXQgPSBEaXJlY3RGQl9WaWRlb0luaXQ7Ci0gIGRldmljZS0+TGlzdE1vZGVzID0gRGlyZWN0RkJfTGlzdE1vZGVzOwotICBkZXZpY2UtPlNldFZpZGVvTW9kZSA9IERpcmVjdEZCX1NldFZpZGVvTW9kZTsKLSAgZGV2aWNlLT5TZXRDb2xvcnMgPSBEaXJlY3RGQl9TZXRDb2xvcnM7Ci0gIGRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOwotICBkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBEaXJlY3RGQl9DcmVhdGVZVVZPdmVybGF5OwotICBkZXZpY2UtPlZpZGVvUXVpdCA9IERpcmVjdEZCX1ZpZGVvUXVpdDsKLSAgZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IERpcmVjdEZCX0FsbG9jSFdTdXJmYWNlOwotICBkZXZpY2UtPkNoZWNrSFdCbGl0ID0gRGlyZWN0RkJfQ2hlY2tIV0JsaXQ7Ci0gIGRldmljZS0+RmlsbEhXUmVjdCA9IERpcmVjdEZCX0ZpbGxIV1JlY3Q7Ci0gIGRldmljZS0+U2V0SFdDb2xvcktleSA9IERpcmVjdEZCX1NldEhXQ29sb3JLZXk7Ci0gIGRldmljZS0+U2V0SFdBbHBoYSA9IERpcmVjdEZCX1NldEhXQWxwaGE7Ci0gIGRldmljZS0+TG9ja0hXU3VyZmFjZSA9IERpcmVjdEZCX0xvY2tIV1N1cmZhY2U7Ci0gIGRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gRGlyZWN0RkJfVW5sb2NrSFdTdXJmYWNlOwotICBkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBEaXJlY3RGQl9GbGlwSFdTdXJmYWNlOwotICBkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBEaXJlY3RGQl9GcmVlSFdTdXJmYWNlOwotICBkZXZpY2UtPlNob3dXTUN1cnNvciA9IERpcmVjdEZCX1Nob3dXTUN1cnNvcjsKLSAgZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKLSAgZGV2aWNlLT5TZXRJY29uID0gTlVMTDsKLSAgZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKLSAgZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOwotICBkZXZpY2UtPkdldFdNSW5mbyA9IE5VTEw7Ci0gIGRldmljZS0+SW5pdE9TS2V5bWFwID0gRGlyZWN0RkJfSW5pdE9TS2V5bWFwOwotICBkZXZpY2UtPlB1bXBFdmVudHMgPSBEaXJlY3RGQl9QdW1wRXZlbnRzOwotCi0gIGRldmljZS0+ZnJlZSA9IERpcmVjdEZCX0RlbGV0ZURldmljZTsKLQotICByZXR1cm4gZGV2aWNlOwotfQotCi1WaWRlb0Jvb3RTdHJhcCBEaXJlY3RGQl9ib290c3RyYXAgPSB7Ci0gICJkaXJlY3RmYiIsICJEaXJlY3RGQiIsCi0gIERpcmVjdEZCX0F2YWlsYWJsZSwgRGlyZWN0RkJfQ3JlYXRlRGV2aWNlCi19OwotCi1zdGF0aWMgREZCU3VyZmFjZVBpeGVsRm9ybWF0IEdldEZvcm1hdEZvckJwcCAoaW50IGJwcCwgSURpcmVjdEZCRGlzcGxheUxheWVyICpsYXllcikKLXsKLSAgREZCRGlzcGxheUxheWVyQ29uZmlnIGRsYzsKLSAgaW50ICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gKGJwcCArIDcpIC8gODsKLQotICBsYXllci0+R2V0Q29uZmlndXJhdGlvbiAobGF5ZXIsICZkbGMpOwotCi0gIGlmIChieXRlcyA9PSBERkJfQllURVNfUEVSX1BJWEVMKGRsYy5waXhlbGZvcm1hdCkgJiYgYnl0ZXMgPiAxKQotICAgIHJldHVybiBkbGMucGl4ZWxmb3JtYXQ7Ci0KLSAgc3dpdGNoIChieXRlcykKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuIERTUEZfTFVUODsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gRFNQRl9SR0IxNjsKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gRFNQRl9SR0IyNDsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gRFNQRl9SR0IzMjsKLSAgICB9Ci0KLSAgcmV0dXJuIERTUEZfVU5LTk9XTjsKLX0KLQotc3RhdGljIERGQkVudW1lcmF0aW9uUmVzdWx0IEVudW1Nb2Rlc0NhbGxiYWNrIChpbnQgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBicHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCi17Ci0gIFNETF9WaWRlb0RldmljZSAqdGhpcyA9IChTRExfVmlkZW9EZXZpY2UgKilkYXRhOwotICBzdHJ1Y3QgRGlyZWN0RkJFbnVtUmVjdCAqZW51bXJlY3Q7Ci0KLSAgSElEREVOLT5udW1tb2RlcysrOwotCi0gIGlmIChlbnVtbGlzdCAmJiBlbnVtbGlzdC0+ci53ID09IHdpZHRoICYmIGVudW1saXN0LT5yLmggPT0gaGVpZ2h0KQotICAgIHJldHVybiBERkVOVU1fT0s7Ci0KLSAgZW51bXJlY3QgPSBTRExfY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgRGlyZWN0RkJFbnVtUmVjdCkpOwotICBpZiAoIWVudW1yZWN0KQotICAgIHsKLSAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgcmV0dXJuIERGRU5VTV9DQU5DRUw7Ci0gICAgfQotCi0gIGVudW1yZWN0LT5yLncgID0gKFVpbnQxNil3aWR0aDsKLSAgZW51bXJlY3QtPnIuaCAgPSAoVWludDE2KWhlaWdodDsKLSAgZW51bXJlY3QtPm5leHQgPSBlbnVtbGlzdDsKLQotICBlbnVtbGlzdCA9IGVudW1yZWN0OwotCi0gIHJldHVybiBERkVOVU1fT0s7Ci19Ci0KLXN0cnVjdCBwcml2YXRlX2h3ZGF0YSB7Ci0gIElEaXJlY3RGQlN1cmZhY2UgKnN1cmZhY2U7Ci0gIElEaXJlY3RGQlBhbGV0dGUgKnBhbGV0dGU7Ci19OwotCi12b2lkIFNldERpcmVjdEZCZXJyb3IgKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBERkJSZXN1bHQgY29kZSkKLXsKLSAgY29uc3QgY2hhciAqZXJyb3IgPSBEaXJlY3RGQkVycm9yU3RyaW5nIChjb2RlKTsKLQotICBpZiAoZXJyb3IpCi0gICAgU0RMX1NldEVycm9yKCIlczogJXMiLCBmdW5jdGlvbiwgZXJyb3IpOwotICBlbHNlCi0gICAgU0RMX1NldEVycm9yKCJVbmtub3duIGVycm9yIGNvZGUgZnJvbSAlcyIsIGZ1bmN0aW9uKTsKLX0KLQotc3RhdGljIERGQlN1cmZhY2VQaXhlbEZvcm1hdCBTRExUb0RGQlBpeGVsRm9ybWF0IChTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCkKLXsKLSAgaWYgKGZvcm1hdC0+Um1hc2sgJiYgZm9ybWF0LT5HbWFzayAmJiBmb3JtYXQtPkJtYXNrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZm9ybWF0LT5CaXRzUGVyUGl4ZWwpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgIHJldHVybiBEU1BGX0xVVDg7Ci0gICAgICAgICAgCi0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgaWYgKGZvcm1hdC0+Um1hc2sgPT0gMHhGODAwICYmCi0gICAgICAgICAgICAgIGZvcm1hdC0+R21hc2sgPT0gMHgwN0UwICYmCi0gICAgICAgICAgICAgIGZvcm1hdC0+Qm1hc2sgPT0gMHgwMDFGKQotICAgICAgICAgICAgcmV0dXJuIERTUEZfUkdCMTY7Ci0gICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgCi0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgaWYgKGZvcm1hdC0+Um1hc2sgPT0gMHg3QzAwICYmCi0gICAgICAgICAgICAgIGZvcm1hdC0+R21hc2sgPT0gMHgwM0UwICYmCi0gICAgICAgICAgICAgIGZvcm1hdC0+Qm1hc2sgPT0gMHgwMDFGKQotICAgICAgICAgICAgcmV0dXJuIERTUEZfQVJHQjE1NTU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgCi0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgaWYgKGZvcm1hdC0+Um1hc2sgPT0gMHhGRjAwMDAgJiYKLSAgICAgICAgICAgICAgZm9ybWF0LT5HbWFzayA9PSAweDAwRkYwMCAmJgotICAgICAgICAgICAgICBmb3JtYXQtPkJtYXNrID09IDB4MDAwMEZGKQotICAgICAgICAgICAgcmV0dXJuIERTUEZfUkdCMjQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICBpZiAoZm9ybWF0LT5SbWFzayA9PSAweEZGMDAwMCAmJgotICAgICAgICAgICAgICBmb3JtYXQtPkdtYXNrID09IDB4MDBGRjAwICYmCi0gICAgICAgICAgICAgIGZvcm1hdC0+Qm1hc2sgPT0gMHgwMDAwRkYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChmb3JtYXQtPkFtYXNrID09IDB4RkYwMDAwMDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIERTUEZfQVJHQjsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBEU1BGX1JHQjMyOwotICAgICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChmb3JtYXQtPkJpdHNQZXJQaXhlbCkKLQl7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICByZXR1cm4gRFNQRl9MVVQ4OwotCWNhc2UgMTU6Ci0JICByZXR1cm4gRFNQRl9BUkdCMTU1NTsKLQljYXNlIDE2OgotCSAgcmV0dXJuIERTUEZfUkdCMTY7Ci0JY2FzZSAyNDoKLQkgIHJldHVybiBEU1BGX1JHQjI0OwotCWNhc2UgMzI6Ci0JICByZXR1cm4gRFNQRl9SR0IzMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBEU1BGX1VOS05PV047Ci19Ci0KLXN0YXRpYyBTRExfUGFsZXR0ZSAqQWxsb2NhdGVQYWxldHRlKGludCBzaXplKQotewotICBTRExfUGFsZXR0ZSAqcGFsZXR0ZTsKLSAgU0RMX0NvbG9yICAgKmNvbG9yczsKLQotICBwYWxldHRlID0gU0RMX2NhbGxvYyAoMSwgc2l6ZW9mKFNETF9QYWxldHRlKSk7Ci0gIGlmICghcGFsZXR0ZSkKLSAgICB7Ci0gICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjb2xvcnMgPSBTRExfY2FsbG9jIChzaXplLCBzaXplb2YoU0RMX0NvbG9yKSk7Ci0gIGlmICghY29sb3JzKQotICAgIHsKLSAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHBhbGV0dGUtPm5jb2xvcnMgPSBzaXplOwotICBwYWxldHRlLT5jb2xvcnMgID0gY29sb3JzOwotCi0gIHJldHVybiBwYWxldHRlOwotfQotCi1zdGF0aWMgaW50IERGQlRvU0RMUGl4ZWxGb3JtYXQgKERGQlN1cmZhY2VQaXhlbEZvcm1hdCBwaXhlbGZvcm1hdCwgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQpCi17Ci0gIGZvcm1hdC0+QW1hc2sgPSBmb3JtYXQtPlJtYXNrID0gZm9ybWF0LT5HbWFzayA9IGZvcm1hdC0+Qm1hc2sgPSAwOwotICBmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IGZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9IDA7Ci0KLSAgc3dpdGNoIChwaXhlbGZvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSBEU1BGX0E4OgotICAgICAgZm9ybWF0LT5BbWFzayA9IDB4MDAwMDAwRkY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFNQRl9BUkdCMTU1NToKLSAgICAgIGZvcm1hdC0+Um1hc2sgPSAweDAwMDA3QzAwOwotICAgICAgZm9ybWF0LT5HbWFzayA9IDB4MDAwMDAzRTA7Ci0gICAgICBmb3JtYXQtPkJtYXNrID0gMHgwMDAwMDAxRjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEU1BGX1JHQjE2OgotICAgICAgZm9ybWF0LT5SbWFzayA9IDB4MDAwMEY4MDA7Ci0gICAgICBmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDdFMDsKLSAgICAgIGZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMDFGOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERTUEZfQVJHQjoKLSAgICAgIGZvcm1hdC0+QW1hc2sgPSAwOyAvKiBhcHBzIGRvbid0IHNlZW0gdG8gbGlrZSB0aGF0OiAgMHhGRjAwMDAwMDsgKi8KLSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgRFNQRl9SR0IyNDoKLSAgICBjYXNlIERTUEZfUkdCMzI6Ci0gICAgICBmb3JtYXQtPlJtYXNrID0gMHgwMEZGMDAwMDsKLSAgICAgIGZvcm1hdC0+R21hc2sgPSAweDAwMDBGRjAwOwotICAgICAgZm9ybWF0LT5CbWFzayA9IDB4MDAwMDAwRkY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFNQRl9MVVQ4OgotICAgICAgZm9ybWF0LT5SbWFzayA9IDB4MDAwMDAwRkY7Ci0gICAgICBmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDBGRjsKLSAgICAgIGZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMEZGOwotCi0gICAgICBpZiAoIWZvcm1hdC0+cGFsZXR0ZSkKLSAgICAgICAgZm9ybWF0LT5wYWxldHRlID0gQWxsb2NhdGVQYWxldHRlKDI1Nik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJTRExfRGlyZWN0RkI6IFVuc3VwcG9ydGVkIHBpeGVsZm9ybWF0ICgweCUwOHgpIVxuIiwgcGl4ZWxmb3JtYXQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBmb3JtYXQtPkJpdHNQZXJQaXhlbCAgPSBERkJfQllURVNfUEVSX1BJWEVMKHBpeGVsZm9ybWF0KSAqIDg7Ci0gIGZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9IERGQl9CWVRFU19QRVJfUElYRUwocGl4ZWxmb3JtYXQpOwotCi0gIHJldHVybiAwOwotfQotCi0KLWludCBEaXJlY3RGQl9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gIERGQlJlc3VsdCAgICAgICAgICAgICAgICByZXQ7Ci0jaWYgKERJUkVDVEZCX01BSk9SX1ZFUlNJT04gPT0gMCkgJiYgKERJUkVDVEZCX01JTk9SX1ZFUlNJT04gPT0gOSkgJiYgKERJUkVDVEZCX01JQ1JPX1ZFUlNJT04gPCAyMykKLSAgREZCQ2FyZENhcGFiaWxpdGllcyAgICAgIGNhcHM7Ci0jZWxzZQotICBERkJHcmFwaGljc0RldmljZURlc2NyaXB0aW9uIGNhcHM7Ci0jZW5kaWYKLSAgREZCRGlzcGxheUxheWVyQ29uZmlnICAgIGRsYzsKLSAgc3RydWN0IERpcmVjdEZCRW51bVJlY3QgKnJlY3Q7Ci0gIElEaXJlY3RGQiAgICAgICAgICAgICAgICpkZmIgICAgPSBOVUxMOwotICBJRGlyZWN0RkJEaXNwbGF5TGF5ZXIgICAqbGF5ZXIgID0gTlVMTDsKLSAgSURpcmVjdEZCRXZlbnRCdWZmZXIgICAgKmV2ZW50cyA9IE5VTEw7Ci0KLSAgSElEREVOLT5jMmxheWVyID0gTlVMTCwgSElEREVOLT5jMmZyYW1lID0gTlVMTDsKLSAgSElEREVOLT5lbmFibGVfbWdhX2NydGMyID0gMDsKLSAgSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaF9vdmVyc2NhbiA9IDE7Ci0KLSAgcmV0ID0gRGlyZWN0RkJJbml0IChOVUxMLCBOVUxMKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICBTZXREaXJlY3RGQmVycm9yICgiRGlyZWN0RkJJbml0IiwgcmV0KTsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gIHJldCA9IERpcmVjdEZCQ3JlYXRlICgmZGZiKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICBTZXREaXJlY3RGQmVycm9yICgiRGlyZWN0RkJDcmVhdGUiLCByZXQpOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgcmV0ID0gZGZiLT5HZXREaXNwbGF5TGF5ZXIgKGRmYiwgRExJRF9QUklNQVJZLCAmbGF5ZXIpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJkZmItPkdldERpc3BsYXlMYXllciIsIHJldCk7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICByZXQgPSBkZmItPkNyZWF0ZUlucHV0RXZlbnRCdWZmZXIgKGRmYiwgRElDQVBTX0FMTCwgREZCX0ZBTFNFLCAmZXZlbnRzKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICBTZXREaXJlY3RGQmVycm9yICgiZGZiLT5DcmVhdGVFdmVudEJ1ZmZlciIsIHJldCk7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgCi0gIGxheWVyLT5FbmFibGVDdXJzb3IgKGxheWVyLCAxKTsKLQotICAvKiBRdWVyeSBsYXllciBjb25maWd1cmF0aW9uIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBtb2RlIGFuZCBwaXhlbGZvcm1hdCAqLwotICBsYXllci0+R2V0Q29uZmlndXJhdGlvbiAobGF5ZXIsICZkbGMpOwotCi0gIC8qIElmIGN1cnJlbnQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgdXNlIExVVDggYXMgdGhlIGRlZmF1bHQgKi8KLSAgaWYgKERGQlRvU0RMUGl4ZWxGb3JtYXQgKGRsYy5waXhlbGZvcm1hdCwgdmZvcm1hdCkpCi0gICAgREZCVG9TRExQaXhlbEZvcm1hdCAoRFNQRl9MVVQ4LCB2Zm9ybWF0KTsKLQotICAvKiBFbnVtZXJhdGUgdGhlIGF2YWlsYWJsZSBmdWxsc2NyZWVuIG1vZGVzICovCi0gIHJldCA9IGRmYi0+RW51bVZpZGVvTW9kZXMgKGRmYiwgRW51bU1vZGVzQ2FsbGJhY2ssIHRoaXMpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJkZmItPkVudW1WaWRlb01vZGVzIiwgcmV0KTsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gIEhJRERFTi0+bW9kZWxpc3QgPSBTRExfY2FsbG9jIChISURERU4tPm51bW1vZGVzICsgMSwgc2l6ZW9mKFNETF9SZWN0ICopKTsKLSAgaWYgKCFISURERU4tPm1vZGVsaXN0KQotICAgIHsKLSAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgcmVjdCA9IGVudW1saXN0OyByZWN0OyArK2ksIHJlY3QgPSByZWN0LT5uZXh0ICkKLSAgICB7Ci0gICAgICBISURERU4tPm1vZGVsaXN0W2ldID0gJnJlY3QtPnI7Ci0gICAgfQotCi0gIEhJRERFTi0+bW9kZWxpc3RbaV0gPSBOVUxMOwotCi0KLSAgLyogUXVlcnkgY2FyZCBjYXBhYmlsaXRpZXMgdG8gZ2V0IHRoZSB2aWRlbyBtZW1vcnkgc2l6ZSAqLwotI2lmIChESVJFQ1RGQl9NQUpPUl9WRVJTSU9OID09IDApICYmIChESVJFQ1RGQl9NSU5PUl9WRVJTSU9OID09IDkpICYmIChESVJFQ1RGQl9NSUNST19WRVJTSU9OIDwgMjMpCi0gIGRmYi0+R2V0Q2FyZENhcGFiaWxpdGllcyAoZGZiLCAmY2Fwcyk7Ci0jZWxzZQotICBkZmItPkdldERldmljZURlc2NyaXB0aW9uIChkZmIsICZjYXBzKTsKLSNlbmRpZgotCi0gIHRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMTsKLSAgdGhpcy0+aW5mby5od19hdmFpbGFibGUgPSAxOwotICB0aGlzLT5pbmZvLmJsaXRfaHcgICAgICA9IDE7Ci0gIHRoaXMtPmluZm8uYmxpdF9od19DQyAgID0gMTsKLSAgdGhpcy0+aW5mby5ibGl0X2h3X0EgICAgPSAxOwotICB0aGlzLT5pbmZvLmJsaXRfZmlsbCAgICA9IDE7Ci0gIHRoaXMtPmluZm8udmlkZW9fbWVtICAgID0gY2Fwcy52aWRlb19tZW1vcnkgLyAxMDI0OwotICB0aGlzLT5pbmZvLmN1cnJlbnRfdyAgICA9IGRsYy53aWR0aDsgIAotICB0aGlzLT5pbmZvLmN1cnJlbnRfaCAgICA9IGRsYy5oZWlnaHQ7Ci0KLSAgSElEREVOLT5pbml0aWFsaXplZCA9IDE7Ci0gIEhJRERFTi0+ZGZiICAgICAgICAgPSBkZmI7Ci0gIEhJRERFTi0+bGF5ZXIgICAgICAgPSBsYXllcjsKLSAgSElEREVOLT5ldmVudGJ1ZmZlciA9IGV2ZW50czsKLQotICBpZiAoU0RMX2dldGVudigiU0RMX0RJUkVDVEZCX01HQV9DUlRDMiIpICE9IE5VTEwpCi0gICAgSElEREVOLT5lbmFibGVfbWdhX2NydGMyID0gMTsKLSAgCi0gIGlmIChISURERU4tPmVuYWJsZV9tZ2FfY3J0YzIpCi0gICAgewotICAgICAgREZCRGlzcGxheUxheWVyQ29uZmlnICAgICAgZGxjOwotICAgICAgREZCRGlzcGxheUxheWVyQ29uZmlnRmxhZ3MgZmFpbGVkOwotCi0gICAgICByZXQgPSBkZmItPkdldERpc3BsYXlMYXllciAoZGZiLCAyLCAmSElEREVOLT5jMmxheWVyKTsKLSAgICAgIGlmIChyZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBTZXREaXJlY3RGQmVycm9yICgiZGZiLT5HZXREaXNwbGF5TGF5ZXIoQ1JUQzIpIiwgcmV0KTsKLSAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgIHJldCA9IEhJRERFTi0+bGF5ZXItPlNldENvb3BlcmF0aXZlTGV2ZWwoSElEREVOLT5sYXllciwgRExTQ0xfRVhDTFVTSVZFKTsKLSAgICAgIGlmIChyZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBTZXREaXJlY3RGQmVycm9yICgibGF5ZXItPlNldENvb3BlcmF0aXZlTGV2ZWwoQ1JUQzIsIEVYQ0xVU0lWRSkiLCByZXQpOwotICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAKLSAgICAgIHJldCA9IEhJRERFTi0+YzJsYXllci0+U2V0Q29vcGVyYXRpdmVMZXZlbChISURERU4tPmMybGF5ZXIsIERMU0NMX0VYQ0xVU0lWRSk7Ci0gICAgICBpZiAocmV0KQotICAgICAgICB7Ci0gICAgICAgICAgU2V0RGlyZWN0RkJlcnJvciAoImMybGF5ZXItPlNldENvb3BlcmF0aXZlTGV2ZWwoQ1JUQzIsIEVYQ0xVU0lWRSkiLCByZXQpOwotICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgSElEREVOLT5jMmxheWVyLT5TZXRPcGFjaXR5KEhJRERFTi0+YzJsYXllciwgMHgwKTsKLQotICAgICAgLyogSW5pdCB0aGUgc3VyZmFjZSBoZXJlIGFzIGl0IGdvdCBhIGZpeGVkIHNpemUgKi8KLSAgICAgIGRsYy5mbGFncyAgICAgID0gRExDT05GX1BJWEVMRk9STUFUIHwgRExDT05GX0JVRkZFUk1PREU7Ci0gICAgICBkbGMuYnVmZmVybW9kZSA9IERMQk1fQkFDS1ZJREVPOwotICAgICAgZGxjLnBpeGVsZm9ybWF0ID0gRFNQRl9SR0IzMjsKLSAgICAgIAotICAgICAgcmV0ID0gSElEREVOLT5jMmxheWVyLT5UZXN0Q29uZmlndXJhdGlvbiggSElEREVOLT5jMmxheWVyLCAmZGxjLCAmZmFpbGVkICk7Ci0gICAgICBpZiAocmV0KQotICAgICAgICB7Ci0gICAgICAgICAgU2V0RGlyZWN0RkJlcnJvciAoImMybGF5ZXItPlRlc3RDb25maWd1cmF0aW9uIiwgcmV0KTsKLSAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgCi0gICAgICByZXQgPSBISURERU4tPmMybGF5ZXItPlNldENvbmZpZ3VyYXRpb24oIEhJRERFTi0+YzJsYXllciwgJmRsYyApOwotICAgICAgaWYgKHJldCkKLSAgICAgICAgewotICAgICAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJjMmxheWVyLT5TZXRDb25maWd1cmF0aW9uIiwgcmV0KTsKLSAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgCi0gICAgICByZXQgPSBISURERU4tPmMybGF5ZXItPkdldFN1cmZhY2UoIEhJRERFTi0+YzJsYXllciwgJkhJRERFTi0+YzJmcmFtZSApOwotICAgICAgaWYgKHJldCkKLSAgICAgICAgewotICAgICAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJjMmxheWVyLT5HZXRTdXJmYWNlIiwgcmV0KTsKLSAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgIEhJRERFTi0+YzJmcmFtZXNpemUueCA9IDA7Ci0gICAgICBISURERU4tPmMyZnJhbWVzaXplLnkgPSAwOwotICAgICAgSElEREVOLT5jMmZyYW1lLT5HZXRTaXplKCBISURERU4tPmMyZnJhbWUsICZISURERU4tPmMyZnJhbWVzaXplLncsICZISURERU4tPmMyZnJhbWVzaXplLmgpOwotCi0gICAgICBISURERU4tPmMyZnJhbWUtPlNldEJsaXR0aW5nRmxhZ3MoIEhJRERFTi0+YzJmcmFtZSwgRFNCTElUX05PRlggKTsKLSAgICAgIEhJRERFTi0+YzJmcmFtZS0+U2V0Q29sb3IoIEhJRERFTi0+YzJmcmFtZSwgMCwgMCwgMCwgMHhmZiApOwotICAgIAotICAgICAgLyogQ2xlYXIgQ1JUQzIgKi8KLSAgICAgIEhJRERFTi0+YzJmcmFtZS0+Q2xlYXIoSElEREVOLT5jMmZyYW1lLCAwLCAwLCAwLCAweGZmICk7Ci0gICAgICBISURERU4tPmMyZnJhbWUtPkZsaXAoSElEREVOLT5jMmZyYW1lLCBOVUxMLCAwICk7Ci0gICAgICBISURERU4tPmMyZnJhbWUtPkNsZWFyKEhJRERFTi0+YzJmcmFtZSwgMCwgMCwgMCwgMHhmZiApOwotICAgICAgSElEREVOLT5jMmZyYW1lLT5GbGlwKEhJRERFTi0+YzJmcmFtZSwgTlVMTCwgMCApOwotICAgICAgSElEREVOLT5jMmZyYW1lLT5DbGVhcihISURERU4tPmMyZnJhbWUsIDAsIDAsIDAsIDB4ZmYgKTsKLQotICAgICAgSElEREVOLT5jMmxheWVyLT5TZXRPcGFjaXR5KEhJRERFTi0+YzJsYXllciwgMHhGRiApOwotICAgIAotICAgICAgLyogQ2hlY2sgaWYgb3ZlcnNjYW4gaXMgcG9zc2libHkgc2V0ICovCi0gICAgICBpZiAoU0RMX2dldGVudigiU0RMX0RJUkVDVEZCX01HQV9PVkVSU0NBTiIpICE9IE5VTEwpCi0gICAgICAgIHsKLQkgICAgZmxvYXQgb3ZlcnNjYW4gPSAwOwotCSAgICBpZiAoU0RMX3NzY2FuZihTRExfZ2V0ZW52KCJTRExfRElSRUNURkJfTUdBX09WRVJTQ0FOIiksICIlZiIsICZvdmVyc2NhbikgPT0gMSkKLSAgICAgICAgICAgICAgIGlmIChvdmVyc2NhbiA+IDAgJiYgb3ZlcnNjYW4gPCAyKQotCQkgIEhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2hfb3ZlcnNjYW4gPSBvdmVyc2NhbjsKLQl9Ci0KLSAgICAgICNpZmRlZiBESVJFQ1RGQl9DUlRDMl9ERUJVRwotICAgICAgcHJpbnRmKCJDUlRDMiBvdmVyc2NhbjogJWZcbiIsIEhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2hfb3ZlcnNjYW4pOwotICAgICAgI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiAwOwotCi0gZXJyb3I6Ci0gIGlmIChldmVudHMpCi0gICAgZXZlbnRzLT5SZWxlYXNlIChldmVudHMpOwotICAKLSAgaWYgKEhJRERFTi0+YzJmcmFtZSkKLSAgICBISURERU4tPmMyZnJhbWUtPlJlbGVhc2UgKEhJRERFTi0+YzJmcmFtZSk7Ci0KLSAgaWYgKEhJRERFTi0+YzJsYXllcikKLSAgICBISURERU4tPmMybGF5ZXItPlJlbGVhc2UgKEhJRERFTi0+YzJsYXllcik7Ci0KLSAgaWYgKGxheWVyKQotICAgIGxheWVyLT5SZWxlYXNlIChsYXllcik7Ci0KLSAgaWYgKGRmYikKLSAgICBkZmItPlJlbGVhc2UgKGRmYik7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgU0RMX1JlY3QgKipEaXJlY3RGQl9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCi17Ci0gIGlmIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKQotICAgIHJldHVybiBISURERU4tPm1vZGVsaXN0OwotICBlbHNlCi0gICAgaWYgKFNETFRvREZCUGl4ZWxGb3JtYXQgKGZvcm1hdCkgIT0gRFNQRl9VTktOT1dOKQotICAgICAgcmV0dXJuIChTRExfUmVjdCoqKSAtMTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIFNETF9TdXJmYWNlICpEaXJlY3RGQl9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLSAgREZCUmVzdWx0ICAgICAgICAgICAgICByZXQ7Ci0gIERGQlN1cmZhY2VEZXNjcmlwdGlvbiAgZHNjOwotICBERkJTdXJmYWNlUGl4ZWxGb3JtYXQgIHBpeGVsZm9ybWF0OwotICBJRGlyZWN0RkJTdXJmYWNlICAgICAgKnN1cmZhY2U7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiU0RMIERpcmVjdEZCX1NldFZpZGVvTW9kZTogJWR4JWRAJWQsIGZsYWdzOiAweCUwOHhcbiIsCi0gICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJwcCwgZmxhZ3MpOwotCi0gIGZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOwotCi0gIC8qIFJlbGVhc2UgcHJldmlvdXMgcHJpbWFyeSBzdXJmYWNlICovCi0gIGlmIChjdXJyZW50LT5od2RhdGEgJiYgY3VycmVudC0+aHdkYXRhLT5zdXJmYWNlKQotICAgIHsKLSAgICAgIGN1cnJlbnQtPmh3ZGF0YS0+c3VyZmFjZS0+UmVsZWFzZSAoY3VycmVudC0+aHdkYXRhLT5zdXJmYWNlKTsKLSAgICAgIGN1cnJlbnQtPmh3ZGF0YS0+c3VyZmFjZSA9IE5VTEw7Ci0KLSAgICAgIC8qIEFuZCBpdHMgcGFsZXR0ZSBpZiBwcmVzZW50ICovCi0gICAgICBpZiAoY3VycmVudC0+aHdkYXRhLT5wYWxldHRlKQotICAgICAgICB7Ci0gICAgICAgICAgY3VycmVudC0+aHdkYXRhLT5wYWxldHRlLT5SZWxlYXNlIChjdXJyZW50LT5od2RhdGEtPnBhbGV0dGUpOwotICAgICAgICAgIGN1cnJlbnQtPmh3ZGF0YS0+cGFsZXR0ZSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gIGVsc2UgaWYgKCFjdXJyZW50LT5od2RhdGEpCi0gICAgewotICAgICAgLyogQWxsb2NhdGUgdGhlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBkYXRhICovCi0gICAgICBjdXJyZW50LT5od2RhdGEgPSAoc3RydWN0IHByaXZhdGVfaHdkYXRhICopIFNETF9jYWxsb2MgKDEsIHNpemVvZigqY3VycmVudC0+aHdkYXRhKSk7Ci0gICAgICBpZiAoIWN1cnJlbnQtPmh3ZGF0YSkKLSAgICAgICAgewotICAgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogU2V0IGNvb3BlcmF0aXZlIGxldmVsIGRlcGVuZGluZyBvbiBmbGFnIFNETF9GVUxMU0NSRUVOICovCi0gIGlmIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKQotICAgIHsKLSAgICAgIHJldCA9IEhJRERFTi0+ZGZiLT5TZXRDb29wZXJhdGl2ZUxldmVsIChISURERU4tPmRmYiwgREZTQ0xfRlVMTFNDUkVFTik7Ci0gICAgICBpZiAocmV0ICYmICFISURERU4tPmVuYWJsZV9tZ2FfY3J0YzIpCi0gICAgICAgIHsKLSAgICAgICAgICBEaXJlY3RGQkVycm9yICgiZGZiLT5TZXRDb29wZXJhdGl2ZUxldmVsIiwgcmV0KTsKLSAgICAgICAgICBmbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0gICAgICAgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICBISURERU4tPmRmYi0+U2V0Q29vcGVyYXRpdmVMZXZlbCAoSElEREVOLT5kZmIsIERGU0NMX05PUk1BTCk7Ci0KLSAgLyogU2V0IHZpZGVvIG1vZGUgKi8KLSAgcmV0ID0gSElEREVOLT5kZmItPlNldFZpZGVvTW9kZSAoSElEREVOLT5kZmIsIHdpZHRoLCBoZWlnaHQsIGJwcCk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pCi0gICAgICAgIHsKLSAgICAgICAgICBmbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0gICAgICAgICAgSElEREVOLT5kZmItPlNldENvb3BlcmF0aXZlTGV2ZWwgKEhJRERFTi0+ZGZiLCBERlNDTF9OT1JNQUwpOwotICAgICAgICAgIHJldCA9IEhJRERFTi0+ZGZiLT5TZXRWaWRlb01vZGUgKEhJRERFTi0+ZGZiLCB3aWR0aCwgaGVpZ2h0LCBicHApOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChyZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBTZXREaXJlY3RGQmVycm9yICgiZGZiLT5TZXRWaWRlb01vZGUiLCByZXQpOwotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBwcmltYXJ5IHN1cmZhY2UgKi8KLSAgZHNjLmZsYWdzICAgICAgID0gRFNERVNDX0NBUFMgfCBEU0RFU0NfUElYRUxGT1JNQVQ7Ci0gIGRzYy5jYXBzICAgICAgICA9IERTQ0FQU19QUklNQVJZIHwgKChmbGFncyAmIFNETF9ET1VCTEVCVUYpID8gRFNDQVBTX0ZMSVBQSU5HIDogMCk7Ci0gIGRzYy5waXhlbGZvcm1hdCA9IEdldEZvcm1hdEZvckJwcCAoYnBwLCBISURERU4tPmxheWVyKTsKLQotICByZXQgPSBISURERU4tPmRmYi0+Q3JlYXRlU3VyZmFjZSAoSElEREVOLT5kZmIsICZkc2MsICZzdXJmYWNlKTsKLSAgaWYgKHJldCAmJiAoZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSkKLSAgICB7Ci0gICAgICAvKiBUcnkgd2l0aG91dCBkb3VibGUgYnVmZmVyaW5nICovCi0gICAgICBkc2MuY2FwcyAmPSB+RFNDQVBTX0ZMSVBQSU5HOwotICAgICAgcmV0ID0gSElEREVOLT5kZmItPkNyZWF0ZVN1cmZhY2UgKEhJRERFTi0+ZGZiLCAmZHNjLCAmc3VyZmFjZSk7Ci0gICAgfQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJkZmItPkNyZWF0ZVN1cmZhY2UiLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGN1cnJlbnQtPncgICAgID0gd2lkdGg7Ci0gIGN1cnJlbnQtPmggICAgID0gaGVpZ2h0OwotICBjdXJyZW50LT5mbGFncyA9IFNETF9IV1NVUkZBQ0UgfCBTRExfUFJFQUxMT0M7Ci0KLSAgaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pCi0gICAgewotICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47Ci0gICAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IERpcmVjdEZCX0RpcmVjdFVwZGF0ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IERpcmVjdEZCX1dpbmRvd2VkVXBkYXRlOwotCi0gIGlmIChkc2MuY2FwcyAmIERTQ0FQU19GTElQUElORykKLSAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfRE9VQkxFQlVGOwotCi0gIHN1cmZhY2UtPkdldFBpeGVsRm9ybWF0IChzdXJmYWNlLCAmcGl4ZWxmb3JtYXQpOwotCi0gIERGQlRvU0RMUGl4ZWxGb3JtYXQgKHBpeGVsZm9ybWF0LCBjdXJyZW50LT5mb3JtYXQpOwotCi0gIC8qIEdldCB0aGUgc3VyZmFjZSBwYWxldHRlIChpZiBzdXBwb3J0ZWQpICovCi0gIGlmIChERkJfUElYRUxGT1JNQVRfSVNfSU5ERVhFRCggcGl4ZWxmb3JtYXQgKSkKLSAgICB7Ci0gICAgICBzdXJmYWNlLT5HZXRQYWxldHRlIChzdXJmYWNlLCAmY3VycmVudC0+aHdkYXRhLT5wYWxldHRlKTsKLQotICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKLSAgICB9Ci0KLSAgY3VycmVudC0+aHdkYXRhLT5zdXJmYWNlID0gc3VyZmFjZTsKLQotICAvKiBNR0EgQ1JUQzIgc3R1ZmYgKi8KLSAgaWYgKEhJRERFTi0+ZW5hYmxlX21nYV9jcnRjMikKLSAgICB7Ci0gICAgICAvKiBubyBzdHJldGNoaW5nIGlmIGMyc3NpemUgPT0gYzJmcmFtZXNpemUgKi8KLSAgICAgIEhJRERFTi0+YzJzc2l6ZS54ID0gMCwgSElEREVOLT5jMnNzaXplLnkgPSAwOwotICAgICAgSElEREVOLT5jMnNzaXplLncgPSB3aWR0aDsKLSAgICAgIEhJRERFTi0+YzJzc2l6ZS5oID0gaGVpZ2h0OwotCi0gICAgICBISURERU4tPmMyZHNpemUueCA9IDAsIEhJRERFTi0+YzJkc2l6ZS55ID0gMDsKLSAgICAgIEhJRERFTi0+YzJkc2l6ZS53ID0gd2lkdGg7Ci0gICAgICBISURERU4tPmMyZHNpemUuaCA9IGhlaWdodDsKLQotICAgICAgSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaCA9IDA7Ci0KLSAgICAgIGlmIChTRExfZ2V0ZW52KCJTRExfRElSRUNURkJfTUdBX1NUUkVUQ0giKSAhPSBOVUxMKQotICAgICAgICB7Ci0JICAgIC8qIE5vcm1hbGx5IGFzc3VtZSBhIHBpY3R1cmUgYXNwZWN0IHJhdGlvIG9mIDQ6MyAqLwotCSAgICBpbnQgem9vbV9hc3BlY3RfeCA9IDQsIHpvb21fYXNwZWN0X3kgPSAzLCBpLCBqOwotCi0JICAgIGZvciAoaSA9IDE7IGkgPCAyMDsgaSsrKQotCSAgICAgIHsKLQkJZm9yIChqID0gMTsgaiA8IDEwOyBqKyspCi0JCSAgewotCQkgICAgaWYgKChmbG9hdCl3aWR0aC8oZmxvYXQpaSooZmxvYXQpaiA9PSBoZWlnaHQpIAotCQkgICAgICB7Ci0JCQl6b29tX2FzcGVjdF94ID0gaTsKLQkJCXpvb21fYXNwZWN0X3kgPSBqOwotCQkJCi0JCQkvKiBicmVhayB0aGUgbG9vcCAqLwotCQkJaSA9IDIxOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCQotICAgICAgICAgICAgI2lmZGVmIERJUkVDVEZCX0NSVEMyX0RFQlVHCi0gICAgICAgICAgICBwcmludGYoIlNvdXJjZSByZXNvbHV0aW9uOiBYOiAlZCwgWTogJWQsIEFzcGVjdCByYXRpbzogJWQ6JWRcbiIsIHdpZHRoLCBoZWlnaHQsIHpvb21fYXNwZWN0X3gsIHpvb21fYXNwZWN0X3kpOwotICAgICAgICAgICAgcHJpbnRmKCJDUlRDMiByZXNvbHV0aW9uOiBYOiAlZCwgWTogJWRcbiIsIEhJRERFTi0+YzJmcmFtZXNpemUudywgSElEREVOLT5jMmZyYW1lc2l6ZS5oKTsKLSAgICAgICAgICAgICNlbmRpZgotCQotICAgICAgICAgIC8qIGRvbid0IHN0cmV0Y2ggb25seSBzbGlnaHRseSBzbWFsbGVyL2xhcmdlciBpbWFnZXMgKi8KLSAgICAgICAgICBpZiAoKGZsb2F0KXdpZHRoIDwgKGZsb2F0KUhJRERFTi0+YzJmcmFtZXNpemUudyowLjk1IHx8IChmbG9hdCloZWlnaHQgPCAoZmxvYXQpSElEREVOLT5jMmZyYW1lc2l6ZS5oKjAuOTUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHdoaWxlICgoZmxvYXQpSElEREVOLT5jMmRzaXplLncgPCAoZmxvYXQpSElEREVOLT5jMmZyYW1lc2l6ZS53KkhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2hfb3ZlcnNjYW4gJiYgKGZsb2F0KUhJRERFTi0+YzJkc2l6ZS5oIDwgKGZsb2F0KUhJRERFTi0+YzJmcmFtZXNpemUuaCpISURERU4tPm1nYV9jcnRjMl9zdHJldGNoX292ZXJzY2FuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBISURERU4tPmMyZHNpemUudys9em9vbV9hc3BlY3RfeDsKLSAgICAgICAgICAgICAgICAgICBISURERU4tPmMyZHNpemUuaCs9em9vbV9hc3BlY3RfeTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLyogb25lIHN0ZXAgZG93biAqLwotICAgICAgICAgICAgICAgIEhJRERFTi0+YzJkc2l6ZS53LT16b29tX2FzcGVjdF94OwotICAgICAgICAgICAgICAgIEhJRERFTi0+YzJkc2l6ZS5oLT16b29tX2FzcGVjdF95OwotCi0gICAgICAgICAgICAgICNpZmRlZiBESVJFQ1RGQl9DUlRDMl9ERUJVRwotICAgICAgICAgICAgICBwcmludGYoIlN0cmV0Y2hlZCByZXNvbHV0aW9uOiBYOiAlZCwgWTogJWRcbiIsIEhJRERFTi0+YzJkc2l6ZS53LCBISURERU4tPmMyZHNpemUuaCk7Ci0gICAgICAgICAgICAgICNlbmRpZgotCi0gICAgICAgICAgICAgIEhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2ggPSAxOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIGlmICgoZmxvYXQpd2lkdGggPiAoZmxvYXQpSElEREVOLT5jMmZyYW1lc2l6ZS53KjAuOTUgfHwgKGZsb2F0KWhlaWdodCA+IChmbG9hdClISURERU4tPmMyZnJhbWVzaXplLmgqMC45NSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHdoaWxlICgoZmxvYXQpSElEREVOLT5jMmRzaXplLncgPiAoZmxvYXQpSElEREVOLT5jMmZyYW1lc2l6ZS53KkhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2hfb3ZlcnNjYW4gfHwgKGZsb2F0KUhJRERFTi0+YzJkc2l6ZS5oID4gKGZsb2F0KUhJRERFTi0+YzJmcmFtZXNpemUuaCpISURERU4tPm1nYV9jcnRjMl9zdHJldGNoX292ZXJzY2FuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSElEREVOLT5jMmRzaXplLnctPXpvb21fYXNwZWN0X3g7Ci0gICAgICAgICAgICAgIEhJRERFTi0+YzJkc2l6ZS5oLT16b29tX2FzcGVjdF95OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICNpZmRlZiBESVJFQ1RGQl9DUlRDMl9ERUJVRwotICAgICAgICAgICAgICBwcmludGYoIkRvd24tU3RyZXRjaGVkIHJlc29sdXRpb246IFg6ICVkLCBZOiAlZFxuIiwgSElEREVOLT5jMmRzaXplLncsIEhJRERFTi0+YzJkc2l6ZS5oKTsKLSAgICAgICAgICAgICAgI2VuZGlmCi0KLSAgICAgICAgICAgICAgSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaCA9IDE7Ci0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAjaWZkZWYgRElSRUNURkJfQ1JUQzJfREVCVUcKLSAgICAgICAgICBwcmludGYoIk5vdCBzdHJldGNoaW5nIGltYWdlXG4iKTsKLSAgICAgICAgICAjZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAvKiBQYW5uaW5nICovCi0gICAgICBpZiAoSElEREVOLT5jMmZyYW1lc2l6ZS53ID4gSElEREVOLT5jMmRzaXplLncpCi0gICAgICAgIEhJRERFTi0+YzJkc2l6ZS54ID0gKEhJRERFTi0+YzJmcmFtZXNpemUudyAtIEhJRERFTi0+YzJkc2l6ZS53KSAgLyAyOwotICAgICAgZWxzZQotICAgICAgICBISURERU4tPmMyZHNpemUueCA9IChISURERU4tPmMyZHNpemUudyAtIEhJRERFTi0+YzJmcmFtZXNpemUudykgIC8gMjsKLQotICAgICAgaWYgKEhJRERFTi0+YzJmcmFtZXNpemUuaCA+IEhJRERFTi0+YzJkc2l6ZS5oKQotICAgICAgICBISURERU4tPmMyZHNpemUueSA9IChISURERU4tPmMyZnJhbWVzaXplLmggLSBISURERU4tPmMyZHNpemUuaCkgIC8gMjsKLSAgICAgIGVsc2UKLSAgICAgICAgSElEREVOLT5jMmRzaXplLnkgPSAoSElEREVOLT5jMmRzaXplLmggLSBISURERU4tPmMyZnJhbWVzaXplLmgpICAvIDI7Ci0KLSAgICAgICNpZmRlZiBESVJFQ1RGQl9DUlRDMl9ERUJVRwotICAgIHByaW50ZigiQ1JUQzIgcG9zaXRpb24gWDogJWQsIFk6ICVkXG4iLCBISURERU4tPmMyZHNpemUueCwgSElEREVOLT5jMmRzaXplLnkpOwotICAgICAgI2VuZGlmCi0gICB9Ci0gIH0KLQotICByZXR1cm4gY3VycmVudDsKLX0KLQotc3RhdGljIGludCBEaXJlY3RGQl9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0gIERGQlJlc3VsdCAgICAgICAgICAgICByZXQ7Ci0gIERGQlN1cmZhY2VEZXNjcmlwdGlvbiBkc2M7Ci0KLSAgLyogIGZwcmludGYoc3RkZXJyLCAiU0RMOiBEaXJlY3RGQl9BbGxvY0hXU3VyZmFjZSAoJWR4JWRAJWQsIGZsYWdzOiAweCUwOHgpXG4iLAotICAgICAgc3VyZmFjZS0+dywgc3VyZmFjZS0+aCwgc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwsIHN1cmZhY2UtPmZsYWdzKTsqLwotCi0gIGlmIChzdXJmYWNlLT53IDwgOCB8fCBzdXJmYWNlLT5oIDwgOCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogZmlsbCBzdXJmYWNlIGRlc2NyaXB0aW9uICovCi0gIGRzYy5mbGFncyAgPSBEU0RFU0NfV0lEVEggfCBEU0RFU0NfSEVJR0hUIHwgRFNERVNDX1BJWEVMRk9STUFUIHwgRFNERVNDX0NBUFM7Ci0gIGRzYy53aWR0aCAgPSBzdXJmYWNlLT53OwotICBkc2MuaGVpZ2h0ID0gc3VyZmFjZS0+aDsKLSAgZHNjLmNhcHMgICA9IChzdXJmYWNlLT5mbGFncyAmIFNETF9ET1VCTEVCVUYpID8gRFNDQVBTX0ZMSVBQSU5HIDogMDsKLQotICAvKiBmaW5kIHRoZSByaWdodCBwaXhlbGZvcm1hdCAqLwotICBkc2MucGl4ZWxmb3JtYXQgPSBTRExUb0RGQlBpeGVsRm9ybWF0IChzdXJmYWNlLT5mb3JtYXQpOwotICBpZiAoZHNjLnBpeGVsZm9ybWF0ID09IERTUEZfVU5LTk9XTikKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBkYXRhICovCi0gIHN1cmZhY2UtPmh3ZGF0YSA9IChzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgKikgU0RMX2NhbGxvYyAoMSwgc2l6ZW9mKCpzdXJmYWNlLT5od2RhdGEpKTsKLSAgaWYgKHN1cmZhY2UtPmh3ZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIHN1cmZhY2UgKi8KLSAgcmV0ID0gSElEREVOLT5kZmItPkNyZWF0ZVN1cmZhY2UgKEhJRERFTi0+ZGZiLCAmZHNjLCAmc3VyZmFjZS0+aHdkYXRhLT5zdXJmYWNlKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICBTZXREaXJlY3RGQmVycm9yICgiZGZiLT5DcmVhdGVTdXJmYWNlIiwgcmV0KTsKLSAgICAgIGZyZWUgKHN1cmZhY2UtPmh3ZGF0YSk7Ci0gICAgICBzdXJmYWNlLT5od2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBzdXJmYWNlLT5mbGFncyB8PSBTRExfSFdTVVJGQUNFIHwgU0RMX1BSRUFMTE9DOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBEaXJlY3RGQl9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLSAgaWYgKHN1cmZhY2UtPmh3ZGF0YSAmJiBISURERU4tPmluaXRpYWxpemVkKQotICAgIHsKLSAgICAgIHN1cmZhY2UtPmh3ZGF0YS0+c3VyZmFjZS0+UmVsZWFzZSAoc3VyZmFjZS0+aHdkYXRhLT5zdXJmYWNlKTsKLSAgICAgIGZyZWUgKHN1cmZhY2UtPmh3ZGF0YSk7Ci0gICAgICBzdXJmYWNlLT5od2RhdGEgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGludCBEaXJlY3RGQl9DaGVja0hXQmxpdChfVEhJUywgU0RMX1N1cmZhY2UgKnNyYywgU0RMX1N1cmZhY2UgKmRzdCkKLXsKLSAgLyogIGZwcmludGYoc3RkZXJyLCAiU0RMOiBEaXJlY3RGQl9DaGVja0hXQmxpdCAoc3JjLT5od2RhdGE6ICVwLCBkc3QtPmh3ZGF0YTogJXApXG4iLAotICAgICAgc3JjLT5od2RhdGEsIGRzdC0+aHdkYXRhKTsqLwotCi0gIGlmICghc3JjLT5od2RhdGEgfHwgIWRzdC0+aHdkYXRhKQotICAgIHJldHVybiAwOwotCi0gIHNyYy0+ZmxhZ3MgfD0gU0RMX0hXQUNDRUw7Ci0gIHNyYy0+bWFwLT5od19ibGl0ID0gRGlyZWN0RkJfSFdBY2NlbEJsaXQ7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgRGlyZWN0RkJfSFdBY2NlbEJsaXQoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KQotewotICBERkJTdXJmYWNlQmxpdHRpbmdGbGFncyBmbGFncyA9IERTQkxJVF9OT0ZYOwotCi0gIERGQlJlY3RhbmdsZSBzciA9IHsgc3JjcmVjdC0+eCwgc3JjcmVjdC0+eSwgc3JjcmVjdC0+dywgc3JjcmVjdC0+aCB9OwotICBERkJSZWN0YW5nbGUgZHIgPSB7IGRzdHJlY3QtPngsIGRzdHJlY3QtPnksIGRzdHJlY3QtPncsIGRzdHJlY3QtPmggfTsKLQotICBJRGlyZWN0RkJTdXJmYWNlICpzdXJmYWNlID0gZHN0LT5od2RhdGEtPnN1cmZhY2U7Ci0KLSAgaWYgKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpCi0gICAgewotICAgICAgZmxhZ3MgfD0gRFNCTElUX1NSQ19DT0xPUktFWTsKLSAgICAgIERpcmVjdEZCX1NldEhXQ29sb3JLZXkgKE5VTEwsIHNyYywgc3JjLT5mb3JtYXQtPmNvbG9ya2V5KTsKLSAgICB9Ci0KLSAgaWYgKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpCi0gICAgewotICAgICAgZmxhZ3MgfD0gRFNCTElUX0JMRU5EX0NPTE9SQUxQSEE7Ci0gICAgICBzdXJmYWNlLT5TZXRDb2xvciAoc3VyZmFjZSwgMHhmZiwgMHhmZiwgMHhmZiwgc3JjLT5mb3JtYXQtPmFscGhhKTsKLSAgICB9Ci0KLSAgc3VyZmFjZS0+U2V0QmxpdHRpbmdGbGFncyAoc3VyZmFjZSwgZmxhZ3MpOwotCi0gIGlmIChzci53ID09IGRyLncgJiYgc3IuaCA9PSBkci5oKQotICAgIHN1cmZhY2UtPkJsaXQgKHN1cmZhY2UsIHNyYy0+aHdkYXRhLT5zdXJmYWNlLCAmc3IsIGRyLngsIGRyLnkpOwotICBlbHNlCi0gICAgc3VyZmFjZS0+U3RyZXRjaEJsaXQgKHN1cmZhY2UsIHNyYy0+aHdkYXRhLT5zdXJmYWNlLCAmc3IsICZkcik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgRGlyZWN0RkJfRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QsIFVpbnQzMiBjb2xvcikKLXsKLSAgU0RMX1BpeGVsRm9ybWF0ICAqZm10ICAgICA9IGRzdC0+Zm9ybWF0OwotICBJRGlyZWN0RkJTdXJmYWNlICpzdXJmYWNlID0gZHN0LT5od2RhdGEtPnN1cmZhY2U7Ci0KLSAgLyogdWdseSAqLwotICBzdXJmYWNlLT5TZXRDb2xvciAoc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIChjb2xvciAmIGZtdC0+Um1hc2spID4+IChmbXQtPlJzaGlmdCAtIGZtdC0+Umxvc3MpLAotICAgICAgICAgICAgICAgICAgICAgKGNvbG9yICYgZm10LT5HbWFzaykgPj4gKGZtdC0+R3NoaWZ0IC0gZm10LT5HbG9zcyksCi0gICAgICAgICAgICAgICAgICAgICAoY29sb3IgJiBmbXQtPkJtYXNrKSA8PCAoZm10LT5CbG9zcyAtIGZtdC0+QnNoaWZ0KSwgMHhGRik7Ci0gIHN1cmZhY2UtPkZpbGxSZWN0YW5nbGUgKHN1cmZhY2UsIGRzdHJlY3QtPngsIGRzdHJlY3QtPnksIGRzdHJlY3QtPncsIGRzdHJlY3QtPmgpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IERpcmVjdEZCX1NldEhXQ29sb3JLZXkoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFVpbnQzMiBrZXkpCi17Ci0gIFNETF9QaXhlbEZvcm1hdCAgKmZtdCAgICAgPSBzcmMtPmZvcm1hdDsKLSAgSURpcmVjdEZCU3VyZmFjZSAqc3VyZmFjZSA9IHNyYy0+aHdkYXRhLT5zdXJmYWNlOwotCi0gIGlmIChmbXQtPkJpdHNQZXJQaXhlbCA9PSA4KQotICAgIHN1cmZhY2UtPlNldFNyY0NvbG9yS2V5SW5kZXggKHN1cmZhY2UsIGtleSk7Ci0gIGVsc2UKLSAgICAvKiB1Z2x5ICovCi0gICAgc3VyZmFjZS0+U2V0U3JjQ29sb3JLZXkgKHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXkgJiBmbXQtPlJtYXNrKSA+PiAoZm10LT5Sc2hpZnQgLSBmbXQtPlJsb3NzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleSAmIGZtdC0+R21hc2spID4+IChmbXQtPkdzaGlmdCAtIGZtdC0+R2xvc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ICYgZm10LT5CbWFzaykgPDwgKGZtdC0+Qmxvc3MgLSBmbXQtPkJzaGlmdCkpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IERpcmVjdEZCX1NldEhXQWxwaGEoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50OCBhbHBoYSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgRGlyZWN0RkJfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0gIGlmIChISURERU4tPmVuYWJsZV9tZ2FfY3J0YzIpCi0gICAgewotICAgICAgIGludCBydG4gPSBzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UtPkZsaXAgKHN1cmZhY2UtPmh3ZGF0YS0+c3VyZmFjZSwgTlVMTCwgMCk7Ci0gICAgICAgaWYgKEhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2gpCi0gICAgICAgICBISURERU4tPmMyZnJhbWUtPlN0cmV0Y2hCbGl0KEhJRERFTi0+YzJmcmFtZSwgc3VyZmFjZS0+aHdkYXRhLT5zdXJmYWNlLCAmSElEREVOLT5jMnNzaXplLCAmSElEREVOLT5jMmRzaXplKTsKLSAgICAgICBlbHNlCi0gICAgICAgICBISURERU4tPmMyZnJhbWUtPkJsaXQoSElEREVOLT5jMmZyYW1lLCBzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UsIE5VTEwsIEhJRERFTi0+YzJkc2l6ZS54LCBISURERU4tPmMyZHNpemUueSk7Ci0gICAgIAotICAgICAgIEhJRERFTi0+YzJmcmFtZS0+RmxpcChISURERU4tPmMyZnJhbWUsIE5VTEwsIERTRkxJUF9XQUlURk9SU1lOQyk7Ci0gICAgICAgcmV0dXJuIHJ0bjsKLSAgICB9IAotICBlbHNlIAotICAgICByZXR1cm4gc3VyZmFjZS0+aHdkYXRhLT5zdXJmYWNlLT5GbGlwIChzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UsIE5VTEwsIERTRkxJUF9XQUlURk9SU1lOQyk7Ci19Ci0KLXN0YXRpYyBpbnQgRGlyZWN0RkJfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0gIERGQlJlc3VsdCAgcmV0OwotICB2b2lkICAgICAgKmRhdGE7Ci0gIGludCAgICAgICAgcGl0Y2g7Ci0KLSAgcmV0ID0gc3VyZmFjZS0+aHdkYXRhLT5zdXJmYWNlLT5Mb2NrIChzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNMRl9XUklURSwgJmRhdGEsICZwaXRjaCk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgU2V0RGlyZWN0RkJlcnJvciAoInN1cmZhY2UtPkxvY2siLCByZXQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBzdXJmYWNlLT5waXhlbHMgPSBkYXRhOwotICBzdXJmYWNlLT5waXRjaCAgPSBwaXRjaDsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgRGlyZWN0RkJfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLSAgc3VyZmFjZS0+aHdkYXRhLT5zdXJmYWNlLT5VbmxvY2sgKHN1cmZhY2UtPmh3ZGF0YS0+c3VyZmFjZSk7Ci0gIHN1cmZhY2UtPnBpeGVscyA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIERpcmVjdEZCX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0gIGlmIChISURERU4tPmVuYWJsZV9tZ2FfY3J0YzIpCi0gICAgewotICAgICAgIGlmIChISURERU4tPm1nYV9jcnRjMl9zdHJldGNoKQotICAgICAgICAgSElEREVOLT5jMmZyYW1lLT5TdHJldGNoQmxpdChISURERU4tPmMyZnJhbWUsIHRoaXMtPnNjcmVlbi0+aHdkYXRhLT5zdXJmYWNlLCAmSElEREVOLT5jMnNzaXplLCAmSElEREVOLT5jMmRzaXplKTsgCi0gICAgICAgZWxzZQotICAgICAgICAgSElEREVOLT5jMmZyYW1lLT5CbGl0KEhJRERFTi0+YzJmcmFtZSwgdGhpcy0+c2NyZWVuLT5od2RhdGEtPnN1cmZhY2UsIE5VTEwsIEhJRERFTi0+YzJkc2l6ZS54LCBISURERU4tPmMyZHNpemUueSk7IAotCi0gICAgICAgSElEREVOLT5jMmZyYW1lLT5GbGlwKEhJRERFTi0+YzJmcmFtZSwgTlVMTCwgRFNGTElQX1dBSVRGT1JTWU5DKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIERpcmVjdEZCX1dpbmRvd2VkVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLSAgREZCUmVnaW9uICAgICAgICAgcmVnaW9uOwotICBpbnQgICAgICAgICAgICAgICBpOwotICBpbnQgICAgICAgICAgICAgICByZWdpb25fdmFsaWQgPSAwOwotICBJRGlyZWN0RkJTdXJmYWNlICpzdXJmYWNlID0gdGhpcy0+c2NyZWVuLT5od2RhdGEtPnN1cmZhY2U7Ci0KLSAgZm9yIChpPTA7IGk8bnVtcmVjdHM7ICsraSkKLSAgICB7Ci0gICAgICBpbnQgeDIsIHkyOwotCi0gICAgICBpZiAoICEgcmVjdHNbaV0udyApIC8qIENsaXBwZWQ/ICovCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICB4MiA9IHJlY3RzW2ldLnggKyByZWN0c1tpXS53IC0gMTsKLSAgICAgIHkyID0gcmVjdHNbaV0ueSArIHJlY3RzW2ldLmggLSAxOwotCi0gICAgICBpZiAocmVnaW9uX3ZhbGlkKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHJlY3RzW2ldLnggPCByZWdpb24ueDEpCi0gICAgICAgICAgICByZWdpb24ueDEgPSByZWN0c1tpXS54OwotCi0gICAgICAgICAgaWYgKHJlY3RzW2ldLnkgPCByZWdpb24ueTEpCi0gICAgICAgICAgICByZWdpb24ueTEgPSByZWN0c1tpXS55OwotCi0gICAgICAgICAgaWYgKHgyID4gcmVnaW9uLngyKQotICAgICAgICAgICAgcmVnaW9uLngyID0geDI7Ci0KLSAgICAgICAgICBpZiAoeTIgPiByZWdpb24ueTIpCi0gICAgICAgICAgICByZWdpb24ueTIgPSB5MjsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdpb24ueDEgPSByZWN0c1tpXS54OwotICAgICAgICAgICAgcmVnaW9uLnkxID0gcmVjdHNbaV0ueTsKLSAgICAgICAgICAgIHJlZ2lvbi54MiA9IHgyOwotICAgICAgICAgICAgcmVnaW9uLnkyID0geTI7Ci0KLSAgICAgICAgICAgIHJlZ2lvbl92YWxpZCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKHJlZ2lvbl92YWxpZCkKLSAgICB7Ci0gICAgICBpZiAoSElEREVOLT5lbmFibGVfbWdhX2NydGMyKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKEhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2gpCi0gICAgICAgICAgICBISURERU4tPmMyZnJhbWUtPlN0cmV0Y2hCbGl0KEhJRERFTi0+YzJmcmFtZSwgc3VyZmFjZSwgJkhJRERFTi0+YzJzc2l6ZSwgJkhJRERFTi0+YzJkc2l6ZSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgSElEREVOLT5jMmZyYW1lLT5CbGl0KEhJRERFTi0+YzJmcmFtZSwgc3VyZmFjZSwgTlVMTCwgSElEREVOLT5jMmRzaXplLngsIEhJRERFTi0+YzJkc2l6ZS55KTsgCi0gICAgICAKLSAgICAgICAgICBISURERU4tPmMyZnJhbWUtPkZsaXAoSElEREVOLT5jMmZyYW1lLCBOVUxMLCBEU0ZMSVBfV0FJVEZPUlNZTkMpOwotICAgICAgICB9Ci0gICAgICBlbHNlIAotICAgICAgICBzdXJmYWNlLT5GbGlwIChzdXJmYWNlLCAmcmVnaW9uLCBEU0ZMSVBfV0FJVEZPUlNZTkMpOwotICAgIH0KLX0KLQotaW50IERpcmVjdEZCX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKLXsKLSAgSURpcmVjdEZCUGFsZXR0ZSAqcGFsZXR0ZSA9IHRoaXMtPnNjcmVlbi0+aHdkYXRhLT5wYWxldHRlOwotCi0gIGlmICghcGFsZXR0ZSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZmlyc3Rjb2xvciA+IDI1NSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZmlyc3Rjb2xvciArIG5jb2xvcnMgPiAyNTYpCi0gICAgbmNvbG9ycyA9IDI1NiAtIGZpcnN0Y29sb3I7Ci0KLSAgaWYgKG5jb2xvcnMgPiAwKQotICAgIHsKLSAgICAgIGludCAgICAgIGk7Ci0gICAgICBERkJDb2xvciBlbnRyaWVzW25jb2xvcnNdOwotCi0gICAgICBmb3IgKGk9MDsgaTxuY29sb3JzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBlbnRyaWVzW2ldLmEgPSAweGZmOwotICAgICAgICAgIGVudHJpZXNbaV0uciA9IGNvbG9yc1tpXS5yOwotICAgICAgICAgIGVudHJpZXNbaV0uZyA9IGNvbG9yc1tpXS5nOwotICAgICAgICAgIGVudHJpZXNbaV0uYiA9IGNvbG9yc1tpXS5iOwotICAgICAgICB9Ci0KLSAgICAgIHBhbGV0dGUtPlNldEVudHJpZXMgKHBhbGV0dGUsIGVudHJpZXMsIG5jb2xvcnMsIGZpcnN0Y29sb3IpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQkKLXZvaWQgRGlyZWN0RkJfVmlkZW9RdWl0KF9USElTKQotewotICBzdHJ1Y3QgRGlyZWN0RkJFbnVtUmVjdCAqcmVjdCAgICA9IGVudW1saXN0OwotCi0gIGlmICh0aGlzLT5zY3JlZW4gJiYgdGhpcy0+c2NyZWVuLT5od2RhdGEpCi0gICAgewotICAgICAgSURpcmVjdEZCU3VyZmFjZSAgICAgICAgKnN1cmZhY2UgPSB0aGlzLT5zY3JlZW4tPmh3ZGF0YS0+c3VyZmFjZTsKLSAgICAgIElEaXJlY3RGQlBhbGV0dGUgICAgICAgICpwYWxldHRlID0gdGhpcy0+c2NyZWVuLT5od2RhdGEtPnBhbGV0dGU7Ci0KLSAgICAgIGlmIChwYWxldHRlKQotICAgICAgICBwYWxldHRlLT5SZWxlYXNlIChwYWxldHRlKTsKLQotICAgICAgaWYgKHN1cmZhY2UpCi0gICAgICAgIHN1cmZhY2UtPlJlbGVhc2UgKHN1cmZhY2UpOwotCi0gICAgICB0aGlzLT5zY3JlZW4tPmh3ZGF0YS0+c3VyZmFjZSA9IE5VTEw7Ci0gICAgICB0aGlzLT5zY3JlZW4tPmh3ZGF0YS0+cGFsZXR0ZSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChISURERU4tPmMyZnJhbWUpCi0gICAgewotICAgICAgSElEREVOLT5jMmZyYW1lLT5SZWxlYXNlIChISURERU4tPmMyZnJhbWUpOwotICAgICAgSElEREVOLT5jMmZyYW1lID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKEhJRERFTi0+ZXZlbnRidWZmZXIpCi0gICAgewotICAgICAgSElEREVOLT5ldmVudGJ1ZmZlci0+UmVsZWFzZSAoSElEREVOLT5ldmVudGJ1ZmZlcik7Ci0gICAgICBISURERU4tPmV2ZW50YnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKEhJRERFTi0+YzJsYXllcikKLSAgICB7Ci0gICAgICBISURERU4tPmMybGF5ZXItPlJlbGVhc2UgKEhJRERFTi0+YzJsYXllcik7Ci0gICAgICBISURERU4tPmMybGF5ZXIgPSBOVUxMOwotICAgIH0KLQotICBpZiAoSElEREVOLT5sYXllcikKLSAgICB7Ci0gICAgICBISURERU4tPmxheWVyLT5SZWxlYXNlIChISURERU4tPmxheWVyKTsKLSAgICAgIEhJRERFTi0+bGF5ZXIgPSBOVUxMOwotICAgIH0KLQotICBpZiAoSElEREVOLT5kZmIpCi0gICAgewotICAgICAgSElEREVOLT5kZmItPlJlbGVhc2UgKEhJRERFTi0+ZGZiKTsKLSAgICAgIEhJRERFTi0+ZGZiID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB2aWRlbyBtb2RlIGxpc3QgKi8KLSAgaWYgKEhJRERFTi0+bW9kZWxpc3QpCi0gICAgewotICAgICAgZnJlZSAoSElEREVOLT5tb2RlbGlzdCk7Ci0gICAgICBISURERU4tPm1vZGVsaXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSBtb2RlIGVudW1lcmF0aW9uIGxpc3QgKi8KLSAgd2hpbGUgKHJlY3QpCi0gICAgewotICAgICAgc3RydWN0IERpcmVjdEZCRW51bVJlY3QgKm5leHQgPSByZWN0LT5uZXh0OwotICAgICAgZnJlZSAocmVjdCk7Ci0gICAgICByZWN0ID0gbmV4dDsKLSAgICB9Ci0gIGVudW1saXN0ID0gTlVMTDsKLQotICBISURERU4tPmluaXRpYWxpemVkID0gMDsKLX0KLQotCi1pbnQgRGlyZWN0RkJfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotICAvKiBXZSBjYW4gb25seSBoaWRlIG9yIHNob3cgdGhlIGRlZmF1bHQgY3Vyc29yICovCi0gIGlmICggY3Vyc29yID09IE5VTEwgKQotICAgIHsKLSAgICAgIEhJRERFTi0+bGF5ZXItPlNldEN1cnNvck9wYWNpdHkoSElEREVOLT5sYXllciwgMHgwMCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBISURERU4tPmxheWVyLT5TZXRDdXJzb3JPcGFjaXR5KEhJRERFTi0+bGF5ZXIsIDB4RkYpOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgRGlyZWN0RkJfRmluYWxRdWl0KHZvaWQpIAotewotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX3ZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTJiMjguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfdmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfRGlyZWN0RkJfdmlkZW9faAotI2RlZmluZSBfU0RMX0RpcmVjdEZCX3ZpZGVvX2gKLQotI2luY2x1ZGUgPGRpcmVjdGZiLmg+Ci0KLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotI2RlZmluZSBfVEhJUyBTRExfVmlkZW9EZXZpY2UgKnRoaXMKLQotLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgKi8KLQotc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhCi17Ci0gIGludCAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQ7Ci0KLSAgSURpcmVjdEZCICAgICAgICAgICAgICpkZmI7Ci0gIElEaXJlY3RGQkRpc3BsYXlMYXllciAqbGF5ZXI7Ci0gIElEaXJlY3RGQkV2ZW50QnVmZmVyICAqZXZlbnRidWZmZXI7Ci0KLSAgaW50IG51bW1vZGVzOwotICBTRExfUmVjdCAqKm1vZGVsaXN0OwotCi0gIC8qIE1HQSBDUlRDMiBzdXBwb3J0ICovCi0gIGludCBlbmFibGVfbWdhX2NydGMyOwotICBpbnQgbWdhX2NydGMyX3N0cmV0Y2g7Ci0gIGZsb2F0IG1nYV9jcnRjMl9zdHJldGNoX292ZXJzY2FuOwotICBJRGlyZWN0RkJEaXNwbGF5TGF5ZXIgKmMybGF5ZXI7Ci0gIElEaXJlY3RGQlN1cmZhY2UgKmMyZnJhbWU7Ci0gIERGQlJlY3RhbmdsZSBjMnNzaXplOwkvKiBSZWFsIHNjcmVlbiBzaXplICovCi0gIERGQlJlY3RhbmdsZSBjMmRzaXplOwkvKiBTdHJldGNoZWQgc2NyZWVuIHNpemUgKi8KLSAgREZCUmVjdGFuZ2xlIGMyZnJhbWVzaXplOyAgICAvKiBDUlRDMiBzY3JlZW4gc2l6ZSAqLwotfTsKLQotI2RlZmluZSBISURERU4gKHRoaXMtPmhpZGRlbikKLQotdm9pZCBTZXREaXJlY3RGQmVycm9yIChjb25zdCBjaGFyICpmdW5jdGlvbiwgREZCUmVzdWx0IGNvZGUpOwotCi0jZW5kaWYgLyogX1NETF9EaXJlY3RGQl92aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl95dXYuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX3l1di5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY2MjU0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX3l1di5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBEaXJlY3RGQiBpbXBsZW1lbnRhdGlvbiBvZiBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9EaXJlY3RGQl95dXYuaCIKLSNpbmNsdWRlICIuLi9TRExfeXV2ZnVuY3MuaCIKLQotCi0vKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gbWFuaXB1bGF0ZSBzb2Z0d2FyZSB2aWRlbyBvdmVybGF5cyAqLwotc3RhdGljIHN0cnVjdCBwcml2YXRlX3l1dmh3ZnVuY3MgZGlyZWN0ZmJfeXV2ZnVuY3MgPSB7Ci0gIERpcmVjdEZCX0xvY2tZVVZPdmVybGF5LAotICBEaXJlY3RGQl9VbmxvY2tZVVZPdmVybGF5LAotICBEaXJlY3RGQl9EaXNwbGF5WVVWT3ZlcmxheSwKLSAgRGlyZWN0RkJfRnJlZVlVVk92ZXJsYXkKLX07Ci0KLXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSB7Ci0gIERGQkRpc3BsYXlMYXllcklEICAgICAgbGF5ZXJfaWQ7Ci0KLSAgSURpcmVjdEZCRGlzcGxheUxheWVyICpsYXllcjsKLSAgSURpcmVjdEZCU3VyZmFjZSAgICAgICpzdXJmYWNlOwotCi0gIC8qIFRoZXNlIGFyZSBqdXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgdGhlbSBzZXBhcmF0ZWx5ICovCi0gIFVpbnQxNiBwaXRjaGVzWzNdOwotICBVaW50OCAqcGxhbmVzWzNdOwotfTsKLQotc3RhdGljIERGQkVudW1lcmF0aW9uUmVzdWx0Ci1lbnVtX2xheWVyc19jYWxsYmFjayggREZCRGlzcGxheUxheWVySUQgICAgICAgICAgICBpZCwKLSAgICAgICAgICAgICAgICAgICAgICBERkJEaXNwbGF5TGF5ZXJEZXNjcmlwdGlvbiAgIGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhICkKLXsKLSAgc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICpod2RhdGEgPSAoc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICopIGRhdGE7Ci0KLSAgLyogd2UgZG9uJ3Qgd2FudCB0aGUgcHJpbWFyeSAqLwotICBpZiAoaWQgPT0gRExJRF9QUklNQVJZKQotICAgIHJldHVybiBERkVOVU1fT0s7Ci0KLSAgLyogdGFrZSB0aGUgb25lIHdpdGggYSBzdXJmYWNlIGZvciB2aWRlbyAqLwotICBpZiAoKGRlc2MuY2FwcyAmIERMQ0FQU19TVVJGQUNFKSAmJiAoZGVzYy50eXBlICYgRExURl9WSURFTykpCi0gICAgewotICAgICAgaHdkYXRhLT5sYXllcl9pZCA9IGlkOwotCi0gICAgICByZXR1cm4gREZFTlVNX0NBTkNFTDsKLSAgICB9Ci0KLSAgcmV0dXJuIERGRU5VTV9PSzsKLX0KLQotCi1zdGF0aWMgREZCUmVzdWx0IENyZWF0ZVlVVlN1cmZhY2UoX1RISVMsIHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCkKLXsKLSAgREZCUmVzdWx0ICAgICAgICAgICAgICByZXQ7Ci0gIElEaXJlY3RGQiAgICAgICAgICAgICAqZGZiID0gSElEREVOLT5kZmI7Ci0gIElEaXJlY3RGQkRpc3BsYXlMYXllciAqbGF5ZXI7Ci0gIERGQkRpc3BsYXlMYXllckNvbmZpZyAgY29uZjsKLQotICByZXQgPSBkZmItPkVudW1EaXNwbGF5TGF5ZXJzIChkZmIsIGVudW1fbGF5ZXJzX2NhbGxiYWNrLCBod2RhdGEpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIFNldERpcmVjdEZCZXJyb3IoIklEaXJlY3RGQjo6RW51bURpc3BsYXlMYXllcnMiLCByZXQpOwotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgaWYgKCFod2RhdGEtPmxheWVyX2lkKQotICAgIHJldHVybiBERkJfVU5TVVBQT1JURUQ7Ci0KLSAgcmV0ID0gZGZiLT5HZXREaXNwbGF5TGF5ZXIgKGRmYiwgaHdkYXRhLT5sYXllcl9pZCwgJmxheWVyKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICBTZXREaXJlY3RGQmVycm9yKCJJRGlyZWN0RkI6OkdldERpc3BsYXlMYXllciIsIHJldCk7Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICBjb25mLmZsYWdzID0gRExDT05GX1dJRFRIIHwgRExDT05GX0hFSUdIVCB8IERMQ09ORl9QSVhFTEZPUk1BVDsKLSAgY29uZi53aWR0aCA9IHdpZHRoOwotICBjb25mLmhlaWdodCA9IGhlaWdodDsKLQotICBzd2l0Y2ggKGZvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSBTRExfWVYxMl9PVkVSTEFZOgotICAgICAgY29uZi5waXhlbGZvcm1hdCA9IERTUEZfWVYxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKLSAgICAgIGNvbmYucGl4ZWxmb3JtYXQgPSBEU1BGX0k0MjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNETF9ZVVkyX09WRVJMQVk6Ci0gICAgICBjb25mLnBpeGVsZm9ybWF0ID0gRFNQRl9ZVVkyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTRExfVVlWWV9PVkVSTEFZOgotICAgICAgY29uZi5waXhlbGZvcm1hdCA9IERTUEZfVVlWWTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJTRExfRGlyZWN0RkI6IFVuc3VwcG9ydGVkIFlVViBmb3JtYXQgKDB4JTA4eCkhXG4iLCBmb3JtYXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIE5lZWQgdG8gc2V0IGNvb3AgbGV2ZWwgb3IgbmV3ZXIgRGlyZWN0RkIgdmVyc2lvbnMgd2lsbCBmYWlsIGhlcmUuICovCi0gIHJldCA9IGxheWVyLT5TZXRDb29wZXJhdGl2ZUxldmVsIChsYXllciwgRExTQ0xfQURNSU5JU1RSQVRJVkUpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIFNldERpcmVjdEZCZXJyb3IoIklEaXJlY3RGQkRpc3BsYXlMYXllcjo6U2V0Q29vcGVyYXRpdmVMZXZlbCgpIGZhaWxlZCIsIHJldCk7Ci0gICAgICBsYXllci0+UmVsZWFzZSAobGF5ZXIpOwotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgcmV0ID0gbGF5ZXItPlNldENvbmZpZ3VyYXRpb24gKGxheWVyLCAmY29uZik7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgU2V0RGlyZWN0RkJlcnJvcigiSURpcmVjdEZCRGlzcGxheUxheWVyOjpTZXRDb25maWd1cmF0aW9uIiwgcmV0KTsKLSAgICAgIGxheWVyLT5SZWxlYXNlIChsYXllcik7Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICByZXQgPSBsYXllci0+R2V0U3VyZmFjZSAobGF5ZXIsICZod2RhdGEtPnN1cmZhY2UpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIFNldERpcmVjdEZCZXJyb3IoIklEaXJlY3RGQkRpc3BsYXlMYXllcjo6R2V0U3VyZmFjZSIsIHJldCk7Ci0gICAgICBsYXllci0+UmVsZWFzZSAobGF5ZXIpOwotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgaHdkYXRhLT5sYXllciA9IGxheWVyOwotCi0gIHJldHVybiBERkJfT0s7Ci19Ci0KLVNETF9PdmVybGF5ICpEaXJlY3RGQl9DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KQotewotICBTRExfT3ZlcmxheSAqb3ZlcmxheTsKLSAgc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICpod2RhdGE7Ci0KLSAgLyogQ3JlYXRlIHRoZSBvdmVybGF5IHN0cnVjdHVyZSAqLwotICBvdmVybGF5ID0gU0RMX2NhbGxvYyAoMSwgc2l6ZW9mKFNETF9PdmVybGF5KSk7Ci0gIGlmICghb3ZlcmxheSkKLSAgICB7Ci0gICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQkKLSAgLyogRmlsbCBpbiB0aGUgYmFzaWMgbWVtYmVycyAqLwotICBvdmVybGF5LT5mb3JtYXQgPSBmb3JtYXQ7Ci0gIG92ZXJsYXktPncgPSB3aWR0aDsKLSAgb3ZlcmxheS0+aCA9IGhlaWdodDsKLQotICAvKiBTZXQgdXAgdGhlIFlVViBzdXJmYWNlIGZ1bmN0aW9uIHN0cnVjdHVyZSAqLwotICBvdmVybGF5LT5od2Z1bmNzID0gJmRpcmVjdGZiX3l1dmZ1bmNzOwotCi0gIC8qIENyZWF0ZSB0aGUgcGl4ZWwgZGF0YSBhbmQgbG9va3VwIHRhYmxlcyAqLwotICBod2RhdGEgPSBTRExfY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEpKTsKLSAgb3ZlcmxheS0+aHdkYXRhID0gaHdkYXRhOwotICBpZiAoIWh3ZGF0YSkKLSAgICB7Ci0gICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgIFNETF9GcmVlWVVWT3ZlcmxheSAob3ZlcmxheSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKENyZWF0ZVlVVlN1cmZhY2UgKHRoaXMsIGh3ZGF0YSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0KSkKLSAgICB7Ci0gICAgICBTRExfRnJlZVlVVk92ZXJsYXkgKG92ZXJsYXkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG92ZXJsYXktPmh3X292ZXJsYXkgPSAxOwotCi0gIC8qIFNldCB1cCB0aGUgcGxhbmUgcG9pbnRlcnMgKi8KLSAgb3ZlcmxheS0+cGl0Y2hlcyA9IGh3ZGF0YS0+cGl0Y2hlczsKLSAgb3ZlcmxheS0+cGl4ZWxzID0gaHdkYXRhLT5wbGFuZXM7Ci0gIHN3aXRjaCAoZm9ybWF0KQotICAgIHsKLSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0gICAgY2FzZSBTRExfSVlVVl9PVkVSTEFZOgotICAgICAgb3ZlcmxheS0+cGxhbmVzID0gMzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvdmVybGF5LT5wbGFuZXMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFdlJ3JlIGFsbCBkb25lLi4gKi8KLSAgcmV0dXJuIG92ZXJsYXk7Ci19Ci0KLWludCBEaXJlY3RGQl9Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCi17Ci0gIERGQlJlc3VsdCAgICAgICAgIHJldDsKLSAgdm9pZCAgICAgICAgICAgICAqZGF0YTsKLSAgaW50ICAgICAgICAgICAgICAgcGl0Y2g7Ci0gIElEaXJlY3RGQlN1cmZhY2UgKnN1cmZhY2UgPSBvdmVybGF5LT5od2RhdGEtPnN1cmZhY2U7Ci0KLSAgcmV0ID0gc3VyZmFjZS0+TG9jayAoc3VyZmFjZSwgRFNMRl9SRUFEIHwgRFNMRl9XUklURSwgJmRhdGEsICZwaXRjaCk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgU2V0RGlyZWN0RkJlcnJvcigiSURpcmVjdEZCU3VyZmFjZTo6TG9jayIsIHJldCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEZpbmQgdGhlIHBpdGNoIGFuZCBvZmZzZXQgdmFsdWVzIGZvciB0aGUgb3ZlcmxheSAqLwotICBvdmVybGF5LT5waXRjaGVzWzBdID0gKFVpbnQxNikgcGl0Y2g7Ci0gIG92ZXJsYXktPnBpeGVsc1swXSAgPSAoVWludDgqKSBkYXRhOwotCi0gIHN3aXRjaCAob3ZlcmxheS0+Zm9ybWF0KQotICAgIHsKLSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0gICAgY2FzZSBTRExfSVlVVl9PVkVSTEFZOgotICAgICAgLyogQWRkIHRoZSB0d28gZXh0cmEgcGxhbmVzICovCi0gICAgICBvdmVybGF5LT5waXRjaGVzWzFdID0gb3ZlcmxheS0+cGl0Y2hlc1swXSAvIDI7Ci0gICAgICBvdmVybGF5LT5waXRjaGVzWzJdID0gb3ZlcmxheS0+cGl0Y2hlc1swXSAvIDI7Ci0gICAgICBvdmVybGF5LT5waXhlbHNbMV0gID0gb3ZlcmxheS0+cGl4ZWxzWzBdICsgb3ZlcmxheS0+cGl0Y2hlc1swXSAqIG92ZXJsYXktPmg7Ci0gICAgICBvdmVybGF5LT5waXhlbHNbMl0gID0gb3ZlcmxheS0+cGl4ZWxzWzFdICsgb3ZlcmxheS0+cGl0Y2hlc1sxXSAqIG92ZXJsYXktPmggLyAyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIE9ubHkgb25lIHBsYW5lLCBubyB3b3JyaWVzICovCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRGlyZWN0RkJfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCi17Ci0gIElEaXJlY3RGQlN1cmZhY2UgKnN1cmZhY2UgPSBvdmVybGF5LT5od2RhdGEtPnN1cmZhY2U7Ci0KLSAgb3ZlcmxheS0+cGl4ZWxzWzBdID0gb3ZlcmxheS0+cGl4ZWxzWzFdID0gb3ZlcmxheS0+cGl4ZWxzWzJdID0gTlVMTDsKLQotICBzdXJmYWNlLT5VbmxvY2sgKHN1cmZhY2UpOwotfQotCi1pbnQgRGlyZWN0RkJfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KQotewotICBERkJSZXN1bHQgICAgICAgICAgICAgIHJldDsKLSAgREZCRGlzcGxheUxheWVyQ29uZmlnICBjb25mOwotICBJRGlyZWN0RkJEaXNwbGF5TGF5ZXIgKnByaW1hcnkgPSBISURERU4tPmxheWVyOwotICBJRGlyZWN0RkJEaXNwbGF5TGF5ZXIgKmxheWVyICAgPSBvdmVybGF5LT5od2RhdGEtPmxheWVyOwotCi0gIHByaW1hcnktPkdldENvbmZpZ3VyYXRpb24gKHByaW1hcnksICZjb25mKTsKLQotICByZXQgPSBsYXllci0+U2V0U2NyZWVuTG9jYXRpb24gKGxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+eCAvIChmbG9hdCkgY29uZi53aWR0aCwgZHN0LT55IC8gKGZsb2F0KSBjb25mLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPncgLyAoZmxvYXQpIGNvbmYud2lkdGgsIGRzdC0+aCAvIChmbG9hdCkgY29uZi5oZWlnaHQgKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICBTZXREaXJlY3RGQmVycm9yKCJJRGlyZWN0RkJEaXNwbGF5TGF5ZXI6OlNldFNjcmVlbkxvY2F0aW9uIiwgcmV0KTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRGlyZWN0RkJfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQotewotICBzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKLQotICBod2RhdGEgPSBvdmVybGF5LT5od2RhdGE7Ci0gIGlmIChod2RhdGEpCi0gICAgewotICAgICAgaWYgKGh3ZGF0YS0+c3VyZmFjZSkKLSAgICAgICAgaHdkYXRhLT5zdXJmYWNlLT5SZWxlYXNlIChod2RhdGEtPnN1cmZhY2UpOwotCi0gICAgICBpZiAoaHdkYXRhLT5sYXllcikKLSAgICAgICAgaHdkYXRhLT5sYXllci0+UmVsZWFzZSAoaHdkYXRhLT5sYXllcik7Ci0KLSAgICAgIGZyZWUgKGh3ZGF0YSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl95dXYuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX3l1di5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2E0MmRjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX3l1di5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoaXMgaXMgdGhlIERpcmVjdEZCIGltcGxlbWVudGF0aW9uIG9mIFlVViB2aWRlbyBvdmVybGF5cyAqLwotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX0RpcmVjdEZCX3ZpZGVvLmgiCi0KLWV4dGVybiBTRExfT3ZlcmxheSAqRGlyZWN0RkJfQ3JlYXRlWVVWT3ZlcmxheShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBVaW50MzIgZm9ybWF0LCBTRExfU3VyZmFjZSAqZGlzcGxheSk7Ci0KLWV4dGVybiBpbnQgRGlyZWN0RkJfTG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKLQotZXh0ZXJuIHZvaWQgRGlyZWN0RkJfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOwotCi1leHRlcm4gaW50IERpcmVjdEZCX0Rpc3BsYXlZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSwgU0RMX1JlY3QgKnNyYywgU0RMX1JlY3QgKmRzdCk7Ci0KLWV4dGVybiB2b2lkIERpcmVjdEZCX0ZyZWVZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGxldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGxldmVudHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5NDc1Zi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogQmVpbmcgYSBudWxsIGRyaXZlciwgdGhlcmUncyBubyBldmVudCBzdHJlYW0uIFdlIGp1c3QgZGVmaW5lIHN0dWJzIGZvcgotICAgbW9zdCBvZiB0aGUgQVBJLiAqLwotCi0jaW5jbHVkZSAiU0RMLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0KLSNpbmNsdWRlICJTRExfbnVsbHZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX251bGxldmVudHNfYy5oIgotCi12b2lkIERVTU1ZX1B1bXBFdmVudHMoX1RISVMpCi17Ci0JLyogZG8gbm90aGluZy4gKi8KLX0KLQotdm9pZCBEVU1NWV9Jbml0T1NLZXltYXAoX1RISVMpCi17Ci0JLyogZG8gbm90aGluZy4gKi8KLX0KLQotLyogZW5kIG9mIFNETF9udWxsZXZlbnRzLmMgLi4uICovCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGxldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kdW1teS9TRExfbnVsbGV2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NGMzMzYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kdW1teS9TRExfbnVsbGV2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9udWxsdmlkZW8uaCIKLQotLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAotICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQotKi8KLWV4dGVybiB2b2lkIERVTU1ZX0luaXRPU0tleW1hcChfVEhJUyk7Ci1leHRlcm4gdm9pZCBEVU1NWV9QdW1wRXZlbnRzKF9USElTKTsKLQotLyogZW5kIG9mIFNETF9udWxsZXZlbnRzX2MuaCAuLi4gKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kdW1teS9TRExfbnVsbG1vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsbW91c2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliNTFhNy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsbW91c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotCi0jaW5jbHVkZSAiU0RMX251bGxtb3VzZV9jLmgiCi0KLQotLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCi1zdHJ1Y3QgV01jdXJzb3IgewotCWludCB1bnVzZWQ7Ci19OwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kdW1teS9TRExfbnVsbG1vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGxtb3VzZV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzBlNjcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kdW1teS9TRExfbnVsbG1vdXNlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX251bGx2aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGx2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kdW1teS9TRExfbnVsbHZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNmZhYjYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kdW1teS9TRExfbnVsbHZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIER1bW15IFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb247IHRoaXMgaXMganVzdCBlbm91Z2ggdG8gbWFrZSBhbgotICogIFNETC1iYXNlZCBhcHBsaWNhdGlvbiBUSElOSyBpdCdzIGdvdCBhIHdvcmtpbmcgdmlkZW8gZHJpdmVyLCBmb3IKLSAqICBhcHBsaWNhdGlvbnMgdGhhdCBjYWxsIFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSB3aGVuIHRoZXkgZG9uJ3QgbmVlZCBpdCwKLSAqICBhbmQgYWxzbyBmb3IgdXNlIGFzIGEgY29sbGVjdGlvbiBvZiBzdHVicyB3aGVuIHBvcnRpbmcgU0RMIHRvIGEgbmV3Ci0gKiAgcGxhdGZvcm0gZm9yIHdoaWNoIHlvdSBoYXZlbid0IHlldCB3cml0dGVuIGEgdmFsaWQgdmlkZW8gZHJpdmVyLgotICoKLSAqIFRoaXMgaXMgYWxzbyBhIGdyZWF0IHdheSB0byBkZXRlcm1pbmUgYm90dGxlbmVja3M6IGlmIHlvdSB0aGluayB0aGF0IFNETAotICogIGlzIGEgcGVyZm9ybWFuY2UgcHJvYmxlbSBmb3IgYSBnaXZlbiBwbGF0Zm9ybSwgZW5hYmxlIHRoaXMgZHJpdmVyLCBhbmQKLSAqICB0aGVuIHNlZSBpZiB5b3VyIGFwcGxpY2F0aW9uIHJ1bnMgZmFzdGVyIHdpdGhvdXQgdmlkZW8gb3ZlcmhlYWQuCi0gKgotICogSW5pdGlhbCB3b3JrIGJ5IFJ5YW4gQy4gR29yZG9uIChpY2N1bHVzQGljY3VsdXMub3JnKS4gQSBnb29kIHBvcnRpb24KLSAqICBvZiB0aGlzIHdhcyBjdXQtYW5kLXBhc3RlZCBmcm9tIFN0ZXBoYW5lIFBldGVyJ3Mgd29yayBpbiB0aGUgQUFsaWIKLSAqICBTREwgdmlkZW8gZHJpdmVyLiAgUmVuYW1lZCB0byAiRFVNTVkiIGJ5IFNhbSBMYW50aW5nYS4KLSAqLwotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotCi0jaW5jbHVkZSAiU0RMX251bGx2aWRlby5oIgotI2luY2x1ZGUgIlNETF9udWxsZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfbnVsbG1vdXNlX2MuaCIKLQotI2RlZmluZSBEVU1NWVZJRF9EUklWRVJfTkFNRSAiZHVtbXkiCi0KLS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBEVU1NWV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKipEVU1NWV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIFNETF9TdXJmYWNlICpEVU1NWV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgaW50IERVTU1ZX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgdm9pZCBEVU1NWV9WaWRlb1F1aXQoX1RISVMpOwotCi0vKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBEVU1NWV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBEVU1NWV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBEVU1NWV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIERVTU1ZX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLQotLyogZXRjLiAqLwotc3RhdGljIHZvaWQgRFVNTVlfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotLyogRFVNTVkgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBEVU1NWV9BdmFpbGFibGUodm9pZCkKLXsKLQljb25zdCBjaGFyICplbnZyID0gU0RMX2dldGVudigiU0RMX1ZJREVPRFJJVkVSIik7Ci0JaWYgKChlbnZyKSAmJiAoU0RMX3N0cmNtcChlbnZyLCBEVU1NWVZJRF9EUklWRVJfTkFNRSkgPT0gMCkpIHsKLQkJcmV0dXJuKDEpOwotCX0KLQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgRFVNTVlfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpEVU1NWV9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7Ci0JaWYgKCBkZXZpY2UgKSB7Ci0JCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLQkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCX0KLQlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCBkZXZpY2UgKSB7Ci0JCQlTRExfZnJlZShkZXZpY2UpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQlkZXZpY2UtPlZpZGVvSW5pdCA9IERVTU1ZX1ZpZGVvSW5pdDsKLQlkZXZpY2UtPkxpc3RNb2RlcyA9IERVTU1ZX0xpc3RNb2RlczsKLQlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IERVTU1ZX1NldFZpZGVvTW9kZTsKLQlkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBOVUxMOwotCWRldmljZS0+U2V0Q29sb3JzID0gRFVNTVlfU2V0Q29sb3JzOwotCWRldmljZS0+VXBkYXRlUmVjdHMgPSBEVU1NWV9VcGRhdGVSZWN0czsKLQlkZXZpY2UtPlZpZGVvUXVpdCA9IERVTU1ZX1ZpZGVvUXVpdDsKLQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gRFVNTVlfQWxsb2NIV1N1cmZhY2U7Ci0JZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7Ci0JZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOwotCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7Ci0JZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gRFVNTVlfTG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IERVTU1ZX1VubG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOwotCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IERVTU1ZX0ZyZWVIV1N1cmZhY2U7Ci0JZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKLQlkZXZpY2UtPlNldEljb24gPSBOVUxMOwotCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7Ci0JZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOwotCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IERVTU1ZX0luaXRPU0tleW1hcDsKLQlkZXZpY2UtPlB1bXBFdmVudHMgPSBEVU1NWV9QdW1wRXZlbnRzOwotCi0JZGV2aWNlLT5mcmVlID0gRFVNTVlfRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIGRldmljZTsKLX0KLQotVmlkZW9Cb290U3RyYXAgRFVNTVlfYm9vdHN0cmFwID0gewotCURVTU1ZVklEX0RSSVZFUl9OQU1FLCAiU0RMIGR1bW15IHZpZGVvIGRyaXZlciIsCi0JRFVNTVlfQXZhaWxhYmxlLCBEVU1NWV9DcmVhdGVEZXZpY2UKLX07Ci0KLQotaW50IERVTU1ZX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotCS8qCi0JZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBZb3UgYXJlIHVzaW5nIHRoZSBTREwgZHVtbXkgdmlkZW8gZHJpdmVyIVxuIik7Ci0JKi8KLQotCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICh1c2UgZGVmYXVsdCA4LWJpdCBkZXB0aCkgKi8KLQkvKiB3ZSBjaGFuZ2UgdGhpcyBkdXJpbmcgdGhlIFNETF9TZXRWaWRlb01vZGUgaW1wbGVtZW50YXRpb24uLi4gKi8KLQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSA4OwotCXZmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPSAxOwotCi0JLyogV2UncmUgZG9uZSEgKi8KLQlyZXR1cm4oMCk7Ci19Ci0KLVNETF9SZWN0ICoqRFVNTVlfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQotewotICAgCSByZXR1cm4gKFNETF9SZWN0ICoqKSAtMTsKLX0KLQotU0RMX1N1cmZhY2UgKkRVTU1ZX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JaWYgKCB0aGlzLT5oaWRkZW4tPmJ1ZmZlciApIHsKLQkJU0RMX2ZyZWUoIHRoaXMtPmhpZGRlbi0+YnVmZmVyICk7Ci0JfQotCi0JdGhpcy0+aGlkZGVuLT5idWZmZXIgPSBTRExfbWFsbG9jKHdpZHRoICogaGVpZ2h0ICogKGJwcCAvIDgpKTsKLQlpZiAoICEgdGhpcy0+aGlkZGVuLT5idWZmZXIgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgYnVmZmVyIGZvciByZXF1ZXN0ZWQgbW9kZSIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0vKiAJcHJpbnRmKCJTZXR0aW5nIG1vZGUgJWR4JWRcbiIsIHdpZHRoLCBoZWlnaHQpOyAqLwotCi0JU0RMX21lbXNldCh0aGlzLT5oaWRkZW4tPmJ1ZmZlciwgMCwgd2lkdGggKiBoZWlnaHQgKiAoYnBwIC8gOCkpOwotCi0JLyogQWxsb2NhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHRoZSBzY3JlZW4gKi8KLQlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgYnBwLCAwLCAwLCAwLCAwKSApIHsKLQkJU0RMX2ZyZWUodGhpcy0+aGlkZGVuLT5idWZmZXIpOwotCQl0aGlzLT5oaWRkZW4tPmJ1ZmZlciA9IE5VTEw7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgcmVxdWVzdGVkIG1vZGUiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KLQljdXJyZW50LT5mbGFncyA9IGZsYWdzICYgU0RMX0ZVTExTQ1JFRU47Ci0JdGhpcy0+aGlkZGVuLT53ID0gY3VycmVudC0+dyA9IHdpZHRoOwotCXRoaXMtPmhpZGRlbi0+aCA9IGN1cnJlbnQtPmggPSBoZWlnaHQ7Ci0JY3VycmVudC0+cGl0Y2ggPSBjdXJyZW50LT53ICogKGJwcCAvIDgpOwotCWN1cnJlbnQtPnBpeGVscyA9IHRoaXMtPmhpZGRlbi0+YnVmZmVyOwotCi0JLyogV2UncmUgZG9uZSAqLwotCXJldHVybihjdXJyZW50KTsKLX0KLQotLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KLXN0YXRpYyBpbnQgRFVNTVlfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigtMSk7Ci19Ci1zdGF0aWMgdm9pZCBEVU1NWV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm47Ci19Ci0KLS8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSBvbiBwYWdlIGZsaXBwZWQgZGlzcGxheXMgKi8KLXN0YXRpYyBpbnQgRFVNTVlfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgdm9pZCBEVU1NWV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgRFVNTVlfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCS8qIGRvIG5vdGhpbmcuICovCi19Ci0KLWludCBEVU1NWV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0JLyogZG8gbm90aGluZyBvZiBub3RlLiAqLwotCXJldHVybigxKTsKLX0KLQotLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCi0gICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCi0qLwotdm9pZCBEVU1NWV9WaWRlb1F1aXQoX1RISVMpCi17Ci0JaWYgKHRoaXMtPnNjcmVlbi0+cGl4ZWxzICE9IE5VTEwpCi0JewotCQlTRExfZnJlZSh0aGlzLT5zY3JlZW4tPnBpeGVscyk7Ci0JCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGx2aWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE1ZmY0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGx2aWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9udWxsdmlkZW9faAotI2RlZmluZSBfU0RMX251bGx2aWRlb19oCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi0KLXN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7Ci0gICAgaW50IHcsIGg7Ci0gICAgdm9pZCAqYnVmZmVyOwotfTsKLQotI2VuZGlmIC8qIF9TRExfbnVsbHZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZXBvYy9TRExfZXBvY2V2ZW50cy5jcHAgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2Vwb2MvU0RMX2Vwb2NldmVudHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU2OTQ1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZXBvYy9TRExfZXBvY2V2ZW50cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAgICBTRExfZXBvY2V2ZW50cy5jcHAKLSAgICBIYW5kbGUgdGhlIGV2ZW50IHN0cmVhbSwgY29udmVydGluZyBFcG9jIGV2ZW50cyBpbnRvIFNETCBldmVudHMKLQotICAgIEVwb2MgdmVyc2lvbiBieSBIYW5udSBWaWl0YWxhIChoYW5udS5qLnZpaXRhbGFAbWJuZXQuZmkpCi0qLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI3VuZGVmIE5VTEwKLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2tleXN5bS5oIgotI2luY2x1ZGUgIlNETF9rZXlib2FyZC5oIgotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLX07IC8qIGV4dGVybiAiQyIgKi8KLQotI2luY2x1ZGUgIlNETF9lcG9jdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfZXBvY2V2ZW50c19jLmgiCi0KLSNpbmNsdWRlIDxoYWwuaD4KLQotZXh0ZXJuICJDIiB7Ci0vKiBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBjb25zb2xlIHNjYW5jb2RlIHRvIGEgU0RMIGtleXN5bSAqLwotc3RhdGljIFNETEtleSBrZXltYXBbTUFYX1NDQU5DT0RFXTsKLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0pOwotfTsgLyogZXh0ZXJuICJDIiAqLwotCi1UQm9vbCBpc0N1cnNvclZpc2libGUgPSBFVHJ1ZTsKLQotaW50IEVQT0NfSGFuZGxlV3NFdmVudChfVEhJUywgY29uc3QgVFdzRXZlbnQmIGFXc0V2ZW50KQotewotICAgIGludCBwb3N0ZWQgPSAwOwotICAgIFNETF9rZXlzeW0ga2V5c3ltOwotCi0KLSAgICBzd2l0Y2ggKGFXc0V2ZW50LlR5cGUoKSkgewotICAgIAotICAgIGNhc2UgRUV2ZW50UG9pbnRlcjogLyogTW91c2UgcG9pbnRlciBldmVudHMgKi8KLSAgICB7Ci0gICAgICAgIGNvbnN0IFRQb2ludGVyRXZlbnQqIHBvaW50ZXJFdmVudCA9IGFXc0V2ZW50LlBvaW50ZXIoKTsKLSAgICAgICAgVFBvaW50IG1vdXNlUG9zID0gcG9pbnRlckV2ZW50LT5pUG9zaXRpb247Ci0KLSAgICAgICAgLy9TRExfVFJBQ0UxKCJTREw6IEVQT0NfSGFuZGxlV3NFdmVudCwgcG9pbnRlckV2ZW50LT5pVHlwZT0lZCIsIHBvaW50ZXJFdmVudC0+aVR5cGUpOyAvLyEhCi0KLSAgICAgICAgaWYgKFByaXZhdGUtPkVQT0NfU2hyaW5rZWRIZWlnaHQpIHsKLSAgICAgICAgICAgIG1vdXNlUG9zLmlZIDw8PSAxOyAvKiBTY2FsZSB5IGNvb3JkaW5hdGUgdG8gc2hyaW5rZWQgc2NyZWVuIGhlaWdodCAqLwotICAgICAgICB9Ci0JCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIG1vdXNlUG9zLmlYLCBtb3VzZVBvcy5pWSk7IC8qIEFic29sdXRlIHBvc2l0aW9uIG9uIHNjcmVlbiAqLwotICAgICAgICBpZiAocG9pbnRlckV2ZW50LT5pVHlwZT09VFBvaW50ZXJFdmVudDo6RUJ1dHRvbjFEb3duKSB7Ci0gICAgICAgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgU0RMX0JVVFRPTl9MRUZULCAwLCAwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwb2ludGVyRXZlbnQtPmlUeXBlPT1UUG9pbnRlckV2ZW50OjpFQnV0dG9uMVVwKSB7Ci0JCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIFNETF9CVVRUT05fTEVGVCwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocG9pbnRlckV2ZW50LT5pVHlwZT09VFBvaW50ZXJFdmVudDo6RUJ1dHRvbjJEb3duKSB7Ci0gICAgICAgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgU0RMX0JVVFRPTl9SSUdIVCwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocG9pbnRlckV2ZW50LT5pVHlwZT09VFBvaW50ZXJFdmVudDo6RUJ1dHRvbjJVcCkgewotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBTRExfQlVUVE9OX1JJR0hULCAwLCAwKTsKLSAgICAgICAgfQotCSAgICAvLyEhcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsIFRyYW5zbGF0ZUtleShhV3NFdmVudC5LZXkoKS0+aVNjYW5Db2RlLCAma2V5c3ltKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICBjYXNlIEVFdmVudEtleURvd246IC8qIEtleSBldmVudHMgKi8KLSAgICB7Ci0gICAgICAgKHZvaWQqKVRyYW5zbGF0ZUtleShhV3NFdmVudC5LZXkoKS0+aVNjYW5Db2RlLCAma2V5c3ltKTsKLSAgICAgICAgCi0gICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgKi8KLSAgICAgICAgc3dpdGNoKChpbnQpa2V5c3ltLnN5bSkgewotICAgICAgICBjYXNlIFNETEtfQ0FQU0xPQ0s6Ci0gICAgICAgICAgICBpZiAoIWlzQ3Vyc29yVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIC8qIEVuYWJsZSB2aXJ0dWFsIGN1cnNvciAqLwotCSAgICAgICAgICAgIEhBTDo6U2V0KEhBTDo6RU1vdXNlU3RhdGUsIEhBTDo6RU1vdXNlU3RhdGVfVmlzaWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHZpcnR1YWwgY3Vyc29yICovCi0gICAgICAgICAgICAgICAgSEFMOjpTZXQoSEFMOjpFTW91c2VTdGF0ZSwgSEFMOjpFTW91c2VTdGF0ZV9JbnZpc2libGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXNDdXJzb3JWaXNpYmxlID0gIWlzQ3Vyc29yVmlzaWJsZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIAotCSAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgJmtleXN5bSk7Ci0gICAgICAgIGJyZWFrOwotCX0gCi0KLSAgICBjYXNlIEVFdmVudEtleVVwOiAvKiBLZXkgZXZlbnRzICovCi0gICAgewotCSAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsIFRyYW5zbGF0ZUtleShhV3NFdmVudC5LZXkoKS0+aVNjYW5Db2RlLCAma2V5c3ltKSk7Ci0gICAgICAgIGJyZWFrOwotCX0gCi0gICAgCi0gICAgY2FzZSBFRXZlbnRGb2N1c0dhaW5lZDogLyogU0RMIHdpbmRvdyBnb3QgZm9jdXMgKi8KLSAgICB7Ci0gICAgICAgIC8vUHJpdmF0ZS0+RVBPQ19Jc1dpbmRvd0ZvY3VzZWQgPSBFVHJ1ZTsKLSAgICAgICAgLyogRHJhdyB3aW5kb3cgYmFja2dyb3VuZCBhbmQgc2NyZWVuIGJ1ZmZlciAqLwotICAgICAgICBSZWRyYXdXaW5kb3dMKF90aGlzKTsgIAotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEVFdmVudEZvY3VzTG9zdDogLyogU0RMIHdpbmRvdyBsb3N0IGZvY3VzICovCi0gICAgewotICAgICAgICAvL1ByaXZhdGUtPkVQT0NfSXNXaW5kb3dGb2N1c2VkID0gRUZhbHNlOwotCi0gICAgICAgIC8vIFdhaXQgYW5kIGVhdCBldmVudHMgdW50aWwgZm9jdXMgaXMgZ2FpbmVkIGFnYWluCi0gICAgICAgIC8qCi0JICAgIHdoaWxlIChFVHJ1ZSkgewotICAgICAgICAgICAgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uRXZlbnRSZWFkeSgmUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50U3RhdHVzKTsKLSAgICAgICAgICAgIFVzZXI6OldhaXRGb3JSZXF1ZXN0KFByaXZhdGUtPkVQT0NfV3NFdmVudFN0YXR1cyk7Ci0JCSAgICBQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5HZXRFdmVudChQcml2YXRlLT5FUE9DX1dzRXZlbnQpOwotICAgICAgICAgICAgVEludCBldmVudFR5cGUgPSBQcml2YXRlLT5FUE9DX1dzRXZlbnQuVHlwZSgpOwotCQkgICAgUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50U3RhdHVzID0gS1JlcXVlc3RQZW5kaW5nOwotCQkgICAgLy9Qcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5FdmVudFJlYWR5KCZQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMpOwotICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBFRXZlbnRGb2N1c0dhaW5lZCkgewotICAgICAgICAgICAgICAgIFJlZHJhd1dpbmRvd0woX3RoaXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCSAgICB9Ci0gICAgICAgICovCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgRUV2ZW50TW9kaWZpZXJzQ2hhbmdlZDogCi0gICAgewotCSAgICBUTW9kaWZpZXJzQ2hhbmdlZEV2ZW50KiBtb2RFdmVudCA9IGFXc0V2ZW50Lk1vZGlmaWVyc0NoYW5nZWQoKTsKLSAgICAgICAgVFVpbnQgbW9kc3RhdGUgPSBLTU9EX05PTkU7Ci0gICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJMZWZ0U2hpZnQpCi0gICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX0xTSElGVDsKLSAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllclJpZ2h0U2hpZnQpCi0gICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX1JTSElGVDsKLSAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllckxlZnRDdHJsKQotICAgICAgICAgICAgbW9kc3RhdGUgfD0gS01PRF9MQ1RSTDsKLSAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllclJpZ2h0Q3RybCkKLSAgICAgICAgICAgIG1vZHN0YXRlIHw9IEtNT0RfUkNUUkw7Ci0gICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJMZWZ0QWx0KQotICAgICAgICAgICAgbW9kc3RhdGUgfD0gS01PRF9MQUxUOwotICAgICAgICBpZiAobW9kRXZlbnQtPmlNb2RpZmllcnMgPT0gRU1vZGlmaWVyUmlnaHRBbHQpCi0gICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX1JBTFQ7Ci0gICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJMZWZ0RnVuYykKLSAgICAgICAgICAgIG1vZHN0YXRlIHw9IEtNT0RfTE1FVEE7Ci0gICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJSaWdodEZ1bmMpCi0gICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX1JNRVRBOwotICAgICAgICBpZiAobW9kRXZlbnQtPmlNb2RpZmllcnMgPT0gRU1vZGlmaWVyQ2Fwc0xvY2spCi0gICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX0NBUFM7Ci0gICAgICAgIFNETF9TZXRNb2RTdGF0ZShTVEFUSUNfQ0FTVChTRExNb2QsKG1vZHN0YXRlIHwgS01PRF9MU0hJRlQpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OiAgICAgICAgICAgIAotICAgICAgICBicmVhazsKLQl9IAotCQotICAgIHJldHVybiBwb3N0ZWQ7Ci19Ci0KLWV4dGVybiAiQyIgewotCi12b2lkIEVQT0NfUHVtcEV2ZW50cyhfVEhJUykKLXsKLSAgICBpbnQgcG9zdGVkID0gMDsgLy8gISEgRG8gd2UgbmVlZCB0aGlzPwotICAgIC8vUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uRXZlbnRSZWFkeSgmUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50U3RhdHVzKTsKLQl3aGlsZSAoUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50U3RhdHVzICE9IEtSZXF1ZXN0UGVuZGluZykgewotCi0JCVByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkdldEV2ZW50KFByaXZhdGUtPkVQT0NfV3NFdmVudCk7Ci0JCXBvc3RlZCA9IEVQT0NfSGFuZGxlV3NFdmVudChfdGhpcywgUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50KTsKLQkJUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50U3RhdHVzID0gS1JlcXVlc3RQZW5kaW5nOwotCQlQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5FdmVudFJlYWR5KCZQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMpOwotCX0KLX0KLQotCi12b2lkIEVQT0NfSW5pdE9TS2V5bWFwKF9USElTKQotewotCWludCBpOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUga2V5IHRyYW5zbGF0aW9uIHRhYmxlICovCi0JZm9yICggaT0wOyBpPFNETF9UQUJMRVNJWkUoa2V5bWFwKTsgKytpICkKLQkJa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOwotCi0KLQkvKiBOdW1iZXJzICovCi0JZm9yICggaSA9IDA7IGk8MzI7ICsraSApewotCQlrZXltYXBbJyAnICsgaV0gPSAoU0RMS2V5KShTRExLX1NQQUNFK2kpOwotCX0KLQkvKiBlLmcuIEFscGhhYmV0IGtleXMgKi8KLQlmb3IgKCBpID0gMDsgaTwzMjsgKytpICl7Ci0JCWtleW1hcFsnQScgKyBpXSA9IChTRExLZXkpKFNETEtfYStpKTsKLQl9Ci0KLQlrZXltYXBbRVN0ZEtleUJhY2tzcGFjZV0gICAgPSBTRExLX0JBQ0tTUEFDRTsKLQlrZXltYXBbRVN0ZEtleVRhYl0gICAgICAgICAgPSBTRExLX1RBQjsKLQlrZXltYXBbRVN0ZEtleUVudGVyXSAgICAgICAgPSBTRExLX1JFVFVSTjsKLQlrZXltYXBbRVN0ZEtleUVzY2FwZV0gICAgICAgPSBTRExLX0VTQ0FQRTsKLSAgIAlrZXltYXBbRVN0ZEtleVNwYWNlXSAgICAgICAgPSBTRExLX1NQQUNFOwotICAgCWtleW1hcFtFU3RkS2V5UGF1c2VdICAgICAgICA9IFNETEtfUEFVU0U7Ci0gICAJa2V5bWFwW0VTdGRLZXlIb21lXSAgICAgICAgID0gU0RMS19IT01FOwotICAgCWtleW1hcFtFU3RkS2V5RW5kXSAgICAgICAgICA9IFNETEtfRU5EOwotICAgCWtleW1hcFtFU3RkS2V5UGFnZVVwXSAgICAgICA9IFNETEtfUEFHRVVQOwotICAgCWtleW1hcFtFU3RkS2V5UGFnZURvd25dICAgICA9IFNETEtfUEFHRURPV047Ci0Ja2V5bWFwW0VTdGRLZXlEZWxldGVdICAgICAgID0gU0RMS19ERUxFVEU7Ci0Ja2V5bWFwW0VTdGRLZXlVcEFycm93XSAgICAgID0gU0RMS19VUDsKLQlrZXltYXBbRVN0ZEtleURvd25BcnJvd10gICAgPSBTRExLX0RPV047Ci0Ja2V5bWFwW0VTdGRLZXlMZWZ0QXJyb3ddICAgID0gU0RMS19MRUZUOwotCWtleW1hcFtFU3RkS2V5UmlnaHRBcnJvd10gICA9IFNETEtfUklHSFQ7Ci0Ja2V5bWFwW0VTdGRLZXlDYXBzTG9ja10gICAgID0gU0RMS19DQVBTTE9DSzsKLQlrZXltYXBbRVN0ZEtleUxlZnRTaGlmdF0gICAgPSBTRExLX0xTSElGVDsKLQlrZXltYXBbRVN0ZEtleVJpZ2h0U2hpZnRdICAgPSBTRExLX1JTSElGVDsKLQlrZXltYXBbRVN0ZEtleUxlZnRBbHRdICAgICAgPSBTRExLX0xBTFQ7Ci0Ja2V5bWFwW0VTdGRLZXlSaWdodEFsdF0gICAgID0gU0RMS19SQUxUOwotCWtleW1hcFtFU3RkS2V5TGVmdEN0cmxdICAgICA9IFNETEtfTENUUkw7Ci0Ja2V5bWFwW0VTdGRLZXlSaWdodEN0cmxdICAgID0gU0RMS19SQ1RSTDsKLQlrZXltYXBbRVN0ZEtleUxlZnRGdW5jXSAgICAgPSBTRExLX0xNRVRBOwotCWtleW1hcFtFU3RkS2V5UmlnaHRGdW5jXSAgICA9IFNETEtfUk1FVEE7Ci0Ja2V5bWFwW0VTdGRLZXlJbnNlcnRdICAgICAgID0gU0RMS19JTlNFUlQ7Ci0Ja2V5bWFwW0VTdGRLZXlDb21tYV0gICAgICAgID0gU0RMS19DT01NQTsKLQlrZXltYXBbRVN0ZEtleUZ1bGxTdG9wXSAgICAgPSBTRExLX1BFUklPRDsKLQlrZXltYXBbRVN0ZEtleUZvcndhcmRTbGFzaF0gPSBTRExLX1NMQVNIOwotCWtleW1hcFtFU3RkS2V5QmFja1NsYXNoXSAgICA9IFNETEtfQkFDS1NMQVNIOwotCWtleW1hcFtFU3RkS2V5U2VtaUNvbG9uXSAgICA9IFNETEtfU0VNSUNPTE9OOwotCWtleW1hcFtFU3RkS2V5U2luZ2xlUXVvdGVdICA9IFNETEtfUVVPVEU7Ci0Ja2V5bWFwW0VTdGRLZXlIYXNoXSAgICAgICAgID0gU0RMS19IQVNIOwotCWtleW1hcFtFU3RkS2V5U3F1YXJlQnJhY2tldExlZnRdICAgID0gU0RMS19MRUZUQlJBQ0tFVDsKLQlrZXltYXBbRVN0ZEtleVNxdWFyZUJyYWNrZXRSaWdodF0gICA9IFNETEtfUklHSFRCUkFDS0VUOwotCWtleW1hcFtFU3RkS2V5TWludXNdICAgICAgICA9IFNETEtfTUlOVVM7Ci0Ja2V5bWFwW0VTdGRLZXlFcXVhbHNdICAgICAgID0gU0RMS19FUVVBTFM7Ci0KLSAgIAlrZXltYXBbRVN0ZEtleUYxXSAgICAgICAgICA9IFNETEtfRjE7ICAvKiBjaHIgKyBxICovCi0gICAJa2V5bWFwW0VTdGRLZXlGMl0gICAgICAgICAgPSBTRExLX0YyOyAgLyogY2hyICsgdyAqLwotICAgCWtleW1hcFtFU3RkS2V5RjNdICAgICAgICAgID0gU0RMS19GMzsgIC8qIGNociArIGUgKi8KLSAgIAlrZXltYXBbRVN0ZEtleUY0XSAgICAgICAgICA9IFNETEtfRjQ7ICAvKiBjaHIgKyByICovCi0gICAJa2V5bWFwW0VTdGRLZXlGNV0gICAgICAgICAgPSBTRExLX0Y1OyAgLyogY2hyICsgdCAqLwotICAgCWtleW1hcFtFU3RkS2V5RjZdICAgICAgICAgID0gU0RMS19GNjsgIC8qIGNociArIHkgKi8KLSAgIAlrZXltYXBbRVN0ZEtleUY3XSAgICAgICAgICA9IFNETEtfRjc7ICAvKiBjaHIgKyBpICovCi0gICAJa2V5bWFwW0VTdGRLZXlGOF0gICAgICAgICAgPSBTRExLX0Y4OyAgLyogY2hyICsgbyAqLwotCi0gICAJa2V5bWFwW0VTdGRLZXlGOV0gICAgICAgICAgPSBTRExLX0Y5OyAgLyogY2hyICsgYSAqLwotICAgCWtleW1hcFtFU3RkS2V5RjEwXSAgICAgICAgID0gU0RMS19GMTA7IC8qIGNociArIHMgKi8KLSAgIAlrZXltYXBbRVN0ZEtleUYxMV0gICAgICAgICA9IFNETEtfRjExOyAvKiBjaHIgKyBkICovCi0gICAJa2V5bWFwW0VTdGRLZXlGMTJdICAgICAgICAgPSBTRExLX0YxMjsgLyogY2hyICsgZiAqLwotCi0gICAgLyogISFUT0RPCi0JRVN0ZEtleU51bUxvY2s9MHgxYiwKLQlFU3RkS2V5U2Nyb2xsTG9jaz0weDFjLAotCi0JRVN0ZEtleU5rcEZvcndhcmRTbGFzaD0weDg0LAotCUVTdGRLZXlOa3BBc3Rlcmlzaz0weDg1LAotCUVTdGRLZXlOa3BNaW51cz0weDg2LAotCUVTdGRLZXlOa3BQbHVzPTB4ODcsCi0JRVN0ZEtleU5rcEVudGVyPTB4ODgsCi0JRVN0ZEtleU5rcDE9MHg4OSwKLQlFU3RkS2V5TmtwMj0weDhhLAotCUVTdGRLZXlOa3AzPTB4OGIsCi0JRVN0ZEtleU5rcDQ9MHg4YywKLQlFU3RkS2V5TmtwNT0weDhkLAotCUVTdGRLZXlOa3A2PTB4OGUsCi0JRVN0ZEtleU5rcDc9MHg4ZiwKLQlFU3RkS2V5TmtwOD0weDkwLAotCUVTdGRLZXlOa3A5PTB4OTEsCi0JRVN0ZEtleU5rcDA9MHg5MiwKLQlFU3RkS2V5TmtwRnVsbFN0b3A9MHg5MywKLSAgICBFU3RkS2V5TWVudT0weDk0LAotICAgIEVTdGRLZXlCYWNrbGlnaHRPbj0weDk1LAotICAgIEVTdGRLZXlCYWNrbGlnaHRPZmY9MHg5NiwKLSAgICBFU3RkS2V5QmFja2xpZ2h0VG9nZ2xlPTB4OTcsCi0gICAgRVN0ZEtleUluY0NvbnRyYXN0PTB4OTgsCi0gICAgRVN0ZEtleURlY0NvbnRyYXN0PTB4OTksCi0gICAgRVN0ZEtleVNsaWRlckRvd249MHg5YSwKLSAgICBFU3RkS2V5U2xpZGVyVXA9MHg5YiwKLSAgICBFU3RkS2V5RGljdGFwaG9uZVBsYXk9MHg5YywKLSAgICBFU3RkS2V5RGljdGFwaG9uZVN0b3A9MHg5ZCwKLSAgICBFU3RkS2V5RGljdGFwaG9uZVJlY29yZD0weDllLAotICAgIEVTdGRLZXlIZWxwPTB4OWYsCi0gICAgRVN0ZEtleU9mZj0weGEwLAotICAgIEVTdGRLZXlEaWFsPTB4YTEsCi0gICAgRVN0ZEtleUluY1ZvbHVtZT0weGEyLAotICAgIEVTdGRLZXlEZWNWb2x1bWU9MHhhMywKLSAgICBFU3RkS2V5RGV2aWNlMD0weGE0LAotICAgIEVTdGRLZXlEZXZpY2UxPTB4YTUsCi0gICAgRVN0ZEtleURldmljZTI9MHhhNiwKLSAgICBFU3RkS2V5RGV2aWNlMz0weGE3LAotICAgIEVTdGRLZXlEZXZpY2U0PTB4YTgsCi0gICAgRVN0ZEtleURldmljZTU9MHhhOSwKLSAgICBFU3RkS2V5RGV2aWNlNj0weGFhLAotICAgIEVTdGRLZXlEZXZpY2U3PTB4YWIsCi0gICAgRVN0ZEtleURldmljZTg9MHhhYywKLSAgICBFU3RkS2V5RGV2aWNlOT0weGFkLAotICAgIEVTdGRLZXlEZXZpY2VBPTB4YWUsCi0gICAgRVN0ZEtleURldmljZUI9MHhhZiwKLSAgICBFU3RkS2V5RGV2aWNlQz0weGIwLAotICAgIEVTdGRLZXlEZXZpY2VEPTB4YjEsCi0gICAgRVN0ZEtleURldmljZUU9MHhiMiwKLSAgICBFU3RkS2V5RGV2aWNlRj0weGIzLAotICAgIEVTdGRLZXlBcHBsaWNhdGlvbjA9MHhiNCwKLSAgICBFU3RkS2V5QXBwbGljYXRpb24xPTB4YjUsCi0gICAgRVN0ZEtleUFwcGxpY2F0aW9uMj0weGI2LAotICAgIEVTdGRLZXlBcHBsaWNhdGlvbjM9MHhiNywKLSAgICBFU3RkS2V5QXBwbGljYXRpb240PTB4YjgsCi0gICAgRVN0ZEtleUFwcGxpY2F0aW9uNT0weGI5LAotICAgIEVTdGRLZXlBcHBsaWNhdGlvbjY9MHhiYSwKLSAgICBFU3RkS2V5QXBwbGljYXRpb243PTB4YmIsCi0gICAgRVN0ZEtleUFwcGxpY2F0aW9uOD0weGJjLAotICAgIEVTdGRLZXlBcHBsaWNhdGlvbjk9MHhiZCwKLSAgICBFU3RkS2V5QXBwbGljYXRpb25BPTB4YmUsCi0gICAgRVN0ZEtleUFwcGxpY2F0aW9uQj0weGJmLAotICAgIEVTdGRLZXlBcHBsaWNhdGlvbkM9MHhjMCwKLSAgICBFU3RkS2V5QXBwbGljYXRpb25EPTB4YzEsCi0gICAgRVN0ZEtleUFwcGxpY2F0aW9uRT0weGMyLAotICAgIEVTdGRLZXlBcHBsaWNhdGlvbkY9MHhjMywKLSAgICBFU3RkS2V5WWVzPTB4YzQsCi0gICAgRVN0ZEtleU5vPTB4YzUsCi0gICAgRVN0ZEtleUluY0JyaWdodG5lc3M9MHhjNiwKLSAgICBFU3RkS2V5RGVjQnJpZ2h0bmVzcz0weGM3LCAKLSAgICBFU3RkS2V5Q2FzZU9wZW49MHhjOCwKLSAgICBFU3RkS2V5Q2FzZUNsb3NlPTB4YzkKLSAgICAqLwotCi19Ci0KLQotCi1zdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQotewotICAgIGNoYXIgZGVidWdbMjU2XTsKLSAgICAvL1NETF9UUkFDRTEoIlNETDogVHJhbnNsYXRlS2V5LCBzY2FuY29kZT0lZCIsIHNjYW5jb2RlKTsgLy8hIQotCi0JLyogU2V0IHRoZSBrZXlzeW0gaW5mb3JtYXRpb24gKi8gCi0KLQlrZXlzeW0tPnNjYW5jb2RlID0gc2NhbmNvZGU7Ci0KLSAgICBpZiAoKHNjYW5jb2RlID49IE1BWF9TQ0FOQ09ERSkgJiYgCi0gICAgICAgICgoc2NhbmNvZGUgLSBFTm9uQ2hhcmFjdGVyS2V5QmFzZSArIDB4MDA4MSkgPj0gTUFYX1NDQU5DT0RFKSkgewotICAgICAgICBTRExfU2V0RXJyb3IoIlRvbyBiaWcgc2NhbmNvZGUiKTsKLSAgICAgICAga2V5c3ltLT5zY2FuY29kZSA9IFNETEtfVU5LTk9XTjsKLQkgICAga2V5c3ltLT5tb2QgPSBLTU9EX05PTkU7IAotICAgICAgICByZXR1cm4ga2V5c3ltOwotICAgIH0KLQotCWtleXN5bS0+bW9kID0gU0RMX0dldE1vZFN0YXRlKCk7IC8vISFJcyB0aGlzIHJpZ2h0Pz8KLQotICAgIC8qIEhhbmRsZSBmdW5jdGlvbiBrZXlzOiBGMSwgRjIsIEYzIC4uLiAqLwotICAgIGlmIChrZXlzeW0tPm1vZCAmIEtNT0RfTUVUQSkgewotICAgICAgICBpZiAoc2NhbmNvZGUgPj0gJ0EnICYmIHNjYW5jb2RlIDwgKCdBJyArIDI0KSkgeyAvKiBmaXJzdCAzMiBhbHBoYXBldCBrZXlzICovCi0gICAgICAgICAgICBzd2l0Y2goc2NhbmNvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdRJzogc2NhbmNvZGUgPSBFU3RkS2V5RjE7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ1cnOiBzY2FuY29kZSA9IEVTdGRLZXlGMjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnRSc6IHNjYW5jb2RlID0gRVN0ZEtleUYzOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdSJzogc2NhbmNvZGUgPSBFU3RkS2V5RjQ7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ1QnOiBzY2FuY29kZSA9IEVTdGRLZXlGNTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnWSc6IHNjYW5jb2RlID0gRVN0ZEtleUY2OyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdVJzogc2NhbmNvZGUgPSBFU3RkS2V5Rjc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ0knOiBzY2FuY29kZSA9IEVTdGRLZXlGODsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnQSc6IHNjYW5jb2RlID0gRVN0ZEtleUY5OyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdTJzogc2NhbmNvZGUgPSBFU3RkS2V5RjEwOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdEJzogc2NhbmNvZGUgPSBFU3RkS2V5RjExOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdGJzogc2NhbmNvZGUgPSBFU3RkS2V5RjEyOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzY2FuY29kZSA+PSBFTm9uQ2hhcmFjdGVyS2V5QmFzZSkgewotICAgICAgICAvLyBOb24gY2hhcmFjdGVyIGtleXMKLQkgICAga2V5c3ltLT5zeW0gPSBrZXltYXBbc2NhbmNvZGUgLSAKLSAgICAgICAgICAgIEVOb25DaGFyYWN0ZXJLZXlCYXNlICsgMHgwMDgxXTsgLy8gISFoYXJkIGNvZGVkCi0gICAgfSBlbHNlIHsKLQkgICAga2V5c3ltLT5zeW0gPSBrZXltYXBbc2NhbmNvZGVdOwotICAgIH0KLQotCi0JLyogSWYgVU5JQ09ERSBpcyBvbiwgZ2V0IHRoZSBVTklDT0RFIHZhbHVlIGZvciB0aGUga2V5ICovCi0Ja2V5c3ltLT51bmljb2RlID0gMDsKLQotI2lmIDAgLy8gISFUT0RPOnVuaWNvZGUKLQotCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSAKLSAgICB7Ci0JCS8qIFBvcHVsYXRlIHRoZSB1bmljb2RlIGZpZWxkIHdpdGggdGhlIEFTQ0lJIHZhbHVlICovCi0JCWtleXN5bS0+dW5pY29kZSA9IHNjYW5jb2RlOwotCX0KLSNlbmRpZgotCi0gICAgLy8hIQotICAgIC8vc3ByaW50ZihkZWJ1ZywgIlNETDogVHJhbnNsYXRlS2V5OiBrZXlzeW0tPnNjYW5jb2RlPSVkLCBrZXlzeW0tPnN5bT0lZCwga2V5c3ltLT5tb2Q9JWQiLAotICAgIC8vICAgIGtleXN5bS0+c2NhbmNvZGUsIGtleXN5bS0+c3ltLCBrZXlzeW0tPm1vZCk7Ci0gICAgLy9TRExfVFJBQ0UoZGVidWcpOyAvLyEhCi0KLQlyZXR1cm4oa2V5c3ltKTsKLX0KLQotfTsgLyogZXh0ZXJuICJDIiAqLwotCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZXBvYy9TRExfZXBvY2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2Vwb2MvU0RMX2Vwb2NldmVudHNfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDU1YzE1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZXBvYy9TRExfZXBvY2V2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAgICBTRExfZXBvY2V2ZW50c19jLmgKLSAgICBIYW5kbGUgdGhlIGV2ZW50IHN0cmVhbSwgY29udmVydGluZyBFcG9jIGV2ZW50cyBpbnRvIFNETCBldmVudHMKLQotICAgIEVwb2MgdmVyc2lvbiBieSBIYW5udSBWaWl0YWxhIChoYW5udS5qLnZpaXRhbGFAbWJuZXQuZmkpCi0qLwotCi0KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotfTsKLQotI2RlZmluZSBNQVhfU0NBTkNPREUgMjU1Ci0KLS8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFNETF9zeXNldmVudHMuYyB0byBvdGhlciBwYXJ0cyAKLSAgIG9mIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIChTRExfc3lzdmlkZW8uYykKLSovCi0KLWV4dGVybiAiQyIgewotZXh0ZXJuIHZvaWQgRVBPQ19Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgRVBPQ19QdW1wRXZlbnRzKF9USElTKTsKLX07Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZXBvYy9TRExfZXBvY3ZpZGVvLmNwcCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZXBvYy9TRExfZXBvY3ZpZGVvLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5NGY0Ni4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2Vwb2MvU0RMX2Vwb2N2aWRlby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OTcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAgICBTRExfZXBvY3ZpZGVvLmNwcAotICAgIEVwb2MgYmFzZWQgU0RMIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbgotCi0gICAgRXBvYyB2ZXJzaW9uIGJ5IEhhbm51IFZpaXRhbGEgKGhhbm51LmoudmlpdGFsYUBtYm5ldC5maSkKLSovCi0KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI3VuZGVmIE5VTEwKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLX07Ci0KLSNpbmNsdWRlICJTRExfZXBvY3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2Vwb2NldmVudHNfYy5oIgotCi0jaW5jbHVkZSA8aGFsLmg+Ci0jaW5jbHVkZSA8Y29lZGVmLmg+Ci0KLS8qIEZvciBkZWJ1Z2dpbmcgKi8KLQotdm9pZCBSRGVidWdfUHJpbnRfYihjaGFyKiBlcnJvcl9zdHIsIHZvaWQqIHBhcmFtKQotICAgIHsKLSAgICBUQnVmODwxMjg+IGVycm9yOCgoVFVpbnQ4KillcnJvcl9zdHIpOwotICAgIFRCdWY8MTI4PiBlcnJvcjsKLSAgICBlcnJvci5Db3B5KGVycm9yOCk7Ci0gICAgaWYgKHBhcmFtKSAvLyEhIERvIG5vdCB3b3JrIGlmIHRoZSBwYXJhbWV0ZXIgaXMgcmVhbGx5IDAhIQotICAgICAgICBSRGVidWc6OlByaW50KGVycm9yLCBwYXJhbSk7Ci0gICAgZWxzZSAKLSAgICAgICAgUkRlYnVnOjpQcmludChlcnJvcik7Ci0gICAgfQotCi1leHRlcm4gIkMiIHZvaWQgUkRlYnVnX1ByaW50KGNoYXIqIGVycm9yX3N0ciwgdm9pZCogcGFyYW0pCi0gICAgewotICAgIFJEZWJ1Z19QcmludF9iKGVycm9yX3N0ciwgcGFyYW0pOwotICAgIH0KLQotCi1pbnQgRGVidWdfQXZhaWxNZW0yKCkKLSAgICB7Ci0gICAgLy9Vc2VyOjpDb21wcmVzc0FsbEhlYXBzKCk7Ci0gICAgVE1lbW9yeUluZm9WMUJ1ZiBtZW1idWY7IAotICAgIFVzZXI6OkxlYXZlSWZFcnJvcihVc2VySGFsOjpNZW1vcnlJbmZvKG1lbWJ1ZikpOwotICAgIFRNZW1vcnlJbmZvVjEgbWluZm8gPSBtZW1idWYoKTsKLQlyZXR1cm4obWluZm8uaUZyZWVSYW1JbkJ5dGVzKTsKLSAgICB9Ci0KLWV4dGVybiAiQyIgaW50IERlYnVnX0F2YWlsTWVtKCkKLSAgICB7Ci0gICAgcmV0dXJuKERlYnVnX0F2YWlsTWVtMigpKTsKLSAgICB9Ci0KLQotZXh0ZXJuICJDIiB7Ci0KLS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEVQT0NfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOwotc3RhdGljIFNETF9SZWN0ICoqRVBPQ19MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIFNETF9TdXJmYWNlICpFUE9DX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgRVBPQ19TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywKLQkJCSAgU0RMX0NvbG9yICpjb2xvcnMpOwotc3RhdGljIHZvaWQgRVBPQ19WaWRlb1F1aXQoX1RISVMpOwotCi0vKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEVQT0NfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgRVBPQ19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IEVQT0NfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgRVBPQ19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIEVQT0NfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgRVBPQ19EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotc3RhdGljIGludCBFUE9DX0F2YWlsYWJsZSh2b2lkKTsKLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKkVQT0NfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCk7Ci0KLS8qIE1vdXNlIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgV01jdXJzb3IgKkVQT0NfQ3JlYXRlV01DdXJzb3IoX1RISVMsIFVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSk7Ci1zdGF0aWMgdm9pZCBFUE9DX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7Ci1zdGF0aWMgaW50IEVQT0NfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLQotCi0KLS8qICEhIFRhYmxlIGZvciBmYXN0IGNvbnZlcnNpb24gZnJvbSA4IGJpdCB0byAxMiBiaXQgKi8KLXN0YXRpYyBUVWludDE2IEVQT0NfSFdQYWxldHRlXzI1Nl90b180a1syNTZdOwotCi1WaWRlb0Jvb3RTdHJhcCBFUE9DX2Jvb3RzdHJhcCA9IHsKLQkiZXBvYyIsICJFUE9DIHN5c3RlbSIsCi0gICAgRVBPQ19BdmFpbGFibGUsIEVQT0NfQ3JlYXRlRGV2aWNlCi19OwotCi1jb25zdCBUVWludDMyIFdpbmRvd0NsaWVudEhhbmRsZSA9IDkyMTA7IC8vISEKLQotLyogRXBvYyB2aWRlbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEVQT0NfQXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIDE7IC8qIEFsd2F5cyBhdmFpbGFibGUgKi8KLX0KLQotc3RhdGljIHZvaWQgRVBPQ19EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKkVQT0NfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKLQotCS8qIEFsbG9jYXRlIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBmcmVlIG9uIGRlbGV0ZSAqLwotCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLQlpZiAoIGRldmljZSApIHsKLQkJU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOwotCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0JfQotCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIGRldmljZSApIHsKLQkJCVNETF9mcmVlKGRldmljZSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCWRldmljZS0+VmlkZW9Jbml0ID0gRVBPQ19WaWRlb0luaXQ7Ci0JZGV2aWNlLT5MaXN0TW9kZXMgPSBFUE9DX0xpc3RNb2RlczsKLQlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IEVQT0NfU2V0VmlkZW9Nb2RlOwotCWRldmljZS0+U2V0Q29sb3JzID0gRVBPQ19TZXRDb2xvcnM7Ci0JZGV2aWNlLT5VcGRhdGVSZWN0cyA9IE5VTEw7Ci0JZGV2aWNlLT5WaWRlb1F1aXQgPSBFUE9DX1ZpZGVvUXVpdDsKLQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gRVBPQ19BbGxvY0hXU3VyZmFjZTsKLQlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gTlVMTDsKLQlkZXZpY2UtPkZpbGxIV1JlY3QgPSBOVUxMOwotCWRldmljZS0+U2V0SFdDb2xvcktleSA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRIV0FscGhhID0gTlVMTDsKLQlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBFUE9DX0xvY2tIV1N1cmZhY2U7Ci0JZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBFUE9DX1VubG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBFUE9DX0ZsaXBIV1N1cmZhY2U7Ci0JZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gRVBPQ19GcmVlSFdTdXJmYWNlOwotCWRldmljZS0+U2V0SWNvbiA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKLQlkZXZpY2UtPkdldFdNSW5mbyA9IE5VTEw7Ci0JZGV2aWNlLT5GcmVlV01DdXJzb3IgPSBFUE9DX0ZyZWVXTUN1cnNvcjsKLQlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gRVBPQ19DcmVhdGVXTUN1cnNvcjsKLQlkZXZpY2UtPlNob3dXTUN1cnNvciA9IEVQT0NfU2hvd1dNQ3Vyc29yOwotCWRldmljZS0+V2FycFdNQ3Vyc29yID0gTlVMTDsKLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IEVQT0NfSW5pdE9TS2V5bWFwOwotCWRldmljZS0+UHVtcEV2ZW50cyA9IEVQT0NfUHVtcEV2ZW50czsKLQlkZXZpY2UtPmZyZWUgPSBFUE9DX0RlbGV0ZURldmljZTsKLQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLQotaW50IEdldEJwcChURGlzcGxheU1vZGUgZGlzcGxheW1vZGUpCi17Ci0gICAgVEludCBudW1Db2xvcnMgPSBURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVDb2xvcnMoZGlzcGxheW1vZGUpOwotICAgIFRJbnQgYml0c1BlclBpeGVsID0gMTsKLSAgICBmb3IgKFRJbnQzMiBpID0gMjsgaSA8IG51bUNvbG9yczsgaSA8PD0gMSwgYml0c1BlclBpeGVsKyspOwotICAgIHJldHVybiBiaXRzUGVyUGl4ZWw7ICAgIAotfQotCi12b2lkIENvbnN0cnVjdFdpbmRvd0woX1RISVMpCi17Ci0JVEludAllcnJvcjsKLQotCWVycm9yID0gUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uQ29ubmVjdCgpOwotCVVzZXI6OkxlYXZlSWZFcnJvcihlcnJvcik7Ci0JUHJpdmF0ZS0+RVBPQ19Xc1NjcmVlbj1uZXcoRUxlYXZlKSBDV3NTY3JlZW5EZXZpY2UoUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24pOwotCVVzZXI6OkxlYXZlSWZFcnJvcihQcml2YXRlLT5FUE9DX1dzU2NyZWVuLT5Db25zdHJ1Y3QoKSk7Ci0JVXNlcjo6TGVhdmVJZkVycm9yKFByaXZhdGUtPkVQT0NfV3NTY3JlZW4tPkNyZWF0ZUNvbnRleHQoUHJpdmF0ZS0+RVBPQ19XaW5kb3dHYykpOwotCi0JUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwPVJXaW5kb3dHcm91cChQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbik7Ci0JVXNlcjo6TGVhdmVJZkVycm9yKFByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cC5Db25zdHJ1Y3QoV2luZG93Q2xpZW50SGFuZGxlKSk7Ci0JUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwLlNldE9yZGluYWxQb3NpdGlvbigwKTsKLQotICAgIC8vISEKLSAgICBUQnVmPDMyPiB3aW5Hcm91cE5hbWU7Ci0gICAgd2luR3JvdXBOYW1lLkFwcGVuZCgwKTsKLSAgICB3aW5Hcm91cE5hbWUuQXBwZW5kKDApOwotICAgIHdpbkdyb3VwTmFtZS5BcHBlbmQoMCk7Ly8gdWlkCi0gICAgd2luR3JvdXBOYW1lLkFwcGVuZCgwKTsKLSAgICB3aW5Hcm91cE5hbWUuQXBwZW5kKF9MKCJTREwiKSk7IC8vIGNhcHRpb24KLSAgICB3aW5Hcm91cE5hbWUuQXBwZW5kKDApOwotICAgIHdpbkdyb3VwTmFtZS5BcHBlbmQoMCk7IC8vZG9jIG5hbWUKLQlQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAuU2V0TmFtZSh3aW5Hcm91cE5hbWUpOyAvLyEhCi0KLQlQcml2YXRlLT5FUE9DX1dzV2luZG93PVJXaW5kb3coUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24pOwotCVVzZXI6OkxlYXZlSWZFcnJvcihQcml2YXRlLT5FUE9DX1dzV2luZG93LkNvbnN0cnVjdChQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAsV2luZG93Q2xpZW50SGFuZGxlKSk7Ci0JUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5TZXRCYWNrZ3JvdW5kQ29sb3IoS1JnYldoaXRlKTsKLSAgICBQcml2YXRlLT5FUE9DX1dzV2luZG93LkFjdGl2YXRlKCk7Ci0JUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5TZXRTaXplKFByaXZhdGUtPkVQT0NfV3NTY3JlZW4tPlNpemVJblBpeGVscygpKTsgCi0JUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5TZXRWaXNpYmxlKEVUcnVlKTsKLQotICAgIFByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cElEID0gUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwLklkZW50aWZpZXIoKTsKLSAgICBQcml2YXRlLT5FUE9DX0lzV2luZG93Rm9jdXNlZCA9IEVGYWxzZTsKLX0KLQotCi1pbnQgRVBPQ19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLSAgICAvLyAhIVRPRE86aGFuZGxlIGxlYXZlIGZ1bmN0aW9ucyEKLQotICAgIGludCBpOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8gICAKLQotCWZvciAoIGk9MDsgaTxTRExfTlVNTU9ERVM7ICsraSApIHsKLQkJUHJpdmF0ZS0+U0RMX21vZGVsaXN0W2ldID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKLQkJUHJpdmF0ZS0+U0RMX21vZGVsaXN0W2ldLT54ID0gUHJpdmF0ZS0+U0RMX21vZGVsaXN0W2ldLT55ID0gMDsKLQl9Ci0JLyogTW9kZXMgc29ydGVkIGxhcmdlc3QgdG8gc21hbGxlc3QgISFUT0RPOnNvcnRpbmcgb3JkZXI/PyovCi0JUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdLT53ID0gNjQwOyBQcml2YXRlLT5TRExfbW9kZWxpc3RbMF0tPmggPSAyMDA7IAotCVByaXZhdGUtPlNETF9tb2RlbGlzdFsxXS0+dyA9IDMyMDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzFdLT5oID0gMjAwOwotCVByaXZhdGUtPlNETF9tb2RlbGlzdFsyXS0+dyA9IDY0MDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzJdLT5oID0gNDAwOyAKLQlQcml2YXRlLT5TRExfbW9kZWxpc3RbM10tPncgPSA2NDA7IFByaXZhdGUtPlNETF9tb2RlbGlzdFszXS0+aCA9IDQ4MDsKLQlQcml2YXRlLT5TRExfbW9kZWxpc3RbNF0gPSBOVUxMOwotCi0gICAgLyogQ29uc3RydWN0IEVwb2Mgd2luZG93ICovCi0KLSAgICBDb25zdHJ1Y3RXaW5kb3dMKF90aGlzKTsKLQotICAgIC8qIEluaXRpYWxpc2UgRXBvYyBmcmFtZSBidWZmZXIgKi8KLQotICAgIFREaXNwbGF5TW9kZSBkaXNwbGF5TW9kZSA9IFByaXZhdGUtPkVQT0NfV3NTY3JlZW4tPkRpc3BsYXlNb2RlKCk7Ci0KLSAgICAjaWZuZGVmIF9fV0lOU19fCi0KLSAgICBUU2NyZWVuSW5mb1YwMSBzY3JlZW5JbmZvOwotCVRQY2tnPFRTY3JlZW5JbmZvVjAxPiBzSW5mbyhzY3JlZW5JbmZvKTsKLQlVc2VyU3ZyOjpTY3JlZW5JbmZvKHNJbmZvKTsKLQotCVByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZQkJPSBzY3JlZW5JbmZvLmlTY3JlZW5TaXplOyAKLQlQcml2YXRlLT5FUE9DX0Rpc3BsYXlNb2RlCQk9IGRpc3BsYXlNb2RlOwotICAgIFByaXZhdGUtPkVQT0NfSGFzRnJhbWVCdWZmZXIJPSBzY3JlZW5JbmZvLmlTY3JlZW5BZGRyZXNzVmFsaWQ7Ci0JUHJpdmF0ZS0+RVBPQ19GcmFtZUJ1ZmZlcgkJPSBQcml2YXRlLT5FUE9DX0hhc0ZyYW1lQnVmZmVyID8gKFRVaW50OCopIHNjcmVlbkluZm8uaVNjcmVlbkFkZHJlc3MgOiBOVUxMOwotCVByaXZhdGUtPkVQT0NfQnl0ZXNQZXJQaXhlbAkgICAgPSAoKEdldEJwcChkaXNwbGF5TW9kZSktMSkgLyA4KSArIDE7Ci0JUHJpdmF0ZS0+RVBPQ19CeXRlc1BlclNjYW5MaW5lCT0gc2NyZWVuSW5mby5pU2NyZWVuU2l6ZS5pV2lkdGggKiBQcml2YXRlLT5FUE9DX0J5dGVzUGVyUGl4ZWw7Ci0KLSAgICAvKiBJdCBzZWVtcyB0aGF0IGluIFNBMTEwMCBtYWNoaW5lcyBmb3IgOGJwcCBkaXNwbGF5cyB0aGVyZSBpcyBhIDUxMiBwYWxldHRlIHRhYmxlIGF0IHRoZSAKLSAgICAgKiBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lIGJ1ZmZlci4gRS5nLiBTZXJpZXMgNyBhbmQgTmV0Ym9vay4KLSAgICAgKiBJbiAxMiBicHAgbWFjaGluZXMgdGhlIHRhYmxlIGhhcyAxNiBlbnRyaWVzLgotCSAqLwotCWlmIChQcml2YXRlLT5FUE9DX0hhc0ZyYW1lQnVmZmVyICYmIEdldEJwcChkaXNwbGF5TW9kZSkgPT0gOCkKLQkJUHJpdmF0ZS0+RVBPQ19GcmFtZUJ1ZmZlciArPSA1MTI7Ci0JaWYgKFByaXZhdGUtPkVQT0NfSGFzRnJhbWVCdWZmZXIgJiYgR2V0QnBwKGRpc3BsYXlNb2RlKSA9PSAxMikKLQkJUHJpdmF0ZS0+RVBPQ19GcmFtZUJ1ZmZlciArPSAxNiAqIDI7Ci0KLSAgICAjZWxzZSAvKiBkZWZpbmVkIF9fV0lOU19fICovCi0gICAgCi0gICAgLyogQ3JlYXRlIGJpdG1hcCwgZGV2aWNlIGFuZCBjb250ZXh0IGZvciBzY3JlZW4gZHJhd2luZyAqLwotICAgIFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZSAgICAgICAgPSBQcml2YXRlLT5FUE9DX1dzU2NyZWVuLT5TaXplSW5QaXhlbHMoKTsKLQotCVByaXZhdGUtPkVQT0NfQml0bWFwID0gbmV3IChFTGVhdmUpIENXc0JpdG1hcChQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbik7Ci0JUHJpdmF0ZS0+RVBPQ19CaXRtYXAtPkNyZWF0ZShQcml2YXRlLT5FUE9DX1NjcmVlblNpemUsIGRpc3BsYXlNb2RlKTsKLQotCVByaXZhdGUtPkVQT0NfRGlzcGxheU1vZGUJICAgID0gZGlzcGxheU1vZGU7Ci0gICAgUHJpdmF0ZS0+RVBPQ19IYXNGcmFtZUJ1ZmZlciAgICA9IEVUcnVlOwotICAgIFByaXZhdGUtPkVQT0NfRnJhbWVCdWZmZXIgICAgICAgPSBOVUxMOyAvKiBQcml2YXRlLT5FUE9DX0JpdG1hcC0+RGF0YUFkZHJlc3MoKSBjYW4gY2hhbmdlIGFueSB0aW1lICovCi0JUHJpdmF0ZS0+RVBPQ19CeXRlc1BlclBpeGVsCSAgICA9ICgoR2V0QnBwKGRpc3BsYXlNb2RlKS0xKSAvIDgpICsgMTsKLQlQcml2YXRlLT5FUE9DX0J5dGVzUGVyU2NhbkxpbmUgID0gUHJpdmF0ZS0+RVBPQ19Xc1NjcmVlbi0+U2l6ZUluUGl4ZWxzKCkuaVdpZHRoICogUHJpdmF0ZS0+RVBPQ19CeXRlc1BlclBpeGVsOwotCi0gICAgI2VuZGlmIC8qIF9fV0lOU19fICovCi0KLSAgICBfdGhpcy0+aW5mby5jdXJyZW50X3cgPSBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaVdpZHRoOwotICAgIF90aGlzLT5pbmZvLmN1cnJlbnRfaCA9IFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pSGVpZ2h0OwotCi0gICAgLyogVGhlICJiZXN0IiB2aWRlbyBmb3JtYXQgc2hvdWxkIGJlIHJldHVybmVkIHRvIGNhbGxlci4gKi8KLQotICAgIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCAgICAgICA9IC8qISFHZXRCcHAoZGlzcGxheU1vZGUpICovIDg7Ci0gICAgdmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCAgICAgID0gLyohIVByaXZhdGUtPkVQT0NfQnl0ZXNQZXJQaXhlbCovIDE7Ci0KLSAgICAvKiBBY3RpdmF0ZSBldmVudHMgZm9yIG1lICovCi0KLQlQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMgPSBLUmVxdWVzdFBlbmRpbmc7Ci0JUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uRXZlbnRSZWFkeSgmUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50U3RhdHVzKTsKLQlQcml2YXRlLT5FUE9DX1JlZHJhd0V2ZW50U3RhdHVzID0gS1JlcXVlc3RQZW5kaW5nOwotCVByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlJlZHJhd1JlYWR5KCZQcml2YXRlLT5FUE9DX1JlZHJhd0V2ZW50U3RhdHVzKTsKLSAgICBQcml2YXRlLT5FUE9DX1dzV2luZG93LlBvaW50ZXJGaWx0ZXIoRVBvaW50ZXJGaWx0ZXJEcmFnLCAwKTsgCi0KLSAgICBQcml2YXRlLT5FUE9DX1NjcmVlbk9mZnNldCA9IDA7Ci0KLSAgICAvLyEhIFRPRE86IGVycm9yIGhhbmRsaW5nCi0gICAgLy9pZiAocmV0ICE9IEtFcnJOb25lKQotICAgIC8vICAgIHJldHVybigtMSk7Ci0gICAgLy9lbHNlCi0JICAgIHJldHVybigwKTsKLX0KLQotCi1TRExfUmVjdCAqKkVQT0NfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQotewotICAgIGlmIChmb3JtYXQtPkJpdHNQZXJQaXhlbCA9PSAxMiB8fCBmb3JtYXQtPkJpdHNQZXJQaXhlbCA9PSA4KQotICAgICAgICByZXR1cm4gUHJpdmF0ZS0+U0RMX21vZGVsaXN0OwotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgRVBPQ19TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0gICAgZm9yKGludCBpID0gZmlyc3Rjb2xvcjsgaSA8IG5jb2xvcnM7IGkrKykgewotCSAgICAvLyA0ayB2YWx1ZTogMDAwcmdiCi0JICAgIFRVaW50MTYgY29sb3I0SyA9IDA7Ci0gICAgICAgIGNvbG9yNEsgfD0gKGNvbG9yc1tpXS5yICYgMHgwMDAwZjApIDw8IDQ7IAotCSAgICBjb2xvcjRLIHw9IChjb2xvcnNbaV0uZyAmIDB4MDAwMGYwKTsgICAgICAKLQkgICAgY29sb3I0SyB8PSAoY29sb3JzW2ldLmIgJiAweDAwMDBmMCkgPj4gNDsKLSAgICAgICAgRVBPQ19IV1BhbGV0dGVfMjU2X3RvXzRrW2ldID0gY29sb3I0SzsKLSAgICB9Ci0JcmV0dXJuKDApOwotfQotCi0KLVNETF9TdXJmYWNlICpFUE9DX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmICghKCh3aWR0aCA9PSA2NDAgJiYgaGVpZ2h0ID09IDIwMCAmJiBicHAgPT0gMTIpIHx8Ci0gICAgICAgICAgKHdpZHRoID09IDY0MCAmJiBoZWlnaHQgPT0gNDAwICYmIGJwcCA9PSAxMikgfHwgCi0gICAgICAgICAgKHdpZHRoID09IDY0MCAmJiBoZWlnaHQgPT0gNDgwICYmIGJwcCA9PSAxMikgfHwgCi0gICAgICAgICAgKHdpZHRoID09IDMyMCAmJiBoZWlnaHQgPT0gMjAwICYmIGJwcCA9PSAxMikgfHwgCi0gICAgICAgICAgKHdpZHRoID09IDY0MCAmJiBoZWlnaHQgPT0gMjAwICYmIGJwcCA9PSA4KSB8fAotICAgICAgICAgICh3aWR0aCA9PSA2NDAgJiYgaGVpZ2h0ID09IDQwMCAmJiBicHAgPT0gOCkgfHwgCi0gICAgICAgICAgKHdpZHRoID09IDY0MCAmJiBoZWlnaHQgPT0gNDgwICYmIGJwcCA9PSA4KSB8fCAKLSAgICAgICAgICAod2lkdGggPT0gMzIwICYmIGhlaWdodCA9PSAyMDAgJiYgYnBwID09IDgpKSkgewotCQlTRExfU2V0RXJyb3IoIlJlcXVlc3RlZCB2aWRlbyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudC0+cGl4ZWxzKSB7Ci0gICAgICAgIFNETF9mcmVlKGN1cnJlbnQtPnBpeGVscyk7Ci0gICAgICAgIGN1cnJlbnQtPnBpeGVscyA9IE5VTEw7Ci0gICAgfQotCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBicHAsIDAsIDAsIDAsIDApICkgewotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0gICAgLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLwotICAgIGlmIChicHAgPT0gOCkgCi0JICAgIGN1cnJlbnQtPmZsYWdzID0gKFNETF9GVUxMU0NSRUVOfFNETF9TV1NVUkZBQ0V8U0RMX1BSRUFMTE9DfFNETF9IV1BBTEVUVEUpOyAKLSAgICBlbHNlIC8vIDEyIGJwcAotCSAgICBjdXJyZW50LT5mbGFncyA9IChTRExfRlVMTFNDUkVFTnxTRExfU1dTVVJGQUNFfFNETF9QUkVBTExPQyk7IAotCWN1cnJlbnQtPncgPSB3aWR0aDsKLQljdXJyZW50LT5oID0gaGVpZ2h0OwotICAgIGludCBudW1CeXRlc1BlclBpeGVsID0gKChicHAtMSk+PjMpICsgMTsgICAKLQljdXJyZW50LT5waXRjaCA9IG51bUJ5dGVzUGVyUGl4ZWwgKiB3aWR0aDsgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIHNjYW5saW5lIAotCWN1cnJlbnQtPnBpeGVscyA9IFNETF9tYWxsb2Mod2lkdGggKiBoZWlnaHQgKiBudW1CeXRlc1BlclBpeGVsKTsKLQlTRExfbWVtc2V0KGN1cnJlbnQtPnBpeGVscywgMCwgd2lkdGggKiBoZWlnaHQgKiBudW1CeXRlc1BlclBpeGVsKTsKLQotCS8qIFNldCB0aGUgYmxpdCBmdW5jdGlvbiAqLwotCV90aGlzLT5VcGRhdGVSZWN0cyA9IEVQT0NfRGlyZWN0VXBkYXRlOwotCi0gICAgLyogTXVzdCBidWZmZXIgaGVpZ2h0IGJlIHNocmlua2VkIHRvIHNjcmVlbiBieSAyID8gKi8KLSAgICBpZiAoY3VycmVudC0+aCA+PSA0MDApCi0gICAgICAgIFByaXZhdGUtPkVQT0NfU2hyaW5rZWRIZWlnaHQgPSBFVHJ1ZTsKLQotICAgIC8qIENlbnRyYWxpemUgZ2FtZSB3aW5kb3cgb24gZGV2aWNlIHNjcmVlbiAgKi8KLSAgICBQcml2YXRlLT5FUE9DX1NjcmVlbk9mZnNldCA9IChQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaVdpZHRoIC0gY3VycmVudC0+dykgLyAyOwotCi0JLyogV2UncmUgZG9uZSAqLwotCXJldHVybihjdXJyZW50KTsKLX0KLQotdm9pZCBSZWRyYXdXaW5kb3dMKF9USElTKQotewotICAgIFNETF9SZWN0IGZ1bGxTY3JlZW47Ci0gICAgZnVsbFNjcmVlbi54ID0gMDsKLSAgICBmdWxsU2NyZWVuLnkgPSAwOwotICAgIGZ1bGxTY3JlZW4udyA9IF90aGlzLT5zY3JlZW4tPnc7Ci0gICAgZnVsbFNjcmVlbi5oID0gX3RoaXMtPnNjcmVlbi0+aDsKLQotI2lmZGVmIF9fV0lOU19fCi0JICAgIFRCaXRtYXBVdGlsIGxvY2soUHJpdmF0ZS0+RVBPQ19CaXRtYXApOwkKLSAgICAgICAgbG9jay5CZWdpbihUUG9pbnQoMCwwKSk7IC8vIExvY2sgYml0bWFwIGhlYXAKLQkgICAgUHJpdmF0ZS0+RVBPQ19XaW5kb3dHYy0+QWN0aXZhdGUoUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdyk7Ci0jZW5kaWYKLQotICAgIGlmIChmdWxsU2NyZWVuLncgPCBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaVdpZHRoCi0gICAgICAgICYmIGZ1bGxTY3JlZW4udyA8IFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGgpIHsKLSAgICAgICAgLyogRHJhdyBibHVlIHN0cmlwZXMgYmFja2dyb3VuZCAqLwotI2lmZGVmIF9fV0lOU19fCi0gICAgICAgIFRVaW50MTYqIHNjcmVlbkJ1ZmZlciA9IChUVWludDE2KilQcml2YXRlLT5FUE9DX0JpdG1hcC0+RGF0YUFkZHJlc3MoKTsKLSNlbHNlCi0gICAgICAgIFRVaW50MTYqIHNjcmVlbkJ1ZmZlciA9IChUVWludDE2KilQcml2YXRlLT5FUE9DX0ZyYW1lQnVmZmVyOwotI2VuZGlmCi0gICAgICAgIGZvciAoaW50IHk9MDsgeSA8IFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pSGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IHg9MDsgeCA8IFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGg7IHgrKykgewotICAgICAgICAgICAgICAgIFRVaW50MTYgY29sb3IgPSAoKHgreSk+PjEpICYgMHhmOyAvKiBEcmF3IHBhdHRlcm4gKi8KLSAgICAgICAgICAgICAgICAqc2NyZWVuQnVmZmVyKysgPSBjb2xvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogVGVsbCB0aGUgc3lzdGVtIHRoYXQgc29tZXRoaW5nIGhhcyBiZWVuIGRyYXduICovCi0JVFJlY3QgIHJlY3QgPSBUUmVjdChQcml2YXRlLT5FUE9DX1dzV2luZG93LlNpemUoKSk7Ci0gIAlQcml2YXRlLT5FUE9DX1dzV2luZG93LkludmFsaWRhdGUocmVjdCk7Ci0KLSNpZmRlZiBfX1dJTlNfXwotCVByaXZhdGUtPkVQT0NfV3NXaW5kb3cuQmVnaW5SZWRyYXcocmVjdCk7Ci0JUHJpdmF0ZS0+RVBPQ19XaW5kb3dHYy0+Qml0Qmx0KFRQb2ludCgpLCBQcml2YXRlLT5FUE9DX0JpdG1hcCk7Ci0JUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5FbmRSZWRyYXcoKTsKLQlQcml2YXRlLT5FUE9DX1dpbmRvd0djLT5EZWFjdGl2YXRlKCk7Ci0gICAgbG9jay5FbmQoKTsgLy8gVW5sb2NrIGJpdG1hcCBoZWFwCi0JUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uRmx1c2goKTsKLSNlbmRpZgotCi0gICAgLyogRHJhdyBjdXJyZW50IGJ1ZmZlciAqLwotICAgIEVQT0NfRGlyZWN0VXBkYXRlKF90aGlzLCAxLCAmZnVsbFNjcmVlbik7Ci19Ci0KLQotLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KLXN0YXRpYyBpbnQgRVBPQ19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuKC0xKTsKLX0KLXN0YXRpYyB2b2lkIEVQT0NfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IEVQT0NfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuKDApOwotfQotc3RhdGljIHZvaWQgRVBPQ19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBFUE9DX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgRVBPQ19EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotICAgIFRJbnQgZm9jdXNXaW5kb3dHcm91cElkID0gUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uR2V0Rm9jdXNXaW5kb3dHcm91cCgpOwotICAgIGlmIChmb2N1c1dpbmRvd0dyb3VwSWQgIT0gUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwSUQpIHsKLQotICAgICAgICAvKiBGb3JjZSBmb2N1cyB3aW5kb3cgdG8gcmVkcmF3IGFnYWluIGZvciBjbGVhbmluZyBhd2F5IFNETCBzY3JlZW4gZ3JhcGhpY3MgKi8KLQotICAKLSAgICAgICAgVEludCBwb3MgPSBQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAuT3JkaW5hbFBvc2l0aW9uKCk7Ci0gICAgICAgIFByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cC5TZXRPcmRpbmFsUG9zaXRpb24oMCwgS01heFRJbnQpOwotICAgICAgIAlUUmVjdCAgcmVjdCA9IFRSZWN0KFByaXZhdGUtPkVQT0NfV3NXaW5kb3cuU2l6ZSgpKTsKLSAgICAgICAgUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5JbnZhbGlkYXRlKHJlY3QpOwotICAgICAgICBQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAuU2V0T3JkaW5hbFBvc2l0aW9uKHBvcywgRUNvZVdpblByaW9yaXR5Tm9ybWFsKTsKLSAgICAgICAgCi0gICAgICAgIC8qIElmIHRoaXMgaXMgbm90IHRoZSB0b3Btb3N0IHdpbmRvdywgd2FpdCBoZXJlISBTbGVlcCBmb3IgMSBzZWNvbmQgdG8gZ2l2ZSBjcHUgdG8gCi0gICAgICAgICAgIG11bHRpdGFza2luZyBhbmQgcG9sbCBmb3IgYmVpbmcgdGhlIHRvcG1vc3Qgd2luZG93LgotICAgICAgICAqLwotICAgICAgICB3aGlsZSAoUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uR2V0Rm9jdXNXaW5kb3dHcm91cCgpICE9IFByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cElEKQotICAgICAgICAgICAgU0RMX0RlbGF5KDEwMDApOwotCi0gICAgICAgIFJlZHJhd1dpbmRvd0woX3RoaXMpOyAgCi0gICAgfQotCi0JVEludCBpOwotICAgIFRJbnQgc291cmNlTnVtQnl0ZXNQZXJQaXhlbCA9ICgoX3RoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwtMSk+PjMpICsgMTsgICAKLSAgICBUSW50IHRhcmdldE51bUJ5dGVzUGVyUGl4ZWwgPSBQcml2YXRlLT5FUE9DX0J5dGVzUGVyUGl4ZWw7ICAgCi0gICAgVEludCBmaXhlZE9mZnNldCA9IFByaXZhdGUtPkVQT0NfU2NyZWVuT2Zmc2V0OyAgIAotICAgIFRJbnQgc2NyZWVuVyA9IF90aGlzLT5zY3JlZW4tPnc7Ci0gICAgVEludCBzY3JlZW5IID0gX3RoaXMtPnNjcmVlbi0+aDsKLSAgICBUSW50IHNvdXJjZVNjYW5saW5lTGVuZ3RoID0gc2NyZWVuVzsKLSAgICBpZiAoUHJpdmF0ZS0+RVBPQ19TaHJpbmtlZEhlaWdodCkgeyAgLyogc2ltdWxhdGUgNDAwIHBpeGVsIGhlaWdodCBpbiAyMDAgcGl4ZWwgc2NyZWVuICovICAKLSAgICAgICAgc291cmNlU2NhbmxpbmVMZW5ndGggPDw9IDE7IAotICAgICAgICBzY3JlZW5IID4+PSAxOwotICAgIH0KLSAgICBUSW50IHRhcmdldFNjYW5saW5lTGVuZ3RoID0gUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlXaWR0aDsKLSNpZmRlZiBfX1dJTlNfXwotCVRCaXRtYXBVdGlsIGxvY2soUHJpdmF0ZS0+RVBPQ19CaXRtYXApOwkKLSAgICBsb2NrLkJlZ2luKFRQb2ludCgwLDApKTsgLy8gTG9jayBiaXRtYXAgaGVhcAotCVByaXZhdGUtPkVQT0NfV2luZG93R2MtPkFjdGl2YXRlKFByaXZhdGUtPkVQT0NfV3NXaW5kb3cpOwotICAgIFRVaW50MTYqIHNjcmVlbkJ1ZmZlciA9IChUVWludDE2KilQcml2YXRlLT5FUE9DX0JpdG1hcC0+RGF0YUFkZHJlc3MoKTsKLSNlbHNlCi0gICAgVFVpbnQxNiogc2NyZWVuQnVmZmVyID0gKFRVaW50MTYqKVByaXZhdGUtPkVQT0NfRnJhbWVCdWZmZXI7Ci0jZW5kaWYKLQotCi0JLyogUmVuZGVyIHRoZSByZWN0YW5nbGVzIGluIHRoZSBsaXN0ICovCi0KLQlmb3IgKCBpPTA7IGkgPCBudW1yZWN0czsgKytpICkgewotICAgICAgICBTRExfUmVjdCByZWN0MjsKLSAgICAgICAgY29uc3QgU0RMX1JlY3QmIGN1cnJlbnRSZWN0ID0gcmVjdHNbaV07Ci0gICAgICAgIHJlY3QyLnggPSBjdXJyZW50UmVjdC54OwotICAgICAgICByZWN0Mi55ID0gY3VycmVudFJlY3QueTsKLSAgICAgICAgcmVjdDIudyA9IGN1cnJlbnRSZWN0Lnc7Ci0gICAgICAgIHJlY3QyLmggPSBjdXJyZW50UmVjdC5oOwotCi0gICAgICAgIGlmIChyZWN0Mi53IDw9IDAgfHwgcmVjdDIuaCA8PSAwKSAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGlmIChQcml2YXRlLT5FUE9DX1Nocmlua2VkSGVpZ2h0KSB7ICAvKiBzaW11bGF0ZSA0MDAgcGl4ZWwgaGVpZ2h0IGluIDIwMCBwaXhlbCBzY3JlZW4gKi8gICAgICAgIAotICAgICAgICAgICAgcmVjdDIueSA+Pj0gMTsKLSAgICAgICAgICAgIGlmICghKHJlY3QyLmggPj49IDEpKSAKLSAgICAgICAgICAgICAgICByZWN0Mi5oID0gMTsgLy8gYWx3YXlzIGF0IGxlYXN0IDEgcGl4ZWwgaGVpZ2h0IQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsIHZhcmlhYmxlcyBhcmUgbWVhc3VyZWQgaW4gcGl4ZWxzICovCi0KLSAgICAgICAgLyogQ2hlY2sgcmVjdHMgdmFsaWRpdHksIGkuZS4gdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyAqLwotICAgICAgICBUSW50IG1heFggPSBNaW4oc2NyZWVuVyAtIDEsIHJlY3QyLnggKyByZWN0Mi53IC0gMSk7Ci0gICAgICAgIFRJbnQgbWF4WSA9IE1pbihzY3JlZW5IIC0gMSwgcmVjdDIueSArIHJlY3QyLmggLSAxKTsKLSAgICAgICAgaWYgKG1heFggPCAwIHx8IG1heFkgPCAwKSAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBtYXhZID0gTWluKG1heFksIDE5OSk7IAotCi0gICAgICAgIFRJbnQgc291cmNlUmVjdFdpZHRoID0gbWF4WCAtIHJlY3QyLnggKyAxOwotICAgICAgICBUSW50IHNvdXJjZVJlY3RXaWR0aEluQnl0ZXMgPSBzb3VyY2VSZWN0V2lkdGggKiBzb3VyY2VOdW1CeXRlc1BlclBpeGVsOwotICAgICAgICBUSW50IHNvdXJjZVJlY3RIZWlnaHQgPSBtYXhZIC0gcmVjdDIueSArIDE7Ci0gICAgICAgIFRJbnQgc291cmNlU3RhcnRPZmZzZXQgPSByZWN0Mi54ICsgcmVjdDIueSAqIHNvdXJjZVNjYW5saW5lTGVuZ3RoOwotICAgICAgICBUSW50IHRhcmdldFN0YXJ0T2Zmc2V0ID0gZml4ZWRPZmZzZXQgKyByZWN0Mi54ICsgcmVjdDIueSAqIHRhcmdldFNjYW5saW5lTGVuZ3RoOyAgIAotICAgICAgICAKLSAgICAgICAgLy8gISEgTm9raWE5MjEwIG5hdGl2ZSBtb2RlOiAxMiBicHAgLS0+IDEyIGJwcAotICAgICAgICBpZiAoX3RoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gMTIpIHsgCi0JICAgICAgICBUVWludDE2KiBiaXRtYXBMaW5lID0gKFRVaW50MTYqKV90aGlzLT5zY3JlZW4tPnBpeGVscyArIHNvdXJjZVN0YXJ0T2Zmc2V0OwotICAgICAgICAgICAgVFVpbnQxNiogc2NyZWVuTWVtb3J5ID0gc2NyZWVuQnVmZmVyICsgdGFyZ2V0U3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICBmb3IoVEludCB5ID0gMCA7IHkgPCBzb3VyY2VSZWN0SGVpZ2h0IDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgX19BU1NFUlRfREVCVUcoc2NyZWVuTWVtb3J5IDwgKHNjcmVlbkJ1ZmZlciAKLSAgICAgICAgICAgICAgICAgICAgKyBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaVdpZHRoICogUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlIZWlnaHQpLCAKLSAgICAgICAgICAgICAgICAgICAgVXNlcjo6UGFuaWMoX0woIlNETCIpLCBLRXJyQ29ycnVwdCkpOwotICAgICAgICAgICAgICAgIF9fQVNTRVJUX0RFQlVHKHNjcmVlbk1lbW9yeSA+PSBzY3JlZW5CdWZmZXIsIAotICAgICAgICAgICAgICAgICAgICBVc2VyOjpQYW5pYyhfTCgiU0RMIiksIEtFcnJDb3JydXB0KSk7Ci0gICAgICAgICAgICAgICAgX19BU1NFUlRfREVCVUcoYml0bWFwTGluZSA8ICgoVFVpbnQxNiopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzICsgCi0gICAgICAgICAgICAgICAgICAgICsgKF90aGlzLT5zY3JlZW4tPncgKiBfdGhpcy0+c2NyZWVuLT5oKSksIAotICAgICAgICAgICAgICAgICAgICBVc2VyOjpQYW5pYyhfTCgiU0RMIiksIEtFcnJDb3JydXB0KSk7Ci0gICAgICAgICAgICAgICAgX19BU1NFUlRfREVCVUcoYml0bWFwTGluZSA+PSAgKFRVaW50MTYqKV90aGlzLT5zY3JlZW4tPnBpeGVscywgCi0gICAgICAgICAgICAgICAgICAgIFVzZXI6OlBhbmljKF9MKCJTREwiKSwgS0VyckNvcnJ1cHQpKTsKLQkJICAgICAgICBNZW06OkNvcHkoc2NyZWVuTWVtb3J5LCBiaXRtYXBMaW5lLCBzb3VyY2VSZWN0V2lkdGhJbkJ5dGVzKTsKLQkJICAgICAgICBiaXRtYXBMaW5lICs9IHNvdXJjZVNjYW5saW5lTGVuZ3RoOwotCQkgICAgICAgIHNjcmVlbk1lbW9yeSArPSB0YXJnZXRTY2FubGluZUxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyAhISAyNTYgY29sb3IgcGFsZXR0ZWQgbW9kZTogOCBicHAgIC0tPiAxMiBicHAKLSAgICAgICAgZWxzZSB7IAotCSAgICAgICAgVFVpbnQ4KiBiaXRtYXBMaW5lID0gKFRVaW50OCopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzICsgc291cmNlU3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICBUVWludDE2KiBzY3JlZW5NZW1vcnkgPSBzY3JlZW5CdWZmZXIgKyB0YXJnZXRTdGFydE9mZnNldDsKLSAgICAgICAgICAgIGZvcihUSW50IHkgPSAwIDsgeSA8IHNvdXJjZVJlY3RIZWlnaHQgOyB5KyspIHsKLSAgICAgICAgICAgICAgICBUVWludDgqIGJpdG1hcFBvcyA9IGJpdG1hcExpbmU7IC8qIDEgYnl0ZSBwZXIgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICBUVWludDE2KiBzY3JlZW5NZW1vcnlMaW5lUG9zID0gc2NyZWVuTWVtb3J5OyAvKiAyIGJ5dGVzIHBlciBwaXhlbCAqLwotICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgZWFjaCBwaXhlbCBmcm9tIDI1NiBwYWxldHRlIHRvIDRrIGNvbG9yIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgIGZvcihUSW50IHggPSAwIDsgeCA8IHNvdXJjZVJlY3RXaWR0aCA7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBfX0FTU0VSVF9ERUJVRyhzY3JlZW5NZW1vcnlMaW5lUG9zIDwgKHNjcmVlbkJ1ZmZlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGggKiBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaUhlaWdodCkpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFVzZXI6OlBhbmljKF9MKCJTREwiKSwgS0VyckNvcnJ1cHQpKTsKLSAgICAgICAgICAgICAgICAgICAgX19BU1NFUlRfREVCVUcoc2NyZWVuTWVtb3J5TGluZVBvcyA+PSBzY3JlZW5CdWZmZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgVXNlcjo6UGFuaWMoX0woIlNETCIpLCBLRXJyQ29ycnVwdCkpOwotICAgICAgICAgICAgICAgICAgICBfX0FTU0VSVF9ERUJVRyhiaXRtYXBQb3MgPCAoKFRVaW50OCopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzICsgCi0gICAgICAgICAgICAgICAgICAgICAgICArIChfdGhpcy0+c2NyZWVuLT53ICogX3RoaXMtPnNjcmVlbi0+aCkpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFVzZXI6OlBhbmljKF9MKCJTREwiKSwgS0VyckNvcnJ1cHQpKTsKLSAgICAgICAgICAgICAgICAgICAgX19BU1NFUlRfREVCVUcoYml0bWFwUG9zID49IChUVWludDgqKV90aGlzLT5zY3JlZW4tPnBpeGVscywgCi0gICAgICAgICAgICAgICAgICAgICAgICBVc2VyOjpQYW5pYyhfTCgiU0RMIiksIEtFcnJDb3JydXB0KSk7Ci0gICAgICAgICAgICAgICAgICAgICpzY3JlZW5NZW1vcnlMaW5lUG9zID0gRVBPQ19IV1BhbGV0dGVfMjU2X3RvXzRrWypiaXRtYXBQb3NdOwotICAgICAgICAgICAgICAgICAgICBiaXRtYXBQb3MrKzsKLSAgICAgICAgICAgICAgICAgICAgc2NyZWVuTWVtb3J5TGluZVBvcysrOwotICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICBiaXRtYXBMaW5lICs9IHNvdXJjZVNjYW5saW5lTGVuZ3RoOwotCQkgICAgICAgIHNjcmVlbk1lbW9yeSArPSB0YXJnZXRTY2FubGluZUxlbmd0aDsKLSAgICAgICAgICAgIH0KLQkgICAgfQotCi0gICAgfSAgICAKLSAgICAKLSNpZmRlZiBfX1dJTlNfXwotCi0JVFJlY3QgIHJlY3QgPSBUUmVjdChQcml2YXRlLT5FUE9DX1dzV2luZG93LlNpemUoKSk7Ci0JUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5JbnZhbGlkYXRlKHJlY3QpOwotCVByaXZhdGUtPkVQT0NfV3NXaW5kb3cuQmVnaW5SZWRyYXcocmVjdCk7Ci0JUHJpdmF0ZS0+RVBPQ19XaW5kb3dHYy0+Qml0Qmx0KFRQb2ludCgpLCBQcml2YXRlLT5FUE9DX0JpdG1hcCk7Ci0JUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5FbmRSZWRyYXcoKTsKLQlQcml2YXRlLT5FUE9DX1dpbmRvd0djLT5EZWFjdGl2YXRlKCk7Ci0gICAgbG9jay5FbmQoKTsgLy8gVW5sb2NrIGJpdG1hcCBoZWFwCi0JUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uRmx1c2goKTsKLQotI2VuZGlmCi0KLSAgICAvKiBVcGRhdGUgdmlydHVhbCBjdXJzb3IgKi8KLSAgICAvLyEhUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uU2V0UG9pbnRlckN1cnNvclBvc2l0aW9uKFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlBvaW50ZXJDdXJzb3JQb3NpdGlvbigpKTsKLQotICAgIHJldHVybjsKLX0KLQotCi0vKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKLSAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KLSovCi12b2lkIEVQT0NfVmlkZW9RdWl0KF9USElTKQotewotCWludCBpOwotCi0JLyogRnJlZSB2aWRlbyBtb2RlIGxpc3RzICovCi0JZm9yICggaT0wOyBpPFNETF9OVU1NT0RFUzsgKytpICkgewotCQlpZiAoIFByaXZhdGUtPlNETF9tb2RlbGlzdFtpXSAhPSBOVUxMICkgewotCQkJU0RMX2ZyZWUoUHJpdmF0ZS0+U0RMX21vZGVsaXN0W2ldKTsKLQkJCVByaXZhdGUtPlNETF9tb2RlbGlzdFtpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0JCi0gICAgaWYgKCBfdGhpcy0+c2NyZWVuICYmIChfdGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICkgewotCQkvKiBEaXJlY3Qgc2NyZWVuIGFjY2Vzcywgbm8gbWVtb3J5IGJ1ZmZlciAqLwotCQlfdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOwotCX0KLQotICAgIGlmIChfdGhpcy0+c2NyZWVuICYmIF90aGlzLT5zY3JlZW4tPnBpeGVscykgewotICAgICAgICBTRExfZnJlZShfdGhpcy0+c2NyZWVuLT5waXhlbHMpOwotICAgICAgICBfdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOwotICAgIH0KLQotICAgIC8qIEZyZWUgRXBvYyByZXNvdXJjZXMgKi8KLQotICAgIC8qIERpc2FibGUgZXZlbnRzIGZvciBtZSAqLwotCWlmIChQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMgIT0gS1JlcXVlc3RQZW5kaW5nKQotCQlQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5FdmVudFJlYWR5Q2FuY2VsKCk7Ci0JaWYgKFByaXZhdGUtPkVQT0NfUmVkcmF3RXZlbnRTdGF0dXMgIT0gS1JlcXVlc3RQZW5kaW5nKQotCQlQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5SZWRyYXdSZWFkeUNhbmNlbCgpOwotCi0gICAgI2lmZGVmIF9fV0lOU19fCi0JZGVsZXRlIFByaXZhdGUtPkVQT0NfQml0bWFwOwotCVByaXZhdGUtPkVQT0NfQml0bWFwID0gTlVMTDsKLSAgICAjZW5kaWYKLQotCWlmIChQcml2YXRlLT5FUE9DX1dzV2luZG93LldzSGFuZGxlKCkpCi0JCVByaXZhdGUtPkVQT0NfV3NXaW5kb3cuQ2xvc2UoKTsKLQotCWlmIChQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAuV3NIYW5kbGUoKSkKLQkJUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwLkNsb3NlKCk7Ci0KLQlkZWxldGUgUHJpdmF0ZS0+RVBPQ19XaW5kb3dHYzsKLQlQcml2YXRlLT5FUE9DX1dpbmRvd0djID0gTlVMTDsKLQotCWRlbGV0ZSBQcml2YXRlLT5FUE9DX1dzU2NyZWVuOwotCVByaXZhdGUtPkVQT0NfV3NTY3JlZW4gPSBOVUxMOwotCi0JaWYgKFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLldzSGFuZGxlKCkpCi0JCVByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkNsb3NlKCk7Ci19Ci0KLQotV01jdXJzb3IgKkVQT0NfQ3JlYXRlV01DdXJzb3IoX1RISVMsIFVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKLXsKLQlyZXR1cm4gKFdNY3Vyc29yICopIDkyMTA7IC8vIGl0J3Mgb2sgdG8gcmV0dXJuIHNvbWV0aGluZyB1bnVzZWZ1bCBidXQgdHJ1ZQotfQotCi12b2lkIEVQT0NfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotICAgIC8qIERpc2FibGUgdmlydHVhbCBjdXJzb3IgKi8KLSAgICBIQUw6OlNldChIQUw6OkVNb3VzZVN0YXRlLCBIQUw6OkVNb3VzZVN0YXRlX0ludmlzaWJsZSk7Ci0gICAgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uU2V0UG9pbnRlckN1cnNvck1vZGUoRVBvaW50ZXJDdXJzb3JOb25lKTsKLX0KLQotaW50IEVQT0NfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotCi0gICAgaWYgKGN1cnNvciA9PSAgKFdNY3Vyc29yICopOTIxMCkgewotICAgICAgICAvKiBFbmFibGUgdmlydHVhbCBjdXJzb3IgKi8KLQkgICAgSEFMOjpTZXQoSEFMOjpFTW91c2VTdGF0ZSwgSEFMOjpFTW91c2VTdGF0ZV9WaXNpYmxlKTsKLQkgICAgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uU2V0UG9pbnRlckN1cnNvck1vZGUoRVBvaW50ZXJDdXJzb3JOb3JtYWwpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogRGlzYWJsZSB2aXJ0dWFsIGN1cnNvciAqLwotICAgICAgICBIQUw6OlNldChIQUw6OkVNb3VzZVN0YXRlLCBIQUw6OkVNb3VzZVN0YXRlX0ludmlzaWJsZSk7Ci0gICAgICAgIFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlNldFBvaW50ZXJDdXJzb3JNb2RlKEVQb2ludGVyQ3Vyc29yTm9uZSk7Ci0gICAgfQotCi0JcmV0dXJuKDEpOwotfQotCi19OyAvLyBleHRlcm4gIkMiCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZXBvYy9TRExfZXBvY3ZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2Vwb2MvU0RMX2Vwb2N2aWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmZmNTBhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZXBvYy9TRExfZXBvY3ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAgICBTRExfZXBvY3ZpZGVvLmgKLSAgICBFcG9jIGJhc2VkIFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb24KLQotICAgIEVwb2MgdmVyc2lvbiBieSBIYW5udSBWaWl0YWxhIChoYW5udS5qLnZpaXRhbGFAbWJuZXQuZmkpCi0qLwotCi0jaWZuZGVmIF9TRExfZXBvY3ZpZGVvX2gKLSNkZWZpbmUgX1NETF9lcG9jdmlkZW9faAotCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLX07Ci0KLSNpbmNsdWRlIDxlMzJzdGQuaD4KLSNpbmNsdWRlIDxiaXRkZXYuaD4gCi0jaW5jbHVkZSA8dzMyc3RkLmg+Ci0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKl90aGlzCi0jZGVmaW5lIFByaXZhdGUJX3RoaXMtPmhpZGRlbgotCi0jZGVmaW5lIFNETF9OVU1NT0RFUwk0Ci0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotCi0gICAgU0RMX1JlY3QgICAgICAgICAgICAqU0RMX21vZGVsaXN0W1NETF9OVU1NT0RFUysxXTsKLQotCS8qIEVwb2Mgd2luZG93IHNlcnZlciBpbmZvICovCi0gICAgCi0gICAgUldzU2Vzc2lvbgkJCUVQT0NfV3NTZXNzaW9uOwotCVJXaW5kb3dHcm91cAkJRVBPQ19Xc1dpbmRvd0dyb3VwOwotICAgIFRJbnQgICAgICAgICAgICAgICAgRVBPQ19Xc1dpbmRvd0dyb3VwSUQ7Ci0JUldpbmRvdwkJCQlFUE9DX1dzV2luZG93OwotCUNXc1NjcmVlbkRldmljZSoJRVBPQ19Xc1NjcmVlbjsKLQlDV2luZG93R2MqCQkJRVBPQ19XaW5kb3dHYzsKLQlUUmVxdWVzdFN0YXR1cwkJRVBPQ19Xc0V2ZW50U3RhdHVzOwotCVRSZXF1ZXN0U3RhdHVzCQlFUE9DX1JlZHJhd0V2ZW50U3RhdHVzOwotCVRXc0V2ZW50CQkJRVBPQ19Xc0V2ZW50OwotCVRXc1JlZHJhd0V2ZW50CQlFUE9DX1JlZHJhd0V2ZW50OwotICAgICNpZmRlZiBfX1dJTlNfXwotICAgIENXc0JpdG1hcCogICAgICAgICAgRVBPQ19CaXRtYXA7Ci0gICAgI2VuZGlmCi0gICAgVEJvb2wgICAgICAgICAgICAgICBFUE9DX0lzV2luZG93Rm9jdXNlZDsgLy8hIU5vdCB1c2VkIGZvciBhbnl0aGluZyB5ZXQhCi0KLSAgICAvKiBTY3JlZW4gaGFyZHdhcmUgZnJhbWUgYnVmZmVyIGluZm8gKi8KLQotICAgCVRCb29sCQkJCUVQT0NfSGFzRnJhbWVCdWZmZXI7Ci0JVEludAkJCQlFUE9DX0J5dGVzUGVyUGl4ZWw7Ci0JVEludAkJCQlFUE9DX0J5dGVzUGVyU2NhbkxpbmU7Ci0JVERpc3BsYXlNb2RlCQlFUE9DX0Rpc3BsYXlNb2RlOwotCVRTaXplCQkJCUVQT0NfU2NyZWVuU2l6ZTsKLQlUVWludDgqCQkJCUVQT0NfRnJhbWVCdWZmZXI7CQkvKiBpZiBOVUxMIGluIEhXIHdlIGNhbid0IGRvIGRpcmVjdCBzY3JlZW4gYWNjZXNzICovCi0gICAgVEludCAgICAgICAgICAgICAgICBFUE9DX1NjcmVlbk9mZnNldDsKLQotICAgIC8qIFNpbXVsYXRlIGRvdWJsZSBzY3JlZW4gaGVpZ2h0ICovCi0gICAgVEJvb2wgICAgICAgICAgICAgICBFUE9DX1Nocmlua2VkSGVpZ2h0OwotfTsKLQotZXh0ZXJuICJDIiB7Ci1leHRlcm4gdm9pZCBSZWRyYXdXaW5kb3dMKF9USElTKTsKLX07Ci0KLQotI2VuZGlmIC8qIF9TRExfZXBvY3ZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vM2RmeF9tbWlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uLzNkZnhfbW1pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTRhY2I5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vM2RmeF9tbWlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogM0RmeCByZWdpc3RlciBkZWZpbml0aW9ucyAqLwotCi0jaW5jbHVkZSAiM2RmeF9yZWdzLmgiCi0KLS8qIDNEZnggY29udHJvbCBtYWNyb3MgKi8KLQotI2RlZmluZSB0ZGZ4X2luOChyZWcpCQkqKHZvbGF0aWxlIFVpbnQ4ICAqKShtYXBwZWRfaW8gKyAocmVnKSkKLSNkZWZpbmUgdGRmeF9pbjMyKHJlZykJCSoodm9sYXRpbGUgVWludDMyICopKG1hcHBlZF9pbyArIChyZWcpKQotCi0jZGVmaW5lIHRkZnhfb3V0OChyZWcsdikJKih2b2xhdGlsZSBVaW50OCAgKikobWFwcGVkX2lvICsgKHJlZykpID0gdjsKLSNkZWZpbmUgdGRmeF9vdXQzMihyZWcsdikJKih2b2xhdGlsZSBVaW50MzIgKikobWFwcGVkX2lvICsgKHJlZykpID0gdjsKLQotCi0vKiBXYWl0IGZvciBmaWZvIHNwYWNlICovCi0jZGVmaW5lIHRkZnhfd2FpdChzcGFjZSkJCQkJCQlcCi17CQkJCQkJCQkJXAotCXdoaWxlICggKHRkZnhfaW44KFRERlhfU1RBVFVTKSAmIDB4MUYpIDwgc3BhY2UgKQkJXAotCQk7CQkJCQkJCVwKLX0KLQotCi0vKiBXYWl0IGZvciBpZGxlIGFjY2VsZXJhdG9yICovCi0jZGVmaW5lIHRkZnhfd2FpdGlkbGUoKQkJCQkJCQlcCi17CQkJCQkJCQkJXAotCWludCBpID0gMDsJCQkJCQkJXAotCQkJCQkJCQkJXAotCXRkZnhfd2FpdCgxKTsJCQkJCQkJXAotCXRkZnhfb3V0MzIoQ09NTUFORF8zRCwgQ09NTUFORF8zRF9OT1ApOwkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpID0gKHRkZnhfaW4zMihUREZYX1NUQVRVUykgJiBTVEFUVVNfQlVTWSkgPyAwIDogaSArIDE7CVwKLQl9IHdoaWxlICggaSAhPSAzICk7CQkJCQkJXAotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uLzNkZnhfcmVncy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi8zZGZ4X3JlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MGM4Mi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uLzNkZnhfcmVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgXzNERlhfUkVHU19ICi0jZGVmaW5lIF8zREZYX1JFR1NfSAotCi0vKiBUaGlzIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIHB1YmxpYyAzRGZ4IHNwZWNzIGZvciB0aGUgVm9vZG9vIDMwMDAgKi8KLQotLyogbWFwcGVkX2lvIHJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgVERGWF9TVEFUVVMJMHgwMAotCi0jZGVmaW5lIElOVENUUkwJCSgweDAwMTAwMDAwICsgMHgwNCkKLSNkZWZpbmUgQ0xJUDBNSU4JKDB4MDAxMDAwMDAgKyAweDA4KQotI2RlZmluZSBDTElQME1BWAkoMHgwMDEwMDAwMCArIDB4MGMpCi0jZGVmaW5lIERTVEJBU0UJCSgweDAwMTAwMDAwICsgMHgxMCkKLSNkZWZpbmUgRFNURk9STUFUCSgweDAwMTAwMDAwICsgMHgxNCkKLSNkZWZpbmUgU1JDQ09MT1JLRVlNSU4JKDB4MDAxMDAwMDAgKyAweDE4KQotI2RlZmluZSBTUkNDT0xPUktFWU1BWAkoMHgwMDEwMDAwMCArIDB4MWMpCi0jZGVmaW5lIERTVENPTE9SS0VZTUlOCSgweDAwMTAwMDAwICsgMHgyMCkKLSNkZWZpbmUgRFNUQ09MT1JLRVlNQVgJKDB4MDAxMDAwMDAgKyAweDI0KQotI2RlZmluZSBCUkVTRVJST1IwCSgweDAwMTAwMDAwICsgMHgyOCkKLSNkZWZpbmUgQlJFU0VSUk9SMQkoMHgwMDEwMDAwMCArIDB4MmMpCi0jZGVmaW5lIFJPUF8yRAkJKDB4MDAxMDAwMDAgKyAweDMwKQotI2RlZmluZSBTUkNCQVNFCQkoMHgwMDEwMDAwMCArIDB4MzQpCi0jZGVmaW5lIENPTU1BTkRFWFRSQV8yRAkoMHgwMDEwMDAwMCArIDB4MzgpCi0jZGVmaW5lIFBBVFRFUk4wCSgweDAwMTAwMDAwICsgMHg0NCkKLSNkZWZpbmUgUEFUVEVSTjEJKDB4MDAxMDAwMDAgKyAweDQ4KQotI2RlZmluZSBDTElQMU1JTgkoMHgwMDEwMDAwMCArIDB4NGMpCi0jZGVmaW5lIENMSVAxTUFYCSgweDAwMTAwMDAwICsgMHg1MCkKLSNkZWZpbmUgU1JDRk9STUFUCSgweDAwMTAwMDAwICsgMHg1NCkKLSNkZWZpbmUgU1JDU0laRQkJKDB4MDAxMDAwMDAgKyAweDU4KQotI2RlZmluZSBTUkNYWQkJKDB4MDAxMDAwMDAgKyAweDVjKQotI2RlZmluZSBDT0xPUkJBQ0sJKDB4MDAxMDAwMDAgKyAweDYwKQotI2RlZmluZSBDT0xPUkZPUkUJKDB4MDAxMDAwMDAgKyAweDY0KQotI2RlZmluZSBEU1RTSVpFCQkoMHgwMDEwMDAwMCArIDB4NjgpCi0jZGVmaW5lIERTVFhZCQkoMHgwMDEwMDAwMCArIDB4NmMpCi0jZGVmaW5lIENPTU1BTkRfMkQJKDB4MDAxMDAwMDAgKyAweDcwKQotI2RlZmluZSBMQVVOQ0hfMkQJKDB4MDAxMDAwMDAgKyAweDgwKQotI2RlZmluZSBQQVRURVJOQkFTRQkoMHgwMDEwMDAwMCArIDB4MTAwKQotCi0jZGVmaW5lIENPTU1BTkRfM0QJKDB4MDAyMDAwMDAgKyAweDEyMCkKLQotLyogcmVnaXN0ZXIgYml0ZmllbGRzIChub3QgYWxsLCBvbmx5IGFzIG5lZWRlZCkgKi8KLQotI2RlZmluZSBCSVQoeCkgKDFVTCA8PCAoeCkpCi0KLSNkZWZpbmUgQ09NTUFORF8yRF9CSVRCTFQJCTB4MDEKLSNkZWZpbmUgQ09NTUFORF8yRF9GSUxMUkVDVAkJMHgwNQotI2RlZmluZSBDT01NQU5EXzJEX0xJTkUJCQkweDA2Ci0jZGVmaW5lIENPTU1BTkRfMkRfUE9MWUdPTl9GSUxMCQkweDA4Ci0jZGVmaW5lIENPTU1BTkRfMkRfSU5JVElBVEUJCUJJVCg4KQotI2RlZmluZSBDT01NQU5EXzJEX1JFVkVSU0VMSU5FCQlCSVQoOSkKLSNkZWZpbmUgQ09NTUFORF8yRF9TVElQUExFTElORQkJQklUKDEyKQotI2RlZmluZSBDT01NQU5EXzJEX01PTk9DSFJPTUVfUEFUVAlCSVQoMTMpCi0jZGVmaW5lIENPTU1BTkRfMkRfTU9OT0NIUk9NRV9UUkFOU1AgICAgQklUKDE2KQotCi0jZGVmaW5lIENPTU1BTkRfM0RfTk9QCQkJMHgwMAotCi0jZGVmaW5lIFNUQVRVU19SRVRSQUNFCQkJQklUKDYpCi0jZGVmaW5lIFNUQVRVU19CVVNZCQkJQklUKDkpCi0KLSNlbmRpZiAvKiBfM0RGWF9SRUdTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmIzZGZ4LmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYjNkZnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkZjdhYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYjNkZnguYworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIi4uL1NETF9ibGl0LmgiCi0jaW5jbHVkZSAiU0RMX2ZiM2RmeC5oIgotI2luY2x1ZGUgIjNkZnhfbW1pby5oIgotCi0KLS8qIFdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UgKi8KLXN0YXRpYyB2b2lkIFdhaXRWQkwoX1RISVMpCi17Ci0JLyogZmluZCBzdGFydCBvZiByZXRyYWNlICovCi0JdGRmeF93YWl0aWRsZSgpOwotCXdoaWxlKCAodGRmeF9pbjMyKFRERlhfU1RBVFVTKSAmIFNUQVRVU19SRVRSQUNFKSA9PSBTVEFUVVNfUkVUUkFDRSApCi0JCTsKLQkvKiB3YWl0IHVudGlsIHdlJ3JlIHBhc3QgdGhlIHN0YXJ0ICovCi0Jd2hpbGUoICh0ZGZ4X2luMzIoVERGWF9TVEFUVVMpICYgU1RBVFVTX1JFVFJBQ0UpID09IDAgKQotCQk7IAotfQotc3RhdGljIHZvaWQgV2FpdElkbGUoX1RISVMpCi17Ci0JdGRmeF93YWl0aWRsZSgpOwotfQotCi0vKiBTZXRzIHZpZGVvIG1lbSBjb2xvcmtleSBhbmQgYWNjZWxlcmF0ZWQgYmxpdCBmdW5jdGlvbiAqLwotc3RhdGljIGludCBTZXRIV0NvbG9yS2V5KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDMyIGtleSkKLXsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcikKLXsKLQlpbnQgYnBwOwotCVVpbnQzMiBkc3RfYmFzZTsKLQlVaW50MzIgZm9ybWF0OwotCWludCBkc3RYLCBkc3RZOwotCi0JLyogRG9uJ3QgYmxpdCB0byB0aGUgZGlzcGxheSBzdXJmYWNlIHdoZW4gc3dpdGNoZWQgYXdheSAqLwotCWlmICggc3dpdGNoZWRfYXdheSApIHsKLQkJcmV0dXJuIC0yOyAvKiBubyBoYXJkd2FyZSBhY2Nlc3MgKi8KLQl9Ci0JaWYgKCBkc3QgPT0gdGhpcy0+c2NyZWVuICkgewotCQlTRExfbXV0ZXhQKGh3X2xvY2spOwotCX0KLQotCS8qIFNldCB0aGUgZGVzdGluYXRpb24gcGl4ZWwgZm9ybWF0ICovCi0JZHN0X2Jhc2UgPSAoKGNoYXIgKilkc3QtPnBpeGVscyAtIG1hcHBlZF9tZW0pOwotCWJwcCA9IGRzdC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7Ci0JZm9ybWF0ID0gZHN0LT5waXRjaCB8ICgoYnBwKygoYnBwPT04KSA/IDAgOiA4KSkgPDwgMTMpOwotCi0JLyogQ2FsY3VsYXRlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmFzZSBjb29yZGluYXRlcyAqLwotCWRzdFggPSByZWN0LT54OwotCWRzdFkgPSByZWN0LT55OwotCi0JLyogRXhlY3V0ZSB0aGUgZmlsbCBjb21tYW5kICovCi0JdGRmeF93YWl0KDYpOwotCXRkZnhfb3V0MzIoRFNUQkFTRSwgZHN0X2Jhc2UpOwotCXRkZnhfb3V0MzIoRFNURk9STUFULCBmb3JtYXQpOwotCXRkZnhfb3V0MzIoQ09MT1JGT1JFLCBjb2xvcik7Ci0JdGRmeF9vdXQzMihDT01NQU5EXzJELCBDT01NQU5EXzJEX0ZJTExSRUNUKTsKLQl0ZGZ4X291dDMyKERTVFNJWkUsIHJlY3QtPncgfCAocmVjdC0+aCA8PCAxNikpOwotCXRkZnhfb3V0MzIoTEFVTkNIXzJELCBkc3RYIHwgKGRzdFkgPDwgMTYpKTsKLQotCUZCX0FkZEJ1c3lTdXJmYWNlKGRzdCk7Ci0KLQlpZiAoIGRzdCA9PSB0aGlzLT5zY3JlZW4gKSB7Ci0JCVNETF9tdXRleFYoaHdfbG9jayk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBIV0FjY2VsQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gY3VycmVudF92aWRlbzsKLQlpbnQgYnBwOwotCVVpbnQzMiBzcmNfZm9ybWF0OwotCVVpbnQzMiBkc3RfZm9ybWF0OwotCVVpbnQzMiBzcmNfYmFzZTsKLQlVaW50MzIgZHN0X2Jhc2U7Ci0JaW50IHNyY1gsIHNyY1k7Ci0JaW50IGRzdFgsIGRzdFk7Ci0JVWludDMyIGJsaXRvcDsKLQlVaW50MzIgdXNlX2NvbG9ya2V5OwotCi0JLyogRG9uJ3QgYmxpdCB0byB0aGUgZGlzcGxheSBzdXJmYWNlIHdoZW4gc3dpdGNoZWQgYXdheSAqLwotCWlmICggc3dpdGNoZWRfYXdheSApIHsKLQkJcmV0dXJuIC0yOyAvKiBubyBoYXJkd2FyZSBhY2Nlc3MgKi8KLQl9Ci0JaWYgKCBkc3QgPT0gdGhpcy0+c2NyZWVuICkgewotCQlTRExfbXV0ZXhQKGh3X2xvY2spOwotCX0KLQotCS8qIFNldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwaXhlbCBmb3JtYXQgKi8KLQlzcmNfYmFzZSA9ICgoY2hhciAqKXNyYy0+cGl4ZWxzIC0gbWFwcGVkX21lbSk7Ci0JYnBwID0gc3JjLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKLQlzcmNfZm9ybWF0ID0gc3JjLT5waXRjaCB8ICgoYnBwKygoYnBwPT04KSA/IDAgOiA4KSkgPDwgMTMpOwotCWRzdF9iYXNlID0gKChjaGFyICopZHN0LT5waXhlbHMgLSBtYXBwZWRfbWVtKTsKLQlicHAgPSBkc3QtPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCWRzdF9mb3JtYXQgPSBkc3QtPnBpdGNoIHwgKChicHArKChicHA9PTgpID8gMCA6IDgpKSA8PCAxMyk7Ci0KLQlzcmNYID0gc3JjcmVjdC0+eDsKLQlzcmNZID0gc3JjcmVjdC0+eTsKLQlkc3RYID0gZHN0cmVjdC0+eDsKLQlkc3RZID0gZHN0cmVjdC0+eTsKLQotCS8qIEFzc2VtYmxlIHRoZSBibGl0IG9wZXJhdGlvbiAqLwotCWJsaXRvcCA9IENPTU1BTkRfMkRfQklUQkxUIHwgKDB4Q0MgPDwgMjQpOwotCWlmICggc3JjWCA8PSBkc3RYICkgewotCQlibGl0b3AgfD0gQklUKDE0KTsKLQkJc3JjWCArPSAoZHN0cmVjdC0+dyAtIDEpOwotCQlkc3RYICs9IChkc3RyZWN0LT53IC0gMSk7Ci0JfQotCWlmICggc3JjWSA8PSBkc3RZICkgewotCQlibGl0b3AgfD0gQklUKDE1KTsKLQkJc3JjWSArPSAoZHN0cmVjdC0+aCAtIDEpOwotCQlkc3RZICs9IChkc3RyZWN0LT5oIC0gMSk7Ci0JfQotCi0JLyogUGVyZm9ybSB0aGUgYmxpdCEgKi8KLQlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKSB7Ci0gICAgCQl0ZGZ4X3dhaXQoMyk7Ci0gICAgCQl0ZGZ4X291dDMyKFNSQ0NPTE9SS0VZTUlOLCBzcmMtPmZvcm1hdC0+Y29sb3JrZXkpOwotICAgIAkJdGRmeF9vdXQzMihTUkNDT0xPUktFWU1BWCwgc3JjLT5mb3JtYXQtPmNvbG9ya2V5KTsKLSAgICAJCXRkZnhfb3V0MzIoUk9QXzJELCAweEFBMDApOwotCQl1c2VfY29sb3JrZXkgPSAxOwotCX0gZWxzZSB7Ci0JCXVzZV9jb2xvcmtleSA9IDA7Ci0JfQotCXRkZnhfd2FpdCg5KTsKLQl0ZGZ4X291dDMyKFNSQ0JBU0UsIChVaW50MzIpc3JjX2Jhc2UpOwotCXRkZnhfb3V0MzIoU1JDRk9STUFULCBzcmNfZm9ybWF0KTsKLQl0ZGZ4X291dDMyKERTVEJBU0UsIChVaW50MzIpZHN0X2Jhc2UpOwotCXRkZnhfb3V0MzIoRFNURk9STUFULCBzcmNfZm9ybWF0KTsKLQl0ZGZ4X291dDMyKENPTU1BTkRfMkQsIGJsaXRvcCk7Ci0JdGRmeF9vdXQzMihDT01NQU5ERVhUUkFfMkQsIHVzZV9jb2xvcmtleSk7Ci0JdGRmeF9vdXQzMihEU1RTSVpFLCBkc3RyZWN0LT53IHwgKGRzdHJlY3QtPmggPDwgMTYpKTsKLQl0ZGZ4X291dDMyKERTVFhZLCBkc3RYIHwgKGRzdFkgPDwgMTYpKTsKLQl0ZGZ4X291dDMyKExBVU5DSF8yRCwgc3JjWCB8IChzcmNZIDw8IDE2KSk7Ci0KLQlGQl9BZGRCdXN5U3VyZmFjZShzcmMpOwotCUZCX0FkZEJ1c3lTdXJmYWNlKGRzdCk7Ci0KLQlpZiAoIGRzdCA9PSB0aGlzLT5zY3JlZW4gKSB7Ci0JCVNETF9tdXRleFYoaHdfbG9jayk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBDaGVja0hXQmxpdChfVEhJUywgU0RMX1N1cmZhY2UgKnNyYywgU0RMX1N1cmZhY2UgKmRzdCkKLXsKLQlpbnQgYWNjZWxlcmF0ZWQ7Ci0KLQkvKiBTZXQgaW5pdGlhbCBhY2NlbGVyYXRpb24gb24gKi8KLQlzcmMtPmZsYWdzIHw9IFNETF9IV0FDQ0VMOwotCi0JLyogU2V0IHRoZSBzdXJmYWNlIGF0dHJpYnV0ZXMgKi8KLQlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7Ci0JCWlmICggISB0aGlzLT5pbmZvLmJsaXRfaHdfQSApIHsKLQkJCXNyYy0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOwotCQl9Ci0JfQotCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSApIHsKLQkJaWYgKCAhIHRoaXMtPmluZm8uYmxpdF9od19DQyApIHsKLQkJCXNyYy0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIGZpbmFsIHN1cmZhY2UgYmxpdCBpcyBhY2NlbGVyYXRlZCAqLwotCWFjY2VsZXJhdGVkID0gISEoc3JjLT5mbGFncyAmIFNETF9IV0FDQ0VMKTsKLQlpZiAoIGFjY2VsZXJhdGVkICkgewotCQlzcmMtPm1hcC0+aHdfYmxpdCA9IEhXQWNjZWxCbGl0OwotCX0KLQlyZXR1cm4oYWNjZWxlcmF0ZWQpOwotfQotCi12b2lkIEZCXzNEZnhBY2NlbChfVEhJUywgX191MzIgY2FyZCkKLXsKLQkvKiBXZSBoYXZlIGhhcmR3YXJlIGFjY2VsZXJhdGVkIHN1cmZhY2UgZnVuY3Rpb25zICovCi0JdGhpcy0+Q2hlY2tIV0JsaXQgPSBDaGVja0hXQmxpdDsKLQl3YWl0X3ZibCA9IFdhaXRWQkw7Ci0Jd2FpdF9pZGxlID0gV2FpdElkbGU7Ci0KLQkvKiBSZXNldCB0aGUgM0RmeCBjb250cm9sbGVyICovCi0JdGRmeF9vdXQzMihCUkVTRVJST1IwLCAwKTsKLQl0ZGZ4X291dDMyKEJSRVNFUlJPUjEsIDApOwotCi0JLyogVGhlIDNEZnggaGFzIGFuIGFjY2VsZXJhdGVkIGNvbG9yIGZpbGwgKi8KLQl0aGlzLT5pbmZvLmJsaXRfZmlsbCA9IDE7Ci0JdGhpcy0+RmlsbEhXUmVjdCA9IEZpbGxIV1JlY3Q7Ci0KLQkvKiBUaGUgM0RmeCBoYXMgYWNjZWxlcmF0ZWQgbm9ybWFsIGFuZCBjb2xvcmtleSBibGl0cyAqLwotCXRoaXMtPmluZm8uYmxpdF9odyA9IDE7Ci0JdGhpcy0+aW5mby5ibGl0X2h3X0NDID0gMTsKLQl0aGlzLT5TZXRIV0NvbG9yS2V5ID0gU2V0SFdDb2xvcktleTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiM2RmeC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmIzZGZ4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YjRhYWMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmIzZGZ4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogM0RmeCBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZm9yIHRoZSBTREwgZnJhbWVidWZmZXIgY29uc29sZSBkcml2ZXIgKi8KLQotI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCi0KLS8qIFNldCB1cCB0aGUgZHJpdmVyIGZvciAzRGZ4IGFjY2VsZXJhdGlvbiAqLwotZXh0ZXJuIHZvaWQgRkJfM0RmeEFjY2VsKF9USElTLCBfX3UzMiBjYXJkKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiZWxvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmVsby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQyOTIzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiZWxvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0jaW5jbHVkZSAiU0RMX2ZidmlkZW8uaCIKLSNpbmNsdWRlICJTRExfZmJlbG8uaCIKLQotLyoKLQljYWxpYnJhdGlvbiBkZWZhdWx0IHZhbHVlcwotCXZhbHVlcyBhcmUgcmVhZCBmcm9tIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOgotCi0JU0RMX0VMT19NSU5fWAotCVNETF9FTE9fTUFYX1gKLQlTRExfRUxPX01JTl9ZCi0JU0RMX0VMT19NQVhfWQotKi8KLQotc3RhdGljIGludCBFTE9fTUlOX1ggPSA0MDA7Ci1zdGF0aWMgaW50IEVMT19NQVhfWCA9IDM2NzA7Ci1zdGF0aWMgaW50IEVMT19NSU5fWSA9IDUwMDsKLXN0YXRpYyBpbnQgRUxPX01BWF9ZID0gMzU0MDsKLQotI2RlZmluZSBFTE9fU05BUF9TSVpFIDYKLSNkZWZpbmUgRUxPX1RPVUNIX0JZVEUJCSdUJwkKLSNkZWZpbmUgRUxPX0lECQkJJ0knCi0jZGVmaW5lIEVMT19NT0RFCQknTScKLSNkZWZpbmUgRUxPX1BBUkFNRVRFUgkJJ1AnCi0jZGVmaW5lIEVMT19SRVBPUlQJCSdCJwotI2RlZmluZSBFTE9fQUNLCQkJJ0EnCQotCi0jZGVmaW5lIEVMT19JTklUX0NIRUNLU1VNCTB4QUEKLQotI2RlZmluZSBFTE9fQlROX1BSRVNTCQkweDAxCQotI2RlZmluZSBFTE9fU1RSRUFNCQkweDAyCi0jZGVmaW5lIEVMT19CVE5fUkVMRUFTRQkJMHgwNAotCi0jZGVmaW5lIEVMT19UT1VDSF9NT0RFCQkweDAxCi0jZGVmaW5lIEVMT19TVFJFQU1fTU9ERQkJMHgwMgotI2RlZmluZSBFTE9fVU5UT1VDSF9NT0RFCTB4MDQKLSNkZWZpbmUgRUxPX1JBTkdFX0NIRUNLX01PREUJMHg0MAotI2RlZmluZSBFTE9fVFJJTV9NT0RFCQkweDAyCi0jZGVmaW5lIEVMT19DQUxJQl9NT0RFCQkweDA0Ci0jZGVmaW5lIEVMT19TQ0FMSU5HX01PREUJMHgwOAotI2RlZmluZSBFTE9fVFJBQ0tJTkdfTU9ERQkweDQwCi0KLSNkZWZpbmUgRUxPX1NFUklBTF9NQVNLCQkweEY4Ci0KLSNkZWZpbmUgRUxPX1NFUklBTF9JTwkJJzAnCi0KLSNkZWZpbmUgRUxPX01BWF9UUklBTFMJMwotI2RlZmluZSBFTE9fTUFYX1dBSVQJCTEwMDAwMAotI2RlZmluZSBFTE9fVU5UT1VDSF9ERUxBWQk1Ci0jZGVmaW5lIEVMT19SRVBPUlRfREVMQVkJMQotCi0vKgllbG9QYXJzZVBhY2tldAotKi8KLWludCBlbG9QYXJzZVBhY2tldCh1bnNpZ25lZCBjaGFyKiBtb3VzZWJ1ZiwgaW50KiBkeCwgaW50KiBkeSwgaW50KiBidXR0b25fc3RhdGUpIHsKLQlzdGF0aWMgaW50IGVsb19idXR0b24gPSAwOwotCXN0YXRpYyBpbnQgbGFzdF94ID0gMDsKLQlzdGF0aWMgaW50IGxhc3RfeSA9IDA7Ci0JaW50IHgseTsKLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgYSB0b3VjaCBwYWNrZXQgKi8KLQlpZiAobW91c2VidWZbMV0gIT0gRUxPX1RPVUNIX0JZVEUpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JeCA9ICgobW91c2VidWZbNF0gPDwgOCkgfCBtb3VzZWJ1ZlszXSk7Ci0JeSA9ICgobW91c2VidWZbNl0gPDwgOCkgfCBtb3VzZWJ1Zls1XSk7Ci0KLQlpZigoU0RMX2Ficyh4IC0gbGFzdF94KSA+IEVMT19TTkFQX1NJWkUpIHx8IChTRExfYWJzKHkgLSBsYXN0X3kpID4gRUxPX1NOQVBfU0laRSkpIHsKLQkJKmR4ID0gKChtb3VzZWJ1Zls0XSA8PCA4KSB8IG1vdXNlYnVmWzNdKTsKLQkJKmR5ID0gKChtb3VzZWJ1Zls2XSA8PCA4KSB8IG1vdXNlYnVmWzVdKTsKLQl9Ci0JZWxzZSB7Ci0JCSpkeCA9IGxhc3RfeDsKLQkJKmR5ID0gbGFzdF95OwotCX0KLQotCWxhc3RfeCA9ICpkeDsKLQlsYXN0X3kgPSAqZHk7Ci0KLQlpZiAoIChtb3VzZWJ1ZlsyXSAmIDB4MDcpID09IEVMT19CVE5fUFJFU1MgKSB7Ci0JCWVsb19idXR0b24gPSAxOwotCX0KLQlpZiAoIChtb3VzZWJ1ZlsyXSAmIDB4MDcpID09IEVMT19CVE5fUkVMRUFTRSApIHsKLQkJZWxvX2J1dHRvbiA9IDA7Ci0JfQotCi0JKmJ1dHRvbl9zdGF0ZSA9IGVsb19idXR0b247Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCUNvbnZlcnQgdGhlIHJhdyBjb29yZGluYXRlcyBmcm9tIHRoZSBFTE8gY29udHJvbGxlcgotCXRvIGEgc2NyZWVuIHBvc2l0aW9uLgotKi8KLXZvaWQgZWxvQ29udmVydFhZKF9USElTLCBpbnQgKmR4LCAgaW50ICpkeSkgewotCWludCBpbnB1dF94ID0gKmR4OwotCWludCBpbnB1dF95ID0gKmR5OwotCWludCB3aWR0aCA9IEVMT19NQVhfWCAtIEVMT19NSU5fWDsKLQlpbnQgaGVpZ2h0ID0gRUxPX01BWF9ZIC0gRUxPX01JTl9ZOwotCi0JKmR4ID0gKChpbnQpY2FjaGVfdmluZm8ueHJlcyAtICgoaW50KWNhY2hlX3ZpbmZvLnhyZXMgKiAoaW5wdXRfeCAtIEVMT19NSU5fWCkpIC8gd2lkdGgpOwotCSpkeSA9IChjYWNoZV92aW5mby55cmVzICogKGlucHV0X3kgLSBFTE9fTUlOX1kpKSAvIGhlaWdodDsKLX0KLQotCi0vKgllbG9HZXRQYWNrZXQKLSovCi1pbnQgZWxvR2V0UGFja2V0KHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgaW50KiBidWZmZXJfcCwgaW50KiBjaGVja3N1bSwgaW50IGZkKSB7Ci0JaW50IG51bV9ieXRlczsKLQlpbnQgb2s7Ci0KLQlpZihmZCA9PSAwKSB7Ci0JCW51bV9ieXRlcyA9IEVMT19QQUNLRVRfU0laRTsKLQl9Ci0JZWxzZSB7Ci0JCW51bV9ieXRlcyA9IHJlYWQoZmQsCi0JCQkoY2hhciAqKSAoYnVmZmVyICsgKmJ1ZmZlcl9wKSwKLQkJCUVMT19QQUNLRVRfU0laRSAtICpidWZmZXJfcCk7Ci0JfQotCi0JaWYgKG51bV9ieXRlcyA8IDApIHsKLSNpZmRlZiBERUJVR19NT1VTRQotCQlmcHJpbnRmKHN0ZGVyciwgIlN5c3RlbSBlcnJvciB3aGlsZSByZWFkaW5nIGZyb20gRWxvZ3JhcGhpY3MgdG91Y2hzY3JlZW4uXG4iKTsKLSNlbmRpZgotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3aGlsZSAobnVtX2J5dGVzKSB7Ci0JCWlmICgoKmJ1ZmZlcl9wID09IDApICYmIChidWZmZXJbMF0gIT0gRUxPX1NUQVJUX0JZVEUpKSB7Ci0JCQlTRExfbWVtY3B5KCZidWZmZXJbMF0sICZidWZmZXJbMV0sIG51bV9ieXRlcy0xKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICgqYnVmZmVyX3AgPCBFTE9fUEFDS0VUX1NJWkUtMSkgewotCQkJCSpjaGVja3N1bSA9ICpjaGVja3N1bSArIGJ1ZmZlclsqYnVmZmVyX3BdOwotCQkJCSpjaGVja3N1bSA9ICpjaGVja3N1bSAlIDI1NjsKLQkJCX0KLQkJCSgqYnVmZmVyX3ApKys7Ci0JCX0KLQkJbnVtX2J5dGVzLS07Ci0JfQotCi0JaWYgKCpidWZmZXJfcCA9PSBFTE9fUEFDS0VUX1NJWkUpIHsKLQkJb2sgPSAoKmNoZWNrc3VtID09IGJ1ZmZlcltFTE9fUEFDS0VUX1NJWkUtMV0pOwotCQkqY2hlY2tzdW0gPSBFTE9fSU5JVF9DSEVDS1NVTTsKLQkJKmJ1ZmZlcl9wID0gMDsKLQotCQlpZiAoIW9rKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXJldHVybiAxOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKiBlbG9TZW5kUGFja2V0Ci0qLwotCi1pbnQgZWxvU2VuZFBhY2tldCh1bnNpZ25lZCBjaGFyKiBwYWNrZXQsIGludCBmZCkKLXsKLQlpbnQgaSwgcmVzdWx0OwotCWludCBzdW0gPSBFTE9fSU5JVF9DSEVDS1NVTTsKLQotCXBhY2tldFswXSA9IEVMT19TVEFSVF9CWVRFOwotCWZvciAoaSA9IDA7IGkgPCBFTE9fUEFDS0VUX1NJWkUtMTsgaSsrKSB7Ci0JCXN1bSArPSBwYWNrZXRbaV07Ci0JCXN1bSAmPSAweEZGOwotCX0KLQlwYWNrZXRbRUxPX1BBQ0tFVF9TSVpFLTFdID0gc3VtOwotCi0JcmVzdWx0ID0gd3JpdGUoZmQsIHBhY2tldCwgRUxPX1BBQ0tFVF9TSVpFKTsKLQotCWlmIChyZXN1bHQgIT0gRUxPX1BBQ0tFVF9TSVpFKSB7Ci0jaWZkZWYgREVCVUdfTU9VU0UKLQkJcHJpbnRmKCJTeXN0ZW0gZXJyb3Igd2hpbGUgc2VuZGluZyB0byBFbG9ncmFwaGljcyB0b3VjaHNjcmVlbi5cbiIpOwotI2VuZGlmCi0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIDE7Ci0JfQotfQotCi0KLS8qCWVsb1dhaXRGb3JJbnB1dAotICovCi1pbnQgZWxvV2FpdEZvcklucHV0KGludCBmZCwgaW50IHRpbWVvdXQpCi17Ci0JZmRfc2V0IHJlYWRmZHM7Ci0Jc3RydWN0IHRpbWV2YWwgdG87Ci0JaW50IHI7Ci0KLQlGRF9aRVJPKCZyZWFkZmRzKTsKLQlGRF9TRVQoZmQsICZyZWFkZmRzKTsKLQl0by50dl9zZWMgPSAwOwotCXRvLnR2X3VzZWMgPSB0aW1lb3V0OwotCi0JciA9IHNlbGVjdChGRF9TRVRTSVpFLCAmcmVhZGZkcywgTlVMTCwgTlVMTCwgJnRvKTsKLQlyZXR1cm4gcjsKLX0KLQotLyoJZWxvV2FpdFJlcGx5Ci0gKi8KLWludCBlbG9XYWl0UmVwbHkodW5zaWduZWQgY2hhciB0eXBlLCB1bnNpZ25lZCBjaGFyICpyZXBseSwgaW50IGZkKSB7Ci0JaW50IG9rOwotCWludCBpLCByZXN1bHQ7Ci0JaW50IHJlcGx5X3AgPSAwOwotCWludCBzdW0gPSBFTE9fSU5JVF9DSEVDS1NVTTsKLQotCWkgPSBFTE9fTUFYX1RSSUFMUzsKLQlkbyB7Ci0JCW9rID0gMDsKLQotCQlyZXN1bHQgPSBlbG9XYWl0Rm9ySW5wdXQoZmQsIEVMT19NQVhfV0FJVCk7Ci0KLQkJaWYgKHJlc3VsdCA+IDApIHsKLQkJCW9rID0gZWxvR2V0UGFja2V0KHJlcGx5LCAmcmVwbHlfcCwgJnN1bSwgZmQpOwotCi0JCQlpZiAob2sgJiYgcmVwbHlbMV0gIT0gdHlwZSAmJiB0eXBlICE9IEVMT19QQVJBTUVURVIpIHsKLSNpZmRlZiBERUJVR19NT1VTRQotCQkJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgcmVwbHkgcmVjZWl2ZWRcbiIpOwotI2VuZGlmCi0JCQkJb2sgPSAwOwotCQkJfQotCQl9Ci0JCWVsc2UgewotI2lmZGVmIERFQlVHX01PVVNFCi0JCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGlucHV0IVxuIik7Ci0jZW5kaWYKLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gMCkgewotCQkJaS0tOwotCQl9Ci0JfSB3aGlsZSghb2sgJiYgKGk+MCkpOwotCi0JcmV0dXJuIG9rOwotfQotCi0KLS8qCWVsb1dhaXRBY2sKLSAqLwotCi1pbnQgZWxvV2FpdEFjayhpbnQgZmQpIHsKLQl1bnNpZ25lZCBjaGFyIHBhY2tldFtFTE9fUEFDS0VUX1NJWkVdOwotCWludCBpLCBuYl9lcnJvcnM7Ci0KLQlpZiAoZWxvV2FpdFJlcGx5KEVMT19BQ0ssIHBhY2tldCwgZmQpKSB7Ci0JCWZvciAoaSA9IDAsIG5iX2Vycm9ycyA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCWlmIChwYWNrZXRbMiArIGldICE9ICcwJykgewotCQkJCW5iX2Vycm9ycysrOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5iX2Vycm9ycyAhPSAwKSB7Ci0jaWZkZWYgREVCVUdfTU9VU0UKLQkJCWZwcmludGYoc3RkZXJyLCAiRWxvZ3JhcGhpY3MgYWNrbm93bGVkZ2UgcGFja2V0IHJlcG9ydHMgJWQgZXJyb3JzXG4iLCBuYl9lcnJvcnMpOwotI2VuZGlmCi0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLQotLyoJZWxvU2VuZFF1ZXJ5IC0tCi0qLwotaW50IGVsb1NlbmRRdWVyeSh1bnNpZ25lZCBjaGFyICpyZXF1ZXN0LCB1bnNpZ25lZCBjaGFyKiByZXBseSwgaW50IGZkKSB7Ci0JaW50IG9rOwotCi0JaWYgKGVsb1NlbmRQYWNrZXQocmVxdWVzdCwgZmQpKSB7Ci0JCW9rID0gZWxvV2FpdFJlcGx5KHRvdXBwZXIocmVxdWVzdFsxXSksIHJlcGx5LCBmZCk7Ci0JCWlmIChvaykgewotCQkJb2sgPSBlbG9XYWl0QWNrKGZkKTsKLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLQotLyoJZWxvU2VuZENvbnRyb2wKLSovCi1pbnQgZWxvU2VuZENvbnRyb2wodW5zaWduZWQgY2hhciogY29udHJvbCwgaW50IGZkKSB7Ci0JaWYgKGVsb1NlbmRQYWNrZXQoY29udHJvbCwgZmQpKSB7Ci0JCXJldHVybiBlbG9XYWl0QWNrKGZkKTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotLyoJZWxvSW5pdENvbnRyb2xsZXIKLSovCi1pbnQgZWxvSW5pdENvbnRyb2xsZXIoaW50IGZkKSB7Ci0JdW5zaWduZWQgY2hhciByZXFbRUxPX1BBQ0tFVF9TSVpFXTsKLQl1bnNpZ25lZCBjaGFyIHJlcGx5W0VMT19QQUNLRVRfU0laRV07Ci0JY29uc3QgY2hhciAqYnVmZmVyID0gTlVMTDsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCXN0cnVjdCB0ZXJtaW9zIG1vdXNlX3Rlcm1pb3M7Ci0KLQkvKiB0cnkgdG8gcmVhZCB0aGUgY2FsaWJyYXRpb24gdmFsdWVzICovCi0JYnVmZmVyID0gU0RMX2dldGVudigiU0RMX0VMT19NSU5fWCIpOwotCWlmKGJ1ZmZlcikgewotCQlFTE9fTUlOX1ggPSBTRExfYXRvaShidWZmZXIpOwotCX0KLQlidWZmZXIgPSBTRExfZ2V0ZW52KCJTRExfRUxPX01BWF9YIik7Ci0JaWYoYnVmZmVyKSB7Ci0JCUVMT19NQVhfWCA9IFNETF9hdG9pKGJ1ZmZlcik7Ci0JfQotCWJ1ZmZlciA9IFNETF9nZXRlbnYoIlNETF9FTE9fTUlOX1kiKTsKLQlpZihidWZmZXIpIHsKLQkJRUxPX01JTl9ZID0gU0RMX2F0b2koYnVmZmVyKTsKLQl9Ci0JYnVmZmVyID0gU0RMX2dldGVudigiU0RMX0VMT19NQVhfWSIpOwotCWlmKGJ1ZmZlcikgewotCQlFTE9fTUFYX1kgPSBTRExfYXRvaShidWZmZXIpOwotCX0KLQotI2lmZGVmIERFQlVHX01PVVNFCi0JZnByaW50Ziggc3RkZXJyLCAiRUxPIGNhbGlicmF0aW9uIHZhbHVlczpcbm1pbl94OiAlaVxubWF4X3g6ICVpXG5taW5feTogJWlcbm1heF95OiAlaVxuIiwKLQkJRUxPX01JTl9YLAotCQlFTE9fTUFYX1gsCi0JCUVMT19NSU5fWSwKLQkJRUxPX01BWF9ZKTsKLSNlbmRpZgotCi0JLyogc2V0IGNvbW0gcGFyYW1zICovCi0JU0RMX21lbXNldCgmbW91c2VfdGVybWlvcywgMCwgc2l6ZW9mKG1vdXNlX3Rlcm1pb3MpKTsKLQltb3VzZV90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgQ0xPQ0FMOwotCW1vdXNlX3Rlcm1pb3MuY19jY1tWTUlOXSA9IDE7Ci0JcmVzdWx0ID0gdGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmbW91c2VfdGVybWlvcyk7Ci0KLQlpZiAocmVzdWx0IDwgMCkgewotI2lmZGVmIERFQlVHX01PVVNFCi0JCWZwcmludGYoIHN0ZGVyciwgIlVuYWJsZSB0byBjb25maWd1cmUgRWxvZ3JhcGhpY3MgdG91Y2hzY3JlZW4gcG9ydFxuIik7Ci0jZW5kaWYKLQkJcmV0dXJuIDA7Ci0JfQotCi0JU0RMX21lbXNldChyZXEsIDAsIEVMT19QQUNLRVRfU0laRSk7Ci0JcmVxWzFdID0gdG9sb3dlcihFTE9fUEFSQU1FVEVSKTsKLQlpZiAoIWVsb1NlbmRRdWVyeShyZXEsIHJlcGx5LCBmZCkpIHsKLSNpZmRlZiBERUJVR19NT1VTRQotCQlmcHJpbnRmKCBzdGRlcnIsICJOb3QgYXQgdGhlIHNwZWNpZmllZCByYXRlIG9yIG1vZGVsIDIzMTAsIHdpbGwgY29udGludWVcbiIpOwotI2VuZGlmCi0JfQotCi0JU0RMX21lbXNldChyZXEsIDAsIEVMT19QQUNLRVRfU0laRSk7Ci0JcmVxWzFdID0gdG9sb3dlcihFTE9fSUQpOwotCWlmIChlbG9TZW5kUXVlcnkocmVxLCByZXBseSwgZmQpKSB7Ci0jaWZkZWYgREVCVUdfTU9VU0UKLQkJZnByaW50ZihzdGRlcnIsICJPaywgY29udHJvbGxlciBjb25maWd1cmVkIVxuIik7Ci0jZW5kaWYKLQl9Ci0JZWxzZSB7Ci0jaWZkZWYgREVCVUdfTU9VU0UKLQkJZnByaW50Ziggc3RkZXJyLCAiVW5hYmxlIHRvIGFzayBFbG9ncmFwaGljcyB0b3VjaHNjcmVlbiBpZGVudGlmaWNhdGlvblxuIik7Ci0jZW5kaWYKLQkJcmV0dXJuIDA7Ci0JfQotCi0JU0RMX21lbXNldChyZXEsIDAsIEVMT19QQUNLRVRfU0laRSk7Ci0JcmVxWzFdID0gRUxPX01PREU7Ci0JcmVxWzNdID0gRUxPX1RPVUNIX01PREUgfCBFTE9fU1RSRUFNX01PREUgfCBFTE9fVU5UT1VDSF9NT0RFOwotCXJlcVs0XSA9IEVMT19UUkFDS0lOR19NT0RFOwotCWlmICghZWxvU2VuZENvbnRyb2wocmVxLCBmZCkpIHsKLSNpZmRlZiBERUJVR19NT1VTRQotCQlmcHJpbnRmKCBzdGRlcnIsICJVbmFibGUgdG8gY2hhbmdlIEVsb2dyYXBoaWNzIHRvdWNoc2NyZWVuIG9wZXJhdGluZyBtb2RlXG4iKTsKLSNlbmRpZgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlTRExfbWVtc2V0KHJlcSwgMCwgRUxPX1BBQ0tFVF9TSVpFKTsKLQlyZXFbMV0gPSBFTE9fUkVQT1JUOwotCXJlcVsyXSA9IEVMT19VTlRPVUNIX0RFTEFZOwotCXJlcVszXSA9IEVMT19SRVBPUlRfREVMQVk7Ci0JaWYgKCFlbG9TZW5kQ29udHJvbChyZXEsIGZkKSkgewotI2lmZGVmIERFQlVHX01PVVNFCi0JCWZwcmludGYoIHN0ZGVyciwgIlVuYWJsZSB0byBjaGFuZ2UgRWxvZ3JhcGhpY3MgdG91Y2hzY3JlZW4gcmVwb3J0cyB0aW1pbmdzXG4iKTsKLSNlbmRpZgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGVsb1JlYWRQb3NpdGlvbihfVEhJUywgaW50IGZkLCBpbnQqIHgsIGludCogeSwgaW50KiBidXR0b25fc3RhdGUsIGludCogcmVhbHgsIGludCogcmVhbHkpIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbRUxPX1BBQ0tFVF9TSVpFXTsKLSAgICAgICAgaW50IHBvaW50ZXIgPSAwOwotICAgICAgICBpbnQgY2hlY2tzdW0gPSBFTE9fSU5JVF9DSEVDS1NVTTsKLQotICAgICAgICB3aGlsZShwb2ludGVyIDwgRUxPX1BBQ0tFVF9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgaWYoZWxvR2V0UGFja2V0KGJ1ZmZlciwgJnBvaW50ZXIsICZjaGVja3N1bSwgZmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZighZWxvUGFyc2VQYWNrZXQoYnVmZmVyLCByZWFseCwgcmVhbHksIGJ1dHRvbl9zdGF0ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgICp4ID0gKnJlYWx4OwotICAgICAgICAqeSA9ICpyZWFseTsKLQotICAgICAgICBlbG9Db252ZXJ0WFkodGhpcywgeCwgeSk7Ci0JCi0JcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmVsby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJlbG8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0NjY0NS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmVsby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgU0RMX2ZiZWxvX2gKLSNkZWZpbmUgU0RMX2ZiZWxvX2gKLQotI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCi0KLS8qIEVMTyAqLwotI2RlZmluZSBFTE9fUEFDS0VUX1NJWkUJMTAKLSNkZWZpbmUgRUxPX1NUQVJUX0JZVEUJCSdVJwotCi0vKgllbG9Db252ZXJ0WFkKLQlDb252ZXJ0IHRoZSByYXcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgRUxPIGNvbnRyb2xsZXIKLQl0byBhIHNjcmVlbiBwb3NpdGlvbi4KLSovCi12b2lkIGVsb0NvbnZlcnRYWShfVEhJUywgaW50ICpkeCwgIGludCAqZHkpOwotCi0vKgllbG9Jbml0Q29udHJvbGxlcihpbnQgZmQpCi0JSW5pdGlhbGl6ZSB0aGUgRUxPIHNlcmlhbCB0b3VjaHNjcmVlbiBjb250cm9sbGVyCi0qLwotaW50IGVsb0luaXRDb250cm9sbGVyKGludCBmZCk7Ci0KLS8qCWVsb1BhcnNlUGFja2V0Ci0JZXh0cmFjdCBwb3NpdGlvbiBhbmQgYnV0dG9uIHN0YXRlIGZyb20gYSBwYWNrZXQKLSovCi1pbnQgZWxvUGFyc2VQYWNrZXQodW5zaWduZWQgY2hhciogbW91c2VidWYsIGludCogZHgsIGludCogZHksIGludCogYnV0dG9uX3N0YXRlKTsKLQotLyoJZWxvUmVhZFBvc2l0aW9uCi0JcmVhZCBhIHBhY2tldCBhbmQgZ2V0IHRoZSBjdXJzb3IgcG9zaXRpb24KLSovCi0KLWludCBlbG9SZWFkUG9zaXRpb24oX1RISVMsIGludCBmZCwgaW50KiB4LCBpbnQqIHksIGludCogYnV0dG9uX3N0YXRlLCBpbnQqIHJlYWx4LCBpbnQqIHJlYWx5KTsKLQotI2VuZGlmCS8qIFNETF9mYmVsb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJldmVudHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlODRiMy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmV2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgY29uc29sZSBldmVudHMgaW50byBTREwgZXZlbnRzICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0vKiBGb3IgcGFyc2luZyAvcHJvYyAqLwotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC92dC5oPgotI2luY2x1ZGUgPGxpbnV4L2tkLmg+Ci0jaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KLQotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2ZiZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfZmJrZXlzLmgiCi0KLSNpbmNsdWRlICJTRExfZmJlbG8uaCIKLQotI2lmbmRlZiBHUE1fTk9ERV9GSUZPCi0jZGVmaW5lIEdQTV9OT0RFX0ZJRk8JIi9kZXYvZ3BtZGF0YSIKLSNlbmRpZgotCi0vKiNkZWZpbmUgREVCVUdfS0VZQk9BUkQqLwotLyojZGVmaW5lIERFQlVHX01PVVNFKi8KLQotLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlcyBmcm9tIGEgY29uc29sZSBzY2FuY29kZSB0byBhIFNETCBrZXlzeW0gKi8KLSNkZWZpbmUgTlVNX1ZHQUtFWU1BUFMJKDE8PEtHX0NBUFNTSElGVCkKLXN0YXRpYyBVaW50MTYgdmdhX2tleW1hcFtOVU1fVkdBS0VZTUFQU11bTlJfS0VZU107Ci1zdGF0aWMgU0RMS2V5IGtleW1hcFsxMjhdOwotc3RhdGljIFVpbnQxNiBrZXltYXBfdGVtcFsxMjhdOyAvKiBvbmx5IHVzZWQgYXQgc3RhcnR1cCAqLwotc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSk7Ci0KLS8qIFVnaCwgd2UgaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGtlcm5lbCdzIGtleXN5bSBtYXBwaW5nIGNvZGUuLi4KLSAgIE9oLCBpdCdzIG5vdCBzbyBiYWQuIDotKQotCi0gICBGSVhNRTogQWRkIGtleWJvYXJkIExFRCBoYW5kbGluZyBjb2RlCi0gKi8KLXN0YXRpYyB2b2lkIEZCX3ZnYWluaXRrZXltYXBzKGludCBmZCkKLXsKLQlzdHJ1Y3Qga2JlbnRyeSBlbnRyeTsKLQlpbnQgbWFwLCBpOwotCi0JLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgYXJlIHBhc3NlZCBhIGNsb3NlZCBrZXlib2FyZCAqLwotCWlmICggZmQgPCAwICkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogTG9hZCBhbGwgdGhlIGtleXN5bSBtYXBwaW5ncyAqLwotCWZvciAoIG1hcD0wOyBtYXA8TlVNX1ZHQUtFWU1BUFM7ICsrbWFwICkgewotCQlTRExfbWVtc2V0KHZnYV9rZXltYXBbbWFwXSwgMCwgTlJfS0VZUypzaXplb2YoVWludDE2KSk7Ci0JCWZvciAoIGk9MDsgaTxOUl9LRVlTOyArK2kgKSB7Ci0JCQllbnRyeS5rYl90YWJsZSA9IG1hcDsKLQkJCWVudHJ5LmtiX2luZGV4ID0gaTsKLQkJCWlmICggaW9jdGwoZmQsIEtER0tCRU5ULCAmZW50cnkpID09IDAgKSB7Ci0JCQkJLyogZmlsbCBrZXl0ZW1wLiBUaGlzIHJlcGxhY2VzIFNETF9mYmtleXMuaCAqLwotCQkJCWlmICggKG1hcCA9PSAwKSAmJiAoaTwxMjgpICkgewotCQkJCQlrZXltYXBfdGVtcFtpXSA9IGVudHJ5LmtiX3ZhbHVlOwotCQkJCX0KLQkJCQkvKiBUaGUgIkVudGVyIiBrZXkgaXMgYSBzcGVjaWFsIGNhc2UgKi8KLQkJCQlpZiAoIGVudHJ5LmtiX3ZhbHVlID09IEtfRU5URVIgKSB7Ci0JCQkJCWVudHJ5LmtiX3ZhbHVlID0gSyhLVF9BU0NJSSwxMyk7Ci0JCQkJfQotCQkJCS8qIEhhbmRsZSBudW1wYWQgc3BlY2lhbGx5IGFzIHdlbGwgKi8KLQkJCQlpZiAoIEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX1BBRCApIHsKLQkJCQkJc3dpdGNoICggZW50cnkua2JfdmFsdWUgKSB7Ci0JCQkJCWNhc2UgS19QMDoKLQkJCQkJY2FzZSBLX1AxOgotCQkJCQljYXNlIEtfUDI6Ci0JCQkJCWNhc2UgS19QMzoKLQkJCQkJY2FzZSBLX1A0OgotCQkJCQljYXNlIEtfUDU6Ci0JCQkJCWNhc2UgS19QNjoKLQkJCQkJY2FzZSBLX1A3OgotCQkJCQljYXNlIEtfUDg6Ci0JCQkJCWNhc2UgS19QOToKLQkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1lbnRyeS5rYl92YWx1ZTsKLQkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXSs9ICcwJzsKLQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgS19QUExVUzoKLQkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcrJyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIEtfUE1JTlVTOgotCQkJCQkJdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJy0nKTsKLQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgS19QU1RBUjoKLQkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcqJyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIEtfUFNMQVNIOgotCQkJCQkJdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJy8nKTsKLQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgS19QRU5URVI6Ci0JCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnXHInKTsKLQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgS19QQ09NTUE6Ci0JCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLCcpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBLX1BET1Q6Ci0JCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLicpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQkvKiBEbyB0aGUgbm9ybWFsIGtleSB0cmFuc2xhdGlvbiAqLwotCQkJCWlmICggKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0xBVElOKSB8fAotCQkJCQkgKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0FTQ0lJKSB8fAotCQkJCQkgKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0xFVFRFUikgKSB7Ci0JCQkJCXZnYV9rZXltYXBbbWFwXVtpXSA9IGVudHJ5LmtiX3ZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotaW50IEZCX0luR3JhcGhpY3NNb2RlKF9USElTKQotewotCXJldHVybigoa2V5Ym9hcmRfZmQgPj0gMCkgJiYgKHNhdmVkX2tiZF9tb2RlID49IDApKTsKLX0KLQotaW50IEZCX0VudGVyR3JhcGhpY3NNb2RlKF9USElTKQotewotCXN0cnVjdCB0ZXJtaW9zIGtleWJvYXJkX3Rlcm1pb3M7Ci0KLQkvKiBTZXQgbWVkaXVtLXJhdyBrZXlib2FyZCBtb2RlICovCi0JaWYgKCAoa2V5Ym9hcmRfZmQgPj0gMCkgJiYgIUZCX0luR3JhcGhpY3NNb2RlKHRoaXMpICkgewotCi0JCS8qIFN3aXRjaCB0byB0aGUgY29ycmVjdCB2aXJ0dWFsIHRlcm1pbmFsICovCi0JCWlmICggY3VycmVudF92dCA+IDAgKSB7Ci0JCQlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXRlOwotCi0JCQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBWVF9HRVRTVEFURSwgJnZ0c3RhdGUpID09IDAgKSB7Ci0JCQkJc2F2ZWRfdnQgPSB2dHN0YXRlLnZfYWN0aXZlOwotCQkJfQotCQkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgVlRfQUNUSVZBVEUsIGN1cnJlbnRfdnQpID09IDAgKSB7Ci0JCQkJaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX1dBSVRBQ1RJVkUsIGN1cnJlbnRfdnQpOwotCQkJfQotCQl9Ci0KLQkJLyogU2V0IHRoZSB0ZXJtaW5hbCBpbnB1dCBtb2RlICovCi0JCWlmICggdGNnZXRhdHRyKGtleWJvYXJkX2ZkLCAmc2F2ZWRfa2JkX3Rlcm1pb3MpIDwgMCApIHsKLQkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGdldCB0ZXJtaW5hbCBhdHRyaWJ1dGVzIik7Ci0JCQlpZiAoIGtleWJvYXJkX2ZkID4gMCApIHsKLQkJCQljbG9zZShrZXlib2FyZF9mZCk7Ci0JCQl9Ci0JCQlrZXlib2FyZF9mZCA9IC0xOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBLREdLQk1PREUsICZzYXZlZF9rYmRfbW9kZSkgPCAwICkgewotCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gZ2V0IGN1cnJlbnQga2V5Ym9hcmQgbW9kZSIpOwotCQkJaWYgKCBrZXlib2FyZF9mZCA+IDAgKSB7Ci0JCQkJY2xvc2Uoa2V5Ym9hcmRfZmQpOwotCQkJfQotCQkJa2V5Ym9hcmRfZmQgPSAtMTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJa2V5Ym9hcmRfdGVybWlvcyA9IHNhdmVkX2tiZF90ZXJtaW9zOwotCQlrZXlib2FyZF90ZXJtaW9zLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgSVNJRyk7Ci0JCWtleWJvYXJkX3Rlcm1pb3MuY19pZmxhZyAmPSB+KElTVFJJUCB8IElHTkNSIHwgSUNSTkwgfCBJTkxDUiB8IElYT0ZGIHwgSVhPTik7Ci0JCWtleWJvYXJkX3Rlcm1pb3MuY19jY1tWTUlOXSA9IDA7Ci0JCWtleWJvYXJkX3Rlcm1pb3MuY19jY1tWVElNRV0gPSAwOwotCQlpZiAodGNzZXRhdHRyKGtleWJvYXJkX2ZkLCBUQ1NBRkxVU0gsICZrZXlib2FyZF90ZXJtaW9zKSA8IDApIHsKLQkJCUZCX0Nsb3NlS2V5Ym9hcmQodGhpcyk7Ci0JCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBzZXQgdGVybWluYWwgYXR0cmlidXRlcyIpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQkvKiBUaGlzIHdpbGwgZmFpbCBpZiB3ZSBhcmVuJ3Qgcm9vdCBvciB0aGlzIGlzbid0IG91ciB0dHkgKi8KLQkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgS0RTS0JNT0RFLCBLX01FRElVTVJBVykgPCAwICkgewotCQkJRkJfQ2xvc2VLZXlib2FyZCh0aGlzKTsKLQkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIHNldCBrZXlib2FyZCBpbiByYXcgbW9kZSIpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBLRFNFVE1PREUsIEtEX0dSQVBISUNTKSA8IDAgKSB7Ci0JCQlGQl9DbG9zZUtleWJvYXJkKHRoaXMpOwotCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gc2V0IGtleWJvYXJkIGluIGdyYXBoaWNzIG1vZGUiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJLyogUHJldmVudCBzd2l0Y2hpbmcgdGhlIHZpcnR1YWwgdGVybWluYWwgKi8KLQkJaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX0xPQ0tTV0lUQ0gsIDEpOwotCX0KLQlyZXR1cm4oa2V5Ym9hcmRfZmQpOwotfQotCi12b2lkIEZCX0xlYXZlR3JhcGhpY3NNb2RlKF9USElTKQotewotCWlmICggRkJfSW5HcmFwaGljc01vZGUodGhpcykgKSB7Ci0JCWlvY3RsKGtleWJvYXJkX2ZkLCBLRFNFVE1PREUsIEtEX1RFWFQpOwotCQlpb2N0bChrZXlib2FyZF9mZCwgS0RTS0JNT0RFLCBzYXZlZF9rYmRfbW9kZSk7Ci0JCXRjc2V0YXR0cihrZXlib2FyZF9mZCwgVENTQUZMVVNILCAmc2F2ZWRfa2JkX3Rlcm1pb3MpOwotCQlzYXZlZF9rYmRfbW9kZSA9IC0xOwotCi0JCS8qIEhlYWQgYmFjayBvdmVyIHRvIHRoZSBvcmlnaW5hbCB2aXJ0dWFsIHRlcm1pbmFsICovCi0JCWlvY3RsKGtleWJvYXJkX2ZkLCBWVF9VTkxPQ0tTV0lUQ0gsIDEpOwotCQlpZiAoIHNhdmVkX3Z0ID4gMCApIHsKLQkJCWlvY3RsKGtleWJvYXJkX2ZkLCBWVF9BQ1RJVkFURSwgc2F2ZWRfdnQpOwotCQl9Ci0JfQotfQotCi12b2lkIEZCX0Nsb3NlS2V5Ym9hcmQoX1RISVMpCi17Ci0JaWYgKCBrZXlib2FyZF9mZCA+PSAwICkgewotCQlGQl9MZWF2ZUdyYXBoaWNzTW9kZSh0aGlzKTsKLQkJaWYgKCBrZXlib2FyZF9mZCA+IDAgKSB7Ci0JCQljbG9zZShrZXlib2FyZF9mZCk7Ci0JCX0KLQl9Ci0Ja2V5Ym9hcmRfZmQgPSAtMTsKLX0KLQotaW50IEZCX09wZW5LZXlib2FyZChfVEhJUykKLXsKLQkvKiBPcGVuIG9ubHkgaWYgbm90IGFscmVhZHkgb3BlbmVkICovCi0gCWlmICgga2V5Ym9hcmRfZmQgPCAwICkgewotCQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR0eTBbXSA9IHsgIi9kZXYvdHR5MCIsICIvZGV2L3ZjLzAiLCBOVUxMIH07Ci0JCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmNzW10gPSB7ICIvZGV2L3ZjLyVkIiwgIi9kZXYvdHR5JWQiLCBOVUxMIH07Ci0JCWludCBpLCB0dHkwX2ZkOwotCi0JCS8qIFRyeSB0byBxdWVyeSBmb3IgYSBmcmVlIHZpcnR1YWwgdGVybWluYWwgKi8KLQkJdHR5MF9mZCA9IC0xOwotCQlmb3IgKCBpPTA7IHR0eTBbaV0gJiYgKHR0eTBfZmQgPCAwKTsgKytpICkgewotCQkJdHR5MF9mZCA9IG9wZW4odHR5MFtpXSwgT19XUk9OTFksIDApOwotCQl9Ci0JCWlmICggdHR5MF9mZCA8IDAgKSB7Ci0JCQl0dHkwX2ZkID0gZHVwKDApOyAvKiBNYXliZSBzdGRpbiBpcyBhIFZUPyAqLwotCQl9Ci0JCWlvY3RsKHR0eTBfZmQsIFZUX09QRU5RUlksICZjdXJyZW50X3Z0KTsKLQkJY2xvc2UodHR5MF9mZCk7Ci0JCWlmICggKGdldGV1aWQoKSA9PSAwKSAmJiAoY3VycmVudF92dCA+IDApICkgewotCQkJZm9yICggaT0wOyB2Y3NbaV0gJiYgKGtleWJvYXJkX2ZkIDwgMCk7ICsraSApIHsKLQkJCQljaGFyIHZ0cGF0aFsxMl07Ci0KLQkJCQlTRExfc25wcmludGYodnRwYXRoLCBTRExfYXJyYXlzaXplKHZ0cGF0aCksIHZjc1tpXSwgY3VycmVudF92dCk7Ci0JCQkJa2V5Ym9hcmRfZmQgPSBvcGVuKHZ0cGF0aCwgT19SRFdSLCAwKTsKLSNpZmRlZiBERUJVR19LRVlCT0FSRAotCQkJCWZwcmludGYoc3RkZXJyLCAidnRwYXRoID0gJXMsIGZkID0gJWRcbiIsCi0JCQkJCXZ0cGF0aCwga2V5Ym9hcmRfZmQpOwotI2VuZGlmIC8qIERFQlVHX0tFWUJPQVJEICovCi0KLQkJCQkvKiBUaGlzIG5lZWRzIHRvIGJlIG91ciBjb250cm9sbGluZyB0dHkKLQkJCQkgICBzbyB0aGF0IHRoZSBrZXJuZWwgaW9jdGwoKSBjYWxscyB3b3JrCi0JCQkJKi8KLQkJCQlpZiAoIGtleWJvYXJkX2ZkID49IDAgKSB7Ci0JCQkJCXR0eTBfZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUiwgMCk7Ci0JCQkJCWlmICggdHR5MF9mZCA+PSAwICkgewotCQkJCQkJaW9jdGwodHR5MF9mZCwgVElPQ05PVFRZLCAwKTsKLQkJCQkJCWNsb3NlKHR0eTBfZmQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gCQlpZiAoIGtleWJvYXJkX2ZkIDwgMCApIHsKLQkJCS8qIExhc3QgcmVzb3J0LCBtYXliZSBvdXIgdHR5IGlzIGEgdXNhYmxlIFZUICovCi0JCQlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXRlOwotCi0JCQlrZXlib2FyZF9mZCA9IG9wZW4oIi9kZXYvdHR5IiwgT19SRFdSKTsKLQotCQkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgVlRfR0VUU1RBVEUsICZ2dHN0YXRlKSA9PSAwICkgewotCQkJCWN1cnJlbnRfdnQgPSB2dHN0YXRlLnZfYWN0aXZlOwotCQkJfSBlbHNlIHsKLQkJCQljdXJyZW50X3Z0ID0gMDsKLQkJCX0KLSAJCX0KLSNpZmRlZiBERUJVR19LRVlCT0FSRAotCQlmcHJpbnRmKHN0ZGVyciwgIkN1cnJlbnQgVlQ6ICVkXG4iLCBjdXJyZW50X3Z0KTsKLSNlbmRpZgotIAkJc2F2ZWRfa2JkX21vZGUgPSAtMTsKLQotCQkvKiBNYWtlIHN1cmUgdGhhdCBvdXIgaW5wdXQgaXMgYSBjb25zb2xlIHRlcm1pbmFsICovCi0JCXsgaW50IGR1bW15OwotCQkgIGlmICggaW9jdGwoa2V5Ym9hcmRfZmQsIEtER0tCTU9ERSwgJmR1bW15KSA8IDAgKSB7Ci0JCQljbG9zZShrZXlib2FyZF9mZCk7Ci0JCQlrZXlib2FyZF9mZCA9IC0xOwotCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gb3BlbiBhIGNvbnNvbGUgdGVybWluYWwiKTsKLQkJICB9Ci0JCX0KLQotCQkvKiBTZXQgdXAga2V5bWFwICovCi0JCUZCX3ZnYWluaXRrZXltYXBzKGtleWJvYXJkX2ZkKTsKLSAJfQotIAlyZXR1cm4oa2V5Ym9hcmRfZmQpOwotfQotCi1zdGF0aWMgZW51bSB7Ci0JTU9VU0VfTk9ORSA9IC0xLAotCU1PVVNFX01TQywJLyogTm90ZTogR1BNIHVzZXMgdGhlIE1TQyBwcm90b2NvbCAqLwotCU1PVVNFX1BTMiwKLQlNT1VTRV9JTVBTMiwKLQlNT1VTRV9NUywKLQlNT1VTRV9CTSwKLQlNT1VTRV9FTE8sCi0JTU9VU0VfVFNMSUIsCi0JTlVNX01PVVNFX0RSVlMKLX0gbW91c2VfZHJ2ID0gTU9VU0VfTk9ORTsKLQotdm9pZCBGQl9DbG9zZU1vdXNlKF9USElTKQotewotI2lmIFNETF9JTlBVVF9UU0xJQgotCWlmICh0c19kZXYgIT0gTlVMTCkgewotCQl0c19jbG9zZSh0c19kZXYpOwotCQl0c19kZXYgPSBOVUxMOwotCQltb3VzZV9mZCA9IC0xOwotCX0KLSNlbmRpZiAvKiBTRExfSU5QVVRfVFNMSUIgKi8KLQlpZiAoIG1vdXNlX2ZkID4gMCApIHsKLQkJY2xvc2UobW91c2VfZmQpOwotCX0KLQltb3VzZV9mZCA9IC0xOwotfQotCi0vKiBSZXR1cm5zIHByb2Nlc3NlcyBsaXN0ZWQgaW4gL3Byb2Mgd2l0aCB0aGUgZGVzaXJlZCBuYW1lICovCi1zdGF0aWMgaW50IGZpbmRfcGlkKERJUiAqcHJvYywgY29uc3QgY2hhciAqd2FudGVkX25hbWUpCi17Ci0Jc3RydWN0IGRpcmVudCAqZW50cnk7Ci0JaW50IHBpZDsKLQotCS8qIEZpcnN0IHNjYW4gcHJvYyBmb3IgdGhlIGdwbSBwcm9jZXNzICovCi0JcGlkID0gMDsKLQl3aGlsZSAoIChwaWQgPT0gMCkgJiYgKChlbnRyeT1yZWFkZGlyKHByb2MpKSAhPSBOVUxMKSApIHsKLQkJaWYgKCBpc2RpZ2l0KGVudHJ5LT5kX25hbWVbMF0pICkgewotCQkJRklMRSAqc3RhdHVzOwotCQkJY2hhciBwYXRoW1BBVEhfTUFYXTsKLQkJCWNoYXIgbmFtZVtQQVRIX01BWF07Ci0KLQkJCVNETF9zbnByaW50ZihwYXRoLCBTRExfYXJyYXlzaXplKHBhdGgpLCAiL3Byb2MvJXMvc3RhdHVzIiwgZW50cnktPmRfbmFtZSk7Ci0JCQlzdGF0dXM9Zm9wZW4ocGF0aCwgInIiKTsKLQkJCWlmICggc3RhdHVzICkgewotCQkJCW5hbWVbMF0gPSAnXDAnOwotCQkJCWZzY2FuZihzdGF0dXMsICJOYW1lOiAlcyIsIG5hbWUpOwotCQkJCWlmICggU0RMX3N0cmNtcChuYW1lLCB3YW50ZWRfbmFtZSkgPT0gMCApIHsKLQkJCQkJcGlkID0gU0RMX2F0b2koZW50cnktPmRfbmFtZSk7Ci0JCQkJfQotCQkJCWZjbG9zZShzdGF0dXMpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBwaWQ7Ci19Ci0KLS8qIFJldHVybnMgdHJ1ZSBpZiAvZGV2L2dwbWRhdGEgaXMgYmVpbmcgd3JpdHRlbiB0byBieSBncG0gKi8KLXN0YXRpYyBpbnQgZ3BtX2F2YWlsYWJsZShjaGFyICpwcm90bywgc2l6ZV90IHByb3RvbGVuKQotewotCWludCBhdmFpbGFibGU7Ci0JRElSICpwcm9jOwotCWludCBwaWQ7Ci0JaW50IGNtZGxpbmUsIGxlbiwgYXJnbGVuOwotCWNoYXIgcGF0aFtQQVRIX01BWF07Ci0JY2hhciBhcmdzW1BBVEhfTUFYXSwgKmFyZzsKLQotCS8qIERvbid0IGJvdGhlciBsb29raW5nIGlmIHRoZSBmaWZvIGlzbid0IHRoZXJlICovCi0jaWZkZWYgREVCVUdfTU9VU0UgCi0JZnByaW50ZihzdGRlcnIsInRlc3RpbmcgZ3BtXG4iKTsKLSNlbmRpZgotCWlmICggYWNjZXNzKEdQTV9OT0RFX0ZJRk8sIEZfT0spIDwgMCApIHsKLQkJcmV0dXJuKDApOwotCX0KLQotCWF2YWlsYWJsZSA9IDA7Ci0JcHJvYyA9IG9wZW5kaXIoIi9wcm9jIik7Ci0JaWYgKCBwcm9jICkgewotCQljaGFyIHJhd19wcm90b1sxMF0gPSB7ICdcMCcgfTsKLQkJY2hhciByZXBlYXRfcHJvdG9bMTBdID0geyAnXDAnIH07Ci0JCXdoaWxlICggIWF2YWlsYWJsZSAmJiAocGlkPWZpbmRfcGlkKHByb2MsICJncG0iKSkgPiAwICkgewotCQkJU0RMX3NucHJpbnRmKHBhdGgsIFNETF9hcnJheXNpemUocGF0aCksICIvcHJvYy8lZC9jbWRsaW5lIiwgcGlkKTsKLQkJCWNtZGxpbmUgPSBvcGVuKHBhdGgsIE9fUkRPTkxZLCAwKTsKLQkJCWlmICggY21kbGluZSA+PSAwICkgewotCQkJCWxlbiA9IHJlYWQoY21kbGluZSwgYXJncywgc2l6ZW9mKGFyZ3MpKTsKLQkJCQlhcmcgPSBhcmdzOwotCQkJCXdoaWxlICggbGVuID4gMCApIHsKLQkJCQkJYXJnbGVuID0gU0RMX3N0cmxlbihhcmcpKzE7Ci0jaWZkZWYgREVCVUdfTU9VU0UgCi0JCQkJICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZ3BtIGFyZyAlcyBsZW4gJWRcbiIsYXJnLGFyZ2xlbik7Ci0jZW5kaWYKLQkJCQkJaWYgKCBTRExfc3RyY21wKGFyZywgIi10IikgPT0gMCkgewotCQkJCQkJLyogcHJvdG9jb2wgc3RyaW5nLCBrZWVwIGl0IGZvciBsYXRlciAqLwotCQkJCQkJY2hhciAqdCwgKnM7Ci0JCQkJCQl0ID0gYXJnICsgYXJnbGVuOwotCQkJCQkJcyA9IFNETF9zdHJjaHIodCwgJyAnKTsKLQkJCQkJCWlmIChzKSAqcyA9IDA7Ci0JCQkJCQlTRExfc3RybGNweShyYXdfcHJvdG8sIHQsIFNETF9hcnJheXNpemUocmF3X3Byb3RvKSk7Ci0JCQkJCQlpZiAocykgKnMgPSAnICc7Ci0JCQkJCX0KLQkJCQkJaWYgKCBTRExfc3RybmNtcChhcmcsICItUiIsIDIpID09IDAgKSB7Ci0JCQkJCQljaGFyICp0LCAqczsKLQkJCQkJCWF2YWlsYWJsZSA9IDE7Ci0JCQkJCQl0ID0gYXJnICsgMjsKLQkJCQkJCXMgPSBTRExfc3RyY2hyKHQsICcgJyk7Ci0JCQkJCQlpZiAocykgKnMgPSAwOwotCQkJCQkJU0RMX3N0cmxjcHkocmVwZWF0X3Byb3RvLCB0LCBTRExfYXJyYXlzaXplKHJlcGVhdF9wcm90bykpOwotCQkJCQkJaWYgKHMpICpzID0gJyAnOwotCQkJCQl9Ci0JCQkJCWxlbiAtPSBhcmdsZW47Ci0JCQkJCWFyZyArPSBhcmdsZW47Ci0JCQkJfQotCQkJCWNsb3NlKGNtZGxpbmUpOwotCQkJfQotCQl9Ci0JCWNsb3NlZGlyKHByb2MpOwotCi0JCWlmICggYXZhaWxhYmxlICkgewotCQkJaWYgKCBTRExfc3RyY21wKHJlcGVhdF9wcm90bywgInJhdyIpID09IDAgKSB7Ci0JCQkJU0RMX3N0cmxjcHkocHJvdG8sIHJhd19wcm90bywgcHJvdG9sZW4pOwotCQkJfSBlbHNlIGlmICggKnJlcGVhdF9wcm90byApIHsKLQkJCQlTRExfc3RybGNweShwcm90bywgcmVwZWF0X3Byb3RvLCBwcm90b2xlbik7Ci0JCQl9IGVsc2UgewotCQkJCVNETF9zdHJsY3B5KHByb3RvLCAibXNjIiwgcHJvdG9sZW4pOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBhdmFpbGFibGU7Ci19Ci0KLQotLyogcmNnMDYxMTIwMDEgU2V0IHVwIElNUFMvMiBtb2RlLCBpZiBwb3NzaWJsZS4gVGhpcyBnaXZlcwotICogIHVzIGFjY2VzcyB0byB0aGUgbW91c2V3aGVlbCwgZXRjLiBSZXR1cm5zIHplcm8gaWYKLSAqICB3cml0ZXMgdG8gZGV2aWNlIGZhaWxlZCwgYnV0IHlvdSBzdGlsbCBuZWVkIHRvIHF1ZXJ5IHRoZQotICogIGRldmljZSB0byBzZWUgd2hpY2ggbW9kZSBpdCdzIGFjdHVhbGx5IGluLgotICovCi1zdGF0aWMgaW50IHNldF9pbXBzMl9tb2RlKGludCBmZCkKLXsKLQkvKiBJZiB5b3Ugd2FudGVkIHRvIGNvbnRyb2wgdGhlIG1vdXNlIG1vZGUgKGFuZCB3ZSBkbyA6KSAgKSAuLi4KLQkJU2V0IElNUFMvMiBwcm90b2NvbDoKLQkJCXsweGYzLDIwMCwweGYzLDEwMCwweGYzLDgwfQotCQlSZXNldCBtb3VzZSBkZXZpY2U6Ci0JCQl7MHhGRn0KLQkqLwotCVVpbnQ4IHNldF9pbXBzMltdID0gezB4ZjMsIDIwMCwgMHhmMywgMTAwLCAweGYzLCA4MH07Ci0JLypVaW50OCByZXNldCA9IDB4ZmY7Ki8KLQlmZF9zZXQgZmRzZXQ7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoIHdyaXRlKGZkLCAmc2V0X2ltcHMyLCBzaXplb2Yoc2V0X2ltcHMyKSkgPT0gc2l6ZW9mKHNldF9pbXBzMikgKSB7Ci0JCS8qIERvbid0IHJlc2V0IGl0LCB0aGF0J2xsIGNsZWFyIElNUFMvMiBtb2RlIG9uIHNvbWUgbWljZQotCQlpZiAod3JpdGUoZmQsICZyZXNldCwgc2l6ZW9mIChyZXNldCkpID09IHNpemVvZiAocmVzZXQpICkgewotCQkJcmV0dmFsID0gMTsKLQkJfQotCQkqLwotCX0KLQotCS8qIEdldCByaWQgb2YgYW55IGNoYXR0ZXIgZnJvbSB0aGUgYWJvdmUgKi8KLQlGRF9aRVJPKCZmZHNldCk7Ci0JRkRfU0VUKGZkLCAmZmRzZXQpOwotCXR2LnR2X3NlYyA9IDA7Ci0JdHYudHZfdXNlYyA9IDA7Ci0Jd2hpbGUgKCBzZWxlY3QoZmQrMSwgJmZkc2V0LCAwLCAwLCAmdHYpID4gMCApIHsKLQkJY2hhciB0ZW1wWzMyXTsKLQkJcmVhZChmZCwgdGVtcCwgc2l6ZW9mKHRlbXApKTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0KLS8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgbW91c2UgdXNlcyB0aGUgSU1QUy8yIHByb3RvY29sICovCi1zdGF0aWMgaW50IGRldGVjdF9pbXBzMihpbnQgZmQpCi17Ci0JaW50IGltcHMyOwotCi0JaW1wczIgPSAwOwotCi0JaWYgKCBTRExfZ2V0ZW52KCJTRExfTU9VU0VERVZfSU1QUzIiKSApIHsKLQkJaW1wczIgPSAxOwotCX0KLQlpZiAoICEgaW1wczIgKSB7Ci0JCVVpbnQ4IHF1ZXJ5X3BzMiA9IDB4RjI7Ci0JCWZkX3NldCBmZHNldDsKLQkJc3RydWN0IHRpbWV2YWwgdHY7Ci0KLQkJLyogR2V0IHJpZCBvZiBhbnkgbW91c2UgbW90aW9uIG5vaXNlICovCi0JCUZEX1pFUk8oJmZkc2V0KTsKLQkJRkRfU0VUKGZkLCAmZmRzZXQpOwotCQl0di50dl9zZWMgPSAwOwotCQl0di50dl91c2VjID0gMDsKLQkJd2hpbGUgKCBzZWxlY3QoZmQrMSwgJmZkc2V0LCAwLCAwLCAmdHYpID4gMCApIHsKLQkJCWNoYXIgdGVtcFszMl07Ci0JCQlyZWFkKGZkLCB0ZW1wLCBzaXplb2YodGVtcCkpOwotCQl9Ci0KLSAgIAkJLyogUXVlcnkgZm9yIHRoZSB0eXBlIG9mIG1vdXNlIHByb3RvY29sICovCi0gICAJCWlmICggd3JpdGUoZmQsICZxdWVyeV9wczIsIHNpemVvZiAocXVlcnlfcHMyKSkgPT0gc2l6ZW9mIChxdWVyeV9wczIpKSB7Ci0gICAJCQlVaW50OCBjaCA9IDA7Ci0KLQkJCS8qIEdldCB0aGUgbW91c2UgcHJvdG9jb2wgcmVzcG9uc2UgKi8KLQkJCWRvIHsKLQkJCQlGRF9aRVJPKCZmZHNldCk7Ci0JCQkJRkRfU0VUKGZkLCAmZmRzZXQpOwotCQkJCXR2LnR2X3NlYyA9IDE7Ci0JCQkJdHYudHZfdXNlYyA9IDA7Ci0JCQkJaWYgKCBzZWxlY3QoZmQrMSwgJmZkc2V0LCAwLCAwLCAmdHYpIDwgMSApIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSB3aGlsZSAoIChyZWFkKGZkLCAmY2gsIHNpemVvZiAoY2gpKSA9PSBzaXplb2YgKGNoKSkgJiYKLQkJCSAgICAgICAgICAoKGNoID09IDB4RkEpIHx8IChjaCA9PSAweEFBKSkgKTsKLQotCQkJLyogRXhwZXJpbWVudGFsIHZhbHVlcyAoTG9naXRlY2ggd2hlZWxtb3VzZSkgKi8KLSNpZmRlZiBERUJVR19NT1VTRQotZnByaW50ZihzdGRlcnIsICJMYXN0IG1vdXNlIG1vZGU6IDB4JXhcbiIsIGNoKTsKLSNlbmRpZgotCQkJaWYgKCAoY2ggPT0gMykgfHwgKGNoID09IDQpICkgewotCQkJCWltcHMyID0gMTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gaW1wczI7Ci19Ci0KLWludCBGQl9PcGVuTW91c2UoX1RISVMpCi17Ci0JaW50IGk7Ci0JY29uc3QgY2hhciAqbW91c2VkZXY7Ci0JY29uc3QgY2hhciAqbW91c2VkcnY7Ci0KLQltb3VzZWRydiA9IFNETF9nZXRlbnYoIlNETF9NT1VTRURSViIpOwotCW1vdXNlZGV2ID0gU0RMX2dldGVudigiU0RMX01PVVNFREVWIik7Ci0JbW91c2VfZmQgPSAtMTsKLQotI2lmIFNETF9JTlBVVF9UU0xJQgotCWlmICggbW91c2VkcnYgJiYgKFNETF9zdHJjbXAobW91c2VkcnYsICJUU0xJQiIpID09IDApICkgewotCQlpZiAobW91c2VkZXYgPT0gTlVMTCkgbW91c2VkZXYgPSBTRExfZ2V0ZW52KCJUU0xJQl9UU0RFVklDRSIpOwotCQlpZiAobW91c2VkZXYgIT0gTlVMTCkgewotCQkJdHNfZGV2ID0gdHNfb3Blbihtb3VzZWRldiwgMSk7Ci0JCQlpZiAoKHRzX2RldiAhPSBOVUxMKSAmJiAodHNfY29uZmlnKHRzX2RldikgPj0gMCkpIHsKLSNpZmRlZiBERUJVR19NT1VTRQotCQkJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgdHNsaWIgdG91Y2hzY3JlZW5cbiIpOwotI2VuZGlmCi0JCQkJbW91c2VfZHJ2ID0gTU9VU0VfVFNMSUI7Ci0JCQkJbW91c2VfZmQgPSB0c19mZCh0c19kZXYpOwotCQkJCXJldHVybiBtb3VzZV9mZDsKLQkJCX0KLQkJfQotCQltb3VzZV9kcnYgPSBNT1VTRV9OT05FOwotCQlyZXR1cm4gbW91c2VfZmQ7Ci0JfQotI2VuZGlmIC8qIFNETF9JTlBVVF9UU0xJQiAqLwotCi0JLyogRUxPIFRPVUNIU0NSRUVOIFNVUFBPUlQgKi8KLQotCWlmICggbW91c2VkcnYgJiYgKFNETF9zdHJjbXAobW91c2VkcnYsICJFTE8iKSA9PSAwKSApIHsKLQkJbW91c2VfZmQgPSBvcGVuKG1vdXNlZGV2LCBPX1JEV1IpOwotCQlpZiAoIG1vdXNlX2ZkID49IDAgKSB7Ci0JCQlpZihlbG9Jbml0Q29udHJvbGxlcihtb3VzZV9mZCkpIHsKLSNpZmRlZiBERUJVR19NT1VTRQotZnByaW50ZihzdGRlcnIsICJVc2luZyBFTE8gdG91Y2hzY3JlZW5cbiIpOwotI2VuZGlmCi0gICAJCQkJbW91c2VfZHJ2ID0gTU9VU0VfRUxPOwotCQkJfQotCi0JCX0KLQkJZWxzZSBpZiAoIG1vdXNlX2ZkIDwgMCApIHsKLQkJCW1vdXNlX2RydiA9IE1PVVNFX05PTkU7Ci0JCX0KLQotCQlyZXR1cm4obW91c2VfZmQpOwotCX0KLQotCS8qIFNURCBNSUNFICovCi0KLQlpZiAoIG1vdXNlZGV2ID09IE5VTEwgKSB7Ci0JCS8qIEZJWE1FIHNvbWVkYXkuLi4gYWxsb3cgbXVsdGlwbGUgbWljZSBpbiB0aGlzIGRyaXZlciAqLwotCQlzdGF0aWMgY29uc3QgY2hhciAqcHMybWljZVtdID0gewotCQkgICAgIi9kZXYvaW5wdXQvbWljZSIsICIvZGV2L3VzYm1vdXNlIiwgIi9kZXYvcHNhdXgiLCBOVUxMCi0JCX07Ci0JCS8qIEZpcnN0IHRyeSB0byB1c2UgR1BNIGluIHJlcGVhdGVyIG1vZGUgKi8KLQkJaWYgKCBtb3VzZV9mZCA8IDAgKSB7Ci0JCQljaGFyIHByb3RvWzEwXTsKLQkJCWlmICggZ3BtX2F2YWlsYWJsZShwcm90bywgU0RMX2FycmF5c2l6ZShwcm90bykpICkgewotCQkJCW1vdXNlX2ZkID0gb3BlbihHUE1fTk9ERV9GSUZPLCBPX1JET05MWSwgMCk7Ci0JCQkJaWYgKCBtb3VzZV9mZCA+PSAwICkgewotCQkJCQlpZiAoIFNETF9zdHJjbXAocHJvdG8sICJtc2MiKSA9PSAwICkgewotCQkJCQkJbW91c2VfZHJ2ID0gTU9VU0VfTVNDOwotCQkJCQl9IGVsc2UgaWYgKCBTRExfc3RyY21wKHByb3RvLCAicHMyIikgPT0gMCApIHsKLQkJCQkJCW1vdXNlX2RydiA9IE1PVVNFX1BTMjsKLQkJCQkJfSBlbHNlIGlmICggU0RMX3N0cmNtcChwcm90bywgImltcHMyIikgPT0gMCApIHsKLQkJCQkJCW1vdXNlX2RydiA9IE1PVVNFX0lNUFMyOwotCQkJCQl9IGVsc2UgaWYgKCBTRExfc3RyY21wKHByb3RvLCAibXMiKSA9PSAwIHx8Ci0JCQkJCSAgICAgICAgICAgIFNETF9zdHJjbXAocHJvdG8sICJiYXJlIikgPT0gMCApIHsKLQkJCQkJCW1vdXNlX2RydiA9IE1PVVNFX01TOwotCQkJCQl9IGVsc2UgaWYgKCBTRExfc3RyY21wKHByb3RvLCAiYm0iKSA9PSAwICkgewotCQkJCQkJbW91c2VfZHJ2ID0gTU9VU0VfQk07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBVbmtub3duIHByb3RvY29sLi4uICovCi0jaWZkZWYgREVCVUdfTU9VU0UKLQkJCQkJCWZwcmludGYoc3RkZXJyLCAiR1BNIG1vdXNlIHVzaW5nIHVua25vd24gcHJvdG9jb2wgPSAlc1xuIiwgcHJvdG8pOwotI2VuZGlmCi0JCQkJCQljbG9zZShtb3VzZV9mZCk7Ci0JCQkJCQltb3VzZV9mZCA9IC0xOwotCQkJCQl9Ci0JCQkJfQotI2lmZGVmIERFQlVHX01PVVNFCi0JCQkJaWYgKCBtb3VzZV9mZCA+PSAwICkgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIEdQTSBtb3VzZSwgcHJvdG9jb2wgPSAlc1xuIiwgcHJvdG8pOwotCQkJCX0KLSNlbmRpZiAvKiBERUJVR19NT1VTRSAqLwotCQkJfQotCQl9Ci0JCS8qIE5vdyB0cnkgdG8gdXNlIGEgbW9kZXJuIFBTLzIgbW91c2UgKi8KLQkJZm9yICggaT0wOyAobW91c2VfZmQgPCAwKSAmJiBwczJtaWNlW2ldOyArK2kgKSB7Ci0JCQltb3VzZV9mZCA9IG9wZW4ocHMybWljZVtpXSwgT19SRFdSLCAwKTsKLQkJCWlmIChtb3VzZV9mZCA8IDApIHsKLQkJCQltb3VzZV9mZCA9IG9wZW4ocHMybWljZVtpXSwgT19SRE9OTFksIDApOwotCQkJfQotCQkJaWYgKG1vdXNlX2ZkID49IDApIHsKLQkJCQkvKiByY2cwNjExMjAwMSBBdHRlbXB0IHRvIHNldCBJTVBTLzIgbW9kZSAqLwotCQkJCXNldF9pbXBzMl9tb2RlKG1vdXNlX2ZkKTsKLQkJCQlpZiAoZGV0ZWN0X2ltcHMyKG1vdXNlX2ZkKSkgewotI2lmZGVmIERFQlVHX01PVVNFCi1mcHJpbnRmKHN0ZGVyciwgIlVzaW5nIElNUFMyIG1vdXNlXG4iKTsKLSNlbmRpZgotCQkJCQltb3VzZV9kcnYgPSBNT1VTRV9JTVBTMjsKLQkJCQl9IGVsc2UgewotI2lmZGVmIERFQlVHX01PVVNFCi1mcHJpbnRmKHN0ZGVyciwgIlVzaW5nIFBTMiBtb3VzZVxuIik7Ci0jZW5kaWYKLQkJCQkJbW91c2VfZHJ2ID0gTU9VU0VfUFMyOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvKiBOZXh0IHRyeSB0byB1c2UgYSBQUEMgQURCIHBvcnQgbW91c2UgKi8KLQkJaWYgKCBtb3VzZV9mZCA8IDAgKSB7Ci0JCQltb3VzZV9mZCA9IG9wZW4oIi9kZXYvYWRibW91c2UiLCBPX1JET05MWSwgMCk7Ci0JCQlpZiAoIG1vdXNlX2ZkID49IDAgKSB7Ci0jaWZkZWYgREVCVUdfTU9VU0UKLWZwcmludGYoc3RkZXJyLCAiVXNpbmcgQURCIG1vdXNlXG4iKTsKLSNlbmRpZgotCQkJCW1vdXNlX2RydiA9IE1PVVNFX0JNOwotCQkJfQotCQl9Ci0JfQotCS8qIERlZmF1bHQgdG8gYSBzZXJpYWwgTWljcm9zb2Z0IG1vdXNlICovCi0JaWYgKCBtb3VzZV9mZCA8IDAgKSB7Ci0JCWlmICggbW91c2VkZXYgPT0gTlVMTCApIHsKLQkJCW1vdXNlZGV2ID0gIi9kZXYvbW91c2UiOwotCQl9Ci0JCW1vdXNlX2ZkID0gb3Blbihtb3VzZWRldiwgT19SRE9OTFksIDApOwotCQlpZiAoIG1vdXNlX2ZkID49IDAgKSB7Ci0JCQlzdHJ1Y3QgdGVybWlvcyBtb3VzZV90ZXJtaW9zOwotCi0JCQkvKiBTZXQgdGhlIHNhbXBsaW5nIHNwZWVkIHRvIDEyMDAgYmF1ZCAqLwotCQkJdGNnZXRhdHRyKG1vdXNlX2ZkLCAmbW91c2VfdGVybWlvcyk7Ci0JCQltb3VzZV90ZXJtaW9zLmNfaWZsYWcgPSBJR05CUksgfCBJR05QQVI7Ci0JCQltb3VzZV90ZXJtaW9zLmNfb2ZsYWcgPSAwOwotCQkJbW91c2VfdGVybWlvcy5jX2xmbGFnID0gMDsKLQkJCW1vdXNlX3Rlcm1pb3MuY19saW5lID0gMDsKLQkJCW1vdXNlX3Rlcm1pb3MuY19jY1tWVElNRV0gPSAwOwotCQkJbW91c2VfdGVybWlvcy5jX2NjW1ZNSU5dID0gMTsKLQkJCW1vdXNlX3Rlcm1pb3MuY19jZmxhZyA9IENSRUFEIHwgQ0xPQ0FMIHwgSFVQQ0w7Ci0JCQltb3VzZV90ZXJtaW9zLmNfY2ZsYWcgfD0gQ1M4OwotCQkJbW91c2VfdGVybWlvcy5jX2NmbGFnIHw9IEIxMjAwOwotCQkJdGNzZXRhdHRyKG1vdXNlX2ZkLCBUQ1NBRkxVU0gsICZtb3VzZV90ZXJtaW9zKTsKLQkJCWlmICggbW91c2VkcnYgJiYgKFNETF9zdHJjbXAobW91c2VkcnYsICJQUzIiKSA9PSAwKSApIHsKLSNpZmRlZiBERUJVR19NT1VTRQotZnByaW50ZihzdGRlcnIsICJVc2luZyAodXNlciBzcGVjaWZpZWQpIFBTMiBtb3VzZSBvbiAlc1xuIiwgbW91c2VkZXYpOwotI2VuZGlmCi0JCQkJbW91c2VfZHJ2ID0gTU9VU0VfUFMyOwotCQkJfSBlbHNlIHsKLSNpZmRlZiBERUJVR19NT1VTRQotZnByaW50ZihzdGRlcnIsICJVc2luZyAoZGVmYXVsdCkgTVMgbW91c2Ugb24gJXNcbiIsIG1vdXNlZGV2KTsKLSNlbmRpZgotCQkJCW1vdXNlX2RydiA9IE1PVVNFX01TOwotCQkJfQotCQl9Ci0JfQotCWlmICggbW91c2VfZmQgPCAwICkgewotCQltb3VzZV9kcnYgPSBNT1VTRV9OT05FOwotCX0KLQlyZXR1cm4obW91c2VfZmQpOwotfQotCi1zdGF0aWMgaW50IHBvc3RlZCA9IDA7Ci0KLXZvaWQgRkJfdmdhbW91c2VjYWxsYmFjayhpbnQgYnV0dG9uLCBpbnQgcmVsYXRpdmUsIGludCBkeCwgaW50IGR5KQotewotCWludCBidXR0b25fMSwgYnV0dG9uXzM7Ci0JaW50IGJ1dHRvbl9zdGF0ZTsKLQlpbnQgc3RhdGVfY2hhbmdlZDsKLQlpbnQgaTsKLQlVaW50OCBzdGF0ZTsKLQotCWlmICggZHggfHwgZHkgKSB7Ci0JCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIHJlbGF0aXZlLCBkeCwgZHkpOwotCX0KLQotCS8qIFN3YXAgYnV0dG9uIDEgYW5kIDMgKi8KLQlidXR0b25fMSA9IChidXR0b24gJiAweDA0KSA+PiAyOwotCWJ1dHRvbl8zID0gKGJ1dHRvbiAmIDB4MDEpIDw8IDI7Ci0JYnV0dG9uICY9IH4weDA1OwotCWJ1dHRvbiB8PSAoYnV0dG9uXzF8YnV0dG9uXzMpOwotCi0JLyogU2VlIHdoYXQgY2hhbmdlZCAqLwotCWJ1dHRvbl9zdGF0ZSA9IFNETF9HZXRNb3VzZVN0YXRlKE5VTEwsIE5VTEwpOwotCXN0YXRlX2NoYW5nZWQgPSBidXR0b25fc3RhdGUgXiBidXR0b247Ci0JZm9yICggaT0wOyBpPDg7ICsraSApIHsKLQkJaWYgKCBzdGF0ZV9jaGFuZ2VkICYgKDE8PGkpICkgewotCQkJaWYgKCBidXR0b24gJiAoMTw8aSkgKSB7Ci0JCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdGUgPSBTRExfUkVMRUFTRUQ7Ci0JCQl9Ci0JCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihzdGF0ZSwgaSsxLCAwLCAwKTsKLQkJfQotCX0KLX0KLQotLyogSGFuZGxlIGlucHV0IGZyb20gdHNsaWIgKi8KLSNpZiBTRExfSU5QVVRfVFNMSUIKLXN0YXRpYyB2b2lkIGhhbmRsZV90c2xpYihfVEhJUykKLXsKLQlzdHJ1Y3QgdHNfc2FtcGxlIHNhbXBsZTsKLQlpbnQgYnV0dG9uOwotCi0Jd2hpbGUgKHRzX3JlYWQodHNfZGV2LCAmc2FtcGxlLCAxKSA+IDApIHsKLQkJYnV0dG9uID0gKHNhbXBsZS5wcmVzc3VyZSA+IDApID8gMSA6IDA7Ci0JCWJ1dHRvbiA8PD0gMjsJLyogbXVzdCByZXBvcnQgaXQgYXMgYnV0dG9uIDMgKi8KLQkJRkJfdmdhbW91c2VjYWxsYmFjayhidXR0b24sIDAsIHNhbXBsZS54LCBzYW1wbGUueSk7Ci0JfQotCXJldHVybjsKLX0KLSNlbmRpZiAvKiBTRExfSU5QVVRfVFNMSUIgKi8KLQotLyogRm9yIG5vdywgdXNlIE1TQywgUFMvMiwgYW5kIE1TIHByb3RvY29scwotICAgRHJpdmVyIGFkYXB0ZWQgZnJvbSB0aGUgU1ZHQWxpYiBtb3VzZSBkcml2ZXIgY29kZSAodGFrZW4gZnJvbSBncG0sIGV0Yy4pCi0gKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9tb3VzZShfVEhJUykKLXsKLQlzdGF0aWMgaW50IHN0YXJ0ID0gMDsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBtb3VzZWJ1ZltCVUZTSVpdOwotCXN0YXRpYyBpbnQgcmVsYXRpdmUgPSAxOwotCi0JaW50IGksIG5yZWFkOwotCWludCBidXR0b24gPSAwOwotCWludCBkeCA9IDAsIGR5ID0gMDsKLQlpbnQgcGFja2V0c2l6ZSA9IDA7Ci0JaW50IHJlYWx4LCByZWFseTsKLQkKLQkvKiBGaWd1cmUgb3V0IHRoZSBtb3VzZSBwYWNrZXQgc2l6ZSAqLwotCXN3aXRjaCAobW91c2VfZHJ2KSB7Ci0JCWNhc2UgTU9VU0VfTk9ORToKLQkJCS8qIEFjayEgKi8KLQkJCXJlYWQobW91c2VfZmQsIG1vdXNlYnVmLCBCVUZTSVopOwotCQkJcmV0dXJuOwotCQljYXNlIE1PVVNFX01TQzoKLQkJCXBhY2tldHNpemUgPSA1OwotCQkJYnJlYWs7Ci0JCWNhc2UgTU9VU0VfSU1QUzI6Ci0JCQlwYWNrZXRzaXplID0gNDsKLQkJCWJyZWFrOwotCQljYXNlIE1PVVNFX1BTMjoKLQkJY2FzZSBNT1VTRV9NUzoKLQkJY2FzZSBNT1VTRV9CTToKLQkJCXBhY2tldHNpemUgPSAzOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU9VU0VfRUxPOgotCQkJLyogdHJ5IHRvIHJlYWQgdGhlIG5leHQgcGFja2V0ICovCi0JCQlpZihlbG9SZWFkUG9zaXRpb24odGhpcywgbW91c2VfZmQsICZkeCwgJmR5LCAmYnV0dG9uLCAmcmVhbHgsICZyZWFseSkpIHsKLQkJCQlidXR0b24gPSAoYnV0dG9uICYgMHgwMSkgPDwgMjsKLQkJCQlGQl92Z2Ftb3VzZWNhbGxiYWNrKGJ1dHRvbiwgMCwgZHgsIGR5KTsKLQkJCX0KLQkJCXJldHVybjsgLyogbm90aGluZyBsZWZ0IHRvIGRvICovCi0JCWNhc2UgTU9VU0VfVFNMSUI6Ci0jaWYgU0RMX0lOUFVUX1RTTElCCi0JCQloYW5kbGVfdHNsaWIodGhpcyk7Ci0jZW5kaWYKLQkJCXJldHVybjsgLyogbm90aGluZyBsZWZ0IHRvIGRvICovCi0JCWRlZmF1bHQ6Ci0JCQkvKiBVaCBvaC4uICovCi0JCQlwYWNrZXRzaXplID0gMDsKLQkJCWJyZWFrOwotCX0KLQotCS8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBxdWl0ZSBzZW5zaXRpdmUgRUxPIGNvbnRyb2xsZXIgKi8KLQlpZiAobW91c2VfZHJ2ID09IE1PVVNFX0VMTykgewotCQotCX0KLQkKLQkvKiBSZWFkIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZSAqLwotCW5yZWFkID0gcmVhZChtb3VzZV9mZCwgJm1vdXNlYnVmW3N0YXJ0XSwgQlVGU0laLXN0YXJ0KTsKLQlpZiAoIG5yZWFkIDwgMCApIHsKLQkJcmV0dXJuOwotCX0KLQlucmVhZCArPSBzdGFydDsKLSNpZmRlZiBERUJVR19NT1VTRQotCWZwcmludGYoc3RkZXJyLCAiUmVhZCAlZCBieXRlcyBmcm9tIG1vdXNlLCBzdGFydCA9ICVkXG4iLCBucmVhZCwgc3RhcnQpOwotI2VuZGlmCi0JZm9yICggaT0wOyBpPChucmVhZC0ocGFja2V0c2l6ZS0xKSk7IGkgKz0gcGFja2V0c2l6ZSApIHsKLQkJc3dpdGNoIChtb3VzZV9kcnYpIHsKLQkJCWNhc2UgTU9VU0VfTk9ORToKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9VU0VfTVNDOgotCQkJCS8qIE1TQyBwcm90b2NvbCBoYXMgMHg4MCBpbiBoaWdoIGJ5dGUgKi8KLQkJCQlpZiAoIChtb3VzZWJ1ZltpXSAmIDB4RjgpICE9IDB4ODAgKSB7Ci0JCQkJCS8qIEdvIHRvIG5leHQgYnl0ZSAqLwotCQkJCQlpIC09IChwYWNrZXRzaXplLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLyogR2V0IGN1cnJlbnQgbW91c2Ugc3RhdGUgKi8KLQkJCQlidXR0b24gPSAofm1vdXNlYnVmW2ldKSAmIDB4MDc7Ci0JCQkJZHggPSAgIChzaWduZWQgY2hhcikobW91c2VidWZbaSsxXSkgKwotCQkJCSAgICAgICAoc2lnbmVkIGNoYXIpKG1vdXNlYnVmW2krM10pOwotCQkJCWR5ID0gLSgoc2lnbmVkIGNoYXIpKG1vdXNlYnVmW2krMl0pICsKLQkJCQkgICAgICAgKHNpZ25lZCBjaGFyKShtb3VzZWJ1ZltpKzRdKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PVVNFX1BTMjoKLQkJCQkvKiBQUy8yIHByb3RvY29sIGhhcyBub3RoaW5nIGluIGhpZ2ggYnl0ZSAqLwotCQkJCWlmICggKG1vdXNlYnVmW2ldICYgMHhDMCkgIT0gMCApIHsKLQkJCQkJLyogR28gdG8gbmV4dCBieXRlICovCi0JCQkJCWkgLT0gKHBhY2tldHNpemUtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvKiBHZXQgY3VycmVudCBtb3VzZSBzdGF0ZSAqLwotCQkJCWJ1dHRvbiA9IChtb3VzZWJ1ZltpXSAmIDB4MDQpID4+IDEgfCAvKk1pZGRsZSovCi0JCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4MDIpID4+IDEgfCAvKlJpZ2h0Ki8KLQkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHgwMSkgPDwgMjsgIC8qTGVmdCovCi0JCSAgCQlkeCA9IChtb3VzZWJ1ZltpXSAmIDB4MTApID8KLQkJICAJCSAgICAgIG1vdXNlYnVmW2krMV0gLSAyNTYgOiBtb3VzZWJ1ZltpKzFdOwotCQkgIAkJZHkgPSAobW91c2VidWZbaV0gJiAweDIwKSA/Ci0JCSAgCQkgICAgICAtKG1vdXNlYnVmW2krMl0gLSAyNTYpIDogLW1vdXNlYnVmW2krMl07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PVVNFX0lNUFMyOgotCQkJCS8qIEdldCBjdXJyZW50IG1vdXNlIHN0YXRlICovCi0JCQkJYnV0dG9uID0gKG1vdXNlYnVmW2ldICYgMHgwNCkgPj4gMSB8IC8qTWlkZGxlKi8KLQkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHgwMikgPj4gMSB8IC8qUmlnaHQqLwotCQkgIAkJCSAobW91c2VidWZbaV0gJiAweDAxKSA8PCAyIHwgLypMZWZ0Ki8KLQkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHg0MCkgPj4gMyB8IC8qIDQgKi8KLQkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHg4MCkgPj4gMzsgIC8qIDUgKi8KLQkJICAJCWR4ID0gKG1vdXNlYnVmW2ldICYgMHgxMCkgPwotCQkgIAkJICAgICAgbW91c2VidWZbaSsxXSAtIDI1NiA6IG1vdXNlYnVmW2krMV07Ci0JCSAgCQlkeSA9IChtb3VzZWJ1ZltpXSAmIDB4MjApID8KLQkJICAJCSAgICAgIC0obW91c2VidWZbaSsyXSAtIDI1NikgOiAtbW91c2VidWZbaSsyXTsKLQkJCQlzd2l0Y2ggKG1vdXNlYnVmW2krM10mMHgwRikgewotCQkJCSAgICBjYXNlIDB4MEU6IC8qIERYID0gKzEgKi8KLQkJCQkgICAgY2FzZSAweDAyOiAvKiBEWCA9IC0xICovCi0JCQkJCWJyZWFrOwotCQkJCSAgICBjYXNlIDB4MEY6IC8qIERZID0gKzEgKG1hcCBidXR0b24gNCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCX3ZnYW1vdXNlY2FsbGJhY2soYnV0dG9uIHwgKDE8PDMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJICAgIGNhc2UgMHgwMTogLyogRFkgPSAtMSAobWFwIGJ1dHRvbiA1KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJfdmdhbW91c2VjYWxsYmFjayhidXR0b24gfCAoMTw8NCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PVVNFX01TOgotCQkJCS8qIE1pY3Jvc29mdCBwcm90b2NvbCBoYXMgMHg0MCBpbiBoaWdoIGJ5dGUgKi8KLQkJCQlpZiAoIChtb3VzZWJ1ZltpXSAmIDB4NDApICE9IDB4NDAgKSB7Ci0JCQkJCS8qIEdvIHRvIG5leHQgYnl0ZSAqLwotCQkJCQlpIC09IChwYWNrZXRzaXplLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLyogR2V0IGN1cnJlbnQgbW91c2Ugc3RhdGUgKi8KLQkJCQlidXR0b24gPSAoKG1vdXNlYnVmW2ldICYgMHgyMCkgPj4gMykgfAotCQkJCSAgICAgICAgICgobW91c2VidWZbaV0gJiAweDEwKSA+PiA0KTsKLQkJCQlkeCA9IChzaWduZWQgY2hhcikoKChtb3VzZWJ1ZltpXSAmIDB4MDMpIDw8IDYpIHwKLQkJCQkgICAgICAgICAgICAgICAgICAgKG1vdXNlYnVmW2kgKyAxXSAmIDB4M0YpKTsKLQkJCQlkeSA9IChzaWduZWQgY2hhcikoKChtb3VzZWJ1ZltpXSAmIDB4MEMpIDw8IDQpIHwKLQkJCQkgICAgICAgICAgICAgICAgICAgIChtb3VzZWJ1ZltpICsgMl0gJiAweDNGKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PVVNFX0JNOgotCQkJCS8qIEJ1c01vdXNlIHByb3RvY29sIGhhcyAweEY4IGluIGhpZ2ggYnl0ZSAqLwotCQkJCWlmICggKG1vdXNlYnVmW2ldICYgMHhGOCkgIT0gMHg4MCApIHsKLQkJCQkJLyogR28gdG8gbmV4dCBieXRlICovCi0JCQkJCWkgLT0gKHBhY2tldHNpemUtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvKiBHZXQgY3VycmVudCBtb3VzZSBzdGF0ZSAqLwotCQkJCWJ1dHRvbiA9ICh+bW91c2VidWZbaV0pICYgMHgwNzsKLQkJCQlkeCA9ICAoc2lnbmVkIGNoYXIpbW91c2VidWZbaSsxXTsKLQkJCQlkeSA9IC0oc2lnbmVkIGNoYXIpbW91c2VidWZbaSsyXTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLyogVWggb2guLiAqLwotCQkJCWR4ID0gMDsKLQkJCQlkeSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJRkJfdmdhbW91c2VjYWxsYmFjayhidXR0b24sIHJlbGF0aXZlLCBkeCwgZHkpOwotCX0KLQlpZiAoIGkgPCBucmVhZCApIHsKLQkJU0RMX21lbWNweShtb3VzZWJ1ZiwgJm1vdXNlYnVmW2ldLCAobnJlYWQtaSkpOwotCQlzdGFydCA9IChucmVhZC1pKTsKLQl9IGVsc2UgewotCQlzdGFydCA9IDA7Ci0JfQotCXJldHVybjsKLX0KLQotLyogSGFuZGxlIHN3aXRjaGluZyB0byBhbm90aGVyIFZDLCByZXR1cm5zIHdoZW4gb3VyIFZDIGlzIGJhY2sgKi8KLXN0YXRpYyB2b2lkIHN3aXRjaF92dF9wcmVwKF9USElTKQotewotCVNETF9TdXJmYWNlICpzY3JlZW4gPSBTRExfVmlkZW9TdXJmYWNlOwotCi0JU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgKFNETF9BUFBBQ1RJVkV8U0RMX0FQUElOUFVURk9DVVN8U0RMX0FQUE1PVVNFRk9DVVMpKTsKLQotCS8qIFNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzY3JlZW4sIGFuZCBnbyB0byB0ZXh0IG1vZGUgKi8KLQl3YWl0X2lkbGUodGhpcyk7Ci0Jc2NyZWVuX2FyZWFsZW4gPSAoKHNjcmVlbi0+aCArICgyKnRoaXMtPm9mZnNldF95KSkgKiBzY3JlZW4tPnBpdGNoKTsKLQlzY3JlZW5fY29udGVudHMgPSAoVWludDggKilTRExfbWFsbG9jKHNjcmVlbl9hcmVhbGVuKTsKLQlpZiAoIHNjcmVlbl9jb250ZW50cyApIHsKLQkJU0RMX21lbWNweShzY3JlZW5fY29udGVudHMsIHNjcmVlbi0+cGl4ZWxzLCBzY3JlZW5fYXJlYWxlbik7Ci0JfQotCUZCX1NhdmVQYWxldHRlVG8odGhpcywgMjU2LCBzY3JlZW5fcGFsZXR0ZSk7Ci0JaW9jdGwoY29uc29sZV9mZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJnNjcmVlbl92aW5mbyk7Ci0JaW9jdGwoa2V5Ym9hcmRfZmQsIEtEU0VUTU9ERSwgS0RfVEVYVCk7Ci0JaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX1VOTE9DS1NXSVRDSCwgMSk7Ci19Ci1zdGF0aWMgdm9pZCBzd2l0Y2hfdnRfZG9uZShfVEhJUykKLXsKLQlTRExfU3VyZmFjZSAqc2NyZWVuID0gU0RMX1ZpZGVvU3VyZmFjZTsKLQotCS8qIFJlc3RvcmUgZ3JhcGhpY3MgbW9kZSBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzY3JlZW4gKi8KLQlpb2N0bChrZXlib2FyZF9mZCwgVlRfTE9DS1NXSVRDSCwgMSk7Ci0JaW9jdGwoa2V5Ym9hcmRfZmQsIEtEU0VUTU9ERSwgS0RfR1JBUEhJQ1MpOwotCWlvY3RsKGNvbnNvbGVfZmQsIEZCSU9QVVRfVlNDUkVFTklORk8sICZzY3JlZW5fdmluZm8pOwotCUZCX1Jlc3RvcmVQYWxldHRlRnJvbSh0aGlzLCAyNTYsIHNjcmVlbl9wYWxldHRlKTsKLQlpZiAoIHNjcmVlbl9jb250ZW50cyApIHsKLQkJU0RMX21lbWNweShzY3JlZW4tPnBpeGVscywgc2NyZWVuX2NvbnRlbnRzLCBzY3JlZW5fYXJlYWxlbik7Ci0JCVNETF9mcmVlKHNjcmVlbl9jb250ZW50cyk7Ci0JCXNjcmVlbl9jb250ZW50cyA9IE5VTEw7Ci0JfQotCi0JLyogR2V0IHVwZGF0ZXMgdG8gdGhlIHNoYWRvdyBzdXJmYWNlIHdoaWxlIHN3aXRjaGVkIGF3YXkgKi8KLQlpZiAoIFNETF9TaGFkb3dTdXJmYWNlICkgewotCQlTRExfVXBkYXRlUmVjdChTRExfU2hhZG93U3VyZmFjZSwgMCwgMCwgMCwgMCk7Ci0JfQotCi0JU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgKFNETF9BUFBBQ1RJVkV8U0RMX0FQUElOUFVURk9DVVN8U0RMX0FQUE1PVVNFRk9DVVMpKTsKLX0KLXN0YXRpYyB2b2lkIHN3aXRjaF92dChfVEhJUywgdW5zaWduZWQgc2hvcnQgd2hpY2gpCi17Ci0Jc3RydWN0IHZ0X3N0YXQgdnRzdGF0ZTsKLQotCS8qIEZpZ3VyZSBvdXQgd2hldGhlciBvciBub3Qgd2UncmUgc3dpdGNoaW5nIHRvIGEgbmV3IGNvbnNvbGUgKi8KLQlpZiAoIChpb2N0bChrZXlib2FyZF9mZCwgVlRfR0VUU1RBVEUsICZ2dHN0YXRlKSA8IDApIHx8Ci0JICAgICAod2hpY2ggPT0gdnRzdGF0ZS52X2FjdGl2ZSkgKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBOZXcgY29uc29sZSwgc3dpdGNoIHRvIGl0ICovCi0JU0RMX211dGV4UChod19sb2NrKTsKLQlzd2l0Y2hfdnRfcHJlcCh0aGlzKTsKLQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBWVF9BQ1RJVkFURSwgd2hpY2gpID09IDAgKSB7Ci0JCWlvY3RsKGtleWJvYXJkX2ZkLCBWVF9XQUlUQUNUSVZFLCB3aGljaCk7Ci0JCXN3aXRjaGVkX2F3YXkgPSAxOwotCX0gZWxzZSB7Ci0JCXN3aXRjaF92dF9kb25lKHRoaXMpOwotCX0KLQlTRExfbXV0ZXhWKGh3X2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVfa2V5Ym9hcmQoX1RISVMpCi17Ci0JdW5zaWduZWQgY2hhciBrZXlidWZbQlVGU0laXTsKLQlpbnQgaSwgbnJlYWQ7Ci0JaW50IHByZXNzZWQ7Ci0JaW50IHNjYW5jb2RlOwotCVNETF9rZXlzeW0ga2V5c3ltOwotCi0JbnJlYWQgPSByZWFkKGtleWJvYXJkX2ZkLCBrZXlidWYsIEJVRlNJWik7Ci0JZm9yICggaT0wOyBpPG5yZWFkOyArK2kgKSB7Ci0JCXNjYW5jb2RlID0ga2V5YnVmW2ldICYgMHg3RjsKLQkJaWYgKCBrZXlidWZbaV0gJiAweDgwICkgewotCQkJcHJlc3NlZCA9IFNETF9SRUxFQVNFRDsKLQkJfSBlbHNlIHsKLQkJCXByZXNzZWQgPSBTRExfUFJFU1NFRDsKLQkJfQotCQlUcmFuc2xhdGVLZXkoc2NhbmNvZGUsICZrZXlzeW0pOwotCQkvKiBIYW5kbGUgQ3RybC1BbHQtRk4gZm9yIHZ0IHN3aXRjaCAqLwotCQlzd2l0Y2ggKGtleXN5bS5zeW0pIHsKLQkJICAgIGNhc2UgU0RMS19GMToKLQkJICAgIGNhc2UgU0RMS19GMjoKLQkJICAgIGNhc2UgU0RMS19GMzoKLQkJICAgIGNhc2UgU0RMS19GNDoKLQkJICAgIGNhc2UgU0RMS19GNToKLQkJICAgIGNhc2UgU0RMS19GNjoKLQkJICAgIGNhc2UgU0RMS19GNzoKLQkJICAgIGNhc2UgU0RMS19GODoKLQkJICAgIGNhc2UgU0RMS19GOToKLQkJICAgIGNhc2UgU0RMS19GMTA6Ci0JCSAgICBjYXNlIFNETEtfRjExOgotCQkgICAgY2FzZSBTRExLX0YxMjoKLQkJCWlmICggKFNETF9HZXRNb2RTdGF0ZSgpICYgS01PRF9DVFJMKSAmJgotCQkJICAgICAoU0RMX0dldE1vZFN0YXRlKCkgJiBLTU9EX0FMVCkgKSB7Ci0JCQkJaWYgKCBwcmVzc2VkICkgewotCQkJCQlzd2l0Y2hfdnQodGhpcywgKGtleXN5bS5zeW0tU0RMS19GMSkrMSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogRmFsbCB0aHJvdWdoIHRvIG5vcm1hbCBwcm9jZXNzaW5nICovCi0JCSAgICBkZWZhdWx0OgotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQocHJlc3NlZCwgJmtleXN5bSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotdm9pZCBGQl9QdW1wRXZlbnRzKF9USElTKQotewotCWZkX3NldCBmZHNldDsKLQlpbnQgbWF4X2ZkOwotCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB6ZXJvOwotCi0JZG8gewotCQlpZiAoIHN3aXRjaGVkX2F3YXkgKSB7Ci0JCQlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXRlOwotCi0JCQlTRExfbXV0ZXhQKGh3X2xvY2spOwotCQkJaWYgKCAoaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX0dFVFNUQVRFLCAmdnRzdGF0ZSkgPT0gMCkgJiYKLQkJCSAgICAgdnRzdGF0ZS52X2FjdGl2ZSA9PSBjdXJyZW50X3Z0ICkgewotCQkJCXN3aXRjaGVkX2F3YXkgPSAwOwotCQkJCXN3aXRjaF92dF9kb25lKHRoaXMpOwotCQkJfQotCQkJU0RMX211dGV4Vihod19sb2NrKTsKLQkJfQotCi0JCXBvc3RlZCA9IDA7Ci0KLQkJRkRfWkVSTygmZmRzZXQpOwotCQltYXhfZmQgPSAwOwotCQlpZiAoIGtleWJvYXJkX2ZkID49IDAgKSB7Ci0JCQlGRF9TRVQoa2V5Ym9hcmRfZmQsICZmZHNldCk7Ci0JCQlpZiAoIG1heF9mZCA8IGtleWJvYXJkX2ZkICkgewotCQkJCW1heF9mZCA9IGtleWJvYXJkX2ZkOwotCQkJfQotCQl9Ci0JCWlmICggbW91c2VfZmQgPj0gMCApIHsKLQkJCUZEX1NFVChtb3VzZV9mZCwgJmZkc2V0KTsKLQkJCWlmICggbWF4X2ZkIDwgbW91c2VfZmQgKSB7Ci0JCQkJbWF4X2ZkID0gbW91c2VfZmQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKCBzZWxlY3QobWF4X2ZkKzEsICZmZHNldCwgTlVMTCwgTlVMTCwgJnplcm8pID4gMCApIHsKLQkJCWlmICgga2V5Ym9hcmRfZmQgPj0gMCApIHsKLQkJCQlpZiAoIEZEX0lTU0VUKGtleWJvYXJkX2ZkLCAmZmRzZXQpICkgewotCQkJCQloYW5kbGVfa2V5Ym9hcmQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCBtb3VzZV9mZCA+PSAwICkgewotCQkJCWlmICggRkRfSVNTRVQobW91c2VfZmQsICZmZHNldCkgKSB7Ci0JCQkJCWhhbmRsZV9tb3VzZSh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlICggcG9zdGVkICk7Ci19Ci0KLXZvaWQgRkJfSW5pdE9TS2V5bWFwKF9USElTKQotewotCWludCBpOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgTGludXgga2V5IHRyYW5zbGF0aW9uIHRhYmxlICovCi0KLQkvKiBGaXJzdCBnZXQgdGhlIGFzY2lpIGtleXMgYW5kIG90aGVycyBub3Qgd2VsbCBoYW5kbGVkICovCi0JZm9yIChpPTA7IGk8U0RMX2FycmF5c2l6ZShrZXltYXApOyArK2kpIHsKLQkgIHN3aXRjaChpKSB7Ci0JICAvKiBUaGVzZSBhcmVuJ3QgaGFuZGxlZCBieSB0aGUgeDg2IGtlcm5lbCBrZXltYXBwaW5nICg/KSAqLwotCSAgY2FzZSBTQ0FOQ09ERV9QUklOVFNDUkVFTjoKLQkgICAga2V5bWFwW2ldID0gU0RMS19QUklOVDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNDQU5DT0RFX0JSRUFLOgotCSAgICBrZXltYXBbaV0gPSBTRExLX0JSRUFLOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0NBTkNPREVfQlJFQUtfQUxURVJOQVRJVkU6Ci0JICAgIGtleW1hcFtpXSA9IFNETEtfUEFVU0U7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBTQ0FOQ09ERV9MRUZUU0hJRlQ6Ci0JICAgIGtleW1hcFtpXSA9IFNETEtfTFNISUZUOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0NBTkNPREVfUklHSFRTSElGVDoKLQkgICAga2V5bWFwW2ldID0gU0RMS19SU0hJRlQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBTQ0FOQ09ERV9MRUZUQ09OVFJPTDoKLQkgICAga2V5bWFwW2ldID0gU0RMS19MQ1RSTDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNDQU5DT0RFX1JJR0hUQ09OVFJPTDoKLQkgICAga2V5bWFwW2ldID0gU0RMS19SQ1RSTDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNDQU5DT0RFX1JJR0hUV0lOOgotCSAgICBrZXltYXBbaV0gPSBTRExLX1JTVVBFUjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNDQU5DT0RFX0xFRlRXSU46Ci0JICAgIGtleW1hcFtpXSA9IFNETEtfTFNVUEVSOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0NBTkNPREVfTEVGVEFMVDoKLQkgICAga2V5bWFwW2ldID0gU0RMS19MQUxUOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0NBTkNPREVfUklHSFRBTFQ6Ci0JICAgIGtleW1hcFtpXSA9IFNETEtfUkFMVDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDEyNzoKLQkgICAga2V5bWFwW2ldID0gU0RMS19NRU5VOwotCSAgICBicmVhazsKLQkgIC8qIHRoaXMgc2hvdWxkIHRha2UgY2FyZSBvZiBhbGwgc3RhbmRhcmQgYXNjaWkga2V5cyAqLwotCSAgZGVmYXVsdDoKLQkgICAga2V5bWFwW2ldID0gS1ZBTCh2Z2Ffa2V5bWFwWzBdW2ldKTsKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCX0KLQlmb3IgKGk9MDsgaTxTRExfYXJyYXlzaXplKGtleW1hcCk7ICsraSkgewotCSAgc3dpdGNoKGtleW1hcF90ZW1wW2ldKSB7Ci0JICAgIGNhc2UgS19GMTogIGtleW1hcFtpXSA9IFNETEtfRjE7ICBicmVhazsKLQkgICAgY2FzZSBLX0YyOiAga2V5bWFwW2ldID0gU0RMS19GMjsgIGJyZWFrOwotCSAgICBjYXNlIEtfRjM6ICBrZXltYXBbaV0gPSBTRExLX0YzOyAgYnJlYWs7Ci0JICAgIGNhc2UgS19GNDogIGtleW1hcFtpXSA9IFNETEtfRjQ7ICBicmVhazsKLQkgICAgY2FzZSBLX0Y1OiAga2V5bWFwW2ldID0gU0RMS19GNTsgIGJyZWFrOwotCSAgICBjYXNlIEtfRjY6ICBrZXltYXBbaV0gPSBTRExLX0Y2OyAgYnJlYWs7Ci0JICAgIGNhc2UgS19GNzogIGtleW1hcFtpXSA9IFNETEtfRjc7ICBicmVhazsKLQkgICAgY2FzZSBLX0Y4OiAga2V5bWFwW2ldID0gU0RMS19GODsgIGJyZWFrOwotCSAgICBjYXNlIEtfRjk6ICBrZXltYXBbaV0gPSBTRExLX0Y5OyAgYnJlYWs7Ci0JICAgIGNhc2UgS19GMTA6IGtleW1hcFtpXSA9IFNETEtfRjEwOyBicmVhazsKLQkgICAgY2FzZSBLX0YxMToga2V5bWFwW2ldID0gU0RMS19GMTE7IGJyZWFrOwotCSAgICBjYXNlIEtfRjEyOiBrZXltYXBbaV0gPSBTRExLX0YxMjsgYnJlYWs7Ci0KLQkgICAgY2FzZSBLX0RPV046ICBrZXltYXBbaV0gPSBTRExLX0RPV047ICBicmVhazsKLQkgICAgY2FzZSBLX0xFRlQ6ICBrZXltYXBbaV0gPSBTRExLX0xFRlQ7ICBicmVhazsKLQkgICAgY2FzZSBLX1JJR0hUOiBrZXltYXBbaV0gPSBTRExLX1JJR0hUOyBicmVhazsKLQkgICAgY2FzZSBLX1VQOiAgICBrZXltYXBbaV0gPSBTRExLX1VQOyAgICBicmVhazsKLQotCSAgICBjYXNlIEtfUDA6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQMDsgYnJlYWs7Ci0JICAgIGNhc2UgS19QMTogICAgIGtleW1hcFtpXSA9IFNETEtfS1AxOyBicmVhazsKLQkgICAgY2FzZSBLX1AyOiAgICAga2V5bWFwW2ldID0gU0RMS19LUDI7IGJyZWFrOwotCSAgICBjYXNlIEtfUDM6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQMzsgYnJlYWs7Ci0JICAgIGNhc2UgS19QNDogICAgIGtleW1hcFtpXSA9IFNETEtfS1A0OyBicmVhazsKLQkgICAgY2FzZSBLX1A1OiAgICAga2V5bWFwW2ldID0gU0RMS19LUDU7IGJyZWFrOwotCSAgICBjYXNlIEtfUDY6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQNjsgYnJlYWs7Ci0JICAgIGNhc2UgS19QNzogICAgIGtleW1hcFtpXSA9IFNETEtfS1A3OyBicmVhazsKLQkgICAgY2FzZSBLX1A4OiAgICAga2V5bWFwW2ldID0gU0RMS19LUDg7IGJyZWFrOwotCSAgICBjYXNlIEtfUDk6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQOTsgYnJlYWs7Ci0JICAgIGNhc2UgS19QUExVUzogIGtleW1hcFtpXSA9IFNETEtfS1BfUExVUzsgYnJlYWs7Ci0JICAgIGNhc2UgS19QTUlOVVM6IGtleW1hcFtpXSA9IFNETEtfS1BfTUlOVVM7IGJyZWFrOwotCSAgICBjYXNlIEtfUFNUQVI6ICBrZXltYXBbaV0gPSBTRExLX0tQX01VTFRJUExZOyBicmVhazsKLQkgICAgY2FzZSBLX1BTTEFTSDoga2V5bWFwW2ldID0gU0RMS19LUF9ESVZJREU7IGJyZWFrOwotCSAgICBjYXNlIEtfUEVOVEVSOiBrZXltYXBbaV0gPSBTRExLX0tQX0VOVEVSOyBicmVhazsKLQkgICAgY2FzZSBLX1BET1Q6ICAga2V5bWFwW2ldID0gU0RMS19LUF9QRVJJT0Q7IGJyZWFrOwotCi0JICAgIGNhc2UgS19TSElGVDogIGlmICgga2V5bWFwW2ldICE9IFNETEtfUlNISUZUICkKLQkgICAgICAgICAgICAgICAgICAgICBrZXltYXBbaV0gPSBTRExLX0xTSElGVDsKLQkgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgS19TSElGVEw6IGtleW1hcFtpXSA9IFNETEtfTFNISUZUOyBicmVhazsKLQkgICAgY2FzZSBLX1NISUZUUjoga2V5bWFwW2ldID0gU0RMS19SU0hJRlQ7IGJyZWFrOwotCSAgICBjYXNlIEtfQ1RSTDogIGlmICgga2V5bWFwW2ldICE9IFNETEtfUkNUUkwgKQotCSAgICAgICAgICAgICAgICAgICAgIGtleW1hcFtpXSA9IFNETEtfTENUUkw7Ci0JICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIEtfQ1RSTEw6ICBrZXltYXBbaV0gPSBTRExLX0xDVFJMOyAgYnJlYWs7Ci0JICAgIGNhc2UgS19DVFJMUjogIGtleW1hcFtpXSA9IFNETEtfUkNUUkw7ICBicmVhazsKLQkgICAgY2FzZSBLX0FMVDogICAga2V5bWFwW2ldID0gU0RMS19MQUxUOyAgIGJyZWFrOwotCSAgICBjYXNlIEtfQUxUR1I6ICBrZXltYXBbaV0gPSBTRExLX1JBTFQ7ICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBLX0lOU0VSVDoga2V5bWFwW2ldID0gU0RMS19JTlNFUlQ7ICAgYnJlYWs7Ci0JICAgIGNhc2UgS19SRU1PVkU6IGtleW1hcFtpXSA9IFNETEtfREVMRVRFOyAgIGJyZWFrOwotCSAgICBjYXNlIEtfUEdVUDogICBrZXltYXBbaV0gPSBTRExLX1BBR0VVUDsgICBicmVhazsKLQkgICAgY2FzZSBLX1BHRE46ICAga2V5bWFwW2ldID0gU0RMS19QQUdFRE9XTjsgYnJlYWs7Ci0JICAgIGNhc2UgS19GSU5EOiAgIGtleW1hcFtpXSA9IFNETEtfSE9NRTsgICAgIGJyZWFrOwotCSAgICBjYXNlIEtfU0VMRUNUOiBrZXltYXBbaV0gPSBTRExLX0VORDsgICAgICBicmVhazsKLQotCSAgICBjYXNlIEtfTlVNOiAga2V5bWFwW2ldID0gU0RMS19OVU1MT0NLOyAgIGJyZWFrOwotCSAgICBjYXNlIEtfQ0FQUzoga2V5bWFwW2ldID0gU0RMS19DQVBTTE9DSzsgIGJyZWFrOwotCi0JICAgIGNhc2UgS19GMTM6ICAga2V5bWFwW2ldID0gU0RMS19QUklOVDsgICAgIGJyZWFrOwotCSAgICBjYXNlIEtfSE9MRDogIGtleW1hcFtpXSA9IFNETEtfU0NST0xMT0NLOyBicmVhazsKLQkgICAgY2FzZSBLX1BBVVNFOiBrZXltYXBbaV0gPSBTRExLX1BBVVNFOyAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAxMjc6IGtleW1hcFtpXSA9IFNETEtfQkFDS1NQQUNFOyBicmVhazsKLQkgICAgIAotCSAgICBkZWZhdWx0OiBicmVhazsKLQkgIH0KLQl9Ci19Ci0KLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0pCi17Ci0JLyogU2V0IHRoZSBrZXlzeW0gaW5mb3JtYXRpb24gKi8KLQlrZXlzeW0tPnNjYW5jb2RlID0gc2NhbmNvZGU7Ci0Ja2V5c3ltLT5zeW0gPSBrZXltYXBbc2NhbmNvZGVdOwotCWtleXN5bS0+bW9kID0gS01PRF9OT05FOwotCi0JLyogSWYgVU5JQ09ERSBpcyBvbiwgZ2V0IHRoZSBVTklDT0RFIHZhbHVlIGZvciB0aGUga2V5ICovCi0Ja2V5c3ltLT51bmljb2RlID0gMDsKLQlpZiAoIFNETF9UcmFuc2xhdGVVTklDT0RFICkgewotCQlpbnQgbWFwOwotCQlTRExNb2QgbW9kc3RhdGU7Ci0KLQkJbW9kc3RhdGUgPSBTRExfR2V0TW9kU3RhdGUoKTsKLQkJbWFwID0gMDsKLQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfU0hJRlQgKSB7Ci0JCQltYXAgfD0gKDE8PEtHX1NISUZUKTsKLQkJfQotCQlpZiAoIG1vZHN0YXRlICYgS01PRF9DVFJMICkgewotCQkJbWFwIHw9ICgxPDxLR19DVFJMKTsKLQkJfQotCQlpZiAoIG1vZHN0YXRlICYgS01PRF9MQUxUICkgewotCQkJbWFwIHw9ICgxPDxLR19BTFQpOwotCQl9Ci0JCWlmICggbW9kc3RhdGUgJiBLTU9EX1JBTFQgKSB7Ci0JCQltYXAgfD0gKDE8PEtHX0FMVEdSKTsKLQkJfQotCQlpZiAoIEtUWVAodmdhX2tleW1hcFttYXBdW3NjYW5jb2RlXSkgPT0gS1RfTEVUVEVSICkgewotCQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQ0FQUyApIHsKLQkJCQltYXAgXj0gKDE8PEtHX1NISUZUKTsKLQkJCX0KLQkJfQotCQlpZiAoIEtUWVAodmdhX2tleW1hcFttYXBdW3NjYW5jb2RlXSkgPT0gS1RfUEFEICkgewotCQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfTlVNICkgewotCQkJCWtleXN5bS0+dW5pY29kZT1LVkFMKHZnYV9rZXltYXBbbWFwXVtzY2FuY29kZV0pOwotCQkJfQotCQl9IGVsc2UgewotCQkJa2V5c3ltLT51bmljb2RlID0gS1ZBTCh2Z2Ffa2V5bWFwW21hcF1bc2NhbmNvZGVdKTsKLQkJfQotCX0KLQlyZXR1cm4oa2V5c3ltKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNjZiZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmV2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCi0KLS8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFNETF9zeXNldmVudHMuYyB0byBvdGhlciBwYXJ0cyAKLSAgIG9mIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIChTRExfc3lzdmlkZW8uYykKLSovCi1leHRlcm4gaW50IEZCX09wZW5LZXlib2FyZChfVEhJUyk7Ci1leHRlcm4gdm9pZCBGQl9DbG9zZUtleWJvYXJkKF9USElTKTsKLWV4dGVybiBpbnQgRkJfT3Blbk1vdXNlKF9USElTKTsKLWV4dGVybiB2b2lkIEZCX0Nsb3NlTW91c2UoX1RISVMpOwotZXh0ZXJuIGludCBGQl9FbnRlckdyYXBoaWNzTW9kZShfVEhJUyk7Ci1leHRlcm4gaW50IEZCX0luR3JhcGhpY3NNb2RlKF9USElTKTsKLWV4dGVybiB2b2lkIEZCX0xlYXZlR3JhcGhpY3NNb2RlKF9USElTKTsKLQotZXh0ZXJuIHZvaWQgRkJfSW5pdE9TS2V5bWFwKF9USElTKTsKLWV4dGVybiB2b2lkIEZCX1B1bXBFdmVudHMoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJtYXRyb3guYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibWF0cm94LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzEzMWEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJtYXRyb3guYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIi4uL1NETF9ibGl0LmgiCi0jaW5jbHVkZSAiU0RMX2ZibWF0cm94LmgiCi0jaW5jbHVkZSAibWF0cm94X21taW8uaCIKLQotCi0vKiBXYWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlIC0gdGFrZW4gZnJvbSB0aGUgWEZyZWU4NiBNYXRyb3ggZHJpdmVyICovCi1zdGF0aWMgdm9pZCBXYWl0VkJMKF9USElTKQotewotCWludCBjb3VudDsKLQotCS8qIGZpbmQgc3RhcnQgb2YgcmV0cmFjZSAqLwotCW1nYV93YWl0aWRsZSgpOwotCXdoaWxlICggIChtZ2FfaW44KDB4MUZEQSkgJiAweDA4KSApCi0JCTsKLQl3aGlsZSAoICEobWdhX2luOCgweDFGREEpICYgMHgwOCkgKQotCQk7IAotCS8qIHdhaXQgdW50aWwgd2UncmUgcGFzdCB0aGUgc3RhcnQgKi8KLQljb3VudCA9IG1nYV9pbjMyKDB4MUUyMCkgKyAyOwotCXdoaWxlICggbWdhX2luMzIoMHgxRTIwKSA8IGNvdW50ICkKLQkJOwotfQotc3RhdGljIHZvaWQgV2FpdElkbGUoX1RISVMpCi17Ci0JbWdhX3dhaXRpZGxlKCk7Ci19Ci0KLS8qIFNldHMgdmlkZW8gbWVtIGNvbG9ya2V5IGFuZCBhY2NlbGVyYXRlZCBibGl0IGZ1bmN0aW9uICovCi1zdGF0aWMgaW50IFNldEhXQ29sb3JLZXkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIga2V5KQotewotCXJldHVybigwKTsKLX0KLQotLyogU2V0cyBwZXIgc3VyZmFjZSBoYXJkd2FyZSBhbHBoYSB2YWx1ZSAqLwotI2lmIDAKLXN0YXRpYyBpbnQgU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQ4IHZhbHVlKQotewotCXJldHVybigwKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IEZpbGxIV1JlY3QoX1RISVMsIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpyZWN0LCBVaW50MzIgY29sb3IpCi17Ci0JaW50IGRzdFgsIGRzdFk7Ci0JVWludDMyIGZ4Ym5kcnk7Ci0JVWludDMyIHlkc3RsZW47Ci0JVWludDMyIGZpbGxvcDsKLQotCS8qIERvbid0IGJsaXQgdG8gdGhlIGRpc3BsYXkgc3VyZmFjZSB3aGVuIHN3aXRjaGVkIGF3YXkgKi8KLQlpZiAoIHN3aXRjaGVkX2F3YXkgKSB7Ci0JCXJldHVybiAtMjsgLyogbm8gaGFyZHdhcmUgYWNjZXNzICovCi0JfQotCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKLQkJU0RMX211dGV4UChod19sb2NrKTsKLQl9Ci0KLQlzd2l0Y2ggKGRzdC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7Ci0JICAgIGNhc2UgMToKLQkJY29sb3IgfD0gKGNvbG9yPDw4KTsKLQkgICAgY2FzZSAyOgotCQljb2xvciB8PSAoY29sb3I8PDE2KTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBYL1kgYmFzZSBjb29yZGluYXRlcyAqLwotCUZCX2RzdF90b194eSh0aGlzLCBkc3QsICZkc3RYLCAmZHN0WSk7Ci0KLQkvKiBBZGp1c3QgZm9yIHRoZSBjdXJyZW50IHJlY3RhbmdsZSAqLwotCWRzdFggKz0gcmVjdC0+eDsKLQlkc3RZICs9IHJlY3QtPnk7Ci0KLQkvKiBTZXQgdXAgdGhlIFggYm91bmRhcmllcyAqLwotCWZ4Ym5kcnkgPSAoZHN0WCB8ICgoZHN0WCtyZWN0LT53KSA8PCAxNikpOwotCi0JLyogU2V0IHVwIHRoZSBZIGJvdW5kYXJpZXMgKi8KLQl5ZHN0bGVuID0gKHJlY3QtPmggfCAoZHN0WSA8PCAxNikpOwotCi0JLyogU2V0IHVwIGZvciBjb2xvciBmaWxsIG9wZXJhdGlvbiAqLwotCWZpbGxvcCA9IE1HQURXR19UUkFQIHwgTUdBRFdHX1NPTElEIHwKLQkgICAgICAgICBNR0FEV0dfQVJaRVJPIHwgTUdBRFdHX1NHTlpFUk8gfCBNR0FEV0dfU0hJRlRaRVJPOwotCi0JLyogRXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyEgKi8KLQltZ2Ffd2FpdCg1KTsKLQltZ2Ffb3V0MzIoTUdBUkVHX0RXR0NUTCwgZmlsbG9wIHwgTUdBRFdHX1JFUExBQ0UpOwotCW1nYV9vdXQzMihNR0FSRUdfRkNPTCwgY29sb3IpOwotCW1nYV9vdXQzMihNR0FSRUdfRlhCTkRSWSwgZnhibmRyeSk7Ci0JbWdhX291dDMyKE1HQVJFR19ZRFNUTEVOICsgTUdBUkVHX0VYRUMsIHlkc3RsZW4pOwotCi0JRkJfQWRkQnVzeVN1cmZhY2UoZHN0KTsKLQotCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKLQkJU0RMX211dGV4Vihod19sb2NrKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IEhXQWNjZWxCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCWludCBwaXRjaCwgdywgaDsKLQlpbnQgc3JjWCwgc3JjWTsKLQlpbnQgZHN0WCwgZHN0WTsKLQlVaW50MzIgc2lnbjsKLQlVaW50MzIgc3RhcnQsIHN0b3A7Ci0JaW50IHNraXA7Ci0JVWludDMyIGJsaXRvcDsKLQotCS8qIEZJWE1FOiBGb3Igbm93LCBvbmx5IGJsaXQgdG8gZGlzcGxheSBzdXJmYWNlICovCi0JaWYgKCBkc3QtPnBpdGNoICE9IFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoICkgewotCQlyZXR1cm4oc3JjLT5tYXAtPnN3X2JsaXQoc3JjLCBzcmNyZWN0LCBkc3QsIGRzdHJlY3QpKTsKLQl9Ci0KLQkvKiBEb24ndCBibGl0IHRvIHRoZSBkaXNwbGF5IHN1cmZhY2Ugd2hlbiBzd2l0Y2hlZCBhd2F5ICovCi0JaWYgKCBzd2l0Y2hlZF9hd2F5ICkgewotCQlyZXR1cm4gLTI7IC8qIG5vIGhhcmR3YXJlIGFjY2VzcyAqLwotCX0KLQlpZiAoIGRzdCA9PSB0aGlzLT5zY3JlZW4gKSB7Ci0JCVNETF9tdXRleFAoaHdfbG9jayk7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmFzZSBjb29yZGluYXRlcyAoaW4gcGl4ZWxzKSAqLwotCXcgPSBkc3RyZWN0LT53OwotCWggPSBkc3RyZWN0LT5oOwotCUZCX2RzdF90b194eSh0aGlzLCBzcmMsICZzcmNYLCAmc3JjWSk7Ci0JRkJfZHN0X3RvX3h5KHRoaXMsIGRzdCwgJmRzdFgsICZkc3RZKTsKLQotCS8qIEFkanVzdCBmb3IgdGhlIGN1cnJlbnQgYmxpdCByZWN0YW5nbGVzICovCi0Jc3JjWCArPSBzcmNyZWN0LT54OwotCXNyY1kgKz0gc3JjcmVjdC0+eTsKLQlkc3RYICs9IGRzdHJlY3QtPng7Ci0JZHN0WSArPSBkc3RyZWN0LT55OwotCXBpdGNoID0gZHN0LT5waXRjaC9kc3QtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLQotCS8qIFNldCB1cCB0aGUgYmxpdCBkaXJlY3Rpb24gKHNpZ24pIGZsYWdzICovCi0Jc2lnbiA9IDA7Ci0JaWYgKCBzcmNYIDwgZHN0WCApIHsKLQkJc2lnbiB8PSAxOwotCX0KLQlpZiAoIHNyY1kgPCBkc3RZICkgewotCQlzaWduIHw9IDQ7Ci0JCXNyY1kgKz0gKGggLSAxKTsKLQkJZHN0WSArPSAoaCAtIDEpOwotCX0KLQotCS8qIFNldCB1cCB0aGUgYmxpdCBzb3VyY2Ugcm93IHN0YXJ0LCBlbmQsIGFuZCBza2lwIChpbiBwaXhlbHMpICovCi0Jc3RvcCA9IHN0YXJ0ID0gKHNyY1kgKiBwaXRjaCkgKyBzcmNYOwotCWlmICggc3JjWCA8IGRzdFggKSB7Ci0JCXN0YXJ0ICs9ICh3IC0gMSk7Ci0JfSBlbHNlIHsKLQkJc3RvcCAgKz0gKHcgLSAxKTsKLQl9Ci0JaWYgKCBzcmNZIDwgZHN0WSApIHsKLQkJc2tpcCA9IC1waXRjaDsKLQl9IGVsc2UgewotCQlza2lwID0gcGl0Y2g7Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBibGl0IG9wZXJhdGlvbiAqLwotCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSApIHsKLQkJVWludDMyIGNvbG9ya2V5OwotCi0JCWJsaXRvcCA9IE1HQURXR19CRkNPTCB8IE1HQURXR19CSVRCTFQgfAotCQkgICAgICAgICBNR0FEV0dfU0hJRlRaRVJPIHwgTUdBRFdHX1JTVFIgfCAoMHgwQyA8PCAxNikgfAotCQkgICAgICAgICBNR0FEV0dfVFJBTlNDOwotCi0JCWNvbG9ya2V5ID0gc3JjLT5mb3JtYXQtPmNvbG9ya2V5OwotCQlzd2l0Y2ggKGRzdC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7Ci0JCSAgICBjYXNlIDE6Ci0JCQljb2xvcmtleSB8PSAoY29sb3JrZXk8PDgpOwotCQkgICAgY2FzZSAyOgotCQkJY29sb3JrZXkgfD0gKGNvbG9ya2V5PDwxNik7Ci0JCQlicmVhazsKLQkJfQotCQltZ2Ffd2FpdCgyKTsKLQkJbWdhX291dDMyKE1HQVJFR19GQ09MLCBjb2xvcmtleSk7Ci0JCW1nYV9vdXQzMihNR0FSRUdfQkNPTCwgMHhGRkZGRkZGRik7Ci0JfSBlbHNlIHsKLQkJYmxpdG9wID0gTUdBRFdHX0JGQ09MIHwgTUdBRFdHX0JJVEJMVCB8Ci0JCSAgICAgICAgIE1HQURXR19TSElGVFpFUk8gfCBNR0FEV0dfUlNUUiB8ICgweDBDIDw8IDE2KTsKLQl9Ci0JbWdhX3dhaXQoNyk7Ci0JbWdhX291dDMyKE1HQVJFR19TR04sIHNpZ24pOwotCW1nYV9vdXQzMihNR0FSRUdfQVIzLCBzdGFydCk7Ci0JbWdhX291dDMyKE1HQVJFR19BUjAsIHN0b3ApOwotCW1nYV9vdXQzMihNR0FSRUdfQVI1LCBza2lwKTsKLQltZ2Ffb3V0MzIoTUdBUkVHX0ZYQk5EUlksIChkc3RYIHwgKChkc3RYICsgdy0xKSA8PCAxNikpKTsKLQltZ2Ffb3V0MzIoTUdBUkVHX1lEU1RMRU4sIChkc3RZIDw8IDE2KSB8IGgpOwotCW1nYV9vdXQzMihNR0FSRUdfRFdHQ1RMICsgTUdBUkVHX0VYRUMsIGJsaXRvcCk7Ci0KLQlGQl9BZGRCdXN5U3VyZmFjZShzcmMpOwotCUZCX0FkZEJ1c3lTdXJmYWNlKGRzdCk7Ci0KLQlpZiAoIGRzdCA9PSB0aGlzLT5zY3JlZW4gKSB7Ci0JCVNETF9tdXRleFYoaHdfbG9jayk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBDaGVja0hXQmxpdChfVEhJUywgU0RMX1N1cmZhY2UgKnNyYywgU0RMX1N1cmZhY2UgKmRzdCkKLXsKLQlpbnQgYWNjZWxlcmF0ZWQ7Ci0KLQkvKiBTZXQgaW5pdGlhbCBhY2NlbGVyYXRpb24gb24gKi8KLQlzcmMtPmZsYWdzIHw9IFNETF9IV0FDQ0VMOwotCi0JLyogU2V0IHRoZSBzdXJmYWNlIGF0dHJpYnV0ZXMgKi8KLQlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7Ci0JCWlmICggISB0aGlzLT5pbmZvLmJsaXRfaHdfQSApIHsKLQkJCXNyYy0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOwotCQl9Ci0JfQotCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSApIHsKLQkJaWYgKCAhIHRoaXMtPmluZm8uYmxpdF9od19DQyApIHsKLQkJCXNyYy0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIGZpbmFsIHN1cmZhY2UgYmxpdCBpcyBhY2NlbGVyYXRlZCAqLwotCWFjY2VsZXJhdGVkID0gISEoc3JjLT5mbGFncyAmIFNETF9IV0FDQ0VMKTsKLQlpZiAoIGFjY2VsZXJhdGVkICkgewotCQlzcmMtPm1hcC0+aHdfYmxpdCA9IEhXQWNjZWxCbGl0OwotCX0KLQlyZXR1cm4oYWNjZWxlcmF0ZWQpOwotfQotCi12b2lkIEZCX01hdHJveEFjY2VsKF9USElTLCBfX3UzMiBjYXJkKQotewotCS8qIFdlIGhhdmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLQl0aGlzLT5DaGVja0hXQmxpdCA9IENoZWNrSFdCbGl0OwotCXdhaXRfdmJsID0gV2FpdFZCTDsKLQl3YWl0X2lkbGUgPSBXYWl0SWRsZTsKLQotCS8qIFRoZSBNYXRyb3ggaGFzIGFuIGFjY2VsZXJhdGVkIGNvbG9yIGZpbGwgKi8KLQl0aGlzLT5pbmZvLmJsaXRfZmlsbCA9IDE7Ci0JdGhpcy0+RmlsbEhXUmVjdCA9IEZpbGxIV1JlY3Q7Ci0KLQkvKiBUaGUgTWF0cm94IGhhcyBhY2NlbGVyYXRlZCBub3JtYWwgYW5kIGNvbG9ya2V5IGJsaXRzLiAqLwotCXRoaXMtPmluZm8uYmxpdF9odyA9IDE7Ci0JLyogVGhlIE1pbGxlbml1bSBJIGFwcGVhcnMgdG8gZG8gdGhlIGNvbG9ya2V5IHRlc3QgYSB3b3JkCi0JICAgYXQgYSB0aW1lLCBhbmQgdGhlIHRyYW5zcGFyZW5jeSBpcyBpbnR2ZXJ0ZWQuICg/KQotCSAqLwotCWlmICggY2FyZCAhPSBGQl9BQ0NFTF9NQVRST1hfTUdBMjA2NFcgKSB7Ci0JCXRoaXMtPmluZm8uYmxpdF9od19DQyA9IDE7Ci0JCXRoaXMtPlNldEhXQ29sb3JLZXkgPSBTZXRIV0NvbG9yS2V5OwotCX0KLQotI2lmIDAgLyogTm90IHlldCBpbXBsZW1lbnRlZD8gKi8KLQkvKiBUaGUgTWF0cm94IEcyMDAvRzQwMCBoYXMgYW4gYWNjZWxlcmF0ZWQgYWxwaGEgYmxpdCAqLwotCWlmICggKGNhcmQgPT0gRkJfQUNDRUxfTUFUUk9YX01HQUcyMDApCi0JICB8fCAoY2FyZCA9PSBGQl9BQ0NFTF9NQVRST1hfTUdBRzQwMCkKLQkpIHsKLQkJdGhpcy0+aW5mby5ibGl0X2h3X0EgPSAxOwotCQl0aGlzLT5TZXRIV0FscGhhID0gU2V0SFdBbHBoYTsKLQl9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibWF0cm94LmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYm1hdHJveC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzIxNzg1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibWF0cm94LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogTWF0cm94IGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBmb3IgdGhlIFNETCBmcmFtZWJ1ZmZlciBjb25zb2xlIGRyaXZlciAqLwotCi0jaW5jbHVkZSAiU0RMX2ZidmlkZW8uaCIKLQotLyogU2V0IHVwIHRoZSBkcml2ZXIgZm9yIE1hdHJveCBhY2NlbGVyYXRpb24gKi8KLWV4dGVybiB2b2lkIEZCX01hdHJveEFjY2VsKF9USElTLCBfX3UzMiBjYXJkKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibW91c2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkMzBjZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYm1vdXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfZmJ2aWRlby5oIgotI2luY2x1ZGUgIlNETF9mYm1vdXNlX2MuaCIKLQotCi0vKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KLXN0cnVjdCBXTWN1cnNvciB7Ci0JaW50IHVudXNlZDsKLX07CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYm1vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibW91c2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTUwZjU2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibW91c2VfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfZmJ2aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2Zicml2YS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJyaXZhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzEyZGMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJyaXZhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYmxpdC5oIgotI2luY2x1ZGUgIlNETF9mYnJpdmEuaCIKLSNpbmNsdWRlICJyaXZhX21taW8uaCIKLSNpbmNsdWRlICJyaXZhX3JlZ3MuaCIKLQotCi1zdGF0aWMgaW50IEZpZm9FbXB0eUNvdW50ID0gMDsKLXN0YXRpYyBpbnQgRmlmb0ZyZWVDb3VudCA9IDA7Ci0KLS8qIFdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UgKi8KLXN0YXRpYyB2b2lkIFdhaXRWQkwoX1RISVMpCi17Ci0Jdm9sYXRpbGUgVWludDggKnBvcnQgPSAoVWludDggKikobWFwcGVkX2lvICsgUENJT19PRkZTRVQgKyAweDNEQSk7Ci0KLQl3aGlsZSAoICAoKnBvcnQgJiAweDA4KSApCi0JCTsKLQl3aGlsZSAoICEoKnBvcnQgJiAweDA4KSApCi0JCTsKLX0KLXN0YXRpYyB2b2lkIE5WM1dhaXRJZGxlKF9USElTKQotewotCVJpdmFSb3AgKlJvcCA9IChSaXZhUm9wICopKG1hcHBlZF9pbyArIFJPUF9PRkZTRVQpOwotCXdoaWxlICggKFJvcC0+Rmlmb0ZyZWUgPCBGaWZvRW1wdHlDb3VudCkgfHwKLQkgICAgICAgICgqKG1hcHBlZF9pbyArIFBHUkFQSF9PRkZTRVQgKyAweDAwMDAwNkIwKSAmIDB4MDEpICkKLQkJOwotfQotc3RhdGljIHZvaWQgTlY0V2FpdElkbGUoX1RISVMpCi17Ci0JUml2YVJvcCAqUm9wID0gKFJpdmFSb3AgKikobWFwcGVkX2lvICsgUk9QX09GRlNFVCk7Ci0Jd2hpbGUgKCAoUm9wLT5GaWZvRnJlZSA8IEZpZm9FbXB0eUNvdW50KSB8fAotCSAgICAgICAgKCoobWFwcGVkX2lvICsgUEdSQVBIX09GRlNFVCArIDB4MDAwMDA3MDApICYgMHgwMSkgKQotCQk7Ci19Ci0KLSNpZiAwIC8qIE5vdCB5ZXQgaW1wbGVtZW50ZWQ/ICovCi0vKiBTZXRzIHZpZGVvIG1lbSBjb2xvcmtleSBhbmQgYWNjZWxlcmF0ZWQgYmxpdCBmdW5jdGlvbiAqLwotc3RhdGljIGludCBTZXRIV0NvbG9yS2V5KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDMyIGtleSkKLXsKLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIFNldHMgcGVyIHN1cmZhY2UgaGFyZHdhcmUgYWxwaGEgdmFsdWUgKi8KLXN0YXRpYyBpbnQgU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQ4IHZhbHVlKQotewotCXJldHVybigwKTsKLX0KLSNlbmRpZiAvKiBOb3QgeWV0IGltcGxlbWVudGVkICovCi0KLXN0YXRpYyBpbnQgRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcikKLXsKLQlpbnQgZHN0WCwgZHN0WTsKLQlpbnQgZHN0VywgZHN0SDsKLQlSaXZhQml0bWFwICpCaXRtYXAgPSAoUml2YUJpdG1hcCAqKShtYXBwZWRfaW8gKyBCSVRNQVBfT0ZGU0VUKTsKLQotCS8qIERvbid0IGJsaXQgdG8gdGhlIGRpc3BsYXkgc3VyZmFjZSB3aGVuIHN3aXRjaGVkIGF3YXkgKi8KLQlpZiAoIHN3aXRjaGVkX2F3YXkgKSB7Ci0JCXJldHVybiAtMjsgLyogbm8gaGFyZHdhcmUgYWNjZXNzICovCi0JfQotCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKLQkJU0RMX211dGV4UChod19sb2NrKTsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIFgvWSBiYXNlIGNvb3JkaW5hdGVzICovCi0JZHN0VyA9IHJlY3QtPnc7Ci0JZHN0SCA9IHJlY3QtPmg7Ci0JRkJfZHN0X3RvX3h5KHRoaXMsIGRzdCwgJmRzdFgsICZkc3RZKTsKLQotCS8qIEFkanVzdCBmb3IgdGhlIGN1cnJlbnQgcmVjdGFuZ2xlICovCi0JZHN0WCArPSByZWN0LT54OwotCWRzdFkgKz0gcmVjdC0+eTsKLQotCVJJVkFfRklGT19GUkVFKEJpdG1hcCwgMSk7Ci0JQml0bWFwLT5Db2xvcjFBID0gY29sb3I7Ci0KLQlSSVZBX0ZJRk9fRlJFRShCaXRtYXAsIDIpOwotCUJpdG1hcC0+VW5jbGlwcGVkUmVjdGFuZ2xlWzBdLlRvcExlZnQgICAgID0gKGRzdFggPDwgMTYpIHwgZHN0WTsgCi0JQml0bWFwLT5VbmNsaXBwZWRSZWN0YW5nbGVbMF0uV2lkdGhIZWlnaHQgPSAoZHN0VyA8PCAxNikgfCBkc3RIOwotCi0JRkJfQWRkQnVzeVN1cmZhY2UoZHN0KTsKLQotCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKLQkJU0RMX211dGV4Vihod19sb2NrKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IEhXQWNjZWxCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCWludCBzcmNYLCBzcmNZOwotCWludCBkc3RYLCBkc3RZOwotCWludCBkc3RXLCBkc3RIOwotCVJpdmFTY3JlZW5CbHQgKkJsdCA9IChSaXZhU2NyZWVuQmx0ICopKG1hcHBlZF9pbyArIEJMVF9PRkZTRVQpOwotCi0JLyogRklYTUU6IEZvciBub3csIG9ubHkgYmxpdCB0byBkaXNwbGF5IHN1cmZhY2UgKi8KLQlpZiAoIGRzdC0+cGl0Y2ggIT0gU0RMX1ZpZGVvU3VyZmFjZS0+cGl0Y2ggKSB7Ci0JCXJldHVybihzcmMtPm1hcC0+c3dfYmxpdChzcmMsIHNyY3JlY3QsIGRzdCwgZHN0cmVjdCkpOwotCX0KLQotCS8qIERvbid0IGJsaXQgdG8gdGhlIGRpc3BsYXkgc3VyZmFjZSB3aGVuIHN3aXRjaGVkIGF3YXkgKi8KLQlpZiAoIHN3aXRjaGVkX2F3YXkgKSB7Ci0JCXJldHVybiAtMjsgLyogbm8gaGFyZHdhcmUgYWNjZXNzICovCi0JfQotCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKLQkJU0RMX211dGV4UChod19sb2NrKTsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBiYXNlIGNvb3JkaW5hdGVzIChpbiBwaXhlbHMpICovCi0JZHN0VyA9IGRzdHJlY3QtPnc7Ci0JZHN0SCA9IGRzdHJlY3QtPmg7Ci0JRkJfZHN0X3RvX3h5KHRoaXMsIHNyYywgJnNyY1gsICZzcmNZKTsKLQlGQl9kc3RfdG9feHkodGhpcywgZHN0LCAmZHN0WCwgJmRzdFkpOwotCi0JLyogQWRqdXN0IGZvciB0aGUgY3VycmVudCBibGl0IHJlY3RhbmdsZXMgKi8KLQlzcmNYICs9IHNyY3JlY3QtPng7Ci0Jc3JjWSArPSBzcmNyZWN0LT55OwotCWRzdFggKz0gZHN0cmVjdC0+eDsKLQlkc3RZICs9IGRzdHJlY3QtPnk7Ci0KLQlSSVZBX0ZJRk9fRlJFRShCbHQsIDMpOwotCUJsdC0+VG9wTGVmdFNyYyAgPSAoc3JjWSA8PCAxNikgfCBzcmNYOwotCUJsdC0+VG9wTGVmdERzdCAgPSAoZHN0WSA8PCAxNikgfCBkc3RYOwotCUJsdC0+V2lkdGhIZWlnaHQgPSAoZHN0SCAgPDwgMTYpIHwgZHN0VzsKLQotCUZCX0FkZEJ1c3lTdXJmYWNlKHNyYyk7Ci0JRkJfQWRkQnVzeVN1cmZhY2UoZHN0KTsKLQotCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKLQkJU0RMX211dGV4Vihod19sb2NrKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IENoZWNrSFdCbGl0KF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KQotewotCWludCBhY2NlbGVyYXRlZDsKLQotCS8qIFNldCBpbml0aWFsIGFjY2VsZXJhdGlvbiBvbiAqLwotCXNyYy0+ZmxhZ3MgfD0gU0RMX0hXQUNDRUw7Ci0KLQkvKiBTZXQgdGhlIHN1cmZhY2UgYXR0cmlidXRlcyAqLwotCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSApIHsKLQkJaWYgKCAhIHRoaXMtPmluZm8uYmxpdF9od19BICkgewotCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7Ci0JCX0KLQl9Ci0JaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgewotCQlpZiAoICEgdGhpcy0+aW5mby5ibGl0X2h3X0NDICkgewotCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgZmluYWwgc3VyZmFjZSBibGl0IGlzIGFjY2VsZXJhdGVkICovCi0JYWNjZWxlcmF0ZWQgPSAhIShzcmMtPmZsYWdzICYgU0RMX0hXQUNDRUwpOwotCWlmICggYWNjZWxlcmF0ZWQgKSB7Ci0JCXNyYy0+bWFwLT5od19ibGl0ID0gSFdBY2NlbEJsaXQ7Ci0JfQotCXJldHVybihhY2NlbGVyYXRlZCk7Ci19Ci0KLXZvaWQgRkJfUml2YUFjY2VsKF9USElTLCBfX3UzMiBjYXJkKQotewotCVJpdmFSb3AgKlJvcCA9IChSaXZhUm9wICopKG1hcHBlZF9pbyArIFJPUF9PRkZTRVQpOwotCi0JLyogV2UgaGF2ZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCBzdXJmYWNlIGZ1bmN0aW9ucyAqLwotCXRoaXMtPkNoZWNrSFdCbGl0ID0gQ2hlY2tIV0JsaXQ7Ci0Jd2FpdF92YmwgPSBXYWl0VkJMOwotCXN3aXRjaCAoY2FyZCkgewotCSAgICBjYXNlIEZCX0FDQ0VMX05WMzoKLQkJd2FpdF9pZGxlID0gTlYzV2FpdElkbGU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEZCX0FDQ0VMX05WNDoKLQkJd2FpdF9pZGxlID0gTlY0V2FpdElkbGU7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQkvKiBIbW0uLi4gRklYTUUgKi8KLQkJYnJlYWs7Ci0JfQotCUZpZm9FbXB0eUNvdW50ID0gUm9wLT5GaWZvRnJlZTsKLQotCS8qIFRoZSBSaXZhIGhhcyBhbiBhY2NlbGVyYXRlZCBjb2xvciBmaWxsICovCi0JdGhpcy0+aW5mby5ibGl0X2ZpbGwgPSAxOwotCXRoaXMtPkZpbGxIV1JlY3QgPSBGaWxsSFdSZWN0OwotCi0JLyogVGhlIFJpdmEgaGFzIGFjY2VsZXJhdGVkIG5vcm1hbCBhbmQgY29sb3JrZXkgYmxpdHMuICovCi0JdGhpcy0+aW5mby5ibGl0X2h3ID0gMTsKLSNpZiAwIC8qIE5vdCB5ZXQgaW1wbGVtZW50ZWQ/ICovCi0JdGhpcy0+aW5mby5ibGl0X2h3X0NDID0gMTsKLQl0aGlzLT5TZXRIV0NvbG9yS2V5ID0gU2V0SFdDb2xvcktleTsKLSNlbmRpZgotCi0jaWYgMCAvKiBOb3QgeWV0IGltcGxlbWVudGVkPyAqLwotCS8qIFRoZSBSaXZhIGhhcyBhbiBhY2NlbGVyYXRlZCBhbHBoYSBibGl0ICovCi0JdGhpcy0+aW5mby5ibGl0X2h3X0EgPSAxOwotCXRoaXMtPlNldEhXQWxwaGEgPSBTZXRIV0FscGhhOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYnJpdmEuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2Zicml2YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2NjNDcwLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2Zicml2YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFJpdmEgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGZvciB0aGUgU0RMIGZyYW1lYnVmZmVyIGNvbnNvbGUgZHJpdmVyICovCi0KLSNpbmNsdWRlICJTRExfZmJ2aWRlby5oIgotCi0jaWZuZGVmIEZCX0FDQ0VMX05WMwotI2RlZmluZSBGQl9BQ0NFTF9OVjMJMjcKLSNlbmRpZgotI2lmbmRlZiBGQl9BQ0NFTF9OVjQKLSNkZWZpbmUgRkJfQUNDRUxfTlY0CTI4Ci0jZW5kaWYKLQotLyogU2V0IHVwIHRoZSBkcml2ZXIgZm9yIFJpdmEgYWNjZWxlcmF0aW9uICovCi1leHRlcm4gdm9pZCBGQl9SaXZhQWNjZWwoX1RISVMsIF9fdTMyIGNhcmQpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJ2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJ2aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNThkMzk5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZidmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE3MDEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEZyYW1lYnVmZmVyIGNvbnNvbGUgYmFzZWQgU0RMIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4JCS8qIEZvciBkZWZpbml0aW9uIG9mIFBBR0VfU0laRSAqLwotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC92dC5oPgotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2ZibW91c2VfYy5oIgotI2luY2x1ZGUgIlNETF9mYmV2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX2ZiM2RmeC5oIgotI2luY2x1ZGUgIlNETF9mYm1hdHJveC5oIgotI2luY2x1ZGUgIlNETF9mYnJpdmEuaCIKLQotLyojZGVmaW5lIEZCQ09OX0RFQlVHKi8KLQotI2lmIGRlZmluZWQoaTM4NikgJiYgZGVmaW5lZChGQl9UWVBFX1ZHQV9QTEFORVMpCi0jZGVmaW5lIFZHQTE2X0ZCQ09OX1NVUFBPUlQKLSNpbmNsdWRlIDxzeXMvaW8uaD4JCS8qIEZvciBpb3Blcm0oKSAqLwotI2lmbmRlZiBGQl9BVVhfVkdBX1BMQU5FU19WR0E0Ci0jZGVmaW5lIEZCX0FVWF9WR0FfUExBTkVTX1ZHQTQJMAotI2VuZGlmCi0vKgotc3RhdGljIGlubGluZSB2b2lkIG91dGIgKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIHNob3J0IHBvcnQpCi17Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0YiAlYjAsJXcxIjo6ImEiICh2YWx1ZSksICJOZCIgKHBvcnQpKTsKLX0gCi0qLwotI2VuZGlmIC8qIEZCX1RZUEVfVkdBX1BMQU5FUyAqLwotCi0vKiBBIGxpc3Qgb2YgdmlkZW8gcmVzb2x1dGlvbnMgdGhhdCB3ZSBxdWVyeSBmb3IgKHNvcnRlZCBsYXJnZXN0IHRvIHNtYWxsZXN0KSAqLwotc3RhdGljIGNvbnN0IFNETF9SZWN0IGNoZWNrcmVzW10gPSB7Ci0JeyAgMCwgMCwgMTYwMCwgMTIwMCB9LAkJLyogMTYgYnBwOiAweDExRSwgb3IgMjg2ICovCi0JeyAgMCwgMCwgMTQwOCwgMTA1NiB9LAkJLyogMTYgYnBwOiAweDE5QSwgb3IgNDEwICovCi0JeyAgMCwgMCwgMTI4MCwgMTAyNCB9LAkJLyogMTYgYnBwOiAweDExQSwgb3IgMjgyICovCi0JeyAgMCwgMCwgMTE1MiwgIDg2NCB9LAkJLyogMTYgYnBwOiAweDE5Miwgb3IgNDAyICovCi0JeyAgMCwgMCwgMTAyNCwgIDc2OCB9LAkJLyogMTYgYnBwOiAweDExNywgb3IgMjc5ICovCi0JeyAgMCwgMCwgIDk2MCwgIDcyMCB9LAkJLyogMTYgYnBwOiAweDE4QSwgb3IgMzk0ICovCi0JeyAgMCwgMCwgIDgwMCwgIDYwMCB9LAkJLyogMTYgYnBwOiAweDExNCwgb3IgMjc2ICovCi0JeyAgMCwgMCwgIDc2OCwgIDU3NiB9LAkJLyogMTYgYnBwOiAweDE4Miwgb3IgMzg2ICovCi0JeyAgMCwgMCwgIDcyMCwgIDU3NiB9LAkJLyogUEFMICovCi0JeyAgMCwgMCwgIDcyMCwgIDQ4MCB9LAkJLyogTlRTQyAqLwotCXsgIDAsIDAsICA2NDAsICA0ODAgfSwJCS8qIDE2IGJwcDogMHgxMTEsIG9yIDI3MyAqLwotCXsgIDAsIDAsICA2NDAsICA0MDAgfSwJCS8qICA4IGJwcDogMHgxMDAsIG9yIDI1NiAqLwotCXsgIDAsIDAsICA1MTIsICAzODQgfSwKLQl7ICAwLCAwLCAgMzIwLCAgMjQwIH0sCi0JeyAgMCwgMCwgIDMyMCwgIDIwMCB9Ci19Owotc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0JaW50IHhyZXM7Ci0JaW50IHlyZXM7Ci0JaW50IHBpeGNsb2NrOwotCWludCBsZWZ0OwotCWludCByaWdodDsKLQlpbnQgdXBwZXI7Ci0JaW50IGxvd2VyOwotCWludCBoc2xlbjsKLQlpbnQgdnNsZW47Ci0JaW50IHN5bmM7Ci0JaW50IHZtb2RlOwotfSB2ZXNhX3RpbWluZ3NbXSA9IHsKLSNpZmRlZiBVU0VfVkVTQV9USU1JTkdTCS8qIE9ubHkgdGVzdGVkIG9uIE1hdHJveCBNaWxsZW5pdW0gSSAqLwotCXsgIDY0MCwgIDQwMCwgMzk3NzEsICA0OCwgMTYsIDM5LCAgOCwgIDk2LCAyLCAyLCAwIH0sCS8qIDcwIEh6ICovCi0JeyAgNjQwLCAgNDgwLCAzOTY4MywgIDQ4LCAxNiwgMzMsIDEwLCAgOTYsIDIsIDAsIDAgfSwJLyogNjAgSHogKi8KLQl7ICA3NjgsICA1NzYsIDI2MTAxLCAxNDQsIDE2LCAyOCwgIDYsIDExMiwgNCwgMCwgMCB9LAkvKiA2MCBIeiAqLwotCXsgIDgwMCwgIDYwMCwgMjQwMzgsIDE0NCwgMjQsIDI4LCAgOCwgMTEyLCA2LCAwLCAwIH0sCS8qIDYwIEh6ICovCi0JeyAgOTYwLCAgNzIwLCAxNzY4NiwgMTQ0LCAyNCwgMjgsICA4LCAxMTIsIDQsIDAsIDAgfSwJLyogNjAgSHogKi8KLQl7IDEwMjQsICA3NjgsIDE1Mzg2LCAxNjAsIDMyLCAzMCwgIDQsIDEyOCwgNCwgMCwgMCB9LAkvKiA2MCBIeiAqLwotCXsgMTE1MiwgIDg2NCwgMTIyODYsIDE5MiwgMzIsIDMwLCAgNCwgMTI4LCA0LCAwLCAwIH0sCS8qIDYwIEh6ICovCi0JeyAxMjgwLCAxMDI0LCAgOTM2OSwgMjI0LCAzMiwgMzIsICA0LCAxMzYsIDQsIDAsIDAgfSwJLyogNjAgSHogKi8KLQl7IDE0MDgsIDEwNTYsICA4MjE0LCAyNTYsIDQwLCAzMiwgIDUsIDE0NCwgNSwgMCwgMCB9LAkvKiA2MCBIeiAqLwotCXsgMTYwMCwgMTIwMCwvKj8qLzAsIDI3MiwgNDgsIDMyLCAgNSwgMTUyLCA1LCAwLCAwIH0sCS8qIDYwIEh6ICovCi0jZWxzZQotCS8qIFlvdSBjYW4gZ2VuZXJhdGUgdGhlc2UgdGltaW5ncyBmcm9tIHlvdXIgWEY4NkNvbmZpZyBmaWxlIHVzaW5nCi0JICAgdGhlICdtb2RlbGluZTJmYicgcGVybCBzY3JpcHQgaW5jbHVkZWQgd2l0aCB0aGUgZmJzZXQgcGFja2FnZS4KLQkgICBUaGVzZSB0aW1pbmdzIHdlcmUgZ2VuZXJhdGVkIGZvciBNYXRyb3ggTWlsbGVuaXVtIEksIDE1IiBtb25pdG9yLgotCSovCi0JeyAgMzIwLCAgMjAwLCA3OTQ0MCwgIDE2LCAxNiwgMjAsICA0LCAgNDgsIDEsIDAsIDIgfSwJLyogNzAgSHogKi8KLQl7ICAzMjAsICAyNDAsIDYzNDkyLCAgMTYsIDE2LCAxNiwgIDQsICA0OCwgMiwgMCwgMiB9LAkvKiA3MiBIeiAqLwotCXsgIDUxMiwgIDM4NCwgNDk2MDMsICA0OCwgMTYsIDE2LCAgMSwgIDY0LCAzLCAwLCAwIH0sCS8qIDc4IEh6ICovCi0JeyAgNjQwLCAgNDAwLCAzMTc0NiwgIDk2LCAzMiwgNDEsICAxLCAgNjQsIDMsIDIsIDAgfSwJLyogODUgSHogKi8KLQl7ICA2NDAsICA0ODAsIDMxNzQ2LCAxMjAsIDE2LCAxNiwgIDEsICA2NCwgMywgMCwgMCB9LAkvKiA3NSBIeiAqLwotCXsgIDc2OCwgIDU3NiwgMjYxMDEsIDE0NCwgMTYsIDI4LCAgNiwgMTEyLCA0LCAwLCAwIH0sCS8qIDYwIEh6ICovCi0JeyAgODAwLCAgNjAwLCAyMDAwMCwgIDY0LCA1NiwgMjMsIDM3LCAxMjAsIDYsIDMsIDAgfSwJLyogNzIgSHogKi8KLQl7ICA5NjAsICA3MjAsIDE3Njg2LCAxNDQsIDI0LCAyOCwgIDgsIDExMiwgNCwgMCwgMCB9LAkvKiA2MCBIeiAqLwotCXsgMTAyNCwgIDc2OCwgMTMzMzMsIDE0NCwgMjQsIDI5LCAgMywgMTM2LCA2LCAwLCAwIH0sCS8qIDcwIEh6ICovCi0JeyAxMTUyLCAgODY0LCAxMjI4NiwgMTkyLCAzMiwgMzAsICA0LCAxMjgsIDQsIDAsIDAgfSwJLyogNjAgSHogKi8KLQl7IDEyODAsIDEwMjQsICA5MzY5LCAyMjQsIDMyLCAzMiwgIDQsIDEzNiwgNCwgMCwgMCB9LAkvKiA2MCBIeiAqLwotCXsgMTQwOCwgMTA1NiwgIDgyMTQsIDI1NiwgNDAsIDMyLCAgNSwgMTQ0LCA1LCAwLCAwIH0sCS8qIDYwIEh6ICovCi0JeyAxNjAwLCAxMjAwLC8qPyovMCwgMjcyLCA0OCwgMzIsICA1LCAxNTIsIDUsIDAsIDAgfSwJLyogNjAgSHogKi8KLSNlbmRpZgotfTsKLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IEZCX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKLXN0YXRpYyBTRExfUmVjdCAqKkZCX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgU0RMX1N1cmZhY2UgKkZCX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLSNpZmRlZiBWR0ExNl9GQkNPTl9TVVBQT1JUCi1zdGF0aWMgU0RMX1N1cmZhY2UgKkZCX1NldFZHQTE2TW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLSNlbmRpZgotc3RhdGljIGludCBGQl9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpOwotc3RhdGljIHZvaWQgRkJfVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgRkJfSW5pdEhXU3VyZmFjZXMoX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4sIGNoYXIgKmJhc2UsIGludCBzaXplKTsKLXN0YXRpYyB2b2lkIEZCX0ZyZWVIV1N1cmZhY2VzKF9USElTKTsKLXN0YXRpYyBpbnQgRkJfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgRkJfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgRkJfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBGQl9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBGQl9XYWl0VkJMKF9USElTKTsKLXN0YXRpYyB2b2lkIEZCX1dhaXRJZGxlKF9USElTKTsKLXN0YXRpYyBpbnQgRkJfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0vKiBJbnRlcm5hbCBwYWxldHRlIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgRkJfU2F2ZVBhbGV0dGUoX1RISVMsIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2aW5mbyk7Ci1zdGF0aWMgdm9pZCBGQl9SZXN0b3JlUGFsZXR0ZShfVEhJUyk7Ci0KLXN0YXRpYyBpbnQgU0RMX2dldHBhZ2VzaXplKHZvaWQpCi17Ci0jaWZkZWYgSEFWRV9HRVRQQUdFU0laRQotCXJldHVybiBnZXRwYWdlc2l6ZSgpOwotI2VsaWYgZGVmaW5lZChQQUdFX1NJWkUpCi0JcmV0dXJuIFBBR0VfU0laRTsKLSNlbHNlCi0jZXJyb3IgQ2FuIG5vdCBkZXRlcm1pbmUgc3lzdGVtIHBhZ2Ugc2l6ZS4KLQlyZXR1cm4gNDA5NjsgIC8qIHRoaXMgaXMgd2hhdCBpdCBVU0VEIHRvIGJlIGluIExpbnV4Li4uICovCi0jZW5kaWYKLX0KLQotCi0vKiBTbWFsbCB3cmFwcGVyIGZvciBtbWFwKCkgc28gd2UgY2FuIHBsYXkgbmljZWx5IHdpdGggbm8tbW11IGhvc3RzCi0gKiAobm9uLW1tdSBob3N0cyBkaXNhbGxvdyB0aGUgTUFQX1NIQVJFRCBmbGFnKSAqLwotCi1zdGF0aWMgdm9pZCAqZG9fbW1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCwgaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCBvZmZfdCBvZmZzZXQpCi17Ci0Jdm9pZCAqcmV0OwotCXJldCA9IG1tYXAoc3RhcnQsIGxlbmd0aCwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQpOwotCWlmICggcmV0ID09IChjaGFyICopLTEgJiYgKGZsYWdzICYgTUFQX1NIQVJFRCkgKSB7Ci0JCXJldCA9IG1tYXAoc3RhcnQsIGxlbmd0aCwgcHJvdCwKLQkJICAgICAgICAgICAoZmxhZ3MgJiB+TUFQX1NIQVJFRCkgfCBNQVBfUFJJVkFURSwgZmQsIG9mZnNldCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIEZCIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBpbnQgRkJfQXZhaWxhYmxlKHZvaWQpCi17Ci0JaW50IGNvbnNvbGUgPSAtMTsKLQkvKiBBZGRlZCBjaGVjayBmb3IgL2ZiLzAgKGRldmZzKSAqLwotCS8qIGJ1dCAtIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmaXJzdC4uLiBpZiBpdCBmYWlscywgc3RpbGwgY2hlY2sgZGVmYXVsdHMgKi8KLQlpbnQgaWR4ID0gMDsKLQljb25zdCBjaGFyICpTRExfZmJkZXZzWzRdID0geyBOVUxMLCAiL2Rldi9mYjAiLCAiL2Rldi9mYi8wIiwgTlVMTCB9OwotCi0JU0RMX2ZiZGV2c1swXSA9IFNETF9nZXRlbnYoIlNETF9GQkRFViIpOwotCWlmKCAhU0RMX2ZiZGV2c1swXSApCi0JCWlkeCsrOwotCWZvciggOyBTRExfZmJkZXZzW2lkeF07IGlkeCsrICkKLQl7Ci0JCWNvbnNvbGUgPSBvcGVuKFNETF9mYmRldnNbaWR4XSwgT19SRFdSLCAwKTsKLQkJaWYgKCBjb25zb2xlID49IDAgKSB7Ci0JCQljbG9zZShjb25zb2xlKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybihjb25zb2xlID49IDApOwotfQotCi1zdGF0aWMgdm9pZCBGQl9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKkZCX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICp0aGlzOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQl0aGlzID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotCWlmICggdGhpcyApIHsKLQkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7Ci0JCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCX0KLQlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIHRoaXMgKSB7Ci0JCQlTRExfZnJlZSh0aGlzKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKLQl3YWl0X3ZibCA9IEZCX1dhaXRWQkw7Ci0Jd2FpdF9pZGxlID0gRkJfV2FpdElkbGU7Ci0JbW91c2VfZmQgPSAtMTsKLQlrZXlib2FyZF9mZCA9IC0xOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCXRoaXMtPlZpZGVvSW5pdCA9IEZCX1ZpZGVvSW5pdDsKLQl0aGlzLT5MaXN0TW9kZXMgPSBGQl9MaXN0TW9kZXM7Ci0JdGhpcy0+U2V0VmlkZW9Nb2RlID0gRkJfU2V0VmlkZW9Nb2RlOwotCXRoaXMtPlNldENvbG9ycyA9IEZCX1NldENvbG9yczsKLQl0aGlzLT5VcGRhdGVSZWN0cyA9IE5VTEw7Ci0JdGhpcy0+VmlkZW9RdWl0ID0gRkJfVmlkZW9RdWl0OwotCXRoaXMtPkFsbG9jSFdTdXJmYWNlID0gRkJfQWxsb2NIV1N1cmZhY2U7Ci0JdGhpcy0+Q2hlY2tIV0JsaXQgPSBOVUxMOwotCXRoaXMtPkZpbGxIV1JlY3QgPSBOVUxMOwotCXRoaXMtPlNldEhXQ29sb3JLZXkgPSBOVUxMOwotCXRoaXMtPlNldEhXQWxwaGEgPSBOVUxMOwotCXRoaXMtPkxvY2tIV1N1cmZhY2UgPSBGQl9Mb2NrSFdTdXJmYWNlOwotCXRoaXMtPlVubG9ja0hXU3VyZmFjZSA9IEZCX1VubG9ja0hXU3VyZmFjZTsKLQl0aGlzLT5GbGlwSFdTdXJmYWNlID0gRkJfRmxpcEhXU3VyZmFjZTsKLQl0aGlzLT5GcmVlSFdTdXJmYWNlID0gRkJfRnJlZUhXU3VyZmFjZTsKLQl0aGlzLT5TZXRDYXB0aW9uID0gTlVMTDsKLQl0aGlzLT5TZXRJY29uID0gTlVMTDsKLQl0aGlzLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKLQl0aGlzLT5HcmFiSW5wdXQgPSBOVUxMOwotCXRoaXMtPkdldFdNSW5mbyA9IE5VTEw7Ci0JdGhpcy0+SW5pdE9TS2V5bWFwID0gRkJfSW5pdE9TS2V5bWFwOwotCXRoaXMtPlB1bXBFdmVudHMgPSBGQl9QdW1wRXZlbnRzOwotCi0JdGhpcy0+ZnJlZSA9IEZCX0RlbGV0ZURldmljZTsKLQotCXJldHVybiB0aGlzOwotfQotCi1WaWRlb0Jvb3RTdHJhcCBGQkNPTl9ib290c3RyYXAgPSB7Ci0JImZiY29uIiwgIkxpbnV4IEZyYW1lYnVmZmVyIENvbnNvbGUiLAotCUZCX0F2YWlsYWJsZSwgRkJfQ3JlYXRlRGV2aWNlCi19OwotCi0jZGVmaW5lIEZCX01PREVTX0RCCSIvZXRjL2ZiLm1vZGVzIgotCi1zdGF0aWMgaW50IHJlYWRfZmJtb2Rlc19saW5lKEZJTEUqZiwgY2hhciogbGluZSwgaW50IGxlbmd0aCkKLXsKLQlpbnQgYmxhbms7Ci0JY2hhciogYzsKLQlpbnQgaTsKLQkKLQlibGFuaz0wOwotCS8qIGZpbmQgYSByZWxldmFudCBsaW5lICovCi0JZG8KLQl7Ci0JCWlmIChmZ2V0cyhsaW5lLGxlbmd0aCxmKTw9MCkKLQkJCXJldHVybiAwOwotCQljPWxpbmU7Ci0JCXdoaWxlKCgoKmM9PSdcdCcpfHwoKmM9PScgJykpJiYoKmMhPTApKQotCQkJYysrOwotCQkKLQkJaWYgKCgqYz09J1xuJyl8fCgqYz09JyMnKXx8KCpjPT0wKSkKLQkJCWJsYW5rPTE7Ci0JCWVsc2UKLQkJCWJsYW5rPTA7Ci0JfQotCXdoaWxlKGJsYW5rKTsKLQkvKiByZW1vdmUgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIHN0cmluZyAqLwotCWk9MDsKLQlkbwotCXsKLQkJbGluZVtpXT1jW2ldOwotCQlpKys7Ci0JfQotCXdoaWxlKGNbaV0hPTApOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHJlYWRfZmJtb2Rlc19tb2RlKEZJTEUgKmYsIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmluZm8pCi17Ci0JY2hhciBsaW5lWzEwMjRdOwotCWNoYXIgb3B0aW9uWzI1Nl07Ci0KLQkvKiBGaW5kIGEgImdlb21ldHJ5IiAqLwotCWRvIHsKLQkJaWYgKHJlYWRfZmJtb2Rlc19saW5lKGYsIGxpbmUsIHNpemVvZihsaW5lKSk9PTApCi0JCQlyZXR1cm4gMDsKLQkJaWYgKFNETF9zdHJuY21wKGxpbmUsImdlb21ldHJ5Iiw4KT09MCkKLQkJCWJyZWFrOwotCX0KLQl3aGlsZSgxKTsKLQotCVNETF9zc2NhbmYobGluZSwgImdlb21ldHJ5ICVkICVkICVkICVkICVkIiwgJnZpbmZvLT54cmVzLCAmdmluZm8tPnlyZXMsIAotCQkJJnZpbmZvLT54cmVzX3ZpcnR1YWwsICZ2aW5mby0+eXJlc192aXJ0dWFsLCAmdmluZm8tPmJpdHNfcGVyX3BpeGVsKTsKLQlpZiAocmVhZF9mYm1vZGVzX2xpbmUoZiwgbGluZSwgc2l6ZW9mKGxpbmUpKT09MCkKLQkJcmV0dXJuIDA7Ci0JCQkKLQlTRExfc3NjYW5mKGxpbmUsICJ0aW1pbmdzICVkICVkICVkICVkICVkICVkICVkIiwgJnZpbmZvLT5waXhjbG9jaywgCi0JCQkmdmluZm8tPmxlZnRfbWFyZ2luLCAmdmluZm8tPnJpZ2h0X21hcmdpbiwgJnZpbmZvLT51cHBlcl9tYXJnaW4sIAotCQkJJnZpbmZvLT5sb3dlcl9tYXJnaW4sICZ2aW5mby0+aHN5bmNfbGVuLCAmdmluZm8tPnZzeW5jX2xlbik7Ci0JCQotCXZpbmZvLT5zeW5jPTA7Ci0JdmluZm8tPnZtb2RlPUZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7Ci0JCQkJCi0JLyogUGFyc2UgbWlzYyBvcHRpb25zICovCi0JZG8gewotCQlpZiAocmVhZF9mYm1vZGVzX2xpbmUoZiwgbGluZSwgc2l6ZW9mKGxpbmUpKT09MCkKLQkJCXJldHVybiAwOwotCi0JCWlmIChTRExfc3RybmNtcChsaW5lLCJoc3luYyIsNSk9PTApIHsKLQkJCVNETF9zc2NhbmYobGluZSwiaHN5bmMgJXMiLG9wdGlvbik7Ci0JCQlpZiAoU0RMX3N0cm5jbXAob3B0aW9uLCJoaWdoIiw0KT09MCkKLQkJCQl2aW5mby0+c3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKLQkJfQotCQllbHNlIGlmIChTRExfc3RybmNtcChsaW5lLCJ2c3luYyIsNSk9PTApIHsKLQkJCVNETF9zc2NhbmYobGluZSwidnN5bmMgJXMiLG9wdGlvbik7Ci0JCQlpZiAoU0RMX3N0cm5jbXAob3B0aW9uLCJoaWdoIiw0KT09MCkKLQkJCQl2aW5mby0+c3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7Ci0JCX0KLQkJZWxzZSBpZiAoU0RMX3N0cm5jbXAobGluZSwiY3N5bmMiLDUpPT0wKSB7Ci0JCQlTRExfc3NjYW5mKGxpbmUsImNzeW5jICVzIixvcHRpb24pOwotCQkJaWYgKFNETF9zdHJuY21wKG9wdGlvbiwiaGlnaCIsNCk9PTApCi0JCQkJdmluZm8tPnN5bmMgfD0gRkJfU1lOQ19DT01QX0hJR0hfQUNUOwotCQl9Ci0JCWVsc2UgaWYgKFNETF9zdHJuY21wKGxpbmUsImV4dHN5bmMiLDUpPT0wKSB7Ci0JCQlTRExfc3NjYW5mKGxpbmUsImV4dHN5bmMgJXMiLG9wdGlvbik7Ci0JCQlpZiAoU0RMX3N0cm5jbXAob3B0aW9uLCJ0cnVlIiw0KT09MCkKLQkJCQl2aW5mby0+c3luYyB8PSBGQl9TWU5DX0VYVDsKLQkJfQotCQllbHNlIGlmIChTRExfc3RybmNtcChsaW5lLCJsYWNlZCIsNSk9PTApIHsKLQkJCVNETF9zc2NhbmYobGluZSwibGFjZWQgJXMiLG9wdGlvbik7Ci0JCQlpZiAoU0RMX3N0cm5jbXAob3B0aW9uLCJ0cnVlIiw0KT09MCkKLQkJCQl2aW5mby0+dm1vZGUgfD0gRkJfVk1PREVfSU5URVJMQUNFRDsKLQkJfQotCQllbHNlIGlmIChTRExfc3RybmNtcChsaW5lLCJkb3VibGUiLDYpPT0wKSB7Ci0JCQlTRExfc3NjYW5mKGxpbmUsImRvdWJsZSAlcyIsb3B0aW9uKTsKLQkJCWlmIChTRExfc3RybmNtcChvcHRpb24sInRydWUiLDQpPT0wKQotCQkJCXZpbmZvLT52bW9kZSB8PSBGQl9WTU9ERV9ET1VCTEU7Ci0JCX0KLQl9Ci0Jd2hpbGUoU0RMX3N0cm5jbXAobGluZSwiZW5kbW9kZSIsNykhPTApOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgRkJfQ2hlY2tNb2RlKF9USElTLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCB1bnNpZ25lZCBpbnQgKncsIHVuc2lnbmVkIGludCAqaCkKLXsKLQlpbnQgbW9kZV9va2F5OwotCi0JbW9kZV9va2F5ID0gMDsKLQl2aW5mby0+Yml0c19wZXJfcGl4ZWwgPSAoaW5kZXgrMSkqODsKLQl2aW5mby0+eHJlcyA9ICp3OwotCXZpbmZvLT54cmVzX3ZpcnR1YWwgPSAqdzsKLQl2aW5mby0+eXJlcyA9ICpoOwotCXZpbmZvLT55cmVzX3ZpcnR1YWwgPSAqaDsKLQl2aW5mby0+YWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9URVNUOwotCWlmICggaW9jdGwoY29uc29sZV9mZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgdmluZm8pID09IDAgKSB7Ci0jaWZkZWYgRkJDT05fREVCVUcKLQkJZnByaW50ZihzdGRlcnIsICJDaGVja2VkIG1vZGUgJWR4JWQgYXQgJWQgYnBwLCBnb3QgbW9kZSAlZHglZCBhdCAlZCBicHBcbiIsICp3LCAqaCwgKGluZGV4KzEpKjgsIHZpbmZvLT54cmVzLCB2aW5mby0+eXJlcywgdmluZm8tPmJpdHNfcGVyX3BpeGVsKTsKLSNlbmRpZgotCQlpZiAoICgoKHZpbmZvLT5iaXRzX3Blcl9waXhlbCs3KS84KS0xKSA9PSBpbmRleCApIHsKLQkJCSp3ID0gdmluZm8tPnhyZXM7Ci0JCQkqaCA9IHZpbmZvLT55cmVzOwotCQkJbW9kZV9va2F5ID0gMTsKLQkJfQotCX0KLQlyZXR1cm4gbW9kZV9va2F5OwotfQotCi1zdGF0aWMgaW50IEZCX0FkZE1vZGUoX1RISVMsIGludCBpbmRleCwgdW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoLCBpbnQgY2hlY2tfdGltaW5ncykKLXsKLQlTRExfUmVjdCAqbW9kZTsKLQlpbnQgaTsKLQlpbnQgbmV4dF9tb2RlOwotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIG1vZGUgKi8KLQlpZiAoIFNETF9udW1tb2Rlc1tpbmRleF0gPiAwICkgewotCQltb2RlID0gU0RMX21vZGVsaXN0W2luZGV4XVtTRExfbnVtbW9kZXNbaW5kZXhdLTFdOwotCQlpZiAoIChtb2RlLT53ID09IHcpICYmIChtb2RlLT5oID09IGgpICkgewotI2lmZGVmIEZCQ09OX0RFQlVHCi0JCQlmcHJpbnRmKHN0ZGVyciwgIldlIGFscmVhZHkgaGF2ZSBtb2RlICVkeCVkIGF0ICVkIGJ5dGVzIHBlciBwaXhlbFxuIiwgdywgaCwgaW5kZXgrMSk7Ci0jZW5kaWYKLQkJCXJldHVybigwKTsKLQkJfQotCX0KLQotCS8qIE9ubHkgYWxsb3cgYSBtb2RlIGlmIHdlIGhhdmUgYSB2YWxpZCB0aW1pbmcgZm9yIGl0ICovCi0JaWYgKCBjaGVja190aW1pbmdzICkgewotCQlpbnQgZm91bmRfdGltaW5nID0gMDsKLQkJZm9yICggaT0wOyBpPChzaXplb2YodmVzYV90aW1pbmdzKS9zaXplb2YodmVzYV90aW1pbmdzWzBdKSk7ICsraSApIHsKLQkJCWlmICggKHcgPT0gdmVzYV90aW1pbmdzW2ldLnhyZXMpICYmCi0JCQkgICAgIChoID09IHZlc2FfdGltaW5nc1tpXS55cmVzKSAmJiB2ZXNhX3RpbWluZ3NbaV0ucGl4Y2xvY2sgKSB7Ci0JCQkJZm91bmRfdGltaW5nID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoICFmb3VuZF90aW1pbmcgKSB7Ci0jaWZkZWYgRkJDT05fREVCVUcKLQkJCWZwcmludGYoc3RkZXJyLCAiTm8gdmFsaWQgdGltaW5nIGxpbmUgZm9yIG1vZGUgJWR4JWRcbiIsIHcsIGgpOwotI2VuZGlmCi0JCQlyZXR1cm4oMCk7Ci0JCX0KLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIG5ldyB2aWRlbyBtb2RlIHJlY3RhbmdsZSAqLwotCW1vZGUgPSAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZiAqbW9kZSk7Ci0JaWYgKCBtb2RlID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oLTEpOwotCX0KLQltb2RlLT54ID0gMDsKLQltb2RlLT55ID0gMDsKLQltb2RlLT53ID0gdzsKLQltb2RlLT5oID0gaDsKLSNpZmRlZiBGQkNPTl9ERUJVRwotCWZwcmludGYoc3RkZXJyLCAiQWRkaW5nIG1vZGUgJWR4JWQgYXQgJWQgYnl0ZXMgcGVyIHBpeGVsXG4iLCB3LCBoLCBpbmRleCsxKTsKLSNlbmRpZgotCi0JLyogQWxsb2NhdGUgdGhlIG5ldyBsaXN0IG9mIG1vZGVzLCBhbmQgZmlsbCBpbiB0aGUgbmV3IG1vZGUgKi8KLQluZXh0X21vZGUgPSBTRExfbnVtbW9kZXNbaW5kZXhdOwotCVNETF9tb2RlbGlzdFtpbmRleF0gPSAoU0RMX1JlY3QgKiopCi0JICAgICAgIFNETF9yZWFsbG9jKFNETF9tb2RlbGlzdFtpbmRleF0sICgxK25leHRfbW9kZSsxKSpzaXplb2YoU0RMX1JlY3QgKikpOwotCWlmICggU0RMX21vZGVsaXN0W2luZGV4XSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJU0RMX251bW1vZGVzW2luZGV4XSA9IDA7Ci0JCVNETF9mcmVlKG1vZGUpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZV0gPSBtb2RlOwotCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlKzFdID0gTlVMTDsKLQlTRExfbnVtbW9kZXNbaW5kZXhdKys7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgY21wbW9kZXMoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQotewotICAgIGNvbnN0IFNETF9SZWN0ICphID0gKihjb25zdCBTRExfUmVjdCoqKXZhOwotICAgIGNvbnN0IFNETF9SZWN0ICpiID0gKihjb25zdCBTRExfUmVjdCoqKXZiOwotICAgIGlmICggYS0+aCA9PSBiLT5oICkKLSAgICAgICAgcmV0dXJuIGItPncgLSBhLT53OwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGItPmggLSBhLT5oOwotfQotCi1zdGF0aWMgdm9pZCBGQl9Tb3J0TW9kZXMoX1RISVMpCi17Ci0JaW50IGk7Ci0JZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKLQkJaWYgKCBTRExfbnVtbW9kZXNbaV0gPiAwICkgewotCQkJU0RMX3Fzb3J0KFNETF9tb2RlbGlzdFtpXSwgU0RMX251bW1vZGVzW2ldLCBzaXplb2YgKlNETF9tb2RlbGlzdFtpXSwgY21wbW9kZXMpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IEZCX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotCWNvbnN0IGludCBwYWdlc2l6ZSA9IFNETF9nZXRwYWdlc2l6ZSgpOwotCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBmaW5mbzsKLQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmluZm87Ci0JaW50IGksIGo7Ci0JaW50IGN1cnJlbnRfaW5kZXg7Ci0JdW5zaWduZWQgaW50IGN1cnJlbnRfdzsKLQl1bnNpZ25lZCBpbnQgY3VycmVudF9oOwotCWNvbnN0IGNoYXIgKlNETF9mYmRldjsKLQlGSUxFICptb2Rlc2RiOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSAqLwotCVNETF9mYmRldiA9IFNETF9nZXRlbnYoIlNETF9GQkRFViIpOwotCWlmICggU0RMX2ZiZGV2ID09IE5VTEwgKSB7Ci0JCVNETF9mYmRldiA9ICIvZGV2L2ZiMCI7Ci0JfQotCWNvbnNvbGVfZmQgPSBvcGVuKFNETF9mYmRldiwgT19SRFdSLCAwKTsKLQlpZiAoIGNvbnNvbGVfZmQgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBvcGVuICVzIiwgU0RMX2ZiZGV2KTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLSNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKLQkvKiBDcmVhdGUgdGhlIGhhcmR3YXJlIHN1cmZhY2UgbG9jayBtdXRleCAqLwotCWh3X2xvY2sgPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLQlpZiAoIGh3X2xvY2sgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGxvY2sgbXV0ZXgiKTsKLQkJRkJfVmlkZW9RdWl0KHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLSNlbmRpZgotCi0JLyogR2V0IHRoZSB0eXBlIG9mIHZpZGVvIGhhcmR3YXJlICovCi0JaWYgKCBpb2N0bChjb25zb2xlX2ZkLCBGQklPR0VUX0ZTQ1JFRU5JTkZPLCAmZmluZm8pIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBnZXQgY29uc29sZSBoYXJkd2FyZSBpbmZvIik7Ci0JCUZCX1ZpZGVvUXVpdCh0aGlzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0Jc3dpdGNoIChmaW5mby50eXBlKSB7Ci0JCWNhc2UgRkJfVFlQRV9QQUNLRURfUElYRUxTOgotCQkJLyogU3VwcG9ydGVkLCBubyB3b3JyaWVzLi4gKi8KLQkJCWJyZWFrOwotI2lmZGVmIFZHQTE2X0ZCQ09OX1NVUFBPUlQKLQkJY2FzZSBGQl9UWVBFX1ZHQV9QTEFORVM6Ci0JCQkvKiBWR0ExNiBpcyBzdXBwb3J0ZWQsIGJ1dCB0aGF0J3MgaXQgKi8KLQkJCWlmICggZmluZm8udHlwZV9hdXggPT0gRkJfQVVYX1ZHQV9QTEFORVNfVkdBNCApIHsKLQkJCQlpZiAoIGlvcGVybSgweDNiNCwgMHgzZGYgLSAweDNiNCArIDEsIDEpIDwgMCApIHsKLQkJCQkJU0RMX1NldEVycm9yKCJObyBJL08gcG9ydCBwZXJtaXNzaW9ucyIpOwotCQkJCQlGQl9WaWRlb1F1aXQodGhpcyk7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXRoaXMtPlNldFZpZGVvTW9kZSA9IEZCX1NldFZHQTE2TW9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIEZhbGwgdGhyb3VnaCB0byB1bnN1cHBvcnRlZCBjYXNlICovCi0jZW5kaWYgLyogVkdBMTZfRkJDT05fU1VQUE9SVCAqLwotCQlkZWZhdWx0OgotCQkJU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBjb25zb2xlIGhhcmR3YXJlIik7Ci0JCQlGQl9WaWRlb1F1aXQodGhpcyk7Ci0JCQlyZXR1cm4oLTEpOwotCX0KLQlzd2l0Y2ggKGZpbmZvLnZpc3VhbCkgewotCQljYXNlIEZCX1ZJU1VBTF9UUlVFQ09MT1I6Ci0JCWNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgotCQljYXNlIEZCX1ZJU1VBTF9TVEFUSUNfUFNFVURPQ09MT1I6Ci0JCWNhc2UgRkJfVklTVUFMX0RJUkVDVENPTE9SOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGNvbnNvbGUgaGFyZHdhcmUiKTsKLQkJCUZCX1ZpZGVvUXVpdCh0aGlzKTsKLQkJCXJldHVybigtMSk7Ci0JfQotCi0JLyogQ2hlY2sgaWYgdGhlIHVzZXIgd2FudHMgdG8gZGlzYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gKi8KLQl7IGNvbnN0IGNoYXIgKmZiX2FjY2VsOwotCQlmYl9hY2NlbCA9IFNETF9nZXRlbnYoIlNETF9GQkFDQ0VMIik7Ci0JCWlmICggZmJfYWNjZWwgKSB7Ci0JCQlmaW5mby5hY2NlbCA9IFNETF9hdG9pKGZiX2FjY2VsKTsKLQkJfQotCX0KLQotCS8qIE1lbW9yeSBtYXAgdGhlIGRldmljZSwgY29tcGVuc2F0aW5nIGZvciBidWdneSBQUEMgbW1hcCgpICovCi0JbWFwcGVkX29mZnNldCA9ICgoKGxvbmcpZmluZm8uc21lbV9zdGFydCkgLQotCSAgICAgICAgICAgICAgICAoKChsb25nKWZpbmZvLnNtZW1fc3RhcnQpJn4ocGFnZXNpemUtMSkpKTsKLQltYXBwZWRfbWVtbGVuID0gZmluZm8uc21lbV9sZW4rbWFwcGVkX29mZnNldDsKLQltYXBwZWRfbWVtID0gZG9fbW1hcChOVUxMLCBtYXBwZWRfbWVtbGVuLAotCSAgICAgICAgICAgICAgICAgIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBjb25zb2xlX2ZkLCAwKTsKLQlpZiAoIG1hcHBlZF9tZW0gPT0gKGNoYXIgKiktMSApIHsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gbWVtb3J5IG1hcCB0aGUgdmlkZW8gaGFyZHdhcmUiKTsKLQkJbWFwcGVkX21lbSA9IE5VTEw7Ci0JCUZCX1ZpZGVvUXVpdCh0aGlzKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIGRlcHRoICovCi0JaWYgKCBpb2N0bChjb25zb2xlX2ZkLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmdmluZm8pIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBnZXQgY29uc29sZSBwaXhlbCBmb3JtYXQiKTsKLQkJRkJfVmlkZW9RdWl0KHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSB2aW5mby5iaXRzX3Blcl9waXhlbDsKLQlpZiAoIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDggKSB7Ci0JCS8qIEFzc3VtaW5nIFZHQTE2LCB3ZSBoYW5kbGUgdGhpcyB2aWEgYSBzaGFkb3cgZnJhbWVidWZmZXIgKi8KLQkJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gODsKLQl9Ci0JZm9yICggaT0wOyBpPHZpbmZvLnJlZC5sZW5ndGg7ICsraSApIHsKLQkJdmZvcm1hdC0+Um1hc2sgPDw9IDE7Ci0JCXZmb3JtYXQtPlJtYXNrIHw9ICgweDAwMDAwMDAxPDx2aW5mby5yZWQub2Zmc2V0KTsKLQl9Ci0JZm9yICggaT0wOyBpPHZpbmZvLmdyZWVuLmxlbmd0aDsgKytpICkgewotCQl2Zm9ybWF0LT5HbWFzayA8PD0gMTsKLQkJdmZvcm1hdC0+R21hc2sgfD0gKDB4MDAwMDAwMDE8PHZpbmZvLmdyZWVuLm9mZnNldCk7Ci0JfQotCWZvciAoIGk9MDsgaTx2aW5mby5ibHVlLmxlbmd0aDsgKytpICkgewotCQl2Zm9ybWF0LT5CbWFzayA8PD0gMTsKLQkJdmZvcm1hdC0+Qm1hc2sgfD0gKDB4MDAwMDAwMDE8PHZpbmZvLmJsdWUub2Zmc2V0KTsKLQl9Ci0Jc2F2ZWRfdmluZm8gPSB2aW5mbzsKLQotCS8qIFNhdmUgaGFyZHdhcmUgcGFsZXR0ZSwgaWYgbmVlZGVkICovCi0JRkJfU2F2ZVBhbGV0dGUodGhpcywgJmZpbmZvLCAmdmluZm8pOwotCi0JLyogSWYgdGhlIEkvTyByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZSwgbWVtb3J5IG1hcCB0aGVtIHNvIHdlCi0JICAgY2FuIHRha2UgYWR2YW50YWdlIG9mIGFueSBzdXBwb3J0ZWQgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgotCSAqLwotCXZpbmZvLmFjY2VsX2ZsYWdzID0gMDsJLyogVGVtcG9yYXJpbHkgcmVzZXJ2ZSByZWdpc3RlcnMgKi8KLQlpb2N0bChjb25zb2xlX2ZkLCBGQklPUFVUX1ZTQ1JFRU5JTkZPLCAmdmluZm8pOwotCWlmICggZmluZm8uYWNjZWwgJiYgZmluZm8ubW1pb19sZW4gKSB7Ci0JCW1hcHBlZF9pb2xlbiA9IGZpbmZvLm1taW9fbGVuOwotCQltYXBwZWRfaW8gPSBkb19tbWFwKE5VTEwsIG1hcHBlZF9pb2xlbiwgUFJPVF9SRUFEfFBST1RfV1JJVEUsCi0JCSAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgY29uc29sZV9mZCwgbWFwcGVkX21lbWxlbik7Ci0JCWlmICggbWFwcGVkX2lvID09IChjaGFyICopLTEgKSB7Ci0JCQkvKiBIbW0sIGZhaWxlZCB0byBtZW1vcnkgbWFwIEkvTyByZWdpc3RlcnMgKi8KLQkJCW1hcHBlZF9pbyA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQkvKiBRdWVyeSBmb3IgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHZpZGVvIG1vZGVzICovCi0JY3VycmVudF93ID0gdmluZm8ueHJlczsKLQljdXJyZW50X2ggPSB2aW5mby55cmVzOwotCWN1cnJlbnRfaW5kZXggPSAoKHZpbmZvLmJpdHNfcGVyX3BpeGVsKzcpLzgpLTE7Ci0JbW9kZXNkYiA9IGZvcGVuKEZCX01PREVTX0RCLCAiciIpOwotCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7Ci0JCVNETF9udW1tb2Rlc1tpXSA9IDA7Ci0JCVNETF9tb2RlbGlzdFtpXSA9IE5VTEw7Ci0JfQotCWlmICggU0RMX2dldGVudigiU0RMX0ZCX0JST0tFTl9NT0RFUyIpICE9IE5VTEwgKSB7Ci0JCUZCX0FkZE1vZGUodGhpcywgY3VycmVudF9pbmRleCwgY3VycmVudF93LCBjdXJyZW50X2gsIDApOwotCX0gZWxzZSBpZihtb2Rlc2RiKSB7Ci0JCXdoaWxlICggcmVhZF9mYm1vZGVzX21vZGUobW9kZXNkYiwgJnZpbmZvKSApIHsKLQkJCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7Ci0JCQkJdW5zaWduZWQgaW50IHcsIGg7Ci0KLQkJCQkvKiBTZWUgaWYgd2UgYXJlIHF1ZXJ5aW5nIGZvciB0aGUgY3VycmVudCBtb2RlICovCi0JCQkJdyA9IHZpbmZvLnhyZXM7Ci0JCQkJaCA9IHZpbmZvLnlyZXM7Ci0JCQkJaWYgKCBpID09IGN1cnJlbnRfaW5kZXggKSB7Ci0JCQkJCWlmICggKGN1cnJlbnRfdyA+IHcpIHx8IChjdXJyZW50X2ggPiBoKSApIHsKLQkJCQkJCS8qIE9ubHkgY2hlY2sgb25jZSAqLwotCQkJCQkJRkJfQWRkTW9kZSh0aGlzLCBpLCBjdXJyZW50X3csIGN1cnJlbnRfaCwgMCk7Ci0JCQkJCQljdXJyZW50X2luZGV4ID0gLTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCBGQl9DaGVja01vZGUodGhpcywgJnZpbmZvLCBpLCAmdywgJmgpICkgewotCQkJCQlGQl9BZGRNb2RlKHRoaXMsIGksIHcsIGgsIDApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmY2xvc2UobW9kZXNkYik7Ci0JCUZCX1NvcnRNb2Rlcyh0aGlzKTsKLQl9IGVsc2UgewotCQlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgewotCQkJZm9yICggaj0wOyBqPChzaXplb2YoY2hlY2tyZXMpL3NpemVvZihjaGVja3Jlc1swXSkpOyArK2ogKSB7Ci0JCQkJdW5zaWduZWQgaW50IHcsIGg7Ci0KLQkJCQkvKiBTZWUgaWYgd2UgYXJlIHF1ZXJ5aW5nIGZvciB0aGUgY3VycmVudCBtb2RlICovCi0JCQkJdyA9IGNoZWNrcmVzW2pdLnc7Ci0JCQkJaCA9IGNoZWNrcmVzW2pdLmg7Ci0JCQkJaWYgKCBpID09IGN1cnJlbnRfaW5kZXggKSB7Ci0JCQkJCWlmICggKGN1cnJlbnRfdyA+IHcpIHx8IChjdXJyZW50X2ggPiBoKSApIHsKLQkJCQkJCS8qIE9ubHkgY2hlY2sgb25jZSAqLwotCQkJCQkJRkJfQWRkTW9kZSh0aGlzLCBpLCBjdXJyZW50X3csIGN1cnJlbnRfaCwgMCk7Ci0JCQkJCQljdXJyZW50X2luZGV4ID0gLTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCBGQl9DaGVja01vZGUodGhpcywgJnZpbmZvLCBpLCAmdywgJmgpICkgewotCQkJCQlGQl9BZGRNb2RlKHRoaXMsIGksIHcsIGgsIDEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIEZpbGwgaW4gb3VyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBjYXBhYmlsaXRpZXMgKi8KLQl0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IGN1cnJlbnRfdzsKLQl0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IGN1cnJlbnRfaDsKLQl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDA7Ci0JdGhpcy0+aW5mby5od19hdmFpbGFibGUgPSAxOwotCXRoaXMtPmluZm8udmlkZW9fbWVtID0gZmluZm8uc21lbV9sZW4vMTAyNDsKLQlpZiAoIG1hcHBlZF9pbyApIHsKLQkJc3dpdGNoIChmaW5mby5hY2NlbCkgewotCQkgICAgY2FzZSBGQl9BQ0NFTF9NQVRST1hfTUdBMjA2NFc6Ci0JCSAgICBjYXNlIEZCX0FDQ0VMX01BVFJPWF9NR0ExMDY0U0c6Ci0JCSAgICBjYXNlIEZCX0FDQ0VMX01BVFJPWF9NR0EyMTY0VzoKLQkJICAgIGNhc2UgRkJfQUNDRUxfTUFUUk9YX01HQTIxNjRXX0FHUDoKLQkJICAgIGNhc2UgRkJfQUNDRUxfTUFUUk9YX01HQUcxMDA6Ci0JCSAgICAvKmNhc2UgRkJfQUNDRUxfTUFUUk9YX01HQUcyMDA6IEcyMDAgYWNjZWxlcmF0aW9uIGJyb2tlbiEgKi8KLQkJICAgIGNhc2UgRkJfQUNDRUxfTUFUUk9YX01HQUc0MDA6Ci0jaWZkZWYgRkJBQ0NFTF9ERUJVRwotCQkJcHJpbnRmKCJNYXRyb3ggaGFyZHdhcmUgYWNjZWxlcmF0b3IhXG4iKTsKLSNlbmRpZgotCQkJRkJfTWF0cm94QWNjZWwodGhpcywgZmluZm8uYWNjZWwpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEZCX0FDQ0VMXzNERlhfQkFOU0hFRToKLSNpZmRlZiBGQkFDQ0VMX0RFQlVHCi0JCQlwcmludGYoIjNERlggaGFyZHdhcmUgYWNjZWxlcmF0b3IhXG4iKTsKLSNlbmRpZgotCQkJRkJfM0RmeEFjY2VsKHRoaXMsIGZpbmZvLmFjY2VsKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBGQl9BQ0NFTF9OVjM6Ci0JCSAgICBjYXNlIEZCX0FDQ0VMX05WNDoKLSNpZmRlZiBGQkFDQ0VMX0RFQlVHCi0JCQlwcmludGYoIk5WaWRpYSBoYXJkd2FyZSBhY2NlbGVyYXRvciFcbiIpOwotI2VuZGlmCi0JCQlGQl9SaXZhQWNjZWwodGhpcywgZmluZm8uYWNjZWwpOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotI2lmZGVmIEZCQUNDRUxfREVCVUcKLQkJCXByaW50ZigiVW5rbm93biBoYXJkd2FyZSBhY2NlbGVyYXRvci5cbiIpOwotI2VuZGlmCi0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIEVuYWJsZSBtb3VzZSBhbmQga2V5Ym9hcmQgc3VwcG9ydCAqLwotCWlmICggRkJfT3BlbktleWJvYXJkKHRoaXMpIDwgMCApIHsKLQkJRkJfVmlkZW9RdWl0KHRoaXMpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlpZiAoIEZCX09wZW5Nb3VzZSh0aGlzKSA8IDAgKSB7Ci0JCWNvbnN0IGNoYXIgKnNkbF9ub21vdXNlOwotCi0JCXNkbF9ub21vdXNlID0gU0RMX2dldGVudigiU0RMX05PTU9VU0UiKTsKLQkJaWYgKCAhIHNkbF9ub21vdXNlICkgewotCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gb3BlbiBtb3VzZSIpOwotCQkJRkJfVmlkZW9RdWl0KHRoaXMpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCX0KLQotCS8qIFdlJ3JlIGRvbmUhICovCi0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgU0RMX1JlY3QgKipGQl9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCi17Ci0JcmV0dXJuKFNETF9tb2RlbGlzdFsoKGZvcm1hdC0+Qml0c1BlclBpeGVsKzcpLzgpLTFdKTsKLX0KLQotLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KLXN0YXRpYyB2b2lkIEZCX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotI2lmZGVmIFZHQTE2X0ZCQ09OX1NVUFBPUlQKLXN0YXRpYyB2b2lkIEZCX1ZHQTE2VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci0jZW5kaWYKLQotI2lmZGVmIEZCQ09OX0RFQlVHCi1zdGF0aWMgdm9pZCBwcmludF92aW5mbyhzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZpbmZvKQotewotCWZwcmludGYoc3RkZXJyLCAiUHJpbnRpbmcgdmluZm86XG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0eHJlczogJWRcbiIsIHZpbmZvLT54cmVzKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0eXJlczogJWRcbiIsIHZpbmZvLT55cmVzKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0eHJlc192aXJ0dWFsOiAlZFxuIiwgdmluZm8tPnhyZXNfdmlydHVhbCk7Ci0JZnByaW50ZihzdGRlcnIsICJcdHlyZXNfdmlydHVhbDogJWRcbiIsIHZpbmZvLT55cmVzX3ZpcnR1YWwpOwotCWZwcmludGYoc3RkZXJyLCAiXHR4b2Zmc2V0OiAlZFxuIiwgdmluZm8tPnhvZmZzZXQpOwotCWZwcmludGYoc3RkZXJyLCAiXHR5b2Zmc2V0OiAlZFxuIiwgdmluZm8tPnlvZmZzZXQpOwotCWZwcmludGYoc3RkZXJyLCAiXHRiaXRzX3Blcl9waXhlbDogJWRcbiIsIHZpbmZvLT5iaXRzX3Blcl9waXhlbCk7Ci0JZnByaW50ZihzdGRlcnIsICJcdGdyYXlzY2FsZTogJWRcbiIsIHZpbmZvLT5ncmF5c2NhbGUpOwotCWZwcmludGYoc3RkZXJyLCAiXHRub25zdGQ6ICVkXG4iLCB2aW5mby0+bm9uc3RkKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0YWN0aXZhdGU6ICVkXG4iLCB2aW5mby0+YWN0aXZhdGUpOwotCWZwcmludGYoc3RkZXJyLCAiXHRoZWlnaHQ6ICVkXG4iLCB2aW5mby0+aGVpZ2h0KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0d2lkdGg6ICVkXG4iLCB2aW5mby0+d2lkdGgpOwotCWZwcmludGYoc3RkZXJyLCAiXHRhY2NlbF9mbGFnczogJWRcbiIsIHZpbmZvLT5hY2NlbF9mbGFncyk7Ci0JZnByaW50ZihzdGRlcnIsICJcdHBpeGNsb2NrOiAlZFxuIiwgdmluZm8tPnBpeGNsb2NrKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0bGVmdF9tYXJnaW46ICVkXG4iLCB2aW5mby0+bGVmdF9tYXJnaW4pOwotCWZwcmludGYoc3RkZXJyLCAiXHRyaWdodF9tYXJnaW46ICVkXG4iLCB2aW5mby0+cmlnaHRfbWFyZ2luKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0dXBwZXJfbWFyZ2luOiAlZFxuIiwgdmluZm8tPnVwcGVyX21hcmdpbik7Ci0JZnByaW50ZihzdGRlcnIsICJcdGxvd2VyX21hcmdpbjogJWRcbiIsIHZpbmZvLT5sb3dlcl9tYXJnaW4pOwotCWZwcmludGYoc3RkZXJyLCAiXHRoc3luY19sZW46ICVkXG4iLCB2aW5mby0+aHN5bmNfbGVuKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0dnN5bmNfbGVuOiAlZFxuIiwgdmluZm8tPnZzeW5jX2xlbik7Ci0JZnByaW50ZihzdGRlcnIsICJcdHN5bmM6ICVkXG4iLCB2aW5mby0+c3luYyk7Ci0JZnByaW50ZihzdGRlcnIsICJcdHZtb2RlOiAlZFxuIiwgdmluZm8tPnZtb2RlKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0cmVkOiAlZC8lZFxuIiwgdmluZm8tPnJlZC5sZW5ndGgsIHZpbmZvLT5yZWQub2Zmc2V0KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0Z3JlZW46ICVkLyVkXG4iLCB2aW5mby0+Z3JlZW4ubGVuZ3RoLCB2aW5mby0+Z3JlZW4ub2Zmc2V0KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0Ymx1ZTogJWQvJWRcbiIsIHZpbmZvLT5ibHVlLmxlbmd0aCwgdmluZm8tPmJsdWUub2Zmc2V0KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0YWxwaGE6ICVkLyVkXG4iLCB2aW5mby0+dHJhbnNwLmxlbmd0aCwgdmluZm8tPnRyYW5zcC5vZmZzZXQpOwotfQotc3RhdGljIHZvaWQgcHJpbnRfZmluZm8oc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaW5mbykKLXsKLQlmcHJpbnRmKHN0ZGVyciwgIlByaW50aW5nIGZpbmZvOlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJcdHNtZW1fc3RhcnQgPSAlcFxuIiwgKGNoYXIgKilmaW5mby0+c21lbV9zdGFydCk7Ci0JZnByaW50ZihzdGRlcnIsICJcdHNtZW1fbGVuID0gJWRcbiIsIGZpbmZvLT5zbWVtX2xlbik7Ci0JZnByaW50ZihzdGRlcnIsICJcdHR5cGUgPSAlZFxuIiwgZmluZm8tPnR5cGUpOwotCWZwcmludGYoc3RkZXJyLCAiXHR0eXBlX2F1eCA9ICVkXG4iLCBmaW5mby0+dHlwZV9hdXgpOwotCWZwcmludGYoc3RkZXJyLCAiXHR2aXN1YWwgPSAlZFxuIiwgZmluZm8tPnZpc3VhbCk7Ci0JZnByaW50ZihzdGRlcnIsICJcdHhwYW5zdGVwID0gJWRcbiIsIGZpbmZvLT54cGFuc3RlcCk7Ci0JZnByaW50ZihzdGRlcnIsICJcdHlwYW5zdGVwID0gJWRcbiIsIGZpbmZvLT55cGFuc3RlcCk7Ci0JZnByaW50ZihzdGRlcnIsICJcdHl3cmFwc3RlcCA9ICVkXG4iLCBmaW5mby0+eXdyYXBzdGVwKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0bGluZV9sZW5ndGggPSAlZFxuIiwgZmluZm8tPmxpbmVfbGVuZ3RoKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0bW1pb19zdGFydCA9ICVwXG4iLCAoY2hhciAqKWZpbmZvLT5tbWlvX3N0YXJ0KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0bW1pb19sZW4gPSAlZFxuIiwgZmluZm8tPm1taW9fbGVuKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0YWNjZWwgPSAlZFxuIiwgZmluZm8tPmFjY2VsKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGNob29zZV9mYm1vZGVzX21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2aW5mbykKLXsKLQlpbnQgbWF0Y2hlZDsKLQlGSUxFICptb2Rlc2RiOwotCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBjaW5mbzsKLQotCW1hdGNoZWQgPSAwOwotCW1vZGVzZGIgPSBmb3BlbihGQl9NT0RFU19EQiwgInIiKTsKLQlpZiAoIG1vZGVzZGIgKSB7Ci0JCS8qIFBhcnNlIHRoZSBtb2RlIGRlZmluaXRpb24gZmlsZSAqLwotCQl3aGlsZSAoIHJlYWRfZmJtb2Rlc19tb2RlKG1vZGVzZGIsICZjaW5mbykgKSB7Ci0JCQlpZiAoICh2aW5mby0+eHJlcyA9PSBjaW5mby54cmVzICYmIHZpbmZvLT55cmVzID09IGNpbmZvLnlyZXMpICYmCi0JCQkgICAgICghbWF0Y2hlZCB8fCAodmluZm8tPmJpdHNfcGVyX3BpeGVsID09IGNpbmZvLmJpdHNfcGVyX3BpeGVsKSkgKSB7Ci0JCQkJdmluZm8tPnBpeGNsb2NrID0gY2luZm8ucGl4Y2xvY2s7Ci0JCQkJdmluZm8tPmxlZnRfbWFyZ2luID0gY2luZm8ubGVmdF9tYXJnaW47Ci0JCQkJdmluZm8tPnJpZ2h0X21hcmdpbiA9IGNpbmZvLnJpZ2h0X21hcmdpbjsKLQkJCQl2aW5mby0+dXBwZXJfbWFyZ2luID0gY2luZm8udXBwZXJfbWFyZ2luOwotCQkJCXZpbmZvLT5sb3dlcl9tYXJnaW4gPSBjaW5mby5sb3dlcl9tYXJnaW47Ci0JCQkJdmluZm8tPmhzeW5jX2xlbiA9IGNpbmZvLmhzeW5jX2xlbjsKLQkJCQl2aW5mby0+dnN5bmNfbGVuID0gY2luZm8udnN5bmNfbGVuOwotCQkJCWlmICggbWF0Y2hlZCApIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW1hdGNoZWQgPSAxOwotCQkJfQotCQl9Ci0JCWZjbG9zZShtb2Rlc2RiKTsKLQl9Ci0JcmV0dXJuKG1hdGNoZWQpOwotfQotCi1zdGF0aWMgaW50IGNob29zZV92ZXNhX21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2aW5mbykKLXsKLQlpbnQgbWF0Y2hlZDsKLQlpbnQgaTsKLQotCS8qIENoZWNrIGZvciBWRVNBIHRpbWluZ3MgKi8KLQltYXRjaGVkID0gMDsKLQlmb3IgKCBpPTA7IGk8KHNpemVvZih2ZXNhX3RpbWluZ3MpL3NpemVvZih2ZXNhX3RpbWluZ3NbMF0pKTsgKytpICkgewotCQlpZiAoICh2aW5mby0+eHJlcyA9PSB2ZXNhX3RpbWluZ3NbaV0ueHJlcykgJiYKLQkJICAgICAodmluZm8tPnlyZXMgPT0gdmVzYV90aW1pbmdzW2ldLnlyZXMpICkgewotI2lmZGVmIEZCQ09OX0RFQlVHCi0JCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIFZFU0EgdGltaW5ncyBmb3IgJWR4JWRcbiIsCi0JCQkJCQl2aW5mby0+eHJlcywgdmluZm8tPnlyZXMpOwotI2VuZGlmCi0JCQlpZiAoIHZlc2FfdGltaW5nc1tpXS5waXhjbG9jayApIHsKLQkJCQl2aW5mby0+cGl4Y2xvY2sgPSB2ZXNhX3RpbWluZ3NbaV0ucGl4Y2xvY2s7Ci0JCQl9Ci0JCQl2aW5mby0+bGVmdF9tYXJnaW4gPSB2ZXNhX3RpbWluZ3NbaV0ubGVmdDsKLQkJCXZpbmZvLT5yaWdodF9tYXJnaW4gPSB2ZXNhX3RpbWluZ3NbaV0ucmlnaHQ7Ci0JCQl2aW5mby0+dXBwZXJfbWFyZ2luID0gdmVzYV90aW1pbmdzW2ldLnVwcGVyOwotCQkJdmluZm8tPmxvd2VyX21hcmdpbiA9IHZlc2FfdGltaW5nc1tpXS5sb3dlcjsKLQkJCXZpbmZvLT5oc3luY19sZW4gPSB2ZXNhX3RpbWluZ3NbaV0uaHNsZW47Ci0JCQl2aW5mby0+dnN5bmNfbGVuID0gdmVzYV90aW1pbmdzW2ldLnZzbGVuOwotCQkJdmluZm8tPnN5bmMgPSB2ZXNhX3RpbWluZ3NbaV0uc3luYzsKLQkJCXZpbmZvLT52bW9kZSA9IHZlc2FfdGltaW5nc1tpXS52bW9kZTsKLQkJCW1hdGNoZWQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuKG1hdGNoZWQpOwotfQotCi0jaWZkZWYgVkdBMTZfRkJDT05fU1VQUE9SVAotc3RhdGljIFNETF9TdXJmYWNlICpGQl9TZXRWR0ExNk1vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAotCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQotewotCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBmaW5mbzsKLQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmluZm87Ci0KLQkvKiBTZXQgdGhlIHRlcm1pbmFsIGludG8gZ3JhcGhpY3MgbW9kZSAqLwotCWlmICggRkJfRW50ZXJHcmFwaGljc01vZGUodGhpcykgPCAwICkgewotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgcGFsZXR0ZSAqLwotCUZCX1Jlc3RvcmVQYWxldHRlKHRoaXMpOwotCi0JLyogU2V0IHRoZSB2aWRlbyBtb2RlIGFuZCBnZXQgdGhlIGZpbmFsIHNjcmVlbiBmb3JtYXQgKi8KLQlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2aW5mbykgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBjb25zb2xlIHNjcmVlbiBpbmZvIik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JY2FjaGVfdmluZm8gPSB2aW5mbzsKLSNpZmRlZiBGQkNPTl9ERUJVRwotCWZwcmludGYoc3RkZXJyLCAiUHJpbnRpbmcgYWN0dWFsIHZpbmZvOlxuIik7Ci0JcHJpbnRfdmluZm8oJnZpbmZvKTsKLSNlbmRpZgotCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBicHAsIDAsIDAsIDAsIDApICkgewotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCWN1cnJlbnQtPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9ycyA9IDE2OwotCi0JLyogR2V0IHRoZSBmaXhlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29uc29sZSBoYXJkd2FyZS4KLQkgICBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSBmaW5mby5saW5lX2xlbmd0aCBjaGFuZ2VzLgotCSAqLwotCWlmICggaW9jdGwoY29uc29sZV9mZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywgJmZpbmZvKSA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IGNvbnNvbGUgaGFyZHdhcmUgaW5mbyIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotI2lmZGVmIEZCQ09OX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJQcmludGluZyBhY3R1YWwgZmluZm86XG4iKTsKLQlwcmludF9maW5mbygmZmluZm8pOwotI2VuZGlmCi0KLQkvKiBTYXZlIGhhcmR3YXJlIHBhbGV0dGUsIGlmIG5lZWRlZCAqLwotCUZCX1NhdmVQYWxldHRlKHRoaXMsICZmaW5mbywgJnZpbmZvKTsKLQotCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KLQljdXJyZW50LT5mbGFncyA9IFNETF9GVUxMU0NSRUVOOwotCWN1cnJlbnQtPncgPSB2aW5mby54cmVzOwotCWN1cnJlbnQtPmggPSB2aW5mby55cmVzOwotCWN1cnJlbnQtPnBpdGNoID0gY3VycmVudC0+dzsKLQljdXJyZW50LT5waXhlbHMgPSBTRExfbWFsbG9jKGN1cnJlbnQtPmgqY3VycmVudC0+cGl0Y2gpOwotCi0JLyogU2V0IHRoZSB1cGRhdGUgcmVjdGFuZ2xlIGZ1bmN0aW9uICovCi0JdGhpcy0+VXBkYXRlUmVjdHMgPSBGQl9WR0ExNlVwZGF0ZTsKLQotCS8qIFdlJ3JlIGRvbmUgKi8KLQlyZXR1cm4oY3VycmVudCk7Ci19Ci0jZW5kaWYgLyogVkdBMTZfRkJDT05fU1VQUE9SVCAqLwotCi1zdGF0aWMgU0RMX1N1cmZhY2UgKkZCX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpbmZvOwotCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2aW5mbzsKLQlpbnQgaTsKLQlVaW50MzIgUm1hc2s7Ci0JVWludDMyIEdtYXNrOwotCVVpbnQzMiBCbWFzazsKLQljaGFyICpzdXJmYWNlc19tZW07Ci0JaW50IHN1cmZhY2VzX2xlbjsKLQotCS8qIFNldCB0aGUgdGVybWluYWwgaW50byBncmFwaGljcyBtb2RlICovCi0JaWYgKCBGQl9FbnRlckdyYXBoaWNzTW9kZSh0aGlzKSA8IDAgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwYWxldHRlICovCi0JRkJfUmVzdG9yZVBhbGV0dGUodGhpcyk7Ci0KLQkvKiBTZXQgdGhlIHZpZGVvIG1vZGUgYW5kIGdldCB0aGUgZmluYWwgc2NyZWVuIGZvcm1hdCAqLwotCWlmICggaW9jdGwoY29uc29sZV9mZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJnZpbmZvKSA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IGNvbnNvbGUgc2NyZWVuIGluZm8iKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLSNpZmRlZiBGQkNPTl9ERUJVRwotCWZwcmludGYoc3RkZXJyLCAiUHJpbnRpbmcgb3JpZ2luYWwgdmluZm86XG4iKTsKLQlwcmludF92aW5mbygmdmluZm8pOwotI2VuZGlmCi0JaWYgKCAodmluZm8ueHJlcyAhPSB3aWR0aCkgfHwgKHZpbmZvLnlyZXMgIT0gaGVpZ2h0KSB8fAotCSAgICAgKHZpbmZvLmJpdHNfcGVyX3BpeGVsICE9IGJwcCkgfHwgKGZsYWdzICYgU0RMX0RPVUJMRUJVRikgKSB7Ci0JCXZpbmZvLmFjdGl2YXRlID0gRkJfQUNUSVZBVEVfTk9XOwotCQl2aW5mby5hY2NlbF9mbGFncyA9IDA7Ci0JCXZpbmZvLmJpdHNfcGVyX3BpeGVsID0gYnBwOwotCQl2aW5mby54cmVzID0gd2lkdGg7Ci0JCXZpbmZvLnhyZXNfdmlydHVhbCA9IHdpZHRoOwotCQl2aW5mby55cmVzID0gaGVpZ2h0OwotCQlpZiAoIGZsYWdzICYgU0RMX0RPVUJMRUJVRiApIHsKLQkJCXZpbmZvLnlyZXNfdmlydHVhbCA9IGhlaWdodCoyOwotCQl9IGVsc2UgewotCQkJdmluZm8ueXJlc192aXJ0dWFsID0gaGVpZ2h0OwotCQl9Ci0JCXZpbmZvLnhvZmZzZXQgPSAwOwotCQl2aW5mby55b2Zmc2V0ID0gMDsKLQkJdmluZm8ucmVkLmxlbmd0aCA9IHZpbmZvLnJlZC5vZmZzZXQgPSAwOwotCQl2aW5mby5ncmVlbi5sZW5ndGggPSB2aW5mby5ncmVlbi5vZmZzZXQgPSAwOwotCQl2aW5mby5ibHVlLmxlbmd0aCA9IHZpbmZvLmJsdWUub2Zmc2V0ID0gMDsKLQkJdmluZm8udHJhbnNwLmxlbmd0aCA9IHZpbmZvLnRyYW5zcC5vZmZzZXQgPSAwOwotCQlpZiAoICEgY2hvb3NlX2ZibW9kZXNfbW9kZSgmdmluZm8pICkgewotCQkJY2hvb3NlX3Zlc2FfbW9kZSgmdmluZm8pOwotCQl9Ci0jaWZkZWYgRkJDT05fREVCVUcKLQkJZnByaW50ZihzdGRlcnIsICJQcmludGluZyB3YW50ZWQgdmluZm86XG4iKTsKLQkJcHJpbnRfdmluZm8oJnZpbmZvKTsKLSNlbmRpZgotCQlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9QVVRfVlNDUkVFTklORk8sICZ2aW5mbykgPCAwICkgewotCQkJdmluZm8ueXJlc192aXJ0dWFsID0gaGVpZ2h0OwotCQkJaWYgKCBpb2N0bChjb25zb2xlX2ZkLCBGQklPUFVUX1ZTQ1JFRU5JTkZPLCAmdmluZm8pIDwgMCApIHsKLQkJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBjb25zb2xlIHNjcmVlbiBpbmZvIik7Ci0JCQkJcmV0dXJuKE5VTEwpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IG1heGhlaWdodDsKLQotCQkvKiBGaWd1cmUgb3V0IGhvdyBtdWNoIHZpZGVvIG1lbW9yeSBpcyBhdmFpbGFibGUgKi8KLQkJaWYgKCBmbGFncyAmIFNETF9ET1VCTEVCVUYgKSB7Ci0JCQltYXhoZWlnaHQgPSBoZWlnaHQqMjsKLQkJfSBlbHNlIHsKLQkJCW1heGhlaWdodCA9IGhlaWdodDsKLQkJfQotCQlpZiAoIHZpbmZvLnlyZXNfdmlydHVhbCA+IG1heGhlaWdodCApIHsKLQkJCXZpbmZvLnlyZXNfdmlydHVhbCA9IG1heGhlaWdodDsKLQkJfQotCX0KLQljYWNoZV92aW5mbyA9IHZpbmZvOwotI2lmZGVmIEZCQ09OX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJQcmludGluZyBhY3R1YWwgdmluZm86XG4iKTsKLQlwcmludF92aW5mbygmdmluZm8pOwotI2VuZGlmCi0JUm1hc2sgPSAwOwotCWZvciAoIGk9MDsgaTx2aW5mby5yZWQubGVuZ3RoOyArK2kgKSB7Ci0JCVJtYXNrIDw8PSAxOwotCQlSbWFzayB8PSAoMHgwMDAwMDAwMTw8dmluZm8ucmVkLm9mZnNldCk7Ci0JfQotCUdtYXNrID0gMDsKLQlmb3IgKCBpPTA7IGk8dmluZm8uZ3JlZW4ubGVuZ3RoOyArK2kgKSB7Ci0JCUdtYXNrIDw8PSAxOwotCQlHbWFzayB8PSAoMHgwMDAwMDAwMTw8dmluZm8uZ3JlZW4ub2Zmc2V0KTsKLQl9Ci0JQm1hc2sgPSAwOwotCWZvciAoIGk9MDsgaTx2aW5mby5ibHVlLmxlbmd0aDsgKytpICkgewotCQlCbWFzayA8PD0gMTsKLQkJQm1hc2sgfD0gKDB4MDAwMDAwMDE8PHZpbmZvLmJsdWUub2Zmc2V0KTsKLQl9Ci0JaWYgKCAhIFNETF9SZWFsbG9jRm9ybWF0KGN1cnJlbnQsIHZpbmZvLmJpdHNfcGVyX3BpeGVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSbWFzaywgR21hc2ssIEJtYXNrLCAwKSApIHsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIEdldCB0aGUgZml4ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnNvbGUgaGFyZHdhcmUuCi0JICAgVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgZmluZm8ubGluZV9sZW5ndGggY2hhbmdlcy4KLQkgKi8KLQlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sICZmaW5mbykgPCAwICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBjb25zb2xlIGhhcmR3YXJlIGluZm8iKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIFNhdmUgaGFyZHdhcmUgcGFsZXR0ZSwgaWYgbmVlZGVkICovCi0JRkJfU2F2ZVBhbGV0dGUodGhpcywgJmZpbmZvLCAmdmluZm8pOwotCi0JLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLwotCWN1cnJlbnQtPmZsYWdzID0gKFNETF9GVUxMU0NSRUVOfFNETF9IV1NVUkZBQ0UpOwotCWN1cnJlbnQtPncgPSB2aW5mby54cmVzOwotCWN1cnJlbnQtPmggPSB2aW5mby55cmVzOwotCWN1cnJlbnQtPnBpdGNoID0gZmluZm8ubGluZV9sZW5ndGg7Ci0JY3VycmVudC0+cGl4ZWxzID0gbWFwcGVkX21lbSttYXBwZWRfb2Zmc2V0OwotCi0JLyogU2V0IHVwIHRoZSBpbmZvcm1hdGlvbiBmb3IgaGFyZHdhcmUgc3VyZmFjZXMgKi8KLQlzdXJmYWNlc19tZW0gPSAoY2hhciAqKWN1cnJlbnQtPnBpeGVscyArCi0JICAgICAgICAgICAgICAgICAgICAgICAgdmluZm8ueXJlc192aXJ0dWFsKmN1cnJlbnQtPnBpdGNoOwotCXN1cmZhY2VzX2xlbiA9IChtYXBwZWRfbWVtbGVuLShzdXJmYWNlc19tZW0tbWFwcGVkX21lbSkpOwotCUZCX0ZyZWVIV1N1cmZhY2VzKHRoaXMpOwotCUZCX0luaXRIV1N1cmZhY2VzKHRoaXMsIGN1cnJlbnQsIHN1cmZhY2VzX21lbSwgc3VyZmFjZXNfbGVuKTsKLQotCS8qIExldCB0aGUgYXBwbGljYXRpb24ga25vdyB3ZSBoYXZlIGEgaGFyZHdhcmUgcGFsZXR0ZSAqLwotCXN3aXRjaCAoZmluZm8udmlzdWFsKSB7Ci0JICAgIGNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgotCQljdXJyZW50LT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyogVXBkYXRlIGZvciBkb3VibGUtYnVmZmVyaW5nLCBpZiB3ZSBjYW4gKi8KLQlpZiAoIGZsYWdzICYgU0RMX0RPVUJMRUJVRiApIHsKLQkJaWYgKCB2aW5mby55cmVzX3ZpcnR1YWwgPT0gKGhlaWdodCoyKSApIHsKLQkJCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9ET1VCTEVCVUY7Ci0JCQlmbGlwX3BhZ2UgPSAwOwotCQkJZmxpcF9hZGRyZXNzWzBdID0gKGNoYXIgKiljdXJyZW50LT5waXhlbHM7Ci0JCQlmbGlwX2FkZHJlc3NbMV0gPSAoY2hhciAqKWN1cnJlbnQtPnBpeGVscysKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+aCpjdXJyZW50LT5waXRjaDsKLQkJCXRoaXMtPnNjcmVlbiA9IGN1cnJlbnQ7Ci0JCQlGQl9GbGlwSFdTdXJmYWNlKHRoaXMsIGN1cnJlbnQpOwotCQkJdGhpcy0+c2NyZWVuID0gTlVMTDsKLQkJfQotCX0KLQotCS8qIFNldCB0aGUgdXBkYXRlIHJlY3RhbmdsZSBmdW5jdGlvbiAqLwotCXRoaXMtPlVwZGF0ZVJlY3RzID0gRkJfRGlyZWN0VXBkYXRlOwotCi0JLyogV2UncmUgZG9uZSAqLwotCXJldHVybihjdXJyZW50KTsKLX0KLQotI2lmZGVmIEZCQ09OX0RFQlVHCi12b2lkIEZCX0R1bXBIV1N1cmZhY2VzKF9USElTKQotewotCXZpZG1lbV9idWNrZXQgKmJ1Y2tldDsKLQotCXByaW50ZigiTWVtb3J5IGxlZnQ6ICVkICglZCB0b3RhbClcbiIsIHN1cmZhY2VzX21lbWxlZnQsIHN1cmZhY2VzX21lbXRvdGFsKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCIgICAgICAgICBCYXNlICBTaXplXG4iKTsKLQlmb3IgKCBidWNrZXQ9JnN1cmZhY2VzOyBidWNrZXQ7IGJ1Y2tldD1idWNrZXQtPm5leHQgKSB7Ci0JCXByaW50ZigiQnVja2V0OiAgJXAsICVkICglcylcbiIsIGJ1Y2tldC0+YmFzZSwgYnVja2V0LT5zaXplLCBidWNrZXQtPnVzZWQgPyAidXNlZCIgOiAiZnJlZSIpOwotCQlpZiAoIGJ1Y2tldC0+cHJldiApIHsKLQkJCWlmICggYnVja2V0LT5iYXNlICE9IGJ1Y2tldC0+cHJldi0+YmFzZStidWNrZXQtPnByZXYtPnNpemUgKSB7Ci0JCQkJcHJpbnRmKCJXYXJuaW5nLCBjb3JydXB0IGJ1Y2tldCBsaXN0ISAocHJldilcbiIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCBidWNrZXQgIT0gJnN1cmZhY2VzICkgewotCQkJCXByaW50ZigiV2FybmluZywgY29ycnVwdCBidWNrZXQgbGlzdCEgKCFwcmV2KVxuIik7Ci0JCQl9Ci0JCX0KLQkJaWYgKCBidWNrZXQtPm5leHQgKSB7Ci0JCQlpZiAoIGJ1Y2tldC0+bmV4dC0+YmFzZSAhPSBidWNrZXQtPmJhc2UrYnVja2V0LT5zaXplICkgewotCQkJCXByaW50ZigiV2FybmluZywgY29ycnVwdCBidWNrZXQgbGlzdCEgKG5leHQpXG4iKTsKLQkJCX0KLQkJfQotCX0KLQlwcmludGYoIlxuIik7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBGQl9Jbml0SFdTdXJmYWNlcyhfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbiwgY2hhciAqYmFzZSwgaW50IHNpemUpCi17Ci0JdmlkbWVtX2J1Y2tldCAqYnVja2V0OwotCi0Jc3VyZmFjZXNfbWVtdG90YWwgPSBzaXplOwotCXN1cmZhY2VzX21lbWxlZnQgPSBzaXplOwotCi0JaWYgKCBzdXJmYWNlc19tZW1sZWZ0ID4gMCApIHsKLQkJYnVja2V0ID0gKHZpZG1lbV9idWNrZXQgKilTRExfbWFsbG9jKHNpemVvZigqYnVja2V0KSk7Ci0JCWlmICggYnVja2V0ID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJYnVja2V0LT5wcmV2ID0gJnN1cmZhY2VzOwotCQlidWNrZXQtPnVzZWQgPSAwOwotCQlidWNrZXQtPmRpcnR5ID0gMDsKLQkJYnVja2V0LT5iYXNlID0gYmFzZTsKLQkJYnVja2V0LT5zaXplID0gc2l6ZTsKLQkJYnVja2V0LT5uZXh0ID0gTlVMTDsKLQl9IGVsc2UgewotCQlidWNrZXQgPSBOVUxMOwotCX0KLQotCXN1cmZhY2VzLnByZXYgPSBOVUxMOwotCXN1cmZhY2VzLnVzZWQgPSAxOwotCXN1cmZhY2VzLmRpcnR5ID0gMDsKLQlzdXJmYWNlcy5iYXNlID0gc2NyZWVuLT5waXhlbHM7Ci0Jc3VyZmFjZXMuc2l6ZSA9ICh1bnNpZ25lZCBpbnQpKChsb25nKWJhc2UgLSAobG9uZylzdXJmYWNlcy5iYXNlKTsKLQlzdXJmYWNlcy5uZXh0ID0gYnVja2V0OwotCXNjcmVlbi0+aHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX2h3ZGF0YSAqKSZzdXJmYWNlczsKLQlyZXR1cm4oMCk7Ci19Ci1zdGF0aWMgdm9pZCBGQl9GcmVlSFdTdXJmYWNlcyhfVEhJUykKLXsKLQl2aWRtZW1fYnVja2V0ICpidWNrZXQsICpmcmVlYWJsZTsKLQotCWJ1Y2tldCA9IHN1cmZhY2VzLm5leHQ7Ci0Jd2hpbGUgKCBidWNrZXQgKSB7Ci0JCWZyZWVhYmxlID0gYnVja2V0OwotCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7Ci0JCVNETF9mcmVlKGZyZWVhYmxlKTsKLQl9Ci0Jc3VyZmFjZXMubmV4dCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgRkJfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXZpZG1lbV9idWNrZXQgKmJ1Y2tldDsKLQlpbnQgc2l6ZTsKLQlpbnQgZXh0cmE7Ci0KLS8qIFRlbXBvcmFyaWx5LCB3ZSBvbmx5IGFsbG93IHN1cmZhY2VzIHRoZSBzYW1lIHdpZHRoIGFzIGRpc3BsYXkuCi0gICBTb21lIGJsaXR0ZXJzIHJlcXVpcmUgdGhlIHBpdGNoIGJldHdlZW4gdHdvIGhhcmR3YXJlIHN1cmZhY2VzCi0gICB0byBiZSB0aGUgc2FtZS4gIE90aGVycyBoYXZlIGludGVyZXN0aW5nIGFsaWdubWVudCByZXN0cmljdGlvbnMuCi0gICBVbnRpbCBzb21lb25lIHdobyBrbm93cyB0aGVzZSBkZXRhaWxzIGxvb2tzIGF0IHRoZSBjb2RlLi4uCi0qLwotaWYgKCBzdXJmYWNlLT5waXRjaCA+IFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoICkgewotCVNETF9TZXRFcnJvcigiU3VyZmFjZSByZXF1ZXN0ZWQgd2lkZXIgdGhhbiBzY3JlZW4iKTsKLQlyZXR1cm4oLTEpOwotfQotc3VyZmFjZS0+cGl0Y2ggPSBTRExfVmlkZW9TdXJmYWNlLT5waXRjaDsKLQlzaXplID0gc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoOwotI2lmZGVmIEZCQ09OX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJBbGxvY2F0aW5nIGJ1Y2tldCBvZiAlZCBieXRlc1xuIiwgc2l6ZSk7Ci0jZW5kaWYKLQotCS8qIFF1aWNrIGNoZWNrIGZvciBhdmFpbGFibGUgbWVtICovCi0JaWYgKCBzaXplID4gc3VyZmFjZXNfbWVtbGVmdCApIHsKLQkJU0RMX1NldEVycm9yKCJOb3QgZW5vdWdoIHZpZGVvIG1lbW9yeSIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFNlYXJjaCBmb3IgYW4gZW1wdHkgYnVja2V0IGJpZyBlbm91Z2ggKi8KLQlmb3IgKCBidWNrZXQ9JnN1cmZhY2VzOyBidWNrZXQ7IGJ1Y2tldD1idWNrZXQtPm5leHQgKSB7Ci0JCWlmICggISBidWNrZXQtPnVzZWQgJiYgKHNpemUgPD0gYnVja2V0LT5zaXplKSApIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICggYnVja2V0ID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiVmlkZW8gbWVtb3J5IHRvbyBmcmFnbWVudGVkIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogQ3JlYXRlIGEgbmV3IGJ1Y2tldCBmb3IgbGVmdC1vdmVyIG1lbW9yeSAqLwotCWV4dHJhID0gKGJ1Y2tldC0+c2l6ZSAtIHNpemUpOwotCWlmICggZXh0cmEgKSB7Ci0JCXZpZG1lbV9idWNrZXQgKm5ld2J1Y2tldDsKLQotI2lmZGVmIEZCQ09OX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJBZGRpbmcgbmV3IGZyZWUgYnVja2V0IG9mICVkIGJ5dGVzXG4iLCBleHRyYSk7Ci0jZW5kaWYKLQkJbmV3YnVja2V0ID0gKHZpZG1lbV9idWNrZXQgKilTRExfbWFsbG9jKHNpemVvZigqbmV3YnVja2V0KSk7Ci0JCWlmICggbmV3YnVja2V0ID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJbmV3YnVja2V0LT5wcmV2ID0gYnVja2V0OwotCQluZXdidWNrZXQtPnVzZWQgPSAwOwotCQluZXdidWNrZXQtPmJhc2UgPSBidWNrZXQtPmJhc2Urc2l6ZTsKLQkJbmV3YnVja2V0LT5zaXplID0gZXh0cmE7Ci0JCW5ld2J1Y2tldC0+bmV4dCA9IGJ1Y2tldC0+bmV4dDsKLQkJaWYgKCBidWNrZXQtPm5leHQgKSB7Ci0JCQlidWNrZXQtPm5leHQtPnByZXYgPSBuZXdidWNrZXQ7Ci0JCX0KLQkJYnVja2V0LT5uZXh0ID0gbmV3YnVja2V0OwotCX0KLQotCS8qIFNldCB0aGUgY3VycmVudCBidWNrZXQgdmFsdWVzIGFuZCByZXR1cm4gaXQhICovCi0JYnVja2V0LT51c2VkID0gMTsKLQlidWNrZXQtPnNpemUgPSBzaXplOwotCWJ1Y2tldC0+ZGlydHkgPSAwOwotI2lmZGVmIEZCQ09OX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJBbGxvY2F0ZWQgJWQgYnl0ZXMgYXQgJXBcbiIsIGJ1Y2tldC0+c2l6ZSwgYnVja2V0LT5iYXNlKTsKLSNlbmRpZgotCXN1cmZhY2VzX21lbWxlZnQgLT0gc2l6ZTsKLQlzdXJmYWNlLT5mbGFncyB8PSBTRExfSFdTVVJGQUNFOwotCXN1cmZhY2UtPnBpeGVscyA9IGJ1Y2tldC0+YmFzZTsKLQlzdXJmYWNlLT5od2RhdGEgPSAoc3RydWN0IHByaXZhdGVfaHdkYXRhICopYnVja2V0OwotCXJldHVybigwKTsKLX0KLXN0YXRpYyB2b2lkIEZCX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXZpZG1lbV9idWNrZXQgKmJ1Y2tldCwgKmZyZWVhYmxlOwotCi0JLyogTG9vayBmb3IgdGhlIGJ1Y2tldCBpbiB0aGUgY3VycmVudCBsaXN0ICovCi0JZm9yICggYnVja2V0PSZzdXJmYWNlczsgYnVja2V0OyBidWNrZXQ9YnVja2V0LT5uZXh0ICkgewotCQlpZiAoIGJ1Y2tldCA9PSAodmlkbWVtX2J1Y2tldCAqKXN1cmZhY2UtPmh3ZGF0YSApIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICggYnVja2V0ICYmIGJ1Y2tldC0+dXNlZCApIHsKLQkJLyogQWRkIHRoZSBtZW1vcnkgYmFjayB0byB0aGUgdG90YWwgKi8KLSNpZmRlZiBER0FfREVCVUcKLQlwcmludGYoIkZyZWVpbmcgYnVja2V0IG9mICVkIGJ5dGVzXG4iLCBidWNrZXQtPnNpemUpOwotI2VuZGlmCi0JCXN1cmZhY2VzX21lbWxlZnQgKz0gYnVja2V0LT5zaXplOwotCi0JCS8qIENhbiB3ZSBtZXJnZSB0aGUgc3BhY2Ugd2l0aCBzdXJyb3VuZGluZyBidWNrZXRzPyAqLwotCQlidWNrZXQtPnVzZWQgPSAwOwotCQlpZiAoIGJ1Y2tldC0+bmV4dCAmJiAhIGJ1Y2tldC0+bmV4dC0+dXNlZCApIHsKLSNpZmRlZiBER0FfREVCVUcKLQlwcmludGYoIk1lcmdpbmcgd2l0aCBuZXh0IGJ1Y2tldCwgZm9yICVkIHRvdGFsIGJ5dGVzXG4iLCBidWNrZXQtPnNpemUrYnVja2V0LT5uZXh0LT5zaXplKTsKLSNlbmRpZgotCQkJZnJlZWFibGUgPSBidWNrZXQtPm5leHQ7Ci0JCQlidWNrZXQtPnNpemUgKz0gYnVja2V0LT5uZXh0LT5zaXplOwotCQkJYnVja2V0LT5uZXh0ID0gYnVja2V0LT5uZXh0LT5uZXh0OwotCQkJaWYgKCBidWNrZXQtPm5leHQgKSB7Ci0JCQkJYnVja2V0LT5uZXh0LT5wcmV2ID0gYnVja2V0OwotCQkJfQotCQkJU0RMX2ZyZWUoZnJlZWFibGUpOwotCQl9Ci0JCWlmICggYnVja2V0LT5wcmV2ICYmICEgYnVja2V0LT5wcmV2LT51c2VkICkgewotI2lmZGVmIERHQV9ERUJVRwotCXByaW50ZigiTWVyZ2luZyB3aXRoIHByZXZpb3VzIGJ1Y2tldCwgZm9yICVkIHRvdGFsIGJ5dGVzXG4iLCBidWNrZXQtPnByZXYtPnNpemUrYnVja2V0LT5zaXplKTsKLSNlbmRpZgotCQkJZnJlZWFibGUgPSBidWNrZXQ7Ci0JCQlidWNrZXQtPnByZXYtPnNpemUgKz0gYnVja2V0LT5zaXplOwotCQkJYnVja2V0LT5wcmV2LT5uZXh0ID0gYnVja2V0LT5uZXh0OwotCQkJaWYgKCBidWNrZXQtPm5leHQgKSB7Ci0JCQkJYnVja2V0LT5uZXh0LT5wcmV2ID0gYnVja2V0LT5wcmV2OwotCQkJfQotCQkJU0RMX2ZyZWUoZnJlZWFibGUpOwotCQl9Ci0JfQotCXN1cmZhY2UtPnBpeGVscyA9IE5VTEw7Ci0Jc3VyZmFjZS0+aHdkYXRhID0gTlVMTDsKLX0KLQotc3RhdGljIGludCBGQl9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpZiAoIHN3aXRjaGVkX2F3YXkgKSB7Ci0JCXJldHVybiAtMjsgLyogbm8gaGFyZHdhcmUgYWNjZXNzICovCi0JfQotCWlmICggc3VyZmFjZSA9PSB0aGlzLT5zY3JlZW4gKSB7Ci0JCVNETF9tdXRleFAoaHdfbG9jayk7Ci0JCWlmICggRkJfSXNTdXJmYWNlQnVzeShzdXJmYWNlKSApIHsKLQkJCUZCX1dhaXRCdXN5U3VyZmFjZXModGhpcyk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIEZCX0lzU3VyZmFjZUJ1c3koc3VyZmFjZSkgKSB7Ci0JCQlGQl9XYWl0QnVzeVN1cmZhY2VzKHRoaXMpOwotCQl9Ci0JfQotCXJldHVybigwKTsKLX0KLXN0YXRpYyB2b2lkIEZCX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYgKCBzdXJmYWNlID09IHRoaXMtPnNjcmVlbiApIHsKLQkJU0RMX211dGV4Vihod19sb2NrKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEZCX1dhaXRWQkwoX1RISVMpCi17Ci0jaWZkZWYgRkJJT1dBSVRSRVRSQUNFIC8qIEhlaGVoLCB0aGlzIGRpZG4ndCBtYWtlIGl0IGludG8gdGhlIG1haW4ga2VybmVsICovCi0JaW9jdGwoY29uc29sZV9mZCwgRkJJT1dBSVRSRVRSQUNFLCAwKTsKLSNlbmRpZgotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgRkJfV2FpdElkbGUoX1RISVMpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IEZCX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWlmICggc3dpdGNoZWRfYXdheSApIHsKLQkJcmV0dXJuIC0yOyAvKiBubyBoYXJkd2FyZSBhY2Nlc3MgKi8KLQl9Ci0KLQkvKiBXYWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlIGFuZCB0aGVuIGZsaXAgZGlzcGxheSAqLwotCWNhY2hlX3ZpbmZvLnlvZmZzZXQgPSBmbGlwX3BhZ2Uqc3VyZmFjZS0+aDsKLQlpZiAoIEZCX0lzU3VyZmFjZUJ1c3kodGhpcy0+c2NyZWVuKSApIHsKLQkJRkJfV2FpdEJ1c3lTdXJmYWNlcyh0aGlzKTsKLQl9Ci0Jd2FpdF92YmwodGhpcyk7Ci0JaWYgKCBpb2N0bChjb25zb2xlX2ZkLCBGQklPUEFOX0RJU1BMQVksICZjYWNoZV92aW5mbykgPCAwICkgewotCQlTRExfU2V0RXJyb3IoImlvY3RsKEZCSU9QQU5fRElTUExBWSkgZmFpbGVkIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCWZsaXBfcGFnZSA9ICFmbGlwX3BhZ2U7Ci0KLQlzdXJmYWNlLT5waXhlbHMgPSBmbGlwX2FkZHJlc3NbZmxpcF9wYWdlXTsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEZCX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JLyogVGhlIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgdXBkYXRpbmcgdGhlIHZpc2libGUgdmlkZW8gbWVtb3J5ICovCi0JcmV0dXJuOwotfQotCi0jaWZkZWYgVkdBMTZfRkJDT05fU1VQUE9SVAotLyogQ29kZSBhZGFwdGVkIHdpdGggdGhhbmtzIGZyb20gdGhlIFhGcmVlODYgVkdBMTYgZHJpdmVyISA6KSAqLwotI2RlZmluZSB3cml0ZUdyKGluZGV4LCB2YWx1ZSkgXAotb3V0YihpbmRleCwgMHgzQ0UpOyAgICAgICAgICAgXAotb3V0Yih2YWx1ZSwgMHgzQ0YpOwotI2RlZmluZSB3cml0ZVNlcShpbmRleCwgdmFsdWUpIFwKLW91dGIoaW5kZXgsIDB4M0M0KTsgICAgICAgICAgICBcCi1vdXRiKHZhbHVlLCAweDNDNSk7Ci0KLXN0YXRpYyB2b2lkIEZCX1ZHQTE2VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLSAgICBTRExfU3VyZmFjZSAqc2NyZWVuOwotICAgIGludCB3aWR0aCwgaGVpZ2h0LCBGQlBpdGNoLCBsZWZ0LCBpLCBqLCBTUkNQaXRjaCwgcGhhc2U7Ci0gICAgcmVnaXN0ZXIgVWludDMyIG07Ci0gICAgVWludDggIHMxLCBzMiwgczMsIHM0OwotICAgIFVpbnQzMiAqc3JjLCAqc3JjUHRyOwotICAgIFVpbnQ4ICAqZHN0LCAqZHN0UHRyOwotCi0gICAgaWYgKCBzd2l0Y2hlZF9hd2F5ICkgewotICAgICAgICByZXR1cm47IC8qIG5vIGhhcmR3YXJlIGFjY2VzcyAqLwotICAgIH0KLQotICAgIHNjcmVlbiA9IHRoaXMtPnNjcmVlbjsKLSAgICBGQlBpdGNoID0gc2NyZWVuLT53ID4+IDM7Ci0gICAgU1JDUGl0Y2ggPSBzY3JlZW4tPnBpdGNoID4+IDI7Ci0KLSAgICB3cml0ZUdyKDB4MDMsIDB4MDApOwotICAgIHdyaXRlR3IoMHgwNSwgMHgwMCk7Ci0gICAgd3JpdGVHcigweDAxLCAweDAwKTsKLSAgICB3cml0ZUdyKDB4MDgsIDB4RkYpOwotCi0gICAgd2hpbGUobnVtcmVjdHMtLSkgewotCWxlZnQgPSByZWN0cy0+eCAmIH43OwotICAgICAgICB3aWR0aCA9IChyZWN0cy0+dyArIDcpID4+IDM7Ci0gICAgICAgIGhlaWdodCA9IHJlY3RzLT5oOwotICAgICAgICBzcmMgPSAoVWludDMyKilzY3JlZW4tPnBpeGVscyArIChyZWN0cy0+eSAqIFNSQ1BpdGNoKSArIChsZWZ0ID4+IDIpOyAKLSAgICAgICAgZHN0ID0gKFVpbnQ4KiltYXBwZWRfbWVtICsgKHJlY3RzLT55ICogRkJQaXRjaCkgKyAobGVmdCA+PiAzKTsKLQotCWlmKChwaGFzZSA9IChsb25nKWRzdCAmIDNMKSkgewotCSAgICBwaGFzZSA9IDQgLSBwaGFzZTsKLQkgICAgaWYocGhhc2UgPiB3aWR0aCkgcGhhc2UgPSB3aWR0aDsKLQkgICAgd2lkdGggLT0gcGhhc2U7Ci0JfQotCi0gICAgICAgIHdoaWxlKGhlaWdodC0tKSB7Ci0JICAgIHdyaXRlU2VxKDB4MDIsIDEgPDwgMCk7Ci0JICAgIGRzdFB0ciA9IGRzdDsKLQkgICAgc3JjUHRyID0gc3JjOwotCSAgICBpID0gd2lkdGg7Ci0JICAgIGogPSBwaGFzZTsKLQkgICAgd2hpbGUoai0tKSB7Ci0JCW0gPSAoc3JjUHRyWzFdICYgMHgwMTAxMDEwMSkgfCAoKHNyY1B0clswXSAmIDB4MDEwMTAxMDEpIDw8IDQpOwotIAkJKmRzdFB0cisrID0gKG0gPj4gMjQpIHwgKG0gPj4gMTUpIHwgKG0gPj4gNikgfCAobSA8PCAzKTsKLQkJc3JjUHRyICs9IDI7Ci0JICAgIH0KLQkgICAgd2hpbGUoaSA+PSA0KSB7Ci0JCW0gPSAoc3JjUHRyWzFdICYgMHgwMTAxMDEwMSkgfCAoKHNyY1B0clswXSAmIDB4MDEwMTAxMDEpIDw8IDQpOwotIAkJczEgPSAobSA+PiAyNCkgfCAobSA+PiAxNSkgfCAobSA+PiA2KSB8IChtIDw8IDMpOwotCQltID0gKHNyY1B0clszXSAmIDB4MDEwMTAxMDEpIHwgKChzcmNQdHJbMl0gJiAweDAxMDEwMTAxKSA8PCA0KTsKLSAJCXMyID0gKG0gPj4gMjQpIHwgKG0gPj4gMTUpIHwgKG0gPj4gNikgfCAobSA8PCAzKTsKLQkJbSA9IChzcmNQdHJbNV0gJiAweDAxMDEwMTAxKSB8ICgoc3JjUHRyWzRdICYgMHgwMTAxMDEwMSkgPDwgNCk7Ci0gCQlzMyA9IChtID4+IDI0KSB8IChtID4+IDE1KSB8IChtID4+IDYpIHwgKG0gPDwgMyk7Ci0JCW0gPSAoc3JjUHRyWzddICYgMHgwMTAxMDEwMSkgfCAoKHNyY1B0cls2XSAmIDB4MDEwMTAxMDEpIDw8IDQpOwotIAkJczQgPSAobSA+PiAyNCkgfCAobSA+PiAxNSkgfCAobSA+PiA2KSB8IChtIDw8IDMpOwotCQkqKChVaW50MzIqKWRzdFB0cikgPSBzMSB8IChzMiA8PCA4KSB8IChzMyA8PCAxNikgfCAoczQgPDwgMjQpOwotCQlzcmNQdHIgKz0gODsKLQkJZHN0UHRyICs9IDQ7Ci0JCWkgLT0gNDsKLQkgICAgfQotCSAgICB3aGlsZShpLS0pIHsKLQkJbSA9IChzcmNQdHJbMV0gJiAweDAxMDEwMTAxKSB8ICgoc3JjUHRyWzBdICYgMHgwMTAxMDEwMSkgPDwgNCk7Ci0gCQkqZHN0UHRyKysgPSAobSA+PiAyNCkgfCAobSA+PiAxNSkgfCAobSA+PiA2KSB8IChtIDw8IDMpOwotCQlzcmNQdHIgKz0gMjsKLQkgICAgfQotCi0JICAgIHdyaXRlU2VxKDB4MDIsIDEgPDwgMSk7Ci0JICAgIGRzdFB0ciA9IGRzdDsKLQkgICAgc3JjUHRyID0gc3JjOwotCSAgICBpID0gd2lkdGg7Ci0JICAgIGogPSBwaGFzZTsKLQkgICAgd2hpbGUoai0tKSB7Ci0JCW0gPSAoc3JjUHRyWzFdICYgMHgwMjAyMDIwMikgfCAoKHNyY1B0clswXSAmIDB4MDIwMjAyMDIpIDw8IDQpOwotIAkJKmRzdFB0cisrID0gKG0gPj4gMjUpIHwgKG0gPj4gMTYpIHwgKG0gPj4gNykgfCAobSA8PCAyKTsKLQkJc3JjUHRyICs9IDI7Ci0JICAgIH0KLQkgICAgd2hpbGUoaSA+PSA0KSB7Ci0JCW0gPSAoc3JjUHRyWzFdICYgMHgwMjAyMDIwMikgfCAoKHNyY1B0clswXSAmIDB4MDIwMjAyMDIpIDw8IDQpOwotIAkJczEgPSAobSA+PiAyNSkgfCAobSA+PiAxNikgfCAobSA+PiA3KSB8IChtIDw8IDIpOwotCQltID0gKHNyY1B0clszXSAmIDB4MDIwMjAyMDIpIHwgKChzcmNQdHJbMl0gJiAweDAyMDIwMjAyKSA8PCA0KTsKLSAJCXMyID0gKG0gPj4gMjUpIHwgKG0gPj4gMTYpIHwgKG0gPj4gNykgfCAobSA8PCAyKTsKLQkJbSA9IChzcmNQdHJbNV0gJiAweDAyMDIwMjAyKSB8ICgoc3JjUHRyWzRdICYgMHgwMjAyMDIwMikgPDwgNCk7Ci0gCQlzMyA9IChtID4+IDI1KSB8IChtID4+IDE2KSB8IChtID4+IDcpIHwgKG0gPDwgMik7Ci0JCW0gPSAoc3JjUHRyWzddICYgMHgwMjAyMDIwMikgfCAoKHNyY1B0cls2XSAmIDB4MDIwMjAyMDIpIDw8IDQpOwotIAkJczQgPSAobSA+PiAyNSkgfCAobSA+PiAxNikgfCAobSA+PiA3KSB8IChtIDw8IDIpOwotCQkqKChVaW50MzIqKWRzdFB0cikgPSBzMSB8IChzMiA8PCA4KSB8IChzMyA8PCAxNikgfCAoczQgPDwgMjQpOwotCQlzcmNQdHIgKz0gODsKLQkJZHN0UHRyICs9IDQ7Ci0JCWkgLT0gNDsKLQkgICAgfQotCSAgICB3aGlsZShpLS0pIHsKLQkJbSA9IChzcmNQdHJbMV0gJiAweDAyMDIwMjAyKSB8ICgoc3JjUHRyWzBdICYgMHgwMjAyMDIwMikgPDwgNCk7Ci0gCQkqZHN0UHRyKysgPSAobSA+PiAyNSkgfCAobSA+PiAxNikgfCAobSA+PiA3KSB8IChtIDw8IDIpOwotCQlzcmNQdHIgKz0gMjsKLQkgICAgfQotCi0JICAgIHdyaXRlU2VxKDB4MDIsIDEgPDwgMik7Ci0JICAgIGRzdFB0ciA9IGRzdDsKLQkgICAgc3JjUHRyID0gc3JjOwotCSAgICBpID0gd2lkdGg7Ci0JICAgIGogPSBwaGFzZTsKLQkgICAgd2hpbGUoai0tKSB7Ci0JCW0gPSAoc3JjUHRyWzFdICYgMHgwNDA0MDQwNCkgfCAoKHNyY1B0clswXSAmIDB4MDQwNDA0MDQpIDw8IDQpOwotIAkJKmRzdFB0cisrID0gKG0gPj4gMjYpIHwgKG0gPj4gMTcpIHwgKG0gPj4gOCkgfCAobSA8PCAxKTsKLQkJc3JjUHRyICs9IDI7Ci0JICAgIH0KLQkgICAgd2hpbGUoaSA+PSA0KSB7Ci0JCW0gPSAoc3JjUHRyWzFdICYgMHgwNDA0MDQwNCkgfCAoKHNyY1B0clswXSAmIDB4MDQwNDA0MDQpIDw8IDQpOwotIAkJczEgPSAobSA+PiAyNikgfCAobSA+PiAxNykgfCAobSA+PiA4KSB8IChtIDw8IDEpOwotCQltID0gKHNyY1B0clszXSAmIDB4MDQwNDA0MDQpIHwgKChzcmNQdHJbMl0gJiAweDA0MDQwNDA0KSA8PCA0KTsKLSAJCXMyID0gKG0gPj4gMjYpIHwgKG0gPj4gMTcpIHwgKG0gPj4gOCkgfCAobSA8PCAxKTsKLQkJbSA9IChzcmNQdHJbNV0gJiAweDA0MDQwNDA0KSB8ICgoc3JjUHRyWzRdICYgMHgwNDA0MDQwNCkgPDwgNCk7Ci0gCQlzMyA9IChtID4+IDI2KSB8IChtID4+IDE3KSB8IChtID4+IDgpIHwgKG0gPDwgMSk7Ci0JCW0gPSAoc3JjUHRyWzddICYgMHgwNDA0MDQwNCkgfCAoKHNyY1B0cls2XSAmIDB4MDQwNDA0MDQpIDw8IDQpOwotIAkJczQgPSAobSA+PiAyNikgfCAobSA+PiAxNykgfCAobSA+PiA4KSB8IChtIDw8IDEpOwotCQkqKChVaW50MzIqKWRzdFB0cikgPSBzMSB8IChzMiA8PCA4KSB8IChzMyA8PCAxNikgfCAoczQgPDwgMjQpOwotCQlzcmNQdHIgKz0gODsKLQkJZHN0UHRyICs9IDQ7Ci0JCWkgLT0gNDsKLQkgICAgfQotCSAgICB3aGlsZShpLS0pIHsKLQkJbSA9IChzcmNQdHJbMV0gJiAweDA0MDQwNDA0KSB8ICgoc3JjUHRyWzBdICYgMHgwNDA0MDQwNCkgPDwgNCk7Ci0gCQkqZHN0UHRyKysgPSAobSA+PiAyNikgfCAobSA+PiAxNykgfCAobSA+PiA4KSB8IChtIDw8IDEpOwotCQlzcmNQdHIgKz0gMjsKLQkgICAgfQotCSAgICAKLQkgICAgd3JpdGVTZXEoMHgwMiwgMSA8PCAzKTsKLQkgICAgZHN0UHRyID0gZHN0OwotCSAgICBzcmNQdHIgPSBzcmM7Ci0JICAgIGkgPSB3aWR0aDsKLQkgICAgaiA9IHBoYXNlOwotCSAgICB3aGlsZShqLS0pIHsKLQkJbSA9IChzcmNQdHJbMV0gJiAweDA4MDgwODA4KSB8ICgoc3JjUHRyWzBdICYgMHgwODA4MDgwOCkgPDwgNCk7Ci0gCQkqZHN0UHRyKysgPSAobSA+PiAyNykgfCAobSA+PiAxOCkgfCAobSA+PiA5KSB8IG07Ci0JCXNyY1B0ciArPSAyOwotCSAgICB9Ci0JICAgIHdoaWxlKGkgPj0gNCkgewotCQltID0gKHNyY1B0clsxXSAmIDB4MDgwODA4MDgpIHwgKChzcmNQdHJbMF0gJiAweDA4MDgwODA4KSA8PCA0KTsKLSAJCXMxID0gKG0gPj4gMjcpIHwgKG0gPj4gMTgpIHwgKG0gPj4gOSkgfCBtOwotCQltID0gKHNyY1B0clszXSAmIDB4MDgwODA4MDgpIHwgKChzcmNQdHJbMl0gJiAweDA4MDgwODA4KSA8PCA0KTsKLSAJCXMyID0gKG0gPj4gMjcpIHwgKG0gPj4gMTgpIHwgKG0gPj4gOSkgfCBtOwotCQltID0gKHNyY1B0cls1XSAmIDB4MDgwODA4MDgpIHwgKChzcmNQdHJbNF0gJiAweDA4MDgwODA4KSA8PCA0KTsKLSAJCXMzID0gKG0gPj4gMjcpIHwgKG0gPj4gMTgpIHwgKG0gPj4gOSkgfCBtOwotCQltID0gKHNyY1B0cls3XSAmIDB4MDgwODA4MDgpIHwgKChzcmNQdHJbNl0gJiAweDA4MDgwODA4KSA8PCA0KTsKLSAJCXM0ID0gKG0gPj4gMjcpIHwgKG0gPj4gMTgpIHwgKG0gPj4gOSkgfCBtOwotCQkqKChVaW50MzIqKWRzdFB0cikgPSBzMSB8IChzMiA8PCA4KSB8IChzMyA8PCAxNikgfCAoczQgPDwgMjQpOwotCQlzcmNQdHIgKz0gODsKLQkJZHN0UHRyICs9IDQ7Ci0JCWkgLT0gNDsKLQkgICAgfQotCSAgICB3aGlsZShpLS0pIHsKLQkJbSA9IChzcmNQdHJbMV0gJiAweDA4MDgwODA4KSB8ICgoc3JjUHRyWzBdICYgMHgwODA4MDgwOCkgPDwgNCk7Ci0gCQkqZHN0UHRyKysgPSAobSA+PiAyNykgfCAobSA+PiAxOCkgfCAobSA+PiA5KSB8IG07Ci0JCXNyY1B0ciArPSAyOwotCSAgICB9Ci0KLSAgICAgICAgICAgIGRzdCArPSBGQlBpdGNoOwotICAgICAgICAgICAgc3JjICs9IFNSQ1BpdGNoOwotICAgICAgICB9Ci0gICAgICAgIHJlY3RzKys7Ci0gICAgfQotfQotI2VuZGlmIC8qIFZHQTE2X0ZCQ09OX1NVUFBPUlQgKi8KLQotdm9pZCBGQl9TYXZlUGFsZXR0ZVRvKF9USElTLCBpbnQgcGFsZXR0ZV9sZW4sIF9fdTE2ICphcmVhKQotewotCXN0cnVjdCBmYl9jbWFwIGNtYXA7Ci0KLQljbWFwLnN0YXJ0ID0gMDsKLQljbWFwLmxlbiA9IHBhbGV0dGVfbGVuOwotCWNtYXAucmVkID0gJmFyZWFbMCpwYWxldHRlX2xlbl07Ci0JY21hcC5ncmVlbiA9ICZhcmVhWzEqcGFsZXR0ZV9sZW5dOwotCWNtYXAuYmx1ZSA9ICZhcmVhWzIqcGFsZXR0ZV9sZW5dOwotCWNtYXAudHJhbnNwID0gTlVMTDsKLQlpb2N0bChjb25zb2xlX2ZkLCBGQklPR0VUQ01BUCwgJmNtYXApOwotfQotCi12b2lkIEZCX1Jlc3RvcmVQYWxldHRlRnJvbShfVEhJUywgaW50IHBhbGV0dGVfbGVuLCBfX3UxNiAqYXJlYSkKLXsKLQlzdHJ1Y3QgZmJfY21hcCBjbWFwOwotCi0JY21hcC5zdGFydCA9IDA7Ci0JY21hcC5sZW4gPSBwYWxldHRlX2xlbjsKLQljbWFwLnJlZCA9ICZhcmVhWzAqcGFsZXR0ZV9sZW5dOwotCWNtYXAuZ3JlZW4gPSAmYXJlYVsxKnBhbGV0dGVfbGVuXTsKLQljbWFwLmJsdWUgPSAmYXJlYVsyKnBhbGV0dGVfbGVuXTsKLQljbWFwLnRyYW5zcCA9IE5VTEw7Ci0JaW9jdGwoY29uc29sZV9mZCwgRkJJT1BVVENNQVAsICZjbWFwKTsKLX0KLQotc3RhdGljIHZvaWQgRkJfU2F2ZVBhbGV0dGUoX1RISVMsIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2aW5mbykKLXsKLQlpbnQgaTsKLQotCS8qIFNhdmUgaGFyZHdhcmUgcGFsZXR0ZSwgaWYgbmVlZGVkICovCi0JaWYgKCBmaW5mby0+dmlzdWFsID09IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiApIHsKLQkJc2F2ZWRfY21hcGxlbiA9IDE8PHZpbmZvLT5iaXRzX3Blcl9waXhlbDsKLQkJc2F2ZWRfY21hcD0oX191MTYgKilTRExfbWFsbG9jKDMqc2F2ZWRfY21hcGxlbipzaXplb2YoKnNhdmVkX2NtYXApKTsKLQkJaWYgKCBzYXZlZF9jbWFwICE9IE5VTEwgKSB7Ci0JCQlGQl9TYXZlUGFsZXR0ZVRvKHRoaXMsIHNhdmVkX2NtYXBsZW4sIHNhdmVkX2NtYXApOwotCQl9Ci0JfQotCi0JLyogQWRkZWQgc3VwcG9ydCBmb3IgRkJfVklTVUFMX0RJUkVDVENPTE9SLgotCSAgIFdpdGggdGhpcyBtb2RlIHBpeGVsIGluZm9ybWF0aW9uIGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBwYWxldHRlLi4uCi0JICAgTmVhdCBmYWRpbmcgYW5kIGdhbW1hIGNvcnJlY3Rpb24gZWZmZWN0cyBjYW4gYmUgaGFkIGJ5IHNpbXBseQotCSAgIGZvb2xpbmcgYXJvdW5kIHdpdGggdGhlIHBhbGV0dGUgaW5zdGVhZCBvZiBjaGFuZ2luZyB0aGUgcGl4ZWwKLQkgICB2YWx1ZXMgdGhlbXNlbHZlcy4uLiBWZXJ5IG5lYXQhCi0KLQkgICBBZGFtIE1leWVyb3dpdHogMS8xOS8yMDAwCi0JICAgYW1leWVyb3dAb3B0b25saW5lLmNvbQotCSovCi0JaWYgKCBmaW5mby0+dmlzdWFsID09IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUiApIHsKLQkJX191MTYgbmV3X2VudHJpZXNbMyoyNTZdOwotCi0JCS8qIFNhdmUgdGhlIGNvbG9ybWFwICovCi0JCXNhdmVkX2NtYXBsZW4gPSAyNTY7Ci0JCXNhdmVkX2NtYXA9KF9fdTE2ICopU0RMX21hbGxvYygzKnNhdmVkX2NtYXBsZW4qc2l6ZW9mKCpzYXZlZF9jbWFwKSk7Ci0JCWlmICggc2F2ZWRfY21hcCAhPSBOVUxMICkgewotCQkJRkJfU2F2ZVBhbGV0dGVUbyh0aGlzLCBzYXZlZF9jbWFwbGVuLCBzYXZlZF9jbWFwKTsKLQkJfQotCi0JCS8qIEFsbG9jYXRlIG5ldyBpZGVudGl0eSBjb2xvcm1hcCAqLwotCQlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7Ci0JICAgICAgCQluZXdfZW50cmllc1soMCoyNTYpK2ldID0KLQkJCW5ld19lbnRyaWVzWygxKjI1NikraV0gPQotCQkJbmV3X2VudHJpZXNbKDIqMjU2KStpXSA9IChpPDw4KXxpOwotCQl9Ci0JCUZCX1Jlc3RvcmVQYWxldHRlRnJvbSh0aGlzLCAyNTYsIG5ld19lbnRyaWVzKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEZCX1Jlc3RvcmVQYWxldHRlKF9USElTKQotewotCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBhbGV0dGUgKi8KLQlpZiAoIHNhdmVkX2NtYXAgKSB7Ci0JCUZCX1Jlc3RvcmVQYWxldHRlRnJvbSh0aGlzLCBzYXZlZF9jbWFwbGVuLCBzYXZlZF9jbWFwKTsKLQkJU0RMX2ZyZWUoc2F2ZWRfY21hcCk7Ci0JCXNhdmVkX2NtYXAgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIGludCBGQl9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0JaW50IGk7Ci0JX191MTYgclsyNTZdOwotCV9fdTE2IGdbMjU2XTsKLQlfX3UxNiBiWzI1Nl07Ci0Jc3RydWN0IGZiX2NtYXAgY21hcDsKLQotCS8qIFNldCB1cCB0aGUgY29sb3JtYXAgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7Ci0JCXJbaV0gPSBjb2xvcnNbaV0uciA8PCA4OwotCQlnW2ldID0gY29sb3JzW2ldLmcgPDwgODsKLQkJYltpXSA9IGNvbG9yc1tpXS5iIDw8IDg7Ci0JfQotCWNtYXAuc3RhcnQgPSBmaXJzdGNvbG9yOwotCWNtYXAubGVuID0gbmNvbG9yczsKLQljbWFwLnJlZCA9IHI7Ci0JY21hcC5ncmVlbiA9IGc7Ci0JY21hcC5ibHVlID0gYjsKLQljbWFwLnRyYW5zcCA9IE5VTEw7Ci0KLQlpZiggKGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9QVVRDTUFQLCAmY21hcCkgPCAwKSB8fAotCSAgICAhKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFKSApIHsKLQkgICAgICAgIGNvbG9ycyA9IHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnM7Ci0JCW5jb2xvcnMgPSB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsKLQkJY21hcC5zdGFydCA9IDA7Ci0JCWNtYXAubGVuID0gbmNvbG9yczsKLQkJU0RMX21lbXNldChyLCAwLCBzaXplb2YocikpOwotCQlTRExfbWVtc2V0KGcsIDAsIHNpemVvZihnKSk7Ci0JCVNETF9tZW1zZXQoYiwgMCwgc2l6ZW9mKGIpKTsKLQkJaWYgKCBpb2N0bChjb25zb2xlX2ZkLCBGQklPR0VUQ01BUCwgJmNtYXApID09IDAgKSB7Ci0JCQlmb3IgKCBpPW5jb2xvcnMtMTsgaT49MDsgLS1pICkgewotCQkJCWNvbG9yc1tpXS5yID0gKHJbaV0+PjgpOwotCQkJCWNvbG9yc1tpXS5nID0gKGdbaV0+PjgpOwotCQkJCWNvbG9yc1tpXS5iID0gKGJbaV0+PjgpOwotCQkJfQotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JcmV0dXJuKDEpOwotfQotCi0vKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKLSAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KLSovCi1zdGF0aWMgdm9pZCBGQl9WaWRlb1F1aXQoX1RISVMpCi17Ci0JaW50IGksIGo7Ci0KLQlpZiAoIHRoaXMtPnNjcmVlbiApIHsKLQkJLyogQ2xlYXIgc2NyZWVuIGFuZCB0ZWxsIFNETCBub3QgdG8gZnJlZSB0aGUgcGl4ZWxzICovCi0JCWlmICggdGhpcy0+c2NyZWVuLT5waXhlbHMgJiYgRkJfSW5HcmFwaGljc01vZGUodGhpcykgKSB7Ci0jaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX2lhNjRfXykJLyogU0lHQlVTIHdoZW4gdXNpbmcgU0RMX21lbXNldCgpID8/ICovCi0JCQlVaW50OCAqcm93cCA9IChVaW50OCAqKXRoaXMtPnNjcmVlbi0+cGl4ZWxzOwotCQkJaW50IGxlZnQgPSB0aGlzLT5zY3JlZW4tPnBpdGNoKnRoaXMtPnNjcmVlbi0+aDsKLQkJCXdoaWxlICggbGVmdC0tICkgeyAqcm93cCsrID0gMDsgfQotI2Vsc2UKLQkJCVNETF9tZW1zZXQodGhpcy0+c2NyZWVuLT5waXhlbHMsMCx0aGlzLT5zY3JlZW4tPmgqdGhpcy0+c2NyZWVuLT5waXRjaCk7Ci0jZW5kaWYKLQkJfQotCQkvKiBUaGlzIHRlc3QgZmFpbHMgd2hlbiB1c2luZyB0aGUgVkdBMTYgc2hhZG93IG1lbW9yeSAqLwotCQlpZiAoICgoY2hhciAqKXRoaXMtPnNjcmVlbi0+cGl4ZWxzID49IG1hcHBlZF9tZW0pICYmCi0JCSAgICAgKChjaGFyICopdGhpcy0+c2NyZWVuLT5waXhlbHMgPCAobWFwcGVkX21lbSttYXBwZWRfbWVtbGVuKSkgKSB7Ci0JCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQkvKiBDbGVhciB0aGUgbG9jayBtdXRleCAqLwotCWlmICggaHdfbG9jayApIHsKLQkJU0RMX0Rlc3Ryb3lNdXRleChod19sb2NrKTsKLQkJaHdfbG9jayA9IE5VTEw7Ci0JfQotCi0JLyogQ2xlYW4gdXAgZGVmaW5lZCB2aWRlbyBtb2RlcyAqLwotCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7Ci0JCWlmICggU0RMX21vZGVsaXN0W2ldICE9IE5VTEwgKSB7Ci0JCQlmb3IgKCBqPTA7IFNETF9tb2RlbGlzdFtpXVtqXTsgKytqICkgewotCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXVtqXSk7Ci0JCQl9Ci0JCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOwotCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKLQkJfQotCX0KLQotCS8qIENsZWFuIHVwIHRoZSBtZW1vcnkgYnVja2V0IGxpc3QgKi8KLQlGQl9GcmVlSFdTdXJmYWNlcyh0aGlzKTsKLQotCS8qIENsb3NlIGNvbnNvbGUgYW5kIGlucHV0IGZpbGUgZGVzY3JpcHRvcnMgKi8KLQlpZiAoIGNvbnNvbGVfZmQgPiAwICkgewotCQkvKiBVbm1hcCB0aGUgdmlkZW8gZnJhbWVidWZmZXIgYW5kIEkvTyByZWdpc3RlcnMgKi8KLQkJaWYgKCBtYXBwZWRfbWVtICkgewotCQkJbXVubWFwKG1hcHBlZF9tZW0sIG1hcHBlZF9tZW1sZW4pOwotCQkJbWFwcGVkX21lbSA9IE5VTEw7Ci0JCX0KLQkJaWYgKCBtYXBwZWRfaW8gKSB7Ci0JCQltdW5tYXAobWFwcGVkX2lvLCBtYXBwZWRfaW9sZW4pOwotCQkJbWFwcGVkX2lvID0gTlVMTDsKLQkJfQotCi0JCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHZpZGVvIG1vZGUgYW5kIHBhbGV0dGUgKi8KLQkJaWYgKCBGQl9JbkdyYXBoaWNzTW9kZSh0aGlzKSApIHsKLQkJCUZCX1Jlc3RvcmVQYWxldHRlKHRoaXMpOwotCQkJaW9jdGwoY29uc29sZV9mZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgJnNhdmVkX3ZpbmZvKTsKLQkJfQotCi0JCS8qIFdlJ3JlIGFsbCBkb25lIHdpdGggdGhlIGZyYW1lYnVmZmVyICovCi0JCWNsb3NlKGNvbnNvbGVfZmQpOwotCQljb25zb2xlX2ZkID0gLTE7Ci0JfQotCUZCX0Nsb3NlTW91c2UodGhpcyk7Ci0JRkJfQ2xvc2VLZXlib2FyZCh0aGlzKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZidmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vU0RMX2ZidmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4ZmExMC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYnZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9mYnZpZGVvX2gKLSNkZWZpbmUgX1NETF9mYnZpZGVvX2gKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiU0RMX211dGV4LmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaWYgU0RMX0lOUFVUX1RTTElCCi0jaW5jbHVkZSAidHNsaWIuaCIKLSNlbmRpZgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0KLQotLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdlIHVzZSB0byBrZWVwIHRyYWNrIG9mIHZpZGVvIG1lbW9yeSAqLwotdHlwZWRlZiBzdHJ1Y3QgdmlkbWVtX2J1Y2tldCB7Ci0Jc3RydWN0IHZpZG1lbV9idWNrZXQgKnByZXY7Ci0JaW50IHVzZWQ7Ci0JaW50IGRpcnR5OwotCWNoYXIgKmJhc2U7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0Jc3RydWN0IHZpZG1lbV9idWNrZXQgKm5leHQ7Ci19IHZpZG1lbV9idWNrZXQ7Ci0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotCWludCBjb25zb2xlX2ZkOwotCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBjYWNoZV92aW5mbzsKLQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gc2F2ZWRfdmluZm87Ci0JaW50IHNhdmVkX2NtYXBsZW47Ci0JX191MTYgKnNhdmVkX2NtYXA7Ci0KLQlpbnQgY3VycmVudF92dDsKLQlpbnQgc2F2ZWRfdnQ7Ci0JaW50IGtleWJvYXJkX2ZkOwotCWludCBzYXZlZF9rYmRfbW9kZTsKLQlzdHJ1Y3QgdGVybWlvcyBzYXZlZF9rYmRfdGVybWlvczsKLQotCWludCBtb3VzZV9mZDsKLSNpZiBTRExfSU5QVVRfVFNMSUIKLQlzdHJ1Y3QgdHNkZXYgKnRzX2RldjsKLSNlbmRpZgotCi0JY2hhciAqbWFwcGVkX21lbTsKLQlpbnQgbWFwcGVkX21lbWxlbjsKLQlpbnQgbWFwcGVkX29mZnNldDsKLQljaGFyICptYXBwZWRfaW87Ci0JbG9uZyBtYXBwZWRfaW9sZW47Ci0JaW50IGZsaXBfcGFnZTsKLQljaGFyICpmbGlwX2FkZHJlc3NbMl07Ci0KLSNkZWZpbmUgTlVNX01PREVMSVNUUwk0CQkvKiA4LCAxNiwgMjQsIGFuZCAzMiBiaXRzLXBlci1waXhlbCAqLwotCWludCBTRExfbnVtbW9kZXNbTlVNX01PREVMSVNUU107Ci0JU0RMX1JlY3QgKipTRExfbW9kZWxpc3RbTlVNX01PREVMSVNUU107Ci0KLQl2aWRtZW1fYnVja2V0IHN1cmZhY2VzOwotCWludCBzdXJmYWNlc19tZW10b3RhbDsKLQlpbnQgc3VyZmFjZXNfbWVtbGVmdDsKLQotCVNETF9tdXRleCAqaHdfbG9jazsKLQlpbnQgc3dpdGNoZWRfYXdheTsKLQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gc2NyZWVuX3ZpbmZvOwotCVVpbnQzMiBzY3JlZW5fYXJlYWxlbjsKLQlVaW50OCAqc2NyZWVuX2NvbnRlbnRzOwotCV9fdTE2ICBzY3JlZW5fcGFsZXR0ZVszKjI1Nl07Ci0KLQl2b2lkICgqd2FpdF92YmwpKF9USElTKTsKLQl2b2lkICgqd2FpdF9pZGxlKShfVEhJUyk7Ci19OwotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIGNvbnNvbGVfZmQJCSh0aGlzLT5oaWRkZW4tPmNvbnNvbGVfZmQpCi0jZGVmaW5lIGN1cnJlbnRfdnQJCSh0aGlzLT5oaWRkZW4tPmN1cnJlbnRfdnQpCi0jZGVmaW5lIHNhdmVkX3Z0CQkodGhpcy0+aGlkZGVuLT5zYXZlZF92dCkKLSNkZWZpbmUga2V5Ym9hcmRfZmQJCSh0aGlzLT5oaWRkZW4tPmtleWJvYXJkX2ZkKQotI2RlZmluZSBzYXZlZF9rYmRfbW9kZQkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfa2JkX21vZGUpCi0jZGVmaW5lIHNhdmVkX2tiZF90ZXJtaW9zCSh0aGlzLT5oaWRkZW4tPnNhdmVkX2tiZF90ZXJtaW9zKQotI2RlZmluZSBtb3VzZV9mZAkJKHRoaXMtPmhpZGRlbi0+bW91c2VfZmQpCi0jaWYgU0RMX0lOUFVUX1RTTElCCi0jZGVmaW5lIHRzX2RldgkJCSh0aGlzLT5oaWRkZW4tPnRzX2RldikKLSNlbmRpZgotI2RlZmluZSBjYWNoZV92aW5mbwkJKHRoaXMtPmhpZGRlbi0+Y2FjaGVfdmluZm8pCi0jZGVmaW5lIHNhdmVkX3ZpbmZvCQkodGhpcy0+aGlkZGVuLT5zYXZlZF92aW5mbykKLSNkZWZpbmUgc2F2ZWRfY21hcGxlbgkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfY21hcGxlbikKLSNkZWZpbmUgc2F2ZWRfY21hcAkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfY21hcCkKLSNkZWZpbmUgbWFwcGVkX21lbQkJKHRoaXMtPmhpZGRlbi0+bWFwcGVkX21lbSkKLSNkZWZpbmUgbWFwcGVkX21lbWxlbgkJKHRoaXMtPmhpZGRlbi0+bWFwcGVkX21lbWxlbikKLSNkZWZpbmUgbWFwcGVkX29mZnNldAkJKHRoaXMtPmhpZGRlbi0+bWFwcGVkX29mZnNldCkKLSNkZWZpbmUgbWFwcGVkX2lvCQkodGhpcy0+aGlkZGVuLT5tYXBwZWRfaW8pCi0jZGVmaW5lIG1hcHBlZF9pb2xlbgkJKHRoaXMtPmhpZGRlbi0+bWFwcGVkX2lvbGVuKQotI2RlZmluZSBmbGlwX3BhZ2UJCSh0aGlzLT5oaWRkZW4tPmZsaXBfcGFnZSkKLSNkZWZpbmUgZmxpcF9hZGRyZXNzCQkodGhpcy0+aGlkZGVuLT5mbGlwX2FkZHJlc3MpCi0jZGVmaW5lIFNETF9udW1tb2RlcwkJKHRoaXMtPmhpZGRlbi0+U0RMX251bW1vZGVzKQotI2RlZmluZSBTRExfbW9kZWxpc3QJCSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKLSNkZWZpbmUgc3VyZmFjZXMJCSh0aGlzLT5oaWRkZW4tPnN1cmZhY2VzKQotI2RlZmluZSBzdXJmYWNlc19tZW10b3RhbAkodGhpcy0+aGlkZGVuLT5zdXJmYWNlc19tZW10b3RhbCkKLSNkZWZpbmUgc3VyZmFjZXNfbWVtbGVmdAkodGhpcy0+aGlkZGVuLT5zdXJmYWNlc19tZW1sZWZ0KQotI2RlZmluZSBod19sb2NrCQkJKHRoaXMtPmhpZGRlbi0+aHdfbG9jaykKLSNkZWZpbmUgc3dpdGNoZWRfYXdheQkJKHRoaXMtPmhpZGRlbi0+c3dpdGNoZWRfYXdheSkKLSNkZWZpbmUgc2NyZWVuX3ZpbmZvCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5fdmluZm8pCi0jZGVmaW5lIHNjcmVlbl9hcmVhbGVuCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5fYXJlYWxlbikKLSNkZWZpbmUgc2NyZWVuX2NvbnRlbnRzCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5fY29udGVudHMpCi0jZGVmaW5lIHNjcmVlbl9wYWxldHRlCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5fcGFsZXR0ZSkKLSNkZWZpbmUgd2FpdF92YmwJCSh0aGlzLT5oaWRkZW4tPndhaXRfdmJsKQotI2RlZmluZSB3YWl0X2lkbGUJCSh0aGlzLT5oaWRkZW4tPndhaXRfaWRsZSkKLQotLyogQWNjZWxlcmF0b3IgdHlwZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIsIGJ1dCBhcmUgbm90Ci0gICBuZWNlc3NhcmlseSBpbiB0aGUga2VybmVsIGhlYWRlcnMgb24gdGhlIHN5c3RlbSB3ZSBjb21waWxlIG9uLgotKi8KLSNpZm5kZWYgRkJfQUNDRUxfTUFUUk9YX01HQUc0MDAKLSNkZWZpbmUgRkJfQUNDRUxfTUFUUk9YX01HQUc0MDAJMjYJLyogTWF0cm94IEc0MDAJCQkqLwotI2VuZGlmCi0jaWZuZGVmIEZCX0FDQ0VMXzNERlhfQkFOU0hFRQotI2RlZmluZSBGQl9BQ0NFTF8zREZYX0JBTlNIRUUJMzEJLyogM0RmeCBCYW5zaGVlCQkJKi8KLSNlbmRpZgotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gU0RMX2ZidmlkZW8uYyAqLwotZXh0ZXJuIHZvaWQgRkJfU2F2ZVBhbGV0dGVUbyhfVEhJUywgaW50IHBhbGV0dGVfbGVuLCBfX3UxNiAqYXJlYSk7Ci1leHRlcm4gdm9pZCBGQl9SZXN0b3JlUGFsZXR0ZUZyb20oX1RISVMsIGludCBwYWxldHRlX2xlbiwgX191MTYgKmFyZWEpOwotCi0vKiBUaGVzZSBhcmUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB2aWRlbyBzdXJmYWNlcyAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIEZCX0FkZEJ1c3lTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCSgodmlkbWVtX2J1Y2tldCAqKXN1cmZhY2UtPmh3ZGF0YSktPmRpcnR5ID0gMTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IEZCX0lzU3VyZmFjZUJ1c3koU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuICgodmlkbWVtX2J1Y2tldCAqKXN1cmZhY2UtPmh3ZGF0YSktPmRpcnR5OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIEZCX1dhaXRCdXN5U3VyZmFjZXMoX1RISVMpCi17Ci0JdmlkbWVtX2J1Y2tldCAqYnVja2V0OwotCi0JLyogV2FpdCBmb3IgZ3JhcGhpYyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlICovCi0Jd2FpdF9pZGxlKHRoaXMpOwotCi0JLyogQ2xlYXIgYWxsIHN1cmZhY2UgZGlydHkgYml0cyAqLwotCWZvciAoIGJ1Y2tldD0mc3VyZmFjZXM7IGJ1Y2tldDsgYnVja2V0PWJ1Y2tldC0+bmV4dCApIHsKLQkJYnVja2V0LT5kaXJ0eSA9IDA7Ci0JfQotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIEZCX2RzdF90b194eShfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgaW50ICp4LCBpbnQgKnkpCi17Ci0JKnggPSAobG9uZykoKGNoYXIgKilkc3QtPnBpeGVscyAtIG1hcHBlZF9tZW0pJXRoaXMtPnNjcmVlbi0+cGl0Y2g7Ci0JKnkgPSAobG9uZykoKGNoYXIgKilkc3QtPnBpeGVscyAtIG1hcHBlZF9tZW0pL3RoaXMtPnNjcmVlbi0+cGl0Y2g7Ci0JaWYgKCBkc3QgPT0gdGhpcy0+c2NyZWVuICkgewotCQkqeCArPSB0aGlzLT5vZmZzZXRfeDsKLQkJKnkgKz0gdGhpcy0+b2Zmc2V0X3k7Ci0JfQotfQotCi0jZW5kaWYgLyogX1NETF9mYnZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vbWF0cm94X21taW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vbWF0cm94X21taW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljNzY2MS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL21hdHJveF9tbWlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogTUdBIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCi0KLSNpbmNsdWRlICJtYXRyb3hfcmVncy5oIgotCi0vKiBNR0EgY29udHJvbCBtYWNyb3MgKi8KLQotI2RlZmluZSBtZ2FfaW44KHJlZykJCSoodm9sYXRpbGUgVWludDggICopKG1hcHBlZF9pbyArIChyZWcpKQotI2RlZmluZSBtZ2FfaW4zMihyZWcpCQkqKHZvbGF0aWxlIFVpbnQzMiAqKShtYXBwZWRfaW8gKyAocmVnKSkKLQotI2RlZmluZSBtZ2Ffb3V0OChyZWcsdikJCSoodm9sYXRpbGUgVWludDggICopKG1hcHBlZF9pbyArIChyZWcpKSA9IHY7Ci0jZGVmaW5lIG1nYV9vdXQzMihyZWcsdikJKih2b2xhdGlsZSBVaW50MzIgKikobWFwcGVkX2lvICsgKHJlZykpID0gdjsKLQotCi0vKiBXYWl0IGZvciBmaWZvIHNwYWNlICovCi0jZGVmaW5lIG1nYV93YWl0KHNwYWNlKQkJCQkJCQlcCi17CQkJCQkJCQkJXAotCXdoaWxlICggbWdhX2luOChNR0FSRUdfRklGT1NUQVRVUykgPCBzcGFjZSApCQkJXAotCQk7CQkJCQkJCVwKLX0KLQotCi0vKiBXYWl0IGZvciBpZGxlIGFjY2VsZXJhdG9yICovCi0jZGVmaW5lIG1nYV93YWl0aWRsZSgpCQkJCQkJCVwKLXsJCQkJCQkJCQlcCi0Jd2hpbGUgKCBtZ2FfaW4zMihNR0FSRUdfU1RBVFVTKSAmIDB4MTAwMDAgKQkJCVwKLQkJOwkJCQkJCQlcCi19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vb3V0IGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjA2NDUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1JbmRleDogU0RMX2ZiZXZlbnRzLmMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLSBTRExfZmJldmVudHMuYwkocmV2aXNpb24gMjMzOCkKLSsrKyBTRExfZmJldmVudHMuYwkod29ya2luZyBjb3B5KQotQEAgLTU1LDYgKzU1LDcgQEAKLSAjZGVmaW5lIEdQTV9OT0RFX0ZJRk8JIi9kZXYvZ3BtZGF0YSIKLSAjZW5kaWYKLSAKLSsvKiNkZWZpbmUgREVCVUdfS0VZQk9BUkQqLwotIC8qI2RlZmluZSBERUJVR19NT1VTRSovCi0gCi0gLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlcyBmcm9tIGEgY29uc29sZSBzY2FuY29kZSB0byBhIFNETCBrZXlzeW0gKi8KLUBAIC0yODEsOCArMjgyLDE1IEBACi0gCQl9Ci0gIAkJaWYgKCBrZXlib2FyZF9mZCA8IDAgKSB7Ci0gCQkJLyogTGFzdCByZXNvcnQsIG1heWJlIG91ciB0dHkgaXMgYSB1c2FibGUgVlQgKi8KLS0JCQljdXJyZW50X3Z0ID0gMDsKLSsJCQlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXRlOwotKwotIAkJCWtleWJvYXJkX2ZkID0gb3BlbigiL2Rldi90dHkiLCBPX1JEV1IpOwotKwotKwkJCWlmICggaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX0dFVFNUQVRFLCAmdnRzdGF0ZSkgPT0gMCApIHsKLSsJCQkJY3VycmVudF92dCA9IHZ0c3RhdGUudl9hY3RpdmU7Ci0rCQkJfSBlbHNlIHsKLSsJCQkJY3VycmVudF92dCA9IDA7Ci0rCQkJfQotICAJCX0KLSAjaWZkZWYgREVCVUdfS0VZQk9BUkQKLSAJCWZwcmludGYoc3RkZXJyLCAiQ3VycmVudCBWVDogJWRcbiIsIGN1cnJlbnRfdnQpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9yaXZhX3JlZ3MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vcml2YV9yZWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjFjMDcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9yaXZhX3JlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9SSVZBX1JFR1NfSAotI2RlZmluZSBfUklWQV9SRUdTX0gKLQotLyogVGhpcyBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBYRnJlZTg2IE5WaWRpYSBoYXJkd2FyZSBkcml2ZXIgKi8KLQotLyogbWFwcGVkX2lvIHJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgUEdSQVBIX09GRlNFVAkweDAwNDAwMDAwCi0jZGVmaW5lIEZJRk9fT0ZGU0VUCTB4MDA4MDAwMDAKLSNkZWZpbmUgUk9QX09GRlNFVAlGSUZPX09GRlNFVCsweDAwMDAwMDAwCi0jZGVmaW5lIENMSVBfT0ZGU0VUCUZJRk9fT0ZGU0VUKzB4MDAwMDIwMDAKLSNkZWZpbmUgUEFUVF9PRkZTRVQJRklGT19PRkZTRVQrMHgwMDAwNDAwMAotI2RlZmluZSBQSVhNQVBfT0ZGU0VUCUZJRk9fT0ZGU0VUKzB4MDAwMDYwMDAKLSNkZWZpbmUgQkxUX09GRlNFVAlGSUZPX09GRlNFVCsweDAwMDA4MDAwCi0jZGVmaW5lIEJJVE1BUF9PRkZTRVQJRklGT19PRkZTRVQrMHgwMDAwQTAwMAotI2RlZmluZSBMSU5FX09GRlNFVAlGSUZPX09GRlNFVCsweDAwMDBDMDAwCi0jZGVmaW5lIFRSSTAzX09GRlNFVAlGSUZPX09GRlNFVCsweDAwMDBFMDAwCi0jZGVmaW5lIFBDSU9fT0ZGU0VUCTB4MDA2MDEwMDAKLQotI2VuZGlmIC8qIF9SSVZBX1JFR1NfSCAqLwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dhcGkvU0RMX2dhcGl2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nYXBpL1NETF9nYXBpdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmY2U1MC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dhcGkvU0RMX2dhcGl2aWRlby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogUG9ja2V0IFBDIEdBUEkgU0RMIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbjsKLUltcGxlbWVudGVkIGJ5IERtaXRyeSBZYWtpbW92IC0gc3VwcG9ydEBhY3RpdmVraXR0ZW4uY29tCi1JbnNwaXJlZCBieSBodHRwOi8vYXJpc21lLmZyZWUuZnIvcG9ydHMvU0RMLnBocAotKi8KLQotLy8gVE9ETzogY29weSBzdXJmYWNlIG9uIHdpbmRvdyB3aGVuIGxvc3QgZm9jdXMKLS8vIFRPRE86IHRlc3QgYnV0dG9ucyByb3RhdGlvbgotLy8gVE9ETzogdGVzdCBvbiBiZTMwMCBhbmQgSFBDICggY2hlY2sgV2luRGliIGZ1bGxzY3JlZW4ga2V5cyBjYXRjaGluZyApCi0vLyBUT0RPOiB0ZXN0IG9uIHNtYXJ0cGhvbmVzCi0vLyBUT0RPOiB3aW5kaWIgb24gU0gzIFBQQzIwMDAgbGFuZHNjYXBlIHRlc3QKLS8vIFRPRE86IG9wdGltaXplIDhicHAgbGFuZHNjYXBlIG1vZGUKLQotLy8gdGhlcmUgaXMgc29tZSBwcm9ibGVtcyBpbiBydW5uaW5ncyBhcHBzIGZyb20gYSBkZXZpY2UgbGFuZHNjYXBlIG1vZGUKLS8vIGR1ZSB0byBXaW5DRSBidWdzLiBTb21lIHdvcmtzIGFuZCBzb21lIC0gZG9lcyBub3QuCi0vLyBUT0RPOiBmaW5pc2ggQXhpbSBEZWxsIFgzMCBhbmQgdXNlciBsYW5kc2NhcGUgbW9kZSwgZGV2aWNlIGxhbmRzY2FwZSBtb2RlCi0vLyBUT0RPOiBmaW5pc2ggQXhpbSBEZWxsIFgzMCB1c2VyIHBvcnRyYWl0LCBkZXZpY2UgbGFuZHNjYXBlIHN0eWx1cyBjb252ZXJzaW9uCi0vLyBUT0RPOiBmaXggcnVubmluZyBHQVBJIGFwcHMgZnJvbSBsYW5kc2NhcGUgbW9kZSAtIAotLy8gICAgICAgd2luY2UgZ29lcyB0byBwb3J0cmFpdCBtb2RlLCBidXQgZG9lcyBub3QgdXBkYXRlIHZpZGVvIG1lbW9yeQotCi0KLSNpbmNsdWRlICJTREwuaCIKLSNpbmNsdWRlICJTRExfZXJyb3IuaCIKLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9zeXN3bV9jLmgiCi0jaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9zeXNtb3VzZV9jLmgiCi0jaW5jbHVkZSAiLi4vd2luZGliL1NETF9kaWJldmVudHNfYy5oIiAKLQotI2luY2x1ZGUgIlNETF9nYXBpdmlkZW8uaCIKLQotI2RlZmluZSBHQVBJVklEX0RSSVZFUl9OQU1FICJnYXBpIgotCi0jaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZCAoX0RFQlVHKSB8fCBkZWZpbmVkKE5ERUJVRykKLSNkZWZpbmUgUkVQT1JUX1ZJREVPX0lORk8gMQotI2Vsc2UKLSNkZWZpbmUgUkVQT1JUX1ZJREVPX0lORk8gMAotI2VuZGlmCi0KLS8vIGZvciB0ZXN0aW5nIHdpdGggR2FwaUVtdQotI2RlZmluZSBVU0VfR0FQSV9FTVUgMAotI2RlZmluZSBFTVVMQVRFX0FYSU1fWDMwIDAKLSNkZWZpbmUgV0lUSE9VVF9HQVBJIDAKLQotI2lmIFVTRV9HQVBJX0VNVSAmJiAhUkVQT1JUX1ZJREVPX0lORk8KLSNwcmFnbWEgbWVzc2FnZSgiV2FybmluZzogVXNpbmcgR2FwaUVtdSBpbiByZWxlYXNlIGJ1aWxkLiBJIGFzc3VtZSB5b3UnZCBsaWtlIHRvIHNldCBVU0VfR0FQSV9FTVUgdG8gemVyby4iKQotI2VuZGlmCi0KLS8vIGRlZmluZWQgYW5kIHVzZWQgaW4gU0RMX3N5c2V2ZW50cy5jCi1leHRlcm4gSElOU1RBTkNFIGF5Z3NoZWxsOwotZXh0ZXJuIHZvaWQgU0RMX1VucmVnaXN0ZXJBcHAoKTsKLWV4dGVybiBpbnQgRElCX0FkZE1vZGUoX1RISVMsIGludCBicHAsIGludCB3LCBpbnQgaCk7Ci0KLS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBHQVBJX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKLXN0YXRpYyBTRExfUmVjdCAqKkdBUElfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqR0FQSV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgaW50IEdBUElfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyB2b2lkIEdBUElfVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgR0FQSV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBHQVBJX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIEdBUElfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBHQVBJX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLQotLyogV2luZG93cyBtZXNzYWdlIGhhbmRsaW5nIGZ1bmN0aW9ucywgd2lsbCBub3QgYmUgcHJvY2Vzc2VkICovCi1zdGF0aWMgdm9pZCBHQVBJX1JlYWxpemVQYWxldHRlKF9USElTKTsKLXN0YXRpYyB2b2lkIEdBUElfUGFsZXR0ZUNoYW5nZWQoX1RISVMsIEhXTkQgd2luZG93KTsKLXN0YXRpYyB2b2lkIEdBUElfV2luUEFJTlQoX1RISVMsIEhEQyBoZGMpOyAKLQotLyogZXRjLiAqLwotc3RhdGljIHZvaWQgR0FQSV9VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotCi1zdGF0aWMgSE1PRFVMRSBnX2hHYXBpTGliID0gMDsKLSNkZWZpbmUgTElOSyh0eXBlLG5hbWUsaW1wb3J0KSBcCi0JaWYoIGdfaEdhcGlMaWIgKSBcCi0JCW5hbWUgPSAoUEZOIyN0eXBlKUdldFByb2NBZGRyZXNzKCBnX2hHYXBpTGliLCBfVChpbXBvcnQpICk7IAotCi1zdGF0aWMgY2hhciBnX2JSYXdCdWZmZXJBdmFpbGFibGUgPSAwOwotCi0vKiBHQVBJIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCi0KLS8qIGhpIHJlcyBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QgX1Jhd0ZyYW1lQnVmZmVySW5mbwotewotICAgV09SRCB3Rm9ybWF0OwotICAgV09SRCB3QlBQOwotICAgVk9JRCAqcEZyYW1lUG9pbnRlcjsKLSAgIGludCAgY3hTdHJpZGU7Ci0gICBpbnQgIGN5U3RyaWRlOwotICAgaW50ICBjeFBpeGVsczsKLSAgIGludCAgY3lQaXhlbHM7Ci19IFJhd0ZyYW1lQnVmZmVySW5mbzsgCi0KLXN0YXRpYyBzdHJ1Y3QgX1Jhd0ZyYW1lQnVmZmVySW5mbyBnX1Jhd0ZyYW1lQnVmZmVySW5mbyA9IHswfTsKLQotI2RlZmluZSBHRVRSQVdGUkFNRUJVRkZFUiAgIDB4MDAwMjAwMDEKLQotI2RlZmluZSBGT1JNQVRfNTY1IDEKLSNkZWZpbmUgRk9STUFUXzU1NSAyCi0jZGVmaW5lIEZPUk1BVF9PVEhFUiAzCi0KLS8qIERlbGwgQXhpbSB4MzAgaGFuZ3Mgd2hlbiB3ZSB1c2UgR0FQSSBmcm9tIGxhbmRzY2FwZSwKLSAgIHNvIGxldHMgYXZvaWQgdXNpbmcgR3hPcGVuRGlzcGxheSB0aGVyZSB2aWEgR0VUR1hJTkZPIHRyaWNrIAotICAgSXQgc2VlbXMgdGhhdCBHQVBJIHN1YnN5c3RlbSB1c2UgdGhlIHNhbWUgRXh0RXNjYXBlIGNvZGUuCi0qLwotI2RlZmluZSBHRVRHWElORk8gMHgwMDAyMDAwMAotCi10eXBlZGVmIHN0cnVjdCBHWERldmljZUluZm8KLXsKLWxvbmcgVmVyc2lvbjsgLy8wMCAoc2hvdWxkIGZpbGxlZCB3aXRoIDEwMCBiZWZvcmUgY2FsbGluZyBFeHRFc2NhcGUpCi12b2lkICogcHZGcmFtZUJ1ZmZlcjsgLy8wNAotdW5zaWduZWQgbG9uZyBjYlN0cmlkZTsgLy8wOAotdW5zaWduZWQgbG9uZyBjeFdpZHRoOyAvLzBjCi11bnNpZ25lZCBsb25nIGN5SGVpZ2h0OyAvLzEwCi11bnNpZ25lZCBsb25nIGNCUFA7IC8vMTQKLXVuc2lnbmVkIGxvbmcgZmZGb3JtYXQ7IC8vMTgKLWNoYXIgVW51c2VkWzB4ODQtNyo0XTsKLX0gR1hEZXZpY2VJbmZvOyAKLQotc3RhdGljIGludCBHQVBJX0F2YWlsYWJsZSh2b2lkKQotewotCS8vIHRyeSB0byB1c2UgVkdBIGRpc3BsYXksIGV2ZW4gb24gZW11bGF0b3IKLQlIREMgaGRjID0gR2V0REMoTlVMTCk7IAotCWludCByZXN1bHQgPSBFeHRFc2NhcGUoaGRjLCBHRVRSQVdGUkFNRUJVRkZFUiwgMCwgTlVMTCwgc2l6ZW9mKFJhd0ZyYW1lQnVmZmVySW5mbyksIChjaGFyICopJmdfUmF3RnJhbWVCdWZmZXJJbmZvKTsKLQlSZWxlYXNlREMoTlVMTCwgaGRjKTsKLQlnX2JSYXdCdWZmZXJBdmFpbGFibGUgPSByZXN1bHQgPiAwOwotCi0jaWYgV0lUSE9VVF9HQVBJCi0JcmV0dXJuIGdfYlJhd0J1ZmZlckF2YWlsYWJsZTsKLSNlbmRpZgotCi0jaWYgVVNFX0dBUElfRU1VCi0JZ19oR2FwaUxpYiA9IExvYWRMaWJyYXJ5KF9UKCJHQVBJX0VtdS5kbGwiKSk7Ci0JaWYoICFnX2hHYXBpTGliICkKLQl7Ci0JCVNETF9TZXRFcnJvcigiR2FwaSBFbXUgbm90IGZvdW5kISIpOwotCX0KLQlyZXR1cm4gZ19oR2FwaUxpYiAhPSAwOwotI2VuZGlmCi0KLQkvLyB0cnkgdG8gZmluZCBneC5kbGwKLQlnX2hHYXBpTGliID0gTG9hZExpYnJhcnkoX1QoIlxcV2luZG93c1xcZ3guZGxsIikpOwotCWlmKCAhZ19oR2FwaUxpYiApCi0JewotCQlnX2hHYXBpTGliID0gTG9hZExpYnJhcnkoX1QoImd4LmRsbCIpKTsKLQkJaWYoICFnX2hHYXBpTGliICkgcmV0dXJuIGdfYlJhd0J1ZmZlckF2YWlsYWJsZTsKLQl9Ci0KLQlyZXR1cm4oMSk7Ci19Ci0KLXN0YXRpYyBpbnQgY21wbW9kZXMoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQotewotICAgIFNETF9SZWN0ICphID0gKihTRExfUmVjdCAqKil2YTsKLSAgICBTRExfUmVjdCAqYiA9ICooU0RMX1JlY3QgKiopdmI7Ci0gICAgaWYgKCBhLT53ID09IGItPncgKQotICAgICAgICByZXR1cm4gYi0+aCAtIGEtPmg7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYi0+dyAtIGEtPnc7Ci19Ci0KLXN0YXRpYyBpbnQgR0FQSV9BZGRNb2RlKF9USElTLCBpbnQgYnBwLCBpbnQgdywgaW50IGgpCi17Ci0JU0RMX1JlY3QgKm1vZGU7Ci0JaW50IGksIGluZGV4OwotCWludCBuZXh0X21vZGU7Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbW9kZSAqLwotCWlmICggYnBwIDwgOCApIHsgIC8qIE5vdCBzdXBwb3J0ZWQgKi8KLQkJcmV0dXJuKDApOwotCX0KLQlpbmRleCA9ICgoYnBwKzcpLzgpLTE7Ci0JZm9yICggaT0wOyBpPGdhcGktPlNETF9udW1tb2Rlc1tpbmRleF07ICsraSApIHsKLQkJbW9kZSA9IGdhcGktPlNETF9tb2RlbGlzdFtpbmRleF1baV07Ci0JCWlmICggKG1vZGUtPncgPT0gdykgJiYgKG1vZGUtPmggPT0gaCkgKSB7Ci0JCQlyZXR1cm4oMCk7Ci0JCX0KLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIG5ldyB2aWRlbyBtb2RlIHJlY3RhbmdsZSAqLwotCW1vZGUgPSAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZiAqbW9kZSk7Ci0JaWYgKCBtb2RlID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oLTEpOwotCX0KLQltb2RlLT54ID0gMDsKLQltb2RlLT55ID0gMDsKLQltb2RlLT53ID0gdzsKLQltb2RlLT5oID0gaDsKLQotCS8qIEFsbG9jYXRlIHRoZSBuZXcgbGlzdCBvZiBtb2RlcywgYW5kIGZpbGwgaW4gdGhlIG5ldyBtb2RlICovCi0JbmV4dF9tb2RlID0gZ2FwaS0+U0RMX251bW1vZGVzW2luZGV4XTsKLQlnYXBpLT5TRExfbW9kZWxpc3RbaW5kZXhdID0gKFNETF9SZWN0ICoqKQotCSAgICAgICBTRExfcmVhbGxvYyhnYXBpLT5TRExfbW9kZWxpc3RbaW5kZXhdLCAoMStuZXh0X21vZGUrMSkqc2l6ZW9mKFNETF9SZWN0ICopKTsKLQlpZiAoIGdhcGktPlNETF9tb2RlbGlzdFtpbmRleF0gPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWdhcGktPlNETF9udW1tb2Rlc1tpbmRleF0gPSAwOwotCQlTRExfZnJlZShtb2RlKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JZ2FwaS0+U0RMX21vZGVsaXN0W2luZGV4XVtuZXh0X21vZGVdID0gbW9kZTsKLQlnYXBpLT5TRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZSsxXSA9IE5VTEw7Ci0JZ2FwaS0+U0RMX251bW1vZGVzW2luZGV4XSsrOwotCi0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgdm9pZCBHQVBJX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKLXsKLQlpZiggZ19oR2FwaUxpYiApCi0JewotCQlGcmVlTGlicmFyeShnX2hHYXBpTGliKTsKLQkJZ19oR2FwaUxpYiA9IDA7Ci0JfQotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpHQVBJX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7Ci0KLQlpZiggIWdfaEdhcGlMaWIgJiYgIWdfYlJhd0J1ZmZlckF2YWlsYWJsZSkKLQl7Ci0JCWlmKCAhR0FQSV9BdmFpbGFibGUoKSApCi0JCXsKLQkJCVNETF9TZXRFcnJvcigiR0FQSSBkbGwgaXMgbm90IGZvdW5kIGFuZCBWR0EgbW9kZSBpcyBub3QgYXZhaWxhYmxlISIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLQlpZiAoIGRldmljZSApIHsKLQkJU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOwotCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0JfQotCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIGRldmljZSApIHsKLQkJCVNETF9mcmVlKGRldmljZSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCWRldmljZS0+VmlkZW9Jbml0ID0gR0FQSV9WaWRlb0luaXQ7Ci0JZGV2aWNlLT5MaXN0TW9kZXMgPSBHQVBJX0xpc3RNb2RlczsKLQlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IEdBUElfU2V0VmlkZW9Nb2RlOwotCWRldmljZS0+VXBkYXRlTW91c2UgPSBXSU5fVXBkYXRlTW91c2U7IAotCWRldmljZS0+Q3JlYXRlWVVWT3ZlcmxheSA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRDb2xvcnMgPSBHQVBJX1NldENvbG9yczsKLQlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gR0FQSV9VcGRhdGVSZWN0czsKLQlkZXZpY2UtPlZpZGVvUXVpdCA9IEdBUElfVmlkZW9RdWl0OwotCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBHQVBJX0FsbG9jSFdTdXJmYWNlOwotCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOwotCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOwotCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IEdBUElfTG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IEdBUElfVW5sb2NrSFdTdXJmYWNlOwotCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IE5VTEw7Ci0JZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gR0FQSV9GcmVlSFdTdXJmYWNlOwotCWRldmljZS0+U2V0Q2FwdGlvbiA9IFdJTl9TZXRXTUNhcHRpb247Ci0JZGV2aWNlLT5TZXRJY29uID0gV0lOX1NldFdNSWNvbjsKLQlkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBXSU5fSWNvbmlmeVdpbmRvdzsKLQlkZXZpY2UtPkdyYWJJbnB1dCA9IFdJTl9HcmFiSW5wdXQ7Ci0JZGV2aWNlLT5HZXRXTUluZm8gPSBXSU5fR2V0V01JbmZvOwotCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gV0lOX0ZyZWVXTUN1cnNvcjsKLQlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gV0lOX0NyZWF0ZVdNQ3Vyc29yOyAKLQlkZXZpY2UtPlNob3dXTUN1cnNvciA9IFdJTl9TaG93V01DdXJzb3I7CQotCWRldmljZS0+V2FycFdNQ3Vyc29yID0gV0lOX1dhcnBXTUN1cnNvcjsgCi0gICAgZGV2aWNlLT5DaGVja01vdXNlTW9kZSA9IFdJTl9DaGVja01vdXNlTW9kZTsKLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IERJQl9Jbml0T1NLZXltYXA7Ci0JZGV2aWNlLT5QdW1wRXZlbnRzID0gRElCX1B1bXBFdmVudHM7Ci0KLQkvKiBTZXQgdXAgdGhlIHdpbmRvd3MgbWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMgKi8KLQlXSU5fUmVhbGl6ZVBhbGV0dGUgPSBHQVBJX1JlYWxpemVQYWxldHRlOwotCVdJTl9QYWxldHRlQ2hhbmdlZCA9IEdBUElfUGFsZXR0ZUNoYW5nZWQ7Ci0JV0lOX1dpblBBSU5UID0gR0FQSV9XaW5QQUlOVDsKLQlIYW5kbGVNZXNzYWdlID0gRElCX0hhbmRsZU1lc3NhZ2U7IAotCi0JZGV2aWNlLT5mcmVlID0gR0FQSV9EZWxldGVEZXZpY2U7Ci0KLQkvKiBMb2FkIGdhcGkgbGlicmFyeSAqLwotI2RlZmluZSBneCBkZXZpY2UtPmhpZGRlbi0+Z3hGdW5jCi0KLSAgICBMSU5LKCBHWE9wZW5EaXNwbGF5LCBneC5HWE9wZW5EaXNwbGF5LCAgICAgICAgICI/R1hPcGVuRGlzcGxheUBAWUFIUEFVSFdORF9fQEBLQFoiICkKLSAgICBMSU5LKCBHWENsb3NlRGlzcGxheSwgZ3guR1hDbG9zZURpc3BsYXksICAgICAgICAiP0dYQ2xvc2VEaXNwbGF5QEBZQUhYWiIgKQotICAgIExJTksoIEdYQmVnaW5EcmF3LCBneC5HWEJlZ2luRHJhdywgICAgICAgICAgICI/R1hCZWdpbkRyYXdAQFlBUEFYWFoiICkKLSAgICBMSU5LKCBHWEVuZERyYXcsIGd4LkdYRW5kRHJhdywgICAgICAgICAgICAgIj9HWEVuZERyYXdAQFlBSFhaIiApCi0gICAgTElOSyggR1hPcGVuSW5wdXQsIGd4LkdYT3BlbklucHV0LCAgICAgICAgICAgIj9HWE9wZW5JbnB1dEBAWUFIWFoiICkKLSAgICBMSU5LKCBHWENsb3NlSW5wdXQsIGd4LkdYQ2xvc2VJbnB1dCwgICAgICAgICAgIj9HWENsb3NlSW5wdXRAQFlBSFhaIiApCi0gICAgTElOSyggR1hHZXREaXNwbGF5UHJvcGVydGllcywgZ3guR1hHZXREaXNwbGF5UHJvcGVydGllcywiP0dYR2V0RGlzcGxheVByb3BlcnRpZXNAQFlBP0FVR1hEaXNwbGF5UHJvcGVydGllc0BAWFoiICkKLSAgICBMSU5LKCBHWEdldERlZmF1bHRLZXlzLCBneC5HWEdldERlZmF1bHRLZXlzLCAgICAgICI/R1hHZXREZWZhdWx0S2V5c0BAWUE/QVVHWEtleUxpc3RAQEhAWiIgKQotICAgIExJTksoIEdYU3VzcGVuZCwgZ3guR1hTdXNwZW5kLCAgICAgICAgICAgICAiP0dYU3VzcGVuZEBAWUFIWFoiICkKLSAgICBMSU5LKCBHWFJlc3VtZSwgZ3guR1hSZXN1bWUsICAgICAgICAgICAgICAiP0dYUmVzdW1lQEBZQUhYWiIgKQotICAgIExJTksoIEdYU2V0Vmlld3BvcnQsIGd4LkdYU2V0Vmlld3BvcnQsICAgICAgICAgIj9HWFNldFZpZXdwb3J0QEBZQUhLS0tLQFoiICkKLSAgICBMSU5LKCBHWElzRGlzcGxheURSQU1CdWZmZXIsIGd4LkdYSXNEaXNwbGF5RFJBTUJ1ZmZlciwgIj9HWElzRGlzcGxheURSQU1CdWZmZXJAQFlBSFhaIiApCi0KLQkvKiB3cm9uZyBnYXBpLmRsbCAqLwotCWlmKCAhZ3guR1hPcGVuRGlzcGxheSApCi0JewotCQlpZiggZ19oR2FwaUxpYiApIAotCQl7Ci0JCQlGcmVlTGlicmFyeShnX2hHYXBpTGliKTsKLQkJCWdfaEdhcGlMaWIgPSAwOwotCQl9Ci0JfQotCQotCWlmKCAhZ3guR1hPcGVuRGlzcGxheSAmJiAhZ19iUmF3QnVmZmVyQXZhaWxhYmxlKQotCXsKLQkJU0RMX1NldEVycm9yKCJFcnJvcjogZGFtYWdlZCBvciB1bmtub3duIGdhcGkuZGxsIVxuIik7Ci0JCUdBUElfRGVsZXRlRGV2aWNlKGRldmljZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLVZpZGVvQm9vdFN0cmFwIEdBUElfYm9vdHN0cmFwID0gewotCUdBUElWSURfRFJJVkVSX05BTUUsICJXaW5DRSBHQVBJIHZpZGVvIGRyaXZlciIsCi0JR0FQSV9BdmFpbGFibGUsIEdBUElfQ3JlYXRlRGV2aWNlCi19OwotCi1zdGF0aWMgdm9pZCBGaWxsU3RydWN0cyhfVEhJUywgQk9PTCB1c2VWZ2EpCi17Ci0jaWZkZWYgX0FSTV8KLQlXQ0hBUiBvZW1zdHJbMTAwXTsKLSNlbmRpZgotCS8qIGZpbGwgYSBkZXZpY2UgcHJvcGVydGllcyAqLwotCi0JaWYoICF1c2VWZ2EgKQotCXsKLQkJdGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMgPSB0aGlzLT5oaWRkZW4tPmd4RnVuYy5HWEdldERpc3BsYXlQcm9wZXJ0aWVzKCk7Ci0JCXRoaXMtPmhpZGRlbi0+bmVlZFVwZGF0ZSA9IDE7Ci0JCXRoaXMtPmhpZGRlbi0+aGlyZXNGaXggPSAwOwotCQl0aGlzLT5oaWRkZW4tPnVzZVZnYSA9IDA7Ci0JCXRoaXMtPmhpZGRlbi0+dXNlR1hPcGVuRGlzcGxheSA9IDE7Ci0KLSNpZmRlZiBfQVJNXwotCQkvKiBjaGVjayBzb21lIGRldmljZXMgYW5kIGV4dHJhY3QgYWRkaXRpb24gaW5mbyAqLwotCQlTeXN0ZW1QYXJhbWV0ZXJzSW5mbyggU1BJX0dFVE9FTUlORk8sIHNpemVvZiggb2Vtc3RyICksIG9lbXN0ciwgMCApOwotCi0JCS8vIGJ1Z2d5IGlQYXEzOHh4Ci0JCWlmICgob2Vtc3RyWzEyXSA9PSAnSCcpICYmIChvZW1zdHJbMTNdID09ICczJykgJiYgKG9lbXN0clsxNF0gPT0gJzgnKSAmJiAodGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuY2J4UGl0Y2ggPiAwKSkgCi0JCXsKLQkJCXRoaXMtPmhpZGRlbi0+dmlkZW9NZW0gPSAoUElYRUwqKTB4YWMwNzU1YTA7Ci0JCQl0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5jYnhQaXRjaCA9IC02NDA7Ci0JCQl0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5jYnlQaXRjaCA9IDI7Ci0JCQl0aGlzLT5oaWRkZW4tPm5lZWRVcGRhdGUgPSAwOwotCQl9Ci0jaWYgKEVNVUxBVEVfQVhJTV9YMzAgPT0gMCkKLQkJLy8gYnVnZ3kgRGVsbCBBeGltIFgzMAotCQlpZiggX3Rjc25jbXAob2Vtc3RyLCBMIkRlbGwgQXhpbSBYMzAiLCAxMykgPT0gMCApCi0jZW5kaWYKLQkJewotCQkJR1hEZXZpY2VJbmZvIGd4SW5mbyA9IHswfTsKLQkJCUhEQyBoZGMgPSBHZXREQyhOVUxMKTsKLQkJCWludCByZXN1bHQ7Ci0KLQkJCWd4SW5mby5WZXJzaW9uID0gMTAwOwotCQkJcmVzdWx0ID0gRXh0RXNjYXBlKGhkYywgR0VUR1hJTkZPLCAwLCBOVUxMLCBzaXplb2YoZ3hJbmZvKSwgKGNoYXIgKikmZ3hJbmZvKTsKLQkJCWlmKCByZXN1bHQgPiAwICkKLQkJCXsKLQkJCQl0aGlzLT5oaWRkZW4tPnVzZUdYT3BlbkRpc3BsYXkgPSAwOwotCQkJCXRoaXMtPmhpZGRlbi0+dmlkZW9NZW0gPSBneEluZm8ucHZGcmFtZUJ1ZmZlcjsKLQkJCQl0aGlzLT5oaWRkZW4tPm5lZWRVcGRhdGUgPSAwOwotCQkJCXRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmNieFBpdGNoID0gMjsKLQkJCQl0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5jYnlQaXRjaCA9IDQ4MDsKLQkJCQl0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5jeFdpZHRoID0gZ3hJbmZvLmN4V2lkdGg7Ci0JCQkJdGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuY3lIZWlnaHQgPSBneEluZm8uY3lIZWlnaHQ7Ci0JCQkJdGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgPSBneEluZm8uZmZGb3JtYXQ7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCX0gZWxzZQotCXsKLQkgICAgdGhpcy0+aGlkZGVuLT5uZWVkVXBkYXRlID0gMDsJCQotCQl0aGlzLT5oaWRkZW4tPmhpcmVzRml4ID0gMDsKLQkJdGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuY0JQUCA9IGdfUmF3RnJhbWVCdWZmZXJJbmZvLndCUFA7Ci0JCXRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmNieFBpdGNoID0gZ19SYXdGcmFtZUJ1ZmZlckluZm8uY3hTdHJpZGU7Ci0JCXRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmNieVBpdGNoID0gZ19SYXdGcmFtZUJ1ZmZlckluZm8uY3lTdHJpZGU7Ci0JCXRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGggPSBnX1Jhd0ZyYW1lQnVmZmVySW5mby5jeFBpeGVsczsKLQkJdGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuY3lIZWlnaHQgPSBnX1Jhd0ZyYW1lQnVmZmVySW5mby5jeVBpeGVsczsKLQkJdGhpcy0+aGlkZGVuLT52aWRlb01lbSA9IGdfUmF3RnJhbWVCdWZmZXJJbmZvLnBGcmFtZVBvaW50ZXI7Ci0JCXRoaXMtPmhpZGRlbi0+dXNlVmdhID0gMTsKLQotCQlzd2l0Y2goIGdfUmF3RnJhbWVCdWZmZXJJbmZvLndGb3JtYXQgKQotCQl7Ci0JCWNhc2UgRk9STUFUXzU2NToKLQkJCXRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmZmRm9ybWF0ID0ga2ZEaXJlY3Q1NjU7Ci0JCQlicmVhazsKLQkJY2FzZSBGT1JNQVRfNTU1OgotCQkJdGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgPSBrZkRpcmVjdDU1NTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogdW5rbm93biBwaXhlbCBmb3JtYXQsIHRyeSBkZWZpbmUgYnkgQlBQISAqLwotCQkJc3dpdGNoKCBnX1Jhd0ZyYW1lQnVmZmVySW5mby53QlBQICkKLQkJCXsKLQkJCWNhc2UgNDoKLQkJCWNhc2UgODoKLQkJCQl0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5mZkZvcm1hdCA9IGtmRGlyZWN0OwotCQkJY2FzZSAxNjoKLQkJCQl0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5mZkZvcm1hdCA9IGtmRGlyZWN0NTY1OwotCQkJZGVmYXVsdDoKLQkJCQl0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5mZkZvcm1hdCA9IGtmRGlyZWN0OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYoIHRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmNCUFAgIT0gMTYgKQotCXsKLQkJdGhpcy0+aGlkZGVuLT5nYXBpT3JpZW50YXRpb24gPSBTRExfT1JJRU5UQVRJT05fVVA7Ci0JfSBlbHNlCi0JaWYoICh0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5jYnhQaXRjaCA+IDApICYmICh0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5jYnlQaXRjaCA+IDAgKSkKLQl7Ci0JCXRoaXMtPmhpZGRlbi0+Z2FwaU9yaWVudGF0aW9uID0gU0RMX09SSUVOVEFUSU9OX1VQOwotCX0gZWxzZQotCWlmKCAodGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuY2J4UGl0Y2ggPiAwKSAmJiAodGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuY2J5UGl0Y2ggPCAwICkpCi0JewotCQl0aGlzLT5oaWRkZW4tPmdhcGlPcmllbnRhdGlvbiA9IFNETF9PUklFTlRBVElPTl9SSUdIVDsgLy8gaXBhcSAzNjYwCi0JfSBlbHNlCi0JaWYoICh0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5jYnhQaXRjaCA8IDApICYmICh0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5jYnlQaXRjaCA+IDAgKSkKLQl7Ci0JCXRoaXMtPmhpZGRlbi0+Z2FwaU9yaWVudGF0aW9uID0gU0RMX09SSUVOVEFUSU9OX0xFRlQ7IC8vIGlwYXEgMzgwMAotCX0KLX0KLQotc3RhdGljIHZvaWQgR0FQSV9DcmVhdGVQYWxldHRlKGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKLXsKLSAgLy8gU2V0dXAgYSBjdXN0b20gY29sb3IgcGFsZXR0ZQotICAgQllURSBidWZmZXJbIHNpemVvZihMT0dQQUxFVFRFKSArIDI1NSAqIHNpemVvZihQQUxFVFRFRU5UUlkpIF07Ci0gICBpbnQgaTsKLSAgIExPR1BBTEVUVEUqICAgcExvZ2ljYWwgPSAoTE9HUEFMRVRURSopYnVmZmVyOwotICAgUEFMRVRURUVOVFJZKiBlbnRyaWVzICA9IHBMb2dpY2FsLT5wYWxQYWxFbnRyeTsKLSAgIEhQQUxFVFRFIGhQYWxldHRlOwotICAgSERDIGhkYzsKLQotICAgZm9yIChpID0gMDsgaSA8IG5jb2xvcnM7ICsraSkKLSAgIHsKLSAgICAgIC8vIEZpbmQgaW50ZW5zaXR5IGJ5IHJlcGxpY2F0aW5nIHRoZSBiaXQgcGF0dGVybnMgb3ZlciBhIGJ5dGUKLSAgICAgIGVudHJpZXNbaV0ucGVSZWQgICA9IGNvbG9yc1tpXS5yOwotICAgICAgZW50cmllc1tpXS5wZUdyZWVuID0gY29sb3JzW2ldLmc7Ci0gICAgICBlbnRyaWVzW2ldLnBlQmx1ZSAgPSBjb2xvcnNbaV0uYjsKLSAgICAgIGVudHJpZXNbaV0ucGVGbGFncyA9IDA7Ci0gICB9Ci0KLSAgIC8vIENyZWF0ZSB0aGUgR0RJIHBhbGV0dGUgb2JqZWN0Ci0gICBwTG9naWNhbC0+cGFsVmVyc2lvbiAgICA9IDB4MDMwMDsKLSAgIHBMb2dpY2FsLT5wYWxOdW1FbnRyaWVzID0gbmNvbG9yczsKLQotICAgaFBhbGV0dGUgPSBDcmVhdGVQYWxldHRlKCBwTG9naWNhbCApOwotICAgQVNTRVJUKGhQYWxldHRlKTsKLQkKLQotICAgLy8gUmVhbGl6ZSB0aGUgcGFsZXR0ZQotICAgaGRjID0gR2V0REMoMCk7Ci0KLSAgIFNlbGVjdFBhbGV0dGUoIGhkYywgaFBhbGV0dGUsIEZBTFNFICk7Ci0gICBSZWFsaXplUGFsZXR0ZSggaGRjICk7Ci0KLSAgIFJlbGVhc2VEQyggMCwgaGRjICk7Ci0gICBEZWxldGVPYmplY3QoIGhQYWxldHRlICk7Ci19Ci0KLWludCBHQVBJX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotCWludCBpLGJwcDsKLQotCS8qIENyZWF0ZSB0aGUgd2luZG93ICovCi0JaWYgKCBESUJfQ3JlYXRlV2luZG93KHRoaXMpIDwgMCApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQlpZiggZ19oR2FwaUxpYiApCi0JewotCQlGaWxsU3RydWN0cyh0aGlzLCAwKTsKLQotCQkvLyBTREwgZG9lcyBub3Qgc3VwcG9ydHMgMi80YnBwIG1vZGUsIHNvIHVzZSAxNiBicHAKLQkJYnBwID0gZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFAgPCA4ID8gMTYgOiBnYXBpLT5neFByb3BlcnRpZXMuY0JQUDsKLQkJCi0JCS8qIHNldCB1cCBub3JtYWwgYW5kIGxhbmRzY2FwZSBtb2RlICovCi0JCUdBUElfQWRkTW9kZSh0aGlzLCBicHAsIGdhcGktPmd4UHJvcGVydGllcy5jeUhlaWdodCwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGgpOwkKLQkJR0FQSV9BZGRNb2RlKHRoaXMsIGJwcCwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGgsIGdhcGktPmd4UHJvcGVydGllcy5jeUhlaWdodCk7CQotCX0KLQotCS8qIGFkZCBoaS1yZXMgbW9kZSAqLwotCWlmKCBnX2JSYXdCdWZmZXJBdmFpbGFibGUgJiYgCi0JCSEoKGdhcGktPmd4UHJvcGVydGllcy5jeFdpZHRoID09ICh1bnNpZ25lZClnX1Jhd0ZyYW1lQnVmZmVySW5mby5jeFBpeGVscykgJiYgKGdhcGktPmd4UHJvcGVydGllcy5jeUhlaWdodCA9PSAodW5zaWduZWQpZ19SYXdGcmFtZUJ1ZmZlckluZm8uY3lQaXhlbHMpKSkKLQl7Ci0JCUZpbGxTdHJ1Y3RzKHRoaXMsIDEpOwotCi0JCS8vIFNETCBkb2VzIG5vdCBzdXBwb3J0cyAyLzRicHAgbW9kZSwgc28gdXNlIDE2IGJwcAotCQlicHAgPSBnYXBpLT5neFByb3BlcnRpZXMuY0JQUCA8IDggPyAxNiA6IGdhcGktPmd4UHJvcGVydGllcy5jQlBQOwotCi0JCS8qIHNldCB1cCBub3JtYWwgYW5kIGxhbmRzY2FwZSBtb2RlICovCi0JCUdBUElfQWRkTW9kZSh0aGlzLCBicHAsIGdhcGktPmd4UHJvcGVydGllcy5jeUhlaWdodCwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGgpOwkKLQkJR0FQSV9BZGRNb2RlKHRoaXMsIGJwcCwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGgsIGdhcGktPmd4UHJvcGVydGllcy5jeUhlaWdodCk7CQotCX0KLQotCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLwotCXRoaXMtPmluZm8uY3VycmVudF93ID0gZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGg7Ci0JdGhpcy0+aW5mby5jdXJyZW50X2ggPSBnYXBpLT5neFByb3BlcnRpZXMuY3lIZWlnaHQ7Ci0KLQkvKiBTb3J0IHRoZSBtb2RlIGxpc3RzICovCi0JZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKLQkJaWYgKCBnYXBpLT5TRExfbnVtbW9kZXNbaV0gPiAwICkgewotCQkJU0RMX3Fzb3J0KGdhcGktPlNETF9tb2RlbGlzdFtpXSwgZ2FwaS0+U0RMX251bW1vZGVzW2ldLCBzaXplb2YgKmdhcGktPlNETF9tb2RlbGlzdFtpXSwgY21wbW9kZXMpOwotCQl9Ci0JfQotCi0JdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gdGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuY0JQUCA8IDggPyAxNiA6ICh1bnNpZ25lZCBjaGFyKXRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmNCUFA7Ci0KLQkvLyBHZXQgY29sb3IgbWFzawotCWlmICh0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5mZkZvcm1hdCAmIGtmRGlyZWN0NTY1KSB7Ci0JCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IDE2OwotCQl2Zm9ybWF0LT5SbWFzayA9IDB4MDAwMGY4MDA7Ci0JCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDdlMDsKLQkJdmZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMDFmOwotCQl0aGlzLT5oaWRkZW4tPnZpZGVvTW9kZSA9IEdBUElfRElSRUNUXzU2NTsKLQl9Ci0JZWxzZQotCWlmICh0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5mZkZvcm1hdCAmIGtmRGlyZWN0NTU1KSB7Ci0JCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IDE2OwotCQl2Zm9ybWF0LT5SbWFzayA9IDB4MDAwMDdjMDA7Ci0JCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDNlMDsKLQkJdmZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMDFmOwotCQl0aGlzLT5oaWRkZW4tPnZpZGVvTW9kZSA9IEdBUElfRElSRUNUXzU1NTsKLQl9Ci0JZWxzZQotCWlmICgodGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgJiBrZkRpcmVjdCkgJiYgKHRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmNCUFAgPCA4KSkgewotCQkvLyBXZSdsbCBwZXJmb3JtIHRoZSBjb252ZXJzaW9uCi0JCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IDE2OwotCQl2Zm9ybWF0LT5SbWFzayA9IDB4MDAwMGY4MDA7IC8vIDE2IGJpdCA1NjUKLQkJdmZvcm1hdC0+R21hc2sgPSAweDAwMDAwN2UwOwotCQl2Zm9ybWF0LT5CbWFzayA9IDB4MDAwMDAwMWY7Ci0JCWlmICh0aGlzLT5oaWRkZW4tPmd4UHJvcGVydGllcy5mZkZvcm1hdCAmIGtmRGlyZWN0SW52ZXJ0ZWQpCi0JCQl0aGlzLT5oaWRkZW4tPmludmVydCA9ICgxIDw8IHRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmNCUFApIC0gMTsKLQkJdGhpcy0+aGlkZGVuLT5jb2xvcnNjYWxlID0gdGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuY0JQUCA8IDggPyA4IC0gdGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuY0JQUCA6IDA7Ci0JCXRoaXMtPmhpZGRlbi0+dmlkZW9Nb2RlID0gR0FQSV9NT05POwotCX0KLQllbHNlCi0JaWYgKHRoaXMtPmhpZGRlbi0+Z3hQcm9wZXJ0aWVzLmZmRm9ybWF0ICYga2ZQYWxldHRlKSB7Ci0JCXRoaXMtPmhpZGRlbi0+dmlkZW9Nb2RlID0gR0FQSV9QQUxFVFRFOwotCX0gCi0KLQkvKiBXZSdyZSBkb25lISAqLwotCXJldHVybigwKTsKLX0KLQotU0RMX1JlY3QgKipHQVBJX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQlyZXR1cm4odGhpcy0+aGlkZGVuLT5TRExfbW9kZWxpc3RbKChmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xXSk7Ci0vLyAgCSByZXR1cm4gKFNETF9SZWN0ICoqKSAtMTsKLX0KLQotU0RMX1N1cmZhY2UgKkdBUElfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLQlTRExfU3VyZmFjZSAqdmlkZW87IAotCVVpbnQzMiBSbWFzaywgR21hc2ssIEJtYXNrOyAKLQlEV09SRCBzdHlsZTsgCi0JU0RMX1JlY3QgYWxsU2NyZWVuOwotCi0JaWYoIGJwcCA8IDQgKQotCXsKLQkJU0RMX1NldEVycm9yKCIxIGJwcCBhbmQgMiBicHAgbW9kZXMgaXMgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogUmVjYWxjdWxhdGUgYml0bWFza3MgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKGJwcCA9PSBjdXJyZW50LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCkgewotCQl2aWRlbyA9IGN1cnJlbnQ7Ci0JfQotCWVsc2UgewotCQlzd2l0Y2goYnBwKSB7Ci0JCQljYXNlIDg6Ci0JCQkJUm1hc2sgPSAwOwotCQkJCUdtYXNrID0gMDsKLQkJCQlCbWFzayA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE1OgkJCQkKLQkJCWNhc2UgMTY6Ci0JCQkJLyogRGVmYXVsdCBpcyA1NjUgdW5sZXNzIHRoZSBkaXNwbGF5IGlzIHNwZWNpZmljYWxseSA1NTUgKi8KLQkJCQlpZiAodGhpcy0+aGlkZGVuLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgJiBrZkRpcmVjdDU1NSkgewotCQkJCQlSbWFzayA9IDB4MDAwMDdjMDA7Ci0JCQkJCUdtYXNrID0gMHgwMDAwMDNlMDsKLQkJCQkJQm1hc2sgPSAweDAwMDAwMDFmOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJUm1hc2sgPSAweDAwMDBmODAwOwotCQkJCQlHbWFzayA9IDB4MDAwMDA3ZTA7Ci0JCQkJCUJtYXNrID0gMHgwMDAwMDAxZjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJY2FzZSAzMjoKLQkJCQlSbWFzayA9IDB4MDBmZjAwMDA7Ci0JCQkJR21hc2sgPSAweDAwMDBmZjAwOwotCQkJCUJtYXNrID0gMHgwMDAwMDBmZjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBCaXRzIFBlciBQaXhlbCBmb3JtYXQgcmVxdWVzdGVkIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJdmlkZW8gPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLAotCQkJCQkwLCAwLCBicHAsIFJtYXNrLCBHbWFzaywgQm1hc2ssIDApOwotCQlpZiAoIHZpZGVvID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCX0KLQotCWdhcGktPnVzZXJPcmllbnRhdGlvbiA9IFNETF9PUklFTlRBVElPTl9VUDsKLQl2aWRlby0+ZmxhZ3MgPSBTRExfRlVMTFNDUkVFTjsJLyogQ2xlYXIgZmxhZ3MsIEdBUEkgc3VwcG9ydHMgZnVsbHNjcmVlbiBvbmx5ICovCi0KLQkvKiBHQVBJIG9yIFZHQT8gKi8KLQlpZiggZ19oR2FwaUxpYiApCi0JewotCQlGaWxsU3RydWN0cyh0aGlzLCAwKTsKLQkJaWYoICgoKHVuc2lnbmVkKXdpZHRoICE9IGdhcGktPmd4UHJvcGVydGllcy5jeFdpZHRoKSB8fCAoKHVuc2lnbmVkKWhlaWdodCAhPSBnYXBpLT5neFByb3BlcnRpZXMuY3lIZWlnaHQpKQotCQkJJiYgKCgodW5zaWduZWQpd2lkdGggIT0gZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN5SGVpZ2h0KSB8fCAoKHVuc2lnbmVkKWhlaWdodCAhPSBnYXBpLT5neFByb3BlcnRpZXMuY3hXaWR0aCkpKQotCQkJRmlsbFN0cnVjdHModGhpcywgMSk7IC8vIGdhcGkgaXMgZm91bmQgYnV0IHdlIHVzZSBWR0EgcmVzb2x1dGlvbgkJCQotCX0gZWxzZQotCQlGaWxsU3RydWN0cyh0aGlzLCAxKTsKLQotCWlmICggIXRoaXMtPmhpZGRlbi0+bmVlZFVwZGF0ZSAmJiAhdGhpcy0+aGlkZGVuLT52aWRlb01lbSkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBhZGRyZXNzIG9mIHZpZGVvIG1lbW9yeSwgbWF5IGJlIHVuc3VwcG9ydGVkIGRldmljZSBvciBidWciKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIGRldGVjdCB1c2VyIGxhbmRzY2FwZSBtb2RlICovCi0JaWYoICh3aWR0aCA+IGhlaWdodCkgJiYgKEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pIDwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTikpKSAKLQkJZ2FwaS0+dXNlck9yaWVudGF0aW9uID0gU0RMX09SSUVOVEFUSU9OX1JJR0hUOwotCi0JLyogc2hhbGwgd2UgYXBwbHkgaGlyZXMgZml4PyBmb3IgZXhhbXBsZSB3aGVuIHdlIGRvIG5vdCB1c2UgaGlyZXMgcmVzb3VyY2UgKi8KLQlnYXBpLT5oaXJlc0ZpeCA9IDA7Ci0JaWYoIGdhcGktPnVzZXJPcmllbnRhdGlvbiA9PSBTRExfT1JJRU5UQVRJT05fUklHSFQgKQotCXsKLQkJaWYoICh3aWR0aCA+IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pKSB8fCAoaGVpZ2h0ID4gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTikpKQotCQkJZ2FwaS0+aGlyZXNGaXggPSAxOwotCX0gZWxzZQotCQlpZiggKHdpZHRoID4gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTikpIHx8IChoZWlnaHQgPiBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKSkpCi0JCQlpZiggISgod2lkdGggPT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTikpICYmIChoZWlnaHQgPT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTikpKSkgLy8gdXNlciBwb3J0cmFpdCwgZGV2aWNlIGxhbmRzY2FwZQotCQkJCWdhcGktPmhpcmVzRml4ID0gMTsKLQotCXN3aXRjaCggZ2FwaS0+dXNlck9yaWVudGF0aW9uICkKLQl7Ci0JY2FzZSBTRExfT1JJRU5UQVRJT05fVVA6Ci0JCWdhcGktPnN0YXJ0T2Zmc2V0ID0gMDsKLQkJZ2FwaS0+ZHN0TGluZVN0ZXAgPSBnYXBpLT5neFByb3BlcnRpZXMuY2J5UGl0Y2g7Ci0JCWdhcGktPmRzdFBpeGVsU3RlcCA9IGdhcGktPmd4UHJvcGVydGllcy5jYnhQaXRjaDsKLQkJYnJlYWs7Ci0JY2FzZSBTRExfT1JJRU5UQVRJT05fUklHSFQ6Ci0JCXN3aXRjaCggZ2FwaS0+Z2FwaU9yaWVudGF0aW9uICkKLQkJewotCQljYXNlIFNETF9PUklFTlRBVElPTl9VUDoKLQkJY2FzZSBTRExfT1JJRU5UQVRJT05fUklHSFQ6Ci0JCWNhc2UgU0RMX09SSUVOVEFUSU9OX0xFRlQ6Ci0JCQlpZiggKHRoaXMtPmhpZGRlbi0+dmlkZW9Nb2RlID09IEdBUElfTU9OTykgKQotCQkJCWdhcGktPnN0YXJ0T2Zmc2V0ID0gLWdhcGktPmd4UHJvcGVydGllcy5jYnhQaXRjaCArIDE7IC8vIG1vbm9jaHJvbWUgbW9kZQotCQkJZWxzZQotCQkJCWdhcGktPnN0YXJ0T2Zmc2V0ID0gZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieVBpdGNoICogKGdhcGktPmd4UHJvcGVydGllcy5jeUhlaWdodCAtIDEpOwotCQkJCQotCQkJZ2FwaS0+ZHN0TGluZVN0ZXAgPSBnYXBpLT5neFByb3BlcnRpZXMuY2J4UGl0Y2g7Ci0JCQlnYXBpLT5kc3RQaXhlbFN0ZXAgPSAtZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieVBpdGNoOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl2aWRlby0+dyA9IHRoaXMtPmhpZGRlbi0+dyA9IHdpZHRoOwotCXZpZGVvLT5oID0gdGhpcy0+aGlkZGVuLT5oID0gaGVpZ2h0OwotCXZpZGVvLT5waXRjaCA9IFNETF9DYWxjdWxhdGVQaXRjaCh2aWRlbyk7IAotCi0JLyogU21hbGwgZml4IGZvciBXaW5DRS9XaW4zMiAtIHdoZW4gYWN0aXZhdGluZyB3aW5kb3cKLQkgICBTRExfVmlkZW9TdXJmYWNlIGlzIGVxdWFsIHRvIHplcm8sIHNvIGFjdGl2YXRpbmcgY29kZQotCSAgIGlzIG5vdCBjYWxsZWQgcHJvcGVybHkgZm9yIGZ1bGxzY3JlZW4gd2luZG93cyBiZWNhdXNlCi0JICAgbWFjcm9zIFdJTkRJQl9GVUxMU0NSRUVOIHVzZXMgU0RMX1ZpZGVvU3VyZmFjZQotCSovCi0JU0RMX1ZpZGVvU3VyZmFjZSA9IHZpZGVvOwotCi0JLyogR0FQSSBpcyBhbHdheXMgZnVsbHNjcmVlbiwgdGl0bGUgYmFyIGlzIHVzZWxlc3MgKi8KLQlzdHlsZSA9IDA7Ci0KLQlpZiAoIVNETF93aW5kb3dpZCkKLQkJU2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUsIHN0eWxlKTsKLQotCS8qIEFsbG9jYXRlIGJpdG1hcCAqLwotCWlmKGdhcGlCdWZmZXIpIAotCXsKLQkJU0RMX2ZyZWUoZ2FwaUJ1ZmZlcik7Ci0JCWdhcGlCdWZmZXIgPSBOVUxMOwotCX0KLQlnYXBpQnVmZmVyID0gU0RMX21hbGxvYyh2aWRlby0+aCAqIHZpZGVvLT5waXRjaCk7Ci0JdmlkZW8tPnBpeGVscyA9IGdhcGlCdWZmZXI7IAotCi0JaWYgKCAhIHRoaXMtPmhpZGRlbi0+YnVmZmVyICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGFsbG9jYXRlIGJ1ZmZlciBmb3IgcmVxdWVzdGVkIG1vZGUiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCVNETF9tZW1zZXQoZ2FwaUJ1ZmZlciwgMjU1LCB2aWRlby0+aCAqIHZpZGVvLT5waXRjaCk7Ci0JTW92ZVdpbmRvdyhTRExfV2luZG93LCAwLCAwLCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKSwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTiksIEZBTFNFKTsKLQlTaG93V2luZG93KFNETF9XaW5kb3csIFNXX1NIT1cpOwotCVNldEZvcmVncm91bmRXaW5kb3coU0RMX1dpbmRvdyk7Ci0KLQkvKiBKQyAxNCBNYXIgMjAwNgotCQlGbHVzaCB0aGUgbWVzc2FnZSBsb29wIG9yIHRoaXMgY2FuIGNhdXNlIGJpZyBwcm9ibGVtcyBsYXRlcgotCQlFc3BlY2lhbGx5IGlmIHRoZSB1c2VyIGRlY2lkZXMgdG8gdXNlIGRpYWxvZyBib3hlcyBvciBhc3NlcnQoKSEKLQkqLwotCVdJTl9GbHVzaE1lc3NhZ2VRdWV1ZSgpOwotCi0JLyogT3BlbiBHQVBJIGRpc3BsYXkgKi8KLQlpZiggIWdhcGktPnVzZVZnYSAmJiB0aGlzLT5oaWRkZW4tPnVzZUdYT3BlbkRpc3BsYXkgKQotCQlpZiggIWdhcGktPmd4RnVuYy5HWE9wZW5EaXNwbGF5KFNETF9XaW5kb3csIEdYX0ZVTExTQ1JFRU4pICkKLQkJewotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBpbml0aWFsaXplIEdBUEkiKTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCi0jaWYgUkVQT1JUX1ZJREVPX0lORk8KLQlwcmludGYoIlZpZGVvIHByb3BlcnRpZXM6XG4iKTsKLQlwcmludGYoImRpc3BsYXkgYnBwOiAlZFxuIiwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFApOwotCXByaW50ZigiZGlzcGxheSB3aWR0aDogJWRcbiIsIGdhcGktPmd4UHJvcGVydGllcy5jeFdpZHRoKTsKLQlwcmludGYoImRpc3BsYXkgaGVpZ2h0OiAlZFxuIiwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN5SGVpZ2h0KTsKLQlwcmludGYoInggcGl0Y2g6ICVkXG4iLCBnYXBpLT5neFByb3BlcnRpZXMuY2J4UGl0Y2gpOwotCXByaW50ZigieSBwaXRjaDogJWRcbiIsIGdhcGktPmd4UHJvcGVydGllcy5jYnlQaXRjaCk7Ci0JcHJpbnRmKCJnYXBpIGZsYWdzOiAweCV4XG4iLCBnYXBpLT5neFByb3BlcnRpZXMuZmZGb3JtYXQpOwotCi0JaWYoICFnYXBpLT51c2VWZ2EgJiYgdGhpcy0+aGlkZGVuLT51c2VHWE9wZW5EaXNwbGF5ICYmIGdhcGktPm5lZWRVcGRhdGUpCi0JewotCQlnYXBpLT52aWRlb01lbSA9IGdhcGktPmd4RnVuYy5HWEJlZ2luRHJhdygpOyAKLQkJZ2FwaS0+Z3hGdW5jLkdYRW5kRHJhdygpOwotCX0KLQotCXByaW50ZigidmlkZW8gbWVtb3J5OiAweCV4XG4iLCBnYXBpLT52aWRlb01lbSk7Ci0JcHJpbnRmKCJuZWVkIHVwZGF0ZTogJWRcbiIsIGdhcGktPm5lZWRVcGRhdGUpOwotCXByaW50ZigiaGktcmVzIGZpeDogJWRcbiIsIGdhcGktPmhpcmVzRml4KTsKLQlwcmludGYoIlZHQSBpcyBhdmFpbGFibGUgb24gdGhlIGRldmljZTogJWRcbiIsIGdfYlJhd0J1ZmZlckF2YWlsYWJsZSk7Ci0JcHJpbnRmKCJ1c2UgcmF3IGZyYW1lYnVmZmVyOiAlZFxuIiwgZ2FwaS0+dXNlVmdhKTsKLQlwcmludGYoInZpZGVvIHN1cmZhY2UgYnBwOiAlZFxuIiwgdmlkZW8tPmZvcm1hdC0+Qml0c1BlclBpeGVsKTsKLQlwcmludGYoInZpZGVvIHN1cmZhY2Ugd2lkdGg6ICVkXG4iLCB2aWRlby0+dyk7Ci0JcHJpbnRmKCJ2aWRlbyBzdXJmYWNlIGhlaWdodDogJWRcbiIsIHZpZGVvLT5oKTsKLSNlbmRpZgotCi0KLQkvKiBCbGFuayBzY3JlZW4gKi8KLQlhbGxTY3JlZW4ueCA9IGFsbFNjcmVlbi55ID0gMDsKLQlhbGxTY3JlZW4udyA9IHZpZGVvLT53IC0gMTsKLQlhbGxTY3JlZW4uaCA9IHZpZGVvLT5oIC0gMTsKLQlHQVBJX1VwZGF0ZVJlY3RzKHRoaXMsIDEsICZhbGxTY3JlZW4pOwotCi0JLyogV2UncmUgZG9uZSAqLwotCXJldHVybih2aWRlbyk7Ci19Ci0KLS8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCi1zdGF0aWMgaW50IEdBUElfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigtMSk7Ci19Ci1zdGF0aWMgdm9pZCBHQVBJX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotLyogV2UgbmVlZCB0byB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlIG9uIHBhZ2UgZmxpcHBlZCBkaXNwbGF5cyAqLwotc3RhdGljIGludCBHQVBJX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgR0FQSV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIGludCB1cGRhdGVMaW5lOHRvOChfVEhJUywgdW5zaWduZWQgY2hhciAqc3JjUG9pbnRlciwgdW5zaWduZWQgY2hhciAqZGVzdFBvaW50ZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxpbmVzKQotewotCWlmKCBnYXBpLT5kc3RQaXhlbFN0ZXAgPT0gMSkgLyogb3B0aW1pemVkIGJsaXR0aW5nIG9uIG1vc3QgZGV2aWNlcyAqLwotCXsKLQkJU0RMX21lbWNweShkZXN0UG9pbnRlciwgc3JjUG9pbnRlciwgd2lkdGgpOwotCQlyZXR1cm4gMTsKLQl9IGVsc2UKLQl7Ci0JCS8vIFRPRE86IHJlYWQgNCBwaXhlbHMsIHdyaXRlIERXT1JECi0JCWludCBzdGVwID0gZ2FwaS0+ZHN0UGl4ZWxTdGVwOwotCQl3aGlsZSh3aWR0aC0tKQotCQl7Ci0JCQkqZGVzdFBvaW50ZXIgPSAqc3JjUG9pbnRlcisrOwotCQkJZGVzdFBvaW50ZXIgKz0gc3RlcDsKLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLQotLyogVmlkZW8gbWVtb3J5IGlzIHZlcnkgc2xvdyBzbyBsZXRzIG9wdGltaXplIGFzIG11Y2ggYXMgcG9zc2libGUgKi8KLXN0YXRpYyBpbnQgdXBkYXRlTGluZTE2dG8xNihfVEhJUywgUElYRUwgKnNyY1BvaW50ZXIsIFBJWEVMICpkZXN0UG9pbnRlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbGluZXMpCi17Ci0JUElYRUwgKmxpbmUxLCAqbGluZTI7Ci0JaW50IHN0ZXAgPSBnYXBpLT5kc3RQaXhlbFN0ZXAgLyAyOwotCi0JaWYoIHN0ZXAgPT0gMSApIC8qIG9wdGltaXplZCBibGl0dGluZyBvbiBtb3N0IGRldmljZXMgKi8KLQl7Ci0JCVNETF9tZW1jcHkoZGVzdFBvaW50ZXIsIHNyY1BvaW50ZXIsIHdpZHRoICogc2l6ZW9mKFBJWEVMKSk7Ci0JCXJldHVybiAxOwotCX0KLQllbHNlCi0JewotCQlpZiggKGdhcGktPmdhcGlPcmllbnRhdGlvbiAhPSBTRExfT1JJRU5UQVRJT05fVVApICYmCi0JCQkoZ2FwaS0+dXNlck9yaWVudGF0aW9uID09IFNETF9PUklFTlRBVElPTl9VUCApKSAvLyBpUGFxIDM2NjAvMzgwMCBhbmQgdXNlciBvcmllbnRhdGlvbiB1cAotCQl7CQotCQkJLy8gdG8gcHJldmVudCBkYXRhIG1pc2FsaWdubWVudCBjb3B5IG9ubHkgb25lIGxpbmUKLQkJCWlmKCAoKCgodW5zaWduZWQpZGVzdFBvaW50ZXIgJiAzKSAhPSAwKSAmJiAoZ2FwaS0+Z2FwaU9yaWVudGF0aW9uID09IFNETF9PUklFTlRBVElPTl9MRUZUKSkgCi0JCQkJfHwgKCgoKHVuc2lnbmVkKWRlc3RQb2ludGVyICYgMykgPT0gMCkgJiYgKGdhcGktPmdhcGlPcmllbnRhdGlvbiAhPSBTRExfT1JJRU5UQVRJT05fTEVGVCkpCi0JCQkJfHwgKGxpbmVzID09IDEpICkgCi0JCQl7Ci0JCQkJd2hpbGUod2lkdGgtLSkKLQkJCQl7Ci0JCQkJCSpkZXN0UG9pbnRlciA9ICpzcmNQb2ludGVyKys7Ci0JCQkJCWRlc3RQb2ludGVyICs9IHN0ZXA7Ci0JCQkJfQotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQkvKiByZWFkIHR3byBsaW5lcyBhdCB0aGUgc2FtZSB0aW1lLCB3cml0ZSBEV09SRCAqLwotCQkJbGluZTEgPSBzcmNQb2ludGVyOwotCQkJbGluZTIgPSBzcmNQb2ludGVyICsgU0RMX1ZpZGVvU3VyZmFjZS0+cGl0Y2ggLyAyOwotCi0JCQlpZiggZ2FwaS0+Z2FwaU9yaWVudGF0aW9uID09IFNETF9PUklFTlRBVElPTl9MRUZUICkKLQkJCQl3aGlsZSh3aWR0aC0tKSAvLyBpUGFxIDM4MDAKLQkJCQl7Ci0JCQkJCSooRFdPUkQqKWRlc3RQb2ludGVyID0oKmxpbmUyKysgPDwgMTYpIHwgKmxpbmUxKys7Ci0JCQkJCWRlc3RQb2ludGVyICs9IHN0ZXA7Ci0JCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWRlc3RQb2ludGVyICs9IGdhcGktPmd4UHJvcGVydGllcy5jYnlQaXRjaCAvIDI7Ci0KLQkJCQl3aGlsZSh3aWR0aC0tKSAvLyBpUGFxIDM2NjAKLQkJCQl7Ci0JCQkJCSooRFdPUkQqKWRlc3RQb2ludGVyID0oKmxpbmUxKysgPDwgMTYpIHwgKmxpbmUyKys7Ci0JCQkJCWRlc3RQb2ludGVyICs9IHN0ZXA7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIDI7Ci0JCX0gZWxzZQotCQl7Ci0JCQkvLyBpUGFxIDM4MDAgYW5kIHVzZXIgb3JpZW50YXRpb24gbGFuZHNjYXBlCi0JCQlpZiggZ2FwaS0+Z2FwaU9yaWVudGF0aW9uID09IFNETF9PUklFTlRBVElPTl9MRUZUICkKLQkJCXsKLQkJCQlpbnQgdzE7Ci0KLQkJCQkvLyB0byBwcmV2ZW50IGRhdGEgbWlzYWxpZ25tZW50IGNvcHkgb25seSBvbmUgcGl4ZWwKLQkJCQlpZiggKCgodW5zaWduZWQpZGVzdFBvaW50ZXIgJiAzKSA9PSAwKSAmJiAod2lkdGggPiAwKSkgCi0JCQkJewotCQkJCQkqZGVzdFBvaW50ZXItLSA9ICpzcmNQb2ludGVyKys7Ci0JCQkJCXdpZHRoLS07Ci0JCQkJfQotCi0JCQkJZGVzdFBvaW50ZXItLTsKLQotCQkJCXcxID0gd2lkdGggLyAyOwotCi0JCQkJd2hpbGUodzEtLSkKLQkJCQl7Ci0JCQkJCURXT1JEIHAgPSAqKERXT1JEKilzcmNQb2ludGVyOwotCQkJCQkqKChEV09SRCopZGVzdFBvaW50ZXIpID0gKHAgPDwgMTYpIHwgKHAgPj4gMTYpOwotCQkJCQlkZXN0UG9pbnRlciAtPSAyOwotCQkJCQlzcmNQb2ludGVyICs9IDI7Ci0JCQkJfQotCi0JCQkJaWYoIHdpZHRoICYgMSApIC8vIGNvcHkgdGhlIGxhc3QgcGl4ZWwKLQkJCQl7Ci0JCQkJCWRlc3RQb2ludGVyKys7Ci0JCQkJCSpkZXN0UG9pbnRlciA9ICpzcmNQb2ludGVyOwotCQkJCX0KLQotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQkvLyBtb2Rlcm4gaVBhcXMgYW5kIHVzZXIgb3JpZW50YXRpb24gbGFuZHNjYXBlCi0JCQkvLyByZWFkIHR3byBwaXhlbHMsIHdyaXRlIERXT1JECi0KLQkJCWxpbmUxID0gc3JjUG9pbnRlcjsKLQkJCWxpbmUyID0gc3JjUG9pbnRlciArIFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoIC8gMjsKLQotCQkJaWYoICgoKHVuc2lnbmVkKWRlc3RQb2ludGVyICYgMykgIT0gMCkgfHwgKGxpbmVzID09IDEpICkgCi0JCQl7Ci0JCQkJd2hpbGUod2lkdGgtLSkKLQkJCQl7Ci0JCQkJCSpkZXN0UG9pbnRlciA9ICpzcmNQb2ludGVyKys7Ci0JCQkJCWRlc3RQb2ludGVyICs9IHN0ZXA7Ci0JCQkJfQotCQkJCXJldHVybiAxOwotCQkJfQotCQkJCi0JCQl3aGlsZSh3aWR0aC0tKQotCQkJewotCQkJCSooRFdPUkQqKWRlc3RQb2ludGVyID0oKmxpbmUyKysgPDwgMTYpIHwgKmxpbmUxKys7Ci0JCQkJZGVzdFBvaW50ZXIgLT0gZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieVBpdGNoIC8gMjsKLQkJCX0KLQkJCXJldHVybiAyOwotCQl9Ci0JfQotfQotCi0vLyBDb2xvciBjb21wb25lbnQgbWFza3MgZm9yIDU2NQotI2RlZmluZSBSRURNQVNLICgzMTw8MTEpCi0jZGVmaW5lIEdSRUVOTUFTSyAoNjM8PDUpCi0jZGVmaW5lIEJMVUVNQVNLICgzMSkKLQotCi1zdGF0aWMgaW50IHVwZGF0ZUxpbmUxNnRvNChfVEhJUywgUElYRUwgKnNyY1BvaW50ZXIsIHVuc2lnbmVkIGNoYXIgKmRlc3RQb2ludGVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBsaW5lcywgaW50IHlOaWJibGUsIGludCB4TmliYmxlKQotewotCVBJWEVMICpsaW5lMSwgKmxpbmUyOwotCWludCBzdGVwID0gZ2FwaS0+ZHN0UGl4ZWxTdGVwOwotCi0JaWYoIGdhcGktPnVzZXJPcmllbnRhdGlvbiA9PSBTRExfT1JJRU5UQVRJT05fVVAgKQotCXsKLQkJaWYoIHlOaWJibGUgKSAvLyBjb3B5IGJvdHRvbSBoYWxmIG9mIGEgbGluZQotCQl7Ci0JCQl3aGlsZSh3aWR0aC0tKQotCQkJewotCQkJCVBJWEVMIGMxID0gKnNyY1BvaW50ZXIrKzsKLQkJCQljMSA9ICgoYzEgJiBSRURNQVNLKSA+PiAxMSkgKyAoKGMxICYgR1JFRU5NQVNLKSA+PiA1KSArIChjMSAmIEJMVUVNQVNLKTsJCQkKLQkJCQkqZGVzdFBvaW50ZXIgPSAoKmRlc3RQb2ludGVyICYgMHgwRikgfCAoKH4oYzEgPj4gMykgPDwgNCkpOwotCQkJCWRlc3RQb2ludGVyICs9IHN0ZXA7Ci0JCQl9Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCS8vIGVpdGhlciAxIHBpeGVsIHBpY3R1cmUgb3IgdGFpbCwgYW55d2F5IHRoaXMgaXMgdGhlIGxhc3QgbGluZQotCQlpZiggbGluZXMgPT0gMSApCi0JCXsKLQkJCXdoaWxlKHdpZHRoLS0pCi0JCQl7Ci0JCQkJUElYRUwgYzEgPSAqc3JjUG9pbnRlcisrOwotCQkJCWMxID0gKChjMSAmIFJFRE1BU0spID4+IDExKSArICgoYzEgJiBHUkVFTk1BU0spID4+IDUpICsgKGMxICYgQkxVRU1BU0spOwkJCQotCQkJCSpkZXN0UG9pbnRlciA9ICgqZGVzdFBvaW50ZXIgJiAweEYwKSB8ICgofihjMSA+PiAzKSAmIDB4RikpOwotCQkJCWRlc3RQb2ludGVyICs9IHN0ZXA7Ci0JCQl9Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCWxpbmUxID0gc3JjUG9pbnRlcjsKLQkJbGluZTIgPSBzcmNQb2ludGVyICsgU0RMX1ZpZGVvU3VyZmFjZS0+cGl0Y2ggLyAyOwotCi0JCXdoaWxlKHdpZHRoLS0pCi0JCXsKLQkJCVBJWEVMIGMxID0gKmxpbmUxKys7Ci0JCQlQSVhFTCBjMiA9ICpsaW5lMisrOwotCQkJYzEgPSAoKGMxICYgUkVETUFTSykgPj4gMTEpICsgKChjMSAmIEdSRUVOTUFTSykgPj4gNSkgKyAoYzEgJiBCTFVFTUFTSyk7Ci0JCQljMiA9ICgoYzIgJiBSRURNQVNLKSA+PiAxMSkgKyAoKGMyICYgR1JFRU5NQVNLKSA+PiA1KSArIChjMiAmIEJMVUVNQVNLKTsKLQkJCSpkZXN0UG9pbnRlciA9IH4oKGMxID4+IDMpICsgKChjMiA+PiAzKSA8PCA0KSk7Ci0JCQlkZXN0UG9pbnRlciArPSBzdGVwOwotCQl9Ci0JCXJldHVybiAyOwotCX0gZWxzZQotCXsKLQkJaW50IHcxOwotCQl3MSA9IHdpZHRoIC8gMjsKLQotCQlpZiggeE5pYmJsZSApCi0JCXsKLQkJCS8vIGNvcHkgb25lIHBpeGVsCi0JCQlQSVhFTCBjMSA9ICpzcmNQb2ludGVyKys7Ci0JCQljMSA9ICgoYzEgJiBSRURNQVNLKSA+PiAxMSkgKyAoKGMxICYgR1JFRU5NQVNLKSA+PiA1KSArIChjMSAmIEJMVUVNQVNLKTsJCQkKLQkJCSpkZXN0UG9pbnRlciA9ICgqZGVzdFBvaW50ZXIgJiAweEYwKSB8ICgofihjMSA+PiAzKSAmIDB4RikpOwotCQkJZGVzdFBvaW50ZXIrKzsKLQkJfQotCi0JCXdoaWxlKHcxLS0pCi0JCXsKLQkJCVBJWEVMIGMxID0gKnNyY1BvaW50ZXI7Ci0JCQlQSVhFTCBjMiA9ICooc3JjUG9pbnRlciArIDEpOwotCQkJYzEgPSAoKGMxICYgUkVETUFTSykgPj4gMTEpICsgKChjMSAmIEdSRUVOTUFTSykgPj4gNSkgKyAoYzEgJiBCTFVFTUFTSyk7Ci0JCQljMiA9ICgoYzIgJiBSRURNQVNLKSA+PiAxMSkgKyAoKGMyICYgR1JFRU5NQVNLKSA+PiA1KSArIChjMiAmIEJMVUVNQVNLKTsKLQkJCSpkZXN0UG9pbnRlcisrID0gfigoYzIgPj4gMykgKyAoKGMxID4+IDMpIDw8IDQpKTsKLQkJCXNyY1BvaW50ZXIgKz0gMjsKLQkJfQotCi0JCS8vIGNvcHkgdGFpbAotCQlpZiggKHdpZHRoICYgMSkgJiYgIXhOaWJibGUgKQotCQl7Ci0JCQlQSVhFTCBjMSA9ICpzcmNQb2ludGVyOwotCQkJYzEgPSAoKGMxICYgUkVETUFTSykgPj4gMTEpICsgKChjMSAmIEdSRUVOTUFTSykgPj4gNSkgKyAoYzEgJiBCTFVFTUFTSyk7CQkJCi0JCQkqZGVzdFBvaW50ZXIgPSAoKmRlc3RQb2ludGVyICYgMHgwRikgfCAoKH4oYzEgPj4gMykgPDwgNCkpOwotCQl9Ci0KLQkJcmV0dXJuIDE7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBHQVBJX1VwZGF0ZVJlY3RzTW9ubyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JaW50IGksIGhlaWdodDsKLQlpbnQgbGluZXNQcm9jZXNzZWQ7Ci0JaW50IHhOaWJibGUsIHlOaWJibGU7Ci0KLQlmb3IgKGk9MDsgaTxudW1yZWN0czsgaSsrKQotCXsKLQkJdW5zaWduZWQgY2hhciAqZGVzdFBvaW50ZXI7Ci0JCXVuc2lnbmVkIGNoYXIgKnNyY1BvaW50ZXI7Ci0KLQkJaWYoIGdhcGktPnVzZXJPcmllbnRhdGlvbiA9PSBTRExfT1JJRU5UQVRJT05fVVAgKQotCQkJZGVzdFBvaW50ZXIgPSAodW5zaWduZWQgY2hhciopIGdhcGktPnZpZGVvTWVtICsgZ2FwaS0+c3RhcnRPZmZzZXQgLSByZWN0c1tpXS55ICogZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFAgLyA4ICsgcmVjdHNbaV0ueCAqIGdhcGktPmRzdFBpeGVsU3RlcDsKLQkJZWxzZQotCQkJZGVzdFBvaW50ZXIgPSAodW5zaWduZWQgY2hhciopIGdhcGktPnZpZGVvTWVtICsgZ2FwaS0+c3RhcnRPZmZzZXQgKyByZWN0c1tpXS54ICogZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFAgLyA4ICsgcmVjdHNbaV0ueSAqIGdhcGktPmRzdExpbmVTdGVwOwotCi0JCXNyY1BvaW50ZXIgPSAoKHVuc2lnbmVkIGNoYXIqKSBTRExfVmlkZW9TdXJmYWNlLT5waXhlbHMpICsgcmVjdHNbaV0ueSAqIFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoICsgcmVjdHNbaV0ueCAqIDI7Ci0JCXlOaWJibGUgPSByZWN0c1tpXS55ICYgMTsgLy8gVE9ETzogb25seSBmb3IgNCBicHAKLQkJeE5pYmJsZSA9IHJlY3RzW2ldLnggJiAxOwotCQloZWlnaHQgPSByZWN0c1tpXS5oOwotCQl3aGlsZSAoaGVpZ2h0ID4gMCkKLQkJewotCQkJc3dpdGNoKGdhcGktPmd4UHJvcGVydGllcy5jQlBQKQotCQkJewotCQkJY2FzZSAyOiAvLyBUT0RPCi0JCQljYXNlIDQ6Ci0JCQkJCWxpbmVzUHJvY2Vzc2VkID0gdXBkYXRlTGluZTE2dG80KHRoaXMsIChQSVhFTCopIHNyY1BvaW50ZXIsIGRlc3RQb2ludGVyLCByZWN0c1tpXS53LCByZWN0c1tpXS5oLCBoZWlnaHQsIHlOaWJibGUsIHhOaWJibGUpOwotCQkJCQl5TmliYmxlID0gMDsKLQkJCX0KLQkJCWhlaWdodCAtPSBsaW5lc1Byb2Nlc3NlZDsKLQkJCWlmKCBnYXBpLT51c2VyT3JpZW50YXRpb24gPT0gU0RMX09SSUVOVEFUSU9OX1VQICkKLQkJCQlkZXN0UG9pbnRlci0tOyAvLyBhbHdheXMgZmlsbCAxIGJ5dGUKLQkJCWVsc2UgZGVzdFBvaW50ZXIgKz0gZ2FwaS0+ZHN0TGluZVN0ZXA7Ci0JCQlzcmNQb2ludGVyICs9IFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoICogbGluZXNQcm9jZXNzZWQ7IC8vIHBpdGNoIGluIGJ5dGVzCi0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEdBUElfVXBkYXRlUmVjdHNDb2xvcihfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JaW50IGksIGhlaWdodDsKLQlpbnQgYnl0ZXNQZXJQaXhlbCA9IChnYXBpLT5neFByb3BlcnRpZXMuY0JQUCArIDEpIC8gODsKLQlpbnQgbGluZXNQcm9jZXNzZWQ7Ci0JZm9yIChpPTA7IGk8bnVtcmVjdHM7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyICpkZXN0UG9pbnRlciA9ICh1bnNpZ25lZCBjaGFyKikgZ2FwaS0+dmlkZW9NZW0gKyBnYXBpLT5zdGFydE9mZnNldCArIHJlY3RzW2ldLnkgKiBnYXBpLT5kc3RMaW5lU3RlcCArIHJlY3RzW2ldLnggKiBnYXBpLT5kc3RQaXhlbFN0ZXA7Ci0JCXVuc2lnbmVkIGNoYXIgKnNyY1BvaW50ZXIgPSAoKHVuc2lnbmVkIGNoYXIqKSBTRExfVmlkZW9TdXJmYWNlLT5waXhlbHMpICsgcmVjdHNbaV0ueSAqIFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoICsgcmVjdHNbaV0ueCAqIGJ5dGVzUGVyUGl4ZWw7Ci0JCWhlaWdodCA9IHJlY3RzW2ldLmg7Ci0KLS8vCQlmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0aW5nIHJlY3QgJWR4JWQsIGRzdD0weCV4LCB3ID0gJWQsIGggPSAlZFxuIiwgcmVjdHNbaV0udywgcmVjdHNbaV0uaCxkZXN0UG9pbnRlcixyZWN0c1tpXS53LHJlY3RzW2ldLmgpOwotLy8JCWZmbHVzaChzdGRlcnIpOwotCQlsaW5lc1Byb2Nlc3NlZCA9IGhlaWdodDsKLQotCQl3aGlsZSAoaGVpZ2h0ID4gMCkgewotCQkJc3dpdGNoKGJ5dGVzUGVyUGl4ZWwpCi0JCQl7Ci0JCQljYXNlIDE6Ci0JCQkJbGluZXNQcm9jZXNzZWQgPSB1cGRhdGVMaW5lOHRvOCh0aGlzLCBzcmNQb2ludGVyLCAodW5zaWduZWQgY2hhciAqKSBkZXN0UG9pbnRlciwgcmVjdHNbaV0udywgcmVjdHNbaV0uaCwgaGVpZ2h0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MTMzKQotCQkJCWxpbmVzUHJvY2Vzc2VkID0gdXBkYXRlTGluZTE2dG8xNih0aGlzLCAoUElYRUwqKSBzcmNQb2ludGVyLCBkZXN0UG9pbnRlciwgcmVjdHNbaV0udywgcmVjdHNbaV0uaCwgaGVpZ2h0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWhlaWdodCAtPSBsaW5lc1Byb2Nlc3NlZDsKLQkJCWRlc3RQb2ludGVyICs9IGdhcGktPmRzdExpbmVTdGVwICogbGluZXNQcm9jZXNzZWQ7Ci0JCQlzcmNQb2ludGVyICs9IFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoICogbGluZXNQcm9jZXNzZWQ7IC8vIHBpdGNoIGluIGJ5dGVzCi0JCX0KLS8vCQlmcHJpbnRmKHN0ZGVyciwgIkVuZCBvZiByZWN0XG4iKTsKLS8vCQlmZmx1c2goc3RkZXJyKTsKLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgR0FQSV9VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JLy8gd2UgZG8gbm90IHdhbnQgdG8gY29ycnVwdCB2aWRlbyBtZW1vcnkKLQlpZiggZ2FwaS0+c3VzcGVuZGVkICkgcmV0dXJuOwotCi0JaWYoIGdhcGktPm5lZWRVcGRhdGUgKQotCQlnYXBpLT52aWRlb01lbSA9IGdhcGktPmd4RnVuYy5HWEJlZ2luRHJhdygpOyAKLQotCWlmKCBnYXBpLT5neFByb3BlcnRpZXMuY0JQUCA8IDggKQotCQlHQVBJX1VwZGF0ZVJlY3RzTW9ubyh0aGlzLCBudW1yZWN0cywgcmVjdHMpOwotCWVsc2UKLQkJR0FQSV9VcGRhdGVSZWN0c0NvbG9yKHRoaXMsIG51bXJlY3RzLCByZWN0cyk7Ci0KLQlpZiggZ2FwaS0+bmVlZFVwZGF0ZSApCi0JCWdhcGktPmd4RnVuYy5HWEVuZERyYXcoKTsKLX0KLQotLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCi0gICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCi0qLwotdm9pZCBHQVBJX1ZpZGVvUXVpdChfVEhJUykKLXsKLQlpbnQgaSwgajsKLQkvKiBEZXN0cm95IHRoZSB3aW5kb3cgYW5kIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIGl0ICovCi0JaWYgKCBTRExfV2luZG93ICkgCi0JewotCSAgICBpZiAoKGdfaEdhcGlMaWIgIT0gMCkgJiYgdGhpcyAmJiB0aGlzLT5oaWRkZW4gJiYgdGhpcy0+aGlkZGVuLT5neEZ1bmMuR1hDbG9zZURpc3BsYXkgJiYgIXRoaXMtPmhpZGRlbi0+dXNlVmdhKQotCQkJdGhpcy0+aGlkZGVuLT5neEZ1bmMuR1hDbG9zZURpc3BsYXkoKTsgCi0KLQkJaWYgKHRoaXMtPnNjcmVlbi0+cGl4ZWxzICE9IE5VTEwpCi0JCXsKLQkJCVNETF9mcmVlKHRoaXMtPnNjcmVlbi0+cGl4ZWxzKTsKLQkJCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsKLQkJfQotCQlpZiAoIHNjcmVlbl9pY24gKSB7Ci0JCQlEZXN0cm95SWNvbihzY3JlZW5faWNuKTsKLQkJCXNjcmVlbl9pY24gPSBOVUxMOwotCQl9Ci0KLQkJRElCX0Rlc3Ryb3lXaW5kb3codGhpcyk7Ci0JCVNETF9VbnJlZ2lzdGVyQXBwKCk7Ci0KLQkJU0RMX1dpbmRvdyA9IE5VTEw7Ci0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotCi0vLyBVbmxvYWQgd2luY2UgYXlnc2hlbGwgbGlicmFyeSB0byBwcmV2ZW50IGxlYWsKLQkJaWYoIGF5Z3NoZWxsICkgCi0JCXsKLQkJCUZyZWVMaWJyYXJ5KGF5Z3NoZWxsKTsKLQkJCWF5Z3NoZWxsID0gTlVMTDsKLQkJfQotI2VuZGlmCi0KLQkvKiBGcmVlIHZpZGVvIG1vZGUgbGlzdHMgKi8KLQlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgewotCQlpZiAoIGdhcGktPlNETF9tb2RlbGlzdFtpXSAhPSBOVUxMICkgewotCQkJZm9yICggaj0wOyBnYXBpLT5TRExfbW9kZWxpc3RbaV1bal07ICsraiApCi0JCQkJU0RMX2ZyZWUoZ2FwaS0+U0RMX21vZGVsaXN0W2ldW2pdKTsKLQkJCVNETF9mcmVlKGdhcGktPlNETF9tb2RlbGlzdFtpXSk7Ci0JCQlnYXBpLT5TRExfbW9kZWxpc3RbaV0gPSBOVUxMOwotCQl9Ci0JfQotCi0JfQotCi19Ci0KLXN0YXRpYyB2b2lkIEdBUElfUmVhbGl6ZVBhbGV0dGUoX1RISVMpCi17Ci0JT3V0cHV0RGVidWdTdHJpbmcoVEVYVCgiR0FQSV9SZWFsaXplUGFsZXR0ZSBOT1QgSU1QTEVNRU5URUQgIVxyXG4iKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdBUElfUGFsZXR0ZUNoYW5nZWQoX1RISVMsIEhXTkQgd2luZG93KQotewotCU91dHB1dERlYnVnU3RyaW5nKFRFWFQoIkdBUElfUGFsZXR0ZUNoYW5nZWQgTk9UIElNUExFTUVOVEVEICFcclxuIikpOwotfQotCi1zdGF0aWMgdm9pZCBHQVBJX1dpblBBSU5UKF9USElTLCBIREMgaGRjKQotewotCS8vIGRyYXcgY3VycmVudCBvZmZzY3JlZW4gYnVmZmVyIG9uIGhkYwotCi0JaW50IGJwcCA9IDE2OyAvLyB3ZSBhbHdheXMgdXNlIGVpdGhlciA4IG9yIDE2IGJwcCBpbnRlcm5hbGx5Ci0JSEdESU9CSiBwcmV2T2JqZWN0OwotCXVuc2lnbmVkIHNob3J0ICpiaXRtYXBEYXRhOwotCUhCSVRNQVAgaGI7Ci0JSERDIHNyY0RDOwotCi0gICAgLy8gQ3JlYXRlIGEgRElCCi0gICAgQllURSBidWZmZXJbc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgMyAqIHNpemVvZihSR0JRVUFEKV0gPSB7MH07Ci0gICAgQklUTUFQSU5GTyogICAgICAgcEJNSSAgICA9IChCSVRNQVBJTkZPKilidWZmZXI7Ci0gICAgQklUTUFQSU5GT0hFQURFUiogcEhlYWRlciA9ICZwQk1JLT5ibWlIZWFkZXI7Ci0gICAgRFdPUkQqICAgICAgICAgICAgcENvbG9ycyA9IChEV09SRCopJnBCTUktPmJtaUNvbG9yczsgICAKLQotCS8vIENyZWF0ZURJQlNlY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCAzMzIgcGl4ZWwgZm9ybWF0IG9uIHdjZQotCWlmKCBnYXBpLT5neFByb3BlcnRpZXMuY0JQUCA9PSA4ICkgcmV0dXJuOwotCi0gICAgLy8gRElCIEhlYWRlcgotICAgIHBIZWFkZXItPmJpU2l6ZSAgICAgICAgICAgID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgIHBIZWFkZXItPmJpV2lkdGggICAgICAgICAgID0gdGhpcy0+aGlkZGVuLT53OwotICAgIHBIZWFkZXItPmJpSGVpZ2h0ICAgICAgICAgID0gLXRoaXMtPmhpZGRlbi0+aDsKLSAgICBwSGVhZGVyLT5iaVBsYW5lcyAgICAgICAgICA9IDE7Ci0gICAgcEhlYWRlci0+YmlCaXRDb3VudCAgICAgICAgPSBicHA7Ci0gICAgcEhlYWRlci0+YmlDb21wcmVzc2lvbiAgICAgPSBCSV9SR0I7Ci0gICAgcEhlYWRlci0+YmlTaXplSW1hZ2UgICAgICAgPSAodGhpcy0+aGlkZGVuLT53ICogdGhpcy0+aGlkZGVuLT5oICogYnBwKSAvIDg7Ci0JCi0gICAgLy8gQ29sb3IgbWFza3MKLQlpZiggYnBwID09IDE2ICkKLQl7Ci0JCXBDb2xvcnNbMF0gPSBSRURNQVNLOwotCQlwQ29sb3JzWzFdID0gR1JFRU5NQVNLOwotCQlwQ29sb3JzWzJdID0gQkxVRU1BU0s7Ci0JCXBIZWFkZXItPmJpQ29tcHJlc3Npb24gPSBCSV9CSVRGSUVMRFM7Ci0JfQotICAgIC8vIENyZWF0ZSB0aGUgRElCCi0gICAgaGIgPSAgQ3JlYXRlRElCU2VjdGlvbiggMCwgcEJNSSwgRElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdG1hcERhdGEsIDAsIDAgKTsKLQotCS8vIGNvcHkgZGF0YQotCS8vIEZJWE1FOiBwcmV2ZW50IG1pc2FsaWdubWVudCwgYnV0IEkndmUgbmV2ZXIgc2VlbiBub24gYWxpZ25lZCB3aWR0aCBvZiBzY3JlZW4KLQltZW1jcHkoYml0bWFwRGF0YSwgdGhpcy0+aGlkZGVuLT5idWZmZXIsIHBIZWFkZXItPmJpU2l6ZUltYWdlKTsKLQlzcmNEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpOwotCXByZXZPYmplY3QgPSBTZWxlY3RPYmplY3Qoc3JjREMsIGhiKTsKLQotCUJpdEJsdChoZGMsIDAsIDAsIHRoaXMtPmhpZGRlbi0+dywgdGhpcy0+aGlkZGVuLT5oLCBzcmNEQywgMCwgMCwgU1JDQ09QWSk7Ci0KLQlTZWxlY3RPYmplY3Qoc3JjREMsIHByZXZPYmplY3QpOwotCURlbGV0ZU9iamVjdChoYik7Ci0JRGVsZXRlREMoc3JjREMpOwotfQotCi1pbnQgR0FQSV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpIAotewotCUdBUElfQ3JlYXRlUGFsZXR0ZShuY29sb3JzLCBjb2xvcnMpOwotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nYXBpL1NETF9nYXBpdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2FwaS9TRExfZ2FwaXZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTFkMDAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nYXBpL1NETF9nYXBpdmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2dhcGl2aWRlb19oCi0jZGVmaW5lIF9TRExfZ2FwaXZpZGVvX2gKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0vKiBGcm9tIGd4LmgsIHNpbmNlIGl0J3Mgbm90IHJlYWxseSBDIGNvbXBsaWFudCAqLwotCi1zdHJ1Y3QgR1hEaXNwbGF5UHJvcGVydGllcyB7Ci0gICAgRFdPUkQgY3hXaWR0aDsKLSAgICBEV09SRCBjeUhlaWdodDsgICAgICAgICAvLyBub3RpY2UgbGFjayBvZiAndGgnIGluIHRoZSB3b3JkIGhlaWdodC4KLSAgICBsb25nIGNieFBpdGNoOyAgICAgICAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZSByaWdodCBvbmUgeCBwaXhlbCAtIGNhbiBiZSBuZWdhdGl2ZS4KLSAgICBsb25nIGNieVBpdGNoOyAgICAgICAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZSBkb3duIG9uZSB5IHBpeGVsIC0gY2FuIGJlIG5lZ2F0aXZlLgotICAgIGxvbmcgY0JQUDsgICAgICAgICAgICAgIC8vICMgb2YgYml0cyBpbiBlYWNoIHBpeGVsCi0gICAgRFdPUkQgZmZGb3JtYXQ7ICAgICAgICAgLy8gZm9ybWF0IGZsYWdzLgotfTsKLQotc3RydWN0IEdYS2V5TGlzdCB7Ci0gICAgc2hvcnQgdmtVcDsgICAgICAgICAgICAgLy8ga2V5IGZvciB1cAotICAgIFBPSU5UIHB0VXA7ICAgICAgICAgICAgIC8vIHgseSBwb3NpdGlvbiBvZiBrZXkvYnV0dG9uLiAgTm90IG9uIHNjcmVlbiBidXQgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLgotICAgIHNob3J0IHZrRG93bjsKLSAgICBQT0lOVCBwdERvd247Ci0gICAgc2hvcnQgdmtMZWZ0OwotICAgIFBPSU5UIHB0TGVmdDsKLSAgICBzaG9ydCB2a1JpZ2h0OwotICAgIFBPSU5UIHB0UmlnaHQ7Ci0gICAgc2hvcnQgdmtBOwotICAgIFBPSU5UIHB0QTsKLSAgICBzaG9ydCB2a0I7Ci0gICAgUE9JTlQgcHRCOwotICAgIHNob3J0IHZrQzsKLSAgICBQT0lOVCBwdEM7Ci0gICAgc2hvcnQgdmtTdGFydDsKLSAgICBQT0lOVCBwdFN0YXJ0OwotfTsKLQotdHlwZWRlZiBpbnQgICAoKlBGTkdYT3BlbkRpc3BsYXkpKEhXTkQgaFduZCwgRFdPUkQgZHdGbGFncyk7Ci10eXBlZGVmIGludCAgICgqUEZOR1hDbG9zZURpc3BsYXkpKCk7Ci10eXBlZGVmIHZvaWQqICgqUEZOR1hCZWdpbkRyYXcpKCk7Ci10eXBlZGVmIGludCAgICgqUEZOR1hFbmREcmF3KSgpOwotdHlwZWRlZiBpbnQgICAoKlBGTkdYT3BlbklucHV0KSgpOwotdHlwZWRlZiBpbnQgICAoKlBGTkdYQ2xvc2VJbnB1dCkoKTsKLXR5cGVkZWYgc3RydWN0IEdYRGlzcGxheVByb3BlcnRpZXMgKCpQRk5HWEdldERpc3BsYXlQcm9wZXJ0aWVzKSgpOwotdHlwZWRlZiBzdHJ1Y3QgR1hLZXlMaXN0ICgqUEZOR1hHZXREZWZhdWx0S2V5cykoaW50IGlPcHRpb25zKTsKLXR5cGVkZWYgaW50ICAgKCpQRk5HWFN1c3BlbmQpKCk7Ci10eXBlZGVmIGludCAgICgqUEZOR1hSZXN1bWUpKCk7Ci10eXBlZGVmIGludCAgICgqUEZOR1hTZXRWaWV3cG9ydCkoIERXT1JEIGR3VG9wLCBEV09SRCBkd0hlaWdodCwgRFdPUkQgZHdSZXNlcnZlZDEsIERXT1JEIGR3UmVzZXJ2ZWQyICk7Ci10eXBlZGVmIEJPT0wgICgqUEZOR1hJc0Rpc3BsYXlEUkFNQnVmZmVyKSgpOwotCi1zdHJ1Y3QgR2FwaUZ1bmMKLXsKLSAgICBQRk5HWE9wZW5EaXNwbGF5ICAgICAgICAgIEdYT3BlbkRpc3BsYXk7Ci0gICAgUEZOR1hDbG9zZURpc3BsYXkgICAgICAgICBHWENsb3NlRGlzcGxheTsKLSAgICBQRk5HWEJlZ2luRHJhdyAgICAgICAgICAgIEdYQmVnaW5EcmF3OwotICAgIFBGTkdYRW5kRHJhdyAgICAgICAgICAgICAgR1hFbmREcmF3OwotICAgIFBGTkdYT3BlbklucHV0ICAgICAgICAgICAgR1hPcGVuSW5wdXQ7Ci0gICAgUEZOR1hDbG9zZUlucHV0ICAgICAgICAgICBHWENsb3NlSW5wdXQ7Ci0gICAgUEZOR1hHZXREaXNwbGF5UHJvcGVydGllcyBHWEdldERpc3BsYXlQcm9wZXJ0aWVzOwotICAgIFBGTkdYR2V0RGVmYXVsdEtleXMgICAgICAgR1hHZXREZWZhdWx0S2V5czsKLSAgICBQRk5HWFN1c3BlbmQgICAgICAgICAgICAgIEdYU3VzcGVuZDsKLSAgICBQRk5HWFJlc3VtZSAgICAgICAgICAgICAgIEdYUmVzdW1lOwotICAgIFBGTkdYU2V0Vmlld3BvcnQgICAgICAgICAgR1hTZXRWaWV3cG9ydDsKLSAgICBQRk5HWElzRGlzcGxheURSQU1CdWZmZXIgIEdYSXNEaXNwbGF5RFJBTUJ1ZmZlcjsKLX07Ci0KLSNkZWZpbmUga2ZMYW5kc2NhcGUJMHg4CQkJLy8gU2NyZWVuIGlzIHJvdGF0ZWQgMjcwIGRlZ3JlZXMKLSNkZWZpbmUga2ZQYWxldHRlCTB4MTAJCS8vIFBpeGVsIHZhbHVlcyBhcmUgaW5kZXhlcyBpbnRvIGEgcGFsZXR0ZQotI2RlZmluZSBrZkRpcmVjdAkweDIwCQkvLyBQaXhlbCB2YWx1ZXMgY29udGFpbiBhY3R1YWwgbGV2ZWwgaW5mb3JtYXRpb24KLSNkZWZpbmUga2ZEaXJlY3Q1NTUJMHg0MAkJLy8gNSBiaXRzIGVhY2ggZm9yIHJlZCwgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzIGluIGEgcGl4ZWwuCi0jZGVmaW5lIGtmRGlyZWN0NTY1CTB4ODAJCS8vIDUgcmVkIGJpdHMsIDYgZ3JlZW4gYml0cyBhbmQgNSBibHVlIGJpdHMgcGVyIHBpeGVsCi0jZGVmaW5lIGtmRGlyZWN0ODg4CTB4MTAwCQkvLyA4IGJpdHMgZWFjaCBmb3IgcmVkLCBncmVlbiBhbmQgYmx1ZSB2YWx1ZXMgaW4gYSBwaXhlbC4KLSNkZWZpbmUga2ZEaXJlY3Q0NDQJMHgyMDAJCS8vIDQgcmVkLCA0IGdyZWVuLCA0IGJsdWUKLSNkZWZpbmUga2ZEaXJlY3RJbnZlcnRlZCAweDQwMAotCi0jZGVmaW5lIEdYX0ZVTExTQ1JFRU4JMHgwMQkJLy8gZm9yIE9wZW5EaXNwbGF5KCkgCi0jZGVmaW5lIEdYX05PUk1BTEtFWVMgICAweDAyCi0jZGVmaW5lIEdYX0xBTkRTQ0FQRUtFWVMgICAgICAgIDB4MDMKLQotdHlwZWRlZiBlbnVtCi17Ci0JU0RMX09SSUVOVEFUSU9OX1VQLAotCVNETF9PUklFTlRBVElPTl9ET1dOLAotCVNETF9PUklFTlRBVElPTl9MRUZULAotCVNETF9PUklFTlRBVElPTl9SSUdIVAotfSBTRExfU2NyZWVuT3JpZW50YXRpb247Ci0KLS8qIEdBUEkgdmlkZW8gbW9kZSAqLwotdHlwZWRlZiBlbnVtIHsKLQlHQVBJX05PTkUgPSAwLAotCUdBUElfRElSRUNUXzU2NSwKLQlHQVBJX0RJUkVDVF81NTUsCi0JR0FQSV9NT05PLAotCUdBUElfUEFMRVRURQotfSBHQVBJVmlkZW9Nb2RlOyAKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFBJWEVMOwotCi0vKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAKLSAgIGJlZ2luIHdpdGggRElCIHByaXZhdGUgc3RydWN0dXJlIHRvIGFsbG93IERJQiBldmVudHMgY29kZSBzaGFyaW5nCi0qLwotc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKLSAgICBIQklUTUFQIHNjcmVlbl9ibXA7Ci0gICAgSFBBTEVUVEUgc2NyZWVuX3BhbDsKLQotI2RlZmluZSBOVU1fTU9ERUxJU1RTCTQJCS8qIDgsIDE2LCAyNCwgYW5kIDMyIGJpdHMtcGVyLXBpeGVsICovCi0gICAgaW50IFNETF9udW1tb2Rlc1tOVU1fTU9ERUxJU1RTXTsKLSAgICBTRExfUmVjdCAqKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXTsKLQllbnVtIFNETF9TY3JlZW5PcmllbnRhdGlvbiB1c2VyT3JpZW50YXRpb247Ci0JaW50IGludmVydDsKLQljaGFyIGhpcmVzRml4OyAvLyB1c2luZyBoaXJlcyBtb2RlIHdpdGhvdXQgZGVmaW5pbmcgaGlyZXMgcmVzb3VyY2UKLS8vIC0tLS0tLS0tLS0tLS0tCi0JaW50IHVzZUdYT3BlbkRpc3BsYXk7IC8qIHVzZSBHWE9wZW5EaXNwcGxheSAqLwotICAgIGludCB3LCBoOwotCWVudW0gU0RMX1NjcmVlbk9yaWVudGF0aW9uIGdhcGlPcmllbnRhdGlvbjsKLQotICAgIHZvaWQgKmJ1ZmZlcjsgLy8gbWF5IGJlIDgsIDE2LCAyNCwgMzIgYnBwCi0JUElYRUwgKnZpZGVvTWVtOwotCUJPT0wgbmVlZFVwZGF0ZTsKLQlzdHJ1Y3QgR1hLZXlMaXN0IGtleUxpc3Q7Ci0Jc3RydWN0IEdhcGlGdW5jIGd4RnVuYzsKLQlzdHJ1Y3QgR1hEaXNwbGF5UHJvcGVydGllcyBneFByb3BlcnRpZXM7Ci0JZW51bSBHQVBJVmlkZW9Nb2RlIHZpZGVvTW9kZTsKLQlpbnQgY29sb3JzY2FsZTsKLQlpbnQgZHN0TGluZVN0ZXA7ICAvLyBpbiBieXRlcwotCWludCBkc3RQaXhlbFN0ZXA7IC8vIGluIGJ5dGVzCi0JaW50IHN0YXJ0T2Zmc2V0OyAvLyBpbiBieXRlcwotCWludCB1c2VWZ2E7Ci0JaW50IHN1c3BlbmRlZDsgLy8gZG8gbm90IHB1IGFueXRoaW5nIGludG8gdmlkZW8gbWVtb3J5Ci19OwotCi0KLSNkZWZpbmUgZ2FwaUJ1ZmZlciB0aGlzLT5oaWRkZW4tPmJ1ZmZlcgotI2RlZmluZSBnYXBpIHRoaXMtPmhpZGRlbgotCi0jZW5kaWYgLyogX1NETF9nYXBpdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZW0vU0RMX2dlbWV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZW0vU0RMX2dlbWV2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWM3Yzc0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2VtL1NETF9nZW1ldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAqIEdFTSBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uCi0gKiBpbnNwaXJlZCBmcm9tIHRoZSBEdW1teSBTREwgZHJpdmVyCi0gKiAKLSAqIFBhdHJpY2UgTWFuZGluCi0gKiBhbmQgd29yayBmcm9tCi0gKiBPbGl2aWVyIExhbmRlbWFycmUsIEpvaGFuIEtsb2NrYXJzLCBYYXZpZXIgSm91YmVydCwgQ2xhdWRlIEF0dGFyZAotICovCi0KLSNpbmNsdWRlIDxnZW0uaD4KLQotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9nZW12aWRlby5oIgotI2luY2x1ZGUgIlNETF9nZW1ldmVudHNfYy5oIgotI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaWtleXMuaCIJLyogZm9yIGtleWJvYXJkIHNjYW5jb2RlcyAqLwotI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaWV2ZW50c19jLmgiCi0jaW5jbHVkZSAiLi4vYXRhcmljb21tb24vU0RMX3hiaW9zZXZlbnRzX2MuaCIKLSNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfYXRhcmlkZXZtb3VzZV9jLmgiCi0KLS8qIFZhcmlhYmxlcyAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBnZW1fY3VycmVudGtleWJvYXJkW0FUQVJJQklPU19NQVhLRVlTXTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGdlbV9wcmV2aW91c2tleWJvYXJkW0FUQVJJQklPU19NQVhLRVlTXTsKLQotLyogRnVuY3Rpb25zIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIGludCBkb19tZXNzYWdlcyhfVEhJUywgc2hvcnQgKm1lc3NhZ2UpOwotc3RhdGljIHZvaWQgZG9fa2V5Ym9hcmQoc2hvcnQga2MsIHNob3J0IGtzKTsKLXN0YXRpYyB2b2lkIGRvX21vdXNlKF9USElTLCBzaG9ydCBteCwgc2hvcnQgbXksIHNob3J0IG1iLCBzaG9ydCBrcyk7Ci0KLS8qIEZ1bmN0aW9ucyAqLwotCi12b2lkIEdFTV9Jbml0T1NLZXltYXAoX1RISVMpCi17Ci0JU0RMX21lbXNldChnZW1fY3VycmVudGtleWJvYXJkLCAwLCBzaXplb2YoZ2VtX2N1cnJlbnRrZXlib2FyZCkpOwotCVNETF9tZW1zZXQoZ2VtX3ByZXZpb3Vza2V5Ym9hcmQsIDAsIHNpemVvZihnZW1fcHJldmlvdXNrZXlib2FyZCkpOwotCi0JLyogTW91c2UgaW5pdCAqLwotCUdFTV9tb3VzZV9yZWxhdGl2ZSA9IFNETF9GQUxTRTsKLQotCVNETF9BdGFyaV9Jbml0SW50ZXJuYWxLZXltYXAodGhpcyk7Ci19Ci0KLXZvaWQgR0VNX1B1bXBFdmVudHMoX1RISVMpCi17Ci0Jc2hvcnQgbW91c2V4LCBtb3VzZXksIG1vdXNlYiwgZHVtbXk7Ci0Jc2hvcnQga3N0YXRlLCBwcmV2a2MsIHByZXZrczsKLQlpbnQgaTsKLQlTRExfa2V5c3ltCWtleXN5bTsKLQotCVNETF9tZW1zZXQoZ2VtX2N1cnJlbnRrZXlib2FyZCwwLHNpemVvZihnZW1fY3VycmVudGtleWJvYXJkKSk7Ci0JcHJldmtjID0gcHJldmtzID0gMDsKLQkKLQlmb3IgKDs7KQotCXsKLQkJaW50IHF1aXQsIHJlc3VsdGF0LCBldmVudF9tYXNrLCBtb3VzZV9ldmVudDsKLQkJc2hvcnQgYnVmZmVyWzhdLCBrYzsKLQkJc2hvcnQgeDIseTIsdzIsaDI7Ci0KLQkJcXVpdCA9Ci0JCQltb3VzZV9ldmVudCA9Ci0JCQl4Mj15Mj13Mj1oMiA9IDA7Ci0KLQkJZXZlbnRfbWFzayA9IE1VX01FU0FHfE1VX1RJTUVSfE1VX0tFWUJEOwotCQlpZiAoIUdFTV9mdWxsc2NyZWVuICYmIChHRU1faGFuZGxlPj0wKSkgewotCQkJd2luZF9nZXQgKEdFTV9oYW5kbGUsIFdGX1dPUktYWVdILCAmeDIsICZ5MiwgJncyLCAmaDIpOwotCQkJZXZlbnRfbWFzayB8PSBNVV9NMTsKLQkJCW1vdXNlX2V2ZW50ID0gKCAoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUykKLQkJCQk9PSBTRExfQVBQTU9VU0VGT0NVUykgPyBNT19MRUFWRSA6IE1PX0VOVEVSOwotCQl9Ci0KLQkJcmVzdWx0YXQgPSBldm50X211bHRpKAotCQkJZXZlbnRfbWFzaywKLQkJCTAsMCwwLAotCQkJbW91c2VfZXZlbnQseDIseTIsdzIsaDIsCi0JCQkwLDAsMCwwLDAsCi0JCQlidWZmZXIsCi0JCQkxMCwKLQkJCSZkdW1teSwmZHVtbXksJmR1bW15LCZrc3RhdGUsJmtjLCZkdW1teQotCQkpOwotCi0JCS8qIE1lc3NhZ2UgZXZlbnQgPyAqLwotCQlpZiAocmVzdWx0YXQgJiBNVV9NRVNBRykKLQkJCXF1aXQgPSBkb19tZXNzYWdlcyh0aGlzLCBidWZmZXIpOwotCi0JCS8qIEtleWJvYXJkIGV2ZW50ID8gKi8KLQkJaWYgKHJlc3VsdGF0ICYgTVVfS0VZQkQpIHsKLQkJCWlmICgocHJldmtjICE9IGtjKSB8fCAocHJldmtzICE9IGtzdGF0ZSkpIHsKLQkJCQlkb19rZXlib2FyZChrYyxrc3RhdGUpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBBdm9pZCBsb29waW5nLCBpZiByZXBlYXRpbmcgc2FtZSBrZXkgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8qIE1vdXNlIGVudGVyaW5nL2xlYXZpbmcgd2luZG93ICovCi0JCWlmIChyZXN1bHRhdCAmIE1VX00xKSB7Ci0JCQlpZiAodGhpcy0+aW5wdXRfZ3JhYiA9PSBTRExfR1JBQl9PRkYpIHsKLQkJCQkvKiBTd2l0Y2ggbW91c2UgZm9jdXMgc3RhdGUgKi8KLQkJCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgobW91c2VfZXZlbnQgPT0gTU9fRU5URVIpLAotCQkJCQlTRExfQVBQTU9VU0VGT0NVUyk7Ci0JCQl9Ci0JCQlHRU1fQ2hlY2tNb3VzZU1vZGUodGhpcyk7Ci0JCX0KLQotCQkvKiBUaW1lciBldmVudCA/ICovCi0JCWlmICgocmVzdWx0YXQgJiBNVV9USU1FUikgfHwgcXVpdCkKLQkJCWJyZWFrOwotCX0KLQotCS8qIFVwZGF0ZSBtb3VzZSAqLwotCWdyYWZfbWtzdGF0ZSgmbW91c2V4LCAmbW91c2V5LCAmbW91c2ViLCAma3N0YXRlKTsKLQlkb19tb3VzZSh0aGlzLCBtb3VzZXgsIG1vdXNleSwgbW91c2ViLCBrc3RhdGUpOwotCi0JLyogTm93IGdlbmVyYXRlIGtleWJvYXJkIGV2ZW50cyAqLwotCWZvciAoaT0wOyBpPEFUQVJJQklPU19NQVhLRVlTOyBpKyspIHsKLQkJLyogS2V5IHByZXNzZWQgPyAqLwotCQlpZiAoZ2VtX2N1cnJlbnRrZXlib2FyZFtpXSAmJiAhZ2VtX3ByZXZpb3Vza2V5Ym9hcmRbaV0pCi0JCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELAotCQkJCVNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaSwgJmtleXN5bSwgU0RMX1RSVUUpKTsKLQkJCQotCQkvKiBLZXkgdW5wcmVzc2VkID8gKi8KLQkJaWYgKGdlbV9wcmV2aW91c2tleWJvYXJkW2ldICYmICFnZW1fY3VycmVudGtleWJvYXJkW2ldKQotCQkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsCi0JCQkJU0RMX0F0YXJpX1RyYW5zbGF0ZUtleShpLCAma2V5c3ltLCBTRExfRkFMU0UpKTsKLQl9Ci0KLQlTRExfbWVtY3B5KGdlbV9wcmV2aW91c2tleWJvYXJkLGdlbV9jdXJyZW50a2V5Ym9hcmQsc2l6ZW9mKGdlbV9wcmV2aW91c2tleWJvYXJkKSk7Ci0KLQkvKiBSZWZyZXNoIHdpbmRvdyBuYW1lID8gKi8KLQlpZiAoR0VNX3JlZnJlc2hfbmFtZSkgewotCQljb25zdCBjaGFyICp3aW5kb3dfbmFtZSA9Ci0JCQkoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQQUNUSVZFKQotCQkJPyBHRU1fdGl0bGVfbmFtZSA6IEdFTV9pY29uX25hbWU7Ci0JCWlmICh3aW5kb3dfbmFtZSkgewotCQkJd2luZF9zZXQoR0VNX2hhbmRsZSxXRl9OQU1FLAotCQkJCShzaG9ydCkoKCh1bnNpZ25lZCBsb25nKXdpbmRvd19uYW1lKT4+MTYpLAotCQkJCShzaG9ydCkoKCh1bnNpZ25lZCBsb25nKXdpbmRvd19uYW1lKSAmIDB4ZmZmZiksCi0JCQkJMCwwKTsKLQkJfQotCQlHRU1fcmVmcmVzaF9uYW1lID0gU0RMX0ZBTFNFOwotCX0KLX0KLQotc3RhdGljIGludCBkb19tZXNzYWdlcyhfVEhJUywgc2hvcnQgKm1lc3NhZ2UpCi17Ci0JaW50IHF1aXQsIHBvc3RlZCwgY2hlY2tfbW91c2VfbW9kZTsKLQlzaG9ydCB4Mix5Mix3MixoMjsKLQotCXF1aXQgPSBjaGVja19tb3VzZV9tb2RlID0gMDsKLQlzd2l0Y2ggKG1lc3NhZ2VbMF0pIHsKLQkJY2FzZSBXTV9DTE9TRUQ6Ci0JCWNhc2UgQVBfVEVSTTogICAgCi0JCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZVF1aXQoKTsKLQkJCXF1aXQ9MTsKLQkJCWJyZWFrOwotCQljYXNlIFdNX01PVkVEOgotCQkJd2luZF9zZXQobWVzc2FnZVszXSxXRl9DVVJSWFlXSCxtZXNzYWdlWzRdLG1lc3NhZ2VbNV0sbWVzc2FnZVs2XSxtZXNzYWdlWzddKTsKLQkJCWJyZWFrOwotCQljYXNlIFdNX1RPUFBFRDoKLQkJCXdpbmRfc2V0KG1lc3NhZ2VbM10sV0ZfVE9QLG1lc3NhZ2VbNF0sMCwwLDApOwotCQkJLyogQ29udGludWUgd2l0aCBUT1AgZXZlbnQgcHJvY2Vzc2luZyAqLwotCQljYXNlIFdNX09OVE9QOgotCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUElOUFVURk9DVVMpOwotCQkJaWYgKFZESV9zZXRwYWxldHRlKSB7Ci0JCQkJVkRJX3NldHBhbGV0dGUodGhpcywgVkRJX2N1cnBhbGV0dGUpOwotCQkJfQotCQkJY2hlY2tfbW91c2VfbW9kZSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBXTV9SRURSQVc6Ci0JCQlpZiAoIUdFTV9sb2NrX3JlZHJhdykgewotCQkJCUdFTV93aW5kX3JlZHJhdyh0aGlzLCBtZXNzYWdlWzNdLCZtZXNzYWdlWzRdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFdNX0lDT05JRlk6Ci0JCWNhc2UgV01fQUxMSUNPTklGWToKLQkJCXdpbmRfc2V0KG1lc3NhZ2VbM10sV0ZfSUNPTklGWSxtZXNzYWdlWzRdLG1lc3NhZ2VbNV0sbWVzc2FnZVs2XSxtZXNzYWdlWzddKTsKLQkJCS8qIElmIHdlJ3JlIGFjdGl2ZSwgbWFrZSBvdXJzZWx2ZXMgaW5hY3RpdmUgKi8KLQkJCWlmICggU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQQUNUSVZFICkgewotCQkJCS8qIFNlbmQgYW4gaW50ZXJuYWwgZGVhY3RpdmF0ZSBldmVudCAqLwotCQkJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBBQ1RJVkUpOwotCQkJfQotCQkJLyogVXBkYXRlIHdpbmRvdyB0aXRsZSAqLwotCQkJaWYgKEdFTV9yZWZyZXNoX25hbWUgJiYgR0VNX2ljb25fbmFtZSkgewotCQkJCXdpbmRfc2V0KEdFTV9oYW5kbGUsV0ZfTkFNRSwoc2hvcnQpKCgodW5zaWduZWQgbG9uZylHRU1faWNvbl9uYW1lKT4+MTYpLChzaG9ydCkoKCh1bnNpZ25lZCBsb25nKUdFTV9pY29uX25hbWUpICYgMHhmZmZmKSwwLDApOwotCQkJCUdFTV9yZWZyZXNoX25hbWUgPSBTRExfRkFMU0U7Ci0JCQl9Ci0JCQljaGVja19tb3VzZV9tb2RlID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIFdNX1VOSUNPTklGWToKLQkJCXdpbmRfc2V0KG1lc3NhZ2VbM10sV0ZfVU5JQ09OSUZZLG1lc3NhZ2VbNF0sbWVzc2FnZVs1XSxtZXNzYWdlWzZdLG1lc3NhZ2VbN10pOwotCQkJLyogSWYgd2UncmUgbm90IGFjdGl2ZSwgbWFrZSBvdXJzZWx2ZXMgYWN0aXZlICovCi0JCQlpZiAoICEoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQQUNUSVZFKSApIHsKLQkJCQkvKiBTZW5kIGFuIGludGVybmFsIGFjdGl2YXRlIGV2ZW50ICovCi0JCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUEFDVElWRSk7Ci0JCQl9Ci0JCQlpZiAoR0VNX3JlZnJlc2hfbmFtZSAmJiBHRU1fdGl0bGVfbmFtZSkgewotCQkJCXdpbmRfc2V0KEdFTV9oYW5kbGUsV0ZfTkFNRSwoc2hvcnQpKCgodW5zaWduZWQgbG9uZylHRU1fdGl0bGVfbmFtZSk+PjE2KSwoc2hvcnQpKCgodW5zaWduZWQgbG9uZylHRU1fdGl0bGVfbmFtZSkgJiAweGZmZmYpLDAsMCk7Ci0JCQkJR0VNX3JlZnJlc2hfbmFtZSA9IFNETF9GQUxTRTsKLQkJCX0KLQkJCWNoZWNrX21vdXNlX21vZGUgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgV01fU0laRUQ6Ci0JCQl3aW5kX3NldCAobWVzc2FnZVszXSwgV0ZfQ1VSUlhZV0gsIG1lc3NhZ2VbNF0sIG1lc3NhZ2VbNV0sIG1lc3NhZ2VbNl0sIG1lc3NhZ2VbN10pOwotCQkJd2luZF9nZXQgKG1lc3NhZ2VbM10sIFdGX1dPUktYWVdILCAmeDIsICZ5MiwgJncyLCAmaDIpOwotCQkJR0VNX3dpbl9mdWxsZWQgPSBTRExfRkFMU0U7CQkvKiBDYW5jZWwgbWF4aW1pemVkIGZsYWcgKi8KLQkJCUdFTV9sb2NrX3JlZHJhdyA9IFNETF9UUlVFOwkJLyogUHJldmVudCByZWRyYXcgdGlsbCBidWZmZXJzIHJlc2l6ZWQgKi8KLQkJCVNETF9Qcml2YXRlUmVzaXplKHcyLCBoMik7Ci0JCQlicmVhazsKLQkJY2FzZSBXTV9GVUxMRUQ6Ci0JCQl7Ci0JCQkJc2hvcnQgeCx5LHcsaDsKLQotCQkJCWlmIChHRU1fd2luX2Z1bGxlZCkgewotCQkJCQl3aW5kX2dldCAobWVzc2FnZVszXSwgV0ZfUFJFVlhZV0gsICZ4LCAmeSwgJncsICZoKTsKLQkJCQkJR0VNX3dpbl9mdWxsZWQgPSBTRExfRkFMU0U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJeCA9IEdFTV9kZXNrX3g7Ci0JCQkJCXkgPSBHRU1fZGVza195OwotCQkJCQl3ID0gR0VNX2Rlc2tfdzsKLQkJCQkJaCA9IEdFTV9kZXNrX2g7Ci0JCQkJCUdFTV93aW5fZnVsbGVkID0gU0RMX1RSVUU7Ci0JCQkJfQotCQkJCXdpbmRfc2V0IChtZXNzYWdlWzNdLCBXRl9DVVJSWFlXSCwgeCwgeSwgdywgaCk7Ci0JCQkJd2luZF9nZXQgKG1lc3NhZ2VbM10sIFdGX1dPUktYWVdILCAmeDIsICZ5MiwgJncyLCAmaDIpOwotCQkJCUdFTV9sb2NrX3JlZHJhdyA9IFNETF9UUlVFOwkJLyogUHJldmVudCByZWRyYXcgdGlsbCBidWZmZXJzIHJlc2l6ZWQgKi8KLQkJCQlTRExfUHJpdmF0ZVJlc2l6ZSh3MiwgaDIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgV01fQk9UVE9NRUQ6Ci0JCQl3aW5kX3NldChtZXNzYWdlWzNdLFdGX0JPVFRPTSwwLDAsMCwwKTsKLQkJCS8qIENvbnRpbnVlIHdpdGggQk9UVE9NIGV2ZW50IHByb2Nlc3NpbmcgKi8KLQkJY2FzZSBXTV9VTlRPUFBFRDoKLQkJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBJTlBVVEZPQ1VTKTsKLQkJCWlmIChWRElfc2V0cGFsZXR0ZSkgewotCQkJCVZESV9zZXRwYWxldHRlKHRoaXMsIFZESV9vbGRwYWxldHRlKTsKLQkJCX0KLQkJCWNoZWNrX21vdXNlX21vZGUgPSAxOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGNoZWNrX21vdXNlX21vZGUpIHsKLQkJR0VNX0NoZWNrTW91c2VNb2RlKHRoaXMpOwotCX0KLQkKLQlyZXR1cm4gcXVpdDsKLX0KLQotc3RhdGljIHZvaWQgZG9fa2V5Ym9hcmQoc2hvcnQga2MsIHNob3J0IGtzKQotewotCWludCBzY2FuY29kZTsKLQotCWlmIChrYykgewotCQlzY2FuY29kZT0oa2M+PjgpICYgKEFUQVJJQklPU19NQVhLRVlTLTEpOwotCQlnZW1fY3VycmVudGtleWJvYXJkW3NjYW5jb2RlXT0weEZGOwotCX0KLQotCS8qIFJlYWQgc3BlY2lhbCBrZXlzICovCi0JaWYgKGtzICYgS19SU0hJRlQpCi0JCWdlbV9jdXJyZW50a2V5Ym9hcmRbU0NBTkNPREVfUklHSFRTSElGVF09MHhGRjsKLQlpZiAoa3MgJiBLX0xTSElGVCkKLQkJZ2VtX2N1cnJlbnRrZXlib2FyZFtTQ0FOQ09ERV9MRUZUU0hJRlRdPTB4RkY7Ci0JaWYgKGtzICYgS19DVFJMKQotCQlnZW1fY3VycmVudGtleWJvYXJkW1NDQU5DT0RFX0xFRlRDT05UUk9MXT0weEZGOwotCWlmIChrcyAmIEtfQUxUKQotCQlnZW1fY3VycmVudGtleWJvYXJkW1NDQU5DT0RFX0xFRlRBTFRdPTB4RkY7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX21vdXNlKF9USElTLCBzaG9ydCBteCwgc2hvcnQgbXksIHNob3J0IG1iLCBzaG9ydCBrcykKLXsKLQlzdGF0aWMgc2hvcnQgcHJldm1vdXNleD0wLCBwcmV2bW91c2V5PTAsIHByZXZtb3VzZWI9MDsKLQlzaG9ydCB4MiwgeTIsIHcyLCBoMjsKLQotCS8qIERvbid0IHJldHVybiBtb3VzZSBldmVudHMgaWYgb3V0IG9mIHdpbmRvdyAqLwotCWlmICgoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUyk9PTApIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFJldHJpZXZlIHdpbmRvdyBjb29yZHMsIGFuZCBnZW5lcmF0ZSBtb3VzZSBldmVudHMgYWNjb3JkaW5nbHkgKi8KLQl4MiA9IHkyID0gMDsKLQl3MiA9IFZESV93OwotCWgyID0gVkRJX2g7Ci0JaWYgKCghR0VNX2Z1bGxzY3JlZW4pICYmIChHRU1faGFuZGxlPj0wKSkgewotCQl3aW5kX2dldCAoR0VNX2hhbmRsZSwgV0ZfV09SS1hZV0gsICZ4MiwgJnkyLCAmdzIsICZoMik7Ci0KLQkJLyogRG8gbm90IGdlbmVyYXRlIG1vdXNlIGJ1dHRvbiBldmVudCBpZiBvdXQgb2Ygd2luZG93IHdvcmtpbmcgYXJlYSAqLwotCQlpZiAoKG14PHgyKSB8fCAobXg+PXgyK3cyKSB8fCAobXk8eTIpIHx8IChteT49eTIraDIpKSB7Ci0JCQltYj1wcmV2bW91c2ViOwotCQl9Ci0JfQotCi0JLyogTW91c2UgbW90aW9uID8gKi8KLQlpZiAoR0VNX21vdXNlX3JlbGF0aXZlKSB7Ci0JCWlmIChHRU1fdXNlZGV2bW91c2UpIHsKLQkJCVNETF9BdGFyaURldk1vdXNlX1Bvc3RNb3VzZUV2ZW50cyh0aGlzLCBTRExfRkFMU0UpOwotCQl9IGVsc2UgewotCQkJU0RMX0F0YXJpWGJpb3NfUG9zdE1vdXNlRXZlbnRzKHRoaXMsIFNETF9GQUxTRSk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoKHByZXZtb3VzZXghPW14KSB8fCAocHJldm1vdXNleSE9bXkpKSB7Ci0JCQlpbnQgcG9zeCwgcG9zeTsKLQotCQkJLyogR2l2ZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB3aW5kb3cgcG9zaXRpb24gKi8KLQkJCXBvc3ggPSBteCAtIHgyOwotCQkJaWYgKHBvc3g8MCkgcG9zeCA9IDA7Ci0JCQlpZiAocG9zeD53MikgcG9zeCA9IHcyLTE7Ci0JCQlwb3N5ID0gbXkgLSB5MjsKLQkJCWlmIChwb3N5PDApIHBvc3kgPSAwOwotCQkJaWYgKHBvc3k+aDIpIHBvc3kgPSBoMi0xOwotCi0JCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHBvc3gsIHBvc3kpOwotCQl9Ci0JCXByZXZtb3VzZXggPSBteDsKLQkJcHJldm1vdXNleSA9IG15OwotCX0KLQotCS8qIE1vdXNlIGJ1dHRvbiA/ICovCi0JaWYgKHByZXZtb3VzZWIhPW1iKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaT0wO2k8MjtpKyspIHsKLQkJCWludCBjdXJidXR0b24sIHByZXZidXR0b247Ci0JCQotCQkJY3VyYnV0dG9uID0gbWIgJiAoMTw8aSk7Ci0JCQlwcmV2YnV0dG9uID0gcHJldm1vdXNlYiAmICgxPDxpKTsKLQkJCi0JCQlpZiAoY3VyYnV0dG9uICYmICFwcmV2YnV0dG9uKSB7Ci0JCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgaSsxLCAwLCAwKTsKLQkJCX0KLQkJCWlmICghY3VyYnV0dG9uICYmIHByZXZidXR0b24pIHsKLQkJCQlTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgaSsxLCAwLCAwKTsKLQkJCX0KLQkJfQotCQlwcmV2bW91c2ViID0gbWI7Ci0JfQotCi0JLyogUmVhZCBzcGVjaWFsIGtleXMgKi8KLQlpZiAoa3MgJiBLX1JTSElGVCkKLQkJZ2VtX2N1cnJlbnRrZXlib2FyZFtTQ0FOQ09ERV9SSUdIVFNISUZUXT0weEZGOwotCWlmIChrcyAmIEtfTFNISUZUKQotCQlnZW1fY3VycmVudGtleWJvYXJkW1NDQU5DT0RFX0xFRlRTSElGVF09MHhGRjsKLQlpZiAoa3MgJiBLX0NUUkwpCi0JCWdlbV9jdXJyZW50a2V5Ym9hcmRbU0NBTkNPREVfTEVGVENPTlRST0xdPTB4RkY7Ci0JaWYgKGtzICYgS19BTFQpCi0JCWdlbV9jdXJyZW50a2V5Ym9hcmRbU0NBTkNPREVfTEVGVEFMVF09MHhGRjsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2VtL1NETF9nZW1ldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZW0vU0RMX2dlbWV2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOWY4NmYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZW0vU0RMX2dlbWV2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9nZW12aWRlby5oIgotCi0vKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfc3lzZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCi0gICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX3N5c3ZpZGVvLmMpICovCi0KLWV4dGVybiB2b2lkIEdFTV9Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgR0VNX1B1bXBFdmVudHMoX1RISVMpOwotCi0vKiBlbmQgb2YgU0RMX2dlbWV2ZW50c19jLmggKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZW0vU0RMX2dlbW1vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtbW91c2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QwYWNmOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtbW91c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAqCUdFTSBNb3VzZSBtYW5hZ2VyCi0gKgotICoJUGF0cmljZSBNYW5kaW4KLSAqLwotCi0jaW5jbHVkZSA8Z2VtLmg+Ci0KLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2N1cnNvcl9jLmgiCi0jaW5jbHVkZSAiU0RMX2dlbW1vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfZ2VtdmlkZW8uaCIKLQotLyogRGVmaW5lcyAqLwotCi0vKiNkZWZpbmUgREVCVUdfVklERU9fR0VNIDEqLwotCi0jZGVmaW5lIE1BWENVUldJRFRIIDE2Ci0jZGVmaW5lIE1BWENVUkhFSUdIVCAxNgotCi12b2lkIEdFTV9GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCi17Ci0jaWZkZWYgREVCVUdfVklERU9fR0VNCi0JcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBmcmVlIGN1cnNvclxuIik7Ci0jZW5kaWYKLQotCWlmIChjdXJzb3IgPT0gTlVMTCkKLQkJcmV0dXJuOwotCQotCWdyYWZfbW91c2UoQVJST1csIE5VTEwpOwotCi0JaWYgKGN1cnNvci0+bWZvcm1fcCAhPSBOVUxMKQotCQlTRExfZnJlZShjdXJzb3ItPm1mb3JtX3ApOwotCi0JU0RMX2ZyZWUoY3Vyc29yKTsKLX0KLQotV01jdXJzb3IgKkdFTV9DcmVhdGVXTUN1cnNvcihfVEhJUywKLQkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KQotewotCVdNY3Vyc29yICpjdXJzb3I7Ci0JTUZPUk0gKm5ld19tZm9ybTsKLQlpbnQgaTsKLQotI2lmZGVmIERFQlVHX1ZJREVPX0dFTQotCVVpbnQxNiAqZGF0YTEsICptYXNrMTsKLQotCXByaW50Zigic2RsOnZpZGVvOmdlbTogY3JlYXRlIGN1cnNvclxuIik7Ci0jZW5kaWYKLQotCS8qIENoZWNrIHRoZSBzaXplICovCi0JaWYgKCAodyA+IE1BWENVUldJRFRIKSB8fCAoaCA+IE1BWENVUkhFSUdIVCkgKSB7Ci0JCVNETF9TZXRFcnJvcigiT25seSBjdXJzb3JzIG9mIGRpbWVuc2lvbiAoJWR4JWQpIGFyZSBhbGxvd2VkIiwKLQkJCQkJCQlNQVhDVVJXSURUSCwgTUFYQ1VSSEVJR0hUKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIEFsbG9jYXRlIHRoZSBjdXJzb3IgbWVtb3J5ICovCi0JY3Vyc29yID0gKFdNY3Vyc29yICopU0RMX21hbGxvYyhzaXplb2YoV01jdXJzb3IpKTsKLQlpZiAoIGN1cnNvciA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIEFsbG9jYXRlIG1mb3JtICovCi0JbmV3X21mb3JtID0gKE1GT1JNICopU0RMX21hbGxvYyhzaXplb2YoTUZPUk0pKTsJCQotCWlmIChuZXdfbWZvcm0gPT0gTlVMTCkgewotCQlTRExfZnJlZShjdXJzb3IpOwotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCWN1cnNvci0+bWZvcm1fcCA9IG5ld19tZm9ybTsKLQotCW5ld19tZm9ybS0+bWZfeGhvdCA9IGhvdF94OwotCW5ld19tZm9ybS0+bWZfeWhvdCA9IGhvdF95OwotCW5ld19tZm9ybS0+bWZfbnBsYW5lcyA9IDE7Ci0JbmV3X21mb3JtLT5tZl9mZyA9IDA7Ci0JbmV3X21mb3JtLT5tZl9iZyA9IDE7Ci0KLQlmb3IgKGk9MDtpPE1BWENVUkhFSUdIVDtpKyspIHsKLQkJbmV3X21mb3JtLT5tZl9tYXNrW2ldPTA7Ci0JCW5ld19tZm9ybS0+bWZfZGF0YVtpXT0wOwotI2lmZGVmIERFQlVHX1ZJREVPX0dFTQotCQlkYXRhMSA9IChVaW50MTYgKikgJmRhdGFbaTw8MV07Ci0JCW1hc2sxID0gKFVpbnQxNiAqKSAmbWFza1tpPDwxXTsKLQkJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBzb3VyY2U6IGxpbmUgJWQ6IGRhdGE9MHglMDR4LCBtYXNrPTB4JTA0eFxuIiwKLQkJCWksIGRhdGExW2ldLCBtYXNrMVtpXSk7Ci0jZW5kaWYKLQl9Ci0KLQlpZiAodzw9OCkgewotCQlmb3IgKGk9MDtpPGg7aSsrKSB7Ci0JCQluZXdfbWZvcm0tPm1mX21hc2tbaV09IG1hc2tbaV08PDg7Ci0JCQluZXdfbWZvcm0tPm1mX2RhdGFbaV09IGRhdGFbaV08PDg7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGk9MDtpPGg7aSsrKSB7Ci0JCQluZXdfbWZvcm0tPm1mX21hc2tbaV09IChtYXNrW2k8PDFdPDw4KSB8IG1hc2tbKGk8PDEpKzFdOwotCQkJbmV3X21mb3JtLT5tZl9kYXRhW2ldPSAoZGF0YVtpPDwxXTw8OCkgfCBkYXRhWyhpPDwxKSsxXTsKLQkJfQotCX0KLQotI2lmZGVmIERFQlVHX1ZJREVPX0dFTQotCWZvciAoaT0wOyBpPGggO2krKykgewotCQlwcmludGYoInNkbDp2aWRlbzpnZW06IGN1cnNvcjogbGluZSAlZDogZGF0YT0weCUwNHgsIG1hc2s9MHglMDR4XG4iLAotCQkJaSwgbmV3X21mb3JtLT5tZl9kYXRhW2ldLCBuZXdfbWZvcm0tPm1mX21hc2tbaV0pOwotCX0KLQotCXByaW50Zigic2RsOnZpZGVvOmdlbTogQ3JlYXRlV01DdXJzb3IoKTogZG9uZVxuIik7Ci0jZW5kaWYKLQotCXJldHVybiBjdXJzb3I7Ci19Ci0KLWludCBHRU1fU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotCUdFTV9jdXJzb3IgPSBjdXJzb3I7Ci0KLQlHRU1fQ2hlY2tNb3VzZU1vZGUodGhpcyk7Ci0KLSNpZmRlZiBERUJVR19WSURFT19HRU0KLQlwcmludGYoInNkbDp2aWRlbzpnZW06IFNob3dXTUN1cnNvcigweCUwOHgpXG4iLCAobG9uZykgY3Vyc29yKTsKLSNlbmRpZgotCi0JcmV0dXJuIDE7Ci19Ci0KLSNpZiAwCi12b2lkIEdFTV9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSkKLXsKLQkvKiBUaGlzIHNlZW1zIHRvIHdvcmsgb25seSBvbiBBRVMgMy40IChGYWxjb24pICovCi0KLQlFVk5UUkVDCXdhcnBldmVudDsKLQkKLQl3YXJwZXZlbnQuYXBfZXZlbnQgPSBBUFBFVk5UX01PVVNFOyAKLQl3YXJwZXZlbnQuYXBfdmFsdWUgPSAoeCA8PCAxNikgfCB5OwotCi0JYXBwbF90cGxheSgmd2FycGV2ZW50LCAxLCAxMDAwKTsKLX0KLSNlbmRpZgotCi12b2lkIEdFTV9DaGVja01vdXNlTW9kZShfVEhJUykKLXsKLQljb25zdCBVaW50OCBmdWxsX2ZvY3VzID0gKFNETF9BUFBBQ1RJVkV8U0RMX0FQUElOUFVURk9DVVN8U0RMX0FQUE1PVVNFRk9DVVMpOwotCWludCBzZXRfc3lzdGVtX2N1cnNvciA9IDEsIHNob3dfc3lzdGVtX2N1cnNvciA9IDE7Ci0KLSNpZmRlZiBERUJVR19WSURFT19HRU0KLQlwcmludGYoInNkbDp2aWRlbzpnZW06IGNoZWNrIG1vdXNlIG1vZGVcbiIpOwotI2VuZGlmCi0KLQkvKiBJZiB0aGUgbW91c2UgaXMgaGlkZGVuIGFuZCBpbnB1dCBpcyBncmFiYmVkLCB3ZSB1c2UgcmVsYXRpdmUgbW9kZSAqLwotCUdFTV9tb3VzZV9yZWxhdGl2ZSA9ICghKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9WSVNJQkxFKSkKLQkJJiYgKHRoaXMtPmlucHV0X2dyYWIgIT0gU0RMX0dSQUJfT0ZGKQotCQkmJiAoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQQUNUSVZFKTsKLQlTRExfQXRhcmlYYmlvc19Mb2NrTW91c2VQb3NpdGlvbihHRU1fbW91c2VfcmVsYXRpdmUpOwotCi0JaWYgKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9WSVNJQkxFKSB7Ci0JCS8qIEFwcGxpY2F0aW9uIGRlZmluZWQgY3Vyc29yIG9ubHkgb3ZlciB0aGUgYXBwbGljYXRpb24gd2luZG93ICovCi0JCWlmICgoU0RMX0dldEFwcFN0YXRlKCkgJiBmdWxsX2ZvY3VzKSA9PSBmdWxsX2ZvY3VzKSB7Ci0JCQlpZiAoR0VNX2N1cnNvcikgewotCQkJCWdyYWZfbW91c2UoVVNFUl9ERUYsIEdFTV9jdXJzb3ItPm1mb3JtX3ApOwotCQkJCXNldF9zeXN0ZW1fY3Vyc29yID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hvd19zeXN0ZW1fY3Vyc29yID0gMDsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qIE1vdXNlIGN1cnNvciBoaWRkZW4gb25seSBvdmVyIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3cgKi8KLQkJaWYgKChTRExfR2V0QXBwU3RhdGUoKSAmIGZ1bGxfZm9jdXMpID09IGZ1bGxfZm9jdXMpIHsKLQkJCXNldF9zeXN0ZW1fY3Vyc29yID0gMDsKLQkJCXNob3dfc3lzdGVtX2N1cnNvciA9IDA7Ci0JCX0KLQl9Ci0KLQlncmFmX21vdXNlKHNob3dfc3lzdGVtX2N1cnNvciA/IE1fT04gOiBNX09GRiwgTlVMTCk7Ci0JaWYgKHNldF9zeXN0ZW1fY3Vyc29yKSB7Ci0JCWdyYWZfbW91c2UoQVJST1csIE5VTEwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2VtL1NETF9nZW1tb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtbW91c2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODAyOGY0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2VtL1NETF9nZW1tb3VzZV9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9nZW12aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KLWV4dGVybiB2b2lkIEdFTV9GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOwotZXh0ZXJuIFdNY3Vyc29yICpHRU1fQ3JlYXRlV01DdXJzb3IoX1RISVMsCi0JCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSk7Ci1leHRlcm4gaW50IEdFTV9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOwotI2lmIDAKLWV4dGVybiB2b2lkIEdFTV9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci0jZW5kaWYKLWV4dGVybiB2b2lkIEdFTV9DaGVja01vdXNlTW9kZShfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2VtL1NETF9nZW12aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTNlMDI3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2VtL1NETF9nZW12aWRlby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLQlHRU0gdmlkZW8gZHJpdmVyCi0KLQlQYXRyaWNlIE1hbmRpbgotCWFuZCB3b3JrIGZyb20KLQlPbGl2aWVyIExhbmRlbWFycmUsIEpvaGFuIEtsb2NrYXJzLCBYYXZpZXIgSm91YmVydCwgQ2xhdWRlIEF0dGFyZAotKi8KLQotLyogTWludCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgPGdlbS5oPgotI2luY2x1ZGUgPGdlbXguaD4KLSNpbmNsdWRlIDxtaW50L29zYmluZC5oPgotI2luY2x1ZGUgPG1pbnQvY29va2llLmg+Ci0KLSNpbmNsdWRlICJTRExfZW5kaWFuLmgiCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIi4uL1NETF9jdXJzb3JfYy5oIgotCi0jaW5jbHVkZSAiLi4vYXRhcmljb21tb24vU0RMX2F0YXJpYzJwX3MuaCIKLSNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfYXRhcmllZGRpX3MuaCIKLSNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfYXRhcmlteGFsbG9jX2MuaCIKLSNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfYXRhcmlnbF9jLmgiCi0KLSNpbmNsdWRlICJTRExfZ2VtdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfZ2VtZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfZ2VtbW91c2VfYy5oIgotI2luY2x1ZGUgIlNETF9nZW13bV9jLmgiCi0jaW5jbHVkZSAiLi4vYXRhcmljb21tb24vU0RMX3hiaW9zZXZlbnRzX2MuaCIKLSNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfYXRhcmlkZXZtb3VzZV9jLmgiCi0KLS8qIERlZmluZXMgKi8KLQotLyojZGVmaW5lIERFQlVHX1ZJREVPX0dFTQkxKi8KLQotI2RlZmluZSBHRU1fVklEX0RSSVZFUl9OQU1FICJnZW0iCi0KLSN1bmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsYikgKCgoYSk8KGIpKSA/IChhKSA6IChiKSkKLSN1bmRlZiBNQVgKLSNkZWZpbmUgTUFYKGEsYikgKCgoYSk+KGIpKSA/IChhKSA6IChiKSkKLQotLyogVmFyaWFibGVzICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHZkaV9pbmRleFsyNTZdID0gewotCTAsICAyLCAgMywgIDYsICA0LCAgNywgIDUsICAgOCwKLQk5LCAxMCwgMTEsIDE0LCAxMiwgMTUsIDEzLCAyNTUKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGVtcHR5X25hbWVbXT0iIjsKLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IEdFTV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKipHRU1fTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqR0VNX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgR0VNX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgdm9pZCBHRU1fVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgR0VNX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IEdFTV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IEdFTV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBHRU1fVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBHRU1fRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgR0VNX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci0jaWYgMAotc3RhdGljIGludCBHRU1fVG9nZ2xlRnVsbFNjcmVlbihfVEhJUywgaW50IG9uKTsKLSNlbmRpZgotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIEdFTV9GcmVlQnVmZmVycyhfVEhJUyk7Ci1zdGF0aWMgdm9pZCBHRU1fQ2xlYXJTY3JlZW4oX1RISVMpOwotc3RhdGljIHZvaWQgR0VNX0NsZWFyUmVjdChfVEhJUywgc2hvcnQgKnJlY3QpOwotc3RhdGljIHZvaWQgR0VNX1NldE5ld1BhbGV0dGUoX1RISVMsIFVpbnQxNiBuZXdwYWxbMjU2XVszXSk7Ci1zdGF0aWMgdm9pZCBHRU1fTG9ja1NjcmVlbihfVEhJUyk7Ci1zdGF0aWMgdm9pZCBHRU1fVW5sb2NrU2NyZWVuKF9USElTKTsKLXN0YXRpYyB2b2lkIHJlZnJlc2hfd2luZG93KF9USElTLCBpbnQgd2luaGFuZGxlLCBzaG9ydCAqcmVjdCk7Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0vKiBPcGVuR0wgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBHRU1fR0xfU3dhcEJ1ZmZlcnMoX1RISVMpOwotI2VuZGlmCi0KLS8qIEdFTSBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEdFTV9BdmFpbGFibGUodm9pZCkKLXsKLQkvKiBUZXN0IGlmIEFFUyBhdmFpbGFibGUgKi8KLQlpZiAoYXBwbF9pbml0KCkgPT0gLTEpCi0JCXJldHVybiAwOwotCi0JYXBwbF9leGl0KCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIEdFTV9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKkdFTV9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOwotCWludCB2ZWN0b3JzX21hc2s7Ci0JdW5zaWduZWQgbG9uZyBkdW1teTsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotCWlmICggZGV2aWNlICkgewotCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7Ci0JCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQkJZGV2aWNlLT5nbF9kYXRhID0gKHN0cnVjdCBTRExfUHJpdmF0ZUdMRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5nbF9kYXRhKSk7Ci0JfQotCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIGRldmljZSApIHsKLQkJCVNETF9mcmVlKGRldmljZSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCVNETF9tZW1zZXQoZGV2aWNlLT5nbF9kYXRhLCAwLCBzaXplb2YoKmRldmljZS0+Z2xfZGF0YSkpOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCWRldmljZS0+VmlkZW9Jbml0ID0gR0VNX1ZpZGVvSW5pdDsKLQlkZXZpY2UtPkxpc3RNb2RlcyA9IEdFTV9MaXN0TW9kZXM7Ci0JZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBHRU1fU2V0VmlkZW9Nb2RlOwotCWRldmljZS0+U2V0Q29sb3JzID0gR0VNX1NldENvbG9yczsKLQlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTCAvKkdFTV9VcGRhdGVSZWN0cyovOwotCWRldmljZS0+VmlkZW9RdWl0ID0gR0VNX1ZpZGVvUXVpdDsKLQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gR0VNX0FsbG9jSFdTdXJmYWNlOwotCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IEdFTV9Mb2NrSFdTdXJmYWNlOwotCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gR0VNX1VubG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBHRU1fRmxpcEhXU3VyZmFjZTsKLQlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBHRU1fRnJlZUhXU3VyZmFjZTsKLQlkZXZpY2UtPlRvZ2dsZUZ1bGxTY3JlZW4gPSBOVUxMIC8qR0VNX1RvZ2dsZUZ1bGxTY3JlZW4qLzsKLQotCS8qIFdpbmRvdyBtYW5hZ2VyICovCi0JZGV2aWNlLT5TZXRDYXB0aW9uID0gR0VNX1NldENhcHRpb247Ci0JZGV2aWNlLT5TZXRJY29uID0gR0VNX1NldEljb247Ci0JZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gR0VNX0ljb25pZnlXaW5kb3c7Ci0JZGV2aWNlLT5HcmFiSW5wdXQgPSBHRU1fR3JhYklucHV0OwotCi0JLyogRXZlbnRzICovCi0JZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBHRU1fSW5pdE9TS2V5bWFwOwotCWRldmljZS0+UHVtcEV2ZW50cyA9IEdFTV9QdW1wRXZlbnRzOwotCi0JLyogTW91c2UgKi8KLQlkZXZpY2UtPkZyZWVXTUN1cnNvciA9IEdFTV9GcmVlV01DdXJzb3I7Ci0JZGV2aWNlLT5DcmVhdGVXTUN1cnNvciA9IEdFTV9DcmVhdGVXTUN1cnNvcjsKLQlkZXZpY2UtPlNob3dXTUN1cnNvciA9IEdFTV9TaG93V01DdXJzb3I7Ci0JZGV2aWNlLT5XYXJwV01DdXJzb3IgPSBOVUxMIC8qR0VNX1dhcnBXTUN1cnNvciovOwotCWRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBHRU1fQ2hlY2tNb3VzZU1vZGU7Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0JLyogT3BlbkdMIGZ1bmN0aW9ucyAqLwotCWRldmljZS0+R0xfTG9hZExpYnJhcnkgPSBTRExfQXRhcmlHTF9Mb2FkTGlicmFyeTsKLQlkZXZpY2UtPkdMX0dldFByb2NBZGRyZXNzID0gU0RMX0F0YXJpR0xfR2V0UHJvY0FkZHJlc3M7Ci0JZGV2aWNlLT5HTF9HZXRBdHRyaWJ1dGUgPSBTRExfQXRhcmlHTF9HZXRBdHRyaWJ1dGU7Ci0JZGV2aWNlLT5HTF9NYWtlQ3VycmVudCA9IFNETF9BdGFyaUdMX01ha2VDdXJyZW50OwotCWRldmljZS0+R0xfU3dhcEJ1ZmZlcnMgPSBHRU1fR0xfU3dhcEJ1ZmZlcnM7Ci0jZW5kaWYKLQotCWRldmljZS0+aGlkZGVuLT51c2VfZGV2X21vdXNlID0KLQkJKFNETF9BdGFyaURldk1vdXNlX09wZW4oKSE9MCkgPyBTRExfVFJVRSA6IFNETF9GQUxTRTsKLQotCXZlY3RvcnNfbWFzayA9IEFUQVJJX1hCSU9TX0pPWVNUSUNLRVZFTlRTOwkvKiBYQklPUyBqb3lzdGljayBldmVudHMgKi8KLQlpZiAoIShkZXZpY2UtPmhpZGRlbi0+dXNlX2Rldl9tb3VzZSkpIHsKLQkJdmVjdG9yc19tYXNrIHw9IEFUQVJJX1hCSU9TX01PVVNFRVZFTlRTOwkvKiBYQklPUyBtb3VzZSBldmVudHMgKi8KLQl9Ci0vKglpZiAoR2V0Y29va2llKENfTWlOVCwgJmR1bW15KT09Q19GT1VORCkgewotCQl2ZWN0b3JzX21hc2sgPSAwOwotCX0qLwotCi0JU0RMX0F0YXJpWGJpb3NfSW5zdGFsbFZlY3RvcnModmVjdG9yc19tYXNrKTsKLQotCWRldmljZS0+ZnJlZSA9IEdFTV9EZWxldGVEZXZpY2U7Ci0KLQlyZXR1cm4gZGV2aWNlOwotfQotCi1WaWRlb0Jvb3RTdHJhcCBHRU1fYm9vdHN0cmFwID0gewotCUdFTV9WSURfRFJJVkVSX05BTUUsICJBdGFyaSBHRU0gdmlkZW8gZHJpdmVyIiwKLQlHRU1fQXZhaWxhYmxlLCBHRU1fQ3JlYXRlRGV2aWNlCi19OwotCi1zdGF0aWMgdm9pZCBWRElfUmVhZEV4dEluZm8oX1RISVMsIHNob3J0ICp3b3JrX291dCkKLXsKLQl1bnNpZ25lZCBsb25nIEVkRElfdmVyc2lvbjsKLQl1bnNpZ25lZCBsb25nIGNvb2tpZV9FZERJOwotCVVpbnQzMiBudW1fY29sb3VyczsKLQlVaW50MTYgY2x1dF90eXBlLCBudW1fYml0czsKLQotCS8qIFJlYWQgRWRESSBpbmZvcm1hdGlvbnMgKi8KLQlpZiAgKEdldGNvb2tpZShDX0VkREksICZjb29raWVfRWRESSkgPT0gQ19OT1RGT1VORCkgewotCQlyZXR1cm47Ci0JfQotCQotCUVkRElfdmVyc2lvbiA9IEF0YXJpX2dldF9FZERJX3ZlcnNpb24oICh2b2lkICopY29va2llX0VkREkpOwotCi0JdnFfc2NybmluZm8oVkRJX2hhbmRsZSwgd29ya19vdXQpOwotCi0JVkRJX2Zvcm1hdCA9IHdvcmtfb3V0WzBdOwotCWNsdXRfdHlwZSA9IHdvcmtfb3V0WzFdOwotCW51bV9iaXRzID0gd29ya19vdXRbMl07Ci0JbnVtX2NvbG91cnMgPSAqKChVaW50MzIgKikgJndvcmtfb3V0WzNdKTsKLQotCS8qIFdpdGggRWREST49MS4xLCB3ZSBjYW4gaGF2ZSBzY3JlZW4gcGl0Y2gsIGFkZHJlc3MgYW5kIGZvcm1hdAotCSAqIHNvIHdlIGNhbiBkaXJlY3RseSB3cml0ZSB0byBzY3JlZW4gd2l0aG91dCB1c2luZyB2cm9fY3B5Zm0KLQkgKi8KLQlpZiAoRWRESV92ZXJzaW9uID49IEVERElfMTEpIHsKLQkJVkRJX3BpdGNoID0gd29ya19vdXRbNV07Ci0JCVZESV9zY3JlZW4gPSAodm9pZCAqKSAqKCh1bnNpZ25lZCBsb25nICopICZ3b3JrX291dFs2XSk7Ci0JfQotCi0Jc3dpdGNoKGNsdXRfdHlwZSkgewotCQljYXNlIFZESV9DTFVUX0hBUkRXQVJFOgotCQkJewotCQkJCWludCBpOwotCQkJCVVpbnQxNiAqdG1wX3A7Ci0KLQkJCQl0bXBfcCA9IChVaW50MTYgKikmd29ya19vdXRbMTZdOwotCi0JCQkJZm9yIChpPTA7aTwyNTY7aSsrKSB7Ci0JCQkJCXZkaV9pbmRleFsqdG1wX3ArK10gPSBpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFZESV9DTFVUX1NPRlRXQVJFOgotCQkJewotCQkJCWludCBjb21wb25lbnQ7IC8qIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhLCBvdmVybGF5ICovCi0JCQkJaW50IG51bV9iaXQ7Ci0JCQkJdW5zaWduZWQgc2hvcnQgKnRtcF9wOwotCi0JCQkJLyogV2UgY2FuIGJ1aWxkIG1hc2tzIHdpdGggaW5mbyBoZXJlICovCi0JCQkJdG1wX3AgPSAodW5zaWduZWQgc2hvcnQgKikgJndvcmtfb3V0WzE2XTsKLQkJCQlmb3IgKGNvbXBvbmVudD0wO2NvbXBvbmVudDw1O2NvbXBvbmVudCsrKSB7Ci0JCQkJCWZvciAobnVtX2JpdD0wO251bV9iaXQ8MTY7bnVtX2JpdCsrKSB7Ci0JCQkJCQl1bnNpZ25lZCBzaG9ydCB2YWxldXI7Ci0KLQkJCQkJCXZhbGV1ciA9ICp0bXBfcCsrOwotCi0JCQkJCQlpZiAodmFsZXVyID09IDB4ZmZmZikgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCi0JCQkJCQlzd2l0Y2goY29tcG9uZW50KSB7Ci0JCQkJCQkJY2FzZSAwOgotCQkJCQkJCQlWRElfcmVkbWFzayB8PSAxPDwgdmFsZXVyOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDE6Ci0JCQkJCQkJCVZESV9ncmVlbm1hc2sgfD0gMTw8IHZhbGV1cjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAyOgotCQkJCQkJCQlWRElfYmx1ZW1hc2sgfD0gMTw8IHZhbGV1cjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAzOgotCQkJCQkJCQlWRElfYWxwaGFtYXNrIHw9IDE8PCB2YWxldXI7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBSZW1vdmUgbG93ZXIgZ3JlZW4gYml0cyBmb3IgSW50ZWwgZW5kaWFuIHNjcmVlbiAqLwotCQkJaWYgKChWRElfZ3JlZW5tYXNrID09ICgoNzw8MTMpfDMpKSB8fCAoVkRJX2dyZWVubWFzayA9PSAoKDc8PDEzKXw3KSkpIHsKLQkJCQlWRElfZ3JlZW5tYXNrICY9IH4oNzw8MTMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVkRJX0NMVVRfTk9ORToKLQkJCWJyZWFrOwotCX0KLX0KLQotaW50IEdFTV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLQlpbnQgaSwgbWVudWJhcl9zaXplOwotCXNob3J0IHdvcmtfaW5bMTJdLCB3b3JrX291dFsyNzJdLCBkdW1teTsKLQotCS8qIE9wZW4gQUVTIChBcHBsaWNhdGlvbiBFbnZpcm9ubWVudCBTZXJ2aWNlcykgKi8KLQlpZiAoYXBwbF9pbml0KCkgPT0gLTEpIHsKLQkJZnByaW50ZihzdGRlcnIsIkNhbiBub3Qgb3BlbiBBRVNcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBSZWFkIHZlcnNpb24gYW5kIGZlYXR1cmVzICovCi0JR0VNX3ZlcnNpb24gPSBhZXNfZ2xvYmFsWzBdOwotCWlmIChHRU1fdmVyc2lvbiA+PSAweDA0MTApIHsKLQkJc2hvcnQgYXBfZ291dFs0XSwgZXJyb3Jjb2RlOwotCQkKLQkJR0VNX3dmZWF0dXJlcz0wOwotCQllcnJvcmNvZGU9YXBwbF9nZXRpbmZvKEFFU19XSU5ET1csICZhcF9nb3V0WzBdLCAmYXBfZ291dFsxXSwgJmFwX2dvdXRbMl0sICZhcF9nb3V0WzNdKTsKLQotCQlpZiAoZXJyb3Jjb2RlPT0wKSB7Ci0JCQlHRU1fd2ZlYXR1cmVzPWFwX2dvdXRbMF07CQkJCi0JCX0KLQl9CQotCi0JLyogQXNrIFZESSBwaHlzaWNhbCB3b3Jrc3RhdGlvbiBoYW5kbGUgb3BlbmVkIGJ5IEFFUyAqLwotCVZESV9oYW5kbGUgPSBncmFmX2hhbmRsZSgmZHVtbXksICZkdW1teSwgJmR1bW15LCAmZHVtbXkpOwotCWlmIChWRElfaGFuZGxlPDEpIHsKLQkJZnByaW50ZihzdGRlcnIsIldyb25nIFZESSBoYW5kbGUgJWQgcmV0dXJuZWQgYnkgQUVTXG4iLFZESV9oYW5kbGUpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBPcGVuIHZpcnR1YWwgVkRJIHdvcmtzdGF0aW9uICovCi0Jd29ya19pblswXT1HZXRyZXooKSsyOwotCWZvcihpID0gMTsgaSA8IDEwOyBpKyspCi0JCXdvcmtfaW5baV0gPSAxOwotCXdvcmtfaW5bMTBdID0gMjsKLQotCXZfb3BudndrKHdvcmtfaW4sICZWRElfaGFuZGxlLCB3b3JrX291dCk7Ci0JaWYgKFZESV9oYW5kbGUgPT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwiQ2FuIG5vdCBvcGVuIFZESSB2aXJ0dWFsIHdvcmtzdGF0aW9uXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogUmVhZCBmdWxsc2NyZWVuIHNpemUgKi8KLQlWRElfdyA9IHdvcmtfb3V0WzBdICsgMTsKLQlWRElfaCA9IHdvcmtfb3V0WzFdICsgMTsKLQotCS8qIFJlYWQgZGVza3RvcCBzaXplIGFuZCBwb3NpdGlvbiAqLwotCWlmICghd2luZF9nZXQoREVTS1RPUF9IQU5ETEUsIFdGX1dPUktYWVdILCAmR0VNX2Rlc2tfeCwgJkdFTV9kZXNrX3ksICZHRU1fZGVza193LCAmR0VNX2Rlc2tfaCkpIHsKLQkJZnByaW50ZihzdGRlcnIsIkNhbiBub3QgcmVhZCBkZXNrdG9wIHByb3BlcnRpZXNcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBSZWFkIGJpdCBkZXB0aCAqLwotCXZxX2V4dG5kKFZESV9oYW5kbGUsIDEsIHdvcmtfb3V0KTsKLQlWRElfYnBwID0gd29ya19vdXRbNF07Ci0JVkRJX29sZG51bWNvbG9ycz0wOwotCi0Jc3dpdGNoKFZESV9icHApIHsKLQkJY2FzZSA4OgotCQkJVkRJX3BpeGVsc2l6ZT0xOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTU6Ci0JCWNhc2UgMTY6Ci0JCQlWRElfcGl4ZWxzaXplPTI7Ci0JCQlicmVhazsKLQkJY2FzZSAyNDoKLQkJCVZESV9waXhlbHNpemU9MzsKLQkJCWJyZWFrOwotCQljYXNlIDMyOgotCQkJVkRJX3BpeGVsc2l6ZT00OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwiJWQgYml0cyBjb2xvdXIgZGVwdGggbm90IHN1cHBvcnRlZFxuIixWRElfYnBwKTsKLQkJCXJldHVybiAxOwotCX0KLQotCS8qIFNldHVwIGhhcmR3YXJlIC0+IFZESSBwYWxldHRlIG1hcHBpbmcgKi8KLQlmb3IoaSA9IDE2OyBpIDwgMjU1OyBpKyspIHsKLQkJdmRpX2luZGV4W2ldID0gaTsKLQl9Ci0JdmRpX2luZGV4WzI1NV0gPSAxOwotCi0JLyogU2F2ZSBjdXJyZW50IHBhbGV0dGUgKi8KLQlpZiAoVkRJX2JwcD44KSB7Ci0JCVZESV9vbGRudW1jb2xvcnM9MTw8ODsKLQl9IGVsc2UgewotCQlWRElfb2xkbnVtY29sb3JzPTE8PFZESV9icHA7Ci0JfQotCQotCWZvcihpID0gMDsgaSA8IFZESV9vbGRudW1jb2xvcnM7IGkrKykgewotCQlzaG9ydCByZ2JbM107Ci0KLQkJdnFfY29sb3IoVkRJX2hhbmRsZSwgaSwgMCwgcmdiKTsKLQotCQlWRElfb2xkcGFsZXR0ZVtpXVswXSA9IHJnYlswXTsKLQkJVkRJX29sZHBhbGV0dGVbaV1bMV0gPSByZ2JbMV07Ci0JCVZESV9vbGRwYWxldHRlW2ldWzJdID0gcmdiWzJdOwotCX0KLQlWRElfc2V0cGFsZXR0ZSA9IEdFTV9TZXROZXdQYWxldHRlOwotCVNETF9tZW1jcHkoVkRJX2N1cnBhbGV0dGUsVkRJX29sZHBhbGV0dGUsc2l6ZW9mKFZESV9jdXJwYWxldHRlKSk7Ci0KLQkvKiBTZXR1cCBzY3JlZW4gaW5mbyAqLwotCUdFTV90aXRsZV9uYW1lID0gZW1wdHlfbmFtZTsKLQlHRU1faWNvbl9uYW1lID0gZW1wdHlfbmFtZTsKLQotCUdFTV9oYW5kbGUgPSAtMTsKLQlHRU1fbG9ja2VkID0gU0RMX0ZBTFNFOwotCUdFTV93aW5fZnVsbGVkID0gU0RMX0ZBTFNFOwotCUdFTV9mdWxsc2NyZWVuID0gU0RMX0ZBTFNFOwotCUdFTV9sb2NrX3JlZHJhdyA9IFNETF9UUlVFOwkvKiBQcmV2ZW50IHJlZHJhdyB0aWxsIGJ1ZmZlcnMgYXJlIHNldHVwICovCi0KLQlWRElfc2NyZWVuID0gTlVMTDsKLQlWRElfcGl0Y2ggPSBWRElfdyAqIFZESV9waXhlbHNpemU7Ci0JVkRJX2Zvcm1hdCA9ICggKFZESV9icHAgPD0gOCkgPyBWRElfRk9STUFUX0lOVEVSIDogVkRJX0ZPUk1BVF9QQUNLKTsKLQlWRElfcmVkbWFzayA9IFZESV9ncmVlbm1hc2sgPSBWRElfYmx1ZW1hc2sgPSBWRElfYWxwaGFtYXNrID0gMDsKLQlWRElfUmVhZEV4dEluZm8odGhpcywgd29ya19vdXQpOwotCi0jaWZkZWYgREVCVUdfVklERU9fR0VNCi0JcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBzY3JlZW46IGFkZHJlc3M9MHglMDh4LCBwaXRjaD0lZFxuIiwgVkRJX3NjcmVlbiwgVkRJX3BpdGNoKTsKLQlwcmludGYoInNkbDp2aWRlbzpnZW06IGZvcm1hdD0lZFxuIiwgVkRJX2Zvcm1hdCk7Ci0JcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBtYXNrczogMHglMDh4LCAweCUwOHgsIDB4JTA4eCwgMHglMDh4XG4iLAotCQlWRElfYWxwaGFtYXNrLCBWRElfcmVkbWFzaywgVkRJX2dyZWVubWFzaywgVkRJX2JsdWVtYXNrCi0JKTsKLSNlbmRpZgotCi0JLyogU2V0dXAgZGVzdGluYXRpb24gbWZkYiAqLwotCVZESV9kc3RfbWZkYi5mZF9hZGRyID0gTlVMTDsKLQotCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLwotCXRoaXMtPmluZm8uY3VycmVudF93ID0gVkRJX3c7Ci0JdGhpcy0+aW5mby5jdXJyZW50X2ggPSBWRElfaDsKLQotCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICovCi0JLyogd2UgY2hhbmdlIHRoaXMgZHVyaW5nIHRoZSBTRExfU2V0VmlkZW9Nb2RlIGltcGxlbWVudGF0aW9uLi4uICovCi0JdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gVkRJX2JwcDsKLQotCS8qIFNldCBtb3VzZSBjdXJzb3IgdG8gYXJyb3cgKi8KLQlncmFmX21vdXNlKEFSUk9XLCBOVUxMKTsKLQlHRU1fY3Vyc29yID0gTlVMTDsKLQotCS8qIEluaXQgY2h1bmt5IHRvIHBsYW5hciByb3V0aW5lICovCi0JU0RMX0F0YXJpX0MycENvbnZlcnQgPSBTRExfQXRhcmlfQzJwQ29udmVydDg7Ci0KLQkvKiBTZXR1cCBWREkgZmlsbCBmdW5jdGlvbnMgKi8KLQl2c2ZfY29sb3IoVkRJX2hhbmRsZSwwKTsKLQl2c2ZfaW50ZXJpb3IoVkRJX2hhbmRsZSwxKTsKLQl2c2ZfcGVyaW1ldGVyKFZESV9oYW5kbGUsMCk7Ci0KLQkvKiBNZW51IGJhciBzYXZlIGJ1ZmZlciAqLwotCW1lbnViYXJfc2l6ZSA9IEdFTV9kZXNrX3cgKiBHRU1fZGVza195ICogVkRJX3BpeGVsc2l6ZTsKLQlHRU1fbWVudWJhcj1BdGFyaV9TeXNNYWxsb2MobWVudWJhcl9zaXplLE1YX1BSRUZUVFJBTSk7Ci0KLQkvKiBGaWxsIHZpZGVvIG1vZGVzIGxpc3QgKi8KLQlTRExfbW9kZWxpc3RbMF0gPSBTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpOwotCVNETF9tb2RlbGlzdFswXS0+eCA9IDA7Ci0JU0RMX21vZGVsaXN0WzBdLT55ID0gMDsKLQlTRExfbW9kZWxpc3RbMF0tPncgPSBWRElfdzsKLQlTRExfbW9kZWxpc3RbMF0tPmggPSBWRElfaDsKLQotCVNETF9tb2RlbGlzdFsxXSA9IE5VTEw7Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0JU0RMX0F0YXJpR0xfSW5pdFBvaW50ZXJzKHRoaXMpOwotI2VuZGlmCi0KLQl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDE7Ci0KLQkvKiBXZSdyZSBkb25lISAqLwotCXJldHVybigwKTsKLX0KLQotU0RMX1JlY3QgKipHRU1fTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQotewotCWlmIChmb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSBWRElfYnBwKSB7Ci0JCXJldHVybiAoKFNETF9SZWN0ICoqKU5VTEwpOwotCX0KLQotCWlmIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSB7Ci0JCXJldHVybiAoU0RMX21vZGVsaXN0KTsKLQl9Ci0KLQlyZXR1cm4oKFNETF9SZWN0ICoqKS0xKTsKLX0KLQotc3RhdGljIHZvaWQgR0VNX0ZyZWVCdWZmZXJzKF9USElTKQotewotCS8qIFJlbGVhc2UgYnVmZmVyICovCi0JaWYgKCBHRU1fYnVmZmVyMiApIHsKLQkJTWZyZWUoIEdFTV9idWZmZXIyICk7Ci0JCUdFTV9idWZmZXIyPU5VTEw7Ci0JfQotCi0JaWYgKCBHRU1fYnVmZmVyMSApIHsKLQkJTWZyZWUoIEdFTV9idWZmZXIxICk7Ci0JCUdFTV9idWZmZXIxPU5VTEw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBHRU1fQ2xlYXJSZWN0KF9USElTLCBzaG9ydCAqcmVjdCkKLXsKLQlzaG9ydCBvbGRyZ2JbM10sIHJnYlszXT17MCwwLDB9OwotCi0JdnFfY29sb3IoVkRJX2hhbmRsZSwgdmRpX2luZGV4WzBdLCAwLCBvbGRyZ2IpOwotCXZzX2NvbG9yKFZESV9oYW5kbGUsIHZkaV9pbmRleFswXSwgcmdiKTsKLQotCXZzZl9jb2xvcihWRElfaGFuZGxlLDApOwotCXZzZl9pbnRlcmlvcihWRElfaGFuZGxlLDEpOwotCXZzZl9wZXJpbWV0ZXIoVkRJX2hhbmRsZSwwKTsKLQl2X2JhcihWRElfaGFuZGxlLCByZWN0KTsKLQotCXZzX2NvbG9yKFZESV9oYW5kbGUsIHZkaV9pbmRleFswXSwgb2xkcmdiKTsKLX0KLQotc3RhdGljIHZvaWQgR0VNX0NsZWFyU2NyZWVuKF9USElTKQotewotCXNob3J0IHB4eVs0XTsKLQotCXZfaGlkZV9jKFZESV9oYW5kbGUpOwotCi0JcHh5WzBdID0gcHh5WzFdID0gMDsKLQlweHlbMl0gPSBWRElfdyAtIDE7Ci0JcHh5WzNdID0gVkRJX2ggLSAxOwotCUdFTV9DbGVhclJlY3QodGhpcywgcHh5KTsKLQotCXZfc2hvd19jKFZESV9oYW5kbGUsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBHRU1fU2V0TmV3UGFsZXR0ZShfVEhJUywgVWludDE2IG5ld3BhbFsyNTZdWzNdKQotewotCWludCBpOwotCXNob3J0IHJnYlszXTsKLQotCWlmIChWRElfb2xkbnVtY29sb3JzPT0wKQotCQlyZXR1cm47Ci0KLQlmb3IoaSA9IDA7IGkgPCBWRElfb2xkbnVtY29sb3JzOyBpKyspIHsKLQkJcmdiWzBdID0gbmV3cGFsW2ldWzBdOwotCQlyZ2JbMV0gPSBuZXdwYWxbaV1bMV07Ci0JCXJnYlsyXSA9IG5ld3BhbFtpXVsyXTsKLQotCQl2c19jb2xvcihWRElfaGFuZGxlLCBpLCByZ2IpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgR0VNX0xvY2tTY3JlZW4oX1RISVMpCi17Ci0JaWYgKCFHRU1fbG9ja2VkKSB7Ci0JCS8qIExvY2sgQUVTICovCi0JCXdpbmRfdXBkYXRlKEJFR19VUERBVEUpOwotCQl3aW5kX3VwZGF0ZShCRUdfTUNUUkwpOwotCQkvKiBSZXNlcnZlIG1lbW9yeSBzcGFjZSwgdXNlZCB0byBiZSBzdXJlIG9mIGNvbXBhdGliaWxpdHkgKi8KLQkJZm9ybV9kaWFsKCBGTURfU1RBUlQsIDAsMCwwLDAsIDAsMCxWRElfdyxWRElfaCk7Ci0KLQkJLyogU2F2ZSBtZW51IGJhciAqLwotCQlpZiAoR0VNX21lbnViYXIpIHsKLQkJCU1GREIgbWZkYl9zcmM7Ci0JCQlzaG9ydCBibGl0Y29vcmRzWzhdOwotCi0JCQltZmRiX3NyYy5mZF9hZGRyPUdFTV9tZW51YmFyOwotCQkJbWZkYl9zcmMuZmRfdz1HRU1fZGVza193OwotCQkJbWZkYl9zcmMuZmRfaD1HRU1fZGVza195OwotCQkJbWZkYl9zcmMuZmRfd2R3aWR0aD1HRU1fZGVza193Pj40OwotCQkJbWZkYl9zcmMuZmRfbnBsYW5lcz1WRElfYnBwOwotCQkJbWZkYl9zcmMuZmRfc3RhbmQ9Ci0JCQkJbWZkYl9zcmMuZmRfcjE9Ci0JCQkJbWZkYl9zcmMuZmRfcjI9Ci0JCQkJbWZkYl9zcmMuZmRfcjM9IDA7Ci0KLQkJCWJsaXRjb29yZHNbMF0gPSBibGl0Y29vcmRzWzRdID0gMDsKLQkJCWJsaXRjb29yZHNbMV0gPSBibGl0Y29vcmRzWzVdID0gMDsKLQkJCWJsaXRjb29yZHNbMl0gPSBibGl0Y29vcmRzWzZdID0gR0VNX2Rlc2tfdy0xOwotCQkJYmxpdGNvb3Jkc1szXSA9IGJsaXRjb29yZHNbN10gPSBHRU1fZGVza195LTE7Ci0KLQkJCXZyb19jcHlmbShWRElfaGFuZGxlLCBTX09OTFksIGJsaXRjb29yZHMsICZWRElfZHN0X21mZGIsICZtZmRiX3NyYyk7Ci0JCX0KLQotCQlHRU1fbG9ja2VkPVNETF9UUlVFOwotCX0KLX0KLQotc3RhdGljIHZvaWQgR0VNX1VubG9ja1NjcmVlbihfVEhJUykKLXsKLQlpZiAoR0VNX2xvY2tlZCkgewotCQkvKiBSZXN0b3JlIG1lbnUgYmFyICovCi0JCWlmIChHRU1fbWVudWJhcikgewotCQkJTUZEQiBtZmRiX3NyYzsKLQkJCXNob3J0IGJsaXRjb29yZHNbOF07Ci0KLQkJCW1mZGJfc3JjLmZkX2FkZHI9R0VNX21lbnViYXI7Ci0JCQltZmRiX3NyYy5mZF93PUdFTV9kZXNrX3c7Ci0JCQltZmRiX3NyYy5mZF9oPUdFTV9kZXNrX3k7Ci0JCQltZmRiX3NyYy5mZF93ZHdpZHRoPUdFTV9kZXNrX3c+PjQ7Ci0JCQltZmRiX3NyYy5mZF9ucGxhbmVzPVZESV9icHA7Ci0JCQltZmRiX3NyYy5mZF9zdGFuZD0KLQkJCQltZmRiX3NyYy5mZF9yMT0KLQkJCQltZmRiX3NyYy5mZF9yMj0KLQkJCQltZmRiX3NyYy5mZF9yMz0gMDsKLQotCQkJYmxpdGNvb3Jkc1swXSA9IGJsaXRjb29yZHNbNF0gPSAwOwotCQkJYmxpdGNvb3Jkc1sxXSA9IGJsaXRjb29yZHNbNV0gPSAwOwotCQkJYmxpdGNvb3Jkc1syXSA9IGJsaXRjb29yZHNbNl0gPSBHRU1fZGVza193LTE7Ci0JCQlibGl0Y29vcmRzWzNdID0gYmxpdGNvb3Jkc1s3XSA9IEdFTV9kZXNrX3ktMTsKLQotCQkJdnJvX2NweWZtKFZESV9oYW5kbGUsIFNfT05MWSwgYmxpdGNvb3JkcywgJm1mZGJfc3JjLCAmVkRJX2RzdF9tZmRiKTsKLQkJfQotCi0JCS8qIFJlc3RvcmUgc2NyZWVuIG1lbW9yeSwgYW5kIHNlbmQgUkVEUkFXIHRvIGFsbCBhcHBzICovCi0JCWZvcm1fZGlhbCggRk1EX0ZJTklTSCwgMCwwLDAsMCwgMCwwLFZESV93LFZESV9oKTsKLQkJLyogVW5sb2NrIEFFUyAqLwotCQl3aW5kX3VwZGF0ZShFTkRfTUNUUkwpOwotCQl3aW5kX3VwZGF0ZShFTkRfVVBEQVRFKTsKLQotCQlHRU1fbG9ja2VkPVNETF9GQUxTRTsKLQl9Ci19Ci0KLVNETF9TdXJmYWNlICpHRU1fU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLQlVaW50MzIgbW9kZWZsYWdzLCBzY3JlZW5zaXplOwotCVNETF9ib29sIHVzZV9zaGFkb3cxLCB1c2Vfc2hhZG93MjsKLQotCS8qIHdpZHRoIG11c3QgYmUgbXVsdGlwbGUgb2YgMTYsIGZvciB2cm9fY3B5Zm0oKSBhbmQgYzJwX2NvbnZlcnQoKSAqLwotCWlmICgod2lkdGggJiAxNSkgIT0gMCkgewotCQl3aWR0aCA9ICh3aWR0aCB8IDE1KSArMTsKLQl9Ci0KLQkvKi0tLSBWZXJpZnkgaWYgYXNrZWQgbW9kZSBjYW4gYmUgdXNlZCAtLS0qLwotCWlmIChWRElfYnBwICE9IGJwcCkgewotCQlTRExfU2V0RXJyb3IoIiVkIGJwcCBtb2RlIG5vdCBzdXBwb3J0ZWQiLCBicHApOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pIHsKLQkJaWYgKChWRElfdyA8IHdpZHRoKSB8fCAoVkRJX2ggPCBoZWlnaHQpKSB7Ci0JCQlTRExfU2V0RXJyb3IoIiVkeCVkIG1vZGUgaXMgdG9vIGxhcmdlIiwgd2lkdGgsIGhlaWdodCk7Ci0JCQlyZXR1cm4oTlVMTCk7Ci0JCX0KLQl9Ci0KLQkvKi0tLSBBbGxvY2F0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgdGhlIHNjcmVlbiAtLS0qLwotCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBWRElfYnBwLCBWRElfcmVkbWFzaywgVkRJX2dyZWVubWFzaywgVkRJX2JsdWVtYXNrLCBWRElfYWxwaGFtYXNrKSApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciByZXF1ZXN0ZWQgbW9kZSIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0Jc2NyZWVuc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogVkRJX3BpeGVsc2l6ZTsKLQotI2lmZGVmIERFQlVHX1ZJREVPX0dFTQotCXByaW50Zigic2RsOnZpZGVvOmdlbTogc2V0dmlkZW9tb2RlKCk6ICVkeCVkeCVkID0gJWRcbiIsIHdpZHRoLCBoZWlnaHQsIGJwcCwgc2NyZWVuc2l6ZSk7Ci0jZW5kaWYKLQotCS8qLS0tIEFsbG9jYXRlIHNoYWRvdyBidWZmZXJzIGlmIG5lZWRlZCwgYW5kIGNvbnZlcnNpb24gb3BlcmF0aW9ucyAtLS0qLwotCUdFTV9GcmVlQnVmZmVycyh0aGlzKTsKLQotCUdFTV9idWZvcHM9MDsKLQl1c2Vfc2hhZG93MT11c2Vfc2hhZG93Mj1TRExfRkFMU0U7Ci0JaWYgKFZESV9zY3JlZW4gJiYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pKSB7Ci0JCWlmIChWRElfZm9ybWF0PT1WRElfRk9STUFUX0lOVEVSKSB7Ci0JCQl1c2Vfc2hhZG93MT1TRExfVFJVRTsKLQkJCUdFTV9idWZvcHMgPSBCMlNfQzJQXzFUT1M7Ci0JCX0KLQl9IGVsc2UgewotCQl1c2Vfc2hhZG93MT1TRExfVFJVRTsKLQkJaWYgKFZESV9mb3JtYXQ9PVZESV9GT1JNQVRfUEFDSykgewotCQkJR0VNX2J1Zm9wcyA9IEIyU19WUk9DUFlGTV8xVE9TOwotCQl9IGVsc2UgewotCQkJdXNlX3NoYWRvdzI9U0RMX1RSVUU7Ci0JCQlHRU1fYnVmb3BzID0gQjJTX0MyUF8xVE8yfEIyU19WUk9DUFlGTV8yVE9TOwotCQl9Ci0JfQotCi0JaWYgKHVzZV9zaGFkb3cxKSB7Ci0JCUdFTV9idWZmZXIxID0gQXRhcmlfU3lzTWFsbG9jKHNjcmVlbnNpemUsIE1YX1BSRUZUVFJBTSk7Ci0JCWlmIChHRU1fYnVmZmVyMT09TlVMTCkgewotCQkJU0RMX1NldEVycm9yKCJDYW4gbm90IGFsbG9jYXRlICVkIEtCIGZvciBmcmFtZSBidWZmZXIiLCBzY3JlZW5zaXplPj4xMCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlTRExfbWVtc2V0KEdFTV9idWZmZXIxLCAwLCBzY3JlZW5zaXplKTsKLSNpZmRlZiBERUJVR19WSURFT19HRU0KLQkJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBzZXR2aWRlb21vZGUoKTogYWxsb2NhdGVkIGJ1ZmZlciAxXG4iKTsKLSNlbmRpZgotCX0KLQotCWlmICh1c2Vfc2hhZG93MikgewotCQlHRU1fYnVmZmVyMiA9IEF0YXJpX1N5c01hbGxvYyhzY3JlZW5zaXplLCBNWF9QUkVGVFRSQU0pOwotCQlpZiAoR0VNX2J1ZmZlcjI9PU5VTEwpIHsKLQkJCVNETF9TZXRFcnJvcigiQ2FuIG5vdCBhbGxvY2F0ZSAlZCBLQiBmb3Igc2hhZG93IGJ1ZmZlciIsIHNjcmVlbnNpemU+PjEwKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVNETF9tZW1zZXQoR0VNX2J1ZmZlcjIsIDAsIHNjcmVlbnNpemUpOwotI2lmZGVmIERFQlVHX1ZJREVPX0dFTQotCQlwcmludGYoInNkbDp2aWRlbzpnZW06IHNldHZpZGVvbW9kZSgpOiBhbGxvY2F0ZWQgYnVmZmVyIDJcbiIpOwotI2VuZGlmCi0JfQotCi0JLyotLS0gSW5pdGlhbGl6ZSBzY3JlZW4gLS0tKi8KLQltb2RlZmxhZ3MgPSBTRExfUFJFQUxMT0M7Ci0JaWYgKFZESV9icHAgPT0gOCkgewotCQltb2RlZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKLQl9Ci0KLQlpZiAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgewotCQlHRU1fTG9ja1NjcmVlbih0aGlzKTsKLQotCQlHRU1fQ2xlYXJTY3JlZW4odGhpcyk7Ci0KLQkJbW9kZWZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOwotCQlpZiAoVkRJX3NjcmVlbiAmJiAoVkRJX2Zvcm1hdD09VkRJX0ZPUk1BVF9QQUNLKSAmJiAhdXNlX3NoYWRvdzEpIHsKLQkJCW1vZGVmbGFncyB8PSBTRExfSFdTVVJGQUNFOwotCQl9IGVsc2UgewotCQkJbW9kZWZsYWdzIHw9IFNETF9TV1NVUkZBQ0U7Ci0JCX0KLQotCQlHRU1fZnVsbHNjcmVlbiA9IFNETF9UUlVFOwotCX0gZWxzZSB7Ci0JCWludCBvbGRfd2luX3R5cGU7Ci0JCXNob3J0IHgyLHkyLHcyLGgyOwotCi0JCUdFTV9VbmxvY2tTY3JlZW4odGhpcyk7Ci0KLQkJLyogU2V0IHdpbmRvdyBnYWRnZXRzICovCi0JCW9sZF93aW5fdHlwZSA9IEdFTV93aW5fdHlwZTsKLQkJaWYgKCEoZmxhZ3MgJiBTRExfTk9GUkFNRSkpIHsKLQkJCUdFTV93aW5fdHlwZT1OQU1FfE1PVkVSfENMT1NFUnxTTUFMTEVSOwotCQkJaWYgKGZsYWdzICYgU0RMX1JFU0laQUJMRSkgewotCQkJCUdFTV93aW5fdHlwZSB8PSBGVUxMRVJ8U0laRVI7Ci0JCQkJbW9kZWZsYWdzIHw9IFNETF9SRVNJWkFCTEU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlHRU1fd2luX3R5cGU9MDsKLQkJCW1vZGVmbGFncyB8PSBTRExfTk9GUkFNRTsKLQkJfQotCQltb2RlZmxhZ3MgfD0gU0RMX1NXU1VSRkFDRTsKLQotCQkvKiBSZWNyZWF0ZSB3aW5kb3cgPyBvbmx5IGZvciBkaWZmZXJlbnQgd2lkZ2V0IG9yIG5vbi1jcmVhdGVkIHdpbmRvdyAqLwotCQlpZiAoKG9sZF93aW5fdHlwZSAhPSBHRU1fd2luX3R5cGUpIHx8IChHRU1faGFuZGxlIDwgMCkpIHsKLQkJCS8qIENhbGN1bGF0ZSB3aW5kb3cgc2l6ZSAqLwotCQkJaWYgKCF3aW5kX2NhbGMoV0NfQk9SREVSLCBHRU1fd2luX3R5cGUsIDAsMCx3aWR0aCxoZWlnaHQsICZ4MiwmeTIsJncyLCZoMikpIHsKLQkJCQlHRU1fRnJlZUJ1ZmZlcnModGhpcyk7Ci0JCQkJU0RMX1NldEVycm9yKCJDYW4gbm90IGNhbGN1bGF0ZSB3aW5kb3cgYXR0cmlidXRlcyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCi0JCQkvKiBDZW50ZXIgd2luZG93ICovCi0JCQl4MiA9IChHRU1fZGVza193LXcyKT4+MTsKLQkJCXkyID0gKEdFTV9kZXNrX2gtaDIpPj4xOwotCQkJaWYgKHgyPDApIHsKLQkJCQl4MiA9IDA7Ci0JCQl9Ci0JCQlpZiAoeTI8MCkgewotCQkJCXkyID0gMDsKLQkJCX0KLQkJCXgyICs9IEdFTV9kZXNrX3g7Ci0JCQl5MiArPSBHRU1fZGVza195OwotCi0JCQkvKiBEZXN0cm95IGV4aXN0aW5nIHdpbmRvdyAqLwotCQkJaWYgKEdFTV9oYW5kbGUgPj0gMCkgewotCQkJCXdpbmRfY2xvc2UoR0VNX2hhbmRsZSk7Ci0JCQkJd2luZF9kZWxldGUoR0VNX2hhbmRsZSk7Ci0JCQl9Ci0KLQkJCS8qIENyZWF0ZSB3aW5kb3cgKi8KLQkJCUdFTV9oYW5kbGU9d2luZF9jcmVhdGUoR0VNX3dpbl90eXBlLCB4Mix5Mix3MixoMik7Ci0JCQlpZiAoR0VNX2hhbmRsZTwwKSB7Ci0JCQkJR0VNX0ZyZWVCdWZmZXJzKHRoaXMpOwotCQkJCVNETF9TZXRFcnJvcigiQ2FuIG5vdCBjcmVhdGUgd2luZG93Iik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0KLSNpZmRlZiBERUJVR19WSURFT19HRU0KLQkJCXByaW50Zigic2RsOnZpZGVvOmdlbTogaGFuZGxlPSVkXG4iLCBHRU1faGFuZGxlKTsKLSNlbmRpZgotCi0JCQkvKiBTZXR1cCB3aW5kb3cgbmFtZSAqLwotCQkJd2luZF9zZXQoR0VNX2hhbmRsZSxXRl9OQU1FLChzaG9ydCkoKCh1bnNpZ25lZCBsb25nKUdFTV90aXRsZV9uYW1lKT4+MTYpLChzaG9ydCkoKCh1bnNpZ25lZCBsb25nKUdFTV90aXRsZV9uYW1lKSAmIDB4ZmZmZiksMCwwKTsKLQkJCUdFTV9yZWZyZXNoX25hbWUgPSBTRExfRkFMU0U7Ci0KLQkJCS8qIE9wZW4gdGhlIHdpbmRvdyAqLwotCQkJd2luZF9vcGVuKEdFTV9oYW5kbGUseDIseTIsdzIsaDIpOwotCQl9IGVsc2UgewotCQkJLyogUmVzaXplIHdpbmRvdyB0byBmaXQgYXNrZWQgdmlkZW8gbW9kZSAqLwotCQkJd2luZF9nZXQgKEdFTV9oYW5kbGUsIFdGX1dPUktYWVdILCAmeDIsJnkyLCZ3MiwmaDIpOwotCQkJaWYgKHdpbmRfY2FsYyhXQ19CT1JERVIsIEdFTV93aW5fdHlwZSwgeDIseTIsd2lkdGgsaGVpZ2h0LCAmeDIsJnkyLCZ3MiwmaDIpKSB7Ci0JCQkJd2luZF9zZXQgKEdFTV9oYW5kbGUsIFdGX0NVUlJYWVdILCB4Mix5Mix3MixoMik7Ci0JCQl9Ci0JCX0KLQotCQlHRU1fZnVsbHNjcmVlbiA9IFNETF9GQUxTRTsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCi0JY3VycmVudC0+dyA9IHdpZHRoOwotCWN1cnJlbnQtPmggPSBoZWlnaHQ7Ci0JaWYgKHVzZV9zaGFkb3cxKSB7Ci0JCWN1cnJlbnQtPnBpeGVscyA9IEdFTV9idWZmZXIxOwotCQljdXJyZW50LT5waXRjaCA9IHdpZHRoICogVkRJX3BpeGVsc2l6ZTsKLQl9IGVsc2UgewotCQljdXJyZW50LT5waXhlbHMgPSBWRElfc2NyZWVuOwotCQljdXJyZW50LT5waXRjaCA9IFZESV9waXRjaDsKLQl9Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0JaWYgKGZsYWdzICYgU0RMX09QRU5HTCkgewotCQlpZiAoIVNETF9BdGFyaUdMX0luaXQodGhpcywgY3VycmVudCkpIHsKLQkJCUdFTV9GcmVlQnVmZmVycyh0aGlzKTsKLQkJCVNETF9TZXRFcnJvcigiQ2FuIG5vdCBjcmVhdGUgT3BlbkdMIGNvbnRleHQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJbW9kZWZsYWdzIHw9IFNETF9PUEVOR0w7Ci0JfQotI2VuZGlmCi0KLQljdXJyZW50LT5mbGFncyA9IG1vZGVmbGFnczsKLQotI2lmZGVmIERFQlVHX1ZJREVPX0dFTQotCXByaW50Zigic2RsOnZpZGVvOmdlbTogc3VyZmFjZTogJWR4JWRcbiIsIGN1cnJlbnQtPncsIGN1cnJlbnQtPmgpOwotI2VuZGlmCi0KLQl0aGlzLT5VcGRhdGVSZWN0cyA9IEdFTV9VcGRhdGVSZWN0czsKLQlHRU1fbG9ja19yZWRyYXcgPSBTRExfRkFMU0U7CS8qIEVuYWJsZSByZWRyYXcgKi8KLQotCS8qIFdlJ3JlIGRvbmUgKi8KLQlyZXR1cm4oY3VycmVudCk7Ci19Ci0KLXN0YXRpYyBpbnQgR0VNX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIEdFTV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgR0VNX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgR0VNX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBHRU1fVXBkYXRlUmVjdHNGdWxsc2NyZWVuKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLQlTRExfU3VyZmFjZSAqc3VyZmFjZTsKLQlpbnQgaSwgc3VyZl93aWR0aDsKLQotCXN1cmZhY2UgPSB0aGlzLT5zY3JlZW47Ci0JLyogTmVlZCB0byBiZSBhIG11bHRpcGxlIG9mIDE2IHBpeGVscyAqLwotCXN1cmZfd2lkdGg9c3VyZmFjZS0+dzsKLQlpZiAoKHN1cmZfd2lkdGggJiAxNSkgIT0gMCkgewotCQlzdXJmX3dpZHRoID0gKHN1cmZfd2lkdGggfCAxNSkgKyAxOwotCX0KLQotCWlmIChHRU1fYnVmb3BzICYgKEIyU19DMlBfMVRPMnxCMlNfQzJQXzFUT1MpKSB7Ci0JCXZvaWQgKmRlc3RzY3I7Ci0JCWludCBkZXN0cGl0Y2g7Ci0KLQkJaWYgKEdFTV9idWZvcHMgJiBCMlNfQzJQXzFUT1MpIHsKLQkJCWRlc3RzY3IgPSBWRElfc2NyZWVuOwotCQkJZGVzdHBpdGNoID0gVkRJX3BpdGNoOwotCQl9IGVsc2UgewotCQkJZGVzdHNjciA9IEdFTV9idWZmZXIyOwotCQkJZGVzdHBpdGNoID0gc3VyZmFjZS0+cGl0Y2g7Ci0JCX0KLQotCQlmb3IgKGk9MDtpPG51bXJlY3RzO2krKykgewotCQkJdm9pZCAqc291cmNlLCpkZXN0aW5hdGlvbjsKLQkJCWludCB4MSx4MjsKLQotCQkJeDEgPSByZWN0c1tpXS54ICYgfjE1OwotCQkJeDIgPSByZWN0c1tpXS54K3JlY3RzW2ldLnc7Ci0JCQlpZiAoeDIgJiAxNSkgewotCQkJCXgyID0gKHgyIHwgMTUpICsxOwotCQkJfQotCi0JCQlzb3VyY2UgPSBzdXJmYWNlLT5waXhlbHM7Ci0JCQlzb3VyY2UgKz0gc3VyZmFjZS0+cGl0Y2ggKiByZWN0c1tpXS55OwotCQkJc291cmNlICs9IHgxOwotCi0JCQlkZXN0aW5hdGlvbiA9IGRlc3RzY3I7Ci0JCQlkZXN0aW5hdGlvbiArPSBkZXN0cGl0Y2ggKiByZWN0c1tpXS55OwotCQkJZGVzdGluYXRpb24gKz0geDE7Ci0KLQkJCVNETF9BdGFyaV9DMnBDb252ZXJ0KAotCQkJCXNvdXJjZSwgZGVzdGluYXRpb24sCi0JCQkJeDIteDEsIHJlY3RzW2ldLmgsCi0JCQkJU0RMX0ZBTFNFLAotCQkJCXN1cmZhY2UtPnBpdGNoLCBkZXN0cGl0Y2gKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlpZiAoR0VNX2J1Zm9wcyAmIChCMlNfVlJPQ1BZRk1fMVRPU3xCMlNfVlJPQ1BZRk1fMlRPUykpIHsKLQkJTUZEQiBtZmRiX3NyYzsKLQkJc2hvcnQgYmxpdGNvb3Jkc1s4XTsKLQotCQltZmRiX3NyYy5mZF9hZGRyPXN1cmZhY2UtPnBpeGVsczsKLQkJbWZkYl9zcmMuZmRfdz1zdXJmX3dpZHRoOwotCQltZmRiX3NyYy5mZF9oPXN1cmZhY2UtPmg7Ci0JCW1mZGJfc3JjLmZkX3dkd2lkdGg9IChzdXJmYWNlLT5waXRjaC9WRElfcGl4ZWxzaXplKSA+PiA0OwotCQltZmRiX3NyYy5mZF9ucGxhbmVzPXN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCQltZmRiX3NyYy5mZF9zdGFuZD0KLQkJCW1mZGJfc3JjLmZkX3IxPQotCQkJbWZkYl9zcmMuZmRfcjI9Ci0JCQltZmRiX3NyYy5mZF9yMz0gMDsKLQkJaWYgKEdFTV9idWZvcHMgJiBCMlNfVlJPQ1BZRk1fMlRPUykgewotCQkJbWZkYl9zcmMuZmRfYWRkcj1HRU1fYnVmZmVyMjsKLQkJfQotCi0JCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgewotCQkJYmxpdGNvb3Jkc1swXSA9IGJsaXRjb29yZHNbNF0gPSByZWN0c1tpXS54OwotCQkJYmxpdGNvb3Jkc1sxXSA9IGJsaXRjb29yZHNbNV0gPSByZWN0c1tpXS55OwotCQkJYmxpdGNvb3Jkc1syXSA9IGJsaXRjb29yZHNbNl0gPSByZWN0c1tpXS54ICsgcmVjdHNbaV0udyAtIDE7Ci0JCQlibGl0Y29vcmRzWzNdID0gYmxpdGNvb3Jkc1s3XSA9IHJlY3RzW2ldLnkgKyByZWN0c1tpXS5oIC0gMTsKLQotCQkJdnJvX2NweWZtKFZESV9oYW5kbGUsIFNfT05MWSwgYmxpdGNvb3JkcywgJm1mZGJfc3JjLCAmVkRJX2RzdF9tZmRiKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgR0VNX1VwZGF0ZVJlY3RzV2luZG93ZWQoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCXNob3J0IHB4eVs0XSwgd2luZF9weHlbNF07Ci0JaW50IGk7Ci0KLQlpZiAod2luZF9nZXQoR0VNX2hhbmRsZSwgV0ZfV09SS1hZV0gsICZ3aW5kX3B4eVswXSwgJndpbmRfcHh5WzFdLCAmd2luZF9weHlbMl0sICZ3aW5kX3B4eVszXSk9PTApIHsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgewotCQlweHlbMF0gPSB3aW5kX3B4eVswXSArIHJlY3RzW2ldLng7Ci0JCXB4eVsxXSA9IHdpbmRfcHh5WzFdICsgcmVjdHNbaV0ueTsKLQkJcHh5WzJdID0gcmVjdHNbaV0udzsKLQkJcHh5WzNdID0gcmVjdHNbaV0uaDsKLQotCQlHRU1fd2luZF9yZWRyYXcodGhpcywgR0VNX2hhbmRsZSwgcHh5KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEdFTV9VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JU0RMX1N1cmZhY2UgKnN1cmZhY2U7Ci0KLQlpZiAoR0VNX2xvY2tfcmVkcmF3KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlzdXJmYWNlID0gdGhpcy0+c2NyZWVuOwotCi0JaWYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pIHsKLQkJR0VNX1VwZGF0ZVJlY3RzRnVsbHNjcmVlbih0aGlzLCBudW1yZWN0cywgcmVjdHMpOwotCX0gZWxzZSB7Ci0JCUdFTV9VcGRhdGVSZWN0c1dpbmRvd2VkKHRoaXMsIG51bXJlY3RzLCByZWN0cyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IEdFTV9GbGlwSFdTdXJmYWNlRnVsbHNjcmVlbihfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaW50IHN1cmZfd2lkdGg7Ci0KLQkvKiBOZWVkIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYgcGl4ZWxzICovCi0Jc3VyZl93aWR0aD1zdXJmYWNlLT53OwotCWlmICgoc3VyZl93aWR0aCAmIDE1KSAhPSAwKSB7Ci0JCXN1cmZfd2lkdGggPSAoc3VyZl93aWR0aCB8IDE1KSArIDE7Ci0JfQotCi0JaWYgKEdFTV9idWZvcHMgJiAoQjJTX0MyUF8xVE8yfEIyU19DMlBfMVRPUykpIHsKLQkJdm9pZCAqZGVzdHNjcjsKLQkJaW50IGRlc3RwaXRjaDsKLQotCQlpZiAoR0VNX2J1Zm9wcyAmIEIyU19DMlBfMVRPUykgewotCQkJZGVzdHNjciA9IFZESV9zY3JlZW47Ci0JCQlkZXN0cGl0Y2ggPSBWRElfcGl0Y2g7Ci0JCX0gZWxzZSB7Ci0JCQlkZXN0c2NyID0gR0VNX2J1ZmZlcjI7Ci0JCQlkZXN0cGl0Y2ggPSBzdXJmYWNlLT5waXRjaDsKLQkJfQotCi0JCVNETF9BdGFyaV9DMnBDb252ZXJ0KAotCQkJc3VyZmFjZS0+cGl4ZWxzLCBkZXN0c2NyLAotCQkJc3VyZl93aWR0aCwgc3VyZmFjZS0+aCwKLQkJCVNETF9GQUxTRSwKLQkJCXN1cmZhY2UtPnBpdGNoLCBkZXN0cGl0Y2gKLQkJKTsKLQl9Ci0KLQlpZiAoR0VNX2J1Zm9wcyAmIChCMlNfVlJPQ1BZRk1fMVRPU3xCMlNfVlJPQ1BZRk1fMlRPUykpIHsKLQkJTUZEQiBtZmRiX3NyYzsKLQkJc2hvcnQgYmxpdGNvb3Jkc1s4XTsKLQotCQltZmRiX3NyYy5mZF93PXN1cmZfd2lkdGg7Ci0JCW1mZGJfc3JjLmZkX2g9c3VyZmFjZS0+aDsKLQkJbWZkYl9zcmMuZmRfd2R3aWR0aD1tZmRiX3NyYy5mZF93ID4+IDQ7Ci0JCW1mZGJfc3JjLmZkX25wbGFuZXM9c3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7Ci0JCW1mZGJfc3JjLmZkX3N0YW5kPQotCQkJbWZkYl9zcmMuZmRfcjE9Ci0JCQltZmRiX3NyYy5mZF9yMj0KLQkJCW1mZGJfc3JjLmZkX3IzPSAwOwotCQlpZiAoR0VNX2J1Zm9wcyAmIEIyU19WUk9DUFlGTV8xVE9TKSB7Ci0JCQltZmRiX3NyYy5mZF9hZGRyPXN1cmZhY2UtPnBpeGVsczsKLQkJfSBlbHNlIHsKLQkJCW1mZGJfc3JjLmZkX2FkZHI9R0VNX2J1ZmZlcjI7Ci0JCX0KLQotCQlibGl0Y29vcmRzWzBdID0gYmxpdGNvb3Jkc1s0XSA9IDA7Ci0JCWJsaXRjb29yZHNbMV0gPSBibGl0Y29vcmRzWzVdID0gMDsKLQkJYmxpdGNvb3Jkc1syXSA9IGJsaXRjb29yZHNbNl0gPSBzdXJmYWNlLT53IC0gMTsKLQkJYmxpdGNvb3Jkc1szXSA9IGJsaXRjb29yZHNbN10gPSBzdXJmYWNlLT5oIC0gMTsKLQotCQl2cm9fY3B5Zm0oVkRJX2hhbmRsZSwgU19PTkxZLCBibGl0Y29vcmRzLCAmbWZkYl9zcmMsICZWRElfZHN0X21mZGIpOwotCX0KLQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBHRU1fRmxpcEhXU3VyZmFjZVdpbmRvd2VkKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlzaG9ydAlweHlbOF07Ci0KLQkvKiBVcGRhdGUgdGhlIHdob2xlIHdpbmRvdyAqLwotCXdpbmRfZ2V0KEdFTV9oYW5kbGUsIFdGX1dPUktYWVdILCAmcHh5WzBdLCAmcHh5WzFdLCAmcHh5WzJdLCAmcHh5WzNdKTsKLQotCUdFTV93aW5kX3JlZHJhdyh0aGlzLCBHRU1faGFuZGxlLCBweHkpOwotCi0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IEdFTV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpZiAoR0VNX2xvY2tfcmVkcmF3KSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQlpZiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgewotCQlyZXR1cm4gR0VNX0ZsaXBIV1N1cmZhY2VGdWxsc2NyZWVuKHRoaXMsIHN1cmZhY2UpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBHRU1fRmxpcEhXU3VyZmFjZVdpbmRvd2VkKHRoaXMsIHN1cmZhY2UpOwotCX0KLX0KLQotc3RhdGljIGludCBHRU1fU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQotewotCWludCBpOwotCVNETF9TdXJmYWNlICpzdXJmYWNlOwotCi0jaWZkZWYgREVCVUdfVklERU9fR0VNCi0JcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBzZXRjb2xvcnMoKVxuIik7Ci0jZW5kaWYKLQotCS8qIERvIG5vdCBjaGFuZ2UgcGFsZXR0ZSBpbiBUcnVlIENvbG91ciAqLwotCXN1cmZhY2UgPSB0aGlzLT5zY3JlZW47Ci0JaWYgKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsID4gOCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQlmb3IoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspCi0JewotCQlpbnQJCXIsIGcsIGI7Ci0JCXNob3J0CXJnYlszXTsKLQotCQlyID0gY29sb3JzW2ldLnI7Ci0JCWcgPSBjb2xvcnNbaV0uZzsKLQkJYiA9IGNvbG9yc1tpXS5iOwotCi0JCXJnYlswXSA9IFZESV9jdXJwYWxldHRlW2ldWzBdID0gKDEwMDAgKiByKSAvIDI1NTsKLQkJcmdiWzFdID0gVkRJX2N1cnBhbGV0dGVbaV1bMV0gPSgxMDAwICogZykgLyAyNTU7Ci0JCXJnYlsyXSA9IFZESV9jdXJwYWxldHRlW2ldWzJdID0oMTAwMCAqIGIpIC8gMjU1OwotCi0JCXZzX2NvbG9yKFZESV9oYW5kbGUsIHZkaV9pbmRleFtmaXJzdGNvbG9yK2ldLCByZ2IpOwotCX0KLQotCXJldHVybigxKTsKLX0KLQotI2lmIDAKLXN0YXRpYyBpbnQgR0VNX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBvbikKLXsKLQlpZiAob24pIHsKLQkJR0VNX0xvY2tTY3JlZW4odGhpcyk7Ci0JfSBlbHNlIHsKLQkJR0VNX1VubG9ja1NjcmVlbih0aGlzKTsKLQl9Ci0KLQlyZXR1cm4oMSk7Ci19Ci0jZW5kaWYKLQotLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCi0gICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCi0qLwotdm9pZCBHRU1fVmlkZW9RdWl0KF9USElTKQotewotCVNETF9BdGFyaVhiaW9zX1Jlc3RvcmVWZWN0b3JzKCk7Ci0JaWYgKEdFTV91c2VkZXZtb3VzZSkgewotCQlTRExfQXRhcmlEZXZNb3VzZV9DbG9zZSgpOwotCX0KLQotCUdFTV9GcmVlQnVmZmVycyh0aGlzKTsKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLQlpZiAoZ2xfYWN0aXZlKSB7Ci0JCVNETF9BdGFyaUdMX1F1aXQodGhpcywgU0RMX1RSVUUpOwotCX0KLSNlbmRpZgotCi0JLyogRGVzdHJveSB3aW5kb3cgKi8KLQlpZiAoR0VNX2hhbmRsZT49MCkgewotCQl3aW5kX2Nsb3NlKEdFTV9oYW5kbGUpOwotCQl3aW5kX2RlbGV0ZShHRU1faGFuZGxlKTsKLQkJR0VNX2hhbmRsZT0tMTsKLQl9Ci0KLQlHRU1fVW5sb2NrU2NyZWVuKHRoaXMpOwotCWlmIChHRU1fbWVudWJhcikgewotCQlNZnJlZShHRU1fbWVudWJhcik7Ci0JCUdFTV9tZW51YmFyPU5VTEw7Ci0JfQotCi0JYXBwbF9leGl0KCk7Ci0KLQlHRU1fU2V0TmV3UGFsZXR0ZSh0aGlzLCBWRElfb2xkcGFsZXR0ZSk7Ci0KLQkvKiBDbG9zZSBWREkgd29ya3N0YXRpb24gKi8KLQlpZiAoVkRJX2hhbmRsZSkgewotCQl2X2Nsc3Z3ayhWRElfaGFuZGxlKTsKLQl9Ci0KLQkvKiBGcmVlIG1vZGUgbGlzdCAqLwotCWlmIChTRExfbW9kZWxpc3RbMF0pIHsKLQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0WzBdKTsKLQkJU0RMX21vZGVsaXN0WzBdPU5VTEw7Ci0JfQotCi0JdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOwkKLX0KLQotdm9pZCBHRU1fd2luZF9yZWRyYXcoX1RISVMsIGludCB3aW5oYW5kbGUsIHNob3J0ICppbnNpZGUpCi17Ci0Jc2hvcnQgdG9kb1s0XTsKLQotCS8qIFRlbGwgQUVTIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgKi8KLQl3aW5kX3VwZGF0ZShCRUdfVVBEQVRFKTsKLQotCXZfaGlkZV9jKFZESV9oYW5kbGUpOwotCi0JLyogQnJvd3NlIHRoZSByZWN0YW5nbGUgbGlzdCB0byByZWRyYXcgKi8KLQlpZiAod2luZF9nZXQod2luaGFuZGxlLCBXRl9GSVJTVFhZV0gsICZ0b2RvWzBdLCAmdG9kb1sxXSwgJnRvZG9bMl0sICZ0b2RvWzNdKSE9MCkgewotCi0JCXdoaWxlICh0b2RvWzJdICYmIHRvZG9bM10pIHsKLQotCQkJaWYgKHJjX2ludGVyc2VjdCgoR1JFQ1QgKilpbnNpZGUsKEdSRUNUICopdG9kbykpIHsKLQkJCQl0b2RvWzJdICs9IHRvZG9bMF0tMTsKLQkJCQl0b2RvWzNdICs9IHRvZG9bMV0tMTsKLQkJCQlyZWZyZXNoX3dpbmRvdyh0aGlzLCB3aW5oYW5kbGUsIHRvZG8pOwotCQkJfQotCi0JCQlpZiAod2luZF9nZXQod2luaGFuZGxlLCBXRl9ORVhUWFlXSCwgJnRvZG9bMF0sICZ0b2RvWzFdLCAmdG9kb1syXSwgJnRvZG9bM10pPT0wKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qIFVwZGF0ZSBmaW5pc2hlZCAqLwotCXdpbmRfdXBkYXRlKEVORF9VUERBVEUpOwotCi0Jdl9zaG93X2MoVkRJX2hhbmRsZSwxKTsKLX0KLQotc3RhdGljIHZvaWQgcmVmcmVzaF93aW5kb3coX1RISVMsIGludCB3aW5oYW5kbGUsIHNob3J0ICpyZWN0KQotewotCU1GREIgbWZkYl9zcmM7Ci0Jc2hvcnQgcHh5WzhdLHdpbmRfcHh5WzhdOwotCVNETF9TdXJmYWNlICpzdXJmYWNlOwotCWludCBpY29uaWZpZWQ7Ci0KLQkvKiBJcyB3aW5kb3cgaWNvbmlmaWVkID8gKi8KLQlpY29uaWZpZWQgPSAwOwotLyoJaWYgKEdFTV93ZmVhdHVyZXMgJiAoMTw8V0ZfSUNPTklGWSkpKi8gewotCQlpZiAod2luZF9nZXQod2luaGFuZGxlLCBXRl9JQ09OSUZZLCAmd2luZF9weHlbMF0sICZ3aW5kX3B4eVsxXSwgJndpbmRfcHh5WzJdLCAmd2luZF9weHlbM10pIT0wKSB7Ci0JCQlpY29uaWZpZWQgPSB3aW5kX3B4eVswXTsKLQkJfQotCX0KLQotCWlmICh3aW5kX2dldCh3aW5oYW5kbGUsIFdGX1dPUktYWVdILCAmd2luZF9weHlbMF0sICZ3aW5kX3B4eVsxXSwgJndpbmRfcHh5WzJdLCAmd2luZF9weHlbM10pPT0wKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaWNvbmlmaWVkICYmIEdFTV9pY29uKSB7Ci0JCXNob3J0IGljb25fcmVjdFs0XSwgZHN0X3JlY3RbNF07Ci0JCXNob3J0IGljb254LGljb255OwotCQkKLQkJc3VyZmFjZSA9IEdFTV9pY29uOwotCi0JCUdFTV9DbGVhclJlY3QodGhpcywgcmVjdCk7Ci0KLQkJLyogQ2FsY3VsYXRlIGNlbnRlcmVkIGljb24oeCx5LHcsaCkgcmVsYXRpdmUgdG8gd2luZG93ICovCi0JCWljb254ID0gKHdpbmRfcHh5WzJdLXN1cmZhY2UtPncpPj4xOwotCQlpY29ueSA9ICh3aW5kX3B4eVszXS1zdXJmYWNlLT5oKT4+MTsKLQotCQlpY29uX3JlY3RbMF0gPSBpY29ueDsKLQkJaWNvbl9yZWN0WzFdID0gaWNvbnk7Ci0JCWljb25fcmVjdFsyXSA9IHN1cmZhY2UtPnc7Ci0JCWljb25fcmVjdFszXSA9IHN1cmZhY2UtPmg7Ci0KLQkJLyogQ2FsY3VsYXRlIHJlZHJhdyByZWN0YW5nbGUoeCx5LHcsaCkgcmVsYXRpdmUgdG8gd2luZG93ICovCi0JCWRzdF9yZWN0WzBdID0gcmVjdFswXS13aW5kX3B4eVswXTsKLQkJZHN0X3JlY3RbMV0gPSByZWN0WzFdLXdpbmRfcHh5WzFdOwotCQlkc3RfcmVjdFsyXSA9IHJlY3RbMl0tcmVjdFswXSsxOwotCQlkc3RfcmVjdFszXSA9IHJlY3RbM10tcmVjdFsxXSsxOwotCi0JCS8qIERvZXMgdGhlIGljb24gcmVjdGFuZ2xlIG11c3QgYmUgcmVkcmF3biA/ICovCi0JCWlmICghcmNfaW50ZXJzZWN0KChHUkVDVCAqKWljb25fcmVjdCwgKEdSRUNUICopZHN0X3JlY3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotI2lmIERFQlVHX1ZJREVPX0dFTQotCQlwcmludGYoInNkbDp2aWRlbzpnZW06ICBjbGlwKDAsMCwlZCwlZCkgdG8gKCVkLCVkLCVkLCVkKVxuIiwKLQkJCXN1cmZhY2UtPnctMSxzdXJmYWNlLT5oLTEsIGRzdF9yZWN0WzBdLGRzdF9yZWN0WzFdLGRzdF9yZWN0WzJdLGRzdF9yZWN0WzNdKTsKLQkJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiAgaWNvbiglZCwlZCwlZCwlZClcbiIsCi0JCQlpY29uX3JlY3RbMF0sIGljb25fcmVjdFsxXSwgaWNvbl9yZWN0WzJdLCBpY29uX3JlY3RbM10pOwotCQlwcmludGYoInNkbDp2aWRlbzpnZW06IHJlZnJlc2hfd2luZG93KCk6IGRyYXcgaWNvblxuIik7Ci0jZW5kaWYKLQotCQkvKiBDYWxjdWxhdGUgaWNvbih4MSx5MSx4Mix5MikgcmVsYXRpdmUgdG8gc2NyZWVuICovCi0JCWljb25fcmVjdFswXSArPSB3aW5kX3B4eVswXTsKLQkJaWNvbl9yZWN0WzFdICs9IHdpbmRfcHh5WzFdOwotCQlpY29uX3JlY3RbMl0gKz0gaWNvbl9yZWN0WzBdLTE7Ci0JCWljb25fcmVjdFszXSArPSBpY29uX3JlY3RbMV0tMTsKLQotCQkvKiBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uIHJlY3RhbmdsZSB0byByZWRyYXcgKi8KLQkJcHh5WzRdPXB4eVswXT1NQVgoaWNvbl9yZWN0WzBdLHJlY3RbMF0pOwotCQlweHlbNV09cHh5WzFdPU1BWChpY29uX3JlY3RbMV0scmVjdFsxXSk7Ci0gCQlweHlbNl09cHh5WzJdPU1JTihpY29uX3JlY3RbMl0scmVjdFsyXSk7Ci0JIAlweHlbN109cHh5WzNdPU1JTihpY29uX3JlY3RbM10scmVjdFszXSk7Ci0KLQkJLyogQ2FsY3VsYXRlIGljb24gc291cmNlIGltYWdlIHBvcyByZWxhdGl2ZSB0byB3aW5kb3cgKi8KLQkJcHh5WzBdIC09IHdpbmRfcHh5WzBdK2ljb254OwotCQlweHlbMV0gLT0gd2luZF9weHlbMV0raWNvbnk7Ci0JCXB4eVsyXSAtPSB3aW5kX3B4eVswXStpY29ueDsKLQkJcHh5WzNdIC09IHdpbmRfcHh5WzFdK2ljb255OwotCi0JfSBlbHNlIHsKLQkJc3VyZmFjZSA9IHRoaXMtPnNjcmVlbjsKLQotI2lmIERFQlVHX1ZJREVPX0dFTQotCQlwcmludGYoInNkbDp2aWRlbzpnZW06IHJlZnJlc2hfd2luZG93KCk6IGRyYXcgZnJhbWUgYnVmZmVyXG4iKTsKLSNlbmRpZgotCi0JCS8qIFJlZHJhdyBhbGwgd2luZG93IGNvbnRlbnQgKi8KLQkJcHh5WzBdID0gcmVjdFswXS13aW5kX3B4eVswXTsKLQkJcHh5WzFdID0gcmVjdFsxXS13aW5kX3B4eVsxXTsKLQkgCXB4eVsyXSA9IHJlY3RbMl0td2luZF9weHlbMF07ICAgCi0JIAlweHlbM10gPSByZWN0WzNdLXdpbmRfcHh5WzFdOyAgCi0KLQkJcHh5WzRdID0gcmVjdFswXTsKLQkJcHh5WzVdID0gcmVjdFsxXTsKLQkJcHh5WzZdID0gcmVjdFsyXTsgIAotCQlweHlbN10gPSByZWN0WzNdOwotCX0KLQotCWlmIChHRU1fYnVmb3BzICYgQjJTX0MyUF8xVE8yKSB7Ci0JCXZvaWQgKnNyYywgKmRlc3Q7Ci0JCWludCB4MSx4MjsKLQotCQl4MSA9IChyZWN0WzBdLXdpbmRfcHh5WzBdKSAmIH4xNTsKLQkJeDIgPSByZWN0WzJdLXdpbmRfcHh5WzBdOwotCQlpZiAoeDIgJiAxNSkgewotCQkJeDIgPSAoeDIgfCAxNSkgKzE7Ci0JCX0KLQotCQlzcmMgPSBzdXJmYWNlLT5waXhlbHM7Ci0JCXNyYyArPSBzdXJmYWNlLT5waXRjaCAqIChyZWN0WzFdLXdpbmRfcHh5WzFdKTsKLQkJc3JjICs9IHgxOwotCi0JCWRlc3QgPSBHRU1fYnVmZmVyMjsKLQkJZGVzdCArPSBzdXJmYWNlLT5waXRjaCAqIChyZWN0WzFdLXdpbmRfcHh5WzFdKTsKLQkJZGVzdCArPSB4MTsKLQotCQlTRExfQXRhcmlfQzJwQ29udmVydCgKLQkJCXNyYywgZGVzdCwKLQkJCXgyLXgxLCByZWN0WzNdLXJlY3RbMV0rMSwKLQkJCVNETF9GQUxTRSwKLQkJCXN1cmZhY2UtPnBpdGNoLCBzdXJmYWNlLT5waXRjaAotCQkpOwotCX0KLQotCW1mZGJfc3JjLmZkX2FkZHI9c3VyZmFjZS0+cGl4ZWxzOwotCXsKLQkJaW50IHdpZHRoOwotCi0JCS8qIE5lZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNiBwaXhlbHMgKi8KLQkJd2lkdGg9c3VyZmFjZS0+dzsKLQkJaWYgKCh3aWR0aCAmIDE1KSAhPSAwKSB7Ci0JCQl3aWR0aCA9ICh3aWR0aCB8IDE1KSArIDE7Ci0JCX0KLQkJbWZkYl9zcmMuZmRfdz13aWR0aDsKLQl9Ci0JbWZkYl9zcmMuZmRfaD1zdXJmYWNlLT5oOwotICAJbWZkYl9zcmMuZmRfbnBsYW5lcz1zdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKLQltZmRiX3NyYy5mZF93ZHdpZHRoPW1mZGJfc3JjLmZkX3c+PjQ7Ci0JbWZkYl9zcmMuZmRfc3RhbmQ9Ci0JCW1mZGJfc3JjLmZkX3IxPQotICAJCW1mZGJfc3JjLmZkX3IyPQotCSAgCW1mZGJfc3JjLmZkX3IzPSAwOwotCi0JaWYgKEdFTV9idWZvcHMgJiBCMlNfVlJPQ1BZRk1fMlRPUykgewotCQltZmRiX3NyYy5mZF9hZGRyPUdFTV9idWZmZXIyOwotCX0KLQotI2lmIERFQlVHX1ZJREVPX0dFTQotCXByaW50Zigic2RsOnZpZGVvOmdlbTogcmVkcmF3ICVkeCVkOiAoJWQsJWQsJWQsJWQpIHRvICglZCwlZCwlZCwlZClcbiIsCi0JCXN1cmZhY2UtPncsIHN1cmZhY2UtPmgsCi0JCXB4eVswXSxweHlbMV0scHh5WzJdLHB4eVszXSwKLQkJcHh5WzRdLHB4eVs1XSxweHlbNl0scHh5WzddCi0JKTsKLSNlbmRpZgotCi0JdnJvX2NweWZtKCBWRElfaGFuZGxlLCBTX09OTFksIHB4eSwgJm1mZGJfc3JjLCAmVkRJX2RzdF9tZmRiKTsKLX0KLQotI2lmIFNETF9WSURFT19PUEVOR0wKLQotc3RhdGljIHZvaWQgR0VNX0dMX1N3YXBCdWZmZXJzKF9USElTKQotewotCVNETF9BdGFyaUdMX1N3YXBCdWZmZXJzKHRoaXMpOwotCUdFTV9GbGlwSFdTdXJmYWNlKHRoaXMsIHRoaXMtPnNjcmVlbik7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZW0vU0RMX2dlbXZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtdmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5NjYyOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtdmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2dlbXZpZGVvX2gKLSNkZWZpbmUgX1NETF9nZW12aWRlb19oCi0KLSNpbmNsdWRlICJTRExfbXV0ZXguaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCi1zdHJ1Y3QgV01jdXJzb3IgewotCU1GT1JNICptZm9ybV9wOwotfTsKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi0vKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAqLwotdm9pZCBHRU1fd2luZF9yZWRyYXcoX1RISVMsIGludCB3aW5oYW5kbGUsIHNob3J0ICppbnNpZGUpOwotCi0vKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLwotCi0jZGVmaW5lIEIyU19DMlBfMVRPMgkJKDE8PDApCS8qIEMyUCBjb252ZXJ0IGJ1ZmZlciAxIHRvIGJ1ZmZlciAyICovCi0jZGVmaW5lIEIyU19DMlBfMVRPUwkJKDE8PDEpCS8qIEMyUCBjb252ZXJ0IGJ1ZmZlciAxIHRvIHNjcmVlbiAqLwotI2RlZmluZSBCMlNfVlJPQ1BZRk1fMVRPUwkoMTw8MikJLyogdnJvX2NweWZtKCkgYnVmZmVyIDEgdG8gc2NyZWVuICovCi0jZGVmaW5lIEIyU19WUk9DUFlGTV8yVE9TCSgxPDwzKQkvKiB2cm9fY3B5Zm0oKSBidWZmZXIgMiB0byBzY3JlZW4gKi8KLQotI2RlZmluZSBTRExfTlVNTU9ERVMJMQkJLyogRnVsbHNjcmVlbiAqLwotCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotCVVpbnQxNglidWYyc2NyX29wczsJCS8qIE9wZXJhdGlvbnMgdG8gZ2V0IGJ1ZmZlciB0byBzY3JlZW4gKi8KLQl2b2lkICpidWZmZXIxOwkJCQkvKiBPdXIgc2hhZG93IGJ1ZmZlcnMgKi8KLQl2b2lkICpidWZmZXIyOwotCi0JLyogVkRJIGluZm9zICovCi0Jc2hvcnQgdmRpX2hhbmRsZTsJCQkvKiBWREkgaGFuZGxlICovCi0Jc2hvcnQgZnVsbF93LCBmdWxsX2g7CQkvKiBGdWxsc2NyZWVuIHNpemUgKi8KLQlzaG9ydCBicHA7CQkJCQkvKiBDb2xvdXIgZGVwdGggKi8KLQlzaG9ydCBwaXhlbHNpemU7CQkJLyogQnl0ZXMgcGVyIHBpeGVsICovCi0Jc2hvcnQgb2xkX251bWNvbG9yczsJCS8qIE51bWJlciBvZiBjb2xvcnMgaW4gc2F2ZWQgcGFsZXR0ZSAqLwotCVVpbnQxNiBwaXRjaDsJCQkJLyogTGluZSBsZW5ndGggKi8KLQlVaW50MTYgZm9ybWF0OwkJCQkvKiBTY3JlZW4gZm9ybWF0ICovCi0Jdm9pZCAqc2NyZWVuOwkJCQkvKiBTY3JlZW4gYWRkcmVzcyAqLwotCVVpbnQzMiByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsJLyogU2NyZWVuIGNvbXBvbmVudHMgKi8KLQlVaW50MzIgc2NyZWVuc2l6ZTsKLQlzaG9ydAlibGl0X2Nvb3Jkc1s4XTsJCS8qIENvb3JkaW5hdGVzIGZvciBiaXRibHQgKi8KLQlNRkRCCXNyY19tZmRiLCBkc3RfbWZkYjsJLyogVkRJIE1GREIgZm9yIGJpdGJsdCAqLwotCVVpbnQxNiBvbGRfcGFsZXR0ZVsyNTZdWzNdOwkvKiBTYXZlZCBjdXJyZW50IHBhbGV0dGUgKi8KLQlVaW50MTYgY3VyX3BhbGV0dGVbMjU2XVszXTsJLyogU0RMIGFwcGxpY2F0aW9uIHBhbGV0dGUgKi8KLQkJCQkJCQkJLyogRnVuY3Rpb24gdG8gc2V0L3Jlc3RvcmUgcGFsZXR0ZSAqLwotCXZvaWQgKCpzZXRwYWxldHRlKShfVEhJUywgVWludDE2IG5ld3BhbFsyNTZdWzNdKTsKLQotCS8qIEdFTSBpbmZvcyAqLwotCXNob3J0IGRlc2tfeCwgZGVza195OwkJLyogRGVza3RvcCBwcm9wZXJ0aWVzICovCi0Jc2hvcnQgZGVza193LCBkZXNrX2g7Ci0Jc2hvcnQgd2luX2hhbmRsZTsJCQkvKiBPdXIgd2luZG93IGhhbmRsZSAqLwotCWludCB3aW5kb3dfdHlwZTsJCQkvKiBXaW5kb3cgdHlwZSAqLwotCWNvbnN0IGNoYXIgKnRpdGxlX25hbWU7CQkvKiBXaW5kb3cgdGl0bGUgKi8KLQljb25zdCBjaGFyICppY29uX25hbWU7CQkvKiBJY29uIHRpdGxlICovCi0Jc2hvcnQgdmVyc2lvbjsJCQkJLyogQUVTIHZlcnNpb24gKi8KLQlzaG9ydCB3ZmVhdHVyZXM7CQkJLyogQUVTIHdpbmRvdyBmZWF0dXJlcyAqLwotCVNETF9ib29sIHJlZnJlc2hfbmFtZTsJCS8qIENoYW5nZSB3aW5kb3cgdGl0bGUgPyAqLwotCVNETF9ib29sIHdpbmRvd19mdWxsZWQ7CQkvKiBXaW5kb3cgbWF4aW1pemVkID8gKi8KLQlTRExfYm9vbCBtb3VzZV9yZWxhdGl2ZTsJLyogUmVwb3J0IHJlbGF0aXZlIG1vdXNlIG1vdmVtZW50ICovCi0JU0RMX2Jvb2wgbG9ja2VkOwkJCS8qIEFFUyBsb2NrZWQgZm9yIGZ1bGxzY3JlZW4gPyAqLwotCVNETF9ib29sIGxvY2tfcmVkcmF3OwkJLyogUHJldmVudCByZWRyYXcgdGlsbCBidWZmZXJzIGFyZSBzZXR1cCAqLwotCXNob3J0IG1lc3NhZ2VbOF07CQkJLyogVG8gc2VsZi1zZW5kIGFuIEFFUyBtZXNzYWdlICovCi0Jdm9pZCAqbWVudWJhcjsJCQkJLyogTWVudSBiYXIgc2F2ZSBidWZmZXIgd2hlbiBnb2luZyBmdWxsc2NyZWVuICovCi0JU0RMX2Jvb2wgdXNlX2Rldl9tb3VzZTsJCS8qIFVzZSAvZGV2L21vdXNlID8gKi8KLQlXTWN1cnNvciAqY3Vyc29yOwkJCS8qIFRvIHJlc3RvcmUgY3Vyc29yIHdoZW4gbGVhdmluZy9lbnRlcmluZyB3aW5kb3cgKi8KLQotCVNETF9ib29sIGZ1bGxzY3JlZW47CQkvKiBGdWxsc2NyZWVuIG9yIHdpbmRvd2VkIG1vZGUgPyAqLwotCVNETF9SZWN0ICpTRExfbW9kZWxpc3RbU0RMX05VTU1PREVTKzFdOwkvKiBNb2RlIGxpc3QgKi8KLQlTRExfU3VyZmFjZSAqaWNvbjsJCQkvKiBUaGUgaWNvbiAqLwotfTsKLQotLyogSGlkZGVuIHN0cnVjdHVyZSAtPiB2YXJpYWJsZXMgbmFtZXMgKi8KLSNkZWZpbmUgVkRJX2hhbmRsZQkJCSh0aGlzLT5oaWRkZW4tPnZkaV9oYW5kbGUpCi0jZGVmaW5lIFZESV93CQkJCSh0aGlzLT5oaWRkZW4tPmZ1bGxfdykKLSNkZWZpbmUgVkRJX2gJCQkJKHRoaXMtPmhpZGRlbi0+ZnVsbF9oKQotI2RlZmluZSBWRElfYnBwCQkJCSh0aGlzLT5oaWRkZW4tPmJwcCkKLSNkZWZpbmUgVkRJX3BpeGVsc2l6ZQkJKHRoaXMtPmhpZGRlbi0+cGl4ZWxzaXplKQotI2RlZmluZSBWRElfb2xkbnVtY29sb3JzCSh0aGlzLT5oaWRkZW4tPm9sZF9udW1jb2xvcnMpCi0jZGVmaW5lIFZESV9vbGRwYWxldHRlCQkodGhpcy0+aGlkZGVuLT5vbGRfcGFsZXR0ZSkKLSNkZWZpbmUgVkRJX2N1cnBhbGV0dGUJCSh0aGlzLT5oaWRkZW4tPmN1cl9wYWxldHRlKQotI2RlZmluZSBWRElfc2V0cGFsZXR0ZQkJKHRoaXMtPmhpZGRlbi0+c2V0cGFsZXR0ZSkKLSNkZWZpbmUgVkRJX3BpdGNoCQkJKHRoaXMtPmhpZGRlbi0+cGl0Y2gpCi0jZGVmaW5lIFZESV9mb3JtYXQJCQkodGhpcy0+aGlkZGVuLT5mb3JtYXQpCi0jZGVmaW5lIFZESV9zY3JlZW4JCQkodGhpcy0+aGlkZGVuLT5zY3JlZW4pCi0jZGVmaW5lIFZESV9yZWRtYXNrCQkJKHRoaXMtPmhpZGRlbi0+cmVkKQotI2RlZmluZSBWRElfZ3JlZW5tYXNrCQkodGhpcy0+aGlkZGVuLT5ncmVlbikKLSNkZWZpbmUgVkRJX2JsdWVtYXNrCQkodGhpcy0+aGlkZGVuLT5ibHVlKQotI2RlZmluZSBWRElfYWxwaGFtYXNrCQkodGhpcy0+aGlkZGVuLT5hbHBoYSkKLSNkZWZpbmUgVkRJX3NjcmVlbnNpemUJCSh0aGlzLT5oaWRkZW4tPnNjcmVlbnNpemUpCi0jZGVmaW5lIFZESV9zcmNfbWZkYgkJKHRoaXMtPmhpZGRlbi0+c3JjX21mZGIpCi0jZGVmaW5lIFZESV9kc3RfbWZkYgkJKHRoaXMtPmhpZGRlbi0+ZHN0X21mZGIpCi0jZGVmaW5lIFZESV9ibGl0X2Nvb3JkcwkJKHRoaXMtPmhpZGRlbi0+YmxpdF9jb29yZHMpCi0KLSNkZWZpbmUgR0VNX2Rlc2tfeAkJCSh0aGlzLT5oaWRkZW4tPmRlc2tfeCkKLSNkZWZpbmUgR0VNX2Rlc2tfeQkJCSh0aGlzLT5oaWRkZW4tPmRlc2tfeSkKLSNkZWZpbmUgR0VNX2Rlc2tfdwkJCSh0aGlzLT5oaWRkZW4tPmRlc2tfdykKLSNkZWZpbmUgR0VNX2Rlc2tfaAkJCSh0aGlzLT5oaWRkZW4tPmRlc2tfaCkKLSNkZWZpbmUgR0VNX2hhbmRsZQkJCSh0aGlzLT5oaWRkZW4tPndpbl9oYW5kbGUpCi0jZGVmaW5lIEdFTV93aW5fdHlwZQkJKHRoaXMtPmhpZGRlbi0+d2luZG93X3R5cGUpCi0jZGVmaW5lIEdFTV90aXRsZV9uYW1lCQkodGhpcy0+aGlkZGVuLT50aXRsZV9uYW1lKQotI2RlZmluZSBHRU1faWNvbl9uYW1lCQkodGhpcy0+aGlkZGVuLT5pY29uX25hbWUpCi0jZGVmaW5lIEdFTV9yZWZyZXNoX25hbWUJKHRoaXMtPmhpZGRlbi0+cmVmcmVzaF9uYW1lKQotI2RlZmluZSBHRU1fdmVyc2lvbgkJCSh0aGlzLT5oaWRkZW4tPnZlcnNpb24pCi0jZGVmaW5lIEdFTV93ZmVhdHVyZXMJCSh0aGlzLT5oaWRkZW4tPndmZWF0dXJlcykKLSNkZWZpbmUgR0VNX3dpbl9mdWxsZWQJCSh0aGlzLT5oaWRkZW4tPndpbmRvd19mdWxsZWQpCi0jZGVmaW5lIEdFTV9tb3VzZV9yZWxhdGl2ZQkodGhpcy0+aGlkZGVuLT5tb3VzZV9yZWxhdGl2ZSkKLSNkZWZpbmUgR0VNX2xvY2tlZAkJCSh0aGlzLT5oaWRkZW4tPmxvY2tlZCkKLSNkZWZpbmUgR0VNX2xvY2tfcmVkcmF3CQkodGhpcy0+aGlkZGVuLT5sb2NrX3JlZHJhdykKLSNkZWZpbmUgR0VNX21lc3NhZ2UJCQkodGhpcy0+aGlkZGVuLT5tZXNzYWdlKQotI2RlZmluZSBTRExfbW9kZWxpc3QJCSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKLSNkZWZpbmUgR0VNX2ljb24JCQkodGhpcy0+aGlkZGVuLT5pY29uKQotI2RlZmluZSBHRU1fZnVsbHNjcmVlbgkJKHRoaXMtPmhpZGRlbi0+ZnVsbHNjcmVlbikKLSNkZWZpbmUgR0VNX21lbnViYXIJCQkodGhpcy0+aGlkZGVuLT5tZW51YmFyKQotI2RlZmluZSBHRU1fdXNlZGV2bW91c2UJCSh0aGlzLT5oaWRkZW4tPnVzZV9kZXZfbW91c2UpCi0jZGVmaW5lIEdFTV9jdXJzb3IJCQkodGhpcy0+aGlkZGVuLT5jdXJzb3IpCi0KLSNkZWZpbmUgR0VNX2J1ZmZlcjEJCQkodGhpcy0+aGlkZGVuLT5idWZmZXIxKQotI2RlZmluZSBHRU1fYnVmZmVyMgkJCSh0aGlzLT5oaWRkZW4tPmJ1ZmZlcjIpCi0jZGVmaW5lIEdFTV9idWZvcHMJCQkodGhpcy0+aGlkZGVuLT5idWYyc2NyX29wcykKLQotI2RlZmluZSBWRElfRkJNQVNLKGFtYXNrLCBybWFzaywgZ21hc2ssIGJtYXNrKSBcCi0JVkRJX2FscGhhbWFzayA9IChhbWFzayk7IFwKLQlWRElfcmVkbWFzayA9IChybWFzayk7IFwKLQlWRElfZ3JlZW5tYXNrID0gKGdtYXNrKTsgXAotCVZESV9ibHVlbWFzayA9IChibWFzayk7Ci0KLS8qCi0JUG9zc2libGUgYnVmZmVyIHRvIHNjcmVlbiBvcGVyYXRpb25zOgotCi0JVEM6IDggKGNodW5reSksMTUsMTYsMjQsMzIgYnBwCi0JOEk6IDggYnBwIHBsYW5lcwotCUZCOiBzY3JlZW4gZnJhbWVidWZmZXIgYWRkcmVzcyBhdmFpbGFibGUKLQlGUzogZnVsbHNjcmVlbgotCi0JVEMsIEZCLCBGUzoKLQkJLSBkcmF3IHRvIHNjcmVlbgotCThJLCBGQiwgRlM6Ci0JCS0gZHJhdyB0byBidWZmZXIgMQotCQktIEMyUCBmcm9tIGJ1ZmZlciAxIHRvIHNjcmVlbgotCi0JVEMsICFGQiwgRlM6Ci0JCS0gZHJhdyB0byBidWZmZXIgMQotCQktIHZyb19jcHlmbSgpIGZyb20gYnVmZmVyIDEgdG8gc2NyZWVuCi0JOEksICFGQiwgRlM6Ci0JCS0gZHJhdyB0byBidWZmZXIgMQotCQktIEMyUCBmcm9tIGJ1ZmZlciAxIHRvIGJ1ZmZlciAyCi0JCS0gdnJvX2NweWZtKCkgZnJvbSBidWZmZXIgMiB0byBzY3JlZW4KLQotCVRDLCBGQiwgIUZTOgotCQktIGRyYXcgdG8gYnVmZmVyIDEKLQkJLSB2cm9fY3B5Zm0oKSBmcm9tIGJ1ZmZlciAxIHRvIHNjcmVlbgotCThJLCBGQiwgIUZTOgotCQktIGRyYXcgdG8gYnVmZmVyIDEKLQkJLSBDMlAgZnJvbSBidWZmZXIgMSB0byBidWZmZXIgMgotCQktIHZyb19jcHlmbSgpIGZyb20gYnVmZmVyIDIgdG8gc2NyZWVuCi0KLQlUQywgIUZCLCAhRlM6Ci0JCS0gZHJhdyB0byBidWZmZXIgMQotCQktIHZyb19jcHlmbSgpIGZyb20gYnVmZmVyIDEgdG8gc2NyZWVuCi0JOEksICFGQiwgIUZTOgotCQktIGRyYXcgdG8gYnVmZmVyIDEKLQkJLSBDMlAgZnJvbSBidWZmZXIgMSB0byBidWZmZXIgMgotCQktIHZyb19jcHlmbSgpIGZyb20gYnVmZmVyIDIgdG8gc2NyZWVuCi0qLwotCi0jZW5kaWYgLyogX1NETF9nZW12aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dlbS9TRExfZ2Vtd20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2VtL1NETF9nZW13bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmIyOTk4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2VtL1NETF9nZW13bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotCUdFTSBTREwgdmlkZW8gZHJpdmVyCi0JV2luZG93IG1hbmFnZXIgZnVuY3Rpb25zCi0KLQlQYXRyaWNlIE1hbmRpbgotKi8KLQotLyogTWludCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgPGdlbS5oPgotCi0jaW5jbHVkZSAiU0RMX2dlbXdtX2MuaCIKLQotLyogRGVmaW5lcyAqLwotCi0jZGVmaW5lIElDT05XSURUSCA2NAotI2RlZmluZSBJQ09OSEVJR0hUIDY0Ci0KLS8qIEZ1bmN0aW9ucyAqLwotCi12b2lkIEdFTV9TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKLXsKLQlpZiAodGl0bGUpIHsKLQkJR0VNX3RpdGxlX25hbWUgPSB0aXRsZTsKLQkJR0VNX3JlZnJlc2hfbmFtZSA9IFNETF9UUlVFOwotCX0KLQotCWlmIChpY29uKSB7Ci0JCUdFTV9pY29uX25hbWUgPSBpY29uOwotCQlHRU1fcmVmcmVzaF9uYW1lID0gU0RMX1RSVUU7Ci0JfQotfQotCi12b2lkIEdFTV9TZXRJY29uKF9USElTLCBTRExfU3VyZmFjZSAqaWNvbiwgVWludDggKm1hc2spCi17Ci0JU0RMX1N1cmZhY2UgKnNpY29uOwotCVNETF9SZWN0IGJvdW5kczsKLQotI2lmIDAKLQlpZiAoKEdFTV93ZmVhdHVyZXMgJiAoMTw8V0ZfSUNPTklGWSkpPT0wKSB7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQotCWlmIChpY29uID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQkKLQkvKiBDb252ZXJ0IGljb24gdG8gdGhlIHNjcmVlbiBmb3JtYXQgKi8KLQlzaWNvbiA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsIGljb24tPncsIGljb24tPmgsCi0JCVZESV9icHAsIFZESV9yZWRtYXNrLCBWRElfZ3JlZW5tYXNrLCBWRElfYmx1ZW1hc2ssIDApOwotCWlmICggc2ljb24gPT0gTlVMTCApIHsKLQkJcmV0dXJuOwotCX0KLQotCWJvdW5kcy54ID0gMDsKLQlib3VuZHMueSA9IDA7Ci0JYm91bmRzLncgPSBpY29uLT53OwotCWJvdW5kcy5oID0gaWNvbi0+aDsKLQlpZiAoIFNETF9Mb3dlckJsaXQoaWNvbiwgJmJvdW5kcywgc2ljb24sICZib3VuZHMpIDwgMCApIHsKLQkJU0RMX0ZyZWVTdXJmYWNlKHNpY29uKTsKLQkJcmV0dXJuOwotCX0KLQotCUdFTV9pY29uID0gc2ljb247Ci19Ci0KLWludCBHRU1fSWNvbmlmeVdpbmRvdyhfVEhJUykKLXsKLQlpZiAoKEdFTV93ZmVhdHVyZXMgJiAoMTw8V0ZfSUNPTklGWSkpPT0wKQotCQlyZXR1cm4gMDsKLQotCUdFTV9tZXNzYWdlWzBdID0gV01fSUNPTklGWTsKLQlHRU1fbWVzc2FnZVsxXSA9IGdsX2FwaWQ7Ci0JR0VNX21lc3NhZ2VbMl0gPSAwOwotCUdFTV9tZXNzYWdlWzNdID0gR0VNX2hhbmRsZTsKLQlHRU1fbWVzc2FnZVs0XSA9IDA7Ci0JR0VNX21lc3NhZ2VbNV0gPSBHRU1fZGVza19oLUlDT05IRUlHSFQ7Ci0JR0VNX21lc3NhZ2VbNl0gPSBJQ09OV0lEVEg7Ci0JR0VNX21lc3NhZ2VbN10gPSBJQ09OSEVJR0hUOwotCi0JYXBwbF93cml0ZShnbF9hcGlkLCBzaXplb2YoR0VNX21lc3NhZ2UpLCBHRU1fbWVzc2FnZSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotU0RMX0dyYWJNb2RlIEdFTV9HcmFiSW5wdXQoX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKQotewotCWlmICh0aGlzLT5zY3JlZW4gPT0gTlVMTCkgewotCQlyZXR1cm4gU0RMX0dSQUJfT0ZGOwotCX0KLQotCXJldHVybiBtb2RlOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZW0vU0RMX2dlbXdtX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2VtL1NETF9nZW13bV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYTBiNjMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZW0vU0RMX2dlbXdtX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICoJR0VNIFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb24KLSAqCVdpbmRvdyBtYW5hZ2VyIGZ1bmN0aW9ucwotICogCi0gKglQYXRyaWNlIE1hbmRpbgotICovCi0KLSNpbmNsdWRlICJTRExfZ2VtdmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHByb3RvdHlwZXMgKi8KLWV4dGVybiB2b2lkIEdFTV9TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7Ci1leHRlcm4gdm9pZCBHRU1fU2V0SWNvbihfVEhJUywgU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKTsKLWV4dGVybiBpbnQgR0VNX0ljb25pZnlXaW5kb3coX1RISVMpOwotZXh0ZXJuIFNETF9HcmFiTW9kZSBHRU1fR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMmQ2NzYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZ2kvU0RMX2dnaWV2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBIYW5kbGUgdGhlIGV2ZW50IHN0cmVhbSwgY29udmVydGluZyBHR0kgZXZlbnRzIGludG8gU0RMIGV2ZW50cyAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLQotI2luY2x1ZGUgPGdnaS9rZXlib2FyZC5oPgotCi0jaW5jbHVkZSAiU0RMX2dnaWtleXMuaCIKLQotI2luY2x1ZGUgIlNETC5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9nZ2l2aWRlby5oIgotI2luY2x1ZGUgIlNETF9nZ2lldmVudHNfYy5oIgotCi0vKiBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBHR0kga2V5Y29kZSB0byBhIFNETCBrZXlzeW0gKi8KLXN0YXRpYyBTRExLZXkga2V5bWFwWzEyOF07Ci1zdGF0aWMgU0RMX2tleXN5bSAqR0dJX1RyYW5zbGF0ZUtleShnZ2lfZXZlbnQgKmV2LCBTRExfa2V5c3ltICprZXlzeW0pOwotCi1zdGF0aWMgaW50IHBvc3RlZCA9IDA7Ci0KLXZvaWQgR0dJX1B1bXBFdmVudHMoX1RISVMpCi17Ci0Jc3RydWN0IHRpbWV2YWwgKnR2cCwgdHYgPSB7IDAsIDAgfTsKLQlnZ2lfZXZlbnQgZXY7Ci0KLQl0dnAgPSAmdHY7Ci0JCi0vKglnZ2lGbHVzaChWSVMpOyAqLwotCQotCXdoaWxlIChnZ2lFdmVudFBvbGwoVklTLCBlbUFsbCwgdHZwKSkKLS8qCXdoaWxlIChnZ2lFdmVudFBvbGwoVklTLCAoZW1LZXlib2FyZCB8IGVtUG9pbnRlciB8IGVtQ29tbWFuZCksIHR2cCkpICovCi0JewotCQlpbnQgcXVldWVldmVudF9tb3VzZSA9IDAsIHF1ZXVlZXZlbnRfa2JkID0gMDsKLQkJc3RhdGljIGludCBidXR0b25zID0gMDsKLQkJc3RhdGljIGludCBtb3VzZV94ID0gMCwgbW91c2VfeSA9IDAsIG1vdXNlX3ogPSAwOwotCQlpbnQgeCA9IDAsIHkgPSAwLCB6ID0gMCwgcnggPSAwLCByeSA9IDAsIHJ6ID0gMDsKLQkJaW50IHByZXNzZWRfbW91c2UsIHByZXNzZWRfa2JkOwotCQlTRExfa2V5c3ltIGtleXN5bTsKLQkJCi0JCXBvc3RlZCA9IDA7Ci0KLQkJLyogRklYTUU6IFdlIGRvIG5vdCBhY3R1YWxseSB3YW50IGFsbCBldmVudHMsIG9ubHkKLQkJICogbW91c2UgYW5kIGtleWJvYXJkIGV2ZW50cy4gIEhhdmluZyB0byBoYW5kbGUgYWxsCi0gICAgICAgICAgICAgICAgICogZXZlbnRzIHdpbGwgc2xvdyB0aGluZ3MgZG93bi4gICovCi0KLQkJZ2dpRXZlbnRSZWFkKFZJUywgJmV2LCBlbUFsbCk7Ci0vKgkJZ2dpRXZlbnRSZWFkKFZJUywgJmV2LCAoZW1LZXlib2FyZCB8IGVtUG9pbnRlciB8IGVtQ29tbWFuZCkpOyAqLwotCQkKLQkJc3dpdGNoIChldi5hbnkudHlwZSkKLQkJewotCQkJY2FzZSBldlB0clJlbGF0aXZlOgotCQkJeCA9IGV2LnBtb3ZlLng7Ci0JCQl5ID0gZXYucG1vdmUueTsKLQkJCXogPSBldi5wbW92ZS53aGVlbDsKLQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDEsIHgsIHkpOwotCQkJYnJlYWs7Ci0JCQljYXNlIGV2UHRyQWJzb2x1dGU6Ci0JCQlpZiAobW91c2VfeCAhPSBldi5wbW92ZS54IHx8IG1vdXNlX3kgIT0gZXYucG1vdmUueSB8fCBtb3VzZV96ICE9IGV2LnBtb3ZlLndoZWVsKQotCQkJewotCQkJCXggPSBldi5wbW92ZS54IC0gbW91c2VfeDsKLQkJCQl5ID0gZXYucG1vdmUueSAtIG1vdXNlX3k7Ci0JCQkJeiA9IGV2LnBtb3ZlLndoZWVsIC0gbW91c2VfejsKLQkJCQltb3VzZV94ID0gZXYucG1vdmUueDsKLQkJCQltb3VzZV95ID0gZXYucG1vdmUueTsKLQkJCQltb3VzZV96ID0gZXYucG1vdmUud2hlZWw7Ci0JCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgeCwgeSk7Ci0JCQl9IAotCQkJYnJlYWs7Ci0JCQljYXNlIGV2UHRyQnV0dG9uUHJlc3M6Ci0JCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgZXYucGJ1dHRvbi5idXR0b24sIDAsIDApOwotCQkJYnJlYWs7Ci0JCQljYXNlIGV2UHRyQnV0dG9uUmVsZWFzZToKLQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgZXYucGJ1dHRvbi5idXR0b24sIDAsIDApOwotCQkJYnJlYWs7Ci0JCQljYXNlIGV2S2V5UHJlc3M6Ci0JCQljYXNlIGV2S2V5UmVwZWF0OgotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsIEdHSV9UcmFuc2xhdGVLZXkoJmV2LCAma2V5c3ltKSk7Ci0JCQlicmVhazsKLQkJCWNhc2UgZXZLZXlSZWxlYXNlOgotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELCBHR0lfVHJhbnNsYXRlS2V5KCZldiwgJmtleXN5bSkpOwotCQkJYnJlYWs7Ci0JCQljYXNlIGV2Q29tbWFuZDoKLQkJCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBldmVudCAleCByZWNpZXZlZFxuIiwgZXYuY21kLmNvZGUpOwotCQkJYnJlYWs7Ci0gCQkJZGVmYXVsdDoKLQkJCWZwcmludGYoc3RkZXJyLCAiVW5oYW5kbGVkIGV2ZW50IHR5cGUgJWRcbiIsIGV2LmFueS50eXBlKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi19Ci0KLXZvaWQgR0dJX0luaXRPU0tleW1hcChfVEhJUykKLXsKLQlpbnQgaTsKLQkKLQkvKiBJbml0aWFsaXplIHRoZSBHR0kga2V5IHRyYW5zbGF0aW9uIHRhYmxlICovCi0JZm9yICggaT0wOyBpPFNETF9hcnJheXNpemUoa2V5bWFwKTsgKytpICkKLQkJa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOwotCQotCWtleW1hcFtTQ0FOQ09ERV9FU0NBUEVdID0gU0RMS19FU0NBUEU7Ci0Ja2V5bWFwW1NDQU5DT0RFXzFdID0gU0RMS18xOwotCWtleW1hcFtTQ0FOQ09ERV8yXSA9IFNETEtfMjsKLQlrZXltYXBbU0NBTkNPREVfM10gPSBTRExLXzM7Ci0Ja2V5bWFwW1NDQU5DT0RFXzRdID0gU0RMS180OwotCWtleW1hcFtTQ0FOQ09ERV81XSA9IFNETEtfNTsKLQlrZXltYXBbU0NBTkNPREVfNl0gPSBTRExLXzY7Ci0Ja2V5bWFwW1NDQU5DT0RFXzddID0gU0RMS183OwotCWtleW1hcFtTQ0FOQ09ERV84XSA9IFNETEtfODsKLQlrZXltYXBbU0NBTkNPREVfOV0gPSBTRExLXzk7Ci0Ja2V5bWFwW1NDQU5DT0RFXzBdID0gU0RMS18wOwotCWtleW1hcFtTQ0FOQ09ERV9NSU5VU10gPSBTRExLX01JTlVTOwotCWtleW1hcFtTQ0FOQ09ERV9FUVVBTF0gPSBTRExLX0VRVUFMUzsKLQlrZXltYXBbU0NBTkNPREVfQkFDS1NQQUNFXSA9IFNETEtfQkFDS1NQQUNFOwotCWtleW1hcFtTQ0FOQ09ERV9UQUJdID0gU0RMS19UQUI7Ci0Ja2V5bWFwW1NDQU5DT0RFX1FdID0gU0RMS19xOwotCWtleW1hcFtTQ0FOQ09ERV9XXSA9IFNETEtfdzsKLQlrZXltYXBbU0NBTkNPREVfRV0gPSBTRExLX2U7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JdID0gU0RMS19yOwotCWtleW1hcFtTQ0FOQ09ERV9UXSA9IFNETEtfdDsKLQlrZXltYXBbU0NBTkNPREVfWV0gPSBTRExLX3k7Ci0Ja2V5bWFwW1NDQU5DT0RFX1VdID0gU0RMS191OwotCWtleW1hcFtTQ0FOQ09ERV9JXSA9IFNETEtfaTsKLQlrZXltYXBbU0NBTkNPREVfT10gPSBTRExLX287Ci0Ja2V5bWFwW1NDQU5DT0RFX1BdID0gU0RMS19wOwotCWtleW1hcFtTQ0FOQ09ERV9CUkFDS0VUX0xFRlRdID0gU0RMS19MRUZUQlJBQ0tFVDsKLQlrZXltYXBbU0NBTkNPREVfQlJBQ0tFVF9SSUdIVF0gPSBTRExLX1JJR0hUQlJBQ0tFVDsKLQlrZXltYXBbU0NBTkNPREVfRU5URVJdID0gU0RMS19SRVRVUk47Ci0Ja2V5bWFwW1NDQU5DT0RFX0xFRlRDT05UUk9MXSA9IFNETEtfTENUUkw7Ci0Ja2V5bWFwW1NDQU5DT0RFX0FdID0gU0RMS19hOwotCWtleW1hcFtTQ0FOQ09ERV9TXSA9IFNETEtfczsKLQlrZXltYXBbU0NBTkNPREVfRF0gPSBTRExLX2Q7Ci0Ja2V5bWFwW1NDQU5DT0RFX0ZdID0gU0RMS19mOwotCWtleW1hcFtTQ0FOQ09ERV9HXSA9IFNETEtfZzsKLQlrZXltYXBbU0NBTkNPREVfSF0gPSBTRExLX2g7Ci0Ja2V5bWFwW1NDQU5DT0RFX0pdID0gU0RMS19qOwotCWtleW1hcFtTQ0FOQ09ERV9LXSA9IFNETEtfazsKLQlrZXltYXBbU0NBTkNPREVfTF0gPSBTRExLX2w7Ci0Ja2V5bWFwW1NDQU5DT0RFX1NFTUlDT0xPTl0gPSBTRExLX1NFTUlDT0xPTjsKLQlrZXltYXBbU0NBTkNPREVfQVBPU1RST1BIRV0gPSBTRExLX1FVT1RFOwotCWtleW1hcFtTQ0FOQ09ERV9HUkFWRV0gPSBTRExLX0JBQ0tRVU9URTsKLQlrZXltYXBbU0NBTkNPREVfTEVGVFNISUZUXSA9IFNETEtfTFNISUZUOwotCWtleW1hcFtTQ0FOQ09ERV9CQUNLU0xBU0hdID0gU0RMS19CQUNLU0xBU0g7Ci0Ja2V5bWFwW1NDQU5DT0RFX1pdID0gU0RMS196OwotCWtleW1hcFtTQ0FOQ09ERV9YXSA9IFNETEtfeDsKLQlrZXltYXBbU0NBTkNPREVfQ10gPSBTRExLX2M7Ci0Ja2V5bWFwW1NDQU5DT0RFX1ZdID0gU0RMS192OwotCWtleW1hcFtTQ0FOQ09ERV9CXSA9IFNETEtfYjsKLQlrZXltYXBbU0NBTkNPREVfTl0gPSBTRExLX247Ci0Ja2V5bWFwW1NDQU5DT0RFX01dID0gU0RMS19tOwotCWtleW1hcFtTQ0FOQ09ERV9DT01NQV0gPSBTRExLX0NPTU1BOwotCWtleW1hcFtTQ0FOQ09ERV9QRVJJT0RdID0gU0RMS19QRVJJT0Q7Ci0Ja2V5bWFwW1NDQU5DT0RFX1NMQVNIXSA9IFNETEtfU0xBU0g7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JJR0hUU0hJRlRdID0gU0RMS19SU0hJRlQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRE1VTFRJUExZXSA9IFNETEtfS1BfTVVMVElQTFk7Ci0Ja2V5bWFwW1NDQU5DT0RFX0xFRlRBTFRdID0gU0RMS19MQUxUOwotCWtleW1hcFtTQ0FOQ09ERV9TUEFDRV0gPSBTRExLX1NQQUNFOwotCWtleW1hcFtTQ0FOQ09ERV9DQVBTTE9DS10gPSBTRExLX0NBUFNMT0NLOwotCWtleW1hcFtTQ0FOQ09ERV9GMV0gPSBTRExLX0YxOwotCWtleW1hcFtTQ0FOQ09ERV9GMl0gPSBTRExLX0YyOwotCWtleW1hcFtTQ0FOQ09ERV9GM10gPSBTRExLX0YzOwotCWtleW1hcFtTQ0FOQ09ERV9GNF0gPSBTRExLX0Y0OwotCWtleW1hcFtTQ0FOQ09ERV9GNV0gPSBTRExLX0Y1OwotCWtleW1hcFtTQ0FOQ09ERV9GNl0gPSBTRExLX0Y2OwotCWtleW1hcFtTQ0FOQ09ERV9GN10gPSBTRExLX0Y3OwotCWtleW1hcFtTQ0FOQ09ERV9GOF0gPSBTRExLX0Y4OwotCWtleW1hcFtTQ0FOQ09ERV9GOV0gPSBTRExLX0Y5OwotCWtleW1hcFtTQ0FOQ09ERV9GMTBdID0gU0RMS19GMTA7Ci0Ja2V5bWFwW1NDQU5DT0RFX05VTUxPQ0tdID0gU0RMS19OVU1MT0NLOwotCWtleW1hcFtTQ0FOQ09ERV9TQ1JPTExMT0NLXSA9IFNETEtfU0NST0xMT0NLOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ3XSA9IFNETEtfS1A3OwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JVUExFRlRdID0gU0RMS19LUDc7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRDhdID0gU0RMS19LUDg7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NVUlNPUlVQXSA9IFNETEtfS1A4OwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ5XSA9IFNETEtfS1A5OwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JVUFJJR0hUXSA9IFNETEtfS1A5OwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURNSU5VU10gPSBTRExLX0tQX01JTlVTOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ0XSA9IFNETEtfS1A0OwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JMRUZUXSA9IFNETEtfS1A0OwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ1XSA9IFNETEtfS1A1OwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ2XSA9IFNETEtfS1A2OwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JSSUdIVF0gPSBTRExLX0tQNjsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFEUExVU10gPSBTRExLX0tQX1BMVVM7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRDFdID0gU0RMS19LUDE7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NVUlNPUkRPV05MRUZUXSA9IFNETEtfS1AxOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQyXSA9IFNETEtfS1AyOwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JET1dOXSA9IFNETEtfS1AyOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQzXSA9IFNETEtfS1AzOwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JET1dOUklHSFRdID0gU0RMS19LUDM7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRDBdID0gU0RMS19LUDA7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRFBFUklPRF0gPSBTRExLX0tQX1BFUklPRDsKLQlrZXltYXBbU0NBTkNPREVfTEVTU10gPSBTRExLX0xFU1M7Ci0Ja2V5bWFwW1NDQU5DT0RFX0YxMV0gPSBTRExLX0YxMTsKLQlrZXltYXBbU0NBTkNPREVfRjEyXSA9IFNETEtfRjEyOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURFTlRFUl0gPSBTRExLX0tQX0VOVEVSOwotCWtleW1hcFtTQ0FOQ09ERV9SSUdIVENPTlRST0xdID0gU0RMS19SQ1RSTDsKLQlrZXltYXBbU0NBTkNPREVfQ09OVFJPTF0gPSBTRExLX1JDVFJMOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURESVZJREVdID0gU0RMS19LUF9ESVZJREU7Ci0Ja2V5bWFwW1NDQU5DT0RFX1BSSU5UU0NSRUVOXSA9IFNETEtfUFJJTlQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JJR0hUQUxUXSA9IFNETEtfUkFMVDsKLQlrZXltYXBbU0NBTkNPREVfQlJFQUtdID0gU0RMS19CUkVBSzsKLQlrZXltYXBbU0NBTkNPREVfQlJFQUtfQUxURVJOQVRJVkVdID0gU0RMS19VTktOT1dOOwotCWtleW1hcFtTQ0FOQ09ERV9IT01FXSA9IFNETEtfSE9NRTsKLQlrZXltYXBbU0NBTkNPREVfQ1VSU09SQkxPQ0tVUF0gPSBTRExLX1VQOwotCWtleW1hcFtTQ0FOQ09ERV9QQUdFVVBdID0gU0RMS19QQUdFVVA7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NVUlNPUkJMT0NLTEVGVF0gPSBTRExLX0xFRlQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NVUlNPUkJMT0NLUklHSFRdID0gU0RMS19SSUdIVDsKLQlrZXltYXBbU0NBTkNPREVfRU5EXSA9IFNETEtfRU5EOwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JCTE9DS0RPV05dID0gU0RMS19ET1dOOwotCWtleW1hcFtTQ0FOQ09ERV9QQUdFRE9XTl0gPSBTRExLX1BBR0VET1dOOwotCWtleW1hcFtTQ0FOQ09ERV9JTlNFUlRdID0gU0RMS19JTlNFUlQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JFTU9WRV0gPSBTRExLX0RFTEVURTsKLQlrZXltYXBbMTE5XSA9IFNETEtfUEFVU0U7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JJR0hUV0lOXSA9IFNETEtfUlNVUEVSOwotCWtleW1hcFtTQ0FOQ09ERV9MRUZUV0lOXSA9IFNETEtfTFNVUEVSOwotCWtleW1hcFsxMjddID0gU0RMS19NRU5VOwotfQotCi0KLQotc3RhdGljIFNETF9rZXlzeW0gKkdHSV9UcmFuc2xhdGVLZXkoZ2lpX2V2ZW50ICpldiwgU0RMX2tleXN5bSAqa2V5c3ltKQotewotCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCi0Ja2V5c3ltLT5zY2FuY29kZSA9IGV2LT5rZXkuYnV0dG9uOwotCWtleXN5bS0+c3ltID0ga2V5bWFwW2V2LT5rZXkuYnV0dG9uXTsKLQlrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKLQotCS8qIElmIFVOSUNPREUgaXMgb24sIGdldCB0aGUgVU5JQ09ERSB2YWx1ZSBmb3IgdGhlIGtleSAqLwotCWtleXN5bS0+dW5pY29kZSA9IDA7Ci0JaWYgKFNETF9UcmFuc2xhdGVVTklDT0RFKSAKLQl7Ci0JCWtleXN5bS0+dW5pY29kZSA9IEdJSV9VTklDT0RFKGV2LT5rZXkuc3ltKTsKLQl9Ci0KLQlyZXR1cm4ga2V5c3ltOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZ2kvU0RMX2dnaWV2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTE0YjY5Mi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpZXZlbnRzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX2dnaXZpZGVvLmgiCi0KLS8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLwotZXh0ZXJuIHZvaWQgR0dJX0luaXRPU0tleW1hcChfVEhJUyk7Ci1leHRlcm4gdm9pZCBHR0lfUHVtcEV2ZW50cyhfVEhJUyk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2dpL1NETF9nZ2ltb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZ2kvU0RMX2dnaW1vdXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjFhMDQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZ2kvU0RMX2dnaW1vdXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfZ2dpbW91c2VfYy5oIgotCi0KLS8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLwotc3RydWN0IFdNY3Vyc29yIHsKLQlpbnQgdW51c2VkOwotfTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2dpL1NETF9nZ2ltb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpbW91c2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjc5ZDA1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2dpL1NETF9nZ2ltb3VzZV9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9nZ2l2aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2dpL1NETF9nZ2l2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZ2kvU0RMX2dnaXZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NTE1NGEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZ2kvU0RMX2dnaXZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEdHSS1iYXNlZCBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2luY2x1ZGUgPGdnaS9nZ2kuaD4KLSNpbmNsdWRlIDxnZ2kvZ2lpLmg+Ci0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX2dnaXZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2dnaW1vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfZ2dpZXZlbnRzX2MuaCIKLQotCi1zdHJ1Y3QgcHJpdmF0ZV9od2RhdGEKLXsKLQlnZ2lfdmlzdWFsX3QgdmlzOwotfTsKLQotZ2dpX3Zpc3VhbF90IFZJUzsKLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IEdHSV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKipHR0lfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqR0dJX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgR0dJX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAotCQkJIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyB2b2lkIEdHSV9WaWRlb1F1aXQoX1RISVMpOwotCi0vKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBHR0lfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgR0dJX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIEdHSV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIEdHSV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0KLS8qIEdHSSBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEdHSV9BdmFpbGFibGUodm9pZCkKLXsKLQlnZ2lfdmlzdWFsX3QgKnZpczsKLQotCXZpcyA9IE5VTEw7Ci0JaWYgKGdnaUluaXQoKSA9PSAwKSB7Ci0JCXZpcyA9IGdnaU9wZW4oTlVMTCk7Ci0JCWlmICh2aXMgIT0gTlVMTCkgewotCQkJZ2dpQ2xvc2UodmlzKTsKLQkJfQotCX0KLQlyZXR1cm4gKHZpcyAhPSBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgR0dJX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKLXsKLQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0JU0RMX2ZyZWUoZGV2aWNlKTsKLX0KLQotc3RhdGljIFNETF9WaWRlb0RldmljZSAqR0dJX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLQlpZiAoIGRldmljZSApIHsKLQkJU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOwotCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0JfQotCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlpZiAoIGRldmljZSApIHsKLQkJCVNETF9mcmVlKGRldmljZSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCWRldmljZS0+VmlkZW9Jbml0ID0gR0dJX1ZpZGVvSW5pdDsKLQlkZXZpY2UtPkxpc3RNb2RlcyA9IEdHSV9MaXN0TW9kZXM7Ci0JZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBHR0lfU2V0VmlkZW9Nb2RlOwotCWRldmljZS0+U2V0Q29sb3JzID0gR0dJX1NldENvbG9yczsKLQlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKLQlkZXZpY2UtPlZpZGVvUXVpdCA9IEdHSV9WaWRlb1F1aXQ7Ci0JZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IEdHSV9BbGxvY0hXU3VyZmFjZTsKLQlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gTlVMTDsKLQlkZXZpY2UtPkZpbGxIV1JlY3QgPSBOVUxMOwotCWRldmljZS0+U2V0SFdDb2xvcktleSA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRIV0FscGhhID0gTlVMTDsKLQlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBHR0lfTG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IEdHSV9VbmxvY2tIV1N1cmZhY2U7Ci0JZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gTlVMTDsKLQlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBHR0lfRnJlZUhXU3VyZmFjZTsKLQlkZXZpY2UtPlNldENhcHRpb24gPSBOVUxMOwotCWRldmljZS0+U2V0SWNvbiA9IE5VTEw7Ci0JZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKLQlkZXZpY2UtPkdyYWJJbnB1dCA9IE5VTEw7Ci0JZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOwotCWRldmljZS0+SW5pdE9TS2V5bWFwID0gR0dJX0luaXRPU0tleW1hcDsKLQlkZXZpY2UtPlB1bXBFdmVudHMgPSBHR0lfUHVtcEV2ZW50czsKLQotCWRldmljZS0+ZnJlZSA9IEdHSV9EZWxldGVEZXZpY2U7Ci0KLQlyZXR1cm4gZGV2aWNlOwotfQotCi1WaWRlb0Jvb3RTdHJhcCBHR0lfYm9vdHN0cmFwID0gewotCSJnZ2kiLCAiR2VuZXJhbCBHcmFwaGljcyBJbnRlcmZhY2UgKEdHSSkiLAotCUdHSV9BdmFpbGFibGUsIEdHSV9DcmVhdGVEZXZpY2UKLX07Ci0KLQotc3RhdGljIFNETF9SZWN0IHZpZGVvX21vZGU7Ci1zdGF0aWMgU0RMX1JlY3QgKlNETF9tb2RlbGlzdFs0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OwotCi1pbnQgR0dJX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotCWdnaV9tb2RlIG1vZGUgPQotCXsKLQkJMSwKLQkJeyBHR0lfQVVUTywgR0dJX0FVVE8gfSwKLQkJeyBHR0lfQVVUTywgR0dJX0FVVE8gfSwKLQkJeyAwLCAwIH0sCi0JCUdUX0FVVE8sCi0JCXsgR0dJX0FVVE8sIEdHSV9BVVRPIH0KLQl9OwkKLQlzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgKnByaXY7Ci0JZ2dpX2NvbG9yIHBhbFsyNTZdLCBtYXBbMjU2XTsKLQljb25zdCBnZ2lfZGlyZWN0YnVmZmVyICpkYjsKLQlpbnQgZXJyLCBudW1fYnVmczsKLQlnZ2lfcGl4ZWwgd2hpdGUsIGJsYWNrOwotCQotCXByaXYgPSBTRExfbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEpKTsKLQlpZiAocHJpdiA9PSBOVUxMKQotCXsKLQkJU0RMX1NldEVycm9yKCJVbmhhbmRsZWQgR0dJIG1vZGUgdHlwZSFcbiIpOwotCQlHR0lfVmlkZW9RdWl0KE5VTEwpOwotCX0KLQkKLQlpZiAoZ2dpSW5pdCgpICE9IDApCi0JewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBpbml0aWFsaXplIEdHSSFcbiIpOwotCQlHR0lfVmlkZW9RdWl0KE5VTEwpOwotCX0KLQkKLQlWSVMgPSBnZ2lPcGVuKE5VTEwpOwotCWlmIChWSVMgPT0gTlVMTCkKLQl7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gZGVmYXVsdCBHR0kgdmlzdWFsIVxuIik7Ci0JCWdnaUV4aXQoKTsKLQkJR0dJX1ZpZGVvUXVpdChOVUxMKTsKLQl9Ci0JCi0JZ2dpU2V0RmxhZ3MoVklTLCBHR0lGTEFHX0FTWU5DKTsKLQkKLQkvKiBWYWxpZGF0ZSBtb2RlLCBhdXRvZGV0ZWN0aW5nIGFueSBHR0lfQVVUTyBvciBHVF9BVVRPIGZpZWxkcyAqLwotCWdnaUNoZWNrTW9kZShWSVMsICZtb2RlKTsKLQkKLQkvKiBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBoYXZlIGEgdmFsaWQgbW9kZSAtIHRyeSB0byBzZXQgaXQgKi8KLQllcnIgPSBnZ2lTZXRNb2RlKFZJUywgJm1vZGUpOwotCQotCS8qIElmIHdlIGNvdWxkbid0IHNldCBfYW55XyBtb2Rlcywgc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcgKi8KLQlpZiAoZXJyKQotCXsKLQkJU0RMX1NldEVycm9yKCJDYW4ndCBzZXQgYSBtb2RlIVxuIik7Ci0JCWdnaUNsb3NlKFZJUyk7Ci0JCWdnaUV4aXQoKTsKLQkJR0dJX1ZpZGVvUXVpdChOVUxMKTsKLQl9Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUgKi8KLQl0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IG1vZGUudmlydC54OwotCXRoaXMtPmluZm8uY3VycmVudF9oID0gbW9kZS52aXJ0Lnk7Ci0KLQkvKiBTZXQgYSBwYWxldHRlIGZvciBwYWxsZXRpemVkIG1vZGVzICovCi0JaWYgKEdUX1NDSEVNRShtb2RlLmdyYXBodHlwZSkgPT0gR1RfUEFMRVRURSkKLQl7Ci0JCWdnaVNldENvbG9yZnVsUGFsZXR0ZShWSVMpOwotCQlnZ2lHZXRQYWxldHRlKFZJUywgMCwgMSA8PCB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwsIHBhbCk7Ci0JfQotCQotCS8qIE5vdyB3ZSB0cnkgdG8gZ2V0IHRoZSBEaXJlY3RCdWZmZXIgaW5mbywgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyCi0JICogU0RMIGNhbiBhY2Nlc3MgaGFyZHdhcmUgc3VyZmFjZXMgZGlyZWN0bHkuICovCi0JCi0JbnVtX2J1ZnMgPSBnZ2lEQkdldE51bUJ1ZmZlcnMoVklTKTsKLQotCWlmIChudW1fYnVmcyA+IDApCi0JewotCQlkYiA9IGdnaURCR2V0QnVmZmVyKFZJUywgMCk7IC8qIE9ubHkgaGFuZGxlIG9uZSBEQiBmb3Igbm93ICovCi0JCQotCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBkYi0+YnVmZmVyLnBsYi5waXhlbGZvcm1hdC0+ZGVwdGg7Ci0JCQotCQl2Zm9ybWF0LT5SbWFzayA9IGRiLT5idWZmZXIucGxiLnBpeGVsZm9ybWF0LT5yZWRfbWFzazsKLQkJdmZvcm1hdC0+R21hc2sgPSBkYi0+YnVmZmVyLnBsYi5waXhlbGZvcm1hdC0+Z3JlZW5fbWFzazsKLQkJdmZvcm1hdC0+Qm1hc2sgPSBkYi0+YnVmZmVyLnBsYi5waXhlbGZvcm1hdC0+Ymx1ZV9tYXNrOwotCQkKLQkJLyogRmlsbCBpbiBvdXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGNhcGFiaWxpdGllcyAqLwotCQotCQl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDA7Ci0JCXRoaXMtPmluZm8uaHdfYXZhaWxhYmxlID0gMTsKLQkJdGhpcy0+aW5mby52aWRlb19tZW0gPSBkYi0+YnVmZmVyLnBsYi5zdHJpZGUgKiBtb2RlLnZpcnQueTsKLQl9Ci0KLQl2aWRlb19tb2RlLnggPSAwOwotCXZpZGVvX21vZGUueSA9IDA7Ci0JdmlkZW9fbW9kZS53ID0gbW9kZS52aXJ0Lng7Ci0JdmlkZW9fbW9kZS5oID0gbW9kZS52aXJ0Lnk7Ci0JU0RMX21vZGVsaXN0WygodmZvcm1hdC0+Qml0c1BlclBpeGVsICsgNykgLyA4KSAtIDFdID0gJnZpZGVvX21vZGU7Ci0KLQkvKiBXZSdyZSBkb25lISAqLwotCXJldHVybigwKTsKLX0KLQotc3RhdGljIFNETF9SZWN0ICoqR0dJX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQlyZXR1cm4oJlNETF9tb2RlbGlzdFsoKGZvcm1hdC0+Qml0c1BlclBpeGVsICsgNykgLyA4KSAtIDFdKTsKLX0KLQotLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KLXN0YXRpYyB2b2lkIEdHSV9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotU0RMX1N1cmZhY2UgKkdHSV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLQlnZ2lfbW9kZSBtb2RlID0KLQl7Ci0JCTEsCi0JCXsgR0dJX0FVVE8sIEdHSV9BVVRPIH0sCi0JCXsgR0dJX0FVVE8sIEdHSV9BVVRPIH0sCi0JCXsgMCwgMCB9LAotCQlHVF9BVVRPLAotCQl7IEdHSV9BVVRPLCBHR0lfQVVUTyB9Ci0JfTsKLSAgICAgICAgY29uc3QgZ2dpX2RpcmVjdGJ1ZmZlciAqZGI7Ci0JZ2dpX2NvbG9yIHBhbFsyNTZdOwotCWludCBlcnI7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIkdHSV9TZXRWaWRlb01vZGUoKVxuIik7Ci0JCi0JbW9kZS52aXNpYmxlLnggPSBtb2RlLnZpcnQueCA9IHdpZHRoOwotCW1vZGUudmlzaWJsZS55ID0gbW9kZS52aXJ0LnkgPSBoZWlnaHQ7Ci0JCi0JLyogVHJhbnNsYXRlIHJlcXVlc3RlZCBTREwgYml0IGRlcHRoIGludG8gYSBHR0kgbW9kZSAqLwkKLQlzd2l0Y2ggKGJwcCkKLQl7Ci0JCWNhc2UgMTogIG1vZGUuZ3JhcGh0eXBlID0gR1RfMUJJVDsgIGJyZWFrOwotCQljYXNlIDI6ICBtb2RlLmdyYXBodHlwZSA9IEdUXzJCSVQ7ICBicmVhazsKLQkJY2FzZSA0OiAgbW9kZS5ncmFwaHR5cGUgPSBHVF80QklUOyAgYnJlYWs7Ci0JCWNhc2UgODogIG1vZGUuZ3JhcGh0eXBlID0gR1RfOEJJVDsgIGJyZWFrOwotCQljYXNlIDE1OiBtb2RlLmdyYXBodHlwZSA9IEdUXzE1QklUOyBicmVhazsKLQkJY2FzZSAxNjogbW9kZS5ncmFwaHR5cGUgPSBHVF8xNkJJVDsgYnJlYWs7Ci0JCWNhc2UgMjQ6IG1vZGUuZ3JhcGh0eXBlID0gR1RfMjRCSVQ7IGJyZWFrOwotCQljYXNlIDMyOiBtb2RlLmdyYXBodHlwZSA9IEdUXzMyQklUOyBicmVhazsKLQkJZGVmYXVsdDoKLQkJU0RMX1NldEVycm9yKCJVbmtub3duIFNETCBiaXQgZGVwdGgsIHVzaW5nIEdUX0FVVE8uLi4uXG4iKTsKLQkJbW9kZS5ncmFwaHR5cGUgPSBHVF9BVVRPOwotCX0KLQkKLQkvKiBWYWxpZGF0ZSBtb2RlLCBhdXRvZGV0ZWN0aW5nIGFueSBHR0lfQVVUTyBvciBHVF9BVVRPIGZpZWxkcyAqLwotCWdnaUNoZWNrTW9kZShWSVMsICZtb2RlKTsKLQkKLQkvKiBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBoYXZlIGEgdmFsaWQgbW9kZSAtIHRyeSB0byBzZXQgaXQgKi8KLQllcnIgPSBnZ2lTZXRNb2RlKFZJUywgJm1vZGUpOwotCi0JLyogSWYgd2UgY291bGRuJ3Qgc2V0IF9hbnlfIG1vZGVzLCBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZyAqLwotCWlmIChlcnIpCi0JewotCQlTRExfU2V0RXJyb3IoIkNhbid0IHNldCBhIG1vZGUhXG4iKTsKLQkJZ2dpQ2xvc2UoVklTKTsKLQkJZ2dpRXhpdCgpOwotCQlHR0lfVmlkZW9RdWl0KE5VTEwpOwotCX0KLQkKLQkvKiBTZXQgYSBwYWxldHRlIGZvciBwYWxsZXRpemVkIG1vZGVzICovCi0JaWYgKEdUX1NDSEVNRShtb2RlLmdyYXBodHlwZSkgPT0gR1RfUEFMRVRURSkKLQl7Ci0JCWdnaVNldENvbG9yZnVsUGFsZXR0ZShWSVMpOwotCQlnZ2lHZXRQYWxldHRlKFZJUywgMCwgMSA8PCBicHAsIHBhbCk7Ci0JfQotCQotCWRiID0gZ2dpREJHZXRCdWZmZXIoVklTLCAwKTsKLQkKLQkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCi0JY3VycmVudC0+ZmxhZ3MgPSAoU0RMX0ZVTExTQ1JFRU4gfCBTRExfSFdTVVJGQUNFKTsKLQljdXJyZW50LT53ID0gbW9kZS52aXJ0Lng7Ci0JY3VycmVudC0+aCA9IG1vZGUudmlydC55OwotCWN1cnJlbnQtPnBpdGNoID0gZGItPmJ1ZmZlci5wbGIuc3RyaWRlOwotCWN1cnJlbnQtPnBpeGVscyA9IGRiLT5yZWFkOwotCi0JLyogU2V0IHRoZSBibGl0IGZ1bmN0aW9uICovCi0JdGhpcy0+VXBkYXRlUmVjdHMgPSBHR0lfRGlyZWN0VXBkYXRlOwotCi0JLyogV2UncmUgZG9uZSAqLwotCXJldHVybihjdXJyZW50KTsKLX0KLQotc3RhdGljIGludCBHR0lfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigtMSk7Ci19Ci1zdGF0aWMgdm9pZCBHR0lfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotc3RhdGljIGludCBHR0lfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuKDApOwotfQotc3RhdGljIHZvaWQgR0dJX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBHR0lfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLQlpbnQgaTsKLQkKLS8qCWdnaUZsdXNoKFZJUyk7ICovCi0JCi0JZm9yIChpID0gMDsgaSA8IG51bXJlY3RzOyBpKyspCi0JewotCQlnZ2lGbHVzaFJlZ2lvbihWSVMsIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgpOwotCX0KLQlyZXR1cm47Ci19Ci0KLWludCBHR0lfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQotewotCWludCBpOwotCWdnaV9jb2xvciBwYWxbMjU2XTsKLQotCS8qIFNldCB1cCB0aGUgY29sb3JtYXAgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKQotCXsKLQkJcGFsW2ldLnIgPSAoY29sb3JzW2ldLnIgPDwgOCkgfCBjb2xvcnNbaV0ucjsKLQkJcGFsW2ldLmcgPSAoY29sb3JzW2ldLmcgPDwgOCkgfCBjb2xvcnNbaV0uZzsKLQkJcGFsW2ldLmIgPSAoY29sb3JzW2ldLmIgPDwgOCkgfCBjb2xvcnNbaV0uYjsKLQl9Ci0JCi0JZ2dpU2V0UGFsZXR0ZShWSVMsIGZpcnN0Y29sb3IsIG5jb2xvcnMsIHBhbCk7Ci0JCi0JcmV0dXJuIDE7Ci19Ci0JCi12b2lkIEdHSV9WaWRlb1F1aXQoX1RISVMpCi17Ci19Ci12b2lkIEdHSV9GaW5hbFF1aXQodm9pZCkgCi17Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2dpL1NETF9nZ2l2aWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDY4NzA0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZ2dpL1NETF9nZ2l2aWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9nZ2l2aWRlb19oCi0jZGVmaW5lIF9TRExfZ2dpdmlkZW9faAotCi0jaW5jbHVkZSA8Z2dpL2dnaS5oPgotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0KLSNkZWZpbmUgX1RISVMgU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi0KLXN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YQotewotCWdnaV92aXN1YWxfdCAqZ2dpdmlzOwotfTsKLQotZXh0ZXJuIGdnaV92aXN1YWxfdCBWSVM7IC8qIEZJWE1FOiB1c2UgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3QgKi8KLQotZXh0ZXJuIGludCBTRExfT3BlbktleWJvYXJkKHZvaWQpOwotZXh0ZXJuIHZvaWQgU0RMX0Nsb3NlS2V5Ym9hcmQodm9pZCk7Ci1leHRlcm4gaW50IFNETF9PcGVuTW91c2Uodm9pZCk7Ci1leHRlcm4gdm9pZCBTRExfQ2xvc2VNb3VzZSh2b2lkKTsKLQotI2VuZGlmIC8qIF9TRExfZ2dpdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9pcG9kL1NETF9pcG9kdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vaXBvZC9TRExfaXBvZHZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzQ3NjYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9pcG9kL1NETF9pcG9kdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2QuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXlib2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF9pcG9kdmlkZW8uaCIKLQotI2RlZmluZSBfVEhJUyBTRExfVmlkZW9EZXZpY2UgKnRoaXMKLQotc3RhdGljIGludCBpUG9kX1ZpZGVvSW5pdCAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKippUG9kX0xpc3RNb2RlcyAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIFNETF9TdXJmYWNlICppUG9kX1NldFZpZGVvTW9kZSAoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgaW50IGlQb2RfU2V0Q29sb3JzIChfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgdm9pZCBpUG9kX1VwZGF0ZVJlY3RzIChfVEhJUywgaW50IG5yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLXN0YXRpYyB2b2lkIGlQb2RfVmlkZW9RdWl0IChfVEhJUyk7Ci1zdGF0aWMgdm9pZCBpUG9kX1B1bXBFdmVudHMgKF9USElTKTsKLQotc3RhdGljIGxvbmcgaVBvZF9HZXRHZW5lcmF0aW9uKCk7Ci0KLXN0YXRpYyBpbnQgaW5pdGQgPSAwOwotc3RhdGljIGludCBrYmZkID0gLTE7Ci1zdGF0aWMgaW50IGZiZmQgPSAtMTsKLXN0YXRpYyBpbnQgb2xkdnQgPSAtMTsKLXN0YXRpYyBpbnQgY3VydnQgPSAtMTsKLXN0YXRpYyBpbnQgb2xkX2tibW9kZSA9IC0xOwotc3RhdGljIGxvbmcgZ2VuZXJhdGlvbiA9IDA7Ci1zdGF0aWMgc3RydWN0IHRlcm1pb3Mgb2xkX3Rlcm1pb3MsIGN1cl90ZXJtaW9zOwotCi1GSUxFICpkYmdvdXQ7Ci0KLSNkZWZpbmUgTENEX0RBVEEgICAgICAgICAgMHgxMAotI2RlZmluZSBMQ0RfQ01EICAgICAgICAgICAweDA4Ci0jZGVmaW5lIElQT0RfT0xEX0xDRF9CQVNFIDB4YzAwMDEwMDAKLSNkZWZpbmUgSVBPRF9PTERfTENEX1JUQyAgMHhjZjAwMTExMAotI2RlZmluZSBJUE9EX05FV19MQ0RfQkFTRSAweDcwMDAzMDAwCi0jZGVmaW5lIElQT0RfTkVXX0xDRF9SVEMgIDB4NjAwMDUwMTAKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbGNkX2Jhc2UsIGxjZF9ydGMsIGxjZF93aWR0aCwgbGNkX2hlaWdodDsKLQotc3RhdGljIGxvbmcgaVBvZF9HZXRHZW5lcmF0aW9uKCkgCi17Ci0gICAgaW50IGk7Ci0gICAgY2hhciBjcHVpbmZvWzI1Nl07Ci0gICAgY2hhciAqcHRyOwotICAgIEZJTEUgKmZpbGU7Ci0gICAgCi0gICAgaWYgKChmaWxlID0gZm9wZW4oIi9wcm9jL2NwdWluZm8iLCAiciIpKSAhPSBOVUxMKSB7Ci0Jd2hpbGUgKGZnZXRzKGNwdWluZm8sIHNpemVvZihjcHVpbmZvKSwgZmlsZSkgIT0gTlVMTCkKLQkgICAgaWYgKFNETF9zdHJuY21wKGNwdWluZm8sICJSZXZpc2lvbiIsIDgpID09IDApCi0JCWJyZWFrOwotCWZjbG9zZShmaWxlKTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgIWlzc3BhY2UoY3B1aW5mb1tpXSk7IGkrKyk7Ci0gICAgZm9yICg7IGlzc3BhY2UoY3B1aW5mb1tpXSk7IGkrKyk7Ci0gICAgcHRyID0gY3B1aW5mbyArIGkgKyAyOwotICAgIAotICAgIHJldHVybiBTRExfc3RydG9sKHB0ciwgTlVMTCwgMTApOwotfQotCi1zdGF0aWMgaW50IGlQb2RfQXZhaWxhYmxlKCkgCi17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGlQb2RfRGVsZXRlRGV2aWNlIChTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKLXsKLSAgICBmcmVlIChkZXZpY2UtPmhpZGRlbik7Ci0gICAgZnJlZSAoZGV2aWNlKTsKLX0KLQotdm9pZCBpUG9kX0luaXRPU0tleW1hcCAoX1RISVMpIHt9Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKmlQb2RfQ3JlYXRlRGV2aWNlIChpbnQgZGV2aW5kZXgpCi17Ci0gICAgU0RMX1ZpZGVvRGV2aWNlICp0aGlzOwotICAgIAotICAgIHRoaXMgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyAoc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotICAgIGlmICh0aGlzKSB7Ci0JbWVtc2V0ICh0aGlzLCAwLCBzaXplb2YgKnRoaXMpOwotCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikgU0RMX21hbGxvYyAoc2l6ZW9mKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSkpOwotICAgIH0KLSAgICBpZiAoIXRoaXMgfHwgIXRoaXMtPmhpZGRlbikgewotCVNETF9PdXRPZk1lbW9yeSgpOwotCWlmICh0aGlzKQotCSAgICBTRExfZnJlZSAodGhpcyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIG1lbXNldCAodGhpcy0+aGlkZGVuLCAwLCBzaXplb2Yoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhKSk7Ci0gICAgCi0gICAgZ2VuZXJhdGlvbiA9IGlQb2RfR2V0R2VuZXJhdGlvbigpOwotCi0gICAgdGhpcy0+VmlkZW9Jbml0ID0gaVBvZF9WaWRlb0luaXQ7Ci0gICAgdGhpcy0+TGlzdE1vZGVzID0gaVBvZF9MaXN0TW9kZXM7Ci0gICAgdGhpcy0+U2V0VmlkZW9Nb2RlID0gaVBvZF9TZXRWaWRlb01vZGU7Ci0gICAgdGhpcy0+U2V0Q29sb3JzID0gaVBvZF9TZXRDb2xvcnM7Ci0gICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBpUG9kX1VwZGF0ZVJlY3RzOwotICAgIHRoaXMtPlZpZGVvUXVpdCA9IGlQb2RfVmlkZW9RdWl0OwotICAgIHRoaXMtPkFsbG9jSFdTdXJmYWNlID0gMDsKLSAgICB0aGlzLT5DaGVja0hXQmxpdCA9IDA7Ci0gICAgdGhpcy0+RmlsbEhXUmVjdCA9IDA7Ci0gICAgdGhpcy0+U2V0SFdDb2xvcktleSA9IDA7Ci0gICAgdGhpcy0+U2V0SFdBbHBoYSA9IDA7Ci0gICAgdGhpcy0+TG9ja0hXU3VyZmFjZSA9IDA7Ci0gICAgdGhpcy0+VW5sb2NrSFdTdXJmYWNlID0gMDsKLSAgICB0aGlzLT5GbGlwSFdTdXJmYWNlID0gMDsKLSAgICB0aGlzLT5GcmVlSFdTdXJmYWNlID0gMDsKLSAgICB0aGlzLT5TZXRDYXB0aW9uID0gMDsKLSAgICB0aGlzLT5TZXRJY29uID0gMDsKLSAgICB0aGlzLT5JY29uaWZ5V2luZG93ID0gMDsKLSAgICB0aGlzLT5HcmFiSW5wdXQgPSAwOwotICAgIHRoaXMtPkdldFdNSW5mbyA9IDA7Ci0gICAgdGhpcy0+SW5pdE9TS2V5bWFwID0gaVBvZF9Jbml0T1NLZXltYXA7Ci0gICAgdGhpcy0+UHVtcEV2ZW50cyA9IGlQb2RfUHVtcEV2ZW50czsKLSAgICB0aGlzLT5mcmVlID0gaVBvZF9EZWxldGVEZXZpY2U7Ci0KLSAgICByZXR1cm4gdGhpczsKLX0KLQotVmlkZW9Cb290U3RyYXAgaVBvZF9ib290c3RyYXAgPSB7Ci0gICAgImlwb2QiLCAiaVBvZCBGcmFtZWJ1ZmZlciBEcml2ZXIiLAotICAgIGlQb2RfQXZhaWxhYmxlLCBpUG9kX0NyZWF0ZURldmljZQotfTsKLQotLy8tLS8vCi0KLXN0YXRpYyBpbnQgaVBvZF9WaWRlb0luaXQgKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCi17Ci0gICAgaWYgKCFpbml0ZCkgewotCS8qKiogQ29kZSBhZGFwdGVkL2NvcGllZCBmcm9tIFNETCBmYmNvbiBkcml2ZXIuICoqKi8KLQotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHR5MFtdID0geyAiL2Rldi90dHkwIiwgIi9kZXYvdmMvMCIsIDAgfTsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZjc1tdID0geyAiL2Rldi92Yy8lZCIsICIvZGV2L3R0eSVkIiwgMCB9OwotCWludCBpLCB0dHkwX2ZkOwotCi0JZGJnb3V0ID0gZmRvcGVuIChvcGVuICgiL2V0Yy9zZGxwb2QubG9nIiwgT19XUk9OTFkgfCBPX1NZTkMgfCBPX0FQUEVORCksICJhIik7Ci0JaWYgKGRiZ291dCkgewotCSAgICBzZXRidWYgKGRiZ291dCwgMCk7Ci0JICAgIGZwcmludGYgKGRiZ291dCwgIi0tPiBTdGFydGVkIFNETCA8LS1cbiIpOwotCX0KLQotCS8vIFRyeSB0byBxdWVyeSBmb3IgYSBmcmVlIFZUCi0JdHR5MF9mZCA9IC0xOwotCWZvciAoIGk9MDsgdHR5MFtpXSAmJiAodHR5MF9mZCA8IDApOyArK2kgKSB7Ci0JICAgIHR0eTBfZmQgPSBvcGVuKHR0eTBbaV0sIE9fV1JPTkxZLCAwKTsKLQl9Ci0JaWYgKCB0dHkwX2ZkIDwgMCApIHsKLQkgICAgdHR5MF9mZCA9IGR1cCgwKTsgLyogTWF5YmUgc3RkaW4gaXMgYSBWVD8gKi8KLQl9Ci0JaW9jdGwodHR5MF9mZCwgVlRfT1BFTlFSWSwgJmN1cnZ0KTsKLQljbG9zZSh0dHkwX2ZkKTsKLQotCXR0eTBfZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUiwgMCk7Ci0JaWYgKCB0dHkwX2ZkID49IDAgKSB7Ci0JICAgIGlvY3RsKHR0eTBfZmQsIFRJT0NOT1RUWSwgMCk7Ci0JICAgIGNsb3NlKHR0eTBfZmQpOwotCX0KLQotCWlmICggKGdldGV1aWQoKSA9PSAwKSAmJiAoY3VydnQgPiAwKSApIHsKLQkgICAgZm9yICggaT0wOyB2Y3NbaV0gJiYgKGtiZmQgPCAwKTsgKytpICkgewotCQljaGFyIHZ0cGF0aFsxMl07Ci0JCQotCQlTRExfc25wcmludGYodnRwYXRoLCBTRExfYXJyYXlzaXplKHZ0cGF0aCksIHZjc1tpXSwgY3VydnQpOwotCQlrYmZkID0gb3Blbih2dHBhdGgsIE9fUkRXUik7Ci0JICAgIH0KLQl9Ci0JaWYgKCBrYmZkIDwgMCApIHsKLQkgICAgaWYgKGRiZ291dCkgZnByaW50ZiAoZGJnb3V0LCAiQ291bGRuJ3Qgb3BlbiBhbnkgVkNcbiIpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCWlmIChkYmdvdXQpIGZwcmludGYgKHN0ZGVyciwgIkN1cnJlbnQgVlQ6ICVkXG4iLCBjdXJ2dCk7Ci0KLQlpZiAoa2JmZCA+PSAwKSB7Ci0JICAgIC8qIFN3aXRjaCB0byB0aGUgY29ycmVjdCB2aXJ0dWFsIHRlcm1pbmFsICovCi0JICAgIGlmICggY3VydnQgPiAwICkgewotCQlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXRlOwotCQkKLQkJaWYgKCBpb2N0bChrYmZkLCBWVF9HRVRTVEFURSwgJnZ0c3RhdGUpID09IDAgKSB7Ci0JCSAgICBvbGR2dCA9IHZ0c3RhdGUudl9hY3RpdmU7Ci0JCX0KLQkJaWYgKCBpb2N0bChrYmZkLCBWVF9BQ1RJVkFURSwgY3VydnQpID09IDAgKSB7Ci0JCSAgICBpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJXYWl0aW5nIGZvciBzd2l0Y2ggdG8gdGhpcyBWVC4uLiAiKTsKLQkJICAgIGlvY3RsKGtiZmQsIFZUX1dBSVRBQ1RJVkUsIGN1cnZ0KTsKLQkJICAgIGlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgImRvbmUhXG4iKTsKLQkJfQotCSAgICB9Ci0KLQkgICAgLy8gU2V0IHRlcm1pbmFsIGlucHV0IG1vZGUKLQkgICAgaWYgKHRjZ2V0YXR0ciAoa2JmZCwgJm9sZF90ZXJtaW9zKSA8IDApIHsKLQkJaWYgKGRiZ291dCkgZnByaW50ZiAoZGJnb3V0LCAiQ2FuJ3QgZ2V0IHRlcm1pb3NcbiIpOwotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQkgICAgY3VyX3Rlcm1pb3MgPSBvbGRfdGVybWlvczsKLQkgICAgLy8JICAgIGN1cl90ZXJtaW9zLmNfaWZsYWcgJj0gfihJQ1JOTCB8IElOUENLIHwgSVNUUklQIHwgSVhPTik7Ci0JICAgIC8vCSAgICBjdXJfdGVybWlvcy5jX2lmbGFnIHw9IChCUktJTlQpOwotCSAgICAvLwkgICAgY3VyX3Rlcm1pb3MuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBJU0lHIHwgSUVYVEVOKTsKLQkgICAgLy8JICAgIGN1cl90ZXJtaW9zLmNfb2ZsYWcgJj0gfihPUE9TVCk7Ci0JICAgIC8vCSAgICBjdXJfdGVybWlvcy5jX29mbGFnIHw9IChPTk9DUiB8IE9OTFJFVCk7Ci0JICAgIGN1cl90ZXJtaW9zLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgSVNJRyk7Ci0JICAgIGN1cl90ZXJtaW9zLmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJR05DUiB8IElDUk5MIHwgSU5MQ1IgfCBJWE9GRiB8IElYT04pOwotCSAgICBjdXJfdGVybWlvcy5jX2NjW1ZNSU5dID0gMDsKLQkgICAgY3VyX3Rlcm1pb3MuY19jY1tWVElNRV0gPSAwOwotCSAgICAKLQkgICAgaWYgKHRjc2V0YXR0ciAoa2JmZCwgVENTQUZMVVNILCAmY3VyX3Rlcm1pb3MpIDwgMCkgewotCQlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJDYW4ndCBzZXQgdGVybWlvc1xuIik7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCSAgICBpZiAoaW9jdGwgKGtiZmQsIEtEU0tCTU9ERSwgS19NRURJVU1SQVcpIDwgMCkgewotCQlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJDYW4ndCBzZXQgbWVkaXVtLXJhdyBtb2RlXG4iKTsKLQkJcmV0dXJuIC0xOwotCSAgICB9Ci0JICAgIGlmIChpb2N0bCAoa2JmZCwgS0RTRVRNT0RFLCBLRF9HUkFQSElDUykgPCAwKSB7Ci0JCWlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgIkNhbid0IHNldCBncmFwaGljc1xuIik7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCX0KLQotCS8vIE9wZW4gdGhlIGZyYW1lYnVmZmVyCi0JaWYgKChmYmZkID0gb3BlbiAoIi9kZXYvZmIwIiwgT19SRFdSKSkgPCAwKSB7Ci0JICAgIGlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgIkNhbid0IG9wZW4gZnJhbWVidWZmZXJcbiIpOwotCSAgICByZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZpbmZvOwotCi0JICAgIGlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgIkdlbmVyYXRpb246ICVsZFxuIiwgZ2VuZXJhdGlvbik7Ci0KLQkgICAgaWYgKGdlbmVyYXRpb24gPj0gNDAwMDApIHsKLQkJbGNkX2Jhc2UgPSBJUE9EX05FV19MQ0RfQkFTRTsKLQkgICAgfSBlbHNlIHsKLQkJbGNkX2Jhc2UgPSBJUE9EX09MRF9MQ0RfQkFTRTsKLQkgICAgfQotCSAgICAKLQkgICAgaW9jdGwgKGZiZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2aW5mbyk7Ci0JICAgIGNsb3NlIChmYmZkKTsKLQotCSAgICBpZiAobGNkX2Jhc2UgPT0gSVBPRF9PTERfTENEX0JBU0UpCi0JCWxjZF9ydGMgPSBJUE9EX09MRF9MQ0RfUlRDOwotCSAgICBlbHNlIGlmIChsY2RfYmFzZSA9PSBJUE9EX05FV19MQ0RfQkFTRSkKLQkJbGNkX3J0YyA9IElQT0RfTkVXX0xDRF9SVEM7Ci0JICAgIGVsc2UgewotCQlTRExfU2V0RXJyb3IgKCJVbmtub3duIGlQb2QgdmVyc2lvbiIpOwotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQotCSAgICBsY2Rfd2lkdGggPSB2aW5mby54cmVzOwotCSAgICBsY2RfaGVpZ2h0ID0gdmluZm8ueXJlczsKLQotCSAgICBpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJMQ0QgaXMgJWR4JWRcbiIsIGxjZF93aWR0aCwgbGNkX2hlaWdodCk7Ci0JfQotCi0JZmNudGwgKGtiZmQsIEZfU0VURkwsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOwotCi0JLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCi0JdGhpcy0+aW5mby5jdXJyZW50X3cgPSBsY2Rfd2lkdGg7Ci0JdGhpcy0+aW5mby5jdXJyZW50X2ggPSBsY2RfaGVpZ2h0OwotCi0JaWYgKChnZW5lcmF0aW9uID49IDYwMDAwKSAmJiAoZ2VuZXJhdGlvbiA8IDcwMDAwKSkgewotCSAgICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSAxNjsKLQkgICAgdmZvcm1hdC0+Um1hc2sgPSAweEY4MDA7Ci0JICAgIHZmb3JtYXQtPkdtYXNrID0gMHgwN0UwOwotCSAgICB2Zm9ybWF0LT5CbWFzayA9IDB4MDAxRjsKLQl9IGVsc2UgewotCSAgICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSA4OwotCSAgICB2Zm9ybWF0LT5SbWFzayA9IHZmb3JtYXQtPkdtYXNrID0gdmZvcm1hdC0+Qm1hc2sgPSAwOwotCX0KLQotCWluaXRkID0gMTsKLQlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJJbml0aWFsaXplZC5cblxuIik7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgU0RMX1JlY3QgKippUG9kX0xpc3RNb2RlcyAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCi17Ci0gICAgaW50IHdpZHRoLCBoZWlnaHQsIGZkOwotICAgIHN0YXRpYyBTRExfUmVjdCByOwotICAgIHN0YXRpYyBTRExfUmVjdCAqcnNbMl0gPSB7ICZyLCAwIH07Ci0KLSAgICBpZiAoKGZkID0gb3BlbiAoIi9kZXYvZmIwIiwgT19SRFdSKSkgPCAwKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmluZm87Ci0JCi0JaW9jdGwgKGZiZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2aW5mbyk7Ci0JY2xvc2UgKGZiZmQpOwotCQotCXdpZHRoID0gdmluZm8ueHJlczsKLQloZWlnaHQgPSB2aW5mby55cmVzOwotICAgIH0KLSAgICByLnggPSByLnkgPSAwOwotICAgIHIudyA9IHdpZHRoOwotICAgIHIuaCA9IGhlaWdodDsKLSAgICByZXR1cm4gcnM7Ci19Ci0KLQotc3RhdGljIFNETF9TdXJmYWNlICppUG9kX1NldFZpZGVvTW9kZSAoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsCi0JCQkJICAgICAgIFVpbnQzMiBmbGFncykKLXsKLSAgICBVaW50MzIgUm1hc2ssIEdtYXNrLCBCbWFzazsKLSAgICBpZiAoYnBwID4gOCkgewotCVJtYXNrID0gMHhGODAwOwotCUdtYXNrID0gMHgwN0UwOwotCUJtYXNrID0gMHgwMDFGOwkKLSAgICB9IGVsc2UgewotCVJtYXNrID0gR21hc2sgPSBCbWFzayA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHRoaXMtPmhpZGRlbi0+YnVmZmVyKSBTRExfZnJlZSAodGhpcy0+aGlkZGVuLT5idWZmZXIpOwotICAgIHRoaXMtPmhpZGRlbi0+YnVmZmVyID0gU0RMX21hbGxvYyAod2lkdGggKiBoZWlnaHQgKiAoYnBwIC8gOCkpOwotICAgIGlmICghdGhpcy0+aGlkZGVuLT5idWZmZXIpIHsKLQlTRExfU2V0RXJyb3IgKCJDb3VsZG4ndCBhbGxvY2F0ZSBidWZmZXIgZm9yIHJlcXVlc3RlZCBtb2RlIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbWVtc2V0ICh0aGlzLT5oaWRkZW4tPmJ1ZmZlciwgMCwgd2lkdGggKiBoZWlnaHQgKiAoYnBwIC8gOCkpOwotCi0gICAgaWYgKCFTRExfUmVhbGxvY0Zvcm1hdCAoY3VycmVudCwgYnBwLCBSbWFzaywgR21hc2ssIEJtYXNrLCAwKSkgewotCVNETF9TZXRFcnJvciAoIkNvdWxkbid0IGFsbG9jYXRlIG5ldyBwaXhlbCBmb3JtYXQiKTsKLQlTRExfZnJlZSAodGhpcy0+aGlkZGVuLT5idWZmZXIpOwotCXRoaXMtPmhpZGRlbi0+YnVmZmVyID0gMDsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoYnBwIDw9IDgpIHsKLQlpbnQgaSwgajsKLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDQpIHsKLQkgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotCQljdXJyZW50LT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tpK2pdLnIgPSA4NSAqIGo7Ci0JCWN1cnJlbnQtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2kral0uZyA9IDg1ICogajsKLQkJY3VycmVudC0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbaStqXS5iID0gODUgKiBqOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGN1cnJlbnQtPmZsYWdzID0gZmxhZ3MgJiBTRExfRlVMTFNDUkVFTjsKLSAgICB0aGlzLT5oaWRkZW4tPncgPSBjdXJyZW50LT53ID0gd2lkdGg7Ci0gICAgdGhpcy0+aGlkZGVuLT5oID0gY3VycmVudC0+aCA9IGhlaWdodDsKLSAgICBjdXJyZW50LT5waXRjaCA9IGN1cnJlbnQtPncgKiAoYnBwIC8gOCk7Ci0gICAgY3VycmVudC0+cGl4ZWxzID0gdGhpcy0+aGlkZGVuLT5idWZmZXI7Ci0KLSAgICByZXR1cm4gY3VycmVudDsKLX0KLQotc3RhdGljIGludCBpUG9kX1NldENvbG9ycyAoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0gICAgaWYgKFNETF9WaWRlb1N1cmZhY2UgJiYgU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0ICYmIFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZSkgewotCWludCBpLCBqOwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gNCkgewotCSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCVNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2kral0uciA9IDg1ICogajsKLQkJU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbaStqXS5nID0gODUgKiBqOwotCQlTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tpK2pdLmIgPSA4NSAqIGo7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpUG9kX1ZpZGVvUXVpdCAoX1RISVMpCi17Ci0gICAgaW9jdGwgKGtiZmQsIEtEU0VUTU9ERSwgS0RfVEVYVCk7Ci0gICAgdGNzZXRhdHRyIChrYmZkLCBUQ1NBRkxVU0gsICZvbGRfdGVybWlvcyk7Ci0gICAgb2xkX2tibW9kZSA9IC0xOwotCi0gICAgaWYgKG9sZHZ0ID4gMCkKLQlpb2N0bCAoa2JmZCwgVlRfQUNUSVZBVEUsIG9sZHZ0KTsKLSAgICAKLSAgICBpZiAoa2JmZCA+IDApCi0JY2xvc2UgKGtiZmQpOwotCi0gICAgaWYgKGRiZ291dCkgewotCWZwcmludGYgKGRiZ291dCwgIjwtLSBFbmRlZCBTREwgLS0+XG4iKTsKLQlmY2xvc2UgKGRiZ291dCk7Ci0gICAgfQotICAgIAotICAgIGtiZmQgPSAtMTsKLX0KLQotc3RhdGljIGNoYXIgaVBvZF9TQ19rZXltYXBbXSA9IHsKLSAgICAwLAkJCQkvKiAwIC0gbm8ga2V5ICovCi0gICAgJ1snIC0gMHg0MCwJCQkvKiBFU0MgKEN0cmwrWykgKi8KLSAgICAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAotICAgICctJywgJz0nLAotICAgICdcYicsICdcdCcsCQkJLyogQmFja3NwYWNlLCBUYWIgKEN0cmwrSCxDdHJsK0kpICovCi0gICAgJ3EnLCAndycsICdlJywgJ3InLCAndCcsICd5JywgJ3UnLCAnaScsICdvJywgJ3AnLCAnWycsICddJywKLSAgICAnXG4nLCAwLAkJCS8qIEVudGVyLCBMZWZ0IENUUkwgKi8KLSAgICAnYScsICdzJywgJ2QnLCAnZicsICdnJywgJ2gnLCAnaicsICdrJywgJ2wnLCAnOycsICdcJycsICdgJywKLSAgICAwLCAnXFwnLAkJCS8qIGxlZnQgc2hpZnQsIGJhY2tzbGFzaCAqLwotICAgICd6JywgJ3gnLCAnYycsICd2JywgJ2InLCAnbicsICdtJywgJywnLCAnLicsICcvJywKLSAgICAwLCAnKicsIDAsICcgJywgMCwJCS8qIHJpZ2h0IHNoaWZ0LCBLUCBtdWwsIGxlZnQgYWx0LCBzcGFjZSwgY2Fwc2xvY2sgKi8KLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvKiBGMS0xMCAqLwotICAgIDAsIDAsCQkJLyogbnVtbG9jaywgc2Nyb2xsb2NrICovCi0gICAgJzcnLCAnOCcsICc5JywgJy0nLCAnNCcsICc1JywgJzYnLCAnKycsICcxJywgJzInLCAnMycsICcwJywgJy4nLCAvKiBudW1lcmljIGtleXBhZCAqLwotICAgIDAsIDAsCQkJLyogcGFkZGluZyAqLwotICAgIDAsIDAsIDAsCQkJLyogImxlc3MiICg/KSwgRjExLCBGMTIgKi8KLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiBwYWRkaW5nICovCi0gICAgJ1xuJywgMCwgJy8nLCAwLCAwLAkvKiBLUCBlbnRlciwgUmN0cmwsIEN0cmwsIEtQIGRpdiwgUHJ0U2MsIFJBbHQgKi8KLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiBCcmVhaywgSG9tZSwgVXAsIFBnVXAsIExlZnQsIFJpZ2h0LCBFbmQsIERvd24sIFBnRG4gKi8KLSAgICAwLCAwLAkJCS8qIElucywgRGVsICovCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLyogcGFkZGluZyAqLwotICAgIDAsIDAsCQkJLyogUldpbiwgTFdpbiAqLwotICAgIDAJCQkJLyogbm8ga2V5ICovCi19OwotICAgIAotCi1zdGF0aWMgdm9pZCBpUG9kX2tleWJvYXJkKCkgCi17Ci0gICAgdW5zaWduZWQgY2hhciBrZXlidWZbMTI4XTsKLSAgICBpbnQgaSwgbnJlYWQ7Ci0gICAgU0RMX2tleXN5bSBrZXlzeW07Ci0gICAgU0RMX0V2ZW50IGV2OwotCi0gICAga2V5c3ltLm1vZCA9IDA7Ci0gICAga2V5c3ltLnNjYW5jb2RlID0gMHhmZjsKLSAgICBtZW1zZXQgKCZldiwgMCwgc2l6ZW9mKFNETF9FdmVudCkpOwotCi0gICAgbnJlYWQgPSByZWFkIChrYmZkLCBrZXlidWYsIDEyOCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5yZWFkOyBpKyspIHsKLQljaGFyIGFzY2lpID0gaVBvZF9TQ19rZXltYXBba2V5YnVmW2ldICYgMHg3Zl07Ci0KLQlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJLZXkhICUwMnggaXMgJWMgJXMiLCBrZXlidWZbaV0sIGFzY2lpLCAoa2V5YnVmW2ldICYgMHg4MCk/ICJ1cCIgOiAiZG93biIpOwotCi0Ja2V5c3ltLnN5bSA9IGtleXN5bS51bmljb2RlID0gYXNjaWk7Ci0JZXYudHlwZSA9IChrZXlidWZbaV0gJiAweDgwKT8gU0RMX0tFWVVQIDogU0RMX0tFWURPV047Ci0JZXYua2V5LnN0YXRlID0gMDsKLQlldi5rZXkua2V5c3ltID0ga2V5c3ltOwotCVNETF9QdXNoRXZlbnQgKCZldik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBpUG9kX1B1bXBFdmVudHMgKF9USElTKSAKLXsKLSAgICBmZF9zZXQgZmRzZXQ7Ci0gICAgaW50IG1heF9mZCA9IDA7Ci0gICAgc3RhdGljIHN0cnVjdCB0aW1ldmFsIHplcm87Ci0gICAgaW50IHBvc3RlZDsKLQotICAgIGRvIHsKLQlwb3N0ZWQgPSAwOwotCi0JRkRfWkVSTyAoJmZkc2V0KTsKLQlpZiAoa2JmZCA+PSAwKSB7Ci0JICAgIEZEX1NFVCAoa2JmZCwgJmZkc2V0KTsKLQkgICAgbWF4X2ZkID0ga2JmZDsKLQl9Ci0JaWYgKGRiZ291dCkgZnByaW50ZiAoZGJnb3V0LCAiU2VsZWN0aW5nIik7Ci0JaWYgKHNlbGVjdCAobWF4X2ZkICsgMSwgJmZkc2V0LCAwLCAwLCAmemVybykgPiAwKSB7Ci0JICAgIGlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgIiAtPiBtYXRjaCFcbiIpOwotCSAgICBpUG9kX2tleWJvYXJkKCk7Ci0JICAgIHBvc3RlZCsrOwotCX0KLQlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJcbiIpOwotICAgIH0gd2hpbGUgKHBvc3RlZCk7Ci19Ci0KLS8vIGVub3VnaCBzcGFjZSBmb3IgMTYweDEyOHgyCi1zdGF0aWMgY2hhciBpcG9kX3NjclsxNjAgKiAoMTI4LzQpXTsKLQotI2RlZmluZSBvdXRsKGRhdHVtLGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoYWRkcikgPSAoZGF0dW0pKQotI2RlZmluZSBpbmwoYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShhZGRyKSkKLQotLyoqKiBUaGUgZm9sbG93aW5nIExDRCBjb2RlIGlzIHRha2VuIGZyb20gTGludXgga2VybmVsIHVjbGludXgtMi40LjI0LXVjMC1pcG9kMiwKLSAgICAgZmlsZSBhcmNoL2FybW5vbW11L21hY2gtaXBvZC9mYi5jLiBBIGZldyBtb2RpZmljYXRpb25zIGhhdmUgYmVlbiBtYWRlLiAqKiovCi0KLS8qIGdldCBjdXJyZW50IHVzZWMgY291bnRlciAqLwotc3RhdGljIGludCBNX3RpbWVyX2dldF9jdXJyZW50KHZvaWQpCi17Ci0JcmV0dXJuIGlubChsY2RfcnRjKTsKLX0KLQotLyogY2hlY2sgaWYgbnVtYmVyIG9mIHVzZWNvbmRzIGhhcyBwYXN0ICovCi1zdGF0aWMgaW50IE1fdGltZXJfY2hlY2soaW50IGNsb2NrX3N0YXJ0LCBpbnQgdXNlY3MpCi17Ci0JdW5zaWduZWQgbG9uZyBjbG9jazsKLQljbG9jayA9IGlubChsY2RfcnRjKTsKLQkKLQlpZiAoIChjbG9jayAtIGNsb2NrX3N0YXJ0KSA+PSB1c2VjcyApIHsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKiB3YWl0IGZvciBMQ0Qgd2l0aCB0aW1lb3V0ICovCi1zdGF0aWMgdm9pZCBNX2xjZF93YWl0X3dyaXRlKHZvaWQpCi17Ci0JaWYgKCAoaW5sKGxjZF9iYXNlKSAmIDB4ODAwMCkgIT0gMCApIHsKLQkJaW50IHN0YXJ0ID0gTV90aW1lcl9nZXRfY3VycmVudCgpOwotCQkJCi0JCWRvIHsKLQkJCWlmICggKGlubChsY2RfYmFzZSkgJiAodW5zaWduZWQgaW50KTB4ODAwMCkgPT0gMCApIAotCQkJCWJyZWFrOwotCQl9IHdoaWxlICggTV90aW1lcl9jaGVjayhzdGFydCwgMTAwMCkgPT0gMCApOwotCX0KLX0KLQotCi0vKiBzZW5kIExDRCBkYXRhICovCi1zdGF0aWMgdm9pZCBNX2xjZF9zZW5kX2RhdGEoaW50IGRhdGFfbG8sIGludCBkYXRhX2hpKQotewotCU1fbGNkX3dhaXRfd3JpdGUoKTsKLQkKLQlvdXRsKGRhdGFfbG8sIGxjZF9iYXNlICsgTENEX0RBVEEpOwotCQkKLQlNX2xjZF93YWl0X3dyaXRlKCk7Ci0JCi0Jb3V0bChkYXRhX2hpLCBsY2RfYmFzZSArIExDRF9EQVRBKTsKLQotfQotCi0vKiBzZW5kIExDRCBjb21tYW5kICovCi1zdGF0aWMgdm9pZAotTV9sY2RfcHJlcGFyZV9jbWQoaW50IGNtZCkKLXsKLQlNX2xjZF93YWl0X3dyaXRlKCk7Ci0KLQlvdXRsKDB4MCwgbGNkX2Jhc2UgKyBMQ0RfQ01EKTsKLQotCU1fbGNkX3dhaXRfd3JpdGUoKTsKLQkKLQlvdXRsKGNtZCwgbGNkX2Jhc2UgKyBMQ0RfQ01EKTsKLQkKLX0KLQotLyogc2VuZCBMQ0QgY29tbWFuZCBhbmQgZGF0YSAqLwotc3RhdGljIHZvaWQgTV9sY2RfY21kX2FuZF9kYXRhKGludCBjbWQsIGludCBkYXRhX2xvLCBpbnQgZGF0YV9oaSkKLXsKLQlNX2xjZF9wcmVwYXJlX2NtZChjbWQpOwotCi0JTV9sY2Rfc2VuZF9kYXRhKGRhdGFfbG8sIGRhdGFfaGkpOwotfQotCi0vLyBDb3BpZWQgZnJvbSB1Vwotc3RhdGljIHZvaWQgTV91cGRhdGVfZGlzcGxheShpbnQgc3gsIGludCBzeSwgaW50IG14LCBpbnQgbXkpCi17Ci0JaW50IHk7Ci0JdW5zaWduZWQgc2hvcnQgY3Vyc29yX3BvczsKLQotCXN4ID4+PSAzOwotCW14ID4+PSAzOwotCi0JY3Vyc29yX3BvcyA9IHN4ICsgKHN5IDw8IDUpOwotCi0JZm9yICggeSA9IHN5OyB5IDw9IG15OyB5KysgKSB7Ci0JCXVuc2lnbmVkIGNoYXIgKmltZ19kYXRhOwotCQlpbnQgeDsKLQotCQkvKiBtb3ZlIHRoZSBjdXJzb3IgKi8KLQkJTV9sY2RfY21kX2FuZF9kYXRhKDB4MTEsIGN1cnNvcl9wb3MgPj4gOCwgY3Vyc29yX3BvcyAmIDB4ZmYpOwotCi0JCS8qIHNldHVwIGZvciBwcmludGluZyAqLwotCQlNX2xjZF9wcmVwYXJlX2NtZCgweDEyKTsKLQotCQlpbWdfZGF0YSA9IGlwb2Rfc2NyICsgKHN4IDw8IDEpICsgKHkgKiAobGNkX3dpZHRoLzQpKTsKLQotCQkvKiBsb29wcyB1cCB0byAxNjAgdGltZXMgKi8KLQkJZm9yICggeCA9IHN4OyB4IDw9IG14OyB4KysgKSB7Ci0JCSAgICAgICAgLyogZGlzcGxheSBlaWdodCBwaXhlbHMgKi8KLQkJCU1fbGNkX3NlbmRfZGF0YSgqKGltZ19kYXRhICsgMSksICppbWdfZGF0YSk7Ci0KLQkJCWltZ19kYXRhICs9IDI7Ci0JCX0KLQotCQkvKiB1cGRhdGUgY3Vyc29yIHBvcyBjb3VudGVyICovCi0JCWN1cnNvcl9wb3MgKz0gMHgyMDsKLQl9Ci19Ci0KLS8qIGdldCBjdXJyZW50IHVzZWMgY291bnRlciAqLwotc3RhdGljIGludCBDX3RpbWVyX2dldF9jdXJyZW50KHZvaWQpCi17Ci0JcmV0dXJuIGlubCgweDYwMDA1MDEwKTsKLX0KLQotLyogY2hlY2sgaWYgbnVtYmVyIG9mIHVzZWNvbmRzIGhhcyBwYXN0ICovCi1zdGF0aWMgaW50IENfdGltZXJfY2hlY2soaW50IGNsb2NrX3N0YXJ0LCBpbnQgdXNlY3MpCi17Ci0JdW5zaWduZWQgbG9uZyBjbG9jazsKLQljbG9jayA9IGlubCgweDYwMDA1MDEwKTsKLQkKLQlpZiAoIChjbG9jayAtIGNsb2NrX3N0YXJ0KSA+PSB1c2VjcyApIHsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKiB3YWl0IGZvciBMQ0Qgd2l0aCB0aW1lb3V0ICovCi1zdGF0aWMgdm9pZCBDX2xjZF93YWl0X3dyaXRlKHZvaWQpCi17Ci0JaWYgKChpbmwoMHg3MDAwOEEwQykgJiAweDgwMDAwMDAwKSAhPSAwKSB7Ci0JCWludCBzdGFydCA9IENfdGltZXJfZ2V0X2N1cnJlbnQoKTsKLQkJCQotCQlkbyB7Ci0JCQlpZiAoKGlubCgweDcwMDA4QTBDKSAmIDB4ODAwMDAwMDApID09IDApIAotCQkJCWJyZWFrOwotCQl9IHdoaWxlIChDX3RpbWVyX2NoZWNrKHN0YXJ0LCAxMDAwKSA9PSAwKTsKLQl9Ci19Ci1zdGF0aWMgdm9pZCBDX2xjZF9jbWRfZGF0YShpbnQgY21kLCBpbnQgZGF0YSkKLXsKLQlDX2xjZF93YWl0X3dyaXRlKCk7Ci0Jb3V0bChjbWQgfCAweDgwMDAwMDAwLCAweDcwMDA4QTBDKTsKLQotCUNfbGNkX3dhaXRfd3JpdGUoKTsKLQlvdXRsKGRhdGEgfCAweDgwMDAwMDAwLCAweDcwMDA4QTBDKTsKLX0KLQotc3RhdGljIHZvaWQgQ191cGRhdGVfZGlzcGxheShpbnQgc3gsIGludCBzeSwgaW50IG14LCBpbnQgbXkpCi17Ci0JaW50IGhlaWdodCA9IChteSAtIHN5KSArIDE7Ci0JaW50IHdpZHRoID0gKG14IC0gc3gpICsgMTsKLQotCWNoYXIgKmFkZHIgPSBTRExfVmlkZW9TdXJmYWNlLT5waXhlbHM7Ci0KLQlpZiAod2lkdGggJiAxKSB3aWR0aCsrOwotCi0JLyogc3RhcnQgWCBhbmQgWSAqLwotCUNfbGNkX2NtZF9kYXRhKDB4MTIsIChzeSAmIDB4ZmYpKTsKLQlDX2xjZF9jbWRfZGF0YSgweDEzLCAoKChTRExfVmlkZW9TdXJmYWNlLT53IC0gMSkgLSBzeCkgJiAweGZmKSk7Ci0KLQkvKiBtYXggWCBhbmQgWSAqLwotCUNfbGNkX2NtZF9kYXRhKDB4MTUsICgoKHN5ICsgaGVpZ2h0KSAtIDEpICYgMHhmZikpOwotCUNfbGNkX2NtZF9kYXRhKDB4MTYsICgoKCgoU0RMX1ZpZGVvU3VyZmFjZS0+dyAtIDEpIC0gc3gpIC0gd2lkdGgpICsgMSkgJiAweGZmKSk7Ci0KLQlhZGRyICs9IHN4ICsgc3kgKiBTRExfVmlkZW9TdXJmYWNlLT5waXRjaDsKLQotCXdoaWxlIChoZWlnaHQgPiAwKSB7Ci0JCWludCBoLCB4LCB5LCBwaXhlbHNfdG9fd3JpdGU7Ci0KLQkJcGl4ZWxzX3RvX3dyaXRlID0gKHdpZHRoICogaGVpZ2h0KSAqIDI7Ci0KLQkJLyogY2FsY3VsYXRlIGhvdyBtdWNoIHdlIGNhbiBkbyBpbiBvbmUgZ28gKi8KLQkJaCA9IGhlaWdodDsKLQkJaWYgKHBpeGVsc190b193cml0ZSA+IDY0MDAwKSB7Ci0JCQloID0gKDY0MDAwLzIpIC8gd2lkdGg7Ci0JCQlwaXhlbHNfdG9fd3JpdGUgPSAod2lkdGggKiBoKSAqIDI7Ci0JCX0KLQotCQlvdXRsKDB4MTAwMDAwODAsIDB4NzAwMDhBMjApOwotCQlvdXRsKChwaXhlbHNfdG9fd3JpdGUgLSAxKSB8IDB4QzAwMTAwMDAsIDB4NzAwMDhBMjQpOwotCQlvdXRsKDB4MzQwMDAwMDAsIDB4NzAwMDhBMjApOwotCi0JCS8qIGZvciBlYWNoIHJvdyAqLwotCQlmb3IgKHggPSAwOyB4IDwgaDsgeCsrKQotCQl7Ci0JCQkvKiBmb3IgZWFjaCBjb2x1bW4gKi8KLQkJCWZvciAoeSA9IDA7IHkgPCB3aWR0aDsgeSArPSAyKSB7Ci0JCQkJdW5zaWduZWQgdHdvX3BpeGVsczsKLQotCQkJCXR3b19waXhlbHMgPSBhZGRyWzBdIHwgKGFkZHJbMV0gPDwgMTYpOwotCQkJCWFkZHIgKz0gMjsKLQotCQkJCXdoaWxlICgoaW5sKDB4NzAwMDhBMjApICYgMHgxMDAwMDAwKSA9PSAwKTsKLQotCQkJCS8qIG91dHB1dCAyIHBpeGVscyAqLwotCQkJCW91dGwodHdvX3BpeGVscywgMHg3MDAwOEIwMCk7Ci0JCQl9Ci0KLQkJCWFkZHIgKz0gU0RMX1ZpZGVvU3VyZmFjZS0+dyAtIHdpZHRoOwotCQl9Ci0KLQkJd2hpbGUgKChpbmwoMHg3MDAwOEEyMCkgJiAweDQwMDAwMDApID09IDApOwotCi0JCW91dGwoMHgwLCAweDcwMDA4QTI0KTsKLQotCQloZWlnaHQgPSBoZWlnaHQgLSBoOwotCX0KLX0KLQotLy8gU2hvdWxkIHdvcmsgd2l0aCBwaG90by4gSG93ZXZlciwgSSBkb24ndCBoYXZlIG9uZSwgc28gSSdtIG5vdCBzdXJlLgotc3RhdGljIHZvaWQgaVBvZF9VcGRhdGVSZWN0cyAoX1RISVMsIGludCBucmVjdHMsIFNETF9SZWN0ICpyZWN0cykgCi17Ci0gICAgaWYgKFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsID09IDE2KSB7Ci0JQ191cGRhdGVfZGlzcGxheSAoMCwgMCwgbGNkX3dpZHRoLCBsY2RfaGVpZ2h0KTsKLSAgICB9IGVsc2UgewotCWludCBpLCB5LCB4OwotCWZvciAoaSA9IDA7IGkgPCBucmVjdHM7IGkrKykgewotCSAgICBTRExfUmVjdCAqciA9IHJlY3RzICsgaTsKLQkgICAgaWYgKCFyKSB7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIAotCSAgICBmb3IgKHkgPSByLT55OyAoeSA8IHItPnkgKyByLT5oKSAmJiB5IDwgbGNkX2hlaWdodDsgeSsrKSB7Ci0JCWZvciAoeCA9IHItPng7ICh4IDwgci0+eCArIHItPncpICYmIHggPCBsY2Rfd2lkdGg7IHgrKykgewotCQkgICAgaXBvZF9zY3JbeSoobGNkX3dpZHRoLzQpICsgeC80XSAmPSB+KDMgPDwgKDIgKiAoeCU0KSkpOwotCQkgICAgaXBvZF9zY3JbeSoobGNkX3dpZHRoLzQpICsgeC80XSB8PQotCQkJKCgoVWludDgqKShTRExfVmlkZW9TdXJmYWNlLT5waXhlbHMpKVsgeSpTRExfVmlkZW9TdXJmYWNlLT5waXRjaCArIHggXSAmIDMpIDw8ICgyICogKHglNCkpOwotCQl9Ci0JICAgIH0KLQl9Ci0JCi0JTV91cGRhdGVfZGlzcGxheSAoMCwgMCwgbGNkX3dpZHRoLCBsY2RfaGVpZ2h0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2lwb2QvU0RMX2lwb2R2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9pcG9kL1NETF9pcG9kdmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwNGY0MS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2lwb2QvU0RMX2lwb2R2aWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIGlQb2QgU0RMIGZyYW1lYnVmZmVyIGRyaXZlcgotICogSm9zaHVhIE9yZW1hbgotICogTWFpbiBoZWFkZXIgZmlsZQotICovCi0KLSNpZm5kZWYgX1NETF9pcG9kdmlkZW9faAotI2RlZmluZSBfU0RMX2lwb2R2aWRlb19oCi0KLXN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7Ci0gICAgY2hhciAqYnVmZmVyOwotICAgIGludCB3LCBoOwotfTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9sb3d2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX2xvd3ZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzMxNmMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX2xvd3ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9sb3d2aWRlb19oCi0jZGVmaW5lIF9TRExfbG93dmlkZW9faAotCi0jaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCi0jaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgotI2VsaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICYmIChVTklWRVJTQUxfSU5URVJGQUNFU19WRVJTSU9OID4gMHgwMzM1KQotI2luY2x1ZGUgPENhcmJvbi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxRdWlja2RyYXcuaD4KLSNpbmNsdWRlIDxQYWxldHRlcy5oPgotI2luY2x1ZGUgPE1lbnVzLmg+Ci0jaW5jbHVkZSA8RHJhd1Nwcm9ja2V0Lmg+Ci0jZW5kaWYKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLXR5cGVkZWYgc3RydWN0IF9fQUdMQ29udGV4dFJlYyAqQUdMQ29udGV4dDsKLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKLQotI2lmICFUQVJHRVRfQVBJX01BQ19DQVJCT04gIC8qIG5vdCBhdmFpbGFibGUgaW4gT1MgWCAob3IgbW9yZSBhY2N1cmF0ZWx5LCBDYXJib24pICovCi0vKiBHbG9iYWwgUXVpY2tEcmF3IGRhdGEgKi8KLWV4dGVybiBRREdsb2JhbHMgKnRoZVFEOwotI2VuZGlmCi0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotCUdEZXZpY2UgKipTRExfRGlzcGxheTsKLQlXaW5kb3dSZWYgU0RMX1dpbmRvdzsKLQlTRExfUmVjdCAqKlNETF9tb2RlbGlzdDsKLQlDVGFiSGFuZGxlIFNETF9DVGFiOwotCVBhbGV0dGVIYW5kbGUgU0RMX0NQYWw7Ci0KLSNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLQkvKiBGb3IgZW50ZXJpbmcgYW5kIGxlYXZpbmcgZnVsbHNjcmVlbiBtb2RlICovCi0JUHRyIGZ1bGxzY3JlZW5fY3R4OwotI2VuZGlmCi0KLQkvKiBUaGUgY3VycmVudCB3aW5kb3cgZG9jdW1lbnQgc3R5bGUgKi8KLQlpbnQgY3VycmVudF9zdHlsZTsKLQotCS8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IGN1cnNvciBwb3NpdGlvbiAqLwotCVBvaW50IGxhc3Rfd2hlcmU7Ci0KLQkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBrZXlzIGRvd24gKi8KLQlFdmVudE1vZGlmaWVycyBsYXN0X21vZHM7Ci0JS2V5TWFwIGxhc3Rfa2V5czsKLQotCS8qIEEgaGFuZGxlIHRvIHRoZSBBcHBsZSBNZW51ICovCi0JTWVudVJlZiBhcHBsZV9tZW51OwotCi0JLyogSW5mb3JtYXRpb24gdXNlZCBieSBEcmF3U3Byb2NrZXQgZHJpdmVyICovCi0Jc3RydWN0IERTcEluZm8gKmRzcGluZm87Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0JQUdMQ29udGV4dCBhcHBsZUdMQ29udGV4dDsKLQotCXZvaWQgKmxpYnJhcnlIYW5kbGU7Ci0jZW5kaWYKLX07Ci0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgU0RMX0Rpc3BsYXkJCSh0aGlzLT5oaWRkZW4tPlNETF9EaXNwbGF5KQotI2RlZmluZSBTRExfV2luZG93CQkodGhpcy0+aGlkZGVuLT5TRExfV2luZG93KQotI2RlZmluZSBTRExfbW9kZWxpc3QJCSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKLSNkZWZpbmUgU0RMX0NUYWIJCSh0aGlzLT5oaWRkZW4tPlNETF9DVGFiKQotI2RlZmluZSBTRExfQ1BhbAkJKHRoaXMtPmhpZGRlbi0+U0RMX0NQYWwpCi0jZGVmaW5lIGZ1bGxzY3JlZW5fY3R4CQkodGhpcy0+aGlkZGVuLT5mdWxsc2NyZWVuX2N0eCkKLSNkZWZpbmUgY3VycmVudF9zdHlsZQkJKHRoaXMtPmhpZGRlbi0+Y3VycmVudF9zdHlsZSkKLSNkZWZpbmUgbGFzdF93aGVyZQkJKHRoaXMtPmhpZGRlbi0+bGFzdF93aGVyZSkKLSNkZWZpbmUgbGFzdF9tb2RzCQkodGhpcy0+aGlkZGVuLT5sYXN0X21vZHMpCi0jZGVmaW5lIGxhc3Rfa2V5cwkJKHRoaXMtPmhpZGRlbi0+bGFzdF9rZXlzKQotI2RlZmluZSBhcHBsZV9tZW51CQkodGhpcy0+aGlkZGVuLT5hcHBsZV9tZW51KQotI2RlZmluZSBnbENvbnRleHQJCSh0aGlzLT5oaWRkZW4tPmFwcGxlR0xDb250ZXh0KQotCi0jZW5kaWYgLyogX1NETF9sb3d2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MzFjNmMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2V2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQ2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQotI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KLSNlbGlmIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAmJiAoVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+IDB4MDMzNSkKLSNpbmNsdWRlIDxDYXJib24uaD4KLSNlbHNlCi0jaW5jbHVkZSA8U2NyaXB0Lmg+Ci0jaW5jbHVkZSA8TG93TWVtLmg+Ci0jaW5jbHVkZSA8RGV2aWNlcy5oPgotI2luY2x1ZGUgPERpc2tJbml0Lmg+Ci0jaW5jbHVkZSA8VG9vbFV0aWxzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfc3lzd20uaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKLSNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKLSNpbmNsdWRlICJTRExfbWFjZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfbWFja2V5cy5oIgotI2luY2x1ZGUgIlNETF9tYWNtb3VzZV9jLmgiCi0KLS8qIERlZmluZSB0aGlzIHRvIGJlIGFibGUgdG8gY29sbGFwc2UgU0RMIHdpbmRvd3MuCi0jZGVmaW5lIFVTRV9BUFBFQVJBTkNFX01BTkFHRVIKLSAqLwotCi0vKiBNYWNpbnRvc2ggcmVzb3VyY2UgY29uc3RhbnRzICovCi0jZGVmaW5lIG1BcHBsZQkxMjgJCQkvKiBBcHBsZSBtZW51IHJlc291cmNlICovCi0jZGVmaW5lIGlBYm91dAkxCQkJLyogQWJvdXQgbWVudSBpdGVtICovCi0KLS8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIEFib3V0IG1lbnUgKi8KLXN0YXRpYyB2b2lkIE1hY19Eb0FwcGxlTWVudShfVEhJUywgbG9uZyBpdGVtKTsKLQotLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gYSBtYWNpbnRvc2gga2V5IHNjYW5jb2RlIHRvIGEgU0RMIGtleXN5bSAqLwotc3RhdGljIFNETEtleSBNQUNfa2V5bWFwWzI1Nl07Ci1zdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgaW50IG1vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgcHJlc3NlZCk7Ci0KLS8qIEhhbmRsZSBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24gIC0tIHJldHVybnMgd2hldGhlciBhbiBldmVudCB3YXMgcG9zdGVkICovCi1zdGF0aWMgaW50IE1hY19IYW5kbGVBY3RpdmF0ZShpbnQgYWN0aXZhdGUpCi17Ci0JaWYgKCBhY3RpdmF0ZSApIHsKLQkJLyogU2hvdyB0aGUgY3VycmVudCBTREwgYXBwbGljYXRpb24gY3Vyc29yICovCi0JCVNETF9TZXRDdXJzb3IoTlVMTCk7Ci0KLQkJLyogcHV0IG91ciBtYXNrIGJhY2sgY2FzZSBpdCBjaGFuZ2VkIGR1cmluZyBjb250ZXh0IHN3aXRjaCAqLwotCQlTZXRFdmVudE1hc2soZXZlcnlFdmVudCAmIH5hdXRvS2V5TWFzayk7Ci0JfSBlbHNlIHsKLSNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLQkJeyBDdXJzb3IgY3Vyc29yOwotCQkJU2V0Q3Vyc29yKEdldFFER2xvYmFsc0Fycm93KCZjdXJzb3IpKTsKLQkJfQotI2Vsc2UKLQkJU2V0Q3Vyc29yKCZ0aGVRRC0+YXJyb3cpOwotI2VuZGlmCi0JCWlmICggISBNYWNfY3Vyc29yX3Nob3dpbmcgKSB7Ci0JCQlTaG93Q3Vyc29yKCk7Ci0JCQlNYWNfY3Vyc29yX3Nob3dpbmcgPSAxOwotCQl9Ci0JfQotCXJldHVybihTRExfUHJpdmF0ZUFwcEFjdGl2ZShhY3RpdmF0ZSwgU0RMX0FQUElOUFVURk9DVVMpKTsKLX0KLQotc3RhdGljIHZvaWQgbXlHbG9iYWxUb0xvY2FsKF9USElTLCBQb2ludCAqcHQpCi17Ci0JaWYgKCBTRExfVmlkZW9TdXJmYWNlICYmICEoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MmU0RMX0ZVTExTQ1JFRU4pICkgewotCQlHcmFmUHRyIHNhdmVwb3J0OwotCQlHZXRQb3J0KCZzYXZlcG9ydCk7Ci0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JCVNldFBvcnQoR2V0V2luZG93UG9ydChTRExfV2luZG93KSk7Ci0jZWxzZQotCQlTZXRQb3J0KFNETF9XaW5kb3cpOwotI2VuZGlmCi0JCUdsb2JhbFRvTG9jYWwocHQpOwotCQlTZXRQb3J0KHNhdmVwb3J0KTsKLQl9Ci19Ci0KLS8qIFRoZSBtYWluIE1hY09TIGV2ZW50IGhhbmRsZXIgKi8KLXN0YXRpYyBpbnQgTWFjX0hhbmRsZUV2ZW50cyhfVEhJUywgaW50IHdhaXQ0aXQpCi17Ci0Jc3RhdGljIGludCBtb3VzZV9idXR0b24gPSAxOwotCWludCBpOwotCUV2ZW50UmVjb3JkIGV2ZW50OwotCi0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JLyogVGhlcmUncyBubyBHZXRPU0V2ZW50KCkgaW4gdGhlIENhcmJvbiBBUEkuICpzaWdoKiAqLwotI2RlZmluZSBjb29wZXJhdGl2ZV9tdWx0aXRhc2tpbmcgMQotI2Vsc2UKLQlpbnQgY29vcGVyYXRpdmVfbXVsdGl0YXNraW5nOwotCS8qIElmIHdlJ3JlIHJ1bm5pbmcgZnVsbHNjcmVlbiwgd2UgY2FuIGhvZyB0aGUgTWFjT1MgZXZlbnRzLAotCSAgIG90aGVyd2lzZSB3ZSBoYWQgYmV0dGVyIHBsYXkgbmljZWx5IHdpdGggdGhlIG90aGVyIGFwcHMuCi0JKi8KLQlpZiAoIHRoaXMtPnNjcmVlbiAmJiAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKLQkJY29vcGVyYXRpdmVfbXVsdGl0YXNraW5nID0gMDsKLQl9IGVsc2UgewotCQljb29wZXJhdGl2ZV9tdWx0aXRhc2tpbmcgPSAxOwotCX0KLSNlbmRpZgotCi0JLyogSWYgd2UgY2FsbCBXYWl0TmV4dEV2ZW50KCksIE1hY09TIHdpbGwgY2hlY2sgb3RoZXIgcHJvY2Vzc2VzCi0JICogYW5kIGFsbG93IHRoZW0gdG8gcnVuLCBhbmQgcGVyZm9ybSBvdGhlciBoaWdoLWxldmVsIHByb2Nlc3NpbmcuCi0JICovCi0JaWYgKCBjb29wZXJhdGl2ZV9tdWx0aXRhc2tpbmcgfHwgd2FpdDRpdCApIHsKLQkJVUludDMyIHdhaXRfdGltZTsKLQotCQkvKiBBcmUgd2UgcG9sbGluZyBvciBub3Q/ICovCi0JCWlmICggd2FpdDRpdCApIHsKLQkJCXdhaXRfdGltZSA9IDIxNDc0ODM2NDc7Ci0JCX0gZWxzZSB7Ci0JCQl3YWl0X3RpbWUgPSAwOwotCQl9Ci0JCVdhaXROZXh0RXZlbnQoZXZlcnlFdmVudCwgJmV2ZW50LCB3YWl0X3RpbWUsIG5pbCk7Ci0JfSBlbHNlIHsKLSNpZiAhIFRBUkdFVF9BUElfTUFDX0NBUkJPTgotCQlHZXRPU0V2ZW50KGV2ZXJ5RXZlbnQsICZldmVudCk7Ci0jZW5kaWYKLQl9Ci0KLSNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLQkvKiBmb3Igc29tZSByZWFzb24sIGV2ZW50LndoZXJlIGlzbid0IHNldCA/ICovCi0JR2V0R2xvYmFsTW91c2UgKCAmZXZlbnQud2hlcmUgKTsKLSNlbmRpZgotCi0JLyogQ2hlY2sgZm9yIG1vdXNlIG1vdGlvbiAqLwotCWlmICggKGV2ZW50LndoZXJlLmggIT0gbGFzdF93aGVyZS5oKSB8fAotCSAgICAgKGV2ZW50LndoZXJlLnYgIT0gbGFzdF93aGVyZS52KSApIHsKLQkJUG9pbnQgcHQ7Ci0JCXB0ID0gbGFzdF93aGVyZSA9IGV2ZW50LndoZXJlOwotCQlteUdsb2JhbFRvTG9jYWwodGhpcywgJnB0KTsKLQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCBwdC5oLCBwdC52KTsKLQl9Ci0KLQkvKiBDaGVjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQgKi8KLQlpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUElOUFVURk9DVVMgKSB7Ci0JCUtleU1hcCBrZXlzOwotCQljb25zdCBVaW50MzIgKmtleXNwdHIgPSAoVWludDMyICopICZrZXlzOwotCQljb25zdCBVaW50MzIgKmxhc3Rfa2V5c3B0ciA9IChVaW50MzIgKikgJmxhc3Rfa2V5czsKLQotCQkvKiBDaGVjayBmb3Igc3BlY2lhbCBub24tZXZlbnQga2V5cyAqLwotCQlpZiAoIGV2ZW50Lm1vZGlmaWVycyAhPSBsYXN0X21vZHMgKSB7Ci0JCQlzdGF0aWMgc3RydWN0IHsKLQkJCQlFdmVudE1vZGlmaWVycyBtYXNrOwotCQkJCVNETEtleSBrZXk7Ci0JCQl9IG1vZHNbXSA9IHsKLQkJCQl7IGFscGhhTG9jaywJCVNETEtfQ0FQU0xPQ0sgfSwKLSNpZiAwIC8qIFRoZXNlIGFyZSBoYW5kbGVkIGJlbG93IGluIHRoZSBHZXRLZXlzKCkgY29kZSAqLwotCQkJCXsgY21kS2V5LAkJU0RMS19MTUVUQSB9LAotCQkJCXsgc2hpZnRLZXksCQlTRExLX0xTSElGVCB9LAotCQkJCXsgcmlnaHRTaGlmdEtleSwJU0RMS19SU0hJRlQgfSwKLQkJCQl7IG9wdGlvbktleSwJCVNETEtfTEFMVCB9LAotCQkJCXsgcmlnaHRPcHRpb25LZXksCVNETEtfUkFMVCB9LAotCQkJCXsgY29udHJvbEtleSwJCVNETEtfTENUUkwgfSwKLQkJCQl7IHJpZ2h0Q29udHJvbEtleSwJU0RMS19SQ1RSTCB9LAotI2VuZGlmIC8qIDAgKi8KLQkJCQl7IDAsCQkJMCB9Ci0JCQl9OwotCQkJU0RMX2tleXN5bSBrZXlzeW07Ci0JCQlVaW50OCBtb2RlOwotCQkJRXZlbnRNb2RpZmllcnMgbW9kLCBtYXNrOwotCQkKLQotCQkJLyogU2V0IHVwIHRoZSBrZXlib2FyZCBldmVudCAqLwotCQkJa2V5c3ltLnNjYW5jb2RlID0gMDsKLQkJCWtleXN5bS5zeW0gPSBTRExLX1VOS05PV047Ci0JCQlrZXlzeW0ubW9kID0gS01PRF9OT05FOwotCQkJa2V5c3ltLnVuaWNvZGUgPSAwOwotCi0JCQkvKiBTZWUgd2hhdCBoYXMgY2hhbmdlZCwgYW5kIGdlbmVyYXRlIGV2ZW50cyAqLwotCQkJbW9kID0gZXZlbnQubW9kaWZpZXJzOwotCQkJZm9yICggaT0wOyBtb2RzW2ldLm1hc2s7ICsraSApIHsKLQkJCQltYXNrID0gbW9kc1tpXS5tYXNrOwotCQkJCWlmICggKG1vZCZtYXNrKSAhPSAobGFzdF9tb2RzJm1hc2spICkgewotCQkJCQlrZXlzeW0uc3ltID0gbW9kc1tpXS5rZXk7Ci0JCQkJCWlmICggKG1vZCZtYXNrKSB8fAotCQkJCQkgICAgIChtb2RzW2ldLmtleSA9PSBTRExLX0NBUFNMT0NLKSApIHsKLQkJCQkJCW1vZGUgPSBTRExfUFJFU1NFRDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW1vZGUgPSBTRExfUkVMRUFTRUQ7Ci0JCQkJCX0KLQkJCQkJU0RMX1ByaXZhdGVLZXlib2FyZChtb2RlLCAma2V5c3ltKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIFNhdmUgc3RhdGUgZm9yIG5leHQgdGltZSAqLwotCQkJbGFzdF9tb2RzID0gbW9kOwotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIG5vcm1hbCBldmVudCBrZXlzLCBidXQgd2UgaGF2ZSB0byBzY2FuIHRoZQotCQkgICBhY3R1YWwga2V5Ym9hcmQgc3RhdGUgYmVjYXVzZSBvbiBNYWMgT1MgWCBhIGtleWRvd24gZXZlbnQKLQkJICAgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBrZXl1cCBldmVudC4KLQkJKi8KLQkJR2V0S2V5cyhrZXlzKTsKLQkJaWYgKCAoa2V5c3B0clswXSAhPSBsYXN0X2tleXNwdHJbMF0pIHx8Ci0JCSAgICAgKGtleXNwdHJbMV0gIT0gbGFzdF9rZXlzcHRyWzFdKSB8fAotCQkgICAgIChrZXlzcHRyWzJdICE9IGxhc3Rfa2V5c3B0clsyXSkgfHwKLQkJICAgICAoa2V5c3B0clszXSAhPSBsYXN0X2tleXNwdHJbM10pICkgewotCQkJU0RMX2tleXN5bSBrZXlzeW07Ci0JCQlpbnQgb2xkX2JpdCwgbmV3X2JpdDsKLQotI2lmZGVmIERFQlVHX0tFWUJPQVJECi0JCQlmcHJpbnRmKHN0ZXJyLCAiTmV3IGtleXM6IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCi0JCQkJbmV3X2tleXNbMF0sIG5ld19rZXlzWzFdLAotCQkJCW5ld19rZXlzWzJdLCBuZXdfa2V5c1szXSk7Ci0jZW5kaWYKLQkJCWZvciAoIGk9MDsgaTwxMjg7ICsraSApIHsKLQkJCQlvbGRfYml0ID0gKCgoVWludDggKilsYXN0X2tleXMpW2kvOF0+PihpJTgpKSAmIDB4MDE7Ci0JCQkJbmV3X2JpdCA9ICgoKFVpbnQ4ICopa2V5cylbaS84XT4+KGklOCkpICYgMHgwMTsKLQkJCQlpZiAoIG9sZF9iaXQgIT0gbmV3X2JpdCApIHsKLQkJCQkJLyogUG9zdCB0aGUga2V5Ym9hcmQgZXZlbnQgKi8KLSNpZmRlZiBERUJVR19LRVlCT0FSRAotCQkJCQlmcHJpbnRmKHN0ZGVyciwiU2NhbmNvZGU6IDB4JTIuMlhcbiIsaSk7Ci0jZW5kaWYKLQkJCQkJU0RMX1ByaXZhdGVLZXlib2FyZChuZXdfYml0LAotCQkJCSAgICAgICAgICAgIFRyYW5zbGF0ZUtleShpLCBldmVudC5tb2RpZmllcnMsCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlzeW0sIG5ld19iaXQpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIFNhdmUgc3RhdGUgZm9yIG5leHQgdGltZSAqLwotCQkJbGFzdF9rZXlzWzBdID0ga2V5c1swXTsKLQkJCWxhc3Rfa2V5c1sxXSA9IGtleXNbMV07Ci0JCQlsYXN0X2tleXNbMl0gPSBrZXlzWzJdOwotCQkJbGFzdF9rZXlzWzNdID0ga2V5c1szXTsKLQkJfQotCX0KLQotCS8qIEhhbmRsZSBub3JtYWwgZXZlbnRzICovCi0Jc3dpdGNoIChldmVudC53aGF0KSB7Ci0JICBjYXNlIG1vdXNlRG93bjogewotCQlXaW5kb3dSZWYgd2luOwotCQlzaG9ydCBhcmVhOwotCQkJCQotCQlhcmVhID0gRmluZFdpbmRvdyhldmVudC53aGVyZSwgJndpbik7Ci0JCS8qIFN1cHBvcnQgc3dpdGNoaW5nIGJldHdlZW4gdGhlIFNJT1VYIGNvbnNvbGUKLQkJICAgYW5kIFNETF9XaW5kb3cgYnkgY2xpY2tpbmcgaW4gdGhlIHdpbmRvdy4KLQkJICovCi0JCWlmICggd2luICYmICh3aW4gIT0gRnJvbnRXaW5kb3coKSkgKSB7Ci0JCQlTZWxlY3RXaW5kb3cod2luKTsKLQkJfSAKLQkJc3dpdGNoIChhcmVhKSB7Ci0JCSAgY2FzZSBpbk1lbnVCYXI6IC8qIE9ubHkgdGhlIGFwcGxlIG1lbnUgZXhpc3RzICovCi0JCQlNYWNfRG9BcHBsZU1lbnUodGhpcywgTWVudVNlbGVjdChldmVudC53aGVyZSkpOwotCQkJSGlsaXRlTWVudSgwKTsKLQkJCWJyZWFrOwotCQkgIGNhc2UgaW5EcmFnOgotI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgotCQkJRHJhZ1dpbmRvdyh3aW4sIGV2ZW50LndoZXJlLCBOVUxMKTsKLSNlbHNlCi0JCQlEcmFnV2luZG93KHdpbiwgZXZlbnQud2hlcmUsICZ0aGVRRC0+c2NyZWVuQml0cy5ib3VuZHMpOwotI2VuZGlmCi0JCQlicmVhazsKLQkJICBjYXNlIGluR29Bd2F5OgotCQkJaWYgKCBUcmFja0dvQXdheSh3aW4sIGV2ZW50LndoZXJlKSApIHsKLQkJCQlTRExfUHJpdmF0ZVF1aXQoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkgIGNhc2UgaW5Db250ZW50OgotCQkJbXlHbG9iYWxUb0xvY2FsKHRoaXMsICZldmVudC53aGVyZSk7Ci0JCQkvKiBUcmVhdCBjb21tYW5kLWNsaWNrIGFzIHJpZ2h0IG1vdXNlIGJ1dHRvbiAqLwotCQkJaWYgKCBldmVudC5tb2RpZmllcnMgJiBvcHRpb25LZXkgKSB7Ci0JCQkJbW91c2VfYnV0dG9uID0gMjsKLQkJCX0gZWxzZSBpZiAoIGV2ZW50Lm1vZGlmaWVycyAmIGNtZEtleSApIHsKLQkJCQltb3VzZV9idXR0b24gPSAzOwotCQkJfSBlbHNlIHsKLQkJCQltb3VzZV9idXR0b24gPSAxOwotCQkJfQotCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwKLQkJCQltb3VzZV9idXR0b24sIGV2ZW50LndoZXJlLmgsIGV2ZW50LndoZXJlLnYpOwotCQkJYnJlYWs7Ci0JCSAgY2FzZSBpbkdyb3c6IHsKLQkJCWludCBuZXdTaXplOwotCi0JCQkvKiBEb24ndCBhbGxvdyByZXNpemUgaWYgdmlkZW8gbW9kZSBpc24ndCByZXNpemFibGUgKi8KLQkJCWlmICggISBTRExfUHVibGljU3VyZmFjZSB8fAotCQkJICAgICAhIChTRExfUHVibGljU3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkVTSVpBQkxFKSApIHsKLQkJCQlicmVhazsKLQkJCX0KLSNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLQkJCW5ld1NpemUgPSBHcm93V2luZG93KHdpbiwgZXZlbnQud2hlcmUsIE5VTEwpOwotI2Vsc2UKLQkJCW5ld1NpemUgPSBHcm93V2luZG93KHdpbiwgZXZlbnQud2hlcmUsICZ0aGVRRC0+c2NyZWVuQml0cy5ib3VuZHMpOwotI2VuZGlmCi0JCQlpZiAoIG5ld1NpemUgKSB7Ci0jaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgotCQkJCUVyYXNlUmVjdCAoICZ0aGVRRC0+c2NyZWVuQml0cy5ib3VuZHMgKTsKLSNlbmRpZgotCQkJCVNpemVXaW5kb3cgKCB3aW4sIExvV29yZCAobmV3U2l6ZSksIEhpV29yZCAobmV3U2l6ZSksIDEgKTsKLQkJCQlTRExfUHJpdmF0ZVJlc2l6ZSAoIExvV29yZCAobmV3U2l6ZSksIEhpV29yZCAobmV3U2l6ZSkgKTsKLQkJCX0KLQkJICAJfSBicmVhazsKLQkJICBjYXNlIGluWm9vbUluOgotCQkgIGNhc2UgaW5ab29tT3V0OgotCQkJaWYgKCBUcmFja0JveCAod2luLCBldmVudC53aGVyZSwgYXJlYSApKSB7Ci0JCQkJUmVjdCByZWN0OwotI2lmICFUQVJHRVRfQVBJX01BQ19DQVJCT04KLQkJCQlFcmFzZVJlY3QgKCAmdGhlUUQtPnNjcmVlbkJpdHMuYm91bmRzICk7Ci0jZW5kaWYKLQkJCQlab29tV2luZG93ICggd2luLCBhcmVhLCAwKTsKLQkJCQlpZiAoIGFyZWEgPT0gaW5ab29tSW4gKSB7Ci0JCQkJCUdldFdpbmRvd1VzZXJTdGF0ZShTRExfV2luZG93LCAmcmVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJR2V0V2luZG93U3RhbmRhcmRTdGF0ZShTRExfV2luZG93LCAmcmVjdCk7Ci0JCQkJfQotCQkJCVNETF9Qcml2YXRlUmVzaXplIChyZWN0LnJpZ2h0LXJlY3QubGVmdCwKLQkJCQkgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20tcmVjdC50b3ApOwotCQkJfQotCQkJYnJlYWs7Ci0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JCSAgY2FzZSBpbkNvbGxhcHNlQm94OgotCQkJaWYgKCBUcmFja0JveCAod2luLCBldmVudC53aGVyZSwgYXJlYSApKSB7Ci0JCQkJaWYgKCBJc1dpbmRvd0NvbGxhcHNhYmxlKHdpbikgKSB7Ci0JCQkJCUNvbGxhcHNlV2luZG93ICh3aW4sICFJc1dpbmRvd0NvbGxhcHNlZCh3aW4pKTsKLQkJCQkJLyogVGhlcmUgc2hvdWxkIGJlIHNvbWV0aGluZyBkb25lIGxpa2UgaW4gaW5Hcm93IGNhc2UsIGJ1dC4uLiAqLwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmIC8qIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAqLwotCQkgIGNhc2UgaW5TeXNXaW5kb3c6Ci0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JCQkvKiBOZXZlciBoYXBwZW5zIGluIENhcmJvbj8gKi8KLSNlbHNlCi0JCQlTeXN0ZW1DbGljaygmZXZlbnQsIHdpbik7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCSAgfQotCSAgYnJlYWs7Ci0JICBjYXNlIG1vdXNlVXA6IHsKLQkJbXlHbG9iYWxUb0xvY2FsKHRoaXMsICZldmVudC53aGVyZSk7Ci0JCS8qIFJlbGVhc2UgdGhlIG1vdXNlIGJ1dHRvbiB3ZSBzaW11bGF0ZWQgaW4gdGhlIGxhc3QgcHJlc3MuCi0JCSAgIFRoZSBkcmF3YmFjayBvZiB0aGlzIG1ldGhvcyBpcyB3ZSBjYW5ub3QgcHJlc3MgbW9yZSB0aGFuCi0JCSAgIG9uZSBidXR0b24uIEhvd2V2ZXIsIHRoaXMgZG9lc24ndCBtYXR0ZXIsIHNpbmNlIHRoZXJlIGlzCi0JCSAgIG9ubHkgYSBzaW5nbGUgbG9naWNhbCBtb3VzZSBidXR0b24sIGV2ZW4gaWYgeW91IGhhdmUgYQotCQkgICBtdWx0aS1idXR0b24gbW91c2UsIHRoaXMgZG9lc24ndCBtYXR0ZXIgYXQgYWxsLgotCQkgKi8KLQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsCi0JCQltb3VzZV9idXR0b24sIGV2ZW50LndoZXJlLmgsIGV2ZW50LndoZXJlLnYpOwotCSAgfQotCSAgYnJlYWs7Ci0jaWYgMCAvKiBIYW5kbGVkIGFib3ZlIHRoZSBzd2l0Y2ggc3RhdGVtZW50ICovCi0JICBjYXNlIGtleURvd246IHsKLQkJU0RMX2tleXN5bSBrZXlzeW07Ci0KLQkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwKLQkJCVRyYW5zbGF0ZUtleSgoZXZlbnQubWVzc2FnZSZrZXlDb2RlTWFzayk+PjgKLQkJICAgICAgICAgICAgICAgICAgICAgZXZlbnQubW9kaWZpZXJzLCAma2V5c3ltLCAxKSk7Ci0JICB9Ci0JICBicmVhazsKLQkgIGNhc2Uga2V5VXA6IHsKLQkJU0RMX2tleXN5bSBrZXlzeW07Ci0KLQkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsCi0JCQlUcmFuc2xhdGVLZXkoKGV2ZW50Lm1lc3NhZ2Uma2V5Q29kZU1hc2spPj44Ci0JCSAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm1vZGlmaWVycywgJmtleXN5bSwgMCkpOwotCSAgfQotCSAgYnJlYWs7Ci0jZW5kaWYKLQkgIGNhc2UgdXBkYXRlRXZ0OiB7Ci0JCUJlZ2luVXBkYXRlKFNETF9XaW5kb3cpOwotCSNpZiBTRExfVklERU9fT1BFTkdMCi0JCWlmIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9PUEVOR0wpCi0JCQlTRExfR0xfU3dhcEJ1ZmZlcnMoKTsKLQkJZWxzZQotCSNlbmRpZgotCQlpZiAoIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09Ci0JCQkJCQlTRExfU1dTVVJGQUNFICkgewotCQkJU0RMX1VwZGF0ZVJlY3QoU0RMX1ZpZGVvU3VyZmFjZSwgMCwgMCwgMCwgMCk7Ci0JCX0KLQkJRW5kVXBkYXRlKFNETF9XaW5kb3cpOwotCSAgfQotCSAgLyogSWYgdGhpcyB3YXMgYW4gdXBkYXRlIGV2ZW50IGZvciB0aGUgU0lPVVggY29uc29sZSwgd2UgcmV0dXJuIDAKLSAgICAgICAgICAgICBpbiBvcmRlciB0byBzdG9wIGFuIGVuZGxlc3Mgc2VyaWVzIG9mIHVwZGF0ZXMgYmVpbmcgdHJpZ2dlcmVkLgotCSAgKi8KLQkgIGlmICggKFdpbmRvd1JlZikgZXZlbnQubWVzc2FnZSAhPSBTRExfV2luZG93ICkgewotCQlyZXR1cm4gMDsKLQkgIH0KLQkgIGJyZWFrOwotCSAgY2FzZSBhY3RpdmF0ZUV2dDogewotCQlNYWNfSGFuZGxlQWN0aXZhdGUoISEoZXZlbnQubW9kaWZpZXJzICYgYWN0aXZlRmxhZykpOwotCSAgfQotCSAgYnJlYWs7Ci0JICBjYXNlIGRpc2tFdnQ6IHsKLSNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLQkJLyogV2hhdCBhcmUgd2Ugc3VwcG9zZWQgdG8gZG8/ICovOwotI2Vsc2UKLQkJaWYgKCAoKGV2ZW50Lm1lc3NhZ2U+PjE2KSYweEZGRkYpICE9IG5vRXJyICkgewotCQkJUG9pbnQgc3BvdDsKLQkJCVNldFB0KCZzcG90LCAweDAwNzAsIDB4MDA1MCk7Ci0JCQlESUJhZE1vdW50KHNwb3QsIGV2ZW50Lm1lc3NhZ2UpOwotCQl9Ci0jZW5kaWYKLQkgIH0KLQkgIGJyZWFrOwotCSAgY2FzZSBvc0V2dDogewotCQlzd2l0Y2ggKChldmVudC5tZXNzYWdlPj4yNCkgJiAweEZGKSB7Ci0jaWYgMCAvKiBIYW5kbGVkIGFib3ZlIHRoZSBzd2l0Y2ggc3RhdGVtZW50ICovCi0JCSAgY2FzZSBtb3VzZU1vdmVkTWVzc2FnZTogewotCQkJbXlHbG9iYWxUb0xvY2FsKHRoaXMsICZldmVudC53aGVyZSk7Ci0JCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsCi0JCQkJCWV2ZW50LndoZXJlLmgsIGV2ZW50LndoZXJlLnYpOwotCQkgIH0KLQkJICBicmVhazsKLSNlbmRpZiAvKiAwICovCi0JCSAgY2FzZSBzdXNwZW5kUmVzdW1lTWVzc2FnZTogewotCQkJTWFjX0hhbmRsZUFjdGl2YXRlKCEhKGV2ZW50Lm1lc3NhZ2UgJiByZXN1bWVGbGFnKSk7Ci0JCSAgfQotCQkgIGJyZWFrOwotCQl9Ci0JICB9Ci0JICBicmVhazsKLQkgIGRlZmF1bHQ6IHsKLQkJOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotCXJldHVybiAoZXZlbnQud2hhdCAhPSBudWxsRXZlbnQpOwotfQotCi0KLXZvaWQgTWFjX1B1bXBFdmVudHMoX1RISVMpCi17Ci0JLyogUHJvY2VzcyBwZW5kaW5nIE1hY09TIGV2ZW50cyAqLwotCXdoaWxlICggTWFjX0hhbmRsZUV2ZW50cyh0aGlzLCAwKSApIHsKLQkJLyogTG9vcCBhbmQgY2hlY2sgYWdhaW4gKi87Ci0JfQotfQotCi12b2lkIE1hY19Jbml0T1NLZXltYXAoX1RISVMpCi17Ci0JY29uc3Qgdm9pZCAqS0NIUlB0cjsKLQlVSW50MzIgc3RhdGU7Ci0JVUludDMyIHZhbHVlOwotCWludCBpOwotCWludCB3b3JsZCA9IFNETEtfV09STERfMDsKLQotCS8qIE1hcCB0aGUgTUFDIGtleXN5bXMgKi8KLQlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShNQUNfa2V5bWFwKTsgKytpICkKLQkJTUFDX2tleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKLQotCS8qIERlZmluZWQgTUFDXyogY29uc3RhbnRzICovCi0JTUFDX2tleW1hcFtNS19FU0NBUEVdID0gU0RMS19FU0NBUEU7Ci0JTUFDX2tleW1hcFtNS19GMV0gPSBTRExLX0YxOwotCU1BQ19rZXltYXBbTUtfRjJdID0gU0RMS19GMjsKLQlNQUNfa2V5bWFwW01LX0YzXSA9IFNETEtfRjM7Ci0JTUFDX2tleW1hcFtNS19GNF0gPSBTRExLX0Y0OwotCU1BQ19rZXltYXBbTUtfRjVdID0gU0RMS19GNTsKLQlNQUNfa2V5bWFwW01LX0Y2XSA9IFNETEtfRjY7Ci0JTUFDX2tleW1hcFtNS19GN10gPSBTRExLX0Y3OwotCU1BQ19rZXltYXBbTUtfRjhdID0gU0RMS19GODsKLQlNQUNfa2V5bWFwW01LX0Y5XSA9IFNETEtfRjk7Ci0JTUFDX2tleW1hcFtNS19GMTBdID0gU0RMS19GMTA7Ci0JTUFDX2tleW1hcFtNS19GMTFdID0gU0RMS19GMTE7Ci0JTUFDX2tleW1hcFtNS19GMTJdID0gU0RMS19GMTI7Ci0JTUFDX2tleW1hcFtNS19QUklOVF0gPSBTRExLX1BSSU5UOwotCU1BQ19rZXltYXBbTUtfU0NST0xMT0NLXSA9IFNETEtfU0NST0xMT0NLOwotCU1BQ19rZXltYXBbTUtfUEFVU0VdID0gU0RMS19QQVVTRTsKLQlNQUNfa2V5bWFwW01LX1BPV0VSXSA9IFNETEtfUE9XRVI7Ci0JTUFDX2tleW1hcFtNS19CQUNLUVVPVEVdID0gU0RMS19CQUNLUVVPVEU7Ci0JTUFDX2tleW1hcFtNS18xXSA9IFNETEtfMTsKLQlNQUNfa2V5bWFwW01LXzJdID0gU0RMS18yOwotCU1BQ19rZXltYXBbTUtfM10gPSBTRExLXzM7Ci0JTUFDX2tleW1hcFtNS180XSA9IFNETEtfNDsKLQlNQUNfa2V5bWFwW01LXzVdID0gU0RMS181OwotCU1BQ19rZXltYXBbTUtfNl0gPSBTRExLXzY7Ci0JTUFDX2tleW1hcFtNS183XSA9IFNETEtfNzsKLQlNQUNfa2V5bWFwW01LXzhdID0gU0RMS184OwotCU1BQ19rZXltYXBbTUtfOV0gPSBTRExLXzk7Ci0JTUFDX2tleW1hcFtNS18wXSA9IFNETEtfMDsKLQlNQUNfa2V5bWFwW01LX01JTlVTXSA9IFNETEtfTUlOVVM7Ci0JTUFDX2tleW1hcFtNS19FUVVBTFNdID0gU0RMS19FUVVBTFM7Ci0JTUFDX2tleW1hcFtNS19CQUNLU1BBQ0VdID0gU0RMS19CQUNLU1BBQ0U7Ci0JTUFDX2tleW1hcFtNS19JTlNFUlRdID0gU0RMS19JTlNFUlQ7Ci0JTUFDX2tleW1hcFtNS19IT01FXSA9IFNETEtfSE9NRTsKLQlNQUNfa2V5bWFwW01LX1BBR0VVUF0gPSBTRExLX1BBR0VVUDsKLQlNQUNfa2V5bWFwW01LX05VTUxPQ0tdID0gU0RMS19OVU1MT0NLOwotCU1BQ19rZXltYXBbTUtfS1BfRVFVQUxTXSA9IFNETEtfS1BfRVFVQUxTOwotCU1BQ19rZXltYXBbTUtfS1BfRElWSURFXSA9IFNETEtfS1BfRElWSURFOwotCU1BQ19rZXltYXBbTUtfS1BfTVVMVElQTFldID0gU0RMS19LUF9NVUxUSVBMWTsKLQlNQUNfa2V5bWFwW01LX1RBQl0gPSBTRExLX1RBQjsKLQlNQUNfa2V5bWFwW01LX3FdID0gU0RMS19xOwotCU1BQ19rZXltYXBbTUtfd10gPSBTRExLX3c7Ci0JTUFDX2tleW1hcFtNS19lXSA9IFNETEtfZTsKLQlNQUNfa2V5bWFwW01LX3JdID0gU0RMS19yOwotCU1BQ19rZXltYXBbTUtfdF0gPSBTRExLX3Q7Ci0JTUFDX2tleW1hcFtNS195XSA9IFNETEtfeTsKLQlNQUNfa2V5bWFwW01LX3VdID0gU0RMS191OwotCU1BQ19rZXltYXBbTUtfaV0gPSBTRExLX2k7Ci0JTUFDX2tleW1hcFtNS19vXSA9IFNETEtfbzsKLQlNQUNfa2V5bWFwW01LX3BdID0gU0RMS19wOwotCU1BQ19rZXltYXBbTUtfTEVGVEJSQUNLRVRdID0gU0RMS19MRUZUQlJBQ0tFVDsKLQlNQUNfa2V5bWFwW01LX1JJR0hUQlJBQ0tFVF0gPSBTRExLX1JJR0hUQlJBQ0tFVDsKLQlNQUNfa2V5bWFwW01LX0JBQ0tTTEFTSF0gPSBTRExLX0JBQ0tTTEFTSDsKLQlNQUNfa2V5bWFwW01LX0RFTEVURV0gPSBTRExLX0RFTEVURTsKLQlNQUNfa2V5bWFwW01LX0VORF0gPSBTRExLX0VORDsKLQlNQUNfa2V5bWFwW01LX1BBR0VET1dOXSA9IFNETEtfUEFHRURPV047Ci0JTUFDX2tleW1hcFtNS19LUDddID0gU0RMS19LUDc7Ci0JTUFDX2tleW1hcFtNS19LUDhdID0gU0RMS19LUDg7Ci0JTUFDX2tleW1hcFtNS19LUDldID0gU0RMS19LUDk7Ci0JTUFDX2tleW1hcFtNS19LUF9NSU5VU10gPSBTRExLX0tQX01JTlVTOwotCU1BQ19rZXltYXBbTUtfQ0FQU0xPQ0tdID0gU0RMS19DQVBTTE9DSzsKLQlNQUNfa2V5bWFwW01LX2FdID0gU0RMS19hOwotCU1BQ19rZXltYXBbTUtfc10gPSBTRExLX3M7Ci0JTUFDX2tleW1hcFtNS19kXSA9IFNETEtfZDsKLQlNQUNfa2V5bWFwW01LX2ZdID0gU0RMS19mOwotCU1BQ19rZXltYXBbTUtfZ10gPSBTRExLX2c7Ci0JTUFDX2tleW1hcFtNS19oXSA9IFNETEtfaDsKLQlNQUNfa2V5bWFwW01LX2pdID0gU0RMS19qOwotCU1BQ19rZXltYXBbTUtfa10gPSBTRExLX2s7Ci0JTUFDX2tleW1hcFtNS19sXSA9IFNETEtfbDsKLQlNQUNfa2V5bWFwW01LX1NFTUlDT0xPTl0gPSBTRExLX1NFTUlDT0xPTjsKLQlNQUNfa2V5bWFwW01LX1FVT1RFXSA9IFNETEtfUVVPVEU7Ci0JTUFDX2tleW1hcFtNS19SRVRVUk5dID0gU0RMS19SRVRVUk47Ci0JTUFDX2tleW1hcFtNS19LUDRdID0gU0RMS19LUDQ7Ci0JTUFDX2tleW1hcFtNS19LUDVdID0gU0RMS19LUDU7Ci0JTUFDX2tleW1hcFtNS19LUDZdID0gU0RMS19LUDY7Ci0JTUFDX2tleW1hcFtNS19LUF9QTFVTXSA9IFNETEtfS1BfUExVUzsKLQlNQUNfa2V5bWFwW01LX0xTSElGVF0gPSBTRExLX0xTSElGVDsKLQlNQUNfa2V5bWFwW01LX3pdID0gU0RMS196OwotCU1BQ19rZXltYXBbTUtfeF0gPSBTRExLX3g7Ci0JTUFDX2tleW1hcFtNS19jXSA9IFNETEtfYzsKLQlNQUNfa2V5bWFwW01LX3ZdID0gU0RMS192OwotCU1BQ19rZXltYXBbTUtfYl0gPSBTRExLX2I7Ci0JTUFDX2tleW1hcFtNS19uXSA9IFNETEtfbjsKLQlNQUNfa2V5bWFwW01LX21dID0gU0RMS19tOwotCU1BQ19rZXltYXBbTUtfQ09NTUFdID0gU0RMS19DT01NQTsKLQlNQUNfa2V5bWFwW01LX1BFUklPRF0gPSBTRExLX1BFUklPRDsKLQlNQUNfa2V5bWFwW01LX1NMQVNIXSA9IFNETEtfU0xBU0g7Ci0jaWYgMAkvKiBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgdGhlIGxlZnQgdmVyc2lvbnMgLSB1c2UgbGVmdCBieSBkZWZhdWx0ICovCi0JTUFDX2tleW1hcFtNS19SU0hJRlRdID0gU0RMS19SU0hJRlQ7Ci0jZW5kaWYKLQlNQUNfa2V5bWFwW01LX1VQXSA9IFNETEtfVVA7Ci0JTUFDX2tleW1hcFtNS19LUDFdID0gU0RMS19LUDE7Ci0JTUFDX2tleW1hcFtNS19LUDJdID0gU0RMS19LUDI7Ci0JTUFDX2tleW1hcFtNS19LUDNdID0gU0RMS19LUDM7Ci0JTUFDX2tleW1hcFtNS19LUF9FTlRFUl0gPSBTRExLX0tQX0VOVEVSOwotCU1BQ19rZXltYXBbTUtfTENUUkxdID0gU0RMS19MQ1RSTDsKLQlNQUNfa2V5bWFwW01LX0xBTFRdID0gU0RMS19MQUxUOwotCU1BQ19rZXltYXBbTUtfTE1FVEFdID0gU0RMS19MTUVUQTsKLQlNQUNfa2V5bWFwW01LX1NQQUNFXSA9IFNETEtfU1BBQ0U7Ci0jaWYgMAkvKiBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgdGhlIGxlZnQgdmVyc2lvbnMgLSB1c2UgbGVmdCBieSBkZWZhdWx0ICovCi0JTUFDX2tleW1hcFtNS19STUVUQV0gPSBTRExLX1JNRVRBOwotCU1BQ19rZXltYXBbTUtfUkFMVF0gPSBTRExLX1JBTFQ7Ci0JTUFDX2tleW1hcFtNS19SQ1RSTF0gPSBTRExLX1JDVFJMOwotI2VuZGlmCi0JTUFDX2tleW1hcFtNS19MRUZUXSA9IFNETEtfTEVGVDsKLQlNQUNfa2V5bWFwW01LX0RPV05dID0gU0RMS19ET1dOOwotCU1BQ19rZXltYXBbTUtfUklHSFRdID0gU0RMS19SSUdIVDsKLQlNQUNfa2V5bWFwW01LX0tQMF0gPSBTRExLX0tQMDsKLQlNQUNfa2V5bWFwW01LX0tQX1BFUklPRF0gPSBTRExLX0tQX1BFUklPRDsKLQotI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQotCS8qIFdpZXJkLCB0aGVzZSBrZXlzIGFyZSBvbiBteSBpQm9vayB1bmRlciBNYWMgT1MgWAotCSAgIE5vdGUgdGhhdCB0aGUgbGVmdCBhcnJvdyBrZXlzeW0gaXMgdGhlIHNhbWUgYXMgbGVmdCBjdHJsIT8KLQkgKi8KLQlNQUNfa2V5bWFwW01LX0lCT09LX0VOVEVSXSA9IFNETEtfS1BfRU5URVI7Ci0JTUFDX2tleW1hcFtNS19JQk9PS19SSUdIVF0gPSBTRExLX1JJR0hUOwotCU1BQ19rZXltYXBbTUtfSUJPT0tfRE9XTl0gPSBTRExLX0RPV047Ci0JTUFDX2tleW1hcFtNS19JQk9PS19VUF0gPSBTRExLX1VQOwotCU1BQ19rZXltYXBbTUtfSUJPT0tfTEVGVF0gPSBTRExLX0xFRlQ7Ci0jZW5kaWYgLyogTWFjIE9TIFggKi8KLQotCS8qIFVwIHRoZXJlIHdlIHNldHVwIGEgc3RhdGljIHNjYW5jb2RlLT5rZXlzeW0gbWFwLiBIb3dldmVyLCBpdCB3aWxsIG5vdAotCSAqIHdvcmsgdmVyeSB3ZWxsIG9uIGludGVybmF0aW9uYWwga2V5Ym9hcmQuIEhlbmNlIHdlIG5vdyBxdWVyeSBNYWNPUwotCSAqIGZvciBpdHMgb3duIGtleW1hcCB0byBhZGp1c3Qgb3VyIG93biBtYXBwaW5nIHRhYmxlLiBIb3dldmVyLCB0aGlzIGlzCi0JICogYmFzY2lhbGx5IG9ubHkgdXNlZnVsIGZvciBhc2NpaSBjaGFyIGtleXMuIFRoaXMgaXMgYWxzbyB0aGUgcmVhc29uCi0JICogd2h5IHdlIGtlZXAgdGhlIHN0YXRpYyB0YWJsZSwgdG9vLgotCSAqLwotCQotCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIHN5c3RlbXMgY2FjaGVkIEtDSFIgKi8KLQlLQ0hSUHRyID0gKHZvaWQgKilHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21LQ0hSQ2FjaGUpOwotCWlmIChLQ0hSUHRyKQotCXsKLQkJLyogTG9vcCBvdmVyIGFsbCAxMjcgcG9zc2libGUgc2NhbiBjb2RlcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMHg3RjsgaSsrKQotCQl7Ci0JCQkvKiBXZSBwcmV0ZW5kIGEgY2xlYW4gc3RhcnQgdG8gYmVnaW4gd2l0aCAoaS5lLiBubyBkZWFkIGtleXMgYWN0aXZlICovCi0JCQlzdGF0ZSA9IDA7Ci0JCQkKLQkJCS8qIE5vdyB0cmFuc2xhdGUgdGhlIGtleSBjb2RlIHRvIGEga2V5IHZhbHVlICovCi0JCQl2YWx1ZSA9IEtleVRyYW5zbGF0ZShLQ0hSUHRyLCBpLCAmc3RhdGUpICYgMHhmZjsKLQkJCQotCQkJLyogSWYgdGhlIHN0YXRlIGJlY29tZSAwLCBpdCB3YXMgYSBkZWFkIGtleS4gV2UgbmVlZCB0byB0cmFuc2xhdGUgYWdhaW4sCi0JCQlwYXNzaW5nIGluIHRoZSBuZXcgc3RhdGUsIHRvIGdldCB0aGUgYWN0dWFsIGtleSB2YWx1ZSAqLwotCQkJaWYgKHN0YXRlICE9IDApCi0JCQkJdmFsdWUgPSBLZXlUcmFuc2xhdGUoS0NIUlB0ciwgaSwgJnN0YXRlKSAmIDB4ZmY7Ci0JCQkKLQkJCS8qIE5vdyB3ZSBzaG91bGQgaGF2ZSBhbiBhc2NpaSB2YWx1ZSwgb3IgMC4gVHJ5IHRvIGZpZ3VyZSBvdXQgdG8gd2hpY2ggU0RMIHN5bWJvbCBpdCBtYXBzICovCi0JCQlpZiAodmFsdWUgPj0gMTI4KQkgLyogU29tZSBub24tQVNDSUkgY2hhciwgbWFwIGl0IHRvIFNETEtfV09STERfKiAqLwotCQkJCU1BQ19rZXltYXBbaV0gPSB3b3JsZCsrOwotCQkJZWxzZSBpZiAodmFsdWUgPj0gMzIpCSAvKiBub24tY29udHJvbCBBU0NJSSBjaGFyICovCi0JCQkJTUFDX2tleW1hcFtpXSA9IHZhbHVlOwotCQl9Ci0JfQotCQotCS8qIFRoZSBrZXlwYWQgY29kZXMgYXJlIHJlLXNldHVwIGhlcmUsIGJlY2F1c2UgdGhlIGxvb3AgYWJvdmUgY2Fubm90Ci0JICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGtleSBvbiB0aGUga2V5cGFkIGFuZCBhIHJlZ3VsYXIga2V5LiBXZSBtYXliZQotCSAqIGNvdWxkIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIGluIGFub3RoZXIgZmFzaGlvbjogTlNFdmVudCdzIGZsYWdzCi0JICogaW5jbHVkZSBhICJOU051bWVyaWNQYWRLZXlNYXNrIiBiaXQ7IHdlIGNvdWxkIGNoZWNrIHRoYXQgYW5kIG1vZGlmeQotCSAqIHRoZSBzeW1ib2wgd2UgcmV0dXJuIG9uIHRoZSBmbHkuIEhvd2V2ZXIsIHRoaXMgZmxhZyBzZWVtcyB0byBleGhpYml0Ci0JICogc29tZSB3ZWlyZCBiZWhhdmlvdXIgcmVsYXRlZCB0byB0aGUgbnVtIGxvY2sga2V5Ci0JICovCi0JTUFDX2tleW1hcFtNS19LUDBdID0gU0RMS19LUDA7Ci0JTUFDX2tleW1hcFtNS19LUDFdID0gU0RMS19LUDE7Ci0JTUFDX2tleW1hcFtNS19LUDJdID0gU0RMS19LUDI7Ci0JTUFDX2tleW1hcFtNS19LUDNdID0gU0RMS19LUDM7Ci0JTUFDX2tleW1hcFtNS19LUDRdID0gU0RMS19LUDQ7Ci0JTUFDX2tleW1hcFtNS19LUDVdID0gU0RMS19LUDU7Ci0JTUFDX2tleW1hcFtNS19LUDZdID0gU0RMS19LUDY7Ci0JTUFDX2tleW1hcFtNS19LUDddID0gU0RMS19LUDc7Ci0JTUFDX2tleW1hcFtNS19LUDhdID0gU0RMS19LUDg7Ci0JTUFDX2tleW1hcFtNS19LUDldID0gU0RMS19LUDk7Ci0JTUFDX2tleW1hcFtNS19LUF9NSU5VU10gPSBTRExLX0tQX01JTlVTOwotCU1BQ19rZXltYXBbTUtfS1BfUExVU10gPSBTRExLX0tQX1BMVVM7Ci0JTUFDX2tleW1hcFtNS19LUF9QRVJJT0RdID0gU0RMS19LUF9QRVJJT0Q7Ci0JTUFDX2tleW1hcFtNS19LUF9FUVVBTFNdID0gU0RMS19LUF9FUVVBTFM7Ci0JTUFDX2tleW1hcFtNS19LUF9ESVZJREVdID0gU0RMS19LUF9ESVZJREU7Ci0JTUFDX2tleW1hcFtNS19LUF9NVUxUSVBMWV0gPSBTRExLX0tQX01VTFRJUExZOwotCU1BQ19rZXltYXBbTUtfS1BfRU5URVJdID0gU0RMS19LUF9FTlRFUjsKLX0KLQotc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIGludCBtb2RpZmllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9rZXlzeW0gKmtleXN5bSwgaW50IHByZXNzZWQpCi17Ci0JLyogU2V0IHRoZSBrZXlzeW0gaW5mb3JtYXRpb24gKi8KLQlrZXlzeW0tPnNjYW5jb2RlID0gc2NhbmNvZGU7Ci0Ja2V5c3ltLT5zeW0gPSBNQUNfa2V5bWFwW2tleXN5bS0+c2NhbmNvZGVdOwotCWtleXN5bS0+bW9kID0gS01PRF9OT05FOwotCWtleXN5bS0+dW5pY29kZSA9IDA7Ci0JaWYgKCBwcmVzc2VkICYmIFNETF9UcmFuc2xhdGVVTklDT0RFICkgewotCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGF0ZSA9IDA7Ci0JCXN0YXRpYyBQdHIga2V5bWFwID0gbmlsOwotCQlQdHIgbmV3X2tleW1hcDsKLQotCQkvKiBHZXQgdGhlIGN1cnJlbnQga2V5Ym9hcmQgbWFwIHJlc291cmNlICovCi0JCW5ld19rZXltYXAgPSAoUHRyKUdldFNjcmlwdE1hbmFnZXJWYXJpYWJsZShzbUtDSFJDYWNoZSk7Ci0JCWlmICggbmV3X2tleW1hcCAhPSBrZXltYXAgKSB7Ci0JCQlrZXltYXAgPSBuZXdfa2V5bWFwOwotCQkJc3RhdGUgPSAwOwotCQl9Ci0JCWtleXN5bS0+dW5pY29kZSA9IEtleVRyYW5zbGF0ZShrZXltYXAsCi0JCQlrZXlzeW0tPnNjYW5jb2RlfG1vZGlmaWVycywgJnN0YXRlKSAmIDB4RkZGRjsKLQl9Ci0JcmV0dXJuKGtleXN5bSk7Ci19Ci0KLXZvaWQgTWFjX0luaXRFdmVudHMoX1RISVMpCi17Ci0JLyogQ3JlYXRlIGFwcGxlIG1lbnUgYmFyICovCi0JYXBwbGVfbWVudSA9IEdldE1lbnUobUFwcGxlKTsKLQlpZiAoIGFwcGxlX21lbnUgIT0gbmlsICkgewotCQlBcHBlbmRSZXNNZW51KGFwcGxlX21lbnUsICdEUlZSJyk7Ci0JCUluc2VydE1lbnUoYXBwbGVfbWVudSwgMCk7Ci0JfQotCURyYXdNZW51QmFyKCk7Ci0KLQkvKiBHZXQgcmlkIG9mIHNwdXJpb3VzIGV2ZW50cyBhdCBzdGFydHVwICovCi0JRmx1c2hFdmVudHMoZXZlcnlFdmVudCwgMCk7Ci0JCi0JLyogQWxsb3cgZXZlcnkgZXZlbnQgYnV0IGtleXJlcGVhdCAqLwotCVNldEV2ZW50TWFzayhldmVyeUV2ZW50ICYgfmF1dG9LZXlNYXNrKTsKLX0KLQotdm9pZCBNYWNfUXVpdEV2ZW50cyhfVEhJUykKLXsKLQlDbGVhck1lbnVCYXIoKTsKLQlpZiAoIGFwcGxlX21lbnUgIT0gbmlsICkgewotCQlSZWxlYXNlUmVzb3VyY2UoKGNoYXIgKiopYXBwbGVfbWVudSk7Ci0JfQotCi0JLyogQ2xlYW4gdXAgcGVuZGluZyBldmVudHMgKi8KLQlGbHVzaEV2ZW50cyhldmVyeUV2ZW50LCAwKTsKLX0KLQotc3RhdGljIHZvaWQgTWFjX0RvQXBwbGVNZW51KF9USElTLCBsb25nIGNob2ljZSkKLXsKLSNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICAvKiBObyBBcHBsZSBtZW51IGluIE9TIFggKi8KLQlzaG9ydCBtZW51LCBpdGVtOwotCi0JaXRlbSA9IChjaG9pY2UmMHhGRkZGKTsKLQljaG9pY2UgPj49IDE2OwotCW1lbnUgPSAoY2hvaWNlJjB4RkZGRik7Ci0JCi0Jc3dpdGNoIChtZW51KSB7Ci0JCWNhc2UgbUFwcGxlOiB7Ci0JCQlzd2l0Y2ggKGl0ZW0pIHsKLQkJCQljYXNlIGlBYm91dDogewotCQkJCQkvKiBSdW4gdGhlIGFib3V0IGJveCAqLzsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDogewotCQkJCQlTdHIyNTUgbmFtZTsKLQkJCQkJCi0JCQkJCUdldE1lbnVJdGVtVGV4dChhcHBsZV9tZW51LCBpdGVtLCBuYW1lKTsKLQkJCQkJT3BlbkRlc2tBY2MobmFtZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCQlkZWZhdWx0OiB7Ci0JCQkvKiBJZ25vcmUgb3RoZXIgbWVudXMgKi87Ci0JCX0KLQl9Ci0jZW5kaWYgLyogIVRBUkdFVF9BUElfTUFDX0NBUkJPTiAqLwotfQotCi0jaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgotLyogU2luY2Ugd2UgZG9uJ3QgaW5pdGlhbGl6ZSBRdWlja0RyYXcsIHdlIG5lZWQgdG8gZ2V0IGEgcG9pbnRlciB0byBxZCAqLwotc3RydWN0IFFER2xvYmFscyAqdGhlUUQgPSBOVUxMOwotI2VuZGlmCi0KLS8qIEV4cG9ydGVkIHRvIHRoZSBtYWNtYWluIGNvZGUgKi8KLXZvaWQgU0RMX0luaXRRdWlja0RyYXcoc3RydWN0IFFER2xvYmFscyAqdGhlX3FkKQotewotI2lmICFUQVJHRVRfQVBJX01BQ19DQVJCT04KLQl0aGVRRCA9IHRoZV9xZDsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhOTJhZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjZXZlbnRzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiLi4vbWFjcm9tL1NETF9yb212aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX21hY2V2ZW50cy5jIGZvciB0aGUgdmlkZW8gc3Vic3lzdGVtCi0qLwotZXh0ZXJuIHZvaWQgTWFjX0luaXRFdmVudHMoX1RISVMpOwotZXh0ZXJuIHZvaWQgTWFjX1F1aXRFdmVudHMoX1RISVMpOwotCi1leHRlcm4gdm9pZCBNYWNfSW5pdE9TS2V5bWFwKF9USElTKTsKLWV4dGVybiB2b2lkIE1hY19QdW1wRXZlbnRzKF9USElTKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWNnbC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2dsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmM1MjkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2dsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEFHTCBpbXBsZW1lbnRhdGlvbiBvZiBTREwgT3BlbkdMIHN1cHBvcnQgKi8KLQotI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgotI2luY2x1ZGUgIlNETF9tYWNnbF9jLmgiCi0jaW5jbHVkZSAiU0RMX2xvYWRzby5oIgotCi0KLS8qIGtyYXQ6IGFkZGluZyBPcGVuR0wgc3VwcG9ydCAqLwotaW50IE1hY19HTF9Jbml0KF9USElTKQotewotI2lmIFNETF9WSURFT19PUEVOR0wKLQlBR0xQaXhlbEZvcm1hdCBmb3JtYXQ7Ci0gICAJaW50IGkgPSAwOwotCUdMaW50IGF0dHJpYnV0ZXMgWyAyNiBdOyAvKiAyNiBpcyBtYXggcG9zc2libGUgaW4gdGhpcyBzZXR1cCAqLwotCUdMYm9vbGVhbiBub2VycjsKLSAgIAotCS8qIGxvYWQgdGhlIGdsIGRyaXZlciBmcm9tIGEgZGVmYXVsdCBwYXRoICovCi0JaWYgKCAhIHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkICkgewotCQkvKiBubyBkcml2ZXIgaGFzIGJlZW4gbG9hZGVkLCB1c2UgZGVmYXVsdCAob3Vyc2VsdmVzKSAqLwotCQlpZiAoIE1hY19HTF9Mb2FkTGlicmFyeSh0aGlzLCBOVUxMKSA8IDAgKSB7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JfQotCi0JYXR0cmlidXRlc1tpKytdID0gQUdMX1JHQkE7Ci0JaWYgKCB0aGlzLT5nbF9jb25maWcucmVkX3NpemUgICAhPSAwICYmCi0JICAgICB0aGlzLT5nbF9jb25maWcuYmx1ZV9zaXplICAhPSAwICYmCi0JICAgICB0aGlzLT5nbF9jb25maWcuZ3JlZW5fc2l6ZSAhPSAwICkgewotCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfUkVEX1NJWkU7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5yZWRfc2l6ZTsKLQkJYXR0cmlidXRlc1tpKytdID0gQUdMX0dSRUVOX1NJWkU7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5ncmVlbl9zaXplOwotCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfQkxVRV9TSVpFOwotCQlhdHRyaWJ1dGVzW2krK10gPSB0aGlzLT5nbF9jb25maWcuYmx1ZV9zaXplOwotCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfQUxQSEFfU0laRTsKLQkJYXR0cmlidXRlc1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmFscGhhX3NpemU7Ci0JfQotCWlmICggdGhpcy0+Z2xfY29uZmlnLmRvdWJsZV9idWZmZXIgKSB7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9ET1VCTEVCVUZGRVI7Ci0JfQotCWlmICggdGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemUgIT0gMCApIHsKLQkJYXR0cmlidXRlc1tpKytdID0gQUdMX0RFUFRIX1NJWkU7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplOwotCX0JCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplICE9IDAgKSB7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9TVEVOQ0lMX1NJWkU7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemU7Ci0JfQotCWlmICggdGhpcy0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplICAgIT0gMCAmJgotCSAgICAgdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2JsdWVfc2l6ZSAgIT0gMCAmJgotCSAgICAgdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemUgIT0gMCApIHsKLQkJCi0JCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9BQ0NVTV9SRURfU0laRTsKLQkJYXR0cmlidXRlc1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplOwotCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfQUNDVU1fR1JFRU5fU0laRTsKLQkJYXR0cmlidXRlc1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemU7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9BQ0NVTV9CTFVFX1NJWkU7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemU7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9BQ0NVTV9BTFBIQV9TSVpFOwotCQlhdHRyaWJ1dGVzW2krK10gPSB0aGlzLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZTsKLQl9Ci0JaWYgKCB0aGlzLT5nbF9jb25maWcuc3RlcmVvICkgewotCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfU1RFUkVPOwotCX0KLSNpZiBkZWZpbmVkKEFHTF9TQU1QTEVfQlVGRkVSU19BUkIpICYmIGRlZmluZWQoQUdMX1NBTVBMRVNfQVJCKQotCWlmICggdGhpcy0+Z2xfY29uZmlnLm11bHRpc2FtcGxlYnVmZmVycyAhPSAwICkgewotCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfU0FNUExFX0JVRkZFUlNfQVJCOwotCQlhdHRyaWJ1dGVzW2krK10gPSB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVidWZmZXJzOwotCX0JCi0JaWYgKCB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVzYW1wbGVzICE9IDAgKSB7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9TQU1QTEVTX0FSQjsKLQkJYXR0cmlidXRlc1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLm11bHRpc2FtcGxlc2FtcGxlczsKLQl9CQotI2VuZGlmCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjZWxlcmF0ZWQgPiAwICkgewotCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfQUNDRUxFUkFURUQ7Ci0JCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9OT19SRUNPVkVSWTsKLQl9Ci0KLQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfQUxMX1JFTkRFUkVSUzsKLQlhdHRyaWJ1dGVzW2ldCT0gQUdMX05PTkU7Ci0KLQlmb3JtYXQgPSBhZ2xDaG9vc2VQaXhlbEZvcm1hdChOVUxMLCAwLCBhdHRyaWJ1dGVzKTsKLQlpZiAoIGZvcm1hdCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG1hdGNoIE9wZW5HTCBkZXNpcmVkIGZvcm1hdCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCWdsQ29udGV4dCA9IGFnbENyZWF0ZUNvbnRleHQoZm9ybWF0LCBOVUxMKTsKLQlpZiAoIGdsQ29udGV4dCA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBPcGVuR0wgY29udGV4dCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlhZ2xEZXN0cm95UGl4ZWxGb3JtYXQoZm9ybWF0KTsKLQotICAgICNpZiAgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0Jbm9lcnIgPSBhZ2xTZXREcmF3YWJsZShnbENvbnRleHQsIEdldFdpbmRvd1BvcnQoU0RMX1dpbmRvdykpOwotICAgICNlbHNlCi0Jbm9lcnIgPSBhZ2xTZXREcmF3YWJsZShnbENvbnRleHQsIChBR0xEcmF3YWJsZSlTRExfV2luZG93KTsKLSAgICAjZW5kaWYKLSAgICAKLQlpZighbm9lcnIpIHsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gYmluZCBHTCBjb250ZXh0IHRvIHdpbmRvdyIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oMCk7Ci0jZWxzZQotCVNETF9TZXRFcnJvcigiT3BlbkdMIHN1cHBvcnQgbm90IGNvbmZpZ3VyZWQiKTsKLQlyZXR1cm4oLTEpOwotI2VuZGlmCi19Ci0KLXZvaWQgTWFjX0dMX1F1aXQoX1RISVMpCi17Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCWlmICggZ2xDb250ZXh0ICE9IE5VTEwgKSB7Ci0JCWFnbFNldEN1cnJlbnRDb250ZXh0KE5VTEwpOwotCQlhZ2xTZXREcmF3YWJsZShnbENvbnRleHQsIE5VTEwpOwotCQlhZ2xEZXN0cm95Q29udGV4dChnbENvbnRleHQpOwkJCi0JCWdsQ29udGV4dCA9IE5VTEw7Ci0JfQotI2VuZGlmCi19Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0KLS8qIE1ha2UgdGhlIGN1cnJlbnQgY29udGV4dCBhY3RpdmUgKi8KLWludCBNYWNfR0xfTWFrZUN1cnJlbnQoX1RISVMpCi17Ci0JaW50IHJldHZhbDsKLQotCXJldHZhbCA9IDA7Ci0JaWYoICEgYWdsU2V0Q3VycmVudENvbnRleHQoZ2xDb250ZXh0KSApIHsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gbWFrZSBHTCBjb250ZXh0IGN1cnJlbnQiKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCXJldHVybihyZXR2YWwpOwotfQotCi12b2lkIE1hY19HTF9Td2FwQnVmZmVycyhfVEhJUykKLXsKLQlhZ2xTd2FwQnVmZmVycyhnbENvbnRleHQpOwotfQotCi1pbnQgTWFjX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyICpsb2NhdGlvbikKLXsKLQlpZiAobG9jYXRpb24gPT0gTlVMTCkKLSNpZiBfX01BQ0hfXwotCQlsb2NhdGlvbiA9ICIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9PcGVuR0wuZnJhbWV3b3JrL09wZW5HTCI7Ci0jZWxzZQotCQlsb2NhdGlvbiA9ICJPcGVuR0xMaWJyYXJ5IjsKLSNlbmRpZgotCi0JdGhpcy0+aGlkZGVuLT5saWJyYXJ5SGFuZGxlID0gU0RMX0xvYWRPYmplY3QobG9jYXRpb24pOwotCi0JdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAxOwotCXJldHVybiAodGhpcy0+aGlkZGVuLT5saWJyYXJ5SGFuZGxlICE9IE5VTEwpID8gMCA6IC0xOwotfQotCi12b2lkIE1hY19HTF9VbmxvYWRMaWJyYXJ5KF9USElTKQotewotCVNETF9VbmxvYWRPYmplY3QodGhpcy0+aGlkZGVuLT5saWJyYXJ5SGFuZGxlKTsKLQotCXRoaXMtPmhpZGRlbi0+bGlicmFyeUhhbmRsZSA9IE5VTEw7Ci0JdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAwOwotfQotCi12b2lkKiBNYWNfR0xfR2V0UHJvY0FkZHJlc3MoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpCi17Ci0JcmV0dXJuIFNETF9Mb2FkRnVuY3Rpb24oIHRoaXMtPmhpZGRlbi0+bGlicmFyeUhhbmRsZSwgcHJvYyApOwotfQotCi0jZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTCAqLwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjZ2xfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2dsX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxY2JlNS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjZ2xfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotLyogQUdMIGltcGxlbWVudGF0aW9uIG9mIFNETCBPcGVuR0wgc3VwcG9ydCAqLwotCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotI2luY2x1ZGUgIlNETF9vcGVuZ2wuaCIKLSNpZiBfX01BQ09TWF9fCi0jaW5jbHVkZSA8QUdML2FnbC5oPiAgIC8qIEFHTC5mcmFtZXdvcmsgKi8KLSNlbHNlCi0jaW5jbHVkZSA8YWdsLmg+Ci0jZW5kaWYKLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi0KLS8qIE9wZW5HTCBmdW5jdGlvbnMgKi8KLWV4dGVybiBpbnQgTWFjX0dMX0luaXQoX1RISVMpOwotZXh0ZXJuIHZvaWQgTWFjX0dMX1F1aXQoX1RISVMpOwotI2lmIFNETF9WSURFT19PUEVOR0wKLWV4dGVybiBpbnQgTWFjX0dMX01ha2VDdXJyZW50KF9USElTKTsKLWV4dGVybiBpbnQgTWFjX0dMX0dldEF0dHJpYnV0ZShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOwotZXh0ZXJuIHZvaWQgTWFjX0dMX1N3YXBCdWZmZXJzKF9USElTKTsKLWV4dGVybiBpbnQgTWFjX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyICpsb2NhdGlvbik7Ci1leHRlcm4gdm9pZCBNYWNfR0xfVW5sb2FkTGlicmFyeShfVEhJUyk7Ci1leHRlcm4gdm9pZCogTWFjX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyICpwcm9jKTsKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFja2V5cy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2tleXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0NThjYS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFja2V5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0KLS8qIFRoZXNlIGFyZSB0aGUgTWFjaW50b3NoIGtleSBzY2FuY29kZSBjb25zdGFudHMgLS0gZnJvbSBJbnNpZGUgTWFjaW50b3NoICovCi0KLSNkZWZpbmUgTUtfRVNDQVBFCQkweDM1Ci0jZGVmaW5lIE1LX0YxCQkJMHg3QQotI2RlZmluZSBNS19GMgkJCTB4NzgKLSNkZWZpbmUgTUtfRjMJCQkweDYzCi0jZGVmaW5lIE1LX0Y0CQkJMHg3NgotI2RlZmluZSBNS19GNQkJCTB4NjAKLSNkZWZpbmUgTUtfRjYJCQkweDYxCi0jZGVmaW5lIE1LX0Y3CQkJMHg2MgotI2RlZmluZSBNS19GOAkJCTB4NjQKLSNkZWZpbmUgTUtfRjkJCQkweDY1Ci0jZGVmaW5lIE1LX0YxMAkJCTB4NkQKLSNkZWZpbmUgTUtfRjExCQkJMHg2NwotI2RlZmluZSBNS19GMTIJCQkweDZGCi0jZGVmaW5lIE1LX1BSSU5UCQkweDY5Ci0jZGVmaW5lIE1LX1NDUk9MTE9DSwkJMHg2QgotI2RlZmluZSBNS19QQVVTRQkJMHg3MQotI2RlZmluZSBNS19QT1dFUgkJMHg3RgotI2RlZmluZSBNS19CQUNLUVVPVEUJCTB4MzIKLSNkZWZpbmUgTUtfMQkJCTB4MTIKLSNkZWZpbmUgTUtfMgkJCTB4MTMKLSNkZWZpbmUgTUtfMwkJCTB4MTQKLSNkZWZpbmUgTUtfNAkJCTB4MTUKLSNkZWZpbmUgTUtfNQkJCTB4MTcKLSNkZWZpbmUgTUtfNgkJCTB4MTYKLSNkZWZpbmUgTUtfNwkJCTB4MUEKLSNkZWZpbmUgTUtfOAkJCTB4MUMKLSNkZWZpbmUgTUtfOQkJCTB4MTkKLSNkZWZpbmUgTUtfMAkJCTB4MUQKLSNkZWZpbmUgTUtfTUlOVVMJCTB4MUIKLSNkZWZpbmUgTUtfRVFVQUxTCQkweDE4Ci0jZGVmaW5lIE1LX0JBQ0tTUEFDRQkJMHgzMwotI2RlZmluZSBNS19JTlNFUlQJCTB4NzIKLSNkZWZpbmUgTUtfSE9NRQkJCTB4NzMKLSNkZWZpbmUgTUtfUEFHRVVQCQkweDc0Ci0jZGVmaW5lIE1LX05VTUxPQ0sJCTB4NDcKLSNkZWZpbmUgTUtfS1BfRVFVQUxTCQkweDUxCi0jZGVmaW5lIE1LX0tQX0RJVklERQkJMHg0QgotI2RlZmluZSBNS19LUF9NVUxUSVBMWQkJMHg0MwotI2RlZmluZSBNS19UQUIJCQkweDMwCi0jZGVmaW5lIE1LX3EJCQkweDBDCi0jZGVmaW5lIE1LX3cJCQkweDBECi0jZGVmaW5lIE1LX2UJCQkweDBFCi0jZGVmaW5lIE1LX3IJCQkweDBGCi0jZGVmaW5lIE1LX3QJCQkweDExCi0jZGVmaW5lIE1LX3kJCQkweDEwCi0jZGVmaW5lIE1LX3UJCQkweDIwCi0jZGVmaW5lIE1LX2kJCQkweDIyCi0jZGVmaW5lIE1LX28JCQkweDFGCi0jZGVmaW5lIE1LX3AJCQkweDIzCi0jZGVmaW5lIE1LX0xFRlRCUkFDS0VUCQkweDIxCi0jZGVmaW5lIE1LX1JJR0hUQlJBQ0tFVAkJMHgxRQotI2RlZmluZSBNS19CQUNLU0xBU0gJCTB4MkEKLSNkZWZpbmUgTUtfREVMRVRFCQkweDc1Ci0jZGVmaW5lIE1LX0VORAkJCTB4NzcKLSNkZWZpbmUgTUtfUEFHRURPV04JCTB4NzkKLSNkZWZpbmUgTUtfS1A3CQkJMHg1OQotI2RlZmluZSBNS19LUDgJCQkweDVCCi0jZGVmaW5lIE1LX0tQOQkJCTB4NUMKLSNkZWZpbmUgTUtfS1BfTUlOVVMJCTB4NEUKLSNkZWZpbmUgTUtfQ0FQU0xPQ0sJCTB4MzkKLSNkZWZpbmUgTUtfYQkJCTB4MDAKLSNkZWZpbmUgTUtfcwkJCTB4MDEKLSNkZWZpbmUgTUtfZAkJCTB4MDIKLSNkZWZpbmUgTUtfZgkJCTB4MDMKLSNkZWZpbmUgTUtfZwkJCTB4MDUKLSNkZWZpbmUgTUtfaAkJCTB4MDQKLSNkZWZpbmUgTUtfagkJCTB4MjYKLSNkZWZpbmUgTUtfawkJCTB4MjgKLSNkZWZpbmUgTUtfbAkJCTB4MjUKLSNkZWZpbmUgTUtfU0VNSUNPTE9OCQkweDI5Ci0jZGVmaW5lIE1LX1FVT1RFCQkweDI3Ci0jZGVmaW5lIE1LX1JFVFVSTgkJMHgyNAotI2RlZmluZSBNS19LUDQJCQkweDU2Ci0jZGVmaW5lIE1LX0tQNQkJCTB4NTcKLSNkZWZpbmUgTUtfS1A2CQkJMHg1OAotI2RlZmluZSBNS19LUF9QTFVTCQkweDQ1Ci0jZGVmaW5lIE1LX0xTSElGVAkJMHgzOAotI2RlZmluZSBNS196CQkJMHgwNgotI2RlZmluZSBNS194CQkJMHgwNwotI2RlZmluZSBNS19jCQkJMHgwOAotI2RlZmluZSBNS192CQkJMHgwOQotI2RlZmluZSBNS19iCQkJMHgwQgotI2RlZmluZSBNS19uCQkJMHgyRAotI2RlZmluZSBNS19tCQkJMHgyRQotI2RlZmluZSBNS19DT01NQQkJMHgyQgotI2RlZmluZSBNS19QRVJJT0QJCTB4MkYKLSNkZWZpbmUgTUtfU0xBU0gJCTB4MkMKLSNpZiAwCS8qIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyB0aGUgbGVmdCB2ZXJzaW9ucyAtIHVzZSBsZWZ0IGJ5IGRlZmF1bHQgKi8KLSNkZWZpbmUgTUtfUlNISUZUCQkweDM4Ci0jZW5kaWYKLSNkZWZpbmUgTUtfVVAJCQkweDdFCi0jZGVmaW5lIE1LX0tQMQkJCTB4NTMKLSNkZWZpbmUgTUtfS1AyCQkJMHg1NAotI2RlZmluZSBNS19LUDMJCQkweDU1Ci0jZGVmaW5lIE1LX0tQX0VOVEVSCQkweDRDCi0jZGVmaW5lIE1LX0xDVFJMCQkweDNCCi0jZGVmaW5lIE1LX0xBTFQJCQkweDNBCi0jZGVmaW5lIE1LX0xNRVRBCQkweDM3Ci0jZGVmaW5lIE1LX1NQQUNFCQkweDMxCi0jaWYgMAkvKiBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgdGhlIGxlZnQgdmVyc2lvbnMgLSB1c2UgbGVmdCBieSBkZWZhdWx0ICovCi0jZGVmaW5lIE1LX1JNRVRBCQkweDM3Ci0jZGVmaW5lIE1LX1JBTFQJCQkweDNBCi0jZGVmaW5lIE1LX1JDVFJMCQkweDNCCi0jZW5kaWYKLSNkZWZpbmUgTUtfTEVGVAkJCTB4N0IKLSNkZWZpbmUgTUtfRE9XTgkJCTB4N0QKLSNkZWZpbmUgTUtfUklHSFQJCTB4N0MKLSNkZWZpbmUgTUtfS1AwCQkJMHg1MgotI2RlZmluZSBNS19LUF9QRVJJT0QJCTB4NDEKLQotLyogV2llcmQsIHRoZXNlIGtleXMgYXJlIG9uIG15IGlCb29rIHVuZGVyIE1hYyBPUyBYICovCi0jZGVmaW5lIE1LX0lCT09LX0VOVEVSCQkweDM0Ci0jZGVmaW5lIE1LX0lCT09LX0xFRlQJCTB4M0IKLSNkZWZpbmUgTUtfSUJPT0tfUklHSFQJCTB4M0MKLSNkZWZpbmUgTUtfSUJPT0tfRE9XTgkJMHgzRAotI2RlZmluZSBNS19JQk9PS19VUAkJMHgzRQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY21vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjbW91c2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjM2EwZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjbW91c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQotI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KLSNlbGlmIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAmJiAoVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+IDB4MDMzNSkKLSNpbmNsdWRlIDxDYXJib24uaD4KLSNlbHNlCi0jaW5jbHVkZSA8UXVpY2tkcmF3Lmg+Ci0jZW5kaWYKLQotLyogUm91dGluZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgQ2FyYm9uIEFQSS4uLiAqLwotI2lmICFUQVJHRVRfQVBJX01BQ19DQVJCT04KLSNpbmNsdWRlIDxDdXJzb3JEZXZpY2VzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIlNETF9tYWNtb3VzZV9jLmgiCi0KLQotLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCi1zdHJ1Y3QgV01jdXJzb3IgewotCUN1cnNvciBjdXJzOwotfTsKLQotCi12b2lkIE1hY19GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCi17Ci0JU0RMX2ZyZWUoY3Vyc29yKTsKLX0KLQotV01jdXJzb3IgKk1hY19DcmVhdGVXTUN1cnNvcihfVEhJUywKLQkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KQotewotCVdNY3Vyc29yICpjdXJzb3I7Ci0JaW50IHJvdywgYnl0ZXM7Ci0JCQotCS8qIEFsbG9jYXRlIHRoZSBjdXJzb3IgbWVtb3J5ICovCi0JY3Vyc29yID0gKFdNY3Vyc29yICopU0RMX21hbGxvYyhzaXplb2YoV01jdXJzb3IpKTsKLQlpZiAoIGN1cnNvciA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlTRExfbWVtc2V0KGN1cnNvciwgMCwgc2l6ZW9mKCpjdXJzb3IpKTsKLSAgICAKLSAgICBpZiAodyA+IDE2KQotICAgICAgICB3ID0gMTY7Ci0gICAgCi0gICAgaWYgKGggPiAxNikKLSAgICAgICAgaCA9IDE2OwotICAgIAotCWJ5dGVzID0gKHcrNykvODsKLQotCWZvciAoIHJvdz0wOyByb3c8aDsgKytyb3cgKSB7Ci0JCVNETF9tZW1jcHkoJmN1cnNvci0+Y3Vycy5kYXRhW3Jvd10sIGRhdGEsIGJ5dGVzKTsKLQkJZGF0YSArPSBieXRlczsKLQl9Ci0JZm9yICggcm93PTA7IHJvdzxoOyArK3JvdyApIHsKLQkJU0RMX21lbWNweSgmY3Vyc29yLT5jdXJzLm1hc2tbcm93XSwgbWFzaywgYnl0ZXMpOwotCQltYXNrICs9IGJ5dGVzOwotCX0KLQljdXJzb3ItPmN1cnMuaG90U3BvdC5oID0gaG90X3g7Ci0JY3Vyc29yLT5jdXJzLmhvdFNwb3QudiA9IGhvdF95OwotCi0JLyogVGhhdCB3YXMgZWFzeS4gOikgKi8KLQlyZXR1cm4oY3Vyc29yKTsKLX0KLQotaW50IE1hY19jdXJzb3Jfc2hvd2luZyA9IDE7Ci0KLWludCBNYWNfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotCWlmICggY3Vyc29yID09IE5VTEwgKSB7Ci0JCWlmICggTWFjX2N1cnNvcl9zaG93aW5nICkgewotCQkJSGlkZUN1cnNvcigpOwotCQkJTWFjX2N1cnNvcl9zaG93aW5nID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCVNldEN1cnNvcigmY3Vyc29yLT5jdXJzKTsKLQkJaWYgKCAhIE1hY19jdXJzb3Jfc2hvd2luZyApIHsKLQkJCVNob3dDdXJzb3IoKTsKLQkJCU1hY19jdXJzb3Jfc2hvd2luZyA9IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuKDEpOwotfQotCi12b2lkIE1hY19XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSkKLXsKLSNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JQ3Vyc29yRGV2aWNlICpjdXJzb3JkZXZpY2U7Ci0KLQljdXJzb3JkZXZpY2UgPSBuaWw7Ci0JQ3Vyc29yRGV2aWNlTmV4dERldmljZSgmY3Vyc29yZGV2aWNlKTsKLQlpZiAoIGN1cnNvcmRldmljZSAhPSBuaWwgKSB7Ci0JCVdpbmRvd1B0ciBzYXZlcG9ydDsKLQkJUG9pbnQgd2hlcmU7Ci0KLQkJR2V0UG9ydCgmc2F2ZXBvcnQpOwotCQlTZXRQb3J0KFNETF9XaW5kb3cpOwotCQl3aGVyZS5oID0geDsKLQkJd2hlcmUudiA9IHk7Ci0JCUxvY2FsVG9HbG9iYWwoJndoZXJlKTsKLQkJU2V0UG9ydChzYXZlcG9ydCk7Ci0JCUN1cnNvckRldmljZU1vdmVUbyhjdXJzb3JkZXZpY2UsIHdoZXJlLmgsIHdoZXJlLnYpOwotCX0KLSNlbmRpZiAvKiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICovCi19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWNtb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjbW91c2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWJhNTkyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWNtb3VzZV9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIi4uL21hY3JvbS9TRExfcm9tdmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBNYWNfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiBXTWN1cnNvciAqTWFjX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAotCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOwotZXh0ZXJuIGludCBNYWNfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiB2b2lkIE1hY19XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci0KLS8qIERhdGEgdG8gYmUgZXhwb3J0ZWQgKi8KLWV4dGVybiBpbnQgTWFjX2N1cnNvcl9zaG93aW5nOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY3dtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjd20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4MjhiZi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjd20uYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQotI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KLSNlbGlmIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAmJiAoVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+IDB4MDMzNSkKLSNpbmNsdWRlIDxDYXJib24uaD4KLSNlbHNlCi0jaW5jbHVkZSA8V2luZG93cy5oPgotI2luY2x1ZGUgPFN0cmluZ3MuaD4KLSNlbmRpZgotCi0jaWYgU0RMX01BQ0NMQVNTSUNfR0FNTUFfU1VQUE9SVAotI2luY2x1ZGUgPERldmljZXMuaD4KLSNpbmNsdWRlIDxGaWxlcy5oPgotI2luY2x1ZGUgPE1hY1R5cGVzLmg+Ci0jaW5jbHVkZSA8UURPZmZzY3JlZW4uaD4KLSNpbmNsdWRlIDxRdWlja2RyYXcuaD4KLSNpbmNsdWRlIDxWaWRlby5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJTRExfc3RkaW5jLmgiCi0jaW5jbHVkZSAiU0RMX21hY3dtX2MuaCIKLQotdm9pZCBNYWNfU2V0Q2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pCi17Ci0JLyogRG9uJ3QgY29udmVydCBDIHRvIFAgc3RyaW5nIGluIHBsYWNlLCBiZWNhdXNlIGl0IG1heSBiZSByZWFkLW9ubHkgKi8KLQlTdHIyNTUJCXB0aXRsZTsgLyogTUpTICovCi0JcHRpdGxlWzBdID0gc3RybGVuICh0aXRsZSk7Ci0JU0RMX21lbWNweShwdGl0bGUrMSwgdGl0bGUsIHB0aXRsZVswXSk7IC8qIE1KUyAqLwotCWlmIChTRExfV2luZG93KQotCQlTZXRXVGl0bGUoU0RMX1dpbmRvdywgcHRpdGxlKTsgLyogTUpTICovCi19Ci0KLSNpZiBTRExfTUFDQ0xBU1NJQ19HQU1NQV9TVVBQT1JUCi0vKgotICogQURDIEdhbW1hIFJhbXAgc3VwcG9ydC4uLgotICoKLSAqIE1hYyBHYW1tYSBSYW1wIGNvZGUgd2FzIG9yaWdpbmFsbHkgZnJvbSBzYW1wbGUgY29kZSBwcm92aWRlZCBieQotICogIEFwcGxlIERldmVsb3BlciBDb25uZWN0aW9uLCBhbmQgbm90IHdyaXR0ZW4gc3BlY2lmaWNhbGx5IGZvciBTREw6Ci0gKiAiQ29udGFpbnM6IEZ1bmN0aW9ucyB0byBlbmFibGUgTWFjIE9TIGRldmljZSBnYW1tYSBhZGp1c3RtZW50cyB1c2luZyAzIGNoYW5uZWwgMjU2IGVsZW1lbnQgOCBiaXQgZ2FtbWEgcmFtcHMKLSAqICBXcml0dGVuIGJ5OiBHZW9mZiBTdGFobCAoZ2dzKQotICogIENvcHlyaWdodDogQ29weXJpZ2h0IChjKSAxOTk5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKiAgRGlzY2xhaW1lcjogWW91IG1heSBpbmNvcnBvcmF0ZSB0aGlzIHNhbXBsZSBjb2RlIGludG8geW91ciBhcHBsaWNhdGlvbnMgd2l0aG91dAotICogICAgICAgICAgICAgIHJlc3RyaWN0aW9uLCB0aG91Z2ggdGhlIHNhbXBsZSBjb2RlIGhhcyBiZWVuIHByb3ZpZGVkICJBUyBJUyIgYW5kIHRoZQotICogICAgICAgICAgICAgIHJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3BlcmF0aW9uIGlzIDEwMCUgeW91cnMuICBIb3dldmVyLCB3aGF0IHlvdSBhcmUKLSAqICAgICAgICAgICAgICBub3QgcGVybWl0dGVkIHRvIGRvIGlzIHRvIHJlZGlzdHJpYnV0ZSB0aGUgc291cmNlIGFzICJEU0MgU2FtcGxlIENvZGUiCi0gKiAgICAgICAgICAgICAgYWZ0ZXIgaGF2aW5nIG1hZGUgY2hhbmdlcy4gSWYgeW91J3JlIGdvaW5nIHRvIHJlLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSwKLSAqICAgICAgICAgICAgICB3ZSByZXF1aXJlIHRoYXQgeW91IG1ha2UgaXQgY2xlYXIgaW4gdGhlIHNvdXJjZSB0aGF0IHRoZSBjb2RlIHdhcwotICogICAgICAgICAgICAgIGRlc2NlbmRlZCBmcm9tIEFwcGxlIFNhbXBsZSBDb2RlLCBidXQgdGhhdCB5b3UndmUgbWFkZSBjaGFuZ2VzLiIKLSAqIChUaGUgc2FtcGxlIGNvZGUgaGFzIGJlZW4gaW50ZWdyYXRlZCBpbnRvIHRoaXMgZmlsZSwgYW5kIHRodXMgaXMgbW9kaWZpZWQgZnJvbSB0aGUgb3JpZ2luYWwgQXBwbGUgc291cmNlcy4pCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgcmVjRGV2aWNlR2FtbWEJCQkJCQkJCQkJCS8qIHN0b3JhZ2UgZm9yIGRldmljZSBoYW5kbGUgYW5kIGdhbW1hIHRhYmxlICovCi17Ci0JR0RIYW5kbGUgaEdEOwkJCQkJCQkJCQkJCS8qIGhhbmRsZSB0byBkZXZpY2UgKi8KLQlHYW1tYVRibFB0ciBwRGV2aWNlR2FtbWE7CQkJCQkJCQkJLyogcG9pbnRlciB0byBkZXZpY2UgZ2FtbWEgdGFibGUgKi8KLX0gcmVjRGV2aWNlR2FtbWE7Ci10eXBlZGVmIHJlY0RldmljZUdhbW1hICogcHJlY0RldmljZUdhbW1hOwotCi10eXBlZGVmIHN0cnVjdCByZWNTeXN0ZW1HYW1tYQkJCQkJCQkJCQkJLyogc3RvcmFnZSBmb3Igc3lzdGVtIGRldmljZXMgYW5kIGdhbW1hIHRhYmxlcyAqLwotewotCXNob3J0IG51bURldmljZXM7CQkJCQkJCQkJCQkvKiBudW1iZXIgb2YgZGV2aWNlcyAqLwotCXByZWNEZXZpY2VHYW1tYSAqIGRldkdhbW1hOwkJCQkJCQkJCS8qIGFycmF5IG9mIHBvaW50ZXJzIHRvIGRldmljZSBnYW1tYSByZWNvcmRzICovCi19IHJlY1N5c3RlbUdhbW1hOwotdHlwZWRlZiByZWNTeXN0ZW1HYW1tYSAqIHByZWNTeXN0ZW1HYW1tYTsKLQotc3RhdGljIFB0ciBDb3B5R2FtbWFUYWJsZSAoR2FtbWFUYmxQdHIgcFRhYmxlR2FtbWFJbikKLXsKLQlHYW1tYVRibFB0cgkJcFRhYmxlR2FtbWFPdXQgPSBOVUxMOwotCXNob3J0CQkJdGFibGVTaXplLCBkYXRhV2lkdGg7Ci0KLQlpZiAocFRhYmxlR2FtbWFJbikJCQkJCQkJCQkJCQkvKiBpZiB0aGVyZSBpcyBhIHRhYmxlIHRvIGNvcHkgICovCi0JewotCQlkYXRhV2lkdGggPSAocFRhYmxlR2FtbWFJbi0+Z0RhdGFXaWR0aCArIDcpIC8gODsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgcGVyIGVudHJ5ICovCi0JCXRhYmxlU2l6ZSA9IHNpemVvZiAoR2FtbWFUYmwpICsgcFRhYmxlR2FtbWFJbi0+Z0Zvcm11bGFTaXplICsKLQkJCQkJKHBUYWJsZUdhbW1hSW4tPmdDaGFuQ250ICogcFRhYmxlR2FtbWFJbi0+Z0RhdGFDbnQgKiBkYXRhV2lkdGgpOwotCQlwVGFibGVHYW1tYU91dCA9IChHYW1tYVRibFB0cikgTmV3UHRyICh0YWJsZVNpemUpOwkJCS8qIGFsbG9jYXRlIG5ldyB0YWJsZSAqLwotCQlpZiAocFRhYmxlR2FtbWFPdXQpCQkJCQkJCQkJCQkKLQkJCUJsb2NrTW92ZSggKFB0cilwVGFibGVHYW1tYUluLCAoUHRyKXBUYWJsZUdhbW1hT3V0LCB0YWJsZVNpemUpOwkvKiBtb3ZlIGV2ZXJ5dGhpbmcgKi8KLQl9Ci0JcmV0dXJuIChQdHIpcFRhYmxlR2FtbWFPdXQ7CQkJCQkJCQkJCS8qIHJldHVybiB3aGF0ZXZlciB3ZSBhbGxvY2F0ZWQsIGNvdWxkIGJlIE5VTEwgKi8KLX0KLQotc3RhdGljIE9TRXJyIEdldEdhbW1hVGFibGUgKEdESGFuZGxlIGhHRCwgR2FtbWFUYmxQdHIgKiBwcFRhYmxlR2FtbWFPdXQpCi17Ci0JVkRHYW1tYVJlY29yZCAgIERldmljZUdhbW1hUmVjOwotCUNudHJsUGFyYW0JCWNQYXJhbTsKLQlPU0VycgkJCWVycjsKLQkKLQljUGFyYW0uaW9Db21wbGV0aW9uID0gTlVMTDsJCQkJCQkJCQkJLyogc2V0IHVwIGNvbnRyb2wgcGFyYW1zICovCi0JY1BhcmFtLmlvTmFtZVB0ciA9IE5VTEw7Ci0JY1BhcmFtLmlvVlJlZk51bSA9IDA7Ci0JY1BhcmFtLmlvQ1JlZk51bSA9ICgqKmhHRCkuZ2RSZWZOdW07Ci0JY1BhcmFtLmNzQ29kZSA9IGNzY0dldEdhbW1hOwkJCQkJCQkJCS8qIEdldCBHYW1tYSBjb21tbmQgdG8gZGV2aWNlICovCi0JKihQdHIgKiljUGFyYW0uY3NQYXJhbSA9IChQdHIpICZEZXZpY2VHYW1tYVJlYzsJCQkJCS8qIHJlY29yZCBmb3IgZ2FtbWEgKi8KLQotCWVyciA9IFBCU3RhdHVzU3luYyggKFBhcm1CbGtQdHIpJmNQYXJhbSApOwkJCQkJCS8qIGdldCBnYW1tYSAqLwotCQotCSpwcFRhYmxlR2FtbWFPdXQgPSAoR2FtbWFUYmxQdHIpKERldmljZUdhbW1hUmVjLmNzR1RhYmxlKTsJCS8qIHB1bGwgdGFibGUgb3V0IG9mIHJlY29yZCAqLwotCQotCXJldHVybiBlcnI7CQotfQotCi1zdGF0aWMgUHRyIEdldERldmljZUdhbW1hIChHREhhbmRsZSBoR0QpCi17Ci0JR2FtbWFUYmxQdHIJCXBUYWJsZUdhbW1hRGV2aWNlID0gTlVMTDsKLQlHYW1tYVRibFB0cgkJcFRhYmxlR2FtbWFSZXR1cm4gPSBOVUxMOwkKLQlPU0VycgkJCWVycjsKLQkKLQllcnIgPSBHZXRHYW1tYVRhYmxlIChoR0QsICZwVGFibGVHYW1tYURldmljZSk7CQkJCQkvKiBnZXQgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2VzIHRhYmxlICovCi0JaWYgKChub0VyciA9PSBlcnIpICYmIHBUYWJsZUdhbW1hRGV2aWNlKQkJCQkJCS8qIGlmIHN1Y2Nlc2Z1bCAqLwotCQlwVGFibGVHYW1tYVJldHVybiA9IChHYW1tYVRibFB0cikgQ29weUdhbW1hVGFibGUgKHBUYWJsZUdhbW1hRGV2aWNlKTsgLyogY29weSB0byBnbG9iYWwgKi8KLQotCXJldHVybiAoUHRyKSBwVGFibGVHYW1tYVJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgRGlzcG9zZUdhbW1hVGFibGUgKFB0ciBwR2FtbWEpCi17Ci0JaWYgKHBHYW1tYSkKLQkJRGlzcG9zZVB0cigoUHRyKSBwR2FtbWEpOwkJCQkJCQkJCS8qIGdldCByaWQgb2YgaXQgKi8KLX0KLQotc3RhdGljIHZvaWQgRGlzcG9zZVN5c3RlbUdhbW1hcyAoUHRyKiBwcFN5c3RlbUdhbW1hcykKLXsKLQlwcmVjU3lzdGVtR2FtbWEgcFN5c0dhbW1hSW47Ci0JaWYgKHBwU3lzdGVtR2FtbWFzKQotCXsKLQkJcFN5c0dhbW1hSW4gPSAocHJlY1N5c3RlbUdhbW1hKSAqcHBTeXN0ZW1HYW1tYXM7Ci0JCWlmIChwU3lzR2FtbWFJbikKLQkJewotCQkJc2hvcnQgaTsKLQkJCWZvciAoaSA9IDA7IGkgPCBwU3lzR2FtbWFJbi0+bnVtRGV2aWNlczsgaSsrKQkJLyogZm9yIGFsbCBkZXZpY2VzICovCi0JCQkJaWYgKHBTeXNHYW1tYUluLT5kZXZHYW1tYSBbaV0pCQkJCQkJLyogaWYgcG9pbnRlciBpcyB2YWxpZCAqLwotCQkJCXsKLQkJCQkJRGlzcG9zZUdhbW1hVGFibGUgKChQdHIpIHBTeXNHYW1tYUluLT5kZXZHYW1tYSBbaV0tPnBEZXZpY2VHYW1tYSk7IC8qIGR1bXAgZ2FtbWEgdGFibGUgKi8KLQkJCQkJRGlzcG9zZVB0ciAoKFB0cikgcFN5c0dhbW1hSW4tPmRldkdhbW1hIFtpXSk7CQkJCQkgICAvKiBkdW1wIGRldmljZSBpbmZvICovCi0JCQkJfQotCQkJRGlzcG9zZVB0ciAoKFB0cikgcFN5c0dhbW1hSW4tPmRldkdhbW1hKTsJCQkJLyogZHVtcCBkZXZpY2UgcG9pbnRlciBhcnJheQkJICovCi0JCQlEaXNwb3NlUHRyICgoUHRyKSBwU3lzR2FtbWFJbik7CQkJCQkJCS8qIGR1bXAgc3lzdGVtIHN0cnVjdHVyZSAqLwotCQkJKnBwU3lzdGVtR2FtbWFzID0gTlVMTDsKLQkJfQkKLQl9Ci19Ci0KLXN0YXRpYyBCb29sZWFuIEdldERldmljZUdhbW1hUmFtcEdEIChHREhhbmRsZSBoR0QsIFB0ciBwUmFtcCkKLXsKLQlHYW1tYVRibFB0cgkJcFRhYmxlR2FtbWFUZW1wID0gTlVMTDsKLQlsb25nIAkJCWluZGV4Q2hhbiwgaW5kZXhFbnRyeTsKLQlPU0VycgkJCWVycjsKLQkKLQlpZiAocFJhbXApCQkJCQkJCQkJCQkJCQkJLyogZW5zdXJlIHBSYW1wIGlzIGFsbG9jYXRlZCAqLwotCXsKLQkJZXJyID0gR2V0R2FtbWFUYWJsZSAoaEdELCAmcFRhYmxlR2FtbWFUZW1wKTsJCQkJCS8qIGdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZ2FtbWEgKi8KLQkJaWYgKChub0VyciA9PSBlcnIpICYmIHBUYWJsZUdhbW1hVGVtcCkJCQkJCQkJLyogaWYgc3VjY2Vzc2Z1bCAqLwotCQl7CQkJCQkJCQkJCQkJCQkJCi0JCQkvKiBmaWxsIHJhbXAgKi8KLQkJCXVuc2lnbmVkIGNoYXIgKiBwRW50cnkgPSAodW5zaWduZWQgY2hhciAqKSAmcFRhYmxlR2FtbWFUZW1wLT5nRm9ybXVsYURhdGEgKyBwVGFibGVHYW1tYVRlbXAtPmdGb3JtdWxhU2l6ZTsgLyogYmFzZSBvZiB0YWJsZSAqLwotCQkJc2hvcnQgYnl0ZXNQZXJFbnRyeSA9IChwVGFibGVHYW1tYVRlbXAtPmdEYXRhV2lkdGggKyA3KSAvIDg7IC8qIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgZGV2aWNlIHRhYmxlIGVudHJpZXMgKi8KLQkJCXNob3J0IHNoaWZ0UmlnaHRWYWx1ZSA9IHBUYWJsZUdhbW1hVGVtcC0+Z0RhdGFXaWR0aCAtIDg7IAkgLyogbnVtYmVyIG9mIHJpZ2h0IHNoaWZ0cyBkZXZpY2UgLT4gcmFtcCAqLwotCQkJc2hvcnQgY2hhbm5lbHMgPSBwVGFibGVHYW1tYVRlbXAtPmdDaGFuQ250OwkKLQkJCXNob3J0IGVudHJpZXMgPSBwVGFibGVHYW1tYVRlbXAtPmdEYXRhQ250OwkJCQkJCQkJCQotCQkJaWYgKDMgPT0gY2hhbm5lbHMpCQkJCQkJCQkJCQkvKiBSR0IgZm9ybWF0ICovCi0JCQl7CQkJCQkJCQkJCQkJCQkJLyogbm90ZSwgdGhpcyB3aWxsIGNyZWF0ZSBydW5zIG9mIGVudHJpZXMgaWYgZGVzdC4gaXMgYmlnZ2VyIChub3QgbGluZWFyIGludGVycG9sYXRlKSAqLwotCQkJCWZvciAoaW5kZXhDaGFuID0gMDsgaW5kZXhDaGFuIDwgY2hhbm5lbHM7IGluZGV4Q2hhbisrKQotCQkJCQlmb3IgKGluZGV4RW50cnkgPSAwOyBpbmRleEVudHJ5IDwgMjU2OyBpbmRleEVudHJ5KyspCi0JCQkJCQkqKCh1bnNpZ25lZCBjaGFyICopIHBSYW1wICsgKGluZGV4Q2hhbiAqIDI1NikgKyBpbmRleEVudHJ5KSA9IAotCQkJCQkJICAqKHBFbnRyeSArIGluZGV4Q2hhbiAqIGVudHJpZXMgKiBieXRlc1BlckVudHJ5ICsgaW5kZXhFbnRyeSAqIGVudHJpZXMgKiBieXRlc1BlckVudHJ5IC8gMjU2KSA+PiBzaGlmdFJpZ2h0VmFsdWU7Ci0JCQl9Ci0JCQllbHNlCQkJCQkJCQkJCQkJCQkvKiBzaW5nbGUgY2hhbm5lbCBmb3JtYXQgKi8KLQkJCXsKLQkJCQlmb3IgKGluZGV4Q2hhbiA9IDA7IGluZGV4Q2hhbiA8IDc2ODsgaW5kZXhDaGFuICs9IDI1NikJLyogcmVwZWF0IGZvciBhbGwgMyBjaGFubmVscyAoc3RlcCBieSByYW1wIHNpemUpICovCi0JCQkJCWZvciAoaW5kZXhFbnRyeSA9IDA7IGluZGV4RW50cnkgPCAyNTY7IGluZGV4RW50cnkrKykgLyogZm9yIGFsbCBlbnRyaWVzIHNldCB2cmFtcCB2YWx1ZSAqLwotCQkJCQkJKigodW5zaWduZWQgY2hhciAqKSBwUmFtcCArIGluZGV4Q2hhbiArIGluZGV4RW50cnkpID0gCi0JCQkJCQkgICoocEVudHJ5ICsgaW5kZXhFbnRyeSAqIGVudHJpZXMgKiBieXRlc1BlckVudHJ5IC8gMjU2KSA+PiBzaGlmdFJpZ2h0VmFsdWU7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBQdHIgR2V0U3lzdGVtR2FtbWFzICh2b2lkKQotewotCXByZWNTeXN0ZW1HYW1tYSBwU3lzR2FtbWFPdXQ7CQkJCQkJCQkJLyogcmV0dXJuIHBvaW50ZXIgdG8gc3lzdGVtIGRldmljZSBnYW1tYSBpbmZvICovCi0Jc2hvcnQgZGV2Q291bnQgPSAwOwkJCQkJCQkJCQkJCS8qIG51bWJlciBvZiBkZXZpY2VzIGF0dGFjaGVkICovCi0JQm9vbGVhbiBmYWlsID0gZmFsc2U7Ci0JR0RIYW5kbGUgaEdEZXZpY2U7Ci0JCi0JcFN5c0dhbW1hT3V0ID0gKHByZWNTeXN0ZW1HYW1tYSkgTmV3UHRyIChzaXplb2YgKHJlY1N5c3RlbUdhbW1hKSk7IC8qIGFsbG9jYXRlIGZvciBzdHJ1Y3R1cmUgKi8KLQkKLQloR0RldmljZSA9IEdldERldmljZUxpc3QgKCk7CQkJCQkJCS8qIHRvcCBvZiBkZXZpY2UgbGlzdCAqLwotCWRvCQkJCQkJCQkJCQkJCQkJCS8qIGl0ZXJhdGUgKi8KLQl7Ci0JCWRldkNvdW50Kys7CQkJCQkJCQkJCQkJCS8qIGNvdW50IGRldmljZXMJCQkJCSAqLwotCQloR0RldmljZSA9IEdldE5leHREZXZpY2UgKGhHRGV2aWNlKTsJCQkJCQkvKiBuZXh0IGRldmljZSAqLwotCX0gd2hpbGUgKGhHRGV2aWNlKTsKLQkKLQlwU3lzR2FtbWFPdXQtPmRldkdhbW1hID0gKHByZWNEZXZpY2VHYW1tYSAqKSBOZXdQdHIgKHNpemVvZiAocHJlY0RldmljZUdhbW1hKSAqIGRldkNvdW50KTsgLyogYWxsb2NhdGUgZm9yIGFycmF5IG9mIHBvaW50ZXJzIHRvIGRldmljZSByZWNvcmRzICovCi0JaWYgKHBTeXNHYW1tYU91dCkKLQl7Ci0JCXBTeXNHYW1tYU91dC0+bnVtRGV2aWNlcyA9IGRldkNvdW50OwkJCQkJCS8qIHN0dWZmIGNvdW50ICovCi0JCQotCQlkZXZDb3VudCA9IDA7CQkJCQkJCQkJCQkJLyogcmVzZXQgaXRlcmF0aW9uICovCi0JCWhHRGV2aWNlID0gR2V0RGV2aWNlTGlzdCAoKTsKLQkJZG8KLQkJewotCQkJcFN5c0dhbW1hT3V0LT5kZXZHYW1tYSBbZGV2Q291bnRdID0gKHByZWNEZXZpY2VHYW1tYSkgTmV3UHRyIChzaXplb2YgKHJlY0RldmljZUdhbW1hKSk7CSAgLyogbmV3IGRldmljZSByZWNvcmQgKi8KLQkJCWlmIChwU3lzR2FtbWFPdXQtPmRldkdhbW1hIFtkZXZDb3VudF0pCQkJCQkvKiBpZiB3ZSBhY3R1YWxseSBhbGxvY2F0ZWQgbWVtb3J5ICovCi0JCQl7Ci0JCQkJcFN5c0dhbW1hT3V0LT5kZXZHYW1tYSBbZGV2Q291bnRdLT5oR0QgPSBoR0RldmljZTsJCQkJCQkJCQkJICAvKiBzdHVmZiBoYW5kbGUgKi8KLQkJCQlwU3lzR2FtbWFPdXQtPmRldkdhbW1hIFtkZXZDb3VudF0tPnBEZXZpY2VHYW1tYSA9IChHYW1tYVRibFB0cilHZXREZXZpY2VHYW1tYSAoaEdEZXZpY2UpOyAvKiBjb3B5IGdhbW1hIHRhYmxlICovCi0JCQl9Ci0JCQllbHNlCQkJCQkJCQkJCQkJCS8qIG90aGVyd2lzZSBkdW1wIHJlY29yZCBvbiBleGl0ICovCi0JCQkgZmFpbCA9IHRydWU7Ci0JCQlkZXZDb3VudCsrOwkJCQkJCQkJCQkJCS8qIG5leHQgZGV2aWNlICovCi0JCQloR0RldmljZSA9IEdldE5leHREZXZpY2UgKGhHRGV2aWNlKTsJCQkJCQkKLQkJfSB3aGlsZSAoaEdEZXZpY2UpOwotCX0KLQlpZiAoIWZhaWwpCQkJCQkJCQkJCQkJCQkvKiBpZiB3ZSBkaWQgbm90IGZhaWwgKi8KLQkJcmV0dXJuIChQdHIpIHBTeXNHYW1tYU91dDsJCQkJCQkJCQkvKiByZXR1cm4gcG9pbnRlciB0byBzdHJ1Y3R1cmUgKi8KLQllbHNlCi0JewotCQlEaXNwb3NlU3lzdGVtR2FtbWFzICgoUHRyICopICZwU3lzR2FtbWFPdXQpOwkJCQkJLyogb3RoZXJ3aXNlIGR1bXAgdGhlIGN1cnJlbnQgc3RydWN0dXJlcyAoZGlzcG9zZSBkb2VzIGVycm9yIGNoZWNraW5nKSAqLwotCQlyZXR1cm4gTlVMTDsJCQkJCQkJCQkJCQkvKiBjb3VsZCBub3QgY29tcGxldGUgKi8KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIFJlc3RvcmVEZXZpY2VHYW1tYSAoR0RIYW5kbGUgaEdELCBQdHIgcEdhbW1hVGFibGUpCi17Ci0JVkRTZXRFbnRyeVJlY29yZCBzZXRFbnRyaWVzUmVjOwotCVZER2FtbWFSZWNvcmQJZ2FtZVJlY1Jlc3RvcmU7Ci0JQ1RhYkhhbmRsZSAgICAgIGhDVGFiRGV2aWNlQ29sb3JzOwotCVB0cgkJCQljc1B0cjsKLQlPU0VycgkJCWVyciA9IG5vRXJyOwotCQotCWlmIChwR2FtbWFUYWJsZSkJCQkJCQkJCQkJCQkvKiBpZiB3ZSBoYXZlIGEgdGFibGUgdG8gcmVzdG9yZQkJCQkJCQkJICovCi0JewotCQlnYW1lUmVjUmVzdG9yZS5jc0dUYWJsZSA9IHBHYW1tYVRhYmxlOwkJCQkJCS8qIHNldHVwIHJlc3RvcmUgcmVjb3JkICovCi0JCWNzUHRyID0gKFB0cikgJmdhbWVSZWNSZXN0b3JlOwotCQllcnIgPSBDb250cm9sKCgqKmhHRCkuZ2RSZWZOdW0sIGNzY1NldEdhbW1hLCAoUHRyKSAmY3NQdHIpOwkvKiByZXN0b3JlIGdhbW1hICovCi0KLQkJaWYgKChub0VyciA9PSBlcnIpICYmICg4ID09ICgqKigqKmhHRCkuZ2RQTWFwKS5waXhlbFNpemUpKQkvKiBpZiBzdWNjZXNzZnVsIGFuZCBvbiBhbiA4IGJpdCBkZXZpY2UgKi8KLQkJewotCQkJaENUYWJEZXZpY2VDb2xvcnMgPSAoKiooKipoR0QpLmdkUE1hcCkucG1UYWJsZTsJCQkvKiBkbyBTZXRFbnRyaWVzIHRvIGZvcmNlIENMVVQgdXBkYXRlICovCi0JCQlzZXRFbnRyaWVzUmVjLmNzVGFibGUgPSAoQ29sb3JTcGVjICopICYoKipoQ1RhYkRldmljZUNvbG9ycykuY3RUYWJsZTsKLQkJCXNldEVudHJpZXNSZWMuY3NTdGFydCA9IDA7Ci0JCQlzZXRFbnRyaWVzUmVjLmNzQ291bnQgPSAoKipoQ1RhYkRldmljZUNvbG9ycykuY3RTaXplOwotCQkJY3NQdHIgPSAoUHRyKSAmc2V0RW50cmllc1JlYzsKLQkJCQotCQkJZXJyID0gQ29udHJvbCgoKipoR0QpLmdkUmVmTnVtLCBjc2NTZXRFbnRyaWVzLCAoUHRyKSAmY3NQdHIpOyAvKiBTZXRFbnRyaWVzIGluIENMVVQgKi8KLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgUmVzdG9yZVN5c3RlbUdhbW1hcyAoUHRyIHBTeXN0ZW1HYW1tYXMpCi17Ci0Jc2hvcnQgaTsKLQlwcmVjU3lzdGVtR2FtbWEgcFN5c0dhbW1hSW4gPSAocHJlY1N5c3RlbUdhbW1hKSBwU3lzdGVtR2FtbWFzOwotCWlmIChwU3lzR2FtbWFJbikKLQkJZm9yIChpID0gMDsgaSA8IHBTeXNHYW1tYUluLT5udW1EZXZpY2VzOyBpKyspCQkJLyogZm9yIGFsbCBkZXZpY2VzICovCi0JCQlSZXN0b3JlRGV2aWNlR2FtbWEgKHBTeXNHYW1tYUluLT5kZXZHYW1tYSBbaV0tPmhHRCwgKFB0cikgcFN5c0dhbW1hSW4tPmRldkdhbW1hIFtpXS0+cERldmljZUdhbW1hKTsJLyogcmVzdG9yZSBnYW1tYSAqLwotfQotCi1zdGF0aWMgUHRyIENyZWF0ZUVtcHR5R2FtbWFUYWJsZSAoc2hvcnQgY2hhbm5lbHMsIHNob3J0IGVudHJpZXMsIHNob3J0IGJpdHMpCi17Ci0JR2FtbWFUYmxQdHIJCXBUYWJsZUdhbW1hT3V0ID0gTlVMTDsKLQlzaG9ydAkJCXRhYmxlU2l6ZSwgZGF0YVdpZHRoOwotCi0JZGF0YVdpZHRoID0gKGJpdHMgKyA3KSAvIDg7CQkJCQkJCQkJCS8qIG51bWJlciBvZiBieXRlcyBwZXIgZW50cnkgKi8KLQl0YWJsZVNpemUgPSBzaXplb2YgKEdhbW1hVGJsKSArIChjaGFubmVscyAqIGVudHJpZXMgKiBkYXRhV2lkdGgpOwotCXBUYWJsZUdhbW1hT3V0ID0gKEdhbW1hVGJsUHRyKSBOZXdQdHJDbGVhciAodGFibGVTaXplKTsJCQkvKiBhbGxvY2F0ZSBuZXcgdGFiZWwgKi8KLQotCWlmIChwVGFibGVHYW1tYU91dCkJCQkJCQkJCQkJCQkvKiBpZiB3ZSBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkICovCi0JewotCQlwVGFibGVHYW1tYU91dC0+Z1ZlcnNpb24gPSAwOwkJCQkJCQkJLyogc2V0IHBhcmFtZXRlcnMgYmFzZWQgb24gaW5wdXQgKi8KLQkJcFRhYmxlR2FtbWFPdXQtPmdUeXBlID0gMDsKLQkJcFRhYmxlR2FtbWFPdXQtPmdGb3JtdWxhU2l6ZSA9IDA7Ci0JCXBUYWJsZUdhbW1hT3V0LT5nQ2hhbkNudCA9IGNoYW5uZWxzOwotCQlwVGFibGVHYW1tYU91dC0+Z0RhdGFDbnQgPSBlbnRyaWVzOwotCQlwVGFibGVHYW1tYU91dC0+Z0RhdGFXaWR0aCA9IGJpdHM7Ci0JfQotCXJldHVybiAoUHRyKXBUYWJsZUdhbW1hT3V0OwkJCQkJCQkJCQkvKiByZXR1cm4gd2hhdGV2ZXIgd2UgYWxsb2NhdGVkICovCi19Ci0KLXN0YXRpYyBCb29sZWFuIFNldERldmljZUdhbW1hUmFtcEdEIChHREhhbmRsZSBoR0QsIFB0ciBwUmFtcCkKLXsKLQlWRFNldEVudHJ5UmVjb3JkIHNldEVudHJpZXNSZWM7Ci0JVkRHYW1tYVJlY29yZAlnYW1lUmVjUmVzdG9yZTsKLQlHYW1tYVRibFB0cgkJcFRhYmxlR2FtbWFOZXc7Ci0JR2FtbWFUYmxQdHIJCXBUYWJsZUdhbW1hQ3VycmVudCA9IE5VTEw7Ci0JQ1RhYkhhbmRsZSAgICAgIGhDVGFiRGV2aWNlQ29sb3JzOwotCVB0cgkJCQljc1B0cjsKLQlPU0VycgkJCWVycjsKLQlzaG9ydCAJCQlkYXRhQml0cywgZW50cmllcywgY2hhbm5lbHMgPSAzOwkJCQkJCS8qIGZvcmNlIHRocmVlIGNoYW5uZWxzIGluIHRoZSBnYW1tYSB0YWJsZSAqLwotCQotCWlmIChwUmFtcCkJCQkJCQkJCQkJCQkJCQkJLyogZW5zdXJlIHBSYW1wIGlzIGFsbG9jYXRlZCAqLwotCXsKLQkJZXJyPSBHZXRHYW1tYVRhYmxlIChoR0QsICZwVGFibGVHYW1tYUN1cnJlbnQpOwkJCQkJCS8qIGdldCBwb2ludGVyIHRvIGN1cnJlbnQgdGFibGUgKi8KLQkJaWYgKChub0VyciA9PSBlcnIpICYmIHBUYWJsZUdhbW1hQ3VycmVudCkKLQkJewotCQkJZGF0YUJpdHMgPSBwVGFibGVHYW1tYUN1cnJlbnQtPmdEYXRhV2lkdGg7CQkJCQkJLyogdGFibGUgbXVzdCBoYXZlIHNhbWUgZGF0YSB3aWR0aCAqLwotCQkJZW50cmllcyA9IHBUYWJsZUdhbW1hQ3VycmVudC0+Z0RhdGFDbnQ7CQkJCQkJCS8qIHRhYmxlIG11c3QgYmUgc2FtZSBzaXplICovCi0JCQlwVGFibGVHYW1tYU5ldyA9IChHYW1tYVRibFB0cikgQ3JlYXRlRW1wdHlHYW1tYVRhYmxlIChjaGFubmVscywgZW50cmllcywgZGF0YUJpdHMpOyAvKiBvdXIgbmV3IHRhYmxlICovCi0JCQlpZiAocFRhYmxlR2FtbWFOZXcpCQkJCQkJCQkJCQkJLyogaWYgc3VjY2Vzc2Z1bCBmaWxsIHRhYmxlICovCi0JCQl7CQotCQkJCXVuc2lnbmVkIGNoYXIgKiBwR2FtbWFCYXNlID0gKHVuc2lnbmVkIGNoYXIgKikgJnBUYWJsZUdhbW1hTmV3LT5nRm9ybXVsYURhdGEgKyBwVGFibGVHYW1tYU5ldy0+Z0Zvcm11bGFTaXplOyAvKiBiYXNlIG9mIHRhYmxlICovCi0JCQkJaWYgKCgyNTYgPT0gZW50cmllcykgJiYgKDggPT0gZGF0YUJpdHMpKSAJCQkJCQkvKiBzaW1wbGUgY2FzZTogZGlyZWN0IG1hcHBpbmcgKi8KLQkJCQkJQmxvY2tNb3ZlICgoUHRyKXBSYW1wLCAoUHRyKXBHYW1tYUJhc2UsIGNoYW5uZWxzICogZW50cmllcyk7IC8qIG1vdmUgZXZlcnl0aGluZyAqLwotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCS8qIHRvdWdoIGNhc2UgaGFuZGxlIGVudHJ5LCBjaGFubmVsIGFuZCBkYXRhIHNpemUgZGlzcGFyaXRpZXMgKi8KLQkJCQl7Ci0JCQkJCXNob3J0IGluZGV4Q2hhbiwgaW5kZXhFbnRyeTsKLQkJCQkJc2hvcnQgYnl0ZXNQZXJFbnRyeSA9IChkYXRhQml0cyArIDcpIC8gODsgCQkJCS8qIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgZGV2aWNlIHRhYmxlIGVudHJpZXMgKi8KLQkJCQkJc2hvcnQgc2hpZnRSaWdodFZhbHVlID0gOCAtIGRhdGFCaXRzOwkJCQkJLyogbnVtYmVyIG9mIHJpZ2h0IHNoaWZ0cyByYW1wIC0+IGRldmljZSAqLwotCQkJCQlzaGlmdFJpZ2h0VmFsdWUgKz0gKChieXRlc1BlckVudHJ5IC0gMSkgKiA4KTsgIAkJCS8qIG11bHRpYnl0ZSBlbnRyaWVzIGFuZCB0aGUgbmVlZCB0byBtYXAgYSBieXRlIGF0IGEgdGltZSBtb3N0IHNpZy4gdG8gbGVhc3Qgc2lnLiAqLwotCQkJCQlmb3IgKGluZGV4Q2hhbiA9IDA7IGluZGV4Q2hhbiA8IGNoYW5uZWxzOyBpbmRleENoYW4rKykgLyogZm9yIGFsbCB0aGUgY2hhbm5lbHMgKi8KLQkJCQkJCWZvciAoaW5kZXhFbnRyeSA9IDA7IGluZGV4RW50cnkgPCBlbnRyaWVzOyBpbmRleEVudHJ5KyspIC8qIGZvciBhbGwgdGhlIGVudHJpZXMgKi8KLQkJCQkJCXsKLQkJCQkJCQlzaG9ydCBjdXJyZW50U2hpZnQgPSBzaGlmdFJpZ2h0VmFsdWU7CQkJLyogcmVzZXQgY3VycmVudCBiaXQgc2hpZnQgKi8KLQkJCQkJCQlsb25nIHRlbXAgPSAqKCh1bnNpZ25lZCBjaGFyICopcFJhbXAgKyAoaW5kZXhDaGFuIDw8IDgpICsgKGluZGV4RW50cnkgPDwgOCkgLyBlbnRyaWVzKTsgLyogZ2V0IGRhdGEgZnJvbSByYW1wICovCi0JCQkJCQkJc2hvcnQgaW5kZXhCeXRlOwotCQkJCQkJCWZvciAoaW5kZXhCeXRlID0gMDsgaW5kZXhCeXRlIDwgYnl0ZXNQZXJFbnRyeTsgaW5kZXhCeXRlKyspIC8qIGZvciBhbGwgYnl0ZXMgKi8KLQkJCQkJCQl7Ci0JCQkJCQkJCWlmIChjdXJyZW50U2hpZnQgPCAwKQkJCQkJCS8qIHNoaWZ0IGRhdGEgY29ycmVjdGx5IGZvciBjdXJyZW50IGJ5dGUgKi8KLQkJCQkJCQkJCSoocEdhbW1hQmFzZSsrKSA9IHRlbXAgPDwgLWN1cnJlbnRTaGlmdDsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJKihwR2FtbWFCYXNlKyspID0gdGVtcCA+PiBjdXJyZW50U2hpZnQ7Ci0JCQkJCQkJCWN1cnJlbnRTaGlmdCAtPSA4OwkJCQkJCQkvKiBpbmNyZW1lbnQgc2hpZnQgdG8gYWxpZ24gdG8gbmV4dCBsZXNzIHNpZy4gYnl0ZSAqLwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLyogc2V0IGdhbW1hICovCi0JCQkJZ2FtZVJlY1Jlc3RvcmUuY3NHVGFibGUgPSAoUHRyKSBwVGFibGVHYW1tYU5ldzsJCQkJLyogc2V0dXAgcmVzdG9yZSByZWNvcmQgKi8KLQkJCQljc1B0ciA9IChQdHIpICZnYW1lUmVjUmVzdG9yZTsKLQkJCQllcnIgPSBDb250cm9sKCgqKmhHRCkuZ2RSZWZOdW0sIGNzY1NldEdhbW1hLCAoUHRyKSAmY3NQdHIpOwkvKiByZXN0b3JlIGdhbW1hIChub3RlLCBkaXNwbGF5IGRyaXZlcnMgbWF5IGRlbGF5IHJldHVybmluZyBmcm9tIHRoaXMgdW50aWwgVkJMKSAqLwotCQkJCQotCQkJCWlmICgoOCA9PSAoKiooKipoR0QpLmdkUE1hcCkucGl4ZWxTaXplKSAmJiAobm9FcnIgPT0gZXJyKSkJLyogaWYgc3VjY2Vzc2Z1bCBhbmQgb24gYW4gOCBiaXQgZGV2aWNlICovCi0JCQkJewotCQkJCQloQ1RhYkRldmljZUNvbG9ycyA9ICgqKigqKmhHRCkuZ2RQTWFwKS5wbVRhYmxlOwkJCS8qIGRvIFNldEVudHJpZXMgdG8gZm9yY2UgQ0xVVCB1cGRhdGUgKi8KLQkJCQkJc2V0RW50cmllc1JlYy5jc1RhYmxlID0gKENvbG9yU3BlYyAqKSAmKCoqaENUYWJEZXZpY2VDb2xvcnMpLmN0VGFibGU7Ci0JCQkJCXNldEVudHJpZXNSZWMuY3NTdGFydCA9IDA7Ci0JCQkJCXNldEVudHJpZXNSZWMuY3NDb3VudCA9ICgqKmhDVGFiRGV2aWNlQ29sb3JzKS5jdFNpemU7Ci0JCQkJCWNzUHRyID0gKFB0cikgJnNldEVudHJpZXNSZWM7Ci0JCQkJCWVyciA9IENvbnRyb2woKCoqaEdEKS5nZFJlZk51bSwgY3NjU2V0RW50cmllcywgKFB0cikgJmNzUHRyKTsJLyogU2V0RW50cmllcyBpbiBDTFVUICovCi0JCQkJfQotCQkJCURpc3Bvc2VHYW1tYVRhYmxlICgoUHRyKSBwVGFibGVHYW1tYU5ldyk7CQkJCQkvKiBkdW1wIHRhYmxlICovCi0JCQkJaWYgKG5vRXJyID09IGVycikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQkJCQkJCQkJCQkJCQkJCQkJLyogc2V0IE5VTEwgZ2FtbWEgLT4gcmVzdWx0cyBpbiBsaW5lYXIgbWFwICovCi0JewotCQlnYW1lUmVjUmVzdG9yZS5jc0dUYWJsZSA9IChQdHIpIE5VTEw7CQkJCQkJCQkvKiBzZXR1cCByZXN0b3JlIHJlY29yZCAqLwotCQljc1B0ciA9IChQdHIpICZnYW1lUmVjUmVzdG9yZTsKLQkJZXJyID0gQ29udHJvbCgoKipoR0QpLmdkUmVmTnVtLCBjc2NTZXRHYW1tYSwgKFB0cikgJmNzUHRyKTsJCQkvKiByZXN0b3JlIGdhbW1hICovCi0JCQotCQlpZiAoKDggPT0gKCoqKCoqaEdEKS5nZFBNYXApLnBpeGVsU2l6ZSkgJiYgKG5vRXJyID09IGVycikpCQkJLyogaWYgc3VjY2Vzc2Z1bCBhbmQgb24gYW4gOCBiaXQgZGV2aWNlICovCi0JCXsKLQkJCWhDVGFiRGV2aWNlQ29sb3JzID0gKCoqKCoqaEdEKS5nZFBNYXApLnBtVGFibGU7CQkJCQkvKiBkbyBTZXRFbnRyaWVzIHRvIGZvcmNlIENMVVQgdXBkYXRlICovCi0JCQlzZXRFbnRyaWVzUmVjLmNzVGFibGUgPSAoQ29sb3JTcGVjICopICYoKipoQ1RhYkRldmljZUNvbG9ycykuY3RUYWJsZTsKLQkJCXNldEVudHJpZXNSZWMuY3NTdGFydCA9IDA7Ci0JCQlzZXRFbnRyaWVzUmVjLmNzQ291bnQgPSAoKipoQ1RhYkRldmljZUNvbG9ycykuY3RTaXplOwotCQkJY3NQdHIgPSAoUHRyKSAmc2V0RW50cmllc1JlYzsKLQkJCWVyciA9IENvbnRyb2woKCoqaEdEKS5nZFJlZk51bSwgY3NjU2V0RW50cmllcywgKFB0cikgJmNzUHRyKTsJLyogU2V0RW50cmllcyBpbiBDTFVUICovCi0JCX0KLQkJaWYgKG5vRXJyID09IGVycikKLQkJCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7CQkJCQkJCQkJCQkJCQkJLyogbWVtb3J5IGFsbG9jYXRpb24gb3IgZGV2aWNlIGNvbnRyb2wgZmFpbGVkIGlmIHdlIGdldCBoZXJlICovCi19Ci0KLS8qIGVuZCBvZiBBREMgR2FtbWEgUmFtcCBzdXBwb3J0IGNvZGUuLi4gKi8KLQotc3RhdGljIFB0ciBzeXN0ZW1HYW1tYVB0cjsKLQotdm9pZCBNYWNfUXVpdEdhbW1hKF9USElTKQotewotCWlmIChzeXN0ZW1HYW1tYVB0cikKLQl7Ci0JCVJlc3RvcmVTeXN0ZW1HYW1tYXMoc3lzdGVtR2FtbWFQdHIpOwotCQlEaXNwb3NlU3lzdGVtR2FtbWFzKCZzeXN0ZW1HYW1tYVB0cik7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzaGlmdGVkUmFtcFszICogMjU2XTsKLQotaW50IE1hY19TZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCkKLXsKLQlpbnQgaTsKLQlpZiAoIXN5c3RlbUdhbW1hUHRyKQotCQlzeXN0ZW1HYW1tYVB0ciA9IEdldFN5c3RlbUdhbW1hcygpOwotCWZvciAoaSA9IDA7IGkgPCAzICogMjU2OyBpKyspCi0JewotCQlzaGlmdGVkUmFtcFtpXSA9IHJhbXBbaV0gPj4gODsKLQl9Ci0KLQlpZiAoU2V0RGV2aWNlR2FtbWFSYW1wR0QoR2V0TWFpbkRldmljZSgpLCAoUHRyKSBzaGlmdGVkUmFtcCkpCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIC0xOwotfQotCi1pbnQgTWFjX0dldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKQotewotCWlmIChHZXREZXZpY2VHYW1tYVJhbXBHRChHZXRNYWluRGV2aWNlKCksIChQdHIpIHNoaWZ0ZWRSYW1wKSkKLQl7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgMyAqIDI1NjsgaSsrKQotCQl7Ci0JCQlyYW1wW2ldID0gc2hpZnRlZFJhbXBbaV0gPDwgODsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gLTE7Ci19Ci0KLSNlbmRpZiAgLyogU0RMX01BQ0NMQVNTSUNfR0FNTUFfU1VQUE9SVCAqLwotCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWN3bV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjd21fYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWRkODYxLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWN3bV9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIi4uL21hY3JvbS9TRExfcm9tdmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBNYWNfU2V0Q2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pOwotCi0vKgotICogVGhlcmUncyBubyBDYXJib25pemVkIGdhbW1hIHN1cHBvcnQgaW4gTWFjIE9TIFgsIHNpbmNlIFBCU3RhdHVzU3luYygpIGFuZAotICogIENvbnRyb2woKSBhcmVuJ3Qgc3VwcG9ydGVkIGluIE9TIFgncyBDYXJib25saWIuIFVzZSB0aGUgUXVhcnR6IGRyaXZlcgotICogIGluc3RlYWQuCi0gKi8KLSNkZWZpbmUgU0RMX01BQ0NMQVNTSUNfR0FNTUFfU1VQUE9SVCAoKGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKSkgPT0gMCkKLQotI2lmIFNETF9NQUNDTEFTU0lDX0dBTU1BX1NVUFBPUlQKLWV4dGVybiB2b2lkIE1hY19RdWl0R2FtbWEoX1RISVMpOwotZXh0ZXJuIGludCBNYWNfU2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApOwotZXh0ZXJuIGludCBNYWNfR2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApOwotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWFjZHNwL1NETF9kc3B2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNkc3AvU0RMX2RzcHZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkM2Y4YzQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNkc3AvU0RMX2RzcHZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotIFdyaXR0ZW4gYnkgRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KLQotIEltcGxlbWVudGF0aW9uIG5vdGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIEEgYml0IG9uIEdXb3JsZHMgaW4gVlJBTSBmcm9tIHRlY2hub3RlIDExODI6Ci0KLSBUaGVyZSBhcmUgdHdvIGltcG9ydGFudCB0aGluZ3MgdG8gbm90ZSBhYm91dCBHV29ybGQncyBhbGxvY2F0ZWQgaW4KLSBWUkFNLiBGaXJzdCwgdGhlIGJhc2UgYWRkcmVzcyByZXRyaWV2ZWQgdGhyb3VnaCBHZXRQaXhCYXNlQWRkciBvcgotIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgUGl4TWFwIHN0cnVjdHVyZSBjYW4gYmVjb21lIGludmFsaWQgYW55dGltZQotIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gVlJBTS4gVGhpcyBjYW4gb2NjdXIgZWl0aGVyIGJ5IGV4cGxpY2l0Ci0gYWxsb2NhdGlvbnMsIHN1Y2ggYXMgY2FsbHMgdG8gTmV3R1dvcmxkLCBvciBieSBpbXBsaWNpdCBvbmVzLCBzdWNoIGFzCi0gdGhvc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnRlcm5hbCB0ZXh0dXJlIGFsbG9jYXRpb24gb2YgT3BlbkdMLiBUaGUKLSBzdG9yZWQgcGl4ZWwgaW1hZ2VzIHRoZW1zZWx2ZXMgd2lsbCBzdGlsbCBiZSB2YWxpZCBidXQgbWF5IGhhdmUgYmVlbgotIG1vdmVkIGluIFZSQU0sIHRodXMgcmVuZGVyaW5nIGFueSBzdG9yZWQgYmFzZSBhZGRyZXNzZXMgaW52YWxpZC4KLSBZb3Ugc2hvdWxkIG5ldmVyIHN0b3JlIGFuIGltYWdlJ3MgYmFzZSBhZGRyZXNzIGZvciBsb25nZXIgdGhhbiBpcwotIG5lY2Vzc2FyeSBhbmQgZXNwZWNpYWxseSBuZXZlciBhY3Jvc3MgY2FsbHMgdG8gTmV3R1dvcmxkIG9yCi0gdGV4dHVyZS1jcmVhdGlvbiByb3V0aW5lcy4gCi0KLSBTZWNvbmRseSwgYW4gb2Zmc2NyZWVuIHBpeGVsIGltYWdlIGFsbG9jYXRlZCBpbiBWUkFNIGNhbiBiZQotIHB1cmdlZCBhdCBzeXN0ZW0gdGFzayB0aW1lIGJ5IHRoZSBkaXNwbGF5IGRyaXZlci4gVGhpcyBtZWFucyBhbnkKLSB0aW1lIHlvdXIgYXBwbGljYXRpb24geWllbGRzIHRpbWUgc3VjaCBieSBjYWxsaW5nIFdhaXROZXh0RXZlbnQgb3IKLSBTeXN0ZW1UYXNrIHlvdSBjYW4gbG9zZSB5b3VyIFZSQU0gR1dvcmxkIGNvbnRlbnRzLiBXaGlsZSB0aGlzCi0gaGFwcGVucyBpbmZyZXF1ZW50bHksIHVzdWFsbHkgYXNzb2NpYXRlZCB3aXRoIGRpc3BsYXkgcmVzb2x1dGlvbiBvcgotIHBpeGVsIGRlcHRoIGNoYW5nZXMgeW91IG11c3QgY29kZSBmb3IgdGhpcyBldmVudHVhbGl0eS4gVGhpcyBwdXJnZQotIGNhbiBvY2N1ciB3aGV0aGVyIG9yIG5vdCB0aGUgR1dvcmxkIGlzIGxvY2tlZCBvciBub3QuIEEgcmV0dXJuIHZhbHVlCi0gb2YgZmFsc2UgZnJvbSBMb2NrUGl4ZWxzLCBhIE5VTEwgcmV0dXJuIHZhbHVlIGZyb20gR2V0UGl4QmFzZUFkZHIKLSBvciBOVUxMIGluIHRoZSBiYXNlQWRkciBmaWVsZCBvZiB0aGUgUGl4TWFwIG1lYW4gdGhhdCB0aGUgcGl4ZWwKLSBpbWFnZSBoYXMgYmVlbiBwdXJnZWQuIFRvIHJlYWxsb2NhdGUgaXQgeW91IGNhbiBlaXRoZXIgY2FsbAotIFVwZGF0ZUdXb3JsZCBvciBEaXNwb3NlIHlvdXIgY3VycmVudCBHV29ybGQgdGhyb3VnaAotIERpc3Bvc2VHV29ybGQgYW5kIHJlYWxsb2NhdGUgaXQgdmlhIE5ld0dXb3JsZC4gRWl0aGVyIHdheSB5b3UgbXVzdAotIHRoZW4gcmVidWlsZCB0aGUgcGl4ZWwgaW1hZ2UuIAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBDdXJyZW50bHksIEkgZG9uJ3QgYWNjb3VudCBmb3IgKDEpLiBJbiBteSB0ZXN0aW5nLCBOZXdHV29ybGQgbmV2ZXIgaW52YWxpZGF0ZWQKLSAgb3RoZXIgZXhpc3RpbmcgR1dvcmxkcyBpbiBWUkFNLiBIb3dldmVyLCBJIGRvIGhhdmUgcHJvdGVjdGlvbiBmb3IgKDIpLgotICBOYW1lbHksIEkgYW0gdXNpbmcgR2V0T1NFdmVudCgpIGluc3RlYWQgb2YgV2FpdE5leHRFdmVudCgpIHNvIHRoYXQgdGhlcmUgYXJlIG5vCi0gIGNvbnRleHQgc3dpdGNoZXMgKHRoZSBhcHAgaG9ncyB0aGUgQ1BVKS4gRXZlbnR1YWxseSBhIGJvb2sta2VlcGluZyBzeXN0ZW0gc2hvdWxkCi0gIGJlIGNvZGVkIHRvIHRha2UgY2FyZSBvZiAoMSkgYW5kICgyKS4KLSAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBTeXN0ZW0gcmVxdWlyZW1lbnRzICgqIGRlbm90ZXMgb3B0aW9uYWwpOgotICAKLSAgMS4gRHJhd1Nwcm9ja2V0IDEuNy4zCi0gIDIuICpNYWNPUyA5IG9yIGxhdGVyIChidXQgKm5vdCogTWFjIE9TIFgpIGZvciBoYXJkd2FyZSBhY2NlbGVyYXRlZCBibGl0IC8gZmlsbAotICAzLiAqTWF5IGFsc28gcmVxdWlyZSBjZXJ0YWluIGdyYXBoaWNzIGhhcmR3YXJlIGZvciAoMikuIEkgdHJ1c3QgdGhhdCBhbGwgQXBwbGUgT0VNCi0gICAgIGhhcmR3YXJlIHdpbGwgd29yay4gVGhpcmQgcGFydHkgYWNjZWxlcmF0b3JzIG1heSB3b3JrIGlmIHRoZXkgaGF2ZSBRdWlja0RyYXcKLSAgICAgYWNjZWxlcmF0aW9uIGluIHRoZSBkcml2ZXJzIGFuZCB0aGUgZHJpdmVycyBoYXZlIGJlZW4gdXBkYXRlZCBmb3IgT1MgOS4gVGhlIGN1cnJlbnQKLSAgICAgVm9vZG9vIDMgZHJpdmVycyAoMS4wYjEyKSBkbyBub3Qgd29yay4KLSAgCi0gIENvZGluZyBzdWdnZXN0aW9uczoKLSAgCi0gIDEuIFVzZSBTRExfVXBkYXRlUmVjdHMgIQotICAKLSAgICBJZiBubyBRdWlja0RyYXcgYWNjZWxlcmF0aW9uIGlzIHByZXNlbnQsIGRvdWJsZS1idWZmZXJlZCBzdXJmYWNlcyB3aWxsIHVzZSBhIGJhY2sgYnVmZmVyCi0gICAgaW4gU3lzdGVtIG1lbW9yeS4gSSByZWNvbW1lbmQgeW91IHVzZSBTRExfVXBkYXRlUmVjdHMgd2l0aCBkb3VibGUtYnVmZmVyZWQgc3VyZmFjZXMKLSAgICBmb3IgYmVzdCBwZXJmb3JtYW5jZSBvbiB0aGVzZSBjYXJkcywgc2luY2UgdGhlIG92ZXJoZWFkIGlzIG5lYXJseSB6ZXJvIGZvciBWUkFNIGJhY2sgYnVmZmVyLgotICAgIAotICAyLiBMb2FkIG1vc3QtcmVzaWRlbnQgc3VyZmFjZXMgZmlyc3QuCi0gIAotICAgIElmIHlvdSBmaWxsIHVwIFZSQU0gb3IgQUdQIG1lbW9yeSwgdGhlcmUgaXMgbm8gY29udGluZ2VuY3kgZm9yIHB1cmdpbmcgdG8gbWFrZSByb29tIGZvciB0aGUgbmV4dCBvbmUuCi0gICAgVGhlcmVmb3JlLCB5b3Ugc2hvdWxkIGxvYWQgdGhlIHN1cmZhY2VzIHlvdSBwbGFuIHRvIHVzZSB0aGUgbW9zdCBmcmVxdWVudGx5IGZpcnN0LgotICAgIFNvb25lciBvciBsYXRlciwgSSB3aWxsIGNvZGUgTFJVIHJlcGxhY2VtZW50IHRvIGhlbHAgdGhpcy4KLSAgCi0gIFRPRE86Ci0gIFNvbWUga2luZCBvZiBwb3N0ZXJpemVkIG1vZGUgZm9yIHJlc29sdXRpb25zIDwgNjQweDQ4MC4KLSAgV2luZG93IHN1cHBvcnQgLyBmdWxsc2NyZWVuIHRvZ2dsZS4KLSAgRmlndXJlIG91dCBob3cgbXVjaCBWUkFNIGlzIGF2YWlsYWJsZS4gUHV0IGluIHZpZGVvLT5pbmZvLT52aWRlb19tZW0uCi0gIFRyYWNrIFZSQU0gdXNhZ2UuCi0gIAotICBCVUdTOgotICBJIGNhbid0IGNyZWF0ZSBhIGhhcmR3YXJlIHN1cmZhY2UgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgc2NyZWVuPyEgSG93IHRvIGZpeD8KLSAgCi0gIAotCi0gICBDT01QSUxFIE9QVElPTlM6Ci0gICAKLSAgIERTUF9UUllfQ0NfQU5EX0FBIC0gRGVmaW5lIGlmIHlvdSB3YW50IHRvIHRyeSBIV0EgY29sb3Ita2V5IGFuZCBhbHBoYSBibGl0dGVycwotICAgICAgICAgICAgICAgICAgICAgICBIVyBjb2xvci1rZXkgYmxpdHRpbmcgZ2l2ZXMgc3Vic3RhbnRpYWwgaW1wcm92ZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgaHcgYWxwaGEgaXMgbmVjay1hbmQtbmVjayB3aXRoIFNETCdzIHNvZnQgYml0dGVyLgotCi0gICBEU1BfTk9fU1lOQ19WQkwgICAtIERlZmluZSBmb3IgSFdBIGRvdWJsZS1idWZmZXJlZCBzdXJmYWNlczogZG9uJ3Qgc3luYwotICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG8tZmxpcCB0byBtb25pdG9yIHJlZHJhdy4KLQotICAgRFNQX05PX1NZTkNfT1BFTkdMIC0gRGVmaW5lIGZvciBPcGVuR0wgc3VyZmFjZXM6IGRvbid0IHN5bmMgYnVmZmVyIHN3YXAuIFN5bmNoaW5nIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgc3dhcCBtYXkgcmVzdWx0IGluIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGJ1dCBjYW4gZWxpbWluYXRlIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJpbmcgYXJ0aWZhY3RzLgotICAgQ0hBTkdFTE9HOgotICAgMDkvMTcvMDAgTG90cyBvZiBsaXR0bGUgdHdlYWtzLiBCdWlsZCBtb2RlbGlzdCBpbiByZXZlcnNlIG9yZGVyIHNvIGxhcmdlc3QgY29udGV4dHMKLSAgICAgICAgICAgIGxpc3QgZmlyc3QuIENvbXBhcmVkIHZhcmlvdXMgbWV0aG9kcyB3aXRoIFJPTSBtZXRob2RzIGFuZCBmaXhlZCByZXogc3dpdGNoCi0gICAgICAgICAgICBjcmFzaGluZyBidWcgaW4gR0wgVHJvbi4gKFdvb2hvbyEpCi0qLwotCi0jZGVmaW5lIERTUF9UUllfQ0NfQU5EX0FBCi0KLS8qICNkZWZpbmUgRFNQX05PX1NZTkNfVkJMICovCi0KLSNkZWZpbmUgRFNQX05PX1NZTkNfT1BFTkdMCi0KLQotI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQotI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KLSNpbmNsdWRlIDxEcmF3U3Byb2NrZXQvRHJhd1Nwcm9ja2V0Lmg+Ci0jZWxpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgKFVOSVZFUlNBTF9JTlRFUkZBQ0VTX1ZFUlNJT04gPiAweDAzMzUpCi0jaW5jbHVkZSA8Q2FyYm9uLmg+Ci0jaW5jbHVkZSA8RHJhd1Nwcm9ja2V0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPExvd01lbS5oPgotI2luY2x1ZGUgPEdlc3RhbHQuaD4KLSNpbmNsdWRlIDxEZXZpY2VzLmg+Ci0jaW5jbHVkZSA8RGlza0luaXQuaD4KLSNpbmNsdWRlIDxRRE9mZnNjcmVlbi5oPgotI2luY2x1ZGUgPERyYXdTcHJvY2tldC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfc3lzd20uaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfYmxpdC5oIgotI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgotI2luY2x1ZGUgIlNETF9kc3B2aWRlby5oIgotI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjZ2xfYy5oIgotI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjd21fYy5oIgotI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjbW91c2VfYy5oIgotI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjZXZlbnRzX2MuaCIKLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IERTcF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKipEU3BfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqRFNwX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgRFNwX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAotCQkJIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyBpbnQgRFNwX0NyZWF0ZVBhbGV0dGUoX1RISVMpOwotc3RhdGljIGludCBEU3BfRGVzdHJveVBhbGV0dGUoX1RISVMpOwotc3RhdGljIHZvaWQgRFNwX1ZpZGVvUXVpdChfVEhJUyk7Ci0KLXN0YXRpYyBpbnQgRFNwX0dldE1haW5EZXZpY2UgKF9USElTLCBHREhhbmRsZSAqZGV2aWNlKTsKLXN0YXRpYyB2b2lkIERTcF9Jc0hXQXZhaWxhYmxlIChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKLXN0YXRpYyB2b2lkIERTcF9EU3BVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnNkbF9yZWN0cyk7Ci1zdGF0aWMgdm9pZCBEU3BfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpzZGxfcmVjdHMpOwotCi0vKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBEU3BfU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVJbnQ4IGFscGhhKTsKLXN0YXRpYyBpbnQgRFNwX1NldEhXQ29sb3JLZXkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIga2V5KTsKLXN0YXRpYyBpbnQgRFNwX05ld0hXU3VyZmFjZShfVEhJUywgQ0dyYWZQdHIgKnBvcnQsIGludCBkZXB0aCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLXN0YXRpYyBpbnQgRFNwX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IERTcF9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBEU3BfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBEU3BfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBEU3BfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBEU3BfQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkZXN0KTsKLXN0YXRpYyBpbnQgRFNwX0hXQWNjZWxCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpOwotc3RhdGljIGludCBEU3BfRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcik7Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0gICBzdGF0aWMgdm9pZCBEU3BfR0xfU3dhcEJ1ZmZlcnMgKF9USElTKTsKLSNlbmRpZgotCi0jaWYgISBUQVJHRVRfQVBJX01BQ19DQVJCT04KLQotICAgICNkZWZpbmUgR2V0UG9ydFBpeFJvd0J5dGVzKHgpICAoICgqKHgtPnBvcnRQaXhNYXApKS0+cm93Qnl0ZXMgKQotICAgI2RlZmluZSBHZXRHRGV2UGl4TWFwKHgpICgoKiooeCkpLmdkUE1hcCkgICAKLSAgICNkZWZpbmUgR2V0UG9ydFBpeE1hcCh4KSAoKCooeCkpLnBvcnRQaXhNYXApCi0gICAKLSAgICNkZWZpbmUgR2V0UGl4RGVwdGgoeSkgICAgKCgqKih5KSkucGl4ZWxTaXplKQotICAgLy8jZGVmaW5lIEdldFBpeFJvd0J5dGVzKHkpICgoKiooeSkpLnJvd0J5dGVzKQotICAgLy8jZGVmaW5lIEdldFBpeEJhc2VBZGRyKHkpICgoKiooeSkpLmJhc2VBZGRyKQotICAgI2RlZmluZSBHZXRQaXhDVGFiKHkpICAgICAoKCoqKHkpKS5wbVRhYmxlKQotICAgICNkZWZpbmUgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHgpICgmKCgoR3JhZlB0cikoeCkpLT5wb3J0Qml0cykpCi0gICAKLSNlbHNlCi0gICAgI2RlZmluZSBHZXRQb3J0UGl4Um93Qnl0ZXMoeCkgKEdldFBpeFJvd0J5dGVzKEdldFBvcnRQaXhNYXAoeCkpICkKLSAgICAjZGVmaW5lIEdldEdEZXZQaXhNYXAoeCkgKCgqKih4KSkuZ2RQTWFwKQotCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgewotCi0gIEdXb3JsZFB0ciBvZmZzY3JlZW47ICAgIC8vIG9mZnNjcmVlbiBnd29ybGQgaW4gVlJBTSBvciBBR1AKLSAgCi0gICNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQQotICAgIEdXb3JsZFB0ciBtYXNrOyAgICAgICAgIC8vIHRyYW5zcGFyZW50IG1hc2sKLSAgICBSR0JDb2xvciAgYWxwaGE7ICAgICAgICAvLyBhbHBoYSBjb2xvcgotICAgIFJHQkNvbG9yICB0cmFuczsgICAgICAgIC8vIHRyYW5zcGFyZW50IGNvbG9yCi0gICNlbmRpZgotICAKLX0gcHJpdmF0ZV9od2RhdGE7Ci0KLXR5cGVkZWYgcHJpdmF0ZV9od2RhdGEgcHJpdmF0ZV9zd2RhdGEgOyAvKiBoYXZlIHNhbWUgZmllbGRzICovCi0KLS8qIE1hY2ludG9zaCB0b29sYm94IGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBpbnQgRFNwX0F2YWlsYWJsZSh2b2lkKQotewotCS8qIENoZWNrIGZvciBEcmF3U3Byb2NrZXQgKi8KLSNpZiAhIFRBUkdFVF9BUElfTUFDX09TWAotCS8qIFRoaXMgY2hlY2sgaXMgb25seSBtZWFuaW5nZnVsIGlmIHlvdSB3ZWFrLWxpbmsgRHJhd1Nwcm9ja2V0TGliICovICAKLQlyZXR1cm4gKChQdHIpRFNwU3RhcnR1cCAhPSAoUHRyKWtVbnJlc29sdmVkQ0ZyYWdTeW1ib2xBZGRyZXNzKTsKLSNlbHNlCi0JcmV0dXJuIDE7IC8vIERyYXdTcHJvY2tldC5mcmFtZXdvcmsgZG9lc24ndCBoYXZlIGl0IGFsbCwgYnV0IGl0J3MgdGhlcmUKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBEU3BfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQotewotCS8qIC1kdy0gdGFraW5nIG5vIGNoYW5jZXMgd2l0aCBudWxsIHBvaW50ZXJzICovCi0JaWYgKGRldmljZSkgewotCQkKLSAgIAlpZiAoZGV2aWNlLT5oaWRkZW4pIHsKLSAgIAkgICAKLSAgIAkgICBpZiAoZGV2aWNlLT5oaWRkZW4tPmRzcGluZm8pCi0JICAgICAgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4tPmRzcGluZm8pOwotICAgCSAgIAotICAgCSAgIFNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLSAgIAl9Ci0JICAgU0RMX2ZyZWUoZGV2aWNlKTsJCi0JfQotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpEU3BfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotCWlmICggZGV2aWNlICkgewotCQlTRExfbWVtc2V0KGRldmljZSwgMCwgc2l6ZW9mICgqZGV2aWNlKSk7Ci0JCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQkgICAgaWYgKGRldmljZS0+aGlkZGVuKQotCSAgICAgICAgU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgc2l6ZW9mICggKihkZXZpY2UtPmhpZGRlbikgKSApOwotCX0KLQlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCQotCQlpZiAoIGRldmljZSApIHsKLQkJCQotCQkJaWYgKGRldmljZS0+aGlkZGVuKQotCQkJCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsJCQkKLQkJCQotCQkJU0RMX2ZyZWUoZGV2aWNlKTsKLQkJfQotCQkKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQkKLQkvKiBBbGxvY2F0ZSBEcmF3U3Byb2NrZXQgaW5mb3JtYXRpb24gKi8KLQlkZXZpY2UtPmhpZGRlbi0+ZHNwaW5mbyA9IChzdHJ1Y3QgRFNwSW5mbyAqKVNETF9tYWxsb2MoCi0JCQkJCShzaXplb2YgKmRldmljZS0+aGlkZGVuLT5kc3BpbmZvKSk7Ci0JaWYgKCBkZXZpY2UtPmhpZGRlbi0+ZHNwaW5mbyA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCQlTRExfZnJlZShkZXZpY2UpOwotCQlyZXR1cm4oMCk7Ci0JfQotCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4tPmRzcGluZm8sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuLT5kc3BpbmZvKSk7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JZGV2aWNlLT5WaWRlb0luaXQgICAgICAgPSBEU3BfVmlkZW9Jbml0OwotCWRldmljZS0+TGlzdE1vZGVzICAgICAgID0gRFNwX0xpc3RNb2RlczsKLQlkZXZpY2UtPlNldFZpZGVvTW9kZSAgICA9IERTcF9TZXRWaWRlb01vZGU7Ci0JZGV2aWNlLT5TZXRDb2xvcnMgICAgICAgPSBEU3BfU2V0Q29sb3JzOwotCWRldmljZS0+VXBkYXRlUmVjdHMgICAgID0gTlVMTDsKLQlkZXZpY2UtPlZpZGVvUXVpdCAgICAgICA9IERTcF9WaWRlb1F1aXQ7Ci0JZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSAgPSBEU3BfQWxsb2NIV1N1cmZhY2U7Ci0JZGV2aWNlLT5DaGVja0hXQmxpdCAgICAgPSBOVUxMOwotCWRldmljZS0+RmlsbEhXUmVjdCAgICAgID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQ29sb3JLZXkgICA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRIV0FscGhhICAgICAgPSBOVUxMOwotCWRldmljZS0+TG9ja0hXU3VyZmFjZSAgID0gRFNwX0xvY2tIV1N1cmZhY2U7Ci0JZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBEU3BfVW5sb2NrSFdTdXJmYWNlOwotCWRldmljZS0+RmxpcEhXU3VyZmFjZSAgID0gRFNwX0ZsaXBIV1N1cmZhY2U7Ci0JZGV2aWNlLT5GcmVlSFdTdXJmYWNlICAgPSBEU3BfRnJlZUhXU3VyZmFjZTsKLSNpZiBTRExfTUFDQ0xBU1NJQ19HQU1NQV9TVVBQT1JUCi0JZGV2aWNlLT5TZXRHYW1tYVJhbXAgICAgPSBNYWNfU2V0R2FtbWFSYW1wOwotCWRldmljZS0+R2V0R2FtbWFSYW1wICAgID0gTWFjX0dldEdhbW1hUmFtcDsKLSNlbmRpZgotI2lmIFNETF9WSURFT19PUEVOR0wKLQlkZXZpY2UtPkdMX01ha2VDdXJyZW50ICA9IE1hY19HTF9NYWtlQ3VycmVudDsKLQlkZXZpY2UtPkdMX1N3YXBCdWZmZXJzICA9IERTcF9HTF9Td2FwQnVmZmVyczsKLQlkZXZpY2UtPkdMX0xvYWRMaWJyYXJ5ID0gTWFjX0dMX0xvYWRMaWJyYXJ5OwotCWRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBNYWNfR0xfR2V0UHJvY0FkZHJlc3M7Ci0jZW5kaWYKLQlkZXZpY2UtPlNldENhcHRpb24gPSBOVUxMOwotCWRldmljZS0+U2V0SWNvbiA9IE5VTEw7Ci0JZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKLQlkZXZpY2UtPkdyYWJJbnB1dCA9IE5VTEw7Ci0JZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOwotCWRldmljZS0+RnJlZVdNQ3Vyc29yICAgID0gTWFjX0ZyZWVXTUN1cnNvcjsKLQlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yICA9IE1hY19DcmVhdGVXTUN1cnNvcjsKLQlkZXZpY2UtPlNob3dXTUN1cnNvciAgICA9IE1hY19TaG93V01DdXJzb3I7Ci0JZGV2aWNlLT5XYXJwV01DdXJzb3IgICAgPSBNYWNfV2FycFdNQ3Vyc29yOwotCWRldmljZS0+SW5pdE9TS2V5bWFwICAgID0gTWFjX0luaXRPU0tleW1hcDsKLQlkZXZpY2UtPlB1bXBFdmVudHMgICAgICA9IE1hY19QdW1wRXZlbnRzOwotCQotCWRldmljZS0+R3JhYklucHV0ICAgICAgPSBOVUxMOwotCWRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBOVUxMOwotCQotCWRldmljZS0+ZnJlZSA9IERTcF9EZWxldGVEZXZpY2U7Ci0KLQlyZXR1cm4gZGV2aWNlOwotfQotCi1WaWRlb0Jvb3RTdHJhcCBEU3BfYm9vdHN0cmFwID0gewotCSJEU3AiLCAiTWFjT1MgRHJhd1Nwcm9ja2V0IiwKLQlEU3BfQXZhaWxhYmxlLCBEU3BfQ3JlYXRlRGV2aWNlCi19OwotCi0vKiBVc2UgRFNwL0Rpc3BsYXkgTWFuYWdlciB0byBidWlsZCBtb2RlIGxpc3QgZm9yIGdpdmVuIHNjcmVlbiAqLwotc3RhdGljIFNETF9SZWN0KiogIERTcF9CdWlsZE1vZGVMaXN0IChjb25zdCBHREhhbmRsZSBnRGV2aWNlLCBpbnQgKmRpc3BsYXlXaWR0aCwgaW50ICpkaXNwbGF5SGVpZ2h0KQotewotCURTcENvbnRleHRBdHRyaWJ1dGVzICBhdHRyaWJ1dGVzOwotCURTcENvbnRleHRSZWZlcmVuY2UgICBjb250ZXh0OwotCURpc3BsYXlJRFR5cGUgICAgICAgICBkaXNwbGF5SUQ7Ci0JU0RMX1JlY3QgdGVtcF9saXN0IFsxNl07Ci0JU0RMX1JlY3QgKiptb2RlX2xpc3Q7Ci0JaW50IHdpZHRoLCBoZWlnaHQsIGksIGo7Ci0gICAgICAgIAotICAgICAgICAjaWYgVEFSR0VUX0FQSV9NQUNfT1NYCQkKLQkKLSAgICAgICAgZGlzcGxheUlEID0gMDsKLSAgICAgICAgCi0gICAgICAgICNlbHNlCi0gICAgICAgIC8qIEFzayBEaXNwbGF5IE1hbmFnZXIgZm9yIGludGVnZXIgaWQgb2Ygc2NyZWVuIGRldmljZSAqLwotCWlmICggRE1HZXREaXNwbGF5SURCeUdEZXZpY2UgKGdEZXZpY2UsICZkaXNwbGF5SUQsIFNETF9UUlVFKSAhPSBub0VyciApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSNlbmRpZgotCS8qIEdldCB0aGUgZmlyc3QgcG9zc2libGUgRFNwIGNvbnRleHQgb24gdGhpcyBkZXZpY2UgKi8KLQlpZiAoIERTcEdldEZpcnN0Q29udGV4dCAoZGlzcGxheUlELCAmY29udGV4dCkgIT0gbm9FcnIgKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlpZiAoIERTcENvbnRleHRfR2V0QXR0cmlidXRlcyAoY29udGV4dCwgJmF0dHJpYnV0ZXMpICE9IG5vRXJyICkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkqZGlzcGxheVdpZHRoID0gYXR0cmlidXRlcy5kaXNwbGF5V2lkdGg7Ci0JKmRpc3BsYXlIZWlnaHQgPSBhdHRyaWJ1dGVzLmRpc3BsYXlIZWlnaHQ7Ci0JCQkKLQlmb3IgKCBpID0gMDsgaSA8IFNETF9hcnJheXNpemUodGVtcF9saXN0KTsgaSsrICkgewotCQl3aWR0aCAgPSBhdHRyaWJ1dGVzLmRpc3BsYXlXaWR0aDsKLQkJaGVpZ2h0ID0gYXR0cmlidXRlcy5kaXNwbGF5SGVpZ2h0OwotCQkKLQkJdGVtcF9saXN0IFtpXS54ID0gMCB8IGF0dHJpYnV0ZXMuZGlzcGxheUJlc3REZXB0aDsKLQkJdGVtcF9saXN0IFtpXS55ID0gMDsKLQkJdGVtcF9saXN0IFtpXS53ID0gd2lkdGg7Ci0JCXRlbXBfbGlzdCBbaV0uaCA9IGhlaWdodDsKLQkKLQkJLyogRFNwIHdpbGwgcmVwb3J0IG1hbnkgZGlmZmVyZW50IGNvbnRleHRzIHdpdGggdGhlIHNhbWUgd2lkdGggYW5kIGhlaWdodC4gKi8KLQkJLyogVGhleSB3aWxsIGRpZmZlciBpbiBiaXQgZGVwdGggYW5kIHJlZnJlc2ggcmF0ZS4gKi8KLQkJLyogV2Ugd2lsbCBpZ25vcmUgdGhlbSB1bnRpbCB3ZSByZWFjaCBvbmUgd2l0aCBhIGRpZmZlcmVudCB3aWR0aC9oZWlnaHQgKi8KLQkJLyogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjb250ZXh0cyB0byBsb29rIGF0LCB3ZSB3aWxsIHF1aXQgYnVpbGRpbmcgdGhlIGxpc3QqLwotCQl3aGlsZSAoIHdpZHRoID09IGF0dHJpYnV0ZXMuZGlzcGxheVdpZHRoICYmIGhlaWdodCA9PSBhdHRyaWJ1dGVzLmRpc3BsYXlIZWlnaHQgKSB7Ci0JCQotCQkJT1NTdGF0dXMgZXJyID0gRFNwR2V0TmV4dENvbnRleHQgKGNvbnRleHQsICZjb250ZXh0KTsKLQkJCWlmIChlcnIgIT0gbm9FcnIpCi0JCQkJaWYgKGVyciA9PSBrRFNwQ29udGV4dE5vdEZvdW5kRXJyKQotCQkJCQlnb3RvIGRvbmU7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gTlVMTDsJCQotCQkJCi0JCQlpZiAoIERTcENvbnRleHRfR2V0QXR0cmlidXRlcyAoY29udGV4dCwgJmF0dHJpYnV0ZXMpICE9IG5vRXJyICkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCQkKLQkJCXRlbXBfbGlzdCBbaV0ueCB8PSBhdHRyaWJ1dGVzLmRpc3BsYXlCZXN0RGVwdGg7Ci0JCX0KLQl9Ci1kb25lOgotCWkrKzsgICAgICAgICAgLyogaSB3YXMgbm90IGluY3JlbWVudGVkIGJlZm9yZSBraWNraW5nIG91dCBvZiB0aGUgbG9vcCAqLwotCQotCW1vZGVfbGlzdCA9IChTRExfUmVjdCoqKSBTRExfbWFsbG9jIChzaXplb2YgKFNETF9SZWN0KikgKiAoaSsxKSk7Ci0JaWYgKG1vZGVfbGlzdCkgewotCQotCSAgIC8qIC1kdy0gbmV3IHN0dWZmOiBidWlsZCBpbiByZXZlcnNlIG9yZGVyIHNvIGxhcmdlc3Qgc2l6ZXMgbGlzdCBmaXJzdCAqLwotCQlmb3IgKGogPSBpLTE7IGogPj0gMDsgai0tKSB7Ci0JCQltb2RlX2xpc3QgW2pdID0gKFNETF9SZWN0KikgU0RMX21hbGxvYyAoc2l6ZW9mIChTRExfUmVjdCkpOwkKLQkJCWlmIChtb2RlX2xpc3QgW2pdKQotCQkJCVNETF9tZW1jcHkgKG1vZGVfbGlzdCBbal0sICYodGVtcF9saXN0IFtqXSksIHNpemVvZiAoU0RMX1JlY3QpKTsKLQkJCWVsc2UgewotCQkJCVNETF9PdXRPZk1lbW9yeSAoKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQltb2RlX2xpc3QgW2ldID0gTlVMTDsJCS8qIGFwcGVuZCBudWxsIHRvIHRoZSBlbmQgKi8KLQl9Ci0JZWxzZSB7Ci0JCVNETF9PdXRPZk1lbW9yeSAoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQkKLQlyZXR1cm4gbW9kZV9saXN0OwotfQotCi1zdGF0aWMgdm9pZCBEU3BfSXNIV0F2YWlsYWJsZSAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLSAgLyogCi0gICAgIFZSQU0gR1dvcmxkcyBhcmUgb25seSBhdmFpbGFibGUgb24gT1MgOSBvciBsYXRlci4KLSAgICAgRXZlbiB3aXRoIE9TIDksIHNvbWUgZGlzcGxheSBkcml2ZXJzIHdvbid0IHN1cHBvcnQgaXQsIAotICAgICBzbyB3ZSBjcmVhdGUgYSB0ZXN0IEdXb3JsZCBhbmQgY2hlY2sgZm9yIGVycm9ycy4gCi0gICovCi0KLSAgbG9uZyB2ZXJzaW9uU3lzdGVtOwotCi0gIGRzcF92cmFtX2F2YWlsYWJsZSA9IFNETF9GQUxTRTsKLSAgZHNwX2FncF9hdmFpbGFibGUgID0gU0RMX0ZBTFNFOwotICAKLSAgR2VzdGFsdCAoJ3N5c3YnLCAmdmVyc2lvblN5c3RlbSk7Ci0gIGlmICgweDAwMDAwODYwIDwgKHZlcnNpb25TeXN0ZW0gJiAweDAwMDBGRkZGKSkgewotICAgIAotICAgIEdXb3JsZFB0ciBvZmZzY3JlZW47Ci0gICAgT1NTdGF0dXMgIGVycjsKLSAgICBSZWN0ICAgICAgYm91bmRzOwotICAgIAotICAgIFNldFJlY3QgKCZib3VuZHMsIDAsIDAsIDMyMCwgMjQwKTsKLSAgICAKLSNpZiB1c2VEaXN0YW50SGR3ck1lbSAmJiB1c2VMb2NhbEhkd3JNZW0KLSAgICBlcnIgPSBOZXdHV29ybGQgKCZvZmZzY3JlZW4sIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCwgJmJvdW5kcywgTlVMTCwgU0RMX0Rpc3BsYXksIHVzZURpc3RhbnRIZHdyTWVtIHwgbm9OZXdEZXZpY2UpOwotICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKLSAgICAgIGRzcF92cmFtX2F2YWlsYWJsZSA9IFNETF9UUlVFOwotICAgICAgRGlzcG9zZUdXb3JsZCAob2Zmc2NyZWVuKTsKLSAgICB9Ci0JCi0gICAgZXJyID0gTmV3R1dvcmxkICgmb2Zmc2NyZWVuLCB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwsICZib3VuZHMsIE5VTEwsIFNETF9EaXNwbGF5LCB1c2VMb2NhbEhkd3JNZW0gfCBub05ld0RldmljZSk7Ci0gICAgaWYgKGVyciA9PSBub0VycikgewotICAgICAgRGlzcG9zZUdXb3JsZCAob2Zmc2NyZWVuKTsKLSAgICAgIGRzcF9hZ3BfYXZhaWxhYmxlID0gU0RMX1RSVUU7Ci0gICAgfQotI2VuZGlmCi0gIH0KLX0KLQotc3RhdGljIGludCBEU3BfR2V0TWFpbkRldmljZSAoX1RISVMsIEdESGFuZGxlICpkZXZpY2UpCi17Ci0gICAgCi0jaWYgVEFSR0VUX0FQSV9NQUNfT1NYCi0gICAgICAgIC8qIERTcFVzZXJTZWxlY3RDb250ZXh0IG5vdCBhdmFpbGFibGUgb24gT1MgWCAqLwotICAgICAgICAqZGV2aWNlID0gR2V0TWFpbkRldmljZSgpOwotICAgICAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgICAgIAotCURTcENvbnRleHRBdHRyaWJ1dGVzIGF0dHJpYjsKLQlEU3BDb250ZXh0UmVmZXJlbmNlICBjb250ZXh0OwotCURpc3BsYXlJRFR5cGUgICAgICAgIGRpc3BsYXlfaWQ7Ci0JR0RIYW5kbGUgICAgICAgICAgICAgbWFpbl9kZXZpY2U7Ci0JR0RIYW5kbGUgICAgICAgICAgICAgZGV2aWNlX2xpc3Q7Ci0JCi0JZGV2aWNlX2xpc3QgPSBHZXREZXZpY2VMaXN0ICgpOwotCW1haW5fZGV2aWNlID0gR2V0TWFpbkRldmljZSAoKTsKLQkKLQkvKiBRdWljayBjaGVjayB0byBhdm9pZCBzbG93ZXIgbWV0aG9kIHdoZW4gb25seSBvbmUgZGlzcGxheSBleGlzdHMgKi8KLQlpZiAoICgqKmRldmljZV9saXN0KS5nZE5leHRHRCA9PSBOVUxMICkgewotCSAgKmRldmljZSA9IG1haW5fZGV2aWNlOwotCSAgcmV0dXJuIDA7Ci0JfQotCQkKLQlTRExfbWVtc2V0ICgmYXR0cmliLCAwLCBzaXplb2YgKERTcENvbnRleHRBdHRyaWJ1dGVzKSk7Ci0KLQkvKiBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBob3BlZnVsbHkgc3VwcG9ydGVkIG9uIGFsbCBkZXZpY2VzLi4uKi8KLQlhdHRyaWIuZGlzcGxheVdpZHRoICAgICAgICAgPSA2NDA7Ci0JYXR0cmliLmRpc3BsYXlIZWlnaHQgICAgICAgID0gNDgwOwotCWF0dHJpYi5kaXNwbGF5QmVzdERlcHRoICAgICA9IDg7Ci0JYXR0cmliLmJhY2tCdWZmZXJCZXN0RGVwdGggID0gODsKLQlhdHRyaWIuZGlzcGxheURlcHRoTWFzayAgICAgPSBrRFNwRGVwdGhNYXNrX0FsbDsKLQlhdHRyaWIuYmFja0J1ZmZlckRlcHRoTWFzayAgPSBrRFNwRGVwdGhNYXNrX0FsbDsKLQlhdHRyaWIuY29sb3JOZWVkcyAgICAgICAgICAgPSBrRFNwQ29sb3JOZWVkc19SZXF1aXJlOwotCWF0dHJpYi5wYWdlQ291bnQgICAgICAgICAgICA9IDE7Ci0JCQkgCi0JaWYgKG5vRXJyICE9IERNR2V0RGlzcGxheUlEQnlHRGV2aWNlIChtYWluX2RldmljZSwgJmRpc3BsYXlfaWQsIFNETF9GQUxTRSkpIHsKLQkJU0RMX1NldEVycm9yICgiRGlzcGxheSBNYW5hZ2VyIGNvdWxkbid0IGFzc29jaWF0ZSBHRGV2aWNlIHdpdGggYSBEaXNwbGF5IElEIik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQkKLQkvKiBQdXQgdXAgZGlhbG9nIG9uIG1haW4gZGlzcGxheSB0byBzZWxlY3Qgd2hpY2ggZGlzcGxheSB0byB1c2UgKi8KLQlpZiAobm9FcnIgIT0gRFNwVXNlclNlbGVjdENvbnRleHQgKCZhdHRyaWIsIGRpc3BsYXlfaWQsIE5VTEwsICZjb250ZXh0KSkgewotCQlTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGRuJ3QgY3JlYXRlIGEgY29udGV4dCIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0gICAgICAgICAKLQlpZiAobm9FcnIgIT0gRFNwQ29udGV4dF9HZXREaXNwbGF5SUQgKGNvbnRleHQsICZkaXNwbGF5X2lkKSkgewotCQlTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGRuJ3QgZ2V0IGRpc3BsYXkgSUQiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotICAKLQlpZiAobm9FcnIgIT0gRE1HZXRHRGV2aWNlQnlEaXNwbGF5SUQgIChkaXNwbGF5X2lkLCAmbWFpbl9kZXZpY2UsIFNETF9GQUxTRSkpIHsKLQkJU0RMX1NldEVycm9yICgiRGlzcGxheSBNYW5hZ2VyIGNvdWxkbid0IGFzc29jaWF0ZSBEaXNwbGF5IElEIHdpdGggR0RldmljZSIpOwotCQlyZXR1cm4gKC0xKTsgIAotCX0KLQotCSpkZXZpY2UgPSBtYWluX2RldmljZTsKLQlyZXR1cm4gKDApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQgRFNwX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotCU51bVZlcnNpb24gZHNwX3ZlcnNpb24gPSB7IDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQkKLSNpZiBVTklWRVJTQUxfSU5URVJGQUNFU19WRVJTSU9OID4gMHgwMzIwCi0JZHNwX3ZlcnNpb24gPSBEU3BHZXRWZXJzaW9uICgpOwotI2VuZGlmCi0JCi0JaWYgKCAgKGRzcF92ZXJzaW9uLm1ham9yUmV2ID09IDEgJiYgZHNwX3ZlcnNpb24ubWlub3JBbmRCdWdSZXYgPCAweDczKSB8fAotCSAgICAgIChkc3BfdmVyc2lvbi5tYWpvclJldiA8IDEpICApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAKLQkgICAvKiBTdGFuZGFyZEFsZXJ0IChrQWxlcnRTdG9wQWxlcnQsICJccEVycm9yISIsIAotCSAgICAgICAgICAgICAgICAiXHBJIG5lZWQgRHJhd1Nwcm9ja2V0IDEuNy4zIG9yIGxhdGVyIVxuIgotCSAgICAgICAgICAgICAgICAgICJZb3UgY2FuIGZpbmQgYSBuZXdlciB2ZXJzaW9uIGF0IGh0dHA6Ly93d3cuYXBwbGUuY29tL3N3dXBkYXRlcy4iLAotCSAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKLQkgICAgKi8gICAgICAgICAgICAgIAotCSAgICBTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgdmVyc2lvbiBpcyB0b28gb2xkLiBOZWVkIDEuNy4zIG9yIGxhdGVyLiIpOwotCSAgICByZXR1cm4gKC0xKTsKLQl9Ci0JCi0JaWYgKCBEU3BTdGFydHVwICgpICE9IG5vRXJyICkgewotCQlTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGRuJ3Qgc3RhcnR1cCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQkKLQkvKiBTdGFydCBEU3BpbnRvc2ggZXZlbnRzICovCi0JTWFjX0luaXRFdmVudHModGhpcyk7Ci0KLQkvKiBHZXQgYSBoYW5kbGUgdG8gdGhlIG1haW4gbW9uaXRvciwgb3IgY2hvb3NlIG9uZSBvbiBtdWx0aXBsZSBtb25pdG9yIHNldHVwcyAqLwotCWlmICggRFNwX0dldE1haW5EZXZpY2UodGhpcywgJlNETF9EaXNwbGF5KSA8ICAwKQotCQlyZXR1cm4gKC0xKTsKLQotCS8qIERldGVybWluZSBwaXhlbCBmb3JtYXQgKi8KLSAgICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBHZXRQaXhEZXB0aCAoICgqKlNETF9EaXNwbGF5KS5nZFBNYXAgKTsKLQlkc3Bfb2xkX2RlcHRoID0gdmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCQkKLQlzd2l0Y2ggKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCkgewotCQljYXNlIDE2OgkKLQkJCXZmb3JtYXQtPlJtYXNrID0gMHgwMDAwN2MwMDsKLQkJCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDNlMDsKLQkJCXZmb3JtYXQtPkJtYXNrID0gMHgwMDAwMDAxZjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotICAgCi0JaWYgKCBEU3BfQ3JlYXRlUGFsZXR0ZSAodGhpcykgPCAwICkgewotCQlTRExfU2V0RXJyb3IgKCJDb3VsZCBub3QgY3JlYXRlIHBhbGV0dGUiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotICAgCi0JLyogR2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgZnVsbHNjcmVlbiBtb2RlcyAqLwotCVNETF9tb2RlbGlzdCA9IERTcF9CdWlsZE1vZGVMaXN0IChTRExfRGlzcGxheSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoaXMtPmluZm8uY3VycmVudF93LCAmdGhpcy0+aW5mby5jdXJyZW50X2gpOwotCWlmIChTRExfbW9kZWxpc3QgPT0gTlVMTCkgewotCQlTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGQgbm90IGJ1aWxkIGEgbW9kZSBsaXN0Iik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQkKLQkvKiBDaGVjayBmb3IgVlJBTSBhbmQgQUdQIEdXb3JsZHMgZm9yIEhXIEJsaXR0aW5nICovCi0JRFNwX0lzSFdBdmFpbGFibGUgKHRoaXMsIHZmb3JtYXQpOwotCQotCXRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMDsKLQotCWlmIChkc3BfdnJhbV9hdmFpbGFibGUgfHwgZHNwX2FncF9hdmFpbGFibGUpIHsKLSAgICAKLQkgIHRoaXMtPmluZm8uaHdfYXZhaWxhYmxlID0gU0RMX1RSVUU7Ci0JICAKLQkgIHRoaXMtPkNoZWNrSFdCbGl0ICA9IERTcF9DaGVja0hXQmxpdDsKLQkgIHRoaXMtPmluZm8uYmxpdF9odyA9IFNETF9UUlVFOyAKLSAgCi0JICB0aGlzLT5GaWxsSFdSZWN0ICAgICA9IERTcF9GaWxsSFdSZWN0OwotCSAgdGhpcy0+aW5mby5ibGl0X2ZpbGwgPSBTRExfVFJVRTsKLQkgIAotCSNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQSAgCi0JICB0aGlzLT5TZXRIV0NvbG9yS2V5ICAgPSBEU3BfU2V0SFdDb2xvcktleTsKLQkgIHRoaXMtPmluZm8uYmxpdF9od19DQyA9IFNETF9UUlVFOwotCSAgCi0JICB0aGlzLT5TZXRIV0FscGhhICAgICAgPSBEU3BfU2V0SFdBbHBoYTsKLQkgIHRoaXMtPmluZm8uYmxpdF9od19BICA9IFNETF9UUlVFOwotCSNlbmRpZgotCQotCX0gIAotICAgIAotCXJldHVybigwKTsKLX0KLQotc3RhdGljIFNETF9SZWN0ICoqRFNwX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQlzdGF0aWMgU0RMX1JlY3QgKmRzcF9tb2Rlc1sxNl07Ci0JaW50IGkgPSAwLCBqID0gMDsKLQkKLQlpZiAoIGZvcm1hdC0+Qml0c1BlclBpeGVsID09IDAgKQotCSAgIHJldHVybiAoIChTRExfUmVjdCoqKSBOVUxMICk7Ci0JCi0Jd2hpbGUgKFNETF9tb2RlbGlzdFtpXSAhPSBOVUxMKSB7Ci0JCi0JICAgaWYgKFNETF9tb2RlbGlzdFtpXS0+eCAmIGZvcm1hdC0+Qml0c1BlclBpeGVsKSB7Ci0JICAgICAgZHNwX21vZGVzW2pdID0gU0RMX21vZGVsaXN0W2ldOwotCSAgICAgIGorKzsKLQkgICB9Ci0JICAgaSsrOwotCX0KLQkKLQlkc3BfbW9kZXNbal0gPSBOVUxMOwotCi0JcmV0dXJuIGRzcF9tb2RlczsKLX0KLQotLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KLXN0YXRpYyB2b2lkIERTcF9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotI2lmICEgVEFSR0VUX0FQSV9NQUNfT1NYCi0KLXN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcmV0cmFjZV9jb3VudCA9IDA7IC8qIC1kdy0gbmVlZCB2b2xhdGlsZSBiZWNhdXNlIGl0IHVwZGF0ZXMgYXN5Y2hyb25vdXNseSAqLwotCi1Cb29sZWFuIERTcF9WQkxQcm9jICggRFNwQ29udGV4dFJlZmVyZW5jZSBjb250ZXh0LCB2b2lkICpyZWZfY29uICkKLXsKLQlyZXRyYWNlX2NvdW50Kys7Ci0JCi0JcmV0dXJuIDE7IC8qIERhcnJlbGwsIGlzIHRoaXMgcmlnaHQ/ICovCi19Ci0KLXN0YXRpYyB2b2lkIERTcF9TZXRIV0Vycm9yIChPU1N0YXR1cyBlcnIsIGludCBpc19hZ3ApCi17Ci0JY2hhciBtZXNzYWdlWzEwMjRdOwotCWNvbnN0IGNoYXIgKmZtdCwgKm1lbTsKLQotCWlmICggaXNfYWdwICkgewotCQltZW0gPSAiQUdQIE1lbW9yeSI7Ci0JfSBlbHNlIHsKLQkJbWVtID0gIlZSQU0iOwotCX0KLQlzd2l0Y2goZXJyKSB7Ci0JICAgIGNhc2UgbWVtRnVsbEVycjoKLQkJZm10ID0gIkhhcmR3YXJlIHN1cmZhY2UgcG9zc2libGUgYnV0IG5vdCBlbm91Z2ggJXMgYXZhaWxhYmxlIjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgY0RlcHRoRXJyOgotCQlmbXQgPSAiSGFyZHdhcmUgc3VyZmFjZSBwb3NzaWJsZSBidXQgaW52YWxpZCBjb2xvciBkZXB0aCI7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlmbXQgPSAiSGFyZHdhcmUgc3VyZmFjZSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIGluICVzIC0gdW5rbm93biBlcnJvciI7Ci0JCWJyZWFrOwotCX0KLQlTRExfc25wcmludGYobWVzc2FnZSwgU0RMX2FycmF5c2l6ZShtZXNzYWdlKSwgZm10LCBtZW0pOwotCVNETF9TZXRFcnJvcihtZXNzYWdlKTsKLX0KLSNlbmRpZiAvLyBUQVJHRVRfQVBJX01BQ19PU1gKLQotLyogcHV0IHVwIGEgZGlhbG9nIHRvIHZlcmlmeSBkaXNwbGF5IGNoYW5nZSAqLwotc3RhdGljIGludCBEU3BfQ29uZmlybVN3aXRjaCAoKSB7Ci0KLSAgLyogcmVzb3VyY2UgaWQncyBmb3IgZGlhbG9nICovCi0gIGNvbnN0IGludCByRGlhbG9nID0gMTAwMjsKLSAgY29uc3QgaW50IGJDYW5jZWwgPSAxOwotICBjb25zdCBpbnQgYk9LICAgICA9IDI7Ci0gIAotICBEaWFsb2dQdHIgZGlhbG9nOwotICBPU1N0YXR1cyAgZXJyOwotICBTSW50MzIgICAgcmVzcG9uc2U7Ci0gIERpYWxvZ0l0ZW1JbmRleCAgICAgICBpdGVtID0gMDsKLSAgR3JhZlB0ciAgIHNhdmVQb3J0OwotICAgIAotICBHZXRQb3J0ICgmc2F2ZVBvcnQpOwotICAKLSAgZGlhbG9nID0gR2V0TmV3RGlhbG9nIChyRGlhbG9nLCBOVUxMLCAoV2luZG93UHRyKSAtMSk7Ci0gIGlmIChkaWFsb2cgPT0gTlVMTCkKLQkgcmV0dXJuICgwKTsKLSAgCi0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0gIFNldFBvcnQgKEdldERpYWxvZ1BvcnQoZGlhbG9nKSk7Ci0jZWxzZQotICBTZXRQb3J0ICgoV2luZG93UHRyKSBkaWFsb2cpOwotI2VuZGlmCi0gIAotICBTZXREaWFsb2dEZWZhdWx0SXRlbSAoZGlhbG9nLCBiQ2FuY2VsKTsKLSAgU2V0RGlhbG9nQ2FuY2VsSXRlbSAgKGRpYWxvZywgYkNhbmNlbCk7Ci0gIAotICBTZXRFdmVudE1hc2sgKGV2ZXJ5RXZlbnQpOyAgCi0gIEZsdXNoRXZlbnRzIChldmVyeUV2ZW50LCAwKTsKLSAgIAotICAgLyogT24gTWFjT1MgOC41IG9yIGxhdGVyLCB3ZSBjYW4gbWFrZSB0aGUgZGlhbG9nIGdvIGF3YXkgYWZ0ZXIgMTUgc2Vjb25kcyAqLwotICAgLyogVGhpcyBpcyBnb29kIHNpbmNlIGl0J3MgcG9zc2libGUgdXNlciBjYW4ndCBldmVuIHNlZSB0aGUgZGlhbG9nISAqLwotICAgLyogUmVxdWlyZXMgbGlua2luZyB0byBEaWFsb2dzTGliICovCi0gICBlcnIgPSBHZXN0YWx0KGdlc3RhbHRTeXN0ZW1WZXJzaW9uLCZyZXNwb25zZSk7Ci0gICBpZiAoZXJyID09IG5vRXJyICYmIHJlc3BvbnNlID49IDB4MDAwMDA4NTApIHsKLSAgIAlTZXREaWFsb2dUaW1lb3V0KGRpYWxvZywgYkNhbmNlbCwgMTUpOwotICAgfQotCi0gICBkbyB7ICAgICAgCi0gICAgCi0gICAgTW9kYWxEaWFsb2cgKCBOVUxMLCAmaXRlbSApOyAgCi0KLSAgIH0gd2hpbGUgKCBpdGVtICE9IGJDYW5jZWwgJiYgaXRlbSAhPSBiT0sgJiYgZXJyICE9IG5vRXJyKTsKLQotCi0gIERpc3Bvc2VEaWFsb2cgKGRpYWxvZyk7Ci0gIFNldFBvcnQgKHNhdmVQb3J0KTsKLSAgCi0gIFNldEV2ZW50TWFzayhldmVyeUV2ZW50IC0gYXV0b0tleU1hc2spOwotICBGbHVzaEV2ZW50cyhldmVyeUV2ZW50LCAwKTsKLSAgIAotICByZXR1cm4gKGl0ZW0gLSAxKTsKLX0KLQotc3RhdGljIHZvaWQgRFNwX1Vuc2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCkKLXsKLQkJCQotCQkKLQkgaWYgKCBjdXJyZW50LT5mbGFncyAmIFNETF9PUEVOR0wgKSAgeyAKLQkgICBNYWNfR0xfUXVpdCAodGhpcyk7CSAgIAkKLQl9Ci0JCQotCWlmIChkc3BfY29udGV4dCAhPSBOVUxMKSB7Ci0JCQotCQlHV29ybGRQdHIgZnJvbnQ7Ci0JCURTcENvbnRleHRfR2V0RnJvbnRCdWZmZXIgKGRzcF9jb250ZXh0LCAmZnJvbnQpOwotCQkKLQkJaWYgKGZyb250ICE9IGRzcF9iYWNrX2J1ZmZlcikKLQkJICAgRGlzcG9zZUdXb3JsZCAoZHNwX2JhY2tfYnVmZmVyKTsKLQkJCi0JCWlmIChjdXJyZW50LT5od2RhdGEpCi0JCSAgIFNETF9mcmVlKGN1cnJlbnQtPmh3ZGF0YSk7Ci0JCSAgIAotCQlEU3BDb250ZXh0X1NldFN0YXRlIChkc3BfY29udGV4dCwga0RTcENvbnRleHRTdGF0ZV9JbmFjdGl2ZSApOwotCQlEU3BDb250ZXh0X1JlbGVhc2UgIChkc3BfY29udGV4dCk7Ci0JCQotCQlkc3BfY29udGV4dCA9IE5VTEw7Ci0JfQotICAgIAkKLSAgICBpZiAoU0RMX1dpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgIERpc3Bvc2VXaW5kb3cgKFNETF9XaW5kb3cpOwotICAgICAgICBTRExfV2luZG93ID0gTlVMTDsKLSAgICB9ICAgIAotICAgIAotICAgIGN1cnJlbnQtPnBpeGVscyA9IE5VTEw7Ci0gICAgY3VycmVudC0+ZmxhZ3MgID0gMDsKLX0KLQotc3RhdGljIFNETF9TdXJmYWNlICpEU3BfU2V0VmlkZW9Nb2RlKF9USElTLAotCVNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLQkKLSNpZiAhVEFSR0VUX0FQSV9NQUNfT1NYCi0gICAgRGlzcGxheUlEVHlwZSAgICAgICAgZGlzcGxheV9pZDsKLQlGaXhlZCBmcmVxOwotI2VuZGlmCi0JRFNwQ29udGV4dEF0dHJpYnV0ZXMgYXR0cmliOwotCU9TU3RhdHVzIGVycjsKLQlVSW50MzIgcm1hc2sgPSAwLCBnbWFzayA9IDAsIGJtYXNrID0gMDsKLQkJCi0JaW50ICAgcGFnZV9jb3VudDsKLQlpbnQgICBkb3VibGVfYnVmOwotCWludCAgIGh3X3N1cmZhY2U7Ci0JaW50ICAgdXNlX2RzcF9iYWNrX2J1ZmZlcjsKLSAgICAgCi0JRFNwX1Vuc2V0VmlkZW9Nb2RlICh0aGlzLCBjdXJyZW50KTsKLSAgICAgICAKLSAgICBpZiAoYnBwICE9IGRzcF9vbGRfZGVwdGgpCi0gICAgICAgIERTcF9EZXN0cm95UGFsZXR0ZSAodGhpcyk7Ci0gICAKLQlkb3VibGVfYnVmID0gKGZsYWdzICYgU0RMX0RPVUJMRUJVRikgIT0gMDsKLQlod19zdXJmYWNlID0gKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gMDsKLQl1c2VfZHNwX2JhY2tfYnVmZmVyID0gIWRzcF92cmFtX2F2YWlsYWJsZSB8fCAhaHdfc3VyZmFjZSA7Ci0JCi0JY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47Ci0KLXJlYnVpbGQ6ICAKLSAgCi0JaWYgKCBkb3VibGVfYnVmICYmIHVzZV9kc3BfYmFja19idWZmZXIgKSB7Ci0JCXBhZ2VfY291bnQgPSAyOwotCX0gZWxzZSB7Ci0JCXBhZ2VfY291bnQgPSAxOwotCX0KLQotCVNETF9tZW1zZXQgKCZhdHRyaWIsIDAsIHNpemVvZiAoRFNwQ29udGV4dEF0dHJpYnV0ZXMpKTsKLQlhdHRyaWIuZGlzcGxheVdpZHRoICAgICAgICAgPSB3aWR0aDsKLQlhdHRyaWIuZGlzcGxheUhlaWdodCAgICAgICAgPSBoZWlnaHQ7Ci0JYXR0cmliLmRpc3BsYXlCZXN0RGVwdGggICAgID0gYnBwOwotCWF0dHJpYi5iYWNrQnVmZmVyQmVzdERlcHRoICA9IGJwcDsKLQlhdHRyaWIuZGlzcGxheURlcHRoTWFzayAgICAgPSBrRFNwRGVwdGhNYXNrX0FsbDsKLQlhdHRyaWIuYmFja0J1ZmZlckRlcHRoTWFzayAgPSBrRFNwRGVwdGhNYXNrX0FsbDsKLQlhdHRyaWIuY29sb3JOZWVkcyAgICAgICAgICAgPSBrRFNwQ29sb3JOZWVkc19SZXF1aXJlOwotCWF0dHJpYi5jb2xvclRhYmxlICAgICAgICAgICA9IDA7Ci0JYXR0cmliLnBhZ2VDb3VudCAgICAgICAgICAgID0gcGFnZV9jb3VudDsKLSAgICAgICAgI2lmIFRBUkdFVF9BUElfTUFDX09TWCB8fCBVTklWRVJTQUxfSU5URVJGQUNFU19WRVJTSU9OID09IDB4MDMyMAotICAgICAgICAKLSAgICAgICAgaWYgKCBEU3BGaW5kQmVzdENvbnRleHQgKCZhdHRyaWIsICZkc3BfY29udGV4dCkgIT0gbm9FcnIgKSB7Ci0gICAgICAgICAgICBTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGRuJ3QgZmluZCBhIGNvbnRleHQiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAjZWxzZQotCWlmICggbm9FcnIgIT0gRE1HZXREaXNwbGF5SURCeUdEZXZpY2UgKFNETF9EaXNwbGF5LCAmZGlzcGxheV9pZCwgU0RMX0ZBTFNFKSApIHsKLQkJU0RMX1NldEVycm9yICgiRGlzcGxheSBNYW5hZ2VyIGNvdWxkbid0IGFzc29jaWF0ZSBHRGV2aWNlIHdpdGggZGlzcGxheV9pZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CQotCWlmICggRFNwRmluZEJlc3RDb250ZXh0T25EaXNwbGF5SUQoJmF0dHJpYiwgJmRzcF9jb250ZXh0LCBkaXNwbGF5X2lkKSAhPSBub0VyciApIHsKLQkJU0RMX1NldEVycm9yICgiRHJhd1Nwcm9ja2V0IGNvdWxkbid0IGZpbmQgYSBzdWl0YWJsZSBjb250ZXh0IG9uIGdpdmVuIGRpc3BsYXkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotICAgICAgICAjZW5kaWYJCQotCWlmICggRFNwQ29udGV4dF9SZXNlcnZlIChkc3BfY29udGV4dCwgJmF0dHJpYikgIT0gbm9FcnIgKSB7Ci0JCVNETF9TZXRFcnJvciAoIkRyYXdTcHJvY2tldCBjb3VsZG4ndCBnZXQgdGhlIG5lZWRlZCByZXNvdXJjZXMgdG8gYnVpbGQgdGhlIGRpc3BsYXkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWlmICggKGVyciA9IERTcENvbnRleHRfU2V0U3RhdGUgKGRzcF9jb250ZXh0LCBrRFNwQ29udGV4dFN0YXRlX0FjdGl2ZSkpICE9IG5vRXJyICkgewotCQkKLQkJaWYgKGVyciA9PSBrRFNwQ29uZmlybVN3aXRjaFdhcm5pbmcpIHsgICAgIAotCQkgIAotCQkgICBpZiAoICEgRFNwX0NvbmZpcm1Td2l0Y2ggKCkgKSB7Ci0JCSAgIAotCQkgICAgICBEU3BDb250ZXh0X1JlbGVhc2UgKGRzcF9jb250ZXh0KTsKLQkJICAgICAgZHNwX2NvbnRleHQgPSBOVUxMOwotCQkgICAgICBTRExfU2V0RXJyb3IgKCJVc2VyIGNhbmNlbGxlZCBkaXNwbGF5IHN3aXRjaCIpOwotCQkgICAgICByZXR1cm4gTlVMTDsKLQkJICAgfQotCQkgICBlbHNlCi0JCSAgICAgLyogSGF2ZSB0byByZWFjdGl2YXRlIGNvbnRleHQuIFdoeT8gKi8KLQkJICAgICBEU3BDb250ZXh0X1NldFN0YXRlIChkc3BfY29udGV4dCwga0RTcENvbnRleHRTdGF0ZV9BY3RpdmUpOwotCQkgICAgICAKLQkgICB9Ci0JICAgZWxzZSB7Ci0JICAgICAgU0RMX1NldEVycm9yICgiRHJhd1Nwcm9ja2V0IGNvdWxkbid0IGFjdGl2YXRlIHRoZSBjb250ZXh0Iik7Ci0JCSAgcmV0dXJuIE5VTEw7Ci0JICAgfQotCX0KLSAgIAotICAgCi0JaWYgKGJwcCAhPSBkc3Bfb2xkX2RlcHRoKSB7Ci0gICAJCi0gICAJICAgIERTcF9DcmVhdGVQYWxldHRlICAodGhpcyk7Ci0gICAKLSAgICAgICAJLyogdXBkYXRlIGZvcm1hdCBpZiBkaXNwbGF5IGRlcHRoIGNoYW5nZWQgKi8KLSAgICAgICAJaWYgKGJwcCA9PSAxNikgewotICAgICAgIAkKLSAgICAgICAJICAgcm1hc2sgPSAweDAwMDA3YzAwOwotICAgICAgIAkgICBnbWFzayA9IDB4MDAwMDAzZTA7Ci0gICAgICAgCSAgIGJtYXNrID0gMHgwMDAwMDAxZjsKLSAgICAgICAJfQotICAgICAgIAlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQgKGN1cnJlbnQsIGJwcCwgcm1hc2ssIGdtYXNrLCBibWFzaywgMCApICkgewotICAgICAgIAkJCi0gICAgICAgCSAgIFNETF9TZXRFcnJvciAoIkNvdWxkIG5vdCByZWFsbG9jYXRlIHZpZGVvIGZvcm1hdC4iKTsKLSAgICAgICAJICAgcmV0dXJuKE5VTEwpOwotICAgICAgIAl9Ci0JfQotCQotCWlmICghZG91YmxlX2J1ZikgewotCQkKLQkJLyogc2luZ2xlLWJ1ZmZlciBjb250ZXh0ICovCi0JCURTcENvbnRleHRfR2V0RnJvbnRCdWZmZXIgKGRzcF9jb250ZXh0LCAmZHNwX2JhY2tfYnVmZmVyKTsKLQkJCQotCQljdXJyZW50LT5od2RhdGEgICA9IChwcml2YXRlX2h3ZGF0YSopIFNETF9tYWxsb2MgKHNpemVvZiAocHJpdmF0ZV9od2RhdGEpKTsKLQkJaWYgKGN1cnJlbnQgLT5od2RhdGEgPT0gTlVMTCkgewotCQkJU0RMX091dE9mTWVtb3J5ICgpOwotCSAgCQlyZXR1cm4gTlVMTDsJCSAgCi0JCX0KLQkJY3VycmVudC0+aHdkYXRhLT5vZmZzY3JlZW4gPSBkc3BfYmFja19idWZmZXI7Ci0JICAgIGN1cnJlbnQtPmZsYWdzICAgfD0gU0RMX0hXU1VSRkFDRTsKLQkgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBEU3BfRGlyZWN0VXBkYXRlOwotCX0gCi0JZWxzZSBpZiAoIHVzZV9kc3BfYmFja19idWZmZXIgKSB7Ci0JCi0JCURTcENvbnRleHRfR2V0QmFja0J1ZmZlciAgKGRzcF9jb250ZXh0LCBrRFNwQnVmZmVyS2luZF9Ob3JtYWwsICZkc3BfYmFja19idWZmZXIpOwotCQkKLQkJY3VycmVudC0+ZmxhZ3MgICB8PSBTRExfRE9VQkxFQlVGIHwgU0RMX1NXU1VSRkFDRTsgLyogb25seSBmcm9udCBidWZmZXIgaXMgaW4gVlJBTSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBEU3BfRFNwVXBkYXRlOwkKLQl9IAotCWVsc2UgaWYgKCBEU3BfTmV3SFdTdXJmYWNlKHRoaXMsICZkc3BfYmFja19idWZmZXIsIGJwcCwgd2lkdGgtMSwgaGVpZ2h0LTEpID09IDAgKSB7Ci0gICAgICAKLSAgICAgIGN1cnJlbnQtPmh3ZGF0YSA9IChwcml2YXRlX2h3ZGF0YSopIFNETF9tYWxsb2MgKHNpemVvZiAocHJpdmF0ZV9od2RhdGEpKTsKLSAgICAgIGlmIChjdXJyZW50IC0+aHdkYXRhID09IE5VTEwpIHsKLSAgICAgIAlTRExfT3V0T2ZNZW1vcnkgKCk7Ci0gICAgICAJcmV0dXJuIE5VTEw7CQkgIAotICAgICAgfQotICAgICAgCi0gICAgICBTRExfbWVtc2V0IChjdXJyZW50LT5od2RhdGEsIDAsIHNpemVvZiAocHJpdmF0ZV9od2RhdGEpKTsKLSAgICAgIGN1cnJlbnQtPmh3ZGF0YS0+b2Zmc2NyZWVuID0gZHNwX2JhY2tfYnVmZmVyOwotICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0RPVUJMRUJVRiB8IFNETF9IV1NVUkZBQ0U7IAotICAgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBEU3BfRGlyZWN0VXBkYXRlOyAvKiBoYXJkd2FyZSBkb2Vzbid0IGRvIHVwZGF0ZSByZWN0cywgbXVzdCBiZSBwYWdlLWZsaXBwZWQgKi8JICAgCi0gICB9ICAJCi0gICBlbHNlIHsKLQotCSAgIERTcENvbnRleHRfUmVsZWFzZSAoZHNwX2NvbnRleHQpOwkKLQkgICB1c2VfZHNwX2JhY2tfYnVmZmVyID0gU0RMX1RSVUU7Ci0JICAgZ290byAgcmVidWlsZDsKLSAgICB9Ci0JICAgCQotICAgIGN1cnJlbnQtPnBpdGNoICA9IEdldFBvcnRQaXhSb3dCeXRlcyhkc3BfYmFja19idWZmZXIpICYgMHgzRkZGOwotCWN1cnJlbnQtPnBpeGVscyA9IEdldFBpeEJhc2VBZGRyKEdldFBvcnRQaXhNYXAoZHNwX2JhY2tfYnVmZmVyKSk7Ci0JCi0JY3VycmVudC0+dyA9IHdpZHRoOwotCWN1cnJlbnQtPmggPSBoZWlnaHQ7Ci0JCi0gICAgI2lmICEgVEFSR0VUX0FQSV9NQUNfT1NYCi0gICAgICAgIAotCWlmICh1c2VfZHNwX2JhY2tfYnVmZmVyKSB7Ci0JICAgCi0JICAgRFNwQ29udGV4dF9HZXRNb25pdG9yRnJlcXVlbmN5IChkc3BfY29udGV4dCwgJmZyZXEpOwotCSAgIERTcENvbnRleHRfU2V0TWF4RnJhbWVSYXRlICAgICAoZHNwX2NvbnRleHQsIGZyZXEgPj4gMTYpOwotCX0KLQkKLSAgICAKLQlpZiAoIChjdXJyZW50LT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpIHx8IChjdXJyZW50LT5mbGFncyAmIFNETF9PUEVOR0wpICkKLQkJRFNwQ29udGV4dF9TZXRWQkxQcm9jIChkc3BfY29udGV4dCwgRFNwX1ZCTFByb2MsIE5VTEwpOwotICAgICNlbmRpZgotCQotCWlmIChicHAgPT0gOCkJCi0JICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKLQkKLQlpZiAoZmxhZ3MgJiBTRExfT1BFTkdMKSB7Ci0JCSAgIAotCSAgIFJlY3QgcmVjdDsKLQkgICBSR0JDb2xvciByZ2IgPSB7IDAuMCwgMC4wLCAwLjAgfTsKLQkgICBHcmFmUHRyIHNhdmVfcG9ydDsKLQkgICAKLQkgICBTZXRSZWN0ICgmcmVjdCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JICAgU0RMX1dpbmRvdyA9IE5ld0NXaW5kb3cobmlsLCAmKCAoKipTRExfRGlzcGxheSkuZ2RSZWN0KSwgIlxwIiwgU0RMX1RSVUUsIHBsYWluREJveCwgKFdpbmRvd1B0ciktMSwgU0RMX0ZBTFNFLCAwKTsKLQkJICAgCi0JICAgaWYgKFNETF9XaW5kb3cgPT0gTlVMTCkgewotCQkgCi0JCSAgIFNETF9TZXRFcnJvciAoIkRTcF9TZXRWaWRlb01vZGUgOiBPcGVuR0wgd2luZG93IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIpOwotCQkgICByZXR1cm4gTlVMTDsgIAkJCSAgIAkKLQkgICB9Ci0JICAgCi0JICAgLyogU2V0IHdpbmRvdyBjb2xvciB0byBibGFjayB0byBhdm9pZCB3aGl0ZSBmbGFzaCovCi0JICAgR2V0UG9ydCAoJnNhdmVfcG9ydCk7Ci0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JCVNldFBvcnQgKEdldFdpbmRvd1BvcnQoU0RMX1dpbmRvdykpOwotI2Vsc2UKLQkgICBTZXRQb3J0IChTRExfV2luZG93KTsKLSNlbmRpZgotCSAgICAgIFJHQkZvcmVDb2xvciAoJnJnYik7Ci0JICAgICAgUGFpbnRSZWN0ICAgICgmcmVjdCk7CQotCSAgIFNldFBvcnQgKHNhdmVfcG9ydCk7Ci0JICAgCi0JICAgU2V0UG9ydFdpbmRvd1BvcnQgKFNETF9XaW5kb3cpOwotCSAgIFNlbGVjdFdpbmRvdyAgKFNETF9XaW5kb3cpOwotCSAgICAgCi0JICAgaWYgKCBNYWNfR0xfSW5pdCAodGhpcykgPCAwICkgewotCSAgIAotCSAgICAgIFNETF9TZXRFcnJvciAoIkRTcF9TZXRWaWRlb01vZGUgOiBjb3VsZCBub3QgY3JlYXRlIE9wZW5HTCBjb250ZXh0LiIpOwotCSAgICAgIHJldHVybiBOVUxMOwotCSAgIH0KLQkgICAJICAgCSAgIAkgICAKLQkgICBjdXJyZW50LT5mbGFncyB8PSBTRExfT1BFTkdMOwkKLQl9Ci0JCi0JcmV0dXJuIGN1cnJlbnQ7IAotfQotCi0jaWZkZWYgRFNQX1RSWV9DQ19BTkRfQUEKLQotc3RhdGljIGludCBEU3BfTWFrZUhXTWFzayAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotICAgIEdESGFuZGxlIHNhdmVfZGV2aWNlOwotICAgIENHcmFmUHRyIHNhdmVfcG9ydDsKLSAgICBHV29ybGRQdHIgdGVtcDsKLSAgICBSR0JDb2xvciBibGFjayA9IHsgMCwgMCwgMCB9OwotICAgIFJHQkNvbG9yIHdoaXRlID0geyAweEZGRkYsIDB4RkZGRiwgMHhGRkZGIH07Ci0gICAgUmVjdCAgICAgcmVjdDsKLSAgICAKLSAgICBVaW50MzIgZGVwdGggPSBHZXRQaXhEZXB0aCAoIEdldEdEZXZQaXhNYXAgKFNETF9EaXNwbGF5KSApOwotICAgIAotICAgIFNldFJlY3QgKCZyZWN0LCAwLCAwLCBzdXJmYWNlLT53LCBzdXJmYWNlLT5oKTsKLSAgICAKLSAgICBpZiAoIG5vRXJyICE9IE5ld0dXb3JsZCAoJihzdXJmYWNlLT5od2RhdGEtPm1hc2spLCBkZXB0aCwgJnJlY3QsIDAsIFNETF9EaXNwbGF5LCAwICkgPCAwICkgewotICAgIAotICAgICAgICBTRExfT3V0T2ZNZW1vcnkgKCk7Ci0gICAgICAgIHJldHVybiAoLTEpOwotICAgIH0gICAKLSAgICAKLSAgICBpZiAoIG5vRXJyICE9IE5ld0dXb3JsZCAoJnRlbXAsIGRlcHRoLCAmcmVjdCwgMCAsIFNETF9EaXNwbGF5LCAwICkgKSB7Ci0gICAgCi0gICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKTsKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgCi0gICAgR2V0R1dvcmxkICgmc2F2ZV9wb3J0LCAmc2F2ZV9kZXZpY2UpOwotICAgIFNldEdXb3JsZCAoc3VyZmFjZS0+aHdkYXRhLT5tYXNrLCBTRExfRGlzcGxheSk7Ci0gICAgCi0gICAgUkdCRm9yZUNvbG9yICgmd2hpdGUpOwotICAgIFBhaW50UmVjdCAgICAoJnJlY3QpOwotICAgICAgICAgICAgICAgICAKLSAgICBSR0JCYWNrQ29sb3IgKCYoc3VyZmFjZS0+aHdkYXRhLT50cmFucykpOwotICAgIAotICAgIENvcHlCaXRzICggR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuKSwKLSAgICAgICAgICAgICAgICAgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHN1cmZhY2UtPmh3ZGF0YS0+bWFzayksCi0gICAgCSAgICAgICAmcmVjdCwgJnJlY3QsIHRyYW5zcGFyZW50LCBOVUxMICk7Ci0gICAgICAgIAotICAgIFNldEdXb3JsZCAoc3VyZmFjZS0+aHdkYXRhLT5tYXNrLCBTRExfRGlzcGxheSk7ICAgIAotICAgIFNldEdXb3JsZCAoc2F2ZV9wb3J0LCBzYXZlX2RldmljZSk7ICAgICAKLSAgICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50IERTcF9TZXRIV0FscGhhKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVUludDggYWxwaGEpCi17Ci0gICAgc3VyZmFjZS0+aHdkYXRhLT5hbHBoYS5yZWQgICA9IChhbHBoYSAvIDI1NS4wKSAqIDY1NTM1OwotICAgIHN1cmZhY2UtPmh3ZGF0YS0+YWxwaGEuYmx1ZSAgPSAoYWxwaGEgLyAyNTUuMCkgKiA2NTUzNTsKLSAgICBzdXJmYWNlLT5od2RhdGEtPmFscGhhLmdyZWVuID0gKGFscGhhIC8gMjU1LjApICogNjU1MzU7Ci0KLSAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfU1JDQUxQSEE7Ci0KLSAgICBpZiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpIHsKLSAgICAgICAgcmV0dXJuKERTcF9NYWtlSFdNYXNrICh0aGlzLCBzdXJmYWNlKSk7Ci0gICAgfQotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBEU3BfU2V0SFdDb2xvcktleShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBrZXkpCi17Ci0gICAgQ0dyYWZQdHIgc2F2ZV9wb3J0OwotICAgIEdESGFuZGxlIHNhdmVfZGV2aWNlOwotICAgIAotICAgIEdldEdXb3JsZCAoJnNhdmVfcG9ydCwgJnNhdmVfZGV2aWNlKTsKLSAgICBTZXRHV29ybGQgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuLCBOVUxMKTsKLSAgICAKLSAgICBJbmRleDJDb2xvciAoa2V5LCAmKHN1cmZhY2UtPmh3ZGF0YS0+dHJhbnMpKTsKLSAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfU1JDQ09MT1JLRVk7ICAgIAotICAgIAotICAgIFNldEdXb3JsZCAoc2F2ZV9wb3J0LCBzYXZlX2RldmljZSk7Ci0gICAgCi0gICAgaWYgKCBzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNBTFBIQSApIHsKLSAgICAgICAgcmV0dXJuKERTcF9NYWtlSFdNYXNrICh0aGlzLCBzdXJmYWNlKSk7ICAgIAotICAgIH0gCi0gICAgcmV0dXJuKDApOwotfQotCi0jZW5kaWYgLyogRFNQX1RSWV9DQ19BTkRfQUEgKi8KLQotc3RhdGljIGludCBEU3BfTmV3SFdTdXJmYWNlKF9USElTLCBDR3JhZlB0ciAqcG9ydCwgaW50IGRlcHRoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgIAotICAgT1NTdGF0dXMgZXJyOwotICAgUmVjdCAgICAgYm91bmRzOwotCQkKLQlTZXRSZWN0ICgmYm91bmRzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgIAotICNpZiB1c2VEaXN0YW50SGR3ck1lbSAmJiB1c2VMb2NhbEhkd3JNZW0KLSAgICBpZiAoZHNwX3ZyYW1fYXZhaWxhYmxlKSB7Ci0JICAgLyogdHJ5IFZSQU0gKi8KLSAgIAkgIGVyciA9IE5ld0dXb3JsZCAocG9ydCwgZGVwdGgsICZib3VuZHMsIDAgLCBTRExfRGlzcGxheSwgdXNlRGlzdGFudEhkd3JNZW0gfCBub05ld0RldmljZSApOwotICAgICAgaWYgKGVyciAhPSBub0VycikKLSAgICAgICAgIERTcF9TZXRIV0Vycm9yIChlcnIsIFNETF9GQUxTRSk7ICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiAoMCk7ICAgICAgCi0gICAgfQotICAgIAotICAgIGlmIChkc3BfYWdwX2F2YWlsYWJsZSkgewotICAgICAgLyogdHJ5IEFHUCAqLwotICAgICAgZXJyID0gTmV3R1dvcmxkIChwb3J0LCBkZXB0aCwgJmJvdW5kcywgMCAsIFNETF9EaXNwbGF5LCB1c2VMb2NhbEhkd3JNZW0gfCBub05ld0RldmljZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChlcnIgIT0gbm9FcnIpCi0gICAgICAgICBEU3BfU2V0SFdFcnJvciAoZXJyLCBTRExfVFJVRSk7Ci0gICAgICBlbHNlICAgCi0gICAgICAgICByZXR1cm4gKDApOyAgICAgCi0gICAgIH0gIAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAKLSAgIHJldHVybiAoLTEpOyAgCi19Ci0KLXN0YXRpYyBpbnQgRFNwX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlHV29ybGRQdHIgdGVtcDsKLQkgCSAKLQlpZiAoIERTcF9OZXdIV1N1cmZhY2UgKHRoaXMsICZ0ZW1wLCBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCwgc3VyZmFjZS0+dywgc3VyZmFjZS0+aCkgPCAwICkKLQkgICByZXR1cm4gKC0xKTsKLQkJCQotCXN1cmZhY2UtPmh3ZGF0YSA9IChwcml2YXRlX2h3ZGF0YSopIFNETF9tYWxsb2MgKHNpemVvZiAocHJpdmF0ZV9od2RhdGEpKTsKLQlpZiAoc3VyZmFjZS0+aHdkYXRhID09IE5VTEwpIHsKLQkJU0RMX091dE9mTWVtb3J5ICgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCVNETF9tZW1zZXQgKHN1cmZhY2UtPmh3ZGF0YSwgMCwgc2l6ZW9mKHByaXZhdGVfaHdkYXRhKSk7Ci0Jc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW4gPSB0ZW1wOwotCXN1cmZhY2UtPnBpdGNoCSA9IEdldFBpeFJvd0J5dGVzIChHZXRQb3J0UGl4TWFwICh0ZW1wKSkgJiAweDNGRkY7Ci0Jc3VyZmFjZS0+cGl4ZWxzICA9IEdldFBpeEJhc2VBZGRyIChHZXRQb3J0UGl4TWFwICh0ZW1wKSk7Ci0Jc3VyZmFjZS0+ZmxhZ3MJfD0gU0RMX0hXU1VSRkFDRTsKLSNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQQkKLQlzdXJmYWNlLT5mbGFncyAgfD0gU0RMX0hXQUNDRUw7Ci0jZW5kaWYJCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIERTcF9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsJCi0JaWYgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuICE9IE5VTEwpCi0JCURpc3Bvc2VHV29ybGQgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuKTsKLQlTRExfZnJlZShzdXJmYWNlLT5od2RhdGEpOwotCi0gICAgc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKLX0KLQotc3RhdGljIGludCBEU3BfQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkZXN0KQotewotCWludCBhY2NlbGVyYXRlZDsKLQotCS8qIFNldCBpbml0aWFsIGFjY2VsZXJhdGlvbiBvbiAqLwotCXNyYy0+ZmxhZ3MgfD0gU0RMX0hXQUNDRUw7Ci0KLQkvKiBTZXQgdGhlIHN1cmZhY2UgYXR0cmlidXRlcyAqLwotCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSApIHsKLQkJaWYgKCAhIHRoaXMtPmluZm8uYmxpdF9od19BICkgewotCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7Ci0JCX0KLQl9Ci0JaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgewotCQlpZiAoICEgdGhpcy0+aW5mby5ibGl0X2h3X0NDICkgewotCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgZmluYWwgc3VyZmFjZSBibGl0IGlzIGFjY2VsZXJhdGVkICovCi0JYWNjZWxlcmF0ZWQgPSAhIShzcmMtPmZsYWdzICYgU0RMX0hXQUNDRUwpOwotCWlmICggYWNjZWxlcmF0ZWQgKSB7Ci0JCXNyYy0+bWFwLT5od19ibGl0ID0gRFNwX0hXQWNjZWxCbGl0OwotCX0KLQlyZXR1cm4oYWNjZWxlcmF0ZWQpOwotfQotCi1zdGF0aWMgaW50IERTcF9IV0FjY2VsQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KQotewotCUNHcmFmUHRyIHNhdmVfcG9ydDsKLQlHREhhbmRsZSBzYXZlX2RldmljZTsKLQlSZWN0IHNyY19yZWN0LCBkc3RfcmVjdDsKLSAgICBSR0JDb2xvciBibGFjayA9IHsgMCwgMCwgMCB9OwotICAgIFJHQkNvbG9yIHdoaXRlID0geyAweEZGRkYsIDB4RkZGRiwgMHhGRkZGIH07Ci0KLSNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQQkJCi0JVUludDMyIG1vZGU7CQotI2VuZGlmCi0JCi0JU2V0UmVjdCAoJnNyY19yZWN0LCBzcmNyZWN0LT54LCBzcmNyZWN0LT55LCBzcmNyZWN0LT54ICsgc3JjcmVjdC0+dywgc3JjcmVjdC0+eSArIHNyY3JlY3QtPmgpOwotCVNldFJlY3QgKCZkc3RfcmVjdCwgZHN0cmVjdC0+eCwgZHN0cmVjdC0+eSwgZHN0cmVjdC0+eCArIGRzdHJlY3QtPncsIGRzdHJlY3QtPnkgKyBkc3RyZWN0LT5oKTsKLQkKLQlHZXRHV29ybGQgKCZzYXZlX3BvcnQsICZzYXZlX2RldmljZSk7Ci0JU2V0R1dvcmxkIChkc3QtPmh3ZGF0YS0+b2Zmc2NyZWVuLCBOVUxMKTsJCQotCQkKLQlSR0JGb3JlQ29sb3IgKCZibGFjayk7Ci0JUkdCQmFja0NvbG9yICgmd2hpdGUpOwotCQkKLSNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQQotCQotCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpICYmCi0JICAgICAoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgICkgewotCSAgICAgCi0JICAgICBPcENvbG9yICgmKHNyYy0+aHdkYXRhLT5hbHBoYSkpOwkgICAgICAgICAgIAotICAgIAotICAgICAgICAgQ29weURlZXBNYXNrICggR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHNyYy0+aHdkYXRhLT5vZmZzY3JlZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHNyYy0+aHdkYXRhLT5tYXNrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyhkc3QtPmh3ZGF0YS0+b2Zmc2NyZWVuKSwKLQkgICAgICAgICAgICAgICAgICAgICZzcmNfcmVjdCwgJnNyY19yZWN0LCAmZHN0X3JlY3QsCi0JICAgICAgICAgICAgICAgICAgICBibGVuZCwKLQkgICAgICAgICAgICAgICAgICAgIE5VTEwgKTsgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCi0JfQotCWVsc2UgewotICAgIAkKLSAgICAJaWYgKCBzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSB7CQkgICAgCSAgICAJICAgIAotICAgIAkgICAgUkdCQmFja0NvbG9yICgmKHNyYy0+aHdkYXRhLT50cmFucykgKTsJICAgIAotICAgIAkgICAgbW9kZSA9IHRyYW5zcGFyZW50OwotICAgIAl9Ci0gICAgCWVsc2UgaWYgKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpIHsKLSAgICAJCi0gICAgCSAgICBPcENvbG9yICgmKHNyYy0+aHdkYXRhLT5hbHBoYSkpOwotICAgIAkgICAgbW9kZSA9IGJsZW5kOwotICAgIAl9ICAgIAkKLSAgICAJZWxzZSB7Ci0gICAgCQotICAgIAkgICAgbW9kZSA9IHNyY0NvcHk7ICAgCSAgICAKLSAgICAJfSAgICAgICAgICAgIAotICAgIAkKLSAgICAgICAgQ29weUJpdHMgKCBHZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMoc3JjLT5od2RhdGEtPm9mZnNjcmVlbiksCi0gICAgICAgICAgICAgICAgICAgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKGRzdC0+aHdkYXRhLT5vZmZzY3JlZW4pLAotICAgIAkgICAgICAgICAgICZzcmNfcmVjdCwgJmRzdF9yZWN0LCBtb2RlLCBOVUxMICk7Ci0gICAgfQkKLSNlbHNlCi0gICAgCi0gICAgQ29weUJpdHMgKCAmKCgoR3JhZlB0cikoc3JjLT5od2RhdGEtPm9mZnNjcmVlbikpLT5wb3J0Qml0cyksCi0gICAgCSAgICAgICAgICAgJigoKEdyYWZQdHIpKGRzdC0+aHdkYXRhLT5vZmZzY3JlZW4pKS0+cG9ydEJpdHMpLAotICAgIAkgICAgICAgICAgICZzcmNfcmVjdCwgJmRzdF9yZWN0LCBzcmNDb3B5LCBOVUxMICk7Ci0KLSNlbmRpZiAvKiBEU1BfVFJZX0NDX0FORF9BQSAqLyAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlTZXRHV29ybGQgKHNhdmVfcG9ydCwgc2F2ZV9kZXZpY2UpOwotCi0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IERTcF9GaWxsSFdSZWN0KF9USElTLCBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqcmVjdCwgVWludDMyIGNvbG9yKQotewotCUNHcmFmUHRyIHNhdmVfcG9ydDsKLQlHREhhbmRsZSBzYXZlX2RldmljZTsKLQlSZWN0ICAgICBmaWxsX3JlY3Q7Ci0JUkdCQ29sb3IgcmdiOwotCQkKLQlTZXRSZWN0ICgmZmlsbF9yZWN0LCByZWN0LT54LCByZWN0LT55LCByZWN0LT54ICsgcmVjdC0+dywgcmVjdC0+eSArIHJlY3QtPmgpOwotCQotCUdldEdXb3JsZCAoJnNhdmVfcG9ydCwgJnNhdmVfZGV2aWNlKTsKLQlTZXRHV29ybGQgKGRzdC0+aHdkYXRhLT5vZmZzY3JlZW4sIE5VTEwpOwotCi0gICAgSW5kZXgyQ29sb3IgKGNvbG9yLCAmcmdiKTsKLSAgICAKLQlSR0JGb3JlQ29sb3IgKCZyZ2IpOwotCVBhaW50UmVjdCAoJmZpbGxfcmVjdCk7Ci0KLQlTZXRHV29ybGQgKHNhdmVfcG9ydCwgc2F2ZV9kZXZpY2UpOyAgICAKLQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBEU3BfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JICBpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICkgewotCQlDR3JhZlB0ciBkc3BfZnJvbnRfYnVmZmVyLCBzYXZlX3BvcnQ7Ci0JCVJlY3QgcmVjdDsKLQkJCi0gICAgI2lmICEgVEFSR0VUX0FQSV9NQUNfT1NYCi0JCXVuc2lnbmVkIGludCBvbGRfY291bnQ7Ci0JI2VuZGlmCi0gICAgCQotCQkvKiBwc2V1ZG8gcGFnZSBmbGlwcGluZyBmb3IgVlJBTSBiYWNrIGJ1ZmZlciovIAotCQlEU3BDb250ZXh0X0dldEZyb250QnVmZmVyIChkc3BfY29udGV4dCwgJmRzcF9mcm9udF9idWZmZXIpOwotCQlTZXRSZWN0ICgmcmVjdCwgMCwgMCwgc3VyZmFjZS0+dy0xLCBzdXJmYWNlLT5oLTEpOyAgCQotICAJCQotICAJCUdldFBvcnQgKChHcmFmUHRyICopJnNhdmVfcG9ydCk7Ci0gIAkJU2V0UG9ydCAoKEdyYWZQdHIpZHNwX2Zyb250X2J1ZmZlcik7Ci0gIAkJCi0gIAkJLyogd2FpdCBmb3IgcmV0cmFjZSAqLwotICAJCS8qIEkgaGF2ZSB0cmllZCBkb2luZyB0aGUgc3dhcCBpbiBpbnRlcnJ1cHQgcm91dGluZSAoVkJMIFByb2MpIHRvIGRvICovCi0gIAkJLyogaXQgYXN5bmNocm9ub3VzbHksIGJ1dCBhcHBhcmVudGx5IENvcHlCaXRzIGlzbid0IGludGVycnVwdCBzYWZlICAqLwkJICAgCi0gICAgICAgIAotICAgICAgICAgICAgI2lmICEgVEFSR0VUX0FQSV9NQUNfT1NYCi0JCSNpZm5kZWYgRFNQX05PX1NZTkNfVkJMCi0gICAgCQlvbGRfY291bnQgPSByZXRyYWNlX2NvdW50OwotICAgIAkJd2hpbGUgKG9sZF9jb3VudCA9PSByZXRyYWNlX2NvdW50KQotICAgIAkJCSAgOwotCQkjZW5kaWYJCQkJICAKLSAgICAgICAgICAgICNlbmRpZgotICAJCQotICAgICAgICAgIENvcHlCaXRzICggR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKGRzcF9iYWNrX2J1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKGRzcF9mcm9udF9idWZmZXIpLAotICAJCQkgICAmcmVjdCwgJnJlY3QsIHNyY0NvcHksIE5VTEwgKTsKLSAgCQotICAJCVNldFBvcnQgKChHcmFmUHRyKXNhdmVfcG9ydCk7Ci0gIAkJCi0JfSBlbHNlIHsKLQkJLyogbm90IHJlYWxseSBwYWdlIGZsaXBwaW5nIGF0IGFsbDogRFNwIGp1c3QgYmxpdHMgdGhlIGRpcnR5IHJlY3RhbmdsZXMgZnJvbSBEU3BfVXBkYXRlUmVjdHMgKi8JICAgIAotCQlCb29sZWFuIGJ1c3lfZmxhZzsKLQkJRFNwQ29udGV4dF9Td2FwQnVmZmVycyAoZHNwX2NvbnRleHQsIE5VTEwsICZidXN5X2ZsYWcpOyAvKiB0aGlzICB3YWl0cyBmb3IgVkJMICovCi0JCURTcENvbnRleHRfR2V0QmFja0J1ZmZlciAoZHNwX2NvbnRleHQsIGtEU3BCdWZmZXJLaW5kX05vcm1hbCwgJmRzcF9iYWNrX2J1ZmZlcik7Ci0gICAgICAgIHN1cmZhY2UtPnBpeGVscyA9ICBHZXRQaXhCYXNlQWRkciggR2V0UG9ydFBpeE1hcChkc3BfYmFja19idWZmZXIpICk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBEU3BfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYgKCBMb2NrUGl4ZWxzIChHZXRHV29ybGRQaXhNYXAgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuKSkgKQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgRFNwX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JVW5sb2NrUGl4ZWxzIChHZXRHV29ybGRQaXhNYXAgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERTcF9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnNkbF9yZWN0cykKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIERTcF9EU3BVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnNkbF9yZWN0cykKLXsKLSNpZiAhIFRBUkdFVF9BUElfTUFDX09TWCAvKiBVbnN1cHBvcnRlZCBEU3AgaW4gaGVyZSAqLwotCWludCBpOwotCVJlY3QgcmVjdDsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgbnVtcmVjdHM7IGkrKykgewotCQotCQlyZWN0LnRvcCAgICA9IHNkbF9yZWN0c1tpXS55OwotCQlyZWN0LmxlZnQgICA9IHNkbF9yZWN0c1tpXS54OwotCQlyZWN0LmJvdHRvbSA9IHNkbF9yZWN0c1tpXS5oICsgc2RsX3JlY3RzW2ldLnk7Ci0JCXJlY3QucmlnaHQgID0gc2RsX3JlY3RzW2ldLncgKyBzZGxfcmVjdHNbaV0ueDsKLQkJCi0JCURTcENvbnRleHRfSW52YWxCYWNrQnVmZmVyUmVjdCAoZHNwX2NvbnRleHQsICZyZWN0KTsJCQotCX0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IERTcF9DcmVhdGVQYWxldHRlKF9USElTKSB7Ci0KLQotCS8qIENyZWF0ZSBvdXIgcGFsZXR0ZSAqLwotCVNETF9DVGFiID0gKENUYWJIYW5kbGUpTmV3SGFuZGxlKHNpemVvZihDb2xvclNwZWMpKjI1NiArIDgpOwotCWlmICggU0RMX0NUYWIgPT0gbmlsICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JKCoqU0RMX0NUYWIpLmN0U2VlZCA9IEdldENUU2VlZCgpOwotCSgqKlNETF9DVGFiKS5jdEZsYWdzID0gMDsKLQkoKipTRExfQ1RhYikuY3RTaXplID0gMjU1OwotCUNUYWJDaGFuZ2VkKFNETF9DVGFiKTsKLQlTRExfQ1BhbCA9IE5ld1BhbGV0dGUoMjU2LCBTRExfQ1RhYiwgcG1FeHBsaWNpdCtwbVRvbGVyYW50LCAwKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBEU3BfRGVzdHJveVBhbGV0dGUoX1RISVMpIHsKLQotCS8qIEZyZWUgcGFsZXR0ZSBhbmQgcmVzdG9yZSBvcmlnaW5hbCBvbmUgKi8KLQlpZiAoIFNETF9DVGFiICE9IG5pbCApIHsKLQkJRGlzcG9zZUhhbmRsZSgoSGFuZGxlKVNETF9DVGFiKTsKLQkJU0RMX0NUYWIgPSBuaWw7Ci0JfQotCWlmICggU0RMX0NQYWwgIT0gbmlsICkgewotCQlEaXNwb3NlUGFsZXR0ZShTRExfQ1BhbCk7Ci0JCVNETF9DUGFsID0gbmlsOwotCX0KLQlSZXN0b3JlRGV2aWNlQ2x1dChTRExfRGlzcGxheSk7Ci0JCi0gICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50IERTcF9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0JQ1RhYkhhbmRsZSAgIGNUYWI7Ci0JCi0JaW50IGk7Ci0KLQljVGFiID0gU0RMX0NUYWI7Ci0JCi0JLyogVmVyaWZ5IHRoZSByYW5nZSBvZiBjb2xvcnMgKi8KLQlpZiAoIChmaXJzdGNvbG9yK25jb2xvcnMpID4gKCgqKmNUYWIpLmN0U2l6ZSsxKSApIHsKLQkJcmV0dXJuKDApOwotCX0KLQkKLQkvKiBTZXQgdGhlIHNjcmVlbiBwYWxldHRlIGFuZCB1cGRhdGUgdGhlIGRpc3BsYXkgKi8KLQlmb3IoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspIHsKLQkgICAgICAgIGludCBqID0gZmlyc3Rjb2xvciArIGk7Ci0JICAgICAgICAoKipjVGFiKS5jdFRhYmxlW2pdLnZhbHVlID0gajsKLQkJKCoqY1RhYikuY3RUYWJsZVtqXS5yZ2IucmVkID0gY29sb3JzW2ldLnIgPDwgOCB8IGNvbG9yc1tpXS5yOwotCQkoKipjVGFiKS5jdFRhYmxlW2pdLnJnYi5ncmVlbiA9IGNvbG9yc1tpXS5nIDw8IDggfCBjb2xvcnNbaV0uZzsKLQkJKCoqY1RhYikuY3RUYWJsZVtqXS5yZ2IuYmx1ZSA9IGNvbG9yc1tpXS5iIDw8IDggfCBjb2xvcnNbaV0uYjsKLQl9Ci0JCi0JU2V0R0RldmljZShTRExfRGlzcGxheSk7Ci0JU2V0RW50cmllcygwLCAoKipjVGFiKS5jdFNpemUsIChDb2xvclNwZWMgKikmKCoqY1RhYikuY3RUYWJsZSk7Ci0KLQlyZXR1cm4oMSk7Ci19Ci0KLXZvaWQgRFNwX1ZpZGVvUXVpdChfVEhJUykKLXsKLQlpbnQgaTsKLQkKLQkvKiBGcmVlIGN1cnJlbnQgdmlkZW8gbW9kZSAqLwotCURTcF9VbnNldFZpZGVvTW9kZSh0aGlzLCB0aGlzLT5zY3JlZW4pOwotCi0JLyogRnJlZSBQYWxldHRlIGFuZCByZXN0b3JlIG9yaWdpbmFsICovCi0JRFNwX0Rlc3Ryb3lQYWxldHRlICh0aGlzKTsKLQotI2lmIFNETF9NQUNDTEFTU0lDX0dBTU1BX1NVUFBPUlQKLQlNYWNfUXVpdEdhbW1hKHRoaXMpOwotI2VuZGlmCi0KLQkvKiBGcmVlIGxpc3Qgb2YgdmlkZW8gbW9kZXMgKi8KLQlpZiAoIFNETF9tb2RlbGlzdCAhPSBOVUxMICkgewotCQlmb3IgKCBpPTA7IFNETF9tb2RlbGlzdFtpXTsgaSsrICkgewotCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKLQkJfQotCQlTRExfZnJlZShTRExfbW9kZWxpc3QpOwotCQlTRExfbW9kZWxpc3QgPSBOVUxMOwotCX0KLQkKLQkvKiBVbmxvYWQgRHJhd1Nwcm9ja2V0ICovCi0JRFNwU2h1dGRvd24gKCk7Ci19Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0KLS8qIHN3YXAgYnVmZmVycyB3aXRoIHYtc3luYyAqLwotc3RhdGljIHZvaWQgRFNwX0dMX1N3YXBCdWZmZXJzIChfVEhJUykgewotCi0gICAjaWZuZGVmIERTUF9OT19TWU5DX09QRU5HTAotICAgCi0gICAgICAgdW5zaWduZWQgaW50IG9sZF9jb3VudDsKLSAgICAgICAgICAKLSAgICAgICBvbGRfY291bnQgPSByZXRyYWNlX2NvdW50OwotICAgICAgIHdoaWxlIChvbGRfY291bnQgPT0gcmV0cmFjZV9jb3VudCkKLSAgICAgICAgICA7Ci0gICAjZW5kaWYKLSAgICAgIAotICAgYWdsU3dhcEJ1ZmZlcnMgKGdsQ29udGV4dCk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNkc3AvU0RMX2RzcHZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2RzcC9TRExfZHNwdmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0OWRhNi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY2RzcC9TRExfZHNwdmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfZHNwdmlkZW9faAotI2RlZmluZSBfU0RMX2RzcHZpZGVvX2gKLQotI2lmIFRBUkdFVF9BUElfTUFDX09TWAotIyAgaW5jbHVkZSA8RHJhd1Nwcm9ja2V0L0RyYXdTcHJvY2tldC5oPiAvKiBEcmF3c3Byb2NrZXQuZnJhbWV3b3JrICovCi0jZWxzZQotI2luY2x1ZGUgPERyYXdTcHJvY2tldC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuLi9tYWNjb21tb24vU0RMX2xvd3ZpZGVvLmgiCi0KLS8qIERyYXdTcHJvY2tldCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotc3RydWN0IERTcEluZm8gewotCURTcENvbnRleHRSZWZlcmVuY2UgZHNwX2NvbnRleHQ7Ci0JQ0dyYWZQdHIgICAgICAgICAgICBkc3BfYmFja19idWZmZXI7Ci0gICBpbnQgICAgICAgICAgICAgICAgIGRzcF9vbGRfZGVwdGg7Ci0gICAKLQkvKiBGbGFncyBmb3IgaHcgYWNjZWxlcmF0aW9uICovCi0JaW50IGRzcF92cmFtX2F2YWlsYWJsZTsKLQlpbnQgZHNwX2FncF9hdmFpbGFibGU7Ci0JCi0JCi19OyAKLS8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLwotI2RlZmluZSBkc3BfY29udGV4dCAodGhpcy0+aGlkZGVuLT5kc3BpbmZvLT5kc3BfY29udGV4dCkKLSNkZWZpbmUgZHNwX2JhY2tfYnVmZmVyICh0aGlzLT5oaWRkZW4tPmRzcGluZm8tPmRzcF9iYWNrX2J1ZmZlcikKLSNkZWZpbmUgZHNwX29sZF9kZXB0aCAgICh0aGlzLT5oaWRkZW4tPmRzcGluZm8tPmRzcF9vbGRfZGVwdGgpCi0jZGVmaW5lIGRzcF92cmFtX2F2YWlsYWJsZSAodGhpcy0+aGlkZGVuLT5kc3BpbmZvLT5kc3BfdnJhbV9hdmFpbGFibGUpCi0jZGVmaW5lIGRzcF9hZ3BfYXZhaWxhYmxlICh0aGlzLT5oaWRkZW4tPmRzcGluZm8tPmRzcF9hZ3BfYXZhaWxhYmxlKQotCi0jZW5kaWYgLyogX1NETF9kc3B2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY3JvbS9TRExfcm9tdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWFjcm9tL1NETF9yb212aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGFiOGRlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWFjcm9tL1NETF9yb212aWRlby5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQ1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCi0jaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgotI2lmIFVTRV9RVUlDS1RJTUUKLSNpbmNsdWRlIDxRdWlja1RpbWUvTW92aWVzLmg+Ci0jZW5kaWYKLSNlbGlmIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAmJiAoVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+IDB4MDMzNSkKLSNpbmNsdWRlIDxDYXJib24uaD4KLS8qIFRoZSBmdWxsc2NyZWVuIGNvZGUgcmVxdWlyZXMgdGhlIFF1aWNrVGltZSBmcmFtZXdvcmssIGFuZCB0aGUgd2luZG93Ci0gICBpcyBzdGlsbCBhdCB0aGUgYmFjayBvbiBNYWMgT1MgWCwgd2hpY2ggaXMgd2hlcmUgdGhpcyBjb2RlIGlzIG5lZWRlZC4KLSAqLwotI2lmIFVTRV9RVUlDS1RJTUUKLSNpbmNsdWRlIDxNb3ZpZXMuaD4KLSNlbmRpZgotI2Vsc2UKLSNpbmNsdWRlIDxRdWlja2RyYXcuaD4KLSNpbmNsdWRlIDxMb3dNZW0uaD4KLSNpbmNsdWRlIDxHZXN0YWx0Lmg+Ci0jaW5jbHVkZSA8RGV2aWNlcy5oPgotI2luY2x1ZGUgPERpc2tJbml0Lmg+Ci0jaW5jbHVkZSA8UURPZmZzY3JlZW4uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3N5c3dtLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3JvbXZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vbWFjY29tbW9uL1NETF9tYWNnbF9jLmgiCi0jaW5jbHVkZSAiLi4vbWFjY29tbW9uL1NETF9tYWN3bV9jLmgiCi0jaW5jbHVkZSAiLi4vbWFjY29tbW9uL1NETF9tYWNtb3VzZV9jLmgiCi0jaW5jbHVkZSAiLi4vbWFjY29tbW9uL1NETF9tYWNldmVudHNfYy5oIgotCi0vKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgUk9NX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKLXN0YXRpYyBTRExfUmVjdCAqKlJPTV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIFNETF9TdXJmYWNlICpST01fU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIGludCBST01fU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsCi0JCQkgU0RMX0NvbG9yICpjb2xvcnMpOwotc3RhdGljIHZvaWQgUk9NX1ZpZGVvUXVpdChfVEhJUyk7Ci0KLS8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IFJPTV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBST01fTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgUk9NX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgUk9NX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLQotI2lmICFUQVJHRVRfQVBJX01BQ19DQVJCT04gLyogVGhpcyBzZWVtcyBub3QgdG8gYmUgYXZhaWxhYmxlPyAtc3RzIEF1ZyAyMDAwICovCi0vKiBTYXZlZCBzdGF0ZSBmb3IgdGhlIG1lbnUgYmFyICovCi1zdGF0aWMgUmduSGFuZGxlCWdTYXZlR3JheVJnbiA9IG5pbDsKLXN0YXRpYyBzaG9ydAkJZ1NhdmVNZW51QmFyID0gMDsKLXN0YXRpYyBCb29sZWFuCQlnU2F2ZUNTVmlzID0gdHJ1ZTsKLQotI2lmIHBvd2VyYwotLyogTWl4ZWQgbW9kZSBnbHVlIHRvIGFjdGl2YXRlIHRoZSA2OEsgZW11bGF0b3IgYW5kIHR3aWRkbGUgYSByZWdpc3RlciAqLwotI2RlZmluZSBPTkVXT1JEU1RVQihwMSkgXAotCQl7IDB4NDFGQSwgMHgwMDEwLCAweDIwOUYsIChwMSksIDB4NDFGQSwgXAotCQkgIDB4MDAwOCwgMHgyRjEwLCAweDRFNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfQotCi0jZGVmaW5lIFRXT1dPUkRTVFVCKHAxLHAyKSBcCi0JCXsgMHg0MUZBLCAweDAwMTIsIDB4MjA5RiwgKHAxKSwgKHAyKSwgMHg0MUZBLCBcCi0JCSAgMHgwMDA4LCAweDJGMTAsIDB4NEU3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9Ci0KLSNkZWZpbmUgVEhSRUVXT1JEU1RVQihwMSxwMixwMykgXAotCQl7IDB4NDFGQSwgMHgwMDE0LCAweDIwOUYsIChwMSksIChwMiksIChwMyksIDB4NDFGQSwgXAotCQkgIDB4MDAwOCwgMHgyRjEwLCAweDRFNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfQotCi0vKiBDb250cm9sU3RyaXAgaW5saW5lIGdsdWUgZm9yIFBvd2VyUEMgKi8KLXN0YXRpYyBwYXNjYWwgQm9vbGVhbiBTQklzQ29udHJvbFN0cmlwVmlzaWJsZSh2b2lkKQotewotCXN0YXRpYyBzaG9ydCBwcm9jRGF0YVtdID0gVFdPV09SRFNUVUIoMHg3MDAwLCAweEFBRjIpOwotCVByb2NJbmZvVHlwZSBwcm9jSW5mbyA9IGtEMERpc3BhdGNoZWRQYXNjYWxTdGFja0Jhc2VkCi0JCQkJfCBSRVNVTFRfU0laRShTSVpFX0NPREUoc2l6ZW9mKEJvb2xlYW4pKSkKLSAgICAgICAgICAgIAl8IERJU1BBVENIRURfU1RBQ0tfUk9VVElORV9TRUxFQ1RPUl9TSVpFKGtGb3VyQnl0ZUNvZGUpOwotICAgICAgICAgICAgCQkJCQotCXJldHVybigoQm9vbGVhbikgQ2FsbFVuaXZlcnNhbFByb2MoKFVuaXZlcnNhbFByb2NQdHIpIHByb2NEYXRhLCBwcm9jSW5mbywgMHgwMCkpOwotfQotCi1zdGF0aWMgcGFzY2FsIHZvaWQgU0JTaG93SGlkZUNvbnRyb2xTdHJpcChCb29sZWFuIHNob3dJdCkKLXsKLQlzdGF0aWMgc2hvcnQgcHJvY0RhdGFbXSA9IFRIUkVFV09SRFNUVUIoMHgzMDNDLCAweDAxMDEsIDB4QUFGMik7Ci0JUHJvY0luZm9UeXBlIHByb2NJbmZvID0ga0QwRGlzcGF0Y2hlZFBhc2NhbFN0YWNrQmFzZWQKLQkJCQl8IERJU1BBVENIRURfU1RBQ0tfUk9VVElORV9TRUxFQ1RPUl9TSVpFKGtGb3VyQnl0ZUNvZGUpCi0JCQkJfCBESVNQQVRDSEVEX1NUQUNLX1JPVVRJTkVfUEFSQU1FVEVSKDEsIFNJWkVfQ09ERShzaXplb2YoQm9vbGVhbikpKTsKLQotCUNhbGxVbml2ZXJzYWxQcm9jKChVbml2ZXJzYWxQcm9jUHRyKSBwcm9jRGF0YSwgcHJvY0luZm8sIDB4MDEsIHNob3dJdCk7Ci19Ci0jZW5kaWYgLyogcG93ZXJjICovCi0jZW5kaWYgLyogIVRBUkdFVF9BUElfTUFDX0NBUkJPTiAqLwotCi0vKiBNYWNpbnRvc2ggdG9vbGJveCBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IFJPTV9BdmFpbGFibGUodm9pZCkKLXsKLQlyZXR1cm4oMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFJPTV9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKlJPTV9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7Ci0JaWYgKCBkZXZpY2UgKSB7Ci0JCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLQkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCX0KLQlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCBkZXZpY2UgKSB7Ci0JCQlTRExfZnJlZShkZXZpY2UpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQlkZXZpY2UtPlZpZGVvSW5pdCA9IFJPTV9WaWRlb0luaXQ7Ci0JZGV2aWNlLT5MaXN0TW9kZXMgPSBST01fTGlzdE1vZGVzOwotCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gUk9NX1NldFZpZGVvTW9kZTsKLQlkZXZpY2UtPlNldENvbG9ycyA9IFJPTV9TZXRDb2xvcnM7Ci0JZGV2aWNlLT5VcGRhdGVSZWN0cyA9IE5VTEw7Ci0JZGV2aWNlLT5WaWRlb1F1aXQgPSBST01fVmlkZW9RdWl0OwotCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBST01fQWxsb2NIV1N1cmZhY2U7Ci0JZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7Ci0JZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOwotCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7Ci0JZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gUk9NX0xvY2tIV1N1cmZhY2U7Ci0JZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBST01fVW5sb2NrSFdTdXJmYWNlOwotCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IE5VTEw7Ci0JZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gUk9NX0ZyZWVIV1N1cmZhY2U7Ci0jaWYgU0RMX01BQ0NMQVNTSUNfR0FNTUFfU1VQUE9SVAotCWRldmljZS0+U2V0R2FtbWFSYW1wID0gTWFjX1NldEdhbW1hUmFtcDsKLQlkZXZpY2UtPkdldEdhbW1hUmFtcCA9IE1hY19HZXRHYW1tYVJhbXA7Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fT1BFTkdMCi0JZGV2aWNlLT5HTF9NYWtlQ3VycmVudCA9IE1hY19HTF9NYWtlQ3VycmVudDsKLQlkZXZpY2UtPkdMX1N3YXBCdWZmZXJzID0gTWFjX0dMX1N3YXBCdWZmZXJzOwotCWRldmljZS0+R0xfTG9hZExpYnJhcnkgPSBNYWNfR0xfTG9hZExpYnJhcnk7Ci0JZGV2aWNlLT5HTF9HZXRQcm9jQWRkcmVzcyA9IE1hY19HTF9HZXRQcm9jQWRkcmVzczsKLSNlbmRpZgkvKiBIYXZlIE9wZW5HTCAqLwotCWRldmljZS0+U2V0Q2FwdGlvbiA9IE1hY19TZXRDYXB0aW9uOwotCWRldmljZS0+U2V0SWNvbiA9IE5VTEw7Ci0JZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKLQlkZXZpY2UtPkdyYWJJbnB1dCA9IE5VTEw7Ci0JZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOwotCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gTWFjX0ZyZWVXTUN1cnNvcjsKLQlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gTWFjX0NyZWF0ZVdNQ3Vyc29yOwotCWRldmljZS0+U2hvd1dNQ3Vyc29yID0gTWFjX1Nob3dXTUN1cnNvcjsKLQlkZXZpY2UtPldhcnBXTUN1cnNvciA9IE1hY19XYXJwV01DdXJzb3I7Ci0JZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBNYWNfSW5pdE9TS2V5bWFwOwotCWRldmljZS0+UHVtcEV2ZW50cyA9IE1hY19QdW1wRXZlbnRzOwotCi0JZGV2aWNlLT5mcmVlID0gUk9NX0RlbGV0ZURldmljZTsKLQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLVZpZGVvQm9vdFN0cmFwIFRPT0xCT1hfYm9vdHN0cmFwID0gewotCSJ0b29sYm94IiwgIk1hY09TIFJPTSBUb29sYm94IiwKLQlST01fQXZhaWxhYmxlLCBST01fQ3JlYXRlRGV2aWNlCi19OwotCi0KLXN0YXRpYyBpbnQgUk9NX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotCWxvbmcgaW5mbzsKLQkKLQkvKiBDaGVjayBvdXQgc29tZSB0aGluZ3MgYWJvdXQgdGhlIHN5c3RlbSAqLwotCUdlc3RhbHQoZ2VzdGFsdFF1aWNrZHJhd1ZlcnNpb24sICZpbmZvKTsKLQlpZiAoIGluZm8gPT0gZ2VzdGFsdE9yaWdpbmFsUUQgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ29sb3IgUXVpY2tkcmF3IG5vdCBhdmFpbGFibGUiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTdGFydCBST01pbnRvc2ggZXZlbnRzICovCi0JTWFjX0luaXRFdmVudHModGhpcyk7Ci0KLQkvKiBHZXQgYSBoYW5kbGUgdG8gdGhlIG1haW4gbW9uaXRvciAqLwotCVNETF9EaXNwbGF5ID0gR2V0TWFpbkRldmljZSgpOwotCi0JLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCi0JdGhpcy0+aW5mby5jdXJyZW50X3cgPSAoKipTRExfRGlzcGxheSkuZ2RSZWN0LnJpZ2h0OwotCXRoaXMtPmluZm8uY3VycmVudF9oID0gKCoqU0RMX0Rpc3BsYXkpLmdkUmVjdC5ib3R0b207Ci0KLQkvKiBEZXRlcm1pbmUgcGl4ZWwgZm9ybWF0ICovCi0JdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gKCoqKCoqU0RMX0Rpc3BsYXkpLmdkUE1hcCkucGl4ZWxTaXplOwotCXN3aXRjaCAodmZvcm1hdC0+Qml0c1BlclBpeGVsKSB7Ci0JCWNhc2UgMTY6CS8qIDUtNS01IFJHQiAqLwotCQkJdmZvcm1hdC0+Um1hc2sgPSAweDAwMDA3YzAwOwotCQkJdmZvcm1hdC0+R21hc2sgPSAweDAwMDAwM2UwOwotCQkJdmZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMDFmOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0KLQkvKiBDcmVhdGUgb3VyIHBhbGV0dGUgKi8KLQlTRExfQ1RhYiA9IChDVGFiSGFuZGxlKU5ld0hhbmRsZShzaXplb2YoQ29sb3JTcGVjKSoyNTYgKyA4KTsKLQlpZiAoIFNETF9DVGFiID09IG5pbCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCSgqKlNETF9DVGFiKS5jdFNlZWQgPSBHZXRDVFNlZWQoKTsKLQkoKipTRExfQ1RhYikuY3RGbGFncyA9IDA7Ci0JKCoqU0RMX0NUYWIpLmN0U2l6ZSA9IDI1NTsKLQlDVGFiQ2hhbmdlZChTRExfQ1RhYik7Ci0JU0RMX0NQYWwgPSBOZXdQYWxldHRlKDI1NiwgU0RMX0NUYWIsIHBtRXhwbGljaXQrcG1Ub2xlcmFudCwgMCk7Ci0KLQkvKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBmdWxsc2NyZWVuIG1vZGVzICovCi0JU0RMX21vZGVsaXN0ID0gKFNETF9SZWN0ICoqKVNETF9tYWxsb2MoKDErMSkqc2l6ZW9mKFNETF9SZWN0ICopKTsKLQlpZiAoIFNETF9tb2RlbGlzdCApIHsKLQkJU0RMX21vZGVsaXN0WzBdID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKLQkJaWYgKCBTRExfbW9kZWxpc3RbMF0gKSB7Ci0JCQlTRExfbW9kZWxpc3RbMF0tPnggPSAwOwotCQkJU0RMX21vZGVsaXN0WzBdLT55ID0gMDsKLQkJCVNETF9tb2RlbGlzdFswXS0+dyA9ICgqKlNETF9EaXNwbGF5KS5nZFJlY3QucmlnaHQ7Ci0JCQlTRExfbW9kZWxpc3RbMF0tPmggPSAoKipTRExfRGlzcGxheSkuZ2RSZWN0LmJvdHRvbTsKLQkJfQotCQlTRExfbW9kZWxpc3RbMV0gPSBOVUxMOwotCX0KLQotCS8qIEZpbGwgaW4gc29tZSB3aW5kb3cgbWFuYWdlciBjYXBhYmlsaXRpZXMgKi8KLQl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDE7Ci0KLQkvKiBXZSdyZSBkb25lISAqLwotCXJldHVybigwKTsKLX0KLQotc3RhdGljIFNETF9SZWN0ICoqUk9NX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQlpZiAoIHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gZm9ybWF0LT5CaXRzUGVyUGl4ZWwgKSB7Ci0JCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgewotCQkJcmV0dXJuKFNETF9tb2RlbGlzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4oKFNETF9SZWN0ICoqKS0xKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybigoU0RMX1JlY3QgKiopMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBST01fSGlkZU1lbnVCYXIoX1RISVMpCi17Ci0jaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTiAvKiBUaGlzIHNlZW1zIG5vdCB0byBiZSBhdmFpbGFibGU/IC1zdHMgQXVnIDIwMDAgKi8KLQlSZ25IYW5kbGUJCWRyYXdSZ24gPSBuaWw7Ci0JUmduSGFuZGxlCQl0ZW1wUmduID0gbmlsOwotCVJnbkhhbmRsZQkJZ3JheVJnbiA9IG5pbDsKLQlXaW5kb3dQdHIJCXdpbmRvdyA9IG5pbDsKLQlHREhhbmRsZQkJZ2QgPSBuaWw7Ci0JR3JhZlB0cgkJCXNhdmVQb3J0OwotCWxvbmcJCQlyZXNwb25zZTsKLQlzaG9ydAkJCWhlaWdodDsKLQlFdmVudFJlY29yZAkJdGhlRXZlbnQ7Ci0KLQloZWlnaHQgPSBHZXRNQmFySGVpZ2h0KCk7Ci0JCi0JaWYgKCBoZWlnaHQgPiAwICkgewotCQl0ZW1wUmduID0gTmV3UmduKCk7Ci0JCWRyYXdSZ24gPSBOZXdSZ24oKTsKLQkJZ1NhdmVHcmF5UmduID0gTmV3UmduKCk7Ci0JCWlmICggISB0ZW1wUmduIHx8ICEgZHJhd1JnbiB8fCAhIGdTYXZlR3JheVJnbiApIHsKLQkJCWdvdG8gQ0xFQU5VUDsKLQkJfQotCQlncmF5UmduID0gR2V0R3JheVJnbigpOyAvKiBObyBuZWVkIHRvIGNoZWNrIGZvciB0aGlzICovCi0JCi0JCUdldFBvcnQoJnNhdmVQb3J0KTsKLQotCQkvKiBIaWRlIHRoZSBjb250cm9sIHN0cmlwIGlmIGl0J3MgcHJlc2VudCwgYW5kIHJlY29yZCBpdHMgCi0JCSAgIHByZXZpb3VzIHBvc2l0aW9uIGludG8gdGhlIGRpcnR5IHJlZ2lvbiBmb3IgcmVkcmF3aW5nLiAKLQkJICAgVGhpcyBpc24ndCBuZWNlc3NhcnksIGJ1dCBtYXkgaGVscCBjYXRjaCBzdHJheSBiaXRzLiAqLwotCQlDb3B5UmduKGdyYXlSZ24sIHRlbXBSZ24pOwotCQlpZiAoIUdlc3RhbHQoZ2VzdGFsdENvbnRyb2xTdHJpcEF0dHIsICZyZXNwb25zZSkgJiYgCi0JCQkocmVzcG9uc2UgJiAoMUwgPDwgZ2VzdGFsdENvbnRyb2xTdHJpcEV4aXN0cykpKSB7Ci0JCQlnU2F2ZUNTVmlzID0gU0JJc0NvbnRyb2xTdHJpcFZpc2libGUoKTsKLQkJCWlmIChnU2F2ZUNTVmlzKQotCQkJCVNCU2hvd0hpZGVDb250cm9sU3RyaXAoZmFsc2UpOwotCQl9Ci0JCURpZmZSZ24oZ3JheVJnbiwgdGVtcFJnbiwgZHJhd1Jnbik7Ci0KLQkJLyogU2F2ZSB0aGUgZ3JheSByZWdpb24gb25jZSB0aGUgY29udHJvbCBzdHJpcCBpcyBoaWRkZW4qLwotCQlDb3B5UmduKGdyYXlSZ24sIGdTYXZlR3JheVJnbik7Ci0KLQkJLyogQ2hhbmdlIHRoZSBtZW51IGhlaWdodCBpbiBsb3dtZW0gKi8KLQkJZ1NhdmVNZW51QmFyID0gaGVpZ2h0OwotCQlMTVNldE1CYXJIZWlnaHQoMCk7Ci0JCQotCQkvKiBXYWxrIHRoZSBtb25pdG9yIHJlY3RhbmdsZXMsIGFuZCBjb21iaW5lIGFueSBwaWVjZXMgdGhhdAotCQkgICBhcmVuJ3QgaW4gR3JheVJnbjogbWVudWJhciwgcm91bmQgY29ybmVycywgZmFrZSBmbG9hdGVycy4gKi8KLQkJZm9yKGdkID0gR2V0RGV2aWNlTGlzdCgpOyBnZDsgZ2QgPSBHZXROZXh0RGV2aWNlKGdkKSkgCi0JCQl7Ci0JCQlpZiAoIVRlc3REZXZpY2VBdHRyaWJ1dGUoZ2QsIHNjcmVlbkRldmljZSkpIGNvbnRpbnVlOwotCQkJaWYgKCFUZXN0RGV2aWNlQXR0cmlidXRlKGdkLCBzY3JlZW5BY3RpdmUpKSBjb250aW51ZTsKLQotCQkJUmVjdFJnbih0ZW1wUmduLCAmKCpnZCktPmdkUmVjdCk7CS8qIEdldCB0aGUgd2hvbGUgc2NyZWVuICovCi0JCQlEaWZmUmduKHRlbXBSZ24sIGdyYXlSZ24sIHRlbXBSZ24pOyAvKiBTdWJ0cmFjdCBvdXQgR3JheVJnbiAqLwotCQkJVW5pb25SZ24odGVtcFJnbiwgZHJhd1JnbiwgZHJhd1Jnbik7LyogQ29tYmluZSBhbGwgdGhlIGJpdHMgKi8KLQkJCX0KLQkJCQotCQkvKiBBZGQgdGhlIGJpdHMgaW50byB0aGUgR3JheVJnbiAqLwotCQlVbmlvblJnbihkcmF3UmduLCBncmF5UmduLCBncmF5UmduKTsKLQotCQkvKiBNb2RpZnkgdGhlIHZpcyByZWdpb25zIG9mIGV4cG9zZWQgd2luZG93cyAqLwotCQl3aW5kb3cgPSAoRnJvbnRXaW5kb3coKSkgPyBGcm9udFdpbmRvdygpIDogKFdpbmRvd1B0cikgLTFMOwotCQlQYWludEJlaGluZCh3aW5kb3csIGRyYXdSZ24pOwotCQlDYWxjVmlzQmVoaW5kKHdpbmRvdywgZHJhd1Jnbik7Ci0KLQkJU2V0UG9ydChzYXZlUG9ydCk7Ci0JCQotCQkvKiBZaWVsZCB0aW1lIHNvIHRoYXQgZmxvYXRlcnMgY2FuIGNhdGNoIHVwICovCi0JCUV2ZW50QXZhaWwoMCwgJnRoZUV2ZW50KTsKLQkJRXZlbnRBdmFpbCgwLCAmdGhlRXZlbnQpOwotCQlFdmVudEF2YWlsKDAsICZ0aGVFdmVudCk7Ci0JCUV2ZW50QXZhaWwoMCwgJnRoZUV2ZW50KTsKLQkJfQotCi1DTEVBTlVQOgotCi0JaWYgKHRlbXBSZ24pIERpc3Bvc2VSZ24odGVtcFJnbik7Ci0JaWYgKGRyYXdSZ24pIERpc3Bvc2VSZ24oZHJhd1Jnbik7Ci0jZW5kaWYgLyogIVRBUkdFVF9BUElfTUFDX0NBUkJPTiAqLwotfQotCQotc3RhdGljIHZvaWQgUk9NX1Nob3dNZW51QmFyKF9USElTKQotewotI2lmICFUQVJHRVRfQVBJX01BQ19DQVJCT04gLyogVGhpcyBzZWVtcyBub3QgdG8gYmUgYXZhaWxhYmxlPyAtc3RzIEF1ZyAyMDAwICovCi0JUmduSGFuZGxlCQlkcmF3UmduID0gbmlsOwotCVJnbkhhbmRsZQkJbWVudVJnbiA9IG5pbDsKLQlSZ25IYW5kbGUJCXRlbXBSZ24gPSBuaWw7Ci0JUmduSGFuZGxlCQlncmF5UmduID0gbmlsOwotCVdpbmRvd1B0cgkJd2luZG93ID0gbmlsOwotCUdyYWZQdHIJCQl3TWdyUG9ydDsKLQlHcmFmUHRyCQkJc2F2ZVBvcnQ7Ci0JUmVjdAkJCW1lbnVSZWN0OwotCWxvbmcJCQlyZXNwb25zZTsKLQlzaG9ydAkJCWhlaWdodDsKLQlFdmVudFJlY29yZAkJdGhlRXZlbnQ7Ci0JUkdCQ29sb3IJCXNhdmVSR0I7Ci0JUkdCQ29sb3IJCWJsYWNrUkdCID0geyAwLCAwLCAwIH07Ci0KLQloZWlnaHQgPSBHZXRNQmFySGVpZ2h0KCk7Ci0JCi0JaWYgKChoZWlnaHQgPD0gMCkgJiYgKGdTYXZlTWVudUJhciA+IDApKSB7Ci0JCWRyYXdSZ24gPSBOZXdSZ24oKTsKLQkJbWVudVJnbiA9IE5ld1JnbigpOwotCQl0ZW1wUmduID0gTmV3UmduKCk7Ci0JCWlmICggISB0ZW1wUmduIHx8ICEgZHJhd1JnbiB8fCAhIGdTYXZlR3JheVJnbiApIHsKLQkJCWdvdG8gQ0xFQU5VUDsKLQkJfQotCQlncmF5UmduID0gR2V0R3JheVJnbigpOyAvKiBObyBuZWVkIHRvIGNoZWNrIGZvciB0aGlzICovCi0JCi0JCUdldFBvcnQoJnNhdmVQb3J0KTsKLQkJR2V0V01nclBvcnQoJndNZ3JQb3J0KTsKLQotCQkvKiBTZXQgdGhlIGhlaWdodCBwcm9wZXJseSAqLwotCQlMTVNldE1CYXJIZWlnaHQoZ1NhdmVNZW51QmFyKTsKLQotCQkvKiBSZXN0b3JlIHRoZSBvbGQgR3JheVJnbjogcm91bmRlZCBjb3JuZXJzLCBldGMsIGJ1dCBub3QKLQkJICAgdGhlIG1lbnViYXIgLS0gc3VidHJhY3QgdGhhdCBvdXQgZmlyc3QhICovCi0JCWlmIChnU2F2ZUdyYXlSZ24pCi0JCQl7Ci0JCQltZW51UmVjdCA9ICgqR2V0TWFpbkRldmljZSgpKS0+Z2RSZWN0OwotCQkJbWVudVJlY3QuYm90dG9tID0gbWVudVJlY3QudG9wICsgZ1NhdmVNZW51QmFyOwotCQkJUmVjdFJnbihtZW51UmduLCAmbWVudVJlY3QpOwotCi0JCQlEaWZmUmduKGdyYXlSZ24sIGdTYXZlR3JheVJnbiwgZHJhd1Jnbik7IAkvKiBXaGF0IGRvIHdlIGludmFsPyAqLwotCQkJRGlmZlJnbihkcmF3UmduLCBtZW51UmduLCBkcmF3UmduKTsJCQkvKiBDbGlwIG91dCB0aGUgbWVudSAqLwotCQkJCi0JCQkvKiBOb3cgcmVkcmF3IHRoZSBjb3JuZXJzIGFuZCBvdGhlciBiaXRzIGJsYWNrICovCi0JCQlTZXRQb3J0KHdNZ3JQb3J0KTsKLQkJCUdldENsaXAodGVtcFJnbik7Ci0JCQlTZXRDbGlwKGRyYXdSZ24pOwotCQkJR2V0Rm9yZUNvbG9yKCZzYXZlUkdCKTsKLQkJCVJHQkZvcmVDb2xvcigmYmxhY2tSR0IpOwotCQkJUGFpbnRSZ24oZHJhd1Jnbik7Ci0JCQlSR0JGb3JlQ29sb3IoJnNhdmVSR0IpOwotCQkJU2V0Q2xpcCh0ZW1wUmduKTsKLQkJCVNldFBvcnQoc2F2ZVBvcnQpOwotCQkJCi0JCQlVbmlvblJnbihkcmF3UmduLCBtZW51UmduLCBkcmF3UmduKTsJCS8qIFB1dCBiYWNrIHRoZSBtZW51ICovCi0KLQkJCS8qIE5vdyBhY3R1YWxseSByZXN0b3JlIHRoZSBHcmF5UmduICovCi0JCQlDb3B5UmduKGdTYXZlR3JheVJnbiwgZ3JheVJnbik7Ci0JCQlEaXNwb3NlUmduKGdTYXZlR3JheVJnbik7Ci0JCQlnU2F2ZUdyYXlSZ24gPSBuaWw7Ci0JCQl9Ci0KLQkJLyogTW9kaWZ5IHRoZSB2aXMgcmVnaW9ucyBvZiBleHBvc2VkIHdpbmRvd3MgYW5kIGRyYXcgbWVudWJhciAqLwotCQl3aW5kb3cgPSAoRnJvbnRXaW5kb3coKSkgPyBGcm9udFdpbmRvdygpIDogKFdpbmRvd1B0cikgLTFMOwotCQlQYWludEJlaGluZCh3aW5kb3csIGRyYXdSZ24pOwotCQlDYWxjVmlzQmVoaW5kKHdpbmRvdywgZHJhd1Jnbik7Ci0JCURyYXdNZW51QmFyKCk7Ci0KLQkJU2V0UG9ydChzYXZlUG9ydCk7Ci0JCWdTYXZlTWVudUJhciA9IDA7Ci0KLQkJLyogTm93IHNob3cgdGhlIGNvbnRyb2wgc3RyaXAgaWYgaXQncyBwcmVzZW50ICovCi0JCWlmICghR2VzdGFsdChnZXN0YWx0Q29udHJvbFN0cmlwQXR0ciwgJnJlc3BvbnNlKSAmJiAKLQkJCQkocmVzcG9uc2UgJiAoMUwgPDwgZ2VzdGFsdENvbnRyb2xTdHJpcEV4aXN0cykpKQotCQkJewotCQkJaWYgKGdTYXZlQ1NWaXMgJiYgIVNCSXNDb250cm9sU3RyaXBWaXNpYmxlKCkpCi0JCQkJU0JTaG93SGlkZUNvbnRyb2xTdHJpcCh0cnVlKTsKLQkJCWdTYXZlQ1NWaXMgPSB0cnVlOwotCQkJfQotCi0JCS8qIFlpZWxkIHRpbWUgc28gdGhhdCBmbG9hdGVycyBjYW4gY2F0Y2ggdXAgKi8KLQkJRXZlbnRBdmFpbCgwLCAmdGhlRXZlbnQpOwotCQlFdmVudEF2YWlsKDAsICZ0aGVFdmVudCk7Ci0JCUV2ZW50QXZhaWwoMCwgJnRoZUV2ZW50KTsKLQkJRXZlbnRBdmFpbCgwLCAmdGhlRXZlbnQpOwotCQl9Ci0KLUNMRUFOVVA6Ci0KLQlpZiAoZHJhd1JnbikgRGlzcG9zZVJnbihkcmF3UmduKTsKLQlpZiAobWVudVJnbikgRGlzcG9zZVJnbihtZW51UmduKTsKLQlpZiAodGVtcFJnbikgRGlzcG9zZVJnbih0ZW1wUmduKTsKLSNlbmRpZiAvKiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICovCi19Ci0KLS8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCi1zdGF0aWMgdm9pZCBST01fRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci1zdGF0aWMgdm9pZCBST01fV2luZG93VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci0KLXN0YXRpYyB2b2lkIFJPTV9VbnNldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQpCi17Ci0JLyogRnJlZSB0aGUgY3VycmVudCB3aW5kb3csIGlmIGFueSAqLwotCWlmICggU0RMX1dpbmRvdyAhPSBuaWwgKSB7Ci0JCUdXb3JsZFB0ciBtZW13b3JsZDsKLQkJCi0JCS8qIEhhbmRsZSBPcGVuR0wgc3VwcG9ydCAqLwotCQlNYWNfR0xfUXVpdCh0aGlzKTsKLQotCQltZW13b3JsZCA9IChHV29ybGRQdHIpR2V0V1JlZkNvbihTRExfV2luZG93KTsKLQkJaWYgKCBtZW13b3JsZCAhPSBuaWwgKSB7Ci0JCQlVbmxvY2tQaXhlbHMoR2V0R1dvcmxkUGl4TWFwKG1lbXdvcmxkKSk7Ci0JCQlEaXNwb3NlR1dvcmxkKG1lbXdvcmxkKTsKLQkJfQotCQlpZiAoIChjdXJyZW50LT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKLSNpZiBVU0VfUVVJQ0tUSU1FCi0JCQlFbmRGdWxsU2NyZWVuKGZ1bGxzY3JlZW5fY3R4LCBuaWwpOwotCQkJU0RMX1dpbmRvdyA9IG5pbDsKLSNlbHNlCi0JCQlST01fU2hvd01lbnVCYXIodGhpcyk7Ci0jZW5kaWYKLQkJfQotCX0KLQljdXJyZW50LT5waXhlbHMgPSBOVUxMOwotCWN1cnJlbnQtPmZsYWdzICY9IH4oU0RMX0hXU1VSRkFDRXxTRExfRlVMTFNDUkVFTik7Ci19Ci0KLXN0YXRpYyBTRExfU3VyZmFjZSAqUk9NX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JUmVjdCB3cmVjdCwgb3JlY3Q7Ci0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCi0JUmVjdCB0bXByZWN0OwotI2VuZGlmCi0KLQkvKiBGcmVlIGFueSBwcmV2aW91cyB2aWRlbyBtb2RlICovCi0JUk9NX1Vuc2V0VmlkZW9Nb2RlKHRoaXMsIGN1cnJlbnQpOwotCi0JLyogQ3JlYXRlIHRoZSBST00gd2luZG93IGFuZCBTREwgdmlkZW8gc3VyZmFjZSAqLwotCWN1cnJlbnQtPmZsYWdzID0gMDsJCS8qIENsZWFyIGZsYWdzICovCi0JY3VycmVudC0+dyA9IHdpZHRoOwotCWN1cnJlbnQtPmggPSBoZWlnaHQ7Ci0JU2V0UmVjdCgmd3JlY3QsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCWlmICggU0RMX1dpbmRvdyApIHsKLQkJLyogSWYgd2UgcmVjcmVhdGUgdGhlIHdpbmRvdywgZG9uJ3QgbW92ZSBpdCBhcm91bmQgKi8KLSNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLQkJb3JlY3QgPSAqR2V0V2luZG93UG9ydEJvdW5kcyhTRExfV2luZG93LCAmdG1wcmVjdCk7Ci0jZWxzZQotCQlvcmVjdCA9IFNETF9XaW5kb3ctPnBvcnRSZWN0OwotI2VuZGlmCi0JCU9mZnNldFJlY3QoJndyZWN0LCBvcmVjdC5sZWZ0LCBvcmVjdC50b3ApOwotCX0gZWxzZSB7Ci0JCS8qIENlbnRlciB0aGUgd2luZG93IHRoZSBmaXJzdCB0aW1lIHdlIHNob3cgaXQgKi8KLQkJT2Zmc2V0UmVjdCgmd3JlY3QsCi0JCShTRExfbW9kZWxpc3RbMF0tPnctd2lkdGgpLzIsIChTRExfbW9kZWxpc3RbMF0tPmgtaGVpZ2h0KS8yKTsKLQl9Ci0KLSNpZiBkZWZpbmVkKF9fTUFDT1NYX18pICYmICFVU0VfUVVJQ0tUSU1FCi0JLyogSHVtLi4gZnVsbHNjcmVlbiBtb2RlIGlzIGJyb2tlbiAqLwotCWZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKLSNlbmRpZgotCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgewotCQkvKiBDcmVhdGUgdGhlIGZ1bGxzY3JlZW4gd2luZG93IGFuZCB1c2Ugc2NyZWVuIGJpdHMgKi8KLQkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRXxTRExfRlVMTFNDUkVFTjsKLQkJaWYgKCBTRExfV2luZG93ICkgewotCQkJRGlzcG9zZVdpbmRvdyhTRExfV2luZG93KTsKLQkJfQotI2lmIFVTRV9RVUlDS1RJTUUKLQkJQmVnaW5GdWxsU2NyZWVuKCZmdWxsc2NyZWVuX2N0eCwgbmlsLCAwLDAsICZTRExfV2luZG93LCBuaWwsIDApOwotI2Vsc2UKLQkJU0RMX1dpbmRvdyA9IE5ld0NXaW5kb3cobmlsLCAmd3JlY3QsICJccCIsIHRydWUsIHBsYWluREJveCwKLQkJCQkJCShXaW5kb3dQdHIpLTEsIGZhbHNlLCAwKTsKLQkJUk9NX0hpZGVNZW51QmFyKHRoaXMpOwotI2VuZGlmCi0JCWN1cnJlbnQtPnBpdGNoID0gKCoqKCoqU0RMX0Rpc3BsYXkpLmdkUE1hcCkucm93Qnl0ZXMgJiAweDNGRkY7Ci0JCWN1cnJlbnQtPnBpeGVscyA9ICgqKigqKlNETF9EaXNwbGF5KS5nZFBNYXApLmJhc2VBZGRyOwotCQl0aGlzLT5VcGRhdGVSZWN0cyA9IFJPTV9EaXJlY3RVcGRhdGU7Ci0JfSBlbHNlIHsKLQkJR1dvcmxkUHRyIG1lbXdvcmxkOwotCQlQaXhNYXBIYW5kbGUgcGl4bWFwOwotCQlpbnQgc3R5bGU7Ci0KLQkJc3R5bGUgPSBub0dyb3dEb2NQcm9jOwotCQlpZiAoIGZsYWdzICYgU0RMX05PRlJBTUUgKSB7Ci0JCQlzdHlsZSA9IHBsYWluREJveDsKLQkJCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9OT0ZSQU1FOwotCQl9IGVsc2UKLQkJaWYgKCBmbGFncyAmIFNETF9SRVNJWkFCTEUgKSB7Ci0JCQlzdHlsZSA9IHpvb21Eb2NQcm9jOwotCQkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX1JFU0laQUJMRTsKLQkJfQotCQlpZiAoIFNETF9XaW5kb3cgJiYgKHN0eWxlID09IGN1cnJlbnRfc3R5bGUpICkgewotCQkJLyogUmVzaXplIGV4aXN0aW5nIHdpbmRvdywgaWYgbmVjZXNzYXJ5ICovCi0JCQlpZiAoICgob3JlY3QucmlnaHQtb3JlY3QubGVmdCkgIT0gd2lkdGgpIHx8Ci0JCQkgICAgICgob3JlY3QuYm90dG9tLW9yZWN0LnRvcCkgIT0gaGVpZ2h0KSApIHsKLQkJCQlTaXplV2luZG93KFNETF9XaW5kb3csIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIFJlY3JlYXRlIHRoZSB3aW5kb3cgaW4gdGhlIG5ldyBzdHlsZSAqLwotCQkJaWYgKCBTRExfV2luZG93ICkgewotCQkJCURpc3Bvc2VXaW5kb3coU0RMX1dpbmRvdyk7Ci0JCQl9Ci0JCQlTRExfV2luZG93ID0gTmV3Q1dpbmRvdyhuaWwsICZ3cmVjdCwgIlxwIiwgdHJ1ZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLCAoV2luZG93UHRyKS0xLCB0cnVlLCAwKTsKLQotCQkJLyogU2V0IHRoZSB3aW5kb3cgdGl0bGUsIGlmIGFueSAqLwotCQkJeyBjaGFyICp0aXRsZTsKLQkJCQlTRExfV01fR2V0Q2FwdGlvbigmdGl0bGUsIE5VTEwpOwotCQkJCWlmICggdGl0bGUgKSB7Ci0JCQkJCU1hY19TZXRDYXB0aW9uKHRoaXMsIHRpdGxlLCBOVUxMKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY3VycmVudF9zdHlsZSA9IHN0eWxlOwotCQlTZXRQYWxldHRlKFNETF9XaW5kb3csIFNETF9DUGFsLCBmYWxzZSk7Ci0JCUFjdGl2YXRlUGFsZXR0ZShTRExfV2luZG93KTsKLQkJaWYgKCBOZXdHV29ybGQoJm1lbXdvcmxkLCAwLAotI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgotCQkJICAgICAgIEdldFdpbmRvd1BvcnRCb3VuZHMoU0RMX1dpbmRvdywgJnRtcHJlY3QpLAotI2Vsc2UKLQkJCSAgICAgICAmU0RMX1dpbmRvdy0+cG9ydFJlY3QsCi0jZW5kaWYKLQkJCSAgICAgICBTRExfQ1RhYiwgbmlsLCAwKSAhPSBub0VyciApIHsKLQkJCVNETF9TZXRFcnJvcigiTmV3R1dvcmxkKCkgZmFpbGVkIik7Ci0JCQlyZXR1cm4oTlVMTCk7Ci0JCX0KLQkJU2V0V1JlZkNvbihTRExfV2luZG93LCAobG9uZyltZW13b3JsZCk7Ci0JCXBpeG1hcCA9IEdldEdXb3JsZFBpeE1hcChtZW13b3JsZCk7Ci0JCUxvY2tQaXhlbHMocGl4bWFwKTsKLQkJY3VycmVudC0+cGl0Y2ggPSAoKipwaXhtYXApLnJvd0J5dGVzICYgMHgzRkZGOwotCQljdXJyZW50LT5waXhlbHMgPSBHZXRQaXhCYXNlQWRkcihwaXhtYXApOwotCQl0aGlzLT5VcGRhdGVSZWN0cyA9IFJPTV9XaW5kb3dVcGRhdGU7Ci0JfQotCVNldFBvcnRXaW5kb3dQb3J0KFNETF9XaW5kb3cpOwotCVNlbGVjdFdpbmRvdyhTRExfV2luZG93KTsKLQotCS8qIEhhbmRsZSBPcGVuR0wgc3VwcG9ydCAqLwotCWlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgewotCQlpZiAoIE1hY19HTF9Jbml0KHRoaXMpID09IDAgKSB7Ci0JCQljdXJyZW50LT5mbGFncyB8PSBTRExfT1BFTkdMOwotCQl9IGVsc2UgewotCQkJY3VycmVudCA9IE5VTEw7Ci0JCX0KLQl9Ci0JCi0JaWYgKCAoZmxhZ3MgJiBTRExfSFdQQUxFVFRFKSAmJiAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgKQotCSAgIGN1cnJlbnQtPmZsYWdzIHw9IFNETF9IV1BBTEVUVEU7Ci0JICAgCi0JLyogV2UncmUgbGl2ZSEgKi8KLQlyZXR1cm4oY3VycmVudCk7Ci19Ci0KLS8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCi1zdGF0aWMgaW50IFJPTV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuKC0xKTsKLX0KLXN0YXRpYyB2b2lkIFJPTV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm47Ci19Ci1zdGF0aWMgaW50IFJPTV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4oMCk7Ci19Ci1zdGF0aWMgdm9pZCBST01fVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIFJPTV9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCS8qIFRoZSBhcHBsaWNhdGlvbiBpcyBhbHJlYWR5IHVwZGF0aW5nIHRoZSB2aXNpYmxlIHZpZGVvIG1lbW9yeSAqLwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgUk9NX1dpbmRvd1VwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JR1dvcmxkUHRyIG1lbXdvcmxkOwotCUdyYWZQdHIgc2F2ZXBvcnQ7Ci0JQ0dyYWZQdHIgdGhlUG9ydDsKLQljb25zdCBCaXRNYXAgKm1lbUJpdHM7Ci0JY29uc3QgQml0TWFwICp3aW5CaXRzOwotCWludCBpOwotCVJlY3QgdXBkYXRlOwotCQotCS8qIENvcHkgZnJvbSB0aGUgb2Zmc2NyZWVuIEdXb3JsZCB0byB0aGUgd2luZG93IHBvcnQgKi8KLQlHZXRQb3J0KCZzYXZlcG9ydCk7Ci0JU2V0UG9ydFdpbmRvd1BvcnQoU0RMX1dpbmRvdyk7Ci0JdGhlUG9ydCA9IEdldFdpbmRvd1BvcnQoU0RMX1dpbmRvdyk7Ci0JbWVtd29ybGQgPSAoR1dvcmxkUHRyKUdldFdSZWZDb24oU0RMX1dpbmRvdyk7Ci0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICYmIEFDQ0VTU09SX0NBTExTX0FSRV9GVU5DVElPTlMKLQltZW1CaXRzID0gR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKChDR3JhZlB0cikgbWVtd29ybGQpOwotI2Vsc2UKLQltZW1CaXRzID0gJigoR3JhZlB0ciltZW13b3JsZCktPnBvcnRCaXRzOwotI2VuZGlmCi0jaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICYmIEFDQ0VTU09SX0NBTExTX0FSRV9GVU5DVElPTlMKLQl3aW5CaXRzID0gR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHRoZVBvcnQpOwotI2Vsc2UKLQl3aW5CaXRzID0gJlNETF9XaW5kb3ctPnBvcnRCaXRzOwotI2VuZGlmCi0JZm9yICggaT0wOyBpPG51bXJlY3RzOyArK2kgKSB7Ci0JCXVwZGF0ZS5sZWZ0ID0gcmVjdHNbaV0ueDsKLQkJdXBkYXRlLnJpZ2h0ID0gcmVjdHNbaV0ueCtyZWN0c1tpXS53OwotCQl1cGRhdGUudG9wID0gcmVjdHNbaV0ueTsKLQkJdXBkYXRlLmJvdHRvbSA9IHJlY3RzW2ldLnkrcmVjdHNbaV0uaDsKLQkJQ29weUJpdHMobWVtQml0cywgd2luQml0cywKLQkJCSAmdXBkYXRlLCAmdXBkYXRlLCBzcmNDb3B5LCBuaWwpOwotCX0KLSNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KLQlpZiAoIFFESXNQb3J0QnVmZmVyZWQodGhlUG9ydCkgKSB7Ci0JCVFERmx1c2hQb3J0QnVmZmVyKHRoZVBvcnQsIE5VTEwpOwotCX0KLSNlbmRpZgotCVNldFBvcnQoc2F2ZXBvcnQpOwotfQotCi1zdGF0aWMgaW50IFJPTV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0JQ1RhYkhhbmRsZSBjVGFiOwotCWludCBpOwotCi0JLyogR2V0IHRoZSBjb2xvcnRhYmxlIGZyb20gdGhlIGVpdGhlciB0aGUgZGlzcGxheSBvciB3aW5kb3cgKi8KLQlpZiAoICh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgewotCQljVGFiID0gKCoqKCoqU0RMX0Rpc3BsYXkpLmdkUE1hcCkucG1UYWJsZTsKLQl9IGVsc2UgewotCQljVGFiID0gU0RMX0NUYWI7Ci0JfQotCi0JLyogVmVyaWZ5IHRoZSByYW5nZSBvZiBjb2xvcnMgKi8KLQlpZiAoIChmaXJzdGNvbG9yK25jb2xvcnMpID4gKCgqKmNUYWIpLmN0U2l6ZSsxKSApIHsKLQkJcmV0dXJuKDApOwotCX0KLQkKLQkvKiBTZXQgdGhlIHNjcmVlbiBwYWxldHRlIGFuZCB1cGRhdGUgdGhlIGRpc3BsYXkgKi8KLQlmb3IgKCBpPTA7IGk8IG5jb2xvcnM7ICsraSApIHsKLQkgICAgICAgIGludCBqID0gZmlyc3Rjb2xvciArIGk7Ci0JCSgqKmNUYWIpLmN0VGFibGVbal0udmFsdWUgPSBqOwotCQkoKipjVGFiKS5jdFRhYmxlW2pdLnJnYi5yZWQgPSBjb2xvcnNbaV0uciA8PCA4IHwgY29sb3JzW2ldLnI7Ci0JCSgqKmNUYWIpLmN0VGFibGVbal0ucmdiLmdyZWVuID0gY29sb3JzW2ldLmcgPDwgOCB8IGNvbG9yc1tpXS5nOwotCQkoKipjVGFiKS5jdFRhYmxlW2pdLnJnYi5ibHVlID0gY29sb3JzW2ldLmIgPDwgOCB8IGNvbG9yc1tpXS5iOwotCX0KLQotI2lmIDAKLQlpZiAoICh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkKLSNlbmRpZgotCXsKLQkJR0RldmljZSAqKm9kaXNwbGF5OwotCQlvZGlzcGxheSA9IEdldEdEZXZpY2UoKTsKLQkJU2V0R0RldmljZShTRExfRGlzcGxheSk7Ci0JCVNldEVudHJpZXMoMCwgKCoqY1RhYikuY3RTaXplLCAoQ29sb3JTcGVjICopJigqKmNUYWIpLmN0VGFibGUpOwotCQlTZXRHRGV2aWNlKG9kaXNwbGF5KTsKLQl9Ci0JcmV0dXJuKDEpOwotfQotCi12b2lkIFJPTV9WaWRlb1F1aXQoX1RISVMpCi17Ci0JaW50IGk7Ci0KLQkvKiBGcmVlIGN1cnJlbnQgdmlkZW8gbW9kZSAqLwotCVJPTV9VbnNldFZpZGVvTW9kZSh0aGlzLCB0aGlzLT5zY3JlZW4pOwotCWlmICggU0RMX1dpbmRvdyApIHsKLQkJRGlzcG9zZVdpbmRvdyhTRExfV2luZG93KTsKLQkJU0RMX1dpbmRvdyA9IG5pbDsKLQl9Ci0KLQkvKiBGcmVlIHBhbGV0dGUgYW5kIHJlc3RvcmUgb3JpZ2luYWwgb25lICovCi0JaWYgKCBTRExfQ1RhYiAhPSBuaWwgKSB7Ci0JCURpc3Bvc2VIYW5kbGUoKEhhbmRsZSlTRExfQ1RhYik7Ci0JCVNETF9DVGFiID0gbmlsOwotCX0KLQlpZiAoIFNETF9DUGFsICE9IG5pbCApIHsKLQkJRGlzcG9zZVBhbGV0dGUoU0RMX0NQYWwpOwotCQlTRExfQ1BhbCA9IG5pbDsKLQl9Ci0JUmVzdG9yZURldmljZUNsdXQoR2V0TWFpbkRldmljZSgpKTsKLQotI2lmIFNETF9NQUNDTEFTU0lDX0dBTU1BX1NVUFBPUlQKLQlNYWNfUXVpdEdhbW1hKHRoaXMpOwotI2VuZGlmCi0KLQkvKiBGcmVlIGxpc3Qgb2YgdmlkZW8gbW9kZXMgKi8KLQlpZiAoIFNETF9tb2RlbGlzdCAhPSBOVUxMICkgewotCQlmb3IgKCBpPTA7IFNETF9tb2RlbGlzdFtpXTsgKytpICkgewotCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKLQkJfQotCQlTRExfZnJlZShTRExfbW9kZWxpc3QpOwotCQlTRExfbW9kZWxpc3QgPSBOVUxMOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYWNyb20vU0RMX3JvbXZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY3JvbS9TRExfcm9tdmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5MTBkNC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL21hY3JvbS9TRExfcm9tdmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfcm9tdmlkZW9faAotI2RlZmluZSBfU0RMX3JvbXZpZGVvX2gKLQotI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbG93dmlkZW8uaCIKLQotI2VuZGlmIC8qIF9TRExfcm9tdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYXRoX3ByaXZhdGUuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbWF0aF9wcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWE4NDYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tYXRoX3ByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi0gKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQotICogaXMgcHJlc2VydmVkLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLS8qCi0gKiBmcm9tOiBAKCMpZmRsaWJtLmggNS4xIDkzLzA5LzI0Ci0gKiAkSWQ6IG1hdGhfcHJpdmF0ZS5oIDE5NjkgMjAwNi0wMi0yNCAwOTo1NzoxNFogc2xvdWtlbiAkCi0gKi8KLQotI2lmbmRlZiBfTUFUSF9QUklWQVRFX0hfCi0jZGVmaW5lIF9NQVRIX1BSSVZBVEVfSF8KLQotI2luY2x1ZGUgIlNETF9uYW1lLmgiCi0jaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgotCi0jZGVmaW5lIGh1Z2UJCXJlYWxseV9iaWcgLyogaHVnZSBpcyBhIHJlc2VydmVkIGtleXdvcmQgaW4gVkMrKyA2LjAgKi8KLSNkZWZpbmUgdV9pbnQzMl90CXVpbnQzMl90Ci0KLS8qIFRoZSBvcmlnaW5hbCBmZGxpYm0gY29kZSB1c2VkIHN0YXRlbWVudHMgbGlrZToKLQluMCA9ICgoKihpbnQqKSZvbmUpPj4yOSleMTsJCSogaW5kZXggb2YgaGlnaCB3b3JkICoKLQlpeDAgPSAqKG4wKyhpbnQqKSZ4KTsJCQkqIGhpZ2ggd29yZCBvZiB4ICoKLQlpeDEgPSAqKCgxLW4wKSsoaW50KikmeCk7CQkqIGxvdyB3b3JkIG9mIHggKgotICAgdG8gZGlnIHR3byAzMiBiaXQgd29yZHMgb3V0IG9mIHRoZSA2NCBiaXQgSUVFRSBmbG9hdGluZyBwb2ludAotICAgdmFsdWUuICBUaGF0IGlzIG5vbi1BTlNJLCBhbmQsIG1vcmVvdmVyLCB0aGUgZ2NjIGluc3RydWN0aW9uCi0gICBzY2hlZHVsZXIgZ2V0cyBpdCB3cm9uZy4gIFdlIGluc3RlYWQgdXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zLgotICAgVW5saWtlIHRoZSBvcmlnaW5hbCBjb2RlLCB3ZSBkZXRlcm1pbmUgdGhlIGVuZGlhbm5lc3MgYXQgY29tcGlsZQotICAgdGltZSwgbm90IGF0IHJ1biB0aW1lOyBJIGRvbid0IHNlZSBtdWNoIGJlbmVmaXQgdG8gc2VsZWN0aW5nCi0gICBlbmRpYW5uZXNzIGF0IHJ1biB0aW1lLiAgKi8KLQotLyogQSB1bmlvbiB3aGljaCBwZXJtaXRzIHVzIHRvIGNvbnZlcnQgYmV0d2VlbiBhIGRvdWJsZSBhbmQgdHdvIDMyIGJpdAotICAgaW50cy4gICovCi0KLS8qCi0gKiBNYXRoIG9uIGFybSBpcyBzcGVjaWFsOgotICogRm9yIEZQQSwgZmxvYXQgd29yZHMgYXJlIGFsd2F5cyBiaWctZW5kaWFuLgotICogRm9yIFZGUCwgZmxvYXRzIHdvcmRzIGZvbGxvdyB0aGUgbWVtb3J5IHN5c3RlbSBtb2RlLgotICovCi0KLSNpZiAoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgfHwgXAotICAgICghZGVmaW5lZChfX1ZGUF9GUF9fKSAmJiAoZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fdGh1bWJfXykpKQotCi10eXBlZGVmIHVuaW9uCi17Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgc3RydWN0Ci0gIHsKLSAgICB1X2ludDMyX3QgbXN3OwotICAgIHVfaW50MzJfdCBsc3c7Ci0gIH0gcGFydHM7Ci19IGllZWVfZG91YmxlX3NoYXBlX3R5cGU7Ci0KLSNlbHNlCi0KLXR5cGVkZWYgdW5pb24KLXsKLSAgZG91YmxlIHZhbHVlOwotICBzdHJ1Y3QKLSAgewotICAgIHVfaW50MzJfdCBsc3c7Ci0gICAgdV9pbnQzMl90IG1zdzsKLSAgfSBwYXJ0czsKLX0gaWVlZV9kb3VibGVfc2hhcGVfdHlwZTsKLQotI2VuZGlmCi0KLS8qIEdldCB0d28gMzIgYml0IGludHMgZnJvbSBhIGRvdWJsZS4gICovCi0KLSNkZWZpbmUgRVhUUkFDVF9XT1JEUyhpeDAsaXgxLGQpCQkJCVwKLWRvIHsJCQkJCQkJCVwKLSAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBld191OwkJCQkJXAotICBld191LnZhbHVlID0gKGQpOwkJCQkJCVwKLSAgKGl4MCkgPSBld191LnBhcnRzLm1zdzsJCQkJCVwKLSAgKGl4MSkgPSBld191LnBhcnRzLmxzdzsJCQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qIEdldCB0aGUgbW9yZSBzaWduaWZpY2FudCAzMiBiaXQgaW50IGZyb20gYSBkb3VibGUuICAqLwotCi0jZGVmaW5lIEdFVF9ISUdIX1dPUkQoaSxkKQkJCQkJXAotZG8gewkJCQkJCQkJXAotICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIGdoX3U7CQkJCQlcCi0gIGdoX3UudmFsdWUgPSAoZCk7CQkJCQkJXAotICAoaSkgPSBnaF91LnBhcnRzLm1zdzsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0vKiBHZXQgdGhlIGxlc3Mgc2lnbmlmaWNhbnQgMzIgYml0IGludCBmcm9tIGEgZG91YmxlLiAgKi8KLQotI2RlZmluZSBHRVRfTE9XX1dPUkQoaSxkKQkJCQkJXAotZG8gewkJCQkJCQkJXAotICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIGdsX3U7CQkJCQlcCi0gIGdsX3UudmFsdWUgPSAoZCk7CQkJCQkJXAotICAoaSkgPSBnbF91LnBhcnRzLmxzdzsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0vKiBTZXQgYSBkb3VibGUgZnJvbSB0d28gMzIgYml0IGludHMuICAqLwotCi0jZGVmaW5lIElOU0VSVF9XT1JEUyhkLGl4MCxpeDEpCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0gIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgaXdfdTsJCQkJCVwKLSAgaXdfdS5wYXJ0cy5tc3cgPSAoaXgwKTsJCQkJCVwKLSAgaXdfdS5wYXJ0cy5sc3cgPSAoaXgxKTsJCQkJCVwKLSAgKGQpID0gaXdfdS52YWx1ZTsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0vKiBTZXQgdGhlIG1vcmUgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBhIGRvdWJsZSBmcm9tIGFuIGludC4gICovCi0KLSNkZWZpbmUgU0VUX0hJR0hfV09SRChkLHYpCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0gIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgc2hfdTsJCQkJCVwKLSAgc2hfdS52YWx1ZSA9IChkKTsJCQkJCQlcCi0gIHNoX3UucGFydHMubXN3ID0gKHYpOwkJCQkJCVwKLSAgKGQpID0gc2hfdS52YWx1ZTsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0vKiBTZXQgdGhlIGxlc3Mgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBhIGRvdWJsZSBmcm9tIGFuIGludC4gICovCi0KLSNkZWZpbmUgU0VUX0xPV19XT1JEKGQsdikJCQkJCVwKLWRvIHsJCQkJCQkJCVwKLSAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBzbF91OwkJCQkJXAotICBzbF91LnZhbHVlID0gKGQpOwkJCQkJCVwKLSAgc2xfdS5wYXJ0cy5sc3cgPSAodik7CQkJCQkJXAotICAoZCkgPSBzbF91LnZhbHVlOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qIEEgdW5pb24gd2hpY2ggcGVybWl0cyB1cyB0byBjb252ZXJ0IGJldHdlZW4gYSBmbG9hdCBhbmQgYSAzMiBiaXQKLSAgIGludC4gICovCi0KLXR5cGVkZWYgdW5pb24KLXsKLSAgZmxvYXQgdmFsdWU7Ci0gIHVfaW50MzJfdCB3b3JkOwotfSBpZWVlX2Zsb2F0X3NoYXBlX3R5cGU7Ci0KLS8qIEdldCBhIDMyIGJpdCBpbnQgZnJvbSBhIGZsb2F0LiAgKi8KLQotI2RlZmluZSBHRVRfRkxPQVRfV09SRChpLGQpCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0gIGllZWVfZmxvYXRfc2hhcGVfdHlwZSBnZl91OwkJCQkJXAotICBnZl91LnZhbHVlID0gKGQpOwkJCQkJCVwKLSAgKGkpID0gZ2ZfdS53b3JkOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qIFNldCBhIGZsb2F0IGZyb20gYSAzMiBiaXQgaW50LiAgKi8KLQotI2RlZmluZSBTRVRfRkxPQVRfV09SRChkLGkpCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0gIGllZWVfZmxvYXRfc2hhcGVfdHlwZSBzZl91OwkJCQkJXAotICBzZl91LndvcmQgPSAoaSk7CQkJCQkJXAotICAoZCkgPSBzZl91LnZhbHVlOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLQotI2lmZGVmIF9fU1REQ19fCi1zdGF0aWMgY29uc3QgZG91YmxlCi0jZWxzZQotc3RhdGljIGRvdWJsZQotI2VuZGlmCi16ZXJvICAgID0gIDAuMCwKLW9uZQk9ICAxLjAsCi10d28JPSAgMi4wLAotdHdvNTMJPSAgOTAwNzE5OTI1NDc0MDk5Mi4wLAkvKiAweDQzNDAwMDAwLCAweDAwMDAwMDAwICovCi10d281NCAgID0gIDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2LCAvKiAweDQzNTAwMDAwLCAweDAwMDAwMDAwICovCi10d29tNTQgID0gIDUuNTUxMTE1MTIzMTI1NzgyNzAyMTJlLTE3LCAvKiAweDNDOTAwMDAwLCAweDAwMDAwMDAwICovCi1odWdlICAgPSAxLjBlKzMwMCwKLXRpbnkgICA9IDEuMGUtMzAwOwotCi0jZW5kaWYgLyogX01BVEhfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tbXguaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbW14LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NmM0MzIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9tbXguaAorKysgL2Rldi9udWxsCkBAIC0xLDcwNCArMCwwIEBACi0vKgltbXguaAotCi0JTXVsdGlNZWRpYSBlWHRlbnNpb25zIEdDQyBpbnRlcmZhY2UgbGlicmFyeSBmb3IgSUEzMi4KLQotCVRvIHVzZSB0aGlzIGxpYnJhcnksIHNpbXBseSBpbmNsdWRlIHRoaXMgaGVhZGVyIGZpbGUKLQlhbmQgY29tcGlsZSB3aXRoIEdDQy4gIFlvdSBNVVNUIGhhdmUgaW5saW5pbmcgZW5hYmxlZAotCWluIG9yZGVyIGZvciBtbXhfb2soKSB0byB3b3JrOyB0aGlzIGNhbiBiZSBkb25lIGJ5Ci0Jc2ltcGx5IHVzaW5nIC1PIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLgotCi0JQ29tcGlsaW5nIHdpdGggLURNTVhfVFJBQ0Ugd2lsbCBjYXVzZSBkZXRhaWxlZCB0cmFjZQotCW91dHB1dCB0byBiZSBzZW50IHRvIHN0ZGVyciBmb3IgZWFjaCBtbXggb3BlcmF0aW9uLgotCVRoaXMgYWRkcyBsb3RzIG9mIGNvZGUsIGFuZCBvYnZpb3VzbHkgc2xvd3MgZXhlY3V0aW9uIHRvCi0JYSBjcmF3bCwgYnV0IGNhbiBiZSB2ZXJ5IHVzZWZ1bCBmb3IgZGVidWdnaW5nLgotCi0JVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZCi0JRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotCUxJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0JQU5EIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQkxOTk3LTk5IGJ5IEguIERpZXR6IGFuZCBSLiBGaXNoZXIKLQotIE5vdGVzOgotCUl0IGFwcGVhcnMgdGhhdCB0aGUgbGF0ZXN0IGdhcyBoYXMgdGhlIHBhbmQgcHJvYmxlbSBmaXhlZCwgdGhlcmVmb3JlCi0JICBJJ2xsIHVuZGVmaW5lIEJST0tFTl9QQU5EIGJ5IGRlZmF1bHQuCi0qLwotCi0jaWZuZGVmIF9NTVhfSAotI2RlZmluZSBfTU1YX0gKLQotCi0vKglXYXJuaW5nOiAgYXQgdGhpcyB3cml0aW5nLCB0aGUgdmVyc2lvbiBvZiBHQVMgcGFja2FnZWQKLQl3aXRoIG1vc3QgTGludXggZGlzdHJpYnV0aW9ucyBkb2VzIG5vdCBoYW5kbGUgdGhlCi0JcGFyYWxsZWwgQU5EIG9wZXJhdGlvbiBtbmVtb25pYyBjb3JyZWN0bHkuICBJZiB0aGUKLQlzeW1ib2wgQlJPS0VOX1BBTkQgaXMgZGVmaW5lZCwgYSBzbG93ZXIgYWx0ZXJuYXRpdmUKLQljb2Rpbmcgd2lsbCBiZSB1c2VkLiAgSWYgZXhlY3V0aW9uIG9mIG1teHRlc3QgcmVzdWx0cwotCWluIGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZmF1bHQsIGRlZmluZSB0aGlzIHN5bWJvbC4KLSovCi0jdW5kZWYJQlJPS0VOX1BBTkQKLQotCi0vKglUaGUgdHlwZSBvZiBhbiB2YWx1ZSB0aGF0IGZpdHMgaW4gYW4gTU1YIHJlZ2lzdGVyCi0JKG5vdGUgdGhhdCBsb25nIGxvbmcgY29uc3RhbnQgdmFsdWVzIE1VU1QgYmUgc3VmZml4ZWQKLQkgYnkgTEwgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZXMgYnkgVUxMLCBsZXN0Ci0JIHRoZXkgYmUgdHJ1bmNhdGVkIGJ5IHRoZSBjb21waWxlcikKLSovCi10eXBlZGVmCXVuaW9uIHsKLQlsb25nIGxvbmcJCXE7CS8qIFF1YWR3b3JkICg2NC1iaXQpIHZhbHVlICovCi0JdW5zaWduZWQgbG9uZyBsb25nCXVxOwkvKiBVbnNpZ25lZCBRdWFkd29yZCAqLwotCWludAkJCWRbMl07CS8qIDIgRG91Ymxld29yZCAoMzItYml0KSB2YWx1ZXMgKi8KLQl1bnNpZ25lZCBpbnQJCXVkWzJdOwkvKiAyIFVuc2lnbmVkIERvdWJsZXdvcmQgKi8KLQlzaG9ydAkJCXdbNF07CS8qIDQgV29yZCAoMTYtYml0KSB2YWx1ZXMgKi8KLQl1bnNpZ25lZCBzaG9ydAkJdXdbNF07CS8qIDQgVW5zaWduZWQgV29yZCAqLwotCWNoYXIJCQliWzhdOwkvKiA4IEJ5dGUgKDgtYml0KSB2YWx1ZXMgKi8KLQl1bnNpZ25lZCBjaGFyCQl1Yls4XTsJLyogOCBVbnNpZ25lZCBCeXRlICovCi0JZmxvYXQJCQlzWzJdOwkvKiBTaW5nbGUtcHJlY2lzaW9uICgzMi1iaXQpIHZhbHVlICovCi19IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg4KSkpIG1teF90OwkvKiBPbiBhbiA4LWJ5dGUgKDY0LWJpdCkgYm91bmRhcnkgKi8KLQotCi0jaWYgMAotLyoJRnVuY3Rpb24gdG8gdGVzdCBpZiBtdWx0aW1lZGlhIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLi4uCi0qLwotaW5saW5lIGV4dGVybiBpbnQKLW1tX3N1cHBvcnQodm9pZCkKLXsKLQkvKiBSZXR1cm5zIDEgaWYgTU1YIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLAotCSAgIDMgaWYgQ3lyaXggTU1YIGFuZCBFeHRlbmRlZCBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQKLQkgICA1IGlmIEFNRCBNTVggYW5kIDNETm93ISBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZAotCSAgIDAgaWYgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb2YgdGhlc2UKLQkqLwotCXJlZ2lzdGVyIGludCBydmFsID0gMDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJLyogU2VlIGlmIENQVUlEIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCAuLi4gKi8KLQkJLyogLi4uIEdldCBjb3BpZXMgb2YgRUZMQUdTIGludG8gZWF4IGFuZCBlY3ggKi8KLQkJInB1c2hmXG5cdCIKLQkJInBvcGwgJSVlYXhcblx0IgotCQkibW92bCAlJWVheCwgJSVlY3hcblx0IgotCi0JCS8qIC4uLiBUb2dnbGUgdGhlIElEIGJpdCBpbiBvbmUgY29weSBhbmQgc3RvcmUgKi8KLQkJLyogICAgIHRvIHRoZSBFRkxBR1MgcmVnICovCi0JCSJ4b3JsICQweDIwMDAwMCwgJSVlYXhcblx0IgotCQkicHVzaCAlJWVheFxuXHQiCi0JCSJwb3BmXG5cdCIKLQotCQkvKiAuLi4gR2V0IHRoZSAoaG9wZWZ1bGx5IG1vZGlmaWVkKSBFRkxBR1MgKi8KLQkJInB1c2hmXG5cdCIKLQkJInBvcGwgJSVlYXhcblx0IgotCi0JCS8qIC4uLiBDb21wYXJlIGFuZCB0ZXN0IHJlc3VsdCAqLwotCQkieG9ybCAlJWVheCwgJSVlY3hcblx0IgotCQkidGVzdGwgJDB4MjAwMDAwLCAlJWVjeFxuXHQiCi0JCSJqeiBOb3RTdXBwb3J0ZWQxXG5cdCIJCS8qIENQVUlEIG5vdCBzdXBwb3J0ZWQgKi8KLQotCi0JCS8qIEdldCBzdGFuZGFyZCBDUFVJRCBpbmZvcm1hdGlvbiwgYW5kCi0JCSAgICAgICBnbyB0byBhIHNwZWNpZmljIHZlbmRvciBzZWN0aW9uICovCi0JCSJtb3ZsICQwLCAlJWVheFxuXHQiCi0JCSJjcHVpZFxuXHQiCi0KLQkJLyogQ2hlY2sgZm9yIEludGVsICovCi0JCSJjbXBsICQweDc1NmU2NTQ3LCAlJWVieFxuXHQiCi0JCSJqbmUgVHJ5QU1EXG5cdCIKLQkJImNtcGwgJDB4NDk2NTZlNjksICUlZWR4XG5cdCIKLQkJImpuZSBUcnlBTURcblx0IgotCQkiY21wbCAkMHg2YzY1NzQ2ZSwgJSVlY3hcbiIKLQkJImpuZSBUcnlBTURcblx0IgotCQkiam1wIEludGVsXG5cdCIKLQotCQkvKiBDaGVjayBmb3IgQU1EICovCi0JCSJcblRyeUFNRDpcblx0IgotCQkiY21wbCAkMHg2ODc0NzU0MSwgJSVlYnhcblx0IgotCQkiam5lIFRyeUN5cml4XG5cdCIKLQkJImNtcGwgJDB4Njk3NDZlNjUsICUlZWR4XG5cdCIKLQkJImpuZSBUcnlDeXJpeFxuXHQiCi0JCSJjbXBsICQweDQ0NGQ0MTYzLCAlJWVjeFxuIgotCQkiam5lIFRyeUN5cml4XG5cdCIKLQkJImptcCBBTURcblx0IgotCi0JCS8qIENoZWNrIGZvciBDeXJpeCAqLwotCQkiXG5UcnlDeXJpeDpcblx0IgotCQkiY21wbCAkMHg2OTcyNzk0MywgJSVlYnhcblx0IgotCQkiam5lIE5vdFN1cHBvcnRlZDJcblx0IgotCQkiY21wbCAkMHg3MzZlNDk3OCwgJSVlZHhcblx0IgotCQkiam5lIE5vdFN1cHBvcnRlZDNcblx0IgotCQkiY21wbCAkMHg2NDYxNjU3NCwgJSVlY3hcblx0IgotCQkiam5lIE5vdFN1cHBvcnRlZDRcblx0IgotCQkvKiBEcm9wIHRocm91Z2ggdG8gQ3lyaXguLi4gKi8KLQotCi0JCS8qIEN5cml4IFNlY3Rpb24gKi8KLQkJLyogU2VlIGlmIGV4dGVuZGVkIENQVUlEIGxldmVsIDgwMDAwMDAxIGlzIHN1cHBvcnRlZCAqLwotCQkvKiBUaGUgdmFsdWUgb2YgQ1BVSUQvODAwMDAwMDEgZm9yIHRoZSA2eDg2TVggaXMgdW5kZWZpbmVkCi0JCSAgIGFjY29yZGluZyB0byB0aGUgQ3lyaXggQ1BVIERldGVjdGlvbiBHdWlkZSAoUHJlbGltaW5hcnkKLQkJICAgUmV2LiAxLjAxIHRhYmxlIDEpLCBzbyB3ZSdsbCBjaGVjayB0aGUgdmFsdWUgb2YgZWF4IGZvcgotCQkgICBDUFVJRC8wIHRvIHNlZSBpZiBzdGFuZGFyZCBDUFVJRCBsZXZlbCAyIGlzIHN1cHBvcnRlZC4KLQkJICAgQWNjb3JkaW5nIHRvIHRoZSB0YWJsZSwgdGhlIG9ubHkgQ1BVIHdoaWNoIHN1cHBvcnRzIGxldmVsCi0JCSAgIDIgaXMgYWxzbyB0aGUgb25seSBvbmUgd2hpY2ggc3VwcG9ydHMgZXh0ZW5kZWQgQ1BVSUQgbGV2ZWxzLgotCQkqLwotCQkiY21wbCAkMHgyLCAlJWVheFxuXHQiCi0JCSJqbmUgTU1YdGVzdFxuXHQiCS8qIFVzZSBzdGFuZGFyZCBDUFVJRCBpbnN0ZWFkICovCi0KLQkJLyogRXh0ZW5kZWQgQ1BVSUQgc3VwcG9ydGVkIChpbiB0aGVvcnkpLCBzbyBnZXQgZXh0ZW5kZWQKLQkJICAgZmVhdHVyZXMgKi8KLQkJIm1vdmwgJDB4ODAwMDAwMDEsICUlZWF4XG5cdCIKLQkJImNwdWlkXG5cdCIKLQkJInRlc3RsICQweDAwODAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLwotCQkianogTm90U3VwcG9ydGVkNVxuXHQiCQkvKiBNTVggbm90IHN1cHBvcnRlZCAqLwotCQkidGVzdGwgJDB4MDEwMDAwMDAsICUlZWF4XG5cdCIJLyogVGVzdCBmb3IgRXh0J2QgTU1YICovCi0JCSJqbnogRU1NWFN1cHBvcnRlZFxuXHQiCi0JCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCi0JCSJqbXAgUmV0dXJuXG5cbiIKLQkJIkVNTVhTdXBwb3J0ZWQ6XG5cdCIKLQkJIm1vdmwgJDMsICUwOlxuXG5cdCIJCS8qIEVNTVggYW5kIE1NWCBTdXBwb3J0ZWQgKi8KLQkJImptcCBSZXR1cm5cblx0IgotCi0KLQkJLyogQU1EIFNlY3Rpb24gKi8KLQkJIkFNRDpcblx0IgotCi0JCS8qIFNlZSBpZiBleHRlbmRlZCBDUFVJRCBpcyBzdXBwb3J0ZWQgKi8KLQkJIm1vdmwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKLQkJImNwdWlkXG5cdCIKLQkJImNtcGwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKLQkJImpsIE1NWHRlc3Rcblx0IgkvKiBVc2Ugc3RhbmRhcmQgQ1BVSUQgaW5zdGVhZCAqLwotCi0JCS8qIEV4dGVuZGVkIENQVUlEIHN1cHBvcnRlZCwgc28gZ2V0IGV4dGVuZGVkIGZlYXR1cmVzICovCi0JCSJtb3ZsICQweDgwMDAwMDAxLCAlJWVheFxuXHQiCi0JCSJjcHVpZFxuXHQiCi0JCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KLQkJImp6IE5vdFN1cHBvcnRlZDZcblx0IgkJLyogTU1YIG5vdCBzdXBwb3J0ZWQgKi8KLQkJInRlc3RsICQweDgwMDAwMDAwLCAlJWVkeFxuXHQiCS8qIFRlc3QgZm9yIDNETm93ISAqLwotCQkiam56IFRocmVlRE5vd1N1cHBvcnRlZFxuXHQiCi0JCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCi0JCSJqbXAgUmV0dXJuXG5cbiIKLQkJIlRocmVlRE5vd1N1cHBvcnRlZDpcblx0IgotCQkibW92bCAkNSwgJTA6XG5cblx0IgkJLyogM0ROb3chIGFuZCBNTVggU3VwcG9ydGVkICovCi0JCSJqbXAgUmV0dXJuXG5cdCIKLQotCi0JCS8qIEludGVsIFNlY3Rpb24gKi8KLQkJIkludGVsOlxuXHQiCi0KLQkJLyogQ2hlY2sgZm9yIE1NWCAqLwotCQkiTU1YdGVzdDpcblx0IgotCQkibW92bCAkMSwgJSVlYXhcblx0IgotCQkiY3B1aWRcblx0IgotCQkidGVzdGwgJDB4MDA4MDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgTU1YICovCi0JCSJqeiBOb3RTdXBwb3J0ZWQ3XG5cdCIJCS8qIE1NWCBOb3Qgc3VwcG9ydGVkICovCi0JCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCi0JCSJqbXAgUmV0dXJuXG5cdCIKLQotCQkvKiBOb3RoaW5nIHN1cHBvcnRlZCAqLwotCQkiXG5Ob3RTdXBwb3J0ZWQxOlxuXHQiCi0JCSIjbW92bCAkMTAxLCAlMDpcblxuXHQiCi0JCSJcbk5vdFN1cHBvcnRlZDI6XG5cdCIKLQkJIiNtb3ZsICQxMDIsICUwOlxuXG5cdCIKLQkJIlxuTm90U3VwcG9ydGVkMzpcblx0IgotCQkiI21vdmwgJDEwMywgJTA6XG5cblx0IgotCQkiXG5Ob3RTdXBwb3J0ZWQ0OlxuXHQiCi0JCSIjbW92bCAkMTA0LCAlMDpcblxuXHQiCi0JCSJcbk5vdFN1cHBvcnRlZDU6XG5cdCIKLQkJIiNtb3ZsICQxMDUsICUwOlxuXG5cdCIKLQkJIlxuTm90U3VwcG9ydGVkNjpcblx0IgotCQkiI21vdmwgJDEwNiwgJTA6XG5cblx0IgotCQkiXG5Ob3RTdXBwb3J0ZWQ3OlxuXHQiCi0JCSIjbW92bCAkMTA3LCAlMDpcblxuXHQiCi0JCSJtb3ZsICQwLCAlMDpcblxuXHQiCi0KLQkJIlJldHVybjpcblx0IgotCQk6ICI9YSIgKHJ2YWwpCi0JCTogLyogbm8gaW5wdXQgKi8KLQkJOiAiZWF4IiwgImVieCIsICJlY3giLCAiZWR4IgotCSk7Ci0KLQkvKiBSZXR1cm4gKi8KLQlyZXR1cm4ocnZhbCk7Ci19Ci0KLS8qCUZ1bmN0aW9uIHRvIHRlc3QgaWYgbW14IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLi4uCi0qLwotaW5saW5lIGV4dGVybiBpbnQKLW1teF9vayh2b2lkKQotewotCS8qIFJldHVybnMgMSBpZiBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQsIDAgb3RoZXJ3aXNlICovCi0JcmV0dXJuICggbW1fc3VwcG9ydCgpICYgMHgxICk7Ci19Ci0jZW5kaWYKLQotLyoJSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIGluc3RydWN0aW9uIG1hY3JvcyB0aGF0IGZvbGxvdy4uLgotCShub3RlIHRoYXQgbWVtb3J5LXRvLXJlZ2lzdGVyLCBtMnIsIGluc3RydWN0aW9ucyBhcmUgbmVhcmx5Ci0JIGFzIGVmZmljaWVudCBhcyByZWdpc3Rlci10by1yZWdpc3RlciwgcjJyLCBpbnN0cnVjdGlvbnM7Ci0JIGhvd2V2ZXIsIG1lbW9yeS10by1tZW1vcnkgaW5zdHJ1Y3Rpb25zIGFyZSByZWFsbHkgc2ltdWxhdGVkCi0JIGFzIGEgY29udmVuaWVuY2UsIGFuZCBhcmUgb25seSAxLzMgYXMgZWZmaWNpZW50KQotKi8KLSNpZmRlZglNTVhfVFJBQ0UKLQotLyoJSW5jbHVkZSB0aGUgc3R1ZmYgZm9yIHByaW50aW5nIGEgdHJhY2UgdG8gc3RkZXJyLi4uCi0qLwotCi0jZGVmaW5lCW1teF9pMnIob3AsIGltbSwgcmVnKSBcCi0JeyBcCi0JCW1teF90IG1teF90cmFjZTsgXAotCQltbXhfdHJhY2UudXEgPSAoaW1tKTsgXAotCQlwcmludGYoI29wICJfaTJyKCIgI2ltbSAiPTB4JTA4eCUwOHgsICIsIFwKLQkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCi0JCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKLQkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAotCQlwcmludGYoI3JlZyAiPTB4JTA4eCUwOHgpID0+ICIsIFwKLQkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCi0JCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKLQkJCQkgICAgICA6ICJYIiAoaW1tKSk7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCi0JCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKLQkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAotCQlwcmludGYoI3JlZyAiPTB4JTA4eCUwOHhcbiIsIFwKLQkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKLQl9Ci0KLSNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKLQl7IFwKLQkJbW14X3QgbW14X3RyYWNlOyBcCi0JCW1teF90cmFjZSA9IChtZW0pOyBcCi0JCXByaW50Zigjb3AgIl9tMnIoIiAjbWVtICI9MHglMDh4JTA4eCwgIiwgXAotCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKLQkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAotCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCi0JCXByaW50ZigjcmVnICI9MHglMDh4JTA4eCkgPT4gIiwgXAotCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKLQkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAotCQkJCSAgICAgIDogIlgiIChtZW0pKTsgXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKLQkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAotCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCi0JCXByaW50ZigjcmVnICI9MHglMDh4JTA4eFxuIiwgXAotCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAotCX0KLQotI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAotCXsgXAotCQltbXhfdCBtbXhfdHJhY2U7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCi0JCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKLQkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAotCQlwcmludGYoI29wICJfcjJtKCIgI3JlZyAiPTB4JTA4eCUwOHgsICIsIFwKLQkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKLQkJbW14X3RyYWNlID0gKG1lbSk7IFwKLQkJcHJpbnRmKCNtZW0gIj0weCUwOHglMDh4KSA9PiAiLCBcCi0JCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAotCQkJCSAgICAgIDogIj1YIiAobWVtKSBcCi0JCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKLQkJbW14X3RyYWNlID0gKG1lbSk7IFwKLQkJcHJpbnRmKCNtZW0gIj0weCUwOHglMDh4XG4iLCBcCi0JCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCi0JfQotCi0jZGVmaW5lCW1teF9yMnIob3AsIHJlZ3MsIHJlZ2QpIFwKLQl7IFwKLQkJbW14X3QgbW14X3RyYWNlOyBcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ3MgIiwgJTAiIFwKLQkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAotCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCi0JCXByaW50Zigjb3AgIl9yMnIoIiAjcmVncyAiPTB4JTA4eCUwOHgsICIsIFwKLQkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnZCAiLCAlMCIgXAotCQkJCSAgICAgIDogIj1YIiAobW14X3RyYWNlKSBcCi0JCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKLQkJcHJpbnRmKCNyZWdkICI9MHglMDh4JTA4eCkgPT4gIiwgXAotCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpOyBcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKLQkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAotCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCi0JCXByaW50ZigjcmVnZCAiPTB4JTA4eCUwOHhcbiIsIFwKLQkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKLQl9Ci0KLSNkZWZpbmUJbW14X20ybShvcCwgbWVtcywgbWVtZCkgXAotCXsgXAotCQltbXhfdCBtbXhfdHJhY2U7IFwKLQkJbW14X3RyYWNlID0gKG1lbXMpOyBcCi0JCXByaW50Zigjb3AgIl9tMm0oIiAjbWVtcyAiPTB4JTA4eCUwOHgsICIsIFwKLQkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKLQkJbW14X3RyYWNlID0gKG1lbWQpOyBcCi0JCXByaW50ZigjbWVtZCAiPTB4JTA4eCUwOHgpID0+ICIsIFwKLQkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKLQkJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCi0JCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCi0JCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCi0JCQkJICAgICAgOiAiWCIgKG1lbXMpKTsgXAotCQltbXhfdHJhY2UgPSAobWVtZCk7IFwKLQkJcHJpbnRmKCNtZW1kICI9MHglMDh4JTA4eFxuIiwgXAotCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAotCX0KLQotI2Vsc2UKLQotLyoJVGhlc2UgbWFjcm9zIGFyZSBhIGxvdCBzaW1wbGVyIHdpdGhvdXQgdGhlIHRyYWNpbmcuLi4KLSovCi0KLSNkZWZpbmUJbW14X2kycihvcCwgaW1tLCByZWcpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKLQkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCi0JCQkgICAgICA6ICJYIiAoaW1tKSApCi0KLSNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKLQkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCi0JCQkgICAgICA6ICJtIiAobWVtKSkKLQotI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAotCQkJICAgICAgOiAiPVgiIChtZW0pIFwKLQkJCSAgICAgIDogLyogbm90aGluZyAqLyApCi0KLSNkZWZpbmUJbW14X3IycihvcCwgcmVncywgcmVnZCkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlIiAjcmVncyAiLCAlIiAjcmVnZCkKLQotI2RlZmluZQltbXhfbTJtKG9wLCBtZW1zLCBtZW1kKSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKLQkJCSAgICAgICNvcCAiICUxLCAlJW1tMFxuXHQiIFwKLQkJCSAgICAgICJtb3ZxICUlbW0wLCAlMCIgXAotCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCi0JCQkgICAgICA6ICJYIiAobWVtcykpCi0KLSNlbmRpZgotCi0KLS8qCTF4NjQgTU9WZSBRdWFkd29yZAotCSh0aGlzIGlzIGJvdGggYSBsb2FkIGFuZCBhIHN0b3JlLi4uCi0JIGluIGZhY3QsIGl0IGlzIHRoZSBvbmx5IHdheSB0byBzdG9yZSkKLSovCi0jZGVmaW5lCW1vdnFfbTJyKHZhciwgcmVnKQltbXhfbTJyKG1vdnEsIHZhciwgcmVnKQotI2RlZmluZQltb3ZxX3IybShyZWcsIHZhcikJbW14X3IybShtb3ZxLCByZWcsIHZhcikKLSNkZWZpbmUJbW92cV9yMnIocmVncywgcmVnZCkJbW14X3Iycihtb3ZxLCByZWdzLCByZWdkKQotI2RlZmluZQltb3ZxKHZhcnMsIHZhcmQpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJTEsICUlbW0wXG5cdCIgXAotCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCi0JCQkgICAgICA6ICI9WCIgKHZhcmQpIFwKLQkJCSAgICAgIDogIlgiICh2YXJzKSkKLQotCi0vKgkxeDMyIE1PVmUgRG91Ymxld29yZAotCShsaWtlIG1vdnEsIHRoaXMgaXMgYm90aCBsb2FkIGFuZCBzdG9yZS4uLgotCSBidXQgaXMgbW9zdCB1c2VmdWwgZm9yIG1vdmluZyB0aGluZ3MgYmV0d2VlbgotCSBtbXggcmVnaXN0ZXJzIGFuZCBvcmRpbmFyeSByZWdpc3RlcnMpCi0qLwotI2RlZmluZQltb3ZkX20ycih2YXIsIHJlZykJbW14X20ycihtb3ZkLCB2YXIsIHJlZykKLSNkZWZpbmUJbW92ZF9yMm0ocmVnLCB2YXIpCW1teF9yMm0obW92ZCwgcmVnLCB2YXIpCi0jZGVmaW5lCW1vdmRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIobW92ZCwgcmVncywgcmVnZCkKLSNkZWZpbmUJbW92ZCh2YXJzLCB2YXJkKSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZkICUxLCAlJW1tMFxuXHQiIFwKLQkJCSAgICAgICJtb3ZkICUlbW0wLCAlMCIgXAotCQkJICAgICAgOiAiPVgiICh2YXJkKSBcCi0JCQkgICAgICA6ICJYIiAodmFycykpCi0KLQotLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBBRERzCi0qLwotI2RlZmluZQlwYWRkZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGQsIHZhciwgcmVnKQotI2RlZmluZQlwYWRkZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkZCwgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFkZGQodmFycywgdmFyZCkJbW14X20ybShwYWRkZCwgdmFycywgdmFyZCkKLQotI2RlZmluZQlwYWRkd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHcsIHZhciwgcmVnKQotI2RlZmluZQlwYWRkd19yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkdywgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFkZHcodmFycywgdmFyZCkJbW14X20ybShwYWRkdywgdmFycywgdmFyZCkKLQotI2RlZmluZQlwYWRkYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGIsIHZhciwgcmVnKQotI2RlZmluZQlwYWRkYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkYiwgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFkZGIodmFycywgdmFyZCkJbW14X20ybShwYWRkYiwgdmFycywgdmFyZCkKLQotCi0vKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgQUREcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKLSovCi0jZGVmaW5lCXBhZGRzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHN3LCB2YXIsIHJlZykKLSNkZWZpbmUJcGFkZHN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzdywgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFkZHN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHN3LCB2YXJzLCB2YXJkKQotCi0jZGVmaW5lCXBhZGRzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHNiLCB2YXIsIHJlZykKLSNkZWZpbmUJcGFkZHNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzYiwgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFkZHNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHNiLCB2YXJzLCB2YXJkKQotCi0KLS8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBBRERzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYwotKi8KLSNkZWZpbmUJcGFkZHVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzdywgdmFyLCByZWcpCi0jZGVmaW5lCXBhZGR1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzdywgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFkZHVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c3csIHZhcnMsIHZhcmQpCi0KLSNkZWZpbmUJcGFkZHVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzYiwgdmFyLCByZWcpCi0jZGVmaW5lCXBhZGR1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzYiwgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFkZHVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c2IsIHZhcnMsIHZhcmQpCi0KLQotLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBTVUJzCi0qLwotI2RlZmluZQlwc3ViZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmQsIHZhciwgcmVnKQotI2RlZmluZQlwc3ViZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViZCwgcmVncywgcmVnZCkKLSNkZWZpbmUJcHN1YmQodmFycywgdmFyZCkJbW14X20ybShwc3ViZCwgdmFycywgdmFyZCkKLQotI2RlZmluZQlwc3Vid19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YncsIHZhciwgcmVnKQotI2RlZmluZQlwc3Vid19yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3VidywgcmVncywgcmVnZCkKLSNkZWZpbmUJcHN1YncodmFycywgdmFyZCkJbW14X20ybShwc3VidywgdmFycywgdmFyZCkKLQotI2RlZmluZQlwc3ViYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmIsIHZhciwgcmVnKQotI2RlZmluZQlwc3ViYl9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViYiwgcmVncywgcmVnZCkKLSNkZWZpbmUJcHN1YmIodmFycywgdmFyZCkJbW14X20ybShwc3ViYiwgdmFycywgdmFyZCkKLQotCi0vKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgU1VCcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKLSovCi0jZGVmaW5lCXBzdWJzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnN3LCB2YXIsIHJlZykKLSNkZWZpbmUJcHN1YnN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzdywgcmVncywgcmVnZCkKLSNkZWZpbmUJcHN1YnN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnN3LCB2YXJzLCB2YXJkKQotCi0jZGVmaW5lCXBzdWJzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnNiLCB2YXIsIHJlZykKLSNkZWZpbmUJcHN1YnNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzYiwgcmVncywgcmVnZCkKLSNkZWZpbmUJcHN1YnNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnNiLCB2YXJzLCB2YXJkKQotCi0KLS8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBTVUJzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYwotKi8KLSNkZWZpbmUJcHN1YnVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzdywgdmFyLCByZWcpCi0jZGVmaW5lCXBzdWJ1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzdywgcmVncywgcmVnZCkKLSNkZWZpbmUJcHN1YnVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c3csIHZhcnMsIHZhcmQpCi0KLSNkZWZpbmUJcHN1YnVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzYiwgdmFyLCByZWcpCi0jZGVmaW5lCXBzdWJ1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzYiwgcmVncywgcmVnZCkKLSNkZWZpbmUJcHN1YnVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c2IsIHZhcnMsIHZhcmQpCi0KLQotLyoJNHgxNiBQYXJhbGxlbCBNVUxzIGdpdmluZyBMb3cgNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCi0qLwotI2RlZmluZQlwbXVsbHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxsdywgdmFyLCByZWcpCi0jZGVmaW5lCXBtdWxsd19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsbHcsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBtdWxsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxsdywgdmFycywgdmFyZCkKLQotCi0vKgk0eDE2IFBhcmFsbGVsIE1VTHMgZ2l2aW5nIEhpZ2ggNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCi0qLwotI2RlZmluZQlwbXVsaHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxodywgdmFyLCByZWcpCi0jZGVmaW5lCXBtdWxod19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsaHcsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBtdWxodyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxodywgdmFycywgdmFyZCkKLQotCi0vKgk0eDE2LT4yeDMyIFBhcmFsbGVsIE11bC1BREQKLQkobXVscyBsaWtlIHBtdWxsdywgdGhlbiBhZGRzIGFkamFjZW50IDE2LWJpdCBmaWVsZHMKLQkgaW4gdGhlIG11bHRpcGx5IHJlc3VsdCB0byBtYWtlIHRoZSBmaW5hbCAyeDMyIHJlc3VsdCkKLSovCi0jZGVmaW5lCXBtYWRkd2RfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtYWRkd2QsIHZhciwgcmVnKQotI2RlZmluZQlwbWFkZHdkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBtYWRkd2QsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBtYWRkd2QodmFycywgdmFyZCkJbW14X20ybShwbWFkZHdkLCB2YXJzLCB2YXJkKQotCi0KLS8qCTF4NjQgYml0d2lzZSBBTkQKLSovCi0jaWZkZWYJQlJPS0VOX1BBTkQKLSNkZWZpbmUJcGFuZF9tMnIodmFyLCByZWcpIFwKLQl7IFwKLQkJbW14X20ycihwYW5kbiwgKG1teF90KSAtMUxMLCByZWcpOyBcCi0JCW1teF9tMnIocGFuZG4sIHZhciwgcmVnKTsgXAotCX0KLSNkZWZpbmUJcGFuZF9yMnIocmVncywgcmVnZCkgXAotCXsgXAotCQltbXhfbTJyKHBhbmRuLCAobW14X3QpIC0xTEwsIHJlZ2QpOyBcCi0JCW1teF9yMnIocGFuZG4sIHJlZ3MsIHJlZ2QpIFwKLQl9Ci0jZGVmaW5lCXBhbmQodmFycywgdmFyZCkgXAotCXsgXAotCQltb3ZxX20ycih2YXJkLCBtbTApOyBcCi0JCW1teF9tMnIocGFuZG4sIChtbXhfdCkgLTFMTCwgbW0wKTsgXAotCQltbXhfbTJyKHBhbmRuLCB2YXJzLCBtbTApOyBcCi0JCW1vdnFfcjJtKG1tMCwgdmFyZCk7IFwKLQl9Ci0jZWxzZQotI2RlZmluZQlwYW5kX20ycih2YXIsIHJlZykJbW14X20ycihwYW5kLCB2YXIsIHJlZykKLSNkZWZpbmUJcGFuZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwYW5kLCByZWdzLCByZWdkKQotI2RlZmluZQlwYW5kKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFuZCwgdmFycywgdmFyZCkKLSNlbmRpZgotCi0KLS8qCTF4NjQgYml0d2lzZSBBTkQgd2l0aCBOb3QgdGhlIGRlc3RpbmF0aW9uCi0qLwotI2RlZmluZQlwYW5kbl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFuZG4sIHZhciwgcmVnKQotI2RlZmluZQlwYW5kbl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYW5kbiwgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFuZG4odmFycywgdmFyZCkJbW14X20ybShwYW5kbiwgdmFycywgdmFyZCkKLQotCi0vKgkxeDY0IGJpdHdpc2UgT1IKLSovCi0jZGVmaW5lCXBvcl9tMnIodmFyLCByZWcpCW1teF9tMnIocG9yLCB2YXIsIHJlZykKLSNkZWZpbmUJcG9yX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBvciwgcmVncywgcmVnZCkKLSNkZWZpbmUJcG9yKHZhcnMsIHZhcmQpCW1teF9tMm0ocG9yLCB2YXJzLCB2YXJkKQotCi0KLS8qCTF4NjQgYml0d2lzZSBlWGNsdXNpdmUgT1IKLSovCi0jZGVmaW5lCXB4b3JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB4b3IsIHZhciwgcmVnKQotI2RlZmluZQlweG9yX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHB4b3IsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXB4b3IodmFycywgdmFyZCkJbW14X20ybShweG9yLCB2YXJzLCB2YXJkKQotCi0KLS8qCTJ4MzIsIDR4MTYsIGFuZCA4eDggUGFyYWxsZWwgQ29NUGFyZSBmb3IgRVF1YWxpdHkKLQkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCi0qLwotI2RlZmluZQlwY21wZXFkX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZXFkLCB2YXIsIHJlZykKLSNkZWZpbmUJcGNtcGVxZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZXFkLCByZWdzLCByZWdkKQotI2RlZmluZQlwY21wZXFkKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGVxZCwgdmFycywgdmFyZCkKLQotI2RlZmluZQlwY21wZXF3X20ycih2YXIsIHJlZykJbW14X20ycihwY21wZXF3LCB2YXIsIHJlZykKLSNkZWZpbmUJcGNtcGVxd19yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZXF3LCByZWdzLCByZWdkKQotI2RlZmluZQlwY21wZXF3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGVxdywgdmFycywgdmFyZCkKLQotI2RlZmluZQlwY21wZXFiX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZXFiLCB2YXIsIHJlZykKLSNkZWZpbmUJcGNtcGVxYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZXFiLCByZWdzLCByZWdkKQotI2RlZmluZQlwY21wZXFiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGVxYiwgdmFycywgdmFyZCkKLQotCi0vKgkyeDMyLCA0eDE2LCBhbmQgOHg4IFBhcmFsbGVsIENvTVBhcmUgZm9yIEdyZWF0ZXIgVGhhbgotCShyZXN1bHRpbmcgZmllbGRzIGFyZSBlaXRoZXIgMCBvciAtMSkKLSovCi0jZGVmaW5lCXBjbXBndGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBjbXBndGQsIHZhciwgcmVnKQotI2RlZmluZQlwY21wZ3RkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBjbXBndGQsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBjbXBndGQodmFycywgdmFyZCkJbW14X20ybShwY21wZ3RkLCB2YXJzLCB2YXJkKQotCi0jZGVmaW5lCXBjbXBndHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBjbXBndHcsIHZhciwgcmVnKQotI2RlZmluZQlwY21wZ3R3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBjbXBndHcsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBjbXBndHcodmFycywgdmFyZCkJbW14X20ybShwY21wZ3R3LCB2YXJzLCB2YXJkKQotCi0jZGVmaW5lCXBjbXBndGJfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBjbXBndGIsIHZhciwgcmVnKQotI2RlZmluZQlwY21wZ3RiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBjbXBndGIsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBjbXBndGIodmFycywgdmFyZCkJbW14X20ybShwY21wZ3RiLCB2YXJzLCB2YXJkKQotCi0KLS8qCTF4NjQsIDJ4MzIsIGFuZCA0eDE2IFBhcmFsbGVsIFNoaWZ0IExlZnQgTG9naWNhbAotKi8KLSNkZWZpbmUJcHNsbHFfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzbGxxLCBpbW0sIHJlZykKLSNkZWZpbmUJcHNsbHFfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzbGxxLCB2YXIsIHJlZykKLSNkZWZpbmUJcHNsbHFfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNsbHEsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBzbGxxKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNsbHEsIHZhcnMsIHZhcmQpCi0KLSNkZWZpbmUJcHNsbGRfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzbGxkLCBpbW0sIHJlZykKLSNkZWZpbmUJcHNsbGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzbGxkLCB2YXIsIHJlZykKLSNkZWZpbmUJcHNsbGRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNsbGQsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBzbGxkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNsbGQsIHZhcnMsIHZhcmQpCi0KLSNkZWZpbmUJcHNsbHdfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzbGx3LCBpbW0sIHJlZykKLSNkZWZpbmUJcHNsbHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzbGx3LCB2YXIsIHJlZykKLSNkZWZpbmUJcHNsbHdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNsbHcsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBzbGx3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHNsbHcsIHZhcnMsIHZhcmQpCi0KLQotLyoJMXg2NCwgMngzMiwgYW5kIDR4MTYgUGFyYWxsZWwgU2hpZnQgUmlnaHQgTG9naWNhbAotKi8KLSNkZWZpbmUJcHNybHFfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmxxLCBpbW0sIHJlZykKLSNkZWZpbmUJcHNybHFfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmxxLCB2YXIsIHJlZykKLSNkZWZpbmUJcHNybHFfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNybHEsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBzcmxxKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNybHEsIHZhcnMsIHZhcmQpCi0KLSNkZWZpbmUJcHNybGRfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmxkLCBpbW0sIHJlZykKLSNkZWZpbmUJcHNybGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmxkLCB2YXIsIHJlZykKLSNkZWZpbmUJcHNybGRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNybGQsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBzcmxkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNybGQsIHZhcnMsIHZhcmQpCi0KLSNkZWZpbmUJcHNybHdfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmx3LCBpbW0sIHJlZykKLSNkZWZpbmUJcHNybHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmx3LCB2YXIsIHJlZykKLSNkZWZpbmUJcHNybHdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNybHcsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXBzcmx3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHNybHcsIHZhcnMsIHZhcmQpCi0KLQotLyoJMngzMiBhbmQgNHgxNiBQYXJhbGxlbCBTaGlmdCBSaWdodCBBcml0aG1ldGljCi0qLwotI2RlZmluZQlwc3JhZF9pMnIoaW1tLCByZWcpCW1teF9pMnIocHNyYWQsIGltbSwgcmVnKQotI2RlZmluZQlwc3JhZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHNyYWQsIHZhciwgcmVnKQotI2RlZmluZQlwc3JhZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3JhZCwgcmVncywgcmVnZCkKLSNkZWZpbmUJcHNyYWQodmFycywgdmFyZCkJbW14X20ybShwc3JhZCwgdmFycywgdmFyZCkKLQotI2RlZmluZQlwc3Jhd19pMnIoaW1tLCByZWcpCW1teF9pMnIocHNyYXcsIGltbSwgcmVnKQotI2RlZmluZQlwc3Jhd19tMnIodmFyLCByZWcpCW1teF9tMnIocHNyYXcsIHZhciwgcmVnKQotI2RlZmluZQlwc3Jhd19yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3JhdywgcmVncywgcmVnZCkKLSNkZWZpbmUJcHNyYXcodmFycywgdmFyZCkJbW14X20ybShwc3JhdywgdmFycywgdmFyZCkKLQotCi0vKgkyeDMyLT40eDE2IGFuZCA0eDE2LT44eDggUEFDSyBhbmQgU2lnbmVkIFNhdHVyYXRlCi0JKHBhY2tzIHNvdXJjZSBhbmQgZGVzdCBmaWVsZHMgaW50byBkZXN0IGluIHRoYXQgb3JkZXIpCi0qLwotI2RlZmluZQlwYWNrc3Nkd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFja3NzZHcsIHZhciwgcmVnKQotI2RlZmluZQlwYWNrc3Nkd19yMnIocmVncywgcmVnZCkgbW14X3IycihwYWNrc3NkdywgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFja3NzZHcodmFycywgdmFyZCkJbW14X20ybShwYWNrc3NkdywgdmFycywgdmFyZCkKLQotI2RlZmluZQlwYWNrc3N3Yl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFja3Nzd2IsIHZhciwgcmVnKQotI2RlZmluZQlwYWNrc3N3Yl9yMnIocmVncywgcmVnZCkgbW14X3IycihwYWNrc3N3YiwgcmVncywgcmVnZCkKLSNkZWZpbmUJcGFja3Nzd2IodmFycywgdmFyZCkJbW14X20ybShwYWNrc3N3YiwgdmFycywgdmFyZCkKLQotCi0vKgk0eDE2LT44eDggUEFDSyBhbmQgVW5zaWduZWQgU2F0dXJhdGUKLQkocGFja3Mgc291cmNlIGFuZCBkZXN0IGZpZWxkcyBpbnRvIGRlc3QgaW4gdGhhdCBvcmRlcikKLSovCi0jZGVmaW5lCXBhY2t1c3diX20ycih2YXIsIHJlZykJbW14X20ycihwYWNrdXN3YiwgdmFyLCByZWcpCi0jZGVmaW5lCXBhY2t1c3diX3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHBhY2t1c3diLCByZWdzLCByZWdkKQotI2RlZmluZQlwYWNrdXN3Yih2YXJzLCB2YXJkKQltbXhfbTJtKHBhY2t1c3diLCB2YXJzLCB2YXJkKQotCi0KLS8qCTJ4MzItPjF4NjQsIDR4MTYtPjJ4MzIsIGFuZCA4eDgtPjR4MTYgVU5QYUNLIExvdwotCShpbnRlcmxlYXZlcyBsb3cgaGFsZiBvZiBkZXN0IHdpdGggbG93IGhhbGYgb2Ygc291cmNlCi0JIGFzIHBhZGRpbmcgaW4gZWFjaCByZXN1bHQgZmllbGQpCi0qLwotI2RlZmluZQlwdW5wY2tsZHFfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB1bnBja2xkcSwgdmFyLCByZWcpCi0jZGVmaW5lCXB1bnBja2xkcV9yMnIocmVncywgcmVnZCkgbW14X3IycihwdW5wY2tsZHEsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXB1bnBja2xkcSh2YXJzLCB2YXJkKQltbXhfbTJtKHB1bnBja2xkcSwgdmFycywgdmFyZCkKLQotI2RlZmluZQlwdW5wY2tsd2RfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB1bnBja2x3ZCwgdmFyLCByZWcpCi0jZGVmaW5lCXB1bnBja2x3ZF9yMnIocmVncywgcmVnZCkgbW14X3IycihwdW5wY2tsd2QsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXB1bnBja2x3ZCh2YXJzLCB2YXJkKQltbXhfbTJtKHB1bnBja2x3ZCwgdmFycywgdmFyZCkKLQotI2RlZmluZQlwdW5wY2tsYndfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB1bnBja2xidywgdmFyLCByZWcpCi0jZGVmaW5lCXB1bnBja2xid19yMnIocmVncywgcmVnZCkgbW14X3IycihwdW5wY2tsYncsIHJlZ3MsIHJlZ2QpCi0jZGVmaW5lCXB1bnBja2xidyh2YXJzLCB2YXJkKQltbXhfbTJtKHB1bnBja2xidywgdmFycywgdmFyZCkKLQotCi0vKgkyeDMyLT4xeDY0LCA0eDE2LT4yeDMyLCBhbmQgOHg4LT40eDE2IFVOUGFDSyBIaWdoCi0JKGludGVybGVhdmVzIGhpZ2ggaGFsZiBvZiBkZXN0IHdpdGggaGlnaCBoYWxmIG9mIHNvdXJjZQotCSBhcyBwYWRkaW5nIGluIGVhY2ggcmVzdWx0IGZpZWxkKQotKi8KLSNkZWZpbmUJcHVucGNraGRxX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2toZHEsIHZhciwgcmVnKQotI2RlZmluZQlwdW5wY2toZHFfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNraGRxLCByZWdzLCByZWdkKQotI2RlZmluZQlwdW5wY2toZHEodmFycywgdmFyZCkJbW14X20ybShwdW5wY2toZHEsIHZhcnMsIHZhcmQpCi0KLSNkZWZpbmUJcHVucGNraHdkX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tod2QsIHZhciwgcmVnKQotI2RlZmluZQlwdW5wY2tod2RfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNraHdkLCByZWdzLCByZWdkKQotI2RlZmluZQlwdW5wY2tod2QodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tod2QsIHZhcnMsIHZhcmQpCi0KLSNkZWZpbmUJcHVucGNraGJ3X20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2toYncsIHZhciwgcmVnKQotI2RlZmluZQlwdW5wY2toYndfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNraGJ3LCByZWdzLCByZWdkKQotI2RlZmluZQlwdW5wY2toYncodmFycywgdmFyZCkJbW14X20ybShwdW5wY2toYncsIHZhcnMsIHZhcmQpCi0KLQotLyoJRW1wdHkgTU14IFN0YXRlCi0JKHVzZWQgdG8gY2xlYW4tdXAgd2hlbiBnb2luZyBmcm9tIG1teCB0byBmbG9hdCB1c2UKLQkgb2YgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBzaGFyZWQgYnkgYm90aDsgbm90ZSB0aGF0Ci0JIHRoZXJlIGlzIG5vIGZsb2F0LXRvLW1teCBvcGVyYXRpb24gbmVlZGVkLCBiZWNhdXNlCi0JIG9ubHkgdGhlIGZsb2F0IHRhZyB3b3JkIGluZm8gaXMgY29ycnVwdGlibGUpCi0qLwotI2lmZGVmCU1NWF9UUkFDRQotCi0jZGVmaW5lCWVtbXMoKSBcCi0JeyBcCi0JCXByaW50ZigiZW1tcygpXG4iKTsgXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVtbXMiKTsgXAotCX0KLQotI2Vsc2UKLQotI2RlZmluZQllbW1zKCkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVtbXMiKQotCi0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254ZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueGV2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjE5ODBkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254ZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEhzaWVoLUZ1IFRzYWkKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDIgIEdyZWcgSGFlcnIgPGdyZWdAY2Vuc29mdC5jb20+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSAgICAKLSAgICBIc2llaC1GdSBUc2FpCi0gICAgY2xhcmVAc2V0YWJveC5jb20KLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX2tleXN5bS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotI2luY2x1ZGUgIlNETF9ueGV2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX254aW1hZ2VfYy5oIgotCi0vLyBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBuYW5veCBrZXlzeW0gdG8gYSBTREwga2V5c3ltCi1zdGF0aWMgU0RMS2V5IE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfTEFTVCArIDFdIDsKLQotdm9pZCBOWF9Jbml0T1NLZXltYXAgKF9USElTKQotewotICAgIGludCBpIDsKLQotICAgIERwcmludGYgKCJlbnRlciBOWF9Jbml0T1NLZXltYXBcbiIpIDsKLQotICAgIC8vIE1hcCB0aGUgbmFub3ggc2NhbmNvZGVzIHRvIFNETCBrZXlzeW1zCi0gICAgZm9yIChpID0gMDsgaSA8IFNETF9hcnJheXNpemUgKE5YX05PTkFTQ0lJX2tleW1hcCk7ICsrIGkpCi0gICAgICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbaV0gPSBTRExLX1VOS05PV04gOwotCi0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9MRUZUICAgICAgICAmIDB4RkZdID0gU0RMS19MRUZUIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1JJR0hUICAgICAgICYgMHhGRl0gPSBTRExLX1JJR0hUIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1VQICAgICAgICAgICYgMHhGRl0gPSBTRExLX1VQIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0RPV04gICAgICAgICYgMHhGRl0gPSBTRExLX0RPV04gOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfSU5TRVJUICAgICAgJiAweEZGXSA9IFNETEtfSU5TRVJUIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0RFTEVURSAgICAgICYgMHhGRl0gPSBTRExLX0RFTEVURSA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9IT01FICAgICAgICAmIDB4RkZdID0gU0RMS19IT01FIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0VORCAgICAgICAgICYgMHhGRl0gPSBTRExLX0VORCA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9QQUdFVVAgICAgICAmIDB4RkZdID0gU0RMS19QQUdFVVAgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfUEFHRURPV04gICAgJiAweEZGXSA9IFNETEtfUEFHRURPV04gOwotCi0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUDAgICAgICAgICAmIDB4RkZdID0gU0RMS19LUDAgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfS1AxICAgICAgICAgJiAweEZGXSA9IFNETEtfS1AxIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQMiAgICAgICAgICYgMHhGRl0gPSBTRExLX0tQMiA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUDMgICAgICAgICAmIDB4RkZdID0gU0RMS19LUDMgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfS1A0ICAgICAgICAgJiAweEZGXSA9IFNETEtfS1A0IDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQNSAgICAgICAgICYgMHhGRl0gPSBTRExLX0tQNSA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUDYgICAgICAgICAmIDB4RkZdID0gU0RMS19LUDYgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfS1A3ICAgICAgICAgJiAweEZGXSA9IFNETEtfS1A3IDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQOCAgICAgICAgICYgMHhGRl0gPSBTRExLX0tQOCA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUDkgICAgICAgICAmIDB4RkZdID0gU0RMS19LUDkgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfS1BfUEVSSU9EICAgJiAweEZGXSA9IFNETEtfS1BfUEVSSU9EIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQX0RJVklERSAgICYgMHhGRl0gPSBTRExLX0tQX0RJVklERSA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUF9NVUxUSVBMWSAmIDB4RkZdID0gU0RMS19LUF9NVUxUSVBMWSA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUF9NSU5VUyAgICAmIDB4RkZdID0gU0RMS19LUF9NSU5VUyA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUF9QTFVTICAgICAmIDB4RkZdID0gU0RMS19LUF9QTFVTIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQX0VOVEVSICAgICYgMHhGRl0gPSBTRExLX0tQX0VOVEVSIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQX0VRVUFMUyAgICYgMHhGRl0gPSBTRExLX0tQX0VRVUFMUyA7Ci0KLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0YxICAgICAgICAgICYgMHhGRl0gPSBTRExLX0YxIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0YyICAgICAgICAgICYgMHhGRl0gPSBTRExLX0YyIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0YzICAgICAgICAgICYgMHhGRl0gPSBTRExLX0YzIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y0ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y0IDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y1ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y1IDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y2ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y2IDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y3ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y3IDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y4ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y4IDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y5ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y5IDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0YxMCAgICAgICAgICYgMHhGRl0gPSBTRExLX0YxMCA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9GMTEgICAgICAgICAmIDB4RkZdID0gU0RMS19GMTEgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfRjEyICAgICAgICAgJiAweEZGXSA9IFNETEtfRjEyIDsKLQotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfTlVNTE9DSyAgICAgJiAweEZGXSA9IFNETEtfTlVNTE9DSyA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9DQVBTTE9DSyAgICAmIDB4RkZdID0gU0RMS19DQVBTTE9DSyA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9TQ1JPTExPQ0sgICAmIDB4RkZdID0gU0RMS19TQ1JPTExPQ0sgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfTFNISUZUICAgICAgJiAweEZGXSA9IFNETEtfTFNISUZUIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1JTSElGVCAgICAgICYgMHhGRl0gPSBTRExLX1JTSElGVCA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9MQ1RSTCAgICAgICAmIDB4RkZdID0gU0RMS19MQ1RSTCA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9SQ1RSTCAgICAgICAmIDB4RkZdID0gU0RMS19SQ1RSTCA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9MQUxUICAgICAgICAmIDB4RkZdID0gU0RMS19MQUxUIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1JBTFQgICAgICAgICYgMHhGRl0gPSBTRExLX1JBTFQgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfTE1FVEEgICAgICAgJiAweEZGXSA9IFNETEtfTE1FVEEgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfUk1FVEEgICAgICAgJiAweEZGXSA9IFNETEtfUk1FVEEgOwotICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfQUxUR1IgICAgICAgJiAweEZGXSA9IFNETEtfTU9ERSA7Ci0KLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1BSSU5UICAgICAgICYgMHhGRl0gPSBTRExLX1BSSU5UIDsKLSAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1NZU1JFUSAgICAgICYgMHhGRl0gPSBTRExLX1NZU1JFUSA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9QQVVTRSAgICAgICAmIDB4RkZdID0gU0RMS19QQVVTRSA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9CUkVBSyAgICAgICAmIDB4RkZdID0gU0RMS19CUkVBSyA7Ci0gICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9NRU5VICAgICAgICAmIDB4RkZdID0gU0RMS19NRU5VIDsKLQotICAgIERwcmludGYgKCJsZWF2ZSBOWF9Jbml0T1NLZXltYXBcbiIpIDsKLX0KLQotU0RMX2tleXN5bSAqIE5YX1RyYW5zbGF0ZUtleSAoR1JfRVZFTlRfS0VZU1RST0tFICoga2V5c3Ryb2tlLCBTRExfa2V5c3ltICoga2V5c3ltKQotewotICAgIEdSX0tFWSBjaCA9IGtleXN0cm9rZSAtPiBjaCA7Ci0KLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfVHJhbnNsYXRlS2V5XG4iKSA7Ci0KLSAgICBrZXlzeW0gLT4gc2NhbmNvZGUgPSBrZXlzdHJva2UgLT4gc2NhbmNvZGUgOwotICAgIGtleXN5bSAtPiBzeW0gPSBTRExLX1VOS05PV04gOwotCi0gICAgaWYgKGNoICYgTVdLRVlfTk9OQVNDSUlfTUFTSykgewotICAgICAgICBrZXlzeW0gLT4gc3ltID0gTlhfTk9OQVNDSUlfa2V5bWFwIFtjaCAmIDB4RkZdIDsKLSAgICB9IGVsc2UgewotICAgICAgICBrZXlzeW0gLT4gc3ltID0gY2ggJiAweDdGIDsKLSAgICB9Ci0KLSAgICBrZXlzeW0gLT4gbW9kID0gS01PRF9OT05FIDsKLSAgICAKLSNpZiAxICAgLy8gICBSZXRyaWV2ZSBtb3JlIG1vZGUgaW5mb3JtYXRpb24KLSAgICB7Ci0gICAgICAgIEdSX0tFWU1PRCAgIG1vZCA9IGtleXN0cm9rZSAtPiBtb2RpZmllcnMgOwotCi0gICAgICAgIGlmIChtb2QgJiBNV0tNT0RfTFNISUZUKQotICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX0xTSElGVCA7Ci0gICAgICAgIGlmIChtb2QgJiBNV0tNT0RfUlNISUZUKQotICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX1JTSElGVCA7Ci0gICAgICAgIGlmIChtb2QgJiBNV0tNT0RfTENUUkwpCi0gICAgICAgICAgICBrZXlzeW0gLT4gbW9kIHw9IEtNT0RfTENUUkwgOwotICAgICAgICBpZiAobW9kICYgTVdLTU9EX1JDVFJMKQotICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX1JDVFJMIDsKLSAgICAgICAgaWYgKG1vZCAmIE1XS01PRF9MQUxUKQotICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX0xBTFQgOwotICAgICAgICBpZiAobW9kICYgTVdLTU9EX1JBTFQpCi0gICAgICAgICAgICBrZXlzeW0gLT4gbW9kIHw9IEtNT0RfUkFMVCA7Ci0gICAgICAgIGlmIChtb2QgJiBNV0tNT0RfTE1FVEEpCi0gICAgICAgICAgICBrZXlzeW0gLT4gbW9kIHw9IEtNT0RfTE1FVEEgOwotICAgICAgICBpZiAobW9kICYgTVdLTU9EX1JNRVRBKQotICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX1JNRVRBIDsKLSAgICAgICAgaWYgKG1vZCAmIE1XS01PRF9OVU0pCi0gICAgICAgICAgICBrZXlzeW0gLT4gbW9kIHw9IEtNT0RfTlVNIDsKLSAgICAgICAgaWYgKG1vZCAmIE1XS01PRF9DQVBTKQotICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX0NBUFMgOwotICAgICAgICBpZiAobW9kICYgTVdLTU9EX0FMVEdSKQotICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX01PREUgOwotICAgIH0KLSNlbmRpZgotCi0gICAga2V5c3ltIC0+IHVuaWNvZGUgPSBjaCA7Ci0KLSAgICBEcHJpbnRmICgibGVhdmUgTlhfVHJhbnNsYXRlS2V5XG4iKSA7Ci0gICAgcmV0dXJuIGtleXN5bSA7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfYm91bmRhcnkgKF9USElTLCBpbnQgeCwgaW50IHkpCi17Ci0gICAgaWYgKHggPCBPZmZzZXRYIHx8IHkgPCBPZmZzZXRZIHx8IHggPiBPZmZzZXRYICsgdGhpcyAtPiBzY3JlZW4gLT4gdyB8fAotICAgICAgICB5ID4gT2Zmc2V0WSArIHRoaXMgLT4gc2NyZWVuIC0+IGgpCi0gICAgICAgIHJldHVybiAwIDsKLSAgICAgICAgICAgIAotICAgIHJldHVybiAxIDsKLX0KLQotdm9pZCBOWF9QdW1wRXZlbnRzIChfVEhJUykKLXsKLSAgICBHUl9FVkVOVCAgICAgICAgIGV2ZW50IDsKLSAgICBzdGF0aWMgR1JfQlVUVE9OIGxhc3RfYnV0dG9uX2Rvd24gPSAwIDsKLQotICAgIEdyQ2hlY2tOZXh0RXZlbnQgKCYgZXZlbnQpIDsKLSAgICB3aGlsZSAoZXZlbnQudHlwZSAhPSBHUl9FVkVOVF9UWVBFX05PTkUpIHsKLQotICAgICAgICAvLyBkaXNwYXRjaCBldmVudAotICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9NT1VTRV9FTlRFUiA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRHByaW50ZiAoIm1vdXNlIGVudGVyXG4iKSA7Ci0gICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBNT1VTRUZPQ1VTKSA7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfTU9VU0VfRVhJVCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRHByaW50ZiAoIm1vdXNlIGV4aXRcbiIpIDsKLSAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMCwgU0RMX0FQUE1PVVNFRk9DVVMpIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9GT0NVU19JTiA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRHByaW50ZiAoImZvY3VzIGluXG4iKSA7Ci0gICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBJTlBVVEZPQ1VTKSA7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfRk9DVVNfT1VUIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEcHJpbnRmICgiZm9jdXMgb3V0XG4iKSA7Ci0gICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDAsIFNETF9BUFBJTlBVVEZPQ1VTKSA7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfTU9VU0VfTU9USU9OIDoKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBEcHJpbnRmICgibW91c2UgbW90aW9uXG4iKSA7Ci0KLSAgICAgICAgICAgICAgICBpZiAoU0RMX1ZpZGVvU3VyZmFjZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja19ib3VuZGFyeSAodGhpcywgZXZlbnQuYnV0dG9uLngsIGV2ZW50LmJ1dHRvbi55KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24gKDAsIDAsIGV2ZW50LmJ1dHRvbi54IC0gT2Zmc2V0WCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmJ1dHRvbi55IC0gT2Zmc2V0WSkgOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbiAoMCwgMCwgZXZlbnQuYnV0dG9uLngsIGV2ZW50LmJ1dHRvbi55KSA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfQlVUVE9OX0RPV04gOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBidXR0b24gPSBldmVudC5idXR0b24uYnV0dG9ucyA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRHByaW50ZiAoImJ1dHRvbiBkb3duXG4iKSA7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGJ1dHRvbikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1XQlVUVE9OX0wgOgotICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uID0gMSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVdCVVRUT05fTSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBidXR0b24gPSAyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNV0JVVFRPTl9SIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IDMgOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IDAgOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsYXN0X2J1dHRvbl9kb3duID0gYnV0dG9uIDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrX2JvdW5kYXJ5ICh0aGlzLCBldmVudC5idXR0b24ueCwgZXZlbnQuYnV0dG9uLnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uIChTRExfUFJFU1NFRCwgYnV0dG9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5idXR0b24ueCAtIE9mZnNldFgsIGV2ZW50LmJ1dHRvbi55IC0gT2Zmc2V0WSkgOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbiAoU0RMX1BSRVNTRUQsIGJ1dHRvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5idXR0b24ueCwgZXZlbnQuYnV0dG9uLnkpIDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkbyBub3Qga29udyB3aGljaCBidXR0b24gaXMgcmVsZWFzZWQKLSAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9CVVRUT05fVVAgOgotICAgICAgICAgICAgeyAgIAotICAgICAgICAgICAgICAgIERwcmludGYgKCJidXR0b24gdXBcbiIpIDsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50bHlfZnVsbHNjcmVlbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tfYm91bmRhcnkgKHRoaXMsIGV2ZW50LmJ1dHRvbi54LCBldmVudC5idXR0b24ueSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24gKFNETF9SRUxFQVNFRCwgbGFzdF9idXR0b25fZG93biwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuYnV0dG9uLnggLSBPZmZzZXRYLCBldmVudC5idXR0b24ueSAtIE9mZnNldFkpIDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24gKFNETF9SRUxFQVNFRCwgbGFzdF9idXR0b25fZG93biwgCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5idXR0b24ueCwgZXZlbnQuYnV0dG9uLnkpIDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGFzdF9idXR0b25fZG93biA9IDAgOwotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBHUl9FVkVOVF9UWVBFX0tFWV9ET1dOIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTRExfa2V5c3ltIGtleXN5bSA7Ci0KLSAgICAgICAgICAgICAgICBEcHJpbnRmICgia2V5IGRvd25cbiIpIDsKLSAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUFJFU1NFRCwKLSAgICAgICAgICAgICAgICAgICAgTlhfVHJhbnNsYXRlS2V5ICgmIGV2ZW50LmtleXN0cm9rZSwgJiBrZXlzeW0pKSA7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfS0VZX1VQIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTRExfa2V5c3ltIGtleXN5bSA7Ci0KLSAgICAgICAgICAgICAgICBEcHJpbnRmICgia2V5IHVwXG4iKSA7Ci0gICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1JFTEVBU0VELAotICAgICAgICAgICAgICAgICAgICBOWF9UcmFuc2xhdGVLZXkgKCYgZXZlbnQua2V5c3Ryb2tlLCAmIGtleXN5bSkpIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9DTE9TRV9SRVEgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERwcmludGYgKCJjbG9zZSByZXF1aXJlXG4iKSA7Ci0gICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVRdWl0ICgpIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9FWFBPU1VSRSA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRHByaW50ZiAoImV2ZW50X3R5cGVfZXhwb3N1cmVcbiIpIDsKLSAgICAgICAgICAgICAgICBpZiAoU0RMX1ZpZGVvU3VyZmFjZSkgewotICAgICAgICAgICAgICAgICAgICBOWF9SZWZyZXNoRGlzcGxheSAodGhpcykgOy8vLCAmIGV2ZW50LmV4cG9zdXJlKSA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBHUl9FVkVOVF9UWVBFX1VQREFURSA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC51cGRhdGUudXR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBHUl9VUERBVEVfTUFQIDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRHByaW50ZiAoIkdSX1VQREFURV9NQVBcbiIpIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhY3RpdmUsIG1ha2Ugb3Vyc2VsdmVzIGFjdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoU0RMX0dldEFwcFN0YXRlICgpICYgU0RMX0FQUEFDVElWRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGFuIGludGVybmFsIGFjdGl2YXRlIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBBQ1RJVkUpIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTRExfVmlkZW9TdXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlhfUmVmcmVzaERpc3BsYXkgKHRoaXMpIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBHUl9VUERBVEVfVU5NQVAgOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEdSX1VQREFURV9VTk1BUFRFTVAgOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEcHJpbnRmICgiR1JfVVBEQVRFX1VOTUFQIG9yIEdSX1VQREFURV9VTk1BUFRFTVBcbiIpIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIGFjdGl2ZSwgbWFrZSBvdXJzZWx2ZXMgaW5hY3RpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTRExfR2V0QXBwU3RhdGUgKCkgJiBTRExfQVBQQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBhbiBpbnRlcm5hbCBkZWFjdGl2YXRlIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDAsIFNETF9BUFBBQ1RJVkUgfCBTRExfQVBQSU5QVVRGT0NVUykgOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOyAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBHUl9VUERBVEVfU0laRSA6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERwcmludGYgKCJHUl9VUERBVEVfU0laRVxuIikgOwotICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVSZXNpemUgKGV2ZW50LnVwZGF0ZS53aWR0aCwgZXZlbnQudXBkYXRlLmhlaWdodCkgOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOyAKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgR1JfVVBEQVRFX01PVkUgOgotCQkgICAgY2FzZSBHUl9VUERBVEVfUkVQQVJFTlQgOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEcHJpbnRmICgiR1JfVVBEQVRFX01PVkUgb3IgR1JfVVBEQVRFX1JFUEFSRU5UXG4iKSA7Ci0jaWZkZWYgRU5BQkxFX05BTk9YX0RJUkVDVF9GQgotCQkJaWYgKENsaWVudGZiKSB7Ci0JCQkgICAgLyogR2V0IGN1cnJlbnQgd2luZG93IHBvc2l0aW9uIGFuZCBmYiBwb2ludGVyKi8KLQkJCSAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pIAotCQkJCUdyR2V0V2luZG93RkJJbmZvKEZTd2luZG93LCAmZmJpbmZvKTsKLQkJCSAgICBlbHNlCi0JCQkJR3JHZXRXaW5kb3dGQkluZm8oU0RMX1dpbmRvdywgJmZiaW5mbyk7Ci0JCQl9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgRHByaW50ZiAoInVua25vd24gR1JfRVZFTlRfVFlQRV9VUERBVEVcbiIpIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIDsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEcHJpbnRmICgicHVtcCBldmVudCBkZWZhdWx0XG4iKSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBHckNoZWNrTmV4dEV2ZW50ICgmIGV2ZW50KSA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhldmVudHNfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTEyYzIxLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254ZXZlbnRzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxICBIc2llaC1GdSBUc2FpCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSAgICAKLSAgICBIc2llaC1GdSBUc2FpCi0gICAgY2xhcmVAc2V0YWJveC5jb20KLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX254dmlkZW8uaCIKLQotLy8gRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkCi1leHRlcm4gdm9pZCBOWF9Jbml0T1NLZXltYXAgKF9USElTKSA7Ci1leHRlcm4gdm9pZCBOWF9QdW1wRXZlbnRzIChfVEhJUykgOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhpbWFnZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhpbWFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWZlM2I5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254aW1hZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotICAgIENvcHlyaWdodCAoQykgMjAwMSAgSHNpZWgtRnUgVHNhaQotICAgIENvcHlyaWdodCAoQykgMjAwMiAgR3JlZyBIYWVyciA8Z3JlZ0BjZW5zb2Z0LmNvbT4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotICAgIAotICAgIEhzaWVoLUZ1IFRzYWkKLSAgICBjbGFyZUBzZXRhYm94LmNvbQotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfbnhpbWFnZV9jLmgiCi0KLXZvaWQgTlhfTm9ybWFsVXBkYXRlIChfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqIHJlY3RzKQotewotICAgIGludCAgICAgICAgICAgaSwgaiwgeGluYywgeWluYywgZGVzdGluYywgcm93aW5jIDsKLSAgICBpbnQgICAgICAgICAgIHgsIHksIHcsIGggOwotICAgIHVuc2lnbmVkIGNoYXIgKiBzcmMgPSBOVUxMLCAqIGRlc3QgPSBOVUxMIDsKLQotICAgIERwcmludGYgKCJlbnRlciBOWF9Ob3JtYWxVcGRhdGVcbiIpIDsKLSAgICAKLSAgICAvKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyBmb3IgdGhlIGluY29taW5nIGltYWdlICovCi0gICAgeGluYyA9IHRoaXMgLT4gc2NyZWVuIC0+IGZvcm1hdCAtPiBCeXRlc1BlclBpeGVsIDsKLSAgICB5aW5jID0gdGhpcyAtPiBzY3JlZW4gLT4gcGl0Y2ggOwotICAgICAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtcmVjdHM7ICsrIGkpIHsKLSAgICAgICAgeCA9IHJlY3RzIFtpXS54LCB5ID0gcmVjdHMgW2ldLnkgOwotICAgICAgICB3ID0gcmVjdHMgW2ldLncsIGggPSByZWN0cyBbaV0uaCA7Ci0gICAgICAgIHNyYyA9IFNETF9JbWFnZSArIHkgKiB5aW5jICsgeCAqIHhpbmMgOwotI2lmZGVmIEVOQUJMRV9OQU5PWF9ESVJFQ1RfRkIKLSAgICAgICAgaWYgKENsaWVudGZiKSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pCi0gICAgICAgICAgICAgICAgZGVzdCA9IGZiaW5mby53aW5waXhlbHMgKyAoKCh5K09mZnNldFkpICogZmJpbmZvLnBpdGNoKSArCi0gICAgICAgICAgICAgICAgICAgICgoeCtPZmZzZXRYKSAqIGZiaW5mby5ieXRlc3BwKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGVzdCA9IGZiaW5mby53aW5waXhlbHMgKyAoKHkgKiBmYmluZm8ucGl0Y2gpICsgKHggKiBmYmluZm8uYnl0ZXNwcCkpOwotICAgICAgICAgICAgZGVzdGluYyA9IGZiaW5mby5waXRjaDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgICAgZGVzdCA9IEltYWdlX2J1ZmYgOwotICAgICAgICAgICAgZGVzdGluYyA9IHcgKiB4aW5jIDsKLSAgICAgICAgfQotICAgICAgICByb3dpbmMgPSB3ICogeGluYzsKLQotICAgICAgICAvLyBhcHBseSBHYW1tYVJhbXAgdGFibGUKLSAgICAgICAgaWYgKChwaXhlbF90eXBlID09IE1XUEZfVFJVRUNPTE9SMDg4OCB8fCBwaXhlbF90eXBlID09IE1XUEZfVFJVRUNPTE9SODg4KQotICAgICAgICAgICYmIEdhbW1hUmFtcF9SICYmIEdhbW1hUmFtcF9HICYmIEdhbW1hUmFtcF9CKSB7Ci0gICAgICAgICAgICBVaW50OCAqIHB0cnNyYyA7Ci0gICAgICAgICAgICBVaW50OCAqIHB0cmRzdCA7Ci0gICAgICAgICAgICBpbnQgICBrIDsKLQotICAgICAgICAgICAgZm9yIChqID0gaDsgaiA+IDA7IC0tIGosIHNyYyArPSB5aW5jLCBkZXN0ICs9IGRlc3RpbmMpIHsKLSAgICAgICAgICAgICAgICBwdHJzcmMgPSBzcmMgOwotICAgICAgICAgICAgICAgIHB0cmRzdCA9IGRlc3QgOwotICAgICAgICAgICAgICAgIGZvciAoayA9IHc7IGsgPiAwOyAtLSBrKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwdHJkc3QrKyA9IEdhbW1hUmFtcF9CIFsqcHRyc3JjKytdID4+IDg7Ci0gICAgICAgICAgICAgICAgICAgICpwdHJkc3QrKyA9IEdhbW1hUmFtcF9HIFsqcHRyc3JjKytdID4+IDg7Ci0gICAgICAgICAgICAgICAgICAgICpwdHJkc3QrKyA9IEdhbW1hUmFtcF9SIFsqcHRyc3JjKytdID4+IDg7Ci0gICAgICAgICAgICAgICAgICAgICpwdHJkc3QrKyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICsrcHRyc3JjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2lmIDEgLyogVGhpcyBpcyBuZWVkZWQgZm9yIG1pY3Jvd2luZG93cyAwLjkwIG9yIG9sZGVyICovCi0gICAgICAgIGVsc2UgaWYgKHBpeGVsX3R5cGUgPT0gTVdQRl9UUlVFQ09MT1IwODg4IHx8IHBpeGVsX3R5cGUgPT0gTVdQRl9UUlVFQ09MT1I4ODgpIHsKLSAgICAgICAgICAgIFVpbnQ4ICogcHRyc3JjIDsKLSAgICAgICAgICAgIFVpbnQ4ICogcHRyZHN0IDsKLSAgICAgICAgICAgIGludCAgIGsgOwotCi0gICAgICAgICAgICBmb3IgKGogPSBoOyBqID4gMDsgLS0gaiwgc3JjICs9IHlpbmMsIGRlc3QgKz0gZGVzdGluYykgewotICAgICAgICAgICAgICAgIHB0cnNyYyA9IHNyYyA7Ci0gICAgICAgICAgICAgICAgcHRyZHN0ID0gZGVzdCA7Ci0gICAgICAgICAgICAgICAgZm9yIChrID0gdzsgayA+IDA7IC0tIGspIHsKLSAgICAgICAgICAgICAgICAgICAgKnB0cmRzdCsrID0gKnB0cnNyYysrOwotICAgICAgICAgICAgICAgICAgICAqcHRyZHN0KysgPSAqcHRyc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgICpwdHJkc3QrKyA9ICpwdHJzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgKnB0cmRzdCsrID0gMDsKLSAgICAgICAgICAgICAgICAgICAgKytwdHJzcmM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSBoOyBqID4gMDsgLS0gaiwgc3JjICs9IHlpbmMsIGRlc3QgKz0gZGVzdGluYykKLSAgICAgICAgICAgICAgICBTRExfbWVtY3B5IChkZXN0LCBzcmMsIHJvd2luYykgOwotICAgICAgICB9Ci0gICAgICAgIGlmICghQ2xpZW50ZmIpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50bHlfZnVsbHNjcmVlbikgewotICAgICAgICAgICAgICAgIEdyQXJlYSAoRlN3aW5kb3csIFNETF9HQywgeCArIE9mZnNldFgsIHkgKyBPZmZzZXRZLCB3LCBoLCBJbWFnZV9idWZmLCAKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfdHlwZSkgOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBHckFyZWEgKFNETF9XaW5kb3csIFNETF9HQywgeCwgeSwgdywgaCwgSW1hZ2VfYnVmZiwgcGl4ZWxfdHlwZSkgOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEdyRmx1c2goKTsKLQotICAgIERwcmludGYgKCJsZWF2ZSBOWF9Ob3JtYWxVcGRhdGVcbiIpIDsKLX0KLQotaW50IE5YX1NldHVwSW1hZ2UgKF9USElTLCBTRExfU3VyZmFjZSAqIHNjcmVlbikKLXsKLSAgICBpbnQgc2l6ZSA9IHNjcmVlbiAtPiBoICogc2NyZWVuIC0+IHBpdGNoIDsKLSAgICAKLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfU2V0dXBJbWFnZVxuIikgOwotCi0gICAgc2NyZWVuIC0+IHBpeGVscyA9ICh2b2lkICopIFNETF9tYWxsb2MgKHNpemUpIDsKLQotICAgIGlmICghQ2xpZW50ZmIpIHsKLSAgICAgICAgSW1hZ2VfYnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIFNETF9tYWxsb2MgKHNpemUpIDsKLSAgICAgICAgaWYgKHNjcmVlbiAtPiBwaXhlbHMgPT0gTlVMTCB8fCBJbWFnZV9idWZmID09IE5VTEwpIHsKLSAgICAgICAgICAgIFNETF9mcmVlIChzY3JlZW4gLT4gcGl4ZWxzKSA7Ci0gICAgICAgICAgICBTRExfZnJlZSAoSW1hZ2VfYnVmZikgOwotICAgICAgICAgICAgU0RMX091dE9mTWVtb3J5ICgpIDsKLSAgICAgICAgICAgIHJldHVybiAtMSA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTRExfSW1hZ2UgPSAodW5zaWduZWQgY2hhciAqKSBzY3JlZW4gLT4gcGl4ZWxzIDsKLQotICAgIHRoaXMgLT4gVXBkYXRlUmVjdHMgPSBOWF9Ob3JtYWxVcGRhdGUgOwotCi0gICAgRHByaW50ZiAoImxlYXZlIE5YX1NldHVwSW1hZ2VcbiIpIDsKLSAgICByZXR1cm4gMCA7Ci19Ci0KLXZvaWQgTlhfRGVzdHJveUltYWdlIChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4pCi17Ci0gICAgRHByaW50ZiAoImVudGVyIE5YX0Rlc3Ryb3lJbWFnZVxuIikgOwotICAgIAotICAgIGlmIChTRExfSW1hZ2UpIFNETF9mcmVlIChTRExfSW1hZ2UpIDsKLSAgICBpZiAoSW1hZ2VfYnVmZikgU0RMX2ZyZWUgKEltYWdlX2J1ZmYpIDsKLSAgICBpZiAoc2NyZWVuKSBzY3JlZW4gLT4gcGl4ZWxzID0gTlVMTCA7Ci0gICAgCi0gICAgRHByaW50ZiAoImxlYXZlIE5YX0Rlc3Ryb3lJbWFnZVxuIikgOwotfQotCi1pbnQgTlhfUmVzaXplSW1hZ2UgKF9USElTLCBTRExfU3VyZmFjZSAqIHNjcmVlbiwgVWludDMyIGZsYWdzKQotewotICAgIGludCAgICAgICAgICAgIHJldHZhbCA7Ci0gICAgR1JfU0NSRUVOX0lORk8gc2kgOwotCi0gICAgRHByaW50ZiAoImVudGVyIE5YX1Jlc2l6ZUltYWdlXG4iKSA7Ci0KLSAgICBOWF9EZXN0cm95SW1hZ2UgKHRoaXMsIHNjcmVlbikgOwotICAgIHJldHZhbCA9IE5YX1NldHVwSW1hZ2UgKHRoaXMsIHNjcmVlbikgOwotCi0gICAgR3JHZXRTY3JlZW5JbmZvICgmIHNpKSA7Ci0gICAgT2Zmc2V0WCA9IChzaS5jb2xzIC0gc2NyZWVuIC0+IHcpIC8gMiA7Ci0gICAgT2Zmc2V0WSA9IChzaS5yb3dzIC0gc2NyZWVuIC0+IGgpIC8gMiA7Ci0KLSNpZmRlZiBFTkFCTEVfTkFOT1hfRElSRUNUX0ZCCi0gICAgaWYgKENsaWVudGZiKSB7Ci0gICAgICAgIC8qIEdldCBjdXJyZW50IHdpbmRvdyBwb3NpdGlvbiBhbmQgZmIgcG9pbnRlciovCi0gICAgICAgIGlmIChjdXJyZW50bHlfZnVsbHNjcmVlbikgCi0gICAgICAgICAgICBHckdldFdpbmRvd0ZCSW5mbyhGU3dpbmRvdywgJmZiaW5mbyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEdyR2V0V2luZG93RkJJbmZvKFNETF9XaW5kb3csICZmYmluZm8pOwotICAgIH0KLSNlbmRpZgotICAgIERwcmludGYgKCJsZWF2ZSBOWF9SZXNpemVJbWFnZVxuIikgOwotICAgIHJldHVybiByZXR2YWwgOwotfQotCi12b2lkIE5YX1JlZnJlc2hEaXNwbGF5IChfVEhJUykKLXsKLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfUmVmcmVzaERpc3BsYXlcbiIpIDsKLQotICAgIC8vIERvbid0IHJlZnJlc2ggYSBkaXNwbGF5IHRoYXQgZG9lc24ndCBoYXZlIGFuIGltYWdlIChsaWtlIEdMKQotICAgIGlmICghIFNETF9JbWFnZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgRU5BQkxFX05BTk9YX0RJUkVDVF9GQgotICAgIGlmIChDbGllbnRmYikgewotICAgICAgICBpbnQgajsKLSAgICAgICAgY2hhciAqc3JjLCAqZGVzdCA9IE5VTEw7Ci0gICAgICAgIGludCB4aW5jLCB5aW5jLCByb3dpbmM7Ci0KLSAgICAgICAgR3JHZXRXaW5kb3dGQkluZm8oU0RMX1dpbmRvdywgJmZiaW5mbyk7Ci0KLSAgICAgICAgeGluYyA9IHRoaXMgLT4gc2NyZWVuIC0+IGZvcm1hdCAtPiBCeXRlc1BlclBpeGVsIDsgCi0gICAgICAgIHlpbmMgPSB0aGlzIC0+IHNjcmVlbiAtPiBwaXRjaCA7ICAgICAgICAgICAKLQotICAgICAgICBzcmMgPSBTRExfSW1hZ2U7Ci0gICAgICAgIGlmIChjdXJyZW50bHlfZnVsbHNjcmVlbikKLSAgICAgICAgICAgIGRlc3QgPSBmYmluZm8ud2lucGl4ZWxzICsgKChPZmZzZXRZICogZmJpbmZvLnBpdGNoKSArCi0gICAgICAgICAgICAgICAgKE9mZnNldFggKiBmYmluZm8uYnl0ZXNwcCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkZXN0ID0gZmJpbmZvLndpbnBpeGVsczsKLSAgICAgICAgcm93aW5jID0geGluYyAqIHRoaXMgLT4gc2NyZWVuIC0+IHc7Ci0KLSAgICAgICAgZm9yIChqID0gdGhpcyAtPiBzY3JlZW4gLT4gaDsgaiA+IDA7IC0tIGosIHNyYyArPSB5aW5jLCBkZXN0ICs9IGZiaW5mby5waXRjaCkKLSAgICAgICAgICAgIFNETF9tZW1jcHkgKGRlc3QsIHNyYywgcm93aW5jKSA7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgICAgaWYgKGN1cnJlbnRseV9mdWxsc2NyZWVuKSB7Ci0gICAgICAgICAgICBHckFyZWEgKEZTd2luZG93LCBTRExfR0MsIE9mZnNldFgsIE9mZnNldFksIHRoaXMgLT4gc2NyZWVuIC0+IHcsIAotICAgICAgICAgICAgICAgIHRoaXMgLT4gc2NyZWVuIC0+IGgsIFNETF9JbWFnZSwgcGl4ZWxfdHlwZSkgOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgR3JBcmVhIChTRExfV2luZG93LCBTRExfR0MsIDAsIDAsIHRoaXMgLT4gc2NyZWVuIC0+IHcsIAotICAgICAgICAgICAgICAgIHRoaXMgLT4gc2NyZWVuIC0+IGgsIFNETF9JbWFnZSwgcGl4ZWxfdHlwZSkgOwotICAgICAgICB9Ci0gICAgfQotICAgIEdyRmx1c2goKTsKLQotICAgIERwcmludGYgKCJsZWF2ZSBOWF9SZWZyZXNoRGlzcGxheVxuIikgOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhpbWFnZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueGltYWdlX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkYzAxZi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueGltYWdlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxICBIc2llaC1GdSBUc2FpCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSAgICAKLSAgICBIc2llaC1GdSBUc2FpCi0gICAgY2xhcmVAc2V0YWJveC5jb20KLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX254dmlkZW8uaCIKLQotZXh0ZXJuIGludCBOWF9TZXR1cEltYWdlIChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4pIDsKLWV4dGVybiB2b2lkIE5YX0Rlc3Ryb3lJbWFnZSAoX1RISVMsIFNETF9TdXJmYWNlICogc2NyZWVuKSA7Ci1leHRlcm4gaW50IE5YX1Jlc2l6ZUltYWdlIChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4sIFVpbnQzMiBmbGFncykgOwotCi1leHRlcm4gdm9pZCBOWF9Ob3JtYWxVcGRhdGUgKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICogcmVjdHMpIDsKLWV4dGVybiB2b2lkIE5YX1JlZnJlc2hEaXNwbGF5IChfVEhJUykgOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhtb2Rlcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhtb2Rlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzU5N2UyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254bW9kZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxICBIc2llaC1GdSBUc2FpCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSAgICAKLSAgICBIc2llaC1GdSBUc2FpCi0gICAgY2xhcmVAc2V0YWJveC5jb20KLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9ueG1vZGVzX2MuaCIKLQotU0RMX1JlY3QgKiogTlhfTGlzdE1vZGVzIChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICogZm9ybWF0LCBVaW50MzIgZmxhZ3MpCi17Ci0gICAgaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pCi0gICAgICAgIHJldHVybiBTRExfbW9kZWxpc3QgOwotCi0gICAgaWYgKFNETF9WaXN1YWwuYnBwID09IGZvcm1hdCAtPiBCaXRzUGVyUGl4ZWwpIHsKLSAgICAgICAgcmV0dXJuICgoU0RMX1JlY3QgKiopIC0xKSA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICgoU0RMX1JlY3QgKiopIDApIDsKLSAgICB9Ci19Ci0KLXZvaWQgTlhfRnJlZVZpZGVvTW9kZXMgKF9USElTKQotewotICAgIGludCBpIDsKLQotICAgIGlmIChTRExfbW9kZWxpc3QpIHsKLSAgICAgICAgZm9yIChpID0gMDsgU0RMX21vZGVsaXN0IFtpXTsgKysgaSkgewotICAgICAgICAgICAgU0RMX2ZyZWUgKFNETF9tb2RlbGlzdCBbaV0pIDsKLSAgICAgICAgfQotICAgICAgICBTRExfZnJlZSAoU0RMX21vZGVsaXN0KSA7Ci0gICAgICAgIFNETF9tb2RlbGlzdCA9IE5VTEw7Ci0gICAgfQotfQotCi1pbnQgTlhfRW50ZXJGdWxsU2NyZWVuIChfVEhJUykKLXsKLSAgICBpZiAoISBjdXJyZW50bHlfZnVsbHNjcmVlbikgewotICAgICAgICBHUl9TQ1JFRU5fSU5GTyBzaSA7Ci0KLSAgICAgICAgR3JHZXRTY3JlZW5JbmZvICgmIHNpKSA7Ci0gICAgICAgIEdyUmVzaXplV2luZG93IChGU3dpbmRvdywgc2kuY29scywgc2kucm93cykgOwotICAgICAgICBHclVubWFwV2luZG93IChTRExfV2luZG93KSA7Ci0gICAgICAgIEdyTWFwV2luZG93IChGU3dpbmRvdykgOwotICAgICAgICBHclJhaXNlV2luZG93IChGU3dpbmRvdykgOwotICAgICAgICBHclNldEZvY3VzIChGU3dpbmRvdykgOwotICAgICAgICBjdXJyZW50bHlfZnVsbHNjcmVlbiA9IDEgOyAgICAgIAotICAgIH0KLQotICAgIHJldHVybiAxIDsKLX0KLQotaW50IE5YX0xlYXZlRnVsbFNjcmVlbiAoX1RISVMpCi17Ci0gICAgaWYgKGN1cnJlbnRseV9mdWxsc2NyZWVuKSB7Ci0gICAgICAgIEdyVW5tYXBXaW5kb3cgKEZTd2luZG93KSA7Ci0gICAgICAgIEdyTWFwV2luZG93IChTRExfV2luZG93KSA7Ci0gICAgICAgIEdyUmFpc2VXaW5kb3cgKFNETF9XaW5kb3cpIDsKLSAgICAgICAgR3JTZXRGb2N1cyAoU0RMX1dpbmRvdykgOwotICAgICAgICBjdXJyZW50bHlfZnVsbHNjcmVlbiA9IDAgOwotICAgIH0KLQotICAgIHJldHVybiAwIDsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254bW9kZXNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhtb2Rlc19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDNhZDcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhtb2Rlc19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotICAgIENvcHlyaWdodCAoQykgMjAwMSAgSHNpZWgtRnUgVHNhaQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0gICAgCi0gICAgSHNpZWgtRnUgVHNhaQotICAgIGNsYXJlQHNldGFib3guY29tCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9ueHZpZGVvLmgiCi0jaW5jbHVkZSA8U0RMLmg+Ci0KLWV4dGVybiBTRExfUmVjdCAqKiBOWF9MaXN0TW9kZXMgKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKiBmb3JtYXQsIFVpbnQzMiBmbGFncykgOwotZXh0ZXJuIHZvaWQgTlhfRnJlZVZpZGVvTW9kZXMgKF9USElTKSA7Ci1leHRlcm4gaW50IE5YX0VudGVyRnVsbFNjcmVlbiAoX1RISVMpIDsKLWV4dGVybiBpbnQgTlhfTGVhdmVGdWxsU2NyZWVuIChfVEhJUykgOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhtb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhtb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDAxN2IxLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254bW91c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxICBIc2llaC1GdSBUc2FpCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSAgICAKLSAgICBIc2llaC1GdSBUc2FpCi0gICAgY2xhcmVAc2V0YWJveC5jb20KLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotCi0jaW5jbHVkZSAiU0RMX254bW91c2VfYy5oIgotCi0vLyBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IKLXN0cnVjdCBXTWN1cnNvciB7Ci0gICAgaW50IHVudXNlZCA7Ci19IDsKLQotV01jdXJzb3IgKiBOWF9DcmVhdGVXTUN1cnNvciAoX1RISVMsCi0gICAgICAgIFVpbnQ4ICogZGF0YSwgVWludDggKiBtYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KQotewotICAgIFdNY3Vyc29yICogY3Vyc29yIDsKLQotICAgIERwcmludGYgKCJlbnRlciBOWF9DcmVhdGVXTUN1cnNvclxuIikgOwotCi0gICAgY3Vyc29yID0gKFdNY3Vyc29yICopIFNETF9tYWxsb2MgKHNpemVvZiAoV01jdXJzb3IpKSA7Ci0gICAgaWYgKGN1cnNvciA9PSBOVUxMKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKSA7Ci0gICAgICAgIHJldHVybiBOVUxMIDsKLSAgICB9Ci0KLSAgICBEcHJpbnRmICgibGVhdmUgTlhfQ3JlYXRlV01DdXJzb3JcbiIpIDsKLSAgICByZXR1cm4gY3Vyc29yIDsKLX0KLQotdm9pZCBOWF9GcmVlV01DdXJzb3IgKF9USElTLCBXTWN1cnNvciAqIGN1cnNvcikKLXsKLSAgICBEcHJpbnRmICgiTlhfRnJlZVdNQ3Vyc29yXG4iKSA7Ci0gICAgU0RMX2ZyZWUgKGN1cnNvcikgOwotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgTlhfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCi17Ci0gICAgR1JfV0lORE9XX0lORk8gaW5mbyA7Ci0KLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfV2FycFdNQ3Vyc29yXG4iKSA7Ci0gICAgU0RMX0xvY2tfRXZlbnRUaHJlYWQgKCkgOwotICAgIAotICAgIEdyR2V0V2luZG93SW5mbyAoU0RMX1dpbmRvdywgJiBpbmZvKSA7Ci0gICAgR3JNb3ZlQ3Vyc29yIChpbmZvLnggKyB4LCBpbmZvLnkgKyB5KSA7Ci0KLSAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkICgpIDsKLSAgICBEcHJpbnRmICgibGVhdmUgTlhfV2FycFdNQ3Vyc29yXG4iKSA7Ci19Ci0KLWludCBOWF9TaG93V01DdXJzb3IgKF9USElTLCBXTWN1cnNvciAqIGN1cnNvcikKLXsKLSAgICBEcHJpbnRmICgiTlhfU2hvd1dNQ3Vyc29yXG4iKSA7Ci0gICAgcmV0dXJuIDEgOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnhtb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueG1vdXNlX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5ZWVkYi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueG1vdXNlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX254dmlkZW8uaCIKLQotZXh0ZXJuIFdNY3Vyc29yICogTlhfQ3JlYXRlV01DdXJzb3IgKF9USElTLCBVaW50OCAqIGRhdGEsIFVpbnQ4ICogbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkgOwotdm9pZCBOWF9GcmVlV01DdXJzb3IgKF9USElTLCBXTWN1cnNvciAqIGN1cnNvcikgOwotZXh0ZXJuIHZvaWQgTlhfV2FycFdNQ3Vyc29yIChfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KSA7Ci1leHRlcm4gaW50IE5YX1Nob3dXTUN1cnNvciAoX1RISVMsIFdNY3Vyc29yICogY3Vyc29yKSA7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueHZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueHZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YWNiMmEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnh2aWRlby5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxICBIc2llaC1GdSBUc2FpCi0gICAgQ29weXJpZ2h0IChDKSAyMDAyICBHcmVnIEhhZXJyIDxncmVnQGNlbnNvZnQuY29tPgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0gICAgCi0gICAgSHNpZWgtRnUgVHNhaQotICAgIGNsYXJlQHNldGFib3guY29tCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0KLSNkZWZpbmUgTVdJTkNMVURFQ09MT1JTCi0jaW5jbHVkZSAiU0RMX254dmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbnhtb2Rlc19jLmgiCi0jaW5jbHVkZSAiU0RMX254d21fYy5oIgotI2luY2x1ZGUgIlNETF9ueG1vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfbnhpbWFnZV9jLmgiCi0jaW5jbHVkZSAiU0RMX254ZXZlbnRzX2MuaCIKLQotLy8gSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zCi1zdGF0aWMgaW50IE5YX1ZpZGVvSW5pdCAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqIHZmb3JtYXQpIDsKLXN0YXRpYyBTRExfU3VyZmFjZSAqIE5YX1NldFZpZGVvTW9kZSAoX1RISVMsIFNETF9TdXJmYWNlICogY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpIDsKLXN0YXRpYyBpbnQgTlhfU2V0Q29sb3JzIChfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKiBjb2xvcnMpIDsKLXN0YXRpYyB2b2lkIE5YX1ZpZGVvUXVpdCAoX1RISVMpIDsKLXN0YXRpYyB2b2lkIE5YX0Rlc3Ryb3lXaW5kb3cgKF9USElTLCBTRExfU3VyZmFjZSAqIHNjcmVlbikgOwotc3RhdGljIGludCBOWF9Ub2dnbGVGdWxsU2NyZWVuIChfVEhJUywgaW50IG9uKSA7Ci1zdGF0aWMgdm9pZCBOWF9VcGRhdGVNb3VzZSAoX1RISVMpIDsKLXN0YXRpYyBpbnQgTlhfU2V0R2FtbWFSYW1wIChfVEhJUywgVWludDE2ICogcmFtcCkgOwotc3RhdGljIGludCBOWF9HZXRHYW1tYVJhbXAgKF9USElTLCBVaW50MTYgKiByYW1wKSA7Ci0KLS8vIE1pY3Jvd2luIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zCi1zdGF0aWMgaW50IE5YX0F2YWlsYWJsZSAoKQotewotICAgIERwcmludGYgKCJlbnRlciBOWF9BdmFpbGFibGVcbiIpIDsKLQotICAgIGlmIChHck9wZW4gKCkgPCAwKSByZXR1cm4gMCA7Ci0gICAgICAgIEdyQ2xvc2UgKCkgOwotICAgIAotICAgIERwcmludGYgKCJsZWF2ZSBOWF9BdmFpbGFibGVcbiIpIDsKLSAgICByZXR1cm4gMSA7Ci19Ci0KLXN0YXRpYyB2b2lkIE5YX0RlbGV0ZURldmljZSAoU0RMX1ZpZGVvRGV2aWNlICogZGV2aWNlKQotewotICAgIERwcmludGYgKCJlbnRlciBOWF9EZWxldGVEZXZpY2VcbiIpIDsKLQotICAgIGlmIChkZXZpY2UpIHsKLSAgICAgICAgaWYgKGRldmljZSAtPiBoaWRkZW4pIFNETF9mcmVlIChkZXZpY2UgLT4gaGlkZGVuKSA7Ci0gICAgICAgIGlmIChkZXZpY2UgLT4gZ2xfZGF0YSkgU0RMX2ZyZWUgKGRldmljZSAtPiBnbF9kYXRhKSA7Ci0gICAgICAgICAgICBTRExfZnJlZSAoZGV2aWNlKSA7Ci0gICAgfQotCi0gICAgRHByaW50ZiAoImxlYXZlIE5YX0RlbGV0ZURldmljZVxuIikgOwotfQotICAgIAotc3RhdGljIFNETF9WaWRlb0RldmljZSAqIE5YX0NyZWF0ZURldmljZSAoaW50IGRldmluZGV4KQotewotICAgIFNETF9WaWRlb0RldmljZSAqIGRldmljZSA7Ci0KLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfQ3JlYXRlRGV2aWNlXG4iKSA7Ci0KLSAgICAvLyBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93bgotICAgIGRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKikgU0RMX21hbGxvYyAoc2l6ZW9mIChTRExfVmlkZW9EZXZpY2UpKSA7Ci0gICAgaWYgKGRldmljZSkgewotICAgICAgICBTRExfbWVtc2V0IChkZXZpY2UsIDAsIChzaXplb2YgKiBkZXZpY2UpKSA7Ci0gICAgICAgIGRldmljZSAtPiBoaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCi0gICAgICAgICAgICAgICAgU0RMX21hbGxvYyAoKHNpemVvZiAqIGRldmljZSAtPiBoaWRkZW4pKSA7Ci0gICAgICAgIGRldmljZSAtPiBnbF9kYXRhID0gTlVMTCA7Ci0gICAgfQotICAgIGlmICgoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UgLT4gaGlkZGVuID09IE5VTEwpKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKSA7Ci0gICAgICAgIE5YX0RlbGV0ZURldmljZSAoZGV2aWNlKSA7Ci0gICAgICAgIHJldHVybiAwIDsKLSAgICB9Ci0gICAgU0RMX21lbXNldCAoZGV2aWNlIC0+IGhpZGRlbiwgMCwgKHNpemVvZiAqIGRldmljZSAtPiBoaWRkZW4pKSA7Ci0KLSAgICAvLyBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzCi0gICAgZGV2aWNlIC0+IFZpZGVvSW5pdCA9IE5YX1ZpZGVvSW5pdCA7Ci0gICAgZGV2aWNlIC0+IExpc3RNb2RlcyA9IE5YX0xpc3RNb2RlcyA7Ci0gICAgZGV2aWNlIC0+IFNldFZpZGVvTW9kZSA9IE5YX1NldFZpZGVvTW9kZSA7Ci0gICAgZGV2aWNlIC0+IFRvZ2dsZUZ1bGxTY3JlZW4gPSBOWF9Ub2dnbGVGdWxsU2NyZWVuIDsKLSAgICBkZXZpY2UgLT4gVXBkYXRlTW91c2UgPSBOWF9VcGRhdGVNb3VzZSA7Ci0gICAgZGV2aWNlIC0+IENyZWF0ZVlVVk92ZXJsYXkgPSBOVUxMIDsKLSAgICBkZXZpY2UgLT4gU2V0Q29sb3JzID0gTlhfU2V0Q29sb3JzIDsKLSAgICBkZXZpY2UgLT4gVXBkYXRlUmVjdHMgPSBOVUxMIDsKLSAgICBkZXZpY2UgLT4gVmlkZW9RdWl0ID0gTlhfVmlkZW9RdWl0OwotICAgIGRldmljZSAtPiBBbGxvY0hXU3VyZmFjZSA9IE5VTEwgOwotICAgIGRldmljZSAtPiBDaGVja0hXQmxpdCA9IE5VTEwgOwotICAgIGRldmljZSAtPiBGaWxsSFdSZWN0ID0gTlVMTCA7Ci0gICAgZGV2aWNlIC0+IFNldEhXQ29sb3JLZXkgPSBOVUxMIDsKLSAgICBkZXZpY2UgLT4gU2V0SFdBbHBoYSA9IE5VTEwgOwotICAgIGRldmljZSAtPiBMb2NrSFdTdXJmYWNlID0gTlVMTCA7Ci0gICAgZGV2aWNlIC0+IFVubG9ja0hXU3VyZmFjZSA9IE5VTEwgOwotICAgIGRldmljZSAtPiBGbGlwSFdTdXJmYWNlID0gTlVMTCA7Ci0gICAgZGV2aWNlIC0+IEZyZWVIV1N1cmZhY2UgPSBOVUxMIDsKLSAgICBkZXZpY2UgLT4gU2V0R2FtbWEgPSBOVUxMIDsKLSAgICBkZXZpY2UgLT4gR2V0R2FtbWEgPSBOVUxMIDsKLSAgICBkZXZpY2UgLT4gU2V0R2FtbWFSYW1wID0gTlhfU2V0R2FtbWFSYW1wIDsKLSAgICBkZXZpY2UgLT4gR2V0R2FtbWFSYW1wID0gTlhfR2V0R2FtbWFSYW1wIDsKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLSAgICBkZXZpY2UgLT4gR0xfTG9hZExpYnJhcnkgPSBOVUxMIDsKLSAgICBkZXZpY2UgLT4gR0xfR2V0UHJvY0FkZHJlc3MgPSBOVUxMIDsKLSAgICBkZXZpY2UgLT4gR0xfR2V0QXR0cmlidXRlID0gTlVMTCA7Ci0gICAgZGV2aWNlIC0+IEdMX01ha2VDdXJyZW50ID0gTlVMTCA7Ci0gICAgZGV2aWNlIC0+IEdMX1N3YXBCdWZmZXJzID0gTlVMTCA7Ci0jZW5kaWYKLQotICAgIGRldmljZSAtPiBTZXRJY29uID0gTlVMTCA7Ci0gICAgZGV2aWNlIC0+IFNldENhcHRpb24gPSBOWF9TZXRDYXB0aW9uOwotICAgIGRldmljZSAtPiBJY29uaWZ5V2luZG93ID0gTlVMTCA7Ci0gICAgZGV2aWNlIC0+IEdyYWJJbnB1dCA9IE5VTEwgOwotICAgIGRldmljZSAtPiBHZXRXTUluZm8gPSBOWF9HZXRXTUluZm8gOwotICAgIGRldmljZSAtPiBGcmVlV01DdXJzb3IgPSAgTlhfRnJlZVdNQ3Vyc29yIDsKLSAgICBkZXZpY2UgLT4gQ3JlYXRlV01DdXJzb3IgPSBOWF9DcmVhdGVXTUN1cnNvciA7Ci0gICAgZGV2aWNlIC0+IFNob3dXTUN1cnNvciA9IE5YX1Nob3dXTUN1cnNvciA7Ci0gICAgZGV2aWNlIC0+IFdhcnBXTUN1cnNvciA9IE5YX1dhcnBXTUN1cnNvciA7Ci0gICAgZGV2aWNlIC0+IENoZWNrTW91c2VNb2RlID0gTlVMTCA7Ci0gICAgZGV2aWNlIC0+IEluaXRPU0tleW1hcCA9IE5YX0luaXRPU0tleW1hcCA7Ci0gICAgZGV2aWNlIC0+IFB1bXBFdmVudHMgPSBOWF9QdW1wRXZlbnRzIDsKLQotICAgIGRldmljZSAtPiBmcmVlID0gTlhfRGVsZXRlRGV2aWNlIDsKLQotICAgIERwcmludGYgKCJsZWF2ZSBOWF9DcmVhdGVEZXZpY2VcbiIpIDsKLSAgICByZXR1cm4gZGV2aWNlIDsKLX0KLQotVmlkZW9Cb290U3RyYXAgTlhfYm9vdHN0cmFwID0gewotICAgICJuYW5veCIsICJuYW5veCIsIE5YX0F2YWlsYWJsZSwgTlhfQ3JlYXRlRGV2aWNlCi19IDsKLQotc3RhdGljIHZvaWQgY3JlYXRlX2F1eF93aW5kb3dzIChfVEhJUykKLXsKLSAgICBHUl9XTV9QUk9QRVJUSUVTIHByb3BzIDsKLQotICAgIERwcmludGYgKCJlbnRlciBjcmVhdGVfYXV4X3dpbmRvd3NcbiIpIDsKLQotICAgIC8vIERvbid0IGNyZWF0ZSBhbnkgZXh0cmEgd2luZG93cyBpZiB3ZSBhcmUgYmVpbmcgbWFuYWdlZAotICAgIGlmIChTRExfd2luZG93aWQpIHsKLSAgICAgICAgRlN3aW5kb3cgPSAwIDsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKEZTd2luZG93ICYmIEZTd2luZG93ICE9IEdSX1JPT1RfV0lORE9XX0lEKSB7Ci0gICAgICAgIEdyRGVzdHJveVdpbmRvdyAoRlN3aW5kb3cpIDsKLSAgICB9Ci0gICAgCi0gICAgRlN3aW5kb3cgPSBHck5ld1dpbmRvdyAoR1JfUk9PVF9XSU5ET1dfSUQsIDAsIDAsIDEsIDEsIDAsIEJMQUNLLCBCTEFDSykgOwotICAgIHByb3BzLmZsYWdzID0gR1JfV01fRkxBR1NfUFJPUFMgOwotICAgIHByb3BzLnByb3BzID0gR1JfV01fUFJPUFNfTk9ERUNPUkFURSA7Ci0gICAgR3JTZXRXTVByb3BlcnRpZXMgKEZTd2luZG93LCAmIHByb3BzKSA7Ci0KLSAgICBHclNlbGVjdEV2ZW50cyAoRlN3aW5kb3csIChHUl9FVkVOVF9NQVNLX0VYUE9TVVJFICAgICAgICAgfAotICAgICAgICBHUl9FVkVOVF9NQVNLX0JVVFRPTl9ET1dOICB8IEdSX0VWRU5UX01BU0tfQlVUVE9OX1VQICB8Ci0gICAgICAgIEdSX0VWRU5UX01BU0tfRk9DVVNfSU4gICAgIHwgR1JfRVZFTlRfTUFTS19GT0NVU19PVVQgIHwKLSAgICAgICAgR1JfRVZFTlRfTUFTS19LRVlfRE9XTiAgICAgfCBHUl9FVkVOVF9NQVNLX0tFWV9VUCAgICAgfAotICAgICAgICBHUl9FVkVOVF9NQVNLX01PVVNFX0VOVEVSICB8IEdSX0VWRU5UX01BU0tfTU9VU0VfRVhJVCB8Ci0gICAgICAgIEdSX0VWRU5UX01BU0tfTU9VU0VfTU9USU9OIHwgR1JfRVZFTlRfTUFTS19VUERBVEUgICAgIHwKLSAgICAgICAgR1JfRVZFTlRfTUFTS19DTE9TRV9SRVEpKSA7Ci0KLSAgICBEcHJpbnRmICgibGVhdmUgY3JlYXRlX2F1eF93aW5kb3dzXG4iKSA7Ci19Ci0KLWludCBOWF9WaWRlb0luaXQgKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKiB2Zm9ybWF0KQotewotICAgIEdSX1NDUkVFTl9JTkZPIHNpIDsKLQotICAgIERwcmludGYgKCJlbnRlciBOWF9WaWRlb0luaXRcbiIpIDsKLSAgICAKLSAgICBpZiAoR3JPcGVuICgpIDwgMCkgewotICAgICAgICBTRExfU2V0RXJyb3IgKCJHck9wZW4oKSBmYWlsIikgOwotICAgICAgICByZXR1cm4gLTEgOwotICAgIH0KLQotICAgIC8vIHVzZSBzaGFyZSBtZW1vcnkgdG8gc3BlZWQgdXAKLSNpZmRlZiBOQU5PWF9TSEFSRV9NRU1PUlkKLSAgICBHclJlcVNobUNtZHMgKDB4RkZGRik7Ci0jZW5kaWYKLQotICAgIFNETF9XaW5kb3cgPSAwIDsKLSAgICBGU3dpbmRvdyA9IDAgOwotCi0gICAgR2FtbWFSYW1wX1IgPSBOVUxMIDsKLSAgICBHYW1tYVJhbXBfRyA9IE5VTEwgOwotICAgIEdhbW1hUmFtcF9CID0gTlVMTCA7ICAgIAotCi0gICAgR3JHZXRTY3JlZW5JbmZvICgmIHNpKSA7Ci0gICAgU0RMX1Zpc3VhbC5icHAgPSBzaS5icHAgOwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCi0gICAgdGhpcy0+aW5mby5jdXJyZW50X3cgPSBzaS5jb2xzIDsKLSAgICB0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IHNpLnJvd3MgOwotCi0gICAgLy8gR2V0VmlkZW9Nb2RlCi0gICAgU0RMX21vZGVsaXN0ID0gKFNETF9SZWN0ICoqKSBTRExfbWFsbG9jIChzaXplb2YgKFNETF9SZWN0ICopICogMikgOwotICAgIGlmIChTRExfbW9kZWxpc3QpIHsKLSAgICAgICAgU0RMX21vZGVsaXN0IFswXSA9IChTRExfUmVjdCAqKSBTRExfbWFsbG9jIChzaXplb2YoU0RMX1JlY3QpKSA7Ci0gICAgICAgIGlmIChTRExfbW9kZWxpc3QgWzBdKSB7Ci0gICAgICAgICAgICBTRExfbW9kZWxpc3QgWzBdIC0+IHggPSAwIDsKLSAgICAgICAgICAgIFNETF9tb2RlbGlzdCBbMF0gLT4geSA9IDAgOwotICAgICAgICAgICAgU0RMX21vZGVsaXN0IFswXSAtPiB3ID0gc2kuY29scyA7Ci0gICAgICAgICAgICBTRExfbW9kZWxpc3QgWzBdIC0+IGggPSBzaS5yb3dzIDsKLSAgICAgICAgfQotICAgICAgICBTRExfbW9kZWxpc3QgWzFdID0gTlVMTCA7Ci0gICAgfQotCi0gICAgcGl4ZWxfdHlwZSA9IHNpLnBpeHR5cGU7Ci0gICAgU0RMX1Zpc3VhbC5yZWRfbWFzayA9IHNpLnJtYXNrOwotICAgIFNETF9WaXN1YWwuZ3JlZW5fbWFzayA9IHNpLmdtYXNrOwotICAgIFNETF9WaXN1YWwuYmx1ZV9tYXNrID0gc2kuYm1hc2s7Ci0KLSAgICB2Zm9ybWF0IC0+IEJpdHNQZXJQaXhlbCA9IFNETF9WaXN1YWwuYnBwIDsKLSAgICBpZiAodmZvcm1hdCAtPiBCaXRzUGVyUGl4ZWwgPiA4KSB7Ci0gICAgICAgIHZmb3JtYXQgLT4gUm1hc2sgPSBTRExfVmlzdWFsLnJlZF9tYXNrIDsKLSAgICAgICAgdmZvcm1hdCAtPiBHbWFzayA9IFNETF9WaXN1YWwuZ3JlZW5fbWFzayA7Ci0gICAgICAgIHZmb3JtYXQgLT4gQm1hc2sgPSBTRExfVmlzdWFsLmJsdWVfbWFzayA7Ci0gICAgfQotCi0gICAgLy8gU2VlIGlmIHdlIGhhdmUgYmVlbiBwYXNzZWQgYSB3aW5kb3cgdG8gdXNlCi0gICAgU0RMX3dpbmRvd2lkID0gZ2V0ZW52ICgiU0RMX1dJTkRPV0lEIikgOwotICAgIAotICAgIC8vIENyZWF0ZSB0aGUgZnVsbHNjcmVlbiAoYW5kIG1hbmFnZWQgd2luZG93cyA6IG5vIGltcGxlbWVudCkKLSAgICBjcmVhdGVfYXV4X3dpbmRvd3MgKHRoaXMpIDsKLQotICAgIERwcmludGYgKCJsZWF2ZSBOWF9WaWRlb0luaXRcbiIpIDsKLSAgICByZXR1cm4gMCA7Ci19Ci0KLXZvaWQgTlhfVmlkZW9RdWl0IChfVEhJUykKLXsKLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfVmlkZW9RdWl0XG4iKSA7Ci0KLSAgICAvLyBTdGFydCBzaHV0dGluZyBkb3duIHRoZSB3aW5kb3dzCi0gICAgTlhfRGVzdHJveUltYWdlICh0aGlzLCB0aGlzIC0+IHNjcmVlbikgOwotICAgIE5YX0Rlc3Ryb3lXaW5kb3cgKHRoaXMsIHRoaXMgLT4gc2NyZWVuKSA7Ci0gICAgaWYgKEZTd2luZG93ICYmIEZTd2luZG93ICE9IEdSX1JPT1RfV0lORE9XX0lEKSB7Ci0gICAgICAgIEdyRGVzdHJveVdpbmRvdyAoRlN3aW5kb3cpIDsKLSAgICB9Ci0gICAgTlhfRnJlZVZpZGVvTW9kZXMgKHRoaXMpIDsKLSAgICBTRExfZnJlZSAoR2FtbWFSYW1wX1IpIDsKLSAgICBTRExfZnJlZSAoR2FtbWFSYW1wX0cpIDsKLSAgICBTRExfZnJlZSAoR2FtbWFSYW1wX0IpIDsKLQotI2lmZGVmIEVOQUJMRV9OQU5PWF9ESVJFQ1RfRkIKLSAgICBpZiAoQ2xpZW50ZmIpCi0gICAgICAgIEdyQ2xvc2VDbGllbnRGcmFtZWJ1ZmZlcigpOwotI2VuZGlmCi0gICAgR3JDbG9zZSAoKSA7Ci0KLSAgICBEcHJpbnRmICgibGVhdmUgTlhfVmlkZW9RdWl0XG4iKSA7Ci19Ci0KLXN0YXRpYyB2b2lkIE5YX0Rlc3Ryb3lXaW5kb3cgKF9USElTLCBTRExfU3VyZmFjZSAqIHNjcmVlbikKLXsKLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfRGVzdHJveVdpbmRvd1xuIikgOwotCi0gICAgaWYgKCEgU0RMX3dpbmRvd2lkKSB7Ci0gICAgICAgIGlmIChzY3JlZW4gJiYgKHNjcmVlbiAtPiBmbGFncyAmIFNETF9GVUxMU0NSRUVOKSkgewotICAgICAgICAgICAgc2NyZWVuIC0+IGZsYWdzICY9IH4gU0RMX0ZVTExTQ1JFRU4gOwotICAgICAgICAgICAgTlhfTGVhdmVGdWxsU2NyZWVuICh0aGlzKSA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEZXN0cm95IHRoZSBvdXRwdXQgd2luZG93Ci0gICAgICAgIGlmIChTRExfV2luZG93ICYmIFNETF9XaW5kb3cgIT0gR1JfUk9PVF9XSU5ET1dfSUQpIHsKLSAgICAgICAgICAgIEdyRGVzdHJveVdpbmRvdyAoU0RMX1dpbmRvdykgOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIEZyZWUgdGhlIGdyYXBoaWNzIGNvbnRleHQKLSAgICBpZiAoISBTRExfR0MpIHsKLSAgICAgICAgR3JEZXN0cm95R0MgKFNETF9HQykgOwotICAgICAgICBTRExfR0MgPSAwOwotICAgIH0KLQotICAgIERwcmludGYgKCJsZWF2ZSBOWF9EZXN0cm95V2luZG93XG4iKSA7Ci19Ci0KLXN0YXRpYyBpbnQgTlhfQ3JlYXRlV2luZG93IChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4sCi0gICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0gICAgRHByaW50ZiAoImVudGVyIE5YX0NyZWF0ZVdpbmRvd1xuIikgOwotCi0gICAgLy8gSWYgYSB3aW5kb3cgaXMgYWxyZWFkeSBwcmVzZW50LCBkZXN0cm95IGl0IGFuZCBzdGFydCBmcmVzaAotICAgIGlmIChTRExfV2luZG93ICYmIFNETF9XaW5kb3cgIT0gR1JfUk9PVF9XSU5ET1dfSUQpIHsKLSAgICAgICAgTlhfRGVzdHJveVdpbmRvdyAodGhpcywgc2NyZWVuKSA7Ci0gICAgfQotCi0gICAgLy8gU2VlIGlmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHdpbmRvdyBpZAotICAgIGlmIChTRExfd2luZG93aWQpIHsKLSAgICAgICAgU0RMX1dpbmRvdyA9IFNETF9zdHJ0b2wgKFNETF93aW5kb3dpZCwgTlVMTCwgMCkgOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFNETF9XaW5kb3cgPSAwIDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCAhIFNETF9SZWFsbG9jRm9ybWF0IChzY3JlZW4sIGJwcCwgU0RMX1Zpc3VhbC5yZWRfbWFzaywgCi0gICAgICAgIFNETF9WaXN1YWwuZ3JlZW5fbWFzaywgU0RMX1Zpc3VhbC5ibHVlX21hc2ssIDApKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvLyBDcmVhdGUgKG9yIHVzZSkgdGhlIG5hbm94IGRpc3BsYXkgd2luZG93Ci0gICAgaWYgKCEgU0RMX3dpbmRvd2lkKSB7Ci0KLSAgICAgICAgU0RMX1dpbmRvdyA9IEdyTmV3V2luZG93IChHUl9ST09UX1dJTkRPV19JRCwgMCwgMCwgdywgaCwgMCwgQkxBQ0ssIFdISVRFKSA7Ci0KLSAgICAgICAgR3JTZWxlY3RFdmVudHMgKFNETF9XaW5kb3csIChHUl9FVkVOVF9NQVNLX0VYUE9TVVJFICAgICAgIHwKLSAgICAgICAgICAgIEdSX0VWRU5UX01BU0tfQlVUVE9OX0RPV04gIHwgR1JfRVZFTlRfTUFTS19CVVRUT05fVVAgIHwKLSAgICAgICAgICAgIEdSX0VWRU5UX01BU0tfRk9DVVNfSU4gICAgIHwgR1JfRVZFTlRfTUFTS19GT0NVU19PVVQgIHwKLSAgICAgICAgICAgIEdSX0VWRU5UX01BU0tfS0VZX0RPV04gICAgIHwgR1JfRVZFTlRfTUFTS19LRVlfVVAgICAgIHwKLSAgICAgICAgICAgIEdSX0VWRU5UX01BU0tfTU9VU0VfRU5URVIgIHwgR1JfRVZFTlRfTUFTS19NT1VTRV9FWElUIHwKLSAgICAgICAgICAgIEdSX0VWRU5UX01BU0tfTU9VU0VfTU9USU9OIHwgR1JfRVZFTlRfTUFTS19VUERBVEUgICAgIHwKLSAgICAgICAgICAgIEdSX0VWRU5UX01BU0tfQ0xPU0VfUkVRKSkgOwotICAgIH0KLSAgICAKLSAgICAvKiBDcmVhdGUgdGhlIGdyYXBoaWNzIGNvbnRleHQgaGVyZSwgb25jZSB3ZSBoYXZlIGEgd2luZG93ICovCi0gICAgU0RMX0dDID0gR3JOZXdHQyAoKSA7Ci0gICAgaWYgKFNETF9HQyA9PSAwKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIGdyYXBoaWNzIGNvbnRleHQiKTsKLSAgICAgICAgcmV0dXJuKC0xKTsKLSAgICB9Ci0KLSAgICAvLyBNYXAgdGhlbSBib3RoIGFuZCBnbyBmdWxsc2NyZWVuLCBpZiByZXF1ZXN0ZWQKLSAgICBpZiAoISBTRExfd2luZG93aWQpIHsKLSAgICAgICAgR3JNYXBXaW5kb3cgKFNETF9XaW5kb3cpIDsKLSAgICAgICAgaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pIHsKLSAgICAgICAgICAgIHNjcmVlbiAtPiBmbGFncyB8PSBTRExfRlVMTFNDUkVFTiA7Ci0gICAgICAgICAgICBOWF9FbnRlckZ1bGxTY3JlZW4gKHRoaXMpIDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNjcmVlbiAtPiBmbGFncyAmPSB+IFNETF9GVUxMU0NSRUVOIDsKLSAgICAgICAgfQotICAgIH0KLQotI2lmZGVmIEVOQUJMRV9OQU5PWF9ESVJFQ1RfRkIKLSAgICAvKiBhdHRlbXB0IGFsbG9jYXRpbmcgdGhlIGNsaWVudCBzaWRlIGZyYW1lYnVmZmVyICovCi0gICAgQ2xpZW50ZmIgPSBHck9wZW5DbGllbnRGcmFtZWJ1ZmZlcigpOwotICAgIC8qIE5VTEwgcmV0dXJuIHdpbGwgZGVmYXVsdCB0byB1c2luZyBHckFyZWEoKSovCi0jZW5kaWYKLQotICAgIERwcmludGYgKCJsZWF2ZSBOWF9DcmVhdGVXaW5kb3dcbiIpIDsKLSAgICByZXR1cm4gMCA7Ci19Ci0KLVNETF9TdXJmYWNlICogTlhfU2V0VmlkZW9Nb2RlIChfVEhJUywgU0RMX1N1cmZhY2UgKiBjdXJyZW50LAotICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQotewotICAgIERwcmludGYgKCJlbnRlciBOWF9TZXRWaWRlb01vZGVcbiIpIDsKLQotICAgIC8vIExvY2sgdGhlIGV2ZW50IHRocmVhZCwgaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50cwotICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkICgpIDsKLQotICAgIGJwcCA9IFNETF9WaXN1YWwuYnBwIDsKLSAgICBpZiAoTlhfQ3JlYXRlV2luZG93ICh0aGlzLCBjdXJyZW50LCB3aWR0aCwgaGVpZ2h0LCBicHAsIGZsYWdzKSA8IDApIHsKLSAgICAgICAgY3VycmVudCA9IE5VTEw7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0KLSAgICBpZiAoY3VycmVudCAtPiB3ICE9IHdpZHRoIHx8IGN1cnJlbnQgLT4gaCAhPSBoZWlnaHQpIHsKLSAgICAgICAgY3VycmVudCAtPiB3ID0gd2lkdGggOwotICAgICAgICBjdXJyZW50IC0+IGggPSBoZWlnaHQgOwotICAgICAgICBjdXJyZW50IC0+IHBpdGNoID0gU0RMX0NhbGN1bGF0ZVBpdGNoIChjdXJyZW50KSA7Ci0gICAgICAgIE5YX1Jlc2l6ZUltYWdlICh0aGlzLCBjdXJyZW50LCBmbGFncykgOwotICAgIH0KLQotICAgIC8qIENsZWFyIHRoZXNlIGZsYWdzIGFuZCBzZXQgdGhlbSBvbmx5IGlmIHRoZXkgYXJlIGluIHRoZSBuZXcgc2V0LiAqLwotICAgIGN1cnJlbnQgLT4gZmxhZ3MgJj0gfihTRExfUkVTSVpBQkxFfFNETF9OT0ZSQU1FKTsKLSAgICBjdXJyZW50IC0+IGZsYWdzIHw9IChmbGFncyAmIChTRExfUkVTSVpBQkxFIHwgU0RMX05PRlJBTUUpKSA7Ci0KLSAgZG9uZToKLSAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkICgpIDsKLQotICAgIERwcmludGYgKCJsZWF2ZSBOWF9TZXRWaWRlb01vZGVcbiIpIDsKLQotICAgIC8vIFdlJ3JlIGRvbmUhCi0gICAgcmV0dXJuIGN1cnJlbnQgOwotfQotCi0vLyBuY29sb3JzIDw9IDI1NgotaW50IE5YX1NldENvbG9ycyAoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICogY29sb3JzKQotewotICAgIGludCAgICAgICAgaSA7Ci0gICAgR1JfUEFMRVRURSBwYWwgOwotCi0gICAgRHByaW50ZiAoImVudGVyIE5YX1NldENvbG9yc1xuIikgOwotCi0gICAgaWYgKG5jb2xvcnMgPiAyNTYpIHJldHVybiAwIDsKLSAgICAKLSAgICBwYWwuY291bnQgPSBuY29sb3JzIDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmNvbG9yczsgKysgaSkgewotICAgICAgICBwYWwucGFsZXR0ZSBbaV0uciA9IGNvbG9ycyBbaV0uciA7Ci0gICAgICAgIHBhbC5wYWxldHRlIFtpXS5nID0gY29sb3JzIFtpXS5nIDsKLSAgICAgICAgcGFsLnBhbGV0dGUgW2ldLmIgPSBjb2xvcnMgW2ldLmIgOwotICAgIH0KLSAgICBHclNldFN5c3RlbVBhbGV0dGUgKGZpcnN0Y29sb3IsICYgcGFsKSA7Ci0KLSAgICBEcHJpbnRmICgibGVhdmUgTlhfU2V0Q29sb3JzXG4iKSA7Ci0gICAgcmV0dXJuIDEgOwotfQotCi1zdGF0aWMgaW50IE5YX1RvZ2dsZUZ1bGxTY3JlZW4gKF9USElTLCBpbnQgb24pCi17Ci0gICAgU0RMX1JlY3QgcmVjdCA7Ci0gICAgVWludDMyICAgZXZlbnRfdGhyZWFkIDsKLSAgICAKLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfVG9nZ2xlRnVsbFNjcmVlblxuIikgOwotCi0gICAgLy8gRG9uJ3Qgc3dpdGNoIGlmIHdlIGRvbid0IG93biB0aGUgd2luZG93Ci0gICAgaWYgKFNETF93aW5kb3dpZCkgcmV0dXJuIDAgOwotICAgIAotICAgIC8vIERvbid0IGxvY2sgaWYgd2UgYXJlIHRoZSBldmVudCB0aHJlYWQKLSAgICBldmVudF90aHJlYWQgPSBTRExfRXZlbnRUaHJlYWRJRCAoKSA7Ci0gICAgaWYgKGV2ZW50X3RocmVhZCAmJiAoU0RMX1RocmVhZElEICgpID09IGV2ZW50X3RocmVhZCkpIHsKLSAgICAgICAgZXZlbnRfdGhyZWFkID0gMCA7Ci0gICAgfQotICAgIGlmIChldmVudF90aHJlYWQpIHsKLSAgICAgICAgU0RMX0xvY2tfRXZlbnRUaHJlYWQoKSA7Ci0gICAgfQotICAgIAotICAgIGlmIChvbikgewotICAgICAgICBOWF9FbnRlckZ1bGxTY3JlZW4gKHRoaXMpIDsKLSAgICB9IGVsc2UgewotICAgICAgICB0aGlzIC0+IHNjcmVlbiAtPiBmbGFncyAmPSB+IFNETF9GVUxMU0NSRUVOIDsKLSAgICAgICAgTlhfTGVhdmVGdWxsU2NyZWVuICh0aGlzKSA7Ci0gICAgfQotCi0gICAgcmVjdC54ID0gcmVjdC55ID0gMCA7Ci0gICAgcmVjdC53ID0gdGhpcyAtPiBzY3JlZW4gLT4gdywgcmVjdC5oID0gdGhpcyAtPiBzY3JlZW4gLT4gaCA7Ci0gICAgTlhfTm9ybWFsVXBkYXRlICh0aGlzLCAxLCAmIHJlY3QpIDsKLQotICAgIGlmIChldmVudF90aHJlYWQpIHsKLSAgICAgICAgU0RMX1VubG9ja19FdmVudFRocmVhZCAoKSA7Ci0gICAgfQotICAgIAotICAgIERwcmludGYgKCJsZWF2ZSBOWF9Ub2dnbGVGdWxsU2NyZWVuXG4iKSA7Ci0gICAgcmV0dXJuIDEgOwotfQotCi0vLyBVcGRhdGUgdGhlIGN1cnJlbnQgbW91c2Ugc3RhdGUgYW5kIHBvc2l0aW9uCi1zdGF0aWMgdm9pZCBOWF9VcGRhdGVNb3VzZSAoX1RISVMpCi17Ci0gICAgaW50ICAgICAgICAgICAgeCwgeSA7Ci0gICAgR1JfV0lORE9XX0lORk8gaW5mbyA7Ci0gICAgR1JfU0NSRUVOX0lORk8gc2kgOwotCi0KLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfVXBkYXRlTW91c2VcbiIpIDsKLQotICAgIC8vIExvY2sgdGhlIGV2ZW50IHRocmVhZCwgaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50cwotICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkICgpIDsKLSAgICAKLSAgICBHckdldFNjcmVlbkluZm8gKCYgc2kpIDsKLSAgICBHckdldFdpbmRvd0luZm8gKFNETF9XaW5kb3csICYgaW5mbykgOwotICAgIHggPSBzaS54cG9zIC0gaW5mby54IDsKLSAgICB5ID0gc2kueXBvcyAtIGluZm8ueSA7Ci0gICAgaWYgKHggPj0gMCAmJiB4IDw9IGluZm8ud2lkdGggJiYgeSA+PSAwICYmIHkgPD0gaW5mby5oZWlnaHQpIHsKLSAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBNT1VTRUZPQ1VTKSA7Ci0gICAgICAgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24gKDAsIDAsIHgsIHkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlICgwLCBTRExfQVBQTU9VU0VGT0NVUykgOwotICAgIH0KLQotICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQgKCkgOwotICAgIERwcmludGYgKCJsZWF2ZSBOWF9VcGRhdGVNb3VzZVxuIikgOwotfQotCi1zdGF0aWMgaW50IE5YX1NldEdhbW1hUmFtcCAoX1RISVMsIFVpbnQxNiAqIHJhbXApCi17Ci0gICAgaW50IGkgOwotICAgIFVpbnQxNiAqIHJlZCwgKiBncmVlbiwgKiBibHVlIDsKLSAgICAKLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfU2V0R2FtbWFSYW1wXG4iKSA7Ci0gICAgCi0gICAgaWYgKFNETF9WaXN1YWwuYnBwICE9IDMyICYmIFNETF9WaXN1YWwuYnBwICE9IDI0KSByZXR1cm4gLTEgOwotCi0gICAgaWYgKCEgR2FtbWFSYW1wX1IpIEdhbW1hUmFtcF9SID0gKFVpbnQxNiAqKSBTRExfbWFsbG9jIChzaXplb2YgKFVpbnQxNikgKiBDSV9TSVpFKSA7Ci0gICAgaWYgKCEgR2FtbWFSYW1wX0cpIEdhbW1hUmFtcF9HID0gKFVpbnQxNiAqKSBTRExfbWFsbG9jIChzaXplb2YgKFVpbnQxNikgKiBDSV9TSVpFKSA7Ci0gICAgaWYgKCEgR2FtbWFSYW1wX0IpIEdhbW1hUmFtcF9CID0gKFVpbnQxNiAqKSBTRExfbWFsbG9jIChzaXplb2YgKFVpbnQxNikgKiBDSV9TSVpFKSA7Ci0gICAgaWYgKCghIEdhbW1hUmFtcF9SKSB8fCAoISBHYW1tYVJhbXBfRykgfHwgKCEgR2FtbWFSYW1wX0IpKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKSA7Ci0gICAgICAgIHJldHVybiAtMSA7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IENJX1NJWkU7ICsrIGkpCi0gICAgICAgIEdhbW1hUmFtcF9SIFtpXSA9IEdhbW1hUmFtcF9HIFtpXSA9IEdhbW1hUmFtcF9CIFtpXSA9IGkgOwotCi0gICAgcmVkICAgPSByYW1wIDsKLSAgICBncmVlbiA9IHJhbXAgKyBDSV9TSVpFIDsKLSAgICBibHVlICA9IGdyZWVuICsgQ0lfU0laRSA7Ci0gICAgICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBDSV9TSVpFOyArKyBpKSB7Ci0gICAgICAgIEdhbW1hUmFtcF9SIFtpXSA9IHJlZCAgIFtpXSA7Ci0gICAgICAgIEdhbW1hUmFtcF9HIFtpXSA9IGdyZWVuIFtpXSA7Ci0gICAgICAgIEdhbW1hUmFtcF9CIFtpXSA9IGJsdWUgIFtpXSA7Ci0gICAgfQotICAgIFNETF9VcGRhdGVSZWN0KHRoaXMtPnNjcmVlbiwgMCwgMCwgMCwgMCk7Ci0KLSAgICBEcHJpbnRmICgibGVhdmUgTlhfU2V0R2FtbWFSYW1wXG4iKSA7ICAgCi0gICAgcmV0dXJuIDAgOwotfQotCi1zdGF0aWMgaW50IE5YX0dldEdhbW1hUmFtcCAoX1RISVMsIFVpbnQxNiAqIHJhbXApCi17Ci0gICAgaW50IGkgOwotICAgIFVpbnQxNiAqIHJlZCwgKiBncmVlbiwgKiBibHVlIDsKLQotICAgIERwcmludGYgKCJlbnRlciBOWF9HZXRHYW1tYVJhbXBcbiIpIDsgICAKLQotICAgIGlmIChTRExfVmlzdWFsLmJwcCAhPSAzMiAmJiBTRExfVmlzdWFsLmJwcCAhPSAyNCkgcmV0dXJuIC0xIDsKLSAgICByZWQgICA9IHJhbXAgOwotICAgIGdyZWVuID0gcmFtcCAgKyBDSV9TSVpFIDsKLSAgICBibHVlICA9IGdyZWVuICsgQ0lfU0laRSA7Ci0gICAgaWYgKEdhbW1hUmFtcF9SICYmIEdhbW1hUmFtcF9HICYmIEdhbW1hUmFtcF9CKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBDSV9TSVpFOyArKyBpKSB7Ci0gICAgICAgICAgICByZWQgICBbaV0gPSBHYW1tYVJhbXBfUiBbaV0gOwotICAgICAgICAgICAgZ3JlZW4gW2ldID0gR2FtbWFSYW1wX0cgW2ldIDsKLSAgICAgICAgICAgIGJsdWUgIFtpXSA9IEdhbW1hUmFtcF9CIFtpXSA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQ0lfU0laRTsgKysgaSkKLSAgICAgICAgICAgIHJlZCBbaV0gPSBncmVlbiBbaV0gPSBibHVlIFtpXSA9IGkgOwotICAgIH0KLQotICAgIERwcmludGYgKCJsZWF2ZSBOWF9HZXRHYW1tYVJhbXBcbiIpIDsKLSAgICByZXR1cm4gMCA7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueHZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueHZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNWZhMjcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9uYW5veC9TRExfbnh2aWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEhzaWVoLUZ1IFRzYWkKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotICAgIAotICAgIEhzaWVoLUZ1IFRzYWkKLSAgICBjbGFyZUBzZXRhYm94LmNvbQotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9ueHZpZGVvX2gKLSNkZWZpbmUgX1NETF9ueHZpZGVvX2gKLQotI2luY2x1ZGUgPG1pY3Jvd2luL25hbm8tWC5oPgotCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0KLSNpZmRlZiBFTkFCTEVfTkFOT1hfREVCVUcKLSNkZWZpbmUgRHByaW50ZiBwcmludGYKLSNlbHNlCi0jZGVmaW5lIERwcmludGYoaWdub3JlLi4uKQotI2VuZGlmCi0KLS8vIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucwotI2RlZmluZSBfVEhJUyAgIFNETF9WaWRlb0RldmljZSAqIHRoaXMKLQotLy8gUHJpdmF0ZSBkaXNwbGF5IGRhdGEKLXR5cGVkZWYgc3RydWN0IE5YX1NETF9WSVNVQUwgewotICAgIGludCAgICBicHAgOwotICAgIFVpbnQzMiByZWRfbWFzayA7Ci0gICAgVWludDMyIGdyZWVuX21hc2sgOwotICAgIFVpbnQzMiBibHVlX21hc2sgOwotfSBueF9zZGxfdmlzdWFsX3QgOwotCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotICAgIEdSX1dJTkRPV19JRCAgICBTRExfV2luZG93IDsKLSAgICBHUl9XSU5ET1dfSUQgICAgRlN3aW5kb3cgOwotICAgIC8vIEZsYWc6IHRydWUgaWYgd2UgaGF2ZSBiZWVuIHBhc3NlZCBhIHdpbmRvdwotICAgIGNoYXIgICAgICAgICAgICAqIFNETF93aW5kb3dpZCA7Ci0gICAgR1JfR0NfSUQgICAgICAgIEdDIDsKLSAgICB1bnNpZ25lZCBjaGFyICAgKiBJbWFnZSA7Ci0gICAgdW5zaWduZWQgY2hhciAgICogSW1hZ2VfYnVmZiA7CS8qIGZvciBHckFyZWEqLwotICAgIHVuc2lnbmVkIGNoYXIgICAqIENsaWVudGZiOwkJLyogZm9yIERpcmVjdEZCKi8KLSAgICBueF9zZGxfdmlzdWFsX3QgU0RMX1Zpc3VhbCA7Ci0gICAgLy8gVGhlIGN1cnJlbnQgbGlzdCBvZiBhdmFpbGFibGUgdmlkZW8gbW9kZXMKLSAgICBTRExfUmVjdCAgICAgICAgKiogbW9kZWxpc3QgOwotICAgIGludCAgICAgICAgICAgICBjdXJyZW50bHlfZnVsbHNjcmVlbiA7Ci0gICAgLy8gZm9yIGZ1bGxzY3JlZW4KLSAgICBpbnQgICAgICAgICAgICAgT2Zmc2V0WCwgT2Zmc2V0WSA7Ci0gICAgLy8gZm9yIEdhbW1hUmFtcAotICAgIFVpbnQxNiAgICAgICAgICAqIEdhbW1hUmFtcF9SLCAqIEdhbW1hUmFtcF9HLCAqIEdhbW1hUmFtcF9CIDsKLSAgICAvLyBmb3IgR3JBcmVhLCByX21hc2ssIGdfbWFzaywgYl9tYXNrCi0gICAgaW50ICAgICAgICAgICAgIHBpeGVsX3R5cGUgOwotI2lmZGVmIEVOQUJMRV9OQU5PWF9ESVJFQ1RfRkIKLSAgICBHUl9XSU5ET1dfRkJfSU5GTyBmYmluZm87Ci0jZW5kaWYKLX0gOwotCi0jZGVmaW5lIFNETF9XaW5kb3cgICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBTRExfV2luZG93KQotI2RlZmluZSBGU3dpbmRvdyAgICAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gRlN3aW5kb3cpCi0jZGVmaW5lIFNETF93aW5kb3dpZCAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBTRExfd2luZG93aWQpCi0jZGVmaW5lIFNETF9HQyAgICAgICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBHQykKLSNkZWZpbmUgU0RMX0ltYWdlICAgICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IEltYWdlKQotI2RlZmluZSBJbWFnZV9idWZmICAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gSW1hZ2VfYnVmZikKLSNkZWZpbmUgQ2xpZW50ZmIgICAgICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IENsaWVudGZiKQotI2RlZmluZSBTRExfVmlzdWFsICAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gU0RMX1Zpc3VhbCkKLSNkZWZpbmUgU0RMX21vZGVsaXN0ICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IG1vZGVsaXN0KQotI2RlZmluZSBjdXJyZW50bHlfZnVsbHNjcmVlbiAodGhpcyAtPiBoaWRkZW4gLT4gY3VycmVudGx5X2Z1bGxzY3JlZW4pCi0jZGVmaW5lIE9mZnNldFggICAgICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBPZmZzZXRYKQotI2RlZmluZSBPZmZzZXRZICAgICAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gT2Zmc2V0WSkKLSNkZWZpbmUgR2FtbWFSYW1wX1IgICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IEdhbW1hUmFtcF9SKQotI2RlZmluZSBHYW1tYVJhbXBfRyAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gR2FtbWFSYW1wX0cpCi0jZGVmaW5lIEdhbW1hUmFtcF9CICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBHYW1tYVJhbXBfQikKLSNkZWZpbmUgcGl4ZWxfdHlwZSAgICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IHBpeGVsX3R5cGUpCi0jZGVmaW5lIGZiaW5mbyAgICAgICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBmYmluZm8pCi0KLSNkZWZpbmUgQ0lfU0laRSAyNTYgICAvLyBjb2xvciBpbmRleCBzaXplCi0KLSNlbmRpZiAgLy8gX1NETF9ueHZpZGVvX2gKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254d20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254d20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhZjNiZi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueHdtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotICAgIENvcHlyaWdodCAoQykgMjAwMSAgSHNpZWgtRnUgVHNhaQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0gICAgCi0gICAgSHNpZWgtRnUgVHNhaQotICAgIGNsYXJlQHNldGFib3guY29tCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotI2luY2x1ZGUgIlNETF9ueHdtX2MuaCIKLQotdm9pZCBOWF9TZXRDYXB0aW9uIChfVEhJUywgY29uc3QgY2hhciAqIHRpdGxlLCBjb25zdCBjaGFyICogaWNvbikKLXsKLSAgICBEcHJpbnRmICgiZW50ZXIgTlhfU2V0Q2FwdGlvblxuIikgOwotCi0gICAgLy8gTG9jayB0aGUgZXZlbnQgdGhyZWFkLCBpbiBtdWx0aS10aHJlYWRpbmcgZW52aXJvbm1lbnRzCi0gICAgU0RMX0xvY2tfRXZlbnRUaHJlYWQgKCkgOwotICAgIAotICAgIGlmIChTRExfV2luZG93KSAKLSAgICAgICAgR3JTZXRXaW5kb3dUaXRsZSAoU0RMX1dpbmRvdywgdGl0bGUpIDsKLSAgICAKLSAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkICgpIDsKLSAgICBEcHJpbnRmICgibGVhdmUgTlhfU2V0Q2FwdGlvblxuIikgOwotfQotCi1pbnQgTlhfR2V0V01JbmZvIChfVEhJUywgU0RMX1N5c1dNaW5mbyAqIGluZm8pCi17Ci0gICAgRHByaW50ZiAoImVudGVyIE5YX0dldFdNSW5mb1xuIikgOwotCi0gICAgaWYgKGluZm8gLT4gdmVyc2lvbi5tYWpvciA8PSBTRExfTUFKT1JfVkVSU0lPTikgewotICAgICAgICBpbmZvIC0+IHdpbmRvdyA9IFNETF9XaW5kb3cgOwotICAgICAgICByZXR1cm4gMSA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJBcHBsaWNhdGlvbiBub3QgY29tcGlsZWQgd2l0aCBTREwgJWQuJWRcbiIsCi0gICAgICAgICAgICBTRExfTUFKT1JfVkVSU0lPTiwgU0RMX01JTk9SX1ZFUlNJT04pIDsKLSAgICAgICAgcmV0dXJuIC0xIDsKLSAgICB9Ci0KLSAgICBEcHJpbnRmICgibGVhdmUgTlhfR2V0V01JbmZvXG4iKSA7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL25hbm94L1NETF9ueHdtX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254d21fYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTljZWM4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vbmFub3gvU0RMX254d21fYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEhzaWVoLUZ1IFRzYWkKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotICAgIAotICAgIEhzaWVoLUZ1IFRzYWkKLSAgICBjbGFyZUBzZXRhYm94LmNvbQotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfbnh2aWRlby5oIgotCi0vLyBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQKLWV4dGVybiB2b2lkIE5YX1NldENhcHRpb24gKF9USElTLCBjb25zdCBjaGFyICogdGl0bGUsIGNvbnN0IGNoYXIgKiBpY29uKSA7Ci1leHRlcm4gaW50IE5YX0dldFdNSW5mbyAoX1RISVMsIFNETF9TeXNXTWluZm8gKiBpbmZvKSA7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL29zMmZzbGliL1NETF9vczJmc2xpYi5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9vczJmc2xpYi9TRExfb3MyZnNsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NTQwYS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL29zMmZzbGliL1NETF9vczJmc2xpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAxOCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2RlZmluZSBfVUxTX0NBTExDT05WXwotI2RlZmluZSBDQUxMQ09OViBfU3lzdGVtCi0jaW5jbHVkZSA8dW5pZGVmLmg+ICAgICAgICAgICAgICAgICAgICAvLyBVbmljb2RlIEFQSQotI2luY2x1ZGUgPHVjb252Lmg+ICAgICAgICAgICAgICAgICAgICAgLy8gVW5pY29kZSBBUEkgKGNvZGVwYWdlIGNvbnZlcnNpb24pCi0KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotCi0jaW5jbHVkZSAiU0RMX29zMmZzbGliLmgiCi0KLXN0YXRpYyBVTE9ORyB1bEZDRlRvVXNlID0KLSAgICAgICAgRkNGX1RJVExFQkFSIHwKLSAgICAgICAgRkNGX1NZU01FTlUgfAotICAgICAgICBGQ0ZfTUlOQlVUVE9OIHwKLSAgICAgICAgRkNGX01BWEJVVFRPTiB8Ci0gICAgICAgIEZDRl9OT0JZVEVBTElHTiB8Ci0gICAgICAgIEZDRl9TSVpFQk9SREVSIHwKLSAgICAgICAgRkNGX1RBU0tMSVNUOwotCi1zdGF0aWMgaW50IGJNb3VzZUNhcHR1cmVkICAgPSAwOwotc3RhdGljIGludCBiTW91c2VDYXB0dXJhYmxlID0gMDsKLXN0YXRpYyBIUE9JTlRFUiBocHRyR2xvYmFsUG9pbnRlciA9IE5VTEw7Ci1zdGF0aWMgSFBPSU5URVIgaHB0ckN1cnJlbnRJY29uID0gTlVMTDsKLXN0YXRpYyBpbnQgaVdpbmRvd1NpemVYID0gMzIwOwotc3RhdGljIGludCBpV2luZG93U2l6ZVkgPSAyMDA7Ci1zdGF0aWMgaW50IGJXaW5kb3dSZXNpemVkID0gMDsKLQotI3ByYWdtYSBwYWNrKDEpCi10eXBlZGVmIHN0cnVjdCBCTVBJTkZPCi17Ci0gICBCSVRNQVBJTkZPOwotICAgUkdCICBjbHI7Ci19IEJNUElORk8sICpQQk1QSU5GTzsKLSNwcmFnbWEgcGFjaygpCi0KLQotLy8gQmFja2Rvb3JzOgotREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9PUzJGU0xJQl9TZXRGQ0ZUb1VzZShVTE9ORyB1bEZDRikKLXsKLSAgdWxGQ0ZUb1VzZSA9IHVsRkNGOwotfQotCi0vLyBDb25maWd1cmF0aW9uIGRlZmluZXM6Ci0KLS8vIFdlIGhhdmUgdG8gcmVwb3J0IGVtcHR5IGFscGhhIG1hc2ssIG90aGVyd2lzZSBTREwgd2lsbCBzZWxlY3QKLS8vIGFscGhhIGJsaXR0ZXJzLCBhbmQgdGhpcyB3aWxsIGhhdmUgdW53YW50ZWQgcmVzdWx0cywgYXMgd2UgZG9uJ3QKLS8vIHN1cHBvcnQgYWxwaGEgY2hhbm5lbCBpbiBGU0xpYiB5ZXQuCi0jZGVmaW5lIFJFUE9SVF9FTVBUWV9BTFBIQV9NQVNLCi0KLS8vIEV4cGVyaW1lbnRhbDogTW92ZSBldmVyeSBGU0xpYl9CaXRCbHQoKSBjYWxsIGludG8gd2luZG93IG1lc3NhZ2UKLS8vIHByb2Nlc3NpbmcgZnVuY3Rpb24uCi0vLyBUaGlzIG1heSBmaXggZGlydCBsZWZ0IG9uIGRlc2t0b3AuIE9yIG5vdC4KLS8vI2RlZmluZSBCSVRCTFRfSU5fV0lOTUVTU0FHRVBST0MKLQotLy8gRXhwZXJpbWVudGFsLTI6IFVzZSBXaW5Mb2NrV2luZG93VXBkYXRlKCkgaW4gYXJvdW5kIGJpdGJsdHMhCi0vLyBUaGlzIGlzIG5vdCBlbmFibGVkLCBiZWNhdXNlIGl0IHNlZW1zIHRvIGNhdXNlIG1vcmUgcHJvYmxlbXMKLS8vIHRoYW4gZ29vZC4KLS8vI2RlZmluZSBVU0VfV0lOTE9DS1dJTkRPV1VQREFURV9BUk9VTkRfQklUQkxUUwotCi0vLyBVc2UgdGhlIGZvbGxvd2luZyB0byBzaG93IHJlc2l6ZWQgaW1hZ2UgaW5zdGVhZCBvZiBibGFjayBzdHVmZgotLy8gZXZlbiBpZiB0aGUgc3VyZmFjZSBpcyByZXNpemFibGUuCi0vLyNkZWZpbmUgUkVTSVpFX0VWRU5fSUZfUkVTSVpBQkxFCi0KLS8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZSBmcm9tIGEgVksga2V5c3ltIHRvIGEgU0RMIGtleXN5bSAqLwotc3RhdGljIFNETEtleSBIV1NjYW5LZXlNYXBbMjU2XTsKLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IHZrZXksIGludCBjaGNvZGUsIGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgaVByZXNzZWQpOwotc3RhdGljIGludCAgaVNoaWZ0SXNQcmVzc2VkOwotCi0jaWZkZWYgQklUQkxUX0lOX1dJTk1FU1NBR0VQUk9DCi0jZGVmaW5lIFdNX1VQREFURVJFQ1RTUkVRVUVTVCAgIFdNX1VTRVIrNTAKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1dJTkxPQ0tXSU5ET1dVUERBVEVfQVJPVU5EX0JJVEJMVFMKLSNkZWZpbmUgRlNMSUJfQklUQkxUKGh3bmQsIGJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KSBcCi0gICAgeyBcCi0gICAgICBXaW5Mb2NrV2luZG93VXBkYXRlKEhXTkRfREVTS1RPUCwgSFdORF9ERVNLVE9QKTsgXAotICAgICAgRlNMaWJfQml0Qmx0KGh3bmQsIGJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KTsgXAotICAgICAgV2luTG9ja1dpbmRvd1VwZGF0ZShIV05EX0RFU0tUT1AsIE5VTEwpOyBcCi0gICAgfQotI2Vsc2UKLSNkZWZpbmUgRlNMSUJfQklUQkxUKGh3bmQsIGJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KSBcCi0gICAgRlNMaWJfQml0Qmx0KGh3bmQsIGJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KTsKLSNlbmRpZgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBTZXRBY2Nlc3NhYmxlV2luZG93UG9zCi0vLwotLy8gU2FtZSBhcyBXaW5TZXRXaW5kb3dQb3MoKSwgYnV0IHRha2VzIGNhcmUgZm9yIHRoZSB3aW5kb3cgdG8gYmUKLS8vIGFsd2F5cyBvbiB0aGUgc2NyZWVuLCB0aGUgdGl0bGViYXIgd2lsbCBiZSBhY2Nlc3NhYmxlIGV2ZXJ5dGltZS4KLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXN0YXRpYyBCT09MIFNldEFjY2Vzc2FibGVXaW5kb3dQb3MoSFdORCBod25kLCBIV05EIGh3bmRJbnNlcnRCZWhpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcgeCwgTE9ORyB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HIGN4LCBMT05HIGN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBmbCkKLXsKLSAgU1dQIHN3cERlc2t0b3AsIHN3cDsKLSAgLy8gR2V0IGRlc2t0b3AgYXJlYQotICBXaW5RdWVyeVdpbmRvd1BvcyhIV05EX0RFU0tUT1AsICZzd3BEZXNrdG9wKTsKLQotICBpZiAoKGZsICYgU1dQX01PVkUpICYmIChmbCAmIFNXUF9TSVpFKSkKLSAgewotICAgIC8vIElmIGJvdGggbW92aW5nIGFuZCBzaXppbmcsIHRoZW4gY2hhbmdlIHNpemUgYW5kIHBvcyBub3chIQotICAgIGlmICh4K2N4PnN3cERlc2t0b3AuY3gpCi0gICAgICB4ID0gc3dwRGVza3RvcC5jeCAtIGN4OwotICAgIGlmICh4PDApCi0gICAgICB4ID0gMDsKLSAgICBpZiAoeTwwKQotICAgICAgeSA9IDA7Ci0gICAgaWYgKHkrY3k+c3dwRGVza3RvcC5jeSkKLSAgICAgIHkgPSBzd3BEZXNrdG9wLmN5IC0gY3k7Ci0gICAgcmV0dXJuIFdpblNldFdpbmRvd1Bvcyhod25kLCBod25kSW5zZXJ0QmVoaW5kLCB4LCB5LCBjeCwgY3ksIGZsKTsKLSAgfSBlbHNlCi0gIGlmIChmbCAmIFNXUF9NT1ZFKQotICB7Ci0gICAgLy8gSnVzdCBtb3ZpbmcKLSAgICBXaW5RdWVyeVdpbmRvd1Bvcyhod25kLCAmc3dwKTsKLSAgICBpZiAoeCtzd3AuY3g+c3dwRGVza3RvcC5jeCkKLSAgICAgIHggPSBzd3BEZXNrdG9wLmN4IC0gc3dwLmN4OwotICAgIGlmICh4PDApCi0gICAgICB4ID0gMDsKLSAgICBpZiAoeTwwKQotICAgICAgeSA9IDA7Ci0gICAgaWYgKHkrc3dwLmN5PnN3cERlc2t0b3AuY3kpCi0gICAgICB5ID0gc3dwRGVza3RvcC5jeSAtIHN3cC5jeTsKLSAgICByZXR1cm4gV2luU2V0V2luZG93UG9zKGh3bmQsIGh3bmRJbnNlcnRCZWhpbmQsIHgsIHksIGN4LCBjeSwgZmwpOwotICB9IGVsc2UKLSAgaWYgKGZsICYgU1dQX1NJWkUpCi0gIHsKLSAgICAvLyBKdXN0IHNpemluZwotICAgIFdpblF1ZXJ5V2luZG93UG9zKGh3bmQsICZzd3ApOwotICAgIHggPSBzd3AueDsKLSAgICB5ID0gc3dwLnk7Ci0gICAgaWYgKHgrY3g+c3dwRGVza3RvcC5jeCkKLSAgICAgIHggPSBzd3BEZXNrdG9wLmN4IC0gY3g7Ci0gICAgaWYgKHg8MCkKLSAgICAgIHggPSAwOwotICAgIGlmICh5PDApCi0gICAgICB5ID0gMDsKLSAgICBpZiAoeStjeT5zd3BEZXNrdG9wLmN5KQotICAgICAgeSA9IHN3cERlc2t0b3AuY3kgLSBjeTsKLSAgICByZXR1cm4gV2luU2V0V2luZG93UG9zKGh3bmQsIGh3bmRJbnNlcnRCZWhpbmQsIHgsIHksIGN4LCBjeSwgZmwgfCBTV1BfTU9WRSk7Ci0gIH0gZWxzZQotICByZXR1cm4gV2luU2V0V2luZG93UG9zKGh3bmQsIGh3bmRJbnNlcnRCZWhpbmQsIHgsIHksIGN4LCBjeSwgZmwpOwotfQotCi1zdGF0aWMgVW5pQ2hhciBOYXRpdmVDaGFyVG9VbmlDaGFyKGludCBjaGNvZGUpCi17Ci0gIFVuaUNoYXIgdWNSZXN1bHQgPSAoVW5pQ2hhcikgY2hjb2RlOwotICBpbnQgcmM7Ci0gIFVjb252T2JqZWN0IHVjb1RlbXA7Ci0gIGNoYXIgICAgIGFjaEZyb21bMl07Ci0gIGNoYXIgICAgICpwY2hGcm9tOwotICBzaXplX3QgICBpRnJvbUNvdW50OwotICBVbmlDaGFyICBhdWNUb1sxMF07Ci0gIFVuaUNoYXIgICpwdWNUbzsKLSAgc2l6ZV90ICAgaVRvQ291bnQ7Ci0gIHNpemVfdCAgIGlOb25JZGVudGljYWw7Ci0KLSAgLy8gQ3JlYXRlIHVuaWNvZGUgY29udmVydCBvYmplY3QKLSAgcmMgPSBVbmlDcmVhdGVVY29udk9iamVjdChMIiIsICZ1Y29UZW1wKTsKLSAgaWYgKHJjIT1VTFNfU1VDQ0VTUykKLSAgewotICAgIC8vIENvdWxkIG5vdCBjcmVhdGUgY29udmVydCBvYmplY3QhCi0gICAgcmV0dXJuIHVjUmVzdWx0OwotICB9Ci0KLSAgLy8gQ29udmVydCBsYW5ndWFnZSBjb2RlIHN0cmluZyB0byB1bmljb2RlIHN0cmluZwotICBhY2hGcm9tWzBdID0gKGNoYXIpIGNoY29kZTsKLSAgYWNoRnJvbVsxXSA9IDA7Ci0gIGlGcm9tQ291bnQgPSBzaXplb2YoY2hhcikgKiAyOwotICBpVG9Db3VudCA9IHNpemVvZihVbmlDaGFyKSAqIDI7Ci0gIHB1Y1RvID0gJihhdWNUb1swXSk7Ci0gIHBjaEZyb20gPSAmKGFjaEZyb21bMF0pOwotCi0gIHJjID0gVW5pVWNvbnZUb1Vjcyh1Y29UZW1wLAotICAgICAgICAgICAgICAgICAgICAgJnBjaEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAmaUZyb21Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgICZwdWNUbywKLSAgICAgICAgICAgICAgICAgICAgICZpVG9Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgICZpTm9uSWRlbnRpY2FsKTsKLQotICBpZiAocmMhPVVMU19TVUNDRVNTKQotICB7Ci0gICAgLy8gQ291bGQgbm90IGNvbnZlcnQgbGFuZ3VhZ2UgY29kZSB0byBVQ1Mgc3RyaW5nIQotICAgIFVuaUZyZWVVY29udk9iamVjdCh1Y29UZW1wKTsKLSAgICByZXR1cm4gdWNSZXN1bHQ7Ci0gIH0KLQotICBVbmlGcmVlVWNvbnZPYmplY3QodWNvVGVtcCk7Ci0KLSNpZmRlZiBERUJVR19CVUlMRAotICBwcmludGYoIiUwMnggY29udmVydGVkIHRvICUwMnhcbiIsIChpbnQpIGNoY29kZSwgKGludCkgKGF1Y1RvWzBdKSk7Ci0jZW5kaWYKLQotICByZXR1cm4gYXVjVG9bMF07Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIFRyYW5zbGF0ZUtleQotLy8KLS8vIFRoaXMgY3JlYXRlcyBTREwgS2V5Y29kZXMgZnJvbSBWS18gYW5kIGhhcmR3YXJlIHNjYW4gY29kZXMKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IHZrZXksIGludCBjaGNvZGUsIGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgaVByZXNzZWQpCi17Ci0gIGtleXN5bS0+c2NhbmNvZGUgPSAodW5zaWduZWQgY2hhcikgc2NhbmNvZGU7Ci0gIGtleXN5bS0+bW9kID0gS01PRF9OT05FOwotICBrZXlzeW0tPnVuaWNvZGUgPSAwOwotCi0gIGlmIChpUHJlc3NlZCAmJiBTRExfVHJhbnNsYXRlVU5JQ09ERSkKLSAgewotICAgIGlmIChjaGNvZGUpCi0gICAgICBrZXlzeW0tPnVuaWNvZGUgPSBOYXRpdmVDaGFyVG9VbmlDaGFyKGNoY29kZSk7Ci0gICAgZWxzZQotICAgICAga2V5c3ltLT51bmljb2RlID0gdmtleTsKLSAgfQotCi0gIGtleXN5bS0+c3ltID0gSFdTY2FuS2V5TWFwW3NjYW5jb2RlXTsKLQotICAvLyBOb3cgc3R1ZmZzIGJhc2VkIG9uIHN0YXRlIG9mIHNoaWZ0IGtleShzKSEKLSAgaWYgKHZrZXkgPT0gVktfU0hJRlQpCi0gIHsKLSAgICBpU2hpZnRJc1ByZXNzZWQgPSBpUHJlc3NlZDsKLSAgfQotCi0gIGlmICgoaVNoaWZ0SXNQcmVzc2VkKSAmJiAoU0RMX1RyYW5zbGF0ZVVOSUNPREUpKQotICB7Ci0gICAgLy8gQ2hhbmdlIHN5bXMsIGlmIFVuaWNvZGUgc3R1ZmYgaXMgcmVxdWlyZWQKLSAgICAvLyBJIHRoaW5rIGl0J3Mgc2lsbHksIGJ1dCBpdCdzIFNETC4uLgotICAgIHN3aXRjaCAoa2V5c3ltLT5zeW0pCi0gICAgewotICAgICAgY2FzZSBTRExLX0JBQ0tRVU9URToKLSAgICAgICAga2V5c3ltLT5zeW0gPSAnfic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTRExLXzE6Ci0gICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19FWENMQUlNOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RMS18yOgotICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfQVQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTRExLXzM6Ci0gICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19IQVNIOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RMS180OgotICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfRE9MTEFSOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RMS181OgotICAgICAgICBrZXlzeW0tPnN5bSA9ICclJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNETEtfNjoKLSAgICAgICAga2V5c3ltLT5zeW0gPSBTRExLX0NBUkVUOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RMS183OgotICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfQU1QRVJTQU5EOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RMS184OgotICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfQVNURVJJU0s7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTRExLXzk6Ci0gICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19MRUZUUEFSRU47Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTRExLXzA6Ci0gICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19SSUdIVFBBUkVOOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RMS19NSU5VUzoKLSAgICAgICAga2V5c3ltLT5zeW0gPSBTRExLX1VOREVSU0NPUkU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTRExLX1BMVVM6Ci0gICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19FUVVBTFM7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFNETEtfTEVGVEJSQUNLRVQ6Ci0gICAgICAgIGtleXN5bS0+c3ltID0gJ3snOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RMS19SSUdIVEJSQUNLRVQ6Ci0gICAgICAgIGtleXN5bS0+c3ltID0gJ30nOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBTRExLX1NFTUlDT0xPTjoKLSAgICAgICAga2V5c3ltLT5zeW0gPSBTRExLX0NPTE9OOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RMS19RVU9URToKLSAgICAgICAga2V5c3ltLT5zeW0gPSBTRExLX1FVT1RFREJMOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RMS19CQUNLU0xBU0g6Ci0gICAgICAgIGtleXN5bS0+c3ltID0gJ3wnOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBTRExLX0NPTU1BOgotICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfTEVTUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNETEtfUEVSSU9EOgotICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfR1JFQVRFUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNETEtfU0xBU0g6Ci0gICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19RVUVTVElPTjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4ga2V5c3ltOwotfQotCi0jZGVmaW5lIENPTlZFUlRNT1VTRVBPU0lUSU9OKCkgIFwKLSAgICAgICAgLyogV2UgaGF2ZSB0byBpbnZlcnNlIHRoZSBtb3VzZSBwb3NpdGlvbiwgYmVjYXVzZSBldmVyeSBub24tb3MvMiBzeXN0ZW0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIC8qIGhhcyBhIGNvb3JkaW5hdGUgc3lzdGVtIHdoZXJlIHRoZSAoMDswKSBpcyB0aGUgdG9wLWxlZnQgY29ybmVyLCAgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAvKiB3aGlsZSBvbiBvcy8yIGl0J3MgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKEZTTGliX1F1ZXJ5RlNNb2RlKGh3bmQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIC8qIFdlJ3JlIGluIEZTIG1vZGUhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAvKiBJbiBGUyBtb2RlIG91ciB3aW5kb3cgaXMgYXMgYmlnIGFzIGZ1bGxzY3JlZW4gbW9kZSwgYnV0IG5vdCBuZWNlc3NhcnkgYXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgLyogYmlnIGFzIHRoZSBzb3VyY2UgYnVmZmVyIChjYW4gYmUgYmlnZ2VyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIC8qIFNvLCBsaW1pdCBtb3VzZSBwb3MgdG8gc291cmNlIGJ1ZmZlciBzaXplISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpZiAocHB0cy0+eDwwKSBwcHRzLT54ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKHBwdHMtPnk8MCkgcHB0cy0+eSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmIChwcHRzLT54Pj1wVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uKSBwcHRzLT54ID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbi0xOyAgICAgIFwKLSAgICAgICAgICBpZiAocHB0cy0+eT49cFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbikgcHB0cy0+eSA9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24tMTsgICAgICBcCi0gICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHB0bC54ID0gcHB0cy0+eDsgcHRsLnkgPSBwcHRzLT55OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBXaW5NYXBXaW5kb3dQb2ludHMocFZpZGVvLT5oaWRkZW4tPmh3bmRDbGllbnQsIEhXTkRfREVTS1RPUCwgJnB0bCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgV2luU2V0UG9pbnRlclBvcyhIV05EX0RFU0tUT1AsIHB0bC54LCBwdGwueSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIC8qIFRoZW4gY29udmVydCBPUy8yIHBvc2l0aW9uIHRvIFNETCBwb3NpdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBwcHRzLT55ID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAtIHBwdHMtPnkgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBTV1Agc3dwQ2xpZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgLyogV2UncmUgaW4gd2luZG93ZWQgbW9kZSEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAvKiBDb252ZXJ0IE9TLzIgbW91c2UgcG9zaXRpb24gdG8gU0RMIHBvc2l0aW9uLCBhbmQgYWxzbyBzY2FsZSBpdCEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHBwdHMtPngpID0gKHBwdHMtPngpICogcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbiAvIHN3cENsaWVudC5jeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHBwdHMtPnkpID0gKHBwdHMtPnkpICogcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAvIHN3cENsaWVudC5jeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHBwdHMtPnkpID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAtIChwcHRzLT55KSAgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0KLQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIFduZFByb2MKLS8vCi0vLyBUaGlzIGlzIHRoZSBtZXNzYWdlIHByb2Nlc3Npbmcgd2luZG93IHByb2NlZHVyZSBmb3IgdGhlCi0vLyBTRExXaW5kb3dDbGFzcywgd2hpY2ggaXMgdGhlIGNsaWVudCB3aW5kb3cgaW4gb3VyIGFwcGxpY2F0aW9uLgotLy8gSXQgaGFuZGxlcyBzd2l0Y2hpbmcgYmFjayBhbmQgYXdheSBmcm9tIHRoZSBhcHAgKHRha2luZyBjYXJlIG9mCi0vLyBnb2luZyBvdXQgYW5kIGJhY2sgdG8gYW5kIGZyb20gZnVsbHNjcmVlbiBtb2RlKSwgc2VuZGluZyBrZXlzdHJva2VzCi0vLyBhbmQgbW91c2UgZXZlbnRzIHRvIHdoZXJlIGl0IGhhcyB0byBiZSBzZW50LCBldGMuLi4KLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXN0YXRpYyBNUkVTVUxUIEVYUEVOVFJZIFduZFByb2MoIEhXTkQgaHduZCwgVUxPTkcgbXNnLCBNUEFSQU0gbXAxLCBNUEFSQU0gbXAyKQotewotICBIUFMgcHM7Ci0gIFJFQ1RMIHJjbDsKLSAgU0RMX1ZpZGVvRGV2aWNlICpwVmlkZW8gPSBOVUxMOwotCi0gIHN3aXRjaCAobXNnKQotICB7Ci0gICAgY2FzZSBXTV9DSEFSOiAgLy8gS2V5cHJlc3Mgbm90aWZpY2F0aW9uCi0jaWZkZWYgREVCVUdfQlVJTEQKLS8vICAgICAgcHJpbnRmKCJXTV9DSEFSXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgIHBWaWRlbyA9IFdpblF1ZXJ5V2luZG93UHRyKGh3bmQsIDApOwotICAgICAgaWYgKHBWaWRlbykKLSAgICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgLy8gV2Ugc2tpcCByZXBlYXRlZCBrZXlzOgotICAgICAgICBpZiAoQ0hBUk1TRygmbXNnKS0+Y1JlcGVhdD4xKQotICAgICAgICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLS8vICAgICAgICAgIHByaW50ZigiUmVwZWF0ZWQga2V5ICglZCksIHNraXBwaW5nLi4uXG4iLCBDSEFSTVNHKCZtc2cpLT5jUmVwZWF0KTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgICAgICByZXR1cm4gKE1SRVNVTFQpIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICAvLyBJZiBpdCdzIG5vdCByZXBlYXRlZCwgdGhlbiBsZXQncyBzZWUgaWYgaXRzIHByZXNzZWQgb3IgcmVsZWFzZWQhCi0gICAgICAgIGlmIChTSE9SVDFGUk9NTVAobXAxKSAmIEtDX0tFWVVQKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQSBrZXkgaGFzIGJlZW4gcmVsZWFzZWQKLSAgICAgICAgICBTRExfa2V5c3ltIGtleXN5bTsKLQotI2lmZGVmIERFQlVHX0JVSUxECi0vLyAgICAgICAgICBwcmludGYoIldNX0NIQVIsIGtleXVwLCBjb2RlIGlzIFsweCUweF1cbiIsIENIQVI0RlJPTU1QKG1wMSkpOyAvLyBIVyBzY2FuIGNvZGUKLSNlbmRpZgotCi0gICAgICAgICAgLy8gT25lIHByb2JsZW0gaXMgd2l0aCBGMSwgd2hpY2ggZ2V0cyBvbmx5IHRoZSBrZXl1cCBtZXNzYWdlIGJlY2F1c2UKLSAgICAgICAgICAvLyBpdCBpcyBhIHN5c3RlbSBrZXkuCi0gICAgICAgICAgLy8gU28sIHdoZW4gd2UgZ2V0IGtleXVwIG1lc3NhZ2UsIHdlIHNpbXVsYXRlIGtleWRvd24gdG9vIQotICAgICAgICAgIC8vIFVQREFURToKLSAgICAgICAgICAvLyAgVGhpcyBwcm9ibGVtIHNob3VsZCBiZSBzb2x2ZWQgbm93LCB0aGF0IHRoZSBhY2NlbGVyYXRvciBrZXlzIGFyZQotICAgICAgICAgIC8vICBkaXNhYmxlZCBmb3IgdGhpcyB3aW5kb3chCi0gICAgICAgICAgLyoKLSAgICAgICAgICBpZiAoU0hPUlQyRlJPTU1QKG1wMik9PVZLX0YxKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsIFRyYW5zbGF0ZUtleShTSE9SVDJGUk9NTVAobXAyKSwgLy8gVktfIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQxRlJPTU1QKG1wMiksIC8vIENoYXJhY3RlciBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVI0RlJPTU1QKG1wMSksICAvLyBIVyBTY2FuIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleXN5bSwwKSk7Ci0gICAgICAgICAgfSovCi0KLSAgICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgVHJhbnNsYXRlS2V5KFNIT1JUMkZST01NUChtcDIpLCAvLyBWS18gY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQxRlJPTU1QKG1wMiksIC8vIENoYXJhY3RlciBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSNEZST01NUChtcDEpLCAgLy8gSFcgU2NhbiBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5c3ltLDApKTsKLSAgICAgICAgICAKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBIGtleSBoYXMgYmVlbiBwcmVzc2VkCi0gICAgICAgICAgU0RMX2tleXN5bSBrZXlzeW07Ci0KLSNpZmRlZiBERUJVR19CVUlMRAotLy8gICAgICAgICAgcHJpbnRmKCJXTV9DSEFSLCBrZXlkb3duLCBjb2RlIGlzIFsweCUweF1cbiIsIENIQVI0RlJPTU1QKG1wMSkpOyAvLyBIVyBzY2FuIGNvZGUKLSNlbmRpZgotICAgICAgICAgIC8vIENoZWNrIGZvciBmYXN0a2V5czogQUxUK0hPTUUgdG8gdG9nZ2xlIEZTIG1vZGUKLSAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIEFMVCtFTkQgdG8gY2xvc2UgYXBwCi0gICAgICAgICAgaWYgKChTSE9SVDFGUk9NTVAobXAxKSAmIEtDX0FMVCkgJiYKLSAgICAgICAgICAgICAgKFNIT1JUMkZST01NUChtcDIpID09IFZLX0hPTUUpKQotICAgICAgICAgIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgICAgICAgcHJpbnRmKCIgUHJlc3NlZCBBTFQrSE9NRSFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgICAgICAgLy8gT25seSBzd2l0Y2ggYmV0d2VlbiBmdWxsc2NyZWVuIGFuZCBiYWNrIGlmIGl0J3Mgbm90Ci0gICAgICAgICAgICAvLyBhIHJlc2l6YWJsZSBtb2RlIQotICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICghcFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSB8fAotICAgICAgICAgICAgICAgICgocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKQotICAgICAgICAgICAgICAgICAmJiAoKHBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkVTSVpBQkxFKT09MCkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgIEZTTGliX1RvZ2dsZUZTTW9kZShod25kLCAhRlNMaWJfUXVlcnlGU01vZGUoaHduZCkpOwotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHByaW50ZigiIFJlc2l6YWJsZSBtb2RlLCBzbyBkaXNjYXJkaW5nIEFMVCtIT01FIVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgaWYgKChTSE9SVDFGUk9NTVAobXAxKSAmIEtDX0FMVCkgJiYKLSAgICAgICAgICAgICAgKFNIT1JUMkZST01NUChtcDIpID09IFZLX0VORCkpCi0gICAgICAgICAgewotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICAgICAgICBwcmludGYoIiBQcmVzc2VkIEFMVCtFTkQhXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIC8vIENsb3NlIHdpbmRvdywgYW5kIGdldCBvdXQgb2YgbG9vcCEKLSAgICAgICAgICAgIC8vIEFsc28gc2VuZCBldmVudCB0byBTREwgYXBwbGljYXRpb24sIGJ1dCB3ZSB3b24ndAotICAgICAgICAgICAgLy8gd2FpdCBmb3IgaXQgdG8gYmUgcHJvY2Vzc2VkIQotICAgICAgICAgICAgU0RMX1ByaXZhdGVRdWl0KCk7Ci0gICAgICAgICAgICBXaW5Qb3N0TXNnKGh3bmQsIFdNX1FVSVQsIDAsIDApOwotICAgICAgICAgIH0gZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgVHJhbnNsYXRlS2V5KFNIT1JUMkZST01NUChtcDIpLCAvLyBWS18gY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUMUZST01NUChtcDIpLCAvLyBDaGFyYWN0ZXIgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVI0RlJPTU1QKG1wMSksICAvLyBIVyBTY2FuIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5c3ltLDEpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIChNUkVTVUxUKSBUUlVFOwotCi0gICAgY2FzZSBXTV9UUkFOU0xBVEVBQ0NFTDoKLSAgICAgIHsKLSAgICAgICAgUFFNU0cgcHFtc2c7Ci0gICAgICAgIHBxbXNnID0gKFBRTVNHKSBtcDE7Ci0gICAgICAgIGlmIChtcDEpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocHFtc2ctPm1zZyA9PSBXTV9DSEFSKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdNX0NIQVIgbWVzc2FnZSEKLSAgICAgICAgICAgIC8vIExldCdzIGZpbHRlciB0aGUgQUxUIGtleXByZXNzIGFuZCBhbGwgb3RoZXIgYWNjZWxlcmF0aW9uIGtleXMhCi0gICAgICAgICAgICByZXR1cm4gKE1SRVNVTFQpIEZBTFNFOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsgLy8gRGVmYXVsdCBwcm9jZXNzaW5nIChwYXNzIHRvIHBhcmVudCB1bnRpbCBmcmFtZSBjb250cm9sKQotICAgICAgfQotCi0gICAgY2FzZSBXTV9QQUlOVDogIC8vIFdpbmRvdyByZWRyYXchCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiV01fUEFJTlQgKDB4JXgpXG4iLCBod25kKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgIHBzID0gV2luQmVnaW5QYWludChod25kLDAsJnJjbCk7Ci0gICAgICBwVmlkZW8gPSBGU0xpYl9HZXRVc2VyUGFybShod25kKTsKLSAgICAgIGlmIChwVmlkZW8pCi0gICAgICB7Ci0gICAgICAgIGlmICghcFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKQotICAgICAgICB7Ci0gICAgICAgICAgUkVDVEwgcmNsUmVjdDsKLSAgICAgICAgICAvLyBTbywgZG9uJ3QgYmxpdCBub3chCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgICAgICBwcmludGYoIldNX1BBSU5UIDogU2tpcHBpbmcgYmxpdCB3aGlsZSByZXNpemluZyAoUHJlISkhXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgICAgICBXaW5RdWVyeVdpbmRvd1JlY3QoaHduZCwgJnJjbFJlY3QpOwotICAgICAgICAgIC8vIEZpbGwgd2l0aCBibGFjawotICAgICAgICAgIFdpbkZpbGxSZWN0KHBzLCAmcmNsUmVjdCwgQ0xSX0JMQUNLKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoRG9zUmVxdWVzdE11dGV4U2VtKHBWaWRlby0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyLCAxMDAwKT09Tk9fRVJST1IpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGlUb3AsIGlMZWZ0LCBpV2lkdGgsIGlIZWlnaHQ7Ci0gICAgICAgICAgICBpbnQgaVhTY2FsZUVycm9yLCBpWVNjYWxlRXJyb3I7Ci0gICAgICAgICAgICBpbnQgaVhTY2FsZUVycm9yMiwgaVlTY2FsZUVycm9yMjsKLSAgICAgICAgICAgIFNXUCBzd3A7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFJlLWJsaXQgdGhlIG1vZGlmaWVkIGFyZWEhCi0gICAgICAgICAgICAvLyBGb3IgdGhpcywgd2UgaGF2ZSB0byBjYWxjdWxhdGUgdGhlIHBvaW50cywgc2NhbGVkIQotICAgICAgICAgICAgV2luUXVlcnlXaW5kb3dQb3MoaHduZCwgJnN3cCk7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgICAgICAgIHByaW50ZigiV01fUEFJTlQgOiBXaW5TaXplOiAlZCAlZCwgQnVmU2l6ZTogJWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgc3dwLmN4LAotICAgICAgICAgICAgICAgICAgIHN3cC5jeSwKLSAgICAgICAgICAgICAgICAgICBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24KLSAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotCi0jaWZuZGVmIFJFU0laRV9FVkVOX0lGX1JFU0laQUJMRQotICAgICAgICAgICAgLy8gQnV0IG9ubHkgYmxpdCBpZiB0aGUgd2luZG93IGlzIG5vdCByZXNpemFibGUsIG9yIGlmCi0gICAgICAgICAgICAvLyB0aGUgd2luZG93IGlzIHJlc2l6YWJsZSBhbmQgdGhlIHNvdXJjZSBidWZmZXIgc2l6ZSBpcyB0aGUKLSAgICAgICAgICAgIC8vIHNhbWUgYXMgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBzaXplIQotICAgICAgICAgICAgaWYgKCghcFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSB8fAotICAgICAgICAgICAgICAgICgocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSAmJgotICAgICAgICAgICAgICAgICAocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlLT5mbGFncyAmIFNETF9SRVNJWkFCTEUpICYmCi0gICAgICAgICAgICAgICAgICgoc3dwLmN4ICE9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24pIHx8Ci0gICAgICAgICAgICAgICAgICAoc3dwLmN5ICE9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24pCi0gICAgICAgICAgICAgICAgICkgJiYKLSAgICAgICAgICAgICAgICAgKCFGU0xpYl9RdWVyeUZTTW9kZShod25kKSkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFJFQ1RMIHJjbFJlY3Q7Ci0gICAgICAgICAgICAgIC8vIFJlc2l6YWJsZSBzdXJmYWNlIGFuZCBpbiByZXNpemluZyEKLSAgICAgICAgICAgICAgLy8gU28sIGRvbid0IGJsaXQgbm93IQotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICAgICAgICAgIHByaW50ZigiV01fUEFJTlQgOiBTa2lwcGluZyBibGl0IHdoaWxlIHJlc2l6aW5nIVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UmVjdChod25kLCAmcmNsUmVjdCk7Ci0gICAgICAgICAgICAgIC8vIEZpbGwgd2l0aCBibGFjawotICAgICAgICAgICAgICBXaW5GaWxsUmVjdChwcywgJnJjbFJlY3QsIENMUl9CTEFDSyk7Ci0gICAgICAgICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAKLSAgICAgICAgICAgICAgaVhTY2FsZUVycm9yID0gKHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24tMSkgLyBzd3AuY3g7Ci0gICAgICAgICAgICAgIGlZU2NhbGVFcnJvciA9IChwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uLTEpIC8gc3dwLmN5OwotICAgICAgICAgICAgICBpZiAoaVhTY2FsZUVycm9yPDApIGlYU2NhbGVFcnJvciA9IDA7Ci0gICAgICAgICAgICAgIGlmIChpWVNjYWxlRXJyb3I8MCkgaVlTY2FsZUVycm9yID0gMDsKLSAgICAgICAgICAgICAgaVhTY2FsZUVycm9yMiA9IChzd3AuY3gtMSkvKHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24pOwotICAgICAgICAgICAgICBpWVNjYWxlRXJyb3IyID0gKHN3cC5jeS0xKS8ocFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbik7Ci0gICAgICAgICAgICAgIGlmIChpWFNjYWxlRXJyb3IyPDApIGlYU2NhbGVFcnJvcjIgPSAwOwotICAgICAgICAgICAgICBpZiAoaVlTY2FsZUVycm9yMjwwKSBpWVNjYWxlRXJyb3IyID0gMDsKLSAgICAgIAotICAgICAgICAgICAgICBpVG9wID0gKHN3cC5jeSAtIHJjbC55VG9wKSAqIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24gLyBzd3AuY3kgLSBpWVNjYWxlRXJyb3I7Ci0gICAgICAgICAgICAgIGlMZWZ0ID0gcmNsLnhMZWZ0ICogcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbiAvIHN3cC5jeCAtIGlYU2NhbGVFcnJvcjsKLSAgICAgICAgICAgICAgaVdpZHRoID0gKChyY2wueFJpZ2h0LXJjbC54TGVmdCkgKiBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uICsgc3dwLmN4LTEpCi0gICAgICAgICAgICAgICAgLyBzd3AuY3ggKyAyKmlYU2NhbGVFcnJvcjsKLSAgICAgICAgICAgICAgaUhlaWdodCA9ICgocmNsLnlUb3AtcmNsLnlCb3R0b20pICogcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiArIHN3cC5jeS0xKQotICAgICAgICAgICAgICAgIC8gc3dwLmN5ICsgMippWVNjYWxlRXJyb3I7Ci0gICAgICAKLSAgICAgICAgICAgICAgaVdpZHRoKz1pWFNjYWxlRXJyb3IyOwotICAgICAgICAgICAgICBpSGVpZ2h0Kz1pWVNjYWxlRXJyb3IyOwotICAgICAgCi0gICAgICAgICAgICAgIGlmIChpVG9wPDApIGlUb3AgPSAwOwotICAgICAgICAgICAgICBpZiAoaUxlZnQ8MCkgaUxlZnQgPSAwOwotICAgICAgICAgICAgICBpZiAoaVRvcCtpSGVpZ2h0PnBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24pIGlIZWlnaHQgPSBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uLWlUb3A7Ci0gICAgICAgICAgICAgIGlmIChpTGVmdCtpV2lkdGg+cFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbikgaVdpZHRoID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbi1pTGVmdDsKLSAgICAKLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgICAgICAgICBwcmludGYoIldNX1BBSU5UIDogQml0Qmx0OiAlZCAlZCAtPiAlZCAlZCAoQnVmICVkIHggJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgaVRvcCwgaUxlZnQsIGlXaWR0aCwgaUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBGU0xJQl9CSVRCTFQoaHduZCwgcFZpZGVvLT5oaWRkZW4tPnBjaFNyY0J1ZmZlciwgaVRvcCwgaUxlZnQsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gIAotICAgICAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKHBWaWRlby0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmludGYoIldNX1BBSU5UIDogTm8gcFZpZGVvIVxuIik7IGZmbHVzaChzdGRvdXQpOwotICAgICAgfQotI2VuZGlmCi0gICAgICBXaW5FbmRQYWludChwcyk7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiV01fUEFJTlQgOiBEb25lLlxuIik7Ci0gICAgICBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIFdNX1NJWkU6Ci0gICAgICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgICAgcHJpbnRmKCJXTV9TSVpFIDogKCVkICVkKVxuIiwKLSAgICAgICAgICAgICAgIFNIT1JUMUZST01NUChtcDIpLCBTSE9SVDJGUk9NTVAobXAyKSk7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gICAgICAgIGlXaW5kb3dTaXplWCA9IFNIT1JUMUZST01NUChtcDIpOwotICAgICAgICBpV2luZG93U2l6ZVkgPSBTSE9SVDJGUk9NTVAobXAyKTsKLSAgICAgICAgYldpbmRvd1Jlc2l6ZWQgPSAxOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgd2luZG93IHdpbGwgYmUgcmVkcmF3bgotICAgICAgICBXaW5JbnZhbGlkYXRlUmVnaW9uKGh3bmQsIE5VTEwsIFRSVUUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFdNX0ZTTElCTk9USUZJQ0FUSU9OOgotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICAgIHByaW50ZigiV01fRlNMSUJOT1RJRklDQVRJT05cbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgaWYgKChpbnQpbXAxID09IEZTTE5fVE9HR0xFRlNNT0RFKQotICAgICAgewotICAgICAgICAvLyBGUyBtb2RlIGNoYW5nZWQsIHJlYmxpdCBpbWFnZSEKLSAgICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7Ci0gICAgICAgIGlmIChwVmlkZW8pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIXBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBSZXNpemFibGUgc3VyZmFjZSBhbmQgaW4gcmVzaXppbmchCi0gICAgICAgICAgICAvLyBTbywgZG9uJ3QgYmxpdCBub3chCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgICAgICAgIHByaW50ZigiV01fRlNMSUJOT1RJRklDQVRJT04gOiBDYW4gbm90IGJsaXQgaWYgdGhlcmUgaXMgbm8gc3VyZmFjZSwgZG9pbmcgbm90aGluZy5cbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgICAgIH0gZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChEb3NSZXF1ZXN0TXV0ZXhTZW0ocFZpZGVvLT5oaWRkZW4tPmhtdHhVc2VTcmNCdWZmZXIsIDEwMDApPT1OT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZSkKLSAgICAgICAgICAgICAgewotI2lmbmRlZiBSRVNJWkVfRVZFTl9JRl9SRVNJWkFCTEUKLSAgICAgICAgICAgICAgICBTV1Agc3dwOwotCi0gICAgICAgICAgICAgICAgLy8gQnV0IG9ubHkgYmxpdCBpZiB0aGUgd2luZG93IGlzIG5vdCByZXNpemFibGUsIG9yIGlmCi0gICAgICAgICAgICAgICAgLy8gdGhlIHdpbmRvdyBpcyByZXNpemFibGUgYW5kIHRoZSBzb3VyY2UgYnVmZmVyIHNpemUgaXMgdGhlCi0gICAgICAgICAgICAgICAgLy8gc2FtZSBhcyB0aGUgZGVzdGluYXRpb24gYnVmZmVyIHNpemUhCi0gICAgICAgICAgICAgICAgV2luUXVlcnlXaW5kb3dQb3MoaHduZCwgJnN3cCk7Ci0gICAgICAgICAgICAgICAgaWYgKCghcFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSB8fAotICAgICAgICAgICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgICAgICAocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSAmJgotICAgICAgICAgICAgICAgICAgICAgKHBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkVTSVpBQkxFKSAmJgotICAgICAgICAgICAgICAgICAgICAgKChzd3AuY3ggIT0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoc3dwLmN5ICE9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24pCi0gICAgICAgICAgICAgICAgICAgICApICYmCi0gICAgICAgICAgICAgICAgICAgICAoIUZTTGliX1F1ZXJ5RlNNb2RlKGh3bmQpKQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIFJlc2l6YWJsZSBzdXJmYWNlIGFuZCBpbiByZXNpemluZyEKLSAgICAgICAgICAgICAgICAgIC8vIFNvLCBkb24ndCBibGl0IG5vdyEKLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgICAgICAgICAgICAgcHJpbnRmKCJXTV9GU0xJQk5PVElGSUNBVElPTiA6IENhbm5vdCBibGl0IHdoaWxlIHJlc2l6aW5nLCBkb2luZyBub3RoaW5nLlxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfSBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgICAgICAgICAgICAgIHByaW50ZigiV01fRlNMSUJOT1RJRklDQVRJT04gOiBCbGl0dGluZyFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgRlNMSUJfQklUQkxUKGh3bmQsIHBWaWRlby0+aGlkZGVuLT5wY2hTcmNCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoIldNX0ZTTElCTk9USUZJQ0FUSU9OIDogTm8gcHVibGljIHN1cmZhY2UhXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgCi0gICAgICAgICAgICAgIERvc1JlbGVhc2VNdXRleFNlbShwVmlkZW8tPmhpZGRlbi0+aG10eFVzZVNyY0J1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKE1QQVJBTSkgMTsKLQotICAgIGNhc2UgV01fQUNUSVZBVEU6Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiV01fQUNUSVZBVEVcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotCi0gICAgICBwVmlkZW8gPSBGU0xpYl9HZXRVc2VyUGFybShod25kKTsKLSAgICAgIGlmIChwVmlkZW8pCi0gICAgICB7Ci0gICAgICAgIHBWaWRlby0+aGlkZGVuLT5mSW5Gb2N1cyA9IChpbnQpIG1wMTsKLSAgICAgICAgaWYgKHBWaWRlby0+aGlkZGVuLT5mSW5Gb2N1cykKLSAgICAgICAgewotICAgICAgICAgIC8vIFdlbnQgaW50byBmb2N1cwotICAgICAgICAgIGlmICgocFZpZGVvLT5oaWRkZW4tPmlNb3VzZVZpc2libGUpICYmICghYk1vdXNlQ2FwdHVyZWQpKQotICAgICAgICAgICAgV2luU2V0UG9pbnRlcihIV05EX0RFU0tUT1AsIFdpblF1ZXJ5U3lzUG9pbnRlcihIV05EX0RFU0tUT1AsIFNQVFJfQVJST1csIEZBTFNFKSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgV2luU2V0UG9pbnRlcihIV05EX0RFU0tUT1AsIE5VTEwpOwotCi0gICAgICAgICAgaWYgKGJNb3VzZUNhcHR1cmFibGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gUmUtY2FwdHVyZSB0aGUgbW91c2UsIGlmIHdlIGNhcHR1cmVkIGl0IGJlZm9yZSEKLSAgICAgICAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBod25kKTsKLSAgICAgICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKLSAgICAgICAgICAgICAgUE9JTlRMIHB0bDsKLSAgICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCi0gICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKLSAgICAgICAgICAgICAgcHRsLnggPSAwOyBwdGwueSA9IDA7Ci0gICAgICAgICAgICAgIFdpbk1hcFdpbmRvd1BvaW50cyhwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgSFdORF9ERVNLVE9QLCAmcHRsLCAxKTsKLSAgICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLwotICAgICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBXZW50IG91dCBvZiBmb2N1cwotICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBXaW5RdWVyeVN5c1BvaW50ZXIoSFdORF9ERVNLVE9QLCBTUFRSX0FSUk9XLCBGQUxTRSkpOwotCi0gICAgICAgICAgaWYgKGJNb3VzZUNhcHR1cmVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIG1vdXNlCi0gICAgICAgICAgICBXaW5TZXRDYXB0dXJlKEhXTkRfREVTS1RPUCwgaHduZCk7Ci0gICAgICAgICAgICBiTW91c2VDYXB0dXJlZCA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiV01fQUNUSVZBVEUgZG9uZVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTV9CVVRUT04xRE9XTjoKLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgcHJpbnRmKCJXTV9CVVRUT04xRE9XTlxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICAgIHBWaWRlbyA9IEZTTGliX0dldFVzZXJQYXJtKGh3bmQpOwotICAgICAgaWYgKHBWaWRlbykKLSAgICAgIHsKLSAgICAgICAgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfQlVUVE9OX0xFRlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7IC8vIERvbid0IHJlcG9ydCBtb3VzZSBtb3ZlbWVudCEKLQotICAgICAgICBpZiAoYk1vdXNlQ2FwdHVyYWJsZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFdlIHNob3VsZCBjYXB0dXJlIHRoZSBtb3VzZSEKLSAgICAgICAgICBpZiAoIWJNb3VzZUNhcHR1cmVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBod25kKTsKLSAgICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBOVUxMKTsKLSAgICAgICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKLSAgICAgICAgICAgICAgUE9JTlRMIHB0bDsKLSAgICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCi0gICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKLSAgICAgICAgICAgICAgcHRsLnggPSAwOyBwdGwueSA9IDA7Ci0gICAgICAgICAgICAgIFdpbk1hcFdpbmRvd1BvaW50cyhwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgSFdORF9ERVNLVE9QLCAmcHRsLCAxKTsKLSAgICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLwotICAgICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXTV9CVVRUT04xVVA6Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiV01fQlVUVE9OMVVQXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfQlVUVE9OX0xFRlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOyAvLyBEb24ndCByZXBvcnQgbW91c2UgbW92ZW1lbnQhCi0gICAgICBicmVhazsKLSAgICBjYXNlIFdNX0JVVFRPTjJET1dOOgotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICBwcmludGYoIldNX0JVVFRPTjJET1dOXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7Ci0gICAgICBpZiAocFZpZGVvKQotICAgICAgewotICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9CVVRUT05fUklHSFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7IC8vIERvbid0IHJlcG9ydCBtb3VzZSBtb3ZlbWVudCEKLQotICAgICAgICBpZiAoYk1vdXNlQ2FwdHVyYWJsZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFdlIHNob3VsZCBjYXB0dXJlIHRoZSBtb3VzZSEKLSAgICAgICAgICBpZiAoIWJNb3VzZUNhcHR1cmVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBod25kKTsKLSAgICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBOVUxMKTsKLSAgICAgICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKLSAgICAgICAgICAgICAgUE9JTlRMIHB0bDsKLSAgICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCi0gICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKLSAgICAgICAgICAgICAgcHRsLnggPSAwOyBwdGwueSA9IDA7Ci0gICAgICAgICAgICAgIFdpbk1hcFdpbmRvd1BvaW50cyhwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgSFdORF9ERVNLVE9QLCAmcHRsLCAxKTsKLSAgICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLwotICAgICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdNX0JVVFRPTjJVUDoKLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgcHJpbnRmKCJXTV9CVVRUT04yVVBcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9CVVRUT05fUklHSFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOyAvLyBEb24ndCByZXBvcnQgbW91c2UgbW92ZW1lbnQhCi0gICAgICBicmVhazsKLSAgICBjYXNlIFdNX0JVVFRPTjNET1dOOgotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICBwcmludGYoIldNX0JVVFRPTjNET1dOXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7Ci0gICAgICBpZiAocFZpZGVvKQotICAgICAgewotICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9CVVRUT05fTUlERExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOyAvLyBEb24ndCByZXBvcnQgbW91c2UgbW92ZW1lbnQhCi0gICAgICAgIAotICAgICAgICBpZiAoYk1vdXNlQ2FwdHVyYWJsZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFdlIHNob3VsZCBjYXB0dXJlIHRoZSBtb3VzZSEKLSAgICAgICAgICBpZiAoIWJNb3VzZUNhcHR1cmVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBod25kKTsKLSAgICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBOVUxMKTsKLSAgICAgICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKLSAgICAgICAgICAgICAgUE9JTlRMIHB0bDsKLSAgICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCi0gICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKLSAgICAgICAgICAgICAgcHRsLnggPSAwOyBwdGwueSA9IDA7Ci0gICAgICAgICAgICAgIFdpbk1hcFdpbmRvd1BvaW50cyhwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgSFdORF9ERVNLVE9QLCAmcHRsLCAxKTsKLSAgICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLwotICAgICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXTV9CVVRUT04zVVA6Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiV01fQlVUVE9OM1VQXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfQlVUVE9OX01JRERMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7IC8vIERvbid0IHJlcG9ydCBtb3VzZSBtb3ZlbWVudCEKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV01fTU9VU0VNT1ZFOgotI2lmZGVmIERFQlVHX0JVSUxECi0vLyAgICAgIHByaW50ZigiV01fTU9VU0VNT1ZFXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7Ci0gICAgICBpZiAocFZpZGVvKQotICAgICAgewotICAgICAgICBpZiAocFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUpCi0gICAgICAgIHsKLSAgICAgICAgICBwVmlkZW8tPmhpZGRlbi0+aVNraXBXTU1PVVNFTU9WRS0tOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFBPSU5UUyAqcHB0cyA9IChQT0lOVFMgKikgKCZtcDEpOwotICAgICAgICAgIFBPSU5UTCBwdGw7Ci0KLSAgICAgICAgICBpZiAoYk1vdXNlQ2FwdHVyZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKLQotICAgICAgICAgICAgV2luUXVlcnlXaW5kb3dQb3MocFZpZGVvLT5oaWRkZW4tPmh3bmRDbGllbnQsICZzd3BDbGllbnQpOwotCi0gICAgICAgICAgICAvLyBTZW5kIHJlbGF0aXZlIG1vdXNlIHBvc2l0aW9uLCBhbmQgcmUtY2VudGVyIHRoZSBtb3VzZQotICAgICAgICAgICAgLy8gUmVwb3NpdGlvbiB0aGUgbW91c2UgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuL3dpbmRvdwotICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAvLyBCdXR0b25zIG5vdCBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8vIFJlbGF0aXZlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwdHMtPnggLSAoc3dwQ2xpZW50LmN4LzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3dwQ2xpZW50LmN5LzIpIC0gcHB0cy0+eSk7Ci0KLSAgICAgICAgICAgIHB0bC54ID0gMDsgcHRsLnkgPSAwOwotICAgICAgICAgICAgV2luTWFwV2luZG93UG9pbnRzKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCBIV05EX0RFU0tUT1AsICZwdGwsIDEpOwotICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLwotICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCi0gICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRsLnggKyBzd3BDbGllbnQuY3gvMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRsLnkgKyBzd3BDbGllbnQuY3kvMik7Ci0gICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgQ09OVkVSVE1PVVNFUE9TSVRJT04oKTsKLQotICAgICAgICAgICAgLy8gU2VuZCBhYnNvbHV0ZSBtb3VzZSBwb3NpdGlvbgotICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAvLyBCdXR0b25zIG5vdCBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIEFic29sdXRlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwdHMtPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwdHMtPnkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKHBWaWRlby0+aGlkZGVuLT5pTW91c2VWaXNpYmxlKSAmJiAoIWJNb3VzZUNhcHR1cmVkKSkKLSAgICAgICAgewotI2lmZGVmIERFQlVHX0JVSUxECi0vLyAgICAgICAgICBwcmludGYoIldNX01PVVNFTU9WRSA6IHB0ciA9ICVwXG4iLCBocHRyR2xvYmFsUG9pbnRlcik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICAgICAgICBpZiAoaHB0ckdsb2JhbFBvaW50ZXIpCi0gICAgICAgICAgICBXaW5TZXRQb2ludGVyKEhXTkRfREVTS1RPUCwgaHB0ckdsb2JhbFBvaW50ZXIpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBXaW5RdWVyeVN5c1BvaW50ZXIoSFdORF9ERVNLVE9QLCBTUFRSX0FSUk9XLCBGQUxTRSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgfQotI2lmZGVmIERFQlVHX0JVSUxECi0vLyAgICAgIHByaW50ZigiV01fTU9VU0VNT1ZFIGRvbmVcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotCi0gICAgICByZXR1cm4gKE1SRVNVTFQpIEZBTFNFOwotICAgIGNhc2UgV01fQ0xPU0U6IC8vIFdpbmRvdyBjbG9zZQotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICBwcmludGYoIldNX0NMT1NFXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7Ci0gICAgICBpZiAocFZpZGVvKQotICAgICAgewotICAgICAgICAvLyBTZW5kIFF1aXQgbWVzc2FnZSB0byB0aGUgU0RMIGFwcGxpY2F0aW9uIQotICAgICAgICBTRExfUHJpdmF0ZVF1aXQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotI2lmZGVmIEJJVEJMVF9JTl9XSU5NRVNTQUdFUFJPQwotICAgIGNhc2UgV01fVVBEQVRFUkVDVFNSRVFVRVNUOgotICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7Ci0gICAgICBpZiAoKHBWaWRlbykgJiYgKHBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChEb3NSZXF1ZXN0TXV0ZXhTZW0ocFZpZGVvLT5oaWRkZW4tPmhtdHhVc2VTcmNCdWZmZXIsIFNFTV9JTkRFRklOSVRFX1dBSVQpPT1OT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIGludCBudW1yZWN0czsKLSAgICAgICAgICBTRExfUmVjdCAqcmVjdHM7Ci0gICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgU1dQIHN3cDsKLQotICAgICAgICAgIG51bXJlY3RzID0gKGludCkgbXAxOwotICAgICAgICAgIHJlY3RzID0gKFNETF9SZWN0ICopIG1wMjsKLQotICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKGh3bmQsICZzd3ApOwotI2lmbmRlZiBSRVNJWkVfRVZFTl9JRl9SRVNJWkFCTEUKLSAgICAgICAgICBpZiAoKCFwVmlkZW8tPmhpZGRlbi0+cFNETFN1cmZhY2UpIHx8Ci0gICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgIChwVmlkZW8tPmhpZGRlbi0+cFNETFN1cmZhY2UpICYmCi0gICAgICAgICAgICAgICAocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlLT5mbGFncyAmIFNETF9SRVNJWkFCTEUpICYmCi0gICAgICAgICAgICAgICAoKHN3cC5jeCAhPSBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uKSB8fAotICAgICAgICAgICAgICAgIChzd3AuY3kgIT0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbikKLSAgICAgICAgICAgICAgICkgJiYKLSAgICAgICAgICAgICAgICghRlNMaWJfUXVlcnlGU01vZGUoaHduZCkpCi0gICAgICAgICAgICAgICkKLSAgICAgICAgICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gUmVzaXphYmxlIHN1cmZhY2UgYW5kIGluIHJlc2l6aW5nIQotICAgICAgICAgICAgLy8gU28sIGRvbid0IGJsaXQgbm93IQotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICAgICAgICBwcmludGYoIltXTV9VUERBVEVSRUNUU1JFUVVFU1RdIDogU2tpcHBpbmcgYmxpdCB3aGlsZSByZXNpemluZyFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgICAgIH0gZWxzZQotI2VuZGlmCi0gICAgICAgICAgewotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICAgICAgICBwcmludGYoIltXTV9VUERBVEVSRUNUU1JFUVVFU1RdIDogQmxpdHRpbmchXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEJsaXQgdGhlIGNoYW5nZWQgYXJlYXMKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPG51bXJlY3RzOyBpKyspCi0gICAgICAgICAgICAgIEZTTElCX0JJVEJMVChod25kLCBwVmlkZW8tPmhpZGRlbi0+cGNoU3JjQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdHNbaV0ueSwgcmVjdHNbaV0ueCwgcmVjdHNbaV0udywgcmVjdHNbaV0uaCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIERvc1JlbGVhc2VNdXRleFNlbShwVmlkZW8tPmhpZGRlbi0+aG10eFVzZVNyY0J1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICBwcmludGYoIlVuaGFuZGxlZDogJXhcbiIsIG1zZyk7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICAgIGJyZWFrOwotICB9Ci0gIC8vIFJ1biB0aGUgZGVmYXVsdCB3aW5kb3cgcHJvY2VkdXJlIGZvciB1bmhhbmRsZWQgc3R1ZmZzCi0gIHJldHVybiBXaW5EZWZXaW5kb3dQcm9jKGh3bmQsIG1zZywgbXAxLCBtcDIpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBGcmFtZVduZFByb2MKLS8vCi0vLyBUaGlzIGlzIHRoZSBtZXNzYWdlIHByb2Nlc3Npbmcgd2luZG93IHByb2NlZHVyZSBmb3IgdGhlCi0vLyBmcmFtZSB3aW5kb3cgb2YgU0RMV2luZG93Q2xhc3MuCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1zdGF0aWMgTVJFU1VMVCBFWFBFTlRSWSBGcmFtZVduZFByb2MoIEhXTkQgaHduZCwgVUxPTkcgbXNnLCBNUEFSQU0gbXAxLCBNUEFSQU0gbXAyKQotewotICBQRk5XUCBwT2xkRnJhbWVQcm9jOwotICBNUkVTVUxUIHJlc3VsdDsKLSAgUFRSQUNLSU5GTyB0aTsKLSAgaW50IGN4LCBjeSwgbmN4LCBuY3k7Ci0gIFJFQ1RMIHJjbFRlbXA7Ci0gIFBTV1AgcHN3cFRlbXA7Ci0KLSAgU0RMX1ZpZGVvRGV2aWNlICpwVmlkZW8gPSBOVUxMOwotCi0gIHBWaWRlbyA9IChTRExfVmlkZW9EZXZpY2UgKikgV2luUXVlcnlXaW5kb3dVTG9uZyhod25kLCBRV0xfVVNFUik7Ci0KLSAgcE9sZEZyYW1lUHJvYyA9IHBWaWRlby0+aGlkZGVuLT5wZm5PbGRGcmFtZVByb2M7Ci0KLSAgaWYgKChwVmlkZW8tPmhpZGRlbi0+YlByb3BvcnRpb25hbFJlc2l6ZSkgJiYKLSAgICAgIChtc2c9PVdNX0FESlVTVFdJTkRPV1BPUykgJiYKLSAgICAgICghRlNMaWJfUXVlcnlGU01vZGUocFZpZGVvLT5oaWRkZW4tPmh3bmRDbGllbnQpKQotICAgICApCi0gIHsKLSAgICBwc3dwVGVtcCA9IChQU1dQKSBtcDE7Ci0KLSAgICAvKiBSZXNpemluZz8gKi8KLSAgICBpZiAocHN3cFRlbXAtPmZsICYgU1dQX1NJWkUpCi0gICAgewotICAgICAgLyogQ2FsY3VsYXRlIGNsaWVudCBzaXplICovCi0gICAgICByY2xUZW1wLnhMZWZ0ID0gcHN3cFRlbXAtPng7Ci0gICAgICByY2xUZW1wLnhSaWdodCA9IHBzd3BUZW1wLT54ICsgcHN3cFRlbXAtPmN4OwotICAgICAgcmNsVGVtcC55Qm90dG9tID0gcHN3cFRlbXAtPnk7Ci0gICAgICByY2xUZW1wLnlUb3AgPSBwc3dwVGVtcC0+eSArIHBzd3BUZW1wLT5jeTsKLSAgICAgIFdpbkNhbGNGcmFtZVJlY3QoaHduZCwgJnJjbFRlbXAsIFRSVUUpOwotCi0gICAgICBuY3ggPSBjeCA9IHJjbFRlbXAueFJpZ2h0IC0gcmNsVGVtcC54TGVmdDsKLSAgICAgIG5jeSA9IGN5ID0gcmNsVGVtcC55VG9wIC0gcmNsVGVtcC55Qm90dG9tOwotCi0gICAgICAvKiBDYWxjdWxhdGUgbmV3IHNpemUgdG8ga2VlcCBpdCBwcm9wb3J0aW9uYWwgKi8KLQotICAgICAgaWYgKChwVmlkZW8tPmhpZGRlbi0+dWxSZXNpemluZ0ZsYWcgJiBURl9MRUZUKSB8fCAocFZpZGVvLT5oaWRkZW4tPnVsUmVzaXppbmdGbGFnICYgVEZfUklHSFQpKQotICAgICAgewotICAgICAgICAvKiBUaGUgd2luZG93IGlzIHJlc2l6ZWQgaG9yaXpvbnRhbGx5ICovCi0gICAgICAgIG5jeSA9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24gKiBjeCAvIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb247Ci0gICAgICB9IGVsc2UKLSAgICAgIGlmICgocFZpZGVvLT5oaWRkZW4tPnVsUmVzaXppbmdGbGFnICYgVEZfVE9QKSB8fCAocFZpZGVvLT5oaWRkZW4tPnVsUmVzaXppbmdGbGFnICYgVEZfQk9UVE9NKSkKLSAgICAgIHsKLSAgICAgICAgLyogVGhlIHdpbmRvdyBpcyByZXNpemVkIHZlcnRpY2FsbHkgKi8KLSAgICAgICAgbmN4ID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbiAqIGN5IC8gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbjsKLSAgICAgIH0KLQotICAgICAgLyogQ2FsY3VsYXRlIGJhY2sgZnJhbWUgY29vcmRpbmF0ZXMgKi8KLSAgICAgIHJjbFRlbXAueExlZnQgPSBwc3dwVGVtcC0+eDsKLSAgICAgIHJjbFRlbXAueFJpZ2h0ID0gcHN3cFRlbXAtPnggKyBuY3g7Ci0gICAgICByY2xUZW1wLnlCb3R0b20gPSBwc3dwVGVtcC0+eTsKLSAgICAgIHJjbFRlbXAueVRvcCA9IHBzd3BUZW1wLT55ICsgbmN5OwotICAgICAgV2luQ2FsY0ZyYW1lUmVjdChod25kLCAmcmNsVGVtcCwgRkFMU0UpOwotCi0gICAgICAvKiBTdG9yZSBuZXcgc2l6ZS9wb3NpdGlvbiBpbmZvICovCi0gICAgICBwc3dwVGVtcC0+Y3ggPSByY2xUZW1wLnhSaWdodCAtIHJjbFRlbXAueExlZnQ7Ci0KLSAgICAgIGlmICghKHBWaWRlby0+aGlkZGVuLT51bFJlc2l6aW5nRmxhZyAmIFRGX1RPUCkpCi0gICAgICB7Ci0gICAgICAgIHBzd3BUZW1wLT55ID0gcHN3cFRlbXAtPnkgKyBwc3dwVGVtcC0+Y3kgLSAocmNsVGVtcC55VG9wIC0gcmNsVGVtcC55Qm90dG9tKTsKLSAgICAgICAgcHN3cFRlbXAtPmN5ID0gcmNsVGVtcC55VG9wIC0gcmNsVGVtcC55Qm90dG9tOwotICAgICAgfSBlbHNlCi0gICAgICB7Ci0gICAgICAgIHBzd3BUZW1wLT5jeSA9IHJjbFRlbXAueVRvcCAtIHJjbFRlbXAueUJvdHRvbTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXN1bHQgPSAoKnBPbGRGcmFtZVByb2MpKGh3bmQsIG1zZywgbXAxLCBtcDIpOwotCi0gIGlmICgocFZpZGVvLT5oaWRkZW4tPmJQcm9wb3J0aW9uYWxSZXNpemUpICYmIChtc2c9PVdNX1FVRVJZVFJBQ0tJTkZPKSkKLSAgewotICAgIHRpID0gKFBUUkFDS0lORk8pIG1wMjsKLQotICAgIC8qIFN0b3JlIHRoZSBkaXJlY3Rpb24gb2YgcmVzaXppbmcgKi8KLSAgICBpZiAoKHRpLT5mcyAmIFRGX0xFRlQpIHx8ICh0aS0+ZnMgJiBURl9SSUdIVCkgfHwKLSAgICAgICAgKHRpLT5mcyAmIFRGX1RPUCkgfHwgKHRpLT5mcyAmIFRGX0JPVFRPTSkpCi0gICAgICBwVmlkZW8tPmhpZGRlbi0+dWxSZXNpemluZ0ZsYWcgPSB0aS0+ZnM7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBQTVRocmVhZEZ1bmMKLS8vCi0vLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIFBNLVRocmVhZCwgd2hpY2ggaW5pdGlhbGl6ZXMgdGhlCi0vLyBhcHBsaWNhdGlvbiB3aW5kb3cgaXRzZWxmLCB0aGUgRElWRSwgYW5kIHN0YXJ0IG1lc3NhZ2UgcHJvY2Vzc2luZy4KLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLWludCBpTnVtT2ZQTVRocmVhZEluc3RhbmNlcyA9IDA7IC8vIEdsb2JhbCEKLXN0YXRpYyB2b2lkIFBNVGhyZWFkRnVuYyh2b2lkICpwUGFybSkKLXsKLSAgU0RMX1ZpZGVvRGV2aWNlICpwVmlkZW8gPSBwUGFybTsKLSAgSEFCIGhhYjsKLSAgSE1RIGhtcTsKLSAgUU1TRyBtc2c7Ci0gIFVMT05HIGZjZjsKLQotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBTdGFydGluZ1xuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgaU51bU9mUE1UaHJlYWRJbnN0YW5jZXMrKzsKLQotICAvLyBJbml0aWFsaXplIFBNLCBjcmVhdGUgYSBtZXNzYWdlIHF1ZXVlLgotCi0gIGhhYj1XaW5Jbml0aWFsaXplKDApOwotICBobXE9V2luQ3JlYXRlTXNnUXVldWUoaGFiLDApOwotICBpZiAoaG1xPT0wKQotICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogQ291bGQgbm90IGNyZWF0ZSBtZXNzYWdlIHF1ZXVlIVxuIik7Ci0gICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgIEl0IG1pZ2h0IGJlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIFNETCBpcyBub3QgYSBQTSBhcHAhXG4iKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgIHBWaWRlby0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMgPSAyOwotICB9IGVsc2UKLSAgewotICAgIGludCByYzsKLSAgICBSRUNUTCByZWN0bDsKLQotICAgIGZjZiA9IHVsRkNGVG9Vc2U7IC8vIEdldCBmcm9tIGdsb2JhbCBzZXR0aW5nCi0KLSNpZmRlZiBERUJVR19CVUlMRAotICAgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBGU0xpYl9DcmVhdGVXaW5kb3coKSFcbiIpOwotICAgIGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICByYyA9IEZTTGliX0NyZWF0ZVdpbmRvdyhIV05EX0RFU0tUT1AsIDAsICZmY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNETCBBcHBsaWNhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTEhBTkRMRSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXbmRQcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFZpZGVvLT5oaWRkZW4tPmh3bmRDbGllbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFZpZGVvLT5oaWRkZW4tPmh3bmRGcmFtZSkpOwotCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogRlNMaWJfQ3JlYXRlV2luZG93KCkgcmMgPSAlZFxuIiwgcmMpOwotICAgIGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICBpZiAoIXJjKQotICAgIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgcHJpbnRmKCJbUE1UaHJlYWRGdW5jXSA6IENvdWxkIG5vdCBjcmVhdGUgRlNMaWIgd2luZG93IVxuIik7Ci0gICAgICBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgcFZpZGVvLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyA9IDM7Ci0gICAgfSBlbHNlCi0gICAgewotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogRlNMaWJfQWRkVXNlclBhcm0oKSFcbiIpOwotICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgICAgLy8gU3RvcmUgcFZpZGVvIHBvaW50ZXIgaW4gd2luZG93IGRhdGEgZm9yIGNsaWVudCB3aW5kb3csIHNvCi0gICAgICAvLyBpdCB3aWxsIGtub3cgdGhlIGluc3RhbmNlIHRvIHdoaWNoIGl0IGJlbG9uZ3MgdG8uCi0gICAgICBGU0xpYl9BZGRVc2VyUGFybShwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgcFZpZGVvKTsKLQotICAgICAgLy8gTm93IHNldCBkZWZhdWx0IGltYWdlIHdpZHRoIGhlaWdodCBhbmQgZm91cmNjIQotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogU2V0V2luZG93UG9zKCkhXG4iKTsKLSAgICAgIGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICAgIC8vIFNldCB0aGUgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIG1haW4gd2luZG93LAotICAgICAgLy8gYW5kIG1ha2UgaXQgdmlzaWJsZSEKLSAgICAgIC8vIENhbGN1bGF0ZSBmcmFtZSB3aW5kb3cgc2l6ZSBmcm9tIGNsaWVudCB3aW5kb3cgc2l6ZQotICAgICAgcmVjdGwueExlZnQgPSAwOwotICAgICAgcmVjdGwueUJvdHRvbSA9IDA7Ci0gICAgICByZWN0bC54UmlnaHQgPSBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uOyAvLyBOb25pbmNsdXNpdmUKLSAgICAgIHJlY3RsLnlUb3AgPSBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uOyAvLyBOb25pbmNsdXNpdmUKLSAgICAgIFdpbkNhbGNGcmFtZVJlY3QocFZpZGVvLT5oaWRkZW4tPmh3bmRGcmFtZSwgJnJlY3RsLCBGQUxTRSk7Ci0KLSAgICAgIFNldEFjY2Vzc2FibGVXaW5kb3dQb3MocFZpZGVvLT5oaWRkZW4tPmh3bmRGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORF9UT1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaW5RdWVyeVN5c1ZhbHVlIChIV05EX0RFU0tUT1AsIFNWX0NYU0NSRUVOKSAtIChyZWN0bC54UmlnaHQtcmVjdGwueExlZnQpKSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaW5RdWVyeVN5c1ZhbHVlIChIV05EX0RFU0tUT1AsIFNWX0NZU0NSRUVOKSAtIChyZWN0bC55VG9wLXJlY3RsLnlCb3R0b20pKSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWN0bC54UmlnaHQtcmVjdGwueExlZnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVjdGwueVRvcC1yZWN0bC55Qm90dG9tKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX1NJWkUgfCBTV1BfQUNUSVZBVEUgfCBTV1BfU0hPVyB8IFNXUF9NT1ZFKTsKLQotICAgICAgLy8gU3ViY2xhc3MgZnJhbWUgcHJvY2VkdXJlIGFuZCBzdG9yZSBvbGQgd2luZG93IHByb2MgYWRkcmVzcwotICAgICAgcFZpZGVvLT5oaWRkZW4tPnBmbk9sZEZyYW1lUHJvYyA9Ci0gICAgICAgIFdpblN1YmNsYXNzV2luZG93KHBWaWRlby0+aGlkZGVuLT5od25kRnJhbWUsIEZyYW1lV25kUHJvYyk7Ci0gICAgICBXaW5TZXRXaW5kb3dVTG9uZyhwVmlkZW8tPmhpZGRlbi0+aHduZEZyYW1lLCBRV0xfVVNFUiwgKFVMT05HKSBwVmlkZW8pOwotCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBFbnRlcmluZyBtZXNzYWdlIGxvb3BcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgcFZpZGVvLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyA9IDE7Ci0gIAotICAgICAgd2hpbGUgKFdpbkdldE1zZyhoYWIsIChQUU1TRykmbXNnLCAwLCAwLCAwKSkKLSAgICAgICAgV2luRGlzcGF0Y2hNc2coaGFiLCAoUFFNU0cpICZtc2cpOwotCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBMZWF2aW5nIG1lc3NhZ2UgbG9vcFxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gICAgICAvLyBXZSBzaG91bGQgcmVsZWFzZSB0aGUgY2FwdHVyZWQgdGhlIG1vdXNlIQotICAgICAgaWYgKGJNb3VzZUNhcHR1cmVkKQotICAgICAgewotICAgICAgICBXaW5TZXRDYXB0dXJlKEhXTkRfREVTS1RPUCwgTlVMTEhBTkRMRSk7Ci0gICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMDsKLSAgICAgIH0KLSAgICAgIC8vIERlc3Ryb3kgb3VyIHdpbmRvdwotICAgICAgV2luRGVzdHJveVdpbmRvdyhwVmlkZW8tPmhpZGRlbi0+aHduZEZyYW1lKTsgcFZpZGVvLT5oaWRkZW4tPmh3bmRGcmFtZT1OVUxMOwotICAgICAgLy8gU2hvdyBwb2ludGVyIHRvIG1ha2Ugc3VyZSBpdCB3aWxsIG5vdCBiZSBsZWZ0IGhpZGRlbi4KLSAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBXaW5RdWVyeVN5c1BvaW50ZXIoSFdORF9ERVNLVE9QLCBTUFRSX0FSUk9XLCBGQUxTRSkpOwotICAgICAgV2luU2hvd1BvaW50ZXIoSFdORF9ERVNLVE9QLCBUUlVFKTsKLSAgICB9Ci0gICAgLy8gVW5pbml0aWFsaXplIFBNCi0gICAgV2luRGVzdHJveU1zZ1F1ZXVlKGhtcSk7Ci0gICAgLy8gQWxsIGRvbmUhCi0gICAgcFZpZGVvLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyA9IDA7Ci0gIH0KLSAgV2luVGVybWluYXRlKGhhYik7Ci0gIC8qIENvbW1lbnRlZCBvdXQsIHNob3VsZCBub3QgYmUgbmVlZGVkIGFueW1vcmUsIGJlY2F1c2Ugd2Ugc2VuZCBpdAotICAgICBmcm9tIFdNX0NMT1NFLgotICAvLyBOb3RpZnkgU0RMIHRoYXQgaXQgc2hvdWxkIHJlYWxseSBkaWUgbm93Li4uCi0gIFNETF9Qcml2YXRlUXVpdCgpOyBTRExfUHJpdmF0ZVF1aXQoKTsgU0RMX1ByaXZhdGVRdWl0KCk7IC8vLi4uIDopKQotICAqLwotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBFbmQsIHN0YXR1cyBpcyAlZCFcbiIsIHBWaWRlby0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotCi0gIGlOdW1PZlBNVGhyZWFkSW5zdGFuY2VzLS07Ci0KLSAgLy8gSEFDSyB0byBwcmV2ZW50IHpvbWJpZSBhbmQgaGFuZ2luZyBTREwgYXBwbGljYXRpb25zLCB3aGljaCBkb2VzIG5vdCB0YWtlCi0gIC8vIGNhcmUgb2YgY2xvc2luZyB0aGUgd2luZG93IGZvciBzb21lIHJlYXNvbjoKLSAgLy8gVGhlcmUgYXJlIHNvbWUgYXBwcyB3aGljaCBkbyBub3QgcHJvY2VzcyBtZXNzYWdlcywgc28gZG8gYSBsb3Qgb2YgdGhpbmdzCi0gIC8vIHdpdGhvdXQgbm90aWNpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGNsb3NlLiBUbyBjbG9zZSB0aGVzZSwKLSAgLy8gSSd2ZSB0aG91Z2h0IGFib3V0IHRoZSBmb2xsb3dpbmc6Ci0gIC8vIElmIHRoZSB3aW5kb3cgaXMgY2xvc2VkICh0aGUgZXhlY3V0aW9uIGNhbWUgaGVyZSksIEkgd2FpdCBhIGJpdCB0bwotICAvLyBnaXZlIHRpbWUgdG8gdGhlIGFwcCB0byBmaW5pc2ggaXRzIGV4ZWN1dGlvbi4gSWYgaXQgZG9lcyBub3QsIEkga2lsbCBpdAotICAvLyB1c2luZyBEb3NFeGl0KCkuIEJydXRlIGZvcmNlLCBidXQgc2hvdWxkIHdvcmsuCi0gIGlmIChwVmlkZW8tPmhpZGRlbi0+aVBNVGhyZWFkU3RhdHVzPT0wKQotICB7Ci0gICAgRG9zU2xlZXAoNTAwMCk7IC8vIFdhaXQgNSBzZWNzCi0gICAgLy8gSWYgYSBuZXcgUE0gdGhyZWFkIGhhcyBiZWVuIHNwYXduZWQgKHJlaW5pdGlhbGl6aW5nIHZpZGVvIG1vZGUpLCB0aGVuIGFsbCByaWdodC4KLSAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgYSBwcm9ibGVtLCB0aGUgYXBwIGRvZXNuJ3Qgd2FudCB0byBzdG9wLiBLaWxsIQotICAgIGlmIChpTnVtT2ZQTVRocmVhZEluc3RhbmNlcz09MCkKLSAgICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBJdCBzZWVtcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBoYXZlbid0IHRlcm1pbmF0ZWQgaXRzZWxmXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogaW4gdGhlIGxhc3QgNSBzZWNvbmRzLCBzbyB3ZSBnbyBiZXJzZXJrLlxuIik7IGZmbHVzaChzdGRvdXQpOwotICAgICAgcHJpbnRmKCJbUE1UaHJlYWRGdW5jXSA6IEJydXRlIGZvcmNlIG1vZGUuIDopIEtpbGxpbmcgcHJvY2VzcyEgRGllZWVlZS4uLlxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gICAgICBEb3NFeGl0KEVYSVRfUFJPQ0VTUywgLTEpOwotICAgIH0KLSAgfQotICBfZW5kdGhyZWFkKCk7Ci19Ci0KLXN0cnVjdCBXTWN1cnNvcgotewotICBIQklUTUFQIGhibTsKLSAgSFBPSU5URVIgaHB0cjsKLSAgY2hhciAqcGNoRGF0YTsKLX07Ci0KLS8qIEZyZWUgYSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KLXZvaWQgb3MyZnNsaWJfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotICBpZiAoY3Vyc29yKQotICB7Ci0gICAgR3BpRGVsZXRlQml0bWFwKGN1cnNvci0+aGJtKTsKLSAgICBXaW5EZXN0cm95UG9pbnRlcihjdXJzb3ItPmhwdHIpOwotICAgIFNETF9mcmVlKGN1cnNvci0+cGNoRGF0YSk7Ci0gICAgU0RMX2ZyZWUoY3Vyc29yKTsKLSAgfQotfQotCi0vKiBMb2NhbCBmdW5jdGlvbnMgdG8gY29udmVydCB0aGUgU0RMIGN1cnNvciBtYXNrIGludG8gT1MvMiBmb3JtYXQgKi8KLXN0YXRpYyB2b2lkIG1lbW5vdChVaW50OCAqZHN0LCBVaW50OCAqc3JjLCBpbnQgbGVuKQotewotICB3aGlsZSAoIGxlbi0tID4gMCApCi0gICAgKmRzdCsrID0gfipzcmMrKzsKLX0KLXN0YXRpYyB2b2lkIG1lbXhvcihVaW50OCAqZHN0LCBVaW50OCAqc3JjMSwgVWludDggKnNyYzIsIGludCBsZW4pCi17Ci0gIHdoaWxlICggbGVuLS0gPiAwICkKLSAgICAqZHN0KysgPSAoKnNyYzErKyleKCpzcmMyKyspOwotfQotCi0vKiBDcmVhdGUgYSBibGFjay93aGl0ZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KLVdNY3Vyc29yICpvczJmc2xpYl9DcmVhdGVXTUN1cnNvcl9XaW4oX1RISVMsIFVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKLXsKLSAgSFBPSU5URVIgaHB0cjsKLSAgSEJJVE1BUCBoYm07Ci0gIEJJVE1BUElORk9IRUFERVIgYm1paDsKLSAgQk1QSU5GTyAgICAgICAgICBibWk7Ci0gIEhQUyAgICAgICAgICAgICAgaHBzOwotICBjaGFyICpwY2hUZW1wOwotICBjaGFyICp4cHRyLCAqYXB0cjsKLSAgaW50IG1heHgsIG1heHk7Ci0gIGludCBpLCBydW4sIHBhZDsKLSAgV01jdXJzb3IgKnBSZXN1bHQ7Ci0KLSAgbWF4eCA9IFdpblF1ZXJ5U3lzVmFsdWUoSFdORF9ERVNLVE9QLCBTVl9DWFBPSU5URVIpOwotICBtYXh5ID0gV2luUXVlcnlTeXNWYWx1ZShIV05EX0RFU0tUT1AsIFNWX0NZUE9JTlRFUik7Ci0KLSAgLy8gQ2hlY2sgZm9yIG1heCBzaXplIQotICBpZiAoKHc+bWF4eCkgfHwgKGg+bWF4eSkpCi0gICAgcmV0dXJuIChXTWN1cnNvciAqKSBOVUxMOwotCi0gIHBSZXN1bHQgPSAoV01jdXJzb3IgKikgU0RMX21hbGxvYyhzaXplb2YoV01jdXJzb3IpKTsKLSAgaWYgKCFwUmVzdWx0KSByZXR1cm4gKFdNY3Vyc29yICopIE5VTEw7Ci0KLSAgcGNoVGVtcCA9IChjaGFyICopIFNETF9tYWxsb2MoKG1heHggKyA3KS84ICogbWF4eSoyKTsKLSAgaWYgKCFwY2hUZW1wKQotICB7Ci0gICAgU0RMX2ZyZWUocFJlc3VsdCk7Ci0gICAgcmV0dXJuIChXTWN1cnNvciAqKSBOVUxMOwotICB9Ci0KLSAgU0RMX21lbXNldChwY2hUZW1wLCAwLCAobWF4eCArIDcpLzggKiBtYXh5KjIpOwotCi0gIGhwcyA9IFdpbkdldFBTKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQpOwotCi0gIGJtaS5jYkZpeCA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgYm1pLmN4ID0gbWF4eDsKLSAgYm1pLmN5ID0gMiptYXh5OwotICBibWkuY1BsYW5lcyA9IDE7Ci0gIGJtaS5jQml0Q291bnQgPSAxOwotICBibWkuYXJnYkNvbG9yWzBdLmJCbHVlID0gMHgwMDsKLSAgYm1pLmFyZ2JDb2xvclswXS5iR3JlZW4gPSAweDAwOwotICBibWkuYXJnYkNvbG9yWzBdLmJSZWQgPSAweDAwOwotICBibWkuYXJnYkNvbG9yWzFdLmJCbHVlID0gMHgwMDsKLSAgYm1pLmFyZ2JDb2xvclsxXS5iR3JlZW4gPSAweDAwOwotICBibWkuYXJnYkNvbG9yWzFdLmJSZWQgPSAweGZmOwotCi0gIFNETF9tZW1zZXQoJmJtaWgsIDAsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7Ci0gIGJtaWguY2JGaXggPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gIGJtaWguY3ggPSBtYXh4OwotICBibWloLmN5ID0gMiptYXh5OwotICBibWloLmNQbGFuZXMgPSAxOwotICBibWloLmNCaXRDb3VudCA9IDE7Ci0KLSAgcnVuID0gKHcrNykvODsKLSAgcGFkID0gKG1heHgrNykvOCAtIHJ1bjsKLQotICBmb3IgKGk9MDsgaTxoOyBpKyspCi0gIHsKLSAgICB4cHRyID0gcGNoVGVtcCArIChtYXh4KzcpLzggKiAobWF4eS0xLWkpOwotICAgIGFwdHIgPSBwY2hUZW1wICsgKG1heHgrNykvOCAqIChtYXh5K21heHktMS1pKTsKLSAgICBtZW14b3IoeHB0ciwgZGF0YSwgbWFzaywgcnVuKTsKLSAgICB4cHRyICs9IHJ1bjsKLSAgICBkYXRhICs9IHJ1bjsKLSAgICBtZW1ub3QoYXB0ciwgbWFzaywgcnVuKTsKLSAgICBtYXNrICs9IHJ1bjsKLSAgICBhcHRyICs9IHJ1bjsKLSAgICBTRExfbWVtc2V0KHhwdHIsICAwLCBwYWQpOwotICAgIHhwdHIgKz0gcGFkOwotICAgIFNETF9tZW1zZXQoYXB0ciwgfjAsIHBhZCk7Ci0gICAgYXB0ciArPSBwYWQ7Ci0gIH0KLSAgcGFkICs9IHJ1bjsKLSAgZm9yIChpPWggOyBpPG1heHk7IGkrKyApCi0gIHsKLSAgICB4cHRyID0gcGNoVGVtcCArIChtYXh4KzcpLzggKiAobWF4eS0xLWkpOwotICAgIGFwdHIgPSBwY2hUZW1wICsgKG1heHgrNykvOCAqIChtYXh5K21heHktMS1pKTsKLQotICAgIFNETF9tZW1zZXQoeHB0ciwgIDAsIChtYXh4KzcpLzgpOwotICAgIHhwdHIgKz0gKG1heHgrNykvODsKLSAgICBTRExfbWVtc2V0KGFwdHIsIH4wLCAobWF4eCs3KS84KTsKLSAgICBhcHRyICs9IChtYXh4KzcpLzg7Ci0gIH0KLQotICBoYm0gPSBHcGlDcmVhdGVCaXRtYXAoaHBzLCAoUEJJVE1BUElORk9IRUFERVIyKSZibWloLCBDQk1fSU5JVCwgKFBCWVRFKSBwY2hUZW1wLCAoUEJJVE1BUElORk8yKSZibWkpOwotICBocHRyID0gV2luQ3JlYXRlUG9pbnRlcihIV05EX0RFU0tUT1AsIGhibSwgVFJVRSwgaG90X3gsIG1heHkgLSBob3RfeSAtIDEpOwotCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgcHJpbnRmKCJIb3RTcG90ICAgICAgICAgIDogJWQgOyAlZFxuIiwgaG90X3gsIGhvdF95KTsKLSAgcHJpbnRmKCJIUFMgcmV0dXJuZWQgICAgIDogJXhcbiIsIChVTE9ORylocHMpOwotICBwcmludGYoIkhCSVRNQVAgcmV0dXJuZWQgOiAleFxuIiwgKFVMT05HKWhibSk7Ci0gIHByaW50ZigiSFBPSU5URVIgcmV0dXJuZWQ6ICV4XG4iLCAoVUxPTkcpaHB0cik7Ci0jZW5kaWYKLQotICBXaW5SZWxlYXNlUFMoaHBzKTsKLQotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW0NyZWF0ZVdNQ3Vyc29yXSA6IHB0ciA9ICVwXG4iLCBocHRyKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICBwUmVzdWx0LT5ocHRyID0gaHB0cjsKLSAgcFJlc3VsdC0+aGJtID0gaGJtOwotICBwUmVzdWx0LT5wY2hEYXRhID0gcGNoVGVtcDsKLQotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW0NyZWF0ZVdNQ3Vyc29yXSA6IHB0ciA9ICVwIHJldHVybi5cbiIsIGhwdHIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotCi0gIHJldHVybiAoV01jdXJzb3IgKikgcFJlc3VsdDsKLX0KLQotV01jdXJzb3IgKm9zMmZzbGliX0NyZWF0ZVdNQ3Vyc29yX0ZTKF9USElTLCBVaW50OCAqZGF0YSwgVWludDggKm1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKLXsKLSNpZmRlZiBERUJVR19CVUlMRAotICBwcmludGYoIltDcmVhdGVXTUN1cnNvcl9GU10gOiByZXR1cm5pbmcgcG9pbnRlciBOVUxMXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAvLyBJbiBGUyBtb2RlIHdlJ2xsIHVzZSBzb2Z0d2FyZSBjdXJzb3IKLSAgcmV0dXJuIChXTWN1cnNvciAqKSBOVUxMOwotfQotCi0vKiBTaG93IHRoZSBzcGVjaWZpZWQgY3Vyc29yLCBvciBoaWRlIGlmIGN1cnNvciBpcyBOVUxMICovCi1pbnQgb3MyZnNsaWJfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW1Nob3dXTUN1cnNvcl0gOiBwdHIgPSAlcFxuIiwgY3Vyc29yKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICBpZiAoY3Vyc29yKQotICB7Ci0gICAgV2luU2V0UG9pbnRlcihIV05EX0RFU0tUT1AsIGN1cnNvci0+aHB0cik7Ci0gICAgaHB0ckdsb2JhbFBvaW50ZXIgPSBjdXJzb3ItPmhwdHI7Ci0gICAgX3RoaXMtPmhpZGRlbi0+aU1vdXNlVmlzaWJsZSA9IDE7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgV2luU2V0UG9pbnRlcihIV05EX0RFU0tUT1AsIEZBTFNFKTsKLSAgICBocHRyR2xvYmFsUG9pbnRlciA9IE5VTEw7Ci0gICAgX3RoaXMtPmhpZGRlbi0+aU1vdXNlVmlzaWJsZSA9IDA7Ci0gIH0KLQotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW1Nob3dXTUN1cnNvcl0gOiBwdHIgPSAlcCwgRE9ORVxuIiwgY3Vyc29yKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICByZXR1cm4gMTsKLX0KLQotLyogV2FycCB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yIHRvICh4LHkpCi0gSWYgTlVMTCwgYSBtb3VzZSBtb3Rpb24gZXZlbnQgaXMgcG9zdGVkIGludGVybmFsbHkuCi0gKi8KLXZvaWQgb3MyZnNsaWJfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCi17Ci0gIExPTkcgbHgsIGx5OwotICBTV1Agc3dwQ2xpZW50OwotICBQT0lOVEwgcHRsUG9pbnRzOwotICBXaW5RdWVyeVdpbmRvd1BvcyhfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKLSAgcHRsUG9pbnRzLnggPSBzd3BDbGllbnQueDsKLSAgcHRsUG9pbnRzLnkgPSBzd3BDbGllbnQueTsKLSAgV2luTWFwV2luZG93UG9pbnRzKF90aGlzLT5oaWRkZW4tPmh3bmRGcmFtZSwgSFdORF9ERVNLVE9QLCAmcHRsUG9pbnRzLCAxKTsKLSAgbHggPSBwdGxQb2ludHMueCArICh4KnN3cENsaWVudC5jeCkgLyBfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb247Ci0gIGx5ID0gcHRsUG9pbnRzLnkgKyBzd3BDbGllbnQuY3kgLSAoKHkqc3dwQ2xpZW50LmN5KSAvIF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbikgLSAxOwotCi0gIFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgLy8gQnV0dG9ucyBub3QgY2hhbmdlZAotICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIEFic29sdXRlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKLQotICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwgbHgsIGx5KTsKLQotfQotCi0vKiBJZiBub3QgTlVMTCwgdGhpcyBpcyBjYWxsZWQgd2hlbiBhIG1vdXNlIG1vdGlvbiBldmVudCBvY2N1cnMgKi8KLXZvaWQgb3MyZnNsaWJfTW92ZVdNQ3Vyc29yKF9USElTLCBpbnQgeCwgaW50IHkpCi17Ci0gIC8qCi0gIFNETF9SZWN0IHJlY3Q7Ci0KLSNpZmRlZiBERUJVR19CVUlMRAotICBwcmludGYoIltNb3ZlV01DdXJzb3JdIDogYXQgJWQgOyAlZFxuIiwgeCwgeSk7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgcmVjdC54ID0geDsKLSAgcmVjdC55ID0geTsKLSAgcmVjdC53ID0gMzI7Ci0gIHJlY3QuaCA9IDMyOwotICBvczJmc2xpYl9VcGRhdGVSZWN0cyhfdGhpcywgMSwgJnJlY3QpOwotICAvLyBUT0RPIQotICAqLwotfQotCi0vKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgbW91c2Ugc2hvdWxkIGJlIGluIHJlbGF0aXZlIG1vZGUgb3Igbm90LgotIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGlucHV0IGdyYWIgc3RhdGUgb3IgY3Vyc29yCi0gdmlzaWJpbGl0eSBzdGF0ZSBjaGFuZ2VzLgotIElmIHRoZSBjdXJzb3IgaXMgbm90IHZpc2libGUsIGFuZCB0aGUgaW5wdXQgaXMgZ3JhYmJlZCwgdGhlCi0gZHJpdmVyIGNhbiBwbGFjZSB0aGUgbW91c2UgaW4gcmVsYXRpdmUgbW9kZSwgd2hpY2ggbWF5IHJlc3VsdAotIGluIGhpZ2hlciBhY2N1cmFjeSBzYW1wbGluZyBvZiB0aGUgcG9pbnRlciBtb3Rpb24uCi0gKi8KLXZvaWQgb3MyZnNsaWJfQ2hlY2tNb3VzZU1vZGUoX1RISVMpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIG9zMmZzbGliX1B1bXBFdmVudHMoX1RISVMpCi17Ci0gIC8vIE5vdGlmeSBTREwgdGhhdCBpZiB3aW5kb3cgaGFzIGJlZW4gcmVzaXplZCEKLSAgaWYgKAotICAgICAgKF90aGlzLT5oaWRkZW4tPnBTRExTdXJmYWNlKSAmJgotICAgICAgKF90aGlzLT5oaWRkZW4tPnBTRExTdXJmYWNlLT5mbGFncyAmIFNETF9SRVNJWkFCTEUpICYmCi0gICAgICAoCi0gICAgICAgKF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbiE9aVdpbmRvd1NpemVYKSB8fAotICAgICAgIChfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24hPWlXaW5kb3dTaXplWSkKLSAgICAgICkgJiYKLSAgICAgIChpV2luZG93U2l6ZVg+MCkgJiYKLSAgICAgIChpV2luZG93U2l6ZVk+MCkKLSAgICAgKQotICB7Ci0gICAgc3RhdGljIHRpbWVfdCBwcmV2X3RpbWU7Ci0gICAgdGltZV90IGN1cnJfdGltZTsKLQotICAgIGN1cnJfdGltZSA9IHRpbWUoTlVMTCk7Ci0gICAgaWYgKChkaWZmdGltZShjdXJyX3RpbWUsIHByZXZfdGltZSk+PTAuMjUpIHx8Ci0gICAgICAgIChiV2luZG93UmVzaXplZCkpCi0gICAgewotICAgICAgLy8gTWFrZSBzdXJlIHdlIHdvbid0IGZsb29kIHRoZSBldmVudCBxdWV1ZSB3aXRoIHJlc2l6ZSBldmVudHMsCi0gICAgICAvLyBvbmx5IHNlbmQgdGhlbSBhdCAyNTAgbXNlY3MhCi0gICAgICAvLyAob3Igd2hlbiB0aGUgd2luZG93IGlzIHJlc2l6ZWQpCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiW29zMmZzbGliX1B1bXBFdmVudHNdIDogQ2FsbGluZyBQcml2YXRlUmVzaXplICglZCAlZCkuXG4iLAotICAgICAgICAgICAgIGlXaW5kb3dTaXplWCwgaVdpbmRvd1NpemVZKTsKLSAgICAgIGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gICAgICAvLyBUZWxsIFNETCB0aGUgbmV3IHNpemUKLSAgICAgIFNETF9Qcml2YXRlUmVzaXplKGlXaW5kb3dTaXplWCwgaVdpbmRvd1NpemVZKTsKLSAgICAgIHByZXZfdGltZSA9IGN1cnJfdGltZTsKLSAgICAgIGJXaW5kb3dSZXNpemVkID0gMDsKLSAgICB9Ci0gIH0KLX0KLQotLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KLXN0YXRpYyBpbnQgb3MyZnNsaWJfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotICByZXR1cm4oLTEpOwotfQotc3RhdGljIHZvaWQgb3MyZnNsaWJfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0gIHJldHVybjsKLX0KLQotLyogV2UgbmVlZCB0byB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlIG9uIHBhZ2UgZmxpcHBlZCBkaXNwbGF5cyAqLwotc3RhdGljIGludCBvczJmc2xpYl9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLSAgcmV0dXJuKDApOwotfQotCi1zdGF0aWMgdm9pZCBvczJmc2xpYl9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgb3MyZnNsaWJfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQotewotICBwcmludGYoIltvczJmc2xpYl9TZXRDb2xvcnNdIDogVE9ETyFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSAgLy8gVE9ETzogSW1wbGVtZW50IHBhbGV0dGVkIG1vZGVzCi0gIHJldHVybigxKTsKLX0KLQotc3RhdGljIHZvaWQgb3MyZnNsaWJfRGVzdHJveUljb24oSFdORCBod25kRnJhbWUpCi17Ci0gIGlmIChocHRyQ3VycmVudEljb24pCi0gIHsKLSAgICBXaW5EZXN0cm95UG9pbnRlcihocHRyQ3VycmVudEljb24pOwotICAgIGhwdHJDdXJyZW50SWNvbiA9IE5VTEw7Ci0KLSAgICBXaW5TZW5kTXNnKGh3bmRGcmFtZSwKLSAgICAgICAgICAgICAgIFdNX1NFVElDT04sCi0gICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgTlVMTCk7Ci0gIH0KLQotfQotCi0vKiBTZXQgdGhlIHdpbmRvdyBpY29uIGltYWdlICovCi12b2lkIG9zMmZzbGliX1NldEljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzaykKLXsKLSAgSFdORCBod25kRnJhbWU7Ci0gIFNETF9TdXJmYWNlICppY29uX3JnYjsKLSAgSFBPSU5URVIgaHB0ckljb247Ci0gIEhCSVRNQVAgaGJtOwotICBCSVRNQVBJTkZPSEVBREVSIGJtaWg7Ci0gIEJNUElORk8gICAgICAgICAgYm1pOwotICBIUFMgICAgICAgICAgICAgIGhwczsKLSAgY2hhciAqcGNoVGVtcDsKLSAgY2hhciAqcHB0ciwgKm1wdHIsICpkcHRyLCAqZG1wdHI7Ci0gIGludCBtYXh4LCBtYXh5LCB3LCBoLCB4LCB5OwotICBTRExfUmVjdCBib3VuZHM7Ci0KLSNpZmRlZiBERUJVR19CVUlMRAotICBwcmludGYoIltvczJmc2xpYl9TZXRJY29uXSA6IENyZWF0aW5nIGFuZCBzZXR0aW5nIG5ldyBpY29uXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICBod25kRnJhbWUgPSBXaW5RdWVyeVdpbmRvdyhfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCBRV19QQVJFTlQpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgb2xkIGljb24gcmVzb3VyY2Ugd2lsbCBiZSBmcmVlJ2QhCi0gIG9zMmZzbGliX0Rlc3Ryb3lJY29uKGh3bmRGcmFtZSk7Ci0KLSAgaWYgKCghaWNvbikgfHwgKCFtYXNrKSkKLSAgICByZXR1cm47Ci0KLSAgdyA9IGljb24tPnc7Ci0gIGggPSBpY29uLT5oOwotCi0gIG1heHggPSBXaW5RdWVyeVN5c1ZhbHVlKEhXTkRfREVTS1RPUCwgU1ZfQ1hJQ09OKTsKLSAgbWF4eSA9IFdpblF1ZXJ5U3lzVmFsdWUoSFdORF9ERVNLVE9QLCBTVl9DWUlDT04pOwotCi0gIC8vIENoZWNrIGZvciBtYXggc2l6ZSEKLSAgaWYgKCh3Pm1heHgpIHx8IChoPm1heHkpKQotICAgIHJldHVybjsKLQotICBwY2hUZW1wID0gKGNoYXIgKikgU0RMX21hbGxvYyh3ICogaCoyICogNCk7Ci0gIGlmICghcGNoVGVtcCkKLSAgICByZXR1cm47Ci0KLSAgU0RMX21lbXNldChwY2hUZW1wLCAwLCB3ICogaCoyICogNCk7Ci0KLSAgLy8gQ29udmVydCBzdXJmYWNlIHRvIFJHQiwgaWYgaXQncyBub3QgUkdCIHlldCEKLSAgaWNvbl9yZ2IgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLCBpY29uLT53LCBpY29uLT5oLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLCAwLCAwLCAwLCAwKTsKLSAgaWYgKCBpY29uX3JnYiA9PSBOVUxMICkKLSAgewotICAgIFNETF9mcmVlKHBjaFRlbXApOwotICAgIHJldHVybjsKLSAgfQotICBib3VuZHMueCA9IDA7Ci0gIGJvdW5kcy55ID0gMDsKLSAgYm91bmRzLncgPSBpY29uLT53OwotICBib3VuZHMuaCA9IGljb24tPmg7Ci0gIGlmICggU0RMX0xvd2VyQmxpdChpY29uLCAmYm91bmRzLCBpY29uX3JnYiwgJmJvdW5kcykgPCAwICkKLSAgewotICAgIFNETF9GcmVlU3VyZmFjZShpY29uX3JnYik7Ci0gICAgU0RMX2ZyZWUocGNoVGVtcCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogQ29weSBwaXhlbHMgdXBzaWRlLWRvd24gZnJvbSBSR0Igc3VyZmFjZSBpbnRvIEJNUCwgbWFza2VkIHdpdGggdGhlIGljb24gbWFzayAqLwotCi0gIC8vIFBpeGVscwotICBwcHRyID0gKGNoYXIgKikgKGljb25fcmdiLT5waXhlbHMpOwotICAvLyBNYXNrCi0gIG1wdHIgPSBtYXNrOwotCi0gIGZvciAoeT0wOyB5PGg7IHkrKykKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgdWNoTWFza0J5dGU7Ci0KLSAgICAvLyBEZXN0aW5hdGlvbgotICAgIGRwdHIgPSBwY2hUZW1wICsgdyo0ICogKGgteS0xKTsKLSAgICAvLyBEZXN0aW5hdGlvbiBtYXNrCi0gICAgZG1wdHIgPSBwY2hUZW1wICsgdypoKjQgKyB3KjQgKiAoaC15LTEpOwotCi0gICAgZm9yICh4PTA7IHg8dzsgeCsrKQotICAgIHsKLSAgICAgIGlmICh4JTg9PTApCi0gICAgICB7Ci0gICAgICAgIHVjaE1hc2tCeXRlID0gKHVuc2lnbmVkIGNoYXIpICgqbXB0cik7Ci0gICAgICAgIG1wdHIrKzsKLSAgICAgIH0gZWxzZQotICAgICAgICB1Y2hNYXNrQnl0ZSA8PD0gMTsKLQotICAgICAgaWYgKHVjaE1hc2tCeXRlICYgMHg4MCkKLSAgICAgIHsKLSAgICAgICAgLy8gQ29weSBSR0IKLSAgICAgICAgKmRwdHIrKyA9ICpwcHRyKys7Ci0gICAgICAgICpkcHRyKysgPSAqcHB0cisrOwotICAgICAgICAqZHB0cisrID0gKnBwdHIrKzsKLSAgICAgICAgKmRwdHIrKyA9ICpwcHRyKys7Ci0KLSAgICAgICAgKmRtcHRyKysgPSAwOwotICAgICAgICAqZG1wdHIrKyA9IDA7Ci0gICAgICAgICpkbXB0cisrID0gMDsKLSAgICAgICAgKmRtcHRyKysgPSAwOwotICAgICAgfSBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFNldCBwaXhlbHMgdG8gZnVsbHkgdHJhbnNwYXJlbnQKLSAgICAgICAgKmRwdHIrKyA9IDA7IHBwdHIrKzsKLSAgICAgICAgKmRwdHIrKyA9IDA7IHBwdHIrKzsKLSAgICAgICAgKmRwdHIrKyA9IDA7IHBwdHIrKzsKLSAgICAgICAgKmRwdHIrKyA9IDA7IHBwdHIrKzsKLQotICAgICAgICAqZG1wdHIrKyA9IDI1NTsKLSAgICAgICAgKmRtcHRyKysgPSAyNTU7Ci0gICAgICAgICpkbXB0cisrID0gMjU1OwotICAgICAgICAqZG1wdHIrKyA9IDI1NTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBUaGVyZSBpcyBubyBtb3JlIG5lZWQgZm9yIHRoZSBSR0Igc3VyZmFjZQotICBTRExfRnJlZVN1cmZhY2UoaWNvbl9yZ2IpOwotCi0gIGhwcyA9IFdpbkdldFBTKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQpOwotCi0gIGJtaS5jYkZpeCA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgYm1pLmN4ID0gdzsKLSAgYm1pLmN5ID0gMipoOwotICBibWkuY1BsYW5lcyA9IDE7Ci0gIGJtaS5jQml0Q291bnQgPSAzMjsKLQotICBTRExfbWVtc2V0KCZibWloLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOwotICBibWloLmNiRml4ID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICBibWloLmN4ID0gdzsKLSAgYm1paC5jeSA9IDIqaDsKLSAgYm1paC5jUGxhbmVzID0gMTsKLSAgYm1paC5jQml0Q291bnQgPSAzMjsKLQotICBoYm0gPSBHcGlDcmVhdGVCaXRtYXAoaHBzLCAoUEJJVE1BUElORk9IRUFERVIyKSZibWloLCBDQk1fSU5JVCwgKFBCWVRFKSBwY2hUZW1wLCAoUEJJVE1BUElORk8yKSZibWkpOwotICBocHRySWNvbiA9IFdpbkNyZWF0ZVBvaW50ZXIoSFdORF9ERVNLVE9QLCBoYm0sIEZBTFNFLCAwLCAwKTsKLQotICBXaW5SZWxlYXNlUFMoaHBzKTsKLQotICAvLyBGcmVlIHBpeGVsIGFycmF5Ci0gIFNETF9mcmVlKHBjaFRlbXApOwotCi0gIC8vIENoYW5nZSBpY29uIGluIGZyYW1lIHdpbmRvdwotICBXaW5TZW5kTXNnKGh3bmRGcmFtZSwKLSAgICAgICAgICAgICBXTV9TRVRJQ09OLAotICAgICAgICAgICAgIChNUEFSQU0pIGhwdHJJY29uLAotICAgICAgICAgICAgIE5VTEwpOwotCi0gIC8qCi0gIC8vIENoYW5nZSBpY29uIGluIHN3aXRjaGxpc3QKLSAgLy8gU2VlbXMgbGlrZSBpdCdzIG5vdCBuZWVkZWQsIHRoZSBXTV9TRVRJQ09OIGFscmVhZHkgZG9lcyBpdC4KLSAgewotICAgIFBJRCBwaWRGcmFtZTsKLSAgICBIU1dJVENIIGhzd2l0Y2hGcmFtZTsKLSAgICBTV0NOVFJMIHN3Y3RsOwotCi0gICAgV2luUXVlcnlXaW5kb3dQcm9jZXNzKGh3bmRGcmFtZSwgJnBpZEZyYW1lLCBOVUxMKTsKLSAgICBoc3dpdGNoRnJhbWUgPSBXaW5RdWVyeVN3aXRjaEhhbmRsZShod25kRnJhbWUsIHBpZEZyYW1lKTsKLSAgICBXaW5RdWVyeVN3aXRjaEVudHJ5KGhzd2l0Y2hGcmFtZSwgJnN3Y3RsKTsKLQotICAgIHN3Y3RsLmh3bmRJY29uID0gaHB0ckljb247Ci0KLSAgICBXaW5DaGFuZ2VTd2l0Y2hFbnRyeShoc3dpdGNoRnJhbWUsICZzd2N0bCk7Ci0gIH0KLSAgKi8KLQotICAvLyBTdG9yZSBpY29uIGhhbmRsZSBpbiBnbG9iYWwgdmFyaWFibGUKLSAgaHB0ckN1cnJlbnRJY29uID0gaHB0ckljb247Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSRUFMIEZVTkNUSU9OUyAtLS0tLS0tLS0tLS0tLS0tLQotCi0KLXN0YXRpYyB2b2lkIG9zMmZzbGliX1NldEN1cnNvck1hbmFnZW1lbnRGdW5jdGlvbnMoX1RISVMsIGludCBpRm9yV2luZG93ZWRNb2RlKQotewotICBpZiAoaUZvcldpbmRvd2VkTW9kZSkKLSAgewotICAgIF90aGlzLT5GcmVlV01DdXJzb3IgPSBvczJmc2xpYl9GcmVlV01DdXJzb3I7Ci0gICAgX3RoaXMtPkNyZWF0ZVdNQ3Vyc29yID0gb3MyZnNsaWJfQ3JlYXRlV01DdXJzb3JfV2luOwotICAgIF90aGlzLT5TaG93V01DdXJzb3IgPSBvczJmc2xpYl9TaG93V01DdXJzb3I7Ci0gICAgX3RoaXMtPldhcnBXTUN1cnNvciA9IG9zMmZzbGliX1dhcnBXTUN1cnNvcjsKLSAgICBfdGhpcy0+TW92ZVdNQ3Vyc29yID0gb3MyZnNsaWJfTW92ZVdNQ3Vyc29yOwotICAgIF90aGlzLT5DaGVja01vdXNlTW9kZSA9IE5VTEw7Ly9vczJmc2xpYl9DaGVja01vdXNlTW9kZTsKLSAgfSBlbHNlCi0gIHsKLSAgICAvLyBXZSdsbCBoYXZlIHNvZnR3YXJlIG1vdXNlIGN1cnNvciBpbiBGUyBtb2RlIQotICAgIF90aGlzLT5GcmVlV01DdXJzb3IgPSBvczJmc2xpYl9GcmVlV01DdXJzb3I7Ci0gICAgX3RoaXMtPkNyZWF0ZVdNQ3Vyc29yID0gb3MyZnNsaWJfQ3JlYXRlV01DdXJzb3JfRlM7Ci0gICAgX3RoaXMtPlNob3dXTUN1cnNvciA9IG9zMmZzbGliX1Nob3dXTUN1cnNvcjsKLSAgICBfdGhpcy0+V2FycFdNQ3Vyc29yID0gb3MyZnNsaWJfV2FycFdNQ3Vyc29yOwotICAgIF90aGlzLT5Nb3ZlV01DdXJzb3IgPSBvczJmc2xpYl9Nb3ZlV01DdXJzb3I7Ci0gICAgX3RoaXMtPkNoZWNrTW91c2VNb2RlID0gTlVMTDsvL29zMmZzbGliX0NoZWNrTW91c2VNb2RlOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG9zMmZzbGliX0luaXRPU0tleW1hcChfVEhJUykKLXsKLSAgaW50IGk7Ci0KLSAgaVNoaWZ0SXNQcmVzc2VkID0gMDsKLQotICAvKiBNYXAgdGhlIFZLIGFuZCBDSCBrZXlzeW1zICovCi0gIGZvciAoIGk9MDsgaTw9MjU1OyArK2kgKQotICAgIEhXU2NhbktleU1hcFtpXSA9IFNETEtfVU5LTk9XTjsKLQotICAvLyBGaXJzdCBsaW5lIG9mIGtleWJvYXJkOgotICBIV1NjYW5LZXlNYXBbMHgxXSA9IFNETEtfRVNDQVBFOwotICBIV1NjYW5LZXlNYXBbMHgzYl0gPSBTRExLX0YxOwotICBIV1NjYW5LZXlNYXBbMHgzY10gPSBTRExLX0YyOwotICBIV1NjYW5LZXlNYXBbMHgzZF0gPSBTRExLX0YzOwotICBIV1NjYW5LZXlNYXBbMHgzZV0gPSBTRExLX0Y0OwotICBIV1NjYW5LZXlNYXBbMHgzZl0gPSBTRExLX0Y1OwotICBIV1NjYW5LZXlNYXBbMHg0MF0gPSBTRExLX0Y2OwotICBIV1NjYW5LZXlNYXBbMHg0MV0gPSBTRExLX0Y3OwotICBIV1NjYW5LZXlNYXBbMHg0Ml0gPSBTRExLX0Y4OwotICBIV1NjYW5LZXlNYXBbMHg0M10gPSBTRExLX0Y5OwotICBIV1NjYW5LZXlNYXBbMHg0NF0gPSBTRExLX0YxMDsKLSAgSFdTY2FuS2V5TWFwWzB4NTddID0gU0RMS19GMTE7Ci0gIEhXU2NhbktleU1hcFsweDU4XSA9IFNETEtfRjEyOwotICBIV1NjYW5LZXlNYXBbMHg1ZF0gPSBTRExLX1BSSU5UOwotICBIV1NjYW5LZXlNYXBbMHg0Nl0gPSBTRExLX1NDUk9MTE9DSzsKLSAgSFdTY2FuS2V5TWFwWzB4NWZdID0gU0RMS19QQVVTRTsKLQotICAvLyBTZWNvbmQgbGluZSBvZiBrZXlib2FyZDoKLSAgSFdTY2FuS2V5TWFwWzB4MjldID0gU0RMS19CQUNLUVVPVEU7Ci0gIEhXU2NhbktleU1hcFsweDJdID0gU0RMS18xOwotICBIV1NjYW5LZXlNYXBbMHgzXSA9IFNETEtfMjsKLSAgSFdTY2FuS2V5TWFwWzB4NF0gPSBTRExLXzM7Ci0gIEhXU2NhbktleU1hcFsweDVdID0gU0RMS180OwotICBIV1NjYW5LZXlNYXBbMHg2XSA9IFNETEtfNTsKLSAgSFdTY2FuS2V5TWFwWzB4N10gPSBTRExLXzY7Ci0gIEhXU2NhbktleU1hcFsweDhdID0gU0RMS183OwotICBIV1NjYW5LZXlNYXBbMHg5XSA9IFNETEtfODsKLSAgSFdTY2FuS2V5TWFwWzB4YV0gPSBTRExLXzk7Ci0gIEhXU2NhbktleU1hcFsweGJdID0gU0RMS18wOwotICBIV1NjYW5LZXlNYXBbMHhjXSA9IFNETEtfTUlOVVM7Ci0gIEhXU2NhbktleU1hcFsweGRdID0gU0RMS19FUVVBTFM7Ci0gIEhXU2NhbktleU1hcFsweGVdID0gU0RMS19CQUNLU1BBQ0U7Ci0gIEhXU2NhbktleU1hcFsweDY4XSA9IFNETEtfSU5TRVJUOwotICBIV1NjYW5LZXlNYXBbMHg2MF0gPSBTRExLX0hPTUU7Ci0gIEhXU2NhbktleU1hcFsweDYyXSA9IFNETEtfUEFHRVVQOwotICBIV1NjYW5LZXlNYXBbMHg0NV0gPSBTRExLX05VTUxPQ0s7Ci0gIEhXU2NhbktleU1hcFsweDVjXSA9IFNETEtfS1BfRElWSURFOwotICBIV1NjYW5LZXlNYXBbMHgzN10gPSBTRExLX0tQX01VTFRJUExZOwotICBIV1NjYW5LZXlNYXBbMHg0YV0gPSBTRExLX0tQX01JTlVTOwotCi0gIC8vIFRoaXJkIGxpbmUgb2Yga2V5Ym9hcmQ6Ci0gIEhXU2NhbktleU1hcFsweGZdID0gU0RMS19UQUI7Ci0gIEhXU2NhbktleU1hcFsweDEwXSA9IFNETEtfcTsKLSAgSFdTY2FuS2V5TWFwWzB4MTFdID0gU0RMS193OwotICBIV1NjYW5LZXlNYXBbMHgxMl0gPSBTRExLX2U7Ci0gIEhXU2NhbktleU1hcFsweDEzXSA9IFNETEtfcjsKLSAgSFdTY2FuS2V5TWFwWzB4MTRdID0gU0RMS190OwotICBIV1NjYW5LZXlNYXBbMHgxNV0gPSBTRExLX3k7Ci0gIEhXU2NhbktleU1hcFsweDE2XSA9IFNETEtfdTsKLSAgSFdTY2FuS2V5TWFwWzB4MTddID0gU0RMS19pOwotICBIV1NjYW5LZXlNYXBbMHgxOF0gPSBTRExLX287Ci0gIEhXU2NhbktleU1hcFsweDE5XSA9IFNETEtfcDsKLSAgSFdTY2FuS2V5TWFwWzB4MWFdID0gU0RMS19MRUZUQlJBQ0tFVDsKLSAgSFdTY2FuS2V5TWFwWzB4MWJdID0gU0RMS19SSUdIVEJSQUNLRVQ7Ci0gIEhXU2NhbktleU1hcFsweDFjXSA9IFNETEtfUkVUVVJOOwotICBIV1NjYW5LZXlNYXBbMHg2OV0gPSBTRExLX0RFTEVURTsKLSAgSFdTY2FuS2V5TWFwWzB4NjVdID0gU0RMS19FTkQ7Ci0gIEhXU2NhbktleU1hcFsweDY3XSA9IFNETEtfUEFHRURPV047Ci0gIEhXU2NhbktleU1hcFsweDQ3XSA9IFNETEtfS1A3OwotICBIV1NjYW5LZXlNYXBbMHg0OF0gPSBTRExLX0tQODsKLSAgSFdTY2FuS2V5TWFwWzB4NDldID0gU0RMS19LUDk7Ci0gIEhXU2NhbktleU1hcFsweDRlXSA9IFNETEtfS1BfUExVUzsKLQotICAvLyBGb3VydGggbGluZSBvZiBrZXlib2FyZDoKLSAgSFdTY2FuS2V5TWFwWzB4M2FdID0gU0RMS19DQVBTTE9DSzsKLSAgSFdTY2FuS2V5TWFwWzB4MWVdID0gU0RMS19hOwotICBIV1NjYW5LZXlNYXBbMHgxZl0gPSBTRExLX3M7Ci0gIEhXU2NhbktleU1hcFsweDIwXSA9IFNETEtfZDsKLSAgSFdTY2FuS2V5TWFwWzB4MjFdID0gU0RMS19mOwotICBIV1NjYW5LZXlNYXBbMHgyMl0gPSBTRExLX2c7Ci0gIEhXU2NhbktleU1hcFsweDIzXSA9IFNETEtfaDsKLSAgSFdTY2FuS2V5TWFwWzB4MjRdID0gU0RMS19qOwotICBIV1NjYW5LZXlNYXBbMHgyNV0gPSBTRExLX2s7Ci0gIEhXU2NhbktleU1hcFsweDI2XSA9IFNETEtfbDsKLSAgSFdTY2FuS2V5TWFwWzB4MjddID0gU0RMS19TRU1JQ09MT047Ci0gIEhXU2NhbktleU1hcFsweDI4XSA9IFNETEtfUVVPVEU7Ci0gIEhXU2NhbktleU1hcFsweDJiXSA9IFNETEtfQkFDS1NMQVNIOwotICBIV1NjYW5LZXlNYXBbMHg0Yl0gPSBTRExLX0tQNDsKLSAgSFdTY2FuS2V5TWFwWzB4NGNdID0gU0RMS19LUDU7Ci0gIEhXU2NhbktleU1hcFsweDRkXSA9IFNETEtfS1A2OwotCi0gIC8vIEZpZnRoIGxpbmUgb2Yga2V5Ym9hcmQ6Ci0gIEhXU2NhbktleU1hcFsweDJhXSA9IFNETEtfTFNISUZUOwotICBIV1NjYW5LZXlNYXBbMHg1Nl0gPSBTRExLX1dPUkxEXzE7IC8vIENvZGUgMTYxLCBsZXR0ZXIgaScgb24gaHVuZ2FyaWFuIGtleWJvYXJkCi0gIEhXU2NhbktleU1hcFsweDJjXSA9IFNETEtfejsKLSAgSFdTY2FuS2V5TWFwWzB4MmRdID0gU0RMS194OwotICBIV1NjYW5LZXlNYXBbMHgyZV0gPSBTRExLX2M7Ci0gIEhXU2NhbktleU1hcFsweDJmXSA9IFNETEtfdjsKLSAgSFdTY2FuS2V5TWFwWzB4MzBdID0gU0RMS19iOwotICBIV1NjYW5LZXlNYXBbMHgzMV0gPSBTRExLX247Ci0gIEhXU2NhbktleU1hcFsweDMyXSA9IFNETEtfbTsKLSAgSFdTY2FuS2V5TWFwWzB4MzNdID0gU0RMS19DT01NQTsKLSAgSFdTY2FuS2V5TWFwWzB4MzRdID0gU0RMS19QRVJJT0Q7Ci0gIEhXU2NhbktleU1hcFsweDM1XSA9IFNETEtfU0xBU0g7Ci0gIEhXU2NhbktleU1hcFsweDM2XSA9IFNETEtfUlNISUZUOwotICBIV1NjYW5LZXlNYXBbMHg2MV0gPSBTRExLX1VQOwotICBIV1NjYW5LZXlNYXBbMHg0Zl0gPSBTRExLX0tQMTsKLSAgSFdTY2FuS2V5TWFwWzB4NTBdID0gU0RMS19LUDI7Ci0gIEhXU2NhbktleU1hcFsweDUxXSA9IFNETEtfS1AzOwotICBIV1NjYW5LZXlNYXBbMHg1YV0gPSBTRExLX0tQX0VOVEVSOwotCi0gIC8vIFNpeHRoIGxpbmUgb2Yga2V5Ym9hcmQ6Ci0gIEhXU2NhbktleU1hcFsweDFkXSA9IFNETEtfTENUUkw7Ci0gIEhXU2NhbktleU1hcFsweDdlXSA9IFNETEtfTFNVUEVSOyAvLyBXaW5kb3dzIGtleQotICBIV1NjYW5LZXlNYXBbMHgzOF0gPSBTRExLX0xBTFQ7Ci0gIEhXU2NhbktleU1hcFsweDM5XSA9IFNETEtfU1BBQ0U7Ci0gIEhXU2NhbktleU1hcFsweDVlXSA9IFNETEtfUkFMVDsvLyBBY3R1YWxseSwgYWx0Z3Igb24gbXkga2V5Ym9hcmQuLi4KLSAgSFdTY2FuS2V5TWFwWzB4N2ZdID0gU0RMS19SU1VQRVI7Ci0gIEhXU2NhbktleU1hcFsweDdjXSA9IFNETEtfTUVOVTsKLSAgSFdTY2FuS2V5TWFwWzB4NWJdID0gU0RMS19SQ1RSTDsKLSAgSFdTY2FuS2V5TWFwWzB4NjNdID0gU0RMS19MRUZUOwotICBIV1NjYW5LZXlNYXBbMHg2Nl0gPSBTRExLX0RPV047Ci0gIEhXU2NhbktleU1hcFsweDY0XSA9IFNETEtfUklHSFQ7Ci0gIEhXU2NhbktleU1hcFsweDUyXSA9IFNETEtfS1AwOwotICBIV1NjYW5LZXlNYXBbMHg1M10gPSBTRExLX0tQX1BFUklPRDsKLX0KLQotCi0vKiBJY29uaWZ5IHRoZSB3aW5kb3cuCi0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlcmUgaXMgYSB3aW5kb3cgbWFuYWdlciBhbmQgdGhlCi0gd2luZG93IHdhcyBhY3R1YWxseSBpY29uaWZpZWQsIGl0IHJldHVybnMgMCBvdGhlcndpc2UuCi0gKi8KLWludCBvczJmc2xpYl9JY29uaWZ5V2luZG93KF9USElTKQotewotICBIQUIgaGFiOwotICBITVEgaG1xOwotICBFUlJPUklEIGhtcWVycm9yOwotCi0gIC8vIElmIHRoZXJlIGlzIG5vIG1vcmUgd2luZG93LCBub3RoaW5nIHdlIGNhbiBkbyEKLSAgaWYgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyE9MSkgcmV0dXJuIDA7Ci0KLSAgLy8gQ2Fubm90IGRvIGFueXRoaW5nIGluIGZ1bGxzY3JlZW4gbW9kZSEKLSAgaWYgKEZTTGliX1F1ZXJ5RlNNb2RlKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQpKQotICAgIHJldHVybiAwOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGlzIHRocmVhZCBpcyBwcmVwYXJlZCBmb3IgdXNpbmcgdGhlIFByZXNlbnRhdGlvbiBNYW5hZ2VyIQotICBoYWIgPSBXaW5Jbml0aWFsaXplKDApOwotICBobXEgPSBXaW5DcmVhdGVNc2dRdWV1ZShoYWIsMCk7Ci0gIC8vIFJlbWVtYmVyIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBhdCBXaW5DcmVhdGVNc2dRdWV1ZSgpLCBiZWNhdXNlIHdlIGRvbid0Ci0gIC8vIHdhbnQgdG8gZGVzdHJveSBzb21lYm9keSBlbHNlJ3MgcXVldWUgbGF0ZXIuIDopCi0gIGhtcWVycm9yID0gV2luR2V0TGFzdEVycm9yKGhhYik7Ci0KLSAgV2luU2V0V2luZG93UG9zKF90aGlzLT5oaWRkZW4tPmh3bmRGcmFtZSwgSFdORF9UT1AsCi0gICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIFNXUF9NSU5JTUlaRSk7Ci0KLSAgLy8gTm93IGRlc3Ryb3kgdGhlIG1lc3NhZ2UgcXVldWUsIGlmIHdlJ3ZlIGNyZWF0ZWQgaXQhCi0gIGlmIChFUlJPUklERVJST1IoaG1xZXJyb3IpPT0wKQotICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgU0RMX0dyYWJNb2RlIG9zMmZzbGliX0dyYWJJbnB1dChfVEhJUywgU0RMX0dyYWJNb2RlIG1vZGUpCi17Ci0gIEhBQiBoYWI7Ci0gIEhNUSBobXE7Ci0gIEVSUk9SSUQgaG1xZXJyb3I7Ci0KLQotICAvLyBJZiB0aGVyZSBpcyBubyBtb3JlIHdpbmRvdywgbm90aGluZyB3ZSBjYW4gZG8hCi0gIGlmIChfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMhPTEpCi0gICAgcmV0dXJuIFNETF9HUkFCX09GRjsKLQotICAvLyBNYWtlIHN1cmUgdGhpcyB0aHJlYWQgaXMgcHJlcGFyZWQgZm9yIHVzaW5nIHRoZSBQcmVzZW50YXRpb24gTWFuYWdlciEKLSAgaGFiID0gV2luSW5pdGlhbGl6ZSgwKTsKLSAgaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLDApOwotICAvLyBSZW1lbWJlciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgYXQgV2luQ3JlYXRlTXNnUXVldWUoKSwgYmVjYXVzZSB3ZSBkb24ndAotICAvLyB3YW50IHRvIGRlc3Ryb3kgc29tZWJvZHkgZWxzZSdzIHF1ZXVlIGxhdGVyLiA6KQotICBobXFlcnJvciA9IFdpbkdldExhc3RFcnJvcihoYWIpOwotCi0KLSAgaWYgKG1vZGUgPT0gU0RMX0dSQUJfT0ZGKQotICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICBwcmludGYoIltvczJmc2xpYl9HcmFiSW5wdXRdIDogUmVsZWFzaW5nIG1vdXNlXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgIC8vIFJlbGVhc2UgdGhlIG1vdXNlCi0gICAgYk1vdXNlQ2FwdHVyYWJsZSA9IDA7Ci0gICAgaWYgKGJNb3VzZUNhcHR1cmVkKQotICAgIHsKLSAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBOVUxMSEFORExFKTsKLSAgICAgIGJNb3VzZUNhcHR1cmVkID0gMDsKLSAgICB9Ci0gIH0gZWxzZQotICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICBwcmludGYoIltvczJmc2xpYl9HcmFiSW5wdXRdIDogQ2FwdHVyaW5nIG1vdXNlXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgIC8vIENhcHR1cmUgdGhlIG1vdXNlCi0gICAgYk1vdXNlQ2FwdHVyYWJsZSA9IDE7Ci0gICAgaWYgKFdpblF1ZXJ5Rm9jdXMoSFdORF9ERVNLVE9QKSA9PSBfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50KQotICAgIHsKLSAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50KTsKLSAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKLSAgICAgIHsKLSAgICAgICAgU1dQIHN3cENsaWVudDsKLSAgICAgICAgUE9JTlRMIHB0bDsKLSAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCi0gICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsICZzd3BDbGllbnQpOwotICAgICAgICBwdGwueCA9IDA7IHB0bC55ID0gMDsKLSAgICAgICAgV2luTWFwV2luZG93UG9pbnRzKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsIEhXTkRfREVTS1RPUCwgJnB0bCwgMSk7Ci0gICAgICAgIF90aGlzLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLwotICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIE5vdyBkZXN0cm95IHRoZSBtZXNzYWdlIHF1ZXVlLCBpZiB3ZSd2ZSBjcmVhdGVkIGl0IQotICBpZiAoRVJST1JJREVSUk9SKGhtcWVycm9yKT09MCkKLSAgICBXaW5EZXN0cm95TXNnUXVldWUoaG1xKTsKLQotICByZXR1cm4gbW9kZTsKLX0KLQotLyogU2V0IHRoZSB0aXRsZSBhbmQgaWNvbiB0ZXh0ICovCi1zdGF0aWMgdm9pZCBvczJmc2xpYl9TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKLXsKLSAgSEFCIGhhYjsKLSAgSE1RIGhtcTsKLSAgRVJST1JJRCBobXFlcnJvcjsKLQotICAvLyBJZiB0aGVyZSBpcyBubyBtb3JlIHdpbmRvdywgbm90aGluZyB3ZSBjYW4gZG8hCi0gIGlmIChfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMhPTEpIHJldHVybjsKLQotICAvLyBNYWtlIHN1cmUgdGhpcyB0aHJlYWQgaXMgcHJlcGFyZWQgZm9yIHVzaW5nIHRoZSBQcmVzZW50YXRpb24gTWFuYWdlciEKLSAgaGFiID0gV2luSW5pdGlhbGl6ZSgwKTsKLSAgaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLDApOwotICAvLyBSZW1lbWJlciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgYXQgV2luQ3JlYXRlTXNnUXVldWUoKSwgYmVjYXVzZSB3ZSBkb24ndAotICAvLyB3YW50IHRvIGRlc3Ryb3kgc29tZWJvZHkgZWxzZSdzIHF1ZXVlIGxhdGVyLiA6KQotICBobXFlcnJvciA9IFdpbkdldExhc3RFcnJvcihoYWIpOwotCi0gIFdpblNldFdpbmRvd1RleHQoX3RoaXMtPmhpZGRlbi0+aHduZEZyYW1lLCAoY2hhciAqKSB0aXRsZSk7Ci0KLSAgLy8gTm93IGRlc3Ryb3kgdGhlIG1lc3NhZ2UgcXVldWUsIGlmIHdlJ3ZlIGNyZWF0ZWQgaXQhCi0gIGlmIChFUlJPUklERVJST1IoaG1xZXJyb3IpPT0wKQotICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOwotfQotCi1zdGF0aWMgaW50IG9zMmZzbGliX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBvbikKLXsKLSNpZmRlZiBERUJVR19CVUlMRAotICBwcmludGYoIltvczJmc2xpYl9Ub2dnbGVGdWxsU2NyZWVuXSA6ICVkXG4iLCBvbik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gIC8vIElmIHRoZXJlIGlzIG5vIG1vcmUgd2luZG93LCBub3RoaW5nIHdlIGNhbiBkbyEKLSAgaWYgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyE9MSkgcmV0dXJuIDA7Ci0KLSAgRlNMaWJfVG9nZ2xlRlNNb2RlKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsIG9uKTsKLSAgLyogQ3Vyc29yIG1hbmFnZXIgZnVuY3Rpb25zIHRvIFdpbmRvd2VkL0ZTIG1vZGUqLwotICBvczJmc2xpYl9TZXRDdXJzb3JNYW5hZ2VtZW50RnVuY3Rpb25zKF90aGlzLCAhb24pOwotICByZXR1cm4gMTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHZpZGVvIG1vZGUgaGFzIGJlZW4gc2V0LCB0byBnZXQgdGhlCi0gaW5pdGlhbCBtb3VzZSBzdGF0ZS4gIEl0IHNob3VsZCBxdWV1ZSBldmVudHMgYXMgbmVjZXNzYXJ5IHRvCi0gcHJvcGVybHkgcmVwcmVzZW50IHRoZSBjdXJyZW50IG1vdXNlIGZvY3VzIGFuZCBwb3NpdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgb3MyZnNsaWJfVXBkYXRlTW91c2UoX1RISVMpCi17Ci0gIFBPSU5UTCBwdGw7Ci0gIEhBQiBoYWI7Ci0gIEhNUSBobXE7Ci0gIEVSUk9SSUQgaG1xZXJyb3I7Ci0gIFNXUCBzd3BDbGllbnQ7Ci0KLSAgLy8gSWYgdGhlcmUgaXMgbm8gbW9yZSB3aW5kb3csIG5vdGhpbmcgd2UgY2FuIGRvIQotICBpZiAoX3RoaXMtPmhpZGRlbi0+aVBNVGhyZWFkU3RhdHVzIT0xKSByZXR1cm47Ci0KLQotICAvLyBNYWtlIHN1cmUgdGhpcyB0aHJlYWQgaXMgcHJlcGFyZWQgZm9yIHVzaW5nIHRoZSBQcmVzZW50YXRpb24gTWFuYWdlciEKLSAgaGFiID0gV2luSW5pdGlhbGl6ZSgwKTsKLSAgaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLDApOwotICAvLyBSZW1lbWJlciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgYXQgV2luQ3JlYXRlTXNnUXVldWUoKSwgYmVjYXVzZSB3ZSBkb24ndAotICAvLyB3YW50IHRvIGRlc3Ryb3kgc29tZWJvZHkgZWxzZSdzIHF1ZXVlIGxhdGVyLiA6KQotICBobXFlcnJvciA9IFdpbkdldExhc3RFcnJvcihoYWIpOwotCi0gIAotCi0gIGlmIChfdGhpcy0+aGlkZGVuLT5mSW5Gb2N1cykKLSAgewotICAgIC8vIElmIG91ciBhcHAgaXMgaW4gZm9jdXMKLSAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7Ci0gICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUElOUFVURk9DVVMpOwotICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBBQ1RJVkUpOwotICAgIFdpblF1ZXJ5UG9pbnRlclBvcyhIV05EX0RFU0tUT1AsICZwdGwpOwotICAgIFdpbk1hcFdpbmRvd1BvaW50cyhIV05EX0RFU0tUT1AsIF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsICZwdGwsIDEpOwotICAgIFdpblF1ZXJ5V2luZG93UG9zKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsICZzd3BDbGllbnQpOwotICAgIC8vIENvbnZlcnQgT1MvMiBtb3VzZSBwb3NpdGlvbiB0byBTREwgcG9zaXRpb24sIGFuZCBhbHNvIHNjYWxlIGl0IQotICAgIHB0bC54ID0gcHRsLnggKiBfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24gLyBzd3BDbGllbnQuY3g7Ci0gICAgcHRsLnkgPSBwdGwueSAqIF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAvIHN3cENsaWVudC5jeTsKLSAgICBwdGwueSA9IF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAtIHB0bC55IC0gMTsKLSAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIChTaW50MTYpIChwdGwueCksIChTaW50MTYpIChwdGwueSkpOwotICB9IGVsc2UKLSAgewotICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBmb2N1cwotICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLSAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQSU5QVVRGT0NVUyk7Ci0gICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUEFDVElWRSk7Ci0gICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCAoU2ludDE2KSAtMSwgKFNpbnQxNikgLTEpOwotICB9Ci0KLSAgLy8gTm93IGRlc3Ryb3kgdGhlIG1lc3NhZ2UgcXVldWUsIGlmIHdlJ3ZlIGNyZWF0ZWQgaXQhCi0gIGlmIChFUlJPUklERVJST1IoaG1xZXJyb3IpPT0wKQotICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOwotCi19Ci0KLS8qIFRoaXMgcG9pbnRlciBzaG91bGQgZXhpc3QgaW4gdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gYW5kIHNob3VsZAotIHBvaW50IHRvIGFuIGFwcHJvcHJpYXRlIHVwZGF0ZSBmdW5jdGlvbiBmb3IgdGhlIGN1cnJlbnQgdmlkZW8gbW9kZQotICovCi1zdGF0aWMgdm9pZCBvczJmc2xpYl9VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0gIC8vIElmIHRoZXJlIGlzIG5vIG1vcmUgd2luZG93LCBub3RoaW5nIHdlIGNhbiBkbyEKLSAgaWYgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyE9MSkgcmV0dXJuOwotCi0jaWZkZWYgQklUQkxUX0lOX1dJTk1FU1NBR0VQUk9DCi0gIFdpblNlbmRNc2coX3RoaXMtPmhpZGRlbi0+aHduZENsaWVudCwKLSAgICAgICAgICAgICAgICAgV01fVVBEQVRFUkVDVFNSRVFVRVNULAotICAgICAgICAgICAgICAgICAoTVBBUkFNKSBudW1yZWN0cywKLSAgICAgICAgICAgICAgICAgKE1QQVJBTSkgcmVjdHMpOwotI2Vsc2UKLSAgaWYgKERvc1JlcXVlc3RNdXRleFNlbShfdGhpcy0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyLCBTRU1fSU5ERUZJTklURV9XQUlUKT09Tk9fRVJST1IpCi0gIHsKLSAgICBpbnQgaTsKLQotICAgIGlmIChfdGhpcy0+aGlkZGVuLT5wU0RMU3VyZmFjZSkKLSAgICB7Ci0jaWZuZGVmIFJFU0laRV9FVkVOX0lGX1JFU0laQUJMRQotICAgICAgU1dQIHN3cDsKLSAgICAgIC8vIEJ1dCBvbmx5IGJsaXQgaWYgdGhlIHdpbmRvdyBpcyBub3QgcmVzaXphYmxlLCBvciBpZgotICAgICAgLy8gdGhlIHdpbmRvdyBpcyByZXNpemFibGUgYW5kIHRoZSBzb3VyY2UgYnVmZmVyIHNpemUgaXMgdGhlCi0gICAgICAvLyBzYW1lIGFzIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgc2l6ZSEKLSAgICAgIFdpblF1ZXJ5V2luZG93UG9zKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsICZzd3ApOwotICAgICAgaWYgKChfdGhpcy0+aGlkZGVuLT5wU0RMU3VyZmFjZSkgJiYKLSAgICAgICAgICAoX3RoaXMtPmhpZGRlbi0+cFNETFN1cmZhY2UtPmZsYWdzICYgU0RMX1JFU0laQUJMRSkgJiYKLSAgICAgICAgICAoKHN3cC5jeCAhPSBfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24pIHx8Ci0gICAgICAgICAgIChzd3AuY3kgIT0gX3RoaXMtPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uKQotICAgICAgICAgICkgJiYKLSAgICAgICAgICAoIUZTTGliX1F1ZXJ5RlNNb2RlKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQpKQotICAgICAgICAgKQotICAgICAgewotICAgICAgICAvLyBSZXNpemFibGUgc3VyZmFjZSBhbmQgaW4gcmVzaXppbmchCi0gICAgICAgIC8vIFNvLCBkb24ndCBibGl0IG5vdyEKLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgICBwcmludGYoIltVcGRhdGVSZWN0c10gOiBTa2lwcGluZyBibGl0IHdoaWxlIHJlc2l6aW5nIVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgewotICAgICAgLyoKLSAgICAgICAgLy8gQmxpdCB0aGUgd2hvbGUgd2luZG93Ci0gICAgICAgIEZTTElCX0JJVEJMVChfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCBfdGhpcy0+aGlkZGVuLT5wY2hTcmNCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgX3RoaXMtPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgX3RoaXMtPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgICAgICBwcmludGYoIltvczJmc2xpYl9VcGRhdGVSZWN0c10gOiBCbGl0dGluZyFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAKLSAgICAgICAgLy8gQmxpdCB0aGUgY2hhbmdlZCBhcmVhcwotICAgICAgICBmb3IgKGk9MDsgaTxudW1yZWN0czsgaSsrKQotICAgICAgICAgIEZTTElCX0JJVEJMVChfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCBfdGhpcy0+aGlkZGVuLT5wY2hTcmNCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlY3RzW2ldLnksIHJlY3RzW2ldLngsIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgpOwotICAgICAgfQotICAgIH0KLSNpZmRlZiBERUJVR19CVUlMRAotICAgICBlbHNlCi0gICAgICAgcHJpbnRmKCJbb3MyZnNsaWJfVXBkYXRlUmVjdHNdIDogTm8gcHVibGljIHN1cmZhY2UhXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oX3RoaXMtPmhpZGRlbi0+aG10eFVzZVNyY0J1ZmZlcik7Ci0gIH0KLSNpZmRlZiBERUJVR19CVUlMRAotICBlbHNlCi0gICAgcHJpbnRmKCJbb3MyZnNsaWJfVXBkYXRlUmVjdHNdIDogRXJyb3IgaW4gbXV0ZXghXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSNlbmRpZgotfQotCi0KLS8qIFJldmVyc2UgdGhlIGVmZmVjdHMgVmlkZW9Jbml0KCkgLS0gY2FsbGVkIGlmIFZpZGVvSW5pdCgpIGZhaWxzCi0gb3IgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHNodXR0aW5nIGRvd24gdGhlIHZpZGVvIHN1YnN5c3RlbS4KLSAqLwotc3RhdGljIHZvaWQgb3MyZnNsaWJfVmlkZW9RdWl0KF9USElTKQotewotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW29zMmZzbGliX1ZpZGVvUXVpdF1cbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAvLyBDbG9zZSBQTSBzdHVmZiBpZiBydW5uaW5nIQotICBpZiAoX3RoaXMtPmhpZGRlbi0+aVBNVGhyZWFkU3RhdHVzID09IDEpCi0gIHsKLSAgICBpbnQgaVRpbWVvdXQ7Ci0gICAgV2luUG9zdE1zZyhfdGhpcy0+aGlkZGVuLT5od25kRnJhbWUsIFdNX1FVSVQsIChNUEFSQU0pIDAsIChNUEFSQU0pIDApOwotICAgIC8vIEhBQ0s6IFdlIGhhZCB0aGlzIGxpbmUgYmVmb3JlOgotICAgIC8vRG9zV2FpdFRocmVhZCgoVElEICopICYoX3RoaXMtPmhpZGRlbi0+dGlkUE1UaHJlYWQpLCBEQ1dXX1dBSVQpOwotICAgIC8vIFdlIGRvbid0IHVzZSBpdCwgYmVjYXVzZSB0aGUgUE1UaHJlYWQgd2lsbCBuZXZlciBzdG9wLCBvciBpZiBpdCBzdG9wcywKLSAgICAvLyBpdCB3aWxsIGtpbGwgdGhlIHdob2xlIHByb2Nlc3MgYXMgYSBlbWVyZ2VuY3kgZmFsbGJhY2suCi0gICAgLy8gU28sIHdlIG9ubHkgY2hlY2sgZm9yIHRoZSBpUE1UaHJlYWRTdGF0dXMgc3R1ZmYhCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICBwcmludGYoIltvczJmc2xpYl9WaWRlb1F1aXRdIDogV2FpdGluZyBmb3IgUE0gdGhyZWFkIHRvIGRpZVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICBpVGltZW91dD0wOwotICAgIHdoaWxlICgoX3RoaXMtPmhpZGRlbi0+aVBNVGhyZWFkU3RhdHVzID09IDEpICYmIChpVGltZW91dDwxMDApKQotICAgIHsKLSAgICAgIGlUaW1lb3V0Kys7Ci0gICAgICBEb3NTbGVlcCg2NCk7Ci0gICAgfQotCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICBwcmludGYoIltvczJmc2xpYl9WaWRlb1F1aXRdIDogRW5kIG9mIHdhaXQuXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgIGlmIChfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMgPT0gMSkKLSAgICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvUXVpdF0gOiBLaWxsaW5nIFBNIHRocmVhZCFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgICAgCi0gICAgICBfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMgPSAwOwotICAgICAgRG9zS2lsbFRocmVhZChfdGhpcy0+aGlkZGVuLT50aWRQTVRocmVhZCk7Ci0KLSAgICAgIGlmIChfdGhpcy0+aGlkZGVuLT5od25kRnJhbWUpCi0gICAgICB7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgICAgcHJpbnRmKCJbb3MyZnNsaWJfVmlkZW9RdWl0XSA6IERlc3Ryb3lpbmcgUE0gd2luZG93IVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICAgICAgV2luRGVzdHJveVdpbmRvdyhfdGhpcy0+aGlkZGVuLT5od25kRnJhbWUpOyBfdGhpcy0+aGlkZGVuLT5od25kRnJhbWU9TlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vIEZyZWUgcmVzdWx0IG9mIGFuIG9sZCBMaXN0TW9kZXMoKSBjYWxsLCBiZWNhdXNlIHRoZXJlIGlzCi0gIC8vIG5vIEZyZWVMaXN0TW9kZXMoKSBjYWxsIGluIFNETCEKLSAgaWYgKF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQpCi0gIHsKLSAgICBTRExfZnJlZShfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0KTsgX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdCA9IE5VTEw7Ci0gIH0KLQotICAvLyBGcmVlIGxpc3Qgb2YgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZXMKLSAgaWYgKF90aGlzLT5oaWRkZW4tPnBBdmFpbGFibGVGU0xpYlZpZGVvTW9kZXMpCi0gIHsKLSAgICBGU0xpYl9GcmVlVmlkZW9Nb2RlTGlzdChfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzKTsKLSAgICBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzID0gTlVMTDsKLSAgfQotCi0gIC8vIEZyZWUgYXBwbGljYXRpb24gaWNvbiBpZiB3ZSBoYWQgb25lCi0gIGlmIChocHRyQ3VycmVudEljb24pCi0gIHsKLSAgICBXaW5EZXN0cm95UG9pbnRlcihocHRyQ3VycmVudEljb24pOwotICAgIGhwdHJDdXJyZW50SWNvbiA9IE5VTEw7Ci0gIH0KLX0KLQotLyogU2V0IHRoZSByZXF1ZXN0ZWQgdmlkZW8gbW9kZSwgcmV0dXJuaW5nIGEgc3VyZmFjZSB3aGljaCB3aWxsIGJlCi0gc2V0IHRvIHRoZSBTRExfVmlkZW9TdXJmYWNlLiAgVGhlIHdpZHRoIGFuZCBoZWlnaHQgd2lsbCBhbHJlYWR5Ci0gYmUgdmVyaWZpZWQgYnkgTGlzdE1vZGVzKCksIGFuZCB0aGUgdmlkZW8gc3Vic3lzdGVtIGlzIGZyZWUgdG8KLSBzZXQgdGhlIG1vZGUgdG8gYSBzdXBwb3J0ZWQgYml0IGRlcHRoIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUKLSBzcGVjaWZpZWQgLS0gdGhlIGRlc2lyZWQgYnBwIHdpbGwgYmUgZW11bGF0ZWQgd2l0aCBhIHNoYWRvdwotIHN1cmZhY2UgaWYgbmVjZXNzYXJ5LiAgSWYgYSBuZXcgbW9kZSBpcyByZXR1cm5lZCwgdGhpcyBmdW5jdGlvbgotIHNob3VsZCB0YWtlIGNhcmUgb2YgY2xlYW5pbmcgdXAgdGhlIGN1cnJlbnQgbW9kZS4KLSAqLwotc3RhdGljIFNETF9TdXJmYWNlICpvczJmc2xpYl9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0gIHN0YXRpYyBpbnQgYkZpcnN0Q2FsbCA9IDE7Ci0gIEZTTGliX1ZpZGVvTW9kZV9wIHBNb2RlSW5mbywgcE1vZGVJbmZvRm91bmQ7Ci0gIEZTTGliX1ZpZGVvTW9kZSBUZW1wTW9kZUluZm87Ci0gIEhBQiBoYWI7Ci0gIEhNUSBobXE7Ci0gIEVSUk9SSUQgaG1xZXJyb3I7Ci0gIFJFQ1RMIHJlY3RsOwotICBTRExfU3VyZmFjZSAqcFJlc3VsdDsKLQotICAvLyBJZiB0aGVyZSBpcyBubyBtb3JlIHdpbmRvdywgbm90aGluZyB3ZSBjYW4gZG8hCi0gIGlmIChfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMhPTEpIHJldHVybiBOVUxMOwotCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IFJlcXVlc3QgZm9yICVkeCVkIEAgJWRCUFAsIGZsYWdzPTB4JXhcbiIsIHdpZHRoLCBoZWlnaHQsIGJwcCwgZmxhZ3MpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotCi0gIC8vIFdlIGRvbid0IHN1cHBvcnQgcGFsZXR0ZSBtb2RlcyEKLSAgaWYgKGJwcD09OCkgYnBwPTMyOwotCi0gIC8vIEFsc28sIHdlIGRvbid0IHN1cHBvcnQgcmVzaXphYmxlIG1vZGVzIGluIGZ1bGxzY3JlZW4gbW9kZS4KLSAgaWYgKGZsYWdzICYgU0RMX1JFU0laQUJMRSkKLSAgICBmbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0KLSAgLy8gTm8gZG91YmxlIGJ1ZmZlcmVkIG1vZGUKLSAgaWYgKGZsYWdzICYgU0RMX0RPVUJMRUJVRikKLSAgICBmbGFncyAmPSB+U0RMX0RPVUJMRUJVRjsKLQotICAvLyBBbmQsIHdlIGRvbid0IHN1cHBvcnQgSFdTVVJGQUNFIHlldC4KLSAgaWYgKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkKLSAgewotICAgIGZsYWdzICY9IH5TRExfSFdTVVJGQUNFOwotICAgIGZsYWdzIHw9IFNETF9TV1NVUkZBQ0U7Ci0gIH0KLQotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBDaGFuZ2VkIHJlcXVlc3QgdG8gJWR4JWQgQCAlZEJQUCwgZmxhZ3M9MHgleFxuIiwgd2lkdGgsIGhlaWdodCwgYnBwLCBmbGFncyk7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgc3VjaCBhIHZpZGVvIG1vZGUgdGhleSB3YW50IQotICBwTW9kZUluZm9Gb3VuZCA9IE5VTEw7Ci0KLSAgLy8gRm9yIGZ1bGxzY3JlZW4gbW9kZSB3ZSBkb24ndCBzdXBwb3J0IGV2ZXJ5IHJlc29sdXRpb24hCi0gIC8vIFNvLCBnbyB0aHJvdWdoIHRoZSB2aWRlbyBtb2RlcywgYW5kIGNoZWNrIGZvciBzdWNoIGEgcmVzb2x1dGlvbiEKLSAgcE1vZGVJbmZvRm91bmQgPSBOVUxMOwotICBwTW9kZUluZm8gPSBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzOwotCi0gIHdoaWxlIChwTW9kZUluZm8pCi0gIHsKLSAgICAvLyBDaGVjayBhbGwgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZXMgZm9yIHRoaXMgcmVzb2x1dGlvbgotICAgIGlmICgocE1vZGVJbmZvLT51aVhSZXNvbHV0aW9uID09IHdpZHRoKSAmJgotICAgICAgICAocE1vZGVJbmZvLT51aVlSZXNvbHV0aW9uID09IGhlaWdodCkgJiYKLSAgICAgICAgKHBNb2RlSW5mby0+dWlCUFAhPTgpKSAvLyBwYWxldHRpemVkIG1vZGVzIG5vdCB5ZXQgc3VwcG9ydGVkCi0gICAgewotICAgICAgLy8gSWYgZ29vZCByZXNvbHV0aW9uLCB0cnkgdG8gZmluZCB0aGUgZXhhY3QgQlBQLCBvciBhdCBsZWFzdAotICAgICAgLy8gc29tZXRoaW5nIHNpbWlsYXIuLi4KLSAgICAgIGlmICghcE1vZGVJbmZvRm91bmQpCi0gICAgICAgIHBNb2RlSW5mb0ZvdW5kID0gcE1vZGVJbmZvOwotICAgICAgZWxzZQotICAgICAgaWYgKChwTW9kZUluZm9Gb3VuZC0+dWlCUFAhPWJwcCkgJiYKLSAgICAgICAgICAocE1vZGVJbmZvRm91bmQtPnVpQlBQPHBNb2RlSW5mby0+dWlCUFApKQotICAgICAgICBwTW9kZUluZm9Gb3VuZCA9IHBNb2RlSW5mbzsKLSAgICB9Ci0gICAgcE1vZGVJbmZvID0gcE1vZGVJbmZvLT5wTmV4dDsKLSAgfQotCi0gIC8vIElmIHdlIGRpZCBub3QgZmluZCBhIGdvb2QgZnVsbHNjcmVlbiBtb2RlLCB0aGVuIHRyeSBhIHNpbWlsYXIKLSAgaWYgKCFwTW9kZUluZm9Gb3VuZCkKLSAgewotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IFJlcXVlc3RlZCB2aWRlbyBtb2RlIG5vdCBmb3VuZCwgbG9va2luZyBmb3IgYSBzaW1pbGFyIG9uZSFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgIC8vIEdvIHRocm91Z2ggdGhlIHZpZGVvIG1vZGVzIGFnYWluLCBhbmQgZmluZCBhIHNpbWlsYXIgcmVzb2x1dGlvbiEKLSAgICBwTW9kZUluZm8gPSBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzOwotICAgIHdoaWxlIChwTW9kZUluZm8pCi0gICAgewotICAgICAgLy8gQ2hlY2sgYWxsIGF2YWlsYWJsZSBmdWxsc2NyZWVuIG1vZGVzIGZvciB0aGlzIHJlc29sdXRpb24KLSAgICAgIGlmICgocE1vZGVJbmZvLT51aVhSZXNvbHV0aW9uID49IHdpZHRoKSAmJgotICAgICAgICAgIChwTW9kZUluZm8tPnVpWVJlc29sdXRpb24gPj0gaGVpZ2h0KSAmJgotICAgICAgICAgIChwTW9kZUluZm8tPnVpQlBQID09IGJwcCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghcE1vZGVJbmZvRm91bmQpCi0gICAgICAgICAgcE1vZGVJbmZvRm91bmQgPSBwTW9kZUluZm87Ci0gICAgICAgIGVsc2UKLSAgICAgICAgaWYgKCgocE1vZGVJbmZvRm91bmQtPnVpWFJlc29sdXRpb24td2lkdGgpKihwTW9kZUluZm9Gb3VuZC0+dWlZUmVzb2x1dGlvbi1oZWlnaHQpKT4KLSAgICAgICAgICAgICgocE1vZGVJbmZvLT51aVhSZXNvbHV0aW9uLXdpZHRoKSoocE1vZGVJbmZvLT51aVlSZXNvbHV0aW9uLWhlaWdodCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRm91bmQgYSBtb2RlIHdoaWNoIGlzIGNsb3NlciB0aGFuIHRoZSBjdXJyZW50IG9uZQotICAgICAgICAgIHBNb2RlSW5mb0ZvdW5kID0gcE1vZGVJbmZvOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwTW9kZUluZm8gPSBwTW9kZUluZm8tPnBOZXh0OwotICAgIH0KLSAgfQotCi0gIC8vIElmIHdlIGRpZCBub3QgZmluZCBhIGdvb2QgZnVsbHNjcmVlbiBtb2RlLCB0aGVuIHJldHVybiBOVUxMCi0gIGlmICghcE1vZGVJbmZvRm91bmQpCi0gIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBSZXF1ZXN0ZWQgdmlkZW8gbW9kZSBub3QgZm91bmQhXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IEZvdW5kIG1vZGUhXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAvLyBXZSdsbCBwb3NzaWJseSBhZGp1c3QgdGhlIHN0cnVjdHVyZSwgc28gY29weSBvdXQgdGhlIHZhbHVlcwotICAvLyBpbnRvIFRlbXBNb2RlSW5mbyEKLSAgU0RMX21lbWNweSgmVGVtcE1vZGVJbmZvLCBwTW9kZUluZm9Gb3VuZCwgc2l6ZW9mKFRlbXBNb2RlSW5mbykpOwotICBwTW9kZUluZm9Gb3VuZCA9ICZUZW1wTW9kZUluZm87Ci0KLSAgaWYgKGZsYWdzICYgU0RMX1JFU0laQUJMRSkKLSAgewotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IFJlcXVlc3RlZCBtb2RlIGlzIHJlc2l6YWJsZSwgY2hhbmdpbmcgd2lkdGgvaGVpZ2h0XG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAvLyBDaGFuZ2Ugd2lkdGggYW5kIGhlaWdodCB0byByZXF1ZXN0ZWQgb25lIQotICAgIFRlbXBNb2RlSW5mby51aVhSZXNvbHV0aW9uID0gd2lkdGg7Ci0gICAgVGVtcE1vZGVJbmZvLnVpWVJlc29sdXRpb24gPSBoZWlnaHQ7Ci0gICAgVGVtcE1vZGVJbmZvLnVpU2NhbkxpbmVTaXplID0gd2lkdGggKiAoKFRlbXBNb2RlSW5mby51aUJQUCs3KS84KTsKLSAgfQotCi0gIC8vIFdlIGNhbiB0cnkgY3JlYXRlIG5ldyBzdXJmYWNlIQotCi0gIC8vIE1ha2Ugc3VyZSB0aGlzIHRocmVhZCBpcyBwcmVwYXJlZCBmb3IgdXNpbmcgdGhlIFByZXNlbnRhdGlvbiBNYW5hZ2VyIQotICBoYWIgPSBXaW5Jbml0aWFsaXplKDApOwotICBobXEgPSBXaW5DcmVhdGVNc2dRdWV1ZShoYWIsMCk7Ci0gIC8vIFJlbWVtYmVyIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBhdCBXaW5DcmVhdGVNc2dRdWV1ZSgpLCBiZWNhdXNlIHdlIGRvbid0Ci0gIC8vIHdhbnQgdG8gZGVzdHJveSBzb21lYm9keSBlbHNlJ3MgcXVldWUgbGF0ZXIuIDopCi0gIGhtcWVycm9yID0gV2luR2V0TGFzdEVycm9yKGhhYik7Ci0KLSAgCi0KLSAgaWYgKERvc1JlcXVlc3RNdXRleFNlbShfdGhpcy0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyLCBTRU1fSU5ERUZJTklURV9XQUlUKT09Tk9fRVJST1IpCi0gIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBDcmVhdGluZyBuZXcgU1cgc3VyZmFjZVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICAvLyBDcmVhdGUgbmV3IHNvZnR3YXJlIHN1cmZhY2UhCi0gICAgcFJlc3VsdCA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlSW5mb0ZvdW5kLT51aVhSZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9kZUluZm9Gb3VuZC0+dWlZUmVzb2x1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZGVJbmZvRm91bmQtPnVpQlBQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGludCkgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjUmVkTWFzaykgPDwgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjUmVkUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgaW50KSBwTW9kZUluZm9Gb3VuZC0+UGl4ZWxGb3JtYXQudWNHcmVlbk1hc2spIDw8IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0dyZWVuUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgaW50KSBwTW9kZUluZm9Gb3VuZC0+UGl4ZWxGb3JtYXQudWNCbHVlTWFzaykgPDwgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQmx1ZVBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGludCkgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQWxwaGFNYXNrKSA8PCBwTW9kZUluZm9Gb3VuZC0+UGl4ZWxGb3JtYXQudWNBbHBoYVBvc2l0aW9uKTsKLQotICAgIGlmIChwUmVzdWx0ID09IE5VTEwpCi0gICAgewotICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKF90aGlzLT5oaWRkZW4tPmhtdHhVc2VTcmNCdWZmZXIpOwotICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSNpZmRlZiBERUJVR19CVUlMRAotICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBBZGp1c3RpbmcgcGl4ZWwgZm9ybWF0XG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLQotICAgIC8vIEFkanVzdCBwaXhlbCBmb3JtYXQgbWFzayEKLSAgICBwUmVzdWx0LT5mb3JtYXQtPlJtYXNrID0gKCh1bnNpZ25lZCBpbnQpIHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y1JlZE1hc2spIDw8IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y1JlZFBvc2l0aW9uOwotICAgIHBSZXN1bHQtPmZvcm1hdC0+UnNoaWZ0ID0gcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjUmVkUG9zaXRpb247Ci0gICAgcFJlc3VsdC0+Zm9ybWF0LT5SbG9zcyA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y1JlZEFkanVzdDsKLSAgICBwUmVzdWx0LT5mb3JtYXQtPkdtYXNrID0gKCh1bnNpZ25lZCBpbnQpIHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0dyZWVuTWFzaykgPDwgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjR3JlZW5Qb3NpdGlvbjsKLSAgICBwUmVzdWx0LT5mb3JtYXQtPkdzaGlmdCA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0dyZWVuUG9zaXRpb247Ci0gICAgcFJlc3VsdC0+Zm9ybWF0LT5HbG9zcyA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0dyZWVuQWRqdXN0OwotICAgIHBSZXN1bHQtPmZvcm1hdC0+Qm1hc2sgPSAoKHVuc2lnbmVkIGludCkgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQmx1ZU1hc2spIDw8IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0JsdWVQb3NpdGlvbjsKLSAgICBwUmVzdWx0LT5mb3JtYXQtPkJzaGlmdCA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0JsdWVQb3NpdGlvbjsKLSAgICBwUmVzdWx0LT5mb3JtYXQtPkJsb3NzID0gcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQmx1ZUFkanVzdDsKLSAgICBwUmVzdWx0LT5mb3JtYXQtPkFtYXNrID0gKCh1bnNpZ25lZCBpbnQpIHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0FscGhhTWFzaykgPDwgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQWxwaGFQb3NpdGlvbjsKLSAgICBwUmVzdWx0LT5mb3JtYXQtPkFzaGlmdCA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0FscGhhUG9zaXRpb247Ci0gICAgcFJlc3VsdC0+Zm9ybWF0LT5BbG9zcyA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0FscGhhQWRqdXN0OwotCi0jaWZkZWYgUkVQT1JUX0VNUFRZX0FMUEhBX01BU0sKLSAgICBwUmVzdWx0LT5mb3JtYXQtPkFtYXNrID0KLSAgICAgICAgcFJlc3VsdC0+Zm9ybWF0LT5Bc2hpZnQgPQotICAgICAgICBwUmVzdWx0LT5mb3JtYXQtPkFsb3NzID0gMDsKLSNlbmRpZgotCi0gICAgLy8gQWRqdXN0IHN1cmZhY2UgZmxhZ3MKLSAgICBwUmVzdWx0LT5mbGFncyB8PSAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTik7Ci0gICAgcFJlc3VsdC0+ZmxhZ3MgfD0gKGZsYWdzICYgU0RMX1JFU0laQUJMRSk7Ci0KLSAgICAvLyBJdCBtaWdodCBiZSB0aGF0IHRoZSBzb2Z0d2FyZSBzdXJmYWNlIHBpdGNoIGlzIG5vdCB0aGUgc2FtZSBhcwotICAgIC8vIHRoZSBwaXRjaCB3ZSBoYXZlLCBzbyBhZGp1c3QgdGhhdCEKLSAgICBwTW9kZUluZm9Gb3VuZC0+dWlTY2FuTGluZVNpemUgPSBwUmVzdWx0LT5waXRjaDsKLQotICAgIC8vIFN0b3JlIG5ldyBzb3VyY2UgYnVmZmVyIHBhcmFtZXRlcnMhCi0gICAgU0RMX21lbWNweSgmKF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MpLCBwTW9kZUluZm9Gb3VuZCwgc2l6ZW9mKCpwTW9kZUluZm9Gb3VuZCkpOwotICAgIF90aGlzLT5oaWRkZW4tPnBjaFNyY0J1ZmZlciA9IHBSZXN1bHQtPnBpeGVsczsKLQotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IFRlbGxpbmcgRlNMaWIgdGhlIHN0dWZmc1xuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgICAvLyBUZWxsIHRoZSBGU0xpYiB3aW5kb3cgdGhlIG5ldyBzb3VyY2UgaW1hZ2UgZm9ybWF0Ci0gICAgRlNMaWJfU2V0U3JjQnVmZmVyRGVzYyhfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCAmKF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MpKTsKLQotICAgIGlmICgKLSAgICAgICAgKChmbGFncyAmIFNETF9SRVNJWkFCTEUpPT0wKSB8fAotICAgICAgICAoYkZpcnN0Q2FsbCkKLSAgICAgICApCi0gICAgewotICAgICAgYkZpcnN0Q2FsbCA9IDA7Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBNb2RpZnlpbmcgd2luZG93IHNpemVcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotCi0gICAgICAvLyBDYWxjdWxhdGUgZnJhbWUgd2luZG93IHNpemUgZnJvbSBjbGllbnQgd2luZG93IHNpemUKLSAgICAgIHJlY3RsLnhMZWZ0ID0gMDsKLSAgICAgIHJlY3RsLnlCb3R0b20gPSAwOwotICAgICAgcmVjdGwueFJpZ2h0ID0gcE1vZGVJbmZvRm91bmQtPnVpWFJlc29sdXRpb247IC8vIE5vbmluY2x1c2l2ZQotICAgICAgcmVjdGwueVRvcCA9IHBNb2RlSW5mb0ZvdW5kLT51aVlSZXNvbHV0aW9uOyAvLyBOb25pbmNsdXNpdmUKLSAgICAgIFdpbkNhbGNGcmFtZVJlY3QoX3RoaXMtPmhpZGRlbi0+aHduZEZyYW1lLCAmcmVjdGwsIEZBTFNFKTsKLQotICAgICAgLy8gU2V0IHRoZSBuZXcgc2l6ZSBvZiB0aGUgbWFpbiB3aW5kb3cKLSAgICAgIFNldEFjY2Vzc2FibGVXaW5kb3dQb3MoX3RoaXMtPmhpZGRlbi0+aHduZEZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EX1RPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlY3RsLnhSaWdodC1yZWN0bC54TGVmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWN0bC55VG9wLXJlY3RsLnlCb3R0b20pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfU0laRSB8IFNXUF9BQ1RJVkFURSB8IFNXUF9TSE9XKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgZnVsbHNjcmVlbiBtb2RlIGZsYWcsIGFuZCBzd2l0Y2ggdG8gZnVsbHNjcmVlbiBpZiBuZWVkZWQhCi0gICAgaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pCi0gICAgewotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgICBwcmludGYoIltvczJmc2xpYl9TZXRWaWRlb01vZGVdIDogQWxzbyB0cnlpbmcgdG8gc3dpdGNoIHRvIGZ1bGxzY3JlZW5cbiIpOwotICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgIEZTTGliX1RvZ2dsZUZTTW9kZShfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCAxKTsKLSAgICAgIC8qIEN1cnNvciBtYW5hZ2VyIGZ1bmN0aW9ucyB0byBGUyBtb2RlKi8KLSAgICAgIG9zMmZzbGliX1NldEN1cnNvck1hbmFnZW1lbnRGdW5jdGlvbnMoX3RoaXMsIDApOwotICAgIH0gZWxzZQotICAgIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IEFsc28gdHJ5aW5nIHRvIHN3aXRjaCB0byBkZXNrdG9wIG1vZGVcbiIpOwotICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAgIEZTTGliX1RvZ2dsZUZTTW9kZShfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCAwKTsKLSAgICAgIC8qIEN1cnNvciBtYW5hZ2VyIGZ1bmN0aW9ucyB0byBXaW5kb3dlZCBtb2RlKi8KLSAgICAgIG9zMmZzbGliX1NldEN1cnNvck1hbmFnZW1lbnRGdW5jdGlvbnMoX3RoaXMsIDEpOwotICAgIH0KLQotICAgIF90aGlzLT5oaWRkZW4tPnBTRExTdXJmYWNlID0gcFJlc3VsdDsKLQotICAgIERvc1JlbGVhc2VNdXRleFNlbShfdGhpcy0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyKTsKLSAgfSBlbHNlCi0gIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBDb3VsZCBub3QgZ2V0IGhtdHhVc2VTcmNCdWZmZXIhXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICAKLSAgICBwUmVzdWx0ID0gTlVMTDsKLSAgfQotCi0gIC8vIEFzIHdlIGhhdmUgdGhlIG5ldyBzdXJmYWNlLCB3ZSBkb24ndCBuZWVkIHRoZSBjdXJyZW50IG9uZSBhbnltb3JlIQotICBpZiAoKHBSZXN1bHQpICYmIChjdXJyZW50KSkKLSAgewotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IEZyZWVpbmcgb2xkIHN1cmZhY2VcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgIFNETF9GcmVlU3VyZmFjZShjdXJyZW50KTsKLSAgfQotCi0gIC8vIFJlZHJhdyB3aW5kb3cKLSAgV2luSW52YWxpZGF0ZVJlZ2lvbihfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCBOVUxMLCBUUlVFKTsKLQotICAvLyBOb3cgZGVzdHJveSB0aGUgbWVzc2FnZSBxdWV1ZSwgaWYgd2UndmUgY3JlYXRlZCBpdCEKLSAgaWYgKEVSUk9SSURFUlJPUihobXFlcnJvcik9PTApCi0gIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBEZXN0cm95aW5nIG1lc3NhZ2UgcXVldWVcbiIpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOwotICB9Ci0KLSNpZmRlZiBERUJVR19CVUlMRAotICBwcmludGYoIltvczJmc2xpYl9TZXRWaWRlb01vZGVdIDogRG9uZVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgLyogV2UncmUgZG9uZSAqLwotCi0gIC8vIFJldHVybiB3aXRoIHRoZSBuZXcgc3VyZmFjZSEKLSAgcmV0dXJuIHBSZXN1bHQ7Ci19Ci0KLS8qIExpc3QgdGhlIGF2YWlsYWJsZSB2aWRlbyBtb2RlcyBmb3IgdGhlIGdpdmVuIHBpeGVsIGZvcm1hdCwgc29ydGVkCi0gZnJvbSBsYXJnZXN0IHRvIHNtYWxsZXN0LgotICovCi1zdGF0aWMgU0RMX1JlY3QgKipvczJmc2xpYl9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCi17Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgcHJpbnRmKCJbb3MyZnNsaWJfTGlzdE1vZGVzXSA6IExpc3RNb2RlcyBvZiAlZCBCcHBcbiIsIGZvcm1hdC0+Qml0c1BlclBpeGVsKTsKLSNlbmRpZgotICAvLyBEZXN0cm95IHJlc3VsdCBvZiBwcmV2aW91cyBjYWxsLCBpZiB0aGVyZSBpcyBhbnkKLSAgaWYgKF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQpCi0gIHsKLSAgICBTRExfZnJlZShfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0KTsgX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdCA9IE5VTEw7Ci0gIH0KLQotICAvLyBGb3IgcmVzaXphYmxlIGFuZCB3aW5kb3dlZCBtb2RlIHdlIHN1cHBvcnQgZXZlcnkgcmVzb2x1dGlvbiEKLSAgaWYgKChmbGFncyAmIFNETF9SRVNJWkFCTEUpICYmICgoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gMCkpCi0gICAgcmV0dXJuIChTRExfUmVjdCAqKiktMTsKLQotICAvLyBDaGVjayBpZiB0aGV5IG5lZWQgZnVsbHNjcmVlbiBvciBub24tZnVsbHNjcmVlbiB2aWRlbyBtb2RlcyEKLSAgaWYgKChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSAwKQotCi0gIHsKLSAgICAvLyBGb3Igd2luZG93ZWQgbW9kZSB3ZSBzdXBwb3J0IGV2ZXJ5IHJlc29sdXRpb24hCi0gICAgcmV0dXJuIChTRExfUmVjdCAqKiktMTsKLSAgfSBlbHNlCi0gIHsKLSAgICBGU0xpYl9WaWRlb01vZGVfcCBwRlNNb2RlOwotICAgIC8vIEZvciBmdWxsc2NyZWVuIG1vZGUgd2UgZG9uJ3Qgc3VwcG9ydCBldmVyeSByZXNvbHV0aW9uIQotICAgIC8vIE5vdyBjcmVhdGUgYSBuZXcgbGlzdAotICAgIHBGU01vZGUgPSBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzOwotICAgIHdoaWxlIChwRlNNb2RlKQotICAgIHsKLSAgICAgIGlmIChwRlNNb2RlLT51aUJQUCA9PSBmb3JtYXQtPkJpdHNQZXJQaXhlbCkKLSAgICAgIHsKLSAgICAgICAgU0RMX1JlY3QgKnBSZWN0ID0gKFNETF9SZWN0ICopIFNETF9tYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7Ci0gICAgICAgIGlmIChwUmVjdCkKLSAgICAgICAgewotICAgICAgICAgIC8vIEZpbGwgZGVzY3JpcHRpb24KLSAgICAgICAgICBwUmVjdC0+eCA9IDA7Ci0gICAgICAgICAgcFJlY3QtPnkgPSAwOwotICAgICAgICAgIHBSZWN0LT53ID0gcEZTTW9kZS0+dWlYUmVzb2x1dGlvbjsKLSAgICAgICAgICBwUmVjdC0+aCA9IHBGU01vZGUtPnVpWVJlc29sdXRpb247Ci0jaWZkZWYgREVCVUdfQlVJTEQKLS8vICAgICAgICAgIHByaW50ZigiISEhIFNlZW1zIHRvIGJlIGdvb2QhXG4iKTsKLS8vICAgICAgICBwcmludGYoIkY6ICVkeCVkXG4iLCBwUmVjdC0+dywgcFJlY3QtPmgpOwotI2VuZGlmCi0gICAgICAgICAgLy8gQW5kIGluc2VydCBpbnRvIGxpc3Qgb2YgcFJlY3RzCi0gICAgICAgICAgaWYgKCEoX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdCkpCi0gICAgICAgICAgewotI2lmZGVmIERFQlVHX0JVSUxECi0vLyAgICAgICAgICAgIHByaW50ZigiISEhIEluc2VydGluZyB0byBiZWdpbm5pbmdcbiIpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIC8vIFdlJ3JlIHRoZSBmaXJzdCBvbmUgdG8gYmUgaW5zZXJ0ZWQhCi0gICAgICAgICAgICBfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0ID0gKFNETF9SZWN0KiopIFNETF9tYWxsb2MoMipzaXplb2YoU0RMX1JlY3QqKSk7Ci0gICAgICAgICAgICBpZiAoX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdFswXSA9IHBSZWN0OwotICAgICAgICAgICAgICBfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0WzFdID0gTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTRExfZnJlZShwUmVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2UncmUgbm90IHRoZSBmaXJzdCBvbmVzLCBzbyBmaW5kIHRoZSBwbGFjZSB3aGVyZSB3ZQotICAgICAgICAgICAgLy8gaGF2ZSB0byBpbnNlcnQgb3Vyc2VsdmVzCi0gICAgICAgICAgICBTRExfUmVjdCAqKnBOZXdMaXN0OwotICAgICAgICAgICAgaW50IGlQbGFjZSwgaU51bU9mU2xvdHMsIGk7Ci0KLSNpZmRlZiBERUJVR19CVUlMRAotLy8gICAgICAgICAgICBwcmludGYoIiEhISBTZWFyY2hpbmcgd2hlcmUgdG8gaW5zZXJ0XG4iKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBpUGxhY2UgPSAtMTsgaU51bU9mU2xvdHMgPSAxOyAvLyBDb3VudCB0aGUgbGFzdCBOVUxMIHRvbyEKLSAgICAgICAgICAgIGZvciAoaT0wOyBfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0W2ldOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlOdW1PZlNsb3RzKys7Ci0gICAgICAgICAgICAgIGlmIChpUGxhY2U9PS0xKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0W2ldLT53Kl90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHRbaV0tPmgpPAotICAgICAgICAgICAgICAgICAgICAocFJlY3QtPncqcFJlY3QtPmgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlQbGFjZSA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaVBsYWNlPT0tMSkgaVBsYWNlID0gaU51bU9mU2xvdHMtMTsKLQotI2lmZGVmIERFQlVHX0JVSUxECi0vLyAgICAgICAgICAgIHByaW50ZigiISEhIEZyb20gJWQgc2xvdHMsIGl0IHdpbGwgYmUgYXQgJWRcbiIsIGlOdW1PZlNsb3RzLCBpUGxhY2UpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHBOZXdMaXN0ID0gKFNETF9SZWN0KiopIFNETF9yZWFsbG9jKF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQsIChpTnVtT2ZTbG90cysxKSpzaXplb2YoU0RMX1JlY3QqKSk7Ci0gICAgICAgICAgICBpZiAocE5ld0xpc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZvciAoaT1pTnVtT2ZTbG90cztpPmlQbGFjZTtpLS0pCi0gICAgICAgICAgICAgICAgcE5ld0xpc3RbaV0gPSBwTmV3TGlzdFtpLTFdOwotICAgICAgICAgICAgICBwTmV3TGlzdFtpUGxhY2VdID0gcFJlY3Q7Ci0gICAgICAgICAgICAgIF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQgPSBwTmV3TGlzdDsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTRExfZnJlZShwUmVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwRlNNb2RlID0gcEZTTW9kZS0+cE5leHQ7Ci0gICAgfQotICB9Ci0jaWZkZWYgREVCVUdfQlVJTEQKLS8vICBwcmludGYoIlJldHVybmluZyBsaXN0XG4iKTsKLSNlbmRpZgotICByZXR1cm4gX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdDsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSwgZmlsbGluZyAndmZvcm1hdCcgd2l0aCB0aGUKLSAiYmVzdCIgZGlzcGxheSBwaXhlbCBmb3JtYXQsIHJldHVybmluZyAwIG9yIC0xIGlmIHRoZXJlJ3MgYW4gZXJyb3IuCi0gKi8KLXN0YXRpYyBpbnQgb3MyZnNsaWJfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCi17Ci0gIEZTTGliX1ZpZGVvTW9kZV9wIHBEZXNrdG9wTW9kZTsKLQotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW29zMmZzbGliX1ZpZGVvSW5pdF0gOiBFbnRlclxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgLy8gUmVwb3J0IHRoZSBiZXN0IHBpeGVsIGZvcm1hdC4gRm9yIHRoaXMsCi0gIC8vIHdlJ2xsIHVzZSB0aGUgY3VycmVudCBkZXNrdG9wIGZvcm1hdC4KLSAgcERlc2t0b3BNb2RlID0gRlNMaWJfR2V0RGVza3RvcFZpZGVvTW9kZSgpOwotICBpZiAoIXBEZXNrdG9wTW9kZSkKLSAgewotICAgIFNETF9TZXRFcnJvcigiQ291bGQgbm90IHF1ZXJ5IGRlc2t0b3AgdmlkZW8gbW9kZSEiKTsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvSW5pdF0gOiBDb3VsZCBub3QgcXVlcnkgZGVza3RvcCB2aWRlbyBtb2RlIVxuIik7Ci0jZW5kaWYKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUgKi8KLSAgX3RoaXMtPmluZm8uY3VycmVudF93ID0gcERlc2t0b3BNb2RlLT51aVhSZXNvbHV0aW9uOwotICBfdGhpcy0+aW5mby5jdXJyZW50X2ggPSBwRGVza3RvcE1vZGUtPnVpWVJlc29sdXRpb247Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBzY3JlZW4gZGVwdGggKi8KLSAgdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gcERlc2t0b3BNb2RlLT51aUJQUDsKLSAgdmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9ICh2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwrNykvODsKLQotICB2Zm9ybWF0LT5SbWFzayA9ICgodW5zaWduZWQgaW50KSBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjUmVkTWFzaykgPDwgcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y1JlZFBvc2l0aW9uOwotICB2Zm9ybWF0LT5Sc2hpZnQgPSBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjUmVkUG9zaXRpb247Ci0gIHZmb3JtYXQtPlJsb3NzID0gcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y1JlZEFkanVzdDsKLSAgdmZvcm1hdC0+R21hc2sgPSAoKHVuc2lnbmVkIGludCkgcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0dyZWVuTWFzaykgPDwgcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0dyZWVuUG9zaXRpb247Ci0gIHZmb3JtYXQtPkdzaGlmdCA9IHBEZXNrdG9wTW9kZS0+UGl4ZWxGb3JtYXQudWNHcmVlblBvc2l0aW9uOwotICB2Zm9ybWF0LT5HbG9zcyA9IHBEZXNrdG9wTW9kZS0+UGl4ZWxGb3JtYXQudWNHcmVlbkFkanVzdDsKLSAgdmZvcm1hdC0+Qm1hc2sgPSAoKHVuc2lnbmVkIGludCkgcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0JsdWVNYXNrKSA8PCBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjQmx1ZVBvc2l0aW9uOwotICB2Zm9ybWF0LT5Cc2hpZnQgPSBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjQmx1ZVBvc2l0aW9uOwotICB2Zm9ybWF0LT5CbG9zcyA9IHBEZXNrdG9wTW9kZS0+UGl4ZWxGb3JtYXQudWNCbHVlQWRqdXN0OwotICB2Zm9ybWF0LT5BbWFzayA9ICgodW5zaWduZWQgaW50KSBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjQWxwaGFNYXNrKSA8PCBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjQWxwaGFQb3NpdGlvbjsKLSAgdmZvcm1hdC0+QXNoaWZ0ID0gcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0FscGhhUG9zaXRpb247Ci0gIHZmb3JtYXQtPkFsb3NzID0gcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0FscGhhQWRqdXN0OwotCi0jaWZkZWYgUkVQT1JUX0VNUFRZX0FMUEhBX01BU0sKLSAgdmZvcm1hdC0+QW1hc2sgPQotICAgICAgdmZvcm1hdC0+QXNoaWZ0ID0KLSAgICAgIHZmb3JtYXQtPkFsb3NzID0gMDsKLSNlbmRpZgotCi0gIC8vIEZpbGwgaW4gc29tZSB3aW5kb3cgbWFuYWdlciBjYXBhYmlsaXRpZXMKLSAgX3RoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMTsKLQotICAvLyBJbml0aWFsaXplIHNvbWUgaW50ZXJuYWwgdmFyaWFibGVzCi0gIF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQgPSBOVUxMOwotICBfdGhpcy0+aGlkZGVuLT5mSW5Gb2N1cyA9IDA7Ci0gIF90aGlzLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUgPSAwOwotICBfdGhpcy0+aGlkZGVuLT5pTW91c2VWaXNpYmxlID0gMTsKLQotICBpZiAoZ2V0ZW52KCJTRExfVVNFX1BST1BPUlRJT05BTF9XSU5ET1ciKSkKLSAgICBfdGhpcy0+aGlkZGVuLT5iUHJvcG9ydGlvbmFsUmVzaXplID0gMTsKLSAgZWxzZQotICB7Ci0gICAgUFBJQiBwaWI7Ci0gICAgUFRJQiB0aWI7Ci0gICAgY2hhciAqcGNoRmlsZU5hbWUsICpwY2hUZW1wOwotICAgIGNoYXIgYWNoQ29uZmlnRmlsZVtDQ0hNQVhQQVRIXTsKLSAgICBGSUxFICpoRmlsZTsKLQotICAgIC8qIE5vIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGhhdmUgcHJvcG9ydGlvbmFsIHdpbmRvdy4KLSAgICAgKiBPaywgbGV0J3MgY2hlY2sgaWYgdGhpcyBleGVjdXRhYmxlIGlzIGluIGNvbmZpZyBmaWxlIQotICAgICAqLwotICAgIF90aGlzLT5oaWRkZW4tPmJQcm9wb3J0aW9uYWxSZXNpemUgPSAwOwotCi0gICAgRG9zR2V0SW5mb0Jsb2NrcygmdGliLCAmcGliKTsKLSAgICBwY2hUZW1wID0gcGNoRmlsZU5hbWUgPSBwaWItPnBpYl9wY2hjbWQ7Ci0gICAgd2hpbGUgKCpwY2hUZW1wKQotICAgIHsKLSAgICAgIGlmICgqcGNoVGVtcD09J1xcJykKLSAgICAgICAgcGNoRmlsZU5hbWUgPSBwY2hUZW1wKzE7Ci0gICAgICBwY2hUZW1wKys7Ci0gICAgfQotICAgIGlmIChnZXRlbnYoIkhPTUUiKSkKLSAgICB7Ci0gICAgICBzcHJpbnRmKGFjaENvbmZpZ0ZpbGUsICIlc1xcLnNkbC5wcm9wb3J0aW9uYWxzIiwgZ2V0ZW52KCJIT01FIikpOwotICAgICAgaEZpbGUgPSBmb3BlbihhY2hDb25maWdGaWxlLCAicnQiKTsKLSAgICAgIGlmICghaEZpbGUpCi0gICAgICB7Ci0gICAgICAgIC8qIFNlZW1zIGxpa2UgdGhlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCBvciBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICogTGV0J3MgdHJ5IHRvIGNyZWF0ZSBpdCB3aXRoIGRlZmF1bHRzIQotICAgICAgICAgKi8KLSAgICAgICAgaEZpbGUgPSBmb3BlbihhY2hDb25maWdGaWxlLCAid3QiKTsKLSAgICAgICAgaWYgKGhGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgZnByaW50ZihoRmlsZSwgIjsgVGhpcyBmaWxlIGlzIGEgY29uZmlnIGZpbGUgb2YgU0RMLzIsIGNvbnRhaW5pbmdcbiIpOwotICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7IHRoZSBsaXN0IG9mIGV4ZWN1dGFibGVzIHRoYXQgbXVzdCBoYXZlIHByb3BvcnRpb25hbFxuIik7Ci0gICAgICAgICAgZnByaW50ZihoRmlsZSwgIjsgd2luZG93cy5cbiIpOwotICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7XG4iKTsKLSAgICAgICAgICBmcHJpbnRmKGhGaWxlLCAiOyBZb3UgY2FuIGFkZCBleGVjdXRhYmxlIGZpbGVuYW1lcyBpbnRvIHRoaXMgZmlsZSxcbiIpOwotICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7IG9uZSB1bmRlciB0aGUgb3RoZXIuIElmIFNETCBmaW5kcyB0aGF0IGEgZ2l2ZW5cbiIpOwotICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7IHByb2dyYW0gaXMgaW4gdGhpcyBsaXN0LCB0aGVuIHRoYXQgYXBwbGljYXRpb25cbiIpOwotICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7IHdpbGwgaGF2ZSBwcm9wb3J0aW9uYWwgd2luZG93cywganVzdCBsaWtlIGlmXG4iKTsKLSAgICAgICAgICBmcHJpbnRmKGhGaWxlLCAiOyB0aGUgU0VUIFNETF9VU0VfUFJPUE9SVElPTkFMX1dJTkRPVyBlbnYuIHZhcmlhYmxlXG4iKTsKLSAgICAgICAgICBmcHJpbnRmKGhGaWxlLCAiOyB3b3VsZCBoYXZlIGJlZW4gc2V0IGZvciB0aGF0IHByb2Nlc3MuXG4iKTsKLSAgICAgICAgICBmcHJpbnRmKGhGaWxlLCAiO1xuIik7Ci0gICAgICAgICAgZnByaW50ZihoRmlsZSwgIlxuIik7Ci0gICAgICAgICAgZnByaW50ZihoRmlsZSwgImRvc2JveC5leGVcbiIpOwotICAgICAgICAgIGZjbG9zZShoRmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBoRmlsZSA9IGZvcGVuKGFjaENvbmZpZ0ZpbGUsICJydCIpOwotICAgICAgfQotCi0gICAgICBpZiAoaEZpbGUpCi0gICAgICB7Ci0gICAgICAgIHdoaWxlIChmZ2V0cyhhY2hDb25maWdGaWxlLCBzaXplb2YoYWNoQ29uZmlnRmlsZSksIGhGaWxlKSkKLSAgICAgICAgewotICAgICAgICAgIC8qIEN1dCBcbiBmcm9tIGVuZCBvZiBzdHJpbmcgKi8KLQotICAgICAgICAgIHdoaWxlIChhY2hDb25maWdGaWxlW3N0cmxlbihhY2hDb25maWdGaWxlKS0xXSA9PSAnXG4nKQotICAgICAgICAgICAgYWNoQ29uZmlnRmlsZVtzdHJsZW4oYWNoQ29uZmlnRmlsZSktMV0gPSAwOwotCi0gICAgICAgICAgLyogQ29tcGFyZS4uLiAqLwotICAgICAgICAgIGlmIChzdHJpY21wKGFjaENvbmZpZ0ZpbGUsIHBjaEZpbGVOYW1lKT09MCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGb3VuZCBpdCBpbiBjb25maWcgZmlsZSEgKi8KLSAgICAgICAgICAgIF90aGlzLT5oaWRkZW4tPmJQcm9wb3J0aW9uYWxSZXNpemUgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShoRmlsZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwgJihfdGhpcy0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyKSwgMCwgRkFMU0UpOwotCi0gIC8vIE5vdyBjcmVhdGUgb3VyIHdpbmRvdyB3aXRoIGEgZGVmYXVsdCBzaXplCi0KLSAgLy8gRm9yIHRoaXMsIHdlIHNlbGVjdCB0aGUgZmlyc3QgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZSBhcwotICAvLyBjdXJyZW50IHdpbmRvdyBzaXplIQotICBTRExfbWVtY3B5KCYoX3RoaXMtPmhpZGRlbi0+U3JjQnVmZmVyRGVzYyksIF90aGlzLT5oaWRkZW4tPnBBdmFpbGFibGVGU0xpYlZpZGVvTW9kZXMsIHNpemVvZihfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjKSk7Ci0gIC8vIEFsbG9jYXRlIG5ldyB2aWRlbyBidWZmZXIhCi0gIF90aGlzLT5oaWRkZW4tPnBjaFNyY0J1ZmZlciA9IChjaGFyICopIFNETF9tYWxsb2MoX3RoaXMtPmhpZGRlbi0+cEF2YWlsYWJsZUZTTGliVmlkZW9Nb2Rlcy0+dWlTY2FuTGluZVNpemUgKiBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzLT51aVlSZXNvbHV0aW9uKTsKLSAgaWYgKCFfdGhpcy0+aGlkZGVuLT5wY2hTcmNCdWZmZXIpCi0gIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvSW5pdF0gOiBZaWtlcywgbm90IGVub3VnaCBtZW1vcnkgZm9yIG5ldyB2aWRlbyBidWZmZXIhXG4iKTsgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKLSAgICBTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBuZXcgdmlkZW8gYnVmZmVyIVxuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gRm9yIHRoaXMsIHdlIG5lZWQgYSBtZXNzYWdlIHByb2Nlc3NpbmcgdGhyZWFkLgotICAvLyBXZSdsbCBjcmVhdGUgYSBuZXcgdGhyZWFkIGZvciB0aGlzLCB3aGljaCB3aWxsIGRvIGV2ZXJ5dGhpbmcKLSAgLy8gd2hhdCBpcyByZWxhdGVkIHRvIFBNCi0gIF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyA9IDA7Ci0gIF90aGlzLT5oaWRkZW4tPnRpZFBNVGhyZWFkID0gX2JlZ2ludGhyZWFkKFBNVGhyZWFkRnVuYywgTlVMTCwgNjU1MzYsICh2b2lkICopIF90aGlzKTsKLSAgaWYgKF90aGlzLT5oaWRkZW4tPnRpZFBNVGhyZWFkIDw9IDApCi0gIHsKLSNpZmRlZiBERUJVR19CVUlMRAotICAgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvSW5pdF0gOiBDb3VsZCBub3QgY3JlYXRlIFBNIHRocmVhZCFcbiIpOwotI2VuZGlmCi0gICAgU0RMX1NldEVycm9yKCJDb3VsZCBub3QgY3JlYXRlIFBNIHRocmVhZCIpOwotICAgIHJldHVybiAtMTsKLSAgfQotI2lmZGVmIFVTRV9ET1NTRVRQUklPUklUWQotICAvLyBCdXJzdCB0aGUgcHJpb3JpdHkgb2YgUE0gVGhyZWFkIQotICBEb3NTZXRQcmlvcml0eShQUlRZU19USFJFQUQsIFBSVFlDX1RJTUVDUklUSUNBTCwgMCwgX3RoaXMtPmhpZGRlbi0+dGlkUE1UaHJlYWQpOwotI2VuZGlmCi0gIC8vIFdhaXQgZm9yIHRoZSBQTSB0aHJlYWQgdG8gaW5pdGlhbGl6ZSEKLSAgd2hpbGUgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cz09MCkKLSAgICBEb3NTbGVlcCgzMik7Ci0gIC8vIElmIHRoZSBQTSB0aHJlYWQgY291bGQgbm90IHNldCB1cCBldmVyeXRoaW5nLCB0aGVuCi0gIC8vIHJlcG9ydCBhbiBlcnJvciEKLSAgaWYgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyE9MSkKLSAgewotI2lmZGVmIERFQlVHX0JVSUxECi0gICAgcHJpbnRmKCJbb3MyZnNsaWJfVmlkZW9Jbml0XSA6IFBNVGhyZWFkIHJlcG9ydGVkIGFuIGVycm9yIDogJWRcbiIsIF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyk7Ci0jZW5kaWYKLSAgICBTRExfU2V0RXJyb3IoIkVycm9yIGluaXRpYWxpemluZyBQTSB0aHJlYWQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBvczJmc2xpYl9EZWxldGVEZXZpY2UoX1RISVMpCi17Ci0jaWZkZWYgREVCVUdfQlVJTEQKLSAgcHJpbnRmKCJbb3MyZnNsaWJfRGVsZXRlRGV2aWNlXVxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0gIC8vIEZyZWUgdXNlZCBtZW1vcnkKLSAgRlNMaWJfRnJlZVZpZGVvTW9kZUxpc3QoX3RoaXMtPmhpZGRlbi0+cEF2YWlsYWJsZUZTTGliVmlkZW9Nb2Rlcyk7Ci0gIGlmIChfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0KQotICAgIFNETF9mcmVlKF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQpOwotICBpZiAoX3RoaXMtPmhpZGRlbi0+cGNoU3JjQnVmZmVyKQotICAgIFNETF9mcmVlKF90aGlzLT5oaWRkZW4tPnBjaFNyY0J1ZmZlcik7Ci0gIERvc0Nsb3NlTXV0ZXhTZW0oX3RoaXMtPmhpZGRlbi0+aG10eFVzZVNyY0J1ZmZlcik7Ci0gIFNETF9mcmVlKF90aGlzLT5oaWRkZW4pOwotICBTRExfZnJlZShfdGhpcyk7Ci0gIEZTTGliX1VuaW5pdGlhbGl6ZSgpOwotfQotCi1zdGF0aWMgaW50IG9zMmZzbGliX0F2YWlsYWJsZSh2b2lkKQotewotCi0gIC8vIElmIHdlIGNhbiBydW4sIGl0IG1lYW5zIHRoYXQgd2UgY291bGQgbG9hZCBGU0xpYiwKLSAgLy8gc28gd2UgYXNzdW1lIHRoYXQgaXQncyBhdmFpbGFibGUgdGhlbiEKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIG9zMmZzbGliX01vcnBoVG9QTSgpCi17Ci0gIFBQSUIgcGliOwotICBQVElCIHRpYjsKLQotICBEb3NHZXRJbmZvQmxvY2tzKCZ0aWIsICZwaWIpOwotCi0gIC8vIENoYW5nZSBmbGFnIGZyb20gVklPIHRvIFBNOgotICBpZiAocGliLT5waWJfdWx0eXBlPT0yKSBwaWItPnBpYl91bHR5cGUgPSAzOwotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpvczJmc2xpYl9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotICBTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKLQotI2lmZGVmIERFQlVHX0JVSUxECi0gIHByaW50ZigiW29zMmZzbGliX0NyZWF0ZURldmljZV0gOiBFbnRlclxuIik7IGZmbHVzaChzdGRvdXQpOwotI2VuZGlmCi0KLSAgLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLSAgZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotICBpZiAoIGRldmljZSApCi0gIHsKLSAgICBTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7Ci0gICAgLy8gQWxzbyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHByaXZhdGUgZGF0YQotICAgIGRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKSBTRExfbWFsbG9jKChzaXplb2Yoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhKSkpOwotICB9Ci0gIGlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKQotICB7Ci0gICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgaWYgKCBkZXZpY2UgKQotICAgICAgU0RMX2ZyZWUoZGV2aWNlKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCi0gIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSNpZmRlZiBERUJVR19CVUlMRAotICBwcmludGYoIltvczJmc2xpYl9DcmVhdGVEZXZpY2VdIDogVmlkZW9Jbml0IGlzICVwXG4iLCBvczJmc2xpYl9WaWRlb0luaXQpOyBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgotCi0gIC8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotICBkZXZpY2UtPlZpZGVvSW5pdCA9IG9zMmZzbGliX1ZpZGVvSW5pdDsKLSAgZGV2aWNlLT5MaXN0TW9kZXMgPSBvczJmc2xpYl9MaXN0TW9kZXM7Ci0gIGRldmljZS0+U2V0VmlkZW9Nb2RlID0gb3MyZnNsaWJfU2V0VmlkZW9Nb2RlOwotICBkZXZpY2UtPlRvZ2dsZUZ1bGxTY3JlZW4gPSBvczJmc2xpYl9Ub2dnbGVGdWxsU2NyZWVuOwotICBkZXZpY2UtPlVwZGF0ZU1vdXNlID0gb3MyZnNsaWJfVXBkYXRlTW91c2U7Ci0gIGRldmljZS0+Q3JlYXRlWVVWT3ZlcmxheSA9IE5VTEw7Ci0gIGRldmljZS0+U2V0Q29sb3JzID0gb3MyZnNsaWJfU2V0Q29sb3JzOwotICBkZXZpY2UtPlVwZGF0ZVJlY3RzID0gb3MyZnNsaWJfVXBkYXRlUmVjdHM7Ci0gIGRldmljZS0+VmlkZW9RdWl0ID0gb3MyZnNsaWJfVmlkZW9RdWl0OwotICAvKiBIYXJkd2FyZSBhY2NlbGVyYXRpb24gZnVuY3Rpb25zICovCi0gIGRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBvczJmc2xpYl9BbGxvY0hXU3VyZmFjZTsKLSAgZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7Ci0gIGRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7Ci0gIGRldmljZS0+U2V0SFdDb2xvcktleSA9IE5VTEw7Ci0gIGRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7Ci0gIGRldmljZS0+TG9ja0hXU3VyZmFjZSA9IG9zMmZzbGliX0xvY2tIV1N1cmZhY2U7Ci0gIGRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gb3MyZnNsaWJfVW5sb2NrSFdTdXJmYWNlOwotICBkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOwotICBkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBvczJmc2xpYl9GcmVlSFdTdXJmYWNlOwotICAvKiBXaW5kb3cgbWFuYWdlciBmdW5jdGlvbnMgKi8KLSAgZGV2aWNlLT5TZXRDYXB0aW9uID0gb3MyZnNsaWJfU2V0Q2FwdGlvbjsKLSAgZGV2aWNlLT5TZXRJY29uID0gb3MyZnNsaWJfU2V0SWNvbjsKLSAgZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gb3MyZnNsaWJfSWNvbmlmeVdpbmRvdzsKLSAgZGV2aWNlLT5HcmFiSW5wdXQgPSBvczJmc2xpYl9HcmFiSW5wdXQ7Ci0gIGRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKLSAgLyogQ3Vyc29yIG1hbmFnZXIgZnVuY3Rpb25zIHRvIFdpbmRvd2VkIG1vZGUqLwotICBvczJmc2xpYl9TZXRDdXJzb3JNYW5hZ2VtZW50RnVuY3Rpb25zKGRldmljZSwgMSk7Ci0gIC8qIEV2ZW50IG1hbmFnZXIgZnVuY3Rpb25zICovCi0gIGRldmljZS0+SW5pdE9TS2V5bWFwID0gb3MyZnNsaWJfSW5pdE9TS2V5bWFwOwotICBkZXZpY2UtPlB1bXBFdmVudHMgPSBvczJmc2xpYl9QdW1wRXZlbnRzOwotICAvKiBUaGUgZnVuY3Rpb24gdXNlZCB0byBkaXNwb3NlIG9mIHRoaXMgc3RydWN0dXJlICovCi0gIGRldmljZS0+ZnJlZSA9IG9zMmZzbGliX0RlbGV0ZURldmljZTsKLQotICAvLyBNYWtlIHN1cmUgd2UnbGwgYmUgYWJsZSB0byB1c2UgV2luKiBBUEkgZXZlbiBpZiB0aGUgYXBwbGljYXRpb24KLSAgLy8gd2FzIGxpbmtlZCB0byBiZSBhIFZJTyBhcHBsaWNhdGlvbiEKLSAgb3MyZnNsaWJfTW9ycGhUb1BNKCk7Ci0KLSAgLy8gTm93IGluaXRpYWxpemUgRlNMaWIsIGFuZCBxdWVyeSBhdmFpbGFibGUgdmlkZW8gbW9kZXMhCi0gIGlmICghRlNMaWJfSW5pdGlhbGl6ZSgpKQotICB7Ci0gICAgLy8gQ291bGQgbm90IGluaXRpYWxpemUgRlNMaWIhCi0jaWZkZWYgREVCVUdfQlVJTEQKLSAgICBwcmludGYoIltvczJmc2xpYl9DcmVhdGVEZXZpY2VdIDogQ291bGQgbm90IGluaXRpYWxpemUgRlNMaWIhXG4iKTsKLSNlbmRpZgotICAgIFNETF9TZXRFcnJvcigiQ291bGQgbm90IGluaXRpYWxpemUgRlNMaWIhIik7Ci0gICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotICAgIFNETF9mcmVlKGRldmljZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZGV2aWNlLT5oaWRkZW4tPnBBdmFpbGFibGVGU0xpYlZpZGVvTW9kZXMgPQotICAgIEZTTGliX0dldFZpZGVvTW9kZUxpc3QoKTsKLQotICByZXR1cm4gZGV2aWNlOwotfQotCi1WaWRlb0Jvb3RTdHJhcCBPUzJGU0xpYl9ib290c3RyYXAgPSB7Ci0gICAgICAgICJvczJmc2xpYiIsICJPUy8yIFZpZGVvIE91dHB1dCB1c2luZyBGU0xpYiIsCi0gICAgICAgIG9zMmZzbGliX0F2YWlsYWJsZSwgb3MyZnNsaWJfQ3JlYXRlRGV2aWNlCi19OwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL29zMmZzbGliL1NETF9vczJmc2xpYi5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9vczJmc2xpYi9TRExfb3MyZnNsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiNDBjNS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL29zMmZzbGliL1NETF9vczJmc2xpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX29zMmZzbGliX2gKLSNkZWZpbmUgX1NETF9vczJmc2xpYl9oCi0KLQotLy8gT1MyIHNwZWNpZmljIGluY2x1ZGVzCi0jZGVmaW5lIElOQ0xfVFlQRVMKLSNkZWZpbmUgSU5DTF9ET1MKLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNkZWZpbmUgSU5DTF9ET1NQUk9DRVNTCi0jZGVmaW5lIElOQ0xfV0lOCi0jZGVmaW5lIElOQ0xfR1BJCi0jaW5jbHVkZSA8b3MyLmg+Ci0KLSNpbmNsdWRlIDxGU0xpYi5oPgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICpfdGhpcwotCi0vKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLwotc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhCi17Ci0gIEZTTGliX1ZpZGVvTW9kZV9wICAgcEF2YWlsYWJsZUZTTGliVmlkZW9Nb2RlczsKLSAgU0RMX1JlY3QgICAgICAgICAgKipwTGlzdE1vZGVzUmVzdWx0OyAvLyBBbGxvY2F0ZWQgbWVtb3J5IHRvIHJldHVybiBsaXN0IG9mIG1vZGVzIGZvciBvczJmc2xpYl9MaXN0TW9kZXMoKSBBUEkKLQotICBGU0xpYl9WaWRlb01vZGUgICAgIFNyY0J1ZmZlckRlc2M7ICAgIC8vIERlc2NyaXB0aW9uIG9mIGN1cnJlbnQgc291cmNlIGltYWdlIGJ1ZmZlcgotICBjaGFyICAgICAgICAgICAgICAgKnBjaFNyY0J1ZmZlcjsgICAgIC8vIFRoZSBzb3VyY2UgaW1hZ2UgYnVmZmVyIGl0c2VsZgotICBTRExfU3VyZmFjZSAgICAgICAgKnBTRExTdXJmYWNlOyAgICAgIC8vIFRoZSBTREwgc3VyZmFjZSBkZXNjcmliaW5nIHRoZSBidWZmZXIKLSAgSE1UWCAgICAgICAgICAgICAgICBobXR4VXNlU3JjQnVmZmVyOyAvLyBNdXRleCBzZW1hcGhvcmUgdG8gbWFuaXB1bGF0ZSBzcmMgYnVmZmVyCi0gIEhXTkQgICAgICAgICAgICAgICAgaHduZEZyYW1lLCBod25kQ2xpZW50OyAgLy8gV2luZG93IGhhbmRsZSBvZiBmcmFtZSBhbmQgY2xpZW50Ci0gIGludCAgICAgICAgICAgICAgICAgaVBNVGhyZWFkU3RhdHVzOyAgLy8gMDogTm90IHJ1bm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOiBSdW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXI6IE5vdCBydW5uaW5nLCBoYWQgYW4gZXJyb3IKLSAgaW50ICAgICAgICAgICAgICAgICB0aWRQTVRocmVhZDsgICAgICAvLyBUaHJlYWQgSUQgb2YgUE0gVGhyZWFkCi0gIGludCAgICAgICAgICAgICAgICAgZkluRm9jdXM7ICAgICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSBpbiBmb2N1cyEKLSAgaW50ICAgICAgICAgICAgICAgICBpU2tpcFdNTU9VU0VNT1ZFOyAvLyBOdW1iZXIgb2YgV01fTU9VU0VNT1ZFIG1lc3NhZ2VzIHRvIHNraXAhCi0gIGludCAgICAgICAgICAgICAgICAgaU1vdXNlVmlzaWJsZTsgICAgLy8KLQotICBQRk5XUCAgICAgICAgICAgICAgIHBmbk9sZEZyYW1lUHJvYzsgIC8vIE9sZCB3aW5kb3cgZnJhbWUgcHJvY2VkdXJlCi0gIGludCAgICAgICAgICAgICAgICAgYlByb3BvcnRpb25hbFJlc2l6ZTsgLy8gMDogTm8gcHJvcG9ydGlvbmFsIHJlc2l6aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTogRG8gcHJvcG9ydGlvbmFsIHJlc2l6aW5nCi0gIFVMT05HICAgICAgICAgICAgICAgdWxSZXNpemluZ0ZsYWc7ICAgLy8gRmlyc3QgcmVzaXppbmcgZmxhZyB2YWx1ZQotfTsKLQotLyogT1MvMiBzcGVjaWZpYyBiYWNrZG9vciBmdW5jdGlvbiB0byBiZSBhYmxlIHRvIHNldCBGcmFtZUNvbnRyb2xGbGFncyBvZiAqLwotLyogdGhlIFNETCB3aW5kb3cgYmVmb3JlIGNyZWF0aW5nIGl0LiAqLwotZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfT1MyRlNMSUJfU2V0RkNGVG9Vc2UoVUxPTkcgdWxGQ0YpOwotCi0jZW5kaWYgLyogX1NETF9vczJmc2xpYl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL29zMmZzbGliL1NETF92a2V5cy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9vczJmc2xpYi9TRExfdmtleXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3NmRlOS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL29zMmZzbGliL1NETF92a2V5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotI2lmbmRlZiBWS18wCi0jZGVmaW5lIFZLXzAJJzAnCi0jZGVmaW5lIFZLXzEJJzEnCi0jZGVmaW5lIFZLXzIJJzInCi0jZGVmaW5lIFZLXzMJJzMnCi0jZGVmaW5lIFZLXzQJJzQnCi0jZGVmaW5lIFZLXzUJJzUnCi0jZGVmaW5lIFZLXzYJJzYnCi0jZGVmaW5lIFZLXzcJJzcnCi0jZGVmaW5lIFZLXzgJJzgnCi0jZGVmaW5lIFZLXzkJJzknCi0jZGVmaW5lIFZLX0EJJ0EnCi0jZGVmaW5lIFZLX0IJJ0InCi0jZGVmaW5lIFZLX0MJJ0MnCi0jZGVmaW5lIFZLX0QJJ0QnCi0jZGVmaW5lIFZLX0UJJ0UnCi0jZGVmaW5lIFZLX0YJJ0YnCi0jZGVmaW5lIFZLX0cJJ0cnCi0jZGVmaW5lIFZLX0gJJ0gnCi0jZGVmaW5lIFZLX0kJJ0knCi0jZGVmaW5lIFZLX0oJJ0onCi0jZGVmaW5lIFZLX0sJJ0snCi0jZGVmaW5lIFZLX0wJJ0wnCi0jZGVmaW5lIFZLX00JJ00nCi0jZGVmaW5lIFZLX04JJ04nCi0jZGVmaW5lIFZLX08JJ08nCi0jZGVmaW5lIFZLX1AJJ1AnCi0jZGVmaW5lIFZLX1EJJ1EnCi0jZGVmaW5lIFZLX1IJJ1InCi0jZGVmaW5lIFZLX1MJJ1MnCi0jZGVmaW5lIFZLX1QJJ1QnCi0jZGVmaW5lIFZLX1UJJ1UnCi0jZGVmaW5lIFZLX1YJJ1YnCi0jZGVmaW5lIFZLX1cJJ1cnCi0jZGVmaW5lIFZLX1gJJ1gnCi0jZGVmaW5lIFZLX1kJJ1knCi0jZGVmaW5lIFZLX1oJJ1onCi0jZW5kaWYgLyogVktfMCAqLwotCi0vKiBUaGVzZSBrZXlzIGhhdmVuJ3QgYmVlbiBkZWZpbmVkLCBidXQgd2VyZSBleHBlcmltZW50YWxseSBkZXRlcm1pbmVkICovCi0jZGVmaW5lIFZLX1NFTUlDT0xPTgkweEJBCi0jZGVmaW5lIFZLX0VRVUFMUwkweEJCCi0jZGVmaW5lIFZLX0NPTU1BCTB4QkMKLSNkZWZpbmUgVktfTUlOVVMJMHhCRAotI2RlZmluZSBWS19QRVJJT0QJMHhCRQotI2RlZmluZSBWS19TTEFTSAkweEJGCi0jZGVmaW5lIFZLX0dSQVZFCTB4QzAKLSNkZWZpbmUgVktfTEJSQUNLRVQJMHhEQgotI2RlZmluZSBWS19CQUNLU0xBU0gJMHhEQwotI2RlZmluZSBWS19SQlJBQ0tFVAkweERECi0jZGVmaW5lIFZLX0FQT1NUUk9QSEUJMHhERQotI2RlZmluZSBWS19CQUNLVElDSwkweERGCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDA1YjcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX2V2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBIYW5kbGUgdGhlIGV2ZW50IHN0cmVhbSwgY29udmVydGluZyBwaG90b24gZXZlbnRzIGludG8gU0RMIGV2ZW50cyAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0jaW5jbHVkZSA8UGguaD4KLSNpbmNsdWRlIDxwaG90b24vUGtLZXlEZWYuaD4KLQotI2luY2x1ZGUgIlNETC5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9waF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9waF9tb2Rlc19jLmgiCi0jaW5jbHVkZSAiU0RMX3BoX2ltYWdlX2MuaCIKLSNpbmNsdWRlICJTRExfcGhfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfcGh5dXZfYy5oIgotCi0vKiBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBwaG90b24ga2V5c3ltIHRvIGEgU0RMIGtleXN5bSAqLwotc3RhdGljIFNETEtleSBPRERfa2V5bWFwWzI1Nl07Ci1zdGF0aWMgU0RMS2V5IE1JU0Nfa2V5bWFwWzB4RkYgKyAxXTsKLVNETF9rZXlzeW0gKnBoX1RyYW5zbGF0ZUtleShQaEtleUV2ZW50X3QgKmtleSwgU0RMX2tleXN5bSAqa2V5c3ltKTsKLQotLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSByZXBlYXRlZCBrZXkuCi0gICAoaWRlYSBzaGFtZWxlc3NseSBsaWZ0ZWQgZnJvbSBHSUkgLS0gdGhhbmtzIGd1eXMhIDopICovCi1zdGF0aWMgaW50IHBoX1dhcnBlZE1vdGlvbihfVEhJUywgUGhFdmVudF90ICp3aW5FdmVudCkKLXsKLSAgICBQaFJlY3RfdCAqcmVjdCA9IFBoR2V0UmVjdHMoIHdpbkV2ZW50ICk7Ci0KLSAgICBpbnQgY2VudHJlX3gsIGNlbnRyZV95OwotICAgIGludCBkeCwgZHk7Ci0gICAgc2hvcnQgYWJzX3gsIGFic195OwotICAgIGludCBwb3N0ZWQ7Ci0KLSAgICBjZW50cmVfeCA9IFNETF9WaWRlb1N1cmZhY2UtPncgLyAyOwotICAgIGNlbnRyZV95ID0gU0RMX1ZpZGVvU3VyZmFjZS0+aCAvIDI7Ci0KLSAgICBkeCA9IHJlY3QtPnVsLnggLSBjZW50cmVfeDsKLSAgICBkeSA9IHJlY3QtPnVsLnkgLSBjZW50cmVfeTsKLQotICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oIDAsIDEsIGR4LCBkeSApOwotCi0gICAgLyogTW92ZSBtb3VzZSBjdXJzb3IgdG8gbWlkZGxlIG9mIHRoZSB3aW5kb3cgKi8KLSAgICBQdEdldEFic1Bvc2l0aW9uKCB3aW5kb3csICZhYnNfeCwgJmFic195ICk7Ci0gICAgUGhNb3ZlQ3Vyc29yQWJzKFBoSW5wdXRHcm91cChOVUxMKSwgYWJzX3ggKyBjZW50cmVfeCwgYWJzX3kgKyBjZW50cmVfeSk7Ci0KLSAgICByZXR1cm4gKHBvc3RlZCk7Ci19Ci0KLS8qIENvbnRyb2wgd2hpY2ggbW90aW9uIGZsYWdzIHRoZSB3aW5kb3cgaGFzIHNldCwgYSBmbGFncyB2YWx1ZSBvZiAtMSBzZXRzCi0gKiBNT1RJT05fQlVUVE9OIGFuZCBNT1RJT05fTk9CVVRUT04gKi8KLQotc3RhdGljIHZvaWQgc2V0X21vdGlvbl9zZW5zaXRpdml0eShfVEhJUywgdW5zaWduZWQgaW50IGZsYWdzKQotewotICAgIGludCByaWQ7Ci0gICAgaW50IGZpZWxkcyA9IFBoX0VWX1BUUl9NT1RJT05fQlVUVE9OIHwgUGhfRVZfUFRSX01PVElPTl9OT0JVVFRPTjsKLSAgICBQaFJlZ2lvbl90IHJlZ2lvbjsKLQotICAgIGlmKCB3aW5kb3cgKQotICAgIHsKLSAgICAgICAgcmlkID0gUHRXaWRnZXRSaWQod2luZG93KTsKLSAgICAgICAgaWYoIHJpZCAhPSAwICYmIFBoUmVnaW9uUXVlcnkocmlkLCAmcmVnaW9uLCBOVUxMLCBOVUxMLCAwKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVnaW9uLmV2ZW50c19zZW5zZT0ocmVnaW9uLmV2ZW50c19zZW5zZSAmIH5maWVsZHMpfChmbGFncyAmIGZpZWxkcyk7Ci0gICAgICAgICAgICBQaFJlZ2lvbkNoYW5nZShQaF9SRUdJT05fRVZfU0VOU0UsIDAsICZyZWdpb24sIE5VTEwsIE5VTEwpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBDb252ZXJ0IHRoZSBwaG90b24gYnV0dG9uIHN0YXRlIHZhbHVlIHRvIGFuIFNETCB2YWx1ZSAqLwotc3RhdGljIFVpbnQ4IHBoMnNkbF9tb3VzZWJ1dHRvbih1bnNpZ25lZCBzaG9ydCBidXR0b25fc3RhdGUpCi17Ci0gICAgVWludDggbW91c2VfYnV0dG9uID0gMDsKLQotICAgIGlmIChidXR0b25fc3RhdGUgJiBQaF9CVVRUT05fU0VMRUNUKQotICAgICAgICBtb3VzZV9idXR0b24gfD0gU0RMX0JVVFRPTl9MRUZUOwotICAgIGlmIChidXR0b25fc3RhdGUgJiBQaF9CVVRUT05fTUVOVSkKLSAgICAgICAgbW91c2VfYnV0dG9uIHw9IFNETF9CVVRUT05fUklHSFQ7Ci0gICAgaWYgKGJ1dHRvbl9zdGF0ZSAmIFBoX0JVVFRPTl9BREpVU1QpCi0gICAgICAgIG1vdXNlX2J1dHRvbiB8PSBTRExfQlVUVE9OX01JRERMRTsKLQotICAgIHJldHVybiAobW91c2VfYnV0dG9uKTsKLX0KLQotc3RhdGljIGludCBwaF9EaXNwYXRjaEV2ZW50KF9USElTKQotewotICAgIGludCBwb3N0ZWQ7Ci0gICAgUGhSZWN0X3QqIHJlY3Q7Ci0gICAgUGhQb2ludGVyRXZlbnRfdCogcG9pbnRlckV2ZW50OwotICAgIFBoS2V5RXZlbnRfdCoga2V5RXZlbnQ7Ci0gICAgUGhXaW5kb3dFdmVudF90KiB3aW5FdmVudDsKLSAgICBpbnQgaSwgYnV0dG9uczsKLSAgICBTRExfUmVjdCBzZGxyZWN0c1tQSF9TRExfTUFYX1JFQ1RTXTsKLQkKLSAgICBwb3N0ZWQgPSAwOwotCQotICAgIHN3aXRjaCAocGhldmVudC0+dHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUGhfRVZfQk9VTkRBUlk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwaGV2ZW50LT5zdWJ0eXBlID09IFBoX0VWX1BUUl9FTlRFUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwaGV2ZW50LT5zdWJ0eXBlID09UGhfRVZfUFRSX0xFQVZFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsJCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQaF9FVl9QVFJfTU9USU9OX0JVVFRPTjoKLSAgICAgICAgY2FzZSBQaF9FVl9QVFJfTU9USU9OX05PQlVUVE9OOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoU0RMX1ZpZGVvU3VyZmFjZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnQgPSBQaEdldERhdGEocGhldmVudCk7Ci0gICAgICAgICAgICAgICAgcmVjdCA9IFBoR2V0UmVjdHMocGhldmVudCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW91c2VfcmVsYXRpdmUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwb3N0ZWQgPSBwaF9XYXJwZWRNb3Rpb24odGhpcywgcGhldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgcmVjdC0+dWwueCwgcmVjdC0+dWwueSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUGhfRVZfQlVUX1BSRVNTOgotICAgICAgICB7Ci0gICAgICAgICAgICBwb2ludGVyRXZlbnQgPSBQaEdldERhdGEocGhldmVudCk7Ci0gICAgICAgICAgICBidXR0b25zID0gcGgyc2RsX21vdXNlYnV0dG9uKHBvaW50ZXJFdmVudC0+YnV0dG9ucyk7Ci0gICAgICAgICAgICBpZiAoYnV0dG9ucyAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIGJ1dHRvbnMsIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUGhfRVZfQlVUX1JFTEVBU0U6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBvaW50ZXJFdmVudCA9IFBoR2V0RGF0YShwaGV2ZW50KTsKLSAgICAgICAgICAgIGJ1dHRvbnMgPSBwaDJzZGxfbW91c2VidXR0b24ocG9pbnRlckV2ZW50LT5idXR0b25zKTsKLSAgICAgICAgICAgIGlmIChwaGV2ZW50LT5zdWJ0eXBlID09IFBoX0VWX1JFTEVBU0VfUkVBTCAmJiBidXR0b25zICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIGJ1dHRvbnMsIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihwaGV2ZW50LT5zdWJ0eXBlID09IFBoX0VWX1JFTEVBU0VfUEhBTlRPTSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiB0aGUgbW91c2UgaXMgb3V0c2lkZSB0aGUgd2luZG93LAotICAgICAgICAgICAgICAgICAqIG9ubHkgYSBwaGFudG9tIHJlbGVhc2UgZXZlbnQgaXMgc2VudCwgc28KLSAgICAgICAgICAgICAgICAgKiBjaGVjayBpZiB0aGUgd2luZG93IGRvZXNuJ3QgaGF2ZSBtb3VzZSBmb2N1cy4KLSAgICAgICAgICAgICAgICAgKiBOb3QgcGVyZmVjdCwgbWF5YmUgY2hlY2tpbmcgdGhlIG1vdXNlIGJ1dHRvbgotICAgICAgICAgICAgICAgICAqIHN0YXRlIGZvciBQaF9FVl9CT1VOREFSWSBldmVudHMgd291bGQgYmUKLSAgICAgICAgICAgICAgICAgKiBiZXR0ZXIuICovCi0gICAgICAgICAgICAgICAgaWYgKChTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBNT1VTRUZPQ1VTKSA9PSAwKQotCQl7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBidXR0b25zLCAwLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQaF9FVl9XTToKLSAgICAgICAgewotICAgICAgICAgICAgd2luRXZlbnQgPSBQaEdldERhdGEocGhldmVudCk7Ci0KLSAgICAgICAgICAgIC8qIGxvc2luZyBmb2N1cyAqLwotICAgICAgICAgICAgaWYgKCh3aW5FdmVudC0+ZXZlbnRfZj09UGhfV01fRk9DVVMpICYmICh3aW5FdmVudC0+ZXZlbnRfc3RhdGU9PVBoX1dNX0VWU1RBVEVfRk9DVVNMT1NUKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXRfbW90aW9uX3NlbnNpdGl2aXR5KHRoaXMsIFBoX0VWX1BUUl9NT1RJT05fQlVUVE9OKTsKLSAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQSU5QVVRGT0NVUyk7CQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZ2FpbmluZyBmb2N1cyAqLwotICAgICAgICAgICAgZWxzZSBpZiAoKHdpbkV2ZW50LT5ldmVudF9mPT1QaF9XTV9GT0NVUykgJiYgKHdpbkV2ZW50LT5ldmVudF9zdGF0ZT09UGhfV01fRVZTVEFURV9GT0NVUykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0X21vdGlvbl9zZW5zaXRpdml0eSh0aGlzLCAtMSk7Ci0gICAgICAgICAgICAgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUElOUFVURk9DVVMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogcmVxdWVzdCBxdWl0ICovCi0gICAgICAgICAgICBlbHNlIGlmICh3aW5FdmVudC0+ZXZlbnRfZj09UGhfV01fQ0xPU0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVRdWl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiByZXF1ZXN0IGhpZGUvdW5oaWRlICovCi0gICAgICAgICAgICBlbHNlIGlmICh3aW5FdmVudC0+ZXZlbnRfZj09UGhfV01fSElERSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudGx5X2hpZGVkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAvKiBnb3QgdW5oaWRlIHdpbmRvdyBldmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiByZXN0b3JlIGFwcGxpY2F0aW9uJ3MgcGFsZXR0ZSBpZiBpbiBwYWxldHRlIG1vZGUgKi8KLSAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlfaGlkZWQ9MDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAvKiBnb3QgaGlkZSB3aW5kb3cgZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiByZXN0b3JlIG9yaWdpbmFsIHBhbGV0dGUgaWYgaW4gcGFsZXR0ZSBtb2RlICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlfaGlkZWQ9MTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiByZXF1ZXN0IHRvIHJlc2l6ZSAqLwotICAgICAgICAgICAgZWxzZSBpZiAod2luRXZlbnQtPmV2ZW50X2Y9PVBoX1dNX1JFU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50bHlfbWF4aW1pemVkPTA7Ci0gICAgICAgICAgICAgICAgI2lmIChfTlRPX1ZFUlNJT04gPCA2MzApCi0gICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVSZXNpemUod2luRXZlbnQtPnNpemUudysxLCB3aW5FdmVudC0+c2l6ZS5oKzEpOwotICAgICAgICAgICAgICAgICNlbHNlCi0gICAgICAgICAgICAgICAgICAgLyogUU5YIDYuMy4wIGhhdmUgdGhpcyBidWcgZml4ZWQgKi8KLSAgICAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZVJlc2l6ZSh3aW5FdmVudC0+c2l6ZS53LCB3aW5FdmVudC0+c2l6ZS5oKTsKLSAgICAgICAgICAgICAgICAjZW5kaWYgLyogX05UT19WRVJTSU9OICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiByZXF1ZXN0IHRvIG1vdmUgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKHdpbkV2ZW50LT5ldmVudF9mPT1QaF9XTV9NT1ZFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X292ZXJsYXkhPU5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGludCBsb2NrZWRzdGF0ZT1jdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+bG9ja2VkOwotICAgICAgICAgICAgICAgICAgIGludCBjaHJvbWFzdGF0ZT1jdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+aXNjaHJvbWFrZXk7Ci0gICAgICAgICAgICAgICAgICAgaW50IGVycm9yOwotICAgICAgICAgICAgICAgICAgIFNETF9SZWN0IHNyYywgZHN0OwotCi0gICAgICAgICAgICAgICAgICAgY3VycmVudF9vdmVybGF5LT5od2RhdGEtPmxvY2tlZD0xOwotICAgICAgICAgICAgICAgICAgIHNyYy54ID0gMDsKLSAgICAgICAgICAgICAgICAgICBzcmMueSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgc3JjLncgPSBjdXJyZW50X292ZXJsYXktPnc7Ci0gICAgICAgICAgICAgICAgICAgc3JjLnkgPSBjdXJyZW50X292ZXJsYXktPmg7Ci0gICAgICAgICAgICAgICAgICAgZHN0Lng9Y3VycmVudF9vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueDsKLSAgICAgICAgICAgICAgICAgICBkc3QueT1jdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy55OwotICAgICAgICAgICAgICAgICAgIGRzdC53PWN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS53OwotICAgICAgICAgICAgICAgICAgIGRzdC5oPWN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS5oOwotICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5pc2Nocm9tYWtleT0wOwotICAgICAgICAgICAgICAgICAgIGVycm9yPXBoX0Rpc3BsYXlZVVZPdmVybGF5KHRoaXMsIGN1cnJlbnRfb3ZlcmxheSwgJnNyYywgJmRzdCk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5pc2Nocm9tYWtleT1jaHJvbWFzdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9vdmVybGF5LT5od2RhdGEtPmxvY2tlZD1sb2NrZWRzdGF0ZTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogbWF4aW1pemUgcmVxdWVzdCAqLwotICAgICAgICAgICAgZWxzZSBpZiAod2luRXZlbnQtPmV2ZW50X2Y9PVBoX1dNX01BWCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiB3aW5kb3cgYWxyZWFkeSBtb3ZlZCBhbmQgcmVzaXplZCBoZXJlICovCi0gICAgICAgICAgICAgICAgY3VycmVudGx5X21heGltaXplZD0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogcmVzdG9yZSByZXF1ZXN0ICovCi0gICAgICAgICAgICBlbHNlIGlmICh3aW5FdmVudC0+ZXZlbnRfZj09UGhfV01fUkVTVE9SRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiB3aW5kb3cgYWxyZWFkeSBtb3ZlZCBhbmQgcmVzaXplZCBoZXJlICovCi0gICAgICAgICAgICAgICAgY3VycmVudGx5X21heGltaXplZD0wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIHdpbmRvdyBoYXMgYmVlbiByZXNpemVkLCBtb3ZlZCBvciByZW1vdmVkICovCi0gICAgICAgIGNhc2UgUGhfRVZfRVhQT1NFOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocGhldmVudC0+bnVtX3JlY3RzIT0wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBudW1yZWN0czsKLQotICAgICAgICAgICAgICAgIGlmIChTRExfVmlkZW9TdXJmYWNlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdCA9IFBoR2V0UmVjdHMocGhldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaGV2ZW50LT5udW1fcmVjdHM+UEhfU0RMX01BWF9SRUNUUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3JyeSwgYnVmZmVycyB1bmRlcnJ1biwgd2UnbGwgdXBkYXRlIG9ubHkgZmlyc3QgUEhfU0RMX01BWF9SRUNUUyByZWN0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICBudW1yZWN0cz1QSF9TRExfTUFYX1JFQ1RTOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxwaGV2ZW50LT5udW1fcmVjdHM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2RscmVjdHNbaV0ueCA9IHJlY3RbaV0udWwueDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNkbHJlY3RzW2ldLnkgPSByZWN0W2ldLnVsLnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZGxyZWN0c1tpXS53ID0gcmVjdFtpXS5sci54IC0gcmVjdFtpXS51bC54ICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNkbHJlY3RzW2ldLmggPSByZWN0W2ldLmxyLnkgLSByZWN0W2ldLnVsLnkgKyAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy0+VXBkYXRlUmVjdHModGhpcywgcGhldmVudC0+bnVtX3JlY3RzLCBzZGxyZWN0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfb3ZlcmxheSE9TlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2tlZHN0YXRlPWN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRExfUmVjdCBzcmMsIGRzdDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9vdmVybGF5LT5od2RhdGEtPmxvY2tlZD0xOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjLnggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjLnkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjLncgPSBjdXJyZW50X292ZXJsYXktPnc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmMueSA9IGN1cnJlbnRfb3ZlcmxheS0+aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdC54PWN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQucG9zLng7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3QueT1jdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy55OwotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Lnc9Y3VycmVudF9vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5zaXplLnc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3QuaD1jdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnNpemUuaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5mb3JjZWRyZWRyYXc9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yPXBoX0Rpc3BsYXlZVVZPdmVybGF5KHRoaXMsIGN1cnJlbnRfb3ZlcmxheSwgJnNyYywgJmRzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5mb3JjZWRyZWRyYXc9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+bG9ja2VkPWxvY2tlZHN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQaF9FVl9LRVk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFNETF9rZXlzeW0ga2V5c3ltOwotCi0gICAgICAgICAgICBwb3N0ZWQgPSAwOwotCi0gICAgICAgICAgICBrZXlFdmVudCA9IFBoR2V0RGF0YShwaGV2ZW50KTsKLQotICAgICAgICAgICAgaWYgKFBrX0tGX0tleV9Eb3duICYga2V5RXZlbnQtPmtleV9mbGFncykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBzcGxpdCB0aGUgd2hlZWwgZXZlbnRzIGZyb20gcmVhbCBrZXkgZXZlbnRzICovCi0gICAgICAgICAgICAgICAgaWYgKChrZXlFdmVudC0+a2V5X2NhcD09UGtfVXApICYmIChrZXlFdmVudC0+a2V5X3NjYW49PTApICYmICgoa2V5RXZlbnQtPmtleV9mbGFncyAmIFBrX0tGX1NjYW5fVmFsaWQpPT1Qa19LRl9TY2FuX1ZhbGlkKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgU0RMX0JVVFRPTl9XSEVFTFVQLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChrZXlFdmVudC0+a2V5X2NhcD09UGtfRG93bikgJiYgKGtleUV2ZW50LT5rZXlfc2Nhbj09MCkgJiYgKChrZXlFdmVudC0+a2V5X2ZsYWdzICYgUGtfS0ZfU2Nhbl9WYWxpZCk9PVBrX0tGX1NjYW5fVmFsaWQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBTRExfQlVUVE9OX1dIRUVMRE9XTiwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsIHBoX1RyYW5zbGF0ZUtleShrZXlFdmVudCwgJmtleXN5bSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKiBtdXN0IGJlIGtleSByZWxlYXNlICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc3BsaXQgdGhlIHdoZWVsIGV2ZW50cyBmcm9tIHJlYWwga2V5IGV2ZW50cyAqLwotICAgICAgICAgICAgICAgIGlmICgoa2V5RXZlbnQtPmtleV9jYXA9PVBrX1VwKSAmJiAoa2V5RXZlbnQtPmtleV9zY2FuPT0wKSAmJiAoKGtleUV2ZW50LT5rZXlfZmxhZ3MgJiBQa19LRl9TY2FuX1ZhbGlkKT09UGtfS0ZfU2Nhbl9WYWxpZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBTRExfQlVUVE9OX1dIRUVMVVAsIDAsIDApOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGtleUV2ZW50LT5rZXlfY2FwPT1Qa19Eb3duKSAmJiAoa2V5RXZlbnQtPmtleV9zY2FuPT0wKSAmJiAoKGtleUV2ZW50LT5rZXlfZmxhZ3MgJiBQa19LRl9TY2FuX1ZhbGlkKT09UGtfS0ZfU2Nhbl9WYWxpZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBTRExfQlVUVE9OX1dIRUVMRE9XTiwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELCBwaF9UcmFuc2xhdGVLZXkoIGtleUV2ZW50LCAma2V5c3ltKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBjYXNlIFBoX0VWX0lORk86Ci0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKHBoZXZlbnQtPnN1YnR5cGU9PVBoX09GRlNDUkVFTl9JTlZBTElEKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcqIEV2SW5mb0RhdGE7Ci0KLSAgICAgICAgICAgICAgRXZJbmZvRGF0YT0odW5zaWduZWQgbG9uZyopUGhHZXREYXRhKHBoZXZlbnQpOwotCi0gICAgICAgICAgICAgIHN3aXRjaCAoKkV2SW5mb0RhdGEpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgY2FzZSBQZ19WSURFT19NT0RFX1NXSVRDSEVEOgotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGNhc2UgUGdfRU5URVJFRF9ESVJFQ1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBQZ19FWElURURfRElSRUNUOgotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGNhc2UgUGdfRFJJVkVSX1NUQVJURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuKHBvc3RlZCk7Ci19Ci0KLS8qIHBlcmZvcm0gYSBibG9ja2luZyByZWFkIGlmIG5vIGV2ZW50cyBhdmFpbGFibGUgKi8KLWludCBwaF9QZW5kaW5nKF9USElTKQotewotICAgIC8qIEZsdXNoIHRoZSBkaXNwbGF5IGNvbm5lY3Rpb24gYW5kIGxvb2sgdG8gc2VlIGlmIGV2ZW50cyBhcmUgcXVldWVkICovCi0gICAgUGdGbHVzaCgpOwotCi0gICAgd2hpbGUgKDEpCi0gICAgewotICAgICAgICBzd2l0Y2goUGhFdmVudFBlZWsocGhldmVudCwgRVZFTlRfU0laRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgUGhfRVZFTlRfTVNHOgotICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfUGVuZGluZygpOiBQaEV2ZW50TmV4dCBmYWlsZWQuXG4iKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIE9oIHdlbGwsIG5vdGhpbmcgaXMgcmVhZHkgLi4gKi8KLSAgICByZXR1cm4oMCk7Ci19Ci0KLXZvaWQgcGhfUHVtcEV2ZW50cyhfVEhJUykKLXsKLSAgICAvKiBGbHVzaCB0aGUgZGlzcGxheSBjb25uZWN0aW9uIGFuZCBsb29rIHRvIHNlZSBpZiBldmVudHMgYXJlIHF1ZXVlZCAqLwotICAgIFBnRmx1c2goKTsKLQotICAgIHdoaWxlIChwaF9QZW5kaW5nKHRoaXMpKQotICAgIHsKLSAgICAgICAgUHRFdmVudEhhbmRsZXIocGhldmVudCk7Ci0gICAgICAgIHBoX0Rpc3BhdGNoRXZlbnQodGhpcyk7Ci0gICAgfQotfQotCi12b2lkIHBoX0luaXRLZXltYXAodm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIE9kZCBrZXlzIHVzZWQgaW4gaW50ZXJuYXRpb25hbCBrZXlib2FyZHMgKi8KLSAgICBmb3IgKGk9MDsgaTxTRExfYXJyYXlzaXplKE9ERF9rZXltYXApOyArK2kpCi0gICAgewotICAgICAgICBPRERfa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOwotICAgIH0KLQotICAgIC8qIE1hcCB0aGUgbWlzY2VsbGFuZW91cyBrZXlzICovCi0gICAgZm9yIChpPTA7IGk8U0RMX2FycmF5c2l6ZShNSVNDX2tleW1hcCk7ICsraSkKLSAgICB7Ci0gICAgICAgIE1JU0Nfa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOwotICAgIH0KLQotICAgIE1JU0Nfa2V5bWFwW1BrX0JhY2tTcGFjZSYweEZGXSA9IFNETEtfQkFDS1NQQUNFOwotICAgIE1JU0Nfa2V5bWFwW1BrX1RhYiYweEZGXSA9IFNETEtfVEFCOwotICAgIE1JU0Nfa2V5bWFwW1BrX0NsZWFyJjB4RkZdID0gU0RMS19DTEVBUjsKLSAgICBNSVNDX2tleW1hcFtQa19SZXR1cm4mMHhGRl0gPSBTRExLX1JFVFVSTjsKLSAgICBNSVNDX2tleW1hcFtQa19QYXVzZSYweEZGXSA9IFNETEtfUEFVU0U7Ci0gICAgTUlTQ19rZXltYXBbUGtfRXNjYXBlJjB4RkZdID0gU0RMS19FU0NBUEU7Ci0gICAgTUlTQ19rZXltYXBbUGtfRGVsZXRlJjB4RkZdID0gU0RMS19ERUxFVEU7Ci0KLSAgICBNSVNDX2tleW1hcFtQa19LUF8wJjB4RkZdID0gU0RMS19LUDA7Ci0gICAgTUlTQ19rZXltYXBbUGtfS1BfMSYweEZGXSA9IFNETEtfS1AxOwotICAgIE1JU0Nfa2V5bWFwW1BrX0tQXzImMHhGRl0gPSBTRExLX0tQMjsKLSAgICBNSVNDX2tleW1hcFtQa19LUF8zJjB4RkZdID0gU0RMS19LUDM7Ci0gICAgTUlTQ19rZXltYXBbUGtfS1BfNCYweEZGXSA9IFNETEtfS1A0OwotICAgIE1JU0Nfa2V5bWFwW1BrX0tQXzUmMHhGRl0gPSBTRExLX0tQNTsKLSAgICBNSVNDX2tleW1hcFtQa19LUF82JjB4RkZdID0gU0RMS19LUDY7Ci0gICAgTUlTQ19rZXltYXBbUGtfS1BfNyYweEZGXSA9IFNETEtfS1A3OwotICAgIE1JU0Nfa2V5bWFwW1BrX0tQXzgmMHhGRl0gPSBTRExLX0tQODsKLSAgICBNSVNDX2tleW1hcFtQa19LUF85JjB4RkZdID0gU0RMS19LUDk7Ci0KLSAgICBNSVNDX2tleW1hcFtQa19LUF9EZWNpbWFsJjB4RkZdID0gU0RMS19LUF9QRVJJT0Q7Ci0gICAgTUlTQ19rZXltYXBbUGtfS1BfRGl2aWRlJjB4RkZdID0gU0RMS19LUF9ESVZJREU7Ci0gICAgTUlTQ19rZXltYXBbUGtfS1BfTXVsdGlwbHkmMHhGRl0gPSBTRExLX0tQX01VTFRJUExZOwotICAgIE1JU0Nfa2V5bWFwW1BrX0tQX1N1YnRyYWN0JjB4RkZdID0gU0RMS19LUF9NSU5VUzsKLSAgICBNSVNDX2tleW1hcFtQa19LUF9BZGQmMHhGRl0gPSBTRExLX0tQX1BMVVM7Ci0gICAgTUlTQ19rZXltYXBbUGtfS1BfRW50ZXImMHhGRl0gPSBTRExLX0tQX0VOVEVSOwotICAgIE1JU0Nfa2V5bWFwW1BrX0tQX0VxdWFsJjB4RkZdID0gU0RMS19LUF9FUVVBTFM7Ci0KLSAgICBNSVNDX2tleW1hcFtQa19VcCYweEZGXSA9IFNETEtfVVA7Ci0gICAgTUlTQ19rZXltYXBbUGtfRG93biYweEZGXSA9IFNETEtfRE9XTjsKLSAgICBNSVNDX2tleW1hcFtQa19SaWdodCYweEZGXSA9IFNETEtfUklHSFQ7Ci0gICAgTUlTQ19rZXltYXBbUGtfTGVmdCYweEZGXSA9IFNETEtfTEVGVDsKLSAgICBNSVNDX2tleW1hcFtQa19JbnNlcnQmMHhGRl0gPSBTRExLX0lOU0VSVDsKLSAgICBNSVNDX2tleW1hcFtQa19Ib21lJjB4RkZdID0gU0RMS19IT01FOwotICAgIE1JU0Nfa2V5bWFwW1BrX0VuZCYweEZGXSA9IFNETEtfRU5EOwotICAgIE1JU0Nfa2V5bWFwW1BrX1BnX1VwJjB4RkZdID0gU0RMS19QQUdFVVA7Ci0gICAgTUlTQ19rZXltYXBbUGtfUGdfRG93biYweEZGXSA9IFNETEtfUEFHRURPV047Ci0KLSAgICBNSVNDX2tleW1hcFtQa19GMSYweEZGXSA9IFNETEtfRjE7Ci0gICAgTUlTQ19rZXltYXBbUGtfRjImMHhGRl0gPSBTRExLX0YyOwotICAgIE1JU0Nfa2V5bWFwW1BrX0YzJjB4RkZdID0gU0RMS19GMzsKLSAgICBNSVNDX2tleW1hcFtQa19GNCYweEZGXSA9IFNETEtfRjQ7Ci0gICAgTUlTQ19rZXltYXBbUGtfRjUmMHhGRl0gPSBTRExLX0Y1OwotICAgIE1JU0Nfa2V5bWFwW1BrX0Y2JjB4RkZdID0gU0RMS19GNjsKLSAgICBNSVNDX2tleW1hcFtQa19GNyYweEZGXSA9IFNETEtfRjc7Ci0gICAgTUlTQ19rZXltYXBbUGtfRjgmMHhGRl0gPSBTRExLX0Y4OwotICAgIE1JU0Nfa2V5bWFwW1BrX0Y5JjB4RkZdID0gU0RMS19GOTsKLSAgICBNSVNDX2tleW1hcFtQa19GMTAmMHhGRl0gPSBTRExLX0YxMDsKLSAgICBNSVNDX2tleW1hcFtQa19GMTEmMHhGRl0gPSBTRExLX0YxMTsKLSAgICBNSVNDX2tleW1hcFtQa19GMTImMHhGRl0gPSBTRExLX0YxMjsKLSAgICBNSVNDX2tleW1hcFtQa19GMTMmMHhGRl0gPSBTRExLX0YxMzsKLSAgICBNSVNDX2tleW1hcFtQa19GMTQmMHhGRl0gPSBTRExLX0YxNDsKLSAgICBNSVNDX2tleW1hcFtQa19GMTUmMHhGRl0gPSBTRExLX0YxNTsKLQotICAgIE1JU0Nfa2V5bWFwW1BrX051bV9Mb2NrJjB4RkZdID0gU0RMS19OVU1MT0NLOwotICAgIE1JU0Nfa2V5bWFwW1BrX0NhcHNfTG9jayYweEZGXSA9IFNETEtfQ0FQU0xPQ0s7Ci0gICAgTUlTQ19rZXltYXBbUGtfU2Nyb2xsX0xvY2smMHhGRl0gPSBTRExLX1NDUk9MTE9DSzsKLSAgICBNSVNDX2tleW1hcFtQa19TaGlmdF9SJjB4RkZdID0gU0RMS19SU0hJRlQ7Ci0gICAgTUlTQ19rZXltYXBbUGtfU2hpZnRfTCYweEZGXSA9IFNETEtfTFNISUZUOwotICAgIE1JU0Nfa2V5bWFwW1BrX0NvbnRyb2xfUiYweEZGXSA9IFNETEtfUkNUUkw7Ci0gICAgTUlTQ19rZXltYXBbUGtfQ29udHJvbF9MJjB4RkZdID0gU0RMS19MQ1RSTDsKLSAgICBNSVNDX2tleW1hcFtQa19BbHRfUiYweEZGXSA9IFNETEtfUkFMVDsKLSAgICBNSVNDX2tleW1hcFtQa19BbHRfTCYweEZGXSA9IFNETEtfTEFMVDsKLSAgICBNSVNDX2tleW1hcFtQa19NZXRhX1ImMHhGRl0gPSBTRExLX1JNRVRBOwotICAgIE1JU0Nfa2V5bWFwW1BrX01ldGFfTCYweEZGXSA9IFNETEtfTE1FVEE7Ci0gICAgTUlTQ19rZXltYXBbUGtfU3VwZXJfTCYweEZGXSA9IFNETEtfTFNVUEVSOwotICAgIE1JU0Nfa2V5bWFwW1BrX1N1cGVyX1ImMHhGRl0gPSBTRExLX1JTVVBFUjsKLSAgICBNSVNDX2tleW1hcFtQa19Nb2RlX3N3aXRjaCYweEZGXSA9IFNETEtfTU9ERTsgLyogIkFsdCBHciIga2V5ICAgICovCi0KLSAgICBNSVNDX2tleW1hcFtQa19IZWxwJjB4RkZdID0gU0RMS19IRUxQOwotICAgIE1JU0Nfa2V5bWFwW1BrX1ByaW50JjB4RkZdID0gU0RMS19QUklOVDsKLSAgICBNSVNDX2tleW1hcFtQa19CcmVhayYweEZGXSA9IFNETEtfQlJFQUs7Ci0gICAgTUlTQ19rZXltYXBbUGtfTWVudSYweEZGXSA9IFNETEtfTUVOVTsgICAgICAgIC8qIFdpbmRvd3MgIk1lbnUiIGtleSAqLwotCi0gICAgTUlTQ19rZXltYXBbUGtfSHlwZXJfUiYweEZGXSA9IFNETEtfUlNVUEVSOyAgIC8qIFJpZ2h0ICJXaW5kb3dzIiAqLwotCi0gICAgLyogTGVmdCAiV2luZG93cyIga2V5LCBidXQgaXQgY2FuJ3QgYmUgY2F0Y2hlZCBieSBhcHBsaWNhdGlvbiAqLwotICAgIE1JU0Nfa2V5bWFwW1BrX0h5cGVyX0wmMHhGRl0gPSBTRExLX0xTVVBFUjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FwOwotCi1TRExfa2V5c3ltICpwaF9UcmFuc2xhdGVLZXkoUGhLZXlFdmVudF90ICprZXksIFNETF9rZXlzeW0gKmtleXN5bSkKLXsKLSAgICAvKiAnc3ltJyBpcyBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBrZXkgd2l0aCBtb2RpZmllcnMgYXBwbGllZCB0byBpdC4KLSAgICAgICBUaGlzIG1lbWJlciBpcyB2YWxpZCBvbmx5IGlmIFBrX0tGX1N5bV9WYWxpZCBpcyBzZXQgaW4gdGhlIGtleV9mbGFncy4KLSAgICAgICBXZSB3aWxsIGFzc3VtZSBpdCBpcyB2YWxpZC4gKi8KLQotICAgIC8qIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNhcCAmIHNjYW5jb2RlIGlzIHZhbGlkICovCi0KLSAgICBjYXAgPSBrZXktPmtleV9jYXA7Ci0KLSAgICBzd2l0Y2ggKGNhcD4+OCkKLSAgICB7Ci0gICAgICAgIGNhc2UgMHgwMDogIC8qIExhdGluIDEgKi8KLSAgICAgICAgY2FzZSAweDAxOiAgLyogTGF0aW4gMiAqLwotICAgICAgICBjYXNlIDB4MDI6ICAvKiBMYXRpbiAzICovCi0gICAgICAgIGNhc2UgMHgwMzogIC8qIExhdGluIDQgKi8KLSAgICAgICAgY2FzZSAweDA0OiAgLyogS2F0YWthbmEgKi8KLSAgICAgICAgY2FzZSAweDA1OiAgLyogQXJhYmljICovCi0gICAgICAgIGNhc2UgMHgwNjogIC8qIEN5cmlsbGljICovCi0gICAgICAgIGNhc2UgMHgwNzogIC8qIEdyZWVrICovCi0gICAgICAgIGNhc2UgMHgwODogIC8qIFRlY2huaWNhbCAqLwotICAgICAgICBjYXNlIDB4MEE6ICAvKiBQdWJsaXNoaW5nICovCi0gICAgICAgIGNhc2UgMHgwQzogIC8qIEhlYnJldyAqLwotICAgICAgICBjYXNlIDB4MEQ6ICAvKiBUaGFpICovCi0gICAgICAgICAgICAgICAgICAga2V5c3ltLT5zeW0gPSAoU0RMS2V5KShjYXAmMHhGRik7Ci0gICAgICAgICAgICAgICAgICAgLyogTWFwIGNhcGl0YWwgbGV0dGVyIHN5bXMgdG8gbG93ZXJjYXNlICovCi0gICAgICAgICAgICAgICAgICAgaWYgKChrZXlzeW0tPnN5bSA+PSAnQScpJiYoa2V5c3ltLT5zeW0gPD0gJ1onKSkKLSAgICAgICAgICAgICAgICAgICAgICAga2V5c3ltLT5zeW0gKz0gKCdhJy0nQScpOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDB4RjA6Ci0gICAgICAgICAgICAgICAgICAga2V5c3ltLT5zeW0gPSBNSVNDX2tleW1hcFtjYXAmMHhGRl07Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAga2V5c3ltLT5zeW0gPSBTRExLX1VOS05PV047ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGtleXN5bS0+c2NhbmNvZGUgPSBrZXktPmtleV9zY2FuOwotICAgIGtleXN5bS0+dW5pY29kZSA9IDA7Ci0KLSAgICBpZiAoU0RMX1RyYW5zbGF0ZVVOSUNPREUpCi0gICAgewotICAgICAgICBjaGFyIHV0ZjhbTUJfQ1VSX01BWF07Ci0gICAgICAgIGludCB1dGY4bGVuOwotICAgICAgICB3Y2hhcl90IHVuaWNvZGU7Ci0KLSAgICAgICAgc3dpdGNoIChrZXlzeW0tPnNjYW5jb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgIC8qIEVzYyBrZXkgKi8KLSAgICAgICAgICAgY2FzZSAweDAxOiBrZXlzeW0tPnVuaWNvZGUgPSAyNzsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgLyogQmFja1NwYWNlIGtleSAqLwotICAgICAgICAgICBjYXNlIDB4MEU6IGtleXN5bS0+dW5pY29kZSA9IDEyNzsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgLyogRW50ZXIga2V5ICovCi0gICAgICAgICAgIGNhc2UgMHgxQzoga2V5c3ltLT51bmljb2RlID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgdXRmOGxlbiA9IFBoS2V5VG9NYih1dGY4LCBrZXkpOwotICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGY4bGVuID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdXRmOGxlbiA9IG1idG93YygmdW5pY29kZSwgdXRmOCwgdXRmOGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0ZjhsZW4gPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3ltLT51bmljb2RlID0gdW5pY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gKGtleXN5bSk7Ci19Ci0KLXZvaWQgcGhfSW5pdE9TS2V5bWFwKF9USElTKQotewotICAgIHBoX0luaXRLZXltYXAoKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9ldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX2V2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MTUyZmUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX2V2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfX1NETF9QSF9FVkVOVFNfSF9fCi0jZGVmaW5lIF9fU0RMX1BIX0VWRU5UU19IX18KLQotI2luY2x1ZGUgIlNETF9waF92aWRlby5oIgotCi0jZGVmaW5lIFBIX1NETF9NQVhfUkVDVFMgMjU2Ci0jZGVmaW5lIFBIX0VWRU5UX1NBRkVUWV9QT09MIDUxMgotI2RlZmluZSBFVkVOVF9TSVpFIChzaXplb2YoUGhFdmVudF90KSArIDEwMDAgKyBQSF9FVkVOVF9TQUZFVFlfUE9PTCkKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBwaF9Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgcGhfUHVtcEV2ZW50cyhfVEhJUyk7Ci0KLSNlbmRpZiAvKiBfX1NETF9QSF9FVkVOVFNfSF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZ2wuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9nbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2UxNmQyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9nbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlICJTREwuaCIKLSNpbmNsdWRlICJTRExfcGhfZ2wuaCIKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLQotI2lmIChfTlRPX1ZFUlNJT04gPj0gNjMwKQotICAgIC8qIFBob3RvbkdMIGZ1bmN0aW9ucyAqLwotICAgIEdMUEhfREVDTEFSRV9GVU5DUzsKLSNlbmRpZiAvKiA2LjMuMCAqLwotCi0jaWYgKF9OVE9fVkVSU0lPTiA8IDYzMCkKLXZvaWQgcGhfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpCi17Ci0gICAgUGdTZXRSZWdpb24oUHRXaWRnZXRSaWQod2luZG93KSk7Ci0gICAgUGRPcGVuR0xDb250ZXh0U3dhcEJ1ZmZlcnMob2dsY3R4KTsKLX0KLSNlbHNlCi12b2lkIHBoX0dMX1N3YXBCdWZmZXJzKF9USElTKQotewotICAgIHFueGdsX3N3YXBfYnVmZmVycyhvZ2xidWZmZXJzKTsKLX0KLSNlbmRpZiAvKiA2LjMuMCAqLwotCi1pbnQgcGhfR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSkKLXsKLSAgICBzd2l0Y2ggKGF0dHJpYikKLSAgICB7Ci0gICAgICAgIGNhc2UgU0RMX0dMX0RPVUJMRUJVRkZFUjoKLSAgICAgICAgICAgICAqdmFsdWU9dGhpcy0+Z2xfY29uZmlnLmRvdWJsZV9idWZmZXI7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0RMX0dMX1NURU5DSUxfU0laRToKLSAgICAgICAgICAgICAqdmFsdWU9dGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTRExfR0xfREVQVEhfU0laRToKLSAgICAgICAgICAgICAqdmFsdWU9dGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemU7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0jaWYgKF9OVE9fVkVSU0lPTiA+PSA2MzApCi0gICAgICAgIGNhc2UgU0RMX0dMX1JFRF9TSVpFOgotICAgICAgICAgICAgICp2YWx1ZT10aGlzLT5nbF9jb25maWcucmVkX3NpemU7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0RMX0dMX0dSRUVOX1NJWkU6Ci0gICAgICAgICAgICAgKnZhbHVlPXRoaXMtPmdsX2NvbmZpZy5ncmVlbl9zaXplOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNETF9HTF9CTFVFX1NJWkU6Ci0gICAgICAgICAgICAgKnZhbHVlPXRoaXMtPmdsX2NvbmZpZy5ibHVlX3NpemU7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0RMX0dMX0FMUEhBX1NJWkU6Ci0gICAgICAgICAgICAgKnZhbHVlPXRoaXMtPmdsX2NvbmZpZy5hbHBoYV9zaXplOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNETF9HTF9BQ0NVTV9SRURfU0laRToKLSAgICAgICAgICAgICAqdmFsdWU9dGhpcy0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNETF9HTF9BQ0NVTV9HUkVFTl9TSVpFOgotICAgICAgICAgICAgICp2YWx1ZT10aGlzLT5nbF9jb25maWcuYWNjdW1fZ3JlZW5fc2l6ZTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTRExfR0xfQUNDVU1fQkxVRV9TSVpFOgotICAgICAgICAgICAgICp2YWx1ZT10aGlzLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNETF9HTF9BQ0NVTV9BTFBIQV9TSVpFOgotICAgICAgICAgICAgICp2YWx1ZT10aGlzLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTRExfR0xfU1RFUkVPOgotICAgICAgICAgICAgICp2YWx1ZT10aGlzLT5nbF9jb25maWcuc3RlcmVvOwotICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIDYuMy4wICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgKnZhbHVlPTA7Ci0gICAgICAgICAgICAgcmV0dXJuKC0xKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZiAoX05UT19WRVJTSU9OIDwgNjMwKQotaW50IHBoX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyKiBwYXRoKQotewotICAgIC8qIGlmIGNvZGUgY29tcGlsZWQgd2l0aCBTRExfVklERU9fT1BFTkdMLCB0aGF0IG1lYW4gdGhhdCBsaWJyYXJ5IGFscmVhZHkgbGlua2VkICovCi0gICAgdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAxOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZWxzZQotaW50IHBoX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyKiBwYXRoKQotewotICAgIHZvaWQqIGhhbmRsZTsKLSAgICBpbnQgZGxvcGVuX2ZsYWdzPVJUTERfV09STEQgfCBSVExEX0dST1VQOwotCi0gICAgaWYgKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlIT1OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaGFuZGxlID0gZGxvcGVuKHBhdGgsIGRsb3Blbl9mbGFncyk7Ci0KLSAgICBpZiAoaGFuZGxlPT1OVUxMKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9HTF9Mb2FkTGlicmFyeSgpOiBDb3VsZCBub3QgbG9hZCBPcGVuR0wgbGlicmFyeSIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUgPSBoYW5kbGU7Ci0gICAgdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAxOwotCi0gICAgU0RMX3N0cmxjcHkodGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoLCBwYXRoLCBTRExfYXJyYXlzaXplKHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCkpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogNi4zLjAgKi8KLQotI2lmIChfTlRPX1ZFUlNJT04gPCA2MzApCi12b2lkKiBwaF9HTF9HZXRQcm9jQWRkcmVzcyhfVEhJUywgY29uc3QgY2hhciogcHJvYykKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbHNlCi12b2lkKiBwaF9HTF9HZXRQcm9jQWRkcmVzcyhfVEhJUywgY29uc3QgY2hhciogcHJvYykKLXsKLSAgICB2b2lkKiBmdW5jdGlvbjsKLQotICAgIGlmICh0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZT09TlVMTCkKLSAgICB7Ci0gICAgICAgIHBoX0dMX0xvYWRMaWJyYXJ5KHRoaXMsIERFRkFVTFRfT1BFTkdMKTsKLSAgICAgICAgaWYgKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlPT1OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgIAotICAgIGZ1bmN0aW9uPXFueGdsX2dldF9mdW5jKHByb2MsIG9nbGN0eCwgMCk7Ci0gICAgaWYgKGZ1bmN0aW9uPT1OVUxMKQotICAgIHsKLSAgICAgICAgZnVuY3Rpb249ZGxzeW0odGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUsIHByb2MpOwotICAgIH0KLQotICAgIHJldHVybiBmdW5jdGlvbjsKLX0KLSNlbmRpZiAvKiA2LjMuMCAqLwotCi0jaWYgKF9OVE9fVkVSU0lPTiA8IDYzMCkKLWludCBwaF9HTF9NYWtlQ3VycmVudChfVEhJUykKLXsKLSAgICBQZ1NldFJlZ2lvbihQdFdpZGdldFJpZCh3aW5kb3cpKTsKLQotICAgIGlmIChvZ2xjdHghPU5VTEwpCi0gICAgewotICAgICAgICBQaERDU2V0Q3VycmVudChvZ2xjdHgpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotI2Vsc2UKLWludCBwaF9HTF9NYWtlQ3VycmVudChfVEhJUykKLXsKLSAgICBQZ1NldFJlZ2lvbihQdFdpZGdldFJpZCh3aW5kb3cpKTsKLQotICAgIGlmIChvZ2xjdHghPU5VTEwpCi0gICAgewotICAgICAgICBpZiAocW54Z2xfc2V0X2N1cnJlbnQob2dsY3R4KSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiA2LjMuMCAqLwotCi0jaWYgKF9OVE9fVkVSU0lPTiA8IDYzMCkKLQotLyogVGhpcyBjb2RlIGlzIGFjdHVhbCBmb3IgdGhlIFBob3RvbjNEIFJ1bnRpbWUgd2hpY2ggd2FzIGF2YWlsYWJsZSBwcmlvciB0byA2LjMgb25seSAqLwotCi1pbnQgcGhfU2V0dXBPcGVuR0xDb250ZXh0KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLSAgICBQaERpbV90IGRpbTsKLSAgICB1aW50NjRfdCBPR0xBdHRyaWJbUEhfT0dMX01BWF9BVFRSSUJTXTsKLSAgICBpbnQgZXhwb3NlcG9zdD0wOwotICAgIGludCBPR0xhcmdjOwotCi0gICAgZGltLnc9d2lkdGg7Ci0gICAgZGltLmg9aGVpZ2h0OwotICAgIAotICAgIGlmICgob2dsY3R4IT1OVUxMKSAmJiAob2dsZmxhZ3M9PWZsYWdzKSAmJiAob2dsYnBwPT1icHApKQotICAgIHsKLSAgICAgICBQZE9wZW5HTENvbnRleHRSZXNpemUob2dsY3R4LCAmZGltKTsKLSAgICAgICBQaERDU2V0Q3VycmVudChvZ2xjdHgpOwotICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIGlmIChvZ2xjdHghPU5VTEwpCi0gICAgICAgewotICAgICAgICAgIFBoRENTZXRDdXJyZW50KE5VTEwpOwotICAgICAgICAgIFBoRENSZWxlYXNlKG9nbGN0eCk7Ci0gICAgICAgICAgb2dsY3R4PU5VTEw7Ci0gICAgICAgICAgZXhwb3NlcG9zdD0xOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBPR0xhcmdjPTA7Ci0gICAgaWYgKHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplKQotICAgIHsKLSAgICAgICAgT0dMQXR0cmliW09HTGFyZ2MrK109UEhPR0xfQVRUUklCX0RFUFRIX0JJVFM7Ci0gICAgICAgIE9HTEF0dHJpYltPR0xhcmdjKytdPXRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplOwotICAgIH0KLSAgICBpZiAodGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZSkKLSAgICB7Ci0gICAgICAgIE9HTEF0dHJpYltPR0xhcmdjKytdPVBIT0dMX0FUVFJJQl9TVEVOQ0lMX0JJVFM7Ci0gICAgICAgIE9HTEF0dHJpYltPR0xhcmdjKytdPXRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemU7Ci0gICAgfQotICAgIE9HTEF0dHJpYltPR0xhcmdjKytdPVBIT0dMX0FUVFJJQl9GT1JDRV9TVzsKLSAgICBpZiAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikKLSAgICB7Ci0gICAgICAgIE9HTEF0dHJpYltPR0xhcmdjKytdPVBIT0dMX0FUVFJJQl9GVUxMU0NSRUVOOwotICAgICAgICBPR0xBdHRyaWJbT0dMYXJnYysrXT1QSE9HTF9BVFRSSUJfRElSRUNUOwotICAgICAgICBPR0xBdHRyaWJbT0dMYXJnYysrXT1QSE9HTF9BVFRSSUJfRlVMTFNDUkVFTl9CRVNUOwotICAgICAgICBPR0xBdHRyaWJbT0dMYXJnYysrXT1QSE9HTF9BVFRSSUJfRlVMTFNDUkVFTl9DRU5URVI7Ci0gICAgfQotICAgIE9HTEF0dHJpYltPR0xhcmdjKytdPVBIT0dMX0FUVFJJQl9OT05FOwotCi0gICAgaWYgKHRoaXMtPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyKQotICAgIHsKLSAgICAgICAgb2dsY3R4PVBkQ3JlYXRlT3BlbkdMQ29udGV4dCgyLCAmZGltLCAwLCBPR0xBdHRyaWIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvZ2xjdHg9UGRDcmVhdGVPcGVuR0xDb250ZXh0KDEsICZkaW0sIDAsIE9HTEF0dHJpYik7Ci0gICAgfQotCi0gICAgaWYgKG9nbGN0eD09TlVMTCkKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBPcGVuR0xDb250ZXh0KCk6IGNhbm5vdCBjcmVhdGUgT3BlbkdMIGNvbnRleHQgIVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBQaERDU2V0Q3VycmVudChvZ2xjdHgpOwotCi0gICAgUHRGbHVzaCgpOwotCi0gICAgb2dsZmxhZ3M9ZmxhZ3M7Ci0gICAgb2dsYnBwPWJwcDsKLQotICAgIGlmIChleHBvc2Vwb3N0IT0wKQotICAgIHsKLSAgICAgICAgLyogT3BlbkdMIGNvbnRleHQgaGFzIGJlZW4gcmVjcmVhdGVkLCBzbyByZXBvcnQgYWJvdXQgdGhpcyBmYWN0ICovCi0gICAgICAgIFNETF9Qcml2YXRlRXhwb3NlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlIC8qIF9OVE9fVkVSU0lPTiAqLwotCi0vKiBUaGlzIGNvZGUgaXMgYWN0dWFsIGZvciB0aGUgYnVpbHQtaW4gUGhHTCBzdXBwb3J0LCB3aGljaCBiZWNhbWUgYXZhaWxhYmxlIHNpbmNlIDYuMyAqLwotCi1pbnQgcGhfU2V0dXBPcGVuR0xDb250ZXh0KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLSAgICBxbnhnbF9idWZfYXR0cmliX3QgcW54Z2xfYXR0cmlic1tQSF9PR0xfTUFYX0FUVFJJQlNdOwotICAgIHFueGdsX2J1Zl9hdHRyaWJfdCogcW54Z2xfYXR0cmlic19zbGlkZTsKLSAgICBpbnQgbnVtX2ludGVyZmFjZXMgPSAwOwotICAgIGludCBudW1fYnVmZmVycyA9IDA7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBPcGVuR0wgc3Vic3lzdGVtICovCi0KLSAgICBudW1faW50ZXJmYWNlcyA9IHFueGdsX2luaXQoTlVMTCwgTlVMTCwgMCk7Ci0KLSAgICBpZiAobnVtX2ludGVyZmFjZXMgPCAwKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cE9wZW5HTENvbnRleHQoKTogY2Fubm90IGluaXRpYWxpemUgT3BlbkdMIHN1YnN5c3RlbSAhXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAobnVtX2ludGVyZmFjZXMgPT0gMCkKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBPcGVuR0xDb250ZXh0KCk6IHRoZXJlIGFyZSBubyBhdmFpbGFibGUgT3BlbkdMIHJlbmRlcmVycyB3YXMgZm91bmQgIVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBEcml2ZXIgaXMgbGlua2VkICovCi0gICAgdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQ9MTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMgKi8KLSAgICBxbnhnbF9hdHRyaWJzX3NsaWRlPXFueGdsX2F0dHJpYnM7Ci0KLSAgICAvKiBEZXB0aCBzaXplICovCi0gICAgaWYgKHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplKQotICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJzZXR0ZWQgZGVwdGggc2l6ZSAlZFxuIiwgdGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemUpOwotICAgICAgICBxbnhnbF9hdHRyaWJzX3NsaWRlID0gcW54Z2xfYXR0cmliX3NldF9kZXB0aChxbnhnbF9hdHRyaWJzX3NsaWRlLCB0aGlzLT5nbF9jb25maWcuZGVwdGhfc2l6ZSk7Ci0gICAgfQotCi0gICAgLyogU3RlbmNpbCBzaXplICovCi0gICAgaWYgKHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemUpCi0gICAgewotICAgICAgICBxbnhnbF9hdHRyaWJzX3NsaWRlID0gcW54Z2xfYXR0cmliX3NldF9zdGVuY2lsKHFueGdsX2F0dHJpYnNfc2xpZGUsIHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemUpOwotICAgIH0KLQotICAgIC8qIFRoZSBzdW0gb2YgdGhlIGFjY3VtIGJpdHMgb2YgZWFjaCBjaGFubmVsICovCi0gICAgaWYgKCh0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemUgIT0gMCkgJiYgKHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemUgIT0gMCkgJiYKLSAgICAgICAgKHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplICE9IDApKQotICAgIHsKLSAgICAgICAgcW54Z2xfYXR0cmlic19zbGlkZSA9IHFueGdsX2F0dHJpYl9zZXRfYWNjdW0ocW54Z2xfYXR0cmlic19zbGlkZSwKLSAgICAgICAgICAgdGhpcy0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplICsgdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2JsdWVfc2l6ZSArCi0gICAgICAgICAgIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplICsgdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemUpOwotICAgIH0KLSAgICAKLSAgICAvKiBTdGVyZW8gbW9kZSAqLwotICAgIGlmICh0aGlzLT5nbF9jb25maWcuc3RlcmVvKQotICAgIHsKLSAgICAgICAgcW54Z2xfYXR0cmlic19zbGlkZSA9IHFueGdsX2F0dHJpYl9zZXRfc3RlcmVvKHFueGdsX2F0dHJpYnNfc2xpZGUpOwotICAgIH0KLQotICAgIC8qIEZ1bGxzY3JlZW4gbW9kZSAqLwotICAgIGlmICgoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4pCi0gICAgewotICAgICAgICBxbnhnbF9hdHRyaWJzX3NsaWRlID0gcW54Z2xfYXR0cmliX3NldF9oaW50X2Z1bGxzY3JlZW4ocW54Z2xfYXR0cmlic19zbGlkZSk7Ci0gICAgfQotICAgIAotICAgIC8qIERvdWJsZSBidWZmZXJpbmcgbW9kZSAqLwotICAgIGlmICh0aGlzLT5nbF9jb25maWcuZG91YmxlX2J1ZmZlcikKLSAgICB7Ci0gICAgICAgIG51bV9idWZmZXJzPTI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG51bV9idWZmZXJzPTE7Ci0gICAgfQotCi0gICAgLyogTG9hZGluZyB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgc28gd2UgY2FuIHVzZSB0aGUgZXh0ZW5zaW9ucyAqLwotICAgIEdMUEhfTE9BRF9GVU5DU19HQyhvZ2xjdHgpOwotCi0gICAgLyogU2V0IHRoZSBidWZmZXJzIHJlZ2lvbiB0byBiZSB0aGF0IG9mIG91ciB3aW5kb3cncyByZWdpb24gKi8KLSAgICBxbnhnbF9hdHRyaWJzX3NsaWRlID0gZ2xwaF9hdHRyaWJfc2V0X3JlZ2lvbihxbnhnbF9hdHRyaWJzX3NsaWRlLCBQdFdpZGdldFJpZCh3aW5kb3cpKTsKLQotICAgIC8qIEVuZCBvZiB0aGUgYXR0cmlidXRlcyBhcnJheSAqLwotICAgIHFueGdsX2F0dHJpYnNfc2xpZGUgPSBxbnhnbF9hdHRyaWJfc2V0X2VuZChxbnhnbF9hdHRyaWJzX3NsaWRlKTsKLSAgICAKLSAgICAvKiBDcmVhdGUgdGhlIGJ1ZmZlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbG9yIG1vZGVsICovCi0gICAgZnByaW50ZihzdGRlcnIsICJBUkdCOiAlZCwgJWQsICVkLCAlZFxuIiwgdGhpcy0+Z2xfY29uZmlnLmFscGhhX3NpemUsIHRoaXMtPmdsX2NvbmZpZy5yZWRfc2l6ZSwgdGhpcy0+Z2xfY29uZmlnLmdyZWVuX3NpemUsIHRoaXMtPmdsX2NvbmZpZy5ibHVlX3NpemUpOwotICAgIG9nbGJ1ZmZlcnMgPSBxbnhnbF9idWZmZXJzX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICBRTlhHTF9GT1JNQVRfQkVTVF9SR0IsCi0vKiAgICAgICAgICAgICAgICAgX19RTlhHTF9CVUlMRF9GT1JNQVQoMCwgX19RTlhHTF9DT0xPUl9NT0RFTF9SR0IsIHRoaXMtPmdsX2NvbmZpZy5hbHBoYV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgdGhpcy0+Z2xfY29uZmlnLnJlZF9zaXplLCB0aGlzLT5nbF9jb25maWcuZ3JlZW5fc2l6ZSwgdGhpcy0+Z2xfY29uZmlnLmJsdWVfc2l6ZSksICovCi0gICAgICAgICAgICAgICAgIG51bV9idWZmZXJzLCB3aWR0aCwgaGVpZ2h0LCBxbnhnbF9hdHRyaWJzLCAtMSk7Ci0KLQotICAgIGlmIChvZ2xidWZmZXJzID09IE5VTEwpCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldHVwT3BlbkdMQ29udGV4dCgpOiBmYWlsZWQgdG8gY3JlYXRlIE9wZW5HTCBidWZmZXJzICFcbiIpOwotICAgICAgICBxbnhnbF9maW5pc2goKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSBhIFFOWEdMIGNvbnRleHQgZm9yIHRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgYnVmZmVyICovCi0gICAgb2dsY3R4ID0gcW54Z2xfY29udGV4dF9jcmVhdGUob2dsYnVmZmVycywgTlVMTCk7Ci0KLSAgICBpZiAob2dsY3R4ID09IE5VTEwpCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldHVwT3BlbkdMQ29udGV4dCgpOiBmYWlsZWQgdG8gY3JlYXRlIE9wZW5HTCBjb250ZXh0ICFcbiIpOwotICAgICAgICBxbnhnbF9idWZmZXJzX2Rlc3Ryb3kob2dsYnVmZmVycyk7Ci0gICAgICAgIHFueGdsX2ZpbmlzaCgpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogQXR0ZW1wdCB0byBtYWtlIHRoZSBjb250ZXh0IGN1cnJlbnQgc28gd2UgY2FuIHVzZSBPcGVuR0wgY29tbWFuZHMgKi8KLSAgICBpZiAocW54Z2xfc2V0X2N1cnJlbnQob2dsY3R4KSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBPcGVuR0xDb250ZXh0KCk6IGZhaWxlZCB0byBtYWtlIHRoZSBPcGVuR0wgY29udGV4dCBjdXJyZW50ICFcbiIpOwotICAgICAgICBxbnhnbF9jb250ZXh0X2Rlc3Ryb3kob2dsY3R4KTsKLSAgICAgICAgcW54Z2xfYnVmZmVyc19kZXN0cm95KG9nbGJ1ZmZlcnMpOwotICAgICAgICBxbnhnbF9maW5pc2goKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIFB0Rmx1c2goKTsKLQotICAgIG9nbGZsYWdzPWZsYWdzOwotICAgIG9nbGJwcD1icHA7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIF9OVE9fVkVSU0lPTiAqLwotCi0jZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX2dsLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc0OWJkOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9fU0RMX1BIX0dMX0hfXwotI2RlZmluZSBfX1NETF9QSF9HTF9IX18KLQotI2luY2x1ZGUgIlNETF9waF92aWRlby5oIgotCi0jZGVmaW5lIERFRkFVTFRfT1BFTkdMICIvdXNyL2xpYi9saWJHTC5zbyIKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLSAgICB2b2lkICBwaF9HTF9Td2FwQnVmZmVycyhfVEhJUyk7Ci0gICAgaW50ICAgcGhfR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSk7Ci0gICAgaW50ICAgcGhfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIqIHBhdGgpOwotICAgIHZvaWQqIHBoX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyKiBwcm9jKTsKLSAgICBpbnQgICBwaF9HTF9NYWtlQ3VycmVudChfVEhJUyk7Ci0KLSAgICBpbnQgICBwaF9TZXR1cE9wZW5HTENvbnRleHQoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi0KLSNlbmRpZiAvKiBfX1NETF9QSF9HTF9IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9pbWFnZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX2ltYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OWFkOWUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX2ltYWdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8UGguaD4KLSNpbmNsdWRlIDxwaG90b24vUGcuaD4KLQotI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICJTRExfcGhfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfcGhfaW1hZ2VfYy5oIgotI2luY2x1ZGUgIlNETF9waF9tb2Rlc19jLmgiCi0jaW5jbHVkZSAiU0RMX3BoX2dsLmgiCi0KLWludCBwaF9TZXR1cEltYWdlKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKQotewotICAgIFBnQ29sb3JfdCogcGFsZXR0ZT1OVUxMOwotICAgIGludCB0eXBlPTA7Ci0gICAgaW50IGJwcDsKLSAgICAKLSAgICBicHA9c2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKLQotICAgIC8qIERldGVybWluZSBpbWFnZSB0eXBlICovCi0gICAgc3dpdGNoKGJwcCkKLSAgICB7Ci0gICAgICAgIGNhc2UgODp7Ci0gICAgICAgICAgICB0eXBlID0gUGdfSU1BR0VfUEFMRVRURV9CWVRFOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE1OnsKLSAgICAgICAgICAgIHR5cGUgPSBQZ19JTUFHRV9ESVJFQ1RfNTU1OyAKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjp7Ci0gICAgICAgICAgICB0eXBlID0gUGdfSU1BR0VfRElSRUNUXzU2NTsgCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6ewotICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX0RJUkVDVF84ODg7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6ewotICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX0RJUkVDVF84ODg4OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OnsKLSAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBJbWFnZSgpOiB1bnN1cHBvcnRlZCBicHA9JWQgIVxuIiwgYnBwKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBwYWxldHRlIGVtdWxhdGlvbiBjb2RlICovCi0gICAgaWYgKChicHA9PTgpICYmIChkZXNrdG9wcGFsPT1TRExQSF9QQUxfRU1VTEFURSkpCi0gICAgewotICAgICAgICAvKiBjcmVhdGluZyBpbWFnZSBwYWxldHRlICovCi0gICAgICAgIHBhbGV0dGU9U0RMX21hbGxvYyhfUGdfTUFYX1BBTEVUVEUqc2l6ZW9mKFBnQ29sb3JfdCkpOwotICAgICAgICBpZiAocGFsZXR0ZT09TlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cEltYWdlKCk6IGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcGFsZXR0ZSAhXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBQZ0dldFBhbGV0dGUocGFsZXR0ZSk7Ci0KLSAgICAgICAgLyogdXNpbmcgc2hhcmVkIG1lbW9yeSBmb3Igc3BlZWQgKHNldCBsYXN0IHBhcmFtIHRvIDEpICovCi0gICAgICAgIGlmICgoU0RMX0ltYWdlID0gUGhDcmVhdGVJbWFnZShOVUxMLCBzY3JlZW4tPncsIHNjcmVlbi0+aCwgdHlwZSwgcGFsZXR0ZSwgX1BnX01BWF9QQUxFVFRFLCAxKSkgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cEltYWdlKCk6IFBoQ3JlYXRlSW1hZ2UoKSBmYWlsZWQgZm9yIGJwcD04ICFcbiIpOwotICAgICAgICAgICAgU0RMX2ZyZWUocGFsZXR0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogdXNpbmcgc2hhcmVkIG1lbW9yeSBmb3Igc3BlZWQgKHNldCBsYXN0IHBhcmFtIHRvIDEpICovCi0gICAgICAgIGlmICgoU0RMX0ltYWdlID0gUGhDcmVhdGVJbWFnZShOVUxMLCBzY3JlZW4tPncsIHNjcmVlbi0+aCwgdHlwZSwgTlVMTCwgMCwgMSkpID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBJbWFnZSgpOiBQaENyZWF0ZUltYWdlKCkgZmFpbGVkIGZvciBicHA9JWQgIVxuIiwgYnBwKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNjcmVlbi0+cGl4ZWxzID0gU0RMX0ltYWdlLT5pbWFnZTsKLSAgICBzY3JlZW4tPnBpdGNoID0gU0RMX0ltYWdlLT5icGw7Ci0KLSAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IHBoX05vcm1hbFVwZGF0ZTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgcGhfU2V0dXBPQ0ltYWdlKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKQotewotICAgIGludCB0eXBlID0gMDsKLSAgICBpbnQgYnBwOwotCi0gICAgT0NJbWFnZS5mbGFncyA9IHNjcmVlbi0+ZmxhZ3M7Ci0gICAgCi0gICAgYnBwPXNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7Ci0KLSAgICAvKiBEZXRlcm1pbmUgaW1hZ2UgdHlwZSAqLwotICAgIHN3aXRjaChicHApCi0gICAgewotICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX1BBTEVUVEVfQllURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6ewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gUGdfSU1BR0VfRElSRUNUXzU1NTsgCi0JCX0KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6ewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gUGdfSU1BR0VfRElSRUNUXzU2NTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI0OnsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX0RJUkVDVF84ODg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMyOnsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX0RJUkVDVF84ODg4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDp7Ci0gICAgICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBPQ0ltYWdlKCk6IHVuc3VwcG9ydGVkIGJwcD0lZCAhXG4iLCBicHApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIEN1cnJlbnRseSBvZmZzY3JlZW4gY29udGV4dHMgd2l0aCB0aGUgc2FtZSBiaXQgZGVwdGggYXMgZGlzcGxheSBicHAgb25seSBjYW4gYmUgY3JlYXRlZCAqLwotICAgIE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQgPSBQZENyZWF0ZU9mZnNjcmVlbkNvbnRleHQoMCwgc2NyZWVuLT53LCBzY3JlZW4tPmgsIFBnX09TQ19NRU1fUEFHRV9BTElHTik7Ci0KLSAgICBpZiAoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cE9DSW1hZ2UoKTogUGRDcmVhdGVPZmZzY3JlZW5Db250ZXh0KCkgZnVuY3Rpb24gZmFpbGVkICFcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc2NyZWVuLT5waXRjaCA9IE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQtPnBpdGNoOwotCi0gICAgT0NJbWFnZS5kY19wdHIgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0KTsKLQotICAgIGlmIChPQ0ltYWdlLmRjX3B0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cE9DSW1hZ2UoKTogUGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKLSAgICAgICAgUGhEQ1JlbGVhc2UoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBPQ0ltYWdlLkZyYW1lRGF0YTAgPSBPQ0ltYWdlLmRjX3B0cjsKLSAgICBPQ0ltYWdlLkN1cnJlbnRGcmFtZURhdGEgPSBPQ0ltYWdlLkZyYW1lRGF0YTA7Ci0gICAgT0NJbWFnZS5jdXJyZW50ID0gMDsKLQotICAgIFBoRENTZXRDdXJyZW50KE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQpOwotCi0gICAgc2NyZWVuLT5waXhlbHMgPSBPQ0ltYWdlLkN1cnJlbnRGcmFtZURhdGE7Ci0KLSAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IHBoX09DVXBkYXRlOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBwaF9TZXR1cEZ1bGxTY3JlZW5JbWFnZShfVEhJUywgU0RMX1N1cmZhY2UqIHNjcmVlbikKLXsKLSAgICBPQ0ltYWdlLmZsYWdzID0gc2NyZWVuLT5mbGFnczsKLQotICAgIC8qIEJlZ2luIGRpcmVjdCBhbmQgZnVsbHNjcmVlbiBtb2RlICovCi0gICAgaWYgKCFwaF9FbnRlckZ1bGxTY3JlZW4odGhpcywgc2NyZWVuLCBQSF9FTlRFUl9ESVJFQ1RNT0RFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBzdG9yZSBwYWxldHRlIGZvciBmdWxsc2NyZWVuICovCi0gICAgaWYgKChzY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsPT04KSAmJiAoZGVza3RvcGJwcCE9OCkpCi0gICAgewotICAgICAgICBQZ0dldFBhbGV0dGUoc2F2ZWRwYWwpOwotICAgICAgICBQZ0dldFBhbGV0dGUoc3lzcGFscGgpOwotICAgIH0KLQotICAgIE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQgPSBQZENyZWF0ZU9mZnNjcmVlbkNvbnRleHQoMCwgMCwgMCwgUGdfT1NDX01BSU5fRElTUExBWSB8IFBnX09TQ19NRU1fUEFHRV9BTElHTiB8IFBnX09TQ19DUlRDX1NBRkUpOwotICAgIGlmIChPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0ID09IE5VTEwpCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldHVwRnVsbFNjcmVlbkltYWdlKCk6IFBkQ3JlYXRlT2Zmc2NyZWVuQ29udGV4dCgpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBpZiAoKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGKQotICAgIHsKLSAgICAgICAgT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQgPSBQZER1cE9mZnNjcmVlbkNvbnRleHQoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCwgUGdfT1NDX01FTV9QQUdFX0FMSUdOIHwgUGdfT1NDX0NSVENfU0FGRSk7Ci0gICAgICAgIGlmIChPQ0ltYWdlLm9mZnNjcmVlbl9iYWNrY29udGV4dCA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldHVwRnVsbFNjcmVlbkltYWdlKCk6IFBkQ3JlYXRlT2Zmc2NyZWVuQ29udGV4dChiYWNrKSBmdW5jdGlvbiBmYWlsZWQgIVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBPQ0ltYWdlLkZyYW1lRGF0YTAgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0KTsKLSAgICBpZiAoT0NJbWFnZS5GcmFtZURhdGEwID09IE5VTEwpCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldHVwRnVsbFNjcmVlbkltYWdlKCk6IFBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cigpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKLSAgICAgICAgcGhfRGVzdHJveUltYWdlKHRoaXMsIHNjcmVlbik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGKQotICAgIHsKLSAgICAgICAgT0NJbWFnZS5GcmFtZURhdGExID0gKHVuc2lnbmVkIGNoYXIgKilQZEdldE9mZnNjcmVlbkNvbnRleHRQdHIoT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQpOwotICAgICAgICBpZiAoT0NJbWFnZS5GcmFtZURhdGExID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBGdWxsU2NyZWVuSW1hZ2UoYmFjayk6IFBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cigpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKLSAgICAgICAgICAgIHBoX0Rlc3Ryb3lJbWFnZSh0aGlzLCBzY3JlZW4pOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogd2FpdCBmb3IgdGhlIGhhcmR3YXJlICovCi0gICAgUGdGbHVzaCgpOwotICAgIFBnV2FpdEhXSWRsZSgpOwotCi0gICAgaWYgKChzY3JlZW4tPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gU0RMX0RPVUJMRUJVRikKLSAgICB7Ci0gICAgICAgIE9DSW1hZ2UuY3VycmVudCA9IDA7Ci0gICAgICAgIFBoRENTZXRDdXJyZW50KE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQpOwotICAgICAgICBzY3JlZW4tPnBpdGNoID0gT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dC0+cGl0Y2g7Ci0gICAgICAgIHNjcmVlbi0+cGl4ZWxzID0gT0NJbWFnZS5GcmFtZURhdGEwOwotICAgICAgICAKLSAgICAgICAgLyogZW11bGF0ZSA2NDB4NDAwIHZpZGVvbW9kZSAqLwotICAgICAgICBpZiAodmlkZW9tb2RlX2VtdWxhdGVtb2RlPT0xKQotICAgICAgICB7Ci0gICAgICAgICAgIGludCBpOwotICAgICAgICAgICAKLSAgICAgICAgICAgZm9yIChpPTA7IGk8NDA7IGkrKykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICBTRExfbWVtc2V0KHNjcmVlbi0+cGl4ZWxzK3NjcmVlbi0+cGl0Y2gqaSwgMHgwMCwgc2NyZWVuLT5waXRjaCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZm9yIChpPTQ0MDsgaTw0ODA7IGkrKykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICBTRExfbWVtc2V0KHNjcmVlbi0+cGl4ZWxzK3NjcmVlbi0+cGl0Y2gqaSwgMHgwMCwgc2NyZWVuLT5waXRjaCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgc2NyZWVuLT5waXhlbHMrPXNjcmVlbi0+cGl0Y2gqNDA7Ci0gICAgICAgIH0KLSAgICAgICAgUGdTd2FwRGlzcGxheShPQ0ltYWdlLm9mZnNjcmVlbl9iYWNrY29udGV4dCwgMCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE9DSW1hZ2UuY3VycmVudCA9IDA7Ci0gICAgICAgIFBoRENTZXRDdXJyZW50KE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQpOwotICAgICAgICBzY3JlZW4tPnBpdGNoID0gT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dC0+cGl0Y2g7Ci0gICAgICAgIHNjcmVlbi0+cGl4ZWxzID0gT0NJbWFnZS5GcmFtZURhdGEwOwotCi0gICAgICAgIC8qIGVtdWxhdGUgNjQweDQwMCB2aWRlb21vZGUgKi8KLSAgICAgICAgaWYgKHZpZGVvbW9kZV9lbXVsYXRlbW9kZT09MSkKLSAgICAgICAgewotICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgCi0gICAgICAgICAgIGZvciAoaT0wOyBpPDQwOyBpKyspCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU0RMX21lbXNldChzY3JlZW4tPnBpeGVscytzY3JlZW4tPnBpdGNoKmksIDB4MDAsIHNjcmVlbi0+cGl0Y2gpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGZvciAoaT00NDA7IGk8NDgwOyBpKyspCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU0RMX21lbXNldChzY3JlZW4tPnBpeGVscytzY3JlZW4tPnBpdGNoKmksIDB4MDAsIHNjcmVlbi0+cGl0Y2gpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNjcmVlbi0+cGl4ZWxzKz1zY3JlZW4tPnBpdGNoKjQwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBwaF9PQ0RDVXBkYXRlOwotCi0gICAgLyogd2FpdCBmb3IgdGhlIGhhcmR3YXJlICovCi0gICAgUGdGbHVzaCgpOwotICAgIFBnV2FpdEhXSWRsZSgpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0KLWludCBwaF9TZXR1cE9wZW5HTEltYWdlKF9USElTLCBTRExfU3VyZmFjZSogc2NyZWVuKQotewotICAgIHRoaXMtPlVwZGF0ZVJlY3RzID0gcGhfT3BlbkdMVXBkYXRlOwotICAgIHNjcmVlbi0+cGl4ZWxzPU5VTEw7Ci0gICAgc2NyZWVuLT5waXRjaD1OVUxMOwotCi0gICAgI2lmIChfTlRPX1ZFUlNJT04gPj0gNjMwKQotICAgICAgICBpZiAoKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghcGhfRW50ZXJGdWxsU2NyZWVuKHRoaXMsIHNjcmVlbiwgUEhfSUdOT1JFX0RJUkVDVE1PREUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNjcmVlbi0+ZmxhZ3MgJj0gflNETF9GVUxMU0NSRUVOOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICNlbmRpZiAvKiA2LjMuMCAqLwotCi0gICAgaWYgKHBoX1NldHVwT3BlbkdMQ29udGV4dCh0aGlzLCBzY3JlZW4tPncsIHNjcmVlbi0+aCwgc2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCwgc2NyZWVuLT5mbGFncykhPTApCi0gICAgewotICAgICAgICBzY3JlZW4tPmZsYWdzICY9IH5TRExfT1BFTkdMOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi0KLXZvaWQgcGhfRGVzdHJveUltYWdlKF9USElTLCBTRExfU3VyZmFjZSogc2NyZWVuKQotewotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotICAgIGlmICgoc2NyZWVuLT5mbGFncyAmIFNETF9PUEVOR0wpPT1TRExfT1BFTkdMKQotICAgIHsKLSAgICAgICAgaWYgKG9nbGN0eCkKLSAgICAgICAgewotICAgICAgICAgICAgI2lmIChfTlRPX1ZFUlNJT04gPCA2MzApCi0gICAgICAgICAgICAgICAgUGhEQ1NldEN1cnJlbnQoTlVMTCk7Ci0gICAgICAgICAgICAgICAgUGhEQ1JlbGVhc2Uob2dsY3R4KTsKLSAgICAgICAgICAgICNlbHNlCi0gICAgICAgICAgICAgICAgcW54Z2xfY29udGV4dF9kZXN0cm95KG9nbGN0eCk7Ci0gICAgICAgICAgICAgICAgcW54Z2xfYnVmZmVyc19kZXN0cm95KG9nbGJ1ZmZlcnMpOwotICAgICAgICAgICAgICAgIHFueGdsX2ZpbmlzaCgpOwotICAgICAgICAgICAgI2VuZGlmIC8qIDYuMy4wICovCi0gICAgICAgICAgICBvZ2xjdHg9TlVMTDsKLSAgICAgICAgICAgIG9nbGJ1ZmZlcnM9TlVMTDsKLSAgICAgICAgICAgIG9nbGZsYWdzPTA7Ci0gICAgICAgICAgICBvZ2xicHA9MDsKLSAgICAgICAgfQotCi0gICAgICAgICNpZiAoX05UT19WRVJTSU9OID49IDYzMCkKLSAgICAgICAgICAgIGlmIChjdXJyZW50bHlfZnVsbHNjcmVlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaF9MZWF2ZUZ1bGxTY3JlZW4odGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICNlbmRpZiAvKiA2LjMuMCAqLwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTCAqLwotCi0gICAgaWYgKGN1cnJlbnRseV9mdWxsc2NyZWVuKQotICAgIHsKLSAgICAgICAgLyogaWYgd2UgcmlnaHQgbm93IGluIDhicHAgZnVsbHNjcmVlbiB3ZSBtdXN0IHJlbGVhc2UgcGFsZXR0ZSAqLwotICAgICAgICBpZiAoKHNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw9PTgpICYmIChkZXNrdG9wYnBwIT04KSkKLSAgICAgICAgewotICAgICAgICAgICAgUGdTZXRQYWxldHRlKHN5c3BhbHBoLCAwLCAtMSwgMCwgMCwgMCk7Ci0gICAgICAgICAgICBQZ1NldFBhbGV0dGUoc2F2ZWRwYWwsIDAsIDAsIF9QZ19NQVhfUEFMRVRURSwgUGdfUEFMU0VUX0dMT0JBTCB8IFBnX1BBTFNFVF9GT1JDRV9FWFBPU0UsIDApOwotICAgICAgICAgICAgUGdGbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIHBoX0xlYXZlRnVsbFNjcmVlbih0aGlzKTsKLSAgICB9Ci0KLSAgICBpZiAoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgUGhEQ1JlbGVhc2UoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCk7Ci0gICAgICAgIE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQgPSBOVUxMOwotICAgICAgICBPQ0ltYWdlLkZyYW1lRGF0YTAgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIFBoRENSZWxlYXNlKE9DSW1hZ2Uub2Zmc2NyZWVuX2JhY2tjb250ZXh0KTsKLSAgICAgICAgT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQgPSBOVUxMOwotICAgICAgICBPQ0ltYWdlLkZyYW1lRGF0YTEgPSBOVUxMOwotICAgIH0KLSAgICBPQ0ltYWdlLkN1cnJlbnRGcmFtZURhdGEgPSBOVUxMOwotCi0gICAgaWYgKFNETF9JbWFnZSkKLSAgICB7Ci0gICAgICAgIC8qIGlmIHBhbGV0dGUgYWxsb2NhdGVkLCBmcmVlIGl0ICovCi0gICAgICAgIGlmIChTRExfSW1hZ2UtPnBhbGV0dGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNETF9mcmVlKFNETF9JbWFnZS0+cGFsZXR0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgUGdTaG1lbURlc3Ryb3koU0RMX0ltYWdlLT5pbWFnZSk7Ci0gICAgICAgIFNETF9mcmVlKFNETF9JbWFnZSk7Ci0gICAgfQotCi0gICAgLyogTXVzdCBiZSB6ZXJvZWQgZXZlcnl0aW1lICovCi0gICAgU0RMX0ltYWdlID0gTlVMTDsKLQotICAgIGlmIChzY3JlZW4pCi0gICAgewotICAgICAgICBzY3JlZW4tPnBpeGVscyA9IE5VTEw7Ci0gICAgfQotfQotCi1pbnQgcGhfVXBkYXRlSFdJbmZvKF9USElTKQotewotICAgIFBnVmlkZW9Nb2RlSW5mb190IHZtb2RlOwotICAgIFBnSFdDYXBzX3QgaHdjYXBzOwotCi0gICAgLyogVXBkYXRlIHZpZGVvIHJhbSBhbW91bnQgKi8KLSAgICBpZiAoUGdHZXRHcmFwaGljc0hXQ2FwcygmaHdjYXBzKSA8IDApCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoInBoX1VwZGF0ZUhXSW5mbygpOiBHZXRHcmFwaGljc0hXQ2FwcygpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB0aGlzLT5pbmZvLnZpZGVvX21lbT1od2NhcHMuY3VycmVudGx5X2F2YWlsYWJsZV92aWRlb19yYW0vMTAyNDsKLQotICAgIC8qIG9idGFpbiBjdXJyZW50IG1vZGUgY2FwYWJpbGl0aWVzICovCi0gICAgaWYgKFBnR2V0VmlkZW9Nb2RlSW5mbyhod2NhcHMuY3VycmVudF92aWRlb19tb2RlLCAmdm1vZGUpIDwgMCkKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigicGhfVXBkYXRlSFdJbmZvKCk6IEdldFZpZGVvTW9kZUluZm8oKSBmdW5jdGlvbiBmYWlsZWQgIVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoKHZtb2RlLm1vZGVfY2FwYWJpbGl0aWVzMSAmIFBnVk1fTU9ERV9DQVAxX09GRlNDUkVFTikgPT0gUGdWTV9NT0RFX0NBUDFfT0ZGU0NSRUVOKQotICAgIHsKLSAgICAgICAgLyogdGhpcyBpcyBhIHNwZWNpYWwgdGVzdCBmb3IgZHJpdmVycyB3aGljaCB0cmllcyB0byBsaWUgYWJvdXQgb2Zmc2NyZWVuIGNhcGFiaWxpdHkgKi8KLSAgICAgICAgaWYgKGh3Y2Fwcy5jdXJyZW50bHlfYXZhaWxhYmxlX3ZpZGVvX3JhbSE9MCkKLSAgICAgICAgewotICAgICAgICAgICB0aGlzLT5pbmZvLmh3X2F2YWlsYWJsZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgIHRoaXMtPmluZm8uaHdfYXZhaWxhYmxlID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0aGlzLT5pbmZvLmh3X2F2YWlsYWJsZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCh2bW9kZS5tb2RlX2NhcGFiaWxpdGllczIgJiBQZ1ZNX01PREVfQ0FQMl9SRUNUQU5HTEUpID09IFBnVk1fTU9ERV9DQVAyX1JFQ1RBTkdMRSkKLSAgICB7Ci0gICAgICAgIHRoaXMtPmluZm8uYmxpdF9maWxsID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdGhpcy0+aW5mby5ibGl0X2ZpbGwgPSAwOwotICAgIH0KLQotICAgIGlmICgodm1vZGUubW9kZV9jYXBhYmlsaXRpZXMyICYgUGdWTV9NT0RFX0NBUDJfQklUQkxUKSA9PSBQZ1ZNX01PREVfQ0FQMl9CSVRCTFQpCi0gICAgewotICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHcgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHcgPSAwOwotICAgIH0KLQotICAgIGlmICgodm1vZGUubW9kZV9jYXBhYmlsaXRpZXMyICYgUGdWTV9NT0RFX0NBUDJfQUxQSEFfQkxFTkQpID09IFBnVk1fTU9ERV9DQVAyX0FMUEhBX0JMRU5EKQotICAgIHsKLSAgICAgICAgdGhpcy0+aW5mby5ibGl0X2h3X0EgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHdfQSA9IDA7Ci0gICAgfQotICAgIAotICAgIGlmICgodm1vZGUubW9kZV9jYXBhYmlsaXRpZXMyICYgUGdWTV9NT0RFX0NBUDJfQ0hST01BKSA9PSBQZ1ZNX01PREVfQ0FQMl9DSFJPTUEpCi0gICAgewotICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgPSAwOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHBoX1NldHVwVXBkYXRlRnVuY3Rpb24oX1RISVMsIFNETF9TdXJmYWNlKiBzY3JlZW4sIFVpbnQzMiBmbGFncykKLXsKLSAgICBpbnQgc2V0dXByZXN1bHQ9LTE7Ci0KLSAgICBwaF9EZXN0cm95SW1hZ2UodGhpcywgc2NyZWVuKTsKLSAgICAKLSNpZiBTRExfVklERU9fT1BFTkdMCi0gICAgaWYgKChmbGFncyAmIFNETF9PUEVOR0wpPT1TRExfT1BFTkdMKQotICAgIHsKLSAgICAgICAgc2V0dXByZXN1bHQ9cGhfU2V0dXBPcGVuR0xJbWFnZSh0aGlzLCBzY3JlZW4pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2VuZGlmCi0gICAgICAgaWYgKChmbGFncyAmIFNETF9GVUxMU0NSRUVOKT09U0RMX0ZVTExTQ1JFRU4pCi0gICAgICAgewotICAgICAgICAgICBzZXR1cHJlc3VsdD1waF9TZXR1cEZ1bGxTY3JlZW5JbWFnZSh0aGlzLCBzY3JlZW4pOwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgIGlmICgoZmxhZ3MgJiBTRExfSFdTVVJGQUNFKT09U0RMX0hXU1VSRkFDRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNldHVwcmVzdWx0PXBoX1NldHVwT0NJbWFnZSh0aGlzLCBzY3JlZW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgICBzZXR1cHJlc3VsdD1waF9TZXR1cEltYWdlKHRoaXMsIHNjcmVlbik7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0gICAgfQotI2VuZGlmCi0gICAgaWYgKHNldHVwcmVzdWx0IT0tMSkKLSAgICB7Ci0gICAgICAgcGhfVXBkYXRlSFdJbmZvKHRoaXMpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc2V0dXByZXN1bHQ7Ci19Ci0KLWludCBwaF9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpCi17Ci0gICAgUGdIV0NhcHNfdCBod2NhcHM7Ci0KLSAgICBpZiAoc3VyZmFjZS0+aHdkYXRhIT1OVUxMKQotICAgIHsKLSAgICAgICBTRExfU2V0RXJyb3IoInBoX0FsbG9jSFdTdXJmYWNlKCk6IGh3ZGF0YSBhbHJlYWR5IGV4aXN0cyFcbiIpOwotICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgc3VyZmFjZS0+aHdkYXRhPVNETF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcml2YXRlX2h3ZGF0YSkpOwotICAgIFNETF9tZW1zZXQoc3VyZmFjZS0+aHdkYXRhLCAweDAwLCBzaXplb2Yoc3RydWN0IHByaXZhdGVfaHdkYXRhKSk7Ci0gICAgc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW5jdHg9UGRDcmVhdGVPZmZzY3JlZW5Db250ZXh0KDAsIHN1cmZhY2UtPncsIHN1cmZhY2UtPmgsIFBnX09TQ19NRU1fUEFHRV9BTElHTik7Ci0gICAgaWYgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4ID09IE5VTEwpCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoInBoX0FsbG9jSFdTdXJmYWNlKCk6IFBkQ3JlYXRlT2Zmc2NyZWVuQ29udGV4dCgpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzdXJmYWNlLT5waXhlbHM9UGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKLSAgICBpZiAoc3VyZmFjZS0+cGl4ZWxzPT1OVUxMKQotICAgIHsKLSAgICAgICAgUGhEQ1JlbGVhc2Uoc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW5jdHgpOwotICAgICAgICBTRExfU2V0RXJyb3IoInBoX0FsbG9jSFdTdXJmYWNlKCk6IFBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cigpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzdXJmYWNlLT5waXRjaD1zdXJmYWNlLT5od2RhdGEtPm9mZnNjcmVlbmN0eC0+cGl0Y2g7Ci0gICAgc3VyZmFjZS0+ZmxhZ3N8PVNETF9IV1NVUkZBQ0U7Ci0gICAgc3VyZmFjZS0+ZmxhZ3N8PVNETF9QUkVBTExPQzsKLSAgICAKLSNpZiAwIC8qIEZJWE1FICovCi0gICAgLyogY3JlYXRlIHNpbXBsZSBvZmZzY3JlZW4gbG9jayAqLwotICAgIHN1cmZhY2UtPmh3ZGF0YS0+Y3Jsb2NrcGFyYW0uZmxhZ3M9MDsKLSAgICBpZiAoUGRDcmVhdGVPZmZzY3JlZW5Mb2NrKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4LCAmc3VyZmFjZS0+aHdkYXRhLT5jcmxvY2twYXJhbSkhPUVPSykKLSAgICB7Ci0gICAgICAgIFBoRENSZWxlYXNlKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9BbGxvY0hXU3VyZmFjZSgpOiBDYW4ndCBjcmVhdGUgb2Zmc2NyZWVuIGxvY2sgIVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0jZW5kaWYgLyogMCAqLwotCi0gICAgLyogVXBkYXRlIHZpZGVvIHJhbSBhbW91bnQgKi8KLSAgICBpZiAoUGdHZXRHcmFwaGljc0hXQ2FwcygmaHdjYXBzKSA8IDApCi0gICAgewotICAgICAgICBQZERlc3Ryb3lPZmZzY3JlZW5Mb2NrKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKLSAgICAgICAgUGhEQ1JlbGVhc2Uoc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW5jdHgpOwotICAgICAgICBTRExfU2V0RXJyb3IoInBoX0FsbG9jSFdTdXJmYWNlKCk6IEdldEdyYXBoaWNzSFdDYXBzKCkgZnVuY3Rpb24gZmFpbGVkICFcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHRoaXMtPmluZm8udmlkZW9fbWVtPWh3Y2Fwcy5jdXJyZW50bHlfYXZhaWxhYmxlX3ZpZGVvX3JhbS8xMDI0OwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcGhfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpCi17Ci0gICAgUGdIV0NhcHNfdCBod2NhcHM7Ci0KLSAgICBpZiAoc3VyZmFjZS0+aHdkYXRhPT1OVUxMKQotICAgIHsKLSAgICAgICBTRExfU2V0RXJyb3IoInBoX0ZyZWVIV1N1cmZhY2UoKTogbm8gaHdkYXRhIVxuIik7Ci0gICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW5jdHggPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgU0RMX1NldEVycm9yKCJwaF9GcmVlSFdTdXJmYWNlKCk6IG5vIG9mZnNjcmVlbiBjb250ZXh0IHRvIGRlbGV0ZSFcbiIpOwotICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZiAwIC8qIEZJWE1FICovCi0gICAgLyogdW5sb2NrIHRoZSBvZmZzY3JlZW4gY29udGV4dCBpZiBpdCBoYXMgYmVlbiBsb2NrZWQgYmVmb3JlIGRlc3Ryb3kgaXQgKi8KLSAgICBpZiAoUGRJc09mZnNjcmVlbkxvY2tlZChzdXJmYWNlLT5od2RhdGEtPm9mZnNjcmVlbmN0eCk9PVBnX09TQ19MT0NLRUQpCi0gICAgewotICAgICAgIFBkVW5sb2NrT2Zmc2NyZWVuKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKLSAgICB9Ci0KLSAgICBQZERlc3Ryb3lPZmZzY3JlZW5Mb2NrKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKLSNlbmRpZiAvKiAwICovCi0KLSAgICBQaERDUmVsZWFzZShzdXJmYWNlLT5od2RhdGEtPm9mZnNjcmVlbmN0eCk7Ci0gICAgCi0gICAgU0RMX2ZyZWUoc3VyZmFjZS0+aHdkYXRhKTsKLSAgICBzdXJmYWNlLT5od2RhdGE9TlVMTDsKLQotICAgIC8qIFVwZGF0ZSB2aWRlbyByYW0gYW1vdW50ICovCi0gICAgaWYgKFBnR2V0R3JhcGhpY3NIV0NhcHMoJmh3Y2FwcykgPCAwKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9GcmVlSFdTdXJmYWNlKCk6IEdldEdyYXBoaWNzSFdDYXBzKCkgZnVuY3Rpb24gZmFpbGVkICFcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHRoaXMtPmluZm8udmlkZW9fbWVtPWh3Y2Fwcy5jdXJyZW50bHlfYXZhaWxhYmxlX3ZpZGVvX3JhbS8xMDI0OwotCi0gICAgcmV0dXJuOwotfQotCi1pbnQgcGhfQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkc3QpCi17Ci0gICBpZiAoKHNyYy0+aHdkYXRhPT1OVUxMKSAmJiAoc3JjICE9IHRoaXMtPnNjcmVlbikpCi0gICB7Ci0gICAgICBTRExfU2V0RXJyb3IoInBoX0NoZWNrSFdCbGl0KCk6IFNvdXJjZSBzdXJmYWNlIGhhdmVuJ3QgaGFyZHdhcmUgc3BlY2lmaWMgZGF0YS5cbiIpOwotICAgICAgc3JjLT5mbGFncyY9flNETF9IV0FDQ0VMOwotICAgICAgcmV0dXJuIC0xOwotICAgfQotICAgaWYgKChzcmMtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gU0RMX0hXU1VSRkFDRSkKLSAgIHsKLSAgICAgIFNETF9TZXRFcnJvcigicGhfQ2hlY2tIV0JsaXQoKTogU291cmNlIHN1cmZhY2UgaXNuJ3QgYSBoYXJkd2FyZSBzdXJmYWNlLlxuIik7Ci0gICAgICBzcmMtPmZsYWdzJj1+U0RMX0hXQUNDRUw7Ci0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci0KLSAgIGlmICgoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZKQotICAgewotICAgICAgIGlmICh0aGlzLT5pbmZvLmJsaXRfaHdfQ0MhPTEpCi0gICAgICAgewotICAgICAgICAgICBzcmMtPmZsYWdzJj1+U0RMX0hXQUNDRUw7Ci0gICAgICAgICAgIHNyYy0+bWFwLT5od19ibGl0PU5VTEw7Ci0gICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIGlmICgoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBKQotICAgewotICAgICAgIGlmICh0aGlzLT5pbmZvLmJsaXRfaHdfQSE9MSkKLSAgICAgICB7Ci0gICAgICAgICAgIHNyYy0+ZmxhZ3MmPX5TRExfSFdBQ0NFTDsKLSAgICAgICAgICAgc3JjLT5tYXAtPmh3X2JsaXQ9TlVMTDsKLSAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgIH0KLSAgIH0KLQotICAgc3JjLT5mbGFnc3w9U0RMX0hXQUNDRUw7Ci0gICBzcmMtPm1hcC0+aHdfYmxpdCA9IHBoX0hXQWNjZWxCbGl0OwotCi0gICByZXR1cm4gMTsKLX0KLQotUGdDb2xvcl90IHBoX0V4cGFuZENvbG9yKF9USElTLCBTRExfU3VyZmFjZSogc3VyZmFjZSwgVWludDMyIGNvbG9yKQotewotICAgIFVpbnQzMiB0cnVlY29sb3I7Ci0KLSAgICAvKiBQaG90b24gQVBJIGFjY2VwdHMgdHJ1ZSBjb2xvcnMgb25seSBkdXJpbmcgaHcgZmlsbGluZyBvcGVyYXRpb25zICovCi0gICAgc3dpdGNoKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsKQotICAgIHsKLSAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChzdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUpICYmIChjb2xvcjw9c3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5uY29sb3JzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRydWVjb2xvcj1QZ1JHQihzdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tjb2xvcl0uciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2NvbG9yXS5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbY29sb3JdLmIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX0V4cGFuZENvbG9yKCk6IENvbG9yIG91dCBvZiByYW5nZSBmb3IgdGhlIDhicHAgbW9kZSAhXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnVlY29sb3IgPSAoKGNvbG9yICYgMHgwMDAwN0MwMFVMKSA8PCA5KSB8ICAgLyogUiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDAwMDAwM0UwVUwpIDw8IDYpIHwgICAvKiBHICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb2xvciAmIDB4MDAwMDAwMUZVTCkgPDwgMykgfCAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHgwMDAwNzAwMFVMKSA8PCA0KSB8ICAgLyogUiBjb21wZW5zYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHgwMDAwMDM4MFVMKSA8PCAxKSB8ICAgLyogRyBjb21wZW5zYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHgwMDAwMDAxQ1VMKSA+PiAyKTsgICAgLyogQiBjb21wZW5zYXRpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgMTY6IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRydWVjb2xvciA9ICgoY29sb3IgJiAweDAwMDBGODAwVUwpIDw8IDgpIHwgICAvKiBSICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb2xvciAmIDB4MDAwMDA3RTBVTCkgPDwgNSkgfCAgIC8qIEcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHgwMDAwMDAxRlVMKSA8PCAzKSB8ICAgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDAwMDBFMDAwVUwpIDw8IDMpIHwgICAvKiBSIGNvbXBlbnNhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDAwMDAwNjAwVUwpID4+IDEpIHwgICAvKiBHIGNvbXBlbnNhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDAwMDAwMDFDVUwpID4+IDIpOyAgICAvKiBCIGNvbXBlbnNhdGlvbiAqLwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnVlY29sb3I9Y29sb3IgJiAweDAwRkZGRkZGVUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnVlY29sb3I9Y29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfRXhwYW5kQ29sb3IoKTogVW5zdXBwb3J0ZWQgZGVwdGggZm9yIHRoZSBoYXJkd2FyZSBvcGVyYXRpb25zICFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWVjb2xvcjsKLX0KLQotaW50IHBoX0ZpbGxIV1JlY3QoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlLCBTRExfUmVjdCogcmVjdCwgVWludDMyIGNvbG9yKQotewotICAgIFBnQ29sb3JfdCBvbGRjb2xvcjsKLSAgICBVaW50MzIgdHJ1ZWNvbG9yOwotICAgIGludCB5ZGlzcD0wOwotCi0gICAgaWYgKHRoaXMtPmluZm8uYmxpdF9maWxsIT0xKQotICAgIHsKLSAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdHJ1ZWNvbG9yPXBoX0V4cGFuZENvbG9yKHRoaXMsIHN1cmZhY2UsIGNvbG9yKTsKLSAgICBpZiAodHJ1ZWNvbG9yPT0weEZGRkZGRkZGVUwpCi0gICAgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgb2xkY29sb3I9UGdTZXRGaWxsQ29sb3IodHJ1ZWNvbG9yKTsKLQotICAgIC8qIDY0MHg0MDAgdmlkZW9tb2RlIGVtdWxhdGlvbiAqLwotICAgIGlmICh2aWRlb21vZGVfZW11bGF0ZW1vZGU9PTEpCi0gICAgewotICAgICAgICB5ZGlzcCs9NDA7Ci0gICAgfQotCi0gICAgUGdEcmF3SVJlY3QocmVjdC0+eCwgcmVjdC0+eSt5ZGlzcCwgcmVjdC0+dytyZWN0LT54LTEsIHJlY3QtPmgrcmVjdC0+eSt5ZGlzcC0xLCBQZ19EUkFXX0ZJTEwpOwotICAgIFBnU2V0RmlsbENvbG9yKG9sZGNvbG9yKTsKLSAgICBQZ0ZsdXNoKCk7Ci0gICAgUGdXYWl0SFdJZGxlKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHBoX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlKiBzY3JlZW4pCi17Ci0gICAgUGhBcmVhX3QgZmFyZWE7Ci0KLSAgICBpZiAoKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4pCi0gICAgewotICAgICAgICAvKiBmbHVzaCBhbGwgZHJhd2luZyBvcHMgYmVmb3JlIGJsaXR0aW5nICovCi0gICAgICAgIFBnRmx1c2goKTsKLSAgICAgICAgUGdXYWl0SFdJZGxlKCk7Ci0KLSAgICAgICAgZmFyZWEucG9zLng9MDsKLSAgICAgICAgZmFyZWEucG9zLnk9MDsKLSAgICAgICAgZmFyZWEuc2l6ZS53PXNjcmVlbi0+dzsKLSAgICAgICAgZmFyZWEuc2l6ZS5oPXNjcmVlbi0+aDsKLQotICAgICAgICAvKiBlbXVsYXRlIDY0MHg0MDAgdmlkZW9tb2RlICovCi0gICAgICAgIGlmICh2aWRlb21vZGVfZW11bGF0ZW1vZGU9PTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhcmVhLnBvcy55Kz00MDsKLSAgICAgICAgfQotCi0gICAgICAgIFBnQ29udGV4dEJsaXRBcmVhKE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQsICZmYXJlYSwgT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQsICZmYXJlYSk7Ci0KLSAgICAgICAgLyogZmx1c2ggdGhlIGJsaXR0aW5nICovCi0gICAgICAgIFBnRmx1c2goKTsKLSAgICAgICAgUGdXYWl0SFdJZGxlKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgcGhfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpCi17Ci0KLSNpZiAwIC8qIEZJWE1FICovCi0gICAgaW50IGxvY2tyZXN1bHQ7Ci0KLSAgICBpZiAoc3VyZmFjZS0+aHdkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3VyZmFjZS0+aHdkYXRhLT5sb2NrcGFyYW0uZmxhZ3M9MDsKLSAgICBzdXJmYWNlLT5od2RhdGEtPmxvY2twYXJhbS50aW1lX291dD1OVUxMOwotICAgIGxvY2tyZXN1bHQ9UGRMb2NrT2Zmc2NyZWVuKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4LCAmc3VyZmFjZS0+aHdkYXRhLT5sb2NrcGFyYW0pOwotCi0gICAgc3dpdGNoIChsb2NrcmVzdWx0KQotICAgIHsKLSAgICAgICBjYXNlIEVPSzoKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBQZ19PU0NfTE9DS19ERUFETE9DSzogCi0gICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfTG9ja0hXU3VyZmFjZSgpOiBEZWFkbG9jayBkZXRlY3RlZCAhXG4iKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgIGNhc2UgUGdfT1NDX0xPQ0tfSU5WQUxJRDoKLSAgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9Mb2NrSFdTdXJmYWNlKCk6IExvY2sgaW52YWxpZCAhXG4iKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfTG9ja0hXU3VyZmFjZSgpOiBDYW4ndCBsb2NrIHRoZSBzdXJmYWNlICFcbiIpOwotICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmIC8qIDAgKi8KLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIHBoX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpCi17Ci0KLSNpZiAwIC8qIEZJWE1FICovCi0gICAgaW50IHVubG9ja3Jlc3VsdDsKLQotICAgIGlmICgoc3VyZmFjZSA9PSBOVUxMKSB8fCAoc3VyZmFjZS0+aHdkYXRhID09IE5VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChQZElzT2Zmc2NyZWVuTG9ja2VkKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KT09UGdfT1NDX0xPQ0tFRCkKLSAgICB7Ci0gICAgICAgIHVubG9ja3Jlc3VsdD1QZFVubG9ja09mZnNjcmVlbihzdXJmYWNlLT5od2RhdGEtPm9mZnNjcmVlbmN0eCk7Ci0gICAgfQotI2VuZGlmIC8qIDAgKi8KLQotICAgIHJldHVybjsKLX0KLQotaW50IHBoX0hXQWNjZWxCbGl0KFNETF9TdXJmYWNlKiBzcmMsIFNETF9SZWN0KiBzcmNyZWN0LCBTRExfU3VyZmFjZSogZHN0LCBTRExfUmVjdCogZHN0cmVjdCkKLXsKLSAgICBTRExfVmlkZW9EZXZpY2UqIHRoaXM9Y3VycmVudF92aWRlbzsKLSAgICBQaEFyZWFfdCBzcmNhcmVhOwotICAgIFBoQXJlYV90IGRzdGFyZWE7Ci0gICAgaW50IHlkaXNwPTA7Ci0KLSAgICAvKiA2NDB4NDAwIHZpZGVvbW9kZSBlbXVsYXRpb24gKi8KLSAgICBpZiAodmlkZW9tb2RlX2VtdWxhdGVtb2RlPT0xKQotICAgIHsKLSAgICAgICB5ZGlzcCs9NDA7Ci0gICAgfQotCi0gICAgc3JjYXJlYS5wb3MueD1zcmNyZWN0LT54OwotICAgIHNyY2FyZWEucG9zLnk9c3JjcmVjdC0+eTsKLSAgICBzcmNhcmVhLnNpemUudz1zcmNyZWN0LT53OwotICAgIHNyY2FyZWEuc2l6ZS5oPXNyY3JlY3QtPmg7Ci0KLSAgICBkc3RhcmVhLnBvcy54PWRzdHJlY3QtPng7Ci0gICAgZHN0YXJlYS5wb3MueT1kc3RyZWN0LT55OwotICAgIGRzdGFyZWEuc2l6ZS53PWRzdHJlY3QtPnc7Ci0gICAgZHN0YXJlYS5zaXplLmg9ZHN0cmVjdC0+aDsKLQotICAgIGlmICgoKHNyYyA9PSB0aGlzLT5zY3JlZW4pIHx8IChzcmMtPmh3ZGF0YSE9TlVMTCkpICYmICgoZHN0ID09IHRoaXMtPnNjcmVlbikgfHwgKGRzdC0+aHdkYXRhIT1OVUxMKSkpCi0gICAgewotICAgICAgICBpZiAoKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSkKLSAgICAgICAgewotICAgICAgICAgICAgcGhfU2V0SFdDb2xvcktleSh0aGlzLCBzcmMsIHNyYy0+Zm9ybWF0LT5jb2xvcmtleSk7Ci0gICAgICAgICAgICBQZ0Nocm9tYU9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSkKLSAgICAgICAgewotICAgICAgICAgICAgcGhfU2V0SFdBbHBoYSh0aGlzLCBzcmMsIHNyYy0+Zm9ybWF0LT5hbHBoYSk7Ci0gICAgICAgICAgICBQZ0FscGhhT24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkc3QgPT0gdGhpcy0+c2NyZWVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3JjID09IHRoaXMtPnNjcmVlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBibGl0dGluZyBmcm9tIG1haW4gc2NyZWVuIHRvIG1haW4gc2NyZWVuICovCi0gICAgICAgICAgICAgICAgZHN0YXJlYS5wb3MueSs9eWRpc3A7Ci0gICAgICAgICAgICAgICAgc3JjYXJlYS5wb3MueSs9eWRpc3A7Ci0gICAgICAgICAgICAgICAgUGdDb250ZXh0QmxpdEFyZWEoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCwgJnNyY2FyZWEsIE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQsICZkc3RhcmVhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBibGl0dGluZyBmcm9tIG9mZnNjcmVlbiB0byBtYWluIHNjcmVlbiAqLwotICAgICAgICAgICAgICAgIGRzdGFyZWEucG9zLnkrPXlkaXNwOwotICAgICAgICAgICAgICAgIFBnQ29udGV4dEJsaXRBcmVhKHNyYy0+aHdkYXRhLT5vZmZzY3JlZW5jdHgsICZzcmNhcmVhLCBPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0LCAmZHN0YXJlYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3JjID09IHRoaXMtPnNjcmVlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBibGl0dGluZyBmcm9tIG1haW4gc2NyZWVuIHRvIG9mZnNjcmVlbiAqLwotICAgICAgICAgICAgICAgIHNyY2FyZWEucG9zLnkrPXlkaXNwOwotICAgICAgICAgICAgICAgIFBnQ29udGV4dEJsaXRBcmVhKE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQsICZzcmNhcmVhLCBkc3QtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4LCAmZHN0YXJlYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogYmxpdHRpbmcgb2Zmc2NyZWVuIHRvIG9mZnNjcmVlbiAqLwotICAgICAgICAgICAgICAgIFBnQ29udGV4dEJsaXRBcmVhKHNyYy0+aHdkYXRhLT5vZmZzY3JlZW5jdHgsICZzcmNhcmVhLCBkc3QtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4LCAmZHN0YXJlYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSkKLSAgICAgICAgewotICAgICAgICAgICAgUGdBbHBoYU9mZigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBnQ2hyb21hT2ZmKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9IV0FjY2VsQmxpdCgpOiBTb3VyY2Ugb3IgdGFyZ2V0IHN1cmZhY2UgaXMgbm90IGEgaGFyZHdhcmUgc3VyZmFjZSAhXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIFBnRmx1c2goKTsKLSAgICBQZ1dhaXRIV0lkbGUoKTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgcGhfU2V0SFdDb2xvcktleShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBrZXkpCi17Ci0gICAgaWYgKHRoaXMtPmluZm8uYmxpdF9od19DQyE9MSkKLSAgICB7Ci0gICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChzdXJmYWNlLT5od2RhdGEhPU5VTEwpCi0gICAgewotICAgICAgICBzdXJmYWNlLT5od2RhdGEtPmNvbG9ya2V5PXBoX0V4cGFuZENvbG9yKHRoaXMsIHN1cmZhY2UsIGtleSk7Ci0gICAgICAgIGlmIChzdXJmYWNlLT5od2RhdGEtPmNvbG9ya2V5PT0weEZGRkZGRkZGVUwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBQZ1NldENocm9tYShzdXJmYWNlLT5od2RhdGEtPmNvbG9ya2V5LCBQZ19DSFJPTUFfU1JDX01BVENIIHwgUGdfQ0hST01BX05PRFJBVyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHBoX1NldEhXQWxwaGEoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlLCBVaW50OCBhbHBoYSkKLXsKLSAgICBpZiAodGhpcy0+aW5mby5ibGl0X2h3X0EhPTEpCi0gICAgewotICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBQZ1NldEFscGhhQmxlbmQoTlVMTCwgYWxwaGEpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi12b2lkIHBoX09wZW5HTFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCogcmVjdHMpCi17Ci0gICB0aGlzLT5HTF9Td2FwQnVmZmVycyh0aGlzKTsKLSAgIAotICAgcmV0dXJuOwotfQotI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KLQotdm9pZCBwaF9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotICAgIFBoUG9pbnRfdCBwaF9wb3M7Ci0gICAgUGhSZWN0X3QgcGhfcmVjdDsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaT0wOyBpPG51bXJlY3RzOyArK2kpIAotICAgIHsKLSAgICAJaWYgKHJlY3RzW2ldLnc9PTApIC8qIENsaXBwZWQ/IGR1bm5vIHdoeSBidXQgdGhpcyBvY2N1cnMgc29tZXRpbWUuICovCi0gICAgICAgIHsgCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgCWlmIChyZWN0c1tpXS5oPT0wKSAvKiBDbGlwcGVkPyBkdW5ubyB3aHkgYnV0IHRoaXMgb2NjdXJzIHNvbWV0aW1lLiAqLwotICAgICAgICB7IAotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwaF9wb3MueCA9IHJlY3RzW2ldLng7Ci0gICAgICAgIHBoX3Bvcy55ID0gcmVjdHNbaV0ueTsKLSAgICAgICAgcGhfcmVjdC51bC54ID0gcmVjdHNbaV0ueDsKLSAgICAgICAgcGhfcmVjdC51bC55ID0gcmVjdHNbaV0ueTsKLSAgICAgICAgcGhfcmVjdC5sci54ID0gcmVjdHNbaV0ueCArIHJlY3RzW2ldLnc7Ci0gICAgICAgIHBoX3JlY3QubHIueSA9IHJlY3RzW2ldLnkgKyByZWN0c1tpXS5oOwotCi0gICAgICAgIGlmIChQZ0RyYXdQaEltYWdlUmVjdG14KCZwaF9wb3MsIFNETF9JbWFnZSwgJnBoX3JlY3QsIDApIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9Ob3JtYWxVcGRhdGUoKTogUGdEcmF3UGhJbWFnZVJlY3RteCBmYWlsZWQhXG4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChQZ0ZsdXNoKCkgPCAwKQotICAgIHsKLSAgICAJU0RMX1NldEVycm9yKCJwaF9Ob3JtYWxVcGRhdGUoKTogUGdGbHVzaCgpIGZ1bmN0aW9uIGZhaWxlZCFcbiIpOwotICAgIH0KLX0KLQotdm9pZCBwaF9PQ1VwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBQaFBvaW50X3QgemVybyA9IHswLCAwfTsKLSAgICBQaEFyZWFfdCBzcmNfcmVjdDsKLSAgICBQaEFyZWFfdCBkZXN0X3JlY3Q7Ci0KLSAgICBQZ1NldFRyYW5zbGF0aW9uKCZ6ZXJvLCAwKTsKLSAgICBQZ1NldFJlZ2lvbihQdFdpZGdldFJpZCh3aW5kb3cpKTsKLSAgICBQZ1NldENsaXBwaW5nKDAsIE5VTEwpOwotCi0gICAgUGdGbHVzaCgpOwotICAgIFBnV2FpdEhXSWRsZSgpOwotCi0gICAgZm9yIChpPTA7IGk8bnVtcmVjdHM7ICsraSkKLSAgICB7Ci0gICAgICAgIGlmIChyZWN0c1tpXS53ID09IDApICAvKiBDbGlwcGVkPyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWN0c1tpXS5oID09IDApICAvKiBDbGlwcGVkPyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3JjX3JlY3QucG9zLng9cmVjdHNbaV0ueDsKLSAgICAgICAgc3JjX3JlY3QucG9zLnk9cmVjdHNbaV0ueTsKLSAgICAgICAgZGVzdF9yZWN0LnBvcy54PXJlY3RzW2ldLng7Ci0gICAgICAgIGRlc3RfcmVjdC5wb3MueT1yZWN0c1tpXS55OwotCi0gICAgICAgIHNyY19yZWN0LnNpemUudz1yZWN0c1tpXS53OwotICAgICAgICBzcmNfcmVjdC5zaXplLmg9cmVjdHNbaV0uaDsKLSAgICAgICAgZGVzdF9yZWN0LnNpemUudz1yZWN0c1tpXS53OwotICAgICAgICBkZXN0X3JlY3Quc2l6ZS5oPXJlY3RzW2ldLmg7Ci0gICAgICAgIAotICAgICAgICBQZ0NvbnRleHRCbGl0QXJlYShPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0LCAmc3JjX3JlY3QsIE5VTEwsICZkZXN0X3JlY3QpOwotICAgIH0KLQotICAgIGlmIChQZ0ZsdXNoKCkgPCAwKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9PQ1VwZGF0ZSgpOiBQZ0ZsdXNoIGZhaWxlZC5cbiIpOwotICAgIH0KLX0KLQotdm9pZCBwaF9PQ0RDVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLSAgICBQZ1dhaXRIV0lkbGUoKTsKLQotICAgIGlmIChQZ0ZsdXNoKCkgPCAwKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9PQ0RDVXBkYXRlKCk6IFBnRmx1c2ggZmFpbGVkLlxuIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX2ltYWdlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9pbWFnZV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYjA2M2MuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX2ltYWdlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9fU0RMX1BIX0lNQUdFX0hfXwotI2RlZmluZSBfX1NETF9QSF9JTUFHRV9IX18KLQotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfcGhfdmlkZW8uaCIKLQotc3RydWN0IHByaXZhdGVfaHdkYXRhCi17Ci0gICBQZE9mZnNjcmVlbkNvbnRleHRfdCogb2Zmc2NyZWVuY3R4OwotICAgUGRPU0NDcmVhdGVMb2NrUGFyYW1zX3QgY3Jsb2NrcGFyYW07Ci0gICBQZE9TQ0xvY2tQYXJhbXNfdCBsb2NrcGFyYW07Ci0gICBVaW50MzIgY29sb3JrZXk7Ci19OwotCi1leHRlcm4gaW50IHBoX1NldHVwSW1hZ2UoX1RISVMsIFNETF9TdXJmYWNlKiBzY3JlZW4pOwotZXh0ZXJuIHZvaWQgcGhfRGVzdHJveUltYWdlKF9USElTLCBTRExfU3VyZmFjZSogc2NyZWVuKTsKLWV4dGVybiBpbnQgcGhfU2V0dXBVcGRhdGVGdW5jdGlvbihfVEhJUywgU0RMX1N1cmZhY2UqIHNjcmVlbiwgVWludDMyIGZsYWdzKTsKLQotZXh0ZXJuIGludCBwaF9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpOwotZXh0ZXJuIHZvaWQgcGhfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpOwotZXh0ZXJuIGludCBwaF9DaGVja0hXQmxpdChfVEhJUywgU0RMX1N1cmZhY2UgKnNyYywgU0RMX1N1cmZhY2UgKmRzdCk7Ci1leHRlcm4gaW50IHBoX0ZpbGxIV1JlY3QoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlLCBTRExfUmVjdCogcmVjdCwgVWludDMyIGNvbG9yKTsKLWV4dGVybiBpbnQgcGhfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpOwotZXh0ZXJuIHZvaWQgcGhfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSogc3VyZmFjZSk7Ci1leHRlcm4gaW50IHBoX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlKTsKLWV4dGVybiBpbnQgcGhfU2V0SFdDb2xvcktleShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UsIFVpbnQzMiBrZXkpOwotZXh0ZXJuIGludCBwaF9TZXRIV0FscGhhKF9USElTLCBTRExfU3VyZmFjZSogc3VyZmFjZSwgVWludDggYWxwaGEpOwotZXh0ZXJuIGludCBwaF9IV0FjY2VsQmxpdChTRExfU3VyZmFjZSogc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwgU0RMX1N1cmZhY2UqIGRzdCwgU0RMX1JlY3QqIGRzdHJlY3QpOwotZXh0ZXJuIGludCBwaF9VcGRhdGVIV0luZm8oX1RISVMpOwotCi1leHRlcm4gdm9pZCBwaF9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QqIHJlY3RzKTsKLWV4dGVybiB2b2lkIHBoX09DVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0KiByZWN0cyk7Ci1leHRlcm4gdm9pZCBwaF9PQ0RDVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0KiByZWN0cyk7Ci1leHRlcm4gdm9pZCBwaF9PcGVuR0xVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QqIHJlY3RzKTsKLQotI2VuZGlmIC8qIF9fU0RMX1BIX0lNQUdFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX21vZGVzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW9kZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2ZjEyOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW9kZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM5MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9waF9tb2Rlc19jLmgiCi0KLXN0YXRpYyBQZ1ZpZGVvTW9kZUluZm9fdCBtb2RlX2luZm87Ci1zdGF0aWMgUGdWaWRlb01vZGVzX3QgbW9kZV9saXN0OwotCi0vKiBUaGUgY3VycmVudCBsaXN0IG9mIGF2YWlsYWJsZSB2aWRlbyBtb2RlcyAqLwotU0RMX1JlY3QgIFNETF9tb2RlbGlzdFtQSF9NQVhfVklERU9NT0RFU107Ci1TRExfUmVjdCogU0RMX21vZGVhcnJheVtQSF9NQVhfVklERU9NT0RFU107Ci0KLXN0YXRpYyBpbnQgY29tcGFyZV9tb2Rlc19ieV9yZXMoY29uc3Qgdm9pZCogbW9kZTEsIGNvbnN0IHZvaWQqIG1vZGUyKQotewotICAgIFBnVmlkZW9Nb2RlSW5mb190IG1vZGUxX2luZm87Ci0gICAgUGdWaWRlb01vZGVJbmZvX3QgbW9kZTJfaW5mbzsKLQotICAgIGlmIChQZ0dldFZpZGVvTW9kZUluZm8oKih1bnNpZ25lZCBzaG9ydCopbW9kZTEsICZtb2RlMV9pbmZvKSA8IDApCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoUGdHZXRWaWRlb01vZGVJbmZvKCoodW5zaWduZWQgc2hvcnQqKW1vZGUyLCAmbW9kZTJfaW5mbykgPCAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKG1vZGUxX2luZm8ud2lkdGggPT0gbW9kZTJfaW5mby53aWR0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtb2RlMl9pbmZvLmhlaWdodCAtIG1vZGUxX2luZm8uaGVpZ2h0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gbW9kZTJfaW5mby53aWR0aCAtIG1vZGUxX2luZm8ud2lkdGg7Ci0gICAgfQotfQotCi1TRExfUmVjdCAqKnBoX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IGogPSAwOwotICAgIFNETF9SZWN0IEFtb2RlbGlzdFtQSF9NQVhfVklERU9NT0RFU107Ci0KLSAgICBmb3IgKGk9MDsgaTxQSF9NQVhfVklERU9NT0RFUzsgaSsrKQotICAgIHsKLSAgICAgICAgU0RMX21vZGVhcnJheVtpXT0mU0RMX21vZGVsaXN0W2ldOwotICAgIH0KLQotICAgIGlmIChQZ0dldFZpZGVvTW9kZUxpc3QoJm1vZGVfbGlzdCkgPCAwKQotICAgIHsKLSAgICAgICBTRExfU2V0RXJyb3IoInBoX0xpc3RNb2RlcygpOiBQZ0dldFZpZGVvTW9kZUxpc3QoKSBmdW5jdGlvbiBmYWlsZWQgIVxuIik7Ci0gICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbW9kZV9pbmZvLmJpdHNfcGVyX3BpeGVsID0gMDsKLQotICAgIGZvciAoaT0wOyBpIDwgbW9kZV9saXN0Lm51bV9tb2RlczsgaSsrKSAKLSAgICB7Ci0gICAgICAgIGlmIChQZ0dldFZpZGVvTW9kZUluZm8obW9kZV9saXN0Lm1vZGVzW2ldLCAmbW9kZV9pbmZvKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfTGlzdE1vZGVzKCk6IFBnR2V0VmlkZW9Nb2RlSW5mbygpIGZ1bmN0aW9uIGZhaWxlZCBvbiBtb2RlOiAweCVYLlxuIiwgbW9kZV9saXN0Lm1vZGVzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmKG1vZGVfaW5mby5iaXRzX3Blcl9waXhlbCA9PSBmb3JtYXQtPkJpdHNQZXJQaXhlbCkKLSAgICAgICAgewotICAgICAgICAgICAgQW1vZGVsaXN0W2pdLncgPSBtb2RlX2luZm8ud2lkdGg7Ci0gICAgICAgICAgICBBbW9kZWxpc3Rbal0uaCA9IG1vZGVfaW5mby5oZWlnaHQ7Ci0gICAgICAgICAgICBBbW9kZWxpc3Rbal0ueCA9IDA7Ci0gICAgICAgICAgICBBbW9kZWxpc3Rbal0ueSA9IDA7Ci0gICAgICAgICAgICBqKys7CQotICAgICAgICB9Ci0gICAgfQotCQotICAgIC8qIHJlb3JkZXIgYmlnZ2VzdCBmb3Igc21hbGxlc3QsIGFzc3VtZSB3aWR0aCBkb21pbmF0ZXMgKi8KLQotICAgIGZvcihpPTA7IGk8ajsgaSsrKQotICAgIHsKLSAgICAgICAgU0RMX21vZGVsaXN0W2ldLncgPSBBbW9kZWxpc3RbaiAtIGkgLSAxXS53OwotICAgICAgICBTRExfbW9kZWxpc3RbaV0uaCA9IEFtb2RlbGlzdFtqIC0gaSAtIDFdLmg7Ci0gICAgICAgIFNETF9tb2RlbGlzdFtpXS54ID0gQW1vZGVsaXN0W2ogLSBpIC0gMV0ueDsKLSAgICAgICAgU0RMX21vZGVsaXN0W2ldLnkgPSBBbW9kZWxpc3RbaiAtIGkgLSAxXS55OwotICAgIH0KLSAgICBTRExfbW9kZWFycmF5W2pdPU5VTEw7Ci0JCi0gICAgcmV0dXJuIFNETF9tb2RlYXJyYXk7Ci19Ci0KLXZvaWQgcGhfRnJlZVZpZGVvTW9kZXMoX1RISVMpCi17Ci0gICByZXR1cm47Ci19Ci0KLS8qIHJldHVybiB0aGUgbW9kZSBhc3NvY2lhdGVkIHdpdGggd2lkdGgsIGhlaWdodCBhbmQgYnBwICovCi0vKiBpZiB0aGVyZSBpcyBubyBtb2RlIHRoZW4gemVybyBpcyByZXR1cm5lZCAgICAgICAgICAgICAqLwotaW50IHBoX0dldFZpZGVvTW9kZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IG1vZGVzdGFnZT0wOwotICAgIGludCBjbG9zZXN0bW9kZT0wOwotCi0gICAgaWYgKFBnR2V0VmlkZW9Nb2RlTGlzdCgmbW9kZV9saXN0KSA8IDApCi0gICAgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogc3BlY2lhbCBjYXNlIGZvciB0aGUgZG91YmxlLXNpemVkIDMyMHgyMDAgbW9kZSAqLwotICAgIGlmICgod2lkdGg9PTY0MCkgJiYgKGhlaWdodD09NDAwKSkKLSAgICB7Ci0gICAgICAgbW9kZXN0YWdlPTE7Ci0gICAgfQotCi0gICAgLyogc2VhcmNoIGxpc3QgZm9yIGV4YWN0IG1hdGNoICovCi0gICAgZm9yIChpPTA7IGk8bW9kZV9saXN0Lm51bV9tb2RlczsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKFBnR2V0VmlkZW9Nb2RlSW5mbyhtb2RlX2xpc3QubW9kZXNbaV0sICZtb2RlX2luZm8pIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG1vZGVfaW5mby53aWR0aCA9PSB3aWR0aCkgJiYgKG1vZGVfaW5mby5oZWlnaHQgPT0gaGVpZ2h0KSAmJiAKLSAgICAgICAgICAgIChtb2RlX2luZm8uYml0c19wZXJfcGl4ZWwgPT0gYnBwKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1vZGVfbGlzdC5tb2Rlc1tpXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKChtb2Rlc3RhZ2UpICYmIChtb2RlX2luZm8ud2lkdGggPT0gd2lkdGgpICYmIChtb2RlX2luZm8uaGVpZ2h0ID09IGhlaWdodCs4MCkgJiYgCi0gICAgICAgICAgICAgICAobW9kZV9pbmZvLmJpdHNfcGVyX3BpeGVsID09IGJwcCkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbW9kZXN0YWdlPTI7Ci0gICAgICAgICAgICAgIGNsb3Nlc3Rtb2RlPW1vZGVfbGlzdC5tb2Rlc1tpXTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogaWYgd2UgYXJlIGhlcmUsIHRoZW4gbm8gNjQweDQwMHhicHAgbW9kZSBmb3VuZCBhbmQgd2UnbGwgZW11bGF0ZSBpdCB2aWEgNjQweDQ4MHhicHAgbW9kZSAqLwotICAgIGlmIChtb2Rlc3RhZ2U9PTIpCi0gICAgewotICAgICAgIHJldHVybiBjbG9zZXN0bW9kZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKGkgPT0gbW9kZV9saXN0Lm51bV9tb2RlcykgPyAwIDogbW9kZV9saXN0Lm1vZGVzW2ldOwotfQotCi0vKiByZXR1cm4gdGhlIG1vZGUgYXNzb2NpYXRlZCB3aXRoIHdpZHRoLCBoZWlnaHQgYW5kIGJwcCAgICAgICAgICAgICAgICovCi0vKiBpZiByZXF1ZXN0ZWQgYnBwIGlzIG5vdCBmb3VuZCB0aGUgbW9kZSB3aXRoIGNsb3Nlc3QgYnBwIGlzIHJldHVybmVkICovCi1pbnQgZ2V0X21vZGVfYW55X2Zvcm1hdChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApCi17Ci0gICAgaW50IGksIGNsb3Nlc3QsIGRlbHRhLCBtaW5fZGVsdGE7Ci0KLSAgICBpZiAoUGdHZXRWaWRlb01vZGVMaXN0KCZtb2RlX2xpc3QpIDwgMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBTRExfcXNvcnQobW9kZV9saXN0Lm1vZGVzLCBtb2RlX2xpc3QubnVtX21vZGVzLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCBjb21wYXJlX21vZGVzX2J5X3Jlcyk7Ci0KLSAgICBmb3IoaT0wO2k8bW9kZV9saXN0Lm51bV9tb2RlcztpKyspCi0gICAgewotICAgICAgICBpZiAoUGdHZXRWaWRlb01vZGVJbmZvKG1vZGVfbGlzdC5tb2Rlc1tpXSwgJm1vZGVfaW5mbykgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG1vZGVfaW5mby53aWR0aCA9PSB3aWR0aCkgJiYgKG1vZGVfaW5mby5oZWlnaHQgPT0gaGVpZ2h0KSkKLSAgICAgICAgewotICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpPG1vZGVfbGlzdC5udW1fbW9kZXMpCi0gICAgewotICAgICAgICAvKiBnZXQgY2xvc2VzdCBicHAgKi8KLSAgICAgICAgY2xvc2VzdCA9IGkrKzsKLSAgICAgICAgaWYgKG1vZGVfaW5mby5iaXRzX3Blcl9waXhlbCA9PSBicHApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtb2RlX2xpc3QubW9kZXNbY2xvc2VzdF07Ci0gICAgICAgIH0KLQotICAgICAgICBtaW5fZGVsdGEgPSBhYnMobW9kZV9pbmZvLmJpdHNfcGVyX3BpeGVsIC0gYnBwKTsKLQotICAgICAgICB3aGlsZSgxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUGdHZXRWaWRlb01vZGVJbmZvKG1vZGVfbGlzdC5tb2Rlc1tpXSwgJm1vZGVfaW5mbykgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKG1vZGVfaW5mby53aWR0aCAhPSB3aWR0aCkgfHwgKG1vZGVfaW5mby5oZWlnaHQgIT0gaGVpZ2h0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobW9kZV9pbmZvLmJpdHNfcGVyX3BpeGVsID09IGJwcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3QgPSBpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBhYnMobW9kZV9pbmZvLmJpdHNfcGVyX3BpeGVsIC0gYnBwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhIDwgbWluX2RlbHRhKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9kZWx0YSA9IGRlbHRhOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZGVfbGlzdC5tb2Rlc1tjbG9zZXN0XTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHBoX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBvbikKLXsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLWludCBwaF9FbnRlckZ1bGxTY3JlZW4oX1RISVMsIFNETF9TdXJmYWNlKiBzY3JlZW4sIGludCBmbW9kZSkKLXsKLSAgICBQZ0Rpc3BsYXlTZXR0aW5nc190IHNldHRpbmdzOwotICAgIGludCBtb2RlOwotICAgIGNoYXIqIHJlZnJlc2hyYXRlOwotICAgIGludCByZWZyZXNocmF0ZW51bTsKLQotICAgIGlmICghY3VycmVudGx5X2Z1bGxzY3JlZW4pCi0gICAgewotICAgICAgICAvKiBHZXQgdGhlIHZpZGVvIG1vZGUgYW5kIHNldCBpdCAqLwotICAgICAgICBpZiAoc2NyZWVuLT5mbGFncyAmIFNETF9BTllGT1JNQVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobW9kZSA9IGdldF9tb2RlX2FueV9mb3JtYXQoc2NyZWVuLT53LCBzY3JlZW4tPmgsIHNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfRW50ZXJGdWxsU2NyZWVuKCk6IGNhbid0IGZpbmQgYXBwcm9wcmlhdGUgdmlkZW8gbW9kZSAhXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobW9kZSA9IHBoX0dldFZpZGVvTW9kZShzY3JlZW4tPncsIHNjcmVlbi0+aCwgc2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCkpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9FbnRlckZ1bGxTY3JlZW4oKTogY2FuJ3QgZmluZCBhcHByb3ByaWF0ZSB2aWRlbyBtb2RlICFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFBnR2V0VmlkZW9Nb2RlSW5mbyhtb2RlLCAmbW9kZV9pbmZvKSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9FbnRlckZ1bGxTY3JlZW4oKTogY2FuJ3QgZ2V0IHZpZGVvIG1vZGUgY2FwYWJpbGl0aWVzICFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vZGVfaW5mby5oZWlnaHQgIT0gc2NyZWVuLT5oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKChtb2RlX2luZm8uaGVpZ2h0PT00ODApICYmIChzY3JlZW4tPmg9PTQwMCkpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB2aWRlb21vZGVfZW11bGF0ZW1vZGU9MTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHZpZGVvbW9kZV9lbXVsYXRlbW9kZT0wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2F2ZSBvbGQgdmlkZW8gbW9kZSBjYXBzICovCi0gICAgICAgIFBnR2V0VmlkZW9Nb2RlKCZzZXR0aW5ncyk7Ci0gICAgICAgIG9sZF92aWRlb19tb2RlPXNldHRpbmdzLm1vZGU7Ci0gICAgICAgIG9sZF9yZWZyZXNoX3JhdGU9c2V0dGluZ3MucmVmcmVzaDsKLQotICAgICAgICAvKiBzZXR1cCBuZXcgdmlkZW8gbW9kZSAqLwotICAgICAgICBzZXR0aW5ncy5tb2RlID0gbW9kZTsKLSAgICAgICAgc2V0dGluZ3MucmVmcmVzaCA9IDA7Ci0gICAgICAgIHNldHRpbmdzLmZsYWdzID0gMDsKLQotICAgICAgICByZWZyZXNocmF0ZT1TRExfZ2V0ZW52KCJTRExfUEhPVE9OX0ZVTExTQ1JFRU5fUkVGUkVTSCIpOwotICAgICAgICBpZiAocmVmcmVzaHJhdGUhPU5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKFNETF9zc2NhbmYocmVmcmVzaHJhdGUsICIlZCIsICZyZWZyZXNocmF0ZW51bSk9PTEpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNldHRpbmdzLnJlZnJlc2ggPSByZWZyZXNocmF0ZW51bTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFBnU2V0VmlkZW9Nb2RlKCZzZXR0aW5ncykgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX0VudGVyRnVsbFNjcmVlbigpOiBQZ1NldFZpZGVvTW9kZSgpIGNhbGwgZmFpbGVkICFcbiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhpcy0+c2NyZWVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfT1BFTkdMKT09U0RMX09QRU5HTCkKLSAgICAgICAgICAgIHsKLSNpZiAhU0RMX1ZJREVPX09QRU5HTCB8fCAoX05UT19WRVJTSU9OIDwgNjMwKQotICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiA2LjMuMCAqLwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm1vZGU9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChPQ0ltYWdlLmRpcmVjdF9jb250ZXh0PT1OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9DSW1hZ2UuZGlyZWN0X2NvbnRleHQ9KFBkRGlyZWN0Q29udGV4dF90KilQZENyZWF0ZURpcmVjdENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIU9DSW1hZ2UuZGlyZWN0X2NvbnRleHQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX0VudGVyRnVsbFNjcmVlbigpOiBDYW4ndCBjcmVhdGUgZGlyZWN0IGNvbnRleHQgIVxuIik7Ci0gICAgICAgICAgICAgICAgICAgIHBoX0xlYXZlRnVsbFNjcmVlbih0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgT0NJbWFnZS5vbGREQz1QZERpcmVjdFN0YXJ0KE9DSW1hZ2UuZGlyZWN0X2NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgY3VycmVudGx5X2Z1bGxzY3JlZW4gPSAxOwotICAgIH0KLSAgICBQZ0ZsdXNoKCk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IHBoX0xlYXZlRnVsbFNjcmVlbihfVEhJUykKLXsKLSAgICBQZ0Rpc3BsYXlTZXR0aW5nc190IG9sZG1vZGVfc2V0dGluZ3M7Ci0gICAgICAgCi0gICAgaWYgKGN1cnJlbnRseV9mdWxsc2NyZWVuKQotICAgIHsKLSAgICAgICAgaWYgKCh0aGlzLT5zY3JlZW4pICYmICgodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9PUEVOR0wpPT1TRExfT1BFTkdMKSkKLSAgICAgICAgewotI2lmICFTRExfVklERU9fT1BFTkdMIHx8IChfTlRPX1ZFUlNJT04gPCA2MzApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgLyogcmVsZWFzZSByb3V0aW5lcyBzdGFydHMgaGVyZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoT0NJbWFnZS5kaXJlY3RfY29udGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQZERpcmVjdFN0b3AoT0NJbWFnZS5kaXJlY3RfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgUGRSZWxlYXNlRGlyZWN0Q29udGV4dChPQ0ltYWdlLmRpcmVjdF9jb250ZXh0KTsKLSAgICAgICAgICAgICAgICBPQ0ltYWdlLmRpcmVjdF9jb250ZXh0PU5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoT0NJbWFnZS5vbGREQykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQaERDU2V0Q3VycmVudChPQ0ltYWdlLm9sZERDKTsKLSAgICAgICAgICAgICAgICBPQ0ltYWdlLm9sZERDPU5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1cnJlbnRseV9mdWxsc2NyZWVuPTA7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RvcmUgb2xkIHZpZGVvIG1vZGUgKi8KLSAgICAgICAgICAgIGlmIChvbGRfdmlkZW9fbW9kZSAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvbGRtb2RlX3NldHRpbmdzLm1vZGUgPSAodW5zaWduZWQgc2hvcnQpIG9sZF92aWRlb19tb2RlOwotICAgICAgICAgICAgICAgIG9sZG1vZGVfc2V0dGluZ3MucmVmcmVzaCA9ICh1bnNpZ25lZCBzaG9ydCkgb2xkX3JlZnJlc2hfcmF0ZTsKLSAgICAgICAgICAgICAgICBvbGRtb2RlX3NldHRpbmdzLmZsYWdzID0gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoUGdTZXRWaWRlb01vZGUoJm9sZG1vZGVfc2V0dGluZ3MpIDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigiUGhfTGVhdmVGdWxsU2NyZWVuKCk6IFBnU2V0VmlkZW9Nb2RlKCkgZnVuY3Rpb24gZmFpbGVkICFcbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9sZF92aWRlb19tb2RlPS0xOwotICAgICAgICAgICAgb2xkX3JlZnJlc2hfcmF0ZT0tMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9tb2Rlc19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW9kZXNfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmU0OTRjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9tb2Rlc19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfX1NETF9QSF9NT0RFU19IX18KLSNkZWZpbmUgX19TRExfUEhfTU9ERVNfSF9fCi0KLSNpbmNsdWRlICJTRExfcGhfdmlkZW8uaCIKLQotI2RlZmluZSBQSF9NQVhfVklERU9NT0RFUyAxMjcKLQotI2RlZmluZSBQSF9FTlRFUl9ESVJFQ1RNT0RFICAwCi0jZGVmaW5lIFBIX0lHTk9SRV9ESVJFQ1RNT0RFIDEKLQotZXh0ZXJuIFNETF9SZWN0ICoqcGhfTGlzdE1vZGVzKF9USElTLFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgcGhfRnJlZVZpZGVvTW9kZXMoX1RISVMpOwotZXh0ZXJuIGludCBwaF9SZXNpemVGdWxsU2NyZWVuKF9USElTKTsKLWV4dGVybiBpbnQgcGhfRW50ZXJGdWxsU2NyZWVuKF9USElTLCBTRExfU3VyZmFjZSogc2NyZWVuLCBpbnQgZm1vZGUpOwotZXh0ZXJuIGludCBwaF9MZWF2ZUZ1bGxTY3JlZW4oX1RISVMpOwotZXh0ZXJuIGludCBwaF9HZXRWaWRlb01vZGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwKTsKLWV4dGVybiBpbnQgZ2V0X21vZGVfYW55X2Zvcm1hdChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApOwotZXh0ZXJuIGludCBwaF9Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgb24pOwotCi0jZW5kaWYgLyogX19TRExfUEhfTU9ERVNfSF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9tb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDg2OGJjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9tb3VzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIi4uL1NETF9jdXJzb3JfYy5oIgotI2luY2x1ZGUgIlNETF9waF9tb3VzZV9jLmgiCi0KLXN0cnVjdCBXTWN1cnNvcgotewotICAgIFBoQ3Vyc29yRGVmX3QgKnBoX2N1cnNvciA7Ci19OwotCi12b2lkIHBoX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKLXsKLSAgICBpZiAod2luZG93ICE9IE5VTEwpCi0gICAgewotICAgICAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOwotCi0gICAgICAgIGlmIChQdFNldFJlc291cmNlKHdpbmRvdywgUHRfQVJHX0NVUlNPUl9UWVBFLCBQaF9DVVJTT1JfSU5IRVJJVCwgMCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUT0RPOiBvdXRwdXQgZXJyb3IgbXNnICovCi0gICAgICAgIH0KLQotICAgICAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0gICAgfQkKLQotICAgIFNETF9mcmVlKGN1cnNvcik7Ci19Ci0KLVdNY3Vyc29yICpwaF9DcmVhdGVXTUN1cnNvcihfVEhJUywgVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KQotewotICAgIFdNY3Vyc29yKiBjdXJzb3I7Ci0gICAgaW50IGNsZW4sIGk7Ci0gICAgdW5zaWduZWQgY2hhciBiaXQsIGRhdGFiaXQsIG1hc2tiaXQ7Ci0KLSAgICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgY3Vyc29yIG1lbW9yeSAqLwotICAgIGlmICgoY3Vyc29yID0gKFdNY3Vyc29yKilTRExfbWFsbG9jKHNpemVvZihXTWN1cnNvcikpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgIHJldHVybihOVUxMKTsKLSAgICB9Ci0gICAgU0RMX21lbXNldChjdXJzb3IsMCxzaXplb2YoV01jdXJzb3IpKTsKLQotICAgIGN1cnNvci0+cGhfY3Vyc29yID0gKFBoQ3Vyc29yRGVmX3QgKikgU0RMX21hbGxvYyhzaXplb2YoUGhDdXJzb3JEZWZfdCkgKyAzMio0KjIpOwotCi0gICAgaWYgKGN1cnNvci0+cGhfY3Vyc29yID09IE5VTEwpCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoInBoX0NyZWF0ZVdNQ3Vyc29yKCk6IGN1cnNvciBtYWxsb2MgZmFpbGVkICFcbiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBTRExfbWVtc2V0KGN1cnNvci0+cGhfY3Vyc29yLDAsKHNpemVvZihQaEN1cnNvckRlZl90KSArIDMyKjQqMikpOwotCi0gICAgY3Vyc29yLT5waF9jdXJzb3ItPmhkci50eXBlID1QaF9SREFUQV9DVVJTT1I7ICAgCi0gICAgY3Vyc29yLT5waF9jdXJzb3ItPnNpemUxLnggPSAoc2hvcnQpdzsKLSAgICBjdXJzb3ItPnBoX2N1cnNvci0+c2l6ZTEueSA9IChzaG9ydCloOwotICAgIGN1cnNvci0+cGhfY3Vyc29yLT5vZmZzZXQxLnggPSAoc2hvcnQpaG90X3g7Ci0gICAgY3Vyc29yLT5waF9jdXJzb3ItPm9mZnNldDEueSA9IChzaG9ydClob3RfeTsKLSAgICBjdXJzb3ItPnBoX2N1cnNvci0+Ynl0ZXNwZXJsaW5lMSA9IChjaGFyKXcvODsKLSAgICBjdXJzb3ItPnBoX2N1cnNvci0+Y29sb3IxID0gUGdfV0hJVEU7Ci0gICAgY3Vyc29yLT5waF9jdXJzb3ItPnNpemUyLnggPSAoc2hvcnQpdzsKLSAgICBjdXJzb3ItPnBoX2N1cnNvci0+c2l6ZTIueSA9IChzaG9ydCloOwotICAgIGN1cnNvci0+cGhfY3Vyc29yLT5vZmZzZXQyLnggPSAoc2hvcnQpaG90X3g7Ci0gICAgY3Vyc29yLT5waF9jdXJzb3ItPm9mZnNldDIueSA9IChzaG9ydClob3RfeTsKLSAgICBjdXJzb3ItPnBoX2N1cnNvci0+Ynl0ZXNwZXJsaW5lMiA9IChjaGFyKXcvODsKLSAgICBjdXJzb3ItPnBoX2N1cnNvci0+Y29sb3IyID0gUGdfQkxBQ0s7Ci0KLSAgICBjbGVuID0gKHcvOCkqaDsKLQotICAgIC8qIENvcHkgdGhlIG1hc2sgYW5kIHRoZSBkYXRhIHRvIGRpZmZlcmVudCBiaXRtYXAgcGxhbmVzICovCi0gICAgZm9yIChpPTA7IGk8Y2xlbjsgKytpKQotICAgIHsKLSAgICAgICAgZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykKLSAgICAgICAgewotICAgICAgICAgICAgZGF0YWJpdCA9IGRhdGFbaV0gJiAoMSA8PCBiaXQpOwotICAgICAgICAgICAgbWFza2JpdCA9IG1hc2tbaV0gJiAoMSA8PCBiaXQpOwotCi0gICAgICAgICAgICBjdXJzb3ItPnBoX2N1cnNvci0+aW1hZ2VzW2ldIHw9IChkYXRhYml0ID09IDApID8gbWFza2JpdCA6IDA7Ci0gICAgICAgICAgICAvKiBJZiB0aGUgZGF0YWJpdCAhPSAwLCB0cmVhdCBpdCBhcyBhIGJsYWNrIHBpeGVsIGFuZAotICAgICAgICAgICAgICogaWdub3JlIHRoZSBtYXNrYml0IChjYW4ndCBkbyBhbiBpbnZlcnRlZCBjb2xvcikgKi8KLSAgICAgICAgICAgIGN1cnNvci0+cGhfY3Vyc29yLT5pbWFnZXNbaStjbGVuXSB8PSBkYXRhYml0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogI2J5dGVzIGZvbGxvd2luZyB0aGUgaGRyIHN0cnVjdCAqLwotICAgIGN1cnNvci0+cGhfY3Vyc29yLT5oZHIubGVuID1zaXplb2YoUGhDdXJzb3JEZWZfdCkgKyBjbGVuKjIgLSBzaXplb2YoUGhSZWdpb25EYXRhSGRyX3QpOyAKLQotICAgIHJldHVybiAoY3Vyc29yKTsKLX0KLQotUGhDdXJzb3JEZWZfdCBwaF9HZXRXTVBoQ3Vyc29yKFdNY3Vyc29yICpjdXJzb3IpCi17Ci0gICAgcmV0dXJuICgqY3Vyc29yLT5waF9jdXJzb3IpOwotfQotCi1pbnQgcGhfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciogY3Vyc29yKQotewotICAgIFB0QXJnX3QgYXJnc1szXTsKLSAgICBpbnQgbmFyZ3MgPSAwOwotCi0gICAgLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGRpc3BsYXkgaXMgZ29uZSAqLwotICAgIGlmICh3aW5kb3cgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgLyogbG9va3MgbGlrZSBwaG90b24gY2FuJ3QgZHJhdyBtb3VzZSBjdXJzb3IgaW4gZGlyZWN0IG1vZGUgKi8KLSAgICBpZiAoKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4pCi0gICAgewotICAgICAgICAgLyogZGlzYWJsZSB0aGUgZmFrZSBtb3VzZSBpbiB0aGUgZnVsbHNjcmVlbiBPcGVuR0wgbW9kZSAqLwotICAgICAgICAgaWYgKCh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX09QRU5HTCkgPT0gU0RMX09QRU5HTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICBjdXJzb3I9TlVMTDsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcGhvdG9uIGN1cnNvciwgb3IgYmxhbmsgaWYgY3Vyc29yIGlzIE5VTEwgKi8KLSAgICBpZiAoY3Vyc29yIT1OVUxMKQotICAgIHsKLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbMF0sIFB0X0FSR19DVVJTT1JfVFlQRSwgUGhfQ1VSU09SX0JJVE1BUCwgMCk7Ci0gICAgICAgIC8qIENvdWxkIHNldCBuZXh0IHRvIGFueSBQZ0NvbG9yX3QgdmFsdWUgKi8KLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbMV0sIFB0X0FSR19DVVJTT1JfQ09MT1IsIFBoX0NVUlNPUl9ERUZBVUxUX0NPTE9SICwgMCk7Ci0gICAgICAgIFB0U2V0QXJnKCZhcmdzWzJdLCBQdF9BUkdfQklUTUFQX0NVUlNPUiwgY3Vyc29yLT5waF9jdXJzb3IsIChjdXJzb3ItPnBoX2N1cnNvci0+aGRyLmxlbiArIHNpemVvZihQaFJlZ2lvbkRhdGFIZHJfdCkpKTsKLSAgICAgICAgbmFyZ3MgPSAzOwotICAgIH0KLSAgICBlbHNlIC8qIFBoX0NVUlNPUl9OT05FICovCi0gICAgewotICAgICAgICBQdFNldEFyZygmYXJnc1swXSwgUHRfQVJHX0NVUlNPUl9UWVBFLCBQaF9DVVJTT1JfTk9ORSwgMCk7Ci0gICAgICAgIG5hcmdzID0gMTsKLSAgICB9Ci0KLSAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOwotCi0gICAgaWYgKFB0U2V0UmVzb3VyY2VzKHdpbmRvdywgbmFyZ3MsIGFyZ3MpIDwgMCApCi0gICAgewotICAgICAgICByZXR1cm4gKDApOwotICAgIH0JCi0KLSAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLSAgICByZXR1cm4gKDEpOwotfQotCi0KLXZvaWQgcGhfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCi17Ci0gICAgc2hvcnQgYWJzX3gsIGFic195OwotCi0gICAgU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKLSAgICBQdEdldEFic1Bvc2l0aW9uKCB3aW5kb3csICZhYnNfeCwgJmFic195ICk7Ci0gICAgUGhNb3ZlQ3Vyc29yQWJzKCBQaElucHV0R3JvdXAoTlVMTCksIHggKyBhYnNfeCwgeSArIGFic195ICk7Ci0gICAgU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotfQotCi0KLXZvaWQgcGhfQ2hlY2tNb3VzZU1vZGUoX1RISVMpCi17Ci0gICAgLyogSWYgdGhlIG1vdXNlIGlzIGhpZGRlbiBhbmQgaW5wdXQgaXMgZ3JhYmJlZCwgd2UgdXNlIHJlbGF0aXZlIG1vZGUgKi8KLSAgICBpZiAoICEoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICYmICh0aGlzLT5pbnB1dF9ncmFiICE9IFNETF9HUkFCX09GRikpCi0gICAgewotICAgICAgICBtb3VzZV9yZWxhdGl2ZSA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1vdXNlX3JlbGF0aXZlID0gMDsKLSAgICB9Ci19Ci0KLQotdm9pZCBwaF9VcGRhdGVNb3VzZShfVEhJUykKLXsKLSAgICBQaEN1cnNvckluZm9fdCBwaGN1cnNvcjsKLSAgICBzaG9ydCBhYnNfeDsKLSAgICBzaG9ydCBhYnNfeTsKLQotICAgIC8qIExvY2sgdGhlIGV2ZW50IHRocmVhZCwgaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50cyAqLwotICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLSAgICAvKiBzeW5jaHJvbml6aW5nIHBob3RvbiBtb3VzZSBjdXJzb3IgcG9zaXRpb24gYW5kIFNETCBtb3VzZSBwb3NpdGlvbiwgaWYgY3Vyc29yIGFwcGVhcnMgb3ZlciB3aW5kb3cuICovCi0gICAgUHRHZXRBYnNQb3NpdGlvbih3aW5kb3csICZhYnNfeCwgJmFic195KTsKLSAgICBQaFF1ZXJ5Q3Vyc29yKFBoSW5wdXRHcm91cChOVUxMKSwgJnBoY3Vyc29yKTsKLSAgICBpZiAoKChwaGN1cnNvci5wb3MueCA+PSBhYnNfeCkgJiYgKHBoY3Vyc29yLnBvcy54IDw9IGFic194ICsgdGhpcy0+c2NyZWVuLT53KSkgJiYKLSAgICAgICAgKChwaGN1cnNvci5wb3MueSA+PSBhYnNfeSkgJiYgKHBoY3Vyc29yLnBvcy55IDw9IGFic195ICsgdGhpcy0+c2NyZWVuLT5oKSkpCi0gICAgewotICAgICAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7Ci0gICAgICAgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgcGhjdXJzb3IucG9zLngtYWJzX3gsIHBoY3Vyc29yLnBvcy55LWFic195KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOwotICAgIH0KLQotICAgIC8qIFVubG9jayB0aGUgZXZlbnQgdGhyZWFkLCBpbiBtdWx0aS10aHJlYWRpbmcgZW52aXJvbm1lbnRzICovCi0gICAgU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX21vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9tb3VzZV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NGZmMWQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX21vdXNlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9fU0RMX1BIX01PVVNFX0hfXwotI2RlZmluZSBfX1NETF9QSF9NT1VTRV9IX18KLQotI2luY2x1ZGUgIlNETF9waF92aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KLWV4dGVybiB2b2lkIHBoX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7Ci1leHRlcm4gV01jdXJzb3IgKnBoX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAotCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOwotZXh0ZXJuIFBoQ3Vyc29yRGVmX3QgcGhfR2V0V01QaEN1cnNvcihXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiBpbnQgcGhfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiB2b2lkIHBoX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KTsKLWV4dGVybiB2b2lkIHBoX0NoZWNrTW91c2VNb2RlKF9USElTKTsKLWV4dGVybiB2b2lkIHBoX1VwZGF0ZU1vdXNlKF9USElTKTsKLQotI2VuZGlmIC8qIF9fU0RMX1BIX01PVVNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX3ZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MjY2ZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotCi0jaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3BoX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3BoX21vZGVzX2MuaCIKLSNpbmNsdWRlICJTRExfcGhfaW1hZ2VfYy5oIgotI2luY2x1ZGUgIlNETF9waF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9waF9tb3VzZV9jLmgiCi0jaW5jbHVkZSAiU0RMX3BoX3dtX2MuaCIKLSNpbmNsdWRlICJTRExfcGhfZ2wuaCIKLSNpbmNsdWRlICJTRExfcGh5dXZfYy5oIgotI2luY2x1ZGUgIi4uL2JsYW5rX2N1cnNvci5oIgotCi1zdGF0aWMgaW50ICBwaF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1N1cmZhY2UgKnBoX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgIHBoX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgdm9pZCBwaF9WaWRlb1F1aXQoX1RISVMpOwotc3RhdGljIHZvaWQgcGhfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKTsKLQotc3RhdGljIGludCBwaHN0YXR1cz0tMTsKLQotc3RhdGljIGludCBwaF9BdmFpbGFibGUodm9pZCkKLXsKLSAgICBpZiAocGhzdGF0dXMhPTApCi0gICAgewotICAgICAgICBwaHN0YXR1cz1QdEluaXQoTlVMTCk7Ci0gICAgICAgIGlmIChwaHN0YXR1cz09MCkKLSAgICAgICAgewotICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UqIHBoX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0gICAgU0RMX1ZpZGVvRGV2aWNlKiBkZXZpY2U7Ci0KLSAgICAvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotICAgIGRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLSAgICBpZiAoZGV2aWNlKQotICAgIHsKLSAgICAgICAgU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOwotICAgICAgICBkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEqKVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLSAgICAgICAgZGV2aWNlLT5nbF9kYXRhID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpKQotICAgIHsKLSAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgIHBoX0RlbGV0ZURldmljZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQotICAgIC8qIFNldCB0aGUgZHJpdmVyIGZsYWdzICovCi0gICAgZGV2aWNlLT5oYW5kbGVzX2FueV9zaXplID0gMTsKLQotICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgICBkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBwaF9DcmVhdGVZVVZPdmVybGF5OwotICAgIGRldmljZS0+VmlkZW9Jbml0ID0gcGhfVmlkZW9Jbml0OwotICAgIGRldmljZS0+TGlzdE1vZGVzID0gcGhfTGlzdE1vZGVzOwotICAgIGRldmljZS0+U2V0VmlkZW9Nb2RlID0gcGhfU2V0VmlkZW9Nb2RlOwotICAgIGRldmljZS0+VG9nZ2xlRnVsbFNjcmVlbiA9IHBoX1RvZ2dsZUZ1bGxTY3JlZW47Ci0gICAgZGV2aWNlLT5VcGRhdGVNb3VzZSA9IHBoX1VwZGF0ZU1vdXNlOwotICAgIGRldmljZS0+U2V0Q29sb3JzID0gcGhfU2V0Q29sb3JzOwotICAgIGRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB1cCBpbiBwaF9TZXR1cFVwZGF0ZUZ1bmN0aW9uICovCi0gICAgZGV2aWNlLT5WaWRlb1F1aXQgPSBwaF9WaWRlb1F1aXQ7Ci0gICAgZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IHBoX0FsbG9jSFdTdXJmYWNlOwotICAgIGRldmljZS0+Q2hlY2tIV0JsaXQgPSBwaF9DaGVja0hXQmxpdDsKLSAgICBkZXZpY2UtPkZpbGxIV1JlY3QgPSBwaF9GaWxsSFdSZWN0OwotICAgIGRldmljZS0+U2V0SFdDb2xvcktleSA9IHBoX1NldEhXQ29sb3JLZXk7Ci0gICAgZGV2aWNlLT5TZXRIV0FscGhhID0gcGhfU2V0SFdBbHBoYTsKLSAgICBkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBwaF9Mb2NrSFdTdXJmYWNlOwotICAgIGRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gcGhfVW5sb2NrSFdTdXJmYWNlOwotICAgIGRldmljZS0+RmxpcEhXU3VyZmFjZSA9IHBoX0ZsaXBIV1N1cmZhY2U7Ci0gICAgZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gcGhfRnJlZUhXU3VyZmFjZTsKLSAgICBkZXZpY2UtPlNldENhcHRpb24gPSBwaF9TZXRDYXB0aW9uOwotICAgIGRldmljZS0+U2V0SWNvbiA9IE5VTEw7Ci0gICAgZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gcGhfSWNvbmlmeVdpbmRvdzsKLSAgICBkZXZpY2UtPkdyYWJJbnB1dCA9IHBoX0dyYWJJbnB1dDsKLSAgICBkZXZpY2UtPkdldFdNSW5mbyA9IHBoX0dldFdNSW5mbzsKLSAgICBkZXZpY2UtPkZyZWVXTUN1cnNvciA9IHBoX0ZyZWVXTUN1cnNvcjsKLSAgICBkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gcGhfQ3JlYXRlV01DdXJzb3I7Ci0gICAgZGV2aWNlLT5TaG93V01DdXJzb3IgPSBwaF9TaG93V01DdXJzb3I7Ci0gICAgZGV2aWNlLT5XYXJwV01DdXJzb3IgPSBwaF9XYXJwV01DdXJzb3I7Ci0gICAgZGV2aWNlLT5Nb3ZlV01DdXJzb3IgPSBOVUxMOwotICAgIGRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBwaF9DaGVja01vdXNlTW9kZTsKLSAgICBkZXZpY2UtPkluaXRPU0tleW1hcCA9IHBoX0luaXRPU0tleW1hcDsKLSAgICBkZXZpY2UtPlB1bXBFdmVudHMgPSBwaF9QdW1wRXZlbnRzOwotCi0gICAgLyogT3BlbkdMIHN1cHBvcnQuICovCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotICAgIGRldmljZS0+R0xfTWFrZUN1cnJlbnQgPSBwaF9HTF9NYWtlQ3VycmVudDsKLSAgICBkZXZpY2UtPkdMX1N3YXBCdWZmZXJzID0gcGhfR0xfU3dhcEJ1ZmZlcnM7Ci0gICAgZGV2aWNlLT5HTF9HZXRBdHRyaWJ1dGUgPSBwaF9HTF9HZXRBdHRyaWJ1dGU7Ci0gICAgZGV2aWNlLT5HTF9Mb2FkTGlicmFyeSA9IHBoX0dMX0xvYWRMaWJyYXJ5OwotICAgIGRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBwaF9HTF9HZXRQcm9jQWRkcmVzczsKLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi0KLSAgICBkZXZpY2UtPmZyZWUgPSBwaF9EZWxldGVEZXZpY2U7Ci0gICAgCi0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotVmlkZW9Cb290U3RyYXAgcGhfYm9vdHN0cmFwID0gewotICAgICJwaG90b24iLCAiUU5YIFBob3RvbiB2aWRlbyBvdXRwdXQiLAotICAgIHBoX0F2YWlsYWJsZSwgcGhfQ3JlYXRlRGV2aWNlCi19OwotCi1zdGF0aWMgdm9pZCBwaF9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0gICAgaWYgKGRldmljZSkKLSAgICB7Ci0gICAgICAgIGlmIChkZXZpY2UtPmhpZGRlbikKLSAgICAgICAgewotICAgICAgICAgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotICAgICAgICAgICAgZGV2aWNlLT5oaWRkZW4gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UtPmdsX2RhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNETF9mcmVlKGRldmljZS0+Z2xfZGF0YSk7Ci0gICAgICAgICAgICBkZXZpY2UtPmdsX2RhdGEgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIFNETF9mcmVlKGRldmljZSk7Ci0gICAgICAgIGRldmljZSA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgUHRXaWRnZXRfdCAqcGhfQ3JlYXRlV2luZG93KF9USElTKQotewotICAgIFB0V2lkZ2V0X3QgKndpZGdldDsKLSAgICAKLSAgICB3aWRnZXQgPSBQdENyZWF0ZVdpZGdldChQdFdpbmRvdywgTlVMTCwgMCwgTlVMTCk7Ci0KLSAgICByZXR1cm4gd2lkZ2V0OwotfQotCi1zdGF0aWMgaW50IHBoX1NldHVwV2luZG93KF9USElTLCBpbnQgdywgaW50IGgsIGludCBmbGFncykKLXsKLSAgICBQdEFyZ190ICAgICBhcmdzWzMyXTsKLSAgICBQaFBvaW50X3QgICBwb3MgPSB7MCwgMH07Ci0gICAgUGhEaW1fdCogICAgb2xkZGltOwotICAgIFBoRGltX3QgICAgIGRpbSA9IHt3LCBofTsKLSAgICBQaFJlY3RfdCAgICBkZXNrdG9wZXh0ZW50OwotICAgIGludCAgICAgICAgIG5hcmdzID0gMDsKLSAgICBjb25zdCBjaGFyKiB3aW5kb3dwb3M7Ci0gICAgY29uc3QgY2hhciogaXNjZW50ZXJlZDsKLSAgICBpbnQgICAgICAgICB4LCB5OwotCi0gICAgLyogY2hlY2sgaWYgd2luZG93IHNpemUgaGFzIGJlZW4gY2hhbmdlZCBieSBXaW5kb3cgTWFuYWdlciAqLwotICAgIFB0R2V0UmVzb3VyY2Uod2luZG93LCBQdF9BUkdfRElNLCAmb2xkZGltLCAwKTsKLSAgICBpZiAoKG9sZGRpbS0+dyE9dykgfHwgKG9sZGRpbS0+aCE9aCkpCi0gICAgewotICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfRElNLCAmZGltLCAwKTsKLSAgICB9Ci0KLSAgICBpZiAoKGZsYWdzICYgU0RMX1JFU0laQUJMRSkgPT0gU0RMX1JFU0laQUJMRSkKLSAgICB7Ci0gICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfV0lORE9XX01BTkFHRURfRkxBR1MsIFB0X0ZBTFNFLCBQaF9XTV9DTE9TRSk7Ci0gICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfV0lORE9XX01BTkFHRURfRkxBR1MsIFB0X1RSVUUsIFBoX1dNX01BWCB8IFBoX1dNX1JFU1RPUkUgfCBQaF9XTV9SRVNJWkUpOwotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19OT1RJRllfRkxBR1MsIFB0X1RSVUUsIFBoX1dNX1JFU0laRSB8IFBoX1dNX01PVkUgfCBQaF9XTV9DTE9TRSB8IFBoX1dNX01BWCB8IFBoX1dNX1JFU1RPUkUpOwotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19SRU5ERVJfRkxBR1MsIFB0X1RSVUUsIFBoX1dNX1JFTkRFUl9SRVNJWkUgfCBQaF9XTV9SRU5ERVJfTUFYIHwgUGhfV01fUkVOREVSX0NPTExBUFNFIHwgUGhfV01fUkVOREVSX1JFVFVSTik7Ci0gICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfUkVTSVpFX0ZMQUdTLCBQdF9UUlVFLCBQdF9SRVNJWkVfWFlfQVNfUkVRVUlSRUQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19NQU5BR0VEX0ZMQUdTLCBQdF9GQUxTRSwgUGhfV01fUkVTSVpFIHwgUGhfV01fTUFYIHwgUGhfV01fUkVTVE9SRSB8IFBoX1dNX0NMT1NFKTsKLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfTk9USUZZX0ZMQUdTLCBQdF9GQUxTRSwgUGhfV01fUkVTSVpFIHwgUGhfV01fTUFYIHwgUGhfV01fUkVTVE9SRSk7Ci0gICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfV0lORE9XX05PVElGWV9GTEFHUywgUHRfVFJVRSwgUGhfV01fTU9WRSB8IFBoX1dNX0NMT1NFKTsKLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfUkVOREVSX0ZMQUdTLCBQdF9GQUxTRSwgUGhfV01fUkVOREVSX1JFU0laRSB8IFBoX1dNX1JFTkRFUl9NQVggfCBQaF9XTV9SRU5ERVJfQ09MTEFQU0UgfCBQaF9XTV9SRU5ERVJfUkVUVVJOKTsKLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19SRVNJWkVfRkxBR1MsIFB0X0ZBTFNFLCBQdF9SRVNJWkVfWFlfQVNfUkVRVUlSRUQpOwotICAgIH0KLQotICAgIGlmICgoKGZsYWdzICYgU0RMX05PRlJBTUUpPT1TRExfTk9GUkFNRSkgfHwgKChmbGFncyAmIFNETF9GVUxMU0NSRUVOKT09U0RMX0ZVTExTQ1JFRU4pKQotICAgIHsKLSAgICAgICBpZiAoKGZsYWdzICYgU0RMX1JFU0laQUJMRSkgIT0gU0RMX1JFU0laQUJMRSkKLSAgICAgICB7Ci0gICAgICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfV0lORE9XX1JFTkRFUl9GTEFHUywgUHRfRkFMU0UsIFB0X1RSVUUpOwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19SRU5ERVJfRkxBR1MsIFB0X0ZBTFNFLCBQdF9UUlVFKTsKLSAgICAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfUkVOREVSX0ZMQUdTLCBQdF9UUlVFLCBQaF9XTV9SRU5ERVJfUkVTSVpFIHwgUGhfV01fUkVOREVSX0JPUkRFUik7Ci0gICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19SRU5ERVJfRkxBR1MsIFB0X1RSVUUsIFBoX1dNX1JFTkRFUl9CT1JERVIgfCBQaF9XTV9SRU5ERVJfVElUTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhfV01fUkVOREVSX0NMT1NFIHwgUGhfV01fUkVOREVSX01FTlUgfCBQaF9XTV9SRU5ERVJfTUlOKTsKLSAgICB9Ci0KLSAgICBpZiAoKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOKQotICAgIHsKLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19QT1MsICZwb3MsIDApOwotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX0JBU0lDX0ZMQUdTLCBQdF9UUlVFLCBQdF9CQVNJQ19QUkVWRU5UX0ZJTEwpOwotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19NQU5BR0VEX0ZMQUdTLCBQdF9UUlVFLCBQaF9XTV9GRlJPTlQgfCBQaF9XTV9NQVggfCBQaF9XTV9UT0ZST05UIHwgUGhfV01fQ09OU1dJVENIKTsKLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X1RSVUUsIFBoX1dNX1NUQVRFX0lTRlJPTlQgfCBQaF9XTV9TVEFURV9JU0ZPQ1VTIHwgUGhfV01fU1RBVEVfSVNBTFRLRVkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19NQU5BR0VEX0ZMQUdTLCBQdF9GQUxTRSwgUGhfV01fRkZST05UIHwgUGhfV01fQ09OU1dJVENIKTsKLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X0ZBTFNFLCBQaF9XTV9TVEFURV9JU0ZST05UKTsKLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X1RSVUUsIFBoX1dNX1NUQVRFX0lTQUxUS0VZKTsKLQotICAgICAgICBpZiAoKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX0hXU1VSRkFDRSkKLSAgICAgICAgewotICAgICAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19CQVNJQ19GTEFHUywgUHRfVFJVRSwgUHRfQkFTSUNfUFJFVkVOVF9GSUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfRklMTF9DT0xPUiwgUGdfQkxBQ0ssIDApOwotICAgICAgICB9Ci0gICAgICAgIGlmICghY3VycmVudGx5X21heGltaXplZCkKLSAgICAgICAgewotICAgICAgICAgICAgd2luZG93cG9zID0gU0RMX2dldGVudigiU0RMX1ZJREVPX1dJTkRPV19QT1MiKTsKLSAgICAgICAgICAgIGlzY2VudGVyZWQgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fQ0VOVEVSRUQiKTsKLQotICAgICAgICAgICAgaWYgKChpc2NlbnRlcmVkKSB8fCAoKHdpbmRvd3BvcykgJiYgKFNETF9zdHJjbXAod2luZG93cG9zLCAiY2VudGVyIik9PTApKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQaFdpbmRvd1F1ZXJ5VmlzaWJsZShQaF9RVUVSWV9DT05TT0xFLCAwLCAwLCAmZGVza3RvcGV4dGVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2t0b3BfbW9kZS53aWR0aD53KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zLnggPSAoZGVza3RvcF9tb2RlLndpZHRoIC0gdykvMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2t0b3BfbW9kZS5oZWlnaHQ+aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcy55ID0gKGRlc2t0b3BfbW9kZS5oZWlnaHQgLSBoKS8yOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBvcy54Kz1kZXNrdG9wZXh0ZW50LnVsLng7Ci0gICAgICAgICAgICAgICAgcG9zLnkrPWRlc2t0b3BleHRlbnQudWwueTsKLSAgICAgICAgICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1BPUywgJnBvcywgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHdpbmRvd3BvcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTRExfc3NjYW5mKHdpbmRvd3BvcywgIiVkLCVkIiwgJngsICZ5KSA9PSAyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHg8ZGVza3RvcF9tb2RlLndpZHRoKSAmJiAoeTxkZXNrdG9wX21vZGUuaGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaFdpbmRvd1F1ZXJ5VmlzaWJsZShQaF9RVUVSWV9DT05TT0xFLCAwLCAwLCAmZGVza3RvcGV4dGVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLng9eCtkZXNrdG9wZXh0ZW50LnVsLng7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLnk9eStkZXNrdG9wZXh0ZW50LnVsLnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1BPUywgJnBvcywgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiB3aW5kb3cgaXMgbWF4aW1pemVkIHJlbmRlciBpdCBhcyBtYXhpbWl6ZWQgKi8KLSAgICAgICAgaWYgKGN1cnJlbnRseV9tYXhpbWl6ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X1RSVUUsIFBoX1dNX1NUQVRFX0lTTUFYKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X0ZBTFNFLCBQaF9XTV9TVEFURV9JU01BWCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBkbyBub3QgZ3JhYiB0aGUga2V5Ym9hcmQgYnkgZGVmYXVsdCAqLwotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19TVEFURSwgUHRfRkFMU0UsIFBoX1dNX1NUQVRFX0lTQUxUS0VZKTsKLQotICAgICAgICAvKiBicmluZyB0aGUgZm9jdXMgdG8gdGhlIHdpbmRvdyAqLwotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19TVEFURSwgUHRfVFJVRSwgUGhfV01fU1RBVEVfSVNGT0NVUyk7Ci0KLSAgICAgICAgLyogYWxsb3cgdG8gY2F0Y2ggaGlkZSBldmVudCAqLwotICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19NQU5BR0VEX0ZMQUdTLCBQdF9UUlVFLCBQaF9XTV9ISURFKTsKLSAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfTk9USUZZX0ZMQUdTLCBQdF9UUlVFLCBQaF9XTV9ISURFKTsKLSAgICB9Ci0KLSAgICBQdFNldFJlc291cmNlcyh3aW5kb3csIG5hcmdzLCBhcmdzKTsKLSAgICBQdFJlYWxpemVXaWRnZXQod2luZG93KTsKLSAgICBQdFdpbmRvd1RvRnJvbnQod2luZG93KTsKLQotI2lmIDAgLyogRklYTUUgKi8KLSAgICBQdEdldFJlc291cmNlKHdpbmRvdywgUHRfQVJHX1BPUywgJm9sZGRpbSwgMCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJQT1NJVElPTjogJWQsICVkXG4iLCBvbGRkaW0tPncsIG9sZGRpbS0+aCk7Ci0jZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IENvbG91ck1hc2tzKiBwaF9HZXRDb2xvdXJNYXNrcyhpbnQgYnBwKQotewotICAgIC8qIFRoZSBhbHBoYSBtYXNrIGRvZXNuJ3QgYXBwZWFycyB0byBiZSBuZWVkZWQgKi8KLSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IENvbG91ck1hc2tzIHBoQ29sb3JNYXNrc1s1XSA9IHsKLSAgICAgICAgLyogIDggYml0ICAgICAgKi8gIHswLCAwLCAwLCAwLCA4fSwKLSAgICAgICAgLyogMTUgYml0IEFSR0IgKi8gIHsweDdDMDAsIDB4MDNFMCwgMHgwMDFGLCAweDgwMDAsIDE1fSwKLSAgICAgICAgLyogMTYgYml0ICBSR0IgKi8gIHsweEY4MDAsIDB4MDdFMCwgMHgwMDFGLCAweDAwMDAsIDE2fSwKLSAgICAgICAgLyogMjQgYml0ICBSR0IgKi8gIHsweEZGMDAwMCwgMHgwMEZGMDAsIDB4MDAwMEZGLCAweDAwMDAwMCwgMjR9LAotICAgICAgICAvKiAzMiBiaXQgQVJHQiAqLyAgezB4MDBGRjAwMDAsIDB4MDAwMEZGMDAsIDB4MDAwMDAwRkYsIDB4RkYwMDAwMDAsIDMyfSwKLSAgICB9OwotCi0gICAgc3dpdGNoIChicHApCi0gICAgewotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbMF07Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbMV07Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbMl07Ci0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbM107Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbNF07Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHBoX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0KiB2Zm9ybWF0KQotewotICAgIFBnSFdDYXBzX3QgaHdjYXBzOwotICAgIGludCBpOwotCi0gICAgd2luZG93PU5VTEw7Ci0gICAgZGVza3RvcHBhbD1TRExQSF9QQUxfTk9ORTsKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLSAgICBvZ2xjdHg9TlVMTDsKLSAgICBvZ2xidWZmZXJzPU5VTEw7Ci0gICAgb2dsZmxhZ3M9MDsKLSAgICBvZ2xicHA9MDsKLSNlbmRpZgotICAgIAotICAgIG9sZF92aWRlb19tb2RlPS0xOwotICAgIG9sZF9yZWZyZXNoX3JhdGU9LTE7Ci0JCi0gICAgaWYgKE5VTEwgPT0gKHBoZXZlbnQgPSBTRExfbWFsbG9jKEVWRU5UX1NJWkUpKSkKLSAgICB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIFNETF9tZW1zZXQocGhldmVudCwgMHgwMCwgRVZFTlRfU0laRSk7Ci0KLSAgICB3aW5kb3cgPSBwaF9DcmVhdGVXaW5kb3codGhpcyk7Ci0gICAgaWYgKHdpbmRvdyA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9WaWRlb0luaXQoKTogQ291bGRuJ3QgY3JlYXRlIHZpZGVvIHdpbmRvdyAhXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSB0aGUgYmxhbmsgY3Vyc29yICovCi0gICAgU0RMX0JsYW5rQ3Vyc29yID0gdGhpcy0+Q3JlYXRlV01DdXJzb3IodGhpcywgYmxhbmtfY2RhdGEsIGJsYW5rX2NtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClCTEFOS19DV0lEVEgsIChpbnQpQkxBTktfQ0hFSUdIVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpQkxBTktfQ0hPVFgsIChpbnQpQkxBTktfQ0hPVFkpOwotCi0gICAgaWYgKFNETF9CbGFua0N1cnNvciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChQZ0dldEdyYXBoaWNzSFdDYXBzKCZod2NhcHMpIDwgMCkKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigicGhfVmlkZW9Jbml0KCk6IEdldEdyYXBoaWNzSFdDYXBzIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKLSAgICAgICAgdGhpcy0+RnJlZVdNQ3Vyc29yKHRoaXMsIFNETF9CbGFua0N1cnNvcik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoUGdHZXRWaWRlb01vZGVJbmZvKGh3Y2Fwcy5jdXJyZW50X3ZpZGVvX21vZGUsICZkZXNrdG9wX21vZGUpIDwgMCkKLSAgICB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigicGhfVmlkZW9Jbml0KCk6IFBnR2V0VmlkZW9Nb2RlSW5mbyBmdW5jdGlvbiBmYWlsZWQgIVxuIik7Ci0gICAgICAgIHRoaXMtPkZyZWVXTUN1cnNvcih0aGlzLCBTRExfQmxhbmtDdXJzb3IpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUgKi8KLSAgIHRoaXMtPmluZm8uY3VycmVudF93ID0gZGVza3RvcF9tb2RlLndpZHRoOwotICAgdGhpcy0+aW5mby5jdXJyZW50X2ggPSBkZXNrdG9wX21vZGUuaGVpZ2h0OwotCi0gICAgLyogV2UgbmVlZCB0byByZXR1cm4gQnl0ZXNQZXJQaXhlbCBhcyBpdCBpbiB1c2VkIGJ5IENyZWF0ZVJHQnN1cmZhY2UgKi8KLSAgICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBkZXNrdG9wX21vZGUuYml0c19wZXJfcGl4ZWw7Ci0gICAgdmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9IGRlc2t0b3BfbW9kZS5ieXRlc19wZXJfc2NhbmxpbmUvZGVza3RvcF9tb2RlLndpZHRoOwotICAgIGRlc2t0b3BicHAgPSBkZXNrdG9wX21vZGUuYml0c19wZXJfcGl4ZWw7Ci0gICAgCi0gICAgLyogc2F2ZSBjdXJyZW50IHBhbGV0dGUgKi8KLSAgICBpZiAoZGVza3RvcGJwcD09OCkKLSAgICB7Ci0gICAgICAgIFBnR2V0UGFsZXR0ZShzYXZlZHBhbCk7Ci0gICAgICAgIFBnR2V0UGFsZXR0ZShzeXNwYWxwaCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvcihpPTA7IGk8X1BnX01BWF9QQUxFVFRFOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhdmVkcGFsW2ldPVBnUkdCKDAsIDAsIDApOwotICAgICAgICAgICAgc3lzcGFscGhbaV09UGdSR0IoMCwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgICAKLSAgICBjdXJyZW50bHlfZnVsbHNjcmVlbiA9IDA7Ci0gICAgY3VycmVudGx5X2hpZGVkID0gMDsKLSAgICBjdXJyZW50bHlfbWF4aW1pemVkID0gMDsKLSAgICBjdXJyZW50X292ZXJsYXkgPSBOVUxMOwotCi0gICAgT0NJbWFnZS5kaXJlY3RfY29udGV4dCA9IE5VTEw7Ci0gICAgT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCA9IE5VTEw7Ci0gICAgT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQgPSBOVUxMOwotICAgIE9DSW1hZ2Uub2xkREMgPSBOVUxMOwotICAgIE9DSW1hZ2UuQ3VycmVudEZyYW1lRGF0YSA9IE5VTEw7Ci0gICAgT0NJbWFnZS5GcmFtZURhdGEwID0gTlVMTDsKLSAgICBPQ0ltYWdlLkZyYW1lRGF0YTEgPSBOVUxMOwotICAgIHZpZGVvbW9kZV9lbXVsYXRlbW9kZSA9IDA7Ci0gICAgCi0gICAgdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAxOwotCi0gICAgcGhfVXBkYXRlSFdJbmZvKHRoaXMpOwotICAgIAotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgU0RMX1N1cmZhY2UqIHBoX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQotewotICAgIGNvbnN0IHN0cnVjdCBDb2xvdXJNYXNrcyogbWFzazsKLQotICAgIC8qIExvY2sgdGhlIGV2ZW50IHRocmVhZCwgaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50cyAqLwotICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLSAgICBjdXJyZW50LT5mbGFncyA9IGZsYWdzOwotCi0gICAgLyogaWYgd2UgZG8gbm90IGhhdmUgZGVzaXJlZCBmdWxsc2NyZWVuIG1vZGUsIHRoZW4gZmFsbGJhY2sgaW50byB3aW5kb3cgbW9kZSAqLwotICAgIGlmICgoKGN1cnJlbnQtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOKSAmJiAocGhfR2V0VmlkZW9Nb2RlKHdpZHRoLCBoZWlnaHQsIGJwcCk9PTApKQotICAgIHsKLSAgICAgICBjdXJyZW50LT5mbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0gICAgICAgY3VycmVudC0+ZmxhZ3MgJj0gflNETF9OT0ZSQU1FOwotICAgICAgIGN1cnJlbnQtPmZsYWdzICY9IH5TRExfUkVTSVpBQkxFOwotICAgIH0KLQotICAgIHBoX1NldHVwV2luZG93KHRoaXMsIHdpZHRoLCBoZWlnaHQsIGN1cnJlbnQtPmZsYWdzKTsKLQotICAgIG1hc2sgPSBwaF9HZXRDb2xvdXJNYXNrcyhicHApOwotICAgIGlmIChtYXNrICE9IE5VTEwpCi0gICAgewotICAgICAgICBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBtYXNrLT5icHAsIG1hc2stPnJlZCwgbWFzay0+Z3JlZW4sIG1hc2stPmJsdWUsIDApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldFZpZGVvTW9kZSgpOiBkZXNpcmVkIGJwcCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHBob3RvbiAhXG4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNETF9PUEVOR0wpPT1TRExfT1BFTkdMKQotICAgIHsKLSNpZiAhU0RMX1ZJREVPX09QRU5HTAotICAgICAgICAvKiBpZiBubyBidWlsdC1pbiBPcGVuR0wgc3VwcG9ydCAqLwotICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldFZpZGVvTW9kZSgpOiBubyBPcGVuR0wgc3VwcG9ydCwgeW91IG5lZWQgdG8gcmVjb21waWxlIFNETC5cbiIpOwotICAgICAgICBjdXJyZW50LT5mbGFncyAmPSB+U0RMX09QRU5HTDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTCAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBJbml0aWFsaXplIGludGVybmFsIHZhcmlhYmxlcyAqLwotICAgICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYnBwPT04KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZGVza3RvcHBhbD1TRExQSF9QQUxfU1lTVEVNOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXJyZW50LT5mbGFncyAmPSB+U0RMX1JFU0laQUJMRTsgLyogbm8gcmVzaXplIGZvciBEaXJlY3QgQ29udGV4dCAqLwotICAgICAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHJlbW92ZSB0aGlzIGlmIHdlJ2xsIGhhdmUgc3VwcG9ydCBmb3IgdGhlIG5vbi1mdWxsc2NyZWVuIHN3L2h3K2RvdWJsZWJ1ZiBvbmUgZGF5ICovCi0gICAgICAgICAgICBjdXJyZW50LT5mbGFncyAmPSB+U0RMX0RPVUJMRUJVRjsKLQotICAgICAgICAgICAgLyogVXNlIG9mZnNjcmVlbiBtZW1vcnkgaWYgU0RMX0hXU1VSRkFDRSBmbGFnIGlzIHNldCAqLwotICAgICAgICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2t0b3BicHAhPWJwcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgY3VycmVudC0+ZmxhZ3MgJj0gflNETF9IV1NVUkZBQ0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiB1c2luZyBwYWxldHRlIGVtdWxhdGlvbiBjb2RlIGluIHdpbmRvdyBtb2RlICovCi0gICAgICAgICAgICBpZiAoYnBwPT04KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkZXNrdG9wYnBwPj0xNSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2t0b3BwYWwgPSBTRExQSF9QQUxfRU1VTEFURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVza3RvcHBhbCA9IFNETFBIX1BBTF9TWVNURU07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZGVza3RvcHBhbCA9IFNETFBIX1BBTF9OT05FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY3VycmVudC0+dyA9IHdpZHRoOwotICAgIGN1cnJlbnQtPmggPSBoZWlnaHQ7Ci0KLSAgICBpZiAoZGVza3RvcHBhbD09U0RMUEhfUEFMX1NZU1RFTSkKLSAgICB7Ci0gICAgICAgY3VycmVudC0+ZmxhZ3N8PVNETF9IV1BBTEVUVEU7Ci0gICAgfQotCi0gICAgLyogTXVzdCBjYWxsIGF0IGxlYXN0IG9uY2UgZm9yIHNldHVwIGltYWdlIHBsYW5lcyAqLwotICAgIGlmIChwaF9TZXR1cFVwZGF0ZUZ1bmN0aW9uKHRoaXMsIGN1cnJlbnQsIGN1cnJlbnQtPmZsYWdzKT09LTEpCi0gICAgewotICAgICAgICAvKiBFcnJvciBzdHJpbmcgd2FzIGZpbGxlZCBpbiB0aGUgcGhfU2V0dXBVcGRhdGVGdW5jdGlvbigpICovCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIGZpbmlzaCB3aW5kb3cgZHJhd2luZywgaWYgd2UgYXJlIG5vdCBpbiBmdWxsc2NyZWVuLCBvZiBjb3Vyc2UgKi8KLSAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICE9IFNETF9GVUxMU0NSRUVOKQotICAgIHsKLSAgICAgICBQdEZsdXNoKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgUGdGbHVzaCgpOwotICAgIH0KLQotICAgIHZpc3VhbGJwcD1icHA7Ci0KLSAgICBwaF9VcGRhdGVIV0luZm8odGhpcyk7Ci0KLSAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLSAgICAvKiBXZSd2ZSBkb25lISAqLwotICAgIHJldHVybiAoY3VycmVudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBoX1ZpZGVvUXVpdChfVEhJUykKLXsKLSAgICAvKiByZXN0b3JlIHBhbGV0dGUgKi8KLSAgICBpZiAoZGVza3RvcGJwcD09OCkKLSAgICB7Ci0gICAgICAgIFBnU2V0UGFsZXR0ZShzeXNwYWxwaCwgMCwgLTEsIDAsIDAsIDApOwotICAgICAgICBQZ1NldFBhbGV0dGUoc2F2ZWRwYWwsIDAsIDAsIF9QZ19NQVhfUEFMRVRURSwgUGdfUEFMU0VUX0dMT0JBTCB8IFBnX1BBTFNFVF9GT1JDRV9FWFBPU0UsIDApOwotICAgICAgICBQZ0ZsdXNoKCk7Ci0gICAgfQotCi0gICAgcGhfRGVzdHJveUltYWdlKHRoaXMsIFNETF9WaWRlb1N1cmZhY2UpOyAKLQotICAgIGlmICh3aW5kb3cpCi0gICAgewotICAgICAgICBQdFVucmVhbGl6ZVdpZGdldCh3aW5kb3cpOwotICAgICAgICBQdERlc3Ryb3lXaWRnZXQod2luZG93KTsKLSAgICAgICAgd2luZG93PU5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHBoZXZlbnQhPU5VTEwpCi0gICAgewotICAgICAgICBTRExfZnJlZShwaGV2ZW50KTsKLSAgICAgICAgcGhldmVudD1OVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGludCBwaF9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0gICAgaW50IGk7Ci0gICAgU0RMX1JlY3QgdXBkYXRlcmVjdDsKLQotICAgIHVwZGF0ZXJlY3QueCA9IHVwZGF0ZXJlY3QueSA9IDA7Ci0gICAgdXBkYXRlcmVjdC53ID0gdGhpcy0+c2NyZWVuLT53OwotICAgIHVwZGF0ZXJlY3QuaCA9IHRoaXMtPnNjcmVlbi0+aDsKLQotICAgIC8qIHBhbGV0dGUgZW11bGF0aW9uIGNvZGUsIHVzaW5nIHBhbGV0dGUgb2YgdGhlIFBoSW1hZ2VfdCBzdHJ1Y3QgKi8KLSAgICBpZiAoZGVza3RvcHBhbD09U0RMUEhfUEFMX0VNVUxBVEUpCi0gICAgewotICAgICAgICBpZiAoKFNETF9JbWFnZSkgJiYgKFNETF9JbWFnZS0+cGFsZXR0ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaT1maXJzdGNvbG9yOyBpPGZpcnN0Y29sb3IrbmNvbG9yczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN5c3BhbHBoW2ldID0gUGdSR0IoY29sb3JzW2ktZmlyc3Rjb2xvcl0uciwgY29sb3JzW2ktZmlyc3Rjb2xvcl0uZywgY29sb3JzW2ktZmlyc3Rjb2xvcl0uYik7Ci0gICAgICAgICAgICAgICAgU0RMX0ltYWdlLT5wYWxldHRlW2ldID0gc3lzcGFscGhbaV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGltYWdlIG5lZWRzIHRvIGJlIHJlZHJhd24gKi8KLSAgICAgICAgICAgIHRoaXMtPlVwZGF0ZVJlY3RzKHRoaXMsIDEsICZ1cGRhdGVyZWN0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZGVza3RvcHBhbD09U0RMUEhfUEFMX1NZU1RFTSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpPWZpcnN0Y29sb3I7IGk8Zmlyc3Rjb2xvcituY29sb3JzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3lzcGFscGhbaV0gPSBQZ1JHQihjb2xvcnNbaS1maXJzdGNvbG9yXS5yLCBjb2xvcnNbaS1maXJzdGNvbG9yXS5nLCBjb2xvcnNbaS1maXJzdGNvbG9yXS5iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICE9IFNETF9GVUxMU0NSRUVOKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgbW9kZSBtdXN0IHVzZSBzb2Z0IHBhbGV0dGUgKi8KLSAgICAgICAgICAgICAgICBQZ1NldFBhbGV0dGUoJnN5c3BhbHBoW2ZpcnN0Y29sb3JdLCAwLCBmaXJzdGNvbG9yLCBuY29sb3JzLCBQZ19QQUxTRVRfR0xPQkFMLCAwKTsKLSAgICAgICAgICAgICAgICAvKiBpbWFnZSBuZWVkcyB0byBiZSByZWRyYXduICovCi0gICAgICAgICAgICAgICAgdGhpcy0+VXBkYXRlUmVjdHModGhpcywgMSwgJnVwZGF0ZXJlY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGZ1bGxzY3JlZW4gbW9kZSBtdXN0IHVzZSBoYXJkd2FyZSBwYWxldHRlICovCi0gICAgICAgICAgICAgICAgUGdTZXRQYWxldHRlKCZzeXNwYWxwaFtmaXJzdGNvbG9yXSwgMCwgZmlyc3Rjb2xvciwgbmNvbG9ycywgUGdfUEFMU0VUX0dMT0JBTCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTRExQSF9QQUxfTk9ORSBkbyBub3RoaW5nICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIDE7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF92aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX3ZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1YjEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX3ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX19TRExfUEhfVklERU9fSF9fCi0jZGVmaW5lIF9fU0RMX1BIX1ZJREVPX0hfXwotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0KLSNpbmNsdWRlIDxzeXMvbmV1dHJpbm8uaD4KLQotI2luY2x1ZGUgPFBoLmg+Ci0jaW5jbHVkZSA8UHQuaD4KLSNpbmNsdWRlIDxwaG90b24vUGcuaD4KLSNpbmNsdWRlIDxwaG90b24vUGREaXJlY3QuaD4KLQotI2lmIFNETF9WSURFT19PUEVOR0wKLSAgICAjaWYgKF9OVE9fVkVSU0lPTiA8IDYzMCkKLSAgICAgICAgI2luY2x1ZGUgPHBob3Rvbi9QZEdMLmg+Ci0gICAgI2Vsc2UKLSAgICAgICAgI2luY2x1ZGUgPEdML3FueGdsLmg+Ci0gICAgICAgICNpbmNsdWRlIDxHTC9HTFBoLmg+Ci0gICAgI2VuZGlmIC8qIDYuMy4wICovCi0jZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTCAqLwotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlKiB0aGlzCi0KLSNkZWZpbmUgUEhfT0dMX01BWF9BVFRSSUJTIDMyCi0KLSNkZWZpbmUgU0RMUEhfUEFMX05PTkUgICAgMHgwMDAwMDAwMEwKLSNkZWZpbmUgU0RMUEhfUEFMX0VNVUxBVEUgMHgwMDAwMDAwMUwKLSNkZWZpbmUgU0RMUEhfUEFMX1NZU1RFTSAgMHgwMDAwMDAwMkwKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1bnNpZ25lZCBjaGFyKiBZOwotICAgIHVuc2lnbmVkIGNoYXIqIFY7Ci0gICAgdW5zaWduZWQgY2hhciogVTsKLX0gRlJBTUVEQVRBOwotCi0vKiBNYXNrIHZhbHVlcyBmb3IgU0RMX1JlYWxsb2NGb3JtYXQoKSAqLwotc3RydWN0IENvbG91ck1hc2tzCi17Ci0gICAgVWludDMyIHJlZDsKLSAgICBVaW50MzIgZ3JlZW47Ci0gICAgVWludDMyIGJsdWU7Ci0gICAgVWludDMyIGFscGhhOwotICAgIFVpbnQzMiBicHA7Ci19OwotCi0vKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLwotc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhCi17Ci0gICAgUGdEaXNwbGF5U2V0dGluZ3NfdCBtb2RlX3NldHRpbmdzOwkKLSAgICBQdFdpZGdldF90ICpXaW5kb3c7ICAgICAgICAgICAgICAgICAgLyogdXNlZCB0byBoYW5kbGUgaW5wdXQgZXZlbnRzICovCi0gICAgUGhJbWFnZV90ICppbWFnZTsJICAgICAgICAgICAgICAgICAvKiB1c2VkIHRvIGRpc3BsYXkgaW1hZ2UgICAgICAgKi8KLSNpZiBTRExfVklERU9fT1BFTkdMCi0gICAgI2lmIChfTlRPX1ZFUlNJT04gPCA2MzApCi0gICAgICAgIFBkT3BlbkdMQ29udGV4dF90KiBPR0xDb250ZXh0OyAgIC8qIE9wZW5HTCBjb250ZXh0ICAgICAgICAgICAgICAqLwotICAgICAgICB2b2lkKiBPR0xCdWZmZXJzOyAgICAgICAgICAgICAgICAvKiBPcGVuR0wgYnVmZmVycyAodW51c2VkKSAgICAgKi8KLSAgICAjZWxzZQotICAgICAgICBxbnhnbGNfdCogT0dMQ29udGV4dDsgICAgICAgICAgICAvKiBPcGVuR0wgY29udGV4dCBmb3IgdGhlIDYuMyAgKi8KLSAgICAgICAgcW54Z2xfYnVmc190KiBPR0xCdWZmZXJzOyAgICAgICAgLyogT3BlbkdMIGJ1ZmZlcnMgZm9yIHRoZSA2LjMgICovCi0gICAgI2VuZGlmIC8qIDYzMCAqLwotCi0gICAgVWludDMyIE9HTEZsYWdzOyAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW5HTCBmbGFncyAgICAgICAgICAgICAgICAqLwotICAgIFVpbnQzMiBPR0xCUFA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuR0wgYnBwICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi0gICAgUGdDb2xvcl90IHNhdmVkcGFsW19QZ19NQVhfUEFMRVRURV07Ci0gICAgUGdDb2xvcl90IHN5c3BhbHBoW19QZ19NQVhfUEFMRVRURV07Ci0KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIFBkRGlyZWN0Q29udGV4dF90KiAgICBkaXJlY3RfY29udGV4dDsKLSAgICAgICAgUGRPZmZzY3JlZW5Db250ZXh0X3QqIG9mZnNjcmVlbl9jb250ZXh0OwotICAgICAgICBQZE9mZnNjcmVlbkNvbnRleHRfdCogb2Zmc2NyZWVuX2JhY2tjb250ZXh0OwotICAgICAgICBQaERyYXdDb250ZXh0X3QqICAgICAgb2xkREM7Ci0gICAgICAgIHVpbnQ4X3QqICAgICAgICAgICAgICBkY19wdHI7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIqICAgICAgICBDdXJyZW50RnJhbWVEYXRhOwotICAgICAgICB1bnNpZ25lZCBjaGFyKiAgICAgICAgRnJhbWVEYXRhMDsKLSAgICAgICAgdW5zaWduZWQgY2hhciogICAgICAgIEZyYW1lRGF0YTE7Ci0gICAgICAgIFVpbnQzMiAgICAgICAgICAgICAgICBjdXJyZW50OwotICAgICAgICBVaW50MzIgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgfSBvY2ltYWdlOwotCi0gICAgUGdIV0NhcHNfdCBncmFwaGljc19jYXJkX2NhcHM7ICAvKiBHcmFwaGljcyBjYXJkIGNhcHMgYXQgdGhlIG1vbWVudCBvZiBzdGFydCAgICovCi0gICAgUGdWaWRlb01vZGVJbmZvX3QgZGVza3RvcF9tb2RlOyAvKiBDdXJyZW50IGRlc2t0b3AgdmlkZW8gbW9kZSBpbmZvcm1hdGlvbiAgICAgICovCi0gICAgaW50IG9sZF92aWRlb19tb2RlOyAgICAgICAgICAgICAvKiBTdG9yZWQgbW9kZSBiZWZvcmUgZnVsbHNjcmVlbiBzd2l0Y2ggICAgICAgICovCi0gICAgaW50IG9sZF9yZWZyZXNoX3JhdGU7ICAgICAgICAgICAvKiBTdG9yZWQgcmVmcmVzaCByYXRlIGJlZm9yIGZ1bGxzY3JlZW4gc3dpdGNoICovCi0KLSAgICBpbnQgbW91c2VfcmVsYXRpdmU7Ci0gICAgV01jdXJzb3IqIEJsYW5rQ3Vyc29yOwotICAgIHVpbnQzMl90IHZpZGVvbW9kZV9lbXVsYXRlbW9kZTsKLQotICAgIFVpbnQzMiB2aXN1YWxicHA7CSAgICAgICAgICAgIC8qIGN1cnJlbnQgdmlzdWFsIGJwcCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBVaW50MzIgZGVza3RvcGJwcDsgICAgICAgICAgICAgIC8qIGJwcCBvZiBkZXNrdG9wIGF0IHRoZSBtb21lbnQgb2Ygc3RhcnQgICAgICAgKi8KLSAgICBVaW50MzIgZGVza3RvcHBhbDsgICAgICAgICAgICAgIC8qIHBhbGV0dGUgbW9kZSBlbXVsYXRpb24gb3Igc3lzdGVtICAgICAgICAgICAgKi8KLQotICAgIGludCBjdXJyZW50bHlfZnVsbHNjcmVlbjsKLSAgICBpbnQgY3VycmVudGx5X2hpZGVkOyAgICAgICAgICAgIC8qIDEgLSB3aW5kb3cgaGlkZWQgKG1pbmltYXplZCksIDAgLSBub3JtYWwgICAgKi8KLSAgICBpbnQgY3VycmVudGx5X21heGltaXplZDsgICAgICAgIC8qIDEgLSB3aW5kb3cgaGlkZWQgKG1pbmltYXplZCksIDAgLSBub3JtYWwgICAgKi8KLQotICAgIFBoRXZlbnRfdCogZXZlbnQ7Ci0gICAgU0RMX092ZXJsYXkqIG92ZXJsYXk7Ci19OwotCi0jZGVmaW5lIG1vZGVfc2V0dGluZ3MgICAgICAgICAodGhpcy0+aGlkZGVuLT5tb2RlX3NldHRpbmdzKQotI2RlZmluZSB3aW5kb3cJICAgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT5XaW5kb3cpCi0jZGVmaW5lIFNETF9JbWFnZSAgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT5pbWFnZSkKLSNkZWZpbmUgT0NJbWFnZSAgICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPm9jaW1hZ2UpCi0jZGVmaW5lIG9sZF92aWRlb19tb2RlICAgICAgICAodGhpcy0+aGlkZGVuLT5vbGRfdmlkZW9fbW9kZSkKLSNkZWZpbmUgb2xkX3JlZnJlc2hfcmF0ZSAgICAgICh0aGlzLT5oaWRkZW4tPm9sZF9yZWZyZXNoX3JhdGUpCi0jZGVmaW5lIGdyYXBoaWNzX2NhcmRfY2FwcyAgICAodGhpcy0+aGlkZGVuLT5ncmFwaGljc19jYXJkX2NhcHMpCi0jZGVmaW5lIGRlc2t0b3BicHAgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT5kZXNrdG9wYnBwKQotI2RlZmluZSB2aXN1YWxicHAgICAgICAgICAgICAgKHRoaXMtPmhpZGRlbi0+dmlzdWFsYnBwKQotI2RlZmluZSBkZXNrdG9wcGFsICAgICAgICAgICAgKHRoaXMtPmhpZGRlbi0+ZGVza3RvcHBhbCkKLSNkZWZpbmUgc2F2ZWRwYWwgICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPnNhdmVkcGFsKQotI2RlZmluZSBzeXNwYWxwaCAgICAgICAgICAgICAgKHRoaXMtPmhpZGRlbi0+c3lzcGFscGgpCi0jZGVmaW5lIGN1cnJlbnRseV9mdWxsc2NyZWVuICAodGhpcy0+aGlkZGVuLT5jdXJyZW50bHlfZnVsbHNjcmVlbikKLSNkZWZpbmUgY3VycmVudGx5X2hpZGVkICAgICAgICh0aGlzLT5oaWRkZW4tPmN1cnJlbnRseV9oaWRlZCkKLSNkZWZpbmUgY3VycmVudGx5X21heGltaXplZCAgICh0aGlzLT5oaWRkZW4tPmN1cnJlbnRseV9tYXhpbWl6ZWQpCi0jZGVmaW5lIHBoZXZlbnQgICAgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT5ldmVudCkKLSNkZWZpbmUgY3VycmVudF9vdmVybGF5ICAgICAgICh0aGlzLT5oaWRkZW4tPm92ZXJsYXkpCi0jZGVmaW5lIGRlc2t0b3BfbW9kZSAgICAgICAgICAodGhpcy0+aGlkZGVuLT5kZXNrdG9wX21vZGUpCi0jZGVmaW5lIG1vdXNlX3JlbGF0aXZlICAgICAgICAodGhpcy0+aGlkZGVuLT5tb3VzZV9yZWxhdGl2ZSkKLSNkZWZpbmUgU0RMX0JsYW5rQ3Vyc29yICAgICAgICh0aGlzLT5oaWRkZW4tPkJsYW5rQ3Vyc29yKQotI2RlZmluZSB2aWRlb21vZGVfZW11bGF0ZW1vZGUgKHRoaXMtPmhpZGRlbi0+dmlkZW9tb2RlX2VtdWxhdGVtb2RlKQotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotICAgICAjZGVmaW5lIG9nbGN0eCAgICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPk9HTENvbnRleHQpCi0gICAgICNkZWZpbmUgb2dsYnVmZmVycyAgICAgICAgICAgKHRoaXMtPmhpZGRlbi0+T0dMQnVmZmVycykKLSAgICAgI2RlZmluZSBvZ2xmbGFncyAgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT5PR0xGbGFncykKLSAgICAgI2RlZmluZSBvZ2xicHAgICAgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT5PR0xCUFApCi0jZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTCAqLwotCi0jZW5kaWYgLyogX19TRExfUEhfVklERU9fSF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfd20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF93bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGRjNzgwLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF93bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8UGguaD4KLSNpbmNsdWRlIDxwaG90b24vUHBQcm90by5oPgotI2luY2x1ZGUgPHBob3Rvbi9QaFdtLmg+Ci0jaW5jbHVkZSA8cGhvdG9uL3dtYXBpLmg+Ci0KLSNpbmNsdWRlICJTRExfdmVyc2lvbi5oIgotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfcGhfbW9kZXNfYy5oIgotI2luY2x1ZGUgIlNETF9waF93bV9jLmgiCi0KLXZvaWQgcGhfU2V0SWNvbihfVEhJUywgU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKQotewotICAgIHJldHVybjsKLX0KLQotLyogU2V0IHdpbmRvdyBjYXB0aW9uICovCi12b2lkIHBoX1NldENhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKQotewotICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLSAgICAvKiBzYW5pdHkgY2hlY2sgZm9yIHNldCBjYXB0aW9uIGNhbGwgYmVmb3JlIHdpbmRvdyBpbml0ICovCi0gICAgaWYgKHdpbmRvdyE9TlVMTCkKLSAgICB7Ci0gICAgICAgIFB0U2V0UmVzb3VyY2Uod2luZG93LCBQdF9BUkdfV0lORE9XX1RJVExFLCB0aXRsZSwgMCk7Ci0gICAgfQotCi0gICAgU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotfQotCi0vKiBJY29uaWZ5IGN1cnJlbnQgd2luZG93ICovCi1pbnQgcGhfSWNvbmlmeVdpbmRvdyhfVEhJUykKLXsKLSAgICBQaFdpbmRvd0V2ZW50X3Qgd2luZG93ZXZlbnQ7Ci0KLSAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOwotCi0gICAgU0RMX21lbXNldCgmd2luZG93ZXZlbnQsIDAsIHNpemVvZih3aW5kb3dldmVudCkpOwotICAgIHdpbmRvd2V2ZW50LmV2ZW50X2YgPSBQaF9XTV9ISURFOwotICAgIHdpbmRvd2V2ZW50LmV2ZW50X3N0YXRlID0gUGhfV01fRVZTVEFURV9ISURFOwotICAgIHdpbmRvd2V2ZW50LnJpZCA9IFB0V2lkZ2V0UmlkKHdpbmRvdyk7Ci0gICAgUHRGb3J3YXJkV2luZG93RXZlbnQoJndpbmRvd2V2ZW50KTsKLQotICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKLQotICAgIHJldHVybiAwOwotfQotCi1TRExfR3JhYk1vZGUgcGhfR3JhYklucHV0Tm9Mb2NrKF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSkKLXsKLSAgICBzaG9ydCBhYnNfeCwgYWJzX3k7Ci0KLSAgICBpZiggbW9kZSA9PSBTRExfR1JBQl9PRkYgKQotICAgIHsKLSAgICAgICAgUHRTZXRSZXNvdXJjZSh3aW5kb3csIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X0ZBTFNFLCBQaF9XTV9TVEFURV9JU0FMVEtFWSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFB0U2V0UmVzb3VyY2Uod2luZG93LCBQdF9BUkdfV0lORE9XX1NUQVRFLCBQdF9UUlVFLCBQaF9XTV9TVEFURV9JU0FMVEtFWSk7Ci0KLSAgICAgICAgUHRHZXRBYnNQb3NpdGlvbih3aW5kb3csICZhYnNfeCwgJmFic195KTsKLSAgICAgICAgUGhNb3ZlQ3Vyc29yQWJzKFBoSW5wdXRHcm91cChOVUxMKSwgYWJzX3ggKyBTRExfVmlkZW9TdXJmYWNlLT53LzIsIGFic195ICsgU0RMX1ZpZGVvU3VyZmFjZS0+aC8yKTsKLSAgICB9Ci0KLSAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLSAgICByZXR1cm4obW9kZSk7Ci19Ci0KLVNETF9HcmFiTW9kZSBwaF9HcmFiSW5wdXQoX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKQotewotICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0gICAgbW9kZSA9IHBoX0dyYWJJbnB1dE5vTG9jayh0aGlzLCBtb2RlKTsKLSAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLSAgICByZXR1cm4obW9kZSk7Ci19Ci0KLQotaW50IHBoX0dldFdNSW5mbyhfVEhJUywgU0RMX1N5c1dNaW5mbyAqaW5mbykKLXsKLSAgICBpZiAoaW5mby0+dmVyc2lvbi5tYWpvciA8PSBTRExfTUFKT1JfVkVSU0lPTikKLSAgICB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoIkFwcGxpY2F0aW9uIG5vdCBjb21waWxlZCB3aXRoIFNETCAlZC4lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBTRExfTUFKT1JfVkVSU0lPTiwgU0RMX01JTk9SX1ZFUlNJT04pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX3dtX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF93bV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjJkMjMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoX3dtX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9fU0RMX1BIX1dNX0hfXwotI2RlZmluZSBfX1NETF9QSF9XTV9IX18KLQotI2luY2x1ZGUgIlNETF9waF92aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KLWV4dGVybiB2b2lkIHBoX1NldENhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKLWV4dGVybiB2b2lkIHBoX1NldEljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzayk7Ci1leHRlcm4gaW50IHBoX0ljb25pZnlXaW5kb3coX1RISVMpOwotZXh0ZXJuIFNETF9HcmFiTW9kZSBwaF9HcmFiSW5wdXROb0xvY2soX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKTsKLWV4dGVybiBTRExfR3JhYk1vZGUgcGhfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7Ci1leHRlcm4gaW50IHBoX0dldFdNSW5mbyhfVEhJUywgU0RMX1N5c1dNaW5mbyAqaW5mbyk7Ci0KLSNlbmRpZiAvKiBfX1NETF9QSF9XTV9IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waHl1di5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoeXV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZWMwNDEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waG90b24vU0RMX3BoeXV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoaXMgaXMgdGhlIFFOWCBSZWFsdGltZSBQbGF0Zm9ybSB2ZXJzaW9uIG9mIFNETCBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxQaC5oPgotI2luY2x1ZGUgPFB0Lmg+Ci0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfcGh5dXZfYy5oIgotI2luY2x1ZGUgIi4uL1NETF95dXZmdW5jcy5oIgotCi0jZGVmaW5lIE9WRVJMQVlfU1RBVEVfVU5JTklUIDAKLSNkZWZpbmUgT1ZFUkxBWV9TVEFURV9BQ1RJVkUgMQotCi0vKiBUaGUgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIG1hbmlwdWxhdGUgc29mdHdhcmUgdmlkZW8gb3ZlcmxheXMgKi8KLXN0YXRpYyBzdHJ1Y3QgcHJpdmF0ZV95dXZod2Z1bmNzIHBoX3l1dmZ1bmNzID0KLXsKLSAgICBwaF9Mb2NrWVVWT3ZlcmxheSwKLSAgICBwaF9VbmxvY2tZVVZPdmVybGF5LAotICAgIHBoX0Rpc3BsYXlZVVZPdmVybGF5LAotICAgIHBoX0ZyZWVZVVZPdmVybGF5Ci19OwotCi1pbnQgZ3JhYl9wdHJzMihQZ1ZpZGVvQ2hhbm5lbF90KiBjaGFubmVsLCBGUkFNRURBVEEqIEZyYW1lMCwgRlJBTUVEQVRBKiBGcmFtZTEpCi17Ci0gICAgaW50IHBsYW5lcyA9IDA7Ci0KLSAgICAvKiBCdWZmZXJzIGhhdmUgbW92ZWQ7IHJlLW9idGFpbiB0aGUgcG9pbnRlcnMgKi8KLSAgICBGcmFtZTAtPlkgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihjaGFubmVsLT55cGxhbmUxKTsKLSAgICBGcmFtZTEtPlkgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihjaGFubmVsLT55cGxhbmUyKTsKLSAgICBGcmFtZTAtPlUgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihjaGFubmVsLT52cGxhbmUxKTsKLSAgICBGcmFtZTEtPlUgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihjaGFubmVsLT52cGxhbmUyKTsKLSAgICBGcmFtZTAtPlYgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihjaGFubmVsLT51cGxhbmUxKTsKLSAgICBGcmFtZTEtPlYgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihjaGFubmVsLT51cGxhbmUyKTsKLQotICAgIGlmIChGcmFtZTAtPlkpCi0gICAgICAgIHBsYW5lcysrOwotCi0gICAgaWYgKEZyYW1lMC0+VSkKLSAgICAgICAgcGxhbmVzKys7Ci0KLSAgICBpZiAoRnJhbWUwLT5WKQotICAgICAgICBwbGFuZXMrKzsKLQotICAgIHJldHVybiBwbGFuZXM7Ci19Ci0KLVNETF9PdmVybGF5KiBwaF9DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlKiBkaXNwbGF5KQotewotICAgIFNETF9PdmVybGF5KiBvdmVybGF5OwotICAgIHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSogaHdkYXRhOwotICAgIGludCB2aWRwb3J0OwotICAgIGludCBydG5jb2RlOwotICAgIGludCBwbGFuZXM7Ci0gICAgaW50IGk9MDsKLSAgICBQaFBvaW50X3QgcG9zOwotCi0gICAgLyogQ3JlYXRlIHRoZSBvdmVybGF5IHN0cnVjdHVyZSAqLwotICAgIG92ZXJsYXkgPSBTRExfY2FsbG9jKDEsIHNpemVvZihTRExfT3ZlcmxheSkpOwotCi0gICAgaWYgKG92ZXJsYXkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBGaWxsIGluIHRoZSBiYXNpYyBtZW1iZXJzICovCi0gICAgb3ZlcmxheS0+Zm9ybWF0ID0gZm9ybWF0OwotICAgIG92ZXJsYXktPncgPSB3aWR0aDsKLSAgICBvdmVybGF5LT5oID0gaGVpZ2h0OwotICAgIG92ZXJsYXktPmh3ZGF0YSA9IE5VTEw7Ci0JCi0gICAgLyogU2V0IHVwIHRoZSBZVVYgc3VyZmFjZSBmdW5jdGlvbiBzdHJ1Y3R1cmUgKi8KLSAgICBvdmVybGF5LT5od2Z1bmNzID0gJnBoX3l1dmZ1bmNzOwotCi0gICAgLyogQ3JlYXRlIHRoZSBwaXhlbCBkYXRhIGFuZCBsb29rdXAgdGFibGVzICovCi0gICAgaHdkYXRhID0gU0RMX2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhKSk7Ci0KLSAgICBpZiAoaHdkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBvdmVybGF5LT5od2RhdGEgPSBod2RhdGE7Ci0KLSAgICBQaERDU2V0Q3VycmVudCgwKTsKLSAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsID09IE5VTEwpCi0gICAgewotICAgICAgICBpZiAoKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCA9IFBnQ3JlYXRlVmlkZW9DaGFubmVsKFBnX1ZJREVPX0NIQU5ORUxfU0NBTEVSLCAwKSkgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9DcmVhdGVZVVZPdmVybGF5KCk6IENyZWF0ZSBjaGFubmVsIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgb3ZlcmxheS0+aHdkYXRhLT5mb3JjZWRyZWRyYXc9MDsKLQotICAgIFB0R2V0QWJzUG9zaXRpb24od2luZG93LCAmcG9zLngsICZwb3MueSk7Ci0gICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50V2luZG93UG9zLnggPSBwb3MueDsKLSAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRXaW5kb3dQb3MueSA9IHBvcy55OwotICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy54ID0gMDsKLSAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueSA9IDA7Ci0gICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS53ID0gd2lkdGg7Ci0gICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS5oID0gaGVpZ2h0OwotICAgIG92ZXJsYXktPmh3ZGF0YS0+U3RhdGUgPSBPVkVSTEFZX1NUQVRFX1VOSU5JVDsKLSAgICBvdmVybGF5LT5od2RhdGEtPkZyYW1lRGF0YTAgPSAoRlJBTUVEQVRBICopIFNETF9jYWxsb2MoMSwgc2l6ZW9mKEZSQU1FREFUQSkpOwotICAgIG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMSA9IChGUkFNRURBVEEgKikgU0RMX2NhbGxvYygxLCBzaXplb2YoRlJBTUVEQVRBKSk7Ci0KLSAgICB2aWRwb3J0ID0gLTE7Ci0gICAgaT0wOwotICAgIAotICAgIG92ZXJsYXktPmh3ZGF0YS0+aXNjaHJvbWFrZXk9MDsKLQotICAgIGRvIHsKLSAgICAgICAgU0RMX21lbXNldCgmb3ZlcmxheS0+aHdkYXRhLT5jYXBzLCAweDAwLCBzaXplb2YoUGdTY2FsZXJDYXBzX3QpKTsKLSAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5jYXBzLnNpemUgPSBzaXplb2YoUGdTY2FsZXJDYXBzX3QpOwotICAgICAgICBydG5jb2RlID0gUGdHZXRTY2FsZXJDYXBhYmlsaXRpZXMob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLCBpLCAmb3ZlcmxheS0+aHdkYXRhLT5jYXBzKTsKLSAgICAgICAgaWYgKHJ0bmNvZGU9PTApCi0gICAgICAgIHsgCi0gICAgICAgICAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5jYXBzLmZvcm1hdD09Zm9ybWF0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKChvdmVybGF5LT5od2RhdGEtPmNhcHMuZmxhZ3MgJiBQZ19TQ0FMRVJfQ0FQX0RTVF9DSFJPTUFfS0VZKSA9PSBQZ19TQ0FMRVJfQ0FQX0RTVF9DSFJPTUFfS0VZKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+aXNjaHJvbWFrZXk9MTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHZpZHBvcnQ9MTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfSB3aGlsZSgxKTsKLQotCi0gICAgaWYgKHZpZHBvcnQgPT0gLTEpCi0gICAgewotICAgICAgICBTRExfU2V0RXJyb3IoIk5vIGF2YWlsYWJsZSB2aWRlbyBwb3J0cyBmb3IgcmVxdWVzdGVkIGZvcm1hdFxuIik7Ci0gICAgICAgIFNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgb3ZlcmxheS0+aHdkYXRhLT5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy5zaXplID0gc2l6ZW9mKFBnU2NhbGVyUHJvcHNfdCk7Ci0gICAgb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy5zcmNfZGltLncgPSB3aWR0aDsKLSAgICBvdmVybGF5LT5od2RhdGEtPnByb3BzLnNyY19kaW0uaCA9IGhlaWdodDsKLQotICAgIC8qIG92ZXJsYXktPmh3ZGF0YS0+Y2hyb21ha2V5ID0gUGdHZXRPdmVybGF5Q2hyb21hQ29sb3IoKTsgKi8KLSAgICBvdmVybGF5LT5od2RhdGEtPmNocm9tYWtleSA9IFBnUkdCKDEyLCA2LCAxMik7IC8qIHZlcnkgZGFyayBwaW5rIGNvbG9yICovCi0gICAgb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy5jb2xvcl9rZXkgPSBvdmVybGF5LT5od2RhdGEtPmNocm9tYWtleTsKLQotICAgIFBoQXJlYVRvUmVjdCgmb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQsICZvdmVybGF5LT5od2RhdGEtPnByb3BzLnZpZXdwb3J0KTsKLQotICAgIG92ZXJsYXktPmh3ZGF0YS0+cHJvcHMuZmxhZ3MgPSBQZ19TQ0FMRVJfUFJPUF9ET1VCTEVfQlVGRkVSOwotCi0gICAgaWYgKChvdmVybGF5LT5od2RhdGEtPmlzY2hyb21ha2V5KSYmKG92ZXJsYXktPmh3ZGF0YS0+Y2hyb21ha2V5KSkKLSAgICB7Ci0gICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+cHJvcHMuZmxhZ3MgfD0gUGdfU0NBTEVSX1BST1BfQ0hST01BX0VOQUJMRTsKLSAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy5mbGFncyB8PSBQZ19TQ0FMRVJfUFJPUF9DSFJPTUFfU1BFQ0lGWV9LRVlfTUFTSzsKLSAgICB9IAotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+cHJvcHMuZmxhZ3MgJj0gflBnX1NDQUxFUl9QUk9QX0NIUk9NQV9FTkFCTEU7Ci0gICAgfQotCi0gICAgcnRuY29kZSA9IFBnQ29uZmlnU2NhbGVyQ2hhbm5lbChvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwsICZvdmVybGF5LT5od2RhdGEtPnByb3BzKTsKLQotICAgIHN3aXRjaChydG5jb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSAtMTogU0RMX1NldEVycm9yKCJQZ0NvbmZpZ1NjYWxlckNoYW5uZWwgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICBjYXNlIDA6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBsYW5lcyA9IGdyYWJfcHRyczIob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLCBvdmVybGF5LT5od2RhdGEtPkZyYW1lRGF0YTAsIG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMSk7Ci0KLSAgICBpZihvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnlwbGFuZTEgIT0gTlVMTCkKLSAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5ZU3RyaWRlID0gb3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT55cGxhbmUxLT5waXRjaDsKLSAgICBpZihvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnZwbGFuZTEgIT0gTlVMTCkKLSAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5VU3RyaWRlID0gb3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT52cGxhbmUxLT5waXRjaDsKLSAgICBpZihvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnVwbGFuZTEgIT0gTlVMTCkKLSAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5WU3RyaWRlID0gb3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT51cGxhbmUxLT5waXRjaDsKLQotICAgIC8qIGNoZWNrIGZvciB0aGUgdmFsaWRuZXNzIG9mIGFsbCBwbGFuZXMgKi8KLSAgICBpZiAoKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+eXBsYW5lMSA9PSBOVUxMKSAmJgotICAgICAgICAob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT51cGxhbmUxID09IE5VTEwpICYmCi0gICAgICAgIChvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnZwbGFuZTEgPT0gTlVMTCkpCi0gICAgewotICAgICAgIFNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKLSAgICAgICBTRExfU2V0RXJyb3IoIlBnQ29uZmlnU2NhbGVyKCkgcmV0dXJucyBhbGwgcGxhbmVzIGVxdWFsIE5VTExcbiIpOwotICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLS8qCi0gICAgb3ZlcmxheS0+aHdkYXRhLT5jdXJyZW50ID0gUGdOZXh0VmlkZW9GcmFtZShvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwpOwotCi0gICAgaWYgKG92ZXJsYXktPmh3ZGF0YS0+Y3VycmVudD09MCkKLSAgICB7Ci0gICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YSA9IG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhID0gb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGExOwotICAgIH0KLSovCi0gICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhID0gb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGEwOwotCi0vKgotICAgIG92ZXJsYXktPmh3ZGF0YS0+bG9ja2VkID0gMTsKLSovCi0KLSAgICAvKiBGaW5kIHRoZSBwaXRjaCBhbmQgb2Zmc2V0IHZhbHVlcyBmb3IgdGhlIG92ZXJsYXkgKi8KLSAgICBvdmVybGF5LT5wbGFuZXMgPSBwbGFuZXM7Ci0gICAgb3ZlcmxheS0+cGl0Y2hlcyA9IFNETF9jYWxsb2Mob3ZlcmxheS0+cGxhbmVzLCBzaXplb2YoVWludDE2KSk7Ci0gICAgb3ZlcmxheS0+cGl4ZWxzICA9IFNETF9jYWxsb2Mob3ZlcmxheS0+cGxhbmVzLCBzaXplb2YoVWludDgqKSk7Ci0gICAgaWYgKCFvdmVybGF5LT5waXRjaGVzIHx8ICFvdmVybGF5LT5waXhlbHMpCi0gICAgewotICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotICAgICAgICByZXR1cm4oTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKG92ZXJsYXktPnBsYW5lcyA+IDApCi0gICAgewotICAgICAgICBvdmVybGF5LT5waXRjaGVzWzBdID0gb3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT55cGxhbmUxLT5waXRjaDsKLSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzBdICA9IG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YS0+WTsKLSAgICB9Ci0gICAgaWYgKG92ZXJsYXktPnBsYW5lcyA+IDEpCi0gICAgewotICAgICAgICBvdmVybGF5LT5waXRjaGVzWzFdID0gb3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT52cGxhbmUxLT5waXRjaDsKLSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzFdICA9IG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YS0+VTsKLSAgICB9Ci0gICAgaWYgKG92ZXJsYXktPnBsYW5lcyA+IDIpCi0gICAgewotICAgICAgICBvdmVybGF5LT5waXRjaGVzWzJdID0gb3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT51cGxhbmUxLT5waXRjaDsKLSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzJdICA9IG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YS0+VjsKLSAgICB9Ci0KLSAgICBvdmVybGF5LT5od2RhdGEtPlN0YXRlID0gT1ZFUkxBWV9TVEFURV9BQ1RJVkU7Ci0gICAgb3ZlcmxheS0+aHdkYXRhLT5zY2FsZXJfb24gPSAwOwotICAgIG92ZXJsYXktPmh3X292ZXJsYXkgPSAxOwotCi0gICAgY3VycmVudF9vdmVybGF5PW92ZXJsYXk7Ci0KLSAgICByZXR1cm4gb3ZlcmxheTsKLX0KLQotaW50IHBoX0xvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSogb3ZlcmxheSkKLXsKLSAgICBpZiAob3ZlcmxheSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG92ZXJsYXktPmh3ZGF0YS0+bG9ja2VkID0gMTsKLQotLyogIG92ZXJsYXktPmh3ZGF0YS0+Y3VycmVudCA9IFBnTmV4dFZpZGVvRnJhbWUob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsKTsKLSAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5jdXJyZW50ID09IC0xKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yKCJwaF9Mb2NrWVVWT3ZlcmxheTogUGdOZXh0RnJhbWUoKSBmYWlsZWQsIGJhaWxpbmcgb3V0XG4iKTsKLSAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5jdXJyZW50ID09IDApCi0gICAgewotICAgICAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRGcmFtZURhdGEgPSBvdmVybGF5LT5od2RhdGEtPkZyYW1lRGF0YTA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YSA9IG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMTsKLSAgICB9Ci0KLSAgICBpZiAob3ZlcmxheS0+cGxhbmVzID4gMCkKLSAgICB7Ci0gICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMF0gPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnlwbGFuZTEtPnBpdGNoOwotICAgICAgICBvdmVybGF5LT5waXhlbHNbMF0gID0gb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhLT5ZOwotICAgIH0KLSAgICBpZiAob3ZlcmxheS0+cGxhbmVzID4gMSkKLSAgICB7Ci0gICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMV0gPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnVwbGFuZTEtPnBpdGNoOwotICAgICAgICBvdmVybGF5LT5waXhlbHNbMV0gID0gb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhLT5VOwotICAgIH0KLSAgICBpZiAob3ZlcmxheS0+cGxhbmVzID4gMikKLSAgICB7Ci0gICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMl0gPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnZwbGFuZTEtPnBpdGNoOwotICAgICAgICBvdmVybGF5LT5waXhlbHNbMl0gID0gb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhLT5WOwotICAgIH0KLSovCi0KLSAgICByZXR1cm4oMCk7Ci19Ci0KLXZvaWQgcGhfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXkpCi17Ci0gICAgaWYgKG92ZXJsYXkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBvdmVybGF5LT5od2RhdGEtPmxvY2tlZCA9IDA7Ci19Ci0KLWludCBwaF9EaXNwbGF5WVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXksIFNETF9SZWN0KiBzcmMsIFNETF9SZWN0KiBkc3QpCi17Ci0gICAgaW50IHJ0bmNvZGU7Ci0gICAgUGhQb2ludF90IHBvczsKLSAgICBTRExfUmVjdCBiYWNrcmVjdDsKLSAgICBQaFJlY3RfdCB3aW5kb3dleHRlbnQ7Ci0gICAgaW50IHdpbmNoYW5nZWQ9MDsKLQotICAgIGlmICgob3ZlcmxheSA9PSBOVUxMKSB8fCAob3ZlcmxheS0+aHdkYXRhPT1OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5TdGF0ZSA9PSBPVkVSTEFZX1NUQVRFX1VOSU5JVCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBQdEdldEFic1Bvc2l0aW9uKHdpbmRvdywgJnBvcy54LCAmcG9zLnkpOwotICAgIGlmICgocG9zLnghPW92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFdpbmRvd1Bvcy54KSB8fAotICAgICAgICAocG9zLnkhPW92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFdpbmRvd1Bvcy55KSkKLSAgICB7Ci0gICAgICAgd2luY2hhbmdlZD0xOwotICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFdpbmRvd1Bvcy54PXBvcy54OwotICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFdpbmRvd1Bvcy55PXBvcy55OwotICAgIH0KLQotICAgIC8qIElmIEN1cnJlbnRWaWV3UG9ydCBwb3NpdGlvbi9zaXplIGhhcyBiZWVuIGNoYW5nZWQsIHRoZW4gbW92ZS9yZXNpemUgdGhlIHZpZXdwb3J0ICovCi0gICAgaWYgKChvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueCAhPSBkc3QtPngpIHx8Ci0gICAgICAgIChvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueSAhPSBkc3QtPnkpIHx8Ci0gICAgICAgIChvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5zaXplLncgIT0gZHN0LT53KSB8fAotICAgICAgICAob3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS5oICE9IGRzdC0+aCkgfHwKLSAgICAgICAgKG92ZXJsYXktPmh3ZGF0YS0+c2NhbGVyX29uPT0wKSB8fCAod2luY2hhbmdlZD09MSkgfHwKLSAgICAgICAgKG92ZXJsYXktPmh3ZGF0YS0+Zm9yY2VkcmVkcmF3PT0xKSkKLSAgICB7Ci0KLSAgICAgICAgaWYgKG92ZXJsYXktPmh3ZGF0YS0+aXNjaHJvbWFrZXk9PTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHJlc3RvcmUgc2NyZWVuIGJlaGluZCB0aGUgb3ZlcmxheS9jaHJvbWEgY29sb3IuICovCi0gICAgICAgICAgICBiYWNrcmVjdC54PW92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy54OwotICAgICAgICAgICAgYmFja3JlY3QueT1vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueTsKLSAgICAgICAgICAgIGJhY2tyZWN0Lnc9b3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS53OwotICAgICAgICAgICAgYmFja3JlY3QuaD1vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5zaXplLmg7Ci0gICAgICAgICAgICB0aGlzLT5VcGRhdGVSZWN0cyh0aGlzLCAxLCAmYmFja3JlY3QpOwotCi0gICAgICAgICAgICAvKiBEcmF3IHRoZSBuZXcgcmVjdGFuZ2xlIG9mIHRoZSBjaHJvbWEgY29sb3IgYXQgdGhlIHZpZXdwb3J0IHBvc2l0aW9uICovCi0gICAgICAgICAgICBQZ1NldEZpbGxDb2xvcihvdmVybGF5LT5od2RhdGEtPmNocm9tYWtleSk7Ci0gICAgICAgICAgICBQZ0RyYXdJUmVjdChkc3QtPngsIGRzdC0+eSwgZHN0LT54K2RzdC0+dy0xLCBkc3QtPnkrZHN0LT5oLTEsIFBnX0RSQVdfRklMTCk7Ci0gICAgICAgICAgICBQZ0ZsdXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBvdmVybGF5LT5od2RhdGEtPnByb3BzLmZsYWdzIHw9IFBnX1NDQUxFUl9QUk9QX1NDQUxFUl9FTkFCTEU7Ci0gICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+c2NhbGVyX29uID0gMTsKLQotICAgICAgICBQaFdpbmRvd1F1ZXJ5VmlzaWJsZShQaF9RVUVSWV9DT05TT0xFLCAwLCBQdFdpZGdldFJpZCh3aW5kb3cpLCAmd2luZG93ZXh0ZW50KTsKLSAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQucG9zLnggPSBwb3MueC13aW5kb3dleHRlbnQudWwueCtkc3QtPng7Ci0gICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy55ID0gcG9zLnktd2luZG93ZXh0ZW50LnVsLnkrZHN0LT55OwotICAgICAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5zaXplLncgPSBkc3QtPnc7Ci0gICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnNpemUuaCA9IGRzdC0+aDsKLSAgICAgICAgUGhBcmVhVG9SZWN0KCZvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydCwgJm92ZXJsYXktPmh3ZGF0YS0+cHJvcHMudmlld3BvcnQpOwotICAgICAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueCA9IGRzdC0+eDsKLSAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQucG9zLnkgPSBkc3QtPnk7Ci0KLSAgICAgICAgcnRuY29kZSA9IFBnQ29uZmlnU2NhbGVyQ2hhbm5lbChvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwsICYob3ZlcmxheS0+aHdkYXRhLT5wcm9wcykpOwotCi0gICAgICAgIHN3aXRjaChydG5jb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJQZ0NvbmZpZ1NjYWxlckNoYW5uZWwoKSBmdW5jdGlvbiBmYWlsZWRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgZ3JhYl9wdHJzMihvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwsIG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMCwgb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGExKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0KLS8qCi0gICAgaWYgKG92ZXJsYXktPmh3ZGF0YS0+bG9ja2VkPT0wKQotICAgIHsKLSAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5jdXJyZW50ID0gUGdOZXh0VmlkZW9GcmFtZShvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwpOwotICAgICAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5jdXJyZW50ID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX0xvY2tZVVZPdmVybGF5OiBQZ05leHRGcmFtZSgpIGZhaWxlZCwgYmFpbGluZyBvdXRcbiIpOwotICAgICAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5jdXJyZW50ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YSA9IG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YSA9IG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdmVybGF5LT5wbGFuZXMgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdmVybGF5LT5waXRjaGVzWzBdID0gb3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT55cGxhbmUxLT5waXRjaDsKLSAgICAgICAgICAgIG92ZXJsYXktPnBpeGVsc1swXSAgPSBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRGcmFtZURhdGEtPlk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG92ZXJsYXktPnBsYW5lcyA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMV0gPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnVwbGFuZTEtPnBpdGNoOwotICAgICAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzFdICA9IG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YS0+VTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3ZlcmxheS0+cGxhbmVzID4gMikKLSAgICAgICAgewotICAgICAgICAgICAgb3ZlcmxheS0+cGl0Y2hlc1syXSA9IG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+dnBsYW5lMS0+cGl0Y2g7Ci0gICAgICAgICAgICBvdmVybGF5LT5waXhlbHNbMl0gID0gb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhLT5WOwotICAgICAgICB9Ci0gICAgfQotKi8KLSAgICAgICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcGhfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQotewotICAgIFNETF9SZWN0IGJhY2tyZWN0OwotCi0gICAgaWYgKG92ZXJsYXkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAob3ZlcmxheS0+aHdkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY3VycmVudF9vdmVybGF5PU5VTEw7Ci0KLSAgICAvKiByZXN0b3JlIHNjcmVlbiBiZWhpbmQgdGhlIG92ZXJsYXkvY2hyb21hIGNvbG9yLiAqLwotICAgIGJhY2tyZWN0Lng9b3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQucG9zLng7Ci0gICAgYmFja3JlY3QueT1vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueTsKLSAgICBiYWNrcmVjdC53PW92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnNpemUudzsKLSAgICBiYWNrcmVjdC5oPW92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnNpemUuaDsKLSAgICB0aGlzLT5VcGRhdGVSZWN0cyh0aGlzLCAxLCAmYmFja3JlY3QpOwotCi0gICAgLyogaXQgaXMgbmVlZCBmb3Igc29tZSBidWdneSBkcml2ZXJzLCB0aGF0IGNhbid0IGhpZGUgb3ZlcmxheSBiZWZvcmUgKi8KLSAgICAvKiBmcmVlaW5nIGJ1ZmZlciwgc28gd2UgZ290IHRyYXNoIG9uIHRoZSBzcmNlZW4gICAgICAgICAgICAgICAgICAgICAqLwotICAgIG92ZXJsYXktPmh3ZGF0YS0+cHJvcHMuZmxhZ3MgJj0gflBnX1NDQUxFUl9QUk9QX1NDQUxFUl9FTkFCTEU7Ci0gICAgUGdDb25maWdTY2FsZXJDaGFubmVsKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCwgJihvdmVybGF5LT5od2RhdGEtPnByb3BzKSk7Ci0KLSAgICBvdmVybGF5LT5od2RhdGEtPnNjYWxlcl9vbiA9IDA7Ci0gICAgb3ZlcmxheS0+aHdkYXRhLT5TdGF0ZSA9IE9WRVJMQVlfU1RBVEVfVU5JTklUOwotCi0gICAgaWYgKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgUGdEZXN0cm95VmlkZW9DaGFubmVsKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCk7Ci0gICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CQotCi0gICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhID0gTlVMTDsgIAotCQotICAgIFNETF9mcmVlKG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMCk7Ci0gICAgU0RMX2ZyZWUob3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGExKTsKLSAgICBvdmVybGF5LT5od2RhdGEtPkZyYW1lRGF0YTAgPSBOVUxMOwotICAgIG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMSA9IE5VTEw7Ci0gICAgU0RMX2ZyZWUob3ZlcmxheS0+aHdkYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waHl1dl9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGh5dXZfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA0YTAzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGhvdG9uL1NETF9waHl1dl9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfX1NETF9QSF9ZVVZfSF9fCi0jZGVmaW5lIF9fU0RMX1BIX1lVVl9IX18KLQotLyogVGhpcyBpcyB0aGUgcGhvdG9uIGltcGxlbWVudGF0aW9uIG9mIFlVViB2aWRlbyBvdmVybGF5cyAqLwotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3BoX3ZpZGVvLmgiCi0KLXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YQotewotICAgIEZSQU1FREFUQSogQ3VycmVudEZyYW1lRGF0YTsKLSAgICBGUkFNRURBVEEqIEZyYW1lRGF0YTA7Ci0gICAgRlJBTUVEQVRBKiBGcmFtZURhdGExOwotICAgIFBnU2NhbGVyUHJvcHNfdCAgIHByb3BzOwotICAgIFBnU2NhbGVyQ2Fwc190ICAgIGNhcHM7Ci0gICAgUGdWaWRlb0NoYW5uZWxfdCogY2hhbm5lbDsKLSAgICBQaEFyZWFfdCBDdXJyZW50Vmlld1BvcnQ7Ci0gICAgUGhQb2ludF90IEN1cnJlbnRXaW5kb3dQb3M7Ci0gICAgbG9uZyBmb3JtYXQ7Ci0gICAgaW50IHNjYWxlcl9vbjsKLSAgICBpbnQgY3VycmVudDsKLSAgICBsb25nIFlTdHJpZGU7Ci0gICAgbG9uZyBWU3RyaWRlOwotICAgIGxvbmcgVVN0cmlkZTsKLSAgICBpbnQgaXNjaHJvbWFrZXk7Ci0gICAgbG9uZyBjaHJvbWFrZXk7Ci0gICAgaW50IGZvcmNlZHJlZHJhdzsKLSAgICB1bnNpZ25lZCBsb25nIFN0YXRlOwotICAgIGxvbmcgZmxhZ3M7Ci0gICAgaW50IGxvY2tlZDsKLX07Ci0KLWV4dGVybiBTRExfT3ZlcmxheSogcGhfQ3JlYXRlWVVWT3ZlcmxheShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBVaW50MzIgZm9ybWF0LCBTRExfU3VyZmFjZSogZGlzcGxheSk7Ci1leHRlcm4gaW50IHBoX0xvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSogb3ZlcmxheSk7Ci1leHRlcm4gdm9pZCBwaF9VbmxvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSogb3ZlcmxheSk7Ci1leHRlcm4gaW50IHBoX0Rpc3BsYXlZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSogb3ZlcmxheSwgU0RMX1JlY3QqIHNyYywgU0RMX1JlY3QqIGRzdCk7Ci1leHRlcm4gdm9pZCBwaF9GcmVlWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXkpOwotCi0jZW5kaWYgLyogX19TRExfUEhfWVVWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waWNvZ3VpL1NETF9wZ2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waWNvZ3VpL1NETF9wZ2V2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDZiNTMwLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGljb2d1aS9TRExfcGdldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0KLSAgICBNaWNhaCBEb3d0eQotICAgIG1pY2FoamRAdXNlcnMuc291cmNlZm9yZ2UubmV0Ci0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETC5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9wZ3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3BnZXZlbnRzX2MuaCIKLQotaW50IFBHX0hhbmRsZUNsb3NlKHN0cnVjdCBwZ0V2ZW50ICpldnQpCi17Ci0gICAgICAgIFNETF9Qcml2YXRlUXVpdCgpOwotCXJldHVybiAxOyAgICAgICAgICAgICAgIC8qIEludGVyY2VwdCB0aGUgZXZlbnQncyBub3JtYWwgcXVpdCBoYW5kbGluZyAqLwotfQotCi1pbnQgUEdfSGFuZGxlUmVzaXplKHN0cnVjdCBwZ0V2ZW50ICpldnQpCi17Ci0gICAgICAgIFNETF9Qcml2YXRlUmVzaXplKGV2dC0+ZS5zaXplLncsIGV2dC0+ZS5zaXplLmgpOwotCXJldHVybiAwOwotfQotCi1pbnQgUEdfSGFuZGxlS2V5KHN0cnVjdCBwZ0V2ZW50ICpldnQpCi17Ci0gICAgICAgIFNETF9rZXlzeW0gc3ltOwotCVNETF9tZW1zZXQoJnN5bSwwLHNpemVvZihzeW0pKTsKLQlzeW0uc3ltID0gZXZ0LT5lLmtiZC5rZXk7Ci0Jc3ltLm1vZCA9IGV2dC0+ZS5rYmQubW9kczsKLSAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZChldnQtPnR5cGUgPT0gUEdfV0VfS0JEX0tFWURPV04sICZzeW0pOwotCXJldHVybiAwOwotfQotCi1pbnQgUEdfSGFuZGxlQ2hhcihzdHJ1Y3QgcGdFdmVudCAqZXZ0KQotewotICAgICAgICBTRExfa2V5c3ltIHN5bTsKLQlTRExfbWVtc2V0KCZzeW0sMCxzaXplb2Yoc3ltKSk7Ci0Jc3ltLnVuaWNvZGUgPSBldnQtPmUua2JkLmtleTsKLQlzeW0ubW9kID0gZXZ0LT5lLmtiZC5tb2RzOwotICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkKGV2dC0+dHlwZSA9PSBQR19XRV9LQkRfS0VZRE9XTiwgJnN5bSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBQR19IYW5kbGVNb3VzZUJ1dHRvbihzdHJ1Y3QgcGdFdmVudCAqZXZ0KQoteyAgICAgICAgCi0gICAgICAgIC8qIFdlIG5lZWQgdG8gZm9jdXMgdGhlIGNhbnZhcyB3aGVuIGl0J3MgY2xpY2tlZCAqLwotICAgICAgICBpZiAoZXZ0LT5leHRyYSkgewotCSAgICAgICAgU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gKFNETF9WaWRlb0RldmljZSAqKSBldnQtPmV4dHJhOwotCQlwZ0ZvY3VzKHRoaXMtPmhpZGRlbi0+d0NhbnZhcyk7Ci0JfQotICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKGV2dC0+dHlwZSA9PSBQR19XRV9QTlRSX0RPV04sIGV2dC0+ZS5wbnRyLmNoYnRuLAotCQkJICAgICAgIGV2dC0+ZS5wbnRyLngsIGV2dC0+ZS5wbnRyLnkpOwotCXJldHVybiAwOwotfQotCi1pbnQgUEdfSGFuZGxlTW91c2VNb3Rpb24oc3RydWN0IHBnRXZlbnQgKmV2dCkKLXsKLSAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbihldnQtPmUucG50ci5idG4sMCxldnQtPmUucG50ci54LCBldnQtPmUucG50ci55KTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBQR19QdW1wRXZlbnRzKF9USElTKQotewotICAgICAgICAvKiBQcm9jZXNzIGFsbCBwZW5kaW5nIGV2ZW50cyAqLwotICAgICAgICBwZ0V2ZW50UG9sbCgpOwotfQotCi12b2lkIFBHX0luaXRPU0tleW1hcChfVEhJUykKLXsKLSAgICAgICAgLyogV2UgbmVlZCBubyBrZXltYXAgKi8KLX0KLQotdm9pZCBQR19Jbml0RXZlbnRzKF9USElTKQotewotICAgICAgICAvKiBUdXJuIG9uIGFsbCB0aGUgbW91c2UgYW5kIGtleWJvYXJkIHRyaWdnZXJzIGZvciBvdXIgY2FudmFzLCBub3JtYWxseSBsZXNzIGltcG9ydGFudAotCSAqIGV2ZW50cyBsaWtlIG1vdXNlIG1vdmVtZW50IGFyZSBpZ25vcmVkIHRvIHNhdmUgYmFuZHdpZHRoLiAqLwotICAgICAgICBwZ1NldFdpZGdldCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHX1dQX1RSSUdHRVJNQVNLLCAKLQkJICAgIHBnR2V0V2lkZ2V0KHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdfV1BfVFJJR0dFUk1BU0spIHwKLQkJICAgIFBHX1RSSUdHRVJfVVAgfCBQR19UUklHR0VSX0RPV04gfCBQR19UUklHR0VSX01PVkUgfAotCQkgICAgUEdfVFJJR0dFUl9LRVlVUCB8IFBHX1RSSUdHRVJfS0VZRE9XTiB8IFBHX1RSSUdHRVJfQ0hBUiwwKTsKLQotCS8qIFN0YXJ0IG91ciBjYW52YXMgb3V0IGZvY3VzZWQsIHNvIHdlIGdldCBrZXlib2FyZCBpbnB1dCAqLwotCXBnRm9jdXModGhpcy0+aGlkZGVuLT53Q2FudmFzKTsKLQotICAgICAgICAvKiBTZXQgdXAgYmluZGluZ3MgZm9yIGFsbCB0aGUgYWJvdmUgZXZlbnQgaGFuZGxlcnMgKi8KLSAgICAgICAgcGdCaW5kKHRoaXMtPmhpZGRlbi0+d0FwcCwgICAgUEdfV0VfQ0xPU0UsICZQR19IYW5kbGVDbG9zZSwgTlVMTCk7Ci0gICAgICAgIHBnQmluZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHX1dFX0JVSUxELCAmUEdfSGFuZGxlUmVzaXplLCBOVUxMKTsKLSAgICAgICAgcGdCaW5kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdfV0VfS0JEX0NIQVIsICZQR19IYW5kbGVDaGFyLCBOVUxMKTsKLSAgICAgICAgcGdCaW5kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdfV0VfS0JEX0tFWVVQLCAmUEdfSGFuZGxlS2V5LCBOVUxMKTsKLSAgICAgICAgcGdCaW5kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdfV0VfS0JEX0tFWURPV04sICZQR19IYW5kbGVLZXksIE5VTEwpOwotICAgICAgICBwZ0JpbmQodGhpcy0+aGlkZGVuLT53Q2FudmFzLCBQR19XRV9QTlRSX01PVkUsICZQR19IYW5kbGVNb3VzZU1vdGlvbiwgTlVMTCk7Ci0gICAgICAgIHBnQmluZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHX1dFX1BOVFJfVVAsICZQR19IYW5kbGVNb3VzZUJ1dHRvbiwgTlVMTCk7Ci0gICAgICAgIHBnQmluZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHX1dFX1BOVFJfRE9XTiwgJlBHX0hhbmRsZU1vdXNlQnV0dG9uLCB0aGlzKTsKLX0KLQotLyogZW5kIG9mIFNETF9wZ2V2ZW50cy5jIC4uLiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waWNvZ3VpL1NETF9wZ2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BpY29ndWkvU0RMX3BnZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3MTI0Zi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BpY29ndWkvU0RMX3BnZXZlbnRzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLQotICAgIE1pY2FoIERvd3R5Ci0gICAgbWljYWhqZEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3BndmlkZW8uaCIKLQotLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAotICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQotKi8KLWV4dGVybiB2b2lkIFBHX1B1bXBFdmVudHMoX1RISVMpOwotZXh0ZXJuIHZvaWQgUEdfSW5pdEV2ZW50cyhfVEhJUyk7Ci1leHRlcm4gdm9pZCBQR19Jbml0T1NLZXltYXAoX1RISVMpOwotCi0vKiBlbmQgb2YgU0RMX3BnZXZlbnRzX2MuaCAuLi4gKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9waWNvZ3VpL1NETF9wZ3ZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BpY29ndWkvU0RMX3BndmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0NjRhZi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BpY29ndWkvU0RMX3BndmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0KLSAgICBNaWNhaCBEb3d0eQotICAgIG1pY2FoamRAdXNlcnMuc291cmNlZm9yZ2UubmV0Ci0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotI2luY2x1ZGUgIlNETF9wZ3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3BnZXZlbnRzX2MuaCIKLQotI2RlZmluZSBQR1ZJRF9EUklWRVJfTkFNRSAicGljb2d1aSIKLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IFBHX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKLXN0YXRpYyBTRExfUmVjdCAqKlBHX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgU0RMX1N1cmZhY2UgKlBHX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgUEdfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyB2b2lkIFBHX1ZpZGVvUXVpdChfVEhJUyk7Ci0KLS8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IFBHX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IFBHX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIFBHX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgUEdfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0vKiBldGMuICovCi1zdGF0aWMgdm9pZCBQR19VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotCi0vLyBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IKLXN0cnVjdCBXTWN1cnNvciB7Ci0gIC8qIE91ciBjdXJzb3IgaXMgYSBQaWNvR1VJIHRoZW1lICovCi0gIHBnaGFuZGxlIHRoZW1lOwotfSA7Ci0KLS8qIFdNIGZ1bmN0aW9ucyAqLwotdm9pZCBQR19TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7Ci1XTWN1cnNvciAqIFBHX0NyZWF0ZVdNQ3Vyc29yIChfVEhJUyxVaW50OCAqIGRhdGEsIFVpbnQ4ICogbWFzaywgCi0JCQkgICAgICBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKLXZvaWQgUEdfRnJlZVdNQ3Vyc29yIChfVEhJUywgV01jdXJzb3IgKiBjdXJzb3IpOwotdm9pZCBQR19XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci1pbnQgUEdfU2hvd1dNQ3Vyc29yIChfVEhJUywgV01jdXJzb3IgKiBjdXJzb3IpOwotCi0vKiBQaWNvR1VJIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBpbnQgUEdfQXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgICAgIC8qIEZJWE1FOiBUaGUgY3VycmVudCBjbGllbnQgbGliIGRvZXNuJ3QgZ2l2ZSBhIHdheSB0byBzZWUgaWYgdGhlIHBpY29ndWkKLQkgKiAgICAgICAgc2VydmVyIGlzIHJlYWNoYWJsZSB3aXRob3V0IGNhdXNpbmcgYSBmYXRhbCBlcnJvciBpZiBpdCBpc24ndC4KLQkgKiAgICAgICAgVGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gY2xpX2MyLCBidXQgdW50aWwgdGhlbiBhc3N1bWUgd2UgY2FuCi0JICogICAgICAgIGNvbm5lY3QuIFNpbmNlIG1vcmUgY29tbW9uIGRyaXZlcnMgbGlrZSBYMTEgYXJlIHByb2JlZCBmaXJzdCBhbnl3YXksCi0JICogICAgICAgIHRoaXMgc2hvdWxkbid0IGJlIGEgaHVnZSBwcm9ibGVtLgotCSAqLwotCXJldHVybigxKTsKLX0KLQotc3RhdGljIHZvaWQgUEdfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQotewotCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQlTRExfZnJlZShkZXZpY2UpOwotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpQR19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7Ci0JaWYgKCBkZXZpY2UgKSB7Ci0JCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLQkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCX0KLQlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCBkZXZpY2UgKSB7Ci0JCQlTRExfZnJlZShkZXZpY2UpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQlkZXZpY2UtPlZpZGVvSW5pdCA9IFBHX1ZpZGVvSW5pdDsKLQlkZXZpY2UtPkxpc3RNb2RlcyA9IFBHX0xpc3RNb2RlczsKLQlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IFBHX1NldFZpZGVvTW9kZTsKLQlkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBOVUxMOwotCWRldmljZS0+U2V0Q29sb3JzID0gUEdfU2V0Q29sb3JzOwotCWRldmljZS0+VXBkYXRlUmVjdHMgPSBQR19VcGRhdGVSZWN0czsKLQlkZXZpY2UtPlZpZGVvUXVpdCA9IFBHX1ZpZGVvUXVpdDsKLQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gUEdfQWxsb2NIV1N1cmZhY2U7Ci0JZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7Ci0JZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOwotCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7Ci0JZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gUEdfTG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IFBHX1VubG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOwotCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IFBHX0ZyZWVIV1N1cmZhY2U7Ci0JZGV2aWNlLT5TZXRDYXB0aW9uID0gUEdfU2V0Q2FwdGlvbjsKLQlkZXZpY2UtPlNldEljb24gPSBOVUxMOwotCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7Ci0JZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOwotCi0JZGV2aWNlLT5QdW1wRXZlbnRzID0gUEdfUHVtcEV2ZW50czsKLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IFBHX0luaXRPU0tleW1hcDsKLQotCWRldmljZS0+U2hvd1dNQ3Vyc29yID0gUEdfU2hvd1dNQ3Vyc29yOwotCWRldmljZS0+Q3JlYXRlV01DdXJzb3IgPSBQR19DcmVhdGVXTUN1cnNvcjsKLQlkZXZpY2UtPkZyZWVXTUN1cnNvciA9IFBHX0ZyZWVXTUN1cnNvcjsKLQlkZXZpY2UtPldhcnBXTUN1cnNvciA9IFBHX1dhcnBXTUN1cnNvcjsKLQotCWRldmljZS0+ZnJlZSA9IFBHX0RlbGV0ZURldmljZTsKLQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLVZpZGVvQm9vdFN0cmFwIFBHX2Jvb3RzdHJhcCA9IHsKLQlQR1ZJRF9EUklWRVJfTkFNRSwgIlBpY29HVUkgU0RMIGRyaXZlciIsCi0JUEdfQXZhaWxhYmxlLCBQR19DcmVhdGVEZXZpY2UKLX07Ci0KLQotaW50IFBHX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotICAgICAgICAvKiBDb25uZWN0IHRvIHRoZSBQaWNvR1VJIHNlcnZlci4gTm8gd2F5IHRvIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3MgeWV0LAotCSAqIGJ1dCBzaW5jZSB0aGlzIGlzIGJhc2VkIG9uIFNITSBpdCdzIG5vdCBpbXBvcnRhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5Ci0JICogYSByZW1vdGUgUGljb0dVSSBzZXJ2ZXIuCi0JICoKLQkgKiBGSVhNRTogQW5vdGhlciBuaXRwaWNrIGFib3V0IHRoZSBjdXJyZW50IGNsaWVudCBsaWIgaXMgdGhlcmUncyBubwotCSAqICAgICAgICBjbGVhbiB3YXkgdG8gaW5kaWNhdGUgdGhhdCBjb21tYW5kIGxpbmUgYXJncyBhcmUgbm90IGF2YWlsYWJsZS4KLQkgKi8KLSAgICAgICAgcGdJbml0KDAsKGNoYXIqKikiIik7Ci0JdGhpcy0+aGlkZGVuLT5taSA9ICpwZ0dldFZpZGVvTW9kZSgpOwotCi0JLyogQ3JlYXRlIGEgcGljb2d1aSBhcHBsaWNhdGlvbiBhbmQgY2FudmFzLiBXZSdsbCBwb3B1bGF0ZSB0aGUgY2FudmFzIGxhdGVyLiAqLwotCXRoaXMtPmhpZGRlbi0+d0FwcCA9IHBnUmVnaXN0ZXJBcHAoUEdfQVBQX05PUk1BTCwiU0RMIiwwKTsKLQl0aGlzLT5oaWRkZW4tPndDYW52YXMgPSBwZ05ld1dpZGdldChQR19XSURHRVRfQ0FOVkFTLDAsMCk7Ci0JcGdTZXRXaWRnZXQoUEdERUZBVUxULAotCQkgICAgUEdfV1BfU0lERSwgUEdfU19BTEwsCi0JCSAgICAwKTsKLQotCVBHX0luaXRFdmVudHModGhpcyk7Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUgKi8KLQl0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IHRoaXMtPmhpZGRlbi0+bWkubHhyZXM7Ci0JdGhpcy0+aW5mby5jdXJyZW50X2ggPSB0aGlzLT5oaWRkZW4tPm1pLmx5cmVzOwotCi0JLyogRGV0ZXJtaW5lIHRoZSBzY3JlZW4gZGVwdGguCi0JICogV2UgY2hhbmdlIHRoaXMgZHVyaW5nIHRoZSBTRExfU2V0VmlkZW9Nb2RlIGltcGxlbWVudGF0aW9uLi4uIAotCSAqIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IEJ5dGVzIHBlciBwaXhlbAotCSAqLwotCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IHRoaXMtPmhpZGRlbi0+bWkuYnBwOwotCXZmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPSB0aGlzLT5oaWRkZW4tPm1pLmJwcCA+PiAzOwotCWlmICh0aGlzLT5oaWRkZW4tPm1pLmJwcCAmIDcpCi0JICB2Zm9ybWF0LT5CeXRlc1BlclBpeGVsKys7Ci0KLQkvKiBXZSdyZSBkb25lISAqLwotCXJldHVybigwKTsKLX0KLQotU0RMX1JlY3QgKipQR19MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCi17Ci0gICAJIHJldHVybiAoU0RMX1JlY3QgKiopIC0xOwotfQotCi1TRExfU3VyZmFjZSAqUEdfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLQlpZiAoIHRoaXMtPmhpZGRlbi0+Yml0bWFwICkgewotCSAgLyogRnJlZSBvbGQgYml0bWFwICovCi0JICBpZiAoY3VycmVudC0+cGl4ZWxzKSB7Ci0JICAgIHNobWR0KGN1cnJlbnQtPnBpeGVscyk7Ci0JICAgIGN1cnJlbnQtPnBpeGVscyA9IE5VTEw7Ci0JICB9Ci0JICBwZ0RlbGV0ZSh0aGlzLT5oaWRkZW4tPmJpdG1hcCk7Ci0JfQotCi0JLyogQWxsb2NhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHRoZSBzY3JlZW4gKi8KLQlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgYnBwLCAwLCAwLCAwLCAwKSApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciByZXF1ZXN0ZWQgbW9kZSIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogQ3JlYXRlIGEgbmV3IHBpY29ndWkgYml0bWFwICovCi0JdGhpcy0+aGlkZGVuLT5iaXRtYXAgPSBwZ0NyZWF0ZUJpdG1hcCh3aWR0aCxoZWlnaHQpOwotCXRoaXMtPmhpZGRlbi0+c2htID0gKnBnTWFrZVNITUJpdG1hcCh0aGlzLT5oaWRkZW4tPmJpdG1hcCk7Ci0JY3VycmVudC0+cGl4ZWxzID0gc2htYXQoc2htZ2V0KHRoaXMtPmhpZGRlbi0+c2htLnNobV9rZXksCi0JCQkJICAgICAgIHRoaXMtPmhpZGRlbi0+c2htLnNobV9sZW5ndGgsMCksTlVMTCwwKTsKLQotCS8qIFJlc2V0IHRoZSBjYW52YXMsIGFuZCBkcmF3IHBlcnNpc3RlbnQgYW5kIGluY3JlbWVudGFsIGdyb3BzLgotCSAqIFVzZSBtYXBwaW5nIGFuZCBvZmZzZXRzIHRvIGNlbnRlciBpdC4KLQkgKi8KLQotCXBnV3JpdGVDbWQodGhpcy0+aGlkZGVuLT53Q2FudmFzLCBQR0NBTlZBU19OVUtFLCAwKTsKLQotCS8qIDAuIFNldCB0aGUgc291cmNlIHBvc2l0aW9uIGR1cmluZyBpbmNyZW1lbnRhbCByZW5kZXJpbmcKLQkgKi8KLQlwZ1dyaXRlQ21kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdDQU5WQVNfR1JPUCwgNSwgUEdfR1JPUF9TRVRTUkMsMCwwLDAsMCk7Ci0JcGdXcml0ZUNtZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHQ0FOVkFTX0dST1BGTEFHUywgMSwgUEdfR1JPUEZfSU5DUkVNRU5UQUwpOwotCi0JLyogMS4gSW5jcmVtZW50YWwgYml0bWFwIHJlbmRlcmluZwotCSAqLwotCXBnV3JpdGVDbWQodGhpcy0+aGlkZGVuLT53Q2FudmFzLCBQR0NBTlZBU19HUk9QLCA2LCBQR19HUk9QX0JJVE1BUCwKLQkJICAgMCwwLDAsMCx0aGlzLT5oaWRkZW4tPmJpdG1hcCk7Ci0JcGdXcml0ZUNtZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHQ0FOVkFTX0dST1BGTEFHUywgMSwgUEdfR1JPUEZfSU5DUkVNRU5UQUwpOwotCi0JLyogMi4gTm9ybWFsIGJpdG1hcCByZW5kZXJpbmcKLQkgKi8KLQlwZ1dyaXRlQ21kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdDQU5WQVNfR1JPUCwgNiwgUEdfR1JPUF9CSVRNQVAsCi0JCSAgIDAsMCx0aGlzLT5oaWRkZW4tPnNobS53aWR0aCx0aGlzLT5oaWRkZW4tPnNobS5oZWlnaHQsdGhpcy0+aGlkZGVuLT5iaXRtYXApOwotICAgICAKLQkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCi0JY3VycmVudC0+ZmxhZ3MgPSAwOwotCWN1cnJlbnQtPncgPSB0aGlzLT5oaWRkZW4tPnNobS53aWR0aDsKLQljdXJyZW50LT5oID0gdGhpcy0+aGlkZGVuLT5zaG0uaGVpZ2h0OwotCWN1cnJlbnQtPnBpdGNoID0gdGhpcy0+aGlkZGVuLT5zaG0ucGl0Y2g7Ci0KLQkvKiBTZXQgdXAgcGl4ZWwgZm9ybWF0ICovCi0JY3VycmVudC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSB0aGlzLT5oaWRkZW4tPnNobS5icHA7Ci0JY3VycmVudC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gdGhpcy0+aGlkZGVuLT5zaG0uYnBwID4+IDM7Ci0JaWYgKHRoaXMtPmhpZGRlbi0+c2htLmJwcCAmIDcpCi0JICBjdXJyZW50LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwrKzsKLQljdXJyZW50LT5mb3JtYXQtPnBhbGV0dGUgPSBOVUxMOwotCWN1cnJlbnQtPmZvcm1hdC0+Um1hc2sgPSB0aGlzLT5oaWRkZW4tPnNobS5yZWRfbWFzazsKLQljdXJyZW50LT5mb3JtYXQtPkdtYXNrID0gdGhpcy0+aGlkZGVuLT5zaG0uZ3JlZW5fbWFzazsKLQljdXJyZW50LT5mb3JtYXQtPkJtYXNrID0gdGhpcy0+aGlkZGVuLT5zaG0uYmx1ZV9tYXNrOwotCWN1cnJlbnQtPmZvcm1hdC0+QW1hc2sgPSB0aGlzLT5oaWRkZW4tPnNobS5hbHBoYV9tYXNrOwotCWN1cnJlbnQtPmZvcm1hdC0+UnNoaWZ0ID0gdGhpcy0+aGlkZGVuLT5zaG0ucmVkX3NoaWZ0OwotCWN1cnJlbnQtPmZvcm1hdC0+R3NoaWZ0ID0gdGhpcy0+aGlkZGVuLT5zaG0uZ3JlZW5fc2hpZnQ7Ci0JY3VycmVudC0+Zm9ybWF0LT5Cc2hpZnQgPSB0aGlzLT5oaWRkZW4tPnNobS5ibHVlX3NoaWZ0OwotCWN1cnJlbnQtPmZvcm1hdC0+QXNoaWZ0ID0gdGhpcy0+aGlkZGVuLT5zaG0uYWxwaGFfc2hpZnQ7Ci0JY3VycmVudC0+Zm9ybWF0LT5SbG9zcyA9IDggLSB0aGlzLT5oaWRkZW4tPnNobS5yZWRfbGVuZ3RoOwotCWN1cnJlbnQtPmZvcm1hdC0+R2xvc3MgPSA4IC0gdGhpcy0+aGlkZGVuLT5zaG0uZ3JlZW5fbGVuZ3RoOwotCWN1cnJlbnQtPmZvcm1hdC0+Qmxvc3MgPSA4IC0gdGhpcy0+aGlkZGVuLT5zaG0uYmx1ZV9sZW5ndGg7Ci0JY3VycmVudC0+Zm9ybWF0LT5BbG9zcyA9IDggLSB0aGlzLT5oaWRkZW4tPnNobS5hbHBoYV9sZW5ndGg7Ci0KLQkvKiBEcmF3IHRoZSBhcHAgKi8KLQlwZ1VwZGF0ZSgpOwotCi0JLyogV2UncmUgZG9uZSAqLwotCXJldHVybihjdXJyZW50KTsKLX0KLQotLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KLXN0YXRpYyBpbnQgUEdfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigtMSk7Ci19Ci1zdGF0aWMgdm9pZCBQR19GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm47Ci19Ci0KLS8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSBvbiBwYWdlIGZsaXBwZWQgZGlzcGxheXMgKi8KLXN0YXRpYyBpbnQgUEdfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgdm9pZCBQR19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgUEdfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotICAgICAgICBpbnQgaTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgbnVtcmVjdHM7IGkrKykgewotCSAgICAgICAgaWYgKHJlY3RzW2ldLncgPD0gMCB8fCByZWN0c1tpXS5oIDw9IDApCi0JCSAgY29udGludWU7Ci0KLQkJLyogU2NoZWR1bGUgYW4gaW5jcmVtZW50YWwgdXBkYXRlIGZvciB0aGlzIHJlY3RhbmdsZSwgdXNpbmcKLQkJICogdGhlIGNhbnZhcyBncm9wbm9kZXMgd2UndmUgbG9hZGVkIGJlZm9yZWhhbmQuCi0JCSAqLwotCQlwZ1dyaXRlQ21kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdDQU5WQVNfRklOREdST1AsIDEsIDApOwotCQlwZ1dyaXRlQ21kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdDQU5WQVNfTU9WRUdST1AsIDQsIAotCQkJICAgcmVjdHNbaV0ueCwgcmVjdHNbaV0ueSwKLQkJCSAgIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgpOwotCQlwZ1dyaXRlQ21kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdDQU5WQVNfRklOREdST1AsIDEsIDEpOwotCQlwZ1dyaXRlQ21kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdDQU5WQVNfTU9WRUdST1AsIDQsIAotCQkJICAgcmVjdHNbaV0ueCwgcmVjdHNbaV0ueSwKLQkJCSAgIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgpOwotCQkKLQkJLyogR28gcGVyZm9ybSB0aGUgdXBkYXRlICovCi0JCXBnV3JpdGVDbWQodGhpcy0+aGlkZGVuLT53Q2FudmFzLCBQR0NBTlZBU19JTkNSRU1FTlRBTCwgMCk7Ci0JCXBnU3ViVXBkYXRlKHRoaXMtPmhpZGRlbi0+d0NhbnZhcyk7Ci0JfQotfQotCi1pbnQgUEdfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQotewotCS8qIGRvIG5vdGhpbmcgb2Ygbm90ZS4gKi8KLQlyZXR1cm4oMSk7Ci19Ci0KLS8qIE5vdGU6ICBJZiB3ZSBhcmUgdGVybWluYXRlZCwgdGhpcyBjb3VsZCBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZgotICAgYW5vdGhlciBTREwgdmlkZW8gcm91dGluZSAtLSBub3RhYmx5IFVwZGF0ZVJlY3RzLgotKi8KLXZvaWQgUEdfVmlkZW9RdWl0KF9USElTKQotewotCWlmICh0aGlzLT5zY3JlZW4tPnBpeGVscyAhPSBOVUxMKQotCXsKLQkJc2htZHQodGhpcy0+c2NyZWVuLT5waXhlbHMpOwotCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IE5VTEw7Ci0JCXBnRGVsZXRlKHRoaXMtPmhpZGRlbi0+Yml0bWFwKTsKLQl9Ci0JcGdEZWxldGUodGhpcy0+aGlkZGVuLT53Q2FudmFzKTsKLQlwZ0RlbGV0ZSh0aGlzLT5oaWRkZW4tPndBcHApOwotfQotCi12b2lkIFBHX1NldENhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKQotewotICAgICAgICBpZiAodGl0bGUgIT0gTlVMTCkKLQkgIHBnUmVwbGFjZVRleHQodGhpcy0+aGlkZGVuLT53QXBwLCB0aXRsZSk7Ci0JcGdVcGRhdGUoKTsKLX0KLQotLyogRklYTUU6IFRoZSBjdXJzb3Igc3R1ZmYgaXNuJ3QgaW1wbGVtZW50ZWQgeWV0ISAqLwotCi1XTWN1cnNvciAqIFBHX0NyZWF0ZVdNQ3Vyc29yIChfVEhJUyxVaW50OCAqIGRhdGEsIFVpbnQ4ICogbWFzaywgCi0JCQkgICAgICBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KQotewotICAgICAgICBzdGF0aWMgV01jdXJzb3IgZHVtbXk7Ci0gICAgICAgIHJldHVybiAmZHVtbXk7Ci19Ci0KLXZvaWQgUEdfRnJlZVdNQ3Vyc29yIChfVEhJUywgV01jdXJzb3IgKiBjdXJzb3IpCi17Ci19Ci0KLXZvaWQgUEdfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCi17Ci19Ci0KLWludCBQR19TaG93V01DdXJzb3IgKF9USElTLCBXTWN1cnNvciAqIGN1cnNvcikKLXsKLSAgICAgICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BpY29ndWkvU0RMX3BndmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGljb2d1aS9TRExfcGd2aWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2QwZTFkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcGljb2d1aS9TRExfcGd2aWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotCi0gICAgTWljYWggRG93dHkKLSAgICBtaWNhaGpkQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9wZ3ZpZGVvX2gKLSNkZWZpbmUgX1NETF9wZ3ZpZGVvX2gKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0jaW5jbHVkZSA8cGljb2d1aS5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi0KLXN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7Ci0gIHBnaGFuZGxlIHdBcHAsIHdDYW52YXM7ICAgICAgICAvKiBQaWNvR1VJIHdpZGdldHMgKi8KLSAgcGdoYW5kbGUgYml0bWFwOwotICBzdHJ1Y3QgcGdzaG1iaXRtYXAgc2htOyAgICAgICAgLyogc2hhcmVkIG1lbW9yeSBpbmZvICovCi0gIHN0cnVjdCBwZ21vZGVpbmZvIG1pOyAgICAgICAgICAvKiBQaWNvR1VJIHZpZGVvIG1vZGUgaW5mbyBzdHJ1Y3R1cmUgKi8KLX07Ci0KLSNlbmRpZiAvKiBfU0RMX3BndmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3NldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjk2YjUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3NldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDk3NyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgY29uc29sZSBldmVudHMgaW50byBTREwgZXZlbnRzICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotLyogRm9yIHBhcnNpbmcgL3Byb2MgKi8KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSA8bGludXgvdnQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tleWJvYXJkLmg+Ci0KLSNpbmNsdWRlICJTRExfbXV0ZXguaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfZ3N2aWRlby5oIgotI2luY2x1ZGUgIlNETF9nc2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX2dza2V5cy5oIgotCi0jaWZuZGVmIEdQTV9OT0RFX0ZJRk8KLSNkZWZpbmUgR1BNX05PREVfRklGTwkiL2Rldi9ncG1kYXRhIgotI2VuZGlmCi0KLS8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZXMgZnJvbSBhIGNvbnNvbGUgc2NhbmNvZGUgdG8gYSBTREwga2V5c3ltICovCi0jZGVmaW5lIE5VTV9WR0FLRVlNQVBTCSgxPDxLR19DQVBTU0hJRlQpCi1zdGF0aWMgVWludDE2IHZnYV9rZXltYXBbTlVNX1ZHQUtFWU1BUFNdW05SX0tFWVNdOwotc3RhdGljIFNETEtleSBrZXltYXBbMTI4XTsKLXN0YXRpYyBVaW50MTYga2V5bWFwX3RlbXBbMTI4XTsgLyogb25seSB1c2VkIGF0IHN0YXJ0dXAgKi8KLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0pOwotCi0vKiBVZ2gsIHdlIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBrZXJuZWwncyBrZXlzeW0gbWFwcGluZyBjb2RlLi4uCi0gICBPaCwgaXQncyBub3Qgc28gYmFkLiA6LSkKLQotICAgRklYTUU6IEFkZCBrZXlib2FyZCBMRUQgaGFuZGxpbmcgY29kZQotICovCi1zdGF0aWMgdm9pZCBHU192Z2Fpbml0a2V5bWFwcyhpbnQgZmQpCi17Ci0Jc3RydWN0IGtiZW50cnkgZW50cnk7Ci0JaW50IG1hcCwgaTsKLQotCS8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlIGFyZSBwYXNzZWQgYSBjbG9zZWQga2V5Ym9hcmQgKi8KLQlpZiAoIGZkIDwgMCApIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qIExvYWQgYWxsIHRoZSBrZXlzeW0gbWFwcGluZ3MgKi8KLQlmb3IgKCBtYXA9MDsgbWFwPE5VTV9WR0FLRVlNQVBTOyArK21hcCApIHsKLQkJU0RMX21lbXNldCh2Z2Ffa2V5bWFwW21hcF0sIDAsIE5SX0tFWVMqc2l6ZW9mKFVpbnQxNikpOwotCQlmb3IgKCBpPTA7IGk8TlJfS0VZUzsgKytpICkgewotCQkJZW50cnkua2JfdGFibGUgPSBtYXA7Ci0JCQllbnRyeS5rYl9pbmRleCA9IGk7Ci0JCQlpZiAoIGlvY3RsKGZkLCBLREdLQkVOVCwgJmVudHJ5KSA9PSAwICkgewotCQkJCS8qIGZpbGwga2V5dGVtcC4gVGhpcyByZXBsYWNlcyBTRExfZmJrZXlzLmggKi8KLQkJCQlpZiAoIChtYXAgPT0gMCkgJiYgKGk8MTI4KSApIHsKLQkJCQkJa2V5bWFwX3RlbXBbaV0gPSBlbnRyeS5rYl92YWx1ZTsKLQkJCQl9Ci0JCQkJLyogVGhlICJFbnRlciIga2V5IGlzIGEgc3BlY2lhbCBjYXNlICovCi0JCQkJaWYgKCBlbnRyeS5rYl92YWx1ZSA9PSBLX0VOVEVSICkgewotCQkJCQllbnRyeS5rYl92YWx1ZSA9IEsoS1RfQVNDSUksMTMpOwotCQkJCX0KLQkJCQkvKiBIYW5kbGUgbnVtcGFkIHNwZWNpYWxseSBhcyB3ZWxsICovCi0JCQkJaWYgKCBLVFlQKGVudHJ5LmtiX3ZhbHVlKSA9PSBLVF9QQUQgKSB7Ci0JCQkJCXN3aXRjaCAoIGVudHJ5LmtiX3ZhbHVlICkgewotCQkJCQljYXNlIEtfUDA6Ci0JCQkJCWNhc2UgS19QMToKLQkJCQkJY2FzZSBLX1AyOgotCQkJCQljYXNlIEtfUDM6Ci0JCQkJCWNhc2UgS19QNDoKLQkJCQkJY2FzZSBLX1A1OgotCQkJCQljYXNlIEtfUDY6Ci0JCQkJCWNhc2UgS19QNzoKLQkJCQkJY2FzZSBLX1A4OgotCQkJCQljYXNlIEtfUDk6Ci0JCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09ZW50cnkua2JfdmFsdWU7Ci0JCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV0rPSAnMCc7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIEtfUFBMVVM6Ci0JCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnKycpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBLX1BNSU5VUzoKLQkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCctJyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIEtfUFNUQVI6Ci0JCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnKicpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBLX1BTTEFTSDoKLQkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcvJyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIEtfUEVOVEVSOgotCQkJCQkJdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJ1xyJyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIEtfUENPTU1BOgotCQkJCQkJdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJywnKTsKLQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgS19QRE9UOgotCQkJCQkJdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJy4nKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLyogRG8gdGhlIG5vcm1hbCBrZXkgdHJhbnNsYXRpb24gKi8KLQkJCQlpZiAoIChLVFlQKGVudHJ5LmtiX3ZhbHVlKSA9PSBLVF9MQVRJTikgfHwKLQkJCQkJIChLVFlQKGVudHJ5LmtiX3ZhbHVlKSA9PSBLVF9BU0NJSSkgfHwKLQkJCQkJIChLVFlQKGVudHJ5LmtiX3ZhbHVlKSA9PSBLVF9MRVRURVIpICkgewotCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV0gPSBlbnRyeS5rYl92YWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWludCBHU19JbkdyYXBoaWNzTW9kZShfVEhJUykKLXsKLQlyZXR1cm4oKGtleWJvYXJkX2ZkID49IDApICYmIChzYXZlZF9rYmRfbW9kZSA+PSAwKSk7Ci19Ci0KLWludCBHU19FbnRlckdyYXBoaWNzTW9kZShfVEhJUykKLXsKLQlzdHJ1Y3QgdGVybWlvcyBrZXlib2FyZF90ZXJtaW9zOwotCi0JLyogU2V0IG1lZGl1bS1yYXcga2V5Ym9hcmQgbW9kZSAqLwotCWlmICggKGtleWJvYXJkX2ZkID49IDApICYmICFHU19JbkdyYXBoaWNzTW9kZSh0aGlzKSApIHsKLQotCQkvKiBTd2l0Y2ggdG8gdGhlIGNvcnJlY3QgdmlydHVhbCB0ZXJtaW5hbCAqLwotCQlpZiAoIGN1cnJlbnRfdnQgPiAwICkgewotCQkJc3RydWN0IHZ0X3N0YXQgdnRzdGF0ZTsKLQotCQkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgVlRfR0VUU1RBVEUsICZ2dHN0YXRlKSA9PSAwICkgewotCQkJCXNhdmVkX3Z0ID0gdnRzdGF0ZS52X2FjdGl2ZTsKLQkJCX0KLQkJCWlmICggaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX0FDVElWQVRFLCBjdXJyZW50X3Z0KSA9PSAwICkgewotCQkJCWlvY3RsKGtleWJvYXJkX2ZkLCBWVF9XQUlUQUNUSVZFLCBjdXJyZW50X3Z0KTsKLQkJCX0KLQkJfQotCi0JCS8qIFNldCB0aGUgdGVybWluYWwgaW5wdXQgbW9kZSAqLwotCQlpZiAoIHRjZ2V0YXR0cihrZXlib2FyZF9mZCwgJnNhdmVkX2tiZF90ZXJtaW9zKSA8IDAgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBnZXQgdGVybWluYWwgYXR0cmlidXRlcyIpOwotCQkJaWYgKCBrZXlib2FyZF9mZCA+IDAgKSB7Ci0JCQkJY2xvc2Uoa2V5Ym9hcmRfZmQpOwotCQkJfQotCQkJa2V5Ym9hcmRfZmQgPSAtMTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgS0RHS0JNT0RFLCAmc2F2ZWRfa2JkX21vZGUpIDwgMCApIHsKLQkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGdldCBjdXJyZW50IGtleWJvYXJkIG1vZGUiKTsKLQkJCWlmICgga2V5Ym9hcmRfZmQgPiAwICkgewotCQkJCWNsb3NlKGtleWJvYXJkX2ZkKTsKLQkJCX0KLQkJCWtleWJvYXJkX2ZkID0gLTE7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCWtleWJvYXJkX3Rlcm1pb3MgPSBzYXZlZF9rYmRfdGVybWlvczsKLQkJa2V5Ym9hcmRfdGVybWlvcy5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IElTSUcpOwotCQlrZXlib2FyZF90ZXJtaW9zLmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJR05DUiB8IElDUk5MIHwgSU5MQ1IgfCBJWE9GRiB8IElYT04pOwotCQlrZXlib2FyZF90ZXJtaW9zLmNfY2NbVk1JTl0gPSAwOwotCQlrZXlib2FyZF90ZXJtaW9zLmNfY2NbVlRJTUVdID0gMDsKLQkJaWYgKHRjc2V0YXR0cihrZXlib2FyZF9mZCwgVENTQUZMVVNILCAma2V5Ym9hcmRfdGVybWlvcykgPCAwKSB7Ci0JCQlHU19DbG9zZUtleWJvYXJkKHRoaXMpOwotCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gc2V0IHRlcm1pbmFsIGF0dHJpYnV0ZXMiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJLyogVGhpcyB3aWxsIGZhaWwgaWYgd2UgYXJlbid0IHJvb3Qgb3IgdGhpcyBpc24ndCBvdXIgdHR5ICovCi0JCWlmICggaW9jdGwoa2V5Ym9hcmRfZmQsIEtEU0tCTU9ERSwgS19NRURJVU1SQVcpIDwgMCApIHsKLQkJCUdTX0Nsb3NlS2V5Ym9hcmQodGhpcyk7Ci0JCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBzZXQga2V5Ym9hcmQgaW4gcmF3IG1vZGUiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgS0RTRVRNT0RFLCBLRF9HUkFQSElDUykgPCAwICkgewotCQkJR1NfQ2xvc2VLZXlib2FyZCh0aGlzKTsKLQkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIHNldCBrZXlib2FyZCBpbiBncmFwaGljcyBtb2RlIik7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JfQotCXJldHVybihrZXlib2FyZF9mZCk7Ci19Ci0KLXZvaWQgR1NfTGVhdmVHcmFwaGljc01vZGUoX1RISVMpCi17Ci0JaWYgKCBHU19JbkdyYXBoaWNzTW9kZSh0aGlzKSApIHsKLQkJaW9jdGwoa2V5Ym9hcmRfZmQsIEtEU0VUTU9ERSwgS0RfVEVYVCk7Ci0JCWlvY3RsKGtleWJvYXJkX2ZkLCBLRFNLQk1PREUsIHNhdmVkX2tiZF9tb2RlKTsKLQkJdGNzZXRhdHRyKGtleWJvYXJkX2ZkLCBUQ1NBRkxVU0gsICZzYXZlZF9rYmRfdGVybWlvcyk7Ci0JCXNhdmVkX2tiZF9tb2RlID0gLTE7Ci0KLQkJLyogSGVhZCBiYWNrIG92ZXIgdG8gdGhlIG9yaWdpbmFsIHZpcnR1YWwgdGVybWluYWwgKi8KLQkJaWYgKCBzYXZlZF92dCA+IDAgKSB7Ci0JCQlpb2N0bChrZXlib2FyZF9mZCwgVlRfQUNUSVZBVEUsIHNhdmVkX3Z0KTsKLQkJfQotCX0KLX0KLQotdm9pZCBHU19DbG9zZUtleWJvYXJkKF9USElTKQotewotCWlmICgga2V5Ym9hcmRfZmQgPj0gMCApIHsKLQkJR1NfTGVhdmVHcmFwaGljc01vZGUodGhpcyk7Ci0JCWlmICgga2V5Ym9hcmRfZmQgPiAwICkgewotCQkJY2xvc2Uoa2V5Ym9hcmRfZmQpOwotCQl9Ci0JfQotCWtleWJvYXJkX2ZkID0gLTE7Ci19Ci0KLWludCBHU19PcGVuS2V5Ym9hcmQoX1RISVMpCi17Ci0JLyogT3BlbiBvbmx5IGlmIG5vdCBhbHJlYWR5IG9wZW5lZCAqLwotIAlpZiAoIGtleWJvYXJkX2ZkIDwgMCApIHsKLQkJY2hhciAqdHR5MFtdID0geyAiL2Rldi90dHkwIiwgIi9kZXYvdmMvMCIsIE5VTEwgfTsKLQkJY2hhciAqdmNzW10gPSB7ICIvZGV2L3ZjLyVkIiwgIi9kZXYvdHR5JWQiLCBOVUxMIH07Ci0JCWludCBpLCB0dHkwX2ZkOwotCi0JCS8qIFRyeSB0byBxdWVyeSBmb3IgYSBmcmVlIHZpcnR1YWwgdGVybWluYWwgKi8KLQkJdHR5MF9mZCA9IC0xOwotCQlmb3IgKCBpPTA7IHR0eTBbaV0gJiYgKHR0eTBfZmQgPCAwKTsgKytpICkgewotCQkJdHR5MF9mZCA9IG9wZW4odHR5MFtpXSwgT19XUk9OTFksIDApOwotCQl9Ci0JCWlmICggdHR5MF9mZCA8IDAgKSB7Ci0JCQl0dHkwX2ZkID0gZHVwKDApOyAvKiBNYXliZSBzdGRpbiBpcyBhIFZUPyAqLwotCQl9Ci0JCWlvY3RsKHR0eTBfZmQsIFZUX09QRU5RUlksICZjdXJyZW50X3Z0KTsKLQkJY2xvc2UodHR5MF9mZCk7Ci0JCWlmICggKGdldGV1aWQoKSA9PSAwKSAmJiAoY3VycmVudF92dCA+IDApICkgewotCQkJZm9yICggaT0wOyB2Y3NbaV0gJiYgKGtleWJvYXJkX2ZkIDwgMCk7ICsraSApIHsKLQkJCQljaGFyIHZ0cGF0aFsxMl07Ci0KLQkJCQlTRExfc25wcmludGYodnRwYXRoLCBTRExfYXJyYXlzaXplKHZ0cGF0aCksIHZjc1tpXSwgY3VycmVudF92dCk7Ci0JCQkJa2V5Ym9hcmRfZmQgPSBvcGVuKHZ0cGF0aCwgT19SRFdSLCAwKTsKLSNpZmRlZiBERUJVR19LRVlCT0FSRAotCQkJCWZwcmludGYoc3RkZXJyLCAidnRwYXRoID0gJXMsIGZkID0gJWRcbiIsCi0JCQkJCXZ0cGF0aCwga2V5Ym9hcmRfZmQpOwotI2VuZGlmIC8qIERFQlVHX0tFWUJPQVJEICovCi0KLQkJCQkvKiBUaGlzIG5lZWRzIHRvIGJlIG91ciBjb250cm9sbGluZyB0dHkKLQkJCQkgICBzbyB0aGF0IHRoZSBrZXJuZWwgaW9jdGwoKSBjYWxscyB3b3JrCi0JCQkJKi8KLQkJCQlpZiAoIGtleWJvYXJkX2ZkID49IDAgKSB7Ci0JCQkJCXR0eTBfZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUiwgMCk7Ci0JCQkJCWlmICggdHR5MF9mZCA+PSAwICkgewotCQkJCQkJaW9jdGwodHR5MF9mZCwgVElPQ05PVFRZLCAwKTsKLQkJCQkJCWNsb3NlKHR0eTBfZmQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gCQlpZiAoIGtleWJvYXJkX2ZkIDwgMCApIHsKLQkJCS8qIExhc3QgcmVzb3J0LCBtYXliZSBvdXIgdHR5IGlzIGEgdXNhYmxlIFZUICovCi0JCQljdXJyZW50X3Z0ID0gMDsKLQkJCWtleWJvYXJkX2ZkID0gb3BlbigiL2Rldi90dHkiLCBPX1JEV1IpOwotIAkJfQotI2lmZGVmIERFQlVHX0tFWUJPQVJECi0JCWZwcmludGYoc3RkZXJyLCAiQ3VycmVudCBWVDogJWRcbiIsIGN1cnJlbnRfdnQpOwotI2VuZGlmCi0gCQlzYXZlZF9rYmRfbW9kZSA9IC0xOwotCi0JCS8qIE1ha2Ugc3VyZSB0aGF0IG91ciBpbnB1dCBpcyBhIGNvbnNvbGUgdGVybWluYWwgKi8KLQkJeyBpbnQgZHVtbXk7Ci0JCSAgaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgS0RHS0JNT0RFLCAmZHVtbXkpIDwgMCApIHsKLQkJCWNsb3NlKGtleWJvYXJkX2ZkKTsKLQkJCWtleWJvYXJkX2ZkID0gLTE7Ci0JCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBvcGVuIGEgY29uc29sZSB0ZXJtaW5hbCIpOwotCQkgIH0KLQkJfQotCi0JCS8qIFNldCB1cCBrZXltYXAgKi8KLQkJR1NfdmdhaW5pdGtleW1hcHMoa2V5Ym9hcmRfZmQpOwotIAl9Ci0gCXJldHVybihrZXlib2FyZF9mZCk7Ci19Ci0KLXN0YXRpYyBlbnVtIHsKLQlNT1VTRV9OT05FID0gLTEsCi0JTU9VU0VfR1BNLAkvKiBOb3RlOiBHUE0gdXNlcyB0aGUgTVNDIHByb3RvY29sICovCi0JTU9VU0VfUFMyLAotCU1PVVNFX0lNUFMyLAotCU1PVVNFX01TLAotCU1PVVNFX0JNLAotCU5VTV9NT1VTRV9EUlZTCi19IG1vdXNlX2RydiA9IE1PVVNFX05PTkU7Ci0KLXZvaWQgR1NfQ2xvc2VNb3VzZShfVEhJUykKLXsKLQlpZiAoIG1vdXNlX2ZkID4gMCApIHsKLQkJY2xvc2UobW91c2VfZmQpOwotCX0KLQltb3VzZV9mZCA9IC0xOwotfQotCi0vKiBSZXR1cm5zIHByb2Nlc3NlcyBsaXN0ZWQgaW4gL3Byb2Mgd2l0aCB0aGUgZGVzaXJlZCBuYW1lICovCi1zdGF0aWMgaW50IGZpbmRfcGlkKERJUiAqcHJvYywgY29uc3QgY2hhciAqd2FudGVkX25hbWUpCi17Ci0Jc3RydWN0IGRpcmVudCAqZW50cnk7Ci0JaW50IHBpZDsKLQotCS8qIEZpcnN0IHNjYW4gcHJvYyBmb3IgdGhlIGdwbSBwcm9jZXNzICovCi0JcGlkID0gMDsKLQl3aGlsZSAoIChwaWQgPT0gMCkgJiYgKChlbnRyeT1yZWFkZGlyKHByb2MpKSAhPSBOVUxMKSApIHsKLQkJaWYgKCBpc2RpZ2l0KGVudHJ5LT5kX25hbWVbMF0pICkgewotCQkJRklMRSAqc3RhdHVzOwotCQkJY2hhciBwYXRoW1BBVEhfTUFYXTsKLQkJCWNoYXIgbmFtZVtQQVRIX01BWF07Ci0KLQkJCVNETF9zbnByaW50ZihwYXRoLCBTRExfYXJyYXlzaXplKHBhdGgpLCAiL3Byb2MvJXMvc3RhdHVzIiwgZW50cnktPmRfbmFtZSk7Ci0JCQlzdGF0dXM9Zm9wZW4ocGF0aCwgInIiKTsKLQkJCWlmICggc3RhdHVzICkgewotCQkJCW5hbWVbMF0gPSAnXDAnOwotCQkJCWZzY2FuZihzdGF0dXMsICJOYW1lOiAlcyIsIG5hbWUpOwotCQkJCWlmICggU0RMX3N0cmNtcChuYW1lLCB3YW50ZWRfbmFtZSkgPT0gMCApIHsKLQkJCQkJcGlkID0gYXRvaShlbnRyeS0+ZF9uYW1lKTsKLQkJCQl9Ci0JCQkJZmNsb3NlKHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHBpZDsKLX0KLQotLyogUmV0dXJucyB0cnVlIGlmIC9kZXYvZ3BtZGF0YSBpcyBiZWluZyB3cml0dGVuIHRvIGJ5IGdwbSAqLwotc3RhdGljIGludCBncG1fYXZhaWxhYmxlKHZvaWQpCi17Ci0JaW50IGF2YWlsYWJsZTsKLQlESVIgKnByb2M7Ci0JaW50IHBpZDsKLQlpbnQgY21kbGluZSwgbGVuLCBhcmdsZW47Ci0JY2hhciBwYXRoW1BBVEhfTUFYXTsKLQljaGFyIGFyZ3NbUEFUSF9NQVhdLCAqYXJnOwotCi0JLyogRG9uJ3QgYm90aGVyIGxvb2tpbmcgaWYgdGhlIGZpZm8gaXNuJ3QgdGhlcmUgKi8KLQlpZiAoIGFjY2VzcyhHUE1fTk9ERV9GSUZPLCBGX09LKSA8IDAgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQlhdmFpbGFibGUgPSAwOwotCXByb2MgPSBvcGVuZGlyKCIvcHJvYyIpOwotCWlmICggcHJvYyApIHsKLQkJd2hpbGUgKCAocGlkPWZpbmRfcGlkKHByb2MsICJncG0iKSkgPiAwICkgewotCQkJU0RMX3NucHJpbnRmKHBhdGgsIFNETF9hcnJheXNpemUocGF0aCksICIvcHJvYy8lZC9jbWRsaW5lIiwgcGlkKTsKLQkJCWNtZGxpbmUgPSBvcGVuKHBhdGgsIE9fUkRPTkxZLCAwKTsKLQkJCWlmICggY21kbGluZSA+PSAwICkgewotCQkJCWxlbiA9IHJlYWQoY21kbGluZSwgYXJncywgc2l6ZW9mKGFyZ3MpKTsKLQkJCQlhcmcgPSBhcmdzOwotCQkJCXdoaWxlICggbGVuID4gMCApIHsKLQkJCQkJaWYgKCBTRExfc3RyY21wKGFyZywgIi1SIikgPT0gMCApIHsKLQkJCQkJCWF2YWlsYWJsZSA9IDE7Ci0JCQkJCX0KLQkJCQkJYXJnbGVuID0gU0RMX3N0cmxlbihhcmcpKzE7Ci0JCQkJCWxlbiAtPSBhcmdsZW47Ci0JCQkJCWFyZyArPSBhcmdsZW47Ci0JCQkJfQotCQkJCWNsb3NlKGNtZGxpbmUpOwotCQkJfQotCQl9Ci0JCWNsb3NlZGlyKHByb2MpOwotCX0KLQlyZXR1cm4gYXZhaWxhYmxlOwotfQotCi0KLS8qIHJjZzA2MTEyMDAxIFNldCB1cCBJTVBTLzIgbW9kZSwgaWYgcG9zc2libGUuIFRoaXMgZ2l2ZXMKLSAqICB1cyBhY2Nlc3MgdG8gdGhlIG1vdXNld2hlZWwsIGV0Yy4gUmV0dXJucyB6ZXJvIGlmCi0gKiAgd3JpdGVzIHRvIGRldmljZSBmYWlsZWQsIGJ1dCB5b3Ugc3RpbGwgbmVlZCB0byBxdWVyeSB0aGUKLSAqICBkZXZpY2UgdG8gc2VlIHdoaWNoIG1vZGUgaXQncyBhY3R1YWxseSBpbi4KLSAqLwotc3RhdGljIGludCBzZXRfaW1wczJfbW9kZShpbnQgZmQpCi17Ci0JLyogSWYgeW91IHdhbnRlZCB0byBjb250cm9sIHRoZSBtb3VzZSBtb2RlIChhbmQgd2UgZG8gOikgICkgLi4uCi0JCVNldCBJTVBTLzIgcHJvdG9jb2w6Ci0JCQl7MHhmMywyMDAsMHhmMywxMDAsMHhmMyw4MH0KLQkJUmVzZXQgbW91c2UgZGV2aWNlOgotCQkJezB4RkZ9Ci0JKi8KLQlVaW50OCBzZXRfaW1wczJbXSA9IHsweGYzLCAyMDAsIDB4ZjMsIDEwMCwgMHhmMywgODB9OwotCVVpbnQ4IHJlc2V0ID0gMHhmZjsKLQlmZF9zZXQgZmRzZXQ7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoIHdyaXRlKGZkLCAmc2V0X2ltcHMyLCBzaXplb2Yoc2V0X2ltcHMyKSkgPT0gc2l6ZW9mKHNldF9pbXBzMikgKSB7Ci0JCWlmICh3cml0ZShmZCwgJnJlc2V0LCBzaXplb2YgKHJlc2V0KSkgPT0gc2l6ZW9mIChyZXNldCkgKSB7Ci0JCQlyZXR2YWwgPSAxOwotCQl9Ci0JfQotCi0JLyogR2V0IHJpZCBvZiBhbnkgY2hhdHRlciBmcm9tIHRoZSBhYm92ZSAqLwotCUZEX1pFUk8oJmZkc2V0KTsKLQlGRF9TRVQoZmQsICZmZHNldCk7Ci0JdHYudHZfc2VjID0gMDsKLQl0di50dl91c2VjID0gMDsKLQl3aGlsZSAoIHNlbGVjdChmZCsxLCAmZmRzZXQsIDAsIDAsICZ0dikgPiAwICkgewotCQljaGFyIHRlbXBbMzJdOwotCQlyZWFkKGZkLCB0ZW1wLCBzaXplb2YodGVtcCkpOwotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotLyogUmV0dXJucyB0cnVlIGlmIHRoZSBtb3VzZSB1c2VzIHRoZSBJTVBTLzIgcHJvdG9jb2wgKi8KLXN0YXRpYyBpbnQgZGV0ZWN0X2ltcHMyKGludCBmZCkKLXsKLQlpbnQgaW1wczI7Ci0KLQlpbXBzMiA9IDA7Ci0KLQlpZiAoIFNETF9nZXRlbnYoIlNETF9NT1VTRURFVl9JTVBTMiIpICkgewotCQlpbXBzMiA9IDE7Ci0JfQotCWlmICggISBpbXBzMiApIHsKLQkJVWludDggcXVlcnlfcHMyID0gMHhGMjsKLQkJZmRfc2V0IGZkc2V0OwotCQlzdHJ1Y3QgdGltZXZhbCB0djsKLQotCQkvKiBHZXQgcmlkIG9mIGFueSBtb3VzZSBtb3Rpb24gbm9pc2UgKi8KLQkJRkRfWkVSTygmZmRzZXQpOwotCQlGRF9TRVQoZmQsICZmZHNldCk7Ci0JCXR2LnR2X3NlYyA9IDA7Ci0JCXR2LnR2X3VzZWMgPSAwOwotCQl3aGlsZSAoIHNlbGVjdChmZCsxLCAmZmRzZXQsIDAsIDAsICZ0dikgPiAwICkgewotCQkJY2hhciB0ZW1wWzMyXTsKLQkJCXJlYWQoZmQsIHRlbXAsIHNpemVvZih0ZW1wKSk7Ci0JCX0KLQotICAgCQkvKiBRdWVyeSBmb3IgdGhlIHR5cGUgb2YgbW91c2UgcHJvdG9jb2wgKi8KLSAgIAkJaWYgKCB3cml0ZShmZCwgJnF1ZXJ5X3BzMiwgc2l6ZW9mIChxdWVyeV9wczIpKSA9PSBzaXplb2YgKHF1ZXJ5X3BzMikpIHsKLSAgIAkJCVVpbnQ4IGNoID0gMDsKLQotCQkJLyogR2V0IHRoZSBtb3VzZSBwcm90b2NvbCByZXNwb25zZSAqLwotCQkJZG8gewotCQkJCUZEX1pFUk8oJmZkc2V0KTsKLQkJCQlGRF9TRVQoZmQsICZmZHNldCk7Ci0JCQkJdHYudHZfc2VjID0gMTsKLQkJCQl0di50dl91c2VjID0gMDsKLQkJCQlpZiAoIHNlbGVjdChmZCsxLCAmZmRzZXQsIDAsIDAsICZ0dikgPCAxICkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IHdoaWxlICggKHJlYWQoZmQsICZjaCwgc2l6ZW9mIChjaCkpID09IHNpemVvZiAoY2gpKSAmJgotCQkJICAgICAgICAgICgoY2ggPT0gMHhGQSkgfHwgKGNoID09IDB4QUEpKSApOwotCi0JCQkvKiBFeHBlcmltZW50YWwgdmFsdWVzIChMb2dpdGVjaCB3aGVlbG1vdXNlKSAqLwotI2lmZGVmIERFQlVHX01PVVNFCi1mcHJpbnRmKHN0ZGVyciwgIkxhc3QgbW91c2UgbW9kZTogMHgleFxuIiwgY2gpOwotI2VuZGlmCi0JCQlpZiAoIGNoID09IDMgKSB7Ci0JCQkJaW1wczIgPSAxOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBpbXBzMjsKLX0KLQotaW50IEdTX09wZW5Nb3VzZShfVEhJUykKLXsKLQlpbnQgaTsKLQljb25zdCBjaGFyICptb3VzZWRldjsKLQljb25zdCBjaGFyICptb3VzZWRydjsKLQotCW1vdXNlZHJ2ID0gU0RMX2dldGVudigiU0RMX01PVVNFRFJWIik7Ci0JbW91c2VkZXYgPSBTRExfZ2V0ZW52KCJTRExfTU9VU0VERVYiKTsKLQltb3VzZV9mZCA9IC0xOwotCi0JLyogU1REIE1JQ0UgKi8KLQotCWlmICggbW91c2VkZXYgPT0gTlVMTCApIHsKLQkJLyogRklYTUUgc29tZWRheS4uLiBhbGxvdyBtdWx0aXBsZSBtaWNlIGluIHRoaXMgZHJpdmVyICovCi0JCWNoYXIgKnBzMm1pY2VbXSA9IHsKLQkJICAgICIvZGV2L2lucHV0L21pY2UiLCAiL2Rldi91c2Jtb3VzZSIsICIvZGV2L3BzYXV4IiwgTlVMTAotCQl9OwotCQkvKiBGaXJzdCB0cnkgdG8gdXNlIEdQTSBpbiByZXBlYXRlciBtb2RlICovCi0JCWlmICggbW91c2VfZmQgPCAwICkgewotCQkJaWYgKCBncG1fYXZhaWxhYmxlKCkgKSB7Ci0JCQkJbW91c2VfZmQgPSBvcGVuKEdQTV9OT0RFX0ZJRk8sIE9fUkRPTkxZLCAwKTsKLQkJCQlpZiAoIG1vdXNlX2ZkID49IDAgKSB7Ci0jaWZkZWYgREVCVUdfTU9VU0UKLWZwcmludGYoc3RkZXJyLCAiVXNpbmcgR1BNIG1vdXNlXG4iKTsKLSNlbmRpZgotCQkJCQltb3VzZV9kcnYgPSBNT1VTRV9HUE07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8qIE5vdyB0cnkgdG8gdXNlIGEgbW9kZXJuIFBTLzIgbW91c2UgKi8KLQkJZm9yICggaT0wOyAobW91c2VfZmQgPCAwKSAmJiBwczJtaWNlW2ldOyArK2kgKSB7Ci0JCQltb3VzZV9mZCA9IG9wZW4ocHMybWljZVtpXSwgT19SRFdSLCAwKTsKLQkJCWlmIChtb3VzZV9mZCA8IDApIHsKLQkJCQltb3VzZV9mZCA9IG9wZW4ocHMybWljZVtpXSwgT19SRE9OTFksIDApOwotCQkJfQotCQkJaWYgKG1vdXNlX2ZkID49IDApIHsKLQkJCQkvKiByY2cwNjExMjAwMSBBdHRlbXB0IHRvIHNldCBJTVBTLzIgbW9kZSAqLwotCQkJCWlmICggaSA9PSAwICkgewotCQkJCQlzZXRfaW1wczJfbW9kZShtb3VzZV9mZCk7Ci0JCQkJfQotCQkJCWlmIChkZXRlY3RfaW1wczIobW91c2VfZmQpKSB7Ci0jaWZkZWYgREVCVUdfTU9VU0UKLWZwcmludGYoc3RkZXJyLCAiVXNpbmcgSU1QUzIgbW91c2VcbiIpOwotI2VuZGlmCi0JCQkJCW1vdXNlX2RydiA9IE1PVVNFX0lNUFMyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1vdXNlX2RydiA9IE1PVVNFX1BTMjsKLSNpZmRlZiBERUJVR19NT1VTRQotZnByaW50ZihzdGRlcnIsICJVc2luZyBQUzIgbW91c2VcbiIpOwotI2VuZGlmCi0JCQkJfQotCQkJfQotCQl9Ci0JCS8qIE5leHQgdHJ5IHRvIHVzZSBhIFBQQyBBREIgcG9ydCBtb3VzZSAqLwotCQlpZiAoIG1vdXNlX2ZkIDwgMCApIHsKLQkJCW1vdXNlX2ZkID0gb3BlbigiL2Rldi9hZGJtb3VzZSIsIE9fUkRPTkxZLCAwKTsKLQkJCWlmICggbW91c2VfZmQgPj0gMCApIHsKLSNpZmRlZiBERUJVR19NT1VTRQotZnByaW50ZihzdGRlcnIsICJVc2luZyBBREIgbW91c2VcbiIpOwotI2VuZGlmCi0JCQkJbW91c2VfZHJ2ID0gTU9VU0VfQk07Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogRGVmYXVsdCB0byBhIHNlcmlhbCBNaWNyb3NvZnQgbW91c2UgKi8KLQlpZiAoIG1vdXNlX2ZkIDwgMCApIHsKLQkJaWYgKCBtb3VzZWRldiA9PSBOVUxMICkgewotCQkJbW91c2VkZXYgPSAiL2Rldi9tb3VzZSI7Ci0JCX0KLQkJbW91c2VfZmQgPSBvcGVuKG1vdXNlZGV2LCBPX1JET05MWSwgMCk7Ci0JCWlmICggbW91c2VfZmQgPj0gMCApIHsKLQkJCXN0cnVjdCB0ZXJtaW9zIG1vdXNlX3Rlcm1pb3M7Ci0KLQkJCS8qIFNldCB0aGUgc2FtcGxpbmcgc3BlZWQgdG8gMTIwMCBiYXVkICovCi0JCQl0Y2dldGF0dHIobW91c2VfZmQsICZtb3VzZV90ZXJtaW9zKTsKLQkJCW1vdXNlX3Rlcm1pb3MuY19pZmxhZyA9IElHTkJSSyB8IElHTlBBUjsKLQkJCW1vdXNlX3Rlcm1pb3MuY19vZmxhZyA9IDA7Ci0JCQltb3VzZV90ZXJtaW9zLmNfbGZsYWcgPSAwOwotCQkJbW91c2VfdGVybWlvcy5jX2xpbmUgPSAwOwotCQkJbW91c2VfdGVybWlvcy5jX2NjW1ZUSU1FXSA9IDA7Ci0JCQltb3VzZV90ZXJtaW9zLmNfY2NbVk1JTl0gPSAxOwotCQkJbW91c2VfdGVybWlvcy5jX2NmbGFnID0gQ1JFQUQgfCBDTE9DQUwgfCBIVVBDTDsKLQkJCW1vdXNlX3Rlcm1pb3MuY19jZmxhZyB8PSBDUzg7Ci0JCQltb3VzZV90ZXJtaW9zLmNfY2ZsYWcgfD0gQjEyMDA7Ci0JCQl0Y3NldGF0dHIobW91c2VfZmQsIFRDU0FGTFVTSCwgJm1vdXNlX3Rlcm1pb3MpOwotI2lmZGVmIERFQlVHX01PVVNFCi1mcHJpbnRmKHN0ZGVyciwgIlVzaW5nIE1pY3Jvc29mdCBtb3VzZSBvbiAlc1xuIiwgbW91c2VkZXYpOwotI2VuZGlmCi0JCQltb3VzZV9kcnYgPSBNT1VTRV9NUzsKLQkJfQotCX0KLQlpZiAoIG1vdXNlX2ZkIDwgMCApIHsKLQkJbW91c2VfZHJ2ID0gTU9VU0VfTk9ORTsKLQl9Ci0JcmV0dXJuKG1vdXNlX2ZkKTsKLX0KLQotc3RhdGljIGludCBwb3N0ZWQgPSAwOwotCi12b2lkIEdTX3ZnYW1vdXNlY2FsbGJhY2soaW50IGJ1dHRvbiwgaW50IGR4LCBpbnQgZHkpCi17Ci0JaW50IGJ1dHRvbl8xLCBidXR0b25fMzsKLQlpbnQgYnV0dG9uX3N0YXRlOwotCWludCBzdGF0ZV9jaGFuZ2VkOwotCWludCBpOwotCVVpbnQ4IHN0YXRlOwotCi0JaWYgKCBkeCB8fCBkeSApIHsKLQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgZHgsIGR5KTsKLQl9Ci0KLQkvKiBTd2FwIGJ1dHRvbiAxIGFuZCAzICovCi0JYnV0dG9uXzEgPSAoYnV0dG9uICYgMHgwNCkgPj4gMjsKLQlidXR0b25fMyA9IChidXR0b24gJiAweDAxKSA8PCAyOwotCWJ1dHRvbiAmPSB+MHgwNTsKLQlidXR0b24gfD0gKGJ1dHRvbl8xfGJ1dHRvbl8zKTsKLQotCS8qIFNlZSB3aGF0IGNoYW5nZWQgKi8KLQlidXR0b25fc3RhdGUgPSBTRExfR2V0TW91c2VTdGF0ZShOVUxMLCBOVUxMKTsKLQlzdGF0ZV9jaGFuZ2VkID0gYnV0dG9uX3N0YXRlIF4gYnV0dG9uOwotCWZvciAoIGk9MDsgaTw4OyArK2kgKSB7Ci0JCWlmICggc3RhdGVfY2hhbmdlZCAmICgxPDxpKSApIHsKLQkJCWlmICggYnV0dG9uICYgKDE8PGkpICkgewotCQkJCXN0YXRlID0gU0RMX1BSRVNTRUQ7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXRlID0gU0RMX1JFTEVBU0VEOwotCQkJfQotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oc3RhdGUsIGkrMSwgMCwgMCk7Ci0JCX0KLQl9Ci19Ci0KLS8qIEZvciBub3csIHVzZSBHUE0sIFBTLzIsIGFuZCBNUyBwcm90b2NvbHMKLSAgIERyaXZlciBhZGFwdGVkIGZyb20gdGhlIFNWR0FsaWIgbW91c2UgZHJpdmVyIGNvZGUgKHRha2VuIGZyb20gZ3BtLCBldGMuKQotICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfbW91c2UoX1RISVMpCi17Ci0Jc3RhdGljIGludCBzdGFydCA9IDA7Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgbW91c2VidWZbQlVGU0laXTsKLQlpbnQgaSwgbnJlYWQ7Ci0JaW50IGJ1dHRvbiA9IDA7Ci0JaW50IGR4ID0gMCwgZHkgPSAwOwotCWludCBwYWNrZXRzaXplID0gMDsKLQotCS8qIEZpZ3VyZSBvdXQgdGhlIG1vdXNlIHBhY2tldCBzaXplICovCi0Jc3dpdGNoIChtb3VzZV9kcnYpIHsKLQkJY2FzZSBNT1VTRV9OT05FOgotCQkJLyogQWNrISAqLwotCQkJcmVhZChtb3VzZV9mZCwgbW91c2VidWYsIEJVRlNJWik7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgTU9VU0VfR1BNOgotCQkJcGFja2V0c2l6ZSA9IDU7Ci0JCQlicmVhazsKLQkJY2FzZSBNT1VTRV9JTVBTMjoKLQkJCXBhY2tldHNpemUgPSA0OwotCQkJYnJlYWs7Ci0JCWNhc2UgTU9VU0VfUFMyOgotCQljYXNlIE1PVVNFX01TOgotCQljYXNlIE1PVVNFX0JNOgotCQkJcGFja2V0c2l6ZSA9IDM7Ci0JCQlicmVhazsKLQkJY2FzZSBOVU1fTU9VU0VfRFJWUzoKLQkJCS8qIFVoIG9oLi4gKi8KLQkJCXBhY2tldHNpemUgPSAwOwotCQkJYnJlYWs7Ci0JfQotCi0JLyogUmVhZCBhcyBtYW55IHBhY2tldHMgYXMgcG9zc2libGUgKi8KLQlucmVhZCA9IHJlYWQobW91c2VfZmQsICZtb3VzZWJ1ZltzdGFydF0sIEJVRlNJWi1zdGFydCk7Ci0JaWYgKCBucmVhZCA8IDAgKSB7Ci0JCXJldHVybjsKLQl9Ci0JbnJlYWQgKz0gc3RhcnQ7Ci0jaWZkZWYgREVCVUdfTU9VU0UKLQlmcHJpbnRmKHN0ZGVyciwgIlJlYWQgJWQgYnl0ZXMgZnJvbSBtb3VzZSwgc3RhcnQgPSAlZFxuIiwgbnJlYWQsIHN0YXJ0KTsKLSNlbmRpZgotCWZvciAoIGk9MDsgaTwobnJlYWQtKHBhY2tldHNpemUtMSkpOyBpICs9IHBhY2tldHNpemUgKSB7Ci0JCXN3aXRjaCAobW91c2VfZHJ2KSB7Ci0JCQljYXNlIE1PVVNFX05PTkU6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PVVNFX0dQTToKLQkJCQkvKiBHUE0gcHJvdG9jb2wgaGFzIDB4ODAgaW4gaGlnaCBieXRlICovCi0JCQkJaWYgKCAobW91c2VidWZbaV0gJiAweEY4KSAhPSAweDgwICkgewotCQkJCQkvKiBHbyB0byBuZXh0IGJ5dGUgKi8KLQkJCQkJaSAtPSAocGFja2V0c2l6ZS0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8qIEdldCBjdXJyZW50IG1vdXNlIHN0YXRlICovCi0JCQkJYnV0dG9uID0gKH5tb3VzZWJ1ZltpXSkgJiAweDA3OwotCQkJCWR4ID0gICAoc2lnbmVkIGNoYXIpKG1vdXNlYnVmW2krMV0pICsKLQkJCQkgICAgICAgKHNpZ25lZCBjaGFyKShtb3VzZWJ1ZltpKzNdKTsKLQkJCQlkeSA9IC0oKHNpZ25lZCBjaGFyKShtb3VzZWJ1ZltpKzJdKSArCi0JCQkJICAgICAgIChzaWduZWQgY2hhcikobW91c2VidWZbaSs0XSkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT1VTRV9QUzI6Ci0JCQkJLyogUFMvMiBwcm90b2NvbCBoYXMgbm90aGluZyBpbiBoaWdoIGJ5dGUgKi8KLQkJCQlpZiAoIChtb3VzZWJ1ZltpXSAmIDB4QzApICE9IDAgKSB7Ci0JCQkJCS8qIEdvIHRvIG5leHQgYnl0ZSAqLwotCQkJCQlpIC09IChwYWNrZXRzaXplLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLyogR2V0IGN1cnJlbnQgbW91c2Ugc3RhdGUgKi8KLQkJCQlidXR0b24gPSAobW91c2VidWZbaV0gJiAweDA0KSA+PiAxIHwgLypNaWRkbGUqLwotCQkgIAkJCSAobW91c2VidWZbaV0gJiAweDAyKSA+PiAxIHwgLypSaWdodCovCi0JCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4MDEpIDw8IDI7ICAvKkxlZnQqLwotCQkgIAkJZHggPSAobW91c2VidWZbaV0gJiAweDEwKSA/Ci0JCSAgCQkgICAgICBtb3VzZWJ1ZltpKzFdIC0gMjU2IDogbW91c2VidWZbaSsxXTsKLQkJICAJCWR5ID0gKG1vdXNlYnVmW2ldICYgMHgyMCkgPwotCQkgIAkJICAgICAgLShtb3VzZWJ1ZltpKzJdIC0gMjU2KSA6IC1tb3VzZWJ1ZltpKzJdOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT1VTRV9JTVBTMjoKLQkJCQkvKiBHZXQgY3VycmVudCBtb3VzZSBzdGF0ZSAqLwotCQkJCWJ1dHRvbiA9IChtb3VzZWJ1ZltpXSAmIDB4MDQpID4+IDEgfCAvKk1pZGRsZSovCi0JCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4MDIpID4+IDEgfCAvKlJpZ2h0Ki8KLQkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHgwMSkgPDwgMiB8IC8qTGVmdCovCi0JCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4NDApID4+IDMgfCAvKiA0ICovCi0JCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4ODApID4+IDM7ICAvKiA1ICovCi0JCSAgCQlkeCA9IChtb3VzZWJ1ZltpXSAmIDB4MTApID8KLQkJICAJCSAgICAgIG1vdXNlYnVmW2krMV0gLSAyNTYgOiBtb3VzZWJ1ZltpKzFdOwotCQkgIAkJZHkgPSAobW91c2VidWZbaV0gJiAweDIwKSA/Ci0JCSAgCQkgICAgICAtKG1vdXNlYnVmW2krMl0gLSAyNTYpIDogLW1vdXNlYnVmW2krMl07Ci0JCQkJc3dpdGNoIChtb3VzZWJ1ZltpKzNdJjB4MEYpIHsKLQkJCQkgICAgY2FzZSAweDBFOiAvKiBEWCA9ICsxICovCi0JCQkJICAgIGNhc2UgMHgwMjogLyogRFggPSAtMSAqLwotCQkJCQlicmVhazsKLQkJCQkgICAgY2FzZSAweDBGOiAvKiBEWSA9ICsxIChtYXAgYnV0dG9uIDQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQl92Z2Ftb3VzZWNhbGxiYWNrKGJ1dHRvbiB8ICgxPDwzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMCk7Ci0JCQkJCWJyZWFrOwotCQkJCSAgICBjYXNlIDB4MDE6IC8qIERZID0gLTEgKG1hcCBidXR0b24gNSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCX3ZnYW1vdXNlY2FsbGJhY2soYnV0dG9uIHwgKDE8PDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBNT1VTRV9NUzoKLQkJCQkvKiBNaWNyb3NvZnQgcHJvdG9jb2wgaGFzIDB4NDAgaW4gaGlnaCBieXRlICovCi0JCQkJaWYgKCAobW91c2VidWZbaV0gJiAweDQwKSAhPSAweDQwICkgewotCQkJCQkvKiBHbyB0byBuZXh0IGJ5dGUgKi8KLQkJCQkJaSAtPSAocGFja2V0c2l6ZS0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8qIEdldCBjdXJyZW50IG1vdXNlIHN0YXRlICovCi0JCQkJYnV0dG9uID0gKChtb3VzZWJ1ZltpXSAmIDB4MjApID4+IDMpIHwKLQkJCQkgICAgICAgICAoKG1vdXNlYnVmW2ldICYgMHgxMCkgPj4gNCk7Ci0JCQkJZHggPSAoc2lnbmVkIGNoYXIpKCgobW91c2VidWZbaV0gJiAweDAzKSA8PCA2KSB8Ci0JCQkJICAgICAgICAgICAgICAgICAgIChtb3VzZWJ1ZltpICsgMV0gJiAweDNGKSk7Ci0JCQkJZHkgPSAoc2lnbmVkIGNoYXIpKCgobW91c2VidWZbaV0gJiAweDBDKSA8PCA0KSB8Ci0JCQkJICAgICAgICAgICAgICAgICAgICAobW91c2VidWZbaSArIDJdICYgMHgzRikpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT1VTRV9CTToKLQkJCQkvKiBCdXNNb3VzZSBwcm90b2NvbCBoYXMgMHhGOCBpbiBoaWdoIGJ5dGUgKi8KLQkJCQlpZiAoIChtb3VzZWJ1ZltpXSAmIDB4RjgpICE9IDB4ODAgKSB7Ci0JCQkJCS8qIEdvIHRvIG5leHQgYnl0ZSAqLwotCQkJCQlpIC09IChwYWNrZXRzaXplLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLyogR2V0IGN1cnJlbnQgbW91c2Ugc3RhdGUgKi8KLQkJCQlidXR0b24gPSAofm1vdXNlYnVmW2ldKSAmIDB4MDc7Ci0JCQkJZHggPSAgKHNpZ25lZCBjaGFyKW1vdXNlYnVmW2krMV07Ci0JCQkJZHkgPSAtKHNpZ25lZCBjaGFyKW1vdXNlYnVmW2krMl07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5VTV9NT1VTRV9EUlZTOgotCQkJCS8qIFVoIG9oLi4gKi8KLQkJCQlkeCA9IDA7Ci0JCQkJZHkgPSAwOwotCQkJCWJyZWFrOwotCQl9Ci0JCUdTX3ZnYW1vdXNlY2FsbGJhY2soYnV0dG9uLCBkeCwgZHkpOwotCX0KLQlpZiAoIGkgPCBucmVhZCApIHsKLQkJU0RMX21lbWNweShtb3VzZWJ1ZiwgJm1vdXNlYnVmW2ldLCAobnJlYWQtaSkpOwotCQlzdGFydCA9IChucmVhZC1pKTsKLQl9IGVsc2UgewotCQlzdGFydCA9IDA7Ci0JfQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlX2tleWJvYXJkKF9USElTKQotewotCXVuc2lnbmVkIGNoYXIga2V5YnVmW0JVRlNJWl07Ci0JaW50IGksIG5yZWFkOwotCWludCBwcmVzc2VkOwotCWludCBzY2FuY29kZTsKLQlTRExfa2V5c3ltIGtleXN5bTsKLQotCW5yZWFkID0gcmVhZChrZXlib2FyZF9mZCwga2V5YnVmLCBCVUZTSVopOwotCWZvciAoIGk9MDsgaTxucmVhZDsgKytpICkgewotCQlzY2FuY29kZSA9IGtleWJ1ZltpXSAmIDB4N0Y7Ci0JCWlmICgga2V5YnVmW2ldICYgMHg4MCApIHsKLQkJCXByZXNzZWQgPSBTRExfUkVMRUFTRUQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcmVzc2VkID0gU0RMX1BSRVNTRUQ7Ci0JCX0KLQkJVHJhbnNsYXRlS2V5KHNjYW5jb2RlLCAma2V5c3ltKTsKLQkJcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQocHJlc3NlZCwgJmtleXN5bSk7Ci0JfQotfQotCi12b2lkIEdTX1B1bXBFdmVudHMoX1RISVMpCi17Ci0JZmRfc2V0IGZkc2V0OwotCWludCBtYXhfZmQ7Ci0Jc3RhdGljIHN0cnVjdCB0aW1ldmFsIHplcm87Ci0KLQlkbyB7Ci0JCXBvc3RlZCA9IDA7Ci0KLQkJRkRfWkVSTygmZmRzZXQpOwotCQltYXhfZmQgPSAwOwotCQlpZiAoIGtleWJvYXJkX2ZkID49IDAgKSB7Ci0JCQlGRF9TRVQoa2V5Ym9hcmRfZmQsICZmZHNldCk7Ci0JCQlpZiAoIG1heF9mZCA8IGtleWJvYXJkX2ZkICkgewotCQkJCW1heF9mZCA9IGtleWJvYXJkX2ZkOwotCQkJfQotCQl9Ci0JCWlmICggbW91c2VfZmQgPj0gMCApIHsKLQkJCUZEX1NFVChtb3VzZV9mZCwgJmZkc2V0KTsKLQkJCWlmICggbWF4X2ZkIDwgbW91c2VfZmQgKSB7Ci0JCQkJbWF4X2ZkID0gbW91c2VfZmQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKCBzZWxlY3QobWF4X2ZkKzEsICZmZHNldCwgTlVMTCwgTlVMTCwgJnplcm8pID4gMCApIHsKLQkJCWlmICgga2V5Ym9hcmRfZmQgPj0gMCApIHsKLQkJCQlpZiAoIEZEX0lTU0VUKGtleWJvYXJkX2ZkLCAmZmRzZXQpICkgewotCQkJCQloYW5kbGVfa2V5Ym9hcmQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCBtb3VzZV9mZCA+PSAwICkgewotCQkJCWlmICggRkRfSVNTRVQobW91c2VfZmQsICZmZHNldCkgKSB7Ci0JCQkJCWhhbmRsZV9tb3VzZSh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlICggcG9zdGVkICk7Ci19Ci0KLXZvaWQgR1NfSW5pdE9TS2V5bWFwKF9USElTKQotewotCWludCBpOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgTGludXgga2V5IHRyYW5zbGF0aW9uIHRhYmxlICovCi0KLQkvKiBGaXJzdCBnZXQgdGhlIGFzY2lpIGtleXMgYW5kIG90aGVycyBub3Qgd2VsbCBoYW5kbGVkICovCi0JZm9yIChpPTA7IGk8U0RMX2FycmF5c2l6ZShrZXltYXApOyArK2kpIHsKLQkgIHN3aXRjaChpKSB7Ci0JICAvKiBUaGVzZSBhcmVuJ3QgaGFuZGxlZCBieSB0aGUgeDg2IGtlcm5lbCBrZXltYXBwaW5nICg/KSAqLwotCSAgY2FzZSBTQ0FOQ09ERV9QUklOVFNDUkVFTjoKLQkgICAga2V5bWFwW2ldID0gU0RMS19QUklOVDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNDQU5DT0RFX0JSRUFLOgotCSAgICBrZXltYXBbaV0gPSBTRExLX0JSRUFLOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0NBTkNPREVfQlJFQUtfQUxURVJOQVRJVkU6Ci0JICAgIGtleW1hcFtpXSA9IFNETEtfUEFVU0U7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBTQ0FOQ09ERV9MRUZUU0hJRlQ6Ci0JICAgIGtleW1hcFtpXSA9IFNETEtfTFNISUZUOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0NBTkNPREVfUklHSFRTSElGVDoKLQkgICAga2V5bWFwW2ldID0gU0RMS19SU0hJRlQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBTQ0FOQ09ERV9MRUZUQ09OVFJPTDoKLQkgICAga2V5bWFwW2ldID0gU0RMS19MQ1RSTDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNDQU5DT0RFX1JJR0hUQ09OVFJPTDoKLQkgICAga2V5bWFwW2ldID0gU0RMS19SQ1RSTDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNDQU5DT0RFX1JJR0hUV0lOOgotCSAgICBrZXltYXBbaV0gPSBTRExLX1JTVVBFUjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNDQU5DT0RFX0xFRlRXSU46Ci0JICAgIGtleW1hcFtpXSA9IFNETEtfTFNVUEVSOwotCSAgICBicmVhazsKLQkgIGNhc2UgMTI3OgotCSAgICBrZXltYXBbaV0gPSBTRExLX01FTlU7Ci0JICAgIGJyZWFrOwotCSAgLyogdGhpcyBzaG91bGQgdGFrZSBjYXJlIG9mIGFsbCBzdGFuZGFyZCBhc2NpaSBrZXlzICovCi0JICBkZWZhdWx0OgotCSAgICBrZXltYXBbaV0gPSBLVkFMKHZnYV9rZXltYXBbMF1baV0pOwotCSAgICBicmVhazsKLSAgICAgICAgICB9Ci0JfQotCWZvciAoaT0wOyBpPFNETF9hcnJheXNpemUoa2V5bWFwKTsgKytpKSB7Ci0JICBzd2l0Y2goa2V5bWFwX3RlbXBbaV0pIHsKLQkgICAgY2FzZSBLX0YxOiAga2V5bWFwW2ldID0gU0RMS19GMTsgIGJyZWFrOwotCSAgICBjYXNlIEtfRjI6ICBrZXltYXBbaV0gPSBTRExLX0YyOyAgYnJlYWs7Ci0JICAgIGNhc2UgS19GMzogIGtleW1hcFtpXSA9IFNETEtfRjM7ICBicmVhazsKLQkgICAgY2FzZSBLX0Y0OiAga2V5bWFwW2ldID0gU0RMS19GNDsgIGJyZWFrOwotCSAgICBjYXNlIEtfRjU6ICBrZXltYXBbaV0gPSBTRExLX0Y1OyAgYnJlYWs7Ci0JICAgIGNhc2UgS19GNjogIGtleW1hcFtpXSA9IFNETEtfRjY7ICBicmVhazsKLQkgICAgY2FzZSBLX0Y3OiAga2V5bWFwW2ldID0gU0RMS19GNzsgIGJyZWFrOwotCSAgICBjYXNlIEtfRjg6ICBrZXltYXBbaV0gPSBTRExLX0Y4OyAgYnJlYWs7Ci0JICAgIGNhc2UgS19GOTogIGtleW1hcFtpXSA9IFNETEtfRjk7ICBicmVhazsKLQkgICAgY2FzZSBLX0YxMDoga2V5bWFwW2ldID0gU0RMS19GMTA7IGJyZWFrOwotCSAgICBjYXNlIEtfRjExOiBrZXltYXBbaV0gPSBTRExLX0YxMTsgYnJlYWs7Ci0JICAgIGNhc2UgS19GMTI6IGtleW1hcFtpXSA9IFNETEtfRjEyOyBicmVhazsKLQotCSAgICBjYXNlIEtfRE9XTjogIGtleW1hcFtpXSA9IFNETEtfRE9XTjsgIGJyZWFrOwotCSAgICBjYXNlIEtfTEVGVDogIGtleW1hcFtpXSA9IFNETEtfTEVGVDsgIGJyZWFrOwotCSAgICBjYXNlIEtfUklHSFQ6IGtleW1hcFtpXSA9IFNETEtfUklHSFQ7IGJyZWFrOwotCSAgICBjYXNlIEtfVVA6ICAgIGtleW1hcFtpXSA9IFNETEtfVVA7ICAgIGJyZWFrOwotCi0JICAgIGNhc2UgS19QMDogICAgIGtleW1hcFtpXSA9IFNETEtfS1AwOyBicmVhazsKLQkgICAgY2FzZSBLX1AxOiAgICAga2V5bWFwW2ldID0gU0RMS19LUDE7IGJyZWFrOwotCSAgICBjYXNlIEtfUDI6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQMjsgYnJlYWs7Ci0JICAgIGNhc2UgS19QMzogICAgIGtleW1hcFtpXSA9IFNETEtfS1AzOyBicmVhazsKLQkgICAgY2FzZSBLX1A0OiAgICAga2V5bWFwW2ldID0gU0RMS19LUDQ7IGJyZWFrOwotCSAgICBjYXNlIEtfUDU6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQNTsgYnJlYWs7Ci0JICAgIGNhc2UgS19QNjogICAgIGtleW1hcFtpXSA9IFNETEtfS1A2OyBicmVhazsKLQkgICAgY2FzZSBLX1A3OiAgICAga2V5bWFwW2ldID0gU0RMS19LUDc7IGJyZWFrOwotCSAgICBjYXNlIEtfUDg6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQODsgYnJlYWs7Ci0JICAgIGNhc2UgS19QOTogICAgIGtleW1hcFtpXSA9IFNETEtfS1A5OyBicmVhazsKLQkgICAgY2FzZSBLX1BQTFVTOiAga2V5bWFwW2ldID0gU0RMS19LUF9QTFVTOyBicmVhazsKLQkgICAgY2FzZSBLX1BNSU5VUzoga2V5bWFwW2ldID0gU0RMS19LUF9NSU5VUzsgYnJlYWs7Ci0JICAgIGNhc2UgS19QU1RBUjogIGtleW1hcFtpXSA9IFNETEtfS1BfTVVMVElQTFk7IGJyZWFrOwotCSAgICBjYXNlIEtfUFNMQVNIOiBrZXltYXBbaV0gPSBTRExLX0tQX0RJVklERTsgYnJlYWs7Ci0JICAgIGNhc2UgS19QRU5URVI6IGtleW1hcFtpXSA9IFNETEtfS1BfRU5URVI7IGJyZWFrOwotCSAgICBjYXNlIEtfUERPVDogICBrZXltYXBbaV0gPSBTRExLX0tQX1BFUklPRDsgYnJlYWs7Ci0KLQkgICAgY2FzZSBLX1NISUZUOiAgaWYgKCBrZXltYXBbaV0gIT0gU0RMS19SU0hJRlQgKQotCSAgICAgICAgICAgICAgICAgICAgIGtleW1hcFtpXSA9IFNETEtfTFNISUZUOwotCSAgICAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgY2FzZSBLX1NISUZUTDoga2V5bWFwW2ldID0gU0RMS19MU0hJRlQ7IGJyZWFrOwotCSAgICBjYXNlIEtfU0hJRlRSOiBrZXltYXBbaV0gPSBTRExLX1JTSElGVDsgYnJlYWs7Ci0JICAgIGNhc2UgS19DVFJMOiAgaWYgKCBrZXltYXBbaV0gIT0gU0RMS19SQ1RSTCApCi0JICAgICAgICAgICAgICAgICAgICAga2V5bWFwW2ldID0gU0RMS19MQ1RSTDsKLQkgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgS19DVFJMTDogIGtleW1hcFtpXSA9IFNETEtfTENUUkw7ICBicmVhazsKLQkgICAgY2FzZSBLX0NUUkxSOiAga2V5bWFwW2ldID0gU0RMS19SQ1RSTDsgIGJyZWFrOwotCSAgICBjYXNlIEtfQUxUOiAgICBrZXltYXBbaV0gPSBTRExLX0xBTFQ7ICAgYnJlYWs7Ci0JICAgIGNhc2UgS19BTFRHUjogIGtleW1hcFtpXSA9IFNETEtfUkFMVDsgICBicmVhazsKLQotCSAgICBjYXNlIEtfSU5TRVJUOiBrZXltYXBbaV0gPSBTRExLX0lOU0VSVDsgICBicmVhazsKLQkgICAgY2FzZSBLX1JFTU9WRToga2V5bWFwW2ldID0gU0RMS19ERUxFVEU7ICAgYnJlYWs7Ci0JICAgIGNhc2UgS19QR1VQOiAgIGtleW1hcFtpXSA9IFNETEtfUEFHRVVQOyAgIGJyZWFrOwotCSAgICBjYXNlIEtfUEdETjogICBrZXltYXBbaV0gPSBTRExLX1BBR0VET1dOOyBicmVhazsKLQkgICAgY2FzZSBLX0ZJTkQ6ICAga2V5bWFwW2ldID0gU0RMS19IT01FOyAgICAgYnJlYWs7Ci0JICAgIGNhc2UgS19TRUxFQ1Q6IGtleW1hcFtpXSA9IFNETEtfRU5EOyAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgS19OVU06ICBrZXltYXBbaV0gPSBTRExLX05VTUxPQ0s7ICAgYnJlYWs7Ci0JICAgIGNhc2UgS19DQVBTOiBrZXltYXBbaV0gPSBTRExLX0NBUFNMT0NLOyAgYnJlYWs7Ci0KLQkgICAgY2FzZSBLX0YxMzogICBrZXltYXBbaV0gPSBTRExLX1BSSU5UOyAgICAgYnJlYWs7Ci0JICAgIGNhc2UgS19IT0xEOiAga2V5bWFwW2ldID0gU0RMS19TQ1JPTExPQ0s7IGJyZWFrOwotCSAgICBjYXNlIEtfUEFVU0U6IGtleW1hcFtpXSA9IFNETEtfUEFVU0U7ICAgICBicmVhazsKLQotCSAgICBjYXNlIDEyNzoga2V5bWFwW2ldID0gU0RMS19CQUNLU1BBQ0U7IGJyZWFrOwotCSAgICAgCi0JICAgIGRlZmF1bHQ6IGJyZWFrOwotCSAgfQotCX0KLX0KLQotc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSkKLXsKLQkvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLwotCWtleXN5bS0+c2NhbmNvZGUgPSBzY2FuY29kZTsKLQlrZXlzeW0tPnN5bSA9IGtleW1hcFtzY2FuY29kZV07Ci0Ja2V5c3ltLT5tb2QgPSBLTU9EX05PTkU7Ci0KLQkvKiBJZiBVTklDT0RFIGlzIG9uLCBnZXQgdGhlIFVOSUNPREUgdmFsdWUgZm9yIHRoZSBrZXkgKi8KLQlrZXlzeW0tPnVuaWNvZGUgPSAwOwotCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSB7Ci0JCWludCBtYXA7Ci0JCVNETE1vZCBtb2RzdGF0ZTsKLQotCQltb2RzdGF0ZSA9IFNETF9HZXRNb2RTdGF0ZSgpOwotCQltYXAgPSAwOwotCQlpZiAoIG1vZHN0YXRlICYgS01PRF9TSElGVCApIHsKLQkJCW1hcCB8PSAoMTw8S0dfU0hJRlQpOwotCQl9Ci0JCWlmICggbW9kc3RhdGUgJiBLTU9EX0NUUkwgKSB7Ci0JCQltYXAgfD0gKDE8PEtHX0NUUkwpOwotCQl9Ci0JCWlmICggbW9kc3RhdGUgJiBLTU9EX0FMVCApIHsKLQkJCW1hcCB8PSAoMTw8S0dfQUxUKTsKLQkJfQotCQlpZiAoIG1vZHN0YXRlICYgS01PRF9NT0RFICkgewotCQkJbWFwIHw9ICgxPDxLR19BTFRHUik7Ci0JCX0KLQkJaWYgKCBLVFlQKHZnYV9rZXltYXBbbWFwXVtzY2FuY29kZV0pID09IEtUX0xFVFRFUiApIHsKLQkJCWlmICggbW9kc3RhdGUgJiBLTU9EX0NBUFMgKSB7Ci0JCQkJbWFwIF49ICgxPDxLR19TSElGVCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCBLVFlQKHZnYV9rZXltYXBbbWFwXVtzY2FuY29kZV0pID09IEtUX1BBRCApIHsKLQkJCWlmICggbW9kc3RhdGUgJiBLTU9EX05VTSApIHsKLQkJCQlrZXlzeW0tPnVuaWNvZGU9S1ZBTCh2Z2Ffa2V5bWFwW21hcF1bc2NhbmNvZGVdKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWtleXN5bS0+dW5pY29kZSA9IEtWQUwodmdhX2tleW1hcFttYXBdW3NjYW5jb2RlXSk7Ci0JCX0KLQl9Ci0JcmV0dXJuKGtleXN5bSk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc2V2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTI5NGEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3NldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfZ3N2aWRlby5oIgotCi0vKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfc3lzZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCi0gICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX3N5c3ZpZGVvLmMpCi0qLwotZXh0ZXJuIGludCBHU19PcGVuS2V5Ym9hcmQoX1RISVMpOwotZXh0ZXJuIHZvaWQgR1NfQ2xvc2VLZXlib2FyZChfVEhJUyk7Ci1leHRlcm4gaW50IEdTX09wZW5Nb3VzZShfVEhJUyk7Ci1leHRlcm4gdm9pZCBHU19DbG9zZU1vdXNlKF9USElTKTsKLWV4dGVybiBpbnQgR1NfRW50ZXJHcmFwaGljc01vZGUoX1RISVMpOwotZXh0ZXJuIGludCBHU19JbkdyYXBoaWNzTW9kZShfVEhJUyk7Ci1leHRlcm4gdm9pZCBHU19MZWF2ZUdyYXBoaWNzTW9kZShfVEhJUyk7Ci0KLWV4dGVybiB2b2lkIEdTX0luaXRPU0tleW1hcChfVEhJUyk7Ci1leHRlcm4gdm9pZCBHU19QdW1wRXZlbnRzKF9USElTKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzbW91c2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkYTE3OS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc21vdXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKLSNpbmNsdWRlICJTRExfZ3N2aWRlby5oIgotI2luY2x1ZGUgIlNETF9nc21vdXNlX2MuaCIKLQotCi0vKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KLXN0cnVjdCBXTWN1cnNvciB7Ci0JaW50IHVudXNlZDsKLX07Ci0KLS8qIFRoZXJlIGlzbid0IGFueSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSAqLwotdm9pZCBHU19GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCi17Ci0JcmV0dXJuOwotfQotCi0vKiBUaGVyZSBpc24ndCBhbnkgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgKi8KLVdNY3Vyc29yICpHU19DcmVhdGVXTUN1cnNvcihfVEhJUywKLQkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KQotewotCXJldHVybigoV01jdXJzb3IgKikweDAxKTsKLX0KLQotc3RhdGljIHZvaWQgR1NfTW92ZUN1cnNvcihfVEhJUywgU0RMX0N1cnNvciAqY3Vyc29yLCBpbnQgeCwgaW50IHkpCi17Ci0JU0RMX1N1cmZhY2UgKnNjcmVlbjsKLQlzdHJ1Y3QgcHMyX2ltYWdlIGltYWdlOwotCVNETF9SZWN0IGFyZWE7Ci0JaW50IG1vdXNlX3kxLCBtb3VzZV95MjsKLQl2b2lkICpzYXZlZF9waXhlbHM7Ci0JaW50IHNjcmVlbl91cGRhdGVkOwotCi0JLyogTG9jayBzbyB3ZSBkb24ndCBpbnRlcnJ1cHQgYW4gdXBkYXRlIHdpdGggbW91c2UgbW90aW9uICovCi0JU0RMX0xvY2tDdXJzb3IoKTsKLQotCS8qIE1ha2Ugc3VyZSBhbnkgcGVuZGluZyBETUEgaGFzIGNvbXBsZXRlZCAqLwotCWlmICggZG1hX3BlbmRpbmcgKSB7Ci0JCWlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19TRU5EUUNULCAxKTsKLQkJZG1hX3BlbmRpbmcgPSAwOwotCX0KLQotCS8qIFJlbW92ZSB0aGUgY3Vyc29yIGltYWdlIGZyb20gdGhlIERNQSBhcmVhICovCi0Jc2NyZWVuID0gdGhpcy0+c2NyZWVuOwotCXNhdmVkX3BpeGVscyA9IHNjcmVlbi0+cGl4ZWxzOwotCXNjcmVlbi0+cGl4ZWxzID0gbWFwcGVkX21lbSArIHNjcmVlbi0+b2Zmc2V0OwotCXNjcmVlbl91cGRhdGVkID0gMDsKLQlpZiAoIGN1cnNvcl9kcmF3biApIHsKLQkJU0RMX0VyYXNlQ3Vyc29yTm9Mb2NrKHNjcmVlbik7Ci0JCWN1cnNvcl9kcmF3biA9IDA7Ci0JCXNjcmVlbl91cGRhdGVkID0gMTsKLQl9Ci0KLQkvKiBTYXZlIHRoZSBjdXJyZW50IG1vdXNlIGFyZWEgKi8KLQlTRExfTW91c2VSZWN0KCZhcmVhKTsKLQltb3VzZV95MSA9IGFyZWEueTsKLQltb3VzZV95MiA9IGFyZWEueSthcmVhLmg7Ci0KLQkvKiBPbmx5IGRyYXcgdGhlIG5ldyBjdXJzb3IgaWYgdGhlcmUgd2FzIG9uZSBwYXNzZWQgaW4gKi8KLQlpZiAoIGN1cnNvciApIHsKLQkJLyogU2V0IHRoZSBuZXcgbG9jYXRpb24gKi8KLQkJY3Vyc29yLT5hcmVhLnggPSAoeCAtIGN1cnNvci0+aG90X3gpOwotCQljdXJzb3ItPmFyZWEueSA9ICh5IC0gY3Vyc29yLT5ob3RfeSk7Ci0KLQkJLyogRHJhdyB0aGUgY3Vyc29yIGF0IHRoZSBuZXcgbG9jYXRpb24gKi8KLQkJaWYgKCAoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICYmIHNjcmVlbi0+cGl4ZWxzICkgewotCQkJU0RMX0RyYXdDdXJzb3JOb0xvY2soc2NyZWVuKTsKLQkJCWN1cnNvcl9kcmF3biA9IDE7Ci0JCQlzY3JlZW5fdXBkYXRlZCA9IDE7Ci0JCX0KLQl9Ci0Jc2NyZWVuLT5waXhlbHMgPSBzYXZlZF9waXhlbHM7Ci0KLQkvKiBVcGRhdGUgdGhlIGFmZmVjdGVkIGFyZWEgb2YgdGhlIHNjcmVlbiAqLwotCWlmICggc2NyZWVuX3VwZGF0ZWQgKSB7Ci0JCVNETF9Nb3VzZVJlY3QoJmFyZWEpOwotCQlpZiAoIGFyZWEueSA8IG1vdXNlX3kxICkgewotCQkJbW91c2VfeTEgPSBhcmVhLnk7Ci0JCX0KLQkJaWYgKCAoYXJlYS55K2FyZWEuaCkgPiBtb3VzZV95MiApIHsKLQkJCW1vdXNlX3kyID0gYXJlYS55K2FyZWEuaDsKLQkJfQotCQlpbWFnZSA9IHNjcmVlbl9pbWFnZTsKLQkJaW1hZ2UueSArPSBzY3JlZW4tPm9mZnNldCAvIHNjcmVlbi0+cGl0Y2ggKyBtb3VzZV95MTsKLQkJaW1hZ2UuaCA9IG1vdXNlX3kyIC0gbW91c2VfeTE7Ci0JCWltYWdlLnB0ciA9IG1hcHBlZF9tZW0gKwotCQkgICAgICAgICAgICAoaW1hZ2UueSAtIHNjcmVlbl9pbWFnZS55KSAqIHNjcmVlbi0+cGl0Y2g7Ci0JCWlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19MT0FESU1BR0UsICZpbWFnZSk7Ci0KLQkJLyogTmVlZCB0byBzY2FsZSBvZmZzY3JlZW4gaW1hZ2UgdG8gVFYgb3V0cHV0ICovCi0JCWlmICggaW1hZ2UueSA+IDAgKSB7Ci0JCQlzY2FsZWltYWdlX25vbmJsb2NrKGNvbnNvbGVfZmQsCi0JCQkgICAgICAgICAgICAgICAgICAgIHRleF90YWdzX21lbSwgc2NhbGVfdGFnc19tZW0pOwotCQl9Ci0JfQotCi0JLyogV2UncmUgZmluaXNoZWQgKi8KLQlTRExfVW5sb2NrQ3Vyc29yKCk7Ci19Ci0KLXZvaWQgR1NfTW92ZVdNQ3Vyc29yKF9USElTLCBpbnQgeCwgaW50IHkpCi17Ci0JR1NfTW92ZUN1cnNvcih0aGlzLCBTRExfY3Vyc29yLCB4LCB5KTsKLX0KLQotaW50IEdTX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKndtY3Vyc29yKQotewotCVNETF9DdXJzb3IgKmN1cnNvcjsKLQlpbnQgeCwgeTsKLQotCS8qIERyYXcgdGhlIGN1cnNvciBhdCB0aGUgYXBwcm9wcmlhdGUgbG9jYXRpb24gKi8KLQlTRExfR2V0TW91c2VTdGF0ZSgmeCwgJnkpOwotCWlmICggd21jdXJzb3IgKSB7Ci0JCWN1cnNvciA9IFNETF9jdXJzb3I7Ci0JfSBlbHNlIHsKLQkJY3Vyc29yID0gTlVMTDsKLQl9Ci0JR1NfTW92ZUN1cnNvcih0aGlzLCBjdXJzb3IsIHgsIHkpOwotCXJldHVybigxKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3Ntb3VzZV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjE2YTQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3Ntb3VzZV9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9nc3ZpZGVvLmgiCi0KLS8qIFRoaXMgaXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY3Vyc29yIHNwcml0ZSAqLwotI2RlZmluZSBDVVJTT1JfVwkzMgotI2RlZmluZSBDVVJTT1JfSAkzMgotI2RlZmluZSBDVVJTT1JfV19QT1cJNQkvKiAzMiA9IDJeNSAqLwotI2RlZmluZSBDVVJTT1JfSF9QT1cJNQkvKiAzMiA9IDJeNSAqLwotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KLWV4dGVybiB2b2lkIEdTX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7Ci1leHRlcm4gV01jdXJzb3IgKkdTX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAotCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOwotZXh0ZXJuIHZvaWQgR1NfTW92ZVdNQ3Vyc29yKF9USElTLCBpbnQgeCwgaW50IHkpOwotZXh0ZXJuIGludCBHU19TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3N2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3N2aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzhiMzJhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDY4OSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogRnJhbWVidWZmZXIgY29uc29sZSBiYXNlZCBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKLSNpbmNsdWRlICJTRExfZ3N2aWRlby5oIgotI2luY2x1ZGUgIlNETF9nc21vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfZ3NldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9nc3l1dl9jLmgiCi0KLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IEdTX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKLXN0YXRpYyBTRExfUmVjdCAqKkdTX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgU0RMX1N1cmZhY2UgKkdTX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgR1NfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyB2b2lkIEdTX1ZpZGVvUXVpdChfVEhJUyk7Ci0KLS8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IEdTX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IEdTX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIEdTX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgR1NfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0vKiBHUyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IEdTX0F2YWlsYWJsZSh2b2lkKQotewotCWludCBjb25zb2xlLCBtZW1vcnk7Ci0KLQljb25zb2xlID0gb3BlbihQUzJfREVWX0dTLCBPX1JEV1IsIDApOwotCWlmICggY29uc29sZSA+PSAwICkgewotCQljbG9zZShjb25zb2xlKTsKLQl9Ci0JbWVtb3J5ID0gb3BlbihQUzJfREVWX01FTSwgT19SRFdSLCAwKTsKLQlpZiAoIG1lbW9yeSA+PSAwICkgewotCQljbG9zZShtZW1vcnkpOwotCX0KLQlyZXR1cm4oKGNvbnNvbGUgPj0gMCkgJiYgKG1lbW9yeSA+PSAwKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdTX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKLXsKLQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0JU0RMX2ZyZWUoZGV2aWNlKTsKLX0KLQotc3RhdGljIFNETF9WaWRlb0RldmljZSAqR1NfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXM7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCXRoaXMgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7Ci0JaWYgKCB0aGlzICkgewotCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKLQkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7Ci0JfQotCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWlmICggdGhpcyApIHsKLQkJCVNETF9mcmVlKHRoaXMpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOwotCW1vdXNlX2ZkID0gLTE7Ci0Ja2V5Ym9hcmRfZmQgPSAtMTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQl0aGlzLT5WaWRlb0luaXQgPSBHU19WaWRlb0luaXQ7Ci0JdGhpcy0+TGlzdE1vZGVzID0gR1NfTGlzdE1vZGVzOwotCXRoaXMtPlNldFZpZGVvTW9kZSA9IEdTX1NldFZpZGVvTW9kZTsKLQl0aGlzLT5DcmVhdGVZVVZPdmVybGF5ID0gR1NfQ3JlYXRlWVVWT3ZlcmxheTsKLQl0aGlzLT5TZXRDb2xvcnMgPSBHU19TZXRDb2xvcnM7Ci0JdGhpcy0+VXBkYXRlUmVjdHMgPSBOVUxMOwotCXRoaXMtPlZpZGVvUXVpdCA9IEdTX1ZpZGVvUXVpdDsKLQl0aGlzLT5BbGxvY0hXU3VyZmFjZSA9IEdTX0FsbG9jSFdTdXJmYWNlOwotCXRoaXMtPkNoZWNrSFdCbGl0ID0gTlVMTDsKLQl0aGlzLT5GaWxsSFdSZWN0ID0gTlVMTDsKLQl0aGlzLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKLQl0aGlzLT5TZXRIV0FscGhhID0gTlVMTDsKLQl0aGlzLT5Mb2NrSFdTdXJmYWNlID0gR1NfTG9ja0hXU3VyZmFjZTsKLQl0aGlzLT5VbmxvY2tIV1N1cmZhY2UgPSBHU19VbmxvY2tIV1N1cmZhY2U7Ci0JdGhpcy0+RmxpcEhXU3VyZmFjZSA9IE5VTEw7Ci0JdGhpcy0+RnJlZUhXU3VyZmFjZSA9IEdTX0ZyZWVIV1N1cmZhY2U7Ci0JdGhpcy0+U2V0SWNvbiA9IE5VTEw7Ci0JdGhpcy0+U2V0Q2FwdGlvbiA9IE5VTEw7Ci0JdGhpcy0+R2V0V01JbmZvID0gTlVMTDsKLQl0aGlzLT5GcmVlV01DdXJzb3IgPSBHU19GcmVlV01DdXJzb3I7Ci0JdGhpcy0+Q3JlYXRlV01DdXJzb3IgPSBHU19DcmVhdGVXTUN1cnNvcjsKLQl0aGlzLT5TaG93V01DdXJzb3IgPSBHU19TaG93V01DdXJzb3I7Ci0JdGhpcy0+TW92ZVdNQ3Vyc29yID0gR1NfTW92ZVdNQ3Vyc29yOwotCXRoaXMtPkluaXRPU0tleW1hcCA9IEdTX0luaXRPU0tleW1hcDsKLQl0aGlzLT5QdW1wRXZlbnRzID0gR1NfUHVtcEV2ZW50czsKLQotCXRoaXMtPmZyZWUgPSBHU19EZWxldGVEZXZpY2U7Ci0KLQlyZXR1cm4gdGhpczsKLX0KLQotVmlkZW9Cb290U3RyYXAgUFMyR1NfYm9vdHN0cmFwID0gewotCSJwczJncyIsICJQbGF5U3RhdGlvbiAyIEdyYXBoaWNzIFN5bnRoZXNpemVyIiwKLQlHU19BdmFpbGFibGUsIEdTX0NyZWF0ZURldmljZQotfTsKLQotLyogVGhlc2UgYXJlIHRoZSBwaXhlbCBmb3JtYXRzIGZvciB0aGUgMzIsIDI0LCBhbmQgMTYgYml0IHZpZGVvIG1vZGVzICovCi1zdGF0aWMgc3RydWN0IHsKLQlpbnQgYnBwOwotCVVpbnQzMiByOwotCVVpbnQzMiBnOwotCVVpbnQzMiBiOwotfSBHU19waXhlbG1hc2tzW10gPSB7Ci0JeyAzMiwgMHgwMDAwMDBGRiwJLyogUkdCIGxpdHRsZS1lbmRpYW4gKi8KLQkgICAgICAweDAwMDBGRjAwLAotCSAgICAgIDB4MDBGRjAwMDAgfSwKLQl7IDI0LCAweDAwMDAwMEZGLAkvKiBSR0IgbGl0dGxlLWVuZGlhbiAqLwotCSAgICAgIDB4MDAwMEZGMDAsCi0JICAgICAgMHgwMEZGMDAwMCB9LAotCXsgMTYsIDB4MDAwMDAwMWYsCS8qIFJHQiBsaXR0bGUtZW5kaWFuICovCi0JICAgICAgMHgwMDAwMDNlMCwKLQkgICAgICAweDAwMDA3YzAwIH0sCi19OwotLyogVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSBTREwgYnl0ZXMtcGVyLXBpeGVsIHRvIEdTIHBpeGVsIGZvcm1hdCAqLwotc3RhdGljIGludCBHU19mb3JtYXRtYXBbXSA9IHsKLQktMSwJCS8qIDAgYnBwLCBub3QgYSBsZWdhbCB2YWx1ZSAqLwotCS0xLAkJLyogOCBicHAsIG5vdCBzdXBwb3J0ZWQgKHlldD8pICovCi0JUFMyX0dTX1BTTUNUMTYsCS8qIDE2IGJwcCAqLwotCVBTMl9HU19QU01DVDI0LAkvKiAyNCBicHAgKi8KLQlQUzJfR1NfUFNNQ1QzMgkvKiAzMiBicHAgKi8KLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgaGVhZF90YWdzW10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKSA9IHsKLQk0IHwgKDFMTCA8PCA2MCksCS8qIEdJRnRhZyAqLwotCTB4MGUsCQkJLyogQStEICovCi0JMCwJCQkvKiAyICovCi0JUFMyX0dTX0JJVEJMVEJVRiwKLQkwLAkJCS8qIDQgKi8KLQlQUzJfR1NfVFJYUE9TLAotCTAsCQkJLyogNiAqLwotCVBTMl9HU19UUlhSRUcsCi0JMCwJCQkvKiA4ICovCi0JUFMyX0dTX1RSWERJUgotfTsKLQotI2RlZmluZSBNQVhJTUcJCSgzMjc2NyAqIDE2KQotI2RlZmluZSBNQVhUQUdTCQk4Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGxvYWRpbWFnZV9ub25ibG9jayhpbnQgZmQsIHN0cnVjdCBwczJfaW1hZ2UgKmltYWdlLCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKmhtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqaW0pCi17Ci0Jc3RydWN0IHBzMl9wbGlzdCBwbGlzdDsKLQlzdHJ1Y3QgcHMyX3BhY2tldCBwYWNrZXRbMSArIE1BWFRBR1MgKiAyXTsKLQlpbnQgaXNpemU7Ci0JaW50IHBudW0sIGl0LCBlb3A7Ci0JY2hhciAqZGF0YTsKLQotCS8qIGluaXRpYWxpemUgdGhlIHZhcmlhYmxlcyAqLwotCWRhdGEgPSAoY2hhciAqKWltYWdlLT5wdHI7Ci0JcG51bSA9IGl0ID0gZW9wID0gMDsKLQlwbGlzdC5wYWNrZXQgPSBwYWNrZXQ7Ci0KLQkvKiBtYWtlIEJJVEJMVCBwYWNrZXQgKi8KLQlwYWNrZXRbcG51bV0ucHRyID0gaG07Ci0JcGFja2V0W3BudW1dLmxlbiA9IHNpemVvZihoZWFkX3RhZ3MpOwotCXBudW0rKzsKLQlobVsyXSA9ICgodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT5mYnAgPDwgMzIpIHwKLQkgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT5mYncgPDwgNDgpIHwKLQkgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT5wc20gPDwgNTYpOwotCWhtWzRdID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpaW1hZ2UtPnggPDwgMzIpIHwKLQkgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT55IDw8IDQ4KTsKLQlobVs2XSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpaW1hZ2UtPncgfAotCSAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpaW1hZ2UtPmggPDwgMzIpOwotCi0JLyogbWFrZSBpbWFnZSBtb2RlIHRhZ3MgKi8KLQl3aGlsZSAoIWVvcCkgewotCQlpc2l6ZSA9IHNpemUgPiBNQVhJTUcgPyBNQVhJTUcgOiBzaXplOwotCQlzaXplIC09IGlzaXplOwotCQllb3AgPSAoc2l6ZSA9PSAwKTsKLQotCQlwYWNrZXRbcG51bV0ucHRyID0gJmltW2l0XTsKLQkJcGFja2V0W3BudW1dLmxlbiA9IHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpICogMjsKLQkJcG51bSsrOwotCQlpbVtpdCsrXSA9IChpc2l6ZSA+PiA0KSB8IChlb3AgPyAoMSA8PCAxNSkgOiAwKSB8ICgyTEwgPDwgNTgpOwotCQlpbVtpdCsrXSA9IDA7Ci0KLQkJcGFja2V0W3BudW1dLnB0ciA9ICh2b2lkICopZGF0YTsKLQkJcGFja2V0W3BudW1dLmxlbiA9IGlzaXplOwotCQlwbnVtKys7Ci0JCWRhdGEgKz0gaXNpemU7Ci0JfQotCXBsaXN0Lm51bSA9IHBudW07Ci0KLQlyZXR1cm4gaW9jdGwoZmQsIFBTMklPQ19TRU5ETCwgJnBsaXN0KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZXhfdGFnc1tdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgPSB7Ci0JMyB8ICgxTEwgPDwgNjApLAkvKiBHSUZ0YWcgKi8KLQkweDBlLAkJCS8qIEErRCAqLwotCTAsCQkJLyogMiAqLwotCVBTMl9HU19URVgwXzEsCi0JKDEgPDwgNSkgKyAoMSA8PCA2KSwKLQlQUzJfR1NfVEVYMV8xLAotCTAsCi0JUFMyX0dTX1RFWEZMVVNICi19Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2FsZV90YWdzW10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKSA9IHsKLQk1IHwgKDFMTCA8PCA2MCksCS8qIEdJRnRhZyAqLwotCTB4MGUsCQkJLyogQStEICovCi0JNiArICgxIDw8IDQpICsgKDEgPDwgOCksCi0JUFMyX0dTX1BSSU0sCi0JKCh1bnNpZ25lZCBsb25nIGxvbmcpMCAqIDE2KSArICgoKHVuc2lnbmVkIGxvbmcgbG9uZykwICogMTYpIDw8IDE2KSwKLQlQUzJfR1NfVVYsCi0JKCh1bnNpZ25lZCBsb25nIGxvbmcpMCAqIDE2KSArICgoKHVuc2lnbmVkIGxvbmcgbG9uZykwICogMTYpIDw8IDE2KSwKLQlQUzJfR1NfWFlaMiwKLQkwLAkJCS8qIDggKi8KLQlQUzJfR1NfVVYsCi0JMCwJCQkvKiAxMCAqLwotCVBTMl9HU19YWVoyCi19OwotCi0KLWludCBzY2FsZWltYWdlX25vbmJsb2NrKGludCBmZCwgdW5zaWduZWQgbG9uZyBsb25nICp0bSwgdW5zaWduZWQgbG9uZyBsb25nICpzbSkKLXsKLQlzdHJ1Y3QgcHMyX3BsaXN0IHBsaXN0OwotCXN0cnVjdCBwczJfcGFja2V0IHBhY2tldFsyXTsKLQotCS8qIGluaXRpYWxpemUgdGhlIHZhcmlhYmxlcyAqLwotCXBsaXN0Lm51bSA9IDI7Ci0JcGxpc3QucGFja2V0ID0gcGFja2V0OwotCi0JcGFja2V0WzBdLnB0ciA9IHRtOwotCXBhY2tldFswXS5sZW4gPSBzaXplb2YodGV4X3RhZ3MpOwotCXBhY2tldFsxXS5wdHIgPSBzbTsKLQlwYWNrZXRbMV0ubGVuID0gc2l6ZW9mKHNjYWxlX3RhZ3MpOwotCi0JcmV0dXJuIGlvY3RsKGZkLCBQUzJJT0NfU0VOREwsICZwbGlzdCk7Ci19Ci0KLXN0YXRpYyBpbnQgcG93ZXJfb2ZfMihpbnQgdmFsdWUpCi17Ci0JaW50IHNoaWZ0OwotCi0JZm9yICggc2hpZnQgPSAwOyAoMTw8c2hpZnQpIDwgdmFsdWU7ICsrc2hpZnQgKSB7Ci0JCS8qIEtlZXAgbG9va2luZyAqLyA7Ci0JfQotCXJldHVybihzaGlmdCk7Ci19Ci0KLXN0YXRpYyBpbnQgR1NfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCi17Ci0Jc3RydWN0IHBzMl9zY3JlZW5pbmZvIHZpbmZvOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSAqLwotCWNvbnNvbGVfZmQgPSBvcGVuKFBTMl9ERVZfR1MsIE9fUkRXUiwgMCk7Ci0JaWYgKCBjb25zb2xlX2ZkIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gb3BlbiAlcyIsIFBTMl9ERVZfR1MpOwotCQlyZXR1cm4oLTEpOwotCX0KLQltZW1vcnlfZmQgPSBvcGVuKFBTMl9ERVZfTUVNLCBPX1JEV1IsIDApOwotCWlmICggbWVtb3J5X2ZkIDwgMCApIHsKLQkJY2xvc2UoY29uc29sZV9mZCk7Ci0JCWNvbnNvbGVfZmQgPSAtMTsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gb3BlbiAlcyIsIFBTMl9ERVZfTUVNKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19HU0NSRUVOSU5GTywgJnZpbmZvKSA8IDAgKSB7Ci0JCWNsb3NlKG1lbW9yeV9mZCk7Ci0JCWNsb3NlKGNvbnNvbGVfZmQpOwotCQljb25zb2xlX2ZkID0gLTE7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IGNvbnNvbGUgcGl4ZWwgZm9ybWF0Iik7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCi0JdGhpcy0+aW5mby5jdXJyZW50X3cgPSB2aW5mby53OwotCXRoaXMtPmluZm8uY3VycmVudF9oID0gdmluZm8uaDsKLQotCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gZGVwdGggKi8KLQlzd2l0Y2ggKHZpbmZvLnBzbSkgewotCSAgICAvKiBTdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0cyAqLwotCSAgICBjYXNlIFBTMl9HU19QU01DVDMyOgotCSAgICBjYXNlIFBTMl9HU19QU01DVDI0OgotCSAgICBjYXNlIFBTMl9HU19QU01DVDE2OgotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJR1NfVmlkZW9RdWl0KHRoaXMpOwotCQlTRExfU2V0RXJyb3IoIlVua25vd24gY29uc29sZSBwaXhlbCBmb3JtYXQ6ICVkIiwgdmluZm8ucHNtKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLmJwcDsKLQl2Zm9ybWF0LT5SbWFzayA9IEdTX3BpeGVsbWFza3NbdmluZm8ucHNtXS5yOwotCXZmb3JtYXQtPkdtYXNrID0gR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLmc7Ci0JdmZvcm1hdC0+Qm1hc2sgPSBHU19waXhlbG1hc2tzW3ZpbmZvLnBzbV0uYjsKLQlzYXZlZF92aW5mbyA9IHZpbmZvOwotCi0JLyogRW5hYmxlIG1vdXNlIGFuZCBrZXlib2FyZCBzdXBwb3J0ICovCi0JaWYgKCBHU19PcGVuS2V5Ym9hcmQodGhpcykgPCAwICkgewotCQlHU19WaWRlb1F1aXQodGhpcyk7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4ga2V5Ym9hcmQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JaWYgKCBHU19PcGVuTW91c2UodGhpcykgPCAwICkgewotCQljb25zdCBjaGFyICpzZGxfbm9tb3VzZTsKLQotCQlzZGxfbm9tb3VzZSA9IFNETF9nZXRlbnYoIlNETF9OT01PVVNFIik7Ci0JCWlmICggISBzZGxfbm9tb3VzZSApIHsKLQkJCUdTX1ZpZGVvUXVpdCh0aGlzKTsKLQkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gbW91c2UiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9Ci0KLQkvKiBXZSdyZSBkb25lISAqLwotCXJldHVybigwKTsKLX0KLQotc3RhdGljIFNETF9SZWN0ICoqR1NfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQotewotCXN0YXRpYyBTRExfUmVjdCBHU192ZXNhX21vZGVfbGlzdFtdID0gewotCQl7IDAsIDAsIDEyODAsIDEwMjQgfSwKLQkJeyAwLCAwLCAxMDI0LCA3NjggfSwKLQkJeyAwLCAwLCA4MDAsIDYwMCB9LAotCQl7IDAsIDAsIDY0MCwgNDgwIH0KLQl9OwotCXN0YXRpYyBTRExfUmVjdCAqR1NfdmVzYV9tb2Rlc1tdID0gewotCQkmR1NfdmVzYV9tb2RlX2xpc3RbMF0sCi0JCSZHU192ZXNhX21vZGVfbGlzdFsxXSwKLQkJJkdTX3Zlc2FfbW9kZV9saXN0WzJdLAotCQkmR1NfdmVzYV9tb2RlX2xpc3RbM10sCi0JCU5VTEwKLQl9OwotCXN0YXRpYyBTRExfUmVjdCBHU190dm91dF9zdHJldGNoOwotCXN0YXRpYyBTRExfUmVjdCBHU190dm91dF9tb2RlOwotCXN0YXRpYyBTRExfUmVjdCAqR1NfdHZvdXRfbW9kZXNbM107Ci0JU0RMX1JlY3QgKiptb2RlcyA9IE5VTEw7Ci0KLQlzd2l0Y2ggKGZvcm1hdC0+Qml0c1BlclBpeGVsKSB7Ci0JICAgIGNhc2UgMTY6Ci0JICAgIGNhc2UgMjQ6Ci0JICAgIGNhc2UgMzI6Ci0JCWlmICggc2F2ZWRfdmluZm8ubW9kZSA9PSBQUzJfR1NfVkVTQSApIHsKLQkJCW1vZGVzID0gR1NfdmVzYV9tb2RlczsKLQkJfSBlbHNlIHsKLQkJCWludCBpLCBqID0gMDsKLQotLy8gRklYTUUgLSB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGUgc3RyZXRjaCBjb2RlIGF0IDE2IGJwcD8KLWlmICggZm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gMzIgKSBicmVhazsKLQkJCS8qIEFkZCBhIG1vZGUgdGhhdCB3ZSBjb3VsZCBwb3NzaWJseSBzdHJldGNoIHRvICovCi0JCQlmb3IgKCBpPTA7IEdTX3Zlc2FfbW9kZXNbaV07ICsraSApIHsKLQkJCQlpZiAoIChHU192ZXNhX21vZGVzW2ldLT53ID09IHNhdmVkX3ZpbmZvLncpICYmCi0JCQkJICAgICAoR1NfdmVzYV9tb2Rlc1tpXS0+aCAhPSBzYXZlZF92aW5mby5oKSApIHsKLQkJCQkJR1NfdHZvdXRfc3RyZXRjaC53PUdTX3Zlc2FfbW9kZXNbaV0tPnc7Ci0JCQkJCUdTX3R2b3V0X3N0cmV0Y2guaD1HU192ZXNhX21vZGVzW2ldLT5oOwotCQkJCQlHU190dm91dF9tb2Rlc1tqKytdID0gJkdTX3R2b3V0X3N0cmV0Y2g7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8qIEFkZCB0aGUgY3VycmVudCBUViB2aWRlbyBtb2RlICovCi0JCQlHU190dm91dF9tb2RlLncgPSBzYXZlZF92aW5mby53OwotCQkJR1NfdHZvdXRfbW9kZS5oID0gc2F2ZWRfdmluZm8uaDsKLQkJCUdTX3R2b3V0X21vZGVzW2orK10gPSAmR1NfdHZvdXRfbW9kZTsKLQkJCUdTX3R2b3V0X21vZGVzW2orK10gPSBOVUxMOwotCi0JCQkvKiBSZXR1cm4gdGhlIGNyZWF0ZWQgbGlzdCBvZiBtb2RlcyAqLwotCQkJbW9kZXMgPSBHU190dm91dF9tb2RlczsKLQkJfQotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybihtb2Rlcyk7Ci19Ci0KLS8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCi1zdGF0aWMgdm9pZCBHU19ETUFGdWxsVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci0KLXN0YXRpYyBTRExfU3VyZmFjZSAqR1NfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLQlzdHJ1Y3QgcHMyX3NjcmVlbmluZm8gdmluZm87Ci0KLQkvKiBTZXQgdGhlIHRlcm1pbmFsIGludG8gZ3JhcGhpY3MgbW9kZSAqLwotCWlmICggR1NfRW50ZXJHcmFwaGljc01vZGUodGhpcykgPCAwICkgewotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogU2V0IHRoZSB2aWRlbyBtb2RlIGFuZCBnZXQgdGhlIGZpbmFsIHNjcmVlbiBmb3JtYXQgKi8KLQlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19HU0NSRUVOSU5GTywgJnZpbmZvKSA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IGNvbnNvbGUgc2NyZWVuIGluZm8iKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlpZiAoICh2aW5mby53ICE9IHdpZHRoKSB8fCAodmluZm8uaCAhPSBoZWlnaHQpIHx8Ci0JICAgICAoR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLmJwcCAhPSBicHApICkgewotCQkvKiBJZiB3ZSdyZSBub3QgaW4gVkVTQSBtb2RlLCB3ZSBoYXZlIHRvIHNjYWxlIHJlc29sdXRpb24gKi8KLQkJaWYgKCBzYXZlZF92aW5mby5tb2RlID09IFBTMl9HU19WRVNBICkgewotCQkJc3dpdGNoICh3aWR0aCkgewotCQkJICAgIGNhc2UgNjQwOgotCQkJCXZpbmZvLnJlcyA9IFBTMl9HU182NDB4NDgwOwotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgODAwOgotCQkJCXZpbmZvLnJlcyA9IFBTMl9HU184MDB4NjAwOwotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgMTAyNDoKLQkJCQl2aW5mby5yZXMgPSBQUzJfR1NfMTAyNHg3Njg7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgY2FzZSAxMjgwOgotCQkJCXZpbmZvLnJlcyA9IFBTMl9HU18xMjgweDEwMjQ7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIHJlc29sdXRpb246ICVkeCVkXG4iLAotCQkJCQkgICAgIHdpZHRoLCBoZWlnaHQpOwotCQkJCXJldHVybihOVUxMKTsKLQkJCX0KLQkJCXZpbmZvLnJlcyB8PSAoUFMyX0dTXzc1SHogPDwgOCk7Ci0JCQl2aW5mby53ID0gd2lkdGg7Ci0JCQl2aW5mby5oID0gaGVpZ2h0OwotCQl9Ci0JCXZpbmZvLmZicCA9IDA7Ci0JCXZpbmZvLnBzbSA9IEdTX2Zvcm1hdG1hcFticHAvOF07Ci0JCWlmICggdmluZm8ucHNtIDwgMCApIHsKLQkJCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgZGVwdGg6ICVkIGJwcFxuIiwgYnBwKTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCQlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19TU0NSRUVOSU5GTywgJnZpbmZvKSA8IDAgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBjb25zb2xlIHNjcmVlbiBpbmZvIik7Ci0JCQlyZXR1cm4oTlVMTCk7Ci0JCX0KLQotCQkvKiBVbm1hcCB0aGUgcHJldmlvdXMgRE1BIGJ1ZmZlciAqLwotCQlpZiAoIG1hcHBlZF9tZW0gKSB7Ci0JCQltdW5tYXAobWFwcGVkX21lbSwgbWFwcGVkX2xlbik7Ci0JCQltYXBwZWRfbWVtID0gTlVMTDsKLQkJfQotCX0KLQlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLmJwcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLnIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTX3BpeGVsbWFza3NbdmluZm8ucHNtXS5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU19waXhlbG1hc2tzW3ZpbmZvLnBzbV0uYiwgMCkgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCi0JY3VycmVudC0+ZmxhZ3MgPSBTRExfRlVMTFNDUkVFTjsKLQljdXJyZW50LT53ID0gd2lkdGg7Ci0JY3VycmVudC0+aCA9IGhlaWdodDsKLQljdXJyZW50LT5waXRjaCA9IFNETF9DYWxjdWxhdGVQaXRjaChjdXJyZW50KTsKLQotCS8qIE1lbW9yeSBtYXAgdGhlIERNQSBhcmVhIGZvciBibG9jayBtZW1vcnkgdHJhbnNmZXIgKi8KLQlpZiAoICEgbWFwcGVkX21lbSApIHsKLQkJcGl4ZWxzX2xlbiA9IGhlaWdodCAqIGN1cnJlbnQtPnBpdGNoOwotCQltYXBwZWRfbGVuID0gcGl4ZWxzX2xlbiArCi0JCSAgICAgICAgICAgICAvKiBTY3JlZW4gdXBkYXRlIERNQSBjb21tYW5kIGFyZWEgKi8KLQkJICAgICAgICAgICAgIHNpemVvZihoZWFkX3RhZ3MpICsgKCgyICogTUFYVEFHUykgKiAxNik7Ci0JCWlmICggc2F2ZWRfdmluZm8ubW9kZSAhPSBQUzJfR1NfVkVTQSApIHsKLQkJCW1hcHBlZF9sZW4gKz0gc2l6ZW9mKHRleF90YWdzKSArIHNpemVvZihzY2FsZV90YWdzKTsKLQkJfQotCQltYXBwZWRfbWVtID0gbW1hcCgwLCBtYXBwZWRfbGVuLCBQUk9UX1JFQUR8UFJPVF9XUklURSwKLQkJICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgbWVtb3J5X2ZkLCAwKTsKLQkJaWYgKCBtYXBwZWRfbWVtID09IE1BUF9GQUlMRUQgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBtYXAgJWQgYnl0ZXMgZm9yIERNQSIsCi0JCQkgICAgICAgICAgICAgbWFwcGVkX2xlbik7Ci0JCQltYXBwZWRfbWVtID0gTlVMTDsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCi0JCS8qIFNldCB1cCB0aGUgZW50aXJlIHNjcmVlbiBmb3IgRE1BIHRyYW5zZmVyICovCi0JCXNjcmVlbl9pbWFnZS5wdHIgPSBtYXBwZWRfbWVtOwotCQlzY3JlZW5faW1hZ2UuZmJwID0gMDsKLQkJc2NyZWVuX2ltYWdlLmZidyA9ICh2aW5mby53ICsgNjMpIC8gNjQ7Ci0JCXNjcmVlbl9pbWFnZS5wc20gPSB2aW5mby5wc207Ci0JCXNjcmVlbl9pbWFnZS54ID0gMDsKLQkJaWYgKCB2aW5mby5oID09IGhlaWdodCApIHsKLQkJCXNjcmVlbl9pbWFnZS55ID0gMDsKLQkJfSBlbHNlIHsKLQkJCS8qIFB1dCBpbWFnZSBvZmZzY3JlZW4gYW5kIHNjYWxlIHRvIHNjcmVlbiBoZWlnaHQgKi8KLQkJCXNjcmVlbl9pbWFnZS55ID0gdmluZm8uaDsKLQkJfQotCQlzY3JlZW5faW1hZ2UudyA9IGN1cnJlbnQtPnc7Ci0JCXNjcmVlbl9pbWFnZS5oID0gY3VycmVudC0+aDsKLQotCQkvKiBnZXQgc2NyZWVuIGltYWdlIGRhdGEgc2l6ZSAocXdvcmQgYWxpZ25lZCkgKi8KLQkJc2NyZWVuX2ltYWdlX3NpemUgPSAoc2NyZWVuX2ltYWdlLncgKiBzY3JlZW5faW1hZ2UuaCk7Ci0JCXN3aXRjaCAoc2NyZWVuX2ltYWdlLnBzbSkgewotCQkgICAgY2FzZSBQUzJfR1NfUFNNQ1QzMjoKLQkJCXNjcmVlbl9pbWFnZV9zaXplICo9IDQ7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgUFMyX0dTX1BTTUNUMjQ6Ci0JCQlzY3JlZW5faW1hZ2Vfc2l6ZSAqPSAzOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFBTMl9HU19QU01DVDE2OgotCQkJc2NyZWVuX2ltYWdlX3NpemUgKj0gMjsKLQkJCWJyZWFrOwotCQl9Ci0JCXNjcmVlbl9pbWFnZV9zaXplID0gKHNjcmVlbl9pbWFnZV9zaXplICsgMTUpICYgfjE1OwotCi0JCS8qIFNldCB1cCB0aGUgbWVtb3J5IGZvciBzY3JlZW4gdXBkYXRlIERNQSBjb21tYW5kcyAqLwotCQloZWFkX3RhZ3NfbWVtID0gKHVuc2lnbmVkIGxvbmcgbG9uZyAqKQotCQkgICAgICAgICAgICAgICAgKG1hcHBlZF9tZW0gKyBwaXhlbHNfbGVuKTsKLQkJaW1hZ2VfdGFnc19tZW0gPSAodW5zaWduZWQgbG9uZyBsb25nICopCi0JCSAgICAgICAgICAgICAgICAgKChjYWRkcl90KWhlYWRfdGFnc19tZW0gKyBzaXplb2YoaGVhZF90YWdzKSk7Ci0JCVNETF9tZW1jcHkoaGVhZF90YWdzX21lbSwgaGVhZF90YWdzLCBzaXplb2YoaGVhZF90YWdzKSk7Ci0JCWlmICggc2F2ZWRfdmluZm8ubW9kZSAhPSBQUzJfR1NfVkVTQSApIHsKLQkJCXRleF90YWdzX21lbSA9ICh1bnNpZ25lZCBsb25nIGxvbmcgKikKLQkJICAgICAgICAgICAgICAgICAoKGNhZGRyX3QpaW1hZ2VfdGFnc19tZW0gKyAoKDIqTUFYVEFHUykqMTYpKTsKLQkJCXNjYWxlX3RhZ3NfbWVtID0gKHVuc2lnbmVkIGxvbmcgbG9uZyAqKQotCQkgICAgICAgICAgICAgICAgICgoY2FkZHJfdCl0ZXhfdGFnc19tZW0gKyBzaXplb2YodGV4X3RhZ3MpKTsKLQkJCVNETF9tZW1jcHkodGV4X3RhZ3NfbWVtLCB0ZXhfdGFncywgc2l6ZW9mKHRleF90YWdzKSk7Ci0JCQl0ZXhfdGFnc19tZW1bMl0gPSAKLQkJCQkodmluZm8uaCAqIHZpbmZvLncpIC8gNjQgKwotCSAgICAgICAgICAJCSgodW5zaWduZWQgbG9uZyBsb25nKXNjcmVlbl9pbWFnZS5mYncgPDwgMTQpICsKLQkgICAgICAgICAgCQkoKHVuc2lnbmVkIGxvbmcgbG9uZylzY3JlZW5faW1hZ2UucHNtIDw8IDIwKSArCi0JICAgICAgICAgIAkJKCh1bnNpZ25lZCBsb25nIGxvbmcpcG93ZXJfb2ZfMihzY3JlZW5faW1hZ2UudykgPDwgMjYpICsKLQkgICAgICAgICAgCQkoKHVuc2lnbmVkIGxvbmcgbG9uZylwb3dlcl9vZl8yKHNjcmVlbl9pbWFnZS5oKSA8PCAzMCkgKwotCSAgICAgICAgICAJCSgodW5zaWduZWQgbG9uZyBsb25nKTEgPDwgMzQpICsKLQkgICAgICAgICAgCQkoKHVuc2lnbmVkIGxvbmcgbG9uZykxIDw8IDM1KTsKLQkJCVNETF9tZW1jcHkoc2NhbGVfdGFnc19tZW0sIHNjYWxlX3RhZ3MsIHNpemVvZihzY2FsZV90YWdzKSk7Ci0JCQlzY2FsZV90YWdzX21lbVs4XSA9Ci0JCQkJKCh1bnNpZ25lZCBsb25nIGxvbmcpc2NyZWVuX2ltYWdlLncgKiAxNikgKwotCQkJICAgICAgICAgKCgodW5zaWduZWQgbG9uZyBsb25nKXNjcmVlbl9pbWFnZS5oICogMTYpIDw8IDE2KTsKLQkJCXNjYWxlX3RhZ3NfbWVtWzEwXSA9Ci0JCQkJKCh1bnNpZ25lZCBsb25nIGxvbmcpdmluZm8udyAqIDE2KSArCi0JCQkgICAgICAgICAoKCh1bnNpZ25lZCBsb25nIGxvbmcpdmluZm8uaCAqIDE2KSA8PCAxNik7Ci0JCX0KLQl9Ci0JY3VycmVudC0+cGl4ZWxzID0gTlVMTDsKLQlpZiAoIFNETF9nZXRlbnYoIlNETF9GVUxMU0NSRUVOX1VQREFURSIpICkgewotCQkvKiBDb3JyZWN0IHNlbWFudGljcyAqLwotCQljdXJyZW50LT5mbGFncyB8PSBTRExfQVNZTkNCTElUOwotCX0gZWxzZSB7Ci0JCS8qIFdlIGxpZSBoZXJlIC0gdGhlIHNjcmVlbiBtZW1vcnkgaXNuJ3QgcmVhbGx5IHRoZSB2aXNpYmxlCi0JCSAgIGRpc3BsYXkgbWVtb3J5IGFuZCBzdGlsbCByZXF1aXJlcyBhbiB1cGRhdGUsIGJ1dCB0aGlzCi0JCSAgIGhhcyB0aGUgZGVzaXJlZCBlZmZlY3QgZm9yIG1vc3QgYXBwbGljYXRpb25zLgotCQkgKi8KLQkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKLQl9Ci0KLQkvKiBTZXQgdGhlIHVwZGF0ZSByZWN0YW5nbGUgZnVuY3Rpb24gKi8KLQl0aGlzLT5VcGRhdGVSZWN0cyA9IEdTX0RNQUZ1bGxVcGRhdGU7Ci0KLQkvKiBXZSdyZSBkb25lICovCi0JcmV0dXJuKGN1cnJlbnQpOwotfQotCi0vKiBXZSBkb24ndCBzdXBwb3J0IGhhcmR3YXJlIHN1cmZhY2VzIHlldCAqLwotc3RhdGljIGludCBHU19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuKC0xKTsKLX0KLXN0YXRpYyB2b2lkIEdTX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLXN0YXRpYyBpbnQgR1NfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYgKCBzdXJmYWNlID09IHRoaXMtPnNjcmVlbiApIHsKLQkJLyogU2luY2UgbW91c2UgbW90aW9uIGFmZmVjdHMgJ3BpeGVscycsIGxvY2sgaXQgKi8KLQkJU0RMX0xvY2tDdXJzb3IoKTsKLQotCQkvKiBNYWtlIHN1cmUgYW55IHBlbmRpbmcgRE1BIGhhcyBjb21wbGV0ZWQgKi8KLQkJaWYgKCBkbWFfcGVuZGluZyApIHsKLQkJCWlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19TRU5EUUNULCAxKTsKLQkJCWRtYV9wZW5kaW5nID0gMDsKLQkJfQotCi0JCS8qIElmIHRoZSBjdXJzb3IgaXMgZHJhd24gb24gdGhlIERNQSBhcmVhLCByZW1vdmUgaXQgKi8KLQkJaWYgKCBjdXJzb3JfZHJhd24gKSB7Ci0JCQlzdXJmYWNlLT5waXhlbHMgPSBtYXBwZWRfbWVtICsgc3VyZmFjZS0+b2Zmc2V0OwotCQkJU0RMX0VyYXNlQ3Vyc29yTm9Mb2NrKHRoaXMtPnNjcmVlbik7Ci0JCQljdXJzb3JfZHJhd24gPSAwOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBzdXJmYWNlIHBpeGVscyB0byB0aGUgYmFzZSBvZiB0aGUgRE1BIGFyZWEgKi8KLQkJc3VyZmFjZS0+cGl4ZWxzID0gbWFwcGVkX21lbTsKLQotCQkvKiBXZSdyZSBmaW5pc2hlZCEgKi8KLQkJU0RMX1VubG9ja0N1cnNvcigpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci1zdGF0aWMgdm9pZCBHU19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWlmICggc3VyZmFjZSA9PSB0aGlzLT5zY3JlZW4gKSB7Ci0JCS8qIFNpbmNlIG1vdXNlIG1vdGlvbiBhZmZlY3RzICdwaXhlbHMnLCBsb2NrIGl0ICovCi0JCVNETF9Mb2NrQ3Vyc29yKCk7Ci0JCXN1cmZhY2UtPnBpeGVscyA9IE5VTEw7Ci0JCVNETF9VbmxvY2tDdXJzb3IoKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEdTX0RNQUZ1bGxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCS8qIExvY2sgc28gd2UgYXJlbid0IGludGVycnVwdGVkIGJ5IGEgbW91c2UgdXBkYXRlICovCi0JU0RMX0xvY2tDdXJzb3IoKTsKLQotCS8qIE1ha2Ugc3VyZSBhbnkgcGVuZGluZyBETUEgaGFzIGNvbXBsZXRlZCAqLwotCWlmICggZG1hX3BlbmRpbmcgKSB7Ci0JCWlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19TRU5EUUNULCAxKTsKLQkJZG1hX3BlbmRpbmcgPSAwOwotCX0KLQotCS8qIElmIHRoZSBtb3VzZSBpcyB2aXNpYmxlLCBkcmF3IGl0IG9uIHRoZSBETUEgYXJlYSAqLwotCWlmICggKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9WSVNJQkxFKSAmJiAhY3Vyc29yX2RyYXduICkgewotCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IG1hcHBlZF9tZW0gKyB0aGlzLT5zY3JlZW4tPm9mZnNldDsKLQkJU0RMX0RyYXdDdXJzb3JOb0xvY2sodGhpcy0+c2NyZWVuKTsKLQkJdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOwotCQljdXJzb3JfZHJhd24gPSAxOwotCX0KLQotCS8qIFB1dCB0aGUgaW1hZ2Ugb250byB0aGUgc2NyZWVuICovCi0JbG9hZGltYWdlX25vbmJsb2NrKGNvbnNvbGVfZmQsCi0JICAgICAgICAgICAgICAgICAgICZzY3JlZW5faW1hZ2UsIHNjcmVlbl9pbWFnZV9zaXplLAotCSAgICAgICAgICAgICAgICAgICBoZWFkX3RhZ3NfbWVtLCBpbWFnZV90YWdzX21lbSk7Ci0JaWYgKCBzY3JlZW5faW1hZ2UueSA+IDAgKSB7Ci0JCS8qIE5lZWQgdG8gc2NhbGUgb2Zmc2NyZWVuIGltYWdlIHRvIFRWIG91dHB1dCAqLwotCQlpb2N0bChjb25zb2xlX2ZkLCBQUzJJT0NfU0VORFFDVCwgMSk7Ci0JCWRtYV9wZW5kaW5nID0gMDsKLQkJc2NhbGVpbWFnZV9ub25ibG9jayhjb25zb2xlX2ZkLCB0ZXhfdGFnc19tZW0sIHNjYWxlX3RhZ3NfbWVtKTsKLQl9IGVsc2UgewotCQlkbWFfcGVuZGluZyA9IDE7Ci0JfQotCi0JLyogV2UncmUgZmluaXNoZWQhICovCi0JU0RMX1VubG9ja0N1cnNvcigpOwotfQotCi1zdGF0aWMgaW50IEdTX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKLXsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdTX1ZpZGVvUXVpdChfVEhJUykKLXsKLQkvKiBDbG9zZSBjb25zb2xlIGFuZCBpbnB1dCBmaWxlIGRlc2NyaXB0b3JzICovCi0JaWYgKCBjb25zb2xlX2ZkID4gMCApIHsKLQkJLyogVW5tYXAgdGhlIHZpZGVvIGZyYW1lYnVmZmVyICovCi0JCWlmICggbWFwcGVkX21lbSApIHsKLQkJCS8qIFVubWFwIHRoZSB2aWRlbyBmcmFtZWJ1ZmZlciAqLwotCQkJbXVubWFwKG1hcHBlZF9tZW0sIG1hcHBlZF9sZW4pOwotCQkJbWFwcGVkX21lbSA9IE5VTEw7Ci0JCX0KLQkJY2xvc2UobWVtb3J5X2ZkKTsKLQotCQkvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB2aWRlbyBtb2RlICovCi0JCWlmICggR1NfSW5HcmFwaGljc01vZGUodGhpcykgKSB7Ci0JCQlpb2N0bChjb25zb2xlX2ZkLCBQUzJJT0NfU1NDUkVFTklORk8sICZzYXZlZF92aW5mbyk7Ci0JCX0KLQotCQkvKiBXZSdyZSBhbGwgZG9uZSB3aXRoIHRoZSBncmFwaGljcyBkZXZpY2UgKi8KLQkJY2xvc2UoY29uc29sZV9mZCk7Ci0JCWNvbnNvbGVfZmQgPSAtMTsKLQl9Ci0JR1NfQ2xvc2VNb3VzZSh0aGlzKTsKLQlHU19DbG9zZUtleWJvYXJkKHRoaXMpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3N2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3N2aWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODExMzExLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzdmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfZ3N2aWRlb19oCi0jZGVmaW5lIF9TRExfZ3N2aWRlb19oCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvcHMyL2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3BzMi9ncy5oPgotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiU0RMX211dGV4LmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKLQotCi0vKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLwotc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKLQkvKiBHb3R0YSBsb3ZlIHRoYXQgc2ltcGxlIFBTMiBncmFwaGljcyBpbnRlcmZhY2UuIDopICovCi0JaW50IGNvbnNvbGVfZmQ7Ci0JaW50IG1lbW9yeV9mZDsKLQlzdHJ1Y3QgcHMyX3NjcmVlbmluZm8gc2F2ZWRfdmluZm87Ci0KLQkvKiBZZSBvbGRlIGxpbnV4IGtleWJvYXJkIGNvZGUgKi8KLQlpbnQgY3VycmVudF92dDsKLQlpbnQgc2F2ZWRfdnQ7Ci0JaW50IGtleWJvYXJkX2ZkOwotCWludCBzYXZlZF9rYmRfbW9kZTsKLQlzdHJ1Y3QgdGVybWlvcyBzYXZlZF9rYmRfdGVybWlvczsKLQotCS8qIFllIG9sZGUgbGludXggbW91c2UgY29kZSAqLwotCWludCBtb3VzZV9mZDsKLQlpbnQgY3Vyc29yX2RyYXduOwotCi0JLyogVGhlIG1lbW9yeSBtYXBwZWQgRE1BIGFyZWEgYW5kIGFzc29jaWF0ZWQgdmFyaWFibGVzICovCi0JY2FkZHJfdCBtYXBwZWRfbWVtOwotCWludCBwaXhlbHNfbGVuOwotCWludCBtYXBwZWRfbGVuOwotCXN0cnVjdCBwczJfaW1hZ2Ugc2NyZWVuX2ltYWdlOwotCWludCBzY3JlZW5faW1hZ2Vfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgKmhlYWRfdGFnc19tZW07Ci0JdW5zaWduZWQgbG9uZyBsb25nICppbWFnZV90YWdzX21lbTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgKnRleF90YWdzX21lbTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgKnNjYWxlX3RhZ3NfbWVtOwotCWludCBkbWFfcGVuZGluZzsKLX07Ci0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgY29uc29sZV9mZAkJKHRoaXMtPmhpZGRlbi0+Y29uc29sZV9mZCkKLSNkZWZpbmUgbWVtb3J5X2ZkCQkodGhpcy0+aGlkZGVuLT5tZW1vcnlfZmQpCi0jZGVmaW5lIHNhdmVkX3ZpbmZvCQkodGhpcy0+aGlkZGVuLT5zYXZlZF92aW5mbykKLSNkZWZpbmUgY3VycmVudF92dAkJKHRoaXMtPmhpZGRlbi0+Y3VycmVudF92dCkKLSNkZWZpbmUgc2F2ZWRfdnQJCSh0aGlzLT5oaWRkZW4tPnNhdmVkX3Z0KQotI2RlZmluZSBrZXlib2FyZF9mZAkJKHRoaXMtPmhpZGRlbi0+a2V5Ym9hcmRfZmQpCi0jZGVmaW5lIHNhdmVkX2tiZF9tb2RlCQkodGhpcy0+aGlkZGVuLT5zYXZlZF9rYmRfbW9kZSkKLSNkZWZpbmUgc2F2ZWRfa2JkX3Rlcm1pb3MJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfa2JkX3Rlcm1pb3MpCi0jZGVmaW5lIG1vdXNlX2ZkCQkodGhpcy0+aGlkZGVuLT5tb3VzZV9mZCkKLSNkZWZpbmUgY3Vyc29yX2RyYXduCQkodGhpcy0+aGlkZGVuLT5jdXJzb3JfZHJhd24pCi0jZGVmaW5lIG1hcHBlZF9tZW0JCSh0aGlzLT5oaWRkZW4tPm1hcHBlZF9tZW0pCi0jZGVmaW5lIHBpeGVsc19sZW4JCSh0aGlzLT5oaWRkZW4tPnBpeGVsc19sZW4pCi0jZGVmaW5lIG1hcHBlZF9sZW4JCSh0aGlzLT5oaWRkZW4tPm1hcHBlZF9sZW4pCi0jZGVmaW5lIHNjcmVlbl9pbWFnZQkJKHRoaXMtPmhpZGRlbi0+c2NyZWVuX2ltYWdlKQotI2RlZmluZSBzY3JlZW5faW1hZ2Vfc2l6ZQkodGhpcy0+aGlkZGVuLT5zY3JlZW5faW1hZ2Vfc2l6ZSkKLSNkZWZpbmUgaGVhZF90YWdzX21lbQkJKHRoaXMtPmhpZGRlbi0+aGVhZF90YWdzX21lbSkKLSNkZWZpbmUgaW1hZ2VfdGFnc19tZW0JCSh0aGlzLT5oaWRkZW4tPmltYWdlX3RhZ3NfbWVtKQotI2RlZmluZSB0ZXhfdGFnc19tZW0JCSh0aGlzLT5oaWRkZW4tPnRleF90YWdzX21lbSkKLSNkZWZpbmUgc2NhbGVfdGFnc19tZW0JCSh0aGlzLT5oaWRkZW4tPnNjYWxlX3RhZ3NfbWVtKQotI2RlZmluZSBkbWFfcGVuZGluZwkJKHRoaXMtPmhpZGRlbi0+ZG1hX3BlbmRpbmcpCi0KLS8qIFNoYXJlZCBiZXR3ZWVuIHRoZSBtb3VzZSBhbmQgdmlkZW8gY29kZSBmb3Igc2NyZWVuIHVwZGF0ZSBzY2FsaW5nICovCi1leHRlcm4gaW50IHNjYWxlaW1hZ2Vfbm9uYmxvY2soaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqdG0sIHVuc2lnbmVkIGxvbmcgbG9uZyAqc20pOwotI2VuZGlmIC8qIF9TRExfZ3N2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc3l1di5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3N5dXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NjMzYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc3l1di5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBQbGF5c3RhdGlvbiAyIGltcGxlbWVudGF0aW9uIG9mIFlVViB2aWRlbyBvdmVybGF5cyAqLwotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkvKiBGb3IgZGVmaW5pdGlvbiBvZiBQQUdFX1NJWkUgKi8KLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9nc3l1dl9jLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3l1dmZ1bmNzLmgiCi0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiAxNngxNiBwaXhlbCBibG9jayBjb252ZXJ0ZWQgYXQgb25jZSAqLwotI2RlZmluZSBNQVhfTUFDUk9CTE9DS1MJMTAyNAkvKiAyXjEwIG1hY3JvYmxvY2tzIGF0IG9uY2UgKi8KLQotLyogVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIG1hbmlwdWxhdGUgdmlkZW8gb3ZlcmxheXMgKi8KLXN0YXRpYyBzdHJ1Y3QgcHJpdmF0ZV95dXZod2Z1bmNzIGdzX3l1dmZ1bmNzID0gewotCUdTX0xvY2tZVVZPdmVybGF5LAotCUdTX1VubG9ja1lVVk92ZXJsYXksCi0JR1NfRGlzcGxheVlVVk92ZXJsYXksCi0JR1NfRnJlZVlVVk92ZXJsYXkKLX07Ci0KLXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSB7Ci0JaW50IGlwdV9mZDsKLQlVaW50OCAqcGl4ZWxzOwotCWludCBtYWNyb2Jsb2NrczsKLQlpbnQgZG1hX2xlbjsKLQljYWRkcl90IGRtYV9tZW07Ci0JY2FkZHJfdCBpcHVfaW1lbTsKLQljYWRkcl90IGlwdV9vbWVtOwotCWNhZGRyX3QgZG1hX3RhZ3M7Ci0JdW5zaWduZWQgbG9uZyBsb25nICpzdHJldGNoX3gxeTE7Ci0JdW5zaWduZWQgbG9uZyBsb25nICpzdHJldGNoX3gyeTI7Ci0Jc3RydWN0IHBzMl9wbGlzdCBwbGlzdDsKLQotCS8qIFRoZXNlIGFyZSBqdXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgdGhlbSBzZXBhcmF0ZWx5ICovCi0JVWludDE2IHBpdGNoZXNbM107Ci0JVWludDggKnBsYW5lc1szXTsKLX07Ci0KLXN0YXRpYyBpbnQgcG93ZXJfb2ZfMihpbnQgdmFsdWUpCi17Ci0JaW50IHNoaWZ0OwotCi0JZm9yICggc2hpZnQgPSAwOyAoMTw8c2hpZnQpIDwgdmFsdWU7ICsrc2hpZnQgKSB7Ci0JCS8qIEtlZXAgbG9va2luZyAqLyA7Ci0JfQotCXJldHVybihzaGlmdCk7Ci19Ci0KLVNETF9PdmVybGF5ICpHU19DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KQotewotCVNETF9PdmVybGF5ICpvdmVybGF5OwotCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhOwotCWludCBtYXBfb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbG9uZyAqdGFnczsKLQljYWRkcl90IGJhc2U7Ci0JaW50IGJwcDsKLQlpbnQgZmJwLCBmYncsIHBzbTsKLQlpbnQgeCwgeSwgdywgaDsKLQlpbnQgcG51bTsKLQlzdHJ1Y3QgcHMyX3BhY2tldCAqcGFja2V0OwotCXN0cnVjdCBwczJfcGFja2V0IHRleF9wYWNrZXQ7Ci0KLQkvKiBXZSBjYW4gb25seSBkZWNvZGUgYmxvY2tzIG9mIDE2eDE2IHBpeGVscyAqLwotCWlmICggKHdpZHRoICYgMTUpIHx8IChoZWlnaHQgJiAxNSkgKSB7Ci0JCVNETF9TZXRFcnJvcigiT3ZlcmxheSB3aWR0aC9oZWlnaHQgbXVzdCBiZSBtdWx0aXBsZXMgb2YgMTYiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQkvKiBNYWtlIHN1cmUgdGhlIGltYWdlIGlzbid0IHRvbyBsYXJnZSBmb3IgYSBzaW5nbGUgRE1BIHRyYW5zZmVyICovCi0JaWYgKCAoKHdpZHRoLzE2KSAqIChoZWlnaHQvMTYpKSA+IE1BWF9NQUNST0JMT0NLUyApIHsKLQkJU0RMX1NldEVycm9yKCJPdmVybGF5IHRvbyBsYXJnZSAobWF4aW11bSBzaXplOiAlZCBwaXhlbHMpIiwKLQkJICAgICAgICAgICAgIE1BWF9NQUNST0JMT0NLUyAqIDE2ICogMTYpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogRG91YmxlLWNoZWNrIHRoZSByZXF1ZXN0ZWQgZm9ybWF0LiAgRm9yIHNpbXBsaWNpdHksIHdlJ2xsIG9ubHkKLQkgICBzdXBwb3J0IHBsYW5hciBZVVYgZm9ybWF0cy4KLQkgKi8KLQlzd2l0Y2ggKGZvcm1hdCkgewotCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0JICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKLQkJLyogU3VwcG9ydGVkIHBsYW5hciBZVVYgZm9ybWF0ICovCi0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIFlVViBmb3JtYXQiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIENyZWF0ZSB0aGUgb3ZlcmxheSBzdHJ1Y3R1cmUgKi8KLQlvdmVybGF5ID0gKFNETF9PdmVybGF5ICopU0RMX21hbGxvYyhzaXplb2YgKm92ZXJsYXkpOwotCWlmICggb3ZlcmxheSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlTRExfbWVtc2V0KG92ZXJsYXksIDAsIChzaXplb2YgKm92ZXJsYXkpKTsKLQotCS8qIEZpbGwgaW4gdGhlIGJhc2ljIG1lbWJlcnMgKi8KLQlvdmVybGF5LT5mb3JtYXQgPSBmb3JtYXQ7Ci0Jb3ZlcmxheS0+dyA9IHdpZHRoOwotCW92ZXJsYXktPmggPSBoZWlnaHQ7Ci0KLQkvKiBTZXQgdXAgdGhlIFlVViBzdXJmYWNlIGZ1bmN0aW9uIHN0cnVjdHVyZSAqLwotCW92ZXJsYXktPmh3ZnVuY3MgPSAmZ3NfeXV2ZnVuY3M7Ci0Jb3ZlcmxheS0+aHdfb3ZlcmxheSA9IDE7Ci0KLQkvKiBDcmVhdGUgdGhlIHBpeGVsIGRhdGEgKi8KLQlod2RhdGEgPSAoc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICopU0RMX21hbGxvYyhzaXplb2YgKmh3ZGF0YSk7Ci0Jb3ZlcmxheS0+aHdkYXRhID0gaHdkYXRhOwotCWlmICggaHdkYXRhID09IE5VTEwgKSB7Ci0JCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JaHdkYXRhLT5pcHVfZmQgPSAtMTsKLQlod2RhdGEtPnBpeGVscyA9IChVaW50OCAqKVNETF9tYWxsb2Mod2lkdGgqaGVpZ2h0KjIpOwotCWlmICggaHdkYXRhLT5waXhlbHMgPT0gTlVMTCApIHsKLQkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlod2RhdGEtPm1hY3JvYmxvY2tzID0gKHdpZHRoLzE2KSAqIChoZWlnaHQvMTYpOwotCi0JLyogRmluZCB0aGUgcGl0Y2ggYW5kIG9mZnNldCB2YWx1ZXMgZm9yIHRoZSBvdmVybGF5ICovCi0Jb3ZlcmxheS0+cGl0Y2hlcyA9IGh3ZGF0YS0+cGl0Y2hlczsKLQlvdmVybGF5LT5waXhlbHMgPSBod2RhdGEtPnBsYW5lczsKLQlzd2l0Y2ggKGZvcm1hdCkgewotCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0JICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKLQkJb3ZlcmxheS0+cGl0Y2hlc1swXSA9IG92ZXJsYXktPnc7Ci0JCW92ZXJsYXktPnBpdGNoZXNbMV0gPSBvdmVybGF5LT5waXRjaGVzWzBdIC8gMjsKLQkJb3ZlcmxheS0+cGl0Y2hlc1syXSA9IG92ZXJsYXktPnBpdGNoZXNbMF0gLyAyOwotCSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzBdID0gaHdkYXRhLT5waXhlbHM7Ci0JICAgICAgICBvdmVybGF5LT5waXhlbHNbMV0gPSBvdmVybGF5LT5waXhlbHNbMF0gKwotCQkgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LT5waXRjaGVzWzBdICogb3ZlcmxheS0+aDsKLQkgICAgICAgIG92ZXJsYXktPnBpeGVsc1syXSA9IG92ZXJsYXktPnBpeGVsc1sxXSArCi0JCSAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMV0gKiBvdmVybGF5LT5oIC8gMjsKLQkJb3ZlcmxheS0+cGxhbmVzID0gMzsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAoY2F1Z2h0IGFib3ZlKSAqLwotCQlicmVhazsKLQl9Ci0KLQkvKiBUaGVvcmV0aWNhbGx5IHdlIGNvdWxkIHN1cHBvcnQgc2V2ZXJhbCBjb25jdXJyZW50IGRlY29kZQotCSAgIHN0cmVhbXMgcXVldWVpbmcgdXAgb24gdGhlIHNhbWUgZmlsZSBkZXNjcmlwdG9yLCBidXQgZm9yCi0JICAgc2ltcGxpY2l0eSB3ZSdsbCBzdXBwb3J0IG9ubHkgb25lLiAgT3BlbmluZyB0aGUgSVBVIG1vcmUKLQkgICB0aGFuIG9uY2Ugd2lsbCBmYWlsIHdpdGggRUJVU1kuCi0JKi8KLQlod2RhdGEtPmlwdV9mZCA9IG9wZW4oIi9kZXYvcHMyaXB1IiwgT19SRFdSKTsKLQlpZiAoIGh3ZGF0YS0+aXB1X2ZkIDwgMCApIHsKLQkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotCQlTRExfU2V0RXJyb3IoIlBsYXlzdGF0aW9uIDIgSVBVIGJ1c3kiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIEFsbG9jYXRlIGEgRE1BIGFyZWEgZm9yIHBpeGVsIGNvbnZlcnNpb24gKi8KLQlicHAgPSB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLQltYXBfb2Zmc2V0ID0gKG1hcHBlZF9sZW4gKyAoUEFHRV9TSVpFIC0gMSkpICYgfihQQUdFX1NJWkUgLSAxKTsKLQlod2RhdGEtPmRtYV9sZW4gPSBod2RhdGEtPm1hY3JvYmxvY2tzICogKDE2ICogMTYgKyA4ICogOCArIDggKiA4KSArCi0JICAgICAgICAgICAgICAgICAgd2lkdGggKiBoZWlnaHQgKiBicHAgKwotCSAgICAgICAgICAgICAgICAgIGh3ZGF0YS0+bWFjcm9ibG9ja3MgKiAoMTYgKiBzaXplb2YobG9uZyBsb25nKSkgKwotCSAgICAgICAgICAgICAgICAgIDEyICogc2l6ZW9mKGxvbmcgbG9uZyk7Ci0JaHdkYXRhLT5kbWFfbWVtID0gbW1hcCgwLCBod2RhdGEtPmRtYV9sZW4sIFBST1RfUkVBRHxQUk9UX1dSSVRFLAotCSAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgbWVtb3J5X2ZkLCBtYXBfb2Zmc2V0KTsKLQlpZiAoIGh3ZGF0YS0+ZG1hX21lbSA9PSBNQVBfRkFJTEVEICkgewotCQlod2RhdGEtPmlwdV9pbWVtID0gKGNhZGRyX3QpMDsKLQkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBtYXAgJWQgYnl0ZXMgZm9yIERNQSIsIGh3ZGF0YS0+ZG1hX2xlbik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JaHdkYXRhLT5pcHVfaW1lbSA9IGh3ZGF0YS0+ZG1hX21lbTsKLQlod2RhdGEtPmlwdV9vbWVtID0gaHdkYXRhLT5pcHVfaW1lbSArCi0JICAgICAgICAgICAgICAgICAgIGh3ZGF0YS0+bWFjcm9ibG9ja3MgKiAoMTYgKiAxNiArIDggKiA4ICsgOCAqIDgpOwotCWh3ZGF0YS0+ZG1hX3RhZ3MgPSBod2RhdGEtPmlwdV9vbWVtICsgd2lkdGggKiBoZWlnaHQgKiBicHA7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBETUEgcGFja2V0cyAqLwotCWh3ZGF0YS0+cGxpc3QubnVtID0gaHdkYXRhLT5tYWNyb2Jsb2NrcyAqIDQgKyAxOwotCWh3ZGF0YS0+cGxpc3QucGFja2V0ID0gKHN0cnVjdCBwczJfcGFja2V0ICopU0RMX21hbGxvYygKLQkgICAgICAgICAgICAgICAgICAgICAgIGh3ZGF0YS0+cGxpc3QubnVtKnNpemVvZihzdHJ1Y3QgcHMyX3BhY2tldCkpOwotCWlmICggISBod2RhdGEtPnBsaXN0LnBhY2tldCApIHsKLQkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlwbnVtID0gMDsKLQlwYWNrZXQgPSBod2RhdGEtPnBsaXN0LnBhY2tldDsKLQotCS8qIFNldCB1cCB0aGUgdGFncyB0byBzZW5kIHRoZSBpbWFnZSB0byB0aGUgc2NyZWVuICovCi0JdGFncyA9ICh1bnNpZ25lZCBsb25nIGxvbmcgKilod2RhdGEtPmRtYV90YWdzOwotCWJhc2UgPSBod2RhdGEtPmlwdV9vbWVtOwotCWZicCA9IHNjcmVlbl9pbWFnZS5mYnA7Ci0JZmJ3ID0gc2NyZWVuX2ltYWdlLmZidzsKLQlwc20gPSBzY3JlZW5faW1hZ2UucHNtOwotCXkgPSBzY3JlZW5faW1hZ2UueSArIHNjcmVlbl9pbWFnZS5oOwkvKiBPZmZzY3JlZW4gdmlkZW8gbWVtb3J5ICovCi0JZm9yICggaD1oZWlnaHQvMTY7IGg7IC0taCApIHsKLQkJeCA9IDA7CQkJLyogVmlzaWJsZSB2aWRlbyBtZW1vcnkgKi8KLQkJZm9yICggdz13aWR0aC8xNjsgdzsgLS13ICkgewotCQkJLyogVGhlIGhlYWQgdGFnICovCi0JCQlwYWNrZXRbcG51bV0ucHRyID0gJnRhZ3NbMF07Ci0JCQlwYWNrZXRbcG51bV0ubGVuID0gMTAgKiBzaXplb2YoKnRhZ3MpOwotCQkJKytwbnVtOwotCQkJdGFnc1swXSA9IDQgfCAoMUxMIDw8IDYwKTsJLyogR0lGdGFnICovCi0JCQl0YWdzWzFdID0gMHgwZTsJCQkvKiBBK0QgKi8KLQkJCXRhZ3NbMl0gPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylmYnAgPDwgMzIpIHwKLQkJCSAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZylmYncgPDwgNDgpIHwKLQkJCSAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZylwc20gPDwgNTYpOwotCQkJdGFnc1szXSA9IFBTMl9HU19CSVRCTFRCVUY7Ci0JCQl0YWdzWzRdID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpeCA8PCAzMikgfAotCQkJICAgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKXkgPDwgNDgpOwotCQkJdGFnc1s1XSA9IFBTMl9HU19UUlhQT1M7Ci0JCQl0YWdzWzZdID0gKHVuc2lnbmVkIGxvbmcgbG9uZykxNiB8Ci0JCQkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpMTYgPDwgMzIpOwotCQkJdGFnc1s3XSA9IFBTMl9HU19UUlhSRUc7Ci0JCQl0YWdzWzhdID0gMDsKLQkJCXRhZ3NbOV0gPSBQUzJfR1NfVFJYRElSOwotCQkJLyogTm93IHRoZSBhY3R1YWwgaW1hZ2UgZGF0YSAqLwotCQkJcGFja2V0W3BudW1dLnB0ciA9ICZ0YWdzWzEwXTsKLQkJCXBhY2tldFtwbnVtXS5sZW4gPSAyICogc2l6ZW9mKCp0YWdzKTsKLQkJCSsrcG51bTsKLQkJCXRhZ3NbMTBdID0gKCgxNioxNipicHApID4+IDQpIHwgKDJMTCA8PCA1OCk7Ci0JCQl0YWdzWzExXSA9IDA7Ci0JCQlwYWNrZXRbcG51bV0ucHRyID0gKHZvaWQgKiliYXNlOwotCQkJcGFja2V0W3BudW1dLmxlbiA9IDE2ICogMTYgKiBicHA7Ci0JCQkrK3BudW07Ci0JCQlwYWNrZXRbcG51bV0ucHRyID0gJnRhZ3NbMTJdOwotCQkJcGFja2V0W3BudW1dLmxlbiA9IDIgKiBzaXplb2YoKnRhZ3MpOwotCQkJKytwbnVtOwotCQkJdGFnc1sxMl0gPSAoMCA+PiA0KSB8ICgxIDw8IDE1KSB8ICgyTEwgPDwgNTgpOwotCQkJdGFnc1sxM10gPSAwOwotCi0JCQl0YWdzICs9IDE2OwotCQkJYmFzZSArPSAxNiAqIDE2ICogYnBwOwotCi0JCQl4ICs9IDE2OwotCQl9Ci0JCXkgKz0gMTY7Ci0JfQotCi0JLyogU2V0IHVwIHRoZSB0ZXh0dXJlIG1lbW9yeSBhcmVhIGZvciB0aGUgdmlkZW8gKi8KLQl0ZXhfcGFja2V0LnB0ciA9IHRhZ3M7Ci0JdGV4X3BhY2tldC5sZW4gPSA4ICogc2l6ZW9mKCp0YWdzKTsKLQl0YWdzWzBdID0gMyB8ICgxTEwgPDwgNjApOwkvKiBHSUZ0YWcgKi8KLQl0YWdzWzFdID0gMHgwZTsJCQkvKiBBK0QgKi8KLQl0YWdzWzJdID0gKChzY3JlZW5faW1hZ2UueSArIHNjcmVlbl9pbWFnZS5oKSAqIHNjcmVlbl9pbWFnZS53KSAvIDY0ICsKLQkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpZmJ3IDw8IDE0KSArCi0JICAgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKXBzbSA8PCAyMCkgKwotCSAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZylwb3dlcl9vZl8yKHdpZHRoKSA8PCAyNikgKwotCSAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZylwb3dlcl9vZl8yKGhlaWdodCkgPDwgMzApICsKLQkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpMSA8PCAzNCkgKwotCSAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZykxIDw8IDM1KTsKLQl0YWdzWzNdID0gUFMyX0dTX1RFWDBfMTsKLQl0YWdzWzRdID0gKDEgPDwgNSkgKyAoMSA8PCA2KTsKLQl0YWdzWzVdID0gUFMyX0dTX1RFWDFfMTsKLQl0YWdzWzZdID0gMDsKLQl0YWdzWzddID0gUFMyX0dTX1RFWEZMVVNIOwotCWlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19TRU5ELCAmdGV4X3BhY2tldCk7Ci0KLQkvKiBTZXQgdXAgdGhlIHRhZ3MgZm9yIHNjYWxpbmcgdGhlIGltYWdlICovCi0JcGFja2V0W3BudW1dLnB0ciA9IHRhZ3M7Ci0JcGFja2V0W3BudW1dLmxlbiA9IDEyICogc2l6ZW9mKCp0YWdzKTsKLQkrK3BudW07Ci0JdGFnc1swXSA9IDUgfCAoMUxMIDw8IDYwKTsJLyogR0lGdGFnICovCi0JdGFnc1sxXSA9IDB4MGU7CQkJLyogQStEICovCi0JdGFnc1syXSA9IDYgKyAoMSA8PCA0KSArICgxIDw8IDgpOwotCXRhZ3NbM10gPSBQUzJfR1NfUFJJTTsKLQl0YWdzWzRdID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpMCAqIDE2KSArCi0JICAgICAgICAgICAoKCh1bnNpZ25lZCBsb25nIGxvbmcpMCAqIDE2KSA8PCAxNik7Ci0JdGFnc1s1XSA9IFBTMl9HU19VVjsKLQl0YWdzWzZdID0gMDsgLyogWDEsIFkxICovCi0JdGFnc1s3XSA9IFBTMl9HU19YWVoyOwotCWh3ZGF0YS0+c3RyZXRjaF94MXkxID0gJnRhZ3NbNl07Ci0JdGFnc1s4XSA9ICgodW5zaWduZWQgbG9uZyBsb25nKW92ZXJsYXktPncgKiAxNikgKwotCSAgICAgICAgICAgKCgodW5zaWduZWQgbG9uZyBsb25nKW92ZXJsYXktPmggKiAxNikgPDwgMTYpOwotCXRhZ3NbOV0gPSBQUzJfR1NfVVY7Ci0JdGFnc1sxMF0gPSAwOyAvKiBYMiwgWTIgKi8KLQl0YWdzWzExXSA9IFBTMl9HU19YWVoyOwotCWh3ZGF0YS0+c3RyZXRjaF94MnkyID0gJnRhZ3NbMTBdOwotCi0JLyogV2UncmUgYWxsIGRvbmUuLiAqLwotCXJldHVybihvdmVybGF5KTsKLX0KLQotaW50IEdTX0xvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSkKLXsKLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgR1NfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCi17Ci0JcmV0dXJuOwotfQotCi1pbnQgR1NfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KQotewotCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhOwotCV9fdTMyIGNtZDsKLQlzdHJ1Y3QgcHMyX3BhY2tldCBwYWNrZXQ7Ci0JaW50IGgsIHcsIGk7Ci0JVWludDMyICpsdW0sICpDciwgKkNiOwotCWludCBsdW1fcGl0Y2g7Ci0JaW50IGNyYl9waXRjaDsKLQlVaW50MzIgKmx1bV9zcmMsICpDcl9zcmMsICpDYl9zcmM7Ci0JVWludDMyICpzcmNwLCAqZHN0cDsKLQl1bnNpZ25lZCBpbnQgeCwgeTsKLQlTRExfU3VyZmFjZSAqc2NyZWVuOwotCi0JLyogRmluZCBvdXQgd2hlcmUgdGhlIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIGltYWdlIGFyZSAqLwotCWh3ZGF0YSA9IG92ZXJsYXktPmh3ZGF0YTsKLQlzd2l0Y2ggKG92ZXJsYXktPmZvcm1hdCkgewotCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0JCWx1bSA9IChVaW50MzIgKilvdmVybGF5LT5waXhlbHNbMF07Ci0JCUNyID0gIChVaW50MzIgKilvdmVybGF5LT5waXhlbHNbMV07Ci0JCUNiID0gIChVaW50MzIgKilvdmVybGF5LT5waXhlbHNbMl07Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9JWVVWX09WRVJMQVk6Ci0JCWx1bSA9IChVaW50MzIgKilvdmVybGF5LT5waXhlbHNbMF07Ci0JCUNyID0gIChVaW50MzIgKilvdmVybGF5LT5waXhlbHNbMl07Ci0JCUNiID0gIChVaW50MzIgKilvdmVybGF5LT5waXhlbHNbMV07Ci0JICAgIGRlZmF1bHQ6Ci0JCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgWVVWIGZvcm1hdCBpbiBibGl0ICg/KSIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlkc3RwID0gKFVpbnQzMiAqKWh3ZGF0YS0+aXB1X2ltZW07Ci0JbHVtX3BpdGNoID0gb3ZlcmxheS0+dy80OwotCWNyYl9waXRjaCA9IChvdmVybGF5LT53LzIpLzQ7Ci0KLQkvKiBDb3B5IGJsb2NrcyBvZiAxNngxNiBwaXhlbHMgdG8gdGhlIERNQSBhcmVhICovCi0JZm9yICggaD1vdmVybGF5LT5oLzE2OyBoOyAtLWggKSB7Ci0JCWx1bV9zcmMgPSBsdW07Ci0JCUNyX3NyYyA9IENyOwotCQlDYl9zcmMgPSBDYjsKLQkJZm9yICggdz1vdmVybGF5LT53LzE2OyB3OyAtLXcgKSB7Ci0JCQlzcmNwID0gbHVtX3NyYzsKLQkJCWZvciAoIGk9MDsgaTwxNjsgKytpICkgewotCQkJCWRzdHBbMF0gPSBzcmNwWzBdOwotCQkJCWRzdHBbMV0gPSBzcmNwWzFdOwotCQkJCWRzdHBbMl0gPSBzcmNwWzJdOwotCQkJCWRzdHBbM10gPSBzcmNwWzNdOwotCQkJCXNyY3AgKz0gbHVtX3BpdGNoOwotCQkJCWRzdHAgKz0gNDsKLQkJCX0KLQkJCXNyY3AgPSBDYl9zcmM7Ci0JCQlmb3IgKCBpPTA7IGk8ODsgKytpICkgewotCQkJCWRzdHBbMF0gPSBzcmNwWzBdOwotCQkJCWRzdHBbMV0gPSBzcmNwWzFdOwotCQkJCXNyY3AgKz0gY3JiX3BpdGNoOwotCQkJCWRzdHAgKz0gMjsKLQkJCX0KLQkJCXNyY3AgPSBDcl9zcmM7Ci0JCQlmb3IgKCBpPTA7IGk8ODsgKytpICkgewotCQkJCWRzdHBbMF0gPSBzcmNwWzBdOwotCQkJCWRzdHBbMV0gPSBzcmNwWzFdOwotCQkJCXNyY3AgKz0gY3JiX3BpdGNoOwotCQkJCWRzdHAgKz0gMjsKLQkJCX0KLQkJCWx1bV9zcmMgKz0gMTYgLyA0OwotCQkJQ2Jfc3JjICs9IDggLyA0OwotCQkJQ3Jfc3JjICs9IDggLyA0OwotCQl9Ci0JCWx1bSArPSBsdW1fcGl0Y2ggKiAxNjsKLQkJQ3IgKz0gY3JiX3BpdGNoICogODsKLQkJQ2IgKz0gY3JiX3BpdGNoICogODsKLQl9Ci0KLQkvKiBTZW5kIHRoZSBtYWNyb2Jsb2NrIGRhdGEgdG8gdGhlIElQVSAqLwotI2lmZGVmIERFQlVHX1lVVgotCWZwcmludGYoc3RkZXJyLCAiU2VuZGluZyBkYXRhIHRvIElQVS4uXG4iKTsKLSNlbmRpZgotCXBhY2tldC5wdHIgPSBod2RhdGEtPmlwdV9pbWVtOwotCXBhY2tldC5sZW4gPSBod2RhdGEtPm1hY3JvYmxvY2tzICogKDE2ICogMTYgKyA4ICogOCArIDggKiA4KTsKLQlpb2N0bChod2RhdGEtPmlwdV9mZCwgUFMySU9DX1NFTkRBLCAmcGFja2V0KTsKLQotCS8qIFRyaWdnZXIgdGhlIERNQSB0byB0aGUgSVBVIGZvciBjb252ZXJzaW9uICovCi0jaWZkZWYgREVCVUdfWVVWCi0JZnByaW50ZihzdGRlcnIsICJUcmlnZ2luZyBjb252ZXJzaW9uIGNvbW1hbmRcbiIpOwotI2VuZGlmCi0JY21kID0gKDcgPDwgMjgpICsgaHdkYXRhLT5tYWNyb2Jsb2NrczsKLQlpZiAoIHNjcmVlbl9pbWFnZS5wc20gPT0gUFMyX0dTX1BTTUNUMTYgKSB7Ci0JCWNtZCArPSAoMSA8PCAyNykgKwkvKiBPdXRwdXQgUkdCIDU1NSAqLwotCQkgICAgICAgKDEgPDwgMjYpOwkvKiBEaXRoZXIgb3V0cHV0ICovCi0JfQotCWlvY3RsKGh3ZGF0YS0+aXB1X2ZkLCBQUzJJT0NfU0lQVUNNRCwgJmNtZCk7Ci0KLQkvKiBSZXRyaWV2ZSB0aGUgY29udmVydGVkIGltYWdlIGZyb20gdGhlIElQVSAqLwotI2lmZGVmIERFQlVHX1lVVgotCWZwcmludGYoc3RkZXJyLCAiUmV0cmlldmluZyBkYXRhIGZyb20gSVBVLi5cbiIpOwotI2VuZGlmCi0JcGFja2V0LnB0ciA9IGh3ZGF0YS0+aXB1X29tZW07Ci0JcGFja2V0LmxlbiA9IG92ZXJsYXktPncgKiBvdmVybGF5LT5oICoKLQkgICAgICAgICAgICAgdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JaW9jdGwoaHdkYXRhLT5pcHVfZmQsIFBTMklPQ19SRUNWLCAmcGFja2V0KTsKLQotI2lmZGVmIERFQlVHX1lVVgotCWZwcmludGYoc3RkZXJyLCAiQ29weWluZyBpbWFnZSB0byBzY3JlZW4uLlxuIik7Ci0jZW5kaWYKLQkvKiBXYWl0IGZvciBwcmV2aW91cyBETUEgdG8gY29tcGxldGUgKi8KLQlpb2N0bChjb25zb2xlX2ZkLCBQUzJJT0NfU0VORFFDVCwgMSk7Ci0KLQkvKiBTZW5kIHRoZSBjdXJyZW50IGltYWdlIHRvIHRoZSBzY3JlZW4gYW5kIHNjYWxlIGl0ICovCi0Jc2NyZWVuID0gdGhpcy0+c2NyZWVuOwotCXggPSAodW5zaWduZWQgaW50KWRzdC0+eDsKLQl5ID0gKHVuc2lnbmVkIGludClkc3QtPnk7Ci0JaWYgKCBzY3JlZW4tPm9mZnNldCApIHsKLQkJeCArPSAoc2NyZWVuLT5vZmZzZXQgJSBzY3JlZW4tPnBpdGNoKSAvCi0JCSAgICAgc2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7Ci0JCXkgKz0gKHNjcmVlbi0+b2Zmc2V0IC8gc2NyZWVuLT5waXRjaCk7Ci0JfQotCXkgKz0gc2NyZWVuX2ltYWdlLnk7Ci0JKmh3ZGF0YS0+c3RyZXRjaF94MXkxID0gKHggKiAxNikgKyAoKHkgKiAxNikgPDwgMTYpOwotCXggKz0gKHVuc2lnbmVkIGludClkc3QtPnc7Ci0JeSArPSAodW5zaWduZWQgaW50KWRzdC0+aDsKLQkqaHdkYXRhLT5zdHJldGNoX3gyeTIgPSAoeCAqIDE2KSArICgoeSAqIDE2KSA8PCAxNik7Ci0JcmV0dXJuIGlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19TRU5ETCwgJmh3ZGF0YS0+cGxpc3QpOwotfQotCi12b2lkIEdTX0ZyZWVZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSkKLXsKLQlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKLQotCWh3ZGF0YSA9IG92ZXJsYXktPmh3ZGF0YTsKLQlpZiAoIGh3ZGF0YSApIHsKLQkJaWYgKCBod2RhdGEtPmlwdV9mZCA+PSAwICkgewotCQkJY2xvc2UoaHdkYXRhLT5pcHVfZmQpOwotCQl9Ci0JCWlmICggaHdkYXRhLT5kbWFfbWVtICkgewotCQkJbXVubWFwKGh3ZGF0YS0+ZG1hX21lbSwgaHdkYXRhLT5kbWFfbGVuKTsKLQkJfQotCQlpZiAoIGh3ZGF0YS0+cGxpc3QucGFja2V0ICkgewotCQkJU0RMX2ZyZWUoaHdkYXRhLT5wbGlzdC5wYWNrZXQpOwotCQl9Ci0JCWlmICggaHdkYXRhLT5waXhlbHMgKSB7Ci0JCQlTRExfZnJlZShod2RhdGEtPnBpeGVscyk7Ci0JCX0KLQkJU0RMX2ZyZWUoaHdkYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc3l1dl9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc3l1dl9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGUwNTQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9wczJncy9TRExfZ3N5dXZfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoaXMgaXMgdGhlIFBsYXlzdGF0aW9uIDIgaW1wbGVtZW50YXRpb24gb2YgWVVWIHZpZGVvIG92ZXJsYXlzICovCi0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfZ3N2aWRlby5oIgotCi1leHRlcm4gU0RMX092ZXJsYXkgKkdTX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpOwotCi1leHRlcm4gaW50IEdTX0xvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7Ci0KLWV4dGVybiB2b2lkIEdTX1VubG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKLQotZXh0ZXJuIGludCBHU19EaXNwbGF5WVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXksIFNETF9SZWN0ICpzcmMsIFNETF9SZWN0ICpkc3QpOwotCi1leHRlcm4gdm9pZCBHU19GcmVlWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX1FQRUFwcC5jYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9RUEVBcHAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MjNjNTcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX1FQRUFwcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8cXBlL3FwZWFwcGxpY2F0aW9uLmg+Ci0jaW5jbHVkZSA8cWFwcGxpY2F0aW9uLmg+Ci0jaW5jbHVkZSA8cWV2ZW50Lmg+Ci0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0KLS8qIEZsYWcgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB0aGUgQmUgYXBwbGljYXRpb24gaXMgYWN0aXZlIG9yIG5vdCAqLwotaW50IFNETF9RUEVBcHBBY3RpdmUgPSAwOwotc3RhdGljIFFQRUFwcGxpY2F0aW9uICphcHA7Ci0KLWludCBTRExfSW5pdFFQRUFwcCgpIHsKLSAgaWYoU0RMX1FQRUFwcEFjdGl2ZSA8PSAwKSB7Ci0gICAgaWYoIXFBcHApIHsKLSAgICAgIGludCBhcmdjID0gMTsKLSAgICAgIGNoYXIgKmFyZ3ZbXSA9IHsgeyAiU0RMQXBwIiB9IH07Ci0gICAgICBhcHAgPSBuZXcgUVBFQXBwbGljYXRpb24oYXJnYywgYXJndik7Ci0gICAgICBRV2lkZ2V0IGR1bW15OwotICAgICAgYXBwLT5zaG93TWFpbldpZGdldCgmZHVtbXkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhcHAgPSAoUVBFQXBwbGljYXRpb24qKXFBcHA7Ci0gICAgfQotICAgIFNETF9RUEVBcHBBY3RpdmUrKzsKLSAgfQotICByZXR1cm4gMDsgIAotfQotCi0vKiBRdWl0IHRoZSBRUEUgQXBwbGljYXRpb24sIGlmIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCi12b2lkIFNETF9RdWl0UVBFQXBwKHZvaWQpCi17Ci0gIC8qIERlY3JlbWVudCB0aGUgYXBwbGljYXRpb24gcmVmZXJlbmNlIGNvdW50ICovCi0gIFNETF9RUEVBcHBBY3RpdmUtLTsKLSAgLyogSWYgdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVkIHplcm8sIGNsZWFuIHVwIHRoZSBhcHAgKi8KLSAgaWYgKCBTRExfUVBFQXBwQWN0aXZlID09IDAgJiYgYXBwKSB7Ci0gICAgZGVsZXRlIGFwcDsKLSAgICBhcHAgPSAwOwotICAgIHFBcHAgPSAwOwotICB9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F0b3BpYS9TRExfUVBFQXBwLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F0b3BpYS9TRExfUVBFQXBwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTFhZDkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX1FQRUFwcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIEhhbmRsZSB0aGUgUVBFIGFwcGxpY2F0aW9uIGxvb3AgKi8KLQotLyogSW5pdGlhbGl6ZSB0aGUgUVBFIEFwcGxpY2F0aW9uLCBpZiBpdCdzIG5vdCBhbHJlYWR5IHN0YXJ0ZWQgKi8KLWV4dGVybiBpbnQgU0RMX0luaXRRUEVBcHAodm9pZCk7Ci0KLS8qIFF1aXQgdGhlIFFQRSBBcHBsaWNhdGlvbiwgaWYgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gKi8KLWV4dGVybiB2b2lkIFNETF9RdWl0UVBFQXBwKHZvaWQpOwotCi0vKiBGbGFnIHRvIHRlbGwgd2hldGhlciB0aGUgYXBwIGlzIGFjdGl2ZSBvciBub3QgKi8KLWV4dGVybiBpbnQgU0RMX1FQRUFwcEFjdGl2ZTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9RV2luLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX1FXaW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMzYyNDYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX1FXaW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfUVdpbi5oIgotI2luY2x1ZGUgPHFhcHBsaWNhdGlvbi5oPgotI2luY2x1ZGUgPHFkaXJlY3RwYWludGVyX3F3cy5oPgotCi1zY3JlZW5Sb3RhdGlvblQgc2NyZWVuUm90YXRpb24gPSBTRExfUVRfTk9fUk9UQVRJT047Ci0KLVNETF9RV2luOjpTRExfUVdpbihjb25zdCBRU2l6ZSYgc2l6ZSkKLSAgOiBRV2lkZ2V0KDAsICJTRExfbWFpbiIpLCBteV9wYWludGVyKDApLCBteV9pbWFnZSgwKSwKLSAgICBteV9pbmhpYml0X3Jlc2l6ZShmYWxzZSksIG15X21vdXNlX3BvcygtMSwtMSksIG15X2ZsYWdzKDApLAotICAgIG15X2hhc19mdWxsc2NyZWVuKGZhbHNlKSwgbXlfbG9ja2VkKDApCi17Ci0gIHNldEJhY2tncm91bmRNb2RlKE5vQmFja2dyb3VuZCk7Ci19Ci0KLVNETF9RV2luOjp+U0RMX1FXaW4oKSB7Ci0gIC8vIE5vdGhpbmcgdG8gZG8geWV0LgotICBpZihteV9pbWFnZSkgewotICAgIGRlbGV0ZSBteV9pbWFnZTsKLSAgfQotfQotCi12b2lkIFNETF9RV2luOjpzZXRJbWFnZShRSW1hZ2UgKmltYWdlKSB7Ci0gIGlmICggbXlfaW1hZ2UgKSB7Ci0gICAgZGVsZXRlIG15X2ltYWdlOwotICB9Ci0gIG15X2ltYWdlID0gaW1hZ2U7Ci0gIC8vICBzZXRGaXhlZFNpemUoaW1hZ2UtPnNpemUoKSk7Ci19Ci0KLXZvaWQgU0RMX1FXaW46OnJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCAqZSkgewotICBpZihzaXplKCkgIT0gcUFwcC0+ZGVza3RvcCgpLT5zaXplKCkpIHsKLSAgICAvLyBXaWRnZXQgaXMgbm90IHRoZSBjb3JyZWN0IHNpemUsIHNvIGRvIHRoZSBmdWxsc2NyZWVuIG1hZ2ljCi0gICAgbXlfaGFzX2Z1bGxzY3JlZW4gPSBmYWxzZTsKLSAgICBlbmFibGVGdWxsc2NyZWVuKCk7Ci0gIH0KLSAgaWYobXlfaW5oaWJpdF9yZXNpemUpIHsKLSAgICBteV9pbmhpYml0X3Jlc2l6ZSA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIFNETF9Qcml2YXRlUmVzaXplKGUtPnNpemUoKS53aWR0aCgpLCBlLT5zaXplKCkuaGVpZ2h0KCkpOwotICB9Ci19Ci0KLXZvaWQgU0RMX1FXaW46OmZvY3VzSW5FdmVudChRRm9jdXNFdmVudCAqKSB7Ci0gIC8vIEFsd2F5cyBkbyBpdCBoZXJlLCBubyBtYXR0ZXIgdGhlIHNpemUuCi0gIGVuYWJsZUZ1bGxzY3JlZW4oKTsKLSAgU0RMX1ByaXZhdGVBcHBBY3RpdmUodHJ1ZSwgU0RMX0FQUElOUFVURk9DVVMpOwotfQotCi12b2lkIFNETF9RV2luOjpmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50ICopIHsKLSAgbXlfaGFzX2Z1bGxzY3JlZW4gPSBmYWxzZTsKLSAgU0RMX1ByaXZhdGVBcHBBY3RpdmUoZmFsc2UsIFNETF9BUFBJTlBVVEZPQ1VTKTsKLX0KLQotdm9pZCBTRExfUVdpbjo6Y2xvc2VFdmVudChRQ2xvc2VFdmVudCAqZSkgewotICBTRExfUHJpdmF0ZVF1aXQoKTsKLSAgZS0+aWdub3JlKCk7Ci19Ci0KLXZvaWQgU0RMX1FXaW46OnNldE1vdXNlUG9zKGNvbnN0IFFQb2ludCAmcG9zKSB7Ci0gIGlmKG15X2ltYWdlLT53aWR0aCgpID09IGhlaWdodCgpKSB7Ci0gICAgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl85MCkKLSAgICAgIG15X21vdXNlX3BvcyA9IFFQb2ludChoZWlnaHQoKS1wb3MueSgpLCBwb3MueCgpKTsKLSAgICBlbHNlIGlmIChzY3JlZW5Sb3RhdGlvbiA9PSBTRExfUVRfUk9UQVRJT05fMjcwKQotICAgICAgbXlfbW91c2VfcG9zID0gUVBvaW50KHBvcy55KCksIHdpZHRoKCktcG9zLngoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgbXlfbW91c2VfcG9zID0gcG9zOwotICB9Ci19Ci0KLXZvaWQgU0RMX1FXaW46Om1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICplKSB7Ci0gIFF0OjpCdXR0b25TdGF0ZSBidXR0b24gPSBlLT5idXR0b24oKTsKLSAgaW50IHNkbHN0YXRlID0gMDsKLSAgaWYoIChidXR0b24gJiBRdDo6TGVmdEJ1dHRvbikpIHsKLSAgICBzZGxzdGF0ZSB8PSBTRExfQlVUVE9OX0xNQVNLOwotICB9Ci0gIGlmKCAoYnV0dG9uICYgUXQ6OlJpZ2h0QnV0dG9uKSkgewotICAgIHNkbHN0YXRlIHw9IFNETF9CVVRUT05fUk1BU0s7Ci0gIH0KLSAgaWYoIChidXR0b24gJiBRdDo6TWlkQnV0dG9uKSkgewotICAgIHNkbHN0YXRlIHw9IFNETF9CVVRUT05fTU1BU0s7Ci0gIH0KLSAgc2V0TW91c2VQb3MoZS0+cG9zKCkpOwotICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKHNkbHN0YXRlLCAwLCBteV9tb3VzZV9wb3MueCgpLCBteV9tb3VzZV9wb3MueSgpKTsKLX0KLQotdm9pZCBTRExfUVdpbjo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICplKSB7Ci0gIG1vdXNlTW92ZUV2ZW50KGUpOwotICBRdDo6QnV0dG9uU3RhdGUgYnV0dG9uID0gZS0+YnV0dG9uKCk7Ci0gIFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsCi0JCQkgKGJ1dHRvbiAmIFF0OjpMZWZ0QnV0dG9uKSA/IDEgOgotCQkJICgoYnV0dG9uICYgUXQ6OlJpZ2h0QnV0dG9uKSA/IDIgOiAzKSwKLQkJCSBteV9tb3VzZV9wb3MueCgpLCBteV9tb3VzZV9wb3MueSgpKTsKLX0KLQotdm9pZCBTRExfUVdpbjo6bW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQgKmUpIHsKLSAgc2V0TW91c2VQb3MoZS0+cG9zKCkpOwotICBRdDo6QnV0dG9uU3RhdGUgYnV0dG9uID0gZS0+YnV0dG9uKCk7Ci0gIFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELAotCQkJIChidXR0b24gJiBRdDo6TGVmdEJ1dHRvbikgPyAxIDoKLQkJCSAoKGJ1dHRvbiAmIFF0OjpSaWdodEJ1dHRvbikgPyAyIDogMyksCi0JCQkgbXlfbW91c2VfcG9zLngoKSwgbXlfbW91c2VfcG9zLnkoKSk7Ci0gIG15X21vdXNlX3BvcyA9IFFQb2ludCgtMSwgLTEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWdzX2Zhc3RSb3RhdGVCbGl0XzMgKCB1bnNpZ25lZCBzaG9ydCAqZmIsCi0JCSAgICAgIHVuc2lnbmVkIHNob3J0ICpiaXRzLAotCQkgICAgICBjb25zdCBRUmVjdCYgcmVjdCApCi17Ci0gIC8vIEZJWE1FOiB0aGlzIG9ubHkgd29ya3MgY29ycmVjdGx5IGZvciAyNDB4MzIwIGRpc3BsYXlzCi0gIGludCBzdGFydHgsIHN0YXJ0eTsKLSAgaW50IHdpZHRoLCBoZWlnaHQ7Ci0gIAotICBzdGFydHggPSByZWN0LmxlZnQoKSA+PiAxOwotICBzdGFydHkgPSByZWN0LnRvcCgpID4+IDE7Ci0gIHdpZHRoICA9ICgocmVjdC5yaWdodCgpIC0gcmVjdC5sZWZ0KCkpID4+IDEpICsgMjsKLSAgaGVpZ2h0ID0gKChyZWN0LmJvdHRvbSgpIC0gcmVjdC50b3AoKSkgPj4gMSkgKyAyOwotCi0gIGlmKChzdGFydHgrd2lkdGgpID4gMTIwKSB7Ci0gICAgd2lkdGggPSAxMjAgLSBzdGFydHg7IC8vIGF2b2lkIGhvcml6b250YWwgb3ZlcmZsb3cKLSAgfQotICBpZigoc3RhcnR5K2hlaWdodCkgPiAxNjApIHsgCi0gICAgaGVpZ2h0ID0gMTYwIC0gc3RhcnR5OyAvLyBhdm9pZCB2ZXJ0aWNhbCBvdmVyZmxvdwotICB9Ci0KLSAgdWxvbmcgKnNwMSwgKnNwMiwgKmRwMSwgKmRwMjsKLSAgdWxvbmcgc3RvcCwgc2JvdCwgZHRvcCwgZGJvdDsgICAgCi0gIAotICBzcDEgPSAodWxvbmcqKWJpdHMgKyBzdGFydHggKyBzdGFydHkqMjQwOwotICBzcDIgPSBzcDEgKyAxMjA7Ci0gIGRwMSA9ICh1bG9uZyAqKWZiICsgKDE1OSAtIHN0YXJ0eSkgKyBzdGFydHgqMzIwOwotICBkcDIgPSBkcDEgKyAxNjA7Ci0gIGludCByb3dhZGQgPSAoLTMyMCp3aWR0aCkgLSAxOwotICBpbnQgcm93YWRkMiA9IDI0MCAtIHdpZHRoOwotICAvLyB0cmFuc2ZlciBpbiBjZWxscyBvZiAyeDIgcGl4ZWxzIGluIHdvcmRzCi0gIGZvciAoaW50IHk9MDsgeTxoZWlnaHQ7IHkrKykgewotICAgIGZvciAoaW50IHg9MDsgeDx3aWR0aDsgeCsrKSB7Ci0gICAgICAvLyByZWFkIHNvdXJjZSBwaXhlbHMKLSAgICAgIHN0b3AgPSAqc3AxOwotICAgICAgc2JvdCA9ICpzcDI7Ci0gICAgICAvLyByb3RhdGUgcGl4ZWxzCi0gICAgICBkdG9wID0gKHNib3QgJiAweGZmZmYpICsgKChzdG9wICYgMHhmZmZmKTw8MTYpOwotICAgICAgZGJvdCA9ICgoc2JvdCAmIDB4ZmZmZjAwMDApPj4xNikgKyAoc3RvcCAmIDB4ZmZmZjAwMDApOwotICAgICAgLy8gd3JpdGUgdG8gZnJhbWVidWZmZXIKLSAgICAgICpkcDEgPSBkdG9wOwotICAgICAgKmRwMiA9IGRib3Q7Ci0gICAgICAvLyB1cGRhdGUgc291cmNlIHB0cnMKLSAgICAgIHNwMSsrOyBzcDIrKzsKLSAgICAgIC8vIHVwZGF0ZSBkZXN0IHB0cnMgLSAyIHBpeCBhdCBhIHRpbWUKLSAgICAgIGRwMSArPSAzMjA7Ci0gICAgICBkcDIgKz0gMzIwOwotICAgIH0KLSAgICAvLyBhZGp1c3Qgc3JjIHB0cnMgLSBza2lwIGEgcm93IGFzIHdlIHdvcmsgaW4gcGFpcnMKLSAgICBzcDEgKz0gcm93YWRkMjsKLSAgICBzcDIgKz0gcm93YWRkMjsKLSAgICAvLyBhZGp1c3QgZGVzdCBwdHJzIGZvciByb3RhdGlvbgotICAgIGRwMSArPSByb3dhZGQ7Ci0gICAgZHAyICs9IHJvd2FkZDsKLSAgfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWdzX2Zhc3RSb3RhdGVCbGl0XzEgKCB1bnNpZ25lZCBzaG9ydCAqZmIsCi0JCSAgICAgIHVuc2lnbmVkIHNob3J0ICpiaXRzLAotCQkgICAgICBjb25zdCBRUmVjdCYgcmVjdCApIHsKLSAgLy8gRklYTUU6IHRoaXMgb25seSB3b3JrcyBjb3JyZWN0bHkgZm9yIDI0MHgzMjAgZGlzcGxheXMKLSAgaW50IHN0YXJ0eCwgc3RhcnR5OwotICBpbnQgd2lkdGgsIGhlaWdodDsKLQotICBzdGFydHggPSByZWN0LmxlZnQoKSA+PiAxOwotICBzdGFydHkgPSByZWN0LnRvcCgpID4+IDE7Ci0gIHdpZHRoICA9ICgocmVjdC5yaWdodCgpIC0gcmVjdC5sZWZ0KCkpID4+IDEpICsgMjsKLSAgaGVpZ2h0ID0gKChyZWN0LmJvdHRvbSgpIC0gcmVjdC50b3AoKSkgPj4gMSkgKyAyOwotCi0gIGlmKChzdGFydHgrd2lkdGgpID4gMTIwKSB7Ci0gICAgd2lkdGggPSAxMjAgLSBzdGFydHg7IC8vIGF2b2lkIGhvcml6b250YWwgb3ZlcmZsb3cKLSAgfQotICBpZigoc3RhcnR5K2hlaWdodCkgPiAxNjApIHsgCi0gICAgaGVpZ2h0ID0gMTYwIC0gc3RhcnR5OyAvLyBhdm9pZCB2ZXJ0aWNhbCBvdmVyZmxvdwotICB9Ci0KLSAgdWxvbmcgKnNwMSwgKnNwMiwgKmRwMSwgKmRwMjsKLSAgdWxvbmcgc3RvcCwgc2JvdCwgZHRvcCwgZGJvdDsgICAgCi0gIGZiICs9IDMyMCoyMzk7IC8vIE1vdmUgImZiIiB0byB0b3AgbGVmdCBjb3JuZXIKLSAgc3AxID0gKHVsb25nKiliaXRzICsgc3RhcnR4ICsgc3RhcnR5KjI0MDsKLSAgc3AyID0gc3AxICsgMTIwOwotICBkcDEgPSAodWxvbmcqKWZiIC0gc3RhcnR4ICogMzIwIC0gc3RhcnR5OwotICBkcDIgPSBkcDEgLSAxNjA7Ci0gIGludCByb3dhZGQgPSAoMzIwKndpZHRoKSArIDE7Ci0gIGludCByb3dhZGQyID0gMjQwIC0gd2lkdGg7Ci0gIC8vIHRyYW5zZmVyIGluIGNlbGxzIG9mIDJ4MiBwaXhlbHMgaW4gd29yZHMKLSAgZm9yIChpbnQgeT0wOyB5PGhlaWdodDsgeSsrKSB7Ci0gICAgZm9yIChpbnQgeD0wOyB4PHdpZHRoOyB4KyspIHsKLSAgICAgIC8vIHJlYWQKLSAgICAgIHN0b3AgPSAqc3AxOwotICAgICAgc2JvdCA9ICpzcDI7Ci0gICAgICAvLyByb3RhdGUKLSAgICAgIGR0b3AgPSAoc3RvcCAmIDB4ZmZmZikgKyAoKHNib3QgJiAweGZmZmYpPDwxNik7Ci0gICAgICBkYm90ID0gKChzdG9wICYgMHhmZmZmMDAwMCk+PjE2KSArIChzYm90ICYgMHhmZmZmMDAwMCk7Ci0gICAgICAvLyB3cml0ZQotICAgICAgKmRwMSA9IGR0b3A7Ci0gICAgICAqZHAyID0gZGJvdDsKLSAgICAgIC8vIHVwZGF0ZSBzb3VyY2UgcHRycwotICAgICAgc3AxKys7IHNwMisrOwotICAgICAgLy8gdXBkYXRlIGRlc3QgcHRycyAtIDIgcGl4IGF0IGEgdGltZQotICAgICAgZHAxIC09IDMyMDsKLSAgICAgIGRwMiAtPSAzMjA7Ci0gICAgfQotICAgIC8vIGFkanVzdCBzcmMgcHRycyAtIHNraXAgYSByb3cgYXMgd2Ugd29yayBpbiBwYWlycwotICAgIHNwMSArPSByb3dhZGQyOwotICAgIHNwMiArPSByb3dhZGQyOwotICAgIC8vIGFkanVzdCBkZXN0IHB0cnMgZm9yIHJvdGF0aW9uCi0gICAgZHAxICs9IHJvd2FkZDsKLSAgICBkcDIgKz0gcm93YWRkOwotICB9Ci19Ci0KLS8vIGRlc2t0b3AsIFNMLUEzMDAgZXRjCi1ib29sIFNETF9RV2luOjpyZXBhaW50Um90YXRpb24wKGNvbnN0IFFSZWN0JiByZWN0KSB7Ci0gIGlmKG15X2ltYWdlLT53aWR0aCgpID09IHdpZHRoKCkpIHsKLSAgICB1Y2hhciAqZmIgPSAodWNoYXIqKW15X3BhaW50ZXItPmZyYW1lQnVmZmVyKCk7Ci0gICAgdWNoYXIgKmJ1ZiA9ICh1Y2hhciopbXlfaW1hZ2UtPmJpdHMoKTsKLSAgICBpZihyZWN0ID09IG15X2ltYWdlLT5yZWN0KCkpIHsKLSAgICAgIFNETF9tZW1jcHkoZmIsIGJ1Ziwgd2lkdGgoKSpoZWlnaHQoKSoyKTsKLSAgICB9IGVsc2UgewotICAgICAgaW50IGggPSByZWN0LmhlaWdodCgpOwotICAgICAgaW50IHdkID0gcmVjdC53aWR0aCgpPDwxOwotICAgICAgaW50IGZibGluZWFkZCA9IG15X3BhaW50ZXItPmxpbmVTdGVwKCk7Ci0gICAgICBpbnQgYnVmbGluZWFkZCA9IG15X2ltYWdlLT5ieXRlc1BlckxpbmUoKTsKLSAgICAgIGZiICArPSAocmVjdC5sZWZ0KCk8PDEpICsgcmVjdC50b3AoKSAqIG15X3BhaW50ZXItPmxpbmVTdGVwKCk7Ci0gICAgICBidWYgKz0gKHJlY3QubGVmdCgpPDwxKSArIHJlY3QudG9wKCkgKiBteV9pbWFnZS0+Ynl0ZXNQZXJMaW5lKCk7Ci0gICAgICB3aGlsZShoLS0pIHsKLQlTRExfbWVtY3B5KGZiLCBidWYsIHdkKTsKLQlmYiArPSBmYmxpbmVhZGQ7Ci0JYnVmICs9IGJ1ZmxpbmVhZGQ7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsgLy8gRklYTUU6IExhbmRzY2FwZQotICB9Ci0jaWZkZWYgX19pMzg2X18KLSAgbXlfcGFpbnRlci0+ZmlsbFJlY3QoIHJlY3QsIFFCcnVzaCggUXQ6Ok5vQnJ1c2ggKSApOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0gIAotLy8gU2hhcnAgWmF1cnVzIFNMLTU1MDAgZXRjIAotYm9vbCBTRExfUVdpbjo6cmVwYWludFJvdGF0aW9uMyhjb25zdCBRUmVjdCYgcmVjdCkgewotICBpZihteV9pbWFnZS0+d2lkdGgoKSA9PSB3aWR0aCgpKSB7Ci0gICAgdXNob3J0ICpmYiA9ICh1c2hvcnQqKW15X3BhaW50ZXItPmZyYW1lQnVmZmVyKCk7Ci0gICAgdXNob3J0ICpidWYgPSAodXNob3J0KilteV9pbWFnZS0+Yml0cygpOwotICAgIGdzX2Zhc3RSb3RhdGVCbGl0XzMoZmIsIGJ1ZiwgcmVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gbGFuZHNjYXBlIG1vZGUKLSAgICBpZiAoc2NyZWVuUm90YXRpb24gPT0gU0RMX1FUX1JPVEFUSU9OXzkwKSB7Ci0gICAgICB1Y2hhciAqZmIgPSAodWNoYXIqKW15X3BhaW50ZXItPmZyYW1lQnVmZmVyKCk7Ci0gICAgICB1Y2hhciAqYnVmID0gKHVjaGFyKilteV9pbWFnZS0+Yml0cygpOwotICAgICAgaWYocmVjdCA9PSBteV9pbWFnZS0+cmVjdCgpKSB7Ci0JU0RMX21lbWNweShmYiwgYnVmLCB3aWR0aCgpKmhlaWdodCgpKjIpOwotICAgICAgfSBlbHNlIHsKLQlpbnQgaCA9IHJlY3QuaGVpZ2h0KCk7Ci0JaW50IHdkID0gcmVjdC53aWR0aCgpPDwxOwotCWludCBmYmxpbmVhZGQgPSBteV9wYWludGVyLT5saW5lU3RlcCgpOwotCWludCBidWZsaW5lYWRkID0gbXlfaW1hZ2UtPmJ5dGVzUGVyTGluZSgpOwotCWZiICArPSAocmVjdC5sZWZ0KCk8PDEpICsgcmVjdC50b3AoKSAqIG15X3BhaW50ZXItPmxpbmVTdGVwKCk7Ci0JYnVmICs9IChyZWN0LmxlZnQoKTw8MSkgKyByZWN0LnRvcCgpICogbXlfaW1hZ2UtPmJ5dGVzUGVyTGluZSgpOwotCXdoaWxlKGgtLSkgewotCSAgU0RMX21lbWNweShmYiwgYnVmLCB3ZCk7Ci0JICBmYiArPSBmYmxpbmVhZGQ7Ci0JICBidWYgKz0gYnVmbGluZWFkZDsKLQl9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChzY3JlZW5Sb3RhdGlvbiA9PSBTRExfUVRfUk9UQVRJT05fMjcwKSB7Ci0gICAgICBpbnQgaCA9IHJlY3QuaGVpZ2h0KCk7Ci0gICAgICBpbnQgd2QgPSByZWN0LndpZHRoKCk7Ci0gICAgICBpbnQgZmJsaW5lYWRkID0gbXlfcGFpbnRlci0+bGluZVN0ZXAoKSAtIChyZWN0LndpZHRoKCkgPDwgMSk7Ci0gICAgICBpbnQgYnVmbGluZWFkZCA9IG15X2ltYWdlLT5ieXRlc1BlckxpbmUoKSAtIChyZWN0LndpZHRoKCkgPDwgMSk7Ci0gICAgICBpbnQgdzsKLQotICAgICAgdWNoYXIgKmZiID0gKHVjaGFyKilteV9wYWludGVyLT5mcmFtZUJ1ZmZlcigpOwotICAgICAgdWNoYXIgKmJ1ZiA9ICh1Y2hhciopbXlfaW1hZ2UtPmJpdHMoKTsKLSAgICAgICAgCi0gICAgICBmYiArPSAoKG15X3BhaW50ZXItPndpZHRoKCkgLSAocmVjdC50b3AoKSArIHJlY3QuaGVpZ2h0KCkpKSAqIAotCSAgICAgbXlfcGFpbnRlci0+bGluZVN0ZXAoKSkgKyAoKG15X3BhaW50ZXItPmhlaWdodCgpIC0gKChyZWN0LmxlZnQoKSArIAotCQkJCQkJCQkgIHJlY3Qud2lkdGgoKSkpKSA8PCAxKTsKLQotICAgICAgYnVmICs9IG15X2ltYWdlLT5ieXRlc1BlckxpbmUoKSAqIChyZWN0LnRvcCgpICsgcmVjdC5oZWlnaHQoKSkgLQotCSgoKG15X2ltYWdlLT53aWR0aCgpIC0gKHJlY3QubGVmdCgpICsgcmVjdC53aWR0aCgpKSkgPDwgMSkgKyAyKTsKLQotICAgICAgd2hpbGUoaC0tKSB7Ci0JdyA9IHdkOwotCXdoaWxlKHctLSkgKigodW5zaWduZWQgc2hvcnQqKWZiKSsrID0gKigodW5zaWduZWQgc2hvcnQqKWJ1ZiktLTsKLQlmYiArPSBmYmxpbmVhZGQ7Ci0JYnVmIC09IGJ1ZmxpbmVhZGQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBpcGFxIDM4MDAuLi4KLWJvb2wgU0RMX1FXaW46OnJlcGFpbnRSb3RhdGlvbjEoY29uc3QgUVJlY3QmIHJlY3QpIHsKLSAgaWYobXlfaW1hZ2UtPndpZHRoKCkgPT0gd2lkdGgoKSkgewotICAgIHVzaG9ydCAqZmIgPSAodXNob3J0KilteV9wYWludGVyLT5mcmFtZUJ1ZmZlcigpOwotICAgIHVzaG9ydCAqYnVmID0gKHVzaG9ydCopbXlfaW1hZ2UtPmJpdHMoKTsKLSAgICBnc19mYXN0Um90YXRlQmxpdF8xKGZiLCBidWYsIHJlY3QpOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsgLy8gRklYTUU6IGxhbmRzY2FwZSBtb2RlCi0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU0RMX1FXaW46OnJlcGFpbnRSZWN0KGNvbnN0IFFSZWN0JiByZWN0KSB7Ci0gIGlmKCFteV9wYWludGVyIHx8ICFyZWN0LndpZHRoKCkgfHwgIXJlY3QuaGVpZ2h0KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgCi0gIGlmKFFQaXhtYXA6OmRlZmF1bHREZXB0aCgpID09IDE2KSB7Ci0gICAgc3dpdGNoKG15X3BhaW50ZXItPnRyYW5zZm9ybU9yaWVudGF0aW9uKCkpIHsKLSAgICBjYXNlIDM6Ci0gICAgICBpZihyZXBhaW50Um90YXRpb24zKHJlY3QpKSB7IHJldHVybjsgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGlmKHJlcGFpbnRSb3RhdGlvbjEocmVjdCkpIHsgcmV0dXJuOyAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAwOgotICAgICAgaWYocmVwYWludFJvdGF0aW9uMChyZWN0KSkgeyByZXR1cm47ICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gCi0gIG15X3BhaW50ZXItPmRyYXdJbWFnZShyZWN0LnRvcExlZnQoKSwgKm15X2ltYWdlLCByZWN0KTsKLX0KLQotLy8gVGhpcyBwYWludHMgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIHRoZSBzY3JlZW4sIHdoZW4gZGVzaXJlZC4gCi12b2lkIFNETF9RV2luOjpwYWludEV2ZW50KFFQYWludEV2ZW50ICpldikgeyAgCi0gIGlmKG15X2ltYWdlKSB7Ci0gICAgbG9ja1NjcmVlbih0cnVlKTsKLSAgICByZXBhaW50UmVjdChldi0+cmVjdCgpKTsKLSAgICB1bmxvY2tTY3JlZW4oKTsKLSAgfQotfSAgCi0KLS8qIEZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBhIGtleWJvYXJkIHRyYW5zaXRpb24gYW5kIHF1ZXVlIHRoZSBrZXkgZXZlbnQKLSAqIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgdGFibGUgYWx0aG91Z2ggdGhpcyBtZXRob2QgaXNuJ3QgZXhhY3RseQotICogc2xvdy4KLSAqLwotdm9pZCBTRExfUVdpbjo6UXVldWVLZXkoUUtleUV2ZW50ICplLCBpbnQgcHJlc3NlZCkKLXsgIAotICBTRExfa2V5c3ltIGtleXN5bTsKLSAgaW50IHNjYW5jb2RlID0gZS0+a2V5KCk7Ci0gIC8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCi0gIGlmKHNjYW5jb2RlID49ICdBJyAmJiBzY2FuY29kZSA8PSAnWicpIHsKLSAgICAvLyBRdCBzZW5kcyB1cHBlcmNhc2UsIFNETCB3YW50cyBsb3dlcmNhc2UKLSAgICBrZXlzeW0uc3ltID0gc3RhdGljX2Nhc3Q8U0RMS2V5PihzY2FuY29kZSArIDMyKTsKLSAgfSBlbHNlIGlmKHNjYW5jb2RlICA+PSAweDEwMDApIHsKLSAgICAvLyBTcGVjaWFsIGtleXMKLSAgICBzd2l0Y2goc2NhbmNvZGUpIHsKLSAgICBjYXNlIFF0OjpLZXlfRXNjYXBlOiBzY2FuY29kZSA9IFNETEtfRVNDQVBFOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfVGFiOiBzY2FuY29kZSA9IFNETEtfVEFCOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfQmFja3NwYWNlOiBzY2FuY29kZSA9IFNETEtfQkFDS1NQQUNFOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfUmV0dXJuOiBzY2FuY29kZSA9IFNETEtfUkVUVVJOOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRW50ZXI6IHNjYW5jb2RlID0gU0RMS19LUF9FTlRFUjsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X0luc2VydDogc2NhbmNvZGUgPSBTRExLX0lOU0VSVDsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X0RlbGV0ZTogc2NhbmNvZGUgPSBTRExLX0RFTEVURTsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X1BhdXNlOiBzY2FuY29kZSA9IFNETEtfUEFVU0U7IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9QcmludDogc2NhbmNvZGUgPSBTRExLX1BSSU5UOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfU3lzUmVxOiBzY2FuY29kZSA9IFNETEtfU1lTUkVROyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfSG9tZTogc2NhbmNvZGUgPSBTRExLX0hPTUU7IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9FbmQ6IHNjYW5jb2RlID0gU0RMS19FTkQ7IGJyZWFrOwotICAgIC8vIFdlIHdhbnQgdGhlIGNvbnRyb2wga2V5cyB0byByb3RhdGUgd2l0aCB0aGUgc2NyZWVuCi0gICAgY2FzZSBRdDo6S2V5X0xlZnQ6IAotICAgICAgICBpZiAoc2NyZWVuUm90YXRpb24gPT0gU0RMX1FUX1JPVEFUSU9OXzkwKSBzY2FuY29kZSA9IFNETEtfVVA7Ci0gICAgICAgIGVsc2UgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl8yNzApIHNjYW5jb2RlID0gU0RMS19ET1dOOwotICAgICAgICBlbHNlIHNjYW5jb2RlID0gU0RMS19MRUZUOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfVXA6IAotICAgICAgICBpZiAoc2NyZWVuUm90YXRpb24gPT0gU0RMX1FUX1JPVEFUSU9OXzkwKSBzY2FuY29kZSA9IFNETEtfUklHSFQ7Ci0gICAgICAgIGVsc2UgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl8yNzApIHNjYW5jb2RlID0gU0RMS19MRUZUOwotICAgICAgICBlbHNlIHNjYW5jb2RlID0gU0RMS19VUDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X1JpZ2h0OiAKLSAgICAgICAgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl85MCkgc2NhbmNvZGUgPSBTRExLX0RPV047Ci0gICAgICAgIGVsc2UgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl8yNzApIHNjYW5jb2RlID0gU0RMS19VUDsKLSAgICAgICAgZWxzZSBzY2FuY29kZSA9IFNETEtfUklHSFQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9Eb3duOgotICAgICAgICBpZiAoc2NyZWVuUm90YXRpb24gPT0gU0RMX1FUX1JPVEFUSU9OXzkwKSBzY2FuY29kZSA9IFNETEtfTEVGVDsKLSAgICAgICAgZWxzZSBpZiAoc2NyZWVuUm90YXRpb24gPT0gU0RMX1FUX1JPVEFUSU9OXzI3MCkgc2NhbmNvZGUgPSBTRExLX1JJR0hUOwotICAgICAgICBlbHNlIHNjYW5jb2RlID0gU0RMS19ET1dOOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfUHJpb3I6IHNjYW5jb2RlID0gU0RMS19QQUdFVVA7IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9OZXh0OiBzY2FuY29kZSA9IFNETEtfUEFHRURPV047IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9TaGlmdDogc2NhbmNvZGUgPSBTRExLX0xTSElGVDsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X0NvbnRyb2w6IHNjYW5jb2RlID0gU0RMS19MQ1RSTDsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X01ldGE6IHNjYW5jb2RlID0gU0RMS19MTUVUQTsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X0FsdDogc2NhbmNvZGUgPSBTRExLX0xBTFQ7IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9DYXBzTG9jazogc2NhbmNvZGUgPSBTRExLX0NBUFNMT0NLOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfTnVtTG9jazogc2NhbmNvZGUgPSBTRExLX05VTUxPQ0s7IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9TY3JvbGxMb2NrOiBzY2FuY29kZSA9IFNETEtfU0NST0xMT0NLOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRjE6IHNjYW5jb2RlID0gU0RMS19GMTsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X0YyOiBzY2FuY29kZSA9IFNETEtfRjI7IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9GMzogc2NhbmNvZGUgPSBTRExLX0YzOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRjQ6IHNjYW5jb2RlID0gU0RMS19GNDsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X0Y1OiBzY2FuY29kZSA9IFNETEtfRjU7IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9GNjogc2NhbmNvZGUgPSBTRExLX0Y2OyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRjc6IHNjYW5jb2RlID0gU0RMS19GNzsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X0Y4OiBzY2FuY29kZSA9IFNETEtfRjg7IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9GOTogc2NhbmNvZGUgPSBTRExLX0Y5OyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRjEwOiBzY2FuY29kZSA9IFNETEtfRjEwOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRjExOiBzY2FuY29kZSA9IFNETEtfRjExOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRjEyOiBzY2FuY29kZSA9IFNETEtfRjEyOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRjEzOiBzY2FuY29kZSA9IFNETEtfRjEzOyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRjE0OiBzY2FuY29kZSA9IFNETEtfRjE0OyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfRjE1OiBzY2FuY29kZSA9IFNETEtfRjE1OyBicmVhazsKLSAgICBjYXNlIFF0OjpLZXlfU3VwZXJfTDogc2NhbmNvZGUgPSBTRExLX0xTVVBFUjsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X1N1cGVyX1I6IHNjYW5jb2RlID0gU0RMS19SU1VQRVI7IGJyZWFrOwotICAgIGNhc2UgUXQ6OktleV9NZW51OiBzY2FuY29kZSA9IFNETEtfTUVOVTsgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X0hlbHA6IHNjYW5jb2RlID0gU0RMS19IRUxQOyBicmVhazsKLQotICAgIGNhc2UgUXQ6OktleV9GMzM6Ci0gICAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhhY2sgdG8gZW5hYmxlIHRoZSBPSyBrZXkgb24KLSAgICAgIC8vIFphdXJpaSBkZXZpY2VzLiBTRExLX1JFVFVSTiBpcyBhIHN1aXRhYmxlIGtleSB0byB1c2UKLSAgICAgIC8vIHNpbmNlIGl0IG9mdGVuIGlzIHVzZWQgYXMgc3VjaC4KLSAgICAgIC8vICAgICBkYXZpZEBoZWRib3Iub3JnCi0gICAgICBzY2FuY29kZSA9IFNETEtfUkVUVVJOOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNjYW5jb2RlID0gU0RMS19VTktOT1dOOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGtleXN5bS5zeW0gPSBzdGF0aWNfY2FzdDxTRExLZXk+KHNjYW5jb2RlKTsgICAgCi0gIH0gZWxzZSB7Ci0gICAga2V5c3ltLnN5bSA9IHN0YXRpY19jYXN0PFNETEtleT4oc2NhbmNvZGUpOyAgICAKLSAgfQotICBrZXlzeW0uc2NhbmNvZGUgPSBzY2FuY29kZTsKLSAga2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsKLSAgQnV0dG9uU3RhdGUgc3QgPSBlLT5zdGF0ZSgpOwotICBpZiggKHN0ICYgU2hpZnRCdXR0b24pICkgICB7IGtleXN5bS5tb2QgPSBzdGF0aWNfY2FzdDxTRExNb2Q+KGtleXN5bS5tb2QgfCBLTU9EX0xTSElGVCk7ICB9Ci0gIGlmKCAoc3QgJiBDb250cm9sQnV0dG9uKSApIHsga2V5c3ltLm1vZCA9IHN0YXRpY19jYXN0PFNETE1vZD4oa2V5c3ltLm1vZCB8IEtNT0RfTENUUkwpOyAgfQotICBpZiggKHN0ICYgQWx0QnV0dG9uKSApICAgICB7IGtleXN5bS5tb2QgPSBzdGF0aWNfY2FzdDxTRExNb2Q+KGtleXN5bS5tb2QgfCBLTU9EX0xBTFQpOyAgfQotICBpZiAoIFNETF9UcmFuc2xhdGVVTklDT0RFICkgewotICAgIFFDaGFyIHFjaGFyID0gZS0+dGV4dCgpWzBdOwotICAgIGtleXN5bS51bmljb2RlID0gcWNoYXIudW5pY29kZSgpOwotICB9IGVsc2UgewotICAgIGtleXN5bS51bmljb2RlID0gMDsKLSAgfQotCi0gIC8qIE5VTUxPQ0sgYW5kIENBUFNMT0NLIGFyZSBpbXBsZW1lbnRlZCBhcyBkb3VibGUtcHJlc3NlcyBpbiByZWFsaXR5ICovCi0gIC8vCWlmICggKGtleXN5bS5zeW0gPT0gU0RMS19OVU1MT0NLKSB8fCAoa2V5c3ltLnN5bSA9PSBTRExLX0NBUFNMT0NLKSApIHsKLSAgLy8JCXByZXNzZWQgPSAxOwotICAvLwl9Ci0KLSAgLyogUXVldWUgdGhlIGtleSBldmVudCAqLwotICBpZiAoIHByZXNzZWQgKSB7Ci0gICAgU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgJmtleXN5bSk7Ci0gIH0gZWxzZSB7Ci0gICAgU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsICZrZXlzeW0pOwotICB9Ci19Ci0KLXZvaWQgU0RMX1FXaW46OnNldEZ1bGxzY3JlZW4oYm9vbCBmc19vbikgewotICBteV9oYXNfZnVsbHNjcmVlbiA9IGZhbHNlOwotICBlbmFibGVGdWxsc2NyZWVuKCk7Ci19Ci0KLXZvaWQgU0RMX1FXaW46OmVuYWJsZUZ1bGxzY3JlZW4oKSB7Ci0gIC8vIE1ha2Ugc3VyZSBzaXplIGlzIGNvcnJlY3QKLSAgaWYoIW15X2hhc19mdWxsc2NyZWVuKSB7Ci0gICAgc2V0Rml4ZWRTaXplKHFBcHAtPmRlc2t0b3AoKS0+c2l6ZSgpKTsKLSAgICAvLyBUaGlzIGNhbGwgaXMgbmVlZGVkIGJlY2F1c2Ugc2hvd0Z1bGxTY3JlZW4gd29uJ3Qgd29yawotICAgIC8vIGNvcnJlY3RseSBpZiB0aGUgd2lkZ2V0IGFscmVhZHkgY29uc2lkZXJzIGl0c2VsZiB0byBiZSBmdWxsc2NyZWVuLgotICAgIHNob3dOb3JtYWwoKTsKLSAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHNob3dOb3JtYWwoKSBmb3JjZWZ1bGx5IGNoYW5nZXMgdGhlIHdpbmRvdwotICAgIC8vIHN0eWxlIHRvIFdTVHlsZV9Ub3BMZXZlbC4KLSAgICBzZXRXRmxhZ3MoV1N0eWxlX0N1c3RvbWl6ZSB8IFdTdHlsZV9Ob0JvcmRlcik7Ci0gICAgLy8gRW5hYmxlIGZ1bGxzY3JlZW4uCi0gICAgc2hvd0Z1bGxTY3JlZW4oKTsKLSAgICBteV9oYXNfZnVsbHNjcmVlbiA9IHRydWU7Ci0gIH0KLX0KLQotYm9vbCBTRExfUVdpbjo6bG9ja1NjcmVlbihib29sIGZvcmNlKSB7Ci0gIGlmKCFteV9wYWludGVyKSB7Ci0gICAgaWYoZm9yY2UgfHwgKGlzVmlzaWJsZSgpICYmIGlzQWN0aXZlV2luZG93KCkpKSB7Ci0gICAgICBteV9wYWludGVyID0gbmV3IFFEaXJlY3RQYWludGVyKHRoaXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIG15X2xvY2tlZCsrOyAvLyBJbmNyZWF0ZSBsb2NrIHJlZmNvdW50Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNETF9RV2luOjp1bmxvY2tTY3JlZW4oKSB7Ci0gIGlmKG15X2xvY2tlZCA+IDApIHsKLSAgICBteV9sb2NrZWQtLTsgLy8gZGVjcmVhc2UgbG9jayByZWZjb3VudDsKLSAgfQotICBpZighbXlfbG9ja2VkICYmIG15X3BhaW50ZXIpIHsKLSAgICBteV9wYWludGVyLT5lbmQoKTsKLSAgICBkZWxldGUgbXlfcGFpbnRlcjsKLSAgICBteV9wYWludGVyID0gMDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX1FXaW4uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9RV2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjM2ZGYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX1FXaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX1FXaW5faAotI2RlZmluZSBfU0RMX1FXaW5faAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPHFpbWFnZS5oPgotI2luY2x1ZGUgPHFwaXhtYXAuaD4KLSNpbmNsdWRlIDxxd2lkZ2V0Lmg+Ci0jaW5jbHVkZSA8cXBhaW50ZXIuaD4KLSNpbmNsdWRlIDxxZGlyZWN0cGFpbnRlcl9xd3MuaD4KLQotI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotfTsKLQotdHlwZWRlZiBlbnVtIHsgCi0gICAgU0RMX1FUX05PX1JPVEFUSU9OID0gMCwgCi0gICAgU0RMX1FUX1JPVEFUSU9OXzkwLCAKLSAgICBTRExfUVRfUk9UQVRJT05fMjcwIAotfSBzY3JlZW5Sb3RhdGlvblQ7Ci0KLWV4dGVybiBzY3JlZW5Sb3RhdGlvblQgc2NyZWVuUm90YXRpb247Ci0KLWNsYXNzIFNETF9RV2luIDogcHVibGljIFFXaWRnZXQKLXsKLSAgdm9pZCBRdWV1ZUtleShRS2V5RXZlbnQgKmUsIGludCBwcmVzc2VkKTsKLSBwdWJsaWM6Ci0gIFNETF9RV2luKGNvbnN0IFFTaXplJiBzaXplKTsKLSAgdmlydHVhbCB+U0RMX1FXaW4oKTsKLSAgdmlydHVhbCBib29sIHNob3duKHZvaWQpIHsKLSAgICByZXR1cm4gaXNWaXNpYmxlKCk7Ci0gIH0KLSAgLyogSWYgY2FsbGVkLCB0aGUgbmV4dCByZXNpemUgZXZlbnQgd2lsbCBub3QgYmUgZm9yd2FyZGVkIHRvIFNETC4gKi8KLSAgdmlydHVhbCB2b2lkIGluaGliaXRSZXNpemUodm9pZCkgewotICAgIG15X2luaGliaXRfcmVzaXplID0gdHJ1ZTsKLSAgfQotICB2b2lkIHNldEltYWdlKFFJbWFnZSAqaW1hZ2UpOwotICB2b2lkIHNldE9mZnNldChpbnQgeCwgaW50IHkpIHsKLSAgICBteV9vZmZzZXQgPSBRUG9pbnQoeCwgeSk7Ci0gIH0KLSAgdm9pZCBHZXRYWU9mZnNldChpbnQgJngsIGludCAmeSkgewotICAgIHggPSBteV9vZmZzZXQueCgpOwotICAgIHkgPSBteV9vZmZzZXQueSgpOwotICB9Ci0gIFFJbWFnZSAqaW1hZ2Uodm9pZCkgeyByZXR1cm4gbXlfaW1hZ2U7IH0KLSAgCi0gIHZvaWQgc2V0V0ZsYWdzKFdGbGFncyBmbGFncykgewotICAgIFFXaWRnZXQ6OnNldFdGbGFncyhmbGFncyk7Ci0gICAgbXlfZmxhZ3MgPSBmbGFnczsKLSAgfQotICBjb25zdCBRUG9pbnQmIG1vdXNlUG9zKCkgY29uc3QgeyByZXR1cm4gbXlfbW91c2VfcG9zOyB9Ci0gIHZvaWQgc2V0TW91c2VQb3MoY29uc3QgUVBvaW50JiBuZXdwb3MpOwotICB2b2lkIHNldEZ1bGxzY3JlZW4oYm9vbCk7Ci0KLSAgYm9vbCBsb2NrU2NyZWVuKGJvb2wgZm9yY2U9ZmFsc2UpOwotICB2b2lkIHVubG9ja1NjcmVlbigpOwotICB2b2lkIHJlcGFpbnRSZWN0KGNvbnN0IFFSZWN0JiByZWN0KTsKLSBwcm90ZWN0ZWQ6Ci0gIC8qIEhhbmRsZSByZXNpemluZyBvZiB0aGUgd2luZG93ICovCi0gIHZpcnR1YWwgdm9pZCByZXNpemVFdmVudChRUmVzaXplRXZlbnQgKmUpOwotICB2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNFdmVudCAqKTsKLSAgdm9pZCBmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50ICopOwotICB2b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZlbnQgKmUpOwotICB2b2lkIG1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKLSAgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQgKmUpOwotICB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKLSAgdm9pZCBwYWludEV2ZW50KFFQYWludEV2ZW50ICpldik7Ci0gIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKmUpICAgeyBRdWV1ZUtleShlLCAxKTsgfQotICB2b2lkIGtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQgKmUpIHsgUXVldWVLZXkoZSwgMCk7IH0KLSBwcml2YXRlOgotICBib29sIHJlcGFpbnRSb3RhdGlvbjAoY29uc3QgUVJlY3QmIHJlY3QpOwotICBib29sIHJlcGFpbnRSb3RhdGlvbjEoY29uc3QgUVJlY3QmIHJlY3QpOwotICBib29sIHJlcGFpbnRSb3RhdGlvbjMoY29uc3QgUVJlY3QmIHJlY3QpOwotICB2b2lkIGVuYWJsZUZ1bGxzY3JlZW4oKTsKLSAgUURpcmVjdFBhaW50ZXIgKm15X3BhaW50ZXI7Ci0gIFFJbWFnZSAqbXlfaW1hZ2U7Ci0gIGJvb2wgbXlfaW5oaWJpdF9yZXNpemU7Ci0gIFFQb2ludCBteV9vZmZzZXQ7Ci0gIFFQb2ludCBteV9tb3VzZV9wb3M7Ci0gIFdGbGFncyBteV9mbGFnczsKLSAgV0ZsYWdzIG15X2hhc19mdWxsc2NyZWVuOwotICB1bnNpZ25lZCBpbnQgbXlfbG9ja2VkOwotfTsKLQotI2VuZGlmIC8qIF9TRExfUVdpbl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F0b3BpYS9TRExfbG93dmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9sb3d2aWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MwOWEwLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9sb3d2aWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF9sb3d2aWRlb19oCi0jZGVmaW5lIF9TRExfbG93dmlkZW9faAotCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKl90aGlzCi0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotICAvKiBUaGUgbWFpbiB3aW5kb3cgKi8KLSAgU0RMX1FXaW4gKlNETF9XaW47Ci0KLSAgLyogVGhlIGZ1bGxzY3JlZW4gbW9kZSBsaXN0ICovCi0jZGVmaW5lIE5VTV9NT0RFTElTVFMJNAkJLyogOCwgMTYsIDI0LCBhbmQgMzIgYml0cy1wZXItcGl4ZWwgKi8KLSAgaW50IFNETF9udW1tb2Rlc1tOVU1fTU9ERUxJU1RTXTsKLSAgU0RMX1JlY3QgKipTRExfbW9kZWxpc3RbTlVNX01PREVMSVNUU107Ci0KLSAgLyogQSBjb21wbGV0ZWx5IGNsZWFyIGN1cnNvciAqLwotICBXTWN1cnNvciAqQmxhbmtDdXJzb3I7Ci0KLSAgLyogTW91c2Ugc3RhdGUgdmFyaWFibGVzICovCi0gIFVpbnQzMiBsYXN0X2J1dHRvbnM7Ci0gIFFQb2ludCBsYXN0X3BvaW50OwotCi0gIC8qIEtleWJvYXJkIHN0YXRlIHZhcmlhYmxlcyAqLwotICBpbnQga2V5X2ZsaXA7Ci0gIC8vc3RydWN0IGtleV9pbmZvIGtleWluZm9bMl07Ci19OwotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIFNETF9XaW4JCShfdGhpcy0+aGlkZGVuLT5TRExfV2luKQotI2RlZmluZSBzYXZlZF9tb2RlCShfdGhpcy0+aGlkZGVuLT5zYXZlZF9tb2RlKQotI2RlZmluZSBTRExfbnVtbW9kZXMJKF90aGlzLT5oaWRkZW4tPlNETF9udW1tb2RlcykKLSNkZWZpbmUgU0RMX21vZGVsaXN0CShfdGhpcy0+aGlkZGVuLT5TRExfbW9kZWxpc3QpCi0jZGVmaW5lIFNETF9CbGFua0N1cnNvcgkoX3RoaXMtPmhpZGRlbi0+QmxhbmtDdXJzb3IpCi0jZGVmaW5lIGxhc3RfYnV0dG9ucwkoX3RoaXMtPmhpZGRlbi0+bGFzdF9idXR0b25zKQotI2RlZmluZSBsYXN0X3BvaW50CShfdGhpcy0+aGlkZGVuLT5sYXN0X3BvaW50KQotI2RlZmluZSBrZXlfZmxpcAkoX3RoaXMtPmhpZGRlbi0+a2V5X2ZsaXApCi0jZGVmaW5lIGtleWluZm8JCShfdGhpcy0+aGlkZGVuLT5rZXlpbmZvKQotCi0jZW5kaWYgLyogX1NETF9sb3d2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzZXZlbnRzLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX3N5c2V2ZW50cy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MTE0Mi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzZXZlbnRzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8cXBlL3FwZWFwcGxpY2F0aW9uLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIlNETF9lcnJvci5oIgotI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKLSNpbmNsdWRlICJTRExfUVdpbi5oIgotI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgotI2luY2x1ZGUgIlNETF90aW1lci5oIgotCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfc3lzZXZlbnRzX2MuaCIKLQotICAvLyAgc3RhdGljIFNETEtleSBrZXltYXBbMTI4XTsKLS8qIFRoaXMgaXMgc3BlY2lhbCBiZWNhdXNlIHdlIGtub3cgaXQgd2lsbCBiZSBydW4gaW4gYSBsb29wIGluIGEgc2VwYXJhdGUKLSAgIHRocmVhZC4gIE5vcm1hbGx5IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGxvb3AgYXMgbG9uZyBhcyB0aGVyZSBhcmUgaW5wdXQKLSAgIHN0YXRlcyBjaGFuZ2luZywgaS5lLiBuZXcgZXZlbnRzIGFycml2aW5nLgotKi8KLXZvaWQgUVRfUHVtcEV2ZW50cyhfVEhJUykKLXsKLSAgaWYoIXFBcHApIHsKLSAgICByZXR1cm47IAotICB9Ci0gIC8vICBwcmludGYoInByb2Nlc3NpbmcgZXZlbnRzOiAlcFxuIiwgcUFwcCk7Ci0gIC8vcUFwcC0+cHJvY2Vzc09uZUV2ZW50KCk7IC8vIHdhaXQgZm9yIGEgZXZlbnQKLSAgcUFwcC0+cHJvY2Vzc0V2ZW50cygpOyAvLyBhbmQgcHJvY2VzcyBhbGwgb3V0c3RhbmRpbmcgb25lcwotI2lmIDAKLSAgQlZpZXcgKnZpZXc7Ci0JQlJlY3QgYm91bmRzOwotCUJQb2ludCBwb2ludDsKLQl1aW50MzIgYnV0dG9uczsKLQljb25zdCB1aW50MzIgYnV0dG9uX21hc2tzWzNdID0gewotCQlCX1BSSU1BUllfTU9VU0VfQlVUVE9OLAotCQlCX1RFUlRJQVJZX01PVVNFX0JVVFRPTiwgCi0JCUJfU0VDT05EQVJZX01PVVNFX0JVVFRPTiwKLQl9OwotCXVuc2lnbmVkIGludCAgICBpLCBqOwotCi0JLyogQ2hlY2sgb3V0IHRoZSBtb3VzZSBidXR0b25zIGFuZCBwb3NpdGlvbiAoc2xpZ2h0IHJhY2UgY29uZGl0aW9uKSAqLwotCWlmICggU0RMX1dpbi0+TG9jaygpICkgewotCQkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSBoYXZlIG5vIHZpZXcgKi8KLQkJdmlldyA9IFNETF9XaW4tPlZpZXcoKTsKLQkJaWYgKCAhIHZpZXcgKSB7Ci0JCQlTRExfV2luLT5VbmxvY2soKTsKLQkJCXJldHVybjsKLQkJfQotCQlib3VuZHMgPSB2aWV3LT5Cb3VuZHMoKTsKLQkJLyogR2V0IG5ldyBpbnB1dCBzdGF0ZSwgaWYgc3RpbGwgYWN0aXZlICovCi0JCWlmICggU0RMX1dpbi0+SXNBY3RpdmUoKSApIHsKLQkJCWtleV9mbGlwID0gIWtleV9mbGlwOwotCQkJZ2V0X2tleV9pbmZvKCZrZXlpbmZvW2tleV9mbGlwXSk7Ci0JCQl2aWV3LT5HZXRNb3VzZSgmcG9pbnQsICZidXR0b25zLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWtleV9mbGlwID0ga2V5X2ZsaXA7Ci0JCQlwb2ludCA9IGxhc3RfcG9pbnQ7Ci0JCQlidXR0b25zID0gbGFzdF9idXR0b25zOwotCQl9Ci0JCVNETF9XaW4tPlVubG9jaygpOwotCX0gZWxzZSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBJZiBvdXIgdmlldyBpcyBhY3RpdmUsIHdlJ2xsIGZpbmQga2V5IGNoYW5nZXMgaGVyZSAqLwotCWlmICggU0RMX21lbWNtcChrZXlpbmZvWzBdLmtleV9zdGF0ZXMsIGtleWluZm9bMV0ua2V5X3N0YXRlcywgMTYpICE9IDAgKSB7Ci0JCWZvciAoIGk9MDsgaTwxNjsgKytpICkgewotCQkJVWludDggbmV3X3N0YXRlLCB0cmFuc2l0aW9uOwotCi0JCQluZXdfc3RhdGUgPSBrZXlpbmZvW2tleV9mbGlwXS5rZXlfc3RhdGVzW2ldOwotCQkJdHJhbnNpdGlvbiA9IGtleWluZm9bIWtleV9mbGlwXS5rZXlfc3RhdGVzW2ldIF4KLQkJCQkJa2V5aW5mb1sga2V5X2ZsaXBdLmtleV9zdGF0ZXNbaV07Ci0JCQlmb3IgKCBqPTA7IGo8ODsgKytqICkgewotCQkJCWlmICggdHJhbnNpdGlvbiYweDgwICkKLQkJCQkJUXVldWVLZXkoaSo4K2osIG5ld19zdGF0ZSYweDgwKTsKLQkJCQl0cmFuc2l0aW9uIDw8PSAxOwotCQkJCW5ld19zdGF0ZSA8PD0gMTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFdlIGNoZWNrIGtleWJvYXJkLCBidXQgbm90IG1vdXNlIGlmIG1vdXNlIGlzbid0IGluIHdpbmRvdyAqLwotCWlmICggISBib3VuZHMuQ29udGFpbnMocG9pbnQpICkgewotCQkvKiBNb3VzZSBtb3ZlZCBvdXRzaWRlIG91ciB2aWV3PyAqLwotCQlpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUE1PVVNFRk9DVVMgKSB7Ci0JCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQTU9VU0VGT0NVUyk7Ci0JCQliZV9hcHAtPlNldEN1cnNvcihCX0hBTkRfQ1VSU09SKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCS8qIEhhcyB0aGUgbW91c2UgbW92ZWQgYmFjayBpbnRvIG91ciB2aWV3PyAqLwotCWlmICggISAoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUykgKSB7Ci0JCS8qIFJlc2V0IHRoZSBCX0hBTkRfQ1VSU09SIHRvIG91ciBvd24gKi8KLQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOwotCQlTRExfU2V0Q3Vyc29yKE5VTEwpOwotCX0KLQotCS8qIENoZWNrIGZvciBtb3VzZSBtb3Rpb24gKi8KLQlpZiAoIHBvaW50ICE9IGxhc3RfcG9pbnQgKSB7Ci0JCWludCB4LCB5OwotCi0JCVNETF9XaW4tPkdldFhZT2Zmc2V0KHgsIHkpOwotCQl4ID0gKGludClwb2ludC54IC0geDsKLQkJeSA9IChpbnQpcG9pbnQueSAtIHk7Ci0JCVNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgeCwgeSk7Ci0JfQotCWxhc3RfcG9pbnQgPSBwb2ludDsKLQotCS8qIEFkZCBhbnkgbW91c2UgYnV0dG9uIGV2ZW50cyAqLwotCWZvciAoIGk9MDsgaTxTRExfVEFCTEVTSVpFKGJ1dHRvbl9tYXNrcyk7ICsraSApIHsKLQkJaWYgKCAoYnV0dG9ucyBeIGxhc3RfYnV0dG9ucykgJiBidXR0b25fbWFza3NbaV0gKSB7Ci0JCQlpZiAoIGJ1dHRvbnMgJiBidXR0b25fbWFza3NbaV0gKSB7Ci0JCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgMStpLCAwLCAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIDEraSwgMCwgMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JbGFzdF9idXR0b25zID0gYnV0dG9uczsKLSNlbmRpZgotfQotCi12b2lkIFFUX0luaXRPU0tleW1hcChfVEhJUykKLXsKLSNpZiAwCi0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEluaXRpYWxpemUgYWxsIHRoZSBrZXkgc3RhdGVzIGFzICJ1cCIgKi8KLSAga2V5X2ZsaXAgPSAwOwotICBTRExfbWVtc2V0KGtleWluZm9ba2V5X2ZsaXBdLmtleV9zdGF0ZXMsIDAsIDE2KTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBrZXkgdHJhbnNsYXRpb24gdGFibGUgKi8KLSAgZm9yICggaT0wOyBpPFNETF9UQUJMRVNJWkUoa2V5bWFwKTsgKytpICkKLSAgICBrZXltYXBbaV0gPSBTRExLX1VOS05PV047Ci0KLSAgLy8gIGtleW1hcFsweDAxXQkJPSBTRExLX0VTQ0FQRTsKLSAgLy8gIGtleW1hcFtCX0YxX0tFWV0JPSBTRExLX0YxOwotICAvLyAga2V5bWFwW0JfRjJfS0VZXQk9IFNETEtfRjI7Ci0gIC8vICBrZXltYXBbQl9GM19LRVldCT0gU0RMS19GMzsKLSAgLy8gIGtleW1hcFtCX0Y0X0tFWV0JPSBTRExLX0Y0OwotICAvLyAga2V5bWFwW0JfRjVfS0VZXQk9IFNETEtfRjU7Ci0gIC8vICBrZXltYXBbQl9GNl9LRVldCT0gU0RMS19GNjsKLSAgLy8gIGtleW1hcFtCX0Y3X0tFWV0JPSBTRExLX0Y3OwotICAvLyAga2V5bWFwW0JfRjhfS0VZXQk9IFNETEtfRjg7Ci0gIC8vICBrZXltYXBbQl9GOV9LRVldCT0gU0RMS19GOTsKLSAgLy8gIGtleW1hcFtCX0YxMF9LRVldCT0gU0RMS19GMTA7Ci0gIC8vICBrZXltYXBbQl9GMTFfS0VZXQk9IFNETEtfRjExOwotICAvLyAga2V5bWFwW0JfRjEyX0tFWV0JPSBTRExLX0YxMjsKLSAgLy8gIGtleW1hcFtCX1BSSU5UX0tFWV0JPSBTRExLX1BSSU5UOwotICAvL2tleW1hcFtCX1NDUk9MTF9LRVldCT0gU0RMS19TQ1JPTExPQ0s7Ci0gIC8vICBrZXltYXBbQl9QQVVTRV9LRVldCT0gU0RMS19QQVVTRTsKLSAga2V5bWFwWzB4MTFdCQk9IFNETEtfQkFDS1FVT1RFOwotICBrZXltYXBbMHgxMl0JCT0gU0RMS18xOwotICBrZXltYXBbMHgxM10JCT0gU0RMS18yOwotICBrZXltYXBbMHgxNF0JCT0gU0RMS18zOwotICBrZXltYXBbMHgxNV0JCT0gU0RMS180OwotICBrZXltYXBbMHgxNl0JCT0gU0RMS181OwotICBrZXltYXBbMHgxN10JCT0gU0RMS182OwotICBrZXltYXBbMHgxOF0JCT0gU0RMS183OwotICBrZXltYXBbMHgxOV0JCT0gU0RMS184OwotICBrZXltYXBbMHgxYV0JCT0gU0RMS185OwotICBrZXltYXBbMHgxYl0JCT0gU0RMS18wOwotICBrZXltYXBbMHgxY10JCT0gU0RMS19NSU5VUzsKLSAga2V5bWFwWzB4MWRdCQk9IFNETEtfRVFVQUxTOwotICBrZXltYXBbMHgxZV0JCT0gU0RMS19CQUNLU1BBQ0U7Ci0gIGtleW1hcFsweDFmXQkJPSBTRExLX0lOU0VSVDsKLSAga2V5bWFwWzB4MjBdCQk9IFNETEtfSE9NRTsKLSAga2V5bWFwWzB4MjFdCQk9IFNETEtfUEFHRVVQOwotICAvL2tleW1hcFsweDIyXQkJPSBTRExLX05VTUxPQ0s7Ci0gIGtleW1hcFsweDIzXQkJPSBTRExLX0tQX0RJVklERTsKLSAga2V5bWFwWzB4MjRdCQk9IFNETEtfS1BfTVVMVElQTFk7Ci0gIGtleW1hcFsweDI1XQkJPSBTRExLX0tQX01JTlVTOwotICBrZXltYXBbMHgyNl0JCT0gU0RMS19UQUI7Ci0gIGtleW1hcFsweDI3XQkJPSBTRExLX3E7Ci0gIGtleW1hcFsweDI4XQkJPSBTRExLX3c7Ci0gIGtleW1hcFsweDI5XQkJPSBTRExLX2U7Ci0gIGtleW1hcFsweDJhXQkJPSBTRExLX3I7Ci0gIGtleW1hcFsweDJiXQkJPSBTRExLX3Q7Ci0gIGtleW1hcFsweDJjXQkJPSBTRExLX3k7Ci0gIGtleW1hcFsweDJkXQkJPSBTRExLX3U7Ci0gIGtleW1hcFsweDJlXQkJPSBTRExLX2k7Ci0gIGtleW1hcFsweDJmXQkJPSBTRExLX287Ci0gIGtleW1hcFsweDMwXQkJPSBTRExLX3A7Ci0gIGtleW1hcFsweDMxXQkJPSBTRExLX0xFRlRCUkFDS0VUOwotICBrZXltYXBbMHgzMl0JCT0gU0RMS19SSUdIVEJSQUNLRVQ7Ci0gIGtleW1hcFsweDMzXQkJPSBTRExLX0JBQ0tTTEFTSDsKLSAga2V5bWFwWzB4MzRdCQk9IFNETEtfREVMRVRFOwotICBrZXltYXBbMHgzNV0JCT0gU0RMS19FTkQ7Ci0gIGtleW1hcFsweDM2XQkJPSBTRExLX1BBR0VET1dOOwotICBrZXltYXBbMHgzN10JCT0gU0RMS19LUDc7Ci0gIGtleW1hcFsweDM4XQkJPSBTRExLX0tQODsKLSAga2V5bWFwWzB4MzldCQk9IFNETEtfS1A5OwotICBrZXltYXBbMHgzYV0JCT0gU0RMS19LUF9QTFVTOwotICAvL2tleW1hcFsweDNiXQkJPSBTRExLX0NBUFNMT0NLOwotICBrZXltYXBbMHgzY10JCT0gU0RMS19hOwotICBrZXltYXBbMHgzZF0JCT0gU0RMS19zOwotICBrZXltYXBbMHgzZV0JCT0gU0RMS19kOwotICBrZXltYXBbMHgzZl0JCT0gU0RMS19mOwotICBrZXltYXBbMHg0MF0JCT0gU0RMS19nOwotICBrZXltYXBbMHg0MV0JCT0gU0RMS19oOwotICBrZXltYXBbMHg0Ml0JCT0gU0RMS19qOwotICBrZXltYXBbMHg0M10JCT0gU0RMS19rOwotICBrZXltYXBbMHg0NF0JCT0gU0RMS19sOwotICBrZXltYXBbMHg0NV0JCT0gU0RMS19TRU1JQ09MT047Ci0gIGtleW1hcFsweDQ2XQkJPSBTRExLX1FVT1RFOwotICBrZXltYXBbMHg0N10JCT0gU0RMS19SRVRVUk47Ci0gIGtleW1hcFsweDQ4XQkJPSBTRExLX0tQNDsKLSAga2V5bWFwWzB4NDldCQk9IFNETEtfS1A1OwotICBrZXltYXBbMHg0YV0JCT0gU0RMS19LUDY7Ci0gIGtleW1hcFsweDRiXQkJPSBTRExLX0xTSElGVDsKLSAga2V5bWFwWzB4NGNdCQk9IFNETEtfejsKLSAga2V5bWFwWzB4NGRdCQk9IFNETEtfeDsKLSAga2V5bWFwWzB4NGVdCQk9IFNETEtfYzsKLSAga2V5bWFwWzB4NGZdCQk9IFNETEtfdjsKLSAga2V5bWFwWzB4NTBdCQk9IFNETEtfYjsKLSAga2V5bWFwWzB4NTFdCQk9IFNETEtfbjsKLSAga2V5bWFwWzB4NTJdCQk9IFNETEtfbTsKLSAga2V5bWFwWzB4NTNdCQk9IFNETEtfQ09NTUE7Ci0gIGtleW1hcFsweDU0XQkJPSBTRExLX1BFUklPRDsKLSAga2V5bWFwWzB4NTVdCQk9IFNETEtfU0xBU0g7Ci0gIGtleW1hcFsweDU2XQkJPSBTRExLX1JTSElGVDsKLSAga2V5bWFwWzB4NTddCQk9IFNETEtfVVA7Ci0gIGtleW1hcFsweDU4XQkJPSBTRExLX0tQMTsKLSAga2V5bWFwWzB4NTldCQk9IFNETEtfS1AyOwotICBrZXltYXBbMHg1YV0JCT0gU0RMS19LUDM7Ci0gIGtleW1hcFsweDViXQkJPSBTRExLX0tQX0VOVEVSOwotICAvL2tleW1hcFsweDVjXQkJPSBTRExLX0xDVFJMOwotICAvL2tleW1hcFsweDVkXQkJPSBTRExLX0xBTFQ7Ci0gIGtleW1hcFsweDVlXQkJPSBTRExLX1NQQUNFOwotICAvL2tleW1hcFsweDVmXQkJPSBTRExLX1JBTFQ7Ci0gIC8va2V5bWFwWzB4NjBdCQk9IFNETEtfUkNUUkw7Ci0gIGtleW1hcFsweDYxXQkJPSBTRExLX0xFRlQ7Ci0gIGtleW1hcFsweDYyXQkJPSBTRExLX0RPV047Ci0gIGtleW1hcFsweDYzXQkJPSBTRExLX1JJR0hUOwotICBrZXltYXBbMHg2NF0JCT0gU0RMS19LUDA7Ci0gIGtleW1hcFsweDY1XQkJPSBTRExLX0tQX1BFUklPRDsKLSAgLy9rZXltYXBbMHg2Nl0JCT0gU0RMS19MTUVUQTsKLSAgLy9rZXltYXBbMHg2N10JCT0gU0RMS19STUVUQTsKLSAgLy9rZXltYXBbMHg2OF0JCT0gU0RMS19NRU5VOwotICBrZXltYXBbMHg2OV0JCT0gU0RMS19FVVJPOwotICBrZXltYXBbMHg2YV0JCT0gU0RMS19LUF9FUVVBTFM7Ci0gIGtleW1hcFsweDZiXQkJPSBTRExLX1BPV0VSOwotI2VuZGlmCi19Ci0KLX07IC8qIEV4dGVybiBDICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXNldmVudHNfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDU3NmU0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXNldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKLQotLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAotICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQotKi8KLQotZXh0ZXJuIHZvaWQgUVRfSW5pdE9TS2V5bWFwKF9USElTKTsKLWV4dGVybiB2b2lkIFFUX1B1bXBFdmVudHMoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX3N5c21vdXNlLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX3N5c21vdXNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzdmNGQ4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXNtb3VzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX1FXaW4uaCIKLQotZXh0ZXJuICJDIiB7Ci0KLSNpbmNsdWRlICJTRExfc3lzbW91c2VfYy5oIgotCi0vKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KLXN0cnVjdCBXTWN1cnNvciB7Ci0JY2hhciAqYml0czsKLX07Ci1XTWN1cnNvciAqUVRfQ3JlYXRlV01DdXJzb3IoX1RISVMsCi0JCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKLXsKLSAgc3RhdGljIFdNY3Vyc29yIGR1bW15OwotICBkdW1teS5iaXRzID0gMDsKLSAgcmV0dXJuICZkdW1teTsKLX0KLQotaW50IFFUX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUVRfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotfQotCi12b2lkIFFUX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KQotewotICBTRExfV2luLT5zZXRNb3VzZVBvcyhRUG9pbnQoeCwgeSkpOwotfQotCi19OyAvKiBFeHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX3N5c21vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXNtb3VzZV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjAyZmMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX3N5c21vdXNlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX2xvd3ZpZGVvLmgiCi0KLS8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLwotZXh0ZXJuIHZvaWQgUVRfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiBXTWN1cnNvciAqUVRfQ3JlYXRlV01DdXJzb3IoX1RISVMsCi0JCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSk7Ci1leHRlcm4gaW50IFFUX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7Ci1leHRlcm4gdm9pZCBRVF9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXN2aWRlby5jYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXN2aWRlby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzYWRlNC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzdmlkZW8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFF0b3BpYSBiYXNlZCBmcmFtZWJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxxYXBwbGljYXRpb24uaD4KLSNpbmNsdWRlIDxxcGUvcXBlYXBwbGljYXRpb24uaD4KLQotI2luY2x1ZGUgIlNETF90aW1lci5oIgotCi0jaW5jbHVkZSAiU0RMX1FXaW4uaCIKLQotZXh0ZXJuICJDIiB7Ci0KLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3N5c2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3N5c21vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfc3lzd21fYy5oIgotI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgotCi0gIC8vI2RlZmluZSBRVE9QSUFfREVCVUcKLSNkZWZpbmUgUVRfSElEREVOX1NJWkUJMzIJLyogc3RhcnRpbmcgaGlkZGVuIHdpbmRvdyBzaXplICovCi0KLSAgLyogTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdXNlZCB0byBpbnZlcnQgdGhlIHNjcmVlbiByb3RhdGlvbiBvciBub3Q6Ci0gICAgIFBvc3NpYmxlIHZhbHVlczoKLSAgICAgIT0wIDogU2NyZWVuIGlzIDI3MLAgcm90YXRlZAotICAgICAwOiBTY3JlZW4gaXMgOTCwIHJvdGF0ZWQqLwotI2RlZmluZSBTRExfUVRfUk9UQVRJT05fRU5WX05BTUUgIlNETF9RVF9JTlZFUlRfUk9UQVRJT04iCi0gIAotICAvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KLSAgc3RhdGljIGludCBRVF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci0gIHN0YXRpYyBTRExfUmVjdCAqKlFUX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7Ci0gIHN0YXRpYyBTRExfU3VyZmFjZSAqUVRfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOwotICBzdGF0aWMgdm9pZCBRVF9VcGRhdGVNb3VzZShfVEhJUyk7Ci0gIHN0YXRpYyBpbnQgUVRfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKLSAgc3RhdGljIHZvaWQgUVRfVmlkZW9RdWl0KF9USElTKTsKLQotICAvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLwotICBzdGF0aWMgaW50IFFUX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0gIHN0YXRpYyBpbnQgUVRfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotICBzdGF0aWMgdm9pZCBRVF9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLSAgc3RhdGljIHZvaWQgUVRfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0gIHN0YXRpYyBpbnQgUVRfVG9nZ2xlRnVsbFNjcmVlbihfVEhJUywgaW50IGZ1bGxzY3JlZW4pOwotCi0gIHN0YXRpYyBpbnQgUVRfSWNvbmlmeVdpbmRvdyhfVEhJUyk7Ci0gIHN0YXRpYyBTRExfR3JhYk1vZGUgUVRfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7Ci0KLSAgLyogRkIgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotICBzdGF0aWMgaW50IFFUX0F2YWlsYWJsZSh2b2lkKQotICB7Ci0gICAgcmV0dXJuKDEpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgUVRfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQotICB7Ci0gICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotICAgIFNETF9mcmVlKGRldmljZSk7Ci0gIH0KLQotICBzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpRVF9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotICB7Ci0gICAgU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7Ci0KLSAgICAvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotICAgIGRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLSAgICBpZiAoIGRldmljZSApIHsKLSAgICAgIFNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLSAgICAgIGRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQotCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLSAgICB9Ci0gICAgaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKLSAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgaWYgKCBkZXZpY2UgKSB7Ci0JU0RMX2ZyZWUoZGV2aWNlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybigwKTsKLSAgICB9Ci0gICAgU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQotICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgICBkZXZpY2UtPlZpZGVvSW5pdCA9IFFUX1ZpZGVvSW5pdDsKLSAgICBkZXZpY2UtPkxpc3RNb2RlcyA9IFFUX0xpc3RNb2RlczsKLSAgICBkZXZpY2UtPlNldFZpZGVvTW9kZSA9IFFUX1NldFZpZGVvTW9kZTsKLSAgICBkZXZpY2UtPlVwZGF0ZU1vdXNlID0gUVRfVXBkYXRlTW91c2U7Ci0gICAgZGV2aWNlLT5TZXRDb2xvcnMgPSBRVF9TZXRDb2xvcnM7Ci0gICAgZGV2aWNlLT5VcGRhdGVSZWN0cyA9IE5VTEw7Ci0gICAgZGV2aWNlLT5WaWRlb1F1aXQgPSBRVF9WaWRlb1F1aXQ7Ci0gICAgZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IFFUX0FsbG9jSFdTdXJmYWNlOwotICAgIGRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOwotICAgIGRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7Ci0gICAgZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKLSAgICBkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOwotICAgIGRldmljZS0+TG9ja0hXU3VyZmFjZSA9IFFUX0xvY2tIV1N1cmZhY2U7Ci0gICAgZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBRVF9VbmxvY2tIV1N1cmZhY2U7Ci0gICAgZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gTlVMTDsKLSAgICBkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBRVF9GcmVlSFdTdXJmYWNlOwotICAgIGRldmljZS0+U2V0SWNvbiA9IE5VTEw7Ci0gICAgZGV2aWNlLT5TZXRDYXB0aW9uID0gUVRfU2V0V01DYXB0aW9uOwotICAgIGRldmljZS0+SWNvbmlmeVdpbmRvdyA9IFFUX0ljb25pZnlXaW5kb3c7Ci0gICAgZGV2aWNlLT5HcmFiSW5wdXQgPSBRVF9HcmFiSW5wdXQ7Ci0gICAgZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOwotICAgIGRldmljZS0+RnJlZVdNQ3Vyc29yID0gUVRfRnJlZVdNQ3Vyc29yOwotICAgIGRldmljZS0+Q3JlYXRlV01DdXJzb3IgPSBRVF9DcmVhdGVXTUN1cnNvcjsKLSAgICBkZXZpY2UtPlNob3dXTUN1cnNvciA9IFFUX1Nob3dXTUN1cnNvcjsKLSAgICBkZXZpY2UtPldhcnBXTUN1cnNvciA9IFFUX1dhcnBXTUN1cnNvcjsKLSAgICBkZXZpY2UtPkluaXRPU0tleW1hcCA9IFFUX0luaXRPU0tleW1hcDsKLSAgICBkZXZpY2UtPlB1bXBFdmVudHMgPSBRVF9QdW1wRXZlbnRzOwotCi0gICAgZGV2aWNlLT5mcmVlID0gUVRfRGVsZXRlRGV2aWNlOwotICAgIGRldmljZS0+VG9nZ2xlRnVsbFNjcmVlbiA9IFFUX1RvZ2dsZUZ1bGxTY3JlZW47Ci0KLSAgICAvKiBTZXQgdGhlIGRyaXZlciBmbGFncyAqLwotICAgIGRldmljZS0+aGFuZGxlc19hbnlfc2l6ZSA9IDA7Ci0JCi0gICAgcmV0dXJuIGRldmljZTsKLSAgfQotCi0gIFZpZGVvQm9vdFN0cmFwIFF0b3BpYV9ib290c3RyYXAgPSB7Ci0gICAgInF0b3BpYSIsICJRdG9waWEgLyBRUEUgZ3JhcGhpY3MiLAotICAgIFFUX0F2YWlsYWJsZSwgUVRfQ3JlYXRlRGV2aWNlCi0gIH07Ci0KLSAgLyogRnVuY3Rpb24gdG8gc29ydCB0aGUgZGlzcGxheV9saXN0ICovCi0gIHN0YXRpYyBpbnQgQ29tcGFyZU1vZGVzKGNvbnN0IHZvaWQgKkEsIGNvbnN0IHZvaWQgKkIpCi0gIHsKLSNpZiAwCi0gICAgY29uc3QgZGlzcGxheV9tb2RlICphID0gKGRpc3BsYXlfbW9kZSAqKUE7Ci0gICAgY29uc3QgZGlzcGxheV9tb2RlICpiID0gKGRpc3BsYXlfbW9kZSAqKUI7Ci0KLSAgICBpZiAoIGEtPnNwYWNlID09IGItPnNwYWNlICkgewotICAgICAgcmV0dXJuKChiLT52aXJ0dWFsX3dpZHRoKmItPnZpcnR1YWxfaGVpZ2h0KS0KLQkgICAgIChhLT52aXJ0dWFsX3dpZHRoKmEtPnZpcnR1YWxfaGVpZ2h0KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybihDb2xvclNwYWNlVG9CaXRzUGVyUGl4ZWwoYi0+c3BhY2UpLQotCSAgICAgQ29sb3JTcGFjZVRvQml0c1BlclBpeGVsKGEtPnNwYWNlKSk7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBZZXMsIHRoaXMgaXNuJ3QgdGhlIGZhc3Rlc3QgaXQgY291bGQgYmUsIGJ1dCBpdCB3b3JrcyBuaWNlbHkgKi8KLSAgc3RhdGljIGludCBRVF9BZGRNb2RlKF9USElTLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCB3LCB1bnNpZ25lZCBpbnQgaCkKLSAgewotICAgIFNETF9SZWN0ICptb2RlOwotICAgIGludCBpOwotICAgIGludCBuZXh0X21vZGU7Ci0KLSAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbW9kZSAqLwotICAgIGlmICggU0RMX251bW1vZGVzW2luZGV4XSA+IDAgKSB7Ci0gICAgICBmb3IgKCBpPVNETF9udW1tb2Rlc1tpbmRleF0tMTsgaSA+PSAwOyAtLWkgKSB7Ci0JbW9kZSA9IFNETF9tb2RlbGlzdFtpbmRleF1baV07Ci0JaWYgKCAobW9kZS0+dyA9PSB3KSAmJiAobW9kZS0+aCA9PSBoKSApIHsKLQkgIHJldHVybigwKTsKLQl9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IHVwIHRoZSBuZXcgdmlkZW8gbW9kZSByZWN0YW5nbGUgKi8KLSAgICBtb2RlID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YgKm1vZGUpOwotICAgIGlmICggbW9kZSA9PSBOVUxMICkgewotICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICByZXR1cm4oLTEpOwotICAgIH0KLSAgICBtb2RlLT54ID0gMDsKLSAgICBtb2RlLT55ID0gMDsKLSAgICBtb2RlLT53ID0gdzsKLSAgICBtb2RlLT5oID0gaDsKLSNpZmRlZiBRVE9QSUFfREVCVUcKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFkZGluZyBtb2RlICVkeCVkIGF0ICVkIGJ5dGVzIHBlciBwaXhlbFxuIiwgdywgaCwgaW5kZXgrMSk7Ci0jZW5kaWYKLQotICAgIC8qIEFsbG9jYXRlIHRoZSBuZXcgbGlzdCBvZiBtb2RlcywgYW5kIGZpbGwgaW4gdGhlIG5ldyBtb2RlICovCi0gICAgbmV4dF9tb2RlID0gU0RMX251bW1vZGVzW2luZGV4XTsKLSAgICBTRExfbW9kZWxpc3RbaW5kZXhdID0gKFNETF9SZWN0ICoqKQotICAgICAgU0RMX3JlYWxsb2MoU0RMX21vZGVsaXN0W2luZGV4XSwgKDErbmV4dF9tb2RlKzEpKnNpemVvZihTRExfUmVjdCAqKSk7Ci0gICAgaWYgKCBTRExfbW9kZWxpc3RbaW5kZXhdID09IE5VTEwgKSB7Ci0gICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgIFNETF9udW1tb2Rlc1tpbmRleF0gPSAwOwotICAgICAgU0RMX2ZyZWUobW9kZSk7Ci0gICAgICByZXR1cm4oLTEpOwotICAgIH0KLSAgICBTRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZV0gPSBtb2RlOwotICAgIFNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlKzFdID0gTlVMTDsKLSAgICBTRExfbnVtbW9kZXNbaW5kZXhdKys7Ci0KLSAgICByZXR1cm4oMCk7Ci0gIH0KLQotICBpbnQgUVRfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCi0gIHsKLSAgICAvKiBJbml0aWFsaXplIHRoZSBRUEUgQXBwbGljYXRpb24gICovCi0gICAgIC8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICovCi0gICAgdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gUVBpeG1hcDo6ZGVmYXVsdERlcHRoKCk7Ci0KLSAgICAvLyBGb3Igbm93IHdlIGhhcmRjb2RlIHRoZSBjdXJyZW50IGRlcHRoIGJlY2F1c2UgYW55dGhpbmcgZWxzZQotICAgIC8vIG1pZ2h0IGFzIHdlbGwgYmUgZW11bGF0ZWQgYnkgU0RMIHJhdGhlciB0aGFuIGJ5IFF0b3BpYS4KLSAgICAKLSAgICBRU2l6ZSBkZXNrdG9wX3NpemUgPSBxQXBwLT5kZXNrdG9wKCktPnNpemUoKTsKLSAgICBRVF9BZGRNb2RlKF90aGlzLCAoKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xLAotCSAgICAgICBkZXNrdG9wX3NpemUud2lkdGgoKSwgZGVza3RvcF9zaXplLmhlaWdodCgpKTsKLSAgICBRVF9BZGRNb2RlKF90aGlzLCAoKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xLAotCSAgICAgICBkZXNrdG9wX3NpemUuaGVpZ2h0KCksIGRlc2t0b3Bfc2l6ZS53aWR0aCgpKTsKLQotICAgIC8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLwotICAgIF90aGlzLT5pbmZvLmN1cnJlbnRfdyA9IGRlc2t0b3Bfc2l6ZS53aWR0aCgpOwotICAgIF90aGlzLT5pbmZvLmN1cnJlbnRfaCA9IGRlc2t0b3Bfc2l6ZS5oZWlnaHQoKTsKLQotICAgIC8qIENyZWF0ZSB0aGUgd2luZG93IC8gd2lkZ2V0ICovCi0gICAgU0RMX1dpbiA9IG5ldyBTRExfUVdpbihRU2l6ZShRVF9ISURERU5fU0laRSwgUVRfSElEREVOX1NJWkUpKTsKLSAgICAoKFFQRUFwcGxpY2F0aW9uKilxQXBwKS0+c2hvd01haW5XaWRnZXQoU0RMX1dpbik7Ci0gICAgLyogRmlsbCBpbiBzb21lIHdpbmRvdyBtYW5hZ2VyIGNhcGFiaWxpdGllcyAqLwotICAgIF90aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDA7Ci0KLSAgICAvKiBXZSdyZSBkb25lISAqLwotICAgIHJldHVybigwKTsKLSAgfQotCi0gIC8qIFdlIHN1cHBvcnQgYW55IGRpbWVuc2lvbiBhdCBvdXIgYml0LWRlcHRoICovCi0gIFNETF9SZWN0ICoqUVRfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQotICB7Ci0gICAgU0RMX1JlY3QgKiptb2RlczsKLQotICAgIG1vZGVzID0gKChTRExfUmVjdCAqKikwKTsKLSAgICBpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKLSAgICAgIG1vZGVzID0gU0RMX21vZGVsaXN0WygoZm9ybWF0LT5CaXRzUGVyUGl4ZWwrNykvOCktMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICggZm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0KLQkgICBfdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCApIHsKLQltb2RlcyA9ICgoU0RMX1JlY3QgKiopLTEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4obW9kZXMpOwotICB9Ci0KLSAgLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KLSAgc3RhdGljIHZvaWQgUVRfTm9ybWFsVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci0KLQotICBzdGF0aWMgaW50IFFUX1NldEZ1bGxTY3JlZW4oX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4sIGludCBmdWxsc2NyZWVuKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3RhdGljIGludCBRVF9Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgZnVsbHNjcmVlbikKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8qIEZJWE1FOiBjaGVjayByZXR1cm4gdmFsdWVzIGFuZCBjbGVhbnVwIGhlcmUgKi8KLSAgU0RMX1N1cmZhY2UgKlFUX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi0gIHsKLQotICAgIFFJbWFnZSAqcWltYWdlOwotICAgIFFTaXplIGRlc2t0b3Bfc2l6ZSA9IHFBcHAtPmRlc2t0b3AoKS0+c2l6ZSgpOwotCi0gICAgCi0gICAgY3VycmVudC0+ZmxhZ3MgPSAwOyAvL1NETF9GVUxMU0NSRUVOOyAvLyBXZSBhbHdheXMgcnVuIGZ1bGxzY3JlZW4uCi0KLSAgICBpZih3aWR0aCA8PSBkZXNrdG9wX3NpemUud2lkdGgoKQotCSAgICAgICYmIGhlaWdodCA8PSBkZXNrdG9wX3NpemUuaGVpZ2h0KCkpIHsKLSAgICAgIGN1cnJlbnQtPncgPSBkZXNrdG9wX3NpemUud2lkdGgoKTsKLSAgICAgIGN1cnJlbnQtPmggPSBkZXNrdG9wX3NpemUuaGVpZ2h0KCk7Ci0gICAgfSBlbHNlIGlmKHdpZHRoIDw9IGRlc2t0b3Bfc2l6ZS5oZWlnaHQoKSAmJiBoZWlnaHQgPD0gZGVza3RvcF9zaXplLndpZHRoKCkpIHsKLSAgICAgIC8vIExhbmRzY2FwZSBtb2RlCi0gICAgICBjaGFyICogZW52U3RyaW5nID0gU0RMX2dldGVudihTRExfUVRfUk9UQVRJT05fRU5WX05BTUUpOwotICAgICAgaW50IGVudlZhbHVlID0gZW52U3RyaW5nID8gYXRvaShlbnZTdHJpbmcpIDogMDsKLSAgICAgIHNjcmVlblJvdGF0aW9uID0gZW52VmFsdWUgPyBTRExfUVRfUk9UQVRJT05fMjcwIDogU0RMX1FUX1JPVEFUSU9OXzkwOwotICAgICAgY3VycmVudC0+aCA9IGRlc2t0b3Bfc2l6ZS53aWR0aCgpOwotICAgICAgY3VycmVudC0+dyA9IGRlc2t0b3Bfc2l6ZS5oZWlnaHQoKTsKLSAgICB9IGVsc2UgewotICAgICAgU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCByZXNvbHV0aW9uLCAlZHglZFxuIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotICAgIGlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgewotICAgICAgU0RMX1NldEVycm9yKCJPcGVuR0wgbm90IHN1cHBvcnRlZCIpOwotICAgICAgcmV0dXJuKE5VTEwpOwotICAgIH0gCi0gICAgLyogQ3JlYXRlIHRoZSBRSW1hZ2UgZnJhbWVidWZmZXIgKi8KLSAgICBxaW1hZ2UgPSBuZXcgUUltYWdlKGN1cnJlbnQtPncsIGN1cnJlbnQtPmgsIGJwcCk7Ci0gICAgaWYgKHFpbWFnZS0+aXNOdWxsKCkpIHsKLSAgICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNjcmVlbiBiaXRtYXAiKTsKLSAgICAgIGRlbGV0ZSBxaW1hZ2U7Ci0gICAgICByZXR1cm4oTlVMTCk7Ci0gICAgfQotICAgIGN1cnJlbnQtPnBpdGNoID0gcWltYWdlLT5ieXRlc1BlckxpbmUoKTsKLSAgICBjdXJyZW50LT5waXhlbHMgPSAodm9pZCAqKXFpbWFnZS0+Yml0cygpOwotICAgIFNETF9XaW4tPnNldEltYWdlKHFpbWFnZSk7Ci0gICAgX3RoaXMtPlVwZGF0ZVJlY3RzID0gUVRfTm9ybWFsVXBkYXRlOwotICAgIFNETF9XaW4tPnNldEZ1bGxzY3JlZW4odHJ1ZSk7Ci0gICAgLyogV2UncmUgZG9uZSAqLwotICAgIHJldHVybihjdXJyZW50KTsKLSAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgY3VycmVudCBtb3VzZSBzdGF0ZSBhbmQgcG9zaXRpb24gKi8KLSAgdm9pZCBRVF9VcGRhdGVNb3VzZShfVEhJUykKLSAgewotICAgIFFQb2ludCBwb2ludCgtMSwgLTEpOwotICAgIGlmICggU0RMX1dpbi0+aXNBY3RpdmVXaW5kb3coKSApIHsKLSAgICAgIHBvaW50ID0gU0RMX1dpbi0+bW91c2VQb3MoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCAocG9pbnQueCgpID49IDApICYmIChwb2ludC54KCkgPCBTRExfVmlkZW9TdXJmYWNlLT53KSAmJgotCSAocG9pbnQueSgpID49IDApICYmIChwb2ludC55KCkgPCBTRExfVmlkZW9TdXJmYWNlLT5oKSApIHsKLSAgICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLSAgICAgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwKLQkJCSAgICAgKFNpbnQxNilwb2ludC54KCksIChTaW50MTYpcG9pbnQueSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOwotICAgIH0KLSAgfQotCi0gIC8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCi0gIHN0YXRpYyBpbnQgUVRfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotICB7Ci0gICAgcmV0dXJuKC0xKTsKLSAgfQotICBzdGF0aWMgdm9pZCBRVF9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLSAgewotICAgIHJldHVybjsKLSAgfQotICBzdGF0aWMgaW50IFFUX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotICB7Ci0gICAgcmV0dXJuKDApOwotICB9Ci0gIHN0YXRpYyB2b2lkIFFUX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi0gIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBRVF9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotICB7Ci0gICAgaWYoU0RMX1dpbi0+bG9ja1NjcmVlbigpKSB7Ci0gICAgICBmb3IoaW50IGk9MDsgaTxudW1yZWN0czsgKytpICkgewotCVFSZWN0IHJlY3QocmVjdHNbaV0ueCwgcmVjdHNbaV0ueSwKLQkJICAgcmVjdHNbaV0udywgcmVjdHNbaV0uaCk7Ci0JU0RMX1dpbi0+cmVwYWludFJlY3QocmVjdCk7Ci0gICAgICB9Ci0gICAgICBTRExfV2luLT51bmxvY2tTY3JlZW4oKTsKLSAgICB9Ci0gIH0KLSAgLyogSXMgdGhlIHN5c3RlbSBwYWxldHRlIHNldHRhYmxlPyAqLwotICBpbnQgUVRfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgdm9pZCBRVF9WaWRlb1F1aXQoX1RISVMpCi0gIHsKLSAgICAvLyBUaGlzIGlzIGR1bWIsIGJ1dCBpZiBJIGZyZWUgdGhpcywgdGhlIGFwcCBkb2Vzbid0IGV4aXQgY29ycmVjdGx5LgotICAgIC8vIE9mIGNvdXJzZSwgdGhpcyB3aWxsIGxlYWsgbWVtb3J5IGlmIGluaXQgdmlkZW8gaXMgZG9uZSBtb3JlIHRoYW4gb25jZS4KLSAgICAvLyBTdWNrcyBidXQgc3VjaCBpcyBsaWZlLgotICAgIAotICAgIC8vICAgIC0tIERhdmlkIEhlZGJvcgotICAgIC8vICAgIGRlbGV0ZSBTRExfV2luOyAKLSAgICAvLyAgICBTRExfV2luID0gMDsKLSAgICBfdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOwotICAgIFFUX0dyYWJJbnB1dChfdGhpcywgU0RMX0dSQUJfT0ZGKTsKLSAgfQotCi0gIHN0YXRpYyBpbnQgUVRfSWNvbmlmeVdpbmRvdyhfVEhJUykgewotICAgIFNETF9XaW4tPmhpZGUoKTsKLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHN0YXRpYyBTRExfR3JhYk1vZGUgUVRfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSkgewotICAgIGlmKG1vZGUgPT0gU0RMX0dSQUJfT0ZGKSB7Ci0gICAgICBRUEVBcHBsaWNhdGlvbjo6Z3JhYktleWJvYXJkKCk7Ci0gICAgICBxQXBwLT5wcm9jZXNzRXZlbnRzKCk7Ci0gICAgICBRUEVBcHBsaWNhdGlvbjo6dW5ncmFiS2V5Ym9hcmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgUVBFQXBwbGljYXRpb246OmdyYWJLZXlib2FyZCgpOwotICAgIH0KLSAgICBxQXBwLT5wcm9jZXNzRXZlbnRzKCk7Ci0gICAgcmV0dXJuIG1vZGU7Ci0gIH0KLSAgCi19OyAvKiBFeHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX3N5c3dtLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX3N5c3dtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzg1ZGJiLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXN3bS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX1FXaW4uaCIKLQotZXh0ZXJuICJDIiB7Ci0KLSNpbmNsdWRlICJTRExfc3lzd21fYy5oIgotCi12b2lkIFFUX1NldFdNQ2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pCi17Ci0JU0RMX1dpbi0+c2V0Q2FwdGlvbih0aXRsZSk7Ci19Ci0KLX07IC8qIEV4dGVybiBDICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzd21fYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdG9waWEvU0RMX3N5c3dtX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxMjY5Zi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzd21fYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBRVF9TZXRXTUNhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovQ0dTLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F1YXJ0ei9DR1MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0ZmY3Ny4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F1YXJ0ei9DR1MuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogCi0gICAgT2JzY3VyaW5nIGNvZGU6IG1heGltdW0gbnVtYmVyIG9mIHdpbmRvd3MgYWJvdmUgb3VycyAoaW5jbHVzaXZlKSAKLSAgICAKLSAgICBOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayB0b28gd2VsbCBpbiBwcmFjdGljZSBhbmQgc2hvdWxkIGJlCi0gICAgcGhhc2VkIG91dCB3aGVuIHdlIGFkZCBPcGVuR0wgMkQgYWNjZWxlcmF0aW9uLiBJdCB3YXMgbmV2ZXIKLSAgICBlbmFibGVkIGluIHRoZSBmaXJzdCBwbGFjZSwgc28gdGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIDstKQotKi8KLSNkZWZpbmUga01heFdpbmRvd3MgMjU2Ci0KLS8qIFNvbWUgb2YgdGhlIENvcmUgR3JhcGhpY3MgU2VydmVyIEFQSSBmb3Igb2JzY3VyaW5nIGNvZGUgKi8KLSNkZWZpbmUga0NHU1dpbmRvd0xldmVsVG9wICAgICAgICAgIDIxNDc0ODM2MzIKLSNkZWZpbmUga0NHU1dpbmRvd0xldmVsRG9ja0ljb25EcmFnIDUwMAotI2RlZmluZSBrQ0dTV2luZG93TGV2ZWxEb2NrTWVudSAgICAgMTAxCi0jZGVmaW5lIGtDR1NXaW5kb3dMZXZlbE1lbnVJZ25vcmUgICAgMjEKLSNkZWZpbmUga0NHU1dpbmRvd0xldmVsTWVudSAgICAgICAgICAyMAotI2RlZmluZSBrQ0dTV2luZG93TGV2ZWxEb2NrTGFiZWwgICAgIDEyCi0jZGVmaW5lIGtDR1NXaW5kb3dMZXZlbERvY2tJY29uICAgICAgMTEKLSNkZWZpbmUga0NHU1dpbmRvd0xldmVsRG9jayAgICAgICAgICAxMAotI2RlZmluZSBrQ0dTV2luZG93TGV2ZWxVdGlsaXR5ICAgICAgICAzCi0jZGVmaW5lIGtDR1NXaW5kb3dMZXZlbE5vcm1hbCAgICAgICAgIDAKLQotLyogCi0gICAgRm9yIGNvbXBsZXRlbmVzczsgV2UgbmV2ZXIgdXNlIHRoZXNlIHdpbmRvdyBsZXZlbHMsIHRoZXkgYXJlIGFsd2F5cyBiZWxvdyB1cwotICAgICNkZWZpbmUga0NHU1dpbmRvd0xldmVsTUJhclNoYWRvdyAtMjAKLSAgICAjZGVmaW5lIGtDR1NXaW5kb3dMZXZlbERlc2t0b3BQaWN0dXJlIC0yMTQ3NDgzNjQ3Ci0gICAgI2RlZmluZSBrQ0dTV2luZG93TGV2ZWxEZXNrdG9wICAgICAgICAtMjE0NzQ4MzY0OAotKi8KLQotdHlwZWRlZiBDR0Vycm9yICAgICAgIENHU0Vycm9yOwotdHlwZWRlZiBsb25nICAgICAgICAgIENHU1dpbmRvd0NvdW50OwotdHlwZWRlZiB2b2lkICogICAgICAgIENHU0Nvbm5lY3Rpb25JRDsKLXR5cGVkZWYgaW50ICAgICAgICAgICBDR1NXaW5kb3dJRDsKLXR5cGVkZWYgQ0dTV2luZG93SUQqICBDR1NXaW5kb3dJRExpc3Q7Ci10eXBlZGVmIENHV2luZG93TGV2ZWwgQ0dTV2luZG93TGV2ZWw7Ci10eXBlZGVmIE5TUmVjdCAgICAgICAgQ0dTUmVjdDsKLQotZXh0ZXJuIENHU0Nvbm5lY3Rpb25JRCBfQ0dTRGVmYXVsdENvbm5lY3Rpb24gKCk7Ci0KLWV4dGVybiBDR1NFcnJvciBDR1NHZXRPblNjcmVlbldpbmRvd0xpc3QgKENHU0Nvbm5lY3Rpb25JRCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NDb25uZWN0aW9uSUQgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NXaW5kb3dDb3VudCBsaXN0Q2FwYWNpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NXaW5kb3dJRExpc3QgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHU1dpbmRvd0NvdW50ICpsaXN0Q291bnQpOwotCi1leHRlcm4gQ0dTRXJyb3IgQ0dTR2V0U2NyZWVuUmVjdEZvcldpbmRvdyAoQ0dTQ29ubmVjdGlvbklEIGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NXaW5kb3dJRCB3aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dTUmVjdCAqcmVjdCk7Ci0KLWV4dGVybiBDR1dpbmRvd0xldmVsIENHU0dldFdpbmRvd0xldmVsIChDR1NDb25uZWN0aW9uSUQgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHU1dpbmRvd0lEIHdpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NXaW5kb3dMZXZlbCAqbGV2ZWwpOwotCi1leHRlcm4gQ0dTRXJyb3IgQ0dTRGlzcGxheUhXRmlsbCAoQ0dEaXJlY3REaXNwbGF5SUQgaWQsIHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgsIHVuc2lnbmVkIGludCBjb2xvcik7Ci0KLWV4dGVybiBDR1NFcnJvciBDR1NEaXNwbGF5Q2FuSFdGaWxsIChDR0RpcmVjdERpc3BsYXlJRCBpZCk7Ci0KLWV4dGVybiBDR1NFcnJvciBDR1NHZXRNb3VzZUVuYWJsZWRGbGFncyAoQ0dTQ29ubmVjdGlvbklEIGNpZCwgQ0dTV2luZG93SUQgd2lkLCBpbnQgKmZsYWdzKTsKLQotaW50IENHU0Rpc3BsYXlIV1N5bmMgKENHRGlyZWN0RGlzcGxheUlEIGlkKTsKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0ekV2ZW50cy5tIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0ekV2ZW50cy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjdmN2NiLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpFdmVudHMubQorKysgL2Rldi9udWxsCkBAIC0xLDk4NCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAzICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfUXVhcnR6VmlkZW8uaCIKLSNpbmNsdWRlICJTRExfUXVhcnR6V00uaCIKLQotI2luY2x1ZGUgPElPS2l0L0lPTWVzc2FnZS5oPiAvKiBGb3Igd2FrZSBmcm9tIHNsZWVwIGRldGVjdGlvbiAqLwotI2luY2x1ZGUgPElPS2l0L3B3cl9tZ3QvSU9QTUxpYi5oPiAvKiBGb3Igd2FrZSBmcm9tIHNsZWVwIGRldGVjdGlvbiAqLwotI2luY2x1ZGUgIlNETF9RdWFydHpLZXlzLmgiCi0KLS8qIAotICogSW4gUGFudGhlciwgdGhpcyBoZWFkZXIgZGVmaW5lcyBkZXZpY2UgZGVwZW5kZW50IG1hc2tzIGZvciAKLSAqIHJpZ2h0IHNpZGUga2V5cy4gVGhlc2UgZGVmaW5pdGlvbnMgb25seSBleGlzdCBpbiBQYW50aGVyLCBidXQKLSAqIHRoZSBoZWFkZXIgc2VlbXMgdG8gZXhpc3QgYXQgbGVhc3QgaW4gSmFndWFyIGFuZCBwcm9iYWJseSBlYXJsaWVyCi0gKiB2ZXJzaW9ucyBvZiB0aGUgT1MsIHNvIHRoaXMgc2hvdWxkJ3QgYnJlYWsgYW55dGhpbmcuCi0gKi8KLSNpbmNsdWRlIDxJT0tpdC9oaWRzeXN0ZW0vSU9MTEV2ZW50Lmg+Ci0vKiAKLSAqIFRoZXNlIGFyZSBub3QgZGVmaW5lZCBiZWZvcmUgUGFudGhlci4gVG8ga2VlcCB0aGUgY29kZSBjb21waWxpbmcKLSAqIG9uIHN5c3RlbXMgd2l0aG91dCB0aGVzZSwgSSB3aWxsIGRlZmluZSBpZiB0aGV5IGRvbid0IGV4aXN0LgotICovCi0jaWZuZGVmIE5YX0RFVklDRVJDVExLRVlNQVNLCi0gICAgI2RlZmluZSBOWF9ERVZJQ0VMQ1RMS0VZTUFTSyAgICAweDAwMDAwMDAxCi0jZW5kaWYKLSNpZm5kZWYgTlhfREVWSUNFTFNISUZUS0VZTUFTSwotICAgICNkZWZpbmUgTlhfREVWSUNFTFNISUZUS0VZTUFTSyAgMHgwMDAwMDAwMgotI2VuZGlmCi0jaWZuZGVmIE5YX0RFVklDRVJTSElGVEtFWU1BU0sKLSAgICAjZGVmaW5lIE5YX0RFVklDRVJTSElGVEtFWU1BU0sgIDB4MDAwMDAwMDQKLSNlbmRpZgotI2lmbmRlZiBOWF9ERVZJQ0VMQ01ES0VZTUFTSwotICAgICNkZWZpbmUgTlhfREVWSUNFTENNREtFWU1BU0sgICAgMHgwMDAwMDAwOAotI2VuZGlmCi0jaWZuZGVmIE5YX0RFVklDRVJDTURLRVlNQVNLCi0gICAgI2RlZmluZSBOWF9ERVZJQ0VSQ01ES0VZTUFTSyAgICAweDAwMDAwMDEwCi0jZW5kaWYKLSNpZm5kZWYgTlhfREVWSUNFTEFMVEtFWU1BU0sKLSAgICAjZGVmaW5lIE5YX0RFVklDRUxBTFRLRVlNQVNLICAgIDB4MDAwMDAwMjAKLSNlbmRpZgotI2lmbmRlZiBOWF9ERVZJQ0VSQUxUS0VZTUFTSwotICAgICNkZWZpbmUgTlhfREVWSUNFUkFMVEtFWU1BU0sgICAgMHgwMDAwMDA0MAotI2VuZGlmCi0jaWZuZGVmIE5YX0RFVklDRVJDVExLRVlNQVNLCi0gICAgI2RlZmluZSBOWF9ERVZJQ0VSQ1RMS0VZTUFTSyAgICAweDAwMDAyMDAwCi0jZW5kaWYKLQotdm9pZCAgICAgUVpfSW5pdE9TS2V5bWFwIChfVEhJUykgewotICAgIGNvbnN0IHZvaWQgKktDSFJQdHI7Ci0gICAgVUludDMyIHN0YXRlOwotICAgIFVJbnQzMiB2YWx1ZTsKLSAgICBpbnQgaTsKLSAgICBpbnQgd29ybGQgPSBTRExLX1dPUkxEXzA7Ci0KLSAgICBmb3IgKCBpPTA7IGk8U0RMX1RBQkxFU0laRShrZXltYXApOyArK2kgKQotICAgICAgICBrZXltYXBbaV0gPSBTRExLX1VOS05PV047Ci0KLSAgICAvKiBUaGlzIGtleW1hcCBpcyBhbG1vc3QgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgT1MgOSBvbmUgKi8KLSAgICBrZXltYXBbUVpfRVNDQVBFXSA9IFNETEtfRVNDQVBFOwotICAgIGtleW1hcFtRWl9GMV0gPSBTRExLX0YxOwotICAgIGtleW1hcFtRWl9GMl0gPSBTRExLX0YyOwotICAgIGtleW1hcFtRWl9GM10gPSBTRExLX0YzOwotICAgIGtleW1hcFtRWl9GNF0gPSBTRExLX0Y0OwotICAgIGtleW1hcFtRWl9GNV0gPSBTRExLX0Y1OwotICAgIGtleW1hcFtRWl9GNl0gPSBTRExLX0Y2OwotICAgIGtleW1hcFtRWl9GN10gPSBTRExLX0Y3OwotICAgIGtleW1hcFtRWl9GOF0gPSBTRExLX0Y4OwotICAgIGtleW1hcFtRWl9GOV0gPSBTRExLX0Y5OwotICAgIGtleW1hcFtRWl9GMTBdID0gU0RMS19GMTA7Ci0gICAga2V5bWFwW1FaX0YxMV0gPSBTRExLX0YxMTsKLSAgICBrZXltYXBbUVpfRjEyXSA9IFNETEtfRjEyOwotICAgIGtleW1hcFtRWl9GMTNdID0gU0RMS19GMTM7Ci0gICAga2V5bWFwW1FaX0YxNF0gPSBTRExLX0YxNDsKLSAgICBrZXltYXBbUVpfRjE1XSA9IFNETEtfRjE1OwotLyoKLSAgICBrZXltYXBbUVpfUFJJTlRdID0gU0RMS19QUklOVDsKLSAgICBrZXltYXBbUVpfU0NST0xMT0NLXSA9IFNETEtfU0NST0xMT0NLOwotICAgIGtleW1hcFtRWl9QQVVTRV0gPSBTRExLX1BBVVNFOwotKi8KLSAgICBrZXltYXBbUVpfUE9XRVJdID0gU0RMS19QT1dFUjsKLSAgICBrZXltYXBbUVpfQkFDS1FVT1RFXSA9IFNETEtfQkFDS1FVT1RFOwotICAgIGtleW1hcFtRWl8xXSA9IFNETEtfMTsKLSAgICBrZXltYXBbUVpfMl0gPSBTRExLXzI7Ci0gICAga2V5bWFwW1FaXzNdID0gU0RMS18zOwotICAgIGtleW1hcFtRWl80XSA9IFNETEtfNDsKLSAgICBrZXltYXBbUVpfNV0gPSBTRExLXzU7Ci0gICAga2V5bWFwW1FaXzZdID0gU0RMS182OwotICAgIGtleW1hcFtRWl83XSA9IFNETEtfNzsKLSAgICBrZXltYXBbUVpfOF0gPSBTRExLXzg7Ci0gICAga2V5bWFwW1FaXzldID0gU0RMS185OwotICAgIGtleW1hcFtRWl8wXSA9IFNETEtfMDsKLSAgICBrZXltYXBbUVpfTUlOVVNdID0gU0RMS19NSU5VUzsKLSAgICBrZXltYXBbUVpfRVFVQUxTXSA9IFNETEtfRVFVQUxTOwotICAgIGtleW1hcFtRWl9CQUNLU1BBQ0VdID0gU0RMS19CQUNLU1BBQ0U7Ci0gICAga2V5bWFwW1FaX0lOU0VSVF0gPSBTRExLX0lOU0VSVDsKLSAgICBrZXltYXBbUVpfSE9NRV0gPSBTRExLX0hPTUU7Ci0gICAga2V5bWFwW1FaX1BBR0VVUF0gPSBTRExLX1BBR0VVUDsKLSAgICBrZXltYXBbUVpfTlVNTE9DS10gPSBTRExLX05VTUxPQ0s7Ci0gICAga2V5bWFwW1FaX0tQX0VRVUFMU10gPSBTRExLX0tQX0VRVUFMUzsKLSAgICBrZXltYXBbUVpfS1BfRElWSURFXSA9IFNETEtfS1BfRElWSURFOwotICAgIGtleW1hcFtRWl9LUF9NVUxUSVBMWV0gPSBTRExLX0tQX01VTFRJUExZOwotICAgIGtleW1hcFtRWl9UQUJdID0gU0RMS19UQUI7Ci0gICAga2V5bWFwW1FaX3FdID0gU0RMS19xOwotICAgIGtleW1hcFtRWl93XSA9IFNETEtfdzsKLSAgICBrZXltYXBbUVpfZV0gPSBTRExLX2U7Ci0gICAga2V5bWFwW1FaX3JdID0gU0RMS19yOwotICAgIGtleW1hcFtRWl90XSA9IFNETEtfdDsKLSAgICBrZXltYXBbUVpfeV0gPSBTRExLX3k7Ci0gICAga2V5bWFwW1FaX3VdID0gU0RMS191OwotICAgIGtleW1hcFtRWl9pXSA9IFNETEtfaTsKLSAgICBrZXltYXBbUVpfb10gPSBTRExLX287Ci0gICAga2V5bWFwW1FaX3BdID0gU0RMS19wOwotICAgIGtleW1hcFtRWl9MRUZUQlJBQ0tFVF0gPSBTRExLX0xFRlRCUkFDS0VUOwotICAgIGtleW1hcFtRWl9SSUdIVEJSQUNLRVRdID0gU0RMS19SSUdIVEJSQUNLRVQ7Ci0gICAga2V5bWFwW1FaX0JBQ0tTTEFTSF0gPSBTRExLX0JBQ0tTTEFTSDsKLSAgICBrZXltYXBbUVpfREVMRVRFXSA9IFNETEtfREVMRVRFOwotICAgIGtleW1hcFtRWl9FTkRdID0gU0RMS19FTkQ7Ci0gICAga2V5bWFwW1FaX1BBR0VET1dOXSA9IFNETEtfUEFHRURPV047Ci0gICAga2V5bWFwW1FaX0tQN10gPSBTRExLX0tQNzsKLSAgICBrZXltYXBbUVpfS1A4XSA9IFNETEtfS1A4OwotICAgIGtleW1hcFtRWl9LUDldID0gU0RMS19LUDk7Ci0gICAga2V5bWFwW1FaX0tQX01JTlVTXSA9IFNETEtfS1BfTUlOVVM7Ci0gICAga2V5bWFwW1FaX0NBUFNMT0NLXSA9IFNETEtfQ0FQU0xPQ0s7Ci0gICAga2V5bWFwW1FaX2FdID0gU0RMS19hOwotICAgIGtleW1hcFtRWl9zXSA9IFNETEtfczsKLSAgICBrZXltYXBbUVpfZF0gPSBTRExLX2Q7Ci0gICAga2V5bWFwW1FaX2ZdID0gU0RMS19mOwotICAgIGtleW1hcFtRWl9nXSA9IFNETEtfZzsKLSAgICBrZXltYXBbUVpfaF0gPSBTRExLX2g7Ci0gICAga2V5bWFwW1FaX2pdID0gU0RMS19qOwotICAgIGtleW1hcFtRWl9rXSA9IFNETEtfazsKLSAgICBrZXltYXBbUVpfbF0gPSBTRExLX2w7Ci0gICAga2V5bWFwW1FaX1NFTUlDT0xPTl0gPSBTRExLX1NFTUlDT0xPTjsKLSAgICBrZXltYXBbUVpfUVVPVEVdID0gU0RMS19RVU9URTsKLSAgICBrZXltYXBbUVpfUkVUVVJOXSA9IFNETEtfUkVUVVJOOwotICAgIGtleW1hcFtRWl9LUDRdID0gU0RMS19LUDQ7Ci0gICAga2V5bWFwW1FaX0tQNV0gPSBTRExLX0tQNTsKLSAgICBrZXltYXBbUVpfS1A2XSA9IFNETEtfS1A2OwotICAgIGtleW1hcFtRWl9LUF9QTFVTXSA9IFNETEtfS1BfUExVUzsKLSAgICBrZXltYXBbUVpfTFNISUZUXSA9IFNETEtfTFNISUZUOwotICAgIGtleW1hcFtRWl9SU0hJRlRdID0gU0RMS19SU0hJRlQ7Ci0gICAga2V5bWFwW1FaX3pdID0gU0RMS196OwotICAgIGtleW1hcFtRWl94XSA9IFNETEtfeDsKLSAgICBrZXltYXBbUVpfY10gPSBTRExLX2M7Ci0gICAga2V5bWFwW1FaX3ZdID0gU0RMS192OwotICAgIGtleW1hcFtRWl9iXSA9IFNETEtfYjsKLSAgICBrZXltYXBbUVpfbl0gPSBTRExLX247Ci0gICAga2V5bWFwW1FaX21dID0gU0RMS19tOwotICAgIGtleW1hcFtRWl9DT01NQV0gPSBTRExLX0NPTU1BOwotICAgIGtleW1hcFtRWl9QRVJJT0RdID0gU0RMS19QRVJJT0Q7Ci0gICAga2V5bWFwW1FaX1NMQVNIXSA9IFNETEtfU0xBU0g7Ci0gICAga2V5bWFwW1FaX1VQXSA9IFNETEtfVVA7Ci0gICAga2V5bWFwW1FaX0tQMV0gPSBTRExLX0tQMTsKLSAgICBrZXltYXBbUVpfS1AyXSA9IFNETEtfS1AyOwotICAgIGtleW1hcFtRWl9LUDNdID0gU0RMS19LUDM7Ci0gICAga2V5bWFwW1FaX0tQX0VOVEVSXSA9IFNETEtfS1BfRU5URVI7Ci0gICAga2V5bWFwW1FaX0xDVFJMXSA9IFNETEtfTENUUkw7Ci0gICAga2V5bWFwW1FaX0xBTFRdID0gU0RMS19MQUxUOwotICAgIGtleW1hcFtRWl9MTUVUQV0gPSBTRExLX0xNRVRBOwotICAgIGtleW1hcFtRWl9SQ1RSTF0gPSBTRExLX1JDVFJMOwotICAgIGtleW1hcFtRWl9SQUxUXSA9IFNETEtfUkFMVDsKLSAgICBrZXltYXBbUVpfUk1FVEFdID0gU0RMS19STUVUQTsKLSAgICBrZXltYXBbUVpfU1BBQ0VdID0gU0RMS19TUEFDRTsKLSAgICBrZXltYXBbUVpfTEVGVF0gPSBTRExLX0xFRlQ7Ci0gICAga2V5bWFwW1FaX0RPV05dID0gU0RMS19ET1dOOwotICAgIGtleW1hcFtRWl9SSUdIVF0gPSBTRExLX1JJR0hUOwotICAgIGtleW1hcFtRWl9LUDBdID0gU0RMS19LUDA7Ci0gICAga2V5bWFwW1FaX0tQX1BFUklPRF0gPSBTRExLX0tQX1BFUklPRDsKLSAgICBrZXltYXBbUVpfSUJPT0tfRU5URVJdID0gU0RMS19LUF9FTlRFUjsKLSAgICBrZXltYXBbUVpfSUJPT0tfUklHSFRdID0gU0RMS19SSUdIVDsKLSAgICBrZXltYXBbUVpfSUJPT0tfRE9XTl0gPSBTRExLX0RPV047Ci0gICAga2V5bWFwW1FaX0lCT09LX1VQXSAgICAgID0gU0RMS19VUDsKLSAgICBrZXltYXBbUVpfSUJPT0tfTEVGVF0gPSBTRExLX0xFRlQ7Ci0KLSAgICAvKiAKLSAgICAgICAgVXAgdGhlcmUgd2Ugc2V0dXAgYSBzdGF0aWMgc2NhbmNvZGUtPmtleXN5bSBtYXAuIEhvd2V2ZXIsIGl0IHdpbGwgbm90Ci0gICAgICAgIHdvcmsgdmVyeSB3ZWxsIG9uIGludGVybmF0aW9uYWwga2V5Ym9hcmQuIEhlbmNlIHdlIG5vdyBxdWVyeSBNYWNPUwotICAgICAgICBmb3IgaXRzIG93biBrZXltYXAgdG8gYWRqdXN0IG91ciBvd24gbWFwcGluZyB0YWJsZS4gSG93ZXZlciwgdGhpcyBpcwotICAgICAgICBiYXNpY2FsbHkgb25seSB1c2VmdWwgZm9yIGFzY2lpIGNoYXIga2V5cy4gVGhpcyBpcyBhbHNvIHRoZSByZWFzb24KLSAgICAgICAgd2h5IHdlIGtlZXAgdGhlIHN0YXRpYyB0YWJsZSwgdG9vLgotICAgICAqLwotCi0gICAgLyogR2V0IGEgcG9pbnRlciB0byB0aGUgc3lzdGVtcyBjYWNoZWQgS0NIUiAqLwotICAgIEtDSFJQdHIgPSAodm9pZCAqKUdldFNjcmlwdE1hbmFnZXJWYXJpYWJsZShzbUtDSFJDYWNoZSk7Ci0gICAgaWYgKEtDSFJQdHIpCi0gICAgewotICAgICAgICAvKiBMb29wIG92ZXIgYWxsIDEyNyBwb3NzaWJsZSBzY2FuIGNvZGVzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAweDdGOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdlIHByZXRlbmQgYSBjbGVhbiBzdGFydCB0byBiZWdpbiB3aXRoIChpLmUuIG5vIGRlYWQga2V5cyBhY3RpdmUgKi8KLSAgICAgICAgICAgIHN0YXRlID0gMDsKLQotICAgICAgICAgICAgLyogTm93IHRyYW5zbGF0ZSB0aGUga2V5IGNvZGUgdG8gYSBrZXkgdmFsdWUgKi8KLSAgICAgICAgICAgIHZhbHVlID0gS2V5VHJhbnNsYXRlKEtDSFJQdHIsIGksICZzdGF0ZSkgJiAweGZmOwotCi0gICAgICAgICAgICAvKiBJZiB0aGUgc3RhdGUgYmVjb21lIDAsIGl0IHdhcyBhIGRlYWQga2V5LiBXZSBuZWVkIHRvIHRyYW5zbGF0ZSBhZ2FpbiwKLSAgICAgICAgICAgICAgICBwYXNzaW5nIGluIHRoZSBuZXcgc3RhdGUsIHRvIGdldCB0aGUgYWN0dWFsIGtleSB2YWx1ZSAqLwotICAgICAgICAgICAgaWYgKHN0YXRlICE9IDApCi0gICAgICAgICAgICAgICAgdmFsdWUgPSBLZXlUcmFuc2xhdGUoS0NIUlB0ciwgaSwgJnN0YXRlKSAmIDB4ZmY7Ci0KLSAgICAgICAgICAgIC8qIE5vdyB3ZSBzaG91bGQgaGF2ZSBhbiBhc2NpaSB2YWx1ZSwgb3IgMC4gVHJ5IHRvIGZpZ3VyZSBvdXQgdG8gd2hpY2ggU0RMIHN5bWJvbCBpdCBtYXBzICovCi0gICAgICAgICAgICBpZiAodmFsdWUgPj0gMTI4KSAgICAgLyogU29tZSBub24tQVNDSUkgY2hhciwgbWFwIGl0IHRvIFNETEtfV09STERfKiAqLwotICAgICAgICAgICAgICAgIGtleW1hcFtpXSA9IHdvcmxkKys7Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+PSAzMikgICAgIC8qIG5vbi1jb250cm9sIEFTQ0lJIGNoYXIgKi8KLSAgICAgICAgICAgICAgICBrZXltYXBbaV0gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIAotICAgICAgICBUaGUga2V5cGFkIGNvZGVzIGFyZSByZS1zZXR1cCBoZXJlLCBiZWNhdXNlIHRoZSBsb29wIGFib3ZlIGNhbm5vdAotICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEga2V5IG9uIHRoZSBrZXlwYWQgYW5kIGEgcmVndWxhciBrZXkuIFdlIG1heWJlCi0gICAgICAgIGNvdWxkIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIGluIGFub3RoZXIgZmFzaGlvbjogTlNFdmVudCdzIGZsYWdzCi0gICAgICAgIGluY2x1ZGUgYSAiTlNOdW1lcmljUGFkS2V5TWFzayIgYml0OyB3ZSBjb3VsZCBjaGVjayB0aGF0IGFuZCBtb2RpZnkKLSAgICAgICAgdGhlIHN5bWJvbCB3ZSByZXR1cm4gb24gdGhlIGZseS4gSG93ZXZlciwgdGhpcyBmbGFnIHNlZW1zIHRvIGV4aGliaXQKLSAgICAgICAgc29tZSB3ZWlyZCBiZWhhdmlvdXIgcmVsYXRlZCB0byB0aGUgbnVtIGxvY2sga2V5Ci0gICAgKi8KLSAgICBrZXltYXBbUVpfS1AwXSA9IFNETEtfS1AwOwotICAgIGtleW1hcFtRWl9LUDFdID0gU0RMS19LUDE7Ci0gICAga2V5bWFwW1FaX0tQMl0gPSBTRExLX0tQMjsKLSAgICBrZXltYXBbUVpfS1AzXSA9IFNETEtfS1AzOwotICAgIGtleW1hcFtRWl9LUDRdID0gU0RMS19LUDQ7Ci0gICAga2V5bWFwW1FaX0tQNV0gPSBTRExLX0tQNTsKLSAgICBrZXltYXBbUVpfS1A2XSA9IFNETEtfS1A2OwotICAgIGtleW1hcFtRWl9LUDddID0gU0RMS19LUDc7Ci0gICAga2V5bWFwW1FaX0tQOF0gPSBTRExLX0tQODsKLSAgICBrZXltYXBbUVpfS1A5XSA9IFNETEtfS1A5OwotICAgIGtleW1hcFtRWl9LUF9NSU5VU10gPSBTRExLX0tQX01JTlVTOwotICAgIGtleW1hcFtRWl9LUF9QTFVTXSA9IFNETEtfS1BfUExVUzsKLSAgICBrZXltYXBbUVpfS1BfUEVSSU9EXSA9IFNETEtfS1BfUEVSSU9EOwotICAgIGtleW1hcFtRWl9LUF9FUVVBTFNdID0gU0RMS19LUF9FUVVBTFM7Ci0gICAga2V5bWFwW1FaX0tQX0RJVklERV0gPSBTRExLX0tQX0RJVklERTsKLSAgICBrZXltYXBbUVpfS1BfTVVMVElQTFldID0gU0RMS19LUF9NVUxUSVBMWTsKLSAgICBrZXltYXBbUVpfS1BfRU5URVJdID0gU0RMS19LUF9FTlRFUjsKLX0KLQotc3RhdGljIHZvaWQgUVpfRG9LZXkgKF9USElTLCBpbnQgc3RhdGUsIE5TRXZlbnQgKmV2ZW50KSB7Ci0KLSAgICBOU1N0cmluZyAqY2hhcnM7Ci0gICAgdW5zaWduZWQgaW50IGksIG51bUNoYXJzLCBjbGVhckNoYXJzID0gMDsKLSAgICBTRExfa2V5c3ltIGtleTsKLSAgICAKLSAgICAvKiAKLSAgICAgICAgQSBrZXkgZXZlbnQgY2FuIGNvbnRhaW4gbXVsdGlwbGUgY2hhcmFjdGVycywKLSAgICAgICAgb3Igbm8gY2hhcmFjdGVycyBhdCBhbGwuIEluIG1vc3QgY2FzZXMsIGl0Ci0gICAgICAgIHdpbGwgY29udGFpbiBhIHNpbmdsZSBjaGFyYWN0ZXIuIElmIGl0IGNvbnRhaW5zCi0gICAgICAgIDAgY2hhcmFjdGVycywgd2UnbGwgdXNlIDAgYXMgdGhlIHVuaWNvZGUuIElmIGl0Ci0gICAgICAgIGNvbnRhaW5zIG11bHRpcGxlIGNoYXJhY3RlcnMsIHdlJ2xsIHVzZSAwIGFzCi0gICAgICAgIHRoZSBzY2FuY29kZS9rZXlzeW0uCi0gICAgKi8KLSAgICBpZiAoU0RMX1RyYW5zbGF0ZVVOSUNPREUgJiYgc3RhdGUgPT0gU0RMX1BSRVNTRUQpIHsKLSAgICAgICAgW2ZpZWxkX2VkaXQgaW50ZXJwcmV0S2V5RXZlbnRzOltOU0FycmF5IGFycmF5V2l0aE9iamVjdDpldmVudF1dOwotICAgICAgICBjaGFycyA9IFsgZXZlbnQgY2hhcmFjdGVycyBdOwotICAgICAgICBudW1DaGFycyA9IFsgY2hhcnMgbGVuZ3RoIF07Ci0gICAgICAgIGNsZWFyQ2hhcnMgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG51bUNoYXJzID0gMDsKLSAgICB9Ci0KLSAgICBpZiAobnVtQ2hhcnMgPT0gMCkgewotICAgICAgCi0gICAgICAgIGtleS5zY2FuY29kZSA9IFsgZXZlbnQga2V5Q29kZSBdOwotICAgICAgICBrZXkuc3ltICAgICAgPSBrZXltYXAgWyBrZXkuc2NhbmNvZGUgXTsKLSAgICAgICAga2V5LnVuaWNvZGUgID0gMDsKLSAgICAgICAga2V5Lm1vZCAgICAgID0gS01PRF9OT05FOwotCi0gICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKHN0YXRlLCAma2V5KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobnVtQ2hhcnMgPj0gMSkgewotCi0gICAgICAgIGtleS5zY2FuY29kZSA9IFsgZXZlbnQga2V5Q29kZSBdOwotICAgICAgICBrZXkuc3ltICAgICAgPSBrZXltYXAgWyBrZXkuc2NhbmNvZGUgXTsKLSAgICAgICAga2V5LnVuaWNvZGUgID0gWyBjaGFycyBjaGFyYWN0ZXJBdEluZGV4OjAgXTsKLSAgICAgICAga2V5Lm1vZCAgICAgID0gS01PRF9OT05FOwotCi0gICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKHN0YXRlLCAma2V5KTsKLSAgICAgIAotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnVtQ2hhcnM7IGkrKykgewotCi0gICAgICAgICAgICBrZXkuc2NhbmNvZGUgPSAwOwotICAgICAgICAgICAga2V5LnN5bSAgICAgID0gMDsKLSAgICAgICAgICAgIGtleS51bmljb2RlICA9IFsgY2hhcnMgY2hhcmFjdGVyQXRJbmRleDppXTsKLSAgICAgICAgICAgIGtleS5tb2QgICAgICA9IEtNT0RfTk9ORTsKLQotICAgICAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoc3RhdGUsICZrZXkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjbGVhckNoYXJzKSB7Ci0gICAgICAgIFtmaWVsZF9lZGl0IHNldFN0cmluZzpAIiJdOwotICAgIH0KLSAgICAKLSAgICBpZiAoU0RMX2dldGVudiAoIlNETF9FTkFCTEVBUFBFVkVOVFMiKSkKLSAgICAgICAgWyBOU0FwcCBzZW5kRXZlbnQ6ZXZlbnQgXTsKLX0KLQotLyogVGhpcyBpcyB0aGUgb3JpZ2luYWwgYmVoYXZpb3IsIGJlZm9yZSBzdXBwb3J0IHdhcyBhZGRlZCBmb3IgCi0gKiBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBsZWZ0IGFuZCByaWdodCB2ZXJzaW9ucyBvZiB0aGUga2V5cy4KLSAqLwotc3RhdGljIHZvaWQgUVpfRG9VbnNpZGVkTW9kaWZpZXJzIChfVEhJUywgdW5zaWduZWQgaW50IG5ld01vZHMpIHsKLQotICAgIGNvbnN0IGludCBtYXBwaW5nW10gPSB7IFNETEtfQ0FQU0xPQ0ssIFNETEtfTFNISUZULCBTRExLX0xDVFJMLCBTRExLX0xBTFQsIFNETEtfTE1FVEEgfTsKLQotICAgIGludCBpOwotICAgIGludCBiaXQ7Ci0gICAgU0RMX2tleXN5bSBrZXk7Ci0gICAgCi0gICAga2V5LnNjYW5jb2RlICAgID0gMDsKLSAgICBrZXkuc3ltICAgICAgICAgPSBTRExLX1VOS05PV047Ci0gICAga2V5LnVuaWNvZGUgICAgID0gMDsKLSAgICBrZXkubW9kICAgICAgICAgPSBLTU9EX05PTkU7Ci0KLSAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGJpdHMsIHRlc3RpbmcgZWFjaCBhZ2FpbnN0IHRoZSBjdXJyZW50IG1vZGlmaWVycyAqLwotICAgIGZvciAoaSA9IDAsIGJpdCA9IE5TQWxwaGFTaGlmdEtleU1hc2s7IGJpdCA8PSBOU0NvbW1hbmRLZXlNYXNrOyBiaXQgPDw9IDEsICsraSkgewotCi0gICAgICAgIHVuc2lnbmVkIGludCBjdXJyZW50TWFzaywgbmV3TWFzazsKLQotICAgICAgICBjdXJyZW50TWFzayA9IGN1cnJlbnRfbW9kcyAmIGJpdDsKLSAgICAgICAgbmV3TWFzayAgICAgPSBuZXdNb2RzICYgYml0OwotCi0gICAgICAgIGlmICggY3VycmVudE1hc2sgJiYKLSAgICAgICAgICAgICBjdXJyZW50TWFzayAhPSBuZXdNYXNrICkgeyAgICAgLyogbW9kaWZpZXIgdXAgZXZlbnQgKi8KLQotICAgICAgICAgICAgIGtleS5zeW0gPSBtYXBwaW5nW2ldOwotICAgICAgICAgICAgIC8qIElmIHRoaXMgd2FzIENhcHMgTG9jaywgd2UgbmVlZCBzb21lIGFkZGl0aW9uYWwgdm9vZG9vIHRvIG1ha2UgU0RMIGhhcHB5ICovCi0gICAgICAgICAgICAgaWYgKGJpdCA9PSBOU0FscGhhU2hpZnRLZXlNYXNrKQotICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1BSRVNTRUQsICZrZXkpOwotICAgICAgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9SRUxFQVNFRCwgJmtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIG5ld01hc2sgJiYKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnRNYXNrICE9IG5ld01hc2sgKSB7ICAgICAvKiBtb2RpZmllciBkb3duIGV2ZW50ICovCi0gICAgICAgIAotICAgICAgICAgICAgIGtleS5zeW0gPSBtYXBwaW5nW2ldOwotICAgICAgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9QUkVTU0VELCAma2V5KTsKLSAgICAgICAgICAgICAvKiBJZiB0aGlzIHdhcyBDYXBzIExvY2ssIHdlIG5lZWQgc29tZSBhZGRpdGlvbmFsIHZvb2RvbyB0byBtYWtlIFNETCBoYXBweSAqLwotICAgICAgICAgICAgIGlmIChiaXQgPT0gTlNBbHBoYVNoaWZ0S2V5TWFzaykKLSAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9SRUxFQVNFRCwgJmtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIFFaX0hhbmRsZU1vZGlmaWVyU2lkZS4gVGhpcyAKLSAqIGZ1bmN0aW9uIHJldmVydHMgYmFjayB0byBiZWhhdmlvciBiZWZvcmUgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4KLSAqIHNpZGVzIHdhcyBtYWRlLgotICovCi1zdGF0aWMgdm9pZCBRWl9IYW5kbGVOb25EZXZpY2VNb2RpZmllciAoIF9USElTLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2luZGVwZW5kZW50X21hc2ssIHVuc2lnbmVkIGludCBuZXdNb2RzLCB1bnNpZ25lZCBpbnQga2V5X3N5bSkgewotICAgIHVuc2lnbmVkIGludCBjdXJyZW50TWFzaywgbmV3TWFzazsKLSAgICBTRExfa2V5c3ltIGtleTsKLSAgICAKLSAgICBrZXkuc2NhbmNvZGUgICAgPSAwOwotICAgIGtleS5zeW0gICAgICAgICA9IGtleV9zeW07Ci0gICAga2V5LnVuaWNvZGUgICAgID0gMDsKLSAgICBrZXkubW9kICAgICAgICAgPSBLTU9EX05PTkU7Ci0gICAgCi0gICAgLyogSXNvbGF0ZSBqdXN0IHRoZSBiaXRzIHdlIGNhcmUgYWJvdXQgaW4gdGhlIGRlcGVkZW50IGJpdHMgc28gd2UgY2FuIAotICAgICAqIGZpZ3VyZSBvdXQgd2hhdCBjaGFuZ2VkCi0gICAgICovIAotICAgIGN1cnJlbnRNYXNrID0gY3VycmVudF9tb2RzICYgZGV2aWNlX2luZGVwZW5kZW50X21hc2s7Ci0gICAgbmV3TWFzayAgICAgPSBuZXdNb2RzICYgZGV2aWNlX2luZGVwZW5kZW50X21hc2s7Ci0gICAgCi0gICAgaWYgKCBjdXJyZW50TWFzayAmJgotICAgICAgICAgY3VycmVudE1hc2sgIT0gbmV3TWFzayApIHsgICAgIC8qIG1vZGlmaWVyIHVwIGV2ZW50ICovCi0gICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUkVMRUFTRUQsICZrZXkpOwotICAgIH0KLSAgICBlbHNlIGlmICggbmV3TWFzayAmJgotICAgICAgICAgIGN1cnJlbnRNYXNrICE9IG5ld01hc2sgKSB7ICAgICAvKiBtb2RpZmllciBkb3duIGV2ZW50ICovCi0gICAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1BSRVNTRUQsICZrZXkpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgUVpfSGFuZGxlTW9kaWZpZXJTaWRlLiAKLSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYWN0dWFsIFNETF9Qcml2YXRlS2V5Ym9hcmQgZXZlbnQuCi0gKi8KLXN0YXRpYyB2b2lkIFFaX0hhbmRsZU1vZGlmaWVyT25lU2lkZSAoIF9USElTLCB1bnNpZ25lZCBpbnQgbmV3TW9kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlfc3ltLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaWRlZF9kZXZpY2VfZGVwZW5kZW50X21hc2sgKSB7Ci0gICAgCi0gICAgU0RMX2tleXN5bSBrZXk7Ci0gICAgdW5zaWduZWQgaW50IGN1cnJlbnRfZGVwX21hc2ssIG5ld19kZXBfbWFzazsKLSAgICAKLSAgICBrZXkuc2NhbmNvZGUgICAgPSAwOwotICAgIGtleS5zeW0gICAgICAgICA9IGtleV9zeW07Ci0gICAga2V5LnVuaWNvZGUgICAgID0gMDsKLSAgICBrZXkubW9kICAgICAgICAgPSBLTU9EX05PTkU7Ci0gICAgCi0gICAgLyogSXNvbGF0ZSBqdXN0IHRoZSBiaXRzIHdlIGNhcmUgYWJvdXQgaW4gdGhlIGRlcGVkZW50IGJpdHMgc28gd2UgY2FuIAotICAgICAqIGZpZ3VyZSBvdXQgd2hhdCBjaGFuZ2VkCi0gICAgICovIAotICAgIGN1cnJlbnRfZGVwX21hc2sgPSBjdXJyZW50X21vZHMgJiBzaWRlZF9kZXZpY2VfZGVwZW5kZW50X21hc2s7Ci0gICAgbmV3X2RlcF9tYXNrICAgICA9IG5ld01vZHMgJiBzaWRlZF9kZXZpY2VfZGVwZW5kZW50X21hc2s7Ci0gICAgCi0gICAgLyogV2Ugbm93IGtub3cgdGhhdCB0aGlzIHNpZGUgYml0IGZsaXBwZWQuIEJ1dCB3ZSBkb24ndCBrbm93IGlmCi0gICAgICogaXQgd2VudCBwcmVzc2VkIHRvIHJlbGVhc2VkIG9yIHJlbGVhc2VkIHRvIHByZXNzZWQsIHNvIHdlIG11c3QgCi0gICAgICogZmluZCBvdXQgd2hpY2ggaXQgaXMuCi0gICAgICovCi0gICAgaWYoIG5ld19kZXBfbWFzayAmJgotICAgICAgICBjdXJyZW50X2RlcF9tYXNrICE9IG5ld19kZXBfbWFzayApIHsgCi0gICAgICAgIC8qIE1vZGlmaWVyIGRvd24gZXZlbnQgKi8KLSAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1BSRVNTRUQsICZrZXkpOwotICAgIH0KLSAgICBlbHNlIC8qIE1vZGlmaWVyIHVwIGV2ZW50ICovIHsKLSAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1JFTEVBU0VELCAma2V5KTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIFFaX0RvU2lkZWRNb2RpZmllcnMuCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmlndXJlIG91dCBpZiB0aGUgbW9kaWZpZXIga2V5IGlzIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUsIAotICogZS5nLiBsZWZ0LXNoaWZ0IHZzIHJpZ2h0LXNoaWZ0LiAKLSAqLwotc3RhdGljIHZvaWQgUVpfSGFuZGxlTW9kaWZpZXJTaWRlICggX1RISVMsIGludCBkZXZpY2VfaW5kZXBlbmRlbnRfbWFzaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmV3TW9kcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVmdF9rZXlfc3ltLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByaWdodF9rZXlfc3ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlZnRfZGV2aWNlX2RlcGVuZGVudF9tYXNrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByaWdodF9kZXZpY2VfZGVwZW5kZW50X21hc2sgKSB7Ci0gICAgdW5zaWduZWQgaW50IGRldmljZV9kZXBlbmRlbnRfbWFzayA9IDA7Ci0gICAgdW5zaWduZWQgaW50IGRpZmZfbW9kID0gMDsKLSAgICAKLSAgICBkZXZpY2VfZGVwZW5kZW50X21hc2sgPSBsZWZ0X2RldmljZV9kZXBlbmRlbnRfbWFzayB8IHJpZ2h0X2RldmljZV9kZXBlbmRlbnRfbWFzazsKLSAgICAvKiBPbiB0aGUgYmFzaXMgdGhhdCB0aGUgZGV2aWNlIGluZGVwZW5kZW50IG1hc2sgaXMgc2V0LCBidXQgdGhlcmUgYXJlIAotICAgICAqIG5vIGRldmljZSBkZXBlbmRlbnQgZmxhZ3Mgc2V0LCB3ZSdsbCBhc3N1bWUgdGhhdCB3ZSBjYW4ndCBkZXRlY3QgdGhpcyAKLSAgICAgKiBrZXlib2FyZCBhbmQgcmV2ZXJ0IHRvIHRoZSB1bnNpZGVkIGJlaGF2aW9yLgotICAgICAqLwotICAgIGlmICggKGRldmljZV9kZXBlbmRlbnRfbWFzayAmIG5ld01vZHMpID09IDAgKSB7Ci0gICAgICAgIC8qIFJldmVydCB0byB0aGUgb2xkIGJlaGF2aW9yICovCi0gICAgICAgIFFaX0hhbmRsZU5vbkRldmljZU1vZGlmaWVyICggdGhpcywgZGV2aWNlX2luZGVwZW5kZW50X21hc2ssIG5ld01vZHMsIGxlZnRfa2V5X3N5bSApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgICAvKiBYT1IgdGhlIHByZXZpb3VzIHN0YXRlIGFnYWluc3QgdGhlIG5ldyBzdGF0ZSB0byBzZWUgaWYgdGhlcmUncyBhIGNoYW5nZSAqLwotICAgIGRpZmZfbW9kID0gKGRldmljZV9kZXBlbmRlbnRfbWFzayAmIGN1cnJlbnRfbW9kcykKLSAgICAgICAgXiAoZGV2aWNlX2RlcGVuZGVudF9tYXNrICYgbmV3TW9kcyk7Ci0KLSAgICBpZiAoIGRpZmZfbW9kICkgewotICAgICAgICAvKiBBIGNoYW5nZSBpbiBzdGF0ZSB3YXMgZm91bmQuIElzb2xhdGUgdGhlIGxlZnQgYW5kIHJpZ2h0IGJpdHMgCi0gICAgICAgICAqIHRvIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkganVzdCBpbiBjYXNlIHRoZSB2YWx1ZXMgY2FuIHNpbXVsYXRhbmVvdXNseQotICAgICAgICAgKiBjaGFuZ2Ugb3IgaWYgdGhlIGJpdHMgZG9uJ3QgYm90aCBleGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIGlmICggbGVmdF9kZXZpY2VfZGVwZW5kZW50X21hc2sgJiBkaWZmX21vZCApIHsKLSAgICAgICAgICAgIFFaX0hhbmRsZU1vZGlmaWVyT25lU2lkZSAoIHRoaXMsIG5ld01vZHMsIGxlZnRfa2V5X3N5bSwgbGVmdF9kZXZpY2VfZGVwZW5kZW50X21hc2sgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHJpZ2h0X2RldmljZV9kZXBlbmRlbnRfbWFzayAmIGRpZmZfbW9kICkgewotICAgICAgICAgICAgUVpfSGFuZGxlTW9kaWZpZXJPbmVTaWRlICggdGhpcywgbmV3TW9kcywgcmlnaHRfa2V5X3N5bSwgcmlnaHRfZGV2aWNlX2RlcGVuZGVudF9tYXNrICk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0gICAKLS8qIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIFFaX0RvU2lkZWRNb2RpZmllcnMuCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVsZWFzZSBhIGtleSBwcmVzcyBpbiB0aGUgY2FzZSB0aGF0IAotICogaXQgaXMgY2xlYXIgdGhhdCB0aGUgbW9kaWZpZXIgaGFzIGJlZW4gcmVsZWFzZWQgKGkuZS4gb25lIHNpZGUgCi0gKiBjYW4ndCBzdGlsbCBiZSBkb3duKS4KLSAqLwotc3RhdGljIHZvaWQgUVpfUmVsZWFzZU1vZGlmaWVyU2lkZSAoIF9USElTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2luZGVwZW5kZW50X21hc2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuZXdNb2RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZWZ0X2tleV9zeW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByaWdodF9rZXlfc3ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZWZ0X2RldmljZV9kZXBlbmRlbnRfbWFzaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJpZ2h0X2RldmljZV9kZXBlbmRlbnRfbWFzayApIHsKLSAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2RlcGVuZGVudF9tYXNrID0gMDsKLSAgICBTRExfa2V5c3ltIGtleTsKLSAgICAKLSAgICBrZXkuc2NhbmNvZGUgICAgPSAwOwotICAgIGtleS5zeW0gICAgICAgICA9IFNETEtfVU5LTk9XTjsKLSAgICBrZXkudW5pY29kZSAgICAgPSAwOwotICAgIGtleS5tb2QgICAgICAgICA9IEtNT0RfTk9ORTsKLSAgICAKLSAgICBkZXZpY2VfZGVwZW5kZW50X21hc2sgPSBsZWZ0X2RldmljZV9kZXBlbmRlbnRfbWFzayB8IHJpZ2h0X2RldmljZV9kZXBlbmRlbnRfbWFzazsKLSAgICAvKiBPbiB0aGUgYmFzaXMgdGhhdCB0aGUgZGV2aWNlIGluZGVwZW5kZW50IG1hc2sgaXMgc2V0LCBidXQgdGhlcmUgYXJlIAotICAgICAqIG5vIGRldmljZSBkZXBlbmRlbnQgZmxhZ3Mgc2V0LCB3ZSdsbCBhc3N1bWUgdGhhdCB3ZSBjYW4ndCBkZXRlY3QgdGhpcyAKLSAgICAgKiBrZXlib2FyZCBhbmQgcmV2ZXJ0IHRvIHRoZSB1bnNpZGVkIGJlaGF2aW9yLgotICAgICAqLwotICAgIGlmICggKGRldmljZV9kZXBlbmRlbnRfbWFzayAmIGN1cnJlbnRfbW9kcykgPT0gMCApIHsKLSAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBjYW4ndCBkZXRlY3QgdGhlIGtleWJvYXJkLCBzbyB1c2UgdGhlIGxlZnQgc2lkZSAKLSAgICAgICAgICogdG8gcmVwcmVzZW50IGJvdGgsIGFuZCByZWxlYXNlIGl0LiAKLSAgICAgICAgICovCi0gICAgICAgIGtleS5zeW0gPSBsZWZ0X2tleV9zeW07Ci0gICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9SRUxFQVNFRCwgJmtleSk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gICAgICAgIAotICAgIC8qIAotICAgICAqIFRoaXMgY291bGQgaGF2ZSBiZWVuIGRvbmUgaW4gYW4gaWYtZWxzZSBjYXNlIGJlY2F1c2UgYXQgdGhpcyBwb2ludCwKLSAgICAgKiB3ZSBrbm93IHRoYXQgYWxsIGtleXMgaGF2ZSBiZWVuIHJlbGVhc2VkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAgICAgKiBCdXQgSSdtIGJlaW5nIHBhcmFub2lkIHNvIEkgd2FudCB0byBoYW5kbGUgZWFjaCBzZXBhcmF0ZWx5LAotICAgICAqIHNvIEkgaG9wZSB0aGlzIGRvZXNuJ3QgY2F1c2Ugb3RoZXIgcHJvYmxlbXMuCi0gICAgICovCi0gICAgaWYgKCBsZWZ0X2RldmljZV9kZXBlbmRlbnRfbWFzayAmIGN1cnJlbnRfbW9kcyApIHsKLSAgICAgICAga2V5LnN5bSA9IGxlZnRfa2V5X3N5bTsKLSAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1JFTEVBU0VELCAma2V5KTsKLSAgICB9Ci0gICAgaWYgKCByaWdodF9kZXZpY2VfZGVwZW5kZW50X21hc2sgJiBjdXJyZW50X21vZHMgKSB7Ci0gICAgICAgIGtleS5zeW0gPSByaWdodF9rZXlfc3ltOwotICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUkVMRUFTRUQsICZrZXkpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgUVpfRG9TaWRlZE1vZGlmaWVycy4KLSAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgQ2Fwc0xvY2sgY2FzZS4KLSAqLwotc3RhdGljIHZvaWQgUVpfSGFuZGxlQ2Fwc0xvY2sgKF9USElTLCB1bnNpZ25lZCBpbnQgbmV3TW9kcykgewotICAgIHVuc2lnbmVkIGludCBjdXJyZW50TWFzaywgbmV3TWFzazsKLSAgICBTRExfa2V5c3ltIGtleTsKLSAgICAKLSAgICBrZXkuc2NhbmNvZGUgICAgPSAwOwotICAgIGtleS5zeW0gICAgICAgICA9IFNETEtfQ0FQU0xPQ0s7Ci0gICAga2V5LnVuaWNvZGUgICAgID0gMDsKLSAgICBrZXkubW9kICAgICAgICAgPSBLTU9EX05PTkU7Ci0gICAgCi0gICAgY3VycmVudE1hc2sgPSBjdXJyZW50X21vZHMgJiBOU0FscGhhU2hpZnRLZXlNYXNrOwotICAgIG5ld01hc2sgICAgID0gbmV3TW9kcyAmIE5TQWxwaGFTaGlmdEtleU1hc2s7Ci0KLSAgICBpZiAoIGN1cnJlbnRNYXNrICYmCi0gICAgICAgICBjdXJyZW50TWFzayAhPSBuZXdNYXNrICkgeyAgICAgLyogbW9kaWZpZXIgdXAgZXZlbnQgKi8KLSAgICAgICAgIC8qIElmIHRoaXMgd2FzIENhcHMgTG9jaywgd2UgbmVlZCBzb21lIGFkZGl0aW9uYWwgdm9vZG9vIHRvIG1ha2UgU0RMIGhhcHB5ICovCi0gICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUFJFU1NFRCwgJmtleSk7Ci0gICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUkVMRUFTRUQsICZrZXkpOwotICAgIH0KLSAgICBlbHNlIGlmICggbmV3TWFzayAmJgotICAgICAgICAgICAgICBjdXJyZW50TWFzayAhPSBuZXdNYXNrICkgeyAgICAgLyogbW9kaWZpZXIgZG93biBldmVudCAqLwotICAgICAgICAvKiBJZiB0aGlzIHdhcyBDYXBzIExvY2ssIHdlIG5lZWQgc29tZSBhZGRpdGlvbmFsIHZvb2RvbyB0byBtYWtlIFNETCBoYXBweSAqLwotICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUFJFU1NFRCwgJmtleSk7Ci0gICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9SRUxFQVNFRCwgJmtleSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIHRoZSBtb2RpZmllciBrZXlzIGFuZCBhbHNvIGRldGVybWluZSB0aGUgCi0gKiBjb3JyZWN0IHNpZGUgb2YgdGhlIGtleS4KLSAqLwotc3RhdGljIHZvaWQgUVpfRG9TaWRlZE1vZGlmaWVycyAoX1RISVMsIHVuc2lnbmVkIGludCBuZXdNb2RzKSB7Ci0JLyogU2V0IHVwIGFycmF5cyBmb3IgdGhlIGtleSBzeW1zIGZvciB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZS4gKi8KLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbGVmdF9tYXBwaW5nW10gID0geyBTRExLX0xTSElGVCwgU0RMS19MQ1RSTCwgU0RMS19MQUxULCBTRExLX0xNRVRBIH07Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IHJpZ2h0X21hcHBpbmdbXSA9IHsgU0RMS19SU0hJRlQsIFNETEtfUkNUUkwsIFNETEtfUkFMVCwgU0RMS19STUVUQSB9OwotCS8qIFNldCB1cCBhcnJheXMgZm9yIHRoZSBkZXZpY2UgZGVwZW5kZW50IG1hc2tzIHdpdGggaW5kaWNlcyB0aGF0IAotICAgICAqIGNvcnJlc3BvbmQgdG8gdGhlIF9tYXBwaW5nIGFycmF5cyAKLSAgICAgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbGVmdF9kZXZpY2VfbWFwcGluZ1tdICA9IHsgTlhfREVWSUNFTFNISUZUS0VZTUFTSywgTlhfREVWSUNFTENUTEtFWU1BU0ssIE5YX0RFVklDRUxBTFRLRVlNQVNLLCBOWF9ERVZJQ0VMQ01ES0VZTUFTSyB9OwotICAgIGNvbnN0IHVuc2lnbmVkIGludCByaWdodF9kZXZpY2VfbWFwcGluZ1tdID0geyBOWF9ERVZJQ0VSU0hJRlRLRVlNQVNLLCBOWF9ERVZJQ0VSQ1RMS0VZTUFTSywgTlhfREVWSUNFUkFMVEtFWU1BU0ssIE5YX0RFVklDRVJDTURLRVlNQVNLIH07Ci0KLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgYml0OwotICAgIAotICAgIC8qIEhhbmRsZSBDQVBTTE9DSyBzZXBhcmF0ZWx5IGJlY2F1c2UgaXQgZG9lc24ndCBoYXZlIGEgbGVmdC9yaWdodCBzaWRlICovCi0gICAgUVpfSGFuZGxlQ2Fwc0xvY2sgKCB0aGlzLCBuZXdNb2RzICk7Ci0gICAgICAgIAotICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYml0cywgdGVzdGluZyBlYWNoIGFnYWluc3QgdGhlIGN1cnJlbnQgbW9kaWZpZXJzICovCi0gICAgZm9yIChpID0gMCwgYml0ID0gTlNTaGlmdEtleU1hc2s7IGJpdCA8PSBOU0NvbW1hbmRLZXlNYXNrOyBiaXQgPDw9IDEsICsraSkgewotCQkKLSAgICAgICAgdW5zaWduZWQgaW50IGN1cnJlbnRNYXNrLCBuZXdNYXNrOwotCQkKLSAgICAgICAgY3VycmVudE1hc2sgPSBjdXJyZW50X21vZHMgJiBiaXQ7Ci0gICAgICAgIG5ld01hc2sgICAgID0gbmV3TW9kcyAmIGJpdDsKLQkJCi0gICAgICAgIC8qIElmIHRoZSBiaXQgaXMgc2V0LCB3ZSBtdXN0IGFsd2F5cyBleGFtaW5lIGl0IGJlY2F1c2UgdGhlIGxlZnQKLSAgICAgICAgICogYW5kIHJpZ2h0IHNpZGUga2V5cyBtYXkgYWx0ZXJuYXRlIG9yIGJvdGggbWF5IGJlIHByZXNzZWQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIG5ld01hc2sgKSB7Ci0gICAgICAgICAgICBRWl9IYW5kbGVNb2RpZmllclNpZGUgKCB0aGlzLCBiaXQsIG5ld01vZHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9tYXBwaW5nW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfbWFwcGluZ1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfZGV2aWNlX21hcHBpbmdbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9kZXZpY2VfbWFwcGluZ1tpXSApOwotICAgICAgICB9Ci0gICAgICAgIC8qIElmIHRoZSBzdGF0ZSBjaGFuZ2VkIGZyb20gcHJlc3NlZCB0byB1bnByZXNzZWQsIHdlIG11c3QgZXhhbWluZQotICAgICAgICAgICAgKiB0aGUgZGV2aWNlIGRlcGVuZGVudCBiaXRzIHRvIHJlbGVhc2UgdGhlIGNvcnJlY3Qga2V5cy4KLSAgICAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKCBjdXJyZW50TWFzayAmJgotICAgICAgICAgICAgICAgICAgY3VycmVudE1hc2sgIT0gbmV3TWFzayApIHsgLyogbW9kaWZpZXIgdXAgZXZlbnQgKi8KLSAgICAgICAgICAgICAgICAgIFFaX1JlbGVhc2VNb2RpZmllclNpZGUgKCB0aGlzLCBiaXQsIG5ld01vZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9tYXBwaW5nW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0X21hcHBpbmdbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9kZXZpY2VfbWFwcGluZ1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9kZXZpY2VfbWFwcGluZ1tpXSApOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBoYW5kbGUgdGhlIG1vZGlmaWVycy4KLSAqIEl0IHdpbGwgdHJ5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGxlZnQgc2lkZSBhbmQgcmlnaHQgc2lkZSAKLSAqIG9mIHRoZSBrZXlib2FyZCBmb3IgdGhvc2UgbW9kaWZpZXJzIHRoYXQgcXVhbGlmeSBpZiB0aGUgCi0gKiBvcGVyYXRpbmcgc3lzdGVtIHZlcnNpb24gc3VwcG9ydHMgaXQuIE90aGVyd2lzZSwgdGhlIGNvZGUgCi0gKiB3aWxsIG5vdCB0cnkgdG8gbWFrZSB0aGUgZGlzdGluY3Rpb24uCi0gKi8KLXN0YXRpYyB2b2lkIFFaX0RvTW9kaWZpZXJzIChfVEhJUywgdW5zaWduZWQgaW50IG5ld01vZHMpIHsKLQkKLSAgICBpZiAoY3VycmVudF9tb2RzID09IG5ld01vZHMpCi0gICAgCXJldHVybjsKLSAgICAKLSAgICAvKiAKLSAgICAgKiBTdGFydGluZyB3aXRoIFBhbnRoZXIgKDEwLjMuMCksIHRoZSBhYmlsaXR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gCi0gICAgICogbGVmdCBzaWRlIGFuZCByaWdodCBzaWRlIG1vZGlmaWVycyBpcyBhdmFpbGFibGUuCi0gICAgICovCi0gICAgaWYoIHN5c3RlbV92ZXJzaW9uID49IDB4MTAzMCApIHsKLSAgICAgICAgUVpfRG9TaWRlZE1vZGlmaWVycyAodGhpcywgbmV3TW9kcyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBRWl9Eb1Vuc2lkZWRNb2RpZmllcnMgKHRoaXMsIG5ld01vZHMpOwotICAgIH0KLSAgICAKLSAgICBjdXJyZW50X21vZHMgPSBuZXdNb2RzOwotfQotCi1zdGF0aWMgdm9pZCBRWl9HZXRNb3VzZUxvY2F0aW9uIChfVEhJUywgTlNQb2ludCAqcCkgewotICAgICpwID0gWyBOU0V2ZW50IG1vdXNlTG9jYXRpb24gXTsgLyogZ2xvYmFsIGNvb3JkaW5hdGVzICovCi0gICAgaWYgKHF6X3dpbmRvdykKLSAgICAgICAgUVpfUHJpdmF0ZUdsb2JhbFRvTG9jYWwgKHRoaXMsIHApOwotICAgIFFaX1ByaXZhdGVDb2NvYVRvU0RMICh0aGlzLCBwKTsKLX0KLQotdm9pZCBRWl9Eb0FjdGl2YXRlIChfVEhJUykgewotCi0gICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBJTlBVVEZPQ1VTIHwgKFFaX0lzTW91c2VJbldpbmRvdyAodGhpcykgPyBTRExfQVBQTU9VU0VGT0NVUyA6IDApKTsKLQotICAgIFFaX1VwZGF0ZUN1cnNvcih0aGlzKTsKLQotICAgIC8qIFJlZ3JhYiBpbnB1dCwgb25seSBpZiBpdCB3YXMgcHJldmlvdXNseSBncmFiYmVkICovCi0gICAgaWYgKCBjdXJyZW50X2dyYWJfbW9kZSA9PSBTRExfR1JBQl9PTiApIHsKLSAgICAgICAgCi0gICAgICAgIC8qIFJlc3RvcmUgY3Vyc29yIGxvY2F0aW9uIGlmIGlucHV0IHdhcyBncmFiYmVkICovCi0gICAgICAgIFFaX1ByaXZhdGVXYXJwQ3Vyc29yICh0aGlzLCBjdXJzb3JfbG9jLngsIGN1cnNvcl9sb2MueSk7Ci0gICAgICAgIFFaX0NoYW5nZUdyYWJTdGF0ZSAodGhpcywgUVpfRU5BQkxFX0dSQUIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogVXBkYXRlIFNETCdzIG1vdXNlIGxvY2F0aW9uICovCi0gICAgICAgIE5TUG9pbnQgcDsKLSAgICAgICAgUVpfR2V0TW91c2VMb2NhdGlvbiAodGhpcywgJnApOwotICAgICAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uICgwLCAwLCBwLngsIHAueSk7Ci0gICAgfQotfQotCi12b2lkIFFaX0RvRGVhY3RpdmF0ZSAoX1RISVMpIHsKLSAgICAKLSAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMCwgU0RMX0FQUElOUFVURk9DVVMgfCBTRExfQVBQTU9VU0VGT0NVUyk7Ci0KLSAgICAvKiBHZXQgdGhlIGN1cnJlbnQgY3Vyc29yIGxvY2F0aW9uLCBmb3IgcmVzdG9yZSBvbiBhY3RpdmF0ZSAqLwotICAgIFFaX0dldE1vdXNlTG9jYXRpb24gKHRoaXMsICZjdXJzb3JfbG9jKTsKLSAgICAKLSAgICAvKiBSZWFzc29jaWF0ZSBtb3VzZSBhbmQgY3Vyc29yICovCi0gICAgQ0dBc3NvY2lhdGVNb3VzZUFuZE1vdXNlQ3Vyc29yUG9zaXRpb24gKDEpOwotCi0gICAgUVpfVXBkYXRlQ3Vyc29yKHRoaXMpOwotfQotCi12b2lkIFFaX1NsZWVwTm90aWZpY2F0aW9uSGFuZGxlciAodm9pZCAqIHJlZmNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19zZXJ2aWNlX3Qgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXR1cmFsX3QgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIG1lc3NhZ2VBcmd1bWVudCApCi17Ci0gICAgIFNETF9WaWRlb0RldmljZSAqdGhpcyA9IChTRExfVmlkZW9EZXZpY2UqKXJlZmNvbjsKLSAgICAgCi0gICAgIHN3aXRjaChtZXNzYWdlVHlwZSkKLSAgICAgewotICAgICAgICAgY2FzZSBrSU9NZXNzYWdlU3lzdGVtV2lsbFNsZWVwOgotICAgICAgICAgICAgIElPQWxsb3dQb3dlckNoYW5nZShwb3dlcl9jb25uZWN0aW9uLCAobG9uZykgbWVzc2FnZUFyZ3VtZW50KTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2Uga0lPTWVzc2FnZUNhblN5c3RlbVNsZWVwOgotICAgICAgICAgICAgIElPQWxsb3dQb3dlckNoYW5nZShwb3dlcl9jb25uZWN0aW9uLCAobG9uZykgbWVzc2FnZUFyZ3VtZW50KTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2Uga0lPTWVzc2FnZVN5c3RlbUhhc1Bvd2VyZWRPbjoKLSAgICAgICAgICAgIC8qIGF3YWtlICovCi0gICAgICAgICAgICBTRExfUHJpdmF0ZUV4cG9zZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLX0KLQotdm9pZCBRWl9SZWdpc3RlckZvclNsZWVwTm90aWZpY2F0aW9ucyAoX1RISVMpCi17Ci0gICAgIENGUnVuTG9vcFNvdXJjZVJlZiBybHM7Ci0gICAgIElPTm90aWZpY2F0aW9uUG9ydFJlZiB0aGVQb3J0UmVmOwotICAgICBpb19vYmplY3RfdCBub3RpZmllcjsKLQotICAgICBwb3dlcl9jb25uZWN0aW9uID0gSU9SZWdpc3RlckZvclN5c3RlbVBvd2VyICh0aGlzLCAmdGhlUG9ydFJlZiwgUVpfU2xlZXBOb3RpZmljYXRpb25IYW5kbGVyLCAmbm90aWZpZXIpOwotCi0gICAgIGlmIChwb3dlcl9jb25uZWN0aW9uID09IDApCi0gICAgICAgICBOU0xvZyhAIlNETDogUVpfU2xlZXBOb3RpZmljYXRpb25IYW5kbGVyKCkgSU9SZWdpc3RlckZvclN5c3RlbVBvd2VyIGZhaWxlZC4iKTsKLQotICAgICBybHMgPSBJT05vdGlmaWNhdGlvblBvcnRHZXRSdW5Mb29wU291cmNlICh0aGVQb3J0UmVmKTsKLSAgICAgQ0ZSdW5Mb29wQWRkU291cmNlIChDRlJ1bkxvb3BHZXRDdXJyZW50KCksIHJscywga0NGUnVuTG9vcERlZmF1bHRNb2RlKTsKLSAgICAgQ0ZSZWxlYXNlIChybHMpOwotfQotCi0KLS8qIFRyeSB0byBtYXAgUXVhcnR6IG1vdXNlIGJ1dHRvbnMgdG8gU0RMJ3MgbGluZ28uLi4gKi8KLXN0YXRpYyBpbnQgUVpfT3RoZXJNb3VzZUJ1dHRvblRvU0RMKGludCBidXR0b24pCi17Ci0gICAgc3dpdGNoIChidXR0b24pCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4oU0RMX0JVVFRPTl9MRUZUKTsgICAvKiAxICovCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybihTRExfQlVUVE9OX1JJR0hUKTsgIC8qIDMgKi8KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcmV0dXJuKFNETF9CVVRUT05fTUlERExFKTsgLyogMiAqLwotICAgIH0KLQotICAgIC8qID49IDM6IHNraXAgNCAmIDUsIHNpbmNlIHRob3NlIGFyZSB0aGUgU0RMIG1vdXNld2hlZWwgYnV0dG9ucy4gKi8KLSAgICByZXR1cm4oYnV0dG9uICsgMyk7Ci19Ci0KLQotdm9pZCBRWl9QdW1wRXZlbnRzIChfVEhJUykKLXsKLSAgICBzdGF0aWMgVWludDMyIHNjcmVlbnNhdmVyVGlja3MgPSAwOwotICAgIFVpbnQzMiBub3dUaWNrczsKLSAgICBDR01vdXNlRGVsdGEgZHgsIGR5OwotCi0gICAgTlNEYXRlICpkaXN0YW50UGFzdDsKLSAgICBOU0V2ZW50ICpldmVudDsKLSAgICBOU1JlY3Qgd2luUmVjdDsKLSAgICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbDsKLQotICAgIGlmICghU0RMX1ZpZGVvU3VyZmFjZSkKLSAgICAgICAgcmV0dXJuOyAgLyogZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlcmUncyBubyBzY3JlZW4gc3VyZmFjZS4gKi8KLQotICAgIC8qIFVwZGF0ZSBhY3Rpdml0eSBldmVyeSBmaXZlIHNlY29uZHMgdG8gcHJldmVudCBzY3JlZW5zYXZlci4gLS1yeWFuLiAqLwotICAgIGlmICghYWxsb3dfc2NyZWVuc2F2ZXIpIHsKLSAgICAgICAgbm93VGlja3MgPSBTRExfR2V0VGlja3MoKTsKLSAgICAgICAgaWYgKChub3dUaWNrcyAtIHNjcmVlbnNhdmVyVGlja3MpID4gNTAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgVXBkYXRlU3lzdGVtQWN0aXZpdHkoVXNyQWN0aXZpdHkpOwotICAgICAgICAgICAgc2NyZWVuc2F2ZXJUaWNrcyA9IG5vd1RpY2tzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcG9vbCA9IFsgWyBOU0F1dG9yZWxlYXNlUG9vbCBhbGxvYyBdIGluaXQgXTsKLSAgICBkaXN0YW50UGFzdCA9IFsgTlNEYXRlIGRpc3RhbnRQYXN0IF07Ci0KLSAgICB3aW5SZWN0ID0gTlNNYWtlUmVjdCAoMCwgMCwgU0RMX1ZpZGVvU3VyZmFjZS0+dywgU0RMX1ZpZGVvU3VyZmFjZS0+aCk7Ci0gICAgCi0gICAgLyogd2hpbGUgZ3JhYmJlZCwgYWNjdW11bGF0ZSBhbGwgbW91c2UgbW92ZWQgZXZlbnRzIGludG8gb25lIFNETCBtb3VzZSBldmVudCAqLwotICAgIGR4ID0gMDsKLSAgICBkeSA9IDA7Ci0gICAgCi0gICAgZG8gewotICAgIAotICAgICAgICAvKiBQb2xsIGZvciBhbiBldmVudC4gVGhpcyB3aWxsIG5vdCBibG9jayAqLwotICAgICAgICBldmVudCA9IFsgTlNBcHAgbmV4dEV2ZW50TWF0Y2hpbmdNYXNrOk5TQW55RXZlbnRNYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbERhdGU6ZGlzdGFudFBhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kZTogTlNEZWZhdWx0UnVuTG9vcE1vZGUgZGVxdWV1ZTpZRVMgXTsKLSAgICAgICAgaWYgKGV2ZW50ICE9IG5pbCkgewotCi0gICAgICAgICAgICBpbnQgYnV0dG9uOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgICAgICAgICBCT09MIGlzSW5HYW1lV2luOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAjZGVmaW5lIERPX01PVVNFX0RPV04oYnV0dG9uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBNT1VTRUZPQ1VTICkgeyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24gKFNETF9QUkVTU0VELCBidXR0b24sIDAsIDApOyAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9tb3VzZV91cCB8PSAxPDxidXR0b247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBOU0FwcCBzZW5kRXZlbnQ6ZXZlbnQgXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9IHdoaWxlKDApCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICNkZWZpbmUgRE9fTU9VU0VfVVAoYnV0dG9uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBleHBlY3RfbW91c2VfdXAgJiAoMTw8YnV0dG9uKSApIHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uIChTRExfUkVMRUFTRUQsIGJ1dHRvbiwgMCwgMCk7ICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X21vdXNlX3VwICY9IH4oMTw8YnV0dG9uKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTlNBcHAgc2VuZEV2ZW50OmV2ZW50IF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0gd2hpbGUoMCkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHlwZSA9IFsgZXZlbnQgdHlwZSBdOwotICAgICAgICAgICAgaXNJbkdhbWVXaW4gPSBRWl9Jc01vdXNlSW5XaW5kb3cgKHRoaXMpOwotCi0gICAgICAgICAgICBRWl9Eb01vZGlmaWVycyh0aGlzLCBbIGV2ZW50IG1vZGlmaWVyRmxhZ3MgXSApOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE5TTGVmdE1vdXNlRG93bjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBTRExfZ2V0ZW52KCJTRExfSEFTM0JVVFRPTk1PVVNFIikgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBET19NT1VTRV9ET1dOIChTRExfQlVUVE9OX0xFRlQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBOU0NvbW1hbmRLZXlNYXNrICYgY3VycmVudF9tb2RzICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfdmlydHVhbF9idXR0b24gPSBTRExfQlVUVE9OX1JJR0hUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPX01PVVNFX0RPV04gKFNETF9CVVRUT05fUklHSFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIE5TQWx0ZXJuYXRlS2V5TWFzayAmIGN1cnJlbnRfbW9kcyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3ZpcnR1YWxfYnV0dG9uID0gU0RMX0JVVFRPTl9NSURETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9fTU9VU0VfRE9XTiAoU0RMX0JVVFRPTl9NSURETEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9fTU9VU0VfRE9XTiAoU0RMX0JVVFRPTl9MRUZUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTlNMZWZ0TW91c2VVcDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBsYXN0X3ZpcnR1YWxfYnV0dG9uICE9IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBET19NT1VTRV9VUCAobGFzdF92aXJ0dWFsX2J1dHRvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3ZpcnR1YWxfYnV0dG9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERPX01PVVNFX1VQIChTRExfQlVUVE9OX0xFRlQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBOU090aGVyTW91c2VEb3duOgotICAgICAgICAgICAgICAgIGNhc2UgTlNSaWdodE1vdXNlRG93bjoKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uID0gUVpfT3RoZXJNb3VzZUJ1dHRvblRvU0RMKFsgZXZlbnQgYnV0dG9uTnVtYmVyIF0pOwotICAgICAgICAgICAgICAgICAgICBET19NT1VTRV9ET1dOIChidXR0b24pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTlNPdGhlck1vdXNlVXA6Ci0gICAgICAgICAgICAgICAgY2FzZSBOU1JpZ2h0TW91c2VVcDoKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uID0gUVpfT3RoZXJNb3VzZUJ1dHRvblRvU0RMKFsgZXZlbnQgYnV0dG9uTnVtYmVyIF0pOwotICAgICAgICAgICAgICAgICAgICBET19NT1VTRV9VUCAoYnV0dG9uKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5TU3lzdGVtRGVmaW5lZDoKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgIEZ1dHVyZTogdXAgdG8gMzIgIm1vdXNlIiBidXR0b25zIGNhbiBiZSBoYW5kbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFtldmVudCBzdWJ0eXBlXSA9PSA3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ1dHRvbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IFsgZXZlbnQgZGF0YTIgXTsKLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBOU0xlZnRNb3VzZURyYWdnZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBOU1JpZ2h0TW91c2VEcmFnZ2VkOgotICAgICAgICAgICAgICAgIGNhc2UgTlNPdGhlck1vdXNlRHJhZ2dlZDogLyogdXN1YWxseSBtaWRkbGUgbW91c2UgZHJhZ2dlZCAqLwotICAgICAgICAgICAgICAgIGNhc2UgTlNNb3VzZU1vdmVkOgotICAgICAgICAgICAgICAgICAgICBpZiAoIGdyYWJfc3RhdGUgPT0gUVpfSU5WSVNJQkxFX0dSQUIgKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGlucHV0IGlzIGdyYWJiZWQraGlkZGVuLCB0aGUgY3Vyc29yIGRvZXNuJ3QgbW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB3ZSBoYXZlIHRvIGNhbGwgdGhlIGxvd2xldmVsIHdpbmRvdyBzZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gVGhpcyBpcyBsZXNzIGFjY3VyYXRlIGJ1dCB3b3JrcyBPSy4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgQ0dNb3VzZURlbHRhIGR4MSwgZHkxOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0dHZXRMYXN0TW91c2VEZWx0YSAoJmR4MSwgJmR5MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkeCArPSBkeDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkeSArPSBkeTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IHRoZSBhYnNvbHV0ZSBtb3VzZSBsb2NhdGlvbi4gVGhpcyBpcyBub3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2UgbG9jYXRpb24gYWZ0ZXIgdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRoZSAqY3VycmVudCogbW91c2UgbG9jYXRpb24sIGkuZS4gYWZ0ZXIgYWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZyBldmVudHMuIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGVyZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBtb3VzZSBtb3ZlZCBldmVudHMgaW4gdGhlIHF1ZXVlLCB3ZSBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgaWRlbnRpY2FsIGNhbGxzIHRvIFNETF9Qcml2YXRlTW91c2VNb3Rpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhhdCdzIG5vIHByb2JsZW0gc2luY2UgdGhlIGxhdHRlciBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVzIFNETCBldmVudHMgZm9yIG5vbnplcm8gbW92ZW1lbnRzLiBJbiBteQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaWVuY2Ugb24gUEJHNC8xMC40LjgsIHRoaXMgcmFyZWx5IGhhcHBlbnMgYW55d2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE5TUG9pbnQgcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFFaX0dldE1vdXNlTG9jYXRpb24gKHRoaXMsICZwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24gKDAsIDAsIHAueCwgcC55KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogCi0gICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGUgZ3JhYiBpbnB1dCtjdXJzb3IgdmlzaWJsZSBieSB3YXJwaW5nIHRoZSBjdXJzb3IgYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgaW50byB0aGUgZ2FtZSB3aW5kb3cuIFRoaXMgc3RpbGwgZ2VuZXJhdGVzIGEgbW91c2UgbW92ZWQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBidXQgbm90IGFzIGEgcmVzdWx0IG9mIHRoZSB3YXJwIChzbyBpdCdzIGluIHRoZSByaWdodCBkaXJlY3Rpb24pLgotICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIGdyYWJfc3RhdGUgPT0gUVpfVklTSUJMRV9HUkFCICYmICFpc0luR2FtZVdpbiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBOU1BvaW50IHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBRWl9HZXRNb3VzZUxvY2F0aW9uICh0aGlzLCAmcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcC54IDwgMC4wICkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC54ID0gMC4wOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHAueSA8IDAuMCApIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAueSA9IDAuMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwLnggPj0gd2luUmVjdC5zaXplLndpZHRoICkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC54ID0gd2luUmVjdC5zaXplLndpZHRoLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcC55ID49IHdpblJlY3Quc2l6ZS5oZWlnaHQgKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnkgPSB3aW5SZWN0LnNpemUuaGVpZ2h0LTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFFaX1ByaXZhdGVXYXJwQ3Vyc29yICh0aGlzLCBwLngsIHAueSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAoICFpc0luR2FtZVdpbiAmJiAoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUykgKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyYWJfc3RhdGUgPT0gUVpfSU5WSVNJQkxFX0dSQUIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgY3Vyc29yIGhhcyBsZWZ0IHRoZSB3aW5kb3cgZXZlbiB0aG91Z2ggaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Fzc29jaWF0ZWQgZnJvbSB0aGUgbW91c2UgKGFuZCB0aGVyZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZG4ndCBtb3ZlKTogdGhpcyBjYW4gaGFwcGVuIHdpdGggV2Fjb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxldHMsIGFuZCBpdCBlZmZlY3RpdmVseSBicmVha3MgdGhlIGdyYWIsIHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZSBkb3duIGV2ZW50cyBub3cgZ28gdG8gYmFja2dyb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLiBUaGUgb25seSBwb3NzaWJpbGl0eSB0byBhdm9pZCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVtcyB0byBiZSB0YWxraW5nIHRvIHRoZSB0YWJsZXQgZHJpdmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXBwbGVFdmVudHMpIHRvIGNvbnN0cmFpbiBpdHMgbWFwcGVkIGFyZWEgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3csIHdoaWNoIG1heSBub3QgYmUgd29ydGggdGhlIGVmZm9ydC4gRm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3csIGhhbmRsZSB0aGUgY29uZGl0aW9uIG1vcmUgZ3JhY2VmdWxseSB0aGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgYnkgcmVhc3NvY2lhdGluZyBjdXJzb3IgYW5kIG1vdXNlIHVudGlsIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yIGVudGVycyB0aGUgd2luZG93IGFnYWluLCBtYWtpbmcgaXQgb2J2aW91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHVzZXIgdGhhdCB0aGUgZ3JhYiBpcyBicm9rZW4uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR0Fzc29jaWF0ZU1vdXNlQW5kTW91c2VDdXJzb3JQb3NpdGlvbiAoMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFFaX1VwZGF0ZUN1cnNvcih0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmICggaXNJbkdhbWVXaW4gJiYgKFNETF9HZXRBcHBTdGF0ZSgpICYgKFNETF9BUFBNT1VTRUZPQ1VTIHwgU0RMX0FQUElOUFVURk9DVVMpKSA9PSBTRExfQVBQSU5QVVRGT0NVUyApIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBRWl9VcGRhdGVDdXJzb3IodGhpcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncmFiX3N0YXRlID09IFFaX0lOVklTSUJMRV9HUkFCKSB7IC8qc2VlIGNvbW1lbnQgYWJvdmUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFaX1ByaXZhdGVXYXJwQ3Vyc29yICh0aGlzLCBTRExfVmlkZW9TdXJmYWNlLT53IC8gMiwgU0RMX1ZpZGVvU3VyZmFjZS0+aCAvIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHQXNzb2NpYXRlTW91c2VBbmRNb3VzZUN1cnNvclBvc2l0aW9uICgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE5TU2Nyb2xsV2hlZWw6Ci0gICAgICAgICAgICAgICAgICAgIGlmICggaXNJbkdhbWVXaW4gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkeSwgZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVaW50OCBidXR0b247Ci0gICAgICAgICAgICAgICAgICAgICAgICBkeSA9IFsgZXZlbnQgZGVsdGFZIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBkeCA9IFsgZXZlbnQgZGVsdGFYIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGR5ID4gMC4wIHx8IGR4ID4gMC4wICkgLyogU2Nyb2xsIHVwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uID0gU0RMX0JVVFRPTl9XSEVFTFVQOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBTY3JvbGwgZG93biAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IFNETF9CVVRUT05fV0hFRUxET1dOOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIG5vdywgd2hlZWwgaXMgc2VudCBhcyBhIHF1aWNrIGRvd24rdXAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24gKFNETF9QUkVTU0VELCBidXR0b24sIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbiAoU0RMX1JFTEVBU0VELCBidXR0b24sIDAsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTlNLZXlVcDoKLSAgICAgICAgICAgICAgICAgICAgUVpfRG9LZXkgKHRoaXMsIFNETF9SRUxFQVNFRCwgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE5TS2V5RG93bjoKLSAgICAgICAgICAgICAgICAgICAgUVpfRG9LZXkgKHRoaXMsIFNETF9QUkVTU0VELCBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTlNGbGFnc0NoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTlNBcHBLaXREZWZpbmVkOgotICAgICAgICAgICAgICAgICAgICBbIE5TQXBwIHNlbmRFdmVudDpldmVudCBdOwotICAgICAgICAgICAgICAgICAgICBpZiAoWyBldmVudCBzdWJ0eXBlIF0gPT0gTlNBcHBsaWNhdGlvbkFjdGl2YXRlZEV2ZW50VHlwZSAmJiAobW9kZV9mbGFncyAmIFNETF9GVUxMU0NSRUVOKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGRlZmF1bHQgaGFuZGxpbmcgb2YgdGhpcyBldmVudCBzZWVtcyB0byByZXNldCBhbnkgY3Vyc29yIHNldCBieSBbTlNDdXJzb3Igc2V0XSAodXNlZCBieSBTRExfU2V0Q3Vyc29yKCkgaW4gZnVsbHNjcmVlbiBtb2RlKSB0byB0aGUgZGVmYXVsdCBzeXN0ZW0gYXJyb3cgY3Vyc29yICovCi0gICAgICAgICAgICAgICAgICAgICAgICBTRExfQ3Vyc29yICpzZGxjID0gU0RMX0dldEN1cnNvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNkbGMgIT0gTlVMTCAmJiBzZGxjLT53bV9jdXJzb3IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgc2RsYy0+d21fY3Vyc29yLT5uc2N1cnNvciBzZXQgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLyogY2FzZSBOU0FwcGxpY2F0aW9uRGVmaW5lZDogYnJlYWs7ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNhc2UgTlNQZXJpb2RpYzogYnJlYWs7ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNhc2UgTlNDdXJzb3JVcGRhdGU6IGJyZWFrOyAqLwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFsgTlNBcHAgc2VuZEV2ZW50OmV2ZW50IF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChldmVudCAhPSBuaWwpOwotICAgIAotICAgIC8qIGhhbmRsZSBhY2N1bXVsYXRlZCBtb3VzZSBtb3ZlZCBldmVudHMgKi8KLSAgICBpZiAoZHggIT0gMCB8fCBkeSAhPSAwKQotICAgICAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uICgwLCAxLCBkeCwgZHkpOwotICAgIAotICAgIFsgcG9vbCByZWxlYXNlIF07Ci19Ci0KLXZvaWQgUVpfVXBkYXRlTW91c2UgKF9USElTKQotewotICAgIE5TUG9pbnQgcDsKLSAgICBRWl9HZXRNb3VzZUxvY2F0aW9uICh0aGlzLCAmcCk7Ci0gICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKFFaX0lzTW91c2VJbldpbmRvdyAodGhpcyksIFNETF9BUFBNT1VTRUZPQ1VTKTsKLSAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uICgwLCAwLCBwLngsIHAueSk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6R0wubSBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpHTC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQ0NzQ1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpHTC5tCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9RdWFydHpWaWRlby5oIgotCi0vKgotICogR0xfQVJCX011bHRpc2FtcGxlIGlzIHN1cHBvc2VkIHRvIGJlIGF2YWlsYWJsZSBpbiAxMC4xLCBhY2NvcmRpbmcgdG8gQXBwbGU6Ci0gKgotICogICBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9vcGVuZ2wvZXh0ZW5zaW9ucy5odG1sI0dMX0FSQl9tdWx0aXNhbXBsZQotICoKLSAqICAuLi5idXQgaXQgaXNuJ3QgaW4gdGhlIHN5c3RlbSBoZWFkZXJzLCBhY2NvcmRpbmcgdG8gU2FtOgotICoKLSAqICAgaHR0cDovL3d3dy5saWJzZGwub3JnL3BpcGVybWFpbC9zZGwvMjAwMy1EZWNlbWJlci8wNTgzMzUuaHRtbAotICoKLSAqIFRoZXNlIGFyZSBub3JtYWxseSBlbnVtcyBhbmQgbm90ICNkZWZpbmVzIGluIHRoZSBzeXN0ZW0gaGVhZGVycy4KLSAqCi0gKiAgIC0tcnlhbi4KLSAqLwotI2lmIChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgMTAyMCkKLSNkZWZpbmUgTlNPcGVuR0xQRkFTYW1wbGVCdWZmZXJzICgoTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSkgNTUpCi0jZGVmaW5lIE5TT3BlbkdMUEZBU2FtcGxlcyAoKE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUpIDU2KQotI2VuZGlmCi0KLQotQGltcGxlbWVudGF0aW9uIE5TT3BlbkdMQ29udGV4dCAoQ0dMQ29udGV4dEFjY2VzcykKLS0gKENHTENvbnRleHRPYmopIGNnbENvbnRleHQ7Ci17Ci0gICAgcmV0dXJuIF9jb250ZXh0QXV4aWxpYXJ5OwotfQotQGVuZAotCi0vKiBPcGVuR0wgaGVscGVyIGZ1bmN0aW9ucyAodXNlZCBpbnRlcm5hbGx5KSAqLwotCi1pbnQgUVpfU2V0dXBPcGVuR0wgKF9USElTLCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpIHsKLQotICAgIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUgYXR0clszMl07Ci0gICAgTlNPcGVuR0xQaXhlbEZvcm1hdCAqZm10OwotICAgIGludCBpID0gMDsKLSAgICBpbnQgY29sb3JCaXRzID0gYnBwOwotCi0gICAgLyogaWYgYSBHTCBsaWJyYXJ5IGhhc24ndCBiZWVuIGxvYWRlZCBhdCB0aGlzIHBvaW50LCBsb2FkIHRoZSBkZWZhdWx0LiAqLwotICAgIGlmICghdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQpIHsKLSAgICAgICAgaWYgKFFaX0dMX0xvYWRMaWJyYXJ5KHRoaXMsIE5VTEwpID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgewotCi0gICAgICAgIGF0dHJbaSsrXSA9IE5TT3BlbkdMUEZBRnVsbFNjcmVlbjsKLSAgICB9Ci0gICAgLyogSW4gd2luZG93ZWQgbW9kZSwgdGhlIE9wZW5HTCBwaXhlbCBkZXB0aCBtdXN0IG1hdGNoIGRldmljZSBwaXhlbCBkZXB0aCAqLwotICAgIGVsc2UgaWYgKCBjb2xvckJpdHMgIT0gZGV2aWNlX2JwcCApIHsKLQotICAgICAgICBjb2xvckJpdHMgPSBkZXZpY2VfYnBwOwotICAgIH0KLQotICAgIGF0dHJbaSsrXSA9IE5TT3BlbkdMUEZBQ29sb3JTaXplOwotICAgIGF0dHJbaSsrXSA9IGNvbG9yQml0czsKLQotICAgIGF0dHJbaSsrXSA9IE5TT3BlbkdMUEZBRGVwdGhTaXplOwotICAgIGF0dHJbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplOwotCi0gICAgaWYgKCB0aGlzLT5nbF9jb25maWcuZG91YmxlX2J1ZmZlciApIHsKLSAgICAgICAgYXR0cltpKytdID0gTlNPcGVuR0xQRkFEb3VibGVCdWZmZXI7Ci0gICAgfQotCi0gICAgaWYgKCB0aGlzLT5nbF9jb25maWcuc3RlcmVvICkgewotICAgICAgICBhdHRyW2krK10gPSBOU09wZW5HTFBGQVN0ZXJlbzsKLSAgICB9Ci0KLSAgICBpZiAoIHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemUgIT0gMCApIHsKLSAgICAgICAgYXR0cltpKytdID0gTlNPcGVuR0xQRkFTdGVuY2lsU2l6ZTsKLSAgICAgICAgYXR0cltpKytdID0gdGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoICh0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemUgKwotICAgICAgICAgIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplICsKLSAgICAgICAgICB0aGlzLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplICsKLSAgICAgICAgICB0aGlzLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZSkgPiAwICkgewotICAgICAgICBhdHRyW2krK10gPSBOU09wZW5HTFBGQUFjY3VtU2l6ZTsKLSAgICAgICAgYXR0cltpKytdID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplICsgdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemUgKyB0aGlzLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplICsgdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemU7Ci0gICAgfQotCi0gICAgaWYgKCB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVidWZmZXJzICE9IDAgKSB7Ci0gICAgICAgIGF0dHJbaSsrXSA9IE5TT3BlbkdMUEZBU2FtcGxlQnVmZmVyczsKLSAgICAgICAgYXR0cltpKytdID0gdGhpcy0+Z2xfY29uZmlnLm11bHRpc2FtcGxlYnVmZmVyczsKLSAgICB9Ci0KLSAgICBpZiAoIHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXMgIT0gMCApIHsKLSAgICAgICAgYXR0cltpKytdID0gTlNPcGVuR0xQRkFTYW1wbGVzOwotICAgICAgICBhdHRyW2krK10gPSB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVzYW1wbGVzOwotICAgICAgICBhdHRyW2krK10gPSBOU09wZW5HTFBGQU5vUmVjb3Zlcnk7Ci0gICAgfQotCi0gICAgaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjZWxlcmF0ZWQgPiAwICkgewotICAgICAgICBhdHRyW2krK10gPSBOU09wZW5HTFBGQUFjY2VsZXJhdGVkOwotICAgIH0KLQotICAgIGF0dHJbaSsrXSA9IE5TT3BlbkdMUEZBU2NyZWVuTWFzazsKLSAgICBhdHRyW2krK10gPSBDR0Rpc3BsYXlJRFRvT3BlbkdMRGlzcGxheU1hc2sgKGRpc3BsYXlfaWQpOwotICAgIGF0dHJbaV0gPSAwOwotCi0gICAgZm10ID0gWyBbIE5TT3BlbkdMUGl4ZWxGb3JtYXQgYWxsb2MgXSBpbml0V2l0aEF0dHJpYnV0ZXM6YXR0ciBdOwotICAgIGlmIChmbXQgPT0gbmlsKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvciAoIkZhaWxlZCBjcmVhdGluZyBPcGVuR0wgcGl4ZWwgZm9ybWF0Iik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGdsX2NvbnRleHQgPSBbIFsgTlNPcGVuR0xDb250ZXh0IGFsbG9jIF0gaW5pdFdpdGhGb3JtYXQ6Zm10Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlQ29udGV4dDpuaWxdOwotCi0gICAgWyBmbXQgcmVsZWFzZSBdOwotCi0gICAgaWYgKGdsX2NvbnRleHQgPT0gbmlsKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvciAoIkZhaWxlZCBjcmVhdGluZyBPcGVuR0wgY29udGV4dCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBTeW5jaHJvbml6ZSBRWl9HTF9Td2FwQnVmZmVycygpIHRvIHZlcnRpY2FsIHJldHJhY2UuCi0gICAgICogKEFwcGxlJ3MgZG9jdW1lbnRhdGlvbiBpcyBub3QgY29tcGxldGVseSBjbGVhciBhYm91dCB3aGF0IHRoaXMgc2V0dGluZwotICAgICAqIGV4YWN0bHkgZG9lcywgSU1ITyAtIGZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIHNlZQotICAgICAqIGh0dHA6Ly9saXN0cy5hcHBsZS5jb20vYXJjaGl2ZXMvbWFjLW9wZW5nbC8yMDA2L0phbi9tc2cwMDA4MC5odG1sICkKLSAgICAgKi8KLSAgICBpZiAoIHRoaXMtPmdsX2NvbmZpZy5zd2FwX2NvbnRyb2wgPj0gMCApIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSB0aGlzLT5nbF9jb25maWcuc3dhcF9jb250cm9sOwotICAgICAgICBbIGdsX2NvbnRleHQgc2V0VmFsdWVzOiAmdmFsdWUgZm9yUGFyYW1ldGVyOiBOU09wZW5HTENQU3dhcEludGVydmFsIF07Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXaXNkb20gZnJvbSBBcHBsZSBlbmdpbmVlciBpbiByZWZlcmVuY2UgdG8gVVQyMDAzJ3MgT3BlbkdMIHBlcmZvcm1hbmNlOgotICAgICAqICAiWW91IGFyZSBibG93aW5nIGEgY291cGxlIG9mIHRoZSBpbnRlcm5hbCBPcGVuR0wgZnVuY3Rpb24gY2FjaGVzLiBUaGlzCi0gICAgICogIGFwcGVhcnMgdG8gYmUgaGFwcGVuaW5nIGluIHRoZSBWQU8gY2FzZS4gIFlvdSBjYW4gdGVsbCBPcGVuR0wgdG8gdXAKLSAgICAgKiAgdGhlIGNhY2hlIHNpemUgYnkgaXNzdWluZyB0aGUgZm9sbG93aW5nIGNhbGxzIHJpZ2h0IGFmdGVyIHlvdSBjcmVhdGUKLSAgICAgKiAgdGhlIE9wZW5HTCBjb250ZXh0LiAgVGhlIGRlZmF1bHQgY2FjaGUgc2l6ZSBpcyAxNi4iICAgIC0tcnlhbi4KLSAgICAgKi8KLQotICAgICNpZm5kZWYgR0xJX0FSUkFZX0ZVTkNfQ0FDSEVfTUFYCi0gICAgI2RlZmluZSBHTElfQVJSQVlfRlVOQ19DQUNIRV9NQVggMjg0Ci0gICAgI2VuZGlmCi0KLSAgICAjaWZuZGVmIEdMSV9TVUJNSVRfRlVOQ19DQUNIRV9NQVgKLSAgICAjZGVmaW5lIEdMSV9TVUJNSVRfRlVOQ19DQUNIRV9NQVggMjgwCi0gICAgI2VuZGlmCi0KLSAgICB7Ci0gICAgICAgIGxvbmcgY2FjaGVfbWF4ID0gNjQ7Ci0gICAgICAgIENHTENvbnRleHRPYmogY3R4ID0gWyBnbF9jb250ZXh0IGNnbENvbnRleHQgXTsKLSAgICAgICAgQ0dMU2V0UGFyYW1ldGVyIChjdHgsIEdMSV9TVUJNSVRfRlVOQ19DQUNIRV9NQVgsICZjYWNoZV9tYXgpOwotICAgICAgICBDR0xTZXRQYXJhbWV0ZXIgKGN0eCwgR0xJX0FSUkFZX0ZVTkNfQ0FDSEVfTUFYLCAmY2FjaGVfbWF4KTsKLSAgICB9Ci0KLSAgICAvKiBFbmQgV2lzZG9tIGZyb20gQXBwbGUgRW5naW5lZXIgc2VjdGlvbi4gLS1yeWFuLiAqLwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUVpfVGVhckRvd25PcGVuR0wgKF9USElTKSB7Ci0KLSAgICBbIE5TT3BlbkdMQ29udGV4dCBjbGVhckN1cnJlbnRDb250ZXh0IF07Ci0gICAgWyBnbF9jb250ZXh0IGNsZWFyRHJhd2FibGUgXTsKLSAgICBbIGdsX2NvbnRleHQgcmVsZWFzZSBdOwotfQotCi0KLS8qIFNETCBPcGVuR0wgZnVuY3Rpb25zICovCi1zdGF0aWMgY29uc3QgY2hhciAqREVGQVVMVF9PUEVOR0xfTElCX05BTUUgPQotICAgICIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9PcGVuR0wuZnJhbWV3b3JrL0xpYnJhcmllcy9saWJHTC5keWxpYiI7Ci0KLWludCAgICBRWl9HTF9Mb2FkTGlicmFyeSAgICAoX1RISVMsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKSB7Ci0gICAgaWYgKCBnbF9jb250ZXh0ICE9IE5VTEwgKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvcigiT3BlbkdMIGNvbnRleHQgYWxyZWFkeSBjcmVhdGVkIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAob3BlbmdsX2xpYnJhcnkgIT0gTlVMTCkKLSAgICAgICAgU0RMX1VubG9hZE9iamVjdChvcGVuZ2xfbGlicmFyeSk7Ci0KLSAgICBpZiAobG9jYXRpb24gPT0gTlVMTCkKLSAgICAgICAgbG9jYXRpb24gPSBERUZBVUxUX09QRU5HTF9MSUJfTkFNRTsKLQotICAgIG9wZW5nbF9saWJyYXJ5ID0gU0RMX0xvYWRPYmplY3QobG9jYXRpb24pOwotICAgIGlmIChvcGVuZ2xfbGlicmFyeSAhPSBOVUxMKSB7Ci0gICAgICAgIHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAwOwotICAgIHJldHVybiAtMTsKLX0KLQotdm9pZCogIFFaX0dMX0dldFByb2NBZGRyZXNzIChfVEhJUywgY29uc3QgY2hhciAqcHJvYykgewotICAgIHJldHVybiBTRExfTG9hZEZ1bmN0aW9uKG9wZW5nbF9saWJyYXJ5LCBwcm9jKTsKLX0KLQotaW50ICAgIFFaX0dMX0dldEF0dHJpYnV0ZSAgIChfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpIHsKLQotICAgIEdMZW51bSBhdHRyID0gMDsKLQotICAgIFFaX0dMX01ha2VDdXJyZW50ICh0aGlzKTsKLQotICAgIHN3aXRjaCAoYXR0cmliKSB7Ci0gICAgICAgIGNhc2UgU0RMX0dMX1JFRF9TSVpFOiBhdHRyID0gR0xfUkVEX0JJVFM7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0RMX0dMX0JMVUVfU0laRTogYXR0ciA9IEdMX0JMVUVfQklUUzsgIGJyZWFrOwotICAgICAgICBjYXNlIFNETF9HTF9HUkVFTl9TSVpFOiBhdHRyID0gR0xfR1JFRU5fQklUUzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0RMX0dMX0FMUEhBX1NJWkU6IGF0dHIgPSBHTF9BTFBIQV9CSVRTOyBicmVhazsKLSAgICAgICAgY2FzZSBTRExfR0xfRE9VQkxFQlVGRkVSOiBhdHRyID0gR0xfRE9VQkxFQlVGRkVSOyBicmVhazsKLSAgICAgICAgY2FzZSBTRExfR0xfREVQVEhfU0laRTogYXR0ciA9IEdMX0RFUFRIX0JJVFM7ICBicmVhazsKLSAgICAgICAgY2FzZSBTRExfR0xfU1RFTkNJTF9TSVpFOiBhdHRyID0gR0xfU1RFTkNJTF9CSVRTOyBicmVhazsKLSAgICAgICAgY2FzZSBTRExfR0xfQUNDVU1fUkVEX1NJWkU6IGF0dHIgPSBHTF9BQ0NVTV9SRURfQklUUzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkU6IGF0dHIgPSBHTF9BQ0NVTV9HUkVFTl9CSVRTOyBicmVhazsKLSAgICAgICAgY2FzZSBTRExfR0xfQUNDVU1fQkxVRV9TSVpFOiBhdHRyID0gR0xfQUNDVU1fQkxVRV9CSVRTOyBicmVhazsKLSAgICAgICAgY2FzZSBTRExfR0xfQUNDVU1fQUxQSEFfU0laRTogYXR0ciA9IEdMX0FDQ1VNX0FMUEhBX0JJVFM7IGJyZWFrOwotICAgICAgICBjYXNlIFNETF9HTF9TVEVSRU86IGF0dHIgPSBHTF9TVEVSRU87IGJyZWFrOwotICAgICAgICBjYXNlIFNETF9HTF9NVUxUSVNBTVBMRUJVRkZFUlM6IGF0dHIgPSBHTF9TQU1QTEVfQlVGRkVSU19BUkI7IGJyZWFrOwotICAgICAgICBjYXNlIFNETF9HTF9NVUxUSVNBTVBMRVNBTVBMRVM6IGF0dHIgPSBHTF9TQU1QTEVTX0FSQjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0RMX0dMX0JVRkZFUl9TSVpFOgotICAgICAgICB7Ci0gICAgICAgICAgICBHTGludCBiaXRzID0gMDsKLSAgICAgICAgICAgIEdMaW50IGNvbXBvbmVudDsKLQotICAgICAgICAgICAgLyogdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgc2luZ2xlIGZsYWcgaW4gT3BlbkdMIGZvciB0aGlzISAqLwotICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydiAoR0xfUkVEX0JJVFMsICZjb21wb25lbnQpOyAgIGJpdHMgKz0gY29tcG9uZW50OwotICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydiAoR0xfR1JFRU5fQklUUywmY29tcG9uZW50KTsgIGJpdHMgKz0gY29tcG9uZW50OwotICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydiAoR0xfQkxVRV9CSVRTLCAmY29tcG9uZW50KTsgIGJpdHMgKz0gY29tcG9uZW50OwotICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydiAoR0xfQUxQSEFfQklUUywgJmNvbXBvbmVudCk7IGJpdHMgKz0gY29tcG9uZW50OwotCi0gICAgICAgICAgICAqdmFsdWUgPSBiaXRzOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTRExfR0xfQUNDRUxFUkFURURfVklTVUFMOgotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIHZhbDsKLQkgICAgLyogRklYTUU6IEhvdyBkbyB3ZSBnZXQgdGhpcyBpbmZvcm1hdGlvbiBoZXJlPwotICAgICAgICAgICAgW2ZtdCBnZXRWYWx1ZXM6ICZ2YWwgZm9yQXR0cmlidXRlOiBOU09wZW5HTFBGQUFjY2VsZXJhdGVkIGF0dHIgZm9yVmlydHVhbFNjcmVlbjogMF07Ci0JICAgICovCi0JICAgIHZhbCA9ICh0aGlzLT5nbF9jb25maWcuYWNjZWxlcmF0ZWQgIT0gMCk7OwotICAgICAgICAgICAgKnZhbHVlID0gdmFsOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTRExfR0xfU1dBUF9DT05UUk9MOgotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIHZhbDsKLSAgICAgICAgICAgIFsgZ2xfY29udGV4dCBnZXRWYWx1ZXM6ICZ2YWwgZm9yUGFyYW1ldGVyOiBOU09wZW5HTENQU3dhcEludGVydmFsIF07Ci0gICAgICAgICAgICAqdmFsdWUgPSB2YWw7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGdsR2V0SW50ZWdlcnYgKGF0dHIsIChHTGludCAqKXZhbHVlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50ICAgIFFaX0dMX01ha2VDdXJyZW50ICAgIChfVEhJUykgewotICAgIFsgZ2xfY29udGV4dCBtYWtlQ3VycmVudENvbnRleHQgXTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCAgIFFaX0dMX1N3YXBCdWZmZXJzICAgIChfVEhJUykgewotICAgIFsgZ2xfY29udGV4dCBmbHVzaEJ1ZmZlciBdOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0ektleXMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpLZXlzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMWMxM2IuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0ektleXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAzICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFRoZXNlIGFyZSB0aGUgTWFjaW50b3NoIGtleSBzY2FuY29kZSBjb25zdGFudHMgLS0gZnJvbSBJbnNpZGUgTWFjaW50b3NoICovCi0KLSNkZWZpbmUgUVpfRVNDQVBFCQkweDM1Ci0jZGVmaW5lIFFaX0YxCQkJMHg3QQotI2RlZmluZSBRWl9GMgkJCTB4NzgKLSNkZWZpbmUgUVpfRjMJCQkweDYzCi0jZGVmaW5lIFFaX0Y0CQkJMHg3NgotI2RlZmluZSBRWl9GNQkJCTB4NjAKLSNkZWZpbmUgUVpfRjYJCQkweDYxCi0jZGVmaW5lIFFaX0Y3CQkJMHg2MgotI2RlZmluZSBRWl9GOAkJCTB4NjQKLSNkZWZpbmUgUVpfRjkJCQkweDY1Ci0jZGVmaW5lIFFaX0YxMAkJCTB4NkQKLSNkZWZpbmUgUVpfRjExCQkJMHg2NwotI2RlZmluZSBRWl9GMTIJCQkweDZGCi0jZGVmaW5lIFFaX0YxMwkJCTB4NjkKLSNkZWZpbmUgUVpfRjE0CQkJMHg2QgotI2RlZmluZSBRWl9GMTUJCQkweDcxCi0vKgotI2RlZmluZSBRWl9QUklOVAkJMHg2OQotI2RlZmluZSBRWl9TQ1JPTExPQ0sgICAgMHg2QgotI2RlZmluZSBRWl9QQVVTRQkJMHg3MQotKi8KLSNkZWZpbmUgUVpfUE9XRVIJCTB4N0YKLSNkZWZpbmUgUVpfQkFDS1FVT1RFCTB4MzIKLSNkZWZpbmUgUVpfMQkJCTB4MTIKLSNkZWZpbmUgUVpfMgkJCTB4MTMKLSNkZWZpbmUgUVpfMwkJCTB4MTQKLSNkZWZpbmUgUVpfNAkJCTB4MTUKLSNkZWZpbmUgUVpfNQkJCTB4MTcKLSNkZWZpbmUgUVpfNgkJCTB4MTYKLSNkZWZpbmUgUVpfNwkJCTB4MUEKLSNkZWZpbmUgUVpfOAkJCTB4MUMKLSNkZWZpbmUgUVpfOQkJCTB4MTkKLSNkZWZpbmUgUVpfMAkJCTB4MUQKLSNkZWZpbmUgUVpfTUlOVVMJCTB4MUIKLSNkZWZpbmUgUVpfRVFVQUxTCQkweDE4Ci0jZGVmaW5lIFFaX0JBQ0tTUEFDRQkweDMzCi0jZGVmaW5lIFFaX0lOU0VSVAkJMHg3MgotI2RlZmluZSBRWl9IT01FCQkJMHg3MwotI2RlZmluZSBRWl9QQUdFVVAJCTB4NzQKLSNkZWZpbmUgUVpfTlVNTE9DSwkJMHg0NwotI2RlZmluZSBRWl9LUF9FUVVBTFMJMHg1MQotI2RlZmluZSBRWl9LUF9ESVZJREUJMHg0QgotI2RlZmluZSBRWl9LUF9NVUxUSVBMWQkweDQzCi0jZGVmaW5lIFFaX1RBQgkJCTB4MzAKLSNkZWZpbmUgUVpfcQkJCTB4MEMKLSNkZWZpbmUgUVpfdwkJCTB4MEQKLSNkZWZpbmUgUVpfZQkJCTB4MEUKLSNkZWZpbmUgUVpfcgkJCTB4MEYKLSNkZWZpbmUgUVpfdAkJCTB4MTEKLSNkZWZpbmUgUVpfeQkJCTB4MTAKLSNkZWZpbmUgUVpfdQkJCTB4MjAKLSNkZWZpbmUgUVpfaQkJCTB4MjIKLSNkZWZpbmUgUVpfbwkJCTB4MUYKLSNkZWZpbmUgUVpfcAkJCTB4MjMKLSNkZWZpbmUgUVpfTEVGVEJSQUNLRVQJMHgyMQotI2RlZmluZSBRWl9SSUdIVEJSQUNLRVQJMHgxRQotI2RlZmluZSBRWl9CQUNLU0xBU0gJMHgyQQotI2RlZmluZSBRWl9ERUxFVEUJCTB4NzUKLSNkZWZpbmUgUVpfRU5ECQkJMHg3NwotI2RlZmluZSBRWl9QQUdFRE9XTgkJMHg3OQotI2RlZmluZSBRWl9LUDcJCQkweDU5Ci0jZGVmaW5lIFFaX0tQOAkJCTB4NUIKLSNkZWZpbmUgUVpfS1A5CQkJMHg1QwotI2RlZmluZSBRWl9LUF9NSU5VUwkJMHg0RQotI2RlZmluZSBRWl9DQVBTTE9DSwkJMHgzOQotI2RlZmluZSBRWl9hCQkJMHgwMAotI2RlZmluZSBRWl9zCQkJMHgwMQotI2RlZmluZSBRWl9kCQkJMHgwMgotI2RlZmluZSBRWl9mCQkJMHgwMwotI2RlZmluZSBRWl9nCQkJMHgwNQotI2RlZmluZSBRWl9oCQkJMHgwNAotI2RlZmluZSBRWl9qCQkJMHgyNgotI2RlZmluZSBRWl9rCQkJMHgyOAotI2RlZmluZSBRWl9sCQkJMHgyNQotI2RlZmluZSBRWl9TRU1JQ09MT04JMHgyOQotI2RlZmluZSBRWl9RVU9URQkJMHgyNwotI2RlZmluZSBRWl9SRVRVUk4JCTB4MjQKLSNkZWZpbmUgUVpfS1A0CQkJMHg1NgotI2RlZmluZSBRWl9LUDUJCQkweDU3Ci0jZGVmaW5lIFFaX0tQNgkJCTB4NTgKLSNkZWZpbmUgUVpfS1BfUExVUwkJMHg0NQotI2RlZmluZSBRWl9MU0hJRlQJCTB4MzgKLSNkZWZpbmUgUVpfegkJCTB4MDYKLSNkZWZpbmUgUVpfeAkJCTB4MDcKLSNkZWZpbmUgUVpfYwkJCTB4MDgKLSNkZWZpbmUgUVpfdgkJCTB4MDkKLSNkZWZpbmUgUVpfYgkJCTB4MEIKLSNkZWZpbmUgUVpfbgkJCTB4MkQKLSNkZWZpbmUgUVpfbQkJCTB4MkUKLSNkZWZpbmUgUVpfQ09NTUEJCTB4MkIKLSNkZWZpbmUgUVpfUEVSSU9ECQkweDJGCi0jZGVmaW5lIFFaX1NMQVNICQkweDJDCi0jaWYgMQkvKiBQYW50aGVyIG5vdyBkZWZpbmVzIHJpZ2h0IHNpZGUga2V5cyAqLwotI2RlZmluZSBRWl9SU0hJRlQJCTB4M0MKLSNlbmRpZgotI2RlZmluZSBRWl9VUAkJCTB4N0UKLSNkZWZpbmUgUVpfS1AxCQkJMHg1MwotI2RlZmluZSBRWl9LUDIJCQkweDU0Ci0jZGVmaW5lIFFaX0tQMwkJCTB4NTUKLSNkZWZpbmUgUVpfS1BfRU5URVIJCTB4NEMKLSNkZWZpbmUgUVpfTENUUkwJCTB4M0IKLSNkZWZpbmUgUVpfTEFMVAkJCTB4M0EKLSNkZWZpbmUgUVpfTE1FVEEJCTB4MzcKLSNkZWZpbmUgUVpfU1BBQ0UJCTB4MzEKLSNpZiAxCS8qIFBhbnRoZXIgbm93IGRlZmluZXMgcmlnaHQgc2lkZSBrZXlzICovCi0jZGVmaW5lIFFaX1JNRVRBCQkweDM2Ci0jZGVmaW5lIFFaX1JBTFQJCQkweDNECi0jZGVmaW5lIFFaX1JDVFJMCQkweDNFCi0jZW5kaWYKLSNkZWZpbmUgUVpfTEVGVAkJCTB4N0IKLSNkZWZpbmUgUVpfRE9XTgkJCTB4N0QKLSNkZWZpbmUgUVpfUklHSFQJCTB4N0MKLSNkZWZpbmUgUVpfS1AwCQkJMHg1MgotI2RlZmluZSBRWl9LUF9QRVJJT0QJMHg0MQotCi0vKiBXaWVyZCwgdGhlc2Uga2V5cyBhcmUgb24gbXkgaUJvb2sgdW5kZXIgTWFjIE9TIFggKi8KLSNkZWZpbmUgUVpfSUJPT0tfRU5URVIJCTB4MzQKLSNkZWZpbmUgUVpfSUJPT0tfTEVGVAkJMHgzQgotI2RlZmluZSBRWl9JQk9PS19SSUdIVAkJMHgzQwotI2RlZmluZSBRWl9JQk9PS19ET1dOCQkweDNECi0jZGVmaW5lIFFaX0lCT09LX1VQCQkJMHgzRQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0elZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6VmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0ODAzZC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6VmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAzICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qICAgIAotICAgIEBmaWxlICAgU0RMX1F1YXJ0elZpZGVvLmgKLSAgICBAYXV0aG9yIERhcnJlbGwgV2FsaXNzZXIsIE1heCBIb3JuLCBldCBhbC4KLSAgICAKLSAgICBAYWJzdHJhY3QgU0RMIHZpZGVvIGRyaXZlciBmb3IgTWFjIE9TIFguCi0gICAgCi0gICAgQGRpc2N1c3Npb24KLSAgICAKLSAgICBUT0RPCi0gICAgICAgIC0gSGFyZHdhcmUgQ3Vyc29yIHN1cHBvcnQgd2l0aCBOU0N1cnNvciBpbnN0ZWFkIG9mIENhcmJvbgotICAgICAgICAtIEtleWJvYXJkIHJlcGVhdC9tb3VzZSBzcGVlZCBhZGp1c3QgKGlmIG5lZWRlZCkKLSAgICAgICAgLSBNdWx0aXBsZSBtb25pdG9yIHN1cHBvcnQgKGN1cnJlbnRseSBvbmx5IG1haW4gZGlzcGxheSkKLSAgICAgICAgLSBBY2NlbGVyYXRlZCBibGl0dGluZyBzdXBwb3J0Ci0gICAgICAgIC0gRml4IHdoaXRlIE9wZW5HTCB3aW5kb3cgb24gbWluaW1pemUgKGZpeGVkKSAodXBkYXRlOiBicm9rZW4gYWdhaW4gb24gMTAuMikKLSAgICAgICAgLSBGaW5kIG91dCB3aGF0IGV2ZW50cyBzaG91bGQgYmUgc2VudC9pZ25vcmVkIGlmIHdpbmRvdyBpcyBtaW5pbWl6ZWQKLSAgICAgICAgLSBGaW5kIGEgd2F5IHRvIGRlYWwgd2l0aCBleHRlcm5hbCByZXNvbHV0aW9uL2RlcHRoIHN3aXRjaCB3aGlsZSBhcHAgaXMgcnVubmluZwotICAgICAgICAtIENoZWNrIGFjY3VyYWN5IG9mIFFaX1NldEdhbW1hKCkKLSAgICBQcm9ibGVtczoKLSAgICAgICAgLSBPR0wgbm90IHdvcmtpbmcgaW4gZnVsbCBzY3JlZW4gd2l0aCBzb2Z0d2FyZSByZW5kZXJlcgotICAgICAgICAtIFNldENvbG9ycyBzZXRzIHBhbGV0dGUgY29ycmVjdGx5IGJ1dCBjbGVhcnMgZnJhbWVidWZmZXIKLSAgICAgICAgLSBDcmFzaCBpbiBDRyBhZnRlciBzZXZlcmFsIG1vZGUgc3dpdGNoZXMgKEkgdGhpbmsgdGhpcyBoYXMgYmVlbiBmaXhlZCkKLSAgICAgICAgLSBSZXRhaW5lZCB3aW5kb3dzIGRvbid0IGRyYXcgdGhlaXIgdGl0bGUgYmFyIHF1aXRlIHJpZ2h0IChPUyBCdWcpIChub3QgdXNpbmcgcmV0YWluZWQgd2luZG93cykKLSAgICAgICAgLSBDdXJzb3IgaW4gOCBiaXQgbW9kZXMgaXMgc2NyZXd5IChtaWdodCBqdXN0IGJlIFJhZGVvbiBQQ0kgYnVnKSAodXBkYXRlOiBub3QganVzdCBSYWRlb24pCi0gICAgICAgIC0gV2FycGluZyBjdXJzb3IgZGVsYXlzIG1vdXNlIGV2ZW50cyBmb3IgYSBmcmFjdGlvbiBvZiBhIHNlY29uZCwKLSAgICAgICAgICB0aGVyZSBpcyBhIGhhY2sgYXJvdW5kIHRoaXMgdGhhdCBoZWxwcyBhIGJpdAotKi8KLQotLyogTmVlZHMgdG8gYmUgZmlyc3QsIHNvIFF1aWNrVGltZS5oIGRvZXNuJ3QgaW5jbHVkZSBnbGV4dC5oICgxMC40KSAqLwotI2luY2x1ZGUgIlNETF9vcGVuZ2wuaCIKLQotI2luY2x1ZGUgPENvY29hL0NvY29hLmg+Ci0jaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgotI2luY2x1ZGUgPFF1aWNrVGltZS9RdWlja1RpbWUuaD4KLSNpbmNsdWRlIDxPcGVuR0wvT3BlbkdMLmg+CS8qIEZvciBDR0wgZnVuY3Rpb25zIGFuZCB0eXBlcyAqLwotI2luY2x1ZGUgPElPS2l0L0lPS2l0TGliLmg+CS8qIEZvciBwb3dlcnNhdmUgaGFuZGxpbmcgKi8KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJTRExfdGhyZWFkLmgiCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2Vycm9yLmgiCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2xvYWRzby5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotLyogCi0gICAgVGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZGlyZWN0bHkgYWNjZXNzIE5TT3BlbkdMQ29udGV4dCdzIENHTCBjb250ZXh0Ci0gICAgV2UgbmVlZCB0aGlzIHRvIGNoZWNrIGZvciBlcnJvcnMgTlNPcGVuR0xDb250ZXh0IGRvZXNuJ3Qgc3VwcG9ydAotKi8KLUBpbnRlcmZhY2UgTlNPcGVuR0xDb250ZXh0IChDR0xDb250ZXh0QWNjZXNzKQotLSAoQ0dMQ29udGV4dE9iaikgY2dsQ29udGV4dDsKLUBlbmQKLQotCi0vKiBNYWluIGRyaXZlciBzdHJ1Y3R1cmUgdG8gc3RvcmUgcmVxdWlyZWQgc3RhdGUgaW5mb3JtYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKLQotICAgIEJPT0wgICAgICAgICAgICAgICBhbGxvd19zY3JlZW5zYXZlcjsgIC8qIDAgPT0gZGlzYWJsZSBzY3JlZW5zYXZlciAqLwotICAgIENHRGlyZWN0RGlzcGxheUlEICBkaXNwbGF5OyAgICAgICAgICAgIC8qIDAgPT0gbWFpbiBkaXNwbGF5IChvbmx5IHN1cHBvcnQgc2luZ2xlIGRpc3BsYXkpICovCi0gICAgQ0ZEaWN0aW9uYXJ5UmVmICAgIG1vZGU7ICAgICAgICAgICAgICAgLyogY3VycmVudCBtb2RlIG9mIHRoZSBkaXNwbGF5ICovCi0gICAgQ0ZEaWN0aW9uYXJ5UmVmICAgIHNhdmVfbW9kZTsgICAgICAgICAgLyogb3JpZ2luYWwgbW9kZSBvZiB0aGUgZGlzcGxheSAqLwotICAgIENGQXJyYXlSZWYgICAgICAgICBtb2RlX2xpc3Q7ICAgICAgICAgIC8qIGxpc3Qgb2YgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZXMgKi8KLSAgICBDR0RpcmVjdFBhbGV0dGVSZWYgcGFsZXR0ZTsgICAgICAgICAgICAvKiBwYWxldHRlIG9mIGFuIDgtYml0IGRpc3BsYXkgKi8KLSAgICBOU09wZW5HTENvbnRleHQgICAgKmdsX2NvbnRleHQ7ICAgICAgICAvKiBPcGVuR0wgcmVuZGVyaW5nIGNvbnRleHQgKi8KLSAgICBVaW50MzIgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYnBwOyAvKiBmcmVxdWVudGx5IHVzZWQgZGF0YSBhYm91dCB0aGUgZGlzcGxheSAqLwotICAgIFVpbnQzMiAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAgIC8qIGZsYWdzIGZvciBjdXJyZW50IG1vZGUsIGZvciB0ZWFyZG93biBwdXJwb3NlcyAqLwotICAgIFVpbnQzMiAgICAgICAgICAgICB2aWRlb19zZXQ7ICAgICAgICAgIC8qIGJvb2xlYW47IGluZGljYXRlcyBpZiB2aWRlbyB3YXMgc2V0IGNvcnJlY3RseSAqLwotICAgIFVpbnQzMiAgICAgICAgICAgICB3YXJwX2ZsYWc7ICAgICAgICAgIC8qIGJvb2xlYW47IG5vdGlmeSB0byBldmVudCBsb29wIHRoYXQgYSB3YXJwIGp1c3Qgb2NjdXJlZCAqLwotICAgIFVpbnQzMiAgICAgICAgICAgICB3YXJwX3RpY2tzOyAgICAgICAgIC8qIHRpbWVzdGFtcCB3aGVuIHRoZSB3YXJwIG9jY3VyZWQgKi8KLSAgICBOU1dpbmRvdyAgICAgICAgICAgKndpbmRvdzsgICAgICAgICAgICAvKiBDb2NvYSB3aW5kb3cgdG8gaW1wbGVtZW50IHRoZSBTREwgd2luZG93ICovCi0gICAgTlNRdWlja0RyYXdWaWV3ICAgICp2aWV3OyAgICAgICAgICAgICAgLyogdGhlIHdpbmRvdydzIHZpZXc7IGRyYXcgMkQgYW5kIE9wZW5HTCBpbnRvIHRoaXMgdmlldyAqLwotICAgIFNETF9TdXJmYWNlICAgICAgICAqcmVzaXplX2ljb247ICAgICAgIC8qIGljb24gZm9yIHRoZSByZXNpemUgYmFkZ2UsIHdlIGhhdmUgdG8gZHJhdyBpdCBieSBoYW5kICovCi0gICAgU0RMX0dyYWJNb2RlICAgICAgIGN1cnJlbnRfZ3JhYl9tb2RlOyAgLyogZGVmYXVsdCB2YWx1ZSBpcyBTRExfR1JBQl9PRkYgKi8KLSAgICBTRExfUmVjdCAgICAgICAgICAgKipjbGllbnRfbW9kZV9saXN0OyAvKiByZXNvbHV0aW9uIGxpc3QgdG8gcGFzcyBiYWNrIHRvIGNsaWVudCAqLwotICAgIFNETEtleSAgICAgICAgICAgICBrZXltYXBbMjU2XTsgICAgICAgIC8qIE1hYyBPUyBYIHRvIFNETCBrZXkgbWFwcGluZyAqLwotICAgIFVpbnQzMiAgICAgICAgICAgICBjdXJyZW50X21vZHM7ICAgICAgIC8qIGN1cnJlbnQga2V5Ym9hcmQgbW9kaWZpZXJzLCB0byB0cmFjayBtb2RpZmllciBzdGF0ZSAqLwotICAgIE5TVGV4dCAgICAgICAgICAgICAqZmllbGRfZWRpdDsgICAgICAgIC8qIGEgZmllbGQgZWRpdG9yIGZvciBrZXlib2FyZCBjb21wb3NpdGlvbiBwcm9jZXNzaW5nICovCi0gICAgVWludDMyICAgICAgICAgICAgIGxhc3RfdmlydHVhbF9idXR0b247LyogbGFzdCB2aXJ0dWFsIG1vdXNlIGJ1dHRvbiBwcmVzc2VkICovCi0gICAgaW9fY29ubmVjdF90ICAgICAgIHBvd2VyX2Nvbm5lY3Rpb247ICAgLyogdXNlZCB3aXRoIElPS2l0IHRvIGRldGVjdCB3YWtlIGZyb20gc2xlZXAgKi8KLSAgICBVaW50OCAgICAgICAgICAgICAgZXhwZWN0X21vdXNlX3VwOyAgICAvKiB1c2VkIHRvIGRldGVybWluZSB3aGVuIHRvIHNlbmQgbW91c2UgdXAgZXZlbnRzICovCi0gICAgVWludDggICAgICAgICAgICAgIGdyYWJfc3RhdGU7ICAgICAgICAgLyogdXNlZCB0byBtYW5hZ2UgZ3JhYiBiZWhhdmlvciAqLwotICAgIE5TUG9pbnQgICAgICAgICAgICBjdXJzb3JfbG9jOyAgICAgICAgIC8qIHNhdmVkIGN1cnNvciBjb29yZHMsIGZvciBhY3RpdmF0ZS9kZWFjdGl2YXRlIHdoZW4gZ3JhYmJlZCAqLwotICAgIEJPT0wgICAgICAgICAgICAgICBjdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGU7ICAgICAvKiB0ZWxscyBpZiBjdXJzb3IgaXMgc3VwcG9zZWQgdG8gYmUgdmlzaWJsZSAoU0RMX1Nob3dDdXJzb3IpICovCi0gICAgQk9PTCAgICAgICAgICAgICAgIGN1cnNvcl92aXNpYmxlOyAgICAgLyogdGVsbHMgaWYgY3Vyc29yIGlzICphY3R1YWxseSogdmlzaWJsZSBvciBub3QgKi8KLSAgICBVaW50OCogICAgICAgICAgICAgc3dfYnVmZmVyc1syXTsgICAgICAvKiBwb2ludGVycyB0byB0aGUgdHdvIHNvZnR3YXJlIGJ1ZmZlcnMgZm9yIGRvdWJsZS1idWZmZXIgZW11bGF0aW9uICovCi0gICAgU0RMX1RocmVhZCAgICAgICAgICp0aHJlYWQ7ICAgICAgICAgICAgLyogdGhyZWFkIGZvciBhc3luYyB1cGRhdGVzIHRvIHRoZSBzY3JlZW4gKi8KLSAgICBTRExfc2VtICAgICAgICAgICAgKnNlbTEsICpzZW0yOyAgICAgICAvKiBzeW5jaHJvbml6YXRpb24gZm9yIGFzeW5jIHNjcmVlbiB1cGRhdGVzICovCi0gICAgVWludDggICAgICAgICAgICAgICpjdXJyZW50X2J1ZmZlcjsgICAgLyogdGhlIGJ1ZmZlciBiZWluZyBjb3BpZWQgdG8gdGhlIHNjcmVlbiAqLwotICAgIEJPT0wgICAgICAgICAgICAgICBxdWl0X3RocmVhZDsgICAgICAgIC8qIHVzZWQgdG8gcXVpdCB0aGUgYXN5bmMgYmxpdHRpbmcgdGhyZWFkICovCi0gICAgU0ludDMyICAgICAgICAgICAgIHN5c3RlbV92ZXJzaW9uOyAgICAgLyogdXNlZCB0byBkaXMtL2VuYWJsZSB3b3JrYXJvdW5kcyBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbSB2ZXJzaW9uICovCi0gICAgCi0gICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSB5dXZfaWRoOwotICAgIE1hdHJpeFJlY29yZFB0ciAgICAgICAgeXV2X21hdHJpeDsKLSAgICBEZWNvbXByZXNzb3JDb21wb25lbnQgIHl1dl9jb2RlYzsKLSAgICBJbWFnZVNlcXVlbmNlICAgICAgICAgIHl1dl9zZXE7Ci0gICAgUGxhbmFyUGl4bWFwSW5mb1lVVjQyMCAqeXV2X3BpeG1hcDsKLSAgICBTaW50MTYgICAgICAgICAgICAgICAgICB5dXZfd2lkdGgsIHl1dl9oZWlnaHQ7Ci0gICAgQ0dyYWZQdHIgICAgICAgICAgICAgICAgeXV2X3BvcnQ7Ci0KLSAgICB2b2lkICpvcGVuZ2xfbGlicmFyeTsgICAgLyogZHluYW1pY2FsbHkgbG9hZGVkIE9wZW5HTCBsaWJyYXJ5LiAqLwotfSBTRExfUHJpdmF0ZVZpZGVvRGF0YTsKLQotI2RlZmluZSBfVEhJUyAgICBTRExfVmlkZW9EZXZpY2UgKnRoaXMKLSNkZWZpbmUgZGlzcGxheV9pZCAodGhpcy0+aGlkZGVuLT5kaXNwbGF5KQotI2RlZmluZSBtb2RlICh0aGlzLT5oaWRkZW4tPm1vZGUpCi0jZGVmaW5lIHNhdmVfbW9kZSAodGhpcy0+aGlkZGVuLT5zYXZlX21vZGUpCi0jZGVmaW5lIGFsbG93X3NjcmVlbnNhdmVyICh0aGlzLT5oaWRkZW4tPmFsbG93X3NjcmVlbnNhdmVyKQotI2RlZmluZSBtb2RlX2xpc3QgKHRoaXMtPmhpZGRlbi0+bW9kZV9saXN0KQotI2RlZmluZSBwYWxldHRlICh0aGlzLT5oaWRkZW4tPnBhbGV0dGUpCi0jZGVmaW5lIGdsX2NvbnRleHQgKHRoaXMtPmhpZGRlbi0+Z2xfY29udGV4dCkKLSNkZWZpbmUgZGV2aWNlX3dpZHRoICh0aGlzLT5oaWRkZW4tPndpZHRoKQotI2RlZmluZSBkZXZpY2VfaGVpZ2h0ICh0aGlzLT5oaWRkZW4tPmhlaWdodCkKLSNkZWZpbmUgZGV2aWNlX2JwcCAodGhpcy0+aGlkZGVuLT5icHApCi0jZGVmaW5lIG1vZGVfZmxhZ3MgKHRoaXMtPmhpZGRlbi0+ZmxhZ3MpCi0jZGVmaW5lIHF6X3dpbmRvdyAodGhpcy0+aGlkZGVuLT53aW5kb3cpCi0jZGVmaW5lIHdpbmRvd192aWV3ICh0aGlzLT5oaWRkZW4tPnZpZXcpCi0jZGVmaW5lIHZpZGVvX3NldCAodGhpcy0+aGlkZGVuLT52aWRlb19zZXQpCi0jZGVmaW5lIHdhcnBfdGlja3MgKHRoaXMtPmhpZGRlbi0+d2FycF90aWNrcykKLSNkZWZpbmUgd2FycF9mbGFnICh0aGlzLT5oaWRkZW4tPndhcnBfZmxhZykKLSNkZWZpbmUgcmVzaXplX2ljb24gKHRoaXMtPmhpZGRlbi0+cmVzaXplX2ljb24pCi0jZGVmaW5lIGN1cnJlbnRfZ3JhYl9tb2RlICh0aGlzLT5oaWRkZW4tPmN1cnJlbnRfZ3JhYl9tb2RlKQotI2RlZmluZSBjbGllbnRfbW9kZV9saXN0ICh0aGlzLT5oaWRkZW4tPmNsaWVudF9tb2RlX2xpc3QpCi0jZGVmaW5lIGtleW1hcCAodGhpcy0+aGlkZGVuLT5rZXltYXApCi0jZGVmaW5lIGN1cnJlbnRfbW9kcyAodGhpcy0+aGlkZGVuLT5jdXJyZW50X21vZHMpCi0jZGVmaW5lIGZpZWxkX2VkaXQgKHRoaXMtPmhpZGRlbi0+ZmllbGRfZWRpdCkKLSNkZWZpbmUgbGFzdF92aXJ0dWFsX2J1dHRvbiAodGhpcy0+aGlkZGVuLT5sYXN0X3ZpcnR1YWxfYnV0dG9uKQotI2RlZmluZSBwb3dlcl9jb25uZWN0aW9uICh0aGlzLT5oaWRkZW4tPnBvd2VyX2Nvbm5lY3Rpb24pCi0jZGVmaW5lIGV4cGVjdF9tb3VzZV91cCAodGhpcy0+aGlkZGVuLT5leHBlY3RfbW91c2VfdXApCi0jZGVmaW5lIGdyYWJfc3RhdGUgKHRoaXMtPmhpZGRlbi0+Z3JhYl9zdGF0ZSkKLSNkZWZpbmUgY3Vyc29yX2xvYyAodGhpcy0+aGlkZGVuLT5jdXJzb3JfbG9jKQotI2RlZmluZSBjdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGUgKHRoaXMtPmhpZGRlbi0+Y3Vyc29yX3Nob3VsZF9iZV92aXNpYmxlKQotI2RlZmluZSBjdXJzb3JfdmlzaWJsZSAodGhpcy0+aGlkZGVuLT5jdXJzb3JfdmlzaWJsZSkKLSNkZWZpbmUgc3dfYnVmZmVycyAodGhpcy0+aGlkZGVuLT5zd19idWZmZXJzKQotI2RlZmluZSB0aHJlYWQgKHRoaXMtPmhpZGRlbi0+dGhyZWFkKQotI2RlZmluZSBzZW0xICh0aGlzLT5oaWRkZW4tPnNlbTEpCi0jZGVmaW5lIHNlbTIgKHRoaXMtPmhpZGRlbi0+c2VtMikKLSNkZWZpbmUgY3VycmVudF9idWZmZXIgKHRoaXMtPmhpZGRlbi0+Y3VycmVudF9idWZmZXIpCi0jZGVmaW5lIHF1aXRfdGhyZWFkICh0aGlzLT5oaWRkZW4tPnF1aXRfdGhyZWFkKQotI2RlZmluZSBzeXN0ZW1fdmVyc2lvbiAodGhpcy0+aGlkZGVuLT5zeXN0ZW1fdmVyc2lvbikKLSNkZWZpbmUgb3BlbmdsX2xpYnJhcnkgKHRoaXMtPmhpZGRlbi0+b3BlbmdsX2xpYnJhcnkpCi0KLS8qIGdyYWIgc3RhdGVzIC0gdGhlIGlucHV0IGlzIGluIG9uZSBvZiB0aGVzZSBzdGF0ZXMgKi8KLWVudW0gewotICAgIFFaX1VOR1JBQkJFRCA9IDAsCi0gICAgUVpfVklTSUJMRV9HUkFCLAotICAgIFFaX0lOVklTSUJMRV9HUkFCCi19OwotCi0vKiBncmFiIGFjdGlvbnMgLSB0aGVzZSBjYW4gY2hhbmdlIHRoZSBncmFiYmVkIHN0YXRlICovCi1lbnVtIHsKLSAgICBRWl9FTkFCTEVfR1JBQiA9IDAsCi0gICAgUVpfRElTQUJMRV9HUkFCLAotICAgIFFaX0hJREVDVVJTT1IsCi0gICAgUVpfU0hPV0NVUlNPUgotfTsKLQotLyogR2FtbWEgRnVuY3Rpb25zICovCi1pbnQgICAgUVpfU2V0R2FtbWEgICAgICAgICAgKF9USElTLCBmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlKTsKLWludCAgICBRWl9HZXRHYW1tYSAgICAgICAgICAoX1RISVMsIGZsb2F0ICpyZWQsIGZsb2F0ICpncmVlbiwgZmxvYXQgKmJsdWUpOwotaW50ICAgIFFaX1NldEdhbW1hUmFtcCAgICAgIChfVEhJUywgVWludDE2ICpyYW1wKTsKLWludCAgICBRWl9HZXRHYW1tYVJhbXAgICAgICAoX1RISVMsIFVpbnQxNiAqcmFtcCk7Ci0KLS8qIE9wZW5HTCBmdW5jdGlvbnMgKi8KLWludCAgICBRWl9TZXR1cE9wZW5HTCAgICAgICAoX1RISVMsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci12b2lkICAgUVpfVGVhckRvd25PcGVuR0wgICAgKF9USElTKTsKLXZvaWQqICBRWl9HTF9HZXRQcm9jQWRkcmVzcyAoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpOwotaW50ICAgIFFaX0dMX0dldEF0dHJpYnV0ZSAgIChfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOwotaW50ICAgIFFaX0dMX01ha2VDdXJyZW50ICAgIChfVEhJUyk7Ci12b2lkICAgUVpfR0xfU3dhcEJ1ZmZlcnMgICAgKF9USElTKTsKLWludCAgICBRWl9HTF9Mb2FkTGlicmFyeSAgICAoX1RISVMsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKLQotLyogQ3Vyc29yIGFuZCBNb3VzZSBmdW5jdGlvbnMgKi8KLXZvaWQgICAgICAgICBRWl9GcmVlV01DdXJzb3IgICAgIChfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7Ci1XTWN1cnNvciogICAgUVpfQ3JlYXRlV01DdXJzb3IgICAoX1RISVMsIFVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKLWludCAgICAgICAgICBRWl9TaG93V01DdXJzb3IgICAgIChfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7Ci12b2lkICAgICAgICAgUVpfV2FycFdNQ3Vyc29yICAgICAoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci12b2lkICAgICAgICAgUVpfTW92ZVdNQ3Vyc29yICAgICAoX1RISVMsIGludCB4LCBpbnQgeSk7Ci12b2lkICAgICAgICAgUVpfQ2hlY2tNb3VzZU1vZGUgICAoX1RISVMpOwotdm9pZCAgICAgICAgIFFaX1VwZGF0ZU1vdXNlICAgICAgKF9USElTKTsKLQotLyogRXZlbnQgZnVuY3Rpb25zICovCi12b2lkICAgICAgICAgUVpfSW5pdE9TS2V5bWFwICAgICAoX1RISVMpOwotdm9pZCAgICAgICAgIFFaX1B1bXBFdmVudHMgICAgICAgKF9USElTKTsKLQotLyogV2luZG93IE1hbmFnZXIgZnVuY3Rpb25zICovCi12b2lkICAgICAgICAgUVpfU2V0Q2FwdGlvbiAgICAgICAoX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKLXZvaWQgICAgICAgICBRWl9TZXRJY29uICAgICAgICAgIChfVEhJUywgU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKTsKLWludCAgICAgICAgICBRWl9JY29uaWZ5V2luZG93ICAgIChfVEhJUyk7Ci12b2lkICAgICAgICAgUVpfU2V0V2luZG93UG9zICAgICAoX1RISVMsIGludCAgeCwgaW50ICB5KTsKLXZvaWQgICAgICAgICBRWl9HZXRXaW5kb3dQb3MgICAgIChfVEhJUywgaW50ICAqcHgsIGludCAgKnB5KTsKLWludCAgICAgICAgICBRWl9Jc1dpbmRvd1Zpc2libGUgIChfVEhJUywgaW50ICByZWNlbnRlcik7Ci1pbnQgICAgICAgICAgUVpfR2V0TW9uaXRvckRQSSAgICAoX1RISVMsIGludCAgKnhEcGksIGludCAqeURwaSk7Ci1pbnQgICAgICAgICAgUVpfR2V0TW9uaXRvclJlY3QgICAoX1RISVMsIFNETF9SZWN0ICAqcmVjdCk7Ci0KLVNETF9HcmFiTW9kZSBRWl9HcmFiSW5wdXQgICAgICAgIChfVEhJUywgU0RMX0dyYWJNb2RlIGdyYWJfbW9kZSk7Ci1pbnQgICAgICAgICAgUVpfR2V0V01JbmZvICAgICAgICAoX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pOwotCi0vKiBZVVYgZnVuY3Rpb25zICovCi1TRExfT3ZlcmxheSogUVpfQ3JlYXRlWVVWT3ZlcmxheSAoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpOwotCi0KLS8qIFByaXZhdGUgZnVuY3Rpb25zICh1c2VkIGludGVybmFsbHkpICovCi12b2lkICAgICAgICAgUVpfUHJpdmF0ZVdhcnBDdXJzb3IgKF9USElTLCBpbnQgeCwgaW50IHkpOwotdm9pZCAgICAgICAgIFFaX0NoYW5nZUdyYWJTdGF0ZSAoX1RISVMsIGludCBhY3Rpb24pOwotdm9pZCAgICAgICAgIFFaX1JlZ2lzdGVyRm9yU2xlZXBOb3RpZmljYXRpb25zIChfVEhJUyk7Ci12b2lkICAgICAgICAgUVpfUHJpdmF0ZUdsb2JhbFRvTG9jYWwgKF9USElTLCBOU1BvaW50ICpwKTsKLXZvaWQgICAgICAgICBRWl9Qcml2YXRlQ29jb2FUb1NETCAoX1RISVMsIE5TUG9pbnQgKnApOwotQk9PTCAgICAgICAgIFFaX0lzTW91c2VJbldpbmRvdyAoX1RISVMpOwotdm9pZCAgICAgICAgIFFaX0RvQWN0aXZhdGUgKF9USElTKTsKLXZvaWQgICAgICAgICBRWl9Eb0RlYWN0aXZhdGUgKF9USElTKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpWaWRlby5tIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0elZpZGVvLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZGQ2MGIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0elZpZGVvLm0KKysrIC9kZXYvbnVsbApAQCAtMSwxNjkxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9RdWFydHpWaWRlby5oIgotI2luY2x1ZGUgIlNETF9RdWFydHpXaW5kb3cuaCIKLSNpbmNsdWRlICJTRExfUXVhcnR6V00uaCIKLQotLyogCi0gICAgQWRkIG1ldGhvZHMgdG8gZ2V0IGF0IHByaXZhdGUgbWVtYmVycyBvZiBOU1NjcmVlbi4gCi0gICAgU2luY2UgdGhlcmUgaXMgYSBidWcgaW4gQXBwbGUncyBzY3JlZW4gc3dpdGNoaW5nIGNvZGUKLSAgICB0aGF0IGRvZXMgbm90IHVwZGF0ZSB0aGlzIHZhcmlhYmxlIHdoZW4gc3dpdGNoaW5nCi0gICAgdG8gZnVsbHNjcmVlbiwgd2UnbGwgc2V0IGl0IG1hbnVhbGx5IChidXQgb25seSBmb3IgdGhlCi0gICAgbWFpbiBzY3JlZW4pLgotKi8KLUBpbnRlcmZhY2UgTlNTY3JlZW4gKE5TU2NyZWVuQWNjZXNzKQotLSAodm9pZCkgc2V0RnJhbWU6KE5TUmVjdClmcmFtZTsKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIE5TU2NyZWVuIChOU1NjcmVlbkFjY2VzcykKLS0gKHZvaWQpIHNldEZyYW1lOihOU1JlY3QpZnJhbWU7Ci17Ci0gICAgX2ZyYW1lID0gZnJhbWU7Ci19Ci1AZW5kCi0KLQotLyogQm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCAgICAgICAgICAgICAgUVpfQXZhaWxhYmxlICgpOwotc3RhdGljIFNETF9WaWRlb0RldmljZSogUVpfQ3JlYXRlRGV2aWNlIChpbnQgZGV2aWNlX2luZGV4KTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgIFFaX0RlbGV0ZURldmljZSAoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpOwotCi0vKiBJbml0aWFsaXphdGlvbiwgUXVlcnksIFNldHVwLCBhbmQgUmVkcmF3aW5nIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCAgICAgICAgICBRWl9WaWRlb0luaXQgICAgICAgIChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2aWRlb19mb3JtYXQpOwotCi1zdGF0aWMgU0RMX1JlY3QqKiAgIFFaX0xpc3RNb2RlcyAgICAgICAgKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDMyIGZsYWdzKTsKLXN0YXRpYyB2b2lkICAgICAgICAgUVpfVW5zZXRWaWRlb01vZGUgICAoX1RISVMsIEJPT0wgdG9fZGVza3RvcCk7Ci0KLXN0YXRpYyBTRExfU3VyZmFjZSogUVpfU2V0VmlkZW9Nb2RlICAgICAoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgaW50ICAgICAgICAgIFFaX1RvZ2dsZUZ1bGxTY3JlZW4gKF9USElTLCBpbnQgb24pOwotc3RhdGljIGludCAgICAgICAgICBRWl9TZXRDb2xvcnMgICAgICAgIChfVEhJUywgaW50IGZpcnN0X2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpOwotCi1zdGF0aWMgaW50ICAgICAgICAgIFFaX0xvY2tEb3VibGVCdWZmZXIgICAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkICAgICAgICAgUVpfVW5sb2NrRG91YmxlQnVmZmVyIChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCAgICAgICAgICBRWl9UaHJlYWRGbGlwICAgICAgICAgKF9USElTKTsKLXN0YXRpYyBpbnQgICAgICAgICAgUVpfRmxpcERvdWJsZUJ1ZmZlciAgIChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgICAgICAgICBRWl9Eb3VibGVCdWZmZXJVcGRhdGUgKF9USElTLCBpbnQgbnVtX3JlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotCi1zdGF0aWMgdm9pZCAgICAgICAgIFFaX0RpcmVjdFVwZGF0ZSAgICAgKF9USElTLCBpbnQgbnVtX3JlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotc3RhdGljIGludCAgICAgICAgICBRWl9Mb2NrV2luZG93ICAgICAgIChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgICAgICAgICBRWl9VbmxvY2tXaW5kb3cgICAgIChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgICAgICAgICBRWl9VcGRhdGVSZWN0cyAgICAgIChfVEhJUywgaW50IG51bV9yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLXN0YXRpYyB2b2lkICAgICAgICAgUVpfVmlkZW9RdWl0ICAgICAgICAoX1RISVMpOwotCi0vKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAoZm9yIGZ1bGxzY3JlZW4gbW9kZSBvbmx5KSAqLwotI2lmIDAgLyogTm90IHVzZWQgKGFwcGFyZW50bHksIGl0J3MgcmVhbGx5IHNsb3cpICovCi1zdGF0aWMgaW50ICBRWl9GaWxsSFdSZWN0IChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcik7Ci0jZW5kaWYKLXN0YXRpYyBpbnQgIFFaX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIFFaX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBRWl9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgUVpfRnJlZUhXU3VyZmFjZSAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLS8qIHN0YXRpYyBpbnQgIFFaX0ZsaXBIV1N1cmZhY2UgKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7ICovCi0KLS8qIEJvb3RzdHJhcCBiaW5kaW5nLCBlbmFibGVzIGVudHJ5IHBvaW50IGludG8gdGhlIGRyaXZlciAqLwotVmlkZW9Cb290U3RyYXAgUVpfYm9vdHN0cmFwID0gewotICAgICJRdWFydHoiLCAiTWFjIE9TIFggQ29yZUdyYXBoaWNzIiwgUVpfQXZhaWxhYmxlLCBRWl9DcmVhdGVEZXZpY2UKLX07Ci0KLQotLyogQm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBRWl9BdmFpbGFibGUgKCkgewotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlKiBRWl9DcmVhdGVEZXZpY2UgKGludCBkZXZpY2VfaW5kZXgpIHsKLQotI3ByYWdtYSB1bnVzZWQgKGRldmljZV9pbmRleCkKLQotICAgIFNETF9WaWRlb0RldmljZSAqZGV2aWNlOwotICAgIFNETF9Qcml2YXRlVmlkZW9EYXRhICpoaWRkZW47Ci0KLSAgICBkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlKikgU0RMX21hbGxvYyAoc2l6ZW9mICgqZGV2aWNlKSApOwotICAgIGhpZGRlbiA9IChTRExfUHJpdmF0ZVZpZGVvRGF0YSopIFNETF9tYWxsb2MgKHNpemVvZiAoKmhpZGRlbikgKTsKLQotICAgIGlmIChkZXZpY2UgPT0gTlVMTCB8fCBoaWRkZW4gPT0gTlVMTCkKLSAgICAgICAgU0RMX091dE9mTWVtb3J5ICgpOwotCi0gICAgU0RMX21lbXNldCAoZGV2aWNlLCAwLCBzaXplb2YgKCpkZXZpY2UpICk7Ci0gICAgU0RMX21lbXNldCAoaGlkZGVuLCAwLCBzaXplb2YgKCpoaWRkZW4pICk7Ci0KLSAgICBkZXZpY2UtPmhpZGRlbiA9IGhpZGRlbjsKLQotICAgIGRldmljZS0+VmlkZW9Jbml0ICAgICAgICA9IFFaX1ZpZGVvSW5pdDsKLSAgICBkZXZpY2UtPkxpc3RNb2RlcyAgICAgICAgPSBRWl9MaXN0TW9kZXM7Ci0gICAgZGV2aWNlLT5TZXRWaWRlb01vZGUgICAgID0gUVpfU2V0VmlkZW9Nb2RlOwotICAgIGRldmljZS0+VG9nZ2xlRnVsbFNjcmVlbiA9IFFaX1RvZ2dsZUZ1bGxTY3JlZW47Ci0gICAgZGV2aWNlLT5VcGRhdGVNb3VzZSAgICAgID0gUVpfVXBkYXRlTW91c2U7Ci0gICAgZGV2aWNlLT5TZXRDb2xvcnMgICAgICAgID0gUVpfU2V0Q29sb3JzOwotICAgIC8qIGRldmljZS0+VXBkYXRlUmVjdHMgICAgICA9IFFaX1VwZGF0ZVJlY3RzOyB0aGlzIGlzIGRldGVybWluZWQgYnkgU2V0VmlkZW9Nb2RlKCkgKi8KLSAgICBkZXZpY2UtPlZpZGVvUXVpdCAgICAgICAgPSBRWl9WaWRlb1F1aXQ7Ci0KLSAgICBkZXZpY2UtPkxvY2tIV1N1cmZhY2UgICA9IFFaX0xvY2tIV1N1cmZhY2U7Ci0gICAgZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBRWl9VbmxvY2tIV1N1cmZhY2U7Ci0gICAgZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSAgID0gUVpfQWxsb2NIV1N1cmZhY2U7Ci0gICAgZGV2aWNlLT5GcmVlSFdTdXJmYWNlICAgPSBRWl9GcmVlSFdTdXJmYWNlOwotICAgIC8qIGRldmljZS0+RmxpcEhXU3VyZmFjZSAgID0gUVpfRmxpcEhXU3VyZmFjZSAqLzsKLQotICAgIGRldmljZS0+U2V0R2FtbWEgICAgID0gUVpfU2V0R2FtbWE7Ci0gICAgZGV2aWNlLT5HZXRHYW1tYSAgICAgPSBRWl9HZXRHYW1tYTsKLSAgICBkZXZpY2UtPlNldEdhbW1hUmFtcCA9IFFaX1NldEdhbW1hUmFtcDsKLSAgICBkZXZpY2UtPkdldEdhbW1hUmFtcCA9IFFaX0dldEdhbW1hUmFtcDsKLQotICAgIGRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBRWl9HTF9HZXRQcm9jQWRkcmVzczsKLSAgICBkZXZpY2UtPkdMX0dldEF0dHJpYnV0ZSAgID0gUVpfR0xfR2V0QXR0cmlidXRlOwotICAgIGRldmljZS0+R0xfTWFrZUN1cnJlbnQgICAgPSBRWl9HTF9NYWtlQ3VycmVudDsKLSAgICBkZXZpY2UtPkdMX1N3YXBCdWZmZXJzICAgID0gUVpfR0xfU3dhcEJ1ZmZlcnM7Ci0gICAgZGV2aWNlLT5HTF9Mb2FkTGlicmFyeSAgICA9IFFaX0dMX0xvYWRMaWJyYXJ5OwotCi0gICAgZGV2aWNlLT5GcmVlV01DdXJzb3IgICA9IFFaX0ZyZWVXTUN1cnNvcjsKLSAgICBkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gUVpfQ3JlYXRlV01DdXJzb3I7Ci0gICAgZGV2aWNlLT5TaG93V01DdXJzb3IgICA9IFFaX1Nob3dXTUN1cnNvcjsKLSAgICBkZXZpY2UtPldhcnBXTUN1cnNvciAgID0gUVpfV2FycFdNQ3Vyc29yOwotICAgIGRldmljZS0+TW92ZVdNQ3Vyc29yICAgPSBRWl9Nb3ZlV01DdXJzb3I7Ci0gICAgZGV2aWNlLT5DaGVja01vdXNlTW9kZSA9IFFaX0NoZWNrTW91c2VNb2RlOwotICAgIGRldmljZS0+SW5pdE9TS2V5bWFwICAgPSBRWl9Jbml0T1NLZXltYXA7Ci0gICAgZGV2aWNlLT5QdW1wRXZlbnRzICAgICA9IFFaX1B1bXBFdmVudHM7Ci0KLSAgICBkZXZpY2UtPlNldENhcHRpb24gICAgICA9IFFaX1NldENhcHRpb247Ci0gICAgZGV2aWNlLT5TZXRJY29uICAgICAgICAgPSBRWl9TZXRJY29uOwotICAgIGRldmljZS0+SWNvbmlmeVdpbmRvdyAgID0gUVpfSWNvbmlmeVdpbmRvdzsKLSAgICBkZXZpY2UtPlNldFdpbmRvd1BvcyAgICA9IFFaX1NldFdpbmRvd1BvczsKLSAgICBkZXZpY2UtPkdldFdpbmRvd1BvcyAgICA9IFFaX0dldFdpbmRvd1BvczsKLSAgICBkZXZpY2UtPklzV2luZG93VmlzaWJsZSA9IFFaX0lzV2luZG93VmlzaWJsZTsKLSAgICBkZXZpY2UtPkdldE1vbml0b3JEUEkgICA9IFFaX0dldE1vbml0b3JEUEk7Ci0gICAgZGV2aWNlLT5HZXRNb25pdG9yUmVjdCAgPSBRWl9HZXRNb25pdG9yUmVjdDsKLSAgICBkZXZpY2UtPkdldFdNSW5mbyAgICAgPSBRWl9HZXRXTUluZm87Ci0gICAgZGV2aWNlLT5HcmFiSW5wdXQgICAgID0gUVpfR3JhYklucHV0OwotCi0gICAgZGV2aWNlLT5DcmVhdGVZVVZPdmVybGF5ID0gIFFaX0NyZWF0ZVlVVk92ZXJsYXk7Ci0KLSAgICBkZXZpY2UtPmZyZWUgICAgICAgICAgICAgPSBRWl9EZWxldGVEZXZpY2U7Ci0KLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi1zdGF0aWMgdm9pZCBRWl9EZWxldGVEZXZpY2UgKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKSB7Ci0KLSAgICBTRExfZnJlZSAoZGV2aWNlLT5oaWRkZW4pOwotICAgIFNETF9mcmVlIChkZXZpY2UpOwotfQotCi1zdGF0aWMgaW50IFFaX1ZpZGVvSW5pdCAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmlkZW9fZm9ybWF0KSB7Ci0KLSAgICBOU1JlY3QgciA9IE5TTWFrZVJlY3QoMC4wLCAwLjAsIDAuMCwgMC4wKTsKLSAgICBjb25zdCBjaGFyICplbnYgPSBOVUxMOwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gc2V0dGluZ3M7IHRoaXMgZGF0YSBwZXJzaXN0cyBiZXR3ZWVuIG1vZGUgc3dpdGNoZXMgKi8KLSAgICBkaXNwbGF5X2lkID0ga0NHRGlyZWN0TWFpbkRpc3BsYXk7Ci0gICAgc2F2ZV9tb2RlICA9IENHRGlzcGxheUN1cnJlbnRNb2RlICAgIChkaXNwbGF5X2lkKTsKLSAgICBtb2RlX2xpc3QgID0gQ0dEaXNwbGF5QXZhaWxhYmxlTW9kZXMgKGRpc3BsYXlfaWQpOwotICAgIHBhbGV0dGUgICAgPSBDR1BhbGV0dGVDcmVhdGVEZWZhdWx0Q29sb3JQYWxldHRlICgpOwotCi0gICAgZW52ID0gU0RMX2dldGVudigiU0RMX1ZJREVPX0FMTE9XX1NDUkVFTlNBVkVSIik7Ci0gICAgYWxsb3dfc2NyZWVuc2F2ZXIgPSAoIGVudiAmJiBTRExfYXRvaShlbnYpICkgPyBZRVMgOiBOTzsKLQotICAgIC8qIEdhdGhlciBzb21lIGluZm9ybWF0aW9uIHRoYXQgaXMgdXNlZnVsIHRvIGtub3cgYWJvdXQgdGhlIGRpc3BsYXkgKi8KLSAgICBDRk51bWJlckdldFZhbHVlIChDRkRpY3Rpb25hcnlHZXRWYWx1ZSAoc2F2ZV9tb2RlLCBrQ0dEaXNwbGF5Qml0c1BlclBpeGVsKSwKLSAgICAgICAgICAgICAgICAgICAgICBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmZGV2aWNlX2JwcCk7Ci0KLSAgICBDRk51bWJlckdldFZhbHVlIChDRkRpY3Rpb25hcnlHZXRWYWx1ZSAoc2F2ZV9tb2RlLCBrQ0dEaXNwbGF5V2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgIGtDRk51bWJlclNJbnQzMlR5cGUsICZkZXZpY2Vfd2lkdGgpOwotCi0gICAgQ0ZOdW1iZXJHZXRWYWx1ZSAoQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHNhdmVfbW9kZSwga0NHRGlzcGxheUhlaWdodCksCi0gICAgICAgICAgICAgICAgICAgICAga0NGTnVtYmVyU0ludDMyVHlwZSwgJmRldmljZV9oZWlnaHQpOwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCi0gICAgdGhpcy0+aW5mby5jdXJyZW50X3cgPSBkZXZpY2Vfd2lkdGg7Ci0gICAgdGhpcy0+aW5mby5jdXJyZW50X2ggPSBkZXZpY2VfaGVpZ2h0OwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHNjcmVlbiBkZXB0aCAqLwotICAgIHZpZGVvX2Zvcm1hdC0+Qml0c1BlclBpeGVsID0gZGV2aWNlX2JwcDsKLQotICAgIC8qIFNldCBtaXNjIGdsb2JhbHMgKi8KLSAgICBjdXJyZW50X2dyYWJfbW9kZSA9IFNETF9HUkFCX09GRjsKLSAgICBjdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGUgICAgPSBZRVM7Ci0gICAgY3Vyc29yX3Zpc2libGUgICAgICAgICAgICAgID0gWUVTOwotICAgIGN1cnJlbnRfbW9kcyA9IDA7Ci0gICAgZmllbGRfZWRpdCA9ICBbW05TVGV4dFZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6cl07Ci0gICAgCi0gICAgaWYgKCBHZXN0YWx0KGdlc3RhbHRTeXN0ZW1WZXJzaW9uLCAmc3lzdGVtX3ZlcnNpb24pICE9IG5vRXJyICkKLSAgICAgICAgc3lzdGVtX3ZlcnNpb24gPSAwOwotICAgIAotICAgIC8qIHJlZ2lzdGVyIGZvciBzbGVlcCBub3RpZmljYXRpb25zIHNvIHdha2UgZnJvbSBzbGVlcCBnZW5lcmF0ZXMgU0RMX1ZJREVPRVhQT1NFICovCi0gICAgUVpfUmVnaXN0ZXJGb3JTbGVlcE5vdGlmaWNhdGlvbnMgKHRoaXMpOwotICAgIAotICAgIC8qIEZpbGwgaW4gc29tZSB3aW5kb3cgbWFuYWdlciBjYXBhYmlsaXRpZXMgKi8KLSAgICB0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFNETF9SZWN0KiogUVpfTGlzdE1vZGVzIChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykgewotCi0gICAgQ0ZJbmRleCBudW1fbW9kZXM7Ci0gICAgQ0ZJbmRleCBpOwotCi0gICAgaW50IGxpc3Rfc2l6ZSA9IDA7Ci0KLSAgICAvKiBBbnkgd2luZG93ZWQgbW9kZSBpcyBhY2NlcHRhYmxlICovCi0gICAgaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gMCApCi0gICAgICAgIHJldHVybiAoU0RMX1JlY3QqKiktMTsKLQotICAgIC8qIEZyZWUgbWVtb3J5IGZyb20gcHJldmlvdXMgY2FsbCwgaWYgYW55ICovCi0gICAgaWYgKCBjbGllbnRfbW9kZV9saXN0ICE9IE5VTEwgKSB7Ci0KLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgY2xpZW50X21vZGVfbGlzdFtpXSAhPSBOVUxMOyBpKyspCi0gICAgICAgICAgICBTRExfZnJlZSAoY2xpZW50X21vZGVfbGlzdFtpXSk7Ci0KLSAgICAgICAgU0RMX2ZyZWUgKGNsaWVudF9tb2RlX2xpc3QpOwotICAgICAgICBjbGllbnRfbW9kZV9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBudW1fbW9kZXMgPSBDRkFycmF5R2V0Q291bnQgKG1vZGVfbGlzdCk7Ci0KLSAgICAvKiBCdWlsZCBsaXN0IG9mIG1vZGVzIHdpdGggdGhlIHJlcXVlc3RlZCBicHAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21vZGVzOyBpKyspIHsKLQotICAgICAgICBDRkRpY3Rpb25hcnlSZWYgb25lbW9kZTsKLSAgICAgICAgQ0ZOdW1iZXJSZWYgICAgIG51bWJlcjsKLSAgICAgICAgaW50IGJwcDsKLQotICAgICAgICBvbmVtb2RlID0gQ0ZBcnJheUdldFZhbHVlQXRJbmRleCAobW9kZV9saXN0LCBpKTsKLSAgICAgICAgbnVtYmVyID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKG9uZW1vZGUsIGtDR0Rpc3BsYXlCaXRzUGVyUGl4ZWwpOwotICAgICAgICBDRk51bWJlckdldFZhbHVlIChudW1iZXIsIGtDRk51bWJlclNJbnQzMlR5cGUsICZicHApOwotCi0gICAgICAgIGlmIChicHAgPT0gZm9ybWF0LT5CaXRzUGVyUGl4ZWwpIHsKLQotICAgICAgICAgICAgaW50IGludHZhbHVlOwotICAgICAgICAgICAgaW50IGhhc01vZGU7Ci0gICAgICAgICAgICBpbnQgd2lkdGgsIGhlaWdodDsKLQotICAgICAgICAgICAgbnVtYmVyID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKG9uZW1vZGUsIGtDR0Rpc3BsYXlXaWR0aCk7Ci0gICAgICAgICAgICBDRk51bWJlckdldFZhbHVlIChudW1iZXIsIGtDRk51bWJlclNJbnQzMlR5cGUsICZpbnR2YWx1ZSk7Ci0gICAgICAgICAgICB3aWR0aCA9IChVaW50MTYpIGludHZhbHVlOwotCi0gICAgICAgICAgICBudW1iZXIgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAob25lbW9kZSwga0NHRGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICBDRk51bWJlckdldFZhbHVlIChudW1iZXIsIGtDRk51bWJlclNJbnQzMlR5cGUsICZpbnR2YWx1ZSk7Ci0gICAgICAgICAgICBoZWlnaHQgPSAoVWludDE2KSBpbnR2YWx1ZTsKLQotICAgICAgICAgICAgLyogQ2hlY2sgaWYgbW9kZSBpcyBhbHJlYWR5IGluIHRoZSBsaXN0ICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgICAgaGFzTW9kZSA9IFNETF9GQUxTRTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdF9zaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudF9tb2RlX2xpc3RbaV0tPncgPT0gd2lkdGggJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfbW9kZV9saXN0W2ldLT5oID09IGhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFzTW9kZSA9IFNETF9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEdyb3cgdGhlIGxpc3QgYW5kIGFkZCBtb2RlIHRvIHRoZSBsaXN0ICovCi0gICAgICAgICAgICBpZiAoICEgaGFzTW9kZSApIHsKLQotICAgICAgICAgICAgICAgIFNETF9SZWN0ICpyZWN0OwotCi0gICAgICAgICAgICAgICAgbGlzdF9zaXplKys7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50X21vZGVfbGlzdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBjbGllbnRfbW9kZV9saXN0ID0gKFNETF9SZWN0KiopIAotICAgICAgICAgICAgICAgICAgICAgICAgU0RMX21hbGxvYyAoc2l6ZW9mKCpjbGllbnRfbW9kZV9saXN0KSAqIChsaXN0X3NpemUrMSkgKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudF9tb2RlX2xpc3QgPSAoU0RMX1JlY3QqKikgCi0gICAgICAgICAgICAgICAgICAgICAgICBTRExfcmVhbGxvYyAoY2xpZW50X21vZGVfbGlzdCwgc2l6ZW9mKCpjbGllbnRfbW9kZV9saXN0KSAqIChsaXN0X3NpemUrMSkpOwotCi0gICAgICAgICAgICAgICAgcmVjdCA9IChTRExfUmVjdCopIFNETF9tYWxsb2MgKHNpemVvZigqKmNsaWVudF9tb2RlX2xpc3QpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjbGllbnRfbW9kZV9saXN0ID09IE5VTEwgfHwgcmVjdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVjdC0+eCA9IHJlY3QtPnkgPSAwOwotICAgICAgICAgICAgICAgIHJlY3QtPncgPSB3aWR0aDsKLSAgICAgICAgICAgICAgICByZWN0LT5oID0gaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgY2xpZW50X21vZGVfbGlzdFtsaXN0X3NpemUtMV0gPSByZWN0OwotICAgICAgICAgICAgICAgIGNsaWVudF9tb2RlX2xpc3RbbGlzdF9zaXplXSAgID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNvcnQgbGlzdCBsYXJnZXN0IHRvIHNtYWxsZXN0IChieSBhcmVhKSAqLwotICAgIHsKLSAgICAgICAgaW50IGksIGo7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0X3NpemU7IGkrKykgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxpc3Rfc2l6ZS0xOyBqKyspIHsKLQotICAgICAgICAgICAgICAgIGludCBhcmVhMSwgYXJlYTI7Ci0gICAgICAgICAgICAgICAgYXJlYTEgPSBjbGllbnRfbW9kZV9saXN0W2pdLT53ICogY2xpZW50X21vZGVfbGlzdFtqXS0+aDsKLSAgICAgICAgICAgICAgICBhcmVhMiA9IGNsaWVudF9tb2RlX2xpc3RbaisxXS0+dyAqIGNsaWVudF9tb2RlX2xpc3RbaisxXS0+aDsKLQotICAgICAgICAgICAgICAgIGlmIChhcmVhMSA8IGFyZWEyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNETF9SZWN0ICp0bXAgPSBjbGllbnRfbW9kZV9saXN0W2pdOwotICAgICAgICAgICAgICAgICAgICBjbGllbnRfbW9kZV9saXN0W2pdID0gY2xpZW50X21vZGVfbGlzdFtqKzFdOwotICAgICAgICAgICAgICAgICAgICBjbGllbnRfbW9kZV9saXN0W2orMV0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjbGllbnRfbW9kZV9saXN0OwotfQotCi1zdGF0aWMgU0RMX2Jvb2wgUVpfV2luZG93UG9zaXRpb24oX1RISVMsIGludCAqeCwgaW50ICp5KQotewotICAgIGNvbnN0IGNoYXIgKndpbmRvdyA9IGdldGVudigiU0RMX1ZJREVPX1dJTkRPV19QT1MiKTsKLSAgICBpZiAoIHdpbmRvdyApIHsKLSAgICAgICAgaWYgKCBzc2NhbmYod2luZG93LCAiJWQsJWQiLCB4LCB5KSA9PSAyICkgewotICAgICAgICAgICAgcmV0dXJuIFNETF9UUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBTRExfRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkIFFaX1Vuc2V0VmlkZW9Nb2RlIChfVEhJUywgQk9PTCB0b19kZXNrdG9wKSB7Ci0KLSAgICAvKiBSZXNldCB2YWx1ZXMgdGhhdCBtYXkgY2hhbmdlIGJldHdlZW4gc3dpdGNoZXMgKi8KLSAgICB0aGlzLT5pbmZvLmJsaXRfZmlsbCAgPSAwOwotICAgIHRoaXMtPkZpbGxIV1JlY3QgICAgICA9IE5VTEw7Ci0gICAgdGhpcy0+VXBkYXRlUmVjdHMgICAgID0gTlVMTDsKLSAgICB0aGlzLT5Mb2NrSFdTdXJmYWNlICAgPSBOVUxMOwotICAgIHRoaXMtPlVubG9ja0hXU3VyZmFjZSA9IE5VTEw7Ci0gICAgCi0gICAgLyogUmVsZWFzZSBmdWxsc2NyZWVuIHJlc291cmNlcyAqLwotICAgIGlmICggbW9kZV9mbGFncyAmIFNETF9GVUxMU0NSRUVOICkgewotCi0gICAgICAgIE5TUmVjdCBzY3JlZW5fcmVjdDsKLSAgICAgICAgCi0gICAgICAgIC8qICBSZWxlYXNlIGRvdWJsZSBidWZmZXIgc3R1ZmYgKi8KLSAgICAgICAgaWYgKCBtb2RlX2ZsYWdzICYgU0RMX0RPVUJMRUJVRikgewotICAgICAgICAgICAgcXVpdF90aHJlYWQgPSBZRVM7Ci0gICAgICAgICAgICBTRExfU2VtUG9zdCAoc2VtMSk7Ci0gICAgICAgICAgICBTRExfV2FpdFRocmVhZCAodGhyZWFkLCBOVUxMKTsKLSAgICAgICAgICAgIFNETF9EZXN0cm95U2VtYXBob3JlIChzZW0xKTsKLSAgICAgICAgICAgIFNETF9EZXN0cm95U2VtYXBob3JlIChzZW0yKTsKLSAgICAgICAgICAgIFNETF9mcmVlIChzd19idWZmZXJzWzBdKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogSWYgd2Ugc3RpbGwgaGF2ZSBhIHZhbGlkIHdpbmRvdywgY2xvc2UgaXQuICovCi0gICAgICAgIGlmICggcXpfd2luZG93ICkgewotICAgICAgICAgICAgWyBxel93aW5kb3cgY2xvc2UgXTsKLSAgICAgICAgICAgIFsgcXpfd2luZG93IHJlbGVhc2UgXTsKLSAgICAgICAgICAgIHF6X3dpbmRvdyA9IG5pbDsKLSAgICAgICAgICAgIHdpbmRvd192aWV3ID0gbmlsOwotICAgICAgICB9Ci0gICAgICAgIC8qIAotICAgICAgICAgICAgUmVsZWFzZSB0aGUgT3BlbkdMIGNvbnRleHQKLSAgICAgICAgICAgIERvIHRoaXMgZmlyc3QgdG8gYXZvaWQgdHJhc2ggb24gdGhlIGRpc3BsYXkgYmVmb3JlIGZhZGUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKCBtb2RlX2ZsYWdzICYgU0RMX09QRU5HTCApIHsKLSAgICAgICAgCi0gICAgICAgICAgICBRWl9UZWFyRG93bk9wZW5HTCAodGhpcyk7Ci0gICAgICAgICAgICBDR0xTZXRGdWxsU2NyZWVuIChOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9fZGVza3RvcCkgewotICAgICAgICAgICAgU2hvd01lbnVCYXIgKCk7Ci0gICAgICAgICAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIHNjcmVlbiByZXNvbHV0aW9uL2JwcCAqLwotICAgICAgICAgICAgQ0dEaXNwbGF5U3dpdGNoVG9Nb2RlIChkaXNwbGF5X2lkLCBzYXZlX21vZGUpOwotICAgICAgICAgICAgQ0dSZWxlYXNlQWxsRGlzcGxheXMgKCk7Ci0gICAgICAgICAgICAvKiAKLSAgICAgICAgICAgICAgICBSZXNldCB0aGUgbWFpbiBzY3JlZW4ncyByZWN0YW5nbGUKLSAgICAgICAgICAgICAgICBTZWUgY29tbWVudCBpbiBRWl9TZXRWaWRlb0Z1bGxzY3JlZW4gZm9yIHdoeSB3ZSBkbyB0aGlzCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgc2NyZWVuX3JlY3QgPSBOU01ha2VSZWN0KDAsMCxkZXZpY2Vfd2lkdGgsZGV2aWNlX2hlaWdodCk7Ci0gICAgICAgICAgICBbIFsgTlNTY3JlZW4gbWFpblNjcmVlbiBdIHNldEZyYW1lOnNjcmVlbl9yZWN0IF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogUmVsZWFzZSB3aW5kb3cgbW9kZSByZXNvdXJjZXMgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgCi0gICAgICAgIFsgcXpfd2luZG93IGNsb3NlIF07Ci0gICAgICAgIFsgcXpfd2luZG93IHJlbGVhc2UgXTsKLSAgICAgICAgcXpfd2luZG93ID0gbmlsOwotICAgICAgICB3aW5kb3dfdmlldyA9IG5pbDsKLQotICAgICAgICAvKiBSZWxlYXNlIHRoZSBPcGVuR0wgY29udGV4dCAqLwotICAgICAgICBpZiAoIG1vZGVfZmxhZ3MgJiBTRExfT1BFTkdMICkKLSAgICAgICAgICAgIFFaX1RlYXJEb3duT3BlbkdMICh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiBTaWduYWwgc3VjY2Vzc2Z1bCB0ZWFyZG93biAqLwotICAgIHZpZGVvX3NldCA9IFNETF9GQUxTRTsKLX0KLQotc3RhdGljIFNETF9TdXJmYWNlKiBRWl9TZXRWaWRlb0Z1bGxTY3JlZW4gKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykgewotICAgIGJvb2xlYW5fdCBleGFjdF9tYXRjaCA9IDA7Ci0gICAgTlNSZWN0IHNjcmVlbl9yZWN0OwotICAgIENHRXJyb3IgZXJyb3I7Ci0gICAgTlNSZWN0IGNvbnRlbnRSZWN0OwotICAgIEJPT0wgaXNDdXN0b20gPSBOTzsKLSAgICBDR0Rpc3BsYXlGYWRlUmVzZXJ2YXRpb25Ub2tlbiBmYWRlX3Rva2VuID0ga0NHRGlzcGxheUZhZGVSZXNlcnZhdGlvbkludmFsaWRUb2tlbjsKLSAgICAKLSAgICAvKiBGYWRlIHRvIGJsYWNrIHRvIGhpZGUgcmVzb2x1dGlvbi1zd2l0Y2hpbmcgZmxpY2tlciAoYW5kIGdhcmJhZ2UKLSAgICAgICB0aGF0IGlzIGRpc3BsYXllZCBieSBhIGRlc3Ryb3llZCBPcGVuR0wgY29udGV4dCwgaWYgYXBwbGljYWJsZSkgKi8KLSAgICBpZiAoIENHQWNxdWlyZURpc3BsYXlGYWRlUmVzZXJ2YXRpb24gKDUsICZmYWRlX3Rva2VuKSA9PSBrQ0dFcnJvclN1Y2Nlc3MgKSB7Ci0gICAgICAgIENHRGlzcGxheUZhZGUgKGZhZGVfdG9rZW4sIDAuMywga0NHRGlzcGxheUJsZW5kTm9ybWFsLCBrQ0dEaXNwbGF5QmxlbmRTb2xpZENvbG9yLCAwLjAsIDAuMCwgMC4wLCBUUlVFKTsKLSAgICB9Ci0gICAgCi0gICAgLyogRGVzdHJveSBhbnkgcHJldmlvdXMgbW9kZSAqLwotICAgIGlmICh2aWRlb19zZXQgPT0gU0RMX1RSVUUpCi0gICAgICAgIFFaX1Vuc2V0VmlkZW9Nb2RlICh0aGlzLCBGQUxTRSk7Ci0KLSAgICAvKiBTZWUgaWYgcmVxdWVzdGVkIG1vZGUgZXhpc3RzICovCi0gICAgbW9kZSA9IENHRGlzcGxheUJlc3RNb2RlRm9yUGFyYW1ldGVycyAoZGlzcGxheV9pZCwgYnBwLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICZleGFjdF9tYXRjaCk7Ci0KLSAgICAvKiBSZXF1aXJlIGFuIGV4YWN0IG1hdGNoIHRvIHRoZSByZXF1ZXN0ZWQgbW9kZSAqLwotICAgIGlmICggISBleGFjdF9tYXRjaCApIHsKLSAgICAgICAgU0RMX1NldEVycm9yICgiRmFpbGVkIHRvIGZpbmQgZGlzcGxheSByZXNvbHV0aW9uOiAlZHglZHglZCIsIHdpZHRoLCBoZWlnaHQsIGJwcCk7Ci0gICAgICAgIGdvdG8gRVJSX05PX01BVENIOwotICAgIH0KLQotICAgIC8qIFB1dCB1cCB0aGUgYmxhbmtpbmcgd2luZG93IChhIHdpbmRvdyBhYm92ZSBhbGwgb3RoZXIgd2luZG93cykgKi8KLSAgICBpZiAoZ2V0ZW52ICgiU0RMX1NJTkdMRURJU1BMQVkiKSkKLSAgICAgICAgZXJyb3IgPSBDR0Rpc3BsYXlDYXB0dXJlIChkaXNwbGF5X2lkKTsKLSAgICBlbHNlCi0gICAgICAgIGVycm9yID0gQ0dDYXB0dXJlQWxsRGlzcGxheXMgKCk7Ci0gICAgICAgIAotICAgIGlmICggQ0dEaXNwbGF5Tm9FcnIgIT0gZXJyb3IgKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvciAoIkZhaWxlZCBjYXB0dXJpbmcgZGlzcGxheSIpOwotICAgICAgICBnb3RvIEVSUl9OT19DQVBUVVJFOwotICAgIH0KLQotICAgIC8qIERvIHRoZSBwaHlzaWNhbCBzd2l0Y2ggKi8KLSAgICBpZiAoIENHRGlzcGxheU5vRXJyICE9IENHRGlzcGxheVN3aXRjaFRvTW9kZSAoZGlzcGxheV9pZCwgbW9kZSkgKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvciAoIkZhaWxlZCBzd2l0Y2hpbmcgZGlzcGxheSByZXNvbHV0aW9uIik7Ci0gICAgICAgIGdvdG8gRVJSX05PX1NXSVRDSDsKLSAgICB9Ci0KLSAgICBjdXJyZW50LT5waXhlbHMgPSAoVWludDMyKikgQ0dEaXNwbGF5QmFzZUFkZHJlc3MgKGRpc3BsYXlfaWQpOwotICAgIGN1cnJlbnQtPnBpdGNoICA9IENHRGlzcGxheUJ5dGVzUGVyUm93IChkaXNwbGF5X2lkKTsKLQotICAgIGN1cnJlbnQtPmZsYWdzID0gMDsKLSAgICBjdXJyZW50LT53ID0gd2lkdGg7Ci0gICAgY3VycmVudC0+aCA9IGhlaWdodDsKLSAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKLSAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfSFdTVVJGQUNFOwotICAgIGN1cnJlbnQtPmZsYWdzIHw9IFNETF9QUkVBTExPQzsKLSAgICAKLSAgICB0aGlzLT5VcGRhdGVSZWN0cyAgICAgPSBRWl9EaXJlY3RVcGRhdGU7Ci0gICAgdGhpcy0+TG9ja0hXU3VyZmFjZSAgID0gUVpfTG9ja0hXU3VyZmFjZTsKLSAgICB0aGlzLT5VbmxvY2tIV1N1cmZhY2UgPSBRWl9VbmxvY2tIV1N1cmZhY2U7Ci0KLSAgICAvKiBTZXR1cCBkb3VibGUtYnVmZmVyIGVtdWxhdGlvbiAqLwotICAgIGlmICggZmxhZ3MgJiBTRExfRE9VQkxFQlVGICkgewotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICAgIFNldHVwIGEgc29mdHdhcmUgYmFja2luZyBzdG9yZSBmb3IgcmVhc29uYWJsZSByZXN1bHRzIHdoZW4KLSAgICAgICAgICAgIGRvdWJsZSBidWZmZXJpbmcgaXMgcmVxdWVzdGVkIChzaW5jZSBhIHNpbmdsZS1idWZmZXJlZCBoYXJkd2FyZQotICAgICAgICAgICAgc3VyZmFjZSBsb29rcyBoaWRlb3VzKS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhlIGFjdHVhbCBzY3JlZW4gYmxpdCBvY2N1cnMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gYWxsb3cgCi0gICAgICAgICAgICBvdGhlciBibGl0dGluZyB3aGlsZSB3YWl0aW5nIG9uIHRoZSBWQkwgKGFuZCBoZW5jZSByZXN1bHRzIGluIGhpZ2hlciBmcmFtZXJhdGVzKS4KLSAgICAgICAgKi8KLSAgICAgICAgdGhpcy0+TG9ja0hXU3VyZmFjZSA9IE5VTEw7Ci0gICAgICAgIHRoaXMtPlVubG9ja0hXU3VyZmFjZSA9IE5VTEw7Ci0gICAgICAgIHRoaXMtPlVwZGF0ZVJlY3RzID0gTlVMTDsKLSAgICAgICAgCi0gICAgICAgIGN1cnJlbnQtPmZsYWdzIHw9IChTRExfSFdTVVJGQUNFfFNETF9ET1VCTEVCVUYpOwotICAgICAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IFFaX0RvdWJsZUJ1ZmZlclVwZGF0ZTsKLSAgICAgICAgdGhpcy0+TG9ja0hXU3VyZmFjZSA9IFFaX0xvY2tEb3VibGVCdWZmZXI7Ci0gICAgICAgIHRoaXMtPlVubG9ja0hXU3VyZmFjZSA9IFFaX1VubG9ja0RvdWJsZUJ1ZmZlcjsKLSAgICAgICAgdGhpcy0+RmxpcEhXU3VyZmFjZSA9IFFaX0ZsaXBEb3VibGVCdWZmZXI7Ci0KLSAgICAgICAgY3VycmVudC0+cGl4ZWxzID0gU0RMX21hbGxvYyAoY3VycmVudC0+cGl0Y2ggKiBjdXJyZW50LT5oICogMik7Ci0gICAgICAgIGlmIChjdXJyZW50LT5waXhlbHMgPT0gTlVMTCkgewotICAgICAgICAgICAgU0RMX091dE9mTWVtb3J5ICgpOwotICAgICAgICAgICAgZ290byBFUlJfRE9VQkxFQlVGOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzd19idWZmZXJzWzBdID0gY3VycmVudC0+cGl4ZWxzOwotICAgICAgICBzd19idWZmZXJzWzFdID0gKFVpbnQ4KiljdXJyZW50LT5waXhlbHMgKyBjdXJyZW50LT5waXRjaCAqIGN1cnJlbnQtPmg7Ci0gICAgICAgIAotICAgICAgICBxdWl0X3RocmVhZCA9IE5POwotICAgICAgICBzZW0xID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSAoMCk7Ci0gICAgICAgIHNlbTIgPSBTRExfQ3JlYXRlU2VtYXBob3JlICgxKTsKLSAgICAgICAgdGhyZWFkID0gU0RMX0NyZWF0ZVRocmVhZCAoKGludCAoKikodm9pZCAqKSlRWl9UaHJlYWRGbGlwLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBpZiAoIENHRGlzcGxheUNhblNldFBhbGV0dGUgKGRpc3BsYXlfaWQpICkKLSAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKLQotICAgIC8qIFRoZSBjb2RlIGJlbG93IGNoZWNrcyBmb3IgYW55IHZhbGlkIGN1c3RvbSB3aW5kb3dzIGFuZCB2aWV3cy4gIElmIG5vbmUgYXJlCi0gICAgICAgYXZhaWxhYmxlLCB0aGVuIHdlIGNyZWF0ZSBuZXcgb25lcy4gIFdpbmRvdy9WaWV3IGNvZGUgd2FzIGFkZGVkIGluIEZVTExTQ1JFRU4KLSAgICAgICBzbyB0aGF0IHNwZWNpYWwgZXZlbnRzIGxpa2UgdGhlIGNoYW5naW5nIG9mIHRoZSBjdXJzb3IgaW1hZ2Ugd291bGQgYmUgaGFuZGxlZAotICAgICAgICggb25seSB0aGUgZnJvbnQtbW9zdCBhbmQgYWN0aXZlIGFwcGxpY2F0aW9uIGNhbiBjaGFuZ2UgdGhlIGN1cnNvciBhcHBlYXJhbmNlCi0gICAgICAgYW5kIHdpdGggbm8gdmFsaWQgd2luZG93L3ZpZXcgaW4gRlVMTFNDUkVFTiwgU0RMIHdvdWxkbid0IHVwZGF0ZSBpdHMgY3Vyc29yLiApCi0gICAgKi8KLQkvKiBDaGVjayBmb3IgdXNlci1zcGVjaWZpZWQgd2luZG93IGFuZCB2aWV3ICovCi0gICAgewotICAgICAgICBjaGFyICp3aW5kb3dQdHJTdHJpbmcgPSBnZXRlbnYgKCJTRExfTlNXaW5kb3dQb2ludGVyIik7Ci0gICAgICAgIGNoYXIgKnZpZXdQdHJTdHJpbmcgPSBnZXRlbnYgKCJTRExfTlNRdWlja0RyYXdWaWV3UG9pbnRlciIpOwotICAgIAotICAgICAgICBjb250ZW50UmVjdCA9IE5TTWFrZVJlY3QgKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQotICAgICAgICBpZiAod2luZG93UHRyU3RyaW5nICYmIHZpZXdQdHJTdHJpbmcpIHsKLSAgICAgICAgICAgIC8qIFJlbGVhc2UgYW55IHByZXZpb3VzIHdpbmRvdyAqLwotICAgICAgICAgICAgaWYgKCBxel93aW5kb3cgKSB7Ci0gICAgICAgICAgICAgICAgWyBxel93aW5kb3cgcmVsZWFzZSBdOwotICAgICAgICAgICAgICAgIHF6X3dpbmRvdyA9IG5pbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcXpfd2luZG93ID0gKE5TV2luZG93KilhdG9pKHdpbmRvd1B0clN0cmluZyk7Ci0gICAgICAgICAgICB3aW5kb3dfdmlldyA9IChOU1F1aWNrRHJhd1ZpZXcqKWF0b2kodmlld1B0clN0cmluZyk7Ci0gICAgICAgICAgICBpc0N1c3RvbSA9IFlFUzsKLSAgICAgICAgICAgIC8qIAotICAgICAgICAgICAgICAgIFJldGFpbiByZWZlcmVuY2UgdG8gd2luZG93IGJlY2F1c2Ugd2UKLSAgICAgICAgICAgICAgICBtaWdodCByZWxlYXNlIGl0IGluIFFaX1Vuc2V0VmlkZW9Nb2RlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgWyBxel93aW5kb3cgcmV0YWluIF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHJlY3JlYXRlIHRoZSB3aW5kb3cgKi8KLSAgICBpZiAocXpfd2luZG93ID09IG5pbCkgewotICAgICAgICAvKiBNYW51YWxseSBjcmVhdGUgYSB3aW5kb3csIGF2b2lkcyBoYXZpbmcgYSBuaWIgZmlsZSByZXNvdXJjZSAqLwotICAgICAgICBxel93aW5kb3cgPSBbIFsgU0RMX1F1YXJ0eldpbmRvdyBhbGxvYyBdIAotICAgICAgICAgICAgaW5pdFdpdGhDb250ZW50UmVjdDpjb250ZW50UmVjdAotICAgICAgICAgICAgICAgIHN0eWxlTWFzazpuaWwgCi0gICAgICAgICAgICAgICAgICAgIGJhY2tpbmc6TlNCYWNraW5nU3RvcmVCdWZmZXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXI6Tk8gXTsKLQotICAgICAgICBpZiAocXpfd2luZG93ICE9IG5pbCkgewotICAgICAgICAgICAgWyBxel93aW5kb3cgc2V0QWNjZXB0c01vdXNlTW92ZWRFdmVudHM6WUVTIF07Ci0gICAgICAgICAgICBbIHF6X3dpbmRvdyBzZXRWaWV3c05lZWREaXNwbGF5Ok5PIF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogV2UgYWxyZWFkeSBoYXZlIGEgd2luZG93LCBqdXN0IGNoYW5nZSBpdHMgc2l6ZSAqLwotICAgIGVsc2UgewotICAgICAgICBpZiAoIWlzQ3VzdG9tKSB7Ci0gICAgICAgICAgICBbIHF6X3dpbmRvdyBzZXRDb250ZW50U2l6ZTpjb250ZW50UmVjdC5zaXplIF07Ci0gICAgICAgICAgICBjdXJyZW50LT5mbGFncyB8PSAoU0RMX05PRlJBTUV8U0RMX1JFU0laQUJMRSkgJiBtb2RlX2ZsYWdzOwotICAgICAgICAgICAgWyB3aW5kb3dfdmlldyBzZXRGcmFtZVNpemU6Y29udGVudFJlY3Quc2l6ZSBdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0dXAgT3BlbkdMIGZvciBhIGZ1bGxzY3JlZW4gY29udGV4dCAqLwotICAgIGlmIChmbGFncyAmIFNETF9PUEVOR0wpIHsKLQotICAgICAgICBDR0xFcnJvciBlcnI7Ci0gICAgICAgIENHTENvbnRleHRPYmogY3R4OwotCi0gICAgICAgIGlmICggISBRWl9TZXR1cE9wZW5HTCAodGhpcywgYnBwLCBmbGFncykgKSB7Ci0gICAgICAgICAgICBnb3RvIEVSUl9OT19HTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIE5TVmlldyBhbmQgYWRkIGl0IHRvIG91ciB3aW5kb3cuICBUaGUgcHJlc2VuY2Ugb2YgYSB2YWxpZCB3aW5kb3cgYW5kCi0gICAgICAgICAgIHZpZXcgYWxsb3cgdGhlIGN1cnNvciB0byBiZSBjaGFuZ2VkIHdoaWxzdCBpbiBmdWxsc2NyZWVuLiovCi0gICAgICAgIHdpbmRvd192aWV3ID0gWyBbIE5TVmlldyBhbGxvYyBdIGluaXRXaXRoRnJhbWU6Y29udGVudFJlY3QgXTsKLSAgICAgICAgWyBbIHF6X3dpbmRvdyBjb250ZW50VmlldyBdIGFkZFN1YnZpZXc6d2luZG93X3ZpZXcgXTsJCi0gICAgICAgIFsgd2luZG93X3ZpZXcgcmVsZWFzZSBdOwotCi0gICAgICAgIGN0eCA9IFsgZ2xfY29udGV4dCBjZ2xDb250ZXh0IF07Ci0gICAgICAgIGVyciA9IENHTFNldEZ1bGxTY3JlZW4gKGN0eCk7Ci0KLSAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgU0RMX1NldEVycm9yICgiRXJyb3Igc2V0dGluZyBPcGVuR0wgZnVsbHNjcmVlbjogJXMiLCBDR0xFcnJvclN0cmluZyhlcnIpKTsKLSAgICAgICAgICAgIGdvdG8gRVJSX05PX0dMOwotICAgICAgICB9Ci0KLSAgICAgICAgWyBnbF9jb250ZXh0IG1ha2VDdXJyZW50Q29udGV4dF07Ci0KLSAgICAgICAgZ2xDbGVhciAoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICAgICAgWyBnbF9jb250ZXh0IGZsdXNoQnVmZmVyIF07Ci0KLSAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX09QRU5HTDsKLSAgICB9Ci0KLSAgICAvKiBJZiB3ZSBkb24ndCBoaWRlIG1lbnUgYmFyLCBpdCB3aWxsIGdldCBldmVudHMgYW5kIGludGVycnVwdCB0aGUgcHJvZ3JhbSAqLwotICAgIEhpZGVNZW51QmFyICgpOwotCi0gICAgLyogRmFkZSBpbiBhZ2FpbiAoYXN5bmNocm9ub3VzbHkpICovCi0gICAgaWYgKCBmYWRlX3Rva2VuICE9IGtDR0Rpc3BsYXlGYWRlUmVzZXJ2YXRpb25JbnZhbGlkVG9rZW4gKSB7Ci0gICAgICAgIENHRGlzcGxheUZhZGUgKGZhZGVfdG9rZW4sIDAuNSwga0NHRGlzcGxheUJsZW5kU29saWRDb2xvciwga0NHRGlzcGxheUJsZW5kTm9ybWFsLCAwLjAsIDAuMCwgMC4wLCBGQUxTRSk7Ci0gICAgICAgIENHUmVsZWFzZURpc3BsYXlGYWRlUmVzZXJ2YXRpb24oZmFkZV90b2tlbik7Ci0gICAgfQotCi0gICAgLyogCi0gICAgICAgIFRoZXJlIGlzIGEgYnVnIGluIENvY29hIHdoZXJlIE5TU2NyZWVuIGRvZXNuJ3Qgc3luY2hyb25pemUKLSAgICAgICAgd2l0aCBDR0RpcmVjdERpc3BsYXksIHNvIHRoZSBtYWluIHNjcmVlbidzIGZyYW1lIGlzIHdyb25nLgotICAgICAgICBBcyBhIHJlc3VsdCwgY29vcmRpbmF0ZSB0cmFuc2xhdGlvbiBwcm9kdWNlcyBpbmNvcnJlY3QgcmVzdWx0cy4KLSAgICAgICAgV2UgY2FuIGhhY2sgYXJvdW5kIHRoaXMgYnVnIGJ5IHNldHRpbmcgdGhlIHNjcmVlbiByZWN0Ci0gICAgICAgIG91cnNlbHZlcy4gVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGlmL3doZW4gdGhlIGJ1ZyBpcyBmaXhlZC4KLSAgICAqLwotICAgIHNjcmVlbl9yZWN0ID0gTlNNYWtlUmVjdCgwLDAsd2lkdGgsaGVpZ2h0KTsKLSAgICBbIFsgTlNTY3JlZW4gbWFpblNjcmVlbiBdIHNldEZyYW1lOnNjcmVlbl9yZWN0IF07IAotCi0gICAgLyogU2F2ZSB0aGUgZmxhZ3MgdG8gZW5zdXJlIGNvcnJlY3QgdGVhci1kb3duICovCi0gICAgbW9kZV9mbGFncyA9IGN1cnJlbnQtPmZsYWdzOwotCi0gICAgLyogU2V0IGFwcCBzdGF0ZSwgaGlkZSBjdXJzb3IgaWYgbmVjZXNzYXJ5LCAuLi4gKi8KLSAgICBRWl9Eb0FjdGl2YXRlKHRoaXMpOwotCi0gICAgcmV0dXJuIGN1cnJlbnQ7Ci0KLSAgICAvKiBTaW5jZSB0aGUgYmxhbmtpbmcgd2luZG93IGNvdmVycyAqYWxsKiB3aW5kb3dzIChldmVuIGZvcmNlIHF1aXQpIGNvcnJlY3QgcmVjb3ZlcnkgaXMgY3J1Y2lhbCAqLwotRVJSX05PX0dMOiAgICAgIAotRVJSX0RPVUJMRUJVRjogIENHRGlzcGxheVN3aXRjaFRvTW9kZSAoZGlzcGxheV9pZCwgc2F2ZV9tb2RlKTsKLUVSUl9OT19TV0lUQ0g6ICBDR1JlbGVhc2VBbGxEaXNwbGF5cyAoKTsKLUVSUl9OT19DQVBUVVJFOgotRVJSX05PX01BVENIOiAgIGlmICggZmFkZV90b2tlbiAhPSBrQ0dEaXNwbGF5RmFkZVJlc2VydmF0aW9uSW52YWxpZFRva2VuICkgewotICAgICAgICAgICAgICAgICAgICBDR0Rpc3BsYXlGYWRlIChmYWRlX3Rva2VuLCAwLjUsIGtDR0Rpc3BsYXlCbGVuZFNvbGlkQ29sb3IsIGtDR0Rpc3BsYXlCbGVuZE5vcm1hbCwgMC4wLCAwLjAsIDAuMCwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICBDR1JlbGVhc2VEaXNwbGF5RmFkZVJlc2VydmF0aW9uIChmYWRlX3Rva2VuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBTRExfU3VyZmFjZSogUVpfU2V0VmlkZW9XaW5kb3dlZCAoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCAqYnBwLCBVaW50MzIgZmxhZ3MpIHsKLSAgICB1bnNpZ25lZCBpbnQgc3R5bGU7Ci0gICAgTlNSZWN0IGNvbnRlbnRSZWN0OwotICAgIEJPT0wgaXNDdXN0b20gPSBOTzsKLSAgICBpbnQgY2VudGVyX3dpbmRvdyA9IDE7Ci0gICAgaW50IG9yaWdpbl94LCBvcmlnaW5feTsKLSAgICBDR0Rpc3BsYXlGYWRlUmVzZXJ2YXRpb25Ub2tlbiBmYWRlX3Rva2VuID0ga0NHRGlzcGxheUZhZGVSZXNlcnZhdGlvbkludmFsaWRUb2tlbjsKLQotICAgIGN1cnJlbnQtPmZsYWdzID0gMDsKLSAgICBjdXJyZW50LT53ID0gd2lkdGg7Ci0gICAgY3VycmVudC0+aCA9IGhlaWdodDsKLSAgICAKLSAgICBjb250ZW50UmVjdCA9IE5TTWFrZVJlY3QgKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIAotICAgIC8qCi0gICAgICAgIENoZWNrIGlmIHdlIHNob3VsZCBjb21wbGV0ZWx5IGRlc3Ryb3kgdGhlIHByZXZpb3VzIG1vZGUgCi0gICAgICAgIC0gSWYgaXQgaXMgZnVsbHNjcmVlbgotICAgICAgICAtIElmIGl0IGhhcyBkaWZmZXJlbnQgbm9mcmFtZSBvciByZXNpemFibGUgYXR0cmlidXRlCi0gICAgICAgIC0gSWYgaXQgaXMgT3BlbkdMIChzaW5jZSBnbCBhdHRyaWJ1dGVzIGNvdWxkIGJlIGRpZmZlcmVudCkKLSAgICAgICAgLSBJZiBuZXcgbW9kZSBpcyBPcGVuR0wsIGJ1dCBwcmV2aW91cyBtb2RlIHdhc24ndAotICAgICovCi0gICAgaWYgKHZpZGVvX3NldCA9PSBTRExfVFJVRSkgewotICAgICAgICBpZiAobW9kZV9mbGFncyAmIFNETF9GVUxMU0NSRUVOKSB7Ci0gICAgICAgICAgICAvKiBGYWRlIHRvIGJsYWNrIHRvIGhpZGUgcmVzb2x1dGlvbi1zd2l0Y2hpbmcgZmxpY2tlciAoYW5kIGdhcmJhZ2UKLSAgICAgICAgICAgICAgIHRoYXQgaXMgZGlzcGxheWVkIGJ5IGEgZGVzdHJveWVkIE9wZW5HTCBjb250ZXh0LCBpZiBhcHBsaWNhYmxlKSAqLwotICAgICAgICAgICAgaWYgKENHQWNxdWlyZURpc3BsYXlGYWRlUmVzZXJ2YXRpb24gKDUsICZmYWRlX3Rva2VuKSA9PSBrQ0dFcnJvclN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICBDR0Rpc3BsYXlGYWRlIChmYWRlX3Rva2VuLCAwLjMsIGtDR0Rpc3BsYXlCbGVuZE5vcm1hbCwga0NHRGlzcGxheUJsZW5kU29saWRDb2xvciwgMC4wLCAwLjAsIDAuMCwgVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBRWl9VbnNldFZpZGVvTW9kZSAodGhpcywgVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoICgobW9kZV9mbGFncyBeIGZsYWdzKSAmIChTRExfTk9GUkFNRXxTRExfUkVTSVpBQkxFKSkgfHwKLSAgICAgICAgICAgICAgICAgIChtb2RlX2ZsYWdzICYgU0RMX09QRU5HTCkgfHwgCi0gICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTRExfT1BFTkdMKSApIHsKLSAgICAgICAgICAgIFFaX1Vuc2V0VmlkZW9Nb2RlICh0aGlzLCBUUlVFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiBDaGVjayBmb3IgdXNlci1zcGVjaWZpZWQgd2luZG93IGFuZCB2aWV3ICovCi0gICAgewotICAgICAgICBjaGFyICp3aW5kb3dQdHJTdHJpbmcgPSBnZXRlbnYgKCJTRExfTlNXaW5kb3dQb2ludGVyIik7Ci0gICAgICAgIGNoYXIgKnZpZXdQdHJTdHJpbmcgPSBnZXRlbnYgKCJTRExfTlNRdWlja0RyYXdWaWV3UG9pbnRlciIpOwotICAgIAotICAgICAgICBpZiAod2luZG93UHRyU3RyaW5nICYmIHZpZXdQdHJTdHJpbmcpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogUmVsZWFzZSBhbnkgcHJldmlvdXMgd2luZG93ICovCi0gICAgICAgICAgICBpZiAoIHF6X3dpbmRvdyApIHsKLSAgICAgICAgICAgICAgICBbIHF6X3dpbmRvdyByZWxlYXNlIF07Ci0gICAgICAgICAgICAgICAgcXpfd2luZG93ID0gbmlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBxel93aW5kb3cgPSAoTlNXaW5kb3cqKWF0b2kod2luZG93UHRyU3RyaW5nKTsKLSAgICAgICAgICAgIHdpbmRvd192aWV3ID0gKE5TUXVpY2tEcmF3VmlldyopYXRvaSh2aWV3UHRyU3RyaW5nKTsKLSAgICAgICAgICAgIGlzQ3VzdG9tID0gWUVTOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiAKLSAgICAgICAgICAgICAgICBSZXRhaW4gcmVmZXJlbmNlIHRvIHdpbmRvdyBiZWNhdXNlIHdlCi0gICAgICAgICAgICAgICAgbWlnaHQgcmVsZWFzZSBpdCBpbiBRWl9VbnNldFZpZGVvTW9kZQotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFsgcXpfd2luZG93IHJldGFpbiBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdHlsZSA9IFsgcXpfd2luZG93IHN0eWxlTWFzayBdOwotICAgICAgICAgICAgLyogQ2hlY2sgcmVzaXphYmlsaXR5ICovCi0gICAgICAgICAgICBpZiAoIHN0eWxlICYgTlNSZXNpemFibGVXaW5kb3dNYXNrICkKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfUkVTSVpBQkxFOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDaGVjayBmcmFtZSAqLwotICAgICAgICAgICAgaWYgKCBzdHlsZSAmIE5TQm9yZGVybGVzc1dpbmRvd01hc2sgKQotICAgICAgICAgICAgICAgIGN1cnJlbnQtPmZsYWdzIHw9IFNETF9OT0ZSQU1FOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIENoZWNrIGlmIHdlIHNob3VsZCByZWNyZWF0ZSB0aGUgd2luZG93ICovCi0gICAgaWYgKHF6X3dpbmRvdyA9PSBuaWwpIHsKLSAgICAKLSAgICAgICAgLyogU2V0IHRoZSB3aW5kb3cgc3R5bGUgYmFzZWQgb24gaW5wdXQgZmxhZ3MgKi8KLSAgICAgICAgaWYgKCBmbGFncyAmIFNETF9OT0ZSQU1FICkgewotICAgICAgICAgICAgc3R5bGUgPSBOU0JvcmRlcmxlc3NXaW5kb3dNYXNrOwotICAgICAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX05PRlJBTUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdHlsZSA9IE5TVGl0bGVkV2luZG93TWFzazsKLSAgICAgICAgICAgIHN0eWxlIHw9IChOU01pbmlhdHVyaXphYmxlV2luZG93TWFzayB8IE5TQ2xvc2FibGVXaW5kb3dNYXNrKTsKLSAgICAgICAgICAgIGlmICggZmxhZ3MgJiBTRExfUkVTSVpBQkxFICkgewotICAgICAgICAgICAgICAgIHN0eWxlIHw9IE5TUmVzaXphYmxlV2luZG93TWFzazsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfUkVTSVpBQkxFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIE1hbnVhbGx5IGNyZWF0ZSBhIHdpbmRvdywgYXZvaWRzIGhhdmluZyBhIG5pYiBmaWxlIHJlc291cmNlICovCi0gICAgICAgIHF6X3dpbmRvdyA9IFsgWyBTRExfUXVhcnR6V2luZG93IGFsbG9jIF0gCi0gICAgICAgICAgICBpbml0V2l0aENvbnRlbnRSZWN0OmNvbnRlbnRSZWN0Ci0gICAgICAgICAgICAgICAgc3R5bGVNYXNrOnN0eWxlIAotICAgICAgICAgICAgICAgICAgICBiYWNraW5nOk5TQmFja2luZ1N0b3JlQnVmZmVyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyOk5PIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAocXpfd2luZG93ID09IG5pbCkgewotICAgICAgICAgICAgU0RMX1NldEVycm9yICgiQ291bGQgbm90IGNyZWF0ZSB0aGUgQ29jb2Egd2luZG93Iik7Ci0gICAgICAgICAgICBpZiAoZmFkZV90b2tlbiAhPSBrQ0dEaXNwbGF5RmFkZVJlc2VydmF0aW9uSW52YWxpZFRva2VuKSB7Ci0gICAgICAgICAgICAgICAgQ0dEaXNwbGF5RmFkZSAoZmFkZV90b2tlbiwgMC41LCBrQ0dEaXNwbGF5QmxlbmRTb2xpZENvbG9yLCBrQ0dEaXNwbGF5QmxlbmROb3JtYWwsIDAuMCwgMC4wLCAwLjAsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICBDR1JlbGVhc2VEaXNwbGF5RmFkZVJlc2VydmF0aW9uIChmYWRlX3Rva2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8qWyBxel93aW5kb3cgc2V0UmVsZWFzZWRXaGVuQ2xvc2VkOllFUyBdOyovCi0gICAgICAgIFFaX1NldENhcHRpb24odGhpcywgdGhpcy0+d21fdGl0bGUsIHRoaXMtPndtX2ljb24pOwotICAgICAgICBbIHF6X3dpbmRvdyBzZXRBY2NlcHRzTW91c2VNb3ZlZEV2ZW50czpZRVMgXTsKLSAgICAgICAgWyBxel93aW5kb3cgc2V0Vmlld3NOZWVkRGlzcGxheTpOTyBdOwotICAgICAgICAKLSAgICAgICAgaWYgKCBRWl9XaW5kb3dQb3NpdGlvbih0aGlzLCAmb3JpZ2luX3gsICZvcmlnaW5feSkgKSB7Ci0gICAgICAgICAgICBbIHF6X3dpbmRvdyBzZXRGcmFtZVRvcExlZnRQb2ludDpOU01ha2VQb2ludChvcmlnaW5feCx0aGlzLT5pbmZvLmN1cnJlbnRfaCAtIG9yaWdpbl95KSBdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgWyBxel93aW5kb3cgY2VudGVyIF07Ci0gICAgICAgIH0KLSAgICAgICAgWyBxel93aW5kb3cgc2V0RGVsZWdhdGU6Ci0gICAgICAgICAgICBbIFsgWyBTRExfUXVhcnR6V2luZG93RGVsZWdhdGUgYWxsb2MgXSBpbml0IF0gYXV0b3JlbGVhc2UgXSBdOwotICAgICAgICBbIHF6X3dpbmRvdyBzZXRDb250ZW50VmlldzogWyBbIFsgU0RMX1F1YXJ0elZpZXcgYWxsb2MgXSBpbml0IF0gYXV0b3JlbGVhc2UgXSBdOwotICAgIH0KLSAgICAvKiBXZSBhbHJlYWR5IGhhdmUgYSB3aW5kb3csIGp1c3QgY2hhbmdlIGl0cyBzaXplICovCi0gICAgZWxzZSB7Ci0gICAgCi0gICAgICAgIGlmICghaXNDdXN0b20pIHsKLSAgICAgICAgICAgIFsgcXpfd2luZG93IHNldENvbnRlbnRTaXplOmNvbnRlbnRSZWN0LnNpemUgXTsKLSAgICAgICAgICAgIGN1cnJlbnQtPmZsYWdzIHw9IChTRExfTk9GUkFNRXxTRExfUkVTSVpBQkxFKSAmIG1vZGVfZmxhZ3M7Ci0gICAgICAgICAgICBbIHdpbmRvd192aWV3IHNldEZyYW1lU2l6ZTpjb250ZW50UmVjdC5zaXplIF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGb3IgT3BlbkdMLCB3ZSBiaW5kIHRoZSBjb250ZXh0IHRvIGEgc3VidmlldyAqLwotICAgIGlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgewotCi0gICAgICAgIGlmICggISBRWl9TZXR1cE9wZW5HTCAodGhpcywgKmJwcCwgZmxhZ3MpICkgewotICAgICAgICAgICAgaWYgKGZhZGVfdG9rZW4gIT0ga0NHRGlzcGxheUZhZGVSZXNlcnZhdGlvbkludmFsaWRUb2tlbikgewotICAgICAgICAgICAgICAgIENHRGlzcGxheUZhZGUgKGZhZGVfdG9rZW4sIDAuNSwga0NHRGlzcGxheUJsZW5kU29saWRDb2xvciwga0NHRGlzcGxheUJsZW5kTm9ybWFsLCAwLjAsIDAuMCwgMC4wLCBGQUxTRSk7Ci0gICAgICAgICAgICAgICAgQ0dSZWxlYXNlRGlzcGxheUZhZGVSZXNlcnZhdGlvbiAoZmFkZV90b2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHdpbmRvd192aWV3ID0gWyBbIE5TVmlldyBhbGxvYyBdIGluaXRXaXRoRnJhbWU6Y29udGVudFJlY3QgXTsKLSAgICAgICAgWyB3aW5kb3dfdmlldyBzZXRBdXRvcmVzaXppbmdNYXNrOiBOU1ZpZXdXaWR0aFNpemFibGUgfCBOU1ZpZXdIZWlnaHRTaXphYmxlIF07Ci0gICAgICAgIFsgWyBxel93aW5kb3cgY29udGVudFZpZXcgXSBhZGRTdWJ2aWV3OndpbmRvd192aWV3IF07Ci0gICAgICAgIFsgZ2xfY29udGV4dCBzZXRWaWV3OiB3aW5kb3dfdmlldyBdOwotICAgICAgICBbIHdpbmRvd192aWV3IHJlbGVhc2UgXTsKLSAgICAgICAgWyBnbF9jb250ZXh0IG1ha2VDdXJyZW50Q29udGV4dF07Ci0gICAgICAgIFsgcXpfd2luZG93IG1ha2VLZXlBbmRPcmRlckZyb250Om5pbCBdOwotICAgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfT1BFTkdMOwotICAgIH0KLSAgICAvKiBGb3IgMkQsIHdlIHNldCB0aGUgc3VidmlldyB0byBhbiBOU1F1aWNrRHJhd1ZpZXcgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgc2hvcnQgICAgIHFkYnBwID0gMDsKLSAgICAgICAgQ0dyYWZQdHIgIHFkcG9ydDsKLQotICAgICAgICAvKiBPbmx5IHJlY3JlYXRlIHRoZSB2aWV3IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCAqLwotICAgICAgICBpZiAod2luZG93X3ZpZXcgPT0gbmlsKSB7Ci0gICAgICAgIAotICAgICAgICAgICAgd2luZG93X3ZpZXcgPSBbIFsgTlNRdWlja0RyYXdWaWV3IGFsbG9jIF0gaW5pdFdpdGhGcmFtZTpjb250ZW50UmVjdCBdOwotICAgICAgICAgICAgWyB3aW5kb3dfdmlldyBzZXRBdXRvcmVzaXppbmdNYXNrOiBOU1ZpZXdXaWR0aFNpemFibGUgfCBOU1ZpZXdIZWlnaHRTaXphYmxlIF07Ci0gICAgICAgICAgICBbIFsgcXpfd2luZG93IGNvbnRlbnRWaWV3IF0gYWRkU3Vidmlldzp3aW5kb3dfdmlldyBdOwotICAgICAgICAgICAgWyB3aW5kb3dfdmlldyByZWxlYXNlIF07Ci0gICAgICAgICAgICBbIHF6X3dpbmRvdyBtYWtlS2V5QW5kT3JkZXJGcm9udDpuaWwgXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcWRwb3J0ID0gWyB3aW5kb3dfdmlldyBxZFBvcnQgXTsKLSAgICAgICAgCi0gICAgICAgIExvY2tQb3J0Qml0cyAoIHFkcG9ydCApOwotICAgICAgICBjdXJyZW50LT5waXhlbHMgPSBHZXRQaXhCYXNlQWRkciAoIEdldFBvcnRQaXhNYXAgKCBxZHBvcnQgKSApOwotICAgICAgICBjdXJyZW50LT5waXRjaCAgPSBHZXRQaXhSb3dCeXRlcyAoIEdldFBvcnRQaXhNYXAgKCBxZHBvcnQgKSApOwotICAgICAgICBxZGJwcCAgICAgICAgICAgPSBHZXRQaXhEZXB0aCAoIEdldFBvcnRQaXhNYXAgKCBxZHBvcnQgKSApOwotICAgICAgICBVbmxvY2tQb3J0Qml0cyAoIHFkcG9ydCApOwotCi0gICAgICAgIC8qIFF1aWNrRHJhdyBtYXkgZ2l2ZSBhIDE2LWJpdCBzaGFkb3cgc3VyZmFjZSBvbiA4LWJpdCBkaXNwbGF5cyEgKi8KLSAgICAgICAgKmJwcCA9IHFkYnBwOwotCi0gICAgICAgIGN1cnJlbnQtPmZsYWdzIHw9IFNETF9TV1NVUkZBQ0U7Ci0gICAgICAgIGN1cnJlbnQtPmZsYWdzIHw9IFNETF9QUkVBTExPQzsKLSAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0FTWU5DQkxJVDsKLSAgICAgICAgCi0gICAgICAgIC8qIAotICAgICAgICAgICAgY3VycmVudC0+cGl4ZWxzIG5vdyBwb2ludHMgdG8gdGhlIHdpbmRvdydzIHBpeGVscwotICAgICAgICAgICAgV2Ugd2FudCBpdCB0byBwb2ludCB0byB0aGUgKnZpZXcncyogcGl4ZWxzIAotICAgICAgICAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBOU1JlY3QgIHdpbkZyYW1lICA9IFsgcXpfd2luZG93IGZyYW1lIF07Ci0gICAgICAgICAgICBOU1JlY3QgIHZpZXdGcmFtZSA9IFsgd2luZG93X3ZpZXcgZnJhbWUgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IHZPZmZzZXQgPSB3aW5GcmFtZS5zaXplLmhlaWdodCAtIHZpZXdGcmFtZS5zaXplLmhlaWdodCAtIHZpZXdGcmFtZS5vcmlnaW4ueTsKLSAgICAgICAgICAgIGludCBoT2Zmc2V0ID0gdmlld0ZyYW1lLm9yaWdpbi54OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGN1cnJlbnQtPnBpeGVscyA9IChVaW50OCAqKWN1cnJlbnQtPnBpeGVscyArICh2T2Zmc2V0ICogY3VycmVudC0+cGl0Y2gpICsgaE9mZnNldCAqIChxZGJwcC84KTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLT5VcGRhdGVSZWN0cyAgICAgPSBRWl9VcGRhdGVSZWN0czsKLSAgICAgICAgdGhpcy0+TG9ja0hXU3VyZmFjZSAgID0gUVpfTG9ja1dpbmRvdzsKLSAgICAgICAgdGhpcy0+VW5sb2NrSFdTdXJmYWNlID0gUVpfVW5sb2NrV2luZG93OwotICAgIH0KLQotICAgIC8qIFNhdmUgZmxhZ3MgdG8gZW5zdXJlIGNvcnJlY3QgdGVhcmRvd24gKi8KLSAgICBtb2RlX2ZsYWdzID0gY3VycmVudC0+ZmxhZ3M7Ci0KLSAgICAvKiBGYWRlIGluIGFnYWluIChhc3luY2hyb25vdXNseSkgaWYgd2UgY2FtZSBmcm9tIGEgZnVsbHNjcmVlbiBtb2RlIGFuZCBmYWRlZCB0byBibGFjayAqLwotICAgIGlmIChmYWRlX3Rva2VuICE9IGtDR0Rpc3BsYXlGYWRlUmVzZXJ2YXRpb25JbnZhbGlkVG9rZW4pIHsKLSAgICAgICAgQ0dEaXNwbGF5RmFkZSAoZmFkZV90b2tlbiwgMC41LCBrQ0dEaXNwbGF5QmxlbmRTb2xpZENvbG9yLCBrQ0dEaXNwbGF5QmxlbmROb3JtYWwsIDAuMCwgMC4wLCAwLjAsIEZBTFNFKTsKLSAgICAgICAgQ0dSZWxlYXNlRGlzcGxheUZhZGVSZXNlcnZhdGlvbiAoZmFkZV90b2tlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGN1cnJlbnQ7Ci19Ci0KLXN0YXRpYyBTRExfU3VyZmFjZSogUVpfU2V0VmlkZW9Nb2RlIChfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpIHsKLQotICAgIGN1cnJlbnQtPmZsYWdzID0gMDsKLSAgICBjdXJyZW50LT5waXhlbHMgPSBOVUxMOwotCi0gICAgLyogU2V0dXAgZnVsbCBzY3JlZW4gdmlkZW8gKi8KLSAgICBpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7Ci0gICAgICAgIGN1cnJlbnQgPSBRWl9TZXRWaWRlb0Z1bGxTY3JlZW4gKHRoaXMsIGN1cnJlbnQsIHdpZHRoLCBoZWlnaHQsIGJwcCwgZmxhZ3MgKTsKLSAgICAgICAgaWYgKGN1cnJlbnQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvKiBTZXR1cCB3aW5kb3dlZCB2aWRlbyAqLwotICAgIGVsc2UgewotICAgICAgICAvKiBGb3JjZSBicHAgdG8gdGhlIGRldmljZSdzIGJwcCAqLwotICAgICAgICBicHAgPSBkZXZpY2VfYnBwOwotICAgICAgICBjdXJyZW50ID0gUVpfU2V0VmlkZW9XaW5kb3dlZCAodGhpcywgY3VycmVudCwgd2lkdGgsIGhlaWdodCwgJmJwcCwgZmxhZ3MpOwotICAgICAgICBpZiAoY3VycmVudCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogU2V0dXAgdGhlIG5ldyBwaXhlbCBmb3JtYXQgKi8KLSAgICB7Ci0gICAgICAgIGludCBhbWFzayA9IDAsCi0gICAgICAgIHJtYXNrID0gMCwKLSAgICAgICAgZ21hc2sgPSAwLAotICAgICAgICBibWFzayA9IDA7Ci0KLSAgICAgICAgc3dpdGNoIChicHApIHsKLSAgICAgICAgICAgIGNhc2UgMTY6ICAgLyogKDEpLTUtNS01IFJHQiAqLwotICAgICAgICAgICAgICAgIGFtYXNrID0gMDsKLSAgICAgICAgICAgICAgICBybWFzayA9IDB4N0MwMDsKLSAgICAgICAgICAgICAgICBnbWFzayA9IDB4MDNFMDsKLSAgICAgICAgICAgICAgICBibWFzayA9IDB4MDAxRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgU0RMX1NldEVycm9yICgiMjRicHAgaXMgbm90IGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgY2FzZSAzMjogICAvKiAoOCktOC04LTggQVJHQiAqLwotICAgICAgICAgICAgICAgIGFtYXNrID0gMHgwMDAwMDAwMDsKLSAgICAgICAgICAgICAgICBybWFzayA9IDB4MDBGRjAwMDA7Ci0gICAgICAgICAgICAgICAgZ21hc2sgPSAweDAwMDBGRjAwOwotICAgICAgICAgICAgICAgIGJtYXNrID0gMHgwMDAwMDBGRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggISBTRExfUmVhbGxvY0Zvcm1hdCAoY3VycmVudCwgYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtYXNrLCBnbWFzaywgYm1hc2ssIGFtYXNrICkgKSB7Ci0gICAgICAgICAgICBTRExfU2V0RXJyb3IgKCJDb3VsZG4ndCByZWFsbG9jYXRlIHBpeGVsIGZvcm1hdCIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTaWduYWwgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uICh1c2VkIGludGVybmFsbHkpICovCi0gICAgdmlkZW9fc2V0ID0gU0RMX1RSVUU7Ci0KLSAgICByZXR1cm4gY3VycmVudDsKLX0KLQotc3RhdGljIGludCBRWl9Ub2dnbGVGdWxsU2NyZWVuIChfVEhJUywgaW50IG9uKSB7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgUVpfU2V0Q29sb3JzIChfVEhJUywgaW50IGZpcnN0X2NvbG9yLCBpbnQgbnVtX2NvbG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBTRExfQ29sb3IgKmNvbG9ycykgewotCi0gICAgQ0dUYWJsZUNvdW50ICBpbmRleDsKLSAgICBDR0RldmljZUNvbG9yIGNvbG9yOwotCi0gICAgZm9yIChpbmRleCA9IGZpcnN0X2NvbG9yOyBpbmRleCA8IGZpcnN0X2NvbG9yK251bV9jb2xvcnM7IGluZGV4KyspIHsKLQotICAgICAgICAvKiBDbGFtcCBjb2xvcnMgYmV0d2VlbiAwLjAgYW5kIDEuMCAqLwotICAgICAgICBjb2xvci5yZWQgICA9IGNvbG9ycy0+ciAvIDI1NS4wOwotICAgICAgICBjb2xvci5ibHVlICA9IGNvbG9ycy0+YiAvIDI1NS4wOwotICAgICAgICBjb2xvci5ncmVlbiA9IGNvbG9ycy0+ZyAvIDI1NS4wOwotCi0gICAgICAgIGNvbG9ycysrOwotCi0gICAgICAgIENHUGFsZXR0ZVNldENvbG9yQXRJbmRleCAocGFsZXR0ZSwgY29sb3IsIGluZGV4KTsKLSAgICB9Ci0KLSAgICBpZiAoIENHRGlzcGxheU5vRXJyICE9IENHRGlzcGxheVNldFBhbGV0dGUgKGRpc3BsYXlfaWQsIHBhbGV0dGUpICkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBRWl9Mb2NrRG91YmxlQnVmZmVyIChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpIHsKLQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBRWl9VbmxvY2tEb3VibGVCdWZmZXIgKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkgewotCi19Ci0KLSAvKiBUaGUgVkJMIGRlbGF5IGlzIGJhc2VkIG9uIGNvZGUgYnkgSWFuIFIgT2xsbWFubidzIFJlekxpYiA8aWFub0BjY28uY2FsdGVjaC5lZHU+ICovCi0gc3RhdGljIEFic29sdXRlVGltZSBRWl9TZWNvbmRzVG9BYnNvbHV0ZSAoIGRvdWJsZSBzZWNvbmRzICkgewotICAgIAotICAgIHVuaW9uCi0gICAgewotICAgICAgICBVSW50NjQgaTsKLSAgICAgICAgTmFub3NlY29uZHMgbnM7Ci0gICAgfSB0ZW1wOwotICAgICAgICAKLSAgICB0ZW1wLmkgPSBzZWNvbmRzICogMTAwMDAwMDAwMC4wOwotICAgIAotICAgIHJldHVybiBOYW5vc2Vjb25kc1RvQWJzb2x1dGUgKCB0ZW1wLm5zICk7Ci19Ci0KLXN0YXRpYyBpbnQgUVpfVGhyZWFkRmxpcCAoX1RISVMpIHsKLQotICAgIFVpbnQ4ICpzcmMsICpkc3Q7Ci0gICAgaW50IHNraXAsIGxlbiwgaDsKLSAgICAKLSAgICAvKgotICAgICAgICBHaXZlIHRoaXMgdGhyZWFkIHRoZSBoaWdoZXN0IHNjaGVkdWxpbmcgcHJpb3JpdHkgcG9zc2libGUsCi0gICAgICAgIGluIHRoZSBob3BlcyB0aGF0IGl0IHdpbGwgaW1tZWRpYXRlbHkgcnVuIGFmdGVyIHRoZSBWQkwgZGVsYXkKLSAgICAqLwotICAgIHsKLSAgICAgICAgcHRocmVhZF90IGN1cnJlbnRfdGhyZWFkOwotICAgICAgICBpbnQgcG9saWN5OwotICAgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07Ci0gICAgICAgIAotICAgICAgICBjdXJyZW50X3RocmVhZCA9IHB0aHJlYWRfc2VsZiAoKTsKLSAgICAgICAgcHRocmVhZF9nZXRzY2hlZHBhcmFtIChjdXJyZW50X3RocmVhZCwgJnBvbGljeSwgJnBhcmFtKTsKLSAgICAgICAgcG9saWN5ID0gU0NIRURfUlI7Ci0gICAgICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heCAocG9saWN5KTsKLSAgICAgICAgcHRocmVhZF9zZXRzY2hlZHBhcmFtIChjdXJyZW50X3RocmVhZCwgcG9saWN5LCAmcGFyYW0pOwotICAgIH0KLSAgICAKLSAgICB3aGlsZSAoMSkgewotICAgIAotICAgICAgICBTRExfU2VtV2FpdCAoc2VtMSk7Ci0gICAgICAgIGlmIChxdWl0X3RocmVhZCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBXZSBoYXZlIHRvIGFkZCBTRExfVmlkZW9TdXJmYWNlLT5vZmZzZXQgaGVyZSwgc2luY2Ugd2UgbWlnaHQgYmUgYQotICAgICAgICAgKiAgc21hbGxlciBzdXJmYWNlIGluIHRoZSBjZW50ZXIgb2YgdGhlIGZyYW1lYnVmZmVyICh5b3UgYXNrZWQgZm9yCi0gICAgICAgICAqICBhIGZ1bGxzY3JlZW4gcmVzb2x1dGlvbiBzbWFsbGVyIHRoYW4gdGhlIGhhcmR3YXJlIGNvdWxkIHN1cHBseQotICAgICAgICAgKiAgc28gU0RMIGlzIGNlbnRlcmluZyBpdCBpbiBhIGJpZ2dlciByZXNvbHV0aW9uKS4uLgotICAgICAgICAgKi8KLSAgICAgICAgZHN0ID0gKFVpbnQ4ICopQ0dEaXNwbGF5QmFzZUFkZHJlc3MgKGRpc3BsYXlfaWQpICsgU0RMX1ZpZGVvU3VyZmFjZS0+b2Zmc2V0OwotICAgICAgICBzcmMgPSBjdXJyZW50X2J1ZmZlciArIFNETF9WaWRlb1N1cmZhY2UtPm9mZnNldDsKLSAgICAgICAgbGVuID0gU0RMX1ZpZGVvU3VyZmFjZS0+dyAqIFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLSAgICAgICAgaCA9IFNETF9WaWRlb1N1cmZhY2UtPmg7Ci0gICAgICAgIHNraXAgPSBTRExfVmlkZW9TdXJmYWNlLT5waXRjaDsKLSAgICAKLSAgICAgICAgLyogV2FpdCBmb3IgdGhlIFZCTCB0byBvY2N1ciAoZXN0aW1hdGVkIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBoYXJkd2FyZSBpbnRlcnJ1cHQpICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogVGhlIFZCTCBkZWxheSBpcyBiYXNlZCBvbiBJYW4gT2xsbWFubidzIFJlekxpYiA8aWFub0BjY28uY2FsdGVjaC5lZHU+ICovCi0gICAgICAgICAgICBkb3VibGUgcmVmcmVzaFJhdGU7Ci0gICAgICAgICAgICBkb3VibGUgbGluZXNQZXJTZWNvbmQ7Ci0gICAgICAgICAgICBkb3VibGUgdGFyZ2V0OwotICAgICAgICAgICAgZG91YmxlIHBvc2l0aW9uOwotICAgICAgICAgICAgZG91YmxlIGFkanVzdG1lbnQ7Ci0gICAgICAgICAgICBBYnNvbHV0ZVRpbWUgbmV4dFRpbWU7ICAgICAgICAKLSAgICAgICAgICAgIENGTnVtYmVyUmVmIHJlZnJlc2hSYXRlQ0ZOdW1iZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJlZnJlc2hSYXRlQ0ZOdW1iZXIgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAobW9kZSwga0NHRGlzcGxheVJlZnJlc2hSYXRlKTsKLSAgICAgICAgICAgIGlmICggTlVMTCA9PSByZWZyZXNoUmF0ZUNGTnVtYmVyICkgewotICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIk1vZGUgaGFzIG5vIHJlZnJlc2ggcmF0ZSIpOwotICAgICAgICAgICAgICAgIGdvdG8gRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICggMCA9PSBDRk51bWJlckdldFZhbHVlIChyZWZyZXNoUmF0ZUNGTnVtYmVyLCBrQ0ZOdW1iZXJEb3VibGVUeXBlLCAmcmVmcmVzaFJhdGUpICkgewotICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIkVycm9yIGdldHRpbmcgcmVmcmVzaCByYXRlIik7Ci0gICAgICAgICAgICAgICAgZ290byBFUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCAwID09IHJlZnJlc2hSYXRlICkgewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBTRExfU2V0RXJyb3IgKCJEaXNwbGF5IGhhcyBubyByZWZyZXNoIHJhdGUsIHVzaW5nIDYwaHoiKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKiBvaywgZm9yIExDRCdzIHdlJ2xsIGVtdWxhdGUgYSA2MGh6IHJlZnJlc2gsIHdoaWNoIG1heSBvciBtYXkgbm90IGxvb2sgcmlnaHQgKi8KLSAgICAgICAgICAgICAgICByZWZyZXNoUmF0ZSA9IDYwLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGxpbmVzUGVyU2Vjb25kID0gcmVmcmVzaFJhdGUgKiBoOwotICAgICAgICAgICAgdGFyZ2V0ID0gaDsKLSAgICAgICAgCi0gICAgICAgICAgICAvKiBGaWd1cmUgb3V0IHRoZSBmaXJzdCBkZWxheSBzbyB3ZSBzdGFydCBvZmYgYWJvdXQgcmlnaHQgKi8KLSAgICAgICAgICAgIHBvc2l0aW9uID0gQ0dEaXNwbGF5QmVhbVBvc2l0aW9uIChkaXNwbGF5X2lkKTsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IHRhcmdldCkKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFkanVzdG1lbnQgPSAodGFyZ2V0IC0gcG9zaXRpb24pIC8gbGluZXNQZXJTZWNvbmQ7IAotICAgICAgICAgICAgCi0gICAgICAgICAgICBuZXh0VGltZSA9IEFkZEFic29sdXRlVG9BYnNvbHV0ZSAoVXBUaW1lICgpLCBRWl9TZWNvbmRzVG9BYnNvbHV0ZSAoYWRqdXN0bWVudCkpOwotICAgICAgICAKLSAgICAgICAgICAgIE1QRGVsYXlVbnRpbCAoJm5leHRUaW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8qIE9uIGVycm9yLCBza2lwIFZCTCBkZWxheSAqLwotICAgICAgICBFUlJPUjoKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICggaC0tICkgewotICAgICAgICAKLSAgICAgICAgICAgIFNETF9tZW1jcHkgKGRzdCwgc3JjLCBsZW4pOwotICAgICAgICAgICAgc3JjICs9IHNraXA7Ci0gICAgICAgICAgICBkc3QgKz0gc2tpcDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogc2lnbmFsIGZsaXAgY29tcGxldGlvbiAqLwotICAgICAgICBTRExfU2VtUG9zdCAoc2VtMik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAwOwotfQotICAgICAgICAKLXN0YXRpYyBpbnQgUVpfRmxpcERvdWJsZUJ1ZmZlciAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKSB7Ci0KLSAgICAvKiB3YWl0IGZvciBwcmV2aW91cyBmbGlwIHRvIGNvbXBsZXRlICovCi0gICAgU0RMX1NlbVdhaXQgKHNlbTIpOwotICAgIAotICAgIGN1cnJlbnRfYnVmZmVyID0gc3VyZmFjZS0+cGl4ZWxzOwotICAgICAgICAKLSAgICBpZiAoc3VyZmFjZS0+cGl4ZWxzID09IHN3X2J1ZmZlcnNbMF0pCi0gICAgICAgIHN1cmZhY2UtPnBpeGVscyA9IHN3X2J1ZmZlcnNbMV07Ci0gICAgZWxzZQotICAgICAgICBzdXJmYWNlLT5waXhlbHMgPSBzd19idWZmZXJzWzBdOwotICAgIAotICAgIC8qIHNpZ25hbCB3b3JrZXIgdGhyZWFkIHRvIGRvIHRoZSBmbGlwICovCi0gICAgU0RMX1NlbVBvc3QgKHNlbTEpOwotICAgIAotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIFFaX0RvdWJsZUJ1ZmZlclVwZGF0ZSAoX1RISVMsIGludCBudW1fcmVjdHMsIFNETF9SZWN0ICpyZWN0cykgewotCi0gICAgLyogcGVyZm9ybSBhIGZsaXAgaWYgc29tZW9uZSBjYWxscyB1cGRhdGVyZWN0cyBvbiBhIGRvdWJsZWJ1ZmVycmVkIHN1cmZhY2UgKi8KLSAgICB0aGlzLT5GbGlwSFdTdXJmYWNlICh0aGlzLCBTRExfVmlkZW9TdXJmYWNlKTsKLX0KLQotc3RhdGljIHZvaWQgUVpfRGlyZWN0VXBkYXRlIChfVEhJUywgaW50IG51bV9yZWN0cywgU0RMX1JlY3QgKnJlY3RzKSB7Ci0jcHJhZ21hIHVudXNlZCh0aGlzLG51bV9yZWN0cyxyZWN0cykKLX0KLQotLyoKLSAgICBUaGUgb2JzY3VyZWQgY29kZSBpcyBiYXNlZCBvbiB3b3JrIGJ5IE1hdHQgU2xvdCBmcHJlZmVjdEBhbWJyb3NpYXN3LmNvbSwKLSAgICB3aG8gc3VwcGxpZWQgc2FtcGxlIGNvZGUgZm9yIENhcmJvbi4KLSovCi0KLS8qI2RlZmluZSBURVNUX09CU0NVUkVEIDEqLwotCi0jaWYgVEVTVF9PQlNDVVJFRAotI2luY2x1ZGUgIkNHUy5oIgotI2VuZGlmCi0KLXN0YXRpYyBpbnQgUVpfSXNXaW5kb3dPYnNjdXJlZCAoTlNXaW5kb3cgKndpbmRvdykgewotCi0KLSNpZiBURVNUX09CU0NVUkVECi0KLSAgICAvKiAgCi0gICAgICAgIEluIG9yZGVyIHRvIGRldGVybWluZSBpZiBhIGRpcmVjdCBjb3B5IHRvIHRoZSBzY3JlZW4gaXMgcG9zc2libGUsCi0gICAgICAgIHdlIG11c3QgZmlndXJlIG91dCBpZiB0aGVyZSBhcmUgYW55IHdpbmRvd3MgY292ZXJpbmcgb3VycyAoaW5jbHVkaW5nIHNoYWRvd3MpLgotICAgICAgICBUaGlzIGNhbiBiZSBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSB3aW5kb3cgc2VydmVyIGFib3V0IHRoZSBvbiBzY3JlZW4KLSAgICAgICAgd2luZG93cyBmb3IgdGhlaXIgc2NyZWVuIHJlY3RhbmdsZSBhbmQgd2luZG93IGxldmVsLgotICAgICAgICBUaGUgcHJvY2VkdXJlIHVzZWQgYmVsb3cgaXMgcHV0cyBhY2N1cmFjeSBiZWZvcmUgc3BlZWQ7IGhvd2V2ZXIsIGl0IGFpbXMgdG8gY2FsbAotICAgICAgICB0aGUgd2luZG93IHNlcnZlciB0aGUgZmV3ZXN0IG51bWJlciBvZiB0aW1lcyBwb3NzaWJsZSB0byBrZWVwIHRoaW5ncyByZWFzb25hYmxlLgotICAgICAgICBJbiBteSB0ZXN0aW5nIG9uIGEgMzAwbWh6IEczLCB0aGlzIHJvdXRpbmUgdHlwaWNhbGx5IHRha2VzIDwgMiBtcy4gLURXCi0gICAgCi0gICAgTm90ZXM6Ci0gICAgICAgIC1DYWxscyBpbnRvIHRoZSBXaW5kb3cgU2VydmVyIGludm9sdmUgSVBDIHdoaWNoIGlzIHNsb3cuCi0gICAgICAgIC1HZXR0aW5nIGEgcmVjdGFuZ2xlIHNlZW1zIHNsb3dlciB0aGFuIGdldHRpbmcgdGhlIHdpbmRvdyBsZXZlbAotICAgICAgICAtVGhlIHdpbmRvdyBsaXN0IHdlIGdldCBiYWNrIGlzIGluIHNvcnRlZCBvcmRlciwgdG9wIHRvIGJvdHRvbQotICAgICAgICAtT24gYXZlcmFnZSwgSSBzdXNwZWN0LCBtb3N0IHdpbmRvd3MgYWJvdmUgb3VycyBhcmUgZG9jayBpY29uIHdpbmRvd3MgKGhlbmNlIG9wdGltaXphdGlvbikKLSAgICAgICAgLVNvbWUgd2luZG93cyBhYm92ZSBvdXJzIGFyZSBhbHdheXMgdGhlcmUsIGFuZCBjYW5ub3QgbW92ZSBvciBvYnNjdXJlIHVzIChtZW51IGJhcikKLSAgICAKLSAgICBCdWdzOgotICAgICAgICAtbm8gd2F5ICh5ZXQpIHRvIGRlYWN0aXZhdGUgZGlyZWN0IGRyYXdpbmcgd2hlbiBhIHdpbmRvdyBpcyBkcmFnZ2VkLAotICAgICAgICBvciBzdWRkZW5seSBvYnNjdXJlZCwgc28gZHJhd2luZyBjb250aW51ZXMgYW5kIGNhbiBwcm9kdWNlIGdhcmJhZ2UKLSAgICAgICAgV2UgbmVlZCBzb21lIGtpbmQgb2YgbG9ja2luZyBtZWNoYW5pc20gb24gd2luZG93IG1vdmVtZW50IHRvIHByZXZlbnQgdGhpcwotICAgIAotICAgICAgICAtZGVhY3RpdmF0ZWQgbm9ybWFsIHdpbmRvd3MgdXNlIGFjdGl2YXRlZCBub3JtYWwKLSAgICAgICAgd2luZG93IHNoYWRvd3MgKHNsaWdodCBpbmFjY3VyYWNjeSkKLSAgICAqLwotCi0gICAgLyogQ2FjaGUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHdpbmRvdyBzZXJ2ZXIgKi8KLSAgICBzdGF0aWMgQ0dTQ29ubmVjdGlvbklEICAgIGNnc0Nvbm5lY3Rpb24gPSAoQ0dTQ29ubmVjdGlvbklEKSAtMTsKLQotICAgIC8qIENhY2hlIHRoZSBkb2NrIGljb24gd2luZG93cyAqLwotICAgIHN0YXRpYyBDR1NXaW5kb3dJRCAgICAgICAgICBkb2NrSWNvbnNba01heFdpbmRvd3NdOwotICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgICAgICBudW1DYWNoZWREb2NrSWNvbnMgPSAwOwotCi0gICAgQ0dTV2luZG93SUQgICAgICAgICAgICAgICAgd2luZG93c1trTWF4V2luZG93c107Ci0gICAgQ0dTV2luZG93Q291bnQgICAgICAgICAgICAgaSwgY291bnQ7Ci0gICAgQ0dTV2luZG93TGV2ZWwgICAgICAgICAgICAgd2luTGV2ZWw7Ci0gICAgQ0dTUmVjdCAgICAgICAgICAgICAgICAgICAgd2luUmVjdDsKLQotICAgIENHU1JlY3QgY29udGVudFJlY3Q7Ci0gICAgaW50ICAgICB3aW5kb3dOdW1iZXI7Ci0gICAgaW50ICAgICBmaXJzdERvY2tJY29uOwotICAgIGludCAgICAgZG9ja0ljb25DYWNoZU1pc3M7Ci0gICAgaW50ICAgICB3aW5kb3dDb250ZW50T2Zmc2V0OwotCi0gICAgaW50ICAgICBvYnNjdXJlZCA9IFNETF9UUlVFOwotCi0gICAgaWYgKCBbIHdpbmRvdyBpc1Zpc2libGUgXSApIHsKLQotICAgICAgICAvKiAgCi0gICAgICAgICAgICB3YWxrIHRoZSB3aW5kb3cgbGlzdCBsb29raW5nIGZvciB3aW5kb3dzIG92ZXIgdG9wIG9mCi0gICAgICAgICAgICAob3IgY2FzdGluZyBhIHNoYWRvdyBvbikgb3VycyAKLSAgICAgICAgKi8KLQotICAgICAgICAvKiAKLSAgICAgICAgICAgR2V0IGEgY29ubmVjdGlvbiB0byB0aGUgd2luZG93IHNlcnZlcgotICAgICAgICAgICBTaG91bGQgcHJvYmFibHkgYmUgbW92ZWQgb3V0IGludG8gU2V0VmlkZW9Nb2RlKCkgb3IgSW5pdFZpZGVvKCkKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKGNnc0Nvbm5lY3Rpb24gPT0gKENHU0Nvbm5lY3Rpb25JRCkgLTEpIHsKLSAgICAgICAgICAgIGNnc0Nvbm5lY3Rpb24gPSAoQ0dTQ29ubmVjdGlvbklEKSAwOwotICAgICAgICAgICAgY2dzQ29ubmVjdGlvbiA9IF9DR1NEZWZhdWx0Q29ubmVjdGlvbiAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjZ3NDb25uZWN0aW9uKSB7Ci0KLSAgICAgICAgICAgIGlmICggISBbIHdpbmRvdyBzdHlsZU1hc2sgXSAmIE5TQm9yZGVybGVzc1dpbmRvd01hc2sgKQotICAgICAgICAgICAgICAgIHdpbmRvd0NvbnRlbnRPZmZzZXQgPSAyMjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3aW5kb3dDb250ZW50T2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2luZG93TnVtYmVyID0gWyB3aW5kb3cgd2luZG93TnVtYmVyIF07Ci0KLSAgICAgICAgICAgIC8qIFRoZSB3aW5kb3cgbGlzdCBpcyBzb3J0ZWQgYWNjb3JkaW5nIHRvIG9yZGVyIG9uIHRoZSBzY3JlZW4gKi8KLSAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgIENHU0dldE9uU2NyZWVuV2luZG93TGlzdCAoY2dzQ29ubmVjdGlvbiwgMCwga01heFdpbmRvd3MsIHdpbmRvd3MsICZjb3VudCk7Ci0gICAgICAgICAgICBDR1NHZXRTY3JlZW5SZWN0Rm9yV2luZG93IChjZ3NDb25uZWN0aW9uLCB3aW5kb3dOdW1iZXIsICZjb250ZW50UmVjdCk7Ci0KLSAgICAgICAgICAgIC8qIGFkanVzdCByZWN0IGZvciB3aW5kb3cgdGl0bGUgYmFyIChpZiBwcmVzZW50KSAqLwotICAgICAgICAgICAgY29udGVudFJlY3Qub3JpZ2luLnkgICAgKz0gd2luZG93Q29udGVudE9mZnNldDsKLSAgICAgICAgICAgIGNvbnRlbnRSZWN0LnNpemUuaGVpZ2h0IC09IHdpbmRvd0NvbnRlbnRPZmZzZXQ7Ci0KLSAgICAgICAgICAgIGZpcnN0RG9ja0ljb24gPSAtMTsKLSAgICAgICAgICAgIGRvY2tJY29uQ2FjaGVNaXNzID0gU0RMX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiAKLSAgICAgICAgICAgICAgICBUaGUgZmlyc3Qgd2luZG93IGlzIGFsd2F5cyBhbiBlbXB0eSB3aW5kb3cgd2l0aCBsZXZlbCBrQ0dTV2luZG93TGV2ZWxUb3AKLSAgICAgICAgICAgICAgICBzbyBzdGFydCBhdCBpbmRleCAxCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLQotICAgICAgICAgICAgICAgIC8qIElmIHdlIHJlYWNoIG91ciB3aW5kb3cgaW4gdGhlIGxpc3QsIGl0IGNhbm5vdCBiZSBvYnNjdXJlZCAqLwotICAgICAgICAgICAgICAgIGlmICh3aW5kb3dzW2ldID09IHdpbmRvd051bWJlcikgewotCi0gICAgICAgICAgICAgICAgICAgIG9ic2N1cmVkID0gU0RMX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2hhZG93U2lkZTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2hhZG93VG9wOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCBzaGFkb3dCb3R0b207Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0dTR2V0V2luZG93TGV2ZWwgKGNnc0Nvbm5lY3Rpb24sIHdpbmRvd3NbaV0sICZ3aW5MZXZlbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdpbkxldmVsID09IGtDR1NXaW5kb3dMZXZlbERvY2tJY29uKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3REb2NrSWNvbiA8IDApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RG9ja0ljb24gPSBpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bUNhY2hlZERvY2tJY29ucyA+IDApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ2FjaGVkRG9ja0ljb25zOyBqKyspIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvd3NbaV0gPT0gZG9ja0ljb25zW2pdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqICE9IDApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IG51bUNhY2hlZERvY2tJY29ucykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9ja0ljb25DYWNoZU1pc3MgPSBTRExfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3aW5MZXZlbCA9PSBrQ0dTV2luZG93TGV2ZWxNZW51SWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpbkxldmVsID09IGtDR1NXaW5kb3dMZXZlbFRvcCAqLykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogY2Fubm90IG9ic2N1cmUgd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod2luTGV2ZWwgPT0ga0NHU1dpbmRvd0xldmVsRG9ja01lbnUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luTGV2ZWwgPT0ga0NHU1dpbmRvd0xldmVsTWVudSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dTaWRlID0gMTg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dUb3AgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93Qm90dG9tID0gMjI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod2luTGV2ZWwgPT0ga0NHU1dpbmRvd0xldmVsVXRpbGl0eSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dTaWRlID0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1RvcCA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dCb3R0b20gPSAxMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3aW5MZXZlbCA9PSBrQ0dTV2luZG93TGV2ZWxOb3JtYWwpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgbnVtYmVycyBhcmUgZm9yIGZvcmVncm91bmQgd2luZG93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV5IGFyZSB0b28gYmlnIChidXQgd2lsbCB3b3JrKSBmb3IgYmFja2dyb3VuZCB3aW5kb3dzIAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1NpZGUgPSAyMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1RvcCA9IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93Qm90dG9tID0gMjQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod2luTGV2ZWwgPT0ga0NHU1dpbmRvd0xldmVsRG9jaykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgZG9jayBpY29uIGNhY2hlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtQ2FjaGVkRG9ja0ljb25zICE9IChpLWZpcnN0RG9ja0ljb24pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9ja0ljb25DYWNoZU1pc3MpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNhY2hlZERvY2tJY29ucyA9IGkgLSBmaXJzdERvY2tJY29uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9tZW1jcHkgKGRvY2tJY29ucywgJih3aW5kb3dzW2ZpcnN0RG9ja0ljb25dKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNhY2hlZERvY2tJY29ucyAqIHNpemVvZigqd2luZG93cykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBzaGFkb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1NpZGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93VG9wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0JvdHRvbSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHU1dpbmRvd0xldmVsRG9ja0xhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDR1NXaW5kb3dMZXZlbERvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga090aGVyPz8/Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBzaGFkb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1NpZGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93VG9wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0JvdHRvbSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBDR1NHZXRTY3JlZW5SZWN0Rm9yV2luZG93IChjZ3NDb25uZWN0aW9uLCB3aW5kb3dzW2ldLCAmd2luUmVjdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2luUmVjdC5vcmlnaW4ueCAtPSBzaGFkb3dTaWRlOwotICAgICAgICAgICAgICAgICAgICB3aW5SZWN0Lm9yaWdpbi55IC09IHNoYWRvd1RvcDsKLSAgICAgICAgICAgICAgICAgICAgd2luUmVjdC5zaXplLndpZHRoICs9IHNoYWRvd1NpZGU7Ci0gICAgICAgICAgICAgICAgICAgIHdpblJlY3Quc2l6ZS5oZWlnaHQgKz0gc2hhZG93Qm90dG9tOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChOU0ludGVyc2VjdHNSZWN0IChjb250ZW50UmVjdCwgd2luUmVjdCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZWQgPSBTRExfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IC8qIHdpbmRvdyB3YXMgbm90IG91ciB3aW5kb3cgKi8KLQotICAgICAgICAgICAgfSAvKiBpdGVyYXRlIG92ZXIgd2luZG93cyAqLwotCi0gICAgICAgIH0gLyogZ2V0IGNnc0Nvbm5lY3Rpb24gKi8KLQotICAgIH0gLyogd2luZG93IGlzIHZpc2libGUgKi8KLSAgICAKLSAgICByZXR1cm4gb2JzY3VyZWQ7Ci0jZWxzZQotICAgIHJldHVybiBTRExfVFJVRTsKLSNlbmRpZgotfQotCi0KLS8qIExvY2tpbmcgZnVuY3Rpb25zIGZvciB0aGUgc29mdHdhcmUgd2luZG93IGJ1ZmZlciAqLwotc3RhdGljIGludCBRWl9Mb2NrV2luZG93IChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpIHsKLSNpZiAxCi0gICAgcmV0dXJuIExvY2tQb3J0Qml0cyggWyB3aW5kb3dfdmlldyBxZFBvcnQgXSApOwotI2Vsc2UKLSAgICBDR3JhZlB0ciAgIHFkcG9ydCA9IFsgd2luZG93X3ZpZXcgcWRQb3J0IF07IAotICAgIGludCAgICAgICAgcmVzdWx0ID0gTG9ja1BvcnRCaXRzICggcWRwb3J0ICk7Ci0gICAgCi0gICAgaWYgKCAhcmVzdWx0ICkgewotICAgICAgICBVaW50OCogIHBpeGVscyAgICA9IEdldFBpeEJhc2VBZGRyICggR2V0UG9ydFBpeE1hcCAoIHFkcG9ydCApICk7Ci0gICAgICAgIE5TUmVjdCAgdmlld0ZyYW1lID0gWyB3aW5kb3dfdmlldyBmcmFtZSBdOwotICAgICAgICBOU1JlY3QgIHdpbkZyYW1lICA9IFsgcXpfd2luZG93IGZyYW1lIF07Ci0gICAgICAgIGludCAgICAgdk9mZnNldCAgID0gd2luRnJhbWUuc2l6ZS5oZWlnaHQgLSB2aWV3RnJhbWUuc2l6ZS5oZWlnaHQgLSB2aWV3RnJhbWUub3JpZ2luLnk7Ci0gICAgICAgIGludCAgICAgaE9mZnNldCAgID0gdmlld0ZyYW1lLm9yaWdpbi54OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcGl4ZWxzID0gcGl4ZWxzICsgKHZPZmZzZXQgKiBzdXJmYWNlLT5waXRjaCkgKyBoT2Zmc2V0ICo0OwotICAgICAgICAKLSAgICAgICAgaWYgKCBzdXJmYWNlLT5waXhlbHMgIT0gcGl4ZWxzICkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlhYWDogc3VyZmFjZS0+cGl4ZWxzIGlzICVwLCBzaG91bGQgYmUgJXBcbiIsIHN1cmZhY2UtPnBpeGVscywgcGl4ZWxzKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiWFhYOiBjb3VsZCBub3QgbG9jayBwb3J0ICVwIGZvciBzdXJmYWNlICVwXG4iLCBxZHBvcnQsIHN1cmZhY2UpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIFFaX1VubG9ja1dpbmRvdyAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKSB7Ci0KLSAgICBVbmxvY2tQb3J0Qml0cyAoIFsgd2luZG93X3ZpZXcgcWRQb3J0IF0gKTsKLX0KLQotLyogUmVzaXplIGljb24sIEJNUCBmb3JtYXQgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFFaX1Jlc2l6ZUljb25bXSA9IHsKLSAgICAweDQyLDB4NGQsMHgzMSwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzYsMHgwMCwweDAwLDB4MDAsMHgyOCwweDAwLAotICAgIDB4MDAsMHgwMCwweDBkLDB4MDAsMHgwMCwweDAwLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsCi0gICAgMHgwMCwweDAwLDB4ZmIsMHgwMSwweDAwLDB4MDAsMHgxMywweDBiLDB4MDAsMHgwMCwweDEzLDB4MGIsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0gICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDBiLDB4ZmYsMHhmZiwKLSAgICAweGZmLDB4ZGEsMHhkYSwweGRhLDB4ODcsMHg4NywweDg3LDB4ZTgsMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4ZGEsMHhkYSwweGRhLAotICAgIDB4ODcsMHg4NywweDg3LDB4ZTgsMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4ZGEsMHhkYSwweGRhLDB4ODcsMHg4NywweDg3LDB4ZTgsCi0gICAgMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkYSwweGRhLDB4ZGEsMHg4NywKLSAgICAweDg3LDB4ODcsMHhlOCwweGU4LDB4ZTgsMHhmZiwweGZmLDB4ZmYsMHhkYSwweGRhLDB4ZGEsMHg4NywweDg3LDB4ODcsMHhlOCwweGU4LAotICAgIDB4ZTgsMHhmZiwweGZmLDB4ZmYsMHhkYSwweGRhLDB4ZGEsMHg4NywweDg3LDB4ODcsMHhmZiwweGZmLDB4ZmYsMHgwYiwweGZmLDB4ZmYsCi0gICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGQ1LDB4ZDUsMHhkNSwweDg3LDB4ODcsMHg4NywweGU4LDB4ZTgsMHhlOCwKLSAgICAweGZmLDB4ZmYsMHhmZiwweGRhLDB4ZGEsMHhkYSwweDg3LDB4ODcsMHg4NywweGU4LDB4ZTgsMHhlOCwweGZmLDB4ZmYsMHhmZiwweGRhLAotICAgIDB4ZGEsMHhkYSwweGZmLDB4ZmYsMHhmZiwweDBiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0gICAgMHhmZiwweGZmLDB4ZDcsMHhkNywweGQ3LDB4ODcsMHg4NywweDg3LDB4ZTgsMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4ZGEsMHhkYSwKLSAgICAweGRhLDB4ODcsMHg4NywweDg3LDB4ZTgsMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweGZmLAotICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkNywweGQ3LDB4ZDcsCi0gICAgMHg4NywweDg3LDB4ODcsMHhlOCwweGU4LDB4ZTgsMHhmZiwweGZmLDB4ZmYsMHhkYSwweGRhLDB4ZGEsMHg4NywweDg3LDB4ODcsMHhlOCwKLSAgICAweGU4LDB4ZTgsMHhmZiwweGZmLDB4ZmYsMHgwYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGQ3LDB4ZDcsMHhkNywweDg3LDB4ODcsMHg4NywweGU4LDB4ZTgsCi0gICAgMHhlOCwweGZmLDB4ZmYsMHhmZiwweGRjLDB4ZGMsMHhkYywweDg3LDB4ODcsMHg4NywweGZmLDB4ZmYsMHhmZiwweDBiLDB4ZmYsMHhmZiwKLSAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotICAgIDB4ZmYsMHhmZiwweGZmLDB4ZDksMHhkOSwweGQ5LDB4ODcsMHg4NywweDg3LDB4ZTgsMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4ZGMsCi0gICAgMHhkYywweGRjLDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLSAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGRiLAotICAgIDB4ZGIsMHg4NywweDg3LDB4ODcsMHhlOCwweGU4LDB4ZTgsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwYiwweGZmLDB4ZmYsCi0gICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLSAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZGIsMHhkYiwweDg3LDB4ODcsMHg4NywweGU4LAotICAgIDB4ZTgsMHhlOCwweGZmLDB4ZmYsMHhmZiwweDBiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0gICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLSAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGMsMHhkYywweGRjLDB4ODcsMHg4NywweDg3LDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweGZmLAotICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0gICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkYywKLSAgICAweGRjLDB4ZGMsMHhmZiwweGZmLDB4ZmYsMHgwYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0gICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDBiCi19OwotCi1zdGF0aWMgdm9pZCBRWl9EcmF3UmVzaXplSWNvbiAoX1RISVMsIFJnbkhhbmRsZSBkaXJ0eVJlZ2lvbikgewotCi0gICAgLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIGRyYXcgdGhlIHJlc2l6ZSBpY29uICovCi0gICAgaWYgKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX1JFU0laQUJMRSkgewotICAgIAotICAgICAgICBSZWN0ICAgIGljb247Ci0gICAgICAgIFNldFJlY3QgKCZpY29uLCBTRExfVmlkZW9TdXJmYWNlLT53IC0gMTMsIFNETF9WaWRlb1N1cmZhY2UtPmggLSAxMywgCi0gICAgICAgICAgICAgICAgICAgIFNETF9WaWRlb1N1cmZhY2UtPncsIFNETF9WaWRlb1N1cmZhY2UtPmgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKFJlY3RJblJnbiAoJmljb24sIGRpcnR5UmVnaW9uKSkgewotICAgICAgICAKLSAgICAgICAgICAgIFNETF9SZWN0IGljb25fcmVjdDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBpY29uIGltYWdlICovCi0gICAgICAgICAgICBpZiAocmVzaXplX2ljb24gPT0gTlVMTCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU0RMX1JXb3BzICpydzsKLSAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqdG1wOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJ3ID0gU0RMX1JXRnJvbUNvbnN0TWVtIChRWl9SZXNpemVJY29uLCBzaXplb2YoUVpfUmVzaXplSWNvbikpOwotICAgICAgICAgICAgICAgIHRtcCA9IFNETF9Mb2FkQk1QX1JXIChydywgU0RMX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlc2l6ZV9pY29uID0gU0RMX0NvbnZlcnRTdXJmYWNlICh0bXAsIFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdCwgU0RMX1NSQ0NPTE9SS0VZKTsKLSAgICAgICAgICAgICAgICBTRExfU2V0Q29sb3JLZXkgKHJlc2l6ZV9pY29uLCBTRExfU1JDQ09MT1JLRVksIDB4RkZGRkZGKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTRExfRnJlZVN1cmZhY2UgKHRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGljb25fcmVjdC54ID0gU0RMX1ZpZGVvU3VyZmFjZS0+dyAtIDEzOwotICAgICAgICAgICAgaWNvbl9yZWN0LnkgPSBTRExfVmlkZW9TdXJmYWNlLT5oIC0gMTM7Ci0gICAgICAgICAgICBpY29uX3JlY3QudyA9IDEzOwotICAgICAgICAgICAgaWNvbl9yZWN0LmggPSAxMzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU0RMX0JsaXRTdXJmYWNlIChyZXNpemVfaWNvbiwgTlVMTCwgU0RMX1ZpZGVvU3VyZmFjZSwgJmljb25fcmVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFFaX1VwZGF0ZVJlY3RzIChfVEhJUywgaW50IG51bVJlY3RzLCBTRExfUmVjdCAqcmVjdHMpIHsKLQotICAgIGlmIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9PUEVOR0xCTElUKSB7Ci0gICAgICAgIFFaX0dMX1N3YXBCdWZmZXJzICh0aGlzKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIFsgcXpfd2luZG93IGlzTWluaWF0dXJpemVkIF0gKSB7Ci0gICAgCi0gICAgICAgIC8qIERvIG5vdGhpbmcgaWYgbWluaWF0dXJpemVkICovCi0gICAgfQotICAgIAotICAgIGVsc2UgaWYgKCAhIFFaX0lzV2luZG93T2JzY3VyZWQgKHF6X3dpbmRvdykgKSB7Ci0KLSAgICAgICAgLyogVXNlIGRpcmVjdCBjb3B5IHRvIGZsdXNoIGNvbnRlbnRzIHRvIHRoZSBkaXNwbGF5ICovCi0gICAgICAgIENHcmFmUHRyIHNhdmVQb3J0OwotICAgICAgICBDR3JhZlB0ciBkc3RQb3J0LCBzcmNQb3J0OwotICAgICAgICBjb25zdCBCaXRNYXAgICpkc3RCaXRzLCAqc3JjQml0czsKLSAgICAgICAgUmVjdCAgICAgZHN0UmVjdCwgc3JjUmVjdDsKLSAgICAgICAgUG9pbnQgICAgb2Zmc2V0OwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBHZXRQb3J0ICgmc2F2ZVBvcnQpOwotCi0gICAgICAgIGRzdFBvcnQgPSBDcmVhdGVOZXdQb3J0Rm9yQ0dEaXNwbGF5SUQgKChVSW50MzIpZGlzcGxheV9pZCk7Ci0gICAgICAgIHNyY1BvcnQgPSBbIHdpbmRvd192aWV3IHFkUG9ydCBdOwotCi0gICAgICAgIG9mZnNldC5oID0gMDsKLSAgICAgICAgb2Zmc2V0LnYgPSAwOwotICAgICAgICBTZXRQb3J0IChzcmNQb3J0KTsKLSAgICAgICAgTG9jYWxUb0dsb2JhbCAoJm9mZnNldCk7Ci0KLSAgICAgICAgU2V0UG9ydCAoZHN0UG9ydCk7Ci0KLSAgICAgICAgTG9ja1BvcnRCaXRzIChkc3RQb3J0KTsKLSAgICAgICAgTG9ja1BvcnRCaXRzIChzcmNQb3J0KTsKLQotICAgICAgICBkc3RCaXRzID0gR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzIChkc3RQb3J0KTsKLSAgICAgICAgc3JjQml0cyA9IEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyAoc3JjUG9ydCk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVJlY3RzOyBpKyspIHsKLQotICAgICAgICAgICAgU2V0UmVjdCAoJnNyY1JlY3QsIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksCi0gICAgICAgICAgICAgICAgICAgICByZWN0c1tpXS54ICsgcmVjdHNbaV0udywKLSAgICAgICAgICAgICAgICAgICAgIHJlY3RzW2ldLnkgKyByZWN0c1tpXS5oKTsKLQotICAgICAgICAgICAgU2V0UmVjdCAoJmRzdFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICByZWN0c1tpXS54ICsgb2Zmc2V0LmgsCi0gICAgICAgICAgICAgICAgICAgICByZWN0c1tpXS55ICsgb2Zmc2V0LnYsCi0gICAgICAgICAgICAgICAgICAgICByZWN0c1tpXS54ICsgcmVjdHNbaV0udyArIG9mZnNldC5oLAotICAgICAgICAgICAgICAgICAgICAgcmVjdHNbaV0ueSArIHJlY3RzW2ldLmggKyBvZmZzZXQudik7Ci0KLSAgICAgICAgICAgIENvcHlCaXRzIChzcmNCaXRzLCBkc3RCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LCAmZHN0UmVjdCwgc3JjQ29weSwgTlVMTCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFNldFBvcnQgKHNhdmVQb3J0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIFVzZSBRREZsdXNoUG9ydEJ1ZmZlcigpIHRvIGZsdXNoIGNvbnRlbnQgdG8gZGlzcGxheSAqLwotICAgICAgICBpbnQgaTsKLSAgICAgICAgUmduSGFuZGxlIGRpcnR5ID0gTmV3UmduICgpOwotICAgICAgICBSZ25IYW5kbGUgdGVtcCAgPSBOZXdSZ24gKCk7Ci0KLSAgICAgICAgU2V0RW1wdHlSZ24gKGRpcnR5KTsKLQotICAgICAgICAvKiBCdWlsZCB0aGUgcmVnaW9uIG9mIGRpcnR5IHJlY3RhbmdsZXMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVJlY3RzOyBpKyspIHsKLQotICAgICAgICAgICAgTWFjU2V0UmVjdFJnbiAodGVtcCwgcmVjdHNbaV0ueCwgcmVjdHNbaV0ueSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RzW2ldLnggKyByZWN0c1tpXS53LCByZWN0c1tpXS55ICsgcmVjdHNbaV0uaCk7Ci0gICAgICAgICAgICBNYWNVbmlvblJnbiAoZGlydHksIHRlbXAsIGRpcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIFFaX0RyYXdSZXNpemVJY29uICh0aGlzLCBkaXJ0eSk7Ci0gICAgICAgIAotICAgICAgICAvKiBGbHVzaCB0aGUgZGlydHkgcmVnaW9uICovCi0gICAgICAgIFFERmx1c2hQb3J0QnVmZmVyICggWyB3aW5kb3dfdmlldyBxZFBvcnQgXSwgZGlydHkgKTsKLSAgICAgICAgRGlzcG9zZVJnbiAoZGlydHkpOwotICAgICAgICBEaXNwb3NlUmduICh0ZW1wKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFFaX1ZpZGVvUXVpdCAoX1RISVMpIHsKLQotICAgIENHRGlzcGxheUZhZGVSZXNlcnZhdGlvblRva2VuIGZhZGVfdG9rZW4gPSBrQ0dEaXNwbGF5RmFkZVJlc2VydmF0aW9uSW52YWxpZFRva2VuOwotCi0gICAgLyogUmVzdG9yZSBnYW1tYSBzZXR0aW5ncyAqLwotICAgIENHRGlzcGxheVJlc3RvcmVDb2xvclN5bmNTZXR0aW5ncyAoKTsKLQotICAgIC8qIEVuc3VyZSB0aGUgY3Vyc29yIHdpbGwgYmUgdmlzaWJsZSBhbmQgd29ya2luZyB3aGVuIHdlIHF1aXQgKi8KLSAgICBDR0Rpc3BsYXlTaG93Q3Vyc29yIChkaXNwbGF5X2lkKTsKLSAgICBDR0Fzc29jaWF0ZU1vdXNlQW5kTW91c2VDdXJzb3JQb3NpdGlvbiAoMSk7Ci0gICAgCi0gICAgaWYgKG1vZGVfZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgewotICAgICAgICAvKiBGYWRlIHRvIGJsYWNrIHRvIGhpZGUgcmVzb2x1dGlvbi1zd2l0Y2hpbmcgZmxpY2tlciAoYW5kIGdhcmJhZ2UKLSAgICAgICAgICAgdGhhdCBpcyBkaXNwbGF5ZWQgYnkgYSBkZXN0cm95ZWQgT3BlbkdMIGNvbnRleHQsIGlmIGFwcGxpY2FibGUpICovCi0gICAgICAgIGlmIChDR0FjcXVpcmVEaXNwbGF5RmFkZVJlc2VydmF0aW9uICg1LCAmZmFkZV90b2tlbikgPT0ga0NHRXJyb3JTdWNjZXNzKSB7Ci0gICAgICAgICAgICBDR0Rpc3BsYXlGYWRlIChmYWRlX3Rva2VuLCAwLjMsIGtDR0Rpc3BsYXlCbGVuZE5vcm1hbCwga0NHRGlzcGxheUJsZW5kU29saWRDb2xvciwgMC4wLCAwLjAsIDAuMCwgVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgUVpfVW5zZXRWaWRlb01vZGUgKHRoaXMsIFRSVUUpOwotICAgICAgICBpZiAoZmFkZV90b2tlbiAhPSBrQ0dEaXNwbGF5RmFkZVJlc2VydmF0aW9uSW52YWxpZFRva2VuKSB7Ci0gICAgICAgICAgICBDR0Rpc3BsYXlGYWRlIChmYWRlX3Rva2VuLCAwLjUsIGtDR0Rpc3BsYXlCbGVuZFNvbGlkQ29sb3IsIGtDR0Rpc3BsYXlCbGVuZE5vcm1hbCwgMC4wLCAwLjAsIDAuMCwgRkFMU0UpOwotICAgICAgICAgICAgQ0dSZWxlYXNlRGlzcGxheUZhZGVSZXNlcnZhdGlvbiAoZmFkZV90b2tlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBRWl9VbnNldFZpZGVvTW9kZSAodGhpcywgVFJVRSk7Ci0gICAgCi0gICAgQ0dQYWxldHRlUmVsZWFzZSAocGFsZXR0ZSk7Ci0KLSAgICBpZiAob3BlbmdsX2xpYnJhcnkpIHsKLSAgICAgICAgU0RMX1VubG9hZE9iamVjdChvcGVuZ2xfbGlicmFyeSk7Ci0gICAgICAgIG9wZW5nbF9saWJyYXJ5ID0gTlVMTDsKLSAgICB9Ci0gICAgdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAwOwotCi0gICAgaWYgKGZpZWxkX2VkaXQpIHsKLSAgICAgICAgW2ZpZWxkX2VkaXQgcmVsZWFzZV07Ci0gICAgICAgIGZpZWxkX2VkaXQgPSBOVUxMOwotICAgIH0KLX0KLQotI2lmIDAgLyogTm90IHVzZWQgKGFwcGFyZW50bHksIGl0J3MgcmVhbGx5IHNsb3cpICovCi1zdGF0aWMgaW50ICBRWl9GaWxsSFdSZWN0IChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcikgewotCi0gICAgQ0dTRGlzcGxheUhXRmlsbCAoZGlzcGxheV9pZCwgcmVjdC0+eCwgcmVjdC0+eSwgcmVjdC0+dywgcmVjdC0+aCwgY29sb3IpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCAgUVpfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpIHsKLQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBRWl9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKSB7Ci0KLX0KLQotc3RhdGljIGludCBRWl9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpIHsKLSAgICByZXR1cm4oLTEpOyAvKiB1bmFsbG93ZWQgKG5vIEhXU1VSRkFDRSBzdXBwb3J0IGhlcmUpLiAqLwotfQotCi1zdGF0aWMgdm9pZCBRWl9GcmVlSFdTdXJmYWNlIChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpIHsKLX0KLQotLyoKLSBpbnQgUVpfRmxpcEhXU3VyZmFjZSAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKSB7Ci0gICAgIHJldHVybiAwOwotIH0KLSAqLwotCi0vKiBHYW1tYSBmdW5jdGlvbnMgKi8KLWludCBRWl9TZXRHYW1tYSAoX1RISVMsIGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpIHsKLQotICAgIGNvbnN0IENHR2FtbWFWYWx1ZSBtaW4gPSAwLjAsIG1heCA9IDEuMDsKLQotICAgIGlmIChyZWQgPT0gMC4wKQotICAgICAgICByZWQgPSBGTFRfTUFYOwotICAgIGVsc2UKLSAgICAgICAgcmVkID0gMS4wIC8gcmVkOwotCi0gICAgaWYgKGdyZWVuID09IDAuMCkKLSAgICAgICAgZ3JlZW4gPSBGTFRfTUFYOwotICAgIGVsc2UKLSAgICAgICAgZ3JlZW4gPSAxLjAgLyBncmVlbjsKLQotICAgIGlmIChibHVlID09IDAuMCkKLSAgICAgICAgYmx1ZSA9IEZMVF9NQVg7Ci0gICAgZWxzZQotICAgICAgICBibHVlICA9IDEuMCAvIGJsdWU7Ci0KLSAgICBpZiAoIENHRGlzcGxheU5vRXJyID09IENHU2V0RGlzcGxheVRyYW5zZmVyQnlGb3JtdWxhCi0gICAgICAgICAoZGlzcGxheV9pZCwgbWluLCBtYXgsIHJlZCwgbWluLCBtYXgsIGdyZWVuLCBtaW4sIG1heCwgYmx1ZSkgKSB7Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLWludCBRWl9HZXRHYW1tYSAoX1RISVMsIGZsb2F0ICpyZWQsIGZsb2F0ICpncmVlbiwgZmxvYXQgKmJsdWUpIHsKLQotICAgIENHR2FtbWFWYWx1ZSBkdW1teTsKLSAgICBpZiAoIENHRGlzcGxheU5vRXJyID09IENHR2V0RGlzcGxheVRyYW5zZmVyQnlGb3JtdWxhCi0gICAgICAgICAoZGlzcGxheV9pZCwgJmR1bW15LCAmZHVtbXksIHJlZCwKLSAgICAgICAgICAmZHVtbXksICZkdW1teSwgZ3JlZW4sICZkdW1teSwgJmR1bW15LCBibHVlKSApCi0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gLTE7Ci19Ci0KLWludCBRWl9TZXRHYW1tYVJhbXAgKF9USElTLCBVaW50MTYgKnJhbXApIHsKLQotICAgIGNvbnN0IENHVGFibGVDb3VudCB0YWJsZVNpemUgPSAyNTU7Ci0gICAgQ0dHYW1tYVZhbHVlIHJlZFRhYmxlW3RhYmxlU2l6ZV07Ci0gICAgQ0dHYW1tYVZhbHVlIGdyZWVuVGFibGVbdGFibGVTaXplXTsKLSAgICBDR0dhbW1hVmFsdWUgYmx1ZVRhYmxlW3RhYmxlU2l6ZV07Ci0KLSAgICBpbnQgaTsKLQotICAgIC8qIEV4dHJhY3QgZ2FtbWEgdmFsdWVzIGludG8gc2VwYXJhdGUgdGFibGVzLCBjb252ZXJ0IHRvIGZsb2F0cyBiZXR3ZWVuIDAuMCBhbmQgMS4wICovCi0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgICByZWRUYWJsZVtpICUgMjU2XSA9IHJhbXBbaV0gLyA2NTUzNS4wOwotCi0gICAgZm9yIChpPTI1NjsgaSA8IDUxMjsgaSsrKQotICAgICAgICBncmVlblRhYmxlW2kgJSAyNTZdID0gcmFtcFtpXSAvIDY1NTM1LjA7Ci0KLSAgICBmb3IgKGk9NTEyOyBpIDwgNzY4OyBpKyspCi0gICAgICAgIGJsdWVUYWJsZVtpICUgMjU2XSA9IHJhbXBbaV0gLyA2NTUzNS4wOwotCi0gICAgaWYgKCBDR0Rpc3BsYXlOb0VyciA9PSBDR1NldERpc3BsYXlUcmFuc2ZlckJ5VGFibGUKLSAgICAgICAgIChkaXNwbGF5X2lkLCB0YWJsZVNpemUsIHJlZFRhYmxlLCBncmVlblRhYmxlLCBibHVlVGFibGUpICkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gLTE7Ci19Ci0KLWludCBRWl9HZXRHYW1tYVJhbXAgKF9USElTLCBVaW50MTYgKnJhbXApIHsKLQotICAgIGNvbnN0IENHVGFibGVDb3VudCB0YWJsZVNpemUgPSAyNTU7Ci0gICAgQ0dHYW1tYVZhbHVlIHJlZFRhYmxlW3RhYmxlU2l6ZV07Ci0gICAgQ0dHYW1tYVZhbHVlIGdyZWVuVGFibGVbdGFibGVTaXplXTsKLSAgICBDR0dhbW1hVmFsdWUgYmx1ZVRhYmxlW3RhYmxlU2l6ZV07Ci0gICAgQ0dUYWJsZUNvdW50IGFjdHVhbDsKLSAgICBpbnQgaTsKLQotICAgIGlmICggQ0dEaXNwbGF5Tm9FcnIgIT0gQ0dHZXREaXNwbGF5VHJhbnNmZXJCeVRhYmxlCi0gICAgICAgICAoZGlzcGxheV9pZCwgdGFibGVTaXplLCByZWRUYWJsZSwgZ3JlZW5UYWJsZSwgYmx1ZVRhYmxlLCAmYWN0dWFsKSB8fAotICAgICAgICAgYWN0dWFsICE9IHRhYmxlU2l6ZSkKLQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBQYWNrIHRhYmxlcyBpbnRvIG9uZSBhcnJheSwgd2l0aCB2YWx1ZXMgZnJvbSAwIHRvIDY1NTM1ICovCi0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgICByYW1wW2ldID0gcmVkVGFibGVbaSAlIDI1Nl0gKiA2NTUzNS4wOwotCi0gICAgZm9yIChpPTI1NjsgaSA8IDUxMjsgaSsrKQotICAgICAgICByYW1wW2ldID0gZ3JlZW5UYWJsZVtpICUgMjU2XSAqIDY1NTM1LjA7Ci0KLSAgICBmb3IgKGk9NTEyOyBpIDwgNzY4OyBpKyspCi0gICAgICAgIHJhbXBbaV0gPSBibHVlVGFibGVbaSAlIDI1Nl0gKiA2NTUzNS4wOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpXTS5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldNLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTYwN2IuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldNLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAzICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotc3RydWN0IFdNY3Vyc29yIHsKLSAgICBOU0N1cnNvciAqbnNjdXJzb3I7Ci19OwotCi12b2lkIFFaX1VwZGF0ZUN1cnNvcihfVEhJUyk7Ci1pbnQgIFFaX0dldFdNSW5mbyAgKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpXTS5tIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldNLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNDIzNGEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldNLm0KKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMyAgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX1F1YXJ0elZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX1F1YXJ0eldNLmgiCi0KLXZvaWQgUVpfRnJlZVdNQ3Vyc29yICAgICAoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpIHsgCi0KLSAgICBpZiAoIGN1cnNvciAhPSBOVUxMICkgewotICAgICAgICBbIGN1cnNvci0+bnNjdXJzb3IgcmVsZWFzZSBdOwotICAgICAgICBmcmVlIChjdXJzb3IpOwotICAgIH0KLX0KLQotV01jdXJzb3IqICAgIFFaX0NyZWF0ZVdNQ3Vyc29yICAgKF9USElTLCBVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KSB7IAotICAgIFdNY3Vyc29yICpjdXJzb3I7Ci0gICAgTlNCaXRtYXBJbWFnZVJlcCAqaW1ncmVwOwotICAgIE5TSW1hZ2UgKmltZzsKLSAgICB1bnNpZ25lZCBjaGFyICpwbGFuZXNbNV07Ci0gICAgaW50IGk7Ci0gICAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7Ci0gICAgCi0gICAgcG9vbCA9IFsgWyBOU0F1dG9yZWxlYXNlUG9vbCBhbGxvYyBdIGluaXQgXTsKLSAgICAKLSAgICAvKiBBbGxvY2F0ZSB0aGUgY3Vyc29yIG1lbW9yeSAqLwotICAgIGN1cnNvciA9IChXTWN1cnNvciAqKVNETF9tYWxsb2Moc2l6ZW9mKFdNY3Vyc29yKSk7Ci0gICAgaWYgKGN1cnNvciA9PSBOVUxMKSBnb3RvIG91dE9mTWVtb3J5OwotICAgIAotICAgIC8qIGNyZWF0ZSB0aGUgaW1hZ2UgcmVwcmVzZW50YXRpb24gYW5kIGdldCB0aGUgcG9pbnRlcnMgdG8gaXRzIHN0b3JhZ2UgKi8KLSAgICBpbWdyZXAgPSBbIFsgWyBOU0JpdG1hcEltYWdlUmVwIGFsbG9jIF0gaW5pdFdpdGhCaXRtYXBEYXRhUGxhbmVzOiBOVUxMIHBpeGVsc1dpZGU6IHcgcGl4ZWxzSGlnaDogaCBiaXRzUGVyU2FtcGxlOiAxIHNhbXBsZXNQZXJQaXhlbDogMiBoYXNBbHBoYTogWUVTIGlzUGxhbmFyOiBZRVMgY29sb3JTcGFjZU5hbWU6IE5TRGV2aWNlQmxhY2tDb2xvclNwYWNlIGJ5dGVzUGVyUm93OiAodys3KS84IGJpdHNQZXJQaXhlbDogMCBdIGF1dG9yZWxlYXNlIF07Ci0gICAgaWYgKGltZ3JlcCA9PSBuaWwpIGdvdG8gb3V0T2ZNZW1vcnk7Ci0gICAgWyBpbWdyZXAgZ2V0Qml0bWFwRGF0YVBsYW5lczogcGxhbmVzIF07Ci0gICAgCi0gICAgLyogY29weSBkYXRhIGFuZCBtYXNrLCBleHRlbmRpbmcgdGhlIG1hc2sgdG8gYWxsIGJsYWNrIHBpeGVscyBiZWNhdXNlIHRoZSBpbnZlcnNpb24gZWZmZWN0IGRvZXNuJ3Qgd29yayB3aXRoIENvY29hJ3MgYWxwaGEtYmxlbmRlZCBjdXJzb3JzICovCi0gICAgZm9yIChpID0gMDsgaSA8ICh3KzcpLzgqaDsgaSsrKSB7Ci0gICAgICAgIHBsYW5lc1swXVtpXSA9IGRhdGFbaV07Ci0gICAgICAgIHBsYW5lc1sxXVtpXSA9IG1hc2tbaV0gfCBkYXRhW2ldOwotICAgIH0KLSAgICAKLSAgICAvKiBjcmVhdGUgaW1hZ2UgYW5kIGN1cnNvciAqLwotICAgIGltZyA9IFsgWyBbIE5TSW1hZ2UgYWxsb2MgXSBpbml0V2l0aFNpemU6IE5TTWFrZVNpemUodywgaCkgXSBhdXRvcmVsZWFzZSBdOwotICAgIGlmIChpbWcgPT0gbmlsKSBnb3RvIG91dE9mTWVtb3J5OwotICAgIFsgaW1nIGFkZFJlcHJlc2VudGF0aW9uOiBpbWdyZXAgXTsKLSAgICBpZiAoc3lzdGVtX3ZlcnNpb24gPCAweDEwMzApIHsgLyogb24gMTAuMiwgY3Vyc29ycyBtdXN0IGJlIDE2KjE2ICovCi0gICAgICAgIGlmICh3ID4gMTYgfHwgaCA+IDE2KSB7IC8qIHRvbyBiaWc6IHNjYWxlIGl0IGRvd24gKi8KLSAgICAgICAgICAgIFsgaW1nIHNldFNjYWxlc1doZW5SZXNpemVkOiBZRVMgXTsKLSAgICAgICAgICAgIGhvdF94ID0gaG90X3gqMTYvdzsKLSAgICAgICAgICAgIGhvdF95ID0gaG90X3kqMTYvaDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsgLyogdG9vIHNtYWxsIChvciBqdXN0IHJpZ2h0KTogZXh0ZW5kIGl0IChmcm9tIHRoZSBib3R0b20gbGVmdCBjb3JuZXIsIHNvIGhvdF95IG11c3QgYmUgYWRqdXN0ZWQpICovCi0gICAgICAgICAgICBob3RfeSArPSAxNiAtIGg7Ci0gICAgICAgIH0KLSAgICAgICAgWyBpbWcgc2V0U2l6ZTogTlNNYWtlU2l6ZSgxNiwgMTYpIF07Ci0gICAgfQotICAgIGN1cnNvci0+bnNjdXJzb3IgPSBbIFsgTlNDdXJzb3IgYWxsb2MgXSBpbml0V2l0aEltYWdlOiBpbWcgaG90U3BvdDogTlNNYWtlUG9pbnQoaG90X3gsIGhvdF95KSBdOwotICAgIGlmIChjdXJzb3ItPm5zY3Vyc29yID09IG5pbCkgZ290byBvdXRPZk1lbW9yeTsKLSAgICAKLSAgICBbIHBvb2wgcmVsZWFzZSBdOwotICAgIHJldHVybihjdXJzb3IpOwotCi1vdXRPZk1lbW9yeToKLSAgICBbIHBvb2wgcmVsZWFzZSBdOwotICAgIGlmIChjdXJzb3IgIT0gTlVMTCkgU0RMX2ZyZWUoY3Vyc29yKTsKLSAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICByZXR1cm4oTlVMTCk7Ci19Ci0KLXZvaWQgUVpfVXBkYXRlQ3Vyc29yIChfVEhJUykgewotICAgIEJPT0wgc3RhdGU7Ci0KLSAgICBpZiAoY3Vyc29yX3Nob3VsZF9iZV92aXNpYmxlIHx8ICEoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUykpIHsKLSAgICAgICAgc3RhdGUgPSBZRVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdGUgPSBOTzsKLSAgICB9Ci0gICAgaWYgKHN0YXRlICE9IGN1cnNvcl92aXNpYmxlKSB7Ci0gICAgICAgIGlmIChzdGF0ZSkgewotICAgICAgICAgICAgWyBOU0N1cnNvciB1bmhpZGUgXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFsgTlNDdXJzb3IgaGlkZSBdOwotICAgICAgICB9Ci0gICAgICAgIGN1cnNvcl92aXNpYmxlID0gc3RhdGU7Ci0gICAgfQotfQotCi1CT09MIFFaX0lzTW91c2VJbldpbmRvdyAoX1RISVMpIHsKLSAgICBpZiAocXpfd2luZG93ID09IG5pbCB8fCAobW9kZV9mbGFncyAmIFNETF9GVUxMU0NSRUVOKSkgcmV0dXJuIFlFUzsgLypmdWxsc2NyZWVuKi8KLSAgICBlbHNlIHsKLSAgICAgICAgTlNQb2ludCBwID0gWyBxel93aW5kb3cgbW91c2VMb2NhdGlvbk91dHNpZGVPZkV2ZW50U3RyZWFtIF07Ci0gICAgICAgIHAueSAtPSAxLjBmOyAvKiBBcHBhcmVudGx5IHkgZ29lcyBmcm9tIDEgdG8gaCwgbm90IGZyb20gMCB0byBoLTEgKGkuZS4gdGhlICJsb2NhdGlvbiBvZiB0aGUgbW91c2UiIHNlZW1zIHRvIGJlIGRlZmluZWQgYXMgInRoZSBsb2NhdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBtb3VzZSBwb2ludGVyJ3MgaG90IHBpeGVsIiAqLwotICAgICAgICByZXR1cm4gTlNQb2ludEluUmVjdChwLCBbIHdpbmRvd192aWV3IGZyYW1lIF0pOwotICAgIH0KLX0KLQotaW50IFFaX1Nob3dXTUN1cnNvciAoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpIHsgCi0KLSAgICBpZiAoIGN1cnNvciA9PSBOVUxMKSB7Ci0gICAgICAgIGlmICggY3Vyc29yX3Nob3VsZF9iZV92aXNpYmxlICkgewotICAgICAgICAgICAgY3Vyc29yX3Nob3VsZF9iZV92aXNpYmxlID0gTk87Ci0gICAgICAgICAgICBRWl9DaGFuZ2VHcmFiU3RhdGUgKHRoaXMsIFFaX0hJREVDVVJTT1IpOwotICAgICAgICB9Ci0gICAgICAgIFFaX1VwZGF0ZUN1cnNvcih0aGlzKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChxel93aW5kb3cgPT1uaWwgfHwgKG1vZGVfZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikpIHsKLSAgICAgICAgICAgIFsgY3Vyc29yLT5uc2N1cnNvciBzZXQgXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFsgcXpfd2luZG93IGludmFsaWRhdGVDdXJzb3JSZWN0c0ZvclZpZXc6IFsgcXpfd2luZG93IGNvbnRlbnRWaWV3IF0gXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICEgY3Vyc29yX3Nob3VsZF9iZV92aXNpYmxlICkgewotICAgICAgICAgICAgY3Vyc29yX3Nob3VsZF9iZV92aXNpYmxlID0gWUVTOwotICAgICAgICAgICAgUVpfQ2hhbmdlR3JhYlN0YXRlICh0aGlzLCBRWl9TSE9XQ1VSU09SKTsKLSAgICAgICAgfQotICAgICAgICBRWl9VcGRhdGVDdXJzb3IodGhpcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gICAgQ29vcmRpbmF0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucywgZm9yIGNvbnZlbmllbmNlCi0gICAgQ29jb2Egc2V0cyB0aGUgb3JpZ2luIGF0IHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93L3NjcmVlbgotICAgIFNETCwgQ29yZUdyYXBoaWNzL1dpbmRvd1NlcnZlciwgYW5kIFF1aWNrRHJhdyB1c2UgdGhlIG9yaWdpbiBhdCB0aGUgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICBUaGUgcm91dGluZXMgd2VyZSB3cml0dGVuIHNvIHRoZXkgY291bGQgYmUgY2FsbGVkIGJlZm9yZSBTZXRWaWRlb01vZGUoKSBoYXMgZmluaXNoZWQ7Ci0gICAgdGhpcyBtaWdodCBoYXZlIGxpbWl0ZWQgdXNlZnVsbmVzcyBhdCB0aGUgbW9tZW50LCBidXQgdGhlIGV4dHJhIGNvc3QgaXMgdHJpdmlhbC4KLSovCi0KLS8qIENvbnZlcnQgQ29jb2Egc2NyZWVuIGNvb3JkaW5hdGUgdG8gQ29jb2Egd2luZG93IGNvb3JkaW5hdGUgKi8KLXZvaWQgUVpfUHJpdmF0ZUdsb2JhbFRvTG9jYWwgKF9USElTLCBOU1BvaW50ICpwKSB7Ci0KLSAgICAqcCA9IFsgcXpfd2luZG93IGNvbnZlcnRTY3JlZW5Ub0Jhc2U6KnAgXTsKLX0KLQotCi0vKiBDb252ZXJ0IENvY29hIHdpbmRvdyBjb29yZGluYXRlIHRvIENvY29hIHNjcmVlbiBjb29yZGluYXRlICovCi12b2lkIFFaX1ByaXZhdGVMb2NhbFRvR2xvYmFsIChfVEhJUywgTlNQb2ludCAqcCkgewotCi0gICAgKnAgPSBbIHF6X3dpbmRvdyBjb252ZXJ0QmFzZVRvU2NyZWVuOipwIF07Ci19Ci0KLS8qIENvbnZlcnQgU0RMIGNvb3JkaW5hdGUgdG8gQ29jb2EgY29vcmRpbmF0ZSAqLwotdm9pZCBRWl9Qcml2YXRlU0RMVG9Db2NvYSAoX1RISVMsIE5TUG9pbnQgKnApIHsKLQotICAgIGlmICggQ0dEaXNwbGF5SXNDYXB0dXJlZCAoZGlzcGxheV9pZCkgKSB7IC8qIGNhcHR1cmUgc2lnbmFscyBmdWxsc2NyZWVuICovCi0gICAgCi0gICAgICAgIHAtPnkgPSBDR0Rpc3BsYXlQaXhlbHNIaWdoIChkaXNwbGF5X2lkKSAtIHAtPnk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgIAotICAgICAgICAqcCA9IFsgd2luZG93X3ZpZXcgY29udmVydFBvaW50OipwIHRvVmlldzogbmlsIF07Ci0gICAgICAgIAotICAgICAgICAvKiBXZSBuZWVkIGEgd29ya2Fyb3VuZCBpbiBPcGVuR0wgbW9kZSAqLwotICAgICAgICBpZiAoIFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCApIHsKLSAgICAgICAgICAgIHAtPnkgPSBbd2luZG93X3ZpZXcgZnJhbWVdLnNpemUuaGVpZ2h0IC0gcC0+eTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogQ29udmVydCBDb2NvYSBjb29yZGluYXRlIHRvIFNETCBjb29yZGluYXRlICovCi12b2lkIFFaX1ByaXZhdGVDb2NvYVRvU0RMIChfVEhJUywgTlNQb2ludCAqcCkgewotCi0gICAgaWYgKCBDR0Rpc3BsYXlJc0NhcHR1cmVkIChkaXNwbGF5X2lkKSApIHsgLyogY2FwdHVyZSBzaWduYWxzIGZ1bGxzY3JlZW4gKi8KLSAgICAKLSAgICAgICAgcC0+eSA9IENHRGlzcGxheVBpeGVsc0hpZ2ggKGRpc3BsYXlfaWQpIC0gcC0+eTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgKnAgPSBbIHdpbmRvd192aWV3IGNvbnZlcnRQb2ludDoqcCBmcm9tVmlldzogbmlsIF07Ci0gICAgICAgIAotICAgICAgICAvKiBXZSBuZWVkIGEgd29ya2Fyb3VuZCBpbiBPcGVuR0wgbW9kZSAqLwotICAgICAgICBpZiAoIFNETF9WaWRlb1N1cmZhY2UgIT0gTlVMTCAmJiAoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfT1BFTkdMKSApIHsKLSAgICAgICAgICAgIHAtPnkgPSBbd2luZG93X3ZpZXcgZnJhbWVdLnNpemUuaGVpZ2h0IC0gcC0+eTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogQ29udmVydCBTREwgY29vcmRpbmF0ZSB0byB3aW5kb3cgc2VydmVyIChDb3JlR3JhcGhpY3MpIGNvb3JkaW5hdGUgKi8KLUNHUG9pbnQgUVpfUHJpdmF0ZVNETFRvQ0cgKF9USElTLCBOU1BvaW50ICpwKSB7Ci0gICAgCi0gICAgQ0dQb2ludCBjZ3A7Ci0gICAgCi0gICAgaWYgKCAhIENHRGlzcGxheUlzQ2FwdHVyZWQgKGRpc3BsYXlfaWQpICkgeyAvKiBub3QgY2FwdHVyZWQgPT4gbm90IGZ1bGxzY3JlZW4gPT4gbG9jYWwgY29vcmQgKi8KLSAgICAKLSAgICAgICAgaW50IGhlaWdodDsKLSAgICAgICAgCi0gICAgICAgIFFaX1ByaXZhdGVTRExUb0NvY29hICh0aGlzLCBwKTsKLSAgICAgICAgUVpfUHJpdmF0ZUxvY2FsVG9HbG9iYWwgKHRoaXMsIHApOwotICAgICAgICAKLSAgICAgICAgaGVpZ2h0ID0gQ0dEaXNwbGF5UGl4ZWxzSGlnaCAoZGlzcGxheV9pZCk7Ci0gICAgICAgIHAtPnkgPSBoZWlnaHQgLSBwLT55OwotICAgIH0KLSAgICAKLSAgICBjZ3AueCA9IHAtPng7Ci0gICAgY2dwLnkgPSBwLT55OwotICAgIAotICAgIHJldHVybiBjZ3A7Ci19Ci0KLSNpZiAwIC8qIERlYWQgY29kZSAqLwotLyogQ29udmVydCB3aW5kb3cgc2VydmVyIChDb3JlR3JhcGhpY3MpIGNvb3JkaW5hdGUgdG8gU0RMIGNvb3JkaW5hdGUgKi8KLXZvaWQgUVpfUHJpdmF0ZUNHVG9TREwgKF9USElTLCBOU1BvaW50ICpwKSB7Ci0gICAgICAgICAgICAKLSAgICBpZiAoICEgQ0dEaXNwbGF5SXNDYXB0dXJlZCAoZGlzcGxheV9pZCkgKSB7IC8qIG5vdCBjYXB0dXJlZCA9PiBub3QgZnVsbHNjcmVlbiA9PiBsb2NhbCBjb29yZCAqLwotICAgIAotICAgICAgICBpbnQgaGVpZ2h0OwotCi0gICAgICAgIC8qIENvbnZlcnQgQ0cgR2xvYmFsIHRvIENvY29hIEdsb2JhbCAqLwotICAgICAgICBoZWlnaHQgPSBDR0Rpc3BsYXlQaXhlbHNIaWdoIChkaXNwbGF5X2lkKTsKLSAgICAgICAgcC0+eSA9IGhlaWdodCAtIHAtPnk7Ci0KLSAgICAgICAgUVpfUHJpdmF0ZUdsb2JhbFRvTG9jYWwgKHRoaXMsIHApOwotICAgICAgICBRWl9Qcml2YXRlQ29jb2FUb1NETCAodGhpcywgcCk7Ci0gICAgfQotfQotI2VuZGlmIC8qIERlYWQgY29kZSAqLwotCi12b2lkICBRWl9Qcml2YXRlV2FycEN1cnNvciAoX1RISVMsIGludCB4LCBpbnQgeSkgewotICAgIAotICAgIE5TUG9pbnQgcDsKLSAgICBDR1BvaW50IGNncDsKLSAgICAKLSAgICBwID0gTlNNYWtlUG9pbnQgKHgsIHkpOwotICAgIGNncCA9IFFaX1ByaXZhdGVTRExUb0NHICh0aGlzLCAmcCk7Ci0gICAgCi0gICAgLyogdGhpcyBpcyB0aGUgbWFnaWMgY2FsbCB0aGF0IGZpeGVzIGN1cnNvciAiZnJlZXppbmciIGFmdGVyIHdhcnAgKi8KLSAgICBDR1NldExvY2FsRXZlbnRzU3VwcHJlc3Npb25JbnRlcnZhbCAoMC4wKTsKLSAgICBDR1dhcnBNb3VzZUN1cnNvclBvc2l0aW9uIChjZ3ApOwotfQotCi12b2lkIFFaX1dhcnBXTUN1cnNvciAoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSkgewotCi0gICAgLyogT25seSBhbGxvdyB3YXJwaW5nIHdoZW4gaW4gZm9yZWdyb3VuZCAqLwotICAgIGlmICggISBbIE5TQXBwIGlzQWN0aXZlIF0gKQotICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAKLSAgICAvKiBEbyB0aGUgYWN0dWFsIHdhcnAgKi8KLSAgICBpZiAoZ3JhYl9zdGF0ZSAhPSBRWl9JTlZJU0lCTEVfR1JBQikgUVpfUHJpdmF0ZVdhcnBDdXJzb3IgKHRoaXMsIHgsIHkpOwotCi0gICAgLyogR2VuZXJhdGUgdGhlIG1vdXNlIG1vdmVkIGV2ZW50ICovCi0gICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbiAoMCwgMCwgeCwgeSk7Ci19Ci0KLXZvaWQgUVpfTW92ZVdNQ3Vyc29yICAgICAoX1RISVMsIGludCB4LCBpbnQgeSkgeyB9Ci12b2lkIFFaX0NoZWNrTW91c2VNb2RlICAgKF9USElTKSB7IH0KLQotdm9pZCBRWl9TZXRDYXB0aW9uICAgIChfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pIHsKLQotICAgIGlmICggcXpfd2luZG93ICE9IG5pbCApIHsKLSAgICAgICAgTlNTdHJpbmcgKnN0cmluZzsKLSAgICAgICAgaWYgKCB0aXRsZSAhPSBOVUxMICkgewotICAgICAgICAgICAgc3RyaW5nID0gWyBbIE5TU3RyaW5nIGFsbG9jIF0gaW5pdFdpdGhVVEY4U3RyaW5nOnRpdGxlIF07Ci0gICAgICAgICAgICBbIHF6X3dpbmRvdyBzZXRUaXRsZTpzdHJpbmcgXTsKLSAgICAgICAgICAgIFsgc3RyaW5nIHJlbGVhc2UgXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGljb24gIT0gTlVMTCApIHsKLSAgICAgICAgICAgIHN0cmluZyA9IFsgWyBOU1N0cmluZyBhbGxvYyBdIGluaXRXaXRoVVRGOFN0cmluZzppY29uIF07Ci0gICAgICAgICAgICBbIHF6X3dpbmRvdyBzZXRNaW5pd2luZG93VGl0bGU6c3RyaW5nIF07Ci0gICAgICAgICAgICBbIHN0cmluZyByZWxlYXNlIF07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgUVpfU2V0V2luZG93UG9zIChfVEhJUywgaW50ICB4LCBpbnQgIHkpCi17Ci0gICAgaWYgKCBxel93aW5kb3cgPT0gbmlsICkgewotICAgICAgICAvL3ByaW50ZiggIiVzKCVkLCVkKTogY2FsbGVkIGZvciBOVUxMIHdpbmRvd1xuIiwgX19GVU5DVElPTl9fLCB4LCB5ICk7IAotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICAKLSAgICBbIHF6X3dpbmRvdyBzZXRGcmFtZVRvcExlZnRQb2ludDpOU01ha2VQb2ludCggeCwgdGhpcy0+aGlkZGVuLT5oZWlnaHQgLSB5ICkgXTsKLSAgICAvL3ByaW50ZiggIiVzKCVkLCVkKTogZG9uZVxuIiwgX19GVU5DVElPTl9fLCB4LCB5ICk7Ci19Ci0KLXZvaWQgIFFaX0dldFdpbmRvd1BvcyhfVEhJUywgaW50ICAqcHgsIGludCAgKnB5KQotewotICAgIE5TUG9pbnQgIHB0OwotICAgIAotICAgICpweCA9ICpweSA9IDA7Ci0gCi0gICAgaWYgKCBxel93aW5kb3cgPT0gTlVMTCApIHsKLSAgICAgICAgLy9wcmludGYoICIlczogY2FsbGVkIG9uIE5VTEwgd2luZG93XG4iLCBfX0ZVTkNUSU9OX18gKTsKLSAgICB9Ci0KLSAgICBpZiAoIHF6X3dpbmRvdyAhPSBuaWwgKSB7Ci0gICAgICAgIE5TUmVjdCAgcmVjdCA9IFsgcXpfd2luZG93IGZyYW1lIF07Ci0gICAgICAgICpweCA9IHJlY3Qub3JpZ2luLng7Ci0gICAgICAgICpweSA9IHRoaXMtPmhpZGRlbi0+aGVpZ2h0IC0gcmVjdC5vcmlnaW4ueSAtIHJlY3Quc2l6ZS5oZWlnaHQ7Ci0gICAgICAgIC8vcHJpbnRmKCAiJXM6IHJldHVybmluZyAoJWQsJWQpXG4iLCBfX0ZVTkNUSU9OX18sICpweCwgKnB5ICk7Ci0gICAgfQotfQotCi0vKiBkZXRlcm1pbmUgaWYgdGhlIHdpbmRvdyBpcyBmdWxseSB2aXNpYmxlIG9uIHRoZSBjdXJyZW50IHNjcmVlbiBjb25maWd1cmF0aW9uICovCi1pbnQgIFFaX0lzV2luZG93VmlzaWJsZShfVEhJUywgaW50ICByZWNlbnRlcikKLXsKLSAgICBpbnQgIHJlc3VsdCA9IDA7Ci0gICAKLSAgICAvL3ByaW50ZiggIi4uLiBlbnRlciAlc1xuIiwgX19GVU5DVElPTl9fICk7Ci0KLSAgICBpZiAoIHF6X3dpbmRvdyAhPSBOVUxMICkgewotICAgICAgICBOU1JlY3QgICAgICAgIGZyYW1lICAgPSBbIHF6X3dpbmRvdyBmcmFtZSBdOyAKLSAgICAgICAgTlNBcnJheSogICAgICBzY3JlZW5zID0gWyBOU1NjcmVlbiBzY3JlZW5zIF07Ci0gICAgICAgIHVuc2lnbmVkIGludCAgY291bnQgICA9IFsgc2NyZWVucyBjb3VudCBdOwotICAgICAgICB1bnNpZ25lZCBpbnQgIG47Ci0gICAgICAgIC8vcHJpbnRmKCAid2luZG93IGZyYW1lICglZCwlZCkgKCVkLCVkKVxuIiwgZnJhbWUub3JpZ2luLngsIGZyYW1lLm9yaWdpbi55LAotICAgICAgICAvLyAgICAgICAgZnJhbWUuc2l6ZS53aWR0aCwgZnJhbWUuc2l6ZS5oZWlnaHQgKTsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKLSAgICAgICAgICAgIE5TU2NyZWVuKiAgc2NyZWVuID0gWyBzY3JlZW5zIG9iamVjdEF0SW5kZXg6IG4gXTsKLSAgICAgICAgICAgIE5TUmVjdCAgICAgdmlzICAgID0gWyBzY3JlZW4gdmlzaWJsZUZyYW1lIF07Ci0gICAKLSAgICAgICAgICAgIC8vcHJpbnRmKCAic2NyZWVuICVkLyVkICBmcmFtZSAoJWQsJWQpICglZCwlZClcbiIsIG4rMSwgY291bnQsCi0gICAgICAgICAgICAvLyAgICAgICAgdmlzLm9yaWdpbi54LCB2aXMub3JpZ2luLnksIHZpcy5zaXplLndpZHRoLCB2aXMuc2l6ZS5oZWlnaHQgKTsKLQotICAgICAgICAgICAgaWYgKGZyYW1lLm9yaWdpbi54ID49IHZpcy5vcmlnaW4ueCAmJiAKLSAgICAgICAgICAgICAgICBmcmFtZS5vcmlnaW4ueCArIGZyYW1lLnNpemUud2lkdGggPD0gdmlzLm9yaWdpbi54ICsgdmlzLnNpemUud2lkdGggJiYKLSAgICAgICAgICAgICAgICBmcmFtZS5vcmlnaW4ueSA+PSB2aXMub3JpZ2luLnkgJiYKLSAgICAgICAgICAgICAgICBmcmFtZS5vcmlnaW4ueSArIGZyYW1lLnNpemUuaGVpZ2h0IDw9IHZpcy5vcmlnaW4ueSArIHZpcy5zaXplLmhlaWdodCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvL3ByaW50ZiAoICIuLi4gZXhpdCAlcywgcmVzdWx0ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0ICk7Ci0gICAgaWYgKCAhcmVzdWx0ICYmIHJlY2VudGVyICkgewotICAgICAgICBbIHF6X3dpbmRvdyBjZW50ZXIgXSA7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBRWl9HZXRNb25pdG9yRFBJKF9USElTLCBpbnQgICp4RHBpLCBpbnQgKnlEcGkpCi17Ci0gICAgLyogRklYTUU6IGhvdyB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbiBmcm9tIENvY29hID8gKi8KLSAgICByZXR1cm4gLTE7Ci19Ci0KLWludCBRWl9HZXRNb25pdG9yUmVjdCAgIChfVEhJUywgU0RMX1JlY3QgICpyZWN0KQotewotICAgIE5TV2luZG93KiAgICAgd2luZG93ID0gcXpfd2luZG93OwotICAgIE5TUmVjdCAgICAgICAgZnJhbWUgICA9IFsgd2luZG93IGZyYW1lIF07Ci0gICAgaW50ICAgICAgICAgICBmeDEgICAgID0gZnJhbWUub3JpZ2luLng7Ci0gICAgaW50ICAgICAgICAgICBmeTEgICAgID0gZnJhbWUub3JpZ2luLnk7Ci0gICAgaW50ICAgICAgICAgICBmeDIgICAgID0gZnJhbWUuc2l6ZS53aWR0aCArIGZ4MTsKLSAgICBpbnQgICAgICAgICAgIGZ5MiAgICAgPSBmcmFtZS5zaXplLmhlaWdodCArIGZ5MTsgCi0gICAgTlNBcnJheSogICAgICBzY3JlZW5zID0gWyBOU1NjcmVlbiBzY3JlZW5zIF07Ci0gICAgdW5zaWduZWQgaW50ICBjb3VudCAgID0gWyBzY3JlZW5zIGNvdW50IF07Ci0gICAgaW50ICAgICAgICAgICBiZXN0U2NyZWVuID0gLTE7Ci0gICAgaW50ICAgICAgICAgICBiZXN0QXJlYSA9IDA7Ci0KLSAgICB1bnNpZ25lZCBpbnQgIG47Ci0KLSAgICAvKiB3ZSBuZWVkIHRvIGNvbXB1dGUgd2hpY2ggc2NyZWVuIGhhcyB0aGUgbW9zdCB3aW5kb3cgcGl4ZWxzICovCi0gICAgZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKLSAgICAgICAgTlNTY3JlZW4qICBzY3JlZW4gPSBbIHNjcmVlbnMgb2JqZWN0QXRJbmRleDogbiBdOwotICAgICAgICBOU1JlY3QgICAgIHZpcyAgICA9IFsgc2NyZWVuIHZpc2libGVGcmFtZSBdOwotICAgICAgICBpbnQgICAgICAgIHZ4MSAgICA9IHZpcy5vcmlnaW4ueDsKLSAgICAgICAgaW50ICAgICAgICB2eTEgICAgPSB2aXMub3JpZ2luLnk7Ci0gICAgICAgIGludCAgICAgICAgdngyICAgID0gdmlzLnNpemUud2lkdGggKyB2eDE7Ci0gICAgICAgIGludCAgICAgICAgdnkyICAgID0gdmlzLnNpemUuaGVpZ2h0ICsgdnkxOwotICAgICAgICBpbnQgICAgICAgIGN4MSwgY3gyLCBjeTEsIGN5MiwgY0FyZWE7Ci0KLSAgICAgICAgaWYgKGZ4MSA+PSB2eDIgfHwgdngxID49IGZ4MiB8fCBmeTEgPj0gdnkyIHx8IHZ5MSA+PSBmeTIpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBjeDEgPSAoZngxIDwgdngxKSA/IHZ4MSA6IGZ4MTsKLSAgICAgICAgY3gyID0gKGZ4MiA+IHZ4MikgPyB2eDIgOiBmeDI7Ci0gICAgICAgIGN5MSA9IChmeTEgPCB2eTEpID8gdnkxIDogZnkxOwotICAgICAgICBjeTIgPSAoZnkyID4gdnkyKSA/IHZ5MiA6IGZ5MjsKLQotICAgICAgICBpZiAoY3gxID49IGN4MiB8fCBjeTEgPj0gY3kyKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgY0FyZWEgPSAoY3gyLWN4MSkqKGN5Mi1jeTEpOwotCi0gICAgICAgIGlmIChiZXN0U2NyZWVuIDwgMCB8fCBjQXJlYSA+IGJlc3RBcmVhKSB7Ci0gICAgICAgICAgICBiZXN0U2NyZWVuID0gbjsKLSAgICAgICAgICAgIGJlc3RBcmVhICAgPSBjQXJlYTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYmVzdFNjcmVlbiA8IDApCi0gICAgICAgIGJlc3RTY3JlZW4gPSAwOwotCi0gICAgewotICAgICAgICBOU1NjcmVlbiogIHNjcmVlbiA9IFsgc2NyZWVucyBvYmplY3RBdEluZGV4OiBiZXN0U2NyZWVuIF07Ci0gICAgICAgIE5TUmVjdCAgICAgdmlzICAgID0gWyBzY3JlZW4gdmlzaWJsZUZyYW1lIF07Ci0KLSAgICAgICAgcmVjdC0+eCA9IHZpcy5vcmlnaW4ueDsKLSAgICAgICAgcmVjdC0+eSA9IHZpcy5vcmlnaW4ueTsKLSAgICAgICAgcmVjdC0+dyA9IHZpcy5zaXplLndpZHRoOwotICAgICAgICByZWN0LT5oID0gdmlzLnNpemUuaGVpZ2h0OyAKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgUVpfU2V0SWNvbiAgICAgICAoX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzaykKLXsKLSAgICBOU0JpdG1hcEltYWdlUmVwICppbWdyZXA7Ci0gICAgTlNJbWFnZSAqaW1nOwotICAgIFNETF9TdXJmYWNlICptZXJnZWRTdXJmYWNlOwotICAgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sOwotICAgIFVpbnQ4ICpwaXhlbHM7Ci0gICAgU0RMX2Jvb2wgaWNvblNyY0FscGhhOwotICAgIFVpbnQ4IGljb25BbHBoYVZhbHVlOwotICAgIGludCBpLCBqLCBtYXNrUGl0Y2gsIGluZGV4OwotICAgIAotICAgIHBvb2wgPSBbIFsgTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2MgXSBpbml0IF07Ci0gICAgCi0gICAgaW1ncmVwID0gWyBbIFsgTlNCaXRtYXBJbWFnZVJlcCBhbGxvYyBdIGluaXRXaXRoQml0bWFwRGF0YVBsYW5lczogTlVMTCBwaXhlbHNXaWRlOiBpY29uLT53IHBpeGVsc0hpZ2g6IGljb24tPmggYml0c1BlclNhbXBsZTogOCBzYW1wbGVzUGVyUGl4ZWw6IDQgaGFzQWxwaGE6IFlFUyBpc1BsYW5hcjogTk8gY29sb3JTcGFjZU5hbWU6IE5TRGV2aWNlUkdCQ29sb3JTcGFjZSBieXRlc1BlclJvdzogNCppY29uLT53IGJpdHNQZXJQaXhlbDogMzIgXSBhdXRvcmVsZWFzZSBdOwotICAgIGlmIChpbWdyZXAgPT0gbmlsKSBnb3RvIGZyZWVQb29sOwotICAgIHBpeGVscyA9IFsgaW1ncmVwIGJpdG1hcERhdGEgXTsKLSAgICBTRExfbWVtc2V0KHBpeGVscywgMCwgNCppY29uLT53Kmljb24tPmgpOyAvKiBtYWtlIHRoZSBiYWNrZ3JvdW5kLCB3aGljaCB3aWxsIHN1cnZpdmUgaW4gY29sb3JrZXllZCBhcmVhcywgY29tcGxldGVseSB0cmFuc3BhcmVudCAqLwotICAgIAotI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KLSNkZWZpbmUgQllURU9SREVSX0RFUEVOREVOVF9SR0JBX01BU0tTIDB4RkYwMDAwMDAsIDB4MDBGRjAwMDAsIDB4MDAwMEZGMDAsIDB4MDAwMDAwRkYKLSNlbHNlCi0jZGVmaW5lIEJZVEVPUkRFUl9ERVBFTkRFTlRfUkdCQV9NQVNLUyAweDAwMDAwMEZGLCAweDAwMDBGRjAwLCAweDAwRkYwMDAwLCAweEZGMDAwMDAwCi0jZW5kaWYKLSAgICBtZXJnZWRTdXJmYWNlID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tKHBpeGVscywgaWNvbi0+dywgaWNvbi0+aCwgMzIsIDQqaWNvbi0+dywgQllURU9SREVSX0RFUEVOREVOVF9SR0JBX01BU0tTKTsKLSAgICBpZiAobWVyZ2VkU3VyZmFjZSA9PSBOVUxMKSBnb3RvIGZyZWVQb29sOwotICAgIAotICAgIC8qIGJsaXQsIHdpdGggdGVtcG9yYXJpbHkgY2xlYXJlZCBTUkNBTFBIQSBmbGFnIGJlY2F1c2Ugd2Ugd2FudCB0byBjb3B5LCBub3QgYWxwaGEtYmxlbmQgKi8KLSAgICBpY29uU3JjQWxwaGEgPSAoKGljb24tPmZsYWdzICYgU0RMX1NSQ0FMUEhBKSAhPSAwKTsKLSAgICBpY29uQWxwaGFWYWx1ZSA9IGljb24tPmZvcm1hdC0+YWxwaGE7Ci0gICAgU0RMX1NldEFscGhhKGljb24sIDAsIDI1NSk7Ci0gICAgU0RMX0JsaXRTdXJmYWNlKGljb24sIE5VTEwsIG1lcmdlZFN1cmZhY2UsIE5VTEwpOwotICAgIGlmIChpY29uU3JjQWxwaGEpIFNETF9TZXRBbHBoYShpY29uLCBTRExfU1JDQUxQSEEsIGljb25BbHBoYVZhbHVlKTsKLSAgICAKLSAgICBTRExfRnJlZVN1cmZhY2UobWVyZ2VkU3VyZmFjZSk7Ci0gICAgCi0gICAgLyogYXBwbHkgbWFzaywgc291cmNlIGFscGhhLCBhbmQgcHJlbXVsdGlwbHkgY29sb3IgdmFsdWVzIGJ5IGFscGhhICovCi0gICAgbWFza1BpdGNoID0gKGljb24tPncrNykvODsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaWNvbi0+aDsgaSsrKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBpY29uLT53OyBqKyspIHsKLSAgICAgICAgICAgIGluZGV4ID0gaSo0Kmljb24tPncgKyBqKjQ7Ci0gICAgICAgICAgICBpZiAoIShtYXNrW2kqbWFza1BpdGNoICsgai84XSAmICgxMjggPj4gaiU4KSkpIHsKLSAgICAgICAgICAgICAgICBwaXhlbHNbaW5kZXggKyAzXSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaWNvblNyY0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpY29uLT5mb3JtYXQtPkFtYXNrID09IDApIHBpeGVsc1tpbmRleCArIDNdID0gaWNvbi0+Zm9ybWF0LT5hbHBoYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsc1tpbmRleCArIDNdID0gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwaXhlbHNbaW5kZXggKyAzXSA8IDI1NSkgewotICAgICAgICAgICAgICAgIHBpeGVsc1tpbmRleCArIDBdID0gKFVpbnQxNilwaXhlbHNbaW5kZXggKyAwXSpwaXhlbHNbaW5kZXggKyAzXS8yNTU7Ci0gICAgICAgICAgICAgICAgcGl4ZWxzW2luZGV4ICsgMV0gPSAoVWludDE2KXBpeGVsc1tpbmRleCArIDFdKnBpeGVsc1tpbmRleCArIDNdLzI1NTsKLSAgICAgICAgICAgICAgICBwaXhlbHNbaW5kZXggKyAyXSA9IChVaW50MTYpcGl4ZWxzW2luZGV4ICsgMl0qcGl4ZWxzW2luZGV4ICsgM10vMjU1OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGltZyA9IFsgWyBbIE5TSW1hZ2UgYWxsb2MgXSBpbml0V2l0aFNpemU6IE5TTWFrZVNpemUoaWNvbi0+dywgaWNvbi0+aCkgXSBhdXRvcmVsZWFzZSBdOwotICAgIGlmIChpbWcgPT0gbmlsKSBnb3RvIGZyZWVQb29sOwotICAgIFsgaW1nIGFkZFJlcHJlc2VudGF0aW9uOiBpbWdyZXAgXTsKLSAgICBbIE5TQXBwIHNldEFwcGxpY2F0aW9uSWNvbkltYWdlOmltZyBdOwotICAgIAotZnJlZVBvb2w6Ci0gICAgWyBwb29sIHJlbGVhc2UgXTsKLX0KLQotaW50ICBRWl9JY29uaWZ5V2luZG93IChfVEhJUykgeyAKLQotICAgIGlmICggISBbIHF6X3dpbmRvdyBpc01pbmlhdHVyaXplZCBdICkgewotICAgICAgICBbIHF6X3dpbmRvdyBtaW5pYXR1cml6ZTpuaWwgXTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBTRExfU2V0RXJyb3IgKCJ3aW5kb3cgYWxyZWFkeSBpY29uaWZpZWQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0KLWludCAgUVpfR2V0V01JbmZvICAoX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pIHsgCi0gICAgaW5mby0+bnNXaW5kb3dQdHIgPSBxel93aW5kb3c7Ci0gICAgcmV0dXJuIDA7IAotfQotCi12b2lkIFFaX0NoYW5nZUdyYWJTdGF0ZSAoX1RISVMsIGludCBhY3Rpb24pIHsKLQotICAgIC8qIAotICAgICAgICBGaWd1cmUgb3V0IHdoYXQgdGhlIG5leHQgc3RhdGUgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBhY3Rpb24uCi0gICAgICAgIElnbm9yZSBhY3Rpb25zIHRoYXQgY2FuJ3QgY2hhbmdlIHRoZSBjdXJyZW50IHN0YXRlLgotICAgICovCi0gICAgaWYgKCBncmFiX3N0YXRlID09IFFaX1VOR1JBQkJFRCApIHsKLSAgICAgICAgaWYgKCBhY3Rpb24gPT0gUVpfRU5BQkxFX0dSQUIgKSB7Ci0gICAgICAgICAgICBpZiAoIGN1cnNvcl9zaG91bGRfYmVfdmlzaWJsZSApCi0gICAgICAgICAgICAgICAgZ3JhYl9zdGF0ZSA9IFFaX1ZJU0lCTEVfR1JBQjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBncmFiX3N0YXRlID0gUVpfSU5WSVNJQkxFX0dSQUI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIGdyYWJfc3RhdGUgPT0gUVpfVklTSUJMRV9HUkFCICkgewotICAgICAgICBpZiAoIGFjdGlvbiA9PSBRWl9ESVNBQkxFX0dSQUIgKQotICAgICAgICAgICAgZ3JhYl9zdGF0ZSA9IFFaX1VOR1JBQkJFRDsKLSAgICAgICAgZWxzZSBpZiAoIGFjdGlvbiA9PSBRWl9ISURFQ1VSU09SICkKLSAgICAgICAgICAgIGdyYWJfc3RhdGUgPSBRWl9JTlZJU0lCTEVfR1JBQjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFzc2VydCggZ3JhYl9zdGF0ZSA9PSBRWl9JTlZJU0lCTEVfR1JBQiApOwotICAgICAgICAKLSAgICAgICAgaWYgKCBhY3Rpb24gPT0gUVpfRElTQUJMRV9HUkFCICkKLSAgICAgICAgICAgIGdyYWJfc3RhdGUgPSBRWl9VTkdSQUJCRUQ7Ci0gICAgICAgIGVsc2UgaWYgKCBhY3Rpb24gPT0gUVpfU0hPV0NVUlNPUiApCi0gICAgICAgICAgICBncmFiX3N0YXRlID0gUVpfVklTSUJMRV9HUkFCOwotICAgIH0KLSAgICAKLSAgICAvKiBub3cgYXBwbHkgdGhlIG5ldyBzdGF0ZSAqLwotICAgIGlmIChncmFiX3N0YXRlID09IFFaX1VOR1JBQkJFRCkgewotICAgIAotICAgICAgICBDR0Fzc29jaWF0ZU1vdXNlQW5kTW91c2VDdXJzb3JQb3NpdGlvbiAoMSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGdyYWJfc3RhdGUgPT0gUVpfVklTSUJMRV9HUkFCKSB7Ci0gICAgCi0gICAgICAgIENHQXNzb2NpYXRlTW91c2VBbmRNb3VzZUN1cnNvclBvc2l0aW9uICgxKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFzc2VydCggZ3JhYl9zdGF0ZSA9PSBRWl9JTlZJU0lCTEVfR1JBQiApOwotCi0gICAgICAgIFFaX1ByaXZhdGVXYXJwQ3Vyc29yICh0aGlzLCBTRExfVmlkZW9TdXJmYWNlLT53IC8gMiwgU0RMX1ZpZGVvU3VyZmFjZS0+aCAvIDIpOwotICAgICAgICBDR0Fzc29jaWF0ZU1vdXNlQW5kTW91c2VDdXJzb3JQb3NpdGlvbiAoMCk7Ci0gICAgfQotfQotCi1TRExfR3JhYk1vZGUgUVpfR3JhYklucHV0IChfVEhJUywgU0RMX0dyYWJNb2RlIGdyYWJfbW9kZSkgewotCi0gICAgaW50IGRvR3JhYiA9IGdyYWJfbW9kZSAmIFNETF9HUkFCX09OOwotICAgIC8qaW50IGZ1bGxzY3JlZW4gPSBncmFiX21vZGUgJiBTRExfR1JBQl9GVUxMU0NSRUVOOyovCi0KLSAgICBpZiAoIHRoaXMtPnNjcmVlbiA9PSBOVUxMICkgewotICAgICAgICBTRExfU2V0RXJyb3IgKCJRWl9HcmFiSW5wdXQ6IHNjcmVlbiBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybiBTRExfR1JBQl9PRkY7Ci0gICAgfQotICAgICAgICAKLSAgICBpZiAoICEgdmlkZW9fc2V0ICkgewotICAgICAgICAvKlNETF9TZXRFcnJvciAoIlFaX0dyYWJJbnB1dDogdmlkZW8gaXMgbm90IHNldCwgZ3JhYiB3aWxsIHRha2UgZWZmZWN0IG9uIG1vZGUgc3dpdGNoIik7ICovCi0gICAgICAgIGN1cnJlbnRfZ3JhYl9tb2RlID0gZ3JhYl9tb2RlOwotICAgICAgICByZXR1cm4gZ3JhYl9tb2RlOyAgICAgICAvKiBXaWxsIGJlIHNldCBsYXRlciBvbiBtb2RlIHN3aXRjaCAqLwotICAgIH0KLQotICAgIGlmICggZ3JhYl9tb2RlICE9IFNETF9HUkFCX1FVRVJZICkgewotICAgICAgICBpZiAoIGRvR3JhYiApCi0gICAgICAgICAgICBRWl9DaGFuZ2VHcmFiU3RhdGUgKHRoaXMsIFFaX0VOQUJMRV9HUkFCKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgUVpfQ2hhbmdlR3JhYlN0YXRlICh0aGlzLCBRWl9ESVNBQkxFX0dSQUIpOwotICAgICAgICAKLSAgICAgICAgY3VycmVudF9ncmFiX21vZGUgPSBkb0dyYWIgPyBTRExfR1JBQl9PTiA6IFNETF9HUkFCX09GRjsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3VycmVudF9ncmFiX21vZGU7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6V2luZG93LmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6V2luZG93LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZmRlYzQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldpbmRvdy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMyAgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBTdWJjbGFzcyBvZiBOU1dpbmRvdyB0byBmaXggZ2VuaWUgZWZmZWN0IGFuZCBzdXBwb3J0IHJlc2l6ZSBldmVudHMgICovCi1AaW50ZXJmYWNlIFNETF9RdWFydHpXaW5kb3cgOiBOU1dpbmRvdwotLSAodm9pZCltaW5pYXR1cml6ZTooaWQpc2VuZGVyOwotLSAodm9pZClkaXNwbGF5OwotLSAodm9pZClzZXRGcmFtZTooTlNSZWN0KWZyYW1lUmVjdCBkaXNwbGF5OihCT09MKWZsYWc7Ci0tICh2b2lkKWFwcERpZEhpZGU6KE5TTm90aWZpY2F0aW9uKilub3RlOwotLSAodm9pZClhcHBXaWxsVW5oaWRlOihOU05vdGlmaWNhdGlvbiopbm90ZTsKLS0gKHZvaWQpYXBwRGlkVW5oaWRlOihOU05vdGlmaWNhdGlvbiopbm90ZTsKLS0gKGlkKWluaXRXaXRoQ29udGVudFJlY3Q6KE5TUmVjdCljb250ZW50UmVjdCBzdHlsZU1hc2s6KHVuc2lnbmVkIGludClzdHlsZU1hc2sgYmFja2luZzooTlNCYWNraW5nU3RvcmVUeXBlKWJhY2tpbmdUeXBlIGRlZmVyOihCT09MKWZsYWc7Ci1AZW5kCi0KLS8qIERlbGVnYXRlIGZvciBvdXIgTlNXaW5kb3cgdG8gc2VuZCBTRExRdWl0KCkgb24gY2xvc2UgKi8KLUBpbnRlcmZhY2UgU0RMX1F1YXJ0eldpbmRvd0RlbGVnYXRlIDogTlNPYmplY3QKLS0gKEJPT0wpd2luZG93U2hvdWxkQ2xvc2U6KGlkKXNlbmRlcjsKLUBlbmQKLQotLyogU3ViY2xhc3Mgb2YgTlNWaWV3IHRvIHNldCBjdXJzb3IgcmVjdGFuZ2xlICovCi1AaW50ZXJmYWNlIFNETF9RdWFydHpWaWV3IDogTlNWaWV3Ci0tICh2b2lkKXJlc2V0Q3Vyc29yUmVjdHM7Ci1AZW5kCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6V2luZG93Lm0gYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6V2luZG93Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NmY5YTcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldpbmRvdy5tCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgIFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9RdWFydHpWaWRlby5oIgotI2luY2x1ZGUgIlNETF9RdWFydHpXTS5oIgotI2luY2x1ZGUgIlNETF9RdWFydHpXaW5kb3cuaCIKLQotLyoKLSAgICBUaGlzIGZ1bmN0aW9uIG1ha2VzIHRoZSAqU0RMIHJlZ2lvbiogb2YgdGhlIHdpbmRvdyAxMDAlIG9wYXF1ZS4gCi0gICAgVGhlIGdlbmllIGVmZmVjdCB1c2VzIHRoZSBhbHBoYSBjb21wb25lbnQuIE90aGVyd2lzZSwKLSAgICBpdCBkb2Vzbid0IHNlZW0gdG8gbWF0dGVyIHdoYXQgdmFsdWUgaXQgaGFzLgotKi8KLXN0YXRpYyB2b2lkIFFaX1NldFBvcnRBbHBoYU9wYXF1ZSAoKSB7Ci0gICAgCi0gICAgU0RMX1N1cmZhY2UgKnN1cmZhY2UgPSBjdXJyZW50X3ZpZGVvLT5zY3JlZW47Ci0gICAgaW50IGJwcDsKLSAgICAKLSAgICBicHAgPSBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKLSAgICAKLSAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgCi0gICAgICAgIFVpbnQzMiAgICAqcGl4ZWxzID0gKFVpbnQzMiopIHN1cmZhY2UtPnBpeGVsczsKLSAgICAgICAgVWludDMyICAgIHJvd1BpeGVscyA9IHN1cmZhY2UtPnBpdGNoIC8gNDsKLSAgICAgICAgVWludDMyICAgIGksIGo7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3VyZmFjZS0+aDsgaSsrKQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN1cmZhY2UtPnc7IGorKykgewotICAgICAgICAKLSAgICAgICAgICAgICAgICBwaXhlbHNbIChpICogcm93UGl4ZWxzKSArIGogXSB8PSAweEZGMDAwMDAwOwotICAgICAgICAgICAgfQotICAgIH0KLX0KLQotQGltcGxlbWVudGF0aW9uIFNETF9RdWFydHpXaW5kb3cKLQotLyogd2Ugb3ZlcnJpZGUgdGhlc2UgbWV0aG9kcyB0byBmaXggdGhlIG1pbmlhdHVyaXplIGFuaW1hdGlvbi9kb2NrIGljb24gYnVnICovCi0tICh2b2lkKW1pbmlhdHVyaXplOihpZClzZW5kZXIKLXsKLSAgICBpZiAoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfT1BFTkdMKSB7Ci0gICAgCi0gICAgICAgIC8qIAotICAgICAgICAgICAgRnV0dXJlOiBHcmFiIGZyYW1lYnVmZmVyIGFuZCBwdXQgaW50byBOU0ltYWdlCi0gICAgICAgICAgICBbIHF6X3dpbmRvdyBzZXRNaW5pd2luZG93SW1hZ2U6aW1hZ2UgXTsKLSAgICAgICAgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIAotICAgICAgICAvKiBtYWtlIHRoZSBhbHBoYSBjaGFubmVsIG9wYXF1ZSBzbyBhbmltIHdvbid0IGhhdmUgaG9sZXMgaW4gaXQgKi8KLSAgICAgICAgUVpfU2V0UG9ydEFscGhhT3BhcXVlICgpOwotICAgIH0KLSAgICAKLSAgICAvKiB3aW5kb3cgaXMgaGlkZGVuIG5vdyAqLwotICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlICgwLCBTRExfQVBQQUNUSVZFKTsKLSAgICAKLSAgICBbIHN1cGVyIG1pbmlhdHVyaXplOnNlbmRlciBdOwotfQotCi0tICh2b2lkKWRpc3BsYXkKLXsgICAgCi0gICAgLyogCi0gICAgICAgIFRoaXMgbWV0aG9kIGZpcmVzIGp1c3QgYmVmb3JlIHRoZSB3aW5kb3cgZGVtaW5hdHVyaXplcyBmcm9tIHRoZSBEb2NrLgotICAgICAgICAKLSAgICAgICAgV2UnbGwgc2F2ZSB0aGUgY3VycmVudCB2aXNpYmxlIHN1cmZhY2UsIGxldCB0aGUgd2luZG93IG1hbmFnZXIgcmVkcmF3IGFueQotICAgICAgICBVSSBlbGVtZW50cywgYW5kIHJlc3RvcmUgdGhlIFNETCBzdXJmYWNlLiBUaGlzIHdheSwgbm8gZXhwb3NlIGV2ZW50IAotICAgICAgICBpcyByZXF1aXJlZCwgYW5kIHRoZSBkZW1pbmlhdHVyaXplIHdvcmtzIHBlcmZlY3RseS4KLSAgICAqLwotICAgICBTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSAoU0RMX1ZpZGVvRGV2aWNlKiljdXJyZW50X3ZpZGVvOwotICAgIAotICAgIC8qIG1ha2Ugc3VyZSBwaXhlbHMgYXJlIGZ1bGx5IG9wYXF1ZSAqLwotICAgIGlmICghICggU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfT1BFTkdMICkgKQotICAgICAgICBRWl9TZXRQb3J0QWxwaGFPcGFxdWUgKCk7Ci0gICAgCi0gICAgLyogc2F2ZSBjdXJyZW50IHZpc2libGUgU0RMIHN1cmZhY2UgKi8KLSAgICBbIHNlbGYgY2FjaGVJbWFnZUluUmVjdDpbIHdpbmRvd192aWV3IGZyYW1lIF0gXTsKLSAgICAKLSAgICAvKiBsZXQgdGhlIHdpbmRvdyBtYW5hZ2VyIHJlZHJhdyBjb250cm9scywgYm9yZGVyLCBldGMgKi8KLSAgICBbIHN1cGVyIGRpc3BsYXkgXTsKLSAgICAKLSAgICAvKiByZXN0b3JlIHZpc2libGUgU0RMIHN1cmZhY2UgKi8KLSAgICBbIHNlbGYgcmVzdG9yZUNhY2hlZEltYWdlIF07Ci0gICAgCi0gICAgLyogd2luZG93IGlzIHZpc2libGUgYWdhaW4gKi8KLSAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMSwgU0RMX0FQUEFDVElWRSk7Ci19Ci0KLS0gKHZvaWQpc2V0RnJhbWU6KE5TUmVjdClmcmFtZVJlY3QgZGlzcGxheTooQk9PTClmbGFnCi17Ci0KLSAgICAvKgotICAgICAgICBJZiB0aGUgdmlkZW8gc3VyZmFjZSBpcyBOVUxMLCB0aGlzIG9yaWdpbmF0ZWQgZnJvbSBRWl9TZXRWaWRlb01vZGUsCi0gICAgICAgIHNvIGRvbid0IHNlbmQgdGhlIHJlc2l6ZSBldmVudC4gCi0gICAgKi8KLSAgICBTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSAoU0RMX1ZpZGVvRGV2aWNlKiljdXJyZW50X3ZpZGVvOwotICAgIAotICAgIGlmICh0aGlzICYmIFNETF9WaWRlb1N1cmZhY2UgPT0gTlVMTCkgewotCi0gICAgICAgIFsgc3VwZXIgc2V0RnJhbWU6ZnJhbWVSZWN0IGRpc3BsYXk6ZmxhZyBdOwotICAgIH0KLSAgICBlbHNlIGlmICh0aGlzICYmIHF6X3dpbmRvdykgewotCi0gICAgICAgIE5TUmVjdCBuZXdWaWV3RnJhbWU7Ci0gICAgICAgIAotICAgICAgICBbIHN1cGVyIHNldEZyYW1lOmZyYW1lUmVjdCBkaXNwbGF5OmZsYWcgXTsKLSAgICAgICAgCi0gICAgICAgIG5ld1ZpZXdGcmFtZSA9IFsgd2luZG93X3ZpZXcgZnJhbWUgXTsKLSAgICAgICAgCi0gICAgICAgIFNETF9Qcml2YXRlUmVzaXplIChuZXdWaWV3RnJhbWUuc2l6ZS53aWR0aCwgbmV3Vmlld0ZyYW1lLnNpemUuaGVpZ2h0KTsKLQotICAgICAgICAvKiBJZiBub3QgT3BlbkdMLCB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgcGl4ZWxzIGFuZCBwaXRjaCAqLwotICAgICAgICBpZiAoICEgKCBTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9PUEVOR0wgKSApIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ0dyYWZQdHIgdGhlUG9ydCA9IFsgd2luZG93X3ZpZXcgcWRQb3J0IF07Ci0gICAgICAgICAgICBMb2NrUG9ydEJpdHMgKCB0aGVQb3J0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNETF9WaWRlb1N1cmZhY2UtPnBpeGVscyA9IEdldFBpeEJhc2VBZGRyICggR2V0UG9ydFBpeE1hcCAoIHRoZVBvcnQgKSApOwotICAgICAgICAgICAgU0RMX1ZpZGVvU3VyZmFjZS0+cGl0Y2ggID0gR2V0UGl4Um93Qnl0ZXMgKCBHZXRQb3J0UGl4TWFwICggdGhlUG9ydCApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIAotICAgICAgICAgICAgICAgIFNETF9WaWRlb1N1cmZhY2UtPnBpeGVscyBub3cgcG9pbnRzIHRvIHRoZSB3aW5kb3cncyBwaXhlbHMKLSAgICAgICAgICAgICAgICBXZSB3YW50IGl0IHRvIHBvaW50IHRvIHRoZSAqdmlldydzKiBwaXhlbHMgCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICBpbnQgdk9mZnNldCA9IFsgcXpfd2luZG93IGZyYW1lIF0uc2l6ZS5oZWlnaHQgLSAKLSAgICAgICAgICAgICAgICAgICAgbmV3Vmlld0ZyYW1lLnNpemUuaGVpZ2h0IC0gbmV3Vmlld0ZyYW1lLm9yaWdpbi55OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCBoT2Zmc2V0ID0gbmV3Vmlld0ZyYW1lLm9yaWdpbi54OwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU0RMX1ZpZGVvU3VyZmFjZS0+cGl4ZWxzID0gKFVpbnQ4ICopU0RMX1ZpZGVvU3VyZmFjZS0+cGl4ZWxzICsgKHZPZmZzZXQgKiBTRExfVmlkZW9TdXJmYWNlLT5waXRjaCkgKyBoT2Zmc2V0ICogKGRldmljZV9icHAvOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFVubG9ja1BvcnRCaXRzICggdGhlUG9ydCApOwotICAgICAgICB9Ci0gICAgfQotfQotCi0tICh2b2lkKWFwcERpZEhpZGU6KE5TTm90aWZpY2F0aW9uKilub3RlCi17Ci0gICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDAsIFNETF9BUFBBQ1RJVkUpOwotfQotCi0tICh2b2lkKWFwcFdpbGxVbmhpZGU6KE5TTm90aWZpY2F0aW9uKilub3RlCi17Ci0gICAgU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gKFNETF9WaWRlb0RldmljZSopY3VycmVudF92aWRlbzsKLSAgICAKLSAgICBpZiAoIHRoaXMgKSB7Ci0gICAgCi0gICAgICAgIC8qIG1ha2Ugc3VyZSBwaXhlbHMgYXJlIGZ1bGx5IG9wYXF1ZSAqLwotICAgICAgICBpZiAoISAoIFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCApICkKLSAgICAgICAgICAgIFFaX1NldFBvcnRBbHBoYU9wYXF1ZSAoKTsKLSAgICAgICAgICAKLSAgICAgICAgLyogc2F2ZSBjdXJyZW50IHZpc2libGUgU0RMIHN1cmZhY2UgKi8KLSAgICAgICAgWyBzZWxmIGNhY2hlSW1hZ2VJblJlY3Q6WyB3aW5kb3dfdmlldyBmcmFtZSBdIF07Ci0gICAgfQotfQotCi0tICh2b2lkKWFwcERpZFVuaGlkZTooTlNOb3RpZmljYXRpb24qKW5vdGUKLXsKLSAgICAvKiByZXN0b3JlIGNhY2hlZCBpbWFnZSwgc2luY2UgaXQgbWF5IG5vdCBiZSBjdXJyZW50LCBwb3N0IGV4cG9zZSBldmVudCB0b28gKi8KLSAgICBbIHNlbGYgcmVzdG9yZUNhY2hlZEltYWdlIF07Ci0gICAgCi0gICAgLypTRExfUHJpdmF0ZUV4cG9zZSAoKTsqLwotICAgIAotICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlICgxLCBTRExfQVBQQUNUSVZFKTsKLX0KLQotLSAoaWQpaW5pdFdpdGhDb250ZW50UmVjdDooTlNSZWN0KWNvbnRlbnRSZWN0IHN0eWxlTWFzazoodW5zaWduZWQgaW50KXN0eWxlTWFzayBiYWNraW5nOihOU0JhY2tpbmdTdG9yZVR5cGUpYmFja2luZ1R5cGUgZGVmZXI6KEJPT0wpZmxhZwotewotICAgIC8qIE1ha2Ugb3VyIHdpbmRvdyBzdWJjbGFzcyByZWNlaXZlIHRoZXNlIGFwcGxpY2F0aW9uIG5vdGlmaWNhdGlvbnMgKi8KLSAgICBbIFsgTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlciBdIGFkZE9ic2VydmVyOnNlbGYKLSAgICAgICAgc2VsZWN0b3I6QHNlbGVjdG9yKGFwcERpZEhpZGU6KSBuYW1lOk5TQXBwbGljYXRpb25EaWRIaWRlTm90aWZpY2F0aW9uIG9iamVjdDpOU0FwcCBdOwotICAgIAotICAgIFsgWyBOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyIF0gYWRkT2JzZXJ2ZXI6c2VsZgotICAgICAgICBzZWxlY3RvcjpAc2VsZWN0b3IoYXBwRGlkVW5oaWRlOikgbmFtZTpOU0FwcGxpY2F0aW9uRGlkVW5oaWRlTm90aWZpY2F0aW9uIG9iamVjdDpOU0FwcCBdOwotICAgCi0gICAgWyBbIE5TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXIgXSBhZGRPYnNlcnZlcjpzZWxmCi0gICAgICAgIHNlbGVjdG9yOkBzZWxlY3RvcihhcHBXaWxsVW5oaWRlOikgbmFtZTpOU0FwcGxpY2F0aW9uV2lsbFVuaGlkZU5vdGlmaWNhdGlvbiBvYmplY3Q6TlNBcHAgXTsKLSAgICAgICAgCi0gICAgcmV0dXJuIFsgc3VwZXIgaW5pdFdpdGhDb250ZW50UmVjdDpjb250ZW50UmVjdCBzdHlsZU1hc2s6c3R5bGVNYXNrIGJhY2tpbmc6YmFja2luZ1R5cGUgZGVmZXI6ZmxhZyBdOwotfQotCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBTRExfUXVhcnR6V2luZG93RGVsZWdhdGUKLS0gKEJPT0wpd2luZG93U2hvdWxkQ2xvc2U6KGlkKXNlbmRlcgotewotICAgIFNETF9Qcml2YXRlUXVpdCgpOwotICAgIHJldHVybiBOTzsKLX0KLQotLSAodm9pZCl3aW5kb3dEaWRCZWNvbWVLZXk6KE5TTm90aWZpY2F0aW9uICopYU5vdGlmaWNhdGlvbgotewotICAgIFFaX0RvQWN0aXZhdGUgKGN1cnJlbnRfdmlkZW8pOwotfQotCi0tICh2b2lkKXdpbmRvd0RpZFJlc2lnbktleTooTlNOb3RpZmljYXRpb24gKilhTm90aWZpY2F0aW9uCi17Ci0gICAgUVpfRG9EZWFjdGl2YXRlIChjdXJyZW50X3ZpZGVvKTsKLX0KLQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gU0RMX1F1YXJ0elZpZXcKLQotLSAodm9pZClyZXNldEN1cnNvclJlY3RzCi17Ci0gICAgU0RMX0N1cnNvciAqc2RsYyA9IFNETF9HZXRDdXJzb3IoKTsKLSAgICBpZiAoc2RsYyAhPSBOVUxMICYmIHNkbGMtPndtX2N1cnNvciAhPSBOVUxMKSB7Ci0gICAgICAgIFtzZWxmIGFkZEN1cnNvclJlY3Q6IFtzZWxmIHZpc2libGVSZWN0XSBjdXJzb3I6IHNkbGMtPndtX2N1cnNvci0+bnNjdXJzb3JdOwotICAgIH0KLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0ellVVi5tIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0ellVVi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2IzZDk0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpZVVYubQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAzICBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfUXVhcnR6VmlkZW8uaCIKLSNpbmNsdWRlICJTRExfUXVhcnR6V2luZG93LmgiCi0jaW5jbHVkZSAiLi4vU0RMX3l1dmZ1bmNzLmgiCi0KLQotI2RlZmluZSB5dXZfaWRoICh0aGlzLT5oaWRkZW4tPnl1dl9pZGgpCi0jZGVmaW5lIHl1dl9tYXRyaXggKHRoaXMtPmhpZGRlbi0+eXV2X21hdHJpeCkKLSNkZWZpbmUgeXV2X2NvZGVjICh0aGlzLT5oaWRkZW4tPnl1dl9jb2RlYykKLSNkZWZpbmUgeXV2X3NlcSAodGhpcy0+aGlkZGVuLT55dXZfc2VxKQotI2RlZmluZSB5dXZfcGl4bWFwICh0aGlzLT5oaWRkZW4tPnl1dl9waXhtYXApCi0jZGVmaW5lIHl1dl9kYXRhICh0aGlzLT5oaWRkZW4tPnl1dl9kYXRhKQotI2RlZmluZSB5dXZfd2lkdGggKHRoaXMtPmhpZGRlbi0+eXV2X3dpZHRoKQotI2RlZmluZSB5dXZfaGVpZ2h0ICh0aGlzLT5oaWRkZW4tPnl1dl9oZWlnaHQpCi0jZGVmaW5lIHl1dl9wb3J0ICh0aGlzLT5oaWRkZW4tPnl1dl9wb3J0KQotCi0KLXN0YXRpYyBpbnQgUVpfTG9ja1lVViAoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KSB7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgUVpfVW5sb2NrWVVWIChfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpIHsKLQotICAgIDsKLX0KLQotc3RhdGljIGludCBRWl9EaXNwbGF5WVVWIChfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXksIFNETF9SZWN0ICpzcmMsIFNETF9SZWN0ICpkc3QpIHsKLQotICAgIE9TRXJyIGVycjsKLSAgICBDb2RlY0ZsYWdzIGZsYWdzOwotCi0gICAgaWYgKGRzdC0+eCAhPSAwIHx8IGRzdC0+eSAhPSAwKSB7Ci0KLSAgICAgICAgU0RMX1NldEVycm9yICgiTmVlZCBhIGRzdCBhdCAoMCwwKSIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKGRzdC0+dyAhPSB5dXZfd2lkdGggfHwgZHN0LT5oICE9IHl1dl9oZWlnaHQpIHsKLQotICAgICAgICBGaXhlZCBzY2FsZV94LCBzY2FsZV95OwotCi0gICAgICAgIHNjYWxlX3ggPSBGaXhEaXYgKCBMb25nMkZpeCAoZHN0LT53KSwgTG9uZzJGaXggKG92ZXJsYXktPncpICk7Ci0gICAgICAgIHNjYWxlX3kgPSBGaXhEaXYgKCBMb25nMkZpeCAoZHN0LT5oKSwgTG9uZzJGaXggKG92ZXJsYXktPmgpICk7Ci0KLSAgICAgICAgU2V0SWRlbnRpdHlNYXRyaXggKHl1dl9tYXRyaXgpOwotICAgICAgICBTY2FsZU1hdHJpeCAoeXV2X21hdHJpeCwgc2NhbGVfeCwgc2NhbGVfeSwgTG9uZzJGaXggKDApLCBMb25nMkZpeCAoMCkpOwotCi0gICAgICAgIFNldERTZXF1ZW5jZU1hdHJpeCAoeXV2X3NlcSwgeXV2X21hdHJpeCk7Ci0KLSAgICAgICAgeXV2X3dpZHRoID0gZHN0LT53OwotICAgICAgICB5dXZfaGVpZ2h0ID0gZHN0LT5oOwotICAgIH0KLQotICAgIGlmKCAoIGVyciA9IERlY29tcHJlc3NTZXF1ZW5jZUZyYW1lUygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X3NlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKXl1dl9waXhtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoUGxhbmFyUGl4bWFwSW5mb1lVVjQyMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjRmxhZ1VzZUltYWdlQnVmZmVyLCAmZmxhZ3MsIG5pbCApICE9IG5vRXJyICkgKQotICAgIHsKLSAgICAgICAgU0RMX1NldEVycm9yICgiRGVjb21wcmVzc1NlcXVlbmNlRnJhbWVTIGZhaWxlZCIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnIgIT0gbm9FcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIFFaX0ZyZWVIV1lVViAoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KSB7Ci0KLSAgICBDRFNlcXVlbmNlRW5kICh5dXZfc2VxKTsKLSAgICBFeGl0TW92aWVzKCk7Ci0KLSAgICBTRExfZnJlZSAob3ZlcmxheS0+aHdmdW5jcyk7Ci0gICAgU0RMX2ZyZWUgKG92ZXJsYXktPnBpdGNoZXMpOwotICAgIFNETF9mcmVlIChvdmVybGF5LT5waXhlbHMpOwotCi0gICAgaWYgKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pIHsKLSAgICAgICAgWyBxel93aW5kb3cgY2xvc2UgXTsKLSAgICAgICAgcXpfd2luZG93ID0gbmlsOwotICAgIH0KLQotICAgIFNETF9mcmVlICh5dXZfbWF0cml4KTsKLSAgICBEaXNwb3NlSGFuZGxlICgoSGFuZGxlKXl1dl9pZGgpOwotfQotCi0vKiBjaGVjayBmb3IgMTYgYnl0ZSBhbGlnbm1lbnQsIGJhaWwgb3RoZXJ3aXNlICovCi0jZGVmaW5lIENIRUNLX0FMSUdOKHgpIGRvIHsgaWYgKChVaW50MzIpeCAmIDE1KSB7IFNETF9TZXRFcnJvcigiQWxpZ25tZW50IGVycm9yIik7IHJldHVybiBOVUxMOyB9IH0gd2hpbGUoMCkKLQotLyogYWxpZ24gYSBieXRlIG9mZnNldCwgcmV0dXJuIGhvdyBtdWNoIHRvIGFkZCB0byBtYWtlIGl0IGEgbXVsdGlwbGUgb2YgMTYgKi8KLSNkZWZpbmUgQUxJR04oeCkgKCgxNiAtICh4ICYgMTUpKSAmIDE1KQotCi1TRExfT3ZlcmxheSogUVpfQ3JlYXRlWVVWT3ZlcmxheSAoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpIHsKLQotICAgIFVpbnQzMiBjb2RlYzsKLSAgICBPU1N0YXR1cyBlcnI7Ci0gICAgQ0dyYWZQdHIgcG9ydDsKLSAgICBTRExfT3ZlcmxheSAqb3ZlcmxheTsKLQotICAgIGlmIChmb3JtYXQgPT0gU0RMX1lWMTJfT1ZFUkxBWSB8fAotICAgICAgICBmb3JtYXQgPT0gU0RMX0lZVVZfT1ZFUkxBWSkgewotCi0gICAgICAgIGNvZGVjID0ga1lVVjQyMENvZGVjVHlwZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFNETF9TZXRFcnJvciAoIkhhcmR3YXJlOiB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgeXV2X2lkaCA9IChJbWFnZURlc2NyaXB0aW9uSGFuZGxlKSBOZXdIYW5kbGVDbGVhciAoc2l6ZW9mKEltYWdlRGVzY3JpcHRpb24pKTsKLSAgICBpZiAoeXV2X2lkaCA9PSBOVUxMKSB7Ci0gICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB5dXZfbWF0cml4ID0gKE1hdHJpeFJlY29yZFB0cikgU0RMX21hbGxvYyAoc2l6ZW9mKE1hdHJpeFJlY29yZCkpOwotICAgIGlmICh5dXZfbWF0cml4ID09IE5VTEwpIHsKLSAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICggRW50ZXJNb3ZpZXMoKSAhPSBub0VyciApIHsKLSAgICAgICAgU0RMX1NldEVycm9yICgiQ291bGQgbm90IGluaXQgUXVpY2tUaW1lIGZvciBZVVYgcGxheWJhY2siKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZXJyID0gRmluZENvZGVjIChjb2RlYywgYmVzdFNwZWVkQ29kZWMsIG5pbCwgJnl1dl9jb2RlYyk7Ci0gICAgaWYgKGVyciAhPSBub0VycikgewotICAgICAgICBTRExfU2V0RXJyb3IgKCJDb3VsZCBub3QgZmluZCBRdWlja1RpbWUgY29kZWMgZm9yIGZvcm1hdCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgewotCi0gICAgICAgIC8qCi0gICAgICAgICAgQWNjZWxlcmF0aW9uIHJlcXVpcmVzIGEgd2luZG93IHRvIGJlIHByZXNlbnQuCi0gICAgICAgICAgQSBDR3JhZlB0ciB0aGF0IHBvaW50cyB0byB0aGUgc2NyZWVuIGlzbid0IGdvb2QgZW5vdWdoCi0gICAgICAgICovCi0gICAgICAgIE5TUmVjdCBjb250ZW50ID0gTlNNYWtlUmVjdCAoMCwgMCwgU0RMX1ZpZGVvU3VyZmFjZS0+dywgU0RMX1ZpZGVvU3VyZmFjZS0+aCk7Ci0KLSAgICAgICAgcXpfd2luZG93ID0gWyBbIFNETF9RdWFydHpXaW5kb3cgYWxsb2MgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRXaXRoQ29udGVudFJlY3Q6Y29udGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTWFzazpOU0JvcmRlcmxlc3NXaW5kb3dNYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2luZzpOU0JhY2tpbmdTdG9yZUJ1ZmZlcmVkIGRlZmVyOk5PIF07Ci0KLSAgICAgICAgaWYgKHF6X3dpbmRvdyA9PSBuaWwpIHsKLSAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIkNvdWxkIG5vdCBjcmVhdGUgdGhlIENvY29hIHdpbmRvdyIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBbIHF6X3dpbmRvdyBzZXRDb250ZW50VmlldzpbIFsgTlNRdWlja0RyYXdWaWV3IGFsbG9jIF0gaW5pdCBdIF07Ci0gICAgICAgIFsgcXpfd2luZG93IHNldFJlbGVhc2VkV2hlbkNsb3NlZDpZRVMgXTsKLSAgICAgICAgWyBxel93aW5kb3cgY2VudGVyIF07Ci0gICAgICAgIFsgcXpfd2luZG93IHNldEFjY2VwdHNNb3VzZU1vdmVkRXZlbnRzOllFUyBdOwotICAgICAgICBbIHF6X3dpbmRvdyBzZXRMZXZlbDpDR1NoaWVsZGluZ1dpbmRvd0xldmVsKCkgXTsKLSAgICAgICAgWyBxel93aW5kb3cgbWFrZUtleUFuZE9yZGVyRnJvbnQ6bmlsIF07Ci0KLSAgICAgICAgcG9ydCA9IFsgWyBxel93aW5kb3cgY29udGVudFZpZXcgXSBxZFBvcnQgXTsKLSAgICAgICAgU2V0UG9ydCAocG9ydCk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgICAgQlVHOiB3b3VsZCBsaWtlIHRvIHJlbW92ZSB3aGl0ZSBmbGFzaCB3aGVuIHdpbmRvdyBraWNrcyBpbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlY3QgcjsKLSAgICAgICAgICAgICAgICBTZXRSZWN0ICgmciwgMCwgMCwgU0RMX1ZpZGVvU3VyZmFjZS0+dywgU0RMX1ZpZGVvU3VyZmFjZS0+aCk7Ci0gICAgICAgICAgICAgICAgUGFpbnRSZWN0ICgmcik7Ci0gICAgICAgICAgICAgICAgUURGbHVzaFBvcnRCdWZmZXIgKHBvcnQsIG5pbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICovCi0gICAgfQotICAgIGVsc2UgewotICAgICAgICBwb3J0ID0gWyB3aW5kb3dfdmlldyBxZFBvcnQgXTsKLSAgICAgICAgU2V0UG9ydCAocG9ydCk7Ci0gICAgfQotICAgIAotICAgIFNldElkZW50aXR5TWF0cml4ICh5dXZfbWF0cml4KTsKLSAgICAKLSAgICBITG9jayAoKEhhbmRsZSl5dXZfaWRoKTsKLSAgICAKLSAgICAoKip5dXZfaWRoKS5pZFNpemUgPSBzaXplb2YoSW1hZ2VEZXNjcmlwdGlvbik7Ci0gICAgKCoqeXV2X2lkaCkuY1R5cGUgID0gY29kZWM7Ci0gICAgKCoqeXV2X2lkaCkudmVyc2lvbiA9IDE7Ci0gICAgKCoqeXV2X2lkaCkucmV2aXNpb25MZXZlbCA9IDA7Ci0gICAgKCoqeXV2X2lkaCkud2lkdGggPSB3aWR0aDsKLSAgICAoKip5dXZfaWRoKS5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgKCoqeXV2X2lkaCkuaFJlcyA9IExvbmcyRml4KDcyKTsKLSAgICAoKip5dXZfaWRoKS52UmVzID0gTG9uZzJGaXgoNzIpOwotICAgICgqKnl1dl9pZGgpLnNwYXRpYWxRdWFsaXR5ID0gY29kZWNMb3NzbGVzc1F1YWxpdHk7Ci0gICAgKCoqeXV2X2lkaCkuZnJhbWVDb3VudCA9IDE7Ci0gICAgKCoqeXV2X2lkaCkuY2x1dElEID0gLTE7Ci0gICAgKCoqeXV2X2lkaCkuZGF0YVNpemUgPSAwOwotICAgICgqKnl1dl9pZGgpLmRlcHRoID0gMjQ7Ci0gICAgCi0gICAgSFVubG9jayAoKEhhbmRsZSl5dXZfaWRoKTsKLSAgICAKLSAgICBlcnIgPSBEZWNvbXByZXNzU2VxdWVuY2VCZWdpblMgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnl1dl9zZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfaWRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0ZsYWdVc2VJbWFnZUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTG9zc2xlc3NRdWFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2NvZGVjKTsKLSAgICAKLSAgICBpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgICAgIFNETF9TZXRFcnJvciAoIkVycm9yIHRyeWluZyB0byBzdGFydCBZVVYgY29kZWMuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAKLSAgICBvdmVybGF5ID0gKFNETF9PdmVybGF5KikgU0RMX21hbGxvYyAoc2l6ZW9mKCpvdmVybGF5KSk7Ci0gICAgaWYgKG92ZXJsYXkgPT0gTlVMTCkgewotICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIAotICAgIG92ZXJsYXktPmZvcm1hdCAgICAgID0gZm9ybWF0OwotICAgIG92ZXJsYXktPncgICAgICAgICAgID0gd2lkdGg7Ci0gICAgb3ZlcmxheS0+aCAgICAgICAgICAgPSBoZWlnaHQ7Ci0gICAgb3ZlcmxheS0+cGxhbmVzICAgICAgPSAzOwotICAgIG92ZXJsYXktPmh3X292ZXJsYXkgID0gMTsKLSAgICB7Ci0gICAgICAgIGludCAgICAgIG9mZnNldDsKLSAgICAgICAgVWludDggICoqcGl4ZWxzOwotICAgICAgICBVaW50MTYgICpwaXRjaGVzOwotICAgICAgICBpbnQgICAgICBwbGFuZTIsIHBsYW5lMzsKLQotICAgICAgICBpZiAoZm9ybWF0ID09IFNETF9JWVVWX09WRVJMQVkpIHsKLQotICAgICAgICAgICAgcGxhbmUyID0gMTsgLyogTmF0aXZlIGNvZGVjIGZvcm1hdCAqLwotICAgICAgICAgICAgcGxhbmUzID0gMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gU0RMX1lWMTJfT1ZFUkxBWSkgewotCi0gICAgICAgICAgICAvKiBzd2l0Y2ggdGhlIFUgYW5kIFYgcGxhbmVzICovCi0gICAgICAgICAgICBwbGFuZTIgPSAyOyAvKiBVIHBsYW5lIG1hcHMgdG8gcGxhbmUgMyAqLwotICAgICAgICAgICAgcGxhbmUzID0gMTsgLyogViBwbGFuZSBtYXBzIHRvIHBsYW5lIDIgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgWVVWIGZvcm1hdCIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBwaXhlbHMgPSAoVWludDgqKikgU0RMX21hbGxvYyAoc2l6ZW9mKCpwaXhlbHMpICogMyk7Ci0gICAgICAgIHBpdGNoZXMgPSAoVWludDE2KikgU0RMX21hbGxvYyAoc2l6ZW9mKCpwaXRjaGVzKSAqIDMpOwotICAgICAgICBpZiAocGl4ZWxzID09IE5VTEwgfHwgcGl0Y2hlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRml4OiBqYy5iZXJ0aW5AZnJlZS5mcgotICAgICAgICAgICBQbGFuYXJQaXhtYXBJbmZvWVVWNDIwIGlzIGEgYmlnLWVuZGlhbiBzdHJ1Y3QgKi8KLSAgICAgICAgeXV2X3BpeG1hcCA9IChQbGFuYXJQaXhtYXBJbmZvWVVWNDIwKikKLSAgICAgICAgICAgIFNETF9tYWxsb2MgKHNpemVvZihQbGFuYXJQaXhtYXBJbmZvWVVWNDIwKSArCi0gICAgICAgICAgICAgICAgICAgICh3aWR0aCAqIGhlaWdodCAqIDIpKTsKLSAgICAgICAgaWYgKHl1dl9waXhtYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgU0RMX091dE9mTWVtb3J5ICgpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDSEVDS19BTElHTih5dXZfcGl4bWFwKTsgKi8KLSAgICAgICAgb2Zmc2V0ICA9IHNpemVvZihQbGFuYXJQaXhtYXBJbmZvWVVWNDIwKTsKLSAgICAgICAgLyogb2Zmc2V0ICs9IEFMSUdOKG9mZnNldCk7ICovCi0gICAgICAgIC8qIENIRUNLX0FMSUdOKG9mZnNldCk7ICovCi0KLSAgICAgICAgcGl4ZWxzWzBdID0gKFVpbnQ4Kil5dXZfcGl4bWFwICsgb2Zmc2V0OwotICAgICAgICAvKiBDSEVDS19BTElHTihwaXhlbHNbMF0pOyAqLwotCi0gICAgICAgIHBpdGNoZXNbMF0gPSB3aWR0aDsKLSAgICAgICAgeXV2X3BpeG1hcC0+Y29tcG9uZW50SW5mb1kub2Zmc2V0ID0gRW5kaWFuUzMyX050b0Iob2Zmc2V0KTsKLSAgICAgICAgeXV2X3BpeG1hcC0+Y29tcG9uZW50SW5mb1kucm93Qnl0ZXMgPSBFbmRpYW5VMzJfTnRvQih3aWR0aCk7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBwaXhlbHNbcGxhbmUyXSA9IChVaW50OCopeXV2X3BpeG1hcCArIG9mZnNldDsKLSAgICAgICAgcGl0Y2hlc1twbGFuZTJdID0gd2lkdGggLyAyOwotICAgICAgICB5dXZfcGl4bWFwLT5jb21wb25lbnRJbmZvQ2Iub2Zmc2V0ID0gRW5kaWFuUzMyX050b0Iob2Zmc2V0KTsKLSAgICAgICAgeXV2X3BpeG1hcC0+Y29tcG9uZW50SW5mb0NiLnJvd0J5dGVzID0gRW5kaWFuVTMyX050b0Iod2lkdGggLyAyKTsKLQotICAgICAgICBvZmZzZXQgKz0gKHdpZHRoICogaGVpZ2h0IC8gNCk7Ci0gICAgICAgIHBpeGVsc1twbGFuZTNdID0gKFVpbnQ4Kil5dXZfcGl4bWFwICsgb2Zmc2V0OwotICAgICAgICBwaXRjaGVzW3BsYW5lM10gPSB3aWR0aCAvIDI7Ci0gICAgICAgIHl1dl9waXhtYXAtPmNvbXBvbmVudEluZm9Dci5vZmZzZXQgPSBFbmRpYW5TMzJfTnRvQihvZmZzZXQpOwotICAgICAgICB5dXZfcGl4bWFwLT5jb21wb25lbnRJbmZvQ3Iucm93Qnl0ZXMgPSBFbmRpYW5VMzJfTnRvQih3aWR0aCAvIDIpOwotCi0gICAgICAgIG92ZXJsYXktPnBpeGVscyA9IHBpeGVsczsKLSAgICAgICAgb3ZlcmxheS0+cGl0Y2hlcyA9IHBpdGNoZXM7Ci0gICAgfQotCi0gICAgb3ZlcmxheS0+aHdmdW5jcyA9IFNETF9tYWxsb2MgKHNpemVvZigqb3ZlcmxheS0+aHdmdW5jcykpOwotICAgIGlmIChvdmVybGF5LT5od2Z1bmNzID09IE5VTEwpIHsKLSAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAKLSAgICBvdmVybGF5LT5od2Z1bmNzLT5Mb2NrICAgID0gUVpfTG9ja1lVVjsKLSAgICBvdmVybGF5LT5od2Z1bmNzLT5VbmxvY2sgID0gUVpfVW5sb2NrWVVWOwotICAgIG92ZXJsYXktPmh3ZnVuY3MtPkRpc3BsYXkgPSBRWl9EaXNwbGF5WVVWOwotICAgIG92ZXJsYXktPmh3ZnVuY3MtPkZyZWVIVyAgPSBRWl9GcmVlSFdZVVY7Ci0KLSAgICB5dXZfd2lkdGggPSBvdmVybGF5LT53OwotICAgIHl1dl9oZWlnaHQgPSBvdmVybGF5LT5oOwotICAgIAotICAgIHJldHVybiBvdmVybGF5OwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc0FTTS5TIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc0FTTS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGUwY2ViLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3NBU00uUworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi07Ci07ICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotOyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLTsKLTsgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotOyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotOyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLTsgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotOwotOyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLTsgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLTsgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLTsgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi07Ci07ICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi07ICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLTsgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotOwotOyAgICBTYW0gTGFudGluZ2EKLTsgICAgc2xvdWtlbkBsaWJzZGwub3JnCi07Ci07IEFzc2VtYmxlciByb3V0aW5lcyBmb3IgUklTQyBPUyBkaXNwbGF5Ci07Ci0KLQlBUkVBIHxDJCRDT0RFfAotCi0JRVhQT1JUIHxSSVNDT1NfUHV0MzJ8Ci0KLTsgRGlzcGxheSAzMmJwcCB0byAzMmJwcCwgMToxCi07Ci07IENvZGUgcHJvdmlkZWQgYnkgQWRyYWluIExlZXMKLTsKLTsgZW50cnkgYTEgLT4gZGVzdGluYXRpb24KLTsgICAgICAgYTIgPSAgZGVzdCB3aWR0aCBpbiBwaXhlbHMKLTsgICAgICAgYTMgPSAgZGVzdCBsaW5lIGxlbmd0aCBpbiBieXRlcwotOyAgICAgICBhNCA9ICBkZXN0IGhlaWdodCBpbiBzY2FubGluZXMKLTsgICAgICAgYXJnNSAtPiBzb3VyY2UKLTsgICAgICAgYXJnNiA9ICBieXRlIG9mZnNldCBmcm9tIGVuZCBvZiBzb3VyY2UgbGluZSB0byBzdGFydCBvZiBuZXh0Ci0KLUFyZzUgICAgKiAgICAgICAxMCo0Ci1Bcmc2ICAgICogICAgICAgQXJnNSs0Ci0KLVJJU0NPU19QdXQzMiAgICBST1VUCi0gICAgICAgICAgICAgICAgU1RNRkQgICBzcCEse2EyLHYxLXY2LHNsLGZwLGxyfQotICAgICAgICAgICAgICAgIExEUiAgICAgaXAsW3NwLCNBcmc1XQotICAgICAgICAgICAgICAgIE1PViAgICAgbHIsYTEKLSAgICAgICAgICAgICAgICBCICAgICAgIHVjcDY0bHAKLQotMDAgICAgICAgICAgICAgIDt0YWlsIHN0cmlwIG9mIDEtMTUgcGl4ZWxzCi0KLSAgICAgICAgICAgICAgICBMRFIgICAgIHYxLFtpcF0sIzQKLTAxICAgICAgICAgICAgICBTVUJTICAgIGEyLGEyLCMxCi0gICAgICAgICAgICAgICAgU1RSICAgICB2MSxbbHJdLCM0Ci0gICAgICAgICAgICAgICAgTERSSEkgICB2MSxbaXBdLCM0Ci0gICAgICAgICAgICAgICAgQkhJICAgICAlMDEKLSAgICAgICAgICAgICAgICBCICAgICAgICUwMgotCi11Y3A2NGVuZCAgICAgICAgQUREUyAgICBhMixhMiwjMTYKLSAgICAgICAgICAgICAgICBCTkUgICAgICUwMAotCi0wMiAgICAgICAgICAgICAgU1VCUyAgICBhNCxhNCwjMSAgICAgICAgICAgICAgICA7aGVpZ2h0LS0KLSAgICAgICAgICAgICAgICBMRFJISSAgIHYxLFtzcCwjQXJnNl0KLSAgICAgICAgICAgICAgICBMRFJISSAgIGEyLFtzcF0gICAgICAgICAgICAgICAgIDtyZWxvYWQgd2lkdGgKLSAgICAgICAgICAgICAgICBCTFMgICAgICUwMwotCi0gICAgICAgICAgICAgICAgO21vdmUgdG8gc3RhcnQgb2YgbmV4dCBzY2FubGluZQotCi0gICAgICAgICAgICAgICAgQUREICAgICBscixhMSxhMwotICAgICAgICAgICAgICAgIEFERCAgICAgYTEsYTEsYTMKLSAgICAgICAgICAgICAgICBBREQgICAgIGlwLGlwLHYxCi0KLXVjcDY0bHAgICAgICAgICBTVUJTICAgIGEyLGEyLCMxNgotICAgICAgICAgICAgICAgIEJMTyAgICAgdWNwNjRlbmQKLQotICAgICAgICAgICAgICAgIFBMRCAgICAgW2lwLCM2NF0KLQotICAgICAgICAgICAgICAgIExEUiAgICAgdjEsW2lwXSwjNAotICAgICAgICAgICAgICAgIExEUiAgICAgdjIsW2lwXSwjNAotICAgICAgICAgICAgICAgIExEUiAgICAgdjMsW2lwXSwjNAotICAgICAgICAgICAgICAgIExEUiAgICAgdjQsW2lwXSwjNAotICAgICAgICAgICAgICAgIExEUiAgICAgdjUsW2lwXSwjNAotICAgICAgICAgICAgICAgIExEUiAgICAgdjYsW2lwXSwjNAotICAgICAgICAgICAgICAgIExEUiAgICAgc2wsW2lwXSwjNAotICAgICAgICAgICAgICAgIExEUiAgICAgZnAsW2lwXSwjNAotICAgICAgICAgICAgICAgIFNUUiAgICAgdjEsW2xyXSwjNAotICAgICAgICAgICAgICAgIFNUUiAgICAgdjIsW2xyXSwjNAotICAgICAgICAgICAgICAgIFNUUiAgICAgdjMsW2xyXSwjNAotICAgICAgICAgICAgICAgIFNUUiAgICAgdjQsW2xyXSwjNAotICAgICAgICAgICAgICAgIFNUUiAgICAgdjUsW2xyXSwjNAotICAgICAgICAgICAgICAgIFNUUiAgICAgdjYsW2xyXSwjNAotICAgICAgICAgICAgICAgIFNUUiAgICAgc2wsW2xyXSwjNAotICAgICAgICAgICAgICAgIFNUUiAgICAgZnAsW2xyXSwjNAotCi0gICAgICAgICAgICAgICAgUExEICAgICBbaXAsIzY0XQotCi0gICAgICAgICAgICAgICAgTERSICAgICB2MSxbaXBdLCM0Ci0gICAgICAgICAgICAgICAgTERSICAgICB2MixbaXBdLCM0Ci0gICAgICAgICAgICAgICAgTERSICAgICB2MyxbaXBdLCM0Ci0gICAgICAgICAgICAgICAgTERSICAgICB2NCxbaXBdLCM0Ci0gICAgICAgICAgICAgICAgTERSICAgICB2NSxbaXBdLCM0Ci0gICAgICAgICAgICAgICAgTERSICAgICB2NixbaXBdLCM0Ci0gICAgICAgICAgICAgICAgTERSICAgICBzbCxbaXBdLCM0Ci0gICAgICAgICAgICAgICAgTERSICAgICBmcCxbaXBdLCM0Ci0gICAgICAgICAgICAgICAgU1RSICAgICB2MSxbbHJdLCM0Ci0gICAgICAgICAgICAgICAgU1RSICAgICB2MixbbHJdLCM0Ci0gICAgICAgICAgICAgICAgU1RSICAgICB2MyxbbHJdLCM0Ci0gICAgICAgICAgICAgICAgU1RSICAgICB2NCxbbHJdLCM0Ci0gICAgICAgICAgICAgICAgU1RSICAgICB2NSxbbHJdLCM0Ci0gICAgICAgICAgICAgICAgU1RSICAgICB2NixbbHJdLCM0Ci0gICAgICAgICAgICAgICAgU1RSICAgICBzbCxbbHJdLCM0Ci0gICAgICAgICAgICAgICAgU1RSICAgICBmcCxbbHJdLCM0Ci0KLSAgICAgICAgICAgICAgICBCICAgICAgIHVjcDY0bHAKLQotMDMgICAgICAgICAgICAgIExETUZEICAgc3AhLHthMix2MS12NixzbCxmcCxwY30KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc0Z1bGxTY3JlZW5WaWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc0Z1bGxTY3JlZW5WaWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjA0NzM4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3NGdWxsU2NyZWVuVmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDc3NyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAgICAgRmlsZSBhZGRlZCBieSBBbGFuIEJ1Y2tsZXkgKGFsYW5fYmFhQGhvdG1haWwuY29tKSBmb3IgUklTQyBPUyBjb21wYXRhYmlsaXR5Ci0JIDI3IE1hcmNoIDIwMDMKLQotICAgICBJbXBsZW1lbnRzIFJJU0MgT1MgZnVsbCBzY3JlZW4gZGlzcGxheS4KLSovCi0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0KLSNpbmNsdWRlICJTRExfcmlzY29zdGFzay5oIgotI2luY2x1ZGUgIlNETF9yaXNjb3N2aWRlby5oIgotI2luY2x1ZGUgIlNETF9yaXNjb3NldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9yaXNjb3Ntb3VzZV9jLmgiCi0KLSNpbmNsdWRlICJrZXJuZWwuaCIKLSNpbmNsdWRlICJzd2lzLmgiCi0jaW5jbHVkZSAidW5peGxpYi9vcy5oIgotI2luY2x1ZGUgInVuaXhsaWIvbG9jYWwuaCIKLQotLyogUHJpdmF0ZSBzdHJ1Y3R1cmVzICovCi10eXBlZGVmIHN0cnVjdCB0YWdTY3JlZW5Nb2RlQmxvY2sKLXsKLSAgIGludCBmbGFnczsgIC8vIG1vZGUgc2VsZWN0b3IgZmxhZ3MsIGJpdCAwID0gMSwgYml0IDEtNyBmb3JtYXQgc3BlY2lmaWVyLCA4LTMxIHJlc2VydmVkCi0gICBpbnQgeF9waXhlbHM7Ci0gICBpbnQgeV9waXhlbHM7Ci0gICBpbnQgcGl4ZWxfZGVwdGg7ICAvLyAyXnBpeGVsX2RlcHRoID0gYnBwLGkuZS4gMCA9IDEsIDEgPSAyLCA0ID0gMTYsIDUgPSAzMgotICAgaW50IGZyYW1lX3JhdGU7ICAgLy8gLTEgdXNlIGZpcnN0IG1hdGNoCi0gICBpbnQgbW9kZV92YXJzWzVdOyAvLyBhcnJheSBvZiBpbmRleCwgdmFsdWUgcGFpcnMgdGVybWluYXRlZCBieSAtMQotfSBTQ1JFRU5NT0RFQkxPQ0s7Ci0KLQotLyogSGVscGVyIGZ1bmN0aW9ucyAqLwotdm9pZCBGVUxMU0NSRUVOX1NldERldmljZU1vZGUoX1RISVMpOwotaW50IEZVTExTQ1JFRU5fU2V0TW9kZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApOwotdm9pZCBGVUxMU0NSRUVOX1NldHVwQmFua3MoX1RISVMpOwotCi0vKiBTREwgdmlkZW8gZGV2aWNlIGZ1bmN0aW9ucyBmb3IgZnVsbHNjcmVlbiBtb2RlICovCi1zdGF0aWMgaW50IEZVTExTQ1JFRU5fU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyBpbnQgRlVMTFNDUkVFTl9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci12b2lkIEZVTExTQ1JFRU5fU2V0V01DYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7Ci1leHRlcm4gaW50IFJJU0NPU19HZXRXbUluZm8oX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pOwotCi0vKiBVcGRhdGVSZWN0cyB2YXJpYW50cyAqLwotc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9VcGRhdGVSZWN0c01lbUNweShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9VcGRhdGVSZWN0czhicHAoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLXN0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHMxNmJwcChfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9VcGRhdGVSZWN0czMyYnBwKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci1zdGF0aWMgdm9pZCBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzT1MoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotLyogTG9jYWwgaGVscGVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBjbXBtb2Rlcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpOwotc3RhdGljIGludCBGVUxMU0NSRUVOX0FkZE1vZGUoX1RISVMsIGludCBicHAsIGludCB3LCBpbnQgaCk7Ci12b2lkIEZVTExTQ1JFRU5fU2V0V3JpdGVCYW5rKGludCBiYW5rKTsKLXZvaWQgRlVMTFNDUkVFTl9TZXREaXNwbGF5QmFuayhpbnQgYmFuayk7Ci1zdGF0aWMgdm9pZCBGVUxMU0NSRUVOX0Rpc2FibGVFc2NhcGUoKTsKLXN0YXRpYyB2b2lkIEZVTExTQ1JFRU5fRW5hYmxlRXNjYXBlKCk7Ci12b2lkIEZVTExTQ1JFRU5fQnVpbGRNb2RlTGlzdChfVEhJUyk7Ci0KLS8qIEZvbGxvd2luZyB2YXJpYWJsZSBpcyBzZXQgdXAgaW4gcmlza29zVGFzay5jICovCi1leHRlcm4gaW50IHJpc2Nvc19iYWNrYnVmZmVyOyAvKiBDcmVhdGUgYSBiYWNrIGJ1ZmZlciBpbiBzeXN0ZW0gbWVtb3J5IGZvciBmdWxsIHNjcmVlbiBtb2RlICovCi0KLS8qIEZvbGxvd2luZyBpcyB1c2VkIHRvIGNyZWF0ZSBhIHNwcml0ZSBiYWNrIGJ1ZmZlciAqLwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKldJTVBfQ3JlYXRlQnVmZmVyKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCk7Ci0KLS8qIEZhc3QgYXNzZW1ibGVyIGNvcHkgKi8KLWV4dGVybiB2b2lkIFJJU0NPU19QdXQzMih2b2lkICp0bywgaW50IHBpeGVscywgaW50IHBpdGNoLCBpbnQgcm93cywgdm9pZCAqZnJvbSwgaW50IHNyY19za2lwX2J5dGVzKTsKLQotU0RMX1N1cmZhY2UgKkZVTExTQ1JFRU5fU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLSAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLSAgIFVpbnQzMiBSbWFzayA9IDA7Ci0gICBVaW50MzIgR21hc2sgPSAwOwotICAgVWludDMyIEJtYXNrID0gMDsKLSAgIGludCBjcmVhdGVfYmFja19idWZmZXIgPSByaXNjb3NfYmFja2J1ZmZlcjsKLQotICAgc3dpdGNoKGJwcCkKLSAgIHsKLQljYXNlIDg6Ci0JCWZsYWdzIHw9IFNETF9IV1BBTEVUVEU7Ci0JCWJyZWFrOwotCi0JY2FzZSAxNToKLQljYXNlIDE2OgotCQlCbWFzayA9IDB4MDAwMDdjMDA7Ci0JCUdtYXNrID0gMHgwMDAwMDNlMDsKLQkJUm1hc2sgPSAweDAwMDAwMDFmOwotCQlicmVhazsKLQotCWNhc2UgMzI6Ci0JCUJtYXNrID0gMHgwMGZmMDAwMDsKLQkJR21hc2sgPSAweDAwMDBmZjAwOwotCQlSbWFzayA9IDB4MDAwMDAwZmY7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJU0RMX1NldEVycm9yKCJQaXhlbCBkZXB0aCBub3Qgc3VwcG9ydGVkIik7Ci0JCXJldHVybiBOVUxMOwotCQlicmVhazsKLSAgIH0KLQotICAgaWYgKEZVTExTQ1JFRU5fU2V0TW9kZSh3aWR0aCwgaGVpZ2h0LCBicHApID09IDApCi0gICB7Ci0JICAgU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgcmVxdWVzdGVkIG1vZGUiKTsKLQkgICByZXR1cm4gKE5VTEwpOwotICAgfQotCi0vKiAJcHJpbnRmKCJTZXR0aW5nIG1vZGUgJWR4JWRcbiIsIHdpZHRoLCBoZWlnaHQpOyAqLwotCi0JLyogQWxsb2NhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHRoZSBzY3JlZW4gKi8KLQlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgYnBwLCBSbWFzaywgR21hc2ssIEJtYXNrLCAwKSApIHsKLQkgICAgUklTQ09TX1Jlc3RvcmVXaW1wTW9kZSgpOwotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGFsbG9jYXRlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHJlcXVlc3RlZCBtb2RlIik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCi0JY3VycmVudC0+dyA9IHdpZHRoOwotCXRoaXMtPmhpZGRlbi0+aGVpZ2h0ID0gY3VycmVudC0+aCA9IGhlaWdodDsKLQotICAgcmVncy5yWzBdID0gLTE7IC8qIC0xIGZvciBjdXJyZW50IHNjcmVlbiBtb2RlICovCi0KLSAgIC8qIEdldCBzY3JlZW4gd2lkdGggaW4gYnl0ZXMgKi8KLSAgIHJlZ3MuclsxXSA9IDY7IC8vIFNjcmVlbiBXaWR0aCBpbiBieXRlcwotICAgX2tlcm5lbF9zd2koT1NfUmVhZE1vZGVWYXJpYWJsZSwgJnJlZ3MsICZyZWdzKTsKLQotICAgY3VycmVudC0+cGl0Y2ggPSByZWdzLnJbMl07Ci0KLSAgIGlmIChmbGFncyAmIFNETF9ET1VCTEVCVUYpCi0gICB7Ci0JICAgcmVncy5yWzBdID0gMjsgLyogU2NyZWVuIGFyZWEgKi8KLQkgICBfa2VybmVsX3N3aShPU19SZWFkRHluYW1pY0FyZWEsICZyZWdzLCAmcmVncyk7Ci0JICAgCi0JICAgLyogUmVnIDEgaGFzIGFtb3VudCBvZiBtZW1vcnkgY3VycmVudGx5IHVzZWQgZm9yIGRpc3BsYXkgKi8KLQkgICByZWdzLnJbMF0gPSAyOyAvKiBTY3JlZW4gYXJlYSAqLwotCSAgIHJlZ3MuclsxXSA9IChjdXJyZW50LT5waXRjaCAqIGhlaWdodCAqIDIpIC0gcmVncy5yWzFdOwotCSAgIGlmIChfa2VybmVsX3N3aShPU19DaGFuZ2VEeW5hbWljQXJlYSwgJnJlZ3MsICZyZWdzKSAhPSBOVUxMKQotCSAgIHsKLQkJICAgLyogQ2FuJ3QgYWxsb2NhdGUgZW5vdWdoIHNjcmVlbiBtZW1vcnkgZm9yIGRvdWJsZSBidWZmZXIgKi8KLQkJICAgZmxhZ3MgJj0gflNETF9ET1VCTEVCVUY7Ci0JICAgfQotICAgfQotICAgCi0gIAljdXJyZW50LT5mbGFncyA9IGZsYWdzIHwgU0RMX0ZVTExTQ1JFRU4gfCBTRExfSFdTVVJGQUNFIHwgU0RMX1BSRUFMTE9DOwotCQotCi0JLyogTmVlZCB0byBzZXQgZGlzcGxheSBiYW5rcyBoZXJlIGZvciBkb3VibGUgYnVmZmVyaW5nICovCi0JaWYgKGZsYWdzICYgU0RMX0RPVUJMRUJVRikKLQl7Ci0JICAgRlVMTFNDUkVFTl9TZXRXcml0ZUJhbmsoMCk7Ci0JICAgRlVMTFNDUkVFTl9TZXREaXNwbGF5QmFuaygxKTsKLQotICAgICAgICAgY3JlYXRlX2JhY2tfYnVmZmVyID0gMDsgLyogRG9uJ3QgbmVlZCBhIGJhY2sgYnVmZmVyIGZvciBhIGRvdWJsZSBidWZmZXJlZCBkaXNwbGF5ICovCi0gICAgfQotCi0gICAgRlVMTFNDUkVFTl9TZXR1cEJhbmtzKHRoaXMpOwotCi0gICAgaWYgKGNyZWF0ZV9iYWNrX2J1ZmZlcikKLSAgICB7Ci0gICAgICAgLyogSWYgbm90IGRvdWJsZSBidWZmZXJlZCB3ZSBtYXkgbmVlZCB0byBjcmVhdGUgYSBtZW1vcnkKLSAgICAgICAgICoqIGJhY2sgYnVmZmVyIHRvIHNpbXVsYXRlIHByb2Nlc3Npbmcgb24gb3RoZXIgT1Nlcy4KLSAgICAgICAgICoqIFRoaXMgaXMgdHVybmVkIG9uIGJ5IHNldHRpbmcgdGhlIGVudmlyb21lbnRhbCB2YXJpYWJsZQotICAgICAgICAgKiogU0RMJDxuYW1lPiRCYWNrQnVmZmVyID49IDEKLSAgICAgICAgICovCi0gICAgICAgaWYgKHJpc2Nvc19iYWNrYnVmZmVyID09IDMpCi0gICAgICAgICAgdGhpcy0+aGlkZGVuLT5iYW5rWzBdID0gV0lNUF9DcmVhdGVCdWZmZXIod2lkdGgsIGhlaWdodCwgYnBwKTsKLSAgICAgICBlbHNlCi0gICAgICAgICAgdGhpcy0+aGlkZGVuLT5iYW5rWzBdID0gU0RMX21hbGxvYyhoZWlnaHQgKiBjdXJyZW50LT5waXRjaCk7Ci0gICAgICAgaWYgKHRoaXMtPmhpZGRlbi0+YmFua1swXSA9PSAwKQotICAgICAgIHsKLSAJICAgICAgIFJJU0NPU19SZXN0b3JlV2ltcE1vZGUoKTsKLSAgICAgICAgICAgU0RMX1NldEVycm9yKCJDb3VsZG50IGFsbG9jYXRlIG1lbW9yeSBmb3IgYmFjayBidWZmZXIiKTsKLSAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICAgICB9Ci0gICAgICAgLyogU3VyZmFjZSB1cGRhdGVkIGluIHByb2dyYW1zIGlzIG5vdyBhIHNvZnR3YXJlIHN1cmZhY2UgKi8KLSAgICAgICBjdXJyZW50LT5mbGFncyAmPSB+U0RMX0hXU1VSRkFDRTsKLSAgICB9Ci0KLSAgICAvKiBTdG9yZSBhZGRyZXNzIG9mIGFsbG9jYXRlZCBzY3JlZW4gYmFuayB0byBiZSBmcmVlZCBsYXRlciAqLwotICAgIGlmICh0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmspIFNETF9mcmVlKHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuayk7Ci0gICAgaWYgKGNyZWF0ZV9iYWNrX2J1ZmZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuayA9IHRoaXMtPmhpZGRlbi0+YmFua1swXTsKLSAgICAgICAgaWYgKHJpc2Nvc19iYWNrYnVmZmVyID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgdGhpcy0+aGlkZGVuLT5iYW5rWzBdICs9IDYwOyAvKiBTdGFydCBvZiBzcHJpdGUgZGF0YSAqLwotICAgICAgICAgICBpZiAoYnBwID09IDgpIHRoaXMtPmhpZGRlbi0+YmFua1swXSArPSAyMDQ4OyAvKiA4YnBwIHNwcml0ZSBoYXZlIHBhbGV0dGUgZmlyc3QgKi8KLSAgICAgICAgfQotICAgIH0gZWxzZQotCSAgdGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rID0gMDsKLQotICAgIC8vIENsZWFyIGJvdGggYmFua3MgdG8gYmxhY2sKLSAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbi0+YmFua1swXSwgMCwgaGVpZ2h0ICogY3VycmVudC0+cGl0Y2gpOwotICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLT5iYW5rWzFdLCAwLCBoZWlnaHQgKiBjdXJyZW50LT5waXRjaCk7Ci0KLSAJICAgdGhpcy0+aGlkZGVuLT5jdXJyZW50X2JhbmsgPSAwOwotCSAgIGN1cnJlbnQtPnBpeGVscyA9IHRoaXMtPmhpZGRlbi0+YmFua1swXTsKLQotICAgIC8qIEhhdmUgdG8gc2V0IHRoZSBzY3JlZW4gaGVyZSwgc28gU2V0RGV2aWNlTW9kZSB3aWxsIHBpY2sgaXQgdXAgKi8KLSAgICB0aGlzLT5zY3JlZW4gPSBjdXJyZW50OwotCi0JLyogUmVzZXQgZGV2aWNlIGZ1bmN0aW9ucyBmb3IgdGhlIHdpbXAgKi8KLQlGVUxMU0NSRUVOX1NldERldmljZU1vZGUodGhpcyk7Ci0KLS8qCUZVTExTQ1JFRU5fRGlzYWJsZUVzY2FwZSgpOyAqLwotCi0JLyogV2UncmUgZG9uZSAqLwotCXJldHVybihjdXJyZW50KTsKLX0KLQotLyogUmVzZXQgYW55IGRldmljZSBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBiZWNhdXNlIHdlIGhhdmUgcnVuIGluIFdJTVAgbW9kZSAqLwotdm9pZCBGVUxMU0NSRUVOX1NldERldmljZU1vZGUoX1RISVMpCi17Ci0JLyogVXBkYXRlIHJlY3RzIGlzIGRpZmZlcmVudCBpZiB3ZSBoYXZlIGEgYmFja2J1ZmZlciAqLwotCi0JaWYgKHJpc2Nvc19iYWNrYnVmZmVyICYmICh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gMCkKLSAgICAgIHsKLQkgICBzd2l0Y2gocmlzY29zX2JhY2tidWZmZXIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDI6IC8qIEFSTSBjb2RlIGZ1bGwgd29yZCBjb3B5ICovCi0gICAgICAgICAgICAgICBzd2l0Y2godGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDE6IC8qIDhicHAgbW9kZXMgKi8KLSAgICAgICAgICAgICAgIAkgICB0aGlzLT5VcGRhdGVSZWN0cyA9IEZVTExTQ1JFRU5fVXBkYXRlUmVjdHM4YnBwOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDI6IC8qIDE1LzE2YnBwIG1vZGVzICovCi0gICAgICAgICAgICAgICAJICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzMTZicHA7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgNDogLyogMzIgYnBwIG1vZGVzICovCi0gICAgICAgICAgICAgICAJICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzMzJicHA7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogSnVzdCBkZWZhdWx0IHRvIHRoZSBtZW1jcHkgcm91dGluZSAqLwotICAgICAgICAgICAgICAgCSAgIHRoaXMtPlVwZGF0ZVJlY3RzID0gRlVMTFNDUkVFTl9VcGRhdGVSZWN0c01lbUNweTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6IC8qIFVzZSBPUyBzcHJpdGUgcGxvdCByb3V0aW5lICovCi0gICAgICAgICAgICAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IEZVTExTQ1JFRU5fVXBkYXRlUmVjdHNPUzsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiBPbGQgYnV0IHNhZmUgbWVtY3B5ICovCi0gICAgICAgICAgICAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IEZVTExTQ1JFRU5fVXBkYXRlUmVjdHNNZW1DcHk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZQotCSAgIHRoaXMtPlVwZGF0ZVJlY3RzID0gRlVMTFNDUkVFTl9VcGRhdGVSZWN0czsgLyogRGVmYXVsdCBkbyBub3RoaW5nIGltcGxlbWVudGF0aW9uICovCi0KLQl0aGlzLT5TZXRDb2xvcnMgICA9IEZVTExTQ1JFRU5fU2V0Q29sb3JzOwotCi0JdGhpcy0+RmxpcEhXU3VyZmFjZSA9IEZVTExTQ1JFRU5fRmxpcEhXU3VyZmFjZTsKLQotCXRoaXMtPlNldENhcHRpb24gPSBGVUxMU0NSRUVOX1NldFdNQ2FwdGlvbjsKLQl0aGlzLT5TZXRJY29uID0gTlVMTDsKLQl0aGlzLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKLQkKLQl0aGlzLT5TaG93V01DdXJzb3IgPSBSSVNDT1NfU2hvd1dNQ3Vyc29yOwotCXRoaXMtPldhcnBXTUN1cnNvciA9IEZVTExTQ1JFRU5fV2FycFdNQ3Vyc29yOwotCi0JdGhpcy0+UHVtcEV2ZW50cyA9IEZVTExTQ1JFRU5fUHVtcEV2ZW50czsJCi19Ci0KLS8qIFF1ZXJ5IGZvciB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdmlkZW8gbW9kZXMgKi8KLXZvaWQgRlVMTFNDUkVFTl9CdWlsZE1vZGVMaXN0KF9USElTKQotewotCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLQljaGFyICplbnVtSW5mbyA9IE5VTEw7Ci0JY2hhciAqZW51bV9wdHI7Ci0JaW50ICpibG9ja0luZm87Ci0JaW50IGo7Ci0JaW50IG51bV9tb2RlczsKLQotCS8qIEZpbmQgb3V0IGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQgKi8KLQlyZWdzLnJbMF0gPSAyOyAvKiBSZWFzb24gY29kZSAqLwotCXJlZ3MuclsyXSA9IDA7IC8qIE51bWJlciBvZiBtb2RlcyB0byBza2lwICovCi0JcmVncy5yWzZdID0gMDsgLyogcG9pbnRlciB0byBibG9jayBvciAwIGZvciBjb3VudCAqLwotCXJlZ3Mucls3XSA9IDA7IC8qIFNpemUgb2YgYmxvY2sgaW4gYnl0ZXMgKi8KLQlfa2VybmVsX3N3aShPU19TY3JlZW5Nb2RlLCAmcmVncywgJnJlZ3MpOwotCi0gICAgbnVtX21vZGVzID0gLXJlZ3MuclsyXTsKLQotCS8qIFZpZGVvIG1lbW9yeSBzaG91bGQgYmUgaW4gcls1XSAqLwotCXRoaXMtPmluZm8udmlkZW9fbWVtID0gcmVncy5yWzVdLzEwMjQ7Ci0KLQllbnVtSW5mbyA9ICh1bnNpZ25lZCBjaGFyICopU0RMX21hbGxvYygtcmVncy5yWzddKTsKLQlpZiAoZW51bUluZm8gPT0gTlVMTCkKLQl7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm47Ci0JfQotCS8qIFJlYWQgbW9kZSBpbmZvcm1hdGlvbiBpbnRvIGJsb2NrICovCi0JcmVncy5yWzJdID0gMDsKLQlyZWdzLnJbNl0gPSAoaW50KWVudW1JbmZvOwotCXJlZ3Mucls3XSA9IC1yZWdzLnJbN107Ci0JX2tlcm5lbF9zd2koT1NfU2NyZWVuTW9kZSwgJnJlZ3MsICZyZWdzKTsKLQotCWVudW1fcHRyID0gZW51bUluZm87Ci0KLQlmb3IgKGogPTA7IGogPCBudW1fbW9kZXM7aisrKQotCXsKLQkJYmxvY2tJbmZvID0gKGludCAqKWVudW1fcHRyOwotCQlpZiAoKGJsb2NrSW5mb1sxXSAmIDI1NSkgPT0gMSkgLyogV2UgdW5kZXJzdGFuZCB0aGlzIGZvcm1hdCAqLwotCQl7Ci0JCQlzd2l0Y2goYmxvY2tJbmZvWzRdKQotCQkJewotCQkJY2FzZSAzOiAvKiA4IGJpdHMgcGVyIHBpeGVsICovCi0JCQkJRlVMTFNDUkVFTl9BZGRNb2RlKHRoaXMsIDgsIGJsb2NrSW5mb1syXSwgYmxvY2tJbmZvWzNdKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDogLyogMTUgYml0cyBwZXIgcGl4ZWwgKi8KLQkJCQlGVUxMU0NSRUVOX0FkZE1vZGUodGhpcywgMTUsIGJsb2NrSW5mb1syXSwgYmxvY2tJbmZvWzNdKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNTogLyogMzIgYml0cyBwZXIgcGl4ZWwgKi8KLQkJCQlGVUxMU0NSRUVOX0FkZE1vZGUodGhpcywgMzIsIGJsb2NrSW5mb1syXSwgYmxvY2tJbmZvWzNdKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWVudW1fcHRyICs9IGJsb2NrSW5mb1swXTsKLQl9Ci0KLQlTRExfZnJlZShlbnVtSW5mbyk7Ci0JCQotCS8qIFNvcnQgdGhlIG1vZGUgbGlzdHMgKi8KLQlmb3IgKCBqPTA7IGo8TlVNX01PREVMSVNUUzsgKytqICkgewotCQlpZiAoIFNETF9udW1tb2Rlc1tqXSA+IDAgKSB7Ci0JCQlTRExfcXNvcnQoU0RMX21vZGVsaXN0W2pdLCBTRExfbnVtbW9kZXNbal0sIHNpemVvZiAqU0RMX21vZGVsaXN0W2pdLCBjbXBtb2Rlcyk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgRlVMTFNDUkVFTl9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLSAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLSAgIHJlZ3MuclswXSA9IDE5OwotCi0gICBGVUxMU0NSRUVOX1NldERpc3BsYXlCYW5rKHRoaXMtPmhpZGRlbi0+Y3VycmVudF9iYW5rKTsKLSAgIHRoaXMtPmhpZGRlbi0+Y3VycmVudF9iYW5rIF49IDE7Ci0gICBGVUxMU0NSRUVOX1NldFdyaXRlQmFuayh0aGlzLT5oaWRkZW4tPmN1cnJlbnRfYmFuayk7Ci0gICBzdXJmYWNlLT5waXhlbHMgPSB0aGlzLT5oaWRkZW4tPmJhbmtbdGhpcy0+aGlkZGVuLT5jdXJyZW50X2JhbmtdOwotCi0gICAvKiBXYWl0IGZvciBWc3luYyAqLwotICAgX2tlcm5lbF9zd2koT1NfQnl0ZSwgJnJlZ3MsICZyZWdzKTsKLQotCXJldHVybigwKTsKLX0KLQotLyogTm90aGluZyB0byBkbyBpZiB3ZSBhcmUgd3JpdGluZyBkaXJlY3QgdG8gaGFyZHdhcmUgKi8KLXN0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotfQotCi0vKiBTYWZlIGJ1dCBzbG93ZXIgTWVtb3J5IGNvcHkgZnJvbSBvdXIgYWxsb2NhdGVkIGJhY2sgYnVmZmVyICovCi1zdGF0aWMgdm9pZCBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzTWVtQ3B5KF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLSAgICAgIGludCBqOwotICAgICAgY2hhciAqdG8sICpmcm9tOwotICAgICAgaW50IHBpdGNoID0gdGhpcy0+c2NyZWVuLT5waXRjaDsKLSAgICAgIGludCByb3c7Ci0gICAgICBpbnQgeG11bHQgPSB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBudW1yZWN0czsgaisrKQotICAgICAgewotICAgICAgICAgZnJvbSA9IHRoaXMtPmhpZGRlbi0+YmFua1swXSArIHJlY3RzLT54ICogeG11bHQgKyByZWN0cy0+eSAqIHBpdGNoOwotICAgICAgICAgdG8gID0gdGhpcy0+aGlkZGVuLT5iYW5rWzFdICsgcmVjdHMtPnggKiB4bXVsdCArIHJlY3RzLT55ICogcGl0Y2g7Ci0gICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IHJlY3RzLT5oOyByb3crKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICBTRExfbWVtY3B5KHRvLCBmcm9tLCByZWN0cy0+dyAqIHhtdWx0KTsKLSAgICAgICAgICAgICBmcm9tICs9IHBpdGNoOwotICAgICAgICAgICAgIHRvICs9IHBpdGNoOwotICAgICAgICAgfQotICAgICAgICAgcmVjdHMrKzsKLSAgICAgIH0KLX0KLQotLyogVXNlIG9wdGltaXplZCBhc3NlbWJsZXIgbWVtb3J5IGNvcHkuIERlbGliZXJhdGVseSBjb3BpZXMgZXh0cmEgY29sdW1ucyBpZgotICAgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgcmVjdGFuZ2xlIGlzIHdvcmQgYWxpZ25lZC4gKi8KLXN0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHM4YnBwKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLSAgIGludCBqOwotICAgY2hhciAqdG8sICpmcm9tOwotICAgaW50IHBpdGNoID0gdGhpcy0+c2NyZWVuLT5waXRjaDsKLSAgIGludCB3aWR0aF9ieXRlczsKLSAgIGludCBzcmNfc2tpcF9ieXRlczsKLQotICAgZm9yIChqID0gMDsgaiA8IG51bXJlY3RzOyBqKyspCi0gICB7Ci0gICAgICBmcm9tID0gdGhpcy0+aGlkZGVuLT5iYW5rWzBdICsgcmVjdHMtPnggKyByZWN0cy0+eSAqIHBpdGNoOwotICAgICAgdG8gID0gdGhpcy0+aGlkZGVuLT5iYW5rWzFdICsgcmVjdHMtPnggKyByZWN0cy0+eSAqIHBpdGNoOwotICAgICAgd2lkdGhfYnl0ZXMgPSByZWN0cy0+dzsKLSAgICAgIGlmICgoaW50KWZyb20gJiAzKQotICAgICAgewotICAgICAgICAgaW50IGV4dHJhID0gKChpbnQpZnJvbSAmIDMpOwotICAgICAgICAgZnJvbSAtPSBleHRyYTsKLSAgICAgICAgIHRvIC09IGV4dHJhOwotICAgICAgICAgd2lkdGhfYnl0ZXMgKz0gZXh0cmE7Ci0gICAgICB9Ci0gICAgICBpZiAod2lkdGhfYnl0ZXMgJiAzKSB3aWR0aF9ieXRlcyArPSA0IC0gKHdpZHRoX2J5dGVzICYgMyk7Ci0gICAgICBzcmNfc2tpcF9ieXRlcyA9IHBpdGNoIC0gd2lkdGhfYnl0ZXM7Ci0gICAgICAgICAgICAgICAKLSAgICAgIFJJU0NPU19QdXQzMih0bywgKHdpZHRoX2J5dGVzID4+IDIpLCBwaXRjaCwgKGludClyZWN0cy0+aCwgZnJvbSwgc3JjX3NraXBfYnl0ZXMpOwotICAgICAgcmVjdHMrKzsKLSAgIH0KLX0KLQotLyogVXNlIG9wdGltaXplZCBhc3NlbWJsZXIgbWVtb3J5IGNvcHkuIERlbGliZXJhdGVseSBjb3BpZXMgZXh0cmEgY29sdW1ucyBpZgotICAgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgcmVjdGFuZ2xlIGlzIHdvcmQgYWxpZ25lZC4gKi8KLXN0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHMxNmJwcChfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0gICBpbnQgajsKLSAgIGNoYXIgKnRvLCAqZnJvbTsKLSAgIGludCBwaXRjaCA9IHRoaXMtPnNjcmVlbi0+cGl0Y2g7Ci0gICBpbnQgd2lkdGhfYnl0ZXM7Ci0gICBpbnQgc3JjX3NraXBfYnl0ZXM7Ci0KLSAgIGZvciAoaiA9IDA7IGogPCBudW1yZWN0czsgaisrKQotICAgewotICAgICAgZnJvbSA9IHRoaXMtPmhpZGRlbi0+YmFua1swXSArIChyZWN0cy0+eCA8PCAxKSArIHJlY3RzLT55ICogcGl0Y2g7Ci0gICAgICB0byAgPSB0aGlzLT5oaWRkZW4tPmJhbmtbMV0gKyAocmVjdHMtPnggPDwgMSkgKyByZWN0cy0+eSAqIHBpdGNoOwotICAgICAgd2lkdGhfYnl0ZXMgPSAoKChpbnQpcmVjdHMtPncpIDw8IDEpOwotICAgICAgaWYgKChpbnQpZnJvbSAmIDMpCi0gICAgICB7Ci0gICAgICAgICBmcm9tIC09IDI7Ci0gICAgICAgICB0byAtPSAyOwotICAgICAgICAgd2lkdGhfYnl0ZXMgKz0gMjsKLSAgICAgIH0KLSAgICAgIGlmICh3aWR0aF9ieXRlcyAmIDMpIHdpZHRoX2J5dGVzICs9IDI7Ci0gICAgICBzcmNfc2tpcF9ieXRlcyA9IHBpdGNoIC0gd2lkdGhfYnl0ZXM7Ci0gICAgICAgICAgICAgICAKLSAgICAgIFJJU0NPU19QdXQzMih0bywgKHdpZHRoX2J5dGVzID4+IDIpLCBwaXRjaCwgKGludClyZWN0cy0+aCwgZnJvbSwgc3JjX3NraXBfYnl0ZXMpOwotICAgICAgcmVjdHMrKzsKLSAgIH0KLX0KLQotLyogVXNlIG9wdGltaXplZCBhc3NlbWJsZXIgbWVtb3J5IGNvcHkuIDMyIGJwcCBtb2RlcyBhcmUgYWx3YXlzIHdvcmQgYWxpZ25lZCAqLwotc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9VcGRhdGVSZWN0czMyYnBwKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLSAgIGludCBqOwotICAgY2hhciAqdG8sICpmcm9tOwotICAgaW50IHBpdGNoID0gdGhpcy0+c2NyZWVuLT5waXRjaDsKLSAgIGludCB3aWR0aDsKLQotICAgZm9yIChqID0gMDsgaiA8IG51bXJlY3RzOyBqKyspCi0gICB7Ci0gICAgICBmcm9tID0gdGhpcy0+aGlkZGVuLT5iYW5rWzBdICsgKHJlY3RzLT54IDw8IDIpICsgcmVjdHMtPnkgKiBwaXRjaDsKLSAgICAgIHRvICA9IHRoaXMtPmhpZGRlbi0+YmFua1sxXSArIChyZWN0cy0+eCA8PCAyKSArIHJlY3RzLT55ICogcGl0Y2g7Ci0gICAgICB3aWR0aCA9IChpbnQpcmVjdHMtPncgOwotICAgICAgICAgICAgICAgCi0gICAgICBSSVNDT1NfUHV0MzIodG8sIHdpZHRoLCBwaXRjaCwgKGludClyZWN0cy0+aCwgZnJvbSwgcGl0Y2ggLSAod2lkdGggPDwgMikpOwotICAgICAgcmVjdHMrKzsKLSAgIH0KLX0KLQotLyogVXNlIG9wZXJhdGluZyBzeXN0ZW0gc3ByaXRlIHBsb3RzLiBDdXJyZW50bHkgdGhpcyBpcyBtdWNoIHNsb3dlciB0aGFuIHRoZQotICAgb3RoZXIgdmFyaWFudHMgaG93ZXZlciBhY2NlbGVyYXRlZCBzcHJpdGUgcGxvdHRpbmcgY2FuIGJlIHNlZW4gb24gdGhlIGhvcml6b24KLSAgIHNvIHRoaXMgcHJlcGFyZXMgZm9yIGl0LiAqLwotc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9VcGRhdGVSZWN0c09TKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLSAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLSAgIF9rZXJuZWxfb3NlcnJvciAqZXJyOwotICAgaW50IGo7Ci0gICBpbnQgeTsKLQotICAgcmVncy5yWzBdID0gMjggKyA1MTI7Ci0gICByZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KXRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuazsKLSAgIHJlZ3MuclsyXSA9ICh1bnNpZ25lZCBpbnQpdGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rKzE2OwotICAgcmVncy5yWzVdID0gMDsKLQotICAgZm9yIChqID0gMDsgaiA8IG51bXJlY3RzOyBqKyspCi0gICB7Ci0gICAgICB5ID0gdGhpcy0+c2NyZWVuLT5oIC0gcmVjdHMtPnk7IC8qIHRvcCBvZiBjbGlwcGluZyByZWdpb24gKi8KLSAgICAgIF9rZXJuZWxfb3N3cmNoKDI0KTsgLyogU2V0IGdyYXBoaWNzIGNsaXAgcmVnaW9uICovCi0gICAgICBfa2VybmVsX29zd3JjaCgocmVjdHMtPnggPDwgdGhpcy0+aGlkZGVuLT54ZWlnKSAmIDB4RkYpOyAvKiBsZWZ0ICovCi0gICAgICBfa2VybmVsX29zd3JjaCgoKHJlY3RzLT54IDw8IHRoaXMtPmhpZGRlbi0+eGVpZykgPj4gOCkgJiAweEZGKTsKLSAgICAgIF9rZXJuZWxfb3N3cmNoKCgoeSAtIHJlY3RzLT5oKSA8PCB0aGlzLT5oaWRkZW4tPnllaWcpICYgMHhGRik7IC8qIGJvdHRvbSAqLwotICAgICAgX2tlcm5lbF9vc3dyY2goKCgoeSAtIHJlY3RzLT5oKSA8PCB0aGlzLT5oaWRkZW4tPnllaWcpPj4gOCkgJiAweEZGKTsKLSAgICAgIF9rZXJuZWxfb3N3cmNoKCgocmVjdHMtPnggKyByZWN0cy0+dyAtIDEpIDw8IHRoaXMtPmhpZGRlbi0+eGVpZykgJiAweEZGKTsgLyogcmlnaHQgKi8KLSAgICAgIF9rZXJuZWxfb3N3cmNoKCgoKHJlY3RzLT54ICsgcmVjdHMtPncgLSAxKTw8IHRoaXMtPmhpZGRlbi0+eGVpZykgPj4gOCkgJiAweEZGKTsKLSAgICAgIF9rZXJuZWxfb3N3cmNoKCgoeS0xKSA8PCB0aGlzLT5oaWRkZW4tPnllaWcpICYgMHhGRik7IC8qIHRvcCAqLwotICAgICAgX2tlcm5lbF9vc3dyY2goKCgoeS0xKSA8PCB0aGlzLT5oaWRkZW4tPnllaWcpID4+IDgpICYgMHhGRik7Ci0KLSAgICAgIHJlZ3MuclszXSA9IDA7Ci0gICAgICByZWdzLnJbNF0gPSAwOwotCi0gICAgICBpZiAoKGVyciA9IF9rZXJuZWxfc3dpKE9TX1Nwcml0ZU9wLCAmcmVncywgJnJlZ3MpKSAhPSAwKQotICAgICAgewotICAgICAgICAgcHJpbnRmKCJPU19TcHJpdGVPcCBmYWlsZWQgXG4lc1xuIixlcnItPmVycm1lc3MpOwotICAgICAgfQotCi0gICAgICByZWN0cysrOwotCi0gICAgICAvKiBSZXNldCB0byBmdWxsIHNjcmVlbiBjbGlwcGluZyAqLwotICAgICAgX2tlcm5lbF9vc3dyY2goMjQpOyAvKiBTZXQgZ3JhcGhpY3MgY2xpcCByZWdpb24gKi8KLSAgICAgIF9rZXJuZWxfb3N3cmNoKDApOyAvKiBsZWZ0ICovCi0gICAgICBfa2VybmVsX29zd3JjaCgwKTsKLSAgICAgIF9rZXJuZWxfb3N3cmNoKDApOyAvKiBib3R0b20gKi8KLSAgICAgIF9rZXJuZWxfb3N3cmNoKDApOwotICAgICAgX2tlcm5lbF9vc3dyY2goKCh0aGlzLT5zY3JlZW4tPnctMSkgPDwgdGhpcy0+aGlkZGVuLT54ZWlnKSAmIDB4RkYpOyAvKiByaWdodCAqLwotICAgICAgX2tlcm5lbF9vc3dyY2goKCgodGhpcy0+c2NyZWVuLT53LTEpIDw8IHRoaXMtPmhpZGRlbi0+eGVpZykgPj4gOCkgJiAweEZGKTsKLSAgICAgIF9rZXJuZWxfb3N3cmNoKCgodGhpcy0+c2NyZWVuLT5oLTEpIDw8IHRoaXMtPmhpZGRlbi0+eWVpZykgJiAweEZGKTsgLyogdG9wICovCi0gICAgICBfa2VybmVsX29zd3JjaCgoKCh0aGlzLT5zY3JlZW4tPmgtMSkgPDwgdGhpcy0+aGlkZGVuLT55ZWlnKSA+PiA4KSAmIDB4RkYpOwotICAgfQotfQotCi0KLWludCBGVUxMU0NSRUVOX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKLXsKLQlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7Ci0JaW50IHBhbGV0dGVbMjU2XTsKLQotCXJlZ3MuclswXSA9IC0xOwotCXJlZ3MuclsxXSA9IC0xOwotCXJlZ3MuclsyXSA9IChpbnQpcGFsZXR0ZTsKLQlyZWdzLnJbM10gPSAxMDI0OwotCXJlZ3Mucls0XSA9IDA7Ci0JX2tlcm5lbF9zd2koQ29sb3VyVHJhbnNfUmVhZFBhbGV0dGUsICZyZWdzLCAmcmVncyk7Ci0KLQl3aGlsZShuY29sb3JzLS0pCi0JewotCQlwYWxldHRlW2ZpcnN0Y29sb3JdID0gKChjb2xvcnMtPmIpIDw8IDI0KSB8ICgoY29sb3JzLT5nKSA8PCAxNikgfCAoKGNvbG9ycy0+cikgPDwgOCk7Ci0JCWZpcnN0Y29sb3IrKzsKLQkJY29sb3JzKys7Ci0JfQotCi0JcmVncy5yWzBdID0gLTE7Ci0JcmVncy5yWzFdID0gLTE7Ci0JcmVncy5yWzJdID0gKGludClwYWxldHRlOwotCXJlZ3MuclszXSA9IDA7Ci0JcmVncy5yWzRdID0gMDsKLQlfa2VybmVsX3N3aShDb2xvdXJUcmFuc19Xcml0ZVBhbGV0dGUsICZyZWdzLCAmcmVncyk7Ci0KLQlyZXR1cm4oMSk7Ci19Ci0KLQotc3RhdGljIGludCBjbXBtb2Rlcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCi17Ci0gICAgU0RMX1JlY3QgKmEgPSAqKFNETF9SZWN0ICoqKXZhOwotICAgIFNETF9SZWN0ICpiID0gKihTRExfUmVjdCAqKil2YjsKLSAgICBpZihhLT53ID09IGItPncpCi0gICAgICAgIHJldHVybiBiLT5oIC0gYS0+aDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBiLT53IC0gYS0+dzsKLX0KLQotc3RhdGljIGludCBGVUxMU0NSRUVOX0FkZE1vZGUoX1RISVMsIGludCBicHAsIGludCB3LCBpbnQgaCkKLXsKLQlTRExfUmVjdCAqbW9kZTsKLQlpbnQgaSwgaW5kZXg7Ci0JaW50IG5leHRfbW9kZTsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBtb2RlICovCi0JaWYgKCBicHAgPCA4ICkgeyAgLyogTm90IHN1cHBvcnRlZCAqLwotCQlyZXR1cm4oMCk7Ci0JfQotCWluZGV4ID0gKChicHArNykvOCktMTsKLQlmb3IgKCBpPTA7IGk8U0RMX251bW1vZGVzW2luZGV4XTsgKytpICkgewotCQltb2RlID0gU0RMX21vZGVsaXN0W2luZGV4XVtpXTsKLQkJaWYgKCAobW9kZS0+dyA9PSB3KSAmJiAobW9kZS0+aCA9PSBoKSApIHsKLQkJCXJldHVybigwKTsKLQkJfQotCX0KLQotCS8qIFNldCB1cCB0aGUgbmV3IHZpZGVvIG1vZGUgcmVjdGFuZ2xlICovCi0JbW9kZSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mICptb2RlKTsKLQlpZiAoIG1vZGUgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCW1vZGUtPnggPSAwOwotCW1vZGUtPnkgPSAwOwotCW1vZGUtPncgPSB3OwotCW1vZGUtPmggPSBoOwotCi0JLyogQWxsb2NhdGUgdGhlIG5ldyBsaXN0IG9mIG1vZGVzLCBhbmQgZmlsbCBpbiB0aGUgbmV3IG1vZGUgKi8KLQluZXh0X21vZGUgPSBTRExfbnVtbW9kZXNbaW5kZXhdOwotCVNETF9tb2RlbGlzdFtpbmRleF0gPSAoU0RMX1JlY3QgKiopCi0JICAgICAgIFNETF9yZWFsbG9jKFNETF9tb2RlbGlzdFtpbmRleF0sICgxK25leHRfbW9kZSsxKSpzaXplb2YoU0RMX1JlY3QgKikpOwotCWlmICggU0RMX21vZGVsaXN0W2luZGV4XSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJU0RMX251bW1vZGVzW2luZGV4XSA9IDA7Ci0JCVNETF9mcmVlKG1vZGUpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZV0gPSBtb2RlOwotCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlKzFdID0gTlVMTDsKLQlTRExfbnVtbW9kZXNbaW5kZXhdKys7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgRlVMTFNDUkVFTl9TZXRXcml0ZUJhbmsoaW50IGJhbmspCi17Ci0gICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7Ci0gICByZWdzLnJbMF0gPSAxMTI7Ci0gICByZWdzLnJbMV0gPSBiYW5rKzE7Ci0gICBfa2VybmVsX3N3aShPU19CeXRlLCAmcmVncywgJnJlZ3MpOwotfQotCi12b2lkIEZVTExTQ1JFRU5fU2V0RGlzcGxheUJhbmsoaW50IGJhbmspCi17Ci0gICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7Ci0gICByZWdzLnJbMF0gPSAxMTM7Ci0gICByZWdzLnJbMV0gPSBiYW5rKzE7Ci0gICBfa2VybmVsX3N3aShPU19CeXRlLCAmcmVncywgJnJlZ3MpOwotfQotCi0KLS8qKiBEaXNhYmxlIHNwZWNpYWwgZXNjYXBlIGtleSBwcm9jZXNzaW5nICovCi1zdGF0aWMgdm9pZCBGVUxMU0NSRUVOX0Rpc2FibGVFc2NhcGUoKQotewotICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOwotICAgcmVncy5yWzBdID0gMjI5OwotICAgcmVncy5yWzFdID0gMTsKLSAgIHJlZ3MuclsyXSA9IDA7Ci0gICBfa2VybmVsX3N3aShPU19CeXRlLCAmcmVncywgJnJlZ3MpOwotICAKLX0KLQotLyoqIEVuYWJsZSBzcGVjaWFsIGVzY2FwZSBrZXkgcHJvY2Vzc2luZyAqLwotc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9FbmFibGVFc2NhcGUoKQotewotICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOwotICAgcmVncy5yWzBdID0gMjI5OwotICAgcmVncy5yWzFdID0gMDsKLSAgIHJlZ3MuclsyXSA9IDA7Ci0gICBfa2VybmVsX3N3aShPU19CeXRlLCAmcmVncywgJnJlZ3MpOwotICAKLX0KLQotLyoqIFN0b3JlIGNhcHRpb24gaW4gY2FzZSB0aGlzIGlzIGNhbGxlZCBiZWZvcmUgd2UgY3JlYXRlIGEgd2luZG93ICovCi12b2lkIEZVTExTQ1JFRU5fU2V0V01DYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKLXsKLQlTRExfc3RybGNweSh0aGlzLT5oaWRkZW4tPnRpdGxlLCB0aXRsZSwgU0RMX2FycmF5c2l6ZSh0aGlzLT5oaWRkZW4tPnRpdGxlKSk7Ci19Ci0KLS8qIFNldCBzY3JlZW4gbW9kZQotKgotKiAgUmV0dXJucyAxIGlmIG1vZGUgaXMgc2V0IG9rLCBvdGhlcndpc2UgMAotKi8KLQotaW50IEZVTExTQ1JFRU5fU2V0TW9kZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApCi17Ci0gICBTQ1JFRU5NT0RFQkxPQ0sgc21iOwotICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOwotCi0gICBzbWIuZmxhZ3MgPSAxOwotICAgc21iLnhfcGl4ZWxzID0gd2lkdGg7Ci0gICBzbWIueV9waXhlbHMgPSBoZWlnaHQ7Ci0gICBzbWIubW9kZV92YXJzWzBdID0gLTE7Ci0KLSAgIHN3aXRjaChicHApCi0gICB7Ci0JY2FzZSA4OgotCQlzbWIucGl4ZWxfZGVwdGggPSAzOwotCQkvKiBOb3RlOiBOZWVkIHRvIHNldCBNb2RlRmxhZ3MgdG8gMTI4IGFuZCBOQ29sb3VyIHZhcmlhYmxlcyB0byAyNTUgZ2V0IGZ1bGwgOCBiaXQgcGFsZXR0ZSAqLwotCQlzbWIubW9kZV92YXJzWzBdID0gMDsgc21iLm1vZGVfdmFyc1sxXSA9IDEyODsgLyogTW9kZSBmbGFncyAqLwotCQlzbWIubW9kZV92YXJzWzJdID0gMzsgc21iLm1vZGVfdmFyc1szXSA9IDI1NTsgLyogTkNvbG91ciAobnVtYmVyIG9mIGNvbG91cnMgLTEpICovCi0JCXNtYi5tb2RlX3ZhcnNbNF0gPSAtMTsgLyogRW5kIG9mIGxpc3QgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIDE1OgotCWNhc2UgMTY6Ci0JCXNtYi5waXhlbF9kZXB0aCA9IDQ7Ci0JCWJyZWFrOwotCi0JY2FzZSAzMjoKLQkJc21iLnBpeGVsX2RlcHRoID0gNTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlTRExfU2V0RXJyb3IoIlBpeGVsIGRlcHRoIG5vdCBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotICAgfQotICAgCi0gICBzbWIuZnJhbWVfcmF0ZSA9IC0xOwotCi0gICByZWdzLnJbMF0gPSAwOwotICAgcmVncy5yWzFdID0gKGludCkmc21iOwotCi0gICBpZiAoX2tlcm5lbF9zd2koT1NfU2NyZWVuTW9kZSwgJnJlZ3MsICZyZWdzKSAhPSAwKQotICAgewotCSAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IHJlcXVlc3RlZCBtb2RlIik7Ci0JICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgICAvKiBUdXJuIGN1cnNvciBvZmYqLwotICAgIF9rZXJuZWxfb3N3cmNoKDIzKTtfa2VybmVsX29zd3JjaCgxKTtfa2VybmVsX29zd3JjaCgwKTsKLSAgICBfa2VybmVsX29zd3JjaCgwKTtfa2VybmVsX29zd3JjaCgwKTtfa2VybmVsX29zd3JjaCgwKTsKLSAgICBfa2VybmVsX29zd3JjaCgwKTtfa2VybmVsX29zd3JjaCgwKTtfa2VybmVsX29zd3JjaCgwKTsKLSAgICBfa2VybmVsX29zd3JjaCgwKTtfa2VybmVsX29zd3JjaCgwKTsKLQotICAgcmV0dXJuIDE7Ci19Ci0KLS8qIEdldCBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBzY3JlZW4gYmFua3MgKi8KLXZvaWQgRlVMTFNDUkVFTl9TZXR1cEJhbmtzKF9USElTKQotewotICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOwotICAgaW50IGJsb2NrWzVdOwotICAgYmxvY2tbMF0gPSAxNDg7IC8qIFdyaXRlIHNjcmVlbiBzdGFydCAqLwotICAgYmxvY2tbMV0gPSAxNDk7IC8qIERpc3BsYXkgc2NyZWVuIHN0YXJ0ICovCi0gICBibG9ja1syXSA9IDQ7ICAvKiBYIGVpZyBmYWN0b3IgKi8KLSAgIGJsb2NrWzNdID0gNTsgIC8qIFkgZWlnIGZhY3RvciAqLwotICAgYmxvY2tbNF0gPSAtMTsgIC8qIEVuZCBvZiBsaXN0IG9mIHZhcmlhYmxlcyB0byByZXF1ZXN0ICovCi0KLSAgIHJlZ3MuclswXSA9IChpbnQpYmxvY2s7Ci0gICByZWdzLnJbMV0gPSAoaW50KWJsb2NrOwotICAgX2tlcm5lbF9zd2koT1NfUmVhZFZkdVZhcmlhYmxlcywgJnJlZ3MsICZyZWdzKTsKLQotICAgdGhpcy0+aGlkZGVuLT5iYW5rWzBdID0gKHZvaWQgKilibG9ja1swXTsKLSAgIHRoaXMtPmhpZGRlbi0+YmFua1sxXSA9ICh2b2lkICopYmxvY2tbMV07Ci0gICB0aGlzLT5oaWRkZW4tPnhlaWcgPSBibG9ja1syXTsKLSAgIHRoaXMtPmhpZGRlbi0+eWVpZyA9IGJsb2NrWzNdOwotfQotCi0vKiBUb2dnbGUgdG8gZnVsbCBzY3JlZW4gbW9kZSBmcm9tIHRoZSBXSU1QICovCi0KLWludCBGVUxMU0NSRUVOX1RvZ2dsZUZyb21XaW1wKF9USElTKQotewotICAgaW50IHdpZHRoID0gdGhpcy0+c2NyZWVuLT53OwotICAgaW50IGhlaWdodCA9IHRoaXMtPnNjcmVlbi0+aDsKLSAgIGludCBicHAgPSB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCi0gICBSSVNDT1NfU3RvcmVXaW1wTW9kZSgpOwotICAgaWYgKEZVTExTQ1JFRU5fU2V0TW9kZSh3aWR0aCwgaGVpZ2h0LCBicHApKQotICAgewotICAgICAgIGNoYXIgKmJ1ZmZlciA9IHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuazsgLyogVGhpcyBpcyBzdGFydCBvZiBzcHJpdGUgZGF0YSAqLwotICAgICAgIC8qIFN1cHBvcnQgYmFjayBidWZmZXIgbW9kZSBvbmx5ICovCi0gICAgICAgaWYgKHJpc2Nvc19iYWNrYnVmZmVyID09IDApIHJpc2Nvc19iYWNrYnVmZmVyID0gMTsKLQotICAgICAgIEZVTExTQ1JFRU5fU2V0dXBCYW5rcyh0aGlzKTsKLQotICAgICAgIHRoaXMtPmhpZGRlbi0+YmFua1swXSA9IGJ1ZmZlciArIDYwOyAvKiBTdGFydCBvZiBzcHJpdGUgZGF0YSAqLwotICAgICAgIGlmIChicHAgPT0gOCkgdGhpcy0+aGlkZGVuLT5iYW5rWzBdICs9IDIwNDg7IC8qIDhicHAgc3ByaXRlIGhhdmUgcGFsZXR0ZSBmaXJzdCAqLwotCi0JICAgdGhpcy0+aGlkZGVuLT5jdXJyZW50X2JhbmsgPSAwOwotCSAgIHRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gdGhpcy0+aGlkZGVuLT5iYW5rWzBdOwotCi0gICAgICAgLyogQ29weSBiYWNrIGJ1ZmZlciB0byBzY3JlZW4gbWVtb3J5ICovCi0gICAgICAgU0RMX21lbWNweSh0aGlzLT5oaWRkZW4tPmJhbmtbMV0sIHRoaXMtPmhpZGRlbi0+YmFua1swXSwgd2lkdGggKiBoZWlnaHQgKiB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCk7Ci0KLSAgICAgICBGVUxMU0NSRUVOX1NldERldmljZU1vZGUodGhpcyk7Ci0gICAgICAgcmV0dXJuIDE7Ci0gICB9IGVsc2UKLSAgICAgIFJJU0NPU19SZXN0b3JlV2ltcE1vZGUoKTsKLQotICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYmNkNDQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc2V2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICAgICBGaWxlIGFkZGVkIGJ5IEFsYW4gQnVja2xleSAoYWxhbl9iYWFAaG90bWFpbC5jb20pIGZvciBSSVNDIE9TIGNvbXBhdGFiaWxpdHkKLQkgMjcgTWFyY2ggMjAwMwotCi0gICAgIEltcGxlbWVudHMga2V5Ym9hcmQgc2V0dXAsIGV2ZW50IHB1bXAgYW5kIGtleWJvYXJkIGFuZCBtb3VzZSBwb2xsaW5nCi0qLwotCi0KLSNpbmNsdWRlICJTREwuaCIKLSNpbmNsdWRlICIuLi8uLi90aW1lci9TRExfdGltZXJfYy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIi4uL1NETF9jdXJzb3JfYy5oIgotI2luY2x1ZGUgIlNETF9yaXNjb3N2aWRlby5oIgotI2luY2x1ZGUgIlNETF9yaXNjb3NldmVudHNfYy5oIgotCi0jaW5jbHVkZSAibWVtb3J5LmgiCi0jaW5jbHVkZSAic3RkbGliLmgiCi0jaW5jbHVkZSAiY3R5cGUuaCIKLQotI2luY2x1ZGUgImtlcm5lbC5oIgotI2luY2x1ZGUgInN3aXMuaCIKLQotLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gYSBSSVNDIE9TIGludGVybmFsIGtleSBudW1iZXJzIHRvIGEgU0RMIGtleXN5bSAqLwotc3RhdGljIFNETEtleSBST19rZXltYXBbU0RMS19MQVNUXTsKLQotLyogUklTQyBPUyBLZXkgY29kZXMgKi8KLSNkZWZpbmUgUk9LRVlfU0hJRlQgMAotI2RlZmluZSBST0tFWV9DVFJMICAxCi0jZGVmaW5lIFJPS0VZX0FMVCAgIDIKLS8qIExlZnQgc2hpZnQgaXMgZmlyc3Qga2V5IHdlIHdpbGwgY2hlY2sgZm9yICovCi0jZGVmaW5lIFJPS0VZX0xFRlRfU0hJRlQgMwotCi0vKiBOZWVkIHRvIGlnbm9yZSBtb3VzZSBidXR0b25zIGFzIHRoZXkgYXJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5ICovCi0jZGVmaW5lIFJPS0VZX0xFRlRfTU9VU0UgICA5Ci0jZGVmaW5lIFJPS0VZX0NFTlRSRV9NT1VTRSAxMAotI2RlZmluZSBST0tFWV9SSUdIVF9NT1VTRSAgMTEKLQotLyogTm8ga2V5IGhhcyBiZWVuIHByZXNzZWQgcmV0dXJuIHZhbHVlKi8KLSNkZWZpbmUgUk9LRVlfTk9ORSAyNTUKLQotLyogSWQgb2YgbGFzdCBrZXkgaW4ga2V5Ym9hcmQgKi8KLSNkZWZpbmUgUk9LRVlfTEFTVF9LRVkgIDEyNAotCi0vKiBTaXplIG9mIGFycmF5IGZvciBhbGwga2V5cyAqLwotI2RlZmluZSBST0tFWUJEX0FSUkFZU0laRSAxMjUKLQotc3RhdGljIGNoYXIgUk9fcHJlc3NlZFtST0tFWUJEX0FSUkFZU0laRV07Ci0KLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IGludGtleSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgcHJlc3NlZCk7Ci0KLXZvaWQgUklTQ09TX1BvbGxNb3VzZShfVEhJUyk7Ci12b2lkIFJJU0NPU19Qb2xsS2V5Ym9hcmQoKTsKLQotdm9pZCBSSVNDT1NfUG9sbE1vdXNlSGVscGVyKF9USElTLCBpbnQgZnVsbHNjcmVlbik7Ci0KLSNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAotZXh0ZXJuIHZvaWQgRFJlbmRlcmVyX0ZpbGxCdWZmZXJzKCk7Ci0KLS8qIFRpbWVyIHJ1bm5pbmcgZnVuY3Rpb24gKi8KLWV4dGVybiB2b2lkIFJJU0NPU19DaGVja1RpbWVyKCk7Ci0KLSNlbmRpZgotCi12b2lkIEZVTExTQ1JFRU5fUHVtcEV2ZW50cyhfVEhJUykKLXsKLSAgICAvKiBDdXJyZW50IGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGtleWJvYXJkIGFuZCBtb3VzZSBwb2xsaW5nICovCi0JUklTQ09TX1BvbGxLZXlib2FyZCgpOwotCVJJU0NPU19Qb2xsTW91c2UodGhpcyk7Ci0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLS8vCURSZW5kZXJlcl9GaWxsQnVmZmVycygpOwotCWlmIChTRExfdGltZXJfcnVubmluZykgUklTQ09TX0NoZWNrVGltZXIoKTsKLSNlbmRpZgotfQotCi0KLXZvaWQgUklTQ09TX0luaXRPU0tleW1hcChfVEhJUykKLXsKLQlpbnQgaTsKLQotCS8qIE1hcCB0aGUgVksga2V5c3ltcyAqLwotCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKFJPX2tleW1hcCk7ICsraSApCi0JCVJPX2tleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKLQotICBST19rZXltYXBbM10gPSBTRExLX0xTSElGVDsKLSAgUk9fa2V5bWFwWzRdID0gU0RMS19MQ1RSTDsKLSAgUk9fa2V5bWFwWzVdID0gU0RMS19MQUxUOwotICBST19rZXltYXBbNl0gPSBTRExLX1JTSElGVDsKLSAgUk9fa2V5bWFwWzddID0gU0RMS19SQ1RSTDsKLSAgUk9fa2V5bWFwWzhdID0gU0RMS19SQUxUOwotICBST19rZXltYXBbMTZdID0gU0RMS19xOwotICBST19rZXltYXBbMTddID0gU0RMS18zOwotICBST19rZXltYXBbMThdID0gU0RMS180OwotICBST19rZXltYXBbMTldID0gU0RMS181OwotICBST19rZXltYXBbMjBdID0gU0RMS19GNDsKLSAgUk9fa2V5bWFwWzIxXSA9IFNETEtfODsKLSAgUk9fa2V5bWFwWzIyXSA9IFNETEtfRjc7Ci0gIFJPX2tleW1hcFsyM10gPSBTRExLX01JTlVTLAotICBST19rZXltYXBbMjVdID0gU0RMS19MRUZUOwotICBST19rZXltYXBbMjZdID0gU0RMS19LUDY7Ci0gIFJPX2tleW1hcFsyN10gPSBTRExLX0tQNzsKLSAgUk9fa2V5bWFwWzI4XSA9IFNETEtfRjExOwotICBST19rZXltYXBbMjldID0gU0RMS19GMTI7Ci0gIFJPX2tleW1hcFszMF0gPSBTRExLX0YxMDsKLSAgUk9fa2V5bWFwWzMxXSA9IFNETEtfU0NST0xMT0NLOwotICBST19rZXltYXBbMzJdID0gU0RMS19QUklOVDsKLSAgUk9fa2V5bWFwWzMzXSA9IFNETEtfdzsKLSAgUk9fa2V5bWFwWzM0XSA9IFNETEtfZTsKLSAgUk9fa2V5bWFwWzM1XSA9IFNETEtfdDsKLSAgUk9fa2V5bWFwWzM2XSA9IFNETEtfNzsKLSAgUk9fa2V5bWFwWzM3XSA9IFNETEtfaTsKLSAgUk9fa2V5bWFwWzM4XSA9IFNETEtfOTsKLSAgUk9fa2V5bWFwWzM5XSA9IFNETEtfMDsKLSAgUk9fa2V5bWFwWzQxXSA9IFNETEtfRE9XTjsKLSAgUk9fa2V5bWFwWzQyXSA9IFNETEtfS1A4OwotICBST19rZXltYXBbNDNdID0gU0RMS19LUDk7Ci0gIFJPX2tleW1hcFs0NF0gPSBTRExLX0JSRUFLOwotICBST19rZXltYXBbNDVdID0gU0RMS19CQUNLUVVPVEU7Ci0vKiAgUk9fa2V5bWFwWzQ2XSA9IFNETEtfY3VycmVuY3k7IFRPRE86IEZpZ3VyZSBvdXQgaWYgdGhpcyBoYXMgYSB2YWx1ZSAqLwotICBST19rZXltYXBbNDddID0gU0RMS19CQUNLU1BBQ0U7Ci0gIFJPX2tleW1hcFs0OF0gPSBTRExLXzE7Ci0gIFJPX2tleW1hcFs0OV0gPSBTRExLXzI7Ci0gIFJPX2tleW1hcFs1MF0gPSBTRExLX2Q7Ci0gIFJPX2tleW1hcFs1MV0gPSBTRExLX3I7Ci0gIFJPX2tleW1hcFs1Ml0gPSBTRExLXzY7Ci0gIFJPX2tleW1hcFs1M10gPSBTRExLX3U7Ci0gIFJPX2tleW1hcFs1NF0gPSBTRExLX287Ci0gIFJPX2tleW1hcFs1NV0gPSBTRExLX3A7Ci0gIFJPX2tleW1hcFs1Nl0gPSBTRExLX0xFRlRCUkFDS0VUOwotICBST19rZXltYXBbNTddID0gU0RMS19VUDsKLSAgUk9fa2V5bWFwWzU4XSA9IFNETEtfS1BfUExVUzsKLSAgUk9fa2V5bWFwWzU5XSA9IFNETEtfS1BfTUlOVVM7Ci0gIFJPX2tleW1hcFs2MF0gPSBTRExLX0tQX0VOVEVSOwotICBST19rZXltYXBbNjFdID0gU0RMS19JTlNFUlQ7Ci0gIFJPX2tleW1hcFs2Ml0gPSBTRExLX0hPTUU7Ci0gIFJPX2tleW1hcFs2M10gPSBTRExLX1BBR0VVUDsKLSAgUk9fa2V5bWFwWzY0XSA9IFNETEtfQ0FQU0xPQ0s7Ci0gIFJPX2tleW1hcFs2NV0gPSBTRExLX2E7Ci0gIFJPX2tleW1hcFs2Nl0gPSBTRExLX3g7Ci0gIFJPX2tleW1hcFs2N10gPSBTRExLX2Y7Ci0gIFJPX2tleW1hcFs2OF0gPSBTRExLX3k7Ci0gIFJPX2tleW1hcFs2OV0gPSBTRExLX2o7Ci0gIFJPX2tleW1hcFs3MF0gPSBTRExLX2s7Ci0gIFJPX2tleW1hcFs3Ml0gPSBTRExLX1NFTUlDT0xPTjsKLSAgUk9fa2V5bWFwWzczXSA9IFNETEtfUkVUVVJOOwotICBST19rZXltYXBbNzRdID0gU0RMS19LUF9ESVZJREU7Ci0gIFJPX2tleW1hcFs3Nl0gPSBTRExLX0tQX1BFUklPRDsKLSAgUk9fa2V5bWFwWzc3XSA9IFNETEtfTlVNTE9DSzsKLSAgUk9fa2V5bWFwWzc4XSA9IFNETEtfUEFHRURPV047Ci0gIFJPX2tleW1hcFs3OV0gPSBTRExLX1FVT1RFOwotICBST19rZXltYXBbODFdID0gU0RMS19zOwotICBST19rZXltYXBbODJdID0gU0RMS19jOwotICBST19rZXltYXBbODNdID0gU0RMS19nOwotICBST19rZXltYXBbODRdID0gU0RMS19oOwotICBST19rZXltYXBbODVdID0gU0RMS19uOwotICBST19rZXltYXBbODZdID0gU0RMS19sOwotICBST19rZXltYXBbODddID0gU0RMS19TRU1JQ09MT047Ci0gIFJPX2tleW1hcFs4OF0gPSBTRExLX1JJR0hUQlJBQ0tFVDsKLSAgUk9fa2V5bWFwWzg5XSA9IFNETEtfREVMRVRFOwotICBST19rZXltYXBbOTBdID0gU0RMS19LUF9NSU5VUzsKLSAgUk9fa2V5bWFwWzkxXSA9IFNETEtfS1BfTVVMVElQTFk7Ci0gIFJPX2tleW1hcFs5M10gPSBTRExLX0VRVUFMUzsKLSAgUk9fa2V5bWFwWzk0XSA9IFNETEtfQkFDS1NMQVNIOwotICBST19rZXltYXBbOTZdID0gU0RMS19UQUI7Ci0gIFJPX2tleW1hcFs5N10gPSBTRExLX3o7Ci0gIFJPX2tleW1hcFs5OF0gPSBTRExLX1NQQUNFOwotICBST19rZXltYXBbOTldID0gU0RMS192OwotICBST19rZXltYXBbMTAwXSA9IFNETEtfYjsKLSAgUk9fa2V5bWFwWzEwMV0gPSBTRExLX207Ci0gIFJPX2tleW1hcFsxMDJdID0gU0RMS19DT01NQTsKLSAgUk9fa2V5bWFwWzEwM10gPSBTRExLX1BFUklPRDsKLSAgUk9fa2V5bWFwWzEwNF0gPSBTRExLX1NMQVNIOwotICBST19rZXltYXBbMTA1XSA9IFNETEtfRU5EOwotICBST19rZXltYXBbMTA2XSA9IFNETEtfS1AwOwotICBST19rZXltYXBbMTA3XSA9IFNETEtfS1AxOwotICBST19rZXltYXBbMTA4XSA9IFNETEtfS1AzOwotICBST19rZXltYXBbMTEyXSA9IFNETEtfRVNDQVBFOwotICBST19rZXltYXBbMTEzXSA9IFNETEtfRjE7Ci0gIFJPX2tleW1hcFsxMTRdID0gU0RMS19GMjsKLSAgUk9fa2V5bWFwWzExNV0gPSBTRExLX0YzOwotICBST19rZXltYXBbMTE2XSA9IFNETEtfRjU7Ci0gIFJPX2tleW1hcFsxMTddID0gU0RMS19GNjsKLSAgUk9fa2V5bWFwWzExOF0gPSBTRExLX0Y4OwotICBST19rZXltYXBbMTE5XSA9IFNETEtfRjk7Ci0gIFJPX2tleW1hcFsxMjBdID0gU0RMS19IQVNIOwotICBST19rZXltYXBbMTIxXSA9IFNETEtfUklHSFQ7Ci0gIFJPX2tleW1hcFsxMjJdID0gU0RMS19LUDQ7Ci0gIFJPX2tleW1hcFsxMjNdID0gU0RMS19LUDU7Ci0gIFJPX2tleW1hcFsxMjRdID0gU0RMS19LUDI7Ci0KLSAgU0RMX21lbXNldChST19wcmVzc2VkLCAwLCBST0tFWUJEX0FSUkFZU0laRSk7Ci19Ci0KLQotLyogVmFyaWFibGUgZm9yIG1vdXNlIHJlbGF0aXZlIHByb2Nlc3NpbmcgKi8KLWludCBtb3VzZV9yZWxhdGl2ZSA9IDA7Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGVudGVyIG9yIGxlYXZlIG1vdXNlIHJlbGF0aXZlIG1vZGUgKi8KLQotdm9pZCBSSVNDT1NfQ2hlY2tNb3VzZU1vZGUoX1RISVMpCi17Ci0gICAgLyogSWYgdGhlIG1vdXNlIGlzIGhpZGRlbiBhbmQgaW5wdXQgaXMgZ3JhYmJlZCwgd2UgdXNlIHJlbGF0aXZlIG1vZGUgKi8KLSAgICBpZiAoICEoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICYmCi0gICAgICAgICh0aGlzLT5pbnB1dF9ncmFiICE9IFNETF9HUkFCX09GRikgKSB7Ci0gICAgICAgICAgICBtb3VzZV9yZWxhdGl2ZSA9IDE7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtb3VzZV9yZWxhdGl2ZSA9IDA7Ci0gICAgIH0KLX0KLQotCi12b2lkIFJJU0NPU19Qb2xsTW91c2UoX1RISVMpCi17Ci0gICBSSVNDT1NfUG9sbE1vdXNlSGVscGVyKHRoaXMsIDEpOwotfQotCi1leHRlcm4gaW50IG1vdXNlSW5XaW5kb3c7Ci0KLXZvaWQgV0lNUF9Qb2xsTW91c2UoX1RISVMpCi17Ci0gICAvKiBPbmx5IHBvbGwgd2hlbiBtb3VzZSBpcyBvdmVyIHRoZSB3aW5kb3cgKi8KLSAgIGlmICghbW91c2VJbldpbmRvdykgcmV0dXJuOwotCi0gICBSSVNDT1NfUG9sbE1vdXNlSGVscGVyKHRoaXMsIDApOwotfQotCi0vKiBTdGF0aWMgdmFyaWFibGVzIHNvIG9ubHkgY2hhbmdlcyBhcmUgcmVwb3J0ZWQgKi8KLXN0YXRpYyBTaW50MTYgbGFzdF94ID0gLTEsIGxhc3RfeSA9IC0xOwotc3RhdGljIGludCBsYXN0X2J1dHRvbnMgPSAwOwotCi0vKiBTaGFyZSByb3V0aW5lIGJldHdlZW4gV0lNUCBhbmQgRlVMTFNDUkVFTiBmb3IgcG9sbGluZyBtb3VzZSBhbmQKLSAgIHBhc3Npbmcgb24gZXZlbnRzICovCi12b2lkIFJJU0NPU19Qb2xsTW91c2VIZWxwZXIoX1RISVMsIGludCBmdWxsc2NyZWVuKQotewotICAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLSAgICBzdGF0aWMgaW50IHN0YXJ0aW5nID0gMTsKLQotICAgIGlmIChfa2VybmVsX3N3aShPU19Nb3VzZSwgJnJlZ3MsICZyZWdzKSA9PSBOVUxMKQotICAgIHsKLSAgICAgICBTaW50MTYgbmV3X3ggPSByZWdzLnJbMF07IC8qIEluaXRpYWx5IGdldCBhcyBPUyB1bml0cyAqLwotICAgICAgIFNpbnQxNiBuZXdfeSA9IHJlZ3MuclsxXTsKLQotICAgICAgIC8qIERpc2NhcmQgbW91c2UgZXZlbnRzIHVudGlsIHRoZXkgbGV0IGdvIG9mIHRoZSBtb3VzZSBhZnRlciBzdGFydGluZyAqLwotICAgICAgIGlmIChzdGFydGluZyAmJiByZWdzLnJbMl0gIT0gMCkKLSAgICAgICAgIHJldHVybjsKLSAgICAgICBlbHNlCi0gICAgICAgICBzdGFydGluZyA9IDA7Ci0KLSAgICAgICBpZiAobmV3X3ggIT0gbGFzdF94IHx8IG5ld195ICE9IGxhc3RfeSB8fCBsYXN0X2J1dHRvbnMgIT0gcmVncy5yWzJdKQotICAgICAgIHsKLSAgICAgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZCBzbyBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBldmVudHMgKi8KLSAgICAgICAgICBpbnQgdG9wTGVmdFgsIHRvcExlZnRZOyAgLyogVG9wIGxlZnQgT1MgdW5pdHMgKi8KLSAgICAgICAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAgLyogTW91c2UgcG9zaXRpb24gaW4gU0RMIHBpeGVscyAqLwotCi0gICAgICAgICAgaWYgKGZ1bGxzY3JlZW4pCi0gICAgICAgICAgewotICAgICAgICAgICAgIHRvcExlZnRYID0gMDsKLSAgICAgICAgICAgICB0b3BMZWZ0WSA9ICh0aGlzLT5oaWRkZW4tPmhlaWdodCA8PCB0aGlzLT5oaWRkZW4tPnllaWcpIC0gMTsKLSAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgaW50IHdpbmRvd19zdGF0ZVs5XTsKLQotCSAgICAgICAgIC8qIEdldCBjdXJyZW50IHdpbmRvdyBzdGF0ZSAqLwotCQkgICAgIHdpbmRvd19zdGF0ZVswXSA9IHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZTsKLQkJICAgICByZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KXdpbmRvd19zdGF0ZTsKLQkJICAgICBfa2VybmVsX3N3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAmcmVncywgJnJlZ3MpOwotCi0gICAgICAgICAgICAgdG9wTGVmdFggPSB3aW5kb3dfc3RhdGVbMV07Ci0gICAgICAgICAgICAgdG9wTGVmdFkgPSB3aW5kb3dfc3RhdGVbNF07Ci0gICAgICAgICAgfQotCi0JCSAgLyogQ29udmVydCBjby1vcmRpbmF0ZXMgdG8gd29ya3NwYWNlICovCi0JCSAgeCA9IG5ld194IC0gdG9wTGVmdFg7Ci0gICAgICAgICAgeSA9IHRvcExlZnRZIC0gbmV3X3k7IC8qIFkgZ29lcyBmcm9tIHRvcCBvZiB3aW5kb3cvc2NyZWVuICovCi0KLQkgCSAgLyogQ29udmVydCBPUyB1bml0cyB0byBwaXhlbHMgKi8KLQkgICAgICB4ID4+PSB0aGlzLT5oaWRkZW4tPnhlaWc7Ci0JCSAgeSA+Pj0gdGhpcy0+aGlkZGVuLT55ZWlnOwotCi0gICAgICAgICAgaWYgKGxhc3RfeCAhPSBuZXdfeCB8fCBsYXN0X3kgIT0gbmV3X3kpCi0gICAgICAgICAgewotICAgICAgICAgICAgIGlmIChtb3VzZV9yZWxhdGl2ZSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGNlbnRyZV94ID0gU0RMX1ZpZGVvU3VyZmFjZS0+dy8yOwotICAgICAgICAgICAgICAgIGludCBjZW50cmVfeSA9IFNETF9WaWRlb1N1cmZhY2UtPmgvMjsKLQotICAgICAgICAgICAgICAgIGlmIChjZW50cmVfeCAhPSB4IHx8IGNlbnRyZV95ICE9IHkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmIChTRExfVmlkZW9TdXJmYWNlKSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsMSx4IC0gY2VudHJlX3gsIHkgLSBjZW50cmVfeSk7Ci0gICAgICAgICAgICAgICAgICAgbGFzdF94ID0gdG9wTGVmdFggKyAoY2VudHJlX3ggPDwgdGhpcy0+aGlkZGVuLT54ZWlnKTsKLSAgICAgICAgICAgICAgICAgICBsYXN0X3kgPSB0b3BMZWZ0WSAtIChjZW50cmVfeSA8PCB0aGlzLT5oaWRkZW4tPnllaWcpOwotCi0gICAgICAgICAgICAgICAgICAgLyogUmUtY2VudHJlIHRoZSBtb3VzZSBwb2ludGVyLCBzbyB3ZSBzdGlsbCBnZXQgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICBtb3ZlbWVudCB3aGVuIHRoZSBtb3VzZSBpcyBhdCB0aGUgZWRnZSBvZiB0aGUgd2luZG93Ci0gICAgICAgICAgICAgICAgICAgICAgb3Igc2NyZWVuLgotICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYmxvY2tbNV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICBibG9ja1swXSA9IDM7IC8qIE9TV09SRCBtb3ZlIHBvaW50ZXIgc3ViLXJlYXNvbiBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgYmxvY2tbMV0gPSBsYXN0X3ggJiAweEZGOwotICAgICAgICAgICAgICAgICAgICAgIGJsb2NrWzJdID0gKGxhc3RfeCA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgICAgICAgYmxvY2tbM10gPSBsYXN0X3kgJiAweEZGOwotICAgICAgICAgICAgICAgICAgICAgIGJsb2NrWzRdID0gKGxhc3RfeSA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIHJlZ3MuclswXSA9IDIxOyAvKiBPU1dPUkQgcG9pbnRlciBzdHVmZiBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgcmVncy5yWzFdID0gKGludClibG9jazsKLSAgICAgICAgICAgICAgICAgICAgICBfa2VybmVsX3N3aShPU19Xb3JkLCAmcmVncywgJnJlZ3MpOwotICAgICAgICAgICAgICAgCSAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhc3RfeCA9IG5ld194OwotICAgICAgICAgICAgICAgIGxhc3RfeSA9IG5ld195OwotICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwwLHgseSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChsYXN0X2J1dHRvbnMgIT0gcmVncy5yWzJdKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBpbnQgY2hhbmdlZCA9IGxhc3RfYnV0dG9ucyBeIHJlZ3MuclsyXTsKLSAgICAgICAgICAgICBsYXN0X2J1dHRvbnMgPSByZWdzLnJbMl07Ci0gICAgICAgICAgICAgaWYgKGNoYW5nZWQgJiA0KSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKChsYXN0X2J1dHRvbnMgJiA0KSA/IFNETF9QUkVTU0VEIDogU0RMX1JFTEVBU0VELCBTRExfQlVUVE9OX0xFRlQsIDAsIDApOwotICAgICAgICAgICAgIGlmIChjaGFuZ2VkICYgMikgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigobGFzdF9idXR0b25zICYgMikgPyBTRExfUFJFU1NFRCA6IFNETF9SRUxFQVNFRCwgU0RMX0JVVFRPTl9NSURETEUsIDAsIDApOwotICAgICAgICAgICAgIGlmIChjaGFuZ2VkICYgMSkgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigobGFzdF9idXR0b25zICYgMSkgPyBTRExfUFJFU1NFRCA6IFNETF9SRUxFQVNFRCwgU0RMX0JVVFRPTl9SSUdIVCwgMCwgMCk7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgUklTQ09TX1BvbGxLZXlib2FyZCgpCi17Ci0JaW50IHdoaWNoX2tleSA9IFJPS0VZX0xFRlRfU0hJRlQ7Ci0JaW50IGo7Ci0JaW50IG1pbl9rZXksIG1heF9rZXk7Ci0JU0RMX2tleXN5bSBrZXk7Ci0KLQkvKiBTY2FuIHRoZSBrZXlib2FyZCB0byBzZWUgd2hhdCBpcyBwcmVzc2VkICovCi0Jd2hpbGUgKHdoaWNoX2tleSA8PSBST0tFWV9MQVNUX0tFWSkKLQl7Ci0JCXdoaWNoX2tleSA9IChfa2VybmVsX29zYnl0ZSgxMjEsIHdoaWNoX2tleSwgMCkgJiAweEZGKTsKLQkgICAgaWYgKHdoaWNoX2tleSAhPSBST0tFWV9OT05FKQotCSAgICB7Ci0JCSAgICBzd2l0Y2god2hpY2hfa2V5KQotCQkgICAgewotCQkgICAgLyogU2tpcCBvdmVyIG1vdXNlIGtleXMgKi8KLQkJICAgIGNhc2UgUk9LRVlfTEVGVF9NT1VTRToKLQkJICAgIGNhc2UgUk9LRVlfQ0VOVFJFX01PVVNFOgotCQkgICAgY2FzZSBST0tFWV9SSUdIVF9NT1VTRToKLQkJCQl3aGljaF9rZXkgPSBST0tFWV9SSUdIVF9NT1VTRTsKLQkJCQlicmVhazsKLQotICAgICAgICAgICAgLyogSWdub3JlIGtleXMgdGhhdCBjYXVzZSAyIGludGVybmFsIG51bWJlciB0byBiZSBnZW5lcmF0ZWQgKi8KLQkJCWNhc2UgNzE6IGNhc2UgMjQ6IGNhc2UgODc6IGNhc2UgNDA6Ci0JCQkgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIElnbm9yZSBicmVhayBhcyBpdCBjYW4gYmUgbGF0Y2hlZCBvbiAqLwotICAgICAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlST19wcmVzc2VkW3doaWNoX2tleV0gKz0gMjsKLQkJCQlicmVhazsKLQkJICAgIH0KLQkJCXdoaWNoX2tleSsrOwotCQl9Ci0JfQotCi0JLyogR2VuZXJhdGUga2V5IHJlbGVhc2VkIG1lc3NhZ2VzICovCi0JbWluX2tleSA9IFJPS0VZX0xBU1RfS0VZKzE7Ci0JbWF4X2tleSA9IFJPS0VZX0xFRlRfU0hJRlQ7Ci0KLQlmb3IgKGogPSBST0tFWV9MRUZUX1NISUZUOyBqIDw9IFJPS0VZX0xBU1RfS0VZOyBqKyspCi0JewotCQlpZiAoUk9fcHJlc3NlZFtqXSkKLQkJewotCQkJaWYgKFJPX3ByZXNzZWRbal0gPT0gMSkKLQkJCXsKLQkJCQlST19wcmVzc2VkW2pdID0gMDsKLQkJCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgVHJhbnNsYXRlS2V5KGosJmtleSwwKSk7Ci0JCQl9IGVsc2UgCi0JCQl7Ci0JCQkJaWYgKGogPCBtaW5fa2V5KSBtaW5fa2V5ID0gajsKLQkJCQlpZiAoaiA+IG1heF9rZXkpIG1heF9rZXkgPSBqOwotCQkJfQotCQl9Ci0JfQotCi0JLyogR2VuZXJhdGUga2V5IHByZXNzZWQgbWVzc2FnZXMgKi8KLQlmb3IgKGogPSBtaW5fa2V5OyBqIDw9IG1heF9rZXk7IGorKykKLQl7Ci0JCWlmIChST19wcmVzc2VkW2pdKQotCQl7Ci0JCQlpZiAoUk9fcHJlc3NlZFtqXSA9PSAyKQotCQkJewotCQkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsVHJhbnNsYXRlS2V5KGosJmtleSwxKSk7Ci0JCQl9Ci0JCQlST19wcmVzc2VkW2pdID0gMTsKLQkJfQotCX0KLX0KLQotc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgaW50a2V5LCBTRExfa2V5c3ltICprZXlzeW0sIGludCBwcmVzc2VkKQotewotCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCi0Ja2V5c3ltLT5zY2FuY29kZSA9ICh1bnNpZ25lZCBjaGFyKSBpbnRrZXk7Ci0Ja2V5c3ltLT5zeW0gPSBST19rZXltYXBbaW50a2V5XTsKLQlrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKLQlrZXlzeW0tPnVuaWNvZGUgPSAwOwotCWlmICggcHJlc3NlZCAmJiBTRExfVHJhbnNsYXRlVU5JQ09ERSApCi0JewotCQlpbnQgc3RhdGU7Ci0JCWludCBjaDsKLQotCQlzdGF0ZSA9IChfa2VybmVsX29zYnl0ZSgyMDIsIDAsIDI1NSkgJiAweEZGKTsKLQotCQkvKlRPRE86IFRha2UgaW50byBhY2NvdW50IG90aGVyIGtleWJvYXJkIGxheW91dHMgKi8KLQotCQljaCA9IGtleXN5bS0+c3ltOyAvKiBUaGlzIHNob3VsZCBoYW5kbGUgbW9zdCB1bnNoaWZ0ZWQga2V5cyAqLwotCi0gICAgICAgIGlmIChpbnRrZXkgPCA5IHx8IGNoID09IFNETEtfVU5LTk9XTikKLSAgICAgICAgewotICAgICAgICAgICBjaCA9IDA7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAmIDY0KSAvKiBDb250cm9sIG9uICovCi0JCXsKLQkJCWNoID0gY2ggJiAzMTsKLQotCQl9IGVsc2UgCi0JCXsKLQkJCWludCB0b3BPZktleSA9IDA7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgJiA4KSAvKiBTaGlmdCBvbiAqLwotCQkJewotCQkJCXRvcE9mS2V5ID0gMTsKLQkJCX0KLQotCQkJaWYgKChzdGF0ZSAmIDE2KSA9PSAwKSAvKiBDYXBzIGxvY2sgaXMgb24gKi8KLQkJCXsKLQkJCSAgIGlmIChjaCA+PSBTRExLX2EgJiYgY2ggPD0gU0RMS196KQotCQkJICAgewotIAkJCQkgIGlmICgoc3RhdGUgJiAxMjgpID09IDApIC8qIFNoaWZ0IEVuYWJsZSBvZmYgKi8KLQkJCQkgIHsKLQkJCQkgICAgIC8qIEFsbCBsZXR0ZXIgYmVjb21lIHVwcGVyIGNhc2UgKi8KLQkJCQkgCSB0b3BPZktleSA9IDE7Ci0JCQkJICB9IGVsc2UKLQkJCQkgIHsKLQkJCQkgICAgIC8qIFNoaWZ0K0xldHRlcnMgZ2l2ZXMgbG93ZXIgY2FzZSAqLwotCQkJCSAgICAgdG9wT2ZLZXkgPSAxIC0gdG9wT2ZLZXk7Ci0JCQkJICB9Ci0JCSAgICAgICB9Ci0JCQl9Ci0KLQkJCWlmICh0b3BPZktleSkKLQkJCXsKLQkJCQkvKiBLZXkgcHJvZHVjZWQgd2l0aCBzaGlmdCBoZWxkIGRvd24gKi8KLQotCQkJCS8qIExldHRlcnMganVzdCBnaXZlIHVwcGVyIGNhc2UgdmVyc2lvbiAqLwotCQkJCWlmIChjaCA+PSBTRExLX2EgJiYgY2ggPD0gU0RMS196KSBjaCA9IHRvdXBwZXIoY2gpOwotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXN3aXRjaChjaCkKLQkJCQkJewotCQkJCQljYXNlIFNETEtfSEFTSDogICBjaCA9ICd+JzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS19RVU9URTogIGNoID0gJ0AnOyBicmVhazsKLQkJCQkJY2FzZSBTRExLX0NPTU1BOiAgY2ggPSAnPCc7IGJyZWFrOwotCQkJCQljYXNlIFNETEtfTUlOVVM6ICBjaCA9ICdfJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS19QRVJJT0Q6IGNoID0gJz4nOyBicmVhazsKLQkJCQkJY2FzZSBTRExLX1NMQVNIOiAgY2ggPSAnPyc7IGJyZWFrOwotCi0JCQkJCWNhc2UgU0RMS18wOiBjaCA9ICcpJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS18xOiBjaCA9ICchJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS18yOiBjaCA9ICciJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS18zOiBjaCA9ICejJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS180OiBjaCA9ICckJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS181OiBjaCA9ICclJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS182OiBjaCA9ICdeJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS183OiBjaCA9ICcmJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS184OiBjaCA9ICcqJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS185OiBjaCA9ICcoJzsgYnJlYWs7Ci0KLQkJCQkJY2FzZSBTRExLX1NFTUlDT0xPTjogICAgY2ggPSAnOic7IGJyZWFrOwotCQkJCQljYXNlIFNETEtfRVFVQUxTOiAgICAgICBjaCA9ICcrJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS19MRUZUQlJBQ0tFVDogIGNoID0gJ3snOyBicmVhazsKLQkJCQkJY2FzZSBTRExLX0JBQ0tTTEFTSDogICAgY2ggPSAnfCc7IGJyZWFrOwotCQkJCQljYXNlIFNETEtfUklHSFRCUkFDS0VUOiBjaCA9ICd9JzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS19CQUNLUVVPVEU6ICAgIGNoID0gJ6wnOyBicmVhazsKLQotCQkJCQlkZWZhdWx0OgotCQkJCQkJY2ggPSAwOyAvKiBNYXAgdG8gemVybyBjaGFyYWN0ZXIgaWYgd2UgZG9uJ3QgdW5kZXJzdGFuZCBpdCAqLwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSBpZiAoY2ggPiAxMjYpCi0JCQl7Ci0JCQkJLyogU0RMIGtleSBjb2RlIDwgMTI2IG1hcCBkaXJlY3RseSBvbnRvIHRoZWlyIFVuaWNvZGUgZXF1aXZhbGVudHMgKi8KLQkJCQkvKiBLZXlwYWQgMCB0byA5IG1hcHMgdG8gbnVtZXJpYyBlcXVpdmFsZW50ICovCi0JCQkJaWYgKGNoID49IFNETEtfS1AwICYmIGNoIDw9IFNETEtfS1A5KSBjaCA9IGNoIC0gU0RMS19LUDAgKyAnMCc7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLyogRm9sbG93aW5nIHN3aXRjaCBtYXBzIG90aGVyIGtleXMgdGhhdCBwcm9kdWNlIGFuIEFzY2lpIHZhbHVlICovCi0JCQkJCXN3aXRjaChjaCkKLQkJCQkJewotCQkJCQljYXNlIFNETEtfS1BfUEVSSU9EOiAgIGNoID0gJy4nOyBicmVhazsKLQkJCQkJY2FzZSBTRExLX0tQX0RJVklERTogICBjaCA9ICcvJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS19LUF9NVUxUSVBMWTogY2ggPSAnKic7IGJyZWFrOwotCQkJCQljYXNlIFNETEtfS1BfTUlOVVM6ICAgIGNoID0gJy0nOyBicmVhazsKLQkJCQkJY2FzZSBTRExLX0tQX1BMVVM6ICAgICBjaCA9ICcrJzsgYnJlYWs7Ci0JCQkJCWNhc2UgU0RMS19LUF9FUVVBTFM6ICAgY2ggPSAnPSc7IGJyZWFrOwotCi0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQkvKiBJZiB3ZSBkb24ndCBrbm93IHdoYXQgaXQgaXMgc2V0IHRoZSBVbmljb2RlIHRvIDAgKi8KLQkJCQkJCWNoID0gMDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCQkJCi0JCWtleXN5bS0+dW5pY29kZSA9IGNoOwotCX0KLQlyZXR1cm4oa2V5c3ltKTsKLX0KLQotLyogZW5kIG9mIFNETF9yaXNjb3NldmVudHMuYyAuLi4gKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjYmY1Yi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zZXZlbnRzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3Jpc2Nvc3ZpZGVvLmgiCi0KLS8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFNETF9zeXNldmVudHMuYyB0byBvdGhlciBwYXJ0cyAKLSAgIG9mIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIChTRExfc3lzdmlkZW8uYykKLSovCi1leHRlcm4gdm9pZCBSSVNDT1NfSW5pdE9TS2V5bWFwKF9USElTKTsKLWV4dGVybiB2b2lkIEZVTExTQ1JFRU5fUHVtcEV2ZW50cyhfVEhJUyk7Ci1leHRlcm4gdm9pZCBXSU1QX1B1bXBFdmVudHMoX1RISVMpOwotCi0vKiBlbmQgb2YgU0RMX251bGxldmVudHNfYy5oIC4uLiAqLwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3Ntb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjM2NGEzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3Ntb3VzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICAgICBGaWxlIGFkZGVkIGJ5IEFsYW4gQnVja2xleSAoYWxhbl9iYWFAaG90bWFpbC5jb20pIGZvciBSSVNDIE9TIGNvbXBhdGFiaWxpdHkKLQkgMjcgTWFyY2ggMjAwMwotCi0gICAgIEltcGxlbWVudHMgbW91c2UgY3Vyc29yIHNoYXBlIGRlZmluaXRpb25zIGFuZCBwb3NpdGlvbmluZwotKi8KLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotI2luY2x1ZGUgIlNETF9yaXNjb3Ntb3VzZV9jLmgiCi0KLSNpbmNsdWRlICJrZXJuZWwuaCIKLSNpbmNsdWRlICJzd2lzLmgiCi0KLXN0YXRpYyBXTWN1cnNvciAqY3VycmVudF9jdXJzb3IgPSBOVUxMOwotc3RhdGljIFdNY3Vyc29yICpkZWZpbmVkX2N1cnNvciA9IE5VTEw7Ci0KLWV4dGVybiBpbnQgbW91c2VJbldpbmRvdzsKLQotLyogQXJlYSB0byBzYXZlIGN1cnNvciBwYWxldHRlIGNvbG91cnMgY2hhbmdlZCBieSBTREwuCi0gICBBY3R1YWwgdmFsdWVzIHdpbGwgYmUgcmVhZCBiZWZvcmUgd2UgY2hhbmdlIHRvIHRoZSBTREwgY3Vyc29yICovCi1zdGF0aWMgVWludDggd2ltcF9jdXJzb3JfcGFsZXR0ZVsyXVs1XSA9IHsKLSAgezEsIDI1LCAyNTUsIDI1NSwgMjU1fSwKLSAgezMsIDI1LCAyNTUsIDI1NSwgMjU1fQotfTsKLQotc3RhdGljIGludCBjdXJzb3JfcGFsZXR0ZV9zYXZlZCA9IDA7Ci0KLXZvaWQgV0lNUF9TYXZlQ3Vyc29yUGFsZXR0ZSgpOwotdm9pZCBXSU1QX1Jlc3RvcmVXaW1wQ3Vyc29yKCk7Ci12b2lkIFdJTVBfU2V0U0RMQ3Vyc29yUGFsZXR0ZSgpOwotCi0KLXZvaWQgUklTQ09TX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKLXsKLSAgICBTRExfZnJlZShjdXJzb3ItPmRhdGEpOwotCVNETF9mcmVlKGN1cnNvcik7Ci19Ci0KLVdNY3Vyc29yICpSSVNDT1NfQ3JlYXRlV01DdXJzb3IoX1RISVMsCi0JCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKLXsKLQlXTWN1cnNvciAqY3Vyc29yOwotCVVpbnQ4ICpjdXJzb3JfZGF0YTsKLQlVaW50OCAqcHRyOwotCWludCBpLGosazsKLQlpbnQgZGF0YV9ieXRlLCBtYXNrX2J5dGU7Ci0KLQkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGN1cnNvciBzaXplIGlzIG9rYXkgKi8KLQlpZiAoICh3ID4gMzIpIHx8IChoID4gMzIpICkgewotCQlTRExfU2V0RXJyb3IoIk9ubHkgd2l0aCB3aWR0aCBhbmQgaGVpZ2h0IDw9IDMyIHBpeGVscyBhcmUgYWxsb3dlZCIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogQWxsb2NhdGUgdGhlIGN1cnNvciAqLwotCWN1cnNvciA9IChXTWN1cnNvciAqKVNETF9tYWxsb2Moc2l6ZW9mKCpjdXJzb3IpKTsKLQlpZiAoIGN1cnNvciA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIk91dCBvZiBtZW1vcnkiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIE5vdGU6IFNETCBzYXlzIHdpZHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4ICovCi0JY3Vyc29yX2RhdGEgPSBTRExfbWFsbG9jKHcvNCAqIGgpOwotCWlmIChjdXJzb3JfZGF0YSA9PSBOVUxMKQotCXsKLQkJU0RMX2ZyZWUoY3Vyc29yKTsKLQkJU0RMX1NldEVycm9yKCJPdXQgb2YgbWVtb3J5Iik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQljdXJzb3ItPncgPSB3OwotCWN1cnNvci0+aCA9IGg7Ci0JY3Vyc29yLT5ob3RfeCA9IGhvdF94OwotCWN1cnNvci0+aG90X3kgPSBob3RfeTsKLQljdXJzb3ItPmRhdGEgPSBjdXJzb3JfZGF0YTsKLQotCi0vKiBEYXRhIC8gTWFzayBSZXN1bHRpbmcgcGl4ZWwgb24gc2NyZWVuIAotICAgMCAvIDEgV2hpdGUgCi0gICAxIC8gMSBCbGFjayAKLSAgIDAgLyAwIFRyYW5zcGFyZW50IAotICAgMSAvIDAgSW52ZXJ0ZWQgY29sb3IgaWYgcG9zc2libGUsIGJsYWNrIGlmIG5vdC4gCi0qLwotCXB0ciA9IGN1cnNvcl9kYXRhOwotCi0JZm9yICggaT0wOyBpPGg7ICsraSApCi0JewotCQlmb3IgKGogPSAwOyBqIDwgdy84OyArK2opCi0JCXsKLQkJCWRhdGFfYnl0ZSA9ICpkYXRhOwotCQkJbWFza19ieXRlID0gKm1hc2s7Ci0JCQkqcHRyKysgPSAwOyAvKiBTZXRzIHdob2xlIGJ5dGUgdHJhbnNwYXJlbnQgKi8KLQkJCSpwdHIgPSAwOwotCQkJZm9yIChrID0gMDsgayA8IDg7IGsrKykKLQkJCXsKLQkJCQkoKnB0cikgPDw9IDI7Ci0JCQkJaWYgKGRhdGFfYnl0ZSAmIDEpICpwdHIgfD0gMzsgLyogQmxhY2sgb3IgaW52ZXJ0ZWQgKi8KLQkJCQllbHNlIGlmKG1hc2tfYnl0ZSAmIDEpICpwdHIgfD0gMTsgLyogV2hpdGUgKi8KLQkJCQlpZiAoKGsmMykgPT0gMykgcHRyLS07Ci0JCQkJZGF0YV9ieXRlID4+PSAxOwotCQkJCW1hc2tfYnl0ZSA+Pj0gMTsKLQkJCX0KLQotICAgICAgICAgICAgcHRyKz0zOwotCQkgICAgZGF0YSsrOwotCQkgICAgbWFzaysrOwotCQl9Ci0JfQotCi0JcmV0dXJuKGN1cnNvcik7Ci19Ci0KLWludCBSSVNDT1NfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotCWN1cnJlbnRfY3Vyc29yID0gY3Vyc29yOwotCi0JaWYgKGN1cnNvciA9PSBOVUxMKQotCXsKLQkJX2tlcm5lbF9vc2J5dGUoMTA2LDAsMCk7Ci0JCWRlZmluZWRfY3Vyc29yID0gTlVMTDsKLQl9IGVsc2UKLQl7Ci0gICAgICAgIFdNY3Vyc29yICpvbGRfY3Vyc29yID0gZGVmaW5lZF9jdXJzb3I7Ci0KLQkJaWYgKGN1cnNvciAhPSBkZWZpbmVkX2N1cnNvcikKLQkJewotCQkJVWludDggY3Vyc29yX2RlZlsxMF07Ci0KLQkJCWN1cnNvcl9kZWZbMF0gPSAwOwotCQkJY3Vyc29yX2RlZlsxXSA9IDI7IC8qIFVzZSBzaGFwZSBudW1iZXIgMiAqLwotCQkJY3Vyc29yX2RlZlsyXSA9IGN1cnNvci0+dy80OyAvKiBXaWR0aCBpbiBieXRlcyAqLwotCQkJY3Vyc29yX2RlZlszXSA9IGN1cnNvci0+aDsgLyogSGVpZ2h0IChoKSBpbiBwaXhlbHMgKi8KLQkJCWN1cnNvcl9kZWZbNF0gPSBjdXJzb3ItPmhvdF94OyAvKiBBY3RpdmVYIGluIHBpeGVscyBmcm9tIGxlZnQgKi8KLQkJCWN1cnNvcl9kZWZbNV0gPSBjdXJzb3ItPmhvdF95OyAvKiBBY3RpdmVZIGluIHBpeGVscyBmcm9tIHRvcCAqLwotCQkJY3Vyc29yX2RlZls2XSA9ICgoaW50KShjdXJzb3ItPmRhdGEpICYgMHhGRik7ICAgICAgIC8qIExlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgcG9pbnRlciB0byBkYXRhICovCi0JCQljdXJzb3JfZGVmWzddID0gKChpbnQpKGN1cnNvci0+ZGF0YSkgPj4gOCkgJiAweEZGOyAgLyogLi4uICovCi0JCQljdXJzb3JfZGVmWzhdID0gKChpbnQpKGN1cnNvci0+ZGF0YSkgPj4gMTYpICYgMHhGRjsgLyogLi4uICovCi0JCQljdXJzb3JfZGVmWzldID0gKChpbnQpKGN1cnNvci0+ZGF0YSkgPj4gMjQpICYgMHhGRjsgLyogTW9zdCBzaWduaWZpY2FudCBieXRlIG9mIHBvaW50ZXIgdG8gZGF0YSAqLwotCi0JCQlpZiAoX2tlcm5lbF9vc3dvcmQoMjEsIChpbnQgKiljdXJzb3JfZGVmKSAhPSAwKQotCQkJewotCQkJCVNETF9TZXRFcnJvcigiUklTQ09TIGNvdWxkbid0IGNyZWF0ZSB0aGUgY3Vyc29yIHRvIHNob3ciKTsKLQkJCQlyZXR1cm4oMCk7Ci0JCQl9Ci0JCQlkZWZpbmVkX2N1cnNvciA9IGN1cnNvcjsKLQkJfQotCi0gICAgICAgIGlmIChvbGRfY3Vyc29yID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHRpbWUgb3IgcmVzaG93IGluIHdpbmRvdywgc28gc2F2ZS9zZXR1cCBwYWxldHRlICovCi0gICAgICAgICAgICBpZiAoIWN1cnNvcl9wYWxldHRlX3NhdmVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdJTVBfU2F2ZUN1cnNvclBhbGV0dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFdJTVBfU2V0U0RMQ3Vyc29yUGFsZXR0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgX2tlcm5lbF9vc2J5dGUoMTA2LCAyLCAwKTsgICAgICAgIAotCX0KLQkKLQlyZXR1cm4oMSk7Ci19Ci0KLXZvaWQgRlVMTFNDUkVFTl9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSkKLXsKLQlVaW50OCBtb3ZlX2Jsb2NrWzVdOwotCWludCBlaWdfYmxvY2tbM107Ci0JX2tlcm5lbF9zd2lfcmVncyByZWdzOwotCWludCBvc194LCBvc195OwotCi0JZWlnX2Jsb2NrWzBdID0gNDsgIC8qIFggZWlnIGZhY3RvciAqLwotCWVpZ19ibG9ja1sxXSA9IDU7ICAvKiBZIGVpZyBmYWN0b3IgKi8KLQllaWdfYmxvY2tbMl0gPSAtMTsgIC8qIEVuZCBvZiBsaXN0IG9mIHZhcmlhYmxlcyB0byByZXF1ZXN0ICovCi0KLSAgICByZWdzLnJbMF0gPSAoaW50KWVpZ19ibG9jazsKLSAgICByZWdzLnJbMV0gPSAoaW50KWVpZ19ibG9jazsKLSAgICBfa2VybmVsX3N3aShPU19SZWFkVmR1VmFyaWFibGVzLCAmcmVncywgJnJlZ3MpOwotCi0Jb3NfeCA9IHggPDwgZWlnX2Jsb2NrWzBdOwotCW9zX3kgPSB5IDw8IGVpZ19ibG9ja1sxXTsKLQotCW1vdmVfYmxvY2tbMF0gPSAzOyAvKiBNb3ZlIGN1cnNvciAqLwotCW1vdmVfYmxvY2tbMV0gPSBvc194ICYgMHhGRjsKLQltb3ZlX2Jsb2NrWzJdID0gKG9zX3ggPj4gOCkgJiAweEZGOwotCW1vdmVfYmxvY2tbM10gPSBvc195ICYgMHhGRjsKLQltb3ZlX2Jsb2NrWzRdID0gKG9zX3kgPj4gOCkgJiAweEZGOwotCi0JX2tlcm5lbF9vc3dvcmQoMjEsIChpbnQgKiltb3ZlX2Jsb2NrKTsKLQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHgsIHkpOwotfQotCi0KLS8qIFJlc2hvdyBjdXJzb3Igd2hlbiBtb3VzZSByZS1lbnRlcnMgdGhlIHdpbmRvdyAqLwotdm9pZCBXSU1QX1Jlc2hvd0N1cnNvcihfVEhJUykKLXsKLQlkZWZpbmVkX2N1cnNvciA9IE5VTEw7Ci0gICAgY3Vyc29yX3BhbGV0dGVfc2F2ZWQgPSAwOwotCVJJU0NPU19TaG93V01DdXJzb3IodGhpcywgY3VycmVudF9jdXJzb3IpOwotfQotCi12b2lkIFdJTVBfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCi17Ci0JX2tlcm5lbF9zd2lfcmVncyByZWdzOwotCWludCB3aW5kb3dfc3RhdGVbOV07Ci0JY2hhciBibG9ja1s1XTsKLQlpbnQgb3NYLCBvc1k7Ci0KLQl3aW5kb3dfc3RhdGVbMF0gPSB0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGU7Ci0JcmVncy5yWzFdID0gKHVuc2lnbmVkIGludCl3aW5kb3dfc3RhdGU7Ci0JX2tlcm5lbF9zd2koV2ltcF9HZXRXaW5kb3dTdGF0ZSwgJnJlZ3MsICZyZWdzKTsKLQotCSBvc1ggPSAoeCA8PCB0aGlzLT5oaWRkZW4tPnhlaWcpICsgd2luZG93X3N0YXRlWzFdOwotCSBvc1kgPSB3aW5kb3dfc3RhdGVbNF0gLSAoeSA8PCB0aGlzLT5oaWRkZW4tPnllaWcpOwotCi0JYmxvY2tbMF0gPSAzOwotCWJsb2NrWzFdID0gb3NYICYgMHhGRjsKLQlibG9ja1syXSA9IChvc1ggPj4gOCkgJiAweEZGOwotCWJsb2NrWzNdID0gb3NZICYgMHhGRjsKLQlibG9ja1s0XSA9IChvc1kgPj4gOCkgJiAweEZGOwotCi0JcmVncy5yWzBdID0gMjE7Ci0JcmVncy5yWzFdID0gKGludClibG9jazsKLQlfa2VybmVsX3N3aShPU19Xb3JkLCAmcmVncywgJnJlZ3MpOwotCVNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgeCwgeSk7Ci19Ci0KLWludCBXSU1QX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKLXsKLQlpZiAobW91c2VJbldpbmRvdykgcmV0dXJuIFJJU0NPU19TaG93V01DdXJzb3IodGhpcywgY3Vyc29yKTsKLQllbHNlIGN1cnJlbnRfY3Vyc29yID0gY3Vyc29yOwotCi0JcmV0dXJuIDE7Ci19Ci0KLVNETF9HcmFiTW9kZSBSSVNDT1NfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSkKLXsKLSAgIC8qIEluIGZ1bGxzY3JlZW4gbW9kZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nICovCi0gICBpZiAobW9kZSA8IFNETF9HUkFCX0ZVTExTQ1JFRU4pCi0gICB7Ci0gICAgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGJsb2NrWzldOwotICAgICAgYmxvY2tbMF0gPSAxOyAvKiBEZWZpbmUgbW91c2UgY3Vyc29yIGJvdW5kaW5nIGJsb2NrICovCi0KLSAgICAgIGlmICggbW9kZSA9PSBTRExfR1JBQl9PRkYgKQotICAgICAgewotICAgICAgICAgLyogQ2xpcCB0byB3aG9sZSBzY3JlZW4gKi8KLQotICAgICAgICAgaW50IHIgPSAodGhpcy0+aGlkZGVuLT5zY3JlZW5fd2lkdGggPDwgdGhpcy0+aGlkZGVuLT54ZWlnKSAtIDE7Ci0gICAgICAgICBpbnQgdCA9ICh0aGlzLT5oaWRkZW4tPnNjcmVlbl9oZWlnaHQgPDwgdGhpcy0+aGlkZGVuLT55ZWlnKSAtIDE7Ci0KLQkgYmxvY2tbMV0gPSAwOyBibG9ja1syXSA9IDA7IC8qIExlZnQqLwotICAgICAgICAgYmxvY2tbM10gPSAwOyBibG9ja1s0XSA9IDA7IC8qIEJvdHRvbSAqLwotICAgICAgICAgYmxvY2tbNV0gPSByICYgMHhGRjsgYmxvY2tbNl0gPSAociA+PiA4KSAmIDB4RkY7IC8qIFJpZ2h0ICovCi0gICAgICAgICBibG9ja1s3XSA9IHQgJiAweEZGOyBibG9ja1s4XSA9ICh0ID4+IDgpICYgMHhGRjsgLyogVG9wICovCi0gICAgICB9IGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogQ2xpcCB0byB3aW5kb3cgKi8KLSAgICAgICAJdW5zaWduZWQgY2hhciB3aW5kb3dfc3RhdGVbMzZdOwotCi0JKigoaW50ICopd2luZG93X3N0YXRlKSA9IHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZTsKLQlyZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KXdpbmRvd19zdGF0ZTsKLQlfa2VybmVsX3N3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAmcmVncywgJnJlZ3MpOwotCi0gICAgICAgIGJsb2NrWzFdID0gd2luZG93X3N0YXRlWzRdOwotICAgICAgICBibG9ja1syXSA9IHdpbmRvd19zdGF0ZVs1XTsKLSAgICAgICAgYmxvY2tbM10gPSB3aW5kb3dfc3RhdGVbOF07Ci0gICAgICAgIGJsb2NrWzRdID0gd2luZG93X3N0YXRlWzldOwotICAgICAgICBibG9ja1s1XSA9IHdpbmRvd19zdGF0ZVsxMl07Ci0gICAgICAgIGJsb2NrWzZdID0gd2luZG93X3N0YXRlWzEzXTsKLSAgICAgICAgYmxvY2tbN10gPSB3aW5kb3dfc3RhdGVbMTZdOwotICAgICAgICBibG9ja1s4XSA9IHdpbmRvd19zdGF0ZVsxN107Ci0KLSAgICAgIH0KLQotICAgICAgcmVncy5yWzBdID0gMjE7IC8qIE9TIHdvcmQgY29kZSAqLwotICAgICAgcmVncy5yWzFdID0gKGludClibG9jazsKLSAgICAgIF9rZXJuZWxfc3dpKE9TX1dvcmQsICZyZWdzLCAmcmVncyk7Ci0gICB9Ci0KLSAgIHJldHVybiBtb2RlOwotfQotCi0vKiBTYXZlIG1vdXNlIGN1cnNvciBwYWxldHRlIHRvIGJlIHJlc3RvcmUgd2hlbiB3ZSBhcmUgbm8gbG9uZ2VyCi0gICBkZWZpbmluZyBhIGN1cnNvciAqLwotCi12b2lkIFdJTVBfU2F2ZUN1cnNvclBhbGV0dGUoKQotewotICAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLSAgICBpbnQgY29sb3VyOwotCi0gICAgZm9yIChjb2xvdXIgPSAwOyBjb2xvdXIgPCAyOyBjb2xvdXIrKykKLSAgICB7Ci0gICAgICByZWdzLnJbMF0gPSAoaW50KXdpbXBfY3Vyc29yX3BhbGV0dGVbY29sb3VyXVswXTsKLSAgICAgIHJlZ3MuclsxXSA9IDI1OwotICAgICAgLyogUmVhZCBzZXR0aW5ncyB3aXRoIE9TX1JlYWRQYWxldHRlICovCi0gICAgICBpZiAoX2tlcm5lbF9zd2koMHgyZiwgJnJlZ3MsICZyZWdzKSA9PSBOVUxMKQotICAgICAgewotICAgICAgICB3aW1wX2N1cnNvcl9wYWxldHRlW2NvbG91cl1bMl0gPSAodW5zaWduZWQgY2hhcikoKHJlZ3MuclsyXSA+PiA4KSAmIDB4RkYpOwotICAgICAgICB3aW1wX2N1cnNvcl9wYWxldHRlW2NvbG91cl1bM10gPSAodW5zaWduZWQgY2hhcikoKHJlZ3MuclsyXSA+PiAxNikgJiAweEZGKTsKLSAgICAgICAgd2ltcF9jdXJzb3JfcGFsZXR0ZVtjb2xvdXJdWzRdID0gKHVuc2lnbmVkIGNoYXIpKChyZWdzLnJbMl0gPj4gMjQpICYgMHhGRik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY3Vyc29yX3BhbGV0dGVfc2F2ZWQgPSAxOwotfQotCi0vKiBSZXN0b3JlIHRoZSBXSU1QJ3MgY3Vyc29yIHdoZW4gd2UgbGVhdmUgdGhlIFNETCB3aW5kb3cgKi8KLXZvaWQgV0lNUF9SZXN0b3JlV2ltcEN1cnNvcigpCi17Ci0gICAgaW50IGNvbG91cjsKLQotICAgIC8qIFJlc2V0IHRvIHBvaW50ZXIgc2hhcGUgMSAqLwotICAgIF9rZXJuZWxfb3NieXRlKDEwNiwgMSwgMCk7Ci0KLSAgICAvKiBSZXNldCBwb2ludGVyIGNvbG91cnMgKi8KLSAgICBpZiAoY3Vyc29yX3BhbGV0dGVfc2F2ZWQpCi0gICAgewotICAgICAgZm9yIChjb2xvdXIgPSAwOyBjb2xvdXIgPCAyOyBjb2xvdXIrKykKLSAgICAgIHsKLSAgICAgICAgX2tlcm5lbF9vc3dvcmQoMTIsIChpbnQgKil3aW1wX2N1cnNvcl9wYWxldHRlW2NvbG91cl0pOwotICAgICAgfQotICAgIH0KLSAgICBjdXJzb3JfcGFsZXR0ZV9zYXZlZCA9IDA7Ci19Ci0KLS8qIFNldCBwYWxldHRlIHVzZWQgZm9yIFNETCBtb3VzZSBjdXJzb3JzICovCi12b2lkIFdJTVBfU2V0U0RMQ3Vyc29yUGFsZXR0ZSgpCi17Ci0gIC8qIEZpcnN0IHRpbWUgc2V0IHVwIHRoZSBtb3VzZSBjb2xvdXJzICovCi0gIFVpbnQ4IGJsb2NrWzVdOwotCi0gIC8qIFNldCB1cCBjb2xvdXIgMSBhcyB3aGl0ZSAqLwotICBibG9ja1swXSA9IDE7ICAgLyogQ29sb3VyIHRvIGNoYW5nZSAxIC0gMyAqLwotICBibG9ja1sxXSA9IDI1OyAgLyogU2V0IHBvaW50ZXIgY29sb3VyICovCi0gIGJsb2NrWzJdID0gMjU1OyAvKiByZWQgY29tcG9uZW50Ki8KLSAgYmxvY2tbM10gPSAyNTU7IC8qIGdyZWVuIGNvbXBvbmVudCAqLwotICBibG9ja1s0XSA9IDI1NTsgLyogYmx1ZSBjb21wb25lbnQqLwotIF9rZXJuZWxfb3N3b3JkKDEyLCAoaW50ICopYmxvY2spOwotCQkKLSAvKiBTZXQgY29sb3VyIDMgdG8gYmFjayAqLwotIGJsb2NrWzBdID0gMzsgICAvKiBDb2xvdXIgdG8gY2hhbmdlIDEgLSAzICovCi0gYmxvY2tbMV0gPSAyNTsgIC8qIFNldCBwb2ludGVyIGNvbG91ciovCi0gYmxvY2tbMl0gPSAwOyAvKiByZWQgY29tcG9uZW50Ki8KLSBibG9ja1szXSA9IDA7IC8qIGdyZWVuIGNvbXBvbmVudCAqLwotIGJsb2NrWzRdID0gMDsgLyogYmx1ZSBjb21wb25lbnQqLwotIF9rZXJuZWxfb3N3b3JkKDEyLCAoaW50ICopYmxvY2spOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc21vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3Ntb3VzZV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjMxYTEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc21vdXNlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3Jpc2Nvc3ZpZGVvLmgiCi0KLS8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLwotc3RydWN0IFdNY3Vyc29yIHsKLQlpbnQgdzsKLQlpbnQgaDsKLQlpbnQgaG90X3g7Ci0JaW50IGhvdF95OwotCVVpbnQ4ICpkYXRhOwotfTsKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi12b2lkIFJJU0NPU19GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOwotV01jdXJzb3IgKlJJU0NPU19DcmVhdGVXTUN1cnNvcihfVEhJUywgVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKLQotaW50IFJJU0NPU19TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOwotdm9pZCBGVUxMU0NSRUVOX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KTsKLQotaW50IFdJTVBfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLXZvaWQgV0lNUF9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3NzcHJpdGUuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3NzcHJpdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyNjdmZi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zc3ByaXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gICAgIEZpbGUgYWRkZWQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgZm9yIFJJU0MgT1MgY29tcGF0YWJpbGl0eQotCSAyNyBNYXJjaCAyMDAzCi0KLSAgICAgSW1wbGVtZW50cyBTcHJpdGUgcGxvdHRpbmcgY29kZSBmb3Igd2ltcCBkaXNwbGF5LndpbmRvdwotKi8KLQotI2luY2x1ZGUgImtlcm5lbC5oIgotI2luY2x1ZGUgInN3aXMuaCIKLQotI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKLSNpbmNsdWRlICJTRExfcmlzY29zdmlkZW8uaCIKLQotZXh0ZXJuIHZvaWQgV0lNUF9SZWFkTW9kZUluZm8oX1RISVMpOwotCi12b2lkIFdJTVBfUGFsZXR0ZUNoYW5nZWQoX1RISVMpOwotCi0KLS8qIENyZWF0ZSBzcHJpdGUgYnVmZmVyIGZvciBzY3JlZW4gKi8KLQotdW5zaWduZWQgY2hhciAqV0lNUF9DcmVhdGVCdWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwKQotewotCWludCBzaXplOwotCWNoYXIgc3ByaXRlX25hbWVbMTJdID0gImRpc3BsYXkiOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLQlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7Ci0JaW50IGJ5dGVzUGVyUGl4ZWw7Ci0JaW50IGJ5dGVzUGVyUm93OwotCWludCBvZmZzZXRUb1Nwcml0ZURhdGEgPSA2MDsKLQotCXN3aXRjaChicHApCi0JewotCWNhc2UgMzI6IGJ5dGVzUGVyUGl4ZWwgPSA0OyBicmVhazsKLQljYXNlIDE2OiBieXRlc1BlclBpeGVsID0gMjsgYnJlYWs7Ci0JY2FzZSA4OgotCSAgICBieXRlc1BlclBpeGVsID0gMTsKLQkgICAgb2Zmc2V0VG9TcHJpdGVEYXRhICs9IDIwNDg7IC8qIEFkZCBpbiBzaXplIG9mIHBhbGV0dGUgKi8KLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5VTEw7Ci0JCWJyZWFrOwotCX0KLQotCWJ5dGVzUGVyUm93ID0gYnl0ZXNQZXJQaXhlbCAqIHdpZHRoOwotCi0JaWYgKChieXRlc1BlclJvdyAmIDMpICE9IDApCi0JewotCQlieXRlc1BlclJvdyArPSA0IC0gKGJ5dGVzUGVyUm93ICYgMyk7Ci0JfQotCXNpemUgPSBieXRlc1BlclJvdyAqIGhlaWdodDsKLQotCWJ1ZmZlciA9IFNETF9tYWxsb2MoIChzaXplX3QpIHNpemUgKyBvZmZzZXRUb1Nwcml0ZURhdGEgKTsKLQlpZiAoIWJ1ZmZlcikgcmV0dXJuIE5VTEw7Ci0KLSAgIC8qIEluaXRpYWxpc2UgYSBzcHJpdGUgYXJlYSAqLwotCi0JKih1bnNpZ25lZCBpbnQgKilidWZmZXIJCT0gc2l6ZSArIG9mZnNldFRvU3ByaXRlRGF0YTsKLQkqKHVuc2lnbmVkIGludCAqKShidWZmZXIgKyA4KQk9IDE2OwotCi0JcmVncy5yWzBdID0gMjU2Kzk7Ci0JcmVncy5yWzFdID0gKHVuc2lnbmVkIGludClidWZmZXI7Ci0gICBfa2VybmVsX3N3aShPU19TcHJpdGVPcCwgJnJlZ3MsICZyZWdzKTsKLQotCXJlZ3MuclswXSA9IDI1NisxNTsKLQlyZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KWJ1ZmZlcjsKLQlyZWdzLnJbMl0gPSAodW5zaWduZWQgaW50KSZzcHJpdGVfbmFtZTsKLQlyZWdzLnJbM10gPSAwOyAvKiBQYWxldHRlIGZsYWc6IDAgPSBubyBwYWxldHRlICovCi0JcmVncy5yWzRdID0gd2lkdGg7Ci0JcmVncy5yWzVdID0gaGVpZ2h0OwotCWlmIChicHAgPT0gOCkKLQl7Ci0JCS8qIFVzZSBvbGQgc3R5bGUgbW9kZSBudW1iZXIgKi8KLQkJcmVncy5yWzZdID0gMjg7IC8qIDhicHAgOTB4OTBkcGkgKi8KLQl9IGVsc2UKLQl7Ci0JCXJlZ3Mucls2XSA9ICgoKGJwcCA9PSAxNikgPyA1IDogNikgPDwgMjcpIC8qIFR5cGUgNiA9IDMyYnBwIHNwcml0ZSwgNSA9IDE2YnBwIHNwcml0ZSAqLwotCQkJCQl8ICg5MCA8PCAxNCkgLyogVmVydGljYWwgZHBpICovCi0JCQkJCXwgKDkwIDw8IDEpICAvKiBIb3Jpem9udGFsIGRwaSAqLwotCQkJCQl8IDE7IC8qIE1hcmtlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG1vZGUgc2VsZWN0b3JzIGFuZCBzcHJpdGUgbW9kZXMgKi8KLQl9Ci0gICBpZiAoX2tlcm5lbF9zd2koT1NfU3ByaXRlT3AsICZyZWdzLCAmcmVncykgPT0gTlVMTCkKLSAgIHsKLSAgICAgICBpZiAoYnBwID09IDgpCi0gICAgICAgewotICAgICAgICAgIC8qIE1vZGlmeSBzcHJpdGUgdG8gdGFrZSBpbnRvIGFjY291bnQgMjU2IGNvbG91ciBwYWxldHRlICovCi0gICAgICAgICAgaW50ICpzcHJpdGUgPSAoaW50ICopKGJ1ZmZlciArIDE2KTsKLSAgICAgICAgICAvKiBBZGp1c3Qgc3ByaXRlIG9mZnNldHMgKi8KLSAgICAgICAgICBzcHJpdGVbMF0gKz0gMjA0ODsKLSAgICAgICAgICBzcHJpdGVbOF0gKz0gMjA0ODsKLSAgICAgICAgICBzcHJpdGVbOV0gKz0gMjA0ODsKLSAgICAgICAgICAvKiBBZGp1c3Qgc3ByaXRlIGFyZWEgbmV4dCBmcmVlIHBvaW50ZXIgKi8KLSAgICAgICAgICAoKihpbnQgKikoYnVmZmVyKzEyKSkgKz0gMjA0ODsKLQotICAgICAgICAgIC8qIERvbid0IG5lZWQgdG8gc2V0IHVwIHBhbGV0dGUgYXMgU0RMIHNldHMgdXAgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAyNTYgY29sb3VyIHBhbGV0dGUgKi8KLS8qICAgICAgICAgIHsKLSAgICAgICAgICAgICBpbnQgKnBhbCA9IHNwcml0ZSArIDExOwotICAgICAgICAgICAgIHVuc2lnbmVkIGludCBqOwotICAgICAgICAgICAgIHVuc2lnbmVkIGludCBlbnRyeTsKLSAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU1OyBqKyspCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJ5ID0gKGogPDwgMjQpIHwgKGogPDwgMTYpIHwgKGogPDwgOCk7Ci0gICAgICAgICAgICAgICAgKnBhbCsrID0gZW50cnk7Ci0gICAgICAgICAgICAgICAgKnBhbCsrID0gZW50cnk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSovCi0gICAgICAgfQotICAgfSBlbHNlCi0gICB7Ci0gICAgICBTRExfZnJlZShidWZmZXIpOwotICAgICAgYnVmZmVyID0gTlVMTDsKLSAgIH0KLQotICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotCi0vKiBTZXR1cCB0cmFuc2xhdGlvbiBidWZmZXJzIGZvciB0aGUgc3ByaXRlIHBsb3R0aW5nICovCi0KLXZvaWQgV0lNUF9TZXR1cFBsb3RJbmZvKF9USElTKQotewotICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOwotICAgaW50ICpzcHJpdGUgPSAoKGludCAqKXRoaXMtPmhpZGRlbi0+YmFua1sxXSkrNDsKLQotICAgcmVncy5yWzBdID0gKHVuc2lnbmVkIGludCl0aGlzLT5oaWRkZW4tPmJhbmtbMV07Ci0gICByZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KXNwcml0ZTsKLSAgIHJlZ3MuclsyXSA9IC0xOyAvKiBDdXJyZW50IG1vZGUgKi8KLSAgIHJlZ3MuclszXSA9IC0xOyAvKiBDdXJyZW50IHBhbGV0dGUgKi8KLSAgIHJlZ3Mucls0XSA9IDA7IC8qIEdldCBzaXplIG9mIGJ1ZmZlciAqLwotICAgcmVncy5yWzVdID0gMXwyfDE2OyAvKiBSMSAtIHBvaW50ZXIgdG8gc3ByaXRlIGFuZCBjYW4gdXNlIGZ1bGwgcGFsZXR0ZSB3b3JkcyAqLwotICAgcmVncy5yWzZdID0gMDsKLSAgIHJlZ3Mucls3XSA9IDA7Ci0KLSAgIGlmICh0aGlzLT5oaWRkZW4tPnBpeHRyYW5zKSBTRExfZnJlZSh0aGlzLT5oaWRkZW4tPnBpeHRyYW5zKTsKLSAgIHRoaXMtPmhpZGRlbi0+cGl4dHJhbnMgPSAwOwotCi0gICAvKiBHZXQgdGhlIHNpemUgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXIgKi8KLSAgIF9rZXJuZWxfc3dpKENvbG91clRyYW5zX0dlbmVyYXRlVGFibGUsICZyZWdzLCAmcmVncyk7Ci0gICBpZiAocmVncy5yWzRdKQotICAgewotICAgICAgdGhpcy0+aGlkZGVuLT5waXh0cmFucyA9IFNETF9tYWxsb2MocmVncy5yWzRdKTsKLSAgICAKLSAgICAgIHJlZ3Mucls0XSA9ICh1bnNpZ25lZCBpbnQpdGhpcy0+aGlkZGVuLT5waXh0cmFuczsKLSAgICAgIC8qIEFjdHVhbGx5IHJlYWQgdGhlIGJ1ZmZlciAqLwotICAgICAgX2tlcm5lbF9zd2koQ29sb3VyVHJhbnNfR2VuZXJhdGVUYWJsZSwgJnJlZ3MsICZyZWdzKTsKLSAgIH0KLX0KLQotLyogUGxvdCB0aGUgc3ByaXRlIGluIHRoZSBnaXZlbiBjb250ZXh0ICovCi12b2lkIFdJTVBfUGxvdFNwcml0ZShfVEhJUywgaW50IHgsIGludCB5KQotewotICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOwotICAgX2tlcm5lbF9vc2Vycm9yICplcnI7Ci0KLSAgIHJlZ3MuclswXSA9ICA1MiArIDUxMjsKLSAgIHJlZ3MuclsxXSA9ICh1bnNpZ25lZCBpbnQpdGhpcy0+aGlkZGVuLT5iYW5rWzFdOwotICAgcmVncy5yWzJdID0gKHVuc2lnbmVkIGludCl0aGlzLT5oaWRkZW4tPmJhbmtbMV0rMTY7Ci0gICByZWdzLnJbM10gPSB4OwotICAgcmVncy5yWzRdID0geTsKLSAgIHJlZ3Mucls1XSA9IDB8MzI7IC8qIE92ZXJ3cml0ZSBzY3JlZW4gYW5kIHBpeHRyYW5zIGNvbnRhaW5zIHdpZGUgY29sb3VyIGVudHJpZXMgKi8KLSAgIHJlZ3Mucls2XSA9IDA7IC8qIE5vIHNjYWxlIGZhY3RvcnMgaS5lLiAxOjEgKi8KLSAgIHJlZ3Mucls3XSA9IChpbnQpdGhpcy0+aGlkZGVuLT5waXh0cmFuczsKLQotICAgaWYgKChlcnIgPSBfa2VybmVsX3N3aShPU19TcHJpdGVPcCwgJnJlZ3MsICZyZWdzKSkgIT0gMCkKLSAgIHsKLSAgICAgIGludCAqcCA9IChpbnQgKil0aGlzLT5oaWRkZW4tPnBpeHRyYW5zOwotICAgICAgcHJpbnRmKCJPU19TcHJpdGVPcCBmYWlsZWQgXG4lc1xuIixlcnItPmVycm1lc3MpOwotICAgICAgcHJpbnRmKCJwaXh0cmFucyAlZFxuIiwgKGludCl0aGlzLT5oaWRkZW4tPnBpeHRyYW5zKTsKLSAgICAgIHByaW50ZigiJXggJXggJXhcbiIsIHBbMF0sIHBbMV0sIHBbMl0pOwotICAgfQotfQotCi0KLS8qIFdpbXAgbW9kZSBoYXMgY2hhbmdlcyBzbyB1cGRhdGUgY29sb3VyIG1hcHBpbmcgYW5kIHBpeGVsIHNpemVzIAotICAgb2Ygd2luZG93cyBhbmQgdGhlIHNwcml0ZXMgdGhleSBwbG90ICovCi0KLXZvaWQgV0lNUF9Nb2RlQ2hhbmdlZChfVEhJUykKLXsKLQlpbnQgb2xkWGVpZyA9IHRoaXMtPmhpZGRlbi0+eGVpZzsKLQlpbnQgb2xkWWVpZyA9IHRoaXMtPmhpZGRlbi0+eWVpZzsKLQotCVdJTVBfUmVhZE1vZGVJbmZvKHRoaXMpOwotCi0JaWYgKG9sZFhlaWcgPT0gdGhpcy0+aGlkZGVuLT54ZWlnICYmIG9sZFllaWcgPT0gdGhpcy0+aGlkZGVuLT55ZWlnKQotCXsKLQkJLyogT25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGFsZXR0ZSAqLwotCQlXSU1QX1BhbGV0dGVDaGFuZ2VkKHRoaXMpOwotCX0gZWxzZQotCXsKLQkJX2tlcm5lbF9zd2lfcmVncyByZWdzOwotCQlpbnQgd2luZG93X3N0YXRlWzldOwotCQlpbnQgZXh0ZW50WzRdOwotCQlpbnQgY3VycldpZHRoLCBjdXJySGVpZ2h0OwotCQlpbnQgbmV3V2lkdGgsIG5ld0hlaWdodDsKLQkJCi0JCS8qIE5lZWQgdG8gcmVzaXplIHdpbmRvd3MgYW5kIHVwZGF0ZSB0aGUgcGFsZXR0ZSAqLwotCQlXSU1QX1NldHVwUGxvdEluZm8odGhpcyk7Ci0KLQotCQl3aW5kb3dfc3RhdGVbMF0gPSB0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGU7Ci0JCXJlZ3MuclsxXSA9ICh1bnNpZ25lZCBpbnQpd2luZG93X3N0YXRlOwotCQlfa2VybmVsX3N3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAmcmVncywgJnJlZ3MpOwotCQkJCQkJCi0JCWN1cnJXaWR0aCA9IHdpbmRvd19zdGF0ZVszXSAtIHdpbmRvd19zdGF0ZVsxXTsKLQkJY3VyckhlaWdodCA9IHdpbmRvd19zdGF0ZVs0XSAtIHdpbmRvd19zdGF0ZVsyXTsKLQkJCi0JCW5ld1dpZHRoID0gKGN1cnJXaWR0aCA+PiBvbGRYZWlnKSA8PCB0aGlzLT5oaWRkZW4tPnhlaWc7Ci0JCW5ld0hlaWdodCA9IChjdXJySGVpZ2h0ID4+IG9sZFllaWcpIDw8IHRoaXMtPmhpZGRlbi0+eWVpZzsKLQkJLyogTmVlZCB0byBhdm9pZCBleHRlbnQgZ2V0dGluZyB0b28gc21hbGwgZm9yIHZpc2libGUgcGFydAotCQlvZiB3aW5kb3cgKi8KLQkJZXh0ZW50WzBdID0gMDsKLQkJaWYgKGN1cnJIZWlnaHQgPD0gbmV3SGVpZ2h0KQotCQl7Ci0JCQlleHRlbnRbMV0gPSAtbmV3SGVpZ2h0OwotCQl9IGVsc2UKLQkJewotCQkJZXh0ZW50WzFdID0gLWN1cnJIZWlnaHQ7Ci0JCX0KLQkJaWYgKGN1cnJXaWR0aCA8PSBuZXdXaWR0aCkKLQkJewotCQkJZXh0ZW50WzJdID0gbmV3V2lkdGg7Ci0JCX0gZWxzZQotCQl7Ci0JCQlleHRlbnRbMl0gPSBjdXJyV2lkdGg7Ci0JCX0KLQkJZXh0ZW50WzNdID0gMDsKLQkJCi0JCXJlZ3MuclswXSA9IHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZTsKLQkJcmVncy5yWzFdID0gKGludClleHRlbnQ7Ci0JCV9rZXJuZWxfc3dpKFdpbXBfU2V0RXh0ZW50LCAmcmVncywgJnJlZ3MpOwotCi0JCS8qVE9ETzogTWF5IG5lZWQgdG8gc2V0IGZsYWcgdG8gcmVzaXplIHdpbmRvdyBvbiBuZXh0IG9wZW4gKi8KLQl9Ci19Ci0KLS8qIFBhbGV0dGUgaGFzIGNoYW5nZWQgc28gdXBkYXRlIHBhbGV0dGVzIHVzZWQgZm9yIHdpbmRvd3Mgc3ByaXRlcyAqLwotCi12b2lkIFdJTVBfUGFsZXR0ZUNoYW5nZWQoX1RISVMpCi17Ci0JV0lNUF9TZXR1cFBsb3RJbmZvKHRoaXMpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3Rhc2suYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3N0YXNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMTQzZTcuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3Rhc2suYworKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAgICBUaGlzIGZpbGUgYWRkZWQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgdG8gc3VwcG9ydCBSSVNDIE9TIAotCTI2IE1hcmNoIDIwMDMKLQotCUZpbGUgaW5jbHVkZXMgcm91dGluZXMgZm9yOgotCSAgU2V0dGluZyB1cCBhcyBhIFdJTVAgVGFzawotCSAgUmVhZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBkZXNrdG9wCi0JICBTdG9yaW5nIGluZm9ybWF0aW9uIGJlZm9yZSBhIHN3aXRjaCB0byBmdWxsIHNjcmVlbgotCSAgUmVzdG9yaW5nIGRlc2t0b3AgYWZ0ZXIgc3dpdGNoaW5nIHRvIGZ1bGwgc2NyZWVuCi0qLwotCi0jaW5jbHVkZSAia2VybmVsLmgiCi0jaW5jbHVkZSAic3dpcy5oIgotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF9yaXNjb3N0YXNrLmgiCi0KLSNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci1wdGhyZWFkX3QgbWFpbl90aHJlYWQ7Ci0jZW5kaWYKLQotLyogUklTQyBPUyB2YXJpYWJsZXMgKi8KLQotc3RhdGljIGludCB0YXNrX2hhbmRsZSA9IDA7Ci1zdGF0aWMgaW50IHdpbXBfdmVyc2lvbiA9IDA7Ci0KLS8qIFJJU0MgT1MgdmFyaWFibGVzIHRvIGhlbHAgY29tcGF0YWJpbGl0eSB3aXRoIGNlcnRhaW4gcHJvZ3JhbXMgKi8KLWludCByaXNjb3NfYmFja2J1ZmZlciA9IDA7IC8qIENyZWF0ZSBhIGJhY2sgYnVmZmVyIGluIHN5c3RlbSBtZW1vcnkgZm9yIGZ1bGwgc2NyZWVuIG1vZGUgKi8KLWludCByaXNjb3NfY2xvc2VhY3Rpb24gPSAxOyAvKiBDbG9zZSBpY29uIGFjdGlvbiAqLwotCi1zdGF0aWMgaW50IHN0b3JlZF9tb2RlID0gLTE7IC8qIC0xIHdoZW4gaW4gZGVza3RvcCwgbW9kZSBudW1iZXIgb3IgcG9pbnRlciB3aGVuIGZ1bGwgc2NyZWVuICovCi0KLWV4dGVybiBpbnQgbW91c2VJbldpbmRvdzsgLyogTW91c2UgaXMgaW4gV0lNUCB3aW5kb3cgKi8KLQotLyogTG9jYWwgZnVuY3Rpb24gKi8KLQotc3RhdGljIGludCBSSVNDT1NfR2V0VGFza05hbWUoY2hhciAqdGFza19uYW1lLCBzaXplX3QgbWF4bGVuKTsKLQotLyogVW5jb21tZW50IG5leHQgbGluZSB0byBjb3B5IG1vZGUgY2hhbmdlcy9yZXN0b3JlcyB0byBzdGRlcnIgKi8KLS8qICNkZWZpbmUgRFVNUF9NT0RFICovCi0jaWZkZWYgRFVNUF9NT0RFCi0jaW5jbHVkZSAic3RkaW8uaCIKLXN0YXRpYyB2b2lkIGR1bXBfbW9kZSgpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJtb2RlICVkXG4iLCBzdG9yZWRfbW9kZSk7Ci0gICAgaWYgKHN0b3JlZF9tb2RlIDwgLTEgfHwgc3RvcmVkX21vZGUgPj0gMjU2KQotICAgIHsKLSAgICAgICAgaW50IGJsb2NrU2l6ZSA9IDA7Ci0JCWludCAqc3RvcmVCbG9jayA9IChpbnQgKilzdG9yZWRfbW9kZTsKLQotICAgICAgICB3aGlsZShibG9ja1NpemUgPCA1IHx8IHN0b3JlQmxvY2tbYmxvY2tTaXplXSAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICVkXG4iLCBzdG9yZUJsb2NrW2Jsb2NrU2l6ZSsrXSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gSW5pdGlhbGlzZSBhcyBSSVNDIE9TIFdpbXAgdGFzawotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgUklTQ09TX0luaXRUYXNrKCkKLXsKLSAgIGNoYXIgdGFza19uYW1lWzMyXTsKLSAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLSAgIGludCBtZXNzYWdlc1s0XTsKLQotICAgaWYgKFJJU0NPU19HZXRUYXNrTmFtZSh0YXNrX25hbWUsIFNETF9hcnJheXNpemUodGFza19uYW1lKSkgPT0gMCkgcmV0dXJuIDA7Ci0KLSAgIG1lc3NhZ2VzWzBdID0gOTsgICAgICAgLyogUGFsZXR0ZSBjaGFuZ2VkICovCi0gICBtZXNzYWdlc1sxXSA9IDB4NDAwYzE7IC8qIE1vZGUgY2hhbmdlZCAqLwotICAgbWVzc2FnZXNbMl0gPSA4OyAgICAgICAvKiBQcmUgcXVpdCAqLwotICAgbWVzc2FnZXNbMl0gPSAwOwotICAgCi0JcmVncy5yWzBdID0gKHVuc2lnbmVkIGludCkzNjA7IC8qIE1pbmltdW0gdmVyc2lvbiAzLjYgKi8KLQlyZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KTB4NGI1MzQxNTQ7Ci0JcmVncy5yWzJdID0gKHVuc2lnbmVkIGludCl0YXNrX25hbWU7Ci0JcmVncy5yWzNdID0gKHVuc2lnbmVkIGludCltZXNzYWdlczsKLQotICAgaWYgKF9rZXJuZWxfc3dpKFdpbXBfSW5pdGlhbGlzZSwgJnJlZ3MsICZyZWdzKSA9PSAwKQotICAgewotCSAgIHdpbXBfdmVyc2lvbiA9IHJlZ3MuclswXTsKLQkgICB0YXNrX2hhbmRsZSA9IHJlZ3MuclsxXTsKLQkgICByZXR1cm4gMTsKLSAgIH0KLQotI2lmICFTRExfVEhSRUFEU19ESVNBQkxFRAotICAgbWFpbl90aHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKLSNlbmRpZgotCi0gICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIENsb3NlIGRvd24gYXBwbGljYXRpb24gb24gZXhpdC4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBSSVNDT1NfRXhpdFRhc2soKQotewotCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLQotICAgIGlmIChzdG9yZWRfbW9kZSA9PSAtMSkKLSAgICB7Ci0gICAgICAgLyogRW5zdXJlIGN1cnNvciBpcyBwdXQgYmFjayB0byBzdGFuZGFyZCBwb2ludGVyIHNoYXBlIGlmCi0gICAgICAgICAgd2UgaGF2ZSBiZWVuIHJ1bm5pbmcgaW4gYSB3aW5kb3cgKi8KLSAgICAgICBfa2VybmVsX29zYnl0ZSgxMDYsMSwwKTsKLSAgICB9Ci0KLQkvKiBFbnN1cmUgd2UgZW5kIHVwIGJhY2sgaW4gdGhlIHdpbXAgKi8KLQlSSVNDT1NfUmVzdG9yZVdpbXBNb2RlKCk7Ci0KLQkvKiBOZWF0bHkgZXhpdCB0aGUgdGFzayAqLwotICAgCXJlZ3MuclswXSA9IHRhc2tfaGFuZGxlOwotICAgCXJlZ3MuclsxXSA9ICh1bnNpZ25lZCBpbnQpMHg0YjUzNDE1NDsKLSAgIAlfa2VybmVsX3N3aShXaW1wX0Nsb3NlRG93biwgJnJlZ3MsICZyZWdzKTsKLQl0YXNrX2hhbmRsZSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIEdldCB0aGUgbmFtZSBvZiB0aGUgdGFzayBmb3IgdGhlIGRlc2t0b3AuCi0KLSAgUGFyYW06ICAgdGFza19uYW1lIC0gbmFtZSBvZiB0YXNrIDMyIGNoYXJhY3RlcnMuCi0KLSAgUmV0dXJuczogMSBpcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgMAotCi0gIE5vdGVzOiAgIFdvcmtzIGJ5IGdldHRpbmcgdXNpbmcgT1NfR2V0RW52IHRvIGdldCB0aGUgY29tbWFuZCBsaW5lCi0JCSAgIHVzZWQgdG8gcnVuIHRoZSBwcm9ncmFtIGFuZCB0aGVuIHBhcnNpbmcgYSBuYW1lIGZyb20gaXQKLQkJICAgYXMgZm9sbG93cy4KLQotCQkgICAxLiBVc2UgbmFtZSBhZnRlciBmaW5hbCBwZXJpb2QgaWYgbm90ICFSdW5JbWFnZQotCQkgICAyLiBJZiBuYW1lIGlzICFSdW5JbWFnZSB0aGVuIHByb2Nlc3MgaXRlbSBiZWZvcmUgdGhlIHBlcmlvZAotCQkgICAgICBpbiBmcm9udCBvZiAhUnVuSW1hZ2UuCi0JCSAgIDMuIElmIGRpcmVjdG9yeSBuYW1lIHVzZSB0aGF0Ci0JCSAgIDQuIGlmIGluIGZvcm0gPFhYWCREaXI+IHVzZSB0aGUgWFhYLgotCi0JCSAgIEZpbmFsbHkgb25jZSB0aGlzIHZhbHVlIGhhcyBiZWVuIHJldHJpZXZlZCB1c2UgaXQgdW5sZXNzCi0JCSAgIHRoZXJlIGlzIGEgdmFyaWFibGUgc2V0IHVwIGluIHRoZSBmb3JtIFNETCQ8bmFtZT4kVGFza05hbWUKLQkJICAgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHVzZWQuCi0KLQkJICAgTm93IGFsc28gZ2V0cyBvdGhlciBSSVNDIE9TIGNvbmZpZ3VyYXRpb24gdmFyaWJsZXMKLSAgICAgICAgICAgICAgICBTREwkPG5hbWU+JEJhY2tCdWZmZXIgLSBzZXQgdG8gMSB0byB1c2UgYSBzeXN0ZW0gbWVtb3J5IGJhY2tidWZmZXIgaW4gZnVsbHNjcmVlbiBtb2RlCi0JCQkJCQkgICAgc28gdXBkYXRlcyB3YWl0IHVudGlsIGEgY2FsbCB0byBTRExfVXBkYXRlUmVjdHMuIChkZWZhdWx0IDApCi0JCQkJCQkgICAgVGhpcyBpcyByZXF1aXJlZCBmb3IgcHJvZ3JhbW1lcyB3aGVyZSB0aGV5IGhhdmUgYXNzdW1lZCB0aGlzIGlzCi0JCQkJCQkgICAgYWx3YXlzIHRoZSBjYXNlIHdoaWNoIGlzIGNvbnRyYXJ5IHRvIHRoZSBkb2N1bWVudGF0aW9uLgotICAgICAgICAgICAgICAgU0RMJDxuYW1lPiRDbG9zZUFjdGlvbgotICAgICAgICAgICAgICAgICAgICAwIERvbid0IHNob3cgY2xvc2UgaWNvbgotICAgICAgICAgICAgICAgICAgICAxIFNob3cgY2xvc2UgaWNvbgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBSSVNDT1NfR2V0VGFza05hbWUoY2hhciAqdGFza19uYW1lLCBzaXplX3QgbWF4bGVuKQotewotCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLQotICAgdGFza19uYW1lWzBdID0gMDsKLQotICAgLyogRmlndXJlIG91dCBhIHNlbnNpYmxlIHRhc2sgbmFtZSAqLwotICAgaWYgKF9rZXJuZWxfc3dpKE9TX0dldEVudiwgJnJlZ3MsICZyZWdzKSA9PSAwKQotICAgewotCSAgIGNoYXIgKmNvbW1hbmRfbGluZSA9IChjaGFyICopcmVncy5yWzBdOwotCSAgIHNpemVfdCBsZW4gPSBTRExfc3RybGVuKGNvbW1hbmRfbGluZSkrMTsKLQkgICBjaGFyICpidWZmZXIgPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbGVuKTsKLQkgICBjaGFyICplbnZfdmFyOwotCSAgIGNoYXIgKnA7Ci0KLQkgICBTRExfc3RybGNweShidWZmZXIsIGNvbW1hbmRfbGluZSwgbGVuKTsKLQkgICBwID0gU0RMX3N0cmNocihidWZmZXIsICcgJyk7Ci0JICAgaWYgKHApICpwID0gMDsKLQkgICBwID0gU0RMX3N0cnJjaHIoYnVmZmVyLCAnLicpOwotCSAgIGlmIChwID09IDApIHAgPSBidWZmZXI7Ci0JICAgaWYgKHN0cmljbXAocCsxLCIhUnVuSW1hZ2UiKSA9PSAwKQotCSAgIHsKLQkJICAgKnAgPSAwOwotCSAgIAkgICBwID0gU0RMX3N0cnJjaHIoYnVmZmVyLCAnLicpOwotCQkgICBpZiAocCA9PSAwKSBwID0gYnVmZmVyOwotCSAgIH0KLQkgICBpZiAoKnAgPT0gJy4nKSBwKys7Ci0JICAgaWYgKCpwID09ICchJykgcCsrOyAvKiBTa2lwICIhIiBhdCBiZWdpbm5pbmcgb2YgYXBwbGljYXRpb24gZGlyZWN0b3JpZXMgKi8KLQotICAgICAgIGlmICgqcCA9PSAnPCcpCi0gICAgICAgewotICAgICAgICAgIC8vIFByb2JhYmx5IGluIHRoZSBmb3JtIDxhcHBuYW1lJERpcj4KLSAgICAgICAgICBjaGFyICpxID0gU0RMX3N0cmNocihwLCAnJCcpOwotICAgICAgICAgIGlmIChxID09IDApIHEgPSBTRExfc3RyY2hyKHAsJz4nKTsgLyogVXNlIHZhcmlhYmxlIG5hbWUgaWYgbm90ICovCi0gICAgICAgICAgaWYgKHEpICpxID0gMDsKLSAgICAgICAgICBwKys7IC8qIE1vdmUgb3ZlciB0aGUgPCAqLwotICAgICAgIH0KLQotCSAgIGlmICgqcCkKLQkgICB7Ci0JCSAgIC8qIFJlYWQgdmFyaWFibGVzIHRoYXQgZWZmZWN0IHRoZSBSSVNDIE9TIFNETCBlbmdpbmUgZm9yIHRoaXMgdGFzayAqLwotCQkgICBsZW4gPSBTRExfc3RybGVuKHApICsgMTg7IC8qIDE4IGlzIGxhcmdlciB0aGFuIHRoZSBiaWdnZXN0IHZhcmlhYmxlIG5hbWUgKi8KLQkJICAgZW52X3ZhciA9IFNETF9zdGFja19hbGxvYyhjaGFyLCBsZW4pOwotCQkgICBpZiAoZW52X3ZhcikKLQkJICAgewotCQkJICAgY2hhciAqZW52X3ZhbDsKLQotCQkJICAgLyogU2VlIGlmIGEgdmFyaWFibGUgb2YgZm9ybSBTREwkPGRpcm5hbWU+JFRhc2tOYW1lIGV4aXN0cyAqLwotCi0JCQkgICBTRExfc3RybGNweShlbnZfdmFyLCAiU0RMJCIsIGxlbik7Ci0JCQkgICBTRExfc3RybGNhdChlbnZfdmFyLCBwLCBsZW4pOwotCQkJICAgU0RMX3N0cmxjYXQoZW52X3ZhciwgIiRUYXNrTmFtZSIsIGxlbik7Ci0KLQkJCSAgIGVudl92YWwgPSBTRExfZ2V0ZW52KGVudl92YXIpOwotCQkJICAgaWYgKGVudl92YWwpIFNETF9zdHJsY3B5KHRhc2tfbmFtZSwgZW52X3ZhbCwgbWF4bGVuKTsKLQotCQkJICAgU0RMX3N0cmxjcHkoZW52X3ZhciwgIlNETCQiLCBsZW4pOwotCQkJICAgU0RMX3N0cmxjYXQoZW52X3ZhciwgcCwgbGVuKTsKLQkJCSAgIFNETF9zdHJsY2F0KGVudl92YXIsICIkQmFja0J1ZmZlciIsIGxlbik7Ci0KLQkJCSAgIGVudl92YWwgPSBTRExfZ2V0ZW52KGVudl92YXIpOwotCQkJICAgaWYgKGVudl92YWwpIHJpc2Nvc19iYWNrYnVmZmVyID0gYXRvaShlbnZfdmFsKTsKLQotCQkJICAgU0RMX3N0cmxjcHkoZW52X3ZhciwgIlNETCQiLCBsZW4pOwotCQkJICAgU0RMX3N0cmxjYXQoZW52X3ZhciwgcCwgbGVuKTsKLQkJCSAgIFNETF9zdHJsY2F0KGVudl92YXIsICIkQ2xvc2VBY3Rpb24iLCBsZW4pOwotCi0JCQkgICBlbnZfdmFsID0gU0RMX2dldGVudihlbnZfdmFyKTsKLQkJCSAgIGlmIChlbnZfdmFsICYmIFNETF9zdHJjbXAoZW52X3ZhbCwiMCIpID09IDApIHJpc2Nvc19jbG9zZWFjdGlvbiA9IDA7Ci0KLQkJCSAgIFNETF9zdGFja19mcmVlKGVudl92YXIpOwotCQkgICB9Ci0JCSAgIAotCQkgICBpZiAoISp0YXNrX25hbWUpIFNETF9zdHJsY3B5KHRhc2tfbmFtZSwgcCwgbWF4bGVuKTsKLQkgICB9Ci0KLQkgICBTRExfc3RhY2tfZnJlZShidWZmZXIpOwotICAgfQotCi0gICBpZiAodGFza19uYW1lWzBdID09IDApIFNETF9zdHJsY3B5KHRhc2tfbmFtZSwgIlNETCBUYXNrIiwgbWF4bGVuKTsKLQotICAgcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIFN0b3JlIHRoZSBjdXJyZW50IGRlc2t0b3Agc2NyZWVuIG1vZGUgaWYgd2UgYXJlIGluIHRoZSBkZXNrdG9wLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgUklTQ09TX1N0b3JlV2ltcE1vZGUoKQotewotICAgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7Ci0KLQkvKiBEb24ndCBzdG9yZSBpZiBpbiBmdWxsIHNjcmVlbiBtb2RlICovCi0JaWYgKHN0b3JlZF9tb2RlICE9IC0xKSByZXR1cm47Ci0KLSAgICByZWdzLnJbMF0gPSAxOwotICAgIF9rZXJuZWxfc3dpKE9TX1NjcmVlbk1vZGUsICZyZWdzLCAmcmVncyk7Ci0gICAgaWYgKHJlZ3MuclsxXSA+PSAwICYmIHJlZ3MuclsxXSA8IDI1Nikgc3RvcmVkX21vZGUgPSByZWdzLnJbMV07Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IGJsb2NrU2l6ZSA9IDA7Ci0gICAgICAgIGludCAqcmV0QmxvY2sgPSAoaW50ICopcmVncy5yWzFdOwotCQlpbnQgKnN0b3JlQmxvY2s7Ci0gICAgICAgIGludCBqOwotCi0gICAgICAgIHdoaWxlKGJsb2NrU2l6ZSA8IDUgfHwgcmV0QmxvY2tbYmxvY2tTaXplXSAhPSAtMSkgYmxvY2tTaXplKys7Ci0gICAgICAgIGJsb2NrU2l6ZSsrOwotICAgICAgICBzdG9yZUJsb2NrID0gKGludCAqKVNETF9tYWxsb2MoYmxvY2tTaXplICogc2l6ZW9mKGludCkpOwotICAgICAgICByZXRCbG9jayA9IChpbnQgKilyZWdzLnJbMV07Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxvY2tTaXplOyBqKyspCi0gICAgICAgICAgIHN0b3JlQmxvY2tbal0gPSByZXRCbG9ja1tqXTsKLQotCQlzdG9yZWRfbW9kZSA9IChpbnQpc3RvcmVCbG9jazsKLSAgICAgfQotI2lmIERVTVBfTU9ERQotICAgIGZwcmludGYoc3RkZXJyLCAiU3RvcmVkICIpOyBkdW1wX21vZGUoKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBSZXN0b3JlIGRlc2t0b3Agc2NyZWVuIG1vZGUgaWYgd2UgYXJlIGluIGZ1bGwgc2NyZWVuIG1vZGUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFJJU0NPU19SZXN0b3JlV2ltcE1vZGUoKQotewotICAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLQotCS8qIE9ubHkgbmVlZCB0byByZXN0b3JlIGlmIHdlIGFyZSBpbiBmdWxsIHNjcmVlbiBtb2RlICovCi0JaWYgKHN0b3JlZF9tb2RlID09IC0xKSByZXR1cm47Ci0KLSNpZiBEVU1QX01PREUKLSAgIGZwcmludGYoc3RkZXJyLCAiUmVzdG9yZWQiKTsgZHVtcF9tb2RlKCk7Ci0jZW5kaWYKLQotICAgIHJlZ3MuclswXSA9IHN0b3JlZF9tb2RlOwotICAgIF9rZXJuZWxfc3dpKFdpbXBfU2V0TW9kZSwgJnJlZ3MsICZyZWdzKTsKLSAgICBpZiAoc3RvcmVkX21vZGUgPCAwIHx8IHN0b3JlZF9tb2RlID4gMjU2KQotICAgIHsKLSAgICAgICBTRExfZnJlZSgoaW50ICopc3RvcmVkX21vZGUpOwotICAgIH0KLSAgICBzdG9yZWRfbW9kZSA9IC0xOwotCi0gICAgLyogRmx1c2gga2V5Ym9hcmQgYnVmZmVyIHRvIGR1bXAgdGhlIGtleXN0cm9rZXMgd2UndmUgYWxyZWFkeSBwb2xsZWQgKi8KLSAgICByZWdzLnJbMF0gPSAyMTsKLSAgICByZWdzLnJbMV0gPSAwOyAvKiBLZXlib2FyZCBidWZmZXIgbnVtYmVyICovCi0gICAgX2tlcm5lbF9zd2koT1NfQnl0ZSwgJnJlZ3MsICZyZWdzKTsKLQotICAgIG1vdXNlSW5XaW5kb3cgPSAwOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBHZXQgdmVyc2lvbiBvZiBXaW1wIHJ1bm5pbmcgd2hlbiB0YXNrIHdhcyBpbml0aWFsaXNlZC4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgUklTQ09TX0dldFdpbXBWZXJzaW9uKCkKLXsKLQlyZXR1cm4gd2ltcF92ZXJzaW9uOwotfQotCi1pbnQgUklTQ09TX0dldFRhc2tIYW5kbGUoKQotewotCXJldHVybiB0YXNrX2hhbmRsZTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3N0YXNrLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zdGFzay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmRiOGEyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3N0YXNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLSAgICBUaGlzIGZpbGUgYWRkZWQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgdG8gc3VwcG9ydCBSSVNDIE9TIAotCTI2IE1hcmNoIDIwMDMKLSovCi0KLS8qIFRhc2sgaW5pdGlhbGlzYXRpb24vQ2xlYW4gdXAgKi8KLQotZXh0ZXJuIGludCBSSVNDT1NfSW5pdFRhc2soKTsKLWV4dGVybiB2b2lkIFJJU0NPU19FeGl0VGFzaygpOwotZXh0ZXJuIGludCBSSVNDT1NfR2V0V2ltcFZlcnNpb24oKTsKLWV4dGVybiBpbnQgUklTQ09TX0dldFRhc2tIYW5kbGUoKTsKLQotCi0vKiBXaW1wIG1vZGUgc2F2ZWluZy9yZXN0b3JpbmcgKi8KLWV4dGVybiB2b2lkIFJJU0NPU19TdG9yZVdpbXBNb2RlKCk7Ci1leHRlcm4gdm9pZCBSSVNDT1NfUmVzdG9yZVdpbXBNb2RlKCk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3N2aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzA3ZmVhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3N2aWRlby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICAgICBGaWxlIGFkZGVkIGJ5IEFsYW4gQnVja2xleSAoYWxhbl9iYWFAaG90bWFpbC5jb20pIGZvciBSSVNDIE9TIGNvbXBhdGFiaWxpdHkKLQkgMjMgTWFyY2ggMjAwMwotCi0gICAgIEltcGxlbWVudHMgUklTQyBPUyBkaXNwbGF5IGRldmljZSBtYW5hZ2VtZW50LgotCSBSb3V0aW5lcyBmb3IgZnVsbCBzY3JlZW4gYW5kIHdpbXAgbW9kZXMgYXJlIHNwbGl0Ci0JIGludG8gb3RoZXIgc291cmNlIGZpbGVzLgotKi8KLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotI2luY2x1ZGUgIlNETF9yaXNjb3N0YXNrLmgiCi0jaW5jbHVkZSAiU0RMX3Jpc2Nvc3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3Jpc2Nvc2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3Jpc2Nvc21vdXNlX2MuaCIKLQotI2luY2x1ZGUgImtlcm5lbC5oIgotI2luY2x1ZGUgInN3aXMuaCIKLQotI2RlZmluZSBSSVNDT1NWSURfRFJJVkVSX05BTUUgInJpc2NvcyIKLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IFJJU0NPU19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgdm9pZCBSSVNDT1NfVmlkZW9RdWl0KF9USElTKTsKLQotc3RhdGljIFNETF9SZWN0ICoqUklTQ09TX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgU0RMX1N1cmZhY2UgKlJJU0NPU19TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci0KLWludCBSSVNDT1NfR2V0V21JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKTsKLQotaW50IFJJU0NPU19Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgZnVsbHNjcmVlbik7Ci0vKiBNb3VzZSBjaGVja2luZyAqLwotdm9pZCBSSVNDT1NfQ2hlY2tNb3VzZU1vZGUoX1RISVMpOwotZXh0ZXJuIFNETF9HcmFiTW9kZSBSSVNDT1NfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7Ci0KLS8qIEZ1bGxzY3JlZW4gbW9kZSBmdW5jdGlvbnMgKi8KLWV4dGVybiBTRExfU3VyZmFjZSAqRlVMTFNDUkVFTl9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1leHRlcm4gdm9pZCBGVUxMU0NSRUVOX0J1aWxkTW9kZUxpc3QoX1RISVMpOwotZXh0ZXJuIHZvaWQJRlVMTFNDUkVFTl9TZXREZXZpY2VNb2RlKF9USElTKTsKLWV4dGVybiBpbnQgRlVMTFNDUkVFTl9Ub2dnbGVGcm9tV2ltcChfVEhJUyk7Ci0KLS8qIFdpbXAgbW9kZSBmdW5jdGlvbnMgKi8KLWV4dGVybiBTRExfU3VyZmFjZSAqV0lNUF9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1leHRlcm4gdm9pZCBXSU1QX0RlbGV0ZVdpbmRvdyhfVEhJUyk7Ci1leHRlcm4gaW50IFdJTVBfVG9nZ2xlRnJvbUZ1bGxTY3JlZW4oX1RISVMpOwotCi0vKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAtIGNvbW1vbiB0byBXSU1QIGFuZCBGVUxMU0NSRUVOICovCi1zdGF0aWMgaW50IFJJU0NPU19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBSSVNDT1NfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgUklTQ09TX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgUklTQ09TX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLQotLyogUklTQyBPUyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IFJJU0NPU19BdmFpbGFibGUodm9pZCkKLXsKLQlyZXR1cm4oMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFJJU0NPU19EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKlJJU0NPU19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7Ci0JaWYgKCBkZXZpY2UgKSB7Ci0JCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLQkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCi0JCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCX0KLQlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCBkZXZpY2UgKSB7Ci0JCQlTRExfZnJlZShkZXZpY2UpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQlkZXZpY2UtPlZpZGVvSW5pdCA9IFJJU0NPU19WaWRlb0luaXQ7Ci0JZGV2aWNlLT5WaWRlb1F1aXQgPSBSSVNDT1NfVmlkZW9RdWl0OwotCi0JZGV2aWNlLT5MaXN0TW9kZXMgPSBSSVNDT1NfTGlzdE1vZGVzOwotCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gUklTQ09TX1NldFZpZGVvTW9kZTsKLQlkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBOVUxMOwotCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBSSVNDT1NfQWxsb2NIV1N1cmZhY2U7Ci0JZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7Ci0JZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOwotCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7Ci0JZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gUklTQ09TX0xvY2tIV1N1cmZhY2U7Ci0JZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBSSVNDT1NfVW5sb2NrSFdTdXJmYWNlOwotCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IFJJU0NPU19GcmVlSFdTdXJmYWNlOwotCQotCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gUklTQ09TX0ZyZWVXTUN1cnNvcjsKLQlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gUklTQ09TX0NyZWF0ZVdNQ3Vyc29yOwotCWRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBSSVNDT1NfQ2hlY2tNb3VzZU1vZGU7Ci0gICAgZGV2aWNlLT5HcmFiSW5wdXQgPSBSSVNDT1NfR3JhYklucHV0OwotCi0JZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBSSVNDT1NfSW5pdE9TS2V5bWFwOwotCi0JZGV2aWNlLT5HZXRXTUluZm8gPSBSSVNDT1NfR2V0V21JbmZvOwotCi0JZGV2aWNlLT5mcmVlID0gUklTQ09TX0RlbGV0ZURldmljZTsKLQotLyogQ2FuJ3QgZ2V0IFRvZ2dsZSBzY3JlZW4gdG8gd29yayBpZiBwcm9ncmFtIHN0YXJ0cyB1cCBpbiBGdWxsIHNjcmVlbiBtb2RlIHNvCi0gICBkaXNhYmxlIGl0IGhlcmUgYW5kIHJlLWVuYWJsZSBpdCB3aGVuIGEgd2ltcCBzY3JlZW4gaXMgY2hvc2VuICovCi0gICAgZGV2aWNlLT5Ub2dnbGVGdWxsU2NyZWVuID0gTlVMTDsgLypSSVNDT1NfVG9nZ2xlRnVsbFNjcmVlbjsqLwotCi0JLyogU2V0IG90aGVyIGVudHJpZXMgZm9yIGZ1bGxzY3JlZW4gbW9kZSAqLwotCUZVTExTQ1JFRU5fU2V0RGV2aWNlTW9kZShkZXZpY2UpOwotCi0JLyogTW91c2UgcG9pbnRlciBuZWVkcyB0byB1c2UgdGhlIFdJTVAgU2hvd0N1cnNvciB2ZXJzaW9uIHNvCi0JICAgdGhhdCBpdCBkb2Vzbid0IG1vZGlmeSB0aGUgcG9pbnRlciB1bnRpbCB0aGUgU0RMIFdpbmRvdyBpcwotCSAgIGVudGVyZWQgb3IgdGhlIGFwcGxpY2F0aW9uIGdvZXMgZnVsbCBzY3JlZW4gKi8KLQlkZXZpY2UtPlNob3dXTUN1cnNvciA9IFdJTVBfU2hvd1dNQ3Vyc29yOwotCi0JcmV0dXJuIGRldmljZTsKLX0KLQotVmlkZW9Cb290U3RyYXAgUklTQ09TX2Jvb3RzdHJhcCA9IHsKLQlSSVNDT1NWSURfRFJJVkVSX05BTUUsICJSSVNDIE9TIHZpZGVvIGRyaXZlciIsCi0JUklTQ09TX0F2YWlsYWJsZSwgUklTQ09TX0NyZWF0ZURldmljZQotfTsKLQotCi1pbnQgUklTQ09TX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLQlpbnQgdmFyc1s0XSwgdmFsc1szXTsKLQotCWlmIChSSVNDT1NfSW5pdFRhc2soKSA9PSAwKQotCXsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gc3RhcnQgdGFzayIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl2YXJzWzBdID0gOTsgIC8qIExvZyBiYXNlIDIgYnBwICovCi0JdmFyc1sxXSA9IDExOyAvKiBYV25kTGltaXQgLSBudW0geCBwaXhlbHMgLTEgKi8KLQl2YXJzWzJdID0gMTI7IC8qIFlXbmRMaW1pdCAtIG51bSB5IHBpeGVscyAtMSAqLwotCXZhcnNbM10gPSAtMTsgLyogVGVybWluYXRlIGxpc3QgKi8KLQlyZWdzLnJbMF0gPSAoaW50KXZhcnM7Ci0JcmVncy5yWzFdID0gKGludCl2YWxzOwotCi0JX2tlcm5lbF9zd2koT1NfUmVhZFZkdVZhcmlhYmxlcywgJnJlZ3MsICZyZWdzKTsKLQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSAoMSA8PCB2YWxzWzBdKTsKLQotCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLwotCXRoaXMtPmluZm8uY3VycmVudF93ID0gdmFsc1sxXSArIDE7Ci0JdGhpcy0+aW5mby5jdXJyZW50X2ggPSB2YWxzWzJdICsgMTsKLQotCS8qIE1pbmltdW0gYnBwIGZvciBTREwgaXMgOCAqLwotCWlmICh2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPCA4KSB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSA4OwotCi0KLQlzd2l0Y2ggKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCkKLQl7Ci0JCWNhc2UgMTU6Ci0JCWNhc2UgMTY6Ci0JCQl2Zm9ybWF0LT5CbWFzayA9IDB4MDAwMDdjMDA7Ci0JCQl2Zm9ybWF0LT5HbWFzayA9IDB4MDAwMDAzZTA7Ci0JCQl2Zm9ybWF0LT5SbWFzayA9IDB4MDAwMDAwMWY7Ci0JCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSAxNjsgLyogU0RMIHdhbnRzIGFjdHVhbCBudW1iZXIgb2YgYml0cyB1c2VkICovCi0JCQl2Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gMjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMjQ6Ci0JCWNhc2UgMzI6Ci0JCQl2Zm9ybWF0LT5CbWFzayA9IDB4MDBmZjAwMDA7Ci0JCQl2Zm9ybWF0LT5HbWFzayA9IDB4MDAwMGZmMDA7Ci0JCQl2Zm9ybWF0LT5SbWFzayA9IDB4MDAwMDAwZmY7Ci0JCQl2Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gNDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQl2Zm9ybWF0LT5CbWFzayA9IDA7Ci0JCQl2Zm9ybWF0LT5HbWFzayA9IDA7Ci0JCQl2Zm9ybWF0LT5SbWFzayA9IDA7Ci0JCQl2Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gMTsJCQkKLQkJCWJyZWFrOwotCX0KLQotCS8qIEZpbGwgaW4gc29tZSB3aW5kb3cgbWFuYWdlciBjYXBhYmlsaXRpZXMgKi8KLQl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDE7Ci0KLQkvKiBXZSdyZSBkb25lISAqLwotCXJldHVybigwKTsKLX0KLQotLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCi0gICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCi0qLwotdm9pZCBSSVNDT1NfVmlkZW9RdWl0KF9USElTKQotewotCVJJU0NPU19FeGl0VGFzaygpOwotCi0JaWYgKHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuaykgU0RMX2ZyZWUodGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rKTsKLQl0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmsgPSAwOwotfQotCi0KLVNETF9SZWN0ICoqUklTQ09TX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQlpZiAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikKLQl7Ci0JCS8qIEJ1aWxkIG1vZGUgbGlzdCB3aGVuIGZpcnN0IHJlcXVpcmVkLiAqLwotCQlpZiAoU0RMX251bW1vZGVzWzBdID09IDApIEZVTExTQ1JFRU5fQnVpbGRNb2RlTGlzdCh0aGlzKTsKLQotCQlyZXR1cm4oU0RMX21vZGVsaXN0WygoZm9ybWF0LT5CaXRzUGVyUGl4ZWwrNykvOCktMV0pOwotCX0gZWxzZQotCQlyZXR1cm4gKFNETF9SZWN0ICoqKS0xOwotfQotCi0KLS8qIFNldCB1cCB2aWRlbyBtb2RlICovCi1TRExfU3VyZmFjZSAqUklTQ09TX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pCi0JewotCSAgICBSSVNDT1NfU3RvcmVXaW1wTW9kZSgpOwotCQkvKiBEdW1wIHdpbXAgd2luZG93IG9uIHN3aXRjaCB0byBmdWxsIHNjcmVlbiAqLwotICAJICAgIGlmICh0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGUpIFdJTVBfRGVsZXRlV2luZG93KHRoaXMpOwotCi0JCXJldHVybiBGVUxMU0NSRUVOX1NldFZpZGVvTW9kZSh0aGlzLCBjdXJyZW50LCB3aWR0aCwgaGVpZ2h0LCBicHAsIGZsYWdzKTsKLQl9IGVsc2UKLQl7Ci0JICAgIFJJU0NPU19SZXN0b3JlV2ltcE1vZGUoKTsKLQkJcmV0dXJuIFdJTVBfU2V0VmlkZW9Nb2RlKHRoaXMsIGN1cnJlbnQsIHdpZHRoLCBoZWlnaHQsIGJwcCwgZmxhZ3MpOwotCX0KLX0KLQotCi0vKiBXZSBkb24ndCBhY3R1YWxseSBhbGxvdyBoYXJkd2FyZSBzdXJmYWNlcyBvdGhlciB0aGFuIHRoZSBtYWluIG9uZSAqLwotc3RhdGljIGludCBSSVNDT1NfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigtMSk7Ci19Ci1zdGF0aWMgdm9pZCBSSVNDT1NfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotCi0vKiBXZSBuZWVkIHRvIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2Ugb24gcGFnZSBmbGlwcGVkIGRpc3BsYXlzICovCi1zdGF0aWMgaW50IFJJU0NPU19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFJJU0NPU19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotCi1pbnQgUklTQ09TX0dldFdtSW5mbyhfVEhJUywgU0RMX1N5c1dNaW5mbyAqaW5mbykKLXsKLQlTRExfVkVSU0lPTigmKGluZm8tPnZlcnNpb24pKTsKLQlpbmZvLT53aW1wVmVyc2lvbiA9IFJJU0NPU19HZXRXaW1wVmVyc2lvbigpOwotCWluZm8tPnRhc2tIYW5kbGUgPSBSSVNDT1NfR2V0VGFza0hhbmRsZSgpOwotCWluZm8tPndpbmRvdyA9IHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZTsKLQotCXJldHVybiAxOwotfQotLyogVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUuCi0gICBSZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBvdGhlcndpc2UgMAotKi8KLQotaW50IFJJU0NPU19Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgZnVsbHNjcmVlbikKLXsKLSAgICBpZiAoZnVsbHNjcmVlbikKLSAgICB7Ci0gICAgICAgcmV0dXJuIEZVTExTQ1JFRU5fVG9nZ2xlRnJvbVdpbXAodGhpcyk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgIHJldHVybiBXSU1QX1RvZ2dsZUZyb21GdWxsU2NyZWVuKHRoaXMpOwotICAgIH0KLQotICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3N2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3ZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMzA3N2YuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX3Jpc2Nvc3ZpZGVvX2gKLSNkZWZpbmUgX1NETF9yaXNjb3N2aWRlb19oCi0KLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICJTRExfbXV0ZXguaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi0KLXN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7Ci0gICAgdW5zaWduZWQgY2hhciAqYmFua1syXTsKLSAgICBpbnQgY3VycmVudF9iYW5rOwotCXVuc2lnbmVkIGNoYXIgKmFsbG9jX2Jhbms7Ci0gICAgaW50IGhlaWdodDsKLSAgICBpbnQgeGVpZzsKLSAgICBpbnQgeWVpZzsKLQlpbnQgc2NyZWVuX2JwcDsKLQlpbnQgc2NyZWVuX3dpZHRoOwotCWludCBzY3JlZW5faGVpZ2h0OwotCWNoYXIgKnBpeHRyYW5zOwotCi0JLyogV2ltcCB2YXJpYWJsZXMgKi8KLQl1bnNpZ25lZCBpbnQgd2luZG93X2hhbmRsZTsKLQljaGFyIHRpdGxlWzI1Nl07Ci0KLSNkZWZpbmUgTlVNX01PREVMSVNUUwk0CQkvKiA4LCAxNiwgMjQsIGFuZCAzMiBiaXRzLXBlci1waXhlbCAqLwotICAgIGludCBTRExfbnVtbW9kZXNbTlVNX01PREVMSVNUU107Ci0gICAgU0RMX1JlY3QgKipTRExfbW9kZWxpc3RbTlVNX01PREVMSVNUU107Ci19OwotCi0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgU0RMX251bW1vZGVzCQkodGhpcy0+aGlkZGVuLT5TRExfbnVtbW9kZXMpCi0jZGVmaW5lIFNETF9tb2RlbGlzdAkJKHRoaXMtPmhpZGRlbi0+U0RMX21vZGVsaXN0KQotCi0jZW5kaWYgLyogX1NETF9yaXNvc3ZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vcmlzY29zL1NETF93aW1wcG9sbC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3dpbXBwb2xsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzVmYzMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3dpbXBwb2xsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0gICAgIEZpbGUgYWRkZWQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgZm9yIFJJU0MgT1MgY29tcGF0YWJpbGl0eQotCSAyNyBNYXJjaCAyMDAzCi0KLSAgICAgSW1wbGVtZW50cyBQdW1waW5nIG9mIGV2ZW50cyBhbmQgV0lNUCBwb2xsaW5nCi0qLwotCi0jaW5jbHVkZSAiU0RMLmgiCi0jaW5jbHVkZSAiU0RMX3N5c3dtLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3Jpc2Nvc3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3Jpc2Nvc2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3Jpc2Nvc21vdXNlX2MuaCIKLSNpbmNsdWRlICIuLi8uLi90aW1lci9TRExfdGltZXJfYy5oIgotCi0jaW5jbHVkZSAibWVtb3J5LmgiCi0jaW5jbHVkZSAic3RkbGliLmgiCi0jaW5jbHVkZSAiY3R5cGUuaCIKLQotI2luY2x1ZGUgImtlcm5lbC5oIgotI2luY2x1ZGUgInN3aXMuaCIKLSNpbmNsdWRlICJ1bml4bGliL29zLmgiCi0KLSNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKLQotLyogTG9jYWwgZnVuY3Rpb25zICovCi12b2lkIFdJTVBfUG9sbChfVEhJUywgaW50IHdhaXRUaW1lKTsKLXZvaWQgV0lNUF9TZXRGb2N1cyhpbnQgd2luKTsKLQotLyogU0RMX3Jpc2Nvc3Nwcml0ZSBmdW5jdGlvbnMgKi8KLXZvaWQgV0lNUF9QbG90U3ByaXRlKF9USElTLCBpbnQgeCwgaW50IHkpOwotdm9pZCBXSU1QX01vZGVDaGFuZ2VkKF9USElTKTsKLXZvaWQgV0lNUF9QYWxldHRlQ2hhbmdlZChfVEhJUyk7Ci0KLQotZXh0ZXJuIHZvaWQgV0lNUF9Qb2xsTW91c2UoX1RISVMpOwotZXh0ZXJuIHZvaWQgUklTQ09TX1BvbGxLZXlib2FyZCgpOwotCi0jaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKLS8qIFRpbWVyIHJ1bm5pbmcgZnVuY3Rpb24gKi8KLWV4dGVybiB2b2lkIFJJU0NPU19DaGVja1RpbWVyKCk7Ci0jZWxzZQotZXh0ZXJuIGludCByaXNjb3NfdXNpbmdfdGhyZWFkczsKLSNlbmRpZgotCi0vKiBNb3VzZSBjdXJzb3IgaGFuZGxpbmcgKi8KLWV4dGVybiB2b2lkIFdJTVBfUmVzaG93Q3Vyc29yKF9USElTKTsKLWV4dGVybiB2b2lkIFdJTVBfUmVzdG9yZVdpbXBDdXJzb3IoKTsKLQotaW50IGhhc0ZvY3VzID0gMDsKLWludCBtb3VzZUluV2luZG93ID0gMDsKLSAKLS8qIEZsYWcgdG8gZW5zdXJlIHdpbmRvdyBpcyBjb3JyZWN0IHNpemUgYWZ0ZXIgYSBtb2RlIGNoYW5nZSAqLwotc3RhdGljIGludCByZXNpemVPbk9wZW4gPSAwOwotCi12b2lkIFdJTVBfUHVtcEV2ZW50cyhfVEhJUykKLXsKLQlXSU1QX1BvbGwodGhpcywgMCk7Ci0JaWYgKGhhc0ZvY3VzKSBSSVNDT1NfUG9sbEtleWJvYXJkKCk7Ci0JaWYgKG1vdXNlSW5XaW5kb3cpIFdJTVBfUG9sbE1vdXNlKHRoaXMpOwotI2lmIFNETF9USFJFQURTX0RJU0FCTEVECi0JaWYgKFNETF90aW1lcl9ydW5uaW5nKSBSSVNDT1NfQ2hlY2tUaW1lcigpOwotI2VuZGlmCi19Ci0KLQotdm9pZCBXSU1QX1BvbGwoX1RISVMsIGludCB3YWl0VGltZSkKLXsKLQlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7Ci0JaW50IG1lc3NhZ2VbNjRdOwotCXVuc2lnbmVkIGludCBjb2RlOwotCWludCBwb2xsTWFzayA9IDA7Ci0JaW50IGRvUG9sbCA9IDE7Ci0JaW50IHN5c0V2ZW50OwotCWludCBzZGxXaW5kb3cgPSB0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGU7Ci0KLSAgICBpZiAodGhpcy0+UHVtcEV2ZW50cyAhPSBXSU1QX1B1bXBFdmVudHMpIHJldHVybjsKLQotICAgIGlmICh3YWl0VGltZSA+IDApCi0gICAgewotCQlfa2VybmVsX3N3aShPU19SZWFkTW9ub3RvbmljVGltZSwgJnJlZ3MsICZyZWdzKTsKLQkJd2FpdFRpbWUgKz0gcmVncy5yWzBdOwotICAgIH0KLQotICAgIHdoaWxlIChkb1BvbGwpCi0gICAgewotI2lmICFTRExfVEhSRUFEU19ESVNBQkxFRAotICAgICAgIC8qIFN0b3AgdGhyZWFkIGNhbGxiYWNrcyB3aGlsZSBwcm9ncmFtIGlzIHBhZ2VkIG91dCAqLwotICAgICAgIGlmIChyaXNjb3NfdXNpbmdfdGhyZWFkcykgX19wdGhyZWFkX3N0b3BfdGlja2VyKCk7Ci0jZW5kaWYKLQotICAgICAgICBpZiAod2FpdFRpbWUgPD0gMCkKLSAgICAgICAgewotICAgICAgICAJcmVncy5yWzBdID0gcG9sbE1hc2s7IC8qIFBvbGwgTWFzayAqLwotICAgICAgICAJLyogRm9yIG5vIHdhaXQgdGltZSBtYXNrIG91dCBudWxsIGV2ZW50IHNvIHdlIHdhaXQgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMgKi8KLSAgICAgICAgCWlmICh3YWl0VGltZSA8IDApIHJlZ3MuclswXSB8PSAxOwotICAgICAgICAJcmVncy5yWzFdID0gKGludCltZXNzYWdlOwotICAgICAgICAJX2tlcm5lbF9zd2koV2ltcF9Qb2xsLCAmcmVncywgJnJlZ3MpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmVncy5yWzBdID0gcG9sbE1hc2s7Ci0gICAgICAgIAlyZWdzLnJbMV0gPSAoaW50KW1lc3NhZ2U7Ci0gICAgICAgIAlyZWdzLnJbMl0gPSB3YWl0VGltZTsKLSAgICAgICAgCV9rZXJuZWxfc3dpKFdpbXBfUG9sbElkbGUsICZyZWdzLCAmcmVncyk7Ci0gICAgICAgIH0KLQotCQkvKiBGbGFnIHRvIHNwZWNpZnkgaWYgd2UgcG9zdCBhIFNETF9TeXNXTUV2ZW50ICovCi0Jc3lzRXZlbnQgPSAwOwotICAgICAgICAKLSAgICAgICAgY29kZSA9ICh1bnNpZ25lZCBpbnQpcmVncy5yWzBdOwotCi0Jc3dpdGNoKGNvZGUpCi0JewotICAgICAgICBjYXNlIDA6ICAvKiBOdWxsIEV2ZW50IC0gZHJvcCBvdXQgZm9yIHN0YW5kYXJkIHByb2Nlc3NpbmcqLwotCSAgIGRvUG9sbCA9IDA7Ci0JICAgYnJlYWs7Ci0KLQljYXNlIDE6ICAgICAvKiBSZWRyYXcgd2luZG93ICovCi0gICAgICAgICAgIF9rZXJuZWxfc3dpKFdpbXBfUmVkcmF3V2luZG93LCAmcmVncywmcmVncyk7Ci0JICAgaWYgKG1lc3NhZ2VbMF0gPT0gc2RsV2luZG93KQotCSAgIHsKLSAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZ3MuclswXSkKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAJICAgIFdJTVBfUGxvdFNwcml0ZSh0aGlzLCBtZXNzYWdlWzFdLCBtZXNzYWdlWzJdKTsKLSAgICAgICAgICAgCSAgICBfa2VybmVsX3N3aShXaW1wX0dldFJlY3RhbmdsZSwgJnJlZ3MsICZyZWdzKTsKLSAgICAgICAgICAgICAgICAgfQotCSAgIH0gZWxzZQotCSAgewotCS8qIFRPRE86IEN1cnJlbnRseSB3ZSBqdXN0IGVhdCB0aGVtIC0gd2UgbWF5IG5lZWQgdG8gcGFzcyB0aGVtIG9uICovCi0gICAgICAgIAl3aGlsZSAocmVncy5yWzBdKQotICAgICAgICAJewotICAgICAgICAgICAgICAgICAgICAgICAgX2tlcm5lbF9zd2koV2ltcF9HZXRSZWN0YW5nbGUsICZyZWdzLCAmcmVncyk7Ci0gICAgICAgIAl9Ci0JICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAkKLQkJY2FzZSAyOgkJLyogT3BlbiB3aW5kb3cgKi8KLQkJICAgaWYgKCByZXNpemVPbk9wZW4gJiYgbWVzc2FnZVswXSA9PSBzZGxXaW5kb3cpCi0JCSAgIHsKLQkJICAgICAgLyogRW5zdXJlIHdpbmRvdyBpcyBjb3JyZWN0IHNpemUgKi8KLQkJICAgICAgcmVzaXplT25PcGVuID0gMDsKLQkJICAgICAgbWVzc2FnZVszXSA9IG1lc3NhZ2VbMV0gKyAodGhpcy0+c2NyZWVuLT53IDw8IHRoaXMtPmhpZGRlbi0+eGVpZyk7Ci0JCSAgICAgIG1lc3NhZ2VbNF0gPSBtZXNzYWdlWzJdICsgKHRoaXMtPnNjcmVlbi0+aCA8PCB0aGlzLT5oaWRkZW4tPnllaWcpOyAgICAgICAKLQkJICAgfQotICAgICAgICAJX2tlcm5lbF9zd2koV2ltcF9PcGVuV2luZG93LCAmcmVncywgJnJlZ3MpOwotICAgICAgIAkgICAgYnJlYWs7Ci0gICAgICAgIAkKLQkJY2FzZSAzOgkJLyogQ2xvc2Ugd2luZG93ICovCi0JCQlpZiAobWVzc2FnZVswXSA9PSBzZGxXaW5kb3cpCi0JCQl7Ci0JCQkJLyogRG9jdW1lbnRhdGlvbiBtYWtlcyBpdCBsb29rcyBhcyBpZiB0aGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQkJCQkqKiAgICBpZiAoU0RMX1ByaXZhdGVRdWl0KCkgPT0gMSkgX2tlcm5lbF9zd2koV2ltcF9DbG9zZVdpbmRvdywgJnJlZ3MsICZyZWdzKTsKLQkJCQkqKiBIb3dldmVyIHNvbWUgcHJvZ3JhbXMgZG9uJ3QgcHJvY2VzcyB0aGlzIG1lc3NhZ2UgYW5kIHNvIHNpdCB0aGVyZSBpbnZpc2libHkKLQkJCQkqKiBpbiB0aGUgYmFja2dyb3VuZCBzbyBJIGp1c3QgcG9zdCB0aGUgcXVpdCBtZXNzYWdlIGFuZCBob3BlIHRoZSBhcHBsaWNhdGlvbgotCQkJCSoqIGRvZXMgdGhlIGNvcnJlY3QgdGhpbmcuCi0JCQkJKi8KLQkJCQlTRExfUHJpdmF0ZVF1aXQoKTsKLQkJCX0gZWxzZQotCQkJCXN5c0V2ZW50ID0gMTsKLSAgICAgICAgCWRvUG9sbCA9IDA7Ci0gICAgICAgIAlicmVhazsKLQotCQljYXNlIDQ6IC8qIFBvaW50ZXJfTGVhdmluZ19XaW5kb3cgKi8KLQkJCWlmIChtZXNzYWdlWzBdID09IHNkbFdpbmRvdykKLQkJCXsKLQkJCQltb3VzZUluV2luZG93ID0gMDsKLQkJCQkvL1RPRE86IExvc2UgYnV0dG9ucyAvIGRyYWdnaW5nCi0JCQkJIC8qIFJlc2V0IHRvIGRlZmF1bHQgcG9pbnRlciAqLwotCQkJCSBXSU1QX1Jlc3RvcmVXaW1wQ3Vyc29yKCk7Ci0JCQkJIFNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQkJCX0gZWxzZQotCQkJCXN5c0V2ZW50ID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgNTogLyogUG9pbnRlcl9FbnRlcmluZ19XaW5kb3cgKi8KLQkJCWlmIChtZXNzYWdlWzBdID09IHNkbFdpbmRvdykgCi0JCQl7Ci0JCQkJbW91c2VJbldpbmRvdyA9IDE7Ci0JCQkJV0lNUF9SZXNob3dDdXJzb3IodGhpcyk7Ci0JCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOwotCQkJfSBlbHNlIHN5c0V2ZW50ID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgNjoJCS8qIE1vdXNlX0NsaWNrICovCi0JCQlpZiAoaGFzRm9jdXMgPT0gMCkKLQkJCXsKLQkJCSAgIC8qIEZpcnN0IGNsaWNrIGdpdmVzIGZvY3VzIGlmIGl0J3Mgbm90IGEgbWVudSAqLwotCQkJICAgLyogd2Ugb25seSBjb3VudCBub24tbWVudSBjbGlja3Mgb24gYSB3aW5kb3cgdGhhdCBoYXMgdGhlIGZvY3VzICovCi0JCQkgICBXSU1QX1NldEZvY3VzKG1lc3NhZ2VbM10pOwotCQkJfSBlbHNlCi0JCQkJZG9Qb2xsID0gMDsgLy8gU28gUG9sbE1vdXNlIGdldHMgYSBjaGFuY2UgdG8gcGljayBpdCB1cAotCQkgICBicmVhazsKLQotCQljYXNlIDc6IC8qIFVzZXJfRHJhZ19Cb3ggLSBVc2VkIGZvciBtb3VzZSByZWxlYXNlICovCi0JCQkvL1RPRE86IE1heSBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGluIHRoZSBmdXR1cmUKLQkJCXN5c0V2ZW50ID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgODogLyogS2V5cHJlc3NlZCAqLwotCQkJZG9Qb2xsID0gMDsgLyogUG9sbEtleWJvYXJkIHNob3VsZCBwaWNrIGl0IHVwICovCi0JCQlpZiAobWVzc2FnZVswXSAhPSBzZGxXaW5kb3cpIHN5c0V2ZW50ID0gMTsKLQkJCS8qVE9ETzogTWF5IHdhbnQgdG8gYWx3YXlzIHBhc3MgRjEyIGV0YyB0byB0aGUgd2ltcAotCQkJewotCQkJCXJlZ3MuclswXSA9IG1lc3NhZ2VbNl07Ci0JCQkJX2tlcm5lbF9zd2koV2ltcF9Qcm9jZXNzS2V5LCAmcmVncywgJnJlZ3MpOwotCQkJfQotCQkJKi8KLQkJCWJyZWFrOwotCi0JCWNhc2UgMTE6IC8qIExvc2UgQ2FyZXQgKi8KLQkJCSBoYXNGb2N1cyA9IDA7Ci0JCQkgaWYgKG1lc3NhZ2VbMF0gPT0gc2RsV2luZG93KSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQSU5QVVRGT0NVUyk7Ci0JCQkgZWxzZSBzeXNFdmVudCA9IDE7Ci0JCQkgYnJlYWs7Ci0KLQkJY2FzZSAxMjogLyogR2FpbiBDYXJldCAqLwotCQkJIGhhc0ZvY3VzID0gMTsKLQkJCSBpZiAobWVzc2FnZVswXSA9PSBzZGxXaW5kb3cpIFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBJTlBVVEZPQ1VTKTsKLQkJCSBlbHNlIHN5c0V2ZW50ID0gMTsKLQkJCSBicmVhazsKLSAgICAgICAgCQotCQljYXNlIDE3OgotCQljYXNlIDE4OgotCQkJc3lzRXZlbnQgPSAxOyAvKiBBbGwgbWVzc2FnZXMgYXJlIHBhc3NlZCBvbiAqLwotCi0JCQlzd2l0Y2gobWVzc2FnZVs0XSkKLQkJCXsKLQkJCWNhc2UgMDogLyogUXVpdCBFdmVudCAqLwotCQkJCS8qIE5vIGNob2ljZSAtIGhhdmUgdG8gcXVpdCAqLwotCQkJICAgU0RMX1F1aXQoKTsKLSAgICAgICAgCSAgIGV4aXQoMCk7Ci0JCQkgICBicmVhazsKLQotCQkJY2FzZSA4OiAvKiBQcmUgUXVpdCAqLwotCQkJCVNETF9Qcml2YXRlUXVpdCgpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDB4NDAwYzE6IC8qIE1vZGUgY2hhbmdlICovCi0JCQkJV0lNUF9Nb2RlQ2hhbmdlZCh0aGlzKTsKLQkJCQlyZXNpemVPbk9wZW4gPSAxOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDk6ICAgICAgLyogUGFsZXR0ZSBjaGFuZ2VkICovCi0JCQkJV0lNUF9QYWxldHRlQ2hhbmdlZCh0aGlzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkvKiBQYXNzIHVua25vd24gZXZlbnRzIG9uICovCi0JCQlzeXNFdmVudCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzeXNFdmVudCkKLQkJewotCSAgICAgICAgU0RMX1N5c1dNbXNnIHdtbXNnOwotCi0JCQlTRExfVkVSU0lPTigmd21tc2cudmVyc2lvbik7Ci0JCQl3bW1zZy5ldmVudENvZGUgPSBjb2RlOwotCQkJU0RMX21lbWNweSh3bW1zZy5wb2xsQmxvY2ssIG1lc3NhZ2UsIDY0ICogc2l6ZW9mKGludCkpOwotCi0JCQkvKiBGYWxsIG91dCBvZiBwb2xsaW5nIGxvb3AgaWYgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgcG9zdGVkICovCi0JCQlpZiAoU0RMX1ByaXZhdGVTeXNXTUV2ZW50KCZ3bW1zZykpIGRvUG9sbCA9IDA7Ci0JCX0KLSNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKLQkJaWYgKHJpc2Nvc191c2luZ190aHJlYWRzKQotCQl7Ci0gICAgICAgICAgICAgICAgICAgLyogUmVzdGFydCB0aWNrZXIgaGVyZSBzbyBvdGhlciB0aHJlYWQgY2FuIG5vdCBpbnRlcmZlcmUKLSAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBSZWRyYXcgcHJvY2Vzc2luZyAqLwotCQkgICBpZiAocmlzY29zX3VzaW5nX3RocmVhZHMpIF9fcHRocmVhZF9zdGFydF90aWNrZXIoKTsKLSAgICAgICAgICAgICAgICAgICAvKiBHaXZlIG90aGVyIHRocmVhZHMgYSBiZXR0ZXIgY2hhbmNlIG9mIHJ1bm5pbmcgKi8KLQkJICAgcHRocmVhZF95aWVsZCgpOwotCQl9Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLS8qIFNldCBmb2N1cyB0byBzcGVjaWZpZWQgd2luZG93ICovCi12b2lkIFdJTVBfU2V0Rm9jdXMoaW50IHdpbikKLXsKLQlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7Ci0KLQlyZWdzLnJbMF0gPSB3aW47Ci0JcmVncy5yWzFdID0gLTE7IC8qIEljb24gaGFuZGxlICovCi0JcmVncy5yWzJdID0gMDsgIC8qIFgtb2Zmc2V0IHdlIGp1c3QgcHV0IGl0IGF0IHBvc2l0aW9uIDAgKi8KLQlyZWdzLnJbM10gPSAwOyAgLyogWS1vZmZzZXQgYXMgYWJvdmUgKi8KLQlyZWdzLnJbNF0gPSAxIDw8IDI1OyAvKiBDYXJldCBpcyBpbnZpc2libGUgKi8KLQlyZWdzLnJbNV0gPSAwOyAgLyogaW5kZXggaW50byBzdHJpbmcgKi8KLQotCV9rZXJuZWxfc3dpKFdpbXBfU2V0Q2FyZXRQb3NpdGlvbiwgJnJlZ3MsICZyZWdzKTsKLX0KLQotLyoqIFJ1biBiYWNrZ3JvdW5kIHRhc2sgd2hpbGUgaW4gYSBzbGVlcCBjb21tYW5kICovCi12b2lkIFJJU0NPU19CYWNrZ3JvdW5kVGFza3Modm9pZCkKLXsKLQlpZiAoY3VycmVudF92aWRlbyAmJiBjdXJyZW50X3ZpZGVvLT5oaWRkZW4tPndpbmRvd19oYW5kbGUpCi0JewotCQlXSU1QX1BvbGwoY3VycmVudF92aWRlbywgMCk7Ci0JfQotI2lmIFNETF9USFJFQURTX0RJU0FCTEVECi0JaWYgKFNETF90aW1lcl9ydW5uaW5nKSBSSVNDT1NfQ2hlY2tUaW1lcigpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfd2ltcHZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfd2ltcHZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODY4NDQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9yaXNjb3MvU0RMX3dpbXB2aWRlby5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICAgICBGaWxlIGFkZGVkIGJ5IEFsYW4gQnVja2xleSAoYWxhbl9iYWFAaG90bWFpbC5jb20pIGZvciBSSVNDIE9TIGNvbXBhdGFiaWxpdHkKLQkgMjcgTWFyY2ggMjAwMwotCi0gICAgIEltcGxlbWVudHMgUklTQyBPUyBXaW1wIGRpc3BsYXkuCi0qLwotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotCi0jaW5jbHVkZSAiU0RMX3Jpc2Nvc3Rhc2suaCIKLSNpbmNsdWRlICJTRExfcmlzY29zdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfcmlzY29zZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfcmlzY29zbW91c2VfYy5oIgotCi0jaW5jbHVkZSAia2VybmVsLmgiCi0jaW5jbHVkZSAic3dpcy5oIgotCi0vKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KLVNETF9SZWN0ICoqV0lNUF9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotU0RMX1N1cmZhY2UgKldJTVBfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOwotaW50IFdJTVBfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKLXZvaWQgV0lNUF9TZXRXTUNhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKLQotCi1leHRlcm4gdW5zaWduZWQgY2hhciAqV0lNUF9DcmVhdGVCdWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwKTsKLWV4dGVybiB2b2lkIFdJTVBfUHVtcEV2ZW50cyhfVEhJUyk7Ci1leHRlcm4gdm9pZCBXSU1QX1Bsb3RTcHJpdGUoX1RISVMsIGludCB4LCBpbnQgeSk7Ci1leHRlcm4gdm9pZCBXSU1QX1NldHVwUGxvdEluZm8oX1RISVMpOwotZXh0ZXJuIHZvaWQgV0lNUF9TZXRGb2N1cyhpbnQgd2luKTsKLQotLyogZXRjLiAqLwotc3RhdGljIHZvaWQgV0lNUF9VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotCi0vKiBSSVNDIE9TIFdpbXAgaGFuZGxpbmcgaGVscGVycyAqLwotdm9pZCBXSU1QX1JlYWRNb2RlSW5mbyhfVEhJUyk7Ci11bnNpZ25lZCBpbnQgV0lNUF9TZXR1cFdpbmRvdyhfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotdm9pZCBXSU1QX1NldERldmljZU1vZGUoX1RISVMpOwotdm9pZCBXSU1QX0RlbGV0ZVdpbmRvdyhfVEhJUyk7Ci0KLS8qIEZVTExTQ1JFRU4gZnVuY3Rpb24gcmVxdWlyZWQgZm9yIHdpbXAvZnVsbHNjcmVlbiB0b2dnbGluZyAqLwotZXh0ZXJuIGludCBGVUxMU0NSRUVOX1NldE1vZGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwKTsKLQotLyogQ3VycmVudGx5IG5lZWQgdG8gc2V0IHRoaXMgdXAgaGVyZSBhcyBpdCBvbmx5IHdvcmtzIGlmIHlvdQotICAgc3RhcnQgdXAgaW4gYSBXaW1wIG1vZGUgKi8KLWV4dGVybiBpbnQgUklTQ09TX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBmdWxsc2NyZWVuKTsKLQotZXh0ZXJuIGludCByaXNjb3NfYmFja2J1ZmZlcjsKLWV4dGVybiBpbnQgbW91c2VJbldpbmRvdzsKLWV4dGVybiBpbnQgcmlzY29zX2Nsb3NlYWN0aW9uOwotCi0vKiBGb2xsb3dpbmcgbmVlZGVkIHRvIGVuc3VyZSB3aW5kb3cgaXMgc2hvd24gaW1tZWRpYXRlbHkgKi8KLWV4dGVybiBpbnQgaGFzRm9jdXM7Ci1leHRlcm4gdm9pZCBXSU1QX1BvbGwoX1RISVMsIGludCB3YWl0VGltZSk7Ci0KLVNETF9TdXJmYWNlICpXSU1QX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0gICBVaW50MzIgUm1hc2sgPSAwOwotICAgVWludDMyIEdtYXNrID0gMDsKLSAgIFVpbnQzMiBCbWFzayA9IDA7Ci0gICBjaGFyICpidWZmZXIgPSBOVUxMOwotICAgaW50IGJ5dGVzUGVyUGl4ZWwgPSAxOwotCi0gICAvKiBEb24ndCBzdXBwb3J0IGRvdWJsZSBidWZmZXJpbmcgaW4gV2ltcCBtb2RlICovCi0gICBmbGFncyAmPSB+U0RMX0RPVUJMRUJVRjsKLSAgIGZsYWdzICY9IH5TRExfSFdTVVJGQUNFOwotCi0gICBzd2l0Y2goYnBwKQotICAgewotCWNhc2UgODoKLQkJLyogRW11bGF0ZWQgcGFsZXR0ZSB1c2luZyBDb2xvdXJUcmFucyAqLwotCQlmbGFncyB8PSBTRExfSFdQQUxFVFRFOwotCQlicmVhazsKLQotCWNhc2UgMTU6Ci0JY2FzZSAxNjoKLQkJQm1hc2sgPSAweDAwMDA3YzAwOwotCQlHbWFzayA9IDB4MDAwMDAzZTA7Ci0JCVJtYXNrID0gMHgwMDAwMDAxZjsKLQkJYnl0ZXNQZXJQaXhlbCA9IDI7Ci0JCWJyZWFrOwotCi0JY2FzZSAzMjoKLQkJQm1hc2sgPSAweDAwZmYwMDAwOwotCQlHbWFzayA9IDB4MDAwMGZmMDA7Ci0JCVJtYXNrID0gMHgwMDAwMDBmZjsKLQkJYnl0ZXNQZXJQaXhlbCA9IDQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJU0RMX1NldEVycm9yKCJQaXhlbCBkZXB0aCBub3Qgc3VwcG9ydGVkIik7Ci0JCXJldHVybiBOVUxMOwotCQlicmVhazsKLSAgIH0KLQotLyogCXByaW50ZigiU2V0dGluZyBtb2RlICVkeCVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsqLwotCi0JLyogQWxsb2NhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHRoZSBzY3JlZW4gKi8KLQlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgYnBwLCBSbWFzaywgR21hc2ssIEJtYXNrLCAwKSApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciByZXF1ZXN0ZWQgbW9kZSIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLwotCWN1cnJlbnQtPncgPSB3aWR0aDsKLQl0aGlzLT5oaWRkZW4tPmhlaWdodCA9IGN1cnJlbnQtPmggPSBoZWlnaHQ7Ci0KLQlpZiAoYnBwID09IDE1KSBicHAgPSAxNjsKLQlidWZmZXIgPSBXSU1QX0NyZWF0ZUJ1ZmZlcih3aWR0aCwgaGVpZ2h0LCBicHApOwotCWlmIChidWZmZXIgPT0gTlVMTCkKLQl7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNwcml0ZSBmb3IgdmlkZW8gbWVtb3J5Iik7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JdGhpcy0+aGlkZGVuLT5iYW5rWzBdID0gYnVmZmVyICsgNjA7IC8qIFN0YXJ0IG9mIHNwcml0ZSBkYXRhICovCi0JaWYgKGJwcCA9PSA4KSB0aGlzLT5oaWRkZW4tPmJhbmtbMF0gKz0gMjA0ODsgLyogOGJwcCBzcHJpdGUgaGF2ZSBwYWxldHRlIGZpcnN0ICovCi0KLQl0aGlzLT5oaWRkZW4tPmJhbmtbMV0gPSBidWZmZXI7ICAgICAgLyogU3RhcnQgb2YgYnVmZmVyICovCi0KLQkvKiBSZW1lbWJlciBzcHJpdGUgYnVmZmVyIHNvIGl0IGNhbiBiZSBmcmVlZCBsYXRlciAqLwotCWlmICh0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmspIFNETF9mcmVlKHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuayk7Ci0JdGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rID0gYnVmZmVyOwotCi0JY3VycmVudC0+cGl0Y2ggPSB3aWR0aCAqIGJ5dGVzUGVyUGl4ZWw7Ci0JaWYgKChjdXJyZW50LT5waXRjaCAmIDMpKQotCXsKLQkJLyogU3ByaXRlcyBhcmUgMzJiaXQgd29yZCBhbGlnbmVkICovCi0JCWN1cnJlbnQtPnBpdGNoICs9ICg0IC0gKGN1cnJlbnQtPnBpdGNoICYgMykpOwotCX0KLQotICAJY3VycmVudC0+ZmxhZ3MgPSBmbGFncyB8IFNETF9QUkVBTExPQzsKLQotCVdJTVBfUmVhZE1vZGVJbmZvKHRoaXMpOwotCQotICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLT5iYW5rWzBdLCAwLCBoZWlnaHQgKiBjdXJyZW50LT5waXRjaCk7Ci0KLQl0aGlzLT5oaWRkZW4tPmN1cnJlbnRfYmFuayA9IDA7Ci0JY3VycmVudC0+cGl4ZWxzID0gdGhpcy0+aGlkZGVuLT5iYW5rWzBdOwotCi0KLQlpZiAoV0lNUF9TZXR1cFdpbmRvdyh0aGlzLCBjdXJyZW50KSA9PSAwKQotCXsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIHdpbmRvdyB0byBkaXNwbGF5IHN1cmZhY2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogUmVzZXQgZGV2aWNlIGZ1bmN0aW9ucyBmb3IgdGhlIHdpbXAgKi8KLQlXSU1QX1NldERldmljZU1vZGUodGhpcyk7Ci0KLQkvKiBOZWVkcyB0byBzZXQgdXAgcGxvdCBpbmZvIGFmdGVyIHdpbmRvdyBoYXMgYmVlbiBjcmVhdGVkICovCi0JLyogTm90IHN1cmUgd2h5LCBidXQgcGxvdHMgZG9uJ3Qgd29yayBpZiBJIGRvIGl0IGVhcmxpZXIgKi8KLQlXSU1QX1NldHVwUGxvdEluZm8odGhpcyk7Ci0KLQkvKiBQb2xsIHVudGlsIHdpbmRvdyBpcyBzaG93biAqLwotCXsKLQkgICAvKiBXZSB3YWl0IHVudGlsIGl0IGdldHMgdGhlIGZvY3VzLCBidXQgZ2l2ZSB1cCBhZnRlciA1IHNlY29uZHMKLQkgICAgICBpbiBjYXNlIHRoZSBmb2N1cyBpcyBwcmV2ZW50ZWQgaW4gYW55IHdheS4KLQkgICAqLwotCSAgIFVpbnQzMiBub3cgPSBTRExfR2V0VGlja3MoKTsKLQkgICB3aGlsZSAoIWhhc0ZvY3VzICYmIFNETF9HZXRUaWNrcygpIC0gbm93IDwgNTAwMCkKLQkgICB7Ci0JICAgICAgV0lNUF9Qb2xsKHRoaXMsIDApOwotCSAgIH0KLQl9Ci0KLQkvKiBXZSdyZSBkb25lICovCi0JcmV0dXJuKGN1cnJlbnQpOwotfQotCi0KLXZvaWQgV0lNUF9SZWFkTW9kZUluZm8oX1RISVMpCi17Ci0JX2tlcm5lbF9zd2lfcmVncyByZWdzOwotCWludCB2YXJzWzZdOwotCWludCB2YWxzWzVdOwotCi0JdmFyc1swXSA9IDQ7ICAvKiBYRWlnICovCi0JdmFyc1sxXSA9IDU7ICAvKiBZRWlnICovCi0JdmFyc1syXSA9IDk7ICAvKiBMb2cgYmFzZSAyIGJwcCAqLwotCXZhcnNbM10gPSAxMTsgLyogU2NyZWVuIFdpZHRoIC0gMSAqLwotCXZhcnNbNF0gPSAxMjsgLyogU2NyZWVuIERlcHRoIC0gMSAqLwotCXZhcnNbNV0gPSAtMTsgLyogVGVybWluYXRlIGxpc3QgKi8KLQotCXJlZ3MuclswXSA9IChpbnQpdmFyczsKLQlyZWdzLnJbMV0gPSAoaW50KXZhbHM7Ci0JX2tlcm5lbF9zd2koT1NfUmVhZFZkdVZhcmlhYmxlcywgJnJlZ3MsICZyZWdzKTsKLQl0aGlzLT5oaWRkZW4tPnhlaWcgPSB2YWxzWzBdOwotCXRoaXMtPmhpZGRlbi0+eWVpZyA9IHZhbHNbMV07Ci0JdGhpcy0+aGlkZGVuLT5zY3JlZW5fYnBwID0gMSA8PCB2YWxzWzJdOwotCXRoaXMtPmhpZGRlbi0+c2NyZWVuX3dpZHRoID0gdmFsc1szXSArIDE7Ci0JdGhpcy0+aGlkZGVuLT5zY3JlZW5faGVpZ2h0ID0gdmFsc1s0XSArIDE7Ci19Ci0KLS8qIFNldCBkZXZpY2UgZnVuY3Rpb24gdG8gY2FsbCB0aGUgY29ycmVjdCB2ZXJzaW9ucyBmb3IgcnVubmluZwotICAgaW4gYSB3aW1wIHdpbmRvdyAqLwotCi12b2lkIFdJTVBfU2V0RGV2aWNlTW9kZShfVEhJUykKLXsKLQlpZiAodGhpcy0+VXBkYXRlUmVjdHMgPT0gV0lNUF9VcGRhdGVSZWN0cykgcmV0dXJuOyAvKiBBbHJlYWR5IHNldCB1cCAqLwotCi0JdGhpcy0+U2V0Q29sb3JzICAgPSBXSU1QX1NldENvbG9yczsKLQl0aGlzLT5VcGRhdGVSZWN0cyA9IFdJTVBfVXBkYXRlUmVjdHM7Ci0KLQl0aGlzLT5GbGlwSFdTdXJmYWNlID0gTlVMTDsKLQotCXRoaXMtPlNldENhcHRpb24gPSBXSU1QX1NldFdNQ2FwdGlvbjsKLQl0aGlzLT5TZXRJY29uID0gTlVMTDsKLQl0aGlzLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKLQkKLQl0aGlzLT5TaG93V01DdXJzb3IgPSBXSU1QX1Nob3dXTUN1cnNvcjsKLQl0aGlzLT5XYXJwV01DdXJzb3IgPSBXSU1QX1dhcnBXTUN1cnNvcjsKLQotICAgICAgICB0aGlzLT5Ub2dnbGVGdWxsU2NyZWVuID0gUklTQ09TX1RvZ2dsZUZ1bGxTY3JlZW47Ci0KLQl0aGlzLT5QdW1wRXZlbnRzID0gV0lNUF9QdW1wRXZlbnRzOwkKLX0KLQotLyogU2V0dXAgdGhlIFdpbmRvdyB0byBkaXNwbGF5IHRoZSBzdXJmYWNlICovCi11bnNpZ25lZCBpbnQgV0lNUF9TZXR1cFdpbmRvdyhfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JX2tlcm5lbF9zd2lfcmVncyByZWdzOwotCWludCB3aW5kb3dfZGF0YVsyM107Ci0gICAgaW50CSp3aW5kb3dfYmxvY2sgPSB3aW5kb3dfZGF0YSsxOwotCWludCB4ID0gKHRoaXMtPmhpZGRlbi0+c2NyZWVuX3dpZHRoIC0gc3VyZmFjZS0+dykgLyAyOwotCWludCB5ID0gKHRoaXMtPmhpZGRlbi0+c2NyZWVuX2hlaWdodCAtIHN1cmZhY2UtPmgpIC8gMjsKLQlpbnQgeGVpZyA9IHRoaXMtPmhpZGRlbi0+eGVpZzsKLQlpbnQgeWVpZyA9IHRoaXMtPmhpZGRlbi0+eWVpZzsKLQotICAgIG1vdXNlSW5XaW5kb3cgPSAwOwotICAgIAotCS8qIEFsd2F5cyBkZWxldGUgdGhlIHdpbmRvdyBhbmQgcmVjcmVhdGUgb24gYSBjaGFuZ2UgKi8KLQlpZiAodGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlKSBXSU1QX0RlbGV0ZVdpbmRvdyh0aGlzKTsKLQotCS8qIFNldHVwIHdpbmRvdyBjby1vcmRpbmF0ZXMgKi8KLSAgIHdpbmRvd19ibG9ja1swXSA9IHggPDwgeGVpZzsKLSAgIHdpbmRvd19ibG9ja1sxXSA9IHkgPDwgeWVpZzsKLSAgIHdpbmRvd19ibG9ja1syXSA9IHdpbmRvd19ibG9ja1swXSArIChzdXJmYWNlLT53IDw8IHhlaWcpOwotICAgd2luZG93X2Jsb2NrWzNdID0gd2luZG93X2Jsb2NrWzFdICsgKHN1cmZhY2UtPmggPDwgeWVpZyk7Ci0KLSAgIAotICAgd2luZG93X2Jsb2NrWzRdID0gMDsJCQkJICAvKiBTY3JvbGwgb2Zmc2V0cyAqLwotICAgd2luZG93X2Jsb2NrWzVdID0gMDsKLSAgIHdpbmRvd19ibG9ja1s2XSA9IC0xOwkJCSAgLyogT3BlbiBvbiB0b3Agb2Ygd2luZG93IHN0YWNrICovCi0KLSAgIHdpbmRvd19ibG9ja1s3XSA9IDB4ODUwNDAwNDI7ICAgICAgLyogV2luZG93IGZsYWdzICovCi0gICBpZiAocmlzY29zX2Nsb3NlYWN0aW9uICE9IDApIHdpbmRvd19ibG9ja1s3XSB8PSAweDIwMDAwMDA7Ci0KLSAgIC8qIFRPRE86IFRha2UgaW50byBhY2NvdW50IHN1cmZhY2UtPmZsYWdzICovCi0KLSAgIHdpbmRvd19ibG9ja1s4XSA9IDB4ZmYwNzAyMDc7ICAgICAgLyogV2luZG93IGNvbG91cnMgKi8KLSAgIHdpbmRvd19ibG9ja1s5XSA9IDB4MDAwYzAxMDM7Ci0gICB3aW5kb3dfYmxvY2tbMTBdID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFdvcmsgYXJlYSBtaW5pbXVtICovCi0gICB3aW5kb3dfYmxvY2tbMTFdID0gLXN1cmZhY2UtPmggPDwgeWVpZzsKLSAgIHdpbmRvd19ibG9ja1sxMl0gPSBzdXJmYWNlLT53IDw8IHhlaWc7ICAgLyogV29yayBhcmVhIG1heGltdW0gKi8KLSAgIHdpbmRvd19ibG9ja1sxM10gPSAwOwotICAgd2luZG93X2Jsb2NrWzE0XSA9IDB4MjcwMDAxM2Q7ICAgIC8qIFRpdGxlIGljb24gZmxhZ3MgKi8KLSAgIHdpbmRvd19ibG9ja1sxNV0gPSAweDAwMDAzMDAwOwkgLyogV29yayBhcmVhIGZsYWdzIC0gTW91c2UgY2xpY2sgZG93biByZXBvcnRlZCAqLwotICAgd2luZG93X2Jsb2NrWzE2XSA9IDE7ICAgICAgICAgICAgIC8qIFNwcml0ZSBhcmVhIGNvbnRyb2wgYmxvY2sgcG9pbnRlciAqLwotICAgd2luZG93X2Jsb2NrWzE3XSA9IDB4MDAxMDAwMTA7CSAvKiBNaW5pbXVtIHdpbmRvdyBzaXplICh3aWR0aCAmIGhlaWdodCkgKDE2eDE2KSovCi0gICB3aW5kb3dfYmxvY2tbMThdID0gKGludCl0aGlzLT5oaWRkZW4tPnRpdGxlOyAgICAvKiBUaXRsZSBkYXRhICovCi0gICB3aW5kb3dfYmxvY2tbMTldID0gLTE7Ci0gICB3aW5kb3dfYmxvY2tbMjBdID0gMjU2OwotICAgd2luZG93X2Jsb2NrWzIxXSA9IDA7CQkJIC8qIE51bWJlciBvZiBpY29ucyAqLwotCi0gICByZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KSh3aW5kb3dfYmxvY2spOwotICAgCi0gICAvKiBDcmVhdGUgdGhlIHdpbmRvdyAqLwotICAgaWYgKF9rZXJuZWxfc3dpKFdpbXBfQ3JlYXRlV2luZG93LCAmcmVncywgJnJlZ3MpID09IE5VTEwpCi0gICB7Ci0JICAgdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlID0gd2luZG93X2RhdGFbMF0gPSByZWdzLnJbMF07Ci0KLQkgICAvKiBTaG93IHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbiAqLwotCSAgIHJlZ3MuclsxXSA9ICh1bnNpZ25lZCBpbnQpd2luZG93X2RhdGE7Ci0gICAgICAgaWYgKF9rZXJuZWxfc3dpKFdpbXBfT3BlbldpbmRvdywgJnJlZ3MsICZyZWdzKSA9PSBOVUxMKQotICAgICAgIHsKLSAgICAgICAgICBXSU1QX1NldEZvY3VzKHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZSk7Ci0gICAgICAgfSBlbHNlCi0gICAgICAgewotCQkgIFdJTVBfRGVsZXRlV2luZG93KHRoaXMpOwotCSAgIH0KLSAgIH0KLSAgIAotICAgcmV0dXJuIHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZTsKLX0KLQotLyogRGVzdHJveSB0aGUgV2luZG93ICovCi0KLXZvaWQgV0lNUF9EZWxldGVXaW5kb3coX1RISVMpCi17Ci0JX2tlcm5lbF9zd2lfcmVncyByZWdzOwotICAgIHJlZ3MuclsxXSA9ICh1bnNpZ25lZCBpbnQpJih0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGUpOwotCV9rZXJuZWxfc3dpKFdpbXBfRGVsZXRlV2luZG93LCAmcmVncywgJnJlZ3MpOwotCXRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZSA9IDA7Ci19Ci0KLQotdm9pZCBXSU1QX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLQlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7Ci0JaW50IHVwZGF0ZV9ibG9ja1sxMl07Ci0JaW50IHhlaWcgPSB0aGlzLT5oaWRkZW4tPnhlaWc7Ci0JaW50IHllaWcgPSB0aGlzLT5oaWRkZW4tPnllaWc7Ci0JaW50IGo7Ci0JdXBkYXRlX2Jsb2NrWzBdID0gdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlOwotCi0JZm9yIChqID0gMDsgaiA8IG51bXJlY3RzOyBqKyspCi0JewotCQl1cGRhdGVfYmxvY2tbMV0gPSByZWN0c1tqXS54IDw8IHhlaWc7IC8qIE1pbiBYICovCi0JCXVwZGF0ZV9ibG9ja1s0XSA9IC0ocmVjdHNbal0ueSA8PCB5ZWlnKTsKLQkJdXBkYXRlX2Jsb2NrWzNdID0gdXBkYXRlX2Jsb2NrWzFdICsgKHJlY3RzW2pdLncgPDwgeGVpZyk7Ci0JCXVwZGF0ZV9ibG9ja1syXSA9IHVwZGF0ZV9ibG9ja1s0XSAtIChyZWN0c1tqXS5oIDw8IHllaWcpOwotCi0JCXJlZ3MuclsxXSA9IChpbnQpdXBkYXRlX2Jsb2NrOwotCQkvKiBVcGRhdGUgd2luZG93IGNhbiBmYWlsIGlmIGNhbGxlZCBiZWZvcmUgZmlyc3QgcG9sbCAqLwotCQlpZiAoX2tlcm5lbF9zd2koV2ltcF9VcGRhdGVXaW5kb3csICZyZWdzLCAmcmVncykgPT0gMCkKLQkJewotCQkJd2hpbGUgKHJlZ3MuclswXSkKLQkJCXsKLQkJCQlXSU1QX1Bsb3RTcHJpdGUodGhpcywgdXBkYXRlX2Jsb2NrWzFdLCB1cGRhdGVfYmxvY2tbMl0pOwotCQkJCV9rZXJuZWxfc3dpKFdpbXBfR2V0UmVjdGFuZ2xlLCAmcmVncywgJnJlZ3MpOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLWludCBXSU1QX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKLXsKLSAgIHVuc2lnbmVkIGludCAqcGFsID0gKHVuc2lnbmVkIGludCAqKSh0aGlzLT5oaWRkZW4tPmJhbmtbMV0rNjApOwotICAgaW50IGo7Ci0gICBTRExfUmVjdCB1cGRhdGU7Ci0KLSAgIHBhbCArPSBmaXJzdGNvbG9yKjI7Ci0gICBmb3IgKGogPSAwOyBqIDwgbmNvbG9yczsgaisrKQotICAgewotICAgICAgKnBhbCA9ICgoKHVuc2lnbmVkIGludCljb2xvcnMtPnIpIDw8IDgpCi0gICAgICAgICAgICAgKyAoKCh1bnNpZ25lZCBpbnQpY29sb3JzLT5nKSA8PCAxNikKLSAgICAgICAgICAgICArICgoKHVuc2lnbmVkIGludCljb2xvcnMtPmIpIDw8IDI0KTsKLSAgICAgIHBhbFsxXSA9ICpwYWw7Ci0gICAgICBwYWwgKz0gMjsKLSAgICAgIGNvbG9ycysrOwotICAgfQotCi0gICBXSU1QX1NldHVwUGxvdEluZm8odGhpcyk7Ci0KLSAgIC8qIE5lZWQgdG8gcmVmcmVzaCB0aGUgd2luZG93ICovCi0gICB1cGRhdGUueCA9IDA7Ci0gICB1cGRhdGUueSA9IDA7Ci0gICB1cGRhdGUudyA9IFNETF9WaWRlb1N1cmZhY2UtPnc7Ci0gICB1cGRhdGUuaCA9IFNETF9WaWRlb1N1cmZhY2UtPmg7Ci0gICBXSU1QX1VwZGF0ZVJlY3RzKHRoaXMsIDEsICZ1cGRhdGUpOwotICAgICAgCi0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgV0lNUF9TZXRXTUNhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKQotewotCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLQotCVNETF9zdHJsY3B5KHRoaXMtPmhpZGRlbi0+dGl0bGUsIHRpdGxlLCBTRExfYXJyYXlzaXplKHRoaXMtPmhpZGRlbi0+dGl0bGUpKTsKLQotCWlmIChSSVNDT1NfR2V0V2ltcFZlcnNpb24oKSA8IDM4MCkKLQl7Ci0JCWludCBibG9ja1s2XTsKLQotCQlyZWdzLnJbMV0gPSAoaW50KWJsb2NrOwotCQlfa2VybmVsX3N3aShXaW1wX0dldENhcmV0UG9zaXRpb24sICZyZWdzLCAmcmVncyk7Ci0JCWlmIChibG9ja1swXSA9PSAoaW50KXRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZSkKLQkJewotCQkJcmVncy5yWzBdID0gLTE7Ci0JCQlfa2VybmVsX3N3aShXaW1wX1NldENhcmV0UG9zaXRpb24sICZyZWdzLCZyZWdzKTsKLQkJfSBlbHNlCi0JCXsKLQkJCXJlZ3MuclswXSA9IHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZTsKLQkJCXJlZ3MuclsxXSA9IC0xOwotCQkJcmVncy5yWzJdID0gLTE7Ci0JCQlyZWdzLnJbM10gPSAtMTsKLQkJCV9rZXJuZWxfc3dpKFdpbXBfU2V0Q2FyZXRQb3NpdGlvbiwgJnJlZ3MsJnJlZ3MpOwotCQl9Ci0JCXJlZ3MuclswXSA9IGJsb2NrWzBdOwotCQlyZWdzLnJbMV0gPSBibG9ja1sxXTsKLQkJcmVncy5yWzJdID0gYmxvY2tbMl07Ci0JCXJlZ3MuclszXSA9IGJsb2NrWzNdOwotCQlyZWdzLnJbNF0gPSBibG9ja1s0XTsKLQkJcmVncy5yWzVdID0gYmxvY2tbNV07Ci0JCV9rZXJuZWxfc3dpKFdpbXBfU2V0Q2FyZXRQb3NpdGlvbiwgJnJlZ3MsJnJlZ3MpOwotCX0gZWxzZQotCXsKLQkJcmVncy5yWzBdID0gdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlOwotCQlyZWdzLnJbMV0gPSAweDRiNTM0MTU0OyAvKiAiVEFTSyIgKi8KLQkJcmVncy5yWzJdID0gMzsgLyogUmVkcmF3IHRpdGxlICovCi0JCV9rZXJuZWxfc3dpKFdpbXBfRm9yY2VSZWRyYXcsICZyZWdzLCAmcmVncyk7Ci0JfQotfQotCi12b2lkIFdJTVBfUmVmcmVzaERlc2t0b3AoX1RISVMpCi17Ci0gICBpbnQgd2lkdGggPSB0aGlzLT5oaWRkZW4tPnNjcmVlbl93aWR0aCA8PCB0aGlzLT5oaWRkZW4tPnhlaWc7Ci0gICBpbnQgaGVpZ2h0ID0gdGhpcy0+aGlkZGVuLT5zY3JlZW5faGVpZ2h0IDw8IHRoaXMtPmhpZGRlbi0+eWVpZzsKLSAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKLSAgIHJlZ3MuclswXSA9IC0xOyAvKiBXaG9sZSBzY3JlZW4gKi8KLSAgIHJlZ3MuclsxXSA9IDA7Ci0gICByZWdzLnJbMl0gPSAwOwotICAgcmVncy5yWzNdID0gd2lkdGg7Ci0gICByZWdzLnJbNF0gPSBoZWlnaHQ7Ci0gICBfa2VybmVsX3N3aShXaW1wX0ZvcmNlUmVkcmF3LCAmcmVncywgJnJlZ3MpOwotfQotCi0vKiBUb2dnbGUgdG8gd2luZG93IGZyb20gZnVsbCBzY3JlZW4gKi8KLWludCBXSU1QX1RvZ2dsZUZyb21GdWxsU2NyZWVuKF9USElTKQoteyAgICAgCi0gICBpbnQgd2lkdGggPSB0aGlzLT5zY3JlZW4tPnc7Ci0gICBpbnQgaGVpZ2h0ID0gdGhpcy0+c2NyZWVuLT5oOwotICAgaW50IGJwcCA9IHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7Ci0gICBjaGFyICpidWZmZXIgPSBOVUxMOwotICAgY2hhciAqb2xkX2JhbmtbMl07Ci0gICBjaGFyICpvbGRfYWxsb2NfYmFuazsKLQotICAgLyogRW5zdXJlIGZsYWdzIGFyZSBPSyAqLwotICAgdGhpcy0+c2NyZWVuLT5mbGFncyAmPSB+KFNETF9ET1VCTEVCVUZ8U0RMX0hXU1VSRkFDRSk7Ci0KLSAgIGlmICh0aGlzLT5oaWRkZW4tPmJhbmtbMF0gPT0gdGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rIHx8IHJpc2Nvc19iYWNrYnVmZmVyID09IDApCi0gICB7Ci0gICAgICAvKiBOZWVkIHRvIGNyZWF0ZSBhIHNwcml0ZSBmb3IgdGhlIHNjcmVlbiBhbmQgY29weSB0aGUgZGF0YSB0byBpdCAqLwotICAgICAgY2hhciAqZGF0YTsKLSAgICAgIGJ1ZmZlciA9IFdJTVBfQ3JlYXRlQnVmZmVyKHdpZHRoLCBoZWlnaHQsIGJwcCk7Ci0gICAgICBkYXRhID0gYnVmZmVyICsgNjA7ICAgICAgICAgLyogU3RhcnQgb2Ygc3ByaXRlIGRhdGEgKi8KLSAgICAgIGlmIChicHAgPT0gOCkgZGF0YSArPSAyMDQ4OyAgLyogOGJwcCBzcHJpdGUgaGF2ZSBwYWxldHRlIGZpcnN0ICovCi0KLSAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gICAgICBTRExfbWVtY3B5KGRhdGEsIHRoaXMtPmhpZGRlbi0+YmFua1swXSwgd2lkdGggKiBoZWlnaHQgKiB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCk7Ci0gICB9Ci0gICAvKiBlbHNlIFdlJ3ZlIHN3aXRjaCB0byBmdWxsIHNjcmVlbiBiZWZvcmUgc28gd2UgYWxyZWFkeSBoYXZlIGEgc3ByaXRlICovCi0KLSAgIG9sZF9iYW5rWzBdID0gdGhpcy0+aGlkZGVuLT5iYW5rWzBdOwotICAgb2xkX2JhbmtbMV0gPSB0aGlzLT5oaWRkZW4tPmJhbmtbMV07Ci0gICBvbGRfYWxsb2NfYmFuayA9IHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuazsKLQotICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmsgPSBidWZmZXI7Ci0KLSAgIHRoaXMtPmhpZGRlbi0+YmFua1sxXSA9IHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuazsKLSAgIHRoaXMtPmhpZGRlbi0+YmFua1swXSA9IHRoaXMtPmhpZGRlbi0+YmFua1sxXSArIDYwOyAvKiBTdGFydCBvZiBzcHJpdGUgZGF0YSAqLwotICAgaWYgKGJwcCA9PSA4KSB0aGlzLT5oaWRkZW4tPmJhbmtbMF0gKz0gMjA0ODsgLyogOGJwcCBzcHJpdGUgaGF2ZSBwYWxldHRlIGZpcnN0ICovCi0KLSAgIHRoaXMtPmhpZGRlbi0+Y3VycmVudF9iYW5rID0gMDsKLSAgIHRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gdGhpcy0+aGlkZGVuLT5iYW5rWzBdOwotCi0gICBSSVNDT1NfUmVzdG9yZVdpbXBNb2RlKCk7Ci0gICBXSU1QX1JlYWRNb2RlSW5mbyh0aGlzKTsKLSAgIGlmIChXSU1QX1NldHVwV2luZG93KHRoaXMsIHRoaXMtPnNjcmVlbikpCi0gICB7Ci0gICAgICBXSU1QX1NldERldmljZU1vZGUodGhpcyk7Ci0gICAgICBXSU1QX1NldHVwUGxvdEluZm8odGhpcyk7Ci0KLSAgICAgIGlmIChyaXNjb3NfYmFja2J1ZmZlciA9PSAwKSByaXNjb3NfYmFja2J1ZmZlciA9IDE7Ci0KLSAgICAgIGlmIChidWZmZXIgJiYgb2xkX2FsbG9jX2JhbmspIFNETF9mcmVlKG9sZF9hbGxvY19iYW5rKTsKLQotICAgICAgcmV0dXJuIDE7Ci0gICB9IGVsc2UKLSAgIHsKLSAgICAgIC8qIERyb3AgYmFjayB0byBmdWxsIHNjcmVlbiBtb2RlIG9uIGZhaWx1cmUgKi8KLSAgICAgIHRoaXMtPmhpZGRlbi0+YmFua1swXSA9IG9sZF9iYW5rWzBdOwotICAgICAgdGhpcy0+aGlkZGVuLT5iYW5rWzFdID0gb2xkX2JhbmtbMV07Ci0gICAgICB0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmsgPSBvbGRfYWxsb2NfYmFuazsKLSAgICAgIGlmIChidWZmZXIpIFNETF9mcmVlKGJ1ZmZlcik7Ci0gICAgICAKLSAgICAgIFJJU0NPU19TdG9yZVdpbXBNb2RlKCk7Ci0gICAgICBGVUxMU0NSRUVOX1NldE1vZGUod2lkdGgsIGhlaWdodCwgYnBwKTsKLSAgIH0KLQotICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2FldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYWV2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzQ0ODU2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYWV2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBIYW5kbGUgdGhlIGV2ZW50IHN0cmVhbSwgY29udmVydGluZyBYMTEgZXZlbnRzIGludG8gU0RMIGV2ZW50cyAqLwotCi0jaW5jbHVkZSA8dmdhLmg+Ci0jaW5jbHVkZSA8dmdhbW91c2UuaD4KLSNpbmNsdWRlIDx2Z2FrZXlib2FyZC5oPgotI2lmIGRlZmluZWQoX19MSU5VWF9fKQotI2luY2x1ZGUgPGxpbnV4L2tkLmg+Ci0jaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KLSNlbGlmIGRlZmluZWQoX19GUkVFQlNEX18pCi0jaW5jbHVkZSA8c3lzL2tiaW8uaD4KLSNlbHNlCi0jZXJyb3IgWW91IG11c3QgY2hvb3NlIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBoZXJlCi0jZW5kaWYKLQotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9zdmdhdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfc3ZnYWV2ZW50c19jLmgiCi0KLS8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZXMgZnJvbSBhIGNvbnNvbGUgc2NhbmNvZGUgdG8gYSBTREwga2V5c3ltICovCi0jaWYgZGVmaW5lZChsaW51eCkKLSNkZWZpbmUgTlVNX1ZHQUtFWU1BUFMJKDE8PEtHX0NBUFNTSElGVCkKLXN0YXRpYyBVaW50MTYgdmdhX2tleW1hcFtOVU1fVkdBS0VZTUFQU11bTlJfS0VZU107Ci0jZWxpZiBkZWZpbmVkKF9fRlJFRUJTRF9fKQotLyogRklYTUU6IEZyZWUgdGhlIGtleW1hcCB3aGVuIHdlIHNodXQgZG93biB0aGUgdmlkZW8gbW9kZSAqLwotc3RhdGljIGtleW1hcF90ICp2Z2Ffa2V5bWFwID0gTlVMTDsKLSNlbHNlCi0jZXJyb3IgWW91IG11c3QgY2hvb3NlIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBoZXJlCi0jZW5kaWYKLXN0YXRpYyBTRExLZXkga2V5bWFwWzEyOF07Ci1zdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKTsKLQotLyogVWdoLCB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUga2VybmVsJ3Mga2V5c3ltIG1hcHBpbmcgY29kZS4uLgotICAgT2gsIGl0J3Mgbm90IHNvIGJhZC4gOi0pCi0KLSAgIEZJWE1FOiBBZGQga2V5Ym9hcmQgTEVEIGhhbmRsaW5nIGNvZGUKLSAqLwotI2lmIGRlZmluZWQobGludXgpCi1pbnQgU1ZHQV9pbml0a2V5bWFwcyhpbnQgZmQpCi17Ci0Jc3RydWN0IGtiZW50cnkgZW50cnk7Ci0JaW50IG1hcCwgaTsKLQotCS8qIExvYWQgYWxsIHRoZSBrZXlzeW0gbWFwcGluZ3MgKi8KLQlmb3IgKCBtYXA9MDsgbWFwPE5VTV9WR0FLRVlNQVBTOyArK21hcCApIHsKLQkJU0RMX21lbXNldCh2Z2Ffa2V5bWFwW21hcF0sIDAsIE5SX0tFWVMqc2l6ZW9mKFVpbnQxNikpOwotCQlmb3IgKCBpPTA7IGk8TlJfS0VZUzsgKytpICkgewotCQkJZW50cnkua2JfdGFibGUgPSBtYXA7Ci0JCQllbnRyeS5rYl9pbmRleCA9IGk7Ci0JCQlpZiAoIGlvY3RsKGZkLCBLREdLQkVOVCwgJmVudHJ5KSA9PSAwICkgewotCQkJCS8qIFRoZSAiRW50ZXIiIGtleSBpcyBhIHNwZWNpYWwgY2FzZSAqLwotCQkJCWlmICggZW50cnkua2JfdmFsdWUgPT0gS19FTlRFUiApIHsKLQkJCQkJZW50cnkua2JfdmFsdWUgPSBLKEtUX0FTQ0lJLDEzKTsKLQkJCQl9Ci0JCQkJLyogSGFuZGxlIG51bXBhZCBzcGVjaWFsbHkgYXMgd2VsbCAqLwotCQkJCWlmICggS1RZUChlbnRyeS5rYl92YWx1ZSkgPT0gS1RfUEFEICkgewotCQkJCSAgICBzd2l0Y2ggKCBlbnRyeS5rYl92YWx1ZSApIHsKLQkJCQkJY2FzZSBLX1AwOgotCQkJCQljYXNlIEtfUDE6Ci0JCQkJCWNhc2UgS19QMjoKLQkJCQkJY2FzZSBLX1AzOgotCQkJCQljYXNlIEtfUDQ6Ci0JCQkJCWNhc2UgS19QNToKLQkJCQkJY2FzZSBLX1A2OgotCQkJCQljYXNlIEtfUDc6Ci0JCQkJCWNhc2UgS19QODoKLQkJCQkJY2FzZSBLX1A5OgotCQkJCQkgICAgdmdhX2tleW1hcFttYXBdW2ldPWVudHJ5LmtiX3ZhbHVlOwotCQkJCQkgICAgdmdhX2tleW1hcFttYXBdW2ldKz0gJzAnOwotCQkJCQkgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLX1BQTFVTOgotCQkJCQkgICAgdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJysnKTsKLQkJCQkJICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS19QTUlOVVM6Ci0JCQkJCSAgICB2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLScpOwotCQkJCQkgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLX1BTVEFSOgotCQkJCQkgICAgdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJyonKTsKLQkJCQkJICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS19QU0xBU0g6Ci0JCQkJCSAgICB2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLycpOwotCQkJCQkgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLX1BFTlRFUjoKLQkJCQkJICAgIHZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCdccicpOwotCQkJCQkgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLX1BDT01NQToKLQkJCQkJICAgIHZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcsJyk7Ci0JCQkJCSAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtfUERPVDoKLQkJCQkJICAgIHZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcuJyk7Ci0JCQkJCSAgICBicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJICAgIGJyZWFrOwotCQkJCSAgICB9Ci0JCQkJfQotCQkJCS8qIERvIHRoZSBub3JtYWwga2V5IHRyYW5zbGF0aW9uICovCi0JCQkJaWYgKCAoS1RZUChlbnRyeS5rYl92YWx1ZSkgPT0gS1RfTEFUSU4pIHx8Ci0JCQkJICAgICAoS1RZUChlbnRyeS5rYl92YWx1ZSkgPT0gS1RfQVNDSUkpIHx8Ci0JCQkJICAgICAoS1RZUChlbnRyeS5rYl92YWx1ZSkgPT0gS1RfTEVUVEVSKSApIHsKLQkJCQkJdmdhX2tleW1hcFttYXBdW2ldID0gZW50cnkua2JfdmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybigwKTsKLX0KLSNlbGlmIGRlZmluZWQoX19GUkVFQlNEX18pCi1pbnQgU1ZHQV9pbml0a2V5bWFwcyhpbnQgZmQpCi17Ci0JdmdhX2tleW1hcCA9IFNETF9tYWxsb2Moc2l6ZW9mKGtleW1hcF90KSk7Ci0JaWYgKCAhIHZnYV9rZXltYXAgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlpZiAoaW9jdGwoZmQsIEdJT19LRVlNQVAsIHZnYV9rZXltYXApID09IC0xKSB7Ci0JCVNETF9mcmVlKHZnYV9rZXltYXApOwotCQl2Z2Ffa2V5bWFwID0gTlVMTDsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gZ2V0IGtleWJvYXJkIG1hcCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0jZWxzZQotI2Vycm9yIFlvdSBtdXN0IGNob29zZSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gaGVyZQotI2VuZGlmCi0KLWludCBwb3N0ZWQgPSAwOwotCi12b2lkIFNWR0FfbW91c2VjYWxsYmFjayhpbnQgYnV0dG9uLCBpbnQgZHgsIGludCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHUxLGludCB1MixpbnQgdTMsIGludCB1NCkKLXsKLQlpZiAoIGR4IHx8IGR5ICkgewotCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLCBkeCwgZHkpOwotCX0KLQlpZiAoIGJ1dHRvbiAmIE1PVVNFX0xFRlRCVVRUT04gKSB7Ci0JCWlmICggIShTRExfR2V0TW91c2VTdGF0ZShOVUxMLCBOVUxMKSAmIFNETF9CVVRUT04oMSkpICkgewotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIDEsIDAsIDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCAoU0RMX0dldE1vdXNlU3RhdGUoTlVMTCwgTlVMTCkgJiBTRExfQlVUVE9OKDEpKSApIHsKLQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgMSwgMCwgMCk7Ci0JCX0KLQl9Ci0JaWYgKCBidXR0b24gJiBNT1VTRV9NSURETEVCVVRUT04gKSB7Ci0JCWlmICggIShTRExfR2V0TW91c2VTdGF0ZShOVUxMLCBOVUxMKSAmIFNETF9CVVRUT04oMikpICkgewotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIDIsIDAsIDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCAoU0RMX0dldE1vdXNlU3RhdGUoTlVMTCwgTlVMTCkgJiBTRExfQlVUVE9OKDIpKSApIHsKLQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgMiwgMCwgMCk7Ci0JCX0KLQl9Ci0JaWYgKCBidXR0b24gJiBNT1VTRV9SSUdIVEJVVFRPTiApIHsKLQkJaWYgKCAhKFNETF9HZXRNb3VzZVN0YXRlKE5VTEwsIE5VTEwpICYgU0RMX0JVVFRPTigzKSkgKSB7Ci0JCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgMywgMCwgMCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIChTRExfR2V0TW91c2VTdGF0ZShOVUxMLCBOVUxMKSAmIFNETF9CVVRUT04oMykpICkgewotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCAzLCAwLCAwKTsKLQkJfQotCX0KLX0KLQotdm9pZCBTVkdBX2tleWJvYXJkY2FsbGJhY2soaW50IHNjYW5jb2RlLCBpbnQgcHJlc3NlZCkKLXsKLQlTRExfa2V5c3ltIGtleXN5bTsKLQotCWlmICggcHJlc3NlZCApIHsKLQkJcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsCi0JCQkgICAgVHJhbnNsYXRlS2V5KHNjYW5jb2RlLCAma2V5c3ltKSk7Ci0JfSBlbHNlIHsKLQkJcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELAotCQkJICAgIFRyYW5zbGF0ZUtleShzY2FuY29kZSwgJmtleXN5bSkpOwotCX0KLX0KLQotdm9pZCBTVkdBX1B1bXBFdmVudHMoX1RISVMpCi17Ci0JZG8gewotCQlwb3N0ZWQgPSAwOwotCQltb3VzZV91cGRhdGUoKTsKLQkJa2V5Ym9hcmRfdXBkYXRlKCk7Ci0JfSB3aGlsZSAoIHBvc3RlZCApOwotfQotCi12b2lkIFNWR0FfSW5pdE9TS2V5bWFwKF9USElTKQotewotCWludCBpOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgQmVPUyBrZXkgdHJhbnNsYXRpb24gdGFibGUgKi8KLQlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShrZXltYXApOyArK2kgKQotCQlrZXltYXBbaV0gPSBTRExLX1VOS05PV047Ci0KLQlrZXltYXBbU0NBTkNPREVfRVNDQVBFXSA9IFNETEtfRVNDQVBFOwotCWtleW1hcFtTQ0FOQ09ERV8xXSA9IFNETEtfMTsKLQlrZXltYXBbU0NBTkNPREVfMl0gPSBTRExLXzI7Ci0Ja2V5bWFwW1NDQU5DT0RFXzNdID0gU0RMS18zOwotCWtleW1hcFtTQ0FOQ09ERV80XSA9IFNETEtfNDsKLQlrZXltYXBbU0NBTkNPREVfNV0gPSBTRExLXzU7Ci0Ja2V5bWFwW1NDQU5DT0RFXzZdID0gU0RMS182OwotCWtleW1hcFtTQ0FOQ09ERV83XSA9IFNETEtfNzsKLQlrZXltYXBbU0NBTkNPREVfOF0gPSBTRExLXzg7Ci0Ja2V5bWFwW1NDQU5DT0RFXzldID0gU0RMS185OwotCWtleW1hcFtTQ0FOQ09ERV8wXSA9IFNETEtfMDsKLQlrZXltYXBbU0NBTkNPREVfTUlOVVNdID0gU0RMS19NSU5VUzsKLQlrZXltYXBbU0NBTkNPREVfRVFVQUxdID0gU0RMS19FUVVBTFM7Ci0Ja2V5bWFwW1NDQU5DT0RFX0JBQ0tTUEFDRV0gPSBTRExLX0JBQ0tTUEFDRTsKLQlrZXltYXBbU0NBTkNPREVfVEFCXSA9IFNETEtfVEFCOwotCWtleW1hcFtTQ0FOQ09ERV9RXSA9IFNETEtfcTsKLQlrZXltYXBbU0NBTkNPREVfV10gPSBTRExLX3c7Ci0Ja2V5bWFwW1NDQU5DT0RFX0VdID0gU0RMS19lOwotCWtleW1hcFtTQ0FOQ09ERV9SXSA9IFNETEtfcjsKLQlrZXltYXBbU0NBTkNPREVfVF0gPSBTRExLX3Q7Ci0Ja2V5bWFwW1NDQU5DT0RFX1ldID0gU0RMS195OwotCWtleW1hcFtTQ0FOQ09ERV9VXSA9IFNETEtfdTsKLQlrZXltYXBbU0NBTkNPREVfSV0gPSBTRExLX2k7Ci0Ja2V5bWFwW1NDQU5DT0RFX09dID0gU0RMS19vOwotCWtleW1hcFtTQ0FOQ09ERV9QXSA9IFNETEtfcDsKLQlrZXltYXBbU0NBTkNPREVfQlJBQ0tFVF9MRUZUXSA9IFNETEtfTEVGVEJSQUNLRVQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0JSQUNLRVRfUklHSFRdID0gU0RMS19SSUdIVEJSQUNLRVQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0VOVEVSXSA9IFNETEtfUkVUVVJOOwotCWtleW1hcFtTQ0FOQ09ERV9MRUZUQ09OVFJPTF0gPSBTRExLX0xDVFJMOwotCWtleW1hcFtTQ0FOQ09ERV9BXSA9IFNETEtfYTsKLQlrZXltYXBbU0NBTkNPREVfU10gPSBTRExLX3M7Ci0Ja2V5bWFwW1NDQU5DT0RFX0RdID0gU0RMS19kOwotCWtleW1hcFtTQ0FOQ09ERV9GXSA9IFNETEtfZjsKLQlrZXltYXBbU0NBTkNPREVfR10gPSBTRExLX2c7Ci0Ja2V5bWFwW1NDQU5DT0RFX0hdID0gU0RMS19oOwotCWtleW1hcFtTQ0FOQ09ERV9KXSA9IFNETEtfajsKLQlrZXltYXBbU0NBTkNPREVfS10gPSBTRExLX2s7Ci0Ja2V5bWFwW1NDQU5DT0RFX0xdID0gU0RMS19sOwotCWtleW1hcFtTQ0FOQ09ERV9TRU1JQ09MT05dID0gU0RMS19TRU1JQ09MT047Ci0Ja2V5bWFwW1NDQU5DT0RFX0FQT1NUUk9QSEVdID0gU0RMS19RVU9URTsKLQlrZXltYXBbU0NBTkNPREVfR1JBVkVdID0gU0RMS19CQUNLUVVPVEU7Ci0Ja2V5bWFwW1NDQU5DT0RFX0xFRlRTSElGVF0gPSBTRExLX0xTSElGVDsKLQlrZXltYXBbU0NBTkNPREVfQkFDS1NMQVNIXSA9IFNETEtfQkFDS1NMQVNIOwotCWtleW1hcFtTQ0FOQ09ERV9aXSA9IFNETEtfejsKLQlrZXltYXBbU0NBTkNPREVfWF0gPSBTRExLX3g7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NdID0gU0RMS19jOwotCWtleW1hcFtTQ0FOQ09ERV9WXSA9IFNETEtfdjsKLQlrZXltYXBbU0NBTkNPREVfQl0gPSBTRExLX2I7Ci0Ja2V5bWFwW1NDQU5DT0RFX05dID0gU0RMS19uOwotCWtleW1hcFtTQ0FOQ09ERV9NXSA9IFNETEtfbTsKLQlrZXltYXBbU0NBTkNPREVfQ09NTUFdID0gU0RMS19DT01NQTsKLQlrZXltYXBbU0NBTkNPREVfUEVSSU9EXSA9IFNETEtfUEVSSU9EOwotCWtleW1hcFtTQ0FOQ09ERV9TTEFTSF0gPSBTRExLX1NMQVNIOwotCWtleW1hcFtTQ0FOQ09ERV9SSUdIVFNISUZUXSA9IFNETEtfUlNISUZUOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURNVUxUSVBMWV0gPSBTRExLX0tQX01VTFRJUExZOwotCWtleW1hcFtTQ0FOQ09ERV9MRUZUQUxUXSA9IFNETEtfTEFMVDsKLQlrZXltYXBbU0NBTkNPREVfU1BBQ0VdID0gU0RMS19TUEFDRTsKLQlrZXltYXBbU0NBTkNPREVfQ0FQU0xPQ0tdID0gU0RMS19DQVBTTE9DSzsKLQlrZXltYXBbU0NBTkNPREVfRjFdID0gU0RMS19GMTsKLQlrZXltYXBbU0NBTkNPREVfRjJdID0gU0RMS19GMjsKLQlrZXltYXBbU0NBTkNPREVfRjNdID0gU0RMS19GMzsKLQlrZXltYXBbU0NBTkNPREVfRjRdID0gU0RMS19GNDsKLQlrZXltYXBbU0NBTkNPREVfRjVdID0gU0RMS19GNTsKLQlrZXltYXBbU0NBTkNPREVfRjZdID0gU0RMS19GNjsKLQlrZXltYXBbU0NBTkNPREVfRjddID0gU0RMS19GNzsKLQlrZXltYXBbU0NBTkNPREVfRjhdID0gU0RMS19GODsKLQlrZXltYXBbU0NBTkNPREVfRjldID0gU0RMS19GOTsKLQlrZXltYXBbU0NBTkNPREVfRjEwXSA9IFNETEtfRjEwOwotCWtleW1hcFtTQ0FOQ09ERV9OVU1MT0NLXSA9IFNETEtfTlVNTE9DSzsKLQlrZXltYXBbU0NBTkNPREVfU0NST0xMTE9DS10gPSBTRExLX1NDUk9MTE9DSzsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFEN10gPSBTRExLX0tQNzsKLQlrZXltYXBbU0NBTkNPREVfQ1VSU09SVVBMRUZUXSA9IFNETEtfS1A3OwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ4XSA9IFNETEtfS1A4OwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JVUF0gPSBTRExLX0tQODsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFEOV0gPSBTRExLX0tQOTsKLQlrZXltYXBbU0NBTkNPREVfQ1VSU09SVVBSSUdIVF0gPSBTRExLX0tQOTsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFETUlOVVNdID0gU0RMS19LUF9NSU5VUzsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFENF0gPSBTRExLX0tQNDsKLQlrZXltYXBbU0NBTkNPREVfQ1VSU09STEVGVF0gPSBTRExLX0tQNDsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFENV0gPSBTRExLX0tQNTsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFENl0gPSBTRExLX0tQNjsKLQlrZXltYXBbU0NBTkNPREVfQ1VSU09SUklHSFRdID0gU0RMS19LUDY7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRFBMVVNdID0gU0RMS19LUF9QTFVTOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQxXSA9IFNETEtfS1AxOwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JET1dOTEVGVF0gPSBTRExLX0tQMTsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFEMl0gPSBTRExLX0tQMjsKLQlrZXltYXBbU0NBTkNPREVfQ1VSU09SRE9XTl0gPSBTRExLX0tQMjsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFEM10gPSBTRExLX0tQMzsKLQlrZXltYXBbU0NBTkNPREVfQ1VSU09SRE9XTlJJR0hUXSA9IFNETEtfS1AzOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQwXSA9IFNETEtfS1AwOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURQRVJJT0RdID0gU0RMS19LUF9QRVJJT0Q7Ci0Ja2V5bWFwW1NDQU5DT0RFX0xFU1NdID0gU0RMS19MRVNTOwotCWtleW1hcFtTQ0FOQ09ERV9GMTFdID0gU0RMS19GMTE7Ci0Ja2V5bWFwW1NDQU5DT0RFX0YxMl0gPSBTRExLX0YxMjsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFERU5URVJdID0gU0RMS19LUF9FTlRFUjsKLQlrZXltYXBbU0NBTkNPREVfUklHSFRDT05UUk9MXSA9IFNETEtfUkNUUkw7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NPTlRST0xdID0gU0RMS19SQ1RSTDsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFERElWSURFXSA9IFNETEtfS1BfRElWSURFOwotCWtleW1hcFtTQ0FOQ09ERV9QUklOVFNDUkVFTl0gPSBTRExLX1BSSU5UOwotCWtleW1hcFtTQ0FOQ09ERV9SSUdIVEFMVF0gPSBTRExLX1JBTFQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0JSRUFLXSA9IFNETEtfQlJFQUs7Ci0Ja2V5bWFwW1NDQU5DT0RFX0JSRUFLX0FMVEVSTkFUSVZFXSA9IFNETEtfVU5LTk9XTjsKLQlrZXltYXBbU0NBTkNPREVfSE9NRV0gPSBTRExLX0hPTUU7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NVUlNPUkJMT0NLVVBdID0gU0RMS19VUDsKLQlrZXltYXBbU0NBTkNPREVfUEFHRVVQXSA9IFNETEtfUEFHRVVQOwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JCTE9DS0xFRlRdID0gU0RMS19MRUZUOwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JCTE9DS1JJR0hUXSA9IFNETEtfUklHSFQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0VORF0gPSBTRExLX0VORDsKLQlrZXltYXBbU0NBTkNPREVfQ1VSU09SQkxPQ0tET1dOXSA9IFNETEtfRE9XTjsKLQlrZXltYXBbU0NBTkNPREVfUEFHRURPV05dID0gU0RMS19QQUdFRE9XTjsKLQlrZXltYXBbU0NBTkNPREVfSU5TRVJUXSA9IFNETEtfSU5TRVJUOwotCWtleW1hcFtTQ0FOQ09ERV9SRU1PVkVdID0gU0RMS19ERUxFVEU7Ci0Ja2V5bWFwWzExOV0gPSBTRExLX1BBVVNFOwotCWtleW1hcFtTQ0FOQ09ERV9SSUdIVFdJTl0gPSBTRExLX1JTVVBFUjsKLQlrZXltYXBbU0NBTkNPREVfTEVGVFdJTl0gPSBTRExLX0xTVVBFUjsKLQlrZXltYXBbMTI3XSA9IFNETEtfTUVOVTsKLX0KLQotI2lmIGRlZmluZWQobGludXgpCi1zdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQotewotCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCi0Ja2V5c3ltLT5zY2FuY29kZSA9IHNjYW5jb2RlOwotCWtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKLQlrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKLQotCS8qIElmIFVOSUNPREUgaXMgb24sIGdldCB0aGUgVU5JQ09ERSB2YWx1ZSBmb3IgdGhlIGtleSAqLwotCWtleXN5bS0+dW5pY29kZSA9IDA7Ci0JaWYgKCBTRExfVHJhbnNsYXRlVU5JQ09ERSApIHsKLQkJaW50IG1hcDsKLQkJU0RMTW9kIG1vZHN0YXRlOwotCi0JCW1vZHN0YXRlID0gU0RMX0dldE1vZFN0YXRlKCk7Ci0JCW1hcCA9IDA7Ci0JCWlmICggbW9kc3RhdGUgJiBLTU9EX1NISUZUICkgewotCQkJbWFwIHw9ICgxPDxLR19TSElGVCk7Ci0JCX0KLQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQ1RSTCApIHsKLQkJCW1hcCB8PSAoMTw8S0dfQ1RSTCk7Ci0JCX0KLQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQUxUICkgewotCQkJbWFwIHw9ICgxPDxLR19BTFQpOwotCQl9Ci0JCWlmICggbW9kc3RhdGUgJiBLTU9EX01PREUgKSB7Ci0JCQltYXAgfD0gKDE8PEtHX0FMVEdSKTsKLQkJfQotCQlpZiAoIEtUWVAodmdhX2tleW1hcFttYXBdW3NjYW5jb2RlXSkgPT0gS1RfTEVUVEVSICkgewotCQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQ0FQUyApIHsKLQkJCQltYXAgXj0gKDE8PEtHX1NISUZUKTsKLQkJCX0KLQkJfQotCQlpZiAoIEtUWVAodmdhX2tleW1hcFttYXBdW3NjYW5jb2RlXSkgPT0gS1RfUEFEICkgewotCQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfTlVNICkgewotCQkJCWtleXN5bS0+dW5pY29kZT1LVkFMKHZnYV9rZXltYXBbbWFwXVtzY2FuY29kZV0pOwotCQkJfQotCQl9IGVsc2UgewotCQkJa2V5c3ltLT51bmljb2RlID0gS1ZBTCh2Z2Ffa2V5bWFwW21hcF1bc2NhbmNvZGVdKTsKLQkJfQotCX0KLQlyZXR1cm4oa2V5c3ltKTsKLX0KLSNlbGlmIGRlZmluZWQoX19GUkVFQlNEX18pCi1zdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQotewotCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCi0Ja2V5c3ltLT5zY2FuY29kZSA9IHNjYW5jb2RlOwotCWtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKLQlrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKLQotCS8qIElmIFVOSUNPREUgaXMgb24sIGdldCB0aGUgVU5JQ09ERSB2YWx1ZSBmb3IgdGhlIGtleSAqLwotCWtleXN5bS0+dW5pY29kZSA9IDA7Ci0JaWYgKCBTRExfVHJhbnNsYXRlVU5JQ09ERSAmJiB2Z2Ffa2V5bWFwICkgewotCQlpbnQgbWFwOwotCQlTRExNb2QgbW9kc3RhdGU7Ci0KLQkJbW9kc3RhdGUgPSBTRExfR2V0TW9kU3RhdGUoKTsKLQkJbWFwID0gMDsKLQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfU0hJRlQgKSB7Ci0JCQltYXAgKz0gMTsKLQkJfQotCQlpZiAoIG1vZHN0YXRlICYgS01PRF9DVFJMICkgewotCQkJbWFwICs9IDI7Ci0JCX0KLQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQUxUICkgewotCQkJbWFwICs9IDQ7Ci0JCX0KLQkJaWYgKCAhKHZnYV9rZXltYXAtPmtleVtzY2FuY29kZV0uc3BjbCAmICgweDgwID4+IG1hcCkpICkgewotCQkJa2V5c3ltLT51bmljb2RlID0gdmdhX2tleW1hcC0+a2V5W3NjYW5jb2RlXS5tYXBbbWFwXTsKLQkJfQotCi0JfQotCXJldHVybihrZXlzeW0pOwotfQotI2Vsc2UKLSNlcnJvciBZb3UgbXVzdCBjaG9vc2UgeW91ciBvcGVyYXRpbmcgc3lzdGVtIGhlcmUKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9zdmdhL1NETF9zdmdhZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYWV2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOGQ5ZGUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9zdmdhL1NETF9zdmdhZXZlbnRzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3N2Z2F2aWRlby5oIgotCi0vKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfc3lzZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCi0gICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX3N5c3ZpZGVvLmMpCi0qLwotZXh0ZXJuIGludCBTVkdBX2luaXRrZXltYXBzKGludCBmZCk7Ci1leHRlcm4gdm9pZCBTVkdBX21vdXNlY2FsbGJhY2soaW50IGJ1dHRvbiwgaW50IGR4LCBpbnQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdTEsaW50IHUyLGludCB1MywgaW50IHU0KTsKLWV4dGVybiB2b2lkIFNWR0Ffa2V5Ym9hcmRjYWxsYmFjayhpbnQgc2NhbmNvZGUsIGludCBwcmVzc2VkKTsKLQotZXh0ZXJuIHZvaWQgU1ZHQV9Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgU1ZHQV9QdW1wRXZlbnRzKF9USElTKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYW1vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2Ftb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDFjY2NjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYW1vdXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfc3ZnYXZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3N2Z2Ftb3VzZV9jLmgiCi0KLQotLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCi1zdHJ1Y3QgV01jdXJzb3IgewotCWludCB1bnVzZWQ7Ci19OwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9zdmdhL1NETF9zdmdhbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9zdmdhL1NETF9zdmdhbW91c2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjNkMTJjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYW1vdXNlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3N2Z2F2aWRlby5oIgotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYXZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2F2aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2JhZDk1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYXZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFNWR0FsaWIgYmFzZWQgU0RMIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpZiBkZWZpbmVkKF9fTElOVVhfXykKLSNpbmNsdWRlIDxsaW51eC92dC5oPgotI2VsaWYgZGVmaW5lZChfX0ZSRUVCU0RfXykKLSNpbmNsdWRlIDxzeXMvY29uc2lvLmg+Ci0jZWxzZQotI2Vycm9yIFlvdSBtdXN0IGNob29zZSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gaGVyZQotI2VuZGlmCi0jaW5jbHVkZSA8dmdhLmg+Ci0jaW5jbHVkZSA8dmdhbW91c2UuaD4KLSNpbmNsdWRlIDx2Z2FrZXlib2FyZC5oPgotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9zdmdhdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfc3ZnYWV2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3N2Z2Ftb3VzZV9jLmgiCi0KLS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBTVkdBX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKLXN0YXRpYyBTRExfUmVjdCAqKlNWR0FfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqU1ZHQV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Ci1zdGF0aWMgaW50IFNWR0FfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsCi0JCQkgIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyB2b2lkIFNWR0FfVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgU1ZHQV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBTVkdBX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgU1ZHQV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBTVkdBX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIHZvaWQgU1ZHQV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0KLS8qIFNWR0FsaWIgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBTVkdBX0F2YWlsYWJsZSh2b2lkKQotewotCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgcm9vdCBhbmQgc3RkaW4gaXMgYSB2aXJ0dWFsIGNvbnNvbGUgKi8KLQlpbnQgY29uc29sZTsKLQkKLQkvKiBTVkdBTGliIDEuOS54KyBkb2Vzbid0IHJlcXVpcmUgcm9vdCAodmlhIC9kZXYvc3ZnYSkgKi8KLQlpbnQgc3ZnYWxpYjIgPSAtMTsKLQotCS8qIFNlZSBpZiB3ZSBhcmUgY29ubmVjdGVkIHRvIGEgdmlydHVhbCB0ZXJtaW5hbCAqLwotCWNvbnNvbGUgPSBTVERJTl9GSUxFTk87Ci0jaWYgMCAvKiBUaGlzIGlzIG5vIGxvbmdlciBuZWVkZWQsIFNWR0FsaWIgY2FuIHN3aXRjaCBjb25zb2xlcyBmb3IgdXMgKi8KLQlpZiAoIGNvbnNvbGUgPj0gMCApIHsKLQkJc3RydWN0IHN0YXQgc2I7Ci0JCXN0cnVjdCB2dF9tb2RlIGR1bW15OwotCi0JCWlmICggKGZzdGF0KGNvbnNvbGUsICZzYikgPCAwKSB8fAotCQkgICAgIChpb2N0bChjb25zb2xlLCBWVF9HRVRNT0RFLCAmZHVtbXkpIDwgMCkgKSB7Ci0JCQljb25zb2xlID0gLTE7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogMCAqLwotCi0JLyogU2VlIGlmIFNWR0FsaWIgMi4wIGlzIGF2YWlsYWJsZSAqLwotCXN2Z2FsaWIyID0gb3BlbigiL2Rldi9zdmdhIiwgT19SRE9OTFkpOwotCWlmIChzdmdhbGliMiAhPSAtMSkgewotCQljbG9zZShzdmdhbGliMik7Ci0JfQotCi0JcmV0dXJuKCgoc3ZnYWxpYjIgIT0gLTEpIHx8IChnZXRldWlkKCkgPT0gMCkpICYmIChjb25zb2xlID49IDApKTsKLX0KLQotc3RhdGljIHZvaWQgU1ZHQV9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKlNWR0FfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotCWlmICggZGV2aWNlICkgewotCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7Ci0JCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQl9Ci0JaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWlmICggZGV2aWNlICkgewotCQkJU0RMX2ZyZWUoZGV2aWNlKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JZGV2aWNlLT5WaWRlb0luaXQgPSBTVkdBX1ZpZGVvSW5pdDsKLQlkZXZpY2UtPkxpc3RNb2RlcyA9IFNWR0FfTGlzdE1vZGVzOwotCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gU1ZHQV9TZXRWaWRlb01vZGU7Ci0JZGV2aWNlLT5TZXRDb2xvcnMgPSBTVkdBX1NldENvbG9yczsKLQlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKLQlkZXZpY2UtPlZpZGVvUXVpdCA9IFNWR0FfVmlkZW9RdWl0OwotCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBTVkdBX0FsbG9jSFdTdXJmYWNlOwotCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOwotCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOwotCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IFNWR0FfTG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IFNWR0FfVW5sb2NrSFdTdXJmYWNlOwotCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IFNWR0FfRmxpcEhXU3VyZmFjZTsKLQlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBTVkdBX0ZyZWVIV1N1cmZhY2U7Ci0JZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKLQlkZXZpY2UtPlNldEljb24gPSBOVUxMOwotCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7Ci0JZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOwotCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IFNWR0FfSW5pdE9TS2V5bWFwOwotCWRldmljZS0+UHVtcEV2ZW50cyA9IFNWR0FfUHVtcEV2ZW50czsKLQotCWRldmljZS0+ZnJlZSA9IFNWR0FfRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIGRldmljZTsKLX0KLQotVmlkZW9Cb290U3RyYXAgU1ZHQUxJQl9ib290c3RyYXAgPSB7Ci0JInN2Z2FsaWIiLCAiU1ZHQWxpYiIsCi0JU1ZHQV9BdmFpbGFibGUsIFNWR0FfQ3JlYXRlRGV2aWNlCi19OwotCi1zdGF0aWMgaW50IFNWR0FfQWRkTW9kZShfVEhJUywgaW50IG1vZGUsIGludCBhY3R1YWxseV9hZGQpCi17Ci0JaW50IGksIGo7Ci0JdmdhX21vZGVpbmZvICptb2RlaW5mbzsKLQotCW1vZGVpbmZvID0gdmdhX2dldG1vZGVpbmZvKG1vZGUpOwotCi0JaSA9IG1vZGVpbmZvLT5ieXRlc3BlcnBpeGVsLTE7Ci0JaWYgKCBpIDwgMCApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICggYWN0dWFsbHlfYWRkICkgewotCQlTRExfUmVjdCBzYXZlZF9yZWN0WzJdOwotCQlpbnQgICAgICBzYXZlZF9tb2RlWzJdOwotCQlpbnQgYjsKLQotCQkvKiBBZGQgdGhlIG1vZGUsIHNvcnRlZCBsYXJnZXN0IHRvIHNtYWxsZXN0ICovCi0JCWIgPSAwOwotCQlqID0gMDsKLQkJd2hpbGUgKCAoU0RMX21vZGVsaXN0W2ldW2pdLT53ID4gbW9kZWluZm8tPndpZHRoKSB8fAotCQkJKFNETF9tb2RlbGlzdFtpXVtqXS0+aCA+IG1vZGVpbmZvLT5oZWlnaHQpICkgewotCQkJKytqOwotCQl9Ci0JCS8qIFNraXAgbW9kZXMgdGhhdCBhcmUgYWxyZWFkeSBpbiBvdXIgbGlzdCAqLwotCQlpZiAoIChTRExfbW9kZWxpc3RbaV1bal0tPncgPT0gbW9kZWluZm8tPndpZHRoKSAmJgotCQkgICAgIChTRExfbW9kZWxpc3RbaV1bal0tPmggPT0gbW9kZWluZm8tPmhlaWdodCkgKSB7Ci0JCQlyZXR1cm4oMCk7Ci0JCX0KLQkJLyogSW5zZXJ0IHRoZSBuZXcgbW9kZSAqLwotCQlzYXZlZF9yZWN0W2JdID0gKlNETF9tb2RlbGlzdFtpXVtqXTsKLQkJc2F2ZWRfbW9kZVtiXSA9IFNETF92Z2Ftb2RlW2ldW2pdOwotCQlTRExfbW9kZWxpc3RbaV1bal0tPncgPSBtb2RlaW5mby0+d2lkdGg7Ci0JCVNETF9tb2RlbGlzdFtpXVtqXS0+aCA9IG1vZGVpbmZvLT5oZWlnaHQ7Ci0JCVNETF92Z2Ftb2RlW2ldW2pdID0gbW9kZTsKLQkJLyogRXZlcnlib2R5IHNjb290IGRvd24hICovCi0JCWlmICggc2F2ZWRfcmVjdFtiXS53ICYmIHNhdmVkX3JlY3RbYl0uaCApIHsKLQkJICAgIGZvciAoICsrajsgU0RMX21vZGVsaXN0W2ldW2pdLT53OyArK2ogKSB7Ci0JCQlzYXZlZF9yZWN0WyFiXSA9ICpTRExfbW9kZWxpc3RbaV1bal07Ci0JCQlzYXZlZF9tb2RlWyFiXSA9IFNETF92Z2Ftb2RlW2ldW2pdOwotCQkJKlNETF9tb2RlbGlzdFtpXVtqXSA9IHNhdmVkX3JlY3RbYl07Ci0JCQlTRExfdmdhbW9kZVtpXVtqXSA9IHNhdmVkX21vZGVbYl07Ci0JCQliID0gIWI7Ci0JCSAgICB9Ci0JCSAgICAqU0RMX21vZGVsaXN0W2ldW2pdID0gc2F2ZWRfcmVjdFtiXTsKLQkJICAgIFNETF92Z2Ftb2RlW2ldW2pdID0gc2F2ZWRfbW9kZVtiXTsKLQkJfQotCX0gZWxzZSB7Ci0JCSsrU0RMX251bW1vZGVzW2ldOwotCX0KLQlyZXR1cm4oMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNWR0FfVXBkYXRlVmlkZW9JbmZvKF9USElTKQotewotCXZnYV9tb2RlaW5mbyAqbW9kZWluZm87Ci0KLQl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDA7Ci0JdGhpcy0+aW5mby5od19hdmFpbGFibGUgPSAoYmFua2VkID8gMCA6IDEpOwotCW1vZGVpbmZvID0gdmdhX2dldG1vZGVpbmZvKHZnYV9nZXRjdXJyZW50bW9kZSgpKTsKLQl0aGlzLT5pbmZvLnZpZGVvX21lbSA9IG1vZGVpbmZvLT5tZW1vcnk7Ci0JLyogRklYTUU6IEFkZCBoYXJkd2FyZSBhY2NlbGVyYXRlZCBibGl0IGluZm9ybWF0aW9uICovCi0jaWZkZWYgU1ZHQUxJQl9ERUJVRwotCXByaW50ZigiSGFyZHdhcmUgYWNjZWxlcmF0ZWQgYmxpdDogJXNhdmFpbGFibGVcbiIsIG1vZGVpbmZvLT5oYXZlYmxpdCA/ICIiIDogIm5vdCAiKTsKLSNlbmRpZgotfQotCi1pbnQgU1ZHQV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLQlpbnQga2V5Ym9hcmQ7Ci0JaW50IGksIGo7Ci0JaW50IG1vZGUsIHRvdGFsX21vZGVzOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgewotCQlTRExfbnVtbW9kZXNbaV0gPSAwOwotCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOwotCQlTRExfdmdhbW9kZVtpXSA9IE5VTEw7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSAqLwotCXZnYV9kaXNhYmxlZHJpdmVycmVwb3J0KCk7Ci0JaWYgKCB2Z2FfaW5pdCgpIDwgMCApIHsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBTVkdBbGliIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCXZnYV9zZXRtb2RlKFRFWFQpOwotCi0JLyogRW5hYmxlIG1vdXNlIGFuZCBrZXlib2FyZCBzdXBwb3J0ICovCi0JdmdhX3NldG1vdXNlc3VwcG9ydCgxKTsKLQlrZXlib2FyZCA9IGtleWJvYXJkX2luaXRfcmV0dXJuX2ZkKCk7Ci0JaWYgKCBrZXlib2FyZCA8IDAgKSB7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUga2V5Ym9hcmQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JaWYgKCBTVkdBX2luaXRrZXltYXBzKGtleWJvYXJkKSA8IDAgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCWtleWJvYXJkX3NldGV2ZW50aGFuZGxlcihTVkdBX2tleWJvYXJkY2FsbGJhY2spOwotCi0JLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCi0JdGhpcy0+aW5mby5jdXJyZW50X3cgPSAwOwotCXRoaXMtPmluZm8uY3VycmVudF9oID0gMDsKLQotCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICh1c2UgZGVmYXVsdCA4LWJpdCBkZXB0aCkgKi8KLQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSA4OwotCi0JLyogRW51bWVyYXRlIHRoZSBhdmFpbGFibGUgZnVsbHNjcmVlbiBtb2RlcyAqLwotCXRvdGFsX21vZGVzID0gMDsKLQlmb3IgKCBtb2RlPXZnYV9sYXN0bW9kZW51bWJlcigpOyBtb2RlOyAtLW1vZGUgKSB7Ci0JCWlmICggdmdhX2hhc21vZGUobW9kZSkgKSB7Ci0JCQlpZiAoIFNWR0FfQWRkTW9kZSh0aGlzLCBtb2RlLCAwKSApIHsKLQkJCQkrK3RvdGFsX21vZGVzOwotCQkJfQotCQl9Ci0JfQotCWlmICggU1ZHQV9BZGRNb2RlKHRoaXMsIEczMjB4MjAweDI1NiwgMCkgKSArK3RvdGFsX21vZGVzOwotCWlmICggdG90YWxfbW9kZXMgPT0gMCApIHsKLQkJU0RMX1NldEVycm9yKCJObyBsaW5lYXIgdmlkZW8gbW9kZXMgYXZhaWxhYmxlIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7Ci0JCVNETF92Z2Ftb2RlW2ldID0gKGludCAqKVNETF9tYWxsb2MoU0RMX251bW1vZGVzW2ldKnNpemVvZihpbnQpKTsKLQkJaWYgKCBTRExfdmdhbW9kZVtpXSA9PSBOVUxMICkgewotCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCVNETF9tb2RlbGlzdFtpXSA9IChTRExfUmVjdCAqKikKLQkJCQlTRExfbWFsbG9jKChTRExfbnVtbW9kZXNbaV0rMSkqc2l6ZW9mKFNETF9SZWN0ICopKTsKLQkJaWYgKCBTRExfbW9kZWxpc3RbaV0gPT0gTlVMTCApIHsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQlmb3IgKCBqPTA7IGo8U0RMX251bW1vZGVzW2ldOyArK2ogKSB7Ci0JCQlTRExfbW9kZWxpc3RbaV1bal09KFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKLQkJCWlmICggU0RMX21vZGVsaXN0W2ldW2pdID09IE5VTEwgKSB7Ci0JCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCVNETF9tZW1zZXQoU0RMX21vZGVsaXN0W2ldW2pdLCAwLCBzaXplb2YoU0RMX1JlY3QpKTsKLQkJfQotCQlTRExfbW9kZWxpc3RbaV1bal0gPSBOVUxMOwotCX0KLQlmb3IgKCBtb2RlPXZnYV9sYXN0bW9kZW51bWJlcigpOyBtb2RlOyAtLW1vZGUgKSB7Ci0JCWlmICggdmdhX2hhc21vZGUobW9kZSkgKSB7Ci0JCQlTVkdBX0FkZE1vZGUodGhpcywgbW9kZSwgMSk7Ci0JCX0KLQl9Ci0JU1ZHQV9BZGRNb2RlKHRoaXMsIEczMjB4MjAweDI1NiwgMSk7Ci0KLQkvKiBGcmVlIGV4dHJhIChkdXBsaWNhdGVkKSBtb2RlcyAqLwotCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7Ci0JCWogPSAwOwotCQl3aGlsZSAoIFNETF9tb2RlbGlzdFtpXVtqXSAmJiBTRExfbW9kZWxpc3RbaV1bal0tPncgKSB7Ci0JCQlqKys7Ci0JCX0KLQkJd2hpbGUgKCBTRExfbW9kZWxpc3RbaV1bal0gKSB7Ci0JCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV1bal0pOwotCQkJU0RMX21vZGVsaXN0W2ldW2pdID0gTlVMTDsKLQkJCWorKzsKLQkJfQotCX0KLQotCS8qIEZpbGwgaW4gb3VyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBjYXBhYmlsaXRpZXMgKi8KLQlTVkdBX1VwZGF0ZVZpZGVvSW5mbyh0aGlzKTsKLQotCS8qIFdlJ3JlIGRvbmUhICovCi0JcmV0dXJuKDApOwotfQotCi1TRExfUmVjdCAqKlNWR0FfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQotewotCXJldHVybihTRExfbW9kZWxpc3RbKChmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xXSk7Ci19Ci0KLS8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCi1zdGF0aWMgdm9pZCBTVkdBX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotc3RhdGljIHZvaWQgU1ZHQV9CYW5rZWRVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotU0RMX1N1cmZhY2UgKlNWR0FfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLQlpbnQgbW9kZTsKLQlpbnQgdmdhbW9kZTsKLQl2Z2FfbW9kZWluZm8gKm1vZGVpbmZvOwotCWludCBzY3JlZW5wYWdlX2xlbjsKLQotCS8qIEZyZWUgb2xkIHBpeGVscyBpZiB3ZSB3ZXJlIGluIGJhbmtlZCBtb2RlICovCi0JaWYgKCBiYW5rZWQgJiYgY3VycmVudC0+cGl4ZWxzICkgewotCQlmcmVlKGN1cnJlbnQtPnBpeGVscyk7Ci0JCWN1cnJlbnQtPnBpeGVscyA9IE5VTEw7Ci0JfQotCi0JLyogVHJ5IHRvIHNldCB0aGUgcmVxdWVzdGVkIGxpbmVhciB2aWRlbyBtb2RlICovCi0JYnBwID0gKGJwcCs3KS84LTE7Ci0JZm9yICggbW9kZT0wOyBTRExfbW9kZWxpc3RbYnBwXVttb2RlXTsgKyttb2RlICkgewotCQlpZiAoIChTRExfbW9kZWxpc3RbYnBwXVttb2RlXS0+dyA9PSB3aWR0aCkgJiYKLQkJICAgICAoU0RMX21vZGVsaXN0W2JwcF1bbW9kZV0tPmggPT0gaGVpZ2h0KSApIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICggU0RMX21vZGVsaXN0W2JwcF1bbW9kZV0gPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBmaW5kIHJlcXVlc3RlZCBtb2RlIGluIGxpc3QiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQl2Z2Ftb2RlID0gU0RMX3ZnYW1vZGVbYnBwXVttb2RlXTsKLQl2Z2Ffc2V0bW9kZSh2Z2Ftb2RlKTsKLQl2Z2Ffc2V0cGFnZSgwKTsKLQotCWlmICggKHZnYV9zZXRsaW5lYXJhZGRyZXNzaW5nKCkgPCAwKSAmJiAodmdhbW9kZSAhPSBHMzIweDIwMHgyNTYpICkgewotCQliYW5rZWQgPSAxOwotCX0gZWxzZSB7Ci0JCWJhbmtlZCA9IDA7Ci0JfQotICAgIAotCW1vZGVpbmZvID0gdmdhX2dldG1vZGVpbmZvKFNETF92Z2Ftb2RlW2JwcF1bbW9kZV0pOwotCi0JLyogVXBkYXRlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpbmZvICovCi0JU1ZHQV9VcGRhdGVWaWRlb0luZm8odGhpcyk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgdGhlIHNjcmVlbiAqLwotCWJwcCA9IChicHArMSkqODsKLQlpZiAoIChicHAgPT0gMTYpICYmIChtb2RlaW5mby0+Y29sb3JzID09IDMyNzY4KSApIHsKLQkJYnBwID0gMTU7Ci0JfQotCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBicHAsIDAsIDAsIDAsIDApICkgewotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLwotCWN1cnJlbnQtPmZsYWdzID0gU0RMX0ZVTExTQ1JFRU47Ci0JaWYgKCAhYmFua2VkICkgewotCQljdXJyZW50LT5mbGFncyB8PSBTRExfSFdTVVJGQUNFOwotCX0KLQlpZiAoIGJwcCA9PSA4ICkgewotCQkvKiBGSVhNRTogV2hhdCBhYm91dCBEaXJlY3RDb2xvcj8gKi8KLQkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKLQl9Ci0JY3VycmVudC0+dyA9IHdpZHRoOwotCWN1cnJlbnQtPmggPSBoZWlnaHQ7Ci0JY3VycmVudC0+cGl0Y2ggPSBtb2RlaW5mby0+bGluZXdpZHRoOwotCWlmICggYmFua2VkICkgewotCQljdXJyZW50LT5waXhlbHMgPSBTRExfbWFsbG9jKGN1cnJlbnQtPmggKiBjdXJyZW50LT5waXRjaCk7Ci0JCWlmICggIWN1cnJlbnQtPnBpeGVscyApIHsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJcmV0dXJuKE5VTEwpOwotCQl9Ci0JfSBlbHNlIHsKLQkJY3VycmVudC0+cGl4ZWxzID0gdmdhX2dldGdyYXBobWVtKCk7Ci0JfQotCi0JLyogc2V0IGRvdWJsZS1idWZmZXJpbmcgKi8KLQlpZiAoIChmbGFncyAmIFNETF9ET1VCTEVCVUYpICYmICFiYW5rZWQgKQotCXsKLQkgICAgLyogbGVuZ3RoIG9mIG9uZSBzY3JlZW4gcGFnZSBpbiBieXRlcyAqLwotCSAgICBzY3JlZW5wYWdlX2xlbj1jdXJyZW50LT5oKm1vZGVpbmZvLT5saW5ld2lkdGg7Ci0KLQkgICAgLyogaWYgc3RhcnQgYWRkcmVzcyBzaG91bGQgYmUgYWxpZ25lZCAqLwotCSAgICBpZiAoIG1vZGVpbmZvLT5saW5ld2lkdGhfdW5pdCApCi0JICAgIHsKLQkJaWYgKCBzY3JlZW5wYWdlX2xlbiAlIG1vZGVpbmZvLT5saW5ld2lkdGhfdW5pdCApICAgIAotCQl7Ci0JCSAgICBzY3JlZW5wYWdlX2xlbiArPSBtb2RlaW5mby0+bGluZXdpZHRoX3VuaXQgLSAoIHNjcmVlbnBhZ2VfbGVuICUgbW9kZWluZm8tPmxpbmV3aWR0aF91bml0ICk7Ci0JCX0KLQkgICAgfQotCi0JICAgIC8qIGlmIHdlIGhldmUgZW5vdWdoIHZpZGVvbWVtb3J5ID0gIGFrIGplIGRvc3QgdmlkZW9wYW1ldGUgICovCi0JICAgIGlmICggbW9kZWluZm8tPm1lbW9yeSA+ICggc2NyZWVucGFnZV9sZW4gKiAyIC8gMTAyNCApICkKLQkgICAgewotCQljdXJyZW50LT5mbGFncyB8PSBTRExfRE9VQkxFQlVGOwotCQlmbGlwX3BhZ2UgPSAwOwotCQlmbGlwX29mZnNldFswXSA9IDA7Ci0JCWZsaXBfb2Zmc2V0WzFdID0gc2NyZWVucGFnZV9sZW47Ci0JCWZsaXBfYWRkcmVzc1swXSA9IHZnYV9nZXRncmFwaG1lbSgpOwotCQlmbGlwX2FkZHJlc3NbMV0gPSBmbGlwX2FkZHJlc3NbMF0rc2NyZWVucGFnZV9sZW47Ci0JCVNWR0FfRmxpcEhXU3VyZmFjZSh0aGlzLGN1cnJlbnQpOwotCSAgICB9Ci0JfSAKLQotCS8qIFNldCB0aGUgYmxpdCBmdW5jdGlvbiAqLwotCWlmICggYmFua2VkICkgewotCQl0aGlzLT5VcGRhdGVSZWN0cyA9IFNWR0FfQmFua2VkVXBkYXRlOwotCX0gZWxzZSB7Ci0JCXRoaXMtPlVwZGF0ZVJlY3RzID0gU1ZHQV9EaXJlY3RVcGRhdGU7Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBtb3VzZSBoYW5kbGVyIGFnYWluIChidWdneSBTVkdBbGliIDEuNDApICovCi0JbW91c2Vfc2V0ZXZlbnRoYW5kbGVyKFNWR0FfbW91c2VjYWxsYmFjayk7Ci0KLQkvKiBXZSdyZSBkb25lICovCi0JcmV0dXJuKGN1cnJlbnQpOwotfQotCi0vKiBXZSBkb24ndCBhY3R1YWxseSBhbGxvdyBoYXJkd2FyZSBzdXJmYWNlcyBvdGhlciB0aGFuIHRoZSBtYWluIG9uZSAqLwotc3RhdGljIGludCBTVkdBX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4oLTEpOwotfQotc3RhdGljIHZvaWQgU1ZHQV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm47Ci19Ci0KLS8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSBvbiBwYWdlIGZsaXBwZWQgZGlzcGxheXMgKi8KLXN0YXRpYyBpbnQgU1ZHQV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQkvKiBUaGUgd2FpdGluZyBpcyBkb25lIGluIFNWR0FfRmxpcEhXU3VyZmFjZSgpICovCi0JcmV0dXJuKDApOwotfQotc3RhdGljIHZvaWQgU1ZHQV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBTVkdBX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWlmICggIWJhbmtlZCApIHsKLQkJdmdhX3NldGRpc3BsYXlzdGFydChmbGlwX29mZnNldFtmbGlwX3BhZ2VdKTsKLQkJZmxpcF9wYWdlPSFmbGlwX3BhZ2U7Ci0JCXN1cmZhY2UtPnBpeGVscz1mbGlwX2FkZHJlc3NbZmxpcF9wYWdlXTsKLQkJdmdhX3dhaXRyZXRyYWNlKCk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgU1ZHQV9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgU1ZHQV9CYW5rZWRVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCWludCBpLCBqOwotCVNETF9SZWN0ICpyZWN0OwotCWludCBwYWdlLCB2cDsKLQlpbnQgeCwgeSwgdywgaDsKLQl1bnNpZ25lZCBjaGFyICpzcmM7Ci0JdW5zaWduZWQgY2hhciAqZHN0OwotCWludCBicHAgPSB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKLQlpbnQgcGl0Y2ggPSB0aGlzLT5zY3JlZW4tPnBpdGNoOwotCi0JZHN0ID0gdmdhX2dldGdyYXBobWVtKCk7Ci0JZm9yICggaT0wOyBpIDwgbnVtcmVjdHM7ICsraSApIHsKLQkJcmVjdCA9ICZyZWN0c1tpXTsKLQkJeCA9IHJlY3QtPng7Ci0JCXkgPSByZWN0LT55OwotCQl3ID0gcmVjdC0+dyAqIGJwcDsKLQkJaCA9IHJlY3QtPmg7Ci0KLQkJdnAgPSB5ICogcGl0Y2ggKyB4ICogYnBwOwotCQlzcmMgPSAodW5zaWduZWQgY2hhciAqKXRoaXMtPnNjcmVlbi0+cGl4ZWxzICsgdnA7Ci0JCXBhZ2UgPSB2cCA+PiAxNjsKLQkJdnAgJj0gMHhmZmZmOwotCQl2Z2Ffc2V0cGFnZShwYWdlKTsKLQkJZm9yIChqID0gMDsgaiA8IGg7IGorKykgewotCQkJaWYgKHZwICsgdyA+IDB4MTAwMDApIHsKLQkJCQlpZiAodnAgPj0gMHgxMDAwMCkgewotCQkJCQlwYWdlKys7Ci0JCQkJCXZnYV9zZXRwYWdlKHBhZ2UpOwotCQkJCQl2cCAmPSAweGZmZmY7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU0RMX21lbWNweShkc3QgKyB2cCwgc3JjLCAweDEwMDAwIC0gdnApOwotCQkJCQlwYWdlKys7Ci0JCQkJCXZnYV9zZXRwYWdlKHBhZ2UpOwotCQkJCQlTRExfbWVtY3B5KGRzdCwgc3JjICsgMHgxMDAwMCAtIHZwLAotCQkJCQkJICh2cCArIHcpICYgMHhmZmZmKTsKLQkJCQkJdnAgPSAodnAgKyBwaXRjaCkgJiAweGZmZmY7Ci0JCQkJCXNyYyArPSBwaXRjaDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJU0RMX21lbWNweShkc3QgKyB2cCwgc3JjLCB3KTsKLQkJCXNyYyArPSBwaXRjaDsKLQkJCXZwICs9IHBpdGNoOwotCQl9Ci0JfQotfQotCi1pbnQgU1ZHQV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0gICAgICAgIGludCBpOwotCi0JZm9yKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7Ci0JICAgICAgICB2Z2Ffc2V0cGFsZXR0ZShmaXJzdGNvbG9yICsgaSwKLQkJCSAgICAgICBjb2xvcnNbaV0ucj4+MiwKLQkJCSAgICAgICBjb2xvcnNbaV0uZz4+MiwKLQkJCSAgICAgICBjb2xvcnNbaV0uYj4+Mik7Ci0JfQotCXJldHVybigxKTsKLX0KLQotLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCi0gICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCi0qLwotdm9pZCBTVkdBX1ZpZGVvUXVpdChfVEhJUykKLXsKLQlpbnQgaSwgajsKLQotCS8qIFJlc2V0IHRoZSBjb25zb2xlIHZpZGVvIG1vZGUgKi8KLQlpZiAoIHRoaXMtPnNjcmVlbiAmJiAodGhpcy0+c2NyZWVuLT53ICYmIHRoaXMtPnNjcmVlbi0+aCkgKSB7Ci0JCXZnYV9zZXRtb2RlKFRFWFQpOwotCX0KLQlrZXlib2FyZF9jbG9zZSgpOwotCi0JLyogRnJlZSB2aWRlbyBtb2RlIGxpc3RzICovCi0JZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKLQkJaWYgKCBTRExfbW9kZWxpc3RbaV0gIT0gTlVMTCApIHsKLQkJCWZvciAoIGo9MDsgU0RMX21vZGVsaXN0W2ldW2pdOyArK2ogKQotCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXVtqXSk7Ci0JCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOwotCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKLQkJfQotCQlpZiAoIFNETF92Z2Ftb2RlW2ldICE9IE5VTEwgKSB7Ci0JCQlTRExfZnJlZShTRExfdmdhbW9kZVtpXSk7Ci0JCQlTRExfdmdhbW9kZVtpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKCB0aGlzLT5zY3JlZW4gKSB7Ci0JCWlmICggYmFua2VkICYmIHRoaXMtPnNjcmVlbi0+cGl4ZWxzICkgewotCQkJU0RMX2ZyZWUodGhpcy0+c2NyZWVuLT5waXhlbHMpOwotCQl9Ci0JCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYXZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2F2aWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDVlOWVlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYXZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX3N2Z2F2aWRlb19oCi0jZGVmaW5lIF9TRExfc3ZnYXZpZGVvX2gKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotI2RlZmluZSBOVU1fTU9ERUxJU1RTCTQJCS8qIDgsIDE2LCAyNCwgYW5kIDMyIGJpdHMtcGVyLXBpeGVsICovCi0JaW50IFNETF9udW1tb2Rlc1tOVU1fTU9ERUxJU1RTXTsKLQlTRExfUmVjdCAqKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXTsKLQlpbnQgKlNETF92Z2Ftb2RlW05VTV9NT0RFTElTVFNdOwotCi0JLyogaW5mb3JtYXRpb24gZm9yIGRvdWJsZS1idWZmZXJpbmcgKi8KLQlpbnQgZmxpcF9wYWdlOwotCWludCBmbGlwX29mZnNldFsyXTsKLQlVaW50OCAqZmxpcF9hZGRyZXNzWzJdOwotCi0JLyogU2V0IHRvIDEgaWYgd2UncmUgaW4gYmFua2VkIHZpZGVvIG1vZGUgKi8KLQlpbnQgYmFua2VkOwotfTsKLS8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLwotI2RlZmluZSBTRExfbnVtbW9kZXMJCSh0aGlzLT5oaWRkZW4tPlNETF9udW1tb2RlcykKLSNkZWZpbmUgU0RMX21vZGVsaXN0CQkodGhpcy0+aGlkZGVuLT5TRExfbW9kZWxpc3QpCi0jZGVmaW5lIFNETF92Z2Ftb2RlCQkodGhpcy0+aGlkZGVuLT5TRExfdmdhbW9kZSkKLSNkZWZpbmUgZmxpcF9wYWdlCQkodGhpcy0+aGlkZGVuLT5mbGlwX3BhZ2UpCi0jZGVmaW5lIGZsaXBfb2Zmc2V0CQkodGhpcy0+aGlkZGVuLT5mbGlwX29mZnNldCkKLSNkZWZpbmUgZmxpcF9hZGRyZXNzCQkodGhpcy0+aGlkZGVuLT5mbGlwX2FkZHJlc3MpCi0jZGVmaW5lCWJhbmtlZAkJCSh0aGlzLT5oaWRkZW4tPmJhbmtlZCkKLQotI2VuZGlmIC8qIF9TRExfc3ZnYXZpZGVvX2ggKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby92Z2wvU0RMX3ZnbGV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby92Z2wvU0RMX3ZnbGV2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZiZTJhLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vdmdsL1NETF92Z2xldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgWDExIGV2ZW50cyBpbnRvIFNETCBldmVudHMgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxzeXMvZmJpby5oPgotI2luY2x1ZGUgPHN5cy9jb25zaW8uaD4KLSNpbmNsdWRlIDxzeXMva2Jpby5oPgotI2luY2x1ZGUgPHZnbC5oPgotCi0jaW5jbHVkZSAiU0RMLmgiCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF92Z2x2aWRlby5oIgotI2luY2x1ZGUgIlNETF92Z2xldmVudHNfYy5oIgotCi0vKiBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBjb25zb2xlIHNjYW5jb2RlIHRvIGEgU0RMIGtleXN5bSAqLwotLyogRklYTUU6IEZyZWUgdGhlIGtleW1hcCB3aGVuIHdlIHNodXQgZG93biB0aGUgdmlkZW8gbW9kZSAqLwotc3RhdGljIGtleW1hcF90ICp2Z2Ffa2V5bWFwID0gTlVMTDsKLXN0YXRpYyBTRExLZXkga2V5bWFwWzEyOF07Ci1zdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKTsKLQotc3RhdGljIGludCBwb3N0ZWQgPSAwOwotc3RhdGljIGludCBvbGR4ID0gLTE7Ci1zdGF0aWMgaW50IG9sZHkgPSAtMTsKLXN0YXRpYyBzdHJ1Y3QgbW91c2VfaW5mbyBtb3VzZWluZm87Ci0KLS8qIFVnaCwgd2UgaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGtlcm5lbCdzIGtleXN5bSBtYXBwaW5nIGNvZGUuLi4KLSAgIE9oLCBpdCdzIG5vdCBzbyBiYWQuIDotKQotCi0gICBGSVhNRTogQWRkIGtleWJvYXJkIExFRCBoYW5kbGluZyBjb2RlCi0gKi8KLWludCBWR0xfaW5pdGtleW1hcHMoaW50IGZkKQotewotCXZnYV9rZXltYXAgPSBTRExfbWFsbG9jKHNpemVvZihrZXltYXBfdCkpOwotCWlmICggISB2Z2Ffa2V5bWFwICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JaWYgKGlvY3RsKGZkLCBHSU9fS0VZTUFQLCB2Z2Ffa2V5bWFwKSA9PSAtMSkgewotCQlTRExfZnJlZSh2Z2Ffa2V5bWFwKTsKLQkJdmdhX2tleW1hcCA9IE5VTEw7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGdldCBrZXlib2FyZCBtYXAiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVfa2V5Ym9hcmQoX1RISVMpCi17Ci0JU0RMX2tleXN5bSBrZXlzeW07Ci0JaW50IGMsIHByZXNzZWQsIHNjYW5jb2RlOwotCi0Jd2hpbGUgKChjID0gVkdMS2V5Ym9hcmRHZXRDaCgpKSAhPSAwKSB7Ci0JCXNjYW5jb2RlID0gYyAmIDB4N0Y7Ci0gICAgICAgICAgICAgICAgaWYgKGMgJiAweDgwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVzc2VkID0gU0RMX1JFTEVBU0VEOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVzc2VkID0gU0RMX1BSRVNTRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0JCXBvc3RlZCArPSBTRExfUHJpdmF0ZUtleWJvYXJkKHByZXNzZWQsCi0JCQkJIFRyYW5zbGF0ZUtleShzY2FuY29kZSwgJmtleXN5bSkpOwotCX0KLX0KLQotaW50IFZHTF9pbml0bW91c2UoaW50IGZkKQotewotCW1vdXNlaW5mby5vcGVyYXRpb24gPSBNT1VTRV9HRVRJTkZPOwotCWlmIChpb2N0bChmZCwgQ09OU19NT1VTRUNUTCwgJm1vdXNlaW5mbykgIT0gMCkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZV9tb3VzZShfVEhJUykKLXsKLQljaGFyIGJ1dHRvbnM7Ci0JaW50IHgsIHk7Ci0JaW50IGJ1dHRvbl9zdGF0ZSwgc3RhdGVfY2hhbmdlZCwgc3RhdGU7Ci0JaW50IGk7Ci0KLQlpb2N0bCgwLCBDT05TX01PVVNFQ1RMLCAmbW91c2VpbmZvKTsKLQl4ID0gbW91c2VpbmZvLnUuZGF0YS54OwotCXkgPSBtb3VzZWluZm8udS5kYXRhLnk7Ci0JYnV0dG9ucyA9IG1vdXNlaW5mby51LmRhdGEuYnV0dG9uczsKLQotCWlmICgoeCAhPSBvbGR4KSB8fCAoeSAhPSBvbGR5KSkgewotCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCB4LCB5KTsKLQkJb2xkeCA9IHg7Ci0JCW9sZHkgPSB5OwotCX0KLQotCS8qIFNlZSB3aGF0J3MgY2hhbmdlZCAqLwotCWJ1dHRvbl9zdGF0ZSA9IFNETF9HZXRNb3VzZVN0YXRlKE5VTEwsIE5VTEwpOwotCXN0YXRlX2NoYW5nZWQgPSBidXR0b25fc3RhdGUgXiBidXR0b25zOwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKHN0YXRlX2NoYW5nZWQgJiAoMTw8aSkpIHsKLQkJCWlmIChidXR0b25zICYgKDE8PGkpKSB7Ci0JCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdGUgPSBTRExfUkVMRUFTRUQ7Ci0JCQl9Ci0JCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihzdGF0ZSwgaSArIDEsIDAsIDApOwotCQl9Ci0JfQotfQotCQotCi12b2lkIFZHTF9QdW1wRXZlbnRzKF9USElTKQotewotCWRvIHsKLQkJcG9zdGVkID0gMDsKLQkJaGFuZGxlX2tleWJvYXJkKHRoaXMpOwotCQloYW5kbGVfbW91c2UodGhpcyk7Ci0JfSB3aGlsZSAocG9zdGVkICE9IDApOwotfQotCi12b2lkIFZHTF9Jbml0T1NLZXltYXAoX1RISVMpCi17Ci0JaW50IGk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBCZU9TIGtleSB0cmFuc2xhdGlvbiB0YWJsZSAqLwotCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKGtleW1hcCk7ICsraSApCi0JCWtleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKLQotCWtleW1hcFtTQ0FOQ09ERV9FU0NBUEVdID0gU0RMS19FU0NBUEU7Ci0Ja2V5bWFwW1NDQU5DT0RFXzFdID0gU0RMS18xOwotCWtleW1hcFtTQ0FOQ09ERV8yXSA9IFNETEtfMjsKLQlrZXltYXBbU0NBTkNPREVfM10gPSBTRExLXzM7Ci0Ja2V5bWFwW1NDQU5DT0RFXzRdID0gU0RMS180OwotCWtleW1hcFtTQ0FOQ09ERV81XSA9IFNETEtfNTsKLQlrZXltYXBbU0NBTkNPREVfNl0gPSBTRExLXzY7Ci0Ja2V5bWFwW1NDQU5DT0RFXzddID0gU0RMS183OwotCWtleW1hcFtTQ0FOQ09ERV84XSA9IFNETEtfODsKLQlrZXltYXBbU0NBTkNPREVfOV0gPSBTRExLXzk7Ci0Ja2V5bWFwW1NDQU5DT0RFXzBdID0gU0RMS18wOwotCWtleW1hcFtTQ0FOQ09ERV9NSU5VU10gPSBTRExLX01JTlVTOwotCWtleW1hcFtTQ0FOQ09ERV9FUVVBTF0gPSBTRExLX0VRVUFMUzsKLQlrZXltYXBbU0NBTkNPREVfQkFDS1NQQUNFXSA9IFNETEtfQkFDS1NQQUNFOwotCWtleW1hcFtTQ0FOQ09ERV9UQUJdID0gU0RMS19UQUI7Ci0Ja2V5bWFwW1NDQU5DT0RFX1FdID0gU0RMS19xOwotCWtleW1hcFtTQ0FOQ09ERV9XXSA9IFNETEtfdzsKLQlrZXltYXBbU0NBTkNPREVfRV0gPSBTRExLX2U7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JdID0gU0RMS19yOwotCWtleW1hcFtTQ0FOQ09ERV9UXSA9IFNETEtfdDsKLQlrZXltYXBbU0NBTkNPREVfWV0gPSBTRExLX3k7Ci0Ja2V5bWFwW1NDQU5DT0RFX1VdID0gU0RMS191OwotCWtleW1hcFtTQ0FOQ09ERV9JXSA9IFNETEtfaTsKLQlrZXltYXBbU0NBTkNPREVfT10gPSBTRExLX287Ci0Ja2V5bWFwW1NDQU5DT0RFX1BdID0gU0RMS19wOwotCWtleW1hcFtTQ0FOQ09ERV9CUkFDS0VUX0xFRlRdID0gU0RMS19MRUZUQlJBQ0tFVDsKLQlrZXltYXBbU0NBTkNPREVfQlJBQ0tFVF9SSUdIVF0gPSBTRExLX1JJR0hUQlJBQ0tFVDsKLQlrZXltYXBbU0NBTkNPREVfRU5URVJdID0gU0RMS19SRVRVUk47Ci0Ja2V5bWFwW1NDQU5DT0RFX0xFRlRDT05UUk9MXSA9IFNETEtfTENUUkw7Ci0Ja2V5bWFwW1NDQU5DT0RFX0FdID0gU0RMS19hOwotCWtleW1hcFtTQ0FOQ09ERV9TXSA9IFNETEtfczsKLQlrZXltYXBbU0NBTkNPREVfRF0gPSBTRExLX2Q7Ci0Ja2V5bWFwW1NDQU5DT0RFX0ZdID0gU0RMS19mOwotCWtleW1hcFtTQ0FOQ09ERV9HXSA9IFNETEtfZzsKLQlrZXltYXBbU0NBTkNPREVfSF0gPSBTRExLX2g7Ci0Ja2V5bWFwW1NDQU5DT0RFX0pdID0gU0RMS19qOwotCWtleW1hcFtTQ0FOQ09ERV9LXSA9IFNETEtfazsKLQlrZXltYXBbU0NBTkNPREVfTF0gPSBTRExLX2w7Ci0Ja2V5bWFwW1NDQU5DT0RFX1NFTUlDT0xPTl0gPSBTRExLX1NFTUlDT0xPTjsKLQlrZXltYXBbU0NBTkNPREVfQVBPU1RST1BIRV0gPSBTRExLX1FVT1RFOwotCWtleW1hcFtTQ0FOQ09ERV9HUkFWRV0gPSBTRExLX0JBQ0tRVU9URTsKLQlrZXltYXBbU0NBTkNPREVfTEVGVFNISUZUXSA9IFNETEtfTFNISUZUOwotCWtleW1hcFtTQ0FOQ09ERV9CQUNLU0xBU0hdID0gU0RMS19CQUNLU0xBU0g7Ci0Ja2V5bWFwW1NDQU5DT0RFX1pdID0gU0RMS196OwotCWtleW1hcFtTQ0FOQ09ERV9YXSA9IFNETEtfeDsKLQlrZXltYXBbU0NBTkNPREVfQ10gPSBTRExLX2M7Ci0Ja2V5bWFwW1NDQU5DT0RFX1ZdID0gU0RMS192OwotCWtleW1hcFtTQ0FOQ09ERV9CXSA9IFNETEtfYjsKLQlrZXltYXBbU0NBTkNPREVfTl0gPSBTRExLX247Ci0Ja2V5bWFwW1NDQU5DT0RFX01dID0gU0RMS19tOwotCWtleW1hcFtTQ0FOQ09ERV9DT01NQV0gPSBTRExLX0NPTU1BOwotCWtleW1hcFtTQ0FOQ09ERV9QRVJJT0RdID0gU0RMS19QRVJJT0Q7Ci0Ja2V5bWFwW1NDQU5DT0RFX1NMQVNIXSA9IFNETEtfU0xBU0g7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JJR0hUU0hJRlRdID0gU0RMS19SU0hJRlQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRE1VTFRJUExZXSA9IFNETEtfS1BfTVVMVElQTFk7Ci0Ja2V5bWFwW1NDQU5DT0RFX0xFRlRBTFRdID0gU0RMS19MQUxUOwotCWtleW1hcFtTQ0FOQ09ERV9TUEFDRV0gPSBTRExLX1NQQUNFOwotCWtleW1hcFtTQ0FOQ09ERV9DQVBTTE9DS10gPSBTRExLX0NBUFNMT0NLOwotCWtleW1hcFtTQ0FOQ09ERV9GMV0gPSBTRExLX0YxOwotCWtleW1hcFtTQ0FOQ09ERV9GMl0gPSBTRExLX0YyOwotCWtleW1hcFtTQ0FOQ09ERV9GM10gPSBTRExLX0YzOwotCWtleW1hcFtTQ0FOQ09ERV9GNF0gPSBTRExLX0Y0OwotCWtleW1hcFtTQ0FOQ09ERV9GNV0gPSBTRExLX0Y1OwotCWtleW1hcFtTQ0FOQ09ERV9GNl0gPSBTRExLX0Y2OwotCWtleW1hcFtTQ0FOQ09ERV9GN10gPSBTRExLX0Y3OwotCWtleW1hcFtTQ0FOQ09ERV9GOF0gPSBTRExLX0Y4OwotCWtleW1hcFtTQ0FOQ09ERV9GOV0gPSBTRExLX0Y5OwotCWtleW1hcFtTQ0FOQ09ERV9GMTBdID0gU0RMS19GMTA7Ci0Ja2V5bWFwW1NDQU5DT0RFX05VTUxPQ0tdID0gU0RMS19OVU1MT0NLOwotCWtleW1hcFtTQ0FOQ09ERV9TQ1JPTExMT0NLXSA9IFNETEtfU0NST0xMT0NLOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ3XSA9IFNETEtfS1A3OwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JVUExFRlRdID0gU0RMS19LUDc7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRDhdID0gU0RMS19LUDg7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NVUlNPUlVQXSA9IFNETEtfS1A4OwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ5XSA9IFNETEtfS1A5OwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JVUFJJR0hUXSA9IFNETEtfS1A5OwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURNSU5VU10gPSBTRExLX0tQX01JTlVTOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ0XSA9IFNETEtfS1A0OwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JMRUZUXSA9IFNETEtfS1A0OwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ1XSA9IFNETEtfS1A1OwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ2XSA9IFNETEtfS1A2OwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JSSUdIVF0gPSBTRExLX0tQNjsKLQlrZXltYXBbU0NBTkNPREVfS0VZUEFEUExVU10gPSBTRExLX0tQX1BMVVM7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRDFdID0gU0RMS19LUDE7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NVUlNPUkRPV05MRUZUXSA9IFNETEtfS1AxOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQyXSA9IFNETEtfS1AyOwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JET1dOXSA9IFNETEtfS1AyOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQzXSA9IFNETEtfS1AzOwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JET1dOUklHSFRdID0gU0RMS19LUDM7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRDBdID0gU0RMS19LUDA7Ci0Ja2V5bWFwW1NDQU5DT0RFX0tFWVBBRFBFUklPRF0gPSBTRExLX0tQX1BFUklPRDsKLQlrZXltYXBbU0NBTkNPREVfTEVTU10gPSBTRExLX0xFU1M7Ci0Ja2V5bWFwW1NDQU5DT0RFX0YxMV0gPSBTRExLX0YxMTsKLQlrZXltYXBbU0NBTkNPREVfRjEyXSA9IFNETEtfRjEyOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURFTlRFUl0gPSBTRExLX0tQX0VOVEVSOwotCWtleW1hcFtTQ0FOQ09ERV9SSUdIVENPTlRST0xdID0gU0RMS19SQ1RSTDsKLQlrZXltYXBbU0NBTkNPREVfQ09OVFJPTF0gPSBTRExLX1JDVFJMOwotCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURESVZJREVdID0gU0RMS19LUF9ESVZJREU7Ci0Ja2V5bWFwW1NDQU5DT0RFX1BSSU5UU0NSRUVOXSA9IFNETEtfUFJJTlQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JJR0hUQUxUXSA9IFNETEtfUkFMVDsKLQlrZXltYXBbU0NBTkNPREVfQlJFQUtdID0gU0RMS19CUkVBSzsKLQlrZXltYXBbU0NBTkNPREVfQlJFQUtfQUxURVJOQVRJVkVdID0gU0RMS19VTktOT1dOOwotCWtleW1hcFtTQ0FOQ09ERV9IT01FXSA9IFNETEtfSE9NRTsKLQlrZXltYXBbU0NBTkNPREVfQ1VSU09SQkxPQ0tVUF0gPSBTRExLX1VQOwotCWtleW1hcFtTQ0FOQ09ERV9QQUdFVVBdID0gU0RMS19QQUdFVVA7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NVUlNPUkJMT0NLTEVGVF0gPSBTRExLX0xFRlQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX0NVUlNPUkJMT0NLUklHSFRdID0gU0RMS19SSUdIVDsKLQlrZXltYXBbU0NBTkNPREVfRU5EXSA9IFNETEtfRU5EOwotCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JCTE9DS0RPV05dID0gU0RMS19ET1dOOwotCWtleW1hcFtTQ0FOQ09ERV9QQUdFRE9XTl0gPSBTRExLX1BBR0VET1dOOwotCWtleW1hcFtTQ0FOQ09ERV9JTlNFUlRdID0gU0RMS19JTlNFUlQ7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JFTU9WRV0gPSBTRExLX0RFTEVURTsKLQlrZXltYXBbMTE5XSA9IFNETEtfUEFVU0U7Ci0Ja2V5bWFwW1NDQU5DT0RFX1JJR0hUV0lOXSA9IFNETEtfUlNVUEVSOwotCWtleW1hcFtTQ0FOQ09ERV9MRUZUV0lOXSA9IFNETEtfTFNVUEVSOwotCWtleW1hcFsxMjddID0gU0RMS19NRU5VOwotfQotCi1zdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQotewotCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCi0Ja2V5c3ltLT5zY2FuY29kZSA9IHNjYW5jb2RlOwotCWtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKLQlrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKLQotCS8qIElmIFVOSUNPREUgaXMgb24sIGdldCB0aGUgVU5JQ09ERSB2YWx1ZSBmb3IgdGhlIGtleSAqLwotCWtleXN5bS0+dW5pY29kZSA9IDA7Ci0JaWYgKCBTRExfVHJhbnNsYXRlVU5JQ09ERSAmJiB2Z2Ffa2V5bWFwICkgewotCQlpbnQgbWFwOwotCQlTRExNb2QgbW9kc3RhdGU7Ci0KLQkJbW9kc3RhdGUgPSBTRExfR2V0TW9kU3RhdGUoKTsKLQkJbWFwID0gMDsKLQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfU0hJRlQgKSB7Ci0JCQltYXAgKz0gMTsKLQkJfQotCQlpZiAoIG1vZHN0YXRlICYgS01PRF9DVFJMICkgewotCQkJbWFwICs9IDI7Ci0JCX0KLQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQUxUICkgewotCQkJbWFwICs9IDQ7Ci0JCX0KLQkJaWYgKCAhKHZnYV9rZXltYXAtPmtleVtzY2FuY29kZV0uc3BjbCAmICgweDgwID4+IG1hcCkpICkgewotCQkJa2V5c3ltLT51bmljb2RlID0gdmdhX2tleW1hcC0+a2V5W3NjYW5jb2RlXS5tYXBbbWFwXTsKLQkJfQotCi0JfQotCXJldHVybihrZXlzeW0pOwotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vdmdsL1NETF92Z2xldmVudHNfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTFjOTA3Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vdmdsL1NETF92Z2xldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3ZnbHZpZGVvLmgiCi0KLS8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFNETF9zeXNldmVudHMuYyB0byBvdGhlciBwYXJ0cyAKLSAgIG9mIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIChTRExfc3lzdmlkZW8uYykKLSovCi1leHRlcm4gaW50IFZHTF9pbml0a2V5bWFwcyhpbnQgZmQpOwotZXh0ZXJuIGludCBWR0xfaW5pdG1vdXNlKGludCBmZCk7Ci1leHRlcm4gdm9pZCBWR0xfa2V5Ym9hcmRjYWxsYmFjayhpbnQgc2NhbmNvZGUsIGludCBwcmVzc2VkKTsKLQotZXh0ZXJuIHZvaWQgVkdMX0luaXRPU0tleW1hcChfVEhJUyk7Ci1leHRlcm4gdm9pZCBWR0xfUHVtcEV2ZW50cyhfVEhJUyk7Ci0KLS8qIE1vdXNlIGJ1dHRvbnMgKi8KLSNkZWZpbmUgTU9VU0VfTEVGVEJVVFRPTiAgICAgICAgMHgwMQotI2RlZmluZSBNT1VTRV9NSURETEVCVVRUT04gICAgICAweDAyCi0jZGVmaW5lIE1PVVNFX1JJR0hUQlVUVE9OICAgICAgIDB4MDQKLQotLyogU2NhbmNvZGVzICovCi0jZGVmaW5lIFNDQU5DT0RFX0VTQ0FQRQkJCTEKLSNkZWZpbmUgU0NBTkNPREVfMQkJCTIKLSNkZWZpbmUgU0NBTkNPREVfMgkJCTMKLSNkZWZpbmUgU0NBTkNPREVfMwkJCTQKLSNkZWZpbmUgU0NBTkNPREVfNAkJCTUKLSNkZWZpbmUgU0NBTkNPREVfNQkJCTYKLSNkZWZpbmUgU0NBTkNPREVfNgkJCTcKLSNkZWZpbmUgU0NBTkNPREVfNwkJCTgKLSNkZWZpbmUgU0NBTkNPREVfOAkJCTkKLSNkZWZpbmUgU0NBTkNPREVfOQkJCTEwCi0jZGVmaW5lIFNDQU5DT0RFXzAJCQkxMQotI2RlZmluZSBTQ0FOQ09ERV9NSU5VUwkJCTEyCi0jZGVmaW5lIFNDQU5DT0RFX0VRVUFMCQkJMTMKLSNkZWZpbmUgU0NBTkNPREVfQkFDS1NQQUNFCQkxNAotI2RlZmluZSBTQ0FOQ09ERV9UQUIJCQkxNQotI2RlZmluZSBTQ0FOQ09ERV9RCQkJMTYKLSNkZWZpbmUgU0NBTkNPREVfVwkJCTE3Ci0jZGVmaW5lIFNDQU5DT0RFX0UJCQkxOAotI2RlZmluZSBTQ0FOQ09ERV9SCQkJMTkKLSNkZWZpbmUgU0NBTkNPREVfVAkJCTIwCi0jZGVmaW5lIFNDQU5DT0RFX1kJCQkyMQotI2RlZmluZSBTQ0FOQ09ERV9VCQkJMjIKLSNkZWZpbmUgU0NBTkNPREVfSQkJCTIzCi0jZGVmaW5lIFNDQU5DT0RFX08JCQkyNAotI2RlZmluZSBTQ0FOQ09ERV9QCQkJMjUKLSNkZWZpbmUgU0NBTkNPREVfQlJBQ0tFVF9MRUZUCQkyNgotI2RlZmluZSBTQ0FOQ09ERV9CUkFDS0VUX1JJR0hUCQkyNwotI2RlZmluZSBTQ0FOQ09ERV9FTlRFUgkJCTI4Ci0jZGVmaW5lIFNDQU5DT0RFX0xFRlRDT05UUk9MCQkyOQotI2RlZmluZSBTQ0FOQ09ERV9BCQkJMzAKLSNkZWZpbmUgU0NBTkNPREVfUwkJCTMxCi0jZGVmaW5lIFNDQU5DT0RFX0QJCQkzMgotI2RlZmluZSBTQ0FOQ09ERV9GCQkJMzMKLSNkZWZpbmUgU0NBTkNPREVfRwkJCTM0Ci0jZGVmaW5lIFNDQU5DT0RFX0gJCQkzNQotI2RlZmluZSBTQ0FOQ09ERV9KCQkJMzYKLSNkZWZpbmUgU0NBTkNPREVfSwkJCTM3Ci0jZGVmaW5lIFNDQU5DT0RFX0wJCQkzOAotI2RlZmluZSBTQ0FOQ09ERV9TRU1JQ09MT04JCTM5Ci0jZGVmaW5lIFNDQU5DT0RFX0FQT1NUUk9QSEUJCTQwCi0jZGVmaW5lIFNDQU5DT0RFX0dSQVZFCQkJNDEKLSNkZWZpbmUgU0NBTkNPREVfTEVGVFNISUZUCQk0MgotI2RlZmluZSBTQ0FOQ09ERV9CQUNLU0xBU0gJCTQzCi0jZGVmaW5lIFNDQU5DT0RFX1oJCQk0NAotI2RlZmluZSBTQ0FOQ09ERV9YCQkJNDUKLSNkZWZpbmUgU0NBTkNPREVfQwkJCTQ2Ci0jZGVmaW5lIFNDQU5DT0RFX1YJCQk0NwotI2RlZmluZSBTQ0FOQ09ERV9CCQkJNDgKLSNkZWZpbmUgU0NBTkNPREVfTgkJCTQ5Ci0jZGVmaW5lIFNDQU5DT0RFX00JCQk1MAotI2RlZmluZSBTQ0FOQ09ERV9DT01NQQkJCTUxCi0jZGVmaW5lIFNDQU5DT0RFX1BFUklPRAkJCTUyCi0jZGVmaW5lIFNDQU5DT0RFX1NMQVNICQkJNTMKLSNkZWZpbmUgU0NBTkNPREVfUklHSFRTSElGVAkJNTQKLSNkZWZpbmUgU0NBTkNPREVfS0VZUEFETVVMVElQTFkJCTU1Ci0jZGVmaW5lIFNDQU5DT0RFX0xFRlRBTFQJCTU2Ci0jZGVmaW5lIFNDQU5DT0RFX1NQQUNFCQkJNTcKLSNkZWZpbmUgU0NBTkNPREVfQ0FQU0xPQ0sJCTU4Ci0jZGVmaW5lIFNDQU5DT0RFX0YxCQkJNTkKLSNkZWZpbmUgU0NBTkNPREVfRjIJCQk2MAotI2RlZmluZSBTQ0FOQ09ERV9GMwkJCTYxCi0jZGVmaW5lIFNDQU5DT0RFX0Y0CQkJNjIKLSNkZWZpbmUgU0NBTkNPREVfRjUJCQk2MwotI2RlZmluZSBTQ0FOQ09ERV9GNgkJCTY0Ci0jZGVmaW5lIFNDQU5DT0RFX0Y3CQkJNjUKLSNkZWZpbmUgU0NBTkNPREVfRjgJCQk2NgotI2RlZmluZSBTQ0FOQ09ERV9GOQkJCTY3Ci0jZGVmaW5lIFNDQU5DT0RFX0YxMAkJCTY4Ci0jZGVmaW5lIFNDQU5DT0RFX05VTUxPQ0sJCTY5Ci0jZGVmaW5lIFNDQU5DT0RFX1NDUk9MTExPQ0sJCTcwCi0jZGVmaW5lIFNDQU5DT0RFX0tFWVBBRDcJCTcxCi0jZGVmaW5lIFNDQU5DT0RFX0NVUlNPUlVQTEVGVAkJNzEKLSNkZWZpbmUgU0NBTkNPREVfS0VZUEFEOAkJNzIKLSNkZWZpbmUgU0NBTkNPREVfQ1VSU09SVVAJCTcyCi0jZGVmaW5lIFNDQU5DT0RFX0tFWVBBRDkJCTczCi0jZGVmaW5lIFNDQU5DT0RFX0NVUlNPUlVQUklHSFQJCTczCi0jZGVmaW5lIFNDQU5DT0RFX0tFWVBBRE1JTlVTCQk3NAotI2RlZmluZSBTQ0FOQ09ERV9LRVlQQUQ0CQk3NQotI2RlZmluZSBTQ0FOQ09ERV9DVVJTT1JMRUZUCQk3NQotI2RlZmluZSBTQ0FOQ09ERV9LRVlQQUQ1CQk3NgotI2RlZmluZSBTQ0FOQ09ERV9LRVlQQUQ2CQk3NwotI2RlZmluZSBTQ0FOQ09ERV9DVVJTT1JSSUdIVAkJNzcKLSNkZWZpbmUgU0NBTkNPREVfS0VZUEFEUExVUwkJNzgKLSNkZWZpbmUgU0NBTkNPREVfS0VZUEFEMQkJNzkKLSNkZWZpbmUgU0NBTkNPREVfQ1VSU09SRE9XTkxFRlQJCTc5Ci0jZGVmaW5lIFNDQU5DT0RFX0tFWVBBRDIJCTgwCi0jZGVmaW5lIFNDQU5DT0RFX0NVUlNPUkRPV04JCTgwCi0jZGVmaW5lIFNDQU5DT0RFX0tFWVBBRDMJCTgxCi0jZGVmaW5lIFNDQU5DT0RFX0NVUlNPUkRPV05SSUdIVAk4MQotI2RlZmluZSBTQ0FOQ09ERV9LRVlQQUQwCQk4MgotI2RlZmluZSBTQ0FOQ09ERV9LRVlQQURQRVJJT0QJCTgzCi0jZGVmaW5lIFNDQU5DT0RFX0xFU1MJCQk4NgotI2RlZmluZSBTQ0FOQ09ERV9GMTEJCQk4NwotI2RlZmluZSBTQ0FOQ09ERV9GMTIJCQk4OAotI2RlZmluZSBTQ0FOQ09ERV9LRVlQQURFTlRFUgkJODkKLSNkZWZpbmUgU0NBTkNPREVfUklHSFRDT05UUk9MCQk5MAotI2RlZmluZSBTQ0FOQ09ERV9DT05UUk9MCQkxMDcKLSNkZWZpbmUgU0NBTkNPREVfS0VZUEFERElWSURFCQk5MQotI2RlZmluZSBTQ0FOQ09ERV9QUklOVFNDUkVFTgkJOTIKLSNkZWZpbmUgU0NBTkNPREVfUklHSFRBTFQJCTkzCi0jZGVmaW5lIFNDQU5DT0RFX0JSRUFLCQkJMTA0CS8qIEJld2FyZTogaXMgMTE5ICAgICAqLwotI2RlZmluZSBTQ0FOQ09ERV9CUkVBS19BTFRFUk5BVElWRQkxMDQJLyogb24gc29tZSBrZXlib2FyZHMhICovCi0jZGVmaW5lIFNDQU5DT0RFX0hPTUUJCQk5NAotI2RlZmluZSBTQ0FOQ09ERV9DVVJTT1JCTE9DS1VQCQk5NQkvKiBDdXJzb3Iga2V5IGJsb2NrICovCi0jZGVmaW5lIFNDQU5DT0RFX1BBR0VVUAkJCTk2Ci0jZGVmaW5lIFNDQU5DT0RFX0NVUlNPUkJMT0NLTEVGVAk5NwkvKiBDdXJzb3Iga2V5IGJsb2NrICovCi0jZGVmaW5lIFNDQU5DT0RFX0NVUlNPUkJMT0NLUklHSFQJOTgJLyogQ3Vyc29yIGtleSBibG9jayAqLwotI2RlZmluZSBTQ0FOQ09ERV9FTkQJCQk5OQotI2RlZmluZSBTQ0FOQ09ERV9DVVJTT1JCTE9DS0RPV04JMTAwCS8qIEN1cnNvciBrZXkgYmxvY2sgKi8KLSNkZWZpbmUgU0NBTkNPREVfUEFHRURPV04JCTEwMQotI2RlZmluZSBTQ0FOQ09ERV9JTlNFUlQJCQkxMDIKLSNkZWZpbmUgU0NBTkNPREVfUkVNT1ZFCQkJMTAzCi0jZGVmaW5lIFNDQU5DT0RFX1JJR0hUV0lOCQkxMDYKLSNkZWZpbmUgU0NBTkNPREVfTEVGVFdJTgkJMTA1CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vdmdsL1NETF92Z2xtb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjhlZGQyLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vdmdsL1NETF92Z2xtb3VzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3ZnbHZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3ZnbG1vdXNlX2MuaCIKLQotCi0vKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KLXN0cnVjdCBXTWN1cnNvciB7Ci0JaW50IHVudXNlZDsKLX07Ci0KLQotdm9pZCBWR0xfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotCXJldHVybjsKLX0KLQotV01jdXJzb3IgKlZHTF9DcmVhdGVXTUN1cnNvcihfVEhJUywKLQkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KQotewotCXJldHVybihOVUxMKTsKLX0KLQotaW50IFZHTF9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCi17Ci0JcmV0dXJuKDApOwotfQotCi12b2lkIFZHTF9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSkKLXsKLQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHgsIHkpOwotfQotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby92Z2wvU0RMX3ZnbG1vdXNlX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlMDEwYi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsbW91c2VfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfdmdsdmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBWR0xfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiBXTWN1cnNvciAqVkdMX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAotCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOwotZXh0ZXJuIGludCBWR0xfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiB2b2lkIFZHTF9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vdmdsL1NETF92Z2x2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby92Z2wvU0RMX3ZnbHZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjVlNTEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby92Z2wvU0RMX3ZnbHZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIGxpYnZnYSBiYXNlZCBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGVyci5oPgotI2luY2x1ZGUgPG9zcmVsZGF0ZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxzeXMvZmJpby5oPgotI2luY2x1ZGUgPHN5cy9jb25zaW8uaD4KLSNpbmNsdWRlIDxzeXMva2Jpby5oPgotI2luY2x1ZGUgPHZnbC5oPgotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX21vdXNlLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF92Z2x2aWRlby5oIgotI2luY2x1ZGUgIlNETF92Z2xldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF92Z2xtb3VzZV9jLmgiCi0KLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IFZHTF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKipWR0xfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqVkdMX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgVkdMX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAotCQkJICBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgdm9pZCBWR0xfVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgVkdMX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IFZHTF9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IFZHTF9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBWR0xfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBWR0xfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0vKiBNaXNjIGZ1bmN0aW9uICovCi1zdGF0aWMgVkdMTW9kZSAqKiBWR0xMaXN0TW9kZXMoaW50IGRlcHRoLCBpbnQgbWVtX21vZGVsKTsKLXN0YXRpYyB2b2lkIFZHTFdhaXRSZXRyYWNlKHZvaWQpOwotCi0vKiBWR0wgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBWR0xfQXZhaWxhYmxlKHZvaWQpCi17Ci0JLyoKLQkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHJvb3QgYW5kIHN0ZGluIGlzIGEKLQkgKiB2aXJ0dWFsIGNvbnNvbGUuIEFsc28gdHJ5IHRvIGVuc3VyZSB0aGF0Ci0JICogbW9kZXMgb3RoZXIgdGhhbiAzMjB4MjAwIGFyZSBhdmFpbGFibGUKLQkgKi8KLQlpbnQgY29uc29sZSwgaGlyZXNfYXZhaWxhYmxlLCBpOwotCVZHTE1vZGUgKiptb2RlczsKLQotCWNvbnNvbGUgPSBTVERJTl9GSUxFTk87Ci0JaWYgKCBjb25zb2xlID49IDAgKSB7Ci0JCXN0cnVjdCBzdGF0IHNiOwotCQlzdHJ1Y3QgdnRfbW9kZSBkdW1teTsKLQotCQlpZiAoIChmc3RhdChjb25zb2xlLCAmc2IpIDwgMCkgfHwKLQkJICAgICAoaW9jdGwoY29uc29sZSwgVlRfR0VUTU9ERSwgJmR1bW15KSA8IDApICkgewotCQkJY29uc29sZSA9IC0xOwotCQl9Ci0JfQotCWlmIChnZXRldWlkKCkgIT0gMCAmJiBjb25zb2xlID09IC0xKQotCQlyZXR1cm4gMDsKLQotCW1vZGVzID0gVkdMTGlzdE1vZGVzKDgsIFZfSU5GT19NTV9ESVJFQ1QgfCBWX0lORk9fTU1fUEFDS0VEKTsKLQloaXJlc19hdmFpbGFibGUgPSAwOwotCWZvciAoaSA9IDA7IG1vZGVzW2ldICE9IE5VTEw7IGkrKykgewotCQlpZiAoKG1vZGVzW2ldLT5Nb2RlSW5mby5Yc2l6ZSA+IDMyMCkgJiYKLQkJICAgIChtb2Rlc1tpXS0+TW9kZUluZm8uWXNpemUgPiAyMDApICYmCi0JCSAgICAoKG1vZGVzW2ldLT5Nb2RlSW5mby5UeXBlID09IFZJREJVRjgpIHx8Ci0JCSAgICAgKG1vZGVzW2ldLT5Nb2RlSW5mby5UeXBlID09IFZJREJVRjE2KSB8fAotCQkgICAgIChtb2Rlc1tpXS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUYzMikpKSB7Ci0JCQloaXJlc19hdmFpbGFibGUgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIGhpcmVzX2F2YWlsYWJsZTsKLX0KLQotc3RhdGljIHZvaWQgVkdMX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKLXsKLQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0JU0RMX2ZyZWUoZGV2aWNlKTsKLX0KLQotc3RhdGljIFNETF9WaWRlb0RldmljZSAqVkdMX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLQlpZiAoIGRldmljZSApIHsKLQkJU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOwotCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKLQkJCQkgIFNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQl9Ci0JaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCWlmICggZGV2aWNlICkgewotCQkJU0RMX2ZyZWUoZGV2aWNlKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0KLQkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JZGV2aWNlLT5WaWRlb0luaXQgPSBWR0xfVmlkZW9Jbml0OwotCWRldmljZS0+TGlzdE1vZGVzID0gVkdMX0xpc3RNb2RlczsKLQlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IFZHTF9TZXRWaWRlb01vZGU7Ci0JZGV2aWNlLT5TZXRDb2xvcnMgPSBWR0xfU2V0Q29sb3JzOwotCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOwotCWRldmljZS0+VmlkZW9RdWl0ID0gVkdMX1ZpZGVvUXVpdDsKLQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gVkdMX0FsbG9jSFdTdXJmYWNlOwotCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOwotCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOwotCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IFZHTF9Mb2NrSFdTdXJmYWNlOwotCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gVkdMX1VubG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBWR0xfRmxpcEhXU3VyZmFjZTsKLQlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBWR0xfRnJlZUhXU3VyZmFjZTsKLQlkZXZpY2UtPlNldEljb24gPSBOVUxMOwotCWRldmljZS0+U2V0Q2FwdGlvbiA9IE5VTEw7Ci0JZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOwotCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gVkdMX0ZyZWVXTUN1cnNvcjsKLQlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gVkdMX0NyZWF0ZVdNQ3Vyc29yOwotCWRldmljZS0+U2hvd1dNQ3Vyc29yID0gVkdMX1Nob3dXTUN1cnNvcjsKLQlkZXZpY2UtPldhcnBXTUN1cnNvciA9IFZHTF9XYXJwV01DdXJzb3I7Ci0JZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBWR0xfSW5pdE9TS2V5bWFwOwotCWRldmljZS0+UHVtcEV2ZW50cyA9IFZHTF9QdW1wRXZlbnRzOwotCi0JZGV2aWNlLT5mcmVlID0gVkdMX0RlbGV0ZURldmljZTsKLQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLVZpZGVvQm9vdFN0cmFwIFZHTF9ib290c3RyYXAgPSB7Ci0JInZnbCIsICJGcmVlQlNEIGxpYlZHTCIsCi0JVkdMX0F2YWlsYWJsZSwgVkdMX0NyZWF0ZURldmljZQotfTsKLQotc3RhdGljIGludCBWR0xfQWRkTW9kZShfVEhJUywgVkdMTW9kZSAqaW5tb2RlKQotewotCVNETF9SZWN0ICptb2RlOwotCi0JaW50IGksIGluZGV4OwotCWludCBuZXh0X21vZGU7Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbW9kZSAqLwotCWlmIChpbm1vZGUtPkRlcHRoIDwgOCkgeyAgLyogTm90IHN1cHBvcnRlZCAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JaW5kZXggPSAoKGlubW9kZS0+RGVwdGggKyA3KSAvIDgpIC0gMTsKLQlmb3IgKGk9MDsgaTxTRExfbnVtbW9kZXNbaW5kZXhdOyArK2kpIHsKLQkJbW9kZSA9IFNETF9tb2RlbGlzdFtpbmRleF1baV07Ci0JCWlmICgobW9kZS0+dyA9PSBpbm1vZGUtPk1vZGVJbmZvLlhzaXplKSAmJgotCQkgICAgKG1vZGUtPmggPT0gaW5tb2RlLT5Nb2RlSW5mby5Zc2l6ZSkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIG5ldyB2aWRlbyBtb2RlIHJlY3RhbmdsZSAqLwotCW1vZGUgPSAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZiAqbW9kZSk7Ci0JaWYgKG1vZGUgPT0gTlVMTCkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltb2RlLT54ID0gMDsKLQltb2RlLT55ID0gMDsKLQltb2RlLT53ID0gaW5tb2RlLT5Nb2RlSW5mby5Yc2l6ZTsKLQltb2RlLT5oID0gaW5tb2RlLT5Nb2RlSW5mby5Zc2l6ZTsKLQotCS8qIEFsbG9jYXRlIHRoZSBuZXcgbGlzdCBvZiBtb2RlcywgYW5kIGZpbGwgaW4gdGhlIG5ldyBtb2RlICovCi0JbmV4dF9tb2RlID0gU0RMX251bW1vZGVzW2luZGV4XTsKLQlTRExfbW9kZWxpc3RbaW5kZXhdID0gKFNETF9SZWN0ICoqKQotCQlTRExfcmVhbGxvYyhTRExfbW9kZWxpc3RbaW5kZXhdLCAoMStuZXh0X21vZGUrMSkqc2l6ZW9mKFNETF9SZWN0ICopKTsKLQlpZiAoU0RMX21vZGVsaXN0W2luZGV4XSA9PSBOVUxMKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlTRExfbnVtbW9kZXNbaW5kZXhdID0gMDsKLQkJU0RMX2ZyZWUobW9kZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JU0RMX21vZGVsaXN0W2luZGV4XVtuZXh0X21vZGVdID0gbW9kZTsKLQlTRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZSsxXSA9IE5VTEw7Ci0JU0RMX251bW1vZGVzW2luZGV4XSsrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIFZHTF9VcGRhdGVWaWRlb0luZm8oX1RISVMpCi17Ci0JdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAwOwotCXRoaXMtPmluZm8uaHdfYXZhaWxhYmxlID0gMTsKLQl0aGlzLT5pbmZvLnZpZGVvX21lbSA9IDA7Ci0JaWYgKFZHTEN1ck1vZGUgPT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCWlmIChWR0xDdXJNb2RlLT5Nb2RlSW5mby5QaXhlbEJ5dGVzID4gMCkgewotCQl0aGlzLT5pbmZvLnZpZGVvX21lbSA9IFZHTEN1ck1vZGUtPk1vZGVJbmZvLlBpeGVsQnl0ZXMgKgotCQkJCSAgICAgICBWR0xDdXJNb2RlLT5Nb2RlSW5mby5Yc2l6ZSAqCi0JCQkJICAgICAgIFZHTEN1ck1vZGUtPk1vZGVJbmZvLllzaXplOwotCX0KLX0KLQotaW50IFZHTF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLQlpbnQgaTsKLQlpbnQgdG90YWxfbW9kZXM7Ci0JVkdMTW9kZSAqKm1vZGVzOwotCi0JLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgewotCQlTRExfbnVtbW9kZXNbaV0gPSAwOwotCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOwotCX0KLQotCS8qIEVuYWJsZSBtb3VzZSBhbmQga2V5Ym9hcmQgc3VwcG9ydCAqLwotCWlmIChTRExfZ2V0ZW52KCJTRExfTk9fUkFXS0JEIikgPT0gTlVMTCkgewotCQlpZiAoVkdMS2V5Ym9hcmRJbml0KFZHTF9DT0RFS0VZUykgIT0gMCkgewotCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBrZXlib2FyZCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfSBlbHNlIHsKLQkJd2FybngoIlJlcXVpZXN0IHRvIHB1dCBrZXlib2FyZCBpbnRvIGEgcmF3IG1vZGUgaWdub3JlZCIpOwotCX0KLQlpZiAoVkdMX2luaXRrZXltYXBzKFNURElOX0ZJTEVOTykgIT0gMCkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBpbml0aWFsaXplIGtleW1hcCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChWR0xfaW5pdG1vdXNlKFNURElOX0ZJTEVOTykgIT0gMCkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBpbml0aWFsaXplIG1vdXNlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUgKi8KLQlpZiAoVkdMQ3VyTW9kZSAhPSBOVUxMKSB7Ci0JCXRoaXMtPmluZm8uY3VycmVudF93ID0gVkdMQ3VyTW9kZS0+TW9kZUluZm8uWHNpemU7Ci0JCXRoaXMtPmluZm8uY3VycmVudF9oID0gVkdMQ3VyTW9kZS0+TW9kZUluZm8uWXNpemU7Ci0JfQotCi0JLyogRGV0ZXJtaW5lIHRoZSBzY3JlZW4gZGVwdGggKi8KLQlpZiAoVkdMQ3VyTW9kZSAhPSBOVUxMKQotCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBWR0xDdXJNb2RlLT5EZXB0aDsKLQllbHNlCi0JCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IDE2OwkvKiBHb29kIGRlZmF1bHQgKi8KLQotCS8qIFF1ZXJ5IGZvciB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdmlkZW8gbW9kZXMgKi8KLQl0b3RhbF9tb2RlcyA9IDA7Ci0JbW9kZXMgPSBWR0xMaXN0TW9kZXMoLTEsIFZfSU5GT19NTV9ESVJFQ1QgfCBWX0lORk9fTU1fUEFDS0VEKTsKLQlmb3IgKGkgPSAwOyBtb2Rlc1tpXSAhPSBOVUxMOyBpKyspIHsKLQkJaWYgKChtb2Rlc1tpXS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUY4KSB8fAotCQkgICAgKG1vZGVzW2ldLT5Nb2RlSW5mby5UeXBlID09IFZJREJVRjE2KSB8fAotCQkgICAgKG1vZGVzW2ldLT5Nb2RlSW5mby5UeXBlID09IFZJREJVRjMyKSkgewotCQkJVkdMX0FkZE1vZGUodGhpcywgbW9kZXNbaV0pOwotCQkJdG90YWxfbW9kZXMrKzsKLQkJfQotCX0KLQlpZiAodG90YWxfbW9kZXMgPT0gMCkgewotCQlTRExfU2V0RXJyb3IoIk5vIGxpbmVhciB2aWRlbyBtb2RlcyBhdmFpbGFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIEZpbGwgaW4gb3VyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBjYXBhYmlsaXRpZXMgKi8KLQlWR0xfVXBkYXRlVmlkZW9JbmZvKHRoaXMpOwotCi0JLyogQ3JlYXRlIHRoZSBoYXJkd2FyZSBzdXJmYWNlIGxvY2sgbXV0ZXggKi8KLQlod19sb2NrID0gU0RMX0NyZWF0ZU11dGV4KCk7Ci0JaWYgKGh3X2xvY2sgPT0gTlVMTCkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgbG9jayBtdXRleCIpOwotCQlWR0xfVmlkZW9RdWl0KHRoaXMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogV2UncmUgZG9uZSEgKi8KLQlyZXR1cm4gMDsKLX0KLQotU0RMX1JlY3QgKipWR0xfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQotewotCXJldHVybiBTRExfbW9kZWxpc3RbKChmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xXTsKLX0KLQotLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KLXN0YXRpYyB2b2lkIFZHTF9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLXN0YXRpYyB2b2lkIFZHTF9CYW5rZWRVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotU0RMX1N1cmZhY2UgKlZHTF9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAotCQkJICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JaW50IG1vZGVfZm91bmQ7Ci0JaW50IGk7Ci0JVkdMTW9kZSAqKm1vZGVzOwotCi0JbW9kZXMgPSBWR0xMaXN0TW9kZXMoYnBwLCBWX0lORk9fTU1fRElSRUNUIHwgVl9JTkZPX01NX1BBQ0tFRCk7Ci0JbW9kZV9mb3VuZCA9IDA7Ci0JZm9yIChpID0gMDsgbW9kZXNbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JCWlmICgobW9kZXNbaV0tPk1vZGVJbmZvLlhzaXplID09IHdpZHRoKSAmJgotCQkgICAgKG1vZGVzW2ldLT5Nb2RlSW5mby5Zc2l6ZSA9PSBoZWlnaHQpICYmCi0JCSAgICAoKG1vZGVzW2ldLT5Nb2RlSW5mby5UeXBlID09IFZJREJVRjgpIHx8Ci0JCSAgICAgKG1vZGVzW2ldLT5Nb2RlSW5mby5UeXBlID09IFZJREJVRjE2KSB8fAotCQkgICAgIChtb2Rlc1tpXS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUYzMikpKSB7Ci0JCQltb2RlX2ZvdW5kID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChtb2RlX2ZvdW5kID09IDApIHsKLQkJU0RMX1NldEVycm9yKCJObyBtYXRjaGluZyB2aWRlbyBtb2RlIGZvdW5kIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIFNodXRkb3duIHByZXZpb3VzIHZpZGVvbW9kZSAoaWYgYW55KSAqLwotCWlmIChWR0xDdXJNb2RlICE9IE5VTEwpCi0JCVZHTEVuZCgpOwotCi0JLyogVHJ5IHRvIHNldCB0aGUgcmVxdWVzdGVkIGxpbmVhciB2aWRlbyBtb2RlICovCi0JaWYgKFZHTEluaXQobW9kZXNbaV0tPk1vZGVJZCkgIT0gMCkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBzd2l0Y2ggdG8gcmVxdWVzdGVkIG1vZGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JVkdMQ3VyTW9kZSA9IFNETF9yZWFsbG9jKFZHTEN1ck1vZGUsIHNpemVvZihWR0xNb2RlKSk7Ci0JVkdMQ3VyTW9kZS0+TW9kZUluZm8gPSAqVkdMRGlzcGxheTsKLQlWR0xDdXJNb2RlLT5EZXB0aCA9IG1vZGVzW2ldLT5EZXB0aDsKLQlWR0xDdXJNb2RlLT5Nb2RlSWQgPSBtb2Rlc1tpXS0+TW9kZUlkOwotCVZHTEN1ck1vZGUtPlJtYXNrID0gbW9kZXNbaV0tPlJtYXNrOwotCVZHTEN1ck1vZGUtPkdtYXNrID0gbW9kZXNbaV0tPkdtYXNrOwotCVZHTEN1ck1vZGUtPkJtYXNrID0gbW9kZXNbaV0tPkJtYXNrOwotCi0JLyogV29ya2Fyb3VuZCBhIGJ1ZyBpbiBsaWJ2Z2wgKi8KLQlpZiAoVkdMQ3VyTW9kZS0+TW9kZUluZm8uUGl4ZWxCeXRlcyA9PSAwKQotCQkoVkdMQ3VyTW9kZS0+TW9kZUluZm8uUGl4ZWxCeXRlcyA9IDEpOwotCi0JY3VycmVudC0+dyA9IFZHTEN1ck1vZGUtPk1vZGVJbmZvLlhzaXplOwotCWN1cnJlbnQtPmggPSBWR0xDdXJNb2RlLT5Nb2RlSW5mby5Zc2l6ZTsKLQljdXJyZW50LT5waXhlbHMgPSBWR0xDdXJNb2RlLT5Nb2RlSW5mby5CaXRtYXA7Ci0JY3VycmVudC0+cGl0Y2ggPSBWR0xDdXJNb2RlLT5Nb2RlSW5mby5Yc2l6ZSAqCi0JCQkgVkdMQ3VyTW9kZS0+TW9kZUluZm8uUGl4ZWxCeXRlczsKLQljdXJyZW50LT5mbGFncyA9IChTRExfRlVMTFNDUkVFTiB8IFNETF9IV1NVUkZBQ0UpOwotCi0JLyogQ2hlY2sgaWYgd2UgYXJlIGluIGEgcHNldWRvLWNvbG9yIG1vZGUgKi8KLQlpZiAoVkdMQ3VyTW9kZS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUY4KQotCQljdXJyZW50LT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOwotCi0JLyogQ2hlY2sgaWYgd2UgY2FuIGRvIGRvdWJsZWJ1ZmZlcmluZyAqLwotCWlmIChmbGFncyAmIFNETF9ET1VCTEVCVUYpIHsKLQkJaWYgKFZHTEN1ck1vZGUtPk1vZGVJbmZvLlhzaXplICogMiA8PQotCQkgICAgVkdMQ3VyTW9kZS0+TW9kZUluZm8uVllzaXplKSB7Ci0JCQljdXJyZW50LT5mbGFncyB8PSBTRExfRE9VQkxFQlVGOwotCQkJZmxpcF9wYWdlID0gMDsKLQkJCWZsaXBfYWRkcmVzc1swXSA9IChieXRlICopY3VycmVudC0+cGl4ZWxzOwotCQkJZmxpcF9hZGRyZXNzWzFdID0gKGJ5dGUgKiljdXJyZW50LT5waXhlbHMgKwotCQkJCQkgIGN1cnJlbnQtPmggKiBjdXJyZW50LT5waXRjaDsKLQkJCVZHTF9GbGlwSFdTdXJmYWNlKHRoaXMsIGN1cnJlbnQpOwotCQl9Ci0JfQotCi0JaWYgKCEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgbW9kZXNbaV0tPkRlcHRoLCBWR0xDdXJNb2RlLT5SbWFzaywKLQkJCQlWR0xDdXJNb2RlLT5HbWFzaywgVkdMQ3VyTW9kZS0+Qm1hc2ssIDApKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIFVwZGF0ZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaW5mbyAqLwotCVZHTF9VcGRhdGVWaWRlb0luZm8odGhpcyk7Ci0KLQkvKiBTZXQgdGhlIGJsaXQgZnVuY3Rpb24gKi8KLQl0aGlzLT5VcGRhdGVSZWN0cyA9IFZHTF9EaXJlY3RVcGRhdGU7Ci0KLQkvKiBXZSdyZSBkb25lICovCi0JcmV0dXJuIGN1cnJlbnQ7Ci19Ci0KLS8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCi1zdGF0aWMgaW50IFZHTF9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuIC0xOwotfQotc3RhdGljIHZvaWQgVkdMX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotLyogV2UgbmVlZCB0byB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlIG9uIHBhZ2UgZmxpcHBlZCBkaXNwbGF5cyAqLwotc3RhdGljIGludCBWR0xfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYgKHN1cmZhY2UgPT0gU0RMX1ZpZGVvU3VyZmFjZSkgewotCQlTRExfbXV0ZXhQKGh3X2xvY2spOwotCX0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyB2b2lkIFZHTF9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWlmIChzdXJmYWNlID09IFNETF9WaWRlb1N1cmZhY2UpIHsKLQkJU0RMX211dGV4Vihod19sb2NrKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgVkdMX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotLy8JVkdMV2FpdFJldHJhY2UoKTsKLQlpZiAoVkdMUGFuU2NyZWVuKFZHTERpc3BsYXksIDAsIGZsaXBfcGFnZSAqIHN1cmZhY2UtPmgpIDwgMCkgewotCQlTRExfU2V0RXJyb3IoIlZHTFBhblNyZWVuKCkgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLQlmbGlwX3BhZ2UgPSAhZmxpcF9wYWdlOwotCXN1cmZhY2UtPnBpeGVscyA9IGZsaXBfYWRkcmVzc1tmbGlwX3BhZ2VdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIFZHTF9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgVkdMX0JhbmtlZFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0JcmV0dXJuOwotfQotCi1pbnQgVkdMX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKLXsKLSAgICAgICAgaW50IGk7Ci0KLQlmb3IoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspIHsKLQkgICAgICAgIFZHTFNldFBhbGV0dGVJbmRleChmaXJzdGNvbG9yICsgaSwKLQkJCSAgICAgICBjb2xvcnNbaV0ucj4+MiwKLQkJCSAgICAgICBjb2xvcnNbaV0uZz4+MiwKLQkJCSAgICAgICBjb2xvcnNbaV0uYj4+Mik7Ci0JfQotCXJldHVybiAxOwotfQotCi0vKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKLSAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KLSovCi12b2lkIFZHTF9WaWRlb1F1aXQoX1RISVMpCi17Ci0JaW50IGksIGo7Ci0KLQkvKiBSZXR1cm4gdGhlIGtleWJvYXJkIHRvIHRoZSBub3JtYWwgc3RhdGUgKi8KLQlWR0xLZXlib2FyZEVuZCgpOwotCi0JLyogUmVzZXQgdGhlIGNvbnNvbGUgdmlkZW8gbW9kZSBpZiB3ZSBhY3R1YWxseSBpbml0aWFsaXNlZCBvbmUgKi8KLQlpZiAoVkdMQ3VyTW9kZSAhPSBOVUxMKSB7Ci0JCVZHTEVuZCgpOwotCQlTRExfZnJlZShWR0xDdXJNb2RlKTsKLQkJVkdMQ3VyTW9kZSA9IE5VTEw7Ci0JfQotCi0JLyogQ2xlYXIgdGhlIGxvY2sgbXV0ZXggKi8KLQlpZiAoaHdfbG9jayAhPSBOVUxMKSB7Ci0JCVNETF9EZXN0cm95TXV0ZXgoaHdfbG9jayk7Ci0JCWh3X2xvY2sgPSBOVUxMOwotCX0KLQotCS8qIEZyZWUgdmlkZW8gbW9kZSBsaXN0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fTU9ERUxJU1RTOyBpKyspIHsKLQkJaWYgKFNETF9tb2RlbGlzdFtpXSAhPSBOVUxMKSB7Ci0JCQlmb3IgKGogPSAwOyBTRExfbW9kZWxpc3RbaV1bal0gIT0gTlVMTDsgKytqKSB7Ci0JCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldW2pdKTsKLQkJCX0KLQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXSk7Ci0JCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOwotCQl9Ci0JfQotCi0JaWYgKCB0aGlzLT5zY3JlZW4gJiYgKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSApIHsKLQkvKiBEaXJlY3Qgc2NyZWVuIGFjY2Vzcywgbm90IGEgbWVtb3J5IGJ1ZmZlciAqLwotCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IE5VTEw7Ci0JfQotfQotCi0jZGVmaW5lIFZHTF9SRURfSU5ERVgJMAotI2RlZmluZSBWR0xfR1JFRU5fSU5ERVgJMQotI2RlZmluZSBWR0xfQkxVRV9JTkRFWAkyCi0KLXN0YXRpYyBWR0xNb2RlICoqCi1WR0xMaXN0TW9kZXMoaW50IGRlcHRoLCBpbnQgbWVtX21vZGVsKQotewotICBzdGF0aWMgVkdMTW9kZSAqKm1vZGVzID0gTlVMTDsKLQotICBWR0xCaXRtYXAgKnZtaW5mb3A7Ci0gIFZHTE1vZGUgKiptb2Rlc3AsICptb2Rlc2NwOwotICB2aWRlb19pbmZvX3QgbWluZm87Ci0gIGludCBhZHB0eXBlLCBpLCBtb2RlbnVtOwotCi0gIGlmIChtb2RlcyA9PSBOVUxMKSB7Ci0gICAgbW9kZXMgPSBTRExfbWFsbG9jKHNpemVvZihWR0xNb2RlICopICogTV9WRVNBX01PREVfTUFYKTsKLSAgICBiemVybyhtb2Rlcywgc2l6ZW9mKFZHTE1vZGUgKikgKiBNX1ZFU0FfTU9ERV9NQVgpOwotICB9Ci0gIG1vZGVzcCA9IG1vZGVzOwotCi0gIGZvciAobW9kZW51bSA9IDA7IG1vZGVudW0gPCBNX1ZFU0FfTU9ERV9NQVg7IG1vZGVudW0rKykgewotICAgIG1pbmZvLnZpX21vZGUgPSBtb2RlbnVtOwotICAgIGlmIChpb2N0bCgwLCBDT05TX01PREVJTkZPLCAmbWluZm8pIHx8IGlvY3RsKDAsIENPTlNfQ1VSUkVOVCwgJmFkcHR5cGUpKQotICAgICAgY29udGludWU7Ci0gICAgaWYgKG1pbmZvLnZpX21vZGUgIT0gbW9kZW51bSkKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmICgobWluZm8udmlfZmxhZ3MgJiBWX0lORk9fR1JBUEhJQ1MpID09IDApCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAoKG1lbV9tb2RlbCAhPSAtMSkgJiYgKChtaW5mby52aV9tZW1fbW9kZWwgJiBtZW1fbW9kZWwpID09IDApKQotICAgICAgY29udGludWU7Ci0gICAgaWYgKChkZXB0aCA+IDEpICYmIChtaW5mby52aV9kZXB0aCAhPSBkZXB0aCkpCi0gICAgICBjb250aW51ZTsKLQotICAgIC8qIHJlYWxsb2NmIGNhbiBmYWlsICovCi0gICAgaWYgKCgqbW9kZXNwID0gcmVhbGxvY2YoKm1vZGVzcCwgc2l6ZW9mKFZHTE1vZGUpKSkgPT0gTlVMTCkKLSAgICAgIHJldHVybiBOVUxMOwotICAgIG1vZGVzY3AgPSAqbW9kZXNwOwotCi0gICAgdm1pbmZvcCA9ICYobW9kZXNjcC0+TW9kZUluZm8pOwotICAgIGJ6ZXJvKHZtaW5mb3AsIHNpemVvZihWR0xCaXRtYXApKTsKLQotICAgIHZtaW5mb3AtPlR5cGUgPSBOT0JVRjsKLQotICAgIHZtaW5mb3AtPlBpeGVsQnl0ZXMgPSAxOwkvKiBHb29kIGRlZmF1bHQgdmFsdWUgKi8KLSAgICBzd2l0Y2ggKG1pbmZvLnZpX21lbV9tb2RlbCkgewotICAgIGNhc2UgVl9JTkZPX01NX1BMQU5BUjoKLSAgICAgIC8qIHdlIGNhbiBoYW5kbGUgRUdBL1ZHQSBwbGFuYXIgbW9kZXMgb25seSAqLwotICAgICAgaWYgKCEobWluZm8udmlfZGVwdGggIT0gNCB8fCBtaW5mby52aV9wbGFuZXMgIT0gNAotCSAgICB8fCAoYWRwdHlwZSAhPSBLRF9FR0EgJiYgYWRwdHlwZSAhPSBLRF9WR0EpKSkKLQl2bWluZm9wLT5UeXBlID0gVklEQlVGNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVl9JTkZPX01NX1BBQ0tFRDoKLSAgICAgIC8qIHdlIGNhbiBkbyBvbmx5IDI1NiBjb2xvciBwYWNrZWQgbW9kZXMgKi8KLSAgICAgIGlmIChtaW5mby52aV9kZXB0aCA9PSA4KQotCXZtaW5mb3AtPlR5cGUgPSBWSURCVUY4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWX0lORk9fTU1fVkdBWDoKLSAgICAgIHZtaW5mb3AtPlR5cGUgPSBWSURCVUY4WDsKLSAgICAgIGJyZWFrOwotI2lmIGRlZmluZWQoX19GUkVFQlNEX18pICYmIChkZWZpbmVkKF9fRHJhZ29uRmx5X18pIHx8IF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDAwMCkKLSAgICBjYXNlIFZfSU5GT19NTV9ESVJFQ1Q6Ci0gICAgICB2bWluZm9wLT5QaXhlbEJ5dGVzID0gbWluZm8udmlfcGl4ZWxfc2l6ZTsKLSAgICAgIHN3aXRjaCAodm1pbmZvcC0+UGl4ZWxCeXRlcykgewotICAgICAgY2FzZSAyOgotCXZtaW5mb3AtPlR5cGUgPSBWSURCVUYxNjsKLQlicmVhazsKLSNpZiBub3R5ZXQKLSAgICAgIGNhc2UgMzoKLQl2bWluZm9wLT5UeXBlID0gVklEQlVGMjQ7Ci0JYnJlYWs7Ci0jZW5kaWYKLSAgICAgIGNhc2UgNDoKLQl2bWluZm9wLT5UeXBlID0gVklEQlVGMzI7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAodm1pbmZvcC0+VHlwZSA9PSBOT0JVRikKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgc3dpdGNoICh2bWluZm9wLT5UeXBlKSB7Ci0gICAgY2FzZSBWSURCVUYxNjoKLSAgICBjYXNlIFZJREJVRjMyOgotICAgICAgbW9kZXNjcC0+Um1hc2sgPSAoKDEgPDwgbWluZm8udmlfcGl4ZWxfZnNpemVzW1ZHTF9SRURfSU5ERVhdKSAtIDEpIDw8Ci0JCSAgICAgICBtaW5mby52aV9waXhlbF9maWVsZHNbVkdMX1JFRF9JTkRFWF07Ci0gICAgICBtb2Rlc2NwLT5HbWFzayA9ICgoMSA8PCBtaW5mby52aV9waXhlbF9mc2l6ZXNbVkdMX0dSRUVOX0lOREVYXSkgLSAxKSA8PAotCQkgICAgICAgbWluZm8udmlfcGl4ZWxfZmllbGRzW1ZHTF9HUkVFTl9JTkRFWF07Ci0gICAgICBtb2Rlc2NwLT5CbWFzayA9ICgoMSA8PCBtaW5mby52aV9waXhlbF9mc2l6ZXNbVkdMX0JMVUVfSU5ERVhdKSAtIDEpIDw8Ci0JCSAgICAgICBtaW5mby52aV9waXhlbF9maWVsZHNbVkdMX0JMVUVfSU5ERVhdOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgdm1pbmZvcC0+WHNpemUgPSBtaW5mby52aV93aWR0aDsKLSAgICB2bWluZm9wLT5Zc2l6ZSA9IG1pbmZvLnZpX2hlaWdodDsKLSAgICBtb2Rlc2NwLT5EZXB0aCA9IG1pbmZvLnZpX2RlcHRoOwotCi0gICAgLyogWFhYICovCi0gICAgaWYgKG1pbmZvLnZpX21vZGUgPj0gTV9WRVNBX0JBU0UpCi0gICAgICBtb2Rlc2NwLT5Nb2RlSWQgPSBfSU8oJ1YnLCBtaW5mby52aV9tb2RlIC0gTV9WRVNBX0JBU0UpOwotICAgIGVsc2UKLSAgICAgIG1vZGVzY3AtPk1vZGVJZCA9IF9JTygnUycsIG1pbmZvLnZpX21vZGUpOwotCi0gICAgLyogU29ydCBsaXN0ICovCi0gICAgZm9yIChpID0gMDsgbW9kZXMgKyBpIDwgbW9kZXNwIDsgaSsrKSB7Ci0gICAgICBpZiAobW9kZXNbaV0tPk1vZGVJbmZvLlhzaXplICogbW9kZXNbaV0tPk1vZGVJbmZvLllzaXplID4KLQkgIHZtaW5mb3AtPlhzaXplICogbW9kZXNbaV0tPk1vZGVJbmZvLllzaXplKQotCWNvbnRpbnVlOwotICAgICAgaWYgKChtb2Rlc1tpXS0+TW9kZUluZm8uWHNpemUgKiBtb2Rlc1tpXS0+TW9kZUluZm8uWXNpemUgPT0KLQkgICB2bWluZm9wLT5Yc2l6ZSAqIHZtaW5mb3AtPllzaXplKSAmJgotCSAgKG1vZGVzW2ldLT5EZXB0aCA+PSBtb2Rlc2NwLT5EZXB0aCkpCi0JY29udGludWU7Ci0gICAgICAqbW9kZXNwID0gbW9kZXNbaV07Ci0gICAgICBtb2Rlc1tpXSA9IG1vZGVzY3A7Ci0gICAgICBtb2Rlc2NwID0gKm1vZGVzcDsKLSAgICAgIHZtaW5mb3AgPSAmKG1vZGVzY3AtPk1vZGVJbmZvKTsKLSAgICB9Ci0KLSAgICBtb2Rlc3ArKzsKLSAgfQotCi0gIGlmICgqbW9kZXNwICE9IE5VTEwpIHsKLSAgICBTRExfZnJlZSgqbW9kZXNwKTsKLSAgICAqbW9kZXNwID0gTlVMTDsKLSAgfQotCi0gIHJldHVybiBtb2RlczsKLX0KLQotc3RhdGljIHZvaWQKLVZHTFdhaXRSZXRyYWNlKHZvaWQpCi17Ci0gIHdoaWxlICghKGluYigweDNEQSkgJiA4KSk7Ci0gIHdoaWxlIChpbmIoMHgzREEpICYgOCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vdmdsL1NETF92Z2x2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby92Z2wvU0RMX3ZnbHZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTM4MDMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby92Z2wvU0RMX3ZnbHZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX3ZnbHZpZGVvX2gKLSNkZWZpbmUgX1NETF92Z2x2aWRlb19oCi0KLSNpbmNsdWRlIDxzeXMvZmJpby5oPgotI2luY2x1ZGUgPHN5cy9jb25zaW8uaD4KLSNpbmNsdWRlIDx2Z2wuaD4KLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIlNETF9tdXRleC5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgTW9kZUlkOwotCWludCBEZXB0aDsKLQlpbnQgUm1hc2s7Ci0JaW50IEdtYXNrOwotCWludCBCbWFzazsKLQlWR0xCaXRtYXAgTW9kZUluZm87Ci19IFZHTE1vZGU7Ci0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotI2RlZmluZSBOVU1fTU9ERUxJU1RTCTQJCS8qIDgsIDE2LCAyNCwgYW5kIDMyIGJpdHMtcGVyLXBpeGVsICovCi0JaW50IFNETF9udW1tb2Rlc1tOVU1fTU9ERUxJU1RTXTsKLQlTRExfUmVjdCAqKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXTsKLQlTRExfbXV0ZXggKmh3X2xvY2s7Ci0JVkdMTW9kZSAqVkdMQ3VyTW9kZTsKLQlpbnQgZmxpcF9wYWdlOwotCWJ5dGUgKmZsaXBfYWRkcmVzc1syXTsKLX07Ci0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgU0RMX251bW1vZGVzCSh0aGlzLT5oaWRkZW4tPlNETF9udW1tb2RlcykKLSNkZWZpbmUgU0RMX21vZGVsaXN0CSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKLSNkZWZpbmUgaHdfbG9jawkJKHRoaXMtPmhpZGRlbi0+aHdfbG9jaykKLSNkZWZpbmUgVkdMQ3VyTW9kZQkodGhpcy0+aGlkZGVuLT5WR0xDdXJNb2RlKQotI2RlZmluZSBmbGlwX3BhZ2UJKHRoaXMtPmhpZGRlbi0+ZmxpcF9wYWdlKQotI2RlZmluZSBmbGlwX2FkZHJlc3MJKHRoaXMtPmhpZGRlbi0+ZmxpcF9hZGRyZXNzKQotCi0jZW5kaWYgLyogX1NETF92Z2x2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfbG93dmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9sb3d2aWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmVhMTQ1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9sb3d2aWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaWZuZGVmIF9TRExfbG93dmlkZW9faAotI2RlZmluZSBfU0RMX2xvd3ZpZGVvX2gKLQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaWZuZGVmIFNldENsYXNzTG9uZ1B0cgotI2RlZmluZSBTZXRDbGFzc0xvbmdQdHIJU2V0Q2xhc3NMb25nCi0jZW5kaWYKLSNpZm5kZWYgR2V0V2luZG93TG9uZ1B0cgotI2RlZmluZSBHZXRXaW5kb3dMb25nUHRyCUdldFdpbmRvd0xvbmcKLSNlbmRpZgotI2lmbmRlZiBTZXRXaW5kb3dMb25nUHRyCi0jZGVmaW5lIFNldFdpbmRvd0xvbmdQdHIJU2V0V2luZG93TG9uZwotI2VuZGlmCi0jaWZuZGVmIEdXTFBfV05EUFJPQwotI2RlZmluZSBHV0xQX1dORFBST0MJR1dMX1dORFBST0MKLSNlbmRpZgotI2lmbmRlZiBHV0xQX0hJTlNUQU5DRQotI2RlZmluZSBHV0xQX0hJTlNUQU5DRSBHV0xfSElOU1RBTkNFCi0jZW5kaWYKLSNpZm5kZWYgR0NMUF9ISUNPTgotI2RlZmluZSBHQ0xQX0hJQ09OIEdDTF9ISUNPTgotI2VuZGlmCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCi0jZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcwotCi0jZGVmaW5lIFdJTkRJQl9GVUxMU0NSRUVOKCkJCQkJCQlcCi0oCQkJCQkJCQkJXAotCVNETF9WaWRlb1N1cmZhY2UgJiYJCQkJCQlcCi0JKChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTikgJiYgXAotCSgoKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCAgICkgPT0gU0RMX09QRU5HTCAgICApIHx8IFwKLQkoKFNETF9zdHJjbXAodGhpcy0+bmFtZSwgIndpbmRpYiIpID09IDApIHx8IFwKLQkgKFNETF9zdHJjbXAodGhpcy0+bmFtZSwgImdhcGkiKSA9PSAwKSkpIFwKLSkKLSNkZWZpbmUgRERSQVdfRlVMTFNDUkVFTigpIAkJCQkJCVwKLSgJCQkJCQkJCQlcCi0JU0RMX1ZpZGVvU3VyZmFjZSAmJgkJCQkJCVwKLQkoKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOKSAmJiBcCi0JKChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9PUEVOR0wgICAgKSAhPSBTRExfT1BFTkdMICAgICkgJiYgXAotCShTRExfc3RyY21wKHRoaXMtPm5hbWUsICJkaXJlY3R4IikgPT0gMCkJCQkJXAotKQotCi0jZGVmaW5lIERJTlBVVF9GVUxMU0NSRUVOKCkJRERSQVdfRlVMTFNDUkVFTigpCi0KLS8qIFRoZSBtYWluIHdpbmRvdyAtLSBhbmQgYSBmdW5jdGlvbiB0byBzZXQgaXQgZm9yIHRoZSBhdWRpbyAqLwotI2lmZGVmIF9XSU4zMl9XQ0UKLWV4dGVybiBMUFdTVFIgU0RMX0FwcG5hbWU7Ci0jZWxzZQotZXh0ZXJuIExQU1RSIFNETF9BcHBuYW1lOwotI2VuZGlmCi1leHRlcm4gSElOU1RBTkNFIFNETF9JbnN0YW5jZTsKLWV4dGVybiBIV05EIFNETF9XaW5kb3c7Ci1leHRlcm4gQk9PTCBTRExfd2luZG93aWQ7Ci0KLS8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIHRvIG90aGVyIHBhcnRzIG9mIHRoZSBuYXRpdmUgdmlkZW8KLSAgIHN1YnN5c3RlbSAoU0RMX3N5c2V2ZW50cy5jKQotKi8KLWV4dGVybiB2b2lkIFdJTl9GbHVzaE1lc3NhZ2VRdWV1ZSgpOwotCi0vKiBDYWxsZWQgYnkgd2luZG93cyBtZXNzYWdlIGxvb3Agd2hlbiBhcHBsaWNhdGlvbiBpcyBhY3RpdmF0ZWQgKi8KLWV4dGVybiB2b2lkICgqV0lOX0FjdGl2YXRlKShfVEhJUywgQk9PTCBhY3RpdmUsIEJPT0wgbWluaW1pemVkKTsKLQotLyogQ2FsbGVkIGJ5IHdpbmRvd3MgbWVzc2FnZSBsb29wIHdoZW4gc3lzdGVtIHBhbGV0dGUgaXMgYXZhaWxhYmxlICovCi1leHRlcm4gdm9pZCAoKldJTl9SZWFsaXplUGFsZXR0ZSkoX1RISVMpOwotCi0vKiBDYWxsZWQgYnkgd2luZG93cyBtZXNzYWdlIGxvb3Agd2hlbiB0aGUgc3lzdGVtIHBhbGV0dGUgY2hhbmdlcyAqLwotZXh0ZXJuIHZvaWQgKCpXSU5fUGFsZXR0ZUNoYW5nZWQpKF9USElTLCBIV05EIHdpbmRvdyk7Ci0KLS8qIENhbGxlZCBieSB3aW5kb3dzIG1lc3NhZ2UgbG9vcCB3aGVuIGEgcG9ydGlvbiBvZiB0aGUgc2NyZWVuIG5lZWRzIHVwZGF0ZSAqLwotZXh0ZXJuIHZvaWQgKCpXSU5fV2luUEFJTlQpKF9USElTLCBIREMgaGRjKTsKLQotLyogQ2FsbGVkIGJ5IHdpbmRvd3MgbWVzc2FnZSBsb29wIHdoZW4gdGhlIG1lc3NhZ2UgaXNuJ3QgaGFuZGxlZCAqLwotZXh0ZXJuIExPTkcgKCpIYW5kbGVNZXNzYWdlKShfVEhJUywgSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci0KLS8qIFRoZSB3aW5kb3cgY3Vyc29yIChmcm9tIFNETF9zeXNtb3VzZS5jKSAqLwotZXh0ZXJuIEhDVVJTT1IgU0RMX2hjdXJzb3I7Ci0KLS8qIFRoZSBib3VuZHMgb2YgdGhlIHdpbmRvdyBpbiBzY3JlZW4gY29vcmRpbmF0ZXMgKi8KLWV4dGVybiBSRUNUIFNETF9ib3VuZHM7Ci0KLS8qIFRoZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93IGluIHdpbmRvd2VkIG1vZGUgKi8KLWV4dGVybiBpbnQgU0RMX3dpbmRvd1g7Ci1leHRlcm4gaW50IFNETF93aW5kb3dZOwotCi0vKiBGbGFnIC0tIFNETCBpcyBwZXJmb3JtaW5nIGEgcmVzaXplLCByYXRoZXIgdGhhbiB0aGUgdXNlciAqLwotZXh0ZXJuIGludCBTRExfcmVzaXppbmc7Ci0KLS8qIEZsYWcgLS0gdGhlIG1vdXNlIGlzIGluIHJlbGF0aXZlIG1vdGlvbiBtb2RlICovCi1leHRlcm4gaW50IG1vdXNlX3JlbGF0aXZlOwotCi0vKiBUaGUgR0RJIGZ1bGxzY3JlZW4gbW9kZSBjdXJyZW50bHkgYWN0aXZlICovCi0jaWZuZGVmIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUwotZXh0ZXJuIERFVk1PREUgU0RMX2Rlc2t0b3BfbW9kZTsKLWV4dGVybiBERVZNT0RFIFNETF9mdWxsc2NyZWVuX21vZGU7Ci0jZW5kaWYKLQotLyogVGhlIHN5c3RlbSBnYW1tYSByYW1wIGZvciBHREkgbW9kZXMgKi8KLWV4dGVybiBXT1JEICpnYW1tYV9zYXZlZDsKLQotLyogVGhpcyBpcyByZWFsbHkgZnJvbSBTRExfZHg1YXVkaW8uYyAqLwotZXh0ZXJuIHZvaWQgRFg1X1NvdW5kRm9jdXMoSFdORCB3aW5kb3cpOwotCi0vKiBESk06IFRoaXMgaXMgcmVhbGx5IGZyb20gU0RMX3N5c2V2ZW50cy5jLCB3ZSBuZWVkIGl0IGluCi0gICBHRExfQ3JlYXRlV2luZG93IGFzIHdlbGwgKi8KLUxSRVNVTFQgQ0FMTEJBQ0sgV2luTWVzc2FnZShIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLQotLyogSkZQOiBJbXBsZW1lbnRhdGlvbiBvZiBUb1VuaWNvZGUoKSB0aGF0IHdvcmtzIG9uIDl4L01FLzJLL1hQICovCi10eXBlZGVmIGludCAoV0lOQVBJICpUb1VuaWNvZGVGTikoVUlOVCwgVUlOVCwgUEJZVEUsIExQV1NUUiwgaW50LCBVSU5UKTsKLQotZXh0ZXJuIFRvVW5pY29kZUZOIFNETF9Ub1VuaWNvZGU7Ci0KLSNlbmRpZiAvKiBTRExfbG93dmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c2V2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzUzOGQzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9zeXNldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDkyNCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0vKiBNYWtlIHN1cmUgWEJVVFRPTiBzdHVmZiBpcyBkZWZpbmVkIHRoYXQgaXNuJ3QgaW4gb2xkZXIgUGxhdGZvcm0gU0RLcy4uLiAqLwotI2lmbmRlZiBXTV9YQlVUVE9ORE9XTgotI2RlZmluZSBXTV9YQlVUVE9ORE9XTiAweDAyMEIKLSNlbmRpZgotI2lmbmRlZiBXTV9YQlVUVE9OVVAKLSNkZWZpbmUgV01fWEJVVFRPTlVQIDB4MDIwQwotI2VuZGlmCi0jaWZuZGVmIEdFVF9YQlVUVE9OX1dQQVJBTQotI2RlZmluZSBHRVRfWEJVVFRPTl9XUEFSQU0odykgKEhJV09SRCh3KSkKLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN3bV9jLmgiCi0jaW5jbHVkZSAiU0RMX21haW4uaCIKLSNpbmNsdWRlICJTRExfbG9hZHNvLmgiCi0KLSNpZmRlZiBXTU1TR19ERUJVRwotI2luY2x1ZGUgIndtbXNnLmgiCi0jZW5kaWYKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLSNpbmNsdWRlICIuLi9nYXBpL1NETF9nYXBpdmlkZW8uaCIKLQotI2RlZmluZSBJc1pvb21lZChIV05EKSAxCi0jZGVmaW5lIE5PX0dFVEtFWUJPQVJEU1RBVEUKLSNpZiBfV0lOMzJfV0NFIDwgNDIwCi0jZGVmaW5lIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUwotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhlIHdpbmRvdyB3ZSB1c2UgZm9yIGV2ZXJ5dGhpbmcuLi4gKi8KLSNpZmRlZiBfV0lOMzJfV0NFCi1MUFdTVFIgU0RMX0FwcG5hbWUgPSBOVUxMOwotI2Vsc2UKLUxQU1RSIFNETF9BcHBuYW1lID0gTlVMTDsKLSNlbmRpZgotVWludDMyIFNETF9BcHBzdHlsZSA9IDA7Ci1ISU5TVEFOQ0UgU0RMX0luc3RhbmNlID0gTlVMTDsKLUhXTkQgU0RMX1dpbmRvdyA9IE5VTEw7Ci1SRUNUIFNETF9ib3VuZHMgPSB7MCwgMCwgMCwgMH07Ci1pbnQgU0RMX3dpbmRvd1ggPSAwOwotaW50IFNETF93aW5kb3dZID0gMDsKLWludCBTRExfcmVzaXppbmcgPSAwOwotaW50IG1vdXNlX3JlbGF0aXZlID0gMDsKLWludCBwb3N0ZWQgPSAwOwotI2lmbmRlZiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKLURFVk1PREUgU0RMX2Rlc2t0b3BfbW9kZTsKLURFVk1PREUgU0RMX2Z1bGxzY3JlZW5fbW9kZTsKLSNlbmRpZgotV09SRCAqZ2FtbWFfc2F2ZWQgPSBOVUxMOwotCi0KLS8qIEZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZyBmdW5jdGlvbiAqLwotTE9ORyAoKkhhbmRsZU1lc3NhZ2UpKF9USElTLCBIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKT1OVUxMOwotdm9pZCAoKldJTl9BY3RpdmF0ZSkoX1RISVMsIEJPT0wgYWN0aXZlLCBCT09MIGljb25pYyk7Ci12b2lkICgqV0lOX1JlYWxpemVQYWxldHRlKShfVEhJUyk7Ci12b2lkICgqV0lOX1BhbGV0dGVDaGFuZ2VkKShfVEhJUywgSFdORCB3aW5kb3cpOwotdm9pZCAoKldJTl9XaW5QQUlOVCkoX1RISVMsIEhEQyBoZGMpOwotZXh0ZXJuIHZvaWQgRElCX1N3YXBHYW1tYShfVEhJUyk7Ci0KLSNpZm5kZWYgTk9fR0VUS0VZQk9BUkRTVEFURQotLyogVmFyaWFibGVzIGFuZCBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgU0RMX1RvVW5pY29kZSgpICovCi1zdGF0aWMgaW50IGNvZGVwYWdlOwotc3RhdGljIGludCBJczl4TUUoKTsKLXN0YXRpYyBpbnQgR2V0Q29kZVBhZ2UoKTsKLXN0YXRpYyBpbnQgV0lOQVBJIFRvVW5pY29kZTl4TUUoVUlOVCB2a2V5LCBVSU5UIHNjYW5jb2RlLCBCWVRFICprZXlzdGF0ZSwgTFBXU1RSIHdjaGFycywgaW50IHdzaXplLCBVSU5UIGZsYWdzKTsKLQotVG9Vbmljb2RlRk4gU0RMX1RvVW5pY29kZSA9IFRvVW5pY29kZTl4TUU7Ci0jZW5kaWYgLyogIU5PX0dFVEtFWUJPQVJEU1RBVEUgKi8KLQotCi0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotCi0vLyBkeW5hbWljYWxseSBsb2FkIGF5Z3NoZWxsIGRsbCBiZWNhdXNlIHdlIHdhbnQgU0RMIHRvIHdvcmsgb24gSFBDIGFuZCBiZTMwMAotSElOU1RBTkNFIGF5Z3NoZWxsID0gTlVMTDsKLUJPT0wgKFdJTkFQSSAqU0hGdWxsU2NyZWVuKShIV05EIGh3bmRSZXF1ZXN0ZXIsIERXT1JEIGR3U3RhdGUpID0gMDsKLQotI2RlZmluZSBTSEZTX1NIT1dUQVNLQkFSICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFNIRlNfSElERVRBU0tCQVIgICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgU0hGU19TSE9XU0lQQlVUVE9OICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBTSEZTX0hJREVTSVBCVVRUT04gICAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIFNIRlNfU0hPV1NUQVJUSUNPTiAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgU0hGU19ISURFU1RBUlRJQ09OICAgICAgICAgIDB4MDAyMAotCi1zdGF0aWMgdm9pZCBMb2FkQXlnc2hlbGwodm9pZCkKLXsKLQlpZiggIWF5Z3NoZWxsICkKLQkJIGF5Z3NoZWxsID0gU0RMX0xvYWRPYmplY3QoImF5Z3NoZWxsLmRsbCIpOwotCWlmKCAoYXlnc2hlbGwgIT0gMCkgJiYgKFNIRnVsbFNjcmVlbiA9PSAwKSApCi0JewotCQlTSEZ1bGxTY3JlZW4gPSAoaW50IChXSU5BUEkgKikoc3RydWN0IEhXTkRfXyAqLHVuc2lnbmVkIGxvbmcpKSBTRExfTG9hZEZ1bmN0aW9uKGF5Z3NoZWxsLCAiU0hGdWxsU2NyZWVuIik7Ci0JfQotfQotCi0vKiBmb3IgZ2FwaSBsYW5kc2NhcGUgbW9kZSAqLwotc3RhdGljIHZvaWQgR2FwaVRyYW5zZm9ybShTRExfU2NyZWVuT3JpZW50YXRpb24gcm90YXRlLCBjaGFyIGhpcmVzLCBTaW50MTYgKngsIFNpbnQxNiAqeSkgewotCVNpbnQxNiByb3RhdGVkWDsKLQlTaW50MTYgcm90YXRlZFk7Ci0KLQlpZiAoaGlyZXMpIHsKLQkJKnggPSAqeCAqIDI7Ci0JCSp5ID0gKnkgKiAyOwotCX0KLQotCXN3aXRjaChyb3RhdGUpIHsKLQkJY2FzZSBTRExfT1JJRU5UQVRJT05fVVA6Ci0JCQl7Ci0vKiB0aGlzIGNvZGUgbmVlZHMgdGVzdGluZyBvbiBhIHJlYWwgZGV2aWNlIQotICAgU28gaXQgd2lsbCBiZSBlbmFibGVkIGxhdGVyICovCi0vKgotI2lmZGVmIF9XSU4zMl9XQ0UKLSNpZiBfV0lOMzJfV0NFID49IDQyMAotCQkJCS8vIHRlc3QgZGV2aWNlIG9yaWVudGF0aW9uCi0JCQkJLy8gRklYTUU6IGRvIG5vdCBjaGVjayBldmVyeSBtb3VzZSBtZXNzYWdlCi0JCQkJREVWTU9ERSBzZXR0aW5nczsKLQkJCQlTRExfbWVtc2V0KCZzZXR0aW5ncywgMCwgc2l6ZW9mKERFVk1PREUpKTsKLQkJCQlzZXR0aW5ncy5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7Ci0JCQkJc2V0dGluZ3MuZG1GaWVsZHMgPSBETV9ESVNQTEFZT1JJRU5UQVRJT047Ci0JCQkJQ2hhbmdlRGlzcGxheVNldHRpbmdzRXgoTlVMTCwgJnNldHRpbmdzLCBOVUxMLCBDRFNfVEVTVCwgTlVMTCk7Ci0JCQkJaWYoIHNldHRpbmdzLmRtT3JpZW50YXRpb24gPT0gRE1ET185MCApCi0JCQkJewotCQkJCQlyb3RhdGVkWCA9IFNETF9WaWRlb1N1cmZhY2UtPmggLSAqeDsKLQkJCQkJcm90YXRlZFkgPSAqeTsKLQkJCQkJKnggPSByb3RhdGVkWDsKLQkJCQkJKnkgPSByb3RhdGVkWTsKLQkJCQl9Ci0jZW5kaWYKLSNlbmRpZiAqLwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU0RMX09SSUVOVEFUSU9OX1JJR0hUOgotCQkJaWYgKCFTRExfVmlkZW9TdXJmYWNlKQotCQkJCWJyZWFrOwotCQkJcm90YXRlZFggPSBTRExfVmlkZW9TdXJmYWNlLT53IC0gKnk7Ci0JCQlyb3RhdGVkWSA9ICp4OwotCQkJKnggPSByb3RhdGVkWDsKLQkJCSp5ID0gcm90YXRlZFk7Ci0JCQlicmVhazsKLQkJY2FzZSBTRExfT1JJRU5UQVRJT05fTEVGVDoKLQkJCWlmICghU0RMX1ZpZGVvU3VyZmFjZSkKLQkJCQlicmVhazsKLQkJCXJvdGF0ZWRYID0gKnk7Ci0JCQlyb3RhdGVkWSA9IFNETF9WaWRlb1N1cmZhY2UtPmggLSAqeDsKLQkJCSp4ID0gcm90YXRlZFg7Ci0JCQkqeSA9IHJvdGF0ZWRZOwotCQkJYnJlYWs7Ci0JfQotfQotCi0jZW5kaWYKLQotLyogSkMgMTQgTWFyIDIwMDYKLSAgIFRoaXMgaXMgdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UsIGluIHRoZSB3aW5kaWIgZHJpdmVyIGFuZCBpbiB0aGUgZHg1IGRyaXZlcgotICAgU28gd2UgbWF5IGFzIHdlbGwgc3RpY2sgaXQgaGVyZSBpbnN0ZWFkIG9mIGhhdmluZyBtdWx0aXBsZSBjb3BpZXMgc2NhdHRlcmVkCi0gICBhYm91dAotKi8KLXZvaWQgV0lOX0ZsdXNoTWVzc2FnZVF1ZXVlKCkKLXsKLQlNU0cgIG1zZzsKLQl3aGlsZSAoIFBlZWtNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDAsIFBNX1JFTU9WRSkgKSB7Ci0JCWlmICggbXNnLm1lc3NhZ2UgPT0gV01fUVVJVCApIGJyZWFrOwotCQlUcmFuc2xhdGVNZXNzYWdlKCAmbXNnICk7Ci0JCURpc3BhdGNoTWVzc2FnZSggJm1zZyApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgU0RMX1Jlc3RvcmVHYW1lTW9kZSh2b2lkKQotewotI2lmZGVmIF9XSU4zMl9XQ0UKLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCWlmKFNETF9zdHJjbXAodGhpcy0+bmFtZSwgImdhcGkiKSA9PSAwKQotCXsKLQkJaWYoIHRoaXMtPmhpZGRlbi0+c3VzcGVuZGVkICkKLQkJewotCQkJdGhpcy0+aGlkZGVuLT5zdXNwZW5kZWQgPSAwOwotCQl9Ci0JfQotI2Vsc2UKLQlTaG93V2luZG93KFNETF9XaW5kb3csIFNXX1JFU1RPUkUpOwotI2VuZGlmCi0KLSNpZm5kZWYgTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTCi0jaWZuZGVmIF9XSU4zMl9XQ0UKLQlDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoJlNETF9mdWxsc2NyZWVuX21vZGUsIENEU19GVUxMU0NSRUVOKTsKLSNlbmRpZgotI2VuZGlmIC8qIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUyAqLwotfQotc3RhdGljIHZvaWQgU0RMX1Jlc3RvcmVEZXNrdG9wTW9kZSh2b2lkKQotewotCi0jaWZkZWYgX1dJTjMyX1dDRQotCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87Ci0JaWYoU0RMX3N0cmNtcCh0aGlzLT5uYW1lLCAiZ2FwaSIpID09IDApCi0JewotCQlpZiggIXRoaXMtPmhpZGRlbi0+c3VzcGVuZGVkICkKLQkJewotCQkJdGhpcy0+aGlkZGVuLT5zdXNwZW5kZWQgPSAxOwotCQl9Ci0JfQotI2Vsc2UKLQkvKiBXaW5DRSBkb2VzIG5vdCBoYXZlIGEgdGFza2Jhciwgc28gbWluaW1pemluZyBpcyBub3QgY29udmVuaWVudCAqLwotCVNob3dXaW5kb3coU0RMX1dpbmRvdywgU1dfTUlOSU1JWkUpOwotI2VuZGlmCi0KLSNpZm5kZWYgTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTCi0jaWZuZGVmIF9XSU4zMl9XQ0UKLQlDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoTlVMTCwgMCk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MgKi8KLX0KLQotI2lmZGVmIFdNX01PVVNFTEVBVkUKLS8qIAotICAgU3BlY2lhbCBjb2RlIHRvIGhhbmRsZSBtb3VzZSBsZWF2ZSBldmVudHMgLSB0aGlzIHN1Y2tzLi4uCi0gICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL3N1cHBvcnQva2IvYXJ0aWNsZXMvcTE4My8xLzA3LmFzcAotCi0gICBUcmFja01vdXNlRXZlbnQoKSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBXaW45OCBhbmQgV2luTlQuCi0gICBfVHJhY2tNb3VzZUV2ZW50KCkgaXMgYXZhaWxhYmxlIG9uIFdpbjk1LCBidXQgaXNuJ3QgeWV0IGluIHRoZSBtaW5ndzMyCi0gICBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgYW5kIG9ubHkgd29ya3Mgb24gc3lzdGVtcyB0aGF0IGhhdmUgaGFkIElFIDMuMAotICAgb3IgbmV3ZXIgaW5zdGFsbGVkIG9uIHRoZW0gKHdoaWNoIGlzIG5vdCB0aGUgY2FzZSB3aXRoIHRoZSBiYXNlIFdpbjk1KS4KLSAgIFRoZXJlZm9yZSwgd2UgaW1wbGVtZW50IG91ciBvd24gdmVyc2lvbiBvZiBfVHJhY2tNb3VzZUV2ZW50KCkgd2hpY2gKLSAgIHVzZXMgb3VyIG93biBpbXBsZW1lbnRhdGlvbiBpZiBUcmFja01vdXNlRXZlbnQoKSBpcyBub3QgYXZhaWxhYmxlLgotKi8KLXN0YXRpYyBCT09MIChXSU5BUEkgKl9UcmFja01vdXNlRXZlbnQpKFRSQUNLTU9VU0VFVkVOVCAqcHRtZSkgPSBOVUxMOwotCi1zdGF0aWMgVk9JRCBDQUxMQkFDSwotVHJhY2tNb3VzZVRpbWVyUHJvYyhIV05EIGhXbmQsIFVJTlQgdU1zZywgVUlOVCBpZEV2ZW50LCBEV09SRCBkd1RpbWUpCi17Ci0JUkVDVCByZWN0OwotCVBPSU5UIHB0OwotCi0JR2V0Q2xpZW50UmVjdChoV25kLCAmcmVjdCk7Ci0JTWFwV2luZG93UG9pbnRzKGhXbmQsIE5VTEwsIChMUFBPSU5UKSZyZWN0LCAyKTsKLQlHZXRDdXJzb3JQb3MoJnB0KTsKLQlpZiAoICFQdEluUmVjdCgmcmVjdCwgcHQpIHx8IChXaW5kb3dGcm9tUG9pbnQocHQpICE9IGhXbmQpICkgewotCQlpZiAoICFLaWxsVGltZXIoaFduZCwgaWRFdmVudCkgKSB7Ci0JCQkvKiBFcnJvciBraWxsaW5nIHRoZSB0aW1lciEgKi8KLQkJfQotCQlQb3N0TWVzc2FnZShoV25kLCBXTV9NT1VTRUxFQVZFLCAwLCAwKTsKLQl9Ci19Ci1zdGF0aWMgQk9PTCBXSU5BUEkgV0lOX1RyYWNrTW91c2VFdmVudChUUkFDS01PVVNFRVZFTlQgKnB0bWUpCi17Ci0JaWYgKCBwdG1lLT5kd0ZsYWdzID09IFRNRV9MRUFWRSApIHsKLQkJcmV0dXJuIFNldFRpbWVyKHB0bWUtPmh3bmRUcmFjaywgcHRtZS0+ZHdGbGFncywgMTAwLAotCQkgICAgICAgICAgICAgICAgKFRJTUVSUFJPQylUcmFja01vdXNlVGltZXJQcm9jKSAhPSAwOwotCX0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0jZW5kaWYgLyogV01fTU9VU0VMRUFWRSAqLwotCi0vKiBGdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBrZXlib2FyZCBtb2RpZmllcnMgKi8KLXN0YXRpYyB2b2lkIFdJTl9HZXRLZXlib2FyZFN0YXRlKHZvaWQpCi17Ci0jaWZuZGVmIE5PX0dFVEtFWUJPQVJEU1RBVEUKLQlTRExNb2Qgc3RhdGU7Ci0JQllURSBrZXlib2FyZFsyNTZdOwotCVVpbnQ4ICprc3RhdGUgPSBTRExfR2V0S2V5U3RhdGUoTlVMTCk7Ci0KLQlzdGF0ZSA9IEtNT0RfTk9ORTsKLQlpZiAoIEdldEtleWJvYXJkU3RhdGUoa2V5Ym9hcmQpICkgewotCQlpZiAoIGtleWJvYXJkW1ZLX0xTSElGVF0gJiAweDgwKSB7Ci0JCQlzdGF0ZSB8PSBLTU9EX0xTSElGVDsKLQkJCWtzdGF0ZVtTRExLX0xTSElGVF0gPSBTRExfUFJFU1NFRDsKLQkJfQotCQlpZiAoIGtleWJvYXJkW1ZLX1JTSElGVF0gJiAweDgwKSB7Ci0JCQlzdGF0ZSB8PSBLTU9EX1JTSElGVDsKLQkJCWtzdGF0ZVtTRExLX1JTSElGVF0gPSBTRExfUFJFU1NFRDsKLQkJfQotCQlpZiAoIGtleWJvYXJkW1ZLX0xDT05UUk9MXSAmIDB4ODApIHsKLQkJCXN0YXRlIHw9IEtNT0RfTENUUkw7Ci0JCQlrc3RhdGVbU0RMS19MQ1RSTF0gPSBTRExfUFJFU1NFRDsKLQkJfQotCQlpZiAoIGtleWJvYXJkW1ZLX1JDT05UUk9MXSAmIDB4ODApIHsKLQkJCXN0YXRlIHw9IEtNT0RfUkNUUkw7Ci0JCQlrc3RhdGVbU0RMS19SQ1RSTF0gPSBTRExfUFJFU1NFRDsKLQkJfQotCQlpZiAoIGtleWJvYXJkW1ZLX0xNRU5VXSAmIDB4ODApIHsKLQkJCXN0YXRlIHw9IEtNT0RfTEFMVDsKLQkJCWtzdGF0ZVtTRExLX0xBTFRdID0gU0RMX1BSRVNTRUQ7Ci0JCX0KLQkJaWYgKCBrZXlib2FyZFtWS19STUVOVV0gJiAweDgwKSB7Ci0JCQlzdGF0ZSB8PSBLTU9EX1JBTFQ7Ci0JCQlrc3RhdGVbU0RMS19SQUxUXSA9IFNETF9QUkVTU0VEOwotCQl9Ci0JCWlmICgga2V5Ym9hcmRbVktfTlVNTE9DS10gJiAweDAxKSB7Ci0JCQlzdGF0ZSB8PSBLTU9EX05VTTsKLQkJCWtzdGF0ZVtTRExLX05VTUxPQ0tdID0gU0RMX1BSRVNTRUQ7Ci0JCX0KLQkJaWYgKCBrZXlib2FyZFtWS19DQVBJVEFMXSAmIDB4MDEpIHsKLQkJCXN0YXRlIHw9IEtNT0RfQ0FQUzsKLQkJCWtzdGF0ZVtTRExLX0NBUFNMT0NLXSA9IFNETF9QUkVTU0VEOwotCQl9Ci0JfQotCVNETF9TZXRNb2RTdGF0ZShzdGF0ZSk7Ci0jZW5kaWYgLyogIU5PX0dFVEtFWUJPQVJEU1RBVEUgKi8KLX0KLQotLyogVGhlIG1haW4gV2luMzIgZXZlbnQgaGFuZGxlcgotREpNOiBUaGlzIGlzIG5vIGxvbmdlciBzdGF0aWMgYXMgKERYNS9ESUIpX0NyZWF0ZVdpbmRvdyBuZWVkcyBpdAotKi8KLUxSRVNVTFQgQ0FMTEJBQ0sgV2luTWVzc2FnZShIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87Ci0Jc3RhdGljIGludCBtb3VzZV9wcmVzc2VkID0gMDsKLQlzdGF0aWMgaW50IGluX3dpbmRvdyA9IDA7Ci0jaWZkZWYgV01NU0dfREVCVUcKLQlmcHJpbnRmKHN0ZGVyciwgIlJlY2VpdmVkIHdpbmRvd3MgbWVzc2FnZTogICIpOwotCWlmICggbXNnID4gTUFYX1dNTVNHICkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVkIiwgbXNnKTsKLQl9IGVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgd210YWJbbXNnXSk7Ci0JfQotCWZwcmludGYoc3RkZXJyLCAiIC0tIDB4JVgsIDB4JVhcbiIsIHdQYXJhbSwgbFBhcmFtKTsKLSNlbmRpZgotCXN3aXRjaCAobXNnKSB7Ci0KLQkJY2FzZSBXTV9BQ1RJVkFURTogewotCQkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gY3VycmVudF92aWRlbzsKLQkJCUJPT0wgYWN0aXZlLCBtaW5pbWl6ZWQ7Ci0JCQlVaW50OCBhcHBzdGF0ZTsKLQotCQkJbWluaW1pemVkID0gSElXT1JEKHdQYXJhbSk7Ci0JCQlhY3RpdmUgPSAoTE9XT1JEKHdQYXJhbSkgIT0gV0FfSU5BQ1RJVkUpICYmICFtaW5pbWl6ZWQ7Ci0JCQlpZiAoIGFjdGl2ZSApIHsKLQkJCQkvKiBHYWluIHRoZSBmb2xsb3dpbmcgc3RhdGVzICovCi0JCQkJYXBwc3RhdGUgPSBTRExfQVBQQUNUSVZFfFNETF9BUFBJTlBVVEZPQ1VTOwotCQkJCWlmICggdGhpcy0+aW5wdXRfZ3JhYiAhPSBTRExfR1JBQl9PRkYgKSB7Ci0JCQkJCVdJTl9HcmFiSW5wdXQodGhpcywgU0RMX0dSQUJfT04pOwotCQkJCX0KLQkJCQlpZiAoICEoU0RMX0dldEFwcFN0YXRlKCkmU0RMX0FQUElOUFVURk9DVVMpICkgewotCQkJCQlpZiAoICEgRERSQVdfRlVMTFNDUkVFTigpICkgewotCQkJCQkJRElCX1N3YXBHYW1tYSh0aGlzKTsKLQkJCQkJfQotCQkJCQlpZiAoIFdJTkRJQl9GVUxMU0NSRUVOKCkgKSB7Ci0JCQkJCQlTRExfUmVzdG9yZUdhbWVNb2RlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotCQkJCWlmICggV0lORElCX0ZVTExTQ1JFRU4oKSApIHsKLQkJCQkJTG9hZEF5Z3NoZWxsKCk7Ci0JCQkJCWlmKCBTSEZ1bGxTY3JlZW4gKQotCQkJCQkJU0hGdWxsU2NyZWVuKFNETF9XaW5kb3csIFNIRlNfSElERVNUQVJUSUNPTnxTSEZTX0hJREVUQVNLQkFSfFNIRlNfSElERVNJUEJVVFRPTik7Ci0JCQkJCWVsc2UKLQkJCQkJCVNob3dXaW5kb3coRmluZFdpbmRvdyhURVhUKCJISFRhc2tCYXIiKSxOVUxMKSxTV19ISURFKTsKLQkJCQl9Ci0jZW5kaWYKLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBhcHBzdGF0ZSk7Ci0JCQkJV0lOX0dldEtleWJvYXJkU3RhdGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogTG9zZSB0aGUgZm9sbG93aW5nIHN0YXRlcyAqLwotCQkJCWFwcHN0YXRlID0gU0RMX0FQUElOUFVURk9DVVM7Ci0JCQkJaWYgKCBtaW5pbWl6ZWQgKSB7Ci0JCQkJCWFwcHN0YXRlIHw9IFNETF9BUFBBQ1RJVkU7Ci0JCQkJfQotCQkJCWlmICggdGhpcy0+aW5wdXRfZ3JhYiAhPSBTRExfR1JBQl9PRkYgKSB7Ci0JCQkJCVdJTl9HcmFiSW5wdXQodGhpcywgU0RMX0dSQUJfT0ZGKTsKLQkJCQl9Ci0JCQkJaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBJTlBVVEZPQ1VTICkgewotCQkJCQlpZiAoICEgRERSQVdfRlVMTFNDUkVFTigpICkgewotCQkJCQkJRElCX1N3YXBHYW1tYSh0aGlzKTsKLQkJCQkJfQotCQkJCQlpZiAoIFdJTkRJQl9GVUxMU0NSRUVOKCkgKSB7Ci0JCQkJCQlTRExfUmVzdG9yZURlc2t0b3BNb2RlKCk7Ci0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotCQkJCQkJTG9hZEF5Z3NoZWxsKCk7Ci0JCQkJCQlpZiggU0hGdWxsU2NyZWVuICkgCi0JCQkJCQkJU0hGdWxsU2NyZWVuKFNETF9XaW5kb3csIFNIRlNfU0hPV1NUQVJUSUNPTnxTSEZTX1NIT1dUQVNLQkFSfFNIRlNfU0hPV1NJUEJVVFRPTik7Ci0JCQkJCQllbHNlCi0JCQkJCQkJU2hvd1dpbmRvdyhGaW5kV2luZG93KFRFWFQoIkhIVGFza0JhciIpLE5VTEwpLFNXX1NIT1cpOwotI2VuZGlmCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgYXBwc3RhdGUpOwotCQkJfQotCQkJV0lOX0FjdGl2YXRlKHRoaXMsIGFjdGl2ZSwgbWluaW1pemVkKTsKLQkJCXJldHVybigwKTsKLQkJfQotCQlicmVhazsKLQotCQljYXNlIFdNX01PVVNFTU9WRTogewotCQkJCi0JCQkvKiBNb3VzZSBpcyBoYW5kbGVkIGJ5IERpcmVjdElucHV0IHdoZW4gZnVsbHNjcmVlbiAqLwotCQkJaWYgKCBTRExfVmlkZW9TdXJmYWNlICYmICEgRElOUFVUX0ZVTExTQ1JFRU4oKSApIHsKLQkJCQlTaW50MTYgeCwgeTsKLQotCQkJCS8qIG1vdXNlIGhhcyBlbnRlcmVkIHRoZSB3aW5kb3cgKi8KLQkJCQlpZiAoICEgaW5fd2luZG93ICkgewotI2lmZGVmIFdNX01PVVNFTEVBVkUKLQkJCQkJVFJBQ0tNT1VTRUVWRU5UIHRtZTsKLQotCQkJCQl0bWUuY2JTaXplID0gc2l6ZW9mKHRtZSk7Ci0JCQkJCXRtZS5kd0ZsYWdzID0gVE1FX0xFQVZFOwotCQkJCQl0bWUuaHduZFRyYWNrID0gU0RMX1dpbmRvdzsKLQkJCQkJX1RyYWNrTW91c2VFdmVudCgmdG1lKTsKLSNlbmRpZiAvKiBXTV9NT1VTRUxFQVZFICovCi0JCQkJCWluX3dpbmRvdyA9IFRSVUU7Ci0KLQkJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOwotCQkJCX0KLQotCQkJCS8qIG1vdXNlIGhhcyBtb3ZlZCB3aXRoaW4gdGhlIHdpbmRvdyAqLwotCQkJCXggPSBMT1dPUkQobFBhcmFtKTsKLQkJCQl5ID0gSElXT1JEKGxQYXJhbSk7Ci0JCQkJaWYgKCBtb3VzZV9yZWxhdGl2ZSApIHsKLQkJCQkJUE9JTlQgY2VudGVyOwotCQkJCQljZW50ZXIueCA9IChTRExfVmlkZW9TdXJmYWNlLT53LzIpOwotCQkJCQljZW50ZXIueSA9IChTRExfVmlkZW9TdXJmYWNlLT5oLzIpOwotCQkJCQl4IC09IChTaW50MTYpY2VudGVyLng7Ci0JCQkJCXkgLT0gKFNpbnQxNiljZW50ZXIueTsKLQkJCQkJaWYgKCB4IHx8IHkgKSB7Ci0JCQkJCQlDbGllbnRUb1NjcmVlbihTRExfV2luZG93LCAmY2VudGVyKTsKLQkJCQkJCVNldEN1cnNvclBvcyhjZW50ZXIueCwgY2VudGVyLnkpOwotCQkJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLCB4LCB5KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0jaWZkZWYgX1dJTjMyX1dDRQotCQkJCQlpZiAoU0RMX1ZpZGVvU3VyZmFjZSkKLQkJCQkJCUdhcGlUcmFuc2Zvcm0odGhpcy0+aGlkZGVuLT51c2VyT3JpZW50YXRpb24sIHRoaXMtPmhpZGRlbi0+aGlyZXNGaXgsICZ4LCAmeSk7Ci0jZW5kaWYKLQkJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCB4LCB5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuKDApOwotCi0jaWZkZWYgV01fTU9VU0VMRUFWRQotCQljYXNlIFdNX01PVVNFTEVBVkU6IHsKLQotCQkJLyogTW91c2UgaXMgaGFuZGxlZCBieSBEaXJlY3RJbnB1dCB3aGVuIGZ1bGxzY3JlZW4gKi8KLQkJCWlmICggU0RMX1ZpZGVvU3VyZmFjZSAmJiAhIERJTlBVVF9GVUxMU0NSRUVOKCkgKSB7Ci0JCQkJLyogbW91c2UgaGFzIGxlZnQgdGhlIHdpbmRvdyAqLwotCQkJCS8qIG9yICovCi0JCQkJLyogRWx2aXMgaGFzIGxlZnQgdGhlIGJ1aWxkaW5nISAqLwotCQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQkJCX0KLQkJCWluX3dpbmRvdyA9IEZBTFNFOwotCQl9Ci0JCXJldHVybigwKTsKLSNlbmRpZiAvKiBXTV9NT1VTRUxFQVZFICovCi0KLQkJY2FzZSBXTV9MQlVUVE9ORE9XTjoKLQkJY2FzZSBXTV9MQlVUVE9OVVA6Ci0JCWNhc2UgV01fTUJVVFRPTkRPV046Ci0JCWNhc2UgV01fTUJVVFRPTlVQOgotCQljYXNlIFdNX1JCVVRUT05ET1dOOgotCQljYXNlIFdNX1JCVVRUT05VUDoKLQkJY2FzZSBXTV9YQlVUVE9ORE9XTjoKLQkJY2FzZSBXTV9YQlVUVE9OVVA6IHsKLQkJCS8qIE1vdXNlIGlzIGhhbmRsZWQgYnkgRGlyZWN0SW5wdXQgd2hlbiBmdWxsc2NyZWVuICovCi0JCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgJiYgISBESU5QVVRfRlVMTFNDUkVFTigpICkgewotCQkJCVdPUkQgeGJ1dHRvbnZhbCA9IDA7Ci0JCQkJU2ludDE2IHgsIHk7Ci0JCQkJVWludDggYnV0dG9uLCBzdGF0ZTsKLQotCQkJCS8qIERKTToKLQkJCQkgICBXZSB3YW50IHRoZSBTREwgd2luZG93IHRvIHRha2UgZm9jdXMgc28gdGhhdAotCQkJCSAgIGl0IGFjdHMgbGlrZSBhIG5vcm1hbCB3aW5kb3dzICJjb21wb25lbnQiCi0JCQkJICAgKGUuZy4gZ2FpbnMga2V5Ym9hcmQgZm9jdXMgb24gYSBtb3VzZSBjbGljaykuCi0JCQkJICovCi0JCQkJU2V0Rm9jdXMoU0RMX1dpbmRvdyk7Ci0KLQkJCQkvKiBGaWd1cmUgb3V0IHdoaWNoIGJ1dHRvbiB0byB1c2UgKi8KLQkJCQlzd2l0Y2ggKG1zZykgewotCQkJCQljYXNlIFdNX0xCVVRUT05ET1dOOgotCQkJCQkJYnV0dG9uID0gU0RMX0JVVFRPTl9MRUZUOwotCQkJCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFdNX0xCVVRUT05VUDoKLQkJCQkJCWJ1dHRvbiA9IFNETF9CVVRUT05fTEVGVDsKLQkJCQkJCXN0YXRlID0gU0RMX1JFTEVBU0VEOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgV01fTUJVVFRPTkRPV046Ci0JCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX01JRERMRTsKLQkJCQkJCXN0YXRlID0gU0RMX1BSRVNTRUQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBXTV9NQlVUVE9OVVA6Ci0JCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX01JRERMRTsKLQkJCQkJCXN0YXRlID0gU0RMX1JFTEVBU0VEOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgV01fUkJVVFRPTkRPV046Ci0JCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX1JJR0hUOwotCQkJCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFdNX1JCVVRUT05VUDoKLQkJCQkJCWJ1dHRvbiA9IFNETF9CVVRUT05fUklHSFQ7Ci0JCQkJCQlzdGF0ZSA9IFNETF9SRUxFQVNFRDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFdNX1hCVVRUT05ET1dOOgotCQkJCQkJeGJ1dHRvbnZhbCA9IEdFVF9YQlVUVE9OX1dQQVJBTSh3UGFyYW0pOwotCQkJCQkJYnV0dG9uID0gU0RMX0JVVFRPTl9XSEVFTERPV04gKyB4YnV0dG9udmFsOwotCQkJCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFdNX1hCVVRUT05VUDoKLQkJCQkJCXhidXR0b252YWwgPSBHRVRfWEJVVFRPTl9XUEFSQU0od1BhcmFtKTsKLQkJCQkJCWJ1dHRvbiA9IFNETF9CVVRUT05fV0hFRUxET1dOICsgeGJ1dHRvbnZhbDsKLQkJCQkJCXN0YXRlID0gU0RMX1JFTEVBU0VEOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQkvKiBFaD8gVW5rbm93biBidXR0b24/ICovCi0JCQkJCQlyZXR1cm4oMCk7Ci0JCQkJfQotCQkJCWlmICggc3RhdGUgPT0gU0RMX1BSRVNTRUQgKSB7Ci0JCQkJCS8qIEdyYWIgbW91c2Ugc28gd2UgZ2V0IHVwIGV2ZW50cyAqLwotCQkJCQlpZiAoICsrbW91c2VfcHJlc3NlZCA+IDAgKSB7Ci0JCQkJCQlTZXRDYXB0dXJlKGh3bmQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogUmVsZWFzZSBtb3VzZSBhZnRlciBhbGwgdXAgZXZlbnRzICovCi0JCQkJCWlmICggLS1tb3VzZV9wcmVzc2VkIDw9IDAgKSB7Ci0JCQkJCQlSZWxlYXNlQ2FwdHVyZSgpOwotCQkJCQkJbW91c2VfcHJlc3NlZCA9IDA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCBtb3VzZV9yZWxhdGl2ZSApIHsKLQkJCQkvKglSSlI6IE1hcmNoIDI4LCAyMDAwCi0JCQkJCXJlcG9ydCBpbnRlcm5hbCBtb3VzZSBwb3NpdGlvbiBpZiBpbiByZWxhdGl2ZSBtb2RlICovCi0JCQkJCXggPSAwOyB5ID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQl4ID0gKFNpbnQxNilMT1dPUkQobFBhcmFtKTsKLQkJCQkJeSA9IChTaW50MTYpSElXT1JEKGxQYXJhbSk7Ci0jaWZkZWYgX1dJTjMyX1dDRQotCQkJCQlpZiAoU0RMX1ZpZGVvU3VyZmFjZSkKLQkJCQkJCUdhcGlUcmFuc2Zvcm0odGhpcy0+aGlkZGVuLT51c2VyT3JpZW50YXRpb24sIHRoaXMtPmhpZGRlbi0+aGlyZXNGaXgsICZ4LCAmeSk7Ci0jZW5kaWYKLQkJCQl9Ci0JCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigKLQkJCQkJCQlzdGF0ZSwgYnV0dG9uLCB4LCB5KTsKLQotCQkJCS8qCi0JCQkJICogTVNETiBzYXlzOgotCQkJCSAqICAiVW5saWtlIHRoZSBXTV9MQlVUVE9OVVAsIFdNX01CVVRUT05VUCwgYW5kIFdNX1JCVVRUT05VUAotCQkJCSAqICAgbWVzc2FnZXMsIGFuIGFwcGxpY2F0aW9uIHNob3VsZCByZXR1cm4gVFJVRSBmcm9tIFthbiAKLQkJCQkgKiAgIFhCVVRUT04gbWVzc2FnZV0gaWYgaXQgcHJvY2Vzc2VzIGl0LiBEb2luZyBzbyB3aWxsIGFsbG93Ci0JCQkJICogICBzb2Z0d2FyZSB0aGF0IHNpbXVsYXRlcyB0aGlzIG1lc3NhZ2Ugb24gTWljcm9zb2Z0IFdpbmRvd3MKLQkJCQkgKiAgIHN5c3RlbXMgZWFybGllciB0aGFuIFdpbmRvd3MgMjAwMCB0byBkZXRlcm1pbmUgd2hldGhlcgotCQkJCSAqICAgdGhlIHdpbmRvdyBwcm9jZWR1cmUgcHJvY2Vzc2VkIHRoZSBtZXNzYWdlIG9yIGNhbGxlZAotCQkJCSAqICAgRGVmV2luZG93UHJvYyB0byBwcm9jZXNzIGl0LgotCQkJCSAqLwotCQkJCWlmICh4YnV0dG9udmFsID4gMCkKLQkJCQkJcmV0dXJuKFRSVUUpOwotCQkJfQotCQl9Ci0JCXJldHVybigwKTsKLQotCi0jaWYgKF9XSU4zMl9XSU5OVCA+PSAweDA0MDApIHx8IChfV0lOMzJfV0lORE9XUyA+IDB4MDQwMCkKLQkJY2FzZSBXTV9NT1VTRVdIRUVMOiAKLQkJCWlmICggU0RMX1ZpZGVvU3VyZmFjZSAmJiAhIERJTlBVVF9GVUxMU0NSRUVOKCkgKSB7Ci0JCQkJaW50IG1vdmUgPSAoc2hvcnQpSElXT1JEKHdQYXJhbSk7Ci0JCQkJaWYgKCBtb3ZlICkgewotCQkJCQlVaW50OCBidXR0b247Ci0JCQkJCWlmICggbW92ZSA+IDAgKQotCQkJCQkJYnV0dG9uID0gU0RMX0JVVFRPTl9XSEVFTFVQOwotCQkJCQllbHNlCi0JCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX1dIRUVMRE9XTjsKLQkJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigKLQkJCQkJCVNETF9QUkVTU0VELCBidXR0b24sIDAsIDApOwotCQkJCQlwb3N0ZWQgfD0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigKLQkJCQkJCVNETF9SRUxFQVNFRCwgYnV0dG9uLCAwLCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4oMCk7Ci0jZW5kaWYKLQotI2lmZGVmIFdNX0dFVE1JTk1BWElORk8KLQkJLyogVGhpcyBtZXNzYWdlIGlzIHNlbnQgYXMgYSB3YXkgZm9yIHVzIHRvICJjaGVjayIgdGhlIHZhbHVlcwotCQkgKiBvZiBhIHBvc2l0aW9uIGNoYW5nZS4gIElmIHdlIGRvbid0IGxpa2UgaXQsIHdlIGNhbiBhZGp1c3QKLQkJICogdGhlIHZhbHVlcyBiZWZvcmUgdGhleSBhcmUgY2hhbmdlZC4KLQkJICovCi0JCWNhc2UgV01fR0VUTUlOTUFYSU5GTzogewotCQkJTUlOTUFYSU5GTyAqaW5mbzsKLQkJCVJFQ1QgICAgICAgIHNpemU7Ci0JCQlpbnQgeCwgeTsKLQkJCWludCBzdHlsZTsKLQkJCWludCB3aWR0aDsKLQkJCWludCBoZWlnaHQ7Ci0KLQkJCS8qIFdlIGRvbid0IHdhbnQgdG8gY2xvYmJlciBhbiBpbnRlcm5hbCByZXNpemUgKi8KLQkJCWlmICggU0RMX3Jlc2l6aW5nICkKLQkJCQlyZXR1cm4oMCk7Ci0KLQkJCS8qIFdlIGFsbG93IHJlc2l6aW5nIHdpdGggdGhlIFNETF9SRVNJWkFCTEUgZmxhZyAqLwotCQkJaWYgKCBTRExfUHVibGljU3VyZmFjZSAmJgotCQkJCShTRExfUHVibGljU3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkVTSVpBQkxFKSApIHsKLQkJCQlyZXR1cm4oMCk7Ci0JCQl9Ci0KLQkJCS8qIEdldCB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBvdXIgd2luZG93ICovCi0JCQlHZXRXaW5kb3dSZWN0KFNETF9XaW5kb3csICZzaXplKTsKLQkJCXggPSBzaXplLmxlZnQ7Ci0JCQl5ID0gc2l6ZS50b3A7Ci0KLQkJCS8qIENhbGN1bGF0ZSBjdXJyZW50IHdpZHRoIGFuZCBoZWlnaHQgb2Ygb3VyIHdpbmRvdyAqLwotCQkJc2l6ZS50b3AgPSAwOwotCQkJc2l6ZS5sZWZ0ID0gMDsKLQkJCWlmICggU0RMX1B1YmxpY1N1cmZhY2UgIT0gTlVMTCApIHsKLQkJCQlzaXplLmJvdHRvbSA9IFNETF9QdWJsaWNTdXJmYWNlLT5oOwotCQkJCXNpemUucmlnaHQgPSBTRExfUHVibGljU3VyZmFjZS0+dzsKLQkJCX0gZWxzZSB7Ci0JCQkJc2l6ZS5ib3R0b20gPSAwOwotCQkJCXNpemUucmlnaHQgPSAwOwotCQkJfQotCi0JCQkvKiBESk0gLSBhY2NvcmRpbmcgdG8gdGhlIGRvY3MgZm9yIEdldE1lbnUoKSwgdGhlCi0JCQkgICByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkIGlmIGh3bmQgaXMgYSBjaGlsZCB3aW5kb3cuCi0JCQkgICBBcGFyZW50bHkgaXQncyB0b28gZGlmZmljdWx0IGZvciBNUyB0byBjaGVjawotCQkJICAgaW5zaWRlIHRoZWlyIGZ1bmN0aW9uLCBzbyBJIGhhdmUgdG8gZG8gaXQgaGVyZS4KLSAgICAgICAgICAJCSAqLwotICAgICAgICAgCQlzdHlsZSA9IEdldFdpbmRvd0xvbmcoaHduZCwgR1dMX1NUWUxFKTsKLSAgICAgICAgIAkJQWRqdXN0V2luZG93UmVjdCgKLQkJCQkmc2l6ZSwKLQkJCQlzdHlsZSwKLSAgICAgICAgICAgIAkJCXN0eWxlICYgV1NfQ0hJTERXSU5ET1cgPyBGQUxTRQotCQkJCQkJICAgICAgIDogR2V0TWVudShod25kKSAhPSBOVUxMKTsKLQotCQkJd2lkdGggPSBzaXplLnJpZ2h0IC0gc2l6ZS5sZWZ0OwotCQkJaGVpZ2h0ID0gc2l6ZS5ib3R0b20gLSBzaXplLnRvcDsKLQotCQkJLyogRml4IG91ciBzaXplIHRvIHRoZSBjdXJyZW50IHNpemUgKi8KLQkJCWluZm8gPSAoTUlOTUFYSU5GTyAqKWxQYXJhbTsKLQkJCWluZm8tPnB0TWF4U2l6ZS54ID0gd2lkdGg7Ci0JCQlpbmZvLT5wdE1heFNpemUueSA9IGhlaWdodDsKLQkJCWluZm8tPnB0TWF4UG9zaXRpb24ueCA9IHg7Ci0JCQlpbmZvLT5wdE1heFBvc2l0aW9uLnkgPSB5OwotCQkJaW5mby0+cHRNaW5UcmFja1NpemUueCA9IHdpZHRoOwotCQkJaW5mby0+cHRNaW5UcmFja1NpemUueSA9IGhlaWdodDsKLQkJCWluZm8tPnB0TWF4VHJhY2tTaXplLnggPSB3aWR0aDsKLQkJCWluZm8tPnB0TWF4VHJhY2tTaXplLnkgPSBoZWlnaHQ7Ci0JCX0KLQkJcmV0dXJuKDApOwotI2VuZGlmIC8qIFdNX0dFVE1JTk1BWElORk8gKi8KLQotCQljYXNlIFdNX1dJTkRPV1BPU0NIQU5HRUQ6IHsKLQkJCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87Ci0JCQlpbnQgdywgaDsKLQotCQkJR2V0Q2xpZW50UmVjdChTRExfV2luZG93LCAmU0RMX2JvdW5kcyk7Ci0JCQlDbGllbnRUb1NjcmVlbihTRExfV2luZG93LCAoTFBQT0lOVCkmU0RMX2JvdW5kcyk7Ci0JCQlDbGllbnRUb1NjcmVlbihTRExfV2luZG93LCAoTFBQT0lOVCkmU0RMX2JvdW5kcysxKTsKLQkJCWlmICggIVNETF9yZXNpemluZyAmJiAhSXNab29tZWQoU0RMX1dpbmRvdykgJiYKLQkJCSAgICAgU0RMX1B1YmxpY1N1cmZhY2UgJiYKLQkJCQkhKFNETF9QdWJsaWNTdXJmYWNlLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKLQkJCQlTRExfd2luZG93WCA9IFNETF9ib3VuZHMubGVmdDsKLQkJCQlTRExfd2luZG93WSA9IFNETF9ib3VuZHMudG9wOwotCQkJfQotCQkJdyA9IFNETF9ib3VuZHMucmlnaHQtU0RMX2JvdW5kcy5sZWZ0OwotCQkJaCA9IFNETF9ib3VuZHMuYm90dG9tLVNETF9ib3VuZHMudG9wOwotCQkJaWYgKCB0aGlzLT5pbnB1dF9ncmFiICE9IFNETF9HUkFCX09GRiApIHsKLQkJCQlDbGlwQ3Vyc29yKCZTRExfYm91bmRzKTsKLQkJCX0KLQkJCWlmICggU0RMX1B1YmxpY1N1cmZhY2UgJiYgCi0JCQkJKFNETF9QdWJsaWNTdXJmYWNlLT5mbGFncyAmIFNETF9SRVNJWkFCTEUpICkgewotCQkJCVNETF9Qcml2YXRlUmVzaXplKHcsIGgpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JCS8qIFdlIG5lZWQgdG8gc2V0IHRoZSBjdXJzb3IgKi8KLQkJY2FzZSBXTV9TRVRDVVJTT1I6IHsKLQkJCVVpbnQxNiBoaXR0ZXN0OwotCi0JCQloaXR0ZXN0ID0gTE9XT1JEKGxQYXJhbSk7Ci0JCQlpZiAoIGhpdHRlc3QgPT0gSFRDTElFTlQgKSB7Ci0JCQkJU2V0Q3Vyc29yKFNETF9oY3Vyc29yKTsKLQkJCQlyZXR1cm4oVFJVRSk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJLyogV2UgYXJlIGFib3V0IHRvIGdldCBwYWxldHRlIGZvY3VzISAqLwotCQljYXNlIFdNX1FVRVJZTkVXUEFMRVRURTogewotCQkJV0lOX1JlYWxpemVQYWxldHRlKGN1cnJlbnRfdmlkZW8pOwotCQkJcmV0dXJuKFRSVUUpOwotCQl9Ci0JCWJyZWFrOwotCi0JCS8qIEFub3RoZXIgYXBwbGljYXRpb24gY2hhbmdlZCB0aGUgcGFsZXR0ZSAqLwotCQljYXNlIFdNX1BBTEVUVEVDSEFOR0VEOiB7Ci0JCQlXSU5fUGFsZXR0ZUNoYW5nZWQoY3VycmVudF92aWRlbywgKEhXTkQpd1BhcmFtKTsKLQkJfQotCQlicmVhazsKLQotCQkvKiBXZSB3ZXJlIG9jY2x1ZGVkLCByZWZyZXNoIG91ciBkaXNwbGF5ICovCi0JCWNhc2UgV01fUEFJTlQ6IHsKLQkJCUhEQyBoZGM7Ci0JCQlQQUlOVFNUUlVDVCBwczsKLQotCQkJaGRjID0gQmVnaW5QYWludChTRExfV2luZG93LCAmcHMpOwotCQkJaWYgKCBjdXJyZW50X3ZpZGVvLT5zY3JlZW4gJiYKLQkJCSAgICAgIShjdXJyZW50X3ZpZGVvLT5zY3JlZW4tPmZsYWdzICYgU0RMX09QRU5HTCkgKSB7Ci0JCQkJV0lOX1dpblBBSU5UKGN1cnJlbnRfdmlkZW8sIGhkYyk7Ci0JCQl9Ci0JCQlFbmRQYWludChTRExfV2luZG93LCAmcHMpOwotCQl9Ci0JCXJldHVybigwKTsKLQotCQkvKiBESk06IFNlbmQgYW4gZXhwb3NlIGV2ZW50IGluIHRoaXMgY2FzZSAqLwotCQljYXNlIFdNX0VSQVNFQktHTkQ6IHsKLQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlRXhwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCi0JCWNhc2UgV01fQ0xPU0U6IHsKLQkJCWlmICggKHBvc3RlZCA9IFNETF9Qcml2YXRlUXVpdCgpKSApCi0JCQkJUG9zdFF1aXRNZXNzYWdlKDApOwotCQl9Ci0JCXJldHVybigwKTsKLQotCQljYXNlIFdNX0RFU1RST1k6IHsKLQkJCVBvc3RRdWl0TWVzc2FnZSgwKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0KLSNpZm5kZWYgTk9fR0VUS0VZQk9BUkRTVEFURQotCQljYXNlIFdNX0lOUFVUTEFOR0NIQU5HRTogewotCQkJY29kZXBhZ2UgPSBHZXRDb2RlUGFnZSgpOwotCQl9Ci0JCXJldHVybihUUlVFKTsKLSNlbmRpZgotCi0JCWRlZmF1bHQ6IHsKLQkJCS8qIFNwZWNpYWwgaGFuZGxpbmcgYnkgdGhlIHZpZGVvIGRyaXZlciAqLwotCQkJaWYgKEhhbmRsZU1lc3NhZ2UpIHsKLQkJCQlyZXR1cm4oSGFuZGxlTWVzc2FnZShjdXJyZW50X3ZpZGVvLAotCQkJICAgICAgICAgICAgICAgICAgICAgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSkpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4oRGVmV2luZG93UHJvYyhod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKSk7Ci19Ci0KLS8qIEFsbG93IHRoZSBhcHBsaWNhdGlvbiBoYW5kbGUgdG8gYmUgc3RvcmVkIGFuZCByZXRyaWV2ZWQgbGF0ZXIgKi8KLXN0YXRpYyB2b2lkICpTRExfaGFuZGxlID0gTlVMTDsKLQotdm9pZCBTRExfU2V0TW9kdWxlSGFuZGxlKHZvaWQgKmhhbmRsZSkKLXsKLQlTRExfaGFuZGxlID0gaGFuZGxlOwotfQotdm9pZCAqU0RMX0dldE1vZHVsZUhhbmRsZSh2b2lkKQotewotCXZvaWQgKmhhbmRsZTsKLQotCWlmICggU0RMX2hhbmRsZSApIHsKLQkJaGFuZGxlID0gU0RMX2hhbmRsZTsKLQl9IGVsc2UgewotCQloYW5kbGUgPSBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7Ci0JfQotCXJldHVybihoYW5kbGUpOwotfQotCi0vKiBUaGlzIGFsbG93cyB0aGUgU0RMX1dJTkRPV0lEIGhhY2sgKi8KLUJPT0wgU0RMX3dpbmRvd2lkID0gRkFMU0U7Ci0KLXN0YXRpYyBpbnQgYXBwX3JlZ2lzdGVyZWQgPSAwOwotCi0vKiBSZWdpc3RlciB0aGUgY2xhc3MgZm9yIHRoaXMgYXBwbGljYXRpb24gLS0gZXhwb3J0ZWQgZm9yIHdpbm1haW4uYyAqLwotaW50IFNETF9SZWdpc3RlckFwcChjaGFyICpuYW1lLCBVaW50MzIgc3R5bGUsIHZvaWQgKmhJbnN0KQotewotCVdORENMQVNTIGNsYXNzOwotI2lmZGVmIFdNX01PVVNFTEVBVkUKLQlITU9EVUxFIGhhbmRsZTsKLSNlbmRpZgotCi0JLyogT25seSBkbyB0aGlzIG9uY2UuLi4gKi8KLQlpZiAoIGFwcF9yZWdpc3RlcmVkICkgewotCQkrK2FwcF9yZWdpc3RlcmVkOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0jaWZuZGVmIENTX0JZVEVBTElHTkNMSUVOVAotI2RlZmluZSBDU19CWVRFQUxJR05DTElFTlQJMAotI2VuZGlmCi0JaWYgKCAhIG5hbWUgJiYgISBTRExfQXBwbmFtZSApIHsKLQkJbmFtZSA9ICJTRExfYXBwIjsKLQkJU0RMX0FwcHN0eWxlID0gQ1NfQllURUFMSUdOQ0xJRU5UOwotCQlTRExfSW5zdGFuY2UgPSBoSW5zdCA/IGhJbnN0IDogU0RMX0dldE1vZHVsZUhhbmRsZSgpOwotCX0KLQotCWlmICggbmFtZSApIHsKLSNpZmRlZiBfV0lOMzJfV0NFCi0JCS8qIFdpbkNFIHVzZXMgdGhlIFVOSUNPREUgdmVyc2lvbiAqLwotCQlTRExfQXBwbmFtZSA9IFNETF9pY29udl91dGY4X3VjczIobmFtZSk7Ci0jZWxzZQotCQlTRExfQXBwbmFtZSA9IFNETF9pY29udl91dGY4X2xvY2FsZShuYW1lKTsKLSNlbmRpZiAvKiBfV0lOMzJfV0NFICovCi0JCVNETF9BcHBzdHlsZSA9IHN0eWxlOwotCQlTRExfSW5zdGFuY2UgPSBoSW5zdCA/IGhJbnN0IDogU0RMX0dldE1vZHVsZUhhbmRsZSgpOwotCX0KLQotCS8qIFJlZ2lzdGVyIHRoZSBhcHBsaWNhdGlvbiBjbGFzcyAqLwotCWNsYXNzLmhDdXJzb3IJCT0gTlVMTDsKLQljbGFzcy5oSWNvbgkJPSBMb2FkSW1hZ2UoU0RMX0luc3RhbmNlLCBTRExfQXBwbmFtZSwKLQkJCQkgICAgICAgICAgICBJTUFHRV9JQ09OLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIExSX0RFRkFVTFRDT0xPUik7Ci0JY2xhc3MubHBzek1lbnVOYW1lCT0gTlVMTDsKLQljbGFzcy5scHN6Q2xhc3NOYW1lCT0gU0RMX0FwcG5hbWU7Ci0JY2xhc3MuaGJyQmFja2dyb3VuZAk9IE5VTEw7Ci0JY2xhc3MuaEluc3RhbmNlCQk9IFNETF9JbnN0YW5jZTsKLQljbGFzcy5zdHlsZQkJPSBTRExfQXBwc3R5bGU7Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCWNsYXNzLnN0eWxlCQl8PSBDU19PV05EQzsKLSNlbmRpZgotCWNsYXNzLmxwZm5XbmRQcm9jCT0gV2luTWVzc2FnZTsKLQljbGFzcy5jYlduZEV4dHJhCT0gMDsKLQljbGFzcy5jYkNsc0V4dHJhCT0gMDsKLQlpZiAoICEgUmVnaXN0ZXJDbGFzcygmY2xhc3MpICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHJlZ2lzdGVyIGFwcGxpY2F0aW9uIGNsYXNzIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0jaWZkZWYgV01fTU9VU0VMRUFWRQotCS8qIEdldCB0aGUgdmVyc2lvbiBvZiBUcmFja01vdXNlRXZlbnQoKSB3ZSB1c2UgKi8KLQlfVHJhY2tNb3VzZUV2ZW50ID0gTlVMTDsKLQloYW5kbGUgPSBHZXRNb2R1bGVIYW5kbGUoIlVTRVIzMi5ETEwiKTsKLQlpZiAoIGhhbmRsZSApIHsKLQkJX1RyYWNrTW91c2VFdmVudCA9IChCT09MIChXSU5BUEkgKikoVFJBQ0tNT1VTRUVWRU5UICopKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgIlRyYWNrTW91c2VFdmVudCIpOwotCX0KLQlpZiAoIF9UcmFja01vdXNlRXZlbnQgPT0gTlVMTCApIHsKLQkJX1RyYWNrTW91c2VFdmVudCA9IFdJTl9UcmFja01vdXNlRXZlbnQ7Ci0JfQotI2VuZGlmIC8qIFdNX01PVVNFTEVBVkUgKi8KLQotI2lmbmRlZiBOT19HRVRLRVlCT0FSRFNUQVRFCi0JLyogSW5pdGlhbGlzZSB2YXJpYWJsZXMgZm9yIFNETF9Ub1VuaWNvZGUoKSAqLwotCWNvZGVwYWdlID0gR2V0Q29kZVBhZ2UoKTsKLQlTRExfVG9Vbmljb2RlID0gSXM5eE1FKCkgPyBUb1VuaWNvZGU5eE1FIDogVG9Vbmljb2RlOwotI2VuZGlmCi0KLQlhcHBfcmVnaXN0ZXJlZCA9IDE7Ci0JcmV0dXJuKDApOwotfQotCi0vKiBVbnJlZ2lzdGVycyB0aGUgd2luZG93Y2xhc3MgcmVnaXN0ZXJlZCBpbiBTRExfUmVnaXN0ZXJBcHAgYWJvdmUuICovCi12b2lkIFNETF9VbnJlZ2lzdGVyQXBwKCkKLXsKLQlXTkRDTEFTUyBjbGFzczsKLQotCS8qIFNETF9SZWdpc3RlckFwcCBtaWdodCBub3QgaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgKi8KLQlpZiAoICFhcHBfcmVnaXN0ZXJlZCApIHsKLQkJcmV0dXJuOwotCX0KLQktLWFwcF9yZWdpc3RlcmVkOwotCWlmICggYXBwX3JlZ2lzdGVyZWQgPT0gMCApIHsKLQkJLyogQ2hlY2sgZm9yIGFueSByZWdpc3RlcmVkIHdpbmRvdyBjbGFzc2VzLiAqLwotCQlpZiAoIEdldENsYXNzSW5mbyhTRExfSW5zdGFuY2UsIFNETF9BcHBuYW1lLCAmY2xhc3MpICkgewotCQkJVW5yZWdpc3RlckNsYXNzKFNETF9BcHBuYW1lLCBTRExfSW5zdGFuY2UpOwotCQl9Ci0JCVNETF9mcmVlKFNETF9BcHBuYW1lKTsKLQkJU0RMX0FwcG5hbWUgPSBOVUxMOwotCX0KLX0KLQotI2lmbmRlZiBOT19HRVRLRVlCT0FSRFNUQVRFCi0vKiBKRlA6IEltcGxlbWVudGF0aW9uIG9mIFRvVW5pY29kZSgpIHRoYXQgd29ya3Mgb24gOXgvTUUvMksvWFAgKi8KLQotc3RhdGljIGludCBJczl4TUUoKQotewotCU9TVkVSU0lPTklORk8gICBpbmZvOwotCi0JU0RMX21lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLQlpbmZvLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YoaW5mbyk7Ci0JaWYgKCFHZXRWZXJzaW9uRXgoJmluZm8pKSB7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gKGluZm8uZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTKTsKLX0KLQotc3RhdGljIGludCBHZXRDb2RlUGFnZSgpCi17Ci0JY2hhcglidWZmWzhdOwotCWludAlsY2lkID0gTUFLRUxDSUQoTE9XT1JEKEdldEtleWJvYXJkTGF5b3V0KDApKSwgU09SVF9ERUZBVUxUKTsKLQlpbnQJY3AgPSBHZXRBQ1AoKTsKLQotCWlmIChHZXRMb2NhbGVJbmZvKGxjaWQsIExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgYnVmZiwgc2l6ZW9mKGJ1ZmYpKSkgewotCQljcCA9IFNETF9hdG9pKGJ1ZmYpOwotCX0KLQlyZXR1cm4gY3A7Ci19Ci0KLXN0YXRpYyBpbnQgV0lOQVBJIFRvVW5pY29kZTl4TUUoVUlOVCB2a2V5LCBVSU5UIHNjYW5jb2RlLCBQQllURSBrZXlzdGF0ZSwgTFBXU1RSIHdjaGFycywgaW50IHdzaXplLCBVSU5UIGZsYWdzKQotewotCUJZVEUJY2hhcnNbMl07Ci0KLQlpZiAoVG9Bc2NpaUV4KHZrZXksIHNjYW5jb2RlLCBrZXlzdGF0ZSwgKFdPUkQqKWNoYXJzLCAwLCBHZXRLZXlib2FyZExheW91dCgwKSkgPT0gMSkgewotCQlyZXR1cm4gTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlcGFnZSwgMCwgY2hhcnMsIDEsIHdjaGFycywgd3NpemUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qICFOT19HRVRLRVlCT0FSRFNUQVRFICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9zeXNtb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWNhZjJmLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9zeXNtb3VzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiLi4vU0RMX2N1cnNvcl9jLmgiCi0jaW5jbHVkZSAiU0RMX3N5c21vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLSNkZWZpbmUgVVNFX1NUQVRJQ19DVVJTT1IKLSNlbmRpZgotCi1IQ1VSU09SCVNETF9oY3Vyc29yID0gTlVMTDsJCS8qIEV4cG9ydGVkIGZvciBTRExfZXZlbnRsb29wLmMgKi8KLQotLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCi0vKiBGb3Igc29tZSByZWFzb24gd2hlbiBjcmVhdGluZyBhIHdpbmRvd3MgY3Vyc29yLCB0aGUgYW5kcyBhbmQgeG9ycyBtZW1vcnkKLSAgIGlzIG5vdCBjb3BpZWQsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBpdCBhbmQgZnJlZSBpdCB3aGVuIHdlIGFyZSBkb25lCi0gICB3aXRoIHRoZSBjdXJzb3IuICBJZiB3ZSBmcmVlIHRoZSBtZW1vcnkgcHJlbWF0dXJlbHksIHRoZSBhcHAgY3Jhc2hlcy4gOi19Ci0qLwotc3RydWN0IFdNY3Vyc29yIHsKLQlIQ1VSU09SIGN1cnM7Ci0jaWZuZGVmIFVTRV9TVEFUSUNfQ1VSU09SCi0JVWludDggKmFuZHM7Ci0JVWludDggKnhvcnM7Ci0jZW5kaWYKLX07Ci0KLS8qIENvbnZlcnQgYml0cyB0byBwYWRkZWQgYnl0ZXMgKi8KLSNkZWZpbmUgUEFEX0JJVFMoYml0cykJKChiaXRzKzcpLzgpCi0KLSNpZmRlZiBDVVJTT1JfREVCVUcKLXN0YXRpYyB2b2lkIFByaW50QklUTUFQKEZJTEUgKm91dCwgY2hhciAqYml0cywgaW50IHcsIGludCBoKQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgY2g7Ci0KLQl3aGlsZSAoIGgtLSA+IDAgKSB7Ci0JCWZvciAoIGk9MDsgaTx3OyArK2kgKSB7Ci0JCQlpZiAoIChpJTgpID09IDAgKQotCQkJCWNoID0gKmJpdHMrKzsKLQkJCWlmICggY2gmMHg4MCApCi0JCQkJZnByaW50ZihvdXQsICJYIik7Ci0JCQllbHNlCi0JCQkJZnByaW50ZihvdXQsICIgIik7Ci0JCQljaCA8PD0gMTsKLQkJfQotCQlmcHJpbnRmKG91dCwgIlxuIik7Ci0JfQotfQotI2VuZGlmCi0KLSNpZm5kZWYgVVNFX1NUQVRJQ19DVVJTT1IKLS8qIExvY2FsIGZ1bmN0aW9ucyB0byBjb252ZXJ0IHRoZSBTREwgY3Vyc29yIG1hc2sgaW50byBXaW5kb3dzIGZvcm1hdCAqLwotc3RhdGljIHZvaWQgbWVtbm90KFVpbnQ4ICpkc3QsIFVpbnQ4ICpzcmMsIGludCBsZW4pCi17Ci0Jd2hpbGUgKCBsZW4tLSA+IDAgKQotCQkqZHN0KysgPSB+KnNyYysrOwotfQotc3RhdGljIHZvaWQgbWVteG9yKFVpbnQ4ICpkc3QsIFVpbnQ4ICpzcmMxLCBVaW50OCAqc3JjMiwgaW50IGxlbikKLXsKLQl3aGlsZSAoIGxlbi0tID4gMCApCi0JCSpkc3QrKyA9ICgqc3JjMSsrKV4oKnNyYzIrKyk7Ci19Ci0jZW5kaWYgLyogIVVTRV9TVEFUSUNfQ1VSU09SICovCi0KLXZvaWQgV0lOX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKLXsKLSNpZm5kZWYgVVNFX1NUQVRJQ19DVVJTT1IKLQlpZiAoIGN1cnNvci0+Y3VycyA9PSBHZXRDdXJzb3IoKSApCi0JCVNldEN1cnNvcihOVUxMKTsKLQlpZiAoIGN1cnNvci0+Y3VycyAhPSBOVUxMICkKLQkJRGVzdHJveUN1cnNvcihjdXJzb3ItPmN1cnMpOwotCWlmICggY3Vyc29yLT5hbmRzICE9IE5VTEwgKQotCQlTRExfZnJlZShjdXJzb3ItPmFuZHMpOwotCWlmICggY3Vyc29yLT54b3JzICE9IE5VTEwgKQotCQlTRExfZnJlZShjdXJzb3ItPnhvcnMpOwotI2VuZGlmIC8qICFVU0VfU1RBVElDX0NVUlNPUiAqLwotCVNETF9mcmVlKGN1cnNvcik7Ci19Ci0KLVdNY3Vyc29yICpXSU5fQ3JlYXRlV01DdXJzb3IoX1RISVMsCi0JCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKLXsKLSNpZmRlZiBVU0VfU1RBVElDX0NVUlNPUgotCVdNY3Vyc29yICpjdXJzb3I7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgY3Vyc29yICovCi0JY3Vyc29yID0gKFdNY3Vyc29yICopU0RMX21hbGxvYyhzaXplb2YoKmN1cnNvcikpOwotCWlmICggY3Vyc29yICkgewotCQljdXJzb3ItPmN1cnMgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7Ci0JfQotCXJldHVybihjdXJzb3IpOwotI2Vsc2UKLQlXTWN1cnNvciAqY3Vyc29yOwotCWludCBhbGxvd2VkX3g7Ci0JaW50IGFsbG93ZWRfeTsKLQlpbnQgcnVuLCBwYWQsIGk7Ci0JVWludDggKmFwdHIsICp4cHRyOwotCi0JLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjdXJzb3Igc2l6ZSBpcyBva2F5ICovCi0JYWxsb3dlZF94ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWENVUlNPUik7Ci0JYWxsb3dlZF95ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUNVUlNPUik7Ci0JaWYgKCAodyA+IGFsbG93ZWRfeCkgfHwgKGggPiBhbGxvd2VkX3kpICkgewotCQlTRExfU2V0RXJyb3IoIk9ubHkgY3Vyc29ycyBvZiBkaW1lbnNpb24gKCVkeCVkKSBhcmUgYWxsb3dlZCIsCi0JCQkJCQkJYWxsb3dlZF94LCBhbGxvd2VkX3kpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogQWxsb2NhdGUgdGhlIGN1cnNvciAqLwotCWN1cnNvciA9IChXTWN1cnNvciAqKVNETF9tYWxsb2Moc2l6ZW9mKCpjdXJzb3IpKTsKLQlpZiAoIGN1cnNvciA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIk91dCBvZiBtZW1vcnkiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQljdXJzb3ItPmN1cnMgPSBOVUxMOwotCWN1cnNvci0+YW5kcyA9IE5VTEw7Ci0JY3Vyc29yLT54b3JzID0gTlVMTDsKLQotCS8qIFBhZCBvdXQgdG8gdGhlIG5vcm1hbCBjdXJzb3Igc2l6ZSAqLwotCXJ1biA9IFBBRF9CSVRTKHcpOwotCXBhZCA9IFBBRF9CSVRTKGFsbG93ZWRfeCktcnVuOwotCWFwdHIgPSBjdXJzb3ItPmFuZHMgPSAoVWludDggKilTRExfbWFsbG9jKChydW4rcGFkKSphbGxvd2VkX3kpOwotCXhwdHIgPSBjdXJzb3ItPnhvcnMgPSAoVWludDggKilTRExfbWFsbG9jKChydW4rcGFkKSphbGxvd2VkX3kpOwotCWlmICggKGFwdHIgPT0gTlVMTCkgfHwgKHhwdHIgPT0gTlVMTCkgKSB7Ci0JCVdJTl9GcmVlV01DdXJzb3IoTlVMTCwgY3Vyc29yKTsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JZm9yICggaT0wOyBpPGg7ICsraSApIHsKLQkJbWVteG9yKHhwdHIsIGRhdGEsIG1hc2ssIHJ1bik7Ci0JCXhwdHIgKz0gcnVuOwotCQlkYXRhICs9IHJ1bjsKLQkJbWVtbm90KGFwdHIsIG1hc2ssIHJ1bik7Ci0JCW1hc2sgKz0gcnVuOwotCQlhcHRyICs9IHJ1bjsKLQkJU0RMX21lbXNldCh4cHRyLCAgMCwgcGFkKTsKLQkJeHB0ciArPSBwYWQ7Ci0JCVNETF9tZW1zZXQoYXB0ciwgfjAsIHBhZCk7Ci0JCWFwdHIgKz0gcGFkOwotCX0KLQlwYWQgKz0gcnVuOwotCWZvciAoIDsgaTxhbGxvd2VkX3k7ICsraSApIHsKLQkJU0RMX21lbXNldCh4cHRyLCAgMCwgcGFkKTsKLQkJeHB0ciArPSBwYWQ7Ci0JCVNETF9tZW1zZXQoYXB0ciwgfjAsIHBhZCk7Ci0JCWFwdHIgKz0gcGFkOwotCX0KLQotCS8qIENyZWF0ZSB0aGUgY3Vyc29yICovCi0JY3Vyc29yLT5jdXJzID0gQ3JlYXRlQ3Vyc29yKAotCQkJKEhJTlNUQU5DRSlHZXRXaW5kb3dMb25nUHRyKFNETF9XaW5kb3csIEdXTFBfSElOU1RBTkNFKSwKLQkJCQkJaG90X3gsIGhvdF95LCBhbGxvd2VkX3gsIGFsbG93ZWRfeSwgCi0JCQkJCQljdXJzb3ItPmFuZHMsIGN1cnNvci0+eG9ycyk7Ci0JaWYgKCBjdXJzb3ItPmN1cnMgPT0gTlVMTCApIHsKLQkJV0lOX0ZyZWVXTUN1cnNvcihOVUxMLCBjdXJzb3IpOwotCQlTRExfU2V0RXJyb3IoIldpbmRvd3MgY291bGRuJ3QgY3JlYXRlIHRoZSByZXF1ZXN0ZWQgY3Vyc29yIik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JcmV0dXJuKGN1cnNvcik7Ci0jZW5kaWYgLyogVVNFX1NUQVRJQ19DVVJTT1IgKi8KLX0KLQotaW50IFdJTl9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCi17Ci0JUE9JTlQgbW91c2VfcG9zOwotCi0JLyogVGhlIGZ1bGxzY3JlZW4gY3Vyc29yIG11c3QgYmUgZG9uZSBpbiBzb2Z0d2FyZSB3aXRoIERpcmVjdElucHV0ICovCi0JaWYgKCAhdGhpcy0+c2NyZWVuIHx8IEREUkFXX0ZVTExTQ1JFRU4oKSApIHsKLQkJcmV0dXJuKDApOwotCX0KLQotCS8qIFNldCB0aGUgd2luZG93IGN1cnNvciB0byBvdXIgY3Vyc29yLCBpZiBhcHBsaWNhYmxlICovCi0JaWYgKCBjdXJzb3IgIT0gTlVMTCApIHsKLQkJU0RMX2hjdXJzb3IgPSBjdXJzb3ItPmN1cnM7Ci0JfSBlbHNlIHsKLQkJU0RMX2hjdXJzb3IgPSBOVUxMOwotCX0KLQlHZXRDdXJzb3JQb3MoJm1vdXNlX3Bvcyk7Ci0JaWYgKCBQdEluUmVjdCgmU0RMX2JvdW5kcywgbW91c2VfcG9zKSApIHsKLQkJU2V0Q3Vyc29yKFNETF9oY3Vyc29yKTsKLQl9Ci0JcmV0dXJuKDEpOwotfQotCi12b2lkIFdJTl9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSkKLXsKLQlpZiAoIEREUkFXX0ZVTExTQ1JFRU4oKSApIHsKLQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCB4LCB5KTsKLQl9IGVsc2UgaWYgKCBtb3VzZV9yZWxhdGl2ZSkgewotCQkvKglSSlI6IE1hcmNoIDI4LCAyMDAwCi0JCQlsZWF2ZSBwaHlzaWNhbCBjdXJzb3IgYXQgY2VudGVyIG9mIHNjcmVlbiBpZgotCQkJbW91c2UgaGlkZGVuIGFuZCBncmFiYmVkICovCi0JCVNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgeCwgeSk7Ci0JfSBlbHNlIHsKLQkJUE9JTlQgcHQ7Ci0JCXB0LnggPSB4OwotCQlwdC55ID0geTsKLQkJQ2xpZW50VG9TY3JlZW4oU0RMX1dpbmRvdywgJnB0KTsKLQkJU2V0Q3Vyc29yUG9zKHB0LngsIHB0LnkpOwotCX0KLX0KLQotLyogVXBkYXRlIHRoZSBjdXJyZW50IG1vdXNlIHN0YXRlIGFuZCBwb3NpdGlvbiAqLwotdm9pZCBXSU5fVXBkYXRlTW91c2UoX1RISVMpCi17Ci0JUkVDVCByZWN0OwotCVBPSU5UIHB0OwotCi0JaWYgKCAhIEREUkFXX0ZVTExTQ1JFRU4oKSApIHsKLQkJR2V0Q2xpZW50UmVjdChTRExfV2luZG93LCAmcmVjdCk7Ci0JCUdldEN1cnNvclBvcygmcHQpOwotCQlNYXBXaW5kb3dQb2ludHMoTlVMTCwgU0RMX1dpbmRvdywgJnB0LCAxKTsKLQkJaWYgKFB0SW5SZWN0KCZyZWN0LCBwdCkgJiYgKFdpbmRvd0Zyb21Qb2ludChwdCkgPT0gU0RMX1dpbmRvdykpewotCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOwotCQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLDAsIChTaW50MTYpcHQueCwgKFNpbnQxNilwdC55KTsKLQkJfSBlbHNlIHsKLQkJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQkJfQotCX0KLX0KLQotLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZW50ZXIgb3IgbGVhdmUgbW91c2UgcmVsYXRpdmUgbW9kZSAqLwotdm9pZCBXSU5fQ2hlY2tNb3VzZU1vZGUoX1RISVMpCi17Ci0jaWZuZGVmIF9XSU4zMl9XQ0UgCi0gICAgICAgIC8qIElmIHRoZSBtb3VzZSBpcyBoaWRkZW4gYW5kIGlucHV0IGlzIGdyYWJiZWQsIHdlIHVzZSByZWxhdGl2ZSBtb2RlICovCi0gICAgICAgIGlmICggIShTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSkgJiYKLSAgICAgICAgICAgICAodGhpcy0+aW5wdXRfZ3JhYiAhPSBTRExfR1JBQl9PRkYpICkgewotICAgICAgICAgICAgICAgIG1vdXNlX3JlbGF0aXZlID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtb3VzZV9yZWxhdGl2ZSA9IDA7Ci0gICAgICAgIH0KLSNlbHNlCi0JCW1vdXNlX3JlbGF0aXZlID0gIDA7IAotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c21vdXNlX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmZWVlZi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzbW91c2VfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBXSU5fRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiBXTWN1cnNvciAqV0lOX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAotCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOwotZXh0ZXJuIGludCBXSU5fU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiB2b2lkIFdJTl9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci1leHRlcm4gdm9pZCBXSU5fVXBkYXRlTW91c2UoX1RISVMpOwotZXh0ZXJuIHZvaWQgV0lOX0NoZWNrTW91c2VNb2RlKF9USElTKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9zeXN3bS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c3dtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDJjMTguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c3dtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgIlNETF92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2xvYWRzby5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgotI2luY2x1ZGUgIi4uL1NETF9jdXJzb3JfYy5oIgotI2luY2x1ZGUgIlNETF9zeXN3bV9jLmgiCi0jaW5jbHVkZSAiU0RMX3dpbmdsX2MuaCIKLQotCi0jaWZkZWYgX1dJTjMyX1dDRQotI2RlZmluZSBESVNBQkxFX0lDT05fU1VQUE9SVAotI2VuZGlmCi0KLS8qIFRoZSBzY3JlZW4gaWNvbiAtLSBuZWVkcyB0byBiZSBmcmVlZCBvbiBTRExfVmlkZW9RdWl0KCkgKi8KLUhJQ09OICAgc2NyZWVuX2ljbiA9IE5VTEw7Ci0KLS8qIFdpbjMyIGljb24gbWFzayBzZW1hbnRpY3MgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIG9mIFNETDoKLSAgICAgU0RMIGFwcGxpZXMgdGhlIG1hc2sgdG8gdGhlIGljb24gYW5kIGNvcGllcyByZXN1bHQgdG8gZGVza3RvcC4KLSAgICAgV2luMzIgYXBwbGllcyB0aGUgbWFzayB0byB0aGUgZGVza3RvcCBhbmQgWE9ScyB0aGUgaWNvbiBvbi4KLSAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgU0RMIG1hc2sgbmVlZHMgdG8gYmUgYXBwbGllZCB0byB0aGUgaWNvbiBhbmQKLSAgIHRoZW4gaW52ZXJ0ZWQgYW5kIHBhc3NlZCB0byBXaW4zMi4KLSovCi12b2lkIFdJTl9TZXRXTUljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzaykKLXsKLSNpZmRlZiBESVNBQkxFX0lDT05fU1VQUE9SVAotCXJldHVybjsKLSNlbHNlCi0JU0RMX1BhbGV0dGUgKnBhbF8yNTY7Ci0JU0RMX1N1cmZhY2UgKmljb25fMjU2OwotCVVpbnQ4ICpwZGF0YSwgKnB3aW4zMjsKLQlVaW50OCAqbWRhdGEsICptd2luMzIsIG0gPSAwOwotCWludCBpY29uX2xlbjsKLQlpbnQgaWNvbl9wbGVuOwotCWludCBpY29uX21sZW47Ci0JaW50IGljb25fcGl0Y2g7Ci0JaW50IG1hc2tfcGl0Y2g7Ci0JU0RMX1JlY3QgYm91bmRzOwotCWludCBpLCBza2lwOwotCWludCByb3csIGNvbDsKLQlzdHJ1Y3QgLyogcXVhc2ktQk1QIGZvcm1hdCAqLyBXaW4zMkljb24gewotCQlVaW50MzIgYmlTaXplOwotCQlTaW50MzIgYmlXaWR0aDsKLQkJU2ludDMyIGJpSGVpZ2h0OwotCQlVaW50MTYgYmlQbGFuZXM7Ci0JCVVpbnQxNiBiaUJpdENvdW50OwotCQlVaW50MzIgYmlDb21wcmVzc2lvbjsKLQkJVWludDMyIGJpU2l6ZUltYWdlOwotCQlTaW50MzIgYmlYUGVsc1Blck1ldGVyOwotCQlTaW50MzIgYmlZUGVsc1Blck1ldGVyOwotCQlVaW50MzIgYmlDbHJVc2VkOwotCQlVaW50MzIgYmlDbHJJbXBvcnRhbnQ7Ci0JCXN0cnVjdCAvKiBSR0JRVUFEIC0tIG5vdGUgaXQncyBCR1Igb3JkZXJlZCAqLyB7Ci0JCQlVaW50OCByZ2JCbHVlOwotCQkJVWludDggcmdiR3JlZW47Ci0JCQlVaW50OCByZ2JSZWQ7Ci0JCQlVaW50OCByZ2JSZXNlcnZlZDsKLQkJfSBiaUNvbG9yc1syNTZdOwotCQkvKiBQaXhlbHM6Ci0JCVVpbnQ4IHBpeGVsc1tdCi0JCSovCi0JCS8qIE1hc2s6Ci0JCVVpbnQ4IG1hc2tbXQotCQkqLwotCX0gKmljb25fd2luMzI7Ci0JCi0JLyogQWxsb2NhdGUgdGhlIHdpbjMyIGJtcCBpY29uIGFuZCBzZXQgZXZlcnl0aGluZyB0byB6ZXJvICovCi0JaWNvbl9waXRjaCA9ICgoaWNvbi0+dyszKSZ+Myk7Ci0JbWFza19waXRjaCA9ICgoaWNvbi0+dys3KS84KTsKLQlpY29uX3BsZW4gPSBpY29uLT5oKmljb25fcGl0Y2g7Ci0JaWNvbl9tbGVuID0gaWNvbi0+aCptYXNrX3BpdGNoOwotCWljb25fbGVuID0gc2l6ZW9mKCppY29uX3dpbjMyKStpY29uX3BsZW4raWNvbl9tbGVuOwotCWljb25fd2luMzIgPSAoc3RydWN0IFdpbjMySWNvbiAqKVNETF9zdGFja19hbGxvYyhVaW50OCwgaWNvbl9sZW4pOwotCWlmICggaWNvbl93aW4zMiA9PSBOVUxMICkgewotCQlyZXR1cm47Ci0JfQotCVNETF9tZW1zZXQoaWNvbl93aW4zMiwgMCwgaWNvbl9sZW4pOwotCi0JLyogU2V0IHRoZSBiYXNpYyBCTVAgcGFyYW1ldGVycyAqLwotCWljb25fd2luMzItPmJpU2l6ZSA9IHNpemVvZigqaWNvbl93aW4zMiktc2l6ZW9mKGljb25fd2luMzItPmJpQ29sb3JzKTsKLQlpY29uX3dpbjMyLT5iaVdpZHRoID0gaWNvbi0+dzsKLQlpY29uX3dpbjMyLT5iaUhlaWdodCA9IGljb24tPmgqMjsKLQlpY29uX3dpbjMyLT5iaVBsYW5lcyA9IDE7Ci0JaWNvbl93aW4zMi0+YmlCaXRDb3VudCA9IDg7Ci0JaWNvbl93aW4zMi0+YmlTaXplSW1hZ2UgPSBpY29uX3BsZW4raWNvbl9tbGVuOwotCi0JLyogQWxsb2NhdGUgYSBzdGFuZGFyZCAyNTYgY29sb3IgaWNvbiBzdXJmYWNlICovCi0JaWNvbl8yNTYgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLCBpY29uLT53LCBpY29uLT5oLAotCQkJCQkgaWNvbl93aW4zMi0+YmlCaXRDb3VudCwgMCwgMCwgMCwgMCk7Ci0JaWYgKCBpY29uXzI1NiA9PSBOVUxMICkgewotCQlTRExfc3RhY2tfZnJlZShpY29uX3dpbjMyKTsKLQkJcmV0dXJuOwotCX0KLQlwYWxfMjU2ID0gaWNvbl8yNTYtPmZvcm1hdC0+cGFsZXR0ZTsKLQlpZiAoaWNvbi0+Zm9ybWF0LT5wYWxldHRlICYmIAotCQkoaWNvbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gaWNvbl8yNTYtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSl7Ci0JCVVpbnQ4IGJsYWNrOwotCQlTRExfbWVtY3B5KHBhbF8yNTYtPmNvbG9ycywgaWNvbi0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnMsCi0JCQkJCXBhbF8yNTYtPm5jb2xvcnMqc2l6ZW9mKFNETF9Db2xvcikpOwotCQkvKiBNYWtlIHN1cmUgdGhhdCAwIGlzIGJsYWNrISAqLwotCQlibGFjayA9IFNETF9GaW5kQ29sb3IocGFsXzI1NiwgMHgwMCwgMHgwMCwgMHgwMCk7Ci0JCXBhbF8yNTYtPmNvbG9yc1tibGFja10gPSBwYWxfMjU2LT5jb2xvcnNbMF07Ci0JCXBhbF8yNTYtPmNvbG9yc1swXS5yID0gMHgwMDsKLQkJcGFsXzI1Ni0+Y29sb3JzWzBdLmcgPSAweDAwOwotCQlwYWxfMjU2LT5jb2xvcnNbMF0uYiA9IDB4MDA7Ci0JfSBlbHNlIHsKLQkJU0RMX0RpdGhlckNvbG9ycyhwYWxfMjU2LT5jb2xvcnMsCi0JCQkJCWljb25fMjU2LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCk7Ci0JfQotCi0JLyogTm93IGNvcHkgY29sb3IgZGF0YSB0byB0aGUgaWNvbiBCTVAgKi8KLQlmb3IgKCBpPTA7IGk8KDE8PGljb25fd2luMzItPmJpQml0Q291bnQpOyArK2kgKSB7Ci0JCWljb25fd2luMzItPmJpQ29sb3JzW2ldLnJnYlJlZCA9IHBhbF8yNTYtPmNvbG9yc1tpXS5yOwotCQlpY29uX3dpbjMyLT5iaUNvbG9yc1tpXS5yZ2JHcmVlbiA9IHBhbF8yNTYtPmNvbG9yc1tpXS5nOwotCQlpY29uX3dpbjMyLT5iaUNvbG9yc1tpXS5yZ2JCbHVlID0gcGFsXzI1Ni0+Y29sb3JzW2ldLmI7Ci0JfQotCi0JLyogQ29udmVydCBpY29uIHRvIGEgc3RhbmRhcmQgc3VyZmFjZSBmb3JtYXQuICBUaGlzIG1heSBub3QgYWx3YXlzCi0JICAgYmUgbmVjZXNzYXJ5LCBhcyBXaW5kb3dzIHN1cHBvcnRzIGEgdmFyaWV0eSBvZiBCTVAgZm9ybWF0cywgYnV0Ci0JICAgaXQgZ3JlYXRseSBzaW1wbGlmaWVzIG91ciBjb2RlLgotCSovIAotICAgIGJvdW5kcy54ID0gMDsKLSAgICBib3VuZHMueSA9IDA7Ci0gICAgYm91bmRzLncgPSBpY29uLT53OwotICAgIGJvdW5kcy5oID0gaWNvbi0+aDsKLSAgICBpZiAoIFNETF9Mb3dlckJsaXQoaWNvbiwgJmJvdW5kcywgaWNvbl8yNTYsICZib3VuZHMpIDwgMCApIHsKLQkgICAgU0RMX3N0YWNrX2ZyZWUoaWNvbl93aW4zMik7Ci0JCVNETF9GcmVlU3VyZmFjZShpY29uXzI1Nik7Ci0gICAgICAgIHJldHVybjsKLQl9Ci0KLQkvKiBDb3B5IHBpeGVscyB1cHNpZGUtZG93biB0byBpY29uIEJNUCwgbWFza2VkIHdpdGggdGhlIGljb24gbWFzayAqLwotCWlmICggU0RMX01VU1RMT0NLKGljb25fMjU2KSB8fCAoaWNvbl8yNTYtPnBpdGNoICE9IGljb25fcGl0Y2gpICkgewotCQlTRExfc3RhY2tfZnJlZShpY29uX3dpbjMyKTsKLQkJU0RMX0ZyZWVTdXJmYWNlKGljb25fMjU2KTsKLQkJU0RMX1NldEVycm9yKCJXYXJuaW5nOiBVbmV4cGVjdGVkIGljb25fMjU2IGNoYXJhY3RlcmlzdGljcyIpOwotCQlyZXR1cm47Ci0JfQotCXBkYXRhID0gKFVpbnQ4ICopaWNvbl8yNTYtPnBpeGVsczsKLQltZGF0YSA9IG1hc2s7Ci0JcHdpbjMyID0gKFVpbnQ4ICopaWNvbl93aW4zMitzaXplb2YoKmljb25fd2luMzIpK2ljb25fcGxlbi1pY29uX3BpdGNoOwotCXNraXAgPSBpY29uX3BpdGNoIC0gaWNvbi0+dzsKLQlmb3IgKCByb3c9MDsgcm93PGljb24tPmg7ICsrcm93ICkgewotCQlmb3IgKCBjb2w9MDsgY29sPGljb24tPnc7ICsrY29sICkgewotCQkJaWYgKCAoY29sJTgpID09IDAgKSB7Ci0JCQkJbSA9ICptZGF0YSsrOwotCQkJfQotCQkJaWYgKCAobSYweDgwKSAhPSAweDAwICkgewotCQkJCSpwd2luMzIgPSAqcGRhdGE7Ci0JCQl9Ci0JCQltIDw8PSAxOwotCQkJKytwZGF0YTsKLQkJCSsrcHdpbjMyOwotCQl9Ci0JCXBkYXRhICArPSBza2lwOwotCQlwd2luMzIgKz0gc2tpcDsKLQkJcHdpbjMyIC09IDIqaWNvbl9waXRjaDsKLQl9Ci0JU0RMX0ZyZWVTdXJmYWNlKGljb25fMjU2KTsKLQotCS8qIENvcHkgbWFzayBpbnZlcnRlZCBhbmQgdXBzaWRlLWRvd24gdG8gaWNvbiBCTVAgKi8KLQltZGF0YSA9IG1hc2s7Ci0JbXdpbjMyID0gKFVpbnQ4ICopaWNvbl93aW4zMgotCQkJK3NpemVvZigqaWNvbl93aW4zMikraWNvbl9wbGVuK2ljb25fbWxlbi1tYXNrX3BpdGNoOwotCWZvciAoIHJvdz0wOyByb3c8aWNvbi0+aDsgKytyb3cgKSB7Ci0JCWZvciAoIGNvbD0wOyBjb2w8bWFza19waXRjaDsgKytjb2wgKSB7Ci0JCQkqbXdpbjMyKysgPSB+Km1kYXRhKys7Ci0JCX0KLQkJbXdpbjMyIC09IDIqbWFza19waXRjaDsKLQl9Ci0KLQkvKiBGaW5hbGx5LCBjcmVhdGUgdGhlIGljb24gaGFuZGxlIGFuZCBzZXQgdGhlIHdpbmRvdyBpY29uICovCi0Jc2NyZWVuX2ljbiA9IENyZWF0ZUljb25Gcm9tUmVzb3VyY2VFeCgoVWludDggKilpY29uX3dpbjMyLCBpY29uX2xlbiwKLQkJCVRSVUUsIDB4MDAwMzAwMDAsIGljb24tPncsIGljb24tPmgsIExSX0RFRkFVTFRDT0xPUik7Ci0JaWYgKCBzY3JlZW5faWNuID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIFdpbjMyIGljb24gaGFuZGxlIik7Ci0JfSBlbHNlIHsKLQkJU2V0Q2xhc3NMb25nUHRyKFNETF9XaW5kb3csIEdDTFBfSElDT04sIChMT05HX1BUUilzY3JlZW5faWNuKTsKLQl9Ci0JU0RMX3N0YWNrX2ZyZWUoaWNvbl93aW4zMik7Ci0jZW5kaWYgLyogRElTQUJMRV9JQ09OX1NVUFBPUlQgKi8KLX0KLQotdHlwZWRlZiBCT09MIChXSU5BUEkgKlB0clNldFdpbmRvd1RleHRXKShIV05EIGhXbmQsIExQQ1dTVFIgbHBTdHJpbmcpOwotCi12b2lkIFdJTl9TZXRXTUNhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKQotewotI2lmZGVmIF9XSU4zMl9XQ0UKLQkvKiBXaW5DRSB1c2VzIHRoZSBVTklDT0RFIHZlcnNpb24gKi8KLQlMUFdTVFIgbHBzelcgPSBTRExfaWNvbnZfdXRmOF91Y3MyKChjaGFyICopdGl0bGUpOwotCVNldFdpbmRvd1RleHQoU0RMX1dpbmRvdywgbHBzelcpOwotCVNETF9mcmVlKGxwc3pXKTsKLSNlbHNlCi0JLyoKLQkgKiBUcnkgbG9hZGluZyBTZXRXaW5kb3dUZXh0VyBmcm9tIGtlcm5lbDMyLmRsbCBmaXJzdCwgYW5kIGlmIGl0IGV4aXN0cywKLQkgKiAgcGFzcyB0aGUgVUNTLTIgc3RyaW5nIHRvIGl0LiBJZiBpdCBkb2Vzbid0LCB1c2UKLQkgKiAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1ApIGFuZCBob3BlIHRoYXQgdGhlIGNvZGVwYWdlIGNhbiBzdXBwb3J0IHRoZQotCSAqICBzdHJpbmcgZGF0YSBpbiBxdWVzdGlvbi4gVGhpcyBsZXRzIHVzIGtlZXAgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aAotCSAqICBXaW45NS85OC9NRSBidXQgc3RpbGwgdXNlIHNhbmVyIFVuaWNvZGUgb24gTlQtYmFzZWQgV2luZG93cy4KLQkgKi8KLQlzdGF0aWMgaW50IHRyaWVkX2xvYWRpbmcgPSAwOwotCXN0YXRpYyBQdHJTZXRXaW5kb3dUZXh0VyBzd3R3ID0gTlVMTDsKLQlVaW50MTYgKmxwc3ogPSBTRExfaWNvbnZfdXRmOF91Y3MyKHRpdGxlKTsKLQlpZiAoIXRyaWVkX2xvYWRpbmcpIHsKLQkJSE1PRFVMRSBkbGwgPSBMb2FkTGlicmFyeSgidXNlcjMyLmRsbCIpOwotCQlpZiAoZGxsICE9IE5VTEwpIHsKLQkJCXN3dHcgPSAoUHRyU2V0V2luZG93VGV4dFcpIEdldFByb2NBZGRyZXNzKGRsbCwgIlNldFdpbmRvd1RleHRXIik7Ci0JCQlpZiAoc3d0dyA9PSBOVUxMKSB7Ci0JCQkJRnJlZUxpYnJhcnkoZGxsKTsKLQkJCX0KLQkJfQotCQl0cmllZF9sb2FkaW5nID0gMTsKLQl9Ci0KLQlpZiAoc3d0dyAhPSBOVUxMKSB7Ci0JCXN3dHcoU0RMX1dpbmRvdywgbHBzeik7Ci0JfSBlbHNlIHsKLQkJc2l6ZV90IGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBscHN6LCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0JCWNoYXIgKmN2dCA9IFNETF9tYWxsb2MobGVuICsgMSk7Ci0JCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBscHN6LCAtMSwgY3Z0LCBsZW4sIE5VTEwsIE5VTEwpOwotCQlTZXRXaW5kb3dUZXh0KFNETF9XaW5kb3csIGN2dCk7Ci0JCVNETF9mcmVlKGN2dCk7Ci0JfQotCVNETF9mcmVlKGxwc3opOwotI2VuZGlmCi19Ci0KLWludCBXSU5fSWNvbmlmeVdpbmRvdyhfVEhJUykKLXsKLQlTaG93V2luZG93KFNETF9XaW5kb3csIFNXX01JTklNSVpFKTsKLQlyZXR1cm4oMSk7Ci19Ci0KLVNETF9HcmFiTW9kZSBXSU5fR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSkKLXsKLQlpZiAoIG1vZGUgPT0gU0RMX0dSQUJfT0ZGICkgewotCQlDbGlwQ3Vyc29yKE5VTEwpOwotCQlpZiAoICEoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICkgewotCQkvKglSSlI6IE1hcmNoIDI4LCAyMDAwCi0JCQltdXN0IGJlIGxlYXZpbmcgcmVsYXRpdmUgbW9kZSwgbW92ZSBtb3VzZSBmcm9tCi0JCQljZW50ZXIgb2Ygd2luZG93IHRvIHdoZXJlIGl0IGJlbG9uZ3MgLi4uICovCi0JCQlQT0lOVCBwdDsKLQkJCWludCB4LCB5OwotCQkJU0RMX0dldE1vdXNlU3RhdGUoJngsJnkpOwotCQkJcHQueCA9IHg7Ci0JCQlwdC55ID0geTsKLQkJCUNsaWVudFRvU2NyZWVuKFNETF9XaW5kb3csICZwdCk7Ci0JCQlTZXRDdXJzb3JQb3MocHQueCxwdC55KTsKLQkJfQotI2lmZGVmIF9XSU4zMl9XQ0UKLQkJQWxsS2V5cygwKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCUNsaXBDdXJzb3IoJlNETF9ib3VuZHMpOwotCQlpZiAoICEoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICkgewotCQkvKglSSlI6IE1hcmNoIDI4LCAyMDAwCi0JCQltdXN0IGJlIGVudGVyaW5nIHJlbGF0aXZlIG1vZGUsIGdldCByZWFkeSBieQotCQkJbW92aW5nIG1vdXNlIHRvCWNlbnRlciBvZiB3aW5kb3cgLi4uICovCi0JCQlQT0lOVCBwdDsKLQkJCXB0LnggPSAoU0RMX1ZpZGVvU3VyZmFjZS0+dy8yKTsKLQkJCXB0LnkgPSAoU0RMX1ZpZGVvU3VyZmFjZS0+aC8yKTsKLQkJCUNsaWVudFRvU2NyZWVuKFNETF9XaW5kb3csICZwdCk7Ci0JCQlTZXRDdXJzb3JQb3MocHQueCwgcHQueSk7Ci0JCX0KLSNpZmRlZiBfV0lOMzJfV0NFCi0JCUFsbEtleXMoMSk7Ci0jZW5kaWYKLQl9Ci0JcmV0dXJuKG1vZGUpOwotfQotCi0vKiBJZiAnaW5mbycgaXMgdGhlIHJpZ2h0IHZlcnNpb24sIHRoaXMgZnVuY3Rpb24gZmlsbHMgaXQgYW5kIHJldHVybnMgMS4KLSAgIE90aGVyd2lzZSwgaW4gY2FzZSBvZiBhIHZlcnNpb24gbWlzbWF0Y2gsIGl0IHJldHVybnMgLTEuCi0qLwotaW50IFdJTl9HZXRXTUluZm8oX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pCi17Ci0JaWYgKCBpbmZvLT52ZXJzaW9uLm1ham9yIDw9IFNETF9NQUpPUl9WRVJTSU9OICkgewotCQlpbmZvLT53aW5kb3cgPSBTRExfV2luZG93OwotCQlpZiAoIFNETF9WRVJTSU9OTlVNKGluZm8tPnZlcnNpb24ubWFqb3IsCi0JCSAgICAgICAgICAgICAgICAgICAgaW5mby0+dmVyc2lvbi5taW5vciwKLQkJICAgICAgICAgICAgICAgICAgICBpbmZvLT52ZXJzaW9uLnBhdGNoKSA+PQotCQkgICAgIFNETF9WRVJTSU9OTlVNKDEsIDIsIDUpICkgewotI2lmIFNETF9WSURFT19PUEVOR0wKLQkJCWluZm8tPmhnbHJjID0gR0xfaHJjOwotI2Vsc2UKLQkJCWluZm8tPmhnbHJjID0gTlVMTDsKLSNlbmRpZgotCQl9Ci0JCXJldHVybigxKTsKLQl9IGVsc2UgewotCQlTRExfU2V0RXJyb3IoIkFwcGxpY2F0aW9uIG5vdCBjb21waWxlZCB3aXRoIFNETCAlZC4lZFxuIiwKLQkJCQkJU0RMX01BSk9SX1ZFUlNJT04sIFNETF9NSU5PUl9WRVJTSU9OKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzd21fYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c3dtX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI0NWU3Zi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzd21fYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKLQotLyogRGF0YSB0aGF0IG5lZWRzIHRvIGJlIGZyZWVkIGF0IFNETF9TWVNfVmlkZW9RdWl0KCkgKi8KLWV4dGVybiBISUNPTiBzY3JlZW5faWNuOwotCi0vKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KLWV4dGVybiB2b2lkIFdJTl9TZXRXTUljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzayk7Ci1leHRlcm4gdm9pZCBXSU5fU2V0V01DYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7Ci1leHRlcm4gaW50IFdJTl9JY29uaWZ5V2luZG93KF9USElTKTsKLWV4dGVybiBTRExfR3JhYk1vZGUgV0lOX0dyYWJJbnB1dChfVEhJUywgU0RMX0dyYWJNb2RlIG1vZGUpOwotZXh0ZXJuIGludCBXSU5fR2V0V01JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKTsKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5jb21tb24vU0RMX3dpbmdsLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfd2luZ2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwNzExMS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfd2luZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDY0NyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogV0dMIGltcGxlbWVudGF0aW9uIG9mIFNETCBPcGVuR0wgc3VwcG9ydCAqLwotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotI2luY2x1ZGUgIlNETF9vcGVuZ2wuaCIKLSNlbmRpZgotI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgotI2luY2x1ZGUgIlNETF93aW5nbF9jLmgiCi0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0jZGVmaW5lIERFRkFVTFRfR0xfRFJJVkVSX1BBVEggIk9QRU5HTDMyLkRMTCIKLSNlbmRpZgotCi0vKiBJZiBzZXR0aW5nIHRoZSBIREMgZmFpbHMsIHdlIG1heSBuZWVkIHRvIHJlY3JlYXRlIHRoZSB3aW5kb3cgKE1TRE4pICovCi1zdGF0aWMgaW50IFdJTl9HTF9SZXNldFdpbmRvdyhfVEhJUykKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotI2lmbmRlZiBfV0lOMzJfV0NFIC8qIEZJWE1FIFdpbkNFIG5lZWRzIHRoZSBVTklDT0RFIHZlcnNpb24gb2YgQ3JlYXRlV2luZG93KCkgKi8KLQkvKiBUaGlzIGRvZXNuJ3Qgd29yayB3aXRoIERpcmVjdFggY29kZSAoc2VlIENWUyBjb21tZW50cykgKi8KLQkvKiBJZiB3ZSB3ZXJlIHBhc3NlZCBhIHdpbmRvdywgdGhlbiB3ZSBjYW4ndCBjcmVhdGUgYSBuZXcgb25lICovCi0JaWYgKCAhU0RMX3dpbmRvd2lkICYmIFNETF9zdHJjbXAodGhpcy0+bmFtZSwgIndpbmRpYiIpID09IDAgKSB7Ci0JCS8qIFNhdmUgdGhlIGV4aXN0aW5nIHdpbmRvdyBhdHRyaWJ1dGVzICovCi0JCUxPTkcgc3R5bGU7Ci0JCVJFQ1QgcmVjdCA9IHsgMCwgMCwgMCwgMCB9OwotCQlzdHlsZSA9IEdldFdpbmRvd0xvbmcoU0RMX1dpbmRvdywgR1dMX1NUWUxFKTsKLQkJR2V0V2luZG93UmVjdChTRExfV2luZG93LCAmcmVjdCk7Ci0JCURlc3Ryb3lXaW5kb3coU0RMX1dpbmRvdyk7Ci0JCVdJTl9GbHVzaE1lc3NhZ2VRdWV1ZSgpOwotCi0JCVNETF9yZXNpemluZyA9IDE7Ci0JCVNETF9XaW5kb3cgPSBDcmVhdGVXaW5kb3coU0RMX0FwcG5hbWUsIFNETF9BcHBuYW1lLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCwgcmVjdC50b3AsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlY3QucmlnaHQtcmVjdC5sZWZ0KSsxLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWN0LmJvdHRvbS1yZWN0LnRvcCkrMSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBTRExfSW5zdGFuY2UsIE5VTEwpOwotCQlXSU5fRmx1c2hNZXNzYWdlUXVldWUoKTsKLQkJU0RMX3Jlc2l6aW5nID0gMDsKLQotCQlpZiAoIFNETF9XaW5kb3cgKSB7Ci0JCQl0aGlzLT5TZXRDYXB0aW9uKHRoaXMsIHRoaXMtPndtX3RpdGxlLCB0aGlzLT53bV9pY29uKTsKLQkJfSBlbHNlIHsKLQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHdpbmRvdyIpOwotCQkJc3RhdHVzID0gLTE7Ci0JCX0KLQl9IGVsc2UKLSNlbmRpZiAvKiAhX1dJTjMyX1dDRSAqLwotCXsKLQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gcmVzZXQgd2luZG93IGZvciBPcGVuR0wgY29udGV4dCIpOwotCQlzdGF0dXMgPSAtMTsKLQl9Ci0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0KLXN0YXRpYyBpbnQgRXh0ZW5zaW9uU3VwcG9ydGVkKGNvbnN0IGNoYXIgKmV4dGVuc2lvbiwgY29uc3QgY2hhciAqZXh0ZW5zaW9ucykKLXsKLQljb25zdCBjaGFyICpzdGFydDsKLQljb25zdCBjaGFyICp3aGVyZSwgKnRlcm1pbmF0b3I7Ci0KLQkvKiBFeHRlbnNpb24gbmFtZXMgc2hvdWxkIG5vdCBoYXZlIHNwYWNlcy4gKi8KLQl3aGVyZSA9IFNETF9zdHJjaHIoZXh0ZW5zaW9uLCAnICcpOwotCWlmICggd2hlcmUgfHwgKmV4dGVuc2lvbiA9PSAnXDAnICkKLQkgICAgICByZXR1cm4gMDsKLQkKLQlpZiAoICEgZXh0ZW5zaW9ucyApCi0JCXJldHVybiAwOwotCi0JLyogSXQgdGFrZXMgYSBiaXQgb2YgY2FyZSB0byBiZSBmb29sLXByb29mIGFib3V0IHBhcnNpbmcgdGhlCi0JICogICAgICBPcGVuR0wgZXh0ZW5zaW9ucyBzdHJpbmcuIERvbid0IGJlIGZvb2xlZCBieSBzdWItc3RyaW5ncywKLQkgKiAgICAgICAgICAgZXRjLiAqLwotCQotCXN0YXJ0ID0gZXh0ZW5zaW9uczsKLQkKLQlmb3IgKDs7KQotCXsKLQkJd2hlcmUgPSBTRExfc3Ryc3RyKHN0YXJ0LCBleHRlbnNpb24pOwotCQlpZiAoIXdoZXJlKSBicmVhazsKLQkJCi0JCXRlcm1pbmF0b3IgPSB3aGVyZSArIFNETF9zdHJsZW4oZXh0ZW5zaW9uKTsKLQkJaWYgKHdoZXJlID09IHN0YXJ0IHx8ICood2hlcmUgLSAxKSA9PSAnICcpCi0JICAgICAgICBpZiAoKnRlcm1pbmF0b3IgPT0gJyAnIHx8ICp0ZXJtaW5hdG9yID09ICdcMCcpIHJldHVybiAxOwotCi0JCXN0YXJ0ID0gdGVybWluYXRvcjsKLQl9Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgQ2hvb3NlUGl4ZWxGb3JtYXRBUkIoX1RISVMsIGNvbnN0IGludCAqaUF0dHJpYnMsIGNvbnN0IEZMT0FUICpmQXR0cmlicykKLXsKLQlIV05EIGh3bmQ7Ci0JSERDIGhkYzsKLQlIR0xSQyBoZ2xyYzsKLQljb25zdCBjaGFyICogKFdJTkFQSSAqd2dsR2V0RXh0ZW5zaW9uc1N0cmluZ0FSQikoSERDKSA9IDA7Ci0JY29uc3QgY2hhciAqZXh0ZW5zaW9uczsKLQlpbnQgcGZvcm1hdCA9IDA7Ci0JVUlOVCBtYXRjaGVzID0gMDsKLQotCWh3bmQgPSBDcmVhdGVXaW5kb3coU0RMX0FwcG5hbWUsIFNETF9BcHBuYW1lLCBXU19QT1BVUCB8IFdTX0RJU0FCTEVELAotCSAgICAgICAgICAgICAgICAgICAgMCwgMCwgMTAsIDEwLAotCSAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgU0RMX0luc3RhbmNlLCBOVUxMKTsKLQlXSU5fRmx1c2hNZXNzYWdlUXVldWUoKTsKLQotCWhkYyA9IEdldERDKGh3bmQpOwotCi0JU2V0UGl4ZWxGb3JtYXQoaGRjLCBDaG9vc2VQaXhlbEZvcm1hdChoZGMsICZHTF9wZmQpLCAmR0xfcGZkKTsKLQotCWhnbHJjID0gdGhpcy0+Z2xfZGF0YS0+d2dsQ3JlYXRlQ29udGV4dChoZGMpOwotCWlmICggaGdscmMgKSB7Ci0JCXRoaXMtPmdsX2RhdGEtPndnbE1ha2VDdXJyZW50KGhkYywgaGdscmMpOwotCX0KLQotCXdnbEdldEV4dGVuc2lvbnNTdHJpbmdBUkIgPSAoY29uc3QgY2hhciAqIChXSU5BUEkgKikoSERDKSkKLQkJdGhpcy0+Z2xfZGF0YS0+d2dsR2V0UHJvY0FkZHJlc3MoIndnbEdldEV4dGVuc2lvbnNTdHJpbmdBUkIiKTsKLQotCWlmKCB3Z2xHZXRFeHRlbnNpb25zU3RyaW5nQVJCICkgewotCQlleHRlbnNpb25zID0gd2dsR2V0RXh0ZW5zaW9uc1N0cmluZ0FSQihoZGMpOwotCX0gZWxzZSB7Ci0JCWV4dGVuc2lvbnMgPSBOVUxMOwotCX0KLQotCXRoaXMtPmdsX2RhdGEtPldHTF9BUkJfcGl4ZWxfZm9ybWF0ID0gMDsKLQlpZiggRXh0ZW5zaW9uU3VwcG9ydGVkKCJXR0xfQVJCX3BpeGVsX2Zvcm1hdCIsIGV4dGVuc2lvbnMpICkgewotCQlCT09MIChXSU5BUEkgKndnbENob29zZVBpeGVsRm9ybWF0QVJCKShIREMgaGRjLCBjb25zdCBpbnQgKnBpQXR0cmliSUxpc3QsIGNvbnN0IEZMT0FUICpwZkF0dHJpYkZMaXN0LCBVSU5UIG5NYXhGb3JtYXRzLCBpbnQgKnBpRm9ybWF0cywgVUlOVCAqbk51bUZvcm1hdHMpOwotCQl3Z2xDaG9vc2VQaXhlbEZvcm1hdEFSQiA9Ci0JCQkoQk9PTCAoV0lOQVBJICopKEhEQywgY29uc3QgaW50ICosIGNvbnN0IEZMT0FUICosIFVJTlQsIGludCAqLCBVSU5UICopKQotCQkJdGhpcy0+Z2xfZGF0YS0+d2dsR2V0UHJvY0FkZHJlc3MoIndnbENob29zZVBpeGVsRm9ybWF0QVJCIik7Ci0JCWlmKCB3Z2xDaG9vc2VQaXhlbEZvcm1hdEFSQiAmJgotCQkgICAgd2dsQ2hvb3NlUGl4ZWxGb3JtYXRBUkIoaGRjLCBpQXR0cmlicywgZkF0dHJpYnMsIDEsICZwZm9ybWF0LCAmbWF0Y2hlcykgJiYgcGZvcm1hdCApIHsKLQkJCXRoaXMtPmdsX2RhdGEtPldHTF9BUkJfcGl4ZWxfZm9ybWF0ID0gMTsKLQkJfQotCX0KLQkKLQlpZiAoIGhnbHJjICkgewotCQl0aGlzLT5nbF9kYXRhLT53Z2xNYWtlQ3VycmVudChOVUxMLCBOVUxMKTsKLQkJdGhpcy0+Z2xfZGF0YS0+d2dsRGVsZXRlQ29udGV4dChoZ2xyYyk7Ci0JfQotCVJlbGVhc2VEQyhod25kLCBoZGMpOwotCURlc3Ryb3lXaW5kb3coaHduZCk7Ci0JV0lOX0ZsdXNoTWVzc2FnZVF1ZXVlKCk7Ci0KLQlyZXR1cm4gcGZvcm1hdDsKLX0KLQotI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KLQotaW50IFdJTl9HTF9TZXR1cFdpbmRvdyhfVEhJUykKLXsKLQlpbnQgcmV0dmFsOwotI2lmIFNETF9WSURFT19PUEVOR0wKLQlpbnQgaTsKLQlpbnQgaUF0dHJpYnNbNjRdOwotCWludCAqaUF0dHI7Ci0JZmxvYXQgZkF0dHJpYnNbMV0gPSB7IDAgfTsKLQljb25zdCBHTHVieXRlICooV0lOQVBJICpnbEdldFN0cmluZ0Z1bmMpKEdMZW51bSk7Ci0JY29uc3QgY2hhciAqd2dsZXh0OwotCi0JLyogbG9hZCB0aGUgZ2wgZHJpdmVyIGZyb20gYSBkZWZhdWx0IHBhdGggKi8KLQlpZiAoICEgdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgKSB7Ci0JCS8qIG5vIGRyaXZlciBoYXMgYmVlbiBsb2FkZWQsIHVzZSBkZWZhdWx0IChvdXJzZWx2ZXMpICovCi0JCWlmICggV0lOX0dMX0xvYWRMaWJyYXJ5KHRoaXMsIE5VTEwpIDwgMCApIHsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9yIHdpdGggb3VyIG5lZWRlZCBmb3JtYXQgKi8KLQlTRExfbWVtc2V0KCZHTF9wZmQsIDAsIHNpemVvZihHTF9wZmQpKTsKLQlHTF9wZmQublNpemUgPSBzaXplb2YoR0xfcGZkKTsKLQlHTF9wZmQublZlcnNpb24gPSAxOwotCUdMX3BmZC5kd0ZsYWdzID0gKFBGRF9EUkFXX1RPX1dJTkRPVyB8IFBGRF9TVVBQT1JUX09QRU5HTCk7Ci0JaWYgKCB0aGlzLT5nbF9jb25maWcuZG91YmxlX2J1ZmZlciApIHsKLQkJR0xfcGZkLmR3RmxhZ3MgfD0gUEZEX0RPVUJMRUJVRkZFUjsKLQl9Ci0JaWYgKCB0aGlzLT5nbF9jb25maWcuc3RlcmVvICkgewotCQlHTF9wZmQuZHdGbGFncyB8PSBQRkRfU1RFUkVPOwotCX0KLQlHTF9wZmQuaVBpeGVsVHlwZSA9IFBGRF9UWVBFX1JHQkE7Ci0JR0xfcGZkLmNDb2xvckJpdHMgPSB0aGlzLT5nbF9jb25maWcuYnVmZmVyX3NpemU7Ci0JR0xfcGZkLmNSZWRCaXRzID0gdGhpcy0+Z2xfY29uZmlnLnJlZF9zaXplOwotCUdMX3BmZC5jR3JlZW5CaXRzID0gdGhpcy0+Z2xfY29uZmlnLmdyZWVuX3NpemU7Ci0JR0xfcGZkLmNCbHVlQml0cyA9IHRoaXMtPmdsX2NvbmZpZy5ibHVlX3NpemU7Ci0JR0xfcGZkLmNBbHBoYUJpdHMgPSB0aGlzLT5nbF9jb25maWcuYWxwaGFfc2l6ZTsKLQlHTF9wZmQuY0FjY3VtUmVkQml0cyA9IHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZTsKLQlHTF9wZmQuY0FjY3VtR3JlZW5CaXRzID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemU7Ci0JR0xfcGZkLmNBY2N1bUJsdWVCaXRzID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2JsdWVfc2l6ZTsKLQlHTF9wZmQuY0FjY3VtQWxwaGFCaXRzID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemU7Ci0JR0xfcGZkLmNBY2N1bUJpdHMgPQotCQkoR0xfcGZkLmNBY2N1bVJlZEJpdHMgKyBHTF9wZmQuY0FjY3VtR3JlZW5CaXRzICsKLQkJIEdMX3BmZC5jQWNjdW1CbHVlQml0cyArIEdMX3BmZC5jQWNjdW1BbHBoYUJpdHMpOwotCUdMX3BmZC5jRGVwdGhCaXRzID0gdGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemU7Ci0JR0xfcGZkLmNTdGVuY2lsQml0cyA9IHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemU7Ci0KLQkvKiBzZXR1cCBXR0xfQVJCX3BpeGVsX2Zvcm1hdCBhdHRyaWJzICovCi0JaUF0dHIgPSAmaUF0dHJpYnNbMF07Ci0KLQkqaUF0dHIrKyA9IFdHTF9EUkFXX1RPX1dJTkRPV19BUkI7Ci0JKmlBdHRyKysgPSBHTF9UUlVFOwotCSppQXR0cisrID0gV0dMX0FDQ0VMRVJBVElPTl9BUkI7Ci0JKmlBdHRyKysgPSBXR0xfRlVMTF9BQ0NFTEVSQVRJT05fQVJCOwotCSppQXR0cisrID0gV0dMX1JFRF9CSVRTX0FSQjsKLQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5yZWRfc2l6ZTsKLQkqaUF0dHIrKyA9IFdHTF9HUkVFTl9CSVRTX0FSQjsKLQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5ncmVlbl9zaXplOwotCSppQXR0cisrID0gV0dMX0JMVUVfQklUU19BUkI7Ci0JKmlBdHRyKysgPSB0aGlzLT5nbF9jb25maWcuYmx1ZV9zaXplOwotCQotCWlmICggdGhpcy0+Z2xfY29uZmlnLmFscGhhX3NpemUgKSB7Ci0JCSppQXR0cisrID0gV0dMX0FMUEhBX0JJVFNfQVJCOwotCQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5hbHBoYV9zaXplOwotCX0KLQotCSppQXR0cisrID0gV0dMX0RPVUJMRV9CVUZGRVJfQVJCOwotCSppQXR0cisrID0gdGhpcy0+Z2xfY29uZmlnLmRvdWJsZV9idWZmZXI7Ci0KLQkqaUF0dHIrKyA9IFdHTF9ERVBUSF9CSVRTX0FSQjsKLQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplOwotCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplICkgewotCQkqaUF0dHIrKyA9IFdHTF9TVEVOQ0lMX0JJVFNfQVJCOwotCQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemU7Ci0JfQotCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemUgKSB7Ci0JCSppQXR0cisrID0gV0dMX0FDQ1VNX1JFRF9CSVRTX0FSQjsKLQkJKmlBdHRyKysgPSB0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemU7Ci0JfQotCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjdW1fZ3JlZW5fc2l6ZSApIHsKLQkJKmlBdHRyKysgPSBXR0xfQUNDVU1fR1JFRU5fQklUU19BUkI7Ci0JCSppQXR0cisrID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemU7Ci0JfQotCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplICkgewotCQkqaUF0dHIrKyA9IFdHTF9BQ0NVTV9CTFVFX0JJVFNfQVJCOwotCQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemU7Ci0JfQotCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZSApIHsKLQkJKmlBdHRyKysgPSBXR0xfQUNDVU1fQUxQSEFfQklUU19BUkI7Ci0JCSppQXR0cisrID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemU7Ci0JfQotCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuc3RlcmVvICkgewotCQkqaUF0dHIrKyA9IFdHTF9TVEVSRU9fQVJCOwotCQkqaUF0dHIrKyA9IEdMX1RSVUU7Ci0JfQotCi0JaWYgKCB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVidWZmZXJzICkgewotCQkqaUF0dHIrKyA9IFdHTF9TQU1QTEVfQlVGRkVSU19BUkI7Ci0JCSppQXR0cisrID0gdGhpcy0+Z2xfY29uZmlnLm11bHRpc2FtcGxlYnVmZmVyczsKLQl9Ci0KLQlpZiAoIHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXMgKSB7Ci0JCSppQXR0cisrID0gV0dMX1NBTVBMRVNfQVJCOwotCQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXM7Ci0JfQotCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjZWxlcmF0ZWQgPj0gMCApIHsKLQkJKmlBdHRyKysgPSBXR0xfQUNDRUxFUkFUSU9OX0FSQjsKLQkJKmlBdHRyKysgPSAodGhpcy0+Z2xfY29uZmlnLmFjY2VsZXJhdGVkID8gV0dMX0dFTkVSSUNfQUNDRUxFUkFUSU9OX0FSQiA6IFdHTF9OT19BQ0NFTEVSQVRJT05fQVJCKTsKLQl9Ci0KLQkqaUF0dHIgPSAwOwotCi0JZm9yICggaT0wOyA7ICsraSApIHsKLQkJLyogR2V0IHRoZSB3aW5kb3cgZGV2aWNlIGNvbnRleHQgZm9yIG91ciBPcGVuR0wgZHJhd2luZyAqLwotCQlHTF9oZGMgPSBHZXREQyhTRExfV2luZG93KTsKLQkJaWYgKCBHTF9oZGMgPT0gTlVMTCApIHsKLQkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGdldCBEQyBmb3IgU0RMX1dpbmRvdyIpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCi0JCS8qIENob29zZSBhbmQgc2V0IHRoZSBjbG9zZXN0IGF2YWlsYWJsZSBwaXhlbCBmb3JtYXQgKi8KLQkJcGl4ZWxfZm9ybWF0ID0gQ2hvb3NlUGl4ZWxGb3JtYXRBUkIodGhpcywgaUF0dHJpYnMsIGZBdHRyaWJzKTsKLQkJaWYgKCAhcGl4ZWxfZm9ybWF0ICkgewotCQkJcGl4ZWxfZm9ybWF0ID0gQ2hvb3NlUGl4ZWxGb3JtYXQoR0xfaGRjLCAmR0xfcGZkKTsKLQkJfQotCQlpZiAoICFwaXhlbF9mb3JtYXQgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIk5vIG1hdGNoaW5nIEdMIHBpeGVsIGZvcm1hdCBhdmFpbGFibGUiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJaWYgKCAhU2V0UGl4ZWxGb3JtYXQoR0xfaGRjLCBwaXhlbF9mb3JtYXQsICZHTF9wZmQpICkgewotCQkJaWYgKCBpID09IDAgKSB7Ci0JCQkJLyogRmlyc3QgdGltZSB0aHJvdWdoLCB0cnkgcmVzZXR0aW5nIHRoZSB3aW5kb3cgKi8KLQkJCQlpZiAoIFdJTl9HTF9SZXNldFdpbmRvdyh0aGlzKSA8IDAgKSB7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gc2V0IEhEQyBwaXhlbCBmb3JtYXQiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJLyogV2UgZWl0aGVyIHN1Y2NlZWRlZCBvciBmYWlsZWQgYnkgdGhpcyBwb2ludCAqLwotCQlicmVhazsKLQl9Ci0JRGVzY3JpYmVQaXhlbEZvcm1hdChHTF9oZGMsIHBpeGVsX2Zvcm1hdCwgc2l6ZW9mKEdMX3BmZCksICZHTF9wZmQpOwotCi0JR0xfaHJjID0gdGhpcy0+Z2xfZGF0YS0+d2dsQ3JlYXRlQ29udGV4dChHTF9oZGMpOwotCWlmICggR0xfaHJjID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBHTCBjb250ZXh0Iik7Ci0JCXJldHVybigtMSk7Ci0JfQotCWlmICggV0lOX0dMX01ha2VDdXJyZW50KHRoaXMpIDwgMCApIHsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JZ2xfYWN0aXZlID0gMTsKLQotCS8qIEdldCB0aGUgd2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQiBwb2ludGVyIGZvciB0aGUgY29udGV4dCAqLwotCWlmICggdGhpcy0+Z2xfZGF0YS0+V0dMX0FSQl9waXhlbF9mb3JtYXQgKSB7Ci0JCXRoaXMtPmdsX2RhdGEtPndnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIgPQotCQkJKEJPT0wgKFdJTkFQSSAqKShIREMsIGludCwgaW50LCBVSU5ULCBjb25zdCBpbnQgKiwgaW50ICopKQotCQkJdGhpcy0+Z2xfZGF0YS0+d2dsR2V0UHJvY0FkZHJlc3MoIndnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIiKTsKLQl9IGVsc2UgewotCQl0aGlzLT5nbF9kYXRhLT53Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCID0gTlVMTDsKLQl9Ci0KLQkvKiBWc3luYyBjb250cm9sIHVuZGVyIFdpbmRvd3MuICBDaGVja2luZyBnbEdldFN0cmluZyBoZXJlIGlzCi0JICogc29tZXdoYXQgYSBkb2N1bWVudGVkIGFuZCByZWxpYWJsZSBoYWNrIC0gaXQgd2FzIG9yaWdpbmFsbHkKLQkgKiBhcyBhIGZlYXR1cmUgYWRkZWQgYnkgbWlzdGFrZSwgYnV0IHNpbmNlIHNvIG1hbnkgcGVvcGxlIHJlbHkKLQkgKiBvbiBpdCwgaXQgd2lsbCBub3QgYmUgcmVtb3ZlZC4gIHN0cnN0ciBzaG91bGQgYmUgc2FmZSBoZXJlLiovCi0JZ2xHZXRTdHJpbmdGdW5jID0gV0lOX0dMX0dldFByb2NBZGRyZXNzKHRoaXMsICJnbEdldFN0cmluZyIpOwotCWlmICggZ2xHZXRTdHJpbmdGdW5jICkgewotCQl3Z2xleHQgPSAoY29uc3QgY2hhciAqKWdsR2V0U3RyaW5nRnVuYyhHTF9FWFRFTlNJT05TKTsKLQl9IGVsc2UgewotCQkvKiBVaCBvaCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZyBoZXJlLi4uICovCi0JCXdnbGV4dCA9IE5VTEw7Ci0JfQotCWlmICggd2dsZXh0ICYmIFNETF9zdHJzdHIod2dsZXh0LCAiV0dMX0VYVF9zd2FwX2NvbnRyb2wiKSApIHsKLQkJdGhpcy0+Z2xfZGF0YS0+d2dsU3dhcEludGVydmFsRVhUID0gV0lOX0dMX0dldFByb2NBZGRyZXNzKHRoaXMsICJ3Z2xTd2FwSW50ZXJ2YWxFWFQiKTsKLQkJdGhpcy0+Z2xfZGF0YS0+d2dsR2V0U3dhcEludGVydmFsRVhUID0gV0lOX0dMX0dldFByb2NBZGRyZXNzKHRoaXMsICJ3Z2xHZXRTd2FwSW50ZXJ2YWxFWFQiKTsKLQl9IGVsc2UgewotCQl0aGlzLT5nbF9kYXRhLT53Z2xTd2FwSW50ZXJ2YWxFWFQgPSBOVUxMOwotCQl0aGlzLT5nbF9kYXRhLT53Z2xHZXRTd2FwSW50ZXJ2YWxFWFQgPSBOVUxMOwotCX0KLQlpZiAoIHRoaXMtPmdsX2NvbmZpZy5zd2FwX2NvbnRyb2wgPj0gMCApIHsKLQkJaWYgKCB0aGlzLT5nbF9kYXRhLT53Z2xTd2FwSW50ZXJ2YWxFWFQgKSB7Ci0JCQl0aGlzLT5nbF9kYXRhLT53Z2xTd2FwSW50ZXJ2YWxFWFQodGhpcy0+Z2xfY29uZmlnLnN3YXBfY29udHJvbCk7Ci0JCX0KLQl9Ci0jZWxzZQotCVNETF9TZXRFcnJvcigiV0lOIGRyaXZlciBub3QgY29uZmlndXJlZCB3aXRoIE9wZW5HTCIpOwotI2VuZGlmCi0JaWYgKCBnbF9hY3RpdmUgKSB7Ci0JCXJldHZhbCA9IDA7Ci0JfSBlbHNlIHsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCXJldHVybihyZXR2YWwpOwotfQotCi12b2lkIFdJTl9HTF9TaHV0RG93bihfVEhJUykKLXsKLSNpZiBTRExfVklERU9fT1BFTkdMCi0JLyogQ2xlYW4gdXAgT3BlbkdMICovCi0JaWYgKCBHTF9ocmMgKSB7Ci0JCXRoaXMtPmdsX2RhdGEtPndnbE1ha2VDdXJyZW50KE5VTEwsIE5VTEwpOwotCQl0aGlzLT5nbF9kYXRhLT53Z2xEZWxldGVDb250ZXh0KEdMX2hyYyk7Ci0JCUdMX2hyYyA9IE5VTEw7Ci0JfQotCWlmICggR0xfaGRjICkgewotCQlSZWxlYXNlREMoU0RMX1dpbmRvdywgR0xfaGRjKTsKLQkJR0xfaGRjID0gTlVMTDsKLQl9Ci0JZ2xfYWN0aXZlID0gMDsKLQotCVdJTl9HTF9VbmxvYWRMaWJyYXJ5KHRoaXMpOwotI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KLX0KLQotI2lmIFNETF9WSURFT19PUEVOR0wKLQotLyogTWFrZSB0aGUgY3VycmVudCBjb250ZXh0IGFjdGl2ZSAqLwotaW50IFdJTl9HTF9NYWtlQ3VycmVudChfVEhJUykKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gMDsKLQlpZiAoICEgdGhpcy0+Z2xfZGF0YS0+d2dsTWFrZUN1cnJlbnQoR0xfaGRjLCBHTF9ocmMpICkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBtYWtlIEdMIGNvbnRleHQgY3VycmVudCIpOwotCQlyZXR2YWwgPSAtMTsKLQl9Ci0JcmV0dXJuKHJldHZhbCk7Ci19Ci0KLS8qIEdldCBhdHRyaWJ1dGUgZGF0YSBmcm9tIHdnbC4gKi8KLWludCBXSU5fR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKGF0dHJpYiA9PSBTRExfR0xfU1dBUF9DT05UUk9MKSB7Ci0JCWlmICggdGhpcy0+Z2xfZGF0YS0+d2dsR2V0U3dhcEludGVydmFsRVhUICkgewotCQkJKnZhbHVlID0gdGhpcy0+Z2xfZGF0YS0+d2dsR2V0U3dhcEludGVydmFsRVhUKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCB0aGlzLT5nbF9kYXRhLT53Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCICkgewotCQlpbnQgd2dsX2F0dHJpYjsKLQotCQlzd2l0Y2goYXR0cmliKSB7Ci0JCSAgICBjYXNlIFNETF9HTF9SRURfU0laRToKLQkJCXdnbF9hdHRyaWIgPSBXR0xfUkVEX0JJVFNfQVJCOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFNETF9HTF9HUkVFTl9TSVpFOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9HUkVFTl9CSVRTX0FSQjsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBTRExfR0xfQkxVRV9TSVpFOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9CTFVFX0JJVFNfQVJCOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFNETF9HTF9BTFBIQV9TSVpFOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9BTFBIQV9CSVRTX0FSQjsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBTRExfR0xfRE9VQkxFQlVGRkVSOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9ET1VCTEVfQlVGRkVSX0FSQjsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBTRExfR0xfQlVGRkVSX1NJWkU6Ci0JCQl3Z2xfYXR0cmliID0gV0dMX0NPTE9SX0JJVFNfQVJCOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFNETF9HTF9ERVBUSF9TSVpFOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9ERVBUSF9CSVRTX0FSQjsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBTRExfR0xfU1RFTkNJTF9TSVpFOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9TVEVOQ0lMX0JJVFNfQVJCOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFNETF9HTF9BQ0NVTV9SRURfU0laRToKLQkJCXdnbF9hdHRyaWIgPSBXR0xfQUNDVU1fUkVEX0JJVFNfQVJCOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFNETF9HTF9BQ0NVTV9HUkVFTl9TSVpFOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9BQ0NVTV9HUkVFTl9CSVRTX0FSQjsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBTRExfR0xfQUNDVU1fQkxVRV9TSVpFOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9BQ0NVTV9CTFVFX0JJVFNfQVJCOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFNETF9HTF9BQ0NVTV9BTFBIQV9TSVpFOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9BQ0NVTV9BTFBIQV9CSVRTX0FSQjsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBTRExfR0xfU1RFUkVPOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9TVEVSRU9fQVJCOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFNETF9HTF9NVUxUSVNBTVBMRUJVRkZFUlM6Ci0JCQl3Z2xfYXR0cmliID0gV0dMX1NBTVBMRV9CVUZGRVJTX0FSQjsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBTRExfR0xfTVVMVElTQU1QTEVTQU1QTEVTOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9TQU1QTEVTX0FSQjsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBTRExfR0xfQUNDRUxFUkFURURfVklTVUFMOgotCQkJd2dsX2F0dHJpYiA9IFdHTF9BQ0NFTEVSQVRJT05fQVJCOwotCQkJdGhpcy0+Z2xfZGF0YS0+d2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQihHTF9oZGMsIHBpeGVsX2Zvcm1hdCwgMCwgMSwgJndnbF9hdHRyaWIsIHZhbHVlKTsKLQkJCWlmICggKnZhbHVlID09IFdHTF9OT19BQ0NFTEVSQVRJT05fQVJCICkgewotCQkJCSp2YWx1ZSA9IFNETF9GQUxTRTsKLQkJCX0gZWxzZSB7Ci0JCQkJKnZhbHVlID0gU0RMX1RSVUU7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJICAgIGRlZmF1bHQ6Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCXRoaXMtPmdsX2RhdGEtPndnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIoR0xfaGRjLCBwaXhlbF9mb3JtYXQsIDAsIDEsICZ3Z2xfYXR0cmliLCB2YWx1ZSk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dmFsID0gMDsKLQlzd2l0Y2ggKCBhdHRyaWIgKSB7Ci0JICAgIGNhc2UgU0RMX0dMX1JFRF9TSVpFOgotCQkqdmFsdWUgPSBHTF9wZmQuY1JlZEJpdHM7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9HTF9HUkVFTl9TSVpFOgotCQkqdmFsdWUgPSBHTF9wZmQuY0dyZWVuQml0czsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0JMVUVfU0laRToKLQkJKnZhbHVlID0gR0xfcGZkLmNCbHVlQml0czsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0FMUEhBX1NJWkU6Ci0JCSp2YWx1ZSA9IEdMX3BmZC5jQWxwaGFCaXRzOwotCQlicmVhazsKLQkgICAgY2FzZSBTRExfR0xfRE9VQkxFQlVGRkVSOgotCQlpZiAoIEdMX3BmZC5kd0ZsYWdzICYgUEZEX0RPVUJMRUJVRkZFUiApIHsKLQkJCSp2YWx1ZSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQkqdmFsdWUgPSAwOwotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9HTF9CVUZGRVJfU0laRToKLQkJKnZhbHVlID0gR0xfcGZkLmNDb2xvckJpdHM7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9HTF9ERVBUSF9TSVpFOgotCQkqdmFsdWUgPSBHTF9wZmQuY0RlcHRoQml0czsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX1NURU5DSUxfU0laRToKLQkJKnZhbHVlID0gR0xfcGZkLmNTdGVuY2lsQml0czsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0FDQ1VNX1JFRF9TSVpFOgotCQkqdmFsdWUgPSBHTF9wZmQuY0FjY3VtUmVkQml0czsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkU6Ci0JCSp2YWx1ZSA9IEdMX3BmZC5jQWNjdW1HcmVlbkJpdHM7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9HTF9BQ0NVTV9CTFVFX1NJWkU6Ci0JCSp2YWx1ZSA9IEdMX3BmZC5jQWNjdW1CbHVlQml0czsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0FMUEhBX1NJWkU6Ci0JCSp2YWx1ZSA9IEdMX3BmZC5jQWNjdW1BbHBoYUJpdHM7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9HTF9TVEVSRU86Ci0JCWlmICggR0xfcGZkLmR3RmxhZ3MgJiBQRkRfU1RFUkVPICkgewotCQkJKnZhbHVlID0gMTsKLQkJfSBlbHNlIHsKLQkJCSp2YWx1ZSA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX01VTFRJU0FNUExFQlVGRkVSUzoKLQkJKnZhbHVlID0gMDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX01VTFRJU0FNUExFU0FNUExFUzoKLQkJKnZhbHVlID0gMTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX1NXQVBfQ09OVFJPTDoKLQkJaWYgKCB0aGlzLT5nbF9kYXRhLT53Z2xHZXRTd2FwSW50ZXJ2YWxFWFQgKSB7Ci0JCQkqdmFsdWUgPSB0aGlzLT5nbF9kYXRhLT53Z2xHZXRTd2FwSW50ZXJ2YWxFWFQoKTsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlyZXR2YWwgPSAtMTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXZvaWQgV0lOX0dMX1N3YXBCdWZmZXJzKF9USElTKQotewotCVN3YXBCdWZmZXJzKEdMX2hkYyk7Ci19Ci0KLXZvaWQgV0lOX0dMX1VubG9hZExpYnJhcnkoX1RISVMpCi17Ci0JaWYgKCB0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCApIHsKLQkJRnJlZUxpYnJhcnkoKEhNT0RVTEUpdGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUpOwotCi0JCXRoaXMtPmdsX2RhdGEtPndnbEdldFByb2NBZGRyZXNzID0gTlVMTDsKLQkJdGhpcy0+Z2xfZGF0YS0+d2dsQ3JlYXRlQ29udGV4dCA9IE5VTEw7Ci0JCXRoaXMtPmdsX2RhdGEtPndnbERlbGV0ZUNvbnRleHQgPSBOVUxMOwotCQl0aGlzLT5nbF9kYXRhLT53Z2xNYWtlQ3VycmVudCA9IE5VTEw7Ci0JCXRoaXMtPmdsX2RhdGEtPndnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIgPSBOVUxMOwotCQl0aGlzLT5nbF9kYXRhLT53Z2xTd2FwSW50ZXJ2YWxFWFQgPSBOVUxMOwotCQl0aGlzLT5nbF9kYXRhLT53Z2xHZXRTd2FwSW50ZXJ2YWxFWFQgPSBOVUxMOwotCi0JCXRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlID0gTlVMTDsKLQkJdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAwOwotCX0KLX0KLQotLyogUGFzc2luZyBhIE5VTEwgcGF0aCBtZWFucyBsb2FkIHBvaW50ZXJzIGZyb20gdGhlIGFwcGxpY2F0aW9uICovCi1pbnQgV0lOX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyKiBwYXRoKSAKLXsKLQlITU9EVUxFIGhhbmRsZTsKLQotIAlpZiAoIGdsX2FjdGl2ZSApIHsKLSAJCVNETF9TZXRFcnJvcigiT3BlbkdMIGNvbnRleHQgYWxyZWFkeSBjcmVhdGVkIik7Ci0gCQlyZXR1cm4gLTE7Ci0gCX0KLQotCWlmICggcGF0aCA9PSBOVUxMICkgewotCQlwYXRoID0gREVGQVVMVF9HTF9EUklWRVJfUEFUSDsKLQl9Ci0JaGFuZGxlID0gTG9hZExpYnJhcnkocGF0aCk7Ci0JaWYgKCBoYW5kbGUgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZCBub3QgbG9hZCBPcGVuR0wgbGlicmFyeSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogVW5sb2FkIHRoZSBvbGQgZHJpdmVyIGFuZCByZXNldCB0aGUgcG9pbnRlcnMgKi8KLQlXSU5fR0xfVW5sb2FkTGlicmFyeSh0aGlzKTsKLQotCS8qIExvYWQgbmV3IGZ1bmN0aW9uIHBvaW50ZXJzICovCi0JU0RMX21lbXNldCh0aGlzLT5nbF9kYXRhLCAwLCBzaXplb2YoKnRoaXMtPmdsX2RhdGEpKTsKLQl0aGlzLT5nbF9kYXRhLT53Z2xHZXRQcm9jQWRkcmVzcyA9ICh2b2lkICogKFdJTkFQSSAqKShjb25zdCBjaGFyICopKQotCQlHZXRQcm9jQWRkcmVzcyhoYW5kbGUsICJ3Z2xHZXRQcm9jQWRkcmVzcyIpOwotCXRoaXMtPmdsX2RhdGEtPndnbENyZWF0ZUNvbnRleHQgPSAoSEdMUkMgKFdJTkFQSSAqKShIREMpKQotCQlHZXRQcm9jQWRkcmVzcyhoYW5kbGUsICJ3Z2xDcmVhdGVDb250ZXh0Iik7Ci0JdGhpcy0+Z2xfZGF0YS0+d2dsRGVsZXRlQ29udGV4dCA9IChCT09MIChXSU5BUEkgKikoSEdMUkMpKQotCQlHZXRQcm9jQWRkcmVzcyhoYW5kbGUsICJ3Z2xEZWxldGVDb250ZXh0Iik7Ci0JdGhpcy0+Z2xfZGF0YS0+d2dsTWFrZUN1cnJlbnQgPSAoQk9PTCAoV0lOQVBJICopKEhEQywgSEdMUkMpKQotCQlHZXRQcm9jQWRkcmVzcyhoYW5kbGUsICJ3Z2xNYWtlQ3VycmVudCIpOwotCXRoaXMtPmdsX2RhdGEtPndnbFN3YXBJbnRlcnZhbEVYVCA9ICh2b2lkIChXSU5BUEkgKikoaW50KSkKLQkJR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCAid2dsU3dhcEludGVydmFsRVhUIik7Ci0JdGhpcy0+Z2xfZGF0YS0+d2dsR2V0U3dhcEludGVydmFsRVhUID0gKGludCAoV0lOQVBJICopKHZvaWQpKQotCQlHZXRQcm9jQWRkcmVzcyhoYW5kbGUsICJ3Z2xHZXRTd2FwSW50ZXJ2YWxFWFQiKTsKLQotCWlmICggKHRoaXMtPmdsX2RhdGEtPndnbEdldFByb2NBZGRyZXNzID09IE5VTEwpIHx8Ci0JICAgICAodGhpcy0+Z2xfZGF0YS0+d2dsQ3JlYXRlQ29udGV4dCA9PSBOVUxMKSB8fAotCSAgICAgKHRoaXMtPmdsX2RhdGEtPndnbERlbGV0ZUNvbnRleHQgPT0gTlVMTCkgfHwKLQkgICAgICh0aGlzLT5nbF9kYXRhLT53Z2xNYWtlQ3VycmVudCA9PSBOVUxMKSApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZCBub3QgcmV0cmlldmUgT3BlbkdMIGZ1bmN0aW9ucyIpOwotCQlGcmVlTGlicmFyeShoYW5kbGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JdGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUgPSBoYW5kbGU7Ci0JU0RMX3N0cmxjcHkodGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoLCBwYXRoLCBTRExfYXJyYXlzaXplKHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCkpOwotCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCAqV0lOX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyKiBwcm9jKQotewotCXZvaWQgKmZ1bmM7Ci0KLQkvKiBUaGlzIGlzIHRvIHBpY2sgdXAgZXh0ZW5zaW9ucyAqLwotCWZ1bmMgPSB0aGlzLT5nbF9kYXRhLT53Z2xHZXRQcm9jQWRkcmVzcyhwcm9jKTsKLQlpZiAoICEgZnVuYyApIHsKLQkJLyogVGhpcyBpcyBwcm9iYWJseSBhIG5vcm1hbCBHTCBmdW5jdGlvbiAqLwotCQlmdW5jID0gR2V0UHJvY0FkZHJlc3ModGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUsIHByb2MpOwotCX0KLQlyZXR1cm4gZnVuYzsKLX0KLQotI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luY29tbW9uL1NETF93aW5nbF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfd2luZ2xfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAwYmVjLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luY29tbW9uL1NETF93aW5nbF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFdHTCBpbXBsZW1lbnRhdGlvbiBvZiBTREwgT3BlbkdMIHN1cHBvcnQgKi8KLQotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0KLXN0cnVjdCBTRExfUHJpdmF0ZUdMRGF0YSB7Ci0gICAgaW50IGdsX2FjdGl2ZTsgLyogdG8gc3RvcCBzd2l0Y2hpbmcgZHJpdmVycyB3aGlsZSB3ZSBoYXZlIGEgdmFsaWQgY29udGV4dCAqLwotCi0jaWYgU0RMX1ZJREVPX09QRU5HTAotICAgIFBJWEVMRk9STUFUREVTQ1JJUFRPUiBHTF9wZmQ7Ci0gICAgSERDIEdMX2hkYzsKLSAgICBIR0xSQyBHTF9ocmM7Ci0gICAgaW50IHBpeGVsX2Zvcm1hdDsKLSAgICBpbnQgV0dMX0FSQl9waXhlbF9mb3JtYXQ7Ci0KLSAgICB2b2lkICogKFdJTkFQSSAqd2dsR2V0UHJvY0FkZHJlc3MpKGNvbnN0IGNoYXIgKnByb2MpOwotCi0gICAgSEdMUkMgKFdJTkFQSSAqd2dsQ3JlYXRlQ29udGV4dCkoSERDIGhkYyk7Ci0KLSAgICBCT09MIChXSU5BUEkgKndnbERlbGV0ZUNvbnRleHQpKEhHTFJDIGhnbHJjKTsKLQotICAgIEJPT0wgKFdJTkFQSSAqd2dsTWFrZUN1cnJlbnQpKEhEQyBoZGMsIEhHTFJDIGhnbHJjKTsKLSAgIAotICAgIEJPT0wgKFdJTkFQSSAqd2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQikoSERDIGhkYywgaW50IGlQaXhlbEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpTGF5ZXJQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbkF0dHJpYnV0ZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpwaUF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBpVmFsdWVzKTsKLSAgICB2b2lkIChXSU5BUEkgKndnbFN3YXBJbnRlcnZhbEVYVCkoaW50IGludGVydmFsKTsKLSAgICBpbnQgKFdJTkFQSSAqd2dsR2V0U3dhcEludGVydmFsRVhUKSh2b2lkKTsKLSNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCi19OwotCi0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgZ2xfYWN0aXZlCSh0aGlzLT5nbF9kYXRhLT5nbF9hY3RpdmUpCi0jZGVmaW5lIEdMX3BmZAkJKHRoaXMtPmdsX2RhdGEtPkdMX3BmZCkKLSNkZWZpbmUgR0xfaGRjCQkodGhpcy0+Z2xfZGF0YS0+R0xfaGRjKQotI2RlZmluZSBHTF9ocmMJCSh0aGlzLT5nbF9kYXRhLT5HTF9ocmMpCi0jZGVmaW5lIHBpeGVsX2Zvcm1hdAkodGhpcy0+Z2xfZGF0YS0+cGl4ZWxfZm9ybWF0KQotCi0vKiBPcGVuR0wgZnVuY3Rpb25zICovCi1leHRlcm4gaW50IFdJTl9HTF9TZXR1cFdpbmRvdyhfVEhJUyk7Ci1leHRlcm4gdm9pZCBXSU5fR0xfU2h1dERvd24oX1RISVMpOwotI2lmIFNETF9WSURFT19PUEVOR0wKLWV4dGVybiBpbnQgV0lOX0dMX01ha2VDdXJyZW50KF9USElTKTsKLWV4dGVybiBpbnQgV0lOX0dMX0dldEF0dHJpYnV0ZShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOwotZXh0ZXJuIHZvaWQgV0lOX0dMX1N3YXBCdWZmZXJzKF9USElTKTsKLWV4dGVybiB2b2lkIFdJTl9HTF9VbmxvYWRMaWJyYXJ5KF9USElTKTsKLWV4dGVybiBpbnQgV0lOX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyKiBwYXRoKTsKLWV4dGVybiB2b2lkICpXSU5fR0xfR2V0UHJvY0FkZHJlc3MoX1RISVMsIGNvbnN0IGNoYXIqIHByb2MpOwotI2VuZGlmCi0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0KLSNpZm5kZWYgV0dMX0FSQl9waXhlbF9mb3JtYXQKLSNkZWZpbmUgV0dMX05VTUJFUl9QSVhFTF9GT1JNQVRTX0FSQiAgIDB4MjAwMAotI2RlZmluZSBXR0xfRFJBV19UT19XSU5ET1dfQVJCICAgICAgICAgMHgyMDAxCi0jZGVmaW5lIFdHTF9EUkFXX1RPX0JJVE1BUF9BUkIgICAgICAgICAweDIwMDIKLSNkZWZpbmUgV0dMX0FDQ0VMRVJBVElPTl9BUkIgICAgICAgICAgIDB4MjAwMwotI2RlZmluZSBXR0xfTkVFRF9QQUxFVFRFX0FSQiAgICAgICAgICAgMHgyMDA0Ci0jZGVmaW5lIFdHTF9ORUVEX1NZU1RFTV9QQUxFVFRFX0FSQiAgICAweDIwMDUKLSNkZWZpbmUgV0dMX1NXQVBfTEFZRVJfQlVGRkVSU19BUkIgICAgIDB4MjAwNgotI2RlZmluZSBXR0xfU1dBUF9NRVRIT0RfQVJCICAgICAgICAgICAgMHgyMDA3Ci0jZGVmaW5lIFdHTF9OVU1CRVJfT1ZFUkxBWVNfQVJCICAgICAgICAweDIwMDgKLSNkZWZpbmUgV0dMX05VTUJFUl9VTkRFUkxBWVNfQVJCICAgICAgIDB4MjAwOQotI2RlZmluZSBXR0xfVFJBTlNQQVJFTlRfQVJCICAgICAgICAgICAgMHgyMDBBCi0jZGVmaW5lIFdHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUVfQVJCICAweDIwMzcKLSNkZWZpbmUgV0dMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFX0FSQiAweDIwMzgKLSNkZWZpbmUgV0dMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUVfQVJCIDB4MjAzOQotI2RlZmluZSBXR0xfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUVfQVJCIDB4MjAzQQotI2RlZmluZSBXR0xfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUVfQVJCIDB4MjAzQgotI2RlZmluZSBXR0xfU0hBUkVfREVQVEhfQVJCICAgICAgICAgICAgMHgyMDBDCi0jZGVmaW5lIFdHTF9TSEFSRV9TVEVOQ0lMX0FSQiAgICAgICAgICAweDIwMEQKLSNkZWZpbmUgV0dMX1NIQVJFX0FDQ1VNX0FSQiAgICAgICAgICAgIDB4MjAwRQotI2RlZmluZSBXR0xfU1VQUE9SVF9HRElfQVJCICAgICAgICAgICAgMHgyMDBGCi0jZGVmaW5lIFdHTF9TVVBQT1JUX09QRU5HTF9BUkIgICAgICAgICAweDIwMTAKLSNkZWZpbmUgV0dMX0RPVUJMRV9CVUZGRVJfQVJCICAgICAgICAgIDB4MjAxMQotI2RlZmluZSBXR0xfU1RFUkVPX0FSQiAgICAgICAgICAgICAgICAgMHgyMDEyCi0jZGVmaW5lIFdHTF9QSVhFTF9UWVBFX0FSQiAgICAgICAgICAgICAweDIwMTMKLSNkZWZpbmUgV0dMX0NPTE9SX0JJVFNfQVJCICAgICAgICAgICAgIDB4MjAxNAotI2RlZmluZSBXR0xfUkVEX0JJVFNfQVJCICAgICAgICAgICAgICAgMHgyMDE1Ci0jZGVmaW5lIFdHTF9SRURfU0hJRlRfQVJCICAgICAgICAgICAgICAweDIwMTYKLSNkZWZpbmUgV0dMX0dSRUVOX0JJVFNfQVJCICAgICAgICAgICAgIDB4MjAxNwotI2RlZmluZSBXR0xfR1JFRU5fU0hJRlRfQVJCICAgICAgICAgICAgMHgyMDE4Ci0jZGVmaW5lIFdHTF9CTFVFX0JJVFNfQVJCICAgICAgICAgICAgICAweDIwMTkKLSNkZWZpbmUgV0dMX0JMVUVfU0hJRlRfQVJCICAgICAgICAgICAgIDB4MjAxQQotI2RlZmluZSBXR0xfQUxQSEFfQklUU19BUkIgICAgICAgICAgICAgMHgyMDFCCi0jZGVmaW5lIFdHTF9BTFBIQV9TSElGVF9BUkIgICAgICAgICAgICAweDIwMUMKLSNkZWZpbmUgV0dMX0FDQ1VNX0JJVFNfQVJCICAgICAgICAgICAgIDB4MjAxRAotI2RlZmluZSBXR0xfQUNDVU1fUkVEX0JJVFNfQVJCICAgICAgICAgMHgyMDFFCi0jZGVmaW5lIFdHTF9BQ0NVTV9HUkVFTl9CSVRTX0FSQiAgICAgICAweDIwMUYKLSNkZWZpbmUgV0dMX0FDQ1VNX0JMVUVfQklUU19BUkIgICAgICAgIDB4MjAyMAotI2RlZmluZSBXR0xfQUNDVU1fQUxQSEFfQklUU19BUkIgICAgICAgMHgyMDIxCi0jZGVmaW5lIFdHTF9ERVBUSF9CSVRTX0FSQiAgICAgICAgICAgICAweDIwMjIKLSNkZWZpbmUgV0dMX1NURU5DSUxfQklUU19BUkIgICAgICAgICAgIDB4MjAyMwotI2RlZmluZSBXR0xfQVVYX0JVRkZFUlNfQVJCICAgICAgICAgICAgMHgyMDI0Ci0jZGVmaW5lIFdHTF9OT19BQ0NFTEVSQVRJT05fQVJCICAgICAgICAweDIwMjUKLSNkZWZpbmUgV0dMX0dFTkVSSUNfQUNDRUxFUkFUSU9OX0FSQiAgIDB4MjAyNgotI2RlZmluZSBXR0xfRlVMTF9BQ0NFTEVSQVRJT05fQVJCICAgICAgMHgyMDI3Ci0jZGVmaW5lIFdHTF9TV0FQX0VYQ0hBTkdFX0FSQiAgICAgICAgICAweDIwMjgKLSNkZWZpbmUgV0dMX1NXQVBfQ09QWV9BUkIgICAgICAgICAgICAgIDB4MjAyOQotI2RlZmluZSBXR0xfU1dBUF9VTkRFRklORURfQVJCICAgICAgICAgMHgyMDJBCi0jZGVmaW5lIFdHTF9UWVBFX1JHQkFfQVJCICAgICAgICAgICAgICAweDIwMkIKLSNkZWZpbmUgV0dMX1RZUEVfQ09MT1JJTkRFWF9BUkIgICAgICAgIDB4MjAyQwotI2VuZGlmCi0KLSNpZm5kZWYgV0dMX0FSQl9tdWx0aXNhbXBsZQotI2RlZmluZSBXR0xfU0FNUExFX0JVRkZFUlNfQVJCICAgICAgICAgMHgyMDQxCi0jZGVmaW5lIFdHTF9TQU1QTEVTX0FSQiAgICAgICAgICAgICAgICAweDIwNDIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJldmVudHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0YmE4MC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmRpYi9TRExfZGliZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgIlNETF9tYWluLmgiCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIi4uL3dpbmNvbW1vbi9TRExfbG93dmlkZW8uaCIKLSNpbmNsdWRlICJTRExfZGlidmlkZW8uaCIKLSNpbmNsdWRlICJTRExfdmtleXMuaCIKLQotI2lmbmRlZiBXTV9BUFAKLSNkZWZpbmUgV01fQVBQCTB4ODAwMAotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzJfV0NFCi0jZGVmaW5lIE5PX0dFVEtFWUJPQVJEU1RBVEUKLSNlbmRpZgotCi0vKiBUaGUgdHJhbnNsYXRpb24gdGFibGUgZnJvbSBhIE1pY3Jvc29mdCBWSyBrZXlzeW0gdG8gYSBTREwga2V5c3ltICovCi1zdGF0aWMgU0RMS2V5IFZLX2tleW1hcFtTRExLX0xBU1RdOwotc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShXUEFSQU0gdmtleSwgVUlOVCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgcHJlc3NlZCk7Ci0KLS8qIE1hc2tzIGZvciBwcm9jZXNzaW5nIHRoZSB3aW5kb3dzIEtFWURPV04gYW5kIEtFWVVQIG1lc3NhZ2VzICovCi0jZGVmaW5lIFJFUEVBVEVEX0tFWU1BU0sJKDE8PDMwKQotI2RlZmluZSBFWFRFTkRFRF9LRVlNQVNLCSgxPDwyNCkKLQotLyogREpNOiBJZiB0aGUgdXNlciBzZXR1cCB0aGUgd2luZG93IGZvciB1cywgd2Ugd2FudCB0byBzYXZlIGhpcyB3aW5kb3cgcHJvYywKLSAgIGFuZCBnaXZlIGhpbSBhIGNoYW5jZSB0byBoYW5kbGUgc29tZSBtZXNzYWdlcy4gKi8KLSNpZmRlZiBTVFJJQ1QKLSNkZWZpbmUgV05EUFJPQ1RZUEUJV05EUFJPQwotI2Vsc2UKLSNkZWZpbmUgV05EUFJPQ1RZUEUJRkFSUFJPQwotI2VuZGlmCi1zdGF0aWMgV05EUFJPQ1RZUEUgdXNlcldpbmRvd1Byb2MgPSBOVUxMOwotCi0KLSNpZmRlZiBfV0lOMzJfV0NFCi0KLVdQQVJBTSByb3RhdGVLZXkoV1BBUkFNIGtleSxTRExfU2NyZWVuT3JpZW50YXRpb24gZGlyZWN0aW9uKSAKLXsKLQlpZiAoZGlyZWN0aW9uICE9IFNETF9PUklFTlRBVElPTl9MRUZUKQotCQlyZXR1cm4ga2V5OwotCi0Jc3dpdGNoIChrZXkpIHsKLQkJY2FzZSAweDI2OiAvKiB1cCAqLwotCQkJcmV0dXJuIDB4Mjc7Ci0JCWNhc2UgMHgyNzogLyogcmlnaHQgKi8KLQkJCXJldHVybiAweDI4OwotCQljYXNlIDB4Mjg6IC8qIGRvd24gKi8KLQkJCXJldHVybiAweDI1OwotCQljYXNlIDB4MjU6IC8qIGxlZnQgKi8KLQkJCXJldHVybiAweDI2OwotCX0KLQotCXJldHVybiBrZXk7Ci19Ci0KLSNlbmRpZiAKLQotCi0vKiBUaGUgbWFpbiBXaW4zMiBldmVudCBoYW5kbGVyICovCi1MUkVTVUxUIERJQl9IYW5kbGVNZXNzYWdlKF9USElTLCBIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotCWV4dGVybiBpbnQgcG9zdGVkOwotCi0Jc3dpdGNoIChtc2cpIHsKLQkJY2FzZSBXTV9TWVNLRVlET1dOOgotCQljYXNlIFdNX0tFWURPV046IHsKLQkJCVNETF9rZXlzeW0ga2V5c3ltOwotCi0jaWZkZWYgX1dJTjMyX1dDRQotCQkJLy8gRHJvcCBHQVBJIGFydGVmYWN0cwotCQkJaWYgKHdQYXJhbSA9PSAweDg0IHx8IHdQYXJhbSA9PSAweDVCKQotCQkJCXJldHVybiAwOwotCi0JCQkvLyBSb3RhdGUga2V5IGlmIG5lY2Vzc2FyeQotCQkJaWYgKHRoaXMtPmhpZGRlbi0+b3JpZW50YXRpb24gIT0gU0RMX09SSUVOVEFUSU9OX1VQKQotCQkJCXdQYXJhbSA9IHJvdGF0ZUtleSh3UGFyYW0sIHRoaXMtPmhpZGRlbi0+b3JpZW50YXRpb24pOwkKLSNlbmRpZiAKLQkJCS8qIElnbm9yZSByZXBlYXRlZCBrZXlzICovCi0JCQlpZiAoIGxQYXJhbSZSRVBFQVRFRF9LRVlNQVNLICkgewotCQkJCXJldHVybigwKTsKLQkJCX0KLQkJCXN3aXRjaCAod1BhcmFtKSB7Ci0JCQkJY2FzZSBWS19DT05UUk9MOgotCQkJCQlpZiAoIGxQYXJhbSZFWFRFTkRFRF9LRVlNQVNLICkKLQkJCQkJCXdQYXJhbSA9IFZLX1JDT05UUk9MOwotCQkJCQllbHNlCi0JCQkJCQl3UGFyYW0gPSBWS19MQ09OVFJPTDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBWS19TSElGVDoKLQkJCQkJLyogRVhURU5ERUQgdHJpY2sgZG9lc24ndCB3b3JrIGhlcmUgKi8KLQkJCQkJewotCQkJCQlVaW50OCAqc3RhdGUgPSBTRExfR2V0S2V5U3RhdGUoTlVMTCk7Ci0JCQkJCWlmIChzdGF0ZVtTRExLX0xTSElGVF0gPT0gU0RMX1JFTEVBU0VEICYmIChHZXRLZXlTdGF0ZShWS19MU0hJRlQpICYgMHg4MDAwKSkgewotCQkJCQkJd1BhcmFtID0gVktfTFNISUZUOwotCQkJCQl9IGVsc2UgaWYgKHN0YXRlW1NETEtfUlNISUZUXSA9PSBTRExfUkVMRUFTRUQgJiYgKEdldEtleVN0YXRlKFZLX1JTSElGVCkgJiAweDgwMDApKSB7Ci0JCQkJCQl3UGFyYW0gPSBWS19SU0hJRlQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBXaW45eCAqLwotCQkJCQkJaW50IHNjID0gSElXT1JEKGxQYXJhbSkgJiAweEZGOwotCi0JCQkJCQlpZiAoc2MgPT0gMHgyQSkKLQkJCQkJCQl3UGFyYW0gPSBWS19MU0hJRlQ7Ci0JCQkJCQllbHNlCi0JCQkJCQlpZiAoc2MgPT0gMHgzNikKLQkJCQkJCQl3UGFyYW0gPSBWS19SU0hJRlQ7Ci0JCQkJCQllbHNlCi0JCQkJCQkJd1BhcmFtID0gVktfTFNISUZUOwotCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBWS19NRU5VOgotCQkJCQlpZiAoIGxQYXJhbSZFWFRFTkRFRF9LRVlNQVNLICkKLQkJCQkJCXdQYXJhbSA9IFZLX1JNRU5VOwotCQkJCQllbHNlCi0JCQkJCQl3UGFyYW0gPSBWS19MTUVOVTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0jaWZkZWYgTk9fR0VUS0VZQk9BUkRTVEFURQotCQkJLyogdGhpcyBpcyB0aGUgd29ya2Fyb3VuZCBmb3IgdGhlIG1pc3NpbmcgVG9Bc2NpaSgpIGFuZCBUb1VuaWNvZGUoKSBpbiBDRSAobm90IG5lY2Vzc2FyeSBhdCBLRVlVUCEpICovCi0JCQlpZiAoIFNETF9UcmFuc2xhdGVVTklDT0RFICkgewotCQkJCU1TRyBtOwotCi0JCQkJbS5od25kID0gaHduZDsKLQkJCQltLm1lc3NhZ2UgPSBtc2c7Ci0JCQkJbS53UGFyYW0gPSB3UGFyYW07Ci0JCQkJbS5sUGFyYW0gPSBsUGFyYW07Ci0JCQkJbS50aW1lID0gMDsKLQkJCQlpZiAoIFRyYW5zbGF0ZU1lc3NhZ2UoJm0pICYmIFBlZWtNZXNzYWdlKCZtLCBod25kLCAwLCBXTV9VU0VSLCBQTV9OT1JFTU9WRSkgJiYgKG0ubWVzc2FnZSA9PSBXTV9DSEFSKSApIHsKLQkJCQkJR2V0TWVzc2FnZSgmbSwgaHduZCwgMCwgV01fVVNFUik7Ci0JCQkgICAgCQl3UGFyYW0gPSBtLndQYXJhbTsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYgLyogTk9fR0VUS0VZQk9BUkRTVEFURSAqLwotCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwKLQkJCQlUcmFuc2xhdGVLZXkod1BhcmFtLEhJV09SRChsUGFyYW0pLCZrZXlzeW0sMSkpOwotCQl9Ci0JCXJldHVybigwKTsKLQotCQljYXNlIFdNX1NZU0tFWVVQOgotCQljYXNlIFdNX0tFWVVQOiB7Ci0JCQlTRExfa2V5c3ltIGtleXN5bTsKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLQkJCS8vIERyb3AgR0FQSSBhcnRpZmFjdHMKLQkJCWlmICh3UGFyYW0gPT0gMHg4NCB8fCB3UGFyYW0gPT0gMHg1QikKLQkJCQlyZXR1cm4gMDsKLQotCQkJLy8gUm90YXRlIGtleSBpZiBuZWNlc3NhcnkKLQkJCWlmICh0aGlzLT5oaWRkZW4tPm9yaWVudGF0aW9uICE9IFNETF9PUklFTlRBVElPTl9VUCkKLQkJCQl3UGFyYW0gPSByb3RhdGVLZXkod1BhcmFtLCB0aGlzLT5oaWRkZW4tPm9yaWVudGF0aW9uKTsJCi0jZW5kaWYKLQotCQkJc3dpdGNoICh3UGFyYW0pIHsKLQkJCQljYXNlIFZLX0NPTlRST0w6Ci0JCQkJCWlmICggbFBhcmFtJkVYVEVOREVEX0tFWU1BU0sgKQotCQkJCQkJd1BhcmFtID0gVktfUkNPTlRST0w7Ci0JCQkJCWVsc2UKLQkJCQkJCXdQYXJhbSA9IFZLX0xDT05UUk9MOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFZLX1NISUZUOgotCQkJCQkvKiBFWFRFTkRFRCB0cmljayBkb2Vzbid0IHdvcmsgaGVyZSAqLwotCQkJCQl7Ci0JCQkJCVVpbnQ4ICpzdGF0ZSA9IFNETF9HZXRLZXlTdGF0ZShOVUxMKTsKLQkJCQkJaWYgKHN0YXRlW1NETEtfTFNISUZUXSA9PSBTRExfUFJFU1NFRCAmJiAhKEdldEtleVN0YXRlKFZLX0xTSElGVCkgJiAweDgwMDApKSB7Ci0JCQkJCQl3UGFyYW0gPSBWS19MU0hJRlQ7Ci0JCQkJCX0gZWxzZSBpZiAoc3RhdGVbU0RMS19SU0hJRlRdID09IFNETF9QUkVTU0VEICYmICEoR2V0S2V5U3RhdGUoVktfUlNISUZUKSAmIDB4ODAwMCkpIHsKLQkJCQkJCXdQYXJhbSA9IFZLX1JTSElGVDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qIFdpbjl4ICovCi0JCQkJCQlpbnQgc2MgPSBISVdPUkQobFBhcmFtKSAmIDB4RkY7Ci0KLQkJCQkJCWlmIChzYyA9PSAweDJBKQotCQkJCQkJCXdQYXJhbSA9IFZLX0xTSElGVDsKLQkJCQkJCWVsc2UKLQkJCQkJCWlmIChzYyA9PSAweDM2KQotCQkJCQkJCXdQYXJhbSA9IFZLX1JTSElGVDsKLQkJCQkJCWVsc2UKLQkJCQkJCQl3UGFyYW0gPSBWS19MU0hJRlQ7Ci0JCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFZLX01FTlU6Ci0JCQkJCWlmICggbFBhcmFtJkVYVEVOREVEX0tFWU1BU0sgKQotCQkJCQkJd1BhcmFtID0gVktfUk1FTlU7Ci0JCQkJCWVsc2UKLQkJCQkJCXdQYXJhbSA9IFZLX0xNRU5VOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIFdpbmRvd3Mgb25seSByZXBvcnRzIGtleXVwIGZvciBwcmludCBzY3JlZW4gKi8KLQkJCWlmICggd1BhcmFtID09IFZLX1NOQVBTSE9UICYmIFNETF9HZXRLZXlTdGF0ZShOVUxMKVtTRExLX1BSSU5UXSA9PSBTRExfUkVMRUFTRUQgKSB7Ci0JCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwKLQkJCQkJVHJhbnNsYXRlS2V5KHdQYXJhbSxISVdPUkQobFBhcmFtKSwma2V5c3ltLDEpKTsKLQkJCX0KLQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELAotCQkJCVRyYW5zbGF0ZUtleSh3UGFyYW0sSElXT1JEKGxQYXJhbSksJmtleXN5bSwwKSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCi0jaWYgZGVmaW5lZChTQ19TQ1JFRU5TQVZFKSAmJiBkZWZpbmVkKFNDX01PTklUT1JQT1dFUikKLQkJY2FzZSBXTV9TWVNDT01NQU5EOiB7Ci0JCQljb25zdCBEV09SRCB2YWwgPSAoRFdPUkQpICh3UGFyYW0gJiAweEZGRjApOwotCQkJaWYgKCh2YWwgPT0gU0NfU0NSRUVOU0FWRSkgfHwgKHZhbCA9PSBTQ19NT05JVE9SUE9XRVIpKSB7Ci0JCQkJaWYgKCF0aGlzLT5oaWRkZW4tPmFsbG93X3NjcmVlbnNhdmVyKSB7Ci0JCQkJCS8qIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3Qgc3RvcCBhbnl0aGluZyBvbiBWaXN0YQotCQkJCQkgICBpZiB0aGUgc2NyZWVuc2F2ZXIgaGFzIGEgcGFzc3dvcmQuICovCi0JCQkJCXJldHVybigwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLyogRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgcHJvY2Vzc2luZyAqLwotI2VuZGlmIC8qIFNDX1NDUkVFTlNBVkUgJiYgU0NfTU9OSVRPUlBPV0VSICovCi0KLQkJZGVmYXVsdDogewotCQkJLyogT25seSBwb3N0IHRoZSBldmVudCBpZiB3ZSdyZSB3YXRjaGluZyBmb3IgaXQgKi8KLQkJCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX1NZU1dNRVZFTlRdID09IFNETF9FTkFCTEUgKSB7Ci0JCQkgICAgICAgIFNETF9TeXNXTW1zZyB3bW1zZzsKLQotCQkJCVNETF9WRVJTSU9OKCZ3bW1zZy52ZXJzaW9uKTsKLQkJCQl3bW1zZy5od25kID0gaHduZDsKLQkJCQl3bW1zZy5tc2cgPSBtc2c7Ci0JCQkJd21tc2cud1BhcmFtID0gd1BhcmFtOwotCQkJCXdtbXNnLmxQYXJhbSA9IGxQYXJhbTsKLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZVN5c1dNRXZlbnQoJndtbXNnKTsKLQotCQkJLyogREpNOiBJZiB0aGUgdXNlciBpc24ndCB3YXRjaGluZyBmb3IgcHJpdmF0ZQotCQkJCW1lc3NhZ2VzIGluIGhlciBTREwgZXZlbnQgbG9vcCwgdGhlbiBwYXNzIGl0Ci0JCQkJYWxvbmcgdG8gYW55IHdpbjMyIHNwZWNpZmljIHdpbmRvdyBwcm9jLgotCQkJICovCi0JCQl9IGVsc2UgaWYgKHVzZXJXaW5kb3dQcm9jKSB7Ci0JCQkJcmV0dXJuIENhbGxXaW5kb3dQcm9jKHVzZXJXaW5kb3dQcm9jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuKERlZldpbmRvd1Byb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSkpOwotfQotCi12b2lkIERJQl9QdW1wRXZlbnRzKF9USElTKQotewotCU1TRyBtc2c7Ci0KLQl3aGlsZSAoIFBlZWtNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDAsIFBNX05PUkVNT1ZFKSApIHsKLQkJaWYgKCBHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApID4gMCApIHsKLQkJCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIEhLTCBoTGF5b3V0VVMgPSBOVUxMOwotCi12b2lkIERJQl9Jbml0T1NLZXltYXAoX1RISVMpCi17Ci0JaW50CWk7Ci0jaWZuZGVmIF9XSU4zMl9XQ0UKLQljaGFyCWN1cnJlbnRfbGF5b3V0W0tMX05BTUVMRU5HVEhdOwotCi0JR2V0S2V5Ym9hcmRMYXlvdXROYW1lKGN1cnJlbnRfbGF5b3V0KTsKLQkvL3ByaW50ZigiSW5pdGlhbCBLZXlib2FyZCBMYXlvdXQgTmFtZTogJyVzJ1xuIiwgY3VycmVudF9sYXlvdXQpOwotCi0JaExheW91dFVTID0gTG9hZEtleWJvYXJkTGF5b3V0KCIwMDAwMDQwOSIsIEtMRl9OT1RFTExTSEVMTCk7Ci0KLQlpZiAoIWhMYXlvdXRVUykgewotCQkvL3ByaW50ZigiRmFpbGVkIHRvIGxvYWQgVVMga2V5Ym9hcmQgbGF5b3V0LiBVc2luZyBjdXJyZW50LlxuIik7Ci0JCWhMYXlvdXRVUyA9IEdldEtleWJvYXJkTGF5b3V0KDApOwotCX0KLQlMb2FkS2V5Ym9hcmRMYXlvdXQoY3VycmVudF9sYXlvdXQsIEtMRl9BQ1RJVkFURSk7Ci0jZWxzZQotI2lmIF9XSU4zMl9XQ0UgPj00MjAKLQlUQ0hBUgljdXJyZW50X2xheW91dFtLTF9OQU1FTEVOR1RIXTsKLQotCUdldEtleWJvYXJkTGF5b3V0TmFtZShjdXJyZW50X2xheW91dCk7Ci0JLy9wcmludGYoIkluaXRpYWwgS2V5Ym9hcmQgTGF5b3V0IE5hbWU6ICclcydcbiIsIGN1cnJlbnRfbGF5b3V0KTsKLQotCWhMYXlvdXRVUyA9IExvYWRLZXlib2FyZExheW91dChMIjAwMDAwNDA5IiwgMCk7Ci0KLQlpZiAoIWhMYXlvdXRVUykgewotCQkvL3ByaW50ZigiRmFpbGVkIHRvIGxvYWQgVVMga2V5Ym9hcmQgbGF5b3V0LiBVc2luZyBjdXJyZW50LlxuIik7Ci0JCWhMYXlvdXRVUyA9IEdldEtleWJvYXJkTGF5b3V0KDApOwotCX0KLQlMb2FkS2V5Ym9hcmRMYXlvdXQoY3VycmVudF9sYXlvdXQsIDApOwotI2VuZGlmIC8vIF9XSU4zMl9XQ0UgPj00MjAKLSNlbmRpZgotCS8qIE1hcCB0aGUgVksga2V5c3ltcyAqLwotCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKFZLX2tleW1hcCk7ICsraSApCi0JCVZLX2tleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKLQotCVZLX2tleW1hcFtWS19CQUNLXSA9IFNETEtfQkFDS1NQQUNFOwotCVZLX2tleW1hcFtWS19UQUJdID0gU0RMS19UQUI7Ci0JVktfa2V5bWFwW1ZLX0NMRUFSXSA9IFNETEtfQ0xFQVI7Ci0JVktfa2V5bWFwW1ZLX1JFVFVSTl0gPSBTRExLX1JFVFVSTjsKLQlWS19rZXltYXBbVktfUEFVU0VdID0gU0RMS19QQVVTRTsKLQlWS19rZXltYXBbVktfRVNDQVBFXSA9IFNETEtfRVNDQVBFOwotCVZLX2tleW1hcFtWS19TUEFDRV0gPSBTRExLX1NQQUNFOwotCVZLX2tleW1hcFtWS19BUE9TVFJPUEhFXSA9IFNETEtfUVVPVEU7Ci0JVktfa2V5bWFwW1ZLX0NPTU1BXSA9IFNETEtfQ09NTUE7Ci0JVktfa2V5bWFwW1ZLX01JTlVTXSA9IFNETEtfTUlOVVM7Ci0JVktfa2V5bWFwW1ZLX1BFUklPRF0gPSBTRExLX1BFUklPRDsKLQlWS19rZXltYXBbVktfU0xBU0hdID0gU0RMS19TTEFTSDsKLQlWS19rZXltYXBbVktfMF0gPSBTRExLXzA7Ci0JVktfa2V5bWFwW1ZLXzFdID0gU0RMS18xOwotCVZLX2tleW1hcFtWS18yXSA9IFNETEtfMjsKLQlWS19rZXltYXBbVktfM10gPSBTRExLXzM7Ci0JVktfa2V5bWFwW1ZLXzRdID0gU0RMS180OwotCVZLX2tleW1hcFtWS181XSA9IFNETEtfNTsKLQlWS19rZXltYXBbVktfNl0gPSBTRExLXzY7Ci0JVktfa2V5bWFwW1ZLXzddID0gU0RMS183OwotCVZLX2tleW1hcFtWS184XSA9IFNETEtfODsKLQlWS19rZXltYXBbVktfOV0gPSBTRExLXzk7Ci0JVktfa2V5bWFwW1ZLX1NFTUlDT0xPTl0gPSBTRExLX1NFTUlDT0xPTjsKLQlWS19rZXltYXBbVktfRVFVQUxTXSA9IFNETEtfRVFVQUxTOwotCVZLX2tleW1hcFtWS19MQlJBQ0tFVF0gPSBTRExLX0xFRlRCUkFDS0VUOwotCVZLX2tleW1hcFtWS19CQUNLU0xBU0hdID0gU0RMS19CQUNLU0xBU0g7Ci0JVktfa2V5bWFwW1ZLX09FTV8xMDJdID0gU0RMS19MRVNTOwotCVZLX2tleW1hcFtWS19SQlJBQ0tFVF0gPSBTRExLX1JJR0hUQlJBQ0tFVDsKLQlWS19rZXltYXBbVktfR1JBVkVdID0gU0RMS19CQUNLUVVPVEU7Ci0JVktfa2V5bWFwW1ZLX0JBQ0tUSUNLXSA9IFNETEtfQkFDS1FVT1RFOwotCVZLX2tleW1hcFtWS19BXSA9IFNETEtfYTsKLQlWS19rZXltYXBbVktfQl0gPSBTRExLX2I7Ci0JVktfa2V5bWFwW1ZLX0NdID0gU0RMS19jOwotCVZLX2tleW1hcFtWS19EXSA9IFNETEtfZDsKLQlWS19rZXltYXBbVktfRV0gPSBTRExLX2U7Ci0JVktfa2V5bWFwW1ZLX0ZdID0gU0RMS19mOwotCVZLX2tleW1hcFtWS19HXSA9IFNETEtfZzsKLQlWS19rZXltYXBbVktfSF0gPSBTRExLX2g7Ci0JVktfa2V5bWFwW1ZLX0ldID0gU0RMS19pOwotCVZLX2tleW1hcFtWS19KXSA9IFNETEtfajsKLQlWS19rZXltYXBbVktfS10gPSBTRExLX2s7Ci0JVktfa2V5bWFwW1ZLX0xdID0gU0RMS19sOwotCVZLX2tleW1hcFtWS19NXSA9IFNETEtfbTsKLQlWS19rZXltYXBbVktfTl0gPSBTRExLX247Ci0JVktfa2V5bWFwW1ZLX09dID0gU0RMS19vOwotCVZLX2tleW1hcFtWS19QXSA9IFNETEtfcDsKLQlWS19rZXltYXBbVktfUV0gPSBTRExLX3E7Ci0JVktfa2V5bWFwW1ZLX1JdID0gU0RMS19yOwotCVZLX2tleW1hcFtWS19TXSA9IFNETEtfczsKLQlWS19rZXltYXBbVktfVF0gPSBTRExLX3Q7Ci0JVktfa2V5bWFwW1ZLX1VdID0gU0RMS191OwotCVZLX2tleW1hcFtWS19WXSA9IFNETEtfdjsKLQlWS19rZXltYXBbVktfV10gPSBTRExLX3c7Ci0JVktfa2V5bWFwW1ZLX1hdID0gU0RMS194OwotCVZLX2tleW1hcFtWS19ZXSA9IFNETEtfeTsKLQlWS19rZXltYXBbVktfWl0gPSBTRExLX3o7Ci0JVktfa2V5bWFwW1ZLX0RFTEVURV0gPSBTRExLX0RFTEVURTsKLQotCVZLX2tleW1hcFtWS19OVU1QQUQwXSA9IFNETEtfS1AwOwotCVZLX2tleW1hcFtWS19OVU1QQUQxXSA9IFNETEtfS1AxOwotCVZLX2tleW1hcFtWS19OVU1QQUQyXSA9IFNETEtfS1AyOwotCVZLX2tleW1hcFtWS19OVU1QQUQzXSA9IFNETEtfS1AzOwotCVZLX2tleW1hcFtWS19OVU1QQUQ0XSA9IFNETEtfS1A0OwotCVZLX2tleW1hcFtWS19OVU1QQUQ1XSA9IFNETEtfS1A1OwotCVZLX2tleW1hcFtWS19OVU1QQUQ2XSA9IFNETEtfS1A2OwotCVZLX2tleW1hcFtWS19OVU1QQUQ3XSA9IFNETEtfS1A3OwotCVZLX2tleW1hcFtWS19OVU1QQUQ4XSA9IFNETEtfS1A4OwotCVZLX2tleW1hcFtWS19OVU1QQUQ5XSA9IFNETEtfS1A5OwotCVZLX2tleW1hcFtWS19ERUNJTUFMXSA9IFNETEtfS1BfUEVSSU9EOwotCVZLX2tleW1hcFtWS19ESVZJREVdID0gU0RMS19LUF9ESVZJREU7Ci0JVktfa2V5bWFwW1ZLX01VTFRJUExZXSA9IFNETEtfS1BfTVVMVElQTFk7Ci0JVktfa2V5bWFwW1ZLX1NVQlRSQUNUXSA9IFNETEtfS1BfTUlOVVM7Ci0JVktfa2V5bWFwW1ZLX0FERF0gPSBTRExLX0tQX1BMVVM7Ci0KLQlWS19rZXltYXBbVktfVVBdID0gU0RMS19VUDsKLQlWS19rZXltYXBbVktfRE9XTl0gPSBTRExLX0RPV047Ci0JVktfa2V5bWFwW1ZLX1JJR0hUXSA9IFNETEtfUklHSFQ7Ci0JVktfa2V5bWFwW1ZLX0xFRlRdID0gU0RMS19MRUZUOwotCVZLX2tleW1hcFtWS19JTlNFUlRdID0gU0RMS19JTlNFUlQ7Ci0JVktfa2V5bWFwW1ZLX0hPTUVdID0gU0RMS19IT01FOwotCVZLX2tleW1hcFtWS19FTkRdID0gU0RMS19FTkQ7Ci0JVktfa2V5bWFwW1ZLX1BSSU9SXSA9IFNETEtfUEFHRVVQOwotCVZLX2tleW1hcFtWS19ORVhUXSA9IFNETEtfUEFHRURPV047Ci0KLQlWS19rZXltYXBbVktfRjFdID0gU0RMS19GMTsKLQlWS19rZXltYXBbVktfRjJdID0gU0RMS19GMjsKLQlWS19rZXltYXBbVktfRjNdID0gU0RMS19GMzsKLQlWS19rZXltYXBbVktfRjRdID0gU0RMS19GNDsKLQlWS19rZXltYXBbVktfRjVdID0gU0RMS19GNTsKLQlWS19rZXltYXBbVktfRjZdID0gU0RMS19GNjsKLQlWS19rZXltYXBbVktfRjddID0gU0RMS19GNzsKLQlWS19rZXltYXBbVktfRjhdID0gU0RMS19GODsKLQlWS19rZXltYXBbVktfRjldID0gU0RMS19GOTsKLQlWS19rZXltYXBbVktfRjEwXSA9IFNETEtfRjEwOwotCVZLX2tleW1hcFtWS19GMTFdID0gU0RMS19GMTE7Ci0JVktfa2V5bWFwW1ZLX0YxMl0gPSBTRExLX0YxMjsKLQlWS19rZXltYXBbVktfRjEzXSA9IFNETEtfRjEzOwotCVZLX2tleW1hcFtWS19GMTRdID0gU0RMS19GMTQ7Ci0JVktfa2V5bWFwW1ZLX0YxNV0gPSBTRExLX0YxNTsKLQotCVZLX2tleW1hcFtWS19OVU1MT0NLXSA9IFNETEtfTlVNTE9DSzsKLQlWS19rZXltYXBbVktfQ0FQSVRBTF0gPSBTRExLX0NBUFNMT0NLOwotCVZLX2tleW1hcFtWS19TQ1JPTExdID0gU0RMS19TQ1JPTExPQ0s7Ci0JVktfa2V5bWFwW1ZLX1JTSElGVF0gPSBTRExLX1JTSElGVDsKLQlWS19rZXltYXBbVktfTFNISUZUXSA9IFNETEtfTFNISUZUOwotCVZLX2tleW1hcFtWS19SQ09OVFJPTF0gPSBTRExLX1JDVFJMOwotCVZLX2tleW1hcFtWS19MQ09OVFJPTF0gPSBTRExLX0xDVFJMOwotCVZLX2tleW1hcFtWS19STUVOVV0gPSBTRExLX1JBTFQ7Ci0JVktfa2V5bWFwW1ZLX0xNRU5VXSA9IFNETEtfTEFMVDsKLQlWS19rZXltYXBbVktfUldJTl0gPSBTRExLX1JTVVBFUjsKLQlWS19rZXltYXBbVktfTFdJTl0gPSBTRExLX0xTVVBFUjsKLQotCVZLX2tleW1hcFtWS19IRUxQXSA9IFNETEtfSEVMUDsKLSNpZmRlZiBWS19QUklOVAotCVZLX2tleW1hcFtWS19QUklOVF0gPSBTRExLX1BSSU5UOwotI2VuZGlmCi0JVktfa2V5bWFwW1ZLX1NOQVBTSE9UXSA9IFNETEtfUFJJTlQ7Ci0JVktfa2V5bWFwW1ZLX0NBTkNFTF0gPSBTRExLX0JSRUFLOwotCVZLX2tleW1hcFtWS19BUFBTXSA9IFNETEtfTUVOVTsKLX0KLQotI2RlZmluZSBFWFRLRVlQQUQoa2V5cGFkKSAoKHNjYW5jb2RlICYgMHgxMDApPyhtdmtlKTooa2V5cGFkKSkKLQotc3RhdGljIGludCBTRExfTWFwVmlydHVhbEtleShpbnQgc2NhbmNvZGUsIGludCB2a2V5KQotewotI2lmbmRlZiBfV0lOMzJfV0NFCi0JaW50CW12a2UgID0gTWFwVmlydHVhbEtleUV4KHNjYW5jb2RlICYgMHhGRiwgMSwgaExheW91dFVTKTsKLSNlbHNlCi0JaW50CW12a2UgID0gTWFwVmlydHVhbEtleShzY2FuY29kZSAmIDB4RkYsIDEpOwotI2VuZGlmCi0KLQlzd2l0Y2godmtleSkgewotCQkvKiBUaGVzZSBhcmUgYWx3YXlzIGNvcnJlY3QgKi8KLQkJY2FzZSBWS19ESVZJREU6Ci0JCWNhc2UgVktfTVVMVElQTFk6Ci0JCWNhc2UgVktfU1VCVFJBQ1Q6Ci0JCWNhc2UgVktfQUREOgotCQljYXNlIFZLX0xXSU46Ci0JCWNhc2UgVktfUldJTjoKLQkJY2FzZSBWS19BUFBTOgotCQkvKiBUaGVzZSBhcmUgYWxyZWFkeSBoYW5kbGVkICovCi0JCWNhc2UgVktfTENPTlRST0w6Ci0JCWNhc2UgVktfUkNPTlRST0w6Ci0JCWNhc2UgVktfTFNISUZUOgotCQljYXNlIFZLX1JTSElGVDoKLQkJY2FzZSBWS19MTUVOVToKLQkJY2FzZSBWS19STUVOVToKLQkJY2FzZSBWS19TTkFQU0hPVDoKLQkJY2FzZSBWS19QQVVTRToKLQkJCXJldHVybiB2a2V5OwotCX0JCi0Jc3dpdGNoKG12a2UpIHsKLQkJLyogRGlzdGluZ3Vpc2ggYmV0d2VlbiBrZXlwYWQgYW5kIGV4dGVuZGVkIGtleXMgKi8KLQkJY2FzZSBWS19JTlNFUlQ6IHJldHVybiBFWFRLRVlQQUQoVktfTlVNUEFEMCk7Ci0JCWNhc2UgVktfREVMRVRFOiByZXR1cm4gRVhUS0VZUEFEKFZLX0RFQ0lNQUwpOwotCQljYXNlIFZLX0VORDogICAgcmV0dXJuIEVYVEtFWVBBRChWS19OVU1QQUQxKTsKLQkJY2FzZSBWS19ET1dOOiAgIHJldHVybiBFWFRLRVlQQUQoVktfTlVNUEFEMik7Ci0JCWNhc2UgVktfTkVYVDogICByZXR1cm4gRVhUS0VZUEFEKFZLX05VTVBBRDMpOwotCQljYXNlIFZLX0xFRlQ6ICAgcmV0dXJuIEVYVEtFWVBBRChWS19OVU1QQUQ0KTsKLQkJY2FzZSBWS19DTEVBUjogIHJldHVybiBFWFRLRVlQQUQoVktfTlVNUEFENSk7Ci0JCWNhc2UgVktfUklHSFQ6ICByZXR1cm4gRVhUS0VZUEFEKFZLX05VTVBBRDYpOwotCQljYXNlIFZLX0hPTUU6ICAgcmV0dXJuIEVYVEtFWVBBRChWS19OVU1QQUQ3KTsKLQkJY2FzZSBWS19VUDogICAgIHJldHVybiBFWFRLRVlQQUQoVktfTlVNUEFEOCk7Ci0JCWNhc2UgVktfUFJJT1I6ICByZXR1cm4gRVhUS0VZUEFEKFZLX05VTVBBRDkpOwotCX0KLQlyZXR1cm4gbXZrZT9tdmtlOnZrZXk7Ci19Ci0KLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoV1BBUkFNIHZrZXksIFVJTlQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSwgaW50IHByZXNzZWQpCi17Ci0JLyogU2V0IHRoZSBrZXlzeW0gaW5mb3JtYXRpb24gKi8KLQlrZXlzeW0tPnNjYW5jb2RlID0gKHVuc2lnbmVkIGNoYXIpIHNjYW5jb2RlOwotCWtleXN5bS0+bW9kID0gS01PRF9OT05FOwotCWtleXN5bS0+dW5pY29kZSA9IDA7Ci0JaWYgKCBwcmVzc2VkICYmIFNETF9UcmFuc2xhdGVVTklDT0RFICkgewotI2lmZGVmIE5PX0dFVEtFWUJPQVJEU1RBVEUKLQkJLyogVWggb2gsIGJldHRlciBob3BlIHRoZSB2a2V5IGlzIGNsb3NlIGVub3VnaC4uICovCi0JCWtleXN5bS0+dW5pY29kZSA9IHZrZXk7Ci0jZWxzZQotCQlCWVRFCWtleXN0YXRlWzI1Nl07Ci0JCVVpbnQxNgl3Y2hhcnNbMl07Ci0KLQkJR2V0S2V5Ym9hcmRTdGF0ZShrZXlzdGF0ZSk7Ci0JCWlmIChTRExfVG9Vbmljb2RlKChVSU5UKXZrZXksIHNjYW5jb2RlLCBrZXlzdGF0ZSwgd2NoYXJzLCBzaXplb2Yod2NoYXJzKS9zaXplb2Yod2NoYXJzWzBdKSwgMCkgPT0gMSkKLQkJewotCQkJa2V5c3ltLT51bmljb2RlID0gd2NoYXJzWzBdOwotCQl9Ci0jZW5kaWYgLyogTk9fR0VUS0VZQk9BUkRTVEFURSAqLwotCX0KLQotCWlmICgodmtleSA9PSBWS19SRVRVUk4pICYmIChzY2FuY29kZSAmIDB4MTAwKSkgewotCQkvKiBObyBWS18gY29kZSBmb3IgdGhlIGtleXBhZCBlbnRlciBrZXkgKi8KLQkJa2V5c3ltLT5zeW0gPSBTRExLX0tQX0VOVEVSOwotCX0KLQllbHNlIHsKLQkJa2V5c3ltLT5zeW0gPSBWS19rZXltYXBbU0RMX01hcFZpcnR1YWxLZXkoc2NhbmNvZGUsIHZrZXkpXTsKLQl9Ci0KLSNpZiAwCi0JewotCQlIS0wgICAgIGhMYXlvdXRDdXJyZW50ID0gR2V0S2V5Ym9hcmRMYXlvdXQoMCk7Ci0JCWludCAgICAgc2MgPSBzY2FuY29kZSAmIDB4RkY7Ci0KLQkJcHJpbnRmKCJTWU06JWQsIFZLOjB4JTAyWCwgU0M6MHglMDRYLCBVUzooMToweCUwMlgsIDM6MHglMDJYKSwgIgotCQkJIkN1cnJlbnQ6KDE6MHglMDJYLCAzOjB4JTAyWClcbiIsCi0JCQlrZXlzeW0tPnN5bSwgdmtleSwgc2NhbmNvZGUsCi0JCQlNYXBWaXJ0dWFsS2V5RXgoc2MsIDEsIGhMYXlvdXRVUyksCi0JCQlNYXBWaXJ0dWFsS2V5RXgoc2MsIDMsIGhMYXlvdXRVUyksCi0JCQlNYXBWaXJ0dWFsS2V5RXgoc2MsIDEsIGhMYXlvdXRDdXJyZW50KSwKLQkJCU1hcFZpcnR1YWxLZXlFeChzYywgMywgaExheW91dEN1cnJlbnQpCi0JCSk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuKGtleXN5bSk7Ci19Ci0KLWludCBESUJfQ3JlYXRlV2luZG93KF9USElTKQotewotCWNoYXIgKndpbmRvd2lkID0gU0RMX2dldGVudigiU0RMX1dJTkRPV0lEIik7Ci0KLQlTRExfUmVnaXN0ZXJBcHAoTlVMTCwgMCwgMCk7Ci0KLQlTRExfd2luZG93aWQgPSAod2luZG93aWQgIT0gTlVMTCk7Ci0JaWYgKCBTRExfd2luZG93aWQgKSB7Ci0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAoX1dJTjMyX1dDRSA8IDMwMCkKLQkJLyogd2luY2UgMi4xIGRvZXMgbm90IGhhdmUgc3RydG9sICovCi0JCXdjaGFyX3QgKndpbmRvd2lkX3QgPSBTRExfbWFsbG9jKChTRExfc3RybGVuKHdpbmRvd2lkKSArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKLQkJTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIE1CX1BSRUNPTVBPU0VELCB3aW5kb3dpZCwgLTEsIHdpbmRvd2lkX3QsIFNETF9zdHJsZW4od2luZG93aWQpICsgMSk7Ci0JCVNETF9XaW5kb3cgPSAoSFdORCl3Y3N0b2wod2luZG93aWRfdCwgTlVMTCwgMCk7Ci0JCVNETF9mcmVlKHdpbmRvd2lkX3QpOwotI2Vsc2UKLQkJU0RMX1dpbmRvdyA9IChIV05EKVNETF9zdHJ0b3VsbCh3aW5kb3dpZCwgTlVMTCwgMCk7Ci0jZW5kaWYKLQkJaWYgKCBTRExfV2luZG93ID09IE5VTEwgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCB1c2VyIHNwZWNpZmllZCB3aW5kb3ciKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQotCQkvKiBESk06IHdlIHdhbnQgYWxsIGV2ZW50J3MgZm9yIHRoZSB1c2VyIHNwZWNpZmllZAotCQkJd2luZG93IHRvIGJlIGhhbmRsZWQgYnkgU0RMLgotCQkgKi8KLQkJdXNlcldpbmRvd1Byb2MgPSAoV05EUFJPQ1RZUEUpR2V0V2luZG93TG9uZ1B0cihTRExfV2luZG93LCBHV0xQX1dORFBST0MpOwotCQlTZXRXaW5kb3dMb25nUHRyKFNETF9XaW5kb3csIEdXTFBfV05EUFJPQywgKExPTkdfUFRSKVdpbk1lc3NhZ2UpOwotCX0gZWxzZSB7Ci0JCVNETF9XaW5kb3cgPSBDcmVhdGVXaW5kb3coU0RMX0FwcG5hbWUsIFNETF9BcHBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgKFdTX09WRVJMQVBQRUR8V1NfQ0FQVElPTnxXU19TWVNNRU5VfFdTX01JTklNSVpFQk9YKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIDAsIDAsIE5VTEwsIE5VTEwsIFNETF9JbnN0YW5jZSwgTlVMTCk7Ci0JCWlmICggU0RMX1dpbmRvdyA9PSBOVUxMICkgewotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgd2luZG93Iik7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCVNob3dXaW5kb3coU0RMX1dpbmRvdywgU1dfSElERSk7Ci0JfQotCi0JLyogSkMgMTQgTWFyIDIwMDYKLQkJRmx1c2ggdGhlIG1lc3NhZ2UgbG9vcCBvciB0aGlzIGNhbiBjYXVzZSBiaWcgcHJvYmxlbXMgbGF0ZXIKLQkJRXNwZWNpYWxseSBpZiB0aGUgdXNlciBkZWNpZGVzIHRvIHVzZSBkaWFsb2cgYm94ZXMgb3IgYXNzZXJ0KCkhCi0JKi8KLQlXSU5fRmx1c2hNZXNzYWdlUXVldWUoKTsKLQotCXJldHVybigwKTsKLX0KLQotdm9pZCBESUJfRGVzdHJveVdpbmRvdyhfVEhJUykKLXsKLQlpZiAoIFNETF93aW5kb3dpZCApIHsKLQkJU2V0V2luZG93TG9uZ1B0cihTRExfV2luZG93LCBHV0xQX1dORFBST0MsIChMT05HX1BUUil1c2VyV2luZG93UHJvYyk7Ci0JfSBlbHNlIHsKLQkJRGVzdHJveVdpbmRvdyhTRExfV2luZG93KTsKLQl9Ci0JU0RMX1VucmVnaXN0ZXJBcHAoKTsKLQotCS8qIEpDIDE0IE1hciAyMDA2Ci0JCUZsdXNoIHRoZSBtZXNzYWdlIGxvb3Agb3IgdGhpcyBjYW4gY2F1c2UgYmlnIHByb2JsZW1zIGxhdGVyCi0JCUVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgZGVjaWRlcyB0byB1c2UgZGlhbG9nIGJveGVzIG9yIGFzc2VydCgpIQotCSovCi0JV0lOX0ZsdXNoTWVzc2FnZVF1ZXVlKCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmRpYi9TRExfZGliZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJldmVudHNfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWIzYTI1Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICIuLi93aW5jb21tb24vU0RMX2xvd3ZpZGVvLmgiCi0KLS8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFNETF9kaWJldmVudHMuYyB0byBvdGhlciBwYXJ0cyAKLSAgIG9mIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIChTRExfZGlidmlkZW8uYykKLSovCi1leHRlcm4gTE9ORwotIERJQl9IYW5kbGVNZXNzYWdlKF9USElTLCBIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLWV4dGVybiBpbnQgRElCX0NyZWF0ZVdpbmRvdyhfVEhJUyk7Ci1leHRlcm4gdm9pZCBESUJfRGVzdHJveVdpbmRvdyhfVEhJUyk7Ci0KLWV4dGVybiB2b2lkIERJQl9QdW1wRXZlbnRzKF9USElTKTsKLWV4dGVybiB2b2lkIERJQl9Jbml0T1NLZXltYXAoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5kaWIvU0RMX2RpYnZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmRpYi9TRExfZGlidmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlN2E3OC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmRpYi9TRExfZGlidmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLyogTm90IHlldCBpbiB0aGUgbWluZ3czMiBjcm9zcy1jb21waWxlIGhlYWRlcnMgKi8KLSNpZm5kZWYgQ0RTX0ZVTExTQ1JFRU4KLSNkZWZpbmUgQ0RTX0ZVTExTQ1JFRU4JNAotI2VuZGlmCi0KLSNpbmNsdWRlICJTRExfc3lzd20uaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfZGlidmlkZW8uaCIKLSNpbmNsdWRlICIuLi93aW5jb21tb24vU0RMX3N5c3dtX2MuaCIKLSNpbmNsdWRlICIuLi93aW5jb21tb24vU0RMX3N5c21vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfZGliZXZlbnRzX2MuaCIKLSNpbmNsdWRlICIuLi93aW5jb21tb24vU0RMX3dpbmdsX2MuaCIKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLSNkZWZpbmUgTk9fR0VURElCSVRTCi0jZGVmaW5lIE5PX0dBTU1BX1NVUFBPUlQKLSAgI2lmIF9XSU4zMl9XQ0UgPCA0MjAKLSAgICAjZGVmaW5lIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUwotICAjZWxzZQotICAgICNkZWZpbmUgQ2hhbmdlRGlzcGxheVNldHRpbmdzKGxwRGV2TW9kZSwgZHdGbGFncykgQ2hhbmdlRGlzcGxheVNldHRpbmdzRXgoTlVMTCwgKGxwRGV2TW9kZSksIDAsIChkd0ZsYWdzKSwgMCkKLSAgI2VuZGlmCi0jZW5kaWYKLSNpZm5kZWYgV1NfTUFYSU1JWkUKLSNkZWZpbmUgV1NfTUFYSU1JWkUJMAotI2VuZGlmCi0jaWZuZGVmIFdTX1RISUNLRlJBTUUKLSNkZWZpbmUgV1NfVEhJQ0tGUkFNRQkwCi0jZW5kaWYKLSNpZm5kZWYgU1dQX05PQ09QWUJJVFMKLSNkZWZpbmUgU1dQX05PQ09QWUJJVFMJMAotI2VuZGlmCi0jaWZuZGVmIFBDX05PQ09MTEFQU0UKLSNkZWZpbmUgUENfTk9DT0xMQVBTRQkwCi0jZW5kaWYKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLS8vIGRlZmluZWQgYW5kIHVzZWQgaW4gU0RMX3N5c2V2ZW50cy5jCi1leHRlcm4gSElOU1RBTkNFIGF5Z3NoZWxsOwotI2VuZGlmCi0KLS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBESUJfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOwotc3RhdGljIFNETF9SZWN0ICoqRElCX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7Ci1TRExfU3VyZmFjZSAqRElCX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgRElCX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAotCQkJIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyB2b2lkIERJQl9DaGVja0dhbW1hKF9USElTKTsKLXZvaWQgRElCX1N3YXBHYW1tYShfVEhJUyk7Ci12b2lkIERJQl9RdWl0R2FtbWEoX1RISVMpOwotaW50IERJQl9TZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCk7Ci1pbnQgRElCX0dldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKLXN0YXRpYyB2b2lkIERJQl9WaWRlb1F1aXQoX1RISVMpOwotCi0vKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBESUJfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgRElCX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIERJQl9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIERJQl9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0KLS8qIFdpbmRvd3MgbWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIERJQl9HcmFiU3RhdGljQ29sb3JzKEhXTkQgd2luZG93KTsKLXN0YXRpYyB2b2lkIERJQl9SZWxlYXNlU3RhdGljQ29sb3JzKEhXTkQgd2luZG93KTsKLXN0YXRpYyB2b2lkIERJQl9BY3RpdmF0ZShfVEhJUywgQk9PTCBhY3RpdmUsIEJPT0wgbWluaW1pemVkKTsKLXN0YXRpYyB2b2lkIERJQl9SZWFsaXplUGFsZXR0ZShfVEhJUyk7Ci1zdGF0aWMgdm9pZCBESUJfUGFsZXR0ZUNoYW5nZWQoX1RISVMsIEhXTkQgd2luZG93KTsKLXN0YXRpYyB2b2lkIERJQl9XaW5QQUlOVChfVEhJUywgSERDIGhkYyk7Ci0KLXN0YXRpYyB2b2lkIERJQl9HZXRXaW5Qb3MoX1RISVMsIGludCogcHgsIGludCAqcHkpOwotc3RhdGljIHZvaWQgRElCX1NldFdpblBvcyhfVEhJUywgaW50ICB4LCBpbnQgIHkpOwotc3RhdGljIGludCAgRElCX0lzV2luVmlzaWJsZShfVEhJUywgaW50IHJlY2VudGVyKTsKLXN0YXRpYyBpbnQgIERJQl9HZXRNb25pdG9yRFBJKF9USElTLCBpbnQqIHhEcGksIGludCAqeURwaSk7Ci1zdGF0aWMgaW50ICBESUJfR2V0TW9uaXRvclJlY3QoX1RISVMsIFNETF9SZWN0KiAgcmVjdCk7Ci0KLS8qIGhlbHBlciBmbiAqLwotc3RhdGljIGludCBESUJfU3Vzc1NjcmVlbkRlcHRoKCk7Ci0KLS8qIERJQiBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IERJQl9BdmFpbGFibGUodm9pZCkKLXsKLQlyZXR1cm4oMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERJQl9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JaWYgKCBkZXZpY2UgKSB7Ci0JCWlmICggZGV2aWNlLT5oaWRkZW4gKSB7Ci0JCQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0JCX0KLQkJaWYgKCBkZXZpY2UtPmdsX2RhdGEgKSB7Ci0JCQlTRExfZnJlZShkZXZpY2UtPmdsX2RhdGEpOwotCQl9Ci0JCVNETF9mcmVlKGRldmljZSk7Ci0JfQotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpESUJfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKLQotCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0JZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotCWlmICggZGV2aWNlICkgewotCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7Ci0JCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQkJZGV2aWNlLT5nbF9kYXRhID0gKHN0cnVjdCBTRExfUHJpdmF0ZUdMRGF0YSAqKQotCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5nbF9kYXRhKSk7Ci0JfQotCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgfHwKLQkJICAgICAgICAgICAgICAgICAoZGV2aWNlLT5nbF9kYXRhID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJRElCX0RlbGV0ZURldmljZShkZXZpY2UpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0JU0RMX21lbXNldChkZXZpY2UtPmdsX2RhdGEsIDAsIChzaXplb2YgKmRldmljZS0+Z2xfZGF0YSkpOwotCi0JLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCWRldmljZS0+VmlkZW9Jbml0ID0gRElCX1ZpZGVvSW5pdDsKLQlkZXZpY2UtPkxpc3RNb2RlcyA9IERJQl9MaXN0TW9kZXM7Ci0JZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBESUJfU2V0VmlkZW9Nb2RlOwotCWRldmljZS0+VXBkYXRlTW91c2UgPSBXSU5fVXBkYXRlTW91c2U7Ci0JZGV2aWNlLT5TZXRDb2xvcnMgPSBESUJfU2V0Q29sb3JzOwotCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOwotCWRldmljZS0+VmlkZW9RdWl0ID0gRElCX1ZpZGVvUXVpdDsKLQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gRElCX0FsbG9jSFdTdXJmYWNlOwotCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOwotCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7Ci0JZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKLQlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOwotCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IERJQl9Mb2NrSFdTdXJmYWNlOwotCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gRElCX1VubG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOwotCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IERJQl9GcmVlSFdTdXJmYWNlOwotCWRldmljZS0+U2V0R2FtbWFSYW1wID0gRElCX1NldEdhbW1hUmFtcDsKLQlkZXZpY2UtPkdldEdhbW1hUmFtcCA9IERJQl9HZXRHYW1tYVJhbXA7Ci0jaWYgU0RMX1ZJREVPX09QRU5HTAotCWRldmljZS0+R0xfTG9hZExpYnJhcnkgPSBXSU5fR0xfTG9hZExpYnJhcnk7Ci0JZGV2aWNlLT5HTF9HZXRQcm9jQWRkcmVzcyA9IFdJTl9HTF9HZXRQcm9jQWRkcmVzczsKLQlkZXZpY2UtPkdMX0dldEF0dHJpYnV0ZSA9IFdJTl9HTF9HZXRBdHRyaWJ1dGU7Ci0JZGV2aWNlLT5HTF9NYWtlQ3VycmVudCA9IFdJTl9HTF9NYWtlQ3VycmVudDsKLQlkZXZpY2UtPkdMX1N3YXBCdWZmZXJzID0gV0lOX0dMX1N3YXBCdWZmZXJzOwotI2VuZGlmCi0JZGV2aWNlLT5TZXRDYXB0aW9uID0gV0lOX1NldFdNQ2FwdGlvbjsKLQlkZXZpY2UtPlNldEljb24gPSBXSU5fU2V0V01JY29uOwotCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IFdJTl9JY29uaWZ5V2luZG93OwotCWRldmljZS0+R3JhYklucHV0ID0gV0lOX0dyYWJJbnB1dDsKLQlkZXZpY2UtPkdldFdNSW5mbyA9IFdJTl9HZXRXTUluZm87Ci0JZGV2aWNlLT5GcmVlV01DdXJzb3IgPSBXSU5fRnJlZVdNQ3Vyc29yOwotCWRldmljZS0+Q3JlYXRlV01DdXJzb3IgPSBXSU5fQ3JlYXRlV01DdXJzb3I7Ci0JZGV2aWNlLT5TaG93V01DdXJzb3IgPSBXSU5fU2hvd1dNQ3Vyc29yOwotCWRldmljZS0+V2FycFdNQ3Vyc29yID0gV0lOX1dhcnBXTUN1cnNvcjsKLQlkZXZpY2UtPkNoZWNrTW91c2VNb2RlID0gV0lOX0NoZWNrTW91c2VNb2RlOwotCWRldmljZS0+SW5pdE9TS2V5bWFwID0gRElCX0luaXRPU0tleW1hcDsKLQlkZXZpY2UtPlB1bXBFdmVudHMgPSBESUJfUHVtcEV2ZW50czsKLQotICAgIGRldmljZS0+R2V0V2luZG93UG9zID0gRElCX0dldFdpblBvczsKLSAgICBkZXZpY2UtPlNldFdpbmRvd1BvcyA9IERJQl9TZXRXaW5Qb3M7Ci0gICAgZGV2aWNlLT5Jc1dpbmRvd1Zpc2libGUgPSBESUJfSXNXaW5WaXNpYmxlOwotICAgIGRldmljZS0+R2V0TW9uaXRvckRQSSA9IERJQl9HZXRNb25pdG9yRFBJOwotICAgIGRldmljZS0+R2V0TW9uaXRvclJlY3QgPSBESUJfR2V0TW9uaXRvclJlY3Q7Ci0KLQkvKiBTZXQgdXAgdGhlIHdpbmRvd3MgbWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMgKi8KLQlXSU5fQWN0aXZhdGUgPSBESUJfQWN0aXZhdGU7Ci0JV0lOX1JlYWxpemVQYWxldHRlID0gRElCX1JlYWxpemVQYWxldHRlOwotCVdJTl9QYWxldHRlQ2hhbmdlZCA9IERJQl9QYWxldHRlQ2hhbmdlZDsKLQlXSU5fV2luUEFJTlQgPSBESUJfV2luUEFJTlQ7Ci0JSGFuZGxlTWVzc2FnZSA9IERJQl9IYW5kbGVNZXNzYWdlOwotCi0JZGV2aWNlLT5mcmVlID0gRElCX0RlbGV0ZURldmljZTsKLQotCS8qIFdlJ3JlIGZpbmFsbHkgcmVhZHkgKi8KLQlyZXR1cm4gZGV2aWNlOwotfQotCi1WaWRlb0Jvb3RTdHJhcCBXSU5ESUJfYm9vdHN0cmFwID0gewotCSJ3aW5kaWIiLCAiV2luOTUvOTgvTlQvMjAwMC9DRSBHREkiLAotCURJQl9BdmFpbGFibGUsIERJQl9DcmVhdGVEZXZpY2UKLX07Ci0KLXN0YXRpYyBpbnQgY21wbW9kZXMoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQotewotICAgIFNETF9SZWN0ICphID0gKihTRExfUmVjdCAqKil2YTsKLSAgICBTRExfUmVjdCAqYiA9ICooU0RMX1JlY3QgKiopdmI7Ci0gICAgaWYgKCBhLT53ID09IGItPncgKQotICAgICAgICByZXR1cm4gYi0+aCAtIGEtPmg7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYi0+dyAtIGEtPnc7Ci19Ci0KLXN0YXRpYyBpbnQgRElCX0FkZE1vZGUoX1RISVMsIGludCBicHAsIGludCB3LCBpbnQgaCkKLXsKLQlTRExfUmVjdCAqbW9kZTsKLQlpbnQgaSwgaW5kZXg7Ci0JaW50IG5leHRfbW9kZTsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBtb2RlICovCi0JaWYgKCBicHAgPCA4ICkgeyAgLyogTm90IHN1cHBvcnRlZCAqLwotCQlyZXR1cm4oMCk7Ci0JfQotCWluZGV4ID0gKChicHArNykvOCktMTsKLQlmb3IgKCBpPTA7IGk8U0RMX251bW1vZGVzW2luZGV4XTsgKytpICkgewotCQltb2RlID0gU0RMX21vZGVsaXN0W2luZGV4XVtpXTsKLQkJaWYgKCAobW9kZS0+dyA9PSB3KSAmJiAobW9kZS0+aCA9PSBoKSApIHsKLQkJCXJldHVybigwKTsKLQkJfQotCX0KLQotCS8qIFNldCB1cCB0aGUgbmV3IHZpZGVvIG1vZGUgcmVjdGFuZ2xlICovCi0JbW9kZSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mICptb2RlKTsKLQlpZiAoIG1vZGUgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCW1vZGUtPnggPSAwOwotCW1vZGUtPnkgPSAwOwotCW1vZGUtPncgPSB3OwotCW1vZGUtPmggPSBoOwotCi0JLyogQWxsb2NhdGUgdGhlIG5ldyBsaXN0IG9mIG1vZGVzLCBhbmQgZmlsbCBpbiB0aGUgbmV3IG1vZGUgKi8KLQluZXh0X21vZGUgPSBTRExfbnVtbW9kZXNbaW5kZXhdOwotCVNETF9tb2RlbGlzdFtpbmRleF0gPSAoU0RMX1JlY3QgKiopCi0JICAgICAgIFNETF9yZWFsbG9jKFNETF9tb2RlbGlzdFtpbmRleF0sICgxK25leHRfbW9kZSsxKSpzaXplb2YoU0RMX1JlY3QgKikpOwotCWlmICggU0RMX21vZGVsaXN0W2luZGV4XSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJU0RMX251bW1vZGVzW2luZGV4XSA9IDA7Ci0JCVNETF9mcmVlKG1vZGUpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlTRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZV0gPSBtb2RlOwotCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlKzFdID0gTlVMTDsKLQlTRExfbnVtbW9kZXNbaW5kZXhdKys7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIERJQl9DcmVhdGVQYWxldHRlKF9USElTLCBpbnQgYnBwKQotewotLyoJUkpSOiBNYXJjaCAyOCwgMjAwMAotCW1vdmVkIHBhbGV0dGUgY3JlYXRpb24gaGVyZSBmcm9tICJESUJfVmlkZW9Jbml0IiAqLwotCi0JTE9HUEFMRVRURSAqcGFsZXR0ZTsKLQlIREMgaGRjOwotCWludCBuY29sb3JzOwotCi0JbmNvbG9ycyA9ICgxIDw8IGJwcCk7Ci0JcGFsZXR0ZSA9IChMT0dQQUxFVFRFICopU0RMX21hbGxvYyhzaXplb2YoKnBhbGV0dGUpKwotCQkJCW5jb2xvcnMqc2l6ZW9mKFBBTEVUVEVFTlRSWSkpOwotCXBhbGV0dGUtPnBhbFZlcnNpb24gPSAweDMwMDsKLQlwYWxldHRlLT5wYWxOdW1FbnRyaWVzID0gbmNvbG9yczsKLQloZGMgPSBHZXREQyhTRExfV2luZG93KTsKLQlHZXRTeXN0ZW1QYWxldHRlRW50cmllcyhoZGMsIDAsIG5jb2xvcnMsIHBhbGV0dGUtPnBhbFBhbEVudHJ5KTsKLQlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKLQlzY3JlZW5fcGFsID0gQ3JlYXRlUGFsZXR0ZShwYWxldHRlKTsKLQlzY3JlZW5fbG9ncGFsID0gcGFsZXR0ZTsKLX0KLQotaW50IERJQl9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLQljb25zdCBjaGFyICplbnYgPSBOVUxMOwotI2lmbmRlZiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKLQlpbnQgaTsKLQlERVZNT0RFIHNldHRpbmdzOwotI2VuZGlmCi0KLQkvKiBDcmVhdGUgdGhlIHdpbmRvdyAqLwotCWlmICggRElCX0NyZWF0ZVdpbmRvdyh0aGlzKSA8IDAgKSB7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0jaWYgIVNETF9BVURJT19ESVNBQkxFRAotCURYNV9Tb3VuZEZvY3VzKFNETF9XaW5kb3cpOwotI2VuZGlmCi0KLQkvKiBEZXRlcm1pbmUgdGhlIHNjcmVlbiBkZXB0aCAqLwotCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IERJQl9TdXNzU2NyZWVuRGVwdGgoKTsKLQlzd2l0Y2ggKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCkgewotCQljYXNlIDE1OgotCQkJdmZvcm1hdC0+Um1hc2sgPSAweDAwMDA3YzAwOwotCQkJdmZvcm1hdC0+R21hc2sgPSAweDAwMDAwM2UwOwotCQkJdmZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMDFmOwotCQkJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gMTY7Ci0JCQlicmVhazsKLQkJY2FzZSAxNjoKLQkJCXZmb3JtYXQtPlJtYXNrID0gMHgwMDAwZjgwMDsKLQkJCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDdlMDsKLQkJCXZmb3JtYXQtPkJtYXNrID0gMHgwMDAwMDAxZjsKLQkJCWJyZWFrOwotCQljYXNlIDI0OgotCQljYXNlIDMyOgotCQkJLyogR0RJIGRlZmluZWQgYXMgOC04LTggKi8KLQkJCXZmb3JtYXQtPlJtYXNrID0gMHgwMGZmMDAwMDsKLQkJCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwZmYwMDsKLQkJCXZmb3JtYXQtPkJtYXNrID0gMHgwMDAwMDBmZjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JLyogU2VlIGlmIGdhbW1hIGlzIHN1cHBvcnRlZCBvbiB0aGlzIHNjcmVlbiAqLwotCURJQl9DaGVja0dhbW1hKHRoaXMpOwotCi0jaWZuZGVmIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUwotCi0Jc2V0dGluZ3MuZG1TaXplID0gc2l6ZW9mKERFVk1PREUpOwotCXNldHRpbmdzLmRtRHJpdmVyRXh0cmEgPSAwOwotI2lmZGVmIF9XSU4zMl9XQ0UKLQlzZXR0aW5ncy5kbUZpZWxkcyA9IERNX0RJU1BMQVlRVUVSWU9SSUVOVEFUSU9OOwotCXRoaXMtPmhpZGRlbi0+c3VwcG9ydFJvdGF0aW9uID0gQ2hhbmdlRGlzcGxheVNldHRpbmdzRXgoTlVMTCwgJnNldHRpbmdzLCBOVUxMLCBDRFNfVEVTVCwgTlVMTCkgPT0gRElTUF9DSEFOR0VfU1VDQ0VTU0ZVTDsKLSNlbmRpZgotCS8qIFF1ZXJ5IGZvciB0aGUgZGVza3RvcCByZXNvbHV0aW9uICovCi0JRW51bURpc3BsYXlTZXR0aW5ncyhOVUxMLCBFTlVNX0NVUlJFTlRfU0VUVElOR1MsICZTRExfZGVza3RvcF9tb2RlKTsKLQl0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IFNETF9kZXNrdG9wX21vZGUuZG1QZWxzV2lkdGg7Ci0JdGhpcy0+aW5mby5jdXJyZW50X2ggPSBTRExfZGVza3RvcF9tb2RlLmRtUGVsc0hlaWdodDsKLQotCS8qIFF1ZXJ5IGZvciB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdmlkZW8gbW9kZXMgKi8KLQlmb3IgKCBpPTA7IEVudW1EaXNwbGF5U2V0dGluZ3MoTlVMTCwgaSwgJnNldHRpbmdzKTsgKytpICkgewotCQlESUJfQWRkTW9kZSh0aGlzLCBzZXR0aW5ncy5kbUJpdHNQZXJQZWwsCi0JCQlzZXR0aW5ncy5kbVBlbHNXaWR0aCwgc2V0dGluZ3MuZG1QZWxzSGVpZ2h0KTsKLSNpZmRlZiBfV0lOMzJfV0NFCi0JCWlmKCB0aGlzLT5oaWRkZW4tPnN1cHBvcnRSb3RhdGlvbiApCi0JCQlESUJfQWRkTW9kZSh0aGlzLCBzZXR0aW5ncy5kbUJpdHNQZXJQZWwsCi0JCQkJc2V0dGluZ3MuZG1QZWxzSGVpZ2h0LCBzZXR0aW5ncy5kbVBlbHNXaWR0aCk7Ci0jZW5kaWYKLQl9Ci0JLyogU29ydCB0aGUgbW9kZSBsaXN0cyAqLwotCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7Ci0JCWlmICggU0RMX251bW1vZGVzW2ldID4gMCApIHsKLQkJCVNETF9xc29ydChTRExfbW9kZWxpc3RbaV0sIFNETF9udW1tb2Rlc1tpXSwgc2l6ZW9mICpTRExfbW9kZWxpc3RbaV0sIGNtcG1vZGVzKTsKLQkJfQotCX0KLSNlbHNlCi0JLy8gV2luQ0UgYW5kIGZ1bGxzY3JlZW4gbW9kZToKLQkvLyBXZSB1c2Ugb25seSB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgdGhhdCBhbGxvdyBTREwgdG8KLQkvLyBlbXVsYXRlIG90aGVyIGJwcCAoOCwgMzIpIGFuZCB1c2UgdHJpcGxlIGJ1ZmZlciwKLQkvLyBiZWNhdXNlIFNETCBzdXJmYWNlIGNvbnZlcnNpb24gaXMgbXVjaCBmYXN0ZXIgdGhhbiB0aGUgV2luQ0Ugb25lLgotCS8vIEFsdGhvdWdoIGl0IHNob3VsZCBiZSB0ZXN0ZWQgb24gZGV2aWNlcyB3aXRoIGdyYXBoaWNzIGFjY2VsZXJhdG9yLgotCi0JRElCX0FkZE1vZGUodGhpcywgdmZvcm1hdC0+Qml0c1BlclBpeGVsLAotCQkJR2V0RGV2aWNlQ2FwcyhHZXREQyhOVUxMKSwgSE9SWlJFUyksCi0JCQlHZXREZXZpY2VDYXBzKEdldERDKE5VTEwpLCBWRVJUUkVTKSk7Ci0KLSNlbmRpZiAvKiAhTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTICovCi0KLQkvKiBHcmFiIGFuIGlkZW50aXR5IHBhbGV0dGUgaWYgd2UgYXJlIGluIGEgcGFsZXR0aXplZCBtb2RlICovCi0JaWYgKCB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPD0gOCApIHsKLQkvKglSSlI6IE1hcmNoIDI4LCAyMDAwCi0JCW1vdmVkIHBhbGV0dGUgY3JlYXRpb24gdG8gIkRJQl9DcmVhdGVQYWxldHRlIiAqLwotCQlESUJfQ3JlYXRlUGFsZXR0ZSh0aGlzLCB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpOwotCX0KLQotCS8qIEZpbGwgaW4gc29tZSB3aW5kb3cgbWFuYWdlciBjYXBhYmlsaXRpZXMgKi8KLQl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDE7Ci0KLSNpZmRlZiBfV0lOMzJfV0NFCi0JdGhpcy0+aGlkZGVuLT5vcmlnUm90YXRpb24gPSAtMTsKLSNlbmRpZgotCi0JLyogQWxsb3cgZW52aXJvbm1lbnQgb3ZlcnJpZGUgb2Ygc2NyZWVuc2F2ZXIgZGlzYWJsZS4gKi8KLQllbnYgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fQUxMT1dfU0NSRUVOU0FWRVIiKTsKLQl0aGlzLT5oaWRkZW4tPmFsbG93X3NjcmVlbnNhdmVyID0gKCAoZW52ICYmIFNETF9hdG9pKGVudikpID8gMSA6IDAgKTsKLQotCS8qIFdlJ3JlIGRvbmUhICovCi0JcmV0dXJuKDApOwotfQotCi0vKiBXZSBzdXBwb3J0IGFueSBmb3JtYXQgYXQgYW55IGRpbWVuc2lvbiAqLwotU0RMX1JlY3QgKipESUJfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQotewotCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgewotCQlyZXR1cm4oU0RMX21vZGVsaXN0WygoZm9ybWF0LT5CaXRzUGVyUGl4ZWwrNykvOCktMV0pOwotCX0gZWxzZSB7Ci0JCXJldHVybigoU0RMX1JlY3QgKiopLTEpOwotCX0KLX0KLQotCi0vKgotICBIZWxwZXIgZm4gdG8gd29yayBvdXQgd2hpY2ggc2NyZWVuIGRlcHRoIHdpbmRvd3MgaXMgY3VycmVudGx5IHVzaW5nLgotICAxNSBiaXQgbW9kZSBpcyBjb25zaWRlcmVkIDU1NSBmb3JtYXQsIDE2IGJpdCBpcyA1NjUuCi0gIHJldHVybnMgMCBmb3IgdW5rbm93biBtb2RlLgotICAoRGVyaXZlZCBmcm9tIGNvZGUgaW4gc2VwdCAxOTk5IFdpbmRvd3MgRGV2ZWxvcGVyIEpvdXJuYWwKLSAgaHR0cDovL3d3dy53ZGouY29tL2NvZGUvYXJjaGl2ZS5odG1sKQotKi8KLXN0YXRpYyBpbnQgRElCX1N1c3NTY3JlZW5EZXB0aCgpCi17Ci0jaWZkZWYgTk9fR0VURElCSVRTCi0JaW50IGRlcHRoOwotCUhEQyBoZGM7Ci0KLQloZGMgPSBHZXREQyhTRExfV2luZG93KTsKLQlkZXB0aCA9IEdldERldmljZUNhcHMoaGRjLCBQTEFORVMpICogR2V0RGV2aWNlQ2FwcyhoZGMsIEJJVFNQSVhFTCk7Ci0JUmVsZWFzZURDKFNETF9XaW5kb3csIGhkYyk7Ci0JcmV0dXJuKGRlcHRoKTsKLSNlbHNlCi0gICAgaW50IGRlcHRoOwotICAgIGludCBkaWJfc2l6ZTsKLSAgICBMUEJJVE1BUElORk9IRUFERVIgZGliX2hkcjsKLSAgICBIREMgaGRjOwotICAgIEhCSVRNQVAgaGJtOwotCi0gICAgLyogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBhIERJQiBoZWFkZXIgcGx1cyBwYWxldHRlIChmb3IKLSAgICAgKiA4LWJpdCBtb2Rlcykgb3IgYml0ZmllbGRzIChmb3IgMTYtIGFuZCAzMi1iaXQgbW9kZXMpCi0gICAgICovCi0gICAgZGliX3NpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyAyNTYgKiBzaXplb2YgKFJHQlFVQUQpOwotICAgIGRpYl9oZHIgPSAoTFBCSVRNQVBJTkZPSEVBREVSKSBTRExfbWFsbG9jKGRpYl9zaXplKTsKLSAgICBTRExfbWVtc2V0KGRpYl9oZHIsIDAsIGRpYl9zaXplKTsKLSAgICBkaWJfaGRyLT5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0KLSAgICAvKiBHZXQgYSBkZXZpY2UtZGVwZW5kZW50IGJpdG1hcCB0aGF0J3MgY29tcGF0aWJsZSB3aXRoIHRoZQotICAgICAgIHNjcmVlbi4KLSAgICAgKi8KLSAgICBoZGMgPSBHZXREQyhOVUxMKTsKLSAgICBoYm0gPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKCBoZGMsIDEsIDEgKTsKLQotICAgIC8qIENvbnZlcnQgdGhlIEREQiB0byBhIERJQi4gIFdlIG5lZWQgdG8gY2FsbCBHZXRESUJpdHMgdHdpY2U6Ci0gICAgICogdGhlIGZpcnN0IGNhbGwganVzdCBmaWxscyBpbiB0aGUgQklUTUFQSU5GT0hFQURFUjsgdGhlCi0gICAgICogc2Vjb25kIGZpbGxzIGluIHRoZSBiaXRmaWVsZHMgb3IgcGFsZXR0ZS4KLSAgICAgKi8KLSAgICBHZXRESUJpdHMoaGRjLCBoYm0sIDAsIDEsIE5VTEwsIChMUEJJVE1BUElORk8pIGRpYl9oZHIsIERJQl9SR0JfQ09MT1JTKTsKLSAgICBHZXRESUJpdHMoaGRjLCBoYm0sIDAsIDEsIE5VTEwsIChMUEJJVE1BUElORk8pIGRpYl9oZHIsIERJQl9SR0JfQ09MT1JTKTsKLSAgICBEZWxldGVPYmplY3QoaGJtKTsKLSAgICBSZWxlYXNlREMoTlVMTCwgaGRjKTsKLQotICAgIGRlcHRoID0gMDsKLSAgICBzd2l0Y2goIGRpYl9oZHItPmJpQml0Q291bnQgKQotICAgIHsKLSAgICBjYXNlIDg6ICAgICBkZXB0aCA9IDg7IGJyZWFrOwotICAgIGNhc2UgMjQ6ICAgIGRlcHRoID0gMjQ7IGJyZWFrOwotICAgIGNhc2UgMzI6ICAgIGRlcHRoID0gMzI7IGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICAgIGlmKCBkaWJfaGRyLT5iaUNvbXByZXNzaW9uID09IEJJX0JJVEZJRUxEUyApIHsKLSAgICAgICAgICAgIC8qIGNoZWNrIHRoZSByZWQgbWFzayAqLwotICAgICAgICAgICAgc3dpdGNoKCAoKERXT1JEKikoKGNoYXIqKWRpYl9oZHIgKyBkaWJfaGRyLT5iaVNpemUpKVswXSApIHsKLSAgICAgICAgICAgICAgICBjYXNlIDB4ZjgwMDogZGVwdGggPSAxNjsgYnJlYWs7ICAgLyogNTY1ICovCi0gICAgICAgICAgICAgICAgY2FzZSAweDdjMDA6IGRlcHRoID0gMTU7IGJyZWFrOyAgIC8qIDU1NSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIFNETF9mcmVlKGRpYl9oZHIpOwotICAgIHJldHVybiBkZXB0aDsKLSNlbmRpZiAvKiBOT19HRVRESUJJVFMgKi8KLX0KLQotCi0vKiBWYXJpb3VzIHNjcmVlbiB1cGRhdGUgZnVuY3Rpb25zIGF2YWlsYWJsZSAqLwotc3RhdGljIHZvaWQgRElCX05vcm1hbFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotCi1TRExfU3VyZmFjZSAqRElCX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JU0RMX1N1cmZhY2UgKnZpZGVvOwotCWludCBwcmV2X3csIHByZXZfaDsKLQlVaW50MzIgcHJldl9mbGFnczsKLQlEV09SRCBzdHlsZTsKLQljb25zdCBEV09SRCBkaXJlY3RzdHlsZSA9Ci0JCQkoV1NfUE9QVVApOwotCWNvbnN0IERXT1JEIHdpbmRvd3N0eWxlID0KLQkJCShXU19PVkVSTEFQUEVEfFdTX0NBUFRJT058V1NfU1lTTUVOVXxXU19NSU5JTUlaRUJPWCk7Ci0JY29uc3QgRFdPUkQgcmVzaXplc3R5bGUgPQotCQkJKFdTX1RISUNLRlJBTUV8V1NfTUFYSU1JWkVCT1gpOwotCWludCBiaW5mb19zaXplOwotCUJJVE1BUElORk8gKmJpbmZvOwotCUhEQyBoZGM7Ci0JUkVDVCBib3VuZHM7Ci0JaW50IHgsIHk7Ci0JVWludDMyIFJtYXNrLCBHbWFzaywgQm1hc2s7Ci0KLQkvKiBDbGVhbiB1cCBhbnkgR0wgY29udGV4dCB0aGF0IG1heSBiZSBoYW5naW5nIGFyb3VuZCAqLwotCWlmICggY3VycmVudC0+ZmxhZ3MgJiBTRExfT1BFTkdMICkgewotCQlXSU5fR0xfU2h1dERvd24odGhpcyk7Ci0JfQotCVNETF9yZXNpemluZyA9IDE7Ci0KLQkvKiBSZWNhbGN1bGF0ZSB0aGUgYml0bWFza3MgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCBicHAgPT0gY3VycmVudC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgKSB7Ci0JCXZpZGVvID0gY3VycmVudDsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGJwcCkgewotCQkJY2FzZSAxNToKLQkJCWNhc2UgMTY6Ci0JCQkJaWYgKCBESUJfU3Vzc1NjcmVlbkRlcHRoKCkgPT0gMTUgKSB7Ci0JCQkJCS8qIDUtNS01ICovCi0JCQkJCVJtYXNrID0gMHgwMDAwN2MwMDsKLQkJCQkJR21hc2sgPSAweDAwMDAwM2UwOwotCQkJCQlCbWFzayA9IDB4MDAwMDAwMWY7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogNS02LTUgKi8KLQkJCQkJUm1hc2sgPSAweDAwMDBmODAwOwotCQkJCQlHbWFzayA9IDB4MDAwMDA3ZTA7Ci0JCQkJCUJtYXNrID0gMHgwMDAwMDAxZjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJY2FzZSAzMjoKLQkJCQkvKiBHREkgZGVmaW5lZCBhcyA4LTgtOCAqLwotCQkJCVJtYXNrID0gMHgwMGZmMDAwMDsKLQkJCQlHbWFzayA9IDB4MDAwMGZmMDA7Ci0JCQkJQm1hc2sgPSAweDAwMDAwMGZmOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlSbWFzayA9IDB4MDAwMDAwMDA7Ci0JCQkJR21hc2sgPSAweDAwMDAwMDAwOwotCQkJCUJtYXNrID0gMHgwMDAwMDAwMDsKLQkJCQlicmVhazsKLQkJfQotCQl2aWRlbyA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsCi0JCQkJCTAsIDAsIGJwcCwgUm1hc2ssIEdtYXNrLCBCbWFzaywgMCk7Ci0JCWlmICggdmlkZW8gPT0gTlVMTCApIHsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJcmV0dXJuKE5VTEwpOwotCQl9Ci0JfQotCi0JLyogRmlsbCBpbiBwYXJ0IG9mIHRoZSB2aWRlbyBzdXJmYWNlICovCi0JcHJldl9mbGFncyA9IHZpZGVvLT5mbGFnczsKLQlwcmV2X3cgPSB2aWRlby0+dzsKLQlwcmV2X2ggPSB2aWRlby0+aDsKLQl2aWRlby0+ZmxhZ3MgPSAwOwkvKiBDbGVhciBmbGFncyAqLwotCXZpZGVvLT53ID0gd2lkdGg7Ci0JdmlkZW8tPmggPSBoZWlnaHQ7Ci0JdmlkZW8tPnBpdGNoID0gU0RMX0NhbGN1bGF0ZVBpdGNoKHZpZGVvKTsKLQotCS8qIFNtYWxsIGZpeCBmb3IgV2luQ0UvV2luMzIgLSB3aGVuIGFjdGl2YXRpbmcgd2luZG93Ci0JICAgU0RMX1ZpZGVvU3VyZmFjZSBpcyBlcXVhbCB0byB6ZXJvLCBzbyBhY3RpdmF0aW5nIGNvZGUKLQkgICBpcyBub3QgY2FsbGVkIHByb3Blcmx5IGZvciBmdWxsc2NyZWVuIHdpbmRvd3MgYmVjYXVzZQotCSAgIG1hY3JvcyBXSU5ESUJfRlVMTFNDUkVFTiB1c2VzIFNETF9WaWRlb1N1cmZhY2UKLQkqLwotCVNETF9WaWRlb1N1cmZhY2UgPSB2aWRlbzsKLQotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLQlpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKQotCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKLQkvKiBTZXQgZnVsbHNjcmVlbiBtb2RlIGlmIGFwcHJvcHJpYXRlICovCi0JaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCURFVk1PREUgc2V0dGluZ3M7Ci0JCUJPT0wgY2hhbmdlZDsKLQotCQlTRExfbWVtc2V0KCZzZXR0aW5ncywgMCwgc2l6ZW9mKERFVk1PREUpKTsKLQkJc2V0dGluZ3MuZG1TaXplID0gc2l6ZW9mKERFVk1PREUpOwotCi0jaWZkZWYgX1dJTjMyX1dDRQotCQkvLyB0cnkgdG8gcm90YXRlIHNjcmVlbiB0byBmaXQgcmVxdWVzdGVkIHJlc29sdXRpb24KLQkJaWYoIHRoaXMtPmhpZGRlbi0+c3VwcG9ydFJvdGF0aW9uICkKLQkJewotCQkJRFdPUkQgcm90YXRpb247Ci0KLQkJCS8vIGFzayBjdXJyZW50IG1vZGUKLQkJCXNldHRpbmdzLmRtRmllbGRzID0gRE1fRElTUExBWU9SSUVOVEFUSU9OOwotCQkJQ2hhbmdlRGlzcGxheVNldHRpbmdzRXgoTlVMTCwgJnNldHRpbmdzLCBOVUxMLCBDRFNfVEVTVCwgTlVMTCk7Ci0JCQlyb3RhdGlvbiA9IHNldHRpbmdzLmRtRGlzcGxheU9yaWVudGF0aW9uOwotCi0JCQlpZiggKHdpZHRoID4gR2V0RGV2aWNlQ2FwcyhHZXREQyhOVUxMKSwgSE9SWlJFUykpCi0JCQkJJiYgKGhlaWdodCA8IEdldERldmljZUNhcHMoR2V0REMoTlVMTCksIFZFUlRSRVMpKSkKLQkJCXsKLQkJCQlzd2l0Y2goIHJvdGF0aW9uICkKLQkJCQl7Ci0JCQkJY2FzZSBETURPXzA6Ci0JCQkJCXNldHRpbmdzLmRtRGlzcGxheU9yaWVudGF0aW9uID0gRE1ET185MDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBETURPXzI3MDoKLQkJCQkJc2V0dGluZ3MuZG1EaXNwbGF5T3JpZW50YXRpb24gPSBETURPXzE4MDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmKCBzZXR0aW5ncy5kbURpc3BsYXlPcmllbnRhdGlvbiAhPSByb3RhdGlvbiApCi0JCQkJewotCQkJCQkvLyBnbyB0byBsYW5kc2NhcGUKLQkJCQkJdGhpcy0+aGlkZGVuLT5vcmlnUm90YXRpb24gPSByb3RhdGlvbjsKLQkJCQkJQ2hhbmdlRGlzcGxheVNldHRpbmdzRXgoTlVMTCwmc2V0dGluZ3MsTlVMTCxDRFNfUkVTRVQsTlVMTCk7Ci0JCQkJfQotCQkJfQotCQkJaWYoICh3aWR0aCA8IEdldERldmljZUNhcHMoR2V0REMoTlVMTCksIEhPUlpSRVMpKQotCQkJCSYmIChoZWlnaHQgPiBHZXREZXZpY2VDYXBzKEdldERDKE5VTEwpLCBWRVJUUkVTKSkpCi0JCQl7Ci0JCQkJc3dpdGNoKCByb3RhdGlvbiApCi0JCQkJewotCQkJCWNhc2UgRE1ET185MDoKLQkJCQkJc2V0dGluZ3MuZG1EaXNwbGF5T3JpZW50YXRpb24gPSBETURPXzA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRE1ET18xODA6Ci0JCQkJCXNldHRpbmdzLmRtRGlzcGxheU9yaWVudGF0aW9uID0gRE1ET18yNzA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiggc2V0dGluZ3MuZG1EaXNwbGF5T3JpZW50YXRpb24gIT0gcm90YXRpb24gKQotCQkJCXsKLQkJCQkJLy8gZ28gdG8gcG9ydHJhaXQKLQkJCQkJdGhpcy0+aGlkZGVuLT5vcmlnUm90YXRpb24gPSByb3RhdGlvbjsKLQkJCQkJQ2hhbmdlRGlzcGxheVNldHRpbmdzRXgoTlVMTCwmc2V0dGluZ3MsTlVMTCxDRFNfUkVTRVQsTlVMTCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLSNlbmRpZgotCi0jaWZuZGVmIF9XSU4zMl9XQ0UKLQkJc2V0dGluZ3MuZG1CaXRzUGVyUGVsID0gdmlkZW8tPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCQlzZXR0aW5ncy5kbVBlbHNXaWR0aCA9IHdpZHRoOwotCQlzZXR0aW5ncy5kbVBlbHNIZWlnaHQgPSBoZWlnaHQ7Ci0JCXNldHRpbmdzLmRtRmllbGRzID0gRE1fUEVMU1dJRFRIIHwgRE1fUEVMU0hFSUdIVCB8IERNX0JJVFNQRVJQRUw7Ci0JCWlmICggd2lkdGggPD0gKGludClTRExfZGVza3RvcF9tb2RlLmRtUGVsc1dpZHRoICYmCi0JCSAgICAgaGVpZ2h0IDw9IChpbnQpU0RMX2Rlc2t0b3BfbW9kZS5kbVBlbHNIZWlnaHQgKSB7Ci0JCQlzZXR0aW5ncy5kbURpc3BsYXlGcmVxdWVuY3kgPSBTRExfZGVza3RvcF9tb2RlLmRtRGlzcGxheUZyZXF1ZW5jeTsKLQkJCXNldHRpbmdzLmRtRmllbGRzIHw9IERNX0RJU1BMQVlGUkVRVUVOQ1k7Ci0JCX0KLQkJY2hhbmdlZCA9IChDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoJnNldHRpbmdzLCBDRFNfRlVMTFNDUkVFTikgPT0gRElTUF9DSEFOR0VfU1VDQ0VTU0ZVTCk7Ci0JCWlmICggISBjaGFuZ2VkICYmIChzZXR0aW5ncy5kbUZpZWxkcyAmIERNX0RJU1BMQVlGUkVRVUVOQ1kpICkgewotCQkJc2V0dGluZ3MuZG1GaWVsZHMgJj0gfkRNX0RJU1BMQVlGUkVRVUVOQ1k7Ci0JCQljaGFuZ2VkID0gKENoYW5nZURpc3BsYXlTZXR0aW5ncygmc2V0dGluZ3MsIENEU19GVUxMU0NSRUVOKSA9PSBESVNQX0NIQU5HRV9TVUNDRVNTRlVMKTsKLQkJfQotI2Vsc2UKLQkJY2hhbmdlZCA9IDE7Ci0jZW5kaWYKLQkJaWYgKCBjaGFuZ2VkICkgewotCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOwotCQkJU0RMX2Z1bGxzY3JlZW5fbW9kZSA9IHNldHRpbmdzOwotCQl9Ci0KLQl9Ci0jZW5kaWYgLyogIU5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUyAqLwotCi0JLyogUmVzZXQgdGhlIHBhbGV0dGUgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCBncmFiX3BhbGV0dGUgKSB7Ci0JCURJQl9SZWxlYXNlU3RhdGljQ29sb3JzKFNETF9XaW5kb3cpOwotCQlncmFiX3BhbGV0dGUgPSBGQUxTRTsKLQl9Ci0JaWYgKCBzY3JlZW5fcGFsICE9IE5VTEwgKSB7Ci0JLyoJUkpSOiBNYXJjaCAyOCwgMjAwMAotCQlkZWxldGUgaWRlbnRpdHkgcGFsZXR0ZSBpZiBzd2l0Y2hpbmcgZnJvbSBhIHBhbGV0dGl6ZWQgbW9kZSAqLwotCQlEZWxldGVPYmplY3Qoc2NyZWVuX3BhbCk7Ci0JCXNjcmVlbl9wYWwgPSBOVUxMOwotCX0KLQlpZiAoIHNjcmVlbl9sb2dwYWwgIT0gTlVMTCApIHsKLQkJU0RMX2ZyZWUoc2NyZWVuX2xvZ3BhbCk7Ci0JCXNjcmVlbl9sb2dwYWwgPSBOVUxMOwotCX0KLQotCWlmICggYnBwIDw9IDggKQotCXsKLQkvKglSSlI6IE1hcmNoIDI4LCAyMDAwCi0JCWNyZWF0ZSBpZGVudGl0eSBwYWxldHRlIHN3aXRjaGluZyB0byBhIHBhbGV0dGl6ZWQgbW9kZSAqLwotCQlESUJfQ3JlYXRlUGFsZXR0ZSh0aGlzLCBicHApOwotCX0KLQotCXN0eWxlID0gR2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUpOwotCXN0eWxlICY9IH4ocmVzaXplc3R5bGV8V1NfTUFYSU1JWkUpOwotCWlmICggKHZpZGVvLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKLQkJc3R5bGUgJj0gfndpbmRvd3N0eWxlOwotCQlzdHlsZSB8PSBkaXJlY3RzdHlsZTsKLQl9IGVsc2UgewotI2lmbmRlZiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKLQkJaWYgKCAocHJldl9mbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKLQkJCUNoYW5nZURpc3BsYXlTZXR0aW5ncyhOVUxMLCAwKTsKLQkJfQotI2VuZGlmCi0JCWlmICggZmxhZ3MgJiBTRExfTk9GUkFNRSApIHsKLQkJCXN0eWxlICY9IH53aW5kb3dzdHlsZTsKLQkJCXN0eWxlIHw9IGRpcmVjdHN0eWxlOwotCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9OT0ZSQU1FOwotCQl9IGVsc2UgewotCQkJc3R5bGUgJj0gfmRpcmVjdHN0eWxlOwotCQkJc3R5bGUgfD0gd2luZG93c3R5bGU7Ci0JCQlpZiAoIGZsYWdzICYgU0RMX1JFU0laQUJMRSApIHsKLQkJCQlzdHlsZSB8PSByZXNpemVzdHlsZTsKLQkJCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX1JFU0laQUJMRTsKLQkJCX0KLQkJfQotI2lmIFdTX01BWElNSVpFCi0JCWlmIChJc1pvb21lZChTRExfV2luZG93KSkgc3R5bGUgfD0gV1NfTUFYSU1JWkU7Ci0jZW5kaWYKLQl9Ci0KLQkvKiBESk06IERvbid0IHBpc3Mgb2YgYW55b25lIHdobyBoYXMgc2V0dXAgaGlzIG93biB3aW5kb3cgKi8KLQlpZiAoICFTRExfd2luZG93aWQgKQotCQlTZXRXaW5kb3dMb25nKFNETF9XaW5kb3csIEdXTF9TVFlMRSwgc3R5bGUpOwotCi0JLyogRGVsZXRlIHRoZSBvbGQgYml0bWFwIGlmIG5lY2Vzc2FyeSAqLwotCWlmICggc2NyZWVuX2JtcCAhPSBOVUxMICkgewotCQlEZWxldGVPYmplY3Qoc2NyZWVuX2JtcCk7Ci0JfQotCWlmICggISAoZmxhZ3MgJiBTRExfT1BFTkdMKSApIHsKLQkJQk9PTCBpczE2Yml0bW9kZSA9ICh2aWRlby0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID09IDIpOwotCi0JCS8qIFN1c3Mgb3V0IHRoZSBiaXRtYXAgaW5mbyBoZWFkZXIgKi8KLQkJYmluZm9fc2l6ZSA9IHNpemVvZigqYmluZm8pOwotCQlpZiggaXMxNmJpdG1vZGUgKSB7Ci0JCQkvKiAxNmJpdCBtb2RlcywgcGFsZXR0ZSBhcmVhIHVzZWQgZm9yIHJnYiBiaXRtYXNrcyAqLwotCQkJYmluZm9fc2l6ZSArPSAzKnNpemVvZihEV09SRCk7Ci0JCX0gZWxzZSBpZiAoIHZpZGVvLT5mb3JtYXQtPnBhbGV0dGUgKSB7Ci0JCQliaW5mb19zaXplICs9IHZpZGVvLT5mb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnMgKgotCQkJCQkJCXNpemVvZihSR0JRVUFEKTsKLQkJfQotCQliaW5mbyA9IChCSVRNQVBJTkZPICopU0RMX21hbGxvYyhiaW5mb19zaXplKTsKLQkJaWYgKCAhIGJpbmZvICkgewotCQkJaWYgKCB2aWRlbyAhPSBjdXJyZW50ICkgewotCQkJCVNETF9GcmVlU3VyZmFjZSh2aWRlbyk7Ci0JCQl9Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCi0JCWJpbmZvLT5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotCQliaW5mby0+Ym1pSGVhZGVyLmJpV2lkdGggPSB2aWRlby0+dzsKLQkJYmluZm8tPmJtaUhlYWRlci5iaUhlaWdodCA9IC12aWRlby0+aDsJLyogLXZlIGZvciB0b3Bkb3duIGJpdG1hcCAqLwotCQliaW5mby0+Ym1pSGVhZGVyLmJpUGxhbmVzID0gMTsKLQkJYmluZm8tPmJtaUhlYWRlci5iaVNpemVJbWFnZSA9IHZpZGVvLT5oICogdmlkZW8tPnBpdGNoOwotCQliaW5mby0+Ym1pSGVhZGVyLmJpWFBlbHNQZXJNZXRlciA9IDA7Ci0JCWJpbmZvLT5ibWlIZWFkZXIuYmlZUGVsc1Blck1ldGVyID0gMDsKLQkJYmluZm8tPmJtaUhlYWRlci5iaUNsclVzZWQgPSAwOwotCQliaW5mby0+Ym1pSGVhZGVyLmJpQ2xySW1wb3J0YW50ID0gMDsKLQkJYmluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50ID0gdmlkZW8tPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCi0JCWlmICggaXMxNmJpdG1vZGUgKSB7Ci0JCQkvKiBCSV9CSVRGSUVMRFMgdGVsbHMgQ3JlYXRlRElCU2VjdGlvbiBhYm91dCB0aGUgcmdiIG1hc2tzIGluIHRoZSBwYWxldHRlICovCi0JCQliaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9CSVRGSUVMRFM7Ci0JCQkoKFVpbnQzMiopYmluZm8tPmJtaUNvbG9ycylbMF0gPSB2aWRlby0+Zm9ybWF0LT5SbWFzazsKLQkJCSgoVWludDMyKiliaW5mby0+Ym1pQ29sb3JzKVsxXSA9IHZpZGVvLT5mb3JtYXQtPkdtYXNrOwotCQkJKChVaW50MzIqKWJpbmZvLT5ibWlDb2xvcnMpWzJdID0gdmlkZW8tPmZvcm1hdC0+Qm1hc2s7Ci0JCX0gZWxzZSB7Ci0JCQliaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7CS8qIEJJX0JJVEZJRUxEUyBmb3IgNTY1IHZzIDU1NSAqLwotCQkJaWYgKCB2aWRlby0+Zm9ybWF0LT5wYWxldHRlICkgewotCQkJCVNETF9tZW1zZXQoYmluZm8tPmJtaUNvbG9ycywgMCwKLQkJCQkJdmlkZW8tPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9ycypzaXplb2YoUkdCUVVBRCkpOwotCQkJfQotCQl9Ci0KLQkJLyogQ3JlYXRlIHRoZSBvZmZzY3JlZW4gYml0bWFwIGJ1ZmZlciAqLwotCQloZGMgPSBHZXREQyhTRExfV2luZG93KTsKLQkJc2NyZWVuX2JtcCA9IENyZWF0ZURJQlNlY3Rpb24oaGRjLCBiaW5mbywgRElCX1JHQl9DT0xPUlMsCi0JCQkJCSh2b2lkICoqKSgmdmlkZW8tPnBpeGVscyksIE5VTEwsIDApOwotCQlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKLQkJU0RMX2ZyZWUoYmluZm8pOwotCQlpZiAoIHNjcmVlbl9ibXAgPT0gTlVMTCApIHsKLQkJCWlmICggdmlkZW8gIT0gY3VycmVudCApIHsKLQkJCQlTRExfRnJlZVN1cmZhY2UodmlkZW8pOwotCQkJfQotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgRElCIHNlY3Rpb24iKTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCQl0aGlzLT5VcGRhdGVSZWN0cyA9IERJQl9Ob3JtYWxVcGRhdGU7Ci0KLQkJLyogU2V0IHZpZGVvIHN1cmZhY2UgZmxhZ3MgKi8KLQkJaWYgKCBzY3JlZW5fcGFsICYmIChmbGFncyAmIChTRExfRlVMTFNDUkVFTnxTRExfSFdQQUxFVFRFKSkgKSB7Ci0JCQlncmFiX3BhbGV0dGUgPSBUUlVFOwotCQl9Ci0JCS8qIEJpdEJsdCgpIG1hcHMgY29sb3JzIGZvciB1cyAqLwotCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKLQl9Ci0jaWZuZGVmIF9XSU4zMl9XQ0UKLQkvKiBSZXNpemUgdGhlIHdpbmRvdyAqLwotCWlmICggIVNETF93aW5kb3dpZCAmJiAhSXNab29tZWQoU0RMX1dpbmRvdykgKSB7Ci0jZWxzZQotCWlmICggIVNETF93aW5kb3dpZCApIHsKLSNlbmRpZgotCQlIV05EIHRvcDsKLQkJVUlOVCBzd3BfZmxhZ3M7Ci0JCWNvbnN0IGNoYXIgKndpbmRvdyA9IE5VTEw7Ci0JCWNvbnN0IGNoYXIgKmNlbnRlciA9IE5VTEw7Ci0KLQkJaWYgKCB2aWRlby0+dyAhPSBwcmV2X3cgfHwgdmlkZW8tPmggIT0gcHJldl9oICkgewotCQkJd2luZG93ID0gU0RMX2dldGVudigiU0RMX1ZJREVPX1dJTkRPV19QT1MiKTsKLQkJCWNlbnRlciA9IFNETF9nZXRlbnYoIlNETF9WSURFT19DRU5URVJFRCIpOwotCQkJaWYgKCB3aW5kb3cgKSB7Ci0JCQkJaWYgKCBTRExfc3NjYW5mKHdpbmRvdywgIiVkLCVkIiwgJngsICZ5KSA9PSAyICkgewotCQkJCQlTRExfd2luZG93WCA9IHg7Ci0JCQkJCVNETF93aW5kb3dZID0geTsKLQkJCQl9Ci0JCQkJaWYgKCBTRExfc3RyY21wKHdpbmRvdywgImNlbnRlciIpID09IDAgKSB7Ci0JCQkJCWNlbnRlciA9IHdpbmRvdzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3dwX2ZsYWdzID0gKFNXUF9OT0NPUFlCSVRTIHwgU1dQX1NIT1dXSU5ET1cpOwotCi0JCWJvdW5kcy5sZWZ0ID0gU0RMX3dpbmRvd1g7Ci0JCWJvdW5kcy50b3AgPSBTRExfd2luZG93WTsKLQkJYm91bmRzLnJpZ2h0ID0gU0RMX3dpbmRvd1grdmlkZW8tPnc7Ci0JCWJvdW5kcy5ib3R0b20gPSBTRExfd2luZG93WSt2aWRlby0+aDsKLSNpZm5kZWYgX1dJTjMyX1dDRQotCQlBZGp1c3RXaW5kb3dSZWN0RXgoJmJvdW5kcywgR2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUpLCAoR2V0TWVudShTRExfV2luZG93KSAhPSBOVUxMKSwgMCk7Ci0jZWxzZQotCQkvLyBUaGUgYk1lbnUgcGFyYW1ldGVyIG11c3QgYmUgRkFMU0U7IG1lbnUgYmFycyBhcmUgbm90IHN1cHBvcnRlZAotCQlBZGp1c3RXaW5kb3dSZWN0RXgoJmJvdW5kcywgR2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUpLCAwLCAwKTsKLSNlbmRpZgotCQl3aWR0aCA9IGJvdW5kcy5yaWdodC1ib3VuZHMubGVmdDsKLQkJaGVpZ2h0ID0gYm91bmRzLmJvdHRvbS1ib3VuZHMudG9wOwotCQlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKLQkJCXggPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTiktd2lkdGgpLzI7Ci0JCQl5ID0gKEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pLWhlaWdodCkvMjsKLQkJfSBlbHNlIGlmICggY2VudGVyICkgewotCQkJeCA9IChHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKS13aWR0aCkvMjsKLQkJCXkgPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTiktaGVpZ2h0KS8yOwotCQl9IGVsc2UgaWYgKCBTRExfd2luZG93WCB8fCBTRExfd2luZG93WSB8fCB3aW5kb3cgKSB7Ci0JCQl4ID0gYm91bmRzLmxlZnQ7Ci0JCQl5ID0gYm91bmRzLnRvcDsKLQkJfSBlbHNlIHsKLQkJCXggPSB5ID0gLTE7Ci0JCQlzd3BfZmxhZ3MgfD0gU1dQX05PTU9WRTsKLQkJfQotCQlpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQl0b3AgPSBIV05EX1RPUE1PU1Q7Ci0JCX0gZWxzZSB7Ci0JCQl0b3AgPSBIV05EX05PVE9QTU9TVDsKLQkJfQotCQlTZXRXaW5kb3dQb3MoU0RMX1dpbmRvdywgdG9wLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzd3BfZmxhZ3MpOwotCQlpZiAoICEoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgKSB7Ci0JCQlTRExfd2luZG93WCA9IFNETF9ib3VuZHMubGVmdDsKLQkJCVNETF93aW5kb3dZID0gU0RMX2JvdW5kcy50b3A7Ci0JCX0KLQkJU2V0Rm9yZWdyb3VuZFdpbmRvdyhTRExfV2luZG93KTsKLQl9Ci0JU0RMX3Jlc2l6aW5nID0gMDsKLQotCS8qIFNldCB1cCBmb3IgT3BlbkdMICovCi0JaWYgKCBmbGFncyAmIFNETF9PUEVOR0wgKSB7Ci0JCWlmICggV0lOX0dMX1NldHVwV2luZG93KHRoaXMpIDwgMCApIHsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX09QRU5HTDsKLQl9Ci0KLQkvKiBKQyAxNCBNYXIgMjAwNgotCQlGbHVzaCB0aGUgbWVzc2FnZSBsb29wIG9yIHRoaXMgY2FuIGNhdXNlIGJpZyBwcm9ibGVtcyBsYXRlcgotCQlFc3BlY2lhbGx5IGlmIHRoZSB1c2VyIGRlY2lkZXMgdG8gdXNlIGRpYWxvZyBib3hlcyBvciBhc3NlcnQoKSEKLQkqLwotCVdJTl9GbHVzaE1lc3NhZ2VRdWV1ZSgpOwotCi0JLyogV2UncmUgbGl2ZSEgKi8KLQlyZXR1cm4odmlkZW8pOwotfQotCi0vKiBXZSBkb24ndCBhY3R1YWxseSBhbGxvdyBoYXJkd2FyZSBzdXJmYWNlcyBpbiB0aGUgRElCIGRyaXZlciAqLwotc3RhdGljIGludCBESUJfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigtMSk7Ci19Ci1zdGF0aWMgdm9pZCBESUJfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotc3RhdGljIGludCBESUJfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuKDApOwotfQotc3RhdGljIHZvaWQgRElCX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBESUJfTm9ybWFsVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKLXsKLQlIREMgaGRjLCBtZGM7Ci0JaW50IGk7Ci0KLQloZGMgPSBHZXREQyhTRExfV2luZG93KTsKLQlpZiAoIHNjcmVlbl9wYWwgKSB7Ci0JCVNlbGVjdFBhbGV0dGUoaGRjLCBzY3JlZW5fcGFsLCBGQUxTRSk7Ci0JfQotCW1kYyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpOwotCVNlbGVjdE9iamVjdChtZGMsIHNjcmVlbl9ibXApOwotCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgewotCQlCaXRCbHQoaGRjLCByZWN0c1tpXS54LCByZWN0c1tpXS55LCByZWN0c1tpXS53LCByZWN0c1tpXS5oLAotCQkJCQltZGMsIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksIFNSQ0NPUFkpOwotCX0KLQlEZWxldGVEQyhtZGMpOwotCVJlbGVhc2VEQyhTRExfV2luZG93LCBoZGMpOwotfQotCi1zdGF0aWMgaW50IEZpbmRQYWxldHRlSW5kZXgoTE9HUEFMRVRURSAqcGFsLCBCWVRFIHIsIEJZVEUgZywgQllURSBiKQotewotCVBBTEVUVEVFTlRSWSAqZW50cnk7Ci0JaW50IGk7Ci0JaW50IG5lbnRyaWVzID0gcGFsLT5wYWxOdW1FbnRyaWVzOwotCi0JZm9yICggaSA9IDA7IGkgPCBuZW50cmllczsgKytpICkgewotCQllbnRyeSA9ICZwYWwtPnBhbFBhbEVudHJ5W2ldOwotCQlpZiAoIGVudHJ5LT5wZVJlZCA9PSByICYmIGVudHJ5LT5wZUdyZWVuID09IGcgJiYgZW50cnktPnBlQmx1ZSA9PSBiICkgewotCQkJcmV0dXJuIGk7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgQk9PTCBDaGVja1BhbGV0dGVFbnRyeShMT0dQQUxFVFRFICpwYWwsIGludCBpbmRleCwgQllURSByLCBCWVRFIGcsIEJZVEUgYikKLXsKLQlQQUxFVFRFRU5UUlkgKmVudHJ5OwotCUJPT0wgbW92ZWQgPSAwOwotCi0JZW50cnkgPSAmcGFsLT5wYWxQYWxFbnRyeVtpbmRleF07Ci0JaWYgKCBlbnRyeS0+cGVSZWQgIT0gciB8fCBlbnRyeS0+cGVHcmVlbiAhPSBnIHx8IGVudHJ5LT5wZUJsdWUgIT0gYiApIHsKLQkJaW50IGZvdW5kID0gRmluZFBhbGV0dGVJbmRleChwYWwsIHIsIGcsIGIpOwotCQlpZiAoIGZvdW5kID49IDAgKSB7Ci0JCQlwYWwtPnBhbFBhbEVudHJ5W2ZvdW5kXSA9ICplbnRyeTsKLQkJfQotCQllbnRyeS0+cGVSZWQgPSByOwotCQllbnRyeS0+cGVHcmVlbiA9IGc7Ci0JCWVudHJ5LT5wZUJsdWUgPSBiOwotCQltb3ZlZCA9IDE7Ci0JfQotCWVudHJ5LT5wZUZsYWdzID0gMDsKLQotCXJldHVybiBtb3ZlZDsKLX0KLQotaW50IERJQl9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0jaWYgIWRlZmluZWQoX1dJTjMyX1dDRSkgfHwgKF9XSU4zMl9XQ0UgPj0gNDAwKQotCUhEQyBoZGMsIG1kYzsKLQlSR0JRVUFEICpwYWw7Ci0jZWxzZQotCUhEQyBoZGM7Ci0jZW5kaWYKLQlpbnQgaTsKLQlpbnQgbW92ZWRfZW50cmllcyA9IDA7Ci0KLQkvKiBVcGRhdGUgdGhlIGRpc3BsYXkgcGFsZXR0ZSAqLwotCWhkYyA9IEdldERDKFNETF9XaW5kb3cpOwotCWlmICggc2NyZWVuX3BhbCApIHsKLQkJUEFMRVRURUVOVFJZICplbnRyeTsKLQotCQlmb3IgKCBpPTA7IGk8bmNvbG9yczsgKytpICkgewotCQkJZW50cnkgPSAmc2NyZWVuX2xvZ3BhbC0+cGFsUGFsRW50cnlbZmlyc3Rjb2xvcitpXTsKLQkJCWVudHJ5LT5wZVJlZCAgID0gY29sb3JzW2ldLnI7Ci0JCQllbnRyeS0+cGVHcmVlbiA9IGNvbG9yc1tpXS5nOwotCQkJZW50cnktPnBlQmx1ZSAgPSBjb2xvcnNbaV0uYjsKLQkJCWVudHJ5LT5wZUZsYWdzID0gUENfTk9DT0xMQVBTRTsKLQkJfQotI2lmZGVmIFNZU1BBTF9OT1NUQVRJQwotCQkvKiBDaGVjayB0byBtYWtlIHN1cmUgYmxhY2sgYW5kIHdoaXRlIGFyZSBpbiBwb3NpdGlvbiAqLwotCQlpZiAoIEdldFN5c3RlbVBhbGV0dGVVc2UoaGRjKSAhPSBTWVNQQUxfTk9TVEFUSUMyNTYgKSB7Ci0JCQltb3ZlZF9lbnRyaWVzICs9IENoZWNrUGFsZXR0ZUVudHJ5KHNjcmVlbl9sb2dwYWwsIDAsIDB4MDAsIDB4MDAsIDB4MDApOwotCQkJbW92ZWRfZW50cmllcyArPSBDaGVja1BhbGV0dGVFbnRyeShzY3JlZW5fbG9ncGFsLCBzY3JlZW5fbG9ncGFsLT5wYWxOdW1FbnRyaWVzLTEsIDB4ZmYsIDB4ZmYsIDB4ZmYpOwotCQl9Ci0JCS8qIEZJWE1FOgotCQkgICBJZiB3ZSBkb24ndCBoYXZlIGZ1bGwgYWNjZXNzIHRvIHRoZSBwYWxldHRlLCB3aGF0IHdlCi0JCSAgIHJlYWxseSB3YW50IHRvIGRvIGlzIGZpbmQgdGhlIDIzNiBtb3N0IGRpdmVyc2UgY29sb3JzCi0JCSAgIGluIHRoZSBkZXNpcmVkIHBhbGV0dGUsIHNldCB0aG9zZSBlbnRyaWVzICgxMC0yNDUpIGFuZAotCQkgICB0aGVuIG1hcCBldmVyeXRoaW5nIGludG8gdGhlIG5ldyBzeXN0ZW0gcGFsZXR0ZS4KLQkJICovCi0jZW5kaWYKLQotI2lmbmRlZiBfV0lOMzJfV0NFCi0JCS8qIENvcHkgdGhlIGVudHJpZXMgaW50byB0aGUgc3lzdGVtIHBhbGV0dGUgKi8KLQkJVW5yZWFsaXplT2JqZWN0KHNjcmVlbl9wYWwpOwotI2VuZGlmCi0JCVNldFBhbGV0dGVFbnRyaWVzKHNjcmVlbl9wYWwsIDAsIHNjcmVlbl9sb2dwYWwtPnBhbE51bUVudHJpZXMsIHNjcmVlbl9sb2dwYWwtPnBhbFBhbEVudHJ5KTsKLQkJU2VsZWN0UGFsZXR0ZShoZGMsIHNjcmVlbl9wYWwsIEZBTFNFKTsKLQkJUmVhbGl6ZVBhbGV0dGUoaGRjKTsKLQl9Ci0KLSNpZiAhZGVmaW5lZChfV0lOMzJfV0NFKSB8fCAoX1dJTjMyX1dDRSA+PSA0MDApCi0JLyogQ29weSBwYWxldHRlIGNvbG9ycyBpbnRvIERJQiBwYWxldHRlICovCi0JcGFsID0gU0RMX3N0YWNrX2FsbG9jKFJHQlFVQUQsIG5jb2xvcnMpOwotCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7Ci0JCXBhbFtpXS5yZ2JSZWQgPSBjb2xvcnNbaV0ucjsKLQkJcGFsW2ldLnJnYkdyZWVuID0gY29sb3JzW2ldLmc7Ci0JCXBhbFtpXS5yZ2JCbHVlID0gY29sb3JzW2ldLmI7Ci0JCXBhbFtpXS5yZ2JSZXNlcnZlZCA9IDA7Ci0JfQotCi0JLyogU2V0IHRoZSBESUIgcGFsZXR0ZSBhbmQgdXBkYXRlIHRoZSBkaXNwbGF5ICovCi0JbWRjID0gQ3JlYXRlQ29tcGF0aWJsZURDKGhkYyk7Ci0JU2VsZWN0T2JqZWN0KG1kYywgc2NyZWVuX2JtcCk7Ci0JU2V0RElCQ29sb3JUYWJsZShtZGMsIGZpcnN0Y29sb3IsIG5jb2xvcnMsIHBhbCk7Ci0JaWYgKCBtb3ZlZF9lbnRyaWVzIHx8ICFncmFiX3BhbGV0dGUgKSB7Ci0JCUJpdEJsdChoZGMsIDAsIDAsIHRoaXMtPnNjcmVlbi0+dywgdGhpcy0+c2NyZWVuLT5oLAotCQkgICAgICAgbWRjLCAwLCAwLCBTUkNDT1BZKTsKLQl9Ci0JRGVsZXRlREMobWRjKTsKLQlTRExfc3RhY2tfZnJlZShwYWwpOwotI2VuZGlmCi0JUmVsZWFzZURDKFNETF9XaW5kb3csIGhkYyk7Ci0JcmV0dXJuKDEpOwotfQotCi0KLXN0YXRpYyB2b2lkIERJQl9DaGVja0dhbW1hKF9USElTKQotewotI2lmbmRlZiBOT19HQU1NQV9TVVBQT1JUCi0JSERDIGhkYzsKLQlXT1JEIHJhbXBbMyoyNTZdOwotCi0JLyogSWYgd2UgZmFpbCB0byBnZXQgZ2FtbWEsIGRpc2FibGUgZ2FtbWEgY29udHJvbCAqLwotCWhkYyA9IEdldERDKFNETF9XaW5kb3cpOwotCWlmICggISBHZXREZXZpY2VHYW1tYVJhbXAoaGRjLCByYW1wKSApIHsKLQkJdGhpcy0+R2V0R2FtbWFSYW1wID0gTlVMTDsKLQkJdGhpcy0+U2V0R2FtbWFSYW1wID0gTlVMTDsKLQl9Ci0JUmVsZWFzZURDKFNETF9XaW5kb3csIGhkYyk7Ci0jZW5kaWYgLyogIU5PX0dBTU1BX1NVUFBPUlQgKi8KLX0KLXZvaWQgRElCX1N3YXBHYW1tYShfVEhJUykKLXsKLSNpZm5kZWYgTk9fR0FNTUFfU1VQUE9SVAotCUhEQyBoZGM7Ci0KLQlpZiAoIGdhbW1hX3NhdmVkICkgewotCQloZGMgPSBHZXREQyhTRExfV2luZG93KTsKLQkJaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBJTlBVVEZPQ1VTICkgewotCQkJLyogQWJvdXQgdG8gbGVhdmUgYWN0aXZlIHN0YXRlLCByZXN0b3JlIGdhbW1hICovCi0JCQlTZXREZXZpY2VHYW1tYVJhbXAoaGRjLCBnYW1tYV9zYXZlZCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBBYm91dCB0byBlbnRlciBhY3RpdmUgc3RhdGUsIHNldCBnYW1lIGdhbW1hICovCi0JCQlHZXREZXZpY2VHYW1tYVJhbXAoaGRjLCBnYW1tYV9zYXZlZCk7Ci0JCQlTZXREZXZpY2VHYW1tYVJhbXAoaGRjLCB0aGlzLT5nYW1tYSk7Ci0JCX0KLQkJUmVsZWFzZURDKFNETF9XaW5kb3csIGhkYyk7Ci0JfQotI2VuZGlmIC8qICFOT19HQU1NQV9TVVBQT1JUICovCi19Ci12b2lkIERJQl9RdWl0R2FtbWEoX1RISVMpCi17Ci0jaWZuZGVmIE5PX0dBTU1BX1NVUFBPUlQKLQlpZiAoIGdhbW1hX3NhdmVkICkgewotCQkvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBnYW1tYSBpZiBuZWNlc3NhcnkgKi8KLQkJaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBJTlBVVEZPQ1VTICkgewotCQkJSERDIGhkYzsKLQotCQkJaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7Ci0JCQlTZXREZXZpY2VHYW1tYVJhbXAoaGRjLCBnYW1tYV9zYXZlZCk7Ci0JCQlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKLQkJfQotCi0JCS8qIEZyZWUgdGhlIHNhdmVkIGdhbW1hIG1lbW9yeSAqLwotCQlTRExfZnJlZShnYW1tYV9zYXZlZCk7Ci0JCWdhbW1hX3NhdmVkID0gMDsKLQl9Ci0jZW5kaWYgLyogIU5PX0dBTU1BX1NVUFBPUlQgKi8KLX0KLQotaW50IERJQl9TZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCkKLXsKLSNpZmRlZiBOT19HQU1NQV9TVVBQT1JUCi0JU0RMX1NldEVycm9yKCJTREwgY29tcGlsZWQgd2l0aG91dCBnYW1tYSByYW1wIHN1cHBvcnQiKTsKLQlyZXR1cm4gLTE7Ci0jZWxzZQotCUhEQyBoZGM7Ci0JQk9PTCBzdWNjZWVkZWQ7Ci0KLQkvKiBTZXQgdGhlIHJhbXAgZm9yIHRoZSBkaXNwbGF5ICovCi0JaWYgKCAhIGdhbW1hX3NhdmVkICkgewotCQlnYW1tYV9zYXZlZCA9IChXT1JEICopU0RMX21hbGxvYygzKjI1NipzaXplb2YoKmdhbW1hX3NhdmVkKSk7Ci0JCWlmICggISBnYW1tYV9zYXZlZCApIHsKLQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWhkYyA9IEdldERDKFNETF9XaW5kb3cpOwotCQlHZXREZXZpY2VHYW1tYVJhbXAoaGRjLCBnYW1tYV9zYXZlZCk7Ci0JCVJlbGVhc2VEQyhTRExfV2luZG93LCBoZGMpOwotCX0KLQlpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUElOUFVURk9DVVMgKSB7Ci0JCWhkYyA9IEdldERDKFNETF9XaW5kb3cpOwotCQlzdWNjZWVkZWQgPSBTZXREZXZpY2VHYW1tYVJhbXAoaGRjLCByYW1wKTsKLQkJUmVsZWFzZURDKFNETF9XaW5kb3csIGhkYyk7Ci0JfSBlbHNlIHsKLQkJc3VjY2VlZGVkID0gVFJVRTsKLQl9Ci0JcmV0dXJuIHN1Y2NlZWRlZCA/IDAgOiAtMTsKLSNlbmRpZiAvKiAhTk9fR0FNTUFfU1VQUE9SVCAqLwotfQotCi1pbnQgRElCX0dldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKQotewotI2lmZGVmIE5PX0dBTU1BX1NVUFBPUlQKLQlTRExfU2V0RXJyb3IoIlNETCBjb21waWxlZCB3aXRob3V0IGdhbW1hIHJhbXAgc3VwcG9ydCIpOwotCXJldHVybiAtMTsKLSNlbHNlCi0JSERDIGhkYzsKLQlCT09MIHN1Y2NlZWRlZDsKLQotCS8qIEdldCB0aGUgcmFtcCBmcm9tIHRoZSBkaXNwbGF5ICovCi0JaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7Ci0Jc3VjY2VlZGVkID0gR2V0RGV2aWNlR2FtbWFSYW1wKGhkYywgcmFtcCk7Ci0JUmVsZWFzZURDKFNETF9XaW5kb3csIGhkYyk7Ci0JcmV0dXJuIHN1Y2NlZWRlZCA/IDAgOiAtMTsKLSNlbmRpZiAvKiAhTk9fR0FNTUFfU1VQUE9SVCAqLwotfQotCi12b2lkIERJQl9WaWRlb1F1aXQoX1RISVMpCi17Ci0JaW50IGksIGo7Ci0KLQkvKiBEZXN0cm95IHRoZSB3aW5kb3cgYW5kIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIGl0ICovCi0JaWYgKCBTRExfV2luZG93ICkgewotCQkvKiBEZWxldGUgdGhlIHNjcmVlbiBiaXRtYXAgKGFsc28gZnJlZXMgc2NyZWVuLT5waXhlbHMpICovCi0JCWlmICggdGhpcy0+c2NyZWVuICkgewotCQkJaWYgKCBncmFiX3BhbGV0dGUgKSB7Ci0JCQkJRElCX1JlbGVhc2VTdGF0aWNDb2xvcnMoU0RMX1dpbmRvdyk7Ci0JCQl9Ci0jaWZuZGVmIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUwotCQkJaWYgKCB0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQkJQ2hhbmdlRGlzcGxheVNldHRpbmdzKE5VTEwsIDApOwotCQkJCVNob3dXaW5kb3coU0RMX1dpbmRvdywgU1dfSElERSk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWlmICggdGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9PUEVOR0wgKSB7Ci0JCQkJV0lOX0dMX1NodXREb3duKHRoaXMpOwotCQkJfQotCQkJdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOwotCQl9Ci0JCWlmICggc2NyZWVuX3BhbCAhPSBOVUxMICkgewotCQkJRGVsZXRlT2JqZWN0KHNjcmVlbl9wYWwpOwotCQkJc2NyZWVuX3BhbCA9IE5VTEw7Ci0JCX0KLQkJaWYgKCBzY3JlZW5fbG9ncGFsICE9IE5VTEwgKSB7Ci0JCQlTRExfZnJlZShzY3JlZW5fbG9ncGFsKTsKLQkJCXNjcmVlbl9sb2dwYWwgPSBOVUxMOwotCQl9Ci0JCWlmICggc2NyZWVuX2JtcCApIHsKLQkJCURlbGV0ZU9iamVjdChzY3JlZW5fYm1wKTsKLQkJCXNjcmVlbl9ibXAgPSBOVUxMOwotCQl9Ci0JCWlmICggc2NyZWVuX2ljbiApIHsKLQkJCURlc3Ryb3lJY29uKHNjcmVlbl9pY24pOwotCQkJc2NyZWVuX2ljbiA9IE5VTEw7Ci0JCX0KLQkJRElCX1F1aXRHYW1tYSh0aGlzKTsKLQkJRElCX0Rlc3Ryb3lXaW5kb3codGhpcyk7Ci0KLQkJU0RMX1dpbmRvdyA9IE5VTEw7Ci0KLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0KLS8vIFVubG9hZCB3aW5jZSBheWdzaGVsbCBsaWJyYXJ5IHRvIHByZXZlbnQgbGVhawotCQlpZiggYXlnc2hlbGwgKQotCQl7Ci0JCQlGcmVlTGlicmFyeShheWdzaGVsbCk7Ci0JCQlheWdzaGVsbCA9IE5VTEw7Ci0JCX0KLSNlbmRpZgotCX0KLQotCWZvciAoIGk9MDsgaSA8IFNETF9hcnJheXNpemUoU0RMX21vZGVsaXN0KTsgKytpICkgewotCQlpZiAoICFTRExfbW9kZWxpc3RbaV0gKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmb3IgKCBqPTA7IFNETF9tb2RlbGlzdFtpXVtqXTsgKytqICkgewotCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldW2pdKTsKLQkJfQotCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOwotCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOwotCQlTRExfbnVtbW9kZXNbaV0gPSAwOwotCX0KLX0KLQotLyogRXhwb3J0ZWQgZm9yIHRoZSB3aW5kb3dzIG1lc3NhZ2UgbG9vcCBvbmx5ICovCi1zdGF0aWMgdm9pZCBESUJfR3JhYlN0YXRpY0NvbG9ycyhIV05EIHdpbmRvdykKLXsKLSNpZmRlZiBTWVNQQUxfTk9TVEFUSUMKLQlIREMgaGRjOwotCi0JaGRjID0gR2V0REMod2luZG93KTsKLQlTZXRTeXN0ZW1QYWxldHRlVXNlKGhkYywgU1lTUEFMX05PU1RBVElDMjU2KTsKLQlpZiAoIEdldFN5c3RlbVBhbGV0dGVVc2UoaGRjKSAhPSBTWVNQQUxfTk9TVEFUSUMyNTYgKSB7Ci0JCVNldFN5c3RlbVBhbGV0dGVVc2UoaGRjLCBTWVNQQUxfTk9TVEFUSUMpOwotCX0KLQlSZWxlYXNlREMod2luZG93LCBoZGMpOwotI2VuZGlmCi19Ci1zdGF0aWMgdm9pZCBESUJfUmVsZWFzZVN0YXRpY0NvbG9ycyhIV05EIHdpbmRvdykKLXsKLSNpZmRlZiBTWVNQQUxfTk9TVEFUSUMKLQlIREMgaGRjOwotCi0JaGRjID0gR2V0REMod2luZG93KTsKLQlTZXRTeXN0ZW1QYWxldHRlVXNlKGhkYywgU1lTUEFMX1NUQVRJQyk7Ci0JUmVsZWFzZURDKHdpbmRvdywgaGRjKTsKLSNlbmRpZgotfQotc3RhdGljIHZvaWQgRElCX0FjdGl2YXRlKF9USElTLCBCT09MIGFjdGl2ZSwgQk9PTCBtaW5pbWl6ZWQpCi17Ci0JaWYgKCBncmFiX3BhbGV0dGUgKSB7Ci0JCWlmICggIWFjdGl2ZSApIHsKLQkJCURJQl9SZWxlYXNlU3RhdGljQ29sb3JzKFNETF9XaW5kb3cpOwotCQkJRElCX1JlYWxpemVQYWxldHRlKHRoaXMpOwotCQl9IGVsc2UgaWYgKCAhbWluaW1pemVkICkgewotCQkJRElCX0dyYWJTdGF0aWNDb2xvcnMoU0RMX1dpbmRvdyk7Ci0JCQlESUJfUmVhbGl6ZVBhbGV0dGUodGhpcyk7Ci0JCX0KLQl9Ci19Ci1zdGF0aWMgdm9pZCBESUJfUmVhbGl6ZVBhbGV0dGUoX1RISVMpCi17Ci0JaWYgKCBzY3JlZW5fcGFsICE9IE5VTEwgKSB7Ci0JCUhEQyBoZGM7Ci0KLQkJaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7Ci0jaWZuZGVmIF9XSU4zMl9XQ0UKLQkJVW5yZWFsaXplT2JqZWN0KHNjcmVlbl9wYWwpOwotI2VuZGlmCi0JCVNlbGVjdFBhbGV0dGUoaGRjLCBzY3JlZW5fcGFsLCBGQUxTRSk7Ci0JCWlmICggUmVhbGl6ZVBhbGV0dGUoaGRjKSApIHsKLQkJCUludmFsaWRhdGVSZWN0KFNETF9XaW5kb3csIE5VTEwsIEZBTFNFKTsKLQkJfQotCQlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKLQl9Ci19Ci1zdGF0aWMgdm9pZCBESUJfUGFsZXR0ZUNoYW5nZWQoX1RISVMsIEhXTkQgd2luZG93KQotewotCWlmICggd2luZG93ICE9IFNETF9XaW5kb3cgKSB7Ci0JCURJQl9SZWFsaXplUGFsZXR0ZSh0aGlzKTsKLQl9Ci19Ci0KLS8qIEV4cG9ydGVkIGZvciB0aGUgd2luZG93cyBtZXNzYWdlIGxvb3Agb25seSAqLwotc3RhdGljIHZvaWQgRElCX1dpblBBSU5UKF9USElTLCBIREMgaGRjKQotewotCUhEQyBtZGM7Ci0KLQlpZiAoIHNjcmVlbl9wYWwgKSB7Ci0JCVNlbGVjdFBhbGV0dGUoaGRjLCBzY3JlZW5fcGFsLCBGQUxTRSk7Ci0JfQotCW1kYyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpOwotCVNlbGVjdE9iamVjdChtZGMsIHNjcmVlbl9ibXApOwotCUJpdEJsdChoZGMsIDAsIDAsIFNETF9WaWRlb1N1cmZhY2UtPncsIFNETF9WaWRlb1N1cmZhY2UtPmgsCi0JCQkJCQkJbWRjLCAwLCAwLCBTUkNDT1BZKTsKLQlEZWxldGVEQyhtZGMpOwotfQotCi1zdGF0aWMgdm9pZCBESUJfR2V0V2luUG9zKF9USElTLCBpbnQqIHB4LCBpbnQgKnB5KQotewotCVJFQ1QgIHJlY3Q7Ci0JR2V0V2luZG93UmVjdChTRExfV2luZG93LCAmcmVjdCk7Ci0JKnB4ID0gcmVjdC5sZWZ0OwotCSpweSA9IHJlY3QudG9wOwotfQotCi1zdGF0aWMgdm9pZCBESUJfU2V0V2luUG9zKF9USElTLCBpbnQgIHgsIGludCAgeSkKLXsKLSAgICBTZXRXaW5kb3dQb3MoU0RMX1dpbmRvdywgSFdORF9UT1BNT1NULCAKLSAgICAgICAgICAgICAgICAgeCwgeSwgMCwgMCwgU1dQX05PU0laRXxTV1BfTk9aT1JERVIpOwotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50ICAgcmVzdWx0OwotICAgIGludCAgIGZpcnN0OwotICAgIFJFQ1QgIHdyZWN0OwotICAgIFJFQ1QgIHByaW1hcnk7Ci19IFZpc2liaWxpdHlEYXRhOwotCi0KLUJPT0wgQ0FMTEJBQ0sgdmlzaWJpbGl0eV9jYihITU9OSVRPUiAgaE1vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDICAgICAgIGhkY01vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSRUNUICAgIG1yZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSAgICBkd0RhdGEpCi17Ci0gICAgVmlzaWJpbGl0eURhdGEqICBkYXRhID0gKFZpc2liaWxpdHlEYXRhKilkd0RhdGE7Ci0gICAgCi0gICAgaWYgKCBkYXRhLT5maXJzdCApIHsKLSAgICAgICAgZGF0YS0+Zmlyc3QgICA9IDA7Ci0gICAgICAgIGRhdGEtPnByaW1hcnkgPSBtcmVjdFswXTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCBkYXRhLT53cmVjdC5sZWZ0ICAgPj0gbXJlY3QtPmxlZnQgICAmJgotICAgICAgICAgZGF0YS0+d3JlY3QucmlnaHQgIDw9IG1yZWN0LT5yaWdodCAgJiYKLSAgICAgICAgIGRhdGEtPndyZWN0LnRvcCAgICA+PSBtcmVjdC0+dG9wICAgICYmCi0gICAgICAgICBkYXRhLT53cmVjdC5ib3R0b20gPD0gbXJlY3QtPmJvdHRvbSApCi0gICAgewotICAgICAgICBkYXRhLT5yZXN1bHQgPSAxOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi1zdGF0aWMgaW50ICBESUJfSXNXaW5WaXNpYmxlKF9USElTLCBpbnQgIHJlY2VudGVyKQotewotICAgIFZpc2liaWxpdHlEYXRhICBkYXRhOwotICAgIGRhdGEucmVzdWx0ID0gMDsKLSAgICBkYXRhLmZpcnN0ICA9IDE7Ci0gICAgCi0gICAgR2V0V2luZG93UmVjdChTRExfV2luZG93LCAmZGF0YS53cmVjdCk7Ci0KLSAgICBFbnVtRGlzcGxheU1vbml0b3JzKE5VTEwsIE5VTEwsIHZpc2liaWxpdHlfY2IsIChMUEFSQU0pJmRhdGEpOwotICAgIAotICAgIGlmICggIWRhdGEucmVzdWx0ICYmIHJlY2VudGVyICkgewotICAgICAgICBpbnQgIG5ld194ID0gMTA7Ci0gICAgICAgIGludCAgbmV3X3kgPSAxMDsKLQotICAgICAgICBpZiAoICFkYXRhLmZpcnN0ICkgewotICAgICAgICAgICAgaW50ICBwcmltYXJ5X3cgPSBkYXRhLnByaW1hcnkucmlnaHQgIC0gZGF0YS5wcmltYXJ5LmxlZnQ7Ci0gICAgICAgICAgICBpbnQgIHByaW1hcnlfaCA9IGRhdGEucHJpbWFyeS5ib3R0b20gLSBkYXRhLnByaW1hcnkudG9wOwotCi0gICAgICAgICAgICBuZXdfeCA9IGRhdGEucHJpbWFyeS5sZWZ0ICsgKHByaW1hcnlfdyAtIHRoaXMtPnNjcmVlbi0+dykvMjsKLSAgICAgICAgICAgIG5ld195ID0gZGF0YS5wcmltYXJ5LnRvcCAgKyAocHJpbWFyeV9oIC0gdGhpcy0+c2NyZWVuLT5oKS8yOwotICAgICAgICB9Ci0gICAgICAgIERJQl9TZXRXaW5Qb3ModGhpcywgbmV3X3gsIG5ld195KTsKLSAgICB9Ci0gICAgcmV0dXJuICBkYXRhLnJlc3VsdDsKLX0KLQotc3RhdGljIGludCAgRElCX0dldE1vbml0b3JEUEkoX1RISVMsIGludCogeERwaSwgaW50ICp5RHBpKQotewotICAgIEhEQyAgZGlzcGxheURDID0gQ3JlYXRlREMoICJESVNQTEFZIiwgTlVMTCwgTlVMTCwgTlVMTCApOwotICAgIGludCAgeGRwaSwgeWRwaTsKLQotICAgIGlmIChkaXNwbGF5REMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHhkcGkgPSBHZXREZXZpY2VDYXBzKCBkaXNwbGF5REMsIExPR1BJWEVMU1ggKTsKLSAgICB5ZHBpID0gR2V0RGV2aWNlQ2FwcyggZGlzcGxheURDLCBMT0dQSVhFTFNZICk7Ci0KLSAgICBEZWxldGVEQyhkaXNwbGF5REMpOwotCi0gICAgLyogc2FuaXR5IGNoZWNrcyAqLwotICAgIGlmICh4ZHBpIDwgMjAgfHwgeGRwaSA+IDQwMCB8fCB5ZHBpIDwgMjAgfHwgeWRwaSA+IDQwMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgKnhEcGkgPSB4ZHBpOwotICAgICp5RHBpID0geWRwaTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50ICAgZmlyc3Q7Ci0gICAgUkVDVCAgd3JlY3Q7Ci0JbG9uZyAgYmVzdEFyZWE7Ci0JUkVDVCAgYmVzdFJlY3Q7Ci0JUkVDVCAgcHJpbWFyeTsKLX0gUHJveGltaXR5RGF0YTsKLQotQk9PTCBDQUxMQkFDSyBwcm94aW1pdHlfY2IoSE1PTklUT1IgIGhNb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDICAgICAgIGhkY01vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJFQ1QgICAgbXJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gICAgZHdEYXRhKQotewotICAgIFByb3hpbWl0eURhdGEqICBkYXRhID0gKFByb3hpbWl0eURhdGEqKWR3RGF0YTsKLSAgICBpbnQgICB4MSwgeTEsIHgyLCB5MiwgYXJlYTsKLQkKLQl4MSA9IG1yZWN0LT5sZWZ0OwotCXgyID0gbXJlY3QtPnJpZ2h0OwotCXkxID0gbXJlY3QtPnRvcDsKLQl5MiA9IG1yZWN0LT5ib3R0b207Ci0KLQlpZiAoZGF0YS0+Zmlyc3QpIHsKLQkJZGF0YS0+cHJpbWFyeSA9IG1yZWN0WzBdOwotCX0KLQkKLQlpZiAoeDEgPCBkYXRhLT53cmVjdC5sZWZ0KQotCQl4MSA9IGRhdGEtPndyZWN0LmxlZnQ7Ci0gICAgaWYgKHgyID4gZGF0YS0+d3JlY3QucmlnaHQpCi0JCXgyID0gZGF0YS0+d3JlY3QucmlnaHQ7Ci0JaWYgKHkxIDwgZGF0YS0+d3JlY3QudG9wKQotCQl5MSA9IGRhdGEtPndyZWN0LnRvcDsKLQlpZiAoeTIgPiBkYXRhLT53cmVjdC5ib3R0b20pCi0JCXkyID0gZGF0YS0+d3JlY3QuYm90dG9tOwotCQotCWlmICh4MSA+PSB4MiB8fCB5MSA+PSB5MikKLQkJcmV0dXJuIFRSVUU7Ci0KLQlhcmVhID0gKHgyLXgxKSooeTIteTEpOwotCWlmIChkYXRhLT5maXJzdCB8fCBhcmVhID4gZGF0YS0+YmVzdEFyZWEpIHsKLQkJZGF0YS0+Zmlyc3QgICAgPSAwOwotCQlkYXRhLT5iZXN0UmVjdCA9IG1yZWN0WzBdOwotCQlkYXRhLT5iZXN0QXJlYSA9IGFyZWE7Ci0JfQotICAgIHJldHVybiBUUlVFOwotfQotCi1zdGF0aWMgaW50ICBESUJfR2V0TW9uaXRvclJlY3QoX1RISVMsIFNETF9SZWN0KiAgcmVjdCkKLXsKLSAgICBQcm94aW1pdHlEYXRhICBkYXRhOwotCVJFQ1QqICAgICAgICAgIHNyOwotCi0gICAgZGF0YS5maXJzdCAgPSAxOwotICAgIEdldFdpbmRvd1JlY3QoU0RMX1dpbmRvdywgJmRhdGEud3JlY3QpOwotCi0gICAgRW51bURpc3BsYXlNb25pdG9ycyhOVUxMLCBOVUxMLCBwcm94aW1pdHlfY2IsIChMUEFSQU0pJmRhdGEpOwotCi0JaWYgKGRhdGEuZmlyc3QpCi0JCXJldHVybiAtMTsKLQotCXNyID0gJmRhdGEuYmVzdFJlY3Q7Ci0KLQlyZWN0LT54ID0gc3ItPmxlZnQ7Ci0JcmVjdC0+eSA9IHNyLT50b3A7Ci0JcmVjdC0+dyA9IHNyLT5yaWdodCAtIHNyLT5sZWZ0OwotCXJlY3QtPmggPSBzci0+Ym90dG9tIC0gc3ItPnRvcDsKLQkKLQlyZXR1cm4gMDsKLX0KLQotLyogU3R1YiBpbiBjYXNlIERpcmVjdFggaXNuJ3QgYXZhaWxhYmxlICovCi0jaWYgIVNETF9BVURJT19EUklWRVJfRFNPVU5ECi12b2lkIERYNV9Tb3VuZEZvY3VzKEhXTkQgaHduZCkKLXsKLQlyZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJ2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5kaWIvU0RMX2RpYnZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2MxMWQuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5kaWIvU0RMX2RpYnZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2RpYnZpZGVvX2gKLSNkZWZpbmUgX1NETF9kaWJ2aWRlb19oCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLyogZm9yIFBEQSAqLwotdHlwZWRlZiBlbnVtCi17Ci0JU0RMX09SSUVOVEFUSU9OX1VQLAotCVNETF9PUklFTlRBVElPTl9ET1dOLAotCVNETF9PUklFTlRBVElPTl9MRUZULAotCVNETF9PUklFTlRBVElPTl9SSUdIVAotfSBTRExfU2NyZWVuT3JpZW50YXRpb247Ci0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotICAgIEhCSVRNQVAgc2NyZWVuX2JtcDsKLSAgICBIUEFMRVRURSBzY3JlZW5fcGFsOwotICAgIExPR1BBTEVUVEUgKnNjcmVlbl9sb2dwYWw7Ci0gICAgQk9PTCBncmFiX3BhbGV0dGU7Ci0KLSAgICBpbnQgYWxsb3dfc2NyZWVuc2F2ZXI7Ci0KLSNkZWZpbmUgTlVNX01PREVMSVNUUwk0CQkvKiA4LCAxNiwgMjQsIGFuZCAzMiBiaXRzLXBlci1waXhlbCAqLwotICAgIGludCBTRExfbnVtbW9kZXNbTlVNX01PREVMSVNUU107Ci0gICAgU0RMX1JlY3QgKipTRExfbW9kZWxpc3RbTlVNX01PREVMSVNUU107Ci0KLQlTRExfU2NyZWVuT3JpZW50YXRpb24gb3JpZW50YXRpb247Ci0jaWZkZWYgX1dJTjMyX1dDRQotCWludCBpbnZlcnQ7IC8qIGRvIHRvIHJlbW92ZSwgdXNlZCBieSBHQVBJIGRyaXZlciEgKi8KLQljaGFyIGhpcmVzRml4OyAvKiB1c2luZyBoaXJlcyBtb2RlIHdpdGhvdXQgZGVmaW5pbmcgaGlyZXMgcmVzb3VyY2UgKi8KLQlpbnQgc3VwcG9ydFJvdGF0aW9uOyAvKiBmb3IgUG9ja2V0IFBDIGRldmljZXMgKi8KLQlEV09SRCBvcmlnUm90YXRpb247IC8qIGZvciBQb2NrZXQgUEMgZGV2aWNlcyAqLwotI2VuZGlmCi19OwotLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCi0jZGVmaW5lIHNjcmVlbl9ibXAJCSh0aGlzLT5oaWRkZW4tPnNjcmVlbl9ibXApCi0jZGVmaW5lIHNjcmVlbl9wYWwJCSh0aGlzLT5oaWRkZW4tPnNjcmVlbl9wYWwpCi0jZGVmaW5lIHNjcmVlbl9sb2dwYWwJCSh0aGlzLT5oaWRkZW4tPnNjcmVlbl9sb2dwYWwpCi0jZGVmaW5lIGdyYWJfcGFsZXR0ZQkJKHRoaXMtPmhpZGRlbi0+Z3JhYl9wYWxldHRlKQotI2RlZmluZSBTRExfbnVtbW9kZXMJCSh0aGlzLT5oaWRkZW4tPlNETF9udW1tb2RlcykKLSNkZWZpbmUgU0RMX21vZGVsaXN0CQkodGhpcy0+aGlkZGVuLT5TRExfbW9kZWxpc3QpCi0KLSNlbmRpZiAvKiBfU0RMX2RpYnZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZGliL1NETF92a2V5cy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5kaWIvU0RMX3ZrZXlzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjczYjEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5kaWIvU0RMX3ZrZXlzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotCi0jaWZuZGVmIFZLXzAKLSNkZWZpbmUgVktfMAknMCcKLSNkZWZpbmUgVktfMQknMScKLSNkZWZpbmUgVktfMgknMicKLSNkZWZpbmUgVktfMwknMycKLSNkZWZpbmUgVktfNAknNCcKLSNkZWZpbmUgVktfNQknNScKLSNkZWZpbmUgVktfNgknNicKLSNkZWZpbmUgVktfNwknNycKLSNkZWZpbmUgVktfOAknOCcKLSNkZWZpbmUgVktfOQknOScKLSNkZWZpbmUgVktfQQknQScKLSNkZWZpbmUgVktfQgknQicKLSNkZWZpbmUgVktfQwknQycKLSNkZWZpbmUgVktfRAknRCcKLSNkZWZpbmUgVktfRQknRScKLSNkZWZpbmUgVktfRgknRicKLSNkZWZpbmUgVktfRwknRycKLSNkZWZpbmUgVktfSAknSCcKLSNkZWZpbmUgVktfSQknSScKLSNkZWZpbmUgVktfSgknSicKLSNkZWZpbmUgVktfSwknSycKLSNkZWZpbmUgVktfTAknTCcKLSNkZWZpbmUgVktfTQknTScKLSNkZWZpbmUgVktfTgknTicKLSNkZWZpbmUgVktfTwknTycKLSNkZWZpbmUgVktfUAknUCcKLSNkZWZpbmUgVktfUQknUScKLSNkZWZpbmUgVktfUgknUicKLSNkZWZpbmUgVktfUwknUycKLSNkZWZpbmUgVktfVAknVCcKLSNkZWZpbmUgVktfVQknVScKLSNkZWZpbmUgVktfVgknVicKLSNkZWZpbmUgVktfVwknVycKLSNkZWZpbmUgVktfWAknWCcKLSNkZWZpbmUgVktfWQknWScKLSNkZWZpbmUgVktfWgknWicKLSNlbmRpZiAvKiBWS18wICovCi0KLS8qIFRoZXNlIGtleXMgaGF2ZW4ndCBiZWVuIGRlZmluZWQsIGJ1dCB3ZXJlIGV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQgKi8KLSNkZWZpbmUgVktfU0VNSUNPTE9OCTB4QkEKLSNkZWZpbmUgVktfRVFVQUxTCTB4QkIKLSNkZWZpbmUgVktfQ09NTUEJMHhCQwotI2RlZmluZSBWS19NSU5VUwkweEJECi0jZGVmaW5lIFZLX1BFUklPRAkweEJFCi0jZGVmaW5lIFZLX1NMQVNICTB4QkYKLSNkZWZpbmUgVktfR1JBVkUJMHhDMAotI2RlZmluZSBWS19MQlJBQ0tFVAkweERCCi0jZGVmaW5lIFZLX0JBQ0tTTEFTSAkweERDCi0jZGVmaW5lIFZLX1JCUkFDS0VUCTB4REQKLSNkZWZpbmUgVktfQVBPU1RST1BIRQkweERFCi0jZGVmaW5lIFZLX0JBQ0tUSUNLCTB4REYKLSNkZWZpbmUgVktfT0VNXzEwMgkweEUyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmR4NS9TRExfZHg1ZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmR4NS9TRExfZHg1ZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzczZDMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvU0RMX2R4NWV2ZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBDQVVUSU9OISEhISAgSWYgeW91IG1vZGlmeSB0aGlzIGZpbGUsIGNoZWNrIC4uL3dpbmRpYi9TRExfc3lzZXZlbnRzLmMgKi8KLQotI2luY2x1ZGUgImRpcmVjdHguaCIKLQotI2luY2x1ZGUgIlNETF9tYWluLmgiCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIi4uL3dpbmNvbW1vbi9TRExfbG93dmlkZW8uaCIKLSNpbmNsdWRlICJTRExfZHg1dmlkZW8uaCIKLQotI2lmbmRlZiBXTV9BUFAKLSNkZWZpbmUgV01fQVBQCTB4ODAwMAotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzJfV0NFCi0jZGVmaW5lIE5PX0dFVEtFWUJPQVJEU1RBVEUKLSNlbmRpZgotCi0vKiBUaGUga2V5Ym9hcmQgYW5kIG1vdXNlIGRldmljZSBpbnB1dCAqLwotI2RlZmluZSBNQVhfSU5QVVRTCTE2CQkvKiBNYXhpbXVtIG9mIDE2LTEgaW5wdXQgZGV2aWNlcyAqLwotI2RlZmluZSBJTlBVVF9RU0laRQk1MTIJCS8qIEJ1ZmZlciB1cCB0byA1MTIgaW5wdXQgbWVzc2FnZXMgKi8KLQotc3RhdGljIExQRElSRUNUSU5QVVQgZGlucHV0ID0gTlVMTDsKLXN0YXRpYyBMUERJUkVDVElOUFVUREVWSUNFMiBTRExfRElkZXZbTUFYX0lOUFVUU107Ci1zdGF0aWMgSEFORExFICAgICAgICAgICAgICAgU0RMX0RJZXZ0W01BWF9JTlBVVFNdOwotc3RhdGljIHZvaWQgKCpTRExfRElmdW5bTUFYX0lOUFVUU10pKGNvbnN0IGludCwgRElERVZJQ0VPQkpFQ1REQVRBICopOwotc3RhdGljIGludCBTRExfREluZGV2ID0gMDsKLXN0YXRpYyBpbnQgbW91c2VfbG9zdDsKLXN0YXRpYyBpbnQgbW91c2VfcHJlc3NlZDsKLXN0YXRpYyBpbnQgbW91c2VfYnV0dG9uc19zd2FwcGVkID0gMDsKLQotLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gYSBEaXJlY3RJbnB1dCBzY2FuY29kZSB0byBhbiBTREwga2V5c3ltICovCi1zdGF0aWMgU0RMS2V5IERJS19rZXltYXBbMjU2XTsKLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoVUlOVCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgcHJlc3NlZCk7Ci0KLS8qIERKTTogSWYgdGhlIHVzZXIgc2V0dXAgdGhlIHdpbmRvdyBmb3IgdXMsIHdlIHdhbnQgdG8gc2F2ZSBoaXMgd2luZG93IHByb2MsCi0gICBhbmQgZ2l2ZSBoaW0gYSBjaGFuY2UgdG8gaGFuZGxlIHNvbWUgbWVzc2FnZXMuICovCi0jaWZkZWYgU1RSSUNUCi0jZGVmaW5lIFdORFBST0NUWVBFCVdORFBST0MKLSNlbHNlCi0jZGVmaW5lIFdORFBST0NUWVBFCUZBUlBST0MKLSNlbmRpZgotc3RhdGljIFdORFBST0NUWVBFIHVzZXJXaW5kb3dQcm9jID0gTlVMTDsKLQotc3RhdGljIEhXTkQgR2V0VG9wTGV2ZWxQYXJlbnQoSFdORCBoV25kKQotewotICAgIEhXTkQgaFBhcmVudFduZDsKLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgIGhQYXJlbnRXbmQgPSBHZXRQYXJlbnQoaFduZCk7Ci0gICAgICAgIGlmIChoUGFyZW50V25kID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaFduZCA9IGhQYXJlbnRXbmQ7Ci0gICAgfQotICAgIHJldHVybiBoV25kOwotfQotCi0vKiBDb252ZXJ0IGEgRGlyZWN0SW5wdXQgcmV0dXJuIGNvZGUgdG8gYSB0ZXh0IG1lc3NhZ2UgKi8KLXN0YXRpYyB2b2lkIFNldERJZXJyb3IoY2hhciAqZnVuY3Rpb24sIGludCBjb2RlKQotewotCXN0YXRpYyBjaGFyICplcnJvcjsKLQlzdGF0aWMgY2hhciAgZXJyYnVmWzEwMjRdOwotCi0JZXJyYnVmWzBdID0gMDsKLQlzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERJRVJSX0dFTkVSSUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJVbmRlZmluZWQgZXJyb3IhIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQljYXNlIERJRVJSX09MRERJUkVDVElOUFVUVkVSU0lPTjoKLQkJCWVycm9yID0gIllvdXIgdmVyc2lvbiBvZiBEaXJlY3RJbnB1dCBuZWVkcyB1cGdyYWRpbmciOwotCQkJYnJlYWs7Ci0JCWNhc2UgRElFUlJfSU5WQUxJRFBBUkFNOgotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiSW52YWxpZCBwYXJhbWV0ZXJzIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRElFUlJfT1VUT0ZNRU1PUlk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJPdXQgb2YgbWVtb3J5IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQljYXNlIERJRVJSX0RFVklDRU5PVFJFRzoKLQkJCWVycm9yID0gIkRldmljZSBub3QgcmVnaXN0ZXJlZCI7Ci0JCQlicmVhazsKLQkJY2FzZSBESUVSUl9OT0lOVEVSRkFDRToKLQkJCWVycm9yID0gIkludGVyZmFjZSBub3Qgc3VwcG9ydGVkIjsKLQkJCWJyZWFrOwotCQljYXNlIERJRVJSX05PVElOSVRJQUxJWkVEOgotCQkJZXJyb3IgPSAiRGV2aWNlIG5vdCBpbml0aWFsaXplZCI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVNETF9zbnByaW50ZihlcnJidWYsIFNETF9hcnJheXNpemUoZXJyYnVmKSwKLQkJCSAgICAgICAgICIlczogVW5rbm93biBEaXJlY3RJbnB1dCBlcnJvcjogMHgleCIsCi0JCQkJCQkJCWZ1bmN0aW9uLCBjb2RlKTsKLQkJCWJyZWFrOwotCX0KLQlpZiAoICEgZXJyYnVmWzBdICkgewotCQlTRExfc25wcmludGYoZXJyYnVmLCBTRExfYXJyYXlzaXplKGVycmJ1ZiksICIlczogJXMiLCBmdW5jdGlvbiwgZXJyb3IpOwotCX0KLQlTRExfU2V0RXJyb3IoIiVzIiwgZXJyYnVmKTsKLQlyZXR1cm47Ci19Ci0KLS8qIEluaXRpYWxpemUgRGlyZWN0SW5wdXQKLSAgIE5vdGU6ICBJZiBOT05FWENMVVNJVkUgYWNjZXNzIGlzIHJlcXVlc3RlZCBmb3IgdGhlIGRldmljZXMsIG5vcm1hbCAKLSAgICAgICAgICB3aW5kb3dzIGlucHV0IG1lc3NhZ2VzIHdpbGwgY29udGludWUgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGF0Ci0gICAgICAgICAgaW5wdXQgZGV2aWNlLCBpbiBhZGRpdGlvbiB0byBEaXJlY3RJbnB1dCBtZXNzYWdlcy4KLSAqLwotc3RhdGljIHZvaWQgaGFuZGxlX2tleWJvYXJkKGNvbnN0IGludCBudW1ldmVudHMsIERJREVWSUNFT0JKRUNUREFUQSAqZXZlbnRzKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9tb3VzZShjb25zdCBpbnQgbnVtZXZlbnRzLCBESURFVklDRU9CSkVDVERBVEEgKmV2ZW50cyk7Ci1zdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JUkVGR1VJRCBndWlkOwotCUxQQ0RJREFUQUZPUk1BVCBmb3JtYXQ7Ci0JRFdPUkQgd2luX2xldmVsOwotCURXT1JEIHJhd19sZXZlbDsKLQl2b2lkICgqZnVuKShjb25zdCBpbnQgbnVtZXZlbnRzLCBESURFVklDRU9CSkVDVERBVEEgKmV2ZW50cyk7Ci19IGlucHV0c1tdID0gewotCXsgImtleWJvYXJkIiwKLQkJJkdVSURfU3lzS2V5Ym9hcmQsICZjX2RmRElLZXlib2FyZCwKLQkJKERJU0NMX0ZPUkVHUk9VTkR8RElTQ0xfTk9ORVhDTFVTSVZFKSwKLQkJKERJU0NMX0ZPUkVHUk9VTkR8RElTQ0xfTk9ORVhDTFVTSVZFKSwgaGFuZGxlX2tleWJvYXJkIH0sCi0JeyAibW91c2UiLAotCQkmR1VJRF9TeXNNb3VzZSwgJmNfZGZESU1vdXNlLAotCQkoRElTQ0xfRk9SRUdST1VORHxESVNDTF9OT05FWENMVVNJVkUpLAotCQkoRElTQ0xfRk9SRUdST1VORHxESVNDTF9FWENMVVNJVkUpLCBoYW5kbGVfbW91c2UgfSwKLQl7IE5VTEwsIE5VTEwsIE5VTEwsIDAsIDAsIE5VTEwgfQotfTsKLQkKLXN0YXRpYyBpbnQgRFg1X0RJbnB1dEluaXQoX1RISVMpCi17Ci0JaW50ICAgICAgICAgaTsKLQlMUERJUkVDVElOUFVUREVWSUNFIGRldmljZTsKLQlIUkVTVUxUICAgICByZXN1bHQ7Ci0JRElQUk9QRFdPUkQgZGlwZHc7Ci0JSFdORCAgICAgICAgdG9wd25kOwotCi0JLyogQ3JlYXRlIHRoZSBEaXJlY3RJbnB1dCBvYmplY3QgKi8KLQlyZXN1bHQgPSBESW5wdXRDcmVhdGUoU0RMX0luc3RhbmNlLCBESVJFQ1RJTlBVVF9WRVJTSU9OLAotCQkJCQkJCSZkaW5wdXQsIE5VTEwpOwotCWlmICggcmVzdWx0ICE9IERJX09LICkgewotCQlTZXRESWVycm9yKCJEaXJlY3RJbnB1dENyZWF0ZSIsIHJlc3VsdCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogQ3JlYXRlIGFsbCBvZiBvdXIgcmVnaXN0ZXJlZCBpbnB1dCBkZXZpY2VzICovCi0JU0RMX0RJbmRldiA9IDA7Ci0JZm9yICggaT0wOyBpbnB1dHNbaV0ubmFtZTsgKytpICkgewotCQkvKiBDcmVhdGUgdGhlIERpcmVjdElucHV0IGRldmljZSAqLwotCQlyZXN1bHQgPSBJRGlyZWN0SW5wdXRfQ3JlYXRlRGV2aWNlKGRpbnB1dCwgaW5wdXRzW2ldLmd1aWQsCi0JCQkJCQkJCSZkZXZpY2UsIE5VTEwpOwotCQlpZiAoIHJlc3VsdCAhPSBESV9PSyApIHsKLQkJCVNldERJZXJyb3IoIkRpcmVjdElucHV0OjpDcmVhdGVEZXZpY2UiLCByZXN1bHQpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQlyZXN1bHQgPSBJRGlyZWN0SW5wdXREZXZpY2VfUXVlcnlJbnRlcmZhY2UoZGV2aWNlLAotCQkJJklJRF9JRGlyZWN0SW5wdXREZXZpY2UyLCAoTFBWT0lEICopJlNETF9ESWRldltpXSk7Ci0JCUlEaXJlY3RJbnB1dERldmljZV9SZWxlYXNlKGRldmljZSk7Ci0JCWlmICggcmVzdWx0ICE9IERJX09LICkgewotCQkJU2V0REllcnJvcigiRGlyZWN0SW5wdXREZXZpY2U6OlF1ZXJ5SW50ZXJmYWNlIiwgcmVzdWx0KTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJdG9wd25kID0gIEdldFRvcExldmVsUGFyZW50KFNETF9XaW5kb3cpOwotCQlyZXN1bHQgPSBJRGlyZWN0SW5wdXREZXZpY2UyX1NldENvb3BlcmF0aXZlTGV2ZWwoU0RMX0RJZGV2W2ldLAotCQkJCQl0b3B3bmQsIGlucHV0c1tpXS53aW5fbGV2ZWwpOwotCQlpZiAoIHJlc3VsdCAhPSBESV9PSyApIHsKLQkJCVNldERJZXJyb3IoIkRpcmVjdElucHV0RGV2aWNlOjpTZXRDb29wZXJhdGl2ZUxldmVsIiwKLQkJCQkJCQkJCXJlc3VsdCk7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCXJlc3VsdCA9IElEaXJlY3RJbnB1dERldmljZTJfU2V0RGF0YUZvcm1hdChTRExfRElkZXZbaV0sCi0JCQkJCQkJaW5wdXRzW2ldLmZvcm1hdCk7Ci0JCWlmICggcmVzdWx0ICE9IERJX09LICkgewotCQkJU2V0REllcnJvcigiRGlyZWN0SW5wdXREZXZpY2U6OlNldERhdGFGb3JtYXQiLCByZXN1bHQpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCi0JCS8qIFNldCBidWZmZXJlZCBpbnB1dCAtLSB3ZSBhcmVuJ3QgcG9sbGluZyAqLwotCQlTRExfbWVtc2V0KCZkaXBkdywgMCwgc2l6ZW9mKGRpcGR3KSk7Ci0JCWRpcGR3LmRpcGguZHdTaXplID0gc2l6ZW9mKGRpcGR3KTsKLQkJZGlwZHcuZGlwaC5kd0hlYWRlclNpemUgPSBzaXplb2YoZGlwZHcuZGlwaCk7Ci0JCWRpcGR3LmRpcGguZHdPYmogPSAwOwotCQlkaXBkdy5kaXBoLmR3SG93ID0gRElQSF9ERVZJQ0U7Ci0JCWRpcGR3LmR3RGF0YSA9IElOUFVUX1FTSVpFOwotCQlyZXN1bHQgPSBJRGlyZWN0SW5wdXREZXZpY2UyX1NldFByb3BlcnR5KFNETF9ESWRldltpXSwKLQkJCQkJCURJUFJPUF9CVUZGRVJTSVpFLCAmZGlwZHcuZGlwaCk7Ci0JCWlmICggcmVzdWx0ICE9IERJX09LICkgewotCQkJU2V0REllcnJvcigiRGlyZWN0SW5wdXREZXZpY2U6OlNldFByb3BlcnR5IiwgcmVzdWx0KTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQotCQkvKiBDcmVhdGUgYW4gZXZlbnQgdG8gYmUgc2lnbmFsZWQgd2hlbiBpbnB1dCBpcyByZWFkeSAqLwotCQlTRExfRElldnRbaV0gPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOwotCQlpZiAoIFNETF9ESWV2dFtpXSA9PSBOVUxMICkgewotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgRGlyZWN0SW5wdXQgZXZlbnQiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQkJcmVzdWx0ID0gSURpcmVjdElucHV0RGV2aWNlMl9TZXRFdmVudE5vdGlmaWNhdGlvbihTRExfRElkZXZbaV0sCi0JCQkJCQkJCVNETF9ESWV2dFtpXSk7Ci0JCWlmICggcmVzdWx0ICE9IERJX09LICkgewotCQkJU2V0REllcnJvcigiRGlyZWN0SW5wdXREZXZpY2U6OlNldEV2ZW50Tm90aWZpY2F0aW9uIiwKLQkJCQkJCQkJCXJlc3VsdCk7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCVNETF9ESWZ1bltpXSA9IGlucHV0c1tpXS5mdW47Ci0KLQkJLyogQWNxdWlyZSB0aGUgZGV2aWNlIGZvciBpbnB1dCAqLwotCQlJRGlyZWN0SW5wdXREZXZpY2UyX0FjcXVpcmUoU0RMX0RJZGV2W2ldKTsKLQotCQkvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBkZXZpY2VzIHdlIGhhdmUgKi8KLQkJKytTRExfREluZGV2OwotCX0KLQltb3VzZV9wcmVzc2VkID0gMDsKLQltb3VzZV9idXR0b25zX3N3YXBwZWQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX1NXQVBCVVRUT04pOwotCi0JLyogRGlyZWN0SW5wdXQgaXMgcmVhZHkhICovCi0JcmV0dXJuKDApOwotfQotCi0vKiBDbGVhbiB1cCBEaXJlY3RJbnB1dCAqLwotc3RhdGljIHZvaWQgRFg1X0RJbnB1dFF1aXQoX1RISVMpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIGRpbnB1dCAhPSBOVUxMICkgewotCQkvKiBDbG9zZSBhbmQgcmVsZWFzZSBhbGwgRGlyZWN0SW5wdXQgZGV2aWNlcyAqLwotCQlmb3IgKCBpPTA7IGk8TUFYX0lOUFVUUzsgKytpICkgewotCQkJaWYgKCBTRExfRElkZXZbaV0gIT0gTlVMTCApIHsKLQkJCQlJRGlyZWN0SW5wdXREZXZpY2UyX1VuYWNxdWlyZShTRExfRElkZXZbaV0pOwotCQkJCUlEaXJlY3RJbnB1dERldmljZTJfU2V0RXZlbnROb3RpZmljYXRpb24oCi0JCQkJCQkJU0RMX0RJZGV2W2ldLCBOVUxMKTsKLQkJCQlpZiAoIFNETF9ESWV2dFtpXSAhPSBOVUxMICkgewotCQkJCQlDbG9zZUhhbmRsZShTRExfRElldnRbaV0pOwotCQkJCQlTRExfRElldnRbaV0gPSBOVUxMOwotCQkJCX0KLQkJCQlJRGlyZWN0SW5wdXREZXZpY2UyX1JlbGVhc2UoU0RMX0RJZGV2W2ldKTsKLQkJCQlTRExfRElkZXZbaV0gPSBOVUxMOwotCQkJfQotCQl9Ci0JCS8qIFJlbGVhc2UgRGlyZWN0SW5wdXQgKi8KLQkJSURpcmVjdElucHV0X1JlbGVhc2UoZGlucHV0KTsKLQkJZGlucHV0ID0gTlVMTDsKLQl9Ci19Ci0KLS8qIEZsYWcgdG8gdGVsbCBTREwgd2hldGhlciBvciBub3Qgd2UgcXVldWVkIGFuIGV2ZW50ICovCi1zdGF0aWMgaW50IHBvc3RlZCA9IDA7Ci0KLS8qIElucHV0IGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfa2V5Ym9hcmQoY29uc3QgaW50IG51bWV2ZW50cywgRElERVZJQ0VPQkpFQ1REQVRBICprZXlidWYpCi17Ci0JaW50IGk7Ci0JU0RMX2tleXN5bSBrZXlzeW07Ci0KLQkvKiBUcmFuc2xhdGUga2V5Ym9hcmQgbWVzc2FnZXMgKi8KLQlmb3IgKCBpPTA7IGk8bnVtZXZlbnRzOyArK2kgKSB7Ci0JCWlmICgga2V5YnVmW2ldLmR3RGF0YSAmIDB4ODAgKSB7Ci0JCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELAotCQkJCSAgICBUcmFuc2xhdGVLZXkoa2V5YnVmW2ldLmR3T2ZzLCAma2V5c3ltLCAxKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwKLQkJCQkgICAgVHJhbnNsYXRlS2V5KGtleWJ1ZltpXS5kd09mcywgJmtleXN5bSwgMCkpOwotCQl9Ci0JfQotfQotc3RhdGljIHZvaWQgaGFuZGxlX21vdXNlKGNvbnN0IGludCBudW1ldmVudHMsIERJREVWSUNFT0JKRUNUREFUQSAqcHRyYnVmKQotewotCWludCBpOwotCVNpbnQxNiB4cmVsLCB5cmVsOwotCVVpbnQ4IHN0YXRlOwotCVVpbnQ4IGJ1dHRvbjsKLQlEV09SRCB0aW1lc3RhbXAgPSAwOwotCi0JLyogU2FuaXR5IGNoZWNrLiBNYWlsaW5nIGxpc3QgcmVwb3J0cyB0aGlzIGJlaW5nIE5VTEwgdW5leHBlY3RlZGx5LiAqLwotCWlmIChTRExfUHVibGljU3VyZmFjZSA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBJZiB3ZSBhcmUgaW4gd2luZG93ZWQgbW9kZSwgV2luZG93cyBpcyB0YWtpbmcgY2FyZSBvZiB0aGUgbW91c2UgKi8KLQlpZiAoICAoU0RMX1B1YmxpY1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCkgfHwKLQkgICAgICEoU0RMX1B1YmxpY1N1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogSWYgdGhlIG1vdXNlIHdhcyBsb3N0LCByZWdhaW4gc29tZSBzZW5zZSBvZiBtb3VzZSBzdGF0ZSAqLwotCWlmICggbW91c2VfbG9zdCApIHsKLQkJUE9JTlQgbW91c2VfcG9zOwotCQlVaW50OCBvbGRfc3RhdGU7Ci0JCVVpbnQ4IG5ld19zdGF0ZTsKLQotCQkvKiBTZXQgb3Vyc2VsdmVzIHVwIHdpdGggdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uICovCi0JCUdldEN1cnNvclBvcygmbW91c2VfcG9zKTsKLQkJU2NyZWVuVG9DbGllbnQoU0RMX1dpbmRvdywgJm1vdXNlX3Bvcyk7Ci0JCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwKLQkJCQkoU2ludDE2KW1vdXNlX3Bvcy54LCAoU2ludDE2KW1vdXNlX3Bvcy55KTsKLQotCQkvKiBDaGVjayBmb3IgbW91c2UgYnV0dG9uIGNoYW5nZXMgKi8KLQkJb2xkX3N0YXRlID0gU0RMX0dldE1vdXNlU3RhdGUoTlVMTCwgTlVMTCk7Ci0JCW5ld19zdGF0ZSA9IDA7Ci0JCXsgLyogR2V0IHRoZSBuZXcgRGlyZWN0SW5wdXQgYnV0dG9uIHN0YXRlIGZvciB0aGUgbW91c2UgKi8KLQkJCURJTU9VU0VTVEFURSBkaXN0YXRlOwotCQkJSFJFU1VMVCByZXN1bHQ7Ci0KLQkJCXJlc3VsdD1JRGlyZWN0SW5wdXREZXZpY2UyX0dldERldmljZVN0YXRlKFNETF9ESWRldlsxXSwKLQkJCQkJCXNpemVvZihkaXN0YXRlKSwgJmRpc3RhdGUpOwotCQkJaWYgKCByZXN1bHQgIT0gRElfT0sgKSB7Ci0JCQkJLyogVHJ5IGFnYWluIG5leHQgdGltZSAqLwotCQkJCVNldERJZXJyb3IoCi0JCQkJIklEaXJlY3RJbnB1dERldmljZTI6OkdldERldmljZVN0YXRlIiwgcmVzdWx0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlmb3IgKCBpPTM7IGk+PTA7IC0taSApIHsKLQkJCQlpZiAoIChkaXN0YXRlLnJnYkJ1dHRvbnNbaV0mMHg4MCkgPT0gMHg4MCApIHsKLQkJCQkJbmV3X3N0YXRlIHw9IDB4MDE7Ci0JCQkJfQotCQkJCW5ld19zdGF0ZSA8PD0gMTsKLQkJCX0KLQkJfQotCQlmb3IgKCBpPTA7IGk8ODsgKytpICkgewotCQkJaWYgKCAob2xkX3N0YXRlJjB4MDEpICE9IChuZXdfc3RhdGUmMHgwMSkgKSB7Ci0JCQkJYnV0dG9uID0gKFVpbnQ4KShpKzEpOwotCQkJCS8qIEJ1dHRvbiAjMiBvbiB0d28gYnV0dG9uIG1pY2UgaXMgYnV0dG9uIDMKLQkJCQkgICAodGhlIG1pZGRsZSBidXR0b24gaXMgYnV0dG9uIDIpCi0JCQkJICovCi0JCQkJaWYgKCBidXR0b24gPT0gMiApIHsKLQkJCQkJYnV0dG9uID0gMzsKLQkJCQl9IGVsc2UKLQkJCQlpZiAoIGJ1dHRvbiA9PSAzICkgewotCQkJCQlidXR0b24gPSAyOwotCQkJCX0KLQkJCQlpZiAoIG5ld19zdGF0ZSAmIDB4MDEgKSB7Ci0JCQkJCS8qIEdyYWIgbW91c2Ugc28gd2UgZ2V0IG1vdXNlLXVwICovCi0JCQkJCWlmICggKyttb3VzZV9wcmVzc2VkID4gMCApIHsKLQkJCQkJCVNldENhcHR1cmUoU0RMX1dpbmRvdyk7Ci0JCQkJCX0KLQkJCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBSZWxlYXNlIG1vdXNlIGFmdGVyIGFsbCBtb3VzZS11cHMgKi8KLQkJCQkJaWYgKCAtLW1vdXNlX3ByZXNzZWQgPD0gMCApIHsKLQkJCQkJCVJlbGVhc2VDYXB0dXJlKCk7Ci0JCQkJCQltb3VzZV9wcmVzc2VkID0gMDsKLQkJCQkJfQotCQkJCQlzdGF0ZSA9IFNETF9SRUxFQVNFRDsKLQkJCQl9Ci0JCQkJaWYgKCBtb3VzZV9idXR0b25zX3N3YXBwZWQgKSB7Ci0JCQkJCWlmICggYnV0dG9uID09IDEgKSBidXR0b24gPSAzOwotCQkJCQllbHNlCi0JCQkJCWlmICggYnV0dG9uID09IDMgKSBidXR0b24gPSAxOwotCQkJCX0KLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKHN0YXRlLCBidXR0b24sCi0JCQkJCQkJCQkwLCAwKTsKLQkJCX0KLQkJCW9sZF9zdGF0ZSA+Pj0gMTsKLQkJCW5ld19zdGF0ZSA+Pj0gMTsKLQkJfQotCQltb3VzZV9sb3N0ID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRyYW5zbGF0ZSBtb3VzZSBtZXNzYWdlcyAqLwotCXhyZWwgPSAwOwotCXlyZWwgPSAwOwotCWZvciAoIGk9MDsgaTwoaW50KW51bWV2ZW50czsgKytpICkgewotCQlzd2l0Y2ggKHB0cmJ1ZltpXS5kd09mcykgewotCQkJY2FzZSBESU1PRlNfWDoKLQkJCQlpZiAoIHRpbWVzdGFtcCAhPSBwdHJidWZbaV0uZHdUaW1lU3RhbXAgKSB7Ci0JCQkJCWlmICggeHJlbCB8fCB5cmVsICkgewotCQkJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigKLQkJCQkJCQkJMCwgMSwgeHJlbCwgeXJlbCk7Ci0JCQkJCQl4cmVsID0gMDsKLQkJCQkJCXlyZWwgPSAwOwotCQkJCQl9Ci0JCQkJCXRpbWVzdGFtcCA9IHB0cmJ1ZltpXS5kd1RpbWVTdGFtcDsKLQkJCQl9Ci0JCQkJeHJlbCArPSAoU2ludDE2KXB0cmJ1ZltpXS5kd0RhdGE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERJTU9GU19ZOgotCQkJCWlmICggdGltZXN0YW1wICE9IHB0cmJ1ZltpXS5kd1RpbWVTdGFtcCApIHsKLQkJCQkJaWYgKCB4cmVsIHx8IHlyZWwgKSB7Ci0JCQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKAotCQkJCQkJCQkwLCAxLCB4cmVsLCB5cmVsKTsKLQkJCQkJCXhyZWwgPSAwOwotCQkJCQkJeXJlbCA9IDA7Ci0JCQkJCX0KLQkJCQkJdGltZXN0YW1wID0gcHRyYnVmW2ldLmR3VGltZVN0YW1wOwotCQkJCX0KLQkJCQl5cmVsICs9IChTaW50MTYpcHRyYnVmW2ldLmR3RGF0YTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRElNT0ZTX1o6Ci0JCQkJaWYgKCB4cmVsIHx8IHlyZWwgKSB7Ci0JCQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oCi0JCQkJCQkJMCwgMSwgeHJlbCwgeXJlbCk7Ci0JCQkJCXhyZWwgPSAwOwotCQkJCQl5cmVsID0gMDsKLQkJCQl9Ci0JCQkJdGltZXN0YW1wID0gMDsKLQkJCQlpZigoaW50KXB0cmJ1ZltpXS5kd0RhdGEgPiAwKQotCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX1dIRUVMVVA7Ci0JCQkJZWxzZQotCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX1dIRUVMRE9XTjsKLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKAotCQkJCQkJU0RMX1BSRVNTRUQsIGJ1dHRvbiwgMCwgMCk7Ci0JCQkJcG9zdGVkIHw9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oCi0JCQkJCQlTRExfUkVMRUFTRUQsIGJ1dHRvbiwgMCwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERJTU9GU19CVVRUT04wOgotCQkJY2FzZSBESU1PRlNfQlVUVE9OMToKLQkJCWNhc2UgRElNT0ZTX0JVVFRPTjI6Ci0JCQljYXNlIERJTU9GU19CVVRUT04zOgotCQkJCWlmICggeHJlbCB8fCB5cmVsICkgewotCQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKAotCQkJCQkJCTAsIDEsIHhyZWwsIHlyZWwpOwotCQkJCQl4cmVsID0gMDsKLQkJCQkJeXJlbCA9IDA7Ci0JCQkJfQotCQkJCXRpbWVzdGFtcCA9IDA7Ci0JCQkJYnV0dG9uID0gKFVpbnQ4KShwdHJidWZbaV0uZHdPZnMtRElNT0ZTX0JVVFRPTjApKzE7Ci0JCQkJLyogQnV0dG9uICMyIG9uIHR3byBidXR0b24gbWljZSBpcyBidXR0b24gMwotCQkJCSAgICh0aGUgbWlkZGxlIGJ1dHRvbiBpcyBidXR0b24gMikKLQkJCQkgKi8KLQkJCQlpZiAoIGJ1dHRvbiA9PSAyICkgewotCQkJCQlidXR0b24gPSAzOwotCQkJCX0gZWxzZQotCQkJCWlmICggYnV0dG9uID09IDMgKSB7Ci0JCQkJCWJ1dHRvbiA9IDI7Ci0JCQkJfQotCQkJCWlmICggcHRyYnVmW2ldLmR3RGF0YSAmIDB4ODAgKSB7Ci0JCQkJCS8qIEdyYWIgbW91c2Ugc28gd2UgZ2V0IG1vdXNlLXVwICovCi0JCQkJCWlmICggKyttb3VzZV9wcmVzc2VkID4gMCApIHsKLQkJCQkJCVNldENhcHR1cmUoU0RMX1dpbmRvdyk7Ci0JCQkJCX0KLQkJCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBSZWxlYXNlIG1vdXNlIGFmdGVyIGFsbCBtb3VzZS11cHMgKi8KLQkJCQkJaWYgKCAtLW1vdXNlX3ByZXNzZWQgPD0gMCApIHsKLQkJCQkJCVJlbGVhc2VDYXB0dXJlKCk7Ci0JCQkJCQltb3VzZV9wcmVzc2VkID0gMDsKLQkJCQkJfQotCQkJCQlzdGF0ZSA9IFNETF9SRUxFQVNFRDsKLQkJCQl9Ci0JCQkJaWYgKCBtb3VzZV9idXR0b25zX3N3YXBwZWQgKSB7Ci0JCQkJCWlmICggYnV0dG9uID09IDEgKSBidXR0b24gPSAzOwotCQkJCQllbHNlCi0JCQkJCWlmICggYnV0dG9uID09IDMgKSBidXR0b24gPSAxOwotCQkJCX0KLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKHN0YXRlLCBidXR0b24sCi0JCQkJCQkJCQkwLCAwKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIHhyZWwgfHwgeXJlbCApIHsKLQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbiggMCwgMSwgeHJlbCwgeXJlbCk7Ci0JfQotfQotCi0vKiBUaGUgbWFpbiBXaW4zMiBldmVudCBoYW5kbGVyICovCi1MUkVTVUxUIERYNV9IYW5kbGVNZXNzYWdlKF9USElTLCBIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotCXN3aXRjaCAobXNnKSB7Ci0jaWZkZWYgV01fQUNUSVZBVEVBUFAKLQkJY2FzZSBXTV9BQ1RJVkFURUFQUDogewotCQkJaW50IGksIGFjdGl2ZTsKLQotCQkJYWN0aXZlID0gKHdQYXJhbSAmJiAoR2V0Rm9yZWdyb3VuZFdpbmRvdygpID09IGh3bmQpKTsKLQkJCWlmICggYWN0aXZlICkgewotCQkJCWZvciAoIGk9MDsgU0RMX0RJZGV2W2ldOyArK2kgKSB7Ci0JCQkJCUlEaXJlY3RJbnB1dERldmljZTJfQWNxdWlyZSgKLQkJCQkJCQkJU0RMX0RJZGV2W2ldKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoIGk9MDsgU0RMX0RJZGV2W2ldOyArK2kgKSB7Ci0JCQkJCUlEaXJlY3RJbnB1dERldmljZTJfVW5hY3F1aXJlKAotCQkJCQkJCQlTRExfRElkZXZbaV0pOwotCQkJCX0KLQkJCQltb3VzZV9sb3N0ID0gMTsKLQkJCX0KLQkJfQotCQlicmVhazsKLSNlbmRpZiAvKiBXTV9BQ1RJVkFURUFQUCAqLwotCi0jaWZkZWYgV01fRElTUExBWUNIQU5HRQotCQljYXNlIFdNX0RJU1BMQVlDSEFOR0U6IHsKLQkJCVdQQVJBTSBCaXRzUGVyUGl4ZWw7Ci0JCQlXT1JEIFNpemVYLCBTaXplWTsKLQotCQkJLyogQWNrISAgVGhlIGRpc3BsYXkgY2hhbmdlZCBzaXplIGFuZC9vciBkZXB0aCEgKi8KLQkJCVNpemVYID0gTE9XT1JEKGxQYXJhbSk7Ci0JCQlTaXplWSA9IEhJV09SRChsUGFyYW0pOwotCQkJQml0c1BlclBpeGVsID0gd1BhcmFtOwotCQkJLyogV2UgY2F1c2UgdGhpcyBtZXNzYWdlIHdoZW4gd2UgZ28gZnVsbHNjcmVlbiAqLwotCQl9Ci0JCWJyZWFrOwotI2VuZGlmIC8qIFdNX0RJU1BMQVlDSEFOR0UgKi8KLQotCQkvKiBUaGUga2V5Ym9hcmQgaXMgaGFuZGxlZCB2aWEgRGlyZWN0SW5wdXQgKi8KLQkJY2FzZSBXTV9TWVNLRVlVUDoKLQkJY2FzZSBXTV9TWVNLRVlET1dOOiB7Ci0JCQkvKiBQYXNzIHN5c2tleSB0byBEZWZXaW5kd29Qcm9jIChBTFQtRjQsIGV0Yy4pICovCi0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgV01fS0VZVVA6Ci0JCWNhc2UgV01fS0VZRE9XTjogewotCQkJLyogSWdub3JlIHdpbmRvd3Mga2V5Ym9hcmQgbWVzc2FnZXMgKi87Ci0JCX0KLQkJcmV0dXJuKDApOwotCi0jaWYgZGVmaW5lZChTQ19TQ1JFRU5TQVZFKSB8fCBkZWZpbmVkKFNDX01PTklUT1JQT1dFUikKLQkJLyogRG9uJ3QgYWxsb3cgc2NyZWVuIHNhdmVycyBvciBtb25pdG9yIHBvd2VyIGRvd25zLgotCQkgICBUaGlzIGlzIGJlY2F1c2UgdGhleSBxdWlldGx5IGNsZWFyIERpcmVjdFggc3VyZmFjZXMuCi0JCSAgIEl0IHdvdWxkIGJlIGJldHRlciB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8KLQkJICAgZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGJsb3cgdGhlc2Ugb2ZmLCBidXQgdGhlCi0JCSAgIHNlbWFudGljcyBvZiBTRExfUHJpdmF0ZVN5c1dNRXZlbnQoKSBkb24ndCBhbGxvdwotCQkgICB0aGUgYXBwbGljYXRpb24gdGhhdCBjaG9pY2UuCi0JCSAqLwotCQljYXNlIFdNX1NZU0NPTU1BTkQ6IHsKLQkJCWlmICgod1BhcmFtJjB4RkZGMCk9PVNDX1NDUkVFTlNBVkUgfHwgCi0JCQkgICAgKHdQYXJhbSYweEZGRjApPT1TQ19NT05JVE9SUE9XRVIpCi0JCQkJcmV0dXJuKDApOwotCQl9Ci0JCS8qIEZhbGwgdGhyb3VnaCB0byBkZWZhdWx0IHByb2Nlc3NpbmcgKi8KLQotI2VuZGlmIC8qIFNDX1NDUkVFTlNBVkUgfHwgU0NfTU9OSVRPUlBPV0VSICovCi0KLQkJZGVmYXVsdDogewotCQkJLyogT25seSBwb3N0IHRoZSBldmVudCBpZiB3ZSdyZSB3YXRjaGluZyBmb3IgaXQgKi8KLQkJCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX1NZU1dNRVZFTlRdID09IFNETF9FTkFCTEUgKSB7Ci0JCQkgICAgICAgIFNETF9TeXNXTW1zZyB3bW1zZzsKLQotCQkJCVNETF9WRVJTSU9OKCZ3bW1zZy52ZXJzaW9uKTsKLQkJCQl3bW1zZy5od25kID0gaHduZDsKLQkJCQl3bW1zZy5tc2cgPSBtc2c7Ci0JCQkJd21tc2cud1BhcmFtID0gd1BhcmFtOwotCQkJCXdtbXNnLmxQYXJhbSA9IGxQYXJhbTsKLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZVN5c1dNRXZlbnQoJndtbXNnKTsKLQotCQkJLyogREpNOiBJZiB0aGUgdXNlciBpc24ndCB3YXRjaGluZyBmb3IgcHJpdmF0ZQotCQkJCW1lc3NhZ2VzIGluIGhlciBTREwgZXZlbnQgbG9vcCwgdGhlbiBwYXNzIGl0Ci0JCQkJYWxvbmcgdG8gYW55IHdpbjMyIHNwZWNpZmljIHdpbmRvdyBwcm9jLgotCQkJICovCi0JCQl9IGVsc2UgaWYgKHVzZXJXaW5kb3dQcm9jKSB7Ci0JCQkJcmV0dXJuIENhbGxXaW5kb3dQcm9jKHVzZXJXaW5kb3dQcm9jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuKERlZldpbmRvd1Byb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSkpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgd2luZG93cyBtZXNzYWdlIHF1ZXVlIGFuZCBEaXJlY3RJbnB1dCBhbmQgcmV0dXJucwotICAgMSBpZiB0aGVyZSB3YXMgaW5wdXQsIDAgaWYgdGhlcmUgd2FzIG5vIGlucHV0LCBvciAtMSBpZiB0aGUgYXBwbGljYXRpb24gaGFzCi0gICBwb3N0ZWQgYSBxdWl0IG1lc3NhZ2UuCi0qLwotc3RhdGljIGludCBEWDVfQ2hlY2tJbnB1dChfVEhJUywgaW50IHRpbWVvdXQsIEJPT0wgcHJvY2Vzc0lucHV0KQotewotCU1TRyBtc2c7Ci0JaW50ICAgICAgaTsKLQlIUkVTVUxUICByZXN1bHQ7Ci0JRFdPUkQgICAgZXZlbnQ7Ci0KLQkvKiBDaGVjayB0aGUgbm9ybWFsIHdpbmRvd3MgcXVldWUgKGhpZ2hlc3QgcHJlZmVyZW5jZSkgKi8KLQlwb3N0ZWQgPSAwOwotCXdoaWxlICggISBwb3N0ZWQgJiYKLQkgICAgICAgIFBlZWtNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDAsIFBNX05PUkVNT1ZFKSApIHsKLQkJaWYgKCBHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApID4gMCApIHsKLQkJCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9Ci0JaWYgKCBwb3N0ZWQgKSB7Ci0JCXJldHVybigxKTsKLQl9Ci0KLQkvKiBQdW1wIHRoZSBEaXJlY3RJbnB1dCBmbG93ICovCi0JaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBJTlBVVEZPQ1VTICkgewotCQlmb3IgKCBpPTA7IGk8U0RMX0RJbmRldjsgKytpICkgewotCQkJcmVzdWx0ID0gSURpcmVjdElucHV0RGV2aWNlMl9Qb2xsKFNETF9ESWRldltpXSk7Ci0JCQlpZiAoIChyZXN1bHQgPT0gRElFUlJfSU5QVVRMT1NUKSB8fAotCQkJCQkocmVzdWx0ID09IERJRVJSX05PVEFDUVVJUkVEKSApIHsKLQkJCQlpZiAoIFNETF9zdHJjbXAoaW5wdXRzW2ldLm5hbWUsICJtb3VzZSIpID09IDAgKSB7Ci0JCQkJCW1vdXNlX2xvc3QgPSAxOwotCQkJCX0KLQkJCQlJRGlyZWN0SW5wdXREZXZpY2UyX0FjcXVpcmUoU0RMX0RJZGV2W2ldKTsKLQkJCQlJRGlyZWN0SW5wdXREZXZpY2UyX1BvbGwoU0RMX0RJZGV2W2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFdhaXQgZm9yIG1lc3NhZ2VzIGFuZCBpbnB1dCBldmVudHMgKi8KLQlldmVudCA9IE1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMoU0RMX0RJbmRldiwgU0RMX0RJZXZ0LCBGQUxTRSwKLQkJCQkJCQl0aW1lb3V0LCBRU19BTExFVkVOVFMpOwotCWlmICgoZXZlbnQgPj0gV0FJVF9PQkpFQ1RfMCkgJiYgKGV2ZW50IDwgKFdBSVRfT0JKRUNUXzArU0RMX0RJbmRldikpKSB7Ci0JCURXT1JEIG51bWV2ZW50czsKLQkJc3RhdGljIERJREVWSUNFT0JKRUNUREFUQSBldnRidWZbSU5QVVRfUVNJWkVdOwotCi0JCWV2ZW50IC09IFdBSVRfT0JKRUNUXzA7Ci0JCW51bWV2ZW50cyA9IElOUFVUX1FTSVpFOwotCQlyZXN1bHQgPSBJRGlyZWN0SW5wdXREZXZpY2UyX0dldERldmljZURhdGEoCi0JCQkJU0RMX0RJZGV2W2V2ZW50XSwgc2l6ZW9mKERJREVWSUNFT0JKRUNUREFUQSksCi0JCQkJCQkJZXZ0YnVmLCAmbnVtZXZlbnRzLCAwKTsKLQkJaWYgKCAocmVzdWx0ID09IERJRVJSX0lOUFVUTE9TVCkgfHwKLQkJCQkJKHJlc3VsdCA9PSBESUVSUl9OT1RBQ1FVSVJFRCkgKSB7Ci0JCQlpZiAoIFNETF9zdHJjbXAoaW5wdXRzW2V2ZW50XS5uYW1lLCAibW91c2UiKSA9PSAwICkgewotCQkJCW1vdXNlX2xvc3QgPSAxOwotCQkJfQotCQkJSURpcmVjdElucHV0RGV2aWNlMl9BY3F1aXJlKFNETF9ESWRldltldmVudF0pOwotCQkJcmVzdWx0ID0gSURpcmVjdElucHV0RGV2aWNlMl9HZXREZXZpY2VEYXRhKAotCQkJCVNETF9ESWRldltldmVudF0sIHNpemVvZihESURFVklDRU9CSkVDVERBVEEpLAotCQkJCQkJCWV2dGJ1ZiwgJm51bWV2ZW50cywgMCk7Ci0JCX0KLQkJLyogSGFuZGxlIHRoZSBldmVudHMgKi8KLQkJaWYgKCByZXN1bHQgPT0gRElfT0sgJiYgcHJvY2Vzc0lucHV0ICkgewotCQkJLyogTm90ZTogVGhpcyBjYW4gcG9zdCBtdWx0aXBsZSBldmVudHMgdG8gZXZlbnQgcXVldWUKLQkJCSAqLwotCQkJKCpTRExfRElmdW5bZXZlbnRdKSgoaW50KW51bWV2ZW50cywgZXZ0YnVmKTsKLQkJCXJldHVybigxKTsKLQkJfQotCX0KLQlpZiAoIGV2ZW50ICE9IFdBSVRfVElNRU9VVCApIHsKLQkJLyogTWF5YmUgdGhlcmUgd2FzIGEgd2luZG93cyBtZXNzYWdlPyAqLwotCQlpZiAoIFBlZWtNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDAsIFBNX05PUkVNT1ZFKSApIHsKLQkJCWlmICggR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSA+IDAgKSB7Ci0JCQkJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcmV0dXJuKDEpOwotCQl9Ci0JfQotCXJldHVybigwKTsKLX0KLQotLyogQ2hhbmdlIGNvb3BlcmF0aXZlIGxldmVsIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBmdWxsc2NyZWVuICovCi12b2lkIERYNV9ESW5wdXRSZXNldChfVEhJUywgaW50IGZ1bGxzY3JlZW4pCi17Ci0JRFdPUkQgbGV2ZWw7Ci0JaW50IGk7Ci0JSFJFU1VMVCByZXN1bHQ7Ci0JSFdORCB0b3B3bmQ7Ci0KLQlmb3IgKCBpPTA7IGk8TUFYX0lOUFVUUzsgKytpICkgewotCQlpZiAoIFNETF9ESWRldltpXSAhPSBOVUxMICkgewotCQkJaWYgKCBmdWxsc2NyZWVuICkgewotCQkJCWxldmVsID0gaW5wdXRzW2ldLnJhd19sZXZlbDsKLQkJCX0gZWxzZSB7Ci0JCQkJbGV2ZWwgPSBpbnB1dHNbaV0ud2luX2xldmVsOwotCQkJfQotCQkJSURpcmVjdElucHV0RGV2aWNlMl9VbmFjcXVpcmUoU0RMX0RJZGV2W2ldKTsKLQkJCXRvcHduZCA9IEdldFRvcExldmVsUGFyZW50KFNETF9XaW5kb3cpOwotCQkJcmVzdWx0ID0gSURpcmVjdElucHV0RGV2aWNlMl9TZXRDb29wZXJhdGl2ZUxldmVsKAotCQkJCQlTRExfRElkZXZbaV0sIHRvcHduZCwgbGV2ZWwpOwotCQkJSURpcmVjdElucHV0RGV2aWNlMl9BY3F1aXJlKFNETF9ESWRldltpXSk7Ci0JCQlpZiAoIHJlc3VsdCAhPSBESV9PSyApIHsKLQkJCQlTZXRESWVycm9yKAotCQkJIkRpcmVjdElucHV0RGV2aWNlOjpTZXRDb29wZXJhdGl2ZUxldmVsIiwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLQltb3VzZV9sb3N0ID0gMTsKLQotCS8qIEZsdXNoIHBlbmRpbmcgaW5wdXQgKi8KLQlEWDVfQ2hlY2tJbnB1dCh0aGlzLCAwLCBGQUxTRSk7Ci19Ci0KLXZvaWQgRFg1X1B1bXBFdmVudHMoX1RISVMpCi17Ci0JLyogV2FpdCBmb3IgbWVzc2FnZXMgYW5kIERpcmVjdElucHV0ICovCi0Jd2hpbGUgKCBEWDVfQ2hlY2tJbnB1dCh0aGlzLCAwLCBUUlVFKSA+IDAgKSB7Ci0JCS8qIExvb3AgYW5kIGNoZWNrIGFnYWluICovOwotCX0KLX0KLQotdm9pZCBEWDVfSW5pdE9TS2V5bWFwKF9USElTKQotewotI2lmbmRlZiBESUtfUEFVU0UKLSNkZWZpbmUgRElLX1BBVVNFCTB4QzUKLSNlbmRpZgotI2lmbmRlZiBESUtfT0VNXzEwMgotI2RlZmluZSBESUtfT0VNXzEwMgkweDU2CS8qIDwgPiB8IG9uIFVLL0dlcm1hbnkga2V5Ym9hcmRzICovCi0jZW5kaWYKLQlpbnQgaTsKLQotCS8qIE1hcCB0aGUgRElLIHNjYW5jb2RlcyB0byBTREwga2V5c3ltcyAqLwotCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKERJS19rZXltYXApOyArK2kgKQotCQlESUtfa2V5bWFwW2ldID0gMDsKLQotCS8qIERlZmluZWQgRElLXyogY29uc3RhbnRzICovCi0JRElLX2tleW1hcFtESUtfRVNDQVBFXSA9IFNETEtfRVNDQVBFOwotCURJS19rZXltYXBbRElLXzFdID0gU0RMS18xOwotCURJS19rZXltYXBbRElLXzJdID0gU0RMS18yOwotCURJS19rZXltYXBbRElLXzNdID0gU0RMS18zOwotCURJS19rZXltYXBbRElLXzRdID0gU0RMS180OwotCURJS19rZXltYXBbRElLXzVdID0gU0RMS181OwotCURJS19rZXltYXBbRElLXzZdID0gU0RMS182OwotCURJS19rZXltYXBbRElLXzddID0gU0RMS183OwotCURJS19rZXltYXBbRElLXzhdID0gU0RMS184OwotCURJS19rZXltYXBbRElLXzldID0gU0RMS185OwotCURJS19rZXltYXBbRElLXzBdID0gU0RMS18wOwotCURJS19rZXltYXBbRElLX01JTlVTXSA9IFNETEtfTUlOVVM7Ci0JRElLX2tleW1hcFtESUtfRVFVQUxTXSA9IFNETEtfRVFVQUxTOwotCURJS19rZXltYXBbRElLX0JBQ0tdID0gU0RMS19CQUNLU1BBQ0U7Ci0JRElLX2tleW1hcFtESUtfVEFCXSA9IFNETEtfVEFCOwotCURJS19rZXltYXBbRElLX1FdID0gU0RMS19xOwotCURJS19rZXltYXBbRElLX1ddID0gU0RMS193OwotCURJS19rZXltYXBbRElLX0VdID0gU0RMS19lOwotCURJS19rZXltYXBbRElLX1JdID0gU0RMS19yOwotCURJS19rZXltYXBbRElLX1RdID0gU0RMS190OwotCURJS19rZXltYXBbRElLX1ldID0gU0RMS195OwotCURJS19rZXltYXBbRElLX1VdID0gU0RMS191OwotCURJS19rZXltYXBbRElLX0ldID0gU0RMS19pOwotCURJS19rZXltYXBbRElLX09dID0gU0RMS19vOwotCURJS19rZXltYXBbRElLX1BdID0gU0RMS19wOwotCURJS19rZXltYXBbRElLX0xCUkFDS0VUXSA9IFNETEtfTEVGVEJSQUNLRVQ7Ci0JRElLX2tleW1hcFtESUtfUkJSQUNLRVRdID0gU0RMS19SSUdIVEJSQUNLRVQ7Ci0JRElLX2tleW1hcFtESUtfUkVUVVJOXSA9IFNETEtfUkVUVVJOOwotCURJS19rZXltYXBbRElLX0xDT05UUk9MXSA9IFNETEtfTENUUkw7Ci0JRElLX2tleW1hcFtESUtfQV0gPSBTRExLX2E7Ci0JRElLX2tleW1hcFtESUtfU10gPSBTRExLX3M7Ci0JRElLX2tleW1hcFtESUtfRF0gPSBTRExLX2Q7Ci0JRElLX2tleW1hcFtESUtfRl0gPSBTRExLX2Y7Ci0JRElLX2tleW1hcFtESUtfR10gPSBTRExLX2c7Ci0JRElLX2tleW1hcFtESUtfSF0gPSBTRExLX2g7Ci0JRElLX2tleW1hcFtESUtfSl0gPSBTRExLX2o7Ci0JRElLX2tleW1hcFtESUtfS10gPSBTRExLX2s7Ci0JRElLX2tleW1hcFtESUtfTF0gPSBTRExLX2w7Ci0JRElLX2tleW1hcFtESUtfU0VNSUNPTE9OXSA9IFNETEtfU0VNSUNPTE9OOwotCURJS19rZXltYXBbRElLX0FQT1NUUk9QSEVdID0gU0RMS19RVU9URTsKLQlESUtfa2V5bWFwW0RJS19HUkFWRV0gPSBTRExLX0JBQ0tRVU9URTsKLQlESUtfa2V5bWFwW0RJS19MU0hJRlRdID0gU0RMS19MU0hJRlQ7Ci0JRElLX2tleW1hcFtESUtfQkFDS1NMQVNIXSA9IFNETEtfQkFDS1NMQVNIOwotCURJS19rZXltYXBbRElLX09FTV8xMDJdID0gU0RMS19MRVNTOwotCURJS19rZXltYXBbRElLX1pdID0gU0RMS196OwotCURJS19rZXltYXBbRElLX1hdID0gU0RMS194OwotCURJS19rZXltYXBbRElLX0NdID0gU0RMS19jOwotCURJS19rZXltYXBbRElLX1ZdID0gU0RMS192OwotCURJS19rZXltYXBbRElLX0JdID0gU0RMS19iOwotCURJS19rZXltYXBbRElLX05dID0gU0RMS19uOwotCURJS19rZXltYXBbRElLX01dID0gU0RMS19tOwotCURJS19rZXltYXBbRElLX0NPTU1BXSA9IFNETEtfQ09NTUE7Ci0JRElLX2tleW1hcFtESUtfUEVSSU9EXSA9IFNETEtfUEVSSU9EOwotCURJS19rZXltYXBbRElLX1NMQVNIXSA9IFNETEtfU0xBU0g7Ci0JRElLX2tleW1hcFtESUtfUlNISUZUXSA9IFNETEtfUlNISUZUOwotCURJS19rZXltYXBbRElLX01VTFRJUExZXSA9IFNETEtfS1BfTVVMVElQTFk7Ci0JRElLX2tleW1hcFtESUtfTE1FTlVdID0gU0RMS19MQUxUOwotCURJS19rZXltYXBbRElLX1NQQUNFXSA9IFNETEtfU1BBQ0U7Ci0JRElLX2tleW1hcFtESUtfQ0FQSVRBTF0gPSBTRExLX0NBUFNMT0NLOwotCURJS19rZXltYXBbRElLX0YxXSA9IFNETEtfRjE7Ci0JRElLX2tleW1hcFtESUtfRjJdID0gU0RMS19GMjsKLQlESUtfa2V5bWFwW0RJS19GM10gPSBTRExLX0YzOwotCURJS19rZXltYXBbRElLX0Y0XSA9IFNETEtfRjQ7Ci0JRElLX2tleW1hcFtESUtfRjVdID0gU0RMS19GNTsKLQlESUtfa2V5bWFwW0RJS19GNl0gPSBTRExLX0Y2OwotCURJS19rZXltYXBbRElLX0Y3XSA9IFNETEtfRjc7Ci0JRElLX2tleW1hcFtESUtfRjhdID0gU0RMS19GODsKLQlESUtfa2V5bWFwW0RJS19GOV0gPSBTRExLX0Y5OwotCURJS19rZXltYXBbRElLX0YxMF0gPSBTRExLX0YxMDsKLQlESUtfa2V5bWFwW0RJS19OVU1MT0NLXSA9IFNETEtfTlVNTE9DSzsKLQlESUtfa2V5bWFwW0RJS19TQ1JPTExdID0gU0RMS19TQ1JPTExPQ0s7Ci0JRElLX2tleW1hcFtESUtfTlVNUEFEN10gPSBTRExLX0tQNzsKLQlESUtfa2V5bWFwW0RJS19OVU1QQUQ4XSA9IFNETEtfS1A4OwotCURJS19rZXltYXBbRElLX05VTVBBRDldID0gU0RMS19LUDk7Ci0JRElLX2tleW1hcFtESUtfU1VCVFJBQ1RdID0gU0RMS19LUF9NSU5VUzsKLQlESUtfa2V5bWFwW0RJS19OVU1QQUQ0XSA9IFNETEtfS1A0OwotCURJS19rZXltYXBbRElLX05VTVBBRDVdID0gU0RMS19LUDU7Ci0JRElLX2tleW1hcFtESUtfTlVNUEFENl0gPSBTRExLX0tQNjsKLQlESUtfa2V5bWFwW0RJS19BRERdID0gU0RMS19LUF9QTFVTOwotCURJS19rZXltYXBbRElLX05VTVBBRDFdID0gU0RMS19LUDE7Ci0JRElLX2tleW1hcFtESUtfTlVNUEFEMl0gPSBTRExLX0tQMjsKLQlESUtfa2V5bWFwW0RJS19OVU1QQUQzXSA9IFNETEtfS1AzOwotCURJS19rZXltYXBbRElLX05VTVBBRDBdID0gU0RMS19LUDA7Ci0JRElLX2tleW1hcFtESUtfREVDSU1BTF0gPSBTRExLX0tQX1BFUklPRDsKLQlESUtfa2V5bWFwW0RJS19GMTFdID0gU0RMS19GMTE7Ci0JRElLX2tleW1hcFtESUtfRjEyXSA9IFNETEtfRjEyOwotCi0JRElLX2tleW1hcFtESUtfRjEzXSA9IFNETEtfRjEzOwotCURJS19rZXltYXBbRElLX0YxNF0gPSBTRExLX0YxNDsKLQlESUtfa2V5bWFwW0RJS19GMTVdID0gU0RMS19GMTU7Ci0KLQlESUtfa2V5bWFwW0RJS19OVU1QQURFUVVBTFNdID0gU0RMS19LUF9FUVVBTFM7Ci0JRElLX2tleW1hcFtESUtfTlVNUEFERU5URVJdID0gU0RMS19LUF9FTlRFUjsKLQlESUtfa2V5bWFwW0RJS19SQ09OVFJPTF0gPSBTRExLX1JDVFJMOwotCURJS19rZXltYXBbRElLX0RJVklERV0gPSBTRExLX0tQX0RJVklERTsKLQlESUtfa2V5bWFwW0RJS19TWVNSUV0gPSBTRExLX1BSSU5UOwotCURJS19rZXltYXBbRElLX1JNRU5VXSA9IFNETEtfUkFMVDsKLQlESUtfa2V5bWFwW0RJS19QQVVTRV0gPSBTRExLX1BBVVNFOwotCURJS19rZXltYXBbRElLX0hPTUVdID0gU0RMS19IT01FOwotCURJS19rZXltYXBbRElLX1VQXSA9IFNETEtfVVA7Ci0JRElLX2tleW1hcFtESUtfUFJJT1JdID0gU0RMS19QQUdFVVA7Ci0JRElLX2tleW1hcFtESUtfTEVGVF0gPSBTRExLX0xFRlQ7Ci0JRElLX2tleW1hcFtESUtfUklHSFRdID0gU0RMS19SSUdIVDsKLQlESUtfa2V5bWFwW0RJS19FTkRdID0gU0RMS19FTkQ7Ci0JRElLX2tleW1hcFtESUtfRE9XTl0gPSBTRExLX0RPV047Ci0JRElLX2tleW1hcFtESUtfTkVYVF0gPSBTRExLX1BBR0VET1dOOwotCURJS19rZXltYXBbRElLX0lOU0VSVF0gPSBTRExLX0lOU0VSVDsKLQlESUtfa2V5bWFwW0RJS19ERUxFVEVdID0gU0RMS19ERUxFVEU7Ci0JRElLX2tleW1hcFtESUtfTFdJTl0gPSBTRExLX0xNRVRBOwotCURJS19rZXltYXBbRElLX1JXSU5dID0gU0RMS19STUVUQTsKLQlESUtfa2V5bWFwW0RJS19BUFBTXSA9IFNETEtfTUVOVTsKLX0KLQotc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShVSU5UIHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0sIGludCBwcmVzc2VkKQotewotCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCi0Ja2V5c3ltLT5zY2FuY29kZSA9ICh1bnNpZ25lZCBjaGFyKXNjYW5jb2RlOwotCWtleXN5bS0+c3ltID0gRElLX2tleW1hcFtzY2FuY29kZV07Ci0Ja2V5c3ltLT5tb2QgPSBLTU9EX05PTkU7Ci0Ja2V5c3ltLT51bmljb2RlID0gMDsKLQlpZiAoIHByZXNzZWQgJiYgU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSB7Ci0JCVVJTlQgdmtleTsKLSNpZm5kZWYgTk9fR0VUS0VZQk9BUkRTVEFURQotCQlCWVRFCWtleXN0YXRlWzI1Nl07Ci0JCVVpbnQxNgl3Y2hhcnNbMl07Ci0jZW5kaWYKLQotCQl2a2V5ID0gTWFwVmlydHVhbEtleShzY2FuY29kZSwgMSk7Ci0jaWZkZWYgTk9fR0VUS0VZQk9BUkRTVEFURQotCQkvKiBVaCBvaCwgYmV0dGVyIGhvcGUgdGhlIHZrZXkgaXMgY2xvc2UgZW5vdWdoLi4gKi8KLQkJa2V5c3ltLT51bmljb2RlID0gdmtleTsKLSNlbHNlCi0JCUdldEtleWJvYXJkU3RhdGUoa2V5c3RhdGUpOwotCQlpZiAoU0RMX1RvVW5pY29kZSh2a2V5LCBzY2FuY29kZSwga2V5c3RhdGUsIHdjaGFycywgc2l6ZW9mKHdjaGFycykvc2l6ZW9mKHdjaGFyc1swXSksIDApID09IDEpCi0JCXsKLQkJCWtleXN5bS0+dW5pY29kZSA9IHdjaGFyc1swXTsKLQkJfQotI2VuZGlmIC8qIE5PX0dFVEtFWUJPQVJEU1RBVEUgKi8KLQl9Ci0JcmV0dXJuKGtleXN5bSk7Ci19Ci0KLWludCBEWDVfQ3JlYXRlV2luZG93KF9USElTKQotewotCWNoYXIgKndpbmRvd2lkID0gU0RMX2dldGVudigiU0RMX1dJTkRPV0lEIik7Ci0JaW50IGk7Ci0KLQkvKiBDbGVhciBvdXQgRGlyZWN0SW5wdXQgdmFyaWFibGVzIGluIGNhc2Ugd2UgZmFpbCAqLwotCWZvciAoIGk9MDsgaTxNQVhfSU5QVVRTOyArK2kgKSB7Ci0JCVNETF9ESWRldltpXSA9IE5VTEw7Ci0JCVNETF9ESWV2dFtpXSA9IE5VTEw7Ci0JCVNETF9ESWZ1bltpXSA9IE5VTEw7Ci0JfQotCi0JU0RMX1JlZ2lzdGVyQXBwKE5VTEwsIDAsIDApOwotCi0JU0RMX3dpbmRvd2lkID0gKHdpbmRvd2lkICE9IE5VTEwpOwotCWlmICggU0RMX3dpbmRvd2lkICkgewotCQlTRExfV2luZG93ID0gKEhXTkQpU0RMX3N0cnRvdWxsKHdpbmRvd2lkLCBOVUxMLCAwKTsKLQkJaWYgKCBTRExfV2luZG93ID09IE5VTEwgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCB1c2VyIHNwZWNpZmllZCB3aW5kb3ciKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQotCQkvKiBESk06IHdlIHdhbnQgYWxsIGV2ZW50J3MgZm9yIHRoZSB1c2VyIHNwZWNpZmllZAotCQkJd2luZG93IHRvIGJlIGhhbmRsZWQgYnkgU0RMLgotCQkgKi8KLQkJdXNlcldpbmRvd1Byb2MgPSAoV05EUFJPQ1RZUEUpR2V0V2luZG93TG9uZ1B0cihTRExfV2luZG93LCBHV0xQX1dORFBST0MpOwotCQlTZXRXaW5kb3dMb25nUHRyKFNETF9XaW5kb3csIEdXTFBfV05EUFJPQywgKExPTkdfUFRSKVdpbk1lc3NhZ2UpOwotCX0gZWxzZSB7Ci0JCVNETF9XaW5kb3cgPSBDcmVhdGVXaW5kb3coU0RMX0FwcG5hbWUsIFNETF9BcHBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgKFdTX09WRVJMQVBQRUR8V1NfQ0FQVElPTnxXU19TWVNNRU5VfFdTX01JTklNSVpFQk9YKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIDAsIDAsIE5VTEwsIE5VTEwsIFNETF9JbnN0YW5jZSwgTlVMTCk7Ci0JCWlmICggU0RMX1dpbmRvdyA9PSBOVUxMICkgewotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgd2luZG93Iik7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCVNob3dXaW5kb3coU0RMX1dpbmRvdywgU1dfSElERSk7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBEaXJlY3RJbnB1dCAqLwotCWlmICggRFg1X0RJbnB1dEluaXQodGhpcykgPCAwICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIEpDIDE0IE1hciAyMDA2Ci0JCUZsdXNoIHRoZSBtZXNzYWdlIGxvb3Agb3IgdGhpcyBjYW4gY2F1c2UgYmlnIHByb2JsZW1zIGxhdGVyCi0JCUVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgZGVjaWRlcyB0byB1c2UgZGlhbG9nIGJveGVzIG9yIGFzc2VydCgpIQotCSovCi0JV0lOX0ZsdXNoTWVzc2FnZVF1ZXVlKCk7Ci0KLQkvKiBSZWFkeSB0byByb2xsICovCi0JcmV0dXJuKDApOwotfQotCi12b2lkIERYNV9EZXN0cm95V2luZG93KF9USElTKQotewotCS8qIENsb3NlIGRvd24gRGlyZWN0SW5wdXQgKi8KLQlEWDVfRElucHV0UXVpdCh0aGlzKTsKLQotCS8qIERlc3Ryb3kgb3VyIHdpbmRvdyAqLwotCWlmICggU0RMX3dpbmRvd2lkICkgewotCQlTZXRXaW5kb3dMb25nUHRyKFNETF9XaW5kb3csIEdXTFBfV05EUFJPQywgKExPTkdfUFRSKXVzZXJXaW5kb3dQcm9jKTsKLQl9IGVsc2UgewotCQlEZXN0cm95V2luZG93KFNETF9XaW5kb3cpOwotCX0KLQlTRExfVW5yZWdpc3RlckFwcCgpOwotCi0JLyogSkMgMTQgTWFyIDIwMDYKLQkJRmx1c2ggdGhlIG1lc3NhZ2UgbG9vcCBvciB0aGlzIGNhbiBjYXVzZSBiaWcgcHJvYmxlbXMgbGF0ZXIKLQkJRXNwZWNpYWxseSBpZiB0aGUgdXNlciBkZWNpZGVzIHRvIHVzZSBkaWFsb2cgYm94ZXMgb3IgYXNzZXJ0KCkhCi0JKi8KLQlXSU5fRmx1c2hNZXNzYWdlUXVldWUoKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZHg1L1NETF9keDVldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvU0RMX2R4NWV2ZW50c19jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NzVhZjEuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvU0RMX2R4NWV2ZW50c19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIi4uL3dpbmNvbW1vbi9TRExfbG93dmlkZW8uaCIKLQotLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX2R4NWV2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAotICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9keDV2aWRlby5jKQotKi8KLWV4dGVybiBMT05HCi0gRFg1X0hhbmRsZU1lc3NhZ2UoX1RISVMsIEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotZXh0ZXJuIGludCBEWDVfQ3JlYXRlV2luZG93KF9USElTKTsKLWV4dGVybiB2b2lkIERYNV9EZXN0cm95V2luZG93KF9USElTKTsKLQotZXh0ZXJuIHZvaWQgRFg1X1B1bXBFdmVudHMoX1RISVMpOwotZXh0ZXJuIHZvaWQgRFg1X0luaXRPU0tleW1hcChfVEhJUyk7Ci1leHRlcm4gdm9pZCBEWDVfRElucHV0UmVzZXQoX1RISVMsIGludCBmdWxsc2NyZWVuKTsKLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvU0RMX2R4NXZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmR4NS9TRExfZHg1dmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiNzRmNi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmR4NS9TRExfZHg1dmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDI1MTggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJkaXJlY3R4LmgiCi0KLS8qIE5vdCB5ZXQgaW4gdGhlIG1pbmd3MzIgY3Jvc3MtY29tcGlsZSBoZWFkZXJzICovCi0jaWZuZGVmIENEU19GVUxMU0NSRUVOCi0jZGVmaW5lIENEU19GVUxMU0NSRUVOCTQKLSNlbmRpZgotCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uL1NETF9ibGl0LmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiU0RMX2R4NXZpZGVvLmgiCi0jaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9zeXN3bV9jLmgiCi0jaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9zeXNtb3VzZV9jLmgiCi0jaW5jbHVkZSAiU0RMX2R4NWV2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX2R4NXl1dl9jLmgiCi0jaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF93aW5nbF9jLmgiCi0KLSNpZmRlZiBfV0lOMzJfV0NFCi0jZGVmaW5lIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUwotI2VuZGlmCi0jaWZuZGVmIFdTX01BWElNSVpFCi0jZGVmaW5lIFdTX01BWElNSVpFCQkwCi0jZW5kaWYKLSNpZm5kZWYgU1dQX05PQ09QWUJJVFMKLSNkZWZpbmUgU1dQX05PQ09QWUJJVFMJMAotI2VuZGlmCi0jaWZuZGVmIFBDX05PQ09MTEFQU0UKLSNkZWZpbmUgUENfTk9DT0xMQVBTRQkwCi0jZW5kaWYKLQotCi0vKiBEaXJlY3RYIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciB2aWRlbyBhbmQgZXZlbnRzICovCi1IUkVTVUxUIChXSU5BUEkgKkREcmF3Q3JlYXRlKSggR1VJRCBGQVIgKmxwR1VJRCwgTFBESVJFQ1REUkFXIEZBUiAqbHBscERELCBJVW5rbm93biBGQVIgKnBVbmtPdXRlciApOwotSFJFU1VMVCAoV0lOQVBJICpESW5wdXRDcmVhdGUpKEhJTlNUQU5DRSBoaW5zdCwgRFdPUkQgZHdWZXJzaW9uLCBMUERJUkVDVElOUFVUICpwcERJLCBMUFVOS05PV04gcHVua091dGVyKTsKLQotLyogVGhpcyBpcyB0aGUgcmVjdCBFbnVtTW9kZXMyIHVzZXMgKi8KLXN0cnVjdCBEWDVFbnVtUmVjdCB7Ci0JU0RMX1JlY3QgcjsKLQlpbnQgcmVmcmVzaFJhdGU7Ci0Jc3RydWN0IERYNUVudW1SZWN0KiBuZXh0OwotfTsKLXN0YXRpYyBzdHJ1Y3QgRFg1RW51bVJlY3QgKmVudW1saXN0c1tOVU1fTU9ERUxJU1RTXTsKLQotLyoKLSAqIEV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQgdmFsdWVzIGZvciBjX2NmREkqIGNvbnN0YW50cyB1c2VkIGluIERpcmVjdFggNS4wCi0gKi8KLQotLyogS2V5Ym9hcmQgKi8KLQotc3RhdGljIERJT0JKRUNUREFUQUZPUk1BVCBLQkRfZm10W10gPSB7Ci0JeyAmR1VJRF9LZXksIDAsIDB4ODAwMDAwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMSwgMHg4MDAwMDEwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyLCAweDgwMDAwMjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDMsIDB4ODAwMDAzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNCwgMHg4MDAwMDQwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCA1LCAweDgwMDAwNTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDYsIDB4ODAwMDA2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNywgMHg4MDAwMDcwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCA4LCAweDgwMDAwODBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDksIDB4ODAwMDA5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTAsIDB4ODAwMDBBMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTEsIDB4ODAwMDBCMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTIsIDB4ODAwMDBDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTMsIDB4ODAwMDBEMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTQsIDB4ODAwMDBFMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTUsIDB4ODAwMDBGMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTYsIDB4ODAwMDEwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTcsIDB4ODAwMDExMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTgsIDB4ODAwMDEyMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTksIDB4ODAwMDEzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjAsIDB4ODAwMDE0MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjEsIDB4ODAwMDE1MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjIsIDB4ODAwMDE2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjMsIDB4ODAwMDE3MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjQsIDB4ODAwMDE4MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjUsIDB4ODAwMDE5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjYsIDB4ODAwMDFBMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjcsIDB4ODAwMDFCMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjgsIDB4ODAwMDFDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjksIDB4ODAwMDFEMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzAsIDB4ODAwMDFFMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzEsIDB4ODAwMDFGMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzIsIDB4ODAwMDIwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzMsIDB4ODAwMDIxMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzQsIDB4ODAwMDIyMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzUsIDB4ODAwMDIzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzYsIDB4ODAwMDI0MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzcsIDB4ODAwMDI1MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzgsIDB4ODAwMDI2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMzksIDB4ODAwMDI3MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDAsIDB4ODAwMDI4MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDEsIDB4ODAwMDI5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDIsIDB4ODAwMDJBMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDMsIDB4ODAwMDJCMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDQsIDB4ODAwMDJDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDUsIDB4ODAwMDJEMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDYsIDB4ODAwMDJFMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDcsIDB4ODAwMDJGMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDgsIDB4ODAwMDMwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNDksIDB4ODAwMDMxMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTAsIDB4ODAwMDMyMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTEsIDB4ODAwMDMzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTIsIDB4ODAwMDM0MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTMsIDB4ODAwMDM1MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTQsIDB4ODAwMDM2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTUsIDB4ODAwMDM3MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTYsIDB4ODAwMDM4MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTcsIDB4ODAwMDM5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTgsIDB4ODAwMDNBMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNTksIDB4ODAwMDNCMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjAsIDB4ODAwMDNDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjEsIDB4ODAwMDNEMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjIsIDB4ODAwMDNFMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjMsIDB4ODAwMDNGMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjQsIDB4ODAwMDQwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjUsIDB4ODAwMDQxMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjYsIDB4ODAwMDQyMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjcsIDB4ODAwMDQzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjgsIDB4ODAwMDQ0MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNjksIDB4ODAwMDQ1MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzAsIDB4ODAwMDQ2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzEsIDB4ODAwMDQ3MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzIsIDB4ODAwMDQ4MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzMsIDB4ODAwMDQ5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzQsIDB4ODAwMDRBMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzUsIDB4ODAwMDRCMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzYsIDB4ODAwMDRDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzcsIDB4ODAwMDREMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzgsIDB4ODAwMDRFMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgNzksIDB4ODAwMDRGMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODAsIDB4ODAwMDUwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODEsIDB4ODAwMDUxMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODIsIDB4ODAwMDUyMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODMsIDB4ODAwMDUzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODQsIDB4ODAwMDU0MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODUsIDB4ODAwMDU1MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODYsIDB4ODAwMDU2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODcsIDB4ODAwMDU3MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODgsIDB4ODAwMDU4MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgODksIDB4ODAwMDU5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTAsIDB4ODAwMDVBMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTEsIDB4ODAwMDVCMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTIsIDB4ODAwMDVDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTMsIDB4ODAwMDVEMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTQsIDB4ODAwMDVFMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTUsIDB4ODAwMDVGMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTYsIDB4ODAwMDYwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTcsIDB4ODAwMDYxMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTgsIDB4ODAwMDYyMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgOTksIDB4ODAwMDYzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTAwLCAweDgwMDA2NDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDEwMSwgMHg4MDAwNjUwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMDIsIDB4ODAwMDY2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTAzLCAweDgwMDA2NzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDEwNCwgMHg4MDAwNjgwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMDUsIDB4ODAwMDY5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTA2LCAweDgwMDA2QTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDEwNywgMHg4MDAwNkIwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMDgsIDB4ODAwMDZDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTA5LCAweDgwMDA2RDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDExMCwgMHg4MDAwNkUwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMTEsIDB4ODAwMDZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTEyLCAweDgwMDA3MDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDExMywgMHg4MDAwNzEwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMTQsIDB4ODAwMDcyMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTE1LCAweDgwMDA3MzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDExNiwgMHg4MDAwNzQwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMTcsIDB4ODAwMDc1MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTE4LCAweDgwMDA3NjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDExOSwgMHg4MDAwNzcwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMjAsIDB4ODAwMDc4MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTIxLCAweDgwMDA3OTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDEyMiwgMHg4MDAwN0EwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMjMsIDB4ODAwMDdCMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTI0LCAweDgwMDA3QzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDEyNSwgMHg4MDAwN0QwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMjYsIDB4ODAwMDdFMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTI3LCAweDgwMDA3RjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDEyOCwgMHg4MDAwODAwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMjksIDB4ODAwMDgxMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTMwLCAweDgwMDA4MjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDEzMSwgMHg4MDAwODMwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMzIsIDB4ODAwMDg0MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTMzLCAweDgwMDA4NTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDEzNCwgMHg4MDAwODYwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMzUsIDB4ODAwMDg3MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTM2LCAweDgwMDA4ODBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDEzNywgMHg4MDAwODkwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxMzgsIDB4ODAwMDhBMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTM5LCAweDgwMDA4QjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE0MCwgMHg4MDAwOEMwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNDEsIDB4ODAwMDhEMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTQyLCAweDgwMDA4RTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE0MywgMHg4MDAwOEYwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNDQsIDB4ODAwMDkwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTQ1LCAweDgwMDA5MTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE0NiwgMHg4MDAwOTIwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNDcsIDB4ODAwMDkzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTQ4LCAweDgwMDA5NDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE0OSwgMHg4MDAwOTUwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNTAsIDB4ODAwMDk2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTUxLCAweDgwMDA5NzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE1MiwgMHg4MDAwOTgwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNTMsIDB4ODAwMDk5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTU0LCAweDgwMDA5QTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE1NSwgMHg4MDAwOUIwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNTYsIDB4ODAwMDlDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTU3LCAweDgwMDA5RDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE1OCwgMHg4MDAwOUUwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNTksIDB4ODAwMDlGMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTYwLCAweDgwMDBBMDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE2MSwgMHg4MDAwQTEwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNjIsIDB4ODAwMEEyMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTYzLCAweDgwMDBBMzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE2NCwgMHg4MDAwQTQwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNjUsIDB4ODAwMEE1MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTY2LCAweDgwMDBBNjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE2NywgMHg4MDAwQTcwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNjgsIDB4ODAwMEE4MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTY5LCAweDgwMDBBOTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE3MCwgMHg4MDAwQUEwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNzEsIDB4ODAwMEFCMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTcyLCAweDgwMDBBQzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE3MywgMHg4MDAwQUQwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNzQsIDB4ODAwMEFFMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTc1LCAweDgwMDBBRjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE3NiwgMHg4MDAwQjAwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxNzcsIDB4ODAwMEIxMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTc4LCAweDgwMDBCMjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE3OSwgMHg4MDAwQjMwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxODAsIDB4ODAwMEI0MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTgxLCAweDgwMDBCNTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE4MiwgMHg4MDAwQjYwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxODMsIDB4ODAwMEI3MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTg0LCAweDgwMDBCODBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE4NSwgMHg4MDAwQjkwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxODYsIDB4ODAwMEJBMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTg3LCAweDgwMDBCQjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE4OCwgMHg4MDAwQkMwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxODksIDB4ODAwMEJEMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTkwLCAweDgwMDBCRTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE5MSwgMHg4MDAwQkYwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxOTIsIDB4ODAwMEMwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTkzLCAweDgwMDBDMTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE5NCwgMHg4MDAwQzIwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxOTUsIDB4ODAwMEMzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTk2LCAweDgwMDBDNDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDE5NywgMHg4MDAwQzUwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAxOTgsIDB4ODAwMEM2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMTk5LCAweDgwMDBDNzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIwMCwgMHg4MDAwQzgwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMDEsIDB4ODAwMEM5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjAyLCAweDgwMDBDQTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIwMywgMHg4MDAwQ0IwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMDQsIDB4ODAwMENDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjA1LCAweDgwMDBDRDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIwNiwgMHg4MDAwQ0UwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMDcsIDB4ODAwMENGMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjA4LCAweDgwMDBEMDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIwOSwgMHg4MDAwRDEwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMTAsIDB4ODAwMEQyMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjExLCAweDgwMDBEMzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIxMiwgMHg4MDAwRDQwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMTMsIDB4ODAwMEQ1MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjE0LCAweDgwMDBENjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIxNSwgMHg4MDAwRDcwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMTYsIDB4ODAwMEQ4MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjE3LCAweDgwMDBEOTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIxOCwgMHg4MDAwREEwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMTksIDB4ODAwMERCMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjIwLCAweDgwMDBEQzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIyMSwgMHg4MDAwREQwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMjIsIDB4ODAwMERFMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjIzLCAweDgwMDBERjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIyNCwgMHg4MDAwRTAwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMjUsIDB4ODAwMEUxMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjI2LCAweDgwMDBFMjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIyNywgMHg4MDAwRTMwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMjgsIDB4ODAwMEU0MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjI5LCAweDgwMDBFNTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIzMCwgMHg4MDAwRTYwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMzEsIDB4ODAwMEU3MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjMyLCAweDgwMDBFODBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIzMywgMHg4MDAwRTkwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMzQsIDB4ODAwMEVBMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjM1LCAweDgwMDBFQjBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIzNiwgMHg4MDAwRUMwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyMzcsIDB4ODAwMEVEMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjM4LCAweDgwMDBFRTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDIzOSwgMHg4MDAwRUYwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyNDAsIDB4ODAwMEYwMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjQxLCAweDgwMDBGMTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDI0MiwgMHg4MDAwRjIwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyNDMsIDB4ODAwMEYzMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjQ0LCAweDgwMDBGNDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDI0NSwgMHg4MDAwRjUwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyNDYsIDB4ODAwMEY2MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjQ3LCAweDgwMDBGNzBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDI0OCwgMHg4MDAwRjgwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyNDksIDB4ODAwMEY5MEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjUwLCAweDgwMDBGQTBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDI1MSwgMHg4MDAwRkIwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyNTIsIDB4ODAwMEZDMEMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX0tleSwgMjUzLCAweDgwMDBGRDBDLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9LZXksIDI1NCwgMHg4MDAwRkUwQywgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfS2V5LCAyNTUsIDB4ODAwMEZGMEMsIDB4MDAwMDAwMDAgfSwKLX07Ci0KLWNvbnN0IERJREFUQUZPUk1BVCBjX2RmRElLZXlib2FyZCA9IHsgMjQsIDE2LCAweDAwMDAwMDAyLCAyNTYsIDI1NiwgS0JEX2ZtdCB9OwotCi0KLS8qIE1vdXNlICovCi0KLXN0YXRpYyBESU9CSkVDVERBVEFGT1JNQVQgUFRSX2ZtdFtdID0gewotCXsgJkdVSURfWEF4aXMsIDAsIDB4MDBGRkZGMDMsIDB4MDAwMDAwMDAgfSwKLQl7ICZHVUlEX1lBeGlzLCA0LCAweDAwRkZGRjAzLCAweDAwMDAwMDAwIH0sCi0JeyAmR1VJRF9aQXhpcywgOCwgMHg4MEZGRkYwMywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgMTIsIDB4MDBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDEzLCAweDAwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCAxNCwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgMTUsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLX07Ci0KLWNvbnN0IERJREFUQUZPUk1BVCBjX2RmRElNb3VzZSA9IHsgMjQsIDE2LCAweDAwMDAwMDAyLCAxNiwgNywgUFRSX2ZtdCB9OwotCi0KLS8qIEpveXN0aWNrICovCi0KLXN0YXRpYyBESU9CSkVDVERBVEFGT1JNQVQgSk9ZX2ZtdFtdID0gewotCXsgJkdVSURfWEF4aXMsIDAsIDB4ODBGRkZGMDMsIDB4MDAwMDAxMDAgfSwKLQl7ICZHVUlEX1lBeGlzLCA0LCAweDgwRkZGRjAzLCAweDAwMDAwMTAwIH0sCi0JeyAmR1VJRF9aQXhpcywgOCwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAotCXsgJkdVSURfUnhBeGlzLCAxMiwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAotCXsgJkdVSURfUnlBeGlzLCAxNiwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAotCXsgJkdVSURfUnpBeGlzLCAyMCwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAotCXsgJkdVSURfU2xpZGVyLCAyNCwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAotCXsgJkdVSURfU2xpZGVyLCAyOCwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAotCXsgJkdVSURfUE9WLCAzMiwgMHg4MEZGRkYxMCwgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfUE9WLCAzNiwgMHg4MEZGRkYxMCwgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfUE9WLCA0MCwgMHg4MEZGRkYxMCwgMHgwMDAwMDAwMCB9LAotCXsgJkdVSURfUE9WLCA0NCwgMHg4MEZGRkYxMCwgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNDgsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDQ5LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA1MCwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNTEsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDUyLCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA1MywgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNTQsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDU1LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA1NiwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNTcsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDU4LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA1OSwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNjAsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDYxLCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA2MiwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNjMsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDY0LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA2NSwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNjYsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDY3LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA2OCwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNjksIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDcwLCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA3MSwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNzIsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDczLCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA3NCwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNzUsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDc2LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi0JeyBOVUxMLCA3NywgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAotCXsgTlVMTCwgNzgsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKLQl7IE5VTEwsIDc5LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCi19OwotCi1jb25zdCBESURBVEFGT1JNQVQgY19kZkRJSm95c3RpY2sgPSB7IDI0LCAxNiwgMHgwMDAwMDAwMSwgODAsIDQ0LCBKT1lfZm10IH07Ci0KLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IERYNV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKipEWDVfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqRFg1X1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgRFg1X1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAotCQkJIFNETF9Db2xvciAqY29sb3JzKTsKLXN0YXRpYyBpbnQgRFg1X1NldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKLXN0YXRpYyBpbnQgRFg1X0dldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKLXN0YXRpYyB2b2lkIERYNV9WaWRlb1F1aXQoX1RISVMpOwotCi0vKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBEWDVfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgRFg1X0NoZWNrSFdCbGl0KF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KTsKLXN0YXRpYyBpbnQgRFg1X0ZpbGxIV1JlY3QoX1RISVMsIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0LCBVaW50MzIgY29sb3IpOwotc3RhdGljIGludCBEWDVfU2V0SFdDb2xvcktleShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBrZXkpOwotc3RhdGljIGludCBEWDVfU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQ4IGFscGhhKTsKLXN0YXRpYyBpbnQgRFg1X0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIERYNV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgRFg1X0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIERYNV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci0KLXN0YXRpYyBpbnQgRFg1X0FsbG9jRERTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgCi0JCQkJTFBESVJFQ1REUkFXU1VSRkFDRTMgcmVxdWVzdGVkLCBVaW50MzIgZmxhZyk7Ci0KLS8qIFdpbmRvd3MgbWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIERYNV9BY3RpdmF0ZShfVEhJUywgQk9PTCBhY3RpdmUsIEJPT0wgbWluaW1pemVkKTsKLXN0YXRpYyB2b2lkIERYNV9SZWFsaXplUGFsZXR0ZShfVEhJUyk7Ci1zdGF0aWMgdm9pZCBEWDVfUGFsZXR0ZUNoYW5nZWQoX1RISVMsIEhXTkQgd2luZG93KTsKLXN0YXRpYyB2b2lkIERYNV9XaW5QQUlOVChfVEhJUywgSERDIGhkYyk7Ci0KLS8qIFdpbkRJQiBkcml2ZXIgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgZ2FtbWEgcmFtcHMgKi8KLWV4dGVybiBpbnQgRElCX1NldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKLWV4dGVybiBpbnQgRElCX0dldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKLWV4dGVybiB2b2lkIERJQl9RdWl0R2FtbWEoX1RISVMpOwotCi0vKiBEWDUgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBEWDVfQXZhaWxhYmxlKHZvaWQpCi17Ci0JSElOU1RBTkNFIERJbnB1dERMTDsKLQlISU5TVEFOQ0UgRERyYXdETEw7Ci0JaW50IGRpbnB1dF9vazsKLQlpbnQgZGRyYXdfb2s7Ci0KLQkvKiBWZXJzaW9uIGNoZWNrIERJTlBVVC5ETEwgYW5kIEREUkFXLkRMTCAoSXMgRGlyZWN0WCBva2F5PykgKi8KLQlkaW5wdXRfb2sgPSAwOwotCURJbnB1dERMTCA9IExvYWRMaWJyYXJ5KFRFWFQoIkRJTlBVVC5ETEwiKSk7Ci0JaWYgKCBESW5wdXRETEwgIT0gTlVMTCApIHsKLQkJZGlucHV0X29rID0gMTsKLQkgIAlGcmVlTGlicmFyeShESW5wdXRETEwpOwotCX0KLQlkZHJhd19vayA9IDA7Ci0JRERyYXdETEwgPSBMb2FkTGlicmFyeShURVhUKCJERFJBVy5ETEwiKSk7Ci0JaWYgKCBERHJhd0RMTCAhPSBOVUxMICkgewotCSAgSFJFU1VMVCAoV0lOQVBJICpERHJhd0NyZWF0ZSkoR1VJRCAqLExQRElSRUNURFJBVyAqLElVbmtub3duICopOwotCSAgTFBESVJFQ1REUkFXIEREcmF3OwotCi0JICAvKiBUcnkgdG8gY3JlYXRlIGEgdmFsaWQgRGlyZWN0RHJhdyBvYmplY3QgKi8KLQkgIEREcmF3Q3JlYXRlID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhERHJhd0RMTCwgVEVYVCgiRGlyZWN0RHJhd0NyZWF0ZSIpKTsKLQkgIGlmICggKEREcmF3Q3JlYXRlICE9IE5VTEwpCi0JCQkmJiAhRkFJTEVEKEREcmF3Q3JlYXRlKE5VTEwsICZERHJhdywgTlVMTCkpICkgewotCSAgICBpZiAoICFGQUlMRUQoSURpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbChERHJhdywKLQkJCQkJCQlOVUxMLCBERFNDTF9OT1JNQUwpKSApIHsKLQkgICAgICBERFNVUkZBQ0VERVNDIGRlc2M7Ci0JICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSAgRERyYXdTdXJmOwotCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UzIEREcmF3U3VyZjM7Ci0KLQkgICAgICAvKiBUcnkgdG8gY3JlYXRlIGEgRGlyZWN0RHJhd1N1cmZhY2UzIG9iamVjdCAqLwotCSAgICAgIFNETF9tZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7Ci0JICAgICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7Ci0JICAgICAgZGVzYy5kd0ZsYWdzID0gRERTRF9DQVBTOwotCSAgICAgIGRlc2MuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1BSSU1BUllTVVJGQUNFfEREU0NBUFNfVklERU9NRU1PUlk7Ci0JICAgICAgaWYgKCAhRkFJTEVEKElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UoRERyYXcsICZkZXNjLAotCQkJCQkJCSZERHJhd1N1cmYsIE5VTEwpKSApIHsKLQkgICAgICAgIGlmICggIUZBSUxFRChJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoRERyYXdTdXJmLAotCQkJJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UzLCAoTFBWT0lEICopJkREcmF3U3VyZjMpKSApIHsKLQkgICAgICAgICAgLyogWWF5ISAqLwotCQkgIGRkcmF3X29rID0gMTsKLQotCSAgICAgICAgICAvKiBDbGVhbiB1cC4uICovCi0JICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTNfUmVsZWFzZShERHJhd1N1cmYzKTsKLQkgICAgICAgIH0KLQkgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKEREcmF3U3VyZik7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIElEaXJlY3REcmF3X1JlbGVhc2UoRERyYXcpOwotCSAgfQotCSAgRnJlZUxpYnJhcnkoRERyYXdETEwpOwotCX0KLQlyZXR1cm4oZGlucHV0X29rICYmIGRkcmF3X29rKTsKLX0KLQotLyogRnVuY3Rpb25zIGZvciBsb2FkaW5nIHRoZSBEaXJlY3RYIGZ1bmN0aW9ucyBkeW5hbWljYWxseSAqLwotc3RhdGljIEhJTlNUQU5DRSBERHJhd0RMTCA9IE5VTEw7Ci1zdGF0aWMgSElOU1RBTkNFIERJbnB1dERMTCA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIERYNV9VbmxvYWQodm9pZCkKLXsKLQlpZiAoIEREcmF3RExMICE9IE5VTEwgKSB7Ci0JCUZyZWVMaWJyYXJ5KEREcmF3RExMKTsKLQkJRERyYXdDcmVhdGUgPSBOVUxMOwotCQlERHJhd0RMTCA9IE5VTEw7Ci0JfQotCWlmICggRElucHV0RExMICE9IE5VTEwgKSB7Ci0JCUZyZWVMaWJyYXJ5KERJbnB1dERMTCk7Ci0JCURJbnB1dENyZWF0ZSA9IE5VTEw7Ci0JCURJbnB1dERMTCA9IE5VTEw7Ci0JfQotfQotc3RhdGljIGludCBEWDVfTG9hZCh2b2lkKQotewotCWludCBzdGF0dXM7Ci0KLQlEWDVfVW5sb2FkKCk7Ci0JRERyYXdETEwgPSBMb2FkTGlicmFyeShURVhUKCJERFJBVy5ETEwiKSk7Ci0JaWYgKCBERHJhd0RMTCAhPSBOVUxMICkgewotCQlERHJhd0NyZWF0ZSA9ICh2b2lkICopR2V0UHJvY0FkZHJlc3MoRERyYXdETEwsCi0JCQkJCVRFWFQoIkRpcmVjdERyYXdDcmVhdGUiKSk7Ci0JfQotCURJbnB1dERMTCA9IExvYWRMaWJyYXJ5KFRFWFQoIkRJTlBVVC5ETEwiKSk7Ci0JaWYgKCBESW5wdXRETEwgIT0gTlVMTCApIHsKLQkJRElucHV0Q3JlYXRlID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhESW5wdXRETEwsCi0JCQkJCVRFWFQoIkRpcmVjdElucHV0Q3JlYXRlQSIpKTsKLQl9Ci0JaWYgKCBERHJhd0RMTCAmJiBERHJhd0NyZWF0ZSAmJiBESW5wdXRETEwgJiYgRElucHV0Q3JlYXRlICkgewotCQlzdGF0dXMgPSAwOwotCX0gZWxzZSB7Ci0JCURYNV9VbmxvYWQoKTsKLQkJc3RhdHVzID0gLTE7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIERYNV9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICp0aGlzKQotewotCS8qIEZyZWUgRGlyZWN0RHJhdyBvYmplY3QgKi8KLQlpZiAoIGRkcmF3MiAhPSBOVUxMICkgewotCQlJRGlyZWN0RHJhdzJfUmVsZWFzZShkZHJhdzIpOwotCX0KLQlEWDVfVW5sb2FkKCk7Ci0JaWYgKCB0aGlzICkgewotCQlpZiAoIHRoaXMtPmhpZGRlbiApIHsKLQkJCVNETF9mcmVlKHRoaXMtPmhpZGRlbik7Ci0JCX0KLQkJaWYgKCB0aGlzLT5nbF9kYXRhICkgewotCQkJU0RMX2ZyZWUodGhpcy0+Z2xfZGF0YSk7Ci0JCX0KLQkJU0RMX2ZyZWUodGhpcyk7Ci0JfQotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpEWDVfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKLQotCS8qIExvYWQgRGlyZWN0WCAqLwotCWlmICggRFg1X0xvYWQoKSA8IDAgKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLQlpZiAoIGRldmljZSApIHsKLQkJU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOwotCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0JCWRldmljZS0+Z2xfZGF0YSA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVHTERhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+Z2xfZGF0YSkpOwotCX0KLQlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpIHx8Ci0JCSAgICAgICAgICAgICAgICAgKGRldmljZS0+Z2xfZGF0YSA9PSBOVUxMKSApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCURYNV9EZWxldGVEZXZpY2UoZGV2aWNlKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCVNETF9tZW1zZXQoZGV2aWNlLT5nbF9kYXRhLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmdsX2RhdGEpKTsKLQotCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLQlkZXZpY2UtPlZpZGVvSW5pdCA9IERYNV9WaWRlb0luaXQ7Ci0JZGV2aWNlLT5MaXN0TW9kZXMgPSBEWDVfTGlzdE1vZGVzOwotCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gRFg1X1NldFZpZGVvTW9kZTsKLQlkZXZpY2UtPlVwZGF0ZU1vdXNlID0gV0lOX1VwZGF0ZU1vdXNlOwotCWRldmljZS0+Q3JlYXRlWVVWT3ZlcmxheSA9IERYNV9DcmVhdGVZVVZPdmVybGF5OwotCWRldmljZS0+U2V0Q29sb3JzID0gRFg1X1NldENvbG9yczsKLQlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKLQlkZXZpY2UtPlZpZGVvUXVpdCA9IERYNV9WaWRlb1F1aXQ7Ci0JZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IERYNV9BbGxvY0hXU3VyZmFjZTsKLQlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gRFg1X0NoZWNrSFdCbGl0OwotCWRldmljZS0+RmlsbEhXUmVjdCA9IERYNV9GaWxsSFdSZWN0OwotCWRldmljZS0+U2V0SFdDb2xvcktleSA9IERYNV9TZXRIV0NvbG9yS2V5OwotCWRldmljZS0+U2V0SFdBbHBoYSA9IERYNV9TZXRIV0FscGhhOwotCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IERYNV9Mb2NrSFdTdXJmYWNlOwotCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gRFg1X1VubG9ja0hXU3VyZmFjZTsKLQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBEWDVfRmxpcEhXU3VyZmFjZTsKLQlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBEWDVfRnJlZUhXU3VyZmFjZTsKLQlkZXZpY2UtPlNldEdhbW1hUmFtcCA9IERYNV9TZXRHYW1tYVJhbXA7Ci0JZGV2aWNlLT5HZXRHYW1tYVJhbXAgPSBEWDVfR2V0R2FtbWFSYW1wOwotI2lmIFNETF9WSURFT19PUEVOR0wKLQlkZXZpY2UtPkdMX0xvYWRMaWJyYXJ5ID0gV0lOX0dMX0xvYWRMaWJyYXJ5OwotCWRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBXSU5fR0xfR2V0UHJvY0FkZHJlc3M7Ci0JZGV2aWNlLT5HTF9HZXRBdHRyaWJ1dGUgPSBXSU5fR0xfR2V0QXR0cmlidXRlOwotCWRldmljZS0+R0xfTWFrZUN1cnJlbnQgPSBXSU5fR0xfTWFrZUN1cnJlbnQ7Ci0JZGV2aWNlLT5HTF9Td2FwQnVmZmVycyA9IFdJTl9HTF9Td2FwQnVmZmVyczsKLSNlbmRpZgotCWRldmljZS0+U2V0Q2FwdGlvbiA9IFdJTl9TZXRXTUNhcHRpb247Ci0JZGV2aWNlLT5TZXRJY29uID0gV0lOX1NldFdNSWNvbjsKLQlkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBXSU5fSWNvbmlmeVdpbmRvdzsKLQlkZXZpY2UtPkdyYWJJbnB1dCA9IFdJTl9HcmFiSW5wdXQ7Ci0JZGV2aWNlLT5HZXRXTUluZm8gPSBXSU5fR2V0V01JbmZvOwotCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gV0lOX0ZyZWVXTUN1cnNvcjsKLQlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gV0lOX0NyZWF0ZVdNQ3Vyc29yOwotCWRldmljZS0+U2hvd1dNQ3Vyc29yID0gV0lOX1Nob3dXTUN1cnNvcjsKLQlkZXZpY2UtPldhcnBXTUN1cnNvciA9IFdJTl9XYXJwV01DdXJzb3I7Ci0JZGV2aWNlLT5DaGVja01vdXNlTW9kZSA9IFdJTl9DaGVja01vdXNlTW9kZTsKLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IERYNV9Jbml0T1NLZXltYXA7Ci0JZGV2aWNlLT5QdW1wRXZlbnRzID0gRFg1X1B1bXBFdmVudHM7Ci0KLQkvKiBTZXQgdXAgdGhlIHdpbmRvd3MgbWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMgKi8KLQlXSU5fQWN0aXZhdGUgPSBEWDVfQWN0aXZhdGU7Ci0JV0lOX1JlYWxpemVQYWxldHRlID0gRFg1X1JlYWxpemVQYWxldHRlOwotCVdJTl9QYWxldHRlQ2hhbmdlZCA9IERYNV9QYWxldHRlQ2hhbmdlZDsKLQlXSU5fV2luUEFJTlQgPSBEWDVfV2luUEFJTlQ7Ci0JSGFuZGxlTWVzc2FnZSA9IERYNV9IYW5kbGVNZXNzYWdlOwotCi0JZGV2aWNlLT5mcmVlID0gRFg1X0RlbGV0ZURldmljZTsKLQotCS8qIFdlJ3JlIGZpbmFsbHkgcmVhZHkgKi8KLQlyZXR1cm4gZGV2aWNlOwotfQotCi1WaWRlb0Jvb3RTdHJhcCBESVJFQ1RYX2Jvb3RzdHJhcCA9IHsKLQkiZGlyZWN0eCIsICJXaW45NS85OC8yMDAwIERpcmVjdFgiLAotCURYNV9BdmFpbGFibGUsIERYNV9DcmVhdGVEZXZpY2UKLX07Ci0KLXN0YXRpYyBpbnQgY21wbW9kZXMoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQotewotICAgIFNETF9SZWN0ICphID0gKihTRExfUmVjdCAqKil2YTsKLSAgICBTRExfUmVjdCAqYiA9ICooU0RMX1JlY3QgKiopdmI7Ci0gICAgaWYgKCBhLT53ID09IGItPncgKQotICAgICAgICByZXR1cm4gYi0+aCAtIGEtPmg7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYi0+dyAtIGEtPnc7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBFbnVtTW9kZXMyKEREU1VSRkFDRURFU0MgKmRlc2MsIFZPSUQgKnVkYXRhKQotewotCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IChTRExfVmlkZW9EZXZpY2UgKil1ZGF0YTsKLQlzdHJ1Y3QgRFg1RW51bVJlY3QgKmVudW1yZWN0OwotI2lmIGRlZmluZWQoTk9OQU1FTEVTU1VOSU9OKQotCWludCBicHAgPSBkZXNjLT5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudDsKLQlpbnQgcmVmcmVzaFJhdGUgPSBkZXNjLT51Mi5kd1JlZnJlc2hSYXRlOwotI2Vsc2UKLQlpbnQgYnBwID0gZGVzYy0+ZGRwZlBpeGVsRm9ybWF0LmR3UkdCQml0Q291bnQ7Ci0JaW50IHJlZnJlc2hSYXRlID0gZGVzYy0+ZHdSZWZyZXNoUmF0ZTsKLSNlbmRpZgotCWludCBtYXhSZWZyZXNoUmF0ZTsKLQotCWlmICggZGVzYy0+ZHdXaWR0aCA8PSBTRExfZGVza3RvcF9tb2RlLmRtUGVsc1dpZHRoICYmCi0JICAgICBkZXNjLT5kd0hlaWdodCA8PSBTRExfZGVza3RvcF9tb2RlLmRtUGVsc0hlaWdodCApIHsKLQkJbWF4UmVmcmVzaFJhdGUgPSBTRExfZGVza3RvcF9tb2RlLmRtRGlzcGxheUZyZXF1ZW5jeTsKLQl9IGVsc2UgewotCQltYXhSZWZyZXNoUmF0ZSA9IDg1OwkvKiBzYWZlIHZhbHVlPyAqLwotCX0KLQotCXN3aXRjaCAoYnBwKSAgewotCQljYXNlIDg6Ci0JCWNhc2UgMTY6Ci0JCWNhc2UgMjQ6Ci0JCWNhc2UgMzI6Ci0JCQlicHAgLz0gODsgLS1icHA7Ci0JCQlpZiAoIGVudW1saXN0c1ticHBdICYmCi0JCQkgICAgIGVudW1saXN0c1ticHBdLT5yLncgPT0gKFVpbnQxNilkZXNjLT5kd1dpZHRoICYmCi0JCQkgICAgIGVudW1saXN0c1ticHBdLT5yLmggPT0gKFVpbnQxNilkZXNjLT5kd0hlaWdodCApIHsKLQkJCQlpZiAoIHJlZnJlc2hSYXRlID4gZW51bWxpc3RzW2JwcF0tPnJlZnJlc2hSYXRlICYmCi0JCQkJICAgICByZWZyZXNoUmF0ZSA8PSBtYXhSZWZyZXNoUmF0ZSApIHsKLQkJCQkJZW51bWxpc3RzW2JwcF0tPnJlZnJlc2hSYXRlID0gcmVmcmVzaFJhdGU7Ci0jaWZkZWYgRERSQVdfREVCVUcKLSBmcHJpbnRmKHN0ZGVyciwgIk5ldyByZWZyZXNoIHJhdGUgZm9yICVkIGJwcDogJWR4JWQgYXQgJWQgSHpcbiIsIChicHArMSkqOCwgKGludClkZXNjLT5kd1dpZHRoLCAoaW50KWRlc2MtPmR3SGVpZ2h0LCByZWZyZXNoUmF0ZSk7Ci0jZW5kaWYKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkrK1NETF9udW1tb2Rlc1ticHBdOwotCQkJZW51bXJlY3QgPSAoc3RydWN0IERYNUVudW1SZWN0KilTRExfbWFsbG9jKHNpemVvZihzdHJ1Y3QgRFg1RW51bVJlY3QpKTsKLQkJCWlmICggIWVudW1yZWN0ICkgewotCQkJCVNETF9PdXRPZk1lbW9yeSgpOwotCQkJCXJldHVybihEREVOVU1SRVRfQ0FOQ0VMKTsKLQkJCX0KLQkJCWVudW1yZWN0LT5yZWZyZXNoUmF0ZSA9IHJlZnJlc2hSYXRlOwotCQkJZW51bXJlY3QtPnIueCA9IDA7Ci0JCQllbnVtcmVjdC0+ci55ID0gMDsKLQkJCWVudW1yZWN0LT5yLncgPSAoVWludDE2KWRlc2MtPmR3V2lkdGg7Ci0JCQllbnVtcmVjdC0+ci5oID0gKFVpbnQxNilkZXNjLT5kd0hlaWdodDsKLQkJCWVudW1yZWN0LT5uZXh0ID0gZW51bWxpc3RzW2JwcF07Ci0JCQllbnVtbGlzdHNbYnBwXSA9IGVudW1yZWN0OwotI2lmZGVmIEREUkFXX0RFQlVHCi0gZnByaW50ZihzdGRlcnIsICJOZXcgbW9kZSBmb3IgJWQgYnBwOiAlZHglZCBhdCAlZCBIelxuIiwgKGJwcCsxKSo4LCAoaW50KWRlc2MtPmR3V2lkdGgsIChpbnQpZGVzYy0+ZHdIZWlnaHQsIHJlZnJlc2hSYXRlKTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuKERERU5VTVJFVF9PSyk7Ci19Ci0KLXZvaWQgU2V0RERlcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGNvZGUpCi17Ci0Jc3RhdGljIGNoYXIgKmVycm9yOwotCXN0YXRpYyBjaGFyICBlcnJidWZbMTAyNF07Ci0KLQllcnJidWZbMF0gPSAwOwotCXN3aXRjaCAoY29kZSkgewotCQljYXNlIERERVJSX0dFTkVSSUM6Ci0JCQllcnJvciA9ICJVbmRlZmluZWQgZXJyb3IhIjsKLQkJCWJyZWFrOwotCQljYXNlIERERVJSX0VYQ0VQVElPTjoKLQkJCWVycm9yID0gIkV4Y2VwdGlvbiBlbmNvdW50ZXJlZCI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9JTlZBTElET0JKRUNUOgotCQkJZXJyb3IgPSAiSW52YWxpZCBvYmplY3QiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfSU5WQUxJRFBBUkFNUzoKLQkJCWVycm9yID0gIkludmFsaWQgcGFyYW1ldGVycyI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9OT1RGT1VORDoKLQkJCWVycm9yID0gIk9iamVjdCBub3QgZm91bmQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfSU5WQUxJRFJFQ1Q6Ci0JCQllcnJvciA9ICJJbnZhbGlkIHJlY3RhbmdsZSI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9JTlZBTElEQ0FQUzoKLQkJCWVycm9yID0gIkludmFsaWQgY2FwcyBtZW1iZXIiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfSU5WQUxJRFBJWEVMRk9STUFUOgotCQkJZXJyb3IgPSAiSW52YWxpZCBwaXhlbCBmb3JtYXQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfT1VUT0ZNRU1PUlk6Ci0JCQllcnJvciA9ICJPdXQgb2YgbWVtb3J5IjsKLQkJCWJyZWFrOwotCQljYXNlIERERVJSX09VVE9GVklERU9NRU1PUlk6Ci0JCQllcnJvciA9ICJPdXQgb2YgdmlkZW8gbWVtb3J5IjsKLQkJCWJyZWFrOwotCQljYXNlIERERVJSX1NVUkZBQ0VCVVNZOgotCQkJZXJyb3IgPSAiU3VyZmFjZSBidXN5IjsKLQkJCWJyZWFrOwotCQljYXNlIERERVJSX1NVUkZBQ0VMT1NUOgotCQkJZXJyb3IgPSAiU3VyZmFjZSB3YXMgbG9zdCI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9XQVNTVElMTERSQVdJTkc6Ci0JCQllcnJvciA9ICJEaXJlY3REcmF3IGlzIHN0aWxsIGRyYXdpbmciOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfSU5WQUxJRFNVUkZBQ0VUWVBFOgotCQkJZXJyb3IgPSAiSW52YWxpZCBzdXJmYWNlIHR5cGUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfTk9FWENMVVNJVkVNT0RFOgotCQkJZXJyb3IgPSAiTm90IGluIGV4Y2x1c2l2ZSBhY2Nlc3MgbW9kZSI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9OT1BBTEVUVEVBVFRBQ0hFRDoKLQkJCWVycm9yID0gIk5vIHBhbGV0dGUgYXR0YWNoZWQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfTk9QQUxFVFRFSFc6Ci0JCQllcnJvciA9ICJObyBwYWxldHRlIGhhcmR3YXJlIjsKLQkJCWJyZWFrOwotCQljYXNlIERERVJSX05PVDhCSVRDT0xPUjoKLQkJCWVycm9yID0gIk5vdCA4LWJpdCBjb2xvciI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9FWENMVVNJVkVNT0RFQUxSRUFEWVNFVDoKLQkJCWVycm9yID0gIkV4Y2x1c2l2ZSBtb2RlIHdhcyBhbHJlYWR5IHNldCI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9IV05EQUxSRUFEWVNFVDoKLQkJCWVycm9yID0gIldpbmRvdyBoYW5kbGUgYWxyZWFkeSBzZXQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfSFdORFNVQkNMQVNTRUQ6Ci0JCQllcnJvciA9ICJXaW5kb3cgaGFuZGxlIGlzIHN1YmNsYXNzZWQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfTk9CTFRIVzoKLQkJCWVycm9yID0gIk5vIGJsaXQgaGFyZHdhcmUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfSU1QTElDSVRMWUNSRUFURUQ6Ci0JCQllcnJvciA9ICJTdXJmYWNlIHdhcyBpbXBsaWNpdGx5IGNyZWF0ZWQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfSU5DT01QQVRJQkxFUFJJTUFSWToKLQkJCWVycm9yID0gIkluY29tcGF0aWJsZSBwcmltYXJ5IHN1cmZhY2UiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfTk9DT09QRVJBVElWRUxFVkVMU0VUOgotCQkJZXJyb3IgPSAiTm8gY29vcGVyYXRpdmUgbGV2ZWwgc2V0IjsKLQkJCWJyZWFrOwotCQljYXNlIERERVJSX05PRElSRUNURFJBV0hXOgotCQkJZXJyb3IgPSAiTm8gRGlyZWN0RHJhdyBoYXJkd2FyZSI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9OT0VNVUxBVElPTjoKLQkJCWVycm9yID0gIk5vIGVtdWxhdGlvbiBhdmFpbGFibGUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfTk9GTElQSFc6Ci0JCQllcnJvciA9ICJObyBmbGlwIGhhcmR3YXJlIjsKLQkJCWJyZWFrOwotCQljYXNlIERERVJSX05PVEZMSVBQQUJMRToKLQkJCWVycm9yID0gIlN1cmZhY2Ugbm90IGZsaXBwYWJsZSI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9QUklNQVJZU1VSRkFDRUFMUkVBRFlFWElTVFM6Ci0JCQllcnJvciA9ICJQcmltYXJ5IHN1cmZhY2UgYWxyZWFkeSBleGlzdHMiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfVU5TVVBQT1JURURNT0RFOgotCQkJZXJyb3IgPSAiVW5zdXBwb3J0ZWQgbW9kZSI7Ci0JCQlicmVhazsKLQkJY2FzZSBEREVSUl9XUk9OR01PREU6Ci0JCQllcnJvciA9ICJTdXJmYWNlIGNyZWF0ZWQgaW4gZGlmZmVyZW50IG1vZGUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRERFUlJfVU5TVVBQT1JURUQ6Ci0JCQllcnJvciA9ICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCI7Ci0JCQlicmVhazsKLQkJY2FzZSBFX05PSU5URVJGQUNFOgotCQkJZXJyb3IgPSAiSW50ZXJmYWNlIG5vdCBwcmVzZW50IjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJU0RMX3NucHJpbnRmKGVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLAotCQkJICAgICAgICAgIiVzOiBVbmtub3duIERpcmVjdERyYXcgZXJyb3I6IDB4JXgiLAotCQkJCQkJCQlmdW5jdGlvbiwgY29kZSk7Ci0JCQlicmVhazsKLQl9Ci0JaWYgKCAhIGVycmJ1ZlswXSApIHsKLQkJU0RMX3NucHJpbnRmKGVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLCAiJXM6ICVzIiwgZnVuY3Rpb24sIGVycm9yKTsKLQl9Ci0JU0RMX1NldEVycm9yKCIlcyIsIGVycmJ1Zik7Ci0JcmV0dXJuOwotfQotCi0KLXN0YXRpYyBpbnQgRFg1X1VwZGF0ZVZpZGVvSW5mbyhfVEhJUykKLXsKLQkvKiBUaGlzIG5lZWRzIHRvIGJlIEREQ0FQU19EWDUgZm9yIHRoZSBEaXJlY3REcmF3MiBpbnRlcmZhY2UgKi8KLSNpZiBESVJFQ1REUkFXX1ZFUlNJT04gPD0gMHgzMDAKLSNlcnJvciBZb3VyIHZlcnNpb24gb2YgRGlyZWN0WCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1LjAKLSNlbmRpZgotI2lmbmRlZiBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9TZXRHYW1tYVJhbXAKLQkvKmlmIGdhbW1hIGlzIHVuZGVmaW5lZCB0aGVuIHdlIHJlYWxseSBoYXZlIGRpcmVjdHggPD0gMHg1MDAqLwotCUREQ0FQUyBERENhcHM7Ci0jZWxzZQotCUREQ0FQU19EWDUgRERDYXBzOwotI2VuZGlmCi0JSFJFU1VMVCByZXN1bHQ7Ci0KLQkvKiBGaWxsIGluIG91ciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gY2FwYWJpbGl0aWVzICovCi0JU0RMX21lbXNldCgmRERDYXBzLCAwLCBzaXplb2YoRERDYXBzKSk7Ci0JRERDYXBzLmR3U2l6ZSA9IHNpemVvZihERENhcHMpOwotCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9HZXRDYXBzKGRkcmF3MiwgKEREQ0FQUyAqKSZERENhcHMsIE5VTEwpOwotCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQlTZXRERGVycm9yKCJEaXJlY3REcmF3Mjo6R2V0Q2FwcyIsIHJlc3VsdCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCXRoaXMtPmluZm8uaHdfYXZhaWxhYmxlID0gMTsKLQlpZiAoIChERENhcHMuZHdDYXBzICYgRERDQVBTX0JMVCkgPT0gRERDQVBTX0JMVCApIHsKLQkJdGhpcy0+aW5mby5ibGl0X2h3ID0gMTsKLQl9Ci0JaWYgKCAoKEREQ2Fwcy5kd0NhcHMgJiBERENBUFNfQ09MT1JLRVkpID09IEREQ0FQU19DT0xPUktFWSkgJiYKLQkgICAgICgoRERDYXBzLmR3Q0tleUNhcHMgJiBERENLRVlDQVBTX1NSQ0JMVCkgPT0gRERDS0VZQ0FQU19TUkNCTFQpICkgewotCQl0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgPSAxOwotCX0KLQlpZiAoIChERENhcHMuZHdDYXBzICYgRERDQVBTX0FMUEhBKSA9PSBERENBUFNfQUxQSEEgKSB7Ci0JCS8qIFRoaXMgaXMgb25seSBmb3IgYWxwaGEgY2hhbm5lbCwgYW5kIERpcmVjdFggNgotCQkgICBkb2Vzbid0IHN1cHBvcnQgMkQgYWxwaGEgYmxpdHMgeWV0LCBzbyBzZXQgaXQgMAotCQkgKi8KLQkJdGhpcy0+aW5mby5ibGl0X2h3X0EgPSAwOwotCX0KLQlpZiAoIChERENhcHMuZHdDYXBzICYgRERDQVBTX0NBTkJMVFNZU01FTSkgPT0gRERDQVBTX0NBTkJMVFNZU01FTSApIHsKLQkJdGhpcy0+aW5mby5ibGl0X3N3ID0gMTsKLQkJLyogVGhpcyBpc24ndCBuZWNlc3NhcmlseSB0cnVlLCBidXQgdGhlIEhFTCB3aWxsIGNvdmVyIHVzICovCi0JCXRoaXMtPmluZm8uYmxpdF9zd19DQyA9IHRoaXMtPmluZm8uYmxpdF9od19DQzsKLQkJdGhpcy0+aW5mby5ibGl0X3N3X0EgPSB0aGlzLT5pbmZvLmJsaXRfaHdfQTsKLQl9Ci0JaWYgKCAoRERDYXBzLmR3Q2FwcyAmIEREQ0FQU19CTFRDT0xPUkZJTEwpID09IEREQ0FQU19CTFRDT0xPUkZJTEwgKSB7Ci0JCXRoaXMtPmluZm8uYmxpdF9maWxsID0gMTsKLQl9Ci0KLQkvKiBGaW5kIG91dCBob3cgbXVjaCB2aWRlbyBtZW1vcnkgaXMgYXZhaWxhYmxlICovCi0JeyBERFNDQVBTIGRkc0NhcHM7Ci0JICBEV09SRCB0b3RhbF9tZW07Ci0JCWRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19WSURFT01FTU9SWTsKLQkJcmVzdWx0ID0gSURpcmVjdERyYXcyX0dldEF2YWlsYWJsZVZpZE1lbShkZHJhdzIsCi0JCQkJCQkmZGRzQ2FwcywgJnRvdGFsX21lbSwgTlVMTCk7Ci0JCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQkJdG90YWxfbWVtID0gRERDYXBzLmR3VmlkTWVtVG90YWw7IAotCQl9Ci0JCXRoaXMtPmluZm8udmlkZW9fbWVtID0gdG90YWxfbWVtLzEwMjQ7Ci0JfQotCXJldHVybigwKTsKLX0KLQotaW50IERYNV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLQlIUkVTVUxUIHJlc3VsdDsKLQlMUERJUkVDVERSQVcgZGRyYXc7Ci0JaW50IGksIGo7Ci0JSERDIGhkYzsKLQotCS8qIEludGlhbGl6ZSBldmVyeXRoaW5nICovCi0JZGRyYXcyID0gTlVMTDsKLQlTRExfcHJpbWFyeSA9IE5VTEw7Ci0JU0RMX2NsaXBwZXIgPSBOVUxMOwotCVNETF9wYWxldHRlID0gTlVMTDsKLQlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgewotCQlTRExfbnVtbW9kZXNbaV0gPSAwOwotCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOwotCQlTRExfbW9kZWluZGV4W2ldID0gMDsKLQl9Ci0JY29sb3JjaGFuZ2VfZXhwZWN0ZWQgPSAwOwotCi0JLyogQ3JlYXRlIHRoZSB3aW5kb3cgKi8KLQlpZiAoIERYNV9DcmVhdGVXaW5kb3codGhpcykgPCAwICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQotI2lmICFTRExfQVVESU9fRElTQUJMRUQKLQlEWDVfU291bmRGb2N1cyhTRExfV2luZG93KTsKLSNlbmRpZgotCi0JLyogQ3JlYXRlIHRoZSBEaXJlY3REcmF3IG9iamVjdCAqLwotCXJlc3VsdCA9IEREcmF3Q3JlYXRlKE5VTEwsICZkZHJhdywgTlVMTCk7Ci0JaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7Ci0JCVNldEREZXJyb3IoIkRpcmVjdERyYXdDcmVhdGUiLCByZXN1bHQpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXN1bHQgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShkZHJhdywgJklJRF9JRGlyZWN0RHJhdzIsCi0JCQkJCQkJKExQVk9JRCAqKSZkZHJhdzIpOwotCUlEaXJlY3REcmF3X1JlbGVhc2UoZGRyYXcpOwotCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQlTZXRERGVycm9yKCJEaXJlY3REcmF3OjpRdWVyeUludGVyZmFjZSIsIHJlc3VsdCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogRGV0ZXJtaW5lIHRoZSBzY3JlZW4gZGVwdGggKi8KLQloZGMgPSBHZXREQyhTRExfV2luZG93KTsKLQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBHZXREZXZpY2VDYXBzKGhkYyxQTEFORVMpICoKLQkJCQkJR2V0RGV2aWNlQ2FwcyhoZGMsQklUU1BJWEVMKTsKLQlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKLQotI2lmbmRlZiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKLQkvKiBRdWVyeSBmb3IgdGhlIGRlc2t0b3AgcmVzb2x1dGlvbiAqLwotCUVudW1EaXNwbGF5U2V0dGluZ3MoTlVMTCwgRU5VTV9DVVJSRU5UX1NFVFRJTkdTLCAmU0RMX2Rlc2t0b3BfbW9kZSk7Ci0JdGhpcy0+aW5mby5jdXJyZW50X3cgPSBTRExfZGVza3RvcF9tb2RlLmRtUGVsc1dpZHRoOwotCXRoaXMtPmluZm8uY3VycmVudF9oID0gU0RMX2Rlc2t0b3BfbW9kZS5kbVBlbHNIZWlnaHQ7Ci0jZW5kaWYKLQotCS8qIEVudW1lcmF0ZSB0aGUgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZXMgKi8KLQlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkKLQkJZW51bWxpc3RzW2ldID0gTlVMTDsKLQotCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9FbnVtRGlzcGxheU1vZGVzKGRkcmF3MixEREVETV9SRUZSRVNIUkFURVMsTlVMTCx0aGlzLEVudW1Nb2RlczIpOwotCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQlTZXRERGVycm9yKCJEaXJlY3REcmF3Mjo6RW51bURpc3BsYXlNb2RlcyIsIHJlc3VsdCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7Ci0JCXN0cnVjdCBEWDVFbnVtUmVjdCAqcmVjdDsKLQkJU0RMX21vZGVsaXN0W2ldID0gKFNETF9SZWN0ICoqKQotCQkJCVNETF9tYWxsb2MoKFNETF9udW1tb2Rlc1tpXSsxKSpzaXplb2YoU0RMX1JlY3QgKikpOwotCQlpZiAoIFNETF9tb2RlbGlzdFtpXSA9PSBOVUxMICkgewotCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCWZvciAoIGogPSAwLCByZWN0ID0gZW51bWxpc3RzW2ldOyByZWN0OyArK2osIHJlY3QgPSByZWN0LT5uZXh0ICkgewotCQkJU0RMX21vZGVsaXN0W2ldW2pdID0gJnJlY3QtPnI7Ci0JCX0KLQkJU0RMX21vZGVsaXN0W2ldW2pdID0gTlVMTDsKLQotCQlpZiAoIFNETF9udW1tb2Rlc1tpXSA+IDAgKSB7Ci0JCQlTRExfcXNvcnQoU0RMX21vZGVsaXN0W2ldLCBTRExfbnVtbW9kZXNbaV0sIHNpemVvZiAqU0RMX21vZGVsaXN0W2ldLCBjbXBtb2Rlcyk7Ci0JCX0KLQl9Ci0JCi0JLyogRmlsbCBpbiBzb21lIHdpbmRvdyBtYW5hZ2VyIGNhcGFiaWxpdGllcyAqLwotCXRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMTsKLQotCS8qIEZpbGwgaW4gdGhlIHZpZGVvIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAqLwotCURYNV9VcGRhdGVWaWRlb0luZm8odGhpcyk7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLVNETF9SZWN0ICoqRFg1X0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQlpbnQgYnBwOwotCi0JYnBwID0gZm9ybWF0LT5CaXRzUGVyUGl4ZWw7Ci0JaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCS8qIEZJWE1FOiAgTm8gc3VwcG9ydCBmb3IgMSBicHAgb3IgNCBicHAgZm9ybWF0cyAqLwotCQlzd2l0Y2ggKGJwcCkgeyAgLyogRG9lcyB3aW5kb3dzIHN1cHBvcnQgb3RoZXIgQlBQPyAqLwotCQkJY2FzZSA4OgotCQkJY2FzZSAxNjoKLQkJCWNhc2UgMjQ6Ci0JCQljYXNlIDMyOgotCQkJCWJwcCA9IChicHAvOCktMTsKLQkJCQlpZiAoIFNETF9udW1tb2Rlc1ticHBdID4gMCApCi0JCQkJCXJldHVybihTRExfbW9kZWxpc3RbYnBwXSk7Ci0JCQkJLyogRmFsbCB0aHJvdWdoICovCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybigoU0RMX1JlY3QgKiopMCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gYnBwICkgewotCQkJcmV0dXJuKChTRExfUmVjdCAqKiktMSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4oKFNETF9SZWN0ICoqKTApOwotCQl9Ci0JfQotfQotCi0vKiBWYXJpb3VzIHNjcmVlbiB1cGRhdGUgZnVuY3Rpb25zIGF2YWlsYWJsZSAqLwotc3RhdGljIHZvaWQgRFg1X1dpbmRvd1VwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotc3RhdGljIHZvaWQgRFg1X0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotCi1TRExfU3VyZmFjZSAqRFg1X1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JU0RMX1N1cmZhY2UgKnZpZGVvOwotCWludCBwcmV2X3csIHByZXZfaDsKLQlIUkVTVUxUIHJlc3VsdDsKLQlEV09SRCBzaGFyZW1vZGU7Ci0JRFdPUkQgc3R5bGU7Ci0JY29uc3QgRFdPUkQgZGlyZWN0c3R5bGUgPQotCQkJKFdTX1BPUFVQKTsKLQljb25zdCBEV09SRCB3aW5kb3dzdHlsZSA9IAotCQkJKFdTX09WRVJMQVBQRUR8V1NfQ0FQVElPTnxXU19TWVNNRU5VfFdTX01JTklNSVpFQk9YKTsKLQljb25zdCBEV09SRCByZXNpemVzdHlsZSA9Ci0JCQkoV1NfVEhJQ0tGUkFNRXxXU19NQVhJTUlaRUJPWCk7Ci0JRERTVVJGQUNFREVTQyBkZHNkOwotCUxQRElSRUNURFJBV1NVUkZBQ0UgIGRkX3N1cmZhY2UxOwotCUxQRElSRUNURFJBV1NVUkZBQ0UzIGRkX3N1cmZhY2UzOwotCi0JU0RMX3Jlc2l6aW5nID0gMTsKLSNpZmRlZiBERFJBV19ERUJVRwotIGZwcmludGYoc3RkZXJyLCAiU2V0dGluZyAlZHglZHglZCB2aWRlbyBtb2RlXG4iLCB3aWR0aCwgaGVpZ2h0LCBicHApOwotI2VuZGlmCi0JLyogQ2xlYW4gdXAgYW55IHByZXZpb3VzIERpcmVjdERyYXcgc3VyZmFjZXMgKi8KLQlpZiAoIGN1cnJlbnQtPmh3ZGF0YSApIHsKLQkJdGhpcy0+RnJlZUhXU3VyZmFjZSh0aGlzLCBjdXJyZW50KTsKLQkJY3VycmVudC0+aHdkYXRhID0gTlVMTDsKLQl9Ci0JaWYgKCBTRExfcHJpbWFyeSAhPSBOVUxMICkgewotCQlJRGlyZWN0RHJhd1N1cmZhY2UzX1JlbGVhc2UoU0RMX3ByaW1hcnkpOwotCQlTRExfcHJpbWFyeSA9IE5VTEw7Ci0JfQotCi0jaWZuZGVmIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUwotCS8qIFVuc2V0IGFueSBwcmV2aW91cyBPcGVuR0wgZnVsbHNjcmVlbiBtb2RlICovCi0JaWYgKCAoY3VycmVudC0+ZmxhZ3MgJiAoU0RMX09QRU5HTHxTRExfRlVMTFNDUkVFTikpID09Ci0JICAgICAgICAgICAgICAgICAgICAgICAoU0RMX09QRU5HTHxTRExfRlVMTFNDUkVFTikgKSB7Ci0JCUNoYW5nZURpc3BsYXlTZXR0aW5ncyhOVUxMLCAwKTsKLQl9Ci0jZW5kaWYKLQotCS8qIENsZWFuIHVwIGFueSBHTCBjb250ZXh0IHRoYXQgbWF5IGJlIGhhbmdpbmcgYXJvdW5kICovCi0JaWYgKCBjdXJyZW50LT5mbGFncyAmIFNETF9PUEVOR0wgKSB7Ci0JCVdJTl9HTF9TaHV0RG93bih0aGlzKTsKLQl9Ci0KLQkvKiBJZiB3ZSBhcmUgc2V0dGluZyBhIEdMIG1vZGUsIHVzZSBHREksIG5vdCBEaXJlY3RYICh5dWNrKSAqLwotCWlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgewotCQlVaW50MzIgUm1hc2ssIEdtYXNrLCBCbWFzazsKLQotCQkvKiBSZWNhbGN1bGF0ZSB0aGUgYml0bWFza3MgaWYgbmVjZXNzYXJ5ICovCi0JCWlmICggYnBwID09IGN1cnJlbnQtPmZvcm1hdC0+Qml0c1BlclBpeGVsICkgewotCQkJdmlkZW8gPSBjdXJyZW50OwotCQl9IGVsc2UgewotCQkJc3dpdGNoIChicHApIHsKLQkJCSAgICBjYXNlIDE1OgotCQkJICAgIGNhc2UgMTY6Ci0JCQkJaWYgKCAwIC8qRElCX1N1c3NTY3JlZW5EZXB0aCgpID09IDE1Ki8gKSB7Ci0JCQkJCS8qIDUtNS01ICovCi0JCQkJCVJtYXNrID0gMHgwMDAwN2MwMDsKLQkJCQkJR21hc2sgPSAweDAwMDAwM2UwOwotCQkJCQlCbWFzayA9IDB4MDAwMDAwMWY7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogNS02LTUgKi8KLQkJCQkJUm1hc2sgPSAweDAwMDBmODAwOwotCQkJCQlHbWFzayA9IDB4MDAwMDA3ZTA7Ci0JCQkJCUJtYXNrID0gMHgwMDAwMDAxZjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgY2FzZSAyNDoKLQkJCSAgICBjYXNlIDMyOgotCQkJCS8qIEdESSBkZWZpbmVkIGFzIDgtOC04ICovCi0JCQkJUm1hc2sgPSAweDAwZmYwMDAwOwotCQkJCUdtYXNrID0gMHgwMDAwZmYwMDsKLQkJCQlCbWFzayA9IDB4MDAwMDAwZmY7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCQlSbWFzayA9IDB4MDAwMDAwMDA7Ci0JCQkJR21hc2sgPSAweDAwMDAwMDAwOwotCQkJCUJtYXNrID0gMHgwMDAwMDAwMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXZpZGVvID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwgMCwgMCwgYnBwLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSbWFzaywgR21hc2ssIEJtYXNrLCAwKTsKLQkJCWlmICggdmlkZW8gPT0gTlVMTCApIHsKLQkJCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCQlyZXR1cm4oTlVMTCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBGaWxsIGluIHBhcnQgb2YgdGhlIHZpZGVvIHN1cmZhY2UgKi8KLQkJcHJldl93ID0gdmlkZW8tPnc7Ci0JCXByZXZfaCA9IHZpZGVvLT5oOwotCQl2aWRlby0+ZmxhZ3MgPSAwOwkvKiBDbGVhciBmbGFncyAqLwotCQl2aWRlby0+dyA9IHdpZHRoOwotCQl2aWRlby0+aCA9IGhlaWdodDsKLQkJdmlkZW8tPnBpdGNoID0gU0RMX0NhbGN1bGF0ZVBpdGNoKHZpZGVvKTsKLQotI2lmbmRlZiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKLQkJLyogU2V0IGZ1bGxzY3JlZW4gbW9kZSBpZiBhcHByb3ByaWF0ZS4KLQkJICAgVWdoLCBzaW5jZSBvdXIgbGlzdCBvZiB2YWxpZCB2aWRlbyBtb2RlcyBjb21lcyBmcm9tCi0JCSAgIHRoZSBEaXJlY3RYIGRyaXZlciwgd2UgbWF5IG5vdCBhY3R1YWxseSBiZSBhYmxlIHRvCi0JCSAgIGNoYW5nZSB0byB0aGUgZGVzaXJlZCByZXNvbHV0aW9uIGhlcmUuCi0JCSAgIEZJWE1FOiBTaG91bGQgd2UgZG8gYSBjbG9zZXN0IG1hdGNoPwotCQkgKi8KLQkJaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQlERVZNT0RFIHNldHRpbmdzOwotCQkJQk9PTCBjaGFuZ2VkOwotCi0JCQlTRExfbWVtc2V0KCZzZXR0aW5ncywgMCwgc2l6ZW9mKERFVk1PREUpKTsKLQkJCXNldHRpbmdzLmRtU2l6ZSA9IHNpemVvZihERVZNT0RFKTsKLQkJCXNldHRpbmdzLmRtQml0c1BlclBlbCA9IHZpZGVvLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKLQkJCXNldHRpbmdzLmRtUGVsc1dpZHRoID0gd2lkdGg7Ci0JCQlzZXR0aW5ncy5kbVBlbHNIZWlnaHQgPSBoZWlnaHQ7Ci0JCQlzZXR0aW5ncy5kbUZpZWxkcyA9IERNX1BFTFNXSURUSCB8IERNX1BFTFNIRUlHSFQgfCBETV9CSVRTUEVSUEVMOwotCQkJaWYgKCB3aWR0aCA8PSAoaW50KVNETF9kZXNrdG9wX21vZGUuZG1QZWxzV2lkdGggJiYKLQkJCSAgICAgaGVpZ2h0IDw9IChpbnQpU0RMX2Rlc2t0b3BfbW9kZS5kbVBlbHNIZWlnaHQgKSB7Ci0JCQkJc2V0dGluZ3MuZG1EaXNwbGF5RnJlcXVlbmN5ID0gU0RMX2Rlc2t0b3BfbW9kZS5kbURpc3BsYXlGcmVxdWVuY3k7Ci0JCQkJc2V0dGluZ3MuZG1GaWVsZHMgfD0gRE1fRElTUExBWUZSRVFVRU5DWTsKLQkJCX0KLQkJCWNoYW5nZWQgPSAoQ2hhbmdlRGlzcGxheVNldHRpbmdzKCZzZXR0aW5ncywgQ0RTX0ZVTExTQ1JFRU4pID09IERJU1BfQ0hBTkdFX1NVQ0NFU1NGVUwpOwotCQkJaWYgKCAhIGNoYW5nZWQgJiYgKHNldHRpbmdzLmRtRmllbGRzICYgRE1fRElTUExBWUZSRVFVRU5DWSkgKSB7Ci0JCQkJc2V0dGluZ3MuZG1GaWVsZHMgJj0gfkRNX0RJU1BMQVlGUkVRVUVOQ1k7Ci0JCQkJY2hhbmdlZCA9IChDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoJnNldHRpbmdzLCBDRFNfRlVMTFNDUkVFTikgPT0gRElTUF9DSEFOR0VfU1VDQ0VTU0ZVTCk7Ci0JCQl9Ci0JCQlpZiAoIGNoYW5nZWQgKSB7Ci0JCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOwotCQkJCVNETF9mdWxsc2NyZWVuX21vZGUgPSBzZXR0aW5nczsKLQkJCX0KLQkJfQotI2VuZGlmIC8qICFOT19DSEFOR0VESVNQTEFZU0VUVElOR1MgKi8KLQotCQlzdHlsZSA9IEdldFdpbmRvd0xvbmcoU0RMX1dpbmRvdywgR1dMX1NUWUxFKTsKLQkJc3R5bGUgJj0gfihyZXNpemVzdHlsZXxXU19NQVhJTUlaRSk7Ci0JCWlmICggdmlkZW8tPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQlzdHlsZSAmPSB+d2luZG93c3R5bGU7Ci0JCQlzdHlsZSB8PSBkaXJlY3RzdHlsZTsKLQkJfSBlbHNlIHsKLQkJCWlmICggZmxhZ3MgJiBTRExfTk9GUkFNRSApIHsKLQkJCQlzdHlsZSAmPSB+d2luZG93c3R5bGU7Ci0JCQkJc3R5bGUgfD0gZGlyZWN0c3R5bGU7Ci0JCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9OT0ZSQU1FOwotCQkJfSBlbHNlIHsKLQkJCQlzdHlsZSAmPSB+ZGlyZWN0c3R5bGU7Ci0JCQkJc3R5bGUgfD0gd2luZG93c3R5bGU7Ci0JCQkJaWYgKCBmbGFncyAmIFNETF9SRVNJWkFCTEUgKSB7Ci0JCQkJCXN0eWxlIHw9IHJlc2l6ZXN0eWxlOwotCQkJCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX1JFU0laQUJMRTsKLQkJCQl9Ci0JCQl9Ci0jaWYgV1NfTUFYSU1JWkUKLQkJCWlmIChJc1pvb21lZChTRExfV2luZG93KSkgc3R5bGUgfD0gV1NfTUFYSU1JWkU7Ci0jZW5kaWYKLQkJfQotCi0JCS8qIERKTTogRG9uJ3QgcGlzcyBvZiBhbnlvbmUgd2hvIGhhcyBzZXR1cCBoaXMgb3duIHdpbmRvdyAqLwotCQlpZiAoICFTRExfd2luZG93aWQgKQotCQkJU2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUsIHN0eWxlKTsKLQotCQkvKiBSZXNpemUgdGhlIHdpbmRvdyAoY29waWVkIGZyb20gU0RMIFdpbkRJQiBkcml2ZXIpICovCi0JCWlmICggIVNETF93aW5kb3dpZCAmJiAhSXNab29tZWQoU0RMX1dpbmRvdykgKSB7Ci0JCQlSRUNUIGJvdW5kczsKLQkJCWludCB4LCB5OwotCQkJSFdORCB0b3A7Ci0JCQlVSU5UIHN3cF9mbGFnczsKLQkJCWNvbnN0IGNoYXIgKndpbmRvdyA9IE5VTEw7Ci0JCQljb25zdCBjaGFyICpjZW50ZXIgPSBOVUxMOwotCi0JCQlpZiAoIHZpZGVvLT53ICE9IHByZXZfdyB8fCB2aWRlby0+aCAhPSBwcmV2X2ggKSB7Ci0JCQkJd2luZG93ID0gU0RMX2dldGVudigiU0RMX1ZJREVPX1dJTkRPV19QT1MiKTsKLQkJCQljZW50ZXIgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fQ0VOVEVSRUQiKTsKLQkJCQlpZiAoIHdpbmRvdyApIHsKLQkJCQkJaWYgKCBTRExfc3NjYW5mKHdpbmRvdywgIiVkLCVkIiwgJngsICZ5KSA9PSAyICkgewotCQkJCQkJU0RMX3dpbmRvd1ggPSB4OwotCQkJCQkJU0RMX3dpbmRvd1kgPSB5OwotCQkJCQl9Ci0JCQkJCWlmICggU0RMX3N0cmNtcCh3aW5kb3csICJjZW50ZXIiKSA9PSAwICkgewotCQkJCQkJY2VudGVyID0gd2luZG93OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3dwX2ZsYWdzID0gKFNXUF9OT0NPUFlCSVRTIHwgU1dQX1NIT1dXSU5ET1cpOwotCi0JCQlib3VuZHMubGVmdCA9IFNETF93aW5kb3dYOwotCQkJYm91bmRzLnRvcCA9IFNETF93aW5kb3dZOwotCQkJYm91bmRzLnJpZ2h0ID0gU0RMX3dpbmRvd1grdmlkZW8tPnc7Ci0JCQlib3VuZHMuYm90dG9tID0gU0RMX3dpbmRvd1krdmlkZW8tPmg7Ci0JCQlBZGp1c3RXaW5kb3dSZWN0RXgoJmJvdW5kcywgR2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUpLCAoR2V0TWVudShTRExfV2luZG93KSAhPSBOVUxMKSwgMCk7Ci0JCQl3aWR0aCA9IGJvdW5kcy5yaWdodC1ib3VuZHMubGVmdDsKLQkJCWhlaWdodCA9IGJvdW5kcy5ib3R0b20tYm91bmRzLnRvcDsKLQkJCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkgewotCQkJCXggPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTiktd2lkdGgpLzI7Ci0JCQkJeSA9IChHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKS1oZWlnaHQpLzI7Ci0JCQl9IGVsc2UgaWYgKCBjZW50ZXIgKSB7Ci0JCQkJeCA9IChHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKS13aWR0aCkvMjsKLQkJCQl5ID0gKEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pLWhlaWdodCkvMjsKLQkJCX0gZWxzZSBpZiAoIFNETF93aW5kb3dYIHx8IFNETF93aW5kb3dZIHx8IHdpbmRvdyApIHsKLQkJCQl4ID0gYm91bmRzLmxlZnQ7Ci0JCQkJeSA9IGJvdW5kcy50b3A7Ci0JCQl9IGVsc2UgewotCQkJCXggPSB5ID0gLTE7Ci0JCQkJc3dwX2ZsYWdzIHw9IFNXUF9OT01PVkU7Ci0JCQl9Ci0JCQlpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQkJdG9wID0gSFdORF9UT1BNT1NUOwotCQkJfSBlbHNlIHsKLQkJCQl0b3AgPSBIV05EX05PVE9QTU9TVDsKLQkJCX0KLQkJCVNldFdpbmRvd1BvcyhTRExfV2luZG93LCB0b3AsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHN3cF9mbGFncyk7Ci0JCQlpZiAoICEoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgKSB7Ci0JCQkJU0RMX3dpbmRvd1ggPSBTRExfYm91bmRzLmxlZnQ7Ci0JCQkJU0RMX3dpbmRvd1kgPSBTRExfYm91bmRzLnRvcDsKLQkJCX0KLQkJCVNldEZvcmVncm91bmRXaW5kb3coU0RMX1dpbmRvdyk7Ci0JCX0KLQkJU0RMX3Jlc2l6aW5nID0gMDsKLQotCQkvKiBTZXQgdXAgZm9yIE9wZW5HTCAqLwotCQlpZiAoIFdJTl9HTF9TZXR1cFdpbmRvdyh0aGlzKSA8IDAgKSB7Ci0JCQlyZXR1cm4oTlVMTCk7Ci0JCX0KLQkJdmlkZW8tPmZsYWdzIHw9IFNETF9PUEVOR0w7Ci0JCXJldHVybih2aWRlbyk7Ci0JfQotCi0JLyogU2V0IHRoZSBhcHByb3ByaWF0ZSB3aW5kb3cgc3R5bGUgKi8KLQlzdHlsZSA9IEdldFdpbmRvd0xvbmcoU0RMX1dpbmRvdywgR1dMX1NUWUxFKTsKLQlzdHlsZSAmPSB+KHJlc2l6ZXN0eWxlfFdTX01BWElNSVpFKTsKLQlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKLQkJc3R5bGUgJj0gfndpbmRvd3N0eWxlOwotCQlzdHlsZSB8PSBkaXJlY3RzdHlsZTsKLQl9IGVsc2UgewotCQlpZiAoIGZsYWdzICYgU0RMX05PRlJBTUUgKSB7Ci0JCQlzdHlsZSAmPSB+d2luZG93c3R5bGU7Ci0JCQlzdHlsZSB8PSBkaXJlY3RzdHlsZTsKLQkJfSBlbHNlIHsKLQkJCXN0eWxlICY9IH5kaXJlY3RzdHlsZTsKLQkJCXN0eWxlIHw9IHdpbmRvd3N0eWxlOwotCQkJaWYgKCBmbGFncyAmIFNETF9SRVNJWkFCTEUgKSB7Ci0JCQkJc3R5bGUgfD0gcmVzaXplc3R5bGU7Ci0JCQl9Ci0JCX0KLSNpZiBXU19NQVhJTUlaRQotCQlpZiAoSXNab29tZWQoU0RMX1dpbmRvdykpIHN0eWxlIHw9IFdTX01BWElNSVpFOwotI2VuZGlmCi0JfQotCS8qIERKTTogRG9uJ3QgcGlzcyBvZiBhbnlvbmUgd2hvIGhhcyBzZXR1cCBoaXMgb3duIHdpbmRvdyAqLwotCWlmICggIVNETF93aW5kb3dpZCApCi0JCVNldFdpbmRvd0xvbmcoU0RMX1dpbmRvdywgR1dMX1NUWUxFLCBzdHlsZSk7Ci0KLQkvKiBTZXQgRGlyZWN0RHJhdyBzaGFyaW5nIG1vZGUuLiBleGNsdXNpdmUgd2hlbiBmdWxsc2NyZWVuICovCi0JaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCXNoYXJlbW9kZSA9IEREU0NMX0ZVTExTQ1JFRU58RERTQ0xfRVhDTFVTSVZFfEREU0NMX0FMTE9XUkVCT09UOwotCX0gZWxzZSB7Ci0JCXNoYXJlbW9kZSA9IEREU0NMX05PUk1BTDsKLQl9Ci0JcmVzdWx0ID0gSURpcmVjdERyYXcyX1NldENvb3BlcmF0aXZlTGV2ZWwoZGRyYXcyLFNETF9XaW5kb3csc2hhcmVtb2RlKTsKLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhdzI6OlNldENvb3BlcmF0aXZlTGV2ZWwiLCByZXN1bHQpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogU2V0IHRoZSBkaXNwbGF5IG1vZGUsIGlmIHdlIGFyZSBpbiBmdWxsc2NyZWVuIG1vZGUgKi8KLQlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKLQkJUkVDVCBib3VuZHM7Ci0JCXN0cnVjdCBEWDVFbnVtUmVjdCAqcmVjdDsKLQkJaW50IG1heFJlZnJlc2hSYXRlOwotCi0JCS8qIENvdmVyIHVwIGRlc2t0b3AgZHVyaW5nIG1vZGUgY2hhbmdlICovCi0JCWJvdW5kcy5sZWZ0ID0gMDsKLQkJYm91bmRzLnRvcCA9IDA7Ci0JCWJvdW5kcy5yaWdodCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOwotCQlib3VuZHMuYm90dG9tID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7Ci0JCUFkanVzdFdpbmRvd1JlY3RFeCgmYm91bmRzLCBHZXRXaW5kb3dMb25nKFNETF9XaW5kb3csIEdXTF9TVFlMRSksIChHZXRNZW51KFNETF9XaW5kb3cpICE9IE5VTEwpLCAwKTsKLQkJU2V0V2luZG93UG9zKFNETF9XaW5kb3csIEhXTkRfVE9QTU9TVCwKLQkJCWJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCAKLQkJCWJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0LAotCQkJYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3AsIFNXUF9OT0NPUFlCSVRTKTsKLQkJU2hvd1dpbmRvdyhTRExfV2luZG93LCBTV19TSE9XKTsKLQkJd2hpbGUgKCBHZXRGb3JlZ3JvdW5kV2luZG93KCkgIT0gU0RMX1dpbmRvdyApIHsKLQkJCVNldEZvcmVncm91bmRXaW5kb3coU0RMX1dpbmRvdyk7Ci0JCQlTRExfRGVsYXkoMTAwKTsKLQkJfQotCi0JCS8qIGZpbmQgbWF4aW11bSBtb25pdG9yIHJlZnJlc2ggcmF0ZSBmb3IgdGhpcyByZXNvbHV0aW9uICovCi0JCS8qIERtaXRyeSBZYWtpbW92IGZ0ZWNoQHR1bGEubmV0ICovCi0JCW1heFJlZnJlc2hSYXRlID0gMDsgLyogc3lzdGVtIGRlZmF1bHQgKi8KLQkJZm9yICggcmVjdCA9IGVudW1saXN0c1ticHAgLyA4IC0gMV07IHJlY3Q7IHJlY3QgPSByZWN0LT5uZXh0ICkgewotCQkJaWYgKCAod2lkdGggPT0gcmVjdC0+ci53KSAmJiAoaGVpZ2h0ID09IHJlY3QtPnIuaCkgKSB7Ci0JCQkJbWF4UmVmcmVzaFJhdGUgPSByZWN0LT5yZWZyZXNoUmF0ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotI2lmZGVmIEREUkFXX0RFQlVHCi0gZnByaW50ZihzdGRlcnIsICJyZWZyZXNoIHJhdGUgPSAlZCBIelxuIiwgbWF4UmVmcmVzaFJhdGUpOwotI2VuZGlmCi0KLQkJcmVzdWx0ID0gSURpcmVjdERyYXcyX1NldERpc3BsYXlNb2RlKGRkcmF3Miwgd2lkdGgsIGhlaWdodCwgYnBwLCBtYXhSZWZyZXNoUmF0ZSwgMCk7Ci0JCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQkJcmVzdWx0ID0gSURpcmVjdERyYXcyX1NldERpc3BsYXlNb2RlKGRkcmF3Miwgd2lkdGgsIGhlaWdodCwgYnBwLCAwLCAwKTsKLQkJCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQkJCS8qIFdlIGNvdWxkbid0IHNldCBmdWxsc2NyZWVuIG1vZGUsIHRyeSB3aW5kb3cgKi8KLQkJCQlyZXR1cm4oRFg1X1NldFZpZGVvTW9kZSh0aGlzLCBjdXJyZW50LCB3aWR0aCwgaGVpZ2h0LCBicHAsIGZsYWdzICYgflNETF9GVUxMU0NSRUVOKSk7IAotCQkJfQotCQl9Ci0JCURYNV9ESW5wdXRSZXNldCh0aGlzLCAxKTsKLQl9IGVsc2UgewotCQlEWDVfRElucHV0UmVzZXQodGhpcywgMCk7Ci0JfQotCURYNV9VcGRhdGVWaWRlb0luZm8odGhpcyk7Ci0KLQkvKiBDcmVhdGUgYSBwcmltYXJ5IERpcmVjdERyYXcgc3VyZmFjZSAqLwotCVNETF9tZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7Ci0JZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7Ci0JZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTOwotCWRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSAoRERTQ0FQU19QUklNQVJZU1VSRkFDRXxERFNDQVBTX1ZJREVPTUVNT1JZKTsKLQlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSAhPSBTRExfRlVMTFNDUkVFTiApIHsKLQkJLyogVGhlcmUncyBubyB3aW5kb3dlZCBkb3VibGUtYnVmZmVyaW5nICovCi0JCWZsYWdzICY9IH5TRExfRE9VQkxFQlVGOwotCX0KLQlpZiAoIChmbGFncyAmIFNETF9ET1VCTEVCVUYpID09IFNETF9ET1VCTEVCVUYgKSB7Ci0JCWRkc2QuZHdGbGFncyB8PSBERFNEX0JBQ0tCVUZGRVJDT1VOVDsKLQkJZGRzZC5kZHNDYXBzLmR3Q2FwcyB8PSAoRERTQ0FQU19DT01QTEVYfEREU0NBUFNfRkxJUCk7Ci0JCWRkc2QuZHdCYWNrQnVmZmVyQ291bnQgPSAxOwotCX0KLQlyZXN1bHQgPSBJRGlyZWN0RHJhdzJfQ3JlYXRlU3VyZmFjZShkZHJhdzIsICZkZHNkLCAmZGRfc3VyZmFjZTEsIE5VTEwpOyAKLQlpZiAoIChyZXN1bHQgIT0gRERfT0spICYmICgoZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGKSApIHsKLQkJZGRzZC5kd0ZsYWdzICY9IH5ERFNEX0JBQ0tCVUZGRVJDT1VOVDsKLQkJZGRzZC5kZHNDYXBzLmR3Q2FwcyAmPSB+KEREU0NBUFNfQ09NUExFWHxERFNDQVBTX0ZMSVApOwotCQlkZHNkLmR3QmFja0J1ZmZlckNvdW50ID0gMDsKLQkJcmVzdWx0ID0gSURpcmVjdERyYXcyX0NyZWF0ZVN1cmZhY2UoZGRyYXcyLAotCQkJCQkJJmRkc2QsICZkZF9zdXJmYWNlMSwgTlVMTCk7IAotCX0KLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhdzI6OkNyZWF0ZVN1cmZhY2UoUFJJTUFSWSkiLCByZXN1bHQpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZShkZF9zdXJmYWNlMSwKLQkJCSZJSURfSURpcmVjdERyYXdTdXJmYWNlMywgKExQVk9JRCAqKSZTRExfcHJpbWFyeSk7Ci0JaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7Ci0JCVNldEREZXJyb3IoIkRpcmVjdERyYXdTdXJmYWNlOjpRdWVyeUludGVyZmFjZSIsIHJlc3VsdCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoZGRfc3VyZmFjZTEpOwotCi0JLyogR2V0IHRoZSBmb3JtYXQgb2YgdGhlIHByaW1hcnkgRGlyZWN0RHJhdyBzdXJmYWNlICovCi0JU0RMX21lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKLQlkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKLQlkZHNkLmR3RmxhZ3MgPSBERFNEX1BJWEVMRk9STUFUfEREU0RfQ0FQUzsKLQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX0dldFN1cmZhY2VEZXNjKFNETF9wcmltYXJ5LCAmZGRzZCk7Ci0JaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7Ci0JCVNldEREZXJyb3IoIkRpcmVjdERyYXdTdXJmYWNlOjpHZXRTdXJmYWNlRGVzYyIsIHJlc3VsdCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JaWYgKCAhIChkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzJkREUEZfUkdCKSApIHsKLQkJU0RMX1NldEVycm9yKCJQcmltYXJ5IEREUkFXIHN1cmZhY2UgaXMgbm90IFJHQiBmb3JtYXQiKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIEZyZWUgb2xkIHBhbGV0dGUgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgd2UncmUgaW4gOC1iaXQgbW9kZSAqLwotCWlmICggU0RMX3BhbGV0dGUgIT0gTlVMTCApIHsKLQkJSURpcmVjdERyYXdQYWxldHRlX1JlbGVhc2UoU0RMX3BhbGV0dGUpOwotCQlTRExfcGFsZXR0ZSA9IE5VTEw7Ci0JfQotI2lmIGRlZmluZWQoTk9OQU1FTEVTU1VOSU9OKQotCWlmICggZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSA4ICkgewotI2Vsc2UKLQlpZiAoIGRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3UkdCQml0Q291bnQgPT0gOCApIHsKLSNlbmRpZgotCQlpbnQgaTsKLQotCQlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKLQkJCS8qIFdlIGhhdmUgYWNjZXNzIHRvIHRoZSBlbnRpcmUgcGFsZXR0ZSAqLwotCQkJZm9yICggaT0wOyBpPDI1NjsgKytpICkgewotCQkJCVNETF9jb2xvcnNbaV0ucGVGbGFncyA9Ci0JCQkJCQkoUENfTk9DT0xMQVBTRXxQQ19SRVNFUlZFRCk7Ci0JCQkJU0RMX2NvbG9yc1tpXS5wZVJlZCA9IDA7Ci0JCQkJU0RMX2NvbG9yc1tpXS5wZUdyZWVuID0gMDsKLQkJCQlTRExfY29sb3JzW2ldLnBlQmx1ZSA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBGaXJzdCAxMCBjb2xvcnMgYXJlIHJlc2VydmVkIGJ5IFdpbmRvd3MgKi8KLQkJCWZvciAoIGk9MDsgaTwxMDsgKytpICkgewotCQkJCVNETF9jb2xvcnNbaV0ucGVGbGFncyA9IFBDX0VYUExJQ0lUOwotCQkJCVNETF9jb2xvcnNbaV0ucGVSZWQgPSBpOwotCQkJCVNETF9jb2xvcnNbaV0ucGVHcmVlbiA9IDA7Ci0JCQkJU0RMX2NvbG9yc1tpXS5wZUJsdWUgPSAwOwotCQkJfQotCQkJZm9yICggaT0xMDsgaTwoMTArMjM2KTsgKytpICkgewotCQkJCVNETF9jb2xvcnNbaV0ucGVGbGFncyA9IFBDX05PQ09MTEFQU0U7Ci0JCQkJU0RMX2NvbG9yc1tpXS5wZVJlZCA9IDA7Ci0JCQkJU0RMX2NvbG9yc1tpXS5wZUdyZWVuID0gMDsKLQkJCQlTRExfY29sb3JzW2ldLnBlQmx1ZSA9IDA7Ci0JCQl9Ci0JCQkvKiBMYXN0IDEwIGNvbG9ycyBhcmUgcmVzZXJ2ZWQgYnkgV2luZG93cyAqLwotCQkJZm9yICggaT0yNDY7IGk8MjU2OyArK2kgKSB7Ci0JCQkJU0RMX2NvbG9yc1tpXS5wZUZsYWdzID0gUENfRVhQTElDSVQ7Ci0JCQkJU0RMX2NvbG9yc1tpXS5wZVJlZCA9IGk7Ci0JCQkJU0RMX2NvbG9yc1tpXS5wZUdyZWVuID0gMDsKLQkJCQlTRExfY29sb3JzW2ldLnBlQmx1ZSA9IDA7Ci0JCQl9Ci0JCX0KLQkJcmVzdWx0ID0gSURpcmVjdERyYXcyX0NyZWF0ZVBhbGV0dGUoZGRyYXcyLAotCQkgICAgIAkJCShERFBDQVBTXzhCSVR8RERQQ0FQU19BTExPVzI1NiksCi0JCQkJCQlTRExfY29sb3JzLCAmU0RMX3BhbGV0dGUsIE5VTEwpOwotCQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJCVNldEREZXJyb3IoIkRpcmVjdERyYXcyOjpDcmVhdGVQYWxldHRlIiwgcmVzdWx0KTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX1NldFBhbGV0dGUoU0RMX3ByaW1hcnksCi0JCQkJCQkJCVNETF9wYWxldHRlKTsKLQkJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7Ci0JCQlTZXRERGVycm9yKCJEaXJlY3REcmF3U3VyZmFjZTM6OlNldFBhbGV0dGUiLCByZXN1bHQpOwotCQkJcmV0dXJuKE5VTEwpOwotCQl9Ci0JfQotCi0JLyogQ3JlYXRlIG91ciB2aWRlbyBzdXJmYWNlIHVzaW5nIHRoZSBzYW1lIHBpeGVsIGZvcm1hdCAqLwotCXZpZGVvID0gY3VycmVudDsKLQlpZiAoICh3aWR0aCAhPSB2aWRlby0+dykgfHwgKGhlaWdodCAhPSB2aWRlby0+aCkKLQkJCXx8ICh2aWRlby0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gCi0jaWYgZGVmaW5lZChOT05BTUVMRVNTVU5JT04pCi0JCQkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCkgKSB7Ci0jZWxzZQotCQkJCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3UkdCQml0Q291bnQpICkgewotI2VuZGlmCi0JCVNETF9GcmVlU3VyZmFjZSh2aWRlbyk7Ci0JCXZpZGVvID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwgMCwgMCwKLSNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKLQkJCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50LAotCQkJCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC51Mi5kd1JCaXRNYXNrLAotCQkJCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC51My5kd0dCaXRNYXNrLAotCQkJCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC51NC5kd0JCaXRNYXNrLAotI2Vsc2UKLQkJCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JHQkJpdENvdW50LAotCQkJCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JCaXRNYXNrLAotCQkJCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0dCaXRNYXNrLAotCQkJCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0JCaXRNYXNrLAotI2VuZGlmCi0JCQkJCQkJCTApOwotCQlpZiAoIHZpZGVvID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCQlwcmV2X3cgPSB2aWRlby0+dzsKLQkJcHJldl9oID0gdmlkZW8tPmg7Ci0JCXZpZGVvLT53ID0gd2lkdGg7Ci0JCXZpZGVvLT5oID0gaGVpZ2h0OwotCQl2aWRlby0+cGl0Y2ggPSAwOwotCX0KLQl2aWRlby0+ZmxhZ3MgPSAwOwkvKiBDbGVhciBmbGFncyAqLwotCi0JLyogSWYgbm90IGZ1bGxzY3JlZW4sIGxvY2tpbmcgaXMgcG9zc2libGUsIGJ1dCBpdCBkb2Vzbid0IGRvIHdoYXQgCi0JICAgdGhlIGNhbGxlciByZWFsbHkgZXhwZWN0cyAtLSBpZiB0aGUgbG9ja2VkIHN1cmZhY2UgaXMgd3JpdHRlbiB0bywKLQkgICB0aGUgYXBwcm9wcmlhdGUgcG9ydGlvbiBvZiB0aGUgZW50aXJlIHNjcmVlbiBpcyBtb2RpZmllZCwgbm90IAotCSAgIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3csIGFzIHdlIHdvdWxkIGxpa2UuCi0JICAgTm90ZSB0aGF0IGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIHdyaXRlIGRpcmVjdGx5IHRvIGRpc3BsYXkKLQkgICBtZW1vcnksIGJ1dCB0aGUgYXBwbGljYXRpb24gbXVzdCByZXNwZWN0IHRoZSBjbGlwIGxpc3Qgb2YKLQkgICB0aGUgc3VyZmFjZS4gIFRoZXJlIG1pZ2h0IGJlIHNvbWUgb2RkIHRpbWluZyBpbnRlcmFjdGlvbnMKLQkgICBpbnZvbHZpbmcgY2xpcCBsaXN0IHVwZGF0ZXMgYW5kIGJhY2tncm91bmQgcmVmcmVzaGluZyBhcwotCSAgIFdpbmRvd3MgbW92ZXMgb3RoZXIgd2luZG93cyBhY3Jvc3Mgb3VyIHdpbmRvdy4KLQkgICBXZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCB0aGlzLCBldmVuIHRob3VnaCBpdCBtaWdodCBiZSBhCi0JICAgZ29vZCBpZGVhIHNpbmNlIEJlT1MgaGFzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJEaXJlY3RXaW5kb3cKLQkgICB0aGF0IGRvZXMgdGhlIHNhbWUgdGhpbmcuICBUaGlzIHdvdWxkIGJlIG1vc3QgdXNlZnVsIGZvcgotCSAgIGFwcGxpY2F0aW9ucyB0aGF0IGRvIGNvbXBsZXRlIHNjcmVlbiB1cGRhdGVzIGV2ZXJ5IGZyYW1lLgotCSAgICAtLSBGaXhtZT8KLQkqLwotCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICE9IFNETF9GVUxMU0NSRUVOICkgewotCQkvKiBOZWNlc3NhcnkgaWYgd2UncmUgZ29pbmcgZnJvbSBmdWxsc2NyZWVuIHRvIHdpbmRvdyAqLwotCQlpZiAoIHZpZGVvLT5waXhlbHMgPT0gTlVMTCApIHsKLQkJCXZpZGVvLT5waXRjaCA9ICh3aWR0aCp2aWRlby0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKTsKLQkJCS8qIFBpdGNoIG5lZWRzIHRvIGJlIFFXT1JEICg4LWJ5dGUpIGFsaWduZWQgKi8KLQkJCXZpZGVvLT5waXRjaCA9ICh2aWRlby0+cGl0Y2ggKyA3KSAmIH43OwotCQkJdmlkZW8tPnBpeGVscyA9ICh2b2lkICopU0RMX21hbGxvYyh2aWRlby0+aCp2aWRlby0+cGl0Y2gpOwotCQkJaWYgKCB2aWRlby0+cGl4ZWxzID09IE5VTEwgKSB7Ci0JCQkJaWYgKCB2aWRlbyAhPSBjdXJyZW50ICkgewotCQkJCQlTRExfRnJlZVN1cmZhY2UodmlkZW8pOwotCQkJCX0KLQkJCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCQlyZXR1cm4oTlVMTCk7Ci0JCQl9Ci0JCX0KLQkJZGRfc3VyZmFjZTMgPSBOVUxMOwotI2lmIDAgLyogRklYTUU6IGVuYWJsZSB0aGlzIHdoZW4gU0RMIGNvbnNpc3RlbnRseSByZXBvcnRzIGxvc3Qgc3VyZmFjZXMgKi8KLQkJaWYgKCAoZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgewotCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9IV1NVUkZBQ0U7Ci0JCX0gZWxzZSB7Ci0JCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX1NXU1VSRkFDRTsKLQkJfQotI2Vsc2UKLQkJdmlkZW8tPmZsYWdzIHw9IFNETF9TV1NVUkZBQ0U7Ci0jZW5kaWYKLQkJaWYgKCAoZmxhZ3MgJiBTRExfUkVTSVpBQkxFKSAmJiAhKGZsYWdzICYgU0RMX05PRlJBTUUpICkgewotCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9SRVNJWkFCTEU7Ci0JCX0KLQkJaWYgKCBmbGFncyAmIFNETF9OT0ZSQU1FICkgewotCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9OT0ZSQU1FOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogTmVjZXNzYXJ5IGlmIHdlJ3JlIGdvaW5nIGZyb20gd2luZG93IHRvIGZ1bGxzY3JlZW4gKi8KLQkJaWYgKCB2aWRlby0+cGl4ZWxzICE9IE5VTEwgKSB7Ci0JCQlTRExfZnJlZSh2aWRlby0+cGl4ZWxzKTsKLQkJCXZpZGVvLT5waXhlbHMgPSBOVUxMOwotCQl9Ci0JCWRkX3N1cmZhY2UzID0gU0RMX3ByaW1hcnk7Ci0JCXZpZGVvLT5mbGFncyB8PSBTRExfSFdTVVJGQUNFOwotCX0KLQotCS8qIFNlZSBpZiB0aGUgcHJpbWFyeSBzdXJmYWNlIGhhcyBkb3VibGUtYnVmZmVyaW5nIGVuYWJsZWQgKi8KLQlpZiAoIChkZHNkLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19GTElQKSA9PSBERFNDQVBTX0ZMSVAgKSB7Ci0JCXZpZGVvLT5mbGFncyB8PSBTRExfRE9VQkxFQlVGOwotCX0KLQotCS8qIEFsbG9jYXRlIHRoZSBTREwgc3VyZmFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgc3VyZmFjZSAqLwotCWlmICggRFg1X0FsbG9jRERTdXJmYWNlKHRoaXMsIHZpZGVvLCBkZF9zdXJmYWNlMywKLQkgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZmxhZ3MmU0RMX0hXU1VSRkFDRSkgPCAwICkgewotCQlpZiAoIHZpZGVvICE9IGN1cnJlbnQgKSB7Ci0JCQlTRExfRnJlZVN1cmZhY2UodmlkZW8pOwotCQl9Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBVc2UgdGhlIGFwcHJvcHJpYXRlIGJsaXR0aW5nIGZ1bmN0aW9uICovCi0JaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCXZpZGVvLT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKLQkJaWYgKCB2aWRlby0+Zm9ybWF0LT5wYWxldHRlICE9IE5VTEwgKSB7Ci0JCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKLQkJfQotCQl0aGlzLT5VcGRhdGVSZWN0cyA9IERYNV9EaXJlY3RVcGRhdGU7Ci0JfSBlbHNlIHsKLQkJdGhpcy0+VXBkYXRlUmVjdHMgPSBEWDVfV2luZG93VXBkYXRlOwotCX0KLQotCS8qIE1ha2Ugb3VyIHdpbmRvdyB0aGUgcHJvcGVyIHNpemUsIHNldCB0aGUgY2xpcHBlciwgdGhlbiBzaG93IGl0ICovCi0JaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgIT0gU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCS8qIENyZWF0ZSBhbmQgc2V0IGEgY2xpcHBlciBvbiBvdXIgcHJpbWFyeSBzdXJmYWNlICovCi0JCWlmICggU0RMX2NsaXBwZXIgPT0gTlVMTCApIHsKLQkJCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9DcmVhdGVDbGlwcGVyKGRkcmF3MiwKLQkJCQkJCQkwLCAmU0RMX2NsaXBwZXIsIE5VTEwpOwotCQkJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7Ci0JCQkJaWYgKCB2aWRlbyAhPSBjdXJyZW50ICkgewotCQkJCQlTRExfRnJlZVN1cmZhY2UodmlkZW8pOwotCQkJCX0KLQkJCQlTZXRERGVycm9yKCJEaXJlY3REcmF3Mjo6Q3JlYXRlQ2xpcHBlciIscmVzdWx0KTsKLQkJCQlyZXR1cm4oTlVMTCk7Ci0JCQl9Ci0JCX0KLQkJcmVzdWx0ID0gSURpcmVjdERyYXdDbGlwcGVyX1NldEhXbmQoU0RMX2NsaXBwZXIsIDAsIFNETF9XaW5kb3cpOwotCQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJCWlmICggdmlkZW8gIT0gY3VycmVudCApIHsKLQkJCQlTRExfRnJlZVN1cmZhY2UodmlkZW8pOwotCQkJfQotCQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd0NsaXBwZXI6OlNldEhXbmQiLCByZXN1bHQpOwotCQkJcmV0dXJuKE5VTEwpOwotCQl9Ci0JCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfU2V0Q2xpcHBlcihTRExfcHJpbWFyeSwKLQkJCQkJCQkJU0RMX2NsaXBwZXIpOwotCQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJCWlmICggdmlkZW8gIT0gY3VycmVudCApIHsKLQkJCQlTRExfRnJlZVN1cmZhY2UodmlkZW8pOwotCQkJfQotCQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpTZXRDbGlwcGVyIiwgcmVzdWx0KTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCi0JCS8qIFJlc2l6ZSB0aGUgd2luZG93IChjb3BpZWQgZnJvbSBTREwgV2luRElCIGRyaXZlcikgKi8KLQkJaWYgKCAhU0RMX3dpbmRvd2lkICYmICFJc1pvb21lZChTRExfV2luZG93KSApIHsKLQkJCVJFQ1QgYm91bmRzOwotCQkJaW50ICB4LCB5OwotCQkJVUlOVCBzd3BfZmxhZ3M7Ci0JCQljb25zdCBjaGFyICp3aW5kb3cgPSBOVUxMOwotCQkJY29uc3QgY2hhciAqY2VudGVyID0gTlVMTDsKLQotCQkJaWYgKCB2aWRlby0+dyAhPSBwcmV2X3cgfHwgdmlkZW8tPmggIT0gcHJldl9oICkgewotCQkJCXdpbmRvdyA9IFNETF9nZXRlbnYoIlNETF9WSURFT19XSU5ET1dfUE9TIik7Ci0JCQkJY2VudGVyID0gU0RMX2dldGVudigiU0RMX1ZJREVPX0NFTlRFUkVEIik7Ci0JCQkJaWYgKCB3aW5kb3cgKSB7Ci0JCQkJCWlmICggU0RMX3NzY2FuZih3aW5kb3csICIlZCwlZCIsICZ4LCAmeSkgPT0gMiApIHsKLQkJCQkJCVNETF93aW5kb3dYID0geDsKLQkJCQkJCVNETF93aW5kb3dZID0geTsKLQkJCQkJfQotCQkJCQlpZiAoIFNETF9zdHJjbXAod2luZG93LCAiY2VudGVyIikgPT0gMCApIHsKLQkJCQkJCWNlbnRlciA9IHdpbmRvdzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN3cF9mbGFncyA9IFNXUF9OT0NPUFlCSVRTOwotCi0JCQlib3VuZHMubGVmdCA9IFNETF93aW5kb3dYOwotCQkJYm91bmRzLnRvcCA9IFNETF93aW5kb3dZOwotCQkJYm91bmRzLnJpZ2h0ID0gU0RMX3dpbmRvd1grdmlkZW8tPnc7Ci0JCQlib3VuZHMuYm90dG9tID0gU0RMX3dpbmRvd1krdmlkZW8tPmg7Ci0JCQlBZGp1c3RXaW5kb3dSZWN0RXgoJmJvdW5kcywgR2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUpLCAoR2V0TWVudShTRExfV2luZG93KSAhPSBOVUxMKSwgMCk7Ci0JCQl3aWR0aCA9IGJvdW5kcy5yaWdodC1ib3VuZHMubGVmdDsKLQkJCWhlaWdodCA9IGJvdW5kcy5ib3R0b20tYm91bmRzLnRvcDsKLQkJCWlmICggY2VudGVyICkgewotCQkJCXggPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTiktd2lkdGgpLzI7Ci0JCQkJeSA9IChHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKS1oZWlnaHQpLzI7Ci0JCQl9IGVsc2UgaWYgKCBTRExfd2luZG93WCB8fCBTRExfd2luZG93WSB8fCB3aW5kb3cgKSB7Ci0JCQkJeCA9IGJvdW5kcy5sZWZ0OwotCQkJCXkgPSBib3VuZHMudG9wOwotCQkJfSBlbHNlIHsKLQkJCQl4ID0geSA9IC0xOwotCQkJCXN3cF9mbGFncyB8PSBTV1BfTk9NT1ZFOwotCQkJfQotCQkJU2V0V2luZG93UG9zKFNETF9XaW5kb3csIEhXTkRfTk9UT1BNT1NULCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzd3BfZmxhZ3MpOwotCQkJU0RMX3dpbmRvd1ggPSBTRExfYm91bmRzLmxlZnQ7Ci0JCQlTRExfd2luZG93WSA9IFNETF9ib3VuZHMudG9wOwotCQl9Ci0KLQl9Ci0JU2hvd1dpbmRvdyhTRExfV2luZG93LCBTV19TSE9XKTsKLQlTZXRGb3JlZ3JvdW5kV2luZG93KFNETF9XaW5kb3cpOwotCVNETF9yZXNpemluZyA9IDA7Ci0KLQkvKiBKQyAxNCBNYXIgMjAwNgotCQlGbHVzaCB0aGUgbWVzc2FnZSBsb29wIG9yIHRoaXMgY2FuIGNhdXNlIGJpZyBwcm9ibGVtcyBsYXRlcgotCQlFc3BlY2lhbGx5IGlmIHRoZSB1c2VyIGRlY2lkZXMgdG8gdXNlIGRpYWxvZyBib3hlcyBvciBhc3NlcnQoKSEKLQkqLwotCVdJTl9GbHVzaE1lc3NhZ2VRdWV1ZSgpOwotCi0JLyogV2UncmUgbGl2ZSEgKi8KLQlyZXR1cm4odmlkZW8pOwotfQotCi1zdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgewotCUxQRElSRUNURFJBV1NVUkZBQ0UzIGRkX3N1cmZhY2U7Ci0JTFBESVJFQ1REUkFXU1VSRkFDRTMgZGRfd3JpdGVidWY7Ci19OwotCi1zdGF0aWMgaW50IERYNV9BbGxvY0REU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIAotCQkJCUxQRElSRUNURFJBV1NVUkZBQ0UzIHJlcXVlc3RlZCwgVWludDMyIGZsYWcpCi17Ci0JTFBESVJFQ1REUkFXU1VSRkFDRSAgZGRfc3VyZmFjZTE7Ci0JTFBESVJFQ1REUkFXU1VSRkFDRTMgZGRfc3VyZmFjZTM7Ci0JRERTVVJGQUNFREVTQyBkZHNkOwotCUhSRVNVTFQgcmVzdWx0OwotCi0JLyogQ2xlYXIgdGhlIGhhcmR3YXJlIGZsYWcsIGluIGNhc2Ugd2UgZmFpbCAqLwotCXN1cmZhY2UtPmZsYWdzICY9IH5mbGFnOwotCi0JLyogQWxsb2NhdGUgdGhlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBkYXRhICovCi0Jc3VyZmFjZS0+aHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX2h3ZGF0YSAqKQotCQkJCQlTRExfbWFsbG9jKHNpemVvZigqc3VyZmFjZS0+aHdkYXRhKSk7Ci0JaWYgKCBzdXJmYWNlLT5od2RhdGEgPT0gTlVMTCApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCWRkX3N1cmZhY2UzID0gTlVMTDsKLQotCS8qIFNldCB1cCB0aGUgc3VyZmFjZSBkZXNjcmlwdGlvbiAqLwotCVNETF9tZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7Ci0JZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7Ci0JZGRzZC5kd0ZsYWdzID0gKEREU0RfV0lEVEh8RERTRF9IRUlHSFR8RERTRF9DQVBTfAotCQkJCQlERFNEX1BJVENIfEREU0RfUElYRUxGT1JNQVQpOwotCWRkc2QuZHdXaWR0aCA9IHN1cmZhY2UtPnc7Ci0JZGRzZC5kd0hlaWdodD0gc3VyZmFjZS0+aDsKLSNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKLQlkZHNkLnUxLmxQaXRjaCA9IHN1cmZhY2UtPnBpdGNoOwotI2Vsc2UKLQlkZHNkLmxQaXRjaCA9IHN1cmZhY2UtPnBpdGNoOwotI2VuZGlmCi0JaWYgKCAoZmxhZyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UgKSB7Ci0JCWRkc2QuZGRzQ2Fwcy5kd0NhcHMgPQotCQkJCShERFNDQVBTX09GRlNDUkVFTlBMQUlOfEREU0NBUFNfVklERU9NRU1PUlkpOwotCX0gZWxzZSB7Ci0JCWRkc2QuZGRzQ2Fwcy5kd0NhcHMgPQotCQkJCShERFNDQVBTX09GRlNDUkVFTlBMQUlOfEREU0NBUFNfU1lTVEVNTUVNT1JZKTsKLQl9Ci0JZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKGRkc2QuZGRwZlBpeGVsRm9ybWF0KTsKLQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID0gRERQRl9SR0I7Ci0JaWYgKCBzdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUgKSB7Ci0JCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgfD0gRERQRl9QQUxFVFRFSU5ERVhFRDg7Ci0JfQotI2lmIGRlZmluZWQoTk9OQU1FTEVTU1VOSU9OKQotCWRkc2QuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgPSBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKLQlkZHNkLmRkcGZQaXhlbEZvcm1hdC51Mi5kd1JCaXRNYXNrID0gc3VyZmFjZS0+Zm9ybWF0LT5SbWFzazsKLQlkZHNkLmRkcGZQaXhlbEZvcm1hdC51My5kd0dCaXRNYXNrID0gc3VyZmFjZS0+Zm9ybWF0LT5HbWFzazsKLQlkZHNkLmRkcGZQaXhlbEZvcm1hdC51NC5kd0JCaXRNYXNrID0gc3VyZmFjZS0+Zm9ybWF0LT5CbWFzazsKLSNlbHNlCi0JZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdSR0JCaXRDb3VudCA9IHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsOwotCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3UkJpdE1hc2sgPSBzdXJmYWNlLT5mb3JtYXQtPlJtYXNrOwotCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3R0JpdE1hc2sgPSBzdXJmYWNlLT5mb3JtYXQtPkdtYXNrOwotCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3QkJpdE1hc2sgPSBzdXJmYWNlLT5mb3JtYXQtPkJtYXNrOwotI2VuZGlmCi0KLQkvKiBDcmVhdGUgdGhlIERpcmVjdERyYXcgdmlkZW8gc3VyZmFjZSAqLwotCWlmICggcmVxdWVzdGVkICE9IE5VTEwgKSB7Ci0JCWRkX3N1cmZhY2UzID0gcmVxdWVzdGVkOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlKGRkcmF3MiwKLQkJCQkJCSZkZHNkLCAmZGRfc3VyZmFjZTEsIE5VTEwpOyAKLQkJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7Ci0JCQlTZXRERGVycm9yKCJEaXJlY3REcmF3Mjo6Q3JlYXRlU3VyZmFjZSIsIHJlc3VsdCk7Ci0JCQlnb3RvIGVycm9yX2VuZDsKLQkJfQotCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoZGRfc3VyZmFjZTEsCi0JCQkmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTMsIChMUFZPSUQgKikmZGRfc3VyZmFjZTMpOwotCQlJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShkZF9zdXJmYWNlMSk7Ci0JCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2U6OlF1ZXJ5SW50ZXJmYWNlIiwgcmVzdWx0KTsKLQkJCWdvdG8gZXJyb3JfZW5kOwotCQl9Ci0JfQotCi0JaWYgKCAoZmxhZyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UgKSB7Ci0JCS8qIENoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBzdXJmYWNlIGFjdHVhbGx5IGVuZGVkIHVwCi0JCSAgIGluIHZpZGVvIG1lbW9yeSwgYW5kIGZhaWwgaWYgbm90LiAgV2UgZXhwZWN0IHRoZQotCQkgICBzdXJmYWNlcyB3ZSBjcmVhdGUgaGVyZSB0byBhY3R1YWxseSBiZSBpbiBoYXJkd2FyZSEKLQkJKi8KLQkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19HZXRDYXBzKGRkX3N1cmZhY2UzLCZkZHNkLmRkc0NhcHMpOwotCQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJCVNldEREZXJyb3IoIkRpcmVjdERyYXdTdXJmYWNlMzo6R2V0Q2FwcyIsIHJlc3VsdCk7Ci0JCQlnb3RvIGVycm9yX2VuZDsKLQkJfQotCQlpZiAoIChkZHNkLmRkc0NhcHMuZHdDYXBzJkREU0NBUFNfVklERU9NRU1PUlkpICE9Ci0JCQkJCQkJRERTQ0FQU19WSURFT01FTU9SWSApIHsKLQkJCVNETF9TZXRFcnJvcigiTm8gcm9vbSBpbiB2aWRlbyBtZW1vcnkiKTsKLQkJCWdvdG8gZXJyb3JfZW5kOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogVHJ5IHRvIGhvb2sgb3VyIHN1cmZhY2UgbWVtb3J5ICovCi0JCWRkc2QuZHdGbGFncyA9IEREU0RfTFBTVVJGQUNFOwotCQlkZHNkLmxwU3VyZmFjZSA9IHN1cmZhY2UtPnBpeGVsczsKLQkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19TZXRTdXJmYWNlRGVzYyhkZF9zdXJmYWNlMywKLQkJCQkJCQkJJmRkc2QsIDApOwotCQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJCVNldEREZXJyb3IoIkRpcmVjdERyYXcyOjpTZXRTdXJmYWNlRGVzYyIsIHJlc3VsdCk7Ci0JCQlnb3RvIGVycm9yX2VuZDsKLQkJfQotCQotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGUgc3VyZmFjZSBmb3JtYXQgd2FzIHNldCBwcm9wZXJseSAqLwotCVNETF9tZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7Ci0JZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7Ci0JcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19Mb2NrKGRkX3N1cmZhY2UzLCBOVUxMLAotCQkmZGRzZCwgKERETE9DS19OT1NZU0xPQ0t8RERMT0NLX1dBSVQpLCBOVUxMKTsKLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpMb2NrIiwgcmVzdWx0KTsKLQkJZ290byBlcnJvcl9lbmQ7Ci0JfQotCUlEaXJlY3REcmF3U3VyZmFjZTNfVW5sb2NrKGRkX3N1cmZhY2UzLCBOVUxMKTsKLQotCWlmICggKGZsYWcgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfU1dTVVJGQUNFICkgewotCQlpZiAoIGRkc2QubHBTdXJmYWNlICE9IHN1cmZhY2UtPnBpeGVscyApIHsKLQkJCVNETF9TZXRFcnJvcigiRERyYXcgZGlkbid0IHVzZSBTREwgc3VyZmFjZSBtZW1vcnkiKTsKLQkJCWdvdG8gZXJyb3JfZW5kOwotCQl9Ci0JCWlmICgKLSNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKLQkJCWRkc2QudTEubFBpdGNoCi0jZWxzZQotCQkJZGRzZC5sUGl0Y2gKLSNlbmRpZgotCQkJCSAhPSAoTE9ORylzdXJmYWNlLT5waXRjaCApIHsKLQkJCVNETF9TZXRFcnJvcigiRERyYXcgY3JlYXRlZCBzdXJmYWNlIHdpdGggd3JvbmcgcGl0Y2giKTsKLQkJCWdvdG8gZXJyb3JfZW5kOwotCQl9Ci0JfSBlbHNlIHsKLSNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKLQkJc3VyZmFjZS0+cGl0Y2ggPSAoVWludDE2KWRkc2QudTEubFBpdGNoOwotI2Vsc2UKLQkJc3VyZmFjZS0+cGl0Y2ggPSAoVWludDE2KWRkc2QubFBpdGNoOwotI2VuZGlmCi0JfQotI2lmIGRlZmluZWQoTk9OQU1FTEVTU1VOSU9OKQotCWlmICggKGRkc2QuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgIT0gCi0JCQkJCXN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSB8fAotCSAgICAgKGRkc2QuZGRwZlBpeGVsRm9ybWF0LnUyLmR3UkJpdE1hc2sgIT0gc3VyZmFjZS0+Zm9ybWF0LT5SbWFzaykgfHwKLQkgICAgIChkZHNkLmRkcGZQaXhlbEZvcm1hdC51My5kd0dCaXRNYXNrICE9IHN1cmZhY2UtPmZvcm1hdC0+R21hc2spIHx8Ci0JICAgICAoZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdCQml0TWFzayAhPSBzdXJmYWNlLT5mb3JtYXQtPkJtYXNrKSApewotI2Vsc2UKLQlpZiAoIChkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JHQkJpdENvdW50ICE9IAotCQkJCQlzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCkgfHwKLQkgICAgIChkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JCaXRNYXNrICE9IHN1cmZhY2UtPmZvcm1hdC0+Um1hc2spIHx8Ci0JICAgICAoZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdHQml0TWFzayAhPSBzdXJmYWNlLT5mb3JtYXQtPkdtYXNrKSB8fAotCSAgICAgKGRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3QkJpdE1hc2sgIT0gc3VyZmFjZS0+Zm9ybWF0LT5CbWFzaykgKXsKLSNlbmRpZgotCQlTRExfU2V0RXJyb3IoIkREcmF3IGRpZG4ndCB1c2UgU0RMIHN1cmZhY2UgZGVzY3JpcHRpb24iKTsKLQkJZ290byBlcnJvcl9lbmQ7Ci0JfQotCWlmICggKGRkc2QuZHdXaWR0aCAhPSAoRFdPUkQpc3VyZmFjZS0+dykgfHwKLQkJKGRkc2QuZHdIZWlnaHQgIT0gKERXT1JEKXN1cmZhY2UtPmgpICkgewotCQlTRExfU2V0RXJyb3IoIkREcmF3IGNyZWF0ZWQgc3VyZmFjZSB3aXRoIHdyb25nIHNpemUiKTsKLQkJZ290byBlcnJvcl9lbmQ7Ci0JfQotCi0JLyogU2V0IHRoZSBzdXJmYWNlIHByaXZhdGUgZGF0YSAqLwotCXN1cmZhY2UtPmZsYWdzIHw9IGZsYWc7Ci0Jc3VyZmFjZS0+aHdkYXRhLT5kZF9zdXJmYWNlID0gZGRfc3VyZmFjZTM7Ci0JaWYgKCAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGICkgewotCQlMUERJUkVDVERSQVdTVVJGQUNFMyBkZF93cml0ZWJ1ZjsKLQotCQlkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19CQUNLQlVGRkVSOwotCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX0dldEF0dGFjaGVkU3VyZmFjZShkZF9zdXJmYWNlMywKLQkJCQkJCSZkZHNkLmRkc0NhcHMsICZkZF93cml0ZWJ1Zik7Ci0JCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpHZXRBdHRhY2hlZFN1cmZhY2UiLAotCQkJCQkJCQlyZXN1bHQpOwotCQl9IGVsc2UgewotCQkJZGRfc3VyZmFjZTMgPSBkZF93cml0ZWJ1ZjsKLQkJfQotCX0KLQlzdXJmYWNlLT5od2RhdGEtPmRkX3dyaXRlYnVmID0gZGRfc3VyZmFjZTM7Ci0KLQkvKiBXZSdyZSByZWFkeSB0byBnbyEgKi8KLQlyZXR1cm4oMCk7Ci0KLQkvKiBPa2F5LCBzbyBnb3RvJ3MgYXJlIGNoZWVzeSwgYnV0IHRoZXJlIGFyZSBzbyBtYW55IHBvc3NpYmxlCi0JICAgZXJyb3JzIGluIHRoaXMgZnVuY3Rpb24sIGFuZCB0aGUgY2xlYW51cCBpcyB0aGUgc2FtZSBpbiAKLQkgICBldmVyeSBzaW5nbGUgY2FzZS4gIElzIHRoZXJlIGEgYmV0dGVyIHdheSwgb3RoZXIgdGhhbiBkZWVwbHkKLQkgICBuZXN0aW5nIHRoZSBjb2RlPwotCSovCi1lcnJvcl9lbmQ6Ci0JaWYgKCAoZGRfc3VyZmFjZTMgIT0gTlVMTCkgJiYgKGRkX3N1cmZhY2UzICE9IHJlcXVlc3RlZCkgKSB7Ci0JCUlEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGRkX3N1cmZhY2UzKTsKLQl9Ci0JU0RMX2ZyZWUoc3VyZmFjZS0+aHdkYXRhKTsKLQlzdXJmYWNlLT5od2RhdGEgPSBOVUxMOwotCXJldHVybigtMSk7Ci19Ci0KLXN0YXRpYyBpbnQgRFg1X0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQkvKiBERHJhdyBsaW1pdGF0aW9uIC0tIHlvdSBuZWVkIHRvIHNldCBjb29wZXJhdGl2ZSBsZXZlbCBmaXJzdCAqLwotCWlmICggU0RMX3ByaW1hcnkgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJZb3UgbXVzdCBzZXQgYSBub24tR0wgdmlkZW8gbW9kZSBmaXJzdCIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oRFg1X0FsbG9jRERTdXJmYWNlKHRoaXMsIHN1cmZhY2UsIE5VTEwsIFNETF9IV1NVUkZBQ0UpKTsKLX0KLQotI2lmZGVmIEREUkFXX0RFQlVHCi12b2lkIFByaW50U3VyZmFjZShjaGFyICp0aXRsZSwgTFBESVJFQ1REUkFXU1VSRkFDRTMgc3VyZmFjZSwgVWludDMyIGZsYWdzKQotewotCUREU1VSRkFDRURFU0MgZGRzZDsKLQotCS8qIExvY2sgYW5kIGxvYWQhICovCi0JU0RMX21lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKLQlkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKLQlpZiAoIElEaXJlY3REcmF3U3VyZmFjZTNfTG9jayhzdXJmYWNlLCBOVUxMLCAmZGRzZCwKLQkJCShERExPQ0tfTk9TWVNMT0NLfERETE9DS19XQUlUKSwgTlVMTCkgIT0gRERfT0sgKSB7Ci0JCXJldHVybjsKLQl9Ci0JSURpcmVjdERyYXdTdXJmYWNlM19VbmxvY2soc3VyZmFjZSwgTlVMTCk7Ci0JCi0JZnByaW50ZihzdGRlcnIsICIlczpcbiIsIHRpdGxlKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0U2l6ZTogJWR4JWQgaW4gJXMgYXQgJWxkIGJwcCAocGl0Y2ggPSAlbGQpXG4iLAotCQlkZHNkLmR3V2lkdGgsIGRkc2QuZHdIZWlnaHQsCi0JCShmbGFncyAmIFNETF9IV1NVUkZBQ0UpID8gImhhcmR3YXJlIiA6ICJzb2Z0d2FyZSIsCi0jaWYgZGVmaW5lZChOT05BTUVMRVNTVU5JT04pCi0JCWRkc2QuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQsIGRkc2QudTEubFBpdGNoKTsKLSNlbHNlCi0JCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3UkdCQml0Q291bnQsIGRkc2QubFBpdGNoKTsKLSNlbmRpZgotCWZwcmludGYoc3RkZXJyLCAiXHRSID0gMHglWCwgRyA9IDB4JVgsIEIgPSAweCVYXG4iLCAKLSNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKLQkgICAgIAkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdSQml0TWFzaywKLQkgICAgIAkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTMuZHdHQml0TWFzaywKLQkgICAgIAkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdCQml0TWFzayk7Ci0jZWxzZQotCSAgICAgCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JCaXRNYXNrLAotCSAgICAgCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0dCaXRNYXNrLAotCSAgICAgCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0JCaXRNYXNrKTsKLSNlbmRpZgotfQotI2VuZGlmIC8qIEREUkFXX0RFQlVHICovCi0KLXN0YXRpYyBpbnQgRFg1X0hXQWNjZWxCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAotCQkJCQlTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCkKLXsKLQlMUERJUkVDVERSQVdTVVJGQUNFMyBzcmNfc3VyZmFjZTsKLQlMUERJUkVDVERSQVdTVVJGQUNFMyBkc3Rfc3VyZmFjZTsKLQlEV09SRCBmbGFnczsKLQlSRUNUIHJlY3Q7Ci0JSFJFU1VMVCByZXN1bHQ7Ci0KLQkvKiBTZXQgaXQgdXAuLiB0aGUgZGVzaW5hdGlvbiBtdXN0IGhhdmUgYSBERFJBVyBzdXJmYWNlICovCi0Jc3JjX3N1cmZhY2UgPSBzcmMtPmh3ZGF0YS0+ZGRfd3JpdGVidWY7Ci0JZHN0X3N1cmZhY2UgPSBkc3QtPmh3ZGF0YS0+ZGRfd3JpdGVidWY7Ci0JcmVjdC50b3AgICAgPSAoTE9ORylzcmNyZWN0LT55OwotCXJlY3QuYm90dG9tID0gKExPTkcpc3JjcmVjdC0+eStzcmNyZWN0LT5oOwotCXJlY3QubGVmdCAgID0gKExPTkcpc3JjcmVjdC0+eDsKLQlyZWN0LnJpZ2h0ICA9IChMT05HKXNyY3JlY3QtPngrc3JjcmVjdC0+dzsKLQlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKQotCQlmbGFncyA9IEREQkxURkFTVF9TUkNDT0xPUktFWTsKLQllbHNlCi0JCWZsYWdzID0gRERCTFRGQVNUX05PQ09MT1JLRVk7Ci0JLyogRklYTUU6ICBXZSBjYW4gcmVtb3ZlIHRoaXMgZmxhZyBmb3IgX3JlYWxseV8gZmFzdCBibGl0IHF1ZXVpbmcsCi0JICAgICAgICAgICBidXQgaXQgd2lsbCBhZmZlY3QgdGhlIHJldHVybiB2YWx1ZXMgb2YgbG9ja3MgYW5kIGZsaXBzLgotCSAqLwotCWZsYWdzIHw9IEREQkxURkFTVF9XQUlUOwotCi0JLyogRG8gdGhlIGJsaXQhICovCi0JcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19CbHRGYXN0KGRzdF9zdXJmYWNlLAotCQkJZHN0cmVjdC0+eCwgZHN0cmVjdC0+eSwgc3JjX3N1cmZhY2UsICZyZWN0LCBmbGFncyk7Ci0JaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7Ci0JCWlmICggcmVzdWx0ID09IERERVJSX1NVUkZBQ0VMT1NUICkgewotCQkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19SZXN0b3JlKHNyY19zdXJmYWNlKTsKLQkJCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfUmVzdG9yZShkc3Rfc3VyZmFjZSk7Ci0JCQkvKiBUaGUgc3VyZmFjZXMgbmVlZCB0byBiZSByZWxvYWRlZCB3aXRoIGFydHdvcmsgKi8KLQkJCVNETF9TZXRFcnJvcigiQmxpdCBzdXJmYWNlcyB3ZXJlIGxvc3QsIHJlbG9hZCB0aGVtIik7Ci0JCQlyZXR1cm4oLTIpOwotCQl9Ci0JCVNldEREZXJyb3IoIklEaXJlY3REcmF3U3VyZmFjZTM6OkJsdEZhc3QiLCByZXN1bHQpOwotI2lmZGVmIEREUkFXX0RFQlVHCi0gZnByaW50ZihzdGRlcnIsICJPcmlnaW5hbCBkZXN0IHJlY3Q6ICVkeCVkIGF0ICVkLCVkXG4iLCBkc3RyZWN0LT53LCBkc3RyZWN0LT5oLCBkc3RyZWN0LT54LCBkc3RyZWN0LT55KTsKLSBmcHJpbnRmKHN0ZGVyciwgIkhXIGFjY2VsZXJhdGVkICVzYmxpdCB0byBmcm9tIDB4JXAgdG8gMHglcCBhdCAoJWQsJWQpXG4iLAotCQkoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPyAiY29sb3JrZXkgIiA6ICIiLCBzcmMsIGRzdCwKLQkJCQkJZHN0cmVjdC0+eCwgZHN0cmVjdC0+eSk7Ci0gIFByaW50U3VyZmFjZSgiU1JDIiwgc3JjX3N1cmZhY2UsIHNyYy0+ZmxhZ3MpOwotICBQcmludFN1cmZhY2UoIkRTVCIsIGRzdF9zdXJmYWNlLCBkc3QtPmZsYWdzKTsKLSBmcHJpbnRmKHN0ZGVyciwgIlNvdXJjZSByZWN0YW5nbGU6ICglZCwlZCkgLSAoJWQsJWQpXG4iLAotCQlyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0jZW5kaWYKLQkJLyogVW5leHBlY3RlZCBlcnJvciwgZmFsbCBiYWNrIHRvIHNvZnR3YXJlIGJsaXQgKi8KLQkJcmV0dXJuKHNyYy0+bWFwLT5zd19ibGl0KHNyYywgc3JjcmVjdCwgZHN0LCBkc3RyZWN0KSk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBEWDVfQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkc3QpCi17Ci0JaW50IGFjY2VsZXJhdGVkOwotCi0JLyogV2UgbmVlZCB0byBoYXZlIGEgRERyYXcgc3VyZmFjZSBmb3IgSFcgYmxpdHMgKi8KLQlpZiAoIChzcmMtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX1NXU1VSRkFDRSApIHsKLQkJLyogQWxsb2NhdGUgYSBERHJhdyBzdXJmYWNlIGZvciB0aGUgYmxpdCAqLwotCQlpZiAoIHNyYy0+aHdkYXRhID09IE5VTEwgKSB7Ci0JCQlEWDVfQWxsb2NERFN1cmZhY2UodGhpcywgc3JjLCBOVUxMLCBTRExfU1dTVVJGQUNFKTsKLQkJfQotCX0KLQlpZiAoIHNyYy0+aHdkYXRhID09IE5VTEwgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBTZXQgaW5pdGlhbCBhY2NlbGVyYXRpb24gb24gKi8KLQlzcmMtPmZsYWdzIHw9IFNETF9IV0FDQ0VMOwotCi0JLyogU2V0IHRoZSBzdXJmYWNlIGF0dHJpYnV0ZXMgKi8KLQlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKSB7Ci0JCWlmICggRFg1X1NldEhXQ29sb3JLZXkodGhpcywgc3JjLCBzcmMtPmZvcm1hdC0+Y29sb3JrZXkpIDwgMCApIHsKLQkJCXNyYy0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOwotCQl9Ci0JfQotCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSApIHsKLQkJaWYgKCBEWDVfU2V0SFdBbHBoYSh0aGlzLCBzcmMsIHNyYy0+Zm9ybWF0LT5hbHBoYSkgPCAwICkgewotCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgZmluYWwgc3VyZmFjZSBibGl0IGlzIGFjY2VsZXJhdGVkICovCi0JYWNjZWxlcmF0ZWQgPSAhIShzcmMtPmZsYWdzICYgU0RMX0hXQUNDRUwpOwotCWlmICggYWNjZWxlcmF0ZWQgKSB7Ci0jaWZkZWYgRERSQVdfREVCVUcKLSAgZnByaW50ZihzdGRlcnIsICJTZXR0aW5nIGFjY2VsZXJhdGVkIGJsaXQgb24gMHglcFxuIiwgc3JjKTsKLSNlbmRpZgotCQlzcmMtPm1hcC0+aHdfYmxpdCA9IERYNV9IV0FjY2VsQmxpdDsKLQl9Ci0JcmV0dXJuKGFjY2VsZXJhdGVkKTsKLX0KLQotc3RhdGljIGludCBEWDVfRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QsIFVpbnQzMiBjb2xvcikKLXsKLQlMUERJUkVDVERSQVdTVVJGQUNFMyBkc3Rfc3VyZmFjZTsKLQlSRUNUIGFyZWE7Ci0JRERCTFRGWCBibHRmeDsKLQlIUkVTVUxUIHJlc3VsdDsKLQotI2lmZGVmIEREUkFXX0RFQlVHCi0gZnByaW50ZihzdGRlcnIsICJIVyBhY2NlbGVyYXRlZCBmaWxsIGF0ICglZCwlZClcbiIsIGRzdHJlY3QtPngsIGRzdHJlY3QtPnkpOwotI2VuZGlmCi0JZHN0X3N1cmZhY2UgPSBkc3QtPmh3ZGF0YS0+ZGRfd3JpdGVidWY7Ci0JYXJlYS50b3AgICAgPSAoTE9ORylkc3RyZWN0LT55OwotCWFyZWEuYm90dG9tID0gKExPTkcpZHN0cmVjdC0+eStkc3RyZWN0LT5oOwotCWFyZWEubGVmdCAgID0gKExPTkcpZHN0cmVjdC0+eDsKLQlhcmVhLnJpZ2h0ICA9IChMT05HKWRzdHJlY3QtPngrZHN0cmVjdC0+dzsKLQlibHRmeC5kd1NpemUgPSBzaXplb2YoYmx0ZngpOwotI2lmIGRlZmluZWQoTk9OQU1FTEVTU1VOSU9OKQotCWJsdGZ4LnU1LmR3RmlsbENvbG9yID0gY29sb3I7Ci0jZWxzZQotCWJsdGZ4LmR3RmlsbENvbG9yID0gY29sb3I7Ci0jZW5kaWYKLQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX0JsdChkc3Rfc3VyZmFjZSwKLQkJCSZhcmVhLCBOVUxMLCBOVUxMLCBEREJMVF9DT0xPUkZJTEx8RERCTFRfV0FJVCwgJmJsdGZ4KTsKLQlpZiAoIHJlc3VsdCA9PSBEREVSUl9TVVJGQUNFTE9TVCApIHsKLQkJSURpcmVjdERyYXdTdXJmYWNlM19SZXN0b3JlKGRzdF9zdXJmYWNlKTsKLQkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19CbHQoZHN0X3N1cmZhY2UsCi0JCQkmYXJlYSwgTlVMTCwgTlVMTCwgRERCTFRfQ09MT1JGSUxMfEREQkxUX1dBSVQsICZibHRmeCk7Ci0JfQotCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQlTZXRERGVycm9yKCJJRGlyZWN0RHJhd1N1cmZhY2UzOjpCbHQiLCByZXN1bHQpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgRFg1X1NldEhXQ29sb3JLZXkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIga2V5KQotewotCUREQ09MT1JLRVkgY29sb3JrZXk7Ci0JSFJFU1VMVCByZXN1bHQ7Ci0KLQkvKiBTZXQgdGhlIHN1cmZhY2UgY29sb3JrZXkgKi8KLQljb2xvcmtleS5kd0NvbG9yU3BhY2VMb3dWYWx1ZSA9IGtleTsKLQljb2xvcmtleS5kd0NvbG9yU3BhY2VIaWdoVmFsdWUgPSBrZXk7Ci0JcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19TZXRDb2xvcktleSgKLQkJCXN1cmZhY2UtPmh3ZGF0YS0+ZGRfc3VyZmFjZSwgRERDS0VZX1NSQ0JMVCwgJmNvbG9ya2V5KTsKLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiSURpcmVjdERyYXdTdXJmYWNlMzo6U2V0Q29sb3JLZXkiLCByZXN1bHQpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci1zdGF0aWMgaW50IERYNV9TZXRIV0FscGhhKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDggYWxwaGEpCi17Ci0JcmV0dXJuKC0xKTsKLX0KLQotc3RhdGljIGludCBEWDVfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JSFJFU1VMVCByZXN1bHQ7Ci0JTFBESVJFQ1REUkFXU1VSRkFDRTMgZGRfc3VyZmFjZTsKLQlERFNVUkZBQ0VERVNDIGRkc2Q7Ci0KLQkvKiBMb2NrIGFuZCBsb2FkISAqLwotCWRkX3N1cmZhY2UgPSBzdXJmYWNlLT5od2RhdGEtPmRkX3dyaXRlYnVmOwotCVNETF9tZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7Ci0JZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7Ci0JcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19Mb2NrKGRkX3N1cmZhY2UsIE5VTEwsICZkZHNkLAotCQkJCQkoRERMT0NLX05PU1lTTE9DS3xERExPQ0tfV0FJVCksIE5VTEwpOwotCWlmICggcmVzdWx0ID09IERERVJSX1NVUkZBQ0VMT1NUICkgewotCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX1Jlc3RvcmUoCi0JCQkJCQlzdXJmYWNlLT5od2RhdGEtPmRkX3N1cmZhY2UpOwotCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX0xvY2soZGRfc3VyZmFjZSwgTlVMTCwgJmRkc2QsIAotCQkJCQkoRERMT0NLX05PU1lTTE9DS3xERExPQ0tfV0FJVCksIE5VTEwpOwotCX0KLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpMb2NrIiwgcmVzdWx0KTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JLyogUGl0Y2ggbWlnaHQgaGF2ZSBjaGFuZ2VkIC0tIHJlY2FsY3VsYXRlIHBpdGNoIGFuZCBvZmZzZXQgKi8KLSNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKLQlpZiAoIHN1cmZhY2UtPnBpdGNoICE9IGRkc2QudTEubFBpdGNoICkgewotCQlzdXJmYWNlLT5waXRjaCA9IGRkc2QudTEubFBpdGNoOwotI2Vsc2UKLQlpZiAoIHN1cmZhY2UtPnBpdGNoICE9IGRkc2QubFBpdGNoICkgewotCQlzdXJmYWNlLT5waXRjaCA9IChVaW50MTYpZGRzZC5sUGl0Y2g7Ci0jZW5kaWYKLQkJc3VyZmFjZS0+b2Zmc2V0ID0KLQkJCSgoZGRzZC5kd0hlaWdodC1zdXJmYWNlLT5oKS8yKSpzdXJmYWNlLT5waXRjaCArCi0JCQkoKGRkc2QuZHdXaWR0aC1zdXJmYWNlLT53KS8yKSoKLQkJCQkJc3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCX0KLQlzdXJmYWNlLT5waXhlbHMgPSBkZHNkLmxwU3VyZmFjZTsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIERYNV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCUlEaXJlY3REcmF3U3VyZmFjZTNfVW5sb2NrKHN1cmZhY2UtPmh3ZGF0YS0+ZGRfd3JpdGVidWYsIE5VTEwpOwotCXN1cmZhY2UtPnBpeGVscyA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgRFg1X0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCUhSRVNVTFQgcmVzdWx0OwotCUxQRElSRUNURFJBV1NVUkZBQ0UzIGRkX3N1cmZhY2U7Ci0KLQlkZF9zdXJmYWNlID0gc3VyZmFjZS0+aHdkYXRhLT5kZF9zdXJmYWNlOwotCi0JLyogdG8gcHJldmVudCBiaWcgc2xvd2Rvd24gb24gZmFzdCBjb21wdXRlcnMsIHdhaXQgaGVyZSBpbnN0ZWFkIG9mIGRyaXZlciByaW5nIDAgY29kZSAqLwotCS8qIERtaXRyeSBZYWtpbW92IChmdGVjaEB0dWxhLm5ldCkgKi8KLQl3aGlsZShJRGlyZWN0RHJhd1N1cmZhY2UzX0dldEZsaXBTdGF0dXMoZGRfc3VyZmFjZSwgRERHQlNfSVNCTFRET05FKSA9PSBEREVSUl9XQVNTVElMTERSQVdJTkcpOwotCi0JcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19GbGlwKGRkX3N1cmZhY2UsIE5VTEwsIERERkxJUF9XQUlUKTsKLQlpZiAoIHJlc3VsdCA9PSBEREVSUl9TVVJGQUNFTE9TVCApIHsKLQkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19SZXN0b3JlKAotCQkJCQkJc3VyZmFjZS0+aHdkYXRhLT5kZF9zdXJmYWNlKTsKLQkJd2hpbGUoSURpcmVjdERyYXdTdXJmYWNlM19HZXRGbGlwU3RhdHVzKGRkX3N1cmZhY2UsIERER0JTX0lTQkxURE9ORSkgPT0gRERFUlJfV0FTU1RJTExEUkFXSU5HKTsKLQkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19GbGlwKGRkX3N1cmZhY2UsIE5VTEwsIERERkxJUF9XQUlUKTsKLQl9Ci0JaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7Ci0JCVNldEREZXJyb3IoIkRpcmVjdERyYXdTdXJmYWNlMzo6RmxpcCIsIHJlc3VsdCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgRFg1X0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCWlmICggc3VyZmFjZS0+aHdkYXRhICkgewotCQlpZiAoIHN1cmZhY2UtPmh3ZGF0YS0+ZGRfc3VyZmFjZSAhPSBTRExfcHJpbWFyeSApIHsKLQkJCUlEaXJlY3REcmF3U3VyZmFjZTNfUmVsZWFzZShzdXJmYWNlLT5od2RhdGEtPmRkX3N1cmZhY2UpOwotCQl9Ci0JCVNETF9mcmVlKHN1cmZhY2UtPmh3ZGF0YSk7Ci0JCXN1cmZhY2UtPmh3ZGF0YSA9IE5VTEw7Ci0JfQotfQotCi12b2lkIERYNV9XaW5kb3dVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCUhSRVNVTFQgcmVzdWx0OwotCWludCBpOwotCVJFQ1Qgc3JjLCBkc3Q7Ci0KLQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIHsKLQkJc3JjLnRvcCAgICA9IChMT05HKXJlY3RzW2ldLnk7Ci0JCXNyYy5ib3R0b20gPSAoTE9ORylyZWN0c1tpXS55K3JlY3RzW2ldLmg7Ci0JCXNyYy5sZWZ0ICAgPSAoTE9ORylyZWN0c1tpXS54OwotCQlzcmMucmlnaHQgID0gKExPTkcpcmVjdHNbaV0ueCtyZWN0c1tpXS53OwotCQlkc3QudG9wICAgID0gU0RMX2JvdW5kcy50b3Arc3JjLnRvcDsKLQkJZHN0LmxlZnQgICA9IFNETF9ib3VuZHMubGVmdCtzcmMubGVmdDsKLQkJZHN0LmJvdHRvbSA9IFNETF9ib3VuZHMudG9wK3NyYy5ib3R0b207Ci0JCWRzdC5yaWdodCAgPSBTRExfYm91bmRzLmxlZnQrc3JjLnJpZ2h0OwotCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX0JsdChTRExfcHJpbWFyeSwgJmRzdCwgCi0JCQkJCXRoaXMtPnNjcmVlbi0+aHdkYXRhLT5kZF9zdXJmYWNlLCAmc3JjLAotCQkJCQkJCUREQkxUX1dBSVQsIE5VTEwpOwotCQkvKiBEb2ghICBDaGVjayBmb3IgbG9zdCBzdXJmYWNlIGFuZCByZXN0b3JlIGl0ICovCi0JCWlmICggcmVzdWx0ID09IERERVJSX1NVUkZBQ0VMT1NUICkgewotCQkJSURpcmVjdERyYXdTdXJmYWNlM19SZXN0b3JlKFNETF9wcmltYXJ5KTsKLQkJCUlEaXJlY3REcmF3U3VyZmFjZTNfQmx0KFNETF9wcmltYXJ5LCAmZHN0LCAKLQkJCQkJdGhpcy0+c2NyZWVuLT5od2RhdGEtPmRkX3N1cmZhY2UsICZzcmMsCi0JCQkJCQkJRERCTFRfV0FJVCwgTlVMTCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgRFg1X0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci19Ci0KLS8qIENvbXByZXNzIGEgZnVsbCBwYWxldHRlIGludG8gdGhlIGxpbWl0ZWQgbnVtYmVyIG9mIGNvbG9ycyBnaXZlbiB0byB1cwotICAgYnkgd2luZG93cy4KLQotICAgVGhlICJiZXN0IiB3YXkgdG8gZG8gdGhpcyBpcyB0byBzb3J0IHRoZSBjb2xvcnMgYnkgZGl2ZXJzaXR5IGFuZCBwbGFjZQotICAgdGhlIG1vc3QgZGl2ZXJzZSBjb2xvcnMgaW50byB0aGUgbGltaXRlZCBwYWxldHRlLiAgVW5mb3J0dW5hdGVseSB0aGlzCi0gICByZXN1bHRzIGluIHdpZGVseSB2YXJ5aW5nIGNvbG9ycyBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIGludGVydmFsIGR1cmluZwotICAgd2hpY2ggdGhlIHdpbmRvd3MgcGFsZXR0ZSBoYXMgYmVlbiBzZXQsIGFuZCB0aGUgbWFwcGluZyBvZiB0aGUgc2hhZG93Ci0gICBzdXJmYWNlIHRvIHRoZSBuZXcgcGFsZXR0ZS4gIFRoaXMgaXMgZXNwZWNpYWxseSBub3RpY2VhYmxlIGR1cmluZyBmYWRlcy4KLQotICAgVG8gZGVhbCB3aXRoIHRoaXMgcHJvYmxlbSwgd2UgY2FuIGNvcHkgYSBwcmVkZXRlcm1pbmVkIHBvcnRpb24gb2YgdGhlCi0gICBmdWxsIHBhbGV0dGUsIGFuZCB1c2UgdGhhdCBhcyB0aGUgbGltaXRlZCBwYWxldHRlLiAgVGhpcyBhbGxvd3MgY29sb3JzCi0gICB0byBmYWRlIHNtb290aGx5IGFzIHRoZSByZW1hcHBpbmcgaXMgdmVyeSBzaW1pbGFyIG9uIGVhY2ggcGFsZXR0ZSBjaGFuZ2UuCi0gICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGJyZWFrcyBhcHBsaWNhdGlvbnMgd2hpY2ggcGFydGl0aW9uIHRoZSBwYWxldHRlIGludG8KLSAgIGRpc3RpbmN0IGFuZCB3aWRlbHkgdmFyeWluZyBhcmVhcywgZXhwZWN0aW5nIGFsbCBjb2xvcnMgdG8gYmUgYXZhaWxhYmxlLgotCi0gICBJJ20gbWFraW5nIHRoZW0gYm90aCBhdmFpbGFibGUsIGNob3NlbiBhdCBjb21waWxlIHRpbWUuCi0gICBJZiB5b3Ugd2FudCB0aGUgY2h1bmstby1wYWxldHRlIGFsZ29yaXRobSwgZGVmaW5lIFNJTVBMRV9DT01QUkVTU0lPTiwKLSAgIG90aGVyd2lzZSB0aGUgc29ydC1ieS1kaXZlcnNpdHkgYWxnb3JpdGhtIHdpbGwgYmUgdXNlZC4KLSovCi0jZGVmaW5lIFNJTVBMRV9DT01QUkVTU0lPTgotI2RlZmluZSBDU19DU19ESVNUKEEsIEIpICh7CQkJCQkJXAotCWludCByID0gKEEuciAtIEIucik7CQkJCQkJXAotCWludCBnID0gKEEuZyAtIEIuZyk7CQkJCQkJXAotCWludCBiID0gKEEuYiAtIEIuYik7CQkJCQkJXAotCShyKnIgKyBnKmcgKyBiKmIpOwkJCQkJCVwKLX0pCi1zdGF0aWMgdm9pZCBEWDVfQ29tcHJlc3NQYWxldHRlKF9USElTLCBTRExfQ29sb3IgKmNvbG9ycywgaW50IG5jb2xvcnMsIGludCBtYXhjb2xvcnMpCi17Ci0jaWZkZWYgU0lNUExFX0NPTVBSRVNTSU9OCi0JaW50IGksIGo7Ci0jZWxzZQotCXN0YXRpYyBTRExfQ29sb3IgemVybyA9IHsgMCwgMCwgMCwgMCB9OwotCWludCBpLCBqOwotCWludCBtYXgsIGRpc3Q7Ci0JaW50IHByZXYsIG5leHQ7Ci0JaW50ICpwb29sOwotCWludCAqc2VlbiwgKm9yZGVyOwotI2VuZGlmCi0KLQkvKiBEb2VzIHRoaXMgaGFwcGVuPyAqLwotCWlmICggbWF4Y29sb3JzID4gbmNvbG9ycyApIHsKLQkJbWF4Y29sb3JzID0gbmNvbG9yczsKLQl9Ci0KLSNpZmRlZiBTSU1QTEVfQ09NUFJFU1NJT04KLQkvKiBKdXN0IGNvcHkgdGhlIGZpcnN0ICJtYXhjb2xvcnMiIGNvbG9ycyAqLwotCWZvciAoIGo9MTAsIGk9MDsgaTxtYXhjb2xvcnM7ICsraSwgKytqICkgewotCQlTRExfY29sb3JzW2pdLnBlUmVkID0gY29sb3JzW2ldLnI7Ci0JCVNETF9jb2xvcnNbal0ucGVHcmVlbiA9IGNvbG9yc1tpXS5nOwotCQlTRExfY29sb3JzW2pdLnBlQmx1ZSA9IGNvbG9yc1tpXS5iOwotCX0KLSNlbHNlCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYXJyYXlzIHdlIHVzZSAqLwotCXBvb2wgPSBTRExfc3RhY2tfYWxsb2MoaW50LCAyKm5jb2xvcnMpOwotCWlmICggcG9vbCA9PSBOVUxMICkgewotCQkvKiBObyB3b3JyaWVzLCBqdXN0IHJldHVybiAqLzsKLQkJcmV0dXJuOwotCX0KLQlzZWVuID0gcG9vbDsKLQlTRExfbWVtc2V0KHNlZW4sIDAsIG5jb2xvcnMqc2l6ZW9mKGludCkpOwotCW9yZGVyID0gcG9vbCtuY29sb3JzOwotCi0JLyogU3RhcnQgd2l0aCB0aGUgYnJpZ2h0ZXN0IGNvbG9yICovCi0JbWF4ID0gMDsKLQlmb3IgKCBpPTA7IGk8bmNvbG9yczsgKytpICkgewotCQlkaXN0ID0gQ1NfQ1NfRElTVCh6ZXJvLCBjb2xvcnNbaV0pOwotCQlpZiAoIGRpc3QgPj0gbWF4ICkgewotCQkJbWF4ID0gZGlzdDsKLQkJCW5leHQgPSBpOwotCQl9Ci0JfQotCWogPSAwOwotCW9yZGVyW2orK10gPSBuZXh0OwotCXNlZW5bbmV4dF0gPSAxOwotCXByZXYgPSBuZXh0OwotCi0JLyogS2VlcCBnb2luZyB0aHJvdWdoIGFsbCB0aGUgY29sb3JzICovCi0Jd2hpbGUgKCBqIDwgbWF4Y29sb3JzICkgewotCQltYXggPSAwOwotCQlmb3IgKCBpPTA7IGk8bmNvbG9yczsgKytpICkgewotCQkJaWYgKCBzZWVuW2ldICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZGlzdCA9IENTX0NTX0RJU1QoY29sb3JzW2ldLCBjb2xvcnNbcHJldl0pOwotCQkJaWYgKCBkaXN0ID49IG1heCApIHsKLQkJCQltYXggPSBkaXN0OwotCQkJCW5leHQgPSBpOwotCQkJfQotCQl9Ci0JCW9yZGVyW2orK10gPSBuZXh0OwotCQlzZWVuW25leHRdID0gMTsKLQkJcHJldiA9IG5leHQ7Ci0JfQotCi0JLyogQ29tcHJlc3MgdGhlIGNvbG9ycyB0byB0aGUgcGFsZXR0ZSAqLwotCWZvciAoIGo9MTAsIGk9MDsgaTxtYXhjb2xvcnM7ICsraSwgKytqICkgewotCQlTRExfY29sb3JzW2pdLnBlUmVkID0gY29sb3JzW29yZGVyW2ldXS5yOwotCQlTRExfY29sb3JzW2pdLnBlR3JlZW4gPSBjb2xvcnNbb3JkZXJbaV1dLmc7Ci0JCVNETF9jb2xvcnNbal0ucGVCbHVlID0gY29sb3JzW29yZGVyW2ldXS5iOwotCX0KLQlTRExfc3RhY2tfZnJlZShwb29sKTsKLSNlbmRpZiAvKiBTSU1QTEVfQ09NUFJFU1NJT04gKi8KLX0KLQotLyogU2V0IHRoZSBzeXN0ZW0gY29sb3JtYXAgaW4gYm90aCBmdWxsc2NyZWVuIGFuZCB3aW5kb3dlZCBtb2RlcyAqLwotaW50IERYNV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0JaW50IGk7Ci0JaW50IGFsbG9jdF9hbGw7Ci0KLQkvKiBDb3B5IHBhbGV0dGUgY29sb3JzIGludG8gZGlzcGxheSBwYWxldHRlICovCi0JYWxsb2N0X2FsbCA9IDA7Ci0JaWYgKCBTRExfcGFsZXR0ZSAhPSBOVUxMICkgewotCQlpZiAoICh0aGlzLT5zY3JlZW4tPmZsYWdzJlNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKLQkJCS8qIFdlIGNhbiBzZXQgYWxsIGVudHJpZXMgZXhwbGljaXRseSAqLwotCQkJZm9yICggaT0wOyBpPCBuY29sb3JzOyArK2kgKSB7Ci0JCQkgICAgICAgIGludCBqID0gZmlyc3Rjb2xvciArIGk7Ci0JCQkJU0RMX2NvbG9yc1tqXS5wZVJlZCA9IGNvbG9yc1tpXS5yOwotCQkJCVNETF9jb2xvcnNbal0ucGVHcmVlbiA9IGNvbG9yc1tpXS5nOwotCQkJCVNETF9jb2xvcnNbal0ucGVCbHVlID0gY29sb3JzW2ldLmI7Ci0JCQl9Ci0JCQlJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhTRExfcGFsZXR0ZSwgMCwKLQkJCQlmaXJzdGNvbG9yLCBuY29sb3JzLCAmU0RMX2NvbG9yc1tmaXJzdGNvbG9yXSk7Ci0JCQlhbGxvY3RfYWxsID0gMTsKLQkJfSBlbHNlIHsKLQkJCS8qIEdyYWIgdGhlIDIzNiBtb3N0IGRpdmVyc2UgY29sb3JzIGluIHRoZSBwYWxldHRlICovCi0JCQlEWDVfQ29tcHJlc3NQYWxldHRlKHRoaXMsIGNvbG9ycywgbmNvbG9ycywgMjM2KTsKLQkJCS8qIFRoaXMgc2VuZHMgYW4gV01fUEFMRVRURUNIQU5HRUQgbWVzc2FnZSB0byB1cyAqLwotCQkJY29sb3JjaGFuZ2VfZXhwZWN0ZWQgPSAxOwotCQkJSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMoU0RMX3BhbGV0dGUsIDAsCi0JCQkJCQkJMCwgMjU2LCBTRExfY29sb3JzKTsKLQkJfQotCX0KLQlyZXR1cm4oYWxsb2N0X2FsbCk7Ci19Ci0KLS8qIEdhbW1hIGNvZGUgaXMgb25seSBhdmFpbGFibGUgb24gRGlyZWN0WCA3IGFuZCBuZXdlciAqLwotc3RhdGljIGludCBEWDVfU2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApCi17Ci0jaWZkZWYgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfU2V0R2FtbWFSYW1wCi0JTFBESVJFQ1REUkFXR0FNTUFDT05UUk9MIGdhbW1hOwotCURER0FNTUFSQU1QIGdhbW1hX3JhbXA7Ci0JSFJFU1VMVCByZXN1bHQ7Ci0jZW5kaWYKLQotCS8qIEluIHdpbmRvd2VkIG9yIE9wZW5HTCBtb2RlLCB1c2Ugd2luZGliIGdhbW1hIGNvZGUgKi8KLQlpZiAoICEgRERSQVdfRlVMTFNDUkVFTigpICkgewotCQlyZXR1cm4gRElCX1NldEdhbW1hUmFtcCh0aGlzLCByYW1wKTsKLQl9Ci0KLSNpZm5kZWYgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfU2V0R2FtbWFSYW1wCi0JU0RMX1NldEVycm9yKCJTREwgY29tcGlsZWQgd2l0aG91dCBEaXJlY3RYIGdhbW1hIHJhbXAgc3VwcG9ydCIpOwotCXJldHVybiAtMTsKLSNlbHNlCi0JLyogQ2hlY2sgZm9yIGEgdmlkZW8gbW9kZSEgKi8KLQlpZiAoICEgU0RMX3ByaW1hcnkgKSB7Ci0JCVNETF9TZXRFcnJvcigiQSB2aWRlbyBtb2RlIG11c3QgYmUgc2V0IGZvciBnYW1tYSBjb3JyZWN0aW9uIik7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogR2V0IHRoZSBnYW1tYSBjb250cm9sIG9iamVjdCAqLwotCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfUXVlcnlJbnRlcmZhY2UoU0RMX3ByaW1hcnksCi0JCQkmSUlEX0lEaXJlY3REcmF3R2FtbWFDb250cm9sLCAoTFBWT0lEICopJmdhbW1hKTsKLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpRdWVyeUludGVyZmFjZShHQU1NQSkiLCByZXN1bHQpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFNldCB1cCB0aGUgZ2FtbWEgcmFtcCAqLwotCVNETF9tZW1jcHkoZ2FtbWFfcmFtcC5yZWQsICZyYW1wWzAqMjU2XSwgMjU2KnNpemVvZigqcmFtcCkpOwotCVNETF9tZW1jcHkoZ2FtbWFfcmFtcC5ncmVlbiwgJnJhbXBbMSoyNTZdLCAyNTYqc2l6ZW9mKCpyYW1wKSk7Ci0JU0RMX21lbWNweShnYW1tYV9yYW1wLmJsdWUsICZyYW1wWzIqMjU2XSwgMjU2KnNpemVvZigqcmFtcCkpOwotCXJlc3VsdCA9IElEaXJlY3REcmF3R2FtbWFDb250cm9sX1NldEdhbW1hUmFtcChnYW1tYSwgMCwgJmdhbW1hX3JhbXApOwotCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQlTZXRERGVycm9yKCJEaXJlY3REcmF3R2FtbWFDb250cm9sOjpTZXRHYW1tYVJhbXAoKSIsIHJlc3VsdCk7Ci0JfQotCi0JLyogUmVsZWFzZSB0aGUgaW50ZXJmYWNlIGFuZCByZXR1cm4gKi8KLQlJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9SZWxlYXNlKGdhbW1hKTsKLQlyZXR1cm4gKHJlc3VsdCA9PSBERF9PSykgPyAwIDogLTE7Ci0jZW5kaWYgLyogIUlEaXJlY3REcmF3R2FtbWFDb250cm9sX1NldEdhbW1hUmFtcCAqLwotfQotCi1zdGF0aWMgaW50IERYNV9HZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCkKLXsKLSNpZmRlZiBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9TZXRHYW1tYVJhbXAKLQlMUERJUkVDVERSQVdHQU1NQUNPTlRST0wgZ2FtbWE7Ci0JRERHQU1NQVJBTVAgZ2FtbWFfcmFtcDsKLQlIUkVTVUxUIHJlc3VsdDsKLSNlbmRpZgotCi0JLyogSW4gd2luZG93ZWQgb3IgT3BlbkdMIG1vZGUsIHVzZSB3aW5kaWIgZ2FtbWEgY29kZSAqLwotCWlmICggISBERFJBV19GVUxMU0NSRUVOKCkgKSB7Ci0JCXJldHVybiBESUJfR2V0R2FtbWFSYW1wKHRoaXMsIHJhbXApOwotCX0KLQotI2lmbmRlZiBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9TZXRHYW1tYVJhbXAKLQlTRExfU2V0RXJyb3IoIlNETCBjb21waWxlZCB3aXRob3V0IERpcmVjdFggZ2FtbWEgcmFtcCBzdXBwb3J0Iik7Ci0JcmV0dXJuIC0xOwotI2Vsc2UKLQkvKiBDaGVjayBmb3IgYSB2aWRlbyBtb2RlISAqLwotCWlmICggISBTRExfcHJpbWFyeSApIHsKLQkJU0RMX1NldEVycm9yKCJBIHZpZGVvIG1vZGUgbXVzdCBiZSBzZXQgZm9yIGdhbW1hIGNvcnJlY3Rpb24iKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIGdhbW1hIGNvbnRyb2wgb2JqZWN0ICovCi0JcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19RdWVyeUludGVyZmFjZShTRExfcHJpbWFyeSwKLQkJCSZJSURfSURpcmVjdERyYXdHYW1tYUNvbnRyb2wsIChMUFZPSUQgKikmZ2FtbWEpOwotCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQlTZXRERGVycm9yKCJEaXJlY3REcmF3U3VyZmFjZTM6OlF1ZXJ5SW50ZXJmYWNlKEdBTU1BKSIsIHJlc3VsdCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBnYW1tYSByYW1wICovCi0JcmVzdWx0ID0gSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfR2V0R2FtbWFSYW1wKGdhbW1hLCAwLCAmZ2FtbWFfcmFtcCk7Ci0JaWYgKCByZXN1bHQgPT0gRERfT0sgKSB7Ci0JCVNETF9tZW1jcHkoJnJhbXBbMCoyNTZdLCBnYW1tYV9yYW1wLnJlZCwgMjU2KnNpemVvZigqcmFtcCkpOwotCQlTRExfbWVtY3B5KCZyYW1wWzEqMjU2XSwgZ2FtbWFfcmFtcC5ncmVlbiwgMjU2KnNpemVvZigqcmFtcCkpOwotCQlTRExfbWVtY3B5KCZyYW1wWzIqMjU2XSwgZ2FtbWFfcmFtcC5ibHVlLCAyNTYqc2l6ZW9mKCpyYW1wKSk7Ci0JfSBlbHNlIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd0dhbW1hQ29udHJvbDo6R2V0R2FtbWFSYW1wKCkiLCByZXN1bHQpOwotCX0KLQotCS8qIFJlbGVhc2UgdGhlIGludGVyZmFjZSBhbmQgcmV0dXJuICovCi0JSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfUmVsZWFzZShnYW1tYSk7Ci0JcmV0dXJuIChyZXN1bHQgPT0gRERfT0spID8gMCA6IC0xOwotI2VuZGlmIC8qICFJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9TZXRHYW1tYVJhbXAgKi8KLX0KLQotdm9pZCBEWDVfVmlkZW9RdWl0KF9USElTKQotewotCWludCBpLCBqOwotCi0JLyogSWYgd2UncmUgZnVsbHNjcmVlbiBHTCwgd2UgbmVlZCB0byByZXNldCB0aGUgZGlzcGxheSAqLwotCWlmICggdGhpcy0+c2NyZWVuICE9IE5VTEwgKSB7Ci0jaWZuZGVmIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUwotCQlpZiAoICh0aGlzLT5zY3JlZW4tPmZsYWdzICYgKFNETF9PUEVOR0x8U0RMX0ZVTExTQ1JFRU4pKSA9PQotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNETF9PUEVOR0x8U0RMX0ZVTExTQ1JFRU4pICkgewotCQkJQ2hhbmdlRGlzcGxheVNldHRpbmdzKE5VTEwsIDApOwotCQkJU2hvd1dpbmRvdyhTRExfV2luZG93LCBTV19ISURFKTsKLQkJfQotI2VuZGlmCi0JCWlmICggdGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9PUEVOR0wgKSB7Ci0JCQlXSU5fR0xfU2h1dERvd24odGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKiBGcmVlIGFueSBwYWxldHRlcyB3ZSB1c2VkICovCi0JaWYgKCBTRExfcGFsZXR0ZSAhPSBOVUxMICkgewotCQlJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZShTRExfcGFsZXR0ZSk7Ci0JCVNETF9wYWxldHRlID0gTlVMTDsKLQl9Ci0KLQkvKiBBbGxvdyB0aGUgcHJpbWFyeSBzdXJmYWNlIHRvIGJlIGZyZWVkICovCi0JaWYgKCBTRExfcHJpbWFyeSAhPSBOVUxMICkgewotCQlTRExfcHJpbWFyeSA9IE5VTEw7Ci0JfQotCi0JLyogRnJlZSB2aWRlbyBtb2RlIGxpc3RzICovCi0JZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKLQkJaWYgKCBTRExfbW9kZWxpc3RbaV0gIT0gTlVMTCApIHsKLQkJCWZvciAoIGo9MDsgU0RMX21vZGVsaXN0W2ldW2pdOyArK2ogKQotCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXVtqXSk7Ci0JCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOwotCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKLQkJfQotCX0KLQotCS8qIEZyZWUgdGhlIHdpbmRvdyAqLwotCURJQl9RdWl0R2FtbWEodGhpcyk7Ci0JaWYgKCBTRExfV2luZG93ICkgewotCQlEWDVfRGVzdHJveVdpbmRvdyh0aGlzKTsKLQl9Ci0KLQkvKiBGcmVlIG91ciB3aW5kb3cgaWNvbiAqLwotCWlmICggc2NyZWVuX2ljbiApIHsKLQkJRGVzdHJveUljb24oc2NyZWVuX2ljbik7Ci0JCXNjcmVlbl9pY24gPSBOVUxMOwotCX0KLX0KLQotLyogRXhwb3J0ZWQgZm9yIHRoZSB3aW5kb3dzIG1lc3NhZ2UgbG9vcCBvbmx5ICovCi12b2lkIERYNV9BY3RpdmF0ZShfVEhJUywgQk9PTCBhY3RpdmUsIEJPT0wgbWluaW1pemVkKQotewotfQotdm9pZCBEWDVfUmVhbGl6ZVBhbGV0dGUoX1RISVMpCi17Ci0JaWYgKCBTRExfcGFsZXR0ZSApIHsKLQkJSURpcmVjdERyYXdTdXJmYWNlM19TZXRQYWxldHRlKFNETF9wcmltYXJ5LCBTRExfcGFsZXR0ZSk7Ci0JfQotfQotc3RhdGljIHZvaWQgRFg1X1JlY29sb3I4Qml0KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDggKm1hcHBpbmcpCi17Ci0JaW50IHJvdywgY29sOwotCVVpbnQ4ICpwaXhlbHM7Ci0KLQlpZiAoIHN1cmZhY2UtPncgJiYgc3VyZmFjZS0+aCApIHsKLQkJaWYgKCAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgewotCQkJaWYgKCB0aGlzLT5Mb2NrSFdTdXJmYWNlKHRoaXMsIHN1cmZhY2UpIDwgMCApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZm9yICggcm93PTA7IHJvdzxzdXJmYWNlLT5oOyArK3JvdyApIHsKLQkJCXBpeGVscyA9IChVaW50OCAqKXN1cmZhY2UtPnBpeGVscytyb3cqc3VyZmFjZS0+cGl0Y2g7Ci0JCQlmb3IgKCBjb2w9MDsgY29sPHN1cmZhY2UtPnc7ICsrY29sLCArK3BpeGVscyApIHsKLQkJCQkqcGl4ZWxzID0gbWFwcGluZ1sqcGl4ZWxzXTsKLQkJCX0KLQkJfQotCQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UgKSB7Ci0JCQl0aGlzLT5VbmxvY2tIV1N1cmZhY2UodGhpcywgc3VyZmFjZSk7Ci0JCX0KLQkJU0RMX1VwZGF0ZVJlY3Qoc3VyZmFjZSwgMCwgMCwgMCwgMCk7Ci0JfQotfQotdm9pZCBEWDVfUGFsZXR0ZUNoYW5nZWQoX1RISVMsIEhXTkQgd2luZG93KQotewotCVNETF9QYWxldHRlICpwYWxldHRlOwotCVNETF9Db2xvciAqc2F2ZWQgPSBOVUxMOwotCUhEQyBoZGM7Ci0JaW50IGk7Ci0JUEFMRVRURUVOVFJZICplbnRyaWVzOwotCi0JLyogVGhpcyBpcyB0cnVlIHdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zaW5nICovCi0JaWYgKCAoU0RMX3ByaW1hcnkgPT0gTlVMTCkgfHwgKFNETF9WaWRlb1N1cmZhY2UgPT0gTlVMTCkgKQotCQlyZXR1cm47Ci0KLQkvKiBXZSBuZWVkIHRvIGdldCB0aGUgY29sb3JzIGFzIHRoZXkgd2VyZSBzZXQgKi8KLQlwYWxldHRlID0gdGhpcy0+cGh5c3BhbDsKLQlpZighcGFsZXR0ZSkKLQkgICAgICAgIHBhbGV0dGUgPSBTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGU7Ci0JaWYgKCBwYWxldHRlID09IE5VTEwgKSB7IC8qIFNvbWV0aW1lcyB3ZSBkb24ndCBoYXZlIGEgcGFsZXR0ZSAqLwotCQlyZXR1cm47Ci0JfQotCWVudHJpZXMgPSBTRExfc3RhY2tfYWxsb2MoUEFMRVRURUVOVFJZLCBwYWxldHRlLT5uY29sb3JzKTsKLQloZGMgPSBHZXREQyh3aW5kb3cpOwotCUdldFN5c3RlbVBhbGV0dGVFbnRyaWVzKGhkYywgMCwgcGFsZXR0ZS0+bmNvbG9ycywgZW50cmllcyk7Ci0JUmVsZWFzZURDKHdpbmRvdywgaGRjKTsKLQlpZiAoICEgY29sb3JjaGFuZ2VfZXhwZWN0ZWQgKSB7Ci0JCXNhdmVkID0gU0RMX3N0YWNrX2FsbG9jKFNETF9Db2xvciwgcGFsZXR0ZS0+bmNvbG9ycyk7Ci0JCVNETF9tZW1jcHkoc2F2ZWQsIHBhbGV0dGUtPmNvbG9ycywgCi0JCQkJCXBhbGV0dGUtPm5jb2xvcnMqc2l6ZW9mKFNETF9Db2xvcikpOwotCX0KLQlmb3IgKCBpPTA7IGk8cGFsZXR0ZS0+bmNvbG9yczsgKytpICkgewotCQlwYWxldHRlLT5jb2xvcnNbaV0uciA9IGVudHJpZXNbaV0ucGVSZWQ7Ci0JCXBhbGV0dGUtPmNvbG9yc1tpXS5nID0gZW50cmllc1tpXS5wZUdyZWVuOwotCQlwYWxldHRlLT5jb2xvcnNbaV0uYiA9IGVudHJpZXNbaV0ucGVCbHVlOwotCX0KLQlTRExfc3RhY2tfZnJlZShlbnRyaWVzKTsKLQlpZiAoICEgY29sb3JjaGFuZ2VfZXhwZWN0ZWQgKSB7Ci0JCVVpbnQ4IG1hcHBpbmdbMjU2XTsKLQotCQlTRExfbWVtc2V0KG1hcHBpbmcsIDAsIHNpemVvZihtYXBwaW5nKSk7Ci0JCWZvciAoIGk9MDsgaTxwYWxldHRlLT5uY29sb3JzOyArK2kgKSB7Ci0JCQltYXBwaW5nW2ldID0gU0RMX0ZpbmRDb2xvcihwYWxldHRlLAotCQkJCQlzYXZlZFtpXS5yLCBzYXZlZFtpXS5nLCBzYXZlZFtpXS5iKTsKLQkJfQotCQlEWDVfUmVjb2xvcjhCaXQodGhpcywgU0RMX1ZpZGVvU3VyZmFjZSwgbWFwcGluZyk7Ci0JCVNETF9zdGFja19mcmVlKHNhdmVkKTsKLQl9Ci0JY29sb3JjaGFuZ2VfZXhwZWN0ZWQgPSAwOwotCi0JLyogTm90aWZ5IGFsbCBtYXBwZWQgc3VyZmFjZXMgb2YgdGhlIGNoYW5nZSAqLwotCVNETF9Gb3JtYXRDaGFuZ2VkKFNETF9WaWRlb1N1cmZhY2UpOwotfQotCi0vKiBFeHBvcnRlZCBmb3IgdGhlIHdpbmRvd3MgbWVzc2FnZSBsb29wIG9ubHkgKi8KLXZvaWQgRFg1X1dpblBBSU5UKF9USElTLCBIREMgaGRjKQotewotCVNETF9VcGRhdGVSZWN0KFNETF9QdWJsaWNTdXJmYWNlLCAwLCAwLCAwLCAwKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZHg1L1NETF9keDV2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvU0RMX2R4NXZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YzczNjkuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvU0RMX2R4NXZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX2R4NXZpZGVvX2gKLSNkZWZpbmUgX1NETF9keDV2aWRlb19oCi0KLSNpbmNsdWRlICJkaXJlY3R4LmgiCi0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi1zdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgewotICAgIExQRElSRUNURFJBVzIgZGRyYXcyOwotICAgIExQRElSRUNURFJBV1NVUkZBQ0UzIFNETF9wcmltYXJ5OwotICAgIExQRElSRUNURFJBV0NMSVBQRVIgU0RMX2NsaXBwZXI7Ci0gICAgTFBESVJFQ1REUkFXUEFMRVRURSBTRExfcGFsZXR0ZTsKLSAgICBQQUxFVFRFRU5UUlkgU0RMX2NvbG9yc1syNTZdOwotICAgIGludCBjb2xvcmNoYW5nZV9leHBlY3RlZDsKLQotI2RlZmluZSBOVU1fTU9ERUxJU1RTCTQJCS8qIDgsIDE2LCAyNCwgYW5kIDMyIGJpdHMtcGVyLXBpeGVsICovCi0gICAgaW50IFNETF9udW1tb2Rlc1tOVU1fTU9ERUxJU1RTXTsKLSAgICBTRExfUmVjdCAqKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXTsKLSAgICBpbnQgU0RMX21vZGVpbmRleFtOVU1fTU9ERUxJU1RTXTsKLX07Ci0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgZGRyYXcyCQkJKHRoaXMtPmhpZGRlbi0+ZGRyYXcyKQotI2RlZmluZSBTRExfcHJpbWFyeQkJKHRoaXMtPmhpZGRlbi0+U0RMX3ByaW1hcnkpCi0jZGVmaW5lIFNETF9jbGlwcGVyCQkodGhpcy0+aGlkZGVuLT5TRExfY2xpcHBlcikKLSNkZWZpbmUgU0RMX3BhbGV0dGUJCSh0aGlzLT5oaWRkZW4tPlNETF9wYWxldHRlKQotI2RlZmluZSBTRExfY29sb3JzCQkodGhpcy0+aGlkZGVuLT5TRExfY29sb3JzKQotI2RlZmluZSBjb2xvcmNoYW5nZV9leHBlY3RlZAkodGhpcy0+aGlkZGVuLT5jb2xvcmNoYW5nZV9leHBlY3RlZCkKLSNkZWZpbmUgU0RMX251bW1vZGVzCQkodGhpcy0+aGlkZGVuLT5TRExfbnVtbW9kZXMpCi0jZGVmaW5lIFNETF9tb2RlbGlzdAkJKHRoaXMtPmhpZGRlbi0+U0RMX21vZGVsaXN0KQotI2RlZmluZSBTRExfbW9kZWluZGV4CQkodGhpcy0+aGlkZGVuLT5TRExfbW9kZWluZGV4KQotCi0vKiBEaXJlY3RYIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciB2aWRlbyBhbmQgZXZlbnRzICovCi1leHRlcm4gSFJFU1VMVCAoV0lOQVBJICpERHJhd0NyZWF0ZSkoIEdVSUQgRkFSICpscEdVSUQsIExQRElSRUNURFJBVyBGQVIgKmxwbHBERCwgSVVua25vd24gRkFSICpwVW5rT3V0ZXIgKTsKLWV4dGVybiBIUkVTVUxUIChXSU5BUEkgKkRJbnB1dENyZWF0ZSkoSElOU1RBTkNFIGhpbnN0LCBEV09SRCBkd1ZlcnNpb24sIExQRElSRUNUSU5QVVQgKnBwREksIExQVU5LTk9XTiBwdW5rT3V0ZXIpOwotCi0vKiBEaXJlY3REcmF3IGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbiAqLwotZXh0ZXJuIHZvaWQgU2V0RERlcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGNvZGUpOwotCi0jZW5kaWYgLyogX1NETF9keDV2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmR4NS9TRExfZHg1eXV2LmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmR4NS9TRExfZHg1eXV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NTdkYWMuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvU0RMX2R4NXl1di5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBEaXJlY3REcmF3IGltcGxlbWVudGF0aW9uIG9mIFlVViB2aWRlbyBvdmVybGF5cyAqLwotCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX2R4NXl1dl9jLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3l1dmZ1bmNzLmgiCi0KLS8vI2RlZmluZSBVU0VfRElSRUNUWF9PVkVSTEFZCi0KLS8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBtYW5pcHVsYXRlIHNvZnR3YXJlIHZpZGVvIG92ZXJsYXlzICovCi1zdGF0aWMgc3RydWN0IHByaXZhdGVfeXV2aHdmdW5jcyBkeDVfeXV2ZnVuY3MgPSB7Ci0JRFg1X0xvY2tZVVZPdmVybGF5LAotCURYNV9VbmxvY2tZVVZPdmVybGF5LAotCURYNV9EaXNwbGF5WVVWT3ZlcmxheSwKLQlEWDVfRnJlZVlVVk92ZXJsYXkKLX07Ci0KLXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSB7Ci0JTFBESVJFQ1REUkFXU1VSRkFDRTMgc3VyZmFjZTsKLQotCS8qIFRoZXNlIGFyZSBqdXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgdGhlbSBzZXBhcmF0ZWx5ICovCi0JVWludDE2IHBpdGNoZXNbM107Ci0JVWludDggKnBsYW5lc1szXTsKLX07Ci0KLQotc3RhdGljIExQRElSRUNURFJBV1NVUkZBQ0UzIENyZWF0ZVlVVlN1cmZhY2UoX1RISVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCkKLXsKLQlIUkVTVUxUIHJlc3VsdDsKLQlMUERJUkVDVERSQVdTVVJGQUNFICBkZF9zdXJmYWNlMTsKLQlMUERJUkVDVERSQVdTVVJGQUNFMyBkZF9zdXJmYWNlMzsKLQlERFNVUkZBQ0VERVNDIGRkc2Q7Ci0KLQkvKiBTZXQgdXAgdGhlIHN1cmZhY2UgZGVzY3JpcHRpb24gKi8KLQlTRExfbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwotCWRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwotCWRkc2QuZHdGbGFncyA9IChERFNEX1dJRFRIfEREU0RfSEVJR0hUfEREU0RfQ0FQU3xERFNEX1BJWEVMRk9STUFUKTsKLQlkZHNkLmR3V2lkdGggPSB3aWR0aDsKLQlkZHNkLmR3SGVpZ2h0PSBoZWlnaHQ7Ci0jaWZkZWYgVVNFX0RJUkVDVFhfT1ZFUkxBWQotCWRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSAoRERTQ0FQU19PVkVSTEFZfEREU0NBUFNfVklERU9NRU1PUlkpOwotI2Vsc2UKLQlkZHNkLmRkc0NhcHMuZHdDYXBzID0gKEREU0NBUFNfT0ZGU0NSRUVOUExBSU58RERTQ0FQU19WSURFT01FTU9SWSk7Ci0jZW5kaWYKLQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoZGRzZC5kZHBmUGl4ZWxGb3JtYXQpOwotCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPSBERFBGX0ZPVVJDQzsKLQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQyA9IGZvcm1hdDsKLQotCS8qIENyZWF0ZSB0aGUgRGlyZWN0RHJhdyB2aWRlbyBzdXJmYWNlICovCi0JcmVzdWx0ID0gSURpcmVjdERyYXcyX0NyZWF0ZVN1cmZhY2UoZGRyYXcyLCAmZGRzZCwgJmRkX3N1cmZhY2UxLCBOVUxMKTsgCi0JaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7Ci0JCVNldEREZXJyb3IoIkRpcmVjdERyYXcyOjpDcmVhdGVTdXJmYWNlIiwgcmVzdWx0KTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoZGRfc3VyZmFjZTEsCi0JCQkmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTMsIChMUFZPSUQgKikmZGRfc3VyZmFjZTMpOwotCUlEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGRkX3N1cmZhY2UxKTsKLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2U6OlF1ZXJ5SW50ZXJmYWNlIiwgcmVzdWx0KTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGUgc3VyZmFjZSBmb3JtYXQgd2FzIHNldCBwcm9wZXJseSAqLwotCVNETF9tZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7Ci0JZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7Ci0JcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19Mb2NrKGRkX3N1cmZhY2UzLCBOVUxMLAotCQkJCQkgICZkZHNkLCBERExPQ0tfTk9TWVNMT0NLLCBOVUxMKTsKLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpMb2NrIiwgcmVzdWx0KTsKLQkJSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoZGRfc3VyZmFjZTMpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCUlEaXJlY3REcmF3U3VyZmFjZTNfVW5sb2NrKGRkX3N1cmZhY2UzLCBOVUxMKTsKLQotCWlmICggIShkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpIHx8Ci0JICAgICAgKGRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDICE9IGZvcm1hdCkgKSB7Ci0JCVNETF9TZXRFcnJvcigiRERyYXcgZGlkbid0IHVzZSByZXF1ZXN0ZWQgRm91ckNDIGZvcm1hdCIpOwotCQlJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShkZF9zdXJmYWNlMyk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBXZSdyZSByZWFkeSB0byBnbyEgKi8KLQlyZXR1cm4oZGRfc3VyZmFjZTMpOwotfQotCi0jaWZkZWYgREVCVUdfWVVWCi1zdGF0aWMgY2hhciAqUHJpbnRGT1VSQ0MoVWludDMyIGNvZGUpCi17Ci0Jc3RhdGljIGNoYXIgYnVmWzVdOwotCi0JYnVmWzNdID0gY29kZSA+PiAyNDsKLQlidWZbMl0gPSAoY29kZSA+PiAxNikgJiAweEZGOwotCWJ1ZlsxXSA9IChjb2RlID4+IDgpICYgMHhGRjsKLQlidWZbMF0gPSAoY29kZSAmIDB4RkYpOwotCXJldHVybihidWYpOwotfQotI2VuZGlmCi0KLVNETF9PdmVybGF5ICpEWDVfQ3JlYXRlWVVWT3ZlcmxheShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBVaW50MzIgZm9ybWF0LCBTRExfU3VyZmFjZSAqZGlzcGxheSkKLXsKLQlTRExfT3ZlcmxheSAqb3ZlcmxheTsKLQlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKLQotI2lmZGVmIERFQlVHX1lVVgotCURXT1JEIG51bWNvZGVzOwotCURXT1JEICpjb2RlczsKLQotCXByaW50ZigiRk9VUkNDIGZvcm1hdCByZXF1ZXN0ZWQ6IDB4JXhcbiIsIFByaW50Rk9VUkNDKGZvcm1hdCkpOwotCUlEaXJlY3REcmF3Ml9HZXRGb3VyQ0NDb2RlcyhkZHJhdzIsICZudW1jb2RlcywgTlVMTCk7Ci0JaWYgKCBudW1jb2RlcyApIHsKLQkJRFdPUkQgaTsKLQkJY29kZXMgPSBTRExfbWFsbG9jKG51bWNvZGVzKnNpemVvZigqY29kZXMpKTsKLQkJaWYgKCBjb2RlcyApIHsKLQkJCUlEaXJlY3REcmF3Ml9HZXRGb3VyQ0NDb2RlcyhkZHJhdzIsICZudW1jb2RlcywgY29kZXMpOwotCQkJZm9yICggaT0wOyBpPG51bWNvZGVzOyArK2kgKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJDb2RlICVkOiAweCV4XG4iLCBpLCBQcmludEZPVVJDQyhjb2Rlc1tpXSkpOwotCQkJfQotCQkJU0RMX2ZyZWUoY29kZXMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJObyBGT1VSQ0MgY29kZXMgc3VwcG9ydGVkXG4iKTsKLQl9Ci0jZW5kaWYKLQotCS8qIENyZWF0ZSB0aGUgb3ZlcmxheSBzdHJ1Y3R1cmUgKi8KLQlvdmVybGF5ID0gKFNETF9PdmVybGF5ICopU0RMX21hbGxvYyhzaXplb2YgKm92ZXJsYXkpOwotCWlmICggb3ZlcmxheSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlTRExfbWVtc2V0KG92ZXJsYXksIDAsIChzaXplb2YgKm92ZXJsYXkpKTsKLQotCS8qIEZpbGwgaW4gdGhlIGJhc2ljIG1lbWJlcnMgKi8KLQlvdmVybGF5LT5mb3JtYXQgPSBmb3JtYXQ7Ci0Jb3ZlcmxheS0+dyA9IHdpZHRoOwotCW92ZXJsYXktPmggPSBoZWlnaHQ7Ci0KLQkvKiBTZXQgdXAgdGhlIFlVViBzdXJmYWNlIGZ1bmN0aW9uIHN0cnVjdHVyZSAqLwotCW92ZXJsYXktPmh3ZnVuY3MgPSAmZHg1X3l1dmZ1bmNzOwotCi0JLyogQ3JlYXRlIHRoZSBwaXhlbCBkYXRhIGFuZCBsb29rdXAgdGFibGVzICovCi0JaHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqKVNETF9tYWxsb2Moc2l6ZW9mICpod2RhdGEpOwotCW92ZXJsYXktPmh3ZGF0YSA9IGh3ZGF0YTsKLQlpZiAoIGh3ZGF0YSA9PSBOVUxMICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCWh3ZGF0YS0+c3VyZmFjZSA9IENyZWF0ZVlVVlN1cmZhY2UodGhpcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKLQlpZiAoIGh3ZGF0YS0+c3VyZmFjZSA9PSBOVUxMICkgewotCQlTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0Jb3ZlcmxheS0+aHdfb3ZlcmxheSA9IDE7Ci0KLQkvKiBTZXQgdXAgdGhlIHBsYW5lIHBvaW50ZXJzICovCi0Jb3ZlcmxheS0+cGl0Y2hlcyA9IGh3ZGF0YS0+cGl0Y2hlczsKLQlvdmVybGF5LT5waXhlbHMgPSBod2RhdGEtPnBsYW5lczsKLQlzd2l0Y2ggKGZvcm1hdCkgewotCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0JICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKLQkJb3ZlcmxheS0+cGxhbmVzID0gMzsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCW92ZXJsYXktPnBsYW5lcyA9IDE7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFdlJ3JlIGFsbCBkb25lLi4gKi8KLQlyZXR1cm4ob3ZlcmxheSk7Ci19Ci0KLWludCBEWDVfTG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQotewotCUhSRVNVTFQgcmVzdWx0OwotCUxQRElSRUNURFJBV1NVUkZBQ0UzIHN1cmZhY2U7Ci0JRERTVVJGQUNFREVTQyBkZHNkOwotCi0Jc3VyZmFjZSA9IG92ZXJsYXktPmh3ZGF0YS0+c3VyZmFjZTsKLQlTRExfbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwotCWRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwotCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfTG9jayhzdXJmYWNlLCBOVUxMLAotCQkJCQkgICZkZHNkLCBERExPQ0tfTk9TWVNMT0NLLCBOVUxMKTsKLQlpZiAoIHJlc3VsdCA9PSBEREVSUl9TVVJGQUNFTE9TVCApIHsKLQkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19SZXN0b3JlKHN1cmZhY2UpOwotCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX0xvY2soc3VyZmFjZSwgTlVMTCwgJmRkc2QsIAotCQkJCQkoRERMT0NLX05PU1lTTE9DS3xERExPQ0tfV0FJVCksIE5VTEwpOwotCX0KLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpMb2NrIiwgcmVzdWx0KTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBGaW5kIHRoZSBwaXRjaCBhbmQgb2Zmc2V0IHZhbHVlcyBmb3IgdGhlIG92ZXJsYXkgKi8KLSNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKLQlvdmVybGF5LT5waXRjaGVzWzBdID0gKFVpbnQxNilkZHNkLnUxLmxQaXRjaDsKLSNlbHNlCi0Jb3ZlcmxheS0+cGl0Y2hlc1swXSA9IChVaW50MTYpZGRzZC5sUGl0Y2g7Ci0jZW5kaWYKLQlvdmVybGF5LT5waXhlbHNbMF0gPSAoVWludDggKilkZHNkLmxwU3VyZmFjZTsKLQlzd2l0Y2ggKG92ZXJsYXktPmZvcm1hdCkgewotCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6Ci0JICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKLQkJLyogQWRkIHRoZSB0d28gZXh0cmEgcGxhbmVzICovCi0JCW92ZXJsYXktPnBpdGNoZXNbMV0gPSBvdmVybGF5LT5waXRjaGVzWzBdIC8gMjsKLQkJb3ZlcmxheS0+cGl0Y2hlc1syXSA9IG92ZXJsYXktPnBpdGNoZXNbMF0gLyAyOwotCSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzFdID0gb3ZlcmxheS0+cGl4ZWxzWzBdICsKLQkJICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS0+cGl0Y2hlc1swXSAqIG92ZXJsYXktPmg7Ci0JICAgICAgICBvdmVybGF5LT5waXhlbHNbMl0gPSBvdmVybGF5LT5waXhlbHNbMV0gKwotCQkgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LT5waXRjaGVzWzFdICogb3ZlcmxheS0+aCAvIDI7Ci0JICAgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJLyogT25seSBvbmUgcGxhbmUsIG5vIHdvcnJpZXMgKi8KLQkJYnJlYWs7Ci0JfQotCXJldHVybigwKTsKLX0KLQotdm9pZCBEWDVfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCi17Ci0JTFBESVJFQ1REUkFXU1VSRkFDRTMgc3VyZmFjZTsKLQotCXN1cmZhY2UgPSBvdmVybGF5LT5od2RhdGEtPnN1cmZhY2U7Ci0JSURpcmVjdERyYXdTdXJmYWNlM19VbmxvY2soc3VyZmFjZSwgTlVMTCk7Ci19Ci0KLWludCBEWDVfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KQotewotCUhSRVNVTFQgcmVzdWx0OwotCUxQRElSRUNURFJBV1NVUkZBQ0UzIHN1cmZhY2U7Ci0JUkVDVCBzcmNyZWN0LCBkc3RyZWN0OwotCi0Jc3VyZmFjZSA9IG92ZXJsYXktPmh3ZGF0YS0+c3VyZmFjZTsKLQlzcmNyZWN0LnRvcCA9IHNyYy0+eTsKLQlzcmNyZWN0LmJvdHRvbSA9IHNyY3JlY3QudG9wK3NyYy0+aDsKLQlzcmNyZWN0LmxlZnQgPSBzcmMtPng7Ci0Jc3JjcmVjdC5yaWdodCA9IHNyY3JlY3QubGVmdCtzcmMtPnc7Ci0JZHN0cmVjdC50b3AgPSBTRExfYm91bmRzLnRvcCtkc3QtPnk7Ci0JZHN0cmVjdC5sZWZ0ID0gU0RMX2JvdW5kcy5sZWZ0K2RzdC0+eDsKLQlkc3RyZWN0LmJvdHRvbSA9IGRzdHJlY3QudG9wK2RzdC0+aDsKLQlkc3RyZWN0LnJpZ2h0ID0gZHN0cmVjdC5sZWZ0K2RzdC0+dzsKLSNpZmRlZiBVU0VfRElSRUNUWF9PVkVSTEFZCi0JcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19VcGRhdGVPdmVybGF5KHN1cmZhY2UsICZzcmNyZWN0LAotCQkJCVNETF9wcmltYXJ5LCAmZHN0cmVjdCwgRERPVkVSX1NIT1csIE5VTEwpOwotCWlmICggcmVzdWx0ICE9IEREX09LICkgewotCQlTZXRERGVycm9yKCJEaXJlY3REcmF3U3VyZmFjZTM6OlVwZGF0ZU92ZXJsYXkiLCByZXN1bHQpOwotCQlyZXR1cm4oLTEpOwotCX0KLSNlbHNlCi0JcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19CbHQoU0RMX3ByaW1hcnksICZkc3RyZWN0LCBzdXJmYWNlLCAmc3JjcmVjdCwKLQkJCQkJCQlEREJMVF9XQUlULCBOVUxMKTsKLQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKLQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpCbHQiLCByZXN1bHQpOwotCQlyZXR1cm4oLTEpOwotCX0KLSNlbmRpZgotCXJldHVybigwKTsKLX0KLQotdm9pZCBEWDVfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQotewotCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhOwotCi0JaHdkYXRhID0gb3ZlcmxheS0+aHdkYXRhOwotCWlmICggaHdkYXRhICkgewotCQlpZiAoIGh3ZGF0YS0+c3VyZmFjZSApIHsKLQkJCUlEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGh3ZGF0YS0+c3VyZmFjZSk7Ci0JCX0KLQkJU0RMX2ZyZWUoaHdkYXRhKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZHg1L1NETF9keDV5dXZfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvU0RMX2R4NXl1dl9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWZiNjguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvU0RMX2R4NXl1dl9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBpcyB0aGUgRGlyZWN0RHJhdyBpbXBsZW1lbnRhdGlvbiBvZiBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KLQotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIi4uL3dpbmNvbW1vbi9TRExfbG93dmlkZW8uaCIKLSNpbmNsdWRlICJTRExfZHg1dmlkZW8uaCIKLQotZXh0ZXJuIFNETF9PdmVybGF5ICpEWDVfQ3JlYXRlWVVWT3ZlcmxheShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBVaW50MzIgZm9ybWF0LCBTRExfU3VyZmFjZSAqZGlzcGxheSk7Ci0KLWV4dGVybiBpbnQgRFg1X0xvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7Ci0KLWV4dGVybiB2b2lkIERYNV9VbmxvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7Ci0KLWV4dGVybiBpbnQgRFg1X0Rpc3BsYXlZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSwgU0RMX1JlY3QgKnNyYywgU0RMX1JlY3QgKmRzdCk7Ci0KLWV4dGVybiB2b2lkIERYNV9GcmVlWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvZGlyZWN0eC5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93aW5keDUvZGlyZWN0eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTRkNmM2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luZHg1L2RpcmVjdHguaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLQotI2lmbmRlZiBfZGlyZWN0eF9oCi0jZGVmaW5lIF9kaXJlY3R4X2gKLQotLyogSW5jbHVkZSBhbGwgb2YgdGhlIERpcmVjdFggNS4wIGhlYWRlcnMgYW5kIGFkZHMgYW55IG5lY2Vzc2FyeSB0d2Vha3MgKi8KLQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPG1tc3lzdGVtLmg+Ci0jaWZuZGVmIFdJTjMyCi0jZGVmaW5lIFdJTjMyCi0jZW5kaWYKLSN1bmRlZiAgV0lOTlQKLQotLyogRmFyIHBvaW50ZXJzIGRvbid0IGV4aXN0IGluIDMyLWJpdCBjb2RlICovCi0jaWZuZGVmIEZBUgotI2RlZmluZSBGQVIKLSNlbmRpZgotCi0vKiBFcnJvciBjb2RlcyBub3QgeWV0IGluY2x1ZGVkIGluIFdpbjMyIEFQSSBoZWFkZXIgZmlsZXMgKi8KLSNpZm5kZWYgTUFLRV9IUkVTVUxUCi0jZGVmaW5lIE1BS0VfSFJFU1VMVChzZXYsZmFjLGNvZGUpIFwKLQkoKEhSRVNVTFQpKCgodW5zaWduZWQgbG9uZykoc2V2KTw8MzEpIHwgKCh1bnNpZ25lZCBsb25nKShmYWMpPDwxNikgfCAoKHVuc2lnbmVkIGxvbmcpKGNvZGUpKSkpCi0jZW5kaWYKLQotI2lmbmRlZiBTX09LCi0jZGVmaW5lIFNfT0sJCShIUkVTVUxUKTB4MDAwMDAwMDBMCi0jZW5kaWYKLQotI2lmbmRlZiBTVUNDRUVERUQKLSNkZWZpbmUgU1VDQ0VFREVEKHgpCSgoSFJFU1VMVCkoeCkgPj0gMCkKLSNlbmRpZgotI2lmbmRlZiBGQUlMRUQKLSNkZWZpbmUgRkFJTEVEKHgpCSgoSFJFU1VMVCkoeCk8MCkKLSNlbmRpZgotCi0jaWZuZGVmIEVfRkFJTAotI2RlZmluZSBFX0ZBSUwJCShIUkVTVUxUKTB4ODAwMDAwMDhMCi0jZW5kaWYKLSNpZm5kZWYgRV9OT0lOVEVSRkFDRQotI2RlZmluZSBFX05PSU5URVJGQUNFCShIUkVTVUxUKTB4ODAwMDQwMDJMCi0jZW5kaWYKLSNpZm5kZWYgRV9PVVRPRk1FTU9SWQotI2RlZmluZSBFX09VVE9GTUVNT1JZCShIUkVTVUxUKTB4ODAwNzAwMEVMCi0jZW5kaWYKLSNpZm5kZWYgRV9JTlZBTElEQVJHCi0jZGVmaW5lIEVfSU5WQUxJREFSRwkoSFJFU1VMVCkweDgwMDcwMDU3TAotI2VuZGlmCi0jaWZuZGVmIEVfTk9USU1QTAotI2RlZmluZSBFX05PVElNUEwJKEhSRVNVTFQpMHg4MDAwNDAwMUwKLSNlbmRpZgotI2lmbmRlZiBSRUdEQl9FX0NMQVNTTk9UUkVHCi0jZGVmaW5lIFJFR0RCX0VfQ0xBU1NOT1RSRUcJKEhSRVNVTFQpMHg4MDA0MDE1NEwKLSNlbmRpZgotCi0vKiBTZXZlcml0eSBjb2RlcyAqLwotI2lmbmRlZiBTRVZFUklUWV9FUlJPUgotI2RlZmluZSBTRVZFUklUWV9FUlJPUgkxCi0jZW5kaWYKLQotLyogRXJyb3IgZmFjaWxpdHkgY29kZXMgKi8KLSNpZm5kZWYgRkFDSUxJVFlfV0lOMzIKLSNkZWZpbmUgRkFDSUxJVFlfV0lOMzIJNwotI2VuZGlmCi0KLSNpZm5kZWYgRklFTERfT0ZGU0VUCi0jZGVmaW5lIEZJRUxEX09GRlNFVCh0eXBlLCBmaWVsZCkgICAgKChMT05HKSYoKCh0eXBlICopMCktPmZpZWxkKSkKLSNlbmRpZgotCi0vKiBEaXJlY3RYIGhlYWRlcnMgKGlmIGl0IGlzbid0IGluY2x1ZGVkLCBJIGhhdmVuJ3QgdGVzdGVkIGl0IHlldCkKLSAqLwotLyogV2UgbmVlZCB0aGVzZSBkZWZpbmVzIHRvIG1hcmsgd2hhdCB2ZXJzaW9uIG9mIERpcmVjdFggQVBJIHdlIHVzZSAqLwotI2RlZmluZSBESVJFQ1REUkFXX1ZFUlNJT04gIDB4MDcwMAotI2RlZmluZSBESVJFQ1RTT1VORF9WRVJTSU9OIDB4MDUwMAotI2RlZmluZSBESVJFQ1RJTlBVVF9WRVJTSU9OIDB4MDUwMAotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCi0jZW5kaWYKLSNpbmNsdWRlIDxkZHJhdy5oPgotI2luY2x1ZGUgPGRzb3VuZC5oPgotI2luY2x1ZGUgPGRpbnB1dC5oPgotCi0jZW5kaWYgLyogX2RpcmVjdHhfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc2V2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTRkMDU0Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnNldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGRldi93c2NvbnMvd3NkaXNwbGF5X3VzbF9pby5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+ICAgIAotI2luY2x1ZGUgPHVuaXN0ZC5oPiAgCi0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPGVycm5vLmg+IAotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiU0RMLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3dzY29uc3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3dzY29uc2V2ZW50c19jLmgiCi0KLXN0YXRpYyBpbnQgcG9zdGVkID0gMDsKLQotaW50IFdTQ09OU19Jbml0S2V5Ym9hcmQoX1RISVMpCi17Ci0gIHN0cnVjdCB0ZXJtaW9zIHR0eTsKLQotICBpZiAoaW9jdGwocHJpdmF0ZS0+ZmQsIFdTS0JESU9fR1RZUEUsICZwcml2YXRlLT5rYmRUeXBlKSA9PSAtMSkgewotICAgIFdTQ09OU19SZXBvcnRFcnJvcigiY2Fubm90IGdldCBrZXlib2FyZCB0eXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKHRjZ2V0YXR0cihwcml2YXRlLT5mZCwgJnByaXZhdGUtPnNhdmVkX3R0eSkgPT0gLTEpIHsKLSAgICBXU0NPTlNfUmVwb3J0RXJyb3IoImNhbm5vdCBnZXQgdGVybWluYWwgYXR0cmlidXRlczogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBwcml2YXRlLT5kaWRfc2F2ZV90dHkgPSAxOwotICB0dHkgPSBwcml2YXRlLT5zYXZlZF90dHk7Ci0gIHR0eS5jX2lmbGFnID0gSUdOUEFSIHwgSUdOQlJLOwotICB0dHkuY19vZmxhZyA9IDA7Ci0gIHR0eS5jX2NmbGFnID0gQ1JFQUQgfCBDUzg7Ci0gIHR0eS5jX2xmbGFnID0gMDsKLSAgdHR5LmNfY2NbVlRJTUVdID0gMDsKLSAgdHR5LmNfY2NbVk1JTl0gPSAxOwotICBjZnNldGlzcGVlZCgmdHR5LCA5NjAwKTsKLSAgY2ZzZXRvc3BlZWQoJnR0eSwgOTYwMCk7Ci0gIGlmICh0Y3NldGF0dHIocHJpdmF0ZS0+ZmQsIFRDU0FOT1csICZ0dHkpIDwgMCkgewotICAgIFdTQ09OU19SZXBvcnRFcnJvcigiY2Fubm90IHNldCB0ZXJtaW5hbCBhdHRyaWJ1dGVzOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChpb2N0bChwcml2YXRlLT5mZCwgS0RTS0JNT0RFLCBLX1JBVykgPT0gLTEpIHsKLSAgICBXU0NPTlNfUmVwb3J0RXJyb3IoImNhbm5vdCBzZXQgcmF3IGtleWJvYXJkIG1vZGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBXU0NPTlNfUmVsZWFzZUtleWJvYXJkKF9USElTKQotewotICBpZiAocHJpdmF0ZS0+ZmQgIT0gLTEpIHsKLSAgICBpZiAoaW9jdGwocHJpdmF0ZS0+ZmQsIEtEU0tCTU9ERSwgS19YTEFURSkgPT0gLTEpIHsKLSAgICAgIFdTQ09OU19SZXBvcnRFcnJvcigiY2Fubm90IHJlc3RvcmUga2V5Ym9hcmQgdG8gdHJhbnNsYXRlZCBtb2RlOiAlcyIsCi0JCQkgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgaWYgKHByaXZhdGUtPmRpZF9zYXZlX3R0eSkgewotICAgICAgaWYgKHRjc2V0YXR0cihwcml2YXRlLT5mZCwgVENTQU5PVywgJnByaXZhdGUtPnNhdmVkX3R0eSkgPCAwKSB7Ci0JV1NDT05TX1JlcG9ydEVycm9yKCJjYW5ub3QgcmVzdG9yZSBrZXlub2FyZCBhdHRyaWJ1dGVzOiAlcyIsCi0JCQkgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVNb3VzZSgpCi17Ci19Ci0KLXN0YXRpYyBTRExLZXkga2V5bWFwWzEyOF07Ci0KLXN0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0pCi17Ci0gIGtleXN5bS0+c2NhbmNvZGUgPSBzY2FuY29kZTsKLSAga2V5c3ltLT5zeW0gPSBTRExLX1VOS05PV047Ci0gIGtleXN5bS0+bW9kID0gS01PRF9OT05FOwotCi0gIGlmIChzY2FuY29kZSA8IFNETF9hcnJheXNpemUoa2V5bWFwKSkKLSAgICBrZXlzeW0tPnN5bSA9IGtleW1hcFtzY2FuY29kZV07Ci0KLSAgaWYgKGtleXN5bS0+c3ltID09IFNETEtfVU5LTk9XTikKLSAgICBwcmludGYoIlVua25vd24gbWFwcGluZyBmb3Igc2NhbmNvZGUgJWRcbiIsIHNjYW5jb2RlKTsKLQotICByZXR1cm4ga2V5c3ltOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVLZXlib2FyZChfVEhJUykKLXsKLSAgdW5zaWduZWQgY2hhciBidWZbMTAwXTsKLSAgU0RMX2tleXN5bSBrZXlzeW07Ci0gIGludCBuLCBpOwotCi0gIGlmICgobiA9IHJlYWQocHJpdmF0ZS0+ZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDApIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGMgPSBidWZbaV0gJiAweDdmOwotICAgICAgaWYgKGMgPT0gMjI0KSAvLyBzcGVjaWFsIGtleSBwcmVmaXggLS0gd2hhdCBzaG91bGQgd2UgZG8gd2l0aCBpdD8KLQljb250aW51ZTsKLSAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZUtleWJvYXJkKChidWZbaV0gJiAweDgwKSA/IFNETF9SRUxFQVNFRCA6IFNETF9QUkVTU0VELAotCQkJCSAgICBUcmFuc2xhdGVLZXkoYywgJmtleXN5bSkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFdTQ09OU19QdW1wRXZlbnRzKF9USElTKQotewotICBkbyB7Ci0gICAgcG9zdGVkID0gMDsKLSAgICB1cGRhdGVNb3VzZSgpOwotICAgIHVwZGF0ZUtleWJvYXJkKHRoaXMpOwotICB9IHdoaWxlIChwb3N0ZWQpOwotfQotCi12b2lkIFdTQ09OU19Jbml0T1NLZXltYXAoX1RISVMpCi17Ci0gIGludCBpOwotCi0gIC8qIE1ha2Ugc3VyZSB1bmtub3duIGtleXMgYXJlIG1hcHBlZCBjb3JyZWN0bHkgKi8KLSAgZm9yIChpPTA7IGkgPCBTRExfYXJyYXlzaXplKGtleW1hcCk7IGkrKykgewotICAgIGtleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKLSAgfQotCi0gIHN3aXRjaCAocHJpdmF0ZS0+a2JkVHlwZSkgewotI2lmZGVmIFdTS0JEX1RZUEVfWkFVUlVTCi0gIGNhc2UgV1NLQkRfVFlQRV9aQVVSVVM6Ci0gICAgLyogdG9wIHJvdyAqLwotICAgIGtleW1hcFsyXSA9IFNETEtfMTsKLSAgICBrZXltYXBbM10gPSBTRExLXzI7Ci0gICAga2V5bWFwWzRdID0gU0RMS18zOwotICAgIGtleW1hcFs1XSA9IFNETEtfNDsKLSAgICBrZXltYXBbNl0gPSBTRExLXzU7Ci0gICAga2V5bWFwWzddID0gU0RMS182OwotICAgIGtleW1hcFs4XSA9IFNETEtfNzsKLSAgICBrZXltYXBbOV0gPSBTRExLXzg7Ci0gICAga2V5bWFwWzEwXSA9IFNETEtfOTsKLSAgICBrZXltYXBbMTFdID0gU0RMS18wOwotICAgIGtleW1hcFsxNF0gPSBTRExLX0JBQ0tTUEFDRTsKLSAgICAKLSAgICAvKiBzZWNvbmQgcm93ICovCi0gICAga2V5bWFwWzE2XSA9IFNETEtfcTsKLSAgICBrZXltYXBbMTddID0gU0RMS193OwotICAgIGtleW1hcFsxOF0gPSBTRExLX2U7Ci0gICAga2V5bWFwWzE5XSA9IFNETEtfcjsKLSAgICBrZXltYXBbMjBdID0gU0RMS190OwotICAgIGtleW1hcFsyMV0gPSBTRExLX3k7Ci0gICAga2V5bWFwWzIyXSA9IFNETEtfdTsKLSAgICBrZXltYXBbMjNdID0gU0RMS19pOwotICAgIGtleW1hcFsyNF0gPSBTRExLX287Ci0gICAga2V5bWFwWzI1XSA9IFNETEtfcDsKLQotICAgIC8qIHRoaXJkIHJvdyAqLwotICAgIGtleW1hcFsxNV0gPSBTRExLX1RBQjsKLSAgICBrZXltYXBbMzBdID0gU0RMS19hOwotICAgIGtleW1hcFszMV0gPSBTRExLX3M7Ci0gICAga2V5bWFwWzMyXSA9IFNETEtfZDsKLSAgICBrZXltYXBbMzNdID0gU0RMS19mOwotICAgIGtleW1hcFszNF0gPSBTRExLX2c7Ci0gICAga2V5bWFwWzM1XSA9IFNETEtfaDsKLSAgICBrZXltYXBbMzZdID0gU0RMS19qOwotICAgIGtleW1hcFszN10gPSBTRExLX2s7Ci0gICAga2V5bWFwWzM4XSA9IFNETEtfbDsKLQotICAgIC8qIGZvdXJ0aCByb3cgKi8KLSAgICBrZXltYXBbNDJdID0gU0RMS19MU0hJRlQ7Ci0gICAga2V5bWFwWzQ0XSA9IFNETEtfejsKLSAgICBrZXltYXBbNDVdID0gU0RMS194OwotICAgIGtleW1hcFs0Nl0gPSBTRExLX2M7Ci0gICAga2V5bWFwWzQ3XSA9IFNETEtfdjsKLSAgICBrZXltYXBbNDhdID0gU0RMS19iOwotICAgIGtleW1hcFs0OV0gPSBTRExLX247Ci0gICAga2V5bWFwWzUwXSA9IFNETEtfbTsKLSAgICBrZXltYXBbNTRdID0gU0RMS19SU0hJRlQ7Ci0gICAga2V5bWFwWzI4XSA9IFNETEtfUkVUVVJOOwotCi0gICAgLyogZmlmdGggcm93ICovCi0gICAga2V5bWFwWzU2XSA9IFNETEtfTEFMVDsKLSAgICBrZXltYXBbMjldID0gU0RMS19MQ1RSTDsKLSAgICAvKiBrZXltYXBbNTZdID0gOyAqLwotICAgIGtleW1hcFswXSA9IFNETEtfTFNVUEVSOwotICAgIGtleW1hcFsxMl0gPSBTRExLX01JTlVTOwotICAgIGtleW1hcFs1N10gPSBTRExLX1NQQUNFOwotICAgIGtleW1hcFs1MV0gPSBTRExLX0NPTU1BOwotICAgIGtleW1hcFs1Ml0gPSBTRExLX1BFUklPRDsKLQotICAgIC8qIG1pc2MgKi8KLSAgICBrZXltYXBbNTldID0gU0RMS19GMTsKLSAgICBrZXltYXBbNjBdID0gU0RMS19GMjsKLSAgICBrZXltYXBbNjFdID0gU0RMS19GMzsKLSAgICBrZXltYXBbNjJdID0gU0RMS19GNDsKLSAgICBrZXltYXBbNjNdID0gU0RMS19GNTsKLSAgICBrZXltYXBbMV0gPSBTRExLX0VTQ0FQRTsKLSAgICAvKiBrZXltYXBbMjhdID0gU0RMS19LUF9FTlRFUjsgKi8KLSAgICBrZXltYXBbNzJdID0gU0RMS19VUDsKLSAgICBrZXltYXBbNzVdID0gU0RMS19MRUZUOwotICAgIGtleW1hcFs3N10gPSBTRExLX1JJR0hUOwotICAgIGtleW1hcFs4MF0gPSBTRExLX0RPV047Ci0gICAgYnJlYWs7Ci0jZW5kaWYgLyogV1NLQkRfVFlQRV9aQVVSVVMgKi8KLQotICBkZWZhdWx0OgotICAgIFdTQ09OU19SZXBvcnRFcnJvcigiVW5hYmxlIHRvIG1hcCBrZXlzIGZvciBrZXlib2FyZCB0eXBlICV1IiwgCi0JCSAgICAgICBwcml2YXRlLT5rYmRUeXBlKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0vKiBlbmQgb2YgU0RMX3dzY29uc2V2ZW50cy5jIC4uLiAqLwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dzY29ucy9TRExfd3Njb25zZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnNldmVudHNfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ExYmZlLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnNldmVudHNfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfd3Njb25zdmlkZW8uaCIKLQotaW50IFdTQ09OU19Jbml0S2V5Ym9hcmQoX1RISVMpOwotdm9pZCBXU0NPTlNfUmVsZWFzZUtleWJvYXJkKF9USElTKTsKLQotLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAotICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQotKi8KLWV4dGVybiB2b2lkIFdTQ09OU19Jbml0T1NLZXltYXAoX1RISVMpOwotZXh0ZXJuIHZvaWQgV1NDT05TX1B1bXBFdmVudHMoX1RISVMpOwotCi0vKiBlbmQgb2YgU0RMX3dzY29uc2V2ZW50c19jLmggLi4uICovCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnNtb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc21vdXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NGMyMjYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc21vdXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLQotI2luY2x1ZGUgIlNETF93c2NvbnNtb3VzZV9jLmgiCi0KLQotLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCi1zdHJ1Y3QgV01jdXJzb3IgewotCWludCB1bnVzZWQ7Ci19OwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc21vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnNtb3VzZV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDBlYzIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc21vdXNlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3dzY29uc3ZpZGVvLmgiCi0KLS8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc3ZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dzY29ucy9TRExfd3Njb25zdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmOTljMS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dzY29ucy9TRExfd3Njb25zdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxkZXYvd3Njb25zL3dzZGlzcGxheV91c2xfaW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0KLSNpbmNsdWRlICJTRExfd3Njb25zdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfd3Njb25zZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfd3Njb25zbW91c2VfYy5oIgotCi0jZGVmaW5lIFdTQ09OU1ZJRF9EUklWRVJfTkFNRSAid3Njb25zIgotZW51bSB7Ci0gIFdTQ09OU19ST1RBVEVfTk9ORSA9IDAsCi0gIFdTQ09OU19ST1RBVEVfQ0NXID0gOTAsCi0gIFdTQ09OU19ST1RBVEVfVUQgPSAxODAsCi0gIFdTQ09OU19ST1RBVEVfQ1cgPSAyNzAKLX07Ci0KLSNkZWZpbmUgbWluKGEsYikgKChhKTwoYik/KGEpOihiKSkKLQotLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IFdTQ09OU19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7Ci1zdGF0aWMgU0RMX1JlY3QgKipXU0NPTlNfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqV1NDT05TX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBpbnQgV1NDT05TX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgdm9pZCBXU0NPTlNfVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgV1NDT05TX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgaW50IFdTQ09OU19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBXU0NPTlNfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBXU0NPTlNfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi0vKiBldGMuICovCi1zdGF0aWMgV1NDT05TX2JpdEJsaXQgV1NDT05TX2JsaXQxNjsKLXN0YXRpYyBXU0NPTlNfYml0QmxpdCBXU0NPTlNfYmxpdDE2YmxvY2tlZDsKLXN0YXRpYyB2b2lkIFdTQ09OU19VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOwotCi12b2lkIFdTQ09OU19SZXBvcnRFcnJvcihjaGFyICpmbXQsIC4uLikKLXsKLSAgY2hhciBtZXNzYWdlWzIwMF07Ci0gIHZhX2xpc3QgdmFBcmdzOwotICAKLSAgbWVzc2FnZVsxOTldID0gJ1wwJzsKLSAgCi0gIHZhX3N0YXJ0KHZhQXJncywgZm10KTsKLSAgdnNucHJpbnRmKG1lc3NhZ2UsIDE5OSwgZm10LCB2YUFyZ3MpOwotICB2YV9lbmQodmFBcmdzKTsKLQotICBTRExfU2V0RXJyb3IobWVzc2FnZSk7IAotICBmcHJpbnRmKHN0ZGVyciwgIldTQ09OUyBlcnJvcjogJXNcbiIsIG1lc3NhZ2UpOwotfQotCi0vKiBXU0NPTlMgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBXU0NPTlNfQXZhaWxhYmxlKHZvaWQpCi17Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBXU0NPTlNfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQotewotICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7Ci0gIFNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKldTQ09OU19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQotewotICBTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKLSAgCi0gIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCi0gIGRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLSAgaWYgKGRldmljZSA9PSBOVUxMKSB7Ci0gICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOwotICBkZXZpY2UtPmhpZGRlbiA9IAotICAgIChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKilTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0gIGlmIChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSB7Ci0gICAgU0RMX091dE9mTWVtb3J5KCk7Ci0gICAgU0RMX2ZyZWUoZGV2aWNlKTsKLSAgICByZXR1cm4oMCk7Ci0gIH0KLSAgU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLSAgZGV2aWNlLT5oaWRkZW4tPmZkID0gLTE7Ci0gIAotICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCi0gIGRldmljZS0+VmlkZW9Jbml0ID0gV1NDT05TX1ZpZGVvSW5pdDsKLSAgZGV2aWNlLT5MaXN0TW9kZXMgPSBXU0NPTlNfTGlzdE1vZGVzOwotICBkZXZpY2UtPlNldFZpZGVvTW9kZSA9IFdTQ09OU19TZXRWaWRlb01vZGU7Ci0gIGRldmljZS0+U2V0Q29sb3JzID0gV1NDT05TX1NldENvbG9yczsKLSAgZGV2aWNlLT5VcGRhdGVSZWN0cyA9IFdTQ09OU19VcGRhdGVSZWN0czsKLSAgZGV2aWNlLT5WaWRlb1F1aXQgPSBXU0NPTlNfVmlkZW9RdWl0OwotICBkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gV1NDT05TX0FsbG9jSFdTdXJmYWNlOwotICBkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBXU0NPTlNfTG9ja0hXU3VyZmFjZTsKLSAgZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBXU0NPTlNfVW5sb2NrSFdTdXJmYWNlOwotICBkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBXU0NPTlNfRnJlZUhXU3VyZmFjZTsKLSAgZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBXU0NPTlNfSW5pdE9TS2V5bWFwOwotICBkZXZpY2UtPlB1bXBFdmVudHMgPSBXU0NPTlNfUHVtcEV2ZW50czsKLSAgZGV2aWNlLT5mcmVlID0gV1NDT05TX0RlbGV0ZURldmljZTsKLSAgCi0gIHJldHVybiBkZXZpY2U7Ci19Ci0KLVZpZGVvQm9vdFN0cmFwIFdTQ09OU19ib290c3RyYXAgPSB7Ci0gIFdTQ09OU1ZJRF9EUklWRVJfTkFNRSwKLSAgIlNETCB3c2NvbnMgdmlkZW8gZHJpdmVyIiwKLSAgV1NDT05TX0F2YWlsYWJsZSwKLSAgV1NDT05TX0NyZWF0ZURldmljZQotfTsKLQotI2RlZmluZSBXU0NPTlNERVZfRk9STUFUICIvZGV2L3R0eUMlMDF4IgotCi1pbnQgV1NDT05TX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQotewotICBjaGFyIGRldm5hbWVidWZbMzBdOwotICBjaGFyICpkZXZuYW1lOwotICBjaGFyICpyb3RhdGlvbjsKLSAgaW50IHdzdHlwZTsKLSAgaW50IHdzbW9kZSA9IFdTRElTUExBWUlPX01PREVfRFVNQkZCOwotICBzaXplX3QgbGVuLCBtYXBzaXplOwotICBpbnQgcGFnZW1hc2s7Ci0gIGludCB3aWR0aCwgaGVpZ2h0OwotICAKLSAgZGV2bmFtZSA9IFNETF9nZXRlbnYoIlNETF9XU0NPTlNERVYiKTsKLSAgaWYgKGRldm5hbWUgPT0gTlVMTCkgewotICAgIGludCBhY3RpdmVWVDsKLSAgICBpZiAoaW9jdGwoU1RESU5fRklMRU5PLCBWVF9HRVRBQ1RJVkUsICZhY3RpdmVWVCkgPT0gLTEpIHsKLSAgICAgIFdTQ09OU19SZXBvcnRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBhY3RpdmUgdGVybWluYWw6ICVzIiwgCi0JCQkgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgU0RMX3NucHJpbnRmKGRldm5hbWVidWYsIHNpemVvZihkZXZuYW1lYnVmKSwgV1NDT05TREVWX0ZPUk1BVCwgYWN0aXZlVlQgLSAxKTsKLSAgICBkZXZuYW1lID0gZGV2bmFtZWJ1ZjsKLSAgfQotCi0gIHByaXZhdGUtPmZkID0gb3BlbihkZXZuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKLSAgaWYgKHByaXZhdGUtPmZkID09IC0xKSB7Ci0gICAgV1NDT05TX1JlcG9ydEVycm9yKCJvcGVuICVzOiAlcyIsIGRldm5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChpb2N0bChwcml2YXRlLT5mZCwgV1NESVNQTEFZSU9fR0lORk8sICZwcml2YXRlLT5pbmZvKSA9PSAtMSkgewotICAgIFdTQ09OU19SZXBvcnRFcnJvcigiaW9jdGwgV1NESVNQTEFZX0dJTkZPOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChpb2N0bChwcml2YXRlLT5mZCwgV1NESVNQTEFZSU9fR1RZUEUsICZ3c3R5cGUpID09IC0xKSB7Ci0gICAgV1NDT05TX1JlcG9ydEVycm9yKCJpb2N0bCBXU0RJU1BMQVlfR1RZUEU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGlvY3RsKHByaXZhdGUtPmZkLCBXU0RJU1BMQVlJT19MSU5FQllURVMsICZwcml2YXRlLT5waHlzbGluZWJ5dGVzKSA9PSAtMSkgewotICAgIFdTQ09OU19SZXBvcnRFcnJvcigiaW9jdGwgV1NESVNQTEFZSU9fTElORUJZVEVTOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChwcml2YXRlLT5pbmZvLmRlcHRoID4gOCkgewotICAgIGlmICh3c3R5cGUgPT0gV1NESVNQTEFZX1RZUEVfU1VOMjQgfHwKLQl3c3R5cGUgPT0gV1NESVNQTEFZX1RZUEVfU1VOQ0cxMiB8fAotCXdzdHlwZSA9PSBXU0RJU1BMQVlfVFlQRV9TVU5DRzE0IHx8Ci0Jd3N0eXBlID09IFdTRElTUExBWV9UWVBFX1NVTlRDWCB8fAotCXdzdHlwZSA9PSBXU0RJU1BMQVlfVFlQRV9TVU5GRkIpIHsKLSAgICAgIHByaXZhdGUtPnJlZE1hc2sgPSAweDAwMDBmZjsKLSAgICAgIHByaXZhdGUtPmdyZWVuTWFzayA9IDB4MDBmZjAwOwotICAgICAgcHJpdmF0ZS0+Ymx1ZU1hc2sgPSAweGZmMDAwMDsKLSNpZmRlZiBXU0RJU1BMQVlfVFlQRV9QWEFMQ0QKLSAgICB9IGVsc2UgaWYgKHdzdHlwZSA9PSBXU0RJU1BMQVlfVFlQRV9QWEFMQ0QpIHsKLSAgICAgIHByaXZhdGUtPnJlZE1hc2sgPSAweDFmIDw8IDExOwotICAgICAgcHJpdmF0ZS0+Z3JlZW5NYXNrID0gMHgzZiA8PCA1OwotICAgICAgcHJpdmF0ZS0+Ymx1ZU1hc2sgPSAweDFmOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICAgIFdTQ09OU19SZXBvcnRFcnJvcigiVW5rbm93biB2aWRlbyBoYXJkd2FyZSIpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIkRpc3BsYXlzIHdpdGggOCBicHAgb3IgbGVzcyBhcmUgbm90IHN1cHBvcnRlZCIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICAKLSAgcHJpdmF0ZS0+cm90YXRlID0gV1NDT05TX1JPVEFURV9OT05FOwotICByb3RhdGlvbiA9IFNETF9nZXRlbnYoIlNETF9WSURFT19XU0NPTlNfUk9UQVRJT04iKTsKLSAgaWYgKHJvdGF0aW9uICE9IE5VTEwpIHsKLSAgICBpZiAoU0RMX3N0cmxlbihyb3RhdGlvbikgPT0gMCkgewotICAgICAgcHJpdmF0ZS0+c2hhZG93RkIgPSAwOwotICAgICAgcHJpdmF0ZS0+cm90YXRlID0gV1NDT05TX1JPVEFURV9OT05FOwotICAgICAgcHJpbnRmKCJOb3Qgcm90YXRpbmcsIG5vIHNoYWRvd1xuIik7Ci0gICAgfSBlbHNlIGlmICghU0RMX3N0cmNtcChyb3RhdGlvbiwgIk5PTkUiKSkgewotICAgICAgcHJpdmF0ZS0+c2hhZG93RkIgPSAxOwotICAgICAgcHJpdmF0ZS0+cm90YXRlID0gV1NDT05TX1JPVEFURV9OT05FOwotICAgICAgcHJpbnRmKCJOb3Qgcm90YXRpbmcsIGJ1dCBzdGlsbCB1c2luZyBzaGFkb3dcbiIpOwotICAgIH0gZWxzZSBpZiAoIVNETF9zdHJjbXAocm90YXRpb24sICJDVyIpKSB7Ci0gICAgICBwcml2YXRlLT5zaGFkb3dGQiA9IDE7Ci0gICAgICBwcml2YXRlLT5yb3RhdGUgPSBXU0NPTlNfUk9UQVRFX0NXOwotICAgICAgcHJpbnRmKCJSb3RhdGluZyBzY3JlZW4gY2xvY2t3aXNlXG4iKTsKLSAgICB9IGVsc2UgaWYgKCFTRExfc3RyY21wKHJvdGF0aW9uLCAiQ0NXIikpIHsKLSAgICAgIHByaXZhdGUtPnNoYWRvd0ZCID0gMTsKLSAgICAgIHByaXZhdGUtPnJvdGF0ZSA9IFdTQ09OU19ST1RBVEVfQ0NXOwotICAgICAgcHJpbnRmKCJSb3RhdGluZyBzY3JlZW4gY291bnRlciBjbG9ja3dpc2VcbiIpOwotICAgIH0gZWxzZSBpZiAoIVNETF9zdHJjbXAocm90YXRpb24sICJVRCIpKSB7Ci0gICAgICBwcml2YXRlLT5zaGFkb3dGQiA9IDE7Ci0gICAgICBwcml2YXRlLT5yb3RhdGUgPSBXU0NPTlNfUk9UQVRFX1VEOwotICAgICAgcHJpbnRmKCJSb3RhdGluZyBzY3JlZW4gdXBzaWRlIGRvd25cbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIlwiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgIgotCQkJICJTRExfVklERU9fV1NDT05TX1JPVEFUSU9OIiwgcm90YXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotCi0gIHN3aXRjaCAocHJpdmF0ZS0+aW5mby5kZXB0aCkgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA4OgotICAgICAgbGVuID0gcHJpdmF0ZS0+cGh5c2xpbmVieXRlcyAqIHByaXZhdGUtPmluZm8uaGVpZ2h0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChwcml2YXRlLT5waHlzbGluZWJ5dGVzID09IHByaXZhdGUtPmluZm8ud2lkdGgpIHsKLQlsZW4gPSBwcml2YXRlLT5pbmZvLndpZHRoICogcHJpdmF0ZS0+aW5mby5oZWlnaHQgKiBzaXplb2Yoc2hvcnQpOwotICAgICAgfSBlbHNlIHsKLQlsZW4gPSBwcml2YXRlLT5waHlzbGluZWJ5dGVzICogcHJpdmF0ZS0+aW5mby5oZWlnaHQ7Ci0gICAgICB9Ci0gICAgICBpZiAocHJpdmF0ZS0+cm90YXRlID09IFdTQ09OU19ST1RBVEVfTk9ORSB8fAotCSAgcHJpdmF0ZS0+cm90YXRlID09IFdTQ09OU19ST1RBVEVfVUQpIHsKLQlwcml2YXRlLT5ibGl0RnVuYyA9IFdTQ09OU19ibGl0MTY7Ci0gICAgICB9IGVsc2UgewotCXByaXZhdGUtPmJsaXRGdW5jID0gV1NDT05TX2JsaXQxNmJsb2NrZWQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKHByaXZhdGUtPnBoeXNsaW5lYnl0ZXMgPT0gcHJpdmF0ZS0+aW5mby53aWR0aCkgewotCWxlbiA9IHByaXZhdGUtPmluZm8ud2lkdGggKiBwcml2YXRlLT5pbmZvLmhlaWdodCAqIHNpemVvZihpbnQpOwotICAgICAgfSBlbHNlIHsKLQlsZW4gPSBwcml2YXRlLT5waHlzbGluZWJ5dGVzICogcHJpdmF0ZS0+aW5mby5oZWlnaHQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgV1NDT05TX1JlcG9ydEVycm9yKCJ1bnN1cHBvcnRlZCBkZXB0aCAlZCIsIHByaXZhdGUtPmluZm8uZGVwdGgpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKHByaXZhdGUtPnNoYWRvd0ZCICYmIHByaXZhdGUtPmJsaXRGdW5jID09IE5VTEwpIHsKLSAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIlVzaW5nIHNvZnR3YXJlIGJ1ZmZlciwgYnV0IG5vIGJsaXR0ZXIgZnVuY3Rpb24gaXMgIgotCQkgICAgICAgImF2YWlsYWJsZSBmb3IgdGhpcyAlZCBicHAuIiwgcHJpdmF0ZS0+aW5mby5kZXB0aCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKGlvY3RsKHByaXZhdGUtPmZkLCBXU0RJU1BMQVlJT19TTU9ERSwgJndzbW9kZSkgPT0gLTEpIHsKLSAgICBXU0NPTlNfUmVwb3J0RXJyb3IoImlvY3RsIFNNT0RFIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcGFnZW1hc2sgPSBnZXRwYWdlc2l6ZSgpIC0gMTsKLSAgbWFwc2l6ZSA9ICgoaW50KWxlbiArIHBhZ2VtYXNrKSAmIH5wYWdlbWFzazsKLSAgcHJpdmF0ZS0+cGh5c21lbSA9IChVaW50OCAqKW1tYXAoTlVMTCwgbWFwc2l6ZSwKLQkJCQkgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAotCQkJCSAgIHByaXZhdGUtPmZkLCAob2ZmX3QpMCk7Ci0gIGlmIChwcml2YXRlLT5waHlzbWVtID09IChVaW50OCAqKU1BUF9GQUlMRUQpIHsKLSAgICBwcml2YXRlLT5waHlzbWVtID0gTlVMTDsKLSAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIm1tYXA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcHJpdmF0ZS0+ZmJtZW1fbGVuID0gbGVuOwotCi0gIGlmIChwcml2YXRlLT5yb3RhdGUgPT0gV1NDT05TX1JPVEFURV9DVyB8fCAKLSAgICAgIHByaXZhdGUtPnJvdGF0ZSA9PSBXU0NPTlNfUk9UQVRFX0NDVykgewotICAgIHdpZHRoID0gcHJpdmF0ZS0+aW5mby5oZWlnaHQ7Ci0gICAgaGVpZ2h0ID0gcHJpdmF0ZS0+aW5mby53aWR0aDsKLSAgfSBlbHNlIHsKLSAgICB3aWR0aCA9IHByaXZhdGUtPmluZm8ud2lkdGg7Ci0gICAgaGVpZ2h0ID0gcHJpdmF0ZS0+aW5mby5oZWlnaHQ7Ci0gIH0KLQotICB0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IHdpZHRoOwotICB0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IGhlaWdodDsKLQotICBpZiAocHJpdmF0ZS0+c2hhZG93RkIpIHsKLSAgICBwcml2YXRlLT5zaGFkb3dtZW0gPSAoVWludDggKilTRExfbWFsbG9jKGxlbik7Ci0gICAgaWYgKHByaXZhdGUtPnNoYWRvd21lbSA9PSBOVUxMKSB7Ci0gICAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIk5vIG1lbW9yeSBmb3Igc2hhZG93Iik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHByaXZhdGUtPmZic3RhcnQgPSBwcml2YXRlLT5zaGFkb3dtZW07Ci0gICAgcHJpdmF0ZS0+ZmJsaW5lYnl0ZXMgPSB3aWR0aCAqICgocHJpdmF0ZS0+aW5mby5kZXB0aCArIDcpIC8gOCk7Ci0gIH0gZWxzZSB7IAotICAgIHByaXZhdGUtPmZic3RhcnQgPSBwcml2YXRlLT5waHlzbWVtOwotICAgIHByaXZhdGUtPmZibGluZWJ5dGVzID0gcHJpdmF0ZS0+cGh5c2xpbmVieXRlczsKLSAgfQotICAKLSAgcHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKLSAgcHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdLT53ID0gd2lkdGg7Ci0gIHByaXZhdGUtPlNETF9tb2RlbGlzdFswXS0+aCA9IGhlaWdodDsKLQotICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBwcml2YXRlLT5pbmZvLmRlcHRoOwotICB2Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gcHJpdmF0ZS0+aW5mby5kZXB0aCAvIDg7Ci0gIAotICBpZiAoV1NDT05TX0luaXRLZXlib2FyZCh0aGlzKSA9PSAtMSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLVNETF9SZWN0ICoqV1NDT05TX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLSAgaWYgKGZvcm1hdC0+Qml0c1BlclBpeGVsID09IHByaXZhdGUtPmluZm8uZGVwdGgpIHsKLSAgICByZXR1cm4gcHJpdmF0ZS0+U0RMX21vZGVsaXN0OwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLVNETF9TdXJmYWNlICpXU0NPTlNfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQkgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0gIGlmICh3aWR0aCAhPSBwcml2YXRlLT5TRExfbW9kZWxpc3RbMF0tPncgfHwgCi0gICAgICBoZWlnaHQgIT0gcHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdLT5oKSB7Ci0gICAgV1NDT05TX1JlcG9ydEVycm9yKCJSZXF1ZXN0ZWQgdmlkZW8gbW9kZSAlZHglZCBub3Qgc3VwcG9ydGVkLiIsCi0JCSAgICAgICB3aWR0aCwgaGVpZ2h0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoYnBwICE9IHByaXZhdGUtPmluZm8uZGVwdGgpIHsKLSAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIlJlcXVlc3RlZCB2aWRlbyBkZXB0aCAlZCBicHAgbm90IHN1cHBvcnRlZC4iLCBicHApOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCAKLQkJCSBicHAsIAotCQkJIHByaXZhdGUtPnJlZE1hc2ssCi0JCQkgcHJpdmF0ZS0+Z3JlZW5NYXNrLAotCQkJIHByaXZhdGUtPmJsdWVNYXNrLAotCQkJIDApKSB7Ci0gICAgV1NDT05TX1JlcG9ydEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgcGl4ZWwgZm9ybWF0Iik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBjdXJyZW50LT5mbGFncyAmPSBTRExfRlVMTFNDUkVFTjsKLSAgaWYgKHByaXZhdGUtPnNoYWRvd0ZCKSB7Ci0gICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX1NXU1VSRkFDRTsKLSAgfSBlbHNlIHsKLSAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfSFdTVVJGQUNFOwotICB9Ci0gIGN1cnJlbnQtPncgPSB3aWR0aDsKLSAgY3VycmVudC0+aCA9IGhlaWdodDsKLSAgY3VycmVudC0+cGl0Y2ggPSBwcml2YXRlLT5mYmxpbmVieXRlczsKLSAgY3VycmVudC0+cGl4ZWxzID0gcHJpdmF0ZS0+ZmJzdGFydDsKLQotICBTRExfbWVtc2V0KHByaXZhdGUtPmZic3RhcnQsIDAsIHByaXZhdGUtPmZibWVtX2xlbik7Ci0KLSAgcmV0dXJuIGN1cnJlbnQ7Ci19Ci0KLXN0YXRpYyBpbnQgV1NDT05TX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLSAgcmV0dXJuIC0xOwotfQotc3RhdGljIHZvaWQgV1NDT05TX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotfQotCi1zdGF0aWMgaW50IFdTQ09OU19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIFdTQ09OU19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotfQotCi1zdGF0aWMgdm9pZCBXU0NPTlNfYmxpdDE2KFVpbnQ4ICpieXRlX3NyY19wb3MsCi0JCQkgIGludCBzcmNSaWdodERlbHRhLCAKLQkJCSAgaW50IHNyY0Rvd25EZWx0YSwgCi0JCQkgIFVpbnQ4ICpieXRlX2RzdF9wb3MsCi0JCQkgIGludCBkc3RfbGluZWJ5dGVzLAotCQkJICBpbnQgd2lkdGgsCi0JCQkgIGludCBoZWlnaHQpCi17Ci0gIGludCB3OwotICBVaW50MTYgKnNyY19wb3MgPSAoVWludDE2ICopYnl0ZV9zcmNfcG9zOwotICBVaW50MTYgKmRzdF9wb3MgPSAoVWludDE2ICopYnl0ZV9kc3RfcG9zOwotCi0gIHdoaWxlIChoZWlnaHQpIHsKLSAgICBVaW50MTYgKnNyYyA9IHNyY19wb3M7Ci0gICAgVWludDE2ICpkc3QgPSBkc3RfcG9zOwotICAgIGZvciAodyA9IHdpZHRoOyB3ICE9IDA7IHctLSkgewotICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICBzcmMgKz0gc3JjUmlnaHREZWx0YTsKLSAgICAgIGRzdCsrOwotICAgIH0KLSAgICBkc3RfcG9zID0gKFVpbnQxNiAqKSgoVWludDggKilkc3RfcG9zICsgZHN0X2xpbmVieXRlcyk7Ci0gICAgc3JjX3BvcyArPSBzcmNEb3duRGVsdGE7Ci0gICAgaGVpZ2h0LS07Ci0gIH0KLX0KLQotI2RlZmluZSBCTE9DS1NJWkVfVyAzMgotI2RlZmluZSBCTE9DS1NJWkVfSCAzMgotCi1zdGF0aWMgdm9pZCBXU0NPTlNfYmxpdDE2YmxvY2tlZChVaW50OCAqYnl0ZV9zcmNfcG9zLAotCQkJCSBpbnQgc3JjUmlnaHREZWx0YSwgCi0JCQkJIGludCBzcmNEb3duRGVsdGEsIAotCQkJCSBVaW50OCAqYnl0ZV9kc3RfcG9zLAotCQkJCSBpbnQgZHN0X2xpbmVieXRlcywKLQkJCQkgaW50IHdpZHRoLAotCQkJCSBpbnQgaGVpZ2h0KQotewotICBpbnQgdzsKLSAgVWludDE2ICpzcmNfcG9zID0gKFVpbnQxNiAqKWJ5dGVfc3JjX3BvczsKLSAgVWludDE2ICpkc3RfcG9zID0gKFVpbnQxNiAqKWJ5dGVfZHN0X3BvczsKLQotICB3aGlsZSAoaGVpZ2h0ID4gMCkgewotICAgIFVpbnQxNiAqc3JjID0gc3JjX3BvczsKLSAgICBVaW50MTYgKmRzdCA9IGRzdF9wb3M7Ci0gICAgZm9yICh3ID0gd2lkdGg7IHcgPiAwOyB3IC09IEJMT0NLU0laRV9XKSB7Ci0gICAgICBXU0NPTlNfYmxpdDE2KChVaW50OCAqKXNyYywKLQkJICAgIHNyY1JpZ2h0RGVsdGEsCi0JCSAgICBzcmNEb3duRGVsdGEsCi0JCSAgICAoVWludDggKilkc3QsCi0JCSAgICBkc3RfbGluZWJ5dGVzLAotCQkgICAgbWluKHcsIEJMT0NLU0laRV9XKSwKLQkJICAgIG1pbihoZWlnaHQsIEJMT0NLU0laRV9IKSk7Ci0gICAgICBzcmMgKz0gc3JjUmlnaHREZWx0YSAqIEJMT0NLU0laRV9XOwotICAgICAgZHN0ICs9IEJMT0NLU0laRV9XOwotICAgIH0KLSAgICBkc3RfcG9zID0gKFVpbnQxNiAqKSgoVWludDggKilkc3RfcG9zICsgZHN0X2xpbmVieXRlcyAqIEJMT0NLU0laRV9IKTsKLSAgICBzcmNfcG9zICs9IHNyY0Rvd25EZWx0YSAqIEJMT0NLU0laRV9IOwotICAgIGhlaWdodCAtPSBCTE9DS1NJWkVfSDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBXU0NPTlNfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotICBpbnQgd2lkdGggPSBwcml2YXRlLT5TRExfbW9kZWxpc3RbMF0tPnc7Ci0gIGludCBoZWlnaHQgPSBwcml2YXRlLT5TRExfbW9kZWxpc3RbMF0tPmg7Ci0gIGludCBieXRlc1BlclBpeGVsID0gKHByaXZhdGUtPmluZm8uZGVwdGggKyA3KSAvIDg7Ci0gIGludCBpOwotCi0gIGlmICghcHJpdmF0ZS0+c2hhZG93RkIpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocHJpdmF0ZS0+aW5mby5kZXB0aCAhPSAxNikgewotICAgIFdTQ09OU19SZXBvcnRFcnJvcigiU2hhZG93IGNvcHkgb25seSBpbXBsZW1lbnRlZCBmb3IgMTYgYnBwIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bXJlY3RzOyBpKyspIHsKLSAgICBpbnQgeDEsIHkxLCB4MiwgeTI7Ci0gICAgaW50IHNjcl94MSwgc2NyX3kxLCBzY3JfeDIsIHNjcl95MjsKLSAgICBpbnQgc2hhX3gxLCBzaGFfeTE7Ci0gICAgaW50IHNoYWRvd1JpZ2h0RGVsdGE7ICAvKiBBZGRyZXNzIGNoYW5nZSB3aGVuIG1vdmluZyByaWdodCBpbiBkZXN0ICovCi0gICAgaW50IHNoYWRvd0Rvd25EZWx0YTsgICAvKiBBZGRyZXNzIGNoYW5nZSB3aGVuIG1vdmluZyBkb3duIGluIGRlc3QgKi8KLSAgICBVaW50OCAqc3JjX3N0YXJ0OwotICAgIFVpbnQ4ICpkc3Rfc3RhcnQ7Ci0KLSAgICB4MSA9IHJlY3RzW2ldLng7IAotICAgIHkxID0gcmVjdHNbaV0ueTsKLSAgICB4MiA9IHgxICsgcmVjdHNbaV0udzsgCi0gICAgeTIgPSB5MSArIHJlY3RzW2ldLmg7Ci0KLSAgICBpZiAoeDEgPCAwKSB7Ci0gICAgICB4MSA9IDA7Ci0gICAgfSBlbHNlIGlmICh4MSA+IHdpZHRoKSB7Ci0gICAgICB4MSA9IHdpZHRoOwotICAgIH0KLSAgICBpZiAoeDIgPCAwKSB7Ci0gICAgICB4MiA9IDA7Ci0gICAgfSBlbHNlIGlmICh4MiA+IHdpZHRoKSB7Ci0gICAgICB4MiA9IHdpZHRoOwotICAgIH0KLSAgICBpZiAoeTEgPCAwKSB7Ci0gICAgICB5MSA9IDA7Ci0gICAgfSBlbHNlIGlmICh5MSA+IGhlaWdodCkgewotICAgICAgeTEgPSBoZWlnaHQ7Ci0gICAgfQotICAgIGlmICh5MiA8IDApIHsKLSAgICAgIHkyID0gMDsKLSAgICB9IGVsc2UgaWYgKHkyID4gaGVpZ2h0KSB7Ci0gICAgICB5MiA9IGhlaWdodDsKLSAgICB9Ci0gICAgaWYgKHgyIDw9IHgxIHx8IHkyIDw9IHkxKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHByaXZhdGUtPnJvdGF0ZSkgewotICAgICAgY2FzZSBXU0NPTlNfUk9UQVRFX05PTkU6Ci0Jc2hhX3gxID0gc2NyX3gxID0geDE7Ci0Jc2hhX3kxID0gc2NyX3kxID0geTE7Ci0Jc2NyX3gyID0geDI7Ci0Jc2NyX3kyID0geTI7Ci0Jc2hhZG93UmlnaHREZWx0YSA9IDE7Ci0Jc2hhZG93RG93bkRlbHRhID0gd2lkdGg7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFdTQ09OU19ST1RBVEVfQ0NXOgotCXNjcl94MSA9IHkxOwotCXNjcl95MSA9IHdpZHRoIC0geDI7Ci0Jc2NyX3gyID0geTI7Ci0Jc2NyX3kyID0gd2lkdGggLSB4MTsKLQlzaGFfeDEgPSB4MiAtIDE7Ci0Jc2hhX3kxID0geTE7Ci0Jc2hhZG93UmlnaHREZWx0YSA9IHdpZHRoOwotCXNoYWRvd0Rvd25EZWx0YSA9IC0xOwotCWJyZWFrOwotICAgICAgY2FzZSBXU0NPTlNfUk9UQVRFX1VEOgotCXNjcl94MSA9IHdpZHRoIC0geDI7Ci0Jc2NyX3kxID0gaGVpZ2h0IC0geTI7Ci0Jc2NyX3gyID0gd2lkdGggLSB4MTsKLQlzY3JfeTIgPSBoZWlnaHQgLSB5MTsKLQlzaGFfeDEgPSB4MiAtIDE7Ci0Jc2hhX3kxID0geTIgLSAxOwotCXNoYWRvd1JpZ2h0RGVsdGEgPSAtMTsKLQlzaGFkb3dEb3duRGVsdGEgPSAtd2lkdGg7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFdTQ09OU19ST1RBVEVfQ1c6Ci0Jc2NyX3gxID0gaGVpZ2h0IC0geTI7Ci0Jc2NyX3kxID0geDE7Ci0Jc2NyX3gyID0gaGVpZ2h0IC0geTE7Ci0Jc2NyX3kyID0geDI7Ci0Jc2hhX3gxID0geDE7Ci0Jc2hhX3kxID0geTIgLSAxOwotCXNoYWRvd1JpZ2h0RGVsdGEgPSAtd2lkdGg7Ci0Jc2hhZG93RG93bkRlbHRhID0gMTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JV1NDT05TX1JlcG9ydEVycm9yKCJVbmtub3duIHJvdGF0aW9uIik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIHNyY19zdGFydCA9IHByaXZhdGUtPnNoYWRvd21lbSArIChzaGFfeTEgKiB3aWR0aCArIHNoYV94MSkgKiBieXRlc1BlclBpeGVsOwotICAgIGRzdF9zdGFydCA9IHByaXZhdGUtPnBoeXNtZW0gKyBzY3JfeTEgKiBwcml2YXRlLT5waHlzbGluZWJ5dGVzICsgCi0gICAgICBzY3JfeDEgKiBieXRlc1BlclBpeGVsOwotCi0gICAgcHJpdmF0ZS0+YmxpdEZ1bmMoc3JjX3N0YXJ0LAotCQkgICAgICBzaGFkb3dSaWdodERlbHRhLCAKLQkJICAgICAgc2hhZG93RG93bkRlbHRhLCAKLQkJICAgICAgZHN0X3N0YXJ0LAotCQkgICAgICBwcml2YXRlLT5waHlzbGluZWJ5dGVzLAotCQkgICAgICBzY3JfeDIgLSBzY3JfeDEsCi0JCSAgICAgIHNjcl95MiAtIHNjcl95MSk7Ci0gIH0KLX0KLQotaW50IFdTQ09OU19TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0gIHJldHVybiAwOwotfQotCi0vKgotICogTm90ZTogSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKLSAqIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KLSAqLwotdm9pZCBXU0NPTlNfVmlkZW9RdWl0KF9USElTKQotewotICBpbnQgbW9kZSA9IFdTRElTUExBWUlPX01PREVfRU1VTDsKLQotICBpZiAocHJpdmF0ZS0+c2hhZG93bWVtICE9IE5VTEwpIHsKLSAgICBTRExfZnJlZShwcml2YXRlLT5zaGFkb3dtZW0pOwotICAgIHByaXZhdGUtPnNoYWRvd21lbSA9IE5VTEw7Ci0gIH0KLSAgcHJpdmF0ZS0+ZmJzdGFydCA9IE5VTEw7Ci0gIGlmICh0aGlzLT5zY3JlZW4gIT0gTlVMTCkgewotICAgIHRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsKLSAgfQotCi0gIGlmIChwcml2YXRlLT5TRExfbW9kZWxpc3RbMF0gIT0gTlVMTCkgewotICAgIFNETF9mcmVlKHByaXZhdGUtPlNETF9tb2RlbGlzdFswXSk7Ci0gICAgcHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdID0gTlVMTDsKLSAgfQotCi0gIGlmIChpb2N0bChwcml2YXRlLT5mZCwgV1NESVNQTEFZSU9fU01PREUsICZtb2RlKSA9PSAtMSkgewotICAgIFdTQ09OU19SZXBvcnRFcnJvcigiaW9jdGwgU01PREUiKTsKLSAgfQotCi0gIFdTQ09OU19SZWxlYXNlS2V5Ym9hcmQodGhpcyk7Ci0KLSAgaWYgKHByaXZhdGUtPmZkICE9IC0xKSB7Ci0gICAgY2xvc2UocHJpdmF0ZS0+ZmQpOwotICAgIHByaXZhdGUtPmZkID0gLTE7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnN2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc3ZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjIwM2YuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc3ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX3dzY29uc3ZpZGVvX2gKLSNkZWZpbmUgX1NETF93c2NvbnN2aWRlb19oCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDxkZXYvd3Njb25zL3dzY29uc2lvLmg+Ci0KLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICJTRExfbXV0ZXguaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotdm9pZCBXU0NPTlNfUmVwb3J0RXJyb3IoY2hhciAqZm10LCAuLi4pOwotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0jZGVmaW5lIHByaXZhdGUJKHRoaXMtPmhpZGRlbikKLQotLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgKi8KLQotdHlwZWRlZiB2b2lkIFdTQ09OU19iaXRCbGl0KFVpbnQ4ICpzcmNfcG9zLAotCQkJICAgIGludCBzcmNSaWdodERlbHRhLCAvLyBwaXhlbHMsIG5vdCBieXRlcwotCQkJICAgIGludCBzcmNEb3duRGVsdGEsICAvLyBwaXhlbHMsIG5vdCBieXRlcwotCQkJICAgIFVpbnQ4ICpkc3RfcG9zLAotCQkJICAgIGludCBkc3RfbGluZWJ5dGVzLAotCQkJICAgIGludCB3aWR0aCwKLQkJCSAgICBpbnQgaGVpZ2h0KTsKLQotc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKLSAgaW50IGZkOyAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yIG9mIG9wZW4gZGV2aWNlICovCi0gIHN0cnVjdCB3c2Rpc3BsYXlfZmJpbmZvIGluZm87IC8qIGZyYW1lIGJ1ZmZlciBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgaW50IHBoeXNsaW5lYnl0ZXM7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHBlciByb3cgKi8KLSAgaW50IHJlZE1hc2ssIGdyZWVuTWFzaywgYmx1ZU1hc2s7Ci0KLSAgVWludDggKmZic3RhcnQ7ICAgICAgICAgICAgICAgLyogVGhlc2UgcmVmZXIgdG8gdGhlIHN1cmZhY2UgdXNlZCwgKi8KLSAgaW50IGZibGluZWJ5dGVzOyAgICAgICAgICAgICAgLyogcGh5c2ljYWwgZnJhbWUgYnVmZmVyIG9yIHNoYWRvdy4gKi8KLQotICBzaXplX3QgZmJtZW1fbGVuOwotICBVaW50OCAqcGh5c21lbTsKLSAgVWludDggKnNoYWRvd21lbTsKLSAgaW50IHJvdGF0ZTsKLSAgaW50IHNoYWRvd0ZCOyAgICAgICAgICAgICAgICAgLyogVGVsbHMgd2hldGhlciBhIHNoYWRvdyBpcyBiZWluZyB1c2VkLiAqLwotCi0gIFdTQ09OU19iaXRCbGl0ICpibGl0RnVuYzsKLQotICBTRExfUmVjdCAqU0RMX21vZGVsaXN0WzJdOwotCi0gIHVuc2lnbmVkIGludCBrYmRUeXBlOwotICBpbnQgZGlkX3NhdmVfdHR5OwotICBzdHJ1Y3QgdGVybWlvcyBzYXZlZF90dHk7Ci19OwotCi0KLSNlbmRpZiAvKiBfU0RMX3dzY29uc3ZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFkZ2EuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFkZ2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4ZTdkOS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZGdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIHRvIGVuYWJsZSBER0EgbW91c2UuCi0gICBUaGVyZSBpcyBhIGNvbXBsZXRlbHkgc2VwYXJhdGUgREdBIGRyaXZlciB0aGF0IGlzIGZ1bGxzY3JlZW4tb25seS4KLSovCi0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKLSNpbmNsdWRlICJTRExfeDExZGdhX2MuaCIKLQotLyogR2xvYmFsIGZvciB0aGUgZXJyb3IgaGFuZGxlciAqLwotaW50IGRnYV9ldmVudCwgZGdhX2Vycm9yID0gLTE7Ci0KLXZvaWQgWDExX0VuYWJsZURHQU1vdXNlKF9USElTKQotewotI2lmIFNETF9WSURFT19EUklWRVJfWDExX0RHQU1PVVNFCi0gICAgc3RhdGljIGludCB1c2VfZGdhbW91c2UgPSAtMTsKLQotICAgIC8qIENoZWNrIGNvbmZpZ3VyYXRpb24gdG8gc2VlIGlmIHdlIHNob3VsZCB1c2UgREdBIG1vdXNlICovCi0gICAgaWYgKCB1c2VfZGdhbW91c2UgPCAwICkgewotICAgICAgICBpbnQgZGdhX21ham9yLCBkZ2FfbWlub3I7Ci0gICAgICAgIGludCBkZ2FfZmxhZ3M7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmVudl91c2VfZGdhbW91c2U7Ci0KLSAgICAgICAgdXNlX2RnYW1vdXNlID0gMTsKLSAgICAgICAgZW52X3VzZV9kZ2Ftb3VzZSA9IFNETF9nZXRlbnYoIlNETF9WSURFT19YMTFfREdBTU9VU0UiKTsKLSAgICAgICAgaWYgKCBlbnZfdXNlX2RnYW1vdXNlICkgewotICAgICAgICAgICAgdXNlX2RnYW1vdXNlID0gU0RMX2F0b2koZW52X3VzZV9kZ2Ftb3VzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ2hlY2sgZm9yIGJ1Z2d5IFggc2VydmVycyAqLwotICAgICAgICBpZiAoIHVzZV9kZ2Ftb3VzZSAmJiBCVUdHWV9YRlJFRTg2KD09LCA0MDAwKSApIHsKLSAgICAgICAgICAgIHVzZV9kZ2Ftb3VzZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhdXNlX2RnYW1vdXNlIHx8ICFsb2NhbF9YMTEgfHwKLSAgICAgICAgICAgICAhU0RMX05BTUUoWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uKShTRExfRGlzcGxheSwgJmRnYV9ldmVudCwgJmRnYV9lcnJvcikgfHwKLSAgICAgICAgICAgICAhU0RMX05BTUUoWEY4NkRHQVF1ZXJ5VmVyc2lvbikoU0RMX0Rpc3BsYXksICZkZ2FfbWFqb3IsICZkZ2FfbWlub3IpIHx8Ci0gICAgICAgICAgICAgIVNETF9OQU1FKFhGODZER0FRdWVyeURpcmVjdFZpZGVvKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgJmRnYV9mbGFncykgfHwKLSAgICAgICAgICAgICAhKGRnYV9mbGFncyAmIFhGODZER0FEaXJlY3RQcmVzZW50KSApIHsKLSAgICAgICAgICAgIHVzZV9kZ2Ftb3VzZSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHVzZV9kZ2Ftb3VzZSAmJiAhKHVzaW5nX2RnYSAmIERHQV9NT1VTRSkgKSB7Ci0JaWYgKCBTRExfTkFNRShYRjg2REdBRGlyZWN0VmlkZW8pKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuLCBYRjg2REdBRGlyZWN0TW91c2UpICkgewotICAgICAgICAgICAgdXNpbmdfZGdhIHw9IERHQV9NT1VTRTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9ER0FNT1VTRSAqLwotfQotCi0vKiBBcmdoLiAgR2xpZGUgcmVzZXRzIERHQSBtb3VzZSBtb2RlIHdoZW4gaXQgbWFrZXMgdGhlIGNvbnRleHQgY3VycmVudCEgKi8KLXZvaWQgWDExX0NoZWNrREdBTW91c2UoX1RISVMpCi17Ci0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfREdBTU9VU0UKLSAgICBpZiAoIHVzaW5nX2RnYSAmIERHQV9NT1VTRSApIHsKLQlTRExfTkFNRShYRjg2REdBRGlyZWN0VmlkZW8pKFNETF9EaXNwbGF5LFNETF9TY3JlZW4sWEY4NkRHQURpcmVjdE1vdXNlKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotdm9pZCBYMTFfRGlzYWJsZURHQU1vdXNlKF9USElTKQotewotI2lmIFNETF9WSURFT19EUklWRVJfWDExX0RHQU1PVVNFCi0gICAgaWYgKCB1c2luZ19kZ2EgJiBER0FfTU9VU0UgKSB7Ci0JU0RMX05BTUUoWEY4NkRHQURpcmVjdFZpZGVvKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgMCk7Ci0gICAgICAgIHVzaW5nX2RnYSAmPSB+REdBX01PVVNFOwotICAgIH0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9ER0FNT1VTRSAqLwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMWRnYV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZGdhX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiNDZkNS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZGdhX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCi0KLS8qIERpZmZlcmVudCBER0EgYWNjZXNzIHN0YXRlcyAqLwotI2RlZmluZSBER0FfR1JBUEhJQ1MJMHgwMQotI2RlZmluZSBER0FfS0VZQk9BUkQJMHgwMgotI2RlZmluZSBER0FfTU9VU0UJMHgwNAotCi1leHRlcm4gdm9pZCBYMTFfRW5hYmxlREdBTW91c2UoX1RISVMpOwotZXh0ZXJuIHZvaWQgWDExX0NoZWNrREdBTW91c2UoX1RISVMpOwotZXh0ZXJuIHZvaWQgWDExX0Rpc2FibGVER0FNb3VzZShfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZHluLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZHluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTdjMzIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMWR5bi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jZGVmaW5lIERFQlVHX0RZTkFNSUNfWDExIDAKLQotI2luY2x1ZGUgIlNETF94MTFkeW4uaCIKLQotI2lmIERFQlVHX0RZTkFNSUNfWDExCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jaWZkZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQwotCi0jaW5jbHVkZSAiU0RMX25hbWUuaCIKLSNpbmNsdWRlICJTRExfbG9hZHNvLmgiCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdm9pZCAqbGliOwotICAgIGNvbnN0IGNoYXIgKmxpYm5hbWU7Ci19IHgxMWR5bmxpYjsKLQotI2lmbmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDCi0jZGVmaW5lIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUMgTlVMTAotI2VuZGlmCi0jaWZuZGVmIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWEVYVAotI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hFWFQgTlVMTAotI2VuZGlmCi0jaWZuZGVmIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWFJFTkRFUgotI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSRU5ERVIgTlVMTAotI2VuZGlmCi0jaWZuZGVmIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWFJBTkRSCi0jZGVmaW5lIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWFJBTkRSIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgeDExZHlubGliIHgxMWxpYnNbXSA9Ci17Ci0gICAgeyBOVUxMLCBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDIH0sCi0gICAgeyBOVUxMLCBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hFWFQgfSwKLSAgICB7IE5VTEwsIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWFJFTkRFUiB9LAotICAgIHsgTlVMTCwgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YUkFORFIgfSwKLX07Ci0KLXN0YXRpYyB2b2lkIFgxMV9HZXRTeW0oY29uc3QgY2hhciAqZm5uYW1lLCBpbnQgKnJjLCB2b2lkICoqZm4pCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IFNETF9UQUJMRVNJWkUoeDExbGlicyk7IGkrKykgewotCQlpZiAoeDExbGlic1tpXS5saWIgIT0gTlVMTCkKLQkJewotCQkJKmZuID0gU0RMX0xvYWRGdW5jdGlvbih4MTFsaWJzW2ldLmxpYiwgZm5uYW1lKTsKLQkJCWlmICgqZm4gIT0gTlVMTCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCSNpZiBERUJVR19EWU5BTUlDX1gxMQotCWlmICgqZm4gIT0gTlVMTCkKLQkJcHJpbnRmKCJYMTE6IEZvdW5kICclcycgaW4gJXMgKCVwKVxuIiwgZm5uYW1lLCB4MTFsaWJzW2ldLmxpYm5hbWUsICpmbik7Ci0JZWxzZQotCQlwcmludGYoIlgxMTogU3ltYm9sICclcycgTk9UIEZPVU5EIVxuIiwgZm5uYW1lKTsKLQkjZW5kaWYKLQotCWlmICgqZm4gPT0gTlVMTCkKLQkJKnJjID0gMDsgIC8qIGtpbGwgdGhpcyBtb2R1bGUuICovCi19Ci0KLQotLyogRGVmaW5lIGFsbCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIHdyYXBwZXJzLi4uICovCi0jZGVmaW5lIFNETF9YMTFfTU9EVUxFKG1vZG5hbWUpCi0jZGVmaW5lIFNETF9YMTFfU1lNKHJjLGZuLHBhcmFtcyxhcmdzLHJldCkgXAotCXN0YXRpYyByYyAoKnAjI2ZuKSBwYXJhbXMgPSBOVUxMOyBcCi0JcmMgZm4gcGFyYW1zIHsgcmV0IHAjI2ZuIGFyZ3MgOyB9Ci0jaW5jbHVkZSAiU0RMX3gxMXN5bS5oIgotI3VuZGVmIFNETF9YMTFfTU9EVUxFCi0jdW5kZWYgU0RMX1gxMV9TWU0KLSNlbmRpZiAgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQyAqLwotCi0vKiBBbm5veWluZyB2YXJhcmdzIGVudHJ5IHBvaW50Li4uICovCi0jaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCi1YSUMgKCpwWENyZWF0ZUlDKShYSU0sLi4uKSA9IE5VTEw7Ci1jaGFyICooKnBYR2V0SUNWYWx1ZXMpKFhJQywgLi4uKSA9IE5VTEw7Ci0jZW5kaWYKLQotLyogVGhlc2UgU0RMX1gxMV9IQVZFXyogZmxhZ3MgYXJlIGhlcmUgd2hldGhlciB5b3UgaGF2ZSBkeW5hbWljIFgxMSBvciBub3QuICovCi0jZGVmaW5lIFNETF9YMTFfTU9EVUxFKG1vZG5hbWUpIGludCBTRExfWDExX0hBVkVfIyNtb2RuYW1lID0gMTsKLSNkZWZpbmUgU0RMX1gxMV9TWU0ocmMsZm4scGFyYW1zLGFyZ3MscmV0KQotI2luY2x1ZGUgIlNETF94MTFzeW0uaCIKLSN1bmRlZiBTRExfWDExX01PRFVMRQotI3VuZGVmIFNETF9YMTFfU1lNCi0KLQotc3RhdGljIHZvaWQgKlNETF9YR2V0UmVxdWVzdF93b3JrYXJvdW5kKERpc3BsYXkqIGRweSwgQ0FSRDggdHlwZSwgc2l6ZV90IGxlbikKLXsKLQl4UmVxICpyZXE7Ci0JV09SRDY0QUxJR04KLQlpZiAoZHB5LT5idWZwdHIgKyBsZW4gPiBkcHktPmJ1Zm1heCkKLQkJX1hGbHVzaChkcHkpOwotCWRweS0+bGFzdF9yZXEgPSBkcHktPmJ1ZnB0cjsKLQlyZXEgPSAoeFJlcSopZHB5LT5idWZwdHI7Ci0JcmVxLT5yZXFUeXBlID0gdHlwZTsKLQlyZXEtPmxlbmd0aCA9IGxlbiAvIDQ7Ci0JZHB5LT5idWZwdHIgKz0gbGVuOwotCWRweS0+cmVxdWVzdCsrOwotCXJldHVybiByZXE7Ci19Ci0KLXN0YXRpYyBpbnQgeDExX2xvYWRfcmVmY291bnQgPSAwOwotCi12b2lkIFNETF9YMTFfVW5sb2FkU3ltYm9scyh2b2lkKQotewotCSNpZmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDCi0JLyogRG9uJ3QgYWN0dWFsbHkgdW5sb2FkIGlmIG1vcmUgdGhhbiBvbmUgbW9kdWxlIGlzIHVzaW5nIHRoZSBsaWJzLi4uICovCi0JaWYgKHgxMV9sb2FkX3JlZmNvdW50ID4gMCkgewotCQlpZiAoLS14MTFfbG9hZF9yZWZjb3VudCA9PSAwKSB7Ci0JCQlpbnQgaTsKLQotCQkJLyogc2V0IGFsbCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgdG8gTlVMTC4gKi8KLQkJCSNkZWZpbmUgU0RMX1gxMV9NT0RVTEUobW9kbmFtZSkgU0RMX1gxMV9IQVZFXyMjbW9kbmFtZSA9IDE7Ci0JCQkjZGVmaW5lIFNETF9YMTFfU1lNKHJjLGZuLHBhcmFtcyxhcmdzLHJldCkgcCMjZm4gPSBOVUxMOwotCQkJI2luY2x1ZGUgIlNETF94MTFzeW0uaCIKLQkJCSN1bmRlZiBTRExfWDExX01PRFVMRQotCQkJI3VuZGVmIFNETF9YMTFfU1lNCi0KLQkJCSNpZmRlZiBYX0hBVkVfVVRGOF9TVFJJTkcKLQkJCXBYQ3JlYXRlSUMgPSBOVUxMOwotCQkJcFhHZXRJQ1ZhbHVlcyA9IE5VTEw7Ci0JCQkjZW5kaWYKLQotCQkJZm9yIChpID0gMDsgaSA8IFNETF9UQUJMRVNJWkUoeDExbGlicyk7IGkrKykgewotCQkJCWlmICh4MTFsaWJzW2ldLmxpYiAhPSBOVUxMKSB7Ci0JCQkJCVNETF9VbmxvYWRPYmplY3QoeDExbGlic1tpXS5saWIpOwotCQkJCQl4MTFsaWJzW2ldLmxpYiA9IE5VTEw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCSNlbmRpZgotfQotCi0vKiByZXR1cm5zIG5vbi16ZXJvIGlmIGFsbCBuZWVkZWQgc3ltYm9scyB3ZXJlIGxvYWRlZC4gKi8KLWludCBTRExfWDExX0xvYWRTeW1ib2xzKHZvaWQpCi17Ci0JaW50IHJjID0gMTsgIC8qIGFsd2F5cyBzdWNjZWVkIGlmIG5vdCB1c2luZyBEeW5hbWljIFgxMSBzdHVmZi4gKi8KLQotCSNpZmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDCi0JLyogZGVhbCB3aXRoIG11bHRpcGxlIG1vZHVsZXMgKGRnYSwgeDExLCBldGMpIG5lZWRpbmcgdGhlc2Ugc3ltYm9scy4uLiAqLwotCWlmICh4MTFfbG9hZF9yZWZjb3VudCsrID09IDApIHsKLQkJaW50IGk7Ci0JCWludCAqdGhpc21vZCA9IE5VTEw7Ci0JCWZvciAoaSA9IDA7IGkgPCBTRExfVEFCTEVTSVpFKHgxMWxpYnMpOyBpKyspIHsKLQkJCWlmICh4MTFsaWJzW2ldLmxpYm5hbWUgIT0gTlVMTCkgewotCQkJCXgxMWxpYnNbaV0ubGliID0gU0RMX0xvYWRPYmplY3QoeDExbGlic1tpXS5saWJuYW1lKTsKLQkJCX0KLQkJfQotCQkjZGVmaW5lIFNETF9YMTFfTU9EVUxFKG1vZG5hbWUpIHRoaXNtb2QgPSAmU0RMX1gxMV9IQVZFXyMjbW9kbmFtZTsKLQkJI2RlZmluZSBTRExfWDExX1NZTShhLGZuLHgseSx6KSBYMTFfR2V0U3ltKCNmbix0aGlzbW9kLCh2b2lkKiopJnAjI2ZuKTsKLQkJI2luY2x1ZGUgIlNETF94MTFzeW0uaCIKLQkJI3VuZGVmIFNETF9YMTFfTU9EVUxFCi0JCSN1bmRlZiBTRExfWDExX1NZTQotCi0JCSNpZmRlZiBYX0hBVkVfVVRGOF9TVFJJTkcKLQkJWDExX0dldFN5bSgiWENyZWF0ZUlDIiwmU0RMX1gxMV9IQVZFX1VURjgsKHZvaWQgKiopJnBYQ3JlYXRlSUMpOwotCQlYMTFfR2V0U3ltKCJYR2V0SUNWYWx1ZXMiLCZTRExfWDExX0hBVkVfVVRGOCwodm9pZCAqKikmcFhHZXRJQ1ZhbHVlcyk7Ci0JCSNlbmRpZgotCi0JCS8qCi0JCSAqIEluIGNhc2Ugd2UncmUgYnVpbHQgd2l0aCBuZXdlciBYbGliIGhlYWRlcnMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0JCSAqICB0aGF0IF9YR2V0UmVxdWVzdCgpIGlzIGF2YWlsYWJsZSwgZXZlbiBvbiBvbGRlciBzeXN0ZW1zLgotCQkgKiAgT3RoZXJ3aXNlLCB2YXJpb3VzIFhsaWIgbWFjcm9zIHdlIHVzZSB3aWxsIGNhbGwgYSBOVUxMIHBvaW50ZXIuCi0JCSAqLwotCQlpZiAoIVNETF9YMTFfSEFWRV9YR0VUUkVRVUVTVCkgewotCQkJcF9YR2V0UmVxdWVzdCA9IFNETF9YR2V0UmVxdWVzdF93b3JrYXJvdW5kOwotCQl9Ci0KLQkJaWYgKFNETF9YMTFfSEFWRV9CQVNFWExJQikgeyAgLyogYWxsIHJlcXVpcmVkIHN5bWJvbHMgbG9hZGVkLiAqLwotCQkJU0RMX0NsZWFyRXJyb3IoKTsKLQkJCVhJbml0VGhyZWFkcygpOwotCQl9IGVsc2UgewotCQkJU0RMX1gxMV9VbmxvYWRTeW1ib2xzKCk7ICAvKiBpbiBjYXNlIHNvbWV0aGluZyBnb3QgbG9hZGVkLi4uICovCi0JCQlyYyA9IDA7Ci0JCX0KLQl9Ci0JI2Vsc2UKLQkJI2lmIERFQlVHX0RZTkFNSUNfWDExCi0JCXByaW50ZigiWDExOiBObyBkeW5hbWljIFgxMSBzdXBwb3J0IGluIHRoaXMgYnVpbGQgb2YgU0RMLlxuIik7Ci0JCSNlbmRpZgotCQkjaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCi0JCXBYQ3JlYXRlSUMgPSBYQ3JlYXRlSUM7Ci0JCXBYR2V0SUNWYWx1ZXMgPSBYR2V0SUNWYWx1ZXM7Ci0JCSNlbmRpZgotCSNlbmRpZgotCi0JcmV0dXJuIHJjOwotfQotCi0vKiBlbmQgb2YgU0RMX3gxMWR5bi5jIC4uLiAqLwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZHluLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZHluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlN2U2Y2UuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMWR5bi5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF94MTFkeW5faAotI2RlZmluZSBfU0RMX3gxMWR5bl9oCi0KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgotI2luY2x1ZGUgPFgxMS9YbGliaW50Lmg+Ci0jaW5jbHVkZSA8WDExL1hwcm90by5oPgotCi0jaW5jbHVkZSAiLi4vWGV4dC9leHRlbnNpb25zL1hleHQuaCIKLSNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMvZXh0dXRpbC5oIgotCi0jaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKLSNpbmNsdWRlIDxzeXMvaXBjLmg+Ci0jaW5jbHVkZSA8c3lzL3NobS5oPgotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hTaG0uaD4KLSNlbmRpZgotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFJBTkRSCi0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWHJhbmRyLmg+Ci0jZW5kaWYKLQotLyoKLSAqIFdoZW4gdXNpbmcgdGhlICJkeW5hbWljIFgxMSIgZnVuY3Rpb25hbGl0eSwgd2UgZHVwbGljYXRlIGFsbCB0aGUgWGxpYgotICogIHN5bWJvbHMgdGhhdCB3b3VsZCBiZSByZWZlcmVuY2VkIGJ5IFNETCBpbnNpZGUgb2YgU0RMIGl0c2VsZi4KLSAqICBUaGVzZSBkdXBsaWNhdGVkIHN5bWJvbHMganVzdCBzZXJ2ZSBhcyBwYXNzdGhyb3VnaHMgdG8gdGhlIGZ1bmN0aW9ucwotICogIGluIFhsaWIsIHRoYXQgd2FzIGR5bmFtaWNhbGx5IGxvYWRlZC4KLSAqCi0gKiBUaGlzIGFsbG93cyB1cyB0byB1c2UgWGxpYiBhcy1pcyB3aGVuIGxpbmtpbmcgYWdhaW5zdCBpdCBkaXJlY3RseSwgYnV0Ci0gKiAgYWxzbyBoYW5kbGVzIGFsbCB0aGUgc3RyYW5nZSBjYXNlcyB3aGVyZSB0aGVyZSB3YXMgY29kZSBpbiB0aGUgWGxpYgotICogIGhlYWRlcnMgdGhhdCBtYXkgb3IgbWF5IG5vdCBleGlzdCBvciB2YXJ5IG9uIGEgZ2l2ZW4gcGxhdGZvcm0uCi0gKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogZXZpbCBmdW5jdGlvbiBzaWduYXR1cmVzLi4uICovCi10eXBlZGVmIEJvb2wgKCpTRExfWDExX1hFU2V0V2lyZVRvRXZlbnRSZXRUeXBlKShEaXNwbGF5KixYRXZlbnQqLHhFdmVudCopOwotdHlwZWRlZiBpbnQgKCpTRExfWDExX1hTeW5jaHJvbml6ZVJldFR5cGUpKERpc3BsYXkqKTsKLXR5cGVkZWYgU3RhdHVzICgqU0RMX1gxMV9YRVNldEV2ZW50VG9XaXJlUmV0VHlwZSkoRGlzcGxheSosWEV2ZW50Kix4RXZlbnQqKTsKLQotaW50IFNETF9YMTFfTG9hZFN5bWJvbHModm9pZCk7Ci12b2lkIFNETF9YMTFfVW5sb2FkU3ltYm9scyh2b2lkKTsKLQotLyogVGhhdCdzIHJlYWxseSBhbm5veWluZy4uLm1ha2UgdGhpcyBhIGZ1bmN0aW9uIHBvaW50ZXIgbm8gbWF0dGVyIHdoYXQuICovCi0jaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCi1leHRlcm4gWElDICgqcFhDcmVhdGVJQykoWElNLC4uLik7Ci1leHRlcm4gY2hhciAqKCpwWEdldElDVmFsdWVzKShYSUMsIC4uLik7Ci0jZW5kaWYKLQotLyogVGhlc2UgU0RMX1gxMV9IQVZFXyogZmxhZ3MgYXJlIGhlcmUgd2hldGhlciB5b3UgaGF2ZSBkeW5hbWljIFgxMSBvciBub3QuICovCi0jZGVmaW5lIFNETF9YMTFfTU9EVUxFKG1vZG5hbWUpIGV4dGVybiBpbnQgU0RMX1gxMV9IQVZFXyMjbW9kbmFtZTsKLSNkZWZpbmUgU0RMX1gxMV9TWU0ocmMsZm4scGFyYW1zLGFyZ3MscmV0KQotI2luY2x1ZGUgIlNETF94MTFzeW0uaCIKLSN1bmRlZiBTRExfWDExX01PRFVMRQotI3VuZGVmIFNETF9YMTFfU1lNCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvKiAhZGVmaW5lZCBfU0RMX3gxMWR5bl9oICovCi0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFldmVudHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0OGExOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBIYW5kbGUgdGhlIGV2ZW50IHN0cmVhbSwgY29udmVydGluZyBYMTEgZXZlbnRzIGludG8gU0RMIGV2ZW50cyAqLwotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLSNpbmNsdWRlIDxYMTEva2V5c3ltLmg+Ci0jaWZkZWYgX19TVlI0Ci0jaW5jbHVkZSA8WDExL1N1bmtleXN5bS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIlNETF90aW1lci5oIgotI2luY2x1ZGUgIlNETF9zeXN3bS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF94MTF2aWRlby5oIgotI2luY2x1ZGUgIlNETF94MTFkZ2FfYy5oIgotI2luY2x1ZGUgIlNETF94MTFtb2Rlc19jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMWltYWdlX2MuaCIKLSNpbmNsdWRlICJTRExfeDExZ2FtbWFfYy5oIgotI2luY2x1ZGUgIlNETF94MTF3bV9jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMW1vdXNlX2MuaCIKLSNpbmNsdWRlICJTRExfeDExZXZlbnRzX2MuaCIKLQotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBkZWJ1ZyBYMTEgZXZlbnRzICovCi0vKiNkZWZpbmUgREVCVUdfWEVWRU5UUyovCi0KLS8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZXMgZnJvbSBhbiBYMTEga2V5c3ltIHRvIGEgU0RMIGtleXN5bSAqLwotc3RhdGljIFNETEtleSBPRERfa2V5bWFwWzI1Nl07Ci1zdGF0aWMgU0RMS2V5IE1JU0Nfa2V5bWFwWzI1Nl07Ci1TRExLZXkgWDExX1RyYW5zbGF0ZUtleWNvZGUoRGlzcGxheSAqZGlzcGxheSwgS2V5Q29kZSBrYyk7Ci0KLQotI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORwotVWludDMyIFV0ZjhUb1VjczQoY29uc3QgVWludDggKnV0ZjgpCi17Ci0JVWludDMyIGM7Ci0JaW50IGkgPSAxOwotCWludCBub09jdGV0cyA9IDA7Ci0JaW50IGZpcnN0T2N0ZXRNYXNrID0gMDsKLQl1bnNpZ25lZCBjaGFyIGZpcnN0T2N0ZXQgPSB1dGY4WzBdOwotCWlmIChmaXJzdE9jdGV0IDwgMHg4MCkgewotCQkvKgotCQkgIENoYXJhY3RlcnMgaW4gdGhlIHJhbmdlOgotCQkgICAgMDAwMDAwMDAgdG8gMDExMTExMTEgKEFTQ0lJIFJhbmdlKQotCQkgIGFyZSBzdG9yZWQgaW4gb25lIG9jdGV0OgotCQkgICAgMHh4eHh4eHggKFRoZSBzYW1lIGFzIGl0cyBBU0NJSSByZXByZXNlbnRhdGlvbikKLQkJICBUaGUgbGVhc3QgNiBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBmaXJzdCBvY3RldCBpcyB0aGUgbW9zdCA2IHNpZ25pZmljYW50IG5vbnplcm8gYml0cwotCQkgIG9mIHRoZSBVQ1M0IHJlcHJlc2VudGF0aW9uLgotCQkqLwotCQlub09jdGV0cyA9IDE7Ci0JCWZpcnN0T2N0ZXRNYXNrID0gMHg3RjsgIC8qIDAoMTExMTExMSkgLSBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgaWdub3JlZCAqLwotCX0gZWxzZSBpZiAoKGZpcnN0T2N0ZXQgJiAweEUwKSAvKiBnZXQgdGhlIG1vc3QgMyBzaWduaWZpY2FudCBiaXRzIGJ5IEFORCdpbmcgd2l0aCAxMTEwMDAwMCAqLwotCSAgICAgICAgICAgICAgPT0gMHhDMCApIHsgIC8qIHNlZSBpZiB0aG9zZSAzIGJpdHMgYXJlIDExMC4gSWYgc28sIHRoZSBjaGFyIGlzIGluIHRoaXMgcmFuZ2UgKi8KLQkJLyoKLQkJICBDaGFyYWN0ZXJzIGluIHRoZSByYW5nZToKLQkJICAgIDAwMDAwMDAwIDEwMDAwMDAwIHRvIDAwMDAwMTExIDExMTExMTExCi0JCSAgYXJlIHN0b3JlZCBpbiB0d28gb2N0ZXRzOgotCQkgICAgMTEweHh4eHggMTB4eHh4eHgKLQkJICBUaGUgbGVhc3QgNSBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBmaXJzdCBvY3RldCBpcyB0aGUgbW9zdCA1IHNpZ25pZmljYW50IG5vbnplcm8gYml0cwotCQkgIG9mIHRoZSBVQ1M0IHJlcHJlc2VudGF0aW9uLgotCQkqLwotCQlub09jdGV0cyA9IDI7Ci0JCWZpcnN0T2N0ZXRNYXNrID0gMHgxRjsgIC8qIDAwMCgxMTExMSkgLSBUaGUgbW9zdCAzIHNpZ25pZmljYW50IGJpdHMgYXJlIGlnbm9yZWQgKi8KLQl9IGVsc2UgaWYgKChmaXJzdE9jdGV0ICYgMHhGMCkgLyogZ2V0IHRoZSBtb3N0IDQgc2lnbmlmaWNhbnQgYml0cyBieSBBTkQnaW5nIHdpdGggMTExMTAwMDAgKi8KLQkgICAgICAgICAgICAgID09IDB4RTApIHsgIC8qIHNlZSBpZiB0aG9zZSA0IGJpdHMgYXJlIDExMTAuIElmIHNvLCB0aGUgY2hhciBpcyBpbiB0aGlzIHJhbmdlICovCi0JCS8qCi0JCSAgQ2hhcmFjdGVycyBpbiB0aGUgcmFuZ2U6Ci0JCSAgICAwMDAwMTAwMCAwMDAwMDAwMCB0byAxMTExMTExMSAxMTExMTExMQotCQkgIGFyZSBzdG9yZWQgaW4gdGhyZWUgb2N0ZXRzOgotCQkgICAgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKLQkJICBUaGUgbGVhc3QgNCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBmaXJzdCBvY3RldCBpcyB0aGUgbW9zdCA0IHNpZ25pZmljYW50IG5vbnplcm8gYml0cwotCQkgIG9mIHRoZSBVQ1M0IHJlcHJlc2VudGF0aW9uLgotCQkqLwotCQlub09jdGV0cyA9IDM7Ci0JCWZpcnN0T2N0ZXRNYXNrID0gMHgwRjsgLyogMDAwMCgxMTExKSAtIFRoZSBtb3N0IDQgc2lnbmlmaWNhbnQgYml0cyBhcmUgaWdub3JlZCAqLwotCX0gZWxzZSBpZiAoKGZpcnN0T2N0ZXQgJiAweEY4KSAvKiBnZXQgdGhlIG1vc3QgNSBzaWduaWZpY2FudCBiaXRzIGJ5IEFORCdpbmcgd2l0aCAxMTExMTAwMCAqLwotCSAgICAgICAgICAgICAgPT0gMHhGMCkgeyAgLyogc2VlIGlmIHRob3NlIDUgYml0cyBhcmUgMTExMTAuIElmIHNvLCB0aGUgY2hhciBpcyBpbiB0aGlzIHJhbmdlICovCi0JCS8qCi0JCSAgQ2hhcmFjdGVycyBpbiB0aGUgcmFuZ2U6Ci0JCSAgICAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCB0byAwMDAxMTExMSAxMTExMTExMSAxMTExMTExMQotCQkgIGFyZSBzdG9yZWQgaW4gZm91ciBvY3RldHM6Ci0JCSAgICAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eAotCQkgIFRoZSBsZWFzdCAzIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGZpcnN0IG9jdGV0IGlzIHRoZSBtb3N0IDMgc2lnbmlmaWNhbnQgbm9uemVybyBiaXRzCi0JCSAgb2YgdGhlIFVDUzQgcmVwcmVzZW50YXRpb24uCi0JCSovCi0JCW5vT2N0ZXRzID0gNDsKLQkJZmlyc3RPY3RldE1hc2sgPSAweDA3OyAvKiAxMTExMCgxMTEpIC0gVGhlIG1vc3QgNSBzaWduaWZpY2FudCBiaXRzIGFyZSBpZ25vcmVkICovCi0JfSBlbHNlIGlmICgoZmlyc3RPY3RldCAmIDB4RkMpIC8qIGdldCB0aGUgbW9zdCA2IHNpZ25pZmljYW50IGJpdHMgYnkgQU5EJ2luZyB3aXRoIDExMTExMTAwICovCi0JICAgICAgICAgICAgICA9PSAweEY4KSB7IC8qIHNlZSBpZiB0aG9zZSA2IGJpdHMgYXJlIDExMTExMC4gSWYgc28sIHRoZSBjaGFyIGlzIGluIHRoaXMgcmFuZ2UgKi8KLQkJLyoKLQkJICBDaGFyYWN0ZXJzIGluIHRoZSByYW5nZToKLQkJICAgIDAwMDAwMDAwIDAwMTAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIHRvCi0JCSAgICAwMDAwMDAxMSAxMTExMTExMSAxMTExMTExMSAxMTExMTExMQotCQkgIGFyZSBzdG9yZWQgaW4gZml2ZSBvY3RldHM6Ci0JCSAgICAxMTExMTB4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eAotCQkgIFRoZSBsZWFzdCAyIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGZpcnN0IG9jdGV0IGlzIHRoZSBtb3N0IDIgc2lnbmlmaWNhbnQgbm9uemVybyBiaXRzCi0JCSAgb2YgdGhlIFVDUzQgcmVwcmVzZW50YXRpb24uCi0JCSovCi0JCW5vT2N0ZXRzID0gNTsKLQkJZmlyc3RPY3RldE1hc2sgPSAweDAzOyAvKiAxMTExMTAoMTEpIC0gVGhlIG1vc3QgNiBzaWduaWZpY2FudCBiaXRzIGFyZSBpZ25vcmVkICovCi0JfSBlbHNlIGlmICgoZmlyc3RPY3RldCAmIDB4RkUpIC8qIGdldCB0aGUgbW9zdCA3IHNpZ25pZmljYW50IGJpdHMgYnkgQU5EJ2luZyB3aXRoIDExMTExMTEwICovCi0JICAgICAgICAgICAgICA9PSAweEZDKSB7IC8qIHNlZSBpZiB0aG9zZSA3IGJpdHMgYXJlIDExMTExMTAuIElmIHNvLCB0aGUgY2hhciBpcyBpbiB0aGlzIHJhbmdlICovCi0JCS8qCi0JCSAgQ2hhcmFjdGVycyBpbiB0aGUgcmFuZ2U6Ci0JCSAgICAwMDAwMDEwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCB0bwotCQkgICAgMDExMTExMTEgMTExMTExMTEgMTExMTExMTEgMTExMTExMTEKLQkJICBhcmUgc3RvcmVkIGluIHNpeCBvY3RldHM6Ci0JCSAgICAxMTExMTEweCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eAotCQkgIFRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGZpcnN0IG9jdGV0IGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IG5vbnplcm8gYml0Ci0JCSAgb2YgdGhlIFVDUzQgcmVwcmVzZW50YXRpb24uCi0JCSovCi0JCW5vT2N0ZXRzID0gNjsKLQkJZmlyc3RPY3RldE1hc2sgPSAweDAxOyAvKiAxMTExMTEwKDEpIC0gVGhlIG1vc3QgNyBzaWduaWZpY2FudCBiaXRzIGFyZSBpZ25vcmVkICovCi0JfSBlbHNlCi0JCXJldHVybiAwOyAgLyogVGhlIGdpdmVuIGNodW5rIGlzIG5vdCBhIHZhbGlkIFVURi04IGVuY29kZWQgVW5pY29kZSBjaGFyYWN0ZXIgKi8KLQkKLQkvKgotCSAgVGhlIGxlYXN0IG5vT2N0ZXRzIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGZpcnN0IG9jdGV0IGlzIHRoZSBtb3N0IDIgc2lnbmlmaWNhbnQgbm9uemVybyBiaXRzCi0JICBvZiB0aGUgVUNTNCByZXByZXNlbnRhdGlvbi4KLQkgIFRoZSBmaXJzdCA2IGJpdHMgb2YgdGhlIFVDUzQgcmVwcmVzZW50YXRpb24gaXMgdGhlIGxlYXN0IDgtbm9PY3RldHMtMSBzaWduaWZpY2FudCBiaXRzIG9mCi0JICBmaXJzdE9jdGV0IGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IEFTQ0lJLiBJZiBzbywgaXQncyB0aGUgbGVhc3QgNyBzaWduaWZpY2FudCBiaXRzIG9mIGZpcnN0T2N0ZXQuCi0JICBUaGlzIGRvbmUgYnkgQU5EJ2luZyBmaXJzdE9jdGV0IHdpdGggaXRzIG1hc2sgdG8gdHJpbSB0aGUgYml0cyB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUKLQkgIG51bWJlciBvZiBjb250aW51aW5nIG9jdGV0cyAoaWYgYW55KSBhbmQgbGVhdmUgb25seSB0aGUgZnJlZSBiaXRzICh0aGUgeCdzKQotCSAgU2FtcGxlOgotCSAgMS1vY3RldDogICAgMHh4eHh4eHggICYgIDAxMTExMTExID0gMHh4eHh4eHgKLQkgIDItb2N0ZXRzOiAgMTEweHh4eHggICYgIDAwMDExMTExID0gMDAweHh4eHgKLQkqLwotCWMgPSBmaXJzdE9jdGV0ICYgZmlyc3RPY3RldE1hc2s7Ci0JCi0JLyogTm93LCBzdGFydCBmaWxsaW5nIGMudWNzNCB3aXRoIHRoZSBiaXRzIGZyb20gdGhlIGNvbnRpbnVpbmcgb2N0ZXRzIGZyb20gdXRmOC4gKi8KLQlmb3IgKGkgPSAxOyBpIDwgbm9PY3RldHM7IGkrKykgewotCQkvKiBBIHZhbGlkIGNvbnRpbnVpbmcgb2N0ZXQgaXMgb2YgdGhlIGZvcm0gMTB4eHh4eHggKi8KLQkJaWYgKCh1dGY4W2ldICYgMHhDMCkgLyogZ2V0IHRoZSBtb3N0IDIgc2lnbmlmaWNhbnQgYml0cyBieSBBTkQnaW5nIHdpdGggMTEwMDAwMDAgKi8KLQkJICAgICE9IDB4ODApIC8qIHNlZSBpZiB0aG9zZSAyIGJpdHMgYXJlIDEwLiBJZiBub3QsIHRoZSBpcyBhIG1hbGZvcm1lZCBzZXF1ZW5jZS4gKi8KLQkJCS8qVGhlIGdpdmVuIGNodW5rIGlzIGEgcGFydGlhbCBzZXF1ZW5jZSBhdCB0aGUgZW5kIG9mIGEgc3RyaW5nIHRoYXQgY291bGQKLQkJCSAgIGJlZ2luIGEgdmFsaWQgY2hhcmFjdGVyICovCi0JCQlyZXR1cm4gMDsKLQkJCi0JCS8qIE1ha2Ugcm9vbSBmb3IgdGhlIG5leHQgNi1iaXRzICovCi0JCWMgPDw9IDY7Ci0JCQotCQkvKgotCQkgIFRha2Ugb25seSB0aGUgbGVhc3QgNiBzaWduaWZpY2FuY2UgYml0cyBvZiB0aGUgY3VycmVudCBvY3RldCAodXRmOFtpXSkgYW5kIGZpbGwgdGhlIGNyZWF0ZWQgcm9vbQotCQkgIG9mIGMudWNzNCB3aXRoIHRoZW0uCi0JCSAgVGhpcyBkb25lIGJ5IEFORCdpbmcgdXRmOFtpXSB3aXRoIDAwMTExMTExIGFuZCB0aGUgT1InaW5nIHRoZSByZXN1bHQgd2l0aCBjLnVjczQuCi0JCSovCi0JCWMgfD0gdXRmOFtpXSAmIDB4M0Y7Ci0JfQotCXJldHVybiBjOwotfQotCi0vKiBHaXZlbiBhIFVURi04IGVuY29kZWQgc3RyaW5nIHBvaW50ZWQgdG8gYnkgdXRmOCBvZiBsZW5ndGggbGVuZ3RoIGluCi0gICBieXRlcywgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBVVEYtMTYgZW5jb2RlZCBzdHJpbmcgaW4gdGhlCi0gICBidWZmZXIgcG9pbnRlZCB0byBieSB1dGYxNi4gIFRoZSBtYXhpbXVtIG51bWJlciBvZiBVVEYtMTYgZW5jb2RpbmcKLSAgIHVuaXRzIChpLmUuLCBVbml0MTZzKSBhbGxvd2VkIGluIHRoZSBidWZmZXIgaXMgc3BlY2lmaWVkIGluCi0gICB1dGYxNl9tYXhfbGVuZ3RoLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIFVURi0xNgotICAgZW5jb2RpbmcgdW5pdHMgcGxhY2VkIGluIHRoZSBvdXRwdXQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdXRmMTYuCi0KLSAgIEluIGNhc2Ugb2YgYW4gZXJyb3IsIC0xIGlzIHJldHVybmVkLCBsZWF2aW5nIHNvbWUgdW51c2FibGUgcGFydGlhbAotICAgcmVzdWx0cyBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KLQotICAgVGhlIGNhbGxlciBtdXN0IGVzdGltYXRlIHRoZSBzaXplIG9mIHV0ZjE2IGJ1ZmZlciBieSBpdHNlbGYgYmVmb3JlCi0gICBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICBJbnN1ZmZpY2llbnQgb3V0cHV0IGJ1ZmZlciBpcyBjb25zaWRlcmVkIGFzCi0gICBhbiBlcnJvciwgYW5kIG9uY2UgYW4gZXJyb3Igb2NjdXJlZCwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGdpdmUgYW55Ci0gICBjbHVlIGhvdyBsYXJnZSB0aGUgcmVzdWx0IHdpbGwgYmUuCi0KLSAgIFRoZSBlcnJvciBjYXNlcyBpbmNsdWRlIGZvbGxvd2luZzoKLQotICAgLSBJbnZhbGlkIGJ5dGUgc2VxdWVuY2VzIHdlcmUgaW4gdGhlIGlucHV0IFVURi04IGJ5dGVzLiAgVGhlIGNhbGxlcgotICAgICBoYXMgbm8gd2F5IHRvIGtub3cgd2hhdCBwb2ludCBpbiB0aGUgaW5wdXQgYnVmZmVyIHdhcyB0aGUKLSAgICAgZXJyb3Jub3VzIGJ5dGUuCi0KLSAgIC0gVGhlIGlucHV0IGNvbnRhaW5lZCBhIGNoYXJhY3RlciAoYSB2YWxpZCBVVEYtOCBieXRlIHNlcXVlbmNlKQotICAgICB3aG9zZSBzY2FsYXIgdmFsdWUgZXhjZWVkZWQgdGhlIHJhbmdlIHRoYXQgVVRGLTE2IGNhbiByZXByZXNlbnQKLSAgICAgKGkuZS4sIGNoYXJhY3RlcnMgd2hvc2UgVW5pY29kZSBzY2FsYXIgdmFsdWUgYWJvdmUgMHgxMTAwMDApLgotCi0gICAtIFRoZSBvdXRwdXQgYnVmZmVyIGhhcyBubyBlbm91Z2ggc3BhY2UgdG8gaG9sZCBlbnRpcmUgdXRmMTYgZGF0YS4KLQotICAgUGxlYXNlIG5vdGU6Ci0KLSAgIC0gJ1wwJy10ZXJtaW5hdGlvbiBpcyBub3QgYXNzdW1lZCBib3RoIG9uIHRoZSBpbnB1dCBVVEYtOCBzdHJpbmcKLSAgICAgYW5kIG9uIHRoZSBvdXRwdXQgVVRGLTE2IHN0cmluZzsgYW55IGxlZ2FsIHplcm8gYnl0ZSBpbiB0aGUgaW5wdXQKLSAgICAgVVRGLTggc3RyaW5nIHdpbGwgYmUgY29udmVydGVkIHRvIGEgMTYtYml0IHplcm8gaW4gb3V0cHV0LiAgQXMgYQotICAgICBzaWRlIGVmZmVjdCwgdGhlIGxhc3QgVVRGLTE2IGVuY29kaW5nIHVuaXQgc3RvcmVkIGluIHRoZSBvdXRwdXQKLSAgICAgYnVmZmVyIHdpbGwgaGF2ZSBhIG5vbi16ZXJvIHZhbHVlIGlmIHRoZSBpbnB1dCBVVEYtOCB3YXMgbm90Ci0gICAgICdcMCctdGVybWluYXRlZC4KLQotICAgLSBVVEYtOCBhbGlhc2VzIGFyZSAqbm90KiBjb25zaWRlcmVkIGFzIGFuIGVycm9yLiAgVGhleSBhcmUKLSAgICAgY29udmVydGVkIHRvIFVURi0xNi4gIEZvciBleGFtcGxlLCAweEMwIDB4QTAsIDB4RTAgMHg4MCAweEEwLCAKLSAgICAgYW5kIDB4RjAgMHg4MCAweDgwIDB4QTAgYXJlIGFsbCBtYXBwZWQgdG8gYSBzaW5nbGUgVVRGLTE2Ci0gICAgIGVuY29kaW5nIHVuaXQgMHgwMDIwLgotCi0gICAtIFRocmVlIGJ5dGUgVVRGLTggc2VxdWVuY2VzIHdob3NlIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGEgc3Vycm9nYXRlCi0gICAgIGNvZGUgb3Igb3RoZXIgcmVzZXJ2ZWQgc2NhbGFyIHZhbHVlIGFyZSBub3QgY29uc2lkZXJlZCBhcyBhbgotICAgICBlcnJvciBlaXRoZXIuICBUaGV5IG1heSBjYXVzZSBhbiBpbnZhbGlkIFVURi0xNiBkYXRhIChlLmcuLCB0aG9zZQotICAgICBjb250YWluaW5nIHVucGFpcmVkIHN1cnJvZ2F0ZXMpLgotCi0qLwotCi1zdGF0aWMgaW50IFV0ZjhUb1V0ZjE2KGNvbnN0IFVpbnQ4ICp1dGY4LCBjb25zdCBpbnQgdXRmOF9sZW5ndGgsIFVpbnQxNiAqdXRmMTYsIGNvbnN0IGludCB1dGYxNl9tYXhfbGVuZ3RoKSB7Ci0KLSAgICAvKiBwIG1vdmVzIG92ZXIgdGhlIG91dHB1dCBidWZmZXIuICBtYXhfcHRyIHBvaW50cyB0byB0aGUgbmV4dCB0byB0aGUgbGFzdCBzbG90IG9mIHRoZSBidWZmZXIuICAqLwotICAgIFVpbnQxNiAqcCA9IHV0ZjE2OwotICAgIFVpbnQxNiBjb25zdCAqY29uc3QgbWF4X3B0ciA9IHV0ZjE2ICsgdXRmMTZfbWF4X2xlbmd0aDsKLQotICAgIC8qIGVuZF9vZl9pbnB1dCBwb2ludHMgdG8gdGhlIGxhc3QgYnl0ZSBvZiBpbnB1dCBhcyBvcHBvc2VkIHRvIHRoZSBuZXh0IHRvIHRoZSBsYXN0IGJ5dGUuICAqLwotICAgIFVpbnQ4IGNvbnN0ICpjb25zdCBlbmRfb2ZfaW5wdXQgPSB1dGY4ICsgdXRmOF9sZW5ndGggLSAxOwotCi0gICAgd2hpbGUgKHV0ZjggPD0gZW5kX29mX2lucHV0KSB7Ci0JaWYgKHAgPj0gbWF4X3B0cikgewotCSAgICAvKiBObyBtb3JlIG91dHB1dCBzcGFjZS4gICovCi0JICAgIHJldHVybiAtMTsKLQl9Ci0JVWludDggY29uc3QgYyA9ICp1dGY4OwotCWlmIChjIDwgMHg4MCkgewotCSAgICAvKiBPbmUgYnl0ZSBBU0NJSS4gICovCi0JICAgICpwKysgPSBjOwotCSAgICB1dGY4ICs9IDE7Ci0JfSBlbHNlIGlmIChjIDwgMHhDMCkgewotCSAgICAvKiBGb2xsb3dlciBieXRlIHdpdGhvdXQgcHJlY2VlZGluZyBsZWFkZXIgYnl0ZXMuICAqLwotCSAgICByZXR1cm4gLTE7Ci0JfSBlbHNlIGlmIChjIDwgMHhFMCkgewotCSAgICAvKiBUd28gYnl0ZSBzZXF1ZW5jZS4gIFdlIG5lZWQgb25lIGZvbGxvd2VyIGJ5dGUuICAqLwotCSAgICBpZiAoZW5kX29mX2lucHV0IC0gdXRmOCA8IDEgfHwgKCgodXRmOFsxXSBeIDB4ODApKSAmIDB4QzApKSB7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCSAgICAqcCsrID0gKFVpbnQxNikoMHhDRjgwICsgKGMgPDwgNikgKyB1dGY4WzFdKTsKLQkgICAgdXRmOCArPSAyOwotCX0gZWxzZSBpZiAoYyA8IDB4RjApIHsKLQkgICAgLyogVGhyZWUgYnl0ZSBzZXF1ZW5jZS4gIFdlIG5lZWQgdHdvIGZvbGxvd2VyIGJ5dGUuICAqLwotCSAgICBpZiAoZW5kX29mX2lucHV0IC0gdXRmOCA8IDIgfHwgKCgodXRmOFsxXSBeIDB4ODApIHwgKHV0ZjhbMl0gXiAweDgwKSkgJiAweEMwKSkgewotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQkgICAgKnArKyA9IChVaW50MTYpKDB4REY4MCArIChjIDw8IDEyKSArICh1dGY4WzFdIDw8IDYpICsgdXRmOFsyXSk7Ci0JICAgIHV0ZjggKz0gMzsKLQl9IGVsc2UgaWYgKGMgPCAweEY4KSB7Ci0JICAgIGludCBwbGFuZTsKLQkgICAgLyogRm91ciBieXRlIHNlcXVlbmNlLiAgV2UgbmVlZCB0aHJlZSBmb2xsb3dlciBieXRlcy4gICovCi0JICAgIGlmIChlbmRfb2ZfaW5wdXQgLSB1dGY4IDwgMyB8fCAoKCh1dGY4WzFdIF4gMHg4MCkgfCAodXRmOFsyXSBeMHg4MCkgfCAodXRmOFszXSBeIDB4ODApKSAmIDB4QzApKSB7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCSAgICBwbGFuZSA9ICgtMHhDOCArIChjIDw8IDIpICsgKHV0ZjhbMV0gPj4gNCkpOwotCSAgICBpZiAocGxhbmUgPT0gMCkgewotCQkvKiBUaGlzIGZvdXIgYnl0ZSBzZXF1ZW5jZSBpcyBhbiBhbGlhcyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gYSBVbmljb2RlIHNjYWxhciB2YWx1ZSBpbiBCTVAuCi0JCSAgIEl0IGZpdHMgaW4gYW4gVVRGLTE2IGVuY29kaW5nIHVuaXQuICAqLwotCQkqcCsrID0gKFVpbnQxNikoMHhERjgwICsgKHV0ZjhbMV0gPDwgMTIpICsgKHV0ZjhbMl0gPDwgNikgKyB1dGY4WzNdKTsKLQkgICAgfSBlbHNlIGlmIChwbGFuZSA8PSAxNikgewotCQkvKiBUaGlzIGlzIGEgbGVnYWwgZm91ciBieXRlIHNlcXVlbmNlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzdXJyb2dhdGUgcGFpci4gICovCi0JCWlmIChwICsgMSA+PSBtYXhfcHRyKSB7Ci0JCSAgICAvKiBObyBlbm91Z2ggc3BhY2Ugb24gdGhlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBwYWlyLiAgKi8KLQkJICAgIHJldHVybiAtMTsKLQkJfQotCQkqcCsrID0gKFVpbnQxNikoMHhFNUI4ICsgKGMgPDwgOCkgKyAodXRmOFsxXSA8PCAyKSArICh1dGY4WzJdID4+IDQpKTsKLQkJKnArKyA9IChVaW50MTYpKDB4REI4MCArICgodXRmOFsyXSAmIDB4MEYpIDw8IDYpICsgdXRmOFszXSk7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIFRoaXMgZm91ciBieXRlIHNlcXVlbmNlIGlzIG91dCBvZiBVVEYtMTYgY29kZSBzcGFjZS4gICovCi0JCXJldHVybiAtMTsKLQkgICAgfQotCSAgICB1dGY4ICs9IDQ7Ci0JfSBlbHNlIHsKLQkgICAgLyogTG9uZ2VyIHNlcXVlbmNlIG9yIHVudXNlZCBieXRlLiAgKi8KLQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIHAgLSB1dGYxNjsKLX0KLQotI2VuZGlmCi0KLS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgcmVwZWF0ZWQga2V5LgotICAgKGlkZWEgc2hhbWVsZXNzbHkgbGlmdGVkIGZyb20gR0lJIC0tIHRoYW5rcyBndXlzISA6KQotICovCi1zdGF0aWMgaW50IFgxMV9LZXlSZXBlYXQoRGlzcGxheSAqZGlzcGxheSwgWEV2ZW50ICpldmVudCkKLXsKLQlYRXZlbnQgcGVla2V2ZW50OwotCWludCByZXBlYXRlZDsKLQotCXJlcGVhdGVkID0gMDsKLQlpZiAoIFhQZW5kaW5nKGRpc3BsYXkpICkgewotCQlYUGVla0V2ZW50KGRpc3BsYXksICZwZWVrZXZlbnQpOwotCQlpZiAoIChwZWVrZXZlbnQudHlwZSA9PSBLZXlQcmVzcykgJiYKLQkJICAgICAocGVla2V2ZW50LnhrZXkua2V5Y29kZSA9PSBldmVudC0+eGtleS5rZXljb2RlKSAmJgotCQkgICAgICgocGVla2V2ZW50LnhrZXkudGltZS1ldmVudC0+eGtleS50aW1lKSA8IDIpICkgewotCQkJcmVwZWF0ZWQgPSAxOwotCQkJWE5leHRFdmVudChkaXNwbGF5LCAmcGVla2V2ZW50KTsKLQkJfQotCX0KLQlyZXR1cm4ocmVwZWF0ZWQpOwotfQotCi0vKiBOb3RlOiAgVGhlIFggc2VydmVyIGJ1ZmZlcnMgYW5kIGFjY3VtdWxhdGVzIG1vdXNlIG1vdGlvbiBldmVudHMsIHNvCi0gICB0aGUgbW90aW9uIGV2ZW50IGdlbmVyYXRlZCBieSB0aGUgd2FycCBtYXkgbm90IGFwcGVhciBleGFjdGx5IGFzIHdlCi0gICBleHBlY3QgaXQgdG8uICBXZSB3b3JrIGFyb3VuZCB0aGlzIChhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZSkgYnkgb25seQotICAgd2FycGluZyB0aGUgcG9pbnRlciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVkZ2UsIGFuZCB0aGVuIHdhaXQgZm9yIGl0LgotKi8KLSNkZWZpbmUgTU9VU0VfRlVER0VfRkFDVE9SCTgKLQotc3RhdGljIF9faW5saW5lX18gaW50IFgxMV9XYXJwZWRNb3Rpb24oX1RISVMsIFhFdmVudCAqeGV2ZW50KQotewotCWludCB3LCBoLCBpOwotCWludCBkZWx0YXgsIGRlbHRheTsKLQlpbnQgcG9zdGVkOwotCi0JdyA9IFNETF9WaWRlb1N1cmZhY2UtPnc7Ci0JaCA9IFNETF9WaWRlb1N1cmZhY2UtPmg7Ci0JZGVsdGF4ID0geGV2ZW50LT54bW90aW9uLnggLSBtb3VzZV9sYXN0Lng7Ci0JZGVsdGF5ID0geGV2ZW50LT54bW90aW9uLnkgLSBtb3VzZV9sYXN0Lnk7Ci0jaWZkZWYgREVCVUdfTU9USU9OCi0gIHByaW50ZigiV2FycGVkIG1vdXNlIG1vdGlvbjogJWQsJWRcbiIsIGRlbHRheCwgZGVsdGF5KTsKLSNlbmRpZgotCW1vdXNlX2xhc3QueCA9IHhldmVudC0+eG1vdGlvbi54OwotCW1vdXNlX2xhc3QueSA9IHhldmVudC0+eG1vdGlvbi55OwotCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgZGVsdGF4LCBkZWx0YXkpOwotCi0JaWYgKCAoeGV2ZW50LT54bW90aW9uLnggPCBNT1VTRV9GVURHRV9GQUNUT1IpIHx8Ci0JICAgICAoeGV2ZW50LT54bW90aW9uLnggPiAody1NT1VTRV9GVURHRV9GQUNUT1IpKSB8fAotCSAgICAgKHhldmVudC0+eG1vdGlvbi55IDwgTU9VU0VfRlVER0VfRkFDVE9SKSB8fAotCSAgICAgKHhldmVudC0+eG1vdGlvbi55ID4gKGgtTU9VU0VfRlVER0VfRkFDVE9SKSkgKSB7Ci0JCS8qIEdldCB0aGUgZXZlbnRzIHRoYXQgaGF2ZSBhY2N1bXVsYXRlZCAqLwotCQl3aGlsZSAoIFhDaGVja1R5cGVkRXZlbnQoU0RMX0Rpc3BsYXksIE1vdGlvbk5vdGlmeSwgeGV2ZW50KSApIHsKLQkJCWRlbHRheCA9IHhldmVudC0+eG1vdGlvbi54IC0gbW91c2VfbGFzdC54OwotCQkJZGVsdGF5ID0geGV2ZW50LT54bW90aW9uLnkgLSBtb3VzZV9sYXN0Lnk7Ci0jaWZkZWYgREVCVUdfTU9USU9OCi0gIHByaW50ZigiRXh0cmEgbW91c2UgbW90aW9uOiAlZCwlZFxuIiwgZGVsdGF4LCBkZWx0YXkpOwotI2VuZGlmCi0JCQltb3VzZV9sYXN0LnggPSB4ZXZlbnQtPnhtb3Rpb24ueDsKLQkJCW1vdXNlX2xhc3QueSA9IHhldmVudC0+eG1vdGlvbi55OwotCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgZGVsdGF4LCBkZWx0YXkpOwotCQl9Ci0JCW1vdXNlX2xhc3QueCA9IHcvMjsKLQkJbW91c2VfbGFzdC55ID0gaC8yOwotCQlYV2FycFBvaW50ZXIoU0RMX0Rpc3BsYXksIE5vbmUsIFNETF9XaW5kb3csIDAsIDAsIDAsIDAsCi0JCQkJCW1vdXNlX2xhc3QueCwgbW91c2VfbGFzdC55KTsKLQkJZm9yICggaT0wOyBpPDEwOyArK2kgKSB7Ci0gICAgICAgIAkJWE1hc2tFdmVudChTRExfRGlzcGxheSwgUG9pbnRlck1vdGlvbk1hc2ssIHhldmVudCk7Ci0JCQlpZiAoICh4ZXZlbnQtPnhtb3Rpb24ueCA+Ci0JCQkgICAgICAgICAgKG1vdXNlX2xhc3QueC1NT1VTRV9GVURHRV9GQUNUT1IpKSAmJgotCQkJICAgICAoeGV2ZW50LT54bW90aW9uLnggPAotCQkJICAgICAgICAgIChtb3VzZV9sYXN0LngrTU9VU0VfRlVER0VfRkFDVE9SKSkgJiYKLQkJCSAgICAgKHhldmVudC0+eG1vdGlvbi55ID4KLQkJCSAgICAgICAgICAobW91c2VfbGFzdC55LU1PVVNFX0ZVREdFX0ZBQ1RPUikpICYmCi0JCQkgICAgICh4ZXZlbnQtPnhtb3Rpb24ueSA8Ci0JCQkgICAgICAgICAgKG1vdXNlX2xhc3QueStNT1VTRV9GVURHRV9GQUNUT1IpKSApIHsKLQkJCQlicmVhazsKLQkJCX0KLSNpZmRlZiBERUJVR19YRVZFTlRTCi0gIHByaW50ZigiTG9zdCBtb3VzZSBtb3Rpb246ICVkLCVkXG4iLCB4ZXZlbnQtPnhtb3Rpb24ueCwgeGV2ZW50LT54bW90aW9uLnkpOwotI2VuZGlmCi0JCX0KLSNpZmRlZiBERUJVR19YRVZFTlRTCi0JCWlmICggaSA9PSAxMCApIHsKLQkJCXByaW50ZigiV2FybmluZzogZGlkbid0IGRldGVjdCBtb3VzZSB3YXJwIG1vdGlvblxuIik7Ci0JCX0KLSNlbmRpZgotCX0KLQlyZXR1cm4ocG9zdGVkKTsKLX0KLQotc3RhdGljIGludCBYMTFfRGlzcGF0Y2hFdmVudChfVEhJUykKLXsKLQlpbnQgcG9zdGVkOwotCVhFdmVudCB4ZXZlbnQ7Ci0KLQlTRExfbWVtc2V0KCZ4ZXZlbnQsICdcMCcsIHNpemVvZiAoWEV2ZW50KSk7ICAvKiB2YWxncmluZCBmaXguIC0tcnlhbi4gKi8KLQlYTmV4dEV2ZW50KFNETF9EaXNwbGF5LCAmeGV2ZW50KTsKLQotCS8qIERpc2NhcmQgS2V5UmVsZWFzZSBhbmQgS2V5UHJlc3MgZXZlbnRzIGdlbmVyYXRlZCBieSBhdXRvLXJlcGVhdC4KLQkgICBXZSBuZWVkIHRvIGRvIGl0IGJlZm9yZSBwYXNzaW5nIGV2ZW50IHRvIFhGaWx0ZXJFdmVudC4gIE90aGVyd2lzZSwKLQkgICBLZXlSZWxlYXNlIGF3YXJlIElNcyBhcmUgY29uZnVzZWQuLi4gICovCi0JaWYgKCB4ZXZlbnQudHlwZSA9PSBLZXlSZWxlYXNlCi0JICAgICAmJiBYMTFfS2V5UmVwZWF0KFNETF9EaXNwbGF5LCAmeGV2ZW50KSApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0jaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCi0JLyogSWYgd2UgYXJlIHRyYW5zbGF0aW5nIHdpdGggSU0sIHdlIG5lZWQgdG8gcGFzcyBhbGwgZXZlbnRzCi0JICAgdG8gWEZpbHRlckV2ZW50LCBhbmQgZGlzY2FyZCB0aG9zZSBmaWx0ZXJlZCBldmVudHMgaW1tZWRpYXRlbHkuICAqLwotCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUKLQkgICAgICYmIFNETF9JTSAhPSBOVUxMCi0JICAgICAmJiBYRmlsdGVyRXZlbnQoJnhldmVudCwgTm9uZSkgKSB7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCi0JcG9zdGVkID0gMDsKLQlzd2l0Y2ggKHhldmVudC50eXBlKSB7Ci0KLQkgICAgLyogR2FpbmluZyBtb3VzZSBjb3ZlcmFnZT8gKi8KLQkgICAgY2FzZSBFbnRlck5vdGlmeTogewotI2lmZGVmIERFQlVHX1hFVkVOVFMKLXByaW50ZigiRW50ZXJOb3RpZnkhICglZCwlZClcbiIsIHhldmVudC54Y3Jvc3NpbmcueCwgeGV2ZW50Lnhjcm9zc2luZy55KTsKLWlmICggeGV2ZW50Lnhjcm9zc2luZy5tb2RlID09IE5vdGlmeUdyYWIgKQotcHJpbnRmKCJNb2RlOiBOb3RpZnlHcmFiXG4iKTsKLWlmICggeGV2ZW50Lnhjcm9zc2luZy5tb2RlID09IE5vdGlmeVVuZ3JhYiApCi1wcmludGYoIk1vZGU6IE5vdGlmeVVuZ3JhYlxuIik7Ci0jZW5kaWYKLQkJaWYgKCAoeGV2ZW50Lnhjcm9zc2luZy5tb2RlICE9IE5vdGlmeUdyYWIpICYmCi0JCSAgICAgKHhldmVudC54Y3Jvc3NpbmcubW9kZSAhPSBOb3RpZnlVbmdyYWIpICkgewotCQkJaWYgKCB0aGlzLT5pbnB1dF9ncmFiID09IFNETF9HUkFCX09GRiApIHsKLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7Ci0JCQl9Ci0JCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsCi0JCQkJCXhldmVudC54Y3Jvc3NpbmcueCwKLQkJCQkJeGV2ZW50Lnhjcm9zc2luZy55KTsKLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIC8qIExvc2luZyBtb3VzZSBjb3ZlcmFnZT8gKi8KLQkgICAgY2FzZSBMZWF2ZU5vdGlmeTogewotI2lmZGVmIERFQlVHX1hFVkVOVFMKLXByaW50ZigiTGVhdmVOb3RpZnkhICglZCwlZClcbiIsIHhldmVudC54Y3Jvc3NpbmcueCwgeGV2ZW50Lnhjcm9zc2luZy55KTsKLWlmICggeGV2ZW50Lnhjcm9zc2luZy5tb2RlID09IE5vdGlmeUdyYWIgKQotcHJpbnRmKCJNb2RlOiBOb3RpZnlHcmFiXG4iKTsKLWlmICggeGV2ZW50Lnhjcm9zc2luZy5tb2RlID09IE5vdGlmeVVuZ3JhYiApCi1wcmludGYoIk1vZGU6IE5vdGlmeVVuZ3JhYlxuIik7Ci0jZW5kaWYKLQkJaWYgKCAoeGV2ZW50Lnhjcm9zc2luZy5tb2RlICE9IE5vdGlmeUdyYWIpICYmCi0JCSAgICAgKHhldmVudC54Y3Jvc3NpbmcubW9kZSAhPSBOb3RpZnlVbmdyYWIpICYmCi0JCSAgICAgKHhldmVudC54Y3Jvc3NpbmcuZGV0YWlsICE9IE5vdGlmeUluZmVyaW9yKSApIHsKLQkJCWlmICggdGhpcy0+aW5wdXRfZ3JhYiA9PSBTRExfR1JBQl9PRkYgKSB7Ci0JCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOwotCQkJfSBlbHNlIHsKLQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsCi0JCQkJCQl4ZXZlbnQueGNyb3NzaW5nLngsCi0JCQkJCQl4ZXZlbnQueGNyb3NzaW5nLnkpOwotCQkJfQotCQl9Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgLyogR2FpbmluZyBpbnB1dCBmb2N1cz8gKi8KLQkgICAgY2FzZSBGb2N1c0luOiB7Ci0jaWZkZWYgREVCVUdfWEVWRU5UUwotcHJpbnRmKCJGb2N1c0luIVxuIik7Ci0jZW5kaWYKLQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUElOUFVURk9DVVMpOwotCi0jaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCi0JCWlmICggU0RMX0lDICE9IE5VTEwgKSB7Ci0JCQlYU2V0SUNGb2N1cyhTRExfSUMpOwotCQl9Ci0jZW5kaWYKLQkJLyogUXVldWUgZW50cnkgaW50byBmdWxsc2NyZWVuIG1vZGUgKi8KLQkJc3dpdGNoX3dhaXRpbmcgPSAweDAxIHwgU0RMX0ZVTExTQ1JFRU47Ci0JCXN3aXRjaF90aW1lID0gU0RMX0dldFRpY2tzKCkgKyAxNTAwOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIC8qIExvc2luZyBpbnB1dCBmb2N1cz8gKi8KLQkgICAgY2FzZSBGb2N1c091dDogewotI2lmZGVmIERFQlVHX1hFVkVOVFMKLXByaW50ZigiRm9jdXNPdXQhXG4iKTsKLSNlbmRpZgotCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQSU5QVVRGT0NVUyk7Ci0KLSNpZmRlZiBYX0hBVkVfVVRGOF9TVFJJTkcKLQkJaWYgKCBTRExfSUMgIT0gTlVMTCApIHsKLQkJCVhVbnNldElDRm9jdXMoU0RMX0lDKTsKLQkJfQotI2VuZGlmCi0JCS8qIFF1ZXVlIGxlYXZpbmcgZnVsbHNjcmVlbiBtb2RlICovCi0JCXN3aXRjaF93YWl0aW5nID0gMHgwMTsKLQkJc3dpdGNoX3RpbWUgPSBTRExfR2V0VGlja3MoKSArIDIwMDsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICAvKiBTb21lIElNIHJlcXVpcmVzIE1hcHBpbmdOb3RpZnkgdG8gYmUgcGFzc2VkIHRvCi0JICAgICAgIFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nIGJ5IHRoZSBhcHAuICAqLwotCSAgICBjYXNlIE1hcHBpbmdOb3RpZnk6IHsKLQkJWFJlZnJlc2hLZXlib2FyZE1hcHBpbmcoJnhldmVudC54bWFwcGluZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgLyogR2VuZXJhdGVkIHVwb24gRW50ZXJXaW5kb3cgYW5kIEZvY3VzSW4gKi8KLQkgICAgY2FzZSBLZXltYXBOb3RpZnk6IHsKLSNpZmRlZiBERUJVR19YRVZFTlRTCi1wcmludGYoIktleW1hcE5vdGlmeSFcbiIpOwotI2VuZGlmCi0JCVgxMV9TZXRLZXlib2FyZFN0YXRlKFNETF9EaXNwbGF5LCAgeGV2ZW50LnhrZXltYXAua2V5X3ZlY3Rvcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgLyogTW91c2UgbW90aW9uPyAqLwotCSAgICBjYXNlIE1vdGlvbk5vdGlmeTogewotCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCQlpZiAoIG1vdXNlX3JlbGF0aXZlICkgewotCQkJCWlmICggdXNpbmdfZGdhICYgREdBX01PVVNFICkgewotI2lmZGVmIERFQlVHX01PVElPTgotICBwcmludGYoIkRHQSBtb3Rpb246ICVkLCVkXG4iLCB4ZXZlbnQueG1vdGlvbi54X3Jvb3QsIHhldmVudC54bW90aW9uLnlfcm9vdCk7Ci0jZW5kaWYKLQkJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLAotCQkJCQkJCXhldmVudC54bW90aW9uLnhfcm9vdCwKLQkJCQkJCQl4ZXZlbnQueG1vdGlvbi55X3Jvb3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBvc3RlZCA9IFgxMV9XYXJwZWRNb3Rpb24odGhpcywmeGV2ZW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotI2lmZGVmIERFQlVHX01PVElPTgotICBwcmludGYoIlgxMSBtb3Rpb246ICVkLCVkXG4iLCB4ZXZlbnQueG1vdGlvbi54LCB4ZXZlbnQueG1vdGlvbi55KTsKLSNlbmRpZgotCQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwKLQkJCQkJCXhldmVudC54bW90aW9uLngsCi0JCQkJCQl4ZXZlbnQueG1vdGlvbi55KTsKLQkJCX0KLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIC8qIE1vdXNlIGJ1dHRvbiBwcmVzcz8gKi8KLQkgICAgY2FzZSBCdXR0b25QcmVzczogewotCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCAKLQkJCQkJeGV2ZW50LnhidXR0b24uYnV0dG9uLCAwLCAwKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICAvKiBNb3VzZSBidXR0b24gcmVsZWFzZT8gKi8KLQkgICAgY2FzZSBCdXR0b25SZWxlYXNlOiB7Ci0JCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCAKLQkJCQkJeGV2ZW50LnhidXR0b24uYnV0dG9uLCAwLCAwKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICAvKiBLZXkgcHJlc3M/ICovCi0JICAgIGNhc2UgS2V5UHJlc3M6IHsKLQkJU0RMX2tleXN5bSBrZXlzeW07Ci0JCUtleUNvZGUga2V5Y29kZSA9IHhldmVudC54a2V5LmtleWNvZGU7Ci0KLSNpZmRlZiBERUJVR19YRVZFTlRTCi1wcmludGYoIktleVByZXNzIChYMTEga2V5Y29kZSA9IDB4JVgpXG4iLCB4ZXZlbnQueGtleS5rZXljb2RlKTsKLSNlbmRpZgotCQkvKiBJZiB3ZSdyZSBub3QgZG9pbmcgdHJhbnNsYXRpb24sIHdlJ3JlIGRvbmUhICovCi0JCWlmICggIVNETF9UcmFuc2xhdGVVTklDT0RFICkgewotCQkJLyogR2V0IHRoZSB0cmFuc2xhdGVkIFNETCB2aXJ0dWFsIGtleXN5bSBhbmQgcHV0IGl0IG9uIHRoZSBxdWV1ZS4qLwotCQkJa2V5c3ltLnNjYW5jb2RlID0ga2V5Y29kZTsKLQkJCWtleXN5bS5zeW0gPSBYMTFfVHJhbnNsYXRlS2V5Y29kZShTRExfRGlzcGxheSwga2V5Y29kZSk7Ci0JCQlrZXlzeW0ubW9kID0gS01PRF9OT05FOwotCQkJa2V5c3ltLnVuaWNvZGUgPSAwOwotCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgJmtleXN5bSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIExvb2sgdXAgdGhlIHRyYW5zbGF0ZWQgdmFsdWUgZm9yIHRoZSBrZXkgZXZlbnQgKi8KLSNpZmRlZiBYX0hBVkVfVVRGOF9TVFJJTkcKLQkJaWYgKCBTRExfSUMgIT0gTlVMTCApIHsKLQkJCVN0YXR1cyBzdGF0dXM7Ci0JCQlLZXlTeW0geGtleXN5bTsKLQkJCWludCBpOwotCQkJLyogQSBVVEYtOCBjaGFyYWN0ZXIgY2FuIGJlIGF0IG1vc3QgNiBieXRlcyAqLwotCQkJLyogLi4uIEl0J3MgdHJ1ZSwgYnV0IFh1dGY4TG9va3VwU3RyaW5nIGNhbgotCQkJICAgcmV0dXJuIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVycy4gIE1vcmVvdmVyLAotCQkJICAgdGhlIHNwZWMuIHB1dCBubyB1cHBlciBib3VuZCwgc28gd2Ugc2hvdWxkCi0JCQkgICBiZSByZWFkeSBmb3IgbG9uZ2VyIHN0cmluZ3MuICAqLwotCQkJY2hhciBrZXlidWZbMzJdOwotCQkJY2hhciAqa2V5ZGF0YSA9IGtleWJ1ZjsKLQkJCWludCBjb3VudDsKLQkJCVVpbnQxNiB1dGYxNmJ1ZlszMl07Ci0JCQlVaW50MTYgKnV0ZjE2ZGF0YSA9IHV0ZjE2YnVmOwotCQkJaW50IHV0ZjE2c2l6ZTsKLQkJCWludCB1dGYxNmxlbmd0aDsKLQotCQkJY291bnQgPSBYdXRmOExvb2t1cFN0cmluZyhTRExfSUMsICZ4ZXZlbnQueGtleSwga2V5ZGF0YSwgc2l6ZW9mKGtleWJ1ZiksICZ4a2V5c3ltLCAmc3RhdHVzKTsKLQkJCWlmIChYQnVmZmVyT3ZlcmZsb3cgPT0gc3RhdHVzKSB7Ci0JCQkgIC8qIFRoZSBJTSBoYXMganVzdCBnZW5lcmF0ZWQgc29tZXdoYXQgbG9uZwotCQkJICAgICBzdHJpbmcuICBXZSBuZWVkIGEgbG9uZ2VyIGJ1ZmZlciBpbiB0aGlzCi0JCQkgICAgIGNhc2UuICAqLwotCQkJICBrZXlkYXRhID0gU0RMX21hbGxvYyhjb3VudCk7Ci0JCQkgIGlmICgga2V5ZGF0YSA9PSBOVUxMICkgewotCQkJICAgIFNETF9PdXRPZk1lbW9yeSgpOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCQkgIGNvdW50ID0gWHV0ZjhMb29rdXBTdHJpbmcoU0RMX0lDLCAmeGV2ZW50LnhrZXksIGtleWRhdGEsIGNvdW50LCAmeGtleXN5bSwgJnN0YXR1cyk7Ci0JCQl9Ci0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0KLQkJCWNhc2UgWEJ1ZmZlck92ZXJmbG93OiB7Ci0JCQkgIC8qIE9vcHMhICBXZSBoYXZlIGFsbG9jYXRlZCB0aGUgYnl0ZXMgYXMKLQkJCSAgICAgcmVxdWVzdGVkIGJ5IFh1dGY4TG9va3VwU3RyaW5nLCBzbyB0aGUKLQkJCSAgICAgbGVuZ3RoIG9mIHRoZSBidWZmZXIgbXVzdCBiZQotCQkJICAgICBzdWZmaWNpZW50LiAgVGhpcyBjYXNlIHNob3VsZCBuZXZlcgotCQkJICAgICBoYXBwZW4hICovCi0JCQkgIFNETF9TZXRFcnJvcigiWHV0ZjhMb29rdXBTdHJpbmcgaW5kaWNhdGVkIGEgZG91YmxlIGJ1ZmZlciBvdmVyZmxvdyEiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0KLQkJCWNhc2UgWExvb2t1cENoYXJzOgotCQkJY2FzZSBYTG9va3VwQm90aDogewotCQkJICBpZiAoMCA9PSBjb3VudCkgewotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0KLQkJCSAgLyogV2UgZ290IGEgY29udmVydGVkIHN0cmluZyBmcm9tIElNLiAgTWFrZQotCQkJICAgICBzdXJlIHRvIGRlbGl2ZXIgYWxsIGNoYXJhY3RlcnMgdG8gdGhlCi0JCQkgICAgIGFwcGxpY2F0aW9uIGFzIFNETCBldmVudHMuICBOb3RlIHRoYXQKLQkJCSAgICAgYW4gU0RMIGV2ZW50IGNhbiBvbmx5IGNhcnJ5IG9uZSBVVEYtMTYKLQkJCSAgICAgZW5jb2RpbmcgdW5pdCwgYW5kIGEgc3Vycm9nYXRlIHBhaXIgaXMKLQkJCSAgICAgZGVsaXZlcmVkIGFzIHR3byBTREwgZXZlbnRzLiAgSSBndWVzcwotCQkJICAgICB0aGlzIGJlaGF2aW91ciBpcyBwcm9iYWJseSBfaW1wb3J0ZWRfCi0JCQkgICAgIGZyb20gV2luZG93cyBvciBNYWNPUy4gIFRvIGRvIHNvLCB3ZSBuZWVkCi0JCQkgICAgIHRvIGNvbnZlcnQgdGhlIFVURi04IGRhdGEgaW50byBVVEYtMTYKLQkJCSAgICAgZGF0YSAobm90IFVDUzQvVVRGLTMyISkuICBXZSBuZWVkIGFuCi0JCQkgICAgIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgVVRGLTE2IGVuY29kaW5nCi0JCQkgICAgIHVuaXRzIGhlcmUuICBUaGUgd29yc3QgY2FzZSBpcyBwdXJlIEFTQ0lJCi0JCQkgICAgIHN0cmluZy4gIEFzc3VtZSBzby4gKi8KLQkJCSAgLyogSW4gMS4zIFNETCBtYXkgaGF2ZSBhIHRleHQgZXZlbnQgaW5zdGVhZCwgdGhhdAotCQkJICAgICBjYXJyaWVzIHRoZSB3aG9sZSBVVEYtOCBzdHJpbmcgd2l0aCBpdC4gKi8KLQkJCSAgdXRmMTZzaXplID0gY291bnQgKiBzaXplb2YoVWludDE2KTsKLQkJCSAgaWYgKHV0ZjE2c2l6ZSA+IHNpemVvZih1dGYxNmJ1ZikpIHsKLQkJCSAgICB1dGYxNmRhdGEgPSAoVWludDE2ICopIFNETF9tYWxsb2ModXRmMTZzaXplKTsKLQkJCSAgICBpZiAodXRmMTZkYXRhID09IE5VTEwpIHsKLQkJCSAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICB9Ci0JCQkgIHV0ZjE2bGVuZ3RoID0gVXRmOFRvVXRmMTYoKFVpbnQ4ICopa2V5ZGF0YSwgY291bnQsIHV0ZjE2ZGF0YSwgdXRmMTZzaXplKTsKLQkJCSAgaWYgKHV0ZjE2bGVuZ3RoIDwgMCkgewotCQkJICAgIC8qIFRoZSBrZXlkYXRhIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGJ5dGUKLQkJCSAgICAgICBzZXF1ZW5jZS4gIEl0IHNob3VsZCBiZSBhIGJ1ZyBvZiB0aGUgSU0KLQkJCSAgICAgICBvciBYbGliLi4uICovCi0JCQkgICAgU0RMX1NldEVycm9yKCJPb3BzISBYdXRmOExvb2t1cFN0cmluZyByZXR1cm5lZCBhbiBpbnZhbGlkIFVURi04IHNlcXVlbmNlISIpOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0KLQkJCSAgLyogRGVsaXZlciBhbGwgVVRGLTE2IGVuY29kaW5nIHVuaXRzLiAgQXQKLQkJCSAgICAgdGhpcyBtb21lbnQsIFNETCBldmVudCBxdWV1ZSBoYXMgYQotCQkJICAgICBmaXhlZCBzaXplICgxMjggZXZlbnRzKSwgYW5kIGFuIFNETAotCQkJICAgICBldmVudCBjYW4gaG9sZCBqdXN0IG9uZSBVVEYtMTYgZW5jb2RpbmcKLQkJCSAgICAgdW5pdC4gIFNvLCBpZiB3ZSByZWNlaXZlIG1vcmUgdGhhbiAxMjgKLQkJCSAgICAgVVRGLTE2IGVuY29kaW5nIHVuaXRzIGZyb20gYSBjb21taXQsCi0JCQkgICAgIGV4Y2VlZGVkIGNoYXJhY3RlcnMgd2lsbCBiZSBsb3N0LiAgKi8KLQkJCSAgZm9yIChpID0gMDsgaSA8IHV0ZjE2bGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQkgICAga2V5c3ltLnNjYW5jb2RlID0gMDsKLQkJCSAgICBrZXlzeW0uc3ltID0gU0RMS19VTktOT1dOOwotCQkJICAgIGtleXN5bS5tb2QgPSBLTU9EX05PTkU7Ci0JCQkgICAga2V5c3ltLnVuaWNvZGUgPSB1dGYxNmRhdGFbaV07Ci0JCQkgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgJmtleXN5bSk7Ci0JCQkgIH0KLQkJCSAgLyogVGhlIGtleXN5bSBmb3IgdGhlIGxhc3QgY2hhcmFjdGVyIGNhcnJpZXMgdGhlCi0JCQkgICAgIHNjYW5jb2RlIGFuZCBzeW1ib2wgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgWDExCi0JCQkgICAgIGtleWNvZGUuICAqLwotCQkJICBpZiAodXRmMTZsZW5ndGggPiAwKSB7CQkJICAgICAgIAotCQkJICAgIGtleXN5bS5zY2FuY29kZSA9IGtleWNvZGU7Ci0JCQkgICAga2V5c3ltLnN5bSA9IChrZXljb2RlID8gWDExX1RyYW5zbGF0ZUtleWNvZGUoU0RMX0Rpc3BsYXksIGtleWNvZGUpIDogMCk7Ci0JCQkgICAga2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsKLQkJCSAgICBrZXlzeW0udW5pY29kZSA9IHV0ZjE2ZGF0YVt1dGYxNmxlbmd0aCAtIDFdOwotCQkJICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsICZrZXlzeW0pOwotCQkJICB9Ci0JCQkgIGJyZWFrOwotCQkJfQotCi0JCQljYXNlIFhMb29rdXBLZXlTeW06IHsKLQkJCSAgLyogSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdGhhdAotCQkJICAgICBhIHplcm8ga2V5Y29kZSBtYWtlcyBYTG9va3VwS2V5U3ltCi0JCQkgICAgIHN0YXR1cy4gIFdoYXQgSSdtIHN1cmUgaXMgdGhhdCBhCi0JCQkgICAgIGNvbWJpbmF0aW9uIG9mIGEgemVybyBzY2FuIGNvZGUgYW5kIGEgbm9uCi0JCQkgICAgIHplcm8gc3ltIG1ha2VzIFNETF9Qcml2YXRlS2V5Ym9hcmQKLQkJCSAgICAgc3RyYW5nZSBzdGF0ZS4uLiAgU28sIGp1c3QgZGlzY2FyZCBpdC4KLQkJCSAgICAgSWYgdGhpcyBkb2Vzbid0IHdvcmssIEknbSByZWNlaXZpbmcgYnVnCi0JCQkgICAgIHJlcG9ydHMsIGFuZCBJIGNhbiBrbm93IHVuZGVyIHdoYXQKLQkJCSAgICAgY29uZGl0aW9uIHRoaXMgY2FzZSBoYXBwZW5zLiAgKi8KLQkJCSAgaWYgKGtleWNvZGUpIHsKLQkJCSAgICBrZXlzeW0uc2NhbmNvZGUgPSBrZXljb2RlOwotCQkJICAgIGtleXN5bS5zeW0gPSBYMTFfVHJhbnNsYXRlS2V5Y29kZShTRExfRGlzcGxheSwga2V5Y29kZSk7Ci0JCQkgICAga2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsKLQkJCSAgICBrZXlzeW0udW5pY29kZSA9IDA7Ci0JCQkgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgJmtleXN5bSk7Ci0JCQkgIH0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0KLQkJCWNhc2UgWExvb2t1cE5vbmU6IHsKLQkJCSAgLyogSU0gaGFzIGVhdGVuIHRoZSBldmVudC4gICovCi0JCQkgIGJyZWFrOwotCQkJfQotCi0JCQlkZWZhdWx0OgotCQkJICAvKiBBbiB1bmtub3duIHN0YXR1cyBmcm9tIFh1dGY4TG9va3VwU3RyaW5nLiAgKi8KLQkJCSAgU0RMX1NldEVycm9yKCJPb3BzISBYdXRmOExvb2t1cFN0cmluZ3JldHVybmVkIGFuIHVua25vd24gc3RhdHVzIik7Ci0JCQl9Ci0KLQkJCS8qIFJlbGVhc2UgZHluYW1pYyBidWZmZXJzIGlmIGFsbG9jYXRlZC4gICovCi0JCQlpZiAoa2V5ZGF0YSAhPSBOVUxMICYmIGtleWJ1ZiAhPSBrZXlkYXRhKSB7Ci0JCQkgIFNETF9mcmVlKGtleWRhdGEpOwotCQkJfQotCQkJaWYgKHV0ZjE2ZGF0YSAhPSBOVUxMICYmIHV0ZjE2YnVmICE9IHV0ZjE2ZGF0YSkgewotCQkJICBTRExfZnJlZSh1dGYxNmRhdGEpOwotCQkJfQotCQl9Ci0JCWVsc2UKLSNlbmRpZgotCQl7Ci0JCQlzdGF0aWMgWENvbXBvc2VTdGF0dXMgc3RhdGU7Ci0JCQljaGFyIGtleWJ1ZlszMl07Ci0KLQkJCWtleXN5bS5zY2FuY29kZSA9IGtleWNvZGU7Ci0JCQlrZXlzeW0uc3ltID0gWDExX1RyYW5zbGF0ZUtleWNvZGUoU0RMX0Rpc3BsYXksIGtleWNvZGUpOwotCQkJa2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsKLQkJCWtleXN5bS51bmljb2RlID0gMDsKLQkJCWlmICggWExvb2t1cFN0cmluZygmeGV2ZW50LnhrZXksCi0JCQkgICAgICAgICAgICAgICAgICAgIGtleWJ1Ziwgc2l6ZW9mKGtleWJ1ZiksCi0JCQkgICAgICAgICAgICAgICAgICAgIE5VTEwsICZzdGF0ZSkgKSB7Ci0JCQkJLyoKLQkJCQkqIEZJWE1FOiBYTG9va3VwU3RyaW5nKCkgbWF5IHlpZWxkIG1vcmUgdGhhbiBvbmUKLQkJCQkqIGNoYXJhY3Rlciwgc28gd2UgbmVlZCBhIG1lY2hhbmlzbSB0byBhbGxvdyBmb3IKLQkJCQkqIHRoaXMgKHBlcmhhcHMgbnVsbCBrZXlwcmVzcyBldmVudHMgd2l0aCBhCi0JCQkJKiB1bmljb2RlIHZhbHVlKQotCQkJCSovCi0JCQkJa2V5c3ltLnVuaWNvZGUgPSAoVWludDgpa2V5YnVmWzBdOwotCQkJfQotCi0JCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELCAma2V5c3ltKTsKLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIC8qIEtleSByZWxlYXNlPyAqLwotCSAgICBjYXNlIEtleVJlbGVhc2U6IHsKLQkJU0RMX2tleXN5bSBrZXlzeW07Ci0JCUtleUNvZGUga2V5Y29kZSA9IHhldmVudC54a2V5LmtleWNvZGU7Ci0KLQkJaWYgKGtleWNvZGUgPT0gMCkgewotCQkgIC8qIFRoZXJlIHNob3VsZCBiZSBubyBLZXlSZWxlYXNlIGZvciBrZXljb2RlID09IDAsCi0JCSAgICAgc2luY2UgaXQgaXMgYSBub3RpZmljYXRpb24gZnJvbSBJTSBidXQgYSByZWFsCi0JCSAgICAga2V5c3Ryb2tlLiAgKi8KLQkJICAvKiBXZSBuZWVkIHRvIGVtaXQgc29tZSBkaWFnbm9zdGljIG1lc3NhZ2UgaGVyZS4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQotI2lmZGVmIERFQlVHX1hFVkVOVFMKLXByaW50ZigiS2V5UmVsZWFzZSAoWDExIGtleWNvZGUgPSAweCVYKVxuIiwgeGV2ZW50LnhrZXkua2V5Y29kZSk7Ci0jZW5kaWYKLQotCQkvKiBHZXQgdGhlIHRyYW5zbGF0ZWQgU0RMIHZpcnR1YWwga2V5c3ltICovCi0JCWtleXN5bS5zY2FuY29kZSA9IGtleWNvZGU7Ci0JCWtleXN5bS5zeW0gPSBYMTFfVHJhbnNsYXRlS2V5Y29kZShTRExfRGlzcGxheSwga2V5Y29kZSk7Ci0JCWtleXN5bS5tb2QgPSBLTU9EX05PTkU7Ci0JCWtleXN5bS51bmljb2RlID0gMDsKLQotCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgJmtleXN5bSk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgLyogSGF2ZSB3ZSBiZWVuIGljb25pZmllZD8gKi8KLQkgICAgY2FzZSBVbm1hcE5vdGlmeTogewotI2lmZGVmIERFQlVHX1hFVkVOVFMKLXByaW50ZigiVW5tYXBOb3RpZnkhXG4iKTsKLSNlbmRpZgotCQkvKiBJZiB3ZSdyZSBhY3RpdmUsIG1ha2Ugb3Vyc2VsdmVzIGluYWN0aXZlICovCi0JCWlmICggU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQQUNUSVZFICkgewotCQkJLyogU3dhcCBvdXQgdGhlIGdhbW1hIGJlZm9yZSB3ZSBnbyBpbmFjdGl2ZSAqLwotCQkJWDExX1N3YXBWaWRNb2RlR2FtbWEodGhpcyk7Ci0KLQkJCS8qIFNlbmQgYW4gaW50ZXJuYWwgZGVhY3RpdmF0ZSBldmVudCAqLwotCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwKLQkJCQkJU0RMX0FQUEFDVElWRXxTRExfQVBQSU5QVVRGT0NVUyk7Ci0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICAvKiBIYXZlIHdlIGJlZW4gcmVzdG9yZWQ/ICovCi0JICAgIGNhc2UgTWFwTm90aWZ5OiB7Ci0jaWZkZWYgREVCVUdfWEVWRU5UUwotcHJpbnRmKCJNYXBOb3RpZnkhXG4iKTsKLSNlbmRpZgotCQkvKiBJZiB3ZSdyZSBub3QgYWN0aXZlLCBtYWtlIG91cnNlbHZlcyBhY3RpdmUgKi8KLQkJaWYgKCAhKFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUEFDVElWRSkgKSB7Ci0JCQkvKiBTZW5kIGFuIGludGVybmFsIGFjdGl2YXRlIGV2ZW50ICovCi0JCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQQUNUSVZFKTsKLQotCQkJLyogTm93IHRoYXQgd2UncmUgYWN0aXZlLCBzd2FwIHRoZSBnYW1tYSBiYWNrICovCi0JCQlYMTFfU3dhcFZpZE1vZGVHYW1tYSh0aGlzKTsKLQkJfQotCi0JCWlmICggU0RMX1ZpZGVvU3VyZmFjZSAmJgotCQkgICAgIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKLQkJCVgxMV9FbnRlckZ1bGxTY3JlZW4odGhpcyk7Ci0JCX0gZWxzZSB7Ci0JCQlYMTFfR3JhYklucHV0Tm9Mb2NrKHRoaXMsIHRoaXMtPmlucHV0X2dyYWIpOwotCQl9Ci0JCVgxMV9DaGVja01vdXNlTW9kZU5vTG9jayh0aGlzKTsKLQotCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCQlYMTFfUmVmcmVzaERpc3BsYXkodGhpcyk7Ci0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICAvKiBIYXZlIHdlIGJlZW4gcmVzaXplZCBvciBtb3ZlZD8gKi8KLQkgICAgY2FzZSBDb25maWd1cmVOb3RpZnk6IHsKLSNpZmRlZiBERUJVR19YRVZFTlRTCi1wcmludGYoIkNvbmZpZ3VyZU5vdGlmeSEgKHJlc2l6ZTogJWR4JWQpXG4iLCB4ZXZlbnQueGNvbmZpZ3VyZS53aWR0aCwgeGV2ZW50Lnhjb25maWd1cmUuaGVpZ2h0KTsKLSNlbmRpZgotCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCSAgICBpZiAoKHhldmVudC54Y29uZmlndXJlLndpZHRoICE9IFNETF9WaWRlb1N1cmZhY2UtPncpIHx8Ci0JCSAgICAgICAgKHhldmVudC54Y29uZmlndXJlLmhlaWdodCAhPSBTRExfVmlkZW9TdXJmYWNlLT5oKSkgewotCQkJLyogRklYTUU6IEZpbmQgYSBiZXR0ZXIgZml4IGZvciB0aGUgYnVnIHdpdGggS0RFIDEuMiAqLwotCQkJaWYgKCAhICgoeGV2ZW50Lnhjb25maWd1cmUud2lkdGggPT0gMzIpICYmCi0JCQkgICAgICAgICh4ZXZlbnQueGNvbmZpZ3VyZS5oZWlnaHQgPT0gMzIpKSApIHsKLQkJCQlTRExfUHJpdmF0ZVJlc2l6ZSh4ZXZlbnQueGNvbmZpZ3VyZS53aWR0aCwKLQkJCQkgICAgICAgICAgICAgICAgICB4ZXZlbnQueGNvbmZpZ3VyZS5oZWlnaHQpOwotCQkJfQotCQkgICAgfSBlbHNlIHsKLQkJCS8qIE9wZW5HTCB3aW5kb3dzIG5lZWQgdG8ga25vdyBhYm91dCB0aGUgY2hhbmdlICovCi0JCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCApIHsKLQkJCQlTRExfUHJpdmF0ZUV4cG9zZSgpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgLyogSGF2ZSB3ZSBiZWVuIHJlcXVlc3RlZCB0byBxdWl0IChvciBhbm90aGVyIGNsaWVudCBtZXNzYWdlPykgKi8KLQkgICAgY2FzZSBDbGllbnRNZXNzYWdlOiB7Ci0JCWlmICggKHhldmVudC54Y2xpZW50LmZvcm1hdCA9PSAzMikgJiYKLQkJICAgICAoeGV2ZW50LnhjbGllbnQuZGF0YS5sWzBdID09IFdNX0RFTEVURV9XSU5ET1cpICkKLQkJewotCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVRdWl0KCk7Ci0JCX0gZWxzZQotCQlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW1NETF9TWVNXTUVWRU5UXSA9PSBTRExfRU5BQkxFICkgewotCQkJU0RMX1N5c1dNbXNnIHdtbXNnOwotCi0JCQlTRExfVkVSU0lPTigmd21tc2cudmVyc2lvbik7Ci0JCQl3bW1zZy5zdWJzeXN0ZW0gPSBTRExfU1lTV01fWDExOwotCQkJd21tc2cuZXZlbnQueGV2ZW50ID0geGV2ZW50OwotCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVTeXNXTUV2ZW50KCZ3bW1zZyk7Ci0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICAvKiBEbyB3ZSBuZWVkIHRvIHJlZnJlc2ggb3Vyc2VsdmVzPyAqLwotCSAgICBjYXNlIEV4cG9zZTogewotI2lmZGVmIERFQlVHX1hFVkVOVFMKLXByaW50ZigiRXhwb3NlIChjb3VudCA9ICVkKVxuIiwgeGV2ZW50LnhleHBvc2UuY291bnQpOwotI2VuZGlmCi0JCWlmICggU0RMX1ZpZGVvU3VyZmFjZSAmJiAoeGV2ZW50LnhleHBvc2UuY291bnQgPT0gMCkgKSB7Ci0JCQlYMTFfUmVmcmVzaERpc3BsYXkodGhpcyk7Ci0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OiB7Ci0jaWZkZWYgREVCVUdfWEVWRU5UUwotcHJpbnRmKCJVbmhhbmRsZWQgZXZlbnQgJWRcbiIsIHhldmVudC50eXBlKTsKLSNlbmRpZgotCQkvKiBPbmx5IHBvc3QgdGhlIGV2ZW50IGlmIHdlJ3JlIHdhdGNoaW5nIGZvciBpdCAqLwotCQlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW1NETF9TWVNXTUVWRU5UXSA9PSBTRExfRU5BQkxFICkgewotCQkJU0RMX1N5c1dNbXNnIHdtbXNnOwotCi0JCQlTRExfVkVSU0lPTigmd21tc2cudmVyc2lvbik7Ci0JCQl3bW1zZy5zdWJzeXN0ZW0gPSBTRExfU1lTV01fWDExOwotCQkJd21tc2cuZXZlbnQueGV2ZW50ID0geGV2ZW50OwotCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVTeXNXTUV2ZW50KCZ3bW1zZyk7Ci0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JcmV0dXJuKHBvc3RlZCk7Ci19Ci0KLS8qIEFjayEgIFhQZW5kaW5nKCkgYWN0dWFsbHkgcGVyZm9ybXMgYSBibG9ja2luZyByZWFkIGlmIG5vIGV2ZW50cyBhdmFpbGFibGUgKi8KLWludCBYMTFfUGVuZGluZyhEaXNwbGF5ICpkaXNwbGF5KQotewotCS8qIEZsdXNoIHRoZSBkaXNwbGF5IGNvbm5lY3Rpb24gYW5kIGxvb2sgdG8gc2VlIGlmIGV2ZW50cyBhcmUgcXVldWVkICovCi0JWEZsdXNoKGRpc3BsYXkpOwotCWlmICggWEV2ZW50c1F1ZXVlZChkaXNwbGF5LCBRdWV1ZWRBbHJlYWR5KSApIHsKLQkJcmV0dXJuKDEpOwotCX0KLQotCS8qIE1vcmUgZHJhc3RpYyBtZWFzdXJlcyBhcmUgcmVxdWlyZWQgLS0gc2VlIGlmIFggaXMgcmVhZHkgdG8gdGFsayAqLwotCXsKLQkJc3RhdGljIHN0cnVjdCB0aW1ldmFsIHplcm9fdGltZTsJLyogc3RhdGljID09IDAgKi8KLQkJaW50IHgxMV9mZDsKLQkJZmRfc2V0IGZkc2V0OwotCi0JCXgxMV9mZCA9IENvbm5lY3Rpb25OdW1iZXIoZGlzcGxheSk7Ci0JCUZEX1pFUk8oJmZkc2V0KTsKLQkJRkRfU0VUKHgxMV9mZCwgJmZkc2V0KTsKLQkJaWYgKCBzZWxlY3QoeDExX2ZkKzEsICZmZHNldCwgTlVMTCwgTlVMTCwgJnplcm9fdGltZSkgPT0gMSApIHsKLQkJCXJldHVybihYUGVuZGluZyhkaXNwbGF5KSk7Ci0JCX0KLQl9Ci0KLQkvKiBPaCB3ZWxsLCBub3RoaW5nIGlzIHJlYWR5IC4uICovCi0JcmV0dXJuKDApOwotfQotCi12b2lkIFgxMV9QdW1wRXZlbnRzKF9USElTKQotewotCWludCBwZW5kaW5nOwotCi0JLyogS2VlcCBwcm9jZXNzaW5nIHBlbmRpbmcgZXZlbnRzICovCi0JcGVuZGluZyA9IDA7Ci0Jd2hpbGUgKCBYMTFfUGVuZGluZyhTRExfRGlzcGxheSkgKSB7Ci0JCVgxMV9EaXNwYXRjaEV2ZW50KHRoaXMpOwotCQkrK3BlbmRpbmc7Ci0JfQotCWlmICggc3dpdGNoX3dhaXRpbmcgKSB7Ci0JCVVpbnQzMiBub3c7Ci0KLQkJbm93ICA9IFNETF9HZXRUaWNrcygpOwotCQlpZiAoIHBlbmRpbmcgfHwgIVNETF9WaWRlb1N1cmZhY2UgKSB7Ci0JCQkvKiBUcnkgYWdhaW4gbGF0ZXIuLi4gKi8KLQkJCWlmICggc3dpdGNoX3dhaXRpbmcgJiBTRExfRlVMTFNDUkVFTiApIHsKLQkJCQlzd2l0Y2hfdGltZSA9IG5vdyArIDE1MDA7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXRjaF90aW1lID0gbm93ICsgMjAwOwotCQkJfQotCQl9IGVsc2UgaWYgKCAoaW50KShzd2l0Y2hfdGltZS1ub3cpIDw9IDAgKSB7Ci0JCQlVaW50MzIgZ29fZnVsbHNjcmVlbjsKLQotCQkJZ29fZnVsbHNjcmVlbiA9IHN3aXRjaF93YWl0aW5nICYgU0RMX0ZVTExTQ1JFRU47Ci0JCQlzd2l0Y2hfd2FpdGluZyA9IDA7Ci0JCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQkJaWYgKCBnb19mdWxsc2NyZWVuICkgewotCQkJCQlYMTFfRW50ZXJGdWxsU2NyZWVuKHRoaXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVgxMV9MZWF2ZUZ1bGxTY3JlZW4odGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJLyogSGFuZGxlIGZvY3VzIGluL291dCB3aGVuIGdyYWJiZWQgKi8KLQkJCWlmICggZ29fZnVsbHNjcmVlbiApIHsKLQkJCQlYMTFfR3JhYklucHV0Tm9Mb2NrKHRoaXMsIHRoaXMtPmlucHV0X2dyYWIpOwotCQkJfSBlbHNlIHsKLQkJCQlYMTFfR3JhYklucHV0Tm9Mb2NrKHRoaXMsIFNETF9HUkFCX09GRik7Ci0JCQl9Ci0JCQlYMTFfQ2hlY2tNb3VzZU1vZGVOb0xvY2sodGhpcyk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgWDExX0luaXRLZXltYXAodm9pZCkKLXsKLQlpbnQgaTsKLQotCS8qIE9kZCBrZXlzIHVzZWQgaW4gaW50ZXJuYXRpb25hbCBrZXlib2FyZHMgKi8KLQlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShPRERfa2V5bWFwKTsgKytpICkKLQkJT0REX2tleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKLQotIAkvKiBTb21lIG9mIHRoZXNlIG1pZ2h0IGJlIG1hcHBhYmxlIHRvIGFuIGV4aXN0aW5nIFNETEtfIGNvZGUgKi8KLSAJT0REX2tleW1hcFtYS19kZWFkX2dyYXZlJjB4RkZdID0gU0RMS19DT01QT1NFOwotIAlPRERfa2V5bWFwW1hLX2RlYWRfYWN1dGUmMHhGRl0gPSBTRExLX0NPTVBPU0U7Ci0gCU9ERF9rZXltYXBbWEtfZGVhZF90aWxkZSYweEZGXSA9IFNETEtfQ09NUE9TRTsKLSAJT0REX2tleW1hcFtYS19kZWFkX21hY3JvbiYweEZGXSA9IFNETEtfQ09NUE9TRTsKLSAJT0REX2tleW1hcFtYS19kZWFkX2JyZXZlJjB4RkZdID0gU0RMS19DT01QT1NFOwotIAlPRERfa2V5bWFwW1hLX2RlYWRfYWJvdmVkb3QmMHhGRl0gPSBTRExLX0NPTVBPU0U7Ci0gCU9ERF9rZXltYXBbWEtfZGVhZF9kaWFlcmVzaXMmMHhGRl0gPSBTRExLX0NPTVBPU0U7Ci0gCU9ERF9rZXltYXBbWEtfZGVhZF9hYm92ZXJpbmcmMHhGRl0gPSBTRExLX0NPTVBPU0U7Ci0gCU9ERF9rZXltYXBbWEtfZGVhZF9kb3VibGVhY3V0ZSYweEZGXSA9IFNETEtfQ09NUE9TRTsKLSAJT0REX2tleW1hcFtYS19kZWFkX2Nhcm9uJjB4RkZdID0gU0RMS19DT01QT1NFOwotIAlPRERfa2V5bWFwW1hLX2RlYWRfY2VkaWxsYSYweEZGXSA9IFNETEtfQ09NUE9TRTsKLSAJT0REX2tleW1hcFtYS19kZWFkX29nb25layYweEZGXSA9IFNETEtfQ09NUE9TRTsKLSAJT0REX2tleW1hcFtYS19kZWFkX2lvdGEmMHhGRl0gPSBTRExLX0NPTVBPU0U7Ci0gCU9ERF9rZXltYXBbWEtfZGVhZF92b2ljZWRfc291bmQmMHhGRl0gPSBTRExLX0NPTVBPU0U7Ci0gCU9ERF9rZXltYXBbWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kJjB4RkZdID0gU0RMS19DT01QT1NFOwotIAlPRERfa2V5bWFwW1hLX2RlYWRfYmVsb3dkb3QmMHhGRl0gPSBTRExLX0NPTVBPU0U7Ci0jaWZkZWYgWEtfZGVhZF9ob29rCi0gCU9ERF9rZXltYXBbWEtfZGVhZF9ob29rJjB4RkZdID0gU0RMS19DT01QT1NFOwotI2VuZGlmCi0jaWZkZWYgWEtfZGVhZF9ob3JuCi0gCU9ERF9rZXltYXBbWEtfZGVhZF9ob3JuJjB4RkZdID0gU0RMS19DT01QT1NFOwotI2VuZGlmCi0KLSNpZmRlZiBYS19kZWFkX2NpcmN1bWZsZXgKLQkvKiBUaGVzZSBYIGtleXN5bXMgaGF2ZSAweEZFIGFzIHRoZSBoaWdoIGJ5dGUgKi8KLQlPRERfa2V5bWFwW1hLX2RlYWRfY2lyY3VtZmxleCYweEZGXSA9IFNETEtfQ0FSRVQ7Ci0jZW5kaWYKLSNpZmRlZiBYS19JU09fTGV2ZWwzX1NoaWZ0Ci0JT0REX2tleW1hcFtYS19JU09fTGV2ZWwzX1NoaWZ0JjB4RkZdID0gU0RMS19NT0RFOyAvKiAiQWx0IEdyIiBrZXkgKi8KLSNlbmRpZgotCi0JLyogTWFwIHRoZSBtaXNjZWxsYW5lb3VzIGtleXMgKi8KLQlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShNSVNDX2tleW1hcCk7ICsraSApCi0JCU1JU0Nfa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOwotCi0JLyogVGhlc2UgWCBrZXlzeW1zIGhhdmUgMHhGRiBhcyB0aGUgaGlnaCBieXRlICovCi0JTUlTQ19rZXltYXBbWEtfQmFja1NwYWNlJjB4RkZdID0gU0RMS19CQUNLU1BBQ0U7Ci0JTUlTQ19rZXltYXBbWEtfVGFiJjB4RkZdID0gU0RMS19UQUI7Ci0JTUlTQ19rZXltYXBbWEtfQ2xlYXImMHhGRl0gPSBTRExLX0NMRUFSOwotCU1JU0Nfa2V5bWFwW1hLX1JldHVybiYweEZGXSA9IFNETEtfUkVUVVJOOwotCU1JU0Nfa2V5bWFwW1hLX1BhdXNlJjB4RkZdID0gU0RMS19QQVVTRTsKLQlNSVNDX2tleW1hcFtYS19Fc2NhcGUmMHhGRl0gPSBTRExLX0VTQ0FQRTsKLQlNSVNDX2tleW1hcFtYS19EZWxldGUmMHhGRl0gPSBTRExLX0RFTEVURTsKLQotCU1JU0Nfa2V5bWFwW1hLX0tQXzAmMHhGRl0gPSBTRExLX0tQMDsJCS8qIEtleXBhZCAwLTkgKi8KLQlNSVNDX2tleW1hcFtYS19LUF8xJjB4RkZdID0gU0RMS19LUDE7Ci0JTUlTQ19rZXltYXBbWEtfS1BfMiYweEZGXSA9IFNETEtfS1AyOwotCU1JU0Nfa2V5bWFwW1hLX0tQXzMmMHhGRl0gPSBTRExLX0tQMzsKLQlNSVNDX2tleW1hcFtYS19LUF80JjB4RkZdID0gU0RMS19LUDQ7Ci0JTUlTQ19rZXltYXBbWEtfS1BfNSYweEZGXSA9IFNETEtfS1A1OwotCU1JU0Nfa2V5bWFwW1hLX0tQXzYmMHhGRl0gPSBTRExLX0tQNjsKLQlNSVNDX2tleW1hcFtYS19LUF83JjB4RkZdID0gU0RMS19LUDc7Ci0JTUlTQ19rZXltYXBbWEtfS1BfOCYweEZGXSA9IFNETEtfS1A4OwotCU1JU0Nfa2V5bWFwW1hLX0tQXzkmMHhGRl0gPSBTRExLX0tQOTsKLQlNSVNDX2tleW1hcFtYS19LUF9JbnNlcnQmMHhGRl0gPSBTRExLX0tQMDsKLQlNSVNDX2tleW1hcFtYS19LUF9FbmQmMHhGRl0gPSBTRExLX0tQMTsJCi0JTUlTQ19rZXltYXBbWEtfS1BfRG93biYweEZGXSA9IFNETEtfS1AyOwotCU1JU0Nfa2V5bWFwW1hLX0tQX1BhZ2VfRG93biYweEZGXSA9IFNETEtfS1AzOwotCU1JU0Nfa2V5bWFwW1hLX0tQX0xlZnQmMHhGRl0gPSBTRExLX0tQNDsKLQlNSVNDX2tleW1hcFtYS19LUF9CZWdpbiYweEZGXSA9IFNETEtfS1A1OwotCU1JU0Nfa2V5bWFwW1hLX0tQX1JpZ2h0JjB4RkZdID0gU0RMS19LUDY7Ci0JTUlTQ19rZXltYXBbWEtfS1BfSG9tZSYweEZGXSA9IFNETEtfS1A3OwotCU1JU0Nfa2V5bWFwW1hLX0tQX1VwJjB4RkZdID0gU0RMS19LUDg7Ci0JTUlTQ19rZXltYXBbWEtfS1BfUGFnZV9VcCYweEZGXSA9IFNETEtfS1A5OwotCU1JU0Nfa2V5bWFwW1hLX0tQX0RlbGV0ZSYweEZGXSA9IFNETEtfS1BfUEVSSU9EOwotCU1JU0Nfa2V5bWFwW1hLX0tQX0RlY2ltYWwmMHhGRl0gPSBTRExLX0tQX1BFUklPRDsKLQlNSVNDX2tleW1hcFtYS19LUF9EaXZpZGUmMHhGRl0gPSBTRExLX0tQX0RJVklERTsKLQlNSVNDX2tleW1hcFtYS19LUF9NdWx0aXBseSYweEZGXSA9IFNETEtfS1BfTVVMVElQTFk7Ci0JTUlTQ19rZXltYXBbWEtfS1BfU3VidHJhY3QmMHhGRl0gPSBTRExLX0tQX01JTlVTOwotCU1JU0Nfa2V5bWFwW1hLX0tQX0FkZCYweEZGXSA9IFNETEtfS1BfUExVUzsKLQlNSVNDX2tleW1hcFtYS19LUF9FbnRlciYweEZGXSA9IFNETEtfS1BfRU5URVI7Ci0JTUlTQ19rZXltYXBbWEtfS1BfRXF1YWwmMHhGRl0gPSBTRExLX0tQX0VRVUFMUzsKLQotCU1JU0Nfa2V5bWFwW1hLX1VwJjB4RkZdID0gU0RMS19VUDsKLQlNSVNDX2tleW1hcFtYS19Eb3duJjB4RkZdID0gU0RMS19ET1dOOwotCU1JU0Nfa2V5bWFwW1hLX1JpZ2h0JjB4RkZdID0gU0RMS19SSUdIVDsKLQlNSVNDX2tleW1hcFtYS19MZWZ0JjB4RkZdID0gU0RMS19MRUZUOwotCU1JU0Nfa2V5bWFwW1hLX0luc2VydCYweEZGXSA9IFNETEtfSU5TRVJUOwotCU1JU0Nfa2V5bWFwW1hLX0hvbWUmMHhGRl0gPSBTRExLX0hPTUU7Ci0JTUlTQ19rZXltYXBbWEtfRW5kJjB4RkZdID0gU0RMS19FTkQ7Ci0JTUlTQ19rZXltYXBbWEtfUGFnZV9VcCYweEZGXSA9IFNETEtfUEFHRVVQOwotCU1JU0Nfa2V5bWFwW1hLX1BhZ2VfRG93biYweEZGXSA9IFNETEtfUEFHRURPV047Ci0KLQlNSVNDX2tleW1hcFtYS19GMSYweEZGXSA9IFNETEtfRjE7Ci0JTUlTQ19rZXltYXBbWEtfRjImMHhGRl0gPSBTRExLX0YyOwotCU1JU0Nfa2V5bWFwW1hLX0YzJjB4RkZdID0gU0RMS19GMzsKLQlNSVNDX2tleW1hcFtYS19GNCYweEZGXSA9IFNETEtfRjQ7Ci0JTUlTQ19rZXltYXBbWEtfRjUmMHhGRl0gPSBTRExLX0Y1OwotCU1JU0Nfa2V5bWFwW1hLX0Y2JjB4RkZdID0gU0RMS19GNjsKLQlNSVNDX2tleW1hcFtYS19GNyYweEZGXSA9IFNETEtfRjc7Ci0JTUlTQ19rZXltYXBbWEtfRjgmMHhGRl0gPSBTRExLX0Y4OwotCU1JU0Nfa2V5bWFwW1hLX0Y5JjB4RkZdID0gU0RMS19GOTsKLQlNSVNDX2tleW1hcFtYS19GMTAmMHhGRl0gPSBTRExLX0YxMDsKLQlNSVNDX2tleW1hcFtYS19GMTEmMHhGRl0gPSBTRExLX0YxMTsKLQlNSVNDX2tleW1hcFtYS19GMTImMHhGRl0gPSBTRExLX0YxMjsKLQlNSVNDX2tleW1hcFtYS19GMTMmMHhGRl0gPSBTRExLX0YxMzsKLQlNSVNDX2tleW1hcFtYS19GMTQmMHhGRl0gPSBTRExLX0YxNDsKLQlNSVNDX2tleW1hcFtYS19GMTUmMHhGRl0gPSBTRExLX0YxNTsKLQotCU1JU0Nfa2V5bWFwW1hLX051bV9Mb2NrJjB4RkZdID0gU0RMS19OVU1MT0NLOwotCU1JU0Nfa2V5bWFwW1hLX0NhcHNfTG9jayYweEZGXSA9IFNETEtfQ0FQU0xPQ0s7Ci0JTUlTQ19rZXltYXBbWEtfU2Nyb2xsX0xvY2smMHhGRl0gPSBTRExLX1NDUk9MTE9DSzsKLQlNSVNDX2tleW1hcFtYS19TaGlmdF9SJjB4RkZdID0gU0RMS19SU0hJRlQ7Ci0JTUlTQ19rZXltYXBbWEtfU2hpZnRfTCYweEZGXSA9IFNETEtfTFNISUZUOwotCU1JU0Nfa2V5bWFwW1hLX0NvbnRyb2xfUiYweEZGXSA9IFNETEtfUkNUUkw7Ci0JTUlTQ19rZXltYXBbWEtfQ29udHJvbF9MJjB4RkZdID0gU0RMS19MQ1RSTDsKLQlNSVNDX2tleW1hcFtYS19BbHRfUiYweEZGXSA9IFNETEtfUkFMVDsKLQlNSVNDX2tleW1hcFtYS19BbHRfTCYweEZGXSA9IFNETEtfTEFMVDsKLQlNSVNDX2tleW1hcFtYS19NZXRhX1ImMHhGRl0gPSBTRExLX1JNRVRBOwotCU1JU0Nfa2V5bWFwW1hLX01ldGFfTCYweEZGXSA9IFNETEtfTE1FVEE7Ci0JTUlTQ19rZXltYXBbWEtfU3VwZXJfTCYweEZGXSA9IFNETEtfTFNVUEVSOyAvKiBMZWZ0ICJXaW5kb3dzIiAqLwotCU1JU0Nfa2V5bWFwW1hLX1N1cGVyX1ImMHhGRl0gPSBTRExLX1JTVVBFUjsgLyogUmlnaHQgIldpbmRvd3MgKi8KLQlNSVNDX2tleW1hcFtYS19Nb2RlX3N3aXRjaCYweEZGXSA9IFNETEtfTU9ERTsgLyogIkFsdCBHciIga2V5ICovCi0JTUlTQ19rZXltYXBbWEtfTXVsdGlfa2V5JjB4RkZdID0gU0RMS19DT01QT1NFOyAvKiBNdWx0aS1rZXkgY29tcG9zZSAqLwotCi0JTUlTQ19rZXltYXBbWEtfSGVscCYweEZGXSA9IFNETEtfSEVMUDsKLQlNSVNDX2tleW1hcFtYS19QcmludCYweEZGXSA9IFNETEtfUFJJTlQ7Ci0JTUlTQ19rZXltYXBbWEtfU3lzX1JlcSYweEZGXSA9IFNETEtfU1lTUkVROwotCU1JU0Nfa2V5bWFwW1hLX0JyZWFrJjB4RkZdID0gU0RMS19CUkVBSzsKLQlNSVNDX2tleW1hcFtYS19NZW51JjB4RkZdID0gU0RMS19NRU5VOwotCU1JU0Nfa2V5bWFwW1hLX0h5cGVyX1ImMHhGRl0gPSBTRExLX01FTlU7ICAgLyogV2luZG93cyAiTWVudSIga2V5ICovCi19Ci0KLS8qIEdldCB0aGUgdHJhbnNsYXRlZCBTREwgdmlydHVhbCBrZXlzeW0gKi8KLVNETEtleSBYMTFfVHJhbnNsYXRlS2V5Y29kZShEaXNwbGF5ICpkaXNwbGF5LCBLZXlDb2RlIGtjKQotewotCUtleVN5bSB4c3ltOwotCVNETEtleSBrZXk7Ci0KLQl4c3ltID0gWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrYywgMCk7Ci0jaWZkZWYgREVCVUdfS0VZUwotCWZwcmludGYoc3RkZXJyLCAiVHJhbnNsYXRpbmcga2V5IGNvZGUgJWQgLT4gMHglLjR4XG4iLCBrYywgeHN5bSk7Ci0jZW5kaWYKLQlrZXkgPSBTRExLX1VOS05PV047Ci0JaWYgKCB4c3ltICkgewotCQlzd2l0Y2ggKHhzeW0+PjgpIHsKLQkJICAgIGNhc2UgMHgxMDA1RkY6Ci0jaWZkZWYgU3VuWEtfRjM2Ci0JCQlpZiAoIHhzeW0gPT0gU3VuWEtfRjM2ICkKLQkJCQlrZXkgPSBTRExLX0YxMTsKLSNlbmRpZgotI2lmZGVmIFN1blhLX0YzNwotCQkJaWYgKCB4c3ltID09IFN1blhLX0YzNyApCi0JCQkJa2V5ID0gU0RMS19GMTI7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQkgICAgY2FzZSAweDAwOgkvKiBMYXRpbiAxICovCi0JCQlrZXkgPSAoU0RMS2V5KSh4c3ltICYgMHhGRik7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMHgwMToJLyogTGF0aW4gMiAqLwotCQkgICAgY2FzZSAweDAyOgkvKiBMYXRpbiAzICovCi0JCSAgICBjYXNlIDB4MDM6CS8qIExhdGluIDQgKi8KLQkJICAgIGNhc2UgMHgwNDoJLyogS2F0YWthbmEgKi8KLQkJICAgIGNhc2UgMHgwNToJLyogQXJhYmljICovCi0JCSAgICBjYXNlIDB4MDY6CS8qIEN5cmlsbGljICovCi0JCSAgICBjYXNlIDB4MDc6CS8qIEdyZWVrICovCi0JCSAgICBjYXNlIDB4MDg6CS8qIFRlY2huaWNhbCAqLwotCQkgICAgY2FzZSAweDBBOgkvKiBQdWJsaXNoaW5nICovCi0JCSAgICBjYXNlIDB4MEM6CS8qIEhlYnJldyAqLwotCQkgICAgY2FzZSAweDBEOgkvKiBUaGFpICovCi0JCQkvKiBUaGVzZSBhcmUgd3JvbmcsIGJ1dCBpdCdzIGJldHRlciB0aGFuIG5vdGhpbmcgKi8KLQkJCWtleSA9IChTRExLZXkpKHhzeW0gJiAweEZGKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSAweEZFOgotCQkJa2V5ID0gT0REX2tleW1hcFt4c3ltJjB4RkZdOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDB4RkY6Ci0JCQlrZXkgPSBNSVNDX2tleW1hcFt4c3ltJjB4RkZdOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJLyoKLQkJCWZwcmludGYoc3RkZXJyLCAiWDExOiBVbmhhbmRsZWQgeHN5bSwgc3ltID0gMHglMDR4XG4iLAotCQkJCQkodW5zaWduZWQgaW50KXhzeW0pOwotCQkJKi8KLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogWDExIGRvZXNuJ3Qga25vdyBob3cgdG8gdHJhbnNsYXRlIHRoZSBrZXkhICovCi0JCXN3aXRjaCAoa2MpIHsKLQkJICAgIC8qIENhdXRpb246Ci0JCSAgICAgICBUaGVzZSBrZXljb2RlcyBhcmUgZnJvbSB0aGUgTWljcm9zb2Z0IEtleWJvYXJkCi0JCSAgICAgKi8KLQkJICAgIGNhc2UgMTE1OgotCQkJa2V5ID0gU0RMS19MU1VQRVI7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMTE2OgotCQkJa2V5ID0gU0RMS19SU1VQRVI7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMTE3OgotCQkJa2V5ID0gU0RMS19NRU5VOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJLyoKLQkJCSAqIG5vIHBvaW50IGluIGFuIGVycm9yIG1lc3NhZ2U7IGhhcHBlbnMgZm9yCi0JCQkgKiBzZXZlcmFsIGtleXMgd2hlbiB3ZSBnZXQgYSBrZXltYXAgbm90aWZ5Ci0JCQkgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiBrZXk7Ci19Ci0KLS8qIFgxMSBtb2RpZmllciBtYXNrcyBmb3IgdmFyaW91cyBrZXlzICovCi1zdGF0aWMgdW5zaWduZWQgbWV0YV9sX21hc2ssIG1ldGFfcl9tYXNrLCBhbHRfbF9tYXNrLCBhbHRfcl9tYXNrOwotc3RhdGljIHVuc2lnbmVkIG51bV9tYXNrLCBtb2RlX3N3aXRjaF9tYXNrOwotCi1zdGF0aWMgdm9pZCBnZXRfbW9kaWZpZXJfbWFza3MoRGlzcGxheSAqZGlzcGxheSkKLXsKLQlzdGF0aWMgdW5zaWduZWQgZ290X21hc2tzOwotCWludCBpLCBqOwotCVhNb2RpZmllcktleW1hcCAqeG1vZHM7Ci0JdW5zaWduZWQgbjsKLQotCWlmKGdvdF9tYXNrcykKLQkJcmV0dXJuOwotCi0JeG1vZHMgPSBYR2V0TW9kaWZpZXJNYXBwaW5nKGRpc3BsYXkpOwotCW4gPSB4bW9kcy0+bWF4X2tleXBlcm1vZDsKLQlmb3IoaSA9IDM7IGkgPCA4OyBpKyspIHsKLQkJZm9yKGogPSAwOyBqIDwgbjsgaisrKSB7Ci0JCQlLZXlDb2RlIGtjID0geG1vZHMtPm1vZGlmaWVybWFwW2kgKiBuICsgal07Ci0JCQlLZXlTeW0ga3MgPSBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtjLCAwKTsKLQkJCXVuc2lnbmVkIG1hc2sgPSAxIDw8IGk7Ci0JCQlzd2l0Y2goa3MpIHsKLQkJCWNhc2UgWEtfTnVtX0xvY2s6Ci0JCQkJbnVtX21hc2sgPSBtYXNrOyBicmVhazsKLQkJCWNhc2UgWEtfQWx0X0w6Ci0JCQkJYWx0X2xfbWFzayA9IG1hc2s7IGJyZWFrOwotCQkJY2FzZSBYS19BbHRfUjoKLQkJCQlhbHRfcl9tYXNrID0gbWFzazsgYnJlYWs7Ci0JCQljYXNlIFhLX01ldGFfTDoKLQkJCQltZXRhX2xfbWFzayA9IG1hc2s7IGJyZWFrOwotCQkJY2FzZSBYS19NZXRhX1I6Ci0JCQkJbWV0YV9yX21hc2sgPSBtYXNrOyBicmVhazsKLQkJCWNhc2UgWEtfTW9kZV9zd2l0Y2g6Ci0JCQkJbW9kZV9zd2l0Y2hfbWFzayA9IG1hc2s7IGJyZWFrOwotCQkJfQotCQl9Ci0JfQotCVhGcmVlTW9kaWZpZXJtYXAoeG1vZHMpOwotCWdvdF9tYXNrcyA9IDE7Ci19Ci0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgc2VtaS1vZmZpY2lhbDsgaXQgaXMgbm90IG9mZmljaWFsbHkgZXhwb3J0ZWQgYW5kIHNob3VsZAotICogbm90IGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgU0RMIEFQSSwgYnV0IG1heSBiZSB1c2VkIGJ5IGNsaWVudCBjb2RlCi0gKiB0aGF0ICpyZWFsbHkqIG5lZWRzIGl0IChpbmNsdWRpbmcgbGVnYWN5IGNvZGUpLgotICogSXQgaXMgc2xvdywgdGhvdWdoLCBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgaWYgcG9zc2libGUuCi0gKgotICogTm90ZSB0aGF0IGl0IGlzbid0IGNvbXBsZXRlbHkgYWNjdXJhdGUgZWl0aGVyOyBpbiBwYXJ0aWN1bGFyLCBtdWx0aS1rZXkKLSAqIHNlcXVlbmNlcyAoZGVhZCBhY2NlbnRzLCBjb21wb3NlIGtleSBzZXF1ZW5jZXMpIHdpbGwgbm90IHdvcmsgc2luY2UgdGhlCi0gKiBzdGF0ZSBoYXMgYmVlbiBpcnJldm9jYWJseSBsb3N0LgotICovCi1VaW50MTYgWDExX0tleVRvVW5pY29kZShTRExLZXkga2V5c3ltLCBTRExNb2QgbW9kaWZpZXJzKQotewotCXN0cnVjdCBTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCWNoYXIga2V5YnVmWzMyXTsKLQlpbnQgaTsKLQlLZXlTeW0geHN5bSA9IDA7Ci0JWEtleUV2ZW50IHhrZXk7Ci0JVWludDE2IHVuaWNvZGU7Ci0KLQlpZiAoICF0aGlzIHx8ICFTRExfRGlzcGxheSApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JU0RMX21lbXNldCgmeGtleSwgMCwgc2l6ZW9mKHhrZXkpKTsKLQl4a2V5LmRpc3BsYXkgPSBTRExfRGlzcGxheTsKLQotCXhzeW0gPSBrZXlzeW07CQkvKiBsYXN0IHJlc29ydCBpZiBub3QgZm91bmQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLQkJaWYgKCBNSVNDX2tleW1hcFtpXSA9PSBrZXlzeW0gKSB7Ci0JCQl4c3ltID0gMHhGRjAwIHwgaTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKCBPRERfa2V5bWFwW2ldID09IGtleXN5bSApIHsKLQkJCXhzeW0gPSAweEZFMDAgfCBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl4a2V5LmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKHhrZXkuZGlzcGxheSwgeHN5bSk7Ci0KLQlnZXRfbW9kaWZpZXJfbWFza3MoU0RMX0Rpc3BsYXkpOwotCWlmKG1vZGlmaWVycyAmIEtNT0RfU0hJRlQpCi0JCXhrZXkuc3RhdGUgfD0gU2hpZnRNYXNrOwotCWlmKG1vZGlmaWVycyAmIEtNT0RfQ0FQUykKLQkJeGtleS5zdGF0ZSB8PSBMb2NrTWFzazsKLQlpZihtb2RpZmllcnMgJiBLTU9EX0NUUkwpCi0JCXhrZXkuc3RhdGUgfD0gQ29udHJvbE1hc2s7Ci0JaWYobW9kaWZpZXJzICYgS01PRF9NT0RFKQotCQl4a2V5LnN0YXRlIHw9IG1vZGVfc3dpdGNoX21hc2s7Ci0JaWYobW9kaWZpZXJzICYgS01PRF9MQUxUKQotCQl4a2V5LnN0YXRlIHw9IGFsdF9sX21hc2s7Ci0JaWYobW9kaWZpZXJzICYgS01PRF9SQUxUKQotCQl4a2V5LnN0YXRlIHw9IGFsdF9yX21hc2s7Ci0JaWYobW9kaWZpZXJzICYgS01PRF9MTUVUQSkKLQkJeGtleS5zdGF0ZSB8PSBtZXRhX2xfbWFzazsKLQlpZihtb2RpZmllcnMgJiBLTU9EX1JNRVRBKQotCQl4a2V5LnN0YXRlIHw9IG1ldGFfcl9tYXNrOwotCWlmKG1vZGlmaWVycyAmIEtNT0RfTlVNKQotCQl4a2V5LnN0YXRlIHw9IG51bV9tYXNrOwotCi0JdW5pY29kZSA9IDA7Ci0JaWYgKCBYTG9va3VwU3RyaW5nKCZ4a2V5LCBrZXlidWYsIHNpemVvZihrZXlidWYpLCBOVUxMLCBOVUxMKSApCi0JCXVuaWNvZGUgPSAodW5zaWduZWQgY2hhcilrZXlidWZbMF07Ci0JcmV0dXJuKHVuaWNvZGUpOwotfQotCi0KLS8qCi0gKiBDYWxsZWQgd2hlbiBmb2N1cyBpcyByZWdhaW5lZCwgdG8gcmVhZCB0aGUga2V5Ym9hcmQgc3RhdGUgYW5kIGdlbmVyYXRlCi0gKiBzeW50aGV0aWMga2V5cHJlc3MvcmVsZWFzZSBldmVudHMuCi0gKiBrZXlfdmVjIGlzIGEgYml0IHZlY3RvciBvZiBrZXljb2RlcyAoMjU2IGJpdHMpCi0gKi8KLXZvaWQgWDExX1NldEtleWJvYXJkU3RhdGUoRGlzcGxheSAqZGlzcGxheSwgY29uc3QgY2hhciAqa2V5X3ZlYykKLXsKLQljaGFyIGtleXNfcmV0dXJuWzMyXTsKLQlpbnQgaTsKLQlVaW50OCAqa3N0YXRlID0gU0RMX0dldEtleVN0YXRlKE5VTEwpOwotCVNETE1vZCBtb2RzdGF0ZTsKLQlXaW5kb3cganVua193aW5kb3c7Ci0JaW50IHgsIHk7Ci0JdW5zaWduZWQgaW50IG1hc2s7Ci0KLQkvKiBUaGUgZmlyc3QgdGltZSB0aGUgd2luZG93IGlzIG1hcHBlZCwgd2UgaW5pdGlhbGl6ZSBrZXkgc3RhdGUgKi8KLQlpZiAoICEga2V5X3ZlYyApIHsKLQkJWFF1ZXJ5S2V5bWFwKGRpc3BsYXksIGtleXNfcmV0dXJuKTsKLQkJa2V5X3ZlYyA9IGtleXNfcmV0dXJuOwotCX0KLQotCS8qIEdldCB0aGUga2V5Ym9hcmQgbW9kaWZpZXIgc3RhdGUgKi8KLQltb2RzdGF0ZSA9IDA7Ci0JZ2V0X21vZGlmaWVyX21hc2tzKGRpc3BsYXkpOwotCWlmICggWFF1ZXJ5UG9pbnRlcihkaXNwbGF5LCBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSwKLQkJJmp1bmtfd2luZG93LCAmanVua193aW5kb3csICZ4LCAmeSwgJngsICZ5LCAmbWFzaykgKSB7Ci0JCWlmICggbWFzayAmIExvY2tNYXNrICkgewotCQkJbW9kc3RhdGUgfD0gS01PRF9DQVBTOwotCQl9Ci0JCWlmICggbWFzayAmIG1vZGVfc3dpdGNoX21hc2sgKSB7Ci0JCQltb2RzdGF0ZSB8PSBLTU9EX01PREU7Ci0JCX0KLQkJaWYgKCBtYXNrICYgbnVtX21hc2sgKSB7Ci0JCQltb2RzdGF0ZSB8PSBLTU9EX05VTTsKLQkJfQotCX0KLQotCS8qIFplcm8gdGhlIG5ldyBrZXlib2FyZCBzdGF0ZSBhbmQgZ2VuZXJhdGUgaXQgKi8KLQlTRExfbWVtc2V0KGtzdGF0ZSwgMCwgU0RMS19MQVNUKTsKLQkvKgotCSAqIEFuIG9idmlvdXMgb3B0aW1pc2F0aW9uIGlzIHRvIGNoZWNrIGVudGlyZSBsb25nd29yZHMgYXQgYSB0aW1lIGluCi0JICogYm90aCBsb29wcywgYnV0IHdlIGNhbid0IGJlIHN1cmUgdGhlIGFycmF5cyBhcmUgYWxpZ25lZCBzbyBpdCdzIG5vdAotCSAqIHdvcnRoIHRoZSBleHRyYSBjb21wbGV4aXR5Ci0JICovCi0JZm9yICggaSA9IDA7IGkgPCAzMjsgaSsrICkgewotCQlpbnQgajsKLQkJaWYgKCAha2V5X3ZlY1tpXSApCi0JCQljb250aW51ZTsKLQkJZm9yICggaiA9IDA7IGogPCA4OyBqKysgKSB7Ci0JCQlpZiAoIGtleV92ZWNbaV0gJiAoMSA8PCBqKSApIHsKLQkJCQlTRExLZXkga2V5OwotCQkJCUtleUNvZGUga2MgPSAoaSA8PCAzIHwgaik7Ci0JCQkJa2V5ID0gWDExX1RyYW5zbGF0ZUtleWNvZGUoZGlzcGxheSwga2MpOwotCQkJCWlmICgga2V5ID09IFNETEtfVU5LTk9XTiApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWtzdGF0ZVtrZXldID0gU0RMX1BSRVNTRUQ7Ci0JCQkJc3dpdGNoIChrZXkpIHsKLQkJCQkgICAgY2FzZSBTRExLX0xTSElGVDoKLQkJCQkJbW9kc3RhdGUgfD0gS01PRF9MU0hJRlQ7Ci0JCQkJCWJyZWFrOwotCQkJCSAgICBjYXNlIFNETEtfUlNISUZUOgotCQkJCQltb2RzdGF0ZSB8PSBLTU9EX1JTSElGVDsKLQkJCQkJYnJlYWs7Ci0JCQkJICAgIGNhc2UgU0RMS19MQ1RSTDoKLQkJCQkJbW9kc3RhdGUgfD0gS01PRF9MQ1RSTDsKLQkJCQkJYnJlYWs7Ci0JCQkJICAgIGNhc2UgU0RMS19SQ1RSTDoKLQkJCQkJbW9kc3RhdGUgfD0gS01PRF9SQ1RSTDsKLQkJCQkJYnJlYWs7Ci0JCQkJICAgIGNhc2UgU0RMS19MQUxUOgotCQkJCQltb2RzdGF0ZSB8PSBLTU9EX0xBTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCSAgICBjYXNlIFNETEtfUkFMVDoKLQkJCQkJbW9kc3RhdGUgfD0gS01PRF9SQUxUOwotCQkJCQlicmVhazsKLQkJCQkgICAgY2FzZSBTRExLX0xNRVRBOgotCQkJCQltb2RzdGF0ZSB8PSBLTU9EX0xNRVRBOwotCQkJCQlicmVhazsKLQkJCQkgICAgY2FzZSBTRExLX1JNRVRBOgotCQkJCQltb2RzdGF0ZSB8PSBLTU9EX1JNRVRBOwotCQkJCQlicmVhazsKLQkJCQkgICAgZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogSGFjayAtIHNldCB0b2dnbGUga2V5IHN0YXRlICovCi0JaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQ0FQUyApIHsKLQkJa3N0YXRlW1NETEtfQ0FQU0xPQ0tdID0gU0RMX1BSRVNTRUQ7Ci0JfSBlbHNlIHsKLQkJa3N0YXRlW1NETEtfQ0FQU0xPQ0tdID0gU0RMX1JFTEVBU0VEOwotCX0KLQlpZiAoIG1vZHN0YXRlICYgS01PRF9OVU0gKSB7Ci0JCWtzdGF0ZVtTRExLX05VTUxPQ0tdID0gU0RMX1BSRVNTRUQ7Ci0JfSBlbHNlIHsKLQkJa3N0YXRlW1NETEtfTlVNTE9DS10gPSBTRExfUkVMRUFTRUQ7Ci0JfQotCi0JLyogU2V0IHRoZSBmaW5hbCBtb2RpZmllciBzdGF0ZSAqLwotCVNETF9TZXRNb2RTdGF0ZShtb2RzdGF0ZSk7Ci19Ci0KLXZvaWQgWDExX0luaXRPU0tleW1hcChfVEhJUykKLXsKLQlYMTFfSW5pdEtleW1hcCgpOwotfQotCi12b2lkIFgxMV9TYXZlU2NyZWVuU2F2ZXIoRGlzcGxheSAqZGlzcGxheSwgaW50ICpzYXZlZF90aW1lb3V0LCBCT09MICpkcG1zKQotewotCWludCB0aW1lb3V0LCBpbnRlcnZhbCwgcHJlZmVyX2JsYW5rLCBhbGxvd19leHA7Ci0JWEdldFNjcmVlblNhdmVyKGRpc3BsYXksICZ0aW1lb3V0LCAmaW50ZXJ2YWwsICZwcmVmZXJfYmxhbmssICZhbGxvd19leHApOwotCSpzYXZlZF90aW1lb3V0ID0gdGltZW91dDsKLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX0RQTVMKLQlpZiAoIFNETF9YMTFfSEFWRV9EUE1TICkgewotCQlpbnQgZHVtbXk7Ci0JICAJaWYgKCBEUE1TUXVlcnlFeHRlbnNpb24oZGlzcGxheSwgJmR1bW15LCAmZHVtbXkpICkgewotCQkJQ0FSRDE2IHN0YXRlOwotCQkJRFBNU0luZm8oZGlzcGxheSwgJnN0YXRlLCBkcG1zKTsKLQkJfQotCX0KLSNlbHNlCi0JKmRwbXMgPSAwOwotI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX0RQTVMgKi8KLX0KLQotdm9pZCBYMTFfRGlzYWJsZVNjcmVlblNhdmVyKF9USElTLCBEaXNwbGF5ICpkaXNwbGF5KQotewotCWludCB0aW1lb3V0LCBpbnRlcnZhbCwgcHJlZmVyX2JsYW5rLCBhbGxvd19leHA7Ci0KLQlpZiAodGhpcy0+aGlkZGVuLT5hbGxvd19zY3JlZW5zYXZlcikgewotCQlyZXR1cm47Ci0JfQotCi0JWEdldFNjcmVlblNhdmVyKGRpc3BsYXksICZ0aW1lb3V0LCAmaW50ZXJ2YWwsICZwcmVmZXJfYmxhbmssICZhbGxvd19leHApOwotCXRpbWVvdXQgPSAwOwotCVhTZXRTY3JlZW5TYXZlcihkaXNwbGF5LCB0aW1lb3V0LCBpbnRlcnZhbCwgcHJlZmVyX2JsYW5rLCBhbGxvd19leHApOwotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFBNUwotCWlmICggU0RMX1gxMV9IQVZFX0RQTVMgKSB7Ci0JCWludCBkdW1teTsKLQkgIAlpZiAoIERQTVNRdWVyeUV4dGVuc2lvbihkaXNwbGF5LCAmZHVtbXksICZkdW1teSkgKSB7Ci0JCQlEUE1TRGlzYWJsZShkaXNwbGF5KTsKLQkJfQotCX0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9EUE1TICovCi19Ci0KLXZvaWQgWDExX1Jlc3RvcmVTY3JlZW5TYXZlcihfVEhJUywgRGlzcGxheSAqZGlzcGxheSwgaW50IHNhdmVkX3RpbWVvdXQsIEJPT0wgZHBtcykKLXsKLQlpbnQgdGltZW91dCwgaW50ZXJ2YWwsIHByZWZlcl9ibGFuaywgYWxsb3dfZXhwOwotCi0JaWYgKHRoaXMtPmhpZGRlbi0+YWxsb3dfc2NyZWVuc2F2ZXIpIHsKLQkJcmV0dXJuOwotCX0KLQotCVhHZXRTY3JlZW5TYXZlcihkaXNwbGF5LCAmdGltZW91dCwgJmludGVydmFsLCAmcHJlZmVyX2JsYW5rLCAmYWxsb3dfZXhwKTsKLQl0aW1lb3V0ID0gc2F2ZWRfdGltZW91dDsKLQlYU2V0U2NyZWVuU2F2ZXIoZGlzcGxheSwgdGltZW91dCwgaW50ZXJ2YWwsIHByZWZlcl9ibGFuaywgYWxsb3dfZXhwKTsKLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX0RQTVMKLQlpZiAoIFNETF9YMTFfSEFWRV9EUE1TICkgewotCQlpbnQgZHVtbXk7Ci0JICAJaWYgKCBEUE1TUXVlcnlFeHRlbnNpb24oZGlzcGxheSwgJmR1bW15LCAmZHVtbXkpICkgewotCQkJaWYgKCBkcG1zICkgewotCQkJCURQTVNFbmFibGUoZGlzcGxheSk7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFBNUyAqLwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMWV2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZXZlbnRzX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhMTcwOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZXZlbnRzX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCi0KLS8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLwotZXh0ZXJuIHZvaWQgWDExX0luaXRPU0tleW1hcChfVEhJUyk7Ci1leHRlcm4gdm9pZCBYMTFfUHVtcEV2ZW50cyhfVEhJUyk7Ci1leHRlcm4gdm9pZCBYMTFfU2V0S2V5Ym9hcmRTdGF0ZShEaXNwbGF5ICpkaXNwbGF5LCBjb25zdCBjaGFyICprZXlfdmVjKTsKLQotZXh0ZXJuIHZvaWQgWDExX1NhdmVTY3JlZW5TYXZlcihEaXNwbGF5ICpkaXNwbGF5LCBpbnQgKnNhdmVkX3RpbWVvdXQsIEJPT0wgKmRwbXMpOwotZXh0ZXJuIHZvaWQgWDExX0Rpc2FibGVTY3JlZW5TYXZlcihfVEhJUywgRGlzcGxheSAqZGlzcGxheSk7Ci1leHRlcm4gdm9pZCBYMTFfUmVzdG9yZVNjcmVlblNhdmVyKF9USElTLCBEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2F2ZWRfdGltZW91dCwgQk9PTCBkcG1zKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFnYW1tYS5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMWdhbW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjk5OGYuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMWdhbW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTREwuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF94MTF2aWRlby5oIgotCi0vKiBGcm9tIHRoZSBYIHNlcnZlciBzb3VyY2VzLi4uICovCi0jZGVmaW5lIE1BWF9HQU1NQSAxMC4wCi0jZGVmaW5lIE1JTl9HQU1NQSAoMS4wL01BWF9HQU1NQSkKLQotc3RhdGljIGludCBYMTFfU2V0R2FtbWFOb0xvY2soX1RISVMsIGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpCi17Ci0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQotICAgIGlmICh1c2VfdmlkbW9kZSA+PSAyMDApIHsKLSAgICAgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVHYW1tYSkgZ2FtbWE7Ci0gICAgICAgIEJvb2wgc3VjY2VlZGVkOwotCi0JLyogQ2xhbXAgdGhlIGdhbW1hIHZhbHVlcyAqLwotCWlmICggcmVkIDwgTUlOX0dBTU1BICkgewotCQlnYW1tYS5yZWQgPSBNSU5fR0FNTUE7Ci0JfSBlbHNlCi0JaWYgKCByZWQgPiBNQVhfR0FNTUEgKSB7Ci0JCWdhbW1hLnJlZCA9IE1BWF9HQU1NQTsKLQl9IGVsc2UgewotICAgICAgICAJZ2FtbWEucmVkID0gcmVkOwotCX0KLQlpZiAoIGdyZWVuIDwgTUlOX0dBTU1BICkgewotCQlnYW1tYS5ncmVlbiA9IE1JTl9HQU1NQTsKLQl9IGVsc2UKLQlpZiAoIGdyZWVuID4gTUFYX0dBTU1BICkgewotCQlnYW1tYS5ncmVlbiA9IE1BWF9HQU1NQTsKLQl9IGVsc2UgewotICAgICAgICAJZ2FtbWEuZ3JlZW4gPSBncmVlbjsKLQl9Ci0JaWYgKCBibHVlIDwgTUlOX0dBTU1BICkgewotCQlnYW1tYS5ibHVlID0gTUlOX0dBTU1BOwotCX0gZWxzZQotCWlmICggYmx1ZSA+IE1BWF9HQU1NQSApIHsKLQkJZ2FtbWEuYmx1ZSA9IE1BWF9HQU1NQTsKLQl9IGVsc2UgewotICAgICAgICAJZ2FtbWEuYmx1ZSA9IGJsdWU7Ci0JfQotICAgICAgICBpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUEFDVElWRSApIHsKLSAgICAgICAgICAgIHN1Y2NlZWRlZCA9IFNETF9OQU1FKFhGODZWaWRNb2RlU2V0R2FtbWEpKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuLCAmZ2FtbWEpOwotICAgICAgICAgICAgWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdhbW1hX3NhdmVkWzBdID0gZ2FtbWEucmVkOwotICAgICAgICAgICAgZ2FtbWFfc2F2ZWRbMV0gPSBnYW1tYS5ncmVlbjsKLSAgICAgICAgICAgIGdhbW1hX3NhdmVkWzJdID0gZ2FtbWEuYmx1ZTsKLSAgICAgICAgICAgIHN1Y2NlZWRlZCA9IFRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBzdWNjZWVkZWQgKSB7Ci0gICAgICAgICAgICArK2dhbW1hX2NoYW5nZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1Y2NlZWRlZCA/IDAgOiAtMTsKLSAgICB9Ci0jZW5kaWYKLSAgICBTRExfU2V0RXJyb3IoIkdhbW1hIGNvcnJlY3Rpb24gbm90IHN1cHBvcnRlZCIpOwotICAgIHJldHVybiAtMTsKLX0KLWludCBYMTFfU2V0VmlkTW9kZUdhbW1hKF9USElTLCBmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlKQotewotICAgIGludCByZXN1bHQ7Ci0KLSAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOwotICAgIHJlc3VsdCA9IFgxMV9TZXRHYW1tYU5vTG9jayh0aGlzLCByZWQsIGdyZWVuLCBibHVlKTsKLSAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLSAgICByZXR1cm4ocmVzdWx0KTsKLX0KLQotc3RhdGljIGludCBYMTFfR2V0R2FtbWFOb0xvY2soX1RISVMsIGZsb2F0ICpyZWQsIGZsb2F0ICpncmVlbiwgZmxvYXQgKmJsdWUpCi17Ci0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQotICAgIGlmICh1c2VfdmlkbW9kZSA+PSAyMDApIHsKLSAgICAgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVHYW1tYSkgZ2FtbWE7Ci0gICAgICAgIGlmIChTRExfTkFNRShYRjg2VmlkTW9kZUdldEdhbW1hKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgJmdhbW1hKSkgewotICAgICAgICAgICAgKnJlZCAgID0gZ2FtbWEucmVkOwotICAgICAgICAgICAgKmdyZWVuID0gZ2FtbWEuZ3JlZW47Ci0gICAgICAgICAgICAqYmx1ZSAgPSBnYW1tYS5ibHVlOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiAtMTsKLX0KLWludCBYMTFfR2V0VmlkTW9kZUdhbW1hKF9USElTLCBmbG9hdCAqcmVkLCBmbG9hdCAqZ3JlZW4sIGZsb2F0ICpibHVlKQotewotICAgIGludCByZXN1bHQ7Ci0KLSAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOwotICAgIHJlc3VsdCA9IFgxMV9HZXRHYW1tYU5vTG9jayh0aGlzLCByZWQsIGdyZWVuLCBibHVlKTsKLSAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLSAgICByZXR1cm4ocmVzdWx0KTsKLX0KLQotdm9pZCBYMTFfU2F2ZVZpZE1vZGVHYW1tYShfVEhJUykKLXsKLSAgICAvKiBUcnkgdG8gc2F2ZSB0aGUgY3VycmVudCBnYW1tYSwgb3RoZXJ3aXNlIGRpc2FibGUgZ2FtbWEgY29udHJvbCAqLwotICAgIGlmICggWDExX0dldEdhbW1hTm9Mb2NrKHRoaXMsCi0gICAgICAgICAgICAgICZnYW1tYV9zYXZlZFswXSwgJmdhbW1hX3NhdmVkWzFdLCAmZ2FtbWFfc2F2ZWRbMl0pIDwgMCApIHsKLSAgICAgICAgdGhpcy0+U2V0R2FtbWEgPSAwOwotICAgICAgICB0aGlzLT5HZXRHYW1tYSA9IDA7Ci0gICAgfQotICAgIGdhbW1hX2NoYW5nZWQgPSAwOwotfQotdm9pZCBYMTFfU3dhcFZpZE1vZGVHYW1tYShfVEhJUykKLXsKLSAgICBmbG9hdCBuZXdfZ2FtbWFbM107Ci0KLSAgICBpZiAoIGdhbW1hX2NoYW5nZWQgKSB7Ci0gICAgICAgIG5ld19nYW1tYVswXSA9IGdhbW1hX3NhdmVkWzBdOwotICAgICAgICBuZXdfZ2FtbWFbMV0gPSBnYW1tYV9zYXZlZFsxXTsKLSAgICAgICAgbmV3X2dhbW1hWzJdID0gZ2FtbWFfc2F2ZWRbMl07Ci0gICAgICAgIFgxMV9HZXRHYW1tYU5vTG9jayh0aGlzLCAmZ2FtbWFfc2F2ZWRbMF0sICZnYW1tYV9zYXZlZFsxXSwgJmdhbW1hX3NhdmVkWzJdKTsKLSAgICAgICAgWDExX1NldEdhbW1hTm9Mb2NrKHRoaXMsIG5ld19nYW1tYVswXSwgbmV3X2dhbW1hWzFdLCBuZXdfZ2FtbWFbMl0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFnYW1tYV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZ2FtbWFfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTM1ZTE5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFnYW1tYV9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmbmRlZiBfU0RMX3gxMWdhbW1hX2gKLSNkZWZpbmUgX1NETF94MTFnYW1tYV9oCi0KLWV4dGVybiBpbnQgWDExX1NldFZpZE1vZGVHYW1tYShfVEhJUywgZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSk7Ci1leHRlcm4gaW50IFgxMV9HZXRWaWRNb2RlR2FtbWEoX1RISVMsIGZsb2F0ICpyZWQsIGZsb2F0ICpncmVlbiwgZmxvYXQgKmJsdWUpOwotZXh0ZXJuIHZvaWQgWDExX1NhdmVWaWRNb2RlR2FtbWEoX1RISVMpOwotZXh0ZXJuIHZvaWQgWDExX1N3YXBWaWRNb2RlR2FtbWEoX1RISVMpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFnbC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMWdsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjgwODAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMWdsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfeDExdmlkZW8uaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMWRnYV9jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMWdsX2MuaCIKLQotI2lmIGRlZmluZWQoX19JUklYX18pCi0vKiBJUklYIGRvZXNuJ3QgaGF2ZSBhIEdMIGxpYnJhcnkgdmVyc2lvbmluZyBzeXN0ZW0gKi8KLSNkZWZpbmUgREVGQVVMVF9PUEVOR0wJImxpYkdMLnNvIgotI2VsaWYgZGVmaW5lZChfX01BQ09TWF9fKQotI2RlZmluZSBERUZBVUxUX09QRU5HTAkiL3Vzci9YMTFSNi9saWIvbGliR0wuMS5keWxpYiIKLSNlbGlmIGRlZmluZWQoX19RTlhOVE9fXykKLSNkZWZpbmUgREVGQVVMVF9PUEVOR0wJImxpYkdMLnNvLjMiCi0jZWxpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQotI2RlZmluZSBERUZBVUxUX09QRU5HTAkibGliR0wuc28uNC4wIgotI2Vsc2UKLSNkZWZpbmUgREVGQVVMVF9PUEVOR0wJImxpYkdMLnNvLjEiCi0jZW5kaWYKLQotI2lmbmRlZiBHTFhfQVJCX211bHRpc2FtcGxlCi0jZGVmaW5lIEdMWF9BUkJfbXVsdGlzYW1wbGUKLSNkZWZpbmUgR0xYX1NBTVBMRV9CVUZGRVJTX0FSQiAgICAgICAgICAgICAxMDAwMDAKLSNkZWZpbmUgR0xYX1NBTVBMRVNfQVJCICAgICAgICAgICAgICAgICAgICAxMDAwMDEKLSNlbmRpZgotCi0jaWZuZGVmIEdMWF9FWFRfdmlzdWFsX3JhdGluZwotI2RlZmluZSBHTFhfRVhUX3Zpc3VhbF9yYXRpbmcKLSNkZWZpbmUgR0xYX1ZJU1VBTF9DQVZFQVRfRVhUICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEdMWF9OT05FX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCi0jZGVmaW5lIEdMWF9TTE9XX1ZJU1VBTF9FWFQgICAgICAgICAgICAgICAgMHg4MDAxCi0jZGVmaW5lIEdMWF9OT05fQ09ORk9STUFOVF9WSVNVQUxfRVhUICAgICAgMHg4MDBECi0jZW5kaWYKLQotI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCi1zdGF0aWMgaW50IGdsWEV4dGVuc2lvblN1cHBvcnRlZChfVEhJUywgY29uc3QgY2hhciAqZXh0ZW5zaW9uKQotewotCWNvbnN0IGNoYXIgKmV4dGVuc2lvbnM7Ci0JY29uc3QgY2hhciAqc3RhcnQ7Ci0JY29uc3QgY2hhciAqd2hlcmUsICp0ZXJtaW5hdG9yOwotCi0JLyogRXh0ZW5zaW9uIG5hbWVzIHNob3VsZCBub3QgaGF2ZSBzcGFjZXMuICovCi0Jd2hlcmUgPSBTRExfc3RyY2hyKGV4dGVuc2lvbiwgJyAnKTsKLQlpZiAoIHdoZXJlIHx8ICpleHRlbnNpb24gPT0gJ1wwJyApIHsKLQkgICAgICByZXR1cm4gMDsKLQl9Ci0KLQlleHRlbnNpb25zID0gdGhpcy0+Z2xfZGF0YS0+Z2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKEdGWF9EaXNwbGF5LFNETF9TY3JlZW4pOwotCS8qIEl0IHRha2VzIGEgYml0IG9mIGNhcmUgdG8gYmUgZm9vbC1wcm9vZiBhYm91dCBwYXJzaW5nIHRoZQotCSAqIE9wZW5HTCBleHRlbnNpb25zIHN0cmluZy4gRG9uJ3QgYmUgZm9vbGVkIGJ5IHN1Yi1zdHJpbmdzLCBldGMuCi0JICovCi0JCi0Jc3RhcnQgPSBleHRlbnNpb25zOwotCQotCWZvciAoOzspIHsKLQkJd2hlcmUgPSBTRExfc3Ryc3RyKHN0YXJ0LCBleHRlbnNpb24pOwotCQlpZiAoIXdoZXJlKSBicmVhazsKLQkJCi0JCXRlcm1pbmF0b3IgPSB3aGVyZSArIHN0cmxlbihleHRlbnNpb24pOwotCQlpZiAod2hlcmUgPT0gc3RhcnQgfHwgKih3aGVyZSAtIDEpID09ICcgJykKLQkgICAgICAgIGlmICgqdGVybWluYXRvciA9PSAnICcgfHwgKnRlcm1pbmF0b3IgPT0gJ1wwJykgcmV0dXJuIDE7Ci0JCQkJCQkgIAotCQlzdGFydCA9IHRlcm1pbmF0b3I7Ci0JfQotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0xfR0xYICovCi0KLVhWaXN1YWxJbmZvICpYMTFfR0xfR2V0VmlzdWFsKF9USElTKQotewotI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCi0JLyogNjQgc2VlbXMgbmljZS4gKi8KLQlpbnQgYXR0cmlic1s2NF07Ci0JaW50IGk7Ci0KLQkvKiBsb2FkIHRoZSBnbCBkcml2ZXIgZnJvbSBhIGRlZmF1bHQgcGF0aCAqLwotCWlmICggISB0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCApIHsKLQkgICAgICAgIC8qIG5vIGRyaXZlciBoYXMgYmVlbiBsb2FkZWQsIHVzZSBkZWZhdWx0IChvdXJzZWx2ZXMpICovCi0JICAgICAgICBpZiAoIFgxMV9HTF9Mb2FkTGlicmFyeSh0aGlzLCBOVUxMKSA8IDAgKSB7Ci0JCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQkvKiBTZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgd2luZG93IHdoaWNoIHdlIG11c3QgdXNlICovCi0JaWYgKCBTRExfd2luZG93aWQgKSB7Ci0JCVhXaW5kb3dBdHRyaWJ1dGVzIGE7Ci0JCVhWaXN1YWxJbmZvIHZpX2luOwotCQlpbnQgb3V0X2NvdW50OwotCi0JCVhHZXRXaW5kb3dBdHRyaWJ1dGVzKFNETF9EaXNwbGF5LCBTRExfV2luZG93LCAmYSk7Ci0JCXZpX2luLnNjcmVlbiA9IFNETF9TY3JlZW47Ci0JCXZpX2luLnZpc3VhbGlkID0gWFZpc3VhbElERnJvbVZpc3VhbChhLnZpc3VhbCk7Ci0JCWdseF92aXN1YWxpbmZvID0gWEdldFZpc3VhbEluZm8oU0RMX0Rpc3BsYXksCi0JICAgICAgICAgICAgICAgICAgICAgVmlzdWFsU2NyZWVuTWFza3xWaXN1YWxJRE1hc2ssICZ2aV9pbiwgJm91dF9jb3VudCk7Ci0JCXJldHVybiBnbHhfdmlzdWFsaW5mbzsKLQl9Ci0KLSAgICAgICAgLyogU2V0dXAgb3VyIEdMWCBhdHRyaWJ1dGVzIGFjY29yZGluZyB0byB0aGUgZ2xfY29uZmlnLiAqLwotCWkgPSAwOwotCWF0dHJpYnNbaSsrXSA9IEdMWF9SR0JBOwotCWF0dHJpYnNbaSsrXSA9IEdMWF9SRURfU0laRTsKLQlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcucmVkX3NpemU7Ci0JYXR0cmlic1tpKytdID0gR0xYX0dSRUVOX1NJWkU7Ci0JYXR0cmlic1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmdyZWVuX3NpemU7Ci0JYXR0cmlic1tpKytdID0gR0xYX0JMVUVfU0laRTsKLQlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcuYmx1ZV9zaXplOwotCi0JaWYoIHRoaXMtPmdsX2NvbmZpZy5hbHBoYV9zaXplICkgewotCQlhdHRyaWJzW2krK10gPSBHTFhfQUxQSEFfU0laRTsKLQkJYXR0cmlic1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmFscGhhX3NpemU7Ci0JfQotCi0JaWYoIHRoaXMtPmdsX2NvbmZpZy5idWZmZXJfc2l6ZSApIHsKLQkJYXR0cmlic1tpKytdID0gR0xYX0JVRkZFUl9TSVpFOwotCQlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcuYnVmZmVyX3NpemU7Ci0JfQotCi0JaWYoIHRoaXMtPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyICkgewotCQlhdHRyaWJzW2krK10gPSBHTFhfRE9VQkxFQlVGRkVSOwotCX0KLQotCWF0dHJpYnNbaSsrXSA9IEdMWF9ERVBUSF9TSVpFOwotCWF0dHJpYnNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplOwotCi0JaWYoIHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemUgKSB7Ci0JCWF0dHJpYnNbaSsrXSA9IEdMWF9TVEVOQ0lMX1NJWkU7Ci0JCWF0dHJpYnNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemU7Ci0JfQotCi0JaWYoIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZSApIHsKLQkJYXR0cmlic1tpKytdID0gR0xYX0FDQ1VNX1JFRF9TSVpFOwotCQlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemU7Ci0JfQotCi0JaWYoIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplICkgewotCQlhdHRyaWJzW2krK10gPSBHTFhfQUNDVU1fR1JFRU5fU0laRTsKLQkJYXR0cmlic1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemU7Ci0JfQotCi0JaWYoIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemUgKSB7Ci0JCWF0dHJpYnNbaSsrXSA9IEdMWF9BQ0NVTV9CTFVFX1NJWkU7Ci0JCWF0dHJpYnNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemU7Ci0JfQotCi0JaWYoIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9hbHBoYV9zaXplICkgewotCQlhdHRyaWJzW2krK10gPSBHTFhfQUNDVU1fQUxQSEFfU0laRTsKLQkJYXR0cmlic1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemU7Ci0JfQotCi0JaWYoIHRoaXMtPmdsX2NvbmZpZy5zdGVyZW8gKSB7Ci0JCWF0dHJpYnNbaSsrXSA9IEdMWF9TVEVSRU87Ci0JfQotCQotCWlmKCB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVidWZmZXJzICkgewotCQlhdHRyaWJzW2krK10gPSBHTFhfU0FNUExFX0JVRkZFUlNfQVJCOwotCQlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVidWZmZXJzOwotCX0KLQkKLQlpZiggdGhpcy0+Z2xfY29uZmlnLm11bHRpc2FtcGxlc2FtcGxlcyApIHsKLQkJYXR0cmlic1tpKytdID0gR0xYX1NBTVBMRVNfQVJCOwotCQlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVzYW1wbGVzOwotCX0KLQotCWlmKCB0aGlzLT5nbF9jb25maWcuYWNjZWxlcmF0ZWQgPj0gMCAmJgotCSAgICBnbFhFeHRlbnNpb25TdXBwb3J0ZWQodGhpcywgIkdMWF9FWFRfdmlzdWFsX3JhdGluZyIpICkgewotCQlhdHRyaWJzW2krK10gPSBHTFhfVklTVUFMX0NBVkVBVF9FWFQ7Ci0JCWF0dHJpYnNbaSsrXSA9IEdMWF9OT05FX0VYVDsKLQl9Ci0KLSNpZmRlZiBHTFhfRElSRUNUX0NPTE9SIC8qIFRyeSBmb3IgYSBEaXJlY3RDb2xvciB2aXN1YWwgZm9yIGdhbW1hIHN1cHBvcnQgKi8KLQlpZiAoICFTRExfZ2V0ZW52KCJTRExfVklERU9fWDExX05PRElSRUNUQ09MT1IiKSApIHsKLQkJYXR0cmlic1tpKytdID0gR0xYX1hfVklTVUFMX1RZUEU7Ci0JCWF0dHJpYnNbaSsrXSA9IEdMWF9ESVJFQ1RfQ09MT1I7Ci0JfQotI2VuZGlmCi0JYXR0cmlic1tpKytdID0gTm9uZTsKLQotIAlnbHhfdmlzdWFsaW5mbyA9IHRoaXMtPmdsX2RhdGEtPmdsWENob29zZVZpc3VhbChHRlhfRGlzcGxheSwgCi0JCQkJCQkgIFNETF9TY3JlZW4sIGF0dHJpYnMpOwotI2lmZGVmIEdMWF9ESVJFQ1RfQ09MT1IKLQlpZiggIWdseF92aXN1YWxpbmZvICYmICFTRExfZ2V0ZW52KCJTRExfVklERU9fWDExX05PRElSRUNUQ09MT1IiKSApIHsgLyogTm8gRGlyZWN0Q29sb3IgdmlzdWFsPyAgVHJ5IGFnYWluLi4gKi8KLQkJYXR0cmlic1tpLTNdID0gTm9uZTsKLSAJCWdseF92aXN1YWxpbmZvID0gdGhpcy0+Z2xfZGF0YS0+Z2xYQ2hvb3NlVmlzdWFsKEdGWF9EaXNwbGF5LCAKLQkJCQkJCSAgU0RMX1NjcmVlbiwgYXR0cmlicyk7Ci0JfQotI2VuZGlmCi0JaWYoICFnbHhfdmlzdWFsaW5mbyApIHsKLQkJU0RMX1NldEVycm9yKCAiQ291bGRuJ3QgZmluZCBtYXRjaGluZyBHTFggdmlzdWFsIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLS8qCi0JcHJpbnRmKCJGb3VuZCBHTFggdmlzdWFsIDB4JXhcbiIsIGdseF92aXN1YWxpbmZvLT52aXN1YWxpZCk7Ci0qLwotCXJldHVybiBnbHhfdmlzdWFsaW5mbzsKLSNlbHNlCi0JU0RMX1NldEVycm9yKCJYMTEgZHJpdmVyIG5vdCBjb25maWd1cmVkIHdpdGggT3BlbkdMIik7Ci0JcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLX0KLQotaW50IFgxMV9HTF9DcmVhdGVXaW5kb3coX1RISVMsIGludCB3LCBpbnQgaCkKLXsKLQlpbnQgcmV0dmFsOwotI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCi0JWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKLQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0JdW5zaWduZWQgbG9uZyBibGFjazsKLQotCWJsYWNrID0gKGdseF92aXN1YWxpbmZvLT52aXN1YWwgPT0gRGVmYXVsdFZpc3VhbChTRExfRGlzcGxheSwKLQkJCQkJCSAJU0RMX1NjcmVlbikpCi0JICAgICAgIAk/IEJsYWNrUGl4ZWwoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pIDogMDsKLQlhdHRyaWJ1dGVzLmJhY2tncm91bmRfcGl4ZWwgPSBibGFjazsKLQlhdHRyaWJ1dGVzLmJvcmRlcl9waXhlbCA9IGJsYWNrOwotCWF0dHJpYnV0ZXMuY29sb3JtYXAgPSBTRExfWENvbG9yTWFwOwotCW1hc2sgPSBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWwgfCBDV0NvbG9ybWFwOwotCi0JU0RMX1dpbmRvdyA9IFhDcmVhdGVXaW5kb3coU0RMX0Rpc3BsYXksIFdNd2luZG93LAotCQkJMCwgMCwgdywgaCwgMCwgZ2x4X3Zpc3VhbGluZm8tPmRlcHRoLAotCQkJSW5wdXRPdXRwdXQsIGdseF92aXN1YWxpbmZvLT52aXN1YWwsCi0JCQltYXNrLCAmYXR0cmlidXRlcyk7Ci0JaWYgKCAhU0RMX1dpbmRvdyApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZCBub3QgY3JlYXRlIHdpbmRvdyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHZhbCA9IDA7Ci0jZWxzZQotCVNETF9TZXRFcnJvcigiWDExIGRyaXZlciBub3QgY29uZmlndXJlZCB3aXRoIE9wZW5HTCIpOwotCXJldHZhbCA9IC0xOwotI2VuZGlmCi0JcmV0dXJuKHJldHZhbCk7Ci19Ci0KLWludCBYMTFfR0xfQ3JlYXRlQ29udGV4dChfVEhJUykKLXsKLQlpbnQgcmV0dmFsOwotI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCi0KLQkvKiBXZSBkbyB0aGlzIHRvIGNyZWF0ZSBhIGNsZWFuIHNlcGFyYXRpb24gYmV0d2VlbiBYIGFuZCBHTFggZXJyb3JzLiAqLwotCVhTeW5jKCBTRExfRGlzcGxheSwgRmFsc2UgKTsKLQlnbHhfY29udGV4dCA9IHRoaXMtPmdsX2RhdGEtPmdsWENyZWF0ZUNvbnRleHQoR0ZYX0Rpc3BsYXksIAotCQkJCSAgICAgZ2x4X3Zpc3VhbGluZm8sIE5VTEwsIFRydWUpOwotCVhTeW5jKCBHRlhfRGlzcGxheSwgRmFsc2UgKTsKLQotCWlmICggZ2x4X2NvbnRleHQgPT0gTlVMTCApIHsKLQkJU0RMX1NldEVycm9yKCJDb3VsZCBub3QgY3JlYXRlIEdMIGNvbnRleHQiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JaWYgKCBYMTFfR0xfTWFrZUN1cnJlbnQodGhpcykgPCAwICkgewotCQlyZXR1cm4oLTEpOwotCX0KLQlnbF9hY3RpdmUgPSAxOwotCi0JaWYgKCAhZ2xYRXh0ZW5zaW9uU3VwcG9ydGVkKHRoaXMsICJHTFhfU0dJX3N3YXBfY29udHJvbCIpICkgewotCQl0aGlzLT5nbF9kYXRhLT5nbFhTd2FwSW50ZXJ2YWxTR0kgPSBOVUxMOwotCX0KLQlpZiAoICFnbFhFeHRlbnNpb25TdXBwb3J0ZWQodGhpcywgIkdMWF9NRVNBX3N3YXBfY29udHJvbCIpICkgewotCQl0aGlzLT5nbF9kYXRhLT5nbFhTd2FwSW50ZXJ2YWxNRVNBID0gTlVMTDsKLQkJdGhpcy0+Z2xfZGF0YS0+Z2xYR2V0U3dhcEludGVydmFsTUVTQSA9IE5VTEw7Ci0JfQotCWlmICggdGhpcy0+Z2xfY29uZmlnLnN3YXBfY29udHJvbCA+PSAwICkgewotCQlpZiAoIHRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbE1FU0EgKSB7Ci0JCQl0aGlzLT5nbF9kYXRhLT5nbFhTd2FwSW50ZXJ2YWxNRVNBKHRoaXMtPmdsX2NvbmZpZy5zd2FwX2NvbnRyb2wpOwotCQl9IGVsc2UgaWYgKCB0aGlzLT5nbF9kYXRhLT5nbFhTd2FwSW50ZXJ2YWxTR0kgKSB7Ci0JCQl0aGlzLT5nbF9kYXRhLT5nbFhTd2FwSW50ZXJ2YWxTR0kodGhpcy0+Z2xfY29uZmlnLnN3YXBfY29udHJvbCk7Ci0JCX0KLQl9Ci0jZWxzZQotCVNETF9TZXRFcnJvcigiWDExIGRyaXZlciBub3QgY29uZmlndXJlZCB3aXRoIE9wZW5HTCIpOwotI2VuZGlmCi0JaWYgKCBnbF9hY3RpdmUgKSB7Ci0JCXJldHZhbCA9IDA7Ci0JfSBlbHNlIHsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCXJldHVybihyZXR2YWwpOwotfQotCi12b2lkIFgxMV9HTF9TaHV0ZG93bihfVEhJUykKLXsKLSNpZiBTRExfVklERU9fT1BFTkdMX0dMWAotCS8qIENsZWFuIHVwIE9wZW5HTCAqLwotCWlmKCBnbHhfY29udGV4dCApIHsKLQkJdGhpcy0+Z2xfZGF0YS0+Z2xYTWFrZUN1cnJlbnQoR0ZYX0Rpc3BsYXksIE5vbmUsIE5VTEwpOwotCi0JCWlmIChnbHhfY29udGV4dCAhPSBOVUxMKQotCQkJdGhpcy0+Z2xfZGF0YS0+Z2xYRGVzdHJveUNvbnRleHQoR0ZYX0Rpc3BsYXksIGdseF9jb250ZXh0KTsKLQotCQlnbHhfY29udGV4dCA9IE5VTEw7Ci0JfQotCWdsX2FjdGl2ZSA9IDA7Ci0jZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTF9HTFggKi8KLX0KLQotI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCi0KLS8qIE1ha2UgdGhlIGN1cnJlbnQgY29udGV4dCBhY3RpdmUgKi8KLWludCBYMTFfR0xfTWFrZUN1cnJlbnQoX1RISVMpCi17Ci0JaW50IHJldHZhbDsKLQkKLQlyZXR2YWwgPSAwOwotCWlmICggISB0aGlzLT5nbF9kYXRhLT5nbFhNYWtlQ3VycmVudChHRlhfRGlzcGxheSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1dpbmRvdywgZ2x4X2NvbnRleHQpICkgewotCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBtYWtlIEdMIGNvbnRleHQgY3VycmVudCIpOwotCQlyZXR2YWwgPSAtMTsKLQl9Ci0JWFN5bmMoIEdGWF9EaXNwbGF5LCBGYWxzZSApOwotCi0JLyogTW9yZSBWb29kb28gWCBzZXJ2ZXIgd29ya2Fyb3VuZHMuLi4gR3JyLi4uICovCi0JU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKLQlYMTFfQ2hlY2tER0FNb3VzZSh0aGlzKTsKLQlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0KLQlyZXR1cm4ocmV0dmFsKTsKLX0KLQotLyogR2V0IGF0dHJpYnV0ZSBkYXRhIGZyb20gZ2xYLiAqLwotaW50IFgxMV9HTF9HZXRBdHRyaWJ1dGUoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKQotewotCWludCByZXR2YWw7Ci0JaW50IGdseF9hdHRyaWIgPSBOb25lOwotCi0Jc3dpdGNoKCBhdHRyaWIgKSB7Ci0JICAgIGNhc2UgU0RMX0dMX1JFRF9TSVpFOgotCQlnbHhfYXR0cmliID0gR0xYX1JFRF9TSVpFOwotCQlicmVhazsKLQkgICAgY2FzZSBTRExfR0xfR1JFRU5fU0laRToKLQkJZ2x4X2F0dHJpYiA9IEdMWF9HUkVFTl9TSVpFOwotCQlicmVhazsKLQkgICAgY2FzZSBTRExfR0xfQkxVRV9TSVpFOgotCQlnbHhfYXR0cmliID0gR0xYX0JMVUVfU0laRTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0FMUEhBX1NJWkU6Ci0JCWdseF9hdHRyaWIgPSBHTFhfQUxQSEFfU0laRTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0RPVUJMRUJVRkZFUjoKLQkJZ2x4X2F0dHJpYiA9IEdMWF9ET1VCTEVCVUZGRVI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9HTF9CVUZGRVJfU0laRToKLQkJZ2x4X2F0dHJpYiA9IEdMWF9CVUZGRVJfU0laRTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0RFUFRIX1NJWkU6Ci0JCWdseF9hdHRyaWIgPSBHTFhfREVQVEhfU0laRTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX1NURU5DSUxfU0laRToKLQkJZ2x4X2F0dHJpYiA9IEdMWF9TVEVOQ0lMX1NJWkU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9HTF9BQ0NVTV9SRURfU0laRToKLQkJZ2x4X2F0dHJpYiA9IEdMWF9BQ0NVTV9SRURfU0laRTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkU6Ci0JCWdseF9hdHRyaWIgPSBHTFhfQUNDVU1fR1JFRU5fU0laRTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0JMVUVfU0laRToKLQkJZ2x4X2F0dHJpYiA9IEdMWF9BQ0NVTV9CTFVFX1NJWkU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9HTF9BQ0NVTV9BTFBIQV9TSVpFOgotCQlnbHhfYXR0cmliID0gR0xYX0FDQ1VNX0FMUEhBX1NJWkU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNETF9HTF9TVEVSRU86Ci0JCWdseF9hdHRyaWIgPSBHTFhfU1RFUkVPOwotCQlicmVhazsKLSAJICAgIGNhc2UgU0RMX0dMX01VTFRJU0FNUExFQlVGRkVSUzoKLSAJCWdseF9hdHRyaWIgPSBHTFhfU0FNUExFX0JVRkZFUlNfQVJCOwotIAkJYnJlYWs7Ci0gCSAgICBjYXNlIFNETF9HTF9NVUxUSVNBTVBMRVNBTVBMRVM6Ci0gCQlnbHhfYXR0cmliID0gR0xYX1NBTVBMRVNfQVJCOwotIAkJYnJlYWs7Ci0gCSAgICBjYXNlIFNETF9HTF9BQ0NFTEVSQVRFRF9WSVNVQUw6Ci0JCWlmICggZ2xYRXh0ZW5zaW9uU3VwcG9ydGVkKHRoaXMsICJHTFhfRVhUX3Zpc3VhbF9yYXRpbmciKSApIHsKLQkJCWdseF9hdHRyaWIgPSBHTFhfVklTVUFMX0NBVkVBVF9FWFQ7Ci0JCQlyZXR2YWwgPSB0aGlzLT5nbF9kYXRhLT5nbFhHZXRDb25maWcoR0ZYX0Rpc3BsYXksIGdseF92aXN1YWxpbmZvLCBnbHhfYXR0cmliLCB2YWx1ZSk7Ci0JCQlpZiAoICp2YWx1ZSA9PSBHTFhfU0xPV19WSVNVQUxfRVhUICkgewotCQkJCSp2YWx1ZSA9IFNETF9GQUxTRTsKLQkJCX0gZWxzZSB7Ci0JCQkJKnZhbHVlID0gU0RMX1RSVUU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuKC0xKTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBTRExfR0xfU1dBUF9DT05UUk9MOgotCQlpZiAoIHRoaXMtPmdsX2RhdGEtPmdsWEdldFN3YXBJbnRlcnZhbE1FU0EgKSB7Ci0JCQkqdmFsdWUgPSB0aGlzLT5nbF9kYXRhLT5nbFhHZXRTd2FwSW50ZXJ2YWxNRVNBKCk7Ci0JCQlyZXR1cm4oMCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlyZXR1cm4oLTEpOwotCX0KLQotCXJldHZhbCA9IHRoaXMtPmdsX2RhdGEtPmdsWEdldENvbmZpZyhHRlhfRGlzcGxheSwgZ2x4X3Zpc3VhbGluZm8sIGdseF9hdHRyaWIsIHZhbHVlKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXZvaWQgWDExX0dMX1N3YXBCdWZmZXJzKF9USElTKQotewotCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBCdWZmZXJzKEdGWF9EaXNwbGF5LCBTRExfV2luZG93KTsKLX0KLQotI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0xfR0xYICovCi0KLSNkZWZpbmUgT1BFTkdMX1JFUVVJUlNfRExPUEVOCi0jaWYgZGVmaW5lZChPUEVOR0xfUkVRVUlSU19ETE9QRU4pICYmIGRlZmluZWQoU0RMX0xPQURTT19ETE9QRU4pCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNkZWZpbmUgR0xfTG9hZE9iamVjdChYKQlkbG9wZW4oWCwgKFJUTERfTk9XfFJUTERfR0xPQkFMKSkKLSNkZWZpbmUgR0xfTG9hZEZ1bmN0aW9uCQlkbHN5bQotI2RlZmluZSBHTF9VbmxvYWRPYmplY3QJCWRsY2xvc2UKLSNlbHNlCi0jZGVmaW5lIEdMX0xvYWRPYmplY3QJU0RMX0xvYWRPYmplY3QKLSNkZWZpbmUgR0xfTG9hZEZ1bmN0aW9uCVNETF9Mb2FkRnVuY3Rpb24KLSNkZWZpbmUgR0xfVW5sb2FkT2JqZWN0CVNETF9VbmxvYWRPYmplY3QKLSNlbmRpZgotCi12b2lkIFgxMV9HTF9VbmxvYWRMaWJyYXJ5KF9USElTKQotewotI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCi0JaWYgKCB0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCApIHsKLQotCQlHTF9VbmxvYWRPYmplY3QodGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUpOwotCi0JCXRoaXMtPmdsX2RhdGEtPmdsWEdldFByb2NBZGRyZXNzID0gTlVMTDsKLQkJdGhpcy0+Z2xfZGF0YS0+Z2xYQ2hvb3NlVmlzdWFsID0gTlVMTDsKLQkJdGhpcy0+Z2xfZGF0YS0+Z2xYQ3JlYXRlQ29udGV4dCA9IE5VTEw7Ci0JCXRoaXMtPmdsX2RhdGEtPmdsWERlc3Ryb3lDb250ZXh0ID0gTlVMTDsKLQkJdGhpcy0+Z2xfZGF0YS0+Z2xYTWFrZUN1cnJlbnQgPSBOVUxMOwotCQl0aGlzLT5nbF9kYXRhLT5nbFhTd2FwQnVmZmVycyA9IE5VTEw7Ci0JCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbFNHSSA9IE5VTEw7Ci0JCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbE1FU0EgPSBOVUxMOwotCQl0aGlzLT5nbF9kYXRhLT5nbFhHZXRTd2FwSW50ZXJ2YWxNRVNBID0gTlVMTDsKLQotCQl0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IE5VTEw7Ci0JCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMDsKLQl9Ci0jZW5kaWYKLX0KLQotI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCi0KLS8qIFBhc3NpbmcgYSBOVUxMIHBhdGggbWVhbnMgbG9hZCBwb2ludGVycyBmcm9tIHRoZSBhcHBsaWNhdGlvbiAqLwotaW50IFgxMV9HTF9Mb2FkTGlicmFyeShfVEhJUywgY29uc3QgY2hhciogcGF0aCkgCi17Ci0Jdm9pZCogaGFuZGxlID0gTlVMTDsKLQotCWlmICggZ2xfYWN0aXZlICkgewotCQlTRExfU2V0RXJyb3IoIk9wZW5HTCBjb250ZXh0IGFscmVhZHkgY3JlYXRlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCBwYXRoID09IE5VTEwgKSB7Ci0JCXBhdGggPSBTRExfZ2V0ZW52KCJTRExfVklERU9fR0xfRFJJVkVSIik7Ci0JCWlmICggcGF0aCA9PSBOVUxMICkgewotCQkJcGF0aCA9IERFRkFVTFRfT1BFTkdMOwotCQl9Ci0JfQotCi0JaGFuZGxlID0gR0xfTG9hZE9iamVjdChwYXRoKTsKLQlpZiAoIGhhbmRsZSA9PSBOVUxMICkgewotI2lmIGRlZmluZWQoT1BFTkdMX1JFUVVJUlNfRExPUEVOKSAmJiBkZWZpbmVkKFNETF9MT0FEU09fRExPUEVOKQotCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzIiwgcGF0aCk7Ci0jZWxzZQotCQkvKiBTRExfTG9hZE9iamVjdCgpIHdpbGwgY2FsbCBTRExfU2V0RXJyb3IoKSBmb3IgdXMuICovCi0jZW5kaWYKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFVubG9hZCB0aGUgb2xkIGRyaXZlciBhbmQgcmVzZXQgdGhlIHBvaW50ZXJzICovCi0JWDExX0dMX1VubG9hZExpYnJhcnkodGhpcyk7Ci0KLQkvKiBMb2FkIG5ldyBmdW5jdGlvbiBwb2ludGVycyAqLwotCXRoaXMtPmdsX2RhdGEtPmdsWEdldFByb2NBZGRyZXNzID0KLQkJKHZvaWQgKigqKShjb25zdCBHTHVieXRlICopKSBHTF9Mb2FkRnVuY3Rpb24oaGFuZGxlLCAiZ2xYR2V0UHJvY0FkZHJlc3NBUkIiKTsKLQl0aGlzLT5nbF9kYXRhLT5nbFhDaG9vc2VWaXN1YWwgPQotCQkoWFZpc3VhbEluZm8gKigqKShEaXNwbGF5ICosIGludCwgaW50ICopKSBHTF9Mb2FkRnVuY3Rpb24oaGFuZGxlLCAiZ2xYQ2hvb3NlVmlzdWFsIik7Ci0JdGhpcy0+Z2xfZGF0YS0+Z2xYQ3JlYXRlQ29udGV4dCA9Ci0JCShHTFhDb250ZXh0ICgqKShEaXNwbGF5ICosIFhWaXN1YWxJbmZvICosIEdMWENvbnRleHQsIGludCkpIEdMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJnbFhDcmVhdGVDb250ZXh0Iik7Ci0JdGhpcy0+Z2xfZGF0YS0+Z2xYRGVzdHJveUNvbnRleHQgPQotCQkodm9pZCAoKikoRGlzcGxheSAqLCBHTFhDb250ZXh0KSkgR0xfTG9hZEZ1bmN0aW9uKGhhbmRsZSwgImdsWERlc3Ryb3lDb250ZXh0Iik7Ci0JdGhpcy0+Z2xfZGF0YS0+Z2xYTWFrZUN1cnJlbnQgPQotCQkoaW50ICgqKShEaXNwbGF5ICosIEdMWERyYXdhYmxlLCBHTFhDb250ZXh0KSkgR0xfTG9hZEZ1bmN0aW9uKGhhbmRsZSwgImdsWE1ha2VDdXJyZW50Iik7Ci0JdGhpcy0+Z2xfZGF0YS0+Z2xYU3dhcEJ1ZmZlcnMgPQotCQkodm9pZCAoKikoRGlzcGxheSAqLCBHTFhEcmF3YWJsZSkpIEdMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJnbFhTd2FwQnVmZmVycyIpOwotCXRoaXMtPmdsX2RhdGEtPmdsWEdldENvbmZpZyA9Ci0JCShpbnQgKCopKERpc3BsYXkgKiwgWFZpc3VhbEluZm8gKiwgaW50LCBpbnQgKikpIEdMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJnbFhHZXRDb25maWciKTsKLQl0aGlzLT5nbF9kYXRhLT5nbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcgPQotCQkoY29uc3QgY2hhciAqKCopKERpc3BsYXkgKiwgaW50KSkgR0xfTG9hZEZ1bmN0aW9uKGhhbmRsZSwgImdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyIpOwotCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbFNHSSA9Ci0JCShpbnQgKCopKGludCkpIEdMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJnbFhTd2FwSW50ZXJ2YWxTR0kiKTsKLQl0aGlzLT5nbF9kYXRhLT5nbFhTd2FwSW50ZXJ2YWxNRVNBID0KLQkJKEdMaW50ICgqKSh1bnNpZ25lZCkpIEdMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJnbFhTd2FwSW50ZXJ2YWxNRVNBIik7Ci0JdGhpcy0+Z2xfZGF0YS0+Z2xYR2V0U3dhcEludGVydmFsTUVTQSA9Ci0JCShHTGludCAoKikodm9pZCkpIEdMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJnbFhHZXRTd2FwSW50ZXJ2YWxNRVNBIik7Ci0KLQlpZiAoICh0aGlzLT5nbF9kYXRhLT5nbFhDaG9vc2VWaXN1YWwgPT0gTlVMTCkgfHwgCi0JICAgICAodGhpcy0+Z2xfZGF0YS0+Z2xYQ3JlYXRlQ29udGV4dCA9PSBOVUxMKSB8fAotCSAgICAgKHRoaXMtPmdsX2RhdGEtPmdsWERlc3Ryb3lDb250ZXh0ID09IE5VTEwpIHx8Ci0JICAgICAodGhpcy0+Z2xfZGF0YS0+Z2xYTWFrZUN1cnJlbnQgPT0gTlVMTCkgfHwKLQkgICAgICh0aGlzLT5nbF9kYXRhLT5nbFhTd2FwQnVmZmVycyA9PSBOVUxMKSB8fAotCSAgICAgKHRoaXMtPmdsX2RhdGEtPmdsWEdldENvbmZpZyA9PSBOVUxMKSB8fAotCSAgICAgKHRoaXMtPmdsX2RhdGEtPmdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyA9PSBOVUxMKSkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCByZXRyaWV2ZSBPcGVuR0wgZnVuY3Rpb25zIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IGhhbmRsZTsKLQl0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7Ci0JaWYgKCBwYXRoICkgewotCQlTRExfc3RybGNweSh0aGlzLT5nbF9jb25maWcuZHJpdmVyX3BhdGgsIHBhdGgsCi0JCQlTRExfYXJyYXlzaXplKHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCkpOwotCX0gZWxzZSB7Ci0JCSp0aGlzLT5nbF9jb25maWcuZHJpdmVyX3BhdGggPSAnXDAnOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCAqWDExX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyKiBwcm9jKQotewotCXZvaWQqIGhhbmRsZTsKLQkKLQloYW5kbGUgPSB0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZTsKLQlpZiAoIHRoaXMtPmdsX2RhdGEtPmdsWEdldFByb2NBZGRyZXNzICkgewotCQlyZXR1cm4gdGhpcy0+Z2xfZGF0YS0+Z2xYR2V0UHJvY0FkZHJlc3MoKGNvbnN0IEdMdWJ5dGUgKilwcm9jKTsKLQl9Ci0JcmV0dXJuIEdMX0xvYWRGdW5jdGlvbihoYW5kbGUsIHByb2MpOwotfQotCi0jZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTF9HTFggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFnbF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExZ2xfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2NhMzc4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFnbF9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCi0jaW5jbHVkZSA8R0wvZ2x4Lmg+Ci0jaW5jbHVkZSAiU0RMX2xvYWRzby5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLQotc3RydWN0IFNETF9Qcml2YXRlR0xEYXRhIHsKLSAgICBpbnQgZ2xfYWN0aXZlOyAvKiB0byBzdG9wIHN3aXRjaGluZyBkcml2ZXJzIHdoaWxlIHdlIGhhdmUgYSB2YWxpZCBjb250ZXh0ICovCi0KLSNpZiBTRExfVklERU9fT1BFTkdMX0dMWAotICAgIEdMWENvbnRleHQgZ2x4X2NvbnRleHQ7CS8qIEN1cnJlbnQgR0wgY29udGV4dCAqLwotICAgIFhWaXN1YWxJbmZvKiBnbHhfdmlzdWFsaW5mbzsgLyogWFZpc3VhbEluZm8qIHJldHVybmVkIGJ5IGdsWENob29zZVZpc3VhbCAqLwotCi0gICAgdm9pZCAqICgqZ2xYR2V0UHJvY0FkZHJlc3MpKGNvbnN0IEdMdWJ5dGUgKnByb2NOYW1lKTsKLQotICAgIFhWaXN1YWxJbmZvKiAoKmdsWENob29zZVZpc3VhbCkKLQkJKCBEaXNwbGF5KgkJZHB5LAotCQkgIGludAkJCXNjcmVlbiwKLQkJICBpbnQqCQkJYXR0cmliTGlzdCApOwotCi0gICAgR0xYQ29udGV4dCAoKmdsWENyZWF0ZUNvbnRleHQpCi0JCSggRGlzcGxheSoJCWRweSwKLQkJICBYVmlzdWFsSW5mbyoJCXZpcywKLQkJICBHTFhDb250ZXh0CQlzaGFyZUxpc3QsCi0JCSAgQm9vbAkJCWRpcmVjdCApOwotCi0gICAgdm9pZCAoKmdsWERlc3Ryb3lDb250ZXh0KQotCQkoIERpc3BsYXkqIAkJZHB5LAotCQkgIEdMWENvbnRleHQJCWN0eCApOwotCi0gICAgQm9vbCAoKmdsWE1ha2VDdXJyZW50KQotCQkoIERpc3BsYXkqCQlkcHksCi0JCSAgR0xYRHJhd2FibGUJCWRyYXdhYmxlLAotCQkgIEdMWENvbnRleHQJCWN0eCApOwotCi0gICAgdm9pZCAoKmdsWFN3YXBCdWZmZXJzKQotCQkoIERpc3BsYXkqCQlkcHksCi0JCSAgR0xYRHJhd2FibGUJCWRyYXdhYmxlICk7Ci0KLSAgICBpbnQgKCpnbFhHZXRDb25maWcpCi0JICggRGlzcGxheSogZHB5LAotCSAgIFhWaXN1YWxJbmZvKiB2aXN1YWxfaW5mbywKLQkgICBpbnQgYXR0cmliLAotCSAgIGludCogdmFsdWUgKTsKLQotICAgIGNvbnN0IGNoYXIgKigqZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKQotCSAgICAoIERpc3BsYXkqIGRweSwKLQkgICAgICBpbnQgc2NyZWVuICk7Ci0KLSAgICBpbnQgKCpnbFhTd2FwSW50ZXJ2YWxTR0kpICggaW50IGludGVydmFsICk7Ci0gICAgR0xpbnQgKCpnbFhTd2FwSW50ZXJ2YWxNRVNBKSAoIHVuc2lnbmVkIGludGVydmFsICk7Ci0gICAgR0xpbnQgKCpnbFhHZXRTd2FwSW50ZXJ2YWxNRVNBKSAoIHZvaWQgKTsKLQotI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0xfR0xYICovCi19OwotCi0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgZ2xfYWN0aXZlCQkodGhpcy0+Z2xfZGF0YS0+Z2xfYWN0aXZlKQotI2RlZmluZSBnbHhfY29udGV4dAkJKHRoaXMtPmdsX2RhdGEtPmdseF9jb250ZXh0KQotI2RlZmluZSBnbHhfdmlzdWFsaW5mbwkJKHRoaXMtPmdsX2RhdGEtPmdseF92aXN1YWxpbmZvKQotCi0vKiBPcGVuR0wgZnVuY3Rpb25zICovCi1leHRlcm4gWFZpc3VhbEluZm8gKlgxMV9HTF9HZXRWaXN1YWwoX1RISVMpOwotZXh0ZXJuIGludCBYMTFfR0xfQ3JlYXRlV2luZG93KF9USElTLCBpbnQgdywgaW50IGgpOwotZXh0ZXJuIGludCBYMTFfR0xfQ3JlYXRlQ29udGV4dChfVEhJUyk7Ci1leHRlcm4gdm9pZCBYMTFfR0xfU2h1dGRvd24oX1RISVMpOwotI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCi1leHRlcm4gaW50IFgxMV9HTF9NYWtlQ3VycmVudChfVEhJUyk7Ci1leHRlcm4gaW50IFgxMV9HTF9HZXRBdHRyaWJ1dGUoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKTsKLWV4dGVybiB2b2lkIFgxMV9HTF9Td2FwQnVmZmVycyhfVEhJUyk7Ci1leHRlcm4gaW50IFgxMV9HTF9Mb2FkTGlicmFyeShfVEhJUywgY29uc3QgY2hhciogcGF0aCk7Ci1leHRlcm4gdm9pZCAqWDExX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyKiBwcm9jKTsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgWDExX0dMX1VubG9hZExpYnJhcnkoX1RISVMpOwotCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExaW1hZ2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFpbWFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQwMTFkLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFpbWFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMWltYWdlX2MuaCIKLQotI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCi0KLS8qIFNoYXJlZCBtZW1vcnkgZXJyb3IgaGFuZGxlciByb3V0aW5lICovCi1zdGF0aWMgaW50IHNobV9lcnJvcjsKLXN0YXRpYyBpbnQgKCpYX2hhbmRsZXIpKERpc3BsYXkgKiwgWEVycm9yRXZlbnQgKikgPSBOVUxMOwotc3RhdGljIGludCBzaG1fZXJyaGFuZGxlcihEaXNwbGF5ICpkLCBYRXJyb3JFdmVudCAqZSkKLXsKLSAgICAgICAgaWYgKCBlLT5lcnJvcl9jb2RlID09IEJhZEFjY2VzcyApIHsKLSAgICAgICAgCXNobV9lcnJvciA9IFRydWU7Ci0gICAgICAgIAlyZXR1cm4oMCk7Ci0gICAgICAgIH0gZWxzZQotCQlyZXR1cm4oWF9oYW5kbGVyKGQsZSkpOwotfQotCi1zdGF0aWMgdm9pZCB0cnlfbWl0c2htKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKQotewotCS8qIER5bmFtaWMgWDExIG1heSBub3QgaGF2ZSBTSE0gZW50cnkgcG9pbnRzIG9uIHRoaXMgYm94LiAqLwotCWlmICgodXNlX21pdHNobSkgJiYgKCFTRExfWDExX0hBVkVfU0hNKSkKLQkJdXNlX21pdHNobSA9IDA7Ci0KLQlpZighdXNlX21pdHNobSkKLQkJcmV0dXJuOwotCXNobWluZm8uc2htaWQgPSBzaG1nZXQoSVBDX1BSSVZBVEUsIHNjcmVlbi0+aCpzY3JlZW4tPnBpdGNoLAotCQkJICAgICAgIElQQ19DUkVBVCB8IDA3NzcpOwotCWlmICggc2htaW5mby5zaG1pZCA+PSAwICkgewotCQlzaG1pbmZvLnNobWFkZHIgPSAoY2hhciAqKXNobWF0KHNobWluZm8uc2htaWQsIDAsIDApOwotCQlzaG1pbmZvLnJlYWRPbmx5ID0gRmFsc2U7Ci0JCWlmICggc2htaW5mby5zaG1hZGRyICE9IChjaGFyICopLTEgKSB7Ci0JCQlzaG1fZXJyb3IgPSBGYWxzZTsKLQkJCVhfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIoc2htX2VycmhhbmRsZXIpOwotCQkJWFNobUF0dGFjaChTRExfRGlzcGxheSwgJnNobWluZm8pOwotCQkJWFN5bmMoU0RMX0Rpc3BsYXksIFRydWUpOwotCQkJWFNldEVycm9ySGFuZGxlcihYX2hhbmRsZXIpOwotCQkJaWYgKCBzaG1fZXJyb3IgKQotCQkJCXNobWR0KHNobWluZm8uc2htYWRkcik7Ci0JCX0gZWxzZSB7Ci0JCQlzaG1fZXJyb3IgPSBUcnVlOwotCQl9Ci0JCXNobWN0bChzaG1pbmZvLnNobWlkLCBJUENfUk1JRCwgTlVMTCk7Ci0JfSBlbHNlIHsKLQkJc2htX2Vycm9yID0gVHJ1ZTsKLQl9Ci0JaWYgKCBzaG1fZXJyb3IgKQotCQl1c2VfbWl0c2htID0gMDsKLQlpZiAoIHVzZV9taXRzaG0gKQotCQlzY3JlZW4tPnBpeGVscyA9IHNobWluZm8uc2htYWRkcjsKLX0KLSNlbmRpZiAvKiAhIE5PX1NIQVJFRF9NRU1PUlkgKi8KLQotLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KLXN0YXRpYyB2b2lkIFgxMV9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLXN0YXRpYyB2b2lkIFgxMV9NSVRTSE1VcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKLQotaW50IFgxMV9TZXR1cEltYWdlKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKQotewotI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCi0JdHJ5X21pdHNobSh0aGlzLCBzY3JlZW4pOwotCWlmKHVzZV9taXRzaG0pIHsKLQkJU0RMX1hpbWFnZSA9IFhTaG1DcmVhdGVJbWFnZShTRExfRGlzcGxheSwgU0RMX1Zpc3VhbCwKLQkJCQkJICAgICB0aGlzLT5oaWRkZW4tPmRlcHRoLCBaUGl4bWFwLAotCQkJCQkgICAgIHNobWluZm8uc2htYWRkciwgJnNobWluZm8sIAotCQkJCQkgICAgIHNjcmVlbi0+dywgc2NyZWVuLT5oKTsKLQkJaWYoIVNETF9YaW1hZ2UpIHsKLQkJCVhTaG1EZXRhY2goU0RMX0Rpc3BsYXksICZzaG1pbmZvKTsKLQkJCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Ci0JCQlzaG1kdChzaG1pbmZvLnNobWFkZHIpOwotCQkJc2NyZWVuLT5waXhlbHMgPSBOVUxMOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQl0aGlzLT5VcGRhdGVSZWN0cyA9IFgxMV9NSVRTSE1VcGRhdGU7Ci0JfQotCWlmKCF1c2VfbWl0c2htKQotI2VuZGlmIC8qIG5vdCBOT19TSEFSRURfTUVNT1JZICovCi0JewotCQlpbnQgYnBwOwotCQlzY3JlZW4tPnBpeGVscyA9IFNETF9tYWxsb2Moc2NyZWVuLT5oKnNjcmVlbi0+cGl0Y2gpOwotCQlpZiAoIHNjcmVlbi0+cGl4ZWxzID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotIAkgICAgICAgIGJwcCA9IHNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwotCQlTRExfWGltYWdlID0gWENyZWF0ZUltYWdlKFNETF9EaXNwbGF5LCBTRExfVmlzdWFsLAotCQkJCQkgIHRoaXMtPmhpZGRlbi0+ZGVwdGgsIFpQaXhtYXAsIDAsCi0JCQkJCSAgKGNoYXIgKilzY3JlZW4tPnBpeGVscywgCi0JCQkJCSAgc2NyZWVuLT53LCBzY3JlZW4tPmgsCi0JCQkJCSAgMzIsIDApOwotCQlpZiAoIFNETF9YaW1hZ2UgPT0gTlVMTCApCi0JCQlnb3RvIGVycm9yOwotCQkvKiBYUHV0SW1hZ2Ugd2lsbCBjb252ZXJ0IGJ5dGUgc2V4IGF1dG9tYXRpY2FsbHkgKi8KLQkJU0RMX1hpbWFnZS0+Ynl0ZV9vcmRlciA9IChTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKQotCQkJICAgICAgICAgICAgICAgICA/IE1TQkZpcnN0IDogTFNCRmlyc3Q7Ci0JCXRoaXMtPlVwZGF0ZVJlY3RzID0gWDExX05vcm1hbFVwZGF0ZTsKLQl9Ci0Jc2NyZWVuLT5waXRjaCA9IFNETF9YaW1hZ2UtPmJ5dGVzX3Blcl9saW5lOwotCXJldHVybigwKTsKLQotZXJyb3I6Ci0JU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgWEltYWdlIik7Ci0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgWDExX0Rlc3Ryb3lJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbikKLXsKLQlpZiAoIFNETF9YaW1hZ2UgKSB7Ci0JCVhEZXN0cm95SW1hZ2UoU0RMX1hpbWFnZSk7Ci0jaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKLQkJaWYgKCB1c2VfbWl0c2htICkgewotCQkJWFNobURldGFjaChTRExfRGlzcGxheSwgJnNobWluZm8pOwotCQkJWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKLQkJCXNobWR0KHNobWluZm8uc2htYWRkcik7Ci0JCX0KLSNlbmRpZiAvKiAhIE5PX1NIQVJFRF9NRU1PUlkgKi8KLQkJU0RMX1hpbWFnZSA9IE5VTEw7Ci0JfQotCWlmICggc2NyZWVuICkgewotCQlzY3JlZW4tPnBpeGVscyA9IE5VTEw7Ci0JfQotfQotCi0vKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW0gKi8KLXN0YXRpYyBpbnQgbnVtX0NQVSh2b2lkKQotewotICAgICAgIHN0YXRpYyBpbnQgbnVtX2NwdXMgPSAwOwotCi0gICAgICAgaWYoIW51bV9jcHVzKSB7Ci0jaWYgZGVmaW5lZChfX0xJTlVYX18pCi0gICAgICAgICAgIGNoYXIgbGluZVtCVUZTSVpdOwotICAgICAgICAgICBGSUxFICpwc3RhdCA9IGZvcGVuKCIvcHJvYy9zdGF0IiwgInIiKTsKLSAgICAgICAgICAgaWYgKCBwc3RhdCApIHsKLSAgICAgICAgICAgICAgIHdoaWxlICggZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBwc3RhdCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKFNETF9tZW1jbXAobGluZSwgImNwdSIsIDMpID09IDAgJiYgbGluZVszXSAhPSAnICcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgKytudW1fY3B1czsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBmY2xvc2UocHN0YXQpOwotICAgICAgICAgICB9Ci0jZWxpZiBkZWZpbmVkKF9fSVJJWF9fKQotCSAgIG51bV9jcHVzID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7Ci0jZWxpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQotCSAgIC8qIG51bWJlciBvZiBwcm9jZXNzb3JzIG9ubGluZSAoU1ZSNC4wTVAgY29tcGxpYW50IG1hY2hpbmVzKSAqLwotICAgICAgICAgICBudW1fY3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOwotI2VsaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfQ09ORikKLQkgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBjb25maWd1cmVkIChTVlI0LjBNUCBjb21wbGlhbnQgbWFjaGluZXMpICovCi0gICAgICAgICAgIG51bV9jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORik7Ci0jZW5kaWYKLSAgICAgICAgICAgaWYgKCBudW1fY3B1cyA8PSAwICkgewotICAgICAgICAgICAgICAgbnVtX2NwdXMgPSAxOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHJldHVybiBudW1fY3B1czsKLX0KLQotaW50IFgxMV9SZXNpemVJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbiwgVWludDMyIGZsYWdzKQotewotCWludCByZXR2YWw7Ci0KLQlYMTFfRGVzdHJveUltYWdlKHRoaXMsIHNjcmVlbik7Ci0gICAgICAgIGlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgeyAgLyogTm8gaW1hZ2Ugd2hlbiB1c2luZyBHTCAqLwotICAgICAgICAJcmV0dmFsID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLQkJcmV0dmFsID0gWDExX1NldHVwSW1hZ2UodGhpcywgc2NyZWVuKTsKLQkJLyogV2Ugc3VwcG9ydCBhc3luY2hyb25vdXMgYmxpdHRpbmcgb24gdGhlIGRpc3BsYXkgKi8KLQkJaWYgKCBmbGFncyAmIFNETF9BU1lOQ0JMSVQgKSB7Ci0JCQkvKiBUaGlzIGlzIGFjdHVhbGx5IHNsb3dlciBvbiBzaW5nbGUtQ1BVIHN5c3RlbXMsCi0JCQkgICBwcm9iYWJseSBiZWNhdXNlIG9mIENQVSBjb250ZW50aW9uIGJldHdlZW4gdGhlCi0JCQkgICBYIHNlcnZlciBhbmQgdGhlIGFwcGxpY2F0aW9uLgotCQkJICAgTm90ZTogSXMgdGhpcyBzdGlsbCB0cnVlIHdpdGggWEZyZWU4NiA0LjA/Ci0JCQkqLwotCQkJaWYgKCBudW1fQ1BVKCkgPiAxICkgewotCQkJCXNjcmVlbi0+ZmxhZ3MgfD0gU0RMX0FTWU5DQkxJVDsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4ocmV0dmFsKTsKLX0KLQotLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KLWludCBYMTFfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybigtMSk7Ci19Ci12b2lkIFgxMV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm47Ci19Ci0KLWludCBYMTFfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JaWYgKCAoc3VyZmFjZSA9PSBTRExfVmlkZW9TdXJmYWNlKSAmJiBibGl0X3F1ZXVlZCApIHsKLQkJWFN5bmMoR0ZYX0Rpc3BsYXksIEZhbHNlKTsKLQkJYmxpdF9xdWV1ZWQgPSAwOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci12b2lkIFgxMV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotaW50IFgxMV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFgxMV9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCWludCBpOwotCQotCWZvciAoaSA9IDA7IGkgPCBudW1yZWN0czsgKytpKSB7Ci0JCWlmICggcmVjdHNbaV0udyA9PSAwIHx8IHJlY3RzW2ldLmggPT0gMCApIHsgLyogQ2xpcHBlZD8gKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCVhQdXRJbWFnZShHRlhfRGlzcGxheSwgU0RMX1dpbmRvdywgU0RMX0dDLCBTRExfWGltYWdlLAotCQkJICByZWN0c1tpXS54LCByZWN0c1tpXS55LAotCQkJICByZWN0c1tpXS54LCByZWN0c1tpXS55LCByZWN0c1tpXS53LCByZWN0c1tpXS5oKTsKLQl9Ci0JaWYgKCBTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9BU1lOQ0JMSVQgKSB7Ci0JCVhGbHVzaChHRlhfRGlzcGxheSk7Ci0JCWJsaXRfcXVldWVkID0gMTsKLQl9IGVsc2UgewotCQlYU3luYyhHRlhfRGlzcGxheSwgRmFsc2UpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgWDExX01JVFNITVVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCi17Ci0jaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKLQlpbnQgaTsKLQotCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgewotCQlpZiAoIHJlY3RzW2ldLncgPT0gMCB8fCByZWN0c1tpXS5oID09IDAgKSB7IC8qIENsaXBwZWQ/ICovCi0JCQljb250aW51ZTsKLQkJfQotCQlYU2htUHV0SW1hZ2UoR0ZYX0Rpc3BsYXksIFNETF9XaW5kb3csIFNETF9HQywgU0RMX1hpbWFnZSwKLQkJCQlyZWN0c1tpXS54LCByZWN0c1tpXS55LAotCQkJCXJlY3RzW2ldLngsIHJlY3RzW2ldLnksIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgsCi0JCQkJCQkJCQlGYWxzZSk7Ci0JfQotCWlmICggU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfQVNZTkNCTElUICkgewotCQlYRmx1c2goR0ZYX0Rpc3BsYXkpOwotCQlibGl0X3F1ZXVlZCA9IDE7Ci0JfSBlbHNlIHsKLQkJWFN5bmMoR0ZYX0Rpc3BsYXksIEZhbHNlKTsKLQl9Ci0jZW5kaWYgLyogISBOT19TSEFSRURfTUVNT1JZICovCi19Ci0KLS8qIFRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggdGhlIGF1dG9tYXRpYyByZWZyZXNoaW5nIG9mIHRoZSBkaXNwbGF5LgotICAgRXZlbiB0aG91Z2ggdGhlIFhWaWRlbyBjb2RlIHVzZXMgdGhlIEdGWF9EaXNwbGF5IHRvIHVwZGF0ZSB0aGUKLSAgIHZpZGVvIG1lbW9yeSwgaXQgYXBwZWFycyB0aGF0IHVwZGF0aW5nIHRoZSB3aW5kb3cgYXN5bmNocm9ub3VzbHkKLSAgIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHdpbGwgY2F1c2UgImJsYWNrb3V0cyIgb2YgdGhlIHdpbmRvdy4KLSAgIFRoaXMgaXMgYSBzb3J0IG9mIGEgaGFja2VkIHdvcmthcm91bmQgZm9yIHRoZSBwcm9ibGVtLgotKi8KLXN0YXRpYyBpbnQgZW5hYmxlX2F1dG9yZWZyZXNoID0gMTsKLQotdm9pZCBYMTFfRGlzYWJsZUF1dG9SZWZyZXNoKF9USElTKQotewotCS0tZW5hYmxlX2F1dG9yZWZyZXNoOwotfQotCi12b2lkIFgxMV9FbmFibGVBdXRvUmVmcmVzaChfVEhJUykKLXsKLQkrK2VuYWJsZV9hdXRvcmVmcmVzaDsKLX0KLQotdm9pZCBYMTFfUmVmcmVzaERpc3BsYXkoX1RISVMpCi17Ci0JLyogRG9uJ3QgcmVmcmVzaCBhIGRpc3BsYXkgdGhhdCBkb2Vzbid0IGhhdmUgYW4gaW1hZ2UgKGxpa2UgR0wpCi0JICAgSW5zdGVhZCwgcG9zdCBhbiBleHBvc2UgZXZlbnQgc28gdGhlIGFwcGxpY2F0aW9uIGNhbiByZWZyZXNoLgotCSAqLwotCWlmICggISBTRExfWGltYWdlIHx8IChlbmFibGVfYXV0b3JlZnJlc2ggPD0gMCkgKSB7Ci0JCVNETF9Qcml2YXRlRXhwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0jaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKLQlpZiAoIHRoaXMtPlVwZGF0ZVJlY3RzID09IFgxMV9NSVRTSE1VcGRhdGUgKSB7Ci0JCVhTaG1QdXRJbWFnZShTRExfRGlzcGxheSwgU0RMX1dpbmRvdywgU0RMX0dDLCBTRExfWGltYWdlLAotCQkJCTAsIDAsIDAsIDAsIHRoaXMtPnNjcmVlbi0+dywgdGhpcy0+c2NyZWVuLT5oLAotCQkJCUZhbHNlKTsKLQl9IGVsc2UKLSNlbmRpZiAvKiAhIE5PX1NIQVJFRF9NRU1PUlkgKi8KLQl7Ci0JCVhQdXRJbWFnZShTRExfRGlzcGxheSwgU0RMX1dpbmRvdywgU0RMX0dDLCBTRExfWGltYWdlLAotCQkJICAwLCAwLCAwLCAwLCB0aGlzLT5zY3JlZW4tPncsIHRoaXMtPnNjcmVlbi0+aCk7Ci0JfQotCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFpbWFnZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExaW1hZ2VfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmZmODM4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFpbWFnZV9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotI2luY2x1ZGUgIlNETF94MTF2aWRlby5oIgotCi1leHRlcm4gaW50IFgxMV9TZXR1cEltYWdlKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKTsKLWV4dGVybiB2b2lkIFgxMV9EZXN0cm95SW1hZ2UoX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4pOwotZXh0ZXJuIGludCBYMTFfUmVzaXplSW1hZ2UoX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4sIFVpbnQzMiBmbGFncyk7Ci0KLWV4dGVybiBpbnQgWDExX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1leHRlcm4gdm9pZCBYMTFfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotZXh0ZXJuIGludCBYMTFfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotZXh0ZXJuIHZvaWQgWDExX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotZXh0ZXJuIGludCBYMTFfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotCi1leHRlcm4gdm9pZCBYMTFfRGlzYWJsZUF1dG9SZWZyZXNoKF9USElTKTsKLWV4dGVybiB2b2lkIFgxMV9FbmFibGVBdXRvUmVmcmVzaChfVEhJUyk7Ci1leHRlcm4gdm9pZCBYMTFfUmVmcmVzaERpc3BsYXkoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMW1vZGVzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW9kZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3MzY3Zi4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW9kZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMTAgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFV0aWxpdGllcyBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgWCBkaXNwbGF5IG1vZGUgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJTRExfdGltZXIuaCIKLSNpbmNsdWRlICJTRExfZXZlbnRzLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF94MTF2aWRlby5oIgotI2luY2x1ZGUgIlNETF94MTF3bV9jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMW1vZGVzX2MuaCIKLSNpbmNsdWRlICJTRExfeDExaW1hZ2VfYy5oIgotCi0vKiNkZWZpbmUgWDExTU9ERVNfREVCVUcqLwotCi0jZGVmaW5lIE1BWChhLCBiKSAgICAgICAgKGEgPiBiID8gYSA6IGIpCi0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKLXN0YXRpYyBpbnQgY21wbW9kZWxpc3QoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQotewotICAgIGNvbnN0IFNETF9SZWN0ICphID0gKihjb25zdCBTRExfUmVjdCAqKil2YTsKLSAgICBjb25zdCBTRExfUmVjdCAqYiA9ICooY29uc3QgU0RMX1JlY3QgKiopdmI7Ci0gICAgaWYgKCBhLT53ID09IGItPncgKQotICAgICAgICByZXR1cm4gYi0+aCAtIGEtPmg7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYi0+dyAtIGEtPnc7Ci19Ci0jZW5kaWYKLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKLUJvb2wgU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRNb2RlSW5mbykoRGlzcGxheSAqZHB5LCBpbnQgc2NyLCBTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVJbmZvKSAqaW5mbykKLXsKLSAgICBTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVMaW5lKSAqbCA9IChTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVMaW5lKSopKChjaGFyKilpbmZvICsgc2l6ZW9mIGluZm8tPmRvdGNsb2NrKTsKLSAgICByZXR1cm4gU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRNb2RlTGluZSkoZHB5LCBzY3IsIChpbnQqKSZpbmZvLT5kb3RjbG9jaywgbCk7Ci19Ci0jZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERSAqLwotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQotc3RhdGljIHZvaWQgc2F2ZV9tb2RlKF9USElTKQotewotICAgIFNETF9tZW1zZXQoJnNhdmVkX21vZGUsIDAsIHNpemVvZihzYXZlZF9tb2RlKSk7Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRNb2RlSW5mbykoU0RMX0Rpc3BsYXksU0RMX1NjcmVlbiwmc2F2ZWRfbW9kZSk7Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRWaWV3UG9ydCkoU0RMX0Rpc3BsYXksU0RMX1NjcmVlbiwmc2F2ZWRfdmlldy54LCZzYXZlZF92aWV3LnkpOwotfQotI2VuZGlmCi0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFCi1zdGF0aWMgdm9pZCByZXN0b3JlX21vZGUoX1RISVMpCi17Ci0gICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlTGluZSkgbW9kZTsKLSAgICBpbnQgdW51c2VkOwotCi0gICAgaWYgKCBTRExfTkFNRShYRjg2VmlkTW9kZUdldE1vZGVMaW5lKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgJnVudXNlZCwgJm1vZGUpICkgewotICAgICAgICBpZiAoIChzYXZlZF9tb2RlLmhkaXNwbGF5ICE9IG1vZGUuaGRpc3BsYXkpIHx8Ci0gICAgICAgICAgICAgKHNhdmVkX21vZGUudmRpc3BsYXkgIT0gbW9kZS52ZGlzcGxheSkgKSB7Ci0gICAgICAgICAgICBTRExfTkFNRShYRjg2VmlkTW9kZVN3aXRjaFRvTW9kZSkoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sICZzYXZlZF9tb2RlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIChzYXZlZF92aWV3LnggIT0gMCkgfHwgKHNhdmVkX3ZpZXcueSAhPSAwKSApIHsKLSAgICAgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVTZXRWaWV3UG9ydCkoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sIHNhdmVkX3ZpZXcueCwgc2F2ZWRfdmlldy55KTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKLXN0YXRpYyBpbnQgY21wbW9kZXMoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQotewotICAgIGNvbnN0IFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pICphID0gKihjb25zdCBTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVJbmZvKSoqKXZhOwotICAgIGNvbnN0IFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pICpiID0gKihjb25zdCBTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVJbmZvKSoqKXZiOwotICAgIGlmICggYS0+aGRpc3BsYXkgPT0gYi0+aGRpc3BsYXkgKQotICAgICAgICByZXR1cm4gYi0+dmRpc3BsYXkgLSBhLT52ZGlzcGxheTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBiLT5oZGlzcGxheSAtIGEtPmhkaXNwbGF5OwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGdldF9yZWFsX3Jlc29sdXRpb24oX1RISVMsIGludCogdywgaW50KiBoKTsKLQotc3RhdGljIHZvaWQgc2V0X2Jlc3RfcmVzb2x1dGlvbihfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKLSAgICBpZiAoIHVzZV92aWRtb2RlICkgewotICAgICAgICBTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVMaW5lKSBtb2RlOwotICAgICAgICBTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVJbmZvKSAqKm1vZGVzOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50IG5tb2RlczsKLSAgICAgICAgaW50IGJlc3QgPSAtMTsKLQotICAgICAgICBpZiAoIFNETF9OQU1FKFhGODZWaWRNb2RlR2V0TW9kZUxpbmUpKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuLCAmaSwgJm1vZGUpICYmCi0gICAgICAgICAgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXMpKFNETF9EaXNwbGF5LFNETF9TY3JlZW4sJm5tb2RlcywmbW9kZXMpICkgewotICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBubW9kZXMgOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCAobW9kZXNbaV0tPmhkaXNwbGF5ID09IHdpZHRoKSAmJgotICAgICAgICAgICAgICAgICAgICAgKG1vZGVzW2ldLT52ZGlzcGxheSA9PSBoZWlnaHQpICkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICggbW9kZXNbaV0tPmhkaXNwbGF5ID49IHdpZHRoICYmCi0gICAgICAgICAgICAgICAgICAgICBtb2Rlc1tpXS0+dmRpc3BsYXkgPj0gaGVpZ2h0ICkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIGJlc3QgPCAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGVzW2ldLT5oZGlzcGxheSA8IG1vZGVzW2Jlc3RdLT5oZGlzcGxheSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2Rlc1tpXS0+dmRpc3BsYXkgPD0gbW9kZXNbYmVzdF0tPnZkaXNwbGF5KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIChtb2Rlc1tpXS0+dmRpc3BsYXkgPCBtb2Rlc1tiZXN0XS0+dmRpc3BsYXkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXNbaV0tPmhkaXNwbGF5IDw9IG1vZGVzW2Jlc3RdLT5oZGlzcGxheSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggYmVzdCA+PSAwICYmCi0gICAgICAgICAgICAgICAgICgobW9kZXNbYmVzdF0tPmhkaXNwbGF5ICE9IG1vZGUuaGRpc3BsYXkpIHx8Ci0gICAgICAgICAgICAgICAgICAobW9kZXNbYmVzdF0tPnZkaXNwbGF5ICE9IG1vZGUudmRpc3BsYXkpKSApIHsKLSNpZmRlZiBYMTFNT0RFU19ERUJVRwotICAgICAgICAgICAgICAgIHByaW50ZigiQmVzdCBNb2RlICVkOiAlZCB4ICVkIEAgJWRcbiIsIGJlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2Rlc1tiZXN0XS0+aGRpc3BsYXksIG1vZGVzW2Jlc3RdLT52ZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChtb2Rlc1tiZXN0XS0+aHRvdGFsICYmIG1vZGVzW2Jlc3RdLT52dG90YWwpID8gKDEwMDAgKiBtb2Rlc1tiZXN0XS0+ZG90Y2xvY2sgLyAobW9kZXNbYmVzdF0tPmh0b3RhbCAqIG1vZGVzW2Jlc3RdLT52dG90YWwpKSA6IDAgKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIFNETF9OQU1FKFhGODZWaWRNb2RlU3dpdGNoVG9Nb2RlKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgbW9kZXNbYmVzdF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgWEZyZWUobW9kZXMpOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYaUcgKi8KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUKLSAgICBpZiAoIHVzZV94bWUgJiYgU0RMX21vZGVsaXN0ICkgewotICAgICAgICBpbnQgaTsKLQotI2lmZGVmIFgxMU1PREVTX0RFQlVHCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiWE1FOiBzZXRfYmVzdF9yZXNvbHV0aW9uKCk6IHcgPSAlZCwgaCA9ICVkXG4iLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOwotI2VuZGlmCi0gICAgICAgIGZvciAoIGk9MDsgU0RMX21vZGVsaXN0W2ldOyArK2kgKSB7Ci0gICAgICAgICAgICBpZiAoIChTRExfbW9kZWxpc3RbaV0tPncgPj0gd2lkdGgpICYmCi0gICAgICAgICAgICAgICAgIChTRExfbW9kZWxpc3RbaV0tPmggPj0gaGVpZ2h0KSApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCBTRExfbW9kZWxpc3RbaV0gKSB7IC8qIGZvdW5kIG9uZSwgbGV0cyB0cnkgaXQgKi8KLSAgICAgICAgICAgIGludCB3LCBoOyAgICAgICAgCi0KLSAgICAgICAgICAgIC8qIGNoZWNrIGN1cnJlbnQgbW9kZSBzbyB3ZSBjYW4gYXZvaWQgdW5lY2Nlc3NhcnkgbW9kZSBjaGFuZ2VzICovCi0gICAgICAgICAgICBnZXRfcmVhbF9yZXNvbHV0aW9uKHRoaXMsICZ3LCAmaCk7Ci0KLSAgICAgICAgICAgIGlmICggKFNETF9tb2RlbGlzdFtpXS0+dyAhPSB3KSB8fCAoU0RMX21vZGVsaXN0W2ldLT5oICE9IGgpICkgewotI2lmZGVmIFgxMU1PREVTX0RFQlVHCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYTUU6IHNldF9iZXN0X3Jlc29sdXRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJYaUdNaXNjQ2hhbmdlUmVzb2x1dGlvbjogJWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPncsIFNETF9tb2RlbGlzdFtpXS0+aCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBYaUdNaXNjQ2hhbmdlUmVzb2x1dGlvbihTRExfRGlzcGxheSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1NjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiB2aWV3ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldLT53LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPmgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgICAgIFhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FICovCi0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKLSAgICBpZiAoIHVzZV94cmFuZHIgJiYgU0RMX21vZGVsaXN0ICkgewotI2lmZGVmIFgxMU1PREVTX0RFQlVHCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiWFJBTkRSOiBzZXRfYmVzdF9yZXNvbHV0aW9uKCk6IHcgPSAlZCwgaCA9ICVkXG4iLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOwotI2VuZGlmCi0gICAgICAgIGludCBpLCBuc2l6ZXM7Ci0gICAgICAgIFhSUlNjcmVlblNpemUgKnNpemVzOwotCi0gICAgICAgIC8qIGZpbmQgdGhlIHNtYWxsZXN0IHJlc29sdXRpb24gdGhhdCBpcyBhdCBsZWFzdCBhcyBiaWcgYXMgdGhlIHVzZXIgcmVxdWVzdGVkICovCi0gICAgICAgIHNpemVzID0gWFJSQ29uZmlnU2l6ZXMoc2NyZWVuX2NvbmZpZywgJm5zaXplcyk7Ci0gICAgICAgIGZvciAoIGkgPSAobnNpemVzLTEpOyBpID49IDA7IGktLSApIHsKLSAgICAgICAgICAgIGlmICggKFNETF9tb2RlbGlzdFtpXS0+dyA+PSB3aWR0aCkgJiYKLSAgICAgICAgICAgICAgICAgKFNETF9tb2RlbGlzdFtpXS0+aCA+PSBoZWlnaHQpICkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBpID49IDAgJiYgU0RMX21vZGVsaXN0W2ldICkgeyAvKiBmb3VuZCBvbmUsIGxldHMgdHJ5IGl0ICovCi0gICAgICAgICAgICBpbnQgdywgaDsKLQotICAgICAgICAgICAgLyogY2hlY2sgY3VycmVudCBtb2RlIHNvIHdlIGNhbiBhdm9pZCB1bmVjY2Vzc2FyeSBtb2RlIGNoYW5nZXMgKi8KLSAgICAgICAgICAgIGdldF9yZWFsX3Jlc29sdXRpb24odGhpcywgJncsICZoKTsKLQotICAgICAgICAgICAgaWYgKCAoU0RMX21vZGVsaXN0W2ldLT53ICE9IHcpIHx8IChTRExfbW9kZWxpc3RbaV0tPmggIT0gaCkgKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNpemVfaWQ7Ci0KLSNpZmRlZiBYMTFNT0RFU19ERUJVRwotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWFJBTkRSOiBzZXRfYmVzdF9yZXNvbHV0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiWFhSU2V0U2NyZWVuQ29uZmlnOiAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+dywgU0RMX21vZGVsaXN0W2ldLT5oKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgLyogZmluZCB0aGUgbWF0Y2hpbmcgc2l6ZSBlbnRyeSBpbmRleCAqLwotICAgICAgICAgICAgICAgIGZvciAoIHNpemVfaWQgPSAwOyBzaXplX2lkIDwgbnNpemVzOyArK3NpemVfaWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggKHNpemVzW3NpemVfaWRdLndpZHRoID09IFNETF9tb2RlbGlzdFtpXS0+dykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZXNbc2l6ZV9pZF0uaGVpZ2h0ID09IFNETF9tb2RlbGlzdFtpXS0+aCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgWFJSU2V0U2NyZWVuQ29uZmlnKFNETF9EaXNwbGF5LCBzY3JlZW5fY29uZmlnLCBTRExfUm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9pZCwgc2F2ZWRfcm90YXRpb24sIEN1cnJlbnRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIgKi8KLX0KLQotc3RhdGljIHZvaWQgZ2V0X3JlYWxfcmVzb2x1dGlvbihfVEhJUywgaW50KiB3LCBpbnQqIGgpCi17Ci0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FCi0gICAgaWYgKCB1c2VfeG1lICkgewotICAgICAgICBpbnQgcmFjdGl2ZTsKLSAgICAgICAgWGlHTWlzY1Jlc29sdXRpb25JbmZvICptb2RlbGlzdDsKLQotICAgICAgICBYaUdNaXNjUXVlcnlSZXNvbHV0aW9ucyhTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogdmlldyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFjdGl2ZSwgJm1vZGVsaXN0KTsKLSAgICAgICAgKncgPSBtb2RlbGlzdFtyYWN0aXZlXS53aWR0aDsKLSAgICAgICAgKmggPSBtb2RlbGlzdFtyYWN0aXZlXS5oZWlnaHQ7Ci0jaWZkZWYgWDExTU9ERVNfREVCVUcKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJYTUU6IGdldF9yZWFsX3Jlc29sdXRpb246IHcgPSAlZCBoID0gJWRcbiIsICp3LCAqaCk7Ci0jZW5kaWYKLSAgICAgICAgWEZyZWUobW9kZWxpc3QpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hNRSAqLwotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQotICAgIGlmICggdXNlX3ZpZG1vZGUgKSB7Ci0gICAgICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUxpbmUpIG1vZGU7Ci0gICAgICAgIGludCB1bnVzZWQ7Ci0KLSAgICAgICAgaWYgKCBTRExfTkFNRShYRjg2VmlkTW9kZUdldE1vZGVMaW5lKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgJnVudXNlZCwgJm1vZGUpICkgewotICAgICAgICAgICAgKncgPSBtb2RlLmhkaXNwbGF5OwotICAgICAgICAgICAgKmggPSBtb2RlLnZkaXNwbGF5OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUgKi8KLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUgotICAgIGlmICggdXNlX3hyYW5kciApIHsKLSAgICAgICAgaW50IG5zaXplczsKLSAgICAgICAgWFJSU2NyZWVuU2l6ZSogc2l6ZXM7Ci0KLSAgICAgICAgc2l6ZXMgPSBYUlJDb25maWdTaXplcyhzY3JlZW5fY29uZmlnLCAmbnNpemVzKTsKLSAgICAgICAgaWYgKCBuc2l6ZXMgPiAwICkgewotICAgICAgICAgICAgaW50IGN1cl9zaXplOwotICAgICAgICAgICAgUm90YXRpb24gY3VyX3JvdGF0aW9uOwotCi0gICAgICAgICAgICBjdXJfc2l6ZSA9IFhSUkNvbmZpZ0N1cnJlbnRDb25maWd1cmF0aW9uKHNjcmVlbl9jb25maWcsICZjdXJfcm90YXRpb24pOwotICAgICAgICAgICAgaWYgKCBjdXJfc2l6ZSA+PSAwICYmIGN1cl9zaXplIDwgbnNpemVzICkgewotICAgICAgICAgICAgICAgICp3ID0gc2l6ZXNbY3VyX3NpemVdLndpZHRoOwotICAgICAgICAgICAgICAgICpoID0gc2l6ZXNbY3VyX3NpemVdLmhlaWdodDsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBYMTFNT0RFU19ERUJVRwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYUkFORFI6IGdldF9yZWFsX3Jlc29sdXRpb246IHcgPSAlZCBoID0gJWRcbiIsICp3LCAqaCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIgKi8KLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BCi0gICAgaWYgKCB1c2VfeGluZXJhbWEgKSB7Ci0gICAgICAgICp3ID0geGluZXJhbWFfaW5mby53aWR0aDsKLSAgICAgICAgKmggPSB4aW5lcmFtYV9pbmZvLmhlaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQSAqLwotCi0gICAgKncgPSBEaXNwbGF5V2lkdGgoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOwotICAgICpoID0gRGlzcGxheUhlaWdodChTRExfRGlzcGxheSwgU0RMX1NjcmVlbik7Ci19Ci0KLS8qIENhbGxlZCBhZnRlciBtYXBwaW5nIGEgd2luZG93IC0gd2FpdHMgdW50aWwgdGhlIHdpbmRvdyBpcyBtYXBwZWQgKi8KLXZvaWQgWDExX1dhaXRNYXBwZWQoX1RISVMsIFdpbmRvdyB3aW4pCi17Ci0gICAgWEV2ZW50IGV2ZW50OwotICAgIGRvIHsKLSAgICAgICAgWE1hc2tFdmVudChTRExfRGlzcGxheSwgU3RydWN0dXJlTm90aWZ5TWFzaywgJmV2ZW50KTsKLSAgICB9IHdoaWxlICggKGV2ZW50LnR5cGUgIT0gTWFwTm90aWZ5KSB8fCAoZXZlbnQueG1hcC5ldmVudCAhPSB3aW4pICk7Ci19Ci0KLS8qIENhbGxlZCBhZnRlciB1bm1hcHBpbmcgYSB3aW5kb3cgLSB3YWl0cyB1bnRpbCB0aGUgd2luZG93IGlzIHVubWFwcGVkICovCi12b2lkIFgxMV9XYWl0VW5tYXBwZWQoX1RISVMsIFdpbmRvdyB3aW4pCi17Ci0gICAgWEV2ZW50IGV2ZW50OwotICAgIGRvIHsKLSAgICAgICAgWE1hc2tFdmVudChTRExfRGlzcGxheSwgU3RydWN0dXJlTm90aWZ5TWFzaywgJmV2ZW50KTsKLSAgICB9IHdoaWxlICggKGV2ZW50LnR5cGUgIT0gVW5tYXBOb3RpZnkpIHx8IChldmVudC54dW5tYXAuZXZlbnQgIT0gd2luKSApOwotfQotCi1zdGF0aWMgdm9pZCBtb3ZlX2N1cnNvcl90byhfVEhJUywgaW50IHgsIGludCB5KQotewotICAgIFhXYXJwUG9pbnRlcihTRExfRGlzcGxheSwgTm9uZSwgU0RMX1Jvb3QsIDAsIDAsIDAsIDAsIHgsIHkpOwotfQotCi1zdGF0aWMgaW50IGFkZF92aXN1YWwoX1RISVMsIGludCBkZXB0aCwgaW50IGNsYXNzKQotewotICAgIFhWaXN1YWxJbmZvIHZpOwotICAgIGlmKFhNYXRjaFZpc3VhbEluZm8oU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sIGRlcHRoLCBjbGFzcywgJnZpKSkgewotICAgICAgICBpbnQgbiA9IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHM7Ci0gICAgICAgIHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tuXS5kZXB0aCA9IHZpLmRlcHRoOwotICAgICAgICB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbbl0udmlzdWFsID0gdmkudmlzdWFsOwotICAgICAgICB0aGlzLT5oaWRkZW4tPm52aXN1YWxzKys7Ci0gICAgfQotICAgIHJldHVybih0aGlzLT5oaWRkZW4tPm52aXN1YWxzKTsKLX0KLXN0YXRpYyBpbnQgYWRkX3Zpc3VhbF9ieWlkKF9USElTLCBjb25zdCBjaGFyICp2aXN1YWxfaWQpCi17Ci0gICAgWFZpc3VhbEluZm8gKnZpLCB0ZW1wbGF0ZTsKLSAgICBpbnQgbnZpczsKLQotICAgIGlmICggdmlzdWFsX2lkICkgewotICAgICAgICBTRExfbWVtc2V0KCZ0ZW1wbGF0ZSwgMCwgKHNpemVvZiB0ZW1wbGF0ZSkpOwotICAgICAgICB0ZW1wbGF0ZS52aXN1YWxpZCA9IFNETF9zdHJ0b2wodmlzdWFsX2lkLCBOVUxMLCAwKTsKLSAgICAgICAgdmkgPSBYR2V0VmlzdWFsSW5mbyhTRExfRGlzcGxheSwgVmlzdWFsSURNYXNrLCAmdGVtcGxhdGUsICZudmlzKTsKLSAgICAgICAgaWYgKCB2aSApIHsKLSAgICAgICAgICAgIGludCBuID0gdGhpcy0+aGlkZGVuLT5udmlzdWFsczsKLSAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tuXS5kZXB0aCA9IHZpLT5kZXB0aDsKLSAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tuXS52aXN1YWwgPSB2aS0+dmlzdWFsOwotICAgICAgICAgICAgdGhpcy0+aGlkZGVuLT5udmlzdWFscysrOwotICAgICAgICAgICAgWEZyZWUodmkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybih0aGlzLT5oaWRkZW4tPm52aXN1YWxzKTsKLX0KLQotLyogR2xvYmFsIGZvciB0aGUgZXJyb3IgaGFuZGxlciAqLwotaW50IHZtX2V2ZW50LCB2bV9lcnJvciA9IC0xOwotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKLXN0YXRpYyBpbnQgQ2hlY2tYaW5lcmFtYShfVEhJUywgaW50ICptYWpvciwgaW50ICptaW5vcikKLXsKLSAgICBjb25zdCBjaGFyICplbnY7Ci0KLSAgICAvKiBEZWZhdWx0IHRoZSBleHRlbnNpb24gbm90IGF2YWlsYWJsZSAqLwotICAgICptYWpvciA9ICptaW5vciA9IDA7Ci0KLSAgICAvKiBBbGxvdyBlbnZpcm9ubWVudCBvdmVycmlkZSAqLwotICAgIGVudiA9IGdldGVudigiU0RMX1ZJREVPX1gxMV9YSU5FUkFNQSIpOwotICAgIGlmICggZW52ICYmICFTRExfYXRvaShlbnYpICkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBRdWVyeSB0aGUgZXh0ZW5zaW9uIHZlcnNpb24gKi8KLSAgICBpZiAoICFTRExfTkFNRShYaW5lcmFtYVF1ZXJ5RXh0ZW5zaW9uKShTRExfRGlzcGxheSwgbWFqb3IsIG1pbm9yKSB8fAotICAgICAgICAgIVNETF9OQU1FKFhpbmVyYW1hSXNBY3RpdmUpKFNETF9EaXNwbGF5KSApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BICovCi0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKLXN0YXRpYyBpbnQgQ2hlY2tYUmFuZFIoX1RISVMsIGludCAqbWFqb3IsIGludCAqbWlub3IpCi17Ci0gICAgY29uc3QgY2hhciAqZW52OwotCi0gICAgLyogRGVmYXVsdCB0aGUgZXh0ZW5zaW9uIG5vdCBhdmFpbGFibGUgKi8KLSAgICAqbWFqb3IgPSAqbWlub3IgPSAwOwotCi0gICAgLyogQWxsb3cgZW52aXJvbm1lbnQgb3ZlcnJpZGUgKi8KLSAgICBlbnYgPSBnZXRlbnYoIlNETF9WSURFT19YMTFfWFJBTkRSIik7Ci0gICAgaWYgKCBlbnYgJiYgIVNETF9hdG9pKGVudikgKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIFRoaXMgZGVmYXVsdHMgb2ZmIG5vdywgZHVlIHRvIEtERSB3aW5kb3cgbWF4aW1pemUgcHJvYmxlbXMgKi8KLSAgICBpZiAoICFlbnYgKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICggIVNETF9YMTFfSEFWRV9YUkFORFIgKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIFF1ZXJ5IHRoZSBleHRlbnNpb24gdmVyc2lvbiAqLwotICAgIGlmICggIVhSUlF1ZXJ5VmVyc2lvbihTRExfRGlzcGxheSwgbWFqb3IsIG1pbm9yKSApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUiAqLwotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQotc3RhdGljIGludCBDaGVja1ZpZE1vZGUoX1RISVMsIGludCAqbWFqb3IsIGludCAqbWlub3IpCi17Ci0gICAgY29uc3QgY2hhciAqZW52OwotCi0gICAgLyogRGVmYXVsdCB0aGUgZXh0ZW5zaW9uIG5vdCBhdmFpbGFibGUgKi8KLSAgICAqbWFqb3IgPSAqbWlub3IgPSAwOwotCi0gICAgLyogQWxsb3cgZW52aXJvbm1lbnQgb3ZlcnJpZGUgKi8KLSAgICBlbnYgPSBnZXRlbnYoIlNETF9WSURFT19YMTFfVklETU9ERSIpOwotICAgIGlmICggZW52ICYmICFTRExfYXRvaShlbnYpICkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgLyogTWV0cm8tWCA0LjMuMCBhbmQgZWFybGllciBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb24gb2YKLSAgICAgICBYRjg2VmlkTW9kZUdldEFsbE1vZGVMaW5lcygpIC0gaXQgaGFuZ3MgdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBpZiAoIFNETF9zdHJjbXAoU2VydmVyVmVuZG9yKFNETF9EaXNwbGF5KSwgIk1ldHJvIExpbmsgSW5jb3Jwb3JhdGVkIikgPT0gMCApIHsKLSAgICAgICAgRklMRSAqbWV0cm9fZnA7Ci0KLSAgICAgICAgbWV0cm9fZnAgPSBmb3BlbigiL3Vzci9YMTFSNi9saWIvWDExL01ldHJvLy52ZXJzaW9uIiwgInIiKTsKLSAgICAgICAgaWYgKCBtZXRyb19mcCAhPSBOVUxMICkgewotICAgICAgICAgICAgaW50IG1ham9yLCBtaW5vciwgcGF0Y2gsIHZlcnNpb247Ci0gICAgICAgICAgICBtYWpvciA9IDA7IG1pbm9yID0gMDsgcGF0Y2ggPSAwOwotICAgICAgICAgICAgZnNjYW5mKG1ldHJvX2ZwLCAiJWQuJWQuJWQiLCAmbWFqb3IsICZtaW5vciwgJnBhdGNoKTsKLSAgICAgICAgICAgIGZjbG9zZShtZXRyb19mcCk7Ci0gICAgICAgICAgICB2ZXJzaW9uID0gbWFqb3IqMTAwK21pbm9yKjEwK3BhdGNoOwotICAgICAgICAgICAgaWYgKCB2ZXJzaW9uIDwgNDMxICkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUXVlcnkgdGhlIGV4dGVuc2lvbiB2ZXJzaW9uICovCi0gICAgdm1fZXJyb3IgPSAtMTsKLSAgICBpZiAoICFTRExfTkFNRShYRjg2VmlkTW9kZVF1ZXJ5RXh0ZW5zaW9uKShTRExfRGlzcGxheSwgJnZtX2V2ZW50LCAmdm1fZXJyb3IpIHx8Ci0gICAgICAgICAhU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKFNETF9EaXNwbGF5LCBtYWpvciwgbWlub3IpICkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERSAqLwotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FCi1zdGF0aWMgaW50IENoZWNrWE1FKF9USElTLCBpbnQgKm1ham9yLCBpbnQgKm1pbm9yKQotewotICAgIGNvbnN0IGNoYXIgKmVudjsKLQotICAgIC8qIERlZmF1bHQgdGhlIGV4dGVuc2lvbiBub3QgYXZhaWxhYmxlICovCi0gICAgKm1ham9yID0gKm1pbm9yID0gMDsKLQotICAgIC8qIEFsbG93IGVudmlyb25tZW50IG92ZXJyaWRlICovCi0gICAgZW52ID0gZ2V0ZW52KCJTRExfVklERU9fWDExX1ZJRE1PREUiKTsKLSAgICBpZiAoIGVudiAmJiAhU0RMX2F0b2koZW52KSApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIC8qIFF1ZXJ5IHRoZSBleHRlbnNpb24gdmVyc2lvbiAqLwotICAgIGlmICggIVhpR01pc2NRdWVyeVZlcnNpb24oU0RMX0Rpc3BsYXksIG1ham9yLCBtaW5vcikgKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUgKi8KLQotaW50IFgxMV9HZXRWaWRlb01vZGVzKF9USElTKQotewotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BCi0gICAgaW50IHhpbmVyYW1hX21ham9yLCB4aW5lcmFtYV9taW5vcjsKLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUgotICAgIGludCB4cmFuZHJfbWFqb3IsIHhyYW5kcl9taW5vcjsKLSAgICBpbnQgbnNpemVzOwotICAgIFhSUlNjcmVlblNpemUgKnNpemVzOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQotICAgIGludCB2bV9tYWpvciwgdm1fbWlub3I7Ci0gICAgaW50IG5tb2RlczsKLSAgICBTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVJbmZvKSAqKm1vZGVzOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FCi0gICAgaW50IHhtZV9tYWpvciwgeG1lX21pbm9yOwotICAgIGludCByYWN0aXZlLCBudW1tb2RlczsKLSAgICBYaUdNaXNjUmVzb2x1dGlvbkluZm8gKm1vZGVsaXN0OwotI2VuZGlmCi0gICAgaW50IGksIG47Ci0gICAgaW50IHNjcmVlbl93OwotICAgIGludCBzY3JlZW5faDsKLQotICAgIHVzZV94aW5lcmFtYSA9IDA7Ci0gICAgdXNlX3hyYW5kciA9IDA7Ci0gICAgdXNlX3ZpZG1vZGUgPSAwOwotICAgIHVzZV94bWUgPSAwOwotICAgIHNjcmVlbl93ID0gRGlzcGxheVdpZHRoKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKLSAgICBzY3JlZW5faCA9IERpc3BsYXlIZWlnaHQoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOwotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKLSAgICAvKiBRdWVyeSBYaW5lcmFtYSBleHRlbnRpb24gKi8KLSAgICBpZiAoIENoZWNrWGluZXJhbWEodGhpcywgJnhpbmVyYW1hX21ham9yLCAmeGluZXJhbWFfbWlub3IpICkgewotICAgICAgICAvKiBGaW5kIG91dCB3aGljaCBzY3JlZW4gaXMgdGhlIGRlc2lyZWQgb25lICovCi0gICAgICAgIGludCBkZXNpcmVkID0gMDsKLSAgICAgICAgaW50IHNjcmVlbnM7Ci0gICAgICAgIGludCB3LCBoOwotICAgICAgICBTRExfTkFNRShYaW5lcmFtYVNjcmVlbkluZm8pICp4aW5lcmFtYTsKLQotICAgICAgICBjb25zdCBjaGFyICp2YXJpYWJsZSA9IFNETF9nZXRlbnYoIlNETF9WSURFT19GVUxMU0NSRUVOX0hFQUQiKTsKLSAgICAgICAgaWYgKCB2YXJpYWJsZSApIHsKLSAgICAgICAgICAgICAgICBkZXNpcmVkID0gU0RMX2F0b2kodmFyaWFibGUpOwotICAgICAgICB9Ci0jaWZkZWYgWDExTU9ERVNfREVCVUcKLSAgICAgICAgcHJpbnRmKCJYMTEgZGV0ZWN0ZWQgWGluZXJhbWE6XG4iKTsKLSNlbmRpZgotICAgICAgICB4aW5lcmFtYSA9IFNETF9OQU1FKFhpbmVyYW1hUXVlcnlTY3JlZW5zKShTRExfRGlzcGxheSwgJnNjcmVlbnMpOwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHNjcmVlbnM7IGkrKyApIHsKLSNpZmRlZiBYMTFNT0RFU19ERUJVRwotICAgICAgICAgICAgcHJpbnRmKCJ4aW5lcmFtYSAlZDogJWR4JWQrJWQrJWRcbiIsCi0gICAgICAgICAgICAgICAgeGluZXJhbWFbaV0uc2NyZWVuX251bWJlciwKLSAgICAgICAgICAgICAgICB4aW5lcmFtYVtpXS53aWR0aCwgeGluZXJhbWFbaV0uaGVpZ2h0LAotICAgICAgICAgICAgICAgIHhpbmVyYW1hW2ldLnhfb3JnLCB4aW5lcmFtYVtpXS55X29yZyk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICggeGluZXJhbWFbaV0uc2NyZWVuX251bWJlciA9PSBkZXNpcmVkICkgewotICAgICAgICAgICAgICAgIHVzZV94aW5lcmFtYSA9IDE7Ci0gICAgICAgICAgICAgICAgeGluZXJhbWFfaW5mbyA9IHhpbmVyYW1hW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFhGcmVlKHhpbmVyYW1hKTsKLQotICAgICAgICBpZiAoIHVzZV94aW5lcmFtYSApIHsKLSAgICAgICAgICAgIFNETF9tb2RlbGlzdCA9IChTRExfUmVjdCAqKilTRExfbWFsbG9jKDMqc2l6ZW9mKFNETF9SZWN0ICopKTsKLSAgICAgICAgICAgIGlmICggIVNETF9tb2RlbGlzdCApIHsKLSAgICAgICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkZCB0aGUgZnVsbCB4aW5lcmFtYSBtb2RlICovCi0gICAgICAgICAgICBuID0gMDsKLSAgICAgICAgICAgIHcgPSB4aW5lcmFtYV9pbmZvLndpZHRoOwotICAgICAgICAgICAgaCA9IHhpbmVyYW1hX2luZm8uaGVpZ2h0OwotICAgICAgICAgICAgaWYgKCBzY3JlZW5fdyA+IHcgfHwgc2NyZWVuX2ggPiBoKSB7Ci0gICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKLSAgICAgICAgICAgICAgICBpZiAoIFNETF9tb2RlbGlzdFtuXSApIHsKLSAgICAgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT54ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT55ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT53ID0gc2NyZWVuX3c7Ci0gICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+aCA9IHNjcmVlbl9oOwotICAgICAgICAgICAgICAgICAgICArK247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZGQgdGhlIGhlYWQgeGluZXJhbWEgbW9kZSAqLwotICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKLSAgICAgICAgICAgIGlmICggU0RMX21vZGVsaXN0W25dICkgewotICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+eCA9IDA7Ci0gICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT55ID0gMDsKLSAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPncgPSB3OwotICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+aCA9IGg7Ci0gICAgICAgICAgICAgICAgKytuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQSAqLwotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFJBTkRSCi0gICAgLyogWFJhbmRSICovCi0gICAgLyogcmVxdWlyZSBhdCBsZWFzdCBYUmFuZFIgdjEuMCAoYXJiaXRyYXJ5KSAqLwotICAgIGlmICggQ2hlY2tYUmFuZFIodGhpcywgJnhyYW5kcl9tYWpvciwgJnhyYW5kcl9taW5vcikgJiYgKHhyYW5kcl9tYWpvciA+PSAxKSApCi0gICAgewotI2lmZGVmIFgxMU1PREVTX0RFQlVHCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiWFJBTkRSOiBYUlJRdWVyeVZlcnNpb246IFYlZC4lZFxuIiwKLSAgICAgICAgICAgICAgICB4cmFuZHJfbWFqb3IsIHhyYW5kcl9taW5vcik7Ci0jZW5kaWYKLQotICAgICAgICAvKiBzYXZlIHRoZSBzY3JlZW4gY29uZmlndXJhdGlvbiBzaW5jZSB3ZSBtdXN0IHJlZmVyZW5jZSBpdAotICAgICAgICAgICBlYWNoIHRpbWUgd2UgdG9nZ2xlIG1vZGVzLgotICAgICAgICAqLwotICAgICAgICBzY3JlZW5fY29uZmlnID0gWFJSR2V0U2NyZWVuSW5mbyhTRExfRGlzcGxheSwgU0RMX1Jvb3QpOwotCi0gICAgICAgIC8qIHJldHJpZXZlIHRoZSBsaXN0IG9mIHJlc29sdXRpb24gKi8KLSAgICAgICAgc2l6ZXMgPSBYUlJDb25maWdTaXplcyhzY3JlZW5fY29uZmlnLCAmbnNpemVzKTsKLSAgICAgICAgaWYgKG5zaXplcyA+IDApIHsKLSAgICAgICAgICAgIGlmICggU0RMX21vZGVsaXN0ICkgewotICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBTRExfbW9kZWxpc3RbaV07ICsraSApIHsKLSAgICAgICAgICAgICAgICAgICAgU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU0RMX2ZyZWUoU0RMX21vZGVsaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNETF9tb2RlbGlzdCA9IChTRExfUmVjdCAqKiltYWxsb2MoKG5zaXplcysxKSpzaXplb2YoU0RMX1JlY3QgKikpOwotICAgICAgICAgICAgaWYgKCAhU0RMX21vZGVsaXN0ICkgewotICAgICAgICAgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoIGk9MDsgaSA8IG5zaXplczsgaSsrICkgewotICAgICAgICAgICAgICAgIGlmICgoU0RMX21vZGVsaXN0W2ldID0KLSAgICAgICAgICAgICAgICAgICAgIChTRExfUmVjdCAqKW1hbGxvYyhzaXplb2YoU0RMX1JlY3QpKSkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgWDExTU9ERVNfREVCVUcKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhSQU5EUjogbW9kZSA9ICU0ZCwgdyA9ICU0ZCwgaCA9ICU0ZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIHNpemVzW2ldLndpZHRoLCBzaXplc1tpXS5oZWlnaHQpOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPnggPSAwOwotICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+eSA9IDA7Ci0gICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldLT53ID0gc2l6ZXNbaV0ud2lkdGg7Ci0gICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldLT5oID0gc2l6ZXNbaV0uaGVpZ2h0OwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBzb3J0IHRoZSBtb2RlIGxpc3QgZGVzY2VuZGluZyBhcyBTREwgZXhwZWN0cyAqLwotICAgICAgICAgICAgU0RMX3Fzb3J0KFNETF9tb2RlbGlzdCwgbnNpemVzLCBzaXplb2YgKlNETF9tb2RlbGlzdCwgY21wbW9kZWxpc3QpOwotICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldID0gTlVMTDsgLyogdGVybWluYXRvciAqLwotCi0gICAgICAgICAgICB1c2VfeHJhbmRyID0geHJhbmRyX21ham9yICogMTAwICsgeHJhbmRyX21pbm9yOwotICAgICAgICAgICAgc2F2ZWRfc2l6ZV9pZCA9IFhSUkNvbmZpZ0N1cnJlbnRDb25maWd1cmF0aW9uKHNjcmVlbl9jb25maWcsICZzYXZlZF9yb3RhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFJBTkRSICovCi0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFCi0gICAgLyogWFZpZE1vZGUgKi8KLSAgICBpZiAoICF1c2VfeHJhbmRyICYmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKLSAgICAgICAgICghdXNlX3hpbmVyYW1hIHx8IHhpbmVyYW1hX2luZm8uc2NyZWVuX251bWJlciA9PSAwKSAmJgotI2VuZGlmCi0gICAgICAgICBDaGVja1ZpZE1vZGUodGhpcywgJnZtX21ham9yLCAmdm1fbWlub3IpICYmCi0gICAgICAgICBTRExfTkFNRShYRjg2VmlkTW9kZUdldEFsbE1vZGVMaW5lcykoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sJm5tb2RlcywmbW9kZXMpICkKLSAgICB7Ci0jaWZkZWYgWDExTU9ERVNfREVCVUcKLSAgICAgICAgcHJpbnRmKCJWaWRNb2RlIG1vZGVzOiAodW5zb3J0ZWQpXG4iKTsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBubW9kZXM7ICsraSApIHsKLSAgICAgICAgICAgIHByaW50ZigiTW9kZSAlZDogJWQgeCAlZCBAICVkXG4iLCBpLAotICAgICAgICAgICAgICAgICAgICBtb2Rlc1tpXS0+aGRpc3BsYXksIG1vZGVzW2ldLT52ZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgKG1vZGVzW2ldLT5odG90YWwgJiYgbW9kZXNbaV0tPnZ0b3RhbCkgPyAoMTAwMCAqIG1vZGVzW2ldLT5kb3RjbG9jayAvIChtb2Rlc1tpXS0+aHRvdGFsICogbW9kZXNbaV0tPnZ0b3RhbCkpIDogMCApOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKCBTRExfbW9kZWxpc3QgKSB7Ci0gICAgICAgICAgICBmb3IgKCBpID0gMDsgU0RMX21vZGVsaXN0W2ldOyArK2kgKSB7Ci0gICAgICAgICAgICAgICAgU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNETF9mcmVlKFNETF9tb2RlbGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgU0RMX21vZGVsaXN0ID0gKFNETF9SZWN0ICoqKVNETF9tYWxsb2MoKG5tb2RlcysyKSpzaXplb2YoU0RMX1JlY3QgKikpOwotICAgICAgICBpZiAoICFTRExfbW9kZWxpc3QgKSB7Ci0gICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBTRExfcXNvcnQobW9kZXMsIG5tb2Rlcywgc2l6ZW9mICptb2RlcywgY21wbW9kZXMpOwotICAgICAgICBuID0gMDsKLSAgICAgICAgZm9yICggaT0wOyBpPG5tb2RlczsgKytpICkgewotICAgICAgICAgICAgaW50IHcsIGg7Ci0KLSAgICAgICAgICAgIC8qIEVsaW1pbmF0ZSBkdXBsaWNhdGUgbW9kZXMgd2l0aCBkaWZmZXJlbnQgcmVmcmVzaCByYXRlcyAqLwotICAgICAgICAgICAgaWYgKCBpID4gMCAmJgotICAgICAgICAgICAgICAgICBtb2Rlc1tpXS0+aGRpc3BsYXkgPT0gbW9kZXNbaS0xXS0+aGRpc3BsYXkgJiYKLSAgICAgICAgICAgICAgICAgbW9kZXNbaV0tPnZkaXNwbGF5ID09IG1vZGVzW2ktMV0tPnZkaXNwbGF5ICkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBhZGQgdGhlIHNjcmVlbiBzaXplIChYaW5lcmFtYSkgKi8KLSAgICAgICAgICAgIHcgPSBtb2Rlc1tpXS0+aGRpc3BsYXk7Ci0gICAgICAgICAgICBoID0gbW9kZXNbaV0tPnZkaXNwbGF5OwotICAgICAgICAgICAgaWYgKCAoc2NyZWVuX3cgKiBzY3JlZW5faCkgPj0gKHcgKiBoKSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIChzY3JlZW5fdyAhPSB3KSB8fCAoc2NyZWVuX2ggIT0gaCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggU0RMX21vZGVsaXN0W25dICkgewotICAgICAgICAgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT54ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+eSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPncgPSBzY3JlZW5fdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+aCA9IHNjcmVlbl9oOwotICAgICAgICAgICAgICAgICAgICAgICAgKytuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNjcmVlbl93ID0gMDsKLSAgICAgICAgICAgICAgICBzY3JlZW5faCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkZCB0aGUgc2l6ZSBmcm9tIHRoZSB2aWRlbyBtb2RlIGxpc3QgKi8KLSAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7Ci0gICAgICAgICAgICBpZiAoIFNETF9tb2RlbGlzdFtuXSA9PSBOVUxMICkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT54ID0gMDsKLSAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+eSA9IDA7Ci0gICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPncgPSB3OwotICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT5oID0gaDsKLSAgICAgICAgICAgICsrbjsKLSAgICAgICAgfQotICAgICAgICBTRExfbW9kZWxpc3Rbbl0gPSBOVUxMOwotICAgICAgICBYRnJlZShtb2Rlcyk7Ci0KLSAgICAgICAgdXNlX3ZpZG1vZGUgPSB2bV9tYWpvciAqIDEwMCArIHZtX21pbm9yOwotICAgICAgICBzYXZlX21vZGUodGhpcyk7Ci0gICAgfQotI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUgKi8KLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hNRQotICAgIC8qIFhpRyAqLwotICAgIG1vZGVsaXN0ID0gTlVMTDsKLSAgICAvKiBmaXJzdCBsZXRzIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBleHRlbnNpb24sIGFuZCBpdCdzIGF0IGxlYXN0IHYyLjAgKi8KLSAgICBpZiAoIENoZWNrWE1FKHRoaXMsICZ4bWVfbWFqb3IsICZ4bWVfbWlub3IpICYmIHhtZV9tYWpvciA+PSAyICYmCi0gICAgICAgICAobnVtbW9kZXMgPSBYaUdNaXNjUXVlcnlSZXNvbHV0aW9ucyhTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHZpZXcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYWN0aXZlLCAmbW9kZWxpc3QpKSA+IDEgKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gd2UgYWN0dWFsbHkgaGF2ZSBzb21lICovCi0gICAgICAgIGludCBqOwotCi0gICAgICAgIC8qIFdlIGdldCB0aGUgbGlzdCBhbHJlYWR5IHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyLgotICAgICAgICAgICBXZSdsbCBjb3B5IGl0IGluIHJldmVyc2Ugb3JkZXIgc28gU0RMIGlzIGhhcHB5ICovCi0jaWZkZWYgWDExTU9ERVNfREVCVUcKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJYTUU6IG51bW1vZGVzID0gJWQsIGFjdGl2ZSBtb2RlID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgbnVtbW9kZXMsIHJhY3RpdmUpOwotI2VuZGlmCi0gICAgICAgIGlmICggU0RMX21vZGVsaXN0ICkgewotICAgICAgICAgICAgZm9yICggaSA9IDA7IFNETF9tb2RlbGlzdFtpXTsgKytpICkgewotICAgICAgICAgICAgICAgIFNETF9mcmVlKFNETF9tb2RlbGlzdFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTRExfZnJlZShTRExfbW9kZWxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIFNETF9tb2RlbGlzdCA9IChTRExfUmVjdCAqKilTRExfbWFsbG9jKChudW1tb2RlcysxKSpzaXplb2YoU0RMX1JlY3QgKikpOwotICAgICAgICBpZiAoICFTRExfbW9kZWxpc3QgKSB7Ci0gICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCBpPTAsIGo9bnVtbW9kZXMtMTsgaj49MDsgaSsrLCBqLS0gKSB7Ci0gICAgICAgICAgICBpZiAoKFNETF9tb2RlbGlzdFtpXSA9IAotICAgICAgICAgICAgICAgICAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpKSA9PSBOVUxMKQotICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBYMTFNT0RFU19ERUJVRwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYTUU6IG1vZGUgPSAlNGQsIHcgPSAlNGQsIGggPSAlNGRcbiIsCi0gICAgICAgICAgICAgICAgICAgaSwgbW9kZWxpc3RbaV0ud2lkdGgsIG1vZGVsaXN0W2ldLmhlaWdodCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldLT54ID0gMDsKLSAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+eSA9IDA7Ci0gICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPncgPSBtb2RlbGlzdFtqXS53aWR0aDsKLSAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+aCA9IG1vZGVsaXN0W2pdLmhlaWdodDsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIFNETF9tb2RlbGlzdFtpXSA9IE5VTEw7IC8qIHRlcm1pbmF0b3IgKi8KLQotICAgICAgICB1c2VfeG1lID0geG1lX21ham9yICogMTAwICsgeG1lX21pbm9yOwotICAgICAgICBzYXZlZF9yZXMgPSBtb2RlbGlzdFtyYWN0aXZlXTsgLyogc2F2ZSB0aGUgY3VycmVudCByZXNvbHV0aW9uICovCi0gICAgfQotICAgIGlmICggbW9kZWxpc3QgKSB7Ci0gICAgICAgIFhGcmVlKG1vZGVsaXN0KTsKLSAgICB9Ci0jZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FICovCi0KLSAgICB7Ci0JLyogSXQncyBpbnRlcmVzdGluZyB0byBub3RlIHRoYXQgaWYgd2UgYWxsb3cgMzIgYml0IGRlcHRocywKLQkgICB3ZSBnZXQgYSB2aXN1YWwgd2l0aCBhbiBhbHBoYSBtYXNrIG9uIGNvbXBvc2l0ZSBzZXJ2ZXJzLgotICAgICAgICBzdGF0aWMgaW50IGRlcHRoX2xpc3RbXSA9IHsgMzIsIDI0LCAxNiwgMTUsIDggfTsKLQkqLwotICAgICAgICBzdGF0aWMgaW50IGRlcHRoX2xpc3RbXSA9IHsgMjQsIDE2LCAxNSwgOCB9OwotICAgICAgICBpbnQgaiwgbnA7Ci0gICAgICAgIGludCB1c2VfZGlyZWN0Y29sb3IgPSAxOwotICAgICAgICBYUGl4bWFwRm9ybWF0VmFsdWVzICpwZjsKLQotICAgICAgICAvKiBTZWFyY2ggZm9yIHRoZSB2aXN1YWxzIGluIGRlZXBlc3QtZmlyc3Qgb3JkZXIsIHNvIHRoYXQgdGhlIGZpcnN0Ci0gICAgICAgICAgIHdpbGwgYmUgdGhlIHJpY2hlc3Qgb25lICovCi0gICAgICAgIGlmICggU0RMX2dldGVudigiU0RMX1ZJREVPX1gxMV9OT0RJUkVDVENPTE9SIikgKSB7Ci0gICAgICAgICAgICAgICAgdXNlX2RpcmVjdGNvbG9yID0gMDsKLSAgICAgICAgfQotICAgICAgICB0aGlzLT5oaWRkZW4tPm52aXN1YWxzID0gMDsKLSAgICAgICAgaWYgKCAhIGFkZF92aXN1YWxfYnlpZCh0aGlzLCBTRExfZ2V0ZW52KCJTRExfVklERU9fWDExX1ZJU1VBTElEIikpICkgewotICAgICAgICAgICAgICAgIGZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKGRlcHRoX2xpc3QpOyArK2kgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRlcHRoX2xpc3RbaV0gPiA4ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHVzZV9kaXJlY3Rjb2xvciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdmlzdWFsKHRoaXMsIGRlcHRoX2xpc3RbaV0sIERpcmVjdENvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdmlzdWFsKHRoaXMsIGRlcHRoX2xpc3RbaV0sIFRydWVDb2xvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdmlzdWFsKHRoaXMsIGRlcHRoX2xpc3RbaV0sIFBzZXVkb0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3Zpc3VhbCh0aGlzLCBkZXB0aF9saXN0W2ldLCBTdGF0aWNDb2xvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICggdGhpcy0+aGlkZGVuLT5udmlzdWFscyA9PSAwICkgewotICAgICAgICAgICAgU0RMX1NldEVycm9yKCJGb3VuZCBubyBzdWZmaWNpZW50bHkgY2FwYWJsZSBYMTEgdmlzdWFscyIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgLyogbG9vayB1cCB0aGUgcGl4ZWwgcXVhbnR1bSBmb3IgZWFjaCBkZXB0aCAqLwotICAgICAgICBwZiA9IFhMaXN0UGl4bWFwRm9ybWF0cyhTRExfRGlzcGxheSwgJm5wKTsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgdGhpcy0+aGlkZGVuLT5udmlzdWFsczsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgZCA9IHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5kZXB0aDsKLSAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IG5wOyBqKyspCi0gICAgICAgICAgICAgICAgaWYocGZbal0uZGVwdGggPT0gZCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uYnBwID0gaiA8IG5wID8gcGZbal0uYml0c19wZXJfcGl4ZWwgOiBkOwotICAgICAgICB9Ci0KLSAgICAgICAgWEZyZWUocGYpOwotICAgIH0KLQotICAgIGlmICggU0RMX21vZGVsaXN0ID09IE5VTEwgKSB7Ci0gICAgICAgIFNETF9tb2RlbGlzdCA9IChTRExfUmVjdCAqKilTRExfbWFsbG9jKCgxKzEpKnNpemVvZihTRExfUmVjdCAqKSk7Ci0gICAgICAgIGlmICggIVNETF9tb2RlbGlzdCApIHsKLSAgICAgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG4gPSAwOwotICAgICAgICBTRExfbW9kZWxpc3Rbbl0gPSAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpOwotICAgICAgICBpZiAoIFNETF9tb2RlbGlzdFtuXSApIHsKLSAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+eCA9IDA7Ci0gICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPnkgPSAwOwotICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT53ID0gc2NyZWVuX3c7Ci0gICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPmggPSBzY3JlZW5faDsKLSAgICAgICAgICAgICsrbjsKLSAgICAgICAgfQotICAgICAgICBTRExfbW9kZWxpc3Rbbl0gPSBOVUxMOwotICAgIH0KLQotI2lmZGVmIFgxMU1PREVTX0RFQlVHCi0gICAgaWYgKCB1c2VfeGluZXJhbWEgKSB7Ci0gICAgICAgIHByaW50ZigiWGluZXJhbWEgaXMgZW5hYmxlZFxuIik7Ci0gICAgfQotCi0gICAgaWYgKCB1c2VfeHJhbmRyICkgewotICAgICAgICBwcmludGYoIlhSYW5kUiBpcyBlbmFibGVkXG4iKTsKLSAgICB9Ci0KLSAgICBpZiAoIHVzZV92aWRtb2RlICkgewotICAgICAgICBwcmludGYoIlZpZE1vZGUgaXMgZW5hYmxlZFxuIik7Ci0gICAgfQotCi0gICAgaWYgKCB1c2VfeG1lICkgewotICAgICAgICBwcmludGYoIlhpIEdyYXBoaWNzIFhNRSBmdWxsc2NyZWVuIGlzIGVuYWJsZWRcbiIpOwotICAgIH0KLQotICAgIGlmICggU0RMX21vZGVsaXN0ICkgewotICAgICAgICBwcmludGYoIlgxMSB2aWRlbyBtb2RlIGxpc3Q6XG4iKTsKLSAgICAgICAgZm9yICggaT0wOyBTRExfbW9kZWxpc3RbaV07ICsraSApIHsKLSAgICAgICAgICAgIHByaW50ZigiXHQlZHglZFxuIiwgU0RMX21vZGVsaXN0W2ldLT53LCBTRExfbW9kZWxpc3RbaV0tPmgpOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmIC8qIFgxMU1PREVTX0RFQlVHICovCi0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFgxMV9TdXBwb3J0ZWRWaXN1YWwoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0KQotewotICAgIGludCBpOwotICAgIGZvcihpID0gMDsgaSA8IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHM7IGkrKykKLSAgICAgICAgaWYodGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLmJwcCA9PSBmb3JtYXQtPkJpdHNQZXJQaXhlbCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi1TRExfUmVjdCAqKlgxMV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCi17Ci0gICAgaWYgKCBYMTFfU3VwcG9ydGVkVmlzdWFsKHRoaXMsIGZvcm1hdCkgKSB7Ci0gICAgICAgIGlmICggZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKLSAgICAgICAgICAgIHJldHVybihTRExfbW9kZWxpc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuKChTRExfUmVjdCAqKiktMSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4oKFNETF9SZWN0ICoqKTApOwotICAgIH0KLX0KLQotdm9pZCBYMTFfRnJlZVZpZGVvTW9kZXMoX1RISVMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIFNETF9tb2RlbGlzdCApIHsKLSAgICAgICAgZm9yICggaT0wOyBTRExfbW9kZWxpc3RbaV07ICsraSApIHsKLSAgICAgICAgICAgIFNETF9mcmVlKFNETF9tb2RlbGlzdFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgU0RMX2ZyZWUoU0RMX21vZGVsaXN0KTsKLSAgICAgICAgU0RMX21vZGVsaXN0ID0gTlVMTDsKLSAgICB9Ci0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKLSAgICAvKiBGcmVlIHRoZSBYcmFuZHIgc2NyZWVuIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBpZiAoIHNjcmVlbl9jb25maWcgKSB7Ci0gICAgICAgIFhSUkZyZWVTY3JlZW5Db25maWdJbmZvKHNjcmVlbl9jb25maWcpOwotICAgICAgICBzY3JlZW5fY29uZmlnID0gTlVMTDsKLSAgICB9Ci0jZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFJBTkRSICovCi19Ci0KLWludCBYMTFfUmVzaXplRnVsbFNjcmVlbihfVEhJUykKLXsKLSAgICBpbnQgeCA9IDAsIHkgPSAwOwotICAgIGludCByZWFsX3csIHJlYWxfaDsKLSAgICBpbnQgc2NyZWVuX3c7Ci0gICAgaW50IHNjcmVlbl9oOwotCi0gICAgc2NyZWVuX3cgPSBEaXNwbGF5V2lkdGgoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOwotICAgIHNjcmVlbl9oID0gRGlzcGxheUhlaWdodChTRExfRGlzcGxheSwgU0RMX1NjcmVlbik7Ci0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQotICAgIGlmICggdXNlX3hpbmVyYW1hICYmCi0gICAgICAgICB3aW5kb3dfdyA8PSB4aW5lcmFtYV9pbmZvLndpZHRoICYmCi0gICAgICAgICB3aW5kb3dfaCA8PSB4aW5lcmFtYV9pbmZvLmhlaWdodCApIHsKLSAgICAgICAgeCA9IHhpbmVyYW1hX2luZm8ueF9vcmc7Ci0gICAgICAgIHkgPSB4aW5lcmFtYV9pbmZvLnlfb3JnOwotICAgIH0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQSAqLwotCi0gICAgaWYgKCBjdXJyZW50bHlfZnVsbHNjcmVlbiApIHsKLSAgICAgICAgLyogU3dpdGNoIHJlc29sdXRpb24gYW5kIGNvdmVyIGl0IHdpdGggdGhlIEZTd2luZG93ICovCi0gICAgICAgIG1vdmVfY3Vyc29yX3RvKHRoaXMsIHgsIHkpOwotICAgICAgICBzZXRfYmVzdF9yZXNvbHV0aW9uKHRoaXMsIHdpbmRvd193LCB3aW5kb3dfaCk7Ci0gICAgICAgIG1vdmVfY3Vyc29yX3RvKHRoaXMsIHgsIHkpOwotICAgICAgICBnZXRfcmVhbF9yZXNvbHV0aW9uKHRoaXMsICZyZWFsX3csICZyZWFsX2gpOwotICAgICAgICBpZiAoIHdpbmRvd193ID4gcmVhbF93ICkgewotICAgICAgICAgICAgcmVhbF93ID0gTUFYKHJlYWxfdywgc2NyZWVuX3cpOwotICAgICAgICB9Ci0gICAgICAgIGlmICggd2luZG93X2ggPiByZWFsX2ggKSB7Ci0gICAgICAgICAgICByZWFsX2ggPSBNQVgocmVhbF9oLCBzY3JlZW5faCk7Ci0gICAgICAgIH0KLSAgICAgICAgWE1vdmVSZXNpemVXaW5kb3coU0RMX0Rpc3BsYXksIEZTd2luZG93LCB4LCB5LCByZWFsX3csIHJlYWxfaCk7Ci0gICAgICAgIG1vdmVfY3Vyc29yX3RvKHRoaXMsIHJlYWxfdy8yLCByZWFsX2gvMik7Ci0KLSAgICAgICAgLyogQ2VudGVyIGFuZCByZXBhcmVudCB0aGUgZHJhd2luZyB3aW5kb3cgKi8KLSAgICAgICAgeCA9IChyZWFsX3cgLSB3aW5kb3dfdykvMjsKLSAgICAgICAgeSA9IChyZWFsX2ggLSB3aW5kb3dfaCkvMjsKLSAgICAgICAgWFJlcGFyZW50V2luZG93KFNETF9EaXNwbGF5LCBTRExfV2luZG93LCBGU3dpbmRvdywgeCwgeSk7Ci0gICAgICAgIC8qIEZJWE1FOiBtb3ZlIHRoZSBtb3VzZSB0byB0aGUgb2xkIHJlbGF0aXZlIGxvY2F0aW9uICovCi0gICAgICAgIFhTeW5jKFNETF9EaXNwbGF5LCBUcnVlKTsgICAvKiBGbHVzaCBzcHVyaW91cyBtb2RlIGNoYW5nZSBldmVudHMgKi8KLSAgICB9Ci0gICAgcmV0dXJuKDEpOwotfQotCi12b2lkIFgxMV9RdWV1ZUVudGVyRnVsbFNjcmVlbihfVEhJUykKLXsKLSAgICBzd2l0Y2hfd2FpdGluZyA9IDB4MDEgfCBTRExfRlVMTFNDUkVFTjsKLSAgICBzd2l0Y2hfdGltZSA9IFNETF9HZXRUaWNrcygpICsgMTUwMDsKLSNpZiAwIC8qIFRoaXMgY2F1c2VzIGEgQmFkTWF0Y2ggZXJyb3IgaWYgdGhlIHdpbmRvdyBpcyBpY29uaWZpZWQgKG5vdCBuZWVkZWQpICovCi0gICAgWFNldElucHV0Rm9jdXMoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBSZXZlcnRUb05vbmUsIEN1cnJlbnRUaW1lKTsKLSNlbmRpZgotfQotCi1pbnQgWDExX0VudGVyRnVsbFNjcmVlbihfVEhJUykKLXsKLSAgICBpbnQgb2theTsKLSNpZiAwCi0gICAgV2luZG93IHRtcHdpbiwgKndpbmRvd3M7Ci0gICAgaW50IGksIG53aW5kb3dzOwotI2VuZGlmCi0gICAgaW50IHggPSAwLCB5ID0gMDsKLSAgICBpbnQgcmVhbF93LCByZWFsX2g7Ci0gICAgaW50IHNjcmVlbl93OwotICAgIGludCBzY3JlZW5faDsKLQotICAgIG9rYXkgPSAxOwotICAgIGlmICggY3VycmVudGx5X2Z1bGxzY3JlZW4gKSB7Ci0gICAgICAgIHJldHVybihva2F5KTsKLSAgICB9Ci0KLSAgICAvKiBVbmdyYWIgdGhlIGlucHV0IHNvIHRoYXQgd2UgY2FuIG1vdmUgdGhlIG1vdXNlIGFyb3VuZCAqLwotICAgIFgxMV9HcmFiSW5wdXROb0xvY2sodGhpcywgU0RMX0dSQUJfT0ZGKTsKLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BCi0gICAgaWYgKCB1c2VfeGluZXJhbWEgJiYKLSAgICAgICAgIHdpbmRvd193IDw9IHhpbmVyYW1hX2luZm8ud2lkdGggJiYKLSAgICAgICAgIHdpbmRvd19oIDw9IHhpbmVyYW1hX2luZm8uaGVpZ2h0ICkgewotICAgICAgICB4ID0geGluZXJhbWFfaW5mby54X29yZzsKLSAgICAgICAgeSA9IHhpbmVyYW1hX2luZm8ueV9vcmc7Ci0gICAgfQotI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BICovCi0KLSAgICAvKiBNYXAgdGhlIGZ1bGxzY3JlZW4gd2luZG93IHRvIGJsYW5rIHRoZSBzY3JlZW4gKi8KLSAgICBzY3JlZW5fdyA9IERpc3BsYXlXaWR0aChTRExfRGlzcGxheSwgU0RMX1NjcmVlbik7Ci0gICAgc2NyZWVuX2ggPSBEaXNwbGF5SGVpZ2h0KFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKLSAgICBnZXRfcmVhbF9yZXNvbHV0aW9uKHRoaXMsICZyZWFsX3csICZyZWFsX2gpOwotICAgIGlmICggd2luZG93X3cgPiByZWFsX3cgKSB7Ci0gICAgICAgIHJlYWxfdyA9IE1BWChyZWFsX3csIHNjcmVlbl93KTsKLSAgICB9Ci0gICAgaWYgKCB3aW5kb3dfaCA+IHJlYWxfaCApIHsKLSAgICAgICAgcmVhbF9oID0gTUFYKHJlYWxfaCwgc2NyZWVuX2gpOwotICAgIH0KLSAgICBYTW92ZVJlc2l6ZVdpbmRvdyhTRExfRGlzcGxheSwgRlN3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgeCwgeSwgcmVhbF93LCByZWFsX2gpOwotICAgIFhNYXBSYWlzZWQoU0RMX0Rpc3BsYXksIEZTd2luZG93KTsKLSAgICBYMTFfV2FpdE1hcHBlZCh0aGlzLCBGU3dpbmRvdyk7Ci0KLSNpZiAwIC8qIFRoaXMgc2VlbXMgdG8gYnJlYWsgV2luZG93TWFrZXIgaW4gZm9jdXMtZm9sbG93cy1tb3VzZSBtb2RlICovCi0gICAgLyogTWFrZSBzdXJlIHdlIGdvdCB0byB0aGUgdG9wIG9mIHRoZSB3aW5kb3cgc3RhY2sgKi8KLSAgICBpZiAoIFhRdWVyeVRyZWUoU0RMX0Rpc3BsYXksIFNETF9Sb290LCAmdG1wd2luLCAmdG1wd2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dzLCAmbndpbmRvd3MpICYmIHdpbmRvd3MgKSB7Ci0gICAgICAgIC8qIElmIG5vdCwgdHJ5IHRvIHB1dCB1cyB0aGVyZSAtIGlmIGZhaWwuLi4gb2ggd2VsbCAqLwotICAgICAgICBpZiAoIHdpbmRvd3NbbndpbmRvd3MtMV0gIT0gRlN3aW5kb3cgKSB7Ci0gICAgICAgICAgICB0bXB3aW4gPSB3aW5kb3dzW253aW5kb3dzLTFdOwotICAgICAgICAgICAgZm9yICggaT0wOyBpPG53aW5kb3dzOyArK2kgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCB3aW5kb3dzW2ldID09IEZTd2luZG93ICkgewotICAgICAgICAgICAgICAgICAgICBTRExfbWVtY3B5KCZ3aW5kb3dzW2ldLCAmd2luZG93c1tpKzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG53aW5kb3dzLWktMSkqc2l6ZW9mKHdpbmRvd3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2luZG93c1tud2luZG93cy0xXSA9IEZTd2luZG93OwotICAgICAgICAgICAgWFJlc3RhY2tXaW5kb3dzKFNETF9EaXNwbGF5LCB3aW5kb3dzLCBud2luZG93cyk7Ci0gICAgICAgICAgICBYU3luYyhTRExfRGlzcGxheSwgRmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIFhGcmVlKHdpbmRvd3MpOwotICAgIH0KLSNlbHNlCi0gICAgWFJhaXNlV2luZG93KFNETF9EaXNwbGF5LCBGU3dpbmRvdyk7Ci0jZW5kaWYKLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKLSAgICAvKiBTYXZlIHRoZSBjdXJyZW50IHZpZGVvIG1vZGUgKi8KLSAgICBpZiAoIHVzZV92aWRtb2RlICkgewotICAgICAgICBTRExfTkFNRShYRjg2VmlkTW9kZUxvY2tNb2RlU3dpdGNoKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgVHJ1ZSk7Ci0gICAgfQotI2VuZGlmCi0gICAgY3VycmVudGx5X2Z1bGxzY3JlZW4gPSAxOwotCi0gICAgLyogU2V0IHRoZSBuZXcgcmVzb2x1dGlvbiAqLwotICAgIG9rYXkgPSBYMTFfUmVzaXplRnVsbFNjcmVlbih0aGlzKTsKLSAgICBpZiAoICEgb2theSApIHsKLSAgICAgICAgWDExX0xlYXZlRnVsbFNjcmVlbih0aGlzKTsKLSAgICB9Ci0gICAgLyogU2V0IHRoZSBjb2xvcm1hcCAqLwotICAgIGlmICggU0RMX1hDb2xvck1hcCApIHsKLSAgICAgICAgWEluc3RhbGxDb2xvcm1hcChTRExfRGlzcGxheSwgU0RMX1hDb2xvck1hcCk7Ci0gICAgfQotICAgIGlmICggb2theSApIHsKLSAgICAgICAgWDExX0dyYWJJbnB1dE5vTG9jayh0aGlzLCB0aGlzLT5pbnB1dF9ncmFiIHwgU0RMX0dSQUJfRlVMTFNDUkVFTik7Ci0gICAgfQotCi0gICAgLyogV2UgbWF5IG5lZWQgdG8gcmVmcmVzaCB0aGUgc2NyZWVuIGF0IHRoaXMgcG9pbnQgKG5vIGJhY2tpbmcgc3RvcmUpCi0gICAgICAgV2UgYWxzbyBkb24ndCBnZXQgYW4gZXZlbnQsIHdoaWNoIGlzIHdoeSB3ZSBleHBsaWNpdGx5IHJlZnJlc2guICovCi0gICAgaWYgKCB0aGlzLT5zY3JlZW4gKSB7Ci0gICAgICAgIGlmICggdGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9PUEVOR0wgKSB7Ci0gICAgICAgICAgICBTRExfUHJpdmF0ZUV4cG9zZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgWDExX1JlZnJlc2hEaXNwbGF5KHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKG9rYXkpOwotfQotCi1pbnQgWDExX0xlYXZlRnVsbFNjcmVlbihfVEhJUykKLXsKLSAgICBpZiAoIGN1cnJlbnRseV9mdWxsc2NyZWVuICkgewotICAgICAgICBYUmVwYXJlbnRXaW5kb3coU0RMX0Rpc3BsYXksIFNETF9XaW5kb3csIFdNd2luZG93LCAwLCAwKTsKLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFCi0gICAgICAgIGlmICggdXNlX3ZpZG1vZGUgKSB7Ci0gICAgICAgICAgICByZXN0b3JlX21vZGUodGhpcyk7Ci0gICAgICAgICAgICBTRExfTkFNRShYRjg2VmlkTW9kZUxvY2tNb2RlU3dpdGNoKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgRmFsc2UpOwotICAgICAgICB9Ci0jZW5kaWYKLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hNRQotICAgICAgICBpZiAoIHVzZV94bWUgKSB7Ci0gICAgICAgICAgICBpbnQgcncsIHJoOyAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIGNoZWNrIGN1cnJlbnQgbW9kZSBzbyB3ZSBjYW4gYXZvaWQgdW5lY2Nlc3NhcnkgbW9kZSBjaGFuZ2VzICovCi0gICAgICAgICAgICBnZXRfcmVhbF9yZXNvbHV0aW9uKHRoaXMsICZydywgJnJoKTsKLQotICAgICAgICAgICAgaWYgKHJ3ICE9IHNhdmVkX3Jlcy53aWR0aCB8fCByaCAhPSBzYXZlZF9yZXMuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgWGlHTWlzY0NoYW5nZVJlc29sdXRpb24oU0RMX0Rpc3BsYXksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9TY3JlZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogdmlldyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkX3Jlcy53aWR0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRfcmVzLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgICAgICBYU3luYyhTRExfRGlzcGxheSwgRmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUgotICAgICAgICBpZiAoIHVzZV94cmFuZHIgKSB7Ci0gICAgICAgICAgICBYUlJTZXRTY3JlZW5Db25maWcoU0RMX0Rpc3BsYXksIHNjcmVlbl9jb25maWcsIFNETF9Sb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkX3NpemVfaWQsIHNhdmVkX3JvdGF0aW9uLCBDdXJyZW50VGltZSk7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIFhVbm1hcFdpbmRvdyhTRExfRGlzcGxheSwgRlN3aW5kb3cpOwotICAgICAgICBYMTFfV2FpdFVubWFwcGVkKHRoaXMsIEZTd2luZG93KTsKLSAgICAgICAgWFN5bmMoU0RMX0Rpc3BsYXksIFRydWUpOyAgIC8qIEZsdXNoIHNwdXJpb3VzIG1vZGUgY2hhbmdlIGV2ZW50cyAqLwotICAgICAgICBjdXJyZW50bHlfZnVsbHNjcmVlbiA9IDA7Ci0gICAgfQotICAgIC8qIElmIHdlIGdldCBwb3BwZWQgb3V0IG9mIGZ1bGxzY3JlZW4gbW9kZSBmb3Igc29tZSByZWFzb24sIGlucHV0X2dyYWIKLSAgICAgICB3aWxsIHN0aWxsIGhhdmUgdGhlIFNETF9HUkFCX0ZVTExTQ1JFRU4gZmxhZyBzZXQsIHNpbmNlIHRoaXMgaXMgb25seQotICAgICAgIHRlbXBvcmFyeS4gIEluIHRoaXMgY2FzZSwgcmVsZWFzZSB0aGUgZ3JhYiB1bmxlc3MgdGhlIGlucHV0IGhhcyBiZWVuCi0gICAgICAgZXhwbGljaXRseSBncmFiYmVkLgotICAgICAqLwotICAgIFgxMV9HcmFiSW5wdXROb0xvY2sodGhpcywgdGhpcy0+aW5wdXRfZ3JhYiAmIH5TRExfR1JBQl9GVUxMU0NSRUVOKTsKLQotICAgIC8qIFdlIG1heSBuZWVkIHRvIHJlZnJlc2ggdGhlIHNjcmVlbiBhdCB0aGlzIHBvaW50IChubyBiYWNraW5nIHN0b3JlKQotICAgICAgIFdlIGFsc28gZG9uJ3QgZ2V0IGFuIGV2ZW50LCB3aGljaCBpcyB3aHkgd2UgZXhwbGljaXRseSByZWZyZXNoLiAqLwotICAgIGlmICggdGhpcy0+c2NyZWVuICkgewotICAgICAgICBpZiAoIHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfT1BFTkdMICkgewotICAgICAgICAgICAgU0RMX1ByaXZhdGVFeHBvc2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFgxMV9SZWZyZXNoRGlzcGxheSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFtb2Rlc19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW9kZXNfYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzYzNzM4Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFtb2Rlc19jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVXRpbGl0aWVzIGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIHRoZSBYIGRpc3BsYXkgbW9kZSAqLwotCi0jaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRvIGdyYWIgdGhlIGtleWJvYXJkIGluIGZ1bGxzY3JlZW4gbW9kZS4KLSAgIElmIHlvdSBkbyBub3QgZGVmaW5lIHRoaXMsIFNETCB3aWxsIHJldHVybiBmcm9tIFNETF9TZXRWaWRlb01vZGUoKQotICAgaW1tZWRpYXRlbHksIGJ1dCB3aWxsIG5vdCBhY3R1YWxseSBnbyBmdWxsc2NyZWVuIHVudGlsIHRoZSB3aW5kb3cKLSAgIG1hbmFnZXIgaXMgaWRsZS4KLSovCi0jZGVmaW5lIEdSQUJfRlVMTFNDUkVFTgotCi1leHRlcm4gaW50IFgxMV9HZXRWaWRlb01vZGVzKF9USElTKTsKLWV4dGVybiBTRExfUmVjdCAqKlgxMV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgWDExX0ZyZWVWaWRlb01vZGVzKF9USElTKTsKLWV4dGVybiBpbnQgWDExX1Jlc2l6ZUZ1bGxTY3JlZW4oX1RISVMpOwotZXh0ZXJuIHZvaWQgWDExX1dhaXRNYXBwZWQoX1RISVMsIFdpbmRvdyB3aW4pOwotZXh0ZXJuIHZvaWQgWDExX1dhaXRVbm1hcHBlZChfVEhJUywgV2luZG93IHdpbik7Ci1leHRlcm4gdm9pZCBYMTFfUXVldWVFbnRlckZ1bGxTY3JlZW4oX1RISVMpOwotZXh0ZXJuIGludCBYMTFfRW50ZXJGdWxsU2NyZWVuKF9USElTKTsKLWV4dGVybiBpbnQgWDExX0xlYXZlRnVsbFNjcmVlbihfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFtb3VzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjEwMzJiLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFtb3VzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKLSNpbmNsdWRlICJTRExfeDExZGdhX2MuaCIKLSNpbmNsdWRlICJTRExfeDExbW91c2VfYy5oIgotCi0KLS8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLwotc3RydWN0IFdNY3Vyc29yIHsKLQlDdXJzb3IgeF9jdXJzb3I7Ci19OwotCi0KLXZvaWQgWDExX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKLXsKLQlpZiAoIFNETF9EaXNwbGF5ICE9IE5VTEwgKSB7Ci0JCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0JCVhGcmVlQ3Vyc29yKFNETF9EaXNwbGF5LCBjdXJzb3ItPnhfY3Vyc29yKTsKLQkJWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKLQkJU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotCX0KLQlTRExfZnJlZShjdXJzb3IpOwotfQotCi1XTWN1cnNvciAqWDExX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAotCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpCi17Ci0JV01jdXJzb3IgKmN1cnNvcjsKLQlYR0NWYWx1ZXMgR0N2YWx1ZXM7Ci0JR0MgICAgICAgIEdDY3Vyc29yOwotCVhJbWFnZSAqZGF0YV9pbWFnZSwgKm1hc2tfaW1hZ2U7Ci0JUGl4bWFwICBkYXRhX3BpeG1hcCwgbWFza19waXhtYXA7Ci0JaW50ICAgICAgIGNsZW4sIGk7Ci0JY2hhciAgICAgKnhfZGF0YSwgKnhfbWFzazsKLQlzdGF0aWMgWENvbG9yIGJsYWNrID0geyAgMCwgIDAsICAwLCAgMCB9OwotCXN0YXRpYyBYQ29sb3Igd2hpdGUgPSB7IDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiB9OwotCi0JLyogQWxsb2NhdGUgdGhlIGN1cnNvciBtZW1vcnkgKi8KLQljdXJzb3IgPSAoV01jdXJzb3IgKilTRExfbWFsbG9jKHNpemVvZihXTWN1cnNvcikpOwotCWlmICggY3Vyc29yID09IE5VTEwgKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogTWl4IHRoZSBtYXNrIGFuZCB0aGUgZGF0YSAqLwotCWNsZW4gPSAody84KSpoOwotCXhfZGF0YSA9IChjaGFyICopU0RMX21hbGxvYyhjbGVuKTsKLQlpZiAoIHhfZGF0YSA9PSBOVUxMICkgewotCQlTRExfZnJlZShjdXJzb3IpOwotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQl4X21hc2sgPSAoY2hhciAqKVNETF9tYWxsb2MoY2xlbik7Ci0JaWYgKCB4X21hc2sgPT0gTlVMTCApIHsKLQkJU0RMX2ZyZWUoY3Vyc29yKTsKLQkJU0RMX2ZyZWUoeF9kYXRhKTsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JZm9yICggaT0wOyBpPGNsZW47ICsraSApIHsKLQkJLyogVGhlIG1hc2sgaXMgT1InZCB3aXRoIHRoZSBkYXRhIHRvIHR1cm4gaW52ZXJ0ZWQgY29sb3IKLQkJICAgcGl4ZWxzIGJsYWNrIHNpbmNlIGludmVydGVkIGNvbG9yIGN1cnNvcnMgYXJlbid0IHN1cHBvcnRlZAotCQkgICB1bmRlciBYMTEuCi0JCSAqLwotCQl4X21hc2tbaV0gPSBkYXRhW2ldIHwgbWFza1tpXTsKLQkJeF9kYXRhW2ldID0gZGF0YVtpXTsKLQl9Ci0KLQkvKiBQcmV2ZW50IHRoZSBldmVudCB0aHJlYWQgZnJvbSBydW5uaW5nIHdoaWxlIHdlIHVzZSB0aGUgWCBzZXJ2ZXIgKi8KLQlTRExfTG9ja19FdmVudFRocmVhZCgpOwotCi0JLyogQ3JlYXRlIHRoZSBkYXRhIGltYWdlICovCi0JZGF0YV9pbWFnZSA9IFhDcmVhdGVJbWFnZShTRExfRGlzcGxheSwgCi0JCQlEZWZhdWx0VmlzdWFsKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKSwKLQkJCQkJMSwgWFlCaXRtYXAsIDAsIHhfZGF0YSwgdywgaCwgOCwgdy84KTsKLQlkYXRhX2ltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3Q7Ci0JZGF0YV9pbWFnZS0+Yml0bWFwX2JpdF9vcmRlciA9IE1TQkZpcnN0OwotCWRhdGFfcGl4bWFwID0gWENyZWF0ZVBpeG1hcChTRExfRGlzcGxheSwgU0RMX1Jvb3QsIHcsIGgsIDEpOwotCi0JLyogQ3JlYXRlIHRoZSBkYXRhIG1hc2sgKi8KLQltYXNrX2ltYWdlID0gWENyZWF0ZUltYWdlKFNETF9EaXNwbGF5LCAKLQkJCURlZmF1bHRWaXN1YWwoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pLAotCQkJCQkxLCBYWUJpdG1hcCwgMCwgeF9tYXNrLCB3LCBoLCA4LCB3LzgpOwotCW1hc2tfaW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdDsKLQltYXNrX2ltYWdlLT5iaXRtYXBfYml0X29yZGVyID0gTVNCRmlyc3Q7Ci0JbWFza19waXhtYXAgPSBYQ3JlYXRlUGl4bWFwKFNETF9EaXNwbGF5LCBTRExfUm9vdCwgdywgaCwgMSk7Ci0KLQkvKiBDcmVhdGUgdGhlIGdyYXBoaWNzIGNvbnRleHQgKi8KLQlHQ3ZhbHVlcy5mdW5jdGlvbiA9IEdYY29weTsKLQlHQ3ZhbHVlcy5mb3JlZ3JvdW5kID0gfjA7Ci0JR0N2YWx1ZXMuYmFja2dyb3VuZCA9ICAwOwotCUdDdmFsdWVzLnBsYW5lX21hc2sgPSBBbGxQbGFuZXM7Ci0JR0NjdXJzb3IgPSBYQ3JlYXRlR0MoU0RMX0Rpc3BsYXksIGRhdGFfcGl4bWFwLAotCQkJKEdDRnVuY3Rpb258R0NGb3JlZ3JvdW5kfEdDQmFja2dyb3VuZHxHQ1BsYW5lTWFzayksCi0JCQkJCQkJCSZHQ3ZhbHVlcyk7Ci0KLQkvKiBCbGl0IHRoZSBpbWFnZXMgdG8gdGhlIHBpeG1hcHMgKi8KLQlYUHV0SW1hZ2UoU0RMX0Rpc3BsYXksIGRhdGFfcGl4bWFwLCBHQ2N1cnNvciwgZGF0YV9pbWFnZSwKLQkJCQkJCQkwLCAwLCAwLCAwLCB3LCBoKTsKLQlYUHV0SW1hZ2UoU0RMX0Rpc3BsYXksIG1hc2tfcGl4bWFwLCBHQ2N1cnNvciwgbWFza19pbWFnZSwKLQkJCQkJCQkwLCAwLCAwLCAwLCB3LCBoKTsKLQlYRnJlZUdDKFNETF9EaXNwbGF5LCBHQ2N1cnNvcik7Ci0JLyogVGhlc2UgZnJlZSB0aGUgeF9kYXRhIGFuZCB4X21hc2sgbWVtb3J5IHBvaW50ZXJzICovCi0JWERlc3Ryb3lJbWFnZShkYXRhX2ltYWdlKTsKLQlYRGVzdHJveUltYWdlKG1hc2tfaW1hZ2UpOwotCi0JLyogQ3JlYXRlIHRoZSBjdXJzb3IgKi8KLQljdXJzb3ItPnhfY3Vyc29yID0gWENyZWF0ZVBpeG1hcEN1cnNvcihTRExfRGlzcGxheSwgZGF0YV9waXhtYXAsCi0JCQkJbWFza19waXhtYXAsICZibGFjaywgJndoaXRlLCBob3RfeCwgaG90X3kpOwotCVhGcmVlUGl4bWFwKFNETF9EaXNwbGF5LCBkYXRhX3BpeG1hcCk7Ci0JWEZyZWVQaXhtYXAoU0RMX0Rpc3BsYXksIG1hc2tfcGl4bWFwKTsKLQotCS8qIFJlbGVhc2UgdGhlIGV2ZW50IHRocmVhZCAqLwotCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Ci0JU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotCi0JcmV0dXJuKGN1cnNvcik7Ci19Ci0KLWludCBYMTFfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQotewotCS8qIERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBkaXNwbGF5IGlzIGdvbmUgKi8KLQlpZiAoIFNETF9EaXNwbGF5ID09IE5VTEwgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBTZXQgdGhlIFgxMSBjdXJzb3IgY3Vyc29yLCBvciBibGFuayBpZiBjdXJzb3IgaXMgTlVMTCAqLwotCWlmICggU0RMX1dpbmRvdyApIHsKLQkJU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKLQkJaWYgKCBjdXJzb3IgPT0gTlVMTCApIHsKLQkJCWlmICggU0RMX0JsYW5rQ3Vyc29yICE9IE5VTEwgKSB7Ci0JCQkJWERlZmluZUN1cnNvcihTRExfRGlzcGxheSwgU0RMX1dpbmRvdywKLQkJCQkJU0RMX0JsYW5rQ3Vyc29yLT54X2N1cnNvcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlYRGVmaW5lQ3Vyc29yKFNETF9EaXNwbGF5LCBTRExfV2luZG93LCBjdXJzb3ItPnhfY3Vyc29yKTsKLQkJfQotCQlYU3luYyhTRExfRGlzcGxheSwgRmFsc2UpOwotCQlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci0JfQotCXJldHVybigxKTsKLX0KLQotdm9pZCBYMTFfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCi17Ci0JaWYgKCB1c2luZ19kZ2EgJiBER0FfTU9VU0UgKSB7Ci0JCVNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgeCwgeSk7Ci0JfSBlbHNlIGlmICggbW91c2VfcmVsYXRpdmUpIHsKLQkJLyoJUkpSOiBNYXJjaCAyOCwgMjAwMAotCQkJbGVhdmUgcGh5c2ljYWwgY3Vyc29yIGF0IGNlbnRlciBvZiBzY3JlZW4gaWYKLQkJCW1vdXNlIGhpZGRlbiBhbmQgZ3JhYmJlZCAqLwotCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHgsIHkpOwotCX0gZWxzZSB7Ci0JCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0JCVhXYXJwUG9pbnRlcihTRExfRGlzcGxheSwgTm9uZSwgU0RMX1dpbmRvdywgMCwgMCwgMCwgMCwgeCwgeSk7Ci0JCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Ci0JCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKLQl9Ci19Ci0KLS8qIFNldHMgdGhlIG1vdXNlIGFjY2VsZXJhdGlvbiBmcm9tIGEgc3RyaW5nIG9mIHRoZSBmb3JtOgotCTIvMS8wCi0gICBUaGUgZmlyc3QgbnVtYmVyIGlzIHRoZSBudW1lcmF0b3IsIGZvbGxvd2VkIGJ5IHRoZSBhY2NlbGVyYXRpb24KLSAgIGRlbnVtZW5hdG9yIGFuZCB0aHJlc2hvbGQuCi0qLwotc3RhdGljIHZvaWQgU2V0TW91c2VBY2NlbChfVEhJUywgY29uc3QgY2hhciAqYWNjZWxfcGFyYW0pCi17Ci0JaW50IGk7Ci0Jc2l6ZV90IGxlbjsKLQlpbnQgYWNjZWxfdmFsdWVbM107Ci0JY2hhciAqbW91c2VfcGFyYW0sICptb3VzZV9wYXJhbV9idWYsICpwaW47Ci0KLQlsZW4gPSBTRExfc3RybGVuKGFjY2VsX3BhcmFtKSsxOwotCW1vdXNlX3BhcmFtX2J1ZiA9IFNETF9zdGFja19hbGxvYyhjaGFyLCBsZW4pOwotCWlmICggISBtb3VzZV9wYXJhbV9idWYgKSB7Ci0JCXJldHVybjsKLQl9Ci0JU0RMX3N0cmxjcHkobW91c2VfcGFyYW1fYnVmLCBhY2NlbF9wYXJhbSwgbGVuKTsKLQltb3VzZV9wYXJhbSA9IG1vdXNlX3BhcmFtX2J1ZjsKLQotCWZvciAoIGk9MDsgKGkgPCAzKSAmJiBtb3VzZV9wYXJhbTsgKytpICkgewotCQlwaW4gPSBTRExfc3RyY2hyKG1vdXNlX3BhcmFtLCAnLycpOwotCQlpZiAoIHBpbiApIHsKLQkJCSpwaW4gPSAnXDAnOwotCQl9Ci0JCWFjY2VsX3ZhbHVlW2ldID0gYXRvaShtb3VzZV9wYXJhbSk7Ci0JCWlmICggcGluICkgewotCQkJbW91c2VfcGFyYW0gPSBwaW4rMTsKLQkJfSBlbHNlIHsKLQkJCW1vdXNlX3BhcmFtID0gTlVMTDsKLQkJfQotCX0KLQlpZiAoIGkgPT0gMyApIHsKLQkJWENoYW5nZVBvaW50ZXJDb250cm9sKFNETF9EaXNwbGF5LCBUcnVlLCBUcnVlLAotCQkJYWNjZWxfdmFsdWVbMF0sIGFjY2VsX3ZhbHVlWzFdLCBhY2NlbF92YWx1ZVsyXSk7Ci0JfQotCVNETF9zdGFja19mcmVlKG1vdXNlX3BhcmFtX2J1Zik7Ci19Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGVudGVyIG9yIGxlYXZlIG1vdXNlIHJlbGF0aXZlIG1vZGUgKi8KLXZvaWQgWDExX0NoZWNrTW91c2VNb2RlTm9Mb2NrKF9USElTKQotewotCWNvbnN0IFVpbnQ4IGZ1bGxfZm9jdXMgPSAoU0RMX0FQUEFDVElWRXxTRExfQVBQSU5QVVRGT0NVU3xTRExfQVBQTU9VU0VGT0NVUyk7Ci0JY2hhciAqZW52X292ZXJyaWRlOwotCWludCBlbmFibGVfcmVsYXRpdmUgPSAxOwotCi0JLyogQWxsb3cgdGhlIHVzZXIgdG8gb3ZlcnJpZGUgdGhlIHJlbGF0aXZlIG1vdXNlIG1vZGUuCi0JICAgVGhleSBhbG1vc3QgbmV2ZXIgd2FudCB0byBkbyB0aGlzLCBhcyBpdCBzZXJpb3VzbHkgYWZmZWN0cwotCSAgIGFwcGxpY2F0aW9ucyB0aGF0IHJlbHkgb24gY29udGludW91cyByZWxhdGl2ZSBtb3VzZSBtb3Rpb24uCi0JKi8KLQllbnZfb3ZlcnJpZGUgPSBTRExfZ2V0ZW52KCJTRExfTU9VU0VfUkVMQVRJVkUiKTsKLQlpZiAoIGVudl9vdmVycmlkZSApIHsKLQkJZW5hYmxlX3JlbGF0aXZlID0gYXRvaShlbnZfb3ZlcnJpZGUpOwotCX0KLQotCS8qIElmIHRoZSBtb3VzZSBpcyBoaWRkZW4gYW5kIGlucHV0IGlzIGdyYWJiZWQsIHdlIHVzZSByZWxhdGl2ZSBtb2RlICovCi0JaWYgKCBlbmFibGVfcmVsYXRpdmUgJiYKLQkgICAgICEoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICYmCi0JICAgICAodGhpcy0+aW5wdXRfZ3JhYiAhPSBTRExfR1JBQl9PRkYpICYmCi0gICAgICAgICAgICAgKFNETF9HZXRBcHBTdGF0ZSgpICYgZnVsbF9mb2N1cykgPT0gZnVsbF9mb2N1cyApIHsKLQkJaWYgKCAhIG1vdXNlX3JlbGF0aXZlICkgewotCQkJWDExX0VuYWJsZURHQU1vdXNlKHRoaXMpOwotCQkJaWYgKCAhICh1c2luZ19kZ2EgJiBER0FfTU9VU0UpICkgewotCQkJCWNoYXIgKnhtb3VzZV9hY2NlbDsKLQotCQkJCVNETF9HZXRNb3VzZVN0YXRlKCZtb3VzZV9sYXN0LngsICZtb3VzZV9sYXN0LnkpOwotCQkJCS8qIFVzZSBhcyByYXcgbW91c2UgbWlja2V5cyBhcyBwb3NzaWJsZSAqLwotCQkJCVhHZXRQb2ludGVyQ29udHJvbChTRExfRGlzcGxheSwKLQkJCQkJCSZtb3VzZV9hY2NlbC5udW1lcmF0b3IsIAotCQkJCQkJJm1vdXNlX2FjY2VsLmRlbm9taW5hdG9yLAotCQkJCQkJJm1vdXNlX2FjY2VsLnRocmVzaG9sZCk7Ci0JCQkJeG1vdXNlX2FjY2VsPVNETF9nZXRlbnYoIlNETF9WSURFT19YMTFfTU9VU0VBQ0NFTCIpOwotCQkJCWlmICggeG1vdXNlX2FjY2VsICkgewotCQkJCQlTZXRNb3VzZUFjY2VsKHRoaXMsIHhtb3VzZV9hY2NlbCk7Ci0JCQkJfQotCQkJfQotCQkJbW91c2VfcmVsYXRpdmUgPSAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCBtb3VzZV9yZWxhdGl2ZSApIHsKLQkJCWlmICggdXNpbmdfZGdhICYgREdBX01PVVNFICkgewotCQkJCVgxMV9EaXNhYmxlREdBTW91c2UodGhpcyk7Ci0JCQl9IGVsc2UgewotCQkJCVhDaGFuZ2VQb2ludGVyQ29udHJvbChTRExfRGlzcGxheSwgVHJ1ZSwgVHJ1ZSwKLQkJCQkJCW1vdXNlX2FjY2VsLm51bWVyYXRvciwgCi0JCQkJCQltb3VzZV9hY2NlbC5kZW5vbWluYXRvciwKLQkJCQkJCW1vdXNlX2FjY2VsLnRocmVzaG9sZCk7Ci0JCQl9Ci0JCQltb3VzZV9yZWxhdGl2ZSA9IDA7Ci0JCX0KLQl9Ci19Ci12b2lkIFgxMV9DaGVja01vdXNlTW9kZShfVEhJUykKLXsKLQlTRExfTG9ja19FdmVudFRocmVhZCgpOwotCVgxMV9DaGVja01vdXNlTW9kZU5vTG9jayh0aGlzKTsKLQlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMW1vdXNlX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5MTRkYS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW91c2VfYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfeDExdmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBYMTFfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiBXTWN1cnNvciAqWDExX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAotCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOwotZXh0ZXJuIGludCBYMTFfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKLWV4dGVybiB2b2lkIFgxMV9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Ci1leHRlcm4gdm9pZCBYMTFfQ2hlY2tNb3VzZU1vZGVOb0xvY2soX1RISVMpOwotZXh0ZXJuIHZvaWQgWDExX0NoZWNrTW91c2VNb2RlKF9USElTKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFzeW0uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTFzeW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwOTgyYy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExc3ltLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLQotU0RMX1gxMV9NT0RVTEUoQkFTRVhMSUIpCi1TRExfWDExX1NZTShYQ2xhc3NIaW50KixYQWxsb2NDbGFzc0hpbnQsKHZvaWQpLCgpLHJldHVybikKLVNETF9YMTFfU1lNKFN0YXR1cyxYQWxsb2NDb2xvciwoRGlzcGxheSogYSxDb2xvcm1hcCBiLFhDb2xvciogYyksKGEsYixjKSxyZXR1cm4pCi1TRExfWDExX1NZTShYU2l6ZUhpbnRzKixYQWxsb2NTaXplSGludHMsKHZvaWQpLCgpLHJldHVybikKLVNETF9YMTFfU1lNKFhXTUhpbnRzKixYQWxsb2NXTUhpbnRzLCh2b2lkKSwoKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWENoYW5nZVBvaW50ZXJDb250cm9sLChEaXNwbGF5KiBhLEJvb2wgYixCb29sIGMsaW50IGQsaW50IGUsaW50IGYpLChhLGIsYyxkLGUsZikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhDaGFuZ2VQcm9wZXJ0eSwoRGlzcGxheSogYSxXaW5kb3cgYixBdG9tIGMsQXRvbSBkLGludCBlLGludCBmLF9YY29uc3QgdW5zaWduZWQgY2hhciogZyxpbnQgaCksKGEsYixjLGQsZSxmLGcsaCkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzLChEaXNwbGF5KiBhLFdpbmRvdyBiLHVuc2lnbmVkIGxvbmcgYyxYU2V0V2luZG93QXR0cmlidXRlcyogZCksKGEsYixjLGQpLHJldHVybikKLVNETF9YMTFfU1lNKEJvb2wsWENoZWNrVHlwZWRFdmVudCwoRGlzcGxheSogYSxpbnQgYixYRXZlbnQqIGMpLChhLGIsYykscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhDbGVhcldpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhDbG9zZURpc3BsYXksKERpc3BsYXkqIGEpLChhKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWENvbmZpZ3VyZVdpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYix1bnNpZ25lZCBpbnQgYyxYV2luZG93Q2hhbmdlcyogZCksKGEsYixjLGQpLHJldHVybikKLVNETF9YMTFfU1lNKENvbG9ybWFwLFhDcmVhdGVDb2xvcm1hcCwoRGlzcGxheSogYSxXaW5kb3cgYixWaXN1YWwqIGMsaW50IGQpLChhLGIsYyxkKSxyZXR1cm4pCi1TRExfWDExX1NZTShDdXJzb3IsWENyZWF0ZVBpeG1hcEN1cnNvciwoRGlzcGxheSogYSxQaXhtYXAgYixQaXhtYXAgYyxYQ29sb3IqIGQsWENvbG9yKiBlLHVuc2lnbmVkIGludCBmLHVuc2lnbmVkIGludCBnKSwoYSxiLGMsZCxlLGYsZykscmV0dXJuKQotU0RMX1gxMV9TWU0oR0MsWENyZWF0ZUdDLChEaXNwbGF5KiBhLERyYXdhYmxlIGIsdW5zaWduZWQgbG9uZyBjLFhHQ1ZhbHVlcyogZCksKGEsYixjLGQpLHJldHVybikKLVNETF9YMTFfU1lNKFhJbWFnZSosWENyZWF0ZUltYWdlLChEaXNwbGF5KiBhLFZpc3VhbCogYix1bnNpZ25lZCBpbnQgYyxpbnQgZCxpbnQgZSxjaGFyKiBmLHVuc2lnbmVkIGludCBnLHVuc2lnbmVkIGludCBoLGludCBpLGludCBqKSwoYSxiLGMsZCxlLGYsZyxoLGksaikscmV0dXJuKQotU0RMX1gxMV9TWU0oUGl4bWFwLFhDcmVhdGVQaXhtYXAsKERpc3BsYXkqIGEsRHJhd2FibGUgYix1bnNpZ25lZCBpbnQgYyx1bnNpZ25lZCBpbnQgZCx1bnNpZ25lZCBpbnQgZSksKGEsYixjLGQsZSkscmV0dXJuKQotU0RMX1gxMV9TWU0oUGl4bWFwLFhDcmVhdGVQaXhtYXBGcm9tQml0bWFwRGF0YSwoRGlzcGxheSogYSxEcmF3YWJsZSBiLGNoYXIqIGMsdW5zaWduZWQgaW50IGQsdW5zaWduZWQgaW50IGUsdW5zaWduZWQgbG9uZyBmLHVuc2lnbmVkIGxvbmcgZyx1bnNpZ25lZCBpbnQgaCksKGEsYixjLGQsZSxmLGcsaCkscmV0dXJuKQotU0RMX1gxMV9TWU0oV2luZG93LFhDcmVhdGVTaW1wbGVXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIsaW50IGMsaW50IGQsdW5zaWduZWQgaW50IGUsdW5zaWduZWQgaW50IGYsdW5zaWduZWQgaW50IGcsdW5zaWduZWQgbG9uZyBoLHVuc2lnbmVkIGxvbmcgaSksKGEsYixjLGQsZSxmLGcsaCxpKSxyZXR1cm4pCi1TRExfWDExX1NZTShXaW5kb3csWENyZWF0ZVdpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYixpbnQgYyxpbnQgZCx1bnNpZ25lZCBpbnQgZSx1bnNpZ25lZCBpbnQgZix1bnNpZ25lZCBpbnQgZyxpbnQgaCx1bnNpZ25lZCBpbnQgaSxWaXN1YWwqIGosdW5zaWduZWQgbG9uZyBrLFhTZXRXaW5kb3dBdHRyaWJ1dGVzKiBsKSwoYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYRGVmYXVsdFNjcmVlbiwoRGlzcGxheSogYSksKGEpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYRGlzcGxheVdpZHRoLChEaXNwbGF5KiBhLGludCBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWERpc3BsYXlXaWR0aE1NLChEaXNwbGF5KiBhLCBpbnQgYiksKGEsIGIpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYRGlzcGxheUhlaWdodCwoRGlzcGxheSogYSxpbnQgYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhEaXNwbGF5SGVpZ2h0TU0sKERpc3BsYXkqIGEsIGludCBiKSwoYSwgYikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhEZWZpbmVDdXJzb3IsKERpc3BsYXkqIGEsV2luZG93IGIsQ3Vyc29yIGMpLChhLGIsYykscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhEZWxldGVQcm9wZXJ0eSwoRGlzcGxheSogYSxXaW5kb3cgYixBdG9tIGMpLChhLGIsYykscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhEZXN0cm95V2luZG93LChEaXNwbGF5KiBhLFdpbmRvdyBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShjaGFyKixYRGlzcGxheU5hbWUsKF9YY29uc3QgY2hhciogYSksKGEpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYRXZlbnRzUXVldWVkLChEaXNwbGF5KiBhLGludCBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShCb29sLFhGaWx0ZXJFdmVudCwoWEV2ZW50ICpldmVudCwgV2luZG93IHcpLChldmVudCx3KSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWEZsdXNoLChEaXNwbGF5KiBhKSwoYSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhGcmVlLCh2b2lkKmEpLChhKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWEZyZWVDb2xvcm1hcCwoRGlzcGxheSogYSxDb2xvcm1hcCBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWEZyZWVDb2xvcnMsKERpc3BsYXkqIGEsQ29sb3JtYXAgYix1bnNpZ25lZCBsb25nKiBjLGludCBkLHVuc2lnbmVkIGxvbmcgZSksKGEsYixjLGQsZSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhGcmVlQ3Vyc29yLChEaXNwbGF5KiBhLEN1cnNvciBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWEZyZWVHQywoRGlzcGxheSogYSxHQyBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWEZyZWVNb2RpZmllcm1hcCwoWE1vZGlmaWVyS2V5bWFwKiBhKSwoYSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhGcmVlUGl4bWFwLChEaXNwbGF5KiBhLFBpeG1hcCBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWEdldEVycm9yRGF0YWJhc2VUZXh0LChEaXNwbGF5KiBhLF9YY29uc3QgY2hhciogYixfWGNvbnN0IGNoYXIqIGMsX1hjb25zdCBjaGFyKiBkLGNoYXIqIGUsaW50IGYpLChhLGIsYyxkLGUsZikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhHZXRHZW9tZXRyeSwoRGlzcGxheSogYSxEcmF3YWJsZSBiLFdpbmRvdyogYyxpbnQqIGQsaW50KiBlLHVuc2lnbmVkIGludCogZix1bnNpZ25lZCBpbnQqIGcsdW5zaWduZWQgaW50KiBoLHVuc2lnbmVkIGludCogaSksKGEsYixjLGQsZSxmLGcsaCxpKSxyZXR1cm4pCi1TRExfWDExX1NZTShYTW9kaWZpZXJLZXltYXAqLFhHZXRNb2RpZmllck1hcHBpbmcsKERpc3BsYXkqIGEpLChhKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWEdldFBvaW50ZXJDb250cm9sLChEaXNwbGF5KiBhLGludCogYixpbnQqIGMsaW50KiBkKSwoYSxiLGMsZCkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhHZXRTY3JlZW5TYXZlciwoRGlzcGxheSogYSxpbnQqIGIsaW50KiBjLGludCogZCwgaW50KiBlKSwoYSxiLGMsZCxlKSxyZXR1cm4pCi1TRExfWDExX1NZTShYVmlzdWFsSW5mbyosWEdldFZpc3VhbEluZm8sKERpc3BsYXkqIGEsbG9uZyBiLFhWaXN1YWxJbmZvKiBjLGludCogZCksKGEsYixjLGQpLHJldHVybikKLVNETF9YMTFfU1lNKFhXTUhpbnRzKixYR2V0V01IaW50cywoRGlzcGxheSogYSxXaW5kb3cgYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oU3RhdHVzLFhHZXRXaW5kb3dBdHRyaWJ1dGVzLChEaXNwbGF5KiBhLFdpbmRvdyBiLFhXaW5kb3dBdHRyaWJ1dGVzKiBjKSwoYSxiLGMpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYR3JhYktleWJvYXJkLChEaXNwbGF5KiBhLFdpbmRvdyBiLEJvb2wgYyxpbnQgZCxpbnQgZSxUaW1lIGYpLChhLGIsYyxkLGUsZikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhHcmFiUG9pbnRlciwoRGlzcGxheSogYSxXaW5kb3cgYixCb29sIGMsdW5zaWduZWQgaW50IGQsaW50IGUsaW50IGYsV2luZG93IGcsQ3Vyc29yIGgsVGltZSBpKSwoYSxiLGMsZCxlLGYsZyxoLGkpLHJldHVybikKLVNETF9YMTFfU1lNKFN0YXR1cyxYSWNvbmlmeVdpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYixpbnQgYyksKGEsYixjKSxyZXR1cm4pCi1TRExfWDExX1NZTShTdGF0dXMsWEluaXRUaHJlYWRzLCh2b2lkKSwoKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWEluc3RhbGxDb2xvcm1hcCwoRGlzcGxheSogYSxDb2xvcm1hcCBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShLZXlDb2RlLFhLZXlzeW1Ub0tleWNvZGUsKERpc3BsYXkqIGEsS2V5U3ltIGIpLChhLGIpLHJldHVybikKLVNETF9YMTFfU1lNKEF0b20sWEludGVybkF0b20sKERpc3BsYXkqIGEsX1hjb25zdCBjaGFyKiBiLEJvb2wgYyksKGEsYixjKSxyZXR1cm4pCi1TRExfWDExX1NZTShYUGl4bWFwRm9ybWF0VmFsdWVzKixYTGlzdFBpeG1hcEZvcm1hdHMsKERpc3BsYXkqIGEsaW50KiBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWExvb2t1cFN0cmluZywoWEtleUV2ZW50KiBhLGNoYXIqIGIsaW50IGMsS2V5U3ltKiBkLFhDb21wb3NlU3RhdHVzKiBlKSwoYSxiLGMsZCxlKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWE1hcFJhaXNlZCwoRGlzcGxheSogYSxXaW5kb3cgYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhNYXBXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIpLChhLGIpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYTWFza0V2ZW50LChEaXNwbGF5KiBhLGxvbmcgYixYRXZlbnQqIGMpLChhLGIsYykscmV0dXJuKQotU0RMX1gxMV9TWU0oU3RhdHVzLFhNYXRjaFZpc3VhbEluZm8sKERpc3BsYXkqIGEsaW50IGIsaW50IGMsaW50IGQsWFZpc3VhbEluZm8qIGUpLChhLGIsYyxkLGUpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYTWlzc2luZ0V4dGVuc2lvbiwoRGlzcGxheSogYSxfWGNvbnN0IGNoYXIqIGIpLChhLGIpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYTW92ZVJlc2l6ZVdpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYixpbnQgYyxpbnQgZCx1bnNpZ25lZCBpbnQgZSx1bnNpZ25lZCBpbnQgZiksKGEsYixjLGQsZSxmKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWE1vdmVXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIsaW50IGMsaW50IGQpLChhLGIsYyxkKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWE5leHRFdmVudCwoRGlzcGxheSogYSxYRXZlbnQqIGIpLChhLGIpLHJldHVybikKLVNETF9YMTFfU1lNKERpc3BsYXkqLFhPcGVuRGlzcGxheSwoX1hjb25zdCBjaGFyKiBhKSwoYSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhQZWVrRXZlbnQsKERpc3BsYXkqIGEsWEV2ZW50KiBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWFBlbmRpbmcsKERpc3BsYXkqIGEpLChhKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWFB1dEltYWdlLChEaXNwbGF5KiBhLERyYXdhYmxlIGIsR0MgYyxYSW1hZ2UqIGQsaW50IGUsaW50IGYsaW50IGcsaW50IGgsdW5zaWduZWQgaW50IGksdW5zaWduZWQgaW50IGopLChhLGIsYyxkLGUsZixnLGgsaSxqKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWFF1ZXJ5Q29sb3JzLChEaXNwbGF5KiBhLENvbG9ybWFwIGIsWENvbG9yKiBjLGludCBkKSwoYSxiLGMsZCkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhRdWVyeUtleW1hcCwoRGlzcGxheSogYSxjaGFyICpiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShCb29sLFhRdWVyeVBvaW50ZXIsKERpc3BsYXkqIGEsV2luZG93IGIsV2luZG93KiBjLFdpbmRvdyogZCxpbnQqIGUsaW50KiBmLGludCogZyxpbnQqIGgsdW5zaWduZWQgaW50KiBpKSwoYSxiLGMsZCxlLGYsZyxoLGkpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYUXVlcnlUcmVlLChEaXNwbGF5KiBhLFdpbmRvdyBiLFdpbmRvdyogYyxXaW5kb3cqIGQsV2luZG93KiogZSx1bnNpZ25lZCBpbnQqIGYpLChhLGIsYyxkLGUsZikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhSYWlzZVdpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhSZXBhcmVudFdpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYixXaW5kb3cgYyxpbnQgZCxpbnQgZSksKGEsYixjLGQsZSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhSZXNpemVXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIsdW5zaWduZWQgaW50IGMsdW5zaWduZWQgaW50IGQpLChhLGIsYyxkKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWFNlbGVjdElucHV0LChEaXNwbGF5KiBhLFdpbmRvdyBiLGxvbmcgYyksKGEsYixjKSxyZXR1cm4pCi1TRExfWDExX1NZTShTdGF0dXMsWFNlbmRFdmVudCwoRGlzcGxheSogYSxXaW5kb3cgYixCb29sIGMsbG9uZyBkLFhFdmVudCogZSksKGEsYixjLGQsZSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhTZXRDbGFzc0hpbnQsKERpc3BsYXkqIGEsV2luZG93IGIsWENsYXNzSGludCogYyksKGEsYixjKSxyZXR1cm4pCi1TRExfWDExX1NZTShYRXJyb3JIYW5kbGVyLFhTZXRFcnJvckhhbmRsZXIsKFhFcnJvckhhbmRsZXIgYSksKGEpLHJldHVybikKLVNETF9YMTFfU1lNKFhJT0Vycm9ySGFuZGxlcixYU2V0SU9FcnJvckhhbmRsZXIsKFhJT0Vycm9ySGFuZGxlciBhKSwoYSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhTZXRTY3JlZW5TYXZlciwoRGlzcGxheSogYSxpbnQgYixpbnQgYyxpbnQgZCxpbnQgZSksKGEsYixjLGQsZSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhTZXRUcmFuc2llbnRGb3JIaW50LChEaXNwbGF5KiBhLFdpbmRvdyBiLFdpbmRvdyBjKSwoYSxiLGMpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYU2V0V01IaW50cywoRGlzcGxheSogYSxXaW5kb3cgYixYV01IaW50cyogYyksKGEsYixjKSxyZXR1cm4pCi1TRExfWDExX1NZTSh2b2lkLFhTZXRUZXh0UHJvcGVydHksKERpc3BsYXkqIGEsV2luZG93IGIsWFRleHRQcm9wZXJ0eSogYyxBdG9tIGQpLChhLGIsYyxkKSwpCi1TRExfWDExX1NZTSh2b2lkLFhTZXRXTU5vcm1hbEhpbnRzLChEaXNwbGF5KiBhLFdpbmRvdyBiLFhTaXplSGludHMqIGMpLChhLGIsYyksKQotU0RMX1gxMV9TWU0oU3RhdHVzLFhTZXRXTVByb3RvY29scywoRGlzcGxheSogYSxXaW5kb3cgYixBdG9tKiBjLGludCBkKSwoYSxiLGMsZCkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhTZXRXaW5kb3dCYWNrZ3JvdW5kLChEaXNwbGF5KiBhLFdpbmRvdyBiLHVuc2lnbmVkIGxvbmcgYyksKGEsYixjKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWFNldFdpbmRvd0JhY2tncm91bmRQaXhtYXAsKERpc3BsYXkqIGEsV2luZG93IGIsUGl4bWFwIGMpLChhLGIsYykscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhTZXRXaW5kb3dDb2xvcm1hcCwoRGlzcGxheSogYSxXaW5kb3cgYixDb2xvcm1hcCBjKSwoYSxiLGMpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYU3RvcmVDb2xvcnMsKERpc3BsYXkqIGEsQ29sb3JtYXAgYixYQ29sb3IqIGMsaW50IGQpLChhLGIsYyxkKSxyZXR1cm4pCi1TRExfWDExX1NZTShTdGF0dXMsWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSwoY2hhcioqIGEsaW50IGIsWFRleHRQcm9wZXJ0eSogYyksKGEsYixjKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWFN5bmMsKERpc3BsYXkqIGEsQm9vbCBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWFVuZ3JhYktleWJvYXJkLChEaXNwbGF5KiBhLFRpbWUgYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhVbmdyYWJQb2ludGVyLChEaXNwbGF5KiBhLFRpbWUgYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhVbm1hcFdpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhXYXJwUG9pbnRlciwoRGlzcGxheSogYSxXaW5kb3cgYixXaW5kb3cgYyxpbnQgZCxpbnQgZSx1bnNpZ25lZCBpbnQgZix1bnNpZ25lZCBpbnQgZyxpbnQgaCwgaW50IGkpLChhLGIsYyxkLGUsZixnLGgsaSkscmV0dXJuKQotU0RMX1gxMV9TWU0oVmlzdWFsSUQsWFZpc3VhbElERnJvbVZpc3VhbCwoVmlzdWFsKiBhKSwoYSkscmV0dXJuKQotU0RMX1gxMV9TWU0oWEV4dERpc3BsYXlJbmZvKixYZXh0QWRkRGlzcGxheSwoWEV4dGVuc2lvbkluZm8qIGEsRGlzcGxheSogYixjaGFyKiBjLFhFeHRlbnNpb25Ib29rcyogZCxpbnQgZSxYUG9pbnRlciBmKSwoYSxiLGMsZCxlLGYpLHJldHVybikKLVNETF9YMTFfU1lNKFhFeHRlbnNpb25JbmZvKixYZXh0Q3JlYXRlRXh0ZW5zaW9uLCh2b2lkKSwoKSxyZXR1cm4pCi1TRExfWDExX1NZTSh2b2lkLFhleHREZXN0cm95RXh0ZW5zaW9uLChYRXh0ZW5zaW9uSW5mbyogYSksKGEpLCkKLVNETF9YMTFfU1lNKFhFeHREaXNwbGF5SW5mbyosWGV4dEZpbmREaXNwbGF5LChYRXh0ZW5zaW9uSW5mbyogYSxEaXNwbGF5KiBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWGV4dFJlbW92ZURpc3BsYXksKFhFeHRlbnNpb25JbmZvKiBhLERpc3BsYXkqIGIpLChhLGIpLHJldHVybikKLVNETF9YMTFfU1lNKEJvb2wsWFF1ZXJ5RXh0ZW5zaW9uLChEaXNwbGF5KiBhLF9YY29uc3QgY2hhciogYixpbnQqIGMsaW50KiBkLGludCogZSksKGEsYixjLGQsZSkscmV0dXJuKQotU0RMX1gxMV9TWU0oY2hhciAqLFhEaXNwbGF5U3RyaW5nLChEaXNwbGF5KiBhKSwoYSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhHZXRFcnJvclRleHQsKERpc3BsYXkqIGEsaW50IGIsY2hhciogYyxpbnQgZCksKGEsYixjLGQpLHJldHVybikKLVNETF9YMTFfU1lNKHZvaWQsX1hFYXREYXRhLChEaXNwbGF5KiBhLHVuc2lnbmVkIGxvbmcgYiksKGEsYiksKQotU0RMX1gxMV9TWU0odm9pZCxfWEZsdXNoLChEaXNwbGF5KiBhKSwoYSksKQotU0RMX1gxMV9TWU0odm9pZCxfWEZsdXNoR0NDYWNoZSwoRGlzcGxheSogYSxHQyBiKSwoYSxiKSwpCi1TRExfWDExX1NZTShpbnQsX1hSZWFkLChEaXNwbGF5KiBhLGNoYXIqIGIsbG9uZyBjKSwoYSxiLGMpLHJldHVybikKLVNETF9YMTFfU1lNKHZvaWQsX1hSZWFkUGFkLChEaXNwbGF5KiBhLGNoYXIqIGIsbG9uZyBjKSwoYSxiLGMpLCkKLVNETF9YMTFfU1lNKHZvaWQsX1hTZW5kLChEaXNwbGF5KiBhLF9YY29uc3QgY2hhciogYixsb25nIGMpLChhLGIsYyksKQotU0RMX1gxMV9TWU0oU3RhdHVzLF9YUmVwbHksKERpc3BsYXkqIGEseFJlcGx5KiBiLGludCBjLEJvb2wgZCksKGEsYixjLGQpLHJldHVybikKLVNETF9YMTFfU1lNKHVuc2lnbmVkIGxvbmcsX1hTZXRMYXN0UmVxdWVzdFJlYWQsKERpc3BsYXkqIGEseEdlbmVyaWNSZXBseSogYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oU0RMX1gxMV9YU3luY2hyb25pemVSZXRUeXBlLFhTeW5jaHJvbml6ZSwoRGlzcGxheSogYSxCb29sIGIpLChhLGIpLHJldHVybikKLVNETF9YMTFfU1lNKGludCxYVHJhbnNsYXRlQ29vcmRpbmF0ZXMsKERpc3BsYXkqIGEsV2luZG93IGIsV2luZG93IGMsaW50IGQsaW50IGUsaW50KiBmLGludCogZyxXaW5kb3cqIGgpLChhLGIsYyxkLGUsZixnLGgpLHJldHVybikKLVNETF9YMTFfU1lNKFNETF9YMTFfWEVTZXRXaXJlVG9FdmVudFJldFR5cGUsWEVTZXRXaXJlVG9FdmVudCwoRGlzcGxheSogYSxpbnQgYixTRExfWDExX1hFU2V0V2lyZVRvRXZlbnRSZXRUeXBlIGMpLChhLGIsYykscmV0dXJuKQotU0RMX1gxMV9TWU0oU0RMX1gxMV9YRVNldEV2ZW50VG9XaXJlUmV0VHlwZSxYRVNldEV2ZW50VG9XaXJlLChEaXNwbGF5KiBhLGludCBiLFNETF9YMTFfWEVTZXRFdmVudFRvV2lyZVJldFR5cGUgYyksKGEsYixjKSxyZXR1cm4pCi1TRExfWDExX1NZTShYRXh0ZW5zaW9uRXJyb3JIYW5kbGVyLFhTZXRFeHRlbnNpb25FcnJvckhhbmRsZXIsKFhFeHRlbnNpb25FcnJvckhhbmRsZXIgYSksKGEpLHJldHVybikKLQotI2lmIE5lZWRXaWRlUHJvdG90eXBlcwotU0RMX1gxMV9TWU0oS2V5U3ltLFhLZXljb2RlVG9LZXlzeW0sKERpc3BsYXkqIGEsdW5zaWduZWQgaW50IGIsaW50IGMpLChhLGIsYykscmV0dXJuKQotI2Vsc2UKLVNETF9YMTFfU1lNKEtleVN5bSxYS2V5Y29kZVRvS2V5c3ltLChEaXNwbGF5KiBhLEtleUNvZGUgYixpbnQgYyksKGEsYixjKSxyZXR1cm4pCi0jZW5kaWYKLQotI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORwotU0RMX1gxMV9NT0RVTEUoVVRGOCkKLVNETF9YMTFfU1lNKGludCxYdXRmOFRleHRMaXN0VG9UZXh0UHJvcGVydHksKERpc3BsYXkqIGEsY2hhcioqIGIsaW50IGMsWElDQ0VuY29kaW5nU3R5bGUgZCxYVGV4dFByb3BlcnR5KiBlKSwoYSxiLGMsZCxlKSxyZXR1cm4pCi1TRExfWDExX1NZTShpbnQsWHV0ZjhMb29rdXBTdHJpbmcsKFhJQyBhLFhLZXlQcmVzc2VkRXZlbnQqIGIsY2hhciogYyxpbnQgZCxLZXlTeW0qIGUsU3RhdHVzKiBmKSwoYSxiLGMsZCxlLGYpLHJldHVybikKLS8qU0RMX1gxMV9TWU0oWElDLFhDcmVhdGVJQywoWElNLCAuLi4pLHJldHVybikgICEhISBBUkdIISAqLwotU0RMX1gxMV9TWU0odm9pZCxYRGVzdHJveUlDLChYSUMgYSksKGEpLCkKLVNETF9YMTFfU1lNKHZvaWQsWFNldElDRm9jdXMsKFhJQyBhKSwoYSksKQotU0RMX1gxMV9TWU0odm9pZCxYVW5zZXRJQ0ZvY3VzLChYSUMgYSksKGEpLCkKLS8qU0RMX1gxMV9TWU0oY2hhciosWEdldElDVmFsdWVzLChYSUMgYSwgLi4uKSxyZXR1cm4pKi8KLVNETF9YMTFfU1lNKFhJTSxYT3BlbklNLChEaXNwbGF5KiBhLHN0cnVjdCBfWHJtSGFzaEJ1Y2tldFJlYyogYixjaGFyKiBjLGNoYXIqIGQpLChhLGIsYyxkKSxyZXR1cm4pCi1TRExfWDExX1NZTShTdGF0dXMsWENsb3NlSU0sKFhJTSBhKSwoYSkscmV0dXJuKQotU0RMX1gxMV9TWU0oY2hhciosWFNldExvY2FsZU1vZGlmaWVycywoX1hjb25zdCBjaGFyKiBhKSwoYSkscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nLChYTWFwcGluZ0V2ZW50KiBhKSwoYSkscmV0dXJuKQotU0RMX1gxMV9TWU0oRGlzcGxheSosWERpc3BsYXlPZklNLChYSU0gYSksKGEpLHJldHVybikKLSNlbmRpZgotCi0jaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKLVNETF9YMTFfTU9EVUxFKFNITSkKLVNETF9YMTFfU1lNKFN0YXR1cyxYU2htQXR0YWNoLChEaXNwbGF5KiBhLFhTaG1TZWdtZW50SW5mbyogYiksKGEsYikscmV0dXJuKQotU0RMX1gxMV9TWU0oU3RhdHVzLFhTaG1EZXRhY2gsKERpc3BsYXkqIGEsWFNobVNlZ21lbnRJbmZvKiBiKSwoYSxiKSxyZXR1cm4pCi1TRExfWDExX1NZTShTdGF0dXMsWFNobVB1dEltYWdlLChEaXNwbGF5KiBhLERyYXdhYmxlIGIsR0MgYyxYSW1hZ2UqIGQsaW50IGUsaW50IGYsaW50IGcsaW50IGgsdW5zaWduZWQgaW50IGksdW5zaWduZWQgaW50IGosQm9vbCBrKSwoYSxiLGMsZCxlLGYsZyxoLGksaixrKSxyZXR1cm4pCi1TRExfWDExX1NZTShYSW1hZ2UqLFhTaG1DcmVhdGVJbWFnZSwoRGlzcGxheSogYSxWaXN1YWwqIGIsdW5zaWduZWQgaW50IGMsaW50IGQsY2hhciogZSxYU2htU2VnbWVudEluZm8qIGYsdW5zaWduZWQgaW50IGcsdW5zaWduZWQgaW50IGgpLChhLGIsYyxkLGUsZixnLGgpLHJldHVybikKLVNETF9YMTFfU1lNKEJvb2wsWFNobVF1ZXJ5RXh0ZW5zaW9uLChEaXNwbGF5KiBhKSwoYSkscmV0dXJuKQotI2VuZGlmCi0KLS8qCi0gKiBOb3QgcmVxdWlyZWQuLi50aGVzZSBvbmx5IGV4aXN0IGluIGNvZGUgaW4gaGVhZGVycyBvbiBzb21lIDY0LWJpdCBwbGF0Zm9ybXMsCi0gKiAgYW5kIGFyZSByZW1vdmVkIHZpYSBtYWNyb3MgZWxzZXdoZXJlLCBzbyBpdCdzIHNhZmUgZm9yIHRoZW0gdG8gYmUgbWlzc2luZy4KLSAqLwotI2lmZGVmIExPTkc2NAotU0RMX1gxMV9NT0RVTEUoSU9fMzJCSVQpCi1TRExfWDExX1NZTShpbnQsX1hEYXRhMzIsKERpc3BsYXkgKmRweSxyZWdpc3RlciBsb25nICpkYXRhLHVuc2lnbmVkIGxlbiksKGRweSxkYXRhLGxlbikscmV0dXJuKQotU0RMX1gxMV9TWU0odm9pZCxfWFJlYWQzMiwoRGlzcGxheSAqZHB5LHJlZ2lzdGVyIGxvbmcgKmRhdGEsbG9uZyBsZW4pLChkcHksZGF0YSxsZW4pLCkKLSNlbmRpZgotCi0vKgotICogbGliWDExIDEuNC45OS4xIGFkZGVkIF9YR2V0UmVxdWVzdCwgYW5kIG1hY3JvcyB1c2UgaXQgYmVoaW5kIHRoZSBzY2VuZXMuCi0gKi8KLVNETF9YMTFfTU9EVUxFKFhHRVRSRVFVRVNUKQotU0RMX1gxMV9TWU0odm9pZCAqLF9YR2V0UmVxdWVzdCwoRGlzcGxheSogYSxDQVJEOCBiLHNpemVfdCBjKSwoYSxiLGMpLHJldHVybikKLQotLyoKLSAqIFRoZXNlIG9ubHkgc2hvdyB1cCBvbiBzb21lIHZhcmlhbnRzIG9mIFVuaXguCi0gKi8KLSNpZiBkZWZpbmVkKF9fb3NmX18pCi1TRExfWDExX01PRFVMRShPU0ZfRU5UUllfUE9JTlRTKQotU0RMX1gxMV9TWU0odm9pZCxfU210QnVmZmVyT3ZlcmZsb3csKERpc3BsYXkgKmRweSxyZWdpc3RlciBzbXREaXNwbGF5UHRyIHApLChkcHkscCksKQotU0RMX1gxMV9TWU0odm9pZCxfU210SXBFcnJvciwoRGlzcGxheSAqZHB5LHJlZ2lzdGVyIHNtdERpc3BsYXlQdHIgcCwgaW50IGkpLChkcHkscCxpKSwpCi1TRExfWDExX1NZTShpbnQsaXBBbGxvY2F0ZURhdGEsKENoYW5uZWxQdHIgYSwgSVBDYXJkIGIsIElQRGF0YVB0ciAqIGMpLChhLGIsYykscmV0dXJuKQotU0RMX1gxMV9TWU0oaW50LGlwVW5hbGxvY2F0ZUFuZFNlbmREYXRhLChDaGFubmVsUHRyIGEsIElQQ2FyZCBiKSwoYSxiKSxyZXR1cm4pCi0jZW5kaWYKLQotLyogWHJhbmRyIHN1cHBvcnQuICovCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFJBTkRSCi1TRExfWDExX01PRFVMRShYUkFORFIpCi1TRExfWDExX1NZTShTdGF0dXMsWFJSUXVlcnlWZXJzaW9uLChEaXNwbGF5ICpkcHksaW50ICptYWpvcl92ZXJzaW9ucCxpbnQgKm1pbm9yX3ZlcnNpb25wKSwoZHB5LG1ham9yX3ZlcnNpb25wLG1pbm9yX3ZlcnNpb25wKSxyZXR1cm4pCi1TRExfWDExX1NZTShYUlJTY3JlZW5Db25maWd1cmF0aW9uICosWFJSR2V0U2NyZWVuSW5mbywoRGlzcGxheSAqZHB5LERyYXdhYmxlIGRyYXcpLChkcHksZHJhdykscmV0dXJuKQotU0RMX1gxMV9TWU0oU2l6ZUlELFhSUkNvbmZpZ0N1cnJlbnRDb25maWd1cmF0aW9uLChYUlJTY3JlZW5Db25maWd1cmF0aW9uICpjb25maWcsUm90YXRpb24gKnJvdGF0aW9uKSwoY29uZmlnLHJvdGF0aW9uKSxyZXR1cm4pCi1TRExfWDExX1NZTShYUlJTY3JlZW5TaXplICosWFJSQ29uZmlnU2l6ZXMsKFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZywgaW50ICpuc2l6ZXMpLChjb25maWcsbnNpemVzKSxyZXR1cm4pCi1TRExfWDExX1NZTShTdGF0dXMsWFJSU2V0U2NyZWVuQ29uZmlnLChEaXNwbGF5ICpkcHksIFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZywgRHJhd2FibGUgZHJhdywgaW50IHNpemVfaW5kZXgsIFJvdGF0aW9uIHJvdGF0aW9uLCBUaW1lIHRpbWVzdGFtcCksKGRweSxjb25maWcsZHJhdyxzaXplX2luZGV4LHJvdGF0aW9uLHRpbWVzdGFtcCkscmV0dXJuKQotU0RMX1gxMV9TWU0odm9pZCxYUlJGcmVlU2NyZWVuQ29uZmlnSW5mbywoWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqY29uZmlnKSwoY29uZmlnKSwpCi0jZW5kaWYKLQotLyogRFBNUyBzdXBwb3J0ICovCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFBNUwotU0RMX1gxMV9NT0RVTEUoRFBNUykKLVNETF9YMTFfU1lNKFN0YXR1cyxEUE1TUXVlcnlFeHRlbnNpb24sKERpc3BsYXkgKmRweSxpbnQgKm1ham9yX3ZlcnNpb25wLGludCAqbWlub3JfdmVyc2lvbnApLChkcHksbWFqb3JfdmVyc2lvbnAsbWlub3JfdmVyc2lvbnApLHJldHVybikKLVNETF9YMTFfU1lNKFN0YXR1cyxEUE1TSW5mbywoRGlzcGxheSAqZHB5LENBUkQxNiAqc3RhdGUsQk9PTCAqb25vZmYpLChkcHksc3RhdGUsb25vZmYpLHJldHVybikKLVNETF9YMTFfU1lNKFN0YXR1cyxEUE1TRW5hYmxlLChEaXNwbGF5ICpkcHkpLChkcHkpLHJldHVybikKLVNETF9YMTFfU1lNKFN0YXR1cyxEUE1TRGlzYWJsZSwoRGlzcGxheSAqZHB5KSwoZHB5KSxyZXR1cm4pCi0jZW5kaWYKLQotLyogZW5kIG9mIFNETF94MTFzeW0uaCAuLi4gKi8KLQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMXZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwOTA2NC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE1NTggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qIFgxMSBiYXNlZCBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uLgotICAgTm90ZTogIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY3VycmVudGx5IG5lZWQgWDExIHRocmVhZCBsb2NraW5nLAotICAgICAgICAgIHNpbmNlIHRoZSBldmVudCB0aHJlYWQgdXNlcyBhIHNlcGFyYXRlIFggY29ubmVjdGlvbiBhbmQgYW55Ci0gICAgICAgICAgYWRkaXRpb25hbCBsb2NraW5nIG5lY2Vzc2FyeSBpcyBoYW5kbGVkIGludGVybmFsbHkuICBIb3dldmVyLAotICAgICAgICAgIGlmIGZ1bGwgbG9ja2luZyBpcyBuZWNjZXNzYXJ5LCB0YWtlIGEgbG9vayBhdCBYSW5pdFRocmVhZHMoKS4KLSovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpZmRlZiBNVFJSX1NVUFBPUlQKLSNpbmNsdWRlIDxhc20vbXRyci5oPgotI2luY2x1ZGUgPHN5cy9mY250bC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJTRExfZW5kaWFuLmgiCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX3RocmVhZC5oIgotI2luY2x1ZGUgIlNETF92aWRlby5oIgotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgotI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKLSNpbmNsdWRlICJTRExfeDExdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfeDExd21fYy5oIgotI2luY2x1ZGUgIlNETF94MTFtb3VzZV9jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMWV2ZW50c19jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMW1vZGVzX2MuaCIKLSNpbmNsdWRlICJTRExfeDExaW1hZ2VfYy5oIgotI2luY2x1ZGUgIlNETF94MTF5dXZfYy5oIgotI2luY2x1ZGUgIlNETF94MTFnbF9jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMWdhbW1hX2MuaCIKLSNpbmNsdWRlICIuLi9ibGFua19jdXJzb3IuaCIKLQotI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORwotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBYMTFfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOwotc3RhdGljIFNETF9TdXJmYWNlICpYMTFfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIGludCBYMTFfVG9nZ2xlRnVsbFNjcmVlbihfVEhJUywgaW50IG9uKTsKLXN0YXRpYyB2b2lkIFgxMV9VcGRhdGVNb3VzZShfVEhJUyk7Ci1zdGF0aWMgaW50IFgxMV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywKLQkJCSBTRExfQ29sb3IgKmNvbG9ycyk7Ci1zdGF0aWMgaW50IFgxMV9TZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCk7Ci1zdGF0aWMgdm9pZCBYMTFfVmlkZW9RdWl0KF9USElTKTsKLQotaW50ICBYMTFfd21YQWRqdXN0OwotaW50ICBYMTFfd21ZQWRqdXN0OwotCi0KLS8qIFgxMSBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IFgxMV9BdmFpbGFibGUodm9pZCkKLXsKLQlEaXNwbGF5ICpkaXNwbGF5ID0gTlVMTDsKLQlpZiAoIFNETF9YMTFfTG9hZFN5bWJvbHMoKSApIHsKLQkJZGlzcGxheSA9IFhPcGVuRGlzcGxheShOVUxMKTsKLQkJaWYgKCBkaXNwbGF5ICE9IE5VTEwgKSB7Ci0JCQlYQ2xvc2VEaXNwbGF5KGRpc3BsYXkpOwotCQl9Ci0JCVNETF9YMTFfVW5sb2FkU3ltYm9scygpOwotCX0KLQlyZXR1cm4oZGlzcGxheSAhPSBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgWDExX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKLXsKLQlpZiAoIGRldmljZSApIHsKLQkJaWYgKCBkZXZpY2UtPmhpZGRlbiApIHsKLQkJCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKLQkJfQotCQlpZiAoIGRldmljZS0+Z2xfZGF0YSApIHsKLQkJCVNETF9mcmVlKGRldmljZS0+Z2xfZGF0YSk7Ci0JCX0KLQkJU0RMX2ZyZWUoZGV2aWNlKTsKLQkJU0RMX1gxMV9VbmxvYWRTeW1ib2xzKCk7Ci0JfQotfQotCi1zdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpYMTFfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKLXsKLQlTRExfVmlkZW9EZXZpY2UgKmRldmljZSA9IE5VTEw7Ci0KLQlpZiAoIFNETF9YMTFfTG9hZFN5bWJvbHMoKSApIHsKLQkJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KLQkJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOwotCQlpZiAoIGRldmljZSApIHsKLQkJCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKLQkJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQotCQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0JCQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOwotCQkJZGV2aWNlLT5nbF9kYXRhID0gKHN0cnVjdCBTRExfUHJpdmF0ZUdMRGF0YSAqKQotCQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+Z2xfZGF0YSkpOwotCQkJU0RMX21lbXNldChkZXZpY2UtPmdsX2RhdGEsIDAsIChzaXplb2YgKmRldmljZS0+Z2xfZGF0YSkpOwotCQl9Ci0JCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgfHwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UtPmdsX2RhdGEgPT0gTlVMTCkgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCVgxMV9EZWxldGVEZXZpY2UoZGV2aWNlKTsgLyogY2FsbHMgU0RMX1gxMV9VbmxvYWRTeW1ib2xzKCkuICovCi0JCQlyZXR1cm4oMCk7Ci0JCX0KLQkJU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQkJU0RMX21lbXNldChkZXZpY2UtPmdsX2RhdGEsIDAsIChzaXplb2YgKmRldmljZS0+Z2xfZGF0YSkpOwotCi0JCS8qIFNldCB0aGUgZHJpdmVyIGZsYWdzICovCi0JCWRldmljZS0+aGFuZGxlc19hbnlfc2l6ZSA9IDE7Ci0KLQkJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwotCQlkZXZpY2UtPlZpZGVvSW5pdCA9IFgxMV9WaWRlb0luaXQ7Ci0JCWRldmljZS0+TGlzdE1vZGVzID0gWDExX0xpc3RNb2RlczsKLQkJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBYMTFfU2V0VmlkZW9Nb2RlOwotCQlkZXZpY2UtPlRvZ2dsZUZ1bGxTY3JlZW4gPSBYMTFfVG9nZ2xlRnVsbFNjcmVlbjsKLQkJZGV2aWNlLT5VcGRhdGVNb3VzZSA9IFgxMV9VcGRhdGVNb3VzZTsKLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YVgotCQlkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBYMTFfQ3JlYXRlWVVWT3ZlcmxheTsKLSNlbmRpZgotCQlkZXZpY2UtPlNldENvbG9ycyA9IFgxMV9TZXRDb2xvcnM7Ci0JCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOwotCQlkZXZpY2UtPlZpZGVvUXVpdCA9IFgxMV9WaWRlb1F1aXQ7Ci0JCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBYMTFfQWxsb2NIV1N1cmZhY2U7Ci0JCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOwotCQlkZXZpY2UtPkZpbGxIV1JlY3QgPSBOVUxMOwotCQlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOwotCQlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOwotCQlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBYMTFfTG9ja0hXU3VyZmFjZTsKLQkJZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBYMTFfVW5sb2NrSFdTdXJmYWNlOwotCQlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBYMTFfRmxpcEhXU3VyZmFjZTsKLQkJZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gWDExX0ZyZWVIV1N1cmZhY2U7Ci0JCWRldmljZS0+U2V0R2FtbWEgPSBYMTFfU2V0VmlkTW9kZUdhbW1hOwotCQlkZXZpY2UtPkdldEdhbW1hID0gWDExX0dldFZpZE1vZGVHYW1tYTsKLQkJZGV2aWNlLT5TZXRHYW1tYVJhbXAgPSBYMTFfU2V0R2FtbWFSYW1wOwotCQlkZXZpY2UtPkdldEdhbW1hUmFtcCA9IE5VTEw7Ci0jaWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKLQkJZGV2aWNlLT5HTF9Mb2FkTGlicmFyeSA9IFgxMV9HTF9Mb2FkTGlicmFyeTsKLQkJZGV2aWNlLT5HTF9HZXRQcm9jQWRkcmVzcyA9IFgxMV9HTF9HZXRQcm9jQWRkcmVzczsKLQkJZGV2aWNlLT5HTF9HZXRBdHRyaWJ1dGUgPSBYMTFfR0xfR2V0QXR0cmlidXRlOwotCQlkZXZpY2UtPkdMX01ha2VDdXJyZW50ID0gWDExX0dMX01ha2VDdXJyZW50OwotCQlkZXZpY2UtPkdMX1N3YXBCdWZmZXJzID0gWDExX0dMX1N3YXBCdWZmZXJzOwotI2VuZGlmCi0JCWRldmljZS0+U2V0Q2FwdGlvbiA9IFgxMV9TZXRDYXB0aW9uOwotCQlkZXZpY2UtPlNldEljb24gPSBYMTFfU2V0SWNvbjsKLQkJZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gWDExX0ljb25pZnlXaW5kb3c7Ci0JCWRldmljZS0+R3JhYklucHV0ID0gWDExX0dyYWJJbnB1dDsKLQkJZGV2aWNlLT5HZXRXaW5kb3dQb3MgPSBYMTFfR2V0V2luZG93UG9zOwotCQlkZXZpY2UtPlNldFdpbmRvd1BvcyA9IFgxMV9TZXRXaW5kb3dQb3M7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLT5Jc1dpbmRvd1Zpc2libGUgPSBYMTFfSXNXaW5kb3dWaXNpYmxlOwotICAgICAgICAgICAgICAgIGRldmljZS0+R2V0TW9uaXRvckRQSSA9IFgxMV9HZXRNb25pdG9yRFBJOwotICAgICAgICAgICAgICAgIGRldmljZS0+R2V0TW9uaXRvclJlY3QgPSBYMTFfR2V0TW9uaXRvclJlY3Q7Ci0JCWRldmljZS0+R2V0V01JbmZvID0gWDExX0dldFdNSW5mbzsKLQkJZGV2aWNlLT5GcmVlV01DdXJzb3IgPSBYMTFfRnJlZVdNQ3Vyc29yOwotCQlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gWDExX0NyZWF0ZVdNQ3Vyc29yOwotCQlkZXZpY2UtPlNob3dXTUN1cnNvciA9IFgxMV9TaG93V01DdXJzb3I7Ci0JCWRldmljZS0+V2FycFdNQ3Vyc29yID0gWDExX1dhcnBXTUN1cnNvcjsKLQkJZGV2aWNlLT5DaGVja01vdXNlTW9kZSA9IFgxMV9DaGVja01vdXNlTW9kZTsKLQkJZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBYMTFfSW5pdE9TS2V5bWFwOwotCQlkZXZpY2UtPlB1bXBFdmVudHMgPSBYMTFfUHVtcEV2ZW50czsKLQotCQlkZXZpY2UtPmZyZWUgPSBYMTFfRGVsZXRlRGV2aWNlOwotCX0KLQotCXJldHVybiBkZXZpY2U7Ci19Ci0KLVZpZGVvQm9vdFN0cmFwIFgxMV9ib290c3RyYXAgPSB7Ci0JIngxMSIsICJYIFdpbmRvdyBTeXN0ZW0iLAotCVgxMV9BdmFpbGFibGUsIFgxMV9DcmVhdGVEZXZpY2UKLX07Ci0KLS8qIE5vcm1hbCBYMTEgZXJyb3IgaGFuZGxlciByb3V0aW5lICovCi1zdGF0aWMgaW50ICgqWF9oYW5kbGVyKShEaXNwbGF5ICosIFhFcnJvckV2ZW50ICopID0gTlVMTDsKLXN0YXRpYyBpbnQgeF9lcnJoYW5kbGVyKERpc3BsYXkgKmQsIFhFcnJvckV2ZW50ICplKQotewotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKLQlleHRlcm4gaW50IHZtX2Vycm9yOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfREdBTU9VU0UKLQlleHRlcm4gaW50IGRnYV9lcnJvcjsKLSNlbmRpZgotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQotCS8qIFZpZE1vZGUgZXJyb3JzIGFyZSBub24tZmF0YWwuIDopICovCi0JLyogQXJlIHRoZSBlcnJvcnMgb2Zmc2V0IGJ5IG9uZSBmcm9tIHRoZSBlcnJvciBiYXNlPwotCSAgIGUuZy4gdGhlIGVycm9yIGJhc2UgaXMgMTQzLCB0aGUgY29kZSBpcyAxNDgsIGFuZCB0aGUKLQkgICAgICAgIGFjdHVhbCBlcnJvciBpcyBYRjg2VmlkTW9kZUV4dGVuc2lvbkRpc2FibGVkICg0KSA/Ci0JICovCi0gICAgICAgIGlmICggKHZtX2Vycm9yID49IDApICYmCi0JICAgICAoKChlLT5lcnJvcl9jb2RlID09IEJhZFJlcXVlc3QpJiYoZS0+cmVxdWVzdF9jb2RlID09IHZtX2Vycm9yKSkgfHwKLQkgICAgICAoKGUtPmVycm9yX2NvZGUgPiB2bV9lcnJvcikgJiYKLQkgICAgICAgKGUtPmVycm9yX2NvZGUgPD0gKHZtX2Vycm9yK1hGODZWaWRNb2RlTnVtYmVyRXJyb3JzKSkpKSApIHsKLSNpZmRlZiBYMTFfREVCVUcKLXsgY2hhciBlcnJtc2dbMTAyNF07Ci0gIFhHZXRFcnJvclRleHQoZCwgZS0+ZXJyb3JfY29kZSwgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7Ci1wcmludGYoIlZpZE1vZGUgZXJyb3I6ICVzXG4iLCBlcnJtc2cpOwotfQotI2VuZGlmCi0gICAgICAgIAlyZXR1cm4oMCk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFICovCi0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9ER0FNT1VTRQotCS8qIERHQSBlcnJvcnMgY2FuIGJlIG5vbi1mYXRhbC4gOikgKi8KLSAgICAgICAgaWYgKCAoZGdhX2Vycm9yID49IDApICYmCi0JICAgICAoKGUtPmVycm9yX2NvZGUgPiBkZ2FfZXJyb3IpICYmCi0JICAgICAgKGUtPmVycm9yX2NvZGUgPD0gKGRnYV9lcnJvcitYRjg2REdBTnVtYmVyRXJyb3JzKSkpICkgewotI2lmZGVmIFgxMV9ERUJVRwoteyBjaGFyIGVycm1zZ1sxMDI0XTsKLSAgWEdldEVycm9yVGV4dChkLCBlLT5lcnJvcl9jb2RlLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKLXByaW50ZigiREdBIGVycm9yOiAlc1xuIiwgZXJybXNnKTsKLX0KLSNlbmRpZgotICAgICAgICAJcmV0dXJuKDApOwotICAgICAgICB9Ci0jZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfREdBTU9VU0UgKi8KLQotCXJldHVybihYX2hhbmRsZXIoZCxlKSk7Ci19Ci0KLS8qIFgxMSBJL08gZXJyb3IgaGFuZGxlciByb3V0aW5lICovCi1zdGF0aWMgaW50ICgqWElPX2hhbmRsZXIpKERpc3BsYXkgKikgPSBOVUxMOwotc3RhdGljIGludCB4aW9fZXJyaGFuZGxlcihEaXNwbGF5ICpkKQotewotCS8qIEFjayEgIExvc3QgWDExIGNvbm5lY3Rpb24hICovCi0KLQkvKiBXZSB3aWxsIGNyYXNoIGlmIHdlIHRyeSB0byBjbGVhbiB1cCBvdXIgZGlzcGxheSAqLwotCWlmICggY3VycmVudF92aWRlby0+aGlkZGVuLT5YaW1hZ2UgKSB7Ci0JCVNETF9WaWRlb1N1cmZhY2UtPnBpeGVscyA9IE5VTEw7Ci0JfQotCWN1cnJlbnRfdmlkZW8tPmhpZGRlbi0+WDExX0Rpc3BsYXkgPSBOVUxMOwotCi0JLyogQ29udGludWUgd2l0aCB0aGUgc3RhbmRhcmQgWDExIGVycm9yIGhhbmRsZXIgKi8KLQlyZXR1cm4oWElPX2hhbmRsZXIoZCkpOwotfQotCi1zdGF0aWMgaW50ICgqWGV4dF9oYW5kbGVyKShEaXNwbGF5ICosIF9YY29uc3QgY2hhciAqLCBfWGNvbnN0IGNoYXIgKikgPSBOVUxMOwotc3RhdGljIGludCB4ZXh0X2VycmhhbmRsZXIoRGlzcGxheSAqZCwgX1hjb25zdCBjaGFyICpleHQsIF9YY29uc3QgY2hhciAqcmVhc29uKQotewotI2lmZGVmIFgxMV9ERUJVRwotCXByaW50ZigiWGV4dCBlcnJvciBpbnNpZGUgU0RMIChtYXkgYmUgaGFybWxlc3MpOlxuIik7Ci0JcHJpbnRmKCIgIEV4dGVuc2lvbiBcIiVzXCIgJXMgb24gZGlzcGxheSBcIiVzXCIuXG4iLAotCSAgICAgICBleHQsIHJlYXNvbiwgWERpc3BsYXlTdHJpbmcoZCkpOwotI2VuZGlmCi0KLQlpZiAoU0RMX3N0cmNtcChyZWFzb24sICJtaXNzaW5nIikgPT0gMCkgewotCQkvKgotCQkgKiBTaW5jZSB0aGUgcXVlcnkgaXRzZWxmLCBlbHNld2hlcmUsIGNhbiBoYW5kbGUgYSBtaXNzaW5nIGV4dGVuc2lvbgotCQkgKiAgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpbiBYbGliIGlzIHRvIHdyaXRlIHRvIHN0ZGVyciwgd2hpY2gKLQkJICogIGdlbmVyYXRlcyB1bm5lY2Vzc2FyeSBidWcgcmVwb3J0cywgd2UganVzdCBpZ25vcmUgdGhlc2UuCi0JCSAqLwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBFdmVyeXRoaW5nIGVsc2UgZ29lcyB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLi4uICovCi0JcmV0dXJuIFhleHRfaGFuZGxlcihkLCBleHQsIHJlYXNvbik7Ci19Ci0KLS8qIEZpbmQgb3V0IHdoYXQgY2xhc3MgbmFtZSB3ZSBzaG91bGQgdXNlICovCi1zdGF0aWMgY2hhciAqZ2V0X2NsYXNzbmFtZShjaGFyICpjbGFzc25hbWUsIGludCBtYXhsZW4pCi17Ci0JY2hhciAqc3BvdDsKLSNpZiBkZWZpbmVkKF9fTElOVVhfXykgfHwgZGVmaW5lZChfX0ZSRUVCU0RfXykKLQljaGFyIHByb2NmaWxlWzEwMjRdOwotCWNoYXIgbGlua2ZpbGVbMTAyNF07Ci0JaW50IGxpbmtzaXplOwotI2VuZGlmCi0KLQkvKiBGaXJzdCBhbGxvdyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZSAqLwotCXNwb3QgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fWDExX1dNQ0xBU1MiKTsKLQlpZiAoIHNwb3QgKSB7Ci0JCVNETF9zdHJsY3B5KGNsYXNzbmFtZSwgc3BvdCwgbWF4bGVuKTsKLQkJcmV0dXJuIGNsYXNzbmFtZTsKLQl9Ci0KLQkvKiBOZXh0IGxvb2sgYXQgdGhlIGFwcGxpY2F0aW9uJ3MgZXhlY3V0YWJsZSBuYW1lICovCi0jaWYgZGVmaW5lZChfX0xJTlVYX18pIHx8IGRlZmluZWQoX19GUkVFQlNEX18pCi0jaWYgZGVmaW5lZChfX0xJTlVYX18pCi0JU0RMX3NucHJpbnRmKHByb2NmaWxlLCBTRExfYXJyYXlzaXplKHByb2NmaWxlKSwgIi9wcm9jLyVkL2V4ZSIsIGdldHBpZCgpKTsKLSNlbGlmIGRlZmluZWQoX19GUkVFQlNEX18pCi0JU0RMX3NucHJpbnRmKHByb2NmaWxlLCBTRExfYXJyYXlzaXplKHByb2NmaWxlKSwgIi9wcm9jLyVkL2ZpbGUiLCBnZXRwaWQoKSk7Ci0jZWxzZQotI2Vycm9yIFdoZXJlIGNhbiB3ZSBmaW5kIHRoZSBleGVjdXRhYmxlIG5hbWU/Ci0jZW5kaWYKLQlsaW5rc2l6ZSA9IHJlYWRsaW5rKHByb2NmaWxlLCBsaW5rZmlsZSwgc2l6ZW9mKGxpbmtmaWxlKS0xKTsKLQlpZiAoIGxpbmtzaXplID4gMCApIHsKLQkJbGlua2ZpbGVbbGlua3NpemVdID0gJ1wwJzsKLQkJc3BvdCA9IFNETF9zdHJyY2hyKGxpbmtmaWxlLCAnLycpOwotCQlpZiAoIHNwb3QgKSB7Ci0JCQlTRExfc3RybGNweShjbGFzc25hbWUsIHNwb3QrMSwgbWF4bGVuKTsKLQkJfSBlbHNlIHsKLQkJCVNETF9zdHJsY3B5KGNsYXNzbmFtZSwgbGlua2ZpbGUsIG1heGxlbik7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzbmFtZTsKLQl9Ci0jZW5kaWYgLyogX19MSU5VWF9fICovCi0KLQkvKiBGaW5hbGx5IHVzZSB0aGUgZGVmYXVsdCB3ZSd2ZSB1c2VkIGZvcmV2ZXIgKi8KLQlTRExfc3RybGNweShjbGFzc25hbWUsICJTRExfQXBwIiwgbWF4bGVuKTsKLQlyZXR1cm4gY2xhc3NuYW1lOwotfQotCi0vKiBDcmVhdGUgYXV4aWxpYXJ5ICh0b3BsZXZlbCkgd2luZG93cyB3aXRoIHRoZSBjdXJyZW50IHZpc3VhbCAqLwotc3RhdGljIHZvaWQgY3JlYXRlX2F1eF93aW5kb3dzKF9USElTKQotewotICAgIGludCB4ID0gMCwgeSA9IDA7Ci0gICAgY2hhciBjbGFzc25hbWVbMTAyNF07Ci0gICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgeGF0dHI7Ci0gICAgWFdNSGludHMgKmhpbnRzOwotICAgIHVuc2lnbmVkIGxvbmcgYXBwX2V2ZW50X21hc2s7Ci0gICAgaW50IGRlZl92aXMgPSAoU0RMX1Zpc3VhbCA9PSBEZWZhdWx0VmlzdWFsKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKSk7Ci0KLSAgICAvKiBMb29rIHVwIHNvbWUgdXNlZnVsIEF0b21zICovCi0gICAgV01fREVMRVRFX1dJTkRPVyA9IFhJbnRlcm5BdG9tKFNETF9EaXNwbGF5LCAiV01fREVMRVRFX1dJTkRPVyIsIEZhbHNlKTsKLQotICAgIC8qIERvbid0IGNyZWF0ZSBhbnkgZXh0cmEgd2luZG93cyBpZiB3ZSBhcmUgYmVpbmcgbWFuYWdlZCAqLwotICAgIGlmICggU0RMX3dpbmRvd2lkICkgewotCUZTd2luZG93ID0gMDsKLQlXTXdpbmRvdyA9IFNETF9zdHJ0b2woU0RMX3dpbmRvd2lkLCBOVUxMLCAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmKEZTd2luZG93KQotCVhEZXN0cm95V2luZG93KFNETF9EaXNwbGF5LCBGU3dpbmRvdyk7Ci0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQotICAgIGlmICggdXNlX3hpbmVyYW1hICkgewotICAgICAgICB4ID0geGluZXJhbWFfaW5mby54X29yZzsKLSAgICAgICAgeSA9IHhpbmVyYW1hX2luZm8ueV9vcmc7Ci0gICAgfQotI2VuZGlmCi0gICAgeGF0dHIub3ZlcnJpZGVfcmVkaXJlY3QgPSBUcnVlOwotICAgIHhhdHRyLmJhY2tncm91bmRfcGl4ZWwgPSBkZWZfdmlzID8gQmxhY2tQaXhlbChTRExfRGlzcGxheSwgU0RMX1NjcmVlbikgOiAwOwotICAgIHhhdHRyLmJvcmRlcl9waXhlbCA9IDA7Ci0gICAgeGF0dHIuY29sb3JtYXAgPSBTRExfWENvbG9yTWFwOwotCi0gICAgRlN3aW5kb3cgPSBYQ3JlYXRlV2luZG93KFNETF9EaXNwbGF5LCBTRExfUm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgMzIsIDMyLCAwLAotCQkJICAgICB0aGlzLT5oaWRkZW4tPmRlcHRoLCBJbnB1dE91dHB1dCwgU0RMX1Zpc3VhbCwKLQkJCSAgICAgQ1dPdmVycmlkZVJlZGlyZWN0IHwgQ1dCYWNrUGl4ZWwgfCBDV0JvcmRlclBpeGVsCi0JCQkgICAgIHwgQ1dDb2xvcm1hcCwKLQkJCSAgICAgJnhhdHRyKTsKLQotICAgIFhTZWxlY3RJbnB1dChTRExfRGlzcGxheSwgRlN3aW5kb3csIFN0cnVjdHVyZU5vdGlmeU1hc2spOwotCi0gICAgLyogVGVsbCBLREUgdG8ga2VlcCB0aGUgZnVsbHNjcmVlbiB3aW5kb3cgb24gdG9wICovCi0gICAgewotCVhFdmVudCBldjsKLQlsb25nIG1hc2s7Ci0KLQlTRExfbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7Ci0JZXYueGNsaWVudC50eXBlID0gQ2xpZW50TWVzc2FnZTsKLQlldi54Y2xpZW50LndpbmRvdyA9IFNETF9Sb290OwotCWV2LnhjbGllbnQubWVzc2FnZV90eXBlID0gWEludGVybkF0b20oU0RMX0Rpc3BsYXksCi0JCQkJCSAgICAgICJLV01fS0VFUF9PTl9UT1AiLCBGYWxzZSk7Ci0JZXYueGNsaWVudC5mb3JtYXQgPSAzMjsKLQlldi54Y2xpZW50LmRhdGEubFswXSA9IEZTd2luZG93OwotCWV2LnhjbGllbnQuZGF0YS5sWzFdID0gQ3VycmVudFRpbWU7Ci0JbWFzayA9IFN1YnN0cnVjdHVyZVJlZGlyZWN0TWFzazsKLQlYU2VuZEV2ZW50KFNETF9EaXNwbGF5LCBTRExfUm9vdCwgRmFsc2UsIG1hc2ssICZldik7Ci0gICAgfQotCi0gICAgaGludHMgPSBOVUxMOwotICAgIGlmKFdNd2luZG93KSB7Ci0JLyogQWxsIHdpbmRvdyBhdHRyaWJ1dGVzIG11c3Qgc3Vydml2ZSB0aGUgcmVjcmVhdGlvbiAqLwotCWhpbnRzID0gWEdldFdNSGludHMoU0RMX0Rpc3BsYXksIFdNd2luZG93KTsKLQlYRGVzdHJveVdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3cpOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSB0aGUgd2luZG93IGZvciB3aW5kb3dlZCBtYW5hZ2VtZW50ICovCi0gICAgLyogKHJldXNpbmcgdGhlIHhhdHRyIHN0cnVjdHVyZSBhYm92ZSkgKi8KLSAgICBXTXdpbmRvdyA9IFhDcmVhdGVXaW5kb3coU0RMX0Rpc3BsYXksIFNETF9Sb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICsgWDExX3dtWEFkanVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSArIFgxMV93bVlBZGp1c3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLCAzMiwgMCwKLQkJCSAgICAgdGhpcy0+aGlkZGVuLT5kZXB0aCwgSW5wdXRPdXRwdXQsIFNETF9WaXN1YWwsCi0JCQkgICAgIENXQmFja1BpeGVsIHwgQ1dCb3JkZXJQaXhlbCB8IENXQ29sb3JtYXAsCi0JCQkgICAgICZ4YXR0cik7Ci0KLSAgICAvKiBTZXQgdGhlIGlucHV0IGhpbnRzIHNvIHdlIGdldCBrZXlib2FyZCBpbnB1dCAqLwotICAgIGlmKCFoaW50cykgewotCWhpbnRzID0gWEFsbG9jV01IaW50cygpOwotCWhpbnRzLT5pbnB1dCA9IFRydWU7Ci0JaGludHMtPmZsYWdzID0gSW5wdXRIaW50OwotICAgIH0KLSAgICBYU2V0V01IaW50cyhTRExfRGlzcGxheSwgV013aW5kb3csIGhpbnRzKTsKLSAgICBYRnJlZShoaW50cyk7Ci0gICAgWDExX1NldENhcHRpb25Ob0xvY2sodGhpcywgdGhpcy0+d21fdGl0bGUsIHRoaXMtPndtX2ljb24pOwotCi0gICAgYXBwX2V2ZW50X21hc2sgPSBGb2N1c0NoYW5nZU1hc2sgfCBLZXlQcmVzc01hc2sgfCBLZXlSZWxlYXNlTWFzawotCXwgUHJvcGVydHlDaGFuZ2VNYXNrIHwgU3RydWN0dXJlTm90aWZ5TWFzayB8IEtleW1hcFN0YXRlTWFzazsKLSAgICBYU2VsZWN0SW5wdXQoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBhcHBfZXZlbnRfbWFzayk7Ci0KLSAgICAvKiBTZXQgdGhlIGNsYXNzIGhpbnRzIHNvIHdlIGNhbiBnZXQgYW4gaWNvbiAoQWZ0ZXJTdGVwKSAqLwotICAgIGdldF9jbGFzc25hbWUoY2xhc3NuYW1lLCBzaXplb2YoY2xhc3NuYW1lKSk7Ci0gICAgewotCVhDbGFzc0hpbnQgKmNsYXNzaGludHM7Ci0JY2xhc3NoaW50cyA9IFhBbGxvY0NsYXNzSGludCgpOwotCWlmKGNsYXNzaGludHMgIT0gTlVMTCkgewotCSAgICBjbGFzc2hpbnRzLT5yZXNfbmFtZSA9IGNsYXNzbmFtZTsKLQkgICAgY2xhc3NoaW50cy0+cmVzX2NsYXNzID0gY2xhc3NuYW1lOwotCSAgICBYU2V0Q2xhc3NIaW50KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgY2xhc3NoaW50cyk7Ci0JICAgIFhGcmVlKGNsYXNzaGludHMpOwotCX0KLSAgICB9Ci0KLQkvKiBTZXR1cCB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBJTSBzZXJ2ZXIgKi8KLQkvKiBjcmVhdGVfYXV4X3dpbmRvd3MgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIGFnYWluc3QgdGhlIHNhbWUKLQkgICBEaXNwbGF5LiAgV2Ugc2hvdWxkIHJldXNlIHRoZSBTRExfSU0gaWYgb25lIGhhcyBiZWVuIG9wZW5lZCBmb3IKLQkgICB0aGUgRGlzcGxheSwgc28gd2Ugc2hvdWxkIG5vdCBzaW1wbHkgcmVzZXQgU0RMX0lNIGhlcmUuICAqLwotCi0JI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORwotCWlmIChTRExfWDExX0hBVkVfVVRGOCkgewotCQkvKiBEaXNjYXJkIG9ic29sZXRlIHJlc291cmNlcyBpZiBhbnkuICAqLwotCQlpZiAoU0RMX0lNICE9IE5VTEwgJiYgU0RMX0Rpc3BsYXkgIT0gWERpc3BsYXlPZklNKFNETF9JTSkpIHsKLQkJCS8qIEp1c3QgYSBkb3VibGUgY2hlY2suIEkgZG9uJ3QgdGhpbmsgdGhpcwotCQkgICAgICAgICAgIGNvZGUgaXMgZXZlciBleGVjdXRlZC4gKi8KLQkJCVNETF9TZXRFcnJvcigiZGlzcGxheSBoYXMgY2hhbmdlZCB3aGlsZSBhbiBJTSBpcyBrZXB0Iik7Ci0JCQlpZiAoU0RMX0lDKSB7Ci0JCQkJWFVuc2V0SUNGb2N1cyhTRExfSUMpOwotCQkJCVhEZXN0cm95SUMoU0RMX0lDKTsKLQkJCQlTRExfSUMgPSBOVUxMOwotCQkJfQotCQkJWENsb3NlSU0oU0RMX0lNKTsKLQkJCVNETF9JTSA9IE5VTEw7Ci0JCX0KLQotCQkvKiBPcGVuIGFuIGlucHV0IG1ldGhvZC4gICovCi0JCWlmIChTRExfSU0gPT0gTlVMTCkgewotCQkJY2hhciAqb2xkX2xvY2FsZSA9IE5VTEwsICpvbGRfbW9kaWZpZXJzID0gTlVMTDsKLQkJCWNvbnN0IGNoYXIgKnA7Ci0JCQlzaXplX3QgbjsKLQkJCS8qIEknbSBub3QgY29tZm9ydGFibGUgdG8gZG8gbG9jYWxlIHNldHVwCi0JCQkgICBoZXJlLiAgSG93ZXZlciwgd2UgbmVlZCBDIGxpYnJhcnkgbG9jYWxlCi0JCQkgICAoYW5kIHhsaWIgbW9kaWZpZXJzKSB0byBiZSBzZXQgYmFzZWQgb24gdGhlCi0JCQkgICB1c2VyJ3MgcHJlZmVyZW5jZSB0byB1c2UgWElNLCBhbmQgbWFueQotCQkJICAgZXhpc3RpbmcgZ2FtZSBwcm9ncmFtcyBkb2Vzbid0IHRha2UgY2FyZSBvZgotCQkJICAgdXNlcnMnIGxvY2FsZSBwcmVmZXJlbmNlcywgc28gc29tZW9uZSBvdGhlcgotCQkJICAgdGhhbiB0aGUgZ2FtZSBwcm9ncmFtIHNob3VsZCBkbyBpdC4KLQkJCSAgIE1vcmVvdmVyLCBvbmVzIHNheSB0aGF0IHNvbWUgZ2FtZSBwcm9ncmFtcwotCQkJICAgaGVhdmlseSByZWx5IG9uIHRoZSBDIGxvY2FsZSBiZWhhdmlvdXIsCi0JCQkgICBlLmcuLCBzdHJjb2woKSdzLCBhbmQgd2UgY2FuJ3QgY2hhbmdlIHRoZSBDCi0JCQkgICBsaWJyYXJ5IGxvY2FsZS4gIEdpdmVuIHRoZSBzaXR1YXRpb24sIEkKLQkJCSAgIGNvdWxkbid0IGZpbmQgYmV0dGVyIHBsYWNlIHRvIGRvIHRoZQotCQkJICAgam9iLi4uICovCi0KLQkJCS8qIFNhdmUgdGhlIGN1cnJlbnQgKGFwcGxpY2F0aW9uIHByb2dyYW0ncykKLQkJCSAgIGxvY2FsZSBzZXR0aW5ncy4gICovCi0JCQlwID0gc2V0bG9jYWxlKExDX0FMTCwgTlVMTCk7Ci0JCQlpZiAoIHAgKSB7Ci0JCQkJbiA9IFNETF9zdHJsZW4ocCkrMTsKLQkJCQlvbGRfbG9jYWxlID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIG4pOwotCQkJCWlmICggb2xkX2xvY2FsZSApIHsKLQkJCQkJU0RMX3N0cmxjcHkob2xkX2xvY2FsZSwgcCwgbik7Ci0JCQkJfQotCQkJfQotCQkJcCA9IFhTZXRMb2NhbGVNb2RpZmllcnMoTlVMTCk7Ci0JCQlpZiAoIHAgKSB7Ci0JCQkJbiA9IFNETF9zdHJsZW4ocCkrMTsKLQkJCQlvbGRfbW9kaWZpZXJzID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIG4pOwotCQkJCWlmICggb2xkX21vZGlmaWVycyApIHsKLQkJCQkJU0RMX3N0cmxjcHkob2xkX21vZGlmaWVycywgcCwgbik7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBGZXRjaCB0aGUgdXNlcidzIHByZWZlcmVuY2VzIGFuZCBvcGVuIHRoZQotCQkJICAgaW5wdXQgbWV0aG9kIHdpdGggdGhlbS4gICovCi0JCQlzZXRsb2NhbGUoTENfQUxMLCAiIik7Ci0JCQlYU2V0TG9jYWxlTW9kaWZpZXJzKCIiKTsKLQkJCVNETF9JTSA9IFhPcGVuSU0oU0RMX0Rpc3BsYXksIE5VTEwsIGNsYXNzbmFtZSwgY2xhc3NuYW1lKTsKLQotCQkJLyogUmVzdG9yZSB0aGUgYXBwbGljYXRpb24ncyBsb2NhbGUgc2V0dGluZ3MKLQkJCSAgIHNvIHRoYXQgd2UgZG9uJ3QgYnJlYWsgdGhlIGFwcGxpY2F0aW9uJ3MKLQkJCSAgIGV4cGVjdGVkIGJlaGF2aW91ci4gICovCi0JCQlpZiAoIG9sZF9sb2NhbGUgKSB7Ci0JCQkJLyogV2UgbmVlZCB0byByZXN0b3JlIHRoZSBDIGxpYnJhcnkKLQkJCQkgICBsb2NhbGUgZmlyc3QsIHNpbmNlIHRoZQotCQkJCSAgIGludGVycHJldGF0aW9uIG9mIHRoZSBYIG1vZGlmaWVyCi0JCQkJICAgbWF5IGRlcGVuZCBvbiBpdC4gICovCi0JCQkJc2V0bG9jYWxlKExDX0FMTCwgb2xkX2xvY2FsZSk7Ci0JCQkJU0RMX3N0YWNrX2ZyZWUob2xkX2xvY2FsZSk7Ci0JCQl9Ci0JCQlpZiAoIG9sZF9tb2RpZmllcnMgKSB7Ci0JCQkJWFNldExvY2FsZU1vZGlmaWVycyhvbGRfbW9kaWZpZXJzKTsKLQkJCQlTRExfc3RhY2tfZnJlZShvbGRfbW9kaWZpZXJzKTsKLQkJCX0KLQkJfQotCi0JCS8qIENyZWF0ZSBhIG5ldyBpbnB1dCBjb250ZXh0IGZvciB0aGUgbmV3IHdpbmRvdyBqdXN0IGNyZWF0ZWQuICAqLwotCQlpZiAoU0RMX0lNID09IE5VTEwpIHsKLQkJCVNETF9TZXRFcnJvcigibm8gaW5wdXQgbWV0aG9kIGNvdWxkIGJlIG9wZW5lZCIpOwotCQl9IGVsc2UgewotCQkJaWYgKFNETF9JQyAhPSBOVUxMKSB7Ci0JCQkJLyogRGlzY2FyZCB0aGUgb2xkIElDIGJlZm9yZSBjcmVhdGluZyBuZXcgb25lLiAgKi8KLQkJCSAgICBYVW5zZXRJQ0ZvY3VzKFNETF9JQyk7Ci0JCQkgICAgWERlc3Ryb3lJQyhTRExfSUMpOwotCQkJfQotCQkJLyogVGhlb3JldGljYWxseSB3ZSBzaG91bGQgY2hlY2sgdGhlIGN1cnJlbnQgSU0gc3VwcG9ydHMKLQkJCSAgIFByZWVkaXROb3RoaW5nK1N0YXR1c05vdGhpbmcgc3R5bGUgKGkuZS4sIHJvb3Qgd2luZG93IG1ldGhvZCkKLQkJCSAgIGJlZm9yZSBjcmVhdGluZyB0aGUgSUMuICBIb3dldmVyLCBpdCBpcyB0aGUgYm90dG9tIGxpbmUgbWV0aG9kLAotCQkJICAgYW5kIHdlIHN1cHBvcnRzIGFueSBvdGhlciBvcHRpb25zLiAgSWYgdGhlIElNIGRpZG4ndCBzdXBwb3J0Ci0JCQkgICByb290IHdpbmRvdyBtZXRob2QsIHRoZSBmb2xsb3dpbmcgY2FsbCBmYWlscywgYW5kIFNETCBmYWxscwotCQkJICAgYmFjayB0byBwcmUtWElNIGtleWJvYXJkIGhhbmRsaW5nLiAgKi8KLQkJCVNETF9JQyA9IHBYQ3JlYXRlSUMoU0RMX0lNLAotCQkJCQlYTkNsaWVudFdpbmRvdywgV013aW5kb3csCi0JCQkJCVhORm9jdXNXaW5kb3csIFdNd2luZG93LAotCQkJCQlYTklucHV0U3R5bGUsIFhJTVByZWVkaXROb3RoaW5nIHwgWElNU3RhdHVzTm90aGluZywKLQkJCQkJWE5SZXNvdXJjZU5hbWUsIGNsYXNzbmFtZSwKLQkJCQkJWE5SZXNvdXJjZUNsYXNzLCBjbGFzc25hbWUsCi0JCQkJCU5VTEwpOwotCi0JCQlpZiAoU0RMX0lDID09IE5VTEwpIHsKLQkJCQlTRExfU2V0RXJyb3IoIm5vIGlucHV0IGNvbnRleHQgY291bGQgYmUgY3JlYXRlZCIpOwotCQkJCVhDbG9zZUlNKFNETF9JTSk7Ci0JCQkJU0RMX0lNID0gTlVMTDsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogV2UgbmVlZCB0byByZWNlaXZlIFggZXZlbnRzIHRoYXQgYW4gSU0gd2FudHMgYW5kIHRvIHBhc3MKLQkJCQkgICB0aGVtIHRvIHRoZSBJTSB0aHJvdWdoIFhGaWx0ZXJFdmVudC4gVGhlIHNldCBvZiBldmVudHMgbWF5Ci0JCQkJICAgdmFyeSBkZXBlbmRpbmcgb24gdGhlIElNIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgb3B0aW9ucwotCQkJCSAgIHNwZWNpZmllZCB0aHJvdWdoIHZhcmlvdXMgcm91dGVzLiBBbHRob3VnaCB1bmxpa2VseSwgdGhlCi0JCQkJICAgeGxpYiBzcGVjaWZpY2F0aW9uIGFsbG93cyBJTSB0byBjaGFuZ2UgdGhlIGV2ZW50IHJlcXVpcmVtZW50Ci0JCQkJICAgd2l0aCBpdHMgb3duIGNpcmN1bXN0YW5jZXMsIGl0IGlzIHNhZmUgdG8gY2FsbCBTZWxlY3RJbnB1dAotCQkJCSAgIHdoZW5ldmVyIHdlIHJlLWNyZWF0ZSBhbiBJQy4gICovCi0JCQkJdW5zaWduZWQgbG9uZyBtYXNrID0gMDsKLQkJCQljaGFyICpyZXQgPSBwWEdldElDVmFsdWVzKFNETF9JQywgWE5GaWx0ZXJFdmVudHMsICZtYXNrLCBOVUxMKTsKLQkJCQlpZiAocmV0ICE9IE5VTEwpIHsKLQkJCQkJWFVuc2V0SUNGb2N1cyhTRExfSUMpOwotCQkJCQlYRGVzdHJveUlDKFNETF9JQyk7Ci0JCQkJCVNETF9JQyA9IE5VTEw7Ci0JCQkJCVNETF9TZXRFcnJvcigibm8gaW5wdXQgY29udGV4dCBjb3VsZCBiZSBjcmVhdGVkIik7Ci0JCQkJCVhDbG9zZUlNKFNETF9JTSk7Ci0JCQkJCVNETF9JTSA9IE5VTEw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJWFNlbGVjdElucHV0KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgYXBwX2V2ZW50X21hc2sgfCBtYXNrKTsKLQkJCQkJWFNldElDRm9jdXMoU0RMX0lDKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JI2VuZGlmCi0KLQkvKiBBbGxvdyB0aGUgd2luZG93IHRvIGJlIGRlbGV0ZWQgYnkgdGhlIHdpbmRvdyBtYW5hZ2VyICovCi0JWFNldFdNUHJvdG9jb2xzKFNETF9EaXNwbGF5LCBXTXdpbmRvdywgJldNX0RFTEVURV9XSU5ET1csIDEpOwotfQotCi1zdGF0aWMgaW50IFgxMV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLQljb25zdCBjaGFyICplbnYgPSBOVUxMOwotCWNoYXIgKmRpc3BsYXk7Ci0JaW50IGk7Ci0KLQkvKiBPcGVuIHRoZSBYMTEgZGlzcGxheSAqLwotCWRpc3BsYXkgPSBOVUxMOwkJLyogR2V0IGl0IGZyb20gRElTUExBWSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLwotCi0JaWYgKCAoU0RMX3N0cm5jbXAoWERpc3BsYXlOYW1lKGRpc3BsYXkpLCAiOiIsIDEpID09IDApIHx8Ci0JICAgICAoU0RMX3N0cm5jbXAoWERpc3BsYXlOYW1lKGRpc3BsYXkpLCAidW5peDoiLCA1KSA9PSAwKSApIHsKLQkJbG9jYWxfWDExID0gMTsKLQl9IGVsc2UgewotCQlsb2NhbF9YMTEgPSAwOwotCX0KLQlTRExfRGlzcGxheSA9IFhPcGVuRGlzcGxheShkaXNwbGF5KTsKLSNpZiBkZWZpbmVkKF9fb3NmX18pICYmIGRlZmluZWQoU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQykKLQkvKiBPbiBUcnU2NCBpZiBsaW5raW5nIHdpdGhvdXQgLWxYMTEsIGl0IGZhaWxzIGFuZCB5b3UgZ2V0IGZvbGxvd2luZyBtZXNzYWdlLgotCSAqIFhsaWI6IGNvbm5lY3Rpb24gdG8gIjowLjAiIHJlZnVzZWQgYnkgc2VydmVyCi0JICogWGxpYjogWERNIGF1dGhvcml6YXRpb24ga2V5IG1hdGNoZXMgYW4gZXhpc3RpbmcgY2xpZW50IQotCSAqCi0JICogSXQgc3VjY2VlZHMgaWYgcmV0cnlpbmcgMSBzZWNvbmQgbGF0ZXIKLQkgKiBvciBpZiBydW5uaW5nIHhob3N0ICtsb2NhbGhvc3Qgb24gc2hlbGwuCi0JICoKLQkgKi8KLQlpZiAoIFNETF9EaXNwbGF5ID09IE5VTEwgKSB7Ci0JCVNETF9EZWxheSgxMDAwKTsKLQkJU0RMX0Rpc3BsYXkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheSk7Ci0JfQotI2VuZGlmCi0JaWYgKCBTRExfRGlzcGxheSA9PSBOVUxMICkgewotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gWDExIGRpc3BsYXkiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0jaWZkZWYgWDExX0RFQlVHCi0JWFN5bmNocm9uaXplKFNETF9EaXNwbGF5LCBUcnVlKTsKLSNlbmRpZgotCi0JLyogQ3JlYXRlIGFuIGFsdGVybmF0ZSBYIGRpc3BsYXkgZm9yIGdyYXBoaWNzIHVwZGF0ZXMgLS0gYWxsb3dzIHVzCi0JICAgdG8gZG8gZ3JhcGhpY3MgdXBkYXRlcyBpbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIGV2ZW50IGhhbmRsaW5nLgotCSAgIFRocmVhZC1zYWZlIFgxMSBkb2Vzbid0IHNlZW0gdG8gZXhpc3QuCi0JICovCi0JR0ZYX0Rpc3BsYXkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheSk7Ci0JaWYgKCBHRlhfRGlzcGxheSA9PSBOVUxMICkgewotCQlYQ2xvc2VEaXNwbGF5KFNETF9EaXNwbGF5KTsKLQkJU0RMX0Rpc3BsYXkgPSBOVUxMOwotCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gWDExIGRpc3BsYXkiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQkvKiBTZXQgdGhlIG5vcm1hbCBYIGVycm9yIGhhbmRsZXIgKi8KLQlYX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHhfZXJyaGFuZGxlcik7Ci0KLQkvKiBTZXQgdGhlIGVycm9yIGhhbmRsZXIgaWYgd2UgbG9zZSB0aGUgWCBkaXNwbGF5ICovCi0JWElPX2hhbmRsZXIgPSBYU2V0SU9FcnJvckhhbmRsZXIoeGlvX2VycmhhbmRsZXIpOwotCi0JLyogU2V0IHRoZSBYIGV4dGVuc2lvbiBlcnJvciBoYW5kbGVyICovCi0JWGV4dF9oYW5kbGVyID0gWFNldEV4dGVuc2lvbkVycm9ySGFuZGxlcih4ZXh0X2VycmhhbmRsZXIpOwotCi0JLyogdXNlIGRlZmF1bHQgc2NyZWVuIChmcm9tICRESVNQTEFZKSAqLwotCVNETF9TY3JlZW4gPSBEZWZhdWx0U2NyZWVuKFNETF9EaXNwbGF5KTsKLQotI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCi0JLyogQ2hlY2sgZm9yIE1JVCBzaGFyZWQgbWVtb3J5IGV4dGVuc2lvbiAqLwotCXVzZV9taXRzaG0gPSAwOwotCWlmICggbG9jYWxfWDExICkgewotCQl1c2VfbWl0c2htID0gWFNobVF1ZXJ5RXh0ZW5zaW9uKFNETF9EaXNwbGF5KTsKLQl9Ci0jZW5kaWYgLyogTk9fU0hBUkVEX01FTU9SWSAqLwotCi0JLyogR2V0IHRoZSBhdmFpbGFibGUgdmlkZW8gbW9kZXMgKi8KLQlpZihYMTFfR2V0VmlkZW9Nb2Rlcyh0aGlzKSA8IDApIHsKLQkJWENsb3NlRGlzcGxheShHRlhfRGlzcGxheSk7Ci0JCUdGWF9EaXNwbGF5ID0gTlVMTDsKLQkJWENsb3NlRGlzcGxheShTRExfRGlzcGxheSk7Ci0JCVNETF9EaXNwbGF5ID0gTlVMTDsKLQkgICAgcmV0dXJuIC0xOwotCX0KLQotCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLwotCXRoaXMtPmluZm8uY3VycmVudF93ID0gRGlzcGxheVdpZHRoKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKLQl0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IERpc3BsYXlIZWlnaHQoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOwotCi0JLyogRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHNjcmVlbiBkZXB0aDoKLQkgICBVc2UgdGhlIGRlZmF1bHQgdmlzdWFsIChvciBhdCBsZWFzdCBvbmUgd2l0aCB0aGUgc2FtZSBkZXB0aCkgKi8KLQlTRExfRGlzcGxheUNvbG9ybWFwID0gRGVmYXVsdENvbG9ybWFwKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKLQlmb3IoaSA9IDA7IGkgPCB0aGlzLT5oaWRkZW4tPm52aXN1YWxzOyBpKyspCi0JICAgIGlmKHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5kZXB0aCA9PSBEZWZhdWx0RGVwdGgoU0RMX0Rpc3BsYXksCi0JCQkJCQkJICAgICAgU0RMX1NjcmVlbikpCi0JCWJyZWFrOwotCWlmKGkgPT0gdGhpcy0+aGlkZGVuLT5udmlzdWFscykgewotCSAgICAvKiBkZWZhdWx0IHZpc3VhbCB3YXMgdXNlbGVzcywgdGFrZSB0aGUgZGVlcGVzdCBvbmUgaW5zdGVhZCAqLwotCSAgICBpID0gMDsKLQl9Ci0JU0RMX1Zpc3VhbCA9IHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS52aXN1YWw7Ci0JaWYgKCBTRExfVmlzdWFsID09IERlZmF1bHRWaXN1YWwoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pICkgewotCSAgICBTRExfWENvbG9yTWFwID0gU0RMX0Rpc3BsYXlDb2xvcm1hcDsKLQl9IGVsc2UgewotCSAgICBTRExfWENvbG9yTWFwID0gWENyZWF0ZUNvbG9ybWFwKFNETF9EaXNwbGF5LCBTRExfUm9vdCwKLQkJCQkJICAgIFNETF9WaXN1YWwsIEFsbG9jTm9uZSk7Ci0JfQotCXRoaXMtPmhpZGRlbi0+ZGVwdGggPSB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uZGVwdGg7Ci0JdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLmJwcDsKLQlpZiAoIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCA+IDggKSB7Ci0JCXZmb3JtYXQtPlJtYXNrID0gU0RMX1Zpc3VhbC0+cmVkX21hc2s7Ci0JICAJdmZvcm1hdC0+R21hc2sgPSBTRExfVmlzdWFsLT5ncmVlbl9tYXNrOwotCSAgCXZmb3JtYXQtPkJtYXNrID0gU0RMX1Zpc3VhbC0+Ymx1ZV9tYXNrOwotCX0KLQlpZiAoIHRoaXMtPmhpZGRlbi0+ZGVwdGggPT0gMzIgKSB7Ci0JCXZmb3JtYXQtPkFtYXNrID0gKDB4RkZGRkZGRkYgJiB+KHZmb3JtYXQtPlJtYXNrfHZmb3JtYXQtPkdtYXNrfHZmb3JtYXQtPkJtYXNrKSk7Ci0JfQotCVgxMV9TYXZlVmlkTW9kZUdhbW1hKHRoaXMpOwotCi0JLyogU2F2ZSBEUE1TIGFuZCBzY3JlZW5zYXZlciBzZXR0aW5ncyAqLwotCVgxMV9TYXZlU2NyZWVuU2F2ZXIoU0RMX0Rpc3BsYXksICZzY3JlZW5zYXZlcl90aW1lb3V0LCAmZHBtc19lbmFibGVkKTsKLQlYMTFfRGlzYWJsZVNjcmVlblNhdmVyKHRoaXMsIFNETF9EaXNwbGF5KTsKLQotCS8qIFNlZSBpZiB3ZSBoYXZlIGJlZW4gcGFzc2VkIGEgd2luZG93IHRvIHVzZSAqLwotCVNETF93aW5kb3dpZCA9IFNETF9nZXRlbnYoIlNETF9XSU5ET1dJRCIpOwotCi0JLyogQ3JlYXRlIHRoZSBmdWxsc2NyZWVuIGFuZCBtYW5hZ2VkIHdpbmRvd3MgKi8KLQljcmVhdGVfYXV4X3dpbmRvd3ModGhpcyk7Ci0KLQkvKiBDcmVhdGUgdGhlIGJsYW5rIGN1cnNvciAqLwotCVNETF9CbGFua0N1cnNvciA9IHRoaXMtPkNyZWF0ZVdNQ3Vyc29yKHRoaXMsIGJsYW5rX2NkYXRhLCBibGFua19jbWFzaywKLQkJCQkJQkxBTktfQ1dJRFRILCBCTEFOS19DSEVJR0hULAotCQkJCQkJQkxBTktfQ0hPVFgsIEJMQU5LX0NIT1RZKTsKLQotCS8qIEZpbGwgaW4gc29tZSB3aW5kb3cgbWFuYWdlciBjYXBhYmlsaXRpZXMgKi8KLQl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDE7Ci0KLQkvKiBBbGxvdyBlbnZpcm9ubWVudCBvdmVycmlkZSBvZiBzY3JlZW5zYXZlciBkaXNhYmxlLiAqLwotCWVudiA9IFNETF9nZXRlbnYoIlNETF9WSURFT19BTExPV19TQ1JFRU5TQVZFUiIpOwotCXRoaXMtPmhpZGRlbi0+YWxsb3dfc2NyZWVuc2F2ZXIgPSAoIChlbnYgJiYgU0RMX2F0b2koZW52KSkgPyAxIDogMCApOwotCi0JLyogV2UncmUgZG9uZSEgKi8KLQlYRmx1c2goU0RMX0Rpc3BsYXkpOwotCXJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgWDExX0Rlc3Ryb3lXaW5kb3coX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4pCi17Ci0JLyogQ2xlYW4gdXAgT3BlbkdMICovCi0JaWYgKCBzY3JlZW4gKSB7Ci0JCXNjcmVlbi0+ZmxhZ3MgJj0gfihTRExfT1BFTkdMfFNETF9PUEVOR0xCTElUKTsKLQl9Ci0JWDExX0dMX1NodXRkb3duKHRoaXMpOwotCi0JaWYgKCAhIFNETF93aW5kb3dpZCApIHsKLQkJLyogSGlkZSB0aGUgbWFuYWdlZCB3aW5kb3cgKi8KLQkJaWYgKCBXTXdpbmRvdyApIHsKLQkJCVhVbm1hcFdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3cpOwotCQl9Ci0JCWlmICggc2NyZWVuICYmIChzY3JlZW4tPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkgewotCQkJc2NyZWVuLT5mbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0JCQlYMTFfTGVhdmVGdWxsU2NyZWVuKHRoaXMpOwotCQl9Ci0KLQkJLyogRGVzdHJveSB0aGUgb3V0cHV0IHdpbmRvdyAqLwotCQlpZiAoIFNETF9XaW5kb3cgKSB7Ci0JCQlYRGVzdHJveVdpbmRvdyhTRExfRGlzcGxheSwgU0RMX1dpbmRvdyk7Ci0JCX0KLQotCQkvKiBGcmVlIHRoZSBjb2xvcm1hcCBlbnRyaWVzICovCi0JCWlmICggU0RMX1hQaXhlbHMgKSB7Ci0JCQlpbnQgbnVtY29sb3JzOwotCQkJdW5zaWduZWQgbG9uZyBwaXhlbDsKLQkJCW51bWNvbG9ycyA9IFNETF9WaXN1YWwtPm1hcF9lbnRyaWVzOwotCQkJZm9yICggcGl4ZWw9MDsgcGl4ZWw8bnVtY29sb3JzOyArK3BpeGVsICkgewotCQkJCXdoaWxlICggU0RMX1hQaXhlbHNbcGl4ZWxdID4gMCApIHsKLQkJCQkJWEZyZWVDb2xvcnMoR0ZYX0Rpc3BsYXksCi0JCQkJCQlTRExfRGlzcGxheUNvbG9ybWFwLCZwaXhlbCwxLDApOwotCQkJCQktLVNETF9YUGl4ZWxzW3BpeGVsXTsKLQkJCQl9Ci0JCQl9Ci0JCQlTRExfZnJlZShTRExfWFBpeGVscyk7Ci0JCQlTRExfWFBpeGVscyA9IE5VTEw7Ci0JCX0KLQotCQkvKiBGcmVlIHRoZSBncmFwaGljcyBjb250ZXh0ICovCi0JCWlmICggU0RMX0dDICkgewotCQkJWEZyZWVHQyhTRExfRGlzcGxheSwgU0RMX0dDKTsKLQkJCVNETF9HQyA9IDA7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBTRExfYm9vbCBYMTFfV2luZG93UG9zaXRpb24oX1RISVMsIGludCAqeCwgaW50ICp5LCBpbnQgdywgaW50IGgpCi17Ci0JY29uc3QgY2hhciAqd2luZG93ID0gU0RMX2dldGVudigiU0RMX1ZJREVPX1dJTkRPV19QT1MiKTsKLQljb25zdCBjaGFyICpjZW50ZXIgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fQ0VOVEVSRUQiKTsKLQlpZiAoIHdpbmRvdyApIHsKLQkJaWYgKCBTRExfc3NjYW5mKHdpbmRvdywgIiVkLCVkIiwgeCwgeSkgPT0gMiApIHsKLQkJCXJldHVybiBTRExfVFJVRTsKLQkJfQotCQlpZiAoIFNETF9zdHJjbXAod2luZG93LCAiY2VudGVyIikgPT0gMCApIHsKLQkJCWNlbnRlciA9IHdpbmRvdzsKLQkJfQotCX0KLQlpZiAoIGNlbnRlciApIHsKLQkJKnggPSAoRGlzcGxheVdpZHRoKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKSAtIHcpLzI7Ci0JCSp5ID0gKERpc3BsYXlIZWlnaHQoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pIC0gaCkvMjsKLQkJcmV0dXJuIFNETF9UUlVFOwotCX0KLQlyZXR1cm4gU0RMX0ZBTFNFOwotfQotCi1zdGF0aWMgdm9pZCBYMTFfU2V0U2l6ZUhpbnRzKF9USElTLCBpbnQgdywgaW50IGgsIFVpbnQzMiBmbGFncykKLXsKLQlYU2l6ZUhpbnRzICpoaW50czsKLQotCWhpbnRzID0gWEFsbG9jU2l6ZUhpbnRzKCk7Ci0JaWYgKCBoaW50cyApIHsKLQkJaWYgKCBmbGFncyAmIFNETF9SRVNJWkFCTEUgKSB7Ci0JCQloaW50cy0+bWluX3dpZHRoID0gMzI7Ci0JCQloaW50cy0+bWluX2hlaWdodCA9IDMyOwotCQkJaGludHMtPm1heF9oZWlnaHQgPSA0MDk2OwotCQkJaGludHMtPm1heF93aWR0aCA9IDQwOTY7Ci0JCX0gZWxzZSB7Ci0JCQloaW50cy0+bWluX3dpZHRoID0gaGludHMtPm1heF93aWR0aCA9IHc7Ci0JCQloaW50cy0+bWluX2hlaWdodCA9IGhpbnRzLT5tYXhfaGVpZ2h0ID0gaDsKLQkJfQotCQloaW50cy0+ZmxhZ3MgPSBQTWF4U2l6ZSB8IFBNaW5TaXplOwotCQlpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7Ci0JCQloaW50cy0+eCA9IDA7Ci0JCQloaW50cy0+eSA9IDA7Ci0JCQloaW50cy0+ZmxhZ3MgfD0gVVNQb3NpdGlvbjsKLQkJfSBlbHNlCi0JCS8qIENlbnRlciBpdCwgaWYgZGVzaXJlZCAqLwotCQlpZiAoIFgxMV9XaW5kb3dQb3NpdGlvbih0aGlzLCAmaGludHMtPngsICZoaW50cy0+eSwgdywgaCkgKSB7Ci0JCQloaW50cy0+ZmxhZ3MgfD0gVVNQb3NpdGlvbjsKLQkJCVhNb3ZlV2luZG93KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgaGludHMtPngsIGhpbnRzLT55KTsKLQotCQkJLyogRmx1c2ggdGhlIHJlc2l6ZSBldmVudCBzbyB3ZSBkb24ndCBjYXRjaCBpdCBsYXRlciAqLwotCQkJWFN5bmMoU0RMX0Rpc3BsYXksIFRydWUpOwotCQl9Ci0JCVhTZXRXTU5vcm1hbEhpbnRzKFNETF9EaXNwbGF5LCBXTXdpbmRvdywgaGludHMpOwotCQlYRnJlZShoaW50cyk7Ci0JfQotCi0JLyogUmVzcGVjdCB0aGUgd2luZG93IGNhcHRpb24gc3R5bGUgKi8KLQlpZiAoIGZsYWdzICYgU0RMX05PRlJBTUUgKSB7Ci0JCVNETF9ib29sIHNldDsKLQkJQXRvbSBXTV9ISU5UUzsKLQotCQkvKiBXZSBoYXZlbid0IG1vZGlmaWVkIHRoZSB3aW5kb3cgbWFuYWdlciBoaW50cyB5ZXQgKi8KLQkJc2V0ID0gU0RMX0ZBTFNFOwotCi0JCS8qIEZpcnN0IHRyeSB0byBzZXQgTVdNIGhpbnRzICovCi0JCVdNX0hJTlRTID0gWEludGVybkF0b20oU0RMX0Rpc3BsYXksICJfTU9USUZfV01fSElOVFMiLCBUcnVlKTsKLQkJaWYgKCBXTV9ISU5UUyAhPSBOb25lICkgewotCQkJLyogSGludHMgdXNlZCBieSBNb3RpZiBjb21wbGlhbnQgd2luZG93IG1hbmFnZXJzICovCi0JCQlzdHJ1Y3QgewotCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCQkJdW5zaWduZWQgbG9uZyBmdW5jdGlvbnM7Ci0JCQkJdW5zaWduZWQgbG9uZyBkZWNvcmF0aW9uczsKLQkJCQlsb25nIGlucHV0X21vZGU7Ci0JCQkJdW5zaWduZWQgbG9uZyBzdGF0dXM7Ci0JCQl9IE1XTUhpbnRzID0geyAoMUwgPDwgMSksIDAsIDAsIDAsIDAgfTsKLQotCQkJWENoYW5nZVByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywKLQkJCSAgICAgICAgICAgICAgICBXTV9ISU5UUywgV01fSElOVFMsIDMyLAotCQkJICAgICAgICAgICAgICAgIFByb3BNb2RlUmVwbGFjZSwKLQkJCQkJKHVuc2lnbmVkIGNoYXIgKikmTVdNSGludHMsCi0JCQkJCXNpemVvZihNV01IaW50cykvc2l6ZW9mKGxvbmcpKTsKLQkJCXNldCA9IFNETF9UUlVFOwotCQl9Ci0JCS8qIE5vdyB0cnkgdG8gc2V0IEtXTSBoaW50cyAqLwotCQlXTV9ISU5UUyA9IFhJbnRlcm5BdG9tKFNETF9EaXNwbGF5LCAiS1dNX1dJTl9ERUNPUkFUSU9OIiwgVHJ1ZSk7Ci0JCWlmICggV01fSElOVFMgIT0gTm9uZSApIHsKLQkJCWxvbmcgS1dNSGludHMgPSAwOwotCi0JCQlYQ2hhbmdlUHJvcGVydHkoU0RMX0Rpc3BsYXksIFdNd2luZG93LAotCQkJICAgICAgICAgICAgICAgIFdNX0hJTlRTLCBXTV9ISU5UUywgMzIsCi0JCQkgICAgICAgICAgICAgICAgUHJvcE1vZGVSZXBsYWNlLAotCQkJCQkodW5zaWduZWQgY2hhciAqKSZLV01IaW50cywKLQkJCQkJc2l6ZW9mKEtXTUhpbnRzKS9zaXplb2YobG9uZykpOwotCQkJc2V0ID0gU0RMX1RSVUU7Ci0JCX0KLQkJLyogTm93IHRyeSB0byBzZXQgR05PTUUgaGludHMgKi8KLQkJV01fSElOVFMgPSBYSW50ZXJuQXRvbShTRExfRGlzcGxheSwgIl9XSU5fSElOVFMiLCBUcnVlKTsKLQkJaWYgKCBXTV9ISU5UUyAhPSBOb25lICkgewotCQkJbG9uZyBHTk9NRUhpbnRzID0gMDsKLQotCQkJWENoYW5nZVByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywKLQkJCSAgICAgICAgICAgICAgICBXTV9ISU5UUywgV01fSElOVFMsIDMyLAotCQkJICAgICAgICAgICAgICAgIFByb3BNb2RlUmVwbGFjZSwKLQkJCQkJKHVuc2lnbmVkIGNoYXIgKikmR05PTUVIaW50cywKLQkJCQkJc2l6ZW9mKEdOT01FSGludHMpL3NpemVvZihsb25nKSk7Ci0JCQlzZXQgPSBTRExfVFJVRTsKLQkJfQotCQkvKiBGaW5hbGx5IHNldCB0aGUgdHJhbnNpZW50IGhpbnRzIGlmIG5lY2Vzc2FyeSAqLwotCQlpZiAoICEgc2V0ICkgewotCQkJWFNldFRyYW5zaWVudEZvckhpbnQoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBTRExfUm9vdCk7Ci0JCX0KLQl9IGVsc2UgewotCQlTRExfYm9vbCBzZXQ7Ci0JCUF0b20gV01fSElOVFM7Ci0KLQkJLyogV2UgaGF2ZW4ndCBtb2RpZmllZCB0aGUgd2luZG93IG1hbmFnZXIgaGludHMgeWV0ICovCi0JCXNldCA9IFNETF9GQUxTRTsKLQotCQkvKiBGaXJzdCB0cnkgdG8gdW5zZXQgTVdNIGhpbnRzICovCi0JCVdNX0hJTlRTID0gWEludGVybkF0b20oU0RMX0Rpc3BsYXksICJfTU9USUZfV01fSElOVFMiLCBUcnVlKTsKLQkJaWYgKCBXTV9ISU5UUyAhPSBOb25lICkgewotCQkJWERlbGV0ZVByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgV01fSElOVFMpOwotCQkJc2V0ID0gU0RMX1RSVUU7Ci0JCX0KLQkJLyogTm93IHRyeSB0byB1bnNldCBLV00gaGludHMgKi8KLQkJV01fSElOVFMgPSBYSW50ZXJuQXRvbShTRExfRGlzcGxheSwgIktXTV9XSU5fREVDT1JBVElPTiIsIFRydWUpOwotCQlpZiAoIFdNX0hJTlRTICE9IE5vbmUgKSB7Ci0JCQlYRGVsZXRlUHJvcGVydHkoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBXTV9ISU5UUyk7Ci0JCQlzZXQgPSBTRExfVFJVRTsKLQkJfQotCQkvKiBOb3cgdHJ5IHRvIHVuc2V0IEdOT01FIGhpbnRzICovCi0JCVdNX0hJTlRTID0gWEludGVybkF0b20oU0RMX0Rpc3BsYXksICJfV0lOX0hJTlRTIiwgVHJ1ZSk7Ci0JCWlmICggV01fSElOVFMgIT0gTm9uZSApIHsKLQkJCVhEZWxldGVQcm9wZXJ0eShTRExfRGlzcGxheSwgV013aW5kb3csIFdNX0hJTlRTKTsKLQkJCXNldCA9IFNETF9UUlVFOwotCQl9Ci0JCS8qIEZpbmFsbHkgdW5zZXQgdGhlIHRyYW5zaWVudCBoaW50cyBpZiBuZWNlc3NhcnkgKi8KLQkJaWYgKCAhIHNldCApIHsKLQkJCS8qIE5PVEU6IERvZXMgdGhpcyB3b3JrPyAqLwotCQkJWFNldFRyYW5zaWVudEZvckhpbnQoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBOb25lKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBYMTFfQ3JlYXRlV2luZG93KF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuLAotCQkJICAgIGludCB3LCBpbnQgaCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQotewotCWludCBpLCBkZXB0aDsKLQlWaXN1YWwgKnZpczsKLQlpbnQgdmlzX2NoYW5nZTsKLQlVaW50MzIgQW1hc2s7Ci0KLQkvKiBJZiBhIHdpbmRvdyBpcyBhbHJlYWR5IHByZXNlbnQsIGRlc3Ryb3kgaXQgYW5kIHN0YXJ0IGZyZXNoICovCi0JaWYgKCBTRExfV2luZG93ICkgewotCQlYMTFfRGVzdHJveVdpbmRvdyh0aGlzLCBzY3JlZW4pOwotCQlzd2l0Y2hfd2FpdGluZyA9IDA7IC8qIFByZXZlbnQganVtcCBiYWNrIHRvIG5vdy1tZWFuaW5nbGVzcyBzdGF0ZS4gKi8KLQl9Ci0KLQkvKiBTZWUgaWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgd2luZG93IGlkICovCi0JaWYgKCBTRExfd2luZG93aWQgKSB7Ci0JCVNETF9XaW5kb3cgPSBTRExfc3RydG9sKFNETF93aW5kb3dpZCwgTlVMTCwgMCk7Ci0JfSBlbHNlIHsKLQkJU0RMX1dpbmRvdyA9IDA7Ci0JfQotCi0JLyogZmluZCBvdXQgd2hpY2ggdmlzdWFsIHdlIGFyZSBnb2luZyB0byB1c2UgKi8KLQlpZiAoIGZsYWdzICYgU0RMX09QRU5HTCApIHsKLQkJWFZpc3VhbEluZm8gKnZpOwotCi0JCXZpID0gWDExX0dMX0dldFZpc3VhbCh0aGlzKTsKLQkJaWYoICF2aSApIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQl2aXMgPSB2aS0+dmlzdWFsOwotCQlkZXB0aCA9IHZpLT5kZXB0aDsKLQl9IGVsc2UgaWYgKCBTRExfd2luZG93aWQgKSB7Ci0JCVhXaW5kb3dBdHRyaWJ1dGVzIGE7Ci0KLQkJWEdldFdpbmRvd0F0dHJpYnV0ZXMoU0RMX0Rpc3BsYXksIFNETF9XaW5kb3csICZhKTsKLQkJdmlzID0gYS52aXN1YWw7Ci0JCWRlcHRoID0gYS5kZXB0aDsKLQl9IGVsc2UgewotCQlmb3IgKCBpID0gMDsgaSA8IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHM7IGkrKyApIHsKLQkJCWlmICggdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLmJwcCA9PSBicHAgKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICggaSA9PSB0aGlzLT5oaWRkZW4tPm52aXN1YWxzICkgewotCQkJU0RMX1NldEVycm9yKCJObyBtYXRjaGluZyB2aXN1YWwgZm9yIHJlcXVlc3RlZCBkZXB0aCIpOwotCQkJcmV0dXJuIC0xOwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0JCX0KLQkJdmlzID0gdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLnZpc3VhbDsKLQkJZGVwdGggPSB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uZGVwdGg7Ci0JfQotI2lmZGVmIFgxMV9ERUJVRwotICAgICAgICBwcmludGYoIkNob29zaW5nICVzIHZpc3VhbCBhdCAlZCBicHAgLSAlZCBjb2xvcm1hcCBlbnRyaWVzXG4iLCB2aXMtPmNsYXNzID09IFBzZXVkb0NvbG9yID8gIlBzZXVkb0NvbG9yIiA6ICh2aXMtPmNsYXNzID09IFRydWVDb2xvciA/ICJUcnVlQ29sb3IiIDogKHZpcy0+Y2xhc3MgPT0gRGlyZWN0Q29sb3IgPyAiRGlyZWN0Q29sb3IiIDogIlVua25vd24iKSksIGRlcHRoLCB2aXMtPm1hcF9lbnRyaWVzKTsKLSNlbmRpZgotCXZpc19jaGFuZ2UgPSAodmlzICE9IFNETF9WaXN1YWwpOwotCVNETF9WaXN1YWwgPSB2aXM7Ci0JdGhpcy0+aGlkZGVuLT5kZXB0aCA9IGRlcHRoOwotCi0JLyogQWxsb2NhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHRoaXMgdmlkZW8gbW9kZSAqLwotCWlmICggdGhpcy0+aGlkZGVuLT5kZXB0aCA9PSAzMiApIHsKLQkJQW1hc2sgPSAoMHhGRkZGRkZGRiAmIH4odmlzLT5yZWRfbWFza3x2aXMtPmdyZWVuX21hc2t8dmlzLT5ibHVlX21hc2spKTsKLQl9IGVsc2UgewotCQlBbWFzayA9IDA7Ci0JfQotCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChzY3JlZW4sIGJwcCwKLQkJCXZpcy0+cmVkX21hc2ssIHZpcy0+Z3JlZW5fbWFzaywgdmlzLT5ibHVlX21hc2ssIEFtYXNrKSApIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY29sb3JtYXAgKi8KLQlpZiAoIFNETF9YQ29sb3JNYXAgIT0gU0RMX0Rpc3BsYXlDb2xvcm1hcCApIHsKLQkJWEZyZWVDb2xvcm1hcChTRExfRGlzcGxheSwgU0RMX1hDb2xvck1hcCk7Ci0JfQotCWlmICggU0RMX1Zpc3VhbC0+Y2xhc3MgPT0gUHNldWRvQ29sb3IgKSB7Ci0JICAgIGludCBuY29sb3JzOwotCi0JICAgIC8qIEFsbG9jYXRlIHRoZSBwaXhlbCBmbGFncyAqLwotCSAgICBuY29sb3JzID0gU0RMX1Zpc3VhbC0+bWFwX2VudHJpZXM7Ci0JICAgIFNETF9YUGl4ZWxzID0gU0RMX21hbGxvYyhuY29sb3JzICogc2l6ZW9mKGludCkpOwotCSAgICBpZihTRExfWFBpeGVscyA9PSBOVUxMKSB7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQkgICAgU0RMX21lbXNldChTRExfWFBpeGVscywgMCwgbmNvbG9ycyAqIHNpemVvZigqU0RMX1hQaXhlbHMpKTsKLQotCSAgICAvKiBhbHdheXMgYWxsb2NhdGUgYSBwcml2YXRlIGNvbG9ybWFwIG9uIG5vbi1kZWZhdWx0IHZpc3VhbHMgKi8KLQkgICAgaWYgKCBTRExfVmlzdWFsICE9IERlZmF1bHRWaXN1YWwoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pICkgewotCQlmbGFncyB8PSBTRExfSFdQQUxFVFRFOwotCSAgICB9Ci0JICAgIGlmICggZmxhZ3MgJiBTRExfSFdQQUxFVFRFICkgewotCQlzY3JlZW4tPmZsYWdzIHw9IFNETF9IV1BBTEVUVEU7Ci0JCVNETF9YQ29sb3JNYXAgPSBYQ3JlYXRlQ29sb3JtYXAoU0RMX0Rpc3BsYXksIFNETF9Sb290LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9WaXN1YWwsIEFsbG9jQWxsKTsKLQkgICAgfSBlbHNlIHsKLQkJU0RMX1hDb2xvck1hcCA9IFNETF9EaXNwbGF5Q29sb3JtYXA7Ci0JICAgIH0KLQl9IGVsc2UgaWYgKCBTRExfVmlzdWFsLT5jbGFzcyA9PSBEaXJlY3RDb2xvciApIHsKLQotCSAgICAvKiBDcmVhdGUgYSBjb2xvcm1hcCB3aGljaCB3ZSBjYW4gbWFuaXB1bGF0ZSBmb3IgZ2FtbWEgKi8KLQkgICAgU0RMX1hDb2xvck1hcCA9IFhDcmVhdGVDb2xvcm1hcChTRExfRGlzcGxheSwgU0RMX1Jvb3QsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfVmlzdWFsLCBBbGxvY0FsbCk7Ci0gICAgICAgICAgICBYU3luYyhTRExfRGlzcGxheSwgRmFsc2UpOwotCi0JICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbG9ybWFwIHRvIHRoZSBpZGVudGl0eSBtYXBwaW5nICovCi0JICAgIFNETF9HZXRHYW1tYVJhbXAoMCwgMCwgMCk7Ci0JICAgIHRoaXMtPnNjcmVlbiA9IHNjcmVlbjsKLQkgICAgWDExX1NldEdhbW1hUmFtcCh0aGlzLCB0aGlzLT5nYW1tYSk7Ci0JICAgIHRoaXMtPnNjcmVlbiA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkgICAgLyogQ3JlYXRlIGEgcmVhZC1vbmx5IGNvbG9ybWFwIGZvciBvdXIgd2luZG93ICovCi0JICAgIFNETF9YQ29sb3JNYXAgPSBYQ3JlYXRlQ29sb3JtYXAoU0RMX0Rpc3BsYXksIFNETF9Sb290LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9WaXN1YWwsIEFsbG9jTm9uZSk7Ci0JfQotCi0JLyogUmVjcmVhdGUgdGhlIGF1eGlsaWFyeSB3aW5kb3dzLCBpZiBuZWVkZWQgKHJlcXVpcmVkIGZvciBHTCkgKi8KLQlpZiAoIHZpc19jaGFuZ2UgKQotCSAgICBjcmVhdGVfYXV4X3dpbmRvd3ModGhpcyk7Ci0KLQlpZihzY3JlZW4tPmZsYWdzICYgU0RMX0hXUEFMRVRURSkgewotCSAgICAvKiBTaW5jZSB0aGUgZnVsbC1zY3JlZW4gd2luZG93IG1pZ2h0IGhhdmUgZ290IGEgbm9uemVybyBiYWNrZ3JvdW5kCi0JICAgICAgIGNvbG91ciAoMCBpcyB3aGl0ZSBvbiBzb21lIGRpc3BsYXlzKSwgd2Ugc2hvdWxkIHJlc2V0IHRoZQotCSAgICAgICBiYWNrZ3JvdW5kIHRvIDAgaGVyZSBzaW5jZSB0aGF0IGlzIHdoYXQgdGhlIHVzZXIgZXhwZWN0cwotCSAgICAgICB3aXRoIGEgcHJpdmF0ZSBjb2xvcm1hcCAqLwotCSAgICBYU2V0V2luZG93QmFja2dyb3VuZChTRExfRGlzcGxheSwgRlN3aW5kb3csIDApOwotCSAgICBYQ2xlYXJXaW5kb3coU0RMX0Rpc3BsYXksIEZTd2luZG93KTsKLQl9Ci0KLQkvKiByZXNpemUgdGhlIChwb3NzaWJseSBuZXcpIHdpbmRvdyBtYW5hZ2VyIHdpbmRvdyAqLwotCWlmKCAhU0RMX3dpbmRvd2lkICkgewotCSAgICAgICAgWDExX1NldFNpemVIaW50cyh0aGlzLCB3LCBoLCBmbGFncyk7Ci0JCXdpbmRvd193ID0gdzsKLQkJd2luZG93X2ggPSBoOwotCQlYUmVzaXplV2luZG93KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgdywgaCk7Ci0JfQotCi0JLyogQ3JlYXRlIChvciB1c2UpIHRoZSBYMTEgZGlzcGxheSB3aW5kb3cgKi8KLQlpZiAoICFTRExfd2luZG93aWQgKSB7Ci0JCWlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgewotCQkJaWYgKCBYMTFfR0xfQ3JlYXRlV2luZG93KHRoaXMsIHcsIGgpIDwgMCApIHsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJWFNldFdpbmRvd0F0dHJpYnV0ZXMgc3dhOwotCi0JCQlzd2EuYmFja2dyb3VuZF9waXhlbCA9IDA7Ci0JCQlzd2EuYm9yZGVyX3BpeGVsID0gMDsKLQkJCXN3YS5jb2xvcm1hcCA9IFNETF9YQ29sb3JNYXA7Ci0JCQlTRExfV2luZG93ID0gWENyZWF0ZVdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3csCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgIAkwLCAwLCB3LCBoLCAwLCBkZXB0aCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgCUlucHV0T3V0cHV0LCBTRExfVmlzdWFsLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAJQ1dCYWNrUGl4ZWwgfCBDV0JvcmRlclBpeGVsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgIAl8IENXQ29sb3JtYXAsICZzd2EpOwotCQl9Ci0JCS8qIE9ubHkgbWFuYWdlIG91ciBpbnB1dCBpZiB3ZSBvd24gdGhlIHdpbmRvdyAqLwotCQlYU2VsZWN0SW5wdXQoU0RMX0Rpc3BsYXksIFNETF9XaW5kb3csCi0JCQkJCSggRW50ZXJXaW5kb3dNYXNrIHwgTGVhdmVXaW5kb3dNYXNrCi0JCQkJCXwgQnV0dG9uUHJlc3NNYXNrIHwgQnV0dG9uUmVsZWFzZU1hc2sKLQkJCQkJfCBQb2ludGVyTW90aW9uTWFzayB8IEV4cG9zdXJlTWFzayApKTsKLQl9Ci0JLyogQ3JlYXRlIHRoZSBncmFwaGljcyBjb250ZXh0IGhlcmUsIG9uY2Ugd2UgaGF2ZSBhIHdpbmRvdyAqLwotCWlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgewotCQlpZiAoIFgxMV9HTF9DcmVhdGVDb250ZXh0KHRoaXMpIDwgMCApIHsKLQkJCXJldHVybigtMSk7Ci0JCX0gZWxzZSB7Ci0JCQlzY3JlZW4tPmZsYWdzIHw9IFNETF9PUEVOR0w7Ci0JCX0KLQl9IGVsc2UgewotCQlYR0NWYWx1ZXMgZ2N2OwotCi0JCWdjdi5ncmFwaGljc19leHBvc3VyZXMgPSBGYWxzZTsKLQkJU0RMX0dDID0gWENyZWF0ZUdDKFNETF9EaXNwbGF5LCBTRExfV2luZG93LAotCQkgICAgICAgICAgICAgICAgICAgR0NHcmFwaGljc0V4cG9zdXJlcywgJmdjdik7Ci0JCWlmICggISBTRExfR0MgKSB7Ci0JCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBncmFwaGljcyBjb250ZXh0Iik7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JfQotCi0JLyogU2V0IG91ciBjb2xvcm1hcHMgd2hlbiBub3Qgc2V0dGluZyBhIEdMIG1vZGUgKi8KLQlpZiAoICEgKGZsYWdzICYgU0RMX09QRU5HTCkgKSB7Ci0JCVhTZXRXaW5kb3dDb2xvcm1hcChTRExfRGlzcGxheSwgU0RMX1dpbmRvdywgU0RMX1hDb2xvck1hcCk7Ci0JCWlmKCAhU0RMX3dpbmRvd2lkICkgewotCQkgICAgWFNldFdpbmRvd0NvbG9ybWFwKFNETF9EaXNwbGF5LCBGU3dpbmRvdywgU0RMX1hDb2xvck1hcCk7Ci0JCSAgICBYU2V0V2luZG93Q29sb3JtYXAoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBTRExfWENvbG9yTWFwKTsKLQkJfQotCX0KLQotI2lmIDAgLyogVGhpcyBpcyBhbiBleHBlcmltZW50IC0gYXJlIHRoZSBncmFwaGljcyBmYXN0ZXIgbm93PyAtIG5vcGUuICovCi0JaWYgKCBTRExfZ2V0ZW52KCJTRExfVklERU9fWDExX0JBQ0tJTkdTVE9SRSIpICkKLSNlbmRpZgotCS8qIENhY2hlIHRoZSB3aW5kb3cgaW4gdGhlIHNlcnZlciwgd2hlbiBwb3NzaWJsZSAqLwotCXsKLQkJU2NyZWVuICp4c2NyZWVuOwotCQlYU2V0V2luZG93QXR0cmlidXRlcyBhOwotCi0JCXhzY3JlZW4gPSBTY3JlZW5PZkRpc3BsYXkoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOwotCQlhLmJhY2tpbmdfc3RvcmUgPSBEb2VzQmFja2luZ1N0b3JlKHhzY3JlZW4pOwotCQlpZiAoIGEuYmFja2luZ19zdG9yZSAhPSBOb3RVc2VmdWwgKSB7Ci0JCQlYQ2hhbmdlV2luZG93QXR0cmlidXRlcyhTRExfRGlzcGxheSwgU0RMX1dpbmRvdywKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIENXQmFja2luZ1N0b3JlLCAmYSk7Ci0JCX0KLQl9Ci0KLQkvKiBNYXAgdGhlbSBib3RoIGFuZCBnbyBmdWxsc2NyZWVuLCBpZiByZXF1ZXN0ZWQgKi8KLQlpZiAoICEgU0RMX3dpbmRvd2lkICkgewotCQlYTWFwV2luZG93KFNETF9EaXNwbGF5LCBTRExfV2luZG93KTsKLQkJWE1hcFdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3cpOwotCQlYMTFfV2FpdE1hcHBlZCh0aGlzLCBXTXdpbmRvdyk7Ci0JCWlmICggZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKLQkJCXNjcmVlbi0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47Ci0JCQlYMTFfRW50ZXJGdWxsU2NyZWVuKHRoaXMpOwotCQl9IGVsc2UgewotCQkJc2NyZWVuLT5mbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0JCX0KLQl9Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgWDExX1Jlc2l6ZVdpbmRvdyhfVEhJUywKLQkJCVNETF9TdXJmYWNlICpzY3JlZW4sIGludCB3LCBpbnQgaCwgVWludDMyIGZsYWdzKQotewotCWlmICggISBTRExfd2luZG93aWQgKSB7Ci0JCS8qIFJlc2l6ZSB0aGUgd2luZG93IG1hbmFnZXIgd2luZG93ICovCi0JCVgxMV9TZXRTaXplSGludHModGhpcywgdywgaCwgZmxhZ3MpOwotCQl3aW5kb3dfdyA9IHc7Ci0JCXdpbmRvd19oID0gaDsKLQkJWFJlc2l6ZVdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3csIHcsIGgpOwotCi0JCS8qIFJlc2l6ZSB0aGUgZnVsbHNjcmVlbiBhbmQgZGlzcGxheSB3aW5kb3dzICovCi0JCWlmICggZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKLQkJCWlmICggc2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOICkgewotCQkJCVgxMV9SZXNpemVGdWxsU2NyZWVuKHRoaXMpOwotCQkJfSBlbHNlIHsKLQkJCQlzY3JlZW4tPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOwotCQkJCVgxMV9FbnRlckZ1bGxTY3JlZW4odGhpcyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKLQkJCQlzY3JlZW4tPmZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKLQkJCQlYMTFfTGVhdmVGdWxsU2NyZWVuKHRoaXMpOwotCQkJfQotCQl9Ci0JCVhSZXNpemVXaW5kb3coU0RMX0Rpc3BsYXksIFNETF9XaW5kb3csIHcsIGgpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLVNETF9TdXJmYWNlICpYMTFfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKLQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKLXsKLQlVaW50MzIgc2F2ZWRfZmxhZ3M7Ci0KLQkvKiBMb2NrIHRoZSBldmVudCB0aHJlYWQsIGluIG11bHRpLXRocmVhZGluZyBlbnZpcm9ubWVudHMgKi8KLQlTRExfTG9ja19FdmVudFRocmVhZCgpOwotCi0JLyogQ2hlY2sgdGhlIGNvbWJpbmF0aW9uIG9mIGZsYWdzIHdlIHdlcmUgcGFzc2VkICovCi0JaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgewotCQkvKiBDbGVhciBmdWxsc2NyZWVuIGZsYWcgaWYgbm90IHN1cHBvcnRlZCAqLwotCQlpZiAoIFNETF93aW5kb3dpZCApIHsKLQkJCWZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKLQkJfQotCX0KLQotCS8qIEZsdXNoIGFueSBkZWxheWVkIHVwZGF0ZXMgKi8KLQlYU3luYyhHRlhfRGlzcGxheSwgRmFsc2UpOwotCi0JLyogU2V0IHVwIHRoZSBYMTEgd2luZG93ICovCi0Jc2F2ZWRfZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKLQlpZiAoIChTRExfV2luZG93KSAmJiAoKHNhdmVkX2ZsYWdzJlNETF9PUEVOR0wpID09IChmbGFncyZTRExfT1BFTkdMKSkKLQkgICAgICAmJiAoYnBwID09IGN1cnJlbnQtPmZvcm1hdC0+Qml0c1BlclBpeGVsKQotICAgICAgICAgICYmICgoc2F2ZWRfZmxhZ3MmU0RMX05PRlJBTUUpID09IChmbGFncyZTRExfTk9GUkFNRSkpICkgewotCQlpZiAoWDExX1Jlc2l6ZVdpbmRvdyh0aGlzLCBjdXJyZW50LCB3aWR0aCwgaGVpZ2h0LCBmbGFncykgPCAwKSB7Ci0JCQljdXJyZW50ID0gTlVMTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChYMTFfQ3JlYXRlV2luZG93KHRoaXMsY3VycmVudCx3aWR0aCxoZWlnaHQsYnBwLGZsYWdzKSA8IDApIHsKLQkJCWN1cnJlbnQgPSBOVUxMOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JLyogVXBkYXRlIHRoZSBpbnRlcm5hbCBrZXlib2FyZCBzdGF0ZSAqLwotCVgxMV9TZXRLZXlib2FyZFN0YXRlKFNETF9EaXNwbGF5LCBOVUxMKTsKLQotCS8qIFdoZW4gdGhlIHdpbmRvdyBpcyBmaXJzdCBtYXBwZWQsIGlnbm9yZSBub24tbW9kaWZpZXIga2V5cyAqLwotCWlmICggIWN1cnJlbnQtPncgJiYgIWN1cnJlbnQtPmggKSB7Ci0JCVVpbnQ4ICprZXlzID0gU0RMX0dldEtleVN0YXRlKE5VTEwpOwotCQlpbnQgaTsKLQkJZm9yICggaSA9IDA7IGkgPCBTRExLX0xBU1Q7ICsraSApIHsKLQkJCXN3aXRjaCAoaSkgewotCQkJICAgIGNhc2UgU0RMS19OVU1MT0NLOgotCQkJICAgIGNhc2UgU0RMS19DQVBTTE9DSzoKLQkJCSAgICBjYXNlIFNETEtfTENUUkw6Ci0JCQkgICAgY2FzZSBTRExLX1JDVFJMOgotCQkJICAgIGNhc2UgU0RMS19MU0hJRlQ6Ci0JCQkgICAgY2FzZSBTRExLX1JTSElGVDoKLQkJCSAgICBjYXNlIFNETEtfTEFMVDoKLQkJCSAgICBjYXNlIFNETEtfUkFMVDoKLQkJCSAgICBjYXNlIFNETEtfTE1FVEE6Ci0JCQkgICAgY2FzZSBTRExLX1JNRVRBOgotCQkJICAgIGNhc2UgU0RMS19NT0RFOgotCQkJCWJyZWFrOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkJa2V5c1tpXSA9IFNETF9SRUxFQVNFRDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KLQlpZiAoICgoY3VycmVudC0+dyAhPSB3aWR0aCkgfHwgKGN1cnJlbnQtPmggIT0gaGVpZ2h0KSkgfHwKLSAgICAgICAgICAgICAoKHNhdmVkX2ZsYWdzJlNETF9PUEVOR0wpICE9IChmbGFncyZTRExfT1BFTkdMKSkgKSB7Ci0JCWN1cnJlbnQtPncgPSB3aWR0aDsKLQkJY3VycmVudC0+aCA9IGhlaWdodDsKLQkJY3VycmVudC0+cGl0Y2ggPSBTRExfQ2FsY3VsYXRlUGl0Y2goY3VycmVudCk7Ci0JCVgxMV9SZXNpemVJbWFnZSh0aGlzLCBjdXJyZW50LCBmbGFncyk7Ci0JfQotCi0JLyogQ2xlYXIgdGhlc2UgZmxhZ3MgYW5kIHNldCB0aGVtIG9ubHkgaWYgdGhleSBhcmUgaW4gdGhlIG5ldyBzZXQuICovCi0JY3VycmVudC0+ZmxhZ3MgJj0gfihTRExfUkVTSVpBQkxFfFNETF9OT0ZSQU1FKTsKLQljdXJyZW50LT5mbGFncyB8PSAoZmxhZ3MmKFNETF9SRVNJWkFCTEV8U0RMX05PRlJBTUUpKTsKLQotICBkb25lOgotCS8qIFJlbGVhc2UgdGhlIGV2ZW50IHRocmVhZCAqLwotCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Ci0JU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotCi0JLyogV2UncmUgZG9uZSEgKi8KLQlyZXR1cm4oY3VycmVudCk7Ci19Ci0KLXN0YXRpYyBpbnQgWDExX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBvbikKLXsKLQlVaW50MzIgZXZlbnRfdGhyZWFkOwotCi0JLyogRG9uJ3Qgc3dpdGNoIGlmIHdlIGRvbid0IG93biB0aGUgd2luZG93ICovCi0JaWYgKCBTRExfd2luZG93aWQgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQkvKiBEb24ndCBsb2NrIGlmIHdlIGFyZSB0aGUgZXZlbnQgdGhyZWFkICovCi0JZXZlbnRfdGhyZWFkID0gU0RMX0V2ZW50VGhyZWFkSUQoKTsKLQlpZiAoIGV2ZW50X3RocmVhZCAmJiAoU0RMX1RocmVhZElEKCkgPT0gZXZlbnRfdGhyZWFkKSApIHsKLQkJZXZlbnRfdGhyZWFkID0gMDsKLQl9Ci0JaWYgKCBldmVudF90aHJlYWQgKSB7Ci0JCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0JfQotCWlmICggb24gKSB7Ci0JCXRoaXMtPnNjcmVlbi0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47Ci0JCVgxMV9FbnRlckZ1bGxTY3JlZW4odGhpcyk7Ci0JfSBlbHNlIHsKLQkJdGhpcy0+c2NyZWVuLT5mbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47Ci0JCVgxMV9MZWF2ZUZ1bGxTY3JlZW4odGhpcyk7Ci0JfQotCVgxMV9SZWZyZXNoRGlzcGxheSh0aGlzKTsKLQlpZiAoIGV2ZW50X3RocmVhZCApIHsKLQkJU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotCX0KLQlTRExfUmVzZXRLZXlib2FyZCgpOwotCXJldHVybigxKTsKLX0KLQotLyogVXBkYXRlIHRoZSBjdXJyZW50IG1vdXNlIHN0YXRlIGFuZCBwb3NpdGlvbiAqLwotc3RhdGljIHZvaWQgWDExX1VwZGF0ZU1vdXNlKF9USElTKQotewotCVdpbmRvdyB1MTsgaW50IHUyOwotCVdpbmRvdyBjdXJyZW50X3dpbjsKLQlpbnQgeCwgeTsKLQl1bnNpZ25lZCBpbnQgbWFzazsKLQotCS8qIExvY2sgdGhlIGV2ZW50IHRocmVhZCwgaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50cyAqLwotCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0JaWYgKCBYUXVlcnlQb2ludGVyKFNETF9EaXNwbGF5LCBTRExfV2luZG93LCAmdTEsICZjdXJyZW50X3dpbiwKLQkgICAgICAgICAgICAgICAgICAgJnUyLCAmdTIsICZ4LCAmeSwgJm1hc2spICkgewotCQlpZiAoICh4ID49IDApICYmICh4IDwgU0RMX1ZpZGVvU3VyZmFjZS0+dykgJiYKLQkJICAgICAoeSA+PSAwKSAmJiAoeSA8IFNETF9WaWRlb1N1cmZhY2UtPmgpICkgewotCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOwotCQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCB4LCB5KTsKLQkJfSBlbHNlIHsKLQkJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQkJfQotCX0KLQlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Ci19Ci0KLS8qIHNpbXBsZSBjb2xvdXIgZGlzdGFuY2UgbWV0cmljLiBTdXBwb3NlZCB0byBiZSBiZXR0ZXIgdGhhbiBhIHBsYWluCi0gICBFdWNsaWRpYW4gZGlzdGFuY2UgYW55d2F5LiAqLwotI2RlZmluZSBDT0xPVVJfRkFDVE9SIDMKLSNkZWZpbmUgTElHSFRfRkFDVE9SIDEKLSNkZWZpbmUgQ09MT1VSX0RJU1QocjEsIGcxLCBiMSwgcjIsIGcyLCBiMikJCQkJXAotCShDT0xPVVJfRkFDVE9SICogKGFicyhyMSAtIHIyKSArIGFicyhnMSAtIGcyKSArIGFicyhiMSAtIGIyKSkJXAotCSArIExJR0hUX0ZBQ1RPUiAqIGFicyhyMSArIGcxICsgYjEgLSAocjIgKyBnMiArIGIyKSkpCi0KLXN0YXRpYyB2b2lkIGFsbG9jYXRlX25lYXJlc3QoX1RISVMsIFNETF9Db2xvciAqY29sb3JzLAotCQkJICAgICBTRExfQ29sb3IgKndhbnQsIGludCBud2FudCkKLXsKLQkvKgotCSAqIFRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoaWNoIG9uZXMgdG8gY2hvb3NlIGZyb20sIHNvIHdlIHJldHJpZXZlCi0JICogdGhlIGVudGlyZSBjb2xvcm1hcCBhbmQgdHJ5IHRoZSBuZWFyZXN0IHBvc3NpYmxlLCB1bnRpbCB3ZSBmaW5kIG9uZQotCSAqIHRoYXQgaXMgc2hhcmVkLgotCSAqLwotCVhDb2xvciBhbGxbMjU2XTsKLQlpbnQgaTsKLQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJYWxsW2ldLnBpeGVsID0gaTsKLQkvKgotCSAqIFhRdWVyeUNvbG9ycyBzZXRzIHRoZSBmbGFncyBpbiB0aGUgWENvbG9yIHN0cnVjdCwgc28gd2UgdXNlCi0JICogdGhhdCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGNvbG91cnMgYXJlIGF2YWlsYWJsZQotCSAqLwotCVhRdWVyeUNvbG9ycyhHRlhfRGlzcGxheSwgU0RMX1hDb2xvck1hcCwgYWxsLCAyNTYpOwotCi0JZm9yKGkgPSAwOyBpIDwgbndhbnQ7IGkrKykgewotCQlYQ29sb3IgKmM7Ci0JCWludCBqOwotCQlpbnQgYmVzdCA9IDA7Ci0JCWludCBtaW5kaXN0ID0gMHg3ZmZmZmZmZjsKLQkJaW50IHJpID0gd2FudFtpXS5yOwotCQlpbnQgZ2kgPSB3YW50W2ldLmc7Ci0JCWludCBiaSA9IHdhbnRbaV0uYjsKLQkJZm9yKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKLQkJCWludCByaiwgZ2osIGJqLCBkMjsKLQkJCWlmKCFhbGxbal0uZmxhZ3MpCi0JCQkJY29udGludWU7CS8qIHVuYXZhaWxhYmxlIGNvbG91ciBjZWxsICovCi0JCQlyaiA9IGFsbFtqXS5yZWQgPj4gODsKLQkJCWdqID0gYWxsW2pdLmdyZWVuID4+IDg7Ci0JCQliaiA9IGFsbFtqXS5ibHVlID4+IDg7Ci0JCQlkMiA9IENPTE9VUl9ESVNUKHJpLCBnaSwgYmksIHJqLCBnaiwgYmopOwotCQkJaWYoZDIgPCBtaW5kaXN0KSB7Ci0JCQkJbWluZGlzdCA9IGQyOwotCQkJCWJlc3QgPSBqOwotCQkJfQotCQl9Ci0JCWlmKFNETF9YUGl4ZWxzW2Jlc3RdKQotCQkJY29udGludWU7IC8qIGFscmVhZHkgYWxsb2NhdGVkLCB3YXN0ZSBubyBtb3JlIHRpbWUgKi8KLQkJYyA9IGFsbCArIGJlc3Q7Ci0JCWlmKFhBbGxvY0NvbG9yKEdGWF9EaXNwbGF5LCBTRExfWENvbG9yTWFwLCBjKSkgewotCQkJLyogZ290IGl0ICovCi0JCQljb2xvcnNbYy0+cGl4ZWxdLnIgPSBjLT5yZWQgPj4gODsKLQkJCWNvbG9yc1tjLT5waXhlbF0uZyA9IGMtPmdyZWVuID4+IDg7Ci0JCQljb2xvcnNbYy0+cGl4ZWxdLmIgPSBjLT5ibHVlID4+IDg7Ci0JCQkrK1NETF9YUGl4ZWxzW2MtPnBpeGVsXTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBUaGUgY29sb3VyIGNvdWxkbid0IGJlIGFsbG9jYXRlZCwgcHJvYmFibHkgYmVpbmcKLQkJCSAqIG93bmVkIGFzIGEgci93IGNlbGwgYnkgYW5vdGhlciBjbGllbnQuIEZsYWcgaXQgYXMKLQkJCSAqIHVuYXZhaWxhYmxlIGFuZCB0cnkgYWdhaW4uIFRoZSB0ZXJtaW5hdGlvbiBvZiB0aGUKLQkJCSAqIGxvb3AgaXMgZ3VhcmFudGVlZCBzaW5jZSBhdCBsZWFzdCBibGFjayBhbmQgd2hpdGUKLQkJCSAqIGFyZSBhbHdheXMgdGhlcmUuCi0JCQkgKi8KLQkJCWMtPmZsYWdzID0gMDsKLQkJCWktLTsKLQkJfQotCX0KLX0KLQotaW50IFgxMV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCi17Ci0JaW50IG5yZWogPSAwOwotCi0JLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBjb2xvcm1hcCBhbGxvY2F0ZWQgKi8KLQlpZiAoIFNETF9YUGl4ZWxzID09IE5VTEwgKSB7Ci0JCXJldHVybigwKTsKLQl9Ci0JaWYgKCAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9IV1BBTEVUVEUpID09IFNETF9IV1BBTEVUVEUgKSB7Ci0JICAgICAgICAvKiBwcml2YXRlIHdyaXRhYmxlIGNvbG9ybWFwOiBqdXN0IHNldCB0aGUgY29sb3VycyB3ZSBuZWVkICovCi0JICAgICAgICBYQ29sb3IgICp4Y21hcDsKLQkJaW50IGk7Ci0JICAgICAgICB4Y21hcCA9IFNETF9zdGFja19hbGxvYyhYQ29sb3IsIG5jb2xvcnMpOwotCQlpZih4Y21hcCA9PSBOVUxMKQotCQkgICAgICAgIHJldHVybiAwOwotCQlmb3IgKCBpPTA7IGk8bmNvbG9yczsgKytpICkgewotCQkJeGNtYXBbaV0ucGl4ZWwgPSBpICsgZmlyc3Rjb2xvcjsKLQkJCXhjbWFwW2ldLnJlZCAgID0gKGNvbG9yc1tpXS5yPDw4KXxjb2xvcnNbaV0ucjsKLQkJCXhjbWFwW2ldLmdyZWVuID0gKGNvbG9yc1tpXS5nPDw4KXxjb2xvcnNbaV0uZzsKLQkJCXhjbWFwW2ldLmJsdWUgID0gKGNvbG9yc1tpXS5iPDw4KXxjb2xvcnNbaV0uYjsKLQkJCXhjbWFwW2ldLmZsYWdzID0gKERvUmVkfERvR3JlZW58RG9CbHVlKTsKLQkJfQotCQlYU3RvcmVDb2xvcnMoR0ZYX0Rpc3BsYXksIFNETF9YQ29sb3JNYXAsIHhjbWFwLCBuY29sb3JzKTsKLQkJWFN5bmMoR0ZYX0Rpc3BsYXksIEZhbHNlKTsKLQkJU0RMX3N0YWNrX2ZyZWUoeGNtYXApOwotCX0gZWxzZSB7Ci0JICAgICAgICAvKgotCQkgKiBTaGFyZWQgY29sb3JtYXA6IFdlIG9ubHkgYWxsb2NhdGUgcmVhZC1vbmx5IGNlbGxzLCB3aGljaAotCQkgKiBpbmNyZWFzZXMgdGhlIGxpa2VseWhvb2Qgb2YgY29sb3VyIHNoYXJpbmcgd2l0aCBvdGhlcgotCQkgKiBjbGllbnRzLiBUaGUgcGl4ZWwgdmFsdWVzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZQotCQkgKiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZXMsIHNvIHRoZSB1c2VyIGhhcyB0bwotCQkgKiB3YWxrIHRoZSBjb2xvcm1hcCBhbmQgc2VlIHdoaWNoIGluZGV4IGdvdCB3aGF0IGNvbG91ci4KLQkJICoKLQkJICogV2UgY2FuIHdvcmsgZGlyZWN0bHkgd2l0aCB0aGUgbG9naWNhbCBwYWxldHRlIHNpbmNlIGl0Ci0JCSAqIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHdoZW4gd2UgZ2V0IGhlcmUuCi0JCSAqLwotCQlTRExfQ29sb3IgKndhbnQsICpyZWplY3Q7Ci0JICAgICAgICB1bnNpZ25lZCBsb25nICpmcmVlbGlzdDsKLQkJaW50IGk7Ci0JCWludCBuZnJlZSA9IDA7Ci0JCWludCBuYyA9IHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5wYWxldHRlLT5uY29sb3JzOwotCSAgICAgICAgY29sb3JzID0gdGhpcy0+c2NyZWVuLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9yczsKLQkJZnJlZWxpc3QgPSBTRExfc3RhY2tfYWxsb2ModW5zaWduZWQgbG9uZywgbmMpOwotCQkvKiBtYWtlIHN1cmUgbXVsdGlwbGUgYWxsb2NhdGlvbnMgb2YgdGhlIHNhbWUgY2VsbCBhcmUgZnJlZWQgKi8KLQkgICAgICAgIGZvcihpID0gMDsgaSA8IG5jb2xvcnM7IGkrKykgewotCQkgICAgICAgIGludCBwaXhlbCA9IGZpcnN0Y29sb3IgKyBpOwotCQkgICAgICAgIHdoaWxlKFNETF9YUGl4ZWxzW3BpeGVsXSkgewotCQkJICAgICAgICBmcmVlbGlzdFtuZnJlZSsrXSA9IHBpeGVsOwotCQkJCS0tU0RMX1hQaXhlbHNbcGl4ZWxdOwotCQkJfQotCQl9Ci0JCVhGcmVlQ29sb3JzKEdGWF9EaXNwbGF5LCBTRExfWENvbG9yTWFwLCBmcmVlbGlzdCwgbmZyZWUsIDApOwotCQlTRExfc3RhY2tfZnJlZShmcmVlbGlzdCk7Ci0KLQkJd2FudCA9IFNETF9zdGFja19hbGxvYyhTRExfQ29sb3IsIG5jb2xvcnMpOwotCQlyZWplY3QgPSBTRExfc3RhY2tfYWxsb2MoU0RMX0NvbG9yLCBuY29sb3JzKTsKLQkJU0RMX21lbWNweSh3YW50LCBjb2xvcnMgKyBmaXJzdGNvbG9yLCBuY29sb3JzICogc2l6ZW9mKFNETF9Db2xvcikpOwotCQkvKiBtYWtlIHN1cmUgdGhlIHVzZXIgaXNuJ3QgZm9vbGVkIGJ5IGhlciBvd24gd2lzaGVzCi0JCSAgIChibGFjayBpcyBzYWZlLCBhbHdheXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGNvbG9ybWFwKSAqLwotCQlTRExfbWVtc2V0KGNvbG9ycyArIGZpcnN0Y29sb3IsIDAsIG5jb2xvcnMgKiBzaXplb2YoU0RMX0NvbG9yKSk7Ci0KLQkJLyogbm93IHRyeSB0byBhbGxvY2F0ZSB0aGUgY29sb3VycyAqLwotCQlmb3IoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspIHsKLQkJICAgICAgICBYQ29sb3IgY29sOwotCQkJY29sLnJlZCA9IHdhbnRbaV0uciA8PCA4OwotCQkJY29sLmdyZWVuID0gd2FudFtpXS5nIDw8IDg7Ci0JCQljb2wuYmx1ZSA9IHdhbnRbaV0uYiA8PCA4OwotCQkJY29sLmZsYWdzID0gRG9SZWQgfCBEb0dyZWVuIHwgRG9CbHVlOwotCQkJaWYoWEFsbG9jQ29sb3IoR0ZYX0Rpc3BsYXksIFNETF9YQ29sb3JNYXAsICZjb2wpKSB7Ci0JCQkgICAgICAgIC8qIFdlIGdvdCB0aGUgY29sb3VyLCBvciBhdCBsZWFzdCB0aGUgbmVhcmVzdAotCQkJCSAgIHRoZSBoYXJkd2FyZSBjb3VsZCBnZXQuICovCi0JCQkgICAgICAgIGNvbG9yc1tjb2wucGl4ZWxdLnIgPSBjb2wucmVkID4+IDg7Ci0JCQkJY29sb3JzW2NvbC5waXhlbF0uZyA9IGNvbC5ncmVlbiA+PiA4OwotCQkJCWNvbG9yc1tjb2wucGl4ZWxdLmIgPSBjb2wuYmx1ZSA+PiA4OwotCQkJCSsrU0RMX1hQaXhlbHNbY29sLnBpeGVsXTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBubyBtb3JlIGZyZWUgY2VsbHMsIGFkZCBpdCB0byB0aGUgbGlzdAotCQkJCSAqIG9mIHJlamVjdGVkIGNvbG91cnMKLQkJCQkgKi8KLQkJCQlyZWplY3RbbnJlaisrXSA9IHdhbnRbaV07Ci0JCQl9Ci0JCX0KLQkJaWYobnJlaikKLQkJCWFsbG9jYXRlX25lYXJlc3QodGhpcywgY29sb3JzLCByZWplY3QsIG5yZWopOwotCQlTRExfc3RhY2tfZnJlZShyZWplY3QpOwotCQlTRExfc3RhY2tfZnJlZSh3YW50KTsKLQl9Ci0JcmV0dXJuIG5yZWogPT0gMDsKLX0KLQotaW50IFgxMV9TZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCkKLXsKLQlpbnQgaSwgbmNvbG9yczsKLQlYQ29sb3IgeGNtYXBbMjU2XTsKLQotCS8qIFNlZSBpZiBhY3R1YWxseSBzZXR0aW5nIHRoZSBnYW1tYSBpcyBzdXBwb3J0ZWQgKi8KLQlpZiAoIFNETF9WaXN1YWwtPmNsYXNzICE9IERpcmVjdENvbG9yICkgewotCSAgICBTRExfU2V0RXJyb3IoIkdhbW1hIGNvcnJlY3Rpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHZpc3VhbCIpOwotCSAgICByZXR1cm4oLTEpOwotCX0KLQotCS8qIENhbGN1bGF0ZSB0aGUgYXBwcm9wcmlhdGUgcGFsZXR0ZSBmb3IgdGhlIGdpdmVuIGdhbW1hIHJhbXAgKi8KLQluY29sb3JzID0gU0RMX1Zpc3VhbC0+bWFwX2VudHJpZXM7Ci0JZm9yICggaT0wOyBpPG5jb2xvcnM7ICsraSApIHsKLQkJVWludDggYyA9ICgyNTYgKiBpIC8gbmNvbG9ycyk7Ci0JCXhjbWFwW2ldLnBpeGVsID0gU0RMX01hcFJHQih0aGlzLT5zY3JlZW4tPmZvcm1hdCwgYywgYywgYyk7Ci0JCXhjbWFwW2ldLnJlZCAgID0gcmFtcFswKjI1NitjXTsKLQkJeGNtYXBbaV0uZ3JlZW4gPSByYW1wWzEqMjU2K2NdOwotCQl4Y21hcFtpXS5ibHVlICA9IHJhbXBbMioyNTYrY107Ci0JCXhjbWFwW2ldLmZsYWdzID0gKERvUmVkfERvR3JlZW58RG9CbHVlKTsKLQl9Ci0JWFN0b3JlQ29sb3JzKEdGWF9EaXNwbGF5LCBTRExfWENvbG9yTWFwLCB4Y21hcCwgbmNvbG9ycyk7Ci0JWFN5bmMoR0ZYX0Rpc3BsYXksIEZhbHNlKTsKLQlyZXR1cm4oMCk7Ci19Ci0KLS8qIE5vdGU6ICBJZiB3ZSBhcmUgdGVybWluYXRlZCwgdGhpcyBjb3VsZCBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZgotICAgYW5vdGhlciBTREwgdmlkZW8gcm91dGluZSAtLSBub3RhYmx5IFVwZGF0ZVJlY3RzLgotKi8KLXZvaWQgWDExX1ZpZGVvUXVpdChfVEhJUykKLXsKLQkvKiBTaHV0ZG93biBldmVyeXRoaW5nIHRoYXQncyBzdGlsbCB1cCAqLwotCS8qIFRoZSBldmVudCB0aHJlYWQgc2hvdWxkIGJlIGRvbmUsIHNvIHdlIGNhbiB0b3VjaCBTRExfRGlzcGxheSAqLwotCWlmICggU0RMX0Rpc3BsYXkgIT0gTlVMTCApIHsKLQkJLyogRmx1c2ggYW55IGRlbGF5ZWQgdXBkYXRlcyAqLwotCQlYU3luYyhHRlhfRGlzcGxheSwgRmFsc2UpOwotCi0JCS8qIENsb3NlIHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIElNIHNlcnZlciAqLwotCQkjaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCi0JCWlmIChTRExfSUMgIT0gTlVMTCkgewotCQkJWFVuc2V0SUNGb2N1cyhTRExfSUMpOwotCQkJWERlc3Ryb3lJQyhTRExfSUMpOwotCQkJU0RMX0lDID0gTlVMTDsKLQkJfQotCQlpZiAoU0RMX0lNICE9IE5VTEwpIHsKLQkJCVhDbG9zZUlNKFNETF9JTSk7Ci0JCQlTRExfSU0gPSBOVUxMOwotCQl9Ci0JCSNlbmRpZgotCi0JCS8qIFN0YXJ0IHNodXR0aW5nIGRvd24gdGhlIHdpbmRvd3MgKi8KLQkJWDExX0Rlc3Ryb3lJbWFnZSh0aGlzLCB0aGlzLT5zY3JlZW4pOwotCQlYMTFfRGVzdHJveVdpbmRvdyh0aGlzLCB0aGlzLT5zY3JlZW4pOwotCQlYMTFfRnJlZVZpZGVvTW9kZXModGhpcyk7Ci0JCWlmICggU0RMX1hDb2xvck1hcCAhPSBTRExfRGlzcGxheUNvbG9ybWFwICkgewotCQkJWEZyZWVDb2xvcm1hcChTRExfRGlzcGxheSwgU0RMX1hDb2xvck1hcCk7Ci0JCX0KLQkJaWYgKCBTRExfaWNvbmNvbG9ycyApIHsKLQkJCXVuc2lnbmVkIGxvbmcgcGl4ZWw7Ci0JCQlDb2xvcm1hcCBkY21hcCA9IERlZmF1bHRDb2xvcm1hcChTRExfRGlzcGxheSwKLQkJCQkJCQkgU0RMX1NjcmVlbik7Ci0JCQlmb3IocGl4ZWwgPSAwOyBwaXhlbCA8IDI1NjsgKytwaXhlbCkgewotCQkJCXdoaWxlKFNETF9pY29uY29sb3JzW3BpeGVsXSA+IDApIHsKLQkJCQkJWEZyZWVDb2xvcnMoR0ZYX0Rpc3BsYXksCi0JCQkJCQkgICAgZGNtYXAsICZwaXhlbCwgMSwgMCk7Ci0JCQkJCS0tU0RMX2ljb25jb2xvcnNbcGl4ZWxdOwotCQkJCX0KLQkJCX0KLQkJCVNETF9mcmVlKFNETF9pY29uY29sb3JzKTsKLQkJCVNETF9pY29uY29sb3JzID0gTlVMTDsKLQkJfQotCi0JCS8qIFJlc3RvcmUgZ2FtbWEgc2V0dGluZ3MgaWYgdGhleSd2ZSBjaGFuZ2VkICovCi0JCWlmICggU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQQUNUSVZFICkgewotCQkJWDExX1N3YXBWaWRNb2RlR2FtbWEodGhpcyk7Ci0JCX0KLQotCQkvKiBSZXN0b3JlIERQTVMgYW5kIHNjcmVlbnNhdmVyIHNldHRpbmdzICovCi0JCVgxMV9SZXN0b3JlU2NyZWVuU2F2ZXIodGhpcywgU0RMX0Rpc3BsYXksIHNjcmVlbnNhdmVyX3RpbWVvdXQsIGRwbXNfZW5hYmxlZCk7Ci0KLQkJLyogRnJlZSB0aGF0IGJsYW5rIGN1cnNvciAqLwotCQlpZiAoIFNETF9CbGFua0N1cnNvciAhPSBOVUxMICkgewotCQkJdGhpcy0+RnJlZVdNQ3Vyc29yKHRoaXMsIFNETF9CbGFua0N1cnNvcik7Ci0JCQlTRExfQmxhbmtDdXJzb3IgPSBOVUxMOwotCQl9Ci0KLQkJLyogQ2xvc2UgdGhlIFgxMSBncmFwaGljcyBjb25uZWN0aW9uICovCi0JCWlmICggR0ZYX0Rpc3BsYXkgIT0gTlVMTCApIHsKLQkJCVhDbG9zZURpc3BsYXkoR0ZYX0Rpc3BsYXkpOwotCQkJR0ZYX0Rpc3BsYXkgPSBOVUxMOwotCQl9Ci0KLQkJLyogQ2xvc2UgdGhlIFgxMSBkaXNwbGF5IGNvbm5lY3Rpb24gKi8KLQkJWENsb3NlRGlzcGxheShTRExfRGlzcGxheSk7Ci0JCVNETF9EaXNwbGF5ID0gTlVMTDsKLQotCQkvKiBSZXNldCB0aGUgWDExIGVycm9yIGhhbmRsZXJzICovCi0JCWlmICggWElPX2hhbmRsZXIgKSB7Ci0JCQlYU2V0SU9FcnJvckhhbmRsZXIoWElPX2hhbmRsZXIpOwotCQl9Ci0JCWlmICggWF9oYW5kbGVyICkgewotCQkJWFNldEVycm9ySGFuZGxlcihYX2hhbmRsZXIpOwotCQl9Ci0KLQkJLyogVW5sb2FkIEdMIGxpYnJhcnkgYWZ0ZXIgWDExIHNodXRzIGRvd24gKi8KLQkJWDExX0dMX1VubG9hZExpYnJhcnkodGhpcyk7Ci0JfQotCWlmICggdGhpcy0+c2NyZWVuICYmICh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgKSB7Ci0JCS8qIERpcmVjdCBzY3JlZW4gYWNjZXNzLCBubyBtZW1vcnkgYnVmZmVyICovCi0JCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsKLQl9Ci0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUKLSAgICBYaUdNaXNjRGVzdHJveSgpOwotI2VuZGlmCi19Ci0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTF2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMXZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjc4NzguLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMXZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF94MTF2aWRlb19oCi0jZGVmaW5lIF9TRExfeDExdmlkZW9faAotCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLSNpbmNsdWRlIDxYMTEvWGF0b20uaD4KLQotI2luY2x1ZGUgIlNETF9tb3VzZS5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfREdBTU9VU0UKLSNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMveGY4NmRnYS5oIgotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKLSNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMvWGluZXJhbWEuaCIKLSNlbmRpZiAKLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YcmFuZHIuaD4KLSNlbmRpZgotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKLSNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMveGY4NnZtb2RlLmgiCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUKLSNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMveG1lLmgiCi0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9EUE1TCi0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvZHBtcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJTRExfeDExZHluLmgiCi0KLS8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKLQotLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgKi8KLXN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7Ci0gICAgaW50IGxvY2FsX1gxMTsJCS8qIEZsYWc6IHRydWUgaWYgbG9jYWwgZGlzcGxheSAqLwotICAgIERpc3BsYXkgKlgxMV9EaXNwbGF5OwkvKiBVc2VkIGZvciBldmVudHMgYW5kIHdpbmRvdyBtYW5hZ2VtZW50ICovCi0gICAgRGlzcGxheSAqR0ZYX0Rpc3BsYXk7CS8qIFVzZWQgZm9yIGdyYXBoaWNzIGFuZCBjb2xvcm1hcCBzdHVmZiAqLwotICAgIFZpc3VhbCAqU0RMX1Zpc3VhbDsJCS8qIFRoZSB2aXN1YWwgdXNlZCBieSBvdXIgd2luZG93ICovCi0gICAgV2luZG93IFdNd2luZG93OwkJLyogSW5wdXQgd2luZG93LCBtYW5hZ2VkIGJ5IHdpbmRvdyBtYW5hZ2VyICovCi0gICAgV2luZG93IEZTd2luZG93OwkJLyogRnVsbHNjcmVlbiB3aW5kb3csIGNvbXBsZXRlbHkgdW5tYW5hZ2VkICovCi0gICAgV2luZG93IFNETF9XaW5kb3c7CQkvKiBTaGFyZWQgYnkgYm90aCBkaXNwbGF5cyAobm8gWCBzZWN1cml0eT8pICovCi0gICAgQXRvbSBXTV9ERUxFVEVfV0lORE9XOwkvKiAiY2xvc2Utd2luZG93IiBwcm90b2NvbCBhdG9tICovCi0gICAgV01jdXJzb3IgKkJsYW5rQ3Vyc29yOwkvKiBUaGUgaW52aXNpYmxlIGN1cnNvciAqLwotICAgIFhJTSBYMTFfSU07CQkvKiBVc2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGlucHV0IG1ldGhvZCAoSU0pIHNlcnZlciAqLwotICAgIFhJQyBYMTFfSUM7CQkvKiBVc2VkIGZvciByZXRhaW5pbmcgdGhlIHN0YXRlLCBwcm9wZXJ0aWVzLCBhbmQgc2VtYW50aWNzIG9mIGNvbW11bmljYXRpb24gd2l0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IG1ldGhvZCAoSU0pIHNlcnZlciAqLwotCi0gICAgY2hhciAqU0RMX3dpbmRvd2lkOwkJLyogRmxhZzogdHJ1ZSBpZiB3ZSBoYXZlIGJlZW4gcGFzc2VkIGEgd2luZG93ICovCi0KLSAgICAvKiBEaXJlY3QgR3JhcGhpY3MgQWNjZXNzIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIGludCB1c2luZ19kZ2E7Ci0KLSNpZm5kZWYgTk9fU0hBUkVEX01FTU9SWQotICAgIC8qIE1JVCBzaGFyZWQgbWVtb3J5IGV4dGVuc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIGludCB1c2VfbWl0c2htOwotICAgIFhTaG1TZWdtZW50SW5mbyBzaG1pbmZvOwotI2VuZGlmCi0KLSAgICAvKiBUaGUgdmFyaWFibGVzIHVzZWQgZm9yIGRpc3BsYXlpbmcgZ3JhcGhpY3MgKi8KLSAgICBYSW1hZ2UgKlhpbWFnZTsJCS8qIFRoZSBYIGltYWdlIGZvciBvdXIgd2luZG93ICovCi0gICAgR0MJZ2M7CQkJLyogVGhlIGdyYXBoaWMgY29udGV4dCBmb3IgZHJhd2luZyAqLwotCi0gICAgLyogVGhlIGN1cnJlbnQgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZnVsbHNjcmVlbiBtb2RlICovCi0gICAgaW50IHdpbmRvd193OwotICAgIGludCB3aW5kb3dfaDsKLQotICAgIC8qIFN1cHBvcnQgZm9yIGludGVybmFsIG1vdXNlIHdhcnBpbmcgKi8KLSAgICBzdHJ1Y3QgewotICAgICAgICBpbnQgeDsKLSAgICAgICAgaW50IHk7Ci0gICAgfSBtb3VzZV9sYXN0OwotICAgIHN0cnVjdCB7Ci0gICAgICAgIGludCBudW1lcmF0b3I7Ci0gICAgICAgIGludCBkZW5vbWluYXRvcjsKLSAgICAgICAgaW50IHRocmVzaG9sZDsKLSAgICB9IG1vdXNlX2FjY2VsOwotICAgIGludCBtb3VzZV9yZWxhdGl2ZTsKLQotICAgIC8qIFRoZSBjdXJyZW50IGxpc3Qgb2YgYXZhaWxhYmxlIHZpZGVvIG1vZGVzICovCi0gICAgU0RMX1JlY3QgKiptb2RlbGlzdDsKLQotICAgIC8qIGF2YWlsYWJsZSB2aXN1YWxzIG9mIGludGVyZXN0IHRvIHVzLCBzb3J0ZWQgZGVlcGVzdCBmaXJzdCAqLwotICAgIHN0cnVjdCB7Ci0JVmlzdWFsICp2aXN1YWw7Ci0JaW50IGRlcHRoOwkJLyogbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMvcGl4ZWwgKi8KLQlpbnQgYnBwOwkJLyogcGl4ZWwgcXVhbnR1bSBpbiBiaXRzICovCi0gICAgfSB2aXN1YWxzWzIqNV07CQkvKiBhdCBtb3N0IDIgZW50cmllcyBmb3IgOCwgMTUsIDE2LCAyNCwgMzIgKi8KLSAgICBpbnQgbnZpc3VhbHM7Ci0KLSAgICBWaXN1YWwgKnZpczsJCS8qIGN1cnJlbnQgdmlzdWFsIGluIHVzZSAqLwotICAgIGludCBkZXB0aDsJCQkvKiBjdXJyZW50IHZpc3VhbCBkZXB0aCAobm90IGJwcCkgKi8KLQotICAgIC8qIFZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBYMTEgdmlkZW8gbW9kZSBjb2RlICovCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKLSAgICBTRExfTkFNRShYaW5lcmFtYVNjcmVlbkluZm8pIHhpbmVyYW1hX2luZm87Ci0jZW5kaWYKLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKLSAgICBYUlJTY3JlZW5Db25maWd1cmF0aW9uKiBzY3JlZW5fY29uZmlnOwotICAgIGludCBzYXZlZF9zaXplX2lkOwotICAgIFJvdGF0aW9uIHNhdmVkX3JvdGF0aW9uOwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQotICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pIHNhdmVkX21vZGU7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgaW50IHgsIHk7Ci0gICAgfSBzYXZlZF92aWV3OwotI2VuZGlmCi0jaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FIC8qIFhpRyBYTUUgZnVsbHNjcmVlbiAqLwotICAgIFhpR01pc2NSZXNvbHV0aW9uSW5mbyBzYXZlZF9yZXM7Ci0jZW5kaWYKLQotICAgIGludCB1c2VfeGluZXJhbWE7Ci0gICAgaW50IHVzZV94cmFuZHI7Ci0gICAgaW50IHVzZV92aWRtb2RlOwotICAgIGludCB1c2VfeG1lOwotICAgIGludCBjdXJyZW50bHlfZnVsbHNjcmVlbjsKLQotICAgIGludCBhbGxvd19zY3JlZW5zYXZlcjsKLQotICAgIC8qIEF1dG9tYXRpYyBtb2RlIHN3aXRjaGluZyBzdXBwb3J0IChlbnRlcmluZy9sZWF2aW5nIGZ1bGxzY3JlZW4pICovCi0gICAgVWludDMyIHN3aXRjaF93YWl0aW5nOwotICAgIFVpbnQzMiBzd2l0Y2hfdGltZTsKLQotICAgIC8qIFByZXZlbnQgdG9vIG1hbnkgWFN5bmMoKSBjYWxscyAqLwotICAgIGludCBibGl0X3F1ZXVlZDsKLQotICAgIC8qIENvbG9ybWFwIGhhbmRsaW5nICovCi0gICAgQ29sb3JtYXAgRGlzcGxheUNvbG9ybWFwOwkvKiBUaGUgZGVmYXVsdCBkaXNwbGF5IGNvbG9ybWFwICovCi0gICAgQ29sb3JtYXAgWENvbG9yTWFwOwkJLyogVGhlIGN1cnJlbnQgd2luZG93IGNvbG9ybWFwICovCi0gICAgaW50ICpYUGl4ZWxzOwkJLyogcGl4ZWxzIHZhbHVlIGFsbG9jYXRpb24gY291bnRzICovCi0gICAgZmxvYXQgZ2FtbWFfc2F2ZWRbM107CS8qIFNhdmVkIGdhbW1hIHZhbHVlcyBmb3IgVmlkTW9kZSBnYW1tYSAqLwotICAgIGludCBnYW1tYV9jaGFuZ2VkOwkJLyogZmxhZzogaGFzIFZpZE1vZGUgZ2FtbWEgYmVlbiBtb2RpZmllZD8gKi8KLQotICAgIHNob3J0ICppY29uY29sb3JzOwkJLyogTGlzdCBvZiBjb2xvcnMgdXNlZCBieSB0aGUgaWNvbiAqLwotCi0gICAgLyogU2NyZWVuc2F2ZXIgc2V0dGluZ3MgKi8KLSAgICBpbnQgc2NyZWVuc2F2ZXJfdGltZW91dDsKLSAgICBCT09MIGRwbXNfZW5hYmxlZDsKLX07Ci0KLWV4dGVybiBpbnQgIFgxMV93bVhBZGp1c3Q7Ci1leHRlcm4gaW50ICBYMTFfd21ZQWRqdXN0OwotCi0vKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KLSNkZWZpbmUgbG9jYWxfWDExCQkodGhpcy0+aGlkZGVuLT5sb2NhbF9YMTEpCi0jZGVmaW5lIFNETF9EaXNwbGF5CQkodGhpcy0+aGlkZGVuLT5YMTFfRGlzcGxheSkKLSNkZWZpbmUgR0ZYX0Rpc3BsYXkJCSh0aGlzLT5oaWRkZW4tPkdGWF9EaXNwbGF5KQotI2RlZmluZSBTRExfU2NyZWVuCQlEZWZhdWx0U2NyZWVuKHRoaXMtPmhpZGRlbi0+WDExX0Rpc3BsYXkpCi0jZGVmaW5lIFNETF9WaXN1YWwJCSh0aGlzLT5oaWRkZW4tPnZpcykKLSNkZWZpbmUgU0RMX1Jvb3QJCVJvb3RXaW5kb3coU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pCi0jZGVmaW5lIFdNd2luZG93CQkodGhpcy0+aGlkZGVuLT5XTXdpbmRvdykKLSNkZWZpbmUgRlN3aW5kb3cJCSh0aGlzLT5oaWRkZW4tPkZTd2luZG93KQotI2RlZmluZSBTRExfV2luZG93CQkodGhpcy0+aGlkZGVuLT5TRExfV2luZG93KQotI2RlZmluZSBXTV9ERUxFVEVfV0lORE9XCSh0aGlzLT5oaWRkZW4tPldNX0RFTEVURV9XSU5ET1cpCi0jZGVmaW5lIFNETF9CbGFua0N1cnNvcgkJKHRoaXMtPmhpZGRlbi0+QmxhbmtDdXJzb3IpCi0jZGVmaW5lIFNETF9JTQkJCSh0aGlzLT5oaWRkZW4tPlgxMV9JTSkKLSNkZWZpbmUgU0RMX0lDCQkJKHRoaXMtPmhpZGRlbi0+WDExX0lDKQotI2RlZmluZSBTRExfd2luZG93aWQJCSh0aGlzLT5oaWRkZW4tPlNETF93aW5kb3dpZCkKLSNkZWZpbmUgdXNpbmdfZGdhCQkodGhpcy0+aGlkZGVuLT51c2luZ19kZ2EpCi0jZGVmaW5lIHVzZV9taXRzaG0JCSh0aGlzLT5oaWRkZW4tPnVzZV9taXRzaG0pCi0jZGVmaW5lIHNobWluZm8JCQkodGhpcy0+aGlkZGVuLT5zaG1pbmZvKQotI2RlZmluZSBTRExfWGltYWdlCQkodGhpcy0+aGlkZGVuLT5YaW1hZ2UpCi0jZGVmaW5lIFNETF9HQwkJCSh0aGlzLT5oaWRkZW4tPmdjKQotI2RlZmluZSB3aW5kb3dfdwkJKHRoaXMtPmhpZGRlbi0+d2luZG93X3cpCi0jZGVmaW5lIHdpbmRvd19oCQkodGhpcy0+aGlkZGVuLT53aW5kb3dfaCkKLSNkZWZpbmUgbW91c2VfbGFzdAkJKHRoaXMtPmhpZGRlbi0+bW91c2VfbGFzdCkKLSNkZWZpbmUgbW91c2VfYWNjZWwJCSh0aGlzLT5oaWRkZW4tPm1vdXNlX2FjY2VsKQotI2RlZmluZSBtb3VzZV9yZWxhdGl2ZQkJKHRoaXMtPmhpZGRlbi0+bW91c2VfcmVsYXRpdmUpCi0jZGVmaW5lIFNETF9tb2RlbGlzdAkJKHRoaXMtPmhpZGRlbi0+bW9kZWxpc3QpCi0jZGVmaW5lIHhpbmVyYW1hX2luZm8JCSh0aGlzLT5oaWRkZW4tPnhpbmVyYW1hX2luZm8pCi0jZGVmaW5lIHNhdmVkX21vZGUJCSh0aGlzLT5oaWRkZW4tPnNhdmVkX21vZGUpCi0jZGVmaW5lIHNhdmVkX3ZpZXcJCSh0aGlzLT5oaWRkZW4tPnNhdmVkX3ZpZXcpCi0jZGVmaW5lIHNhdmVkX3JlcwkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfcmVzKQotI2RlZmluZSBzY3JlZW5fY29uZmlnCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5fY29uZmlnKQotI2RlZmluZSBzYXZlZF9zaXplX2lkCQkodGhpcy0+aGlkZGVuLT5zYXZlZF9zaXplX2lkKQotI2RlZmluZSBzYXZlZF9yb3RhdGlvbgkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfcm90YXRpb24pCi0jZGVmaW5lIHVzZV94aW5lcmFtYQkJKHRoaXMtPmhpZGRlbi0+dXNlX3hpbmVyYW1hKQotI2RlZmluZSB1c2VfdmlkbW9kZQkJKHRoaXMtPmhpZGRlbi0+dXNlX3ZpZG1vZGUpCi0jZGVmaW5lIHVzZV94cmFuZHIJCSh0aGlzLT5oaWRkZW4tPnVzZV94cmFuZHIpCi0jZGVmaW5lIHVzZV94bWUJCQkodGhpcy0+aGlkZGVuLT51c2VfeG1lKQotI2RlZmluZSBjdXJyZW50bHlfZnVsbHNjcmVlbgkodGhpcy0+aGlkZGVuLT5jdXJyZW50bHlfZnVsbHNjcmVlbikKLSNkZWZpbmUgc3dpdGNoX3dhaXRpbmcJCSh0aGlzLT5oaWRkZW4tPnN3aXRjaF93YWl0aW5nKQotI2RlZmluZSBzd2l0Y2hfdGltZQkJKHRoaXMtPmhpZGRlbi0+c3dpdGNoX3RpbWUpCi0jZGVmaW5lIGJsaXRfcXVldWVkCQkodGhpcy0+aGlkZGVuLT5ibGl0X3F1ZXVlZCkKLSNkZWZpbmUgU0RMX0Rpc3BsYXlDb2xvcm1hcAkodGhpcy0+aGlkZGVuLT5EaXNwbGF5Q29sb3JtYXApCi0jZGVmaW5lIFNETF9Qcml2YXRlQ29sb3JtYXAJKHRoaXMtPmhpZGRlbi0+UHJpdmF0ZUNvbG9ybWFwKQotI2RlZmluZSBTRExfWENvbG9yTWFwCQkodGhpcy0+aGlkZGVuLT5YQ29sb3JNYXApCi0jZGVmaW5lIFNETF9YUGl4ZWxzCQkodGhpcy0+aGlkZGVuLT5YUGl4ZWxzKQotI2RlZmluZSBnYW1tYV9zYXZlZAkJKHRoaXMtPmhpZGRlbi0+Z2FtbWFfc2F2ZWQpCi0jZGVmaW5lIGdhbW1hX2NoYW5nZWQJCSh0aGlzLT5oaWRkZW4tPmdhbW1hX2NoYW5nZWQpCi0jZGVmaW5lIFNETF9pY29uY29sb3JzCQkodGhpcy0+aGlkZGVuLT5pY29uY29sb3JzKQotI2RlZmluZSBzY3JlZW5zYXZlcl90aW1lb3V0CSh0aGlzLT5oaWRkZW4tPnNjcmVlbnNhdmVyX3RpbWVvdXQpCi0jZGVmaW5lIGRwbXNfZW5hYmxlZAkJKHRoaXMtPmhpZGRlbi0+ZHBtc19lbmFibGVkKQotLyogU29tZSB2ZXJzaW9ucyBvZiBYRnJlZTg2IGhhdmUgYnVncyAtIGRldGVjdCBpZiB0aGlzIGlzIG9uZSBvZiB0aGVtICovCi0jZGVmaW5lIEJVR0dZX1hGUkVFODYoY29uZGl0aW9uLCBidWdneV92ZXJzaW9uKSBcCi0oKFNETF9zdHJjbXAoU2VydmVyVmVuZG9yKFNETF9EaXNwbGF5KSwgIlRoZSBYRnJlZTg2IFByb2plY3QsIEluYyIpID09IDApICYmIFwKLSAoVmVuZG9yUmVsZWFzZShTRExfRGlzcGxheSkgY29uZGl0aW9uIGJ1Z2d5X3ZlcnNpb24pKQotCi0jZW5kaWYgLyogX1NETF94MTF2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExd20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTF3bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjcwNmIzLi4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTF3bS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE5ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLQotI2luY2x1ZGUgIlNETF92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiU0RMX3RpbWVyLmgiCi0jaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCi0jaW5jbHVkZSAiU0RMX3N5c3dtLmgiCi0jaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCi0jaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgotI2luY2x1ZGUgIlNETF94MTFtb2Rlc19jLmgiCi0jaW5jbHVkZSAiU0RMX3gxMXdtX2MuaCIKLQotc3RhdGljIFVpbnQ4IHJldmVyc2VfYnl0ZShVaW50OCB4KQotewotCXggPSAoeCAmIDB4YWEpID4+IDEgfCAoeCAmIDB4NTUpIDw8IDE7Ci0JeCA9ICh4ICYgMHhjYykgPj4gMiB8ICh4ICYgMHgzMykgPDwgMjsKLQl4ID0gKHggJiAweGYwKSA+PiA0IHwgKHggJiAweDBmKSA8PCA0OwotCXJldHVybiB4OwotfQotCi12b2lkIFgxMV9TZXRJY29uKF9USElTLCBTRExfU3VyZmFjZSAqaWNvbiwgVWludDggKm1hc2spCi17Ci0JU0RMX1N1cmZhY2UgKnNpY29uOwotCVhXTUhpbnRzICp3bWhpbnRzOwotCVhJbWFnZSAqaWNvbl9pbWFnZTsKLQlQaXhtYXAgaWNvbl9waXhtYXA7Ci0JUGl4bWFwIG1hc2tfcGl4bWFwOwotCVdpbmRvdyBpY29uX3dpbmRvdyA9IE5vbmU7Ci0JR0MgZ2M7Ci0JWEdDVmFsdWVzIEdDdmFsdWVzOwotCWludCBpLCBkYnBwOwotCVNETF9SZWN0IGJvdW5kczsKLQlVaW50OCAqTFNCbWFzazsKLQlWaXN1YWwgKmR2aXM7Ci0JY2hhciAqcDsKLQlpbnQgbWFza3NpemU7Ci0KLQlTRExfTG9ja19FdmVudFRocmVhZCgpOwotCi0JLyogVGhlIGljb24gbXVzdCB1c2UgdGhlIGRlZmF1bHQgdmlzdWFsLCBkZXB0aCBhbmQgY29sb3JtYXAgb2YgdGhlCi0JICAgc2NyZWVuLCBzbyBpdCBtaWdodCBuZWVkIGEgY29udmVyc2lvbiAqLwotCWR2aXMgPSBEZWZhdWx0VmlzdWFsKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKLQlkYnBwID0gRGVmYXVsdERlcHRoKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKLQlmb3IoaSA9IDA7IGkgPCB0aGlzLT5oaWRkZW4tPm52aXN1YWxzOyBpKyspIHsKLQkJaWYodGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLnZpc3VhbCA9PSBkdmlzKSB7Ci0JCQlkYnBwID0gdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLmJwcDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogVGhlIFZpc3VhbCBzdHJ1Y3QgaXMgc3VwcG9zZWQgdG8gYmUgb3BhcXVlIGJ1dCB3ZSBjaGVhdCBhIGxpdHRsZSAqLwotCXNpY29uID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwgaWNvbi0+dywgaWNvbi0+aCwKLQkJCQkgICAgIGRicHAsCi0JCQkJICAgICBkdmlzLT5yZWRfbWFzaywgZHZpcy0+Z3JlZW5fbWFzaywKLQkJCQkgICAgIGR2aXMtPmJsdWVfbWFzaywgMCk7Ci0JaWYgKCBzaWNvbiA9PSBOVUxMICkKLQkJZ290byBkb25lOwotCi0JaWYoZGJwcCA9PSA4KSB7Ci0JCS8qIERlZmF1bHQgdmlzdWFsIGlzIDhiaXQ7IHdlIG5lZWQgdG8gYWxsb2NhdGUgY29sb3VycyBmcm9tCi0JCSAgIHRoZSBkZWZhdWx0IGNvbG9ybWFwICovCi0JCVNETF9Db2xvciB3YW50WzI1Nl0sIGdvdFsyNTZdOwotCQlpbnQgbndhbnQ7Ci0JCUNvbG9ybWFwIGRjbWFwOwotCQlpbnQgbWlzc2luZzsKLQkJZGNtYXAgPSBEZWZhdWx0Q29sb3JtYXAoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOwotCQlpZihpY29uLT5mb3JtYXQtPnBhbGV0dGUpIHsKLQkJCS8qIFRoZSBpY29uIGhhcyBhIHBhbGV0dGUgYXMgd2VsbCAtIHdlIGp1c3QgaGF2ZSB0bwotCQkJICAgZmluZCB0aG9zZSBjb2xvdXJzICovCi0JCQlud2FudCA9IGljb24tPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsKLQkJCVNETF9tZW1jcHkod2FudCwgaWNvbi0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnMsCi0JCQkgICAgICAgbndhbnQgKiBzaXplb2Ygd2FudFswXSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiB0cnkgdGhlIHN0YW5kYXJkIDZ4Nng2IGN1YmUgZm9yIGxhY2sgb2YgYmV0dGVyCi0JCQkgICBpZGVhcyAqLwotCQkJaW50IHIsIGcsIGIsIGk7Ci0JCQlmb3IociA9IGkgPSAwOyByIDwgMjU2OyByICs9IDB4MzMpCi0JCQkJZm9yKGcgPSAwOyBnIDwgMjU2OyBnICs9IDB4MzMpCi0JCQkJCWZvcihiID0gMDsgYiA8IDI1NjsgYiArPSAweDMzLCBpKyspIHsKLQkJCQkJCXdhbnRbaV0uciA9IHI7Ci0JCQkJCQl3YW50W2ldLmcgPSBnOwotCQkJCQkJd2FudFtpXS5iID0gYjsKLQkJCQkJfQotCQkJbndhbnQgPSAyMTY7Ci0JCX0KLQkJaWYoU0RMX2ljb25jb2xvcnMpIHsKLQkJCS8qIGZyZWUgYWxyZWFkeSBhbGxvY2F0ZWQgY29sb3VycyBmaXJzdCAqLwotCQkJdW5zaWduZWQgbG9uZyBmcmVlbGlzdFs1MTJdOwotCQkJaW50IG5mcmVlID0gMDsKLQkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCQkJd2hpbGUoU0RMX2ljb25jb2xvcnNbaV0pIHsKLQkJCQkJZnJlZWxpc3RbbmZyZWUrK10gPSBpOwotCQkJCQlTRExfaWNvbmNvbG9yc1tpXS0tOwotCQkJCX0KLQkJCX0KLQkJCVhGcmVlQ29sb3JzKEdGWF9EaXNwbGF5LCBkY21hcCwgZnJlZWxpc3QsIG5mcmVlLCAwKTsKLQkJfQotCQlpZighU0RMX2ljb25jb2xvcnMpCi0JCQlTRExfaWNvbmNvbG9ycyA9IFNETF9tYWxsb2MoMjU2ICogc2l6ZW9mICpTRExfaWNvbmNvbG9ycyk7Ci0JCVNETF9tZW1zZXQoU0RMX2ljb25jb2xvcnMsIDAsIDI1NiAqIHNpemVvZiAqU0RMX2ljb25jb2xvcnMpOwotCi0JCS8qIHRyeSB0byBhbGxvY2F0ZSB0aGUgY29sb3VycyAqLwotCQlTRExfbWVtc2V0KGdvdCwgMCwgc2l6ZW9mIGdvdCk7Ci0JCW1pc3NpbmcgPSAwOwotCQlmb3IoaSA9IDA7IGkgPCBud2FudDsgaSsrKSB7Ci0JCQlYQ29sb3IgYzsKLQkJCWMucmVkID0gd2FudFtpXS5yIDw8IDg7Ci0JCQljLmdyZWVuID0gd2FudFtpXS5nIDw8IDg7Ci0JCQljLmJsdWUgPSB3YW50W2ldLmIgPDwgODsKLQkJCWMuZmxhZ3MgPSBEb1JlZCB8IERvR3JlZW4gfCBEb0JsdWU7Ci0JCQlpZihYQWxsb2NDb2xvcihHRlhfRGlzcGxheSwgZGNtYXAsICZjKSkgewotCQkJCS8qIGdvdCB0aGUgY29sb3VyICovCi0JCQkJU0RMX2ljb25jb2xvcnNbYy5waXhlbF0rKzsKLQkJCQlnb3RbYy5waXhlbF0gPSB3YW50W2ldOwotCQkJfSBlbHNlIHsKLQkJCQltaXNzaW5nID0gMTsKLQkJCX0KLQkJfQotCQlpZihtaXNzaW5nKSB7Ci0JCQkvKiBTb21lIGNvbG91cnMgd2VyZSBhcHBhcmVudGx5IG1pc3NpbmcsIHNvIHdlIGp1c3QKLQkJCSAgIGFsbG9jYXRlIGFsbCB0aGUgcmVzdCBhcyB3ZWxsICovCi0JCQlYQ29sb3IgY29sc1syNTZdOwotCQkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCQkJY29sc1tpXS5waXhlbCA9IGk7Ci0JCQlYUXVlcnlDb2xvcnMoR0ZYX0Rpc3BsYXksIGRjbWFwLCBjb2xzLCAyNTYpOwotCQkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJCQlnb3RbaV0uciA9IGNvbHNbaV0ucmVkID4+IDg7Ci0JCQkJZ290W2ldLmcgPSBjb2xzW2ldLmdyZWVuID4+IDg7Ci0JCQkJZ290W2ldLmIgPSBjb2xzW2ldLmJsdWUgPj4gODsKLQkJCQlpZighU0RMX2ljb25jb2xvcnNbaV0pIHsKLQkJCQkJaWYoWEFsbG9jQ29sb3IoR0ZYX0Rpc3BsYXksIGRjbWFwLAotCQkJCQkJCWNvbHMgKyBpKSkgewotCQkJCQkJU0RMX2ljb25jb2xvcnNbaV0gPSAxOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogaW5kZXggbm90IGF2YWlsYWJsZSAqLwotCQkJCQkJZ290W2ldLnIgPSAwOwotCQkJCQkJZ290W2ldLmcgPSAwOwotCQkJCQkJZ290W2ldLmIgPSAwOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJU0RMX1NldENvbG9ycyhzaWNvbiwgZ290LCAwLCAyNTYpOwotCX0KLQotCWJvdW5kcy54ID0gMDsKLQlib3VuZHMueSA9IDA7Ci0JYm91bmRzLncgPSBpY29uLT53OwotCWJvdW5kcy5oID0gaWNvbi0+aDsKLQlpZiAoIFNETF9Mb3dlckJsaXQoaWNvbiwgJmJvdW5kcywgc2ljb24sICZib3VuZHMpIDwgMCApCi0JCWdvdG8gZG9uZTsKLQotCS8qIFdlIG5lZWQgdGhlIG1hc2sgYXMgZ2l2ZW4sIGV4Y2VwdCBpbiBMU0JmaXJzdCBmb3JtYXQgaW5zdGVhZCBvZgotCSAgIE1TQmZpcnN0LiBSZXZlcnNlIHRoZSBiaXRzIGluIGVhY2ggYnl0ZS4gKi8KLQltYXNrc2l6ZSA9ICgoc2ljb24tPncgKyA3KSA+PiAzKSAqIHNpY29uLT5oOwotCUxTQm1hc2sgPSBTRExfbWFsbG9jKG1hc2tzaXplKTsKLQlpZiAoIExTQm1hc2sgPT0gTlVMTCApIHsKLQkJZ290byBkb25lOwotCX0KLQlTRExfbWVtc2V0KExTQm1hc2ssIDAsIG1hc2tzaXplKTsKLQlmb3IoaSA9IDA7IGkgPCBtYXNrc2l6ZTsgaSsrKQotCQlMU0JtYXNrW2ldID0gcmV2ZXJzZV9ieXRlKG1hc2tbaV0pOwotCW1hc2tfcGl4bWFwID0gWENyZWF0ZVBpeG1hcEZyb21CaXRtYXBEYXRhKFNETF9EaXNwbGF5LCBXTXdpbmRvdywKLQkJCQkJCSAgKGNoYXIgKilMU0JtYXNrLAotCQkJCQkJICBzaWNvbi0+dywgc2ljb24tPmgsCi0JCQkJCQkgIDFMLCAwTCwgMSk7Ci0KLQkvKiBUcmFuc2ZlciB0aGUgaW1hZ2UgdG8gYW4gWDExIHBpeG1hcCAqLwotCWljb25faW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoU0RMX0Rpc3BsYXksCi0JCQkJICBEZWZhdWx0VmlzdWFsKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKSwKLQkJCQkgIERlZmF1bHREZXB0aChTRExfRGlzcGxheSwgU0RMX1NjcmVlbiksCi0JCQkJICBaUGl4bWFwLCAwLCBzaWNvbi0+cGl4ZWxzLAotCQkJCSAgc2ljb24tPncsIHNpY29uLT5oLAotCQkJCSAgMzIsIDApOwotCWljb25faW1hZ2UtPmJ5dGVfb3JkZXIgPSAoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikKLQkJICAgICAgICAgICAgICAgICA/IE1TQkZpcnN0IDogTFNCRmlyc3Q7Ci0JaWNvbl9waXhtYXAgPSBYQ3JlYXRlUGl4bWFwKFNETF9EaXNwbGF5LCBTRExfUm9vdCwgc2ljb24tPncsIHNpY29uLT5oLAotCQkJCSAgICBEZWZhdWx0RGVwdGgoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pKTsKLQlnYyA9IFhDcmVhdGVHQyhTRExfRGlzcGxheSwgaWNvbl9waXhtYXAsIDAsICZHQ3ZhbHVlcyk7Ci0JWFB1dEltYWdlKFNETF9EaXNwbGF5LCBpY29uX3BpeG1hcCwgZ2MsIGljb25faW1hZ2UsCi0JCSAgMCwgMCwgMCwgMCwgc2ljb24tPncsIHNpY29uLT5oKTsKLQlYRnJlZUdDKFNETF9EaXNwbGF5LCBnYyk7Ci0JWERlc3Ryb3lJbWFnZShpY29uX2ltYWdlKTsKLQlTRExfZnJlZShMU0JtYXNrKTsKLQlzaWNvbi0+cGl4ZWxzID0gTlVMTDsKLQotCS8qIFNvbWUgYnVnZ3kgd2luZG93IG1hbmFnZXJzIChzb21lIHZlcnNpb25zIG9mIEVubGlnaHRlbm1lbnQsIGl0Ci0JICAgc2VlbXMpIG5lZWQgYW4gaWNvbiB3aW5kb3cgKmFuZCogaWNvbiBwaXhtYXAgdG8gd29yayBwcm9wZXJseSwgd2hpbGUKLQkgICBpdCBzY3Jld3MgdXAgb3RoZXJzLiBUaGUgZGVmYXVsdCBpcyBvbmx5IHRvIHVzZSBhIHBpeG1hcC4gKi8KLQlwID0gU0RMX2dldGVudigiU0RMX1ZJREVPX1gxMV9JQ09OV0lOIik7Ci0JaWYocCAmJiAqcCkgewotCQlpY29uX3dpbmRvdyA9IFhDcmVhdGVTaW1wbGVXaW5kb3coU0RMX0Rpc3BsYXksIFNETF9Sb290LAotCQkJCQkJICAwLCAwLCBzaWNvbi0+dywgc2ljb24tPmgsIDAsCi0JCQkJCQkgIENvcHlGcm9tUGFyZW50LAotCQkJCQkJICBDb3B5RnJvbVBhcmVudCk7Ci0JCVhTZXRXaW5kb3dCYWNrZ3JvdW5kUGl4bWFwKFNETF9EaXNwbGF5LCBpY29uX3dpbmRvdywKLQkJCQkJICAgaWNvbl9waXhtYXApOwotCQlYQ2xlYXJXaW5kb3coU0RMX0Rpc3BsYXksIGljb25fd2luZG93KTsKLQl9Ci0KLQkvKiBTZXQgdGhlIHdpbmRvdyBpY29uIHRvIHRoZSBpY29uIHBpeG1hcCAoYW5kIGljb24gd2luZG93KSAqLwotCXdtaGludHMgPSBYQWxsb2NXTUhpbnRzKCk7Ci0Jd21oaW50cy0+ZmxhZ3MgPSAoSWNvblBpeG1hcEhpbnQgfCBJY29uTWFza0hpbnQpOwotCXdtaGludHMtPmljb25fcGl4bWFwID0gaWNvbl9waXhtYXA7Ci0Jd21oaW50cy0+aWNvbl9tYXNrID0gbWFza19waXhtYXA7Ci0JaWYoaWNvbl93aW5kb3cgIT0gTm9uZSkgewotCQl3bWhpbnRzLT5mbGFncyB8PSBJY29uV2luZG93SGludDsKLQkJd21oaW50cy0+aWNvbl93aW5kb3cgPSBpY29uX3dpbmRvdzsKLQl9Ci0JWFNldFdNSGludHMoU0RMX0Rpc3BsYXksIFdNd2luZG93LCB3bWhpbnRzKTsKLQlYRnJlZSh3bWhpbnRzKTsKLQlYU3luYyhTRExfRGlzcGxheSwgRmFsc2UpOwotCi0gIGRvbmU6Ci0JU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotCVNETF9GcmVlU3VyZmFjZShzaWNvbik7Ci19Ci0KLXZvaWQgWDExX1NldENhcHRpb25Ob0xvY2soX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKQotewotCVhUZXh0UHJvcGVydHkgdGl0bGVwcm9wLCBpY29ucHJvcDsKLQlTdGF0dXMgc3RhdHVzOwotCi0jaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCi0JQXRvbSBfTkVUX1dNX05BTUUgPSAwOwotCUF0b20gX05FVF9XTV9JQ09OX05BTUUgPSAwOwotCi0JLyogTG9vayB1cCBzb21lIHVzZWZ1bCBBdG9tcyAqLwotCWlmIChTRExfWDExX0hBVkVfVVRGOCkgewotCQlfTkVUX1dNX05BTUUgPSBYSW50ZXJuQXRvbShTRExfRGlzcGxheSwgIl9ORVRfV01fTkFNRSIsIEZhbHNlKTsKLQkJX05FVF9XTV9JQ09OX05BTUUgPSBYSW50ZXJuQXRvbShTRExfRGlzcGxheSwgIl9ORVRfV01fSUNPTl9OQU1FIiwgRmFsc2UpOwotCX0KLSNlbmRpZgotCi0JaWYgKCB0aXRsZSAhPSBOVUxMICkgewotCQljaGFyICp0aXRsZV9sb2NhbGUgPSBTRExfaWNvbnZfdXRmOF9sb2NhbGUodGl0bGUpOwotCQlpZiAoICF0aXRsZV9sb2NhbGUgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdGF0dXMgPSBYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZ0aXRsZV9sb2NhbGUsIDEsICZ0aXRsZXByb3ApOwotCQlTRExfZnJlZSh0aXRsZV9sb2NhbGUpOwotCQlpZiAoIHN0YXR1cyApIHsKLQkJCVhTZXRUZXh0UHJvcGVydHkoU0RMX0Rpc3BsYXksIFdNd2luZG93LCAmdGl0bGVwcm9wLCBYQV9XTV9OQU1FKTsKLQkJCVhGcmVlKHRpdGxlcHJvcC52YWx1ZSk7Ci0JCX0KLSNpZmRlZiBYX0hBVkVfVVRGOF9TVFJJTkcKLQkJaWYgKFNETF9YMTFfSEFWRV9VVEY4KSB7Ci0JCQlzdGF0dXMgPSBYdXRmOFRleHRMaXN0VG9UZXh0UHJvcGVydHkoU0RMX0Rpc3BsYXksCi0JCQkJCShjaGFyICoqKSZ0aXRsZSwgMSwgWFVURjhTdHJpbmdTdHlsZSwgJnRpdGxlcHJvcCk7Ci0JCQlpZiAoIHN0YXR1cyA9PSBTdWNjZXNzICkgewotCQkJCVhTZXRUZXh0UHJvcGVydHkoU0RMX0Rpc3BsYXksIFdNd2luZG93LCAmdGl0bGVwcm9wLCBfTkVUX1dNX05BTUUpOwotCQkJCVhGcmVlKHRpdGxlcHJvcC52YWx1ZSk7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCX0KLQlpZiAoIGljb24gIT0gTlVMTCApIHsKLQkJY2hhciAqaWNvbl9sb2NhbGUgPSBTRExfaWNvbnZfdXRmOF9sb2NhbGUoaWNvbik7Ci0JCWlmICggIWljb25fbG9jYWxlICkgewotCQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3RhdHVzID0gWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmaWNvbl9sb2NhbGUsIDEsICZpY29ucHJvcCk7Ci0JCVNETF9mcmVlKGljb25fbG9jYWxlKTsKLQkJaWYgKCBzdGF0dXMgKSB7Ci0JCQlYU2V0VGV4dFByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgJmljb25wcm9wLCBYQV9XTV9JQ09OX05BTUUpOwotCQkJWEZyZWUoaWNvbnByb3AudmFsdWUpOwotCQl9Ci0jaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCi0JCWlmIChTRExfWDExX0hBVkVfVVRGOCkgewotCQkJc3RhdHVzID0gWHV0ZjhUZXh0TGlzdFRvVGV4dFByb3BlcnR5KFNETF9EaXNwbGF5LAotCQkJCQkoY2hhciAqKikmaWNvbiwgMSwgWFVURjhTdHJpbmdTdHlsZSwgJmljb25wcm9wKTsKLQkJCWlmICggc3RhdHVzID09IFN1Y2Nlc3MgKSB7Ci0JCQkJWFNldFRleHRQcm9wZXJ0eShTRExfRGlzcGxheSwgV013aW5kb3csICZpY29ucHJvcCwgX05FVF9XTV9JQ09OX05BTUUpOwotCQkJCVhGcmVlKGljb25wcm9wLnZhbHVlKTsKLQkJCX0KLQkJfQotI2VuZGlmCi0JfQotCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Ci19Ci0KLXZvaWQgWDExX1NldENhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKQotewotCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0JWDExX1NldENhcHRpb25Ob0xvY2sodGhpcywgdGl0bGUsIGljb24pOwotCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKLX0KLQotLyogSWNvbmlmeSB0aGUgd2luZG93ICovCi1pbnQgWDExX0ljb25pZnlXaW5kb3coX1RISVMpCi17Ci0JaW50IHJlc3VsdDsKLQotCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0JcmVzdWx0ID0gWEljb25pZnlXaW5kb3coU0RMX0Rpc3BsYXksIFdNd2luZG93LCBTRExfU2NyZWVuKTsKLQlYU3luYyhTRExfRGlzcGxheSwgRmFsc2UpOwotCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotI2lmIDAKLSNkZWZpbmUgIEQoLi4uKSAgcHJpbnRmKF9fVkFfQVJHU19fKQotI2RlZmluZSAgRSguLi4pICBEKF9fVkFfQVJHU19fKQotI2Vsc2UKLSNkZWZpbmUgIEQoLi4uKSAgKCh2b2lkKTApCi0jZGVmaW5lICBFKC4uLikgICgodm9pZCkwKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkICBzZXRfd2luZG93X3Bvc19ub2xvY2soX1RISVMsIGludCB4LCBpbnQgeSkKLXsKLSAgICBpbnQgICAgICAgICAgeE5ldywgeU5ldzsKLSAgICBXaW5kb3cgICAgICAgY2hpbGQ7Ci0gICAgaW50ICAgICAgICAgIHhBZGp1c3QgPSBYMTFfd21YQWRqdXN0OwotICAgIGludCAgICAgICAgICB5QWRqdXN0ID0gWDExX3dtWUFkanVzdDsKLQotICAgIC8qIGRvbid0IGRvIGFueXRoaW5nIGluIGZ1bGwtc2NyZWVuIG1vZGUsIGJlY2F1c2UgdGhlIEZTd2luZG93IGlzIHVzZWQKLSAgICAgKiBpbnN0ZWFkIG9mIHRoZSBXTXdpbmRvdywgd2hpY2ggd2lsbCBtYWtlIHRoZSBhZGp1c3RtZW50IGdvIHdpbGQKLSAgICAgKi8KLSAgICBpZiAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiB0aGlzIGNvZGUgaXMgdHJpY2t5IGJlY2F1c2Ugc29tZSB3aW5kb3cgbWFuYWdlcnMsIGJ1dCBub3QgYWxsLAotICAgICAqIHdpbGwgdHJhbnNsYXRlIHRoZSBmaW5hbCB3aW5kb3cgcG9zaXRpb24gYnkgYSBnaXZlbiBvZmZzZXQKLSAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmcmFtZSBkZWNvcmF0aW9uLgotICAgICAqCi0gICAgICogc28gd2UgZmlyc3QgdHJ5IHRvIG1vdmUgdGhlIHdpbmRvdywgZ2V0IHRoZSBwb3NpdGlvbiB0aGF0IHRoZQotICAgICAqIHdpbmRvdyBtYW5hZ2VyIGhhcyBzZXQsIGFuZCBpZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHJlLXBvc2l0aW9uIHRoZQotICAgICAqIHdpbmRvdyBhZ2FpbiB3aXRoIGFuIGFkanVzdG1lbnQuCi0gICAgICoKLSAgICAgKiB0aGlzIGNhdXNlcyBhIHNsaWdodCBmbGlja2VyIHNpbmNlIHRoZSB3aW5kb3cgJ2p1bXBzJyB2ZXJ5Ci0gICAgICogcXVpY2tseSBmcm9tIG9uZSBwb3NpdGlvbiB0byB0aGUgb3RoZXIuCi0gICAgICovCi0KLSAgICBEKCIlczogbW92ZSB0byBbJWQsJWRdIGFkanVzdGVkIHRvIFslZCwlZF1cbiIsIF9fRlVOQ1RJT05fXywKLSAgICAgIHgsIHksIHgreEFkanVzdCwgeSt5QWRqdXN0KTsKLSAgICBYTW92ZVdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3csIHggKyB4QWRqdXN0LCB5ICsgeUFkanVzdCk7Ci0gICAgWFN5bmMoU0RMX0Rpc3BsYXksIFRydWUpOwotICAgIFhUcmFuc2xhdGVDb29yZGluYXRlcyggU0RMX0Rpc3BsYXksIFdNd2luZG93LCBTRExfUm9vdCwgMCwgMCwgJnhOZXcsICZ5TmV3LCAmY2hpbGQgKTsKLSAgICBpZiAoeE5ldyAhPSB4IHx8IHlOZXcgIT0geSkgewotICAgICAgICBYMTFfd21YQWRqdXN0ID0geEFkanVzdCA9IHggLSB4TmV3OwotICAgICAgICBYMTFfd21ZQWRqdXN0ID0geUFkanVzdCA9IHkgLSB5TmV3OwotICAgICAgICBEKCIlczogcmVhZCBwb3MgWyVkLCVkXSwgcmVjb21wdXRpbmcgYWRqdXN0PVslZCwlZF0gbW92aW5nIHRvIFslZCwlZF1cbiIsCi0gICAgICAgICAgX19GVU5DVElPTl9fLCB4TmV3LCB5TmV3LCB4QWRqdXN0LCB5QWRqdXN0LCB4K3hBZGp1c3QsIHkreUFkanVzdCk7Ci0gICAgICAgIFhNb3ZlV2luZG93KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgeCArIHhBZGp1c3QsIHkgKyB5QWRqdXN0ICk7Ci0gICAgfQotICAgIFhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Ci19Ci0KLS8qIFNldCB3aW5kb3cgcG9zaXRpb24gKi8KLXZvaWQgIFgxMV9TZXRXaW5kb3dQb3MoX1RISVMsIGludCAgeCwgaW50ICB5KQotewotICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0gICAgc2V0X3dpbmRvd19wb3Nfbm9sb2NrKHRoaXMsIHgsIHkpOwotICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKLX0KLQotLyogR2V0IHdpbmRvdyBwb3NpdGlvbiAqLwotdm9pZCAgWDExX0dldFdpbmRvd1BvcyhfVEhJUywgaW50ICAqcHgsIGludCAgKnB5KQotewotICAgIC8qIGluIGZ1bGwtc2NyZWVuIG1vZGUsIHlvdSBjYW4ndCBtb3ZlIHRoZSB3aW5kb3cgKi8KLSAgICBpZiAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSB7Ci0gICAgICAgICpweCA9ICpweSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0gICAgewotICAgICAgICBXaW5kb3cgIGNoaWxkOwotCi0gICAgICAgIFhUcmFuc2xhdGVDb29yZGluYXRlcyggU0RMX0Rpc3BsYXksIFdNd2luZG93LCBTRExfUm9vdCwgMCwgMCwgcHgsIHB5LCAmY2hpbGQgKTsKLSAgICB9Ci0gICAgU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotfQotCi1zdGF0aWMgaW50Ci1pc193aW5kb3dfdmlzaWJsZShfVEhJUywgaW50ICBzY3JlZW5feCwgaW50ICBzY3JlZW5feSwgaW50ICBzY3JlZW5fdywgaW50ICBzY3JlZW5faCApCi17Ci0gICAgWFdpbmRvd0F0dHJpYnV0ZXMgICBhdHRyOwotICAgIGludCAgICAgICAgICAgICAgICAgeCwgeTsKLSAgICBXaW5kb3cgICAgICAgICAgICAgIGNoaWxkOwotCi0gICAgWEdldFdpbmRvd0F0dHJpYnV0ZXMoIFNETF9EaXNwbGF5LCBXTXdpbmRvdywgJmF0dHIgKTsKLSAgICBYVHJhbnNsYXRlQ29vcmRpbmF0ZXMoIFNETF9EaXNwbGF5LCBXTXdpbmRvdywgU0RMX1Jvb3QsIDAsIDAsICZ4LCAmeSwgJmNoaWxkICk7Ci0KLSAgICByZXR1cm4gKCB4ID49IHNjcmVlbl94ICYmIHggKyBhdHRyLndpZHRoICA8PSBzY3JlZW5feCArIHNjcmVlbl93ICAmJgotICAgICAgICAgICAgIHkgPj0gc2NyZWVuX3kgJiYgeSArIGF0dHIuaGVpZ2h0IDw9IHNjcmVlbl95ICsgc2NyZWVuX2ggKTsKLX0KLQotaW50ICBYMTFfSXNXaW5kb3dWaXNpYmxlKF9USElTLCBpbnQgIHJlY2VudGVyKQotewotICAgIGludCAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICBYV2luZG93QXR0cmlidXRlcyAgIGF0dHI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBzY3JlZW5fdywgc2NyZWVuX2g7Ci0KLSAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOwotICAgIFhHZXRXaW5kb3dBdHRyaWJ1dGVzKCBTRExfRGlzcGxheSwgU0RMX1Jvb3QsICZhdHRyICk7Ci0gICAgc2NyZWVuX3cgPSBhdHRyLndpZHRoOwotICAgIHNjcmVlbl9oID0gYXR0ci5oZWlnaHQ7Ci0KLSNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQotICAgIGlmICh1c2VfeGluZXJhbWEpIHsKLSAgICAgICAgU0RMX05BTUUoWGluZXJhbWFTY3JlZW5JbmZvKSAqeGluZXJhbWE7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNjcmVlbnM7Ci0KLSAgICAgICAgeGluZXJhbWEgPSBTRExfTkFNRShYaW5lcmFtYVF1ZXJ5U2NyZWVucykoU0RMX0Rpc3BsYXksICZzY3JlZW5zKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjcmVlbnM7IGkrKykgewotICAgICAgICAgICAgaWYgKCBpc193aW5kb3dfdmlzaWJsZSggdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpbmVyYW1hW2ldLnhfb3JnLCB4aW5lcmFtYVtpXS55X29yZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpbmVyYW1hW2ldLndpZHRoLCB4aW5lcmFtYVtpXS5oZWlnaHQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIXJlc3VsdCAmJiByZWNlbnRlciApIHsKLSAgICAgICAgICAgIHNldF93aW5kb3dfcG9zX25vbG9jayh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGluZXJhbWFbMF0ueF9vcmcgKyAoeGluZXJhbWFbMF0ud2lkdGggIC0gdGhpcy0+c2NyZWVuLT53KS8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGluZXJhbWFbMF0ueV9vcmcgKyAoeGluZXJhbWFbMF0uaGVpZ2h0IC0gdGhpcy0+c2NyZWVuLT5oKS8yICk7Ci0gICAgICAgIH0KLSAgICAgICAgWEZyZWUoeGluZXJhbWEpOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKCBpc193aW5kb3dfdmlzaWJsZSggdGhpcywgMCwgMCwgc2NyZWVuX3csIHNjcmVlbl9oICkgKSB7Ci0gICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotCi0gICAgaWYgKCAhcmVzdWx0ICYmIHJlY2VudGVyICkgewotICAgICAgICBzZXRfd2luZG93X3Bvc19ub2xvY2soIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChzY3JlZW5fdyAtIHRoaXMtPnNjcmVlbi0+dykvMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjcmVlbl9oIC0gdGhpcy0+c2NyZWVuLT5oKS8yICk7Ci0gICAgfQotI2lmZGVmIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BCi1FeGl0OgotI2VuZGlmCi0gICAgU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLVNETF9HcmFiTW9kZSBYMTFfR3JhYklucHV0Tm9Mb2NrKF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSkKLXsKLQlpbnQgcmVzdWx0OwotCi0JaWYgKCB0aGlzLT5zY3JlZW4gPT0gTlVMTCApIHsKLQkJcmV0dXJuKFNETF9HUkFCX09GRik7Ci0JfQotCWlmICggISBTRExfV2luZG93ICkgewotCQlyZXR1cm4obW9kZSk7CS8qIFdpbGwgYmUgc2V0IGxhdGVyIG9uIG1vZGUgc3dpdGNoICovCi0JfQotCWlmICggbW9kZSA9PSBTRExfR1JBQl9PRkYgKSB7Ci0JCVhVbmdyYWJQb2ludGVyKFNETF9EaXNwbGF5LCBDdXJyZW50VGltZSk7Ci0JCVhVbmdyYWJLZXlib2FyZChTRExfRGlzcGxheSwgQ3VycmVudFRpbWUpOwotCX0gZWxzZSB7Ci0JCWlmICggdGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOICkgewotCQkJLyogVW5iaW5kIHRoZSBtb3VzZSBmcm9tIHRoZSBmdWxsc2NyZWVuIHdpbmRvdyAqLwotCQkJWFVuZ3JhYlBvaW50ZXIoU0RMX0Rpc3BsYXksIEN1cnJlbnRUaW1lKTsKLQkJfQotCQkvKiBUcnkgdG8gZ3JhYiB0aGUgbW91c2UgKi8KLSNpZiAwIC8qIFdlJ2xsIHdhaXQgaGVyZSB1bnRpbCB3ZSBhY3R1YWxseSBncmFiLCBvdGhlcndpc2UgYmVoYXZpb3IgdW5kZWZpbmVkICovCi0JCWZvciAoIG51bXRyaWVzID0gMDsgbnVtdHJpZXMgPCAxMDsgKytudW10cmllcyApIHsKLSNlbHNlCi0JCWZvciAoIDsgOyApIHsKLSNlbmRpZgotCQkJcmVzdWx0ID0gWEdyYWJQb2ludGVyKFNETF9EaXNwbGF5LCBTRExfV2luZG93LCBUcnVlLCAwLAotCQkJCQkJR3JhYk1vZGVBc3luYywgR3JhYk1vZGVBc3luYywKLQkJCQkJCVNETF9XaW5kb3csIE5vbmUsIEN1cnJlbnRUaW1lKTsKLQkJCWlmICggcmVzdWx0ID09IEdyYWJTdWNjZXNzICkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJU0RMX0RlbGF5KDEwMCk7Ci0JCX0KLQkJaWYgKCByZXN1bHQgIT0gR3JhYlN1Y2Nlc3MgKSB7Ci0JCQkvKiBVaCwgb2gsIHdoYXQgZG8gd2UgZG8gaGVyZT8gKi8gOwotCQl9Ci0JCS8qIE5vdyBncmFiIHRoZSBrZXlib2FyZCAqLwotCQlYR3JhYktleWJvYXJkKFNETF9EaXNwbGF5LCBXTXdpbmRvdywgVHJ1ZSwKLQkJCQlHcmFiTW9kZUFzeW5jLCBHcmFiTW9kZUFzeW5jLCBDdXJyZW50VGltZSk7Ci0KLQkJLyogUmFpc2UgdGhlIHdpbmRvdyBpZiB3ZSBncmFiIHRoZSBtb3VzZSAqLwotCQlpZiAoICEodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSApCi0JCQlYUmFpc2VXaW5kb3coU0RMX0Rpc3BsYXksIFdNd2luZG93KTsKLQotCQkvKiBNYWtlIHN1cmUgd2UgcmVnaXN0ZXIgaW5wdXQgZm9jdXMgKi8KLQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUElOUFVURk9DVVMpOwotCQkvKiBTaW5jZSB3ZSBncmFiYmVkIHRoZSBwb2ludGVyLCB3ZSBoYXZlIG1vdXNlIGZvY3VzLCB0b28uICovCi0JCVNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBNT1VTRUZPQ1VTKTsKLQl9Ci0JWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKLQotCXJldHVybihtb2RlKTsKLX0KLQotU0RMX0dyYWJNb2RlIFgxMV9HcmFiSW5wdXQoX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKQotewotCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7Ci0JbW9kZSA9IFgxMV9HcmFiSW5wdXROb0xvY2sodGhpcywgbW9kZSk7Ci0JU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotCi0JcmV0dXJuKG1vZGUpOwotfQotCi0jZGVmaW5lICBNTV9QRVJfSU5DSCAgMjUuNAotCi1pbnQKLVgxMV9HZXRNb25pdG9yRFBJKF9USElTLCBpbnQgICpweF9kcGksIGludCAqcHlfZHBpKQotewotICAgIERpc3BsYXkqICAgICAgZGlzcGxheSA9IFNETF9EaXNwbGF5OwotICAgIGludCAgICAgICAgICAgc2NyZWVuICA9IFhEZWZhdWx0U2NyZWVuKGRpc3BsYXkpOwotICAgIGludCAgICAgICAgICAgeGRwaSwgeWRwaTsKLQotICAgIGludCAgd2lkdGggICAgID0gWERpc3BsYXlXaWR0aChkaXNwbGF5LCBzY3JlZW4pOwotICAgIGludCAgd2lkdGhfbW0gID0gWERpc3BsYXlXaWR0aE1NKGRpc3BsYXksIHNjcmVlbik7Ci0gICAgaW50ICBoZWlnaHQgICAgPSBYRGlzcGxheUhlaWdodChkaXNwbGF5LCBzY3JlZW4pOwotICAgIGludCAgaGVpZ2h0X21tID0gWERpc3BsYXlIZWlnaHRNTShkaXNwbGF5LCBzY3JlZW4pOwotCi0gICAgaWYgKHdpZHRoX21tIDw9IDAgfHwgaGVpZ2h0X21tIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHhkcGkgPSAoaW50KSh3aWR0aCAgKiBNTV9QRVJfSU5DSCAvIHdpZHRoX21tICsgMC41KTsKLSAgICB5ZHBpID0gKGludCkoaGVpZ2h0ICogTU1fUEVSX0lOQ0ggLyBoZWlnaHRfbW0gKyAwLjUpOwotCi0gICAgaWYgKHhkcGkgPCAyMCB8fCB4ZHBpID4gNDAwIHx8IHlkcGkgPCAyMCB8fCB5ZHBpID4gNDAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAqcHhfZHBpID0geGRwaTsKLSAgICAqcHlfZHBpID0geWRwaTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLVgxMV9HZXRNb25pdG9yUmVjdChfVEhJUywgU0RMX1JlY3QgKnJlY3QpCi17Ci0gICAgRGlzcGxheSogIGRpc3BsYXkgPSBTRExfRGlzcGxheTsKLSAgICBpbnQgICAgICAgc2NyZWVuICA9IFhEZWZhdWx0U2NyZWVuKGRpc3BsYXkpOwotCi0gICAgcmVjdC0+eCA9IDA7Ci0gICAgcmVjdC0+eSA9IDA7Ci0gICAgcmVjdC0+dyA9IFhEaXNwbGF5V2lkdGgoZGlzcGxheSwgc2NyZWVuKTsKLSAgICByZWN0LT5oID0gWERpc3BsYXlIZWlnaHQoZGlzcGxheSwgc2NyZWVuKTsKLQotICAgIHJldHVybiAwOwotfQotCi0vKiBJZiAnaW5mbycgaXMgdGhlIHJpZ2h0IHZlcnNpb24sIHRoaXMgZnVuY3Rpb24gZmlsbHMgaXQgYW5kIHJldHVybnMgMS4KLSAgIE90aGVyd2lzZSwgaW4gY2FzZSBvZiBhIHZlcnNpb24gbWlzbWF0Y2gsIGl0IHJldHVybnMgLTEuCi0qLwotc3RhdGljIHZvaWQgbG9ja19kaXNwbGF5KHZvaWQpCi17Ci0JU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKLX0KLXN0YXRpYyB2b2lkIHVubG9ja19kaXNwbGF5KHZvaWQpCi17Ci0JLyogTWFrZSBzdXJlIGFueSBYMTEgdHJhbnNhY3Rpb25zIGFyZSBjb21wbGV0ZWQgKi8KLQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOwotCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Ci0JU0RMX1VubG9ja19FdmVudFRocmVhZCgpOwotfQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLWludCBYMTFfR2V0V01JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKQotewotCWlmICggaW5mby0+dmVyc2lvbi5tYWpvciA8PSBTRExfTUFKT1JfVkVSU0lPTiApIHsKLQkJaW5mby0+c3Vic3lzdGVtID0gU0RMX1NZU1dNX1gxMTsKLQkJaW5mby0+aW5mby54MTEuZGlzcGxheSA9IFNETF9EaXNwbGF5OwotCQlpbmZvLT5pbmZvLngxMS53aW5kb3cgPSBTRExfV2luZG93OwotCQlpZiAoIFNETF9WRVJTSU9OTlVNKGluZm8tPnZlcnNpb24ubWFqb3IsCi0JCSAgICAgICAgICAgICAgICAgICAgaW5mby0+dmVyc2lvbi5taW5vciwKLQkJICAgICAgICAgICAgICAgICAgICBpbmZvLT52ZXJzaW9uLnBhdGNoKSA+PSAxMDAyICkgewotCQkJaW5mby0+aW5mby54MTEuZnN3aW5kb3cgPSBGU3dpbmRvdzsKLQkJCWluZm8tPmluZm8ueDExLndtd2luZG93ID0gV013aW5kb3c7Ci0JCX0KLQotCi0JCWlmICggU0RMX1ZFUlNJT05OVU0oaW5mby0+dmVyc2lvbi5tYWpvciwKLQkJICAgICAgICAgICAgICAgICAgICBpbmZvLT52ZXJzaW9uLm1pbm9yLAotCQkgICAgICAgICAgICAgICAgICAgIGluZm8tPnZlcnNpb24ucGF0Y2gpID49IDEyMTIgKSB7Ci0JCQlpbmZvLT5pbmZvLngxMS5nZnhkaXNwbGF5ID0gR0ZYX0Rpc3BsYXk7Ci0JCX0KLQotCQlpbmZvLT5pbmZvLngxMS5sb2NrX2Z1bmMgPSBsb2NrX2Rpc3BsYXk7Ci0JCWluZm8tPmluZm8ueDExLnVubG9ja19mdW5jID0gdW5sb2NrX2Rpc3BsYXk7Ci0JCXJldHVybigxKTsKLQl9IGVsc2UgewotCQlTRExfU2V0RXJyb3IoIkFwcGxpY2F0aW9uIG5vdCBjb21waWxlZCB3aXRoIFNETCAlZC4lZFxuIiwKLQkJCQkJU0RMX01BSk9SX1ZFUlNJT04sIFNETF9NSU5PUl9WRVJTSU9OKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExd21fYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMXdtX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjMTFhMy4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExd21fYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJTRExfeDExdmlkZW8uaCIKLQotLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCi1leHRlcm4gdm9pZCBYMTFfU2V0Q2FwdGlvbk5vTG9jayhfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pOwotZXh0ZXJuIHZvaWQgWDExX1NldENhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKLWV4dGVybiB2b2lkIFgxMV9TZXRJY29uKF9USElTLCBTRExfU3VyZmFjZSAqaWNvbiwgVWludDggKm1hc2spOwotZXh0ZXJuIGludCBYMTFfSWNvbmlmeVdpbmRvdyhfVEhJUyk7Ci1leHRlcm4gU0RMX0dyYWJNb2RlIFgxMV9HcmFiSW5wdXROb0xvY2soX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKTsKLWV4dGVybiBTRExfR3JhYk1vZGUgWDExX0dyYWJJbnB1dChfVEhJUywgU0RMX0dyYWJNb2RlIG1vZGUpOwotZXh0ZXJuIGludCBYMTFfR2V0V01JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKTsKLWV4dGVybiB2b2lkICBYMTFfR2V0V2luZG93UG9zKF9USElTLCBpbnQgICpweCwgaW50ICAqcHkpOwotZXh0ZXJuIHZvaWQgIFgxMV9TZXRXaW5kb3dQb3MoX1RISVMsIGludCAgeCwgaW50ICB5KTsKLWV4dGVybiBpbnQgICBYMTFfSXNXaW5kb3dWaXNpYmxlKF9USElTLCBpbnQgIHJlY2VudGVyKTsKLWV4dGVybiBpbnQgWDExX0dldE1vbml0b3JEUEkoX1RISVMsIGludCogeGRwaSwgaW50ICp5ZHBpKTsKLWV4dGVybiBpbnQgWDExX0dldE1vbml0b3JSZWN0KF9USElTLCBTRExfUmVjdCAqcmVjdCk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExeXV2LmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3gxMS9TRExfeDExeXV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzY2YxMGIuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMXl1di5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBYRnJlZTg2IFh2IGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiBvZiBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hWCi0KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCi0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YU2htLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMvWHZsaWIuaCIKLQotI2luY2x1ZGUgIlNETF94MTF5dXZfYy5oIgotI2luY2x1ZGUgIi4uL1NETF95dXZmdW5jcy5oIgotCi0jZGVmaW5lIFhGUkVFODZfUkVGUkVTSF9IQUNLCi0jaWZkZWYgWEZSRUU4Nl9SRUZSRVNIX0hBQ0sKLSNpbmNsdWRlICJTRExfeDExaW1hZ2VfYy5oIgotI2VuZGlmCi0KLS8qIFdvcmthcm91bmQgd2hlbiBwaXRjaCAhPSB3aWR0aCAqLwotI2RlZmluZSBQSVRDSF9XT1JLQVJPVU5ECi0KLS8qIEZpeCBmb3IgdGhlIE5WaWRpYSBHZUZvcmNlIDIgLSB1c2UgdGhlIGxhc3QgYXZhaWxhYmxlIGFkYXB0b3IgKi8KLS8qI2RlZmluZSBVU0VfTEFTVF9BREFQVE9SKi8gIC8qIEFwcGFyZW50bHkgdGhlIE5WaWRpYSBkcml2ZXJzIGFyZSBmaXhlZCAqLwotCi0vKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gbWFuaXB1bGF0ZSBzb2Z0d2FyZSB2aWRlbyBvdmVybGF5cyAqLwotc3RhdGljIHN0cnVjdCBwcml2YXRlX3l1dmh3ZnVuY3MgeDExX3l1dmZ1bmNzID0gewotCVgxMV9Mb2NrWVVWT3ZlcmxheSwKLQlYMTFfVW5sb2NrWVVWT3ZlcmxheSwKLQlYMTFfRGlzcGxheVlVVk92ZXJsYXksCi0JWDExX0ZyZWVZVVZPdmVybGF5Ci19OwotCi1zdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgewotCWludCBwb3J0OwotI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCi0JaW50IHl1dl91c2VfbWl0c2htOwotCVhTaG1TZWdtZW50SW5mbyB5dXZzaG07Ci0jZW5kaWYKLQlTRExfTkFNRShYdkltYWdlKSAqaW1hZ2U7Ci19OwotCi0KLXN0YXRpYyBpbnQgKCpYX2hhbmRsZXIpKERpc3BsYXkgKiwgWEVycm9yRXZlbnQgKikgPSBOVUxMOwotCi0jaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKLS8qIFNoYXJlZCBtZW1vcnkgZXJyb3IgaGFuZGxlciByb3V0aW5lICovCi1zdGF0aWMgaW50IHNobV9lcnJvcjsKLXN0YXRpYyBpbnQgc2htX2VycmhhbmRsZXIoRGlzcGxheSAqZCwgWEVycm9yRXZlbnQgKmUpCi17Ci0gICAgICAgIGlmICggZS0+ZXJyb3JfY29kZSA9PSBCYWRBY2Nlc3MgKSB7Ci0gICAgICAgIAlzaG1fZXJyb3IgPSBUcnVlOwotICAgICAgICAJcmV0dXJuKDApOwotICAgICAgICB9IGVsc2UKLQkJcmV0dXJuKFhfaGFuZGxlcihkLGUpKTsKLX0KLSNlbmRpZiAvKiAhTk9fU0hBUkVEX01FTU9SWSAqLwotCi1zdGF0aWMgaW50IHh2X2Vycm9yOwotc3RhdGljIGludCB4dl9lcnJoYW5kbGVyKERpc3BsYXkgKmQsIFhFcnJvckV2ZW50ICplKQotewotICAgICAgICBpZiAoIGUtPmVycm9yX2NvZGUgPT0gQmFkTWF0Y2ggKSB7Ci0gICAgICAgIAl4dl9lcnJvciA9IFRydWU7Ci0gICAgICAgIAlyZXR1cm4oMCk7Ci0gICAgICAgIH0gZWxzZQotCQlyZXR1cm4oWF9oYW5kbGVyKGQsZSkpOwotfQotCi1TRExfT3ZlcmxheSAqWDExX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpCi17Ci0JU0RMX092ZXJsYXkgKm92ZXJsYXk7Ci0Jc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICpod2RhdGE7Ci0JaW50IHh2X3BvcnQ7Ci0JdW5zaWduZWQgaW50IGksIGosIGs7Ci0JdW5zaWduZWQgaW50IGFkYXB0b3JzOwotCVNETF9OQU1FKFh2QWRhcHRvckluZm8pICphaW5mbzsKLQlpbnQgYnBwOwotI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCi0JWFNobVNlZ21lbnRJbmZvICp5dXZzaG07Ci0jZW5kaWYKLQotCS8qIExvb2sgZm9yIHRoZSBYVmlkZW8gZXh0ZW5zaW9uIHdpdGggYSB2YWxpZCBwb3J0IGZvciB0aGlzIGZvcm1hdCAqLwotCXh2X3BvcnQgPSAtMTsKLQlpZiAoIChTdWNjZXNzID09IFNETF9OQU1FKFh2UXVlcnlFeHRlbnNpb24pKEdGWF9EaXNwbGF5LCAmaiwgJmosICZqLCAmaiwgJmopKSAmJgotCSAgICAgKFN1Y2Nlc3MgPT0gU0RMX05BTUUoWHZRdWVyeUFkYXB0b3JzKShHRlhfRGlzcGxheSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb290V2luZG93KEdGWF9EaXNwbGF5LCBTRExfU2NyZWVuKSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRhcHRvcnMsICZhaW5mbykpICkgewotI2lmZGVmIFVTRV9MQVNUX0FEQVBUT1IKLQkJZm9yICggaT0wOyBpIDwgYWRhcHRvcnM7ICsraSApCi0jZWxzZQotCQlmb3IgKCBpPTA7IChpIDwgYWRhcHRvcnMpICYmICh4dl9wb3J0ID09IC0xKTsgKytpICkKLSNlbmRpZiAvKiBVU0VfTEFTVF9BREFQVE9SICovCi0JCXsKLQkJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdmlzdWFsIGNhbiBiZSB1c2VkICovCi0JCQlpZiAoIEJVR0dZX1hGUkVFODYoPD0sIDQwMDEpICkgewotCQkJCWludCB2aXN1YWxfb2sgPSAwOwotCQkJCWZvciAoIGo9MDsgajxhaW5mb1tpXS5udW1fZm9ybWF0czsgKytqICkgewotCQkJCQlpZiAoIGFpbmZvW2ldLmZvcm1hdHNbal0udmlzdWFsX2lkID09Ci0JCQkJCQkJU0RMX1Zpc3VhbC0+dmlzdWFsaWQgKSB7Ci0JCQkJCQl2aXN1YWxfb2sgPSAxOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCAhIHZpc3VhbF9vayApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCAoYWluZm9baV0udHlwZSAmIFh2SW5wdXRNYXNrKSAmJgotCQkJICAgICAoYWluZm9baV0udHlwZSAmIFh2SW1hZ2VNYXNrKSApIHsKLQkJCQlpbnQgbnVtX2Zvcm1hdHM7Ci0JCQkJU0RMX05BTUUoWHZJbWFnZUZvcm1hdFZhbHVlcykgKmZvcm1hdHM7Ci0JCQkJZm9ybWF0cyA9IFNETF9OQU1FKFh2TGlzdEltYWdlRm9ybWF0cykoR0ZYX0Rpc3BsYXksCi0JCQkJICAgICAgICAgICAgICBhaW5mb1tpXS5iYXNlX2lkLCAmbnVtX2Zvcm1hdHMpOwotI2lmZGVmIFVTRV9MQVNUX0FEQVBUT1IKLQkJCQlmb3IgKCBqPTA7IGogPCBudW1fZm9ybWF0czsgKytqICkKLSNlbHNlCi0JCQkJZm9yICggaj0wOyAoaiA8IG51bV9mb3JtYXRzKSAmJiAoeHZfcG9ydCA9PSAtMSk7ICsraiApCi0jZW5kaWYgLyogVVNFX0xBU1RfQURBUFRPUiAqLwotCQkJCXsKLQkJCQkJaWYgKCAoVWludDMyKWZvcm1hdHNbal0uaWQgPT0gZm9ybWF0ICkgewotCQkJCQkJZm9yICggaz0wOyBrIDwgYWluZm9baV0ubnVtX3BvcnRzOyArK2sgKSB7Ci0JCQkJCQkJaWYgKCBTdWNjZXNzID09IFNETF9OQU1FKFh2R3JhYlBvcnQpKEdGWF9EaXNwbGF5LCBhaW5mb1tpXS5iYXNlX2lkK2ssIEN1cnJlbnRUaW1lKSApIHsKLQkJCQkJCQkJeHZfcG9ydCA9IGFpbmZvW2ldLmJhc2VfaWQrazsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICggZm9ybWF0cyApIHsKLQkJCQkJWEZyZWUoZm9ybWF0cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVNETF9OQU1FKFh2RnJlZUFkYXB0b3JJbmZvKShhaW5mbyk7Ci0JfQotCi0JLyogUHJlY2FsY3VsYXRlIHRoZSBicHAgZm9yIHRoZSBwaXRjaCB3b3JrYXJvdW5kIGJlbG93ICovCi0Jc3dpdGNoIChmb3JtYXQpIHsKLQkgICAgLyogQWRkIGFueSBvdGhlciBjYXNlcyB3ZSBuZWVkIHRvIHN1cHBvcnQuLi4gKi8KLQkgICAgY2FzZSBTRExfWVVZMl9PVkVSTEFZOgotCSAgICBjYXNlIFNETF9VWVZZX09WRVJMQVk6Ci0JICAgIGNhc2UgU0RMX1lWWVVfT1ZFUkxBWToKLQkJYnBwID0gMjsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCWJwcCA9IDE7Ci0JCWJyZWFrOwotCX0KLQotI2lmIDAKLSAgICAvKgotICAgICAqICEhISBGSVhNRToKLSAgICAgKiAiSGVyZSBhcmUgc29tZSBkaWZmcyBmb3IgWDExIGFuZCB5dXYuICBOb3RlIHRoYXQgdGhlIGxhc3QgcGFydCAybmQKLSAgICAgKiAgZGlmZiBzaG91bGQgcHJvYmFibHkgYmUgYSBuZXcgY2FsbCB0byBYdlF1ZXJ5QWRhcHRvckZyZWUgd2l0aCBhaW5mbwotICAgICAqICBhbmQgdGhlIG51bWJlciBvZiBhZGFwdG9ycywgaW5zdGVhZCBvZiB0aGUgbG9vcCB0aHJvdWdoIGxpa2UgSSBkaWQuIgotICAgICAqCi0gICAgICogIEFDSFRVTkc6IFRoaXMgaXMgYnJva2VuISBJdCBsb29rcyBsaWtlIFh2RnJlZUFkYXB0b3JJbmZvIGRvZXMgdGhpcwotICAgICAqICBmb3IgeW91LCBzbyB3ZSBlbmQgdXAgd2l0aCBhIGRvdWJsZS1mcmVlLiBJIG5lZWQgdG8gbG9vayBhdCB0aGlzCi0gICAgICogIG1vcmUgY2xvc2VseS4uLiAgLS1yeWFuLgotICAgICAqLwotIAlmb3IgKCBpPTA7IGkgPCBhZGFwdG9yczsgKytpICkgewotIAkgIGlmIChhaW5mb1tpXS5uYW1lICE9IE5VTEwpIFhmcmVlKGFpbmZvW2ldLm5hbWUpOwotIAkgIGlmIChhaW5mb1tpXS5mb3JtYXRzICE9IE5VTEwpIFhmcmVlKGFpbmZvW2ldLmZvcm1hdHMpOwotICAgCX0KLSAJWGZyZWUoYWluZm8pOwotI2VuZGlmCi0KLQlpZiAoIHh2X3BvcnQgPT0gLTEgKSB7Ci0JCVNETF9TZXRFcnJvcigiTm8gYXZhaWxhYmxlIHZpZGVvIHBvcnRzIGZvciByZXF1ZXN0ZWQgZm9ybWF0Iik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQkvKiBFbmFibGUgYXV0by1wYWludGluZyBvZiB0aGUgb3ZlcmxheSBjb2xvcmtleSAqLwotCXsKLQkJc3RhdGljIGNvbnN0IGNoYXIgKmF0dHJbXSA9IHsgIlhWX0FVVE9QQUlOVF9DT0xPUktFWSIsICJYVl9BVVRPUEFJTlRfQ09MT1VSS0VZIiB9OwotCQl1bnNpZ25lZCBpbnQgaTsKLQotCQlTRExfTkFNRShYdlNlbGVjdFBvcnROb3RpZnkpKEdGWF9EaXNwbGF5LCB4dl9wb3J0LCBUcnVlKTsKLQkJWF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih4dl9lcnJoYW5kbGVyKTsKLQkJZm9yICggaT0wOyBpIDwgc2l6ZW9mKGF0dHIpLyhzaXplb2YgYXR0clswXSk7ICsraSApIHsKLQkJCUF0b20gYTsKLQotCQkJeHZfZXJyb3IgPSBGYWxzZTsKLQkJCWEgPSBYSW50ZXJuQXRvbShHRlhfRGlzcGxheSwgYXR0cltpXSwgVHJ1ZSk7Ci0JCQlpZiAoIGEgIT0gTm9uZSApIHsKLSAgICAgCQkJCVNETF9OQU1FKFh2U2V0UG9ydEF0dHJpYnV0ZSkoR0ZYX0Rpc3BsYXksIHh2X3BvcnQsIGEsIDEpOwotCQkJCVhTeW5jKEdGWF9EaXNwbGF5LCBUcnVlKTsKLQkJCQlpZiAoICEgeHZfZXJyb3IgKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlYU2V0RXJyb3JIYW5kbGVyKFhfaGFuZGxlcik7Ci0JCVNETF9OQU1FKFh2U2VsZWN0UG9ydE5vdGlmeSkoR0ZYX0Rpc3BsYXksIHh2X3BvcnQsIEZhbHNlKTsKLQl9Ci0KLQkvKiBDcmVhdGUgdGhlIG92ZXJsYXkgc3RydWN0dXJlICovCi0Jb3ZlcmxheSA9IChTRExfT3ZlcmxheSAqKVNETF9tYWxsb2Moc2l6ZW9mICpvdmVybGF5KTsKLQlpZiAoIG92ZXJsYXkgPT0gTlVMTCApIHsKLQkJU0RMX05BTUUoWHZVbmdyYWJQb3J0KShHRlhfRGlzcGxheSwgeHZfcG9ydCwgQ3VycmVudFRpbWUpOwotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlTRExfbWVtc2V0KG92ZXJsYXksIDAsIChzaXplb2YgKm92ZXJsYXkpKTsKLQotCS8qIEZpbGwgaW4gdGhlIGJhc2ljIG1lbWJlcnMgKi8KLQlvdmVybGF5LT5mb3JtYXQgPSBmb3JtYXQ7Ci0Jb3ZlcmxheS0+dyA9IHdpZHRoOwotCW92ZXJsYXktPmggPSBoZWlnaHQ7Ci0KLQkvKiBTZXQgdXAgdGhlIFlVViBzdXJmYWNlIGZ1bmN0aW9uIHN0cnVjdHVyZSAqLwotCW92ZXJsYXktPmh3ZnVuY3MgPSAmeDExX3l1dmZ1bmNzOwotCW92ZXJsYXktPmh3X292ZXJsYXkgPSAxOwotCi0JLyogQ3JlYXRlIHRoZSBwaXhlbCBkYXRhIGFuZCBsb29rdXAgdGFibGVzICovCi0JaHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqKVNETF9tYWxsb2Moc2l6ZW9mICpod2RhdGEpOwotCW92ZXJsYXktPmh3ZGF0YSA9IGh3ZGF0YTsKLQlpZiAoIGh3ZGF0YSA9PSBOVUxMICkgewotCQlTRExfTkFNRShYdlVuZ3JhYlBvcnQpKEdGWF9EaXNwbGF5LCB4dl9wb3J0LCBDdXJyZW50VGltZSk7Ci0JCVNETF9PdXRPZk1lbW9yeSgpOwotCQlTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0JaHdkYXRhLT5wb3J0ID0geHZfcG9ydDsKLSNpZm5kZWYgTk9fU0hBUkVEX01FTU9SWQotCXl1dnNobSA9ICZod2RhdGEtPnl1dnNobTsKLQlTRExfbWVtc2V0KHl1dnNobSwgMCwgc2l6ZW9mKCp5dXZzaG0pKTsKLQlod2RhdGEtPmltYWdlID0gU0RMX05BTUUoWHZTaG1DcmVhdGVJbWFnZSkoR0ZYX0Rpc3BsYXksIHh2X3BvcnQsIGZvcm1hdCwKLQkJCQkJCSAgIDAsIHdpZHRoLCBoZWlnaHQsIHl1dnNobSk7Ci0jaWZkZWYgUElUQ0hfV09SS0FST1VORAotCWlmICggaHdkYXRhLT5pbWFnZSAhPSBOVUxMICYmIGh3ZGF0YS0+aW1hZ2UtPnBpdGNoZXNbMF0gIT0gKHdpZHRoKmJwcCkgKSB7Ci0JCS8qIEFqdXN0IG92ZXJsYXkgd2lkdGggYWNjb3JkaW5nIHRvIHBpdGNoICovIAotCQlYRnJlZShod2RhdGEtPmltYWdlKTsKLQkJd2lkdGggPSBod2RhdGEtPmltYWdlLT5waXRjaGVzWzBdIC8gYnBwOwotCQlod2RhdGEtPmltYWdlID0gU0RMX05BTUUoWHZTaG1DcmVhdGVJbWFnZSkoR0ZYX0Rpc3BsYXksIHh2X3BvcnQsIGZvcm1hdCwKLQkJCQkJCQkgICAwLCB3aWR0aCwgaGVpZ2h0LCB5dXZzaG0pOwotCX0KLSNlbmRpZiAvKiBQSVRDSF9XT1JLQVJPVU5EICovCi0JaHdkYXRhLT55dXZfdXNlX21pdHNobSA9IChod2RhdGEtPmltYWdlICE9IE5VTEwpOwotCWlmICggaHdkYXRhLT55dXZfdXNlX21pdHNobSApIHsKLQkJeXV2c2htLT5zaG1pZCA9IHNobWdldChJUENfUFJJVkFURSwgaHdkYXRhLT5pbWFnZS0+ZGF0YV9zaXplLAotCQkJCSAgICAgICBJUENfQ1JFQVQgfCAwNzc3KTsKLQkJaWYgKCB5dXZzaG0tPnNobWlkID49IDAgKSB7Ci0JCQl5dXZzaG0tPnNobWFkZHIgPSAoY2hhciAqKXNobWF0KHl1dnNobS0+c2htaWQsIDAsIDApOwotCQkJeXV2c2htLT5yZWFkT25seSA9IEZhbHNlOwotCQkJaWYgKCB5dXZzaG0tPnNobWFkZHIgIT0gKGNoYXIgKiktMSApIHsKLQkJCQlzaG1fZXJyb3IgPSBGYWxzZTsKLQkJCQlYX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHNobV9lcnJoYW5kbGVyKTsKLQkJCQlYU2htQXR0YWNoKEdGWF9EaXNwbGF5LCB5dXZzaG0pOwotCQkJCVhTeW5jKEdGWF9EaXNwbGF5LCBUcnVlKTsKLQkJCQlYU2V0RXJyb3JIYW5kbGVyKFhfaGFuZGxlcik7Ci0JCQkJaWYgKCBzaG1fZXJyb3IgKQotCQkJCQlzaG1kdCh5dXZzaG0tPnNobWFkZHIpOwotCQkJfSBlbHNlIHsKLQkJCQlzaG1fZXJyb3IgPSBUcnVlOwotCQkJfQotCQkJc2htY3RsKHl1dnNobS0+c2htaWQsIElQQ19STUlELCBOVUxMKTsKLQkJfSBlbHNlIHsKLQkJCXNobV9lcnJvciA9IFRydWU7Ci0JCX0KLQkJaWYgKCBzaG1fZXJyb3IgKSB7Ci0JCQlYRnJlZShod2RhdGEtPmltYWdlKTsKLQkJCWh3ZGF0YS0+eXV2X3VzZV9taXRzaG0gPSAwOwotCQl9IGVsc2UgewotCQkJaHdkYXRhLT5pbWFnZS0+ZGF0YSA9IHl1dnNobS0+c2htYWRkcjsKLQkJfQotCX0KLQlpZiAoICFod2RhdGEtPnl1dl91c2VfbWl0c2htICkKLSNlbmRpZiAvKiBOT19TSEFSRURfTUVNT1JZICovCi0JewotCQlod2RhdGEtPmltYWdlID0gU0RMX05BTUUoWHZDcmVhdGVJbWFnZSkoR0ZYX0Rpc3BsYXksIHh2X3BvcnQsIGZvcm1hdCwKLQkJCQkJCQkwLCB3aWR0aCwgaGVpZ2h0KTsKLQotI2lmZGVmIFBJVENIX1dPUktBUk9VTkQKLQkJaWYgKCBod2RhdGEtPmltYWdlICE9IE5VTEwgJiYgaHdkYXRhLT5pbWFnZS0+cGl0Y2hlc1swXSAhPSAod2lkdGgqYnBwKSApIHsKLQkJCS8qIEFqdXN0IG92ZXJsYXkgd2lkdGggYWNjb3JkaW5nIHRvIHBpdGNoICovIAotCQkJWEZyZWUoaHdkYXRhLT5pbWFnZSk7Ci0JCQl3aWR0aCA9IGh3ZGF0YS0+aW1hZ2UtPnBpdGNoZXNbMF0gLyBicHA7Ci0JCQlod2RhdGEtPmltYWdlID0gU0RMX05BTUUoWHZDcmVhdGVJbWFnZSkoR0ZYX0Rpc3BsYXksIHh2X3BvcnQsIGZvcm1hdCwKLQkJCQkJCQkJMCwgd2lkdGgsIGhlaWdodCk7Ci0JCX0KLSNlbmRpZiAvKiBQSVRDSF9XT1JLQVJPVU5EICovCi0JCWlmICggaHdkYXRhLT5pbWFnZSA9PSBOVUxMICkgewotCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgWFZpZGVvIGltYWdlIik7Ci0JCQlTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7Ci0JCQlyZXR1cm4oTlVMTCk7Ci0JCX0KLQkJaHdkYXRhLT5pbWFnZS0+ZGF0YSA9IFNETF9tYWxsb2MoaHdkYXRhLT5pbWFnZS0+ZGF0YV9zaXplKTsKLQkJaWYgKCBod2RhdGEtPmltYWdlLT5kYXRhID09IE5VTEwgKSB7Ci0JCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKLQkJCXJldHVybihOVUxMKTsKLQkJfQotCX0KLQotCS8qIEZpbmQgdGhlIHBpdGNoIGFuZCBvZmZzZXQgdmFsdWVzIGZvciB0aGUgb3ZlcmxheSAqLwotCW92ZXJsYXktPnBsYW5lcyA9IGh3ZGF0YS0+aW1hZ2UtPm51bV9wbGFuZXM7Ci0Jb3ZlcmxheS0+cGl0Y2hlcyA9IChVaW50MTYgKilTRExfbWFsbG9jKG92ZXJsYXktPnBsYW5lcyAqIHNpemVvZihVaW50MTYpKTsKLQlvdmVybGF5LT5waXhlbHMgPSAoVWludDggKiopU0RMX21hbGxvYyhvdmVybGF5LT5wbGFuZXMgKiBzaXplb2YoVWludDggKikpOwotCWlmICggIW92ZXJsYXktPnBpdGNoZXMgfHwgIW92ZXJsYXktPnBpeGVscyApIHsKLQkJU0RMX091dE9mTWVtb3J5KCk7Ci0JCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlmb3IgKCBpPTA7IGk8b3ZlcmxheS0+cGxhbmVzOyArK2kgKSB7Ci0JCW92ZXJsYXktPnBpdGNoZXNbaV0gPSBod2RhdGEtPmltYWdlLT5waXRjaGVzW2ldOwotCQlvdmVybGF5LT5waXhlbHNbaV0gPSAoVWludDggKilod2RhdGEtPmltYWdlLT5kYXRhICsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdkYXRhLT5pbWFnZS0+b2Zmc2V0c1tpXTsKLQl9Ci0KLSNpZmRlZiBYRlJFRTg2X1JFRlJFU0hfSEFDSwotCS8qIFdvcmsgYXJvdW5kIGFuIFhGcmVlODYgWCBzZXJ2ZXIgYnVnICg/KQotCSAgIFdlIGNhbid0IHBlcmZvcm0gbm9ybWFsIHVwZGF0ZXMgaW4gd2luZG93cyB0aGF0IGhhdmUgdmlkZW8KLQkgICBiZWluZyBvdXRwdXQgdG8gdGhlbS4gIFNlZSBTRExfeDExaW1hZ2UuYyBmb3IgbW9yZSBkZXRhaWxzLgotCSAqLwotCVgxMV9EaXNhYmxlQXV0b1JlZnJlc2godGhpcyk7Ci0jZW5kaWYKLQotCS8qIFdlJ3JlIGFsbCBkb25lLi4gKi8KLQlyZXR1cm4ob3ZlcmxheSk7Ci19Ci0KLWludCBYMTFfTG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQotewotCXJldHVybigwKTsKLX0KLQotdm9pZCBYMTFfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCi17Ci0JcmV0dXJuOwotfQotCi1pbnQgWDExX0Rpc3BsYXlZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSwgU0RMX1JlY3QgKnNyYywgU0RMX1JlY3QgKmRzdCkKLXsKLQlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKLQotCWh3ZGF0YSA9IG92ZXJsYXktPmh3ZGF0YTsKLQotI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCi0JaWYgKCBod2RhdGEtPnl1dl91c2VfbWl0c2htICkgewotCQlTRExfTkFNRShYdlNobVB1dEltYWdlKShHRlhfRGlzcGxheSwgaHdkYXRhLT5wb3J0LCBTRExfV2luZG93LCBTRExfR0MsCi0JICAgICAgICAgICAgICBod2RhdGEtPmltYWdlLAotCQkgICAgICBzcmMtPngsIHNyYy0+eSwgc3JjLT53LCBzcmMtPmgsCi0JCSAgICAgIGRzdC0+eCwgZHN0LT55LCBkc3QtPncsIGRzdC0+aCwgRmFsc2UpOwotCX0KLQllbHNlCi0jZW5kaWYKLQl7Ci0JCVNETF9OQU1FKFh2UHV0SW1hZ2UpKEdGWF9EaXNwbGF5LCBod2RhdGEtPnBvcnQsIFNETF9XaW5kb3csIFNETF9HQywKLQkJCQkgICAgIGh3ZGF0YS0+aW1hZ2UsCi0JCSAgICAgICAgICAgICAgICAgICAgIHNyYy0+eCwgc3JjLT55LCBzcmMtPncsIHNyYy0+aCwKLQkJICAgICAgICAgICAgICAgICAgICAgZHN0LT54LCBkc3QtPnksIGRzdC0+dywgZHN0LT5oKTsKLQl9Ci0JWFN5bmMoR0ZYX0Rpc3BsYXksIEZhbHNlKTsKLQlyZXR1cm4oMCk7Ci19Ci0KLXZvaWQgWDExX0ZyZWVZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSkKLXsKLQlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKLQotCWh3ZGF0YSA9IG92ZXJsYXktPmh3ZGF0YTsKLQlpZiAoIGh3ZGF0YSApIHsKLQkJU0RMX05BTUUoWHZVbmdyYWJQb3J0KShHRlhfRGlzcGxheSwgaHdkYXRhLT5wb3J0LCBDdXJyZW50VGltZSk7Ci0jaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKLQkJaWYgKCBod2RhdGEtPnl1dl91c2VfbWl0c2htICkgewotCQkJWFNobURldGFjaChHRlhfRGlzcGxheSwgJmh3ZGF0YS0+eXV2c2htKTsKLQkJCXNobWR0KGh3ZGF0YS0+eXV2c2htLnNobWFkZHIpOwotCQl9Ci0jZW5kaWYKLQkJaWYgKCBod2RhdGEtPmltYWdlICkgewotCQkJWEZyZWUoaHdkYXRhLT5pbWFnZSk7Ci0JCX0KLQkJU0RMX2ZyZWUoaHdkYXRhKTsKLQl9Ci0JaWYgKCBvdmVybGF5LT5waXRjaGVzICkgewotCQlTRExfZnJlZShvdmVybGF5LT5waXRjaGVzKTsKLQkJb3ZlcmxheS0+cGl0Y2hlcyA9IE5VTEw7Ci0JfQotCWlmICggb3ZlcmxheS0+cGl4ZWxzICkgewotCQlTRExfZnJlZShvdmVybGF5LT5waXhlbHMpOwotCQlvdmVybGF5LT5waXhlbHMgPSBOVUxMOwotCX0KLSNpZmRlZiBYRlJFRTg2X1JFRlJFU0hfSEFDSwotCVgxMV9FbmFibGVBdXRvUmVmcmVzaCh0aGlzKTsKLSNlbmRpZgotfQotCi0jZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFYgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veDExL1NETF94MTF5dXZfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMXl1dl9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Zjg3NTAuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94MTEvU0RMX3gxMXl1dl9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA2IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyogVGhpcyBpcyB0aGUgWEZyZWU4NiBYdiBleHRlbnNpb24gaW1wbGVtZW50YXRpb24gb2YgWVVWIHZpZGVvIG92ZXJsYXlzICovCi0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfeDExdmlkZW8uaCIKLQotI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hWCi0KLWV4dGVybiBTRExfT3ZlcmxheSAqWDExX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpOwotCi1leHRlcm4gaW50IFgxMV9Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOwotCi1leHRlcm4gdm9pZCBYMTFfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOwotCi1leHRlcm4gaW50IFgxMV9EaXNwbGF5WVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXksIFNETF9SZWN0ICpzcmMsIFNETF9SZWN0ICpkc3QpOwotCi1leHRlcm4gdm9pZCBYMTFfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKLQotI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hWICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiYjRhOC4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUzICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDYgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotICogWGJpb3MgU0RMIHZpZGVvIGRyaXZlcgotICogCi0gKiBQYXRyaWNlIE1hbmRpbgotICovCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBNaW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSA8bWludC9jb29raWUuaD4KLSNpbmNsdWRlIDxtaW50L29zYmluZC5oPgotI2luY2x1ZGUgPG1pbnQvZmFsY29uLmg+Ci0KLSNpbmNsdWRlICJTRExfdmlkZW8uaCIKLSNpbmNsdWRlICJTRExfbW91c2UuaCIKLSNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKLSNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKLSNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCi0KLSNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfYXRhcmljMnBfcy5oIgotI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaWV2ZW50c19jLmgiCi0jaW5jbHVkZSAiLi4vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvY19jLmgiCi0jaW5jbHVkZSAiLi4vYXRhcmljb21tb24vU0RMX2F0YXJpZ2xfYy5oIgotI2luY2x1ZGUgIlNETF94Ymlvcy5oIgotI2luY2x1ZGUgIlNETF94Ymlvc19ibG93dXAuaCIKLSNpbmNsdWRlICJTRExfeGJpb3NfY2VudHNjcmVlbi5oIgotI2luY2x1ZGUgIlNETF94Ymlvc19zYjMuaCIKLSNpbmNsdWRlICJTRExfeGJpb3NfdHZlaWxsZS5oIgotCi0jZGVmaW5lIFhCSU9TX1ZJRF9EUklWRVJfTkFNRSAieGJpb3MiCi0KLS8qIERlYnVnIHByaW50IGluZm8gKi8KLSNpZiAwCi0jZGVmaW5lIERFQlVHX1BSSU5UKHdoYXQpIFwKLQl7IFwKLQkJcHJpbnRmIHdoYXQ7IFwKLQl9Ci0jZGVmaW5lIERFQlVHX1ZJREVPX1hCSU9TIDEKLSNlbHNlCi0jZGVmaW5lIERFQlVHX1BSSU5UKHdoYXQpCi0jdW5kZWYgREVCVUdfVklERU9fWEJJT1MKLSNlbmRpZgotCi0vKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgWEJJT1NfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOwotc3RhdGljIFNETF9SZWN0ICoqWEJJT1NfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKLXN0YXRpYyBTRExfU3VyZmFjZSAqWEJJT1NfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOwotc3RhdGljIGludCBYQklPU19TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpOwotc3RhdGljIHZvaWQgWEJJT1NfVmlkZW9RdWl0KF9USElTKTsKLQotLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgWEJJT1NfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyBpbnQgWEJJT1NfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwotc3RhdGljIGludCBYQklPU19GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Ci1zdGF0aWMgdm9pZCBYQklPU19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIFhCSU9TX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKLXN0YXRpYyB2b2lkIFhCSU9TX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0vKiBPcGVuR0wgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBYQklPU19HTF9Td2FwQnVmZmVycyhfVEhJUyk7Ci0jZW5kaWYKLQotLyogVG8gc2V0dXAgcGFsZXR0ZSAqLwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQJVFRfcGFsZXR0ZVsyNTZdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcJRjMwX3BhbGV0dGVbMjU2XTsKLQotLyogWGJpb3MgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBYQklPU19BdmFpbGFibGUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGNvb2tpZV92ZG8sIGNvb2tpZV9taWwsIGNvb2tpZV9oYWRlLCBjb29raWVfc2NwbjsKLQotCS8qIE1pbGFuL0hhZGVzIEF0YXJpIGNsb25lcyBkbyBub3QgaGF2ZSBhbiBBdGFyaSB2aWRlbyBjaGlwICovCi0JaWYgKCAoR2V0Y29va2llKENfX01JTCwgJmNvb2tpZV9taWwpID09IENfRk9VTkQpIHx8Ci0JCShHZXRjb29raWUoQ19oYWRlLCAmY29va2llX2hhZGUpID09IENfRk9VTkQpICkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBDb29raWUgX1ZETyBwcmVzZW50ID8gaWYgbm90LCBhc3N1bWUgU1QgbWFjaGluZSAqLwotCWlmIChHZXRjb29raWUoQ19fVkRPLCAmY29va2llX3ZkbykgIT0gQ19GT1VORCkgewotCQljb29raWVfdmRvID0gVkRPX1NUIDw8IDE2OwotCX0KLQotCS8qIFRlc3QgaWYgd2UgaGF2ZSBhIG1vbm9jaHJvbWUgbW9uaXRvciBwbHVnZ2VkIGluICovCi0Jc3dpdGNoKCBjb29raWVfdmRvID4+MTYpIHsKLQkJY2FzZSBWRE9fU1Q6Ci0JCWNhc2UgVkRPX1NURToKLQkJCWlmICggR2V0cmV6KCkgPT0gKFNUX0hJR0g+PjgpICkKLQkJCQlyZXR1cm4gMDsKLQkJCWJyZWFrOwotCQljYXNlIFZET19UVDoKLQkJCWlmICggKEVnZXRTaGlmdCgpICYgRVNfTU9ERSkgPT0gVFRfSElHSCkKLQkJCQlyZXR1cm4gMDsKLQkJCWJyZWFrOwotCQljYXNlIFZET19GMzA6Ci0JCQlpZiAoIFZnZXRNb25pdG9yKCkgPT0gTU9OSVRPUl9NT05PKQotCQkJCXJldHVybiAwOwotCQkJaWYgKEdldGNvb2tpZShDX1NDUE4sICZjb29raWVfc2NwbikgPT0gQ19GT1VORCkgewotCQkJCWlmICghU0RMX1hCSU9TX1NCM1VzYWJsZSgoc2Nwbl9jb29raWVfdCAqKWNvb2tpZV9zY3BuKSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBYQklPU19EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCi17Ci0JU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOwotCVNETF9mcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBTRExfVmlkZW9EZXZpY2UgKlhCSU9TX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCi17Ci0JU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKLQlpZiAoIGRldmljZSApIHsKLQkJU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOwotCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7Ci0JCWRldmljZS0+Z2xfZGF0YSA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVHTERhdGEgKikKLQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+Z2xfZGF0YSkpOwotCX0KLQlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgewotCQlTRExfT3V0T2ZNZW1vcnkoKTsKLQkJaWYgKCBkZXZpY2UgKSB7Ci0JCQlTRExfZnJlZShkZXZpY2UpOwotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci0JU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKLQlTRExfbWVtc2V0KGRldmljZS0+Z2xfZGF0YSwgMCwgc2l6ZW9mKCpkZXZpY2UtPmdsX2RhdGEpKTsKLQotCS8qIFZpZGVvIGZ1bmN0aW9ucyAqLwotCWRldmljZS0+VmlkZW9Jbml0ID0gWEJJT1NfVmlkZW9Jbml0OwotCWRldmljZS0+TGlzdE1vZGVzID0gWEJJT1NfTGlzdE1vZGVzOwotCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gWEJJT1NfU2V0VmlkZW9Nb2RlOwotCWRldmljZS0+U2V0Q29sb3JzID0gWEJJT1NfU2V0Q29sb3JzOwotCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOwotCWRldmljZS0+VmlkZW9RdWl0ID0gWEJJT1NfVmlkZW9RdWl0OwotCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBYQklPU19BbGxvY0hXU3VyZmFjZTsKLQlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBYQklPU19Mb2NrSFdTdXJmYWNlOwotCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gWEJJT1NfVW5sb2NrSFdTdXJmYWNlOwotCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IFhCSU9TX0ZsaXBIV1N1cmZhY2U7Ci0JZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gWEJJT1NfRnJlZUhXU3VyZmFjZTsKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLQkvKiBPcGVuR0wgZnVuY3Rpb25zICovCi0JZGV2aWNlLT5HTF9Mb2FkTGlicmFyeSA9IFNETF9BdGFyaUdMX0xvYWRMaWJyYXJ5OwotCWRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBTRExfQXRhcmlHTF9HZXRQcm9jQWRkcmVzczsKLQlkZXZpY2UtPkdMX0dldEF0dHJpYnV0ZSA9IFNETF9BdGFyaUdMX0dldEF0dHJpYnV0ZTsKLQlkZXZpY2UtPkdMX01ha2VDdXJyZW50ID0gU0RMX0F0YXJpR0xfTWFrZUN1cnJlbnQ7Ci0JZGV2aWNlLT5HTF9Td2FwQnVmZmVycyA9IFhCSU9TX0dMX1N3YXBCdWZmZXJzOwotI2VuZGlmCi0KLQkvKiBFdmVudHMgKi8KLQlkZXZpY2UtPkluaXRPU0tleW1hcCA9IEF0YXJpX0luaXRPU0tleW1hcDsKLQlkZXZpY2UtPlB1bXBFdmVudHMgPSBBdGFyaV9QdW1wRXZlbnRzOwotCi0JZGV2aWNlLT5mcmVlID0gWEJJT1NfRGVsZXRlRGV2aWNlOwotCi0JcmV0dXJuIGRldmljZTsKLX0KLQotVmlkZW9Cb290U3RyYXAgWEJJT1NfYm9vdHN0cmFwID0gewotCVhCSU9TX1ZJRF9EUklWRVJfTkFNRSwgIkF0YXJpIFhiaW9zIGRyaXZlciIsCi0JWEJJT1NfQXZhaWxhYmxlLCBYQklPU19DcmVhdGVEZXZpY2UKLX07Ci0KLXZvaWQgU0RMX1hCSU9TX0FkZE1vZGUoX1RISVMsIFVpbnQxNiBtb2RlY29kZSwgVWludDE2IHdpZHRoLCBVaW50MTYgaGVpZ2h0LAotCVVpbnQxNiBkZXB0aCwgU0RMX2Jvb2wgZmxhZ3MpCi17Ci0JaW50IGksIGN1cnBvczsKLQl4Ymlvc21vZGVfdCAqY3VycmVudF9tb2RlOwotCi0JLyogQ2hlY2sgaWYgbW9kZSBhbHJlYWR5IGV4aXN0cyAqLwotCWlmIChYQklPU19tb2RlbGlzdCkgewotCQljdXJyZW50X21vZGUgPSBYQklPU19tb2RlbGlzdDsKLQkJZm9yIChpPTA7aTxYQklPU19udW1tb2RlczsgaSsrLCBjdXJyZW50X21vZGUrKykgewotCQkJaWYgKGN1cnJlbnRfbW9kZS0+d2lkdGggIT0gd2lkdGgpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoY3VycmVudF9tb2RlLT5oZWlnaHQgIT0gaGVpZ2h0KQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGN1cnJlbnRfbW9kZS0+ZGVwdGggIT0gZGVwdGgpCi0JCQkJY29udGludWU7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkrK1hCSU9TX251bW1vZGVzOwotCVhCSU9TX21vZGVsaXN0ID0gKHhiaW9zbW9kZV90ICopIFNETF9yZWFsbG9jKFhCSU9TX21vZGVsaXN0LCBYQklPU19udW1tb2RlcyAqIHNpemVvZih4Ymlvc21vZGVfdCkpOwotCi0JLyogS2VlcCB0aGUgbGlzdCBzb3J0ZWQ6IGJwcCwgd2lkdGgsIGhlaWdodCAqLwotCWN1cnBvcz0wOwotCi0JZm9yKGk9MDsgaTxYQklPU19udW1tb2Rlcy0xOyBpKyspIHsKLQkJaWYgKFhCSU9TX21vZGVsaXN0W2ldLmRlcHRoIDw9IGRlcHRoKSB7Ci0JCQlpZiAoWEJJT1NfbW9kZWxpc3RbaV0ud2lkdGggPCB3aWR0aCkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChYQklPU19tb2RlbGlzdFtpXS53aWR0aCA9PSB3aWR0aCkgewotCQkJCWlmIChYQklPU19tb2RlbGlzdFtpXS5oZWlnaHQgPD0gaGVpZ2h0KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQljdXJwb3MrKzsKLQl9Ci0KLQkvKiBQdXNoIHJlbWFpbmluZyBtb2RlcyBmdXJ0aGVyICovCi0JZm9yKGk9WEJJT1NfbnVtbW9kZXMtMTsgaT5jdXJwb3M7IGktLSkgewotCQlTRExfbWVtY3B5KCZYQklPU19tb2RlbGlzdFtpXSwgJlhCSU9TX21vZGVsaXN0W2ktMV0sIHNpemVvZih4Ymlvc21vZGVfdCkpOwotCX0KLQotCVhCSU9TX21vZGVsaXN0W2N1cnBvc10ubnVtYmVyID0gbW9kZWNvZGU7Ci0JWEJJT1NfbW9kZWxpc3RbY3VycG9zXS53aWR0aCA9IHdpZHRoOwotCVhCSU9TX21vZGVsaXN0W2N1cnBvc10uaGVpZ2h0ID0gaGVpZ2h0OwotCVhCSU9TX21vZGVsaXN0W2N1cnBvc10uZGVwdGggPSBkZXB0aDsKLQlYQklPU19tb2RlbGlzdFtjdXJwb3NdLmRvdWJsZWxpbmUgPSBmbGFnczsKLX0KLQotc3RhdGljIGludCBYQklPU19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKLXsKLQlpbnQgaSxqOCxqMTY7Ci0JeGJpb3Ntb2RlX3QgKmN1cnJlbnRfbW9kZTsKLQl1bnNpZ25lZCBsb25nIGNvb2tpZV9ibG93LCBjb29raWVfc2NwbiwgY29va2llX2NudHM7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwotCW1lbXNldCAoU0RMX21vZGVsaXN0LCAwLCBzaXplb2YoU0RMX21vZGVsaXN0KSk7Ci0KLQkvKiBDb29raWUgX1ZETyBwcmVzZW50ID8gaWYgbm90LCBhc3N1bWUgU1QgbWFjaGluZSAqLwotCWlmIChHZXRjb29raWUoQ19fVkRPLCAmWEJJT1NfY3ZkbykgIT0gQ19GT1VORCkgewotCQlYQklPU19jdmRvID0gVkRPX1NUIDw8IDE2OwotCX0KLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb2xkIHBhbGV0dGUgKi8KLQlYQklPU19vbGRwYWxldHRlID0gKHZvaWQgKilTRExfbWFsbG9jKDI1NipzaXplb2YobG9uZykpOwotCWlmICggIVhCSU9TX29sZHBhbGV0dGUgKSB7Ci0JCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb2xkIHBhbGV0dGVcbiIpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIEluaXRpYWxpemUgdmlkZW8gbW9kZSBsaXN0ICovCi0JLyogYW5kIHNhdmUgY3VycmVudCBzY3JlZW4gc3RhdHVzIChwYWxldHRlLCBzY3JlZW4gYWRkcmVzcywgdmlkZW8gbW9kZSkgKi8KLQlYQklPU19udW1tb2RlcyA9IDA7Ci0JWEJJT1NfbW9kZWxpc3QgPSBOVUxMOwotCVhCSU9TX2NlbnRzY3JlZW4gPSBTRExfRkFMU0U7Ci0KLQlzd2l0Y2ggKFhCSU9TX2N2ZG8gPj4xNikgewotCQljYXNlIFZET19TVDoKLQkJY2FzZSBWRE9fU1RFOgotCQkJewotCQkJCXNob3J0ICpvbGRwYWxldHRlOwotCi0JCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgU1RfTE9XPj44LDMyMCwyMDAsNCxTRExfRkFMU0UpOwotCQkJCi0JCQkJWEJJT1Nfb2xkdmJhc2U9UGh5c2Jhc2UoKTsKLQkJCQlYQklPU19vbGR2bW9kZT1HZXRyZXooKTsKLQkJCQlzd2l0Y2goWEJJT1Nfb2xkdm1vZGUgPDwgOCkgewotCQkJCQljYXNlIFNUX0xPVzoKLQkJCQkJCVhCSU9TX29sZG51bWNvbD0xNjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNUX01FRDoKLQkJCQkJCVhCSU9TX29sZG51bWNvbD00OwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU1RfSElHSDoKLQkJCQkJCVhCSU9TX29sZG51bWNvbD0yOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlYQklPU19vbGRudW1jb2w9MDsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCW9sZHBhbGV0dGU9IChzaG9ydCAqKSBYQklPU19vbGRwYWxldHRlOwotCQkJCWZvciAoaT0wO2k8WEJJT1Nfb2xkbnVtY29sO2krKykgewotCQkJCQkqb2xkcGFsZXR0ZSsrPVNldGNvbG9yKGksLTEpOwotCQkJCX0KLQotCQkJCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IDg7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBWRE9fVFQ6Ci0KLQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIFRUX0xPVywzMjAsNDgwLDgsU0RMX0ZBTFNFKTsKLQkJCS8qIFNvZnR3YXJlIGRvdWJsZS1saW5lZCBtb2RlICovCi0JCQlTRExfWEJJT1NfQWRkTW9kZSh0aGlzLCBUVF9MT1csMzIwLDI0MCw4LFNETF9UUlVFKTsKLQotCQkJWEJJT1Nfb2xkdmJhc2U9TG9nYmFzZSgpOwotCQkJWEJJT1Nfb2xkdm1vZGU9RWdldFNoaWZ0KCk7Ci0KLQkJCXN3aXRjaChYQklPU19vbGR2bW9kZSAmIEVTX01PREUpIHsKLQkJCQljYXNlIFRUX0xPVzoKLQkJCQkJWEJJT1Nfb2xkbnVtY29sPTI1NjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTVF9MT1c6Ci0JCQkJY2FzZSBUVF9NRUQ6Ci0JCQkJCVhCSU9TX29sZG51bWNvbD0xNjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTVF9NRUQ6Ci0JCQkJCVhCSU9TX29sZG51bWNvbD00OwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNUX0hJR0g6Ci0JCQkJY2FzZSBUVF9ISUdIOgotCQkJCQlYQklPU19vbGRudW1jb2w9MjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJWEJJT1Nfb2xkbnVtY29sPTA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKFhCSU9TX29sZG51bWNvbCkgewotCQkJCUVnZXRQYWxldHRlKDAsIFhCSU9TX29sZG51bWNvbCwgWEJJT1Nfb2xkcGFsZXR0ZSk7Ci0JCQl9Ci0KLQkJCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IDg7Ci0JCQlicmVhazsKLQkJY2FzZSBWRE9fRjMwOgotCQkJc3dpdGNoIChWZ2V0TW9uaXRvcigpKQotCQkJewotCQkJCWNhc2UgTU9OSVRPUl9NT05POgotCQkJCQkvKiBOb3QgdXNhYmxlICovCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTU9OSVRPUl9SR0I6Ci0JCQkJY2FzZSBNT05JVE9SX1RWOgotCQkJCQlTRExfWEJJT1NfQWRkTW9kZSh0aGlzLCBCUFMxNnxDT0w4MHxPVkVSU0NBTnxWRVJURkxBRyw3NjgsNDgwLDE2LFNETF9GQUxTRSk7Ci0JCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIEJQUzE2fENPTDgwfE9WRVJTQ0FOLDc2OCwyNDAsMTYsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTMTZ8Q09MODB8VkVSVEZMQUcsNjQwLDQwMCwxNixTRExfRkFMU0UpOwotCQkJCQlTRExfWEJJT1NfQWRkTW9kZSh0aGlzLCBCUFMxNnxDT0w4MCw2NDAsMjAwLDE2LFNETF9GQUxTRSk7Ci0JCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIEJQUzE2fE9WRVJTQ0FOfFZFUlRGTEFHLDM4NCw0ODAsMTYsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTMTZ8T1ZFUlNDQU4sMzg0LDI0MCwxNixTRExfRkFMU0UpOwotCQkJCQlTRExfWEJJT1NfQWRkTW9kZSh0aGlzLCBCUFMxNnxWRVJURkxBRywzMjAsNDAwLDE2LFNETF9GQUxTRSk7Ci0JCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIEJQUzE2LDMyMCwyMDAsMTYsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTOHxDT0w4MHxPVkVSU0NBTnxWRVJURkxBRyw3NjgsNDgwLDgsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTOHxDT0w4MHxPVkVSU0NBTiw3NjgsMjQwLDgsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTOHxDT0w4MHxWRVJURkxBRyw2NDAsNDAwLDgsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTOHxDT0w4MCw2NDAsMjAwLDgsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTOHxPVkVSU0NBTnxWRVJURkxBRywzODQsNDgwLDgsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTOHxPVkVSU0NBTiwzODQsMjQwLDgsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTOHxWRVJURkxBRywzMjAsNDAwLDgsU0RMX0ZBTFNFKTsKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTOCwzMjAsMjAwLDgsU0RMX0ZBTFNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBNT05JVE9SX1ZHQToKLQkJCQkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgQlBTMTYsMzIwLDQ4MCwxNixTRExfRkFMU0UpOwotCQkJCQlTRExfWEJJT1NfQWRkTW9kZSh0aGlzLCBCUFMxNnxWRVJURkxBRywzMjAsMjQwLDE2LFNETF9GQUxTRSk7Ci0JCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIEJQUzh8Q09MODAsNjQwLDQ4MCw4LFNETF9GQUxTRSk7Ci0JCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIEJQUzh8Q09MODB8VkVSVEZMQUcsNjQwLDI0MCw4LFNETF9GQUxTRSk7Ci0JCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIEJQUzgsMzIwLDQ4MCw4LFNETF9GQUxTRSk7Ci0JCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIEJQUzh8VkVSVEZMQUcsMzIwLDI0MCw4LFNETF9GQUxTRSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJWEJJT1Nfb2xkdmJhc2U9TG9nYmFzZSgpOwotCQkJWEJJT1Nfb2xkdm1vZGU9VnNldE1vZGUoLTEpOwotCi0JCQlYQklPU19vbGRudW1jb2w9IDE8PCAoMSA8PCAoWEJJT1Nfb2xkdm1vZGUgJiBOVU1DT0xTKSk7Ci0JCQlpZiAoWEJJT1Nfb2xkbnVtY29sID4gMjU2KSB7Ci0JCQkJWEJJT1Nfb2xkbnVtY29sID0gMDsKLQkJCX0KLQkJCWlmIChYQklPU19vbGRudW1jb2wpIHsKLQkJCQlWZ2V0UkdCKDAsIFhCSU9TX29sZG51bWNvbCwgWEJJT1Nfb2xkcGFsZXR0ZSk7Ci0JCQl9Ci0KLQkJCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IDE2OwotCi0JCQkvKiBLZWVwIHZnYS9ydmIsIGFuZCBwYWwvbnRzYyBiaXRzICovCi0JCQljdXJyZW50X21vZGUgPSBYQklPU19tb2RlbGlzdDsKLQkJCWZvciAoaT0wO2k8WEJJT1NfbnVtbW9kZXM7aSsrKSB7Ci0JCQkJVWludDE2IG5ld3Ztb2RlOwkJCQotCi0JCQkJbmV3dm1vZGUgPSBjdXJyZW50X21vZGUtPm51bWJlcjsKLQkJCQluZXd2bW9kZSAmPSB+KFZHQXxQQUwpOwotCQkJCW5ld3Ztb2RlIHw9IFhCSU9TX29sZHZtb2RlICYgKFZHQXxQQUwpOwotCQkJCWN1cnJlbnRfbW9kZS0+bnVtYmVyID0gbmV3dm1vZGU7Ci0JCQkJCi0JCQkJY3VycmVudF9tb2RlKys7Ci0JCQl9Ci0KLQkJCS8qIEluaXRpYWxpemUgQmxvd1VwL1NCMy9DZW50c2NyZWVuIHN0dWZmIGlmIHByZXNlbnQgKi8KLQkJCWlmIChHZXRjb29raWUoQ19CTE9XLCAmY29va2llX2Jsb3cpID09IENfRk9VTkQpIHsKLQkJCQlTRExfWEJJT1NfQmxvd3VwSW5pdCh0aGlzLCAoYmxvd19jb29raWVfdCAqKWNvb2tpZV9ibG93KTsKLQkJCX0gZWxzZSBpZiAoR2V0Y29va2llKENfU0NQTiwgJmNvb2tpZV9zY3BuKSA9PSBDX0ZPVU5EKSB7Ci0JCQkJU0RMX1hCSU9TX1NCM0luaXQodGhpcywgKHNjcG5fY29va2llX3QgKiljb29raWVfc2Nwbik7Ci0JCQl9IGVsc2UgaWYgKEdldGNvb2tpZShDX0NOVFMsICZjb29raWVfY250cykgPT0gQ19GT1VORCkgewotCQkJCVhCSU9TX29sZHZtb2RlID0gU0RMX1hCSU9TX0NlbnRzY3JlZW5Jbml0KHRoaXMpOwotCQkJCVhCSU9TX2NlbnRzY3JlZW4gPSBTRExfVFJVRTsKLQkJCX0KLQotCQkJYnJlYWs7Ci0JfQotCi0JLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCi0JaWYgKCBYQklPU19udW1tb2RlcyA+IDAgKSB7Ci0JCS8qIEZJWE1FOiBwYXJzZSB2aWRlbyBtb2RlIGxpc3QgdG8gc2VhcmNoIGZvciBjdXJyZW50IG1vZGUgKi8KLQkJdGhpcy0+aW5mby5jdXJyZW50X3cgPSBYQklPU19tb2RlbGlzdFswXS53aWR0aDsKLQkJdGhpcy0+aW5mby5jdXJyZW50X2ggPSBYQklPU19tb2RlbGlzdFswXS5oZWlnaHQ7Ci0JfQotCi0JY3VycmVudF9tb2RlID0gWEJJT1NfbW9kZWxpc3Q7Ci0JajggPSBqMTYgPSAwOwotCWZvciAoaT0wOyBpPFhCSU9TX251bW1vZGVzOyBpKyssIGN1cnJlbnRfbW9kZSsrKSB7Ci0JCXN3aXRjaCAoY3VycmVudF9tb2RlLT5kZXB0aCkgewotCQkJY2FzZSA0OgotCQkJY2FzZSA4OgotCQkJCVNETF9tb2RlbGlzdFswXVtqOF0gPSBTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpOwotCQkJCVNETF9tb2RlbGlzdFswXVtqOF0tPnggPSBTRExfbW9kZWxpc3RbMF1bajhdLT55ID0gMDsKLQkJCQlTRExfbW9kZWxpc3RbMF1bajhdLT53ID0gY3VycmVudF9tb2RlLT53aWR0aDsKLQkJCQlTRExfbW9kZWxpc3RbMF1bajhdLT5oID0gY3VycmVudF9tb2RlLT5oZWlnaHQ7Ci0JCQkJWEJJT1NfdmlkZW9tb2Rlc1swXVtqOF09Y3VycmVudF9tb2RlOwotCQkJCWo4Kys7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCVNETF9tb2RlbGlzdFsxXVtqMTZdID0gU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKLQkJCQlTRExfbW9kZWxpc3RbMV1bajE2XS0+eCA9IFNETF9tb2RlbGlzdFsxXVtqMTZdLT55ID0gMDsKLQkJCQlTRExfbW9kZWxpc3RbMV1bajE2XS0+dyA9IGN1cnJlbnRfbW9kZS0+d2lkdGg7Ci0JCQkJU0RMX21vZGVsaXN0WzFdW2oxNl0tPmggPSBjdXJyZW50X21vZGUtPmhlaWdodDsKLQkJCQlYQklPU192aWRlb21vZGVzWzFdW2oxNl09Y3VycmVudF9tb2RlOwotCQkJCWoxNisrOwotCQkJCWJyZWFrOwotCQl9CQkKLQl9Ci0JU0RMX21vZGVsaXN0WzBdW2o4XSA9IE5VTEw7Ci0JU0RMX21vZGVsaXN0WzFdW2oxNl0gPSBOVUxMOwotCi0JWEJJT1Nfc2NyZWVuc1swXT1OVUxMOwotCVhCSU9TX3NjcmVlbnNbMV09TlVMTDsKLQlYQklPU19zaGFkb3dzY3JlZW49TlVMTDsKLQotCS8qIFVwZGF0ZSBoYXJkd2FyZSBpbmZvICovCi0JdGhpcy0+aW5mby5od19hdmFpbGFibGUgPSAxOwotCXRoaXMtPmluZm8udmlkZW9fbWVtID0gKFVpbnQzMikgQXRhcmlfU3lzTWFsbG9jKC0xTCwgTVhfU1RSQU0pOwotCi0JLyogSW5pdCBjaHVua3kgdG8gcGxhbmFyIHJvdXRpbmUgKi8KLQlTRExfQXRhcmlfQzJwQ29udmVydCA9IFNETF9BdGFyaV9DMnBDb252ZXJ0ODsKLQotI2lmIFNETF9WSURFT19PUEVOR0wKLQlTRExfQXRhcmlHTF9Jbml0UG9pbnRlcnModGhpcyk7Ci0jZW5kaWYKLQotCS8qIERpc2FibGUgc2NyZWVuc2F2ZXJzICovCi0JaWYgKFNETF9YQklPU19UdmVpbGxlUHJlc2VudCh0aGlzKSkgewotCQlTRExfWEJJT1NfVHZlaWxsZURpc2FibGUodGhpcyk7Ci0JfQotCi0JLyogV2UncmUgZG9uZSEgKi8KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBTRExfUmVjdCAqKlhCSU9TX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKLXsKLQkvKiA4IGJpdHMgLT4gbGlzdCAwICovCi0JLyogMTYgYml0cyAtPiBsaXN0IDEgKi8KLQlpZiAoKGZvcm1hdC0+Qml0c1BlclBpeGVsICE9IDgpICYmIChmb3JtYXQtPkJpdHNQZXJQaXhlbCAhPTE2KSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4oU0RMX21vZGVsaXN0Wyhmb3JtYXQtPkJpdHNQZXJQaXhlbCk+PjRdKTsKLX0KLQotc3RhdGljIHZvaWQgWEJJT1NfRnJlZUJ1ZmZlcnMoX1RISVMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGk9MDtpPDI7aSsrKSB7Ci0JCWlmIChYQklPU19zY3JlZW5zbWVtW2ldIT1OVUxMKSB7Ci0JCQlNZnJlZShYQklPU19zY3JlZW5zbWVtW2ldKTsKLQkJCVhCSU9TX3NjcmVlbnNtZW1baV09TlVMTDsKLQkJfQotCX0KLQotCWlmIChYQklPU19zaGFkb3dzY3JlZW4hPU5VTEwpIHsKLQkJTWZyZWUoWEJJT1Nfc2hhZG93c2NyZWVuKTsKLQkJWEJJT1Nfc2hhZG93c2NyZWVuPU5VTEw7Ci0JfQotfQotCi1zdGF0aWMgU0RMX1N1cmZhY2UgKlhCSU9TX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCi0JCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCi17Ci0JaW50IG1vZGUsIG5ld19kZXB0aDsKLQlpbnQgaTsKLQl4Ymlvc21vZGVfdCAqbmV3X3ZpZGVvX21vZGU7Ci0JVWludDMyIG5ld19zY3JlZW5fc2l6ZTsKLQlVaW50MzIgbW9kZWZsYWdzOwotCi0JLyogRnJlZSBjdXJyZW50IGJ1ZmZlcnMgKi8KLQlYQklPU19GcmVlQnVmZmVycyh0aGlzKTsKLQotCS8qIExpbWl0IGJwcCAqLwotCWlmIChicHA+MTYpIHsKLQkJYnBwID0gMTY7Ci0JfQotCWJwcCA+Pj0gNDsKLQotCS8qIFNlYXJjaCBpZiB0aGUgbW9kZSBleGlzdHMgKHdpZHRoLCBoZWlnaHQsIGJwcCkgKi8KLQlmb3IgKCBtb2RlPTA7IFNETF9tb2RlbGlzdFticHBdW21vZGVdOyArK21vZGUgKSB7Ci0JCWlmICggKFNETF9tb2RlbGlzdFticHBdW21vZGVdLT53ID09IHdpZHRoKSAmJgotCQkgICAgIChTRExfbW9kZWxpc3RbYnBwXVttb2RlXS0+aCA9PSBoZWlnaHQpICkgewotCi0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIFNETF9tb2RlbGlzdFticHBdW21vZGVdID09IE5VTEwgKSB7Ci0JCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCByZXF1ZXN0ZWQgbW9kZSBpbiBsaXN0Iik7Ci0JCXJldHVybihOVUxMKTsKLQl9Ci0KLQltb2RlZmxhZ3MgPSBTRExfRlVMTFNDUkVFTiB8IFNETF9QUkVBTExPQzsKLQotCS8qIEFsbG9jYXRlIG5lZWRlZCBidWZmZXJzOiBzaW1wbGUvZG91YmxlIGJ1ZmZlciBhbmQgc2hhZG93IHN1cmZhY2UgKi8KLQluZXdfdmlkZW9fbW9kZSA9IFhCSU9TX3ZpZGVvbW9kZXNbYnBwXVttb2RlXTsKLQluZXdfZGVwdGggPSBuZXdfdmlkZW9fbW9kZS0+ZGVwdGg7Ci0JaWYgKG5ld19kZXB0aCA9PSA0KSB7Ci0JCVNETF9BdGFyaV9DMnBDb252ZXJ0ID0gU0RMX0F0YXJpX0MycENvbnZlcnQ0OwotCQluZXdfZGVwdGg9ODsKLQkJbW9kZWZsYWdzIHw9IFNETF9TV1NVUkZBQ0V8U0RMX0hXUEFMRVRURTsKLQl9IGVsc2UgaWYgKG5ld19kZXB0aCA9PSA4KSB7Ci0JCVNETF9BdGFyaV9DMnBDb252ZXJ0ID0gU0RMX0F0YXJpX0MycENvbnZlcnQ4OwotCQltb2RlZmxhZ3MgfD0gU0RMX1NXU1VSRkFDRXxTRExfSFdQQUxFVFRFOwotCX0gZWxzZSB7Ci0JCW1vZGVmbGFncyB8PSBTRExfSFdTVVJGQUNFOwotCX0KLQotCW5ld19zY3JlZW5fc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogKChuZXdfZGVwdGgpPj4zKTsKLQluZXdfc2NyZWVuX3NpemUgKz0gMjU2OyAvKiBUbyBhbGlnbiBvbiBhIDI1NiBieXRlIGFkcmVzcyAqLwkKLQotCWlmIChuZXdfZGVwdGggPT0gOCkgewotCQlYQklPU19zaGFkb3dzY3JlZW4gPSBBdGFyaV9TeXNNYWxsb2MobmV3X3NjcmVlbl9zaXplLCBNWF9QUkVGVFRSQU0pOwotCi0JCWlmIChYQklPU19zaGFkb3dzY3JlZW4gPT0gTlVMTCkgewotCQkJU0RMX1NldEVycm9yKCJDYW4gbm90IGFsbG9jYXRlICVkIEtCIGZvciBzaGFkb3cgYnVmZmVyIiwgbmV3X3NjcmVlbl9zaXplPj4xMCk7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0JCVNETF9tZW1zZXQoWEJJT1Nfc2hhZG93c2NyZWVuLCAwLCBuZXdfc2NyZWVuX3NpemUpOwotCX0KLQotCS8qIE91dHB1dCBidWZmZXIgbmVlZHMgdG8gYmUgdHdpY2UgaW4gc2l6ZSBmb3IgdGhlIHNvZnR3YXJlIGRvdWJsZS1saW5lIG1vZGUgKi8KLQlYQklPU19kb3VibGVsaW5lID0gU0RMX0ZBTFNFOwotCWlmIChuZXdfdmlkZW9fbW9kZS0+ZG91YmxlbGluZSkgewotCQluZXdfc2NyZWVuX3NpemUgPDw9IDE7Ci0JCVhCSU9TX2RvdWJsZWxpbmUgPSBTRExfVFJVRTsKLQl9Ci0KLQlYQklPU19zY3JlZW5zbWVtWzBdID0gQXRhcmlfU3lzTWFsbG9jKG5ld19zY3JlZW5fc2l6ZSwgTVhfU1RSQU0pOwotCi0JaWYgKFhCSU9TX3NjcmVlbnNtZW1bMF09PU5VTEwpIHsKLQkJWEJJT1NfRnJlZUJ1ZmZlcnModGhpcyk7Ci0JCVNETF9TZXRFcnJvcigiQ2FuIG5vdCBhbGxvY2F0ZSAlZCBLQiBmb3IgZnJhbWUgYnVmZmVyIiwgbmV3X3NjcmVlbl9zaXplPj4xMCk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCVNETF9tZW1zZXQoWEJJT1Nfc2NyZWVuc21lbVswXSwgMCwgbmV3X3NjcmVlbl9zaXplKTsKLQotCVhCSU9TX3NjcmVlbnNbMF09KHZvaWQgKikgKCggKGxvbmcpIFhCSU9TX3NjcmVlbnNtZW1bMF0rMjU2KSAmIDB4RkZGRkZGMDBVTCk7Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0JaWYgKGZsYWdzICYgU0RMX09QRU5HTCkgewotCQlpZiAodGhpcy0+Z2xfY29uZmlnLmRvdWJsZV9idWZmZXIpIHsKLQkJCWZsYWdzIHw9IFNETF9ET1VCTEVCVUY7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIERvdWJsZSBidWZmZXIgPyAqLwotCWlmIChmbGFncyAmIFNETF9ET1VCTEVCVUYpIHsKLQkJWEJJT1Nfc2NyZWVuc21lbVsxXSA9IEF0YXJpX1N5c01hbGxvYyhuZXdfc2NyZWVuX3NpemUsIE1YX1NUUkFNKTsKLQotCQlpZiAoWEJJT1Nfc2NyZWVuc21lbVsxXT09TlVMTCkgewotCQkJWEJJT1NfRnJlZUJ1ZmZlcnModGhpcyk7Ci0JCQlTRExfU2V0RXJyb3IoIkNhbiBub3QgYWxsb2NhdGUgJWQgS0IgZm9yIGRvdWJsZSBidWZmZXIiLCBuZXdfc2NyZWVuX3NpemU+PjEwKTsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQkJU0RMX21lbXNldChYQklPU19zY3JlZW5zbWVtWzFdLCAwLCBuZXdfc2NyZWVuX3NpemUpOwotCi0JCVhCSU9TX3NjcmVlbnNbMV09KHZvaWQgKikgKCggKGxvbmcpIFhCSU9TX3NjcmVlbnNtZW1bMV0rMjU2KSAmIDB4RkZGRkZGMDBVTCk7Ci0JCW1vZGVmbGFncyB8PSBTRExfRE9VQkxFQlVGOwotCX0KLQkKLQkvKiBBbGxvY2F0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgdGhlIHNjcmVlbiAqLwotCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBuZXdfZGVwdGgsIDAsIDAsIDAsIDApICkgewotCQlYQklPU19GcmVlQnVmZmVycyh0aGlzKTsKLQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciByZXF1ZXN0ZWQgbW9kZSIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JY3VycmVudC0+dyA9IFhCSU9TX3dpZHRoID0gd2lkdGg7Ci0JY3VycmVudC0+aCA9IFhCSU9TX2hlaWdodCA9IGhlaWdodDsKLQljdXJyZW50LT5waXRjaCA9ICh3aWR0aCAqIG5ld19kZXB0aCk+PjM7Ci0KLQkvKiB0aGlzIGlzIGZvciBDMlAgY29udmVyc2lvbiAqLwotCVhCSU9TX3BpdGNoID0gKG5ld192aWRlb19tb2RlLT53aWR0aCAqIG5ld192aWRlb19tb2RlLT5kZXB0aCk+PjM7Ci0KLQlpZiAobmV3X2RlcHRoID09IDgpCi0JCWN1cnJlbnQtPnBpeGVscyA9IFhCSU9TX3NoYWRvd3NjcmVlbjsKLQllbHNlCi0JCWN1cnJlbnQtPnBpeGVscyA9IFhCSU9TX3NjcmVlbnNbMF07Ci0KLQlYQklPU19mYm51bSA9IDA7Ci0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0JaWYgKGZsYWdzICYgU0RMX09QRU5HTCkgewotCQlpZiAoIVNETF9BdGFyaUdMX0luaXQodGhpcywgY3VycmVudCkpIHsKLQkJCVhCSU9TX0ZyZWVCdWZmZXJzKHRoaXMpOwotCQkJU0RMX1NldEVycm9yKCJDYW4gbm90IGNyZWF0ZSBPcGVuR0wgY29udGV4dCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQltb2RlZmxhZ3MgfD0gU0RMX09QRU5HTDsKLQl9Ci0jZW5kaWYKLQotCWN1cnJlbnQtPmZsYWdzID0gbW9kZWZsYWdzOwotCi0JLyogTm93IHNldCB0aGUgdmlkZW8gbW9kZSAqLwotI2lmbmRlZiBERUJVR19WSURFT19YQklPUwotCVNldHNjcmVlbigtMSxYQklPU19zY3JlZW5zWzBdLC0xKTsKLSNlbmRpZgotCi0Jc3dpdGNoKFhCSU9TX2N2ZG8gPj4gMTYpIHsKLQkJY2FzZSBWRE9fU1Q6Ci0jaWZuZGVmIERFQlVHX1ZJREVPX1hCSU9TCi0JCQlTZXRzY3JlZW4oLTEsLTEsbmV3X3ZpZGVvX21vZGUtPm51bWJlcik7Ci0jZW5kaWYKLQkJCS8qIFJlc2V0IHBhbGV0dGUgKi8KLQkJCWZvciAoaT0wO2k8MTY7aSsrKSB7Ci0JCQkJVFRfcGFsZXR0ZVtpXT0gKChpPj4xKTw8OCkgfCAoKChpKjgpLzE3KTw8NCkgfCAoaT4+MSk7Ci0JCQl9Ci0jaWZuZGVmIERFQlVHX1ZJREVPX1hCSU9TCi0JCQlTZXRwYWxldHRlKFRUX3BhbGV0dGUpOwotI2VuZGlmCi0JCQlicmVhazsKLQkJY2FzZSBWRE9fU1RFOgotI2lmbmRlZiBERUJVR19WSURFT19YQklPUwotCQkJU2V0c2NyZWVuKC0xLC0xLG5ld192aWRlb19tb2RlLT5udW1iZXIpOwotI2VuZGlmCi0JCQkvKiBSZXNldCBwYWxldHRlICovCi0JCQlmb3IgKGk9MDtpPDE2O2krKykKLQkJCXsKLQkJCQlpbnQgYzsKLQotCQkJCWM9KChpJjEpPDwzKXwoKGk+PjEpJjcpOwotCQkJCVRUX3BhbGV0dGVbaV09KGM8PDgpfChjPDw0KXxjOwotCQkJfQotI2lmbmRlZiBERUJVR19WSURFT19YQklPUwotCQkJU2V0cGFsZXR0ZShUVF9wYWxldHRlKTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCWNhc2UgVkRPX1RUOgotI2lmbmRlZiBERUJVR19WSURFT19YQklPUwotCQkJRXNldFNoaWZ0KG5ld192aWRlb19tb2RlLT5udW1iZXIpOwotI2VuZGlmCi0JCQlicmVhazsKLQkJY2FzZSBWRE9fRjMwOgotI2lmbmRlZiBERUJVR19WSURFT19YQklPUwotCQkJaWYgKFhCSU9TX2NlbnRzY3JlZW4pIHsKLQkJCQlTRExfWEJJT1NfQ2VudHNjcmVlblNldG1vZGUodGhpcywgd2lkdGgsIGhlaWdodCwgbmV3X2RlcHRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVnNldE1vZGUobmV3X3ZpZGVvX21vZGUtPm51bWJlcik7Ci0JCQl9Ci0jZW5kaWYKLQkJCS8qIFNldCBoYXJkd2FyZSBwYWxldHRlIHRvIGJsYWNrIGluIFRydWUgQ29sb3VyICovCi0JCQlpZiAobmV3X2RlcHRoID09IDE2KSB7Ci0JCQkJU0RMX21lbXNldChGMzBfcGFsZXR0ZSwgMCwgc2l6ZW9mKEYzMF9wYWxldHRlKSk7Ci0JCQkJVnNldFJHQigwLDI1NixGMzBfcGFsZXR0ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci0KLQlWc3luYygpOwotCi0JdGhpcy0+VXBkYXRlUmVjdHMgPSBYQklPU19VcGRhdGVSZWN0czsKLQotCXJldHVybiAoY3VycmVudCk7Ci19Ci0KLS8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCi1zdGF0aWMgaW50IFhCSU9TX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm4oLTEpOwotfQotCi1zdGF0aWMgdm9pZCBYQklPU19GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgWEJJT1NfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCi17Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgdm9pZCBYQklPU19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgWEJJT1NfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQotewotCVNETF9TdXJmYWNlICpzdXJmYWNlOwotCi0Jc3VyZmFjZSA9IHRoaXMtPnNjcmVlbjsKLQotCWlmICgoc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpID09IDgpIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpPTA7aTxudW1yZWN0cztpKyspIHsKLQkJCXZvaWQgKnNvdXJjZSwqZGVzdGluYXRpb247Ci0JCQlpbnQgeDEseDI7Ci0KLQkJCXgxID0gcmVjdHNbaV0ueCAmIH4xNTsKLQkJCXgyID0gcmVjdHNbaV0ueCtyZWN0c1tpXS53OwotCQkJaWYgKHgyICYgMTUpIHsKLQkJCQl4MiA9ICh4MiB8IDE1KSArMTsKLQkJCX0KLQotCQkJc291cmNlID0gc3VyZmFjZS0+cGl4ZWxzOwotCQkJc291cmNlICs9IHN1cmZhY2UtPnBpdGNoICogcmVjdHNbaV0ueTsKLQkJCXNvdXJjZSArPSB4MTsKLQotCQkJZGVzdGluYXRpb24gPSBYQklPU19zY3JlZW5zW1hCSU9TX2ZibnVtXTsKLQkJCWRlc3RpbmF0aW9uICs9IFhCSU9TX3BpdGNoICogcmVjdHNbaV0ueTsKLQkJCWRlc3RpbmF0aW9uICs9IHgxOwotCi0JCQkvKiBDb252ZXJ0IGNodW5reSB0byBwbGFuYXIgc2NyZWVuICovCi0JCQlTRExfQXRhcmlfQzJwQ29udmVydCgKLQkJCQlzb3VyY2UsCi0JCQkJZGVzdGluYXRpb24sCi0JCQkJeDIteDEsCi0JCQkJcmVjdHNbaV0uaCwKLQkJCQlYQklPU19kb3VibGVsaW5lLAotCQkJCXN1cmZhY2UtPnBpdGNoLAotCQkJCVhCSU9TX3BpdGNoCi0JCQkpOwotCQl9Ci0JfQotCi0jaWZuZGVmIERFQlVHX1ZJREVPX1hCSU9TCi0JU2V0c2NyZWVuKC0xLFhCSU9TX3NjcmVlbnNbWEJJT1NfZmJudW1dLC0xKTsKLSNlbmRpZgotCVZzeW5jKCk7Ci0KLQlpZiAoKHN1cmZhY2UtPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gU0RMX0RPVUJMRUJVRikgewotCQlYQklPU19mYm51bSBePSAxOwotCQlpZiAoKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSA+IDgpIHsKLQkJCXN1cmZhY2UtPnBpeGVscz1YQklPU19zY3JlZW5zW1hCSU9TX2ZibnVtXTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBYQklPU19GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKLXsKLQlpZiAoKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSA9PSA4KSB7Ci0JCXZvaWQgKmRlc3RzY3I7Ci0JCWludCBkZXN0eDsKLQkJCQotCQkvKiBDZW50ZXIgb24gZGVzdGluYXRpb24gc2NyZWVuICovCi0JCWRlc3RzY3IgPSBYQklPU19zY3JlZW5zW1hCSU9TX2ZibnVtXTsKLQkJZGVzdHNjciArPSBYQklPU19waXRjaCAqICgoWEJJT1NfaGVpZ2h0IC0gc3VyZmFjZS0+aCkgPj4gMSk7Ci0JCWRlc3R4ID0gKFhCSU9TX3dpZHRoIC0gc3VyZmFjZS0+dykgPj4gMTsKLQkJZGVzdHggJj0gfjE1OwotCQlkZXN0c2NyICs9IGRlc3R4OwotCi0JCS8qIENvbnZlcnQgY2h1bmt5IHRvIHBsYW5hciBzY3JlZW4gKi8KLQkJU0RMX0F0YXJpX0MycENvbnZlcnQoCi0JCQlzdXJmYWNlLT5waXhlbHMsCi0JCQlkZXN0c2NyLAotCQkJc3VyZmFjZS0+dywKLQkJCXN1cmZhY2UtPmgsCi0JCQlYQklPU19kb3VibGVsaW5lLAotCQkJc3VyZmFjZS0+cGl0Y2gsCi0JCQlYQklPU19waXRjaAotCQkpOwotCX0KLQotI2lmbmRlZiBERUJVR19WSURFT19YQklPUwotCVNldHNjcmVlbigtMSxYQklPU19zY3JlZW5zW1hCSU9TX2ZibnVtXSwtMSk7Ci0jZW5kaWYKLQlWc3luYygpOwotCi0JaWYgKChzdXJmYWNlLT5mbGFncyAmIFNETF9ET1VCTEVCVUYpID09IFNETF9ET1VCTEVCVUYpIHsKLQkJWEJJT1NfZmJudW0gXj0gMTsKLQkJaWYgKChzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCkgPiA4KSB7Ci0JCQlzdXJmYWNlLT5waXhlbHM9WEJJT1Nfc2NyZWVuc1tYQklPU19mYm51bV07Ci0JCX0KLQl9Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgWEJJT1NfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQotewotCWludAkJaTsKLQlpbnQJCXIsdixiOwotCi0Jc3dpdGNoKCBYQklPU19jdmRvID4+IDE2KSB7Ci0JCWNhc2UgVkRPX1NUOgotCQljYXNlIFZET19TVEU6Ci0JCSAJZm9yIChpPTA7aTxuY29sb3JzO2krKykKLQkJCXsKLQkJCQlyID0gY29sb3JzW2ldLnI7CQotCQkJCXYgPSBjb2xvcnNbaV0uZzsKLQkJCQliID0gY29sb3JzW2ldLmI7Ci0KLQkJCQlUVF9wYWxldHRlW2ZpcnN0Y29sb3IraV09KChyKjMwKSsodio1OSkrKGIqMTEpKS8xMDA7Ci0JCQl9Ci0JCQlTRExfQXRhcmlfQzJwQ29udmVydDRfcGFsKFRUX3BhbGV0dGUpOyAvKiBjb252ZXJ0IHRoZSBsaWdodGluZyAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgVkRPX1RUOgotCQkJZm9yKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKQotCQkJewotCQkJCXIgPSBjb2xvcnNbaV0ucjsJCi0JCQkJdiA9IGNvbG9yc1tpXS5nOwotCQkJCWIgPSBjb2xvcnNbaV0uYjsKLQkJCQkJCi0JCQkJVFRfcGFsZXR0ZVtpXT0oKHI+PjQpPDw4KXwoKHY+PjQpPDw0KXwoYj4+NCk7Ci0JCQl9Ci0jaWZuZGVmIERFQlVHX1ZJREVPX1hCSU9TCi0JCQlFc2V0UGFsZXR0ZShmaXJzdGNvbG9yLG5jb2xvcnMsVFRfcGFsZXR0ZSk7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlIFZET19GMzA6Ci0JCQlmb3IoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspCi0JCQl7Ci0JCQkJciA9IGNvbG9yc1tpXS5yOwkKLQkJCQl2ID0gY29sb3JzW2ldLmc7Ci0JCQkJYiA9IGNvbG9yc1tpXS5iOwotCi0JCQkJRjMwX3BhbGV0dGVbaV09KHI8PDE2KXwodjw8OCl8YjsKLQkJCX0KLSNpZm5kZWYgREVCVUdfVklERU9fWEJJT1MKLQkJCVZzZXRSR0IoZmlyc3Rjb2xvcixuY29sb3JzLEYzMF9wYWxldHRlKTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuKDEpOwotfQotCi0vKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKLSAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KLSovCi1zdGF0aWMgdm9pZCBYQklPU19WaWRlb1F1aXQoX1RISVMpCi17Ci0JaW50IGksajsKLQotCUF0YXJpX1NodXRkb3duRXZlbnRzKCk7Ci0KLQkvKiBSZXN0b3JlIHZpZGVvIG1vZGUgYW5kIHBhbGV0dGUgKi8KLSNpZm5kZWYgREVCVUdfVklERU9fWEJJT1MKLQlzd2l0Y2goWEJJT1NfY3ZkbyA+PiAxNikgewotCQljYXNlIFZET19TVDoKLQkJY2FzZSBWRE9fU1RFOgotCQkJU2V0c2NyZWVuKC0xLFhCSU9TX29sZHZiYXNlLFhCSU9TX29sZHZtb2RlKTsKLQkJCWlmIChYQklPU19vbGRudW1jb2wpIHsKLQkJCQlTZXRwYWxldHRlKFhCSU9TX29sZHBhbGV0dGUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVkRPX1RUOgotCQkJU2V0c2NyZWVuKC0xLFhCSU9TX29sZHZiYXNlLC0xKTsKLQkJCUVzZXRTaGlmdChYQklPU19vbGR2bW9kZSk7Ci0JCQlpZiAoWEJJT1Nfb2xkbnVtY29sKSB7Ci0JCQkJRXNldFBhbGV0dGUoMCwgWEJJT1Nfb2xkbnVtY29sLCBYQklPU19vbGRwYWxldHRlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFZET19GMzA6Ci0JCQlTZXRzY3JlZW4oLTEsIFhCSU9TX29sZHZiYXNlLCAtMSk7Ci0JCQlpZiAoWEJJT1NfY2VudHNjcmVlbikgewotCQkJCVNETF9YQklPU19DZW50c2NyZWVuUmVzdG9yZSh0aGlzLCBYQklPU19vbGR2bW9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCVZzZXRNb2RlKFhCSU9TX29sZHZtb2RlKTsKLQkJCX0KLQkJCWlmIChYQklPU19vbGRudW1jb2wpIHsKLQkJCQlWc2V0UkdCKDAsIFhCSU9TX29sZG51bWNvbCwgWEJJT1Nfb2xkcGFsZXR0ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci0JVnN5bmMoKTsKLSNlbmRpZgotCi0KLSNpZiBTRExfVklERU9fT1BFTkdMCi0JaWYgKGdsX2FjdGl2ZSkgewotCQlTRExfQXRhcmlHTF9RdWl0KHRoaXMsIFNETF9UUlVFKTsKLQl9Ci0jZW5kaWYKLQotCWlmIChYQklPU19vbGRwYWxldHRlKSB7Ci0JCVNETF9mcmVlKFhCSU9TX29sZHBhbGV0dGUpOwotCQlYQklPU19vbGRwYWxldHRlPU5VTEw7Ci0JfQotCVhCSU9TX0ZyZWVCdWZmZXJzKHRoaXMpOwotCi0JLyogRnJlZSBtb2RlIGxpc3QgKi8KLQlmb3IgKGo9MDtqPE5VTV9NT0RFTElTVFM7aisrKSB7Ci0JCWZvciAoaT0wO2k8U0RMX05VTU1PREVTO2krKykgewotCQkJaWYgKFNETF9tb2RlbGlzdFtqXVtpXSE9TlVMTCkgewotCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtqXVtpXSk7Ci0JCQkJU0RMX21vZGVsaXN0W2pdW2ldPU5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoWEJJT1NfbW9kZWxpc3QpIHsKLQkJU0RMX2ZyZWUoWEJJT1NfbW9kZWxpc3QpOwotCQlYQklPU19udW1tb2Rlcz0wOwotCQlYQklPU19tb2RlbGlzdD1OVUxMOwotCX0KLQotCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsJCi0KLQkvKiBSZXN0b3JlIHNjcmVlbnNhdmVycyAqLwotCWlmIChTRExfWEJJT1NfVHZlaWxsZVByZXNlbnQodGhpcykpIHsKLQkJU0RMX1hCSU9TX1R2ZWlsbGVSZXN0b3JlKHRoaXMpOwotCX0KLX0KLQotI2lmIFNETF9WSURFT19PUEVOR0wKLQotc3RhdGljIHZvaWQgWEJJT1NfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpCi17Ci0JU0RMX0F0YXJpR0xfU3dhcEJ1ZmZlcnModGhpcyk7Ci0JWEJJT1NfRmxpcEhXU3VyZmFjZSh0aGlzLCB0aGlzLT5zY3JlZW4pOwotCVNETF9BdGFyaUdMX01ha2VDdXJyZW50KHRoaXMpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2UxMzI2Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNiBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLSNpZm5kZWYgX1NETF94Ymlvc19oCi0jZGVmaW5lIF9TRExfeGJpb3NfaAotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgotCi0vKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCi0KLS8qIFRUIHZpZGVvIG1vZGVzOgkyCi0gICBGYWxjb24gUlZCOgkJMTYgKGNvdWxkIGJlICoyIGJ5IGFkZGluZyBQQUwvTlRTQyBtb2RlcykKLSAgIEZhbGNvbiBWR0E6CQk2Ci0gICBTVCBsb3c6CQkxCi0qLwotI2RlZmluZSBTRExfTlVNTU9ERVMgMTYKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLQlVaW50MTYgbnVtYmVyOwkJLyogVmlkZW8gbW9kZSBudW1iZXIgKi8KLQlVaW50MTYgd2lkdGg7CQkvKiBTaXplICovCQotCVVpbnQxNiBoZWlnaHQ7Ci0JVWludDE2IGRlcHRoOwkJLyogYml0cyBwZXIgcGxhbmUgKi8KLQlTRExfYm9vbCBkb3VibGVsaW5lOwkvKiBEb3VibGUgdGhlIGxpbmVzID8gKi8KLX0geGJpb3Ntb2RlX3Q7Ci0KLS8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCi0jZGVmaW5lIE5VTV9NT0RFTElTVFMJMgkJLyogOCBhbmQgMTYgYml0cy1wZXItcGl4ZWwgKi8KLQotc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKLQlsb25nIGNvb2tpZV92ZG87Ci0JaW50IG9sZF92aWRlb19tb2RlOwkJCQkvKiBPbGQgdmlkZW8gbW9kZSBiZWZvcmUgZW50ZXJpbmcgU0RMICovCi0Jdm9pZCAqb2xkX3ZpZGVvX2Jhc2U7CQkJLyogT2xkIHBvaW50ZXIgdG8gc2NyZWVuIGJ1ZmZlciAqLwotCXZvaWQgKm9sZF9wYWxldHRlOwkJCQkvKiBPbGQgcGFsZXR0ZSAqLwotCVVpbnQzMiBvbGRfbnVtX2NvbG9yczsJCQkvKiBOYiBvZiBjb2xvcnMgaW4gc2F2ZWQgcGFsZXR0ZSAqLwotCWludCBudW1fbW9kZXM7CQkJCQkvKiBOdW1iZXIgb2YgeGJpb3MgdmlkZW8gbW9kZXMgKi8KLQl4Ymlvc21vZGVfdAkqbW9kZV9saXN0OwkJCS8qIExpc3Qgb2YgeGJpb3MgdmlkZW8gbW9kZXMgKi8KLQotCXZvaWQgKnNjcmVlbnNbMl07CQkvKiBQb2ludGVycyB0byBhbGlnbmVkIHNjcmVlbiBidWZmZXIgKi8KLQl2b2lkICpzY3JlZW5zbWVtWzJdOwkvKiBQb2ludGVycyB0byBzY3JlZW4gYnVmZmVyICovCi0Jdm9pZCAqc2hhZG93c2NyZWVuOwkJLyogU2hhZG93IHNjcmVlbiBmb3IgYzJwIGNvbnZlcnNpb24gKi8KLQlpbnQgZG91YmxlbGluZTsJCQkvKiBEb3VibGUgbGluZSBtb2RlID8gKi8KLQlpbnQgZnJhbWVfbnVtYmVyOwkJLyogTnVtYmVyIG9mIGZyYW1lIGZvciBkb3VibGUgYnVmZmVyICovCi0JaW50IHBpdGNoOwkJCQkvKiBEZXN0aW5hdGlvbiBsaW5lIHdpZHRoIGZvciBDMlAgKi8KLQlpbnQgd2lkdGgsIGhlaWdodDsJCS8qIFNjcmVlbiBzaXplIGZvciBjZW50ZXJlZCBDMlAgKi8KLQotCVNETF9ib29sIGNlbnRzY3JlZW47CS8qIENlbnRzY3JlZW4gZXh0ZW5zaW9uIHByZXNlbnQgPyAqLwotCi0JU0RMX1JlY3QgKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXVtTRExfTlVNTU9ERVMrMV07Ci0JeGJpb3Ntb2RlX3QgKnZpZGVvbW9kZXNbTlVNX01PREVMSVNUU11bU0RMX05VTU1PREVTKzFdOwotfTsKLQotLyogX1ZETyBjb29raWUgdmFsdWVzICovCi1lbnVtIHsKLQlWRE9fU1Q9MCwKLQlWRE9fU1RFLAotCVZET19UVCwKLQlWRE9fRjMwCi19OwotCi0vKiBNb25pdG9yIHR5cGVzICovCi1lbnVtIHsKLQlNT05JVE9SX01PTk89MCwKLQlNT05JVE9SX1RWLAotCU1PTklUT1JfVkdBLAotCU1PTklUT1JfUkdCCi19OwotCi0vKiBFZ2V0U2hpZnQgbWFza3MgKi8KLSNkZWZpbmUgRVNfQkFOSwkJMHgwMDBmCi0jZGVmaW5lIEVTX01PREUJCTB4MDcwMAotI2RlZmluZSBFU19HUkFZCQkweDEwMDAKLSNkZWZpbmUgRVNfU01FQVIJMHg4MDAwCi0KLS8qIFRUIHNoaWZ0ZXIgbW9kZXMgKi8KLSNkZWZpbmUgU1RfTE9XCTB4MDAwMAotI2RlZmluZSBTVF9NRUQJMHgwMTAwCi0jZGVmaW5lIFNUX0hJR0gJMHgwMjAwCi0jZGVmaW5lIFRUX0xPVwkweDA3MDAKLSNkZWZpbmUgVFRfTUVECTB4MDMwMAotI2RlZmluZSBUVF9ISUdICTB4MDYwMAotCi0vKiBIaWRkZW4gc3RydWN0dXJlIC0+IHZhcmlhYmxlcyBuYW1lcyAqLwotI2RlZmluZSBTRExfbW9kZWxpc3QJCSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKLSNkZWZpbmUgWEJJT1NfbXV0ZXgJCSAgICAodGhpcy0+aGlkZGVuLT5tdXRleCkKLSNkZWZpbmUgWEJJT1NfY3ZkbwkJICAgICh0aGlzLT5oaWRkZW4tPmNvb2tpZV92ZG8pCi0jZGVmaW5lIFhCSU9TX29sZHBhbGV0dGUJKHRoaXMtPmhpZGRlbi0+b2xkX3BhbGV0dGUpCi0jZGVmaW5lIFhCSU9TX29sZG51bWNvbAkJKHRoaXMtPmhpZGRlbi0+b2xkX251bV9jb2xvcnMpCi0jZGVmaW5lIFhCSU9TX29sZHZiYXNlCQkodGhpcy0+aGlkZGVuLT5vbGRfdmlkZW9fYmFzZSkKLSNkZWZpbmUgWEJJT1Nfb2xkdm1vZGUJCSh0aGlzLT5oaWRkZW4tPm9sZF92aWRlb19tb2RlKQotI2RlZmluZSBYQklPU19udW1tb2RlcwkJKHRoaXMtPmhpZGRlbi0+bnVtX21vZGVzKQotI2RlZmluZSBYQklPU19tb2RlbGlzdAkJKHRoaXMtPmhpZGRlbi0+bW9kZV9saXN0KQotI2RlZmluZSBYQklPU19zY3JlZW5zCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5zKQotI2RlZmluZSBYQklPU19zY3JlZW5zbWVtCSh0aGlzLT5oaWRkZW4tPnNjcmVlbnNtZW0pCi0jZGVmaW5lIFhCSU9TX3NoYWRvd3NjcmVlbgkodGhpcy0+aGlkZGVuLT5zaGFkb3dzY3JlZW4pCi0jZGVmaW5lIFhCSU9TX3ZpZGVvbW9kZXMJKHRoaXMtPmhpZGRlbi0+dmlkZW9tb2RlcykKLSNkZWZpbmUgWEJJT1NfZG91YmxlbGluZQkodGhpcy0+aGlkZGVuLT5kb3VibGVsaW5lKQotI2RlZmluZSBYQklPU19mYm51bQkJCSh0aGlzLT5oaWRkZW4tPmZyYW1lX251bWJlcikKLSNkZWZpbmUgWEJJT1NfcGl0Y2gJCQkodGhpcy0+aGlkZGVuLT5waXRjaCkKLSNkZWZpbmUgWEJJT1Nfd2lkdGgJCQkodGhpcy0+aGlkZGVuLT53aWR0aCkKLSNkZWZpbmUgWEJJT1NfaGVpZ2h0CQkodGhpcy0+aGlkZGVuLT5oZWlnaHQpCi0jZGVmaW5lIFhCSU9TX2NlbnRzY3JlZW4JKHRoaXMtPmhpZGRlbi0+Y2VudHNjcmVlbikKLQotLyotLS0gRnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tKi8KLQotdm9pZCBTRExfWEJJT1NfQWRkTW9kZShfVEhJUywgVWludDE2IG1vZGVjb2RlLCBVaW50MTYgd2lkdGgsIFVpbnQxNiBoZWlnaHQsCi0JVWludDE2IGRlcHRoLCBTRExfYm9vbCBmbGFncyk7Ci0KLSNlbmRpZiAvKiBfU0RMX3hiaW9zX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2Jsb3d1cC5jIGIvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfYmxvd3VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDJhMmUuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfYmxvd3VwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNhbSBMYW50aW5nYQotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gICAgU2FtIExhbnRpbmdhCi0gICAgc2xvdWtlbkBsaWJzZGwub3JnCi0qLwotI2luY2x1ZGUgIlNETF9jb25maWcuaCIKLQotLyoKLQlCbG93dXAgZXh0ZW5zaW9uIGRlZmluaXRpb25zCi0KLQlQYXRyaWNlIE1hbmRpbgotKi8KLQotI2luY2x1ZGUgPG1pbnQvZmFsY29uLmg+Ci0KLSNpbmNsdWRlICJTRExfeGJpb3MuaCIKLSNpbmNsdWRlICJTRExfeGJpb3NfYmxvd3VwLmgiCi0KLXZvaWQgU0RMX1hCSU9TX0Jsb3d1cEluaXQoX1RISVMsIGJsb3dfY29va2llX3QgKmNvb2tpZV9ibG93KQotewotCWludCBpLCBudW1fbW9kZSwgYmFuazsKLQlibG93X21vZGVfdCAqYmxvd19tb2RlOwotCi0JLyogQWRkIGJpdCAxNSBmb3Igb2xkIG1vZGVzICovCi0JZm9yIChpPTA7aTxYQklPU19udW1tb2RlcztpKyspIHsKLQkJWEJJT1NfbW9kZWxpc3RbaV0ubnVtYmVyIHw9IDE8PDE1OwotCX0KLQotCS8qIEFkZCBCbG93dXAgbW9kZXMgZm9yIDggYW5kIDE2IGJwcCAqLwotCWZvciAobnVtX21vZGU9MzsgbnVtX21vZGU8NTsgbnVtX21vZGUrKykgewotCQliYW5rID0gY29va2llX2Jsb3ctPm51bV9tb2RlW251bV9tb2RlXTsKLQkJYmxvd19tb2RlID0gJihjb29raWVfYmxvdy0+Ymxvd3VwX21vZGVzW251bV9tb2RlKyhiYW5rKjUpXSk7Ci0KLQkJLyogQ2hlY2sgZXh0ZW5kZWQgbW9kZSBlbmFibGVkICovCi0JCWlmIChibG93X21vZGUtPmVuYWJsZWQgPT0gMCkgewotCQkJLyogQ2hlY2sgbW9uaXRvciBuZWVkZWQgZm9yIHRoaXMgbW9kZSAqLwotCQkJaWYgKChibG93X21vZGUtPm1vbml0b3IgPT0gY29va2llX2Jsb3ctPm1vbnR5cGUpCi0JCQkJfHwgKChibG93X21vZGUtPm1vbml0b3IgPT0gTU9OSVRPUl9UVikKLQkJCQkJJiYgKGNvb2tpZV9ibG93LT5tb250eXBlID09IE1PTklUT1JfUkdCKSkKLQkJCQl8fCAoKGJsb3dfbW9kZS0+bW9uaXRvciA9PSBNT05JVE9SX1JHQikKLQkJCQkJJiYgKGNvb2tpZV9ibG93LT5tb250eXBlID09IE1PTklUT1JfVFYpKSkKLQkJCXsKLQkJCQkvKiB3ZSBjYW4gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kZSAqLwotCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsCi0JCQkJCW51bV9tb2RlID09IDMgPyBCUFM4IDogQlBTMTYsCi0JCQkJCWJsb3dfbW9kZS0+d2lkdGggKyAxLAotCQkJCQlibG93X21vZGUtPmhlaWdodCArIDEsCi0JCQkJCW51bV9tb2RlID09IDMgPyA4IDogMTYsCi0JCQkJCVNETF9GQUxTRQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19ibG93dXAuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2Jsb3d1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTY1YzA5Li4wMDAwMDAwCi0tLSBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2Jsb3d1cC5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0JQmxvd3VwIGV4dGVuc2lvbiBkZWZpbml0aW9ucwotCi0JUGF0cmljZSBNYW5kaW4KLSovCi0KLSNpZm5kZWYgX1NETF94Ymlvc19ibG93dXBfaAotI2RlZmluZSBfU0RMX3hiaW9zX2Jsb3d1cF9oCi0KLSNpbmNsdWRlICJTRExfeGJpb3MuaCIKLQotLyotLS0gVHlwZXMgLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCS8qIDY0IGJ5dGVzICovCi0JdW5zaWduZWQgc2hvcnQJZW5hYmxlZDsJCS8qIEV4dGVuZGVkIG1vZGUgZW5hYmxlZCA/IDA9eWVzLCA8PjA9bm8gKi8KLQl1bnNpZ25lZCBzaG9ydAlkdW1teTEwWzZdOwotCXVuc2lnbmVkIHNob3J0CXJlZ2lzdGVyc18wRTsJLyogdmFsdWUgZm9yIHJlZ2lzdGVyIDB4ZmZmZjgyMGUgKi8KLQl1bnNpZ25lZCBzaG9ydAlyZWdpc3RlcnNfMTA7CS8qIHZhbHVlIGZvciByZWdpc3RlciAweGZmZmY4MjEwICovCi0JdW5zaWduZWQgc2hvcnQJZHVtbXkxMVsyM107Ci0KLQkvKiA2NCBieXRlcyAqLwotCXVuc2lnbmVkIHNob3J0CXdpZHRoOwkJCS8qIHdpZHRoLTEgKi8KLQl1bnNpZ25lZCBzaG9ydAloZWlnaHQ7CQkJLyogaGVpZ2h0LTEgKi8KLQl1bnNpZ25lZCBzaG9ydAlkdW1teTIwOwotCXVuc2lnbmVkIGxvbmcJc2NyZWVuc2l6ZTsJCS8qIHNjcmVlbnNpemUgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBzaG9ydAlkdW1teTIxWzhdOwotCXVuc2lnbmVkIHNob3J0CXZpcnR1YWw7CQkvKiBWaXJ0dWFsIHNjcmVlbiA/ICovCi0JdW5zaWduZWQgc2hvcnQJdmlyd2lkdGg7CQkvKiBWaXJ0dWFsIHNjcmVlbiB3aWR0aCAqLwotCXVuc2lnbmVkIHNob3J0CXZpcmhlaWdodDsJCS8qIFZpcnR1YWwgc2NyZWVuIGhlaWdodCAqLwotCi0JdW5zaWduZWQgc2hvcnQgZHVtbXkyMjsKLQl1bnNpZ25lZCBzaG9ydCBtb25pdG9yOwkJCS8qIE1vbml0b3IgZGVmaW5lZCBmb3IgdGhpcyBtb2RlICovCi0JdW5zaWduZWQgc2hvcnQgZXh0ZW5zaW9uOwkJLyogRXh0ZW5kZWQgbW9kZSBkZWZpbmVkID8gMD15ZXMsIDE9bm8gKi8KLQl1bnNpZ25lZCBzaG9ydCBkdW1teTIzWzEzXTsKLQotCS8qIDY0IGJ5dGVzICovCi0JdW5zaWduZWQgc2hvcnQJZHVtbXkzMDsKLQl1bnNpZ25lZCBzaG9ydAlyZWdpc3RlcnNfODJbNl07CS8qIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIDB4ZmZmZjgyODItOGMgKi8KLQl1bnNpZ25lZCBzaG9ydAlkdW1teTMxWzldOwotCi0JdW5zaWduZWQgc2hvcnQJZHVtbXkzMjsKLQl1bnNpZ25lZCBzaG9ydAlyZWdpc3RlcnNfQTJbNl07CS8qIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIDB4ZmZmZjgyYTItYWMgKi8KLQl1bnNpZ25lZCBzaG9ydAlkdW1teTMzWzldOwotCi0JLyogNjQgYnl0ZXMgKi8KLQl1bnNpZ25lZCBzaG9ydAlyZWdpc3RlcnNfQzA7CS8qIHZhbHVlIGZvciByZWdpc3RlciAweGZmZmY4MmMwICovCi0JdW5zaWduZWQgc2hvcnQJcmVnaXN0ZXJzX0MyOwkvKiB2YWx1ZSBmb3IgcmVnaXN0ZXIgMHhmZmZmODJjMiAqLwotCXVuc2lnbmVkIHNob3J0CWR1bW15NDBbMzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBibG93X21vZGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWJsb3dfbW9kZV90CWJsb3d1cF9tb2Rlc1sxMF07Ci0JdW5zaWduZWQgY2hhcgludW1fbW9kZVs2XTsKLQl1bnNpZ25lZCBsb25nCWR1bW15OwotCXVuc2lnbmVkIHNob3J0CW1vbnR5cGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGJsb3dfY29va2llX3Q7Ci0KLS8qLS0tIEZ1bmN0aW9ucyBwcm90b3R5cGVzIC0tLSovCi0KLXZvaWQgU0RMX1hCSU9TX0Jsb3d1cEluaXQoX1RISVMsIGJsb3dfY29va2llX3QgKmNvb2tpZV9ibG93KTsKLQotI2VuZGlmIC8qIF9TRExfeGJpb3NfYmxvd3VwX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2NlbnRzY3JlZW4uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2NlbnRzY3JlZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlNWQ3ZS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19jZW50c2NyZWVuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTYW0gTGFudGluZ2EKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAgIFNhbSBMYW50aW5nYQotICAgIHNsb3VrZW5AbGlic2RsLm9yZwotKi8KLSNpbmNsdWRlICJTRExfY29uZmlnLmgiCi0KLS8qCi0JQ2VudHNjcmVlbiBleHRlbnNpb24gZGVmaW5pdGlvbnMKLQotCVBhdHJpY2UgTWFuZGluCi0qLwotCi0jaW5jbHVkZSA8bWludC9mYWxjb24uaD4KLQotI2luY2x1ZGUgIlNETF94Ymlvcy5oIgotI2luY2x1ZGUgIlNETF94Ymlvc19jZW50c2NyZWVuLmgiCi0KLWludCBTRExfWEJJT1NfQ2VudHNjcmVlbkluaXQoX1RISVMpCi17Ci0JY2VudHNjcmVlbl9tb2RlX3QJY3VybW9kZSwgbGlzdGVkbW9kZTsKLQl1bnNpZ25lZCBsb25nIHJlc3VsdDsKLQlpbnQgY3VyX2hhbmRsZTsJLyogQ3VycmVudCBDZW50c2NyZWVuIG1vZGUgaGFuZGxlICovCi0KLQkvKiBSZXNldCBjdXJyZW50IG1vZGUgbGlzdCAqLwotCWlmIChYQklPU19tb2RlbGlzdCkgewotCQlTRExfZnJlZShYQklPU19tb2RlbGlzdCk7Ci0JCVhCSU9TX251bW1vZGVzID0gMDsKLQkJWEJJT1NfbW9kZWxpc3QgPSBOVUxMOwotCX0KLQotCS8qIEFkZCBDZW50c2NyZWVuIG1vZGVzICovCi0JVnJlYWQoJmN1cm1vZGUpOwotCWN1cl9oYW5kbGUgPSBjdXJtb2RlLmhhbmRsZTsKLQljdXJtb2RlLm1vZGUgPSBjdXJtb2RlLnBoeXN4ID0gY3VybW9kZS5waHlzeSA9IGN1cm1vZGUucGxhbiA9Ci0JCWN1cm1vZGUubG9neCA9IGN1cm1vZGUubG9neSA9IC0xOwotCi0JcmVzdWx0ID0gVmZpcnN0KCZjdXJtb2RlLCAmbGlzdGVkbW9kZSk7Ci0JaWYgKHJlc3VsdD09MCkgewotCQl3aGlsZSAocmVzdWx0PT0wKSB7Ci0JCQkvKiBEb24ndCBhZGQgbW9kZXMgd2l0aCB2aXJ0dWFsIHNjcmVlbiAqLwotCQkJaWYgKChsaXN0ZWRtb2RlLm1vZGUgJiBDU0NSRUVOX1ZJUlRVQUwpPT0wKSB7Ci0JCQkJLyogRG9uJ3QgYWRkIG1vZGVzIHdpdGggYnBwPDggKi8KLQkJCQlpZiAobGlzdGVkbW9kZS5wbGFuPj04KSB7Ci0JCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIGxpc3RlZG1vZGUubW9kZSwgbGlzdGVkbW9kZS5waHlzeCwKLQkJCQkJCWxpc3RlZG1vZGUucGh5c3ksIGxpc3RlZG1vZGUucGxhbiwgU0RMX0ZBTFNFCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQkJU0RMX21lbWNweSgmY3VybW9kZSwgJmxpc3RlZG1vZGUsIHNpemVvZihjZW50c2NyZWVuX21vZGVfdCkpOwotCQkJY3VybW9kZS5tb2RlID0gY3VybW9kZS5waHlzeCA9IGN1cm1vZGUucGh5c3kgPSBjdXJtb2RlLnBsYW4gPQotCQkJCWN1cm1vZGUubG9neCA9IGN1cm1vZGUubG9neSA9IC0xOwotCQkJcmVzdWx0ID0gVm5leHQoJmN1cm1vZGUsICZsaXN0ZWRtb2RlKTsKLQkJfQkJCi0JfSBlbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJObyBzdWl0YWJsZSBDZW50c2NyZWVuIG1vZGVzXG4iKTsKLQl9Ci0KLQlyZXR1cm4gY3VyX2hhbmRsZTsKLX0KLQotdm9pZCBTRExfWEJJT1NfQ2VudHNjcmVlblNldG1vZGUoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBsYW5lcykKLXsKLQljZW50c2NyZWVuX21vZGVfdAluZXdtb2RlLCBjdXJtb2RlOwotCQotCW5ld21vZGUuaGFuZGxlID0gbmV3bW9kZS5tb2RlID0gbmV3bW9kZS5sb2d4ID0gbmV3bW9kZS5sb2d5ID0gLTE7Ci0JbmV3bW9kZS5waHlzeCA9IHdpZHRoOwotCW5ld21vZGUucGh5c3kgPSBoZWlnaHQ7Ci0JbmV3bW9kZS5wbGFuID0gcGxhbmVzOwotCVZ3cml0ZSgwLCAmbmV3bW9kZSwgJmN1cm1vZGUpOwotCi0JLyogRGlzYWJsZSBzY3JlZW5zYXZlciAqLwotCVZyZWFkKCZuZXdtb2RlKTsKLQluZXdtb2RlLm1vZGUgJj0gfihDU0NSRUVOX1NBVkVSfENTQ1JFRU5fRU5FUkdZU1RBUik7Ci0JVndyaXRlKDAsICZuZXdtb2RlLCAmY3VybW9kZSk7Ci19Ci0KLXZvaWQgU0RMX1hCSU9TX0NlbnRzY3JlZW5SZXN0b3JlKF9USElTLCBpbnQgcHJldl9oYW5kbGUpCi17Ci0JY2VudHNjcmVlbl9tb2RlX3QJbmV3bW9kZSwgY3VybW9kZTsKLQotCS8qIFJlc3RvcmUgb2xkIHZpZGVvIG1vZGUgKi8KLQluZXdtb2RlLmhhbmRsZSA9IHByZXZfaGFuZGxlOwotCW5ld21vZGUubW9kZSA9IG5ld21vZGUucGh5c3ggPSBuZXdtb2RlLnBoeXN5ID0gbmV3bW9kZS5wbGFuID0KLQkJbmV3bW9kZS5sb2d4ID0gbmV3bW9kZS5sb2d5ID0gLTE7Ci0JVndyaXRlKDAsICZuZXdtb2RlLCAmY3VybW9kZSk7Ci19CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19jZW50c2NyZWVuLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19jZW50c2NyZWVuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMjNlN2UuLjAwMDAwMDAKLS0tIGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfY2VudHNjcmVlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotCUNlbnRzY3JlZW4gZXh0ZW5zaW9uIGRlZmluaXRpb25zCi0KLQlQYXRyaWNlIE1hbmRpbgotKi8KLQotI2lmbmRlZiBfU0RMX3hiaW9zX2NlbnRzY3JlZW5faAotI2RlZmluZSBfU0RMX3hiaW9zX2NlbnRzY3JlZW5faAotCi0jaW5jbHVkZSA8bWludC9mYWxjb24uaD4JLyogZm9yIHRyYXBfMTRfeHh4IG1hY3JvcyAqLwotCi0jaW5jbHVkZSAiU0RMX3hiaW9zLmgiCi0KLS8qLS0tIERlZmluZXMgLS0tKi8KLQotI2lmbmRlZiBDX0NOVFMKLSNkZWZpbmUgQ19DTlRTIDB4NDM0ZTU0NTNMCi0jZW5kaWYKLQotI2RlZmluZSBDU0NSRUVOX0VORVJHWVNUQVIJCSgxPDw5KQotI2RlZmluZSBDU0NSRUVOX1NBVkVSCQkJKDE8PDEwKQotI2RlZmluZSBDU0NSRUVOX1ZJUlRVQUwJCQkoMTw8MTEpCi0jZGVmaW5lIENTQ1JFRU5fRVhUQ0xPQ0tfQ1QyCSgxPDwxMikKLSNkZWZpbmUgQ1NDUkVFTl9FWFRDTE9DSwkJKDE8PDEzKQotI2RlZmluZSBDU0NSRUVOX1NUQU5EQVJECQkoMTw8MTQpCi0jZGVmaW5lIENTQ1JFRU5fREVGQVVMVAkJCSgxPDwxNSkKLQotLyotLS0gU3RydWN0dXJlcyAtLS0qLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJaGFuZGxlOwkvKiB2aWRlb21vZGUgaGFuZGxlICovCi0JdW5zaWduZWQgc2hvcnQJbW9kZTsJLyogRmFsY29uIHZpZGVvbW9kZSBjb2RlICovCi0JdW5zaWduZWQgc2hvcnQJcGh5c3g7CS8qIHZpc2libGUgd2lkdGggKi8KLQl1bnNpZ25lZCBzaG9ydAlwaHlzeTsJLyogdmlzaWJsZSBoZWlnaHQgKi8KLQl1bnNpZ25lZCBzaG9ydAlwbGFuOwkvKiBiaXRwbGFuZXMgKi8KLQl1bnNpZ25lZCBzaG9ydAlsb2d4OwkvKiB2aXJ0dWFsIHdpZHRoICovCi0JdW5zaWduZWQgc2hvcnQJbG9neTsJLyogdmlydHVhbCBoZWlnaHQgKi8KLQl1bnNpZ25lZCBzaG9ydAllY287CS8qIHNjcmVlbiBzYXZlciBkZWxheSAqLwotCXVuc2lnbmVkIHNob3J0CWVjbzI7CS8qIGVuZXJneSBzdGFyIHNjcmVlbiBzYXZlciBkZWxheSAqLwotCXVuc2lnbmVkIHNob3J0CXdzaXplOwkvKiBzY3JlZW4gd2lkdGggKG1tKSAqLwotCXVuc2lnbmVkIHNob3J0CWhzaXplOwkvKiBzY3JlZW4gaGVpZ2h0IChtbSkgKi8KLQl1bnNpZ25lZCBzaG9ydAlkdW1teVsyMV07Ci0JdW5zaWduZWQgY2hhcgluYW1lWzMyXTsJLyogdmlkZW9tb2RlIG5hbWUgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgY2VudHNjcmVlbl9tb2RlX3Q7Ci0KLS8qLS0tIEZ1bmN0aW9ucyBwcm90b3R5cGVzIC0tLSovCi0KLSNkZWZpbmUgVnJlYWQoY3VycmVudF9tb2RlKQlcCi0JKHZvaWQpdHJhcF8xNF93bCgoc2hvcnQpMHg0MSwobG9uZykoY3VycmVudF9tb2RlKSkKLSNkZWZpbmUgVndyaXRlKGluaXRfdmRpLCBpbnBhcmFtLCBvdXRwYXJhbSkJXAotCShsb25nKXRyYXBfMTRfd3dsbCgoc2hvcnQpMHg0Miwoc2hvcnQpKGluaXRfdmRpKSwobG9uZykoaW5wYXJhbSksKGxvbmcpKG91dHBhcmFtKSkKLSNkZWZpbmUgVmF0dHJpYihpbnBhcmFtLCBvdXRwYXJhbSkJXAotCSh2b2lkKXRyYXBfMTRfd2xsKChzaG9ydCkweDQzLChsb25nKShpbnBhcmFtKSwobG9uZykob3V0cGFyYW0pKQotI2RlZmluZSBWY3JlYXRlKGlucGFyYW0sIG91dHBhcmFtKQlcCi0JKHZvaWQpdHJhcF8xNF93bGwoKHNob3J0KTB4NDQsKGxvbmcpKGlucGFyYW0pLChsb25nKShvdXRwYXJhbSkpCi0jZGVmaW5lIFZkZWxldGUoaGFuZGxlKQlcCi0JKGxvbmcpdHJhcF8xNF93dygoc2hvcnQpMHg0NSwoc2hvcnQpKGhhbmRsZSkpCi0jZGVmaW5lIFZmaXJzdChtYXNrLG1vZGUpCVwKLQkobG9uZyl0cmFwXzE0X3dsbCgoc2hvcnQpMHg0NiwobG9uZykobWFzayksKGxvbmcpKG1vZGUpKQotI2RlZmluZSBWbmV4dChtYXNrLG1vZGUpCVwKLQkobG9uZyl0cmFwXzE0X3dsbCgoc2hvcnQpMHg0NywobG9uZykobWFzayksKGxvbmcpKG1vZGUpKQotI2RlZmluZSBWdmFsaWQoaGFuZGxlKQlcCi0JKGxvbmcpdHJhcF8xNF93dygoc2hvcnQpMHg0OCwoc2hvcnQpKGhhbmRsZSkpCi0jZGVmaW5lIFZsb2FkKCkJXAotCShsb25nKXRyYXBfMTRfdygoc2hvcnQpMHg0OSkKLSNkZWZpbmUgVnNhdmUoKQlcCi0JKGxvbmcpdHJhcF8xNF93KChzaG9ydCkweDRhKQotI2RlZmluZSBWb3BlbigpCVwKLQkobG9uZyl0cmFwXzE0X3coKHNob3J0KTB4NGIpCi0jZGVmaW5lIFZjbG9zZSgpCVwKLQkobG9uZyl0cmFwXzE0X3coKHNob3J0KTB4NGMpCi0jZGVmaW5lIFZzY3JvbGwoc2Nyb2xsbW9kZSkJXAotCShsb25nKXRyYXBfMTRfd3coKHNob3J0KTB4NGQsKHNob3J0KShzY3JvbGxtb2RlKSkKLSNkZWZpbmUgVm9mZnNldCgpCVwKLQkobG9uZyl0cmFwXzE0X3coKHNob3J0KTB4NGUpCi0jZGVmaW5lIFZzZWVrKCkJXAotCShsb25nKXRyYXBfMTRfdygoc2hvcnQpMHg0ZikKLSNkZWZpbmUgVmxvY2soY21kKQlcCi0JKGxvbmcpdHJhcF8xNF93dygoc2hvcnQpMHg1MCwoc2hvcnQpKGNtZCkpCi0jZGVmaW5lIFNldE1vbihtb250eXBlKQlcCi0JKGxvbmcpdHJhcF8xNF93dygoc2hvcnQpMHg1MSwoc2hvcnQpKG1vbnR5cGUpKQotI2RlZmluZSBNdWx0aU1vbihjbWQpCVwKLQkobG9uZyl0cmFwXzE0X3d3KChzaG9ydCkweDUyLChzaG9ydCkoY21kKSkKLSNkZWZpbmUgVlNpemVDb21wKCkJXAotCShsb25nKXRyYXBfMTRfdygoc2hvcnQpMHg1MykKLSNkZWZpbmUgVnNpemUobW9kZSkJXAotCShsb25nKXRyYXBfMTRfd2woKHNob3J0KTB4NTQsKGxvbmcpKG1vZGUpKQotCi0vKi0tLSBGdW5jdGlvbnMgcHJvdG90eXBlcyAtLS0qLwotCi1pbnQgU0RMX1hCSU9TX0NlbnRzY3JlZW5Jbml0KF9USElTKTsKLXZvaWQgU0RMX1hCSU9TX0NlbnRzY3JlZW5TZXRtb2RlKF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwbGFuZXMpOwotdm9pZCBTRExfWEJJT1NfQ2VudHNjcmVlblJlc3RvcmUoX1RISVMsIGludCBwcmV2X2hhbmRsZSk7Ci0KLSNlbmRpZiAvKiBfU0RMX3hiaW9zX2NlbnRzY3JlZW5faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3Nfc2IzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19zYjMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkNjEwYS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19zYjMuYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotCVNjcmVlbkJsYXN0ZXIgMyBmdW5jdGlvbnMKLQotCVBhdHJpY2UgTWFuZGluCi0qLwotCi0vKi0tLSBJbmNsdWRlcyAtLS0qLwotCi0jaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgotI2luY2x1ZGUgIlNETF94Ymlvcy5oIgotI2luY2x1ZGUgIlNETF94Ymlvc19zYjMuaCIKLQotLyotLS0gRGVmaW5lcyAtLS0qLwotCi1jb25zdCBpbnQgU0RMX1hCSU9TX3NjcG5fcGxhbmVzX2RldmljZVtdPXsKLQlTQ1BOX0RFVl8xQlBQLAotCVNDUE5fREVWXzRCUFAsCi0JU0NQTl9ERVZfOEJQUCwKLQlTQ1BOX0RFVl8xNkJQUCwKLQlTQ1BOX0RFVl8yQlBQLAotCVNDUE5fREVWXzRCUFAsCi0JU0NQTl9ERVZfMUJQUAotfTsKLQotLyotLS0gRnVuY3Rpb25zIC0tLSovCi0KLWludCBTRExfWEJJT1NfU0IzVXNhYmxlKHNjcG5fY29va2llX3QgKmNvb2tpZV9zY3BuKQotewotCXNjcG5fc2NyZWVuaW5mb190ICpzY3JpbmZvOwotCWludCBicHA7Ci0KLQkvKiBDaGVjayBpZiBjdXJyZW50IFNCMyBtb2RlIGlzIHVzYWJsZSwgaS5lLiA4IG9yIDE2YnBwICovCi0Jc2NyaW5mbyA9IGNvb2tpZV9zY3BuLT5zY3JlZW5faW5mbzsKLQlicHAgPSAxPDwoU0RMX1hCSU9TX3NjcG5fcGxhbmVzX2RldmljZVtzY3JpbmZvLT5kZXZpY2VdKTsKLQotCWlmICgoYnBwPT04KSB8fCAoYnBwPT0xNikpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU0RMX1hCSU9TX1NCM0luaXQoX1RISVMsIHNjcG5fY29va2llX3QgKmNvb2tpZV9zY3BuKQotewotCXNjcG5fc2NyZWVuaW5mb190ICpzY3JpbmZvOwotCi0JLyogU0IzIHByZXZlbnQgY2hhbmdpbmcgdmlkZW8gbW9kZXMsIHdlIGNhbiBvbmx5IHVzZSBjdXJyZW50IG9uZSAqLwotCWlmIChYQklPU19tb2RlbGlzdCkgewotCQlTRExfZnJlZShYQklPU19tb2RlbGlzdCk7Ci0JCVhCSU9TX251bW1vZGVzID0gMDsKLQkJWEJJT1NfbW9kZWxpc3QgPSBOVUxMOwotCX0KLQotCXNjcmluZm8gPSBjb29raWVfc2Nwbi0+c2NyZWVuX2luZm87Ci0Jc2NyaW5mby0+aF9wb3MgPSBzY3JpbmZvLT52X3BvcyA9IDA7Ci0KLQlTRExfWEJJT1NfQWRkTW9kZSh0aGlzLAotCQktMSwKLQkJc2NyaW5mby0+dmlydHVhbF93aWR0aCwgc2NyaW5mby0+dmlydHVhbF9oZWlnaHQsCi0JCTE8PChTRExfWEJJT1Nfc2Nwbl9wbGFuZXNfZGV2aWNlW3NjcmluZm8tPmRldmljZV0pLAotCQlTRExfRkFMU0UKLQkpOwotfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3Nfc2IzLmggYi9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19zYjMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE3OWQzMS4uMDAwMDAwMAotLS0gYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19zYjMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2FtIExhbnRpbmdhCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgICBTYW0gTGFudGluZ2EKLSAgICBzbG91a2VuQGxpYnNkbC5vcmcKLSovCi0jaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgotCi0vKgotCVNjcmVlbkJsYXN0ZXIgMyBkZWZpbml0aW9ucwotCi0JUGF0cmljZSBNYW5kaW4KLSovCi0KLSNpZm5kZWYgX1NETF94Ymlvc19zYjNfaF8KLSNkZWZpbmUgX1NETF94Ymlvc19zYjNfaF8KLQotLyotLS0gRGVmaW5lcyAtLS0qLwotCi0jaWZuZGVmIENfU0NQTgotI2RlZmluZSBDX1NDUE4gMHg1MzQzNTA0RUwKLSNlbmRpZgotCi0jZGVmaW5lIFNDUE5fREVWXzFCUFAJMAotI2RlZmluZSBTQ1BOX0RFVl8yQlBQCTEKLSNkZWZpbmUgU0NQTl9ERVZfNEJQUAkyCi0jZGVmaW5lIFNDUE5fREVWXzhCUFAJMwotI2RlZmluZSBTQ1BOX0RFVl8xNkJQUAk0Ci0KLWV4dGVybiBjb25zdCBpbnQgU0RMX1hCSU9TX3NjcG5fcGxhbmVzX2RldmljZVtdOwotCi0vKi0tLSBUeXBlcyAtLS0qLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJdmlydHVhbF93aWR0aDsJLyogVmlydHVhbCBzY3JlZW4gd2lkdGggKi8KLQl1bnNpZ25lZCBzaG9ydAl2aXJ0dWFsX2hlaWdodDsJLyogVmlydHVhbCBzY3JlZW4gaGVpZ2h0ICovCi0JdW5zaWduZWQgc2hvcnQJdmlzaWJsZV93aWR0aDsJLyogVmlzaWJsZSB3aWR0aCAqLwotCXVuc2lnbmVkIHNob3J0CXZpc2libGVfaGVpZ2h0OwkvKiBWaXNpYmxlIGhlaWdodCAqLwotCXVuc2lnbmVkIHNob3J0CWhfcG9zOwkvKiBIb3Jpem9udGFsIHBvc2l0aW9uIGluIHZpcnR1YWwgc2NyZWVuICovCi0JdW5zaWduZWQgc2hvcnQJdl9wb3M7CS8qIFZlcnRpY2FsIHBvc2l0aW9uIGluIHZpcnR1YWwgc2NyZWVuICovCi0JdW5zaWduZWQgc2hvcnQJZHVtbXk7Ci0JdW5zaWduZWQgbG9uZwlzaXplOwkvKiBTaXplIG9mIHNjcmVlbiBpbiBieXRlcyAqLwotCXVuc2lnbmVkIHNob3J0CWRldmljZTsJLyogRGV2aWNlIG51bWJlciB0byBmaW5kIHBsYW5lcyA9IGdldFJleigpICovCi0JCQkJCQkJLyogPSBJbmRleCBpbiBzY3BuX3BsYW5lc19kZXZpY2VbXSAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3BuX3NjcmVlbmluZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcJbWFnaWM7CS8qIGp1c3QgYSBCUkEgYXNzZW1ibGVyIGp1bXAgKi8KLQl1bnNpZ25lZCBzaG9ydAl2ZXJzaW9uOwotCXZvaWQJCQkqZHVtbXkxOwotCXVuc2lnbmVkIHNob3J0CXB0c291dDBfMTsKLQl1bnNpZ25lZCBzaG9ydAlwdHNvdXQwXzI7Ci0JdW5zaWduZWQgc2hvcnQJZHVtbXkzOwotCXVuc2lnbmVkIGNoYXIJZGF0ZVs4XTsJLyogRGF0ZSBvZiBwcm9ncmFtIGJ1aWxkICovCi0JdW5zaWduZWQgY2hhcglhc21fc3RyaW5nWzMwXTsJLyogMTAgdGltZXMgdGhlICdBU00nIHN0cmluZyAqLwotCXVuc2lnbmVkIHNob3J0CWR1bW15NDsKLQlzY3BuX3NjcmVlbmluZm9fdAkqc2NyZWVuX2luZm87Ci0JdW5zaWduZWQgc2hvcnQJZHVtbXk2OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3BuX2Nvb2tpZV90OwotCi0vKi0tLSBGdW5jdGlvbiBwcm90b3R5cGVzIC0tLSovCi0KLWludCBTRExfWEJJT1NfU0IzVXNhYmxlKHNjcG5fY29va2llX3QgKmNvb2tpZV9zY3BuKTsKLQotdm9pZCBTRExfWEJJT1NfU0IzSW5pdChfVEhJUywgc2Nwbl9jb29raWVfdCAqY29va2llX3NjcG4pOwotCi0jZW5kaWYgLyogX1NETF94Ymlvc19zYjNfaF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9CVUdTIGIvZGlzdHJpYi9zZGwtMS4yLjE1L0JVR1MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9CVUdTCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvQlVHUwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L0JvcmxhbmQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9Cb3JsYW5kLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmODIwOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9Cb3JsYW5kLmh0bWwKQEAgLTAsMCArMSwxMzkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKyAgPHRpdGxlPkJ1aWxkaW5nIFNETCB3aXRoIEJvcmxhbmQncyBDKysgY29tcGlsZXJzPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgPG1ldGEgbmFtZT0iYXV0aG9yIgorIGNvbnRlbnQ9IkRhdmlkIFNub3BlayBhbmQgdXBkYXRlZCBieSBEb21pbmlxdWUgTG91aXMuIj4KKzwvaGVhZD4KKyAgPGJvZHk+CisgICAgIDx4ZXZvbCBAbmV3dG9uYXZlLm5ldD0iIj4gICAgICA8L3hldm9sPiAgICAgCis8aDE+QnVpbGRpbmcgU0RMIHdpdGggQm9ybGFuZCdzIEMrKyBjb21waWxlcnMuIDwvaDE+CisgICAgICA8Yj4gYnkgPGEgaHJlZj0ibWFpbHRvOnhldm9sQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCI+IERhdmlkIFNub3BlazwvYT48L2I+IAorICAgIGFuZCB1cGRhdGVkIGJ5IDxiPjxhIGhyZWY9Im1haWx0bzpEb21pbmlxdWVAU2F2YWdlU29mdHdhcmUuY29tLmF1Ij5Eb21pbmlxdWUgCisgIExvdWlzPC9hPjwvYj4gKCBMYXN0IHVwZGF0ZWQgOiAzMHRoIEp1bmUgMjAwMyApLjxicj4KKyAgICAgIDxicj4KKyAgICAgICBUaGVzZSBpbnN0cnVjdGlvbnMgY292ZXIgaG93IHRvIGNvbXBpbGUgU0RMIGFuZCBpdHMgaW5jbHVkZWQgdGVzdAorcHJvZ3JhbXMgICB1c2luZyBlaXRoZXIgIEJvcmxhbmQgPGEgaHJlZj0iI2JjYndpbiI+QysrIEJ1aWxkZXIgNSwgNiBmb3IgV2luZG93czwvYT4sIAorIDxhIGhyZWY9IiNrMyI+QysrIEJ1aWxkZXIgZm9yIExpbnV4ICAoIEFLQSBLeWxpeCAzICk8L2E+IG9yIHRoZSBmcmVlIDxhCisgaHJlZj0iI2JjY2MiPkJvcmxhbmQgQysrIGNvbW1hbmQtbGluZSBjb21waWxlcjwvYT4uIDxicj4KKyAgICAgICAgICAgIAorPGgzPiA8Yj4gRXh0cmFjdCB0aGUgZmlsZXMgPC9iPiA8L2gzPgorICAgICAgICAgICAgCis8cD4gVW56aXAgdGhlIEJvcmxhbmQuemlwIGFyY2hpdmUgaW50byA8Yj50aGlzPC9iPiBkaXJlY3RvcnkuICBEbyBub3QgdW56aXAgCisgIGl0IGludG8gYW55ICBvdGhlciBkaXJlY3RvcnkgYmVjYXVzZSB0aGUgbWFrZWZpbGVzICggKi5tYWsgKSBhbmQgcHJvamVjdCAKKyBmaWxlcyAoICouYnByICkgdXNlIHJlbGF0aXZlIHBhdGhzIHRvIHJlZmVyIHRvIHRoZSBTREwgc291cmNlcy4gIFRoaXMgIHNob3VsZCAKKyBjcmVhdGUgYSBkaXJlY3RvcnkgbmFtZWQgIkJvcmxhbmQiIGluc2lkZSBvZiB0aGUgdG9wIGxldmVsIFNETCBzb3VyY2UgZGlyZWN0b3J5LiAKKyAgIDwvcD4KKyAgICAgICAgICAgIAorPGgzPiA8Yj48YSBuYW1lPSJiY2J3aW4iPjwvYT4gVXNpbmcgQm9ybGFuZCBDKysgQnVpbGRlciA1LCA2IGZvciBXaW5kb3dzIDwvYj4KKzwvaDM+CisgICAgICAgICAgICAKKzxwPiBJbnNpZGUgb2YgdGhlICJCb3JsYW5kIiBkaXJlY3RvcnkgdGhlcmUgaXMgYSAiYmNiNiIgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgCisgIGEgbnVtYmVyICBvZiBCdWlsZGVyIHByb2plY3QgZmlsZXMuICBEb3VibGUtY2xpY2sgb24gdGhlICJsaWJTREwuYnBnIiBmaWxlIAorICBpY29uLiAgT25jZSBCdWlsZGVyIGhhcyAgc3RhcnRlZCBjbGljayBvbiB0aGUgIjx1PlA8L3U+cm9qZWN0cyIgbWVudSBvbiAKK3RoZSAgbWVudS1iYXIgYW5kIGdvIGRvd24gdG8gICJCPHU+dTwvdT5pbGQgQWxsIFByb2plY3RzIiBvcHRpb24uICA8YnI+CisgICBUaGlzIHdpbGwgcHJvY2VlZCAgdG8gYnVpbGQgU0RMICggd2l0aCBCb3JsYW5kJ3MgY2FsbGluZyBjb252ZW50aW9uICksIAorU0RMbWFpbiwgIGFuZCBhbGwgIHRoZSA8YSBocmVmPSIjdGVzdHMiPnRlc3QgcHJvZ3JhbXM8L2E+LiBDdXJyZW50bHksIGFsbCAKK3RoZSA8YSBocmVmPSIjdGVzdHMiPnRlc3QgcHJvZ3JhbXM8L2E+ICBhcmUgZHluYW1pY2FsbHkgbGlua2VkIHRvIFNhbSBMYW50aW5nYSdzIAorU0RMLmRsbC48L3A+CisgICAgIAorPHA+PGI+Tk9URSA6PC9iPiBCb3JsYW5kJ3MgImxpYiIgZm9ybWF0IGFuZCBNaWNyb3NvZnQncyAibGliIiBmb3JtYXQgYXJlIGluY29tcGF0aWJsZS4KKyZuYnNwOzxicj4KKyAgIElmIHlvdSB3aXNoIHRvIGR5bmFtaWNhbGx5IGxpbmsgdG8gdGhlIFNETCBsaWJyYXJ5IHN1cHBsaWVkIGJ5IFNhbSBMYW50aW5nYSAKKyBpbiBlYWNoIHJlbGVhc2UsIEkgaGF2ZSBjcmVhdGVkIHRoZSBjb3JyZWN0ICoubGlicyBmb3IgU0RMIDEuMi40IGFuZCB0aGV5IAorIGV4aXN0IGluIHRoZSAiL2xpYiIgZGlyZWN0b3J5Ljxicj4KKyAgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSB0aGUgKi5saWIgZmlsZXMgeW91cnNlbGYsIHlvdSB3aWxsIG5lZWQgdG8gCittYWtlICB1c2Ugb2YgQm9ybGFuZCdzICJpbXBsaWIuZXhlIiB1dGlsaXR5Ljxicj4KKyAgIDwvcD4KKyAgICAgCis8cD48dHQ+SU1QTElCPC90dD4gd29ya3MgbGlrZSB0aGlzOiA8L3A+CisgICAgICAgCis8cHJlPiAgICBJTVBMSUIgKGRlc3RpbmF0aW9uIGxpYiBuYW1lKSAoc291cmNlIGRsbCk8YnI+PC9wcmU+CisgICAgICAgCis8cD4gRm9yIGV4YW1wbGUsPC9wPgorICAgICAgIAorPHByZT4gICAgSU1QTElCIFNETC5saWIgU0RMLmRsbDxicj48L3ByZT4KKyAgICAgCis8cD5UaGlzIGFzc3VtZXMgdGhhdCBTREwuZGxsIHdhcyBjb21waWxlZCB3aXRoIFZpc3VhbCBDKysgb3Igc2ltaWxhci48YnI+CisgICA8L3A+CisgICAgIAorPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEJvcmxhbmQncyBhbmQgTWljcm9zb2Z0J3MgKi5saWIgCisgZm9ybWF0IHBsZWFzZSByZWFkIHRoZSBhcnRpY2xlIDxhCisgaHJlZj0iaHR0cDovL3d3dy5iY2JkZXYuY29tL2FydGljbGVzL3ZjZGxsLmh0bSI+aGVyZTwvYT4uPGJyPgorICAgPC9wPgorICAgICAKKzxwPiAgPGI+PGJyPgorICAgTk9URSA6PC9iPiBUaGUgQysrIEJ1aWxkZXIgZm9yIFdpbmRvd3MgcHJvamVjdCBmb3JtYXQsIGlzIG5vdCBjb21wYXRpYmxlCisgd2l0aCB0aGUgS3lsaXggIDMgcHJvamVjdCBmb3JtYXQsIGhlbmNlIHRoZSByZWFzb24gd2h5IHRoZXkgYXJlIGluIHNlcGFyYXRlCisgZGlyZWN0b3JpZXMuPC9wPgorICAgICAgICAgICAgCis8aDM+IDxiPjxhIG5hbWU9ImJjY2MiPjwvYT4gVXNpbmcgdGhlIGZyZWUgQm9ybGFuZCBDKysgY29tbWFuZC1saW5lIGNvbXBpbGVyIAorIDwvYj4gPC9oMz4KKyAgICAgICAgICAgIAorPHA+IFRoZSBmcmVlIEJvcmxhbmQgY29tcGlsZXIgY2FuIGJlIGRvd25sb2FkZWQgYXQgbm8gY2hhcmdlIGZyb20gPGEKKyBocmVmPSJodHRwOi8vd3d3LmJvcmxhbmQuY29tL2JjcHBidWlsZGVyL2ZyZWVjb21waWxlci8iPiB0aGUgIEJvcmxhbmQgd2Vic2l0ZSAKKyAgPC9hPi4gIE1ha2Ugc3VyZSB0aGF0IGl0IGlzIGluc3RhbGxlZCBhbmQgcHJvcGVybHkgY29uZmlndXJlZC4gPC9wPgorICAgICAgICAgICAgCis8cD4gT3BlbiBhbiBNUy1ET1MgUHJvbXB0LiAgQ2hhbmdlIHRvIHRoZSAiQm9ybGFuZFxmcmVlYmNjIiBkaXJlY3RvcnkgdW5kZXIgCisgIHRoZSAgU0RMIHNvdXJjZSBkaXJlY3RvcnkuICBUeXBlICJtYWtlIC1mIFNETC5tYWsiIHRvIGJ1aWxkIFNETCBhbmQgIm1ha2UgCisgIC1mICBTRExtYWluLm1hayIuICBUaGVyZSBhcmUgYWxzbyBtYWtlZmlsZXMgZm9yIGFsbCBvZiB0aGUgPGEKKyBocmVmPSIjdGVzdHMiPnRlc3QgIHByb2dyYW1zPC9hPiwgaWYgeW91IHdpc2ggdG8gYnVpbGQgdGhlbS4gQWxsIC5leGVzIGFuZCAKK0RMTHMgYXJlIGNyZWF0ZWQgaW4gdGhlICJ0ZXN0IiBTREwgZGlyZWN0b3J5LiBJZnkgb3Ugd291bGQgbGlrZSB0byBjcmVhdGUgCit0aGUgRExMIGFuZCBhbGwgdGhlIHRlc3QgYXBwbGljYXRpb25zLCBJIGhhdmUgdGhyb3duIHRvZ2V0aGVyIGEgYmFzaWMgYmF0Y2hmaWxlIAorY2FsbGVkICJtYWtlYWxsLmJhdCIgd2hpY2ggc2hvdWxkIGNyZWF0ZSBldmVyeXRoaW5nIGluIHRoZSByaWdodCBvcmRlci4gPC9wPgorICAgICAgICAgICAgCis8aDM+IDxiPiBPdXRwdXQgZmlsZXMgPC9iPiA8L2gzPgorICAgICAgIE5vIG1hdHRlciB3aGljaCBjb21waWxlciB5b3UgdXNlZCwgdGhyZWUgaW1wb3J0YW50IGZpbGVzIHNob3VsZCBoYXZlIAorIGJlZW4gIHByb2R1Y2VkOiAgICAgICAgCis8dWw+CisgICAgICAJPGxpPiBTREwuZGxsICggQm9ybGFuZCBmb3JtYXQgKSA8L2xpPgorICAgICAgCTxsaT4gU0RMLmxpYiZuYnNwOyggQm9ybGFuZCBmb3JtYXQgKSA8L2xpPgorICAgICAgCTxsaT4gU0RMbWFpbi5saWImbmJzcDsoIEJvcmxhbmQgZm9ybWF0ICkgPC9saT4KKyAgICAgICAgICAgCis8L3VsPgorICAgICAgIEJvdGggb2YgdGhlICoubGliIGZpbGVzIHdpbGwgbmVlZCB0byBiZSBhZGRlZCB0byBhbGwgdGhlIHByb2plY3RzCit0aGF0ICAgdXNlIFNETCBhbmQgU0RMLmRsbCAgbXVzdCBiZSBwbGFjZWQgc29tZSB3aGVyZSB0aGUgV2luZG93cyBkeW5hbWljCitsaW5rZXIgICBjYW4gZmluZCBpdCAoZWl0aGVyIGluIHlvdXIgIHByb2plY3QgZGlyZWN0b3J5IG9yIG9uIHRoZSBzeXN0ZW0KK3BhdGgsIEM6XFdJTkRPV1NcU1lTVEVNKS4gICAgICAgCis8aDM+IDxiPjxhIG5hbWU9ImszIj48L2E+IFVzaW5nIEJvcmxhbmQgQysrIEJ1aWxkZXIgZm9yIExpbnV4ICggQUtBIEt5bGl4IAorIDMgKSA8L2I+IDwvaDM+CisgICAgICAgICAgICAgIAorPHA+IEluc2lkZSBvZiB0aGUgIkJvcmxhbmQiIGRpcmVjdG9yeSB0aGVyZSBpcyBhICJrMyIgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgCisgIGEgbnVtYmVyICBvZiBCdWlsZGVyIHByb2plY3QgZmlsZXMuICBEb3VibGUtY2xpY2sgb24gdGhlICJsaWJTREwuYnBnIiBmaWxlIAorICBpY29uLiAgT25jZSBCdWlsZGVyIGhhcyAgc3RhcnRlZCBjbGljayBvbiB0aGUgIjx1PlA8L3U+cm9qZWN0cyIgbWVudSBvbiAKK3RoZSAgbWVudS1iYXIgYW5kIGdvIGRvd24gdG8gICJCPHU+dTwvdT5pbGQgQWxsIFByb2plY3RzIiBvcHRpb24uICBUaGlzIHdpbGwgCitwcm9jZWVkICB0byBidWlsZCBhbGwgIHRoZSA8YSBocmVmPSIjdGVzdHMiPnRlc3QgcHJvZ3JhbXM8L2E+LiZuYnNwOzxicj4KKyAgIExpbnV4ICB1c2VycyBkbyBub3QgbmVlZCAqLmxpYiBmaWxlcyBhcyB0aGUgU2hhcmVkIE9iamVjdCBpcyBsaW5rZWQgcmlnaHQgCisgaW50byB0aGUgIHByb2plY3QgKCB2ZXJ5IG5lYXQgYWN0dWFsbHksIFdpbmRvd3Mgc2hvdWxkIGRvIHRoaXMgc29ydCBvZiB0aGluZyAKKyBhcyBpdCBpcyBhIGxvdCBlYXNpZXIgZm9yIHRoZSBkZXZlbG9wZXIgKS4gIDxicj4KKyAgICAgIDxiPk5PVEUgOjwvYj4mbmJzcDtUaGUgQysrIEJ1aWxkZXIgZm9yIFdpbmRvd3MgcHJvamVjdCBmb3JtYXQsIGlzIG5vdAorIGNvbXBhdGlibGUgd2l0aCB0aGUgS3lsaXggIDMgcHJvamVjdCBmb3JtYXQsIGhlbmNlIHRoZSByZWFzb24gd2h5IHRoZXkgYXJlCisgaW4gc2VwYXJhdGUgZGlyZWN0b3JpZXMuPC9wPgorICAgICAgICAgICAKKzxwPiBPbiBNYW5kcmFrZSA4LjEgdGhlIHNoYXJlZCBvYmplY3RzIGZvciBTREwgYXJlIGxvY2F0ZWQgaW4gdGhlIC91c3IvbGliIAorICBkaXJlY3RvcnkgYXMgbGliU0RMXyouc28gYW5kIHRoZSBNZXNhIE9wZW5HTCBzaGFyZWQgb2JqZWN0cyBhcmUgbG9jYXRlZCAKK2luICAvdXNyL1gxMVI2L2xpYiBhcyBsaWJHTCouc288YnI+CisgICAgICAgPGJyPgorICAgICAgIFNvIGlmIHlvdXIgc2V0dXAgaXMgZGlmZmVyZW50IHlvdSBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlIHByb2plY3QgZmlsZQorICBzbyB0aGF0IHRoZXkgcmUtbGluayB0byB0aGUgb25lcyBvbiB5b3VyIHN5c3RlbS48YnI+CisgICAgICAgPGJyPgorICAgICAgIE9uIE1hbmRyYWtlIDguMSB0aGUgaGVhZGVycyBmaWxlcyBhcmUgbG9jYXRlZCBhdCAvdXNyL2luY2x1ZGUvU0RMLy4KKyBTbyAgaWYgeW91IHlvdSBoYXZlIG5vdCBpbnN0YWxsZWQgdGhlIGRldmVsb3BtZW50IFJQTXMgKCB1c3VhbGx5IG5hbWVkIGxpYlNETC1kZXZlbCoKKyAgICkgZm9yIFNETCAoIG5vdCBpbmNsdWRlZCApIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlIGluY2x1ZGUgZGlyZWN0b3J5Cisgd2l0aGluICBzb21lIG9mIHRoZSBwcm9qZWN0cy48YnI+CisgICA8L3A+CisgICAgIAorPGgzPiBLbm93biBQcm9ibGVtczwvaDM+CisgICAgIFRoZSBvbmx5IGtub3duIHByb2JsZW0gaXMgdGhhdCBJICggRG9taW5pcXVlIExvdWlzICksIHdhcyB1bmFibGUgdG8KK2NyZWF0ZSAgdGhlIHByb2plY3RzIHRoYXQgcmVidWlsdCB0aGUgU0RMIHNoYXJlZCBvYmplY3RzIHVuZGVyIExpbnV4LCBkdWUKK3RvIHRpbWUgIGNvbnN0cmFpbnRzIGFuZCBteSBsYWNrIG9mIGludGltYXRlIGtub3dsZWRnZSBvZiBMaW51eC4gICAgIAorPGgzPjxhIG5hbWU9InRlc3RzIj48Yj4gVGVzdCBwcm9ncmFtcyA8L2I+IDwvYT48L2gzPgorICAgU29tZSBvZiB0aGUgdGVzdCBwcm9ncmFtcyByZXF1aXJlIGluY2x1ZGVkIG1lZGlhIGZpbGVzICggKi53YXY7ICouYm1wCitldGMgICApLiBBbGwgdGhlIHRlc3QgcHJvZ3JhbXMgYXJlIG5vdyBjcmVhdGVkIGluIHRoZSAidGVzdCIgZGlyZWN0b3J5LCB3aGVyZQordGhlIG1lZGlhIGZpbGVzIGFyZSAoIHVzdWFsbHkgKSBzbyB0aGV5IHNob3VsZCBiZSByZWFkeSB0byBnby4gIDxicj4KKyAgICAgPGJyPgorICA8YnI+CisgPGJyPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L0JvcmxhbmQuemlwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L0JvcmxhbmQuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOGY0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvQm9ybGFuZC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL0NPUFlJTkcgYi9kaXN0cmliL3NkbC0xLjIuMTUvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL0NPUFlJTkcKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9DT1BZSU5HCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvQ1JFRElUUyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9DUkVESVRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGNmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvQ1JFRElUUwpAQCAtMCwwICsxLDk0IEBACisKK1NpbXBsZSBEaXJlY3RNZWRpYSBMYXllciBDUkVESVRTCitUaGFua3MgdG8gZXZlcnlvbmUgd2hvIG1hZGUgdGhpcyBwb3NzaWJsZSwgaW5jbHVkaW5nOgorCisqIENsaWZmIE1hdHRoZXdzLCBmb3IgZ2l2aW5nIG1lIGEgcmVhc29uIHRvIHN0YXJ0IHRoaXMgcHJvamVjdC4gOikKKyAtLSBFeGVjdXRvciByb2NrcyEgICpncmluKgorCisqIFNjb3R0IENhbGwsIGZvciBtYWtpbmcgYSBob21lIGZvciBTREwgb24gdGhlICdOZXQuLi4gVGhhbmtzISA6KQorCisqIFRoZSBMaW51eCBGdW5kLCBDIE1hZ2F6aW5lLCBFZHVjYXRpb25hbCBUZWNobm9sb2d5IFJlc291cmNlcyBJbmMuLAorICBHYXJldGggTm95Y2UsIEplc3NlIFBhdmVsLCBLZWl0aCBLaXRjaGluLCBKZXJlbXkgSG9ydmF0aCwgVGhvbWFzIE5pY2hvbHNvbiwKKyAgSGFucy1QZXRlciBHeWdheCwgdGhlIEV0ZXJuYWwgTGFuZHMgRGV2ZWxvcG1lbnQgVGVhbSwgTGFycyBCcnViYWtlciwKKyAgYW5kIFBob2VuaXggS29raWRvIGZvciBmaW5hbmNpYWwgY29udHJpYnV0aW9ucworCisqIEdh63RhbiBkZSBNZW50ZW4gZm9yIHdyaXRpbmcgdGhlIFBIUCBhbmQgU1FMIGJlaGluZCB0aGUgU0RMIHdlYnNpdGUKKworKiBUaW0gSm9uZXMgZm9yIHRoZSBuZXcgbG9vayBvZiB0aGUgU0RMIHdlYnNpdGUKKworKiBNYXJjbyBLcmF1cyBmb3Igc2V0dGluZyB1cCBTREwgbWVyY2hhbmRpc2UKKworKiBNYXJ0aW4gRG9ubG9uIGZvciBoaXMgd29yayBvbiB0aGUgU0RMIERvY3VtZW50YXRpb24gUHJvamVjdAorCisqIFJ5YW4gR29yZG9uIGZvciBoZWxwaW5nIGV2ZXJ5Ym9keSBvdXQgYW5kIGtlZXBpbmcgdGhlIGRyZWFtIGFsaXZlLiA6KQorCisqIElCTSBSJkQgTGFiIGZvciB0aGVpciBQUzMgU1BFIHZpZGVvIGFjY2VsZXJhdGlvbiBjb2RlCisKKyogTWF0dGlhcyBFbmdkZWflcmQsIGZvciBoZWxwIHdpdGggdGhlIFNvbGFyaXMgcG9ydCBhbmQgbG90cyBvZiBvdGhlciBoZWxwCisKKyogTWF4IFdhdHNvbiwgTWF0dCBTbG90LCBhbmQgS3lsZSBmb3IgaGVscCB3aXRoIHRoZSBNYWNPUyBDbGFzc2ljIHBvcnQKKworKiBTdGFuIFNoZWJzLCBmb3IgdGhlIGluaXRpYWwgTWFjIE9TIFggcG9ydAorCisqIEVyaWMgV2luZywgTWF4IEhvcm4sIGFuZCBEYXJyZWxsIFdhbGlzc2VyIGZvciB1bmZsYWdnaW5nIHdvcmsgb24gdGhlIE1hYyBPUyBYIHBvcnQKKworKiBQYXRyaWNrIFRyYWlub3IsIEppbSBCb3VjaGVyLCBhbmQgTWlrZSBHb3JjaGFrIGZvciB0aGUgUU5YIE5ldXRyaW5vIHBvcnQKKworKiBDYXJzdGVuIEdyaXdvZHogZm9yIHRoZSBBSVggcG9ydAorCisqIEdhYnJpZWxlIEdyZWNvLCBmb3IgdGhlIEFtaWdhIHBvcnQKKworKiBQYXRyaWNlIE1hbmRpbiwgZm9yIHRoZSBBdGFyaSBwb3J0CisKKyogSGFubnUgVmlpdGFsYSBmb3IgdGhlIEVQT0MgcG9ydAorCisqIE1hcmN1cyBNZXJ0YW1hIGZvciB0aGUgUzYwIHBvcnQuCisKKyogUGV0ZXIgVmFsY2hldiBmb3IgbmFnZ2luZyBtZSBhYm91dCB0aGUgT3BlbkJTRCBwb3J0IHVudGlsIEkgZ290IGl0IHJpZ2h0LiA6KQorCisqIEtlbnQgQiBNZWluLCBmb3IgYSBwbGFjZSB0byBkbyB0aGUgSVJJWCBwb3J0CisKKyogQXNoLCBmb3IgYSBwbGFjZSB0byBkbyB0aGUgT1NGLzEgQWxwaGEgcG9ydAorCisqIERhdmlkIFNvd3N5LCBmb3IgaGVscCB3aXRoIHRoZSBCZU9TIHBvcnQKKworKiBFdWdlbmlhIExvbGksIGZvciBlbmRsZXNzIHdvcmsgb24gcG9ydGluZyBTREwgZ2FtZXMgdG8gQmVPUworCisqIEpvbiBUYXlsb3IgZm9yIHRoZSBHR0kgZnJvbnQtZW5kCisKKyogUGF1bHVzIEVzdGVyaGF6eSwgZm9yIHRoZSBWaXN1YWwgQysrIHRlc3RpbmcgYW5kIGxpYnJhcmllcworCisqIEJyZW5kYSBUYW50emVuLCBmb3IgTWV0cm93ZXJrcyBDb2RlV2FycmlvciBvbiBNYWNPUworCisqIENocmlzIE5lbnR3aWNoLCBmb3IgdGhlIEhlcm1lcyBhc3NlbWJseSBibGl0dGVycworCisqIE1pY2hhZWwgVmFuY2UgYW5kIEppbSBLdXR0ZXIgZm9yIHRoZSBYMTEgT3BlbkdMIHN1cHBvcnQKKworKiBTdGVwaGFuZSBQZXRlciwgZm9yIHRoZSBBQWxpYiBmcm9udC1lbmQgYW5kIG11bHRpLXRocmVhZGVkIHRpbWVyIGlkZWEuCisKKyogSm9uIEF0a2lucyBmb3IgU0RMX2ltYWdlLCBTRExfbWl4ZXIgYW5kIFNETF9uZXQgZG9jdW1lbnRhdGlvbgorCisqIFBldGVyIFdpa2x1bmQsIGZvciB0aGUgMTk5OCB3aW5uaW5nIFNETCBsb2dvLAorICBhbmQgQXJ0byBIYW1hcmEsIFN0ZXZlbiBXb25nLCBhbmQgS2VudCBNZWluIGZvciBvdGhlciBsb2dvIGVudHJpZXMuCisKKyogQXJuZSBDbGF1cywgZm9yIHRoZSAyMDA0IHdpbm5pbmcgU0RMIGxvZ28sCisgIGFuZCBTaGFuZHkgQnJvd24sIEphYywgQWxleCBMeW1hbiwgTWlra2VsIEdqb2VsLCAjR3V5LCBKb25hcyBIYXJ0bWFubiwKKyAgRGFuaWVsIExpbGplYmVyZywgIFJvbmFsZCBTb3dhLCBEb2NELCBQZWtrYSBKYWVydmluZW4sIFBhdHJpY2sgQXZlbGxhLAorICBFcmtraSBLb250aWxsYSwgTGV2b24gR2F2YWxpYW4sIEhhbCBFbWVyaWNoLCBEYXZpZCBXaWt0b3Jzc29uLAorICBTLiBTY2h1cnkgYW5kIEYuIEh1ZnNreSwgQ2lza2EgZGUgUnV5dmVyLCBTaHJlZHdlYXQsIFR5bGVyIE1vbnRicmlhbmQsCisgIE1hcnRpbiBBbmRlcnNzb24sIE1lcmx5biBXeXNhcmQsIEZlcm5hbmRvIEliYW5leiwgRGF2aWQgTWlsbGVyLAorICBBbmRyZSBCb21tZWxlLCBsb3Zlc2J5LmNvbSwgRnJhbmNpc2NvIENhbWVuZm9ydGUgVG9ycmVzLCBhbmQgRGF2aWQgSWdyZWphCisgIGZvciBvdGhlciBsb2dvIGVudHJpZXMuCisKKyogQm9iIFBlbmRsZXRvbiBhbmQgRGF2aWQgT2xvZnNvbiBmb3IgYmVpbmcgbG9uZyB0aW1lIGNvbnRyaWJ1dG9ycyB0bworICB0aGUgU0RMIG1haWxpbmcgbGlzdC4KKworKiBFdmVyeWJvZHkgYXQgTG9raSBTb2Z0d2FyZSwgSW5jLiBmb3IgdGhlaXIgZ3JlYXQgY29udHJpYnV0aW9ucyEKKworIEFuZCBhIGJpZyBoYW5kIHRvIGV2ZXJ5b25lIGVsc2Ugd2hvIGdhdmUgbWUgYXBwcmVjaWF0aW9uLCBhZHZpY2UsCisgYW5kIHN1Z2dlc3Rpb25zLCBlc3BlY2lhbGx5IHRoZSBnb29kIGZvbGtzIG9uIHRoZSBTREwgbWFpbGluZyBsaXN0LgorCitUSEFOS1MhIDopCisKKyAgLS0gU2FtIExhbnRpbmdhCQkJPHNsb3VrZW5AbGlic2RsLm9yZz4KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L0NXcHJvamVjdHMuc2VhLmJpbiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9DV3Byb2plY3RzLnNlYS5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhNmZkYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9DV3Byb2plY3RzLnNlYS5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L0lOU1RBTEwgYi9kaXN0cmliL3NkbC0xLjIuMTUvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTMwZmJhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L0lOU1RBTEwKQEAgLTAsMCArMSwyMyBAQAorCitUbyBjb21waWxlIGFuZCBpbnN0YWxsIFNETDoKKworICAgIDEuICBSdW4gJy4vY29uZmlndXJlOyBtYWtlOyBtYWtlIGluc3RhbGwnCisKKyAgICAgICAgSWYgeW91IGFyZSBjb21waWxpbmcgZm9yIFdpbmRvd3MgdXNpbmcgZ2NjLCByZWFkIHRoZSBGQVEgYXQ6CisgICAgICAgIGh0dHA6Ly93d3cubGlic2RsLm9yZy9mYXEucGhwP2FjdGlvbj1saXN0ZW50cmllcyZjYXRlZ29yeT00IzQyCisKKyAgICAgICAgSWYgeW91IGFyZSBjb21waWxpbmcgdXNpbmcgVmlzdWFsIEMrKyBvbiBXaW4zMiwgeW91IHNob3VsZCByZWFkCisgICAgICAgIHRoZSBmaWxlIFZpc3VhbEMuaHRtbAorCisgICAgMi4gIExvb2sgYXQgdGhlIGV4YW1wbGUgcHJvZ3JhbXMgaW4gLi90ZXN0LCBhbmQgY2hlY2sgb3V0IHRoZSBIVE1MCisgICAgICAgIGRvY3VtZW50YXRpb24gaW4gLi9kb2NzIHRvIHNlZSBob3cgdG8gdXNlIHRoZSBTREwgbGlicmFyeS4KKworICAgIDMuICBKb2luIHRoZSBTREwgZGV2ZWxvcGVyIG1haWxpbmcgbGlzdCBieSBzZW5kaW5nIEUtbWFpbCB0bworICAgIAlzZGwtcmVxdWVzdEBsaWJzZGwub3JnCisgICAgICAgIGFuZCBwdXQgInN1YnNjcmliZSIgaW4gdGhlIHN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuCisKKyAgICAgICAgT3IgYWx0ZXJuYXRpdmVseSB5b3UgY2FuIHVzZSB0aGUgd2ViIGludGVyZmFjZToKKyAgICAgICAgICAgIGh0dHA6Ly93d3cubGlic2RsLm9yZy9tYWlsaW5nLWxpc3QucGhwCisKK1RoYXQncyBpdCEKK1NhbSBMYW50aW5nYSA8c2xvdWtlbkBsaWJzZGwub3JnPgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L01QV21ha2Uuc2VhLmJpbiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9NUFdtYWtlLnNlYS5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0NWUwOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9NUFdtYWtlLnNlYS5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L01ha2VmaWxlIGIvZGlzdHJpYi9zZGwtMS4yLjE1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzY3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvTWFrZWZpbGUKQEAgLTAsMCArMSw3MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyB0aGlzIGlzIGEgc2V0IG9mIGRlZmluaXRpb25zIHRoYXQgYWxsb3cgdGhlIHVzYWdlIG9mIE1ha2VmaWxlLmFuZHJvaWQKKyMgZXZlbiBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIEFuZHJvaWQgYnVpbGQgc3lzdGVtLgorIworCitPQkpTX0RJUiAgICAgOj0gb2JqcworQ09ORklHX01BS0UgIDo9ICQoT0JKU19ESVIpL2NvbmZpZy5tYWtlCitDT05GSUdfSCAgICAgOj0gJChPQkpTX0RJUikvY29uZmlnLWhvc3QuaAorCitpZmVxICgkKHdpbGRjYXJkICQoQ09ORklHX01BS0UpKSwpCisgICAgJChlcnJvciAiVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAnJChDT05GSUdfTUFLRSknIGRvZXNudCcgZXhpc3QsIHBsZWFzZSBydW4gdGhlICJhbmRyb2lkLWNvbmZpZ3VyZS5zaCIgc2NyaXB0KQorZW5kaWYKKworaW5jbHVkZSAkKENPTkZJR19NQUtFKQorCitpZmVxICgkKHN0cmlwICQoQlVJTERfU1lTVEVNKSksKQorICAgICQoZXJyb3IgIlRoZSBCVUlMRF9TWVNURU0gdmFyaWFibGUgd2FzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgY29uZmlndXJhdGlvbiBzdWItbWFrZWZpbGUuIEFib3J0aW5nIikKK2VuZGlmCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2RlZmluaXRpb25zLm1ha2UKKworVlBBVEggOj0gJChPQkpTX0RJUikKK1ZQQVRIICs9IDokKFNSQ19QQVRIKS9pbmNsdWRlCitWUEFUSCArPSA6JChTUkNfUEFUSCkKKworLlBIT05ZOiBhbGwgbGlicmFyaWVzIGV4ZWN1dGFibGVzIGNsZWFuIGNsZWFuLWNvbmZpZyBjbGVhbi1vYmpzLWRpciBcCisgICAgICAgIGNsZWFuLWV4ZWN1dGFibGVzIGNsZWFuLWxpYnJhcmllcworCitDTEVBUl9WQVJTICAgICAgICAgICAgICAgIDo9ICQoQlVJTERfU1lTVEVNKS9jbGVhcl92YXJzLm1ha2UKK0JVSUxEX0hPU1RfRVhFQ1VUQUJMRSAgICAgOj0gJChCVUlMRF9TWVNURU0pL2hvc3RfZXhlY3V0YWJsZS5tYWtlCitCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZIDo9ICQoQlVJTERfU1lTVEVNKS9ob3N0X3N0YXRpY19saWJyYXJ5Lm1ha2UKKworREVQRU5ERU5DWV9ESVJTIDo9CisKK2FsbDogbGlicmFyaWVzIGV4ZWN1dGFibGVzCitFWEVDVVRBQkxFUyA6PQorTElCUkFSSUVTICAgOj0KKworY2xlYW46IGNsZWFuLWludGVybWVkaWF0ZXMKKworZGlzdGNsZWFuOiBjbGVhbiBjbGVhbi1jb25maWcKKworIyBsZXQncyByb2xsCitpbmNsdWRlIE1ha2VmaWxlLmFuZHJvaWQKKworbGlicmFyaWVzOiAkKExJQlJBUklFUykKK2V4ZWN1dGFibGVzOiAkKEVYRUNVVEFCTEVTKQorCitjbGVhbi1pbnRlcm1lZGlhdGVzOgorCXJtIC1yZiAkKE9CSlNfRElSKS9pbnRlcm1lZGlhdGVzICQoRVhFQ1VUQUJMRVMpICQoTElCUkFSSUVTKQorCitjbGVhbi1jb25maWc6CisJcm0gLWYgJChDT05GSUdfTUFLRSkgJChDT05GSUdfSCkKKworIyBpbmNsdWRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24KK0RFUEVOREVOQ1lfRElSUyA6PSAkKHNvcnQgJChERVBFTkRFTkNZX0RJUlMpKQorLWluY2x1ZGUgJCh3aWxkY2FyZCAkKERFUEVOREVOQ1lfRElSUzolPSUvKi5kKSkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9NYWtlZmlsZS5hbmRyb2lkIGIvZGlzdHJpYi9zZGwtMS4yLjE1L01ha2VmaWxlLmFuZHJvaWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9NYWtlZmlsZS5hbmRyb2lkCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvTWFrZWZpbGUuYW5kcm9pZApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L01ha2VmaWxlLmRjIGIvZGlzdHJpYi9zZGwtMS4yLjE1L01ha2VmaWxlLmRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDZlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvTWFrZWZpbGUuZGMKQEAgLTAsMCArMSwxMTEgQEAKKyNHTD0xCisKK0NDID0gc2gtZWxmLWdjYworQVIgPSBzaC1lbGYtYXIKKworaWZkZWYgR0wKK0RFRlMgKz0gLURTRExfVklERU9fT1BFTkdMPTEKK1RBUkdFVCA9IGxpYlNETF9nbC5hCitlbHNlCitUQVJHRVQgPSBsaWJTREwuYQorZW5kaWYKKworQ0ZMQUdTPSQoS09TX0NGTEFHUykgJChERUZTKSAtSWluY2x1ZGUKKworU1JDUyA9IFwKKwlzcmMvYXVkaW8vZGMvU0RMX2RjYXVkaW8uYyBcCisJc3JjL2F1ZGlvL2RjL2FpY2EuYyBcCisJc3JjL2F1ZGlvL2R1bW15L1NETF9kdW1teWF1ZGlvLmMgXAorCXNyYy9hdWRpby9TRExfYXVkaW8uYyBcCisJc3JjL2F1ZGlvL1NETF9hdWRpb2N2dC5jIFwKKwlzcmMvYXVkaW8vU0RMX2F1ZGlvZGV2LmMgXAorCXNyYy9hdWRpby9TRExfbWl4ZXIuYyBcCisJc3JjL2F1ZGlvL1NETF93YXZlLmMgXAorCXNyYy9jZHJvbS9kYy9TRExfc3lzY2Ryb20uYyBcCisJc3JjL2Nkcm9tL1NETF9jZHJvbS5jIFwKKwlzcmMvZXZlbnRzL1NETF9hY3RpdmUuYyBcCisJc3JjL2V2ZW50cy9TRExfZXZlbnRzLmMgXAorCXNyYy9ldmVudHMvU0RMX2V4cG9zZS5jIFwKKwlzcmMvZXZlbnRzL1NETF9rZXlib2FyZC5jIFwKKwlzcmMvZXZlbnRzL1NETF9tb3VzZS5jIFwKKwlzcmMvZXZlbnRzL1NETF9xdWl0LmMgXAorCXNyYy9ldmVudHMvU0RMX3Jlc2l6ZS5jIFwKKwlzcmMvZmlsZS9TRExfcndvcHMuYyBcCisJc3JjL2pveXN0aWNrL2RjL1NETF9zeXNqb3lzdGljay5jIFwKKwlzcmMvam95c3RpY2svU0RMX2pveXN0aWNrLmMgXAorCXNyYy9sb2Fkc28vZHVtbXkvU0RMX3N5c2xvYWRzby5jIFwKKwlzcmMvU0RMLmMgXAorCXNyYy9TRExfZXJyb3IuYyBcCisJc3JjL1NETF9mYXRhbC5jIFwKKwlzcmMvc3RkbGliL1NETF9nZXRlbnYuYyBcCisJc3JjL3N0ZGxpYi9TRExfaWNvbnYuYyBcCisJc3JjL3N0ZGxpYi9TRExfbWFsbG9jLmMgXAorCXNyYy9zdGRsaWIvU0RMX3Fzb3J0LmMgXAorCXNyYy9zdGRsaWIvU0RMX3N0ZGxpYi5jIFwKKwlzcmMvc3RkbGliL1NETF9zdHJpbmcuYyBcCisJc3JjL3RocmVhZC9kYy9TRExfc3lzY29uZC5jIFwKKwlzcmMvdGhyZWFkL2RjL1NETF9zeXNtdXRleC5jIFwKKwlzcmMvdGhyZWFkL2RjL1NETF9zeXNzZW0uYyBcCisJc3JjL3RocmVhZC9kYy9TRExfc3lzdGhyZWFkLmMgXAorCXNyYy90aHJlYWQvU0RMX3RocmVhZC5jIFwKKwlzcmMvdGltZXIvZGMvU0RMX3N5c3RpbWVyLmMgXAorCXNyYy90aW1lci9TRExfdGltZXIuYyBcCisJc3JjL3ZpZGVvL2RjL1NETF9kY2V2ZW50cy5jIFwKKwlzcmMvdmlkZW8vZGMvU0RMX2RjdmlkZW8uYyBcCisJc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsZXZlbnRzLmMgXAorCXNyYy92aWRlby9kdW1teS9TRExfbnVsbG1vdXNlLmMgXAorCXNyYy92aWRlby9kdW1teS9TRExfbnVsbHZpZGVvLmMgXAorCXNyYy92aWRlby9TRExfYmxpdC5jIFwKKwlzcmMvdmlkZW8vU0RMX2JsaXRfMC5jIFwKKwlzcmMvdmlkZW8vU0RMX2JsaXRfMS5jIFwKKwlzcmMvdmlkZW8vU0RMX2JsaXRfQS5jIFwKKwlzcmMvdmlkZW8vU0RMX2JsaXRfTi5jIFwKKwlzcmMvdmlkZW8vU0RMX2JtcC5jIFwKKwlzcmMvdmlkZW8vU0RMX2N1cnNvci5jIFwKKwlzcmMvdmlkZW8vU0RMX2dhbW1hLmMgXAorCXNyYy92aWRlby9TRExfcGl4ZWxzLmMgXAorCXNyYy92aWRlby9TRExfUkxFYWNjZWwuYyBcCisJc3JjL3ZpZGVvL1NETF9zdHJldGNoLmMgXAorCXNyYy92aWRlby9TRExfc3VyZmFjZS5jIFwKKwlzcmMvdmlkZW8vU0RMX3ZpZGVvLmMgXAorCXNyYy92aWRlby9TRExfeXV2LmMgXAorCXNyYy92aWRlby9TRExfeXV2X3N3LmMgXAorCitPQkpTID0gJChTUkNTOi5jPS5vKQorCitURVNUID0gXAorCXRlc3QvY2hlY2trZXlzLmMgXAorCXRlc3QvZ3JheXdpbi5jIFwKKwl0ZXN0L2xvb3B3YXZlLmMgXAorCXRlc3QvdGVzdGFscGhhLmMgXAorCXRlc3QvdGVzdGJpdG1hcC5jIFwKKwl0ZXN0L3Rlc3RjZHJvbS5jIFwKKwl0ZXN0L3Rlc3RlcnJvci5jIFwKKwl0ZXN0L3Rlc3RnYW1tYS5jIFwKKwl0ZXN0L3Rlc3RnbC5jIFwKKwl0ZXN0L3Rlc3RocmVhZC5jIFwKKwl0ZXN0L3Rlc3Rqb3lzdGljay5jIFwKKwl0ZXN0L3Rlc3RrZXlzLmMgXAorCXRlc3QvdGVzdGxvY2suYyBcCisJdGVzdC90ZXN0b3ZlcmxheS5jIFwKKwl0ZXN0L3Rlc3RwYWxldHRlLmMgXAorCXRlc3QvdGVzdHNlbS5jIFwKKwl0ZXN0L3Rlc3RzcHJpdGUuYyBcCisJdGVzdC90ZXN0dGltZXIuYyBcCisJdGVzdC90ZXN0dHlwZXMuYyBcCisJdGVzdC90ZXN0dmVyLmMgXAorCXRlc3QvdGVzdHZpZGluZm8uYyBcCisJdGVzdC90ZXN0d2luLmMgXAorCXRlc3QvdGVzdHdtLmMgXAorCXRlc3QvdGhyZWFkd2luLmMgXAorCXRlc3QvdG9ydHVyZXRocmVhZC5jIFwKKworJChUQVJHRVQpOiBjb3B5X2NvbmZpZyBcCisJJChPQkpTKQorCSQoQVIpIHJjcyAkKFRBUkdFVCkgJChPQkpTKSAKKworY29weV9jb25maWc6CisJQGNwIGluY2x1ZGUvU0RMX2NvbmZpZy5oLmRlZmF1bHQgaW5jbHVkZS9TRExfY29uZmlnLmgKKworY2xlYW46CisJcm0gLWYgaW5jbHVkZS9TRExfY29uZmlnLmggJChPQkpTKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L01ha2VmaWxlLmRzIGIvZGlzdHJpYi9zZGwtMS4yLjE1L01ha2VmaWxlLmRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmM2QxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvTWFrZWZpbGUuZHMKQEAgLTAsMCArMSw2MyBAQAorI0xpYlNETCAxLjIuMTIKKyNEUyBwb3J0aW5nIGJ5IFRyb3kgRGF2aXMoR1BGKQorCisKK2lmZXEgKCQoc3RyaXAgJChERVZLSVRQUk8pKSwpCiskKGVycm9yICJQbGVhc2Ugc2V0IERFVktJVFBSTyBpbiB5b3VyIGVudmlyb25tZW50LiBleHBvcnQgREVWS0lUUFJPPTxwYXRoIHRvPmRldmtpdFBybykKK2VuZGlmCitpZmVxICgkKHN0cmlwICQoREVWS0lUQVJNKSksKQorREVWS0lUQVJNIDo9ICQoREVWS0lUUFJPKS9kZXZraXRBUk0KK2VuZGlmCisKKworU1JDUyA9ICQoc2hlbGwgZWNobyAuL3NyYy8qLmMgLi9zcmMvYXVkaW8vKi5jIC4vc3JjL2Nkcm9tLyouYyAuL3NyYy9jcHVpbmZvLyouYyAuL3NyYy9ldmVudHMvKi5jIC4vc3JjL2ZpbGUvKi5jIC4vc3JjL3N0ZGxpYi8qLmMgLi9zcmMvdGhyZWFkLyouYyAuL3NyYy90aW1lci8qLmMgLi9zcmMvdmlkZW8vKi5jIC4vc3JjL2pveXN0aWNrLyouYyAuL3NyYy9qb3lzdGljay9uZHMvKi5jIC4vc3JjL2Nkcm9tL2R1bW15LyouYyAuL3NyYy90aHJlYWQvZ2VuZXJpYy8qLmMgLi9zcmMvdGltZXIvbmRzLyouYyAuL3NyYy9sb2Fkc28vZHVtbXkvKi5jIC4vc3JjL2F1ZGlvL2R1bW15LyouYyAuL3NyYy9hdWRpby9uZHMvKi5jIC4vc3JjL3ZpZGVvL2R1bW15LyouYyAuL3NyYy92aWRlby9uZHMvKi5jKQorCitPQkpTID0gJChTUkNTOi5jPS5vKSAKKwkKKworU1VCRElSUz0KKworQ0M9YXJtLWVhYmktZ2NjCitDWFg9YXJtLWVhYmktZysrIAorTERTSEFSRUQ9JChDWFgpCitBUj1hcm0tZWFiaS1hciByYworUkFOTElCPWFybS1lYWJpLXJhbmxpYiAKKworQ0ZMQUdTCT0JLW10aHVtYiAtbXRodW1iLWludGVyd29yayBcCisJCS1tYXJjaD1hcm12NXRlIC1tdHVuZT1hcm05NDZlLXMgXAorCQktTzIgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCBcCisJCS1EQVJNOSAtRF9fTkRTX18gLUkkKERFVktJVFBSTykvbGlibmRzL2luY2x1ZGUgLUlpbmNsdWRlCisKK0NYWEZMQUdTICs9ICQoQ0ZMQUdTKQorCithbGw6ICQoREVWS0lUUFJPKS9saWJuZHMvbGliL2xpYlNETC5hICAgICAgIAorCisKKyQoREVWS0lUUFJPKS9saWJuZHMvbGliL2xpYlNETC5hOgkJJChPQkpTKQorCSQoQVIpICRAICQoT0JKUykKKwktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpID4vZGV2L251bGwgMj4mMSAJCisKK2NsZWFuOiAKKwlmaW5kIC4gLW5hbWUgIioubyIgfHhhcmdzIHJtIC1mCisJZmluZCAuIC1uYW1lICIqLmQiIHx4YXJncyBybSAtZgorCS1ybSAtZiAqLmVsZgorCS1ybSAtZiAqLm5kcworCS1ybSAtZiAqLmdiYQorCS1ybSAtZiAqLmFybTkKKwktcm0gLWYgKi5tYXAKKwktcm0gLWYgKi5pbWcKKwktcm0gLVJmICouZAorCisKK3N1YmRpcnM6ICQocGF0c3Vic3QgJSwgX2Rpcl8lLCAkKFNVQkRJUlMpKQorCiskKHBhdHN1YnN0ICUsIF9kaXJfJSwgJChTVUJESVJTKSk6CisJJChNQUtFKSAtQyAkKHBhdHN1YnN0IF9kaXJfJSwgJSwgJEApCisKK2NsZWFuX3N1YmRpcnM6ICQocGF0c3Vic3QgJSwgX2NsZWFuX2Rpcl8lLCAkKFNVQkRJUlMpKQorCiskKHBhdHN1YnN0ICUsIF9jbGVhbl9kaXJfJSwgJChTVUJESVJTKSk6CisJJChNQUtFKSAtQyAkKHBhdHN1YnN0IF9jbGVhbl9kaXJfJSwgJSwgJEApIGNsZWFuCisKKyNpbmNsdWRlICQoREVWS0lUQVJNKS9kc19ydWxlcworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvTWFrZWZpbGUuaW4gYi9kaXN0cmliL3NkbC0xLjIuMTUvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1MTAzNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE3OCBAQAorIyBNYWtlZmlsZSB0byBidWlsZCBhbmQgaW5zdGFsbCB0aGUgU0RMIGxpYnJhcnkKKwordG9wX2J1aWxkZGlyID0gLgorc3JjZGlyICA9IEBzcmNkaXJACitvYmplY3RzID0gYnVpbGQKK2RlcGVuZAk9IGJ1aWxkLWRlcHMKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2JpbmRpcgk9IEBiaW5kaXJACitsaWJkaXIgID0gQGxpYmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZGF0YWRpcgk9IEBkYXRhZGlyQAorbWFuZGlyCT0gQG1hbmRpckAKK2F1eGRpcgk9IEBhY19hdXhfZGlyQAorZGlzdHBhdGggPSAkKHNyY2RpcikvLi4KK2Rpc3RkaXIgPSBTREwtQFNETF9WRVJTSU9OQAorZGlzdGZpbGUgPSAkKGRpc3RkaXIpLnRhci5negorCitAU0VUX01BS0VACitTSEVMTAk9IEBTSEVMTEAKK0NDICAgICAgPSBAQ0NACitJTkNMVURFID0gQElOQ0xVREVACitDRkxBR1MgID0gQEJVSUxEX0NGTEFHU0AKK0VYVFJBX0NGTEFHUyA9IEBFWFRSQV9DRkxBR1NACitMREZMQUdTID0gQEJVSUxEX0xERkxBR1NACitFWFRSQV9MREZMQUdTID0gQEVYVFJBX0xERkxBR1NACitMSUJUT09MID0gQExJQlRPT0xACitJTlNUQUxMID0gQElOU1RBTExACitOQVNNCT0gQE5BU01AIEBOQVNNRkxBR1NACitBUgk9IEBBUkAKK1JBTkxJQgk9IEBSQU5MSUJACitXSU5EUkVTCT0gQFdJTkRSRVNACisKK1RBUkdFVCAgPSBsaWJTREwubGEKK1NPVVJDRVMgPSBAU09VUkNFU0AKK09CSkVDVFMgPSBAT0JKRUNUU0AKKworU0RMTUFJTl9UQVJHRVQgPSBsaWJTRExtYWluLmxhCitTRExNQUlOX1NPVVJDRVMgPSBAU0RMTUFJTl9TT1VSQ0VTQAorU0RMTUFJTl9PQkpFQ1RTID0gQFNETE1BSU5fT0JKRUNUU0AKK1NETE1BSU5fTERGTEFHUyA9IEBTRExNQUlOX0xERkxBR1NACisKK0RJU1QgPSBhY2luY2x1ZGUgYXV0b2dlbi5zaCBCb3JsYW5kLmh0bWwgQm9ybGFuZC56aXAgQlVHUyBidWlsZC1zY3JpcHRzIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gQ09QWUlORyBDUkVESVRTIENXcHJvamVjdHMuc2VhLmJpbiBkb2NzIGRvY3MuaHRtbCBpbmNsdWRlIElOU1RBTEwgTWFrZWZpbGUuZGMgTWFrZWZpbGUubWluaW1hbCBNYWtlZmlsZS5pbiBNUFdtYWtlLnNlYS5iaW4gUkVBRE1FKiBzZGwtY29uZmlnLmluIHNkbC5tNCBzZGwucGMuaW4gU0RMLnFwZy5pbiBTREwuc3BlYyBTREwuc3BlYy5pbiBzcmMgdGVzdCBUT0RPIFZpc3VhbENFIFZpc3VhbEMuaHRtbCBWaXN1YWxDIFdhdGNvbS1PUzIuemlwIFdhdGNvbS1XaW4zMi56aXAgc3ltYmlhbi56aXAgV2hhdHNOZXcgWGNvZGUKKworSERSUyA9IFNETC5oIFNETF9hY3RpdmUuaCBTRExfYXVkaW8uaCBTRExfYnl0ZW9yZGVyLmggU0RMX2Nkcm9tLmggU0RMX2NwdWluZm8uaCBTRExfZW5kaWFuLmggU0RMX2Vycm9yLmggU0RMX2V2ZW50cy5oIFNETF9nZXRlbnYuaCBTRExfam95c3RpY2suaCBTRExfa2V5Ym9hcmQuaCBTRExfa2V5c3ltLmggU0RMX2xvYWRzby5oIFNETF9tYWluLmggU0RMX21vdXNlLmggU0RMX211dGV4LmggU0RMX25hbWUuaCBTRExfb3BlbmdsLmggU0RMX3BsYXRmb3JtLmggU0RMX3F1aXQuaCBTRExfcndvcHMuaCBTRExfc3RkaW5jLmggU0RMX3N5c3dtLmggU0RMX3RocmVhZC5oIFNETF90aW1lci5oIFNETF90eXBlcy5oIFNETF92ZXJzaW9uLmggU0RMX3ZpZGVvLmggYmVnaW5fY29kZS5oIGNsb3NlX2NvZGUuaAorCitMVF9BR0UgICAgICA9IEBMVF9BR0VACitMVF9DVVJSRU5UICA9IEBMVF9DVVJSRU5UQAorTFRfUkVMRUFTRSAgPSBATFRfUkVMRUFTRUAKK0xUX1JFVklTSU9OID0gQExUX1JFVklTSU9OQAorTFRfTERGTEFHUyAgPSAtbm8tdW5kZWZpbmVkIC1ycGF0aCAkKERFU1RESVIpJChsaWJkaXIpIC1yZWxlYXNlICQoTFRfUkVMRUFTRSkgLXZlcnNpb24taW5mbyAkKExUX0NVUlJFTlQpOiQoTFRfUkVWSVNJT04pOiQoTFRfQUdFKQorCithbGw6ICQoc3JjZGlyKS9jb25maWd1cmUgTWFrZWZpbGUgJChvYmplY3RzKSAkKG9iamVjdHMpLyQoVEFSR0VUKSAkKG9iamVjdHMpLyQoU0RMTUFJTl9UQVJHRVQpCisKKyQoc3JjZGlyKS9jb25maWd1cmU6ICQoc3JjZGlyKS9jb25maWd1cmUuaW4KKwlAZWNobyAiV2FybmluZywgY29uZmlndXJlLmluIGlzIG91dCBvZiBkYXRlIgorCSMoY2QgJChzcmNkaXIpICYmIHNoIGF1dG9nZW4uc2ggJiYgc2ggY29uZmlndXJlKQorCUBzbGVlcCAzCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KKwkkKFNIRUxMKSBjb25maWcuc3RhdHVzICRACisKKyQob2JqZWN0cyk6CisJJChTSEVMTCkgJChhdXhkaXIpL21raW5zdGFsbGRpcnMgJEAKKworLlBIT05ZOiBhbGwgZGVwZW5kIGluc3RhbGwgaW5zdGFsbC1iaW4gaW5zdGFsbC1oZHJzIGluc3RhbGwtbGliIGluc3RhbGwtZGF0YSBpbnN0YWxsLW1hbiB1bmluc3RhbGwgdW5pbnN0YWxsLWJpbiB1bmluc3RhbGwtaGRycyB1bmluc3RhbGwtbGliIHVuaW5zdGFsbC1kYXRhIHVuaW5zdGFsbC1tYW4gY2xlYW4gZGlzdGNsZWFuIGRpc3QKK2RlcGVuZDoKKwlAU09VUkNFUz0iJChTT1VSQ0VTKSAkKFNETE1BSU5fU09VUkNFUykiIElOQ0xVREU9IiQoSU5DTFVERSkiIG91dHB1dD0iJChkZXBlbmQpIiBcCisJJChTSEVMTCkgJChhdXhkaXIpL21ha2VkZXAuc2gKKworaW5jbHVkZSAkKGRlcGVuZCkKKworJChvYmplY3RzKS8kKFRBUkdFVCk6ICQoT0JKRUNUUykKKwkkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpIC1vICRAICReICQoTERGTEFHUykgJChFWFRSQV9MREZMQUdTKSAkKExUX0xERkxBR1MpCisKKyQob2JqZWN0cykvJChTRExNQUlOX1RBUkdFVCk6ICQoU0RMTUFJTl9PQkpFQ1RTKQorCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQykgLW8gJEAgJF4gJChMREZMQUdTKSAkKEVYVFJBX0xERkxBR1MpICQoTFRfTERGTEFHUykgJChTRExNQUlOX0xERkxBR1MpCisKKworaW5zdGFsbDogYWxsIGluc3RhbGwtYmluIGluc3RhbGwtaGRycyBpbnN0YWxsLWxpYiBpbnN0YWxsLWRhdGEgaW5zdGFsbC1tYW4KK2luc3RhbGwtYmluOgorCSQoU0hFTEwpICQoYXV4ZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKGJpbmRpcikKKwkkKElOU1RBTEwpIC1tIDc1NSBzZGwtY29uZmlnICQoREVTVERJUikkKGJpbmRpcikvc2RsLWNvbmZpZworaW5zdGFsbC1oZHJzOgorCSQoU0hFTEwpICQoYXV4ZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKGluY2x1ZGVkaXIpL1NETAorCWZvciBmaWxlIGluICQoSERSUyk7IGRvIFwKKwkgICAgJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL2luY2x1ZGUvJCRmaWxlICQoREVTVERJUikkKGluY2x1ZGVkaXIpL1NETC8kJGZpbGU7IFwKKwlkb25lCisJJChJTlNUQUxMKSAtbSA2NDQgaW5jbHVkZS9TRExfY29uZmlnLmggJChERVNURElSKSQoaW5jbHVkZWRpcikvU0RML1NETF9jb25maWcuaAoraW5zdGFsbC1saWI6ICQob2JqZWN0cykgJChvYmplY3RzKS8kKFRBUkdFVCkgJChvYmplY3RzKS8kKFNETE1BSU5fVEFSR0VUKQorCSQoU0hFTEwpICQoYXV4ZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKGxpYmRpcikKKwkkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChvYmplY3RzKS8kKFRBUkdFVCkgJChERVNURElSKSQobGliZGlyKS8kKFRBUkdFVCkKKwkkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChvYmplY3RzKS8kKFNETE1BSU5fVEFSR0VUKSAkKERFU1RESVIpJChsaWJkaXIpLyQoU0RMTUFJTl9UQVJHRVQpCitpbnN0YWxsLWRhdGE6CisJJChTSEVMTCkgJChhdXhkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQoZGF0YWRpcikvYWNsb2NhbAorCSQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS9zZGwubTQgJChERVNURElSKSQoZGF0YWRpcikvYWNsb2NhbC9zZGwubTQKKwkkKFNIRUxMKSAkKGF1eGRpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChsaWJkaXIpL3BrZ2NvbmZpZworCSQoSU5TVEFMTCkgLW0gNjQ0IHNkbC5wYyAkKERFU1RESVIpJChsaWJkaXIpL3BrZ2NvbmZpZworaW5zdGFsbC1tYW46CisJJChTSEVMTCkgJChhdXhkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQobWFuZGlyKS9tYW4zCisJZm9yIHNyYyBpbiAkKHNyY2RpcikvZG9jcy9tYW4zLyouMzsgZG8gXAorCSAgICBmaWxlPWBlY2hvICQkc3JjIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCisJICAgICQoSU5TVEFMTCkgLW0gNjQ0ICQkc3JjICQoREVTVERJUikkKG1hbmRpcikvbWFuMy8kJGZpbGU7IFwKKwlkb25lCisKK3VuaW5zdGFsbDogdW5pbnN0YWxsLWJpbiB1bmluc3RhbGwtaGRycyB1bmluc3RhbGwtbGliIHVuaW5zdGFsbC1kYXRhIHVuaW5zdGFsbC1tYW4KK3VuaW5zdGFsbC1iaW46CisJcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9zZGwtY29uZmlnCit1bmluc3RhbGwtaGRyczoKKwlmb3IgZmlsZSBpbiAkKEhEUlMpOyBkbyBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGluY2x1ZGVkaXIpL1NETC8kJGZpbGU7IFwKKwlkb25lCisJcm0gLWYgJChERVNURElSKSQoaW5jbHVkZWRpcikvU0RML1NETF9jb25maWcuaAorCS1ybWRpciAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9TREwKK3VuaW5zdGFsbC1saWI6CisJJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJChUQVJHRVQpCisJJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJChTRExNQUlOX1RBUkdFVCkKK3VuaW5zdGFsbC1kYXRhOgorCXJtIC1mICQoREVTVERJUikkKGRhdGFkaXIpL2FjbG9jYWwvc2RsLm00CisJcm0gLWYgJChERVNURElSKSQobGliZGlyKS9wa2djb25maWcvc2RsLnBjCit1bmluc3RhbGwtbWFuOgorCWZvciBzcmMgaW4gJChzcmNkaXIpL2RvY3MvbWFuMy8qLjM7IGRvIFwKKwkgICAgZmlsZT1gZWNobyAkJHNyYyB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAorCSAgICBybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvJCRmaWxlOyBcCisJZG9uZQorCitjbGVhbjoKKwlybSAtcmYgJChvYmplY3RzKQorCWlmIHRlc3QgLWYgdGVzdC9NYWtlZmlsZTsgdGhlbiAoY2QgdGVzdDsgJChNQUtFKSAkQCk7IGZpCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBNYWtlZmlsZSBpbmNsdWRlL1NETF9jb25maWcuaCBzZGwtY29uZmlnCisJcm0gLWYgU0RMLnFwZworCXJtIC1mIGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgbGlidG9vbCAkKGRlcGVuZCkKKwlybSAtcmYgJChzcmNkaXIpL2F1dG9tNHRlKgorCXJtIC1yZiAkKHNyY2RpcikvdGVzdC9hdXRvbTR0ZSoKKwlmaW5kICQoc3JjZGlyKSBcKCBcCisJICAgIC1uYW1lICcqficgLW8gXAorCSAgICAtbmFtZSAnKi5iYWsnIC1vIFwKKwkgICAgLW5hbWUgJyoub2xkJyAtbyBcCisJICAgIC1uYW1lICcqLnJlaicgLW8gXAorCSAgICAtbmFtZSAnKi5vcmlnJyAtbyBcCisJICAgIC1uYW1lICcuIyonIFwpIFwKKwkgICAgLWV4ZWMgcm0gLWYge30gXDsKKwljcCAkKHNyY2RpcikvaW5jbHVkZS9TRExfY29uZmlnLmguZGVmYXVsdCAkKHNyY2RpcikvaW5jbHVkZS9TRExfY29uZmlnLmgKKwlpZiB0ZXN0IC1mIHRlc3QvTWFrZWZpbGU7IHRoZW4gKGNkIHRlc3Q7ICQoTUFLRSkgJEApOyBmaQorCitkaXN0ICQoZGlzdGZpbGUpOgorCSQoU0hFTEwpICQoYXV4ZGlyKS9ta2luc3RhbGxkaXJzICQoZGlzdGRpcikKKwl0YXIgY2YgLSAkKERJU1QpIHwgKGNkICQoZGlzdGRpcik7IHRhciB4ZiAtKQorCWNwICQoZGlzdGRpcikvaW5jbHVkZS9TRExfY29uZmlnLmguZGVmYXVsdCAkKGRpc3RkaXIpL2luY2x1ZGUvU0RMX2NvbmZpZy5oCisJcm0gLXJmIGBmaW5kICQoZGlzdGRpcikgLW5hbWUgLnN2bmAKKwlybSAtcmYgJChkaXN0ZGlyKS90ZXN0L2F1dG9tNHRlKgorCWZpbmQgJChkaXN0ZGlyKSBcKCBcCisJICAgIC1uYW1lICcqficgLW8gXAorCSAgICAtbmFtZSAnKi5iYWsnIC1vIFwKKwkgICAgLW5hbWUgJyoub2xkJyAtbyBcCisJICAgIC1uYW1lICcqLnJlaicgLW8gXAorCSAgICAtbmFtZSAnKi5vcmlnJyAtbyBcCisJICAgIC1uYW1lICcuIyonIFwpIFwKKwkgICAgLWV4ZWMgcm0gLWYge30gXDsKKwlpZiB0ZXN0IC1mICQoZGlzdGRpcikvdGVzdC9NYWtlZmlsZTsgdGhlbiAoY2QgJChkaXN0ZGlyKS90ZXN0ICYmIG1ha2UgZGlzdGNsZWFuKTsgZmkKKwl0YXIgY3ZmIC0gJChkaXN0ZGlyKSB8IGd6aXAgLS1iZXN0ID4kKGRpc3RmaWxlKQorCXJtIC1yZiAkKGRpc3RkaXIpCisKK3JwbTogJChkaXN0ZmlsZSkKKwlycG1idWlsZCAtdGEgJD8KKworIyBDcmVhdGUgYSBTVk4gc25hcHNob3QgdGhhdCBwZW9wbGUgY2FuIHJ1biB1cGRhdGUgb24KK3NuYXBzaG90OgorCXN2biBjbyBodHRwOi8vc3ZuLmxpYnNkbC5vcmcvYnJhbmNoZXMvU0RMLTEuMgorCShjZCBTREwtMS4yICYmIC4vYXV0b2dlbi5zaCAmJiBybSAtcmYgYXV0b200dGUuY2FjaGUpCisJY3AgU0RMLTEuMi9pbmNsdWRlL1NETF9jb25maWcuaC5kZWZhdWx0IFNETC0xLjIvaW5jbHVkZS9TRExfY29uZmlnLmgKKwl0YXIgemNmICQoSE9NRSkvU0RMLTEuMi50YXIuZ3ogU0RMLTEuMgorCXJtIC1mICQoSE9NRSkvU0RMLTEuMi56aXAKKwl6aXAgLXIgJChIT01FKS9TREwtMS4yLnppcCBTREwtMS4yCisJcm0gLXJmIFNETC0xLjIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9NYWtlZmlsZS5taW5pbWFsIGIvZGlzdHJpYi9zZGwtMS4yLjE1L01ha2VmaWxlLm1pbmltYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NjIxYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9NYWtlZmlsZS5taW5pbWFsCkBAIC0wLDAgKzEsNDIgQEAKKyMgTWFrZWZpbGUgdG8gYnVpbGQgdGhlIFNETCBsaWJyYXJ5CisKK0lOQ0xVREUgPSAtSS4vaW5jbHVkZQorQ0ZMQUdTICA9IC1nIC1PMiAkKElOQ0xVREUpCitBUgk9IGFyCitSQU5MSUIJPSByYW5saWIKKworQ09ORklHX0ggPSBpbmNsdWRlL1NETF9jb25maWcuaAorVEFSR0VUICA9IGxpYlNETC5hCitTT1VSQ0VTID0gXAorCXNyYy8qLmMgXAorCXNyYy9hdWRpby8qLmMgXAorCXNyYy9jZHJvbS8qLmMgXAorCXNyYy9jcHVpbmZvLyouYyBcCisJc3JjL2V2ZW50cy8qLmMgXAorCXNyYy9maWxlLyouYyBcCisJc3JjL2pveXN0aWNrLyouYyBcCisJc3JjL3N0ZGxpYi8qLmMgXAorCXNyYy90aHJlYWQvKi5jIFwKKwlzcmMvdGltZXIvKi5jIFwKKwlzcmMvdmlkZW8vKi5jIFwKKwlzcmMvYXVkaW8vZHVtbXkvKi5jIFwKKwlzcmMvdmlkZW8vZHVtbXkvKi5jIFwKKwlzcmMvam95c3RpY2svZHVtbXkvKi5jIFwKKwlzcmMvY2Ryb20vZHVtbXkvKi5jIFwKKwlzcmMvdGhyZWFkL2dlbmVyaWMvKi5jIFwKKwlzcmMvdGltZXIvZHVtbXkvKi5jIFwKKwlzcmMvbG9hZHNvL2R1bW15LyouYyBcCisKK09CSkVDVFMgPSAkKHNoZWxsIGVjaG8gJChTT1VSQ0VTKSB8IHNlZCAtZSAncyxcLmMsXC5vLGcnKQorCithbGw6ICQoVEFSR0VUKQorCiskKFRBUkdFVCk6ICQoQ09ORklHX0gpICQoT0JKRUNUUykKKwkkKEFSKSBjcnYgJEAgJF4KKwkkKFJBTkxJQikgJEAKKworJChDT05GSUdfSCk6CisJY3AgJChDT05GSUdfSCkuZGVmYXVsdCAkKENPTkZJR19IKQorCitjbGVhbjoKKwlybSAtZiAkKFRBUkdFVCkgJChPQkpFQ1RTKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL1JFQURNRSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9SRUFETUUKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUtU0RMLnR4dCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUtU0RMLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDM2Y2E5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS1TREwudHh0CkBAIC0wLDAgKzEsMTMgQEAKKworUGxlYXNlIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHdpdGggdGhlIFNETCBydW50aW1lIGVudmlyb25tZW50OgorCitUaGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIChTREwgZm9yIHNob3J0KSBpcyBhIGNyb3NzLXBsYXRmcm9tIGxpYnJhcnkKK2Rlc2lnbmVkIHRvIG1ha2UgaXQgZWFzeSB0byB3cml0ZSBtdWx0aS1tZWRpYSBzb2Z0d2FyZSwgc3VjaCBhcyBnYW1lcyBhbmQKK2VtdWxhdG9ycy4KKworVGhlIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciBsaWJyYXJ5IHNvdXJjZSBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tOgoraHR0cDovL3d3dy5saWJzZGwub3JnLworCitUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCBsaWNlbnNlOgoraHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuQU5EUk9JRCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuQU5EUk9JRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRmZWUyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5BTkRST0lECkBAIC0wLDAgKzEsOSBAQAorVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgU0RMIDEuMi4xNSB0aGF0IGlzIHVzZWQgYnkgdGhlIEFuZHJvaWQgUUVNVQorZW11bGF0b3IuIFNlZSB0aGUgZ2l0IGhpc3RvcnkgZm9yIG1vZGlmaWNhdGlvbnMgcmVsYXRpdmUgdG8gdXBzdHJlYW0uCisKK1RvIGJ1aWxkIGl0IGFzIGEgc3RhdGljIGxpYnJhcnkgb24gTGludXgsIE9TIFggYW5kIFdpbmRvd3M6CisKKy4vYW5kcm9pZC1jb25maWd1cmUuc2ggIFstLXByZWZpeD08cGF0aD5dCittYWtlIC1qMgorbWFrZSBpbnN0YWxsCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuQW1pZ2FPUyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuQW1pZ2FPUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQ4OTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5BbWlnYU9TCkBAIC0wLDAgKzEsMTIgQEAKK1RoZSBBbWlnYU9TIGNvZGUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIFNETCwgc2luY2UgaXQgaGFkIGJlZW4gYnJva2VuIGZvciBhCisgbG9uZyB0aW1lIGFuZCBoYWQgYSBmZXcgYml0cyBvZiBmYWlybHkgaW52YXNpdmUgY29kZSAjaWZkZWYnZCBpbnRvIHRoZQorIFNETCBjb3JlLgorCitIb3dldmVyLCB0aGVyZSBpcyBhbiBPUzQgdmVyc2lvbiBvZiBTREwgaGVyZToKKyAgIGh0dHA6Ly93d3cucmNkcnVtbW9uZC5uZXQvYW1pZ2EvaW5kZXguaHRtbAorCitBbmQgYSBNb3JwaE9TIHZlcnNpb24gaGVyZToKKyAgIGh0dHA6Ly93d3cubGVodG9yYW50YS5uZXQvcG93ZXJzZGwvCisKKy0tcnlhbi4KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5CZU9TIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5CZU9TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGNjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLkJlT1MKQEAgLTAsMCArMSwxMyBAQAorCitTREwgb24gQmVPUyBSNQorPT09PT09PT09PT09PT0KKworWW91IGNhbiBidWlsZCBTREwgb24gQmVPUyBsaWtlIGFueSBvdGhlciBHTlUgc3R5bGUgcGFja2FnZS4KK2UuZy4gLi9jb25maWd1cmUgJiYgbWFrZSAmJiBtYWtlIGluc3RhbGwKK0J5IGRlZmF1bHQgaXQgaXMgaW5zdGFsbGVkIGluIC9ib290L2RldmVsb3AvdG9vbHMvZ251cHJvL3tiaW4sbGliLGV0Yy59CisKK09uY2UgeW91IGluc3RhbGwgU0RMLCB5b3UgbmVlZCB0byBjb3B5IGxpYlNETC5zbyB0byAvYm9vdC9ob21lL2NvbmZpZy9saWIsCitzbyBpdCBjYW4gYmUgZm91bmQgYnkgdGhlIGR5bmFtaWMgbGlua2VyLgorCitFbmpveSEKKwlTYW0gTGFudGluZ2EJCQkJKHNsb3VrZW5AbGlic2RsLm9yZykKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuREMgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLkRDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZmIxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLkRDCkBAIC0wLDAgKzEsMzIgQEAKK1NETCBmb3IgRHJlYW1jYXN0IChiZXRhMikKKworCUJFUk8KKwliZXJvYmVyb0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQgCisKKwlodHRwOi8vd3d3Lmdlb2NpdGllcy5jby5qcC9QbGF5dG93bi8yMDA0LworCit0aGlzIHdvcmsgd2l0aCBrb3MtbmV3bGliCitodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2RjcXVha2UvCisKK2NvbXBpbGUKKy0gc291cmNlIGVudmlyb24uc2ggKGZyb20gdGhlIEtPUyBkaXN0cmlidXRpb24pCistIG1ha2UgLWYgTWFrZWZpbGUuZGMKKworY29tcGlsZSB3aXRoIGdsIHN1cHBvcnQKKy0gaW5zdGFsbCBsYXRlc3QgbGliZ2wgZnJvbSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2RjcXVha2UvCistIHVuY29tbWVudCBHTD0xIGluIE1ha2VmaWxlLmRjCistIG1ha2UgLWYgTWFrZWZpbGUuZGMgY2xlYW4KKy0gbWFrZSAtZiBNYWtlZmlsZS5kYworCitpbnN0YWxsCistIGNvcHkgaW5jbHVkZS8qLmggYW5kIGxpYlNETC5hIG9yIGxpYlNETF9nbC5hIGZvciB5b3VyIGVudmlyb21lbnQKKworY2hhbmdlbG9nOgorCitiZXRhMgorLSBPcGVuR0wgc3VwcG9ydAorLSBIYXJkd2FyZSBwYWdlIGZsaXAgc3VwcG9ydAorCitiZXRhCistIHRocmVhZCwgdGltZXIgZG9uJ3QgdGVzdGVkIHNvIG11Y2guCistIG5vdCBzdXBwb3J0IE9wZW5HTApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5IRyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuSEcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiZWUwZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuSEcKQEAgLTAsMCArMSwyMyBAQAorCitUaGUgbGF0ZXN0IGRldmVsb3BtZW50IHZlcnNpb24gb2YgU0RMIGlzIGF2YWlsYWJsZSB2aWEgTWVyY3VyaWFsLgorTWVyY3VyaWFsIGFsbG93cyB5b3UgdG8gZ2V0IHVwLXRvLXRoZS1taW51dGUgZml4ZXMgYW5kIGVuaGFuY2VtZW50czsKK2FzIGEgZGV2ZWxvcGVyIHdvcmtzIG9uIGEgc291cmNlIHRyZWUsIHlvdSBjYW4gdXNlICJoZyIgdG8gbWlycm9yIHRoYXQKK3NvdXJjZSB0cmVlIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgYW4gb2ZmaWNpYWwgcmVsZWFzZS4gUGxlYXNlIGxvb2sKK2F0IHRoZSBNZXJjdXJpYWwgd2Vic2l0ZSAoIGh0dHA6Ly9tZXJjdXJpYWwuc2VsZW5pYy5jb20vICkgZm9yIG1vcmUKK2luZm9ybWF0aW9uIG9uIHVzaW5nIGhnLCB3aGVyZSB5b3UgY2FuIGFsc28gZG93bmxvYWQgc29mdHdhcmUgZm9yCitNYWMgT1MgWCwgV2luZG93cywgYW5kIFVuaXggc3lzdGVtcy4KKworICBoZyBjbG9uZSAtdSBTREwtMS4yIGh0dHA6Ly9oZy5saWJzZGwub3JnL1NETAorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIFNETCB3aXRoIGFuIElERSwgeW91IHdpbGwgbmVlZCB0byBjb3B5IHRoZSBmaWxlCitpbmNsdWRlL1NETF9jb25maWcuaC5kZWZhdWx0IHRvIGluY2x1ZGUvU0RMX2NvbmZpZy5oIGJlZm9yZSBidWlsZGluZy4KKworSWYgeW91IGFyZSBidWlsZGluZyBTREwgdmlhIGNvbmZpZ3VyZSwgeW91IHdpbGwgbmVlZCB0byBydW4gYXV0b2dlbi5zaAorYmVmb3JlIHJ1bm5pbmcgY29uZmlndXJlLgorCitUaGVyZSBpcyBhIHdlYiBpbnRlcmZhY2UgdG8gdGhlIHN1YnZlcnNpb24gcmVwb3NpdG9yeSBhdDoKKwlodHRwOi8vaGcubGlic2RsLm9yZy9TREwvCisKK1RoZXJlIGlzIGFuIFJTUyBmZWVkIGF2YWlsYWJsZSBhdCB0aGF0IFVSTCwgZm9yIHRob3NlIHRoYXQgd2FudCB0bwordHJhY2sgY29tbWl0cyBpbiByZWFsIHRpbWUuCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuTWFjT1MgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLk1hY09TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZmQ5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLk1hY09TCkBAIC0wLDAgKzEsNjMgQEAKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitVc2luZyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIHdpdGggTWFjT1MgNyw4LDkgb24gUFBDCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBmb3IgcGVvcGxlIHVzaW5nIHRoZSBBcHBsZSBNUFcgZW52aXJvbm1lbnQ6CitodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9tcHctdG9vbHMvCisKK0NvZGVXYXJyaW9yIHByb2plY3RzIGFyZSBhdmFpbGFibGUgaW4gdGhlIENXcHJvamVjdHMgZGlyZWN0b3J5LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0kuICBCdWlsZGluZyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIGxpYnJhcmllczoKKyAgICAoVGhpcyBzdGVwIGlzbid0IG5lY2Vzc2FyeSBpZiB5b3UgaGF2ZSB0aGUgU0RMIGJpbmFyeSBkaXN0cmlidXRpb24pCisKKyAgRmlyc3QsIHVucGFjayB0aGUgTVBXbWFrZS5zZWEuaHF4IGFyY2hpdmUgYW5kIG1vdmUgU0RMLm1ha2UgaW50byB0aGUKKyAgU0RMIGRpcmVjdG9yeS4KKworICBTdGFydCBNUFcKKworICBTZXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpdGhpbiBNUFcgdG8gdGhlIFNETCB0b3BsZXZlbCBkaXJlY3RvcnkuCisKKyAgQnVpbGQgIlNETCIgIChUeXBlIENvbW1hbmQtQiBhbmQgZW50ZXIgIlNETCIgaW4gdGhlIGRpYWxvZykKKworICBJZiBldmVyeXRoaW5nIGNvbXBpbGVzIHN1Y2Nlc3NmdWxseSwgeW91IG5vdyBoYXZlIHRoZSBQUEMgbGlicmFyaWVzCisgICJTREwiIGFuZCAiU0RMbWFpbi5vIiBpbiB0aGUgJ2xpYicgc3ViZGlyZWN0b3J5LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lJLiBCdWlsZGluZyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIHRlc3QgcHJvZ3JhbXM6CisKKyAgRmlyc3QsIHVucGFjayB0aGUgTVBXbWFrZS5zZWEuaHF4IGFyY2hpdmUsIG1vdmUgdGhlIG5ldyByc3JjIGRpcmVjdG9yeSB0bworICB0aGUgbWFpbiBTREwgZGlyZWN0b3J5LCBhbmQgbW92ZSB0aGUgbWFrZWZpbGVzIGluIHRoZSBuZXcgdGVzdCBzdWJkaXJlY3RvcnkKKyAgdG8gdGhlIFNETCAndGVzdCcgc3ViZGlyZWN0b3J5LgorCisgIFN0YXJ0IE1QVworCisgIFNldCB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2l0aGluIE1QVyB0byB0aGUgU0RMICd0ZXN0JyBzdWJkaXJlY3RvcnkuCisKKyAgQnVpbGQgdGhlIHByb2dyYW1zIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIE1QVyBtYWtlZmlsZSAoZmlsZSBlbmRpbmcKKyAgd2l0aCAubWFrZSksIGluY2x1ZGluZyAidGVzdHdpbiIsICJ0ZXN0YWxwaGEiLCBhbmQgImdyYXl3aW4iLgorCisgIENvcHkgdGhlIFNETCBsaWJyYXJ5IGZpbGUgaW50byB0aGUgdGVzdCBkaXJlY3RvcnksIGFuZCBydW4hCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSUlJLiBCdWlsZGluZyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIGRlbW8gcHJvZ3JhbXM6CisKKyAgQ29weSBvbmUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBNYWtlZmlsZXMgdG8gdGhlIGRlbW8gZGlyZWN0b3J5CisgIGFuZCBtb2RpZnkgaXQgdG8gbWF0Y2ggdGhlIHNvdXJjZXMgaW4gdGhlIGRlbW8uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSVYuICBFbmpveSEgOikKKworICBJZiB5b3UgaGF2ZSBhIHByb2plY3QgeW91J2QgbGlrZSBtZSB0byBrbm93IGFib3V0LCBvciB3YW50IHRvIGFzayBxdWVzdGlvbnMsCisgIGdvIGFoZWFkIGFuZCBqb2luIHRoZSBTREwgZGV2ZWxvcGVyJ3MgbWFpbGluZyBsaXN0IGJ5IHNlbmRpbmcgZS1tYWlsIHRvOgorCisJc2RsLXJlcXVlc3RAbGlic2RsLm9yZworCisgIGFuZCBwdXQgInN1YnNjcmliZSIgaW50byB0aGUgc3ViamVjdCBvZiB0aGUgbWVzc2FnZS4gT3IgYWx0ZXJuYXRpdmVseSB5b3UKKyAgY2FuIHVzZSB0aGUgd2ViIGludGVyZmFjZToKKworCWh0dHA6Ly93d3cubGlic2RsLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3NkbAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLk1hY09TWCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuTWFjT1NYCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTlmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLk1hY09TWApAQCAtMCwwICsxLDE3OSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitVc2luZyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIHdpdGggTWFjIE9TIFgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGZvciBwZW9wbGUgdXNpbmcgQXBwbGUncyBNYWMgT1MgWCAocHJvbm91bmNlZAorInRlbiIpLgorCitGcm9tIHRoZSBkZXZlbG9wZXIncyBwb2ludCBvZiB2aWV3LCBPUyBYIGlzIGEgc29ydCBvZiBoeWJyaWQgTWFjIGFuZAorVW5peCBzeXN0ZW0sIGFuZCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIGVpdGhlciB0cmFkaXRpb25hbAorY29tbWFuZCBsaW5lIHRvb2xzIG9yIEFwcGxlJ3MgSURFIFhjb2RlLgorCitUbyBidWlsZCBTREwgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSwgdXNlIHRoZSBzdGFuZGFyZCBjb25maWd1cmUgYW5kIG1ha2UKK3Byb2Nlc3M6CisKKwkuL2NvbmZpZ3VyZQorCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCitZb3UgY2FuIGFsc28gYnVpbGQgU0RMIGFzIGEgVW5pdmVyc2FsIGxpYnJhcnkgKGEgc2luZ2xlIGJpbmFyeSBmb3IgYm90aAorUG93ZXJQQyBhbmQgSW50ZWwgYXJjaGl0ZWN0dXJlcyksIG9uIE1hYyBPUyBYIDEwLjQgYW5kIG5ld2VyLCBieSB1c2luZwordGhlIGZhdGJ1aWxkLnNoIHNjcmlwdCBpbiBidWlsZC1zY3JpcHRzOgorCXNoIGJ1aWxkLXNjcmlwdHMvZmF0YnVpbGQuc2gKKwlzdWRvIGJ1aWxkLXNjcmlwdHMvZmF0YnVpbGQuc2ggaW5zdGFsbAorVGhpcyBzY3JpcHQgYnVpbGRzIFNETCB3aXRoIDEwLjIgQUJJIGNvbXBhdGliaWxpdHkgb24gUG93ZXJQQyBhbmQgMTAuNAorQUJJIGNvbXBhdGliaWxpdHkgb24gSW50ZWwgYXJjaGl0ZWN0dXJlcy4gIEZvciBiZXN0IGNvbXBhdGliaWxpdHkgeW91CitzaG91bGQgY29tcGlsZSB5b3VyIGFwcGxpY2F0aW9uIHRoZSBzYW1lIHdheS4gIEEgc2NyaXB0IHdoaWNoIHdyYXBzCitnY2MgdG8gbWFrZSB0aGlzIGVhc3kgaXMgcHJvdmlkZWQgaW4gdGVzdC9nY2MtZmF0LnNoCisKK1RvIHVzZSB0aGUgbGlicmFyeSBvbmNlIGl0J3MgYnVpbHQsIHlvdSBlc3NlbnRpYWwgaGF2ZSB0d28gcG9zc2liaWxpdGllczoKK3VzZSB0aGUgdHJhZGl0aW9uYWwgYXV0b2NvbmYvYXV0b21ha2UvbWFrZSBtZXRob2QsIG9yIHVzZSBYY29kZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitVc2luZyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIHdpdGggYSB0cmFkaXRpb25hbCBNYWtlZmlsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FuIGV4aXN0aW5nIGF1dG9jb25mL2F1dG9tYWtlIGJ1aWxkIHN5c3RlbSBmb3IgeW91ciBTREwgYXBwIGhhcyBnb29kIGNoYW5jZXMKK3RvIHdvcmsgYWxtb3N0IHVuY2hhbmdlZCBvbiBPUyBYLiBIb3dldmVyLCB0byBwcm9kdWNlIGEgInJlYWwiIE1hYyBPUyBYIGJpbmFyeQordGhhdCB5b3UgY2FuIGRpc3RyaWJ1dGUgdG8gdXNlcnMsIHlvdSBuZWVkIHRvIHB1dCB0aGUgZ2VuZXJhdGVkIGJpbmFyeSBpbnRvIGEKK3NvIGNhbGxlZCAiYnVuZGxlIiwgd2hpY2ggYmFzaWNhbGx5IGlzIGEgZmFuY3kgZm9sZGVyIHdpdGggYSBuYW1lIGxpa2UKKyJNeUNvb2xHYW1lLmFwcCIuCisKK1RvIGdldCB0aGlzIGJ1aWxkIGF1dG9tYXRpY2FsbHksIGFkZCBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIHJ1bGUgdG8KK3lvdXIgTWFrZWZpbGUuYW06CisKK2J1bmRsZV9jb250ZW50cyA9IEFQUF9OQU1FLmFwcC9Db250ZW50cworQVBQX05BTUVfYnVuZGxlOiBFWEVfTkFNRQorCW1rZGlyIC1wICQoYnVuZGxlX2NvbnRlbnRzKS9NYWNPUworCW1rZGlyIC1wICQoYnVuZGxlX2NvbnRlbnRzKS9SZXNvdXJjZXMKKwllY2hvICJBUFBMPz8/PyIgPiAkKGJ1bmRsZV9jb250ZW50cykvUGtnSW5mbworCSQoSU5TVEFMTF9QUk9HUkFNKSAkPCAkKGJ1bmRsZV9jb250ZW50cykvTWFjT1MvCisKK1lvdSBzaG91bGQgcmVwbGFjZSBFWEVfTkFNRSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlLiBBUFBfTkFNRSBpcyB3aGF0Cit3aWxsIGJlIHZpc2libGUgdG8gdGhlIHVzZXIgaW4gdGhlIEZpbmRlci4gVXN1YWxseSBpdCB3aWxsIGJlIHRoZSBzYW1lCithcyBFWEVfTkFNRSBidXQgY2FwaXRhbGl6ZWQuIEUuZy4gaWYgRVhFX05BTUUgaXMgInRlc3RnYW1lIiB0aGVuIEFQUF9OQU1FIAordXN1YWxseSBpcyAiVGVzdEdhbWUiLiBZb3UgbWlnaHQgYWxzbyB3YW50IHRvIHVzZSBAUEFDS0FHRUAgdG8gdXNlIHRoZSBwYWNrYWdlCituYW1lIGFzIHNwZWNpZmllZCBpbiB5b3VyIGNvbmZpZ3VyZS5pbiBmaWxlLgorCitJZiB5b3VyIHByb2plY3QgYnVpbGRzIG1vcmUgdGhhbiBvbmUgYXBwbGljYXRpb24sIHlvdSB3aWxsIGhhdmUgdG8gZG8gYSBiaXQKK21vcmUuICBGb3IgZWFjaCBvZiB5b3VyIHRhcmdldCBhcHBsaWNhdGlvbnMsIHlvdSBuZWVkIGEgc2VwZXJhdGUgcnVsZS4KKworSWYgeW91IHdhbnQgdGhlIGNyZWF0ZWQgYnVuZGxlcyB0byBiZSBpbnN0YWxsZWQsIHlvdSBtYXkgd2FudCB0byBhZGQgdGhpcworcnVsZSB0byB5b3VyIE1ha2VmaWxlLmFtOgorCitpbnN0YWxsLWV4ZWMtaG9vazogQVBQX05BTUVfYnVuZGxlCisJcm0gLXJmICQoREVTVERJUikkKHByZWZpeCkvQXBwbGljYXRpb25zL0FQUF9OQU1FLmFwcAorCW1rZGlyIC1wICQoREVTVERJUikkKHByZWZpeCkvQXBwbGljYXRpb25zLworCWNwIC1yICQ8IC8kKERFU1RESVIpJChwcmVmaXgpQXBwbGljYXRpb25zLworCitUaGlzIHJ1bGUgdGFrZXMgdGhlIEJ1bmRsZSBjcmVhdGVkIGJ5IHRoZSBydWxlIGZyb20gc3RlcCAzIGFuZCBpbnN0YWxscyB0aGVtCitpbnRvICQoREVTVERJUikkKHByZWZpeCkvQXBwbGljYXRpb25zLy4KKworQWdhaW4sIGlmIHlvdSB3YW50IHRvIGluc3RhbGwgbXVsdGlwbGUgYXBwbGljYXRpb25zLCB5b3Ugd2lsbCBoYXZlIHRvIGF1Z21lbnQKK3RoZSBtYWtlIHJ1bGUgYWNjb3JkaW5nbHkuCisKKworQnV0IGJld2FyZSEgVGhhdCBpcyBvbmx5IHBhcnQgb2YgdGhlIHN0b3J5ISBXaXRoIHRoZSBhYm92ZSwgeW91IGVuZCB1cCB3aXRoCithIGJhcmUgYm9uZSAuYXBwIGJ1bmRsZSwgd2hpY2ggaXMgZG91YmxlIGNsaWNrYWJsZSBmcm9tIHRoZSBGaW5kZXIuIEJ1dAordGhlcmUgYXJlIHNvbWUgIG1vcmUgdGhpbmdzIHlvdSBzaG91bGQgZG8gYmVmb3JlIHNoaXBwaW5nIHlvciBwcm9kdWN0Li4uCisKKzEpIFRoZSBidW5kbGUgcmlnaHQgbm93IHByb2JhYmx5IGlzIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IFNETC4gVGhhdCAKKyAgIG1lYW5zIHRoYXQgd2hlbiB5b3UgY29weSBpdCB0byBhbm90aGVyIGNvbXB1dGVyLCAqaXQgd2lsbCBub3QgcnVuKiwKKyAgIHVubGVzcyB5b3UgYWxzbyBpbnN0YWxsIFNETCBvbiB0aGF0IG90aGVyIGNvbXB1dGVyLiBBIGdvb2Qgc29sdXRpb24KKyAgIGZvciB0aGlzIGRpbGVtbWEgaXMgdG8gc3RhdGljIGxpbmsgYWdhaW5zdCBTREwuIE9uIE9TIFgsIHlvdSBjYW4KKyAgIGFjaGlldmUgdGhhdCBieSBsaW5raW5hZyBhZ2FpbnN0IHRoZSBsaWJyYXJpZXMgbGlzdGVkIGJ5CisgICAgIHNkbC1jb25maWcgLS1zdGF0aWMtbGlicworICAgaW5zdGVhZCBvZiB0aG9zZSBsaXN0ZWQgYnkKKyAgICAgc2RsLWNvbmZpZyAtLWxpYnMKKyAgIERlcGVuZGluZyBvbiBob3cgZXhhY3RseSBTREwgaXMgaW50ZWdyYXRlZCBpbnRvIHlvdXIgYnVpbGQgc3lzdGVtcywgdGhlCisgICB3YXkgdG8gYWNoaWV2ZSB0aGF0IHZhcmllcywgc28gSSB3b24ndCBkZXNjcmliZSBpdCBoZXJlIGluIGRldGFpbAorMikgQWRkIGFuICdJbmZvLnBsaXN0JyB0byB5b3VyIGFwcGxpY2F0aW9uLiBUaGF0IGlzIGEgc3BlY2lhbCBYTUwgZmlsZSB3aGljaAorICAgY29udGFpbnMgc29tZSBtZXRhLWluZm9ybWF0aW9uIGFib3V0IHlvdXIgYXBwbGljYXRpb24gKGxpa2Ugc29tZSBjb3B5cmlnaHQKKyAgIGluZm9ybWF0aW9uLCB0aGUgdmVyc2lvbiBvZiB5b3VyIGFwcCwgdGhlIG5hbWUgb2YgYW4gb3B0aW9uYWwgaWNvbiBmaWxlLAorICAgYW5kIG90aGVyIHRoaW5ncykuIFBhcnQgb2YgdGhhdCBpbmZvcm1hdGlvbiBpcyBkaXNwbGF5ZWQgYnkgdGhlIEZpbmRlcgorICAgd2hlbiB5b3UgY2xpY2sgb24gdGhlIC5hcHAsIG9yIGlmIHlvdSBsb29rIGF0IHRoZSAiR2V0IEluZm8iIHdpbmRvdy4KKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgSW5mby5wbGlzdCBmaWxlcyBjYW4gYmUgZm91bmQgb24gQXBwbGUncyBob21lcGFnZS4KKworCitBcyBhIGZpbmFsIHJlbWFyaywgbGV0IG1lIGFkZCB0aGF0IEkgdXNlIHNvbWUgb2YgdGhlIHRlY2huaXF1ZXMgKGFuZCBzb21lCit2YXJpYXRpb25zIG9mIHRoZW0pIGluIEV4dWx0IGFuZCBTY3VtbVZNOyBib3RoIGFyZSBhdmFpbGFibGUgaW4gc291cmNlIG9uCit0aGUgbmV0LCBzbyBmZWVsIGZyZWUgdG8gdGFrZSBhIHBlZWsgYXQgdGhlbSBmb3IgaW5zcGlyYXRpb24hCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitVc2luZyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIHdpdGggWGNvZGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGZvciB1c2luZyBBcHBsZSdzIFhjb2RlIElERSB0byBidWlsZCBTREwgYXBwbGljYXRpb25zLgorCistIEZpcnN0IHN0ZXBzCisKK1RoZSBYY29kZSBwcm9qZWN0IGZpbGVzIGFyZSBpbiB0aGUgIlhjb2RlIiBkaXJlY3RvcnkuCisKKy0gQnVpbGRpbmcgdGhlIEZyYW1ld29yaworCitUaGUgU0RMIExpYnJhcnkgaXMgcGFja2FnZWQgYXMgYSBmcmFtZXdvcmsgYnVuZGxlLCBhbiBvcmdhbml6ZWQKK3JlbG9jYXRhYmxlIGZvbGRlciBoZWlyYXJjaHkgb2YgZXhlY3V0aWJsZSBjb2RlLCBpbnRlcmZhY2UgaGVhZGVycywgCithbmQgYWRkaXRpb25hbCByZXNvdXJjZXMuIEZvciBwcmFjdGljYWwgcHVycG9zZXMsIHlvdSBjYW4gdGhpbmsgb2YgYSAKK2ZyYW1ld29yayBhcyBhIG1vcmUgdXNlciBhbmQgc3lzdGVtLWZyaWVuZGx5IHNoYXJlZCBsaWJyYXJ5LCB3aG9zZSBsaWJyYXJ5CitmaWxlIGJlaGF2ZXMgbW9yZSBvciBsZXNzIGxpa2UgYSBzdGFuZGFyZCBVTklYIHNoYXJlZCBsaWJyYXJ5LgorCitUbyBidWlsZCB0aGUgZnJhbWV3b3JrLCBzaW1wbHkgb3BlbiB0aGUgZnJhbWV3b3JrIHByb2plY3QgYW5kIGJ1aWxkIGl0LiAKK0J5IGRlZmF1bHQsIHRoZSBmcmFtZXdvcmsgYnVuZGxlICJTREwuZnJhbWV3b3JrIiBpcyBpbnN0YWxsZWQgaW4gCisvTGlicmFyeS9GcmFtZXdvcmtzLiBUaGVyZWZvcmUsIHRoZSB0ZXN0ZXJzIGFuZCBwcm9qZWN0IHN0YXRpb25hcnkgZXhwZWN0CitpdCB0byBiZSBsb2NhdGVkIHRoZXJlLiBIb3dldmVyLCBpdCB3aWxsIGZ1bmN0aW9uIHRoZSBzYW1lIGluIGFueSBvZiB0aGUKK2ZvbGxvd2luZyBsb2NhdGlvbnM6CisKKyAgICB+L0xpYnJhcnkvRnJhbWV3b3JrcworICAgIC9Mb2NhbC9MaWJyYXJ5L0ZyYW1ld29ya3MKKyAgICAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3JrcworCistIEJ1aWxkIE9wdGlvbnMKKyAgICBUaGVyZSBhcmUgdHdvICJCdWlsZCBTdHlsZXMiIChTZWUgdGhlICJUYXJnZXRzIiB0YWIpIGZvciBTREwuCisgICAgIkRlcGxveW1lbnQiIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmVuJ3QgdHdlYWtpbmcgdGhlIFNETCBsaWJyYXJ5LgorICAgICJEZXZlbG9wbWVudCIgc2hvdWxkIGJlIHVzZWQgdG8gZGVidWcgU0RMIGFwcHMgb3IgdGhlIGxpYnJhcnkgaXRzZWxmLgorCistIEJ1aWxkaW5nIHRoZSBUZXN0ZXJzCisgICAgT3BlbiB0aGUgU0RMVGVzdCBwcm9qZWN0IGFuZCBidWlsZCBhd2F5IQorCistIFVzaW5nIHRoZSBQcm9qZWN0IFN0YXRpb25hcnkKKyAgICBDb3B5IHRoZSBzdGF0aW9uYXJ5IHRvIHRoZSBpbmRpY2F0ZWQgZm9sZGVycyB0byBhY2Nlc3MgaXQgZnJvbQorICAgIHRoZSAiTmV3IFByb2plY3QiIGFuZCAiQWRkIHRhcmdldCIgbWVudXMuIFdoYXQgY291bGQgYmUgZWFzaWVyPworCistIFNldHRpbmcgdXAgYSBuZXcgcHJvamVjdCBieSBoYW5kCisgICAgU29tZSBvZiB5b3Ugd29uJ3Qgd2FudCB0byB1c2UgdGhlIFN0YXRpb25hcnkgc28gSSdsbCBnaXZlIHNvbWUgdGlwczoKKyAgICAqIENyZWF0ZSBhIG5ldyAiQ29jb2EgQXBwbGljYXRpb24iCisgICAgKiBBZGQgc3JjL21haW4vbWFjb3N4L1NETE1haW4ubSAsIC5oIGFuZCAubmliIHRvIHlvdXIgcHJvamVjdAorICAgICogUmVtb3ZlICJtYWluLmMiIGZyb20geW91ciBwcm9qZWN0CisgICAgKiBSZW1vdmUgIk1haW5NZW51Lm5pYiIgZnJvbSB5b3VyIHByb2plY3QKKyAgICAqIEFkZCAiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIiB0byBpbmNsdWRlIHBhdGgKKyAgICAqIEFkZCAiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiIHRvIHRoZSBmcmFtZXdvcmtzIHNlYXJjaCBwYXRoCisgICAgKiBBZGQgIi1mcmFtZXdvcmsgU0RMIC1mcmFtZXdvcmsgRm91bmRhdGlvbiAtZnJhbWV3b3JrIEFwcEtpdCIgdG8gIk9USEVSX0xERkxBR1MiCisgICAgKiBTZXQgdGhlICJNYWluIE5pYiBGaWxlIiB1bmRlciAiQXBwbGljYXRpb24gU2V0dGluZ3MiIHRvICJTRExNYWluLm5pYiIKKyAgICAqIEFkZCB5b3VyIGZpbGVzCisgICAgKiBDbGVhbiBhbmQgYnVpbGQKKworLSBCdWlsZGluZyBmcm9tIGNvbW1hbmQgbGluZQorICAgIFVzZSBwYnhidWlsZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgeW91ciAucGJwcm9qIGZpbGUKKyAgICAgICAgIAorLSBSdW5uaW5nIHlvdXIgYXBwCisgICAgWW91IGNhbiBzZW5kIGNvbW1hbmQgbGluZSBhcmdzIHRvIHlvdXIgYXBwIGJ5IGVpdGhlciBpbnZva2luZyBpdCBmcm9tCisgICAgdGhlIGNvbW1hbmQgbGluZSAoaW4gKi5hcHAvQ29udGVudHMvTWFjT1MpIG9yIGJ5IGVudGVyaW5nIHRoZW0gaW4gdGhlCisgICAgIkV4ZWN1dGlibGVzIiBwYW5lbCBvZiB0aGUgdGFyZ2V0IHNldHRpbmdzLgorICAgIAorLSBJbXBsZW1lbnRhdGlvbiBOb3RlcworICAgIFNvbWUgdGhpbmdzIHRoYXQgbWF5IGJlIG9mIGludGVyZXN0IGFib3V0IGhvdyBpdCBhbGwgd29ya3MuLi4KKyAgICAqIFdvcmtpbmcgZGlyZWN0b3J5CisgICAgICAgIEFzIGRlZmluZWQgaW4gdGhlIFNETF9tYWluLm0gZmlsZSwgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHlvdXIgU0RMIGFwcAorICAgICAgICBpcyBieSBkZWZhdWx0IHNldCB0byBpdHMgcGFyZW50LiBZb3UgbWF5IHdpc2ggdG8gY2hhbmdlIHRoaXMgdG8gYmV0dGVyCisgICAgICAgIHN1aXQgeW91ciBuZWVkcy4KKyAgICAqIFlvdSBoYXZlIGEgQ29jb2EgQXBwIQorICAgICAgICBZb3VyIFNETCBhcHAgaXMgZXNzZW50aWFsbHkgYSBDb2NvYSBhcHBsaWNhdGlvbi4gV2hlbiB5b3VyIGFwcAorICAgICAgICBzdGFydHMgdXAgYW5kIHRoZSBsaWJyYXJpZXMgZmluaXNoIGxvYWRpbmcsIGEgQ29jb2EgcHJvY2VkdXJlIGlzIGNhbGxlZCwKKyAgICAgICAgd2hpY2ggc2V0cyB1cCB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGNhbGxzIHlvdXIgbWFpbigpIG1ldGhvZC4KKyAgICAgICAgWW91IGFyZSBmcmVlIHRvIG1vZGlmeSB5b3VyIENvY29hIGFwcCB3aXRoIGdlbmVyYWxseSBubyBjb25zZXF1ZW5jZSAKKyAgICAgICAgdG8gU0RMLiBZb3UgY2Fubm90LCBob3dldmVyLCBlYXNpbHkgY2hhbmdlIHRoZSBTREwgd2luZG93IGl0c2VsZi4KKyAgICAgICAgRnVuY3Rpb25hbGl0eSBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZSB0byBoZWxwIHRoaXMuCisJCisKK0tub3duIGJ1Z3MgYXJlIGxpc3RlZCBpbiB0aGUgZmlsZSAiQlVHUyIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuTWlOVCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuTWlOVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJlM2ViCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5NaU5UCkBAIC0wLDAgKzEsMjUwIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1VzaW5nIHRoZSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgb24gQXRhcmkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyAgICBJZiB5b3Ugd2FudCB0byBidWlsZCBTREwgZnJvbSBzb3VyY2VzIHRvIGNyZWF0ZSBTREwgcHJvZ3JhbXMgb24gQXRhcmk6CisgICAgICAgIHNlZSBzZWN0aW9ucyBJIC0gSUkuCisJCisgICAgSWYgeW91IHdhbnQgdG8gY3JlYXRlIFNETCBwcm9ncmFtcyBvbiBBdGFyaSB1c2luZyBTREwgYmluYXJ5IGJ1aWxkLAorICAgICAgICBkb3dubG9hZCBpdCBmcm9tIG15IHdlYiBzaXRlIChVUkwgYXQgZW5kIG9mIHRoaXMgZmlsZSkuCisKKyAgICBJZiB5b3Ugd2FudCB0byBjb25maWd1cmUgYSBwcm9ncmFtIHVzaW5nIFNETCBvbiBBdGFyaSwKKwkgICAgc2VlIHNlY3Rpb25zIElWIC0gVkkuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJLiAgQnVpbGRpbmcgdGhlIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciBsaWJyYXJpZXM6CisgICAgKFRoaXMgc3RlcCBpc24ndCBuZWNlc3NhcnkgaWYgeW91IGhhdmUgdGhlIFNETCBiaW5hcnkgZGlzdHJpYnV0aW9uKQorCisgIERvIHRoZSBjbGFzc2ljIGNvbmZpZ3VyZSwgd2l0aCAtLWRpc2FibGUtc2hhcmVkIC0tZW5hYmxlLXN0YXRpYyBhbmQ6CisKKyAgICBUb3MgdmVyc2lvbiAoc2hvdWxkIHJ1biBldmVyeXdoZXJlKToKKyAgICAgIC0tZGlzYWJsZS10aHJlYWRzCisgICAgVG9zIGRvZXMgbm90IHN1cHBvcnQgdGhyZWFkcy4KKworICAgIE1pTlQgdmVyc2lvbiAobWF5YmUgTWFnaWMsIG9ubHkgZm9yIG11bHRpdGFza2luZyBPUyk6CisgICAgICAtLWRpc2FibGUtcHRocmVhZHMgLS1lbmFibGUtcHRoCisgICAgTWludCBhbmQgTWFnaWMgbWF5IHN1cHBvcnRzIHRocmVhZHMsIHNvIGF1ZGlvIGNhbiBiZSB1c2VkIHdpdGggY3VycmVudAorICAgIGRldmljZXMsIGxpa2UgU3VuIGF1ZGlvLCBvciBkaXNrLXdyaXRpbmcgc3VwcG9ydC4gTGlrZSBUb3MsIGludGVycnVwdAorICAgIGF1ZGlvIHdpdGhvdXQgdGhyZWFkcyBpcyBtb3JlIHN1aXRlZCBmb3IgQXRhcmkgbWFjaGluZXMuCisKKyAgVGhlbiB5b3UgY2FuIG1ha2UgOyBtYWtlIGluc3RhbGwgaXQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSUkuIEJ1aWxkaW5nIHRoZSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgdGVzdCBwcm9ncmFtczoKKworICBEbyB0aGUgY2xhc3NpYyBjb25maWd1cmUsIHRoZW4gbWFrZS4KKworICBSdW4gdGhlbSAhCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSUlJLiAgRW5qb3khIDopCisKKyAgSWYgeW91IGhhdmUgYSBwcm9qZWN0IHlvdSdkIGxpa2UgbWUgdG8ga25vdyBhYm91dCwgb3Igd2FudCB0byBhc2sgcXVlc3Rpb25zLAorICBnbyBhaGVhZCBhbmQgam9pbiB0aGUgU0RMIGRldmVsb3BlcidzIG1haWxpbmcgbGlzdCBieSBzZW5kaW5nIGUtbWFpbCB0bzoKKworCXNkbC1yZXF1ZXN0QGxpYnNkbC5vcmcKKworICBhbmQgcHV0ICJzdWJzY3JpYmUiIGludG8gdGhlIHN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuIE9yIGFsdGVybmF0aXZlbHkgeW91CisgIGNhbiB1c2UgdGhlIHdlYiBpbnRlcmZhY2U6CisKKwlodHRwOi8vd3d3LmxpYnNkbC5vcmcvbWFpbG1hbi9saXN0aW5mby9zZGwKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lWLiAgV2hhdCBpcyBzdXBwb3J0ZWQ6CisKK0tleWJvYXJkIChHRU1ET1MsIEJJT1MsIEdFTSwgSWtiZCkKK01vdXNlIChYQklPUywgR0VNLCBJa2JkLCAvZGV2L21vdXNlIChub24gd29ya2luZyBhdG0sIGRpc2FibGVkKSkKK1ZpZGVvIChYQklPUyAoRnVsbHNjcmVlbiksIEdFTSAoV2luZG93ZWQgYW5kIEZ1bGxzY3JlZW4pKQorVGltZXIgKFZCTCB2ZWN0b3IsIEdOVSBwdGggbGlicmFyeSkKK0pveXN0aWNrcyBhbmQgam95cGFkcyAoSWtiZCwgSGFyZHdhcmUpCitBdWRpbyAoSGFyZHdhcmUsIFhCSU9TLCBHU1hCLCBNQ1NOLCBTVEZBLCAvZGV2L2F1ZGlvIGlmIHRocmVhZHMgZW5hYmxlZCkKK1RocmVhZHMgKE11bHRpdGFza2luZyBPUyBvbmx5IHZpYSBHTlUgcHRoIGxpYnJhcnkpCitTaGFyZWQgb2JqZWN0IGxvYWRlciAodXNpbmcgTERHIGxpYnJhcnkgZnJvbSBodHRwOi8vbGRnLmF0YXJpLm9yZy8pCitBdWRpbyBDRCAoTWV0YURPUykKK09wZW5HTCAodXNpbmcgTWVzYSBvZmZzY3JlZW4gcmVuZGVyaW5nIGRyaXZlcikKKworLSBEZXBlbmRlbnQgZHJpdmVyIGNvbWJpbmF0aW9uczoKK1ZpZGVvICAgS2JkICAgICBNb3VzZSAgIFRpbWVyICAgSm95c3RpY2tzCit4YmlvcyAgIGlrYmQgICAgaWtiZCAgICB2YmwoMikgIGlrYmQKK3hiaW9zICAgZ2VtZG9zICB4YmlvcyAgIHZibCgyKSAgeGJpb3MKK3hiaW9zICAgYmlvcyAgICB4YmlvcyAgIHZibCgyKSAgeGJpb3MKK2dlbSAgICAgZ2VtICAgICBnZW0oMSkgIHZibCgyKSAgeGJpb3MKKworQXVkaW8gICBPL1MgICAgIE1pc2MKK2RtYTggICAgQWxsICAgICBVc2VzIE1GUCBUaW1lciBBIGludGVycnVwdAoreGJpb3MJVE9TICAgICBVc2VzIE1GUCBUaW1lciBBIGludGVycnVwdAoreGJpb3MgICBNaU5UICAgIFVzZXMgTUZQIFRpbWVyIEEgaW50ZXJydXB0Cit4YmlvcyAgIE1hZ2ljICAgVXNlcyBNRlAgVGltZXIgQSBpbnRlcnJ1cHQKK3N0ZmEgICAgQWxsICAgICBVc2VzIE1GUCBpbnRlcnJ1cHQKK21jc24JVE9TICAgICBVc2VzIE1GUCBUaW1lciBBIGludGVycnVwdAorbWNzbiAgICBNaU5UICAgIFVzZXMgTWlOVCB0aHJlYWQKK21jc24gICAgTWFnaWMgICBEaXNhYmxlZAorZ3N4YiAgICBBbGwgICAgIFVzZXMgR1NYQiBjYWxsYmFjaworCitKb3lwYWQgZHJpdmVyIGFsd2F5cyB1c2VzIGhhcmR3YXJlIGFjY2Vzcy4KK09wZW5HTCBkcml2ZXIgYWx3YXlzIHVzZXMgT1NNZXNhLgorCisoMSkgR0VNIGRvZXMgbm90IHJlcG9ydCByZWxhdGl2ZSBtb3VzZSBtb3Rpb24sIHNvIHhiaW9zIG1vdXNlIGRyaXZlciBpcyB1c2VkCit0byByZXBvcnQgdGhpcyB0eXBlIGV2ZW50LgorQSBwcmVsaW1pbmFyeSBkcml2ZXIgZm9yIC9kZXYvbW91c2UgZGV2aWNlIGRyaXZlciBpcyBwcmVzZW50LCBidXQgaXMgZGlzYWJsZWQKK3RpbGwgaXQgY2FuIGJlIHVzZWQgd2l0aCBvdGhlciBhcHBsaWNhdGlvbnMgc2ltdWx0YW5lb3VzbHkuCisKKygyKSBJZiB5b3UgYnVpbGQgU0RMIHdpdGggdGhyZWFkcyB1c2luZyB0aGUgR05VIHB0aCBsaWJyYXJ5LCB0aW1lcnMgYXJlCitzdXBwb3J0ZWQgdmlhIHRoZSBwdGggbGlicmFyeS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWLiAgRW52aXJvbm1lbnQgdmFyaWFibGVzOgorCitTRExfVklERU9EUklWRVI6CisJU2V0IHRvICd4YmlvcycgdG8gZm9yY2UgeGJpb3MgdmlkZW8gZHJpdmVyCisJU2V0IHRvICdnZW0nIHRvIGZvcmNlIGdlbSB2aWRlbyBkcml2ZXIKKworU0RMX1ZJREVPX0dMX0RSSVZFUjoKKwlTZXQgdG8gZmlsZW5hbWUgdG8gbG9hZCBhcyBPcGVuR0wgbGlicmFyeSwgaWYgeW91IHVzZSBTRExfR0xfTG9hZExpYnJhcnkoKQorCitTRExfQVVESU9EUklWRVI6CisJU2V0IHRvICdtaW50X2dzeGInIHRvIGZvcmNlIEF0YXJpIEdTWEIgYXVkaW8gZHJpdmVyCisJU2V0IHRvICdtaW50X21jc24nIHRvIGZvcmNlIEF0YXJpIE1DU04gYXVkaW8gZHJpdmVyCisJU2V0IHRvICdtaW50X3N0ZmEnIHRvIGZvcmNlIEF0YXJpIFNURkEgYXVkaW8gZHJpdmVyCisJU2V0IHRvICdtaW50X3hiaW9zJyB0byBmb3JjZSBBdGFyaSBYYmlvcyBhdWRpbyBkcml2ZXIKKwlTZXQgdG8gJ21pbnRfZG1hOCcgdG8gZm9yY2UgQXRhcmkgOCBiaXRzIERNQSBhdWRpbyBkcml2ZXIKKwlTZXQgdG8gJ2F1ZGlvJyB0byBmb3JjZSBTdW4gL2Rldi9hdWRpbyBhdWRpbyBkcml2ZXIKKwlTZXQgdG8gJ2Rpc2snIHRvIGZvcmNlIGRpc2std3JpdGluZyBhdWRpbyBkcml2ZXIKKworU0RMX0FUQVJJX0VWRU5UU0RSSVZFUgorCVNldCB0byAnaWtiZCcgdG8gZm9yY2UgSUtCRCA2MzAxIGtleWJvYXJkIGRyaXZlcgorCVNldCB0byAnZ2VtZG9zJyB0byBmb3JjZSBnZW1kb3Mga2V5Ym9hcmQgZHJpdmVyCisJU2V0IHRvICdiaW9zJyB0byBmb3JjZSBiaW9zIGtleWJvYXJkIGRyaXZlcgorCitTRExfSk9ZU1RJQ0tfQVRBUkk6CisJVXNlIGFueSBvZiB0aGVzZSBzdHJpbmdzIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbmFibGUgb3IKKwlkaXNhYmxlIGEgam95c3RpY2s6CisKKwknaWtiZC1qb3kxLVtvbnxvZmZdJyBmb3IgSUtCRCBqb3lzdGljayBvbiBwb3J0IDEgKGhhcmR3YXJlIGFjY2VzcykKKwkneGJpb3Mtam95MS1bb258b2ZmXScgZm9yIElLQkQgam95c3RpY2sgb24gcG9ydCAxICh4YmlvcyBhY2Nlc3MpCisJJ3BvcnRhLXBhZC1bb258b2ZmXScgZm9yIGpveXBhZCBhbmQvb3IgdGVhbXRhcCBvbiBwb3J0IEEKKwkncG9ydGEtam95MC1bb258b2ZmXScgZm9yIGpveXN0aWNrIDAgb24gcG9ydCBBCisJJ3BvcnRhLWpveTEtW29ufG9mZl0nIGZvciBqb3lzdGljayAxIG9uIHBvcnQgQQorCSdwb3J0YS1scC1bb258b2ZmXScgZm9yIGxpZ2h0cGVuIG9uIHBvcnQgQQorCSdwb3J0YS1hbnBhZC1bb258b2ZmXScgZm9yIGFuYWxvZyBwYWRkbGUgb24gcG9ydCBBCisJJ3BvcnRiLXBhZC1bb258b2ZmXScgZm9yIGpveXBhZCBhbmQvb3IgdGVhbXRhcCBvbiBwb3J0IEIKKwkncG9ydGItam95MC1bb258b2ZmXScgZm9yIGpveXN0aWNrIDAgb24gcG9ydCBCCisJJ3BvcnRiLWpveTEtW29ufG9mZl0nIGZvciBqb3lzdGljayAxIG9uIHBvcnQgQgorCSdwb3J0Yi1hbnBhZC1bb258b2ZmXScgZm9yIGFuYWxvZyBwYWRkbGUgb24gcG9ydCBCCisKKwlEZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXM6CisJCSdpa2JkLWpveTEtb24nIChpZiBJS0JEIGV2ZW50cyBkcml2ZXIgZW5hYmxlZCkKKwkJJ3hiaW9zLWpveTEtb24nIChpZiBnZW1kb3MvYmlvcy9nZW0gZXZlbnRzIGRyaXZlciBlbmFibGVkKQorCQkncG9ydGEtcGFkLW9uIHBvcnRiLXBhZC1vbicgKGlmIGF2YWlsYWJsZSBvbiB0aGUgbWFjaGluZSkKKworCXBvcnRbYXxiXS1bcGFkfGpveT98bHB8YW5wYWRdLSogc3RyaW5ncyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlcy4KKwlPbiBzdWNoIGEgcG9ydCwgeW91IGNhbiBvbmx5IHVzZSBhIGpveXBhZCBPUiAxIG9yIDIgam95c3RpY2tzIE9SCisJYSBsaWdodHBlbiBPUiBhbiBhbmFsb2cgcGFkZGxlLiBZb3UgbXVzdCBkaXNhYmxlIGpveXBhZCBiZWZvcmUKKwlzZXR0aW5nIGFub3RoZXIgY29udHJvbGxlci4KKworCVRoZSBzZWNvbmQgam95c3RpY2sgcG9ydCBvbiBJS0JEIGlzIHVzZWQgYnkgdGhlIG1vdXNlLCBzbyBub3QgdXNhYmxlLgorCUFub3RoZXIgcHJvYmxlbSB3aXRoIHRoZSBJS0JEOiBtb3VzZSBidXR0b25zIGFuZCBqb3lzdGljayBmaXJlIGJ1dHRvbnMKKwlhcmUgd2lyZWQgdG9nZXRoZXIgYXQgdGhlIGhhcmR3YXJlIGxldmVsLCBpdCBtZWFuczoKKwkJcG9ydCAwICAgICAgICAgICAgICAgIHBvcnQgMCAgICAgICAgICAgcG9ydCAxCisJCW1vdXNlIGxlZnQgYnV0dG9uICA9IGpveXN0aWNrIGZpcmUgMCA9IGpveXN0aWNrIGZpcmUgMQorCQltb3VzZSByaWdodCBidXR0b24gPSBqb3lzdGljayBmaXJlIDEgPSBqb3lzdGljayBmaXJlIDAKKworCURlc2NyaXB0aW9ucyBvZiBqb3lzdGlja3Mvam95cGFkczoKKwktIEpveXBhZHM6IDEgaGF0LCAxNyBidXR0b25zIChBdGFyaSBKYWd1YXIgY29uc29sZS1saWtlKS4KKwktIEpveXN0aWNrczogMSBoYXQsIDEgYnV0dG9uLgorCS0gTGlnaHRwZW4sIGFuYWxvZyBwYWRkbGVzOiAyIGF4aXMsIDIgYnV0dG9ucy4gVGhlIDIgYnV0dG9ucyBhcmUgdGhvc2UKKwkgIGFmZmVjdGVkIHRvIDEgYnV0dG9uIGpveXN0aWNrcyBvbiB0aGUgc2FtZSBwb3J0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1ZJLiAgTW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgZHJpdmVyczoKKworT3BlbkdMOgorCVRoZSBkZWZhdWx0IGlzIHRvIHVzZSB0aGUgTWVzYSBvZmZzY3JlZW4gZHJpdmVyIChvc21lc2EubGRnKS4gSWYgeW91IHdhbnQKKwl0byB1c2UgYW4gb2xkZXIgT3BlbkdMIGltcGxlbWVudGF0aW9uLCBsaWtlIG1lc2FfZ2wubGRnIG9yIHRpbnlfZ2wubGRnLAorCXlvdXIgcHJvZ3JhbSBtdXN0IHVzZSBTRExfR0xfTG9hZExpYnJhcnkoKSB0byBkbyBzbywgYW5kIHJldHJpZXZlIHRoZQorCW5lZWRlZCBmdW5jdGlvbiBwb2ludGVycyB3aXRoIFNETF9Mb2FkRnVuY3Rpb24oKS4gSW4gYWxsIGNhc2VzLCB0aGUgT3BlbkdMCisJY29udGV4dCBpcyB0YWtlbiBjYXJlIG9mIGJ5IFNETCBpdHNlbGYsIHlvdSBqdXN0IGhhdmUgdG8gdXNlIGdsKiBmdW5jdGlvbnMuCisKKwlIb3dldmVyLCB0aGVyZSBpcyBvbmUgT3BlbkdMIGNhbGwgdGhhdCBoYXMgYSBkaWZmZXJlbnQgcHJvdG90eXBlIGluIHRoZSBvbGQKKwlpbXBsZW1lbnRhdGlvbnM6IGdsT3J0aG8oKS4gSW4gdGhlIG9sZCBpbXBsZW1lbnRhdGlvbnMsIGl0IGhhcyA2IGZsb2F0IGFzCisJcGFyYW1ldGVycywgaW4gdGhlIHN0YW5kYXJkIG9uZSwgaXQgaGFzIDYgZG91YmxlIHBhcmFtZXRlcnMuIElmIHlvdSB3YW50CisJdG8gY29tcGlsZSB0ZXN0ZHluZ2wsIG9yIGFueSBvdGhlciBTREwgcHJvZ3JhbSB0aGF0IGxvYWRzIGl0cyBPcGVuR0wKKwlsaWJyYXJ5LCB5b3UgbXVzdCBjaGFuZ2UgdGhlIGdsT3J0aG8oKSBwcm90b3R5cGUgdXNlZCBpbiB0aGlzIHByb2dyYW0uIEluCisJb3NtZXNhLmxkZywgeW91IGNhbiByZXRyaWV2ZSBhIGdsT3J0aG8oKSB3aXRoIGRvdWJsZSBwYXJhbWV0ZXJzLCBieQorCXNlYXJjaGluZyBmb3IgdGhlIGZ1bmN0aW9uICJnbE9ydGhvNmQiLgorCitYYmlvcyB2aWRlbzoKKwlWaWRlbyBjaGlwIGlzIGRldGVjdGVkIHVzaW5nIHRoZSBfVkRPIGNvb2tpZS4KKwlTY3JlZW4gZW5oYW5jZXJzIGFyZSBub3Qgc3VwcG9ydGVkLCBidXQgY291bGQgYmUgaWYgeW91IGtub3cgaG93IHRvCisJdXNlIHRoZW0uCisKKwlTVCwgU1RFLCBNZWdhIFNULCBNZWdhIFNURToKKwkJMzIweDIwMHg0IGJpdHMsIHNoYWRlcyBvZiBncmV5LCBhdmFpbGFibGUgb25seSBmb3IgdGhlIHB1cnBvc2UKKwkJb2YgdGVzdGluZyBTREwuCisJVFQ6CisJCTMyMHg0ODB4OCBhbmQgMzIweDI0MHg4IChzb2Z0d2FyZSBkb3VibGUtbGluZWQgbW9kZSkuCisJRmFsY29uOgorCQlBbGwgbW9kZXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IG1vbml0b3IgKFJWQiBvciBWR0EpLgorCQlCbG93VXAgYW5kIENlbnRzY3JlZW4gZXh0ZW5kZWQgbW9kZXMsIFNjcmVlbkJsYXN0ZXIgMyBjdXJyZW50IG1vZGUuCisJTWlsYW46CisJCUV4cGVyaW1lbnRhbCBzdXBwb3J0CisJQ2xvbmVzIGFuZCBhbnkgbWFjaGluZSB3aXRoIG1vbm9jaHJvbWUgbW9uaXRvcjoKKwkJTm90IHN1cHBvcnRlZC4KKworR2VtIHZpZGVvOgorCUF1dG9tYXRpY2FsbHkgdXNlZCBpZiB4YmlvcyBub3QgYXZhaWxhYmxlLgorCisJQWxsIG1hY2hpbmVzOgorCQlPbmx5IHRoZSBjdXJyZW50IHJlc29sdXRpb24sIGlmIDggYml0cyBvciBoaWdoZXIgZGVwdGguCisKK0lLQkQga2V5Ym9hcmQsIG1vdXNlIGFuZCBqb3lzdGljayBkcml2ZXI6CisJQXZhaWxhYmxlIGlmIF9NQ0ggY29va2llIGlzIFNULCBNZWdhIFNULCBTVEUsIE1lZ2EgU1RFLCBUVCBvciBGYWxjb24uCisKKwlIYWRlcyBoYXMgYW4gSUtCRCwgYnV0IHhiaW9zIGlzIG5vdCBhdmFpbGFibGUgZm9yIHZpZGVvLCBzbyBJS0JECisJZHJpdmVyIGlzIGRpc2FibGVkLgorCitHZW1kb3MgYW5kIGJpb3Mga2V5Ym9hcmQgZHJpdmVyOgorCUF2YWlsYWJsZSBvbiBhbGwgbWFjaGluZXMuCisKK01vdXNlIGFuZCBqb3lzdGljayB4YmlvcyBkcml2ZXI6CisJQXZhaWxhYmxlIG9uIGFsbCBtYWNoaW5lcyAoSSB0aGluaykuCisKK0pveXBhZCBkcml2ZXI6CisJQXZhaWxhYmxlIGlmIF9NQ0ggY29va2llIGlzIFNURSBvciBGYWxjb24uIFN1cHBvcnRzIHRlYW10YXAuCisKK1BUSCB0aW1lciBkcml2ZXI6CisJQXZhaWxhYmxlIHdpdGggbXVsdGl0YXNraW5nIE9TLgorCitWQkwgdGltZXIgZHJpdmVyOgorCUF2YWlsYWJsZSBvbiBhbGwgbWFjaGluZXMgKEkgdGhpbmspLgorCitBdWRpbyBkcml2ZXJzOgorCUNvb2tpZXMgX1NORCwgTUNTTiwgU1RGQSBhbmQgR1NYQiB1c2VkIHRvIGRldGVjdCBzdXBwb3J0ZWQgYXVkaW8KKwljYXBhYmlsaXRpZXMuCisKKwlTVEUsIE1lZ2EgU1RFLCBUVDoKKwkJOCBiaXRzIERNQSAoaGFyZHdhcmUgYWNjZXNzKQorCQlTVEZBLCBNQ1NOIG9yIEdTWEIgZHJpdmVyIGlmIGluc3RhbGxlZAorCUZhbGNvbjoKKwkJOCBiaXRzIERNQSAoaGFyZHdhcmUgYWNjZXNzKQorCQlYYmlvcyBmdW5jdGlvbnMKKwkJU1RGQSwgTUNTTiBvciBHU1hCIGRyaXZlciBpZiBpbnN0YWxsZWQKKwlPdGhlciBtYWNoaW5lczoKKwkJU1RGQSwgTUNTTiBvciBHU1hCIGRyaXZlciBpZiBpbnN0YWxsZWQKKworCVNURkEgZHJpdmVyOgorCQlodHRwOi8vcmVtb3ZlcnMuZnJlZS5mci9zb2Z0cy9zdGZhLmh0bWwKKwlHU1hCIGRyaXZlcjoKKwkJaHR0cDovL2Fzc2Vtc29mdC5hdGFyaS5vcmcvZ3N4Yi8KKwlNYWNTb3VuZCBkcml2ZXI6CisJCWh0dHA6Ly9qZi5vbW5pcy5jaC9zb2Z0d2FyZS90b3MvCisJTWFnaWNTb3VuZCBkcml2ZXIgKE1DU04sR1NYQiBjb21wYXRpYmxlKToKKwkJaHR0cDovL3BlcnNvLndhbmFkb28uZnIvZGlkaWVybS8KKwlYLVNvdW5kIGRyaXZlciAoR1NYQiBjb21wYXRpYmxlKToKKwkJaHR0cDovL3d3dy51bmktdWxtLmRlL35zX3RodXRoL2F0YXJpL3hzb3VuZF9lLmh0bWwKKworLS0gCitQYXRyaWNlIE1hbmRpbiA8cGF0bWFuZGluQGdtYWlsLmNvbT4KK2h0dHA6Ly9wbWFuZGluLmF0YXJpLm9yZy8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuTkRTIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5ORFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2YTllZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuTkRTCkBAIC0wLDAgKzEsMjIgQEAKK1RoZSBTREwgcG9ydCB0byB0aGUgTmludGVuZG8gRFMKKworVGhpcyBwb3J0IHVzZXMgdGhlIGRldktpdFBybyB0b29sY2hhaW4sIGF2YWlsYWJsZSBmcm9tOgoraHR0cDovL3d3dy5kZXZraXRwcm8ub3JnCisKK1ByZWNvbXBpbGVkIHRvb2xzIGZvciBjcm9zcy1jb21waWxpbmcgb24gTGludXggYXJlIGF2YWlsYWJsZSBmcm9tOgoraHR0cDovL3d3dy5saWJzZGwub3JnL2V4dHJhcy9uZHMvZGV2a2l0UHJvLTIwMDcwNTAzLWxpbnV4LnRhci5negorCit0b2RvOgorYWRkIGRzIGNvbnNvbGUgc3BlY2lmaWMgZmVhdHVyZXMvb3B0aW1pemF0aW9ucworbW91c2Uva2V5Ym9hcmQgc3VwcG9ydAorZHVhbCBzY3JlZW4gc3VwcG9ydAorCitidWlsZCB3aXRoOgorY3AgaW5jbHVkZS9TRExfY29uZmlnX25kcy5oIGluY2x1ZGUvU0RMX2NvbmZpZy5oCittYWtlIC1mIE1ha2VmaWxlLmRzCisKK2luY2x1ZGVkIGlzIGFuIGFybTkvYXJtNyB0ZW1wbGF0ZSB0byBhbGxvdyBmb3Igc291bmQgc3RyZWFtaW5nIHN1cHBvcnQuCisKK0Vuam95LCBmaXggdGhlIHNvdXJjZSBhbmQgc2hhcmUgOikKK1Ryb3kgRGF2aXMoR1BGKQoraHR0cDovL2dwZi5kY2VtdS5jby51ay8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuTmFub1ggYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLk5hbm9YCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MThmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLk5hbm9YCkBAIC0wLDAgKzEsOTcgQEAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUGF0Y2ggdmVyc2lvbiAwLjkgb2YgU0RMKFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcikgZm9yIE5hbm8tWCBBUEkKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIEF1dGhvcnM6IEhzaWVoLUZ1IFRzYWksIGNsYXJlQHNldGFib3guY29tCisgICAgICAgICAgIEdyZWcgSGFlcnIsIGdyZWdAY2Vuc29mdC5jb20KKworICBUaGlzIHBhdGNoIGlzIGFnYWluc3QgU0RMIHZlcnNpb24gMS4yLjQuCisgIEl0IGVuaGFuY2VzIHByZXZpb3VzIHBhdGNoIDAuOCBieSBwcm92aWRpbmcgZGlyZWN0IGZyYW1lYnVmZmVyCisgIGFjY2VzcyBhcyB3ZWxsIGFzIGR5bmFtaWMgaGFyZHdhcmUgcGl4ZWwgdHlwZSBzdXBwb3J0LCBub3QKKyAgcmVxdWlyaW5nIGEgY29tcGlsZS10aW1lIG9wdGlvbiBzZXR0aW5nIGZvciBkaWZmZXJlbnQgZnJhbWVidWZmZXIKKyAgbW9kZXMuCisgIFRlc3RlZCBhZ2FpbnN0IE1pY3Jvd2luZG93cyB2ZXJzaW9uIDAuODlwcmU5LgorCisgIE9sZGVyIE1pY3Jvd2luZG93cyB2ZXJzaW9ucworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgSWYgcnVubmluZyBvbiBhIHZlcnNpb24gb2xkZXIgdGhhbiBNaWNyb3dpbmRvd3MgMC44OXByZTksCisgIHRoZSBmb2xsb3dpbmcgaXRlbXMgbWlnaHQgbmVlZCB0byBiZSBwYXRjaGVkIGluIE1pY3Jvd2luZG93cy4KKworICAxLiBQYXRjaCBzcmMvbmFub3gvY2xpZW50LmM6OkdyQ2xvc2UoKQorICBJdCBmaXhlcyB0aGUgY2xpZW50IHNpZGUgR3JDbG9zZSgpLiBJbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgCisgIEdyT3BlbigpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiBXaGVuIHRoZSBHck9wZW4oKSBpcyBjYWxsZWQgYXQgCisgIHRoZSBzZWNvbmQgdGltZSwgdGhlIHByb2dyYW0gd2lsbCB0ZXJtaW5hdGUuIEluIG9yZGVyIHRvIHByZXZlbnQKKyAgdGhpcyBzaXR1YXRpb24sIHdlIG5lZWQgdG8gaW5zZXJ0ICJueFNvY2tldCA9IC0xIiBhZnRlciAKKyAgImNsb3NlKG54U29ja2V0KSIgaW4gR3JDbG9zZSgpLiBJZiB5b3UgZG8gbm90IGhhdmUgdGhpcyBwcm9ibGVtLAorICB5b3UgbWF5IHNraXAgdGhpcyBzdGVwLiAKKworICAyLiBQYXRjaCBzcmMvbmFub3gvY2xpZW50ZmIuYyB0byByZXR1cm4gYWJzb2x1dGUgeCx5IGNvb3JkaW5hdGVzCisgIHdoZW4gdXNpbmcgR3JHZXRXaW5kb3dGQkluZm8oKS4gIENvcHkgdGhlIHZlcnNpb24gMC44OXByZTkKKyAgb2Ygc3JjL25hbm94L2NsaWVudGZiLmMgdG8geW91ciBzeXN0ZW0sIG9yIGNvbmZpZ3VyZQorICB1c2luZyAtLWRpc2FibGUtbmFub3gtZGlyZWN0LWZiLgorCisgID09PT09PT09PT09PT0KKyAgUXVpY2sgSW5zdGFsbCAKKyAgPT09PT09PT09PT09PQorCisgIDEuIC4vY29uZmlndXJlIC0tZGlzYWJsZS12aWRlby14MTEgLS1kaXNhYmxlLXZpZGVvLWZiY29uIFwgCisgICAgICAgLS1lbmFibGUtdmlkZW8tbmFub3ggXCAKKyAgICAgICAtLXdpdGgtbmFub3gtcGl4ZWwtdHlwZT1bcmdiLzA4ODgvODg4LzU2NS81NTUvMzMyL3BhbF0gCisgIDIuIG1ha2UgY2xlYW4gCisgIDMuIG1ha2UgCisgIDQuIG1ha2UgaW5zdGFsbCAoYXMgcm9vdCkgCisKKyAgPT09PT09PT09PT09CisgIE5pdHR5LWdyaXR0eSAKKyAgPT09PT09PT09PT09CisKKyAgLS1lbmFibGUtbmFub3gtZGlyZWN0LWZiICAgICAgIFVzZSBkaXJlY3QgZnJhbWVidWZmZXIgYWNjZXNzCisgIC0tZW5hYmxlLW5hbm94LWRlYnVnICAgICAgICAgICBTaG93IGRlYnVnIG1lc3NhZ2VzIAorICAtLWVuYWJsZS1uYW5veC1zaGFyZS1tZW1vcnkgICAgVXNlIHNoYXJlZC1tZW1vcnkgdG8gc3BlZWQgdXAgCisKKyAgV2hlbiBydW5uaW5nIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucyB1c2luZyBTREwsIHN1Y2gKKyAgYXMgU01QRUcsIHNldCBUSFJFQURTQUZFPVkgaW4gTWljcm93aW5kb3dzJyBjb25maWcgZmlsZSwKKyAgdG8gZW5hYmxlIEdyWFhYKCkgc3lzdGVtIGNhbGwgY3JpdGljYWwgc2VjdGlvbiBzdXBwb3J0LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBTb21lIHByb2dyYW1zIGNhbiBiZSB1c2VkIHRvIHRlc3QgdGhpcyBwYXRjaC4gCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIDEuIGh0dHA6Ly93d3cuY3MuYmVya2VsZXkuZWR1L353ZWltZXIvYXRyaXMgKGEgdGV0cmlzLWxpa2UgZ2FtZSkgCisgIDIuIGh0dHA6Ly93d3cubGlic2RsLm9yZy9wcm9qZWN0cy9uZXd2b3gvCisgIDMuIGh0dHA6Ly93d3cubGlic2RsLm9yZy9wcm9qZWN0cy94ZmxhbWUvCisgIDQuIGh0dHA6Ly93d3cubGlic2RsLm9yZy9wcm9qZWN0cy9vcHRpbXVtLyAKKyAgNS4gaHR0cDovL3d3dy5nbnVnZW5lcmF0aW9uLmNvbS9zb2Z0d2FyZS9sb29wLyAKKyAgNjogaHR0cDovL3d3dy5sb2tpZ2FtZXMuY29tL2RldmVsb3BtZW50L3NtcGVnLnBocDMgKFNNUEVHIHZlcnNpb24gMC40LjQpCisKKyAgPT09PT09PT09CisgIFRvZG8gTGlzdCAKKyAgPT09PT09PT09CisKKyAgMS4gQ3JlYXRlIGhhcmR3YXJlIHN1cmZhY2UKKyAgMi4gQ3JlYXRlIFlVVk92ZXJsYXkgb24gaGFyZHdhcmUKKyAgMy4gVXNlIE9wZW5HTAorICA0LiBHYW1tYSBjb3JyZWN0aW9uCisgIDUuIEhpZGUvQ2hhbmdlIG1vdXNlIHBvaW50ZXIKKyAgNi4gQmV0dGVyIHdpbmRvdyBtb3ZlbWVudCBjb250cm9sIHdpdGggZGlyZWN0IGZiIGFjY2VzcworICA3LiBQYWxldHRlIGhhbmRsaW5nIGluIDhicHAgY291bGQgYmUgaW1wcm92ZWQKKworICA9PT09PT09PT09PT09PT09PT09PT0KKyAgU3VwcG9ydGluZyBJbnN0aXR1dGVzCisgID09PT09PT09PT09PT09PT09PT09PQorICAKKyAgTWFueSB0aGFua3MgdG8gZ28gdG8gU2V0YWJveCBDby4sIEx0ZC4gYW5kIENNTCAoQ29tbXVuaWNhdGlvbiBhbmQKKyAgTXVsdGltZWRpYSBMYWJvcmF0b3J5LCBodHRwOi8vd3d3LmNtbGFiLmNzaWUubnR1LmVkdS50dy8pIGluIHRoZSAKKyAgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlIGFuZCBJbmZvcm1hdGlvbiBFbmdpbmVlcmluZyBvZiAKKyAgTmF0aW9uYWwgVGFpd2FuIFVuaXZlcnNpdHkgZm9yIHN1cHBvcnRpbmcgdGhpcyBwb3J0aW5nIHByb2plY3QuCisgIAorICBDZW50dXJ5IEVtYmVkZGVkIFRlY2hub2xvZ2llcyAoaHR0cDovL2VtYmVkZGVkLmNlbnNvZnQuY29tKQorICBmb3IgdGhpcyBwYXRjaC4KKworICA9PT09PT09PT09PT09PT09PT09CisgIENvbnRhY3QgSW5mb3JtYXRpb24KKyAgPT09PT09PT09PT09PT09PT09PQorCisgIFdlbGNvbWUgdG8gZ2l2ZSBtZSBhbnkgc3VnZ2VzdGlvbiBhbmQgdG8gcmVwb3J0IGJ1Z3MuCisgIE15IGUtbWFpbCBhZGRyZXNzIDogY2xhcmVAc2V0YWJveC5jb20gb3IgbmlreUBjbWxhYi5jc2llLm50dS5lZHUudHcKKyAgICAgICAgICAgICAgICAgICAgICBvciBncmVnQGNlbnNvZnQuY29tCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLk9TMiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuT1MyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNGIzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLk9TMgpAQCAtMCwwICsxLDI4MSBAQAorCis9PT09PT09PT09PQorU0RMIG9uIE9TLzIKKz09PT09PT09PT09CisKK0xhc3QgdXBkYXRlZCBvbiBNYXkuIDE3LCAyMDA2LgorCisKKzEuIEhvdyB0byBjb21waWxlPworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGNvbXBpbGUgdGhpcywgeW91J2xsIG5lZWQgdGhlIGZvbGxvd2luZ3MgaW5zdGFsbGVkOgorLSBUaGUgT1MvMiBEZXZlbG9wZXIncyBUb29sa2l0CistIFRoZSBPcGVuV2F0Y29tIGNvbXBpbGVyIAorICAoaHR0cDovL3d3dy5vcGVud2F0Y29tLm9yZykKKworRmlyc3Qgb2YgYWxsLCB5b3UgaGF2ZSB0byB1bnppcCB0aGUgV2F0Y29tLU9TMi56aXAgZmlsZS4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhIAorZmlsZSBjYWxsZWQgIm1ha2VmaWxlIiBhbmQgYSBmaWxlIGNhbGxlZCAic2V0dmFycy5jbWQiIGluIHRoaXMgZm9sZGVyIChhbmQgc29tZQorbW9yZSBmaWxlcy4uLikuCisKK1BsZWFzZSBlZGl0IHRoZSBzZWNvbmQsIGZvdXJ0aCBhbmQgZmlmdGggbGluZXMgb2Ygc2V0dmFycy5jbWQgZmlsZQordG8gc2V0IHRoZSBmb2xkZXJzIHdoZXJlIHRoZSB0b29sa2l0LCB0aGUgT1cgY29tcGlsZXIgYW5kIHRoZSBGU0xpYiBhcmUuIAorWW91IHdvbid0IG5lZWQgTkFTTSB5ZXQgKFRoZSBOZXR3aWRlIEFzc2VtYmxlciksIHlvdSBjYW4gbGVhdmUgdGhhdCBsaW5lLgorUnVuIHNldHZhcnMuY21kLCBhbmQgeW91IHNob3VsZCBnZXQgYSBzaGVsbCBpbiB3aGljaCB5b3UgY2FuCitjb21waWxlIFNETC4KKworQ2hlY2sgdGhlICJtYWtlZmlsZSIgZmlsZS4gVGhlcmUgaXMgYSBsaW5lIGluIHRoZXJlIHdoaWNoIGRldGVybWluZXMgaWYgdGhlIAorcmVzdWx0aW5nIFNETC5ETEwgd2lsbCBiZSBhICdkZWJ1Zycgb3IgYSAncmVsZWFzZScgYnVpbGQuIFRoZSAnZGVidWcnIHZlcnNpb24gCitpcyBmdWxsIG9mIHByaW50ZigpJ3MsIHNvIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLCBpdHMgb3V0cHV0IGNhbiBoZWxwIGEgbG90Citmb3IgZGVidWdnaW5nLgorCitUaGVuIHJ1biAid21ha2UiLgorVGhpcyBzaG91bGQgY3JlYXRlIHRoZSBTREwxMi5ETEwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIFNETDEyLkxJQiBmaWxlIGhlcmUuCisKK1RvIHRlc3QgYXBwbGljYXRpb25zLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHVzZSB0aGUgJ2RlYnVnJyBidWlsZCBvZiBTREwsIGFuZAorcmVkaXJlY3QgdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IHRvIGZpbGVzLCB0byBzZWUgd2hhdAoraGFwcGVucyBpbnRlcm5hbGx5IGluIFNETC4KKyhsaWtlOiB0ZXN0c3ByaXRlID5zdGRvdXQudHh0IDI+c3RkZXJyLnR4dCkKKworVG8gcmVidWlsZCBTREwsIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGluIHRoaXMgZm9sZGVyOgord21ha2UgY2xlYW4KK3dtYWtlCisKKworCisyLiBIb3cgdG8gY29tcGlsZSB0aGUgdGVzdGFwcHM/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09uY2UgeW91IGhhdmUgU0RMMTIuRExMIGNvbXBpbGVkLCBuYXZpZ2F0ZSBpbnRvIHRoZSAndGVzdCcgZm9sZGVyLCBjb3B5IGluIAordGhlcmUgdGhlIG5ld2x5IGJ1aWx0IFNETDEyLkRMTCwgYW5kIGNvcHkgaW4gdGhlcmUgRlNMaWIuRExMLgorCitUaGVuIHJ1biAid21ha2UiIGluIHRoZXJlIHRvIGNvbXBpbGUgc29tZSBvZiB0aGUgdGVzdGFwcHMuCisKKworCiszLiBXaGF0IGlzIG1pc3Npbmc/CistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgdGhpbmdzIGFyZSBtaXNzaW5nIGZyb20gdGhpcyBTREwgaW1wbGVtZW50YXRpb246CistIE1NWCwgU1NFIGFuZCAzRE5PVyEgb3B0aW1pemVkIHZpZGVvIGJsaXR0ZXJzPworLSBIVyBWaWRlbyBzdXJmYWNlcworLSBPcGVuR0wgc3VwcG9ydAorCisKKworNC4gU3BlY2lhbCBLZXlzIC8gRnVsbC1TY3JlZW4gc3VwcG9ydAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSBhcmUgdHdvIHNwZWNpYWwgaG90LWtleXMgaW1wbGVtZW50ZWQ6CistIEFsdCtIb21lIHN3aXRjaGVzIGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgd2luZG93ZWQgbW9kZQorLSBBbHQrRW5kIHNpbXVsYXRlcyBjbG9zaW5nIHRoZSB3aW5kb3cgKGNhbiBiZSB1c2VkIGFzIGEgUGFuaWMga2V5KQorT25seSB0aGUgTEVGVCBBbHQga2V5IHdpbGwgd29yay4KKworCisKKzUuIEpveXN0aWNrcyBvbiBTREwvMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBKb3lzdGljayBkZXRlY3Rpb24gb25seSB3b3JrcyBmb3Igc3RhbmRhcmQgam95c3RpY2tzICgyIGJ1dHRvbnMsIDIgYXhlcworYW5kIHRoZSBsaWtlKS4gVGhlcmVmb3JlLCBpZiB5b3UgdXNlIGEgbm9uLXN0YW5kYXJkIGpveXN0aWNrLCB5b3Ugc2hvdWxkCitzcGVjaWZ5IGl0cyBmZWF0dXJlcyBpbiB0aGUgU0RMX09TMl9KT1lTVElDSyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiBhIGJhdGNoCitmaWxlIG9yIENPTkZJRy5TWVMsIHNvIFNETCBhcHBsaWNhdGlvbnMgY2FuIHByb3ZpZGUgZnVsbCBjYXBhYmlsaXR5IHRvIHlvdXIKK2RldmljZS4gVGhlIHN5bnRheCBpczoKKworU0VUIFNETF9PUzJfSk9ZU1RJQ0s9W0pPWVNUSUNLX05BTUVdIFtBWEVTXSBbQlVUVE9OU10gW0hBVFNdIFtCQUxMU10KKworU28sIGl0IHlvdSBoYXZlIGEgR3JhdmlzIEdhbWVQYWQgd2l0aCA0IGF4ZXMsIDIgYnV0dG9ucywgMiBoYXRzIGFuZCAwIGJhbGxzLAordGhlIGxpbmUgc2hvdWxkIGJlOgorCitTRVQgU0RMX09TMl9KT1lTVElDSz1HcmF2aXNfR2FtZVBhZCA0IDIgMiAwCisKK0lmIHlvdSB3YW50IHRvIGFkZCBzcGFjZXMgaW4geW91ciBqb3lzdGljayBuYW1lLCBqdXN0IHN1cnJvdW5kIGl0IHdpdGgKK3F1b3RlcyBvciBkb3VibGUtcXVvdGVzOgorCitTRVQgU0RMX09TMl9KT1lTVElDSz0nR3JhdmlzIEdhbWVQYWQnIDQgMiAyIDAKKworb3IKKworU0VUIFNETF9PUzJfSk9ZU1RJQ0s9IkdyYXZpcyBHYW1lUGFkIiA0IDIgMiAwCisKKyAgIE5vdGl2ZSBIb3dldmVyIHRoYXQgQmFsbHMgYW5kIEhhdHMgYXJlIG5vdCBzdXBwb3J0ZWQgdW5kZXIgT1MvMiwgYW5kIHRoZQordmFsdWUgd2lsbCBiZSBpZ25vcmVkLi4uIGJ1dCBpdCBpcyB3aXNlIHRvIGRlZmluZSB0aGVzZSBjb3JyZWN0bHkgYmVjYXVzZSAKK2luIHRoZSBmdXR1cmUgdGhvc2UgY2FuIGJlIHN1cHBvcnRlZC4KKyAgIEFsc28gdGhlIG51bWJlciBvZiBidXR0b25zIGlzIGxpbWl0ZWQgdG8gMiB3aGVuIHVzaW5nIHR3byBqb3lzdGlja3MsCis0IHdoZW4gdXNpbmcgb25lIGpveXN0aWNrIHdpdGggNCBheGVzLCA2IHdoZW4gdXNpbmcgYSBqb3lzdGljayB3aXRoIDMgYXhlcworYW5kIDggd2hlbiB1c2luZyBhIGpveXN0aWNrIHdpdGggMiBheGVzLiBOb3RpY2UgaG93ZXZlciB0aGVzZSBhcmUgbGltaXRhdGlvbnMgCitvZiB0aGUgSm95c3RpY2sgUG9ydCBoYXJkd2FyZSwgbm90IE9TLzIuCisKKworCis2LiBQcm9wb3J0aW9uYWwgd2luZG93cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIHNvbWUgU0RMIGFwcGxpY2F0aW9ucyBpdCBjYW4gYmUgaGFuZHkgdG8gaGF2ZSBwcm9wb3J0aW9uYWwgd2luZG93cywgc28KK3RoZSB3aW5kb3dzIHdpbGwga2VlcCB0aGVpciBhc3BlY3QgcmF0aW8gd2hlbiByZXNpemVkLgorVGhpcyBjYW4gYmUgYWNoaWV2ZWQgaW4gdHdvIHdheXM6CisKKy0gQmVmb3JlIHN0YXJ0aW5nIHRoZSBnaXZlbiBTREwgYXBwbGljYXRpb24sIHNldCB0aGUKKyAgU0RMX1VTRV9QUk9QT1JUSU9OQUxfV0lORE9XIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNvbWV0aGluZywgZS5nLjoKKworICBTRVQgU0RMX1VTRV9QUk9QT1JUSU9OQUxfV0lORE9XPTEKKyAgZG9zYm94LmV4ZQorCistIElmIHlvdSBoYXZlIGEgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQsIHRoZW4gU0RMIHdpbGwgbG9vayBmb3IgYSBmaWxlCisgIGluIHRoZXJlIGNhbGxlZCAiLnNkbC5wcm9wb3J0aW9uYWxzIi4gSWYgdGhhdCBmaWxlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZQorICBjdXJyZW50bHkgcnVubmluZyBTREwgZXhlY3V0YWJsZSwgdGhlbiB0aGF0IHByb2Nlc3Mgd2lsbCBoYXZlIHByb3BvcnRpb25hbAorICB3aW5kb3dzIGF1dG9tYXRpY2FsbHkuCisKKyAgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGZpbGUgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggZGVmYXVsdCB2YWx1ZXMKKyAgYXQgdGhlIGZpcnN0IHJ1bi4KKworCisKKzcuIEF1ZGlvIGluIFNETCBhcHBsaWNhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXVkaW8gZWZmZWN0cyBhcmUgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBmZWF0dXJlcyBpbiBnYW1lcy4gQ3JlYXRpbmcgYXVkaW8KK2VmZmVjdHMgaW4gc3luYyB3aXRoIHRoZSBnYW1lIGFuZCB3aXRob3V0IGhpY2t1cHMgYW5kIHBhdXNlcyBpbiB0aGUgYXVkaW8gYXJlCit2ZXJ5IGltcG9ydGFudCB0aGluZ3MuCisKK0hvd2V2ZXIgdGhlcmUgYXJlIG11bHRpdGhyZWFkZWQgU0RMIGFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgdGlnaHQgbG9vcHMgYXMgdGhlaXIKK21haW4gbG9naWMgbG9vcC4gVGhpcyBraWxscyBwZXJmb3JtYW5jZSBpbiBPUy8yLCBhbmQgdGFrZXMgdG9vIG11Y2ggQ1BVIGZyb20KK290aGVyIHRocmVhZHMgaW4gdGhlIHNhbWUgcHJvY2VzcywgZm9yIGV4YW1wbGUgZnJvbSB0aGUgdGhyZWFkIHRvIGNyZWF0ZSB0aGUgCitzb3VuZCBlZmZlY3RzLgorCitGb3IgdGhpcyByZWFzb24sIHRoZSBPUy8yIHBvcnQgb2YgU0RMIGNhbiBiZSBpbnN0cnVjdGVkIHRvIHJ1biB0aGUgYXVkaW8gdGhyZWFkCitpbiBoaWdoIHByaW9yaXR5LCB3aGljaCBtYWtlcyBzdXJlIHRoYXQgdGhlcmUgd2lsbCBiZSBlbm91Z2ggdGltZSBmb3IgdGhlIAorcHJvY2Vzc2luZyBvZiB0aGUgYXVkaW8gZGF0YS4KKworQXQgZGVmYXVsdCwgU0RMLzIgcnVucyB0aGUgYXVkaW8gdGhyZWFkIGF0IEZvcmVncm91bmRTZXJ2ZXIrMCBwcmlvcml0eS4gV2VsbCAKK3dyaXR0ZW4gYW5kIHdlbGwgYmVoYXZpbmcgU0RMIGFwcGxpY2F0aW9ucyBzaG91bGQgd29yayB3ZWxsIGluIHRoaXMgbW9kZS4KK0ZvciBvdGhlciBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gdGVsbCBTREwvMiB0byBydW4gdGhlIGF1ZGlvIHRocmVhZCBhdCAKK1RpbWVDcml0aWNhbCBwcmlvcml0eSBieSBzZXR0aW5nIGFuIGVudi52YXJpYWJsZSBiZWZvcmUgc3RhcnRpbmcgdGhlIFNETCBhcHA6CisKKyAgICBTRVQgU0RMX1VTRV9USU1FQ1JJVElDQUxfQVVESU89MQorCitQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgYSBiaXQgcmlza3ksIGJlY2F1c2UgaWYgdGhlIFNETCBhcHBsaWNhdGlvbiBydW5zIGEKK3RpZ2h0IGluZmluaXRlIGxvb3AgaW4gdGhpcyB0aHJlYWQsIHRoaXMgd2lsbCBtYWtlIHRoZSB3aG9sZSBzeXN0ZW0gCit1bnJlc3BvbnNpdmUsIHNvIHVzZSBpdCB3aXRoIGNhcmUsIGFuZCBvbmx5IGZvciBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIGl0IQorCisKKworOC4gTmV4dCBzdGVwcy4uLgorLS0tLS0tLS0tLS0tLS0tLQorCitUaGluZ3MgdG8gZG86CistIEltcGxlbWVudCBtaXNzaW5nIHN0dWZmcyAobG9vayBmb3IgJ1RPRE8nIHN0cmluZyBpbiBzb3VyY2UgY29kZSEpCistIEZpbmlzaCB2aWRlbyBkcml2ZXIgKHRoZSAnd2luY29tbW9uJyBjYW4gYmUgYSBnb29kIGV4YW1wbGUgZm9yIG1pc3NpbmcKKyAgdGhpbmdzIGxpa2UgYXBwbGljYXRpb24gaWNvbiBhbmQgc28gb24uLi4pCistIEVuYWJsZSBNTVgvU1NFL1NTRTIgYWNjZWxlcmF0aW9uIGZ1bmN0aW9ucworLSBSZXdyaXRlIENEUk9NIHN1cHBvcnQgdXNpbmcgRE9TIElvY3RsIGZvciBiZXR0ZXIgc3VwcG9ydC4KKworCisKKzkuIENvbnRhY3RzCistLS0tLS0tLS0tLQorCisgICBZb3UgY2FuIGNvbnRhY3QgdGhlIGRldmVsb3BlcnMgZm9yIGJ1Z3M6CisKKyAgIEFyZWEJCQkJCURldmVsb3BlcgkJZW1haWwKKyAgIEdlbmVyYWwgKEF1ZGlvL1ZpZGVvL1N5c3RlbSkJCURvb2RsZQkJCWRvb2RsZUBzY2VuZXJneS5kZm1rLmh1CisgICBDRFJPTSBhbmQgSm95c3RpY2sJCQlDYWV0YW5vCQkJZGFuaWVsQGNhZXRhbm8uZW5nLmJyCisKKyAgIE5vdGljZSBob3dldmVyIHRoYXQgU0RMLzIgaXMgJ2luIGRldmVsb3BtZW50JyBzdGFnZSBzbyAuLi4gaWYgeW91IHdhbnQgdG8gaGVscCwKK3BsZWFzZSwgYmUgb3VyIGd1ZXN0IGFuZCBjb250YWN0IHVzIQorCisKKworMTAuIENoYW5nZWxvZyBvZiB0aGUgT1MvMiBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVmVyc2lvbiAxLjIuMTAgLSAyMDA2LTA1LTE3ICAtIERvb2RsZQorIC0gU21hbGwgbW9kaWZpY2F0aW9ucyBmb3IgdjEuMi4xMCByZWxlYXNlCisgLSBDaGFuZ2VkIERMTCBuYW1lIHRvIGluY2x1ZGUgdmVyc2lvbiBpbmZvIChjdXJyZW50bHkgU0RMMTIuZGxsKQorCitWZXJzaW9uIDEuMiAtIDIwMDYtMDUtMDEgIC0gRG9vZGxlCisgLSBNb2RpZmllZCBtYWtlZmlsZSBzeXN0ZW0gdG8gaGF2ZSBvbmx5IG9uZSBtYWtlZmlsZQorIC0gSW5jbHVkZWQgRlNMaWIgaGVhZGVycywgRExMIGFuZCBMSUIgZmlsZQorCitWZXJzaW9uIDEuMiAtIDIwMDYtMDItMjYgIC0gRG9vZGxlCisgLSBVcGRhdGVkIHRoZSBvZmZpY2lhbCBTREwgdmVyc2lvbiB3aXRoIHRoZSBPUy8yIHNwZWNpZmljIGNoYW5nZXMuCisgLSBBZGRlZCBzdXBwb3J0IGZvciByZWFsIHVuaWNvZGUga2V5Y29kZSBjb252ZXJzaW9uLgorCitWZXJzaW9uIDEuMi43IC0gMjAwNi0wMS0yMCAgLSBEb29kbGUKKyAtIEFkZGVkIHN1cHBvcnQgZm9yIHNlbGVjdGl2ZWx5IHVzaW5nIHRpbWVjcml0aWNhbCBwcmlvcml0eSBmb3IKKyAgIGF1ZGlvIHRocmVhZHMgYnkgU0RMX1VTRV9USU1FQ1JJVElDQUxfQVVESU8gZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAoZS5nLjogCisgICAgU0VUIFNETF9VU0VfVElNRUNSSVRJQ0FMX0FVRElPPTEKKyAgICBkb3Nib3guZXhlCisgICApCisKK1ZlcnNpb24gMS4yLjcgLSAyMDA1LTEyLTIyICAtIERvb2RsZQorIC0gQWRkZWQgc3VwcG9ydCBmb3IgcHJvcG9ydGlvbmFsIFNETCB3aW5kb3dzLgorICAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIGhhdmUgcHJvcG9ydGlvbmFsIChhc3BlY3Qta2VlcGluZykgd2luZG93cyBmb3IKKyAgIGEgZ2l2ZW4gU0RMIGFwcGxpY2F0aW9uOiBFaXRoZXIgc2V0IHRoZSBTRExfVVNFX1BST1BPUlRJT05BTF9XSU5ET1cKKyAgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNvbWV0aGluZyBiZWZvcmUgc3RhcnRpbmcgdGhlIGFwcGxpY2F0aW9uCisgICAoZS5nLjogCisgICAgU0VUIFNETF9VU0VfUFJPUE9SVElPTkFMX1dJTkRPVz0xCisgICAgZG9zYm94LmV4ZQorICAgKQorICAgb3IsIGlmIHlvdSBoYXZlIHRoZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCwgdGhlbiBTREwxMi5ETEwgd2lsbAorICAgY3JlYXRlIGEgZmlsZSBpbiB0aGF0IGRpcmVjdG9yeSBjYWxsZWQgLnNkbC5wcm9wb3J0aW9uYWxzLCBhbmQgeW91IGNhbgorICAgcHV0IHRoZXJlIHRoZSBuYW1lIG9mIGV4ZWN1dGFibGUgZmlsZXMgdGhhdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFkZQorICAgcHJvcG9ydGlvbmFsLgorCitWZXJzaW9uIDEuMi43IC0gMjAwNS0xMC0xNCAgLSBEb29kbGUKKyAtIEVuYWJsZWQgRXhjZXB0aW9uIGhhbmRsZXIgY29kZSBpbiBGU0xpYiB0byBiZSBhYmxlIHRvIHJlc3RvcmUgb3JpZ2luYWwKKyAgIGRlc2t0b3AgdmlkZW8gbW9kZSBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBjcmFzaGVzLgorIC0gQWRkZWQgdGhlIG1pc3NpbmcgRlNMaWJfVW5pbml0aWFsaXplKCkgY2FsbCBpbnRvIFNETC4KKyAgIChUaGUgbGFjayBvZiBpdCBkaWQgbm90IGNhdXNlIHByb2JsZW1zLCBidXQgaXQncyBjbGVhbmVyIHRoaXMgd2F5LikKKyAtIEZpeGVkIGEgbW91c2UgcHJvYmxlbSBpbiBGdWxsc2NyZWVuIG1vZGUgd2hlcmUgYW55IG1vdXNlIGNsaWNrCisgICByZS1jZW50ZXJlZCB0aGUgbW91c2UuCisKK1ZlcnNpb24gMS4yLjcgLSAyMDA1LTEwLTA5ICAtIERvb2RsZQorIC0gSW1wbGVtZW50ZWQgd2luZG93IGljb24gc3VwcG9ydAorCitWZXJzaW9uIDEuMi43IC0gMjAwNS0xMC0wMyAgLSBEb29kbGUKKyAtIFJld29ya2VkIHNlbWFwaG9yZSBzdXBwb3J0IGFnYWluCisgLSBUdW5lZCB0aHJlYWQgcHJpb3JpdGllcworCitWZXJzaW9uIDEuMi43IC0gMjAwNS0xMC0wMiAgLSBEb29kbGUKKyAtIEFkZGVkIHN1cHBvcnQgZm9yIGN1c3RvbSBtb3VzZSBwb2ludGVycworIC0gRml4ZWQgV01fQ0xPU0UgcHJvY2Vzc2luZzogZ2l2ZSBhIGNoYW5jZSB0byBTREwgYXBwIHRvIGFzayB1c2VyLi4uCisgLSBBZGRlZCBzdXBwb3J0IGZvciBNTVgtYWNjZWxlcmF0ZWQgYXVkaW8gbWl4ZXJzCisgLSBPdGhlciBzbWFsbCBmaXhlcworCitWZXJzaW9uIDEuMi43IC0gMjAwNS0wOS0xMiAgLSBEb29kbGUKKyAtIFNtYWxsIGZpeGVzIGZvciBEb3NCb3ggaW5jb3Jwb3JhdGVkIGludG8gcHVibGljIHJlbGVhc2UKKyAtIEZpeGVkIHNlbWFwaG9yZSBzdXBwb3J0IChTRExfc3lzc2VtLmMpCisgLSBGaXhlZCBGU0xpYiB0byBoYXZlIGdvb2QgY2xpcHBpbmcgaW4gc2NhbGVkIHdpbmRvdyBtb2RlLAorICAgYW5kIHRvIHByZXZlbnQgb2NjYXNpb25hbCBkZXNrdG9wIGZyZWV6ZXMuCisKK1ZlcnNpb24gMS4yLjcgLSAyMDA0LTA5LTA4YSAtIENhZXRhbm8KKwktIEltcHJvdmVkIGpveXN0aWNrIHN1cHBvcnQgKGdlbmVyYWwgdmVyaWZpY2F0aW9ucyBhYm91dCBoYXJkd2FyZSkuCisJLSBBZGRlZCBzdXBwb3J0IHVwIHRvIDggYnV0dG9ucyBpbiAyIGF4ZXMgam95c3RpY2tzIGFuZCA2IGJ1dHRvbnMgaW4gMyBheGVzIGpveXN0aWNrcy4KKwktIEFkZGVkIHN1cHBvcnQgdG8gZW52aXJvbm1lbnQgdmFyaWFibGUgU0RMX09TMl9KT1lTVElDSyB0byBzcGVjaWZ5IGEgam95c3RpY2suCisJLSBJbXByb3ZlZCBKb3lzdGljayB0ZXN0IHRvIGhhbmRsZSBldmVyeSB0eXBlIG9mIGpveXN0aWNrIGFuZCBkaXNwbGF5IG9ubHkgcmVsZXZhbnQgaW5mb3JtYXRpb24uCisJLSBNZXJnZWQgd2l0aCBEb29kbGUgMjAwNC0wOS0wOAorCS0gTGl0dGxlIHRpZCB1cCBpbiBSRUFETUUuT1MyCisJLSBBZGRlZCBleHBsYW5hdGlvbiBhYm91dCBTRExfT1MyX0pPWVNUSUNLIGVudmlyb25tZW50IHZhcmlhYmxlIG9uIFJFQURNRS5PUzIKKworVmVyc2lvbiAxLjIuNyAtIDIwMDQtMDktMDcgLSBDYWV0YW5vCisJLSBNZXJnZWQgd2l0aCBjaGFuZ2VzIGluIGhlYWRlcnMgZm9yIEdDQyBjb21waWxpbmcuCisJLSBBZGRlZCBKb3lzdGljayBzdXBwb3J0IHVzaW5nIGJhc2ljIElCTSBHQU1FJCBzdXBwb3J0LCBhbGxvd2luZyBpdCB0byB3b3JrIHdpdGggYWxsIGpveXN0aWNrIGRyaXZlcnMgc2luY2UgT1MvMiAyLjEuCisJLSBJbXByb3ZlZCBqb3lzdGljayBkZXRlY3Rpb24gKGhhY2tlZCEpLiBPUy8yIGRvIG5vdCBhbGxvdyByZWFsIGpveXN0aWNrIGRldGVjdGlvbiwgc28uLi4gCisJLSBNb2RpZmllZCBtYWtlZmlsZSBpbiB0ZXN0IHRvIGNvbXBpbGUgInRlc3Rqb3lzdGljayIuIEFueXdheSwgaXQncyB1c2VsZXNzLCBzaW5jZSBpdCBzZWVtcyB0byBjYXVzZSBhIGxvdCBvZiB0cm91YmxlIGluIE9TLzIgKGJlY2F1c2Ugb3MgdmlkZW8gcm91dGluZXMsIG5vdCBKb3lzdGljayBzdXBwb3J0KS4KKwktIENyZWF0ZWQgc2VwYXJhdGVkIEpveXN0aWNrIHRlc3QgcHJvZ3JhbSB0byB0ZXN0IG9ubHkgam95c3RpY2sgZnVuY3Rpb25zLgorCS0gSW1wcm92ZWQgam95c3RpY2sgYXV0by1jZW50ZXJpbmcuCisJLSBJbXByb3ZlZCB0aGUgY29vcmRpbmF0ZSBjb3JyZWN0aW9uIHJvdXRpbmUgdG8gdXNlIHR3byBzY2FsZSBmYWN0b3JzIGZvciBlYWNoIGF4aXMuCisKK1ZlcnNpb24gMS4yLjcgLSAyMDA0LTA3LTA1IC0gQ2FldGFubworCS0gQ29ycmVjdGVkIHRoZSB0aW1lIHJldHVybmVkIGJ5IHN0YXR1cyBpbiBDRFJPTSBzdXBwb3J0IChpdCB3YXMgaW5jb3JyZWN0KQorCS0gQWRkZWQgdGhlIHRlc3RjZHJvbS5jIGFuZCBjb3JyZWN0ZWQgdGhlIGxpbmtpbmcgZGlyZWN0aXZlIChpdCB3YXMgY2F1c2luZyBhbiBlcnJvcikKKworVmVyc2lvbiAxLjIuNyAtIDIwMDQtMDctMDJhIC0gQ2FldGFubworCS0gQ29ycmVjdGVkIGEgbGl0dGxlIHByb2JsZW0gaW4gYSBjb21tZW50IGF0IFNETC0xLjIuN1x0ZXN0XHRvcnR1cmV0aHJlYWQuYywgbGluZSAxOCAobWlzc2luZyAqLywgbmVzdGVkIGNvbW1lbnQpCisJLSBBZGRlZCBDRFJPTSBzdXBwb3J0IHRvIHRyZWUgKFNETC0xLjIuN1xzcmNcY2Ryb21cb3MyXFNETF9zeXNjZHJvbS5jKQorCS0gTW9kaWZpZWQgbWFrZWZpbGUgKFNETC0xLjIuN1xzcmNcbWFrZWZpbGVzLndhdCBhbmQgU0RMLTEuMi43XHdhdGNvbS5taWYpIHRvIGJ1aWxkIHdpdGggQ0RST00gc3VwcG9ydAorCS0gQWRkZWQgdGhlICJleHRyYSIgU0RMX3R5cGVzLmggZm9yZ290dGVuIGluIDIwMDQtMDctMDIgdmVyc2lvbi4KKworPEVuZC1PZi1GaWxlPgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5QUzMgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLlBTMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY0NjdkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5QUzMKQEAgLTAsMCArMSwyOSBAQAorCitTREwgb24gU29ueSBQbGF5c3RhdGlvbjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbnN0YWxsYXRpb246CisgIEZpcnN0LCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoZSBDZWxsIFNESworICAtIERvd25sb2FkIHRoZSBDZWxsIFNESyBpbnN0YWxsZXIgUlBNIGFuZCBJU08gaW1hZ2VzIHRvCisgICAgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHN1Y2ggYXMgL3RtcC9jZWxsc2RrLgorICAtIE1vdW50IHRoZSBpbWFnZTogbW91bnQgLW8gbG9vcCBDZWxsU0RLLURldmVsLUZlZG9yYV8zLjEuMC4wLjAuaXNvIC90bXAvY2VsbHNkaworICAtIEluc3RhbGwgdGhlIFNESyBpbnN0YWxsZXI6IHJwbSAtaXZoIGNlbGwtaW5zdGFsbC0zLjEuMC0wLjAubm9hcmNoLnJwbQorICAtIEluc3RhbGwgdGhlIFNESzogY2QgL29wdC9jZWxsICYmIC4vY2VsbHNkayAtLWlzbyAvdG1wL2NlbGxzZGtpc28gaW5zdGFsbAorCisgIFlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIFNQVS1saWJzIGJlZm9yZSBpbnN0YWxsaW5nIFNETAorICAtIEdvIHRvIFNETC0xLjIvc3JjL3ZpZGVvL3BzMy9zcHVsaWJzLworICAtIFJ1biBtYWtlICYmIG1ha2UgaW5zdGFsbAorCisgIEZpbmFsbHksIGluc3RhbGwgU0RMCisgIC0gR28gdG8gU0RMLTEuMi8gYW5kIGJ1aWxkIFNETCBsaWtlIGFueSBvdGhlciBHTlUgc3R5bGUgcGFja2FnZS4KKyAgZS5nLgorICAgIC0gQnVpbGQgdGhlIGNvbmZpZ3VyZS1zY3JpcHQgd2l0aCAuL2F1dG9nZW4uc2gKKyAgICAtIENvbmZpZ3VyZSBTREwgZm9yIHlvdXIgbmVlZHM6IC4vY29uZmlndXJlIC0tZW5hYmxlLXZpZGVvLXBzMyAuLi4KKyAgICAtIEJ1aWxkIGFuZCBpbnN0YWxsIGl0OiBtYWtlICYmIG1ha2UgaW5zdGFsbAorCisKK1RvZG86CisgIC0gbW91c2Uva2V5Ym9hcmQvY29udHJvbGxlciBzdXBwb3J0CisKK0hhdmUgZnVuIQorICBEaXJrIEhlcnJlbmRvZXJmZXIgPGQuaGVycmVuZG9lcmZlciBbYXRdIGRlIFtkb3QgaWJtIFtkb3RdIGNvbT4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuUGljb0dVSSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuUGljb0dVSQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGI2YmVkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5QaWNvR1VJCkBAIC0wLDAgKzEsNTAgQEAKKyA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVXNpbmcgU0RMIHdpdGggUGljb0dVSQorID09PT09PT09PT09PT09PT09PT09PT09PQorCistIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgTWljYWggRG93dHkgPG1pY2FoamRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCitQaWNvR1VJIGlzIGEgc2NhbGFibGUgR1VJIHN5c3RlbSB3aXRoIGEgdW5pcXVlIGFyY2hpdGVjdHVyZSwgcHJpbWFyaWx5IGZvY3VzZWQKK29uIHNjYWxhYmlsaXR5IHRvIHZhcmlvdXMgZW1iZWRkZWQgc3lzdGVtcy4gWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24KK2luY2x1ZGluZyBhIEZBUSBhdCBodHRwOi8vcGljb2d1aS5vcmcKKworVG8gdXNlIHRoZSBwYXRjaDoKKworICAxLiBXaGVuIGNvbXBpbGluZywgYWRkIHRoZSAiLS1lbmFibGUtdmlkZW8tcGljb2d1aSIgc3dpdGNoIHRvIC4vY29uZmlndXJlCisKKyAgMi4gV2hlbiBydW5uaW5nIHlvdXIgcHJvZ3JhbSwgZW5zdXJlIHRoYXQgdGhlIHBpY29ndWkgZHJpdmVyIGZvciBTREwKKyAgICAgaXMgaW4gdXNlIGJ5IHNldHRpbmcgdGhlIFNETF9WSURFT0RSSVZFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSAKKyAgICAgdG8gInBpY29ndWkiLgorCisgIDMuIFRoZSBwcm9ncmFtIG11c3QgYWxzbyBiZSBsaW5rZWQgdG8gdGhlIEMgY2xpZW50IGxpYnJhcnkgZm9yIFBpY29HVUkKKyAgICAgKGxpYnBndWkuc28pLiBJZiB0aGUgcHJvZ3JhbSBpcyBiZWluZyBjb21waWxlZCB3aXRoIGEgcGF0Y2hlZCBTREwgCisgICAgIGluc3RhbGxlZCB0aGlzIHNob3VsZCBiZSBkb25lIGF1dG9tYXRpY2FsbHkuIElmIHlvdSB3YW50IHRvIHVzZSBhbgorICAgICBleGlzdGluZyBiaW5hcnkgd2l0aCBQaWNvR1VJLCB5b3UgY2FuIHNldCB0aGUgTERfUFJFTE9BRCBlbnZpcm9ubWVudAorICAgICB2YXJpYWJsZSB0byB0aGUgcGF0aCBvZiB5b3VyIGxpYnBndWkuc28gZmlsZS4KKworQ2FwYWJpbGl0aWVzOgorCisgIFNvIGZhciBvbmx5IGJhc2ljIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgb24gdHJ1ZSBjb2xvciAobGluZWFyMTYvMjQvMzIpCisgIGRldmljZXMuIEFjY2Vzc2luZyBhIG1lbW9yeSBtYXBwZWQgYml0bWFwLCB1cGRhdGluZyB0aGUgZGlzcGxheSwgYW5kIGhhbmRsaW5nCisgIG1vdXNlL2tleWJvYXJkIGlucHV0LiBUaGlzIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gdGVzdGVkIHdpdGggc2V2ZXJhbAorICBhcHBsaWNhdGlvbnMsIGluY2x1ZGluZyBtcGxheWVyLCBYaW5lLCBzbGRyb2lkcywgYW5kIEFidXNlLgorCitUT0RPIGxpc3Q6CisKKyAgLSBZVVYgb3ZlcmxheXMgd2lsbCBiZSBoZWxwZnVsIGZvciB3YXRjaGluZyB2aWRlbyBvbiBzZXQgdG9wIGJveGVzIG9yIG90aGVyCisgICAgZW1iZWRkZWQgZGV2aWNlcyB0aGF0IGhhdmUgc29tZSBncmFwaGljcyBhY2NlbGVyYXRpb24gaGFyZHdhcmUKKworICAtIEFjY291bnQgZm9yIHJvdGF0ZWQgYml0bWFwIHN0b3JhZ2UgaW4gcGdzZXJ2ZXIKKworICAtIFN1cHBvcnQgZm9yIGhpZGluZyBvciBjaGFuZ2luZyB0aGUgY3Vyc29yCisKKyAgLSBUaGUgZGlzcGxheSBzaG91bGQgYmUgY2VudGVyZWQgd2hlbiB0aGUgU0RMIGFwcGxpY2F0aW9uIGlzIHNtYWxsZXIKKyAgICB0aGFuIHRoZSBQaWNvR1VJIHBhbmVsCisKKyAgLSBGdWxsc2NyZWVuIG9yIGFueSBvdGhlciBzcGVjaWFsIG1vZGVzCisKKyAgLSBTdXBwb3J0IGZvciBpbmRleGVkIGFuZCBncmF5c2NhbGUgbW9kZXMKKworICAtIFByb2JhYmx5IG11Y2ggbW9yZS4uLgorCistLS0gVGhlIEVuZCAtLS0KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuUG9ydGluZyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuUG9ydGluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjYxOTkzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5Qb3J0aW5nCkBAIC0wLDAgKzEsNTYgQEAKKworKiBQb3J0aW5nIFRvIEEgTmV3IFBsYXRmb3JtCisKKyAgVGhlIGZpcnN0IHRoaW5nIHlvdSBoYXZlIHRvIGRvIHdoZW4gcG9ydGluZyB0byBhIG5ldyBwbGF0Zm9ybSwgaXMgbG9vayBhdAoraW5jbHVkZS9TRExfcGxhdGZvcm0uaCBhbmQgY3JlYXRlIGFuIGVudHJ5IHRoZXJlIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uCitUaGUgc3RhbmRhcmQgZm9ybWF0IGlzIF9fUExBVEZPUk1fXywgd2hlcmUgUExBVEZPUk0gaXMgdGhlIG5hbWUgb2YgdGhlIE9TLgorSWRlYWxseSBTRExfcGxhdGZvcm0uaCB3aWxsIGJlIGFibGUgdG8gYXV0by1kZXRlY3QgdGhlIHN5c3RlbSBpdCdzIGJ1aWxkaW5nCitvbiBiYXNlZCBvbiBDIHByZXByb2Nlc3NvciBzeW1ib2xzLgorCitUaGVyZSBhcmUgdHdvIGJhc2ljIHdheXMgb2YgYnVpbGRpbmcgU0RMIGF0IHRoZSBtb21lbnQ6CisKKzEuIFRoZSAiVU5JWCIgd2F5OiAgLi9jb25maWd1cmU7IG1ha2U7IG1ha2UgaW5zdGFsbAorCisgICBJZiB5b3UgaGF2ZSBhIEdOVWlzaCBzeXN0ZW0sIHRoZW4geW91IG1pZ2h0IHRyeSB0aGlzLiAgRWRpdCBjb25maWd1cmUuaW4sCisgICB0YWtlIGEgbG9vayBhdCB0aGUgbGFyZ2Ugc2VjdGlvbiBsYWJlbGxlZDoKKwkiU2V0IHVwIHRoZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0hIgorICAgQWRkIGEgc2VjdGlvbiBmb3IgeW91ciBwbGF0Zm9ybSwgYW5kIHRoZW4gcmUtcnVuIGF1dG9nZW4uc2ggYW5kIGJ1aWxkIQorCisyLiBVc2luZyBhbiBJREU6CisKKyAgIElmIHlvdSdyZSB1c2luZyBhbiBJREUgb3Igb3RoZXIgbm9uLWNvbmZpZ3VyZSBidWlsZCBzeXN0ZW0sIHlvdSdsbCBwcm9iYWJseQorICAgd2FudCB0byBjcmVhdGUgYSBjdXN0b20gU0RMX2NvbmZpZy5oIGZvciB5b3VyIHBsYXRmb3JtLiAgRWRpdCBTRExfY29uZmlnLmgsCisgICBhZGQgYSBzZWN0aW9uIGZvciB5b3VyIHBsYXRmb3JtLCBhbmQgY3JlYXRlIGEgY3VzdG9tIFNETF9jb25maWdfe3BsYXRmb3JtfS5oLAorICAgYmFzZWQgb24gU0RMX2NvbmZpZy5oLm1pbmltYWwgYW5kIFNETF9jb25maWcuaC5pbgorCisgICBBZGQgdGhlIHRvcCBsZXZlbCBpbmNsdWRlIGRpcmVjdG9yeSB0byB0aGUgaGVhZGVyIHNlYXJjaCBwYXRoLCBhbmQgdGhlbiBhZGQKKyAgIHRoZSBmb2xsb3dpbmcgc291cmNlcyB0byB0aGUgcHJvamVjdDoKKwlzcmMvKi5jCisJc3JjL2F1ZGlvLyouYworCXNyYy9jZHJvbS8qLmMKKwlzcmMvY3B1aW5mby8qLmMKKwlzcmMvZXZlbnRzLyouYworCXNyYy9maWxlLyouYworCXNyYy9qb3lzdGljay8qLmMKKwlzcmMvc3RkbGliLyouYworCXNyYy90aHJlYWQvKi5jCisJc3JjL3RpbWVyLyouYworCXNyYy92aWRlby8qLmMKKwlzcmMvYXVkaW8vZGlzay8qLmMKKwlzcmMvdmlkZW8vZHVtbXkvKi5jCisJc3JjL2pveXN0aWNrL2R1bW15LyouYworCXNyYy9jZHJvbS9kdW1teS8qLmMKKwlzcmMvdGhyZWFkL2dlbmVyaWMvKi5jCisJc3JjL3RpbWVyL2R1bW15LyouYworCXNyYy9sb2Fkc28vZHVtbXkvKi5jCisKKworT25jZSB5b3UgaGF2ZSBhIHdvcmtpbmcgbGlicmFyeSB3aXRob3V0IGFueSBkcml2ZXJzLCB5b3UgY2FuIGdvIGJhY2sgdG8gZWFjaAorb2YgdGhlIG1ham9yIHN1YnN5c3RlbXMgYW5kIHN0YXJ0IGltcGxlbWVudGluZyBkcml2ZXJzIGZvciB5b3VyIHBsYXRmb3JtLgorCitJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zLCBkb24ndCBoZXNpdGF0ZSB0byBhc2sgb24gdGhlIFNETCBtYWlsaW5nIGxpc3Q6CisJaHR0cDovL3d3dy5saWJzZGwub3JnL21haWxpbmctbGlzdC5waHAKKworRW5qb3khCisJU2FtIExhbnRpbmdhCQkJCShzbG91a2VuQGxpYnNkbC5vcmcpCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuUU5YIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5RTlgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1YWZiZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuUU5YCkBAIC0wLDAgKzEsMTU1IEBACitSRUFETUUuUU5YIGJ5IE1pa2UgR29yY2hhayA8bWlrZUBtYWx2YS51YT4sIDxsZXN0YXRAaS5jb20udWE+CitMYXN0IGNoYW5nZWQgYXQgMjQgQXByIDIwMDQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RhYmxlIG9mIENvbnRlbnRzOgorCisxLiBPcGVuR0wuCisyLiBXaGVlbCBhbmQgbXVsdGktYnV0dG9uIG1vdXNlcy4KKzMuIENEUk9NIGhhbmRsaW5nIGlzc3Vlcy4KKzQuIEhhcmR3YXJlIHZpZGVvIG92ZXJsYXlzLgorNS4gU2hhcmVkIGxpYnJhcnkgYnVpbGRpbmcuCis2LiBTb21lIGJ1aWxkaW5nIGlzc3Vlcy4KKzcuIEVudmlyb25tZW50IHZhcmlhYmxlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorMS4gT3BlbkdMOgorCisgICAgT3BlbkdMIHdvcmtzIHdlbGwgYW5kIGlzIHN0YWJsZSwgYnV0IGZ1bGxzY3JlZW4gbW9kZSBoYXMgbm90ICBiZWVuCitoZWF2aWx5IHRlc3RlZCB5ZXQuCisgICAgSWYgeW91IGhhdmUgUU5YIFJ0UCB2ZXJzaW9uIDYuMS4wIG9yIGFib3ZlIHlvdSBtdXN0ICBkb3dubG9hZCAgdGhlCitQaG90b24zRCBydW50aW1lIGZyb20gaHR0cDovL2RldmVsb3BlcnMucW54LmNvbSBvciBpbnN0YWxsIGl0IGZyb20gdGhlCitwdWJsaWMgcmVwb3NpdG9yeSBvciBmcm9tIHRoZSBwdWJsaWMgQ0QsIGF2YWlsYWJsZSB3aXRoIFFOWC4gT1MgdmVyc2ktCitvbnMgYmVsb3cgNi4xLjAgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgV2hlbiBjcmVhdGluZyBhbiBPcGVuR0wgY29udGV4dCwgc29mdHdhcmUgcmVuZGVyZXIgbW9kZSBpcyBhcnRpZmktCitjaWFsbHkgc2VsZWN0ZWQgKFFTU0wgbWFkZSBhY2NlbGVyYXRpb24gIG9ubHkgIGZvciAgVm9vZG9vICBib2FyZHMgIGluCitmdWxsc2NyZWVuIG1vZGUsIHNvcnJ5IGJ1dCBJIGRvbid0IGhhdmUgdGhpcyBib2FyZCAgdG8gIHRlc3QgIE9wZW5HTCAtCittYXliZSBpdCB3b3JrcyBvciBtYXliZSBub3QgOikpLiBJZiB5b3UgIHdhbnQgIGFjY2VsZXJhdGlvbiAtIHlvdSAgY2FuCityZW1vdmUgb25lIGxpbmUgaW4gdGhlIHNvdXJjZSBjb2RlOiBmaW5kIHRoZSAgZmlsZSBTRExfcGhfaW1hZ2UuYyAgYW5kCityZW1vdmUgdGhlIGZvbGxvd2luZworCisgICAgT0dMQXR0cmliW09HTGFyZ2MrK109UEhPR0xfQVRUUklCX0ZPUkNFX1NXOworICAgICAKK2xpbmUgaW4gdGhlIHBoX1NldHVwT3BlbkdMQ29udGV4dCgpIGZ1bmN0aW9uIG9yIGNoYW5nZSB0aGUgYXJndW1lbnQgdG8KK1BIT0dMX0FUVFJJQl9GT1JDRV9IVyBvciBQSE9HTF9BVFRSSUJfRkFWT1JfSFcuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzIuIFdoZWVsIGFuZCBtdWx0aS1idXR0b24gbW91c2VzOgorCisgICAgUGhvdG9uIGVtaXRzICBrZXlib2FyZCAgZXZlbnRzIChrZXkgdXAgYW5kICBkb3duKSAgd2hlbiB0aGUgIG1vdXNlCit3aGVlbCBpcyBtb3ZlZC4gVGhlIGtleV9zY2FuIGZpZWxkIGFwcGVhcnMgdmFsaWQsIGFuZCBpdCBjb250YWlucyB6ZXJvLgorVGhhdCBpcyBhIGJhc2ljIG1ldGhvZCBvZiBkZXRlY3RpbmcgIG1vdXNlICB3aGVlbCBldmVudHMgdW5kZXIgUGhvdG9uLgorSXQgbG9va3MgbGlrZSBhIGhhY2ssIGJ1dCBpdCAgd29ya3MgZm9yIG1lIDopIG9uIHZhcmlvdXMgUEMgY29uZmlndXJhLQordGlvbnMuCisKK0kndmUgdGVzdGVkIGl0IG9uOgorCisxLiBHZW5pdXMgT3B0aWNhbCBOZXRTY3JvbGwvKyBQUy8yICgxIHdoZWVsKQorMi4gQTRUZWNoIE9wdGljYWwgR3JlYXRFeWUgV2hlZWxNb3VzZSBQUy8yLCAgbW9kZWw6IFdPUC0zNS4gICgyIHdoZWVscworICAgKyAyIGFkZGl0aW9uYWwgYnV0dG9ucykuIFRoZSB3aGVlbCBmb3IgdmVydGljYWwgc2Nyb2xsaW5nICB3b3JrcyBhcworICAgdXN1YWwsIGJ1dCB0aGUgc2Vjb25kIHdoZWVsIGZvciBob3Jpem9udGFsIHNjcm9sbGluZyBlbWl0cyAgdHdvIHNlLQorICAgcXVlbnRpYWwgZXZlbnRzIHVwIG9yIGRvd24sIHNvIGl0IGNhbiBwcm92aWRlIGZhc3RlciBzY3JvbGxpbmcgdGhhbgorICAgdGhlIGZpcnN0IHdoZWVsLiBBZGRpdGlvbmFsIGJ1dHRvbnMgZG9uJ3QgZW1pdCAgYW55ICBldmVudHMsIGJ1dCBpdAorICAgbG9va3MgbGlrZSB0aGV5J3JlIGhhbmRsZWQgYnkgcGhvdG9uIGluIGFuIHVudXN1YWwgd2F5IC0gbGlrZSBjbGljaworICAgdG8gZnJvbnQsIGJ1dCB3b3JrcyBub3Qgd2l0aCBhbnkgd2luZG93LCBsb29rcyBsaWtlIGEgZnVuIGJ1Zy1vLWZlLQorICAgYXR1cmUgOikuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzMuIENEUk9NIGhhbmRsaW5nIGlzc3VlczoKKworICAgIEFjY2VzcyB0byBDRFJPTSBjYW4gb25seSBiZSAgcHJvdmlkZWQgIHdpdGggICdyb290JyAgcHJpdmlsZWdlcy4gSQorY2FuJ3QgZG8gYW55dGhpbmcgYWJvdXQgdGhhdCwgL2Rldi9jZDAgaGFzIGJydy0tLS0tLS0gcGVybWlzc2lvbnMgIGFuZAorcm9vdDpyb290IHJpZ2h0cy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNC4gSGFyZHdhcmUgdmlkZW8gb3ZlcmxheXM6CisKKyAgICBPdmVybGF5cyBjYW4gZmxpY2tlciAgZHVyaW5nICB3aW5kb3cgIG1vdmVtZW50LCAgcmVzaXppbmcsIGV0Yy4gSXQKK2hhcHBlbnMgYmVjYXVzZSB0aGUgcGhvdG9uIGRyaXZlciB1cGRhdGVzIHRoZSByZWFsIHdpbmRvdyBjb250ZW50cyBiZS0KK2hpbmQgdGhlIG92ZXJsYXksIHRoZW4gZHJhd3MgdGhlIHRlbXBvcmFyeSBjaHJvbWEga2V5IGNvbG9yICBvdmVyICB0aGUKK3dpbmRvdyBjb250ZW50cy4gSXQgY2FuIGJlIGRvbmUgd2l0aG91dCB1c2luZyB0aGUgY2hyb21hIGtleSBidXQgIHRoYXQKK2NhdXNlcyB0aGUgb3ZlcmxheSB0byBhbHdheXMgYmUgb24gdG9wLiBTbyAgZmxpY2tlcmluZyAgZHVyaW5nICB3aW5kb3cKK21vdmVtZW50IGlzIHByZWZlcnJlZCBpbnN0ZWFkLgorICAgIERvdWJsZSBidWZmZXJpbmcgY29kZSBpcyB0ZW1wb3JhcmlseSBkaXNhYmxlZCBpbiB0aGUgcGhvdG9uIGRyaXZlcgorY29kZSwgYmVjYXVzZSBvbiBteSBHRjItTVggaXQgY2FuIGFjY2lkZW50YWxseSBjYXVzZSBhIGJ1ZmZlciAgc3dpdGNoLAord2hpY2ggY2F1c2VzIHRoZSBvbGQgZnJhbWUgdG8gc2hvdy4gUzMgU2F2YWdlNCBoYXMgdGhlICBzYW1lICBwcm9ibGVtLAorYnV0IEFUSSBSYWdlIDEyOCBkb2Vzbid0LiBJIHRoaW5rIGl0IGNhbiBiZSBmaXhlZCBsYXRlci4gQ3VycmVudCAgY29kZQord29ya3MgdmVyeSB3ZWxsLCBzbyBtYXliZSBkb3VibGUgYnVmZmVyaW5nIGlzIG5vdCBuZWVkZWQgcmlnaHQgbm93LgorICAgIFNvbWV0aGluZyBzdHJhbmdlIGhhcHBlbnMgd2hlbiB5b3UgdHJ5IHRvIG1vdmUgdGhlIHdpbmRvdyB3aXRoIHRoZQorb3ZlcmxheSBiZXlvbmQgdGhlIGxlZnQgYm9yZGVyICBvZiB0aGUgc2NyZWVuLiBUaGUgIG92ZXJsYXkgIHRyaWVzICB0bworc3RheSBhdCBwb3NpdGlvbiB4PTAsIGJ1dCB3aGVuIGF0dGVtcHRpbmcgdG8gbW92ZSBpdCAgYSAgYml0ICBtb3JlICBpdAoranVtcHMgdG8gcG9zaXRpb24geD0tNjAgKG9uIEdGMi1NWCwgb24gQVRJIFJhZ2UxMjggdGhpcyAgdmFsdWUgIGEgIGJpdAorc21hbGxlcikuIEl0J3MgcmVhbGx5IHN0cmFuZ2UsIGxvb2tzICBsaWtlICB0aGUgIG92ZXJsYXkgIGRvZXNuJ3QgbGlrZQorbmVnYXRpdmUgY29vcmRpbmF0ZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis1LiBTaGFyZWQgbGlicmFyeSBidWlsZGluZzoKKworICAgIEEgc2hhcmVkIGxpYnJhcnkgY2FuIGJlIGJ1aWx0LCBidXQgYmVmb3JlIHJ1bm5pbmcgIHRoZSAgYXV0b2dlbi5zaAorc2NyaXB0IHlvdSBtdXN0IG1hbnVhbGx5IGRlbGV0ZSB0aGUgbGlidG9vbC5tNCBzdHVmZiBmcm9tIHRoZSBhY2luY2x1LQorZGUubTQgZmlsZSAoaXQgY29tZXMgYWZ0ZXIgdGhlIEVTRCBkZXRlY3Rpb24gY29kZSB1cCB0byB0aGUgZW5kIG9mIHRoZQorZmlsZSksIGJlY2F1c2UgdGhlIGxpYnRvb2wgc3R1ZmYgaW4gdGhlIGFjaW5jbHVkZS5tNCBmaWxlIHdhcyB2ZXJ5IG9sZAoraW4gU0RMIGRpc3RyaWJ1dGlvbiBiZWZvcmUgdGhlIHZlcnNpb24gMS4yLjcgYW5kIGRvZXNuJ3Qga25ldyBhbnl0aGluZworYWJvdXQgUU5YLiBTREwgMS4yLjcgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIHRoZSAgbmV3IGxpYnRvb2wubTQgc2NyaXB0LAorYnV0IGFueXdheSAgaXQgIGlzICBicm9rZW4gOiksIEp1c3QgIHJlbW92ZSAgaXQsIHRoZW4gIHJ1biAibGlidG9vbGl6ZQorLS1mb3JjZSAtLWNvcHkiLCAgZGVsZXRlIHRoZSBmaWxlIGFjbG9jYWwubTQgaWYgaXQgaXMgZXhpc3RzIGFuZCBhZnRlcgordGhhdCBydW4gdGhlICBhdXRvZ2VuLnNoIHNjcmlwdC4gU0RMIDEuMi44IGNvbnRhaW5zICBmaXhlZCBsaWJ0b29sLm00LAorbHRtYWluLnNoIGFuZCBjb25maWcuc3ViIGZpbGVzLCBzbyB5b3UgIGNhbiAganVzdCAgcnVuICB0aGUgYXV0b2dlbi5zaAorc2NyaXB0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis2LiBTb21lIGJ1aWxkaW5nIGlzc3VlczoKKworICAgIEZlZWwgZnJlZSB0byBub3QgdXNlIHRoZSAtLWRpc2FibGUtc2hhcmVkIGNvbmZpZ3VyZSBvcHRpb24gaWYgeW91JwordmUgcmVhZCB0aGUgYWJvdmUgY29tbWVudCBhYm91dCAnU2hhcmVkICBsaWJyYXJ5ICBidWlsZGluZycuIE90aGVyd2lzZQordGhpcyAgb3B0aW9uICBpcyAgc3Ryb25nbHkgIHJlY29tbWVuZGVkLCBhcyAgd2l0aG91dCBpdCB0aGUgc2RsLWNvbmZpZworc2NyaXB0IHdpbGwgYmUgYnJva2VuLgorCisgICAgUnVuIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpdGhvdXQgeDExIHN1cHBvcnQsIGUuZy46CisKKyAgICBhKSBmb3IgT3BlbkdMIHN1cHBvcnQ6CisgICAgLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzciAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS12aWRlby14MTEgICAgIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2hhcmVkCisKKyAgICBiKSB3aXRob3V0IE9wZW5HTCBzdXBwb3J0OgorICAgIC4vY29uZmlndXJlIC0tcHJlZml4PS91c3IgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtdmlkZW8teDExICAgICBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLXNoYXJlZCAgICAgICAgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS12aWRlby1vcGVuZ2wKKworICAgIEFuZCBvZiBjb3Vyc2UgZG9udCBmb3JnZXQgdG8gc3BlY2lmeSAtLWRpc2FibGUtZGVidWcsIHdoaWNoICBpcyBvbgorYnkgZGVmYXVsdCwgdG8gZGlzYWJsZSBkZWJ1ZyBhbmQgZW5hYmxlIHRoZSBleHBlbnNpdmUgb3B0aW1pemF0aW9ucy4KKworICAgIEluIHRoZSB0ZXN0IGRpcmVjdG9yeSBhbHNvIHJ1biB0aGUgLi9jb25maWd1cmUgc2NyaXB0IHdpdGhvdXQKK3gxMSBzdXBwb3J0LCBlLmcuOgorCisgICAgLi9jb25maWd1cmUgIC0td2l0aC1zZGwtcHJlZml4PS91c3IgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIC0td2l0aC1zZGwtZXhlYy1wcmVmaXg9L3VzciAgICAgICBcCisgICAgICAgICAgICAgICAgIC0tcHJlZml4PS91c3IgLS13aXRob3V0LXgKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNy4gRW52aXJvbm1lbnQgdmFyaWFibGVzOgorCisgICAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgcGhvdG9uIGRyaXZlciAgaXMgIHNlbnNpYmxlIHRvIHRoZSAgZm9sbG93aW5nCitlbnZpcm9ubWVudGFsIHZhcmlhYmxlczoKKworICogU0RMX1BIT1RPTl9GVUxMU0NSRUVOX1JFRlJFU0ggLSB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlICBjb250cm9scwordGhlIHJlZnJlc2ggIHJhdGUgIGluICBhbGwgIGZ1bGxzY3JlZW4gIG1vZGVzLiBCZSAgY2FyZWZ1bGwgISEhIFBob3RvbgorZHJpdmVycyB1c3VhbGx5IGRvIG5vdCBjaGVja2luZyB0aGUgbWF4aW11bSAgcmVmcmVzaCByYXRlLCB3aGljaCB2aWRlbworYWRhcHRlciBvciBtb25pdG9yIHN1cHBvcnRzLgorCisgKiBTRExfVklERU9fV0lORE9XX1BPUyAtIGNhbiBiZSAgc2V0IGluIHRoZSAiWCxZIiBmb3JtYXQuICBJZiBYIGFuZCBZCitjb29yZGluYXRlcyBhcmUgYmlnZ2VyIHRoYW4gdGhlIGN1cnJlbnQgZGVza3RvcCByZXNvbHV0aW9uLCB0aGVuICB3aW4tCitkb3cgcG9zaXRpb25pbmcgYWNyb3NzICB2aXJ0dWFsICBjb25zb2xlcyBpcyBhY3RpdmF0ZWQuIElmIFggYW5kIFkgYXJlCitzbWFsbGVyIHRoYW4gdGhlIGRlc2t0b3AgcmVzb2x1dGlvbiAgdGhlbiAgd2luZG93ICBwb3NpdGlvbmluZyAgaW4gdGhlCitjdXJyZW50IGNvbnNvbGUgaXMgYWN0aXZhdGVkLiBUaGUgd29yZCAiY2VudGVyIiBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mCitjb29yZGluYXRlcywgaXQgIHByb2R1Y2VzICB0aGUgIHNhbWUgIGJlaGF2aW9yICBhcyAgU0RMX1ZJREVPX0NFTlRFUkVECitlbnZpcm9ubWVudGFsIHZhcmlhYmxlLgorCisgKiBTRExfVklERU9fQ0VOVEVSRUQgLSBpZiB0aGlzIGVudmlyb25tZW50YWwgdmFyaWFibGUgZXhpc3RzIHRoZW4gdGhlCit3aW5kb3cgY2VudGVyaW5nIGlzIHBlcmZvbWVkIGluIHRoZSBjdXJyZW50IHZpcnR1YWwgY29uc29sZS4KKworTm90ZXM6IFRoZSBTRExfVklERU9fQ0VOVEVSRUQgZW52aXJvbWVudGFsICB2YXJpYWJsZSAgaGFzIGdyZWF0ZXIgcHJpLQorb3JpdHkgdGhhbiB0aGUgU0RMX1ZJREVPX1dJTkRPV19QT1MgaW4gY2FzZSBpZiBib3RoIHZhcmlhYmxlcyBhcmUgc3VwLQorcGxpZWQgdG8gdGhlIGFwcGxpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5RdG9waWEgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLlF0b3BpYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTYyN2QxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5RdG9waWEKQEAgLTAsMCArMSw4NCBAQAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1VzaW5nIHRoZSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgd2l0aCBRdG9waWEvT1BJRQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSS4gIFNldHRpbmcgdXAgdGhlIFF0b3BpYSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4KKworICBUaGlzIGRvY3VtZW50IHdpbGwgbm90IGV4cGxhaW4gaG93IHRvIHNldHVwIHRoZSBRdG9waWEgZGV2ZWxvcG1lbnQKKyAgZW52aXJvbm1lbnQuIFRoYXQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlIGRvY3VtZW50LiBZb3UgY2FuIHJlYWQKKyAgbW9yZSBvbiB0aGlzIHN1YmplY3QgaW4gdGhpcyBleGNlbGxlbnQgaG93dG86CisKKwlodHRwOi8vd3d3LnphdXJ1c3pvbmUuY29tL2hvd3Rvcy9saW51eF9jb21waWxlcl9zZXR1cF9ob3d0by5odG1sCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSUkuICBCdWlsZGluZyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIGxpYnJhcmllcyB1c2luZyB0aGUgYXJtCisgICAgIGNyb3NzLWNvbXBpbGVyCisKKyAgVGhpcyBpcyBzb21ld2hhdCB0cmlja3kgc2luY2UgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIGJpbmFyaWVzCisgIGRpZmZlciBmcm9tIHRoZSBzdGFuZGFyZC4gQWxzbyB5b3Ugc2hvdWxkIGRpc2FibGUgZmVhdHVyZXMgbm90CisgIG5lZWRlZC4gVGhlIGNvbW1hbmQgYmVsb3cgd29ya3MgZm9yIG1lLiBOb3RlIHRoYXQgaXQncyBhbGwgb25lCisgIGxpbmUuIFlvdSBjYW4gYWxzbyBzZXQgdGhlIE5NLCBMRCBldGMgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgIHNlcGFyYXRlbHkuCisKKwlOTT1hcm0tbGludXgtbm0gTEQ9YXJtLWxpbnV4LWxkIENDPWFybS1saW51eC1nY2MgQ1hYPWFybS1saW51eC1nKysgUkFOTElCPWFybS1saW51eC1yYW5saWIgQVI9YXJtLWxpbnV4LWFyIC4vY29uZmlndXJlIC0tZW5hYmxlLXZpZGVvLXF0b3BpYSAtLWRpc2FibGUtdmlkZW8tZHVtbXkgLS1kaXNhYmxlLXZpZGVvLWZiY29uICAtLWRpc2FibGUtdmlkZW8tZGdhIC0tZGlzYWJsZS1hcnRzIC0tZGlzYWJsZS1lc2QgLS1kaXNhYmxlLWFsc2EgLS1kaXNhYmxlLWNkcm9tIC0tZGlzYWJsZS12aWRlby14MTEgLS1kaXNhYmxlLW5hc20gLS1wcmVmaXg9L29wdC9RdG9waWEvc2hhcnAvIGFybS11bmtub3duLWxpbnV4LWdudQorCisgIE9uZSB0aGluZyB0byBub3RlIGlzIHRoYXQgdGhlIGFib3ZlIGNvbmZpZ3VyZSB3aWxsIGluY2x1ZGUgam95c3RpY2sKKyAgc3VwcG9ydCwgZXZlbiB0aG91Z2ggeW91IGNhbid0IGhhdmUgam95c3RpY2tzIG9uIHRoZSBaYXVydXMuIFRoZQorICByZWFzb24gZm9yIHRoaXMgaXMgdG8gYXZvaWQgbGluayAvIGNvbXBpbGUgLyBydW50aW1lIGVycm9ycyB3aXRoCisgIGFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgam95c3RpY2sgc3VwcG9ydC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJSUkuICBCdWlsZGluZyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIHRlc3QgcHJvZ3JhbXM6CisKKyAgQWZ0ZXIgaW5zdGFsbGluZywgbWFraW5nIHN1cmUgdGhlIGNvcnJlY3Qgc2RsLWNvbmZpZyBpcyBpbiB5b3VyCisgIHBhdGgsIHJ1biBjb25maWd1cmUgbGlrZSB0aGlzOgorCisJTk09YXJtLWxpbnV4LW5tIExEPWFybS1saW51eC1sZCBDQz1hcm0tbGludXgtZ2NjIENYWD1hcm0tbGludXgtZysrIEFSPWFybS1saW51eC1hciAuL2NvbmZpZ3VyZSBhcm0tdW5rbm93bi1saW51eC1nbnUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJVi4gIEFwcGxpY2F0aW9uIHBvcnRpbmcgbm90ZXMKKworICBPbmUgdGhpbmcgSSBoYXZlIG5vdGljZWQgaXMgdGhhdCBhcHBsaWNhdGlvbnMgc29tZXRpbWVzIGRvbid0IGV4aXQKKyAgY29ycmVjdGx5LiBUaGVpciBpY29uIHJlbWFpbnMgaW4gdGhlIHRhc2tiYXIgYW5kIHRoZXkgdGVuZCB0bworICByZWxhdW5jaCB0aGVtc2VsdmVzIGF1dG9tYXRpY2FsbHkuIEkgYmVsaWV2ZSB0aGlzIHByb2JsZW0gZG9lc24ndAorICBvY2N1ciBpZiB5b3UgZXhpdCB5b3VyIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBleGl0KCkgbWV0aG9kLiBIb3dldmVyLAorICBpZiB5b3UgZW5kIG1haW4oKSB3aXRoICdyZXR1cm4gMDsnIG9yIHNvLCB0aGlzIHNlZW1zIHRvIGhhcHBlbi4KKworICBBbHNvIG5vdGUgdGhhdCB3aGVuIHJ1bm5pbmcgaW4gbGFuZHNjYXBlIG1vZGUgLSBpLmUgcmVxdWVzdGluZyBhCisgIHdpbmRvdyB0aGF0IGlzIEhFSUdIVCBwaXhlbHMgd2lkZSBhbmQgV0lEVEggcGl4ZWxzIGhpZ2gsIHdoZXJlIFdJRFRICisgIGFuZCBIRUlHSFQgbm9ybWFsbHkgaXMgMjQwIGFuZCAzMjAgLSB0aGUgaW1hZ2UgaXMgYmxpdHRlZCBzbyB0aGF0CisgIHRoZSBoYXJkd2FyZSBidXR0b25zIGFyZSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkaXNwbGF5LiBUaGlzIG1pZ2h0CisgIG5vdCBhbHdheXMgYmUgZGVzaXJhYmxlIGJ1dCBzdWNoIGlzIHRoZSBjb2RlIHRvZGF5LgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVi4gIEVuam95ISA6KQorCisgIElmIHlvdSBoYXZlIGEgcHJvamVjdCB5b3UnZCBsaWtlIG1lIHRvIGtub3cgYWJvdXQsIG9yIHdhbnQgdG8gYXNrIHF1ZXN0aW9ucywKKyAgZ28gYWhlYWQgYW5kIGpvaW4gdGhlIFNETCBkZXZlbG9wZXIncyBtYWlsaW5nIGxpc3QgYnkgc2VuZGluZyBlLW1haWwgdG86CisKKwlzZGwtcmVxdWVzdEBsaWJzZGwub3JnCisKKyAgYW5kIHB1dCAic3Vic2NyaWJlIiBpbnRvIHRoZSBzdWJqZWN0IG9mIHRoZSBtZXNzYWdlLiBPciBhbHRlcm5hdGl2ZWx5IHlvdQorICBjYW4gdXNlIHRoZSB3ZWIgaW50ZXJmYWNlOgorCisJaHR0cDovL3d3dy5saWJzZGwub3JnL21haWxtYW4vbGlzdGluZm8vc2RsCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWSS4gIFdoYXQgaXMgc3VwcG9ydGVkOgorCitLZXlib2FyZCAoU2hhcnAgWmF1cnVzKQorSGFyZHdhcmUgYnV0dG9ucworU3R5bHVzIGlucHV0IChtb3VzZSkKK1ZpZGVvLiBBbGxvd3MgZnVsbHNjcmVlbiBib3RoIGluIHBvcnRyYWl0IG1vZGUgKHVwIHRvIFdJRFRIeEhFSUdIVAorc2l6ZSB3aW5kb3cpIGFuZCBpbiBsYW5kc2NhcGUgbW9kZSAodXAgdG8gSEVJR0hUeFdJRFRIKS4gCisKK0FsbCBvdGhlciBTREwgZnVuY3Rpb25hbGl0eSB3b3JrcyBsaWtlIGEgbm9ybWFsIExpbnV4IHN5c3RlbSAodGhyZWFkcywKK2F1ZGlvIGV0YykuCisKKy0tIAorRGF2aWQgSGVkYm9yIDxkYXZpZEBoZWRib3Iub3JnPgoraHR0cDovL2RhdmlkLmhlZGJvci5vcmcvIAlodHRwOi8vZW9uZ2FtZXMuY29tLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLlJJU0NPUyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuUklTQ09TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjg1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLlJJU0NPUwpAQCAtMCwwICsxLDEzMCBAQAorUmVhZG1lIGZvciBSSVNDIE9TIHBvcnQgb2YgU0RMCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBkb2N1bWVudCBsYXN0IHVwZGF0ZWQgb24gMm5kIEZlYnJ1cmFyeSAyMDA2CisKK1RoaXMgaXMgYSBSSVNDIE9TIHBvcnQgb2YgdGhlIFNpbXBsZSBEaXJlY3QgTWVkaWEgTGF5ZXIgKFNETCkgYnkgQWxhbiBCdWNrbGV5IHdpdGggY29udHJpYnV0aW9ucyBmcm9tIFBldGVyIE5hdWxscy4KKworRGV0YWlscyBvZiB0aGUgU0RMIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vd3d3LmxpYnNkbC5vcmcuCisKK1RoZSBzb3VyY2UgY29kZSBpbmNsdWRpbmcgdGhlIFJJU0MgT1MgdmVyc2lvbiBjYW4gYmUgb2J0YWluZWQgZnJvbToKKworaHR0cDovL3d3dy5saWJzZGwub3JnLgorCitQcmUgYnVpbHQgbGlicmFyaWVzIGFuZCBtYW55IGdhbWVzIGFuZCBhcHBsaWNhdGlvbnMgY29tcGlsZWQgZm9yIFJJU0MgT1MgdXNpbmcgdGhpcyBsaWJyYXJ5IGNhbiBiZSBkb3dubG9hZGVkIGZyb20gVGhlIFVuaXggUG9ydGluZyBQcm9qZWN0IGF0IGh0dHA6Ly93d3cucmlzY29zLmluZm8vdW5peC8uCisKK1RoaXMgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIExHUEwgc2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMuCisKKworQ29tcGlsaW5nIGFwcGxpY2F0aW9ucyB1bmRlciBSSVNDIE9TCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQWRkIC1JU0RMOiBmb3IgdGhlIEMgY29tcGlsZXIgZmxhZ3MgaWYgeW91IGluY2x1ZGUgdGhlIGZpbGVzIGluIHRoZSBTREwgZGlyZWN0b3J5LiBlLmcuICNpbmNsdWRlICJTREwvU0RMLmgiCitBZGQgLUlTREw6U0RMIGZvciB0aGUgQyBjb21waWxlciBmbGFncyBpZiB5b3UgaW5jbHVkZSB0aGUgZmlsZXMgZGlyZWN0bHkuIGUuZy4gI2luY2x1ZGUgIlNETC9TREwuaCIKKworQWRkIC1MU0RMOiAtbFNETCB0byB0aGUgbGluayBzdGFnZSBvZiBjb21waWxhdGlvbi4KKworRm9yIGV4YW1wbGUsIHRvIGNvbXBpbGUgdGhlIHRlc3RiaXRtYXAuYyBzYW1wbGUgeW91IGNvdWxkIHVzZToKKworZ2NjIC1JU0RMOlNETCAtTFNETDogLWxTREwgdGVzdGJpdG1hcC5jIC1vdGVzdGJpdG1hcAorCisKK1JJU0MgT1MgcG9ydCBvZiBTREwgcnVudGltZSBpbmZvcm1hdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1J1bnRpbWUgcmVxdWlyZW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGxpYnJhcnkgY3VycmVudGx5IG5lZWRzIGEgbWluaW11bSBvZiBSSVNDIE9TIDMuNi4gVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgbGlicmFyeSAoYW5kIGEgbG90IG9mIHRoZSBwcm9ncmFtcyBidWlsdCB3aXRoIGl0KSBhbHNvIG5lZWQgbG9uZyBmaWxlIG5hbWVzLgorCitUbyB1c2UgdGhlIGF1ZGlvIHlvdSBhbHNvIG5lZWQgMTYgYml0IHNvdW5kIGFuZCB0byBoYXZlIGluc3RhbGxlZCB0aGUgRGlnaXRhbFJlbmRlciBtb2R1bGUgYnkgQW5kcmVhcyBEZWhtZWwgdmVyc2lvbiAwLjUxIGF2YWlsYWJsZSBmcm9tIGhpcword2ViIHNpdGU6IGh0dHA6Ly9ob21lLnQtb25saW5lLmRlL356YXJxdW9uCitUaGlzIGlzIGxvYWRlZCB3aGVuIG5lZWRlZCBieSBVbml4TGliLgorCitOb3RlOiBBcyBtb3N0IHByb2dyYW1zIHBvcnRlZCBmcm9tIG90aGVyIE9TZXMgdXNlIGhpZ2ggcmVzb2x1dGlvbiBncmFwaGljcyBhbmQgYSBtZW1vcnkgYmFjayBidWZmZXIgYSBtYWNoaW5lIHdpdGggYSBTdHJvbmdBUk0gcHJvY2Vzc29yIGFuZCAxIG9yIDJNQiBvZiBWUkFNIChvciBhIGJldHRlciBtYWNoaW5lKSBpcyByZWNvbWVuZGVkLgorCisKK1JJU0MgT1MgcnVudGltZSBwYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZXZlcmFsIGVudmlyb25tZW50YWwgdmFyaWFibGVzIGhhdmUgYmVlbiBkZWZpbmVkIHRvIG1ha2UgcG9ydGluZyBwcm9ncmFtcyBlYXNpZXIgKGkuZS4gQnkgc2V0dGluZyB0aGVzZSB2YXJpYWJsZSB5b3UgZG8gbm90IG5lZWQgdG8gaGF2ZSBzb3VyY2UgY29kZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIE9TZXMpLgorCitUaGV5IGFyZSBhbGwgZGVmaW5lZCBvbiBhbiBhcHBsaWNhdGlvbiBiYXNpcy4KKworVGhlIDxhcHBuYW1lPiB1c2VkIGJlbG93IGlzIGZvdW5kIGFzIGZvbGxvd3M6CisxLiBVc2UgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdW5sZXNzIGl0IGlzICFSdW5JbWFnZQorMi4gQ2hlY2sgdGhlIGZvbGRlciBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZm9sZGVyICFSdW5JbWFnZSBpcyBydW4gZnJvbS4gSWYgaXQgaXMgYSBmb2xkZXIgbmFtZSB1c2UgdGhhdCBuYW1lLCBvdGhlcndpc2UgaWYgaXQgaXMgYW4gZW52aXJvbm1lbnRhbCB2YXJpYWJsZSBvZiB0aGUgZm9ybSA8WFhYJERpcj4gdXNlIHRoZSB2YWx1ZSBvZiBYWFguCisKK1RoZSB2YXJpYWJsZXMgYXJlOgorCitTREwkPGFwcG5hbWU+JFRhc2tOYW1lCisKK1RoZSBuYW1lIG9mIHRoZSB0YXNrIGZvciBSSVNDIE9TLiBJZiBvbWl0dGVkIHRoZW4gPGFwcG5hbWU+IGlzIHVzZWQgZm9yIHRoZSB0YXNrIG5hbWUsCisKK1NETCQ8YXBwbmFtZT4kQmFja0J1ZmZlcgorCitTZXQgdG8gMSB0byB1c2UgYSBzeXN0ZW0gbWVtb3J5IGJhY2sgYnVmZmVyIGZvciB0aGUgc2NyZWVuIGluIGZ1bGwgc2NyZWVuIG1vZGUuIFNvbWUgcHJvZ3JhbXMgb24gb3RoZXIgc3lzdGVtcyBhc3N1bWUgdGhlaXIgaXMgYWx3YXlzIGEgYmFjayBidWZmZXIgZXZlbiB0aG91Z2ggdGhlIFNETCBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gVGhlIGN1cnJlbnQgUklTQyBPUyBpbXBsZW1lbnRhdGlvbiB1c2VzIGRpcmVjdCB3cml0ZXMgdG8gdGhlIHNjcmVlbiBpZiBhIGhhcmR3YXJlIGZ1bGxzY3JlZW4gaXMgcmVxdWVzdGVkLgorCitTZXQgdG8gMiB0byB1c2UgYW4gQVJNIGNvZGUgZnVsbCB3b3JkIGNvcHkuIFRoaXMgaXMgZmFzdGVyIHRoYW4gdGhlIHN0YW5kYXJkIGJhY2sgYnVmZmVyLCBidXQgdXNlcyBhbGlnbmVkIHdvcmRzIG9ubHkgc28gaXQgaXMgcG9zc2libGUgKGJ1dCB1bmxpa2VseSkgZm9yIGl0IHRvIGNvcnJ1cHQgdGhlIHNjcmVlbiBmb3IgOGJwcCBhbmQgMTZicHAgbW9kZXMuCisKK1NldCB0byAzIHRvIHVzZSBhIFJJU0MgT1Mgc3ByaXRlIGFzIHRoZSBiYWNrIGJ1ZmZlci4gVGhpcyBpcyB1c3VhbGx5IHRoZSBzbG93ZXN0IGZvciBtb3N0IFNETCBhcHBsaWNhdGlvbnMsIGhvd2V2ZXIgaXQgbWF5IGJlIHVzZWZ1bCBpbiB0aGUgZnV0dXJlIGFzIFNwcml0ZSBhY2NlbGVyYXRpb24gaXMgYWRkZWQgdG8gdmFyaW91cyBoYXJkd2FyZSB0aGF0IHJ1bnMgUklTQyBPUy4KKworU0RMJDxhcHBuYW1lPiRDbG9zZUFjdGlvbiAtIHNldCB0aGUgYWN0aW9uIGZvciB0aGUgY2xvc2UgaWNvbi4gQWdhaW4gYXMgcHJvZ3JhbXMgZG9uJ3QgbWF0Y2ggdGhlIHNwZWNpZmljYXRpb24geW91IGNhbiBzZXQgdGhpcyB0byAwIHRvIHJlbW92ZSB0aGUgY2xvc2UgaWNvbiBmcm9tIHRoZSBtYWluIHdpbmRvdyBmb3IgYXBwbGljYXRpb25zIHdoZXJlIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBwcm9ncmFtLgorCisKK1JJU0MgT1MgU0RMIHBvcnQgQVBJIG5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDdXJyZW50IGxldmVsIG9mIGltcGxlbWVudGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgbGlzdCBpcyBhbiBvdmVydmlldyBvZiBob3cgbXVjaCBvZiB0aGUgU0RMIGlzIGltcGxlbWVudGVkLiBUaGUgYXJlYXMgbWF0Y2ggdGhlIG1haW4gYXJlYXMgb2YgdGhlIFNETC4KKwordmlkZW8gLSBNb3N0bHkgZG9uZS4gRG9lc24ndCBjb3ZlciBnYW1tYSwgWVVWLW92ZXJsYXkgb3IgT3BlbkdMLgorV2luZG93IE1hbmFnZXIgLSBNb3N0bHkgZG9uZS4gU2V0SWNvbi9JY29uaWZ5V2luZG93IG5vdCBpbXBsZW1lbnRlZC4KK0V2ZW50cyAtIE1vc3RseSBkb25lLiBSZXNpemUgYW5kIHNvbWUgam95c3RpY2sgZXZlbnRzIG1pc3NpbmcuCitKb3lzdGljayAtIEN1cnJlbnRseSBhc3N1bWVzIGEgc2luZ2xlIGpveXN0aWNrIHdpdGggNCBidXR0b25zLgorQXVkaW8gLSBEb25lCitDRFJPTSAtIE5vdCBpbXBsZW1lbnRlZC4KK1RocmVhZHMgLSBEb25lCitUaW1lcnMgLSBEb25lCisKK1RocmVhZCBzdXBwb3J0IGNhbiBiZSByZW1vdmVkIGJ5IGRlZmluaW5nIERJU0FCTEVfVEhSRUFEUyBhbmQgcmVjb21waWxpbmcgdGhlIGxpYnJhcnkuCisKK1NETCBBUEkgbm90ZXMKKy0tLS0tLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFkZGl0aW9uYWwgbm90ZXMgb24gc29tZSBzcGVjaWZpYyBjb21tYW5kcy4KKworU0RMX1NldFZpZGVvTW9kZQorICBPbiBSSVNDIE9TIGEgZnVsbHNjcmVlbiBtb2RlIGRpcmVjdGx5IGFjY2Vzc2VzIHRoZSBzY3JlZW4uIFRoaXMgY2FuIGJlIG1vZGlmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudGFsIHZhcmlhYmxlIChTREwkPGFwcG5hbWU+JEJhY2tCdWZmZXIpIG9yIGJ5IHVzaW5nIHRoZSBTRExfU1dTVVJGQUNFIGZsYWcgdG8gd3JpdGUgdG8gYW4gb2Zmc2NyZWVuIGJ1ZmZlciB0aGF0IGlzIHVwZGF0ZWQgdXNpbmcgU0RMX1VwZGF0ZVJlY3RzLgorICBPcGVuIEdMIGlzIG5vdCBzdXBwb3J0ZWQgc28gU0RMX09QRU5HTCBhbmQgU0RMX09QRU5HTEJMSVQgZmxhZ3MgZmFpbC4KKyAgU0RMX1JFU0laRUFCTEUgYW5kIFNETF9OT0ZSQU1FIGZsYWdzIGFyZSBub3Qgc3VwcG9ydGVkLgorCitTRExfU2V0Q29sb3JzCisgIEluIGEgd2ltcCBtb2RlIHRoZSBzY3JlZW4gY29sb3VycyBhcmUgbm90IGNoYW5nZWQgZm9yIGEgaGFyZHdhcmUgcGFsZXR0ZSBpbnN0ZWFkIHRoZSBSSVNDIE9TIHNwcml0ZSBjb2xvdXIgbWFwcGluZyBpcyB1c2VkIHRvIGdldCB0aGUgYmVzdCBtYXRjaGluZyBjb2xvdXJzLgorCitTRExfQ3JlYXRlQ3Vyc29yCisgICBJbnZlcnRlZCBjb2xvdXIgaXMgbm90IHN1cHBvcnRlZC4KKworU0RMX1dNX1RvZ2dsZUZ1bGxTY3JlZW4KKyAgIEN1cnJlbnRseSB0aGlzIHdvbid0IHdvcmsgaWYgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyB1cCBpbiBGdWxsc2NyZWVuIG1vZGUuCisgICBUb2dnbGluZyB0byBmdWxsc2NyZWVuIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtb25pdG9yIGlzIHNldCB1cCB0byBzdXBwb3J0IHRoZSBleGFjdCBzY3JlZW4gc2l6ZSByZXF1ZXN0ZWQuCisKK1NETF9FbmFibGVVTklDT0RFCisgICBVbmljb2RlIHRyYW5zbGF0aW9uIHVzZWQgaGVyZSBpcyBvbmx5IHJlYWxseSBhY2N1cmF0ZSBmb3IgNyBiaXQgY2hhcmFjdGVycy4KKworU0RMX051bUpveXN0aWNrcy9Kb3lzdGlja05hbWUgZXRjLgorICAgSGFyZGNvZGVkIHRvIGV4cGVjdCBvbmx5IDEgam95c3RpY2sgd2l0aCA0IGJ1dHRvbnMgaWYgdGhlIEpveXN0aWNrIG1vZHVsZSBpcyBsb2FkZWQuCisKK1NETF9HZXRUaWNrcworICAgVGltZXIgdXNlZCBoYXMgb25seSBhIGNlbnRpc2Vjb25kIGFjY3VyYWN5LiBUaGlzIGFwcGxpZXMgdG8gb3RoZXIgdGltZSByZWxhdGVkIGZ1bmN0aW9ucy4KKyAgIAorU0RMX0RlbGF5CisgICBNb2RpZmllZCB0byBwb2xsIGtleWJvYXJkL21vdXNlIGR1cmluZyB0aGUgZGVsYXkgb24gdGhlIGV2ZW50IHRocmVhZC4KKworCitOb3RlcyBvbiBjdXJyZW50IGltcGxlbWVudGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0tleWJvYXJkIGFuZCBtb3VzZSBhcmUgcG9sbGVkIHNvIGlmIHRvbyBsb25nIGEgdGltZSBpcyBzcGVudCBiZXR3ZWVuIGEgY2FsbCB0byBTRExfUHVtcEV2ZW50cywgZnVuY3Rpb25zIHRoYXQgdXNlIGl0LCBvciBTRExfRGVsYXkgZXZlbnRzIGNhbiBiZSBtaXNzZWQuCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLlN5bWJpYW4gYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLlN5bWJpYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkOTI1YQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuU3ltYmlhbgpAQCAtMCwwICsxLDIzIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1VzaW5nIHRoZSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgd2l0aCBTNjAgMy54IC8gU3ltYmlhbiA5LngKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSBpbnN0dWN0aW9ucyBhcmUgZm9yIHBlb3BsZSBkZXZlbG9waW5nIGZvciBTNjAgMy54LiBTNjAgMy54Cit1c2VzIFN5bWJpYW4gT1Mgc28geW91IG5lZWQgUzYwIFNESy4KKworZXh0cmFjdCAic3ltYmlhbi56aXAiIGludG8gdGhpcyBmb2xkZXIuCisKK2dvIHRvIHN5bWJpYW4gZm9sZGVyCisKK2JsZG1ha2UgYmxkZmlsZXMKK2FibGQgYnVpbGQKKworVGhhdCBwcm9kdWNlcyBXSU5TQ1cgYW5kIEFSTVY1IHZlcnNpb25zIG9mIHNkbC5kbGwgcnVudGltZSBsaWJyYXJ5IAorYW5kIHNkbC5saWIgZm9yIGRldmVsb3BtZW50LiAKK1RoZSBzZGxleGUuZGxsL3NkbGV4ZS5saWIgYW5kIHNkbG1haW4ubGliIGFyZSBmb3IgZWFzeSBTREwgUzYwCitpbnRlZ3JhdGlvbiwgcGxlYXNlIHNlZSBodHRwOi8vd3d3Lm1ibmV0LmZpL35tZXJ0YW1hL3NkbC5odG1sCitmb3IgZnVydGhlciBpbmZvLgorCisKKworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLldhdGNvbSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuV2F0Y29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDM5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvUkVBRE1FLldhdGNvbQpAQCAtMCwwICsxLDEzMyBAQAorCitVc2luZyBTREwgdW5kZXIgV2luZG93cyB3aXRoIHRoZSBPcGVuV2F0Y29tIGNvbXBpbGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ByZXJlcXVpc2l0ZXMKKy0tLS0tLS0tLS0tLS0KKworSSBoYXZlIGRvbmUgdGhlIHBvcnQgdW5kZXIgV2luZG93cyBYUCBIb21lIHdpdGggU1AyIGluc3RhbGxlZC4gV2luZG93cworMjAwMCBzaG91bGQgYWxzbyBiZSB3b3JraW5nLiBJJ20gbm90IHNvIHN1cmUgYWJvdXQgYW5jaWVudCBXaW5kb3dzIE5ULAorc2luY2Ugb25seSBEaXJlY3RYIDMgaXMgYXZhaWxhYmxlIHRoZXJlLiBCdWlsZGluZyBzaG91bGQgYmUgcG9zc2libGUsCitidXQgcnVubmluZyB0aGUgY29tcGlsZWQgYXBwbGljYXRpb25zIHdpbGwgcHJvYmFsYmx5IGZhaWwgd2l0aAorU0RMX1ZJREVPRFJJVkVSPWRpcmVjdHguIFRoZSB3aW5kaWIgZHJpdmVyIHNob3VsZCB3b3JrLCB0aG91Z2guCisKK1RvIGNvbXBpbGUgYW5kIHVzZSB0aGUgU0RMIHdpdGggT3BlbiBXYXRjb20geW91IHdpbGwgbmVlZCB0aGUgZm9sbG93aW5nOgorLSBPcGVuIFdhdGNvbSBjb21waWxlci4gSSB1c2VkIHZlcnNpb24gMS41LiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgIFBBVEgsIFdBVENPTSBhbmQgSU5DTFVERSBuZWVkIHRvIGJlIHNldCBhcHByb3ByaWF0ZWx5IC0gcGxlYXNlIGNvbnN1bHQKKyAgdGhlIE9wZW5XYXRjb20gZG9jdW1lbnRhdGlvbiBhbmQgaW5zdHJ1Y3Rpb25zIGdpdmVuIGR1cmluZyB0aGUKKyAgaW5zdGFsbGF0aW9uIG9mIHRoZSBjb21waWxlci4KKyAgTXkgc2V0dXAgbG9va3MgbGlrZSB0aGlzIGluIG93dmFycy5iYXQ6CisgICAgc2V0IFdBVENPTT1DOlx3YXRjb20KKyAgICBzZXQgSU5DTFVERT0lV0FUQ09NJVxoOyVXQVRDT00lXGhcbnQKKyAgICBzZXQgUEFUSD0lUEFUSCU7JVdBVENPTSVcYmlubnQ7JVdBVENPTSVcYmludworLSBBIGZhaXJseSByZWNlbnQgRGlyZWN0WCBTREsuIFRoZSBvcmlnaW5hbCB1bm1vZGlmaWVkIERYOCBTREsgd29ya3MsIGFzCisgIHdlbGwgYXMgdGhlIG1pbmltYWwgRGlyZWN0WCA3IFNESyBmcm9tIHRoZSBBbGxlZ3JvIGRvd25sb2FkIHNpdGUKKyAgKDxodHRwOi8vYWxsZWcuc291cmNlZm9yZ2UubmV0L2ZpbGVzL2R4NzBfbWluLnppcD4pLgorLSBUaGUgU0RMIHNvdXJjZXMgZnJvbSBTdWJ2ZXJzaW9uCistIFRoZSBmaWxlIFdhdGNvbS1XaW4zMi56aXAgKG5vdyBhdmFpbGFibGUgaW4gU3VidmVyc2lvbikKKworCitCdWlsZGluZyB0aGUgTGlicmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMSkgSW4gdGhlIFNETCBiYXNlIGRpcmVjdG9yeSBleHRyYWN0IHRoZSBhcmNoaXZlIFdhdGNvbS1XaW4zMi56aXAuIFRoaXMKKyAgIGNyZWF0ZXMgYSBzdWJkaXJlY3RvcnkgbmFtZWQgJ3dhdGNvbScuCisyKSBUaGUgbWFrZWZpbGUgZXhwZWN0cyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRFhESVIgdG8gYmUgc2V0IHRvIHRoZQorICAgYmFzZSBkaXJlY3Rvcnkgb2YgYSBEaXJlY3RYIFNESy4gSSBoYXZlIHRyaWVkIGEgc3RvY2sgRFg4IFNESyBmcm9tCisgICBNaWNyb3NvZnQgYXMgd2VsbCBhcyB0aGUgbWluaW1hbCBEaXJlY3RYIDcgU0RLIGZyb20gdGhlIEFsbGVncm8KKyAgIGRvd25sb2FkIHNpdGUuCisgICBZb3UgY2FuIGFsc28gZWRpdCB0aGUgbWFrZWZpbGUgZGlyZWN0bHkgYW5kIGhhcmQgY29kZSB5b3VyIHBhdGggdG8KKyAgIHRoZSBTREsgb24geW91ciBzeXN0ZW0uCisgICBJIGhhdmUgdGhpcyBpbiBteSBzZXR1cDoKKyAgICAgc2V0IERYRElSPUQ6XGRldmVsXERYOF9TREsKKzMpIEVudGVyIHRoZSB3YXRjb20gZGlyZWN0b3J5IGFuZCBydW4KKyAgICAgd21ha2Ugc2RsCis0KSBBbGwgdGVzdHMgZnJvbSB0aGUgdGVzdCBkaXJlY3RvcnkgYXJlIHdvcmtpbmcgYW5kIGNhbiBiZSBidWlsdCBieQorICAgcnVubmluZworICAgICB3bWFrZSB0ZXN0cworCitOb3RlczoKKworIFRoZSBtYWtlZmlsZSBvZmZlcnMgc29tZSBvcHRpb25zIHRvIHR3ZWFrIHRoZSB3YXkgdGhlIGxpYnJhcnkgaXMgYnVpbHQuCisgWW91IGhhdmUgYXQgeW91ciBkaXNwb3NhbCB0aGUgb3B0aW9uIHRvIGJ1aWxkIGEgc3RhdGljIChkZWZhdWx0KQorIGxpYnJhcnksIG9yIGEgRExMICh3aXRoIHRndD1kbGwpLiBZb3UgY2FuIGFsc28gY2hvb3NlIHdoZXRoZXIgdG8gYnVpbGQKKyBhIFJlbGVhc2UgKGRlZmF1bHQpIG9yIGEgRGVidWcgdmVyc2lvbiAod2l0aCBidWlsZD1kZWJ1Zykgb2YgdGhlIHRlc3RzCisgYW5kIGxpYnJhcnkuIFBsZWFzZSBjb25zdWx0IHRoZSB1c2FnZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlCisgbWFrZWZpbGUgZm9yIHVzYWdlIGluc3RydWN0aW9ucy4KKworIElmIHlvdSBzcGVjaWZ5IGEgdGVzdCB0YXJnZXQgKGkuZS4gJ3dtYWtlIHRlc3RzJyBmb3IgYWxsIHRlc3RzLCBvcgorIHNlbGVjdGVkIHRhcmdldHMgbGlrZSAnd21ha2UgdGVzdGdsIHRlc3R2aWRpbmZvIHRlc3RvdmVybGF5MicpLCB0aGUKKyB0ZXN0cyBhcmUgYWx3YXlzIGZyZXNobHkgY29tcGlsZWQgYW5kIGxpbmtlZC4gVGhpcyBpcyBkb25lIHRvCisgbWluaW1pc2UgaGFzc2xlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gbGlicmFyeSB2ZXJzaW9ucyAoc3RhdGljIHZzLgorIERMTCksIGJlY2F1c2UgdGhleSByZXF1aXJlIHN1YnRseSBkaWZmZXJlbnQgb3B0aW9ucy4KKyBBbHNvLCB0aGUgdGVzdCBleGVjdXRhYmxlcyBhcmUgcHV0IGRpcmVjdGx5IGludG8gdGhlIHRlc3QgZGlyZWN0b3J5LAorIHNvIHRoZXkgY2FuIGZpbmQgdGhlaXIgZGF0YSBmaWxlcy4gVGhlIGNsZWFuIHRhcmdldCBvZiB0aGUgbWFrZWZpbGUKKyByZW1vdmVzIHRoZSB0ZXN0IGV4ZWN1dGFibGVzIGFuZCB0aGUgU0RMLmRsbCBmaWxlIGZyb20gdGhlIHRlc3QKKyBkaXJlY3RvcnkuCisKKyBUbyB1c2UgdGhlIGxpYnJhcnkgaW4geW91ciBvd24gcHJvamVjdHMgd2l0aCBPcGVuIFdhdGNvbSwgeW91IGNhbiB1c2UKKyB0aGUgd2F5IHRoZSB0ZXN0cyBhcmUgYnVpbHQgYXMgYmFzZSBvZiB5b3VyIG93biBidWlsZCBlbnZpcm9ubWVudC4KKworIFRoZSBsaWJyYXJ5IGNhbiBhbHNvIGJlIGJ1aWx0IHdpdGggdGhlIHN0YWNrIGNhbGxpbmcgY29udmVudGlvbiBvZiB0aGUKKyBjb21waWxlciAoLTZzIGluc3RlYWQgb2YgLTZyKS4KKworCitUZXN0IGFwcGxpY2F0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0KKworSSd2ZSB0cmllZCB0byBtYWtlIGFsbCB0ZXN0cyB3b3JrLiBUaGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIGFuIG92ZXJ2aWV3CitvZiB0aGUgY3VycmVudCBzdGF0dXMuCisKKyBUZXN0bmFtZSAgICAgICAgU3RhdHVzCit+fn5+fn5+fn5+fn5+fn4gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorY2hlY2trZXlzICAgICAgICsKK2dyYXl3aW4gICAgICAgICArCitsb29wd2F2ZSAgICAgICAgKwordGVzdGFscGhhICAgICAgICsKK3Rlc3RiaXRtYXAgICAgICArCit0ZXN0ZHluZ2wgICAgICAgKwordGVzdGVycm9yICAgICAgICsKK3Rlc3RmaWxlICAgICAgICArCit0ZXN0Z2FtbWEgICAgICAgKwordGVzdGdsICAgICAgICAgICsKK3Rlc3RocmVhZCAgICAgICArCit0ZXN0aWNvbnYgICAgICAgLSAoYWxsIGZhaWxlZCkKK3Rlc3RrZXlzICAgICAgICArCit0ZXN0bG9jayAgICAgICAgKwordGVzdG92ZXJsYXkgICAgICsgKG5lZWRzICdzZXQgU0RMX1ZJREVPRFJJVkVSPWRpcmVjdHgnKQordGVzdG92ZXJsYXkyICAgICsgKG5lZWRzICdzZXQgU0RMX1ZJREVPRFJJVkVSPWRpcmVjdHgnKQordGVzdHBhbGV0dGUgICAgICsKK3Rlc3RwbGF0Zm9ybSAgICArCit0ZXN0c2VtICAgICAgICAgKwordGVzdHNwcml0ZSAgICAgICsKK3Rlc3R0aW1lciAgICAgICArCit0ZXN0dmVyICAgICAgICAgKwordGVzdHZpZGluZm8gICAgICsKK3Rlc3R3aW4gICAgICAgICA/IChmYWRpbmcgZG9lc24ndCBzZWVtIHJpZ2h0KQordGVzdHdtICAgICAgICAgICsKK3RvcnR1cmV0aHJlYWQgICArCit0ZXN0Y2Ryb20gICAgICAgKwordGVzdGpveXN0aWNrICAgIG5vdCB0ZXN0ZWQKK3RocmVhZHdpbiAgICAgICArCit0ZXN0Y3Vyc29yICAgICAgKworCisKK1RPRE8KKy0tLS0KKworVGhlcmUgaXMgcm9vbSBmb3IgZnVydGhlciBpbXByb3ZlbWVudDoKKy0gVGVzdCBqb3lzdGljayBmdW5jdGlvbmFsaXR5LgorLSBJbnZlc3RpZ2F0ZSBmYWRpbmcgaXNzdWUgaW4gJ3Rlc3R3aW4nIHRlc3QuCistIEZpeCB0aGUgVVRGLTggc3VwcG9ydC4KKy0gQWRhcHQgdGhlIG1ha2VmaWxlL29iamVjdCBmaWxlIGxpc3QgdG8gc3VwcG9ydCBtb3JlIHRhcmdldCBzeXN0ZW1zCistIFVzZSAiI3ByYWdtYSBhdXgiIHN5bnRheCBmb3IgdGhlIENQVSBpbmZvIGZ1bmN0aW9ucy4KKworCitRdWVzdGlvbnMgYW5kIENvbW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BsZWFzZSBkaXJlY3QgYW55IHF1ZXN0aW9ucyBvciBjb21tZW50cyB0byBtZTogIDxtYWlsdG86bWFjcGV0ZUBnbXguZGU+CisKKyAgIEhhcHB5IENvZGluZyEKKworICAgTWFyYyBQZXRlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS5XaW5DRSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuV2luQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4ZDI0YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUuV2luQ0UKQEAgLTAsMCArMSw1NSBAQAorCitQcm9qZWN0IGZpbGVzIGZvciBlbWJlZGRlZCBWaXN1YWwgQysrIDMuMCwgNC4wIGFuZCAKK1Zpc3VhbCBTdHVkaW8gMjAwNSBjYW4gYmUgZm91bmQgaW4gdGhlIFZpc3VhbENFIGRpcmVjdG9yeS4KKworU0RMIHN1cHBvcnRzIEdBUEkgYW5kIFdpbkRpYiBvdXRwdXQgZm9yIFdpbmRvd3MgQ0UuCisKK0dBUEkgZHJpdmVyIHN1cHBvcnRzOgorCistIGFsbCBwb3NzaWJsZSBXaW5DRSBkZXZpY2VzIChQb2NrZXQgUEMsIFNtYXJ0cGhvbmVzLCBIUEMpCisgIHdpdGggZGlmZmVyZW50IG9yaWVudGF0aW9ucyBvZiB2aWRlbyBtZW1vcnkgYW5kIHJlc29sdXRpb25zLgorLSA0LCA4IGFuZCAxNiBicHAgZGV2aWNlcworLSBzcGVjaWFsIGhhbmRsaW5nIG9mIDhicHAgb24gOGJwcCBkZXZpY2VzCistIFZHQSBtb2RlLCB5b3UgY2FuIGV2ZW4gc3dpdGNoIGJldHdlZW4gVkdBIGFuZCBHQVBJIGluIHJ1bnRpbWUKKyAgKGJldHdlZW4gMjQweDMyMCBhbmQgNDgweDY0MCBmb3IgZXhhbXBsZSkuIE9uIFZHQSBkZXZpY2VzIHlvdSBjYW4KKyAgdXNlIGVpdGhlciBHQVBJIG9yIFZHQS4KKy0gTGFuZHNjYXBlIG1vZGUgYW5kIGF1dG9tYXRpYyByb3RhdGlvbiBvZiBidXR0b25zIGFuZCBzdHlsdXMgY29vcmRpbmF0ZXMuCisgIFRvIGVuYWJsZSBsYW5kc2NhcGUgbW9kZSBtYWtlIHdpZHRoIG9mIHZpZGVvIHNjcmVlbiBiaWdnZXIgdGhhbiBoZWlnaHQuCisgIEZvciBleGFtcGxlOiAKKyAgICBTRExfU2V0VmlkZW9Nb2RlKDMyMCwyNDAsMTYsU0RMX0ZVTExTQ1JFRU4pCistIFdNMjAwNQorLSBTRExfTGlzdE1vZGVzCisKK05PVEU6CitUaGVyZSBhcmUgc2V2ZXJhbCBTREwgZmVhdHVyZXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgV2luQ0UgcG9ydCBvZiBTREwuCisKKy0gRGlyZWN0WCBpcyBub3QgeWV0IGF2YWlsYWJsZQorLSBTZW1hcGhvcmVzIGFyZSBub3QgYXZhaWxhYmxlCistIEpveXN0aWNrIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZQorLSBDRC1ST00gY29udHJvbCBpcyBub3QgYXZhaWxhYmxlCisKK0luIGFkZGl0aW9uLCB0aGVyZSBhcmUgc2V2ZXJhbCBmZWF0dXJlcyB0aGF0IHJ1biBpbiAiZGVncmFkZWQiIG1vZGU6CisKK1ByZXByb2Nlc3NvciBTeW1ib2wJCUVmZmVjdAorPT09PT09PT09PT09PT09PT09PQkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NETF9zeXN0aW1lci5jOgorVVNFX0dFVFRJQ0tDT1VOVAkJTGVzcyBhY2N1cmF0ZSB2YWx1ZXMgZm9yIFNETCB0aW1lIGZ1bmN0aW9ucworVVNFX1NFVFRJTUVSCQkJVXNlIG9ubHkgYSBzaW5nbGUgbWFyZ2luYWxseSBhY2N1cmF0ZSB0aW1lcgorCitTRExfc3lzd20uYzoKK0RJU0FCTEVfSUNPTl9TVVBQT1JUCQlDYW4ndCBzZXQgdGhlIHJ1bnRpbWUgd2luZG93IGljb24KKworU0RMX3N5c21vdXNlLmM6CitVU0VfU1RBVElDX0NVUlNPUgkJT25seSB0aGUgYXJyb3cgY3Vyc29yIGlzIGF2YWlsYWJsZQorCitTRExfc3lzZXZlbnRzLmM6CitOT19HRVRLRVlCT0FSRFNUQVRFCQlDYW4ndCBnZXQgbW9kaWZpZXIgc3RhdGUgb24ga2V5Ym9hcmQgZm9jdXMKKworU0RMX2RpYmV2ZW50cy5jOgorTk9fR0VUS0VZQk9BUkRTVEFURQkJVmVyeSBsaW1pdGVkIGtleWNvZGUgdHJhbnNsYXRpb24KKworU0RMX2RpYnZpZGVvLmM6CitOT19HRVRESUJJVFMJCQlDYW4ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIDE1IGJwcCBhbmQgMTYgYnBwCitOT19DSEFOR0VESVNQTEFZU0VUVElOR1MJTm8gZnVsbHNjcmVlbiBzdXBwb3J0CitOT19HQU1NQV9TVVBQT1JUCQlHYW1tYSBjb3JyZWN0aW9uIG5vdCBhdmFpbGFibGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUud3Njb25zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1JFQURNRS53c2NvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5Yzg5YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9SRUFETUUud3Njb25zCkBAIC0wLDAgKzEsMTA3IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1VzaW5nIHRoZSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgd2l0aCBPcGVuQlNEL3dzY29ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSB3c2NvbnMgU0RMIGRyaXZlciBjYW4gYmUgdXNlZCB0byBydW4gU0RMIHByb2dyYW1zIG9uIE9wZW5CU0QKK3dpdGhvdXQgcnVubmluZyBYLiAgU28gZmFyLCB0aGUgZHJpdmVyIG9ubHkgcnVucyBvbiB0aGUgU2hhcnAgWmF1cnVzLAorYnV0IHRoZSBkcml2ZXIgaXMgd3JpdHRlbiB0byBiZSBlYXNpbHkgZXh0ZW5kZWQgZm9yIG90aGVyIG1hY2hpbmVzLgorVGhlIG1haW4gbWlzc2luZyBwaWVjZXMgYXJlIGJsaXR0aW5nIHJvdXRpbmVzIGZvciBhbnl0aGluZyBidXQgMTYgYml0CitkaXNwbGF5cywgYW5kIGtleWNvZGUgbWFwcyBmb3Igb3RoZXIga2V5Ym9hcmRzLiAgQWxzbywgdGhlcmUgaXMgbm8KK3N1cHBvcnQgZm9yIGhhcmR3YXJlIHBhbGV0dGVzLgorCitUaGVyZSBpcyBjdXJyZW50bHkgbm8gbW91c2Ugc3VwcG9ydC4KKworVG8gY29tcGlsZSBTREwgd2l0aCBzdXBwb3J0IGZvciB3c2NvbnMsIHVzZSB0aGUKKyItLWVuYWJsZS12aWRlby13c2NvbnMiIG9wdGlvbiB3aGVuIHJ1bm5pbmcgY29uZmlndXJlLiAgSSB1c2VkIHRoZQorZm9sbG93aW5nIGNvbW1hbmQgbGluZToKKworLi9jb25maWd1cmUgLS1kaXNhYmxlLW9zcyAtLWRpc2FibGUtbHRkbCAtLWVuYWJsZS1wdGhyZWFkLXNlbSBcCisJICAgIC0tZGlzYWJsZS1lc2QgLS1kaXNhYmxlLWFydHMgLS1kaXNhYmxlLXZpZGVvLWFhbGliICBcCisJICAgIC0tZW5hYmxlLW9wZW5ic2RhdWRpbyAtLWVuYWJsZS12aWRlby13c2NvbnMgXAorCSAgICAtLXByZWZpeD0vdXNyL2xvY2FsIC0tc3lzY29uZmRpcj0vZXRjCisKKworU2V0dGluZyB0aGUgY29uc29sZSBkZXZpY2UgdG8gdXNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2hlbiBzdGFydGluZyBhbiBTREwgcHJvZ3JhbSBvbiBhIHdzY29ucyBjb25zb2xlLCB0aGUgZHJpdmVyIHVzZXMgdGhlCitjdXJyZW50IHZpcnR1YWwgdGVybWluYWwgKHVzdWFsbHkgL2Rldi90dHlDMCkuICBUbyBmb3JjZSB0aGUgZHJpdmVyIHRvCit1c2UgYSBzcGVjaWZpYyB0ZXJtaW5hbCBkZXZpY2UsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKK1NETF9XU0NPTlNERVY6CisKK2Jhc2gkIFNETF9XU0NPTlNERVY9L2Rldi90dHlDMSAuL3NvbWUtc2RsLXByb2dyYW0KKworVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHN0YXJ0aW5nIGFuIFNETCBwcm9ncmFtIGZyb20gYSByZW1vdGUKK2xvZ2luIHByb21wdCAod2hpY2ggaXMgZ3JlYXQgZm9yIGRldmVsb3BtZW50KS4gIElmIHlvdSBkbyB0aGlzLCBhbmQKK3dhbnQgdG8gdXNlIGtleWJvYXJkIGlucHV0LCB5b3Ugc2hvdWxkIGF2b2lkIGhhdmluZyBzb21lIG90aGVyIHByb2dyYW0KK3JlYWRpbmcgZnJvbSB0aGUgdXNlZCB2aXJ0dWFsIGNvbnNvbGUgKGkuZS4sIGRvIG5vdCBoYXZlIGEgZ2V0dHkKK3J1bm5pbmcpLgorCisKK1JvdGF0aW5nIHRoZSBkaXNwbGF5Cis9PT09PT09PT09PT09PT09PT09PQorCitUaGUgZGlzcGxheSBjYW4gYmUgcm90YXRlZCBieSB0aGUgd3Njb25zIFNETCBkcml2ZXIuICBUaGlzIGlzIHVzZWZ1bAorZm9yIHRoZSBTaGFycCBaYXVydXMsIHNpbmNlIHRoZSBkaXNwbGF5IGhhcmR3YXJlIGlzIHdpcmVkIHNvIHRoYXQgaXQKK2lzIGNvcnJlY3RseSByb3RhdGVkIG9ubHkgd2hlbiB0aGUgZGlzcGxheSBpcyBmb2xkZWQgaW50byAiUERBIG1vZGUuIgorV2hlbiB1c2luZyB0aGUgWmF1cnVzIGluICJub3JtYWwsIiBvciAia2V5Ym9hcmQiIG1vZGUsIHRoZSBoYXJkd2FyZQorc2NyZWVuIGlzIHJvdGF0ZWQgOTAgZGVncmVlcyBhbnRpLWNsb2Nrd2lzZS4KKworVG8gbGV0IHRoZSB3c2NvbnMgU0RMIGRyaXZlciByb3RhdGUgdGhlIHNjcmVlbiwgc2V0IHRoZSBlbnZpcm9ubWVudAordmFyaWFibGUgU0RMX1ZJREVPX1dTQ09OU19ST1RBVElPTiB0byAiQ1ciLCAiQ0NXIiwgb3IgIlVEIiwgZm9yCitjbG9ja3dpc2UsIGNvdW50ZXIgY2xvY2t3aXNlLCBhbmQgdXBzaWRlLWRvd24gcm90YXRpb24gcmVzcGVjdGl2ZWx5LgorIkNXIiBtYWtlcyB0aGUgc2NyZWVuIGFwcGVhciBjb3JyZWN0IG9uIGEgU2hhcnAgWmF1cnVzIFNMLUMzMTAwLgorCitXaGVuIHVzaW5nIHJvdGF0aW9uIGluIHRoZSBkcml2ZXIsIGEgInNoYWRvdyIgZnJhbWUgYnVmZmVyIGlzIHVzZWQgdG8KK2hvbGQgdGhlIGludGVybWVkaWFyeSBkaXNwbGF5LCBiZWZvcmUgYmxpdHRpbmcgaXQgdG8gdGhlIGFjdHVhbAoraGFyZHdhcmUgZnJhbWUgYnVmZmVyLiAgVGhpcyBzbG93cyBkb3duIHBlcmZvcm1hbmNlIGEgYml0LgorCitGb3IgY29tcGxldGVuZXNzLCB0aGUgcm90YXRpb24gIk5PTkUiIGNhbiBiZSBzcGVjaWZpZWQgdG8gdXNlIGEgc2hhZG93CitmcmFtZSBidWZmZXIgd2l0aG91dCBhY3R1YWxseSByb3RhdGluZy4gIFVuc2V0dGluZworU0RMX1ZJREVPX1dTQ09OU19ST1RBVElPTiwgb3Igc2V0dGluZyBpdCB0byAnJyB0dXJucyBvZmYgdGhlIHNoYWRvdworZnJhbWUgYnVmZmVyIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLgorCisKK1J1bm5pbmcgTUFNRQorPT09PT09PT09PT09CisKK1NpbmNlIG15IG1haW4gbW90aXZhdGlvbiBmb3Igd3JpdGluZyB0aGUgZHJpdmVyIHdhcyBwbGF5aW5nIE1BTUUgb24KK3RoZSBaYXVydXMsIEknbGwgZ2l2ZSBhIGZldyBoaW50czoKKworWE1hbWUgY29tcGlsZXMganVzdCBmaW5lIHVuZGVyIE9wZW5CU0QuCisKK0knbSBub3Qgc3VyZSB0aGlzIGlzIHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IHNldAorCitNWV9DUFUgPSBhcm0KKworaW4gbWFrZWZpbGUudW5peCwgYW5kCisKK0NGTEFHUy5hcm0gPSAtRExTQl9GSVJTVCAtREFMSUdOX0lOVFMgLURBTElHTl9TSE9SVFMKKworaW4gc3JjL3VuaXgvdW5peC5tYXgKKwordG8gYmUgc3VyZS4KKworVGhlIGxhdGVzdCBYTWFtZSAoMC4xMDEgYXQgdGhpcyB3cml0aW5nKSBpcyBhIHZlcnkgbGFyZ2UgcHJvZ3JhbS4KK0VpdGhlciB0aW5rZXIgd2l0aCB0aGUgbWFrZSBmaWxlcyB0byBjb21waWxlIGEgdmVyc2lvbiB3aXRob3V0IHN1cHBvcnQKK2ZvciBhbGwgZHJpdmVycywgb3IsIGdldCBhbiBvbGRlciB2ZXJzaW9uIG9mIFhNYW1lLiAgTXkgcmVjb21tZW5kYXRpb24KK3dvdWxkIGJlIDAuMzdiMTYuCisKK1doZW4gcnVubmluZyBNQU1FLCBETyBOT1QgU0VUIFNETF9WSURFT19XU0NPTlNfUk9UQVRJT04hICBQZXJmb3JtYWNlCitpcyBNVUNIIGJldHRlciB3aXRob3V0IHRoaXMsIGFuZCBpdCBpcyBDT01QTEVURUxZIFVOTkVDRVNTQVJZLCBzaW5jZQorTUFNRSBjYW4gcm90YXRlIHRoZSBwaWN0dXJlIGl0c2VsZiB3aGlsZSBkcmF3aW5nLCBhbmQgZG9lcyBzbyBNVUNICitGQVNURVIuCisKK1VzZSB0aGUgWG1hbWUgY29tbWFuZCBsaW5lIG9wdGlvbiAiLXJvciIgdG8gcm90YXRlIHRoZSBwaWN0dXJlIHRvIHRoZQorcmlnaHQuCisKKworQWNrbm93bGVkZ21lbnRzCis9PT09PT09PT09PT09PT0KKworSSBzdHVkaWVkIHRoZSB3c2ZiIGRyaXZlciBmb3IgWEZyZWU4Ni9Yb3JnIHF1aXRlIGEgYml0IGJlZm9yZSB3cml0aW5nCit0aGlzLCBzbyB0aGVyZSBvdWdodCB0byBiZSBzb21lIHNpbWlsYXJpdGllcy4KKworCistLQorU3RhZmZhbiBVbGZiZXJnIDxzdGFmZmFuQHVsZmJlcmcuc2U+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvU0RMLnFwZy5pbiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9TREwucXBnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMWZhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvU0RMLnFwZy5pbgpAQCAtMCwwICsxLDE0MSBAQAorPFFQRzpHZW5lcmF0aW9uPgorICAgPFFQRzpPcHRpb25zPgorICAgICAgPFFQRzpVc2VyIHVuYXR0ZW5kZWQ9InllcyIgdmVyYm9zaXR5PSIwIiBsaXN0ZmlsZXM9InllcyIvPgorICAgICAgPFFQRzpEZWZhdWx0cyB0eXBlPSJxbnhfcGFja2FnZSIvPgorICAgICAgPFFQRzpTb3VyY2U+PC9RUEc6U291cmNlPgorICAgICAgPFFQRzpSZWxlYXNlIGRhdGU9InRvZGF5IiBudW1iZXI9IisiLz4KKyAgICAgIDxRUEc6QnVpbGQ+PC9RUEc6QnVpbGQ+CisgICAgICA8UVBHOkZpbGVTb3J0aW5nIHN0cmlwPSJ5ZXMiLz4KKyAgICAgIDxRUEc6UGFja2FnZSB0YXJnZXRzPSJzdGFuZGFydCIvPgorICAgICAgPFFQRzpSZXBvc2l0b3J5IGdlbmVyYXRlPSJ5ZXMiLz4KKyAgICAgIDxRUEc6RmluYWxEaXI+PC9RUEc6RmluYWxEaXI+CisgICAgICA8UVBHOkNsZWFudXA+PC9RUEc6Q2xlYW51cD4KKyAgIDwvUVBHOk9wdGlvbnM+CisKKyAgIDxRUEc6UmVzcG9uc2libGU+CisgICAgICA8UVBHOkNvbXBhbnk+UU5YLk9SRy5SVSBDb21tdW5pdHk8L1FQRzpDb21wYW55PgorICAgICAgPFFQRzpEZXBhcnRtZW50PjwvUVBHOkRlcGFydG1lbnQ+CisgICAgICA8UVBHOkdyb3VwPjwvUVBHOkdyb3VwPgorICAgICAgPFFQRzpUZWFtPlFOWC5PUkcuUlUgVGVhbTwvUVBHOlRlYW0+CisgICAgICA8UVBHOkVtcGxveWVlPk1pa2UgR29yY2hhazwvUVBHOkVtcGxveWVlPgorICAgICAgPFFQRzpFbWFpbEFkZHJlc3M+bWlrZUBtYWx2YS51YTwvUVBHOkVtYWlsQWRkcmVzcz4KKyAgIDwvUVBHOlJlc3BvbnNpYmxlPgorCisgICA8UVBHOlZhbHVlcz4KKyAgICAgIDxRUEc6RmlsZXM+CisgICAgICAgICA8UVBHOkFkZCBmaWxlPSIuL0NPUFlJTkciIGluc3RhbGw9IkxpY2Vuc2VVcmwvIiBoYW5kbGluZz0icmVwZGF0YSIvPgorICAgICAgICAgPFFQRzpBZGQgcGVybWlzc2lvbnM9IjA3NTUiIGZpbGU9Ii4vc3JjLy5saWJzL2xpYlNETC1AU0RMX01BSk9SX1ZFUlNJT05ALkBTRExfTUlOT1JfVkVSU0lPTkAuc28uQExUX0FHRUAiIGluc3RhbGw9Ii91c3IvbGliLyIvPgorICAgICAgICAgPFFQRzpBZGQgZmlsZXR5cGU9InN5bWxpbmsiIGZpbGU9ImxpYlNETC5zbyIgaW5zdGFsbD0iL3Vzci9saWIvIiBsaW5rdG89ImxpYlNETC1AU0RMX01BSk9SX1ZFUlNJT05ALkBTRExfTUlOT1JfVkVSU0lPTkAuc28uQExUX0FHRUAiLz4KKyAgICAgICAgIDxRUEc6QWRkIHBlcm1pc3Npb25zPSIwNjQ0IiBmaWxlPSIuL3NyYy8ubGlicy9saWJTREwuYSIgaW5zdGFsbD0iL3Vzci9saWIvIi8+CisgICAgICAgICA8UVBHOkFkZCBwZXJtaXNzaW9ucz0iMDY0NCIgZmlsZT0iLi9zcmMvLmxpYnMvbGliU0RMLmxhaSIgaW5zdGFsbD0iL3Vzci9saWIvbGliU0RMLmxhIi8+CisgICAgICAgICA8UVBHOkFkZCBwZXJtaXNzaW9ucz0iMDY0NCIgZmlsZT0iLi9zcmMvLmxpYnMvbGliU0RMbWFpbi5hIiBpbnN0YWxsPSIvdXNyL2xpYi8iLz4KKyAgICAgICAgIDxRUEc6QWRkIHBlcm1pc3Npb25zPSIwNjQ0IiBmaWxlPSIuL3NyYy8ubGlicy9saWJTRExtYWluLmxhaSIgaW5zdGFsbD0iL3Vzci9saWIvbGliU0RMbWFpbi5sYWkiLz4KKyAgICAgICAgIDxRUEc6QWRkIHBlcm1pc3Npb25zPSIwNjQ0IiBmaWxlPSIuL2luY2x1ZGUvKi5oIiBpbnN0YWxsPSIvdXNyL2luY2x1ZGUvU0RMLyIvPgorICAgICAgICAgPFFQRzpBZGQgcGVybWlzc2lvbnM9IjA3NTUiIGZpbGU9Ii4vc2RsLWNvbmZpZyIgaW5zdGFsbD0iL3Vzci9iaW4vIi8+CisgICAgICAgICA8UVBHOkFkZCBwZXJtaXNzaW9ucz0iMDY0NCIgZmlsZT0iLi9CVUdTIiBpbnN0YWxsPSIvdXNyL3NoYXJlL2RvYy9TREwxMi8iLz4KKyAgICAgICAgIDxRUEc6QWRkIHBlcm1pc3Npb25zPSIwNjQ0IiBmaWxlPSIuL0NPUFlJTkciIGluc3RhbGw9Ii91c3Ivc2hhcmUvZG9jL1NETDEyLyIvPgorICAgICAgICAgPFFQRzpBZGQgcGVybWlzc2lvbnM9IjA2NDQiIGZpbGU9Ii4vQ1JFRElUUyIgaW5zdGFsbD0iL3Vzci9zaGFyZS9kb2MvU0RMMTIvIi8+CisgICAgICAgICA8UVBHOkFkZCBwZXJtaXNzaW9ucz0iMDY0NCIgZmlsZT0iLi9JTlNUQUxMIiBpbnN0YWxsPSIvdXNyL3NoYXJlL2RvYy9TREwxMi8iLz4KKyAgICAgICAgIDxRUEc6QWRkIHBlcm1pc3Npb25zPSIwNjQ0IiBmaWxlPSIuL1JFQURNRSIgaW5zdGFsbD0iL3Vzci9zaGFyZS9kb2MvU0RMMTIvIi8+CisgICAgICAgICA8UVBHOkFkZCBwZXJtaXNzaW9ucz0iMDY0NCIgZmlsZT0iLi9SRUFETUUtU0RMLnR4dCIgaW5zdGFsbD0iL3Vzci9zaGFyZS9kb2MvU0RMMTIvIi8+CisgICAgICAgICA8UVBHOkFkZCBwZXJtaXNzaW9ucz0iMDY0NCIgZmlsZT0iLi9SRUFETUUuQ1ZTIiBpbnN0YWxsPSIvdXNyL3NoYXJlL2RvYy9TREwxMi8iLz4KKyAgICAgICAgIDxRUEc6QWRkIHBlcm1pc3Npb25zPSIwNjQ0IiBmaWxlPSIuL1JFQURNRS5RTlgiIGluc3RhbGw9Ii91c3Ivc2hhcmUvZG9jL1NETDEyLyIvPgorICAgICAgICAgPFFQRzpBZGQgcGVybWlzc2lvbnM9IjA2NDQiIGZpbGU9Ii4vVE9ETyIgaW5zdGFsbD0iL3Vzci9zaGFyZS9kb2MvU0RMMTIvIi8+CisgICAgICAgICA8UVBHOkFkZCBwZXJtaXNzaW9ucz0iMDY0NCIgZmlsZT0iLi9XaGF0c05ldyIgaW5zdGFsbD0iL3Vzci9zaGFyZS9kb2MvU0RMMTIvIi8+CisgICAgICAgICA8UVBHOkFkZCBwZXJtaXNzaW9ucz0iMDY0NCIgZmlsZT0iLi9kb2NzLmh0bWwiIGluc3RhbGw9Ii91c3Ivc2hhcmUvZG9jL1NETDEyL0NoYW5nZXMuaHRtbCIvPgorICAgICAgICAgPFFQRzpBZGQgcGVybWlzc2lvbnM9IjA2NDQiIGZpbGU9Ii4vZG9jcy9pbmRleC5odG1sIiBpbnN0YWxsPSIvdXNyL3NoYXJlL2RvYy9TREwxMi9kb2NzLyIvPgorICAgICAgICAgPFFQRzpBZGQgcGVybWlzc2lvbnM9IjA2NDQiIGZpbGU9Ii4vZG9jcy9odG1sLyouaHRtbCIgaW5zdGFsbD0iL3Vzci9zaGFyZS9kb2MvU0RMMTIvZG9jcy9odG1sLyIvPgorICAgICAgICAgPFFQRzpBZGQgcGVybWlzc2lvbnM9IjA2NDQiIGZpbGU9Ii4vZG9jcy9tYW4zLyouMyIgaW5zdGFsbD0iL3Vzci9zaGFyZS9tYW4vbWFuMy8iLz4KKyAgICAgICAgIDxRUEc6QWRkIHBlcm1pc3Npb25zPSIwNjQ0IiBmaWxlPSIuL3NkbC5tNCIgaW5zdGFsbD0iL3Vzci9zaGFyZS9hY2xvY2FsLyIvPgorICAgICAgPC9RUEc6RmlsZXM+CisgICAgICA8UVBHOlBhY2thZ2VGaWx0ZXI+CisgICAgICAgICA8UVBNOlBhY2thZ2VNYW5pZmVzdD4KKworICAgICAgICAgICAgPFFQTTpQYWNrYWdlRGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICA8UVBNOlBhY2thZ2VUeXBlPkxpYnJhcnk8L1FQTTpQYWNrYWdlVHlwZT4KKyAgICAgICAgICAgICAgIDxRUE06UGFja2FnZU5hbWU+U0RMPC9RUE06UGFja2FnZU5hbWU+CisgICAgICAgICAgICAgICA8UVBNOlBhY2thZ2VSZWxlYXNlTnVtYmVyPjE8L1FQTTpQYWNrYWdlUmVsZWFzZU51bWJlcj4KKyAgICAgICAgICAgICAgIDxRUE06UGFja2FnZVJlcG9zaXRvcnk+aHR0cDovL3FueC5vcmcucnUvcmVwb3NpdG9yeTwvUVBNOlBhY2thZ2VSZXBvc2l0b3J5PgorICAgICAgICAgICAgICAgPFFQTTpGaWxlVmVyc2lvbj4yLjY8L1FQTTpGaWxlVmVyc2lvbj4KKyAgICAgICAgICAgIDwvUVBNOlBhY2thZ2VEZXNjcmlwdGlvbj4KKworICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3ROYW1lPlNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciAoU0RMKTwvUVBNOlByb2R1Y3ROYW1lPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0SWRlbnRpZmllcj5TREw8L1FQTTpQcm9kdWN0SWRlbnRpZmllcj4KKyAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdEVtYWlsPnNsb3VrZW5AbGlic2RsLm9yZzwvUVBNOlByb2R1Y3RFbWFpbD4KKyAgICAgICAgICAgICAgIDxRUE06VmVuZG9yTmFtZT5QdWJsaWM8L1FQTTpWZW5kb3JOYW1lPgorICAgICAgICAgICAgICAgPFFQTTpWZW5kb3JJbnN0YWxsTmFtZT5wdWJsaWM8L1FQTTpWZW5kb3JJbnN0YWxsTmFtZT4KKyAgICAgICAgICAgICAgIDxRUE06VmVuZG9yVVJMPmh0dHA6Ly93d3cubGlic2RsLm9yZzwvUVBNOlZlbmRvclVSTD4KKyAgICAgICAgICAgICAgIDxRUE06VmVuZG9yRW1iZWRVUkwvPgorICAgICAgICAgICAgICAgPFFQTTpWZW5kb3JFbWFpbD5zbG91a2VuQGxpYnNkbC5vcmc8L1FQTTpWZW5kb3JFbWFpbD4KKyAgICAgICAgICAgICAgIDxRUE06QXV0aG9yTmFtZT5TYW0gTGFudGluZ2E8L1FQTTpBdXRob3JOYW1lPgorICAgICAgICAgICAgICAgPFFQTTpBdXRob3JVUkw+aHR0cDovL3d3dy5saWJzZGwub3JnPC9RUE06QXV0aG9yVVJMPgorICAgICAgICAgICAgICAgPFFQTTpBdXRob3JFbWJlZFVSTC8+CisgICAgICAgICAgICAgICA8UVBNOkF1dGhvckVtYWlsPnNsb3VrZW5AbGlic2RsLm9yZzwvUVBNOkF1dGhvckVtYWlsPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0SWNvblNtYWxsLz4KKyAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdEljb25MYXJnZS8+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3REZXNjcmlwdGlvblNob3J0PlRoaXMgaXMgdGhlIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciAoU0RMKSwgYSBnZW5lcmljIEFQSSB0aGF0IHByb3ZpZGVzIGxvdyBsZXZlbCBhY2Nlc3MgdG8gYXVkaW8sIGtleWJvYXJkLCBtb3VzZSwgYW5kIGRpc3BsYXkgZnJhbWVidWZmZXIgYWNyb3NzIG11bHRpcGxlIHBsYXRmb3Jtcy48L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25TaG9ydD4KKyAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdERlc2NyaXB0aW9uTG9uZz5UaGlzIGlzIHRoZSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgKFNETCksIGEgZ2VuZXJpYyBBUEkgdGhhdCBwcm92aWRlcyBsb3cgbGV2ZWwgYWNjZXNzIHRvIGF1ZGlvLCBrZXlib2FyZCwgbW91c2UsIGFuZCBkaXNwbGF5IGZyYW1lYnVmZmVyIGFjcm9zcyBtdWx0aXBsZSBwbGF0Zm9ybXMuIFRoaXMgaXMgdGhlIGxpYnJhcmllcywgaW5jbHVkZSBmaWxlcyBhbmQgb3RoZXIgcmVzb3VyY2VzIHlvdSBjYW4gdXNlIHRvIGRldmVsb3AgYW5kIHJ1biBTREwgYXBwbGljYXRpb25zLjwvUVBNOlByb2R1Y3REZXNjcmlwdGlvbkxvbmc+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3REZXNjcmlwdGlvblVSTD5odHRwOi8vd3d3LmxpYnNkbC5vcmc8L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25VUkw+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3REZXNjcmlwdGlvbkVtYmVkVVJMLz4KKyAgICAgICAgICAgIDwvUVBNOlByb2R1Y3REZXNjcmlwdGlvbj4KKworICAgICAgICAgICAgPFFQTTpSZWxlYXNlRGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VWZXJzaW9uPkBWRVJTSU9OQDwvUVBNOlJlbGVhc2VWZXJzaW9uPgorICAgICAgICAgICAgICAgPFFQTTpSZWxlYXNlVXJnZW5jeT5NZWRpdW08L1FQTTpSZWxlYXNlVXJnZW5jeT4KKyAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZVN0YWJpbGl0eT5TdGFibGU8L1FQTTpSZWxlYXNlU3RhYmlsaXR5PgorICAgICAgICAgICAgICAgPFFQTTpSZWxlYXNlTm90ZU1pbm9yLz4KKyAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZU5vdGVNYWpvci8+CisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VCdWlsZD4xPC9RUE06UmVsZWFzZUJ1aWxkPgorICAgICAgICAgICAgICAgPFFQTTpDb3VudHJ5RXhjbHVkZS8+CisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VDb3B5cmlnaHQ+R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC9RUE06UmVsZWFzZUNvcHlyaWdodD4KKyAgICAgICAgICAgIDwvUVBNOlJlbGVhc2VEZXNjcmlwdGlvbj4KKworICAgICAgICAgICAgPFFQTTpDb250ZW50RGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICA8UVBNOkNvbnRlbnRUb3BpYyB4bWxtdWx0aXBsZT0idHJ1ZSI+U29mdHdhcmUgRGV2ZWxvcG1lbnQvTGlicmFyaWVzIGFuZCBFeHRlbnNpb25zL0MgTGlicmFyaWVzPC9RUE06Q29udGVudFRvcGljPgorICAgICAgICAgICAgICAgPFFQTTpDb250ZW50S2V5d29yZD5TREwsYXVkaW8sZ3JhcGhpY3MsZGVtb3MsZ2FtZXMsZW11bGF0b3JzLGRpcmVjdCxtZWRpYSxsYXllcjwvUVBNOkNvbnRlbnRLZXl3b3JkPgorICAgICAgICAgICAgICAgPFFQTTpUYXJnZXRPUz5xbng2PC9RUE06VGFyZ2V0T1M+CisgICAgICAgICAgICAgICA8UVBNOkhvc3RPUz5ub25lPC9RUE06SG9zdE9TPgorICAgICAgICAgICAgICAgPFFQTTpEaXNwbGF5RW52aXJvbm1lbnQgeG1sbXVsdGlwbGU9InRydWUiPlBob3RvbjwvUVBNOkRpc3BsYXlFbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgIDxRUE06RGlzcGxheUVudmlyb25tZW50IHhtbG11bHRpcGxlPSJ0cnVlIj5Db25zb2xlPC9RUE06RGlzcGxheUVudmlyb25tZW50PgorICAgICAgICAgICAgICAgPFFQTTpUYXJnZXRBdWRpZW5jZSB4bWxtdWx0aXBsZT0idHJ1ZSI+RGV2ZWxvcGVyPC9RUE06VGFyZ2V0QXVkaWVuY2U+CisgICAgICAgICAgICAgICA8UVBNOlRhcmdldEF1ZGllbmNlIHhtbG11bHRpcGxlPSJ0cnVlIj5Vc2VyPC9RUE06VGFyZ2V0QXVkaWVuY2U+CisgICAgICAgICAgICA8L1FQTTpDb250ZW50RGVzY3JpcHRpb24+CisgICAgICAgICAgICA8UVBNOkxpY2Vuc2VVcmw+cmVwZGF0YTovL0xpY2Vuc2VVcmwvQ09QWUlORzwvUVBNOkxpY2Vuc2VVcmw+CisgICAgICAgICA8L1FQTTpQYWNrYWdlTWFuaWZlc3Q+CisgICAgICA8L1FQRzpQYWNrYWdlRmlsdGVyPgorCisgICAgICA8UVBHOlBhY2thZ2VGaWx0ZXIgcHJvYz0ibm9uZSIgdGFyZ2V0PSJub25lIj4KKyAgICAgICAgIDxRUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgICAgICAgPFFQTTpQcm9kdWN0SW5zdGFsbGF0aW9uRGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0UmVxdWlyZW1lbnRzPjwvUVBNOlByb2R1Y3RSZXF1aXJlbWVudHM+CisgICAgICAgICAgICA8L1FQTTpQcm9kdWN0SW5zdGFsbGF0aW9uRGVwZW5kZW5jaWVzPgorICAgICAgICAgPC9RUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgPC9RUEc6UGFja2FnZUZpbHRlcj4KKworICAgICAgPFFQRzpQYWNrYWdlRmlsdGVyIHByb2M9Ing4NiIgdGFyZ2V0PSJub25lIj4KKyAgICAgICAgIDxRUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgICAgICAgPFFQTTpQcm9kdWN0SW5zdGFsbGF0aW9uRGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0UmVxdWlyZW1lbnRzPjwvUVBNOlByb2R1Y3RSZXF1aXJlbWVudHM+CisgICAgICAgICAgICA8L1FQTTpQcm9kdWN0SW5zdGFsbGF0aW9uRGVwZW5kZW5jaWVzPgorICAgICAgICAgPC9RUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgPC9RUEc6UGFja2FnZUZpbHRlcj4KKworICAgICAgPFFQRzpQYWNrYWdlRmlsdGVyIHByb2M9Im5vbmUiIHRhcmdldD0ieDg2Ij4KKyAgICAgICAgIDxRUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgICAgICAgPFFQTTpQcm9kdWN0SW5zdGFsbGF0aW9uRGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0UmVxdWlyZW1lbnRzPjwvUVBNOlByb2R1Y3RSZXF1aXJlbWVudHM+CisgICAgICAgICAgICA8L1FQTTpQcm9kdWN0SW5zdGFsbGF0aW9uRGVwZW5kZW5jaWVzPgorICAgICAgICAgPC9RUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgPC9RUEc6UGFja2FnZUZpbHRlcj4KKworICAgICAgPFFQRzpQYWNrYWdlRmlsdGVyIHByb2M9Ing4NiIgdGFyZ2V0PSJ4ODYiPgorICAgICAgICAgPFFQTTpQYWNrYWdlTWFuaWZlc3Q+CisgICAgICAgICAgICA8UVBNOlByb2R1Y3RJbnN0YWxsYXRpb25EZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3RSZXF1aXJlbWVudHM+PC9RUE06UHJvZHVjdFJlcXVpcmVtZW50cz4KKyAgICAgICAgICAgIDwvUVBNOlByb2R1Y3RJbnN0YWxsYXRpb25EZXBlbmRlbmNpZXM+CisgICAgICAgICA8L1FQTTpQYWNrYWdlTWFuaWZlc3Q+CisgICAgICA8L1FQRzpQYWNrYWdlRmlsdGVyPgorCisgICA8L1FQRzpWYWx1ZXM+Cis8L1FQRzpHZW5lcmF0aW9uPgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1NETC5zcGVjLmluIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1NETC5zcGVjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZGExMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvU0RMLnNwZWMuaW4KQEAgLTAsMCArMSwxMTMgQEAKK1N1bW1hcnk6IFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorTmFtZTogU0RMCitWZXJzaW9uOiBAU0RMX1ZFUlNJT05ACitSZWxlYXNlOiAxCitTb3VyY2U6IGh0dHA6Ly93d3cubGlic2RsLm9yZy9yZWxlYXNlLyV7bmFtZX0tJXt2ZXJzaW9ufS50YXIuZ3oKK1VSTDogaHR0cDovL3d3dy5saWJzZGwub3JnLworTGljZW5zZTogTEdQTAorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9MaWJyYXJpZXMKK0J1aWxkUm9vdDogJXtfdG1wcGF0aH0vJXtuYW1lfS0le3ZlcnNpb259LWJ1aWxkcm9vdAorUHJlZml4OiAle19wcmVmaXh9CislaWZvcyBsaW51eAorUHJvdmlkZXM6IGxpYlNETC0xLjIuc28uMAorJWVuZGlmCisKKyVkZWZpbmUgX19kZWZhdHRyICVkZWZhdHRyKC0scm9vdCxyb290KQorJWRlZmluZSBfX3NvZXh0IHNvCisKKyVkZXNjcmlwdGlvbgorVGhpcyBpcyB0aGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyLCBhIGdlbmVyaWMgQVBJIHRoYXQgcHJvdmlkZXMgbG93CitsZXZlbCBhY2Nlc3MgdG8gYXVkaW8sIGtleWJvYXJkLCBtb3VzZSwgYW5kIGRpc3BsYXkgZnJhbWVidWZmZXIgYWNyb3NzCittdWx0aXBsZSBwbGF0Zm9ybXMuCisKKyVwYWNrYWdlIGRldmVsCitTdW1tYXJ5OiBMaWJyYXJpZXMsIGluY2x1ZGVzIGFuZCBtb3JlIHRvIGRldmVsb3AgU0RMIGFwcGxpY2F0aW9ucy4KK0dyb3VwOiBEZXZlbG9wbWVudC9MaWJyYXJpZXMKK1JlcXVpcmVzOiAle25hbWV9ID0gJXt2ZXJzaW9ufQorCislZGVzY3JpcHRpb24gZGV2ZWwKK1RoaXMgaXMgdGhlIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciwgYSBnZW5lcmljIEFQSSB0aGF0IHByb3ZpZGVzIGxvdworbGV2ZWwgYWNjZXNzIHRvIGF1ZGlvLCBrZXlib2FyZCwgbW91c2UsIGFuZCBkaXNwbGF5IGZyYW1lYnVmZmVyIGFjcm9zcworbXVsdGlwbGUgcGxhdGZvcm1zLgorCitUaGlzIGlzIHRoZSBsaWJyYXJpZXMsIGluY2x1ZGUgZmlsZXMgYW5kIG90aGVyIHJlc291cmNlcyB5b3UgY2FuIHVzZQordG8gZGV2ZWxvcCBTREwgYXBwbGljYXRpb25zLgorCisKKyVwcmVwCislc2V0dXAgLXEgCisKKyVidWlsZAorJWlmb3MgbGludXgKK0NGTEFHUz0iJFJQTV9PUFRfRkxBR1MiIC4vY29uZmlndXJlIC0tcHJlZml4PSV7cHJlZml4fSAtLWRpc2FibGUtdmlkZW8tYWFsaWIgLS1kaXNhYmxlLXZpZGVvLWRpcmVjdGZiIC0tZGlzYWJsZS12aWRlby1nZ2kgLS1kaXNhYmxlLXZpZGVvLXN2Z2EKKyVlbHNlCislY29uZmlndXJlCislZW5kaWYKK21ha2UKKworJWluc3RhbGwKK3JtIC1yZiAkUlBNX0JVSUxEX1JPT1QKKyVpZm9zIGxpbnV4CittYWtlIGluc3RhbGwgcHJlZml4PSRSUE1fQlVJTERfUk9PVCV7cHJlZml4fSBcCisgICAgICAgICAgICAgYmluZGlyPSRSUE1fQlVJTERfUk9PVCV7X2JpbmRpcn0gXAorICAgICAgICAgICAgIGxpYmRpcj0kUlBNX0JVSUxEX1JPT1Qle19saWJkaXJ9IFwKKyAgICAgICAgICAgICBpbmNsdWRlZGlyPSRSUE1fQlVJTERfUk9PVCV7X2luY2x1ZGVkaXJ9IFwKKyAgICAgICAgICAgICBkYXRhZGlyPSRSUE1fQlVJTERfUk9PVCV7X2RhdGFkaXJ9IFwKKyAgICAgICAgICAgICBtYW5kaXI9JFJQTV9CVUlMRF9ST09UJXtfbWFuZGlyfQorbG4gLXMgbGliU0RMLTEuMi5zby4wICRSUE1fQlVJTERfUk9PVCV7X2xpYmRpcn0vbGliU0RMLTEuMS5zby4wCislZWxzZQorJW1ha2VpbnN0YWxsCislZW5kaWYKKworJWNsZWFuCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCisKKyVmaWxlcworJXtfX2RlZmF0dHJ9CislZG9jIFJFQURNRS1TREwudHh0IENPUFlJTkcgQ1JFRElUUyBCVUdTCisle19saWJkaXJ9L2xpYiouJXtfX3NvZXh0fS4qCisKKyVmaWxlcyBkZXZlbAorJXtfX2RlZmF0dHJ9CislZG9jIFJFQURNRSBSRUFETUUtU0RMLnR4dCBDT1BZSU5HIENSRURJVFMgQlVHUyBXaGF0c05ldyBkb2NzLmh0bWwKKyVkb2MgZG9jcy9pbmRleC5odG1sIGRvY3MvaHRtbAorJXtfYmluZGlyfS8qLWNvbmZpZworJXtfbGliZGlyfS9saWIqLmEKKyV7X2xpYmRpcn0vbGliKi5sYQorJXtfbGliZGlyfS9saWIqLiV7X19zb2V4dH0KKyVkaXIgJXtfaW5jbHVkZWRpcn0vU0RMCisle19pbmNsdWRlZGlyfS9TREwvKi5oCisle19saWJkaXJ9L3BrZ2NvbmZpZy9zZGwucGMKKyV7X2RhdGFkaXJ9L2FjbG9jYWwvKgorJXtfbWFuZGlyfS9tYW4zLyoKKworJWNoYW5nZWxvZworKiBUdWUgTWF5IDE2IDIwMDYgU2FtIExhbnRpbmdhIDxzbG91a2VuQGxpYnNkbC5vcmc+CistIFJlbW92ZWQgc3VwcG9ydCBmb3IgRGFyd2luLCBkdWUgdG8gYnVpbGQgcHJvYmxlbXMgb24gcHMybGludXgKKworKiBNb24gSmFuIDAzIDIwMDQgQW5kZXJzIEJqb3JrbHVuZCA8YWZiQGFsZ29uZXQuc2U+CistIEFkZGVkIHN1cHBvcnQgZm9yIERhcndpbiwgdXBkYXRlZCBzcGVjIGZpbGUKKworKiBXZWQgSmFuIDE5IDIwMDAgU2FtIExhbnRpbmdhIDxzbG91a2VuQGxpYnNkbC5vcmc+CistIFJlLWludGVncmF0ZWQgc3BlYyBmaWxlIGludG8gU0RMIGRpc3RyaWJ1dGlvbgorLSAnbmFtZScgYW5kICd2ZXJzaW9uJyBjb21lIGZyb20gY29uZmlndXJlIAorLSBTb21lIG9mIHRoZSBkb2N1bWVudGF0aW9uIGlzIGRldmVsIHNwZWNpZmljCistIFJlbW92ZWQgU01QIHN1cHBvcnQgZnJvbSAlYnVpbGQgLSBpdCBkb2Vzbid0IHdvcmsgd2l0aCBsaWJ0b29sIGFueXdheQorCisqIFR1ZSBKYW4gMTggMjAwMCBIYWthbiBUYW5kb2dhbiA8aGFrYW5AaWNvbnN1bHQuY29tPgorLSBIYWNrZWQgTWFuZHJha2Ugc2RsIHNwZWMgdG8gYnVpbGQgMS4xCisKKyogU3VuIERlYyAxOSAxOTk5IEpvaG4gQnVzd2VsbCA8am9obmJAbWFuZHJha2Vzb2Z0LmNvbT4KKy0gQnVpbGQgUmVsZWFzZQorCisqIFNhdCBEZWMgMTggMTk5OSBKb2huIEJ1c3dlbGwgPGpvaG5iQG1hbmRyYWtlc29mdC5jb20+CistIEFkZCBzeW1saW5rIGZvciBsaWJTREwtMS4wLnNvLjAgcmVxdWlyZWQgYnkgc2RsYm9tYmVyCistIEFkZGVkIGRvY3MKKworKiBUaHUgRGVjIDA5IDE5OTkgTGVubnkgQ2FydGllciA8bGVubnlAbWFuZHJha2Vzb2Z0LmNvbT4KKy0gdiAxLjAuMAorCisqIE1vbiBOb3YgIDEgMTk5OSBDaG1vdWVsIEJvdWRqbmFoIDxjaG1vdWVsQG1hbmRyYWtlc29mdC5jb20+CistIEZpcnN0IHNwZWMgZmlsZSBmb3IgTWFuZHJha2UgZGlzdHJpYnV0aW9uLgorCisjIGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVE9ETyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YmIwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVE9ETwpAQCAtMCwwICsxLDI1IEBACisKK1dpc2ggbGlzdCBmb3IgdGhlIDEuMyBkZXZlbG9wbWVudCBicmFuY2g6CitodHRwOi8vYnVnemlsbGEubGlic2RsLm9yZy8KKworICogQWRkIG1vdXNld2hlZWwgZXZlbnRzIChuZXcgdW5pZmllZCBldmVudCBhcmNoaXRlY3R1cmU/KQorICogRGlyZWN0SW5wdXQgam95c3RpY2sgc3VwcG9ydCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZAorICogQmUgYWJsZSB0byBlbnVtZXJhdGUgYW5kIHNlbGVjdCBhdmFpbGFibGUgYXVkaW8gYW5kIHZpZGVvIGRyaXZlcnMKKyAqIEZ1bGxzY3JlZW4gdmlkZW8gbW9kZSBzdXBwb3J0IGZvciBNYWMgT1MgWAorICogRXhwbGljaXQgdmVydGljYWwgcmV0cmFjZSB3YWl0IChtYXliZSBzZXBhcmF0ZSBmcm9tIFNETF9GbGlwPykKKyAqIFNoYXBlZCB3aW5kb3dzLCB3aW5kb3dzIHdpdGhvdXQgYm9yZGVycworICogTXVsdGlwbGUgd2luZG93cywgbXVsdGlwbGUgZGlzcGxheSBzdXBwb3J0CisgKiBTRExfSU5JVF9FVkVOVFRIUkVBRCBvbiBXaW5kb3dzIGFuZCBNYWNPUz8KKyAqIEFkZCBhIHRpbWVzdGFtcCB0byBldmVudHMKKyAqIEFkZCBhdWRpbyBpbnB1dCBBUEkKKyAqIEFkZCBoYXJkd2FyZSBhY2NlbGVyYXRlZCBzY2FsZWQgYmxpdAorICogQWRkIGhhcmR3YXJlIGFjY2VsZXJhdGVkIGFscGhhIGJsaXRzCisgKiBSZWRlc2lnbiBibGl0dGluZyBhcmNoaXRlY3R1cmUgdG8gYWxsb3cgYmxpdCBwbHVnaW5zCisKK0luIHRoZSBqdW1wIGZyb20gMS4yIHRvIDEuMywgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgU0RMX1JlY3QgbWVtYmVycyB0bworaW50IGFuZCBldmFsdWF0ZSBhbGwgdGhlIHJlc3Qgb2YgdGhlIGRhdGF0eXBlcy4gIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UKK3dlIHNob3VsZCBkbyBpdCB0aG91Z2gsIHNpbmNlIHRoZSAxLjIgc2VyaWVzIHNob3VsZCBub3QgYnJlYWsgYmluYXJ5Citjb21wYXRpYmlsaXR5IGluIHRoaXMgd2F5LgorCitSZXF1ZXN0czoKKyAqIFBDTSBhbmQgQ0RST00gdm9sdW1lIGNvbnRyb2wgKGRlcHJlY2F0ZWQsIGJ1dCBwb3NzaWJsZSkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjM0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy5odG1sCkBAIC0wLDAgKzEsMTU5IEBACis8SFRNTD4KKwk8SEVBRD4KKwkJPFRJVExFPlVzaW5nIFNETCB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrPC9USVRMRT4KKwk8L0hFQUQ+CisJPEJPRFk+CisJCTxIMT4KKwkJCVVzaW5nIFNETCB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIDUsNiZuYnNwO2FuZCA3CisJCTwvSDE+CisJCTxIMz4KKwkJCWJ5IDxBIEhSRUY9Im1haWx0bzpzbm93bGlvbkBzcHJ5bmV0LmNvbSI+TGlvbiBLaW1icm8gPC9BPmFuZCBhZGRpdGlvbnMgYnkgPEEgSFJFRj0ibWFpbHRvOmphbWVzQGNvbmNlcHRvZnplcm8ubmV0Ij4KKwkJCQlKYW1lcyBUdXJrPC9BPgorCQk8L0gzPgorCQk8cD4KKwkJCVlvdSBjYW4gZWl0aGVyIHVzZSB0aGUgcHJlY29tcGlsZWQgbGlicmFyaWVzIGZyb20gPEEgSFJFRj0iaHR0cDovL3d3dy5saWJzZGwub3JnL2Rvd25sb2FkLnBocCI+CisJCQkJdGhlIFNETCBEb3dubG9hZCB3ZWIgc2l0ZSA8L0E+LCBvciB5b3UgY2FuIGJ1aWxkIFNETCB5b3Vyc2VsZi4KKwkJPC9wPgorCQk8SDM+CisJCQlCdWlsZGluZyBTREwKKwkJPC9IMz4KKwkJPFA+CisJCQlHbyBpbnRvIHRoZSBWaXN1YWxDCisJCQlkaXJlY3RvcnkgdGhhdCBpcyBjcmVhdGVkLCBhbmQgZG91YmxlLWNsaWNrIG9uIHRoZSBWQysrIGZpbGUgIjxDT0RFPlNETC5kc3c8L0NPREU+IjxTVFJPTkc+PEZPTlQgY29sb3I9IiMwMDk5MDAiPgorCQkJCQkoIjxDT0RFPlNETC5zbG48L0NPREU+IikuPC9GT05UPjwvU1RST05HPiBUaGlzIHNob3VsZCBvcGVuIHVwIHRoZSBJREUuCisJCTwvUD4KKwkJPFA+CisJCQlZb3UgbWF5IGJlIHByb21wdGVkIGF0IHRoaXMgcG9pbnQgdG8gdXBncmFkZSB0aGUgd29ya3NwYWNlLCBzaG91bGQgeW91IGJlIHVzaW5nIAorCQkJYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIFZpc3VhbCBDKysuIElmIHNvLCBhbGxvdyB0aGUgd29ya3NwYWNlIHRvIGJlIHVwZ3JhZGVkLgorCQk8L1A+CisJCTxQPgorCQkJQnVpbGQgdGhlIDxDT0RFPi5kbGw8L0NPREU+IGFuZCA8Q09ERT4ubGliPC9DT0RFPiBmaWxlcy4KKwkJPC9QPgorCQk8UD4KKwkJCVRoaXMgaXMgZG9uZSBieSByaWdodCBjbGlja2luZyBvbiBlYWNoIHByb2plY3QgaW4gdHVybiAoUHJvamVjdHMgYXJlIGxpc3RlZCBpbiAKKwkJCXRoZSBXb3Jrc3BhY2UgcGFuZWwgaW4gdGhlIEZpbGVWaWV3IHRhYiksIGFuZCBzZWxlY3RpbmcgIkJ1aWxkIi4KKwkJPC9QPgorCQk8UD4KKwkJCUlmIHlvdSBnZXQgYW4gZXJyb3IgYWJvdXQgU0RMX2NvbmZpZy5oIGJlaW5nIG1pc3NpbmcsIHlvdSBzaG91bGQKKwkJCWNvcHkgaW5jbHVkZS9TRExfY29uZmlnLmguZGVmYXVsdCB0byBpbmNsdWRlL1NETF9jb25maWcuaCBhbmQgdHJ5IGFnYWluLgorCQk8L1A+CisJCTxQPgorCQkJWW91IG1heSBnZXQgYSBmZXcgd2FybmluZ3MsIGJ1dCB5b3Ugc2hvdWxkIG5vdCBnZXQgYW55IGVycm9ycy4gWW91IGRvIGhhdmUgdG8gCisJCQloYXZlIGF0IGxlYXN0IHRoZSBEaXJlY3RYIDUgU0RLIGluc3RhbGxlZCwgaG93ZXZlci4gVGhlIGxhdGVzdCAKKwkJCXZlcnNpb24gb2YgRGlyZWN0WCBjYW4gYmUgZG93bmxvYWRlZCBvciBwdXJjaGFzZWQgb24gYSBjaGVhcCBDRCAobXkgCisJCQlyZWNvbW1lbmRhdGlvbikgZnJvbSA8QSBIUkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20iPk1pY3Jvc29mdCA8L0E+LgorCQk8L1A+CisJCTxQPgorCQkJTGF0ZXIsIHdlIHdpbGwgcmVmZXIgdG8gdGhlIGZvbGxvd2luZyAubGliIGFuZCAuZGxsIGZpbGVzIHRoYXQgaGF2ZSBqdXN0IGJlZW4gCisJCQlnZW5lcmF0ZWQ6CisJCTwvUD4KKwkJPHVsPgorICAgIDxsaT4gU0RMLmRsbDwvbGk+CisgICAgPGxpPiBTREwubGliPC9saT4KKyAgICA8bGk+IFNETG1haW4ubGliPC9saT4KKyAgICA8L3VsPgorCQk8UD4KKwkJCVNlYXJjaCBmb3IgdGhlc2UgdXNpbmcgdGhlIFdpbmRvd3MgRmluZCAoV2luZG93cy1GKSB1dGlsaXR5LCBpZiB5b3UgZG9uJ3QgCisJCQlhbHJlYWR5IGtub3cgd2hlcmUgdGhleSBzaG91bGQgYmUuIEZvciB0aG9zZSBvZiB5b3Ugd2l0aCBhIGNsdWUsIGxvb2sgaW5zaWRlIAorCQkJdGhlIERlYnVnIG9yIFJlbGVhc2UgZGlyZWN0b3JpZXMgb2YgdGhlIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSBQcm9qZWN0IGZvbGRlci4gCisJCQkoSXQgbWlnaHQgYmUgZWFzaWVyIHRvIGp1c3QgdXNlIFdpbmRvd3MgRmluZCBpZiB0aGlzIHNvdW5kcyBjb25mdXNpbmcuIEFuZCAKKwkJCWRvbid0IHdvcnJ5IGFib3V0IG5lZWRpbmcgYSBjbHVlOyB3ZSBhbGwgbmVlZCB2aXNpdHMgZnJvbSB0aGUgY2x1ZSBmYWlyeSAKKwkJCWZyZXF1ZW50bHkuKQorCQk8L1A+CisJCTxIMz4KKwkJCUNyZWF0aW5nIGEgUHJvamVjdCB3aXRoIFNETAorCQk8L0gzPgorCQk8UD4KKwkJCUNyZWF0ZSBhIHByb2plY3QgYXMgYSBXaW4zMiBBcHBsaWNhdGlvbi4KKwkJPC9QPgorCQk8UD4KKwkJCUNyZWF0ZSBhIEMrKyBmaWxlIGZvciB5b3VyIHByb2plY3QuCisJCTwvUD4KKwkJPFA+CisJCQlTZXQgdGhlIEMgcnVudGltZSB0byAiTXVsdGktdGhyZWFkZWQgRExMIiBpbiB0aGUgbWVudTogPENPREU+UHJvamVjdHxTZXR0aW5nc3xDL0MrKyAKKwkJCQl0YWJ8Q29kZSBHZW5lcmF0aW9ufFJ1bnRpbWUgTGlicmFyeSA8L0NPREU+LgorCQk8L1A+CisJCTxQPgorCQkJQWRkIHRoZSBTREwgPENPREU+aW5jbHVkZTwvQ09ERT4gZGlyZWN0b3J5IHRvIHlvdXIgbGlzdCBvZiBpbmNsdWRlcyBpbiB0aGUgCisJCQltZW51OiA8Q09ERT5Qcm9qZWN0fFNldHRpbmdzfEMvQysrIHRhYnxQcmVwcm9jZXNzb3J8QWRkaXRpb25hbCBpbmNsdWRlIGRpcmVjdG9yaWVzIDwvQ09ERT4KKwkJCS4KKwkJCTxicj4KKwkJCTxTVFJPTkc+PEZPTlQgY29sb3I9IiMwMDk5MDAiPlZDNyBTcGVjaWZpYzogSW5zdGVhZCBvZiBkb2luZyB0aGlzIEkgZmluZCBpdCBlYXNpZXIgdG8gCisJCQkJCWFkZCB0aGUgaW5jbHVkZSBhbmQgbGlicmFyeSBkaXJlY3RvcmllcyB0byB0aGUgbGlzdCB0aGF0IFZDNyBrZWVwcy4gRG8gdGhpcyBieSAKKwkJCQkJc2VsZWN0aW5nIFRvb2xzfE9wdGlvbnN8UHJvamVjdHN8VkMrKyBEaXJlY3RvcmllcyBhbmQgdW5kZXIgdGhlICJTaG93IAorCQkJCQlEaXJlY3RvcmllcyBGb3I6IiBkcm9wYm94IHNlbGVjdCAiSW5jbHVkZSBGaWxlcyIsIGFuZCBjbGljayB0aGUgIk5ldyBEaXJlY3RvcnkgCisJCQkJCUljb24iIGFuZCBhZGQgdGhlIFtTRExST09UXVxpbmNsdWRlIGRpcmVjdG9yeSAoZXguIElmIHlvdSBpbnN0YWxsZWQgdG8gCisJCQkJCWM6XFNETC0xLjIuNVwgYWRkIGM6XFNETC0xLjIuNVxpbmNsdWRlKS4mbmJzcDtQcm9jZWVkIHRvJm5ic3A7Y2hhbmdlIHRoZSAKKwkJCQkJZHJvcGJveCBzZWxlY3Rpb24gdG8gIkxpYnJhcnkgRmlsZXMiIGFuZCBhZGQgW1NETFJPT1RdXGxpYi48L0ZPTlQ+PC9TVFJPTkc+CisJCTwvUD4KKwkJCTxQPgorCQkJCVRoZSAiaW5jbHVkZSBkaXJlY3RvcnkiIEkgYW0gcmVmZXJyaW5nIHRvIGlzIHRoZSA8Q09ERT5pbmNsdWRlPC9DT0RFPiBmb2xkZXIgCisJCQkJd2l0aGluIHRoZSBtYWluIFNETCBkaXJlY3RvcnkgKHRoZSBvbmUgdGhhdCB0aGlzIEhUTUwgZmlsZSBsb2NhdGVkIHdpdGhpbikuCisJCQk8L1A+CisJCQk8UD4KKwkJCQlOb3cgd2UncmUgZ29pbmcgdG8gdXNlIHRoZSBmaWxlcyB0aGF0IHdlIGhhZCBjcmVhdGVkIGVhcmxpZXIgaW4gdGhlIEJ1aWxkIFNETCAKKwkJCQlzdGVwLgorCQkJPC9QPgorCQkJPFA+CisJCQkJQ29weSB0aGUgZm9sbG93aW5nIGZpbGVzIGludG8geW91ciBQcm9qZWN0IGRpcmVjdG9yeToKKwkJCTwvUD4KKwkJCTx1bD4KKyAgICAgPGxpPiBTREwuZGxsPC9saT4KKyAgICAgPC91bD4KKwkJCTxQPgorCQkJCUFkZCB0aGUgZm9sbG93aW5nIGZpbGVzIHRvIHlvdXIgcHJvamVjdCAoSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb3B5IHRoZW0gdG8gCisJCQkJeW91ciBwcm9qZWN0IGRpcmVjdG9yeSk6CisJCQk8L1A+CisJCQk8dWw+CisgICAgIDxsaT4gU0RMLmxpYiA8L2xpPgorICAgICA8bGk+IFNETG1haW4ubGliPC9saT4KKyAgICAgPC91bD4KKwkJCTxQPgorCQkJCShUbyBhZGQgdGhlbSB0byB5b3VyIHByb2plY3QsIHJpZ2h0IGNsaWNrIG9uIHlvdXIgcHJvamVjdCwgYW5kIHNlbGVjdCAiQWRkIAorCQkJCWZpbGVzIHRvIHByb2plY3QiKQorCQkJPC9QPgorCQk8UD48U1RST05HPjxGT05UIGNvbG9yPSIjMDA5OTAwIj5JbnN0ZWFkIG9mIGFkZGluZyB0aGUgZmlsZXMgdG8geW91ciBwcm9qZWN0IGl0IGlzIG1vcmUgCisJCQkJCWRlc2lyZWFibGUgdG8gYWRkIHRoZW0gdG8gdGhlIGxpbmtlciBvcHRpb25zOiBQcm9qZWN0fFByb3BlcnRpZXN8TGlua2VyfENvbW1hbmQgCisJCQkJCUxpbmUgYW5kIHR5cGUgdGhlIG5hbWVzIG9mIHRoZSBsaWJyYXJpZXMgdG8gbGluayB3aXRoIGluIHRoZSAiQWRkaXRpb25hbCAKKwkJCQkJT3B0aW9uczoiIGJveC4mbmJzcDsgTm90ZTogVGhpcyBtdXN0IGJlIGRvbmUmbmJzcDtmb3ImbmJzcDtlYWNoJm5ic3A7YnVpbGQgCisJCQkJCWNvbmZpZ3VyYXRpb24gKGVnLiBSZWxlYXNlLERlYnVnKS48L0ZPTlQ+PC9TVFJPTkc+PC9QPgorCQk8SDM+CisJCQlTREwgMTAxLCBGaXJzdCBEYXkgb2YgQ2xhc3MKKwkJPC9IMz4KKwkJPFA+CisJCQlOb3cgY3JlYXRlIHRoZSBiYXNpYyBib2R5IG9mIHlvdXIgcHJvamVjdC4gVGhlIGJvZHkgb2YgeW91ciBwcm9ncmFtIHNob3VsZCB0YWtlIAorCQkJdGhlIGZvbGxvd2luZyBmb3JtOiA8Q09ERT4KKwkJCQk8UFJFPgorI2luY2x1ZGUgIlNETC5oIgorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApCit7CisgIC8vIEJvZHkgb2YgdGhlIHByb2dyYW0gZ29lcyBoZXJlLgorICByZXR1cm4gMDsKK30KKzwvUFJFPgorCQkJPC9DT0RFPgorCQk8UD48L1A+CisJCTxIMz4KKwkJCVRoYXQncyBpdCEKKwkJPC9IMz4KKwkJPFA+CisJCQlJIGhvcGUgdGhhdCB0aGlzIGRvY3VtZW50IGhhcyBoZWxwZWQgeW91IGdldCB0aHJvdWdoIHRoZSBtb3N0IGRpZmZpY3VsdCBwYXJ0IG9mIAorCQkJdXNpbmcgdGhlIFNETDogaW5zdGFsbGluZyBpdC4gU3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50cyB0byB0aGlzIGRvY3VtZW50IAorCQkJc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHdyaXRlcnMgb2YgdGhpcyBkb2N1bWVudC4KKwkJPC9QPgorCQk8UD4KKwkJCVRoYW5rcyB0byBQYXVsdXMgRXN0ZXJoYXp5IChwZXN0ZXJoYXp5QGdteC5uZXQpLCBmb3IgdGhlIHdvcmsgb24gVkMrKyBwb3J0LgorCQk8L1A+CisJCTxQPgorCQkJVGhpcyBkb2N1bWVudCB3YXMgb3JpZ2luYWxseSBjYWxsZWQgIlZpc3VhbEMudHh0IiwgYW5kIHdhcyB3cml0dGVuIGJ5IDxBIEhSRUY9Im1haWx0bzpzbG91a2VuQGxpYnNkbC5vcmciPgorCQkJCVNhbSBMYW50aW5nYTwvQT4uCisJCTwvUD4KKwkJPFA+CisJCQlMYXRlciwgaXQgd2FzIGNvbnZlcnRlZCB0byBIVE1MIGFuZCBleHBhbmRlZCBpbnRvIHRoZSBkb2N1bWVudCB0aGF0IHlvdSBzZWUgCisJCQl0b2RheSBieSA8QSBIUkVGPSJtYWlsdG86c25vd2xpb25Ac3ByeW5ldC5jb20iPkxpb24gS2ltYnJvPC9BPi4KKwkJPC9QPgorCQk8UD5NaW5vciBGaXhlcyBhbmQgVmlzdWFsIEMrKyA3IEluZm9ybWF0aW9uIChJbiBHcmVlbikgd2FzIGFkZGVkIGJ5IDxBIEhSRUY9Im1haWx0bzpqYW1lc0Bjb25jZXB0b2Z6ZXJvLm5ldCI+SmFtZXMgVHVyazwvQT4KKwkJPC9QPgorCTwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL1NETC5kc3cgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy9TREwuZHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTI4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy9TREwuZHN3CkBAIC0wLDAgKzEsNDEgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCisjIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJTREwiPS5cU0RMXFNETC5EU1AgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogIlNETG1haW4iPS5cU0RMbWFpblxTRExtYWluLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitHbG9iYWw6CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTwzPgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy9TREwuc2xuIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RMLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDVlZGJjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RMLnNsbgpAQCAtMCwwICsxLDQ1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMDgKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiU0RMIiwgIlNETFxTREwudmNwcm9qIiwgIns4MUNFOERBRi1FQkIyLTQ3NjEtOEU0NS1CNzFBQkNDQThDNjh9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJTRExtYWluIiwgIlNETG1haW5cU0RMbWFpbi52Y3Byb2oiLCAie0RBOTU2RkQzLUUxNDItNDZGMi05REQ1LUM3OEJFQkI1NkI3QX0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlSZWxlYXNlX05vU1RESU98V2luMzIgPSBSZWxlYXNlX05vU1RESU98V2luMzIKKwkJUmVsZWFzZV9Ob1NURElPfHg2NCA9IFJlbGVhc2VfTm9TVERJT3x4NjQKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7ODFDRThEQUYtRUJCMi00NzYxLThFNDUtQjcxQUJDQ0E4QzY4fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7ODFDRThEQUYtRUJCMi00NzYxLThFNDUtQjcxQUJDQ0E4QzY4fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezgxQ0U4REFGLUVCQjItNDc2MS04RTQ1LUI3MUFCQ0NBOEM2OH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NAorCQl7ODFDRThEQUYtRUJCMi00NzYxLThFNDUtQjcxQUJDQ0E4QzY4fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NAorCQl7ODFDRThEQUYtRUJCMi00NzYxLThFNDUtQjcxQUJDQ0E4QzY4fS5SZWxlYXNlX05vU1RESU98V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7ODFDRThEQUYtRUJCMi00NzYxLThFNDUtQjcxQUJDQ0E4QzY4fS5SZWxlYXNlX05vU1RESU98V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezgxQ0U4REFGLUVCQjItNDc2MS04RTQ1LUI3MUFCQ0NBOEM2OH0uUmVsZWFzZV9Ob1NURElPfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NAorCQl7ODFDRThEQUYtRUJCMi00NzYxLThFNDUtQjcxQUJDQ0E4QzY4fS5SZWxlYXNlX05vU1RESU98eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NAorCQl7ODFDRThEQUYtRUJCMi00NzYxLThFNDUtQjcxQUJDQ0E4QzY4fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezgxQ0U4REFGLUVCQjItNDc2MS04RTQ1LUI3MUFCQ0NBOEM2OH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7ODFDRThEQUYtRUJCMi00NzYxLThFNDUtQjcxQUJDQ0E4QzY4fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NAorCQl7ODFDRThEQUYtRUJCMi00NzYxLThFNDUtQjcxQUJDQ0E4QzY4fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQKKwkJe0RBOTU2RkQzLUUxNDItNDZGMi05REQ1LUM3OEJFQkI1NkI3QX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0RBOTU2RkQzLUUxNDItNDZGMi05REQ1LUM3OEJFQkI1NkI3QX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtEQTk1NkZEMy1FMTQyLTQ2RjItOURENS1DNzhCRUJCNTZCN0F9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQKKwkJe0RBOTU2RkQzLUUxNDItNDZGMi05REQ1LUM3OEJFQkI1NkI3QX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQKKwkJe0RBOTU2RkQzLUUxNDItNDZGMi05REQ1LUM3OEJFQkI1NkI3QX0uUmVsZWFzZV9Ob1NURElPfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2VfTm9TVERJT3xXaW4zMgorCQl7REE5NTZGRDMtRTE0Mi00NkYyLTlERDUtQzc4QkVCQjU2QjdBfS5SZWxlYXNlX05vU1RESU98V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VfTm9TVERJT3xXaW4zMgorCQl7REE5NTZGRDMtRTE0Mi00NkYyLTlERDUtQzc4QkVCQjU2QjdBfS5SZWxlYXNlX05vU1RESU98eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VfTm9TVERJT3x4NjQKKwkJe0RBOTU2RkQzLUUxNDItNDZGMi05REQ1LUM3OEJFQkI1NkI3QX0uUmVsZWFzZV9Ob1NURElPfHg2NC5CdWlsZC4wID0gUmVsZWFzZV9Ob1NURElPfHg2NAorCQl7REE5NTZGRDMtRTE0Mi00NkYyLTlERDUtQzc4QkVCQjU2QjdBfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0RBOTU2RkQzLUUxNDItNDZGMi05REQ1LUM3OEJFQkI1NkI3QX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7REE5NTZGRDMtRTE0Mi00NkYyLTlERDUtQzc4QkVCQjU2QjdBfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NAorCQl7REE5NTZGRDMtRTE0Mi00NkYyLTlERDUtQzc4QkVCQjU2QjdBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy9TREwvU0RMLmRzcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL1NETC9TREwuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODM4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy9TREwvU0RMLmRzcApAQCAtMCwwICsxLDU0NiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJTREwiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgorCitDRkc9U0RMIC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiU0RMLk1BSyIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiU0RMLk1BSyIgQ0ZHPSJTREwgLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJTREwgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorQ1BQPWNsLmV4ZQorTVRMPW1pZGwuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EIF9XSU4zMl9XSU5OVD0weDA0MDAgL1lYIC9GRCAvYworIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgd2lubW0ubGliIGR4Z3VpZC5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgX1dJTjMyX1dJTk5UPTB4MDQwMCAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKyMgQUREIExJTkszMiB3aW5tbS5saWIgZHhndWlkLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgIlNETCAtIFdpbjMyIFJlbGVhc2UiCisjIE5hbWUgIlNETCAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXGJsYW5rX2N1cnNvci5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luZHg1XERpcmVjdHguaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xTREwuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xldmVudHNcU0RMX2FjdGl2ZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpby5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvY3Z0LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9ibGl0XzAuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdF8xLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXRfQS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9ibGl0X0EuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdF9OLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX2JtcC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGNkcm9tXFNETF9jZHJvbS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGNwdWluZm9cU0RMX2NwdWluZm8uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50cy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXGRpc2tcU0RMX2Rpc2thdWRpby5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXGRpc2tcU0RMX2Rpc2thdWRpby5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXGR1bW15XFNETF9kdW1teWF1ZGlvLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cZHVtbXlcU0RMX2R1bW15YXVkaW8uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xhdWRpb1x3aW5keDVcU0RMX2R4NWF1ZGlvLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cd2luZHg1XFNETF9keDVhdWRpby5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXHdpbmR4NVxTRExfZHg1ZXZlbnRzLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luZHg1XFNETF9keDVldmVudHNfYy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXHdpbmR4NVxTRExfZHg1dmlkZW8uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5keDVcU0RMX2R4NXZpZGVvLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luZHg1XFNETF9keDV5dXYuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5keDVcU0RMX2R4NXl1dl9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcU0RMX2Vycm9yLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcU0RMX2Vycm9yX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50cy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xldmVudHNcU0RMX2V4cG9zZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXFNETF9mYXRhbC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXFNETF9mYXRhbC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9nYW1tYS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHN0ZGxpYlxTRExfZ2V0ZW52LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcc3RkbGliXFNETF9pY29udi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGljay5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcZXZlbnRzXFNETF9rZXlib2FyZC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xzdGRsaWJcU0RMX21hbGxvYy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9taXhlci5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xqb3lzdGlja1x3aW4zMlxTRExfbW1qb3lzdGljay5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfbW91c2UuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbGV2ZW50cy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsZXZlbnRzX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbG1vdXNlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcc3RkbGliXFNETF9xc29ydC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfcXVpdC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfcmVzaXplLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xmaWxlXFNETF9yd29wcy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHN0ZGxpYlxTRExfc3RkbGliLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcc3RkbGliXFNETF9zdHJpbmcuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfc3VyZmFjZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGNkcm9tXHdpbjMyXFNETF9zeXNjZHJvbS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXNjb25kLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNldmVudHMuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGxvYWRzb1x3aW4zMlxTRExfc3lzbG9hZHNvLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzbXV0ZXguYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3NlbS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGltZXJcd2luMzJcU0RMX3N5c3RpbWVyLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRpbWVyXFNETF90aW1lci5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX3ZpZGVvLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX3l1di5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3cuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cVmVyc2lvbi5yYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cV21tc2cuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RML1NETC52Y3Byb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy9TREwvU0RMLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGZmYWVhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RML1NETC52Y3Byb2oKQEAgLTAsMCArMSw4MjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI5LjAwIgorCU5hbWU9IlNETCIKKwlQcm9qZWN0R1VJRD0iezgxQ0U4REFGLUVCQjItNDc2MS04RTQ1LUI3MUFCQ0NBOEM2OH0iCisJUm9vdE5hbWVzcGFjZT0iU0RMIgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJ4NjQiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnL1NETC50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDskKFByb2plY3REaXIpXC4uXC4uXGluY2x1ZGUmcXVvdDsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfREVCVUc7X1dJTkRPV1M7X1dJTjMyX1dJTk5UPTB4MDQwMCIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvU0RMLnBjaCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2IgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Indpbm1tLmxpYiBkeGd1aWQubGliIgorCQkJCU91dHB1dEZpbGU9Ii5cRGVidWcvU0RMLmRsbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9ImZhbHNlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL1NETC5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJCUNMUlVubWFuYWdlZENvZGVDaGVjaz0iZmFsc2UiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3x4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnL1NETC50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDskKFByb2plY3REaXIpXC4uXC4uXGluY2x1ZGUmcXVvdDsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfREVCVUc7X1dJTkRPV1M7X1dJTjMyX1dJTk5UPTB4MDQwMCIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvU0RMLnBjaCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Indpbm1tLmxpYiBkeGd1aWQubGliIgorCQkJCU91dHB1dEZpbGU9Ii5cRGVidWcvU0RMLmRsbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9ImZhbHNlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL1NETC5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJCVRhcmdldE1hY2hpbmU9IjE3IgorCQkJCUNMUlVubWFuYWdlZENvZGVDaGVjaz0iZmFsc2UiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS9TREwudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9ImZhbHNlIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoUHJvamVjdERpcilcLi5cLi5caW5jbHVkZSZxdW90OyIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO05ERUJVRztfV0lORE9XUztfV0lOMzJfV0lOTlQ9MHgwNDAwIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvU0RMLnBjaCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ3aW5tbS5saWIgZHhndWlkLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2UvU0RMLmRsbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9ImZhbHNlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS9TREwucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8eDY0IgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL1NETC50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0iZmFsc2UiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7JChQcm9qZWN0RGlyKVwuLlwuLlxpbmNsdWRlJnF1b3Q7IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7TkRFQlVHO19XSU5ET1dTO19XSU4zMl9XSU5OVD0weDA0MDAiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS9TREwucGNoIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJmYWxzZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Indpbm1tLmxpYiBkeGd1aWQubGliIgorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZS9TREwuZGxsIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxSZWxlYXNlL1NETC5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJCVRhcmdldE1hY2hpbmU9IjE3IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXFNETC5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xldmVudHNcU0RMX2FjdGl2ZS5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW8uYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvY3Z0LmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdF8wLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0XzEuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXRfQS5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdF9BLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0X04uYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JtcC5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xjZHJvbVxTRExfY2Ryb20uYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcY3B1aW5mb1xTRExfY3B1aW5mby5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHMuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcYXVkaW9cZGlza1xTRExfZGlza2F1ZGlvLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXGRpc2tcU0RMX2Rpc2thdWRpby5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xkdW1teVxTRExfZHVtbXlhdWRpby5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xkdW1teVxTRExfZHVtbXlhdWRpby5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1x3aW5keDVcU0RMX2R4NWF1ZGlvLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXHdpbmR4NVxTRExfZHg1YXVkaW8uaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cV2luZHg1XFNETF9keDVldmVudHMuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cV2luZHg1XFNETF9keDVldmVudHNfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xXaW5keDVcU0RMX2R4NXZpZGVvLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFdpbmR4NVxTRExfZHg1dmlkZW8uaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luZHg1XFNETF9keDV5dXYuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luZHg1XFNETF9keDV5dXZfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xTRExfZXJyb3IuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHMuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xldmVudHNcU0RMX2V4cG9zZS5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xTRExfZmF0YWwuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9nYW1tYS5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xzdGRsaWJcU0RMX2dldGVudi5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xzdGRsaWJcU0RMX2ljb252LmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGljay5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xldmVudHNcU0RMX2tleWJvYXJkLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHN0ZGxpYlxTRExfbWFsbG9jLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlci5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGpveXN0aWNrXHdpbjMyXFNETF9tbWpveXN0aWNrLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGV2ZW50c1xTRExfbW91c2UuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHMuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbG1vdXNlLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsbW91c2VfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVscy5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcc3RkbGliXFNETF9xc29ydC5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xldmVudHNcU0RMX3F1aXQuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9yZXNpemUuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGZpbGVcU0RMX3J3b3BzLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHN0ZGxpYlxTRExfc3RkbGliLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoX2MuaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcc3RkbGliXFNETF9zdHJpbmcuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N1cmZhY2UuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGNkcm9tXHdpbjMyXFNETF9zeXNjZHJvbS5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xjZHJvbVxTRExfc3lzY2Ryb20uaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c2NvbmQuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNldmVudHMuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGxvYWRzb1x3aW4zMlxTRExfc3lzbG9hZHNvLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2UuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzbXV0ZXguYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXNzZW0uYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWQuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aW1lclx3aW4zMlxTRExfc3lzdGltZXIuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZC5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lci5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfdmlkZW8uYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5jIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfeXV2LmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3cuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cV21tc2cuaCIKKwkJCT4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RML1ZlcnNpb24ucmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy9TREwvVmVyc2lvbi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ3NzMwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RML1ZlcnNpb24ucmMKQEAgLTAsMCArMSwxMDUgQEAKKy8vTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gZ2VuZXJhdGVkIHJlc291cmNlIHNjcmlwdC4KKy8vCisjaW5jbHVkZSAicmVzb3VyY2UuaCIKKworI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAyIHJlc291cmNlLgorLy8KKyNpbmNsdWRlICJ3aW5yZXNyYy5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcworCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpCisjaWZkZWYgX1dJTjMyCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUworI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKKyNlbmRpZiAvL19XSU4zMgorCisjaWZuZGVmIF9NQUMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gVmVyc2lvbgorLy8KKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gMSwyLDE1LDAKKyBQUk9EVUNUVkVSU0lPTiAxLDIsMTUsMAorIEZJTEVGTEFHU01BU0sgMHgzZkwKKyNpZmRlZiBfREVCVUcKKyBGSUxFRkxBR1MgMHgxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisgRklMRU9TIDB4NDAwMDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJcMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiU0RMXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAiMSwgMiwgMTUsIDBcMCIKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAiU0RMXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IKkgMjAxMiBTYW0gTGFudGluZ2FcMCIKKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgIlNETC5kbGxcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXJcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxLCAyLCAxNSwgMFwwIgorICAgICAgICBFTkQKKyAgICBFTkQKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKKyAgICBFTkQKK0VORAorCisjZW5kaWYgICAgLy8gIV9NQUMKKworCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBURVhUSU5DTFVERQorLy8KKworMSBURVhUSU5DTFVERSBESVNDQVJEQUJMRSAKK0JFR0lOCisgICAgInJlc291cmNlLmhcMCIKK0VORAorCisyIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIAorQkVHSU4KKyAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiIKKyAgICAiXDAiCitFTkQKKworMyBURVhUSU5DTFVERSBESVNDQVJEQUJMRSAKK0JFR0lOCisgICAgIlxyXG4iCisgICAgIlwwIgorRU5ECisKKyNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECisKKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisjaWZuZGVmIEFQU1RVRElPX0lOVk9LRUQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDMgcmVzb3VyY2UuCisvLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZW5kaWYgICAgLy8gbm90IEFQU1RVRElPX0lOVk9LRUQKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RML3Jlc291cmNlLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy9TREwvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmZkODFkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RML3Jlc291cmNlLmgKQEAgLTAsMCArMSwxNSBAQAorLy97e05PX0RFUEVOREVOQ0lFU319CisvLyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgorLy8gVXNlZCBieSBWZXJzaW9uLnJjCisvLworCisvLyBOZXh0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgb2JqZWN0cworLy8gCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorI2lmbmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRSAgICAgICAgMTAxCisjZGVmaW5lIF9BUFNfTkVYVF9DT01NQU5EX1ZBTFVFICAgICAgICAgNDAwMDEKKyNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDAwCisjZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAgICAgICAgICAgMTAxCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RMbWFpbi9TRExtYWluLmRzcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL1NETG1haW4vU0RMbWFpbi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmYTQwYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL1NETG1haW4vU0RMbWFpbi5kc3AKQEAgLTAsMCArMSwxMDYgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iU0RMbWFpbiIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0CisKK0NGRz1TRExtYWluIC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiU0RMbWFpbi5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgIlNETG1haW4ubWFrIiBDRkc9IlNETG1haW4gLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMbWFpbiAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgUmVsZWFzZV9Ob1NURElPIiAoYmFzZWQgb25cCisgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0kgIi4uXC4uXGluY2x1ZGVcU0RMIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvWjcgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvSSAiLi5cLi5caW5jbHVkZVxTREwiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiBSZWxlYXNlX05vU1RESU8iCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJTRExtYWluXyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlNETG1haW5fIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2VfTk9TVERJTyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlX05PU1RESU8iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXGluY2x1ZGUiIC9JICIuLlwuLlxpbmNsdWRlXFNETCIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0kgIi4uXC4uXGluY2x1ZGVcU0RMIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIk5PX1NURElPX1JFRElSRUNUIiAvWVggL0ZEIC9jCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJTRExtYWluIC0gV2luMzIgRGVidWciCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiBSZWxlYXNlX05vU1RESU8iCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxTcmNcTWFpblxXaW4zMlxTRExfd2luMzJfbWFpbi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy9TRExtYWluL1NETG1haW4udmNwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RMbWFpbi9TRExtYWluLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWIwYWZjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvU0RMbWFpbi9TRExtYWluLnZjcHJvagpAQCAtMCwwICsxLDQyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjkuMDAiCisJTmFtZT0iU0RMbWFpbiIKKwlQcm9qZWN0R1VJRD0ie0RBOTU2RkQzLUUxNDItNDZGMi05REQ1LUM3OEJFQkI1NkI3QX0iCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTMxMDcyIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9Ing2NCIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGUsLi5cLi5caW5jbHVkZVxTREwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtXSU4zMixOREVCVUcsX1dJTkRPV1MiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS9TRExtYWluLnBjaCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfHg2NCIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5caW5jbHVkZSwuLlwuLlxpbmNsdWRlXFNETCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1dJTjMyLE5ERUJVRyxfV0lORE9XUyIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL1NETG1haW4ucGNoIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2VfTm9TVERJT3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlX05PU1RESU8iCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZV9OT1NURElPIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGUsLi5cLi5caW5jbHVkZVxTREwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtXSU4zMixOREVCVUcsX1dJTkRPV1MsTk9fU1RESU9fUkVESVJFQ1QiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZV9OT1NURElPL1NETG1haW4ucGNoIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2VfTm9TVERJT3x4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGUsLi5cLi5caW5jbHVkZVxTREwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtXSU4zMixOREVCVUcsX1dJTkRPV1MsTk9fU1RESU9fUkVESVJFQ1QiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZV9OT1NURElPL1NETG1haW4ucGNoIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxpbmNsdWRlLC4uXC4uXGluY2x1ZGVcU0RMIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7V0lOMzIsX0RFQlVHLF9XSU5ET1dTIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy9TRExtYWluLnBjaCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfHg2NCIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGUsLi5cLi5caW5jbHVkZVxTREwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtXSU4zMixfREVCVUcsX1dJTkRPV1MiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL1NETG1haW4ucGNoIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIxIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cU3JjXE1haW5cV2luMzJcU0RMX3dpbjMyX21haW4uYyIKKwkJCT4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvZ3JheXdpbi9ncmF5d2luLmRzcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL2dyYXl3aW4vZ3JheXdpbi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmODNhZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL2dyYXl3aW4vZ3JheXdpbi5kc3AKQEAgLTAsMCArMSwxMDIgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iZ3JheXdpbiIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIgMHgwMTAxCisKK0NGRz1ncmF5d2luIC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiZ3JheXdpbi5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImdyYXl3aW4ubWFrIiBDRkc9ImdyYXl3aW4gLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJncmF5d2luIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAiZ3JheXdpbiAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitNVEw9bWlkbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAiZ3JheXdpbiAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJncmF5d2luIC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImdyYXl3aW4gLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJncmF5d2luIC0gV2luMzIgRGVidWciCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlwuLlx0ZXN0XGdyYXl3aW4uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXFNkbFxEZWJ1Z1xTREwubGliCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cU0RMbWFpblxEZWJ1Z1xTRExtYWluLmxpYgorIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvZ3JheXdpbi9ncmF5d2luLnZjcHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL2dyYXl3aW4vZ3JheXdpbi52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1ZGZlZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL2dyYXl3aW4vZ3JheXdpbi52Y3Byb2oKQEAgLTAsMCArMSwyMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LjAwIgorCU5hbWU9ImdyYXl3aW4iCisJUHJvamVjdEdVSUQ9InswQkNDQTBCRi0wNzNFLTQzOUUtQkNFMC1DOTM1M0MxNzc0ODd9IgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cRGVidWciCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnL2dyYXl3aW4udGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIsX0RFQlVHLF9XSU5ET1dTIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy9ncmF5d2luLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiIKKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL2dyYXl3aW4uZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cRGVidWcvZ3JheXdpbi5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL2dyYXl3aW4udGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMixOREVCVUcsX1dJTkRPV1MiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS9ncmF5d2luLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlL2dyYXl3aW4uZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxSZWxlYXNlL2dyYXl3aW4ucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx0ZXN0XGdyYXl3aW4uYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTZGxcRGVidWdcU0RMLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliIgorCQkJPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy9sb29wd2F2ZS9sb29wd2F2ZS5kc3AgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy9sb29wd2F2ZS9sb29wd2F2ZS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmODJlNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL2xvb3B3YXZlL2xvb3B3YXZlLmRzcApAQCAtMCwwICsxLDEwMiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJsb29wd2F2ZSIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIgMHgwMTAxCisKK0NGRz1sb29wd2F2ZSAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImxvb3B3YXZlLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAibG9vcHdhdmUubWFrIiBDRkc9Imxvb3B3YXZlIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAibG9vcHdhdmUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJsb29wd2F2ZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitNVEw9bWlkbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAibG9vcHdhdmUgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NgorCishRUxTRUlGICAiJChDRkcpIiA9PSAibG9vcHdhdmUgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAibG9vcHdhdmUgLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJsb29wd2F2ZSAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cLi5cVGVzdFxMb29wd2F2ZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cU2RsXERlYnVnXFNETC5saWIKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy9sb29wd2F2ZS9sb29wd2F2ZS52Y3Byb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy9sb29wd2F2ZS9sb29wd2F2ZS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjNWQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL2xvb3B3YXZlL2xvb3B3YXZlLnZjcHJvagpAQCAtMCwwICsxLDIxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjguMDAiCisJTmFtZT0ibG9vcHdhdmUiCisJUHJvamVjdEdVSUQ9IntBQUFEMUNCNS03QURBLTQ3QUUtODVBMC0wOEE2RUM0OEZBRkJ9IgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2UvbG9vcHdhdmUudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMixOREVCVUcsX1dJTkRPV1MiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS9sb29wd2F2ZS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2IgorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZS9sb29wd2F2ZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2UvbG9vcHdhdmUucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxEZWJ1ZyIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvbG9vcHdhdmUudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIsX0RFQlVHLF9XSU5ET1dTIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy9sb29wd2F2ZS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Zy9sb29wd2F2ZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy9sb29wd2F2ZS5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXFRlc3RcTG9vcHdhdmUuYyIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTZGxcRGVidWdcU0RMLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliIgorCQkJPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0YWxwaGEvdGVzdGFscGhhLmRzcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RhbHBoYS90ZXN0YWxwaGEuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NmRkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0YWxwaGEvdGVzdGFscGhhLmRzcApAQCAtMCwwICsxLDEwMiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJ0ZXN0YWxwaGEiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iIDB4MDEwMQorCitDRkc9dGVzdGFscGhhIC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidGVzdGFscGhhLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidGVzdGFscGhhLm1hayIgQ0ZHPSJ0ZXN0YWxwaGEgLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJ0ZXN0YWxwaGEgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0YWxwaGEgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorQ1BQPWNsLmV4ZQorTVRMPW1pZGwuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInRlc3RhbHBoYSAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0YWxwaGEgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAidGVzdGFscGhhIC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAidGVzdGFscGhhIC0gV2luMzIgRGVidWciCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxTZGxcRGVidWdcU0RMLmxpYgorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXFNETG1haW5cRGVidWdcU0RMbWFpbi5saWIKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlwuLlxUZXN0XHRlc3RhbHBoYS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0YWxwaGEvdGVzdGFscGhhLnZjcHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RhbHBoYS90ZXN0YWxwaGEudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MjU4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0YWxwaGEvdGVzdGFscGhhLnZjcHJvagpAQCAtMCwwICsxLDIxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjguMDAiCisJTmFtZT0idGVzdGFscGhhIgorCVByb2plY3RHVUlEPSJ7NzgxNEQ1NEItNjVEMy00Njc3LUFENzctRTBCOTgwQjRGQTJEfSIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy90ZXN0YWxwaGEudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIsX0RFQlVHLF9XSU5ET1dTIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy90ZXN0YWxwaGEucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cRGVidWcvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2IgorCQkJCU91dHB1dEZpbGU9Ii5cRGVidWcvdGVzdGFscGhhLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL3Rlc3RhbHBoYS5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL3Rlc3RhbHBoYS50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyLE5ERUJVRyxfV0lORE9XUyIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL3Rlc3RhbHBoYS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2IgorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZS90ZXN0YWxwaGEuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxSZWxlYXNlL3Rlc3RhbHBoYS5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXFNkbFxEZWJ1Z1xTREwubGliIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXFNETG1haW5cRGVidWdcU0RMbWFpbi5saWIiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cVGVzdFx0ZXN0YWxwaGEuYyIKKwkJCT4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGZpbGUvdGVzdGZpbGUuZHNwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGZpbGUvdGVzdGZpbGUuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YmIxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0ZmlsZS90ZXN0ZmlsZS5kc3AKQEAgLTAsMCArMSwxMDIgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0idGVzdGZpbGUiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iIDB4MDEwMQorCitDRkc9dGVzdGZpbGUgLSBXaW4zMiBEZWJ1ZworIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJ0ZXN0ZmlsZS5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3RmaWxlLm1hayIgQ0ZHPSJ0ZXN0ZmlsZSAtIFdpbjMyIERlYnVnIgorIU1FU1NBR0UgCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgInRlc3RmaWxlIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdGZpbGUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorQ1BQPWNsLmV4ZQorTVRMPW1pZGwuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInRlc3RmaWxlIC0gV2luMzIgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3RmaWxlIC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgInRlc3RmaWxlIC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAidGVzdGZpbGUgLSBXaW4zMiBEZWJ1ZyIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXFNkbFxEZWJ1Z1xTREwubGliCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cU0RMbWFpblxEZWJ1Z1xTRExtYWluLmxpYgorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXC4uXFRlc3RcdGVzdGZpbGUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGZpbGUvdGVzdGZpbGUudmNwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGZpbGUvdGVzdGZpbGUudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YjIzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0ZmlsZS90ZXN0ZmlsZS52Y3Byb2oKQEAgLTAsMCArMSwyMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LjAwIgorCU5hbWU9InRlc3RmaWxlIgorCVByb2plY3RHVUlEPSJ7Q0FFNEYxRDAtMzE0Ri00QjEwLTgwNUItMEVGRDY3MDEzM0EwfSIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy90ZXN0ZmlsZS50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMixfREVCVUcsX1dJTkRPV1MiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL3Rlc3RmaWxlLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiIKKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL3Rlc3RmaWxlLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL3Rlc3RmaWxlLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2UvdGVzdGZpbGUudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMixOREVCVUcsX1dJTkRPV1MiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS90ZXN0ZmlsZS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2IgorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZS90ZXN0ZmlsZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2UvdGVzdGZpbGUucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTZGxcRGVidWdcU0RMLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXFRlc3RcdGVzdGZpbGUuYyIKKwkJCT4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGdhbW1hL3Rlc3RnYW1tYS5kc3AgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0Z2FtbWEvdGVzdGdhbW1hLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM1MzZmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGdhbW1hL3Rlc3RnYW1tYS5kc3AKQEAgLTAsMCArMSwxMDIgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0idGVzdGdhbW1hIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIiAweDAxMDEKKworQ0ZHPXRlc3RnYW1tYSAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3RnYW1tYS5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3RnYW1tYS5tYWsiIENGRz0idGVzdGdhbW1hIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAidGVzdGdhbW1hIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdGdhbW1hIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK01UTD1taWRsLmV4ZQorUlNDPXJjLmV4ZQorCishSUYgICIkKENGRykiID09ICJ0ZXN0Z2FtbWEgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NgorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdGdhbW1hIC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgInRlc3RnYW1tYSAtIFdpbjMyIFJlbGVhc2UiCisjIE5hbWUgInRlc3RnYW1tYSAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cU2RsXERlYnVnXFNETC5saWIKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cLi5cdGVzdFx0ZXN0Z2FtbWEuYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGdhbW1hL3Rlc3RnYW1tYS52Y3Byb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0Z2FtbWEvdGVzdGdhbW1hLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODVkMjFmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGdhbW1hL3Rlc3RnYW1tYS52Y3Byb2oKQEAgLTAsMCArMSwyMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LjAwIgorCU5hbWU9InRlc3RnYW1tYSIKKwlQcm9qZWN0R1VJRD0ie0Q5NzRBMERGLTNFMkUtNDQ1Qy1BMkVCLUU4OTlFOUI1ODJDQn0iCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxEZWJ1ZyIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvdGVzdGdhbW1hLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyLF9ERUJVRyxfV0lORE9XUyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvdGVzdGdhbW1hLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiIKKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL3Rlc3RnYW1tYS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy90ZXN0Z2FtbWEucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS90ZXN0Z2FtbWEudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMixOREVCVUcsX1dJTkRPV1MiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS90ZXN0Z2FtbWEucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxSZWxlYXNlLyIKKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiIKKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2UvdGVzdGdhbW1hLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS90ZXN0Z2FtbWEucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTZGxcRGVidWdcU0RMLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHRlc3RcdGVzdGdhbW1hLmMiCisJCQk+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RnbC90ZXN0Z2wuZHNwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGdsL3Rlc3RnbC5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4YWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RnbC90ZXN0Z2wuZHNwCkBAIC0wLDAgKzEsMTAyIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InRlc3RnbCIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIgMHgwMTAxCisKK0NGRz10ZXN0Z2wgLSBXaW4zMiBEZWJ1ZworIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJ0ZXN0Z2wubWFrIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJ0ZXN0Z2wubWFrIiBDRkc9InRlc3RnbCAtIFdpbjMyIERlYnVnIgorIU1FU1NBR0UgCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgInRlc3RnbCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3RnbCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitNVEw9bWlkbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAidGVzdGdsIC0gV2luMzIgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIkhBVkVfT1BFTkdMIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb3BlbmdsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3RnbCAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJIQVZFX09QRU5HTCIgL1lYIC9GRCAvYworIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9wZW5nbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisKKyFFTkRJRiAKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJ0ZXN0Z2wgLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJ0ZXN0Z2wgLSBXaW4zMiBEZWJ1ZyIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXFNkbFxEZWJ1Z1xTREwubGliCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cU0RMbWFpblxEZWJ1Z1xTRExtYWluLmxpYgorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXC4uXHRlc3RcdGVzdGdsLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RnbC90ZXN0Z2wudmNwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGdsL3Rlc3RnbC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1NDQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RnbC90ZXN0Z2wudmNwcm9qCkBAIC0wLDAgKzEsMjE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOC4wMCIKKwlOYW1lPSJ0ZXN0Z2wiCisJUHJvamVjdEdVSUQ9InsyNzJEOTc2Qi1BMURGLTRERUItQkQ3Ri01QzBEMzMwRTBDN0R9IgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cRGVidWciCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnL3Rlc3RnbC50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUcsV0lOMzIsX1dJTkRPV1MsSEFWRV9PUEVOR0wiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL3Rlc3RnbC5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib3BlbmdsMzIubGliIgorCQkJCU91dHB1dEZpbGU9Ii5cRGVidWcvdGVzdGdsLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL3Rlc3RnbC5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL3Rlc3RnbC50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyxXSU4zMixfV0lORE9XUyxIQVZFX09QRU5HTCIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL3Rlc3RnbC5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2IgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9wZW5nbDMyLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2UvdGVzdGdsLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS90ZXN0Z2wucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTZGxcRGVidWdcU0RMLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHRlc3RcdGVzdGdsLmMiCisJCQk+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3Rqb3lzdGljay90ZXN0am95c3RpY2suZHNwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGpveXN0aWNrL3Rlc3Rqb3lzdGljay5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3MDVhYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3Rqb3lzdGljay90ZXN0am95c3RpY2suZHNwCkBAIC0wLDAgKzEsMTAyIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InRlc3Rqb3lzdGljayIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIgMHgwMTAxCisKK0NGRz10ZXN0am95c3RpY2sgLSBXaW4zMiBEZWJ1ZworIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJ0ZXN0am95c3RpY2subWFrIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJ0ZXN0am95c3RpY2subWFrIiBDRkc9InRlc3Rqb3lzdGljayAtIFdpbjMyIERlYnVnIgorIU1FU1NBR0UgCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgInRlc3Rqb3lzdGljayAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3Rqb3lzdGljayAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitNVEw9bWlkbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAidGVzdGpveXN0aWNrIC0gV2luMzIgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3Rqb3lzdGljayAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisKKyFFTkRJRiAKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJ0ZXN0am95c3RpY2sgLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJ0ZXN0am95c3RpY2sgLSBXaW4zMiBEZWJ1ZyIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXFNkbFxEZWJ1Z1xTREwubGliCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cU0RMbWFpblxEZWJ1Z1xTRExtYWluLmxpYgorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXC4uXHRlc3RcdGVzdGpveXN0aWNrLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3Rqb3lzdGljay90ZXN0am95c3RpY2sudmNwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdGpveXN0aWNrL3Rlc3Rqb3lzdGljay52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3MGI5MAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3Rqb3lzdGljay90ZXN0am95c3RpY2sudmNwcm9qCkBAIC0wLDAgKzEsMjE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOC4wMCIKKwlOYW1lPSJ0ZXN0am95c3RpY2siCisJUHJvamVjdEdVSUQ9Ins1NTgxMjE4NS1EMTNDLTQwMjItOUM4MS0zMkUwRjRBMDgzMDR9IgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2UvdGVzdGpveXN0aWNrLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIsTkRFQlVHLF9XSU5ET1dTIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvdGVzdGpveXN0aWNrLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlL3Rlc3Rqb3lzdGljay5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2UvdGVzdGpveXN0aWNrLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cRGVidWciCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnL3Rlc3Rqb3lzdGljay50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMixfREVCVUcsX1dJTkRPV1MiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL3Rlc3Rqb3lzdGljay5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Zy90ZXN0am95c3RpY2suZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cRGVidWcvdGVzdGpveXN0aWNrLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cU2RsXERlYnVnXFNETC5saWIiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cU0RMbWFpblxEZWJ1Z1xTRExtYWluLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx0ZXN0XHRlc3Rqb3lzdGljay5jIgorCQkJPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cGFsZXR0ZS90ZXN0cGFsZXR0ZS5kc3AgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cGFsZXR0ZS90ZXN0cGFsZXR0ZS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5YTFjZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RwYWxldHRlL3Rlc3RwYWxldHRlLmRzcApAQCAtMCwwICsxLDEwMiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJ0ZXN0cGFsZXR0ZSIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIgMHgwMTAxCisKK0NGRz10ZXN0cGFsZXR0ZSAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3RwYWxldHRlLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidGVzdHBhbGV0dGUubWFrIiBDRkc9InRlc3RwYWxldHRlIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAidGVzdHBhbGV0dGUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0cGFsZXR0ZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitNVEw9bWlkbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAidGVzdHBhbGV0dGUgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NgorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHBhbGV0dGUgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAidGVzdHBhbGV0dGUgLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJ0ZXN0cGFsZXR0ZSAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cU2RsXERlYnVnXFNETC5saWIKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cLi5cdGVzdFx0ZXN0cGFsZXR0ZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cGFsZXR0ZS90ZXN0cGFsZXR0ZS52Y3Byb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cGFsZXR0ZS90ZXN0cGFsZXR0ZS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMTE2MAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RwYWxldHRlL3Rlc3RwYWxldHRlLnZjcHJvagpAQCAtMCwwICsxLDIxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjguMDAiCisJTmFtZT0idGVzdHBhbGV0dGUiCisJUHJvamVjdEdVSUQ9Ins0OTNBOEYzOC01REE1LTRFMkQtQjVFOS05RTY5RUU0RUQxREN9IgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2UvdGVzdHBhbGV0dGUudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMixOREVCVUcsX1dJTkRPV1MiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS90ZXN0cGFsZXR0ZS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2IgorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZS90ZXN0cGFsZXR0ZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2UvdGVzdHBhbGV0dGUucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxEZWJ1ZyIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvdGVzdHBhbGV0dGUudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIsX0RFQlVHLF9XSU5ET1dTIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy90ZXN0cGFsZXR0ZS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Zy90ZXN0cGFsZXR0ZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy90ZXN0cGFsZXR0ZS5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXFNkbFxEZWJ1Z1xTREwubGliIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXFNETG1haW5cRGVidWdcU0RMbWFpbi5saWIiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cdGVzdFx0ZXN0cGFsZXR0ZS5jIgorCQkJPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cGxhdGZvcm0vdGVzdHBsYXRmb3JtLmRzcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RwbGF0Zm9ybS90ZXN0cGxhdGZvcm0uZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1N2I2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cGxhdGZvcm0vdGVzdHBsYXRmb3JtLmRzcApAQCAtMCwwICsxLDEwMiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJ0ZXN0cGxhdGZvcm0iIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iIDB4MDEwMQorCitDRkc9dGVzdHBsYXRmb3JtIC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidGVzdHBsYXRmb3JtLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidGVzdHBsYXRmb3JtLm1hayIgQ0ZHPSJ0ZXN0cGxhdGZvcm0gLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJ0ZXN0cGxhdGZvcm0gLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0cGxhdGZvcm0gLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorQ1BQPWNsLmV4ZQorTVRMPW1pZGwuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInRlc3RwbGF0Zm9ybSAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0cGxhdGZvcm0gLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAidGVzdHBsYXRmb3JtIC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAidGVzdHBsYXRmb3JtIC0gV2luMzIgRGVidWciCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxTZGxcRGVidWdcU0RMLmxpYgorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXFNETG1haW5cRGVidWdcU0RMbWFpbi5saWIKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlwuLlxUZXN0XHRlc3RwbGF0Zm9ybS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cGxhdGZvcm0vdGVzdHBsYXRmb3JtLnZjcHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RwbGF0Zm9ybS90ZXN0cGxhdGZvcm0udmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZjBjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cGxhdGZvcm0vdGVzdHBsYXRmb3JtLnZjcHJvagpAQCAtMCwwICsxLDIzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjguMDAiCisJTmFtZT0idGVzdHBsYXRmb3JtIgorCVByb2plY3RHVUlEPSJ7MjY5MzJCMjQtRUZDNi00RTNBLUIyNzctRUQ2NTNEQTM3OTY4fSIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy90ZXN0cGxhdGZvcm0udGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1MiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL3Rlc3RwbGF0Zm9ybS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL3Rlc3RwbGF0Zm9ybS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy90ZXN0cGxhdGZvcm0ucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL3Rlc3RwbGF0Zm9ybS5ic2MiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2UvdGVzdHBsYXRmb3JtLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvdGVzdHBsYXRmb3JtLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2UvdGVzdHBsYXRmb3JtLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS90ZXN0cGxhdGZvcm0ucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2UvdGVzdHBsYXRmb3JtLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTZGxcRGVidWdcU0RMLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXFRlc3RcdGVzdHBsYXRmb3JtLmMiCisJCQk+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cy5kc3cgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cy5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkZTEwYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3RzLmRzdwpAQCAtMCwwICsxLDE2MSBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogImdyYXl3aW4iPSIuXGdyYXl3aW5cZ3JheXdpbi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJsb29wd2F2ZSI9Ii5cbG9vcHdhdmVcbG9vcHdhdmUuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAidGVzdGFscGhhIj0iLlx0ZXN0YWxwaGFcdGVzdGFscGhhLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogInRlc3RmaWxlIj0iLlx0ZXN0ZmlsZVx0ZXN0ZmlsZS5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJ0ZXN0Z2FtbWEiPSIuXHRlc3RnYW1tYVx0ZXN0Z2FtbWEuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAidGVzdGdsIj0iLlx0ZXN0Z2xcdGVzdGdsLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogInRlc3Rqb3lzdGljayI9Ii5cdGVzdGpveXN0aWNrXHRlc3Rqb3lzdGljay5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJ0ZXN0cGFsZXR0ZSI9Ii5cdGVzdHBhbGV0dGVcdGVzdHBhbGV0dGUuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAidGVzdHBsYXRmb3JtIj0iLlx0ZXN0cGxhdGZvcm1cdGVzdHBsYXRmb3JtLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogInRlc3R2aWRpbmZvIj0iLlx0ZXN0dmlkaW5mb1x0ZXN0dmlkaW5mby5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJ0ZXN0d2luIj0iLlx0ZXN0d2luXHRlc3R3aW4uZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAidGVzdHdtIj0iLlx0ZXN0d21cdGVzdHdtLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworR2xvYmFsOgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08Mz4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdHMuc2xuIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdHMuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYzQ0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0cy5zbG4KQEAgLTAsMCArMSw4NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMAorIyBWaXN1YWwgQysrIEV4cHJlc3MgMjAwNQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJncmF5d2luIiwgImdyYXl3aW5cZ3JheXdpbi52Y3Byb2oiLCAiezBCQ0NBMEJGLTA3M0UtNDM5RS1CQ0UwLUM5MzUzQzE3NzQ4N30iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxvb3B3YXZlIiwgImxvb3B3YXZlXGxvb3B3YXZlLnZjcHJvaiIsICJ7QUFBRDFDQjUtN0FEQS00N0FFLTg1QTAtMDhBNkVDNDhGQUZCfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidGVzdGFscGhhIiwgInRlc3RhbHBoYVx0ZXN0YWxwaGEudmNwcm9qIiwgIns3ODE0RDU0Qi02NUQzLTQ2NzctQUQ3Ny1FMEI5ODBCNEZBMkR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ0ZXN0Z2FtbWEiLCAidGVzdGdhbW1hXHRlc3RnYW1tYS52Y3Byb2oiLCAie0Q5NzRBMERGLTNFMkUtNDQ1Qy1BMkVCLUU4OTlFOUI1ODJDQn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3RnbCIsICJ0ZXN0Z2xcdGVzdGdsLnZjcHJvaiIsICJ7MjcyRDk3NkItQTFERi00REVCLUJEN0YtNUMwRDMzMEUwQzdEfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidGVzdGpveXN0aWNrIiwgInRlc3Rqb3lzdGlja1x0ZXN0am95c3RpY2sudmNwcm9qIiwgIns1NTgxMjE4NS1EMTNDLTQwMjItOUM4MS0zMkUwRjRBMDgzMDR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ0ZXN0cGFsZXR0ZSIsICJ0ZXN0cGFsZXR0ZVx0ZXN0cGFsZXR0ZS52Y3Byb2oiLCAiezQ5M0E4RjM4LTVEQTUtNEUyRC1CNUU5LTlFNjlFRTRFRDFEQ30iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3R2aWRpbmZvIiwgInRlc3R2aWRpbmZvXHRlc3R2aWRpbmZvLnZjcHJvaiIsICJ7NTc1RkQwOTUtRURBQi00QkQ0LUI3MzMtQ0Q0QTg3NEY2RkIwfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidGVzdHdpbiIsICJ0ZXN0d2luXHRlc3R3aW4udmNwcm9qIiwgInswRkZEMUEyMS0xMURCLTQ5MkMtQTk4OS1FNEYxOTVCMEM0NDF9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ0ZXN0d20iLCAidGVzdHdtXHRlc3R3bS52Y3Byb2oiLCAiezZBRjA3MjRCLUJBQzEtNEM5RC1BRkJGLUY2M0I0QTJGQjhGQn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3RwbGF0Zm9ybSIsICJ0ZXN0cGxhdGZvcm1cdGVzdHBsYXRmb3JtLnZjcHJvaiIsICJ7MjY5MzJCMjQtRUZDNi00RTNBLUIyNzctRUQ2NTNEQTM3OTY4fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidGVzdGZpbGUiLCAidGVzdGZpbGVcdGVzdGZpbGUudmNwcm9qIiwgIntDQUU0RjFEMC0zMTRGLTRCMTAtODA1Qi0wRUZENjcwMTMzQTB9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7MEJDQ0EwQkYtMDczRS00MzlFLUJDRTAtQzkzNTNDMTc3NDg3fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7MEJDQ0EwQkYtMDczRS00MzlFLUJDRTAtQzkzNTNDMTc3NDg3fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezBCQ0NBMEJGLTA3M0UtNDM5RS1CQ0UwLUM5MzUzQzE3NzQ4N30uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXswQkNDQTBCRi0wNzNFLTQzOUUtQkNFMC1DOTM1M0MxNzc0ODd9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0FBQUQxQ0I1LTdBREEtNDdBRS04NUEwLTA4QTZFQzQ4RkFGQn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0FBQUQxQ0I1LTdBREEtNDdBRS04NUEwLTA4QTZFQzQ4RkFGQn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtBQUFEMUNCNS03QURBLTQ3QUUtODVBMC0wOEE2RUM0OEZBRkJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7QUFBRDFDQjUtN0FEQS00N0FFLTg1QTAtMDhBNkVDNDhGQUZCfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXs3ODE0RDU0Qi02NUQzLTQ2NzctQUQ3Ny1FMEI5ODBCNEZBMkR9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXs3ODE0RDU0Qi02NUQzLTQ2NzctQUQ3Ny1FMEI5ODBCNEZBMkR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7NzgxNEQ1NEItNjVEMy00Njc3LUFENzctRTBCOTgwQjRGQTJEfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezc4MTRENTRCLTY1RDMtNDY3Ny1BRDc3LUUwQjk4MEI0RkEyRH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7RDk3NEEwREYtM0UyRS00NDVDLUEyRUItRTg5OUU5QjU4MkNCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7RDk3NEEwREYtM0UyRS00NDVDLUEyRUItRTg5OUU5QjU4MkNCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJe0Q5NzRBMERGLTNFMkUtNDQ1Qy1BMkVCLUU4OTlFOUI1ODJDQn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtEOTc0QTBERi0zRTJFLTQ0NUMtQTJFQi1FODk5RTlCNTgyQ0J9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezI3MkQ5NzZCLUExREYtNERFQi1CRDdGLTVDMEQzMzBFMEM3RH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezI3MkQ5NzZCLUExREYtNERFQi1CRDdGLTVDMEQzMzBFMEM3RH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXsyNzJEOTc2Qi1BMURGLTRERUItQkQ3Ri01QzBEMzMwRTBDN0R9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7MjcyRDk3NkItQTFERi00REVCLUJEN0YtNUMwRDMzMEUwQzdEfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXs1NTgxMjE4NS1EMTNDLTQwMjItOUM4MS0zMkUwRjRBMDgzMDR9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXs1NTgxMjE4NS1EMTNDLTQwMjItOUM4MS0zMkUwRjRBMDgzMDR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7NTU4MTIxODUtRDEzQy00MDIyLTlDODEtMzJFMEY0QTA4MzA0fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezU1ODEyMTg1LUQxM0MtNDAyMi05QzgxLTMyRTBGNEEwODMwNH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7NDkzQThGMzgtNURBNS00RTJELUI1RTktOUU2OUVFNEVEMURDfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7NDkzQThGMzgtNURBNS00RTJELUI1RTktOUU2OUVFNEVEMURDfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezQ5M0E4RjM4LTVEQTUtNEUyRC1CNUU5LTlFNjlFRTRFRDFEQ30uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs0OTNBOEYzOC01REE1LTRFMkQtQjVFOS05RTY5RUU0RUQxREN9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezU3NUZEMDk1LUVEQUItNEJENC1CNzMzLUNENEE4NzRGNkZCMH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezU3NUZEMDk1LUVEQUItNEJENC1CNzMzLUNENEE4NzRGNkZCMH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs1NzVGRDA5NS1FREFCLTRCRDQtQjczMy1DRDRBODc0RjZGQjB9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7NTc1RkQwOTUtRURBQi00QkQ0LUI3MzMtQ0Q0QTg3NEY2RkIwfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXswRkZEMUEyMS0xMURCLTQ5MkMtQTk4OS1FNEYxOTVCMEM0NDF9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXswRkZEMUEyMS0xMURCLTQ5MkMtQTk4OS1FNEYxOTVCMEM0NDF9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7MEZGRDFBMjEtMTFEQi00OTJDLUE5ODktRTRGMTk1QjBDNDQxfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezBGRkQxQTIxLTExREItNDkyQy1BOTg5LUU0RjE5NUIwQzQ0MX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7NkFGMDcyNEItQkFDMS00QzlELUFGQkYtRjYzQjRBMkZCOEZCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7NkFGMDcyNEItQkFDMS00QzlELUFGQkYtRjYzQjRBMkZCOEZCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezZBRjA3MjRCLUJBQzEtNEM5RC1BRkJGLUY2M0I0QTJGQjhGQn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs2QUYwNzI0Qi1CQUMxLTRDOUQtQUZCRi1GNjNCNEEyRkI4RkJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezI2OTMyQjI0LUVGQzYtNEUzQS1CMjc3LUVENjUzREEzNzk2OH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezI2OTMyQjI0LUVGQzYtNEUzQS1CMjc3LUVENjUzREEzNzk2OH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXsyNjkzMkIyNC1FRkM2LTRFM0EtQjI3Ny1FRDY1M0RBMzc5Njh9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7MjY5MzJCMjQtRUZDNi00RTNBLUIyNzctRUQ2NTNEQTM3OTY4fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXtDQUU0RjFEMC0zMTRGLTRCMTAtODA1Qi0wRUZENjcwMTMzQTB9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXtDQUU0RjFEMC0zMTRGLTRCMTAtODA1Qi0wRUZENjcwMTMzQTB9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7Q0FFNEYxRDAtMzE0Ri00QjEwLTgwNUItMEVGRDY3MDEzM0EwfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0NBRTRGMUQwLTMxNEYtNEIxMC04MDVCLTBFRkQ2NzAxMzNBMH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3R2aWRpbmZvL3Rlc3R2aWRpbmZvLmRzcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3R2aWRpbmZvL3Rlc3R2aWRpbmZvLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGRhNjYyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdHZpZGluZm8vdGVzdHZpZGluZm8uZHNwCkBAIC0wLDAgKzEsMTAyIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InRlc3R2aWRpbmZvIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIiAweDAxMDEKKworQ0ZHPXRlc3R2aWRpbmZvIC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidGVzdHZpZGluZm8ubWFrIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJ0ZXN0dmlkaW5mby5tYWsiIENGRz0idGVzdHZpZGluZm8gLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJ0ZXN0dmlkaW5mbyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3R2aWRpbmZvIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK01UTD1taWRsLmV4ZQorUlNDPXJjLmV4ZQorCishSUYgICIkKENGRykiID09ICJ0ZXN0dmlkaW5mbyAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0dmlkaW5mbyAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisKKyFFTkRJRiAKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJ0ZXN0dmlkaW5mbyAtIFdpbjMyIFJlbGVhc2UiCisjIE5hbWUgInRlc3R2aWRpbmZvIC0gV2luMzIgRGVidWciCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxTZGxcRGVidWdcU0RMLmxpYgorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXFNETG1haW5cRGVidWdcU0RMbWFpbi5saWIKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlwuLlxUZXN0XHRlc3R2aWRpbmZvLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3R2aWRpbmZvL3Rlc3R2aWRpbmZvLnZjcHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3R2aWRpbmZvL3Rlc3R2aWRpbmZvLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDYxMmEzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdHZpZGluZm8vdGVzdHZpZGluZm8udmNwcm9qCkBAIC0wLDAgKzEsMjE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOC4wMCIKKwlOYW1lPSJ0ZXN0dmlkaW5mbyIKKwlQcm9qZWN0R1VJRD0iezU3NUZEMDk1LUVEQUItNEJENC1CNzMzLUNENEE4NzRGNkZCMH0iCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS90ZXN0dmlkaW5mby50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyLE5ERUJVRyxfV0lORE9XUyIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL3Rlc3R2aWRpbmZvLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlL3Rlc3R2aWRpbmZvLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS90ZXN0dmlkaW5mby5wZGIiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy90ZXN0dmlkaW5mby50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMixfREVCVUcsX1dJTkRPV1MiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL3Rlc3R2aWRpbmZvLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiIKKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL3Rlc3R2aWRpbmZvLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL3Rlc3R2aWRpbmZvLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cU2RsXERlYnVnXFNETC5saWIiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cU0RMbWFpblxEZWJ1Z1xTRExtYWluLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxUZXN0XHRlc3R2aWRpbmZvLmMiCisJCQk+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3R3aW4vdGVzdHdpbi5kc3AgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0d2luL3Rlc3R3aW4uZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTVlODkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0d2luL3Rlc3R3aW4uZHNwCkBAIC0wLDAgKzEsMTAyIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InRlc3R3aW4iIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iIDB4MDEwMQorCitDRkc9dGVzdHdpbiAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3R3aW4ubWFrIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJ0ZXN0d2luLm1hayIgQ0ZHPSJ0ZXN0d2luIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAidGVzdHdpbiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3R3aW4gLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorQ1BQPWNsLmV4ZQorTVRMPW1pZGwuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInRlc3R3aW4gLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NgorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHdpbiAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0CisKKyFFTkRJRiAKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJ0ZXN0d2luIC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAidGVzdHdpbiAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cU2RsXERlYnVnXFNETC5saWIKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cLi5cVGVzdFxUZXN0d2luLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDL3Rlc3RzL3Rlc3R3aW4vdGVzdHdpbi52Y3Byb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0d2luL3Rlc3R3aW4udmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNWNkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0d2luL3Rlc3R3aW4udmNwcm9qCkBAIC0wLDAgKzEsMjE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOC4wMCIKKwlOYW1lPSJ0ZXN0d2luIgorCVByb2plY3RHVUlEPSJ7MEZGRDFBMjEtMTFEQi00OTJDLUE5ODktRTRGMTk1QjBDNDQxfSIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy90ZXN0d2luLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyLF9ERUJVRyxfV0lORE9XUyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvdGVzdHdpbi5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Zy90ZXN0d2luLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL3Rlc3R3aW4ucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS90ZXN0d2luLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzIsTkRFQlVHLF9XSU5ET1dTIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvdGVzdHdpbi5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2IgorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZS90ZXN0d2luLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS90ZXN0d2luLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cU2RsXERlYnVnXFNETC5saWIiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cU0RMbWFpblxEZWJ1Z1xTRExtYWluLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxUZXN0XFRlc3R3aW4uYyIKKwkJCT4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdHdtL3Rlc3R3bS5kc3AgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0d20vdGVzdHdtLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTc2YWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdHdtL3Rlc3R3bS5kc3AKQEAgLTAsMCArMSwxMDIgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0idGVzdHdtIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIiAweDAxMDEKKworQ0ZHPXRlc3R3bSAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3R3bS5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3R3bS5tYWsiIENGRz0idGVzdHdtIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAidGVzdHdtIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdHdtIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK01UTD1taWRsLmV4ZQorUlNDPXJjLmV4ZQorCishSUYgICIkKENGRykiID09ICJ0ZXN0d20gLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NgorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHdtIC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYworIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgInRlc3R3bSAtIFdpbjMyIFJlbGVhc2UiCisjIE5hbWUgInRlc3R3bSAtIFdpbjMyIERlYnVnIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cU2RsXERlYnVnXFNETC5saWIKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cLi5cdGVzdFx0ZXN0d20uYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdHdtL3Rlc3R3bS52Y3Byb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQy90ZXN0cy90ZXN0d20vdGVzdHdtLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Y5OWUwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbEMvdGVzdHMvdGVzdHdtL3Rlc3R3bS52Y3Byb2oKQEAgLTAsMCArMSwyMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LjAwIgorCU5hbWU9InRlc3R3bSIKKwlQcm9qZWN0R1VJRD0iezZBRjA3MjRCLUJBQzEtNEM5RC1BRkJGLUY2M0I0QTJGQjhGQn0iCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlxEZWJ1ZyIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvdGVzdHdtLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyLF9ERUJVRyxfV0lORE9XUyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvdGVzdHdtLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiIKKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL3Rlc3R3bS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy90ZXN0d20ucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS90ZXN0d20udGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMixOREVCVUcsX1dJTkRPV1MiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS90ZXN0d20ucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxSZWxlYXNlLyIKKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiIKKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2UvdGVzdHdtLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS90ZXN0d20ucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTZGxcRGVidWdcU0RMLmxpYiIKKwkJCT4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxTRExtYWluXERlYnVnXFNETG1haW4ubGliIgorCQkJPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHRlc3RcdGVzdHdtLmMiCisJCQk+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS9TREwuc2xuIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL1NETC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0NmQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS9TREwuc2xuCkBAIC0wLDAgKzEsMTQ5IEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDkuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDA1CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIlNETCIsICJTRExcU0RMLnZjcHJvaiIsICJ7QzU5ODAyNEQtODAzMC00RjlDLUFCNzYtNjlCRjRDQTA2NDVGfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiU0RMbWFpbiIsICJTRExtYWluXFNETG1haW4udmNwcm9qIiwgIns1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJe0M1OTgwMjRELTgwMzAtNEY5Qy1BQjc2LTY5QkY0Q0EwNjQ1Rn0gPSB7QzU5ODAyNEQtODAzMC00RjlDLUFCNzYtNjlCRjRDQTA2NDVGfQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3RhbHBoYSIsICJ0ZXN0YWxwaGFcdGVzdGFscGhhLnZjcHJvaiIsICJ7REY0MDFDQjMtNkY3MC00NDg1LTk5NkItQjdDMzU3Q0Y3RUU3fSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9ID0ge0M1OTgwMjRELTgwMzAtNEY5Qy1BQjc2LTY5QkY0Q0EwNjQ1Rn0KKwkJezVBQzg4Qjg0LTVFQUEtNEMxRS05NDhELTMzMkRBMzQyMjdGNn0gPSB7NUFDODhCODQtNUVBQS00QzFFLTk0OEQtMzMyREEzNDIyN0Y2fQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3R3aW4iLCAidGVzdHdpblx0ZXN0d2luLnZjcHJvaiIsICJ7REM1MTY5NzgtODhDQi00RjlBLUEzOUEtQzM1MUMyNTg2MTNCfSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9ID0ge0M1OTgwMjRELTgwMzAtNEY5Qy1BQjc2LTY5QkY0Q0EwNjQ1Rn0KKwkJezVBQzg4Qjg0LTVFQUEtNEMxRS05NDhELTMzMkRBMzQyMjdGNn0gPSB7NUFDODhCODQtNUVBQS00QzFFLTk0OEQtMzMyREEzNDIyN0Y2fQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxvb3B3YXZlIiwgImxvb3B3YXZlXGxvb3B3YXZlLnZjcHJvaiIsICJ7NkY2NDI2MzYtQ0IxMS00REM3LTg1NUUtMjdGRTE3NDQwMDNBfSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9ID0ge0M1OTgwMjRELTgwMzAtNEY5Qy1BQjc2LTY5QkY0Q0EwNjQ1Rn0KKwkJezVBQzg4Qjg0LTVFQUEtNEMxRS05NDhELTMzMkRBMzQyMjdGNn0gPSB7NUFDODhCODQtNUVBQS00QzFFLTk0OEQtMzMyREEzNDIyN0Y2fQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3R0aW1lciIsICJ0ZXN0dGltZXJcdGVzdHRpbWVyLnZjcHJvaiIsICJ7RDQ4MkQ3RUUtNkZGMC00MjU0LTkwMjctQzU5RjhGMDNBQjFGfSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9ID0ge0M1OTgwMjRELTgwMzAtNEY5Qy1BQjc2LTY5QkY0Q0EwNjQ1Rn0KKwkJezVBQzg4Qjg0LTVFQUEtNEMxRS05NDhELTMzMkRBMzQyMjdGNn0gPSB7NUFDODhCODQtNUVBQS00QzFFLTk0OEQtMzMyREEzNDIyN0Y2fQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQorCQlEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCURlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpID0gRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkKKwkJUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpID0gUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCVJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkgPSBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCVJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQorCQl7QzU5ODAyNEQtODAzMC00RjlDLUFCNzYtNjlCRjRDQTA2NDVGfS5EZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KQorCQl7QzU5ODAyNEQtODAzMC00RjlDLUFCNzYtNjlCRjRDQTA2NDVGfS5EZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7QzU5ODAyNEQtODAzMC00RjlDLUFCNzYtNjlCRjRDQTA2NDVGfS5EZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJe0M1OTgwMjRELTgwMzAtNEY5Qy1BQjc2LTY5QkY0Q0EwNjQ1Rn0uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJe0M1OTgwMjRELTgwMzAtNEY5Qy1BQjc2LTY5QkY0Q0EwNjQ1Rn0uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQorCQl7QzU5ODAyNEQtODAzMC00RjlDLUFCNzYtNjlCRjRDQTA2NDVGfS5SZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7QzU5ODAyNEQtODAzMC00RjlDLUFCNzYtNjlCRjRDQTA2NDVGfS5SZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtDNTk4MDI0RC04MDMwLTRGOUMtQUI3Ni02OUJGNENBMDY0NUZ9LlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQorCQl7NUFDODhCODQtNUVBQS00QzFFLTk0OEQtMzMyREEzNDIyN0Y2fS5EZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KQorCQl7NUFDODhCODQtNUVBQS00QzFFLTk0OEQtMzMyREEzNDIyN0Y2fS5EZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7NUFDODhCODQtNUVBQS00QzFFLTk0OEQtMzMyREEzNDIyN0Y2fS5EZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJezVBQzg4Qjg0LTVFQUEtNEMxRS05NDhELTMzMkRBMzQyMjdGNn0uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJezVBQzg4Qjg0LTVFQUEtNEMxRS05NDhELTMzMkRBMzQyMjdGNn0uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQorCQl7NUFDODhCODQtNUVBQS00QzFFLTk0OEQtMzMyREEzNDIyN0Y2fS5SZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7NUFDODhCODQtNUVBQS00QzFFLTk0OEQtMzMyREEzNDIyN0Y2fS5SZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXs1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9LlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQorCQl7REY0MDFDQjMtNkY3MC00NDg1LTk5NkItQjdDMzU3Q0Y3RUU3fS5EZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KQorCQl7REY0MDFDQjMtNkY3MC00NDg1LTk5NkItQjdDMzU3Q0Y3RUU3fS5EZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7REY0MDFDQjMtNkY3MC00NDg1LTk5NkItQjdDMzU3Q0Y3RUU3fS5EZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJe0RGNDAxQ0IzLTZGNzAtNDQ4NS05OTZCLUI3QzM1N0NGN0VFN30uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJe0RGNDAxQ0IzLTZGNzAtNDQ4NS05OTZCLUI3QzM1N0NGN0VFN30uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQorCQl7REY0MDFDQjMtNkY3MC00NDg1LTk5NkItQjdDMzU3Q0Y3RUU3fS5SZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7REY0MDFDQjMtNkY3MC00NDg1LTk5NkItQjdDMzU3Q0Y3RUU3fS5SZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtERjQwMUNCMy02RjcwLTQ0ODUtOTk2Qi1CN0MzNTdDRjdFRTd9LlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQorCQl7REM1MTY5NzgtODhDQi00RjlBLUEzOUEtQzM1MUMyNTg2MTNCfS5EZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KQorCQl7REM1MTY5NzgtODhDQi00RjlBLUEzOUEtQzM1MUMyNTg2MTNCfS5EZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IERlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7REM1MTY5NzgtODhDQi00RjlBLUEzOUEtQzM1MUMyNTg2MTNCfS5EZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJe0RDNTE2OTc4LTg4Q0ItNEY5QS1BMzlBLUMzNTFDMjU4NjEzQn0uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJe0RDNTE2OTc4LTg4Q0ItNEY5QS1BMzlBLUMzNTFDMjU4NjEzQn0uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KQorCQl7REM1MTY5NzgtODhDQi00RjlBLUEzOUEtQzM1MUMyNTg2MTNCfS5SZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7REM1MTY5NzgtODhDQi00RjlBLUEzOUEtQzM1MUMyNTg2MTNCfS5SZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9LlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXs2RjY0MjYzNi1DQjExLTREQzctODU1RS0yN0ZFMTc0NDAwM0F9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQorCQl7NkY2NDI2MzYtQ0IxMS00REM3LTg1NUUtMjdGRTE3NDQwMDNBfS5EZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXs2RjY0MjYzNi1DQjExLTREQzctODU1RS0yN0ZFMTc0NDAwM0F9LkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuRGVwbG95LjAgPSBEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXs2RjY0MjYzNi1DQjExLTREQzctODU1RS0yN0ZFMTc0NDAwM0F9LkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXs2RjY0MjYzNi1DQjExLTREQzctODU1RS0yN0ZFMTc0NDAwM0F9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXs2RjY0MjYzNi1DQjExLTREQzctODU1RS0yN0ZFMTc0NDAwM0F9LkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkJ1aWxkLjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7NkY2NDI2MzYtQ0IxMS00REM3LTg1NUUtMjdGRTE3NDQwMDNBfS5EZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IERlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXs2RjY0MjYzNi1DQjExLTREQzctODU1RS0yN0ZFMTc0NDAwM0F9LlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJezZGNjQyNjM2LUNCMTEtNERDNy04NTVFLTI3RkUxNzQ0MDAzQX0uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkJ1aWxkLjAgPSBSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJezZGNjQyNjM2LUNCMTEtNERDNy04NTVFLTI3RkUxNzQ0MDAzQX0uUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXs2RjY0MjYzNi1DQjExLTREQzctODU1RS0yN0ZFMTc0NDAwM0F9LlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7NkY2NDI2MzYtQ0IxMS00REM3LTg1NUUtMjdGRTE3NDQwMDNBfS5SZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkKKwkJezZGNjQyNjM2LUNCMTEtNERDNy04NTVFLTI3RkUxNzQ0MDAzQX0uUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5CdWlsZC4wID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7NkY2NDI2MzYtQ0IxMS00REM3LTg1NUUtMjdGRTE3NDQwMDNBfS5SZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpLkRlcGxveS4wID0gUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7RDQ4MkQ3RUUtNkZGMC00MjU0LTkwMjctQzU5RjhGMDNBQjFGfS5EZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IERlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkKKwkJe0Q0ODJEN0VFLTZGRjAtNDI1NC05MDI3LUM1OUY4RjAzQUIxRn0uRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5CdWlsZC4wID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQorCQl7RDQ4MkQ3RUUtNkZGMC00MjU0LTkwMjctQzU5RjhGMDNBQjFGfS5EZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpLkRlcGxveS4wID0gRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQorCQl7RDQ4MkQ3RUUtNkZGMC00MjU0LTkwMjctQzU5RjhGMDNBQjFGfS5EZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KS5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7RDQ4MkQ3RUUtNkZGMC00MjU0LTkwMjctQzU5RjhGMDNBQjFGfS5EZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7RDQ4MkQ3RUUtNkZGMC00MjU0LTkwMjctQzU5RjhGMDNBQjFGfS5EZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5CdWlsZC4wID0gRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkKKwkJe0Q0ODJEN0VFLTZGRjAtNDI1NC05MDI3LUM1OUY4RjAzQUIxRn0uRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuRGVwbG95LjAgPSBEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKQorCQl7RDQ4MkQ3RUUtNkZGMC00MjU0LTkwMjctQzU5RjhGMDNBQjFGfS5SZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtENDgyRDdFRS02RkYwLTQyNTQtOTAyNy1DNTlGOEYwM0FCMUZ9LlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5CdWlsZC4wID0gUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpCisJCXtENDgyRDdFRS02RkYwLTQyNTQtOTAyNy1DNTlGOEYwM0FCMUZ9LlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KS5EZXBsb3kuMCA9IFJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KQorCQl7RDQ4MkQ3RUUtNkZGMC00MjU0LTkwMjctQzU5RjhGMDNBQjFGfS5SZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkKKwkJe0Q0ODJEN0VFLTZGRjAtNDI1NC05MDI3LUM1OUY4RjAzQUIxRn0uUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpCisJCXtENDgyRDdFRS02RkYwLTQyNTQtOTAyNy1DNTlGOEYwM0FCMUZ9LlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkuQnVpbGQuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkKKwkJe0Q0ODJEN0VFLTZGRjAtNDI1NC05MDI3LUM1OUY4RjAzQUIxRn0uUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKS5EZXBsb3kuMCA9IFJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvU0RMLnZjdyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS9TREwudmN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTAwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvU0RMLnZjdwpAQCAtMCwwICsxLDExNiBAQAorTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBUb29scyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gMy4wMAorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSEKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAibG9vcHdhdmUiPS5cbG9vcHdhdmVcbG9vcHdhdmUudmNwIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKKyAgICBQcm9qZWN0X0RlcF9OYW1lIFNETAorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKKyAgICBQcm9qZWN0X0RlcF9OYW1lIFNETG1haW4KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAiU0RMIj0uXFNETFxTREwuVkNQIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJTRExtYWluIj0uXFNETG1haW5cU0RMbWFpbi52Y3AgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQorICAgIFByb2plY3RfRGVwX05hbWUgU0RMCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQorfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogInRlc3R0aW1lciI9Llx0ZXN0dGltZXJcdGVzdHRpbWVyLnZjcCAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7CisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5CisgICAgUHJvamVjdF9EZXBfTmFtZSBTREwKKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5CisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5CisgICAgUHJvamVjdF9EZXBfTmFtZSBTRExtYWluCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQorfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogInRlc3RhbHBoYSI9Llx0ZXN0YWxwaGFcdGVzdGFscGhhLnZjcCAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7CisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5CisgICAgUHJvamVjdF9EZXBfTmFtZSBTREwKKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5CisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5CisgICAgUHJvamVjdF9EZXBfTmFtZSBTRExtYWluCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQorfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogInRlc3R3aW4iPS5cdGVzdHdpblx0ZXN0d2luLnZjcCAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7CisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5CisgICAgUHJvamVjdF9EZXBfTmFtZSBTREwKKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5CisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5CisgICAgUHJvamVjdF9EZXBfTmFtZSBTRExtYWluCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQorfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworR2xvYmFsOgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08Mz4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL1NETC9TREwudmNwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL1NETC9TREwudmNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2NhZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvU0RML1NETC52Y3AKQEAgLTAsMCArMSw0MjA2NiBAQAorIyBNaWNyb3NvZnQgZU1iZWRkZWQgVmlzdWFsIFRvb2xzIFByb2plY3QgRmlsZSAtIE5hbWU9IlNETCIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgZU1iZWRkZWQgVmlzdWFsIFRvb2xzIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAyCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgTUlQU0lWKSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHg5NjAyCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIEFSTVY0VCkgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4YTQwMgorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBNSVBTSVZfRlApIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDkyMDIKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgU0gzKSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHg4MTAyCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4YTIwMgorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSB4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDgzMDIKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgQVJNKSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHg4NTAyCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIGVtdWxhdG9yKSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHhhNjAyCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIFNINCkgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4ODYwMgorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBBUk1WNCkgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4YTMwMgorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBNSVBTKSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHg4MjAyCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIE1JUFMxNikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4ODkwMgorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBBUk1WNEkpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweGE1MDIKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgTUlQU0lJKSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHhhMTAyCisKK0NGRz1TREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiU0RMLlZDTiIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiU0RMLlZDTiIgQ0ZHPSJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBNSVBTSUlfRlApIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBNSVBTSUlfRlApIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFNJSSkgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFNJSSkgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgU0g0KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgU0g0KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgU0gzKSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBNSVBTSVYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBNSVBTSVYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgZW11bGF0b3IpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIGVtdWxhdG9yKSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNEkpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNEkpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNCkgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgQVJNVjQpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFMxNikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFMxNikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgQVJNVjRUKSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgQVJNVjRUKSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSB4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSB4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk0pIER5bmFtaWMtTGluayBMaWJyYXJ5IikKKyFNRVNTQUdFICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTSkgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBNSVBTKSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgTUlQUykgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgU0gzKSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKKyMgUFJPUCBBVExfUHJvamVjdCAyCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTUlQU0lJX0ZQUmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lJX0ZQUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDhBQzg1NkMtQjIxMy00ODk1LTlFODMtOUVDNTFBNTUyMDFFfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJNSVBTSUlfRlBSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lJX0ZQUmVsIgorIyBQUk9QIENQVV9JRCAie0Q4QUM4NTZDLUIyMTMtNDg5NS05RTgzLTlFQzUxQTU1MjAxRX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbG1pcHMuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJSNDAwMCIgL0QgIk1JUFNJSSIgL0QgIk1JUFNJSV9GUCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJTRExfRVhQT1JUUyIgL1lYIC9RTW1pcHMyIC9RTUZQRS0gL08yIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PeHQgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJSNDAwMCIgL0QgIk1JUFNJSSIgL0QgIk1JUFNJSV9GUCIgL0QgIk5ERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9RTW1pcHMyIC9RTUZQRS0gL00kKENFQ3J0TVQpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9kICJSNDAwMCIgL2QgIk1JUFNJSSIgL2QgIk1JUFNJSV9GUCIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJNSVBTIiAvZCAiX01JUFNfIiAvZCAiUjQwMDAiIC9kICJNSVBTSUkiIC9kICJNSVBTSUlfRlAiIC9yCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTSUlfRlBEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSUlfRlBEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntEOEFDODU2Qy1CMjEzLTQ4OTUtOUU4My05RUM1MUE1NTIwMUV9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNJSV9GUERiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSUlfRlBEYmciCisjIFBST1AgQ1BVX0lEICJ7RDhBQzg1NkMtQjIxMy00ODk1LTlFODMtOUVDNTFBNTUyMDFFfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbG1pcHMuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiUjQwMDAiIC9EICJNSVBTSUkiIC9EICJNSVBTSUlfRlAiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9ZWCAvUU1taXBzMiAvUU1GUEUtIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIkRFQlVHIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIlI0MDAwIiAvRCAiTUlQU0lJIiAvRCAiTUlQU0lJX0ZQIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJTRExfRVhQT1JUUyIgL1FNbWlwczIgL1FNRlBFLSAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9kICJSNDAwMCIgL2QgIk1JUFNJSSIgL2QgIk1JUFNJSV9GUCIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9kICJSNDAwMCIgL2QgIk1JUFNJSSIgL2QgIk1JUFNJSV9GUCIgL3IKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTUlQU0lJUmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lJUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7Njg5RERDNjQtOUQ5RC0xMUQ1LTk2RjgtMDAyMDc4MDJDMDFDfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJNSVBTSUlSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lJUmVsIgorIyBQUk9QIENQVV9JRCAiezY4OUREQzY0LTlEOUQtMTFENS05NkY4LTAwMjA3ODAyQzAxQ30iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbG1pcHMuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJSNDAwMCIgL0QgIk1JUFNJSSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJTRExfRVhQT1JUUyIgL1lYIC9RTW1pcHMyIC9RTUZQRSAvTzIgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL094dCAvT2IyIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjIiAvSSAiLi4vLi4vc3JjL3ZpZGVvIiAvSSAiLi4vLi4vc3JjL3RocmVhZCIgL0kgIi4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYyIgL0kgIi4uLy4uL3NyYy9hdWRpbyIgL0kgIi4uLy4uL3NyYy9jZHJvbSIgL0kgIi4uLy4uL3NyYy90aW1lciIgL0kgIi4uLy4uL3NyYy9qb3lzdGljayIgL0kgIi4uLy4uL3NyYy9ldmVudHMiIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIlI0MDAwIiAvRCAiTUlQU0lJIiAvRCAiTkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJTRExfRVhQT1JUUyIgL1FNbWlwczIgL1FNRlBFIC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJNSVBTIiAvZCAiX01JUFNfIiAvZCAiUjQwMDAiIC9kICJNSVBTSUkiIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiTUlQUyIgL2QgIl9NSVBTXyIgL2QgIlI0MDAwIiAvZCAiTUlQU0lJIiAvcgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTUlQU0lJRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lJRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7Njg5RERDNjQtOUQ5RC0xMUQ1LTk2RjgtMDAyMDc4MDJDMDFDfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJNSVBTSUlEYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lJRGJnIgorIyBQUk9QIENQVV9JRCAiezY4OUREQzY0LTlEOUQtMTFENS05NkY4LTAwMjA3ODAyQzAxQ30iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOk1JUFMKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIlI0MDAwIiAvRCAiTUlQU0lJIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvWVggL1FNbWlwczIgL1FNRlBFIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIkRFQlVHIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIlI0MDAwIiAvRCAiTUlQU0lJIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJTRExfRVhQT1JUUyIgL1FNbWlwczIgL1FNRlBFIC9NJChDRUNydE1URGVidWcpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiTUlQUyIgL2QgIl9NSVBTXyIgL2QgIlI0MDAwIiAvZCAiTUlQU0lJIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiTUlQUyIgL2QgIl9NSVBTXyIgL2QgIlI0MDAwIiAvZCAiTUlQU0lJIiAvcgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJTSDRSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJTSDRSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAyMS03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlNINFJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJTSDRSZWwiCisjIFBST1AgQ1BVX0lEICJ7RDY1MTkwMjEtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiTkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIlNIeCIgL2QgIlNINCIgL2QgIl9TSDRfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiTkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIlNIeCIgL2QgIlNINCIgL2QgIl9TSDRfIiAvcgorQ1BQPXNoY2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvTzIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJTSHgiIC9EICJTSDQiIC9EICJfU0g0XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJTRExfRVhQT1JUUyIgL1lYIC9Rc2g0IC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvT2IyIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjIiAvSSAiLi4vLi4vc3JjL3ZpZGVvIiAvSSAiLi4vLi4vc3JjL3RocmVhZCIgL0kgIi4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYyIgL0kgIi4uLy4uL3NyYy9hdWRpbyIgL0kgIi4uLy4uL3NyYy9jZHJvbSIgL0kgIi4uLy4uL3NyYy90aW1lciIgL0kgIi4uLy4uL3NyYy9qb3lzdGljayIgL0kgIi4uLy4uL3NyYy9ldmVudHMiIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uIiAvRCAiU0h4IiAvRCAiU0g0IiAvRCAiX1NINF8iIC9EICJOREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvT3h0IC9Rc2g0IC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlNINAorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6U0g0CisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJTSDREYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJTSDREYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAyMS03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIlNINERiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJTSDREYmciCisjIFBST1AgQ1BVX0lEICJ7RDY1MTkwMjEtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJERUJVRyIgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJTSHgiIC9kICJTSDQiIC9kICJfU0g0XyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIlNIeCIgL2QgIlNINCIgL2QgIl9TSDRfIiAvcgorQ1BQPXNoY2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJTSHgiIC9EICJTSDQiIC9EICJfU0g0XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJTRExfRVhQT1JUUyIgL1lYIC9Rc2g0IC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIkRFQlVHIiAvRCAiU0h4IiAvRCAiU0g0IiAvRCAiX1NINF8iIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvUXNoNCAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpTSDQKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpTSDQKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlNIM0RiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlNIM0RiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE5MDIwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiU0gzRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlNIM0RiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAyMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIlNIeCIgL2QgIlNIMyIgL2QgIl9TSDNfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiU0h4IiAvZCAiU0gzIiAvZCAiX1NIM18iIC9yCitDUFA9c2hjbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlNIeCIgL0QgIlNIMyIgL0QgIl9TSDNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjIiAvSSAiLi4vLi4vc3JjL3ZpZGVvIiAvSSAiLi4vLi4vc3JjL3RocmVhZCIgL0kgIi4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYyIgL0kgIi4uLy4uL3NyYy9hdWRpbyIgL0kgIi4uLy4uL3NyYy9jZHJvbSIgL0kgIi4uLy4uL3NyYy90aW1lciIgL0kgIi4uLy4uL3NyYy9qb3lzdGljayIgL0kgIi4uLy4uL3NyYy9ldmVudHMiIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmRpYiIgL0kgIi4uLy4uL3NyYy92aWRlby9nYXBpIiAvRCAiREVCVUciIC9EICJTSHgiIC9EICJTSDMiIC9EICJfU0gzXyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9NJChDRUNydE1URGVidWcpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlNIMworIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlNIMworCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTSVZSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSVZSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgInswQjJGRTUyNC0yNkM1LTQxOTQtOENFRi1CMTU4MkRFQjVBOTh9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNJVlJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSVZSZWwiCisjIFBST1AgQ1BVX0lEICJ7MEIyRkU1MjQtMjZDNS00MTk0LThDRUYtQjE1ODJERUI1QTk4fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTRlBVCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTRlBVCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQ1BQPWNsbWlwcy5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIl9NSVBTNjQiIC9EICJSNDAwMCIgL0QgIk1JUFNJViIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJTRExfRVhQT1JUUyIgL1lYIC9RTW1pcHM0IC9RTW4zMiAvUU1GUEUgL08yIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PeHQgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJfTUlQUzY0IiAvRCAiUjQwMDAiIC9EICJNSVBTSVYiIC9EICJOREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvUU1taXBzNCAvUU1uMzIgL1FNRlBFIC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJNSVBTIiAvZCAiX01JUFNfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9yCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTSVZEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSVZEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgInswQjJGRTUyNC0yNkM1LTQxOTQtOENFRi1CMTU4MkRFQjVBOTh9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNJVkRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSVZEYmciCisjIFBST1AgQ1BVX0lEICJ7MEIyRkU1MjQtMjZDNS00MTk0LThDRUYtQjE1ODJERUI1QTk4fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTRlBVCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQU0ZQVQorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbG1pcHMuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiX01JUFM2NCIgL0QgIlI0MDAwIiAvRCAiTUlQU0lWIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvWVggL1FNbWlwczQgL1FNbjMyIC9RTUZQRSAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmMiIC9JICIuLi8uLi9zcmMvdmlkZW8iIC9JICIuLi8uLi9zcmMvdGhyZWFkIiAvSSAiLi4vLi4vc3JjL3RocmVhZC9nZW5lcmljIiAvSSAiLi4vLi4vc3JjL2F1ZGlvIiAvSSAiLi4vLi4vc3JjL2Nkcm9tIiAvSSAiLi4vLi4vc3JjL3RpbWVyIiAvSSAiLi4vLi4vc3JjL2pveXN0aWNrIiAvSSAiLi4vLi4vc3JjL2V2ZW50cyIgL0kgIi4uLy4uL3NyYy92aWRlby93aW5jb21tb24iIC9EICJERUJVRyIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJfTUlQUzY0IiAvRCAiUjQwMDAiIC9EICJNSVBTSVYiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvUU1taXBzNCAvUU1uMzIgL1FNRlBFIC9NJChDRUNydE1URGVidWcpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiTUlQUyIgL2QgIl9NSVBTXyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9yCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJlbXVsYXRvclJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAiezMyRTUyMDAzLTQwM0UtNDQyRC1CRTQ4LURFMTBGOEM2MTMxRH0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgQ1BVX0lEICJ7MzJFNTIwMDMtNDAzRS00NDJELUJFNDgtREUxMEY4QzYxMzFEfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvRCAiU0RMX0VYUE9SVFMiIC9ZWCAvR3M4MTkyIC9HRiAvTzIgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvT3h0IC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmMiIC9JICIuLi8uLi9zcmMvdmlkZW8iIC9JICIuLi8uLi9zcmMvdGhyZWFkIiAvSSAiLi4vLi4vc3JjL3RocmVhZC9nZW5lcmljIiAvSSAiLi4vLi4vc3JjL2F1ZGlvIiAvSSAiLi4vLi4vc3JjL2Nkcm9tIiAvSSAiLi4vLi4vc3JjL3RpbWVyIiAvSSAiLi4vLi4vc3JjL2pveXN0aWNrIiAvSSAiLi4vLi4vc3JjL2V2ZW50cyIgL0kgIi4uLy4uL3NyYy92aWRlby93aW5jb21tb24iIC9EICJfaTM4Nl8iIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9HczgxOTIgL0dGIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7MzJFNTIwMDMtNDAzRS00NDJELUJFNDgtREUxMEY4QzYxMzFEfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBDUFVfSUQgInszMkU1MjAwMy00MDNFLTQ0MkQtQkU0OC1ERTEwRjhDNjEzMUR9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIlNETF9FWFBPUlRTIiAvWVggL0dzODE5MiAvR0YgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjIiAvSSAiLi4vLi4vc3JjL3ZpZGVvIiAvSSAiLi4vLi4vc3JjL3RocmVhZCIgL0kgIi4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYyIgL0kgIi4uLy4uL3NyYy9hdWRpbyIgL0kgIi4uLy4uL3NyYy9jZHJvbSIgL0kgIi4uLy4uL3NyYy90aW1lciIgL0kgIi4uLy4uL3NyYy9qb3lzdGljayIgL0kgIi4uLy4uL3NyYy9ldmVudHMiIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmRpYiIgL0kgIi4uLy4uL3NyYy92aWRlby9nYXBpIiAvRCAiREVCVUciIC9EICJfaTM4Nl8iIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9HczgxOTIgL0dGIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiQVJNVjRJUmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjRJUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7REM3MEY0MzAtRTc4Qi00OTRGLUE5RDUtNjJBREM1NjQ0M0I4fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJBUk1WNElSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjRJUmVsIgorIyBQUk9QIENQVV9JRCAie0RDNzBGNDMwLUU3OEItNDk0Ri1BOUQ1LTYyQURDNTY0NDNCOH0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6VEhVTUIKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlRIVU1CCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQ1BQPWNsYXJtLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTVY0SSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJTRExfRVhQT1JUUyIgL1lYIC9RUmFyY2g0VCAvUVJpbnRlcndvcmstcmV0dXJuIC9PMiAvTSQoQ0VDcnRNVCkgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvT3h0IC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmMiIC9JICIuLi8uLi9zcmMvdmlkZW8iIC9JICIuLi8uLi9zcmMvdGhyZWFkIiAvSSAiLi4vLi4vc3JjL3RocmVhZC9nZW5lcmljIiAvSSAiLi4vLi4vc3JjL2F1ZGlvIiAvSSAiLi4vLi4vc3JjL2Nkcm9tIiAvSSAiLi4vLi4vc3JjL3RpbWVyIiAvSSAiLi4vLi4vc3JjL2pveXN0aWNrIiAvSSAiLi4vLi4vc3JjL2V2ZW50cyIgL0kgIi4uLy4uL3NyYy92aWRlby93aW5jb21tb24iIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgIkFSTVY0SSIgL0QgIk5ERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9RUmFyY2g0VCAvUVJpbnRlcndvcmstcmV0dXJuIC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJUSFVNQiIgL2QgIl9USFVNQl8iIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0SSIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJUSFVNQiIgL2QgIl9USFVNQl8iIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0SSIgL3IKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTVY0SURiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0SURiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0RDNzBGNDMwLUU3OEItNDk0Ri1BOUQ1LTYyQURDNTY0NDNCOH0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiQVJNVjRJRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0SURiZyIKKyMgUFJPUCBDUFVfSUQgIntEQzcwRjQzMC1FNzhCLTQ5NEYtQTlENS02MkFEQzU2NDQzQjh9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlRIVU1CCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6VEhVTUIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTVY0SSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJTRExfRVhQT1JUUyIgL1lYIC9RUmFyY2g0VCAvUVJpbnRlcndvcmstcmV0dXJuIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIkRFQlVHIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICJBUk1WNEkiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvUVJhcmNoNFQgL1FSaW50ZXJ3b3JrLXJldHVybiAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIlRIVU1CIiAvZCAiX1RIVU1CXyIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjRJIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiVEhVTUIiIC9kICJfVEhVTUJfIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9kICJBUk1WNEkiIC9yCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIk1JUFNJVl9GUFJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJVl9GUFJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAiezA0NkE0MzBELTc3NzAtNDhBQi04OUI1LTI0QzJEMzAwQjAzRn0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiTUlQU0lWX0ZQUmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJVl9GUFJlbCIKKyMgUFJPUCBDUFVfSUQgInswNDZBNDMwRC03NzcwLTQ4QUItODlCNS0yNEMyRDMwMEIwM0Z9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOk1JUFNGUFUKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOk1JUFNGUFUKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiX01JUFM2NCIgL0QgIlI0MDAwIiAvRCAiTUlQU0lWIiAvRCAiTUlQU0lWX0ZQIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL0QgIlNETF9FWFBPUlRTIiAvWVggL1FNbWlwczQgL1FNbjMyIC9RTUZQRS0gL08yIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PeHQgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJfTUlQUzY0IiAvRCAiUjQwMDAiIC9EICJNSVBTSVYiIC9EICJNSVBTSVZfRlAiIC9EICJOREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvUU1taXBzNCAvUU1uMzIgL1FNRlBFLSAvTSQoQ0VDcnRNVCkgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiTUlQUyIgL2QgIl9NSVBTXyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJNSVBTIiAvZCAiX01JUFNfIiAvcgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTUlQU0lWX0ZQRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lWX0ZQRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7MDQ2QTQzMEQtNzc3MC00OEFCLTg5QjUtMjRDMkQzMDBCMDNGfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJNSVBTSVZfRlBEYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lWX0ZQRGJnIgorIyBQUk9QIENQVV9JRCAiezA0NkE0MzBELTc3NzAtNDhBQi04OUI1LTI0QzJEMzAwQjAzRn0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQU0ZQVQorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOk1JUFNGUFUKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIl9NSVBTNjQiIC9EICJSNDAwMCIgL0QgIk1JUFNJViIgL0QgIk1JUFNJVl9GUCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJTRExfRVhQT1JUUyIgL1lYIC9RTW1pcHM0IC9RTW4zMiAvUU1GUEUtIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIkRFQlVHIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIl9NSVBTNjQiIC9EICJSNDAwMCIgL0QgIk1JUFNJViIgL0QgIk1JUFNJVl9GUCIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9RTW1pcHM0IC9RTW4zMiAvUU1GUEUtIC9NJChDRUNydE1URGVidWcpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiTUlQUyIgL2QgIl9NSVBTXyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9yCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiQVJNVjRSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNFJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0VDQkVBNDNELUNEN0ItNDg1Mi1BRDU1LUQ0MjI3QjVENjI0Qn0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiQVJNVjRSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjRSZWwiCisjIFBST1AgQ1BVX0lEICJ7RUNCRUE0M0QtQ0Q3Qi00ODUyLUFENTUtRDQyMjdCNUQ2MjRCfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvRCAiU0RMX0VYUE9SVFMiIC9ZWCAvTzIgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL094dCAvT2IyIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjIiAvSSAiLi4vLi4vc3JjL3ZpZGVvIiAvSSAiLi4vLi4vc3JjL3RocmVhZCIgL0kgIi4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYyIgL0kgIi4uLy4uL3NyYy9hdWRpbyIgL0kgIi4uLy4uL3NyYy9jZHJvbSIgL0kgIi4uLy4uL3NyYy90aW1lciIgL0kgIi4uLy4uL3NyYy9qb3lzdGljayIgL0kgIi4uLy4uL3NyYy9ldmVudHMiIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmRpYiIgL0kgIi4uLy4uL3NyYy92aWRlby9nYXBpIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICJBUk1WNCIgL0QgIk5ERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIk5ERUJVRyIgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0IiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiTkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjQiIC9yCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjREYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntFQ0JFQTQzRC1DRDdCLTQ4NTItQUQ1NS1ENDIyN0I1RDYyNEJ9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIENQVV9JRCAie0VDQkVBNDNELUNEN0ItNDg1Mi1BRDU1LUQ0MjI3QjVENjI0Qn0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbGFybS5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmMiIC9JICIuLi8uLi9zcmMvdmlkZW8iIC9JICIuLi8uLi9zcmMvdGhyZWFkIiAvSSAiLi4vLi4vc3JjL3RocmVhZC9nZW5lcmljIiAvSSAiLi4vLi4vc3JjL2F1ZGlvIiAvSSAiLi4vLi4vc3JjL2Nkcm9tIiAvSSAiLi4vLi4vc3JjL3RpbWVyIiAvSSAiLi4vLi4vc3JjL2pveXN0aWNrIiAvSSAiLi4vLi4vc3JjL2V2ZW50cyIgL0kgIi4uLy4uL3NyYy92aWRlby93aW5jb21tb24iIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luZGliIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL2dhcGkiIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjQiIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJERUJVRyIgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0IiAvcgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTMTZSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTMTZSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAxMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFMxNlJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTMTZSZWwiCisjIFBST1AgQ1BVX0lEICJ7RDY1MTkwMTMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiTUlQUzE2U1VQUE9SVCIgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJNSVBTIiAvZCAiX01JUFNfIiAvZCAiUjQwMDAiIC9kICJNSVBTSUkiIC9kICJNSVBTMTYiIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJNSVBTMTZTVVBQT1JUIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9kICJSNDAwMCIgL2QgIk1JUFNJSSIgL2QgIk1JUFMxNiIgL3IKK0NQUD1jbG1pcHMuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvTzIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiUjQwMDAiIC9EICJNSVBTSUkiIC9EICJNSVBTMTYiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvRCAiX01JUFMxNl8iIC9EICJNSVBTMTZTVVBQT1JUIiAvRCAiU0RMX0VYUE9SVFMiIC9ZWCAvUU1taXBzMTYgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJSNDAwMCIgL0QgIk1JUFNJSSIgL0QgIk1JUFMxNiIgL0QgIk5ERUJVRyIgL0QgIl9NSVBTMTZfIiAvRCAiTUlQUzE2U1VQUE9SVCIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9PeHQgL1FNbWlwczE2IC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOk1JUFMxNiAvQUxJR046NDA5NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUzE2IC9BTElHTjo0MDk2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTMTZEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTMTZEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAxMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFMxNkRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTMTZEYmciCisjIFBST1AgQ1BVX0lEICJ7RDY1MTkwMTMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJNSVBTMTZTVVBQT1JUIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiTUlQUyIgL2QgIl9NSVBTXyIgL2QgIlI0MDAwIiAvZCAiTUlQU0lJIiAvZCAiTUlQUzE2IiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiTUlQUzE2U1VQUE9SVCIgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9kICJSNDAwMCIgL2QgIk1JUFNJSSIgL2QgIk1JUFMxNiIgL3IKK0NQUD1jbG1pcHMuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiUjQwMDAiIC9EICJNSVBTSUkiIC9EICJNSVBTMTYiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX01JUFMxNl8iIC9EICJNSVBTMTZTVVBQT1JUIiAvRCAiU0RMX0VYUE9SVFMiIC9ZWCAvUU1taXBzMTYgL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjIiAvSSAiLi4vLi4vc3JjL3ZpZGVvIiAvSSAiLi4vLi4vc3JjL3RocmVhZCIgL0kgIi4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYyIgL0kgIi4uLy4uL3NyYy9hdWRpbyIgL0kgIi4uLy4uL3NyYy9jZHJvbSIgL0kgIi4uLy4uL3NyYy90aW1lciIgL0kgIi4uLy4uL3NyYy9qb3lzdGljayIgL0kgIi4uLy4uL3NyYy9ldmVudHMiIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uIiAvRCAiREVCVUciIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiUjQwMDAiIC9EICJNSVBTSUkiIC9EICJNSVBTMTYiIC9EICJfTUlQUzE2XyIgL0QgIk1JUFMxNlNVUFBPUlQiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvUU1taXBzMTYgL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUzE2IC9BTElHTjo0MDk2CisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUzE2IC9BTElHTjo0MDk2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTVY0VFJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0VFJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Y1MjMxNkE5LTNCN0MtNEZFNy1BNjdGLTY4MzUwQjQxMjQwRH0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiQVJNVjRUUmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0VFJlbCIKKyMgUFJPUCBDUFVfSUQgIntGNTIzMTZBOS0zQjdDLTRGRTctQTY3Ri02ODM1MEI0MTI0MER9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlRIVU1CCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpUSFVNQgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbHRodW1iLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlRIVU1CIiAvRCAiX1RIVU1CXyIgL0QgIkFSTVY0VCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJTRExfRVhQT1JUUyIgL1lYIC9RUmFyY2g0VCAvUVJpbnRlcndvcmstcmV0dXJuIC9PMiAvTSQoQ0VDcnRNVCkgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvT3h0IC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmMiIC9JICIuLi8uLi9zcmMvdmlkZW8iIC9JICIuLi8uLi9zcmMvdGhyZWFkIiAvSSAiLi4vLi4vc3JjL3RocmVhZC9nZW5lcmljIiAvSSAiLi4vLi4vc3JjL2F1ZGlvIiAvSSAiLi4vLi4vc3JjL2Nkcm9tIiAvSSAiLi4vLi4vc3JjL3RpbWVyIiAvSSAiLi4vLi4vc3JjL2pveXN0aWNrIiAvSSAiLi4vLi4vc3JjL2V2ZW50cyIgL0kgIi4uLy4uL3NyYy92aWRlby93aW5jb21tb24iIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgIlRIVU1CIiAvRCAiX1RIVU1CXyIgL0QgIkFSTVY0VCIgL0QgIk5ERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9RUmFyY2g0VCAvUVJpbnRlcndvcmstcmV0dXJuIC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJUSFVNQiIgL2QgIl9USFVNQl8iIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0VCIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJUSFVNQiIgL2QgIl9USFVNQl8iIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0VCIgL3IKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTVY0VERiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0VERiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Y1MjMxNkE5LTNCN0MtNEZFNy1BNjdGLTY4MzUwQjQxMjQwRH0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiQVJNVjRURGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0VERiZyIKKyMgUFJPUCBDUFVfSUQgIntGNTIzMTZBOS0zQjdDLTRGRTctQTY3Ri02ODM1MEI0MTI0MER9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlRIVU1CCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6VEhVTUIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitDUFA9Y2x0aHVtYi5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVEhVTUIiIC9EICJfVEhVTUJfIiAvRCAiQVJNVjRUIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIlNETF9FWFBPUlRTIiAvWVggL1FSYXJjaDRUIC9RUmludGVyd29yay1yZXR1cm4gL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjIiAvSSAiLi4vLi4vc3JjL3ZpZGVvIiAvSSAiLi4vLi4vc3JjL3RocmVhZCIgL0kgIi4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYyIgL0kgIi4uLy4uL3NyYy9hdWRpbyIgL0kgIi4uLy4uL3NyYy9jZHJvbSIgL0kgIi4uLy4uL3NyYy90aW1lciIgL0kgIi4uLy4uL3NyYy9qb3lzdGljayIgL0kgIi4uLy4uL3NyYy9ldmVudHMiIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uIiAvRCAiREVCVUciIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgIlRIVU1CIiAvRCAiX1RIVU1CXyIgL0QgIkFSTVY0VCIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiU0RMX0VYUE9SVFMiIC9RUmFyY2g0VCAvUVJpbnRlcndvcmstcmV0dXJuIC9NJChDRUNydE1URGVidWcpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiVEhVTUIiIC9kICJfVEhVTUJfIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9kICJBUk1WNFQiIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJUSFVNQiIgL2QgIl9USFVNQl8iIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0VCIgL3IKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiWDg2UmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiWDg2UmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJYODZSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiWDg2UmVsIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkYzLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKK0NQUD1jbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PMiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL0QgIlNETF9FWFBPUlRTIiAvWVggL0dzODE5MiAvR0YgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvTzIgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0QgIl9pMzg2XyIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJTRExfRVhQT1JUUyIgL0dzODE5MiAvT3h0IC9HRiAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJYODZEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJYODZEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIlg4NkRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJYODZEYmciCisjIFBST1AgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorQ1BQPWNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiU0RMX0VYUE9SVFMiIC9ZWCAvR3M4MTkyIC9HRiAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmMiIC9JICIuLi8uLi9zcmMvdmlkZW8iIC9JICIuLi8uLi9zcmMvdGhyZWFkIiAvSSAiLi4vLi4vc3JjL3RocmVhZC9nZW5lcmljIiAvSSAiLi4vLi4vc3JjL2F1ZGlvIiAvSSAiLi4vLi4vc3JjL2Nkcm9tIiAvSSAiLi4vLi4vc3JjL3RpbWVyIiAvSSAiLi4vLi4vc3JjL2pveXN0aWNrIiAvSSAiLi4vLi4vc3JjL2V2ZW50cyIgL0kgIi4uLy4uL3NyYy92aWRlby93aW5jb21tb24iIC9EICJERUJVRyIgL0QgIl9pMzg2XyIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJTRExfRVhQT1JUUyIgL0dzODE5MiAvR0YgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1EYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1EYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGQy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkFSTURiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1EYmciCisjIFBST1AgQ1BVX0lEICJ7RDY1MThGRkMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvcgorQ1BQPWNsYXJtLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjIiAvSSAiLi4vLi4vc3JjL3ZpZGVvIiAvSSAiLi4vLi4vc3JjL3RocmVhZCIgL0kgIi4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYyIgL0kgIi4uLy4uL3NyYy9hdWRpbyIgL0kgIi4uLy4uL3NyYy9jZHJvbSIgL0kgIi4uLy4uL3NyYy90aW1lciIgL0kgIi4uLy4uL3NyYy9qb3lzdGljayIgL0kgIi4uLy4uL3NyYy9ldmVudHMiIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmRpYiIgL0kgIi4uLy4uL3NyYy92aWRlby9nYXBpIiAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiQVJNUmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRkMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJBUk1SZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiQVJNUmVsIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkZDLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL3IKK0NQUD1jbGFybS5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvWVggL094cyAvTSQoQ0VDcnRNVCkgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvTzIgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyYyIgL0kgIi4uLy4uL3NyYy92aWRlbyIgL0kgIi4uLy4uL3NyYy90aHJlYWQiIC9JICIuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMiIC9JICIuLi8uLi9zcmMvYXVkaW8iIC9JICIuLi8uLi9zcmMvY2Ryb20iIC9JICIuLi8uLi9zcmMvdGltZXIiIC9JICIuLi8uLi9zcmMvam95c3RpY2siIC9JICIuLi8uLi9zcmMvZXZlbnRzIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIgL0kgIi4uLy4uL3NyYy92aWRlby93aW5kaWIiIC9JICIuLi8uLi9zcmMvdmlkZW8vZ2FwaSIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvT3hzIC9NJChDRUNydE1UKSAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0RiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE5MDEwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiTUlQU0RiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTRGJnIgorIyBQUk9QIENQVV9JRCAie0Q2NTE5MDEwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiTUlQUyIgL2QgIl9NSVBTXyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9yCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmMiIC9JICIuLi8uLi9zcmMvdmlkZW8iIC9JICIuLi8uLi9zcmMvdGhyZWFkIiAvSSAiLi4vLi4vc3JjL3RocmVhZC9nZW5lcmljIiAvSSAiLi4vLi4vc3JjL2F1ZGlvIiAvSSAiLi4vLi4vc3JjL2Nkcm9tIiAvSSAiLi4vLi4vc3JjL3RpbWVyIiAvSSAiLi4vLi4vc3JjL2pveXN0aWNrIiAvSSAiLi4vLi4vc3JjL2V2ZW50cyIgL0kgIi4uLy4uL3NyYy92aWRlby93aW5jb21tb24iIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luZGliIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL2dhcGkiIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTUlQU1JlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFNSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAxMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTUlQU1JlbCIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAxMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJNSVBTIiAvZCAiX01JUFNfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9yCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL1lYIC9PeHMgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL08yIC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmMiIC9JICIuLi8uLi9zcmMvdmlkZW8iIC9JICIuLi8uLi9zcmMvdGhyZWFkIiAvSSAiLi4vLi4vc3JjL3RocmVhZC9nZW5lcmljIiAvSSAiLi4vLi4vc3JjL2F1ZGlvIiAvSSAiLi4vLi4vc3JjL2Nkcm9tIiAvSSAiLi4vLi4vc3JjL3RpbWVyIiAvSSAiLi4vLi4vc3JjL2pveXN0aWNrIiAvSSAiLi4vLi4vc3JjL2V2ZW50cyIgL0kgIi4uLy4uL3NyYy92aWRlby93aW5jb21tb24iIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luZGliIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL2dhcGkiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvT3hzIC9NJChDRUNydE1UKSAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAxMDAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Il9EbGxNYWluQ1JUU3RhcnR1cCIgL2RsbCAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlNIM1JlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlNIM1JlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE5MDIwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiU0gzUmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlNIM1JlbCIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAyMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJTSHgiIC9kICJTSDMiIC9kICJfU0gzXyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJTSHgiIC9kICJTSDMiIC9kICJfU0gzXyIgL3IKK0NQUD1zaGNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJTSHgiIC9EICJTSDMiIC9EICJfU0gzXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvT3hzIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvT2IyIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjIiAvSSAiLi4vLi4vc3JjL3ZpZGVvIiAvSSAiLi4vLi4vc3JjL3RocmVhZCIgL0kgIi4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYyIgL0kgIi4uLy4uL3NyYy9hdWRpbyIgL0kgIi4uLy4uL3NyYy9jZHJvbSIgL0kgIi4uLy4uL3NyYy90aW1lciIgL0kgIi4uLy4uL3NyYy9qb3lzdGljayIgL0kgIi4uLy4uL3NyYy9ldmVudHMiIC9JICIuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uIiAvSSAiLi4vLi4vc3JjL3ZpZGVvL3dpbmRpYiIgL0kgIi4uLy4uL3NyYy92aWRlby9nYXBpIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlNIeCIgL0QgIlNIMyIgL0QgIl9TSDNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL1lYIC9PeHMgL00kKENFQ3J0TVQpIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDEwMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiX0RsbE1haW5DUlRTdGFydHVwIiAvZGxsIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlNIMworIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMTAwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJfRGxsTWFpbkNSVFN0YXJ0dXAiIC9kbGwgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6U0gzCisKKyFFTkRJRiAKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisjIE5hbWUgIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisjIE5hbWUgIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisjIE5hbWUgIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisjIE5hbWUgIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisjIE5hbWUgIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisjIE5hbWUgIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKyMgTmFtZSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorIyBOYW1lICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXFNETC5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0M9XAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0M9XAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0M9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0M9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0M9XAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQz1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0M9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQz1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0M9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX0M9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQz1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0M9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQz1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0M9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0M9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0M9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQz1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0M9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0M9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0M9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0M9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfYWN0aXZlLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0E9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0E9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0E9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0E9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0E9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0E9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW8uYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVU9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVU9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfQVU9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfQVU9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfQVU9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfQVU9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVU9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfQVU9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfQVU9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVT1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVT1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVT1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVT1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVT1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVT1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfQVU9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9jdnQuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVVEPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQVVEPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVVEPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK05PREVQX0NQUF9TRExfQVVEPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVVEPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQVVEPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQVVEPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVVEPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVVEPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfQVVEPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfQVVEPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVRD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVUQ9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldi5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVREk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVREk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVREk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVREk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVREk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0FVREk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQVVEST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0FVREk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0FVREk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQVVEST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9BVURJPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQj1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0I9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9ibGl0XzAuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9CTD1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK05PREVQX0NQUF9TRExfQkw9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQkw9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTD1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkw9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQkw9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQkw9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK05PREVQX0NQUF9TRExfQkw9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQkw9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9CTD1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTD1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkw9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9CTD1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK05PREVQX0NQUF9TRExfQkw9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9CTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9ibGl0XzEuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkxJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkxJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkxJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMST1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkxJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTEk9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTEk9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTEk9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTEk9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkxJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTEk9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXRfQS5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMSVQ9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdF9OLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZFg4Ni5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZFg4Ni5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZFg4Ni5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZFg4Ni5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZFg4Ni5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZFg4Ni5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcaGVybWVzXEhlYWRNTVguaCJcCisJIi4uXC4uXHNyY1xoZXJtZXNcSGVhZFg4Ni5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZFg4Ni5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZFg4Ni5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMSVRfPVwKKwkiLi5cLi5cc3JjXGhlcm1lc1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcaGVybWVzXEhlYWRYODYuaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMSVRfPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1xoZXJtZXNcSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXGhlcm1lc1xIZWFkWDg2LmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0JMSVRfPVwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRNTVguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkWDg2LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0JMSVRfPVwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRNTVguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkWDg2LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMSVRfPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCitOT0RFUF9DUFBfU0RMX0JMSVRfPVwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRNTVguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkWDg2LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX0JMSVRfPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcaGVybWVzXEhlYWRNTVguaCJcCisJIi4uXC4uXHNyY1xoZXJtZXNcSGVhZFg4Ni5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGhlcm1lc1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcaGVybWVzXEhlYWRYODYuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGhlcm1lc1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcaGVybWVzXEhlYWRYODYuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JMSVRfPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXHNyY1x2aWRlb1xIZWFkTU1YLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZFg4Ni5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTElUXz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfQkxJVF89XAorCSIuLlwuLlxzcmNcdmlkZW9cSGVhZE1NWC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXEhlYWRYODYuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfYm1wLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQk09XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9CTT1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQk09XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9CTT1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0JNPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCQorTk9ERVBfQ1BQX1NETF9CTT1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQk09XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JNPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQk09XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9CTT1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9CTT1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK05PREVQX0NQUF9TRExfQk09XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0JNPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK05PREVQX0NQUF9TRExfQk09XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0JNPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK05PREVQX0NQUF9TRExfQk09XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQk09XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0JNPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQk09XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JNPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkKK05PREVQX0NQUF9TRExfQk09XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9CTT1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0JNPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQk09XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JNPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9CTT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQk09XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQk09XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JNPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQk09XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJCitOT0RFUF9DUFBfU0RMX0JNPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9CTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkKK05PREVQX0NQUF9TRExfQk09XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQk09XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGNwdWluZm9cU0RMX2NwdWluZm8uYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9DUD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9DUD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQ1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DUD1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9DUD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfQ1A9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9DUD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9DUD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK05PREVQX0NQUF9TRExfQ1A9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK05PREVQX0NQUF9TRExfQ1A9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9DUD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DUD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQ1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DUD1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9DUD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9DUD1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQ1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DUD1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9DUD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQ1A9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQ1A9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0NQPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQ1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkKK05PREVQX0NQUF9TRExfQ1A9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DUD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DUD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQ1A9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3IuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQ1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DVT1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQ1U9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQ1U9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9DVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0NVPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQ1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DVT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQ1U9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9DVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQ1U9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQ1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DVT1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQ1U9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQ1U9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9DVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQ1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0NVPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQ1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DVT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQ1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9DVT1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfQ1U9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfQ1U9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9DVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkZWZhdWx0X2N1cnNvci5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfQ1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfQ1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0NVPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9DVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX0Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfRD1cCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1x3aW5kaWJcU0RMX2RpYmF1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHMuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfREk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EST1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfREk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EST1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oIlwKKwkKK05PREVQX0NQUF9TRExfREk9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oIlwKKwkKK05PREVQX0NQUF9TRExfREk9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfREk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EST1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oIlwKKwkKK05PREVQX0NQUF9TRExfREk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfREk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EST1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfREk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EST1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfREk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oIlwKKwkKK05PREVQX0NQUF9TRExfREk9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oIlwKKwkKK05PREVQX0NQUF9TRExfREk9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfREk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EST1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfREk9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9EST1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oIlwKKwkKK05PREVQX0NQUF9TRExfREk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfdmtleXMuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRElCPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRElCPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRElCPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRElCPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ESUI9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRElCPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9ESUI9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRElCPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRElCPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRElCPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRElCPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRElCPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ESUI9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ESUI9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ESUI9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ESUI9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRElCPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9ESUI9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRElCPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9ESUI9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRElCPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRElCPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRElCPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9ESUI9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ESUI9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRElCPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9ESUI9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9ESUI9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYnZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRElCPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRElCPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJQj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXGRpc2tcU0RMX2Rpc2thdWRpby5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRElTPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXGRpc2tcU0RMX2Rpc2thdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xkaXNrXFNETF9kaXNrYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9ESVM9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cZGlza1xTRExfZGlza2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ESVM9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cZGlza1xTRExfZGlza2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRElTPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXGRpc2tcU0RMX2Rpc2thdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ESVM9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cZGlza1xTRExfZGlza2F1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRElTPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXGRpc2tcU0RMX2Rpc2thdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0RJUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xkaXNrXFNETF9kaXNrYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xkaXNrXFNETF9kaXNrYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRElTPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXGRpc2tcU0RMX2Rpc2thdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xkaXNrXFNETF9kaXNrYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RJUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xkaXNrXFNETF9kaXNrYXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cZHVtbXlcU0RMX2R1bW15YXVkaW8uYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXGR1bW15XFNETF9kdW1teWF1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRFU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cZHVtbXlcU0RMX2R1bW15YXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9EVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xkdW1teVxTRExfZHVtbXlhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRFU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cZHVtbXlcU0RMX2R1bW15YXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9EVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xkdW1teVxTRExfZHVtbXlhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9EVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xkdW1teVxTRExfZHVtbXlhdWRpby5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX0RVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXGR1bW15XFNETF9kdW1teWF1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRFU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cZHVtbXlcU0RMX2R1bW15YXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXGR1bW15XFNETF9kdW1teWF1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX0RVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXGR1bW15XFNETF9kdW1teWF1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRFU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cZHVtbXlcU0RMX2R1bW15YXVkaW8uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9fYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldl9jLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0RVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXGR1bW15XFNETF9kdW1teWF1ZGlvLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvX2MuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb21lbS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXFNETF9lcnJvci5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0U9XAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0U9XAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfRT1cCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK05PREVQX0NQUF9TRExfRT1cCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRT1cCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0U9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9FPVwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRT1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0U9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9FPVwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9FPVwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfRT1cCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9FPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfRT1cCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK05PREVQX0NQUF9TRExfRT1cCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9FPVwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9FPVwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfRT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0U9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRT1cCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0U9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9FPVwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRT1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9FPVwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9FPVwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FPVwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRT1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX0U9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9FPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX0U9XAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0U9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FPVwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHMuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVY9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVY9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FVj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0VWPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FVj1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FVj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVY9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FVj1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVY9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FVj1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FVj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVY9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FVj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0VWPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVY9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FVj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0VWPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRVY9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVY9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfZXhwb3NlLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0VYPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VYPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVg9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0VYPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VYPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVg9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0VYPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VYPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVg9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVg9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVg9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVg9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVg9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX0VYPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VYPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0VYPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX0VYPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX0VYPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0VYPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVg9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9FWD1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9FWD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfRVg9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRVg9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcU0RMX2ZhdGFsLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0Y9XAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorTk9ERVBfQ1BQX1NETF9GPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0Y9XAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorTk9ERVBfQ1BQX1NETF9GPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRj1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRj1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkKK05PREVQX0NQUF9TRExfRj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkKK05PREVQX0NQUF9TRExfRj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0Y9XAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorTk9ERVBfQ1BQX1NETF9GPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX0Y9XAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorTk9ERVBfQ1BQX1NETF9GPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkKK05PREVQX0NQUF9TRExfRj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX0Y9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkKK05PREVQX0NQUF9TRExfRj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRj1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRj1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkKK05PREVQX0NQUF9TRExfRj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkKK05PREVQX0NQUF9TRExfRj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorTk9ERVBfQ1BQX1NETF9GPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0Y9XAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorTk9ERVBfQ1BQX1NETF9GPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX0Y9XAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorTk9ERVBfQ1BQX1NETF9GPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRj1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRj1cCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkKK05PREVQX0NQUF9TRExfRj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0Y9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9GPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXHNyY1xTRExfZmF0YWwuaCJcCisJCitOT0RFUF9DUFBfU0RMX0Y9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0Y9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXFNETF9mYXRhbC5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9nYW1tYS5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9HPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJCitOT0RFUF9DUFBfU0RMX0c9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfRz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9HPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJCitOT0RFUF9DUFBfU0RMX0c9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfRz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9HPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRz1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfRz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX0c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9uYW1lLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZV9sb2cuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xlX3Bvdy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGVfc3FydC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1hdGhfcHJpdmF0ZS5oIlwKKwkKK05PREVQX0NQUF9TRExfRz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfRz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkKK05PREVQX0NQUF9TRExfRz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX25hbWUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xlX2xvZy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGVfcG93LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZV9zcXJ0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbWF0aF9wcml2YXRlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX25hbWUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xlX2xvZy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGVfcG93LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZV9zcXJ0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbWF0aF9wcml2YXRlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0c9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9HPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfRz1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9HPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJCitOT0RFUF9DUFBfU0RMX0c9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0c9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9HPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX25hbWUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGVfbG9nLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZV9wb3cuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xlX3NxcnQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtYXRoX3ByaXZhdGUuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9uYW1lLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xlX2xvZy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGVfcG93LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZV9zcXJ0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbWF0aF9wcml2YXRlLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfRz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9uYW1lLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xlX2xvZy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGVfcG93LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZV9zcXJ0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbWF0aF9wcml2YXRlLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0c9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9HPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0c9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9HPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0c9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0c9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXGdhcGlcU0RMX2dhcGl2aWRlby5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfR0E9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZ2FwaVxzZGxfZ2FwaXZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9HQT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xnYXBpXHNkbF9nYXBpdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0dBPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGdhcGlcc2RsX2dhcGl2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9HQT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xnYXBpXHNkbF9nYXBpdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX0dBPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGdhcGlcc2RsX2dhcGl2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0dBPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGdhcGlcc2RsX2dhcGl2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfR0E9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZ2FwaVxzZGxfZ2FwaXZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9HQT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xnYXBpXHNkbF9nYXBpdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfR0E9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZ2FwaVxzZGxfZ2FwaXZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfR0E9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZ2FwaVxzZGxfZ2FwaXZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9HQT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xnYXBpXHNkbF9nYXBpdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGliZXZlbnRzX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfR0E9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZ2FwaVxzZGxfZ2FwaXZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcc3RkbGliXFNETF9nZXRlbnYuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9HRT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9HRT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9HRT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9HRT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9HRT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfR0U9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HRT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfR0U9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9HRT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfR0U9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9HRT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9HRT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0dFPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfR0U9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xzdGRsaWJcU0RMX2ljb252LmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0k9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX0k9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0k9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0k9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2suYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9KPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX0o9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9KPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX0o9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX0o9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfSj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfSj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfSj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX0o9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfSj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX0o9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfSj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9KPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9KPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX0o9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfSj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfSj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0o9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9KPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfSj1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX0o9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9KPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfSj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xldmVudHNcU0RMX2tleWJvYXJkLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkKK05PREVQX0NQUF9TRExfSz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9LPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0s9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9LPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0s9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfSz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9LPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0s9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9LPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9LPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9LPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkKK05PREVQX0NQUF9TRExfSz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9LPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfSz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0s9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9LPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkKK05PREVQX0NQUF9TRExfSz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkKK05PREVQX0NQUF9TRExfSz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9LPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0s9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9LPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9LPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9LPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9LPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfSz1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9LPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJCitOT0RFUF9DUFBfU0RMX0s9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfSz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9LPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX0s9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9LPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9LPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfSz1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfSz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX0s9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfSz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfSz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcc3RkbGliXFNETF9tYWxsb2MuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5cLi5cLi5cdXNyXGluY2x1ZGVcbWFsbG9jLmgiXAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5cLi5cLi5cdXNyXGluY2x1ZGVcbWFsbG9jLmgiXAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXG1hbGxvYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJIi4uXC4uXC4uXC4uXHVzclxpbmNsdWRlXHB0aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLlxvbmZpZ1xfZXBpbG9nLmgiXAorCSIuXG9uZmlnXF9tc3ZjX3dhcm5pbmdzX29mZi5oIlwKKwkiLlxvbmZpZ1xfcHJvbG9nLmgiXAorCSIuXG9uZmlnXHN0bF9hcGNjLmgiXAorCSIuXG9uZmlnXHN0bF9hcHBsZS5oIlwKKwkiLlxvbmZpZ1xzdGxfYXM0MDAuaCJcCisJIi5cb25maWdcc3RsX2JjLmgiXAorCSIuXG9uZmlnXHN0bF9jb21vLmgiXAorCSIuXG9uZmlnXHN0bF9jb25maXguaCJcCisJIi5cb25maWdcc3RsX2RlYy5oIlwKKwkiLlxvbmZpZ1xzdGxfZGVjX3Ztcy5oIlwKKwkiLlxvbmZpZ1xzdGxfZnVqaXRzdS5oIlwKKwkiLlxvbmZpZ1xzdGxfZ2NjLmgiXAorCSIuXG9uZmlnXHN0bF9ocGFjYy5oIlwKKwkiLlxvbmZpZ1xzdGxfaWJtLmgiXAorCSIuXG9uZmlnXHN0bF9pbnRlbC5oIlwKKwkiLlxvbmZpZ1xzdGxfa2FpLmgiXAorCSIuXG9uZmlnXHN0bF9tc3ZjLmgiXAorCSIuXG9uZmlnXHN0bF9td2Vya3MuaCJcCisJIi5cb25maWdcc3RsX215Y29tcC5oIlwKKwkiLlxvbmZpZ1xzdGxfc2NvLmgiXAorCSIuXG9uZmlnXHN0bF9zZWxlY3RfbGliLmgiXAorCSIuXG9uZmlnXHN0bF9zZ2kuaCJcCisJIi5cb25maWdcc3RsX3NvbGFyaXMuaCJcCisJIi5cb25maWdcc3RsX3N1bnByby5oIlwKKwkiLlxvbmZpZ1xzdGxfc3ltYW50ZWMuaCJcCisJIi5cb25maWdcc3RsX3dhdGNvbS5oIlwKKwkiLlxvbmZpZ1xzdGxfd2luY2UuaCJcCisJIi5cb25maWdcc3RsY29tcC5oIlwKKwkiLlxvbmZpZ1x2Y19zZWxlY3RfbGliLmgiXAorCSIuXHRocmVhZC5oIlwKKwkiLlx0bFxfYWJicmV2cy5oIlwKKwkiLlx0bFxfY29uZmlnLmgiXAorCSIuXHRsXF9jb25maWdfY29tcGF0LmgiXAorCSIuXHRsXF9jb25maWdfY29tcGF0X3Bvc3QuaCJcCisJIi5cdGxcX2VwaWxvZy5oIlwKKwkiLlx0bFxfcHJvbG9nLmgiXAorCSIuXHRsXF9zaXRlX2NvbmZpZy5oIlwKKwkiLlx0bF91c2VyX2NvbmZpZy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5cLi5cLi5cdXNyXGluY2x1ZGVcbWFsbG9jLmgiXAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxwdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi5cb25maWdcX2VwaWxvZy5oIlwKKwkiLlxvbmZpZ1xfbXN2Y193YXJuaW5nc19vZmYuaCJcCisJIi5cb25maWdcX3Byb2xvZy5oIlwKKwkiLlxvbmZpZ1xzdGxfYXBjYy5oIlwKKwkiLlxvbmZpZ1xzdGxfYXBwbGUuaCJcCisJIi5cb25maWdcc3RsX2FzNDAwLmgiXAorCSIuXG9uZmlnXHN0bF9iYy5oIlwKKwkiLlxvbmZpZ1xzdGxfY29tby5oIlwKKwkiLlxvbmZpZ1xzdGxfY29uZml4LmgiXAorCSIuXG9uZmlnXHN0bF9kZWMuaCJcCisJIi5cb25maWdcc3RsX2RlY192bXMuaCJcCisJIi5cb25maWdcc3RsX2Z1aml0c3UuaCJcCisJIi5cb25maWdcc3RsX2djYy5oIlwKKwkiLlxvbmZpZ1xzdGxfaHBhY2MuaCJcCisJIi5cb25maWdcc3RsX2libS5oIlwKKwkiLlxvbmZpZ1xzdGxfaW50ZWwuaCJcCisJIi5cb25maWdcc3RsX2thaS5oIlwKKwkiLlxvbmZpZ1xzdGxfbXN2Yy5oIlwKKwkiLlxvbmZpZ1xzdGxfbXdlcmtzLmgiXAorCSIuXG9uZmlnXHN0bF9teWNvbXAuaCJcCisJIi5cb25maWdcc3RsX3Njby5oIlwKKwkiLlxvbmZpZ1xzdGxfc2VsZWN0X2xpYi5oIlwKKwkiLlxvbmZpZ1xzdGxfc2dpLmgiXAorCSIuXG9uZmlnXHN0bF9zb2xhcmlzLmgiXAorCSIuXG9uZmlnXHN0bF9zdW5wcm8uaCJcCisJIi5cb25maWdcc3RsX3N5bWFudGVjLmgiXAorCSIuXG9uZmlnXHN0bF93YXRjb20uaCJcCisJIi5cb25maWdcc3RsX3dpbmNlLmgiXAorCSIuXG9uZmlnXHN0bGNvbXAuaCJcCisJIi5cb25maWdcdmNfc2VsZWN0X2xpYi5oIlwKKwkiLlx0aHJlYWQuaCJcCisJIi5cdGxcX2FiYnJldnMuaCJcCisJIi5cdGxcX2NvbmZpZy5oIlwKKwkiLlx0bFxfY29uZmlnX2NvbXBhdC5oIlwKKwkiLlx0bFxfY29uZmlnX2NvbXBhdF9wb3N0LmgiXAorCSIuXHRsXF9lcGlsb2cuaCJcCisJIi5cdGxcX3Byb2xvZy5oIlwKKwkiLlx0bFxfc2l0ZV9jb25maWcuaCJcCisJIi5cdGxfdXNlcl9jb25maWcuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NPVwKKwkiLi5cLi5cLi5cLi5cdXNyXGluY2x1ZGVcbWFsbG9jLmgiXAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxwdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi5cb25maWdcX2VwaWxvZy5oIlwKKwkiLlxvbmZpZ1xfbXN2Y193YXJuaW5nc19vZmYuaCJcCisJIi5cb25maWdcX3Byb2xvZy5oIlwKKwkiLlxvbmZpZ1xzdGxfYXBjYy5oIlwKKwkiLlxvbmZpZ1xzdGxfYXBwbGUuaCJcCisJIi5cb25maWdcc3RsX2FzNDAwLmgiXAorCSIuXG9uZmlnXHN0bF9iYy5oIlwKKwkiLlxvbmZpZ1xzdGxfY29tby5oIlwKKwkiLlxvbmZpZ1xzdGxfY29uZml4LmgiXAorCSIuXG9uZmlnXHN0bF9kZWMuaCJcCisJIi5cb25maWdcc3RsX2RlY192bXMuaCJcCisJIi5cb25maWdcc3RsX2Z1aml0c3UuaCJcCisJIi5cb25maWdcc3RsX2djYy5oIlwKKwkiLlxvbmZpZ1xzdGxfaHBhY2MuaCJcCisJIi5cb25maWdcc3RsX2libS5oIlwKKwkiLlxvbmZpZ1xzdGxfaW50ZWwuaCJcCisJIi5cb25maWdcc3RsX2thaS5oIlwKKwkiLlxvbmZpZ1xzdGxfbXN2Yy5oIlwKKwkiLlxvbmZpZ1xzdGxfbXdlcmtzLmgiXAorCSIuXG9uZmlnXHN0bF9teWNvbXAuaCJcCisJIi5cb25maWdcc3RsX3Njby5oIlwKKwkiLlxvbmZpZ1xzdGxfc2VsZWN0X2xpYi5oIlwKKwkiLlxvbmZpZ1xzdGxfc2dpLmgiXAorCSIuXG9uZmlnXHN0bF9zb2xhcmlzLmgiXAorCSIuXG9uZmlnXHN0bF9zdW5wcm8uaCJcCisJIi5cb25maWdcc3RsX3N5bWFudGVjLmgiXAorCSIuXG9uZmlnXHN0bF93YXRjb20uaCJcCisJIi5cb25maWdcc3RsX3dpbmNlLmgiXAorCSIuXG9uZmlnXHN0bGNvbXAuaCJcCisJIi5cb25maWdcdmNfc2VsZWN0X2xpYi5oIlwKKwkiLlx0aHJlYWQuaCJcCisJIi5cdGxcX2FiYnJldnMuaCJcCisJIi5cdGxcX2NvbmZpZy5oIlwKKwkiLlx0bFxfY29uZmlnX2NvbXBhdC5oIlwKKwkiLlx0bFxfY29uZmlnX2NvbXBhdF9wb3N0LmgiXAorCSIuXHRsXF9lcGlsb2cuaCJcCisJIi5cdGxcX3Byb2xvZy5oIlwKKwkiLlx0bFxfc2l0ZV9jb25maWcuaCJcCisJIi5cdGxfdXNlcl9jb25maWcuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX009XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxtYWxsb2MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9taXhlci5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfbTY4ay5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NST1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9NST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfbTY4ay5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NST1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTUk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfbTY4ay5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NST1cCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfbTY4ay5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NST1cCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUk9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfbTY4ay5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NST1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfbTY4ay5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NST1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTUk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX202OGsuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfTUk9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX202OGsuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfTUk9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX202OGsuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfTUk9XAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX202OGsuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfTUk9XAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTUk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX202OGsuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfTUk9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUk9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX202OGsuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfTUk9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9NST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfbTY4ay5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9NST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfbTY4ay5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01JPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfbTY4ay5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX202OGsuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKK05PREVQX0NQUF9TRExfTUk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX202OGsuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9zeXNhdWRpby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTUlYPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJCitOT0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUlYPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJCitOT0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKK05PREVQX0NQUF9TRExfTUlYPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKK05PREVQX0NQUF9TRExfTUlYPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NSVg9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NSVg9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NSVg9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTUlYPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJCitOT0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUlYPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJCitOT0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NSVg9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUlYPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJCitOT0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKK05PREVQX0NQUF9TRExfTUlYPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKK05PREVQX0NQUF9TRExfTUlYPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NSVg9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NSVg9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKK05PREVQX0NQUF9TRExfTUlYPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NSVg9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTUlYPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJCitOT0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUlYPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJCitOT0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKK05PREVQX0NQUF9TRExfTUlYPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKK05PREVQX0NQUF9TRExfTUlYPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NSVg9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKK05PREVQX0NQUF9TRExfTUlYPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTUlYPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJCitOT0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTUlYPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCJcCisJCitOT0RFUF9DUFBfU0RMX01JWD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NSVg9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWF9WQy5oIlwKKwkKK05PREVQX0NQUF9TRExfTUlYPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcZXZlbnRzXFNETF9tb3VzZS5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTU89XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTU89XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTU89XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01PPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTU89XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTU89XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX01PPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTU89XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfTU89XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTU89XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTU89XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfTU89XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTU89XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01PPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9NTz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01PPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTU89XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX01PPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9NTz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX01PPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsZXZlbnRzLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9OPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX049XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbGV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX049XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbGV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9OPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX049XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbGV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9OPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfTj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9OPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfTj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbG1vdXNlLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9OVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9OVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9OVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX05VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbG1vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX05VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbG1vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9OVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9OVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9OVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX05VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbG1vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9OVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9OVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX05VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbG1vdXNlX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9OVUw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9OVUw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9OVUw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX05VTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbGV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX05VTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbGV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9OVUw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9OVUw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9OVUw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX05VTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbGV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9OVUw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9OVUw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsbW91c2VfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX05VTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbGV2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGx2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1A9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1A9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUD1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUD1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUD1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUD1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1A9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUD1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUD1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUD1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUD1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1A9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX1A9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1A9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1A9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9QPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9QPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xzdGRsaWJcU0RMX3Fzb3J0LmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1E9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9RPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1E9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1E9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1E9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9RPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1E9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1E9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1E9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1E9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9RPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9RPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX1E9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9RPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9RPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9RPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfcXVpdC5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9RVT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9RVT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1FVPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9RVT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9RVT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1FVPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9RVT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9RVT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1FVPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1FVPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1FVPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1FVPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9RVT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9RVT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9RVT1cCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9RVT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9RVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9RVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUVU9XAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1FVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfcmVzaXplLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1I9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUj1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1I9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUj1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUj1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9SPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9SPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1I9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1I9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9SPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1I9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9SPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1I9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9SPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1I9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUj1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1I9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUj1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUj1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1I9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9SPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWwuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUkw9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9STD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xtbXguaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9STD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9STD1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cbW14LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JMPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXG1teC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfUkw9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGZpbGVcU0RMX3J3b3BzLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUlc9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfUlc9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUlc9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfUlc9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUlc9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfUlc9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9SVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9SVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9SVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUlc9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfUlc9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9SVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUlc9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfUlc9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9SVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9SVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9SVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUlc9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfUlc9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1JXPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUlc9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUlc9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9SVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9SVz1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUlc9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfUlc9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUlc9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfUz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK05PREVQX0NQUF9TRExfUz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1M9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1M9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfUz1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfUz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1M9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1M9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfUz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK05PREVQX0NQUF9TRExfUz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1M9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK05PREVQX0NQUF9TRExfUz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorTk9ERVBfQ1BQX1NETF9TPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1M9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1M9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1M9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1M9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKK05PREVQX0NQUF9TRExfUz1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX1M9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJCitOT0RFUF9DUFBfU0RMX1M9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfUz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkKK05PREVQX0NQUF9TRExfUz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1M9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcc3RkbGliXFNETF9zdHJpbmcuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9TVD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TVD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1Q9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfc3VyZmFjZS5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX1JMRWFjY2VsX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX1NVPVwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1U9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9sZWFrcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TVT1cCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfbWVtb3BzLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcY2Ryb21cZHVtbXlcU0RMX3N5c2Nkcm9tLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1k9XAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1k9XAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWT1cCisJIi4uXC4uXHNyY1xjZHJvbVxTRExfc3lzY2Ryb20uaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZPVwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWT1cCisJIi4uXC4uXHNyY1xjZHJvbVxTRExfc3lzY2Ryb20uaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZPVwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xjZHJvbVxTRExfc3lzY2Ryb20uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1k9XAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1k9XAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1k9XAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1k9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWT1cCisJIi4uXC4uXHNyY1xjZHJvbVxTRExfc3lzY2Ryb20uaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWT1cCisJIi4uXC4uXHNyY1xjZHJvbVxTRExfc3lzY2Ryb20uaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZPVwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWT1cCisJIi4uXC4uXHNyY1xjZHJvbVxTRExfc3lzY2Ryb20uaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZPVwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1k9XAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9TWT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1k9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWT1cCisJIi4uXC4uXHNyY1xjZHJvbVxTRExfc3lzY2Ryb20uaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1k9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c2NvbmQuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK05PREVQX0NQUF9TRExfU1lTPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfU1lTPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVM9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVM9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVM9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZUz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c2V2ZW50cy5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXHdtbXNnLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNFPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXHdtbXNnLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNFPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2dhcGl2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXHdtbXNnLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGdhcGlcc2RsX2dhcGl2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGdhcGlcc2RsX2dhcGl2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGdhcGlcc2RsX2dhcGl2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXHdtbXNnLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNFPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xnYXBpXHNkbF9nYXBpdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZ2FwaVxzZGxfZ2FwaXZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXHdtbXNnLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0U9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZ2FwaVxzZGxfZ2FwaXZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXHdtbXNnLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXHdtbXNnLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfZ2FwaXZpZGVvLmgiXAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cZ2FwaVxzZGxfZ2FwaXZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXHdtbXNnLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNFPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTRT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXGdhcGlcc2RsX2dhcGl2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGpveXN0aWNrXGR1bW15XFNETF9zeXNqb3lzdGljay5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNKPVwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNKPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNKPVwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNKPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNKPVwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNKPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNKPVwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNKPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNKPVwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNKPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCJcCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfc3lzam95c3RpY2suaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXC4uXHNyY1xqb3lzdGlja1xTRExfam95c3RpY2tfYy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTSj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0o9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgiXAorCSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcbG9hZHNvXHdpbjMyXFNETF9zeXNsb2Fkc28uYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK05PREVQX0NQUF9TRExfU1lTTD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9TRExfU1lTTD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK05PREVQX0NQUF9TRExfU1lTTD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTD1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU0w9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNMPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZS5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNPVwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTT1cCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzbW91c2VfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU009XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlX2MuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c211dGV4LmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworTk9ERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK05PREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTTVU9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU01VPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNNVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXNzZW0uYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNTPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTUz1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNTPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTUz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1M9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNTPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWQuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxhbWlnYW9zXG15ZGVidWcuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxhbWlnYW9zXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxiZW9zXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxkY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZXBvY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcaXJpeFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcb3MyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxwdGhcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHB0aHJlYWRcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxhbWlnYW9zXG15ZGVidWcuaCJcCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxhbWlnYW9zXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxiZW9zXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxkY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZXBvY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcaXJpeFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcb3MyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxwdGhcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHB0aHJlYWRcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcYW1pZ2Fvc1xteWRlYnVnLmgiXAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcYW1pZ2Fvc1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcYmVvc1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZGNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGVwb2NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGlyaXhcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXG9zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRccHRoXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxwdGhyZWFkXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxhbWlnYW9zXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxiZW9zXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxkY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZXBvY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcaXJpeFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcb3MyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxwdGhcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHB0aHJlYWRcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcYW1pZ2Fvc1xteWRlYnVnLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxhbWlnYW9zXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxiZW9zXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxkY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZXBvY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcaXJpeFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcb3MyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxwdGhcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHB0aHJlYWRcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcYW1pZ2Fvc1xteWRlYnVnLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGFtaWdhb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGJlb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGRjXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxlcG9jXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxpcml4XFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxvczJcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHB0aFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRccHRocmVhZFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5cLi5cLi5cLi5cdXNyXGluY2x1ZGVccHRocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxhbWlnYW9zXG15ZGVidWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLlxvbmZpZ1xfZXBpbG9nLmgiXAorCSIuXG9uZmlnXF9tc3ZjX3dhcm5pbmdzX29mZi5oIlwKKwkiLlxvbmZpZ1xfcHJvbG9nLmgiXAorCSIuXG9uZmlnXHN0bF9hcGNjLmgiXAorCSIuXG9uZmlnXHN0bF9hcHBsZS5oIlwKKwkiLlxvbmZpZ1xzdGxfYXM0MDAuaCJcCisJIi5cb25maWdcc3RsX2JjLmgiXAorCSIuXG9uZmlnXHN0bF9jb21vLmgiXAorCSIuXG9uZmlnXHN0bF9jb25maXguaCJcCisJIi5cb25maWdcc3RsX2RlYy5oIlwKKwkiLlxvbmZpZ1xzdGxfZGVjX3Ztcy5oIlwKKwkiLlxvbmZpZ1xzdGxfZnVqaXRzdS5oIlwKKwkiLlxvbmZpZ1xzdGxfZ2NjLmgiXAorCSIuXG9uZmlnXHN0bF9ocGFjYy5oIlwKKwkiLlxvbmZpZ1xzdGxfaWJtLmgiXAorCSIuXG9uZmlnXHN0bF9pbnRlbC5oIlwKKwkiLlxvbmZpZ1xzdGxfa2FpLmgiXAorCSIuXG9uZmlnXHN0bF9tc3ZjLmgiXAorCSIuXG9uZmlnXHN0bF9td2Vya3MuaCJcCisJIi5cb25maWdcc3RsX215Y29tcC5oIlwKKwkiLlxvbmZpZ1xzdGxfc2NvLmgiXAorCSIuXG9uZmlnXHN0bF9zZWxlY3RfbGliLmgiXAorCSIuXG9uZmlnXHN0bF9zZ2kuaCJcCisJIi5cb25maWdcc3RsX3NvbGFyaXMuaCJcCisJIi5cb25maWdcc3RsX3N1bnByby5oIlwKKwkiLlxvbmZpZ1xzdGxfc3ltYW50ZWMuaCJcCisJIi5cb25maWdcc3RsX3dhdGNvbS5oIlwKKwkiLlxvbmZpZ1xzdGxfd2luY2UuaCJcCisJIi5cb25maWdcc3RsY29tcC5oIlwKKwkiLlxvbmZpZ1x2Y19zZWxlY3RfbGliLmgiXAorCSIuXHRocmVhZC5oIlwKKwkiLlx0bFxfYWJicmV2cy5oIlwKKwkiLlx0bFxfY29uZmlnLmgiXAorCSIuXHRsXF9jb25maWdfY29tcGF0LmgiXAorCSIuXHRsXF9jb25maWdfY29tcGF0X3Bvc3QuaCJcCisJIi5cdGxcX2VwaWxvZy5oIlwKKwkiLlx0bFxfcHJvbG9nLmgiXAorCSIuXHRsXF9zaXRlX2NvbmZpZy5oIlwKKwkiLlx0bF91c2VyX2NvbmZpZy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGltZXJcd2luY2VcU0RMX3N5c3RpbWVyLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1RJPVwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVEk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNUST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVz1cCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNXPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNXPVwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c3dtX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd21fYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1NZU1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9TWVNXPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfU1lTVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWQuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9UPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXGFtaWdhb3NcbXlkZWJ1Zy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGFtaWdhb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGJlb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGRjXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxlcG9jXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxpcml4XFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxvczJcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHB0aFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRccHRocmVhZFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9UPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcYW1pZ2Fvc1xteWRlYnVnLmgiXAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcYW1pZ2Fvc1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcYmVvc1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZGNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGVwb2NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGlyaXhcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXG9zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRccHRoXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxwdGhyZWFkXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxzcmNcdGhyZWFkXGFtaWdhb3NcbXlkZWJ1Zy5oIlwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGFtaWdhb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGJlb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGRjXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxlcG9jXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxpcml4XFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cc3JjXHRocmVhZFxvczJcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXHB0aFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRccHRocmVhZFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVD1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9UPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UPVwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkKK05PREVQX0NQUF9TRExfVD1cCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGFtaWdhb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGJlb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGRjXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxlcG9jXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxpcml4XFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxvczJcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHB0aFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRccHRocmVhZFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxhbWlnYW9zXG15ZGVidWcuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGFtaWdhb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGJlb3NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGRjXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxlcG9jXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxpcml4XFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxvczJcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXHB0aFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRccHRocmVhZFxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UPVwKKwkiLi5cLi5cc3JjXHRocmVhZFxhbWlnYW9zXG15ZGVidWcuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcYW1pZ2Fvc1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcYmVvc1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZGNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGVwb2NcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGlyaXhcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXG9zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRccHRoXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxwdGhyZWFkXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlwuLlwuLlx1c3JcaW5jbHVkZVxwdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGFtaWdhb3NcbXlkZWJ1Zy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuXG9uZmlnXF9lcGlsb2cuaCJcCisJIi5cb25maWdcX21zdmNfd2FybmluZ3Nfb2ZmLmgiXAorCSIuXG9uZmlnXF9wcm9sb2cuaCJcCisJIi5cb25maWdcc3RsX2FwY2MuaCJcCisJIi5cb25maWdcc3RsX2FwcGxlLmgiXAorCSIuXG9uZmlnXHN0bF9hczQwMC5oIlwKKwkiLlxvbmZpZ1xzdGxfYmMuaCJcCisJIi5cb25maWdcc3RsX2NvbW8uaCJcCisJIi5cb25maWdcc3RsX2NvbmZpeC5oIlwKKwkiLlxvbmZpZ1xzdGxfZGVjLmgiXAorCSIuXG9uZmlnXHN0bF9kZWNfdm1zLmgiXAorCSIuXG9uZmlnXHN0bF9mdWppdHN1LmgiXAorCSIuXG9uZmlnXHN0bF9nY2MuaCJcCisJIi5cb25maWdcc3RsX2hwYWNjLmgiXAorCSIuXG9uZmlnXHN0bF9pYm0uaCJcCisJIi5cb25maWdcc3RsX2ludGVsLmgiXAorCSIuXG9uZmlnXHN0bF9rYWkuaCJcCisJIi5cb25maWdcc3RsX21zdmMuaCJcCisJIi5cb25maWdcc3RsX213ZXJrcy5oIlwKKwkiLlxvbmZpZ1xzdGxfbXljb21wLmgiXAorCSIuXG9uZmlnXHN0bF9zY28uaCJcCisJIi5cb25maWdcc3RsX3NlbGVjdF9saWIuaCJcCisJIi5cb25maWdcc3RsX3NnaS5oIlwKKwkiLlxvbmZpZ1xzdGxfc29sYXJpcy5oIlwKKwkiLlxvbmZpZ1xzdGxfc3VucHJvLmgiXAorCSIuXG9uZmlnXHN0bF9zeW1hbnRlYy5oIlwKKwkiLlxvbmZpZ1xzdGxfd2F0Y29tLmgiXAorCSIuXG9uZmlnXHN0bF93aW5jZS5oIlwKKwkiLlxvbmZpZ1xzdGxjb21wLmgiXAorCSIuXG9uZmlnXHZjX3NlbGVjdF9saWIuaCJcCisJIi5cdGhyZWFkLmgiXAorCSIuXHRsXF9hYmJyZXZzLmgiXAorCSIuXHRsXF9jb25maWcuaCJcCisJIi5cdGxcX2NvbmZpZ19jb21wYXQuaCJcCisJIi5cdGxcX2NvbmZpZ19jb21wYXRfcG9zdC5oIlwKKwkiLlx0bFxfZXBpbG9nLmgiXAorCSIuXHRsXF9wcm9sb2cuaCJcCisJIi5cdGxcX3NpdGVfY29uZmlnLmgiXAorCSIuXHRsX3VzZXJfY29uZmlnLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiXAorCSIuLlwuLlxzcmNcdGhyZWFkXFNETF9zeXN0aHJlYWQuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Q9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXHNyY1xTRExfZXJyb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfc3lzdGhyZWFkLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Q9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcU0RMX2Vycm9yX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzdGhyZWFkX2MuaCJcCisJIi4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXHRocmVhZFxTRExfdGhyZWFkX2MuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x0aW1lclxTRExfdGltZXIuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1RJPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF9zeXN0aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UST1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF9zeXN0aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UST1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVEk9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVEk9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1RJPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1RJPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF9zeXN0aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UST1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1RJPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF9zeXN0aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UST1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVEk9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVEk9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1RJPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVEk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF9zeXN0aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UST1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVEk9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVEk9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1RJPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVEk9XAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3N5c3RpbWVyLmgiXAorCSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1RJPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF9zeXN0aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVEk9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCJcCisJIi4uXC4uXHNyY1x0aW1lclxTRExfdGltZXJfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVEk9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1RJPVwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF9zeXN0aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9UST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9UST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF9zeXN0aW1lci5oIlwKKwkiLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX3ZpZGVvLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Y9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVj1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9WPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Y9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9WPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Y9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1Y9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfVj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9WPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9WPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Y9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9WPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Y9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9WPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Y9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9WPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Y9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1Y9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVj1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLlxETC5oIlwKKwkiLlxETF9hY3RpdmUuaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Nkcm9tLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2V2ZW50cy5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfam95c3RpY2suaCJcCisJIi5cRExfa2V5Ym9hcmQuaCJcCisJIi5cRExfa2V5c3ltLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcXVpdC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90aW1lci5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX1Y9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXQuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfVj1cCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Y9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfVj1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cREwuaCJcCisJIi5cRExfYWN0aXZlLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9jZHJvbS5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9ldmVudHMuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX2pveXN0aWNrLmgiXAorCSIuXERMX2tleWJvYXJkLmgiXAorCSIuXERMX2tleXN5bS5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3F1aXQuaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdGltZXIuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorCitERVBfQ1BQX1NETF9WPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfY3Vyc29yX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1Y9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9WPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCitOT0RFUF9DUFBfU0RMX1Y9XAorCSIuXERMLmgiXAorCSIuXERMX2FjdGl2ZS5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfY2Ryb20uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZXZlbnRzLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9qb3lzdGljay5oIlwKKwkiLlxETF9rZXlib2FyZC5oIlwKKwkiLlxETF9rZXlzeW0uaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9xdWl0LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3RpbWVyLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1Y9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Y9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50c19jLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorTk9ERVBfQ1BQX1NETF9WPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Y9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9waXhlbHNfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKK05PREVQX0NQUF9TRExfVj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1Y9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaCJcCisJIi4uXC4uXHNyY1xldmVudHNcU0RMX3N5c2V2ZW50cy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvcl9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1c9XAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIlwKKwkKK05PREVQX0NQUF9TRExfVz1cCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIlwKKwkKK05PREVQX0NQUF9TRExfVz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIlwKKwkKK05PREVQX0NQUF9TRExfVz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuXERMX2F1ZGlvLmgiXAorCSIuXERMX2J5dGVvcmRlci5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIlwKKwkKK05PREVQX0NQUF9TRExfVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIlwKKwkKK05PREVQX0NQUF9TRExfVz1cCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaCJcCisJCitOT0RFUF9DUFBfU0RMX1c9XAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIlwKKwkKK05PREVQX0NQUF9TRExfVz1cCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLlxETF9hdWRpby5oIlwKKwkiLlxETF9ieXRlb3JkZXIuaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIlwKKwkKK05PREVQX0NQUF9TRExfVz1cCisJIi5cRExfYXVkaW8uaCJcCisJIi5cRExfYnl0ZW9yZGVyLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXHNyY1xhdWRpb1xTRExfd2F2ZS5oIlwKKwkKK05PREVQX0NQUF9TRExfVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfV0k9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfV0k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XST1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfV0k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XST1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfV0k9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfV0k9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfV0k9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfV0k9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfV0k9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfV0k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XST1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfV0k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XST1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfV0k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XST1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfV0k9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKK05PREVQX0NQUF9TRExfV0k9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfV0k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbF9jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9XST1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XST1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1dJPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfbG93dmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfV0k9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9sb3d2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF95dXYuYworCishSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1k9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUkpIERlYnVnIgorCitERVBfQ1BQX1NETF9ZPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1k9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNINCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1k9XAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWT1cCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9nZXRlbnYuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZPVwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX2dldGVudi5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWT1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfZ2V0ZW52LmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9ZPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1k9XAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9ZPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1k9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1k9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF95dXZfbW14LmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1lVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX1lVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK05PREVQX0NQUF9TRExfWVU9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1NETF9ZVT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitOT0RFUF9DUFBfU0RMX1lVPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfU0RMX1lVPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWVU9XAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1lVPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJCitOT0RFUF9DUFBfU0RMX1lVPVwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWVU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWVU9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVT1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZVT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zdy5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWVVWPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVVY9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWVVWPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWVVWPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIERlYnVnIgorCitERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWVVWPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWVVWPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWVVWPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfb3BlbmdsLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWVVWPVwKKwkiLlxETF9lcnJvci5oIlwKKwkiLlxETF9tYWluLmgiXAorCSIuXERMX21vdXNlLmgiXAorCSIuXERMX211dGV4LmgiXAorCSIuXERMX3J3b3BzLmgiXAorCSIuXERMX3R5cGVzLmgiXAorCSIuXERMX3ZlcnNpb24uaCJcCisJIi5cRExfdmlkZW8uaCJcCisJIi5cZWdpbl9jb2RlLmgiXAorCSIuXGxvc2VfY29kZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1lVVj1cCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi5cRExfZXJyb3IuaCJcCisJIi5cRExfbWFpbi5oIlwKKwkiLlxETF9tb3VzZS5oIlwKKwkiLlxETF9tdXRleC5oIlwKKwkiLlxETF9yd29wcy5oIlwKKwkiLlxETF90eXBlcy5oIlwKKwkiLlxETF92ZXJzaW9uLmgiXAorCSIuXERMX3ZpZGVvLmgiXAorCSIuXGVnaW5fY29kZS5oIlwKKwkiLlxsb3NlX2NvZGUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWVVWPVwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dsZnVuY3MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVVY9XAorCSIuXERMX2Vycm9yLmgiXAorCSIuXERMX21haW4uaCJcCisJIi5cRExfbW91c2UuaCJcCisJIi5cRExfbXV0ZXguaCJcCisJIi5cRExfcndvcHMuaCJcCisJIi5cRExfdHlwZXMuaCJcCisJIi5cRExfdmVyc2lvbi5oIlwKKwkiLlxETF92aWRlby5oIlwKKwkiLlxlZ2luX2NvZGUuaCJcCisJIi5cbG9zZV9jb2RlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoX2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCJcCisJCitOT0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKK05PREVQX0NQUF9TRExfWVVWPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJIi4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfWVVWPVwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N5c3ZpZGVvLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dmZ1bmNzLmgiXAorCQorTk9ERVBfQ1BQX1NETF9ZVVY9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1lVVj1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgiXAorCSIuLlwuLlxzcmNcdmlkZW9cU0RMX3N0cmV0Y2hfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3dfYy5oIlwKKwkiLi5cLi5cc3JjXHZpZGVvXFNETF95dXZmdW5jcy5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfV0lOX0M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisKK0RFUF9DUFBfV0lOX0M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9XSU5fQz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKworREVQX0NQUF9XSU5fQz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVYpIFJlbGVhc2UiCisKK0RFUF9DUFBfV0lOX0M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfV0lOX0M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfV0lOX0M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9XSU5fQz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRJKSBEZWJ1ZyIKKworREVQX0NQUF9XSU5fQz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9XSU5fQz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfV0lOX0M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKK0RFUF9DUFBfV0lOX0M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIKKworREVQX0NQUF9XSU5fQz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9XSU5fQz1cCisJIi4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETCAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfV0lOX0M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTREwgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCitERVBfQ1BQX1dJTl9DPVwKKwkiLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKK0RFUF9DUFBfV0lOX0M9XAorCSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXHdpbl9jZV9zZW1hcGhvcmUuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXGJsYW5rX2N1cnNvci5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cZGVmYXVsdF9jdXJzb3IuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xoZXJtZXNcSGVhZE1NWC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGhlcm1lc1xIZWFkWDg2LmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cbW14LmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvZGV2X2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9tZW0uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfY29weWluZy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50c19jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXGRpc2tcU0RMX2Rpc2thdWRpby5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXGR1bW15XFNETF9kdW1teWF1ZGlvLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcU0RMX2Vycm9yX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfZXZlbnRzX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xTRExfZmF0YWwuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xnYXBpXHNkbF9nYXBpdmlkZW8uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXFNETF9nbGZ1bmNzLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGlja19jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX2xlYWtzLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF9tYWluLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cU0RMX21lbW9wcy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9tNjhrLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cU0RMX21peGVyX01NWC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfbmFtZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsZXZlbnRzX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbG1vdXNlX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF9vcGVuZ2wuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWxfYy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfcndvcHMuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cU0RMX3N5c2F1ZGlvLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcY2Ryb21cU0RMX3N5c2Nkcm9tLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c2NvbmRfYy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXGV2ZW50c1xTRExfc3lzZXZlbnRzLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcam95c3RpY2tcU0RMX3N5c2pveXN0aWNrLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c211dGV4X2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzc2VtX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRocmVhZFxnZW5lcmljXFNETF9zeXN0aHJlYWRfYy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzdGhyZWFkX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfc3lzdmlkZW8uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGluY2x1ZGVcU0RMX3N5c3dtLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZF9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF90aW1lci5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHRpbWVyXFNETF90aW1lcl9jLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfdmlkZW8uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX3ZrZXlzLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3dpbmdsX2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X3N3X2MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1x0aHJlYWRcd2luMzJcd2luX2NlX3NlbWFwaG9yZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblx3bW1zZy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSIKKyMgRW5kIEdyb3VwCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS9TREwvU0RMLnZjcHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS9TREwvU0RMLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzA0NThmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL1NETC9TREwudmNwcm9qCkBAIC0wLDAgKzEsMzk2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0id2luZG93cy0xMjUxIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjgsMDAiCisJTmFtZT0iU0RMIgorCVByb2plY3RHVUlEPSJ7QzU5ODAyNEQtODAzMC00RjlDLUFCNzYtNjlCRjRDQTA2NDVGfSIKKwlSb290TmFtZXNwYWNlPSJTREwiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCS8+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJLz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwudGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vaW5jbHVkZSwuLi8uLi9zcmMsLi4vLi4vc3JjL3ZpZGVvLC4uLy4uL3NyYy90aHJlYWQsLi4vLi4vc3JjL3RocmVhZC9nZW5lcmljLC4uLy4uL3NyYy9hdWRpbywuLi8uLi9zcmMvY2Ryb20sLi4vLi4vc3JjL3RpbWVyLC4uLy4uL3NyYy9qb3lzdGljaywuLi8uLi9zcmMvZXZlbnRzLC4uLy4uL3NyYy92aWRlby93aW5jb21tb24sLi4vLi4vc3JjL3ZpZGVvL3dpbmRpYiwuLi8uLi9zcmMvdmlkZW8vZ2FwaSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iREVCVUc7QVJNO19BUk1fO0FSTVY0O19XSU4zMl9XQ0U9JChDRVZFUik7JChDZVBsYXRmb3JtKTtVTkRFUl9DRT0kKENFVkVSKTtVTklDT0RFO1NETF9FWFBPUlRTIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvciAiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVOREVSX0NFPSQoQ0VWRVIpLF9XSU4zMl9XQ0U9JChDRVZFUiksREVCVUcsVU5JQ09ERSxfVU5JQ09ERSwkKENlUGxhdGZvcm0pLEFSTSxfQVJNXyxBUk1WNCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvQUxJR046NDA5NiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOkFSTSAiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iY29tbWN0cmwubGliIGNvcmVkbGwubGliIHNlY2Noay5saWIgY2NydHJ0dGkubGliIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwuZGxsIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iJChDRU5vRGVmYXVsdExpYikiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwucGRiIgorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjY1NTM2IgorCQkJCVN0YWNrQ29tbWl0U2l6ZT0iNDA5NiIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJfRGxsTWFpbkNSVFN0YXJ0dXAiCisJCQkJQmFzZUFkZHJlc3M9IjB4MDAxMDAwMDAiCisJCQkJSW1wb3J0TGlicmFyeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL2luY2x1ZGUsLi4vLi4vc3JjLC4uLy4uL3NyYy92aWRlbywuLi8uLi9zcmMvdGhyZWFkLC4uLy4uL3NyYy90aHJlYWQvZ2VuZXJpYywuLi8uLi9zcmMvYXVkaW8sLi4vLi4vc3JjL2Nkcm9tLC4uLy4uL3NyYy90aW1lciwuLi8uLi9zcmMvam95c3RpY2ssLi4vLi4vc3JjL2V2ZW50cywuLi8uLi9zcmMvdmlkZW8vd2luY29tbW9uLC4uLy4uL3NyYy92aWRlby93aW5kaWIsLi4vLi4vc3JjL3ZpZGVvL2dhcGkiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkRFQlVHO0FSTTtfQVJNXztBUk1WNDtfV0lOMzJfV0NFPSQoQ0VWRVIpOyQoQ2VQbGF0Zm9ybSk7VU5ERVJfQ0U9JChDRVZFUik7VU5JQ09ERTtTRExfRVhQT1JUUyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMSIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvciAiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVOREVSX0NFPSQoQ0VWRVIpLF9XSU4zMl9XQ0U9JChDRVZFUiksREVCVUcsVU5JQ09ERSxfVU5JQ09ERSwkKENlUGxhdGZvcm0pLEFSTSxfQVJNXyxBUk1WNCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvQUxJR046NDA5NiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOkFSTSAiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iY29tbWN0cmwubGliIGNvcmVkbGwubGliIHNlY2Noay5saWIgY2NydHJ0dGkubGliIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwuZGxsIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iJChDRU5vRGVmYXVsdExpYikiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwucGRiIgorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjY1NTM2IgorCQkJCVN0YWNrQ29tbWl0U2l6ZT0iNDA5NiIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJfRGxsTWFpbkNSVFN0YXJ0dXAiCisJCQkJQmFzZUFkZHJlc3M9IjB4MDAxMDAwMDAiCisJCQkJSW1wb3J0TGlicmFyeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIlQ1NJRExfV0lORE9XUyUiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9pbmNsdWRlOy4uLy4uL3NyYzsuLi8uLi9zcmMvdmlkZW87Li4vLi4vc3JjL3RocmVhZDsuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWM7Li4vLi4vc3JjL2F1ZGlvOy4uLy4uL3NyYy9jZHJvbTsuLi8uLi9zcmMvdGltZXI7Li4vLi4vc3JjL2pveXN0aWNrOy4uLy4uL3NyYy9ldmVudHM7Li4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbjsuLi8uLi9zcmMvdmlkZW8vZ2FwaTsuLi8uLi9zcmMvdmlkZW8vd2luZGliIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJERUJVRztBUk07X0FSTV87VEhVTUI7X1RIVU1CXztBUk1WNFQ7X1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO1VOREVSX0NFPSQoQ0VWRVIpO1VOSUNPREU7U0RMX0VYUE9SVFMiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJT2JqZWN0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9yICIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iVU5ERVJfQ0U9JChDRVZFUiksX1dJTjMyX1dDRT0kKENFVkVSKSxVTklDT0RFLF9VTklDT0RFLERFQlVHLCQoQ2VQbGF0Zm9ybSksVEhVTUIsX1RIVU1CXyxBUk0sX0FSTV8sQVJNVjRUIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6VEhVTUIgIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLmRsbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiQoQ0VOb0RlZmF1bHRMaWIpIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLnBkYiIKKwkJCQlTdGFja1Jlc2VydmVTaXplPSI2NTUzNiIKKwkJCQlTdGFja0NvbW1pdFNpemU9IjQwOTYiCisJCQkJRW50cnlQb2ludFN5bWJvbD0iX0RsbE1haW5DUlRTdGFydHVwIgorCQkJCUJhc2VBZGRyZXNzPSIweDAwMTAwMDAwIgorCQkJCUltcG9ydExpYnJhcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC5ic2MiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxEZXBsb3ltZW50VG9vbAorCQkJCUZvcmNlRGlydHk9Ii0xIgorCQkJCVJlbW90ZURpcmVjdG9yeT0iJUNTSURMX1dJTkRPV1MlIgorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIgorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iNCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9pbmNsdWRlLC4uLy4uL3NyYywuLi8uLi9zcmMvdmlkZW8sLi4vLi4vc3JjL3RocmVhZCwuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMsLi4vLi4vc3JjL2F1ZGlvLC4uLy4uL3NyYy9jZHJvbSwuLi8uLi9zcmMvdGltZXIsLi4vLi4vc3JjL2pveXN0aWNrLC4uLy4uL3NyYy9ldmVudHMsLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iQVJNO19BUk1fO0FSTVY0O05ERUJVRztfV0lOMzJfV0NFPSQoQ0VWRVIpOyQoQ2VQbGF0Zm9ybSk7VU5ERVJfQ0U9JChDRVZFUik7VU5JQ09ERTtTRExfRVhQT1JUUyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMCIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlPYmplY3RGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9yICIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iVU5ERVJfQ0U9JChDRVZFUiksX1dJTjMyX1dDRT0kKENFVkVSKSxOREVCVUcsVU5JQ09ERSxfVU5JQ09ERSwkKENlUGxhdGZvcm0pLEFSTSxfQVJNXyxBUk1WNCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvQUxJR046NDA5NiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOkFSTSAiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iY29tbWN0cmwubGliIGNvcmVkbGwubGliIHNlY2Noay5saWIgY2NydHJ0dGkubGliIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwuZGxsIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iJChDRU5vRGVmYXVsdExpYikiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC5wZGIiCisJCQkJU3RhY2tSZXNlcnZlU2l6ZT0iNjU1MzYiCisJCQkJU3RhY2tDb21taXRTaXplPSI0MDk2IgorCQkJCUVudHJ5UG9pbnRTeW1ib2w9Il9EbGxNYWluQ1JUU3RhcnR1cCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgwMDEwMDAwMCIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwuYnNjIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiIKKwkJCS8+CisJCQk8RGVidWdnZXJUb29sCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iMiIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9InRydWUiCisJCQkJRmF2b3JTaXplT3JTcGVlZD0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9pbmNsdWRlLC4uLy4uL3NyYywuLi8uLi9zcmMvdmlkZW8sLi4vLi4vc3JjL3RocmVhZCwuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWMsLi4vLi4vc3JjL2F1ZGlvLC4uLy4uL3NyYy9jZHJvbSwuLi8uLi9zcmMvdGltZXIsLi4vLi4vc3JjL2pveXN0aWNrLC4uLy4uL3NyYy9ldmVudHMsLi4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbiwuLi8uLi9zcmMvdmlkZW8vd2luZGliLC4uLy4uL3NyYy92aWRlby9nYXBpIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJBUk07X0FSTV87QVJNVjQ7TkRFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7JChDZVBsYXRmb3JtKTtVTkRFUl9DRT0kKENFVkVSKTtVTklDT0RFO1NETF9FWFBPUlRTIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjAiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJT2JqZWN0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvciAiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVOREVSX0NFPSQoQ0VWRVIpLF9XSU4zMl9XQ0U9JChDRVZFUiksTkRFQlVHLFVOSUNPREUsX1VOSUNPREUsJChDZVBsYXRmb3JtKSxBUk0sX0FSTV8sQVJNVjQiCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL0FMSUdOOjQwOTYgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpBUk0gIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiBzZWNjaGsubGliIGNjcnRydHRpLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLmRsbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiQoQ0VOb0RlZmF1bHRMaWIpIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwucGRiIgorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjY1NTM2IgorCQkJCVN0YWNrQ29tbWl0U2l6ZT0iNDA5NiIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJfRGxsTWFpbkNSVFN0YXJ0dXAiCisJCQkJQmFzZUFkZHJlc3M9IjB4MDAxMDAwMDAiCisJCQkJSW1wb3J0TGlicmFyeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIlQ1NJRExfV0lORE9XUyUiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSIyIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIgorCQkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0idHJ1ZSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9pbmNsdWRlOy4uLy4uL3NyYzsuLi8uLi9zcmMvdmlkZW87Li4vLi4vc3JjL3RocmVhZDsuLi8uLi9zcmMvdGhyZWFkL2dlbmVyaWM7Li4vLi4vc3JjL2F1ZGlvOy4uLy4uL3NyYy9jZHJvbTsuLi8uLi9zcmMvdGltZXI7Li4vLi4vc3JjL2pveXN0aWNrOy4uLy4uL3NyYy9ldmVudHM7Li4vLi4vc3JjL3ZpZGVvL3dpbmNvbW1vbjsuLi8uLi9zcmMvdmlkZW8vZ2FwaTsuLi8uLi9zcmMvdmlkZW8vd2luZGliIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJERUJVRztBUk07X0FSTV87VEhVTUI7X1RIVU1CXztBUk1WNFQ7X1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO1VOREVSX0NFPSQoQ0VWRVIpO1VOSUNPREU7U0RMX0VYUE9SVFMiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMCIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TREwucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlPYmplY3RGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9yICIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iVU5ERVJfQ0U9JChDRVZFUiksX1dJTjMyX1dDRT0kKENFVkVSKSxVTklDT0RFLF9VTklDT0RFLE5ERUJVRywkKENlUGxhdGZvcm0pLFRIVU1CLF9USFVNQl8sQVJNLF9BUk1fLEFSTVY0VCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlRIVU1CICIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJjb21tY3RybC5saWIgY29yZWRsbC5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC5kbGwiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIkKENFTm9EZWZhdWx0TGliKSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLnBkYiIKKwkJCQlTdGFja1Jlc2VydmVTaXplPSI2NTUzNiIKKwkJCQlTdGFja0NvbW1pdFNpemU9IjQwOTYiCisJCQkJTGlua1RpbWVDb2RlR2VuZXJhdGlvbj0iMSIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJfRGxsTWFpbkNSVFN0YXJ0dXAiCisJCQkJQmFzZUFkZHJlc3M9IjB4MDAxMDAwMDAiCisJCQkJSW1wb3J0TGlicmFyeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIlQ1NJRExfV0lORE9XUyUiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xTREwuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xldmVudHNcU0RMX2FjdGl2ZS5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpby5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2N2dC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb2Rldi5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0LmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXRfMC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9ibGl0XzEuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdF9BLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX2JsaXRfTi5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9ibXAuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xjcHVpbmZvXFNETF9jcHVpbmZvLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX2N1cnNvci5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXHdpbmRpYlxTRExfZGliYXVkaW8uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5kaWJcU0RMX2RpYmV2ZW50cy5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXHdpbmRpYlxTRExfZGlidmlkZW8uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xkaXNrXFNETF9kaXNrYXVkaW8uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXGR1bW15XFNETF9kdW1teWF1ZGlvLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xTRExfZXJyb3IuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xldmVudHNcU0RMX2V2ZW50cy5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGV2ZW50c1xTRExfZXhwb3NlLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX2dhbW1hLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cZ2FwaVxzZGxfZ2FwaXZpZGVvLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcc3RkbGliXFNETF9nZXRlbnYuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHN0ZGxpYlxTRExfaWNvbnYuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGpveXN0aWNrXFNETF9qb3lzdGljay5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9rZXlib2FyZC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHN0ZGxpYlxTRExfbWFsbG9jLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXIuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xTRExfbWl4ZXJfTU1YX1ZDLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9tb3VzZS5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXGR1bW15XFNETF9udWxsZXZlbnRzLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbG1vdXNlLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfcGl4ZWxzLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcc3RkbGliXFNETF9xc29ydC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9xdWl0LmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9yZXNpemUuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfUkxFYWNjZWwuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xmaWxlXFNETF9yd29wcy5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9zdHJldGNoLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcc3RkbGliXFNETF9zdHJpbmcuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9zdXJmYWNlLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcY2Ryb21cZHVtbXlcU0RMX3N5c2Nkcm9tLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c2NvbmQuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c2V2ZW50cy5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGpveXN0aWNrXGR1bW15XFNETF9zeXNqb3lzdGljay5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGxvYWRzb1x3aW4zMlxTRExfc3lzbG9hZHNvLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX3N5c21vdXNlLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXNtdXRleC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHRocmVhZFx3aW4zMlxTRExfc3lzc2VtLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXHdpbjMyXFNETF9zeXN0aHJlYWQuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aW1lclx3aW5jZVxTRExfc3lzdGltZXIuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfc3lzd20uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aHJlYWRcU0RMX3RocmVhZC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHRpbWVyXFNETF90aW1lci5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF92aWRlby5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXFNETF93YXZlLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF93aW5nbC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF95dXYuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfeXV2X21teC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF95dXZfc3cuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXGJsYW5rX2N1cnNvci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXGRlZmF1bHRfY3Vyc29yLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xoZXJtZXNcSGVhZE1NWC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcaGVybWVzXEhlYWRYODYuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXG1teC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXFNETF9hdWRpb19jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xTRExfYXVkaW9kZXZfYy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcYXVkaW9cU0RMX2F1ZGlvbWVtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfYmxpdC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETF9jb3B5aW5nLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9jdXJzb3JfYy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcYXVkaW9cd2luZGliXFNETF9kaWJhdWRpby5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJldmVudHNfYy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF9kaWJ2aWRlby5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcYXVkaW9cZGlza1xTRExfZGlza2F1ZGlvLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xkdW1teVxTRExfZHVtbXlhdWRpby5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXFNETF9lcnJvcl9jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9ldmVudHNfYy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcU0RMX2ZhdGFsLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xnYXBpXHNkbF9nYXBpdmlkZW8uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfZ2xmdW5jcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcam95c3RpY2tcU0RMX2pveXN0aWNrX2MuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfbGVha3MuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cU0RMX2xvd3ZpZGVvLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9tZW1vcHMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVguaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGF1ZGlvXFNETF9taXhlcl9NTVhfVkMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfbmFtZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxldmVudHNfYy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cZHVtbXlcU0RMX251bGxtb3VzZV9jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xkdW1teVxTRExfbnVsbHZpZGVvLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGluY2x1ZGVcU0RMX29wZW5nbC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX3BpeGVsc19jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9STEVhY2NlbF9jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfc3RyZXRjaF9jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xhdWRpb1xTRExfc3lzYXVkaW8uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGNkcm9tXFNETF9zeXNjZHJvbS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c2NvbmRfYy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZXZlbnRzXFNETF9zeXNldmVudHMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXGpveXN0aWNrXFNETF9zeXNqb3lzdGljay5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXNtb3VzZV9jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aHJlYWRcZ2VuZXJpY1xTRExfc3lzbXV0ZXhfYy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3NlbV9jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aHJlYWRcU0RMX3N5c3RocmVhZC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXGdlbmVyaWNcU0RMX3N5c3RocmVhZF9jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aHJlYWRcd2luMzJcU0RMX3N5c3RocmVhZF9jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x0aW1lclxTRExfc3lzdGltZXIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXFNETF9zeXN2aWRlby5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luY29tbW9uXFNETF9zeXN3bV9jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGhyZWFkXFNETF90aHJlYWRfYy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdGltZXJcU0RMX3RpbWVyX2MuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cd2luZGliXFNETF92a2V5cy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcYXVkaW9cU0RMX3dhdmUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHZpZGVvXHdpbmNvbW1vblxTRExfd2luZ2xfYy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcdmlkZW9cU0RMX3l1dl9zd19jLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1xTRExfeXV2ZnVuY3MuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXHRocmVhZFx3aW4zMlx3aW5fY2Vfc2VtYXBob3JlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1x2aWRlb1x3aW5jb21tb25cd21tc2cuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgorCQkJPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS9TRExNYWluL1NETG1haW4udmNwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL1NETE1haW4vU0RMbWFpbi52Y3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkZTc3OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS9TRExNYWluL1NETG1haW4udmNwCkBAIC0wLDAgKzEsMTY1MyBAQAorIyBNaWNyb3NvZnQgZU1iZWRkZWQgVmlzdWFsIFRvb2xzIFByb2plY3QgRmlsZSAtIE5hbWU9IlNETG1haW4iIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBUb29scyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMgorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIHg4NikgU3RhdGljIExpYnJhcnkiIDB4ODMwNAorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBNSVBTKSBTdGF0aWMgTGlicmFyeSIgMHg4MjA0CisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIE1JUFMxNikgU3RhdGljIExpYnJhcnkiIDB4ODkwNAorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBTSDQpIFN0YXRpYyBMaWJyYXJ5IiAweDg2MDQKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgTUlQU0lJKSBTdGF0aWMgTGlicmFyeSIgMHhhMTA0CisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIE1JUFNJVl9GUCkgU3RhdGljIExpYnJhcnkiIDB4OTIwNAorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBBUk0pIFN0YXRpYyBMaWJyYXJ5IiAweDg1MDQKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgU0gzKSBTdGF0aWMgTGlicmFyeSIgMHg4MTA0CisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIEFSTVY0KSBTdGF0aWMgTGlicmFyeSIgMHhhMzA0CisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIEFSTVY0SSkgU3RhdGljIExpYnJhcnkiIDB4YTUwNAorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBlbXVsYXRvcikgU3RhdGljIExpYnJhcnkiIDB4YTYwNAorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBNSVBTSUlfRlApIFN0YXRpYyBMaWJyYXJ5IiAweGEyMDQKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgQVJNVjRUKSBTdGF0aWMgTGlicmFyeSIgMHhhNDA0CisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIE1JUFNJVikgU3RhdGljIExpYnJhcnkiIDB4OTYwNAorCitDRkc9U0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZworIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJTRExtYWluLnZjbiIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiU0RMbWFpbi52Y24iIENGRz0iU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBNSVBTSUlfRlApIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgTUlQU0lJX0ZQKSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lJKSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgTUlQU0lJKSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFNJSSkgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIFNINCkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIFNINCkgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIFNINCkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBTSDQpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBTSDMpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgU0gzKSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lWKSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgTUlQU0lWKSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFNJVikgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgZW11bGF0b3IpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBlbXVsYXRvcikgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTVY0SSkgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNEkpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBNSVBTSVZfRlApIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgTUlQU0lWX0ZQKSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNCkgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTVY0KSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQUzE2KSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgTUlQUzE2KSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFMxNikgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0VCkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTVY0VCkgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNFQpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSB4ODYpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFICJTRExtYWluIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgeDg2KSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTSkgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTSkgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgTUlQUykgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBNSVBTKSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKKyMgUFJPUCBBVExfUHJvamVjdCAyCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIk1JUFNJSV9GUFJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJSV9GUFJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q4QUM4NTZDLUIyMTMtNDg5NS05RTgzLTlFQzUxQTU1MjAxRX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiTUlQU0lJX0ZQUmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJSV9GUFJlbCIKKyMgUFJPUCBDUFVfSUQgIntEOEFDODU2Qy1CMjEzLTQ4OTUtOUU4My05RUM1MUE1NTIwMUV9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiUjQwMDAiIC9EICJNSVBTSUkiIC9EICJNSVBTSUlfRlAiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL1lYIC9RTW1pcHMyIC9RTUZQRS0gL08yIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PeHQgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiUjQwMDAiIC9EICJNSVBTSUkiIC9EICJNSVBTSUlfRlAiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL1FNbWlwczIgL1FNRlBFLSAvTSQoQ0VDcnRNVCkgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTUlQU0lJX0ZQRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lJX0ZQRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDhBQzg1NkMtQjIxMy00ODk1LTlFODMtOUVDNTFBNTUyMDFFfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJNSVBTSUlfRlBEYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0lJX0ZQRGJnIgorIyBQUk9QIENQVV9JRCAie0Q4QUM4NTZDLUIyMTMtNDg5NS05RTgzLTlFQzUxQTU1MjAxRX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0NQUD1jbG1pcHMuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiUjQwMDAiIC9EICJNSVBTSUkiIC9EICJNSVBTSUlfRlAiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX0xJQiIgL1lYIC9RTW1pcHMyIC9RTUZQRS0gL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIlI0MDAwIiAvRCAiTUlQU0lJIiAvRCAiTUlQU0lJX0ZQIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9MSUIiIC9RTW1pcHMyIC9RTUZQRS0gL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSUkpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTSUlSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSUlSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIns2ODlEREM2NC05RDlELTExRDUtOTZGOC0wMDIwNzgwMkMwMUN9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNJSVJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSUlSZWwiCisjIFBST1AgQ1BVX0lEICJ7Njg5RERDNjQtOUQ5RC0xMUQ1LTk2RjgtMDAyMDc4MDJDMDFDfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsbWlwcy5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIlI0MDAwIiAvRCAiTUlQU0lJIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL0QgIl9MSUIiIC9ZWCAvUU1taXBzMiAvUU1GUEUgL08yIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PeHQgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiUjQwMDAiIC9EICJNSVBTSUkiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL1FNbWlwczIgL1FNRlBFIC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTSUlEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSUlEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIns2ODlEREM2NC05RDlELTExRDUtOTZGOC0wMDIwNzgwMkMwMUN9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNJSURiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSUlEYmciCisjIFBST1AgQ1BVX0lEICJ7Njg5RERDNjQtOUQ5RC0xMUQ1LTk2RjgtMDAyMDc4MDJDMDFDfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsbWlwcy5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJSNDAwMCIgL0QgIk1JUFNJSSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvWVggL1FNbWlwczIgL1FNRlBFIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJSNDAwMCIgL0QgIk1JUFNJSSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvUU1taXBzMiAvUU1GUEUgL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJTSDRSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJTSDRSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAyMS03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlNINFJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJTSDRSZWwiCisjIFBST1AgQ1BVX0lEICJ7RDY1MTkwMjEtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPXNoY2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvTzIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJTSHgiIC9EICJTSDQiIC9EICJfU0g0XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJfTElCIiAvWVggL1FzaDQgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL08yIC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiU0h4IiAvRCAiU0g0IiAvRCAiX1NINF8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL094dCAvUXNoNCAvTSQoQ0VDcnRNVCkgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiU0g0RGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiU0g0RGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MTkwMjEtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJTSDREYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiU0g0RGJnIgorIyBQUk9QIENQVV9JRCAie0Q2NTE5MDIxLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0NQUD1zaGNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiU0h4IiAvRCAiU0g0IiAvRCAiX1NINF8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX0xJQiIgL1lYIC9Rc2g0IC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlNIeCIgL0QgIlNINCIgL0QgIl9TSDRfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9MSUIiIC9Rc2g0IC9NJChDRUNydE1URGVidWcpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK0xJQjMyPWxpbmsuZXhlIC1saWIKKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbworIyBBREQgTElCMzIgL25vbG9nbworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiU0gzUmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiU0gzUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MTkwMjAtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJTSDNSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiU0gzUmVsIgorIyBQUk9QIENQVV9JRCAie0Q2NTE5MDIwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0NQUD1zaGNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL08yIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiU0h4IiAvRCAiU0gzIiAvRCAiX1NIM18iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL1lYIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvT2IxIC9JICIuLi8uLi9pbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlNIeCIgL0QgIlNIMyIgL0QgIl9TSDNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL0QgIl9MSUIiIC9PeHQgL00kKENFQ3J0TVQpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK0xJQjMyPWxpbmsuZXhlIC1saWIKKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbworIyBBREQgTElCMzIgL25vbG9nbworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlNIM0RiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlNIM0RiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE5MDIwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiU0gzRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlNIM0RiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAyMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9c2hjbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlNIeCIgL0QgIlNIMyIgL0QgIl9TSDNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9MSUIiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJTSHgiIC9EICJTSDMiIC9EICJfU0gzXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIk1JUFNJVlJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJVlJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAiezBCMkZFNTI0LTI2QzUtNDE5NC04Q0VGLUIxNTgyREVCNUE5OH0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiTUlQU0lWUmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJVlJlbCIKKyMgUFJPUCBDUFVfSUQgInswQjJGRTUyNC0yNkM1LTQxOTQtOENFRi1CMTU4MkRFQjVBOTh9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiX01JUFM2NCIgL0QgIlI0MDAwIiAvRCAiTUlQU0lWIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL0QgIl9MSUIiIC9ZWCAvUU1taXBzNCAvUU1uMzIgL1FNRlBFIC9PMiAvTSQoQ0VDcnRNVCkgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvT3h0IC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIl9NSVBTNjQiIC9EICJSNDAwMCIgL0QgIk1JUFNJViIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJfTElCIiAvUU1taXBzNCAvUU1uMzIgL1FNRlBFIC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTSVZEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSVZEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgInswQjJGRTUyNC0yNkM1LTQxOTQtOENFRi1CMTU4MkRFQjVBOTh9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNJVkRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTSVZEYmciCisjIFBST1AgQ1BVX0lEICJ7MEIyRkU1MjQtMjZDNS00MTk0LThDRUYtQjE1ODJERUI1QTk4fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsbWlwcy5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJfTUlQUzY0IiAvRCAiUjQwMDAiIC9EICJNSVBTSVYiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX0xJQiIgL1lYIC9RTW1pcHM0IC9RTW4zMiAvUU1GUEUgL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIl9NSVBTNjQiIC9EICJSNDAwMCIgL0QgIk1JUFNJViIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvUU1taXBzNCAvUU1uMzIgL1FNRlBFIC9NJChDRUNydE1URGVidWcpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK0xJQjMyPWxpbmsuZXhlIC1saWIKKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbworIyBBREQgTElCMzIgL25vbG9nbworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJlbXVsYXRvclJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImVtdWxhdG9yUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7MzJFNTIwMDMtNDAzRS00NDJELUJFNDgtREUxMEY4QzYxMzFEfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJlbXVsYXRvclJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJlbXVsYXRvclJlbCIKKyMgUFJPUCBDUFVfSUQgInszMkU1MjAwMy00MDNFLTQ0MkQtQkU0OC1ERTEwRjhDNjEzMUR9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9Y2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL0QgIl9MSUIiIC9ZWCAvR3M4MTkyIC9HRiAvTzIgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvT3h0IC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL0dzODE5MiAvR0YgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7MzJFNTIwMDMtNDAzRS00NDJELUJFNDgtREUxMEY4QzYxMzFEfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBDUFVfSUQgInszMkU1MjAwMy00MDNFLTQ0MkQtQkU0OC1ERTEwRjhDNjEzMUR9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9Y2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJfaTM4Nl8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9EICJfTElCIiAvWVggL0dzODE5MiAvR0YgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiX0xJQiIgL0dzODE5MiAvR0YgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBBUk1WNEkpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1WNElSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNElSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntEQzcwRjQzMC1FNzhCLTQ5NEYtQTlENS02MkFEQzU2NDQzQjh9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVY0SVJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNElSZWwiCisjIFBST1AgQ1BVX0lEICJ7REM3MEY0MzAtRTc4Qi00OTRGLUE5RDUtNjJBREM1NjQ0M0I4fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsYXJtLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTVY0SSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJfTElCIiAvWVggL1FSYXJjaDRUIC9RUmludGVyd29yay1yZXR1cm4gL08yIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PeHQgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTVY0SSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9EICJfTElCIiAvUVJhcmNoNFQgL1FSaW50ZXJ3b3JrLXJldHVybiAvTSQoQ0VDcnRNVCkgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiQVJNVjRJRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjRJRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7REM3MEY0MzAtRTc4Qi00OTRGLUE5RDUtNjJBREM1NjQ0M0I4fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJBUk1WNElEYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjRJRGJnIgorIyBQUk9QIENQVV9JRCAie0RDNzBGNDMwLUU3OEItNDk0Ri1BOUQ1LTYyQURDNTY0NDNCOH0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0NQUD1jbGFybS5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNVjRJIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9MSUIiIC9ZWCAvUVJhcmNoNFQgL1FSaW50ZXJ3b3JrLXJldHVybiAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTVY0SSIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvUVJhcmNoNFQgL1FSaW50ZXJ3b3JrLXJldHVybiAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIk1JUFNJVl9GUFJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJVl9GUFJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAiezA0NkE0MzBELTc3NzAtNDhBQi04OUI1LTI0QzJEMzAwQjAzRn0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiTUlQU0lWX0ZQUmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJVl9GUFJlbCIKKyMgUFJPUCBDUFVfSUQgInswNDZBNDMwRC03NzcwLTQ4QUItODlCNS0yNEMyRDMwMEIwM0Z9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCAiX01JUFM2NCIgL0QgIlI0MDAwIiAvRCAiTUlQU0lWIiAvRCAiTUlQU0lWX0ZQIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL0QgIl9MSUIiIC9ZWCAvUU1taXBzNCAvUU1uMzIgL1FNRlBFLSAvTzIgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL094dCAvT2IyIC9JICIuLi8uLi9pbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJfTUlQUzY0IiAvRCAiUjQwMDAiIC9EICJNSVBTSVYiIC9EICJNSVBTSVZfRlAiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL1FNbWlwczQgL1FNbjMyIC9RTUZQRS0gL00kKENFQ3J0TVQpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK0xJQjMyPWxpbmsuZXhlIC1saWIKKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbworIyBBREQgTElCMzIgL25vbG9nbworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lWX0ZQKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIk1JUFNJVl9GUERiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJVl9GUERiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAiezA0NkE0MzBELTc3NzAtNDhBQi04OUI1LTI0QzJEMzAwQjAzRn0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiTUlQU0lWX0ZQRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIk1JUFNJVl9GUERiZyIKKyMgUFJPUCBDUFVfSUQgInswNDZBNDMwRC03NzcwLTQ4QUItODlCNS0yNEMyRDMwMEIwM0Z9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIl9NSVBTNjQiIC9EICJSNDAwMCIgL0QgIk1JUFNJViIgL0QgIk1JUFNJVl9GUCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvWVggL1FNbWlwczQgL1FNbjMyIC9RTUZQRS0gL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIl9NSVBTNjQiIC9EICJSNDAwMCIgL0QgIk1JUFNJViIgL0QgIk1JUFNJVl9GUCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvUU1taXBzNCAvUU1uMzIgL1FNRlBFLSAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiQVJNVjRSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNFJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0VDQkVBNDNELUNEN0ItNDg1Mi1BRDU1LUQ0MjI3QjVENjI0Qn0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiQVJNVjRSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjRSZWwiCisjIFBST1AgQ1BVX0lEICJ7RUNCRUE0M0QtQ0Q3Qi00ODUyLUFENTUtRDQyMjdCNUQ2MjRCfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsYXJtLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJOREVCVUciIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgIkFSTVY0IiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9MSUIiIC9ZWCAvTzIgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL094dCAvT2IyIC9JICIuLi8uLi9pbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk5ERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX0xJQiIgL00kKENFQ3J0TVQpIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK0xJQjMyPWxpbmsuZXhlIC1saWIKKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbworIyBBREQgTElCMzIgL25vbG9nbworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiQVJNVjREYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNERiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0VDQkVBNDNELUNEN0ItNDg1Mi1BRDU1LUQ0MjI3QjVENjI0Qn0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiQVJNVjREYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjREYmciCisjIFBST1AgQ1BVX0lEICJ7RUNCRUE0M0QtQ0Q3Qi00ODUyLUFENTUtRDQyMjdCNUQ2MjRCfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsYXJtLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICJBUk1WNCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICJBUk1WNCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIk1JUFMxNlJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFMxNlJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE5MDEzLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiTUlQUzE2UmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIk1JUFMxNlJlbCIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAxMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL08yIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIlI0MDAwIiAvRCAiTUlQU0lJIiAvRCAiTUlQUzE2IiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL0QgIl9NSVBTMTZfIiAvRCAiTUlQUzE2U1VQUE9SVCIgL0QgIl9MSUIiIC9ZWCAvUU1taXBzMTYgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL08yIC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgIlI0MDAwIiAvRCAiTUlQU0lJIiAvRCAiTUlQUzE2IiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL0QgIl9NSVBTMTZfIiAvRCAiTUlQUzE2U1VQUE9SVCIgL0QgIl9MSUIiIC9PeHQgL1FNbWlwczE2IC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFMxNikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTMTZEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTMTZEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAxMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFMxNkRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTMTZEYmciCisjIFBST1AgQ1BVX0lEICJ7RDY1MTkwMTMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsbWlwcy5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJSNDAwMCIgL0QgIk1JUFNJSSIgL0QgIk1JUFMxNiIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTUlQUzE2XyIgL0QgIk1JUFMxNlNVUFBPUlQiIC9EICJfTElCIiAvWVggL1FNbWlwczE2IC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EICJSNDAwMCIgL0QgIk1JUFNJSSIgL0QgIk1JUFMxNiIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTUlQUzE2XyIgL0QgIk1JUFMxNlNVUFBPUlQiIC9EICJfTElCIiAvUU1taXBzMTYgL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBBUk1WNFQpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1WNFRSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNFRSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntGNTIzMTZBOS0zQjdDLTRGRTctQTY3Ri02ODM1MEI0MTI0MER9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVY0VFJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNFRSZWwiCisjIFBST1AgQ1BVX0lEICJ7RjUyMzE2QTktM0I3Qy00RkU3LUE2N0YtNjgzNTBCNDEyNDBEfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsdGh1bWIuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVEhVTUIiIC9EICJfVEhVTUJfIiAvRCAiQVJNVjRUIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL0QgIl9MSUIiIC9ZWCAvUVJhcmNoNFQgL1FSaW50ZXJ3b3JrLXJldHVybiAvTzIgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL094dCAvT2IyIC9JICIuLi8uLi9pbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVEhVTUIiIC9EICJfVEhVTUJfIiAvRCAiQVJNVjRUIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL0QgIl9MSUIiIC9RUmFyY2g0VCAvUVJpbnRlcndvcmstcmV0dXJuIC9NJChDRUNydE1UKSAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0VCkgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1WNFREYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNFREYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntGNTIzMTZBOS0zQjdDLTRGRTctQTY3Ri02ODM1MEI0MTI0MER9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVY0VERiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNFREYmciCisjIFBST1AgQ1BVX0lEICJ7RjUyMzE2QTktM0I3Qy00RkU3LUE2N0YtNjgzNTBCNDEyNDBEfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsdGh1bWIuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlRIVU1CIiAvRCAiX1RIVU1CXyIgL0QgIkFSTVY0VCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfTElCIiAvWVggL1FSYXJjaDRUIC9RUmludGVyd29yay1yZXR1cm4gL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJUSFVNQiIgL0QgIl9USFVNQl8iIC9EICJBUk1WNFQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX0xJQiIgL1FSYXJjaDRUIC9RUmludGVyd29yay1yZXR1cm4gL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgU1VCVFJBQ1QgQ1BQIC9ZWAorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJYODZSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJYODZSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlg4NlJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJYODZSZWwiCisjIFBST1AgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL08yIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL1lYIC9HczgxOTIgL0dGIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL08yIC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL0dzODE5MiAvT3h0IC9HRiAvYworIyBTVUJUUkFDVCBDUFAgL1lYCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJYODZEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJYODZEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIlg4NkRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJYODZEYmciCisjIFBST1AgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiX0xJQiIgL1lYIC9HczgxOTIgL0dGIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIl9MSUIiIC9HczgxOTIgL0dGIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK0xJQjMyPWxpbmsuZXhlIC1saWIKKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbworIyBBREQgTElCMzIgL25vbG9nbworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTURiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTURiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE4RkYzLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiQVJNRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTURiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOEZGMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9HczgxOTIgL0dGIC9jCisjIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9EICJERUJVRyIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9HczgxOTIgL0dGIC9jCisjIFNVQlRSQUNUIENQUCAvWVgKK0xJQjMyPWxpbmsuZXhlIC1saWIKKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbworIyBBREQgTElCMzIgL25vbG9nbworQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiQVJNUmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRkMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJBUk1SZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiQVJNUmVsIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkZDLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0NQUD1jbGFybS5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTkRFQlVHIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL094cyAvTSQoQ0VDcnRNVCkgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvTzIgL09iMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJOREVCVUciIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvT3hzIC9NJChDRUNydE1UKSAvYworTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIk1JUFNEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNSVBTRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MTkwMTAtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJNSVBTRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIk1JUFNEYmciCisjIFBST1AgQ1BVX0lEICJ7RDY1MTkwMTAtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorQ1BQPWNsbWlwcy5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvRCAiREVCVUciIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTUlQU1JlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFNSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAxMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTUlQU1JlbCIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAxMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL1lYIC9PeHMgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL08yIC9PYjIgL0kgIi4uLy4uL2luY2x1ZGUiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvT3hzIC9NJChDRUNydE1UKSAvYworTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCisKKyFFTkRJRiAKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSUlfRlApIFJlbGVhc2UiCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJSV9GUCkgRGVidWciCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKyMgTmFtZSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lJKSBEZWJ1ZyIKKyMgTmFtZSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgU0g0KSBSZWxlYXNlIgorIyBOYW1lICJTRExtYWluIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorIyBOYW1lICJTRExtYWluIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKyMgTmFtZSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lWKSBEZWJ1ZyIKKyMgTmFtZSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKyMgTmFtZSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNVjRJKSBSZWxlYXNlIgorIyBOYW1lICJTRExtYWluIC0gV2luMzIgKFdDRSBBUk1WNEkpIERlYnVnIgorIyBOYW1lICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJVl9GUCkgRGVidWciCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorIyBOYW1lICJTRExtYWluIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFMxNikgUmVsZWFzZSIKKyMgTmFtZSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQUzE2KSBEZWJ1ZyIKKyMgTmFtZSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorIyBOYW1lICJTRExtYWluIC0gV2luMzIgKFdDRSBBUk1WNFQpIERlYnVnIgorIyBOYW1lICJTRExtYWluIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKyMgTmFtZSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisjIE5hbWUgIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNyY1xtYWluXHdpbjMyXFNETF93aW4zMl9tYWluLmMKKworIUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQU0lJX0ZQKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJSSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJSSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBTSDQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBTSDQpIERlYnVnIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJVikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFNJVikgRGVidWciCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0SSkgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIEFSTVY0SSkgRGVidWciCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTSVZfRlApIERlYnVnIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTMTYpIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBNSVBTMTYpIERlYnVnIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNVjRUKSBSZWxlYXNlIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgQVJNVjRUKSBEZWJ1ZyIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJTRExtYWluIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfU0RMX1c9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNETG1haW4gLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1NETF9XPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZ2V0ZW52LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0RMbWFpbiAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9TRExfVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwl7JChJTkNMVURFKX0iLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJeyQoSU5DTFVERSl9Ii4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCXskKElOQ0xVREUpfSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5caW5jbHVkZVxTRExfbWFpbi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL1NETE1haW4vU0RMbWFpbi52Y3Byb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvU0RMTWFpbi9TRExtYWluLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjgxY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL1NETE1haW4vU0RMbWFpbi52Y3Byb2oKQEAgLTAsMCArMSw2MDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IndpbmRvd3MtMTI1MSI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LDAwIgorCU5hbWU9IlNETG1haW4iCisJUHJvamVjdEdVSUQ9Ins1QUM4OEI4NC01RUFBLTRDMUUtOTQ4RC0zMzJEQTM0MjI3RjZ9IgorCVJvb3ROYW1lc3BhY2U9IlNETG1haW4iCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCS8+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJLz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETG1haW4udGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vaW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iREVCVUc7X1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO0FSTTtfQVJNXztBUk1WNDtVTkRFUl9DRT0kKENFVkVSKTtVTklDT0RFO19MSUIiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMbWFpbi5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUN1bHR1cmU9IjEwNDkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpXFNETG1haW4ubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETG1haW4uYnNjIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiIKKwkJCS8+CisJCQk8RGVidWdnZXJUb29sCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETG1haW4udGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vaW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iREVCVUc7X1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO0FSTTtfQVJNXztBUk1WNDtVTkRFUl9DRT0kKENFVkVSKTtVTklDT0RFO19MSUIiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMbWFpbi5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUN1bHR1cmU9IjEwNDkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpXFNETG1haW4ubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETG1haW4uYnNjIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiIKKwkJCS8+CisJCQk8RGVidWdnZXJUb29sCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TRExtYWluLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL2luY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkRFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7QVJNO19BUk1fOyQoQ2VQbGF0Zm9ybSk7VEhVTUI7X1RIVU1CXztBUk1WNFQ7VU5ERVJfQ0U9JChDRVZFUik7VU5JQ09ERTtfTElCIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETG1haW4ucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlPYmplY3RGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlDdWx0dXJlPSIxMDQ5IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKVxTRExtYWluLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TRExtYWluLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TRExtYWluLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSI0IgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL2luY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7JChDZVBsYXRmb3JtKTtOREVCVUc7QVJNO19BUk1fO0FSTVY0O1VOREVSX0NFPSQoQ0VWRVIpO1VOSUNPREU7X0xJQiIKKwkJCQlSdW50aW1lTGlicmFyeT0iMCIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TRExtYWluLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJT2JqZWN0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUN1bHR1cmU9IjEwNDkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpXFNETG1haW4ubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL1NETG1haW4uYnNjIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiIKKwkJCS8+CisJCQk8RGVidWdnZXJUb29sCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMbWFpbi50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iNCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9pbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpOyQoQ2VQbGF0Zm9ybSk7TkRFQlVHO0FSTTtfQVJNXztBUk1WNDtVTkRFUl9DRT0kKENFVkVSKTtVTklDT0RFO19MSUIiCisJCQkJUnVudGltZUxpYnJhcnk9IjAiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMbWFpbi5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlDdWx0dXJlPSIxMDQ5IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKVxTRExtYWluLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TRExtYWluLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TRExtYWluLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSIyIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIgorCQkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0idHJ1ZSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9pbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0NFPSQoQ0VWRVIpO0FSTTtfQVJNXzskKENlUGxhdGZvcm0pO1RIVU1CO19USFVNQl87QVJNVjRUO1VOREVSX0NFPSQoQ0VWRVIpO1VOSUNPREU7TkRFQlVHO19MSUIiCisJCQkJUnVudGltZUxpYnJhcnk9IjAiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvU0RMbWFpbi5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlDdWx0dXJlPSIxMDQ5IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKVxTRExtYWluLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS9TRExtYWluLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xtYWluXHdpbjMyXFNETF93aW4zMl9tYWluLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS9sb29wd2F2ZS9sb29wd2F2ZS52Y3AgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvbG9vcHdhdmUvbG9vcHdhdmUudmNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODZhNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvbG9vcHdhdmUvbG9vcHdhdmUudmNwCkBAIC0wLDAgKzEsNTYyIEBACisjIE1pY3Jvc29mdCBlTWJlZGRlZCBWaXN1YWwgVG9vbHMgUHJvamVjdCBGaWxlIC0gTmFtZT0ibG9vcHdhdmUiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBUb29scyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMgorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIHg4NikgQXBwbGljYXRpb24iIDB4ODMwMQorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBBUk0pIEFwcGxpY2F0aW9uIiAweDg1MDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgQVJNVjQpIEFwcGxpY2F0aW9uIiAweGEzMDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgeDg2ZW0pIEFwcGxpY2F0aW9uIiAweDdmMDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgZW11bGF0b3IpIEFwcGxpY2F0aW9uIiAweGE2MDEKKworQ0ZHPWxvb3B3YXZlIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAibG9vcHdhdmUudmNuIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJsb29wd2F2ZS52Y24iIENGRz0ibG9vcHdhdmUgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBlbXVsYXRvcikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImxvb3B3YXZlIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBlbXVsYXRvcikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImxvb3B3YXZlIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTVY0KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTVY0KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTSkgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImxvb3B3YXZlIC0gV2luMzIgKFdDRSB4ODZlbSkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIHg4NmVtKSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk0pIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSB4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorIyBQUk9QIEFUTF9Qcm9qZWN0IDIKKworIUlGICAiJChDRkcpIiA9PSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJlbXVsYXRvclJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAiezMyRTUyMDAzLTQwM0UtNDQyRC1CRTQ4LURFMTBGOEM2MTMxRH0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgQ1BVX0lEICJ7MzJFNTIwMDMtNDAzRS00NDJELUJFNDgtREUxMEY4QzYxMzFEfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCitDUFA9Y2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9PMiAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9JICIuLlwuLlxpbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9PMiAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorCishRUxTRUlGICAiJChDRkcpIiA9PSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZW11bGF0b3JEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgInszMkU1MjAwMy00MDNFLTQ0MkQtQkU0OC1ERTEwRjhDNjEzMUR9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIENQVV9JRCAiezMyRTUyMDAzLTQwM0UtNDQyRC1CRTQ4LURFMTBGOEM2MTMxRH0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICIkKENlUGxhdGZvcm0pIiAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKK0NQUD1jbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL1lYIC9HczgxOTIgL0dGIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIkRFQlVHIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL1lYIC9HczgxOTIgL0dGIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxvb3B3YXZlIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTVY0UmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjRSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntFQ0JFQTQzRC1DRDdCLTQ4NTItQUQ1NS1ENDIyN0I1RDYyNEJ9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVY0UmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0UmVsIgorIyBQUk9QIENQVV9JRCAie0VDQkVBNDNELUNEN0ItNDg1Mi1BRDU1LUQ0MjI3QjVENjI0Qn0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiTkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjQiIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJOREVCVUciIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9kICJBUk1WNCIgL3IKK0NQUD1jbGFybS5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICJBUk1WNCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvTzIgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0kgIi4uXC4uXGluY2x1ZGUiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICJBUk1WNCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvTzIgL00kKENFQ3J0TVQpIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorCishRUxTRUlGICAiJChDRkcpIiA9PSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjREYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntFQ0JFQTQzRC1DRDdCLTQ4NTItQUQ1NS1ENDIyN0I1RDYyNEJ9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIENQVV9JRCAie0VDQkVBNDNELUNEN0ItNDg1Mi1BRDU1LUQ0MjI3QjVENjI0Qn0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiREVCVUciIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9kICJBUk1WNCIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjQiIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIkRFQlVHIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICJBUk1WNCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxvb3B3YXZlIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1SZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1SZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGQy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1SZWwiCisjIFBST1AgQ1BVX0lEICJ7RDY1MThGRkMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL1lYIC9PeHMgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL08yIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvWVggL094cyAvTSQoQ0VDcnRNVCkgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisKKyFFTFNFSUYgICIkKENGRykiID09ICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgeDg2ZW0pIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJYODZFTVJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlg4NkVNUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRjQtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJYODZFTVJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJYODZFTVJlbCIKKyMgUFJPUCBDUFVfSUQgIntENjUxOEZGNC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgImk0ODYiIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJpNDg2IiAvcgorQ1BQPWNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIldJTjMyIiAvRCAiU1RSSUNUIiAvRCAiX1dJTjMyX1dDRV9FTVVMQVRJT04iIC9EICJJTlRFUk5BVElPTkFMIiAvRCAiVVNBIiAvRCAiSU5UTE1TR19DT0RFUEFHRSIgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJpNDg2IiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvWVggL0d6IC9PeHMgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiV0lOMzIiIC9EICJTVFJJQ1QiIC9EICJfV0lOMzJfV0NFX0VNVUxBVElPTiIgL0QgIklOVEVSTkFUSU9OQUwiIC9EICJVU0EiIC9EICJJTlRMTVNHX0NPREVQQUdFIiAvRCAiJChDZVBsYXRmb3JtKSIgL0QgImk0ODYiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9EICJOREVCVUciIC9ZWCAvR3ogL094cyAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL3N1YnN5c3RlbTp3aW5kb3dzIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvd2luZG93c2NlOmVtdWxhdGlvbiAvTUFDSElORTpJWDg2CisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL3N1YnN5c3RlbTp3aW5kb3dzIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvd2luZG93c2NlOmVtdWxhdGlvbiAvTUFDSElORTpJWDg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTURiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTURiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE4RkZDLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiQVJNRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTURiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOEZGQy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1gtIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYLSAvWmkgL09kIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorCishRUxTRUlGICAiJChDRkcpIiA9PSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlg4NlJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlg4NlJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE4RkYzLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiWDg2UmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlg4NlJlbCIKKyMgUFJPUCBDUFVfSUQgIntENjUxOEZGMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKK0NQUD1jbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWC0gL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJfaTM4Nl8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiaV8zODZfIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9EICJOREVCVUciIC9ZWCAvR3M4MTkyIC9HRiAvT3hzIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYLSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9PeHMgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxvb3B3YXZlIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiWDg2RGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiWDg2RGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJYODZEYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiWDg2RGJnIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkYzLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKK0NQUD1jbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWC0gL1ppIC9PZCAvRCAiREVCVUciIC9EICJfaTM4Nl8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgImlfMzg2XyIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvWVggL0dzODE5MiAvR0YgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1gtIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL1lYIC9HczgxOTIgL0dGIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImxvb3B3YXZlIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKyMgTmFtZSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKyMgTmFtZSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorIyBOYW1lICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorIyBOYW1lICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorIyBOYW1lICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgeDg2ZW0pIFJlbGVhc2UiCisjIE5hbWUgImxvb3B3YXZlIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorIyBOYW1lICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorIyBOYW1lICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cdGVzdFxsb29wd2F2ZS5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImxvb3B3YXZlIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworREVQX0NQUF9MT09QVz1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCQorTk9ERVBfQ1BQX0xPT1BXPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxvb3B3YXZlIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfTE9PUFc9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkKK05PREVQX0NQUF9MT09QVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKK0RFUF9DUFBfTE9PUFc9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkKK05PREVQX0NQUF9MT09QVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIgorCitERVBfQ1BQX0xPT1BXPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJCitOT0RFUF9DUFBfTE9PUFc9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbmNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworTk9ERVBfQ1BQX0xPT1BXPVwKKwkiLi5cLi5cdGVzdFxTREwuaCJcCisJIi4uXC4uXHRlc3RcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlx0ZXN0XFNETF9jb25maWcuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgeDg2ZW0pIFJlbGVhc2UiCisKK05PREVQX0NQUF9MT09QVz1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCSIuLlwuLlx0ZXN0XFNETF9hdWRpby5oIlwKKwkiLi5cLi5cdGVzdFxTRExfY29uZmlnLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK05PREVQX0NQUF9MT09QVz1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCSIuLlwuLlx0ZXN0XFNETF9hdWRpby5oIlwKKwkiLi5cLi5cdGVzdFxTRExfY29uZmlnLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAibG9vcHdhdmUgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX0xPT1BXPVwKKwkiLi5cLi5cdGVzdFxTREwuaCJcCisJIi4uXC4uXHRlc3RcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlx0ZXN0XFNETF9jb25maWcuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJsb29wd2F2ZSAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworTk9ERVBfQ1BQX0xPT1BXPVwKKwkiLi5cLi5cdGVzdFxTREwuaCJcCisJIi4uXC4uXHRlc3RcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlx0ZXN0XFNETF9jb25maWcuaCJcCisJCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvbG9vcHdhdmUvbG9vcHdhdmUudmNwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL2xvb3B3YXZlL2xvb3B3YXZlLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI2MzZkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL2xvb3B3YXZlL2xvb3B3YXZlLnZjcHJvagpAQCAtMCwwICsxLDM3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0id2luZG93cy0xMjUxIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjgsMDAiCisJTmFtZT0ibG9vcHdhdmUiCisJUHJvamVjdEdVSUQ9Ins2RjY0MjYzNi1DQjExLTREQzctODU1RS0yN0ZFMTc0NDAwM0F9IgorCVJvb3ROYW1lc3BhY2U9Imxvb3B3YXZlIgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkvPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U7JChQTEFURk9STURFRklORVMpO1dJTkNFO0RFQlVHO19XSU5ET1dTOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19VTklDT0RFO1VOSUNPREUiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFOyQoUExBVEZPUk1ERUZJTkVTKSIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSW50RGlyKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9zdWJzeXN0ZW06d2luZG93c2NlLDQuMjAgL21hY2hpbmU6QVJNIC9BUk1QQURDT0RFIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9InNlY2Noay5saWIgY2NydHJ0dGkubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9sb29wd2F2ZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCURlbGF5TG9hZERMTHM9IiQoTk9JTkhFUklUKSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2xvb3B3YXZlLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9InNhbXBsZS53YXZ8JChTb2x1dGlvbkRpcilcLi5cdGVzdHxcfDAiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXG5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U7JChQTEFURk9STURFRklORVMpO1dJTkNFO0RFQlVHO19XSU5ET1dTOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19VTklDT0RFO1VOSUNPREUiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFOyQoUExBVEZPUk1ERUZJTkVTKSIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSW50RGlyKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9zdWJzeXN0ZW06d2luZG93c2NlLDUuMDEiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2xvb3B3YXZlLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJRGVsYXlMb2FkRExMcz0iJChOT0lOSEVSSVQpIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbG9vcHdhdmUucGRiIgorCQkJCVN1YlN5c3RlbT0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxEZXBsb3ltZW50VG9vbAorCQkJCUZvcmNlRGlydHk9Ii0xIgorCQkJCVJlbW90ZURpcmVjdG9yeT0iIgorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIgorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U7JChQTEFURk9STURFRklORVMpO1dJTkNFO19XSU5ET1dTOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19VTklDT0RFO1VOSUNPREUiCisJCQkJUnVudGltZUxpYnJhcnk9IjAiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFOyQoUExBVEZPUk1ERUZJTkVTKSIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSW50RGlyKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9zdWJzeXN0ZW06d2luZG93c2NlLDQuMjAgL21hY2hpbmU6QVJNIC9BUk1QQURDT0RFIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9InNlY2Noay5saWIgY2NydHJ0dGkubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9sb29wd2F2ZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCURlbGF5TG9hZERMTHM9IiQoTk9JTkhFUklUKSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2xvb3B3YXZlLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjAiCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIgorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9InNhbXBsZS53YXZ8JChTb2x1dGlvbkRpcilcLi5cdGVzdHxcfDAiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U7JChQTEFURk9STURFRklORVMpO1dJTkNFO19XSU5ET1dTOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19VTklDT0RFO1VOSUNPREUiCisJCQkJUnVudGltZUxpYnJhcnk9IjAiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFOyQoUExBVEZPUk1ERUZJTkVTKSIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSW50RGlyKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9zdWJzeXN0ZW06d2luZG93c2NlLDUuMDEiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2xvb3B3YXZlLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJRGVsYXlMb2FkRExMcz0iJChOT0lOSEVSSVQpIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbG9vcHdhdmUucGRiIgorCQkJCVN1YlN5c3RlbT0iMCIKKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxEZXBsb3ltZW50VG9vbAorCQkJCUZvcmNlRGlydHk9Ii0xIgorCQkJCVJlbW90ZURpcmVjdG9yeT0iIgorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIgorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlx0ZXN0XGxvb3B3YXZlLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIgorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSIKKwkJCT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeDt0aWZmO3RpZjtwbmc7d2F2IgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX0iCisJCQk+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3RhbHBoYS90ZXN0YWxwaGEudmNwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3RhbHBoYS90ZXN0YWxwaGEudmNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjQ5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvdGVzdGFscGhhL3Rlc3RhbHBoYS52Y3AKQEAgLTAsMCArMSw2OTggQEAKKyMgTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBUb29scyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJ0ZXN0YWxwaGEiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBUb29scyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMgorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIHg4NikgQXBwbGljYXRpb24iIDB4ODMwMQorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBBUk0pIEFwcGxpY2F0aW9uIiAweDg1MDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgQVJNVjQpIEFwcGxpY2F0aW9uIiAweGEzMDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgU0gzKSBBcHBsaWNhdGlvbiIgMHg4MTAxCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIE1JUFMpIEFwcGxpY2F0aW9uIiAweDgyMDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgZW11bGF0b3IpIEFwcGxpY2F0aW9uIiAweGE2MDEKKworQ0ZHPXRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3RhbHBoYS52Y24iLgorIU1FU1NBR0UgCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3RhbHBoYS52Y24iIENGRz0idGVzdGFscGhhIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIGVtdWxhdG9yKSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBlbXVsYXRvcikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNCkgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgQVJNVjQpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgQVJNVjQpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk0pIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTSkgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBNSVBTKSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgU0gzKSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSB4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSB4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorIyBQUk9QIEFUTF9Qcm9qZWN0IDIKKworIUlGICAiJChDRkcpIiA9PSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImVtdWxhdG9yUmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgInszMkU1MjAwMy00MDNFLTQ0MkQtQkU0OC1ERTEwRjhDNjEzMUR9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgImVtdWxhdG9yUmVsIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImVtdWxhdG9yUmVsIgorIyBQUk9QIENQVV9JRCAiezMyRTUyMDAzLTQwM0UtNDQyRC1CRTQ4LURFMTBGOEM2MTMxRH0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorQ1BQPWNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJfaTM4Nl8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiaV8zODZfIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9EICJOREVCVUciIC9ZWCAvR3M4MTkyIC9HRiAvTzIgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvSSAiLi5cLi5caW5jbHVkZSIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJfaTM4Nl8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiaV8zODZfIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9EICJOREVCVUciIC9ZWCAvR3M4MTkyIC9HRiAvTzIgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIGF5Z3NoZWxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIGF5Z3NoZWxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7MzJFNTIwMDMtNDAzRS00NDJELUJFNDgtREUxMEY4QzYxMzFEfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBDUFVfSUQgInszMkU1MjAwMy00MDNFLTQ0MkQtQkU0OC1ERTEwRjhDNjEzMUR9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiJChDZVBsYXRmb3JtKSIgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICIkKENlUGxhdGZvcm0pIiAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCitDUFA9Y2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiaV8zODZfIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9ZWCAvR3M4MTkyIC9HRiAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJERUJVRyIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiaV8zODZfIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9ZWCAvR3M4MTkyIC9HRiAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgYXlnc2hlbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIGF5Z3NoZWxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1WNFJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0UmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RUNCRUE0M0QtQ0Q3Qi00ODUyLUFENTUtRDQyMjdCNUQ2MjRCfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJBUk1WNFJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNFJlbCIKKyMgUFJPUCBDUFVfSUQgIntFQ0JFQTQzRC1DRDdCLTQ4NTItQUQ1NS1ENDIyN0I1RDYyNEJ9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIk5ERUJVRyIgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0IiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiTkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjQiIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvWVggL08yIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9JICIuLlwuLlxpbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvWVggL08yIC9NJChDRUNydE1UKSAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIGF5Z3NoZWxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgYXlnc2hlbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1WNERiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RUNCRUE0M0QtQ0Q3Qi00ODUyLUFENTUtRDQyMjdCNUQ2MjRCfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJBUk1WNERiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNERiZyIKKyMgUFJPUCBDUFVfSUQgIntFQ0JFQTQzRC1DRDdCLTQ4NTItQUQ1NS1ENDIyN0I1RDYyNEJ9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjQiIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJERUJVRyIgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0IiAvcgorQ1BQPWNsYXJtLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgIkFSTVY0IiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgYXlnc2hlbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgYXlnc2hlbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTURiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTURiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE4RkZDLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiQVJNRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTURiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOEZGQy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1SZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1SZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGQy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1SZWwiCisjIFBST1AgQ1BVX0lEICJ7RDY1MThGRkMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL1lYIC9PeHMgL00kKENFQ3J0TVQpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0kgIi4uLy4uL2luY2x1ZGUiIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvWVggL094cyAvTSQoQ0VDcnRNVCkgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTUlQU0RiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFNEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAxMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNEYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0RiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAxMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJNSVBTIiAvZCAiX01JUFNfIiAvcgorQ1BQPWNsbWlwcy5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvRCAiREVCVUciIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOk1JUFMKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlNIM0RiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlNIM0RiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE5MDIwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiU0gzRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlNIM0RiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAyMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIlNIeCIgL2QgIlNIMyIgL2QgIl9TSDNfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiU0h4IiAvZCAiU0gzIiAvZCAiX1NIM18iIC9yCitDUFA9c2hjbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiU0h4IiAvRCAiU0gzIiAvRCAiX1NIM18iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgIkRFQlVHIiAvRCAiU0h4IiAvRCAiU0gzIiAvRCAiX1NIM18iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpTSDMKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpTSDMKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiWDg2UmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiWDg2UmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJYODZSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiWDg2UmVsIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkYzLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorQ1BQPWNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYLSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9PeHMgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1gtIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgImlfMzg2XyIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvWVggL0dzODE5MiAvR0YgL094cyAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiWDg2RGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiWDg2RGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJYODZEYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiWDg2RGJnIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkYzLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKK0NQUD1jbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWC0gL1ppIC9PZCAvRCAiREVCVUciIC9EICJfaTM4Nl8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgImlfMzg2XyIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvWVggL0dzODE5MiAvR0YgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1gtIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL1lYIC9HczgxOTIgL0dGIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisjIE5hbWUgInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorIyBOYW1lICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorIyBOYW1lICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKyMgTmFtZSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorIyBOYW1lICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKyMgTmFtZSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIKKyMgTmFtZSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorIyBOYW1lICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKyMgTmFtZSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlx0ZXN0XHRlc3RhbHBoYS5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfVEVTVEE9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfVEVTVEE9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3lzd20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdGFscGhhIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9URVNUQT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9URVNUQT1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zeXN3bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfVEVTVEE9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkKK05PREVQX0NQUF9URVNUQT1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKworREVQX0NQUF9URVNUQT1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCQorTk9ERVBfQ1BQX1RFU1RBPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW5jZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3RhbHBoYSAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK0RFUF9DUFBfVEVTVEE9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYnl0ZW9yZGVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3R5cGVzLmgiXAorCQorTk9ERVBfQ1BQX1RFU1RBPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIFNIMykgRGVidWciCisKK0RFUF9DUFBfVEVTVEE9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2J5dGVvcmRlci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2dldGVudi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90eXBlcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKworTk9ERVBfQ1BQX1RFU1RBPVwKKwkiLi5cLi5cdGVzdFxTREwuaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0YWxwaGEgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK05PREVQX0NQUF9URVNUQT1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgorIyBFbmQgR3JvdXAKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3RhbHBoYS90ZXN0YWxwaGEudmNwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3RhbHBoYS90ZXN0YWxwaGEudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDEyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvdGVzdGFscGhhL3Rlc3RhbHBoYS52Y3Byb2oKQEAgLTAsMCArMSw3MTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IndpbmRvd3MtMTI1MSI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LDAwIgorCU5hbWU9InRlc3RhbHBoYSIKKwlQcm9qZWN0R1VJRD0ie0RGNDAxQ0IzLTZGNzAtNDQ4NS05OTZCLUI3QzM1N0NGN0VFN30iCisJUm9vdE5hbWVzcGFjZT0idGVzdGFscGhhIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkvPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IlBvY2tldCBQQyAyMDAzIChBUk1WNCkiCisJCS8+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEudGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO0FSTTtfQVJNXztBUk1WNDtVTkRFUl9DRT0kKENFVkVSKTtVTklDT0RFO05ERUJVRyIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL3IgIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJVTkRFUl9DRT0kKENFVkVSKSxfV0lOMzJfV0NFPSQoQ0VWRVIpLE5ERUJVRyxVTklDT0RFLF9VTklDT0RFLCQoQ2VQbGF0Zm9ybSksQVJNLF9BUk1fLEFSTVY0IgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9BTElHTjo0MDk2IC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6QVJNICIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJjb21tY3RybC5saWIgY29yZWRsbC5saWIgYXlnc2hlbGwubGliIHNlY2Noay5saWIgY2NydHJ0dGkubGliIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iJChDRU5vRGVmYXVsdExpYikiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS5wZGIiCisJCQkJU3RhY2tSZXNlcnZlU2l6ZT0iNjU1MzYiCisJCQkJU3RhY2tDb21taXRTaXplPSI0MDk2IgorCQkJCUVudHJ5UG9pbnRTeW1ib2w9Ildpbk1haW5DUlRTdGFydHVwIgorCQkJCUJhc2VBZGRyZXNzPSIweDAwMDEwMDAwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS5ic2MiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxEZXBsb3ltZW50VG9vbAorCQkJCUZvcmNlRGlydHk9Ii0xIgorCQkJCVJlbW90ZURpcmVjdG9yeT0iIgorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIgorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdGFscGhhLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSIyIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7JChDZVBsYXRmb3JtKTtBUk07X0FSTV87QVJNVjQ7VU5ERVJfQ0U9JChDRVZFUik7VU5JQ09ERTtOREVCVUciCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMCIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlPYmplY3RGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9yICIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iVU5ERVJfQ0U9JChDRVZFUiksX1dJTjMyX1dDRT0kKENFVkVSKSxOREVCVUcsVU5JQ09ERSxfVU5JQ09ERSwkKENlUGxhdGZvcm0pLEFSTSxfQVJNXyxBUk1WNCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvQUxJR046NDA5NiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOkFSTSAiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iY29tbWN0cmwubGliIGNvcmVkbGwubGliIGF5Z3NoZWxsLmxpYiBzZWNjaGsubGliIGNjcnRydHRpLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdGFscGhhLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiQoQ0VOb0RlZmF1bHRMaWIpIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEucGRiIgorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjY1NTM2IgorCQkJCVN0YWNrQ29tbWl0U2l6ZT0iNDA5NiIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJXaW5NYWluQ1JUU3RhcnR1cCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgwMDAxMDAwMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEuYnNjIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9Imljb24uYm1wfCQoU29sdXRpb25EaXIpXC4uXHRlc3R8XHwwIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iMiIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9InRydWUiCisJCQkJRmF2b3JTaXplT3JTcGVlZD0iMSIKKwkJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249InRydWUiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO0FSTTtfQVJNXztBUk1WNDtVTkRFUl9DRT0kKENFVkVSKTtVTklDT0RFO05ERUJVRyIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL3IgIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJVTkRFUl9DRT0kKENFVkVSKSxfV0lOMzJfV0NFPSQoQ0VWRVIpLE5ERUJVRyxVTklDT0RFLF9VTklDT0RFLCQoQ2VQbGF0Zm9ybSksQVJNLF9BUk1fLEFSTVY0IgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9BTElHTjo0MDk2IC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgICIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJjb21tY3RybC5saWIgY29yZWRsbC5saWIgYXlnc2hlbGwubGliIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iJChDRU5vRGVmYXVsdExpYikiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS5wZGIiCisJCQkJU3RhY2tSZXNlcnZlU2l6ZT0iNjU1MzYiCisJCQkJU3RhY2tDb21taXRTaXplPSI0MDk2IgorCQkJCUxpbmtUaW1lQ29kZUdlbmVyYXRpb249IjEiCisJCQkJRW50cnlQb2ludFN5bWJvbD0iV2luTWFpbkNSVFN0YXJ0dXAiCisJCQkJQmFzZUFkZHJlc3M9IjB4MDAwMTAwMDAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdGFscGhhLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSJpY29uLmJtcHwkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0fFx8MDtzYWlsLmJtcHwkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0fFx8MDtzYW1wbGUuYm1wfCQoU29sdXRpb25EaXIpXC4uXHRlc3R8XHwwIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEudGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iREVCVUc7QVJNO19BUk1fO0FSTVY0O1VOREVSX0NFPSQoQ0VWRVIpO19XSU4zMl9XQ0U9JChDRVZFUik7JChDZVBsYXRmb3JtKTtVTklDT0RFIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvciAiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVOREVSX0NFPSQoQ0VWRVIpLF9XSU4zMl9XQ0U9JChDRVZFUiksREVCVUcsVU5JQ09ERSxfVU5JQ09ERSwkKENlUGxhdGZvcm0pLEFSTSxfQVJNXyxBUk1WNCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvQUxJR046NDA5NiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOkFSTSAiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iY29tbWN0cmwubGliIGNvcmVkbGwubGliIGF5Z3NoZWxsLmxpYiBzZWNjaGsubGliIGNjcnRydHRpLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdGFscGhhLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiQoQ0VOb0RlZmF1bHRMaWIpIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdGFscGhhLnBkYiIKKwkJCQlTdGFja1Jlc2VydmVTaXplPSI2NTUzNiIKKwkJCQlTdGFja0NvbW1pdFNpemU9IjQwOTYiCisJCQkJRW50cnlQb2ludFN5bWJvbD0iV2luTWFpbkNSVFN0YXJ0dXAiCisJCQkJQmFzZUFkZHJlc3M9IjB4MDAwMTAwMDAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdGFscGhhLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdGFscGhhLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkRFQlVHO0FSTTtfQVJNXztBUk1WNDtVTkRFUl9DRT0kKENFVkVSKTtfV0lOMzJfV0NFPSQoQ0VWRVIpOyQoQ2VQbGF0Zm9ybSk7VU5JQ09ERSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlPYmplY3RGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL3IgIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJVTkRFUl9DRT0kKENFVkVSKSxfV0lOMzJfV0NFPSQoQ0VWRVIpLERFQlVHLFVOSUNPREUsX1VOSUNPREUsJChDZVBsYXRmb3JtKSxBUk0sX0FSTV8sQVJNVjQiCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL0FMSUdOOjQwOTYgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpBUk0gIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiBheWdzaGVsbC5saWIgc2VjY2hrLmxpYiBjY3J0cnR0aS5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIkKENFTm9EZWZhdWx0TGliKSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS5wZGIiCisJCQkJU3RhY2tSZXNlcnZlU2l6ZT0iNjU1MzYiCisJCQkJU3RhY2tDb21taXRTaXplPSI0MDk2IgorCQkJCUVudHJ5UG9pbnRTeW1ib2w9Ildpbk1haW5DUlRTdGFydHVwIgorCQkJCUJhc2VBZGRyZXNzPSIweDAwMDEwMDAwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS5ic2MiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxEZXBsb3ltZW50VG9vbAorCQkJCUZvcmNlRGlydHk9Ii0xIgorCQkJCVJlbW90ZURpcmVjdG9yeT0iIgorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIgorCQkJCUFkZGl0aW9uYWxGaWxlcz0iaWNvbi5ibXB8JChTb2x1dGlvbkRpcilcLi5cdGVzdHxcfDAiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3RhbHBoYS50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJERUJVRztBUk07X0FSTV87QVJNVjQ7VU5ERVJfQ0U9JChDRVZFUik7X1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO1VOSUNPREUiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdGFscGhhLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJT2JqZWN0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9yICIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iVU5ERVJfQ0U9JChDRVZFUiksX1dJTjMyX1dDRT0kKENFVkVSKSxERUJVRyxVTklDT0RFLF9VTklDT0RFLCQoQ2VQbGF0Zm9ybSksQVJNLF9BUk1fLEFSTVY0IgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9BTElHTjo0MDk2IC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgICIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJjb21tY3RybC5saWIgY29yZWRsbC5saWIgYXlnc2hlbGwubGliIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iJChDRU5vRGVmYXVsdExpYikiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEucGRiIgorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjY1NTM2IgorCQkJCVN0YWNrQ29tbWl0U2l6ZT0iNDA5NiIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJXaW5NYWluQ1JUU3RhcnR1cCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgwMDAxMDAwMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0YWxwaGEuYnNjIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9Imljb24uYm1wfCQoU29sdXRpb25EaXIpXC4uXHRlc3R8XHwwO3NhaWwuYm1wfCQoU29sdXRpb25EaXIpXC4uXHRlc3R8XHwwO3NhbXBsZS5ibXB8JChTb2x1dGlvbkRpcilcLi5cdGVzdHxcfDAiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHRlc3RcdGVzdGFscGhhLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCIKKwkJCT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisJCQk+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3R0aW1lci90ZXN0dGltZXIudmNwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3R0aW1lci90ZXN0dGltZXIudmNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzVlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvdGVzdHRpbWVyL3Rlc3R0aW1lci52Y3AKQEAgLTAsMCArMSw4NzQgQEAKKyMgTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBUb29scyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJ0ZXN0dGltZXIiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBUb29scyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMgorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIHg4NikgQXBwbGljYXRpb24iIDB4ODMwMQorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBBUk1WNCkgQXBwbGljYXRpb24iIDB4YTMwMQorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBBUk0pIEFwcGxpY2F0aW9uIiAweDg1MDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgeDg2ZW0pIEFwcGxpY2F0aW9uIiAweDdmMDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgU0gzKSBBcHBsaWNhdGlvbiIgMHg4MTAxCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIE1JUFMpIEFwcGxpY2F0aW9uIiAweDgyMDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgZW11bGF0b3IpIEFwcGxpY2F0aW9uIiAweGE2MDEKKworQ0ZHPXRlc3R0aW1lciAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidGVzdHRpbWVyLnZjbiIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAidGVzdHRpbWVyLnZjbiIgQ0ZHPSJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorIU1FU1NBR0UgCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFMpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgTUlQUykgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgU0gzKSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgU0gzKSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk0pIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk0pIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIHg4NmVtKSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgeDg2ZW0pIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIHg4NmVtKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIHg4NmVtKSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNCkgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNCkgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIGVtdWxhdG9yKSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBlbXVsYXRvcikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCisjIFBST1AgQVRMX1Byb2plY3QgMgorCishSUYgICIkKENGRykiID09ICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIE1JUFMpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTUmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiTUlQU1JlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE5MDEwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiTUlQU1JlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTUmVsIgorIyBQUk9QIENQVV9JRCAie0Q2NTE5MDEwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQ1BQPWNsbWlwcy5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvT3hzIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9JICIuLlwuLlxpbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvWVggL094cyAvTSQoQ0VDcnRNVCkgL2MKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiTUlQUyIgL2QgIl9NSVBTXyIgL3IKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJNSVBTRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0RiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE5MDEwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiTUlQU0RiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJNSVBTRGJnIgorIyBQUk9QIENQVV9JRCAie0Q2NTE5MDEwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOk1JUFMKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitDUFA9Y2xtaXBzLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EICJNSVBTIiAvRCAiX01JUFNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJERUJVRyIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJNSVBTIiAvZCAiX01JUFNfIiAvcgorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBTSDMpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJTSDNSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJTSDNSZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAyMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlNIM1JlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJTSDNSZWwiCisjIFBST1AgQ1BVX0lEICJ7RDY1MTkwMjAtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiU0h4IiAvZCAiU0gzIiAvZCAiX1NIM18iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiU0h4IiAvZCAiU0gzIiAvZCAiX1NIM18iIC9yCitDUFA9c2hjbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PeHMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJTSHgiIC9EICJTSDMiIC9EICJfU0gzXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvTSQoQ0VDcnRNVCkgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvT3hzIC9JICIuLlwuLlxpbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlNIeCIgL0QgIlNIMyIgL0QgIl9TSDNfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL1lYIC9NJChDRUNydE1UKSAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpTSDMKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlNIMworCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiU0gzRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiU0gzRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MTkwMjAtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJTSDNEYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiU0gzRGJnIgorIyBQUk9QIENQVV9JRCAie0Q2NTE5MDIwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiU0h4IiAvZCAiU0gzIiAvZCAiX1NIM18iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJTSHgiIC9kICJTSDMiIC9kICJfU0gzXyIgL3IKK0NQUD1zaGNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EICJTSHgiIC9EICJTSDMiIC9EICJfU0gzXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiREVCVUciIC9EICJTSHgiIC9EICJTSDMiIC9EICJfU0gzXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlNIMworIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOlNIMworCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1SZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1SZWwiCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGQy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1SZWwiCisjIFBST1AgQ1BVX0lEICJ7RDY1MThGRkMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbGFybS5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvWVggL094cyAvTSQoQ0VDcnRNVCkgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvSSAiLi5cLi5caW5jbHVkZSIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvT3hzIC9NJChDRUNydE1UKSAvYworUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1EYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1EYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGQy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkFSTURiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1EYmciCisjIFBST1AgQ1BVX0lEICJ7RDY1MThGRkMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQ1BQPWNsYXJtLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiREVCVUciIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL3IKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgeDg2ZW0pIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJYODZFTVJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlg4NkVNUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRjQtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJYODZFTVJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJYODZFTVJlbCIKKyMgUFJPUCBDUFVfSUQgIntENjUxOEZGNC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9zdWJzeXN0ZW06d2luZG93cyAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3dpbmRvd3NjZTplbXVsYXRpb24gL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9zdWJzeXN0ZW06d2luZG93cyAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3dpbmRvd3NjZTplbXVsYXRpb24gL01BQ0hJTkU6SVg4NgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0NQUD1jbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICJXSU4zMiIgL0QgIlNUUklDVCIgL0QgIl9XSU4zMl9XQ0VfRU1VTEFUSU9OIiAvRCAiSU5URVJOQVRJT05BTCIgL0QgIlVTQSIgL0QgIklOVExNU0dfQ09ERVBBR0UiIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiaTQ4NiIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HeiAvT3hzIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIldJTjMyIiAvRCAiU1RSSUNUIiAvRCAiX1dJTjMyX1dDRV9FTVVMQVRJT04iIC9EICJJTlRFUk5BVElPTkFMIiAvRCAiVVNBIiAvRCAiSU5UTE1TR19DT0RFUEFHRSIgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJpNDg2IiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvWVggL0d6IC9PeHMgL2MKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiaTQ4NiIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIk5ERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgImk0ODYiIC9yCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIHg4NmVtKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlg4NkVNRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiWDg2RU1EYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGNC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIlg4NkVNRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlg4NkVNRGJnIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkY0LTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3dpbmRvd3NjZTplbXVsYXRpb24gL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC93aW5kb3dzY2U6ZW11bGF0aW9uIC9NQUNISU5FOklYODYKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitDUFA9Y2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgImk0ODYiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiV0lOMzIiIC9EICJTVFJJQ1QiIC9EICJfV0lOMzJfV0NFX0VNVUxBVElPTiIgL0QgIklOVEVSTkFUSU9OQUwiIC9EICJVU0EiIC9EICJJTlRMTVNHX0NPREVQQUdFIiAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvWVggL0d6IC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EICJpNDg2IiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIldJTjMyIiAvRCAiU1RSSUNUIiAvRCAiX1dJTjMyX1dDRV9FTVVMQVRJT04iIC9EICJJTlRFUk5BVElPTkFMIiAvRCAiVVNBIiAvRCAiSU5UTE1TR19DT0RFUEFHRSIgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL1lYIC9HeiAvYworUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgImk0ODYiIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgImk0ODYiIC9yCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjREYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntFQ0JFQTQzRC1DRDdCLTQ4NTItQUQ1NS1ENDIyN0I1RDYyNEJ9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIENQVV9JRCAie0VDQkVBNDNELUNEN0ItNDg1Mi1BRDU1LUQ0MjI3QjVENjI0Qn0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiREVCVUciIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9kICJBUk1WNCIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjQiIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIkRFQlVHIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICJBUk1WNCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJBUk1WNFJlbCIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0UmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RUNCRUE0M0QtQ0Q3Qi00ODUyLUFENTUtRDQyMjdCNUQ2MjRCfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJBUk1WNFJlbCIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNFJlbCIKKyMgUFJPUCBDUFVfSUQgIntFQ0JFQTQzRC1DRDdCLTQ4NTItQUQ1NS1ENDIyN0I1RDYyNEJ9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIk5ERUJVRyIgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0IiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiTkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjQiIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvWVggL08yIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9JICIuLlwuLlxpbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiTkRFQlVHIiAvWVggL08yIC9NJChDRUNydE1UKSAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiWDg2UmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiWDg2UmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJYODZSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiWDg2UmVsIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkYzLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorQ1BQPWNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL094cyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL094cyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJYODZEYmciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJYODZEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOEZGMy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIlg4NkRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJYODZEYmciCisjIFBST1AgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorQ1BQPWNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EICJfaTM4Nl8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgImlfMzg2XyIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvWVggL0dzODE5MiAvR0YgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiaV8zODZfIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9ZWCAvR3M4MTkyIC9HRiAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJlbXVsYXRvclJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAiezMyRTUyMDAzLTQwM0UtNDQyRC1CRTQ4LURFMTBGOEM2MTMxRH0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgQ1BVX0lEICJ7MzJFNTIwMDMtNDAzRS00NDJELUJFNDgtREUxMEY4QzYxMzFEfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCitDUFA9Y2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9PMiAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgImlfMzg2XyIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvWVggL0dzODE5MiAvR0YgL08yIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZW11bGF0b3JEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgInszMkU1MjAwMy00MDNFLTQ0MkQtQkU0OC1ERTEwRjhDNjEzMUR9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIENQVV9JRCAiezMyRTUyMDAzLTQwM0UtNDQyRC1CRTQ4LURFMTBGOEM2MTMxRH0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICIkKENlUGxhdGZvcm0pIiAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICJfWDg2XyIgL2QgIng4NiIgL2QgIl9pMzg2XyIgL3IKK0NQUD1jbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL1lYIC9HczgxOTIgL0dGIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvRCAiREVCVUciIC9EICJfaTM4Nl8iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgImlfMzg2XyIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvWVggL0dzODE5MiAvR0YgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBNSVBTKSBSZWxlYXNlIgorIyBOYW1lICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorIyBOYW1lICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIFNIMykgUmVsZWFzZSIKKyMgTmFtZSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorIyBOYW1lICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKyMgTmFtZSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorIyBOYW1lICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIHg4NmVtKSBSZWxlYXNlIgorIyBOYW1lICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIHg4NmVtKSBEZWJ1ZyIKKyMgTmFtZSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisjIE5hbWUgInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiCisjIE5hbWUgInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorIyBOYW1lICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisjIE5hbWUgInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisjIE5hbWUgInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnIgorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlx0ZXN0XHRlc3R0aW1lci5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgTUlQUykgUmVsZWFzZSIKKworREVQX0NQUF9URVNUVD1cCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCQorTk9ERVBfQ1BQX1RFU1RUPVwKKwkiLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCitERVBfQ1BQX1RFU1RUPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJCitOT0RFUF9DUFBfVEVTVFQ9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgU0gzKSBSZWxlYXNlIgorCitERVBfQ1BQX1RFU1RUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1RFU1RUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfVEVTVFQ9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkKK05PREVQX0NQUF9URVNUVD1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBBUk0pIERlYnVnIgorCitERVBfQ1BQX1RFU1RUPVwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJCitOT0RFUF9DUFBfVEVTVFQ9XAorCSIuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgeDg2ZW0pIFJlbGVhc2UiCisKK05PREVQX0NQUF9URVNUVD1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSB4ODZlbSkgRGVidWciCisKK05PREVQX0NQUF9URVNUVD1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisKK0RFUF9DUFBfVEVTVFQ9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0dGltZXIgLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCitERVBfQ1BQX1RFU1RUPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jcHVpbmZvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lbmRpYW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Vycm9yLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ldmVudHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9sb2Fkc28uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21haW4uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX21vdXNlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tdXRleC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcGxhdGZvcm0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9zdGRpbmMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RocmVhZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGltZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiCisKK05PREVQX0NQUF9URVNUVD1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIgorCitOT0RFUF9DUFBfVEVTVFQ9XAorCSIuLlwuLlx0ZXN0XFNETC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R0aW1lciAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK05PREVQX0NQUF9URVNUVD1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHRpbWVyIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK05PREVQX0NQUF9URVNUVD1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgorIyBFbmQgR3JvdXAKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3R0aW1lci90ZXN0dGltZXIudmNwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3R0aW1lci90ZXN0dGltZXIudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTJkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvdGVzdHRpbWVyL3Rlc3R0aW1lci52Y3Byb2oKQEAgLTAsMCArMSwzNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IndpbmRvd3MtMTI1MSI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LDAwIgorCU5hbWU9InRlc3R0aW1lciIKKwlQcm9qZWN0R1VJRD0ie0Q0ODJEN0VFLTZGRjAtNDI1NC05MDI3LUM1OUY4RjAzQUIxRn0iCisJUm9vdE5hbWVzcGFjZT0idGVzdHRpbWVyIgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkvPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U7JChQTEFURk9STURFRklORVMpO1dJTkNFO0RFQlVHO19XSU5ET1dTOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19VTklDT0RFO1VOSUNPREUiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFOyQoUExBVEZPUk1ERUZJTkVTKSIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSW50RGlyKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9zdWJzeXN0ZW06d2luZG93c2NlLDQuMjAgL21hY2hpbmU6QVJNIC9BUk1QQURDT0RFIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9InNlY2Noay5saWIgY2NydHJ0dGkubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0dGltZXIuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlEZWxheUxvYWRETExzPSIkKE5PSU5IRVJJVCkiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS90ZXN0dGltZXIucGRiIgorCQkJCVN1YlN5c3RlbT0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxEZXBsb3ltZW50VG9vbAorCQkJCUZvcmNlRGlydHk9Ii0xIgorCQkJCVJlbW90ZURpcmVjdG9yeT0iIgorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIgorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U7JChQTEFURk9STURFRklORVMpO1dJTkNFO0RFQlVHO19XSU5ET1dTOyQoQVJDSEZBTSk7JChfQVJDSEZBTV8pO19VTklDT0RFO1VOSUNPREUiCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFOyQoUExBVEZPUk1ERUZJTkVTKSIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSW50RGlyKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9zdWJzeXN0ZW06d2luZG93c2NlLDUuMDEiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R0aW1lci5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCURlbGF5TG9hZERMTHM9IiQoTk9JTkhFUklUKSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3Rlc3R0aW1lci5wZGIiCisJCQkJU3ViU3lzdGVtPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iMiIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRTskKFBMQVRGT1JNREVGSU5FUyk7V0lOQ0U7X1dJTkRPV1M7JChBUkNIRkFNKTskKF9BUkNIRkFNXyk7X1VOSUNPREU7VU5JQ09ERSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMCIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U7JChQTEFURk9STURFRklORVMpIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJChJbnREaXIpIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL3N1YnN5c3RlbTp3aW5kb3dzY2UsNC4yMCAvbWFjaGluZTpBUk0gL0FSTVBBRENPREUiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ic2VjY2hrLmxpYiBjY3J0cnR0aS5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R0aW1lci5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCURlbGF5TG9hZERMTHM9IiQoTk9JTkhFUklUKSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3Rlc3R0aW1lci5wZGIiCisJCQkJU3ViU3lzdGVtPSIwIgorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiIKKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfV0lOMzJfV0NFPSQoQ0VWRVIpO1VOREVSX0NFOyQoUExBVEZPUk1ERUZJTkVTKTtXSU5DRTtfV0lORE9XUzskKEFSQ0hGQU0pOyQoX0FSQ0hGQU1fKTtfVU5JQ09ERTtVTklDT0RFIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRTskKFBMQVRGT1JNREVGSU5FUykiCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIkKEludERpcikiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvc3Vic3lzdGVtOndpbmRvd3NjZSw1LjAxIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0dGltZXIuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlEZWxheUxvYWRETExzPSIkKE5PSU5IRVJJVCkiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS90ZXN0dGltZXIucGRiIgorCQkJCVN1YlN5c3RlbT0iMCIKKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxEZXBsb3ltZW50VG9vbAorCQkJCUZvcmNlRGlydHk9Ii0xIgorCQkJCVJlbW90ZURpcmVjdG9yeT0iIgorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIgorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlx0ZXN0XHRlc3R0aW1lci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iCisJCQk+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdiIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9IgorCQkJPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS90ZXN0d2luL3Rlc3R3aW4udmNwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3R3aW4vdGVzdHdpbi52Y3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjNWY1NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9WaXN1YWxDRS90ZXN0d2luL3Rlc3R3aW4udmNwCkBAIC0wLDAgKzEsNjcyIEBACisjIE1pY3Jvc29mdCBlTWJlZGRlZCBWaXN1YWwgVG9vbHMgUHJvamVjdCBGaWxlIC0gTmFtZT0idGVzdHdpbiIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgZU1iZWRkZWQgVmlzdWFsIFRvb2xzIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAyCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgeDg2KSBBcHBsaWNhdGlvbiIgMHg4MzAxCisjIFRBUkdUWVBFICJXaW4zMiAoV0NFIEFSTSkgQXBwbGljYXRpb24iIDB4ODUwMQorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBBUk1WNCkgQXBwbGljYXRpb24iIDB4YTMwMQorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBTSDMpIEFwcGxpY2F0aW9uIiAweDgxMDEKKyMgVEFSR1RZUEUgIldpbjMyIChXQ0UgTUlQUykgQXBwbGljYXRpb24iIDB4ODIwMQorIyBUQVJHVFlQRSAiV2luMzIgKFdDRSBlbXVsYXRvcikgQXBwbGljYXRpb24iIDB4YTYwMQorCitDRkc9dGVzdHdpbiAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3R3aW4udmNuIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJ0ZXN0d2luLnZjbiIgQ0ZHPSJ0ZXN0d2luIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBlbXVsYXRvcikgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3R3aW4gLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIGVtdWxhdG9yKSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgQVJNVjQpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSBBUk1WNCkgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3R3aW4gLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTVY0KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTSkgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3R3aW4gLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIEFSTSkgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInRlc3R3aW4gLSBXaW4zMiAoV0NFIFNIMykgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKFdDRSBTSDMpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0d2luIC0gV2luMzIgKFdDRSBNSVBTKSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoV0NFIE1JUFMpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0d2luIC0gV2luMzIgKFdDRSB4ODYpIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKFdDRSB4ODYpIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ0ZXN0d2luIC0gV2luMzIgKFdDRSB4ODYpIERlYnVnIiAoYmFzZWQgb24gIldpbjMyIChXQ0UgeDg2KSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKKyMgUFJPUCBBVExfUHJvamVjdCAyCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInRlc3R3aW4gLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJlbXVsYXRvclJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAiezMyRTUyMDAzLTQwM0UtNDQyRC1CRTQ4LURFMTBGOEM2MTMxRH0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiZW11bGF0b3JSZWwiCisjIFBST1AgQ1BVX0lEICJ7MzJFNTIwMDMtNDAzRS00NDJELUJFNDgtREUxMEY4QzYxMzFEfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJOREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCitDUFA9Y2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9PMiAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9JICIuLlwuLlxpbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9PMiAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgYXlnc2hlbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgYXlnc2hlbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiJPTEROQU1FUy5saWIiIC9ub2RlZmF1bHRsaWI6JChDRU5vRGVmYXVsdExpYikgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpJWDg2CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0d2luIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImVtdWxhdG9yRGJnIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7MzJFNTIwMDMtNDAzRS00NDJELUJFNDgtREUxMEY4QzYxMzFEfSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJlbXVsYXRvckRiZyIKKyMgUFJPUCBDUFVfSUQgInszMkU1MjAwMy00MDNFLTQ0MkQtQkU0OC1ERTEwRjhDNjEzMUR9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiJChDZVBsYXRmb3JtKSIgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICIkKENlUGxhdGZvcm0pIiAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCitDUFA9Y2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiaV8zODZfIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9ZWCAvR3M4MTkyIC9HRiAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJERUJVRyIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiaV8zODZfIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvRCAiX1g4Nl8iIC9EICJ4ODYiIC9ZWCAvR3M4MTkyIC9HRiAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgYXlnc2hlbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAkKENFeDg2Q29yZWxpYmMpIGF5Z3NoZWxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R3aW4gLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiQVJNVjRSZWwiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJBUk1WNFJlbCIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0VDQkVBNDNELUNEN0ItNDg1Mi1BRDU1LUQ0MjI3QjVENjI0Qn0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiQVJNVjRSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjRSZWwiCisjIFBST1AgQ1BVX0lEICJ7RUNCRUE0M0QtQ0Q3Qi00ODUyLUFENTUtRDQyMjdCNUQ2MjRCfSIKKyMgUFJPUCBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgVGFyZ2V0X0RpciAiIgorUlNDPXJjLmV4ZQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJOREVCVUciIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9kICJBUk1WNCIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIk5ERUJVRyIgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJBUk0iIC9kICJfQVJNXyIgL2QgIkFSTVY0IiAvcgorQ1BQPWNsYXJtLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgIkFSTVY0IiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL1lYIC9PMiAvTSQoQ0VDcnRNVCkgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvSSAiLi5cLi5caW5jbHVkZSIgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgIkFSTVY0IiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL1lYIC9PMiAvTSQoQ0VDcnRNVCkgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiBheWdzaGVsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIGF5Z3NoZWxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R3aW4gLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNVjREYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntFQ0JFQTQzRC1DRDdCLTQ4NTItQUQ1NS1ENDIyN0I1RDYyNEJ9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTVY0RGJnIgorIyBQUk9QIENQVV9JRCAie0VDQkVBNDNELUNEN0ItNDg1Mi1BRDU1LUQ0MjI3QjVENjI0Qn0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiREVCVUciIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9kICJBUk1WNCIgL3IKKyMgQUREIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIkRFQlVHIiAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvZCAiQVJNVjQiIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCAiQVJNVjQiIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIkRFQlVHIiAvRCAiQVJNIiAvRCAiX0FSTV8iIC9EICJBUk1WNCIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiBheWdzaGVsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiBheWdzaGVsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgQVJNKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkFSTURiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkFSTURiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE4RkZDLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiQVJNRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkFSTURiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOEZGQy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiQVJNIiAvZCAiX0FSTV8iIC9yCitDUFA9Y2xhcm0uZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9EICJERUJVRyIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9ZWCAvTSQoQ0VDcnRNVERlYnVnKSAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL2FsaWduOiI0MDk2IiAvTUFDSElORTpBUk0KKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgQVJNKSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiQVJNUmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiQVJNUmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRkMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJBUk1SZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiQVJNUmVsIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkZDLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIkFSTSIgL2QgIl9BUk1fIiAvcgorQ1BQPWNsYXJtLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJBUk0iIC9EICJfQVJNXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJOREVCVUciIC9ZWCAvT3hzIC9NJChDRUNydE1UKSAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9JICIuLi8uLi9pbmNsdWRlIiAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIkFSTSIgL0QgIl9BUk1fIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIk5ERUJVRyIgL1lYIC9PeHMgL00kKENFQ3J0TVQpIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6IiQoQ0VOb0RlZmF1bHRMaWIpIiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvYWxpZ246IjQwOTYiIC9NQUNISU5FOkFSTQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlNIM0RiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlNIM0RiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE5MDIwLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiU0gzRGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlNIM0RiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAyMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIlNIeCIgL2QgIlNIMyIgL2QgIl9TSDNfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiU0h4IiAvZCAiU0gzIiAvZCAiX1NIM18iIC9yCitDUFA9c2hjbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiU0h4IiAvRCAiU0gzIiAvRCAiX1NIM18iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0QgIkRFQlVHIiAvRCAiU0h4IiAvRCAiU0gzIiAvRCAiX1NIM18iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpTSDMKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpTSDMKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R3aW4gLSBXaW4zMiAoV0NFIE1JUFMpIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTUlQU0RiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIk1JUFNEYmciCisjIFBST1AgQkFTRSBDUFVfSUQgIntENjUxOTAxMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIEJBU0UgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIk1JUFNEYmciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTUlQU0RiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOTAxMC03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIk1JUFMiIC9kICJfTUlQU18iIC9yCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9kIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9kICJVTklDT0RFIiAvZCAiX1VOSUNPREUiIC9kICJERUJVRyIgL2QgIiQoQ2VQbGF0Zm9ybSkiIC9kICJNSVBTIiAvZCAiX01JUFNfIiAvcgorQ1BQPWNsbWlwcy5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiTUlQUyIgL0QgIl9NSVBTXyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiVU5JQ09ERSIgL0QgIl9VTklDT0RFIiAvWVggL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvWmkgL09kIC9EICJERUJVRyIgL0QgIk1JUFMiIC9EICJfTUlQU18iIC9EIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL1lYIC9NJChDRUNydE1URGVidWcpIC9jCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vICJOVUwiIC93aW4zMgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9kZWJ1ZyAvbm9kZWZhdWx0bGliOiIkKENFTm9EZWZhdWx0TGliKSIgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpNSVBTCisjIEFERCBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliIC9ub2xvZ28gL2Jhc2U6IjB4MDAwMTAwMDAiIC9zdGFjazoweDEwMDAwLDB4MTAwMCAvZW50cnk6Ildpbk1haW5DUlRTdGFydHVwIiAvZGVidWcgL25vZGVmYXVsdGxpYjoiJChDRU5vRGVmYXVsdExpYikiIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6TUlQUworCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiWDg2UmVsIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiWDg2UmVsIgorIyBQUk9QIEJBU0UgQ1BVX0lEICJ7RDY1MThGRjMtNzEwRi0xMUQzLTk5RjItMDAxMDVBMERGMDk5fSIKKyMgUFJPUCBCQVNFIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJYODZSZWwiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiWDg2UmVsIgorIyBQUk9QIENQVV9JRCAie0Q2NTE4RkYzLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgUGxhdGZvcm1fSUQgIns4QTlBMkY4MC02ODg3LTExRDMtODQyRS0wMDUwMDQ4NDhDQkF9IgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK1JTQz1yYy5leGUKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiTkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorQ1BQPWNsLmV4ZQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYLSAvRCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvRCAiJChDZVBsYXRmb3JtKSIgL0QgIl9pMzg2XyIgL0QgVU5ERVJfQ0U9JChDRVZlcnNpb24pIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL0QgIk5ERUJVRyIgL1lYIC9HczgxOTIgL0dGIC9PeHMgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1gtIC9EIF9XSU4zMl9XQ0U9JChDRVZlcnNpb24pIC9EICIkKENlUGxhdGZvcm0pIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgImlfMzg2XyIgL0QgIlVOSUNPREUiIC9EICJfVU5JQ09ERSIgL0QgIl9YODZfIiAvRCAieDg2IiAvRCAiTkRFQlVHIiAvWVggL0dzODE5MiAvR0YgL094cyAvYworTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAiTlVMIiAvd2luMzIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgY29tbWN0cmwubGliIGNvcmVkbGwubGliICQoQ0V4ODZDb3JlbGliYykgL25vbG9nbyAvYmFzZToiMHgwMDAxMDAwMCIgL3N0YWNrOjB4MTAwMDAsMHgxMDAwIC9lbnRyeToiV2luTWFpbkNSVFN0YXJ0dXAiIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOklYODYKKyMgQUREIExJTkszMiBjb21tY3RybC5saWIgY29yZWRsbC5saWIgJChDRXg4NkNvcmVsaWJjKSAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL25vZGVmYXVsdGxpYjoiT0xETkFNRVMubGliIiAvbm9kZWZhdWx0bGliOiQoQ0VOb0RlZmF1bHRMaWIpIC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgL01BQ0hJTkU6SVg4NgorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlg4NkRiZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlg4NkRiZyIKKyMgUFJPUCBCQVNFIENQVV9JRCAie0Q2NTE4RkZDLTcxMEYtMTFEMy05OUYyLTAwMTA1QTBERjA5OX0iCisjIFBST1AgQkFTRSBQbGF0Zm9ybV9JRCAiezhBOUEyRjgwLTY4ODctMTFEMy04NDJFLTAwNTAwNDg0OENCQX0iCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiWDg2RGJnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlg4NkRiZyIKKyMgUFJPUCBDUFVfSUQgIntENjUxOEZGQy03MTBGLTExRDMtOTlGMi0wMDEwNUEwREYwOTl9IgorIyBQUk9QIFBsYXRmb3JtX0lEICJ7OEE5QTJGODAtNjg4Ny0xMUQzLTg0MkUtMDA1MDA0ODQ4Q0JBfSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitSU0M9cmMuZXhlCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL2QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL2QgIlVOSUNPREUiIC9kICJfVU5JQ09ERSIgL2QgIkRFQlVHIiAvZCAiJChDZVBsYXRmb3JtKSIgL2QgIl9YODZfIiAvZCAieDg2IiAvZCAiX2kzODZfIiAvcgorIyBBREQgUlNDIC9sIDB4NDA5IC9kIFVOREVSX0NFPSQoQ0VWZXJzaW9uKSAvZCBfV0lOMzJfV0NFPSQoQ0VWZXJzaW9uKSAvZCAiVU5JQ09ERSIgL2QgIl9VTklDT0RFIiAvZCAiREVCVUciIC9kICIkKENlUGxhdGZvcm0pIiAvZCAiX1g4Nl8iIC9kICJ4ODYiIC9kICJfaTM4Nl8iIC9yCitDUFA9Y2wuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1gtIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL1lYIC9HczgxOTIgL00kKENFQ3J0TVREZWJ1ZykgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1gtIC9aaSAvT2QgL0QgIkRFQlVHIiAvRCAiX2kzODZfIiAvRCBVTkRFUl9DRT0kKENFVmVyc2lvbikgL0QgX1dJTjMyX1dDRT0kKENFVmVyc2lvbikgL0QgIiQoQ2VQbGF0Zm9ybSkiIC9EICJpXzM4Nl8iIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJfWDg2XyIgL0QgIng4NiIgL1lYIC9HczgxOTIgL00kKENFQ3J0TVREZWJ1ZykgL2MKK01UTD1taWRsLmV4ZQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gIk5VTCIgL3dpbjMyCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisjIFNVQlRSQUNUIEJBU0UgTElOSzMyIC9pbmNyZW1lbnRhbDpubworIyBBREQgTElOSzMyIGNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiAvbm9sb2dvIC9iYXNlOiIweDAwMDEwMDAwIiAvc3RhY2s6MHgxMDAwMCwweDEwMDAgL2VudHJ5OiJXaW5NYWluQ1JUU3RhcnR1cCIgL2RlYnVnIC9ub2RlZmF1bHRsaWI6Ik9MRE5BTUVTLmxpYiIgL25vZGVmYXVsdGxpYjokKENFTm9EZWZhdWx0TGliKSAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9hbGlnbjoiNDA5NiIgL01BQ0hJTkU6QVJNCisjIFNVQlRSQUNUIExJTkszMiAvaW5jcmVtZW50YWw6bm8KKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgInRlc3R3aW4gLSBXaW4zMiAoV0NFIGVtdWxhdG9yKSBSZWxlYXNlIgorIyBOYW1lICJ0ZXN0d2luIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisjIE5hbWUgInRlc3R3aW4gLSBXaW4zMiAoV0NFIEFSTVY0KSBSZWxlYXNlIgorIyBOYW1lICJ0ZXN0d2luIC0gV2luMzIgKFdDRSBBUk1WNCkgRGVidWciCisjIE5hbWUgInRlc3R3aW4gLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisjIE5hbWUgInRlc3R3aW4gLSBXaW4zMiAoV0NFIEFSTSkgUmVsZWFzZSIKKyMgTmFtZSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgU0gzKSBEZWJ1ZyIKKyMgTmFtZSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisjIE5hbWUgInRlc3R3aW4gLSBXaW4zMiAoV0NFIHg4NikgUmVsZWFzZSIKKyMgTmFtZSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgeDg2KSBEZWJ1ZyIKKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cdGVzdFx0ZXN0d2luLmMKKworIUlGICAiJChDRkcpIiA9PSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgZW11bGF0b3IpIFJlbGVhc2UiCisKK0RFUF9DUFBfVEVTVFc9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0d2luIC0gV2luMzIgKFdDRSBlbXVsYXRvcikgRGVidWciCisKK0RFUF9DUFBfVEVTVFc9XAorCSIuLlwuLlxpbmNsdWRlXGJlZ2luX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcY2xvc2VfY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTREwuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2FjdGl2ZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYXVkaW8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWcuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19hbWlnYS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2RyZWFtY2FzdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3N4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfb3MyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfd2luMzIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0d2luIC0gV2luMzIgKFdDRSBBUk1WNCkgUmVsZWFzZSIKKworREVQX0NQUF9URVNUVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R3aW4gLSBXaW4zMiAoV0NFIEFSTVY0KSBEZWJ1ZyIKKworREVQX0NQUF9URVNUVz1cCisJIi4uXC4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfYWN0aXZlLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hdWRpby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY2Ryb20uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY29uZmlnX2FtaWdhLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfZHJlYW1jYXN0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9jb25maWdfbWFjb3MuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvc3guaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ19vczIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2NvbmZpZ193aW4zMi5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfY3B1aW5mby5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZW5kaWFuLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9qb3lzdGljay5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5Ym9hcmQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2tleXN5bS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbG9hZHNvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3BsYXRmb3JtLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9xdWl0LmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9yd29wcy5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfc3RkaW5jLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aHJlYWQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3RpbWVyLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92ZXJzaW9uLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF92aWRlby5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R3aW4gLSBXaW4zMiAoV0NFIEFSTSkgRGVidWciCisKK0RFUF9DUFBfVEVTVFc9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkKK05PREVQX0NQUF9URVNUVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0d2luIC0gV2luMzIgKFdDRSBBUk0pIFJlbGVhc2UiCisKK0RFUF9DUFBfVEVTVFc9XAorCSIuLlwuLlxpbmNsdWRlXFNETC5oIlwKKwkKK05PREVQX0NQUF9URVNUVz1cCisJIi4uXGluY2x1ZGVcYmVnaW5fY29kZS5oIlwKKwkiLi5caW5jbHVkZVxjbG9zZV9jb2RlLmgiXAorCSIuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jZHJvbS5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfYW1pZ2EuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NvbmZpZ19tYWNvcy5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX21hY29zeC5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX29zMi5oIlwKKwkiLi5caW5jbHVkZVxTRExfY29uZmlnX3dpbjMyLmgiXAorCSIuLlxpbmNsdWRlXFNETF9jb25maWdfd2luY2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2NwdWluZm8uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2VuZGlhbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfZXJyb3IuaCJcCisJIi4uXGluY2x1ZGVcU0RMX2V2ZW50cy5oIlwKKwkiLi5caW5jbHVkZVxTRExfam95c3RpY2suaCJcCisJIi4uXGluY2x1ZGVcU0RMX2tleWJvYXJkLmgiXAorCSIuLlxpbmNsdWRlXFNETF9rZXlzeW0uaCJcCisJIi4uXGluY2x1ZGVcU0RMX2xvYWRzby5oIlwKKwkiLi5caW5jbHVkZVxTRExfbWFpbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfbW91c2UuaCJcCisJIi4uXGluY2x1ZGVcU0RMX211dGV4LmgiXAorCSIuLlxpbmNsdWRlXFNETF9wbGF0Zm9ybS5oIlwKKwkiLi5caW5jbHVkZVxTRExfcXVpdC5oIlwKKwkiLi5caW5jbHVkZVxTRExfcndvcHMuaCJcCisJIi4uXGluY2x1ZGVcU0RMX3N0ZGluYy5oIlwKKwkiLi5caW5jbHVkZVxTRExfdGhyZWFkLmgiXAorCSIuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmVyc2lvbi5oIlwKKwkiLi5caW5jbHVkZVxTRExfdmlkZW8uaCJcCisJCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0d2luIC0gV2luMzIgKFdDRSBTSDMpIERlYnVnIgorCitERVBfQ1BQX1RFU1RXPVwKKwkiLi5cLi5caW5jbHVkZVxiZWdpbl9jb2RlLmgiXAorCSIuLlwuLlxpbmNsdWRlXGNsb3NlX2NvZGUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9hY3RpdmUuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2F1ZGlvLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9ieXRlb3JkZXIuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2Nkcm9tLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9lcnJvci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfZXZlbnRzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9nZXRlbnYuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX2pveXN0aWNrLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9rZXlib2FyZC5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfa2V5c3ltLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tYWluLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF9tb3VzZS5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfbXV0ZXguaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3F1aXQuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3J3b3BzLmgiXAorCSIuLlwuLlxpbmNsdWRlXFNETF90aW1lci5oIlwKKwkiLi5cLi5caW5jbHVkZVxTRExfdHlwZXMuaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZlcnNpb24uaCJcCisJIi4uXC4uXGluY2x1ZGVcU0RMX3ZpZGVvLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgTUlQUykgRGVidWciCisKK05PREVQX0NQUF9URVNUVz1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCQorCishRUxTRUlGICAiJChDRkcpIiA9PSAidGVzdHdpbiAtIFdpbjMyIChXQ0UgeDg2KSBSZWxlYXNlIgorCitOT0RFUF9DUFBfVEVTVFc9XAorCSIuLlwuLlx0ZXN0XFNETC5oIlwKKwkKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInRlc3R3aW4gLSBXaW4zMiAoV0NFIHg4NikgRGVidWciCisKK05PREVQX0NQUF9URVNUVz1cCisJIi4uXC4uXHRlc3RcU0RMLmgiXAorCQorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgorIyBFbmQgR3JvdXAKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3R3aW4vdGVzdHdpbi52Y3Byb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvVmlzdWFsQ0UvdGVzdHdpbi90ZXN0d2luLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQzMDNkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1Zpc3VhbENFL3Rlc3R3aW4vdGVzdHdpbi52Y3Byb2oKQEAgLTAsMCArMSw3MDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IndpbmRvd3MtMTI1MSI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LDAwIgorCU5hbWU9InRlc3R3aW4iCisJUHJvamVjdEdVSUQ9IntEQzUxNjk3OC04OENCLTRGOUEtQTM5QS1DMzUxQzI1ODYxM0J9IgorCVJvb3ROYW1lc3BhY2U9InRlc3R3aW4iCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iU21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCS8+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJLz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4udGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7JChDZVBsYXRmb3JtKTtBUk07X0FSTV87QVJNVjQ7VU5ERVJfQ0U9JChDRVZFUik7VU5JQ09ERTtOREVCVUciCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMCIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJT2JqZWN0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvciAiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVOREVSX0NFPSQoQ0VWRVIpLF9XSU4zMl9XQ0U9JChDRVZFUiksTkRFQlVHLFVOSUNPREUsX1VOSUNPREUsJChDZVBsYXRmb3JtKSxBUk0sX0FSTV8sQVJNVjQiCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL0FMSUdOOjQwOTYgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpBUk0gIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiBheWdzaGVsbC5saWIgc2VjY2hrLmxpYiBjY3J0cnR0aS5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4uZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iJChDRU5vRGVmYXVsdExpYikiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4ucGRiIgorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjY1NTM2IgorCQkJCVN0YWNrQ29tbWl0U2l6ZT0iNDA5NiIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJXaW5NYWluQ1JUU3RhcnR1cCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgwMDAxMDAwMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSIyIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XQ0U9JChDRVZFUik7JChDZVBsYXRmb3JtKTtBUk07X0FSTV87QVJNVjQ7VU5ERVJfQ0U9JChDRVZFUik7VU5JQ09ERTtOREVCVUciCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMCIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJT2JqZWN0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvciAiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVOREVSX0NFPSQoQ0VWRVIpLF9XSU4zMl9XQ0U9JChDRVZFUiksTkRFQlVHLFVOSUNPREUsX1VOSUNPREUsJChDZVBsYXRmb3JtKSxBUk0sX0FSTV8sQVJNVjQiCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL0FMSUdOOjQwOTYgL3N1YnN5c3RlbTokKENFU3Vic3lzdGVtKSAvTUFDSElORTpBUk0gIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImNvbW1jdHJsLmxpYiBjb3JlZGxsLmxpYiBheWdzaGVsbC5saWIgc2VjY2hrLmxpYiBjY3J0cnR0aS5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4uZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iJChDRU5vRGVmYXVsdExpYikiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4ucGRiIgorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjY1NTM2IgorCQkJCVN0YWNrQ29tbWl0U2l6ZT0iNDA5NiIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJXaW5NYWluQ1JUU3RhcnR1cCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgwMDAxMDAwMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSJzYW1wbGUuYm1wfCQoU29sdXRpb25EaXIpXC4uXHRlc3R8XHwwIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4udGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5caW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO0FSTTtfQVJNXztBUk1WNDtVTkRFUl9DRT0kKENFVkVSKTtVTklDT0RFO05ERUJVRyIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4ucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlPYmplY3RGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9yICIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iVU5ERVJfQ0U9JChDRVZFUiksX1dJTjMyX1dDRT0kKENFVkVSKSxOREVCVUcsVU5JQ09ERSxfVU5JQ09ERSwkKENlUGxhdGZvcm0pLEFSTSxfQVJNXyxBUk1WNCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvQUxJR046NDA5NiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pICAiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iY29tbWN0cmwubGliIGNvcmVkbGwubGliIGF5Z3NoZWxsLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdHdpbi5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIkKENFTm9EZWZhdWx0TGliKSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdHdpbi5wZGIiCisJCQkJU3RhY2tSZXNlcnZlU2l6ZT0iNjU1MzYiCisJCQkJU3RhY2tDb21taXRTaXplPSI0MDk2IgorCQkJCUVudHJ5UG9pbnRTeW1ib2w9Ildpbk1haW5DUlRTdGFydHVwIgorCQkJCUJhc2VBZGRyZXNzPSIweDAwMDEwMDAwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4uYnNjIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiIKKwkJCS8+CisJCQk8RGVidWdnZXJUb29sCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdHdpbi50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJERUJVRztBUk07X0FSTV87QVJNVjQ7VU5ERVJfQ0U9JChDRVZFUik7X1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO1VOSUNPREUiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdHdpbi5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvciAiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVOREVSX0NFPSQoQ0VWRVIpLF9XSU4zMl9XQ0U9JChDRVZFUiksREVCVUcsVU5JQ09ERSxfVU5JQ09ERSwkKENlUGxhdGZvcm0pLEFSTSxfQVJNXyxBUk1WNCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvQUxJR046NDA5NiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOkFSTSAiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iY29tbWN0cmwubGliIGNvcmVkbGwubGliIGF5Z3NoZWxsLmxpYiBzZWNjaGsubGliIGNjcnRydHRpLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdHdpbi5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIkKENFTm9EZWZhdWx0TGliKSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4ucGRiIgorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjY1NTM2IgorCQkJCVN0YWNrQ29tbWl0U2l6ZT0iNDA5NiIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJXaW5NYWluQ1JUU3RhcnR1cCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgwMDAxMDAwMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiCisJCQkvPgorCQkJPERlYnVnZ2VyVG9vbAorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdHdpbi50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3IgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxpbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJERUJVRztBUk07X0FSTV87QVJNVjQ7VU5ERVJfQ0U9JChDRVZFUik7X1dJTjMyX1dDRT0kKENFVkVSKTskKENlUGxhdGZvcm0pO1VOSUNPREUiCisJCQkJUnVudGltZUxpYnJhcnk9IjEiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdHdpbi5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvIgorCQkJCU9iamVjdEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvciAiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVOREVSX0NFPSQoQ0VWRVIpLF9XSU4zMl9XQ0U9JChDRVZFUiksREVCVUcsVU5JQ09ERSxfVU5JQ09ERSwkKENlUGxhdGZvcm0pLEFSTSxfQVJNXyxBUk1WNCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvQUxJR046NDA5NiAvc3Vic3lzdGVtOiQoQ0VTdWJzeXN0ZW0pIC9NQUNISU5FOkFSTSAiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iY29tbWN0cmwubGliIGNvcmVkbGwubGliIGF5Z3NoZWxsLmxpYiBzZWNjaGsubGliIGNjcnRydHRpLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdHdpbi5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIkKENFTm9EZWZhdWx0TGliKSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4ucGRiIgorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjY1NTM2IgorCQkJCVN0YWNrQ29tbWl0U2l6ZT0iNDA5NiIKKwkJCQlFbnRyeVBvaW50U3ltYm9sPSJXaW5NYWluQ1JUU3RhcnR1cCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgwMDAxMDAwMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLmJzYyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPERlcGxveW1lbnRUb29sCisJCQkJRm9yY2VEaXJ0eT0iLTEiCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiCisJCQkJQWRkaXRpb25hbEZpbGVzPSJzYW1wbGUuYm1wfCQoU29sdXRpb25EaXIpXC4uXHRlc3R8XHwwIgorCQkJLz4KKwkJCTxEZWJ1Z2dlclRvb2wKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkRFQlVHO0FSTTtfQVJNXztBUk1WNDtVTkRFUl9DRT0kKENFVkVSKTtfV0lOMzJfV0NFPSQoQ0VWRVIpOyQoQ2VQbGF0Zm9ybSk7VU5JQ09ERSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS8iCisJCQkJT2JqZWN0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9yICIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iVU5ERVJfQ0U9JChDRVZFUiksX1dJTjMyX1dDRT0kKENFVkVSKSxERUJVRyxVTklDT0RFLF9VTklDT0RFLCQoQ2VQbGF0Zm9ybSksQVJNLF9BUk1fLEFSTVY0IgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9BTElHTjo0MDk2IC9zdWJzeXN0ZW06JChDRVN1YnN5c3RlbSkgICIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJjb21tY3RybC5saWIgY29yZWRsbC5saWIgYXlnc2hlbGwubGliIgorCQkJCU91dHB1dEZpbGU9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKS90ZXN0d2luLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiQoQ0VOb0RlZmF1bHRMaWIpIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkvdGVzdHdpbi5wZGIiCisJCQkJU3RhY2tSZXNlcnZlU2l6ZT0iNjU1MzYiCisJCQkJU3RhY2tDb21taXRTaXplPSI0MDk2IgorCQkJCUVudHJ5UG9pbnRTeW1ib2w9Ildpbk1haW5DUlRTdGFydHVwIgorCQkJCUJhc2VBZGRyZXNzPSIweDAwMDEwMDAwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJT3V0cHV0RmlsZT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpL3Rlc3R3aW4uYnNjIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8RGVwbG95bWVudFRvb2wKKwkJCQlGb3JjZURpcnR5PSItMSIKKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiIKKwkJCQlSZWdpc3Rlck91dHB1dD0iMCIKKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiIKKwkJCS8+CisJCQk8RGVidWdnZXJUb29sCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cdGVzdFx0ZXN0d2luLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCIKKwkJCT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisJCQk+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1dhdGNvbS1PUzIuemlwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1dhdGNvbS1PUzIuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZDFhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvV2F0Y29tLU9TMi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1dhdGNvbS1XaW4zMi56aXAgYi9kaXN0cmliL3NkbC0xLjIuMTUvV2F0Y29tLVdpbjMyLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjBhZjZkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1dhdGNvbS1XaW4zMi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1doYXRzTmV3IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1doYXRzTmV3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyN2ZkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvV2hhdHNOZXcKQEAgLTAsMCArMSw3MjcgQEAKKworVGhpcyBpcyBhIGxpc3Qgb2YgQVBJIGNoYW5nZXMgaW4gU0RMJ3MgdmVyc2lvbiBoaXN0b3J5LgorCitWZXJzaW9uIDEuMDoKKworMS4yLjE0OgorCUFkZGVkIGNhc3QgbWFjcm9zIGZvciBjb3JyZWN0IHVzYWdlIHdpdGggQysrOgorCQlTRExfcmVpbnRlcnByZXRfY2FzdCh0eXBlLCBleHByZXNzaW9uKQorCQlTRExfc3RhdGljX2Nhc3QodHlwZSwgZXhwcmVzc2lvbikKKworCUFkZGVkIFNETF9WSURFT19GVUxMU0NSRUVOX0RJU1BMQVkgYXMgYSBwcmVmZXJyZWQgc3lub255bSBmb3IgCisJU0RMX1ZJREVPX0ZVTExTQ1JFRU5fSEVBRCBvbiBYMTEuCisKKwlBZGRlZCBTRExfRElTQUJMRV9MT0NLX0tFWVMgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZW5hYmxlIG5vcm1hbAorCXVwL2Rvd24gZXZlbnRzIGZvciBDYXBzLUxvY2sgYW5kIE51bS1Mb2NrIGtleXMuCisKKzEuMi4xMzoKKwlBZGRlZCBTRExfQlVUVE9OX1gxIGFuZCBTRExfQlVUVE9OX1gyIGNvbnN0YW50cy4KKworMS4yLjEyOgorCUFkZGVkIFNETF9WSURFT19BTExPV19TQ1JFRU5TQVZFUiB0byBvdmVycmlkZSBTREwncyBkaXNhYmxpbmcKKwlvZiB0aGUgc2NyZWVuc2F2ZXIgb24gTWFjIE9TIFggYW5kIFgxMS4KKworMS4yLjEwOgorCUlmIFNETF9PcGVuQXVkaW8oKSBpcyBwYXNzZWQgemVybyBmb3IgdGhlIGRlc2lyZWQgZm9ybWF0CisJZmllbGRzLCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGJlIHVzZWQKKwl0byBmaWxsIHRoZW0gaW46CisJCVNETF9BVURJT19GUkVRVUVOQ1kKKwkJU0RMX0FVRElPX0ZPUk1BVAorCQlTRExfQVVESU9fQ0hBTk5FTFMKKwkJU0RMX0FVRElPX1NBTVBMRVMKKwlJZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHNldAorCXRvIGEgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlLgorCisJQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFNETF9WSURFT19GVUxMU0NSRUVOX0hFQUQgZW52aXJvbm1lbnQKKwl2YXJpYWJsZSwgY3VycmVudGx5IHN1cHBvcnRlZCBvbiBYMTEgWGluZXJhbWEgY29uZmlndXJhdGlvbnMuCisKKwlBZGRlZCBTRExfR0xfU1dBUF9DT05UUk9MIHRvIHdhaXQgZm9yIHZzeW5jIGluIE9wZW5HTCBhcHBsaWNhdGlvbnMuCisKKwlBZGRlZCBTRExfR0xfQUNDRUxFUkFURURfVklTVUFMIHRvIGd1YXJhbnRlZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24uCisKKwlBZGRlZCBjdXJyZW50X3cgYW5kIGN1cnJlbnRfaCB0byB0aGUgU0RMX1ZpZGVvSW5mbyBzdHJ1Y3R1cmUsCisJd2hpY2ggaXMgc2V0IHRvIHRoZSBkZXNrdG9wIHJlc29sdXRpb24gZHVyaW5nIHZpZGVvIGludGlhbGl6YXRpb24sCisJYW5kIHRoZW4gc2V0IHRvIHRoZSBjdXJyZW50IHJlc29sdXRpb24gd2hlbiBhIHZpZGVvIG1vZGUgaXMgc2V0LgorCisJU0RMX1NldFZpZGVvTW9kZSgpIG5vdyBhY2NlcHRzIDAgZm9yIHdpZHRoIG9yIGhlaWdodCBhbmQgd2lsbCB1c2UKKwl0aGUgY3VycmVudCB2aWRlbyBtb2RlIChvciB0aGUgZGVza3RvcCBtb2RlIGlmIG5vIG1vZGUgaGFzIGJlZW4gc2V0LikKKworCUFkZGVkIFNETF9HZXRLZXlSZXBlYXQoKQorCisJQWRkZWQgU0RMX2NvbmZpZy5oLCB3aXRoIGRlZmF1bHRzIGZvciB2YXJpb3VzIGJ1aWxkIGVudmlyb25tZW50cy4KKworMS4yLjc6CisJQWRkZWQgQ1BVIGZlYXR1cmUgZGV0ZWN0aW9uIGZ1bmN0aW9ucyB0byBTRExfY3B1aW5mby5oOgorCQlTRExfSGFzUkRUU0MoKSwgU0RMX0hhc01NWCgpLCBTRExfSGFzM0ROb3coKSwgU0RMX0hhc1NTRSgpLAorCQlTRExfSGFzQWx0aVZlYygpCisJQWRkZWQgZnVuY3Rpb24gdG8gY3JlYXRlIFJXb3BzIGZyb20gY29uc3QgbWVtb3J5OiBTRExfUldGcm9tQ29uc3RNZW0oKQorCisxLjIuNjoKKwlBZGRlZCBTRExfTG9hZE9iamVjdCgpLCBTRExfTG9hZEZ1bmN0aW9uKCksIGFuZCBTRExfVW5sb2FkT2JqZWN0KCkKKworCUFkZGVkIFNETF9HTF9NVUxUSVNBTVBMRUJVRkZFUlMgYW5kIFNETF9HTF9NVUxUSVNBTVBMRVNBTVBMRVMgZm9yIEZTQUEKKworMS4yLjU6CisJQWRkZWQgU0RMX0JVVFRPTl9XSEVFTFVQICg0KSBhbmQgU0RMX0JVVFRPTl9XSEVFTERPV04gKDUpCisKKwlBZGRlZCBTRExfR0xfU1RFUkVPIGZvciBzdGVyZW9zY29waWMgT3BlbkdMIGNvbnRleHRzCisKKzEuMi4wOgorCUFkZGVkIFNETF9WSURFT0VYUE9TRSBldmVudCB0byBzaWduYWwgdGhhdCB0aGUgc2NyZWVuIG5lZWRzIHRvCisJYmUgcmVkcmF3bi4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgZGVsaXZlcmVkIHRvIE9wZW5HTCB3aW5kb3dzCisJb24gWDExLCB0aG91Z2ggaXQgbWF5IGJlIGRlbGl2ZXJlZCBpbiB0aGUgZnV0dXJlIHdoZW4gdGhlIHZpZGVvCisJbWVtb3J5IGlzIGxvc3QgdW5kZXIgRGlyZWN0WC4KKworMS4xLjg6CisJWW91IGNhbiBwYXNzIFNETF9OT0ZSQU1FIHRvIFNETF9WaWRlb01vZGUoKSB0byBjcmVhdGUgYSB3aW5kb3cKKwl0aGF0IGhhcyBubyB0aXRsZSBiYXIgb3IgZnJhbWUgZGVjb3JhdGlvbi4gIEZ1bGxzY3JlZW4gdmlkZW8KKwltb2RlcyBhdXRvbWF0aWNhbGx5IGhhdmUgdGhpcyBmbGFnIHNldC4KKworCUFkZGVkIGEgZnVuY3Rpb24gdG8gcXVlcnkgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBmb3IgYSBzdXJmYWNlOgorCQl2b2lkIFNETF9HZXRDbGlwUmVjdChTRExfU3VyZmFjZSAqc3VyZmFjZSwgU0RMX1JlY3QgKnJlY3QpCisKKwlBZGRlZCBhIGZ1bmN0aW9uIHRvIHF1ZXJ5IHRoZSBjdXJyZW50IGV2ZW50IGZpbHRlcjoKKwkJU0RMX0V2ZW50RmlsdGVyIFNETF9HZXRFdmVudEZpbHRlcih2b2lkKQorCisJSWYgeW91IHBhc3MgLTEgdG8gU0RMX1Nob3dDdXJzb3IoKSwgaXQgd29uJ3QgY2hhbmdlIHRoZSBjdXJyZW50CisJY3Vyc29yIHZpc2liaWxpdHkgc3RhdGUsIGJ1dCB3aWxsIHN0aWxsIHJldHVybiBpdC4KKworCVNETF9Mb2NrU3VyZmFjZSgpIGFuZCBTRExfVW5sb2NrU3VyZmFjZSgpIGFyZSByZWN1cnNpdmUsIG1lYW5pbmcKKwl5b3UgY2FuIG5lc3QgdGhlbSBhcyBkZWVwIGFzIHlvdSB3YW50LCBhcyBsb25nIGFzIGVhY2ggbG9jayBjYWxsCisJaGFzIGEgbWF0Y2hpbmcgdW5sb2NrIGNhbGwuICBUaGUgc3VyZmFjZSByZW1haW5zIGxvY2tlZCB1bnRpbCB0aGUKKwlsYXN0IG1hdGNoaW5nIHVubG9jayBjYWxsLgorCisJTm90ZSB0aGF0IHlvdSBtYXkgbm90IGJsaXQgdG8gb3IgZnJvbSBhIGxvY2tlZCBzdXJmYWNlLgorCisxLjEuNzoKKwlUaGUgU0RMX1NldEdhbW1hUmFtcCgpIGFuZCBTRExfR2V0R2FtbWFSYW1wKCkgZnVuY3Rpb25zIG5vdyB0YWtlCisJYXJyYXlzIG9mIFVpbnQxNiB2YWx1ZXMgaW5zdGVhZCBvZiBVaW50OCB2YWx1ZXMuICBGb3IgdGhlIG1vc3QgcGFydCwKKwl5b3UgY2FuIGp1c3QgdGFrZSB5b3VyIG9sZCB2YWx1ZXMgYW5kIHNoaWZ0IHRoZW0gdXAgOCBiaXRzIHRvIGdldAorCW5ldyBjb3JyZWN0IHZhbHVlcyBmb3IgeW91ciBnYW1tYSByYW1wcy4KKworCVlvdSBjYW4gcGFzcyBTRExfUkxFQUNDRUwgaW4gZmxhZ3MgcGFzc2VkIHRvIFNETF9Db252ZXJ0U3VyZmFjZSgpCisgICAgICAgIGFuZCBTREwgd2lsbCB0cnkgdG8gUkxFIGFjY2VsZXJhdGUgY29sb3JrZXkgYW5kIGFscGhhIGJsaXRzIGluIHRoZQorCXJlc3VsdGluZyBzdXJmYWNlLgorCisxLjEuNjoKKwlBZGRlZCBhIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgdGhyZWFkIElEIG9mIGEgc3BlY2lmaWMgdGhyZWFkOgorCQlVaW50MzIgU0RMX0dldFRocmVhZElEKFNETF9UaHJlYWQgKnRocmVhZCkKKwlJZiAndGhyZWFkJyBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGlkIGZvciB0aGlzIHRocmVhZC4KKworMS4xLjU6CisJVGhlIFlVViBvdmVybGF5IHN0cnVjdHVyZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHVzZSBhbiBhcnJheSBvZgorCXBpdGNoZXMgYW5kIHBpeGVscyByZXByZXNlbnRpbmcgdGhlIHBsYW5lcyBvZiBhIFlVViBpbWFnZSwgdG8KKwliZXR0ZXIgZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4gIFRoZSBZVjEyIGFuZCBJWVVWIGZvcm1hdHMKKwllYWNoIGhhdmUgdGhyZWUgcGxhbmVzLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBZLCBVLCBhbmQgViBwb3J0aW9ucworCW9mIHRoZSBpbWFnZSwgd2hpbGUgcGFja2VkIHBpeGVsIFlVViBmb3JtYXRzIGp1c3QgaGF2ZSBvbmUgcGxhbmUuCisKKwlGb3IgcGFsZXR0aXplZCBtb2RlICg4YnBwKSwgdGhlIHNjcmVlbiBjb2xvcm1hcCBpcyBub3cgc3BsaXQgaW4KKwlhIHBoeXNpY2FsIGFuZCBhIGxvZ2ljYWwgcGFsZXR0ZS4gVGhlIHBoeXNpY2FsIHBhbGV0dGUgZGV0ZXJtaW5lcworCXdoYXQgY29sb3VycyB0aGUgc2NyZWVuIHBpeGVscyB3aWxsIGdldCB3aGVuIGRpc3BsYXllZCwgYW5kIHRoZQorCWxvZ2ljYWwgcGFsZXR0ZSBjb250cm9scyB0aGUgbWFwcGluZyBmcm9tIGJsaXRzIHRvL2Zyb20gdGhlIHNjcmVlbi4KKwlBIG5ldyBmdW5jdGlvbiwgU0RMX1NldFBhbGV0dGUoKSBoYXMgYmVlbiBhZGRlZCB0byBjaGFuZ2UKKwlsb2dpY2FsIGFuZCBwaHlzaWNhbCBwYWxldHRlcyBzZXBhcmF0ZWx5LiBTRExfU2V0Q29sb3JzKCkgd29ya3MKKwlqdXN0IGFzIGJlZm9yZSwgYW5kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBTRExfU2V0UGFsZXR0ZSgpIHdpdGgKKwlhIGZsYWcgYXJndW1lbnQgb2YgKFNETF9MT0dQQUx8U0RMX1BIWVNQQUwpLgorCisJU0RMX0JsaXRTdXJmYWNlKCkgbm8gbG9uZ2VyIG1vZGlmaWVzIHRoZSBzb3VyY2UgcmVjdGFuZ2xlLCBvbmx5IHRoZQorCWRlc3RpbmF0aW9uIHJlY3RhbmdsZS4gVGhlIHdpZHRoL2hlaWdodCBtZW1iZXJzIG9mIHRoZSBkZXN0aW5hdGlvbgorCXJlY3RhbmdsZSBhcmUgaWdub3JlZCwgb25seSB0aGUgcG9zaXRpb24gaXMgdXNlZC4KKworCVRoZSBvbGQgc291cmNlIGNsaXBwaW5nIGZ1bmN0aW9uIFNETF9TZXRDbGlwcGluZygpIGhhcyBiZWVuIHJlcGxhY2VkCisJd2l0aCBhIG1vcmUgdXNlZnVsIGZ1bmN0aW9uIHRvIHNldCB0aGUgZGVzdGluYXRpb24gY2xpcHBpbmcgcmVjdGFuZ2xlOgorCQlTRExfYm9vbCBTRExfU2V0Q2xpcFJlY3QoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFNETF9SZWN0ICpyZWN0KQorCQkKKwlBZGRlZCBhIGZ1bmN0aW9uIHRvIHNlZSB3aGF0IHN1YnN5c3RlbXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkOgorCQlVaW50MzIgU0RMX1dhc0luaXQoVWludDMyIGZsYWdzKQorCisJVGhlIEJpZyBBbHBoYSBGbGlwOiBTREwgbm93IHRyZWF0cyBhbHBoYSBhcyBvcGFjaXR5IGxpa2UgZXZlcnlib2R5CisJZWxzZSwgYW5kIG5vdCBhcyB0cmFuc3BhcmVuY3k6CisKKwlBIG5ldyBjcHAgc3ltYm9sOiBTRExfQUxQSEFfT1BBUVVFIGlzIGRlZmluZWQgYXMgMjU1CisJQSBuZXcgY3BwIHN5bWJvbDogU0RMX0FMUEhBX1RSQU5TUEFSRU5UIGlzIGRlZmluZWQgYXMgMAorCVZhbHVlcyBiZXR3ZWVuIDAgYW5kIDI1NSB2YXJ5IGZyb20gZnVsbHkgdHJhbnNwYXJlbnQgdG8gZnVsbHkgb3BhcXVlLgorCisJTmV3IGZ1bmN0aW9uczoKKwlTRExfRGlzcGxheUZvcm1hdEFscGhhKCkKKwkgICAgUmV0dXJucyBhIHN1cmZhY2UgY29udmVydGVkIHRvIGEgZm9ybWF0IHdpdGggYWxwaGEtY2hhbm5lbAorCSAgICB0aGF0IGNhbiBiZSBibGl0IGVmZmljaWVudGx5IHRvIHRoZSBzY3JlZW4uIChJbiBvdGhlciB3b3JkcywKKwkgICAgbGlrZSBTRExfRGlzcGxheUZvcm1hdCgpIGJ1dCB0aGUgcmVzdWx0aW5nIHN1cmZhY2UgaGFzCisJICAgIGFuIGFscGhhIGNoYW5uZWwuKSAgVGhpcyBpcyB1c2VmdWwgZm9yIHN1cmZhY2VzIHdpdGggYWxwaGEuCisJU0RMX01hcFJHQkEoKQorCSAgICBXb3JrcyBhcyBTRExfTWFwUkdCKCkgYnV0IHRha2VzIGFuIGFkZGl0aW9uYWwgYWxwaGEgcGFyYW1ldGVyLgorCVNETF9HZXRSR0JBKCkKKwkgICAgV29ya3MgYXMgU0RMX0dldFJHQigpIGJ1dCBhbHNvIHJldHVybnMgdGhlIGFscGhhIHZhbHVlCisJICAgIChTRExfQUxQSEFfT1BBUVVFIGZvciBmb3JtYXRzIHdpdGhvdXQgYW4gYWxwaGEgY2hhbm5lbCkKKworCUJvdGggU0RMX0dldFJHQigpIGFuZCBTRExfR2V0UkdCQSgpIG5vdyBhbHdheXMgcmV0dXJuIHZhbHVlcyBpbgorCXRoZSBbMC4uMjU1XSBpbnRlcnZhbC4gUHJldmlvdXNseSwgU0RMX0dldFJHQigpIHdvdWxkIHJldHVybgorCSgweGY4LCAweGZjLCAweGY4KSBmb3IgYSBjb21wbGV0ZWx5IHdoaXRlIHBpeGVsIGluIFJHQjU2NSBmb3JtYXQuCisJKE4uQi46IFRoaXMgaXMgYnJva2VuIGZvciBiaXQgZmllbGRzIDwgMyBiaXRzLikKKworCVNETF9NYXBSR0IoKSByZXR1cm5zIHBpeGVscyBpbiB3aGljaCB0aGUgYWxwaGEgY2hhbm5lbCBpcyBzZXQgb3BhcXVlLgorCisJU0RMX1NldEFscGhhKCkgY2FuIG5vdyBiZSB1c2VkIGZvciBib3RoIHNldHRpbmcgdGhlIHBlci1zdXJmYWNlCisJYWxwaGEsIHVzaW5nIHRoZSBuZXcgd2F5IG9mIHRoaW5raW5nIG9mIGFscGhhLCBhbmQgYWxzbyB0byBlbmFibGUKKwlhbmQgZGlzYWJsZSBwZXItcGl4ZWwgYWxwaGEgYmxlbmRpbmcgZm9yIHN1cmZhY2VzIHdpdGggYW4gYWxwaGEKKwljaGFubmVsOgorCQlUbyBkaXNhYmxlIGFscGhhIGJsZW5kaW5nOgorCQkJU0RMX1NldEFscGhhKHN1cmZhY2UsIDAsIDApOworCQlUbyByZS1lbmFibGUgYWxwaGEgYmxlbmRpbmc6CisJCQlTRExfU2V0QWxwaGEoc3VyZmFjZSwgU0RMX1NSQ0FMUEhBLCAwKTsKKwlTdXJmYWNlcyB3aXRoIGFuIGFscGhhIGNoYW5uZWwgaGF2ZSBibGVuZGluZyBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKwlTRExfU2V0QWxwaGEoKSBub3cgYWNjZXB0cyBTRExfUkxFQUNDRUwgYXMgYSBmbGFnLCB3aGljaCByZXF1ZXN0cworCVJMRSBhY2NlbGVyYXRpb24gb2YgYmxpdHMsIGp1c3QgYXMgbGlrZSB3aXRoIFNETF9TZXRDb2xvcktleSgpLgorCVRoaXMgZmxhZyBjYW4gYmUgc2V0IGZvciBib3RoIHN1cmZhY2VzIHdpdGggYW4gYWxwaGEgY2hhbm5lbAorCWFuZCBzdXJmYWNlcyB3aXRoIGFuIGFscGhhIHZhbHVlIHNldCBieSBTRExfU2V0QWxwaGEoKS4KKwlBcyBhbHdheXMsIFJMRSBzdXJmYWNlcyBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgcGl4ZWwgYWNjZXNzIGlzCisJYWxsb3dlZCwgYW5kIHVubG9ja2VkIGJlZm9yZSBhbnkgb3RoZXIgU0RMIG9wZXJhdGlvbnMgYXJlIGRvbmUKKwlvbiBpdC4KKworCVRoZSBibGl0IHNlbWFudGljcyBmb3Igc3VyZmFjZXMgd2l0aCBhbmQgd2l0aG91dCBhbHBoYSBhbmQgY29sb3JrZXkKKwloYXZlIG5vdyBiZWVuIGRlZmluZWQ6CisKKwlSR0JBLT5SR0I6CisJICAgIFNETF9TUkNBTFBIQSBzZXQ6CisJCWFscGhhLWJsZW5kICh1c2luZyBhbHBoYS1jaGFubmVsKS4KKwkJU0RMX1NSQ0NPTE9SS0VZIGlnbm9yZWQuCisJICAgIFNETF9TUkNBTFBIQSBub3Qgc2V0OgorCQljb3B5IFJHQi4KKwkJaWYgU0RMX1NSQ0NPTE9SS0VZIHNldCwgb25seSBjb3B5IHRoZSBwaXhlbHMgbWF0Y2hpbmcgdGhlCisJCVJHQiB2YWx1ZXMgb2YgdGhlIHNvdXJjZSBjb2xvdXIga2V5LCBpZ25vcmluZyBhbHBoYSBpbiB0aGUKKwkJY29tcGFyaXNvbi4KKworCVJHQi0+UkdCQToKKwkgICAgU0RMX1NSQ0FMUEhBIHNldDoKKwkJYWxwaGEtYmxlbmQgKHVzaW5nIHRoZSBzb3VyY2UgcGVyLXN1cmZhY2UgYWxwaGEgdmFsdWUpOworCQlzZXQgZGVzdGluYXRpb24gYWxwaGEgdG8gb3BhcXVlLgorCSAgICBTRExfU1JDQUxQSEEgbm90IHNldDoKKwkJY29weSBSR0IsIHNldCBkZXN0aW5hdGlvbiBhbHBoYSB0byBvcGFxdWUuCisJICAgIGJvdGg6CisJCWlmIFNETF9TUkNDT0xPUktFWSBzZXQsIG9ubHkgY29weSB0aGUgcGl4ZWxzIG1hdGNoaW5nIHRoZQorCQlzb3VyY2UgY29sb3VyIGtleS4KKworCVJHQkEtPlJHQkE6CisJICAgIFNETF9TUkNBTFBIQSBzZXQ6CisJCWFscGhhLWJsZW5kICh1c2luZyB0aGUgc291cmNlIGFscGhhIGNoYW5uZWwpIHRoZSBSR0IgdmFsdWVzOworCQlsZWF2ZSBkZXN0aW5hdGlvbiBhbHBoYSB1bnRvdWNoZWQuIFtOb3RlOiBpcyB0aGlzIGNvcnJlY3Q/XQorCQlTRExfU1JDQ09MT1JLRVkgaWdub3JlZC4KKwkgICAgU0RMX1NSQ0FMUEhBIG5vdCBzZXQ6CisJCWNvcHkgYWxsIG9mIFJHQkEgdG8gdGhlIGRlc3RpbmF0aW9uLgorCQlpZiBTRExfU1JDQ09MT1JLRVkgc2V0LCBvbmx5IGNvcHkgdGhlIHBpeGVscyBtYXRjaGluZyB0aGUKKwkJUkdCIHZhbHVlcyBvZiB0aGUgc291cmNlIGNvbG91ciBrZXksIGlnbm9yaW5nIGFscGhhIGluIHRoZQorCQljb21wYXJpc29uLgorCisJUkdCLT5SR0I6IAorCSAgICBTRExfU1JDQUxQSEEgc2V0OgorCQlhbHBoYS1ibGVuZCAodXNpbmcgdGhlIHNvdXJjZSBwZXItc3VyZmFjZSBhbHBoYSB2YWx1ZSkuCisJICAgIFNETF9TUkNBTFBIQSBub3Qgc2V0OgorCQljb3B5IFJHQi4KKwkgICAgYm90aDoKKwkJaWYgU0RMX1NSQ0NPTE9SS0VZIHNldCwgb25seSBjb3B5IHRoZSBwaXhlbHMgbWF0Y2hpbmcgdGhlCisJCXNvdXJjZSBjb2xvdXIga2V5LgorCisJQXMgYSBzcGVjaWFsIGNhc2UsIGJsaXRzIGZyb20gc3VyZmFjZXMgd2l0aCBwZXItc3VyZmFjZSBhbHBoYQorCXZhbHVlIG9mIDEyOCAoNTAlIHRyYW5zcGFyZW5jeSkgYXJlIG9wdGltaXNlZCBhbmQgbXVjaCBmYXN0ZXIKKwl0aGFuIG90aGVyIGFscGhhIHZhbHVlcy4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byBzdXJmYWNlcyB3aXRoCisJYWxwaGEgY2hhbm5lbHMgKHBlci1waXhlbCBhbHBoYSkuCisKKwlOZXcgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlIGdhbW1hIG9mIHRoZSBkaXNwbGF5IGhhdmUKKwliZWVuIGFkZGVkOgorCQlpbnQgU0RMX1NldEdhbW1hKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpOworCQlpbnQgU0RMX1NldEdhbW1hUmFtcChVaW50OCAqcmVkLCBVaW50OCAqZ3JlZW4sIFVpbnQ4ICpibHVlKTsKKwkJaW50IFNETF9HZXRHYW1tYVJhbXAoVWludDggKnJlZCwgVWludDggKmdyZWVuLCBVaW50OCAqYmx1ZSk7CisJR2FtbWEgcmFtcHMgYXJlIHRhYmxlcyB3aXRoIDI1NiBlbnRyaWVzIHdoaWNoIG1hcCB0aGUgc2NyZWVuIGNvbG9yCisJY29tcG9uZW50cyBpbnRvIGFjdHVhbGx5IGRpc3BsYXllZCBjb2xvcnMuICBGb3IgYW4gZXhhbXBsZSBvZgorCWltcGxlbWVudGluZyBnYW1tYSBjb3JyZWN0aW9uIGFuZCBnYW1tYSBmYWRlcywgc2VlIHRlc3QvdGVzdGdhbW1hLmMKKwlHYW1tYSBjb250cm9sIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIGhhcmR3YXJlLgorCisxLjEuNDoKKwlUaGUgc2l6ZSBvZiB0aGUgU0RMX0NEdHJhY2sgc3RydWN0dXJlIGNoYW5nZWQgZnJvbSA4IHRvIDEyIGJ5dGVzCisJYXMgdGhlIHNpemUgb2YgdGhlIGxlbmd0aCBtZW1iZXIgd2FzIGV4dGVuZGVkIHRvIDMyIGJpdHMuCisKKyAgICAgICAgWW91IGNhbiBub3cgdXNlIFNETCBmb3IgMkQgYmxpdHRpbmcgd2l0aCBhIEdMIG1vZGUgYnkgcGFzc2luZyB0aGUKKwlTRExfT1BFTkdMQkxJVCBmbGFnIHRvIFNETF9TZXRWaWRlb01vZGUoKS4gIFlvdSBjYW4gc3BlY2lmeSAxNiBvcgorCTMyIGJwcCwgYW5kIHRoZSBkYXRhIGluIHRoZSBmcmFtZWJ1ZmZlciBpcyBwdXQgaW50byB0aGUgR0wgc2NlbmUKKwl3aGVuIHlvdSBjYWxsIFNETF9VcGRhdGVSZWN0cygpLCBhbmQgdGhlIHNjZW5lIHdpbGwgYmUgdmlzaWJsZQorCXdoZW4geW91IGNhbGwgU0RMX0dMX1N3YXBCdWZmZXJzKCkuCisKKwlSdW4gdGhlICJ0ZXN0Z2wiIHRlc3QgcHJvZ3JhbSB3aXRoIHRoZSAtbG9nbyBjb21tYW5kIGxpbmUgb3B0aW9uCisJdG8gc2VlIGFuIGV4YW1wbGUgb2YgdGhpcyBibGVuZGluZyBvZiAyRCBhbmQgM0QgaW4gU0RMLgorCisxLjEuMzoKKwlBZGRlZCBTRExfRnJlZVJXKCkgdG8gdGhlIEFQSSwgdG8gY29tcGxlbWVudCBTRExfQWxsb2NSVygpCisKKwlBZGRlZCByZXNpemFibGUgd2luZG93IHN1cHBvcnQgLSBqdXN0IGFkZCBTRExfUkVTSVpBQkxFIHRvIHRoZQorCVNETF9TZXRWaWRlb01vZGUoKSBmbGFncywgYW5kIHRoZW4gd2FpdCBmb3IgU0RMX1ZJREVPUkVTSVpFIGV2ZW50cy4KKwlTZWUgU0RMX2V2ZW50cy5oIGZvciBkZXRhaWxzIG9uIHRoZSBuZXcgU0RMX1Jlc2l6ZUV2ZW50IHN0cnVjdHVyZS4KKworCUFkZGVkIGNvbmRpdGlvbiB2YXJpYWJsZSBzdXBwb3J0LCBiYXNlZCBvbiBtdXRleGVzIGFuZCBzZW1hcGhvcmVzLgorCQlTRExfQ3JlYXRlQ29uZCgpCisJCVNETF9EZXN0cm95Q29uZCgpCisJCVNETF9Db25kU2lnbmFsKCkKKwkJU0RMX0NvbmRCcm9hZGNhc3QoKQorCQlTRExfQ29uZFdhaXQoKQorCQlTRExfQ29uZFRpbWVkV2FpdCgpCisJVGhlIG5ldyBmdW5jdGlvbiBwcm90b3R5cGVzIGFyZSBpbiBTRExfbXV0ZXguaAorCisJQWRkZWQgY291bnRpbmcgc2VtYXBob3JlIHN1cHBvcnQsIGJhc2VkIG9uIHRoZSBtdXRleCBwcmltaXRpdmUuCisJCVNETF9DcmVhdGVTZW1hcGhvcmUoKQorCQlTRExfRGVzdHJveVNlbWFwaG9yZSgpCisJCVNETF9TZW1XYWl0KCkKKwkJU0RMX1NlbVRyeVdhaXQoKQorCQlTRExfU2VtV2FpdFRpbWVvdXQoKQorCQlTRExfU2VtUG9zdCgpCisJCVNETF9TZW1WYWx1ZSgpCisJVGhlIG5ldyBmdW5jdGlvbiBwcm90b3R5cGVzIGFyZSBpbiBTRExfbXV0ZXguaAorCisJQWRkZWQgc3VwcG9ydCBmb3IgYXN5bmNocm9ub3VzIGJsaXR0aW5nLiAgVG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcywKKwl5b3UgbXVzdCBzZXQgdGhlIFNETF9BU1lOQ0JMSVQgZmxhZyB3aGVuIHNldHRpbmcgdGhlIHZpZGVvIG1vZGUgYW5kCisJY3JlYXRpbmcgc3VyZmFjZXMgdGhhdCB5b3Ugd2FudCBhY2NlbGVyYXRlZCBpbiB0aGlzIHdheS4gIFlvdSBtdXN0CisJbG9jayBzdXJmYWNlcyB0aGF0IGhhdmUgdGhpcyBmbGFnIHNldCwgYW5kIHRoZSBsb2NrIHdpbGwgYmxvY2sgdW50aWwKKwlhbnkgcXVldWVkIGJsaXRzIGhhdmUgY29tcGxldGVkLgorCisJQWRkZWQgWVVWIHZpZGVvIG92ZXJsYXkgc3VwcG9ydC4KKwlUaGUgc3VwcG9ydGVkIFlVViBmb3JtYXRzIGFyZTogWVYxMiwgSVlVViwgWVVZMiwgVVlWWSwgYW5kIFlWWVUuCisJVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuIG92ZXJsYXkgc3VyZmFjZToKKwkJU0RMX0NyZWF0ZVlVVk92ZXJsYXkoKQorCVlvdSBtdXN0IGxvY2sgYW5kIHVubG9jayB0aGUgb3ZlcmxheSB0byBnZXQgYWNjZXNzIHRvIHRoZSBkYXRhOgorCQlTRExfTG9ja1lVVk92ZXJsYXkoKSBTRExfVW5sb2NrWVVWT3ZlcmxheSgpCisJWW91IGNhbiB0aGVuIGRpc3BsYXkgdGhlIG92ZXJsYXk6CisJCVNETF9EaXNwbGF5WVVWT3ZlcmxheSgpCisJWW91IG11c3QgZnJlZSB0aGUgb3ZlcmxheSB3aGVuIHlvdSBhcmUgZG9uZSB1c2luZyBpdDoKKwkJU0RMX0ZyZWVZVVZPdmVybGF5KCkKKwlTZWUgU0RMX3ZpZGVvLmggZm9yIHRoZSBmdWxsIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisKKwlUaGUgam95c3RpY2sgaGF0IHBvc2l0aW9uIGNvbnN0YW50cyBoYXZlIGJlZW4gY2hhbmdlZDoKKwlPbGQgY29uc3RhbnQgICAgICAgICAgICBOZXcgY29uc3RhbnQKKwktLS0tLS0tLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tLS0KKwkgICAgIDAgICAgICAgICAgICAgICAgICBTRExfSEFUX0NFTlRFUkVECisJICAgICAxICAgICAgICAgICAgICAgICAgU0RMX0hBVF9VUAorCSAgICAgMiAgICAgICAgICAgICAgICAgIFNETF9IQVRfUklHSFRVUAorCSAgICAgMyAgICAgICAgICAgICAgICAgIFNETF9IQVRfUklHSFQKKwkgICAgIDQgICAgICAgICAgICAgICAgICBTRExfSEFUX1JJR0hURE9XTgorCSAgICAgNSAgICAgICAgICAgICAgICAgIFNETF9IQVRfRE9XTgorCSAgICAgNiAgICAgICAgICAgICAgICAgIFNETF9IQVRfTEVGVERPV04KKwkgICAgIDcgICAgICAgICAgICAgICAgICBTRExfSEFUX0xFRlQKKwkgICAgIDggICAgICAgICAgICAgICAgICBTRExfSEFUX0xFRlRVUAorCVRoZSBuZXcgY29uc3RhbnRzIGFyZSBiaXRtYXNrcywgc28geW91IGNhbiBjaGVjayBmb3IgdGhlCisJaW5kaXZpZHVhbCBheGVzIGxpa2UgdGhpczoKKwkJaWYgKCBoYXRfcG9zaXRpb24gJiBTRExfSEFUX1VQICkgeworCQl9CisJYW5kIHlvdSdsbCBjYXRjaCBsZWZ0LXVwLCB1cCwgYW5kIHJpZ2h0LXVwLgorCisxLjEuMjoKKwlBZGRlZCBtdWx0aXBsZSB0aW1lciBzdXBwb3J0OgorCQlTRExfQWRkVGltZXIoKSBhbmQgU0RMX1JlbW92ZVRpbWVyKCkKKworCVNETF9XTV9TZXRJY29uKCkgbm93IHJlc3BlY3RzIHRoZSBpY29uIGNvbG9ya2V5IGlmIG1hc2sgaXMgTlVMTC4KKworMS4xLjA6CisJQWRkZWQgaW5pdGlhbCBPcGVuR0wgc3VwcG9ydC4KKwlGaXJzdCBzZXQgR0wgYXR0cmlidXRlcyAoc3VjaCBhcyBSR0IgZGVwdGgsIGFscGhhIGRlcHRoLCBldGMuKQorCQlTRExfR0xfU2V0QXR0cmlidXRlKCkKKwlUaGVuIGNhbGwgU0RMX1NldFZpZGVvTW9kZSgpIHdpdGggdGhlIFNETF9PUEVOR0wgZmxhZy4KKwlQZXJmb3JtIGFsbCBvZiB5b3VyIG5vcm1hbCBHTCBkcmF3aW5nLgorCUZpbmFsbHkgc3dhcCB0aGUgYnVmZmVycyB3aXRoIHRoZSBuZXcgU0RMIGZ1bmN0aW9uOgorCQlTRExfR0xfU3dhcEJ1ZmZlcnMoKQorCVNlZSB0aGUgbmV3ICd0ZXN0Z2wnIHRlc3QgcHJvZ3JhbSBmb3IgYW4gZXhhbXBsZSBvZiB1c2luZyBHTCB3aXRoIFNETC4KKworCVlvdSBjYW4gbG9hZCBHTCBleHRlbnNpb24gZnVuY3Rpb25zIGJ5IHVzaW5nIHRoZSBmdW5jdGlvbjoKKwkJU0RMX0dMX0xvYWRQcm9jQWRkcmVzcygpCisKKwlBZGRlZCBmdW5jdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgY2xlYW51cCBzcGVjaWZpYyBTREwgc3Vic3lzdGVtczoKKwkJU0RMX0luaXRTdWJTeXN0ZW0oKSBhbmQgU0RMX1F1aXRTdWJTeXN0ZW0oKQorCisJQWRkZWQgdXNlci1kZWZpbmVkIGV2ZW50IHR5cGU6CisJCXR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgCQlVaW50OCB0eXBlOworICAgICAgICAJCWludCBjb2RlOworICAgICAgICAJCXZvaWQgKmRhdGExOworICAgICAgICAJCXZvaWQgKmRhdGEyOworCQl9IFNETF9Vc2VyRXZlbnQ7CisJVGhpcyBzdHJ1Y3R1cmUgaXMgaW4gdGhlICJ1c2VyIiBtZW1iZXIgb2YgYW4gU0RMX0V2ZW50LgorCisJQWRkZWQgYSBmdW5jdGlvbiB0byBwdXNoIGV2ZW50cyBpbnRvIHRoZSBldmVudCBxdWV1ZToKKwkJU0RMX1B1c2hFdmVudCgpCisKKwlFeGFtcGxlIG9mIHVzaW5nIHRoZSBuZXcgU0RMIHVzZXItZGVmaW5lZCBldmVudHM6CisJeworCQlTRExfRXZlbnQgZXZlbnQ7CisKKwkJZXZlbnQudHlwZSA9IFNETF9VU0VSRVZFTlQ7CisJCWV2ZW50LnVzZXIuY29kZSA9IG15X2V2ZW50X2NvZGU7CisJCWV2ZW50LnVzZXIuZGF0YTEgPSBzaWduaWZpY2FudF9kYXRhOworCQlldmVudC51c2VyLmRhdGEyID0gMDsKKwkJU0RMX1B1c2hFdmVudCgmZXZlbnQpOworCX0KKworCUFkZGVkIGEgZnVuY3Rpb24gdG8gZ2V0IG1vdXNlIGRlbHRhcyBzaW5jZSBsYXN0IHF1ZXJ5OgorCQlTRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlKCkKKworCUFkZGVkIGEgYm9vbGVhbiBkYXRhdHlwZSB0byBTRExfdHlwZXMuaDoKKwkJU0RMX2Jvb2wgPSB7IFNETF9UUlVFLCBTRExfRkFMU0UgfQorCisJQWRkZWQgYSBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgYXVkaW8gc3RhdHVzOgorCQlTRExfR2V0QXVkaW9TdGF0ZSgpOworCUl0IHJldHVybnMgb25lIG9mOgorCQlTRExfQVVESU9fU1RPUFBFRCwKKwkJU0RMX0FVRElPX1BMQVlJTkcsCisJCVNETF9BVURJT19QQVVTRUQKKworCUFkZGVkIGFuIEFBbGliIGRyaXZlciAoQVNDSUkgQXJ0KSAtIGJ5IFN0ZXBoYW5lIFBldGVyLgorCisxLjAuNjoKKwlUaGUgaW5wdXQgZ3JhYiBzdGF0ZSBpcyByZXNldCBhZnRlciBlYWNoIGNhbGwgdG8gU0RMX1NldFZpZGVvTW9kZSgpLgorCVRoZSBpbnB1dCBpcyBncmFiYmVkIGJ5IGRlZmF1bHQgaW4gZnVsbHNjcmVlbiBtb2RlLCBhbmQgdW5ncmFiYmVkIGluCisJd2luZG93ZWQgbW9kZS4gIElmIHlvdSB3YW50IHRvIHNldCBpbnB1dCBncmFiIHRvIGEgcGFydGljdWxhciB2YWx1ZSwKKwl5b3Ugc2hvdWxkIHNldCBpdCBhZnRlciBlYWNoIGNhbGwgdG8gU0RMX1NldFZpZGVvTW9kZSgpLgorCisxLjAuNToKKwlFeHBvc2VkIFNETF9BdWRpb0luaXQoKSwgU0RMX1ZpZGVvSW5pdCgpCisJQWRkZWQgU0RMX0F1ZGlvRHJpdmVyTmFtZSgpIGFuZCBTRExfVmlkZW9Ecml2ZXJOYW1lKCkKKworCUFkZGVkIG5ldyB3aW5kb3cgbWFuYWdlciBmdW5jdGlvbjoKKwkJU0RMX1dNX1RvZ2dsZUZ1bGxTY3JlZW4oKQorCVRoaXMgaXMgY3VycmVudGx5IGltcGxlbWVudGVkIG9ubHkgb24gTGludXgKKworCVRoZSBBTFQtRU5URVIgY29kZSBoYXMgYmVlbiByZW1vdmVkIC0gaXQncyBub3QgYXBwcm9wcmlhdGUgZm9yIGEKKwlsaWIgdG8gYmluZCBrZXlzIHdoZW4gdGhleSBhcmVuJ3QgZXZlbiBlbWVyZ2VuY3kgZXNjYXBlIHNlcXVlbmNlcy4KKworCUFMVC1FTlRFUiBmdW5jdGlvbmFsaXR5IGNhbiBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29kZToKKworCWludCBIYW5kbGVfQWx0RW50ZXIoY29uc3QgU0RMX0V2ZW50ICpldmVudCkKKwl7CisJICAgIGlmICggZXZlbnQtPnR5cGUgPT0gU0RMX0tFWURPV04gKSB7CisJICAgICAgICBpZiAoIChldmVudC0+a2V5LmtleXN5bS5zeW0gPT0gU0RMS19SRVRVUk4pICYmCisJICAgICAgICAgICAgIChldmVudC0+a2V5LmtleXN5bS5tb2QgJiBLTU9EX0FMVCkgKSB7ICAgCisJICAgICAgICAgICAgICAgIFNETF9XTV9Ub2dnbGVGdWxsU2NyZWVuKFNETF9HZXRWaWRlb1N1cmZhY2UoKSk7CisJICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwkgICAgICAgIH0KKwkgICAgfQorCSAgICByZXR1cm4oMSk7CisJfQorCVNETF9TZXRFdmVudEZpbHRlcihIYW5kbGVfQWx0RW50ZXIpOworCisxLjAuMzoKKwlVbmRlciBYMTEsIGlmIHlvdSBncmFiIHRoZSBpbnB1dCBhbmQgaGlkZSB0aGUgbW91c2UgY3Vyc29yLAorCXRoZSBtb3VzZSB3aWxsIGdvIGludG8gYSAicmVsYXRpdmUgbW90aW9uIiBtb2RlIHdoZXJlIHlvdQorCXdpbGwgYWx3YXlzIGdldCByZWxhdGl2ZSBtb3Rpb24gZXZlbnRzIG5vIG1hdHRlciBob3cgZmFyIGluCisJZWFjaCBkaXJlY3Rpb24geW91IG1vdmUgdGhlIG1vdXNlIC0gcmVsYXRpdmUgbW90aW9uIGlzIG5vdAorCWJvdW5kZWQgYnkgdGhlIGVkZ2VzIG9mIHRoZSB3aW5kb3cgKHRob3VnaCB0aGUgYWJzb2x1dGUgdmFsdWVzCisJb2YgdGhlIG1vdXNlIHBvc2l0aW9ucyBhcmUgY2xhbXBlZCBieSB0aGUgc2l6ZSBvZiB0aGUgd2luZG93KS4KKwlUaGUgU1ZHQWxpYiwgZnJhbWVidWZmZXIgY29uc29sZSwgYW5kIERpcmVjdElucHV0IGRyaXZlcnMgYWxsCisJaGF2ZSB0aGlzIGJlaGF2aW9yIG5hdHVyYWxseSwgYW5kIHRoZSBHREkgYW5kIEJXaW5kb3cgZHJpdmVycworCW5ldmVyIGdvIGludG8gInJlbGF0aXZlIG1vdGlvbiIgbW9kZS4KKworMS4wLjI6CisJQWRkZWQgYSBmdW5jdGlvbiB0byBlbmFibGUga2V5Ym9hcmQgcmVwZWF0OgorCQlTRExfRW5hYmxlS2V5UmVwZWF0KCkKKworCUFkZGVkIGEgZnVuY3Rpb24gdG8gZ3JhYiB0aGUgbW91c2UgYW5kIGtleWJvYXJkIGlucHV0CisJCVNETF9XTV9HcmFiSW5wdXQoKQorCisJQWRkZWQgYSBmdW5jdGlvbiB0byBpY29uaWZ5IHRoZSB3aW5kb3cuCisJCVNETF9XTV9JY29uaWZ5V2luZG93KCkKKwlJZiB0aGlzIGZ1bmN0aW9uIHN1Y2NlZWRzLCB0aGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIGFuIGV2ZW50CisJc2lnbmFsaW5nIFNETF9BUFBBQ1RJVkUgZXZlbnQgCisKKzEuMC4xOgorCUFkZGVkIGNvbnN0YW50cyB0byBTRExfYXVkaW8uaCBmb3IgMTYtYml0IG5hdGl2ZSBieXRlIG9yZGVyaW5nOgorCQlBVURJT19VMTZTWVMsIEFVRElPX1MxNlNZUworCisxLjAuMDoKKwlOZXcgcHVibGljIHJlbGVhc2UKKworVmVyc2lvbiAwLjExOgorCiswLjExLjU6CisJQSBuZXcgZnVuY3Rpb24gU0RMX0dldFZpZGVvU3VyZmFjZSgpIGhhcyBiZWVuIGFkZGVkLCBhbmQgcmV0dXJucworCWEgcG9pbnRlciB0byB0aGUgY3VycmVudCBkaXNwbGF5IHN1cmZhY2UuCisKKwlTRExfQWxsb2NTdXJmYWNlKCkgaGFzIGJlZW4gcmVuYW1lZCBTRExfQ3JlYXRlUkdCU3VyZmFjZSgpLCBhbmQKKwlhIG5ldyBmdW5jdGlvbiBTRExfQ3JlYXRlUkdCU3VyZmFjZUZyb20oKSBoYXMgYmVlbiBhZGRlZCB0byBhbGxvdworCWNyZWF0aW5nIGFuIFNETCBzdXJmYWNlIGZyb20gYW4gZXhpc3RpbmcgcGl4ZWwgZGF0YSBidWZmZXIuCisKKwlBZGRlZCBTRExfR2V0UkdCKCkgdG8gdGhlIGhlYWRlcnMgYW5kIGRvY3VtZW50YXRpb24uCisKKzAuMTEuNDoKKwlTRExfU2V0TGlicmFyeVBhdGgoKSBpcyBubyBsb25nZXIgbWVhbmluZ2Z1bCwgYW5kIGhhcyBiZWVuIHJlbW92ZWQuCisKKzAuMTEuMzoKKwlBIG5ldyBmbGFnIGZvciBTRExfSW5pdCgpLCBTRExfSU5JVF9OT1BBUkFDSFVURSwgcHJldmVudHMgU0RMIGZyb20KKwlpbnN0YWxsaW5nIGZhdGFsIHNpZ25hbCBoYW5kbGVycyBvbiBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IHN1cHBvcnQKKwl0aGVtLgorCitWZXJzaW9uIDAuOToKKworMC45LjE1OgorCVNETF9DcmVhdGVDb2xvckN1cnNvcigpIGhhcyBiZWVuIHJlbW92ZWQuICBDb2xvciBjdXJzb3JzIHNob3VsZAorCWJlIGltcGxlbWVudGVkIGFzIHNwcml0ZXMsIGJsaXR0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdoZW4gdGhlCisJY3Vyc29yIG1vdmVzLiAgVG8gZ2V0IHNtb290aCBjb2xvciBjdXJzb3IgdXBkYXRlcyB3aGVuIHRoZSBhcHAKKwlpcyBidXN5LCBwYXNzIHRoZSBTRExfSU5JVF9FVkVOVFRIUkVBRCBmbGFnIHRvIFNETF9Jbml0KCkuICBUaGlzCisJYWxsb3dzIHlvdSB0byBoYW5kbGUgdGhlIG1vdXNlIG1vdGlvbiBpbiBhbm90aGVyIHRocmVhZCBmcm9tIGFuCisJZXZlbnQgZmlsdGVyIGZ1bmN0aW9uLCBidXQgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5IExpbnV4CisJYW5kIEJlT1MuICBOb3RlIHRoYXQgeW91J2xsIGhhdmUgdG8gcHJvdGVjdCB0aGUgZGlzcGxheSBzdXJmYWNlCisJZnJvbSBtdWx0aS10aHJlYWRlZCBhY2Nlc3MgYnkgdXNpbmcgbXV0ZXhlcyBpZiB5b3UgZG8gdGhpcy4KKworCVRocmVhZC1zYWZlIHN1cmZhY2Ugc3VwcG9ydCBoYXMgYmVlbiByZW1vdmVkIGZyb20gU0RMLgorCVRoaXMgbWFrZXMgYmxpdHRpbmcgc29tZXdoYXQgZmFzdGVyLCBieSByZW1vdmluZyBTRExfTWlkZGxlQmxpdCgpLgorCUNvZGUgdGhhdCB1c2VkIFNETF9NaWRkbGVCbGl0KCkgc2hvdWxkIHVzZSBTRExfTG93ZXJCbGl0KCkgaW5zdGVhZC4KKwlZb3UgY2FuIG1ha2UgeW91ciBzdXJmYWNlcyB0aHJlYWQtc2FmZSBieSBhbGxvY2F0aW5nIHlvdXIgb3duCisJbXV0ZXggYW5kIG1ha2luZyBsb2NrL3VubG9jayBjYWxscyBhcm91bmQgYWNjZXNzZXMgdG8geW91ciBzdXJmYWNlLgorCiswLjkuMTQ6CisJU0RMX0dldE1vdXNlU3RhdGUoKSBub3cgdGFrZXMgcG9pbnRlcnMgdG8gaW50IHJhdGhlciB0aGFuIFVpbnQxNi4KKworCUlmIHlvdSBzZXQgdGhlIFNETF9XSU5ET1dJRCBlbnZpcm9ubWVudCB2YXJpYWJsZSB1bmRlciBVTklYIFgxMSwKKwlTREwgd2lsbCB1c2UgdGhhdCBhcyB0aGUgbWFpbiB3aW5kb3cgaW5zdGVhZCBvZiBjcmVhdGluZyBpdCdzIG93bi4KKwlUaGlzIGlzIGFuIHVuc3VwcG9ydGVkIGV4dGVuc2lvbiB0byBTREwsIGFuZCBub3QgcG9ydGFibGUgYXQgYWxsLgorCiswLjkuMTM6CisJQWRkZWQgYSBmdW5jdGlvbiBTRExfU2V0TGlicmFyeVBhdGgoKSB3aGljaCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisJdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBTREwgZHluYW1pYyBsaWJyYXJpZXMuICBUaGlzIGlzIHVzZWZ1bAorCWZvciBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucyB3aGljaCBzaGlwIHdpdGggcGFydGljdWxhciB2ZXJzaW9ucworCW9mIHRoZSBsaWJyYXJpZXMsIGFuZCBmb3Igc2VjdXJpdHkgb24gbXVsdGktdXNlciBzeXN0ZW1zLgorCUlmIHRoaXMgZnVuY3Rpb24gaXMgbm90IHVzZWQsIHRoZSBkZWZhdWx0IHN5c3RlbSBkaXJlY3RvcmllcyBhcmUgCisJc2VhcmNoZWQgdXNpbmcgdGhlIG5hdGl2ZSBkeW5hbWljIG9iamVjdCBsb2FkaW5nIG1lY2hhbmlzbS4KKworCUluIG9yZGVyIHRvIHN1cHBvcnQgQyBsaW5rYWdlIHVuZGVyIFZpc3VhbCBDKyssIHlvdSBtdXN0IGRlY2xhcmUKKwltYWluKCkgd2l0aG91dCBhbnkgcmV0dXJuIHR5cGU6CisJCW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworCQkJLyogRG8gdGhlIHByb2dyYW0uLi4gKi8KKwkJCXJldHVybigwKTsKKwkJfQorCUMrKyBwcm9ncmFtcyBzaG91bGQgYWxzbyByZXR1cm4gYSB2YWx1ZSBpZiBjb21waWxlZCB1bmRlciBWQysrLgorCisJVGhlIGJsaXRfZW5kaWFuIG1lbWJlciBvZiB0aGUgU0RMX1ZpZGVvSW5mbyBzdHJ1Y3QgaGFzIGJlZW4gcmVtb3ZlZC4KKworCVNETF9TeW1Ub0FTQ0lJKCkgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBTRExfR2V0S2V5TmFtZSgpLCBzbyB0aGVyZQorCWlzIG5vdyBubyBsb25nZXIgYW55IGZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBhIGtleXN5bSB0byBhIGNoYXJhY3Rlci4KKworCVRoZSBTRExfa2V5c3ltIHN0cnVjdHVyZSBoYXMgYmVlbiBleHRlbmRlZCB3aXRoIGEgJ3NjYW5jb2RlJyBhbmQKKwkndW5pY29kZScgbWVtYmVyLiAgVGhlICdzY2FuY29kZScgaXMgYSBoYXJkd2FyZSBzcGVjaWZpYyBzY2FuY29kZQorCWZvciB0aGUga2V5IHRoYXQgd2FzIHByZXNzZWQsIGFuZCBtYXkgYmUgMC4gIFRoZSAndW5pY29kZScgbWVtYmVyCisJaXMgYSAxNi1iaXQgVU5JQ09ERSB0cmFuc2xhdGlvbiBvZiB0aGUga2V5IHRoYXQgd2FzIHByZXNzZWQgYWxvbmcKKwl3aXRoIGFueSBtb2RpZmllcnMgb3IgY29tcG9zZSBrZXlzIHRoYXQgaGF2ZSBiZWVuIHByZXNzZWQuCisJSWYgbm8gVU5JQ09ERSB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBrZXksICd1bmljb2RlJyB3aWxsIGJlIDAuCisKKwlBZGRlZCBhIGZ1bmN0aW9uIFNETF9FbmFibGVVTklDT0RFKCkgdG8gZW5hYmxlL2Rpc2FibGUgVU5JQ09ERQorCXRyYW5zbGF0aW9uIG9mIGNoYXJhY3RlciBrZXlwcmVzc2VzLiAgVHJhbnNsYXRpb24gZGVmYXVsdHMgb2ZmLgorCisJVG8gY29udmVydCBleGlzdGluZyBjb2RlIHRvIHVzZSB0aGUgbmV3IEFQSSwgY2hhbmdlIGNvZGUgd2hpY2gKKwl1c2VzIFNETF9TeW1Ub0FTQ0lJKCkgdG8gZ2V0IHRoZSBrZXluYW1lIHRvIHVzZSBTRExfR2V0S2V5TmFtZSgpLAorCWFuZCBjaGFuZ2UgY29kZSB3aGljaCB1c2VzIGl0IHRvIGdldCB0aGUgQVNDSUkgdmFsdWUgb2YgYSBzeW0gdG8KKwl1c2UgdGhlICd1bmljb2RlJyBtZW1iZXIgb2YgdGhlIGV2ZW50IGtleXN5bS4KKworMC45LjEyOgorCVRoZXJlIGlzIHBhcnRpYWwgc3VwcG9ydCBmb3IgNjQtYml0IGRhdGF0eXBlcy4gIEkgZG9uJ3QgcmVjb21tZW5kIAorCXlvdSB1c2UgdGhpcyBpZiB5b3UgaGF2ZSBhIGNob2ljZSwgYmVjYXVzZSA2NC1iaXQgZGF0YXR5cGVzIGFyZSBub3QKKwlzdXBwb3J0ZWQgb24gbWFueSBwbGF0Zm9ybXMuICBPbiBwbGF0Zm9ybXMgZm9yIHdoaWNoIGl0IGlzIHN1cHBvcnRlZCwKKwl0aGUgU0RMX0hBU182NEJJVF9UWVBFIEMgcHJlcHJvY2Vzc29yIGRlZmluZSB3aWxsIGJlIGVuYWJsZWQsIGFuZAorCXlvdSBjYW4gdXNlIHRoZSBVaW50NjQgYW5kIFNpbnQ2NCBkYXRhdHlwZXMuCisKKwlBZGRlZCBmdW5jdGlvbnMgdG8gU0RMX2VuZGlhbi5oIHRvIHN1cHBvcnQgNjQtYml0IGRhdGF0eXBlczoKKwkgICAgU0RMX1N3YXBMRTY0KCksIFNETF9Td2FwQkU2NCgpLAorCSAgICBTRExfUmVhZExFNjQoKSwgU0RMX1JlYWRCRTY0KCksIFNETF9Xcml0ZUxFNjQoKSwgU0RMX1dyaXRlQkU2NCgpCisKKwlBIG5ldyBtZW1iZXIgImxlbl9yYXRpbyIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFNETF9BdWRpb0NWVCBzdHJ1Y3R1cmUsCisJYW5kIGFsbG93cyB5b3UgdG8gZGV0ZXJtaW5lIGVpdGhlciB0aGUgb3JpZ2luYWwgYnVmZmVyIGxlbmd0aCBvciB0aGUKKwljb252ZXJ0ZWQgYnVmZmVyIGxlbmd0aCwgZ2l2ZW4gdGhlIG90aGVyLgorCisJQSBuZXcgZnVuY3Rpb24gU0RMX0ZyZWVXQVYoKSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgQVBJIHRvIGZyZWUgZGF0YQorCWFsbG9jYXRlZCBieSBTRExfTG9hZFdBVl9SVygpLiAgVGhpcyBpcyBuZWNlc3NhcnkgdW5kZXIgV2luMzIgc2luY2UKKwl0aGUgZ2NjIGNvbXBpbGVkIERMTCB1c2VzIGEgZGlmZmVyZW50IGhlYXAgdGhhbiBWQysrIGNvbXBpbGVkIGFwcHMuCisKKwlTREwgbm93IGhhcyBpbml0aWFsIHN1cHBvcnQgZm9yIGludGVybmF0aW9uYWwga2V5Ym9hcmRzIHVzaW5nIHRoZQorCUxhdGluIGNoYXJhY3RlciBzZXQuCisJSWYgYSBwYXJ0aWN1bGFyIG1hcHBpbmcgaXMgZGVzaXJlZCwgeW91IGNhbiBzZXQgdGhlIERFRkFVTFRfS0VZQk9BUkQKKwljb21waWxlLXRpbWUgdmFyaWFibGUsIG9yIHlvdSBjYW4gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAKKwkiU0RMX0tFWUJPQVJEIiB0byBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUga2V5Ym9hcmQgbWFwcGluZyB5b3UgZGVzaXJlLgorCVRoZSB2YWxpZCB2YWx1ZXMgZm9yIHRoZXNlIHZhcmlhYmxlcyBjYW4gYmUgZm91bmQgaW4gU0RMX2tleWJvYXJkLmMKKworCUZ1bGwgc3VwcG9ydCBmb3IgR2VybWFuIGFuZCBGcmVuY2gga2V5Ym9hcmRzIHVuZGVyIFgxMSBpcyBpbXBsZW1lbnRlZC4KKworMC45LjExOgorCVRoZSBUSFJFQURFRF9FVkVOVFMgY29tcGlsZS10aW1lIGRlZmluZSBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIHRoZQorCVNETF9JTklUX0VWRU5UVEhSRUFEIGZsYWcuICBJZiB0aGlzIGZsYWcgaXMgcGFzc2VkIHRvIFNETF9Jbml0KCksCisJU0RMIHdpbGwgY3JlYXRlIGEgc2VwYXJhdGUgdGhyZWFkIHRvIHBlcmZvcm0gaW5wdXQgZXZlbnQgaGFuZGxpbmcuCisJSWYgdGhpcyBmbGFnIGlzIHBhc3NlZCB0byBTRExfSW5pdCgpLCBhbmQgdGhlIE9TIGRvZXNuJ3Qgc3VwcG9ydCAKKwlldmVudCBoYW5kbGluZyBpbiBhIHNlcGFyYXRlIHRocmVhZCwgU0RMX0luaXQoKSB3aWxsIGZhaWwuCisJQmUgc3VyZSB0byBhZGQgY2FsbHMgdG8gU0RMX0RlbGF5KCkgaW4geW91ciBtYWluIHRocmVhZCB0byBhbGxvdworCXRoZSBPUyB0byBzY2hlZHVsZSB5b3VyIGV2ZW50IHRocmVhZCwgb3IgaXQgbWF5IHN0YXJ2ZSwgbGVhZGluZworCXRvIHNsb3cgZXZlbnQgZGVsaXZlcnkgYW5kL29yIGRyb3BwZWQgZXZlbnRzLgorCUN1cnJlbnRseSBNYWNPUyBhbmQgV2luMzIgZG8gbm90IHN1cHBvcnQgdGhpcyBmbGFnLCB3aGlsZSBCZU9TIAorCWFuZCBMaW51eCBkbyBzdXBwb3J0IGl0LiAgSSByZWNvbW1lbmQgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIG9ubHkKKwl1c2UgdGhpcyBmbGFnIGlmIGFic29sdXRlbHkgbmVjZXNzYXJ5LgorCisJVGhlIFNETCB0aHJlYWQgZnVuY3Rpb24gcGFzc2VkIHRvIFNETF9DcmVhdGVUaHJlYWQoKSBub3cgcmV0dXJucyBhCisJc3RhdHVzLiAgVGhpcyBzdGF0dXMgY2FuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIGEgbm9uLU5VTEwgcG9pbnRlcgorCWFzIHRoZSAnc3RhdHVzJyBhcmd1bWVudCB0byBTRExfV2FpdFRocmVhZCgpLgorCisJVGhlIHZvbHVtZSBwYXJhbWV0ZXIgdG8gU0RMX01peEF1ZGlvKCkgaGFzIGJlZW4gaW5jcmVhc2VkIGluIHJhbmdlCisJZnJvbSAoMC04KSB0byAoMC0xMjgpCisKKwlTREwgbm93IGhhcyBhIGRhdGEgc291cmNlIGFic3RyYWN0aW9uIHdoaWNoIGNhbiBlbmNvbXBhc3MgYSBmaWxlLAorCWFuIGFyZWEgb2YgbWVtb3J5LCBvciBhbnkgY3VzdG9tIG9iamVjdCB5b3UgY2FuIGVudmlzaW9uLiAgSXQgdXNlcworCXRoZXNlIGFic3RyYWN0aW9ucywgU0RMX1JXb3BzLCBpbiB0aGUgZW5kaWFuIHJlYWQvd3JpdGUgZnVuY3Rpb25zLAorCWFuZCB0aGUgYnVpbHQtaW4gV0FWIGFuZCBCTVAgZmlsZSBsb2FkZXJzLiAgVGhpcyBtZWFucyB5b3UgY2FuIGxvYWQKKwlXQVYgY2h1bmtzIGZyb20gbWVtb3J5IG1hcHBlZCBmaWxlcywgY29tcHJlc3NlZCBhcmNoaXZlcywgbmV0d29yaworCXBpcGVzLCBvciBhbnl0aGluZyBlbHNlIHRoYXQgaGFzIGEgZGF0YSByZWFkIGFic3RyYWN0aW9uLgorCisJVGhlcmUgYXJlIHRocmVlIGJ1aWx0LWluIGRhdGEgc291cmNlIGFic3RyYWN0aW9uczoKKwkgICAgU0RMX1JXRnJvbUZpbGUoKSwgU0RMX1JXRnJvbUZQKCksIFNETF9SV0Zyb21NZW0oKQorCWFsb25nIHdpdGggYSBnZW5lcmljIGRhdGEgc291cmNlIGFsbG9jYXRpb24gZnVuY3Rpb246CisJICAgIFNETF9BbGxvY1JXKCkKKwlUaGVzZSBkYXRhIHNvdXJjZXMgY2FuIGJlIHVzZWQgbGlrZSBzdGRpbyBmaWxlIHBvaW50ZXJzIHdpdGggdGhlCisJZm9sbG93aW5nIGNvbnZlbmllbmNlIGZ1bmN0aW9uczoKKwkgICAgU0RMX1JXc2VlaygpLCBTRExfUldyZWFkKCksIFNETF9SV3dyaXRlKCksIFNETF9SV2Nsb3NlKCkKKwlUaGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIG5ldyBoZWFkZXIgZmlsZSAiU0RMX3J3b3BzLmgiCisKKwlUaGUgZW5kaWFuIHN3YXBwaW5nIGZ1bmN0aW9ucyBoYXZlIGJlZW4gdHVybmVkIGludG8gbWFjcm9zIGZvciBzcGVlZAorCWFuZCBTRExfQ2FsY3VsYXRlRW5kaWFuKCkgaGFzIGJlZW4gcmVtb3ZlZC4gIFNETF9lbmRpYW4uaCBub3cgZGVmaW5lcworCVNETF9CWVRFT1JERVIgYXMgZWl0aGVyIFNETF9CSUdfRU5ESUFOIG9yIFNETF9MSUxfRU5ESUFOIGRlcGVuZGluZyBvbgorCXRoZSBlbmRpYW5uZXNzIG9mIHRoZSBob3N0IHN5c3RlbS4KKworCVRoZSBlbmRpYW4gcmVhZC93cml0ZSBmdW5jdGlvbnMgbm93IHRha2UgYW4gU0RMX1JXb3BzIHBvaW50ZXIKKwlpbnN0ZWFkIG9mIGEgc3RkaW8gRklMRSBwb2ludGVyLCB0byBzdXBwb3J0IHRoZSBuZXcgZGF0YSBzb3VyY2UKKwlhYnN0cmFjdGlvbi4KKworCVRoZSBTRExfKkxvYWRXQVYoKSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUKKwlTRExfTG9hZFdBVl9SVygpIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBTRExfUldvcHMgcG9pbnRlciBhcyBpdCdzCisJZmlyc3QgcGFyYW1ldGVyLCBhbmQgYSBmbGFnIHdoZXRoZXIgb3Igbm90IHRvIGF1dG9tYXRpY2FsbHkgCisJZnJlZSBpdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4gIFNETF9Mb2FkV0FWKCkgaXMgYSBtYWNybyBmb3IKKwliYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCBjb252ZW5pZW5jZToKKwkgICAgU0RMX0xvYWRXQVZfUlcoU0RMX1JXRnJvbUZpbGUoInNhbXBsZS53YXYiLCAicmIiKSwgMSwgLi4uKTsKKworCVRoZSBTRExfKkxvYWRCTVAoKS9TRExfKlNhdmVCTVAoKSBmdW5jdGlvbnMgaGF2ZSBlYWNoIGJlZW4gcmVwbGFjZWQKKwl3aXRoIGEgc2luZ2xlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBTRExfUldvcHMgcG9pbnRlciBhcyBpdCdzCisJZmlyc3QgcGFyYW1ldGVyLCBhbmQgYSBmbGFnIHdoZXRoZXIgb3Igbm90IHRvIGF1dG9tYXRpY2FsbHkgCisJZnJlZSBpdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4gIFNETF9Mb2FkQk1QKCkgYW5kIFNETF9TYXZlQk1QKCkKKwlhcmUgbWFjcm9zIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCBjb252ZW5pZW5jZToKKwkgICAgU0RMX0xvYWRCTVBfUlcoU0RMX1JXRnJvbUZpbGUoInNhbXBsZS5ibXAiLCAicmIiKSwgMSwgLi4uKTsKKwkgICAgU0RMX1NhdmVCTVBfUlcoU0RMX1JXRnJvbUZpbGUoInNhbXBsZS5ibXAiLCAid2IiKSwgMSwgLi4uKTsKKwlOb3RlIHRoYXQgdGhlc2UgZnVuY3Rpb25zIHVzZSBTRExfUldzZWVrKCkgZXh0ZW5zaXZlbHksIGFuZCBzaG91bGQKKwlub3QgYmUgdXNlZCBvbiBwaXBlcyBvciBvdGhlciBub24tc2Vla2FibGUgZGF0YSBzb3VyY2VzLgorCiswLjkuMTA6CisJVGhlIExpbnV4IFNETF9TeXNXTUluZm8gYW5kIFNETF9TeXNXTU1zZyBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiAKKwlleHRlbmRlZCB0byBzdXBwb3J0IG11bHRpcGxlIHR5cGVzIG9mIGRpc3BsYXkgZHJpdmVycywgYXMgd2VsbCBhcworICAgICAgICBzYWZlIGFjY2VzcyB0byB0aGUgWDExIGRpc3BsYXkgd2hlbiBUSFJFQURFRF9FVkVOVFMgaXMgZW5hYmxlZC4KKyAgICAgICAgVGhlIG5ldyBzdHJ1Y3R1cmVzIGFyZSBkb2N1bWVudGVkIGluIHRoZSBTRExfc3lzd20uaCBoZWFkZXIgZmlsZS4KKworCVRoYW5rcyB0byBKb2huIEVsbGlvdHQgPGpjZUBzZWFzaXAuZGVtb24uY28udWs+LCB0aGUgVUsga2V5Ym9hcmQKKwlzaG91bGQgbm93IHdvcmsgcHJvcGVybHksIGFzIHdlbGwgYXMgdGhlICJXaW5kb3dzIiBrZXlzIG9uIFVTCisJa2V5Ym9hcmRzLgorCisJVGhlIExpbnV4IENELVJPTSBjb2RlIG5vdyByZWFkcyB0aGUgQ0QtUk9NIGRldmljZXMgZnJvbSAvZXRjL2ZzdGFiCisJaW5zdGVhZCBvZiB0cnlpbmcgdG8gb3BlbiBlYWNoIGJsb2NrIGRldmljZSBvbiB0aGUgc3lzdGVtLgorCVRoZSBDRCBtdXN0IGJlIGxpc3RlZCBpbiAvZXRjL2ZzdGFiIGFzIHVzaW5nIHRoZSBpc285NjYwIGZpbGVzeXN0ZW0uCisKKwlPbiBMaW51eCwgaWYgeW91IGRlZmluZSBUSFJFQURFRF9FVkVOVFMgYXQgY29tcGlsZSB0aW1lLCBhIHNlcGFyYXRlCisJdGhyZWFkIHdpbGwgYmUgc3Bhd25lZCB0byBnYXRoZXIgWCBldmVudHMgYXN5bmNocm9ub3VzbHkgZnJvbSB0aGUKKwlncmFwaGljcyB1cGRhdGVzLiAgVGhpcyBoYXNuJ3QgYmVlbiBleHRlbnNpdmVseSB0ZXN0ZWQsIGJ1dCBpdCBkb2VzCisJcHJvdmlkZSBhIG1lYW5zIG9mIGhhbmRsaW5nIGtleWJvYXJkIGFuZCBtb3VzZSBpbnB1dCBpbiBhIHNlcGFyYXRlCisJdGhyZWFkIGZyb20gdGhlIGdyYXBoaWNzIHRocmVhZC4gIChUaGlzIGlzIG5vdyBlbmFibGVkIGJ5IGRlZmF1bHQuKQorCisJQSBzcGVjaWFsIGFjY2VzcyBmdW5jdGlvbiBTRExfUGVlcEV2ZW50cygpIGFsbG93cyB5b3UgdG8gbWFuaXB1bGF0ZQorCXRoZSBldmVudCBxdWV1ZSBpbiBhIHRocmVhZC1zYWZlIG1hbm5lciwgaW5jbHVkaW5nIHBlZWtpbmcgYXQgZXZlbnRzLAorCXJlbW92aW5nIGV2ZW50cyBvZiBhIHNwZWNpZmllZCB0eXBlLCBhbmQgYWRkaW5nIG5ldyBldmVudHMgb2YgYXJiaXRyYXJ5CisJdHlwZSB0byB0aGUgcXVldWUgKHVzZSB0aGUgbmV3ICd1c2VyJyBtZW1iZXIgb2YgdGhlIFNETF9FdmVudCB0eXBlKS4KKworCUlmIHlvdSB1c2UgU0RMX1BlZXBFdmVudHMoKSB0byBnYXRoZXIgZXZlbnRzLCB0aGVuIHRoZSBtYWluIGdyYXBoaWNzCisJdGhyZWFkIG5lZWRzIHRvIGNhbGwgU0RMX1B1bXBFdmVudHMoKSBwZXJpb2RpY2FsbHkgdG8gZHJpdmUgdGhlIGV2ZW50CisJbG9vcCBhbmQgZ2VuZXJhdGUgaW5wdXQgZXZlbnRzLiAgVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGlmIFNETCBoYXMgYmVlbiAKKwljb21waWxlZCB3aXRoIFRIUkVBREVEX0VWRU5UUyBkZWZpbmVkLCBidXQgZG9lc24ndCBodXJ0LgorCisJQSBuZXcgZnVuY3Rpb24gU0RMX1RocmVhZElEKCkgcmV0dXJucyB0aGUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGgKKwl0aGUgY3VycmVudCB0aHJlYWQuCisKKzAuOS45OgorCVRoZSBBVURJT19TVEVSRU8gZm9ybWF0IGZsYWcgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIG5ldyAnY2hhbm5lbHMnCisJbWVtYmVyIG9mIHRoZSBTRExfQXVkaW9TcGVjIHN0cnVjdHVyZS4gIFRoZSBjaGFubmVscyBhcmUgMSBmb3IgbW9ubworCWF1ZGlvLCBhbmQgMiBmb3Igc3RlcmVvIGF1ZGlvLiAgSW4gdGhlIGZ1dHVyZSBtb3JlIGNoYW5uZWxzIG1heSBiZQorCXN1cHBvcnRlZCBmb3IgM0Qgc3Vycm91bmQgc291bmQuCisKKwlUaGUgU0RMX01peEF1ZGlvKCkgZnVuY3Rpb24gbm93IHRha2VzIGFuIGFkZGl0aW9uYWwgdm9sdW1lIHBhcmFtZXRlciwKKwl3aGljaCBzaG91bGQgYmUgc2V0IHRvIFNETF9NSVhfTUFYVk9MVU1FIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlCisJb3JpZ2luYWwgZnVuY3Rpb24uCisKKwlUaGUgQ0QtUk9NIGZ1bmN0aW9ucyB3aGljaCB0YWtlIGEgJ2Nkcm9tJyBwYXJhbWV0ZXIgY2FuIG5vdyBiZQorCXBhc3NlZCBOVUxMLCBhbmQgd2lsbCBhY3Qgb24gdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IG9wZW5lZCBDRC1ST00uCisKKzAuOS44OgorCU5vIGNoYW5nZXMsIGJ1Z2ZpeGVzIG9ubHkuCisJCiswLjkuNzoKKwlObyBjaGFuZ2VzLCBidWdmaXhlcyBvbmx5LgorCQorMC45LjY6CisJQWRkZWQgYSBmYXN0IHJlY3RhbmdsZSBmaWxsIGZ1bmN0aW9uOiBTRExfRmlsbFJlY3QoKQorCisJQWRkaXRpb24gb2YgYSB1c2VmdWwgZnVuY3Rpb24gZm9yIGdldHRpbmcgaW5mbyBvbiB0aGUgdmlkZW8gaGFyZHdhcmU6CisJICAgIGNvbnN0IFNETF9WaWRlb0luZm8gKlNETF9HZXRWaWRlb0luZm8odm9pZCkKKyAgICAgICAgVGhpcyBmdW5jdGlvbiByZXBsYWNlcyBTRExfR2V0RGlzcGxheUZvcm1hdCgpLgorCisJSW5pdGlhbCBzdXBwb3J0IGZvciBkb3VibGUtYnVmZmVyaW5nOgorCSAgVXNlIHRoZSBTRExfRE9VQkxFQlVGIGZsYWcgaW4gU0RMX1NldFZpZGVvTW9kZSgpCisJICBVcGRhdGUgdGhlIHNjcmVlbiB3aXRoIGEgbmV3IGZ1bmN0aW9uOiBTRExfRmxpcCgpCisKKwlTRExfQWxsb2NTdXJmYWNlKCkgdGFrZXMgdHdvIG5ldyBmbGFnczoKKwlTRExfU1JDQ09MT1JLRVkgbWVhbnMgdGhhdCB0aGUgc3VyZmFjZSB3aWxsIGJlIHVzZWQgZm9yIGNvbG9ya2V5IGJsaXRzCisJICBhbmQgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBvZiBjb2xvcmtleSBibGl0cworCSAgYmV0d2VlbiB0d28gc3VyZmFjZXMgaW4gdmlkZW8gbWVtb3J5LCB0byBwbGFjZSB0aGUgc3VyZmFjZSBpbiB2aWRlbworCSAgbWVtb3J5IGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBwbGFjZWQgaW4gc3lzdGVtIG1lbW9yeS4KKwlTRExfU1JDQUxQSEEgbWVhbnMgdGhhdCB0aGUgc3VyZmFjZSB3aWxsIGJlIHVzZWQgZm9yIGFscGhhIGJsaXRzIGFuZAorCSAgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBvZiBhbHBoYSBibGl0cyBiZXR3ZWVuCisJICB0d28gc3VyZmFjZXMgaW4gdmlkZW8gbWVtb3J5LCB0byBwbGFjZSB0aGUgc3VyZmFjZSBpbiB2aWRlbyBtZW1vcnkKKwkgIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBwbGFjZWQgaW4gc3lzdGVtIG1lbW9yeS4KKwlTRExfSFdTVVJGQUNFIG5vdyBtZWFucyB0aGF0IHRoZSBzdXJmYWNlIHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSAKKwkgIHNhbWUgZm9ybWF0IGFzIHRoZSBkaXNwbGF5IHN1cmZhY2UsIHNpbmNlIGhhdmluZyBzdXJmYWNlcyBpbiB2aWRlbworCSAgbWVtb3J5IGlzIG9ubHkgdXNlZnVsIGZvciBmYXN0IGJsaXR0aW5nIHRvIHRoZSBzY3JlZW4sIGFuZCB5b3UgY2FuJ3QKKwkgIGJsaXQgc3VyZmFjZXMgd2l0aCBkaWZmZXJlbnQgc3VyZmFjZSBmb3JtYXRzIGluIHZpZGVvIG1lbW9yeS4KKworMC45LjU6CisJWW91IGNhbiBub3cgcGFzcyBhIE5VTEwgbWFzayB0byBTRExfV01fU2V0SWNvbigpLCBhbmQgaXQgd2lsbCBhc3N1bWUKKwl0aGF0IHRoZSBpY29uIGNvbnNpc3RzIG9mIHRoZSBlbnRpcmUgaW1hZ2UuCisKKwlTRExfTG93ZXJCbGl0KCkgaXMgYmFjayAtLSBidXQgZG9uJ3QgdXNlIGl0IG9uIHRoZSBkaXNwbGF5IHN1cmZhY2UuCisJSXQgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBTRExfTWlkZGxlQmxpdCgpLCBidXQgZG9lc24ndCBjaGVjayBmb3IKKwl0aHJlYWQgc2FmZXR5LgorCisJQWRkZWQgU0RMX0ZQTG9hZEJNUCgpLCBTRExfRlBTYXZlQk1QKCksIFNETF9GUExvYWRXQVYoKSwgd2hpY2ggdGFrZQorCWEgRklMRSBwb2ludGVyIGluc3RlYWQgb2YgYSBmaWxlIG5hbWUuCisKKwlBZGRlZCBDRC1ST00gYXVkaW8gY29udHJvbCBBUEk6CisJICAgIFNETF9DRE51bURyaXZlcygpCisJICAgIFNETF9DRE5hbWUoKQorCSAgICBTRExfQ0RPcGVuKCkKKwkgICAgU0RMX0NEU3RhdHVzKCkKKwkgICAgU0RMX0NEUGxheVRyYWNrcygpCisJICAgIFNETF9DRFBsYXkoKQorCSAgICBTRExfQ0RQYXVzZSgpCisJICAgIFNETF9DRFJlc3VtZSgpCisJICAgIFNETF9DRFN0b3AoKQorCSAgICBTRExfQ0RFamVjdCgpCisJICAgIFNETF9DRENsb3NlKCkKKworMC45LjQ6CisJTm8gY2hhbmdlcywgYnVnZml4ZXMgb25seS4KKworMC45LjM6CisJTW91c2UgbW90aW9uIGV2ZW50IG5vdyBpbmNsdWRlcyByZWxhdGl2ZSBtb3Rpb24gaW5mb3JtYXRpb246CisJICAgIFNpbnQxNiBldmVudC0+bW90aW9uLnhyZWwsIFNpbnQxNiBldmVudC0+bW90aW9uLnlyZWwKKworCVgxMSBrZXlyZXBlYXQgaGFuZGxpbmcgY2FuIGJlIGRpc2FibGVkIGJ5IGRlZmluaW5nIElHTk9SRV9YX0tFWVJFUEVBVAorCSAgICAoQWRkIC1ESUdOT1JFX1hfS0VZUkVQRUFUIHRvIENGTEFHUyBsaW5lIGluIG9iai94MTFNYWtlZmlsZSkKKworMC45LjI6CisJTm8gY2hhbmdlcywgYnVnZml4ZXMgb25seS4KKworMC45LjE6CisJUmVtb3ZlZCBTRExfTWFwU3VyZmFjZSgpIGFuZCBTRExfVW5tYXBTdXJmYWNlKCkgLS0gc3VyZmFjZXMgYXJlIG5vdworCWF1dG9tYXRpY2FsbHkgbWFwcGVkIG9uIGJsaXQuCisKKzAuOC4wOgorCVNETCBzdGFibGUgcmVsZWFzZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETC9JbmZvLUZyYW1ld29yay5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvSW5mby1GcmFtZXdvcmsucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjYmY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvSW5mby1GcmFtZXdvcmsucGxpc3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+U0RMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPmh0dHA6Ly93d3cubGlic2RsLm9yZzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPlNETDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz5TaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXI8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkZNV0s8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4xLjIuMTQ8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz5TRExYPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMi4xNDwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvU0RMLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML1NETC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkYmU4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML1NETC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsMTk2MSBAQAorLy8gISQqVVRGOCokIQoreworCWFyY2hpdmVWZXJzaW9uID0gMTsKKwljbGFzc2VzID0geworCX07CisJb2JqZWN0VmVyc2lvbiA9IDQ2OworCW9iamVjdHMgPSB7CisKKy8qIEJlZ2luIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCisJCTAwMzIzNTRGMTA3MDkzMTcwMEM3NjUxNyAvKiBHZW5lcmF0ZSBEb3h5Z2VuIERvY1NldCAqLyA9IHsKKwkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDMyMzU1NzEwNzA5MzM1MDBDNzY1MTcgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIkdlbmVyYXRlIERveHlnZW4gRG9jU2V0IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTAwMzIzNTRFMTA3MDkzMTcwMEM3NjUxNyAvKiBTaGVsbFNjcmlwdCAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJHZW5lcmF0ZSBEb3h5Z2VuIERvY1NldCI7CisJCQlwcm9kdWN0TmFtZSA9ICJHZW5lcmF0ZSBEb3h5Z2VuIERvY1NldCI7CisJCX07CisvKiBFbmQgUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJMDAxNEI3RUYwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2FldmVudHMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCN0U5MDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhZXZlbnRzLmMgKi87IH07CisJCTAwMTRCN0YxMDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhbW91c2UuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCN0VCMDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhbW91c2UuYyAqLzsgfTsKKwkJMDAxNEI3RjIwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2F2aWRlby5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI3RUMwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2F2aWRlby5jICovOyB9OworCQkwMDE0QjdGNDA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYWV2ZW50c19jLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0QjdFODA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYWV2ZW50c19jLmggKi87IH07CisJCTAwMTRCN0Y1MDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhZXZlbnRzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0QjdFOTA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYWV2ZW50cy5jICovOyB9OworCQkwMDE0QjdGNjA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYW1vdXNlX2MuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCN0VBMDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhbW91c2VfYy5oICovOyB9OworCQkwMDE0QjdGNzA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYW1vdXNlLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0QjdFQjA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYW1vdXNlLmMgKi87IH07CisJCTAwMTRCN0Y4MDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhdmlkZW8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCN0VDMDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhdmlkZW8uYyAqLzsgfTsKKwkJMDAxNEI3RjkwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2F2aWRlby5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI3RUQwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2F2aWRlby5oICovOyB9OworCQkwMDE0Qjg0RjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWRnYS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4MzgwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkZ2EuYyAqLzsgfTsKKwkJMDAxNEI4NTAwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkeW4uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODM5MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZHluLmMgKi87IH07CisJCTAwMTRCODUzMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZXZlbnRzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0QjgzQzA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWV2ZW50cy5jICovOyB9OworCQkwMDE0Qjg1NTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdhbW1hLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0QjgzRTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdhbW1hLmMgKi87IH07CisJCTAwMTRCODU3MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2wuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODQwMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2wuYyAqLzsgfTsKKwkJMDAxNEI4NTkwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFpbWFnZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NDIwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFpbWFnZS5jICovOyB9OworCQkwMDE0Qjg1QjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vZGVzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg0NDA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vZGVzLmMgKi87IH07CisJCTAwMTRCODVEMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW91c2UuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODQ2MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW91c2UuYyAqLzsgfTsKKwkJMDAxNEI4NUYwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF2aWRlby5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NDgwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF2aWRlby5jICovOyB9OworCQkwMDE0Qjg2MjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXdtLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg0QjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXdtLmMgKi87IH07CisJCTAwMTRCODY0MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExeXV2LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg0RDA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXl1di5jICovOyB9OworCQkwMDE0Qjg2NTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWRnYV9jLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0QjgzNzA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWRnYV9jLmggKi87IH07CisJCTAwMTRCODY2MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZGdhLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0QjgzODA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWRnYS5jICovOyB9OworCQkwMDE0Qjg2NzA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWR5bi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4MzkwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkeW4uYyAqLzsgfTsKKwkJMDAxNEI4NjgwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkeW4uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODNBMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZHluLmggKi87IH07CisJCTAwMTRCODY5MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZXZlbnRzX2MuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODNCMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZXZlbnRzX2MuaCAqLzsgfTsKKwkJMDAxNEI4NkEwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFldmVudHMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODNDMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZXZlbnRzLmMgKi87IH07CisJCTAwMTRCODZCMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2FtbWFfYy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4M0QwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFnYW1tYV9jLmggKi87IH07CisJCTAwMTRCODZDMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2FtbWEuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODNFMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2FtbWEuYyAqLzsgfTsKKwkJMDAxNEI4NkQwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFnbF9jLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0QjgzRjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdsX2MuaCAqLzsgfTsKKwkJMDAxNEI4NkUwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFnbC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NDAwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFnbC5jICovOyB9OworCQkwMDE0Qjg2RjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWltYWdlX2MuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODQxMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExaW1hZ2VfYy5oICovOyB9OworCQkwMDE0Qjg3MDA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWltYWdlLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg0MjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWltYWdlLmMgKi87IH07CisJCTAwMTRCODcxMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW9kZXNfYy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NDMwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFtb2Rlc19jLmggKi87IH07CisJCTAwMTRCODcyMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW9kZXMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODQ0MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW9kZXMuYyAqLzsgfTsKKwkJMDAxNEI4NzMwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFtb3VzZV9jLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg0NTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vdXNlX2MuaCAqLzsgfTsKKwkJMDAxNEI4NzQwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFtb3VzZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NDYwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFtb3VzZS5jICovOyB9OworCQkwMDE0Qjg3NTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXN5bS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NDcwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFzeW0uaCAqLzsgfTsKKwkJMDAxNEI4NzYwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF2aWRlby5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NDgwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF2aWRlby5jICovOyB9OworCQkwMDE0Qjg3NzA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXZpZGVvLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg0OTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXZpZGVvLmggKi87IH07CisJCTAwMTRCODc4MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExd21fYy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NEEwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF3bV9jLmggKi87IH07CisJCTAwMTRCODc5MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExd20uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODRCMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExd20uYyAqLzsgfTsKKwkJMDAxNEI4N0EwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF5dXZfYy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NEMwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF5dXZfYy5oICovOyB9OworCQkwMDE0Qjg3QjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXl1di5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4NEQwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF5dXYuYyAqLzsgfTsKKwkJMDAxNEI4OTIwOUMwREE5NDAwM0E5OUQ1IC8qIFhGODZER0EuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODkwMDlDMERBOTQwMDNBOTlENSAvKiBYRjg2REdBLmMgKi87IH07CisJCTAwMTRCODkzMDlDMERBOTQwMDNBOTlENSAvKiBYRjg2REdBMi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4OTEwOUMwREE5NDAwM0E5OUQ1IC8qIFhGODZER0EyLmMgKi87IH07CisJCTAwMTRCODk0MDlDMERBOTQwMDNBOTlENSAvKiBYRjg2REdBLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg5MDA5QzBEQTk0MDAzQTk5RDUgLyogWEY4NkRHQS5jICovOyB9OworCQkwMDE0Qjg5NTA5QzBEQTk0MDAzQTk5RDUgLyogWEY4NkRHQTIuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODkxMDlDMERBOTQwMDNBOTlENSAvKiBYRjg2REdBMi5jICovOyB9OworCQkwMDE0Qjg5NzA5QzBEQUExMDAzQTk5RDUgLyogWEY4NlZNb2RlLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg5NjA5QzBEQUExMDAzQTk5RDUgLyogWEY4NlZNb2RlLmMgKi87IH07CisJCTAwMTRCODk4MDlDMERBQTEwMDNBOTlENSAvKiBYRjg2Vk1vZGUuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTRCODk2MDlDMERBQTEwMDNBOTlENSAvKiBYRjg2Vk1vZGUuYyAqLzsgfTsKKwkJMDAxNEI4OUIwOUMwREFBRTAwM0E5OUQ1IC8qIFh2LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg5OTA5QzBEQUFFMDAzQTk5RDUgLyogWHYuYyAqLzsgfTsKKwkJMDAxNEI4OUQwOUMwREFBRTAwM0E5OUQ1IC8qIFh2LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg5OTA5QzBEQUFFMDAzQTk5RDUgLyogWHYuYyAqLzsgfTsKKwkJMDAxNEI4OUUwOUMwREFBRTAwM0E5OUQ1IC8qIFh2bGliaW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg5QTA5QzBEQUFFMDAzQTk5RDUgLyogWHZsaWJpbnQuaCAqLzsgfTsKKwkJMDAxNEI4QTAwOUMwREFCOTAwM0E5OUQ1IC8qIFhpbmVyYW1hLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg5RjA5QzBEQUI5MDAzQTk5RDUgLyogWGluZXJhbWEuYyAqLzsgfTsKKwkJMDAxNEI4QTEwOUMwREFCOTAwM0E5OUQ1IC8qIFhpbmVyYW1hLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0Qjg5RjA5QzBEQUI5MDAzQTk5RDUgLyogWGluZXJhbWEuYyAqLzsgfTsKKwkJMDAxNEI4QTMwOUMwREFDNDAwM0E5OUQ1IC8qIHhtZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNEI4QTIwOUMwREFDNDAwM0E5OUQ1IC8qIHhtZS5jICovOyB9OworCQkwMDE0QjhBNDA5QzBEQUM0MDAzQTk5RDUgLyogeG1lLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE0QjhBMjA5QzBEQUM0MDAzQTk5RDUgLyogeG1lLmMgKi87IH07CisJCTAwMTYyRDQ0MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnX2RyZWFtY2FzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJEMzIwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWdfZHJlYW1jYXN0LmggKi87IH07CisJCTAwMTYyRDQ1MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnX21hY29zLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQzMzA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19tYWNvcy5oICovOyB9OworCQkwMDE2MkQ0NjA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19tYWNvc3guaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDM0MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnX21hY29zeC5oICovOyB9OworCQkwMDE2MkQ0NzA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19vczIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDM1MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnX29zMi5oICovOyB9OworCQkwMDE2MkQ0ODA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ193aW4zMi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJEMzYwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWdfd2luMzIuaCAqLzsgfTsKKwkJMDAxNjJENDkwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDM3MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnLmggKi87IH07CisJCTAwMTYyRDRBMDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfcGxhdGZvcm0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDM4MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfcGxhdGZvcm0uaCAqLzsgfTsKKwkJMDAxNjJENEIwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9zdGRpbmMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDM5MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfc3RkaW5jLmggKi87IH07CisJCTAwMTYyRDUzMDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzY29uZC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJENEQwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNjb25kLmMgKi87IH07CisJCTAwMTYyRDU0MDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzbXV0ZXguYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDRFMDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzbXV0ZXguYyAqLzsgfTsKKwkJMDAxNjJENTYwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNzZW0uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDUwMDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzc2VtLmMgKi87IH07CisJCTAwMTYyRDU3MDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzdGhyZWFkLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ1MTA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c3RocmVhZC5jICovOyB9OworCQkwMDE2MkQ1OTA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c2NvbmQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDREMDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzY29uZC5jICovOyB9OworCQkwMDE2MkQ1QTA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c211dGV4LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ0RTA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c211dGV4LmMgKi87IH07CisJCTAwMTYyRDVCMDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzbXV0ZXhfYy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJENEYwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNtdXRleF9jLmggKi87IH07CisJCTAwMTYyRDVDMDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzc2VtLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ1MDA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c3NlbS5jICovOyB9OworCQkwMDE2MkQ1RDA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c3RocmVhZC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJENTEwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXN0aHJlYWQuYyAqLzsgfTsKKwkJMDAxNjJENUUwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXN0aHJlYWRfYy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJENTIwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXN0aHJlYWRfYy5oICovOyB9OworCQkwMDE2MkQ2MTA5QkQyMTAxMDAzN0M4RDAgLyogU0RMX3N5c3RpbWVyLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ2MDA5QkQyMTAxMDAzN0M4RDAgLyogU0RMX3N5c3RpbWVyLmMgKi87IH07CisJCTAwMTYyRDYyMDlCRDIxMDEwMDM3QzhEMCAvKiBTRExfc3lzdGltZXIuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDYwMDlCRDIxMDEwMDM3QzhEMCAvKiBTRExfc3lzdGltZXIuYyAqLzsgfTsKKwkJMDAxNjJENkIwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9nZXRlbnYuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDY1MDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfZ2V0ZW52LmMgKi87IH07CisJCTAwMTYyRDZDMDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfbWFsbG9jLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ2NjA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX21hbGxvYy5jICovOyB9OworCQkwMDE2MkQ2RDA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3Fzb3J0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ2NzA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3Fzb3J0LmMgKi87IH07CisJCTAwMTYyRDZFMDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfc3RkbGliLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ2ODA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3N0ZGxpYi5jICovOyB9OworCQkwMDE2MkQ2RjA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3N0cmluZy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJENjkwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9zdHJpbmcuYyAqLzsgfTsKKwkJMDAxNjJENzAwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9nZXRlbnYuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDY1MDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfZ2V0ZW52LmMgKi87IH07CisJCTAwMTYyRDcxMDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfbWFsbG9jLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ2NjA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX21hbGxvYy5jICovOyB9OworCQkwMDE2MkQ3MjA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3Fzb3J0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ2NzA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3Fzb3J0LmMgKi87IH07CisJCTAwMTYyRDczMDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfc3RkbGliLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQ2ODA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3N0ZGxpYi5jICovOyB9OworCQkwMDE2MkQ3NDA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3N0cmluZy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJENjkwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9zdHJpbmcuYyAqLzsgfTsKKwkJMDAxNjJEQTQwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9jb25maWdfZHJlYW1jYXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQzMjA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTAwMTYyREE1MDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY29uZmlnX21hY29zLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQzMzA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19tYWNvcy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQTYwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9jb25maWdfbWFjb3N4LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQzNDA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19tYWNvc3guaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTAwMTYyREE3MDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY29uZmlnX29zMi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJEMzUwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWdfb3MyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRBODA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2NvbmZpZ193aW4zMi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJEMzYwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWdfd2luMzIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTAwMTYyREE5MDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY29uZmlnLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkQzNzA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQUEwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9wbGF0Zm9ybS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJEMzgwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9wbGF0Zm9ybS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQUIwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9zdGRpbmMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRDM5MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfc3RkaW5jLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRBQzA5QkQyMjJGMDAzN0M4RDAgLyogYmVnaW5fY29kZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RTUwMTE5MUQyQjdGMDAwMDAxIC8qIGJlZ2luX2NvZGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTAwMTYyREFEMDlCRDIyMkYwMDM3QzhEMCAvKiBjbG9zZV9jb2RlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQzVBRjVFNjAxMTkxRDJCN0YwMDAwMDEgLyogY2xvc2VfY29kZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQUUwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9hY3RpdmUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBDNUFGNUU3MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfYWN0aXZlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRBRjA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2F1ZGlvLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQzVBRjVFODAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX2F1ZGlvLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRCMDA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2J5dGVvcmRlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RTkwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9ieXRlb3JkZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTAwMTYyREIxMDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY2Ryb20uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBDNUFGNUVBMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfY2Ryb20uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTAwMTYyREIyMDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY29weWluZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RUIwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9jb3B5aW5nLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRCMzA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2NwdWluZm8uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyQ0Y4REM0MDVDNDQ0RTQwMEU1REM3RiAvKiBTRExfY3B1aW5mby5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQjQwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9lbmRpYW4uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBDNUFGNUVDMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfZW5kaWFuLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRCNTA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2Vycm9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQzVBRjVFRDAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX2Vycm9yLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRCNjA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2V2ZW50cy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RUUwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9ldmVudHMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTAwMTYyREI3MDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfZ2V0ZW52LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQzVBRjVFRjAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX2dldGVudi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQjgwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9qb3lzdGljay5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RjAwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9qb3lzdGljay5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQjkwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9rZXlib2FyZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RjEwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9rZXlib2FyZC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQkEwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9rZXlzeW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBDNUFGNUYyMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfa2V5c3ltLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRCQjA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2xvYWRzby5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjI5QTI5MEQwNEU1QjI4NzAwQTgwMDAyIC8qIFNETF9sb2Fkc28uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTAwMTYyREJDMDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfbWFpbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RjMwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9tYWluLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRCRDA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX21vdXNlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQzVBRjVGNDAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX21vdXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRCRTA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX211dGV4LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQzVBRjVGNTAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX211dGV4LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRCRjA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX25hbWUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyQ0Y4REM3MDVDNDQ1MDUwMEU1REM3RiAvKiBTRExfbmFtZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQzAwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9vcGVuZ2wuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBDNUFGNUY2MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfb3BlbmdsLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRDMTA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3F1aXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBDNUFGNUY3MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfcXVpdC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQzIwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9yd29wcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RjgwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9yd29wcy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQzMwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9zeXN3bS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RjkwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9zeXN3bS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQzQwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF90aHJlYWQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBDNUFGNUZBMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfdGhyZWFkLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRDNTA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3RpbWVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQzVBRjVGQjAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX3RpbWVyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRDNjA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3R5cGVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQzVBRjVGQzAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX3R5cGVzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkwMDE2MkRDNzA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3ZlcnNpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBDNUFGNUZEMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfdmVyc2lvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQzgwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF92aWRlby5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RkUwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF92aWRlby5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJEQzkwOUJEMjIyRjAwMzdDOEQwIC8qIFNETC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM1QUY1RkYwMTE5MUQyQjdGMDAwMDAxIC8qIFNETC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMDAxNjJFNjgwOUJEMjczMDAwMzdDOEQwIC8qIFNETF9taXhlcl9NTVguYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwQjdFNjFGMDk3RjJEOUUwMDgyNjEyMSAvKiBTRExfbWl4ZXJfTU1YLmMgKi87IH07CisJCTAwMTYyRTZBMDlCRDI3MzYwMDM3QzhEMCAvKiBTRExfbWl4ZXJfTU1YLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMEI3RTYxRjA5N0YyRDlFMDA4MjYxMjEgLyogU0RMX21peGVyX01NWC5jICovOyB9OworCQkwMDE2MkU2QjA5QkQyNzM3MDAzN0M4RDAgLyogU0RMX21peGVyX01NWC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDBCN0U2MjAwOTdGMkQ5RTAwODI2MTIxIC8qIFNETF9taXhlcl9NTVguaCAqLzsgfTsKKwkJMDAxNjJGM0IwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsZXZlbnRzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkYzNDA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGxldmVudHMuYyAqLzsgfTsKKwkJMDAxNjJGM0QwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsbW91c2UuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRjM2MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbG1vdXNlLmMgKi87IH07CisJCTAwMTYyRjNGMDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbHZpZGVvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkYzODA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGx2aWRlby5jICovOyB9OworCQkwMDE2MkY0MTA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGxldmVudHMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRjM0MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbGV2ZW50cy5jICovOyB9OworCQkwMDE2MkY0MjA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGxldmVudHNfYy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAxNjJGMzUwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsZXZlbnRzX2MuaCAqLzsgfTsKKwkJMDAxNjJGNDMwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsbW91c2UuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRjM2MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbG1vdXNlLmMgKi87IH07CisJCTAwMTYyRjQ0MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbG1vdXNlX2MuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRjM3MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbG1vdXNlX2MuaCAqLzsgfTsKKwkJMDAxNjJGNDUwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsdmlkZW8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMTYyRjM4MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbHZpZGVvLmMgKi87IH07CisJCTAwMTYyRjQ2MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbHZpZGVvLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDE2MkYzOTA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGx2aWRlby5oICovOyB9OworCQkwMDJGMzI4NjA5Q0EwNDkxMDBFQkVCODggLyogU0RMX2ljb252LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzI4NTA5Q0EwNDkxMDBFQkVCODggLyogU0RMX2ljb252LmMgKi87IH07CisJCTAwMkYzMjg3MDlDQTA0OTEwMEVCRUI4OCAvKiBTRExfaWNvbnYuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzMjg1MDlDQTA0OTEwMEVCRUI4OCAvKiBTRExfaWNvbnYuYyAqLzsgfTsKKwkJMDAyRjMyRDcwOUNBMEJFNzAwRUJFQjg4IC8qIFNETF9kaXNrYXVkaW8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzMkQ0MDlDQTBCRTcwMEVCRUI4OCAvKiBTRExfZGlza2F1ZGlvLmMgKi87IH07CisJCTAwMkYzMkQ5MDlDQTBCRTcwMEVCRUI4OCAvKiBTRExfZGlza2F1ZGlvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzJENDA5Q0EwQkU3MDBFQkVCODggLyogU0RMX2Rpc2thdWRpby5jICovOyB9OworCQkwMDJGMzJEQTA5Q0EwQkU3MDBFQkVCODggLyogU0RMX2Rpc2thdWRpby5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMyRDUwOUNBMEJFNzAwRUJFQjg4IC8qIFNETF9kaXNrYXVkaW8uaCAqLzsgfTsKKwkJMDAyRjMyRTUwOUNBMEJGNjAwRUJFQjg4IC8qIFNETF9kdW1teWF1ZGlvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzJFMjA5Q0EwQkY2MDBFQkVCODggLyogU0RMX2R1bW15YXVkaW8uYyAqLzsgfTsKKwkJMDAyRjMyRTcwOUNBMEJGNjAwRUJFQjg4IC8qIFNETF9kdW1teWF1ZGlvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzJFMjA5Q0EwQkY2MDBFQkVCODggLyogU0RMX2R1bW15YXVkaW8uYyAqLzsgfTsKKwkJMDAyRjMyRTgwOUNBMEJGNjAwRUJFQjg4IC8qIFNETF9kdW1teWF1ZGlvLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzJFMzA5Q0EwQkY2MDBFQkVCODggLyogU0RMX2R1bW15YXVkaW8uaCAqLzsgfTsKKwkJMDA0QzJDOEIwOTc1RTEzMzAwRTlENDMwIC8qIEF1ZGlvRmlsZVBsYXllci5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA0QzJDODYwOTc1RTEzMzAwRTlENDMwIC8qIEF1ZGlvRmlsZVBsYXllci5jICovOyB9OworCQkwMDRDMkM4QzA5NzVFMTMzMDBFOUQ0MzAgLyogQXVkaW9GaWxlUmVhZGVyVGhyZWFkLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDRDMkM4NzA5NzVFMTMzMDBFOUQ0MzAgLyogQXVkaW9GaWxlUmVhZGVyVGhyZWFkLmMgKi87IH07CisJCTAwNEMyQzhEMDk3NUUxMzMwMEU5RDQzMCAvKiBDRFBsYXllci5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA0QzJDODgwOTc1RTEzMzAwRTlENDMwIC8qIENEUGxheWVyLmMgKi87IH07CisJCTAwNEMyQzhFMDk3NUUxMzMwMEU5RDQzMCAvKiBTRExPU1hDQUd1YXJkLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDRDMkM4OTA5NzVFMTMzMDBFOUQ0MzAgLyogU0RMT1NYQ0FHdWFyZC5jICovOyB9OworCQkwMDRDMkM5MDA5NzVFMTMzMDBFOUQ0MzAgLyogQXVkaW9GaWxlUGxheWVyLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDRDMkM4NjA5NzVFMTMzMDBFOUQ0MzAgLyogQXVkaW9GaWxlUGxheWVyLmMgKi87IH07CisJCTAwNEMyQzkxMDk3NUUxMzMwMEU5RDQzMCAvKiBBdWRpb0ZpbGVSZWFkZXJUaHJlYWQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNEMyQzg3MDk3NUUxMzMwMEU5RDQzMCAvKiBBdWRpb0ZpbGVSZWFkZXJUaHJlYWQuYyAqLzsgfTsKKwkJMDA0QzJDOTIwOTc1RTEzMzAwRTlENDMwIC8qIENEUGxheWVyLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDRDMkM4ODA5NzVFMTMzMDBFOUQ0MzAgLyogQ0RQbGF5ZXIuYyAqLzsgfTsKKwkJMDA0QzJDOTMwOTc1RTEzMzAwRTlENDMwIC8qIFNETE9TWENBR3VhcmQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNEMyQzg5MDk3NUUxMzMwMEU5RDQzMCAvKiBTRExPU1hDQUd1YXJkLmMgKi87IH07CisJCTAwNEMyQzk0MDk3NUUxMzMwMEU5RDQzMCAvKiBTRExPU1hDQUd1YXJkLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDRDMkM4QTA5NzVFMTMzMDBFOUQ0MzAgLyogU0RMT1NYQ0FHdWFyZC5oICovOyB9OworCQkwMDczMTdBMjA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Ub29sYm94LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxNzlCMDg1OERFQ0QwMEIyQkMzMiAvKiBBdWRpb1Rvb2xib3guZnJhbWV3b3JrICovOyB9OworCQkwMDczMTdBMzA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Vbml0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxNzlDMDg1OERFQ0QwMEIyQkMzMiAvKiBBdWRpb1VuaXQuZnJhbWV3b3JrICovOyB9OworCQkwMDczMTdBNDA4NThERUNEMDBCMkJDMzIgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA3MzE3OUQwODU4REVDRDAwQjJCQzMyIC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDA3MzE3QTUwODU4REVDRDAwQjJCQzMyIC8qIENvcmVBdWRpby5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDczMTc5RTA4NThERUNEMDBCMkJDMzIgLyogQ29yZUF1ZGlvLmZyYW1ld29yayAqLzsgfTsKKwkJMDA3MzE3QTYwODU4REVDRDAwQjJCQzMyIC8qIElPS2l0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxNzlGMDg1OERFQ0QwMEIyQkMzMiAvKiBJT0tpdC5mcmFtZXdvcmsgKi87IH07CisJCTAwNzMxN0E3MDg1OERFQ0QwMEIyQkMzMiAvKiBPcGVuR0wuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA3MzE3QTAwODU4REVDRDAwQjJCQzMyIC8qIE9wZW5HTC5mcmFtZXdvcmsgKi87IH07CisJCTAwNzMxN0E5MDg1OERFQ0QwMEIyQkMzMiAvKiBBdWRpb1Rvb2xib3guZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA3MzE3OUIwODU4REVDRDAwQjJCQzMyIC8qIEF1ZGlvVG9vbGJveC5mcmFtZXdvcmsgKi87IH07CisJCTAwNzMxN0FBMDg1OERFQ0QwMEIyQkMzMiAvKiBBdWRpb1VuaXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA3MzE3OUMwODU4REVDRDAwQjJCQzMyIC8qIEF1ZGlvVW5pdC5mcmFtZXdvcmsgKi87IH07CisJCTAwNzMxN0FCMDg1OERFQ0QwMEIyQkMzMiAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDczMTc5RDA4NThERUNEMDBCMkJDMzIgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDczMTdBQzA4NThERUNEMDBCMkJDMzIgLyogQ29yZUF1ZGlvLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxNzlFMDg1OERFQ0QwMEIyQkMzMiAvKiBDb3JlQXVkaW8uZnJhbWV3b3JrICovOyB9OworCQkwMDczMTdBRDA4NThERUNEMDBCMkJDMzIgLyogSU9LaXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA3MzE3OUYwODU4REVDRDAwQjJCQzMyIC8qIElPS2l0LmZyYW1ld29yayAqLzsgfTsKKwkJMDA3MzE3QUUwODU4REVDRDAwQjJCQzMyIC8qIE9wZW5HTC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDczMTdBMDA4NThERUNEMDBCMkJDMzIgLyogT3BlbkdMLmZyYW1ld29yayAqLzsgfTsKKwkJMDA3MzE3QUYwODU4REVDRDAwQjJCQzMyIC8qIFF1aWNrVGltZS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDczMTdBMTA4NThERUNEMDBCMkJDMzIgLyogUXVpY2tUaW1lLmZyYW1ld29yayAqLzsgfTsKKwkJMDA3MzE3QjAwODU4REVDRDAwQjJCQzMyIC8qIEF1ZGlvVG9vbGJveC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDczMTc5QjA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Ub29sYm94LmZyYW1ld29yayAqLzsgfTsKKwkJMDA3MzE3QjEwODU4REVDRDAwQjJCQzMyIC8qIEF1ZGlvVW5pdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDczMTc5QzA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Vbml0LmZyYW1ld29yayAqLzsgfTsKKwkJMDA3MzE3QjIwODU4REVDRDAwQjJCQzMyIC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxNzlEMDg1OERFQ0QwMEIyQkMzMiAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwNzMxN0IzMDg1OERFQ0QwMEIyQkMzMiAvKiBDb3JlQXVkaW8uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA3MzE3OUUwODU4REVDRDAwQjJCQzMyIC8qIENvcmVBdWRpby5mcmFtZXdvcmsgKi87IH07CisJCTAwNzMxN0I0MDg1OERFQ0QwMEIyQkMzMiAvKiBJT0tpdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDczMTc5RjA4NThERUNEMDBCMkJDMzIgLyogSU9LaXQuZnJhbWV3b3JrICovOyB9OworCQkwMDczMTdCNTA4NThERUNEMDBCMkJDMzIgLyogT3BlbkdMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxN0EwMDg1OERFQ0QwMEIyQkMzMiAvKiBPcGVuR0wuZnJhbWV3b3JrICovOyB9OworCQkwMDczMTdCNjA4NThERUNEMDBCMkJDMzIgLyogUXVpY2tUaW1lLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxN0ExMDg1OERFQ0QwMEIyQkMzMiAvKiBRdWlja1RpbWUuZnJhbWV3b3JrICovOyB9OworCQkwMDczMTdDMzA4NThFMTUwMDBCMkJDMzIgLyogQ2FyYm9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxN0MxMDg1OEUxNTAwMEIyQkMzMiAvKiBDYXJib24uZnJhbWV3b3JrICovOyB9OworCQkwMDczMTdDNDA4NThFMTUwMDBCMkJDMzIgLyogQ2FyYm9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxN0MxMDg1OEUxNTAwMEIyQkMzMiAvKiBDYXJib24uZnJhbWV3b3JrICovOyB9OworCQkwMEQwRDAyMzEwNjc1ODIzMDA0QjA1RUYgLyogU0RMX1F1YXJ0eldNLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMEQwRDAyMjEwNjc1ODIzMDA0QjA1RUYgLyogU0RMX1F1YXJ0eldNLmggKi87IH07CisJCTAwRDBEMDg0MTA2NzVERDkwMDRCMDVFRiAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMEQwRDA4MzEwNjc1REQ5MDA0QjA1RUYgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQkwMEQwRDBEODEwNjc1RTQ2MDA0QjA1RUYgLyogQ2FyYm9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzMxN0MxMDg1OEUxNTAwMEIyQkMzMiAvKiBDYXJib24uZnJhbWV3b3JrICovOyB9OworCQkwMEVBRTZGQzBDNEQzRjg0MDA5QTQyMEEgLyogU0RMX3l1dl9tbXguYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwQjdFNjI1MDk3RjJERDEwMDgyNjEyMSAvKiBTRExfeXV2X21teC5jICovOyB9OworCQkwMEVBRTZGRDBDNEQzRjg4MDA5QTQyMEEgLyogU0RMX3l1dl9tbXguYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwQjdFNjI1MDk3RjJERDEwMDgyNjEyMSAvKiBTRExfeXV2X21teC5jICovOyB9OworCQkwNDZCOTFFQzBBMTFCNTM1MDBGQjE1MUMgLyogU0RMX3N5c2xvYWRzby5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDQ2QjkxRTkwQTExQjUzNTAwRkIxNTFDIC8qIFNETF9zeXNsb2Fkc28uYyAqLzsgfTsKKwkJMDQ2QjkxRUQwQTExQjUzNTAwRkIxNTFDIC8qIFNETF9zeXNsb2Fkc28uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA0NkI5MUU5MEExMUI1MzUwMEZCMTUxQyAvKiBTRExfc3lzbG9hZHNvLmMgKi87IH07CisJCTA0NkI5MjEzMEExMUI4QUQwMEZCMTUxQyAvKiBTRExfZGxjb21wYXQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA0NkI5MjEwMEExMUI4QUQwMEZCMTUxQyAvKiBTRExfZGxjb21wYXQuYyAqLzsgfTsKKwkJMDQ2QjkyMTQwQTExQjhBRDAwRkIxNTFDIC8qIFNETF9kbGNvbXBhdC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDQ2QjkyMTAwQTExQjhBRDAwRkIxNTFDIC8qIFNETF9kbGNvbXBhdC5jICovOyB9OworCQlCRUNERjYyQjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjJGMDA4NkMzQTA3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDREY2MkUwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9hdWRpby5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzMzAwMDZENzhENjdGMDAwMDAxIC8qIFNETF9hdWRpby5jICovOyB9OworCQlCRUNERjYyRjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2F1ZGlvY3Z0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODMzMTAwNkQ3OEQ2N0YwMDAwMDEgLyogU0RMX2F1ZGlvY3Z0LmMgKi87IH07CisJCUJFQ0RGNjMwMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYXVkaW9kZXYuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4MzMyMDA2RDc4RDY3RjAwMDAwMSAvKiBTRExfYXVkaW9kZXYuYyAqLzsgfTsKKwkJQkVDREY2MzIwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9taXhlci5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzMzQwMDZENzhENjdGMDAwMDAxIC8qIFNETF9taXhlci5jICovOyB9OworCQlCRUNERjYzMzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3dhdmUuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4MzM1MDA2RDc4RDY3RjAwMDAwMSAvKiBTRExfd2F2ZS5jICovOyB9OworCQlCRUNERjYzNTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2FjdGl2ZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzNjgwMDZENzkxNDdGMDAwMDAxIC8qIFNETF9hY3RpdmUuYyAqLzsgfTsKKwkJQkVDREY2MzYwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ldmVudHMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4MzY5MDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfZXZlbnRzLmMgKi87IH07CisJCUJFQ0RGNjM3MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfZXhwb3NlLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODM2QTAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX2V4cG9zZS5jICovOyB9OworCQlCRUNERjYzODA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2tleWJvYXJkLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODM2QjAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX2tleWJvYXJkLmMgKi87IH07CisJCUJFQ0RGNjM5MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfbW91c2UuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4MzZDMDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfbW91c2UuYyAqLzsgfTsKKwkJQkVDREY2M0EwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9xdWl0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODM2RDAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX3F1aXQuYyAqLzsgfTsKKwkJQkVDREY2M0IwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9yZXNpemUuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4MzZFMDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfcmVzaXplLmMgKi87IH07CisJCUJFQ0RGNjNDMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfcndvcHMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4Mzc3MDA2RDc5MzA3RjAwMDAwMSAvKiBTRExfcndvcHMuYyAqLzsgfTsKKwkJQkVDREY2M0UwNzYxQkE4MTAwNUZFODcyIC8qIFNETF90aW1lci5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzQTAwMDZENzlCQzdGMDAwMDAxIC8qIFNETF90aW1lci5jICovOyB9OworCQlCRUNERjYzRjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2JsaXQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0Q4MDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfYmxpdC5jICovOyB9OworCQlCRUNERjY0MDA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2JsaXRfMC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzREEwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9ibGl0XzAuYyAqLzsgfTsKKwkJQkVDREY2NDEwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibGl0XzEuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0RCMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfYmxpdF8xLmMgKi87IH07CisJCUJFQ0RGNjQyMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYmxpdF9BLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNEQzAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2JsaXRfQS5jICovOyB9OworCQlCRUNERjY0MzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2JsaXRfTi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzREUwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9ibGl0X04uYyAqLzsgfTsKKwkJQkVDREY2NDQwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibXAuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0RGMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfYm1wLmMgKi87IH07CisJCUJFQ0RGNjQ1MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfY3Vyc29yLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNFMDAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2N1cnNvci5jICovOyB9OworCQlCRUNERjY0NjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2dhbW1hLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNFMjAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2dhbW1hLmMgKi87IH07CisJCUJFQ0RGNjQ3MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfcGl4ZWxzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNFNjAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX3BpeGVscy5jICovOyB9OworCQlCRUNERjY0ODA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1JMRWFjY2VsLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNFODAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX1JMRWFjY2VsLmMgKi87IH07CisJCUJFQ0RGNjQ5MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfc3VyZmFjZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzRUMwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9zdXJmYWNlLmMgKi87IH07CisJCUJFQ0RGNjRBMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfdmlkZW8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0VFMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfdmlkZW8uYyAqLzsgfTsKKwkJQkVDREY2NEIwNzYxQkE4MTAwNUZFODcyIC8qIFNETF95dXYuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0VGMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfeXV2LmMgKi87IH07CisJCUJFQ0RGNjRDMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfeXV2X3N3LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNGMTAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX3l1dl9zdy5jICovOyB9OworCQlCRUNERjY0RDA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2Vycm9yLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODQzODAwNkQ3RDk0N0YwMDAwMDEgLyogU0RMX2Vycm9yLmMgKi87IH07CisJCUJFQ0RGNjRFMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfZmF0YWwuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4NDM5MDA2RDdEOTQ3RjAwMDAwMSAvKiBTRExfZmF0YWwuYyAqLzsgfTsKKwkJQkVDREY2NTAwNzYxQkE4MTAwNUZFODcyIC8qIFNETC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1Mzg0M0MwMDZEN0Q5NDdGMDAwMDAxIC8qIFNETC5jICovOyB9OworCQlCRUNERjY1MTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3RocmVhZC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1Mzg0NDUwMDZEN0VDNjdGMDAwMDAxIC8qIFNETF90aHJlYWQuYyAqLzsgfTsKKwkJQkVDREY2NTIwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9jZHJvbS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDgzRTQ4OTUwMDZEODZGRjdGMDAwMDAxIC8qIFNETF9jZHJvbS5jICovOyB9OworCQlCRUNERjY1MzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2pveXN0aWNrLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODNFNDg5RDAwNkQ4OEQ5N0YwMDAwMDEgLyogU0RMX2pveXN0aWNrLmMgKi87IH07CisJCUJFQ0RGNjU4MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfc3RyZXRjaC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzRUEwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9zdHJldGNoLmMgKi87IH07CisJCUJFQ0RGNjU5MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfc3lzam95c3RpY2suYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MTc4OUQxMDE3NjlBMjQwMUQzRDU1QiAvKiBTRExfc3lzam95c3RpY2suYyAqLzsgfTsKKwkJQkVDREY2NUIwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9RdWFydHpFdmVudHMubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyNERBNEQ3MDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6RXZlbnRzLm0gKi87IH07CisJCUJFQ0RGNjVDMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6R0wubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyNERBNEQ4MDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6R0wubSAqLzsgfTsKKwkJQkVDREY2NUQwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9RdWFydHpWaWRlby5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjI0REE0REIwNUE4OEFEMDAwNkI5RjFDIC8qIFNETF9RdWFydHpWaWRlby5tICovOyB9OworCQlCRUNERjY1RTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1F1YXJ0eldpbmRvdy5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjI0REE0REQwNUE4OEFEMDAwNkI5RjFDIC8qIFNETF9RdWFydHpXaW5kb3cubSAqLzsgfTsKKwkJQkVDREY2NUYwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9RdWFydHpXTS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjI0REE0REUwNUE4OEFEMDAwNkI5RjFDIC8qIFNETF9RdWFydHpXTS5tICovOyB9OworCQlCRUNERjY2MTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2NwdWluZm8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyNERBNTA0MDVBODhENTIwMDZCOUYxQyAvKiBTRExfY3B1aW5mby5jICovOyB9OworCQlCRUNERjY2MjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3N5c2Nkcm9tLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCMkEyM0E3QjA0MTU3QzU3MDBBODAwMDIgLyogU0RMX3N5c2Nkcm9tLmMgKi87IH07CisJCUJFQ0RGNjY3MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfY29yZWF1ZGlvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUNERjVENTA3NjFCNzU5MDA1RkU4NzIgLyogU0RMX2NvcmVhdWRpby5jICovOyB9OworCQlCRUNERjY3MjA3NjFCQTgxMDA1RkU4NzIgLyogQ0dTLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCMjREQTRENjA1QTg4QUQwMDA2QjlGMUMgLyogQ0dTLmggKi87IH07CisJCUJFQ0RGNjczMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6S2V5cy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjI0REE0RDkwNUE4OEFEMDAwNkI5RjFDIC8qIFNETF9RdWFydHpLZXlzLmggKi87IH07CisJCUJFQ0RGNjc0MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6VmlkZW8uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyNERBNERBMDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6VmlkZW8uaCAqLzsgfTsKKwkJQkVDREY2NzUwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9RdWFydHpXaW5kb3cuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyNERBNERDMDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6V2luZG93LmggKi87IH07CisJCUJFQ0RGNjc2MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfY3B1aW5mby5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjJDRjhEQzQwNUM0NDRFNDAwRTVEQzdGIC8qIFNETF9jcHVpbmZvLmggKi87IH07CisJCUJFQ0RGNjc3MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfbmFtZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjJDRjhEQzcwNUM0NDUwNTAwRTVEQzdGIC8qIFNETF9uYW1lLmggKi87IH07CisJCUJFQ0RGNjc4MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfY29yZWF1ZGlvLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUNERjVENjA3NjFCNzU5MDA1RkU4NzIgLyogU0RMX2NvcmVhdWRpby5oICovOyB9OworCQlCRUNERjY3QTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2F1ZGlvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODMzMDAwNkQ3OEQ2N0YwMDAwMDEgLyogU0RMX2F1ZGlvLmMgKi87IH07CisJCUJFQ0RGNjdCMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYXVkaW9jdnQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4MzMxMDA2RDc4RDY3RjAwMDAwMSAvKiBTRExfYXVkaW9jdnQuYyAqLzsgfTsKKwkJQkVDREY2N0QwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9hdWRpb2Rldi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzMzIwMDZENzhENjdGMDAwMDAxIC8qIFNETF9hdWRpb2Rldi5jICovOyB9OworCQlCRUNERjY3RTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX21peGVyLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODMzNDAwNkQ3OEQ2N0YwMDAwMDEgLyogU0RMX21peGVyLmMgKi87IH07CisJCUJFQ0RGNjdGMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfd2F2ZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzMzUwMDZENzhENjdGMDAwMDAxIC8qIFNETF93YXZlLmMgKi87IH07CisJCUJFQ0RGNjgxMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfY2Ryb20uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4M0U0ODk1MDA2RDg2RkY3RjAwMDAwMSAvKiBTRExfY2Ryb20uYyAqLzsgfTsKKwkJQkVDREY2ODMwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9hY3RpdmUuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4MzY4MDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfYWN0aXZlLmMgKi87IH07CisJCUJFQ0RGNjg0MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfZXZlbnRzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODM2OTAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX2V2ZW50cy5jICovOyB9OworCQlCRUNERjY4NTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2V4cG9zZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzNkEwMDZENzkxNDdGMDAwMDAxIC8qIFNETF9leHBvc2UuYyAqLzsgfTsKKwkJQkVDREY2ODYwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9rZXlib2FyZC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzNkIwMDZENzkxNDdGMDAwMDAxIC8qIFNETF9rZXlib2FyZC5jICovOyB9OworCQlCRUNERjY4NzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX21vdXNlLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODM2QzAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX21vdXNlLmMgKi87IH07CisJCUJFQ0RGNjg4MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfcXVpdC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzNkQwMDZENzkxNDdGMDAwMDAxIC8qIFNETF9xdWl0LmMgKi87IH07CisJCUJFQ0RGNjg5MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfcmVzaXplLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODM2RTAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX3Jlc2l6ZS5jICovOyB9OworCQlCRUNERjY4QTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3J3b3BzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODM3NzAwNkQ3OTMwN0YwMDAwMDEgLyogU0RMX3J3b3BzLmMgKi87IH07CisJCUJFQ0RGNjhCMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfam95c3RpY2suYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4M0U0ODlEMDA2RDg4RDk3RjAwMDAwMSAvKiBTRExfam95c3RpY2suYyAqLzsgfTsKKwkJQkVDREY2OEMwNzYxQkE4MTAwNUZFODcyIC8qIFNETF90aHJlYWQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4NDQ1MDA2RDdFQzY3RjAwMDAwMSAvKiBTRExfdGhyZWFkLmMgKi87IH07CisJCUJFQ0RGNjkyMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfdGltZXIuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0EwMDA2RDc5QkM3RjAwMDAwMSAvKiBTRExfdGltZXIuYyAqLzsgfTsKKwkJQkVDREY2OTMwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibGl0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNEODAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2JsaXQuYyAqLzsgfTsKKwkJQkVDREY2OTQwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibGl0XzAuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0RBMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfYmxpdF8wLmMgKi87IH07CisJCUJFQ0RGNjk1MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYmxpdF8xLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNEQjAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2JsaXRfMS5jICovOyB9OworCQlCRUNERjY5NjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2JsaXRfQS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzREMwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9ibGl0X0EuYyAqLzsgfTsKKwkJQkVDREY2OTcwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibGl0X04uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0RFMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfYmxpdF9OLmMgKi87IH07CisJCUJFQ0RGNjk4MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYm1wLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNERjAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2JtcC5jICovOyB9OworCQlCRUNERjY5OTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2N1cnNvci5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzRTAwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9jdXJzb3IuYyAqLzsgfTsKKwkJQkVDREY2OUEwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9nYW1tYS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzRTIwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9nYW1tYS5jICovOyB9OworCQlCRUNERjY5QjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3BpeGVscy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzRTYwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9waXhlbHMuYyAqLzsgfTsKKwkJQkVDREY2OUMwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9STEVhY2NlbC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzRTgwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9STEVhY2NlbC5jICovOyB9OworCQlCRUNERjY5RDA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3N0cmV0Y2guYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0VBMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfc3RyZXRjaC5jICovOyB9OworCQlCRUNERjY5RTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3N1cmZhY2UuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4M0VDMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfc3VyZmFjZS5jICovOyB9OworCQlCRUNERjY5RjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3ZpZGVvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNFRTAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX3ZpZGVvLmMgKi87IH07CisJCUJFQ0RGNkEwMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfeXV2LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODNFRjAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX3l1di5jICovOyB9OworCQlCRUNERjZBMTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3l1dl9zdy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1MzgzRjEwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF95dXZfc3cuYyAqLzsgfTsKKwkJQkVDREY2QTIwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9lcnJvci5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDE1Mzg0MzgwMDZEN0Q5NDdGMDAwMDAxIC8qIFNETF9lcnJvci5jICovOyB9OworCQlCRUNERjZBMzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2ZhdGFsLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMTUzODQzOTAwNkQ3RDk0N0YwMDAwMDEgLyogU0RMX2ZhdGFsLmMgKi87IH07CisJCUJFQ0RGNkE1MDc2MUJBODEwMDVGRTg3MiAvKiBTREwuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAxNTM4NDNDMDA2RDdEOTQ3RjAwMDAwMSAvKiBTREwuYyAqLzsgfTsKKwkJQkVDREY2QTYwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9zeXNqb3lzdGljay5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUxNzg5RDEwMTc2OUEyNDAxRDNENTVCIC8qIFNETF9zeXNqb3lzdGljay5jICovOyB9OworCQlCRUNERjZBODA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3N5c2Nkcm9tLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODNFNDg5NDAwNkQ4NkZGN0YwMDAwMDEgLyogU0RMX3N5c2Nkcm9tLmMgKi87IH07CisJCUJFQ0RGNkE5MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6RXZlbnRzLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCMjREQTRENzA1QTg4QUQwMDA2QjlGMUMgLyogU0RMX1F1YXJ0ekV2ZW50cy5tICovOyB9OworCQlCRUNERjZBQTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1F1YXJ0ekdMLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCMjREQTREODA1QTg4QUQwMDA2QjlGMUMgLyogU0RMX1F1YXJ0ekdMLm0gKi87IH07CisJCUJFQ0RGNkFCMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6VmlkZW8ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyNERBNERCMDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6VmlkZW8ubSAqLzsgfTsKKwkJQkVDREY2QUMwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9RdWFydHpXaW5kb3cubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyNERBNEREMDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6V2luZG93Lm0gKi87IH07CisJCUJFQ0RGNkFEMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6V00ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyNERBNERFMDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6V00ubSAqLzsgfTsKKwkJQkVDREY2QUYwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9jcHVpbmZvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCMjREQTUwNDA1QTg4RDUyMDA2QjlGMUMgLyogU0RMX2NwdWluZm8uYyAqLzsgfTsKKwkJQkVDREY2QjAwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9jb3JlYXVkaW8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQ0RGNUQ1MDc2MUI3NTkwMDVGRTg3MiAvKiBTRExfY29yZWF1ZGlvLmMgKi87IH07CisJCUJFQ0RGNkI3MDc2MUJBODEwMDVGRTg3MiAvKiBTRExNYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYyRTAwODZDM0EwN0YwMDAwMDEgLyogU0RMTWFpbi5tICovOyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisJCTAwODMwRkZGMTA3MkQ5NEEwMEE1MzFGMSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAwMDMyMzU0RjEwNzA5MzE3MDBDNzY1MTc7CisJCQlyZW1vdGVJbmZvID0gIkdlbmVyYXRlIERveHlnZW4gRG9jU2V0IjsKKwkJfTsKKwkJQkVDREY2QzUwNzYxQkE4MTAwNUZFODcyIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQ0RGNUZFMDc2MUJBODEwMDVGRTg3MjsKKwkJCXJlbW90ZUluZm8gPSAiRnJhbWV3b3JrIChVcGdyYWRlZCkiOworCQl9OworLyogRW5kIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkwMDE0QjdFODA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYWV2ZW50c19jLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfZGdhZXZlbnRzX2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI3RTkwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2FldmVudHMuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9kZ2FldmVudHMuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI3RUEwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2Ftb3VzZV9jLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfZGdhbW91c2VfYy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE0QjdFQjA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYW1vdXNlLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfZGdhbW91c2UuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI3RUMwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2F2aWRlby5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX2RnYXZpZGVvLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCN0VEMDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhdmlkZW8uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETF9kZ2F2aWRlby5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE0QjgzNzA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWRnYV9jLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfeDExZGdhX2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4MzgwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkZ2EuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF94MTFkZ2EuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4MzkwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkeW4uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF94MTFkeW4uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4M0EwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkeW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETF94MTFkeW4uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4M0IwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFldmVudHNfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX3gxMWV2ZW50c19jLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODNDMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZXZlbnRzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfeDExZXZlbnRzLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODNEMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2FtbWFfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX3gxMWdhbW1hX2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4M0UwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFnYW1tYS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3gxMWdhbW1hLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODNGMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2xfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX3gxMWdsX2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4NDAwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFnbC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3gxMWdsLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODQxMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExaW1hZ2VfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX3gxMWltYWdlX2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4NDIwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFpbWFnZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3gxMWltYWdlLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODQzMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW9kZXNfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX3gxMW1vZGVzX2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4NDQwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFtb2Rlcy5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3gxMW1vZGVzLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODQ1MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW91c2VfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX3gxMW1vdXNlX2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4NDYwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFtb3VzZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3gxMW1vdXNlLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODQ3MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExc3ltLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfeDExc3ltLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODQ4MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExdmlkZW8uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF94MTF2aWRlby5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE0Qjg0OTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXZpZGVvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfeDExdmlkZW8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4NEEwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF3bV9jLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfeDExd21fYy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE0Qjg0QjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXdtLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfeDExd20uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4NEMwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF5dXZfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX3gxMXl1dl9jLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODREMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExeXV2LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfeDExeXV2LmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODkwMDlDMERBOTQwMDNBOTlENSAvKiBYRjg2REdBLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBYRjg2REdBLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODkxMDlDMERBOTQwMDNBOTlENSAvKiBYRjg2REdBMi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gWEY4NkRHQTIuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4OTYwOUMwREFBMTAwM0E5OUQ1IC8qIFhGODZWTW9kZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gWEY4NlZNb2RlLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCODk5MDlDMERBQUUwMDNBOTlENSAvKiBYdi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gWHYuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNEI4OUEwOUMwREFBRTAwM0E5OUQ1IC8qIFh2bGliaW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBYdmxpYmludC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE0Qjg5RjA5QzBEQUI5MDAzQTk5RDUgLyogWGluZXJhbWEuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFhpbmVyYW1hLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTRCOEEyMDlDMERBQzQwMDNBOTlENSAvKiB4bWUuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IHhtZS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE2MkQzMjA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9jb25maWdfZHJlYW1jYXN0Lmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9jb25maWdfZHJlYW1jYXN0Lmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAxNjJEMzMwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWdfbWFjb3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9jb25maWdfbWFjb3MuaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX2NvbmZpZ19tYWNvcy5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMTYyRDM0MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnX21hY29zeC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gU0RMX2NvbmZpZ19tYWNvc3guaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX2NvbmZpZ19tYWNvc3guaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDE2MkQzNTA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19vczIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9jb25maWdfb3MyLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9jb25maWdfb3MyLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAxNjJEMzYwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWdfd2luMzIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9jb25maWdfd2luMzIuaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX2NvbmZpZ193aW4zMi5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMTYyRDM3MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfY29uZmlnLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9jb25maWcuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDE2MkQzODA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX3BsYXRmb3JtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfcGxhdGZvcm0uaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX3BsYXRmb3JtLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAxNjJEMzkwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9zdGRpbmMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9zdGRpbmMuaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX3N0ZGluYy5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMTYyRDREMDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzY29uZC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3N5c2NvbmQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNjJENEUwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNtdXRleC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3N5c211dGV4LmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTYyRDRGMDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzbXV0ZXhfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX3N5c211dGV4X2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNjJENTAwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNzZW0uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9zeXNzZW0uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNjJENTEwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXN0aHJlYWQuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9zeXN0aHJlYWQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNjJENTIwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXN0aHJlYWRfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX3N5c3RocmVhZF9jLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMTYyRDYwMDlCRDIxMDEwMDM3QzhEMCAvKiBTRExfc3lzdGltZXIuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9zeXN0aW1lci5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE2MkQ2NTA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX2dldGVudi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX2dldGVudi5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE2MkQ2NjA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX21hbGxvYy5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX21hbGxvYy5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE2MkQ2NzA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3Fzb3J0LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfcXNvcnQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNjJENjgwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9zdGRsaWIuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9zdGRsaWIuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNjJENjkwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9zdHJpbmcuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9zdHJpbmcuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNjJGMzQwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsZXZlbnRzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfbnVsbGV2ZW50cy5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE2MkYzNTA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGxldmVudHNfYy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX251bGxldmVudHNfYy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE2MkYzNjA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGxtb3VzZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX251bGxtb3VzZS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDE2MkYzNzA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGxtb3VzZV9jLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfbnVsbG1vdXNlX2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNjJGMzgwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsdmlkZW8uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9udWxsdmlkZW8uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAxNjJGMzkwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsdmlkZW8uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETF9udWxsdmlkZW8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAyRjMyODUwOUNBMDQ5MTAwRUJFQjg4IC8qIFNETF9pY29udi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX2ljb252LmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMkYzMkQ0MDlDQTBCRTcwMEVCRUI4OCAvKiBTRExfZGlza2F1ZGlvLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfZGlza2F1ZGlvLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMkYzMkQ1MDlDQTBCRTcwMEVCRUI4OCAvKiBTRExfZGlza2F1ZGlvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfZGlza2F1ZGlvLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwMkYzMkUyMDlDQTBCRjYwMEVCRUI4OCAvKiBTRExfZHVtbXlhdWRpby5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX2R1bW15YXVkaW8uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDAyRjMyRTMwOUNBMEJGNjAwRUJFQjg4IC8qIFNETF9kdW1teWF1ZGlvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfZHVtbXlhdWRpby5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMDRDMkM4NjA5NzVFMTMzMDBFOUQ0MzAgLyogQXVkaW9GaWxlUGxheWVyLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBBdWRpb0ZpbGVQbGF5ZXIuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDA0QzJDODcwOTc1RTEzMzAwRTlENDMwIC8qIEF1ZGlvRmlsZVJlYWRlclRocmVhZC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gQXVkaW9GaWxlUmVhZGVyVGhyZWFkLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwNEMyQzg4MDk3NUUxMzMwMEU5RDQzMCAvKiBDRFBsYXllci5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gQ0RQbGF5ZXIuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDA0QzJDODkwOTc1RTEzMzAwRTlENDMwIC8qIFNETE9TWENBR3VhcmQuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETE9TWENBR3VhcmQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDA0QzJDOEEwOTc1RTEzMzAwRTlENDMwIC8qIFNETE9TWENBR3VhcmQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETE9TWENBR3VhcmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDA3MzE3OUIwODU4REVDRDAwQjJCQzMyIC8qIEF1ZGlvVG9vbGJveC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEF1ZGlvVG9vbGJveC5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BdWRpb1Rvb2xib3guZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkwMDczMTc5QzA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Vbml0LmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQXVkaW9Vbml0LmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0F1ZGlvVW5pdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTAwNzMxNzlEMDg1OERFQ0QwMEIyQkMzMiAvKiBDb2NvYS5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENvY29hLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMDA3MzE3OUUwODU4REVDRDAwQjJCQzMyIC8qIENvcmVBdWRpby5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENvcmVBdWRpby5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db3JlQXVkaW8uZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkwMDczMTc5RjA4NThERUNEMDBCMkJDMzIgLyogSU9LaXQuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBJT0tpdC5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9JT0tpdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTAwNzMxN0EwMDg1OERFQ0QwMEIyQkMzMiAvKiBPcGVuR0wuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBPcGVuR0wuZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvT3BlbkdMLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMDA3MzE3QTEwODU4REVDRDAwQjJCQzMyIC8qIFF1aWNrVGltZS5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IFF1aWNrVGltZS5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9RdWlja1RpbWUuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkwMDczMTdDMTA4NThFMTUwMDBCMkJDMzIgLyogQ2FyYm9uLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQ2FyYm9uLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NhcmJvbi5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTAwNzk0RDNGMDlEMEM0NjEwMDNGQzhBMSAvKiBMaWNlbnNlLnJ0ZiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucnRmOyBwYXRoID0gTGljZW5zZS5ydGY7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwQUU2RTFFMDhCOTU4Q0MwMDI1NUUyRiAvKiBSZWFkTWVEZXZMaXRlLnR4dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gUmVhZE1lRGV2TGl0ZS50eHQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwQjdFNjFGMDk3RjJEOUUwMDgyNjEyMSAvKiBTRExfbWl4ZXJfTU1YLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfbWl4ZXJfTU1YLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwQjdFNjIwMDk3RjJEOUUwMDgyNjEyMSAvKiBTRExfbWl4ZXJfTU1YLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfbWl4ZXJfTU1YLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAwQjdFNjI1MDk3RjJERDEwMDgyNjEyMSAvKiBTRExfeXV2X21teC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3l1dl9tbXguYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDBEMEQwMjIxMDY3NTgyMzAwNEIwNUVGIC8qIFNETF9RdWFydHpXTS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfUXVhcnR6V00uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDBEMEQwODMxMDY3NUREOTAwNEIwNUVGIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkwMEY1RDc5RTA5OTBDQTBEMDA1MUM0NDkgLyogVW5pdmVyc2FsQmluYXJ5Tm90ZXMucnRmICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5ydGY7IHBhdGggPSBVbml2ZXJzYWxCaW5hcnlOb3Rlcy5ydGY7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4MzMwMDA2RDc4RDY3RjAwMDAwMSAvKiBTRExfYXVkaW8uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9hdWRpby5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMTUzODMzMTAwNkQ3OEQ2N0YwMDAwMDEgLyogU0RMX2F1ZGlvY3Z0LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfYXVkaW9jdnQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzMzIwMDZENzhENjdGMDAwMDAxIC8qIFNETF9hdWRpb2Rldi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX2F1ZGlvZGV2LmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4MzM0MDA2RDc4RDY3RjAwMDAwMSAvKiBTRExfbWl4ZXIuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9taXhlci5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMTUzODMzNTAwNkQ3OEQ2N0YwMDAwMDEgLyogU0RMX3dhdmUuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF93YXZlLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4MzY4MDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfYWN0aXZlLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfYWN0aXZlLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4MzY5MDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfZXZlbnRzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfZXZlbnRzLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4MzZBMDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfZXhwb3NlLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfZXhwb3NlLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4MzZCMDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfa2V5Ym9hcmQuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9rZXlib2FyZC5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMTUzODM2QzAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX21vdXNlLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfbW91c2UuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzNkQwMDZENzkxNDdGMDAwMDAxIC8qIFNETF9xdWl0LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfcXVpdC5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMTUzODM2RTAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX3Jlc2l6ZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3Jlc2l6ZS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMTUzODM3NzAwNkQ3OTMwN0YwMDAwMDEgLyogU0RMX3J3b3BzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfcndvcHMuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzQTAwMDZENzlCQzdGMDAwMDAxIC8qIFNETF90aW1lci5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3RpbWVyLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4M0M1MDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfbWFjZXZlbnRzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfbWFjZXZlbnRzLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4M0M3MDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfbWFjZ2wuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9tYWNnbC5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMTUzODNDQTAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX21hY21vdXNlLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfbWFjbW91c2UuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzQ0MwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9tYWN3bS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX21hY3dtLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4M0QxMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfZHNwdmlkZW8uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9kc3B2aWRlby5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMTUzODNEMjAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2RzcHZpZGVvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExfZHNwdmlkZW8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzRDYwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9yb212aWRlby5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3JvbXZpZGVvLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4M0Q4MDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfYmxpdC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX2JsaXQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzREEwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9ibGl0XzAuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9ibGl0XzAuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzREIwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9ibGl0XzEuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9ibGl0XzEuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzREMwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9ibGl0X0EuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9ibGl0X0EuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzREUwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9ibGl0X04uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9ibGl0X04uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzREYwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9ibXAuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9ibXAuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzRTAwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9jdXJzb3IuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9jdXJzb3IuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzRTIwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9nYW1tYS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX2dhbW1hLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4M0U2MDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfcGl4ZWxzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfcGl4ZWxzLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4M0U4MDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfUkxFYWNjZWwuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9STEVhY2NlbC5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwMTUzODNFQTAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX3N0cmV0Y2guYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9zdHJldGNoLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4M0VDMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfc3VyZmFjZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3N1cmZhY2UuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDE1MzgzRUUwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF92aWRlby5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3ZpZGVvLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4M0VGMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfeXV2LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfeXV2LmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4M0YxMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfeXV2X3N3LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfeXV2X3N3LmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTAxNTM4NDM4MDA2RDdEOTQ3RjAwMDAwMSAvKiBTRExfZXJyb3IuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IFNETF9lcnJvci5jOyBwYXRoID0gLi4vLi4vc3JjL1NETF9lcnJvci5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAxNTM4NDM5MDA2RDdEOTQ3RjAwMDAwMSAvKiBTRExfZmF0YWwuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IFNETF9mYXRhbC5jOyBwYXRoID0gLi4vLi4vc3JjL1NETF9mYXRhbC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAxNTM4NDNDMDA2RDdEOTQ3RjAwMDAwMSAvKiBTREwuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IFNETC5jOyBwYXRoID0gLi4vLi4vc3JjL1NETC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAxNTM4NDQ1MDA2RDdFQzY3RjAwMDAwMSAvKiBTRExfdGhyZWFkLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBTRExfdGhyZWFkLmM7IHBhdGggPSAuLi8uLi9zcmMvdGhyZWFkL1NETF90aHJlYWQuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwNDZCOTFFOTBBMTFCNTM1MDBGQjE1MUMgLyogU0RMX3N5c2xvYWRzby5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3N5c2xvYWRzby5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwNDZCOTIxMDBBMTFCOEFEMDBGQjE1MUMgLyogU0RMX2RsY29tcGF0LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfZGxjb21wYXQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDgzRTQ4OTQwMDZEODZGRjdGMDAwMDAxIC8qIFNETF9zeXNjZHJvbS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gU0RMX3N5c2Nkcm9tLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTA4M0U0ODk1MDA2RDg2RkY3RjAwMDAwMSAvKiBTRExfY2Ryb20uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9jZHJvbS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwODNFNDg5RDAwNkQ4OEQ5N0YwMDAwMDEgLyogU0RMX2pveXN0aWNrLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfam95c3RpY2suYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEM1QUY1RTUwMTE5MUQyQjdGMDAwMDAxIC8qIGJlZ2luX2NvZGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IGJlZ2luX2NvZGUuaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvYmVnaW5fY29kZS5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTBDNUFGNUU2MDExOTFEMkI3RjAwMDAwMSAvKiBjbG9zZV9jb2RlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBjbG9zZV9jb2RlLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL2Nsb3NlX2NvZGUuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwQzVBRjVFNzAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX2FjdGl2ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gU0RMX2FjdGl2ZS5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfYWN0aXZlLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMEM1QUY1RTgwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9hdWRpby5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gU0RMX2F1ZGlvLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9hdWRpby5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTBDNUFGNUU5MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfYnl0ZW9yZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfYnl0ZW9yZGVyLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9ieXRlb3JkZXIuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwQzVBRjVFQTAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX2Nkcm9tLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfY2Ryb20uaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX2Nkcm9tLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMEM1QUY1RUIwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9jb3B5aW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfY29weWluZy5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfY29weWluZy5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTBDNUFGNUVDMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfZW5kaWFuLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfZW5kaWFuLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9lbmRpYW4uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwQzVBRjVFRDAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX2Vycm9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfZXJyb3IuaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX2Vycm9yLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMEM1QUY1RUUwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9ldmVudHMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9ldmVudHMuaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX2V2ZW50cy5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTBDNUFGNUVGMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfZ2V0ZW52LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfZ2V0ZW52Lmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9nZXRlbnYuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwQzVBRjVGMDAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX2pveXN0aWNrLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfam95c3RpY2suaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX2pveXN0aWNrLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMEM1QUY1RjEwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9rZXlib2FyZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gU0RMX2tleWJvYXJkLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9rZXlib2FyZC5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTBDNUFGNUYyMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfa2V5c3ltLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfa2V5c3ltLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9rZXlzeW0uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwQzVBRjVGMzAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX21haW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9tYWluLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9tYWluLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMEM1QUY1RjQwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9tb3VzZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gU0RMX21vdXNlLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9tb3VzZS5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTBDNUFGNUY1MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfbXV0ZXguaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9tdXRleC5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfbXV0ZXguaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwQzVBRjVGNjAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX29wZW5nbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gU0RMX29wZW5nbC5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfb3BlbmdsLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMEM1QUY1RjcwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9xdWl0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfcXVpdC5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfcXVpdC5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTBDNUFGNUY4MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfcndvcHMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9yd29wcy5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfcndvcHMuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwQzVBRjVGOTAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX3N5c3dtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfc3lzd20uaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX3N5c3dtLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMEM1QUY1RkEwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF90aHJlYWQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF90aHJlYWQuaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX3RocmVhZC5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTBDNUFGNUZCMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfdGltZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF90aW1lci5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfdGltZXIuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwQzVBRjVGQzAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX3R5cGVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfdHlwZXMuaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX3R5cGVzLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMEM1QUY1RkQwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF92ZXJzaW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTRExfdmVyc2lvbi5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfdmVyc2lvbi5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTBDNUFGNUZFMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfdmlkZW8uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF92aWRlby5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfdmlkZW8uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwQzVBRjVGRjAxMTkxRDJCN0YwMDAwMDEgLyogU0RMLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBTREwuaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMkVFQ0RGMkQwMDg2QzNBMDdGMDAwMDAxIC8qIFNETE1haW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETE1haW4uaDsgcGF0aCA9IC4uLy4uL3NyYy9tYWluL21hY29zeC9TRExNYWluLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMkVFQ0RGMkUwMDg2QzNBMDdGMDAwMDAxIC8qIFNETE1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IFNETE1haW4ubTsgcGF0aCA9IC4uLy4uL3NyYy9tYWluL21hY29zeC9TRExNYWluLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMkVFQ0RGMkYwMDg2QzNBMDdGMDAwMDAxIC8qIFNETE1haW4ubmliICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5uaWI7IG5hbWUgPSBTRExNYWluLm5pYjsgcGF0aCA9IC4uLy4uL3NyYy9tYWluL21hY29zeC9TRExNYWluLm5pYjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlCMjREQTRENjA1QTg4QUQwMDA2QjlGMUMgLyogQ0dTLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDR1MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQjI0REE0RDcwNUE4OEFEMDAwNkI5RjFDIC8qIFNETF9RdWFydHpFdmVudHMubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNETF9RdWFydHpFdmVudHMubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQjI0REE0RDgwNUE4OEFEMDAwNkI5RjFDIC8qIFNETF9RdWFydHpHTC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU0RMX1F1YXJ0ekdMLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUIyNERBNEQ5MDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6S2V5cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX1F1YXJ0ektleXMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQjI0REE0REEwNUE4OEFEMDAwNkI5RjFDIC8qIFNETF9RdWFydHpWaWRlby5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX1F1YXJ0elZpZGVvLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUIyNERBNERCMDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6VmlkZW8ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNETF9RdWFydHpWaWRlby5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCMjREQTREQzA1QTg4QUQwMDA2QjlGMUMgLyogU0RMX1F1YXJ0eldpbmRvdy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMX1F1YXJ0eldpbmRvdy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCMjREQTRERDA1QTg4QUQwMDA2QjlGMUMgLyogU0RMX1F1YXJ0eldpbmRvdy5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU0RMX1F1YXJ0eldpbmRvdy5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCMjREQTRERTA1QTg4QUQwMDA2QjlGMUMgLyogU0RMX1F1YXJ0eldNLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBTRExfUXVhcnR6V00ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQjI0REE1MDQwNUE4OEQ1MjAwNkI5RjFDIC8qIFNETF9jcHVpbmZvLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfY3B1aW5mby5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCMjlBMjkwRDA0RTVCMjg3MDBBODAwMDIgLyogU0RMX2xvYWRzby5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gU0RMX2xvYWRzby5oOyBwYXRoID0gLi4vLi4vaW5jbHVkZS9TRExfbG9hZHNvLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUIyQTIzQTQ1MDQxNTc5OTEwMEE4MDAwMiAvKiBBdWRpb0ZpbGVQbGF5ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEF1ZGlvRmlsZVBsYXllci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCMkEyM0E3QTA0MTU3QzU3MDBBODAwMDIgLyogU0RMX3N5c2Nkcm9tX2MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETF9zeXNjZHJvbV9jLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUIyQTIzQTdCMDQxNTdDNTcwMEE4MDAwMiAvKiBTRExfc3lzY2Ryb20uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9zeXNjZHJvbS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCMkEyM0E4MTA0MTU3RDVEMDBBODAwMDIgLyogQ0RQbGF5ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENEUGxheWVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUIyQ0Y4REM0MDVDNDQ0RTQwMEU1REM3RiAvKiBTRExfY3B1aW5mby5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gU0RMX2NwdWluZm8uaDsgcGF0aCA9IC4uLy4uL2luY2x1ZGUvU0RMX2NwdWluZm8uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlCMkNGOERDNzA1QzQ0NTA1MDBFNURDN0YgLyogU0RMX25hbWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETF9uYW1lLmg7IHBhdGggPSAuLi8uLi9pbmNsdWRlL1NETF9uYW1lLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJQkVDREY1RDUwNzYxQjc1OTAwNUZFODcyIC8qIFNETF9jb3JlYXVkaW8uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFNETF9jb3JlYXVkaW8uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQkVDREY1RDYwNzYxQjc1OTAwNUZFODcyIC8qIFNETF9jb3JlYXVkaW8uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETF9jb3JlYXVkaW8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQkVDREY2NkIwNzYxQkE4MTAwNUZFODcyIC8qIEluZm8tRnJhbWV3b3JrLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC54bWw7IHBhdGggPSAiSW5mby1GcmFtZXdvcmsucGxpc3QiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCRUNERjY2QzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IFNETC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQ0RGNkIzMDc2MUJBODEwMDVGRTg3MiAvKiBsaWJTREwuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gbGliU0RMLmE7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQ0RGNkJBMDc2MUJBODEwMDVGRTg3MiAvKiBsaWJTRExtYWluLmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IGFyY2hpdmUuYXI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGxpYlNETG1haW4uYTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJQkVDREY2QkUwNzYxQkE4MTAwNUZFODcyIC8qIFN0YW5kYXJkIERNRyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gIlN0YW5kYXJkIERNRyI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQ0RGNkMzMDc2MUJBODEwMDVGRTg3MiAvKiBEZXZlbG9wZXIgRXh0cmFzIFBhY2thZ2UgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9ICJEZXZlbG9wZXIgRXh0cmFzIFBhY2thZ2UiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlGNTE3ODlEMTAxNzY5QTI0MDFEM0Q1NUIgLyogU0RMX3N5c2pveXN0aWNrLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBTRExfc3lzam95c3RpY2suYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjU5QzcwRkYwMEQ1Q0I1ODAxMDAwMDAxIC8qIFJlYWRNZS50eHQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFJlYWRNZS50eHQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY1OUM3MTAwMDBENUNCNTgwMTAwMDAwMSAvKiBXZWxjb21lLnR4dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gV2VsY29tZS50eHQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY1OUM3MTAzMDBENUNCNTgwMTAwMDAwMSAvKiBSZWFkTWUudHh0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBSZWFkTWUudHh0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNTlDNzEwNTAwRDVDQjU4MDEwMDAwMDEgLyogU0RMLWRldmVsLmluZm8gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9ICJTREwtZGV2ZWwuaW5mbyI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY1OUM3MTA2MDBENUNCNTgwMTAwMDAwMSAvKiBTREwuaW5mbyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU0RMLmluZm87IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY1OUM3MTBDMDBENUQxNTgwMTAwMDAwMSAvKiBpbnN0YWxsLnNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQuc2NyaXB0LnNoOyBwYXRoID0gaW5zdGFsbC5zaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjVBMkVGMzkwMEM2QTM5QTAxMDAwMDAxIC8qIEJVR1MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IEJVR1M7IHBhdGggPSAuLi8uLi9CVUdTOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUY1QTJFRjNBMDBDNkEzQzIwMTAwMDAwMSAvKiBSRUFETUUuTWFjT1NYICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IG5hbWUgPSBSRUFETUUuTWFjT1NYOyBwYXRoID0gLi4vLi4vUkVBRE1FLk1hY09TWDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlGNUY4MUFENDAwRDcwNkIxMDEwMDAwMDEgLyogUmVhZG1lIFNETCBEZXZlbG9wZXIudHh0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IG5hbWUgPSAiUmVhZG1lIFNETCBEZXZlbG9wZXIudHh0IjsgcGF0aCA9ICJwa2ctc3VwcG9ydC9SZWFkbWUgU0RMIERldmVsb3Blci50eHQiOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJQkVDREY2NjgwNzYxQkE4MTAwNUZFODcyIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDczMTdBMjA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Ub29sYm94LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzMxN0EzMDg1OERFQ0QwMEIyQkMzMiAvKiBBdWRpb1VuaXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3MzE3QTQwODU4REVDRDAwQjJCQzMyIC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzMxN0E1MDg1OERFQ0QwMEIyQkMzMiAvKiBDb3JlQXVkaW8uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3MzE3QTYwODU4REVDRDAwQjJCQzMyIC8qIElPS2l0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzMxN0E3MDg1OERFQ0QwMEIyQkMzMiAvKiBPcGVuR0wuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDBEMEQwODQxMDY3NUREOTAwNEIwNUVGIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwRDBEMEQ4MTA2NzVFNDYwMDRCMDVFRiAvKiBDYXJib24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQ0RGNkIxMDc2MUJBODEwMDVGRTg3MiAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDA3MzE3QTkwODU4REVDRDAwQjJCQzMyIC8qIEF1ZGlvVG9vbGJveC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDczMTdBQTA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Vbml0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzMxN0FCMDg1OERFQ0QwMEIyQkMzMiAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDczMTdBQzA4NThERUNEMDBCMkJDMzIgLyogQ29yZUF1ZGlvLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzMxN0FEMDg1OERFQ0QwMEIyQkMzMiAvKiBJT0tpdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDczMTdBRTA4NThERUNEMDBCMkJDMzIgLyogT3BlbkdMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzMxN0FGMDg1OERFQ0QwMEIyQkMzMiAvKiBRdWlja1RpbWUuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3MzE3QzMwODU4RTE1MDAwQjJCQzMyIC8qIENhcmJvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDREY2QjgwNzYxQkE4MTAwNUZFODcyIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDczMTdCMDA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Ub29sYm94LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzMxN0IxMDg1OERFQ0QwMEIyQkMzMiAvKiBBdWRpb1VuaXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3MzE3QjIwODU4REVDRDAwQjJCQzMyIC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzMxN0IzMDg1OERFQ0QwMEIyQkMzMiAvKiBDb3JlQXVkaW8uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3MzE3QjQwODU4REVDRDAwQjJCQzMyIC8qIElPS2l0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzMxN0I1MDg1OERFQ0QwMEIyQkMzMiAvKiBPcGVuR0wuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3MzE3QjYwODU4REVDRDAwQjJCQzMyIC8qIFF1aWNrVGltZS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDczMTdDNDA4NThFMTUwMDBCMkJDMzIgLyogQ2FyYm9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwMDE0QjdEODA5QzBEODA4MDAzQTk5RDUgLyogZGdhICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDE0QjdFODA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYWV2ZW50c19jLmggKi8sCisJCQkJMDAxNEI3RTkwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2FldmVudHMuYyAqLywKKwkJCQkwMDE0QjdFQTA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYW1vdXNlX2MuaCAqLywKKwkJCQkwMDE0QjdFQjA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYW1vdXNlLmMgKi8sCisJCQkJMDAxNEI3RUMwOUMwRDhEMjAwM0E5OUQ1IC8qIFNETF9kZ2F2aWRlby5jICovLAorCQkJCTAwMTRCN0VEMDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhdmlkZW8uaCAqLywKKwkJCSk7CisJCQlwYXRoID0gZGdhOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDAxNEI4MzEwOUMwRDkxRTAwM0E5OUQ1IC8qIHgxMSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDAxNEI4MzcwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkZ2FfYy5oICovLAorCQkJCTAwMTRCODM4MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZGdhLmMgKi8sCisJCQkJMDAxNEI4MzkwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkeW4uYyAqLywKKwkJCQkwMDE0QjgzQTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWR5bi5oICovLAorCQkJCTAwMTRCODNCMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZXZlbnRzX2MuaCAqLywKKwkJCQkwMDE0QjgzQzA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWV2ZW50cy5jICovLAorCQkJCTAwMTRCODNEMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2FtbWFfYy5oICovLAorCQkJCTAwMTRCODNFMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2FtbWEuYyAqLywKKwkJCQkwMDE0QjgzRjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdsX2MuaCAqLywKKwkJCQkwMDE0Qjg0MDA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdsLmMgKi8sCisJCQkJMDAxNEI4NDEwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFpbWFnZV9jLmggKi8sCisJCQkJMDAxNEI4NDIwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFpbWFnZS5jICovLAorCQkJCTAwMTRCODQzMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW9kZXNfYy5oICovLAorCQkJCTAwMTRCODQ0MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW9kZXMuYyAqLywKKwkJCQkwMDE0Qjg0NTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vdXNlX2MuaCAqLywKKwkJCQkwMDE0Qjg0NjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vdXNlLmMgKi8sCisJCQkJMDAxNEI4NDcwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFzeW0uaCAqLywKKwkJCQkwMDE0Qjg0ODA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXZpZGVvLmMgKi8sCisJCQkJMDAxNEI4NDkwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF2aWRlby5oICovLAorCQkJCTAwMTRCODRBMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExd21fYy5oICovLAorCQkJCTAwMTRCODRCMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExd20uYyAqLywKKwkJCQkwMDE0Qjg0QzA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXl1dl9jLmggKi8sCisJCQkJMDAxNEI4NEQwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF5dXYuYyAqLywKKwkJCSk7CisJCQlwYXRoID0geDExOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDAxNEI4N0QwOUMwRDk4QTAwM0E5OUQ1IC8qIFhleHQgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMTRCODdFMDlDMEQ5QkQwMDNBOTlENSAvKiBYeGY4NmRnYSAqLywKKwkJCQkwMDE0Qjg3RjA5QzBEOUQxMDAzQTk5RDUgLyogWHhmODZ2bSAqLywKKwkJCQkwMDE0Qjg4MzA5QzBEQTFBMDAzQTk5RDUgLyogWHYgKi8sCisJCQkJMDAxNEI4ODIwOUMwREEwRjAwM0E5OUQ1IC8qIFhpbmVyYW1hICovLAorCQkJCTAwMTRCODgxMDlDMERBMDQwMDNBOTlENSAvKiBYTUUgKi8sCisJCQkpOworCQkJcGF0aCA9IFhleHQ7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwMDE0Qjg3RTA5QzBEOUJEMDAzQTk5RDUgLyogWHhmODZkZ2EgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMTRCODkwMDlDMERBOTQwMDNBOTlENSAvKiBYRjg2REdBLmMgKi8sCisJCQkJMDAxNEI4OTEwOUMwREE5NDAwM0E5OUQ1IC8qIFhGODZER0EyLmMgKi8sCisJCQkpOworCQkJcGF0aCA9IFh4Zjg2ZGdhOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDAxNEI4N0YwOUMwRDlEMTAwM0E5OUQ1IC8qIFh4Zjg2dm0gKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMTRCODk2MDlDMERBQTEwMDNBOTlENSAvKiBYRjg2Vk1vZGUuYyAqLywKKwkJCSk7CisJCQlwYXRoID0gWHhmODZ2bTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTAwMTRCODgxMDlDMERBMDQwMDNBOTlENSAvKiBYTUUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMTRCOEEyMDlDMERBQzQwMDNBOTlENSAvKiB4bWUuYyAqLywKKwkJCSk7CisJCQlwYXRoID0gWE1FOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDAxNEI4ODIwOUMwREEwRjAwM0E5OUQ1IC8qIFhpbmVyYW1hICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDE0Qjg5RjA5QzBEQUI5MDAzQTk5RDUgLyogWGluZXJhbWEuYyAqLywKKwkJCSk7CisJCQlwYXRoID0gWGluZXJhbWE7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwMDE0Qjg4MzA5QzBEQTFBMDAzQTk5RDUgLyogWHYgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMTRCODk5MDlDMERBQUUwMDNBOTlENSAvKiBYdi5jICovLAorCQkJCTAwMTRCODlBMDlDMERBQUUwMDNBOTlENSAvKiBYdmxpYmludC5oICovLAorCQkJKTsKKwkJCXBhdGggPSBYdjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTAwMTYyRDRDMDlCRDIwREEwMDM3QzhEMCAvKiBwdGhyZWFkICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDE2MkQ0RDA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c2NvbmQuYyAqLywKKwkJCQkwMDE2MkQ0RTA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c211dGV4LmMgKi8sCisJCQkJMDAxNjJENEYwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNtdXRleF9jLmggKi8sCisJCQkJMDAxNjJENTAwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNzZW0uYyAqLywKKwkJCQkwMDE2MkQ1MTA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c3RocmVhZC5jICovLAorCQkJCTAwMTYyRDUyMDlCRDIwREEwMDM3QzhEMCAvKiBTRExfc3lzdGhyZWFkX2MuaCAqLywKKwkJCSk7CisJCQlwYXRoID0gcHRocmVhZDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTAwMTYyRDVGMDlCRDIxMDEwMDM3QzhEMCAvKiB1bml4ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDE2MkQ2MDA5QkQyMTAxMDAzN0M4RDAgLyogU0RMX3N5c3RpbWVyLmMgKi8sCisJCQkpOworCQkJcGF0aCA9IHVuaXg7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwMDE2MkQ2MzA5QkQyMTRFMDAzN0M4RDAgLyogc3RkbGliICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDE2MkQ2NTA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX2dldGVudi5jICovLAorCQkJCTAwMkYzMjg1MDlDQTA0OTEwMEVCRUI4OCAvKiBTRExfaWNvbnYuYyAqLywKKwkJCQkwMDE2MkQ2NjA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX21hbGxvYy5jICovLAorCQkJCTAwMTYyRDY3MDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfcXNvcnQuYyAqLywKKwkJCQkwMDE2MkQ2ODA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX3N0ZGxpYi5jICovLAorCQkJCTAwMTYyRDY5MDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfc3RyaW5nLmMgKi8sCisJCQkpOworCQkJbmFtZSA9IHN0ZGxpYjsKKwkJCXBhdGggPSAuLi8uLi9zcmMvc3RkbGliOworCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOworCQl9OworCQkwMDE2MkQ3NTA5QkQyMTdCMDAzN0M4RDAgLyogbG9hZHNvICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwNDZCOTFFODBBMTFCNTM1MDBGQjE1MUMgLyogZGxvcGVuICovLAorCQkJCTAwRDU1RjI1MEExMTE2M0QwMDMwRUQyQSAvKiBtYWNvc3ggKi8sCisJCQkpOworCQkJbmFtZSA9IGxvYWRzbzsKKwkJCXBhdGggPSAuLi8uLi9zcmMvbG9hZHNvOworCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOworCQl9OworCQkwMDE2MkYzMjA5QkUyN0ZCMDAzN0M4RDAgLyogZHVtbXkgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMTYyRjM0MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbGV2ZW50cy5jICovLAorCQkJCTAwMTYyRjM1MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbGV2ZW50c19jLmggKi8sCisJCQkJMDAxNjJGMzYwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsbW91c2UuYyAqLywKKwkJCQkwMDE2MkYzNzA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGxtb3VzZV9jLmggKi8sCisJCQkJMDAxNjJGMzgwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsdmlkZW8uYyAqLywKKwkJCQkwMDE2MkYzOTA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGx2aWRlby5oICovLAorCQkJKTsKKwkJCXBhdGggPSBkdW1teTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTAwMkYzMkQyMDlDQTBCRTcwMEVCRUI4OCAvKiBkaXNrICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGMzJENDA5Q0EwQkU3MDBFQkVCODggLyogU0RMX2Rpc2thdWRpby5jICovLAorCQkJCTAwMkYzMkQ1MDlDQTBCRTcwMEVCRUI4OCAvKiBTRExfZGlza2F1ZGlvLmggKi8sCisJCQkpOworCQkJcGF0aCA9IGRpc2s7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwMDJGMzJFMDA5Q0EwQkY2MDBFQkVCODggLyogZHVtbXkgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzMkUyMDlDQTBCRjYwMEVCRUI4OCAvKiBTRExfZHVtbXlhdWRpby5jICovLAorCQkJCTAwMkYzMkUzMDlDQTBCRjYwMEVCRUI4OCAvKiBTRExfZHVtbXlhdWRpby5oICovLAorCQkJKTsKKwkJCXBhdGggPSBkdW1teTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTAwRDU1RjI1MEExMTE2M0QwMDMwRUQyQSAvKiBtYWNvc3ggKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA0NkI5MjEwMEExMUI4QUQwMEZCMTUxQyAvKiBTRExfZGxjb21wYXQuYyAqLywKKwkJCSk7CisJCQlwYXRoID0gbWFjb3N4OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDE1MzgzMkMwMDZENzhENjdGMDAwMDAxIC8qIGF1ZGlvICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlCRUNERjVEMjA3NjFCNzU5MDA1RkU4NzIgLyogbWFjb3N4ICovLAorCQkJCTAwMkYzMkQyMDlDQTBCRTcwMEVCRUI4OCAvKiBkaXNrICovLAorCQkJCTAwMkYzMkUwMDlDQTBCRjYwMEVCRUI4OCAvKiBkdW1teSAqLywKKwkJCQkwMTUzODMzMDAwNkQ3OEQ2N0YwMDAwMDEgLyogU0RMX2F1ZGlvLmMgKi8sCisJCQkJMDE1MzgzMzEwMDZENzhENjdGMDAwMDAxIC8qIFNETF9hdWRpb2N2dC5jICovLAorCQkJCTAxNTM4MzMyMDA2RDc4RDY3RjAwMDAwMSAvKiBTRExfYXVkaW9kZXYuYyAqLywKKwkJCQkwMTUzODMzNDAwNkQ3OEQ2N0YwMDAwMDEgLyogU0RMX21peGVyLmMgKi8sCisJCQkJMDBCN0U2MUYwOTdGMkQ5RTAwODI2MTIxIC8qIFNETF9taXhlcl9NTVguYyAqLywKKwkJCQkwMEI3RTYyMDA5N0YyRDlFMDA4MjYxMjEgLyogU0RMX21peGVyX01NWC5oICovLAorCQkJCTAxNTM4MzM1MDA2RDc4RDY3RjAwMDAwMSAvKiBTRExfd2F2ZS5jICovLAorCQkJKTsKKwkJCW5hbWUgPSBhdWRpbzsKKwkJCXBhdGggPSAuLi8uLi9zcmMvYXVkaW87CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTAxNTM4MzY3MDA2RDc5MTQ3RjAwMDAwMSAvKiBldmVudHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAxNTM4MzY4MDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfYWN0aXZlLmMgKi8sCisJCQkJMDE1MzgzNjkwMDZENzkxNDdGMDAwMDAxIC8qIFNETF9ldmVudHMuYyAqLywKKwkJCQkwMTUzODM2QTAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX2V4cG9zZS5jICovLAorCQkJCTAxNTM4MzZCMDA2RDc5MTQ3RjAwMDAwMSAvKiBTRExfa2V5Ym9hcmQuYyAqLywKKwkJCQkwMTUzODM2QzAwNkQ3OTE0N0YwMDAwMDEgLyogU0RMX21vdXNlLmMgKi8sCisJCQkJMDE1MzgzNkQwMDZENzkxNDdGMDAwMDAxIC8qIFNETF9xdWl0LmMgKi8sCisJCQkJMDE1MzgzNkUwMDZENzkxNDdGMDAwMDAxIC8qIFNETF9yZXNpemUuYyAqLywKKwkJCSk7CisJCQluYW1lID0gZXZlbnRzOworCQkJcGF0aCA9IC4uLy4uL3NyYy9ldmVudHM7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTAxNTM4Mzc2MDA2RDc5MzA3RjAwMDAwMSAvKiBmaWxlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMTUzODM3NzAwNkQ3OTMwN0YwMDAwMDEgLyogU0RMX3J3b3BzLmMgKi8sCisJCQkpOworCQkJbmFtZSA9IGZpbGU7CisJCQlwYXRoID0gLi4vLi4vc3JjL2ZpbGU7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTAxNTM4Mzc5MDA2RDc5NzM3RjAwMDAwMSAvKiB0aHJlYWQgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMTYyRDRDMDlCRDIwREEwMDM3QzhEMCAvKiBwdGhyZWFkICovLAorCQkJCTAxNTM4NDQ1MDA2RDdFQzY3RjAwMDAwMSAvKiBTRExfdGhyZWFkLmMgKi8sCisJCQkpOworCQkJbmFtZSA9IHRocmVhZDsKKwkJCXBhdGggPSAuLi8uLi9zcmMvdGhyZWFkOworCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOworCQl9OworCQkwMTUzODM5MTAwNkQ3OUJDN0YwMDAwMDEgLyogdGltZXIgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMTYyRDVGMDlCRDIxMDEwMDM3QzhEMCAvKiB1bml4ICovLAorCQkJCTAxNTM4M0EwMDA2RDc5QkM3RjAwMDAwMSAvKiBTRExfdGltZXIuYyAqLywKKwkJCSk7CisJCQluYW1lID0gdGltZXI7CisJCQlwYXRoID0gLi4vLi4vc3JjL3RpbWVyOworCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOworCQl9OworCQkwMTUzODNCRTAwNkQ3QTU2N0YwMDAwMDEgLyogdmlkZW8gKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTBGQ0RGNUI1MDA4M0ZDRTc3RjAwMDAwMSAvKiBxdWFydHogKi8sCisJCQkJMDE1MzgzQzEwMDZEN0E1NjdGMDAwMDAxIC8qIG1hY2NvbW1vbiAqLywKKwkJCQkwMTUzODNDRTAwNkQ3QTU2N0YwMDAwMDEgLyogbWFjZHNwICovLAorCQkJCTAxNTM4M0QzMDA2RDdBNTY3RjAwMDAwMSAvKiBtYWNyb20gKi8sCisJCQkJMDAxNjJGMzIwOUJFMjdGQjAwMzdDOEQwIC8qIGR1bW15ICovLAorCQkJCTAwMTRCODMxMDlDMEQ5MUUwMDNBOTlENSAvKiB4MTEgKi8sCisJCQkJMDAxNEI3RDgwOUMwRDgwODAwM0E5OUQ1IC8qIGRnYSAqLywKKwkJCQkwMDE0Qjg3RDA5QzBEOThBMDAzQTk5RDUgLyogWGV4dCAqLywKKwkJCQkwMTUzODNEODAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2JsaXQuYyAqLywKKwkJCQkwMTUzODNEQTAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2JsaXRfMC5jICovLAorCQkJCTAxNTM4M0RCMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfYmxpdF8xLmMgKi8sCisJCQkJMDE1MzgzREMwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9ibGl0X0EuYyAqLywKKwkJCQkwMTUzODNERTAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2JsaXRfTi5jICovLAorCQkJCTAxNTM4M0RGMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfYm1wLmMgKi8sCisJCQkJMDE1MzgzRTAwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9jdXJzb3IuYyAqLywKKwkJCQkwMTUzODNFMjAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2dhbW1hLmMgKi8sCisJCQkJMDE1MzgzRTYwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9waXhlbHMuYyAqLywKKwkJCQkwMTUzODNFODAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX1JMRWFjY2VsLmMgKi8sCisJCQkJMDE1MzgzRUEwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9zdHJldGNoLmMgKi8sCisJCQkJMDE1MzgzRUMwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9zdXJmYWNlLmMgKi8sCisJCQkJMDE1MzgzRUUwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF92aWRlby5jICovLAorCQkJCTAxNTM4M0VGMDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfeXV2LmMgKi8sCisJCQkJMDBCN0U2MjUwOTdGMkREMTAwODI2MTIxIC8qIFNETF95dXZfbW14LmMgKi8sCisJCQkJMDE1MzgzRjEwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF95dXZfc3cuYyAqLywKKwkJCSk7CisJCQluYW1lID0gdmlkZW87CisJCQlwYXRoID0gLi4vLi4vc3JjL3ZpZGVvOworCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOworCQl9OworCQkwMTUzODNDMTAwNkQ3QTU2N0YwMDAwMDEgLyogbWFjY29tbW9uICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMTUzODNDNTAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX21hY2V2ZW50cy5jICovLAorCQkJCTAxNTM4M0M3MDA2RDdBNTY3RjAwMDAwMSAvKiBTRExfbWFjZ2wuYyAqLywKKwkJCQkwMTUzODNDQTAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX21hY21vdXNlLmMgKi8sCisJCQkJMDE1MzgzQ0MwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9tYWN3bS5jICovLAorCQkJKTsKKwkJCXBhdGggPSBtYWNjb21tb247CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwMTUzODNDRTAwNkQ3QTU2N0YwMDAwMDEgLyogbWFjZHNwICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMTUzODNEMTAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX2RzcHZpZGVvLmMgKi8sCisJCQkJMDE1MzgzRDIwMDZEN0E1NjdGMDAwMDAxIC8qIFNETF9kc3B2aWRlby5oICovLAorCQkJKTsKKwkJCXBhdGggPSBtYWNkc3A7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwMTUzODNEMzAwNkQ3QTU2N0YwMDAwMDEgLyogbWFjcm9tICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMTUzODNENjAwNkQ3QTU2N0YwMDAwMDEgLyogU0RMX3JvbXZpZGVvLmMgKi8sCisJCQkpOworCQkJcGF0aCA9IG1hY3JvbTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTAxNTM4NDRBMDA2RDgxQjA3RjAwMDAwMSAvKiBQdWJsaWMgSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDAxNjJEMzIwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWdfZHJlYW1jYXN0LmggKi8sCisJCQkJMDAxNjJEMzMwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWdfbWFjb3MuaCAqLywKKwkJCQkwMDE2MkQzNDA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19tYWNvc3guaCAqLywKKwkJCQkwMDE2MkQzNTA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19vczIuaCAqLywKKwkJCQkwMDE2MkQzNjA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ193aW4zMi5oICovLAorCQkJCTAwMTYyRDM3MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnLmggKi8sCisJCQkJMDAxNjJEMzgwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9wbGF0Zm9ybS5oICovLAorCQkJCTAwMTYyRDM5MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfc3RkaW5jLmggKi8sCisJCQkJMEM1QUY1RTUwMTE5MUQyQjdGMDAwMDAxIC8qIGJlZ2luX2NvZGUuaCAqLywKKwkJCQkwQzVBRjVFNjAxMTkxRDJCN0YwMDAwMDEgLyogY2xvc2VfY29kZS5oICovLAorCQkJCTBDNUFGNUU3MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfYWN0aXZlLmggKi8sCisJCQkJMEM1QUY1RTgwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9hdWRpby5oICovLAorCQkJCTBDNUFGNUU5MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfYnl0ZW9yZGVyLmggKi8sCisJCQkJMEM1QUY1RUEwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9jZHJvbS5oICovLAorCQkJCTBDNUFGNUVCMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfY29weWluZy5oICovLAorCQkJCUIyQ0Y4REM0MDVDNDQ0RTQwMEU1REM3RiAvKiBTRExfY3B1aW5mby5oICovLAorCQkJCTBDNUFGNUVDMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfZW5kaWFuLmggKi8sCisJCQkJMEM1QUY1RUQwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9lcnJvci5oICovLAorCQkJCTBDNUFGNUVFMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfZXZlbnRzLmggKi8sCisJCQkJMEM1QUY1RUYwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9nZXRlbnYuaCAqLywKKwkJCQkwQzVBRjVGMDAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX2pveXN0aWNrLmggKi8sCisJCQkJMEM1QUY1RjEwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9rZXlib2FyZC5oICovLAorCQkJCTBDNUFGNUYyMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfa2V5c3ltLmggKi8sCisJCQkJQjI5QTI5MEQwNEU1QjI4NzAwQTgwMDAyIC8qIFNETF9sb2Fkc28uaCAqLywKKwkJCQkwQzVBRjVGMzAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX21haW4uaCAqLywKKwkJCQkwQzVBRjVGNDAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX21vdXNlLmggKi8sCisJCQkJMEM1QUY1RjUwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9tdXRleC5oICovLAorCQkJCUIyQ0Y4REM3MDVDNDQ1MDUwMEU1REM3RiAvKiBTRExfbmFtZS5oICovLAorCQkJCTBDNUFGNUY2MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfb3BlbmdsLmggKi8sCisJCQkJMEM1QUY1RjcwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9xdWl0LmggKi8sCisJCQkJMEM1QUY1RjgwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF9yd29wcy5oICovLAorCQkJCTBDNUFGNUY5MDExOTFEMkI3RjAwMDAwMSAvKiBTRExfc3lzd20uaCAqLywKKwkJCQkwQzVBRjVGQTAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX3RocmVhZC5oICovLAorCQkJCTBDNUFGNUZCMDExOTFEMkI3RjAwMDAwMSAvKiBTRExfdGltZXIuaCAqLywKKwkJCQkwQzVBRjVGQzAxMTkxRDJCN0YwMDAwMDEgLyogU0RMX3R5cGVzLmggKi8sCisJCQkJMEM1QUY1RkQwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF92ZXJzaW9uLmggKi8sCisJCQkJMEM1QUY1RkUwMTE5MUQyQjdGMDAwMDAxIC8qIFNETF92aWRlby5oICovLAorCQkJCTBDNUFGNUZGMDExOTFEMkI3RjAwMDAwMSAvKiBTREwuaCAqLywKKwkJCSk7CisJCQluYW1lID0gIlB1YmxpYyBIZWFkZXJzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTAzNDc2OERERkYzOEE0NUExMURCOUM4QiAvKiBQcm9kdWN0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDg5QzE2NjVGRTg0MTE1OEMwMkFBQzA3IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUNERjY2QzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMLmZyYW1ld29yayAqLywKKwkJCQlCRUNERjZCMzA3NjFCQTgxMDA1RkU4NzIgLyogbGliU0RMLmEgKi8sCisJCQkJQkVDREY2QkEwNzYxQkE4MTAwNUZFODcyIC8qIGxpYlNETG1haW4uYSAqLywKKwkJCQlCRUNERjZCRTA3NjFCQTgxMDA1RkU4NzIgLyogU3RhbmRhcmQgRE1HICovLAorCQkJCUJFQ0RGNkMzMDc2MUJBODEwMDVGRTg3MiAvKiBEZXZlbG9wZXIgRXh0cmFzIFBhY2thZ2UgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDQ2QjkxRTgwQTExQjUzNTAwRkIxNTFDIC8qIGRsb3BlbiAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDQ2QjkxRTkwQTExQjUzNTAwRkIxNTFDIC8qIFNETF9zeXNsb2Fkc28uYyAqLywKKwkJCSk7CisJCQlwYXRoID0gZGxvcGVuOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDgzRTQ4OTIwMDZEODZGRjdGMDAwMDAxIC8qIGNkcm9tICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlCMkEyM0E0MjA0MTU3OTkxMDBBODAwMDIgLyogbWFjb3N4ICovLAorCQkJCTA4M0U0ODkzMDA2RDg2RkY3RjAwMDAwMSAvKiBkdW1teSAqLywKKwkJCQkwODNFNDg5NTAwNkQ4NkZGN0YwMDAwMDEgLyogU0RMX2Nkcm9tLmMgKi8sCisJCQkpOworCQkJbmFtZSA9IGNkcm9tOworCQkJcGF0aCA9IC4uLy4uL3NyYy9jZHJvbTsKKwkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKKwkJfTsKKwkJMDgzRTQ4OTMwMDZEODZGRjdGMDAwMDAxIC8qIGR1bW15ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODNFNDg5NDAwNkQ4NkZGN0YwMDAwMDEgLyogU0RMX3N5c2Nkcm9tLmMgKi8sCisJCQkpOworCQkJcGF0aCA9IGR1bW15OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDgzRTQ4OUEwMDZEODhEOTdGMDAwMDAxIC8qIGpveXN0aWNrICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGNTE3ODlEMDAxNzY5QTI0MDFEM0Q1NUIgLyogZGFyd2luICovLAorCQkJCTA4M0U0ODlEMDA2RDg4RDk3RjAwMDAwMSAvKiBTRExfam95c3RpY2suYyAqLywKKwkJCSk7CisJCQluYW1lID0gam95c3RpY2s7CisJCQlwYXRoID0gLi4vLi4vc3JjL2pveXN0aWNrOworCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOworCQl9OworCQkwODY3RDY5MUZFODQwMjhGQzAyQUFDMDcgLyogU0RMRnJhbWV3b3JrICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGNUEyRUYzOTAwQzZBMzlBMDEwMDAwMDEgLyogQlVHUyAqLywKKwkJCQlGNUEyRUYzQTAwQzZBM0MyMDEwMDAwMDEgLyogUkVBRE1FLk1hY09TWCAqLywKKwkJCQlGNTlDNzBGQzAwRDVDQjU4MDEwMDAwMDEgLyogcGtnLXN1cHBvcnQgKi8sCisJCQkJRjVCMkE1ODQwMEM1RDM5MDAxMDAwMDAxIC8qIE1haW4gKi8sCisJCQkJMDE1Mzg0NEEwMDZEODFCMDdGMDAwMDAxIC8qIFB1YmxpYyBIZWFkZXJzICovLAorCQkJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBMaWJyYXJ5IFNvdXJjZSAqLywKKwkJCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8sCisJCQkJQkVDREY2NkIwNzYxQkE4MTAwNUZFODcyIC8qIEluZm8tRnJhbWV3b3JrLnBsaXN0ICovLAorCQkJCUJFQzU2MkZFMDc2MUMwRTgwMEEzMzAyOSAvKiBMaW5rZWQgRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQljb21tZW50cyA9ICJUbyBidWlsZCBVbml2ZXJzYWwgQmluYXJpZXMsIHdlIGhhdmUgZXhwZXJpbWVudGVkIHdpdGggYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBvcHRpb25zLlxuVGhlIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHdlIG11c3QgcmV0YWluIGNvbXBhdGliaWxpdHkgd2l0aCBhdCBsZWFzdCAxMC4yLiBcblRoZSBVbml2ZXJzYWwgQmluYXJ5IGRlZmF1bHRzIG9ubHkgd29yayBmb3IgPiAxMC4zLjlcblxuU28gZmFyLCB3ZSBoYXZlIGZvdW5kOlxuZ2NjIDQuMC4wIHdpdGggWGNvZGUgMi4xIGFsd2F5cyBsaW5rcyBhZ2FpbnN0IGxpYmdjY19zLiBnY2MgNC4wLjEgZnJvbSBYY29kZSAyLjIgZml4ZXMgdGhpcyBwcm9ibGVtLlxuXG5CdXQgZ2NjIDQuMCB3aWxsIG5vdCB3b3JrIHdpdGggPCAxMC4zLjkgYmVjYXVzZSB3ZSBjb250aW51ZSB0byBnZXQgYW4gdW5kZWZpbmVkIHN5bWJvbCB0byBfZnByaW50ZiRMREJMMTI4LlxuU28gd2UgbXVzdCB1c2UgZ2NjIDMuMyBvbiBQUEMgdG8gYWNjb21wbGlzaCAxMC4yIHN1cHBvcnQuIChCdXQgNC4wIGlzIHJlcXVpcmVkIGZvciBpMzg2LilcblxuU2V0dGluZyB0aGUgZGVwbG95bWVudCB0YXJnZXQgdG8gMTAuNCB3aWxsIGRpc2FibGUgcHJlYmluZGluZywgc28gZm9yIFBQQywgd2Ugc2V0IGl0IGxlc3MgdGhhbiAxMC40IHRvIHByZXNlcnZlIHByZWJpbmRpbmcgZm9yIGxlZ2FjeSBzdXBwb3J0LlxuXG5TZXR0aW5nIHRoZSBQUEMgU0RLUk9PVCB0byAvRGV2ZWxvcGVycy9TREtzL01hY09TWDEwLjIuOC5zZGsgd2lsbCBsaW5rIHRvIDYzLjAuMCBsaWJTeXN0ZW0uQi5keWxpYi4gTGVhdmluZyBpdCBhdCBjdXJyZW50IG9yIDEwLjR1IGxpbmtzIHRvIDg4LjEuMi4gSG93ZXZlciwgYXMgbG9uZyBhcyB3ZSBhcmUgdXNpbmcgZ2NjIDMuMywgaXQgZG9lc24ndCBzZWVtIHRvIG1hdHRlciBhcyB0ZXN0aW5nIGhhcyBkZW1vbnN0cmF0ZWQgYm90aCB3aWxsIHJ1bi4gV2UgaGF2ZSBkZWNpZGVkIG5vdCB0byBpbnZva2UgdGhlIDEwLjIuOCBTREsgYmVjYXVzZSBpdCBpcyBub3QgYSBkZWZhdWx0IGluc3RhbGxlZCBjb21wb25lbnQgd2l0aCBYY29kZSB3aGljaCB3aWxsIHByb2JhYmx5IGNhdXNlIG1vc3QgcGVvcGxlIHByb2JsZW1zLiBIb3dldmVyLCByYXRoZXIgdGhhbiBkZWxldGluZyB0aGUgU0RLUk9PVF9wcGMgZW50cnkgZW50aXJlbHksIHdlIGhhdmUgbWFwcGVkIGl0IHRvIDEwLjR1IGluIGNhc2Ugd2UgZGVjaWRlIHdlIG5lZWQgdG8gY2hhbmdlIHRoaXMgc2V0dGluZy5cblxuVG8gdXNlIEFsdGl2ZWMgb3IgU1NFLCB3ZSBuZWVkZWQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZsYWdzOlxuT1RIRVJfQ0ZMQUdTX3BwY1xuT1RIRVJfQ0ZMQUdTX2kzODZcbk9USEVSX0NGTEFHUz0kKE9USEVSX0NGTEFHU18oJENVUlJFTlRfQVJDSCkpXG5cblRoZSBnZW5lcmFsIE9USEVSX0NGTEFHUyBuZWVkZWQgdG8gYmUgbWFudWFsbHkgbWFwcGVkIHRvIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBvcHRpb25zIGJlY2F1c2UgWGNvZGUgZGlkbid0IGRvIHRoaXMgYXV0b21hdGljYWxseSBmb3IgdXMuXG5cblxuIjsKKwkJCW5hbWUgPSBTRExGcmFtZXdvcms7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwODlDMTY2NUZFODQxMTU4QzAyQUFDMDcgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCSk7CisJCQluYW1lID0gUmVzb3VyY2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDhGQjc3QUNGRTg0MTcwN0MwMkFBQzA3IC8qIExpYnJhcnkgU291cmNlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMTUzODMyQzAwNkQ3OEQ2N0YwMDAwMDEgLyogYXVkaW8gKi8sCisJCQkJMDgzRTQ4OTIwMDZEODZGRjdGMDAwMDAxIC8qIGNkcm9tICovLAorCQkJCUIyNERBNTAxMDVBODhENTIwMDZCOUYxQyAvKiBjcHVpbmZvICovLAorCQkJCTAxNTM4MzY3MDA2RDc5MTQ3RjAwMDAwMSAvKiBldmVudHMgKi8sCisJCQkJMDE1MzgzNzYwMDZENzkzMDdGMDAwMDAxIC8qIGZpbGUgKi8sCisJCQkJMDgzRTQ4OUEwMDZEODhEOTdGMDAwMDAxIC8qIGpveXN0aWNrICovLAorCQkJCTAwMTYyRDc1MDlCRDIxN0IwMDM3QzhEMCAvKiBsb2Fkc28gKi8sCisJCQkJMDAxNjJENjMwOUJEMjE0RTAwMzdDOEQwIC8qIHN0ZGxpYiAqLywKKwkJCQkwMTUzODM3OTAwNkQ3OTczN0YwMDAwMDEgLyogdGhyZWFkICovLAorCQkJCTAxNTM4MzkxMDA2RDc5QkM3RjAwMDAwMSAvKiB0aW1lciAqLywKKwkJCQkwMTUzODNCRTAwNkQ3QTU2N0YwMDAwMDEgLyogdmlkZW8gKi8sCisJCQkJMDE1Mzg0MzgwMDZEN0Q5NDdGMDAwMDAxIC8qIFNETF9lcnJvci5jICovLAorCQkJCTAxNTM4NDM5MDA2RDdEOTQ3RjAwMDAwMSAvKiBTRExfZmF0YWwuYyAqLywKKwkJCQkwMTUzODQzQzAwNkQ3RDk0N0YwMDAwMDEgLyogU0RMLmMgKi8sCisJCQkpOworCQkJbmFtZSA9ICJMaWJyYXJ5IFNvdXJjZSI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwRkNERjVCNTAwODNGQ0U3N0YwMDAwMDEgLyogcXVhcnR6ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMEQwRDAyMjEwNjc1ODIzMDA0QjA1RUYgLyogU0RMX1F1YXJ0eldNLmggKi8sCisJCQkJQjI0REE0RDYwNUE4OEFEMDAwNkI5RjFDIC8qIENHUy5oICovLAorCQkJCUIyNERBNEQ3MDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6RXZlbnRzLm0gKi8sCisJCQkJQjI0REE0RDgwNUE4OEFEMDAwNkI5RjFDIC8qIFNETF9RdWFydHpHTC5tICovLAorCQkJCUIyNERBNEQ5MDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6S2V5cy5oICovLAorCQkJCUIyNERBNERBMDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6VmlkZW8uaCAqLywKKwkJCQlCMjREQTREQjA1QTg4QUQwMDA2QjlGMUMgLyogU0RMX1F1YXJ0elZpZGVvLm0gKi8sCisJCQkJQjI0REE0REMwNUE4OEFEMDAwNkI5RjFDIC8qIFNETF9RdWFydHpXaW5kb3cuaCAqLywKKwkJCQlCMjREQTRERDA1QTg4QUQwMDA2QjlGMUMgLyogU0RMX1F1YXJ0eldpbmRvdy5tICovLAorCQkJCUIyNERBNERFMDVBODhBRDAwMDZCOUYxQyAvKiBTRExfUXVhcnR6V00ubSAqLywKKwkJCSk7CisJCQluYW1lID0gcXVhcnR6OworCQkJcGF0aCA9IC4uLy4uL3NyYy92aWRlby9xdWFydHo7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCUIyNERBNTAxMDVBODhENTIwMDZCOUYxQyAvKiBjcHVpbmZvICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlCMjREQTUwNDA1QTg4RDUyMDA2QjlGMUMgLyogU0RMX2NwdWluZm8uYyAqLywKKwkJCSk7CisJCQluYW1lID0gY3B1aW5mbzsKKwkJCXBhdGggPSAuLi8uLi9zcmMvY3B1aW5mbzsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUIyQTIzQTQyMDQxNTc5OTEwMEE4MDAwMiAvKiBtYWNvc3ggKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwNEMyQzg2MDk3NUUxMzMwMEU5RDQzMCAvKiBBdWRpb0ZpbGVQbGF5ZXIuYyAqLywKKwkJCQlCMkEyM0E0NTA0MTU3OTkxMDBBODAwMDIgLyogQXVkaW9GaWxlUGxheWVyLmggKi8sCisJCQkJMDA0QzJDODcwOTc1RTEzMzAwRTlENDMwIC8qIEF1ZGlvRmlsZVJlYWRlclRocmVhZC5jICovLAorCQkJCTAwNEMyQzg4MDk3NUUxMzMwMEU5RDQzMCAvKiBDRFBsYXllci5jICovLAorCQkJCUIyQTIzQTgxMDQxNTdENUQwMEE4MDAwMiAvKiBDRFBsYXllci5oICovLAorCQkJCTAwNEMyQzg5MDk3NUUxMzMwMEU5RDQzMCAvKiBTRExPU1hDQUd1YXJkLmMgKi8sCisJCQkJMDA0QzJDOEEwOTc1RTEzMzAwRTlENDMwIC8qIFNETE9TWENBR3VhcmQuaCAqLywKKwkJCQlCMkEyM0E3QjA0MTU3QzU3MDBBODAwMDIgLyogU0RMX3N5c2Nkcm9tLmMgKi8sCisJCQkJQjJBMjNBN0EwNDE1N0M1NzAwQTgwMDAyIC8qIFNETF9zeXNjZHJvbV9jLmggKi8sCisJCQkpOworCQkJcGF0aCA9IG1hY29zeDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUJFQzU2MkZFMDc2MUMwRTgwMEEzMzAyOSAvKiBMaW5rZWQgRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDBEMEQwODMxMDY3NUREOTAwNEIwNUVGIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLywKKwkJCQkwMDczMTdDMTA4NThFMTUwMDBCMkJDMzIgLyogQ2FyYm9uLmZyYW1ld29yayAqLywKKwkJCQkwMDczMTc5QjA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Ub29sYm94LmZyYW1ld29yayAqLywKKwkJCQkwMDczMTc5QzA4NThERUNEMDBCMkJDMzIgLyogQXVkaW9Vbml0LmZyYW1ld29yayAqLywKKwkJCQkwMDczMTc5RDA4NThERUNEMDBCMkJDMzIgLyogQ29jb2EuZnJhbWV3b3JrICovLAorCQkJCTAwNzMxNzlFMDg1OERFQ0QwMEIyQkMzMiAvKiBDb3JlQXVkaW8uZnJhbWV3b3JrICovLAorCQkJCTAwNzMxNzlGMDg1OERFQ0QwMEIyQkMzMiAvKiBJT0tpdC5mcmFtZXdvcmsgKi8sCisJCQkJMDA3MzE3QTAwODU4REVDRDAwQjJCQzMyIC8qIE9wZW5HTC5mcmFtZXdvcmsgKi8sCisJCQkJMDA3MzE3QTEwODU4REVDRDAwQjJCQzMyIC8qIFF1aWNrVGltZS5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJMaW5rZWQgRnJhbWV3b3JrcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQlCRUNERjVEMjA3NjFCNzU5MDA1RkU4NzIgLyogbWFjb3N4ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlCRUNERjVENTA3NjFCNzU5MDA1RkU4NzIgLyogU0RMX2NvcmVhdWRpby5jICovLAorCQkJCUJFQ0RGNUQ2MDc2MUI3NTkwMDVGRTg3MiAvKiBTRExfY29yZWF1ZGlvLmggKi8sCisJCQkpOworCQkJbmFtZSA9IG1hY29zeDsKKwkJCXBhdGggPSAuLi8uLi9zcmMvYXVkaW8vbWFjb3N4OworCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOworCQl9OworCQlGNTE3ODlEMDAxNzY5QTI0MDFEM0Q1NUIgLyogZGFyd2luICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGNTE3ODlEMTAxNzY5QTI0MDFEM0Q1NUIgLyogU0RMX3N5c2pveXN0aWNrLmMgKi8sCisJCQkpOworCQkJbmFtZSA9IGRhcndpbjsKKwkJCXBhdGggPSAuLi8uLi9zcmMvam95c3RpY2svZGFyd2luOworCQkJc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOworCQl9OworCQlGNTlDNzBGQzAwRDVDQjU4MDEwMDAwMDEgLyogcGtnLXN1cHBvcnQgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY1OUM3MEZFMDBENUNCNTgwMTAwMDAwMSAvKiBkZXZlbC1yZXNvdXJjZXMgKi8sCisJCQkJRjU5QzcxMDEwMEQ1Q0I1ODAxMDAwMDAxIC8qIHJlc291cmNlcyAqLywKKwkJCQlGNUY4MUFENDAwRDcwNkIxMDEwMDAwMDEgLyogUmVhZG1lIFNETCBEZXZlbG9wZXIudHh0ICovLAorCQkJCUY1OUM3MTA1MDBENUNCNTgwMTAwMDAwMSAvKiBTREwtZGV2ZWwuaW5mbyAqLywKKwkJCQlGNTlDNzEwNjAwRDVDQjU4MDEwMDAwMDEgLyogU0RMLmluZm8gKi8sCisJCQkpOworCQkJcGF0aCA9ICJwa2ctc3VwcG9ydCI7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCUY1OUM3MEZFMDBENUNCNTgwMTAwMDAwMSAvKiBkZXZlbC1yZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY1OUM3MTBDMDBENUQxNTgwMTAwMDAwMSAvKiBpbnN0YWxsLnNoICovLAorCQkJCUY1OUM3MEZGMDBENUNCNTgwMTAwMDAwMSAvKiBSZWFkTWUudHh0ICovLAorCQkJCUY1OUM3MTAwMDBENUNCNTgwMTAwMDAwMSAvKiBXZWxjb21lLnR4dCAqLywKKwkJCSk7CisJCQlwYXRoID0gImRldmVsLXJlc291cmNlcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQlGNTlDNzEwMTAwRDVDQjU4MDEwMDAwMDEgLyogcmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDc5NEQzRjA5RDBDNDYxMDAzRkM4QTEgLyogTGljZW5zZS5ydGYgKi8sCisJCQkJMDBGNUQ3OUUwOTkwQ0EwRDAwNTFDNDQ5IC8qIFVuaXZlcnNhbEJpbmFyeU5vdGVzLnJ0ZiAqLywKKwkJCQkwMEFFNkUxRTA4Qjk1OENDMDAyNTVFMkYgLyogUmVhZE1lRGV2TGl0ZS50eHQgKi8sCisJCQkJRjU5QzcxMDMwMEQ1Q0I1ODAxMDAwMDAxIC8qIFJlYWRNZS50eHQgKi8sCisJCQkpOworCQkJcGF0aCA9IHJlc291cmNlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY1QjJBNTg0MDBDNUQzOTAwMTAwMDAwMSAvKiBNYWluICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkyRUVDREYyRDAwODZDM0EwN0YwMDAwMDEgLyogU0RMTWFpbi5oICovLAorCQkJCTJFRUNERjJFMDA4NkMzQTA3RjAwMDAwMSAvKiBTRExNYWluLm0gKi8sCisJCQkJMkVFQ0RGMkYwMDg2QzNBMDdGMDAwMDAxIC8qIFNETE1haW4ubmliICovLAorCQkJKTsKKwkJCW5hbWUgPSBNYWluOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJQkVDREY1RkYwNzYxQkE4MTAwNUZFODcyIC8qIEhlYWRlcnMgKi8gPSB7CisJCQlpc2EgPSBQQlhIZWFkZXJzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDE2MkRBNDA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyREE1MDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY29uZmlnX21hY29zLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRBNjA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2NvbmZpZ19tYWNvc3guaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyREE3MDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY29uZmlnX29zMi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQTgwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9jb25maWdfd2luMzIuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyREE5MDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY29uZmlnLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRBQTA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3BsYXRmb3JtLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRBQjA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3N0ZGluYy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQUMwOUJEMjIyRjAwMzdDOEQwIC8qIGJlZ2luX2NvZGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyREFEMDlCRDIyMkYwMDM3QzhEMCAvKiBjbG9zZV9jb2RlLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRBRTA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2FjdGl2ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQUYwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9hdWRpby5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQjAwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9ieXRlb3JkZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyREIxMDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY2Ryb20uaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyREIyMDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfY29weWluZy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQjMwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9jcHVpbmZvLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRCNDA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2VuZGlhbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQjUwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9lcnJvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQjYwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9ldmVudHMuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyREI3MDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfZ2V0ZW52LmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRCODA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2pveXN0aWNrLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRCOTA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2tleWJvYXJkLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRCQTA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX2tleXN5bS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQkIwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9sb2Fkc28uaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyREJDMDlCRDIyMkYwMDM3QzhEMCAvKiBTRExfbWFpbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQkQwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9tb3VzZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQkUwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9tdXRleC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQkYwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9uYW1lLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRDMDA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX29wZW5nbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQzEwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF9xdWl0LmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRDMjA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3J3b3BzLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRDMzA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3N5c3dtLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRDNDA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3RocmVhZC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQzUwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF90aW1lci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQzYwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF90eXBlcy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJEQzcwOUJEMjIyRjAwMzdDOEQwIC8qIFNETF92ZXJzaW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRDODA5QkQyMjJGMDAzN0M4RDAgLyogU0RMX3ZpZGVvLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkRDOTA5QkQyMjJGMDAzN0M4RDAgLyogU0RMLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMEQwRDAyMzEwNjc1ODIzMDA0QjA1RUYgLyogU0RMX1F1YXJ0eldNLmggaW4gSGVhZGVycyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDREY2NkUwNzYxQkE4MTAwNUZFODcyIC8qIEhlYWRlcnMgKi8gPSB7CisJCQlpc2EgPSBQQlhIZWFkZXJzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUNERjY3MjA3NjFCQTgxMDA1RkU4NzIgLyogQ0dTLmggaW4gSGVhZGVycyAqLywKKwkJCQlCRUNERjY3MzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1F1YXJ0ektleXMuaCBpbiBIZWFkZXJzICovLAorCQkJCUJFQ0RGNjc0MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6VmlkZW8uaCBpbiBIZWFkZXJzICovLAorCQkJCUJFQ0RGNjc1MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6V2luZG93LmggaW4gSGVhZGVycyAqLywKKwkJCQlCRUNERjY3NjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2NwdWluZm8uaCBpbiBIZWFkZXJzICovLAorCQkJCUJFQ0RGNjc3MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfbmFtZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJQkVDREY2NzgwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9jb3JlYXVkaW8uaCBpbiBIZWFkZXJzICovLAorCQkJCTAwNEMyQzk0MDk3NUUxMzMwMEU5RDQzMCAvKiBTRExPU1hDQUd1YXJkLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkQ0NDA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19kcmVhbWNhc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyRDQ1MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnX21hY29zLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkQ0NjA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX2NvbmZpZ19tYWNvc3guaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyRDQ3MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnX29zMi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJENDgwOUJEMUZBOTAwMzdDOEQwIC8qIFNETF9jb25maWdfd2luMzIuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyRDQ5MDlCRDFGQTkwMDM3QzhEMCAvKiBTRExfY29uZmlnLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkQ0QTA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX3BsYXRmb3JtLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkQ0QjA5QkQxRkE5MDAzN0M4RDAgLyogU0RMX3N0ZGluYy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJENUIwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNtdXRleF9jLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkQ1RTA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c3RocmVhZF9jLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE2MkU2QjA5QkQyNzM3MDAzN0M4RDAgLyogU0RMX21peGVyX01NWC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNjJGNDIwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsZXZlbnRzX2MuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyRjQ0MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbG1vdXNlX2MuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTYyRjQ2MDlCRTI3RkIwMDM3QzhEMCAvKiBTRExfbnVsbHZpZGVvLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE0QjdGNDA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYWV2ZW50c19jLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE0QjdGNjA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYW1vdXNlX2MuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTRCN0Y5MDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhdmlkZW8uaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTRCODY1MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZGdhX2MuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTRCODY4MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZHluLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE0Qjg2OTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWV2ZW50c19jLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE0Qjg2QjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdhbW1hX2MuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTRCODZEMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZ2xfYy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNEI4NkYwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFpbWFnZV9jLmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDE0Qjg3MTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vZGVzX2MuaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTRCODczMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExbW91c2VfYy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNEI4NzUwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFzeW0uaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTRCODc3MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExdmlkZW8uaCBpbiBIZWFkZXJzICovLAorCQkJCTAwMTRCODc4MDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExd21fYy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNEI4N0EwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTF5dXZfYy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAxNEI4OUUwOUMwREFBRTAwM0E5OUQ1IC8qIFh2bGliaW50LmggaW4gSGVhZGVycyAqLywKKwkJCQkwMDJGMzJEQTA5Q0EwQkU3MDBFQkVCODggLyogU0RMX2Rpc2thdWRpby5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDAyRjMyRTgwOUNBMEJGNjAwRUJFQjg4IC8qIFNETF9kdW1teWF1ZGlvLmggaW4gSGVhZGVycyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDREY2QjUwNzYxQkE4MTAwNUZFODcyIC8qIEhlYWRlcnMgKi8gPSB7CisJCQlpc2EgPSBQQlhIZWFkZXJzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCUJFQ0RGNUZFMDc2MUJBODEwMDVGRTg3MiAvKiBGcmFtZXdvcmsgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDA3MzE3N0EwODU4REIwNTAwQjJCQzMyIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJGcmFtZXdvcmsiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMDBENTVGMDUwQTExMTQzRTAwMzBFRDJBIC8qIFJ1biBTY3JpcHQgdG8gQ3JlYXRlIFNETF9jb25maWcuaCAqLywKKwkJCQlCRUNERjVGRjA3NjFCQTgxMDA1RkU4NzIgLyogSGVhZGVycyAqLywKKwkJCQlCRUNERjYyQTA3NjFCQTgxMDA1RkU4NzIgLyogUmVzb3VyY2VzICovLAorCQkJCUJFQ0RGNjJDMDc2MUJBODEwMDVGRTg3MiAvKiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjY4MDc2MUJBODEwMDVGRTg3MiAvKiBGcmFtZXdvcmtzICovLAorCQkJCUJFQ0RGNjY5MDc2MUJBODEwMDVGRTg3MiAvKiBSZXogKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQljb21tZW50cyA9ICJXZSByZWNvbW1lbmQgaW5zdGFsbGluZyB0byAvTGlicmFyeS9GcmFtZXdvcmtzXG5BbiBhbHRlcm5hdGl2ZSBpcyAkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyBmb3IgcGVyLXVzZXIgaWYgcGVybWlzc2lvbnMgYXJlIGFuIGlzc3VlLlxuXG5BZGQgdGhlIGZyYW1ld29yayB0byB0aGUgR3JvdXBzICYgRmlsZXMgcGFuZWwgKHVuZGVyIExpbmtlZCBGcmFtZXdvcmtzIGlzIGEgZ29vZCBwbGFjZSkgYW5kIGVuYWJsZSB0aGUgY2hlY2sgYm94IGZvciB0aGUgdGFyZ2V0cyB0aGF0IG5lZWQgdG8gbGluayB0byBpdC4gWW91IGNhbiBhbHNvIG1hbnVhbGx5IGFkZCBcIi1mcmFtZXdvcmsgU0RMXCIgdG8geW91ciBsaW5rZXIgZmxhZ3MgaWYgeW91IGRvbid0IGxpa2UgdGhlIGNoZWNrIGJveCBzeXN0ZW0uXG5cbkFkZCAvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycyB0byB5b3VyIGhlYWRlciBzZWFyY2ggcGF0aFxuQWRkIC9MaWJyYXJ5L0ZyYW1ld29ya3MgdG8geW91ciBsaWJyYXJ5IHNlYXJjaCBwYXRoXG4oQWRqdXN0IHRoZSB0d28gYWJvdmUgaWYgaW5zdGFsbGVkIGluICQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzLiBZb3UgY2FuIGFsc28gbGlzdCBib3RoIHBhdGhzIGlmIHlvdSB3YW50IHJvYnVzdG5lc3MuKVxuXG5XZSB1c2VkIHRvIHVzZSBhbiBleHBvcnRzIGZpbGUuIEl0IHdhcyBiZWNvbWluZyBhIG1haW50ZW5hbmNlIGlzc3VlIHdlIGtlcHQgbmVnbGVjdGluZywgc28gd2UgaGF2ZSByZW1vdmVkIGl0LiBJZiB5b3UgbmVlZCBpdCBiYWNrLCBzZXQgdGhlIFwiRXhwb3J0ZWQgU3ltYm9scyBGaWxlXCIgb3B0aW9uIHRvOlxuLi4vLi4vc3JjL21haW4vbWFjb3N4L2V4cG9ydHMvU0RMLnhcbihZb3UgbWF5IG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgZXhwb3J0cyBsaXN0LiBUaGVyZSBpcyBhIE1ha2VmaWxlIGluIHRoYXQgZGlyZWN0b3J5IHRoYXQgeW91IGNhbiBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lIHRvIHJlYnVpbGQgaXQuKVxuTG9uZyB0ZXJtLCB3ZSB3YW50IHRvIHV0aWxpemUgZ2NjIDQuMCdzIG5ldyB2aXNpYmlsaXR5IGZlYXR1cmUgKGFuYWxvZ291cyB0byBkZWNsc3BlYyBvbiBXaW5kb3dzKS4gT3RoZXIgcGxhdGZvcm1zIHdvdWxkIGJlbmVmaXQgZnJvbSB0aGlzIGNoYW5nZSB0b28uIFRoZSBkb3duc2lkZSBpcyB0aGF0IHdlIHN0aWxsIHVzZSBnY2MgMy4zIGZvciB0aGUgUG93ZXJQQyBidWlsZCBoZXJlIHNvIG9ubHkgb3VyIHg4NiBidWlsZHMgd2lsbCBjdWxsIHRoZSBzeW1ib2xzIGlmIHdlIGdvIGRvd24gdGhpcyByb3V0ZSAoYW5kIGRvbid0IHVzZSB0aGUgZXhwb3J0cyBmaWxlKS5cblxuIjsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gRnJhbWV3b3JrOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIkBleGVjdXRhYmxlX3BhdGgvLi4vRnJhbWV3b3JrcyI7CisJCQlwcm9kdWN0TmFtZSA9IFNETDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBCRUNERjY2QzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMLmZyYW1ld29yayAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuZnJhbWV3b3JrIjsKKwkJfTsKKwkJQkVDREY2NkQwNzYxQkE4MTAwNUZFODcyIC8qIFN0YXRpYyBMaWJyYXJ5ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwNzMxNzdFMDg1OERCMDUwMEIyQkMzMiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiU3RhdGljIExpYnJhcnkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMDBENTVGMDgwQTExMTQ3RjAwMzBFRDJBIC8qIFJ1biBTY3JpcHQgdG8gQ3JlYXRlIFNETF9jb25maWcuaCAqLywKKwkJCQlCRUNERjY2RTA3NjFCQTgxMDA1RkU4NzIgLyogSGVhZGVycyAqLywKKwkJCQlCRUNERjY3OTA3NjFCQTgxMDA1RkU4NzIgLyogU291cmNlcyAqLywKKwkJCQlCRUNERjZCMTA3NjFCQTgxMDA1RkU4NzIgLyogRnJhbWV3b3JrcyAqLywKKwkJCQlCRUNERjZCMjA3NjFCQTgxMDA1RkU4NzIgLyogUmV6ICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJY29tbWVudHMgPSAiVGhpcyBwcm9kdWNlcyBsaWJzZGwuYSwgd2hpY2ggaXMgdGhlIHN0YXRpYyBidWlsZCBvZiBTREwuIFlvdSB3aWxsIGhhdmUgdG8gbGluayB0byB0aGUgQ29jb2EgYW5kIE9wZW5HTCBmcmFtZXdvcmtzIGluIHlvdXIgYXBwbGljYXRpb24uIjsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gIlN0YXRpYyBMaWJyYXJ5IjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9IC91c3IvbG9jYWwvbGliOworCQkJcHJvZHVjdE5hbWUgPSAiU3RhdGljIExpYnJhcnkiOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQ0RGNkIzMDc2MUJBODEwMDVGRTg3MiAvKiBsaWJTREwuYSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUubGlicmFyeS5zdGF0aWMiOworCQl9OworCQlCRUNERjZCNDA3NjFCQTgxMDA1RkU4NzIgLyogTWFpbiBMaWJyYXJ5ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwNzMxNzgyMDg1OERCMDUwMEIyQkMzMiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiTWFpbiBMaWJyYXJ5IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQ0RGNkI1MDc2MUJBODEwMDVGRTg3MiAvKiBIZWFkZXJzICovLAorCQkJCUJFQ0RGNkI2MDc2MUJBODEwMDVGRTg3MiAvKiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNkI4MDc2MUJBODEwMDVGRTg3MiAvKiBGcmFtZXdvcmtzICovLAorCQkJCUJFQ0RGNkI5MDc2MUJBODEwMDVGRTg3MiAvKiBSZXogKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQljb21tZW50cyA9ICJUaGlzIHByb2R1Y2VzIGxpYlNETG1haW4uYSwgd2hpY2ggY29udGFpbnMgb25seSBTRExfbWFpbi5tLCB0aGUgaG9vayB0byBnZXQgdGhlIGFwcCBydW5uaW5nIGNvcnJlY3RseSBiZWZvcmUgeW91ciBTREwgY29kZSBleGVjdXRlcy4iOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiTWFpbiBMaWJyYXJ5IjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9IC91c3IvbG9jYWwvbGliOworCQkJcHJvZHVjdE5hbWUgPSBsaWJTRExtYWluLmE7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDREY2QkEwNzYxQkE4MTAwNUZFODcyIC8qIGxpYlNETG1haW4uYSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUubGlicmFyeS5zdGF0aWMiOworCQl9OworCQlCRUNERjZCQjA3NjFCQTgxMDA1RkU4NzIgLyogU3RhbmRhcmQgRE1HICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwNzMxNzg2MDg1OERCMDUwMEIyQkMzMiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiU3RhbmRhcmQgRE1HIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQ0RGNkJEMDc2MUJBODEwMDVGRTg3MiAvKiBTaGVsbFNjcmlwdCAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQlCRUNERjZDNjA3NjFCQTgxMDA1RkU4NzIgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gIlN0YW5kYXJkIERNRyI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAvdXNyL2xvY2FsL2JpbjsKKwkJCXByb2R1Y3ROYW1lID0gIlN0YW5kYXJkIFBhY2thZ2UiOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQ0RGNkJFMDc2MUJBODEwMDVGRTg3MiAvKiBTdGFuZGFyZCBETUcgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQlCRUNERjZDMDA3NjFCQTgxMDA1RkU4NzIgLyogRGV2ZWxvcGVyIEV4dHJhcyBQYWNrYWdlICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwNzMxNzhBMDg1OERCMDUwMEIyQkMzMiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiRGV2ZWxvcGVyIEV4dHJhcyBQYWNrYWdlIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQ0RGNkMyMDc2MUJBODEwMDVGRTg3MiAvKiBTaGVsbFNjcmlwdCAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkwMDgzMTAwMDEwNzJEOTRBMDBBNTMxRjEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gIkRldmVsb3BlciBFeHRyYXMgUGFja2FnZSI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAvdXNyL2xvY2FsL2JpbjsKKwkJCXByb2R1Y3ROYW1lID0gIkRldmVsIFBhY2thZ2UiOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQ0RGNkMzMDc2MUJBODEwMDVGRTg3MiAvKiBEZXZlbG9wZXIgRXh0cmFzIFBhY2thZ2UgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYXR0cmlidXRlcyA9IHsKKwkJCQlMYXN0VXBncmFkZUNoZWNrID0gMDQyMDsKKwkJCX07CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDA3MzE3OEUwODU4REIwNTAwQjJCQzMyIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiU0RMIiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDMuMiI7CisJCQlkZXZlbG9wbWVudFJlZ2lvbiA9IEVuZ2xpc2g7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCWtub3duUmVnaW9ucyA9ICgKKwkJCQlFbmdsaXNoLAorCQkJCUphcGFuZXNlLAorCQkJCUZyZW5jaCwKKwkJCQlHZXJtYW4sCisJCQkpOworCQkJbWFpbkdyb3VwID0gMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIFNETEZyYW1ld29yayAqLzsKKwkJCXByb2R1Y3RSZWZHcm91cCA9IDAzNDc2OERERkYzOEE0NUExMURCOUM4QiAvKiBQcm9kdWN0cyAqLzsKKwkJCXByb2plY3REaXJQYXRoID0gIiI7CisJCQlwcm9qZWN0Um9vdCA9ICIiOworCQkJdGFyZ2V0cyA9ICgKKwkJCQlCRUNERjVGRTA3NjFCQTgxMDA1RkU4NzIgLyogRnJhbWV3b3JrICovLAorCQkJCUJFQ0RGNjZEMDc2MUJBODEwMDVGRTg3MiAvKiBTdGF0aWMgTGlicmFyeSAqLywKKwkJCQlCRUNERjZCNDA3NjFCQTgxMDA1RkU4NzIgLyogTWFpbiBMaWJyYXJ5ICovLAorCQkJCUJFQ0RGNkJCMDc2MUJBODEwMDVGRTg3MiAvKiBTdGFuZGFyZCBETUcgKi8sCisJCQkJQkVDREY2QzAwNzYxQkE4MTAwNUZFODcyIC8qIERldmVsb3BlciBFeHRyYXMgUGFja2FnZSAqLywKKwkJCQkwMDMyMzU0RjEwNzA5MzE3MDBDNzY1MTcgLyogR2VuZXJhdGUgRG94eWdlbiBEb2NTZXQgKi8sCisJCQkpOworCQl9OworLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJQkVDREY2MkEwNzYxQkE4MTAwNUZFODcyIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDREY2MkIwNzYxQkE4MTAwNUZFODcyIC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmV6QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCUJFQ0RGNjY5MDc2MUJBODEwMDVGRTg3MiAvKiBSZXogKi8gPSB7CisJCQlpc2EgPSBQQlhSZXpCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUNERjZCMjA3NjFCQTgxMDA1RkU4NzIgLyogUmV6ICovID0geworCQkJaXNhID0gUEJYUmV6QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDREY2QjkwNzYxQkE4MTAwNUZFODcyIC8qIFJleiAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlekJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmV6QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTAwMzIzNTRFMTA3MDkzMTcwMEM3NjUxNyAvKiBTaGVsbFNjcmlwdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDEyOworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJaW5wdXRQYXRocyA9ICgKKwkJCSk7CisJCQlvdXRwdXRQYXRocyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7CisJCQlzaGVsbFNjcmlwdCA9ICIjIERPWFlHRU5fRVhFIGlzIGRlZmluZWQgaW4gdGhlIEVuY2xvc2luZyBUYXJnZXQncyBCdWlsZCBUYWJcbiMgRE9YWUdFTl9FWEU9L0FwcGxpY2F0aW9ucy9Eb3h5Z2VuLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvZG94eWdlblxuI2VjaG8gRE9YWUdFTl9FWEUgZGlyIGlzICRET1hZR0VOX0VYRVxuXG5ET0NfRElSPSRTUkNST09ULy4uL1hjb2RlRG9jU2V0XG4jZWNobyBEb2MgZGlyIGlzICRET0NfRElSXG5jZCAkRE9DX0RJUlxuJERPWFlHRU5fRVhFICRET0NfRElSL0RveHlmaWxlXG5jZCBodG1sXG5tYWtlXG5pZiBbIC1kICRTUkNST09ULy4uL1hjb2RlRG9jU2V0L29yZy5saWJzZGwuc2RsLmRvY3NldCBdIDsgdGhlblxuXHQjIHJlbW92ZSBwcmV2aW91cyBkb2NzZXRcblx0cm0gLXJmICRTUkNST09ULy4uL1hjb2RlRG9jU2V0L29yZy5saWJzZGwuc2RsLmRvY3NldFxuZmlcbm12IG9yZy5saWJzZGwuc2RsLmRvY3NldCAuLlxuY2QgLi5cbnJtIC1yZiBodG1sXG5leGl0IDAiOworCQl9OworCQkwMEQ1NUYwNTBBMTExNDNFMDAzMEVEMkEgLyogUnVuIFNjcmlwdCB0byBDcmVhdGUgU0RMX2NvbmZpZy5oICovID0geworCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlucHV0UGF0aHMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJSdW4gU2NyaXB0IHRvIENyZWF0ZSBTRExfY29uZmlnLmgiOworCQkJb3V0cHV0UGF0aHMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBNYWtlIHN1cmUgdGhhdCBpbmNsdWRlL1NETF9jb25maWcuaCBpcyBhIHN5bWxpbmsgdG8gU0RMX2NvbmZpZy5oLmRlZmF1bHQuXG4jIElmIGl0IGV4aXN0cyBhbmQgaXMgbm90IGEgc3ltbGluaywgaXQgd2FzIHByb2JhYmx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUgYW5kXG4jIHdlIG1vdmUgaXQgYXNpZGUuXG5pZiBbICEgLUwgLi4vLi4vaW5jbHVkZS9TRExfY29uZmlnLmggXTsgdGhlblxuICAgICAgICBpZiBbIC1lIC4uLy4uL2luY2x1ZGUvU0RMX2NvbmZpZy5oIF07IHRoZW5cbiAgICAgICAgICAgICAgICBtdiAuLi8uLi9pbmNsdWRlL1NETF9jb25maWcuaCAuLi8uLi9pbmNsdWRlL1NETF9jb25maWcuaC5nZW5lcmF0ZWRcbiAgICAgICAgZmlcbiAgICAgICAgbG4gLXMgU0RMX2NvbmZpZy5oLmRlZmF1bHQgLi4vLi4vaW5jbHVkZS9TRExfY29uZmlnLmhcbmZpXG4iOworCQl9OworCQkwMEQ1NUYwODBBMTExNDdGMDAzMEVEMkEgLyogUnVuIFNjcmlwdCB0byBDcmVhdGUgU0RMX2NvbmZpZy5oICovID0geworCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlucHV0UGF0aHMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJSdW4gU2NyaXB0IHRvIENyZWF0ZSBTRExfY29uZmlnLmgiOworCQkJb3V0cHV0UGF0aHMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBNYWtlIHN1cmUgdGhhdCBpbmNsdWRlL1NETF9jb25maWcuaCBpcyBhIHN5bWxpbmsgdG8gU0RMX2NvbmZpZy5oLmRlZmF1bHQuXG4jIElmIGl0IGV4aXN0cyBhbmQgaXMgbm90IGEgc3ltbGluaywgaXQgd2FzIHByb2JhYmx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUgYW5kXG4jIHdlIG1vdmUgaXQgYXNpZGUuXG5pZiBbICEgLUwgLi4vLi4vaW5jbHVkZS9TRExfY29uZmlnLmggXTsgdGhlblxuICAgICAgICBpZiBbIC1lIC4uLy4uL2luY2x1ZGUvU0RMX2NvbmZpZy5oIF07IHRoZW5cbiAgICAgICAgICAgICAgICBtdiAuLi8uLi9pbmNsdWRlL1NETF9jb25maWcuaCAuLi8uLi9pbmNsdWRlL1NETF9jb25maWcuaC5nZW5lcmF0ZWRcbiAgICAgICAgZmlcbiAgICAgICAgbG4gLXMgU0RMX2NvbmZpZy5oLmRlZmF1bHQgLi4vLi4vaW5jbHVkZS9TRExfY29uZmlnLmhcbmZpXG4iOworCQl9OworCQlCRUNERjZCRDA3NjFCQTgxMDA1RkU4NzIgLyogU2hlbGxTY3JpcHQgKi8gPSB7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAxMjsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIiMgY2xlYW4gdXAgdGhlIGZyYW1ld29yaywgcmVtb3ZlIGhlYWRlcnMsIGV4dHJhIGZpbGVzXG5ta2RpciAtcCBidWlsZC9kbWctdG1wXG5ta2RpciAtcCBidWlsZC9kbWctdG1wL2RldmVsLWxpdGVcbi9EZXZlbG9wZXIvVG9vbHMvQ3BNYWMgLXIgJFRBUkdFVF9CVUlMRF9ESVIvU0RMLmZyYW1ld29yayBidWlsZC9kbWctdG1wL1xuXG4jIHN0cmlwIG1vdmVkIHRvIFhjb2RlIG5hdGl2ZSBtZWNoYW5pc21cbiMgc3RyaXAgLXggYnVpbGQvZG1nLXRtcC9TREwuZnJhbWV3b3JrL1NETFxuXG5jcCBwa2ctc3VwcG9ydC9yZXNvdXJjZXMvTGljZW5zZS5ydGYgYnVpbGQvZG1nLXRtcFxuY3AgcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1JlYWRNZS50eHQgYnVpbGQvZG1nLXRtcFxuY3AgcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1JlYWRNZURldkxpdGUudHh0IGJ1aWxkL2RtZy10bXAvZGV2ZWwtbGl0ZVxuY3AgcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1VuaXZlcnNhbEJpbmFyeU5vdGVzLnJ0ZiBidWlsZC9kbWctdG1wXG5cbmNwIC4uLy4uL3NyYy9tYWluL21hY29zeC9TRExNYWluLmggYnVpbGQvZG1nLXRtcC9kZXZlbC1saXRlXG5jcCAuLi8uLi9zcmMvbWFpbi9tYWNvc3gvU0RMTWFpbi5tIGJ1aWxkL2RtZy10bXAvZGV2ZWwtbGl0ZVxuXG4jIHJlbW92ZSB0aGUgLkRTX1N0b3JlIGZpbGVzIGlmIGFueSAod2UgbWF5IHdhbnQgdG8gcHJvdmlkZSBvbmUgaW4gdGhlIGZ1dHVyZSBmb3IgZmFuY3kgLmRtZ3MpXG5maW5kIGJ1aWxkL2RtZy10bXAgLW5hbWUgLkRTX1N0b3JlIC1leGVjIHJtIC1mIFwie31cIiBcXDtcbmZpbmQgLWQgYnVpbGQvZG1nLXRtcCAtdHlwZSBkIC1uYW1lIC5zdm4gLWV4ZWMgcm0gLXJmIFwie31cIiBcXDtcblxuIyBmb3IgZmFuY3kgLmRtZ1xubWtkaXIgLXAgYnVpbGQvZG1nLXRtcC8ubG9nb1xuY3AgcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1NETF9EU19TdG9yZSBidWlsZC9kbWctdG1wLy5EU19TdG9yZVxuY3AgcGtnLXN1cHBvcnQvc2RsX2xvZ28ucGRmIGJ1aWxkL2RtZy10bXAvLmxvZ29cblxuIyBjcmVhdGUgdGhlIGRtZ1xuaGRpdXRpbCBjcmVhdGUgLW92IC1mcyBIRlMrIC12b2xuYW1lIFNETCAtc3JjZm9sZGVyIGJ1aWxkL2RtZy10bXAgYnVpbGQvU0RMLmRtZ1xuXG4jIGNsZWFuIHVwXG5ybSAtcmYgYnVpbGQvZG1nLXRtcFxuXG4jIGNvbXByZXNzIGl0Pz8/XG4jKGNkIGJ1aWxkOyBnbnV0YXIgLXpjdmYgU0RMLmRtZy50YXIuZ3ogU0RMLmRtZykiOworCQl9OworCQlCRUNERjZDMjA3NjFCQTgxMDA1RkU4NzIgLyogU2hlbGxTY3JpcHQgKi8gPSB7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJY29tbWVudHMgPSAiVGhlIG9sZCAucGtnIGdlbmVyYXRvciBzY3JpcHQ6XG5cbiMgbWFrZSBhIGNvcHkgb2YgdGhlIGZyYW1ld29yayB0byB3b3JrIHdpdGhcbm1rZGlyIC1wIGJ1aWxkL3BrZy10bXBcblxuIyMgV2UncmUgY2hhbmdpbmcgdGhpcyB0byBmb2xsb3cgT1MgWCBjb252ZW50aW9ucywgd2hlcmUgdGhlIGhlYWRlcnMgYW5kXG4jIyBmcmFtZXdvcmsgYXJlIGJ1bmRsZWQgdG9nZXRoZXIuIFRodXMgdGhpcyBkZXZlbG9wbWVudCBwYWNrYWdlIHdvbid0IFxuIyMgYWN0dWFsbHkgY29udGFpbiBhbnkgZGlyZWN0IGZyYW1ld29yayBlbGVtZW50cy5cbiMvRGV2ZWxvcGVyL1Rvb2xzL0NwTWFjIC1yIGJ1aWxkL1NETC5mcmFtZXdvcmsgYnVpbGQvcGtnLXRtcC9cblxuIyBjb3B5IGluIHNvbWUgZmlsZXMgdGhleSBtaWdodCB3YW50IGFyb3VuZC4uLlxuY3AgLi4vLi4vZG9jcy5odG1sIGJ1aWxkL3BrZy10bXBcbmNwIC1yIC4uLy4uL2RvY3MgYnVpbGQvcGtnLXRtcFxuI2NwIC1yIC4uLy4uL3NyYy9tYWluL21hY29zeCBidWlsZC9wa2ctdG1wL1xuI3JtIC1yZiBidWlsZC9wa2ctdG1wL21haW4vZXhwb3J0c1xuY3AgLXIgXCIuLi9Qcm9qZWN0IFN0YXRpb25hcnlcIiBidWlsZC9wa2ctdG1wL1xuY3AgXCJwa2ctc3VwcG9ydC9SZWFkbWUgU0RMIERldmVsb3Blci50eHRcIiBidWlsZC9wa2ctdG1wL1xuI2NwIFwiLi4vdW5pbnN0YWxsLmNzaFwiIGJ1aWxkL3BrZy10bXAvXG5cbiMjIFdlIHNob3VsZG4ndCBoYXZlIGFueSBmcmFtZXdvcmsgc3R1ZmYgdG8gZGVhbCB3aXRoIG5vd1xuIyBjbGVhbiB1cCB0aGUgZnJhbWV3b3JrLCByZW1vdmUgZXh0cmEgZmlsZXNcbiMgcm0gLXJmIGJ1aWxkL3BrZy10bXAvU0RMLmZyYW1ld29yay9SZXNvdXJjZXMvcGJkZXZlbG9wbWVudC5wbGlzdFxuXG4jIHJlbW92ZSB0aGUgLkRTX1N0b3JlIGZpbGUgdG8ga2VlcCB0b29sIGZyb20gY3JhcHBpbmcgb3V0XG5maW5kIHBrZy1zdXBwb3J0IC1uYW1lIFwiLkRTX1N0b3JlXCIgLWV4ZWMgcm0gLXJmIFwie31cIiBcIjtcIiBcblxuIyBjcmVhdGUgdGhlIC5wa2dcbi4uL3BhY2thZ2UgYnVpbGQvcGtnLXRtcCBwa2ctc3VwcG9ydC9TREwtZGV2ZWwuaW5mbyAtZCBidWlsZCAtciBwa2ctc3VwcG9ydC9kZXZlbC1yZXNvdXJjZXMgXG4jXCIvRGV2ZWxvcGVyL0FwcGxpY2F0aW9ucy9VdGlsaXRpZXMvUGFja2FnZU1ha2VyLmFwcC9Db250ZW50cy9NYWNPUy9QYWNrYWdlTWFrZXJcIiAtYnVpbGQgLXAgYnVpbGQvIC1mIGJ1aWxkL3BrZy10bXAgLXIgcGtnLXN1cHBvcnQvZGV2ZWwtcmVzb3VyY2VzIC1pIEluZm8ucGxpc3QgLWQgRGVzY3JpcHRpb24ucGxpc3RcblxuIyBjcmVhdGUgaW5zdGFsbCBzY3JpcHRzXG5ESVI9YnVpbGQvU0RMLWRldmVsLnBrZy9cbmNwICRESVIvaW5zdGFsbC5zaCAkRElSL1NETC1kZXZlbC5wb3N0X2luc3RhbGxcbm12ICRESVIvaW5zdGFsbC5zaCAkRElSL1NETC1kZXZlbC5wb3N0X3VwZ3JhZGVcblxuIyBhZGQgZXhlY3V0ZSBmbGFnIHRvIHNjcmlwdHNcbmNobW9kIDc1NSAkRElSL1NETC1kZXZlbC5wb3N0X2luc3RhbGwgJERJUi9TREwtZGV2ZWwucG9zdF91cGdyYWRlXG5cbiMgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlc1xuI3JtIC1yZiBidWlsZC9wa2ctdG1wXG5cbiMgY29tcHJlc3NcbihjZCBidWlsZDsgZ251dGFyIC16Y3ZmIFNETC1kZXZlbC5wa2cudGFyLmd6IFNETC1kZXZlbC5wa2cpIjsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIiMgbWFrZSBhIGRpcmVjdG9yeSB0byBob2xkIHRoZSBzdHVmZiB3ZSdyZSBnb2luZyB0byBwYWNrYWdlIHVwXG5ta2RpciAtcCBidWlsZC9kZXZlbC1leHRyYXMtdG1wXG5ta2RpciAtcCBidWlsZC9kZXZlbC1leHRyYXMtdG1wL0RvY3VtZW50YXRpb25cbm1rZGlyIC1wIGJ1aWxkL2RldmVsLWV4dHJhcy10bXAvRG9jdW1lbnRhdGlvbi9kb2NzL1hjb2RlRG9jU2V0XG5ta2RpciAtcCBidWlsZC9kZXZlbC1leHRyYXMtdG1wL1hjb2RlVGVtcGxhdGVzXG5ta2RpciAtcCBidWlsZC9kZXZlbC1leHRyYXMtdG1wL1NETE1haW5cbm1rZGlyIC1wIGJ1aWxkL2RldmVsLWV4dHJhcy10bXAvU0RMTWFpbi9OSUJsZXNzXG5ta2RpciAtcCBidWlsZC9kZXZlbC1leHRyYXMtdG1wL1NETE1haW4vQ29jb2FNZW51c1xuXG4jIGNvcHkgdGhlIGRvY3NcbmNwIC4uLy4uL2RvY3MuaHRtbCBidWlsZC9kZXZlbC1leHRyYXMtdG1wL0RvY3VtZW50YXRpb25cbmNwIC1yIC4uLy4uL2RvY3MgYnVpbGQvZGV2ZWwtZXh0cmFzLXRtcC9Eb2N1bWVudGF0aW9uXG5cbiMgQ29weSBEb3h5ZmlsZSBmb3IgRG9jU2V0XG5jcCAkU1JDUk9PVC8uLi9YY29kZURvY1NldC9Eb3h5ZmlsZSBidWlsZC9kZXZlbC1leHRyYXMtdG1wL0RvY3VtZW50YXRpb24vZG9jcy9YY29kZURvY1NldFxuXG4jIENvcHkgRG9jU2V0IChpZiBpdCBleGlzdHMpXG5pZiBbIC1kICRTUkNST09ULy4uL1hjb2RlRG9jU2V0L29yZy5saWJzZGwuc2RsLmRvY3NldCBdIDsgdGhlblxuI1x0ZWNobyBGb3VuZCBkb2NzZXQgZGlyZWN0b3J5XG5cdG12ICRTUkNST09ULy4uL1hjb2RlRG9jU2V0L29yZy5saWJzZGwuc2RsLmRvY3NldCBidWlsZC9kZXZlbC1leHRyYXMtdG1wL0RvY3VtZW50YXRpb24vZG9jcy9YY29kZURvY1NldC9cbmVsc2Vcblx0ZWNobyBXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBEb2NTZXQgYW5kIHdpbGwgYmUgb21pdHRlZCBmcm9tIHBhY2thZ2VcbmZpXG5cbiMgY29weSB0aGUgWGNvZGUgUHJvamVjdCB1c2VyIHRlbXBsYXRlc1xuY3AgLXIgXCIuLi9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyXCIgYnVpbGQvZGV2ZWwtZXh0cmFzLXRtcC9YY29kZVRlbXBsYXRlc1xuY3AgLXIgXCIuLi9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmRcIiBidWlsZC9kZXZlbC1leHRyYXMtdG1wL1hjb2RlVGVtcGxhdGVzXG5jcCAtciBcIi4uL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmRcIiBidWlsZC9kZXZlbC1leHRyYXMtdG1wL1hjb2RlVGVtcGxhdGVzXG5cbmNwIFwicGtnLXN1cHBvcnQvUmVhZG1lIFNETCBEZXZlbG9wZXIudHh0XCIgYnVpbGQvZGV2ZWwtZXh0cmFzLXRtcFxuXG4jIHJlYWRtZSBmaWxlXG4jY3AgcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1JlYWRNZS50eHQgYnVpbGQvZGV2ZWwtZXh0cmFzLXRtcFxuXG4jY3AgcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1VuaXZlcnNhbEJpbmFyeU5vdGVzLnJ0ZiBidWlsZC9kZXZlbC1leHRyYXMtdG1wXG5cbiMgQ29weSB0aGUgZGV2ZWwtbGl0ZSBzdHVmZiBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IG5vdGljZSBpdCBpbiB0aGUgbWFpbiBwYWNrYWdlXG4jIEkgc2hvdWxkIGNvcHkgYWxsIHRoZSBkaWZmZXJlbnQgU0RMTWFpbiB2ZXJzaW9ucyAoYW5kIG5pYnMpIGluc3RlYWQuXG4jIEknbSBhc3N1bWluZyB0aGUgZGVmYXVsdCBpcyB0aGUgc2FtZSBhcyB0aGUgU0RMIEFwcCBhbmQgU0RML09wZW5HTCB0ZW1wbGF0ZXNcblxuY3AgcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1JlYWRNZURldkxpdGUudHh0IGJ1aWxkL2RldmVsLWV4dHJhcy10bXAvU0RMTWFpbi9OSUJsZXNzXG5jcCAuLi8uLi9zcmMvbWFpbi9tYWNvc3gvU0RMTWFpbi5oIGJ1aWxkL2RldmVsLWV4dHJhcy10bXAvU0RMTWFpbi9OSUJsZXNzXG5jcCAuLi8uLi9zcmMvbWFpbi9tYWNvc3gvU0RMTWFpbi5tIGJ1aWxkL2RldmVsLWV4dHJhcy10bXAvU0RMTWFpbi9OSUJsZXNzXG5cbiMgTmliIHN0dWZmIGZyb20gU0RMLUNvY29hIEFwcFxuL0RldmVsb3Blci9Ub29scy9DcE1hYyAtciBcIi4uL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL1NETE1haW4uaFwiIGJ1aWxkL2RldmVsLWV4dHJhcy10bXAvU0RMTWFpbi9Db2NvYU1lbnVzXG4vRGV2ZWxvcGVyL1Rvb2xzL0NwTWFjIC1yIFwiLi4vVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMTWFpbi5tXCIgYnVpbGQvZGV2ZWwtZXh0cmFzLXRtcC9TRExNYWluL0NvY29hTWVudXNcbi9EZXZlbG9wZXIvVG9vbHMvQ3BNYWMgLXIgXCIuLi9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliXCIgYnVpbGQvZGV2ZWwtZXh0cmFzLXRtcC9TRExNYWluL0NvY29hTWVudXNcblxuIyBDb3B5IHByZWNvbXBpbGVkIGxpYlNETG1haW4uYSdzIGhlcmU/Pz8gV2UgaGF2ZSBwb3RlbnRpYWxseSAzIGRpZmZlcmVudCBvbmVzP1xuIyAvRGV2ZWxvcGVyL1Rvb2xzL0NwTWFjIC1yICRUQVJHRVRfQlVJTERfRElSL2xpYlNETG1haW4uYSBidWlsZC9kZXZlbC1leHRyYXMtdG1wL1NETE1haW4vTklCbGVzc1xuI1xuI1xuXG4jIENvcHkgc2RsLWNvbmZpZydzIGZvciB0aG9zZSB3aG8ndmUgYmVlbiB3YW50aW5nIG9uZT8gV2lsbCBuZWVkIHRvIGRvY3VtZW50IHRoYXQgaXQgbWF5XG4jIHJlcXVpcmUgbWFudWFsIGNoYW5nZXMgaWYgeW91IGRvbid0IGluc3RhbGwgdGhlIGZyYW1ld29yayB0byAvTGlicmFyeS9GcmFtZXdvcmtzXG4jIDw8c2RsLWNvbmZpZyBoZXJlPj5cblxuIyByZW1vdmUgdGhlIC5EU19TdG9yZSBmaWxlcyBpZiBhbnkgKHdlIG1heSB3YW50IHRvIHByb3ZpZGUgb25lIGluIHRoZSBmdXR1cmUgZm9yIGZhbmN5IC5kbWdzKVxuZmluZCBidWlsZC9kZXZlbC1leHRyYXMtdG1wIC1uYW1lIC5EU19TdG9yZSAtZXhlYyBybSAtZiBcInt9XCIgXFw7XG4jIHJlbW92ZSBDVlMgc3R1ZmZcbmZpbmQgYnVpbGQvZGV2ZWwtZXh0cmFzLXRtcCAtbmFtZSAuY3ZzaWdub3JlIC1leGVjIHJtIC1mIFwie31cIiBcXDtcbiMgZGVwdGggZmlyc3QgdHJhdmVyc2FsLCB0eXBlPWRpcmVjdG9yeSwgcmVtb3ZlIHJlY3Vyc2l2ZWx5XG5maW5kIC1kIGJ1aWxkL2RldmVsLWV4dHJhcy10bXAgLXR5cGUgZCAtbmFtZSBDVlMgLWV4ZWMgcm0gLXJmIFwie31cIiBcXDtcbmZpbmQgLWQgYnVpbGQvZGV2ZWwtZXh0cmFzLXRtcCAtdHlwZSBkIC1uYW1lIC5zdm4gLWV4ZWMgcm0gLXJmIFwie31cIiBcXDtcblxuXG4jIGNyZWF0ZSB0aGUgZG1nXG5oZGl1dGlsIGNyZWF0ZSAtb3YgLWZzIEhGUysgLXZvbG5hbWUgU0RMLWRldmVsLWV4dHJhcyAtc3JjZm9sZGVyIGJ1aWxkL2RldmVsLWV4dHJhcy10bXAgYnVpbGQvU0RMLWRldmVsLWV4dHJhcy5kbWdcblxuIyBjbGVhbiB1cFxucm0gLXJmIGJ1aWxkL2RldmVsLWV4dHJhcy10bXBcblxuIyBjb21wcmVzcyBpdD8/P1xuIyhjZCBidWlsZDsgZ251dGFyIC16Y3ZmIFNETC5kbWcudGFyLmd6IFNETC5kbWcpXG5cbiI7CisJCX07CisvKiBFbmQgUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQlCRUNERjYyQzA3NjFCQTgxMDA1RkU4NzIgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQ0RGNjJFMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYXVkaW8uYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjJGMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYXVkaW9jdnQuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjMwMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYXVkaW9kZXYuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjMyMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfbWl4ZXIuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjMzMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfd2F2ZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2MzUwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9hY3RpdmUuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjM2MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfZXZlbnRzLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjYzNzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2V4cG9zZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2MzgwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9rZXlib2FyZC5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2MzkwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9tb3VzZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2M0EwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9xdWl0LmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjYzQjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3Jlc2l6ZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2M0MwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9yd29wcy5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2M0UwNzYxQkE4MTAwNUZFODcyIC8qIFNETF90aW1lci5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2M0YwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibGl0LmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY0MDA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2JsaXRfMC5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2NDEwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibGl0XzEuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjQyMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYmxpdF9BLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY0MzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2JsaXRfTi5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2NDQwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibXAuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjQ1MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfY3Vyc29yLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY0NjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2dhbW1hLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY0NzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3BpeGVscy5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2NDgwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9STEVhY2NlbC5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2NDkwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9zdXJmYWNlLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY0QTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3ZpZGVvLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY0QjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3l1di5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2NEMwNzYxQkE4MTAwNUZFODcyIC8qIFNETF95dXZfc3cuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjREMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfZXJyb3IuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjRFMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfZmF0YWwuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjUwMDc2MUJBODEwMDVGRTg3MiAvKiBTREwuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjUxMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfdGhyZWFkLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY1MjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2Nkcm9tLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY1MzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2pveXN0aWNrLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY1ODA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3N0cmV0Y2guYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjU5MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfc3lzam95c3RpY2suYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjVCMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6RXZlbnRzLm0gaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY1QzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1F1YXJ0ekdMLm0gaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY1RDA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1F1YXJ0elZpZGVvLm0gaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY1RTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1F1YXJ0eldpbmRvdy5tIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2NUYwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9RdWFydHpXTS5tIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2NjEwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9jcHVpbmZvLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY2MjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3N5c2Nkcm9tLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY2NzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2NvcmVhdWRpby5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDA0QzJDOEIwOTc1RTEzMzAwRTlENDMwIC8qIEF1ZGlvRmlsZVBsYXllci5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDA0QzJDOEMwOTc1RTEzMzAwRTlENDMwIC8qIEF1ZGlvRmlsZVJlYWRlclRocmVhZC5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDA0QzJDOEQwOTc1RTEzMzAwRTlENDMwIC8qIENEUGxheWVyLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDRDMkM4RTA5NzVFMTMzMDBFOUQ0MzAgLyogU0RMT1NYQ0FHdWFyZC5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJENTMwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNjb25kLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkQ1NDA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c211dGV4LmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkQ1NjA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c3NlbS5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJENTcwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXN0aHJlYWQuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTYyRDYxMDlCRDIxMDEwMDM3QzhEMCAvKiBTRExfc3lzdGltZXIuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTYyRDZCMDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfZ2V0ZW52LmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkQ2QzA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX21hbGxvYy5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJENkQwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9xc29ydC5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJENkUwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9zdGRsaWIuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTYyRDZGMDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfc3RyaW5nLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkU2ODA5QkQyNzMwMDAzN0M4RDAgLyogU0RMX21peGVyX01NWC5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJGM0IwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsZXZlbnRzLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkYzRDA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGxtb3VzZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJGM0YwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsdmlkZW8uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTRCN0VGMDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhZXZlbnRzLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0QjdGMTA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYW1vdXNlLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0QjdGMjA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYXZpZGVvLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg0RjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWRnYS5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNEI4NTAwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkeW4uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTRCODUzMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZXZlbnRzLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg1NTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdhbW1hLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg1NzA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdsLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg1OTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWltYWdlLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg1QjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vZGVzLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg1RDA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vdXNlLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg1RjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXZpZGVvLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg2MjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXdtLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg2NDA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXl1di5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNEI4OTIwOUMwREE5NDAwM0E5OUQ1IC8qIFhGODZER0EuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTRCODkzMDlDMERBOTQwMDNBOTlENSAvKiBYRjg2REdBMi5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNEI4OTcwOUMwREFBMTAwM0E5OUQ1IC8qIFhGODZWTW9kZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNEI4OUIwOUMwREFBRTAwM0E5OUQ1IC8qIFh2LmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0QjhBMDA5QzBEQUI5MDAzQTk5RDUgLyogWGluZXJhbWEuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTRCOEEzMDlDMERBQzQwMDNBOTlENSAvKiB4bWUuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzMjg2MDlDQTA0OTEwMEVCRUI4OCAvKiBTRExfaWNvbnYuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzMkQ3MDlDQTBCRTcwMEVCRUI4OCAvKiBTRExfZGlza2F1ZGlvLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDJGMzJFNTA5Q0EwQkY2MDBFQkVCODggLyogU0RMX2R1bW15YXVkaW8uYyBpbiBTb3VyY2VzICovLAorCQkJCTA0NkI5MUVDMEExMUI1MzUwMEZCMTUxQyAvKiBTRExfc3lzbG9hZHNvLmMgaW4gU291cmNlcyAqLywKKwkJCQkwNDZCOTIxMzBBMTFCOEFEMDBGQjE1MUMgLyogU0RMX2RsY29tcGF0LmMgaW4gU291cmNlcyAqLywKKwkJCQkwMEVBRTZGQzBDNEQzRjg0MDA5QTQyMEEgLyogU0RMX3l1dl9tbXguYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUNERjY3OTA3NjFCQTgxMDA1RkU4NzIgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQ0RGNjdBMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYXVkaW8uYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjdCMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYXVkaW9jdnQuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjdEMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYXVkaW9kZXYuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjdFMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfbWl4ZXIuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjdGMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfd2F2ZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2ODEwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9jZHJvbS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2ODMwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9hY3RpdmUuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjg0MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfZXZlbnRzLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY4NTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2V4cG9zZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2ODYwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9rZXlib2FyZC5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2ODcwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9tb3VzZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2ODgwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9xdWl0LmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY4OTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3Jlc2l6ZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2OEEwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9yd29wcy5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2OEIwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9qb3lzdGljay5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2OEMwNzYxQkE4MTAwNUZFODcyIC8qIFNETF90aHJlYWQuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjkyMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfdGltZXIuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjkzMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYmxpdC5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2OTQwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibGl0XzAuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjk1MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYmxpdF8xLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY5NjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2JsaXRfQS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2OTcwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9ibGl0X04uYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjk4MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfYm1wLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY5OTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2N1cnNvci5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2OUEwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9nYW1tYS5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2OUIwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9waXhlbHMuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjlDMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUkxFYWNjZWwuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNjlEMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfc3RyZXRjaC5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2OUUwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9zdXJmYWNlLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjY5RjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3ZpZGVvLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjZBMDA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX3l1di5jIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2QTEwNzYxQkE4MTAwNUZFODcyIC8qIFNETF95dXZfc3cuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNkEyMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfZXJyb3IuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNkEzMDc2MUJBODEwMDVGRTg3MiAvKiBTRExfZmF0YWwuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNkE1MDc2MUJBODEwMDVGRTg3MiAvKiBTREwuYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNkE2MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfc3lzam95c3RpY2suYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNkE4MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfc3lzY2Ryb20uYyBpbiBTb3VyY2VzICovLAorCQkJCUJFQ0RGNkE5MDc2MUJBODEwMDVGRTg3MiAvKiBTRExfUXVhcnR6RXZlbnRzLm0gaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjZBQTA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1F1YXJ0ekdMLm0gaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjZBQjA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1F1YXJ0elZpZGVvLm0gaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjZBQzA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX1F1YXJ0eldpbmRvdy5tIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2QUQwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9RdWFydHpXTS5tIGluIFNvdXJjZXMgKi8sCisJCQkJQkVDREY2QUYwNzYxQkE4MTAwNUZFODcyIC8qIFNETF9jcHVpbmZvLmMgaW4gU291cmNlcyAqLywKKwkJCQlCRUNERjZCMDA3NjFCQTgxMDA1RkU4NzIgLyogU0RMX2NvcmVhdWRpby5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDA0QzJDOTAwOTc1RTEzMzAwRTlENDMwIC8qIEF1ZGlvRmlsZVBsYXllci5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDA0QzJDOTEwOTc1RTEzMzAwRTlENDMwIC8qIEF1ZGlvRmlsZVJlYWRlclRocmVhZC5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDA0QzJDOTIwOTc1RTEzMzAwRTlENDMwIC8qIENEUGxheWVyLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDRDMkM5MzA5NzVFMTMzMDBFOUQ0MzAgLyogU0RMT1NYQ0FHdWFyZC5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJENTkwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXNjb25kLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkQ1QTA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c211dGV4LmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkQ1QzA5QkQyMERBMDAzN0M4RDAgLyogU0RMX3N5c3NlbS5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJENUQwOUJEMjBEQTAwMzdDOEQwIC8qIFNETF9zeXN0aHJlYWQuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTYyRDYyMDlCRDIxMDEwMDM3QzhEMCAvKiBTRExfc3lzdGltZXIuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTYyRDcwMDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfZ2V0ZW52LmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkQ3MTA5QkQyMTRGMDAzN0M4RDAgLyogU0RMX21hbGxvYy5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJENzIwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9xc29ydC5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJENzMwOUJEMjE0RjAwMzdDOEQwIC8qIFNETF9zdGRsaWIuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTYyRDc0MDlCRDIxNEYwMDM3QzhEMCAvKiBTRExfc3RyaW5nLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkU2QTA5QkQyNzM2MDAzN0M4RDAgLyogU0RMX21peGVyX01NWC5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJGNDEwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsZXZlbnRzLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE2MkY0MzA5QkUyN0ZCMDAzN0M4RDAgLyogU0RMX251bGxtb3VzZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNjJGNDUwOUJFMjdGQjAwMzdDOEQwIC8qIFNETF9udWxsdmlkZW8uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTRCN0Y1MDlDMEQ4RDIwMDNBOTlENSAvKiBTRExfZGdhZXZlbnRzLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0QjdGNzA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYW1vdXNlLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0QjdGODA5QzBEOEQyMDAzQTk5RDUgLyogU0RMX2RnYXZpZGVvLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg2NjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWRnYS5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNEI4NjcwOUMwRDk3NzAwM0E5OUQ1IC8qIFNETF94MTFkeW4uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTRCODZBMDlDMEQ5NzcwMDNBOTlENSAvKiBTRExfeDExZXZlbnRzLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg2QzA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdhbW1hLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg2RTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWdsLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg3MDA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMWltYWdlLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg3MjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vZGVzLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg3NDA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMW1vdXNlLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg3NjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXZpZGVvLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg3OTA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXdtLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0Qjg3QjA5QzBEOTc3MDAzQTk5RDUgLyogU0RMX3gxMXl1di5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNEI4OTQwOUMwREE5NDAwM0E5OUQ1IC8qIFhGODZER0EuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTRCODk1MDlDMERBOTQwMDNBOTlENSAvKiBYRjg2REdBMi5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNEI4OTgwOUMwREFBMTAwM0E5OUQ1IC8qIFhGODZWTW9kZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAxNEI4OUQwOUMwREFBRTAwM0E5OUQ1IC8qIFh2LmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDE0QjhBMTA5QzBEQUI5MDAzQTk5RDUgLyogWGluZXJhbWEuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMTRCOEE0MDlDMERBQzQwMDNBOTlENSAvKiB4bWUuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzMjg3MDlDQTA0OTEwMEVCRUI4OCAvKiBTRExfaWNvbnYuYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzMkQ5MDlDQTBCRTcwMEVCRUI4OCAvKiBTRExfZGlza2F1ZGlvLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDJGMzJFNzA5Q0EwQkY2MDBFQkVCODggLyogU0RMX2R1bW15YXVkaW8uYyBpbiBTb3VyY2VzICovLAorCQkJCTA0NkI5MUVEMEExMUI1MzUwMEZCMTUxQyAvKiBTRExfc3lzbG9hZHNvLmMgaW4gU291cmNlcyAqLywKKwkJCQkwNDZCOTIxNDBBMTFCOEFEMDBGQjE1MUMgLyogU0RMX2RsY29tcGF0LmMgaW4gU291cmNlcyAqLywKKwkJCQkwMEVBRTZGRDBDNEQzRjg4MDA5QTQyMEEgLyogU0RMX3l1dl9tbXguYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUNERjZCNjA3NjFCQTgxMDA1RkU4NzIgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQ0RGNkI3MDc2MUJBODEwMDVGRTg3MiAvKiBTRExNYWluLm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLworCQkwMDgzMTAwMDEwNzJEOTRBMDBBNTMxRjEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSAwMDMyMzU0RjEwNzA5MzE3MDBDNzY1MTcgLyogR2VuZXJhdGUgRG94eWdlbiBEb2NTZXQgKi87CisJCQl0YXJnZXRQcm94eSA9IDAwODMwRkZGMTA3MkQ5NEEwMEE1MzFGMSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQ0RGNkM2MDc2MUJBODEwMDVGRTg3MiAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQ0RGNUZFMDc2MUJBODEwMDVGRTg3MiAvKiBGcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQ0RGNkM1MDc2MUJBODEwMDVGRTg3MiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisvKiBFbmQgUEJYVGFyZ2V0RGVwZW5kZW5jeSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKwkJMDAzMjM1NTIxMDcwOTMxNzAwQzc2NTE3IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCURPWFlHRU5fRVhFID0gL0FwcGxpY2F0aW9ucy9Eb3h5Z2VuLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvZG94eWdlbjsKKwkJCQlQUk9EVUNUX05BTUUgPSAiR2VuZXJhdGUgRG94eWdlbiBEb2NTZXQiOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMDAzMjM1NTMxMDcwOTMxNzAwQzc2NTE3IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRE9YWUdFTl9FWEUgPSAvQXBwbGljYXRpb25zL0RveHlnZW4uYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9kb3h5Z2VuOworCQkJCVBST0RVQ1RfTkFNRSA9ICJHZW5lcmF0ZSBEb3h5Z2VuIERvY1NldCI7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTAwQ0ZBNjIxMTA2QTU2NzkwMDc1ODY2MCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfNjRfQklUKSI7CisJCQkJREVQTE9ZTUVOVF9QT1NUUFJPQ0VTU0lORyA9IFlFUzsKKwkJCQlHQ0NfQUxUSVZFQ19FWFRFTlNJT05TID0gWUVTOworCQkJCUdDQ19BVVRPX1ZFQ1RPUklaQVRJT04gPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9DUFBfRVhDRVBUSU9OUyA9IE5POworCQkJCUdDQ19FTkFCTEVfQ1BQX1JUVEkgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX1NTRTNfRVhURU5TSU9OUyA9IFlFUzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTzsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gczsKKwkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAxMC41OworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQkJU0VQQVJBVEVfU1RSSVAgPSBZRVM7CisJCQkJU1RSSVBfU1RZTEUgPSAibm9uLWdsb2JhbCI7CisJCQkJV0FSTklOR19DRkxBR1MgPSAiIjsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMDBDRkE2MjIxMDZBNTY3OTAwNzU4NjYwIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxMi40OworCQkJCUZSQU1FV09SS19WRVJTSU9OID0gQTsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gKAorCQkJCQkiJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TKSIsCisJCQkJCSIkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzEpIiwKKwkJCQkJIiQoR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19RVU9URURfMikiLAorCQkJCQkiJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX1FVT1RFRF8zKSIsCisJCQkJCSIkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzQpIiwKKwkJCQkpOworCQkJCUdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAvdXNyL1gxMVI2L2luY2x1ZGU7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby1GcmFtZXdvcmsucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICJAcnBhdGgiOworCQkJCU9USEVSX0NGTEFHUyA9ICIkKE9USEVSX0NGTEFHU18kKENVUlJFTlRfQVJDSCkpIjsKKwkJCQlPVEhFUl9DRkxBR1NfaTM4NiA9ICIiOworCQkJCU9USEVSX0NGTEFHU19wcGMgPSAiIjsKKwkJCQlPVEhFUl9MREZMQUdTX3BwYyA9ICItcHJlYmluZCAtc2VnMWFkZHIgMHgzMDAwMDAwMCI7CisJCQkJUFJPRFVDVF9OQU1FID0gU0RMOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gZnJhbWV3b3JrOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkwMENGQTYyMzEwNkE1Njc5MDA3NTg2NjAgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gKAorCQkJCQkiJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TKSIsCisJCQkJCSJTRExfVklERU9fRFJJVkVSX0RHQT0xIiwKKwkJCQkJIlNETF9WSURFT19EUklWRVJfWDExPTEiLAorCQkJCQkiU0RMX1ZJREVPX0RSSVZFUl9YMTFfREdBTU9VU0U9MSIsCisJCQkJCSIkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzEpIiwKKwkJCQkJIiQoR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19RVU9URURfMikiLAorCQkJCQkiJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX1FVT1RFRF8zKSIsCisJCQkJCSIkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzQpIiwKKwkJCQkJIlNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREU9MSIsCisJCQkJCSJTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQT0xIiwKKwkJCQkJIlNETF9WSURFT19EUklWRVJfWDExX1hNRT0xIiwKKwkJCQkJIlNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUj0xIiwKKwkJCQkJIlNETF9WSURFT19EUklWRVJfWDExX1hWPTEiLAorCQkJCSk7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19RVU9URURfMSA9ICJTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDPVxcXCIvdXNyL1gxMVI2L2xpYi9saWJYMTEuNi5keWxpYlxcXCIiOworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzIgPSAiU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YRVhUPVxcXCIvdXNyL1gxMVI2L2xpYi9saWJYZXh0LjYuZHlsaWJcXFwiIjsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX1FVT1RFRF8zID0gIlNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWFJBTkRSPVxcXCIvdXNyL1gxMVI2L2xpYi9saWJYcmFuZHIuMi5keWxpYlxcXCIiOworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzQgPSAiU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YUkVOREVSPVxcXCIvdXNyL1gxMVI2L2xpYi9saWJYcmVuZGVyLjEuZHlsaWJcXFwiIjsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gL3Vzci9YMTFSNi9pbmNsdWRlOworCQkJCU9USEVSX0NGTEFHUyA9ICIkKE9USEVSX0NGTEFHU18kKENVUlJFTlRfQVJDSCkpIjsKKwkJCQlPVEhFUl9DRkxBR1NfaTM4NiA9ICIiOworCQkJCU9USEVSX0NGTEFHU19wcGMgPSAiIjsKKwkJCQlQUk9EVUNUX05BTUUgPSBTREw7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTAwQ0ZBNjI0MTA2QTU2NzkwMDc1ODY2MCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFNETG1haW47CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTAwQ0ZBNjI1MTA2QTU2NzkwMDc1ODY2MCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9ICJTdGFuZGFyZCBETUciOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkwMENGQTYyNjEwNkE1Njc5MDA3NTg2NjAgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSAiRGV2ZWxvcGVyIEV4dHJhcyBQYWNrYWdlIjsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMDBDRkE2MjcxMDZBNTY4OTAwNzU4NjYwIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfNjRfQklUKSI7CisJCQkJR0NDX0FMVElWRUNfRVhURU5TSU9OUyA9IFlFUzsKKwkJCQlHQ0NfQVVUT19WRUNUT1JJWkFUSU9OID0gWUVTOworCQkJCUdDQ19FTkFCTEVfQ1BQX0VYQ0VQVElPTlMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0NQUF9SVFRJID0gTk87CisJCQkJR0NDX0VOQUJMRV9TU0UzX0VYVEVOU0lPTlMgPSBZRVM7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gMTAuNTsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJCVdBUk5JTkdfQ0ZMQUdTID0gIiI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkwMENGQTYyODEwNkE1Njg5MDA3NTg2NjAgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxMi40OworCQkJCUZSQU1FV09SS19WRVJTSU9OID0gQTsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gKAorCQkJCQkiJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TKSIsCisJCQkJCSIkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzEpIiwKKwkJCQkJIiQoR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19RVU9URURfMikiLAorCQkJCQkiJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX1FVT1RFRF8zKSIsCisJCQkJCSIkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzQpIiwKKwkJCQkpOworCQkJCUdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAvdXNyL1gxMVI2L2luY2x1ZGU7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby1GcmFtZXdvcmsucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICJAcnBhdGgiOworCQkJCU9USEVSX0NGTEFHUyA9ICIkKE9USEVSX0NGTEFHU18kKENVUlJFTlRfQVJDSCkpIjsKKwkJCQlPVEhFUl9DRkxBR1NfaTM4NiA9ICIiOworCQkJCU9USEVSX0NGTEFHU19wcGMgPSAiIjsKKwkJCQlQUk9EVUNUX05BTUUgPSBTREw7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBmcmFtZXdvcms7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkwMENGQTYyOTEwNkE1Njg5MDA3NTg2NjAgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICgKKwkJCQkJIiQoR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUykiLAorCQkJCQkiU0RMX1ZJREVPX0RSSVZFUl9ER0E9MSIsCisJCQkJCSJTRExfVklERU9fRFJJVkVSX1gxMT0xIiwKKwkJCQkJIlNETF9WSURFT19EUklWRVJfWDExX0RHQU1PVVNFPTEiLAorCQkJCQkiJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX1FVT1RFRF8xKSIsCisJCQkJCSIkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzIpIiwKKwkJCQkJIiQoR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19RVU9URURfMykiLAorCQkJCQkiJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX1FVT1RFRF80KSIsCisJCQkJCSJTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFPTEiLAorCQkJCQkiU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUE9MSIsCisJCQkJCSJTRExfVklERU9fRFJJVkVSX1gxMV9YTUU9MSIsCisJCQkJCSJTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFI9MSIsCisJCQkJCSJTRExfVklERU9fRFJJVkVSX1gxMV9YVj0xIiwKKwkJCQkpOworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfUVVPVEVEXzEgPSAiU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQz1cXFwiL3Vzci9YMTFSNi9saWIvbGliWDExLjYuZHlsaWJcXFwiIjsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX1FVT1RFRF8yID0gIlNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWEVYVD1cXFwiL3Vzci9YMTFSNi9saWIvbGliWGV4dC42LmR5bGliXFxcIiI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19RVU9URURfMyA9ICJTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSQU5EUj1cXFwiL3Vzci9YMTFSNi9saWIvbGliWHJhbmRyLjIuZHlsaWJcXFwiIjsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX1FVT1RFRF80ID0gIlNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWFJFTkRFUj1cXFwiL3Vzci9YMTFSNi9saWIvbGliWHJlbmRlci4xLmR5bGliXFxcIiI7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IC91c3IvWDExUjYvaW5jbHVkZTsKKwkJCQlPVEhFUl9DRkxBR1MgPSAiJChPVEhFUl9DRkxBR1NfJChDVVJSRU5UX0FSQ0gpKSI7CisJCQkJT1RIRVJfQ0ZMQUdTX2kzODYgPSAiIjsKKwkJCQlPVEhFUl9DRkxBR1NfcHBjID0gIiI7CisJCQkJUFJPRFVDVF9OQU1FID0gU0RMOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMDBDRkE2MkExMDZBNTY4OTAwNzU4NjYwIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFNETG1haW47CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkwMENGQTYyQjEwNkE1Njg5MDA3NTg2NjAgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gIlN0YW5kYXJkIERNRyI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkwMENGQTYyQzEwNkE1Njg5MDA3NTg2NjAgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gIkRldmVsb3BlciBFeHRyYXMgUGFja2FnZSI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTAwMzIzNTU3MTA3MDkzMzUwMEM3NjUxNyAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiR2VuZXJhdGUgRG94eWdlbiBEb2NTZXQiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDAzMjM1NTIxMDcwOTMxNzAwQzc2NTE3IC8qIERlYnVnICovLAorCQkJCTAwMzIzNTUzMTA3MDkzMTcwMEM3NjUxNyAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQkwMDczMTc3QTA4NThEQjA1MDBCMkJDMzIgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIkZyYW1ld29yayIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMENGQTYyODEwNkE1Njg5MDA3NTg2NjAgLyogRGVidWcgKi8sCisJCQkJMDBDRkE2MjIxMDZBNTY3OTAwNzU4NjYwIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCX07CisJCTAwNzMxNzdFMDg1OERCMDUwMEIyQkMzMiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiU3RhdGljIExpYnJhcnkiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDBDRkE2MjkxMDZBNTY4OTAwNzU4NjYwIC8qIERlYnVnICovLAorCQkJCTAwQ0ZBNjIzMTA2QTU2NzkwMDc1ODY2MCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQkwMDczMTc4MjA4NThEQjA1MDBCMkJDMzIgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIk1haW4gTGlicmFyeSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMENGQTYyQTEwNkE1Njg5MDA3NTg2NjAgLyogRGVidWcgKi8sCisJCQkJMDBDRkE2MjQxMDZBNTY3OTAwNzU4NjYwIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCX07CisJCTAwNzMxNzg2MDg1OERCMDUwMEIyQkMzMiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiU3RhbmRhcmQgRE1HIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwQ0ZBNjJCMTA2QTU2ODkwMDc1ODY2MCAvKiBEZWJ1ZyAqLywKKwkJCQkwMENGQTYyNTEwNkE1Njc5MDA3NTg2NjAgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMDA3MzE3OEEwODU4REIwNTAwQjJCQzMyIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJEZXZlbG9wZXIgRXh0cmFzIFBhY2thZ2UiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDBDRkE2MkMxMDZBNTY4OTAwNzU4NjYwIC8qIERlYnVnICovLAorCQkJCTAwQ0ZBNjI2MTA2QTU2NzkwMDc1ODY2MCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQkwMDczMTc4RTA4NThEQjA1MDBCMkJDMzIgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJTREwiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDBDRkE2MjcxMDZBNTY4OTAwNzU4NjYwIC8qIERlYnVnICovLAorCQkJCTAwQ0ZBNjIxMTA2QTU2NzkwMDc1ODY2MCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworLyogRW5kIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCX07CisJcm9vdE9iamVjdCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvUmVhZG1lIFNETCBEZXZlbG9wZXIudHh0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETC9wa2ctc3VwcG9ydC9SZWFkbWUgU0RMIERldmVsb3Blci50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEzMjI4NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvUmVhZG1lIFNETCBEZXZlbG9wZXIudHh0CkBAIC0wLDAgKzEsMjgyIEBACitTREwgTWFjIE9TIFggRGV2ZWxvcGVyIE5vdGVzOgorCVRoaXMgaXMgYW4gb3B0aW9uYWwgZGV2ZWxvcGVyIHBhY2thZ2UgdG8gcHJvdmlkZSBleHRyYXMgdGhhdCBhbiAKKwlTREwgZGV2ZWxvcGVyIG1pZ2h0IGJlbmVmaXQgZnJvbS4KKwkKKwlNYWtlIHN1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgdGhlIFNETC5mcmFtZXdvcmsgCisJZnJvbSB0aGUgU0RMLmRtZy4gCisJCisJRm9yIG1vcmUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiwgcGxlYXNlIHNlZSBSRUFETUVzIGluY2x1ZGVkIAorCXdpdGggdGhlICBTREwgc291cmNlIGNvZGUuIEFsc28sIGRvbid0IGZvcmdldCBhYm91dCB0aGUgQVBJIAorCWRvY3VtZW50YXRpb24gKGFsc28gaW5jbHVkZWQgd2l0aCB0aGlzIHBhY2thZ2UpLgorCisKK1RoaXMgcGFja2FnZSBjb250YWluczoKKy0gU0RMIEFQSSBEb2N1bWVudGF0aW9uCistIEEgdmFyaWV0eSBvZiBTRExNYWluIGFuZCAuTmliIGZpbGVzIHRvIGNob29zZSBmcm9tCistIFhjb2RlIHByb2plY3QgdGVtcGxhdGVzCisKKworU0RMIEFQSSBEb2N1bWVudGF0aW9uOgorCVdlIGluY2x1ZGUgYm90aCB0aGUgSFRNTCBkb2N1bWVudGF0aW9uIGFuZCB0aGUgbWFuIGZpbGVzLiAKKwlBbmQgbmV3IHRvIDEuMi4xNCwgd2UgaW50cm9kdWNlIGFuIFhvY2RlIERvY1NldCB3aGljaCAKKwlpcyBnZW5lcmF0ZWQgdmlhIERveHlnZW4uIFRoZXNlIHJlcXVpcmUgWGNvZGUgMy4wIG9yIGdyZWF0ZXIuCisJCisJWW91IHdpbGwgbmVlZCB0byBkcmlsbCBkb3duIGludG8gdGhlIFhjb2RlRG9jU2V0IGRpcmVjdG9yeSAKKwlmcm9tIHRoZSAgRG9jdW1lbnRhdGlvbiBmb2xkZXIgYW5kIGZpbmQgdGhlIAorCW9yZy5saWJzZGwuc2RsLmRvY3NldCBidW5kbGUuIFdlIHJlY29tbWVuZCB5b3UgY29weSB0aGlzIHRvOgorCQorCS9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzCisKKwlBZ2FpbiwgdGhpcyBmb2xsb3dzIGFsbCB0aGUgc3RhbmRhcmQgWGNvZGUgcGF0dGVybnMgCisJZGVzY3JpYmVkIHdpdGggdGhlIHByb2plY3QgdGVtcGxhdGVzIChiZWxvdykuIFlvdSBtYXkgbmVlZCAKKwl0byBjcmVhdGUgdGhlIGRpcmVjdG9yaWVzIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBleGlzdC4gCisJWW91IG1heSBpbnN0YWxsIGl0IG9uIGEgcGVyLXVzZXIgYmFzaXMuIAorCUFuZCB5b3UgbWF5IHRhcmdldCBzcGVjaWZpYyB2ZXJzaW9ucyBvZiBYY29kZSAKKwlpbiBsaWV1IG9mIHVzaW5nIHRoZSAiU2hhcmVkIiBkaXJlY3RvcnkuCisKKwlUbyB1c2UsIGl0IGlzIHF1aXRlIHNpbXBsZS4gSnVzdCBicmluZyB1cCB0aGUgWGNvZGUgCisJRG9jdW1lbnRhdGlvbiBCcm93c2VyIHdpbmRvdyAoY2FuIGJlIGFjdGl2YXRlZCB0aHJvdWdoIAorCXRoZSBYY29kZSBIZWxwIE1lbnUpIGFuZCBzdGFydCBzZWFyY2hpbmcgZm9yIHNvbWV0aGluZy4gCisKKwlJZiBub3RoaW5nIGlzIGZvdW5kIG9uIGEgbGVnaXRpbWF0ZSBzZWFyY2gsIHZlcmlmeSB0aGF0IAorCXRoZSBTREwgZG9jdW1lbnRhdGlvbiBpcyBlbmFibGVkIGJ5IG9wZW5pbmcgdXAgdGhlIERvY1NldCAKKwlwb3B1cCBib3ggYmVsb3cgdGhlIHRvb2xiYXIgaW4gU25vdyBMZW9wYXJkLiAKKwkoSW4gTGVvcGFyZCwgdGhlIERvY1NldHMgYXBwZWFyIGluIHRoZSBsZWZ0LXNpZGUgcGFuZWwuKSAKKworCUFub3RoZXIgaGFuZHkgdHJpY2sgaXMgdG8gdXNlIHRoZSBtb3VzZSBhbmQgT3B0aW9uLURvdWJsZS1DbGljayAKKwlvbiBhIGZ1bmN0aW9uIG9yIGtleXdvcmQgdG8gYnJpbmcgdXAgZG9jdW1lbnRhdGlvbiBvbiB0aGUgCisJc2VsZWN0ZWQgaXRlbS4gUHJpb3IgdG8gWGNvZGUgMy4yIChTbm93IExlb3BhcmQpLCB0aGlzIHdvdWxkIAorCWp1bXAgeW91IHRvIHRoZSBlbnRyeSBpbiB0aGUgWGNvZGUgRG9jdW1lbnRhdGlvbiBCcm93c2VyLgorCisJSG93ZXZlciwgaW4gWGNvZGUgMy4yIChTbm93IExlb3BhcmQpLCB0aGlzIGJlaGF2aW9yIGhhcyBiZWVuIAorCWFsdGVyZWQgYW5kIHlvdSBhcmUgbm93IGdpdmVuIGEgaG92ZXJpbmcgY29ubmVjdGVkIHBvcHVwIGJveCAKKwlvbiB0aGUgc2VsZWN0ZWQgaXRlbSAoY2FsbGVkIFF1aWNrIEhlbHApLiBVbmZvcnR1bmF0ZWx5LCB0aGUgCisJRG94eWdlbiBnZW5lcmF0ZWQgRG9jU2V0IGRvZXNuJ3QgY3VycmVudGx5IHByb3ZpZGUgUXVpY2sgSGVscCAKKwlpbmZvcm1hdGlvbi4gWW91IGNhbiBlaXRoZXIgZm9sbG93IGEgbGluayB0byB0aGUgbWFpbiAKKwlEb2N1bWVudGF0aW9uIEJyb3dzZXIgZnJvbSB0aGUgUXVpY2sgSGVscCwgb3IgYWx0ZXJuYXRpdmVseSwgCisJeW91IGNhbiBieXBhc3MgUXVpY2sgSGVscCBieSB1c2luZyBDb21tYW5kLU9wdGlvbi1Eb3VibGUtQ2xpY2sgCisJaW5zdGVhZCBvZiBPcHRpb24tRG91YmxlLUNsaWNrLiAoUGxlYXNlIGZpbGUgZmVlZGJhY2sgd2l0aCBib3RoIAorCURveHlnZW4gYW5kIEFwcGxlIHRvIGltcHJvdmUgUXVpY2sgSGVscCBpbnRlZ3JhdGlvbi4pCisKKworCUZvciB0aG9zZSB0aGF0IHdhbnQgdG8gdHdlYWsgdGhlIGRvY3VtZW50YXRpb24gb3V0cHV0LCAKKwl5b3UgY2FuIGZpbmQgbXkgRG94eWZpbGUgaW4gdGhlIFhjb2RlRG9jU2V0IGRpcmVjdG9yeSBpbiAKKwl0aGUgWGNvZGUgZGlyZWN0b3J5IG9mIHRoZSBTREwgc291cmNlIGNvZGUgYmFzZSAoYW5kIGluIHRoaXMgcGFja2FnZSkuIAorCisJT25lIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IG9wdGlvbnMgaXMgIlNlcGFyYXRlIE1lbWJlciBQYWdlcyIgCisJd2hpY2ggSSBkaXNhYmxlLiBXaGVuIGRpc2FibGVkLCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBhYm91dCA2TUIuIAorCVdoZW4gZW5hYmxlZCwgdGhlIGRvY3VtZW50YXRpb24gaXMgY2xvc2VyIHRvIDEuNkdCICh5ZXMgZ2lnYWJ5dGVzKS4gCisJT2J2aW91c2x5LCBkaXN0cmlidXRpb24gd2lsbCBiZSByZWFsbHkgaGFyZCB3aXRoIHNpemVzIHRoYXQgaHVnZSAKKwlzbyBJIGRpc2FibGUgdGhlIG9wdGlvbi4KKworCUkgYWxzbyBkaXNhYmxlZCBEb3QgYmVjYXVzZSB0aGVyZSBkaWRuJ3Qgc2VlbSB0byBiZSAKKwltdWNoIGJlbmVmaXQgb2YgZ2VuZXJhdGluZyBncmFwaHMgZm9yIHB1YmxpYyBDIGZ1bmN0aW9ucy4KKworCU9uZSB0aGluZyBJIHdvdWxkIGxpa2UgdG8gc2VlIGlzIGEgQ1NTIGZpbGUgdGhhdCBtYWtlcyB0aGUgCisJRG94eWdlbiBEb2NTZXQgbG9vayBtb3JlIGxpa2UgdGhlIG5hdGl2ZSBBcHBsZSBkb2N1bWVudGF0aW9uIAorCXN0eWxlLiBTdHlsZSBzaGVldHMgYXJlIG91dHNpZGUgbXkgZXhwZXJ0aXNlIHNvIEkgYW0gYXNraW5nIGZvciAKKwljb250cmlidXRpb25zIG9uIHRoaXMgb25lLiBNZWFud2hpbGUsIEkgYWxzbyByZXF1ZXN0IHlvdSBzZW5kIAorCWZlZWRiYWNrIHRvIERveHlnZW4gYW5kIEFwcGxlIGFib3V0IHRoaXMgaXNzdWUgdG9vLgorCisKKwlGaW5hbGx5IGZvciBjb252ZW5pZW5jZSwgSSBoYXZlIGFkZGVkIGEgbmV3IHNoZWxsIHNjcmlwdCB0YXJnZXQgCisJdG8gdGhlIFhjb2RlIHByb2plY3QgdGhhdCBidWlsZHMgU0RMIHRoYXQgcmVmZXJzIHRvIG15IERveHlmaWxlIAorCWFuZCBnZW5lcmF0ZSB0aGUgRG9jU2V0IHdlIGRpc3RyaWJ1dGUuCisKKworU0RMTWFpbjoKKwlXZSBpbmNsdWRlIHNldmVyYWwgZGlmZmVyZW50IHZhcmlhdGlvbnMgb2YgU0RMTWFpbiBhbmQgdGhlIAorCS5OaWJzLiAoRWFjaCBvZiB0aGVzZSBhcmUgZGVtb25zdHJhdGVkIGJ5IHRoZSBkaWZmZXJlbnQgUEIvWGNvZGUgCisJcHJvamVjdCB0ZW1wbGF0ZXMuKSBZb3UgZ2V0IHRvIHBpY2sgd2hpY2ggb25lIHlvdSB3YW50IHRvIHVzZSwgCisJb3IgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0byBtZWV0IHlvdXIgb3duIHNwZWNpZmljIG5lZWRzLiBXZSBkbyAKKwlub3QgY3VycmVudGx5IHByb3ZpZGUgYSBsaWJTRExNYWluLmEuIFlvdSBjYW4gYnVpbGQgaXQgeW91cnNlbGYKKwlvbmNlIHlvdSBkZWNpZGUgd2hpY2ggb25lIHlvdSB3YW50IHRvIHVzZSB0aG91Z2ggaXQgaXMgZWFzaWVyIGFuZCAKKwlyZWNvbW1lbmRlZCBpbiB0aGUgU0RMIEZBUSB0aGF0IHlvdSBqdXN0IGNvcHkgdGhlIFNETE1haW4uaCBhbmQgCisJU0RMTWFpbi5tIGRpcmVjdGx5IGludG8geW91ciBwcm9qZWN0LiBJZiB5b3UgYXJlIHB1enpsZWQgYnkgdGhpcywgCisJd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHlvdSBsb29rIGF0IHRoZSBkaWZmZXJlbnQgUEIvWGNvZGUgcHJvamVjdCAKKwl0ZW1wbGF0ZXMgdG8gdW5kZXJzdGFuZCB0aGVpciB1c2VzIGFuZCBkaWZmZXJlbmNlcy4gKFNlZSBQcm9qZWN0IAorCVRlbXBsYXRlIGluZm8gYmVsb3cuKSBOb3RlIHRoYXQgdGhlICJOaWJsZXNzIiB2ZXJzaW9uIGlzIHRoZSBzYW1lIAorCXZlcnNpb24gb2YgU0RMTWFpbiB3ZSBpbmNsdWRlIHRoZSB0aGUgZGV2ZWwtbGl0ZSBzZWN0aW9uIG9mIHRoZSAKKwltYWluIFNETC5kbWcuCisJCisJCitYb2NkZSBQcm9qZWN0IFRlbXBsYXRlczoKKwlGb3IgY29udmVuaWVuY2UsIHdlIHByb3ZpZGUgUHJvamVjdCBUZW1wbGF0ZXMgZm9yIFhjb2RlLiAKKwlVc2luZyBYY29kZSBpcyAqbm90KiBhIHJlcXVpcmVtZW50IGZvciB1c2luZyAKKwl0aGUgU0RMLmZyYW1ld29yay4gSG93ZXZlciwgZm9yIG5ld2JpZXMsIHdlIGRvIHJlY29tbWVuZCB0cnlpbmcgCisJb3V0IHRoZSBYY29kZSB0ZW1wbGF0ZXMgZmlyc3QgKGFuZCB3b3JrIHlvdXIgd2F5IGJhY2sgdG8gcmF3IGdjYyAKKwlpZiB5b3UgZGVzaXJlKSwgYXMgdGhlIFhjb2RlIHRlbXBsYXRlcyB0cnkgdG8gc2V0dXAgZXZlcnl0aGluZworCWZvciB5b3UgaW4gYSB3b3JraW5nIHN0YXRlLiBUaGlzIGF2b2lkcyB0aGUgbmVlZCB0byBhc2sgdGhvc2UgCisJbWFueSByZW9jY3VyaW5nIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBvbiB0aGUgbWFpbGluZyBsaXN0IAorCW9yIHRoZSBTREwgRkFRLgorCisKKwlXZSBoYXZlIHByb3ZpZGVkIDMgZGlmZmVyZW50IGtpbmRzIG9mIFNETCB0ZW1wbGF0ZXMgZm9yIFhjb2RlIGFuZCBoYXZlIAorCWEgZGlmZmVyZW50IHNldCBvZiB0ZW1wbGF0ZXMgZm9yIGVhY2ggdmVyc2lvbiBvZiBYY29kZSAod2hpY2ggZ2VuZXJhbGx5IAorCWNvcnJlc3BvbmQgd2l0aCBhIHBhcnRpY3VsYXIgTWFjIE9TIFggdmVyc2lvbikuIAorCVRoZSBpbnN0YWxsaW9uIGRpcmVjdG9yeSBkZXBlbmRzIG9uIHdoaWNoIHZlcnNpb24gb2YgWGNvZGUgeW91IGhhdmUuCisJKE5vdGU6IFRoZXNlIGRpcmVjdG9yaWVzIG1heSBub3QgYWxyZWFkeSBleGlzdCBvbiB5b3VyIHN5c3RlbSBzbyB5b3UgbXVzdCBjcmVhdGUgdGhlbSB5b3Vyc2VsZi4pCisKKwlGb3IgTGVvcGFyZCBhbmQgU25vdyBMZW9wYXJkIChYY29kZSAyLjUsIDMrKSwgd2UgcmVjb21tZW5kIHlvdSBpbnN0YWxsIHRvOgorCS9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvRGV2ZWxvcGVyL1NoYXJlZC9YY29kZS9Qcm9qZWN0IFRlbXBsYXRlcy9BcHBsaWNhdGlvbgorCisJRm9yIFhjb2RlIDEuMCB0byAyLjQsCisJL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9BcHBsZS9EZXZlbG9wZXIgVG9vbHMvUHJvamVjdCBUZW1wbGF0ZXMvQXBwbGxjYXRpb24gCisKKworCUFsc28gbm90ZSB5b3UgbWF5IHBsYWNlIGl0IGluIHBlci11c2VyIGxvY2F0aW9ucywgZS5nLgorCX4vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L0RldmVsb3Blci9TaGFyZWQvWGNvZGUvUHJvamVjdCBUZW1wbGF0ZXMvQXBwbGljYXRpb24KKworCQorCUFuZCBmb3IgYWR2YW5jZWQgdXNlcnMgd2hvIGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgWGNvZGUgaW5zdGFsbGVkIG9uIGEgc2luZ2xlIHN5c3RlbSwKKwl5b3UgbWF5IHB1dCBlYWNoIHNldCBpbiBhIGRpcmVjdG9yeSB3aXRoIHRoZSBYY29kZSB2ZXJzaW9uIG51bWJlciBpbnN0ZWFkIG9mIHVzaW5nICJTaGFyZWQiLCBlLmcuCisJL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9EZXZlbG9wZXIvMi41L1hjb2RlL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uCisJL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9EZXZlbG9wZXIvMy4xL1hjb2RlL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uCisJL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9EZXZlbG9wZXIvMy4yL1hjb2RlL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uCisKKworCUNvcHkgZWFjaCBvZiB0aGUgU0RML1hjb2RlIHRlbXBsYXRlIGRpcmVjdG9yaWVzIGludG8gdGhlIGNvcnJlY3QgbG9jYXRpb24gKGUuZy4gIlNETCBPcGVuR0wgQXBwbGljYXRpb24iKS4KKwlEbyBub3QgY29weSBvdXIgZW5jbG9zaW5nIGZvbGRlciBpbnRvIHRoZSBsb2NhdGlvbiAoZS5nLiBUZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkKS4KKwlTbyBmb3IgZXhhbXBsZSwgaW46CisJL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9EZXZlbG9wZXIvU2hhcmVkL1hjb2RlL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uCisJeW91IHNob3VsZCBoYXZlIHRoZSAzIGZvbGRlcnM6CisJU0RMIEFwcGxpY2F0aW9uCisJU0RMIENvY29hIEFwcGxpY2F0aW9uCisJU0RMIE9wZW5HTCBBcHBsaWNhdGlvbgorCisKKwlBZnRlciBkb2luZyB0aGlzLCB3aGVuIGRvaW5nIGEgRmlsZS0+TmV3IFByb2plY3QsIHlvdSB3aWxsIHNlZSB0aGUgCisJcHJvamVjdHMgdW5kZXIgdGhlIEFwcGxpY2F0aW9uIGNhdGVnb3J5LgorCShOZXdlciB2ZXJzaW9ucyBvZiBYY29kZSBoYXZlIGEgc2VwYXJhdGUgc2VjdGlvbiBmb3IgVXNlciBUZW1wbGF0ZXMgYW5kIGl0IHdpbGwgCisJYXBwZWFyIGluIHRoZSBBcHBsaWNhdGlvbiBjYXRlZ29yeSBvZiB0aGUgVXNlciBUZW1wbGF0ZXMgc2VjdGlvbi4pCisKKworCisJSG93IHRvIGNyZWF0ZSBhIG5ldyBTREwgcHJvamVjdDoKKworCTEuIE9wZW4gWGNvZGUKKwkyLiBTZWxlY3QgRmlsZS0+TmV3IFByb2plY3QKKwkzLiBTZWxlY3QgU0RMIEFwcGxpY2F0aW9uCisJNC4gTmFtZSwgU2F2ZSwgYW5kIEZpbmlzaAorCTUuIEFkZCB5b3VyIHNvdXJjZXMuCisJKjYuIFRoYXQncyBpdCEKKworCSogSWYgeW91IGluc3RhbGxlZCB0aGUgU0RMLmZyYW1ld29yayB0byAkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyAKKwlpbnN0ZWFkIG9mIC9MaWJyYXJ5L0ZyYW1ld29ya3MsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZSAKKwlsb2NhdGlvbiBvZiB0aGUgU0RMLmZyYW1ld29yayBpbiB0aGUgIkdyb3VwcyAmIEZpbGVzIiBicm93c2VyLgorCQorCisJVGhlIHByb2plY3QgdGVtcGxhdGVzIHdlIHByb3ZpZGUgYXJlOgorCS0gU0RMIEFwcGxpY2F0aW9uCisJCVRoaXMgaXMgdGhlIGJhcmVib25lcywgbW9zdCBiYXNpYyB2ZXJzaW9uLiBUaGVyZSBpcyBubyAKKwkJY3VzdG9taXplZCAuTmliIGZpbGUuIFdoaWxlIHN0aWxsIHV0aWxpemluZyBDb2NvYSB1bmRlciAKKwkJdGhlIGhvb2QsIHRoaXMgdmVyc2lvbiBtYXkgYmUgYmVzdCBzdWl0ZWQgZm9yIGZ1bGxzY3JlZW4gCisJCWFwcGxpY2F0aW9ucy4KKworCS0gU0RMIENvY29hIEFwcGxpY2F0aW9uCisJCVRoaXMgZGVtb25zdHJhdGVzIHRoZSBpbnRlZ3JhdGlvbiBvZiB1c2luZyBuYXRpdmUgCisJCUNvY29hIE1lbnVzIHdpdGggYW4gU0RMIEFwcGxpY2F0aW9uLiBGb3IgYXBwbGljYXRpb25zCisJCWRlc2lnbmVkIHRvIHJ1biBpbiBXaW5kb3dlZCBtb2RlLCBNYWMgdXNlcnMgbWF5IGFwcHJlY2lhdGUgCisJCWhhdmluZyBhY2Nlc3MgdG8gc3RhbmRhcmQgbWVudXMgZm9yIHRoaW5ncworCQlsaWtlIFByZWZlcmVuY2VzIGFuZCBRdWl0aW5nIChhbW9uZyBvdGhlciB0aGluZ3MpLgorCQkKKwktIFNETCBPcGVuR0wgQXBwbGljYXRpb24KKwkJVGhpcyByZXVzZXMgdGhlIHNhbWUgU0RMTWFpbiBmcm9tIHRoZSAiU0RMIEFwcGxpY2F0aW9uIiAKKwkJdGVtbXBsYXRlLCBidXQgYWxzbyBkZW1vbnN0cmF0ZXMgaG93IHRvIAorCQlicmluZyBPcGVuR0wgaW50byB0aGUgbWl4LgorCisKK1NwZWNpYWwgTm90ZXM6CitPbmx5IHRoZSAxMC42IFNub3cgTGVvcGFyZCB0ZW1wbGF0ZXMgKGFuZCBsYXRlcikgd2lsbCBpbmNsdWRlIDY0LWJpdCBpbiB0aGUgVW5pdmVyc2FsIEJpbmFyeSBhcyAKK3ByaW9yIHZlcnNpb25zIG9mIE9TIFggbGFja2VkIHRoZSBBUEkgc3VwcG9ydCBTREwgcmVxdWlyZXMgZm9yIDY0LWJpdCB0byB3b3JrIGNvcnJlY3RseS4KK1RvIHByZXZlbnQgNjQtYml0IFNETCBleGVjdXRhYmxlcyBmcm9tIGJlaW5nIGxhdW5jaGVkIG9uIDEwLjUgTGVvcGFyZCwgYSBzcGVjaWFsIGtleSBoYXMgYmVlbiBzZXQgCitpbiB0aGUgSW5mby5wbGlzdCBpbiBvdXIgU25vdyBMZW9wYXJkIFNETC9YY29kZSB0ZW1wbGF0ZXMuCisKKworWGNvZGUgVGlwcyBhbmQgVHJpY2tzOgorCistIEJ1aWxkaW5nIGZyb20gY29tbWFuZCBsaW5lCisJVXNlIHRoZSBjb21tYW5kIGxpbmUgdG9vbDogeGNvZGVidWlsZCAoc2VlIG1hbiBwYWdlKQorCQkgCistIFJ1bm5pbmcgeW91ciBhcHAKKyAgICBZb3UgY2FuIHNlbmQgY29tbWFuZCBsaW5lIGFyZ3MgdG8geW91ciBhcHAgYnkgZWl0aGVyIAorCWludm9raW5nIGl0IGZyb20gdGhlIGNvbW1hbmQgbGluZSAoaW4gKi5hcHAvQ29udGVudHMvTWFjT1MpIAorCW9yIGJ5IGVudGVyaW5nIHRoZW0gaW4gdGhlICJFeGVjdXRhYmxlcyIgcGFuZWwgb2YgdGhlIHRhcmdldCAKKwlzZXR0aW5ncy4KKwkKKy0gV29ya2luZyBkaXJlY3RvcnkKKyAgICBBcyBkZWZpbmVkIGluIHRoZSBTRExNYWluLm0gZmlsZSwgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIAorICAgIHlvdXIgU0RMIGFwcCBpcyBieSBkZWZhdWx0IHNldCB0byBpdHMgcGFyZW50LiBZb3UgbWF5IHdpc2ggdG8gCisgICAgY2hhbmdlIHRoaXMgdG8gYmV0dGVyIHN1aXQgeW91ciBuZWVkcy4KKworCisKK0FkZGl0aW9uYWwgUmVmZXJlbmNlczoKKworIC0gU2NyZWVuY2FzdCB0dXRvcmlhbHMgZm9yIGdldHRpbmcgc3RhcnRlZCB3aXRoIE9wZW5TY2VuZUdyYXBoL01hYyBPUyBYIGFyZSAKKyAJYXZhaWxhYmxlIGF0OgorCWh0dHA6Ly93d3cub3BlbnNjZW5lZ3JhcGgub3JnL3Byb2plY3RzL29zZy93aWtpL1N1cHBvcnQvVHV0b3JpYWxzL01hY09TWFRpcHMKKwlUaG91Z2ggdGhlc2UgYXJlIE9wZW5TY2VuZUdyYXBoIGNlbnRyaWMsIHRoZSBzYW1lIGV4YWN0IGNvbmNlcHRzIGFwcGx5IHRvIAorCVNETCwgdGh1cyB0aGUgdmlkZW9zIGFyZSByZWNvbW1lbmRlZCBmb3IgZXZlcnlib2R5IGdldHRpbmcgc3RhcnRlZCB3aXRoCisJZGV2ZWxvcGluZyBvbiBNYWMgT1MgWC4gKFlvdSBjYW4gc2tpbSBvdmVyIHRoZSBQbHVnSW5zIHN0dWZmIHNpbmNlIFNETAorCWRvZXNuJ3QgaGF2ZSBhbnkgUGx1Z0lucyB0byB3b3JyeSBhYm91dC4pCisKKworUGFydGlhbCBIaXN0b3J5OgorMjAwOS0wOS0yMSAtIEN1c3RvbVZpZXcgdGVtcGxhdGUgcHJvamVjdCB3YXMgcmVtb3ZlZCBiZWNhdXNlIGl0IHdhcyBicm9rZW4gYnkgCisJdGhlIHJlbW92YWwgb2YgbGVnYWN5IFF1aWNrdGltZSBzdXBwb3J0IHdoaWxlIG1vdmluZyB0byA2NC1iaXQuCisJUHJvamVjdEJ1aWxkZXIgdGVtcGxhdGVzIHdlcmUgcmVtb3ZlZC4KKwlUaWdlciwgTGVvcGFyZCwgYW5kIFNub3cgTGVvcGFyZCBYY29kZSB0ZW1wbGF0ZXMgd2VyZSBpbnRyb2R1Y2VkIGluc3RlYWQgb2YgCisJdXNpbmcgYSBzaW5nbGUgY29tbW9uIHRlbXBsYXRlIGR1ZSB0byB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgMy4KKwkoVGlnZXIgdXNlZCBhIGNoZXZyb24gbWFya2VyIGZvciBzdWJzdGl0dXRpb24gd2hpbGUgTGVvcGFyZC9Tbm93IExlb3BhcmQgdXNlIF9fXworCWFuZCB3ZSBuZWVkIHRoZSAxMC42IFNESyBmb3IgNjQtYml0LikKKworMjAwNy0xMi0zMCAtIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IG5ldyB0ZW1wbGF0ZSBwYXRocyBpbiBMZW9wYXJkCisJWGNvZGUuIEFkZGVkIHJlZmVyZW5jZSB0byBPU0cgc2NyZWVuY2FzdHMuCisKKzIwMDYtMDMtMTcgLSBDaGFuZ2VkIHRoZSBwYWNrYWdlIGZvcm1hdCBmcm9tIGEgLnBrZyBiYXNlZCAKKwlpbnN0YWxsZXIgdG8gYSAuZG1nIHRvIGF2b2lkIHJlcXVpcmluZyBhZG1pbmlzdHJhdG9yL3Jvb3QgCisJdG8gYWNjZXNzIGNvbnRlbnRzLCBmb3IgYmV0dGVyIHRyYW5zcGFyZW5jeSwgYW5kIHRvIGFsbG93IAorCXVzZXJzIHRvIG1vcmUgZWFzaWx5IGNvbnRyb2wgd2hpY2ggY29tcG9uZW50cyAKKwl0aGV5IGFjdHVhbGx5IHdhbnQgdG8gaW5zdGFsbC4gCisJSW50cm9kdWNlZCBhbmQgdXBkYXRlZCBkb2N1bWVudGF0aW9uLgorCUNyZWF0ZWQgYnJhbmQgbmV3IFhjb2RlIHByb2plY3QgdGVtcGxhdGVzIGZvciBYY29kZSAyLjEgCisJYmFzZWQgb24gdGhlIG9sZCBQcm9qZWN0IEJ1aWxkZXIgdGVtcGxhdGVzIGFzIHRoZXkgCisJcmVxdWlyZWQgWGNvZGUgdXNlcnMgdG8gIlVwZ3JhZGUgdG8gTmF0aXZlIFRhcmdldCIuIFRoZSBuZXcgCisJdGVtcGxhdGVzIHRyeSB0byBsZXZlYWdlIG1vcmUgZGVmYXVsdCBvcHRpb25zIGFuZCBsZXZlcmFnZSAKKwltb3JlIFhjb2RlIGNvbnZlbnRpb25zLiBUaGUgbWFqb3IgY2hhbmdlIHRoYXQgbWF5IGludHJvZHVjZSAKKwlzb21lIGJyZWFrYWdlIGlzIHRoYXQgSSBub3cgbGluayB0byB0aGUgU0RMIGZyYW1ld29yaworCXZpYSB0aGUgIkdyb3VwICYgRmlsZXMiIGJyb3dzZXIgaW5zdGVhZCBvZiB1c2luZyBidWlsZCAKKwlvcHRpb25zLiBUaGUgZG93bnNpZGUgdG8gdGhpcyBpcyB0aGF0IGlmIHRoZSB1c2VyIAorCWluc3RhbGxzIHRoZSBTREwuZnJhbWV3b3JrIHRvIGEgcGxhY2Ugb3RoZXIgdGhhbiAKKwkvTGlicmFyeS9GcmFtZXdvcmtzIChlLmcuICQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzKSwKKwl0aGUgZnJhbWV3b3JrIHdpbGwgbm90IGJlIGZvdW5kIHRvIGxpbmsgdG8gYW5kIHRoZSB1c2VyIAorCWhhcyB0byBtYW51YWxseSBmaXggdGhpcy4gQnV0IHRoZSB1cHNob3QgaXMgKGluIGFkZGl0aW9uIHRvIAorCWJlaW5nIHZpc3VhbGx5IGRpc3BsYXllZCBpbiB0aGUgZm9yZWZyb250KSBpcyB0aGF0IGl0IGlzIAorCXJlYWxseSBlYXN5IHRvIGNvcHkgKGVtYmVkKSB0aGUgZnJhbWV3b3JrIGF1dG9tYXRpY2FsbHkgCisJaW50byB0aGUgLmFwcCBidW5kbGUgb24gYnVpbGQuIFNvIEkgaGF2ZSBhZGRlZCB0aGlzIAorCWZlYXR1cmUsIHdoaWNoIG1ha2VzIHRoZSBhcHBsaWNhdGlvbiBwb3RlbnRpYWxseSAKKwlkcmFnLWFuZC1kcm9wcGFibGUgcmVhZHkuIFRoZSBQcm9qZWN0IEJ1aWxkZXIgdGVtcGxhdGVzIAorCWFyZSBtb3N0bHkgdW5jaGFuZ2VkIGR1ZSB0byB0aGUgZmFjdCB0aGF0IEkgZG9uJ3QgaGF2ZSAKKwlQcm9qZWN0IEJ1aWxkZXIuIEkgZGlkIHJlbmFtZSBhIGZpbGUgZXh0ZW5zaW9uIHRvIC5wYnhwcm9qIAorCWZvciB0aGUgU0RMIEN1c3RvbSBDb2NvYSBBcHBsaWNhdGlvbiB0ZW1wbGF0ZSBiZWNhdXNlIAorCXRoZSAucGJ4IGV4dGVuc2lvbiB3b3VsZCBub3QgbG9hZCBpbiBteSB2ZXJzaW9uIG9mIFhjb2RlLgorCUZvciBib3RoIFByb2plY3QgQnVpbGRlciBhbmQgWGNvZGUgdGVtcGxhdGVzLCBJIHJlc3luYydkCisJdGhlIFNETE1haW4uKiBmaWxlcyBmb3IgdGhlIFNETCBBcHAgYW5kIE9wZW5HTCBBcHAgCisJdGVtcGxhdGVzLiBJIHRoaW5rIHBlb3BsZSBmb3JnZXQgdGhhdCB3ZSBoYXZlIDIgb3RoZXIgCisJU0RMTWFpbidzIChhbmQgLk5pYidzKSBhbmQgc29tZWJvZHkgbmVlZHMgdG8gZ28gCisJdGhyb3VnaCB0aGVtIGFuZCBtZXJnZSB0aGUgbmV3IGNoYW5nZXMgaW50byB0aG9zZS4KKwlJIGFsc28gd3JvdGUgYSBmaXggZm9yIHRoZSBTREwgQ3VzdG9tIENvY29hIEFwcCAKKwl0ZW1wbGF0ZSBpbiBNeUNvbnRyb2xsZXIubS4gVGhlIHNwcml0ZSBsb2FkaW5nIGNvZGUgCisJbmVlZGVkIHRvIGJlIGFibGUgdG8gZmluZCB0aGUgaWNvbi5ibXAgaW4gdGhlIC5hcHAKKwlidW5kbGUncyBSZXNvdXJjZXMgZm9sZGVyLiBUaGlzIGNoYW5nZSB3YXMgbmVlZGVkIHRvIGdldCAKKwl0aGUgYXBwIHRvIHJ1biBvdXQgb2YgdGhlIGJveC4gVGhpcyBtaWdodCBjaGFuZ2UgaXMgdW50ZXN0ZWQgCisJd2l0aCBQcm9qZWN0IEJ1aWxkZXIgdGhvdWdoIGFuZCBtaWdodCBicmVhayBpdC4KKwlUaGVyZSBhbHNvIHNlZW1lZCB0byBiZSBzb21lIGNvcnJ1cHRpb24gaW4gdGhlIC5uaWIgaXRzZWxmLgorCU1lcmVseSBvcGVuaW5nIGl0IGFuZCBzYXZpbmcgKGFsbG93aW5nIElCIHRvIGNvcnJlY3QgdGhlCisJLm5pYikgc2VlbWVkIHRvIGNvcnJlY3QgdGhpbmdzLgorCShFcmljIFdpbmcpCisKKworCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvU0RMLWRldmVsLmluZm8gYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L1NETC1kZXZlbC5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5OGYxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L1NETC1kZXZlbC5pbmZvCkBAIC0wLDAgKzEsMTUgQEAKK1RpdGxlIFNETCAxLjIuOQorVmVyc2lvbiAxCitEZXNjcmlwdGlvbiBTREwgTGlicmFyeSBmb3IgTWFjIE9TIFggKGh0dHA6Ly93d3cubGlic2RsLm9yZykKK0RlZmF1bHRMb2NhdGlvbiAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vU0RMCitEaXNrbmFtZSAobnVsbCkKK0RlbGV0ZVdhcm5pbmcgCitOZWVkc0F1dGhvcml6YXRpb24gWUVTCitEaXNhYmxlU3RvcCBOTworVXNlVXNlck1hc2sgWUVTCitBcHBsaWNhdGlvbiBOTworUmVsb2NhdGFibGUgTk8KK1JlcXVpcmVkIE5PCitJbnN0YWxsT25seSBOTworUmVxdWlyZXNSZWJvb3QgTk8KK0luc3RhbGxGYXQgTk8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvU0RMLmluZm8gYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L1NETC5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhMzdhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L1NETC5pbmZvCkBAIC0wLDAgKzEsMTUgQEAKK1RpdGxlIFNETCAxLjIuOAorVmVyc2lvbiAxCitEZXNjcmlwdGlvbiBTREwgTGlicmFyeSBmb3IgTWFjIE9TIFggKGh0dHA6Ly93d3cubGlic2RsLm9yZykKK0RlZmF1bHRMb2NhdGlvbiAvTGlicmFyeS9GcmFtZXdvcmtzCitEaXNrbmFtZSAobnVsbCkKK0RlbGV0ZVdhcm5pbmcgCitOZWVkc0F1dGhvcml6YXRpb24gTk8KK0Rpc2FibGVTdG9wIE5PCitVc2VVc2VyTWFzayBOTworQXBwbGljYXRpb24gTk8KK1JlbG9jYXRhYmxlIFlFUworUmVxdWlyZWQgTk8KK0luc3RhbGxPbmx5IE5PCitSZXF1aXJlc1JlYm9vdCBOTworSW5zdGFsbEZhdCBOTwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETC9wa2ctc3VwcG9ydC9kZXZlbC1yZXNvdXJjZXMvUmVhZE1lLnR4dCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvZGV2ZWwtcmVzb3VyY2VzL1JlYWRNZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjRmZTM2MQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvZGV2ZWwtcmVzb3VyY2VzL1JlYWRNZS50eHQKQEAgLTAsMCArMSw1IEBACitUaGUgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIChTREwgZm9yIHNob3J0KSBpcyBhIGNyb3NzLXBsYXRmb3JtIGxpYnJhcnkgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IHRvIHdyaXRlIG11bHRpLW1lZGlhIHNvZnR3YXJlLCBzdWNoIGFzIGdhbWVzIGFuZCBlbXVsYXRvcnMuCisKK1RoZSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgbGlicmFyeSBzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUgZnJvbTogaHR0cDovL3d3dy5saWJzZGwub3JnLworCitUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCBsaWNlbnNlOiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvbGVzc2VyLmh0bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L2RldmVsLXJlc291cmNlcy9XZWxjb21lLnR4dCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvZGV2ZWwtcmVzb3VyY2VzL1dlbGNvbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliMGQyODYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L2RldmVsLXJlc291cmNlcy9XZWxjb21lLnR4dApAQCAtMCwwICsxLDUgQEAKK1RoaXMgcGFja2FnZSBpbnN0YWxscyBkb2N1bWVudGF0aW9uIGFuZCBQcm9qZWN0IEJ1aWxkZXIgc3RhdGlvbmFyeSBmb3IgdGhlIFNETCBmcmFtZXdvcmsuCisKK1RoZSBTREwgZG9jdW1lbnRhdGlvbiBpcyBpbnN0YWxsZWQgaW50byAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vU0RMLgorCitUaGUgU0RMIE1hYyBPUyBYIFJlYWRtZSBpcyBpbnN0YWxsZWQgaW50byB5b3VyIGhvbWUgZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETC9wa2ctc3VwcG9ydC9kZXZlbC1yZXNvdXJjZXMvaW5zdGFsbC5zaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvZGV2ZWwtcmVzb3VyY2VzL2luc3RhbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTdhNGRlZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvZGV2ZWwtcmVzb3VyY2VzL2luc3RhbGwuc2gKQEAgLTAsMCArMSw3NiBAQAorIyEvYmluL3NoCisjIGZpbmlzaCB1cCB0aGUgaW5zdGFsbGF0aW9uCisjIHRoaXMgc2NyaXB0IHNob3VsZCBiZSBleGVjdXRlZCB1c2luZyB0aGUgc3VkbyBjb21tYW5kCisjIHRoaXMgZmlsZSBpcyBjb3BpZWQgdG8gU0RMLWRldmVsLnBvc3RfaW5zdGFsbCBhbmQgU0RMLWRldmVsLnBvc3RfdXBncmFkZQorIyBpbnNpZGUgdGhlIC5wa2cgYnVuZGxlCitlY2hvICJSdW5uaW5nIHBvc3QtaW5zdGFsbCBzY3JpcHQiCit1bWFzayAwMjIKKworVVNFUj1gYmFzZW5hbWUgfmAKK2VjaG8gIlVzZXIgaXMgXCIkVVNFUlwiIgorCitST09UPS9EZXZlbG9wZXIvRG9jdW1lbnRhdGlvbi9TREwKK2VjaG8gIkZpeGluZyBmcmFtZXdvcmsgcGVybWlzc2lvbnMiCitmaW5kICRST09UIC10eXBlIGQgLWV4ZWMgY2htb2QgYStyeCB7fSBcOworZmluZCAkUk9PVCAtdHlwZSBmIC1leGVjIGNobW9kIGErciB7fSBcOworCisjIyBXZSdyZSBub3QgaW5zdGFsbGluZyBmcmFtZXdvcmtzIGhlcmUgYW55bW9yZS4gVGhlIHNpbmdsZQorIyMgZnJhbWV3b3JrIHNob3VsZCBiZSBpbnN0YWxsZWQgdG8gL0xpYnJhcnkvRnJhbWV3b3JrcyB3aGljaCAKKyMjIGlzIGhhbmRsZWQgYnkgdGhlIHN0YW5kYXJkIHBhY2thZ2UgKG5vdCBkZXZlbG9wZXIgcGFja2FnZSkuCisjIyBVc2luZyB0aGUgaG9tZSBkaXJlY3RvcnkgaGVyZSBpcyBwcm9ibGVtYXRpYyBmb3IgbXVsdGktdXNlciBzeXN0ZW1zIHRvby4KKyMgZWNobyAiTW92aW5nIFNETC5mcmFtZXdvcmsgdG8gfi9MaWJyYXJ5L0ZyYW1ld29ya3MiCisjIG1vdmUgU0RMIHRvIGl0cyBwcm9wZXIgaG9tZSwgc28gdGhlIHRhcmdldCBzdGF0aW9uYXJ5IHdvcmtzCisjc3VkbyAtdSAkVVNFUiBta2RpciAtcCB+L0xpYnJhcnkvRnJhbWV3b3JrcworI3N1ZG8gLXUgJFVTRVIgL0RldmVsb3Blci9Ub29scy9DcE1hYyAtciAkUk9PVC9TREwuZnJhbWV3b3JrIH4vTGlicmFyeS9GcmFtZXdvcmtzCisKKyMjIEknbSBub3Qgc3VyZSB3aGVyZSB0aGlzIGdldHMgY3JlYXRlZCBhbmQgd2hhdCdzIHB1dCBpbiB0aGVyZS4KK3JtIC1yZiAkUk9PVC9TREwuZnJhbWV3b3JrCisKKyMjIEkgdGhpbmsgcHJlY29tcGlsZWQgaGVhZGVycyBoYXZlIGNoYW5nZWQgdGhyb3VnaCB0aGUgcmV2aXNpb25zIG9mIEFwcGxlJ3MgZ2NjLgorIyMgSSBkb24ndCBrbm93IGhvdyB1c2VmdWwgdGhpcyBpcyBhbnltb3JlIHcuci50LiBBcHBsZSdzIG5ld2VzdCBzeXN0ZW0gZm9yIHByZWNvbXBpbGVkIGhlYWRlcnMuCisjIyBJJ20gcmVtb3ZpbmcgdGhpcyBmb3Igbm93LgorIyBlY2hvICJQcmVjb21waWxpbmcgSGVhZGVyIgorIyBwcmVjb21waWxlIGhlYWRlciBmb3Igc3BlZWRpZXIgY29tcGlsZXMKKyNzdWRvIC11ICRVU0VSIC91c3IvYmluL2NjIC1wcmVjb21wIH4vTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycy9TREwuaCAtbyB+L0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMvU0RMLnAKKworIyBmaW5kIHRoZSBkaXJlY3RvcnkgdG8gc3RvcmUgc3RhdGlvbmFyeSBpbgoraWYgWyAtZSAiL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9BcHBsZS9EZXZlbG9wZXIgVG9vbHMiIF0gOyB0aGVuCisgICAgZWNobyAiSW5zdGFsbGluZyBwcm9qZWN0IHN0YXRpb25hcnkgZm9yIFhDb2RlIgorICAgIFBCWERJUj0iL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9BcHBsZS9EZXZlbG9wZXIgVG9vbHMiCitlbHNlCisgICAgZWNobyAiSW5zdGFsbGluZyBwcm9qZWN0IHN0YXRpb25hcnkgZm9yIFByb2plY3QgQnVpbGRlciIKKyAgICBQQlhESVI9Ii9EZXZlbG9wZXIvUHJvamVjdEJ1aWxkZXIgRXh0cmFzIgorZmkKKworIyBtb3ZlIHN0YXRpb25hcnkgdG8gaXRzIHByb3BlciBob21lCitta2RpciAtcCAiJFBCWERJUi9Qcm9qZWN0IFRlbXBsYXRlcy9BcHBsaWNhdGlvbiIKK21rZGlyIC1wICIkUEJYRElSL1RhcmdldCBUZW1wbGF0ZXMvU0RMIgorCitjcCAtciAiJFJPT1QvUHJvamVjdCBTdGF0aW9uYXJ5L1NETCBBcHBsaWNhdGlvbiIgICAgICAgICAgICAgICIkUEJYRElSL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uLyIKK2NwIC1yICIkUk9PVC9Qcm9qZWN0IFN0YXRpb25hcnkvU0RMIENvY29hIEFwcGxpY2F0aW9uIiAgICAgICAgIiRQQlhESVIvUHJvamVjdCBUZW1wbGF0ZXMvQXBwbGljYXRpb24vIgorY3AgLXIgIiRST09UL1Byb2plY3QgU3RhdGlvbmFyeS9TREwgQ3VzdG9tIENvY29hIEFwcGxpY2F0aW9uIiAiJFBCWERJUi9Qcm9qZWN0IFRlbXBsYXRlcy9BcHBsaWNhdGlvbi8iCitjcCAtciAiJFJPT1QvUHJvamVjdCBTdGF0aW9uYXJ5L1NETCBPcGVuR0wgQXBwbGljYXRpb24iICAgICAgICIkUEJYRElSL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uLyIKK2NwICIkUk9PVC9Qcm9qZWN0IFN0YXRpb25hcnkvQXBwbGljYXRpb24udHJndHRtcGwiICAgICAgICAgICAgIiRQQlhESVIvVGFyZ2V0IFRlbXBsYXRlcy9TREwvIgorCitybSAtcmYgIiRST09UL1Byb2plY3QgU3RhdGlvbmFyeSIKKworIyBBY3R1YWxseSwgbWFuIGRvZXNuJ3QgY2hlY2sgdGhpcyBkaXJlY3RvcnkgYnkgZGVmYXVsdCwgc28gdGhpcyBpc24ndAorIyB2ZXJ5IGhlbHBmdWwgYW55bW9yZS4KKyNlY2hvICJJbnN0YWxsaW5nIE1hbiBQYWdlcyIKKyMjIHJlbW92ZSBvbGQgbWFuIHBhZ2VzCisjcm0gLXJmICIvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vTWFuUGFnZXMvbWFuMy9TREwiKgorIworIyMgaW5zdGFsbCBtYW4gcGFnZXMKKyNta2RpciAtcCAiL0RldmVsb3Blci9Eb2N1bWVudGF0aW9uL01hblBhZ2VzL21hbjMiCisjY3AgIiRST09UL2RvY3MvbWFuMy9TREwiKiAiL0RldmVsb3Blci9Eb2N1bWVudGF0aW9uL01hblBhZ2VzL21hbjMvIgorI3JtIC1yZiAiJFJPT1QvZG9jcy9tYW4zIgorIworI2VjaG8gIlJlYnVpbGRpbmcgQXByb3BvcyBEYXRhYmFzZSIKKyMjIHJlYnVpbGQgYXByb3BvcyBkYXRhYmFzZQorIy91c3IvbGliZXhlYy9tYWtld2hhdGlzCisKKyMgY29weSBSRUFETUUgZmlsZSB0byB5b3VyIGhvbWUgZGlyZWN0b3J5CitzdWRvIC11ICRVU0VSIGNwICIkUk9PVC9SZWFkbWUgU0RMIERldmVsb3Blci50eHQiIH4vCisKKyMgb3BlbiB1cCB0aGUgUkVBRE1FIGZpbGUKK3N1ZG8gLXUgJFVTRVIgb3BlbiB+LyJSZWFkbWUgU0RMIERldmVsb3Blci50eHQiCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L3Jlc291cmNlcy9MaWNlbnNlLnJ0ZiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvcmVzb3VyY2VzL0xpY2Vuc2UucnRmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcwNjk4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L3Jlc291cmNlcy9MaWNlbnNlLnJ0ZgpAQCAtMCwwICsxLDI4MyBAQAore1xydGYxXG1hY1xhbnNpY3BnMTAwMDBcY29jb2FydGYxMDIKK3tcZm9udHRibFxmMFxmc3dpc3NcZmNoYXJzZXQ3NyBIZWx2ZXRpY2EtQm9sZDtcZjFcZnN3aXNzXGZjaGFyc2V0NzcgSGVsdmV0aWNhO1xmMlxmc3dpc3NcZmNoYXJzZXQ3NyBIZWx2ZXRpY2EtT2JsaXF1ZTsKK30KK3tcY29sb3J0Ymw7XHJlZDI1NVxncmVlbjI1NVxibHVlMjU1O1xyZWQ2NFxncmVlbjY0XGJsdWU2NDt9CitccGFwZXJ3MTE5MDBccGFwZXJoMTY4NDBcbWFyZ2wxNDQwXG1hcmdyMTQ0MFx2aWV3dzkwODBcdmlld2gxMzE2MFx2aWV3a2luZDAKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJccWMKKworXGYwXGJcZnMzNiBcY2YwIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorXGZzMjQgXAorVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKK1xmMVxiMCBcCitccGFyZFx0eDU2NVx0eDExMzNcdHgxNzAwXHR4MjI2Nlx0eDI4MzJcdHgzNDAxXHR4Mzk2N1x0eDQ1MzVcdHg1MTAyXHR4NTY2OVx0eDYyMzVcdHg2ODAyXHFsXHFuYXR1cmFsCitcY2YwIFwKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJccWMKKworXGYyXGkgXGNmMCAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlwKKyAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQVwKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXNcCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxxbFxxbmF0dXJhbAorCitcZjFcaTAgXGNmMCBcCitccGFyZFx0eDU2NVx0eDExMzNcdHgxNzAwXHR4MjI2Nlx0eDI4MzJcdHgzNDAxXHR4Mzk2N1x0eDQ1MzVcdHg1MTAyXHR4NTY2OVx0eDYyMzVcdHg2ODAyXHFsXHFuYXR1cmFsCitcY2YyIFtUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMgYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dXGNmMCBcCitcCitccGFyZFx0eDU2NVx0eDExMzNcdHgxNzAwXHR4MjI2Nlx0eDI4MzJcdHgzNDAxXHR4Mzk2N1x0eDQ1MzVcdHg1MTAyXHR4NTY2OVx0eDYyMzVcdHg2ODAyXHFjCisKK1xmMFxiIFxjZjAgUHJlYW1ibGUKK1xmMVxiMCBcCitccGFyZFx0eDU2NVx0eDExMzNcdHgxNzAwXHR4MjI2Nlx0eDI4MzJcdHgzNDAxXHR4Mzk2N1x0eDQ1MzVcdHg1MTAyXHR4NTY2OVx0eDYyMzVcdHg2ODAyXHFsXHFuYXR1cmFsCitcY2YwIFwKK1RoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuXAorXAorVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZSBzcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdSBjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyIHRoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyIHN0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LlwKK1wKK1doZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwgbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mIGl0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuXAorXAorVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZCBkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlIHJpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuXAorXAorRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZSB5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUgY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtIHdpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nIGl0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLlwKK1wKK1dlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUgbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuXAorXAorVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbCBhdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUgaW50cm9kdWNlZCBieSBvdGhlcnMuXAorXAorRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YgYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdCBlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEgcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQgYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS5cCitcCitNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB0aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlIGxpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLlwKK1wKK1doZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYSBjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUgZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnkuXAorXAorV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdCBkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3Mgb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcyBhcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkgbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbiBzcGVjaWFsIGNpcmN1bXN0YW5jZXMuXAorXAorRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8gZW5jb3VyYWdlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcyBhIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlIGFsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUgbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzIGNhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZSBzb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLlwKK1wKK0Fub3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZiBmcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluIG5vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVSBvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZyBzeXN0ZW0uXAorXAorQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUgdXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgaW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMgbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuIHRoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuXAorXAorVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhICJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlIGZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QgYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uXAorXAorXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxxYworCitcZjBcYiBcY2YwIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRVwKK1RFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTlwKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJccWxccW5hdHVyYWwKKworXGYxXGIwIFxjZjAgXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxxbFxxbmF0dXJhbAorCitcZjBcYiBcY2YwIDAuCitcZjFcYjAgIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlciBwcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuXAorXAorQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YSBwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMgKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy5cCitcCitUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yayB3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKVwKK1wKKyJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuXAorXAorQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZiBydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tIHN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvciB3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzIGFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLlwKKyAgXAorCitcZjBcYiAxLgorXGYxXGIwICBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MgY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgTGlicmFyeS5cCitcCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS5cCitcCisKK1xmMFxiIDIuCitcZjFcYjAgIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24gb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczpcCitcCitccGFyZFx0eDU2NVx0eDExMzNcdHgxNzAwXHR4MjI2Nlx0eDI4MzJcdHgzNDAxXHR4Mzk2N1x0eDQ1MzVcdHg1MTAyXHR4NTY2OVx0eDYyMzVcdHg2ODAyXGxpMjQwXHFsXHFuYXR1cmFsCisKK1xmMFxiIFxjZjAgYSkKK1xmMVxiMCAgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LlwKK1wKKworXGYwXGIgYikKK1xmMVxiMCAgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuXAorXAorCitcZjBcYiBjKQorXGYxXGIwICBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuXAorXAorCitcZjBcYiBkKQorXGYxXGIwICBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5IGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LCBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLlwKK1wKKyhGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLilcCitccGFyZFx0eDU2NVx0eDExMzNcdHgxNzAwXHR4MjI2Nlx0eDI4MzJcdHgzNDAxXHR4Mzk2N1x0eDQ1MzVcdHg1MTAyXHR4NTY2OVx0eDYyMzVcdHg2ODAyXHFsXHFuYXR1cmFsCitcY2YwIFwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYgaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwgYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluIHRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2Ugc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUgZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LlwKK1wKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdCB5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8gZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yIGNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuXAorXAorSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeSB3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS5cCitcCitccGFyZFx0eDU2NVx0eDExMzNcdHgxNzAwXHR4MjI2Nlx0eDI4MzJcdHgzNDAxXHR4Mzk2N1x0eDQ1MzVcdHg1MTAyXHR4NTY2OVx0eDYyMzVcdHg2ODAyXHFsXHFuYXR1cmFsCisKK1xmMFxiIFxjZjAgMy4KK1xmMVxiMCAgWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbyB0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvIHRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5IHRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4gdGhlc2Ugbm90aWNlcy5cCitcCitPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yIHRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsIHN1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuXAorXAorVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mIHRoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS5cCitcCisKK1xmMFxiIDQuIAorXGYxXGIwIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yIGRlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuXAorXAorSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvIGRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QgY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS5cCitcCisKK1xmMFxiIDUuCitcZjFcYjAgIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlIExpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IgbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEgd29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZCB0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLlwKK1wKK0hvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0IGNvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLiBTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy5cCitcCitXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZSB0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuIFdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlIGxpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlIHRocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuXAorXAorSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEgc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lIGZ1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QgZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZSB3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKVwKK1wKK090aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5IGRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LiBBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwgd2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLlwKK1wKKworXGYwXGIgNi4KK1xmMVxiMCAgQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IgbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEgd29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdCBtb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UgZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuXAorXAorWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlIExpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrIGR1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UgZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZSBvZiB0aGVzZSB0aGluZ3M6XAorXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxsaTI0MFxxbFxxbmF0dXJhbAorCitcZjBcYiBcY2YwIGEpCitcZjFcYjAgIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlciBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKVwKK1wKKworXGYwXGIgYikKK1xmMVxiMCAgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLCByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZiB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguXAorXAorCitcZjBcYiBjKQorXGYxXGIwICBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uXAorXAorCitcZjBcYiBkKQorXGYxXGIwICBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLlwKK1wKKworXGYwXGIgZSkKK1xmMVxiMCAgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LlwKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJccWxccW5hdHVyYWwKK1xjZjAgXAorRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yIHJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLlwKK1wKK0l0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlIHJlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkgYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdCB1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91IGRpc3RyaWJ1dGUuXAorXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxxbFxxbmF0dXJhbAorCitcZjBcYiBcY2YwIDcuCitcZjFcYjAgIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZCBsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlIHBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6XAorXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxsaTI0MFxxbFxxbmF0dXJhbAorCitcZjBcYiBcY2YwIGEpCitcZjFcYjAgIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFNlY3Rpb25zIGFib3ZlLlwKK1wKKworXGYwXGIgYikKK1xmMVxiMCAgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLlwKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJccWxccW5hdHVyYWwKK1xjZjAgXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxxbFxxbmF0dXJhbAorCitcZjBcYiBcY2YwIDguCitcZjFcYjAgIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS5cCitcCisKK1xmMFxiIDkuCitcZjFcYjAgIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdCBzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUgcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQgYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZyB0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC5cCitcCisKK1xmMFxiIDEwLgorXGYxXGIwICBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkgc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLlwKK1wKKworXGYwXGIgMTEuCitcZjFcYjAgIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQgaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvciBvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90IGV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50IGxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkgYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS5cCitcCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy5cCitcCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55IHBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55IHN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlIGdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQgc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZyB0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQgY2hvaWNlLlwKK1wKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0byBiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS5cCitcCisKK1xmMFxiIDEyLgorXGYxXGIwICBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbiBjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuXAorXAorCitcZjBcYiAxMy4KK1xmMVxiMCAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy5cCitcCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5IHNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYSBsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLlwKK1wKKworXGYwXGIgMTQuCitcZjFcYjAgIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZSBwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsIHdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LlwKK1wKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJccWMKKworXGYwXGIgXGNmMCBOTyBXQVJSQU5UWQorXGYxXGIwIFwKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJccWxccW5hdHVyYWwKK1xjZjAgXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxxbFxxbmF0dXJhbAorCitcZjBcYiBcY2YwIDE1LgorXGYxXGIwICBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiBFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uXAorXAorCitcZjBcYiAxNi4KK1xmMVxiMCAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIExJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuXAorXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxxYworCitcZjBcYiBcY2YwIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworXGYxXGIwIFwKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJccWxccW5hdHVyYWwKK1xjZjAgXAorXAorSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllc1wKK1wKK0lmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QgcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0IGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZyByZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuXAorXAorVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcyBzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseSBjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC5cCitcCitccGFyZFx0eDIyMFx0eDU2NVx0eDExMzNcdHgxNzAwXHR4MjI2Nlx0eDI4MzJcdHgzNDAxXHR4Mzk2N1x0eDQ1MzVcdHg1MTAyXHR4NTY2OVx0eDYyMzVcdHg2ODAyXGxpMjQwXHFsXHFuYXR1cmFsCitcY2YwIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+XAorQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj5cCitcCitUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cCitcCitUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cCitcCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQVwKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJccWxccW5hdHVyYWwKK1xjZjAgXAorQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuXAorXAorWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIgc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYgbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOlwKK1wKK1xwYXJkXHR4NTY1XHR4MTEzM1x0eDE3MDBcdHgyMjY2XHR4MjgzMlx0eDM0MDFcdHgzOTY3XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNVx0eDY4MDJcbGkyNDBccWxccW5hdHVyYWwKK1xjZjAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgbGlicmFyeVwKK2BGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLlwKK1wKKzxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MFwKK1R5IENvb24sIFByZXNpZGVudCBvZiBWaWNlXAorXHBhcmRcdHg1NjVcdHgxMTMzXHR4MTcwMFx0eDIyNjZcdHgyODMyXHR4MzQwMVx0eDM5NjdcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM1XHR4NjgwMlxxbFxxbmF0dXJhbAorXGNmMCBcCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IVwKK1wKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L3Jlc291cmNlcy9SZWFkTWUudHh0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETC9wa2ctc3VwcG9ydC9yZXNvdXJjZXMvUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNzMxMTUwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETC9wa2ctc3VwcG9ydC9yZXNvdXJjZXMvUmVhZE1lLnR4dApAQCAtMCwwICsxLDE3MSBAQAorVGhlIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciAoU0RMIGZvciBzaG9ydCkgaXMgYSBjcm9zcy1wbGF0Zm9ybSAKK2xpYnJhcnkgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IHRvIHdyaXRlIG11bHRpLW1lZGlhIHNvZnR3YXJlLCAKK3N1Y2ggYXMgZ2FtZXMgYW5kIGVtdWxhdG9ycy4KKworVGhlIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciBsaWJyYXJ5IHNvdXJjZSBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tOiAKK2h0dHA6Ly93d3cubGlic2RsLm9yZy8KKworVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwgbGljZW5zZTogCitodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvbGVzc2VyLmh0bWwKKworCitUaGlzIHBhY2thZ2VzIGNvbnRhaW5zIHRoZSBTREwuZnJhbWV3b3JrIGZvciBPUyBYLiAKK0NvbmZvcm1pbmcgd2l0aCBBcHBsZSBndWlkZWxpbmVzLCB0aGlzIGZyYW1ld29yayAKK2NvbnRhaW5zIGJvdGggdGhlIFNETCBydW50aW1lIGNvbXBvbmVudCBhbmQgZGV2ZWxvcG1lbnQgaGVhZGVyIGZpbGVzLgorCisKK1RvIEluc3RhbGw6CitDb3B5IHRoZSBTREwuZnJhbWV3b3JrIHRvIC9MaWJyYXJ5L0ZyYW1ld29ya3MKKworWW91IG1heSBhbHRlcm5hdGl2ZWx5IGluc3RhbGwgaXQgaW4gPFlvdXIgaG9tZSBkaXJlY3Rvcnk+L0xpYnJhcnkvRnJhbWV3b3JrcyAKK2lmIHlvdXIgYWNjZXNzIHByaXZpbGVnZXMgYXJlIG5vdCBoaWdoIGVub3VnaC4gCisoQmUgYXdhcmUgdGhhdCB0aGUgWGNvZGUgdGVtcGxhdGVzIHdlIHByb3ZpZGUgaW4gdGhlIFNETCBEZXZlbG9wZXIgRXh0cmFzIAorcGFja2FnZSBtYXkgcmVxdWlyZSBzb21lIGFkanVzdG1lbnQgZm9yIHlvdXIgc3lzdGVtIGlmIHlvdSBkbyB0aGlzLikKKworCitLbm93biBJc3N1ZXM6Cis/Pz8KKworCitBZGRpdGlvbmFsIFJlZmVyZW5jZXM6CisKKyAtIFNjcmVlbmNhc3QgdHV0b3JpYWxzIGZvciBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCBPcGVuU2NlbmVHcmFwaC9NYWMgT1MgWCBhcmUgCisgCWF2YWlsYWJsZSBhdDoKKwlodHRwOi8vd3d3Lm9wZW5zY2VuZWdyYXBoLm9yZy9wcm9qZWN0cy9vc2cvd2lraS9TdXBwb3J0L1R1dG9yaWFscy9NYWNPU1hUaXBzCisJVGhvdWdoIHRoZXNlIGFyZSBPcGVuU2NlbmVHcmFwaCBjZW50cmljLCB0aGUgc2FtZSBleGFjdCBjb25jZXB0cyBhcHBseSB0byAKKwlTREwsIHRodXMgdGhlIHZpZGVvcyBhcmUgcmVjb21tZW5kZWQgZm9yIGV2ZXJ5Ym9keSBnZXR0aW5nIHN0YXJ0ZWQgd2l0aAorCWRldmVsb3Bpbmcgb24gTWFjIE9TIFguIChZb3UgY2FuIHNraW0gb3ZlciB0aGUgUGx1Z0lucyBzdHVmZiBzaW5jZSBTREwKKwlkb2Vzbid0IGhhdmUgYW55IFBsdWdJbnMgdG8gd29ycnkgYWJvdXQuKQorCisKKworKFBhcnRpYWwpIEhpc3Rvcnkgb2YgUEIvWGNvZGUgcHJvamVjdHM6CisyMDA5LTA5LTIxIC0gQWRkZWQgNjQtYml0IGZvciBTbm93IExlb3BhcmQuIDEwLjQgaXMgdGhlIG5ldyBtaW5pbXVtIHJlcXVpcmVtZW50LgorCVJlbW92ZWQgJ25vIFgxMScgdGFyZ2V0cyBhcyAKKwluZXcgY29kZWJhc2Ugd2lsbCBhc3N1bWUgeW91IGhhdmUgdGhlbS4gQWxzbyByZW1vdmVkIHNwZWNpZmljICNkZWZpbmVzCisJZm9yIFgxMSwgYnV0IG5lZWRlZCB0byBhZGQgc2VhcmNoIHBhdGggdG8gL3Vzci9YMTFSNi9pbmNsdWRlCisJCisyMDA3LTEyLTMxIC0gRW5hYmxlZCBzdHJpcCAteCBpbiB0aGUgWGNvZGUgc2V0dGluZ3MgYW5kIHJlbW92ZWQgaXQgCisJZnJvbSB0aGUgQnVpbGQgRE1HIHNjcmlwdC4KKwlBZGRlZCBhIHBlci1hcmNoIHNldHRpbmcgZm9yIHRoZSBEZXBsb3ltZW50IHRhcmdldHMgZm9yIE9USEVSX0xERkxBR1NfcHBjCisJdG8gcmUtZW5hYmxlIHByZWJpbmRpbmcuCisJTmVlZCB0byByZW1lbWJlciB0byBjb3B5IHRoZXNlIGNoYW5nZXMgdG8gdGhlIFNETCBzYXRlbGxpdGUgcHJvamVjdHMuCisKKzIwMDctMTItMzAgLSBVcGRhdGVkIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCBuZXcgaW5zdGFsbGF0aW9uIHBhdGhzIGZvcgorCVhjb2RlIHByb2plY3QgdGVtcGxhdGVzIHVuZGVyIExlb3BhcmQgKFhjb2RlIDIuNS8zLjApLgorCis/Pz8/LT8/LT8/IC0gQWRkZWQgZXh0cmEgdGFyZ2V0cyBmb3IgYnVpbGRpbmcgZm9ybWFsIHJlbGVhc2VzIGFnYWluc3QgdGhlCisJMTAuMiBTREsgc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIG1vZGlmeWluZyB0aGUgc2V0dGluZ3MuCisKKz8/Pz8tPz8tPz8gLSBBZGRlZCBmYW5jeSBETUcgKGJhY2tncm91bmQgbG9nbykgc3VwcG9ydCB3aXRoIGF1dG9tYXRpb24uCisKKzIwMDYtMDUtMDkgLSBBZGRlZCBzaGVsbCBzY3JpcHQgcGhhc2UgdG8gZGVhbCB3aXRoIG5ldyBTRExfY29uZmlnLmggCisJYmVoYXZpb3IuIEVuY291bnRlcmVkIHdoYXQgc2VlbXMgdG8gYmUgYW4gWGNvZGUgYnVnIHdpdGggCisJbXVsdGlwbGUgZmlsZXMgb2YgdGhlIHNhbWUgbmFtZSwgZXZlbiB3aGVuIGNvbmRpdGlvbmFsIGNvbXBpbGluZworCWlzIGNvbnRyb2xsZWQgYnkgY3VzdG9tICNkZWZpbmVzIChTRExfc3lzbG9hZHNvLmMpLiBNdWx0aXBsZSBvcgorCXVuZGVmaW5lZCBzeW1ib2xzIGFyZSB0aGUgcmVzdWx0IG9mIHRoaXMuCisJUmVjb21tZW5kZWQgdGhhdCBtYWNvc3gvU0RMX3N5c2xvYWRzby5jIGJlIG1vZGlmaWVkIHRvIGRpcmVjdGx5IAorCWluY2x1ZGUgdGhlIGRsb3BlbiB2ZXJzaW9uIG9mIHRoZSBmaWxlIHZpYSAjaWZkZWYncyBzbyBvbmx5CisJb25lIHZlcnNpb24gbmVlZHMgdG8gZXhpc3QuIEZpbGVkIGEgZm9ybWFsIGJ1ZyByZXBvcnQgd2l0aCBBcHBsZSAKKwlhYm91dCB0aGlzICg0NTQyMzY5KS4KKworMjAwNi0wMy0yMiAtIGdjYyA0IHZpc2liaWxpdHkgZmVhdHVyZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBjb2RlIGJhc2Ugc28gSSAKKwllbmFibGVkIHRoZSBzd2l0Y2ggaW4gWGNvZGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuIEJlIGF3YXJlIHRoYXQgb25seQorCW91ciB4ODYgYnVpbGRzIHdpbGwgYmUgZXhwb3NlZCB0byB0aGlzIGZlYXR1cmUgYXMgd2Ugc3RpbGwgYnVpbGQgcHBjIAorCXdpdGggZ2NjIDMuMy4KKwkKKwlDaHJpc3RpYW4gV2FsdGhlciBoYXMgc2VudCBtZSBzb21lIGdyZWF0IGZlZWRiYWNrIG9uIHRoaW5ncyB0aGF0IGFyZSAKKwlicm9rZW4sIHNvIEkgaGF2ZSBtYWRlIHNvbWUgb2YgdGhlc2UgZml4ZXMuIEFtb25nIHRoZSBpc3N1ZXMgYXJlCisJY29tcGF0aWJpbGl0eSBhbmQgY3VycmVudCBsaWJyYXJ5IHZlcnNpb25zIGFyZSBub3Qgc2V0IHRvIDEgKGJyZWFrcworCWJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSwgZG9jdW1lbnRhdGlvbiBlcnJvcnMsIHJlc291cmNlIGNvcHlpbmcgCisJbG9jYXRpb24gcHJvYmxlbXMgZm9yIHRoZSBTRExUZXN0IGFwcHMsIG1pc3NpbmcgSEFWRV9PUEVOR0wgYW5kCisJT3BlbkdMLmZyYW1ld29yayBsaW5raW5nIGluIHRlc3RnbC4KKwkoRXJpYyBXaW5nKQorCisyMDA2LTAzLTE3IC0gQmVjYXVzZSB0aGUgWDExIGhlYWRlcnMgYXJlIG5vdCBpbnN0YWxsZWQgYnkgZGVmYXVsdCB3aXRoIFhjb2RlLAorCXdlIGRlY2lkZWQgdG8gb2ZmZXIgdHdvIHZhcmlhbnRzIG9mIHRoZSBzYW1lIHRhcmdldHMgKG9uZSB3aXRoIFgxMSBzdHVmZgorCWFuZCBvbmUgd2l0aG91dCkuIEJ5IGRlZmF1bHQsIHNpbmNlIHRoZSBYMTEgc3R1ZmYgZG9lcyBub3QgbmVjZXNzYXJpbHkgCisJY29uZmxpY3Qgd2l0aCB0aGUgbmF0aXZlIHN0dWZmLCB3ZSBidWlsZCB0aGUgbGlicmFyaWVzIHdpdGggdGhlIFgxMSBzdHVmZiAKKwlzbyBhZHZhbmNlZCBkZXZlbG9wZXJzIGNhbiBhY2Nlc3MgaXQgYnkgZGVmYXVsdC4gSG93ZXZlciwgaW4gdGhlIGNhc2UKKwl0aGF0IGEgZGV2ZWxvcGVyIGRpZCBub3QgaW5zdGFsbCBYMTEgKG9yIGp1c3QgZG9lc24ndCB3YW50IHRoZSBleHRyYSBibG9hdCksCisJdGhlIHVzZXIgbWF5IGRpcmVjdGx5IHNlbGVjdCB0aG9zZSB0YXJnZXRzIGFuZCBidWlsZCB0aG9zZSBpbnN0ZWFkLgorCQorCU9uY2UgYWdhaW4sIHdlIGFyZSBhdHRlbXB0aW5nIHRvIHJlbW92ZSB0aGUgZXhwb3J0ZWQgc3ltYm9scyBmaWxlLiBJZiAKKwlJIHJlY2FsbCBjb3JyZWN0bHksIHRoZSBjbGFzaGluZyBzeW1ib2wgcHJvYmxlbXMgd2UgZ290IHdlcmUgcmVsYXRlZAorCXRvIHRoZSBDRC1ST00gY29kZSB3aGljaCB3YXMgZm9ybWVybHkgaW4gQysrLiBOb3cgdGhhdCB0aGUgQysrIGNvZGUKKwloYXMgYmVlbiBwdXJnZWQsIHdlIGFyZSBzcGVjdWxhdGluZyB0aGF0IHdlIG1pZ2h0IGJlIGFibGUgdG8gcmVtb3ZlCisJdGhlIGV4cG9ydHMgZmlsZSBzYWZlbHkuIFRoZSBsb25nIHRlcm0gc29sdXRpb24gaXMgdG8gdXRpbGl6ZSBnY2MgNCdzCisJdmlzaWJpbGl0eSBmZWF0dXJlcy4KKworCUZvciB0aGUgZGV2ZWxvcGVyIGV4dHJhcyBwYWNrYWdlLCBJIGNoYW5nZWQgdGhlIHBhY2thZ2UgZm9ybWF0IAorCWZyb20gYSAucGtnIGJhc2VkIGluc3RhbGxlciB0byBhIC5kbWcgdG8gYXZvaWQgcmVxdWlyaW5nIAorCWFkbWluaXN0cmF0b3Ivcm9vdCB0byBhY2Nlc3MgY29udGVudHMsIGZvciBiZXR0ZXIgCisJdHJhbnNwYXJlbmN5LCBhbmQgdG8gYWxsb3cgdXNlcnMgdG8gbW9yZSBlYXNpbHkgY29udHJvbCB3aGljaCBjb21wb25lbnRzIAorCXRoZXkgYWN0dWFsbHkgd2FudCB0byBpbnN0YWxsLgorCUkgYWxzbyBtYWRlIGNoYW5nZXMgYW5kIHVwZGF0ZXMgdG8gdGhlIFBCL1hjb2RlIHByb2plY3QgdGVtcGxhdGVzIChzZWUgRGV2ZWxvcGVyIFJlYWRNZSkuCisJKEVyaWMgV2luZykKKworMjAwNi0wMy0wNyAtIFRoZSBlbnRpcmUgY29kZSBiYXNlIGhhcyBiZWVuIHJlb3JnYW5pemVkIGFuZCBwbGF0Zm9ybSBzcGVjaWZpYyAKKwlkZWZpbmVzIGhhdmUgYmVlbiBwdXNoZWQgaW50byBoZWFkZXIgZmlsZXMgKFNETF9jb25maWdfKi5oKS4gVGhpcyBtZWFucyAKKwl0aGF0IGRlZmluZXMgdGhhdCBwcmV2aW91c2x5IGhhZCB0byBiZSBkZWZpbmVkIGluIHRoZSBYY29kZSBwcm9qZWN0cyBjYW4gCisJYmUgcmVtb3ZlZCAod2hpY2ggSSBoYXZlIHN0YXJ0ZWQgZG9pbmcpLiBGdXJ0aGVybW9yZSwgaXQgYXBwZWFycyB0aGF0IHRoZSAKKwlNTVgvU1NFIGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuIGFuZCByZWZhY3RvcmVkIHNvIGl0IG5vdyBjb21waWxlcyB3aXRob3V0IAorCW5hc20gYW5kIHdpdGhvdXQgbWFraW5nIHVzIGRvIHN0cmFuZ2UgdGhpbmdzIHRvIHN1cHBvcnQgT1MgWC4gSG93ZXZlciwgdGhpcyAKKwlYY29kZSBwcm9qZWN0IHN0aWxsIGVtcGxveXMgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGJ1aWxkIG9wdGlvbnMgaW4gb3JkZXIgdG8gCisJYWNoaWV2ZSB0aGUgbWFuZGF0ZWQgMTAuMiBjb21wYXRpYmlsaXR5LiBBcyBhIHJlc3VsdCBvZiB0aGUgY29kZSBiYXNlIGNoYW5nZXMsIAorCXRoZXJlIGFyZSBuZXcgcHVibGljIGhlYWRlcnMuIEJ1dCBhbHNvIGFzIGEgcmVzdWx0IG9mIHRoZXNlIGNoYW5nZXMsIHRoZXJlIGFyZSAKKwlhbHNvIG5ldyBoZWFkZXJzIHRoYXQgcXVhbGlmeSBhcyAiUHJpdmF0ZUhlYWRlcnMiLiBQcml2YXRlIEhlYWRlcnMgYXJlIGhlYWRlcnMgCisJdGhhdCBtdXN0IGJlIGV4cG9ydGVkIGJlY2F1c2UgYSBwdWJsaWMgaGVhZGVyIGluY2x1ZGVzIHRoZW0sIGJ1dCB1c2VycyBzaG91bGRuJ3QgCisJZGlyZWN0bHkgaW52b2tlIHRoZXNlLiBTRExfY29uZmlnX21hY29zeC5oIGFuZCBTRExfY29uZmlnX2RyZWFtY2FzdC5oIGFyZSAKKwlleGFtcGxlcyBvZiB0aGlzLiBXZSBoYXZlIGNvbnNpZGVyZWQgbWFya2luZyB0aGVzZSBoZWFkZXJzIGFzIFByaXZhdGUsIGJ1dCBpdCAKKwlyZXF1aXJlcyB0aGF0IHRoZSBwdWJsaWMgaGVhZGVycyBpbnZva2UgdGhlbSB2aWEgZnJhbWV3b3JrIGNvbnZlbnRpb25zLCBpLmUuCisJI2luY2x1ZGUgPEZyYW1ld29ya05hbWUvSGVhZGVyLmg+CisJZS5nLgorCSNpbmNsdWRlIDxTREwvU0RMX2NvbmZpZ19tYWNvc3guaD4KKwlhbmQgbm90CisJI2luY2x1ZGUgIlNETF9jb25maWdfbWFjb3N4LmgiCisJSG93ZXZlciB0aGlzIGltcG9zZXMgdGhlIHJlc3RyaWN0aW9uIHRoYXQgbm9uLWZyYW1ld29yayBkaXN0cmlidXRpb25zIG11c3QKKwkgcGxhY2UgdGhlaXIgaGVhZGVycyBpbiBhIGRpcmVjdG9yeSBjYWxsZWQgU0RMLyAoYW5kIG5vdCBTREwxMS8gbGlrZSBGcmVlQlNEKS4gCisJIEN1cnJlbnRseSwgSSBkbyBub3QgYmVsaWV2ZSB0aGlzIHdvdWxkIHBvc2UgYSBwcm9ibGVtIGZvciBhbnkgb2YgdGhlIGN1cnJlbnQgCisJIGRpc3RyaWJ1dGlvbnMgKEZpbmssIERhcndpblBvcnRzKS4gT3IgYWx0ZXJuYXRpdmVseSwgdXNlcnMgY291bGQgYmUgCisJIGV4cGVjdGVkL2ZvcmNlZCB0byBhbHNvIGluY2x1ZGUgdGhlIGhlYWRlciBwYXRoOiAKKwkgLUkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvUHJpdmF0ZUhlYWRlcnMsIAorCSBidXQgbW9zdCBwZW9wbGUgd291bGQgcHJvYmFibHkgbm90IHJlYWQgdGhlIGRvY3VtZW50YXRpb24gb24gdGhpcy4gCisJIEJ1dCBjdXJyZW50bHksIHdlIGhhdmUgZGVjaWRlZCB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIGhhdmUgb3B0ZWQgbm90IHRvIAorCSB1c2UgdGhlIFByaXZhdGVIZWFkZXJzIGZlYXR1cmUuCisJKEVyaWMgV2luZykKKworMjAwNi0wMS0zMSAtIFVwZGF0ZXMgdG8gYnVpbGQgVW5pdmVyc2FsIEJpbmFyaWVzIHdoaWxlIHJldGFpbmluZyAxMC4yIGNvbXBhdGliaWxpdHkuIAorCVdlIHdlcmUgdW5hYmxlIHRvIGdldCBNTVgvU1NFIHN1cHBvcnQgZW5hYmxlZC4gSXQgaXMgYmVsaWV2ZWQgdGhhdCBhIHJld3JpdGUgb2YgCisJdGhlIGFzc2VtYmx5IGNvZGUgd2lsbCBiZSBuZWNlc3NhcnkgdG8gbWFrZSBpdCBwb3NpdGlvbiBpbmRlcGVuZGVudCBhbmQgbm90IAorCXJlcXVpcmUgbmFzbS4gQWx0aXZlYyBoYXMgZmluYWxseSBiZWVuIGVuYWJsZWQgZm9yIFBQQy4gKEVyaWMgV2luZykKKworMjAwNS0wOS0/PyAtIEhhZCB0byBhZGQgYmFjayB0aGUgZXhwb3J0cyBmaWxlIGJlY2F1c2UgaXQgd2FzIGNhdXNpbmcgYnVpbGQgcHJvYmxlbXMKKwlmb3Igc29tZSBjYXNlcy4gKEVyaWMgV2luZykKKworMjAwNS0wOC0yMSAtIEZpcnN0IGVudHJ5IGluIGhpc3RvcnkuIFVwZGF0ZWQgZm9yIFNETCAxLjIuOSBhbmQgWGNvZGUgMi4xLiBHZXR0aW5nIAorCXJlYWR5IGZvciBVbml2ZXJzYWwgQmluYXJpZXMuIFJlbW92ZWQgdGhlIC5wa2cgc3lzdGVtIGZvciAuZG1nIGZvciBkdWUgdG8gcHJvYmxlbXMgCisJd2l0aCBicm9rZW4gcGFja2FnZXMgaW4gdGhlIHBhc3Qgc2V2ZXJhbCBTREwgcG9pbnQgcmVsZWFzZXMuIFJlbW92ZWQgdXNhZ2Ugb2YgU0RMIAorCWV4cG9ydHMgZmlsZSBiZWNhdXNlIGl0IGhhcyBiZWNvbWUgYW5vdGhlciBwb2ludCBvZiBmYWlsdXJlLiBJbnRyb2R1Y2VkIG5ldyBkb2N1bWVudGF0aW9uIAorCWFib3V0IFNETE1haW4gYW5kIGhvdyB0byBjb21waWxlIGluIGFuIGRldmVsLWxpdGUgc2VjdGlvbiBvZiB0aGUgU0RMLmRtZy4gKEVyaWMgV2luZykKKworQmVmb3JlIGhpc3Rvcnk6CitTREwgMS4yLjY/IHRvIDEuMi44CitTdGFydGVkIHVwZGF0aW5nIFByb2plY3QgQnVpbGRlciBwcm9qZWN0cyB0byBYY29kZSBmb3IgUGFudGhlciBhbmQgVGlnZXIuIEFsc28gcmVtb3ZlZCAKK3RoZSBzeXN0ZW0gdGhhdCBzcGxpdCB0aGUgc2luZ2xlIGZyYW1ld29yayBpbnRvIHNlcGFyYXRlIHJ1bnRpbWUgYW5kIGhlYWRlcnMgZnJhbWV3b3Jrcy4gCitUaGlzIGlzIGFnYWluc3QgQXBwbGUgY29udmVudGlvbnMgYW5kIGNhdXNlcyBwcm9ibGVtcyBvbiBtdWx0aXVzZXIgc3lzdGVtcy4gCitXZSBub3cgZGlzdHJpYnV0ZSBhIHNpbmdsZSBmcmFtZXdvcmsuCitUaGUgLnBrZyBzeXN0ZW0gaGFzIHJlcGVhdGVkbHkgYmVlbiBicm9rZW4gd2l0aCBldmVyeSBuZXcgcmVsZWFzZSBvZiBPUyBYLiAKK1dpdGggMS4yLjgsIHN0YXJ0ZWQgbWlncmF0aW5nIHN0dWZmIHRvIC5kbWcgYmFzZWQgc3lzdGVtIHRvIHNpbXBsaWZ5IGRpc3RyaWJ1dGlvbiBwcm9jZXNzLiAKK1RyaWVkIHVwZGF0aW5nIHRoZSBleHBvcnRzIGZpbGUgYW5kIFBlcmwgc2NyaXB0IGdlbmVyYXRpb24gc3lzdGVtIGZvciBjaGFuZ2luZyBzeW50YXguIChFcmljIFdpbmcpCisKK1ByZS1TREwgMS4yLjYgCitDcmVhdGVkIFByb2plY3QgQnVpbGRlciBwcm9qZWN0cyBmb3IgU0RMIGFuZCAucGtnIGJhc2VkIGRpc3RyaWJ1dGlvbiBzeXN0ZW0uIChEYXJyZWxsIFdhbGlzc2VyKQorCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1JlYWRNZURldkxpdGUudHh0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETC9wa2ctc3VwcG9ydC9yZXNvdXJjZXMvUmVhZE1lRGV2TGl0ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjZDc5MwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1JlYWRNZURldkxpdGUudHh0CkBAIC0wLDAgKzEsMTIgQEAKK1RoaXMgZGlyZWN0b3J5IGlzIGZvciBkZXZlbG9wZXJzLiBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBzb21lIGJhc2ljIGVzc2VudGlhbHMgeW91IHdpbGwgbmVlZCBmb3IgZGV2ZWxvcGluZyBTREwgYmFzZWQgYXBwbGljYXRpb25zIG9uIE9TIFguIFRoZSBTREwtZGV2ZWwgcGFja2FnZSBjb250YWlucyBhbGwgb2YgdGhpcyBzdHVmZiBwbHVzIG1vcmUsIHNvIHlvdSBjYW4gaWdub3JlIHRoaXMgaWYgeW91IGluc3RhbGwgdGhlIFNETC1kZXZlbC5wa2cuIFRoZSBTREwtZGV2ZWwgcGFja2FnZSBjb250YWlucyBYY29kZSB0ZW1wbGF0ZXMsIFNETCBkb2N1bWVudGF0aW9uLCBhbmQgZGlmZmVyZW50IHZhcmlhdGlvbnMgb2YgU0RMbWFpbiBhbmQgTklCIGZpbGVzIGZvciBTREwuCisKK1RvIGNvbXBpbGUgYW4gU0RMIGJhc2VkIGFwcGxpY2F0aW9uIG9uIE9TIFgsIFNETE1haW4ubSBtdXN0IGJlIGNvbXBpbGVkIGludG8geW91ciBwcm9ncmFtLiAoU2VlIHRoZSBTREwgRkFRKS4gVGhlIFNETC1kZXZlbC5wa2cgaW5jbHVkZXMgWGNvZGUgdGVtcGxhdGVzIHdoaWNoIGFscmVhZHkgZG8gdGhpcyBmb3IgeW91LiBCdXQgZm9yIHRob3NlIHdobyBtYXkgbm90IHdhbnQgdG8gaW5zdGFsbCB0aGUgZGV2IHBhY2thZ2UsIGFuIFNETE1haW4gaXMgcHJvdmlkZWQgaGVyZSBhcyBhIGNvbnZlbmllbmNlLiBCZSBhd2FyZSB0aGF0IHRoZXJlIGFyZSBkaWZmZXJlbnQgdmFyaWF0aW9ucyBvZiBTRExNYWluLm0gZGVwZW5kaW5nIG9uIHdoYXQgY2xhc3Mgb2YgU0RMIGFwcGxpY2F0aW9uIHlvdSBtYWtlIGFuZCB0aGV5IGFyZSBpbnRlbmRlZCB0byB3b3JrIHdpdGggTklCIGZpbGVzLiBPbmx5IG9uZSBTRExNYWluIHZhcmlhbnQgaXMgcHJvdmlkZWQgaGVyZSBhbmQgd2l0aG91dCBhbnkgTklCIGZpbGVzLiBZb3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFNETC1kZXZlbCBwYWNrYWdlIGZvciB0aGUgb3RoZXJzLiBXZSBjdXJyZW50bHkgZG8gbm90IHByb3ZpZGUgYSBTRExNYWluLmEgZmlsZSwgcGFydGx5IHRvIGNhbGwgdG8gYXR0ZW50aW9uIHRoYXQgdGhlcmUgYXJlIGRpZmZlcmVudCB2YXJpYXRpb25zIG9mIFNETG1haW4uCisKK1RvIGJ1aWxkIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91ciBnY2MgbGluZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKKworZ2NjIC1JL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMgTXlQcm9ncmFtLmMgU0RMbWFpbi5tIC1mcmFtZXdvcmsgU0RMIC1mcmFtZXdvcmsgQ29jb2EKKworQW4gU0RML09wZW5HTCBiYXNlZCBhcHBsaWNhdGlvbiBtaWdodCBsb29rIGxpa2U6CisKK2djYyAtSS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIC1JL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvT3BlbkdMLmZyYW1ld29yay9IZWFkZXJzIE15UHJvZ3JhbS5jIFNETG1haW4ubSAtZnJhbWV3b3JrIFNETCAtZnJhbWV3b3JrIENvY29hIC1mcmFtZXdvcmsgT3BlbkdMCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1NETF9EU19TdG9yZSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1NETF9EU19TdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTVhNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETC9wa2ctc3VwcG9ydC9yZXNvdXJjZXMvU0RMX0RTX1N0b3JlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1VuaXZlcnNhbEJpbmFyeU5vdGVzLnJ0ZiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvcmVzb3VyY2VzL1VuaXZlcnNhbEJpbmFyeU5vdGVzLnJ0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTg1ZWNiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETC9wa2ctc3VwcG9ydC9yZXNvdXJjZXMvVW5pdmVyc2FsQmluYXJ5Tm90ZXMucnRmCkBAIC0wLDAgKzEsMTUwIEBACit7XHJ0ZjFcYW5zaVxhbnNpY3BnMTI1Mlxjb2NvYXJ0ZjEwMzhcY29jb2FzdWJydGYxMTAKK3tcZm9udHRibFxmMFxmc3dpc3NcZmNoYXJzZXQwIEhlbHZldGljYTtcZjFcZm5pbFxmY2hhcnNldDAgTHVjaWRhR3JhbmRlO1xmMlxmbW9kZXJuXGZjaGFyc2V0MCBDb3VyaWVyLU9ibGlxdWU7Cit9Cit7XGNvbG9ydGJsO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTI1NTt9Cit7XCpcbGlzdHRhYmxle1xsaXN0XGxpc3R0ZW1wbGF0ZWlkMVxsaXN0aHlicmlke1xsaXN0bGV2ZWxcbGV2ZWxuZmMyM1xsZXZlbG5mY24yM1xsZXZlbGpjMFxsZXZlbGpjbjBcbGV2ZWxmb2xsb3cwXGxldmVsc3RhcnRhdDFcbGV2ZWxzcGFjZTM2MFxsZXZlbGluZGVudDB7XCpcbGV2ZWxtYXJrZXIgXHtkaXNjXH19e1xsZXZlbHRleHRcbGV2ZWx0ZW1wbGF0ZWlkMVwnMDFcdWMwXHU4MjI2IDt9e1xsZXZlbG51bWJlcnM7fVxmaS0zNjBcbGk3MjBcbGluNzIwIH17XGxpc3RuYW1lIDt9XGxpc3RpZDF9fQore1wqXGxpc3RvdmVycmlkZXRhYmxle1xsaXN0b3ZlcnJpZGVcbGlzdGlkMVxsaXN0b3ZlcnJpZGVjb3VudDBcbHMxfX0KK1xwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccWxccW5hdHVyYWxccGFyZGlybmF0dXJhbAorCitcZjBcYlxmczI0IFxjZjAgNjQtYml0IFVuaXZlcnNhbCBCaW5hcnkgTm90ZXM6XAorCitcYjAgXAorU0RMIDEuMi4xNCBpcyBvdXIgZmlyc3QgcmVsZWFzZSB3aXRoIFNub3cgTGVvcGFyZCBvbiB0aGUgbWFya2V0LiBJbiBvcmRlciB0byBtYWtlIFNETCBjb21waWxlIGFuZCBydW4gaW4gNjQtYml0LCB3ZSBoYWQgdG8gcmVtb3ZlIGNvZGUgdGhhdCBkZXBlbmRlZCBvbiBkZXByZWNhdGVkIE1hYyBBUElzIGFuZCBtb3ZlIG92ZXIgdG8gbW9yZSBtb2Rlcm4gTWFjIEFQSXMuXAorXAorSW4gYWRkaXRpb24sIEFwcGxlIGhhcyBzdG9wcGVkIHNoaXBwaW5nIGdjYyAzLjMgYW5kIHRoZSAxMC4zIFNESy5cCitcCitCZWNhdXNlIG9mIGFsbCB0aGVzZSBjb21iaW5lZCBmYWN0b3JzLCB3ZSBoYXZlIG1hZGUgdGhlIGRlY2lzaW9uIHRvIG1ha2UgTWFjIE9TIFggMTAuNCB0aGUgbmV3IG1pbmltdW0gcmVxdWlyZW1lbnQgZm9yIFNETC5cCitcCitPdXIgb2ZmaWNpYWwgU0RMLmZyYW1ld29yayBpcyBjb21waWxlZCBhcyBhIDMtd2F5IFVuaXZlcnNhbCBCaW5hcnkgKDY0LWJpdCBJbnRlbCwgMzItYml0IEludGVsLCAzMi1iaXQgUG93ZXJQQy4pXAorXAorQ2VydGFpbiBBUElzIHRoYXQgU0RMIHJlbGllcyBvbiB3ZXJlIG5vdCBtYWRlIDY0LWJpdCByZWFkeSBieSBBcHBsZSB1bnRpbCAxMC42LiBUaGlzIG1lYW5zIGV2ZW4gdGhvdWdoIDEwLjUgaGFkIHByZWxpbWluYXJ5IDY0LWJpdCBzdXBwb3J0LCBTREwgd2lsbCBub3QgY29tcGlsZSBvciBydW4gY29ycmVjdGx5IGluIDY0LWJpdCBtb2RlIG9uIDEwLjUuIFNvIHRoZXJlIGFyZSB0d28gZmFsbG91dCBpdGVtcyBmcm9tIHRoaXMuXAorXAorRmlyc3QsIHlvdSBjYW4gb25seSBjb21waWxlIDY0LWJpdCBjb2RlIG9uIFNub3cgTGVvcGFyZCBvciBncmVhdGVyICh3aGljaCByZW1vdmVzIHRoZSBwb3NzaWJpbGl0eSBvZiA2NC1iaXQgUG93ZXJQQykuIFwKK1wKK1NlY29uZCwgdGhpcyBwcmVzZW50cyBhIGNvcm5lci1jYXNlIHdoZXJlIGlmIHlvdSBoYXZlIGEgNjQtYml0IEludGVsIGV4ZWN1dGFibGUgaW4geW91ciBVbml2ZXJzYWwgYmluYXJ5IGFuZCB0cnkgdG8gcnVuIG9uIDEwLjUgb24gYW4gNjQtYml0IEludGVsIE1hYywgaXQgd2lsbCBsYXVuY2ggYW5kIGNyYXNoLiBUbyBmb3JjZSAxMC41IHRvIHVzZSB0aGUgMzItYml0IHZlcnNpb24gaW5zdGVhZCBvZiB0aGUgNjQtYml0LCB5b3Ugc2hvdWxkIHNldCB0aGUgTGF1bmNoU2VydmljZXMga2V5LCBMU01pbmltdW1TeXN0ZW1WZXJzaW9uQnlBcmNoaXRlY3R1cmUsIGluIHlvdXIgYXBwbGljYXRpb24ncyBJbmZvLnBsaXN0LiBPdXIgU0RML1hjb2RlIHRlbXBsYXRlcyBmb3IgU25vdyBMZW9wYXJkIGFscmVhZHkgc2V0IHRoaXMgdXAgZm9yIHlvdS5cCitcCitcCitPbmUgYWRkaXRpb25hbCBmYWxsb3V0IGl0ZW0gaXMgd2UgaGFkIHRvIHJlbW92ZSB0aGUgU0RMIEN1c3RvbSBDb2NvYSBYY29kZSB0ZW1wbGF0ZSBwcm9qZWN0LiBJdCBkZXBlbmRlZCBvbiBOU1F1aWNrVGltZVZpZXcgd2hpY2ggd2FzIGRlcHJlY2F0ZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgU0RMIGNvZGViYXNlLiBJdCBtYXkgc3RpbGwgYmUgcG9zc2libGUgdG8gcmVjcmVhdGUgdGhlIGJlaGF2aW9yIHRoYXQgdGhpcyB0ZW1wbGF0ZSBkZW1vbnN0cmF0ZWQsIGJ1dCB3ZSB3b3VsZCBuZWVkIGEgdm9sdW50ZWVyIHRvIGludmVzdGlnYXRlIHRoaXMuXAorXAorXAorXAorSW4gYWRkaXRpb24sIHRoZSBTREwgc2F0ZWxsaXRlIHByb2plY3RzIHdlcmUgYWZmZWN0ZWQgYnkgdGhlIDY0LWJpdCB0cmFuc2l0aW9uLlwKK1wKKy0gU0RMX21peGVyIGRlcGVuZGVkIG9uIGxlZ2FjeSBRdWlja3RpbWUgZm9yIG1pZGkgcGxheWJhY2sgc3VwcG9ydC4gV2UgaGFkIHRvIGRpc2FibGUgbWlkaS4gKFJlY2FsbCB0aGF0IHdlIGFsc28gZGlzYWJsZWQgTVAzIHN1cHBvcnQgYXdoaWxlIGJhY2sgYmVjYXVzZSB3ZSBuZXZlciBnb3QgU01QRUcgd29ya2luZyBkdXJpbmcgdGhlIFRpZ2VyL0ludGVsIHRyYW5zaXRpb24uKSBUbyBmaXggdGhpcywgd2Ugd291bGQgbmVlZCBhIG5hdGl2ZSBDb3JlIEF1ZGlvIGJhY2tlbmQgZm9yIFNETF9taXhlci5cCitcCistIFNpbmNlIHdlIGhhdmUgY2hhbmdlZCB0aGUgYmFzZWxpbmUgdG8gMTAuNCwgd2UgdG9vayB0aGlzIG9wcG9ydHVuaXR5IHRvIHN3aXRjaCBTRExfaW1hZ2Ugb3ZlciB0byBhIG5ldyBuYXRpdmUgSW1hZ2VJTyBiYXNlZCBiYWNrZW5kLiBUaGlzIG1ha2VzIHRoZSBiaW5hcnkgYWJvdXQgMTB4IHNtYWxsZXIsIGdyZWF0bHkgc2ltcGxpZmllcyBvdXIgbWFpbnRlbmFuY2UgcmVxdWlyZW1lbnRzIGFuZCBidWlsZCBwcm9jZXNzIGFzIHdlIG5vIGxvbmdlciBoYXZlIHRvIG1haW50YWluIGJ1aWxkIHN5c3RlbXMgZm9yIDNyZCBwYXJ0eSBkZXBlbmRlbmNpZXMsIGFuZCBnaXZlcyB1cyBhY2Nlc3MgdG8gbW9yZSBpbWFnZSBmb3JtYXRzLlwKK1wKKy0gVGhlIHN0YXRpYyBsaWJyYXJ5IHRhcmdldCBmb3IgU0RMX3R0ZiBubyBsb25nZXIgd29ya3MgYmVjYXVzZSB3ZSBubyBsb25nZXIgaGF2ZSBhY2Nlc3MgdG8gYSBsaWJmcmVldHlwZS5hLiBXZSBoYXZlIGJlZW4gcmVseWluZyBvbiBBcHBsZSdzIHN1cHBsaWVkIGxpYmZyZWV0eXBlLmEsIGJ1dCB0aGV5IHN0b3BwZWQgc2hpcHBpbmcgYSBzdGF0aWMgdmVyc2lvbiBzdGFydGluZyBpbiAxMC41IHdoaWNoIG1lYW5zIHdlIGhhdmUgbm8gc3RhdGljIDY0LWJpdCB2ZXJzaW9uLiBCdXQgc2luY2UgMTAuNCBpcyBvdXIgbmV3IGJhc2VsaW5lLCBhbGwgdGhlc2Ugc3lzdGVtcyBzaG91bGQgaGF2ZSBsaWJmcmVldHlwZS5keWxpYiBpbnN0YWxsZWQsIHNvIGl0IHNob3VsZG4ndCBiZSBtdWNoIG9mIGEgcHJvYmxlbSB0byB1c2UgU0RMX3R0ZiBhcyBhIGR5bmFtaWMgbGlicmFyeSB3aGljaCBkeW5hbWljYWxseSBsaW5rcyB0byBsaWJmcmVldHlwZS5cCitcCitcCistRXJpYyBXaW5nIDIwMDktMDktMjNcCisKK1xiIFwKK1wKK1wKK1wKK1VuaXZlcnNhbCBCaW5hcnkgTm90ZXM6IChoaXN0b3JpY2FsLCBzb21ld2hhdCBvYnNvbGV0ZSlcCisKK1xiMCBcCitCZWxvdyBpcyBhbiBvdmVydmlldyBvZiB3aGF0IHdlIGhhZCB0byBkbyB0byBidWlsZCBVbml2ZXJzYWwgQmluYXJpZXMgZm9yIFNETCAoYW5kIHNhdGVsbGl0ZXMpLiBUaGUgZG9jdW1lbnQgaXMgcHJvdmlkZWQgdG8gaGVscCBvdGhlcnMgdW5kZXJzdGFuZCB3aGF0IHRoZSBoZWNrIHdlIGhhZCB0byBkbyB0byBnZXQgdGhpcyB0byB3b3JrIHNvIHRoZXkga25vdyAoYW5kIGRvbid0IGJyZWFrKSBhbnkgc2V0dGluZ3Mgd2UgaGF2ZSBzZXQgdG8gYWNjb21wbGlzaCB0aGlzLiBJdCBhbHNvIGRlc2NyaWJlcyBhcmVhcyBvZiBwcm9ibGVtcyBmb3IgdGhvc2Ugd2hvIG1pZ2h0IGF0dGVtcHQgdG8gZml4IHRoZW0gYWZ0ZXIgdXMuXAorXAorXAorSXQgdHVybnMgb3V0IHRoYXQgZGV2ZWxvcGluZyBhIFVuaXZlcnNhbCBCaW5hcnkgZm9yIFNETCB3YXMgYSBwYWluZnVsIHByb2Nlc3MsIGJ1dCBub3QgZm9yIHRoZSB0eXBpY2FsIHJlYXNvbnMgYWZmZWN0aW5nIG1vc3Qgb3RoZXIgZGV2ZWxvcGVycy4gU0RMIGlzIGFscmVhZHkgcGxhdGZvcm0gY2xlYW4gYW5kIGhhcyBhbiBYY29kZSBwcm9qZWN0IHdoaWNoIGFyZSB1c3VhbGx5IHRoZSB0d28gYmlnZ2VzdCBvYnN0YWNsZXMuIChUaGUgb25seSByZWFsIGNvZGUgYnVnIHdlIGhhZCB0byBmaXggd2FzIGluIFNETF9taXhlciwgYnV0IHRoYXQgd2FzIGR1ZSB0byBhIFF1aWNrdGltZSBpc3N1ZSBzbyB3ZSBjYW4gYmxhbWUgdGhlIFF1aWNrdGltZSBhdXRob3JzLilcCitcCitCdXQgZGV2ZWxvcGluZyBhIFVuaXZlcnNhbCBCaW5hcnkgd2FzIHBhaW5mdWwgdG8gdXMgZm9yIHNldmVyYWwgcmVhc29uczpcCitcCitccGFyZFx0eDIyMFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXGxpNzIwXGZpLTcyMFxxbFxxbmF0dXJhbFxwYXJkaXJuYXR1cmFsCitcbHMxXGlsdmwwXGNmMCB7XGxpc3R0ZXh0CVwnOTUJfVNETCBtdXN0IHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGggMTAuMiAoSmFndWFyKVwKK1wKK3tcbGlzdHRleHQJXCc5NQl9U0RMIGhhcyBwcm9jZXNzb3Igc3BlY2lmaWMgb3B0aW1pemF0aW9ucyAoQWx0aXZlYywgTU1YL1NTRSlcCitcCit7XGxpc3R0ZXh0CVwnOTUJfVRoZSBTREwgc2F0ZWxsaXRlcyAoU0RMX21peGVyLCBTRExfaW1hZ2UsIFNETF90dGYpIGhhdmUgM3JkIHBhcnR5IGRlcGVuZGVuY2llcyAgd2hpY2ggd2UgY3VycmVudGx5IHN0YXRpY2FsbHkgbGluayBhZ2FpbnN0LiBBbGwgb2YgdGhlc2UgZGVwZW5kZW5jaWVzIG5lZWRlZCB0byBiZSB1cGRhdGVkL3JlY29tcGlsZWQgd2l0aCB0aGUgc2FtZSBhYm92ZSBjb25zdHJhaW50cy5cCitccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXHFsXHFuYXR1cmFsXHBhcmRpcm5hdHVyYWwKK1xjZjAgXAorRm9yIHJldGFpbmluZyBjb21wYXRpYmlsaXR5IHdpdGggMTAuMiwgd2UgaGF2ZSBleHBlcmltZW50YWxseSBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIHVzZSBnY2MgNC4wLnggdG8gY29tcGlsZSBhIGJpbmFyeSB0aGF0IHdvcmtzIHVuZGVyIEphZ3Vhci4gV2l0aCB0aGUgZ2NjIDQuMCB0aGF0IHNoaXBwZWQgaW4gWGNvZGUgMi4xLCBsaWJnY2NfcyB3YXMgYXV0b21hdGljYWxseSBsaW5rZWQgYWdhaW5zdC4gVGhpcyBsaWJyYXJ5IGRvZXMgbm90IGV4aXN0IG9uIHN5c3RlbXMgcHJpb3IgdG8gMTAuMy45LiBBZnRlciBmaWxpbmcgYSBidWcgcmVwb3J0LCBBcHBsZSByZW1vdmVkIHRoaXMgYXV0b21hdGljIGxpbmtpbmcgaW4gZ2NjIDQuMC4xIHdoaWNoIHNoaXBwZWQgd2l0aCBYY29kZSAyLjIsIGJ1dCB3ZSBkaXNjb3ZlcmVkIHRoYXQgd2Ugc3VmZmVyZWQgZnJvbSB1bmRlZmluZWQgc3ltYm9scyB0byB0aGluZ3MgaW4gdGhlIHByaW50ZiBmYW1pbHkgbGlicmFyeS4gKFRoZXkgc2VlbSB0byBiZSBuZXcgc3ltYm9scyByZWxhdGVkIHRvIHByaW50aW5nIGxvbmcgZG91YmxlcywgZXRjLilcCitcCitTbyB0byBhY2NvbXBsaXNoIG91ciBjb21wYXRpYmlsaXR5IGdvYWxzLCB3ZSBoYWQgdG8gZmluZCBhbmQgZXhwbG9pdCBzb21lIGxlc3NlciBrbm93biBmZWF0dXJlcyBvZiBYY29kZSB0aGF0IGFsbG93IHVzIHRvIHNwZWNpZnkgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGJ1aWxkIGZsYWdzIGZvdW5kIGhlcmU6XAorXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxxbFxxbmF0dXJhbFxwYXJkaXJuYXR1cmFsCit7XGZpZWxke1wqXGZsZGluc3R7SFlQRVJMSU5LICJodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL0RldmVsb3BlclRvb2xzL0NvbmNlcHR1YWwvWGNvZGVVc2VyR3VpZGUvQ29udGVudHMvUmVzb3VyY2VzL2VuLmxwcm9qLzA1XzA3X2JzX2J1aWxkaW5nX3Byb2R1Y3QvY2hhcHRlcl8zM19zZWN0aW9uXzYuaHRtbCMvL2FwcGxlX3JlZi9kb2MvdWlkL1RQNDAwMDI2OTMtU1czIn19e1xmbGRyc2x0IFxjZjAgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9EZXZlbG9wZXJUb29scy9Db25jZXB0dWFsL1hjb2RlVXNlckd1aWRlL0NvbnRlbnRzL1Jlc291cmNlcy9lbi5scHJvai8wNV8wN19ic19idWlsZGluZ19wcm9kdWN0L2NoYXB0ZXJfMzNfc2VjdGlvbl82Lmh0bWwjLy9hcHBsZV9yZWYvZG9jL3VpZC9UUDQwMDAyNjkzLVNXM319XAorXAorVGhlIGZpcnN0IGFuZCBtb3N0IGltcG9ydGFudCBvZiB0aGVzZSBpcyB0aGUgCitcZjEgR0NDX1ZFUlNJT04gZmxhZyB3aGljaCBsZXRzIHVzIHNldCBnY2MgMy4zIGZvciBQb3dlclBDIGFuZCBnY2MgNC4wIGZvciBJbnRlbC5cCitcCitCdXQgd2UgYWxzbyBuZWVkZWQgdG8gdmVyaWZ5IG90aGVyIG9wdGlvbnMgc3VjaCBhcyB0aGUgZGVwbG95bWVudCB0YXJnZXQgYW5kIFNESy4gRXhwZXJpbWVudGFsbHksIHdlIGZvdW5kIHRoYXQgdGhlIERlcGxveW1lbnQgdGFyZ2V0IGRpZCB2ZXJ5IGxpdHRsZSBmb3IgdXMgZXhjZXB0IHJldGFpbiBwcmViaW5kaW5nLiBTZXR0aW5nIGl0IHRvIGFueXRoaW5nIGxlc3MgdGhhbiAxMC40IGFsbG93cyBmb3IgcHJlYmluZGluZyB0byByZW1haW4gYWN0aXZlLlwKK1wKK0ZvciB0aGUgU0RLJ3MsIHdlIGZvdW5kIHRoYXQgQXBwbGUgZG9lcyBsaW5rIGFnYWluc3QgZGlmZmVyZW50IHZlcnNpb25zIG9mIHN5c3RlbSBjb21wb25lbnRzLiBCdXQgZXhwZXJpbWVudGFsbHksIHdlIGRpc2NvdmVyZWQgd2UgY291bGQgc3RpbGwgbGluayB0byB0aGUgMTAuNHUgU0RLIGFuZCB0aGluZ3Mgd291bGQgc3RpbGwgd29yayBvbiBKYWd1YXIuIElkZWFsbHkgd2Ugc2hvdWxkIHByb2JhYmx5IGxpbmsgdG8gdGhlIDEwLjIuOCBTREsgZm9yIFBvd2VyUEMuIEJ1dCBpbiByZWFsaXR5LCBtb3N0IHBlb3BsZSBkb24ndCBpbnN0YWxsIHRoZSAxMC4yLjggU0RLIG9uIHRoZWlyIHN5c3RlbSAoaXQgaXMgbm90IGEgZGVmYXVsdCBjb21wb25lbnQpIHNvIHdlIGRpZG4ndCB3YW50IHRvIGNvbmZ1c2UgcGVvcGxlIGFzIHNldHRpbmcgdGhpcyB3b3VsZCBsaWtlbHkgY2F1c2UgcGVvcGxlJ3MgY29tcGlsZSB0byBmYWlsIHRoZSBmaXJzdCB0aW1lIHRoZXkgdHJ5IGFuZCB0aGV5IHdvdWxkIGhhdmUgdG8gdW5kZXJzdGFuZCB0aGUgcmVhc29uIGZvciB0aGlzLiBXZSBkaWQgbGVhdmUgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBTREtST09UIG9wdGlvbiBzZXQgZXhwbGljaXRseSB0byBtYWtlIGl0IGVhc3kgdG8gY2hhbmdlIGluIGNhc2Ugd2UgbmVlZCB0by5cCitcCitGb3IgdGhlIEFsdGl2ZWMgYW5kIE1NWC9TU0Ugb3B0aW9ucywgd2UgaGFkIHRvIHVzZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgYnVpbGQgZmxhZ3MuIEZ1cnRoZXJtb3JlLCB0byB1c2UgU1NFLCB3ZSBhbHNvIGhhZCB0byBpbmNsdWRlIHRoZSBhc3NlbWJseSBjb2RlLiBUaGlzIGNhdXNlZCB1cyBwcm9ibGVtcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIHRlbGwgWGNvZGUgdG8gdXNlIGZpbGVzIG9ubHkgZm9yIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLiBTbyB0aGUgUG93ZXJQQyBzaWRlIGdvdCBjb25mdXNlZCBvbiB0aGUgLmFzbSBmaWxlcyBhbmQgd291bGQgZmFpbCB0byBjb21waWxlLiBcCitcCitQdXNoaW5nIGZvcndhcmQsIHdlIGlnbm9yZWQgUFBDIGZvciB0aGUgbW9tZW50IHRvIHNlZSBpZiB3ZSBjb3VsZCBhdCBsZWFzdCBidWlsZCBhbiBvcHRpbWl6ZWQgeDg2IGJ1aWxkIGFuZCB0aGVuIHVzZSBsaXBvIG1hbnVhbGx5IHRvIG1lcmdlIHRoZSByZXN1bHRzLiBXZSBlbmNvdW50ZXJlZCBhZGRpdGlvbmFsIHByb2JsZW1zLiBGaXJzdCB0aGUgYWxpZ25tZW50IG5lZWRlZCB0byBiZSBjaGFuZ2VkIGZvciByZWFzb25zIG91dHNpZGUgbXkga25vd2xlZGdlIGJhc2UuIFdlIGNoYW5nZWQgYWxsIGluc3RhbmNlcyBvZiAuYWxpZ24gMTYgdG8gLmFsaWduIDguIFRoaXMgc2VlbWVkIHRvIGZpeCB0aGUgY29tcGlsZSBwcm9ibGVtcy4gQnV0IGF0IHRoZSBsaW5raW5nIHN0YWdlLCB3ZSBnb3QgZXJyb3JzIHN1Y2ggYXM6XAorXHBhcmRcdHg1NjBcdHgxMTIwXHR4MTY4MFx0eDIyNDBcdHgyODAwXHR4MzM2MFx0eDM5MjBcdHg0NDgwXHR4NTA0MFx0eDU2MDBcdHg2MTYwXHR4NjcyMFxsaTY0MFxmaS02NDBccWxccW5hdHVyYWxccGFyZGlybmF0dXJhbAorCitcZjJcaVxmczIyIFxjZjAgbGQ6IC9Vc2Vycy9ld2luZy9ERVZFTE9QTUVOVC9DT0RFVEVTVC9Vbml2ZXJzYWxCaW5hcnlTREwvU0RMMTIvWGNvZGUvU0RML2J1aWxkL1NETC5idWlsZC9EZXBsb3ltZW50L0ZyYW1ld29yay5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L1NETF95dXZfbW14Lm8gaGFzIGxvY2FsIHJlbG9jYXRpb24gZW50cmllcyBpbiBub24td3JpdGFibGUgc2VjdGlvbiAoX19URVhULF9fdGV4dClcCisvdXNyL2Jpbi9saWJ0b29sOiBpbnRlcm5hbCBsaW5rIGVkaXQgY29tbWFuZCBmYWlsZWRcCitccGFyZFx0eDU2MFx0eDExMjBcdHgxNjgwXHR4MjI0MFx0eDI4MDBcdHgzMzYwXHR4MzkyMFx0eDQ0ODBcdHg1MDQwXHR4NTYwMFx0eDYxNjBcdHg2NzIwXHFsXHFuYXR1cmFsXHBhcmRpcm5hdHVyYWwKKworXGYxXGkwXGZzMjQgXGNmMCBcCitPdXIgYmVsaWVmIGlzIHRoYXQgdGhlIGFzc2VtYmx5IGNvZGUgaXMgbm90IHBvc2l0aW9uIGluZGVwZW5kZW50IGFuZCB0aHVzIHdpbGwgbm90IHdvcmsgZm9yIHVzLiBXZSBkb3VibGUgY2hlY2tlZCBmb3IgYW55IE9TIFggZ2NjIGZsYWdzIHRoYXQgY29udHJvbCBwb3NpdGlvbiBpbmRlcGVuZGVuY2UsIGJ1dCBldmVyeXRoaW5nIHNlZW1lZCB0byBiZSBpbiBvcmRlci4gQXMgc3VjaCwgd2UgY2Fubm90IGNvbXBpbGUgTU1YL1NTRSBvcHRpbWl6YXRpb25zIHVudGlsIHRoZXkgYXJlIHJld3JpdHRlbiwgcHJlZmVyYWJseSB3aXRob3V0IHRoZSBuYXNtIHJlcXVpcmVtZW50IHRvIGFjY29tbW9kYXRlIHRoZSBkdWFsIFBQQy94ODYgWGNvZGUgbGltaXRhdGlvbnMuXAorXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxxbFxxbmF0dXJhbFxwYXJkaXJuYXR1cmFsCitcY2YwIFwKK1NvIGZvciBub3csIHdlIGhhdmUgdW5jaGVja2VkIChjaGVja2JveCkgdGhlIGFzc2VtYmx5IHNwZWNpZmljIGZpbGVzIGluIHRoZSBYY29kZSBwcm9qZWN0IGFuZCBoYXZlIHJlbW92ZWQgdGhlIC1EVVNFX0FTTUJMSVQgZmxhZyBmcm9tIE9USEVSX0NGTEFHU19pMzg2LiBUbyByZWFjdGl2YXRlIHRoaXMgc3R1ZmYsIHlvdSB3aWxsIG5lZWQgdG8gcmVjaGVjayB0aGUgYm94ZXMgYW5kIHJlLWFkZCB0aGUgZmxhZy5cCitcCitUaGUgZmlsZXMgYXJlXAorU0RMX21peGVyX01NWC5jL2hcCitUaGUgZmlsZXMgdW5kZXIgaGVybWVzXAorYW5kIFNETF95dXZfbW14LmNcCitcCitcCitcCitGb3IgdGhlIFNETCBzYXRlbGxpdGVzLCBpdCB3YXMgbW9yZSBvZiB0aGUgc2FtZS4gVGhlIHBhaW5mdWwgcGFydCB3YXMgdGhhdCB0aGUgM3JkIGxpYnJhcnkgZGVwZW5kZW5jaWVzIG5lZWRlZCB0byBiZSByZWJ1aWx0LiAoU29tZSBvZiBvdXIgbGlicmFyaWVzIHdlcmUgb3V0IG9mIGRhdGUsIHNvIHRoaXMgd2FzIGFuIG9wcG9ydHVuaXR5IHRvIHVwZGF0ZSB0aGVtLikgQnV0IHRoaXMgbWVhbnQgY2hhbmdpbmcgdGhvc2UgYnVpbGQgc3lzdGVtcyBhcyB3ZWxsLiBcCitcCitUaGVzZSBhcmUgdGhlIHZlcnNpb25zIEkgdXNlZDpcCitsaWJwbmctMS4yLjhcCitsaWJqcGVnLTZiXAorbGlib2dnLTEuMS4zXAorbGlidm9yYmlzLTEuMS4yXAorc21wZWcgY3ZzXAorXAorV2UgZm91bmQgdGhhdCBBcHBsZSBhbHJlYWR5IGhhZCBhIGxpYmZyZWV0eXBlIGluIHRoZSAxMC40dSBTREsgc28gd2UganVzdCB1c2VkIHRoYXQgb25lIHdoaWNoIHNlZW1lZCB0byB3b3JrLiAoRm9yIHRoZSByZWNvcmQsIHRoZSBxdWVzdGlvbiBkaWQgY29tZSB1cCBvZiB3aHkgd2Ugc3RhdGljYWxseSBsaW5rIGFnYWluc3QgdGhpcyB3aGVuIGl0IHNlZW1zIHRvIGJlIGEgc3RhbmRhcmQgY29tcG9uZW50IG9uIFBhbnRoZXIgYW5kIFRpZ2VyLiBXZSBkb3VibGUgY2hlY2tlZCwgYW5kIGl0IGRpZCBub3Qgc2VlbSB0byBiZSBpbiBKYWd1YXIuIFNvIHRoYXQncyB3aHkuKVwKK1wKK1RoZSBvbGQgbGlicG5nIHR1cm5lZCBvdXQgdG8gYmUgZnJvbSB0aGUgMS4wLnggYnJhbmNoIHNvIHdlIG5lZWRlZCB0byByZXBsYWNlIGFsbCB0aGUgaGVhZGVycyB3ZSBoYWQgYXMgd2VsbC4gVXBkYXRpbmcgdG8gdGhlIDEuMi54IGJyYW5jaCBkaWRuJ3Qgc2VlbSB0byBjYXVzZSBhbnkgcHJvYmxlbXMgd2UgY291bGQgZGV0ZWN0LlwKK1wKK2xpYnBuZyBhbmQgbGlianBlZyBsYWNrIGFuIFhjb2RlIHByb2plY3Qgc28gd2UgbXVja2VkIHdpdGggdGhlaXIgYnVpbGQgc3lzdGVtIHRvIHByb2R1Y2UgVW5pdmVyc2FsIEJpbmFyaWVzLiBCdXQgc2luY2Ugd2UgbmVlZGVkIFBQQyB0byBiZSBjb21waWxlZCB3aXRoIDMuMyBhbmQgSW50ZWwgdG8gYmUgY29tcGlsZWQgd2l0aCA0LjAsIGl0IGVuZGVkIHVwIHRoYXQgd2UgYnVpbHQgbXVsdGlwbGUgdGltZXMgY2hhbmdpbmcgdGhlIGNvbXBpbGVyLCBhbmQgdGhlbiB1c2luZyBsaXBvIHRvIHN0cmlwIGFuZCBjb21iaW5lIHRoZSBiaW5hcmllcy5cCitcCitsaWJvZ2cvbGlidm9yYmlzIGRpZCBjb250YWluIFhjb2RlIHByb2plY3RzLCBidXQgZGlkbid0IGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgc28gd2UgaGFkIHRvIGFkZCB0aGF0LiBXZSBhbHNvIGRpc2NvdmVyZWQgdGhhdCBub3QgYnVpbGRpbmcgd2l0aCBnY2MgMy4zIGNhdXNlZCB1cyBhZGRpdGlvbiBtaXNzaW5nIHN5bWJvbCBydW50aW1lIHByb2JsZW1zIHdpdGggZmxvYXQgdmVyc2lvbnMgb2YgbWF0aCBmdW5jdGlvbnMgKHNpbmYsIHNxcnRmLCBldGMpLlwKK1wKK0l0IHNlZW1zIHRoYXQgb25jZSB1cG9uIGEgdGltZSwgdGhlIFNETF9taXhlciBmcmFtZXdvcmsgc3VwcG9ydGVkIE1QMydzIHZpYSBTTVBFRywgYnV0IHRoaXMgZGlzYXBwZWFyZWQgYXQgc29tZSBwb2ludC4gSSBkb24ndCBrbm93IHdoeSBvciBob3cgdGhpcyBoYXBwZW5lZC4gQnV0IEkgYWxzbyBkb24ndCBrbm93IGhvdyBTTVBFRyB3YXMgZXZlciB1c2VkIHdpdGggdGhlIGZyYW1ld29yayBhcyB0aGVyZSB3YXMgbm8gcHJlZXhpc3RpbmcgaW5mcmFzdHJ1Y3R1cmUgYXMgd2l0aCB0aGUgb3RoZXIgbGlicmFyaWVzLiBTbyBJIGhhdmUgYXR0ZW1wdGVkIHRvIGNvcnJlY3QgdGhpcyBvdmVyc2lnaHQsIGhvd2V2ZXIsIHRoZSBTTVBFRyBmcmFtZXdvcmsgaXRzZWxmIGhhcyBNTVggY29kZSB3aGljaCBoYXMgYWxzbyB0dXJuZWQgb3V0IHRvIGJlIHByb2JsZW1hdGljLiBJIGFtIGdldHRpbmcgY29tcGlsZXIgZXJyb3JzIG9mICIKK1xmMlxpXGZzMjIgVW5rbm93biBwc2V1ZG8tb3A6IgorXGYxXGkwXGZzMjQgZm9yIAorXGYyXGlcZnMyMiAudHlwZSAKK1xmMVxpMFxmczI0IGFuZCAKK1xmMlxpXGZzMjIgLnNpemUuIAorXGYxXGkwXGZzMjQgXAorU28gU01QRUcgaXMgY3VycmVudGx5IGNvbXBpbGVkIHdpdGhvdXQgTU1YIG9wdGltaXphdGlvbnMuXAorXAorXAorXAorXAorQWRkZW5kdW06IFwKKzIwMDYtMDMtMDY6XAorVGhlIG1haW4gU0RMIGNvZGUgYmFzZSAobm90IHRoZSBzYXRlbGxpdGVzKSBoYXZlIHVuZGVyZ29uZSBhbiBvdmVyaGF1bC4gVGhlIHJlcXVpcmVkIHBsYXRmb3JtIHNwZWNpZmljIGRlZmluZXMgaGF2ZSBiZWVuIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgc3lzdGVtIGludG8gcGxhdGZvcm0gc3BlY2lmaWMgaGVhZGVyIGZpbGVzIChTRExfY29uZmlnXyouaCkuIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXBsaWZ5IHRoZSBYY29kZSBwcm9qZWN0cyBzb21ld2hhdCwgYnV0IHdlIHN0aWxsIG11c3QgbWFpbnRhaW4gdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBidWlsZCBvcHRpb25zIHRvIGludm9rZSBnY2MgMy4zIHRvIG1haW50YWluIG91ciBtYW5kYXRlZCAxMC4yIGNvbXBhdGliaWx0eSByZXF1aXJlbWVudC5cCitcCitBbHNvIGl0IGFwcGVhcnMgdGhhdCB0aGUgTU1YL1NTRSBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiBhcyB3ZWxsIHNvIHRoYXQgdGhlIG9ic3RhY2xlcyB3ZSBmYWNlZCBpbiBjb21waWxpbmcgaW4gdGhlc2Ugb3B0aW1pemF0aW9ucyBhcmUgbm8gbG9uZ2VyIHByb2JsZW1zLiBUaGUgYmluYXJpZXMgd2UgcHJvZHVjZSBzaG91bGQgbm93IGNvbnRhaW4gdGhlIHByb2Nlc3NvciBzcGVjaWZpYyBvcHRpbWl6YXRpb25zLiAoUmVtZW1iZXIgdGhpcyBub3RlIG9ubHkgYXBwbGllcyB0byBTREwgYW5kIG5vdCB0aGUgc2F0ZWxsaXRlcywgc3VjaCBhcyBTTVBFRy4pXAorXAorXAorXAorQ29udHJpYnV0ZXJzOlwKK0VyaWMgV2luZyAoWGNvZGUgcHJvamVjdHMsIDNyZCBwYXJ0eSBkZXBlbmRlbmNpZXMsIGRvY3VtZW50YXRpb24pXAorQ2hyaXN0aWFuIFdhbHRoZXIgKDEwLjIuOCBhbmQgMTAuMy45IHRlc3RpbmcvdmVyaWZpY2F0aW9uKVwKK1J5YW4gR29yZG9uIChjb252ZXJ0ZWQgQysrIGNvZGUgaW4gU0RML09TWCBjb2RlIGJhc2UgdG8gcHVyZSBDKVwKK01hcnRpbiBTdG9yc2pcJ2Y2IChsaWJnY2NfcyB0ZXN0aW5nL3ZlcmlmaWNhdGlvbilcCitTdGVwaGFuZSBNYXJjaGVzaW4gKE1NWC9TU0UgY29kZSBleHBlcnQpXAorXAorXAorXAorXAorXAorXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxxbFxxbmF0dXJhbFxwYXJkaXJuYXR1cmFsCisKK1xmMCBcY2YwIFwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L3NkbF9sb2dvLnBkZiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TREwvcGtnLXN1cHBvcnQvc2RsX2xvZ28ucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzJmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RML3BrZy1zdXBwb3J0L3NkbF9sb2dvLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLWNoZWNra2V5c19fVXBncmFkZWRfLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby1jaGVja2tleXNfX1VwZ3JhZGVkXy5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTMyMWUzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby1jaGVja2tleXNfX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz5jaGVja2tleXM8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLWdyYXl3aW5fX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tZ3JheXdpbl9fVXBncmFkZWRfLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWMwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLWdyYXl3aW5fX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz5ncmF5d2luPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby1sb29wd2F2ZV9fVXBncmFkZWRfLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby1sb29wd2F2ZV9fVXBncmFkZWRfLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjY4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLWxvb3B3YXZlX19VcGdyYWRlZF8ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+bG9vcHdhdmU8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3QucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3QucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkNWRiNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdC5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz50ZXN0YWxwaGE8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RhbHBoYV9fVXBncmFkZWRfLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0YWxwaGFfX1VwZ3JhZGVkXy5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ1ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0YWxwaGFfX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz50ZXN0YWxwaGE8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RiaXRtYXBfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGJpdG1hcF9fVXBncmFkZWRfLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWMyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RiaXRtYXBfX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz50ZXN0Yml0bWFwPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0YmxpdHNwZWVkLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0YmxpdHNwZWVkLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmJjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RibGl0c3BlZWQucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdGJsaXRzcGVlZDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4wLjAuMWQxPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluLm5pYjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGNkcm9tX19VcGdyYWRlZF8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RjZHJvbV9fVXBncmFkZWRfLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZTY2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RjZHJvbV9fVXBncmFkZWRfLnBsaXN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPnRlc3RjZHJvbTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4wLjAuMWQxPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluLm5pYjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGR5bmdsLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0ZHluZ2wucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3NDExOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGR5bmdsLnBsaXN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPnRlc3RkeW5nbDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4wLjAuMWQxPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluLm5pYjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGVycm9yX19VcGdyYWRlZF8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RlcnJvcl9fVXBncmFkZWRfLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2MwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RlcnJvcl9fVXBncmFkZWRfLnBsaXN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPnRlc3RlcnJvcjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4wLjAuMWQxPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluLm5pYjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGZpbGUucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RmaWxlLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODhiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RmaWxlLnBsaXN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPnRlc3RmaWxlPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0Z2FtbWFfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGdhbW1hX19VcGdyYWRlZF8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2YjVhZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGdhbW1hX19VcGdyYWRlZF8ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdGdhbW1hPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0Z2xfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGdsX19VcGdyYWRlZF8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjYzljYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGdsX19VcGdyYWRlZF8ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdGdsPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0aWNvbnYucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RpY29udi5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmYwMDNmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0aWNvbnYucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdGljb252PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0am95c3RpY2tfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGpveXN0aWNrX19VcGdyYWRlZF8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZTI3NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGpveXN0aWNrX19VcGdyYWRlZF8ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdGpveXN0aWNrPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0a2V5c19fVXBncmFkZWRfLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0a2V5c19fVXBncmFkZWRfLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZWJhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RrZXlzX19VcGdyYWRlZF8ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdGtleXM8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3Rsb2NrX19VcGdyYWRlZF8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3Rsb2NrX19VcGdyYWRlZF8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiNzFmMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdGxvY2tfX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz50ZXN0bG9jazwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4wLjAuMWQxPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluLm5pYjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdG92ZXJsYXkyLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0b3ZlcmxheTIucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0ZTBjZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdG92ZXJsYXkyLnBsaXN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPnRlc3RvdmVybGF5Mjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4wLjAuMWQxPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluLm5pYjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdG92ZXJsYXlfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdG92ZXJsYXlfX1VwZ3JhZGVkXy5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2E4YTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0b3ZlcmxheV9fVXBncmFkZWRfLnBsaXN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4wLjAuMWQxPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluLm5pYjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHBhbGV0dGVfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHBhbGV0dGVfX1VwZ3JhZGVkXy5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDg5NDdlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0cGFsZXR0ZV9fVXBncmFkZWRfLnBsaXN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPnRlc3RwYWxldHRlPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0cGxhdGZvcm0ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RwbGF0Zm9ybS5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjYwZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0cGxhdGZvcm0ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdHBsYXRmb3JtPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0c2VtX19VcGdyYWRlZF8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3RzZW1fX1VwZ3JhZGVkXy5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIzNWZlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0c2VtX19VcGdyYWRlZF8ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdHNlbTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4wLjAuMWQxPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluLm5pYjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHNwcml0ZV9fVXBncmFkZWRfLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0c3ByaXRlX19VcGdyYWRlZF8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3MzljMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHNwcml0ZV9fVXBncmFkZWRfLnBsaXN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPnRlc3RzcHJpdGU8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3R0aHJlYWRfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHRocmVhZF9fVXBncmFkZWRfLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTQ3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3R0aHJlYWRfX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz50ZXN0dGhyZWFkPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0dGltZXJfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHRpbWVyX19VcGdyYWRlZF8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0MzI0NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHRpbWVyX19VcGdyYWRlZF8ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdHRpbWVyPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0dHlwZXNfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHR5cGVzX19VcGdyYWRlZF8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2NDkwYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHR5cGVzX19VcGdyYWRlZF8ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdHR5cGVzPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0dmVyc2lvbl9fVXBncmFkZWRfLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0dmVyc2lvbl9fVXBncmFkZWRfLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjM1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3R2ZXJzaW9uX19VcGdyYWRlZF8ucGxpc3QKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+dGVzdHZlcnNpb248L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3R2aWRpbmZvX19VcGdyYWRlZF8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3R2aWRpbmZvX19VcGdyYWRlZF8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmMTNiNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHZpZGluZm9fX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz50ZXN0dmlkaW5mbzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4wLjAuMWQxPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluLm5pYjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHdpbl9fVXBncmFkZWRfLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0d2luX19VcGdyYWRlZF8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlOTFjNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdGVzdHdpbl9fVXBncmFkZWRfLnBsaXN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPnRlc3R3aW48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRlc3R3bV9fVXBncmFkZWRfLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0d21fX1VwZ3JhZGVkXy5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc5ZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10ZXN0d21fX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz50ZXN0d208L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRocmVhZHdpbl9fVXBncmFkZWRfLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10aHJlYWR3aW5fX1VwZ3JhZGVkXy5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjE3NjNkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvSW5mby10aHJlYWR3aW5fX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz50aHJlYWR3aW48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MC4wLjFkMTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbi5uaWI8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRvcnR1cmV0aHJlYWRfX1VwZ3JhZGVkXy5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L0luZm8tdG9ydHVyZXRocmVhZF9fVXBncmFkZWRfLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzM0NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9JbmZvLXRvcnR1cmV0aHJlYWRfX1VwZ3JhZGVkXy5wbGlzdApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz50b3J0dXJldGhyZWFkPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjAuMC4xZDE8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW4ubmliPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvU0RMVGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1NETFRlc3QvU0RMVGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzOGQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9TRExUZXN0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTAsMCArMSw0NTE0IEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDI7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJQkVDNTY2OTIwNzYxRDkwMzAwQTMzMDI5IC8qIEFsbCAqLyA9IHsKKwkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNTk5ODA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIkFsbCIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMDAzRkE2QTgwOTQwMDIzNjAwMEM1M0IzIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MDEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MDMwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MDUwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MDcwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MDkwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMDAyRjM0NzkwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MEIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMDAyRjM0N0IwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MEQwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMDAyRjM0N0QwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MEYwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MTEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMDAyRjM0N0YwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MTUwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MTcwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MTkwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMDAyRjM0ODEwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMDAyRjM0ODMwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MUIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMDAyRjM0ODUwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MUQwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MUYwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MTMwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MjEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MjUwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MjcwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MjkwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MkIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MkQwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJQkVDNTY4MkYwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IEFsbDsKKwkJCXByb2R1Y3ROYW1lID0gIkJ1aWxkIEFsbCI7CisJCX07CisvKiBFbmQgUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJMDAyRjMzNzUwOUNBMTRGOTAwRUJFQjg4IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCTAwMkYzMzc5MDlDQTE0RjkwMEVCRUI4OCAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQkwMDJGMzM3QTA5Q0ExNEY5MDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwM0ZBNjQzMDkzRkZENDEwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzM4QjA5Q0ExNkJGMDBFQkVCODggLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJMDAyRjMzOEYwOUNBMTZCRjAwRUJFQjg4IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCTAwMkYzMzkwMDlDQTE2QkYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAzRkE2NDMwOTNGRkQ0MTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzMzlCMDlDQTE3QkMwMEVCRUI4OCAvKiB0ZXN0YmxpdHNwZWVkLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzM5QTA5Q0ExN0JDMDBFQkVCODggLyogdGVzdGJsaXRzcGVlZC5jICovOyB9OworCQkwMDJGMzNBODA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzQTkwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0FBMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzNBQjA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzQUMwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0FEMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzNBRTA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzQUYwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0IwMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzNCMTA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzQjIwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0IzMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzNCNDA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzQjUwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0I2MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzNCNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzQjgwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0I5MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzNCQTA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzQkIwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0JDMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzNCRDA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzQkUwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0JGMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzNDMDA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzQzEwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0NGMDlDQTE5QTYwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkVFQ0RGM0QwMDg2QzVFQTdGMDAwMDAxIC8qIFNETE1haW4ubmliICovOyB9OworCQkwMDJGMzNEMjA5Q0ExOUE2MDBFQkVCODggLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKwkJMDAyRjMzRDMwOUNBMTlBNjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjMzRDQwOUNBMTlBNjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzM0UzMDlDQTFBMEIwMEVCRUI4OCAvKiB0ZXN0ZHluZ2wuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0UyMDlDQTFBMEIwMEVCRUI4OCAvKiB0ZXN0ZHluZ2wuYyAqLzsgfTsKKwkJMDAyRjM0MDYwOUNBMUJGRjAwRUJFQjg4IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCTAwMkYzNDA5MDlDQTFCRkYwMEVCRUI4OCAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQkwMDJGMzQwQTA5Q0ExQkZGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwM0ZBNjQzMDkzRkZENDEwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzQwQjA5Q0ExQkZGMDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjM0MTgwOUNBMUM1QjAwRUJFQjg4IC8qIHRlc3RmaWxlLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzQxNzA5Q0ExQzVCMDBFQkVCODggLyogdGVzdGZpbGUuYyAqLzsgfTsKKwkJMDAyRjM0MjUwOUNBMUYwMzAwRUJFQjg4IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCTAwMkYzNDI4MDlDQTFGMDMwMEVCRUI4OCAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQkwMDJGMzQyOTA5Q0ExRjAzMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwM0ZBNjQzMDkzRkZENDEwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzQyQTA5Q0ExRjAzMDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjMzQTcwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjM0MzcwOUNBMUY2RjAwRUJFQjg4IC8qIHRlc3RpY29udi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjM0MzYwOUNBMUY2RjAwRUJFQjg4IC8qIHRlc3RpY29udi5jICovOyB9OworCQkwMDJGMzQ0MTA5Q0ExRkIzMDBFQkVCODggLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJMDAyRjM0NDQwOUNBMUZCMzAwRUJFQjg4IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCTAwMkYzNDQ1MDlDQTFGQjMwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAzRkE2NDMwOTNGRkQ0MTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzNDQ2MDlDQTFGQjMwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkwMDJGMzQ1NDA5Q0EyMDIwMDBFQkVCODggLyogdGVzdG92ZXJsYXkyLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzQ1MjA5Q0EyMDFDMDBFQkVCODggLyogdGVzdG92ZXJsYXkyLmMgKi87IH07CisJCTAwMkYzNDVFMDlDQTIwNEYwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkVFQ0RGM0QwMDg2QzVFQTdGMDAwMDAxIC8qIFNETE1haW4ubmliICovOyB9OworCQkwMDJGMzQ2MTA5Q0EyMDRGMDBFQkVCODggLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKwkJMDAyRjM0NjIwOUNBMjA0RjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjM0NjMwOUNBMjA0RjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzNDcwMDlDQTIwQTYwMEVCRUI4OCAvKiB0ZXN0cGxhdGZvcm0uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzNDZGMDlDQTIwQTYwMEVCRUI4OCAvKiB0ZXN0cGxhdGZvcm0uYyAqLzsgfTsKKwkJMDAzRkE2NEQwOTNGRkRCMzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NEUwOTNGRkRCNTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NEYwOTNGRkRCNzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTAwOTNGRkRCQTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTEwOTNGRkRCQzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTIwOTNGRkRCRTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTMwOTNGRkRDMTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTQwOTNGRkRDMzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTUwOTNGRkRDNjAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTYwOTNGRkRDODAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTcwOTNGRkRDQTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTgwOTNGRkRDQzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NTkwOTNGRkRDRjAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NUEwOTNGRkREMTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NUIwOTNGRkREMzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NUMwOTNGRkRENTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NUQwOTNGRkRENzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NUUwOTNGRkREQTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NjAwOTNGRkRERjAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NjEwOTNGRkRFMTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NjIwOTNGRkRFMzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NjMwOTNGRkRFNjAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NjQwOTNGRkRFODAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAzRkE2NjUwOTNGRkRFQTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDA3OTRERDkwOUQxRjg5NDAwM0ZDOEExIC8qIE9wZW5HTC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDc5NEREODA5RDFGODk0MDAzRkM4QTEgLyogT3BlbkdMLmZyYW1ld29yayAqLzsgfTsKKwkJMDA3OTRFNjYwOUQyMDg2NTAwM0ZDOEExIC8qIHNhbXBsZS53YXYgaW4gQ29weUZpbGVzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzk0RTYyMDlEMjA4MzkwMDNGQzhBMSAvKiBzYW1wbGUud2F2ICovOyB9OworCQkwMDc5NEVBMjA5RDIzNDRCMDAzRkM4QTEgLyogaWNvbi5ibXAgaW4gQ29weUZpbGVzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzk0RTVEMDlEMjA4MzkwMDNGQzhBMSAvKiBpY29uLmJtcCAqLzsgfTsKKwkJMDA3OTRFQjcwOUQyMzVGNTAwM0ZDOEExIC8qIHNhbXBsZS5ibXAgaW4gQ29weUZpbGVzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzk0RTYxMDlEMjA4MzkwMDNGQzhBMSAvKiBzYW1wbGUuYm1wICovOyB9OworCQkwMDc5NEVFNzA5RDIzNkVEMDAzRkM4QTEgLyogc2FtcGxlLmJtcCBpbiBDb3B5RmlsZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA3OTRFNjEwOUQyMDgzOTAwM0ZDOEExIC8qIHNhbXBsZS5ibXAgKi87IH07CisJCTAwNzk0RUYwMDlEMjM3MzkwMDNGQzhBMSAvKiB1dGY4LnR4dCBpbiBDb3B5RmlsZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDA3OTRFNjMwOUQyMDgzOTAwM0ZDOEExIC8qIHV0ZjgudHh0ICovOyB9OworCQkwMDc5NEVGNzA5RDIzN0RFMDAzRkM4QTEgLyogbW9vc2UuZGF0IGluIENvcHlGaWxlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDc5NEU1RTA5RDIwODM5MDAzRkM4QTEgLyogbW9vc2UuZGF0ICovOyB9OworCQkwMDc5NEVGRTA5RDIzODJCMDAzRkM4QTEgLyogc2FpbC5ibXAgaW4gQ29weUZpbGVzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwNzk0RTYwMDlEMjA4MzkwMDNGQzhBMSAvKiBzYWlsLmJtcCAqLzsgfTsKKwkJMDA3OTRGMDQwOUQyMzg2OTAwM0ZDOEExIC8qIGljb24uYm1wIGluIENvcHlGaWxlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDc5NEU1RDA5RDIwODM5MDAzRkM4QTEgLyogaWNvbi5ibXAgKi87IH07CisJCTAwNzk0RjBCMDlEMjM4RjQwMDNGQzhBMSAvKiBzYW1wbGUuYm1wIGluIENvcHlGaWxlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDc5NEU2MTA5RDIwODM5MDAzRkM4QTEgLyogc2FtcGxlLmJtcCAqLzsgfTsKKwkJMDA3OTRGMTEwOUQyMzkyQjAwM0ZDOEExIC8qIGljb24uYm1wIGluIENvcHlGaWxlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDc5NEU1RDA5RDIwODM5MDAzRkM4QTEgLyogaWNvbi5ibXAgKi87IH07CisJCTAwNzk0Rjg3MDlEMjQxM0IwMDNGQzhBMSAvKiBzYW1wbGUuYm1wIGluIENvcHlGaWxlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDc5NEU2MTA5RDIwODM5MDAzRkM4QTEgLyogc2FtcGxlLmJtcCAqLzsgfTsKKwkJQkVDNTY2QUYwNzYxRDkwMzAwQTMzMDI5IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCUJFQzU2NkIxMDc2MUQ5MDMwMEEzMzAyOSAvKiBjaGVja2tleXMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA5MkQ2RDEwRkZCMzBBMkM3RjAwMDAwMSAvKiBjaGVja2tleXMuYyAqLzsgfTsKKwkJQkVDNTY2QkMwNzYxRDkwMzAwQTMzMDI5IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCUJFQzU2NkJFMDc2MUQ5MDMwMEEzMzAyOSAvKiBncmF5d2luLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOTJENkQxQkZGQjMwQzIzN0YwMDAwMDEgLyogZ3JheXdpbi5jICovOyB9OworCQlCRUM1NjZDOTA3NjFEOTAzMDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY2Q0IwNzYxRDkwMzAwQTMzMDI5IC8qIGxvb3B3YXZlLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODNFNDg3MjAwNkQ4NEM5N0YwMDAwMDEgLyogbG9vcHdhdmUuYyAqLzsgfTsKKwkJQkVDNTY2RDcwNzYxRDkwMzAwQTMzMDI5IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCUJFQzU2NkQ5MDc2MUQ5MDMwMEEzMzAyOSAvKiB0ZXN0YWxwaGEuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4M0U0ODc0MDA2RDg0Rjc3RjAwMDAwMSAvKiB0ZXN0YWxwaGEuYyAqLzsgfTsKKwkJQkVDNTY2RTUwNzYxRDkwMzAwQTMzMDI5IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCUJFQzU2NkU3MDc2MUQ5MDMwMEEzMzAyOSAvKiB0ZXN0Yml0bWFwLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOTJENkQyNUZGQjMwRDFBN0YwMDAwMDEgLyogdGVzdGJpdG1hcC5jICovOyB9OworCQlCRUM1NjZGMjA3NjFEOTAzMDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY2RjQwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RjZHJvbS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDgzRTQ4NzYwMDZEODUyOTdGMDAwMDAxIC8qIHRlc3RjZHJvbS5jICovOyB9OworCQlCRUM1NjZGRjA3NjFEOTAzMDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3MDEwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RlcnJvci5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDgzRTQ4NzgwMDZEODUzNTdGMDAwMDAxIC8qIHRlc3RlcnJvci5jICovOyB9OworCQlCRUM1NjcwQzA3NjFEOTA0MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3MEUwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RnYW1tYS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDgzRTQ4N0EwMDZEODU0NzdGMDAwMDAxIC8qIHRlc3RnYW1tYS5jICovOyB9OworCQlCRUM1NjcxQTA3NjFEOTA0MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3MUMwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RnbC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDkyRDZENEVGRkIzMTEwODdGMDAwMDAxIC8qIHRlc3RnbC5jICovOyB9OworCQlCRUM1NjcyNzA3NjFEOTA0MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3MjkwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RocmVhZC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDkyRDZENThGRkIzMTFBOTdGMDAwMDAxIC8qIHRlc3RocmVhZC5jICovOyB9OworCQlCRUM1NjczNDA3NjFEOTA0MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3MzYwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3Rqb3lzdGljay5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDkyRDZENjJGRkIzMTJBQTdGMDAwMDAxIC8qIHRlc3Rqb3lzdGljay5jICovOyB9OworCQlCRUM1Njc0MTA3NjFEOTA0MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3NDMwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RrZXlzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOTJENkQ2Q0ZGQjMxMzQzN0YwMDAwMDEgLyogdGVzdGtleXMuYyAqLzsgfTsKKwkJQkVDNTY3NEUwNzYxRDkwNDAwQTMzMDI5IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCUJFQzU2NzUwMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0bG9jay5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDkyRDZENzVGRkIzMTNCQjdGMDAwMDAxIC8qIHRlc3Rsb2NrLmMgKi87IH07CisJCUJFQzU2NzVEMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0b3ZlcmxheS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjU3REMzOTgwMkE2RTZBMjAxRDI4NzYyIC8qIHRlc3RvdmVybGF5LmMgKi87IH07CisJCUJFQzU2NzY4MDc2MUQ5MDQwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkVFQ0RGM0QwMDg2QzVFQTdGMDAwMDAxIC8qIFNETE1haW4ubmliICovOyB9OworCQlCRUM1Njc2QTA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdHBhbGV0dGUuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4M0U0ODdDMDA2RDg1NkI3RjAwMDAwMSAvKiB0ZXN0cGFsZXR0ZS5jICovOyB9OworCQlCRUM1Njc3NjA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3NzgwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3RzZW0uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4M0U0ODdFMDA2RDg2QTE3RjAwMDAwMSAvKiB0ZXN0c2VtLmMgKi87IH07CisJCUJFQzU2NzgzMDc2MUQ5MDUwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkVFQ0RGM0QwMDg2QzVFQTdGMDAwMDAxIC8qIFNETE1haW4ubmliICovOyB9OworCQlCRUM1Njc4NTA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHNwcml0ZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDgzRTQ4N0YwMDZEODZBMTdGMDAwMDAxIC8qIHRlc3RzcHJpdGUuYyAqLzsgfTsKKwkJQkVDNTY3OTEwNzYxRDkwNTAwQTMzMDI5IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCUJFQzU2NzkzMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0dGltZXIuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4M0U0ODgwMDA2RDg2QTE3RjAwMDAwMSAvKiB0ZXN0dGltZXIuYyAqLzsgfTsKKwkJQkVDNTY3QUIwNzYxRDkwNTAwQTMzMDI5IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCUJFQzU2N0FEMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0dmVyLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODNFNDg4MjAwNkQ4NkExN0YwMDAwMDEgLyogdGVzdHZlci5jICovOyB9OworCQlCRUM1NjdCODA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3QkEwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R2aWRpbmZvLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODNFNDg4MzAwNkQ4NkExN0YwMDAwMDEgLyogdGVzdHZpZGluZm8uYyAqLzsgfTsKKwkJQkVDNTY3QzUwNzYxRDkwNTAwQTMzMDI5IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzRDAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5uaWIgKi87IH07CisJCUJFQzU2N0M3MDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0d2luLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODNFNDg4NDAwNkQ4NkExN0YwMDAwMDEgLyogdGVzdHdpbi5jICovOyB9OworCQlCRUM1NjdEMzA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3RDUwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R3bS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDgzRTQ4ODUwMDZEODZBMTdGMDAwMDAxIC8qIHRlc3R3bS5jICovOyB9OworCQlCRUM1NjdFMTA3NjFEOTA2MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3RTMwNzYxRDkwNjAwQTMzMDI5IC8qIHRocmVhZHdpbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDgzRTQ4ODYwMDZEODZBMTdGMDAwMDAxIC8qIHRocmVhZHdpbi5jICovOyB9OworCQlCRUM1NjdFRTA3NjFEOTA2MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJQkVDNTY3RjAwNzYxRDkwNjAwQTMzMDI5IC8qIHRvcnR1cmV0aHJlYWQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4M0U0ODg3MDA2RDg2QTE3RjAwMDAwMSAvKiB0b3J0dXJldGhyZWFkLmMgKi87IH07CisJCUJFQzU2N0Y5MDc2MUQ5MDYwMEEzMzAyOSAvKiBTRExNYWluLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUVDREYzQjAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5oICovOyB9OworCQlCRUM1NjdGQTA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbl9wcmVmaXguaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyMDdGRjI0MDRFMUIxOTYwMEE4MDAwMiAvKiBsaWJzZGxtYWluX3ByZWZpeC5oICovOyB9OworCQlCRUM1NjdGQzA3NjFEOTA2MDBBMzMwMjkgLyogU0RMTWFpbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkVFQ0RGM0MwMDg2QzVFQTdGMDAwMDAxIC8qIFNETE1haW4ubSAqLzsgfTsKKwkJQkVDNTY4NjIwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCUJFQzU2ODYzMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQlCRUM1Njg2NDA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKwkJQkVDNTY4NjUwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCUJFQzU2ODY2MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQlCRUM1Njg2NzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKwkJQkVDNTY4NjgwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCUJFQzU2ODY5MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQlCRUM1Njg2QTA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKwkJQkVDNTY4NkIwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCUJFQzU2ODZDMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQlCRUM1Njg2RDA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKwkJQkVDNTY4NkUwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCUJFQzU2ODZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQlCRUM1Njg3MDA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKwkJQkVDNTY4NzEwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCUJFQzU2ODcyMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQlCRUM1Njg3MzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKwkJQkVDNTY4NzUwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCUJFQzU2ODc2MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQlCRUM1Njg3NzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKwkJQkVDNTY4NzgwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87IH07CisJCUJFQzU2ODc5MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovOyB9OworCQlCRUM1Njg3QTA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLzsgfTsKKy8qIEVuZCBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLworCQkwMDJGMzM3MjA5Q0ExNEY5MDBFQkVCODggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCTAwMkYzMzg4MDlDQTE2QkYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJMDAyRjMzQ0MwOUNBMTlBNjAwRUJFQjg4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQkwMDJGMzQwMzA5Q0ExQkZGMDBFQkVCODggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCTAwMkYzNDIyMDlDQTFGMDMwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJMDAyRjM0M0UwOUNBMUZCMzAwRUJFQjg4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQkwMDJGMzQ1QjA5Q0EyMDRGMDBFQkVCODggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCTAwMkYzNDc4MDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAwMDJGMzM4NjA5Q0ExNkJGMDBFQkVCODg7CisJCQlyZW1vdGVJbmZvID0gdGVzdGJsaXRzcGVlZDsKKwkJfTsKKwkJMDAyRjM0N0EwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDAwMkYzM0NBMDlDQTE5QTYwMEVCRUI4ODsKKwkJCXJlbW90ZUluZm8gPSB0ZXN0ZHluZ2w7CisJCX07CisJCTAwMkYzNDdDMDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAwMDJGMzQwMTA5Q0ExQkZGMDBFQkVCODg7CisJCQlyZW1vdGVJbmZvID0gdGVzdGZpbGU7CisJCX07CisJCTAwMkYzNDdFMDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAwMDJGMzQyMDA5Q0ExRjAzMDBFQkVCODg7CisJCQlyZW1vdGVJbmZvID0gdGVzdGljb252OworCQl9OworCQkwMDJGMzQ4MDA5Q0EyMTU2MDBFQkVCODggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3NTcwNzYxRDkwNDAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJ0ZXN0b3ZlcmxheSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJMDAyRjM0ODIwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDAwMkYzNDNDMDlDQTFGQjMwMEVCRUI4ODsKKwkJCXJlbW90ZUluZm8gPSB0ZXN0b3ZlcmxheTI7CisJCX07CisJCTAwMkYzNDg0MDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAwMDJGMzQ1OTA5Q0EyMDRGMDBFQkVCODg7CisJCQlyZW1vdGVJbmZvID0gdGVzdHBsYXRmb3JtOworCQl9OworCQkwMDNGQTY0MjA5M0ZGRDQxMDAwQzUzQjMgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDAzRkE2M0EwOTNGRkQ0MTAwMEM1M0IzIC8qIFNETC54Y29kZXByb2ogKi87CisJCQlwcm94eVR5cGUgPSAyOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUNERjY2QzA3NjFCQTgxMDA1RkU4NzI7CisJCQlyZW1vdGVJbmZvID0gRnJhbWV3b3JrOworCQl9OworCQkwMDNGQTY0NDA5M0ZGRDQxMDAwQzUzQjMgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDAzRkE2M0EwOTNGRkQ0MTAwMEM1M0IzIC8qIFNETC54Y29kZXByb2ogKi87CisJCQlwcm94eVR5cGUgPSAyOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUNERjZCMzA3NjFCQTgxMDA1RkU4NzI7CisJCQlyZW1vdGVJbmZvID0gIlN0YXRpYyBMaWJyYXJ5IjsKKwkJfTsKKwkJMDAzRkE2NDYwOTNGRkQ0MTAwMEM1M0IzIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDAwM0ZBNjNBMDkzRkZENDEwMDBDNTNCMyAvKiBTREwueGNvZGVwcm9qICovOworCQkJcHJveHlUeXBlID0gMjsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDREY2QkEwNzYxQkE4MTAwNUZFODcyOworCQkJcmVtb3RlSW5mbyA9ICJNYWluIExpYnJhcnkiOworCQl9OworCQkwMDNGQTY0ODA5M0ZGRDQxMDAwQzUzQjMgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDAzRkE2M0EwOTNGRkQ0MTAwMEM1M0IzIC8qIFNETC54Y29kZXByb2ogKi87CisJCQlwcm94eVR5cGUgPSAyOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUNERjZCRTA3NjFCQTgxMDA1RkU4NzI7CisJCQlyZW1vdGVJbmZvID0gIlN0YW5kYXJkIERNRyI7CisJCX07CisJCTAwM0ZBNjRBMDkzRkZENDEwMDBDNTNCMyAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwMDNGQTYzQTA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLnhjb2RlcHJvaiAqLzsKKwkJCXByb3h5VHlwZSA9IDI7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQ0RGNkMzMDc2MUJBODEwMDVGRTg3MjsKKwkJCXJlbW90ZUluZm8gPSAiRGV2ZWwgRXh0cmFzIFBhY2thZ2UiOworCQl9OworCQkwMDNGQTZBNzA5NDAwMjM2MDAwQzUzQjMgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDAzRkE2M0EwOTNGRkQ0MTAwMEM1M0IzIC8qIFNETC54Y29kZXByb2ogKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUNERjVGRTA3NjFCQTgxMDA1RkU4NzI7CisJCQlyZW1vdGVJbmZvID0gRnJhbWV3b3JrOworCQl9OworCQlCRUM1NjgwMDA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY2QUIwNzYxRDkwMzAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJjaGVja2tleXMgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODAyMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjZCODA3NjFEOTAzMDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImdyYXl3aW4gKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODA0MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjZDNTA3NjFEOTAzMDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxvb3B3YXZlIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgwNjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY2RDMwNzYxRDkwMzAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJ0ZXN0YWxwaGEgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODA4MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjZFMTA3NjFEOTAzMDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gInRlc3RiaXRtYXAgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODBBMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjZFRTA3NjFEOTAzMDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gInRlc3RjZHJvbSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4MEMwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2NkZCMDc2MUQ5MDMwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAidGVzdGVycm9yIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgwRTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3MDgwNzYxRDkwNDAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJ0ZXN0Z2FtbWEgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODEwMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjcxNjA3NjFEOTA0MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gInRlc3RnbCAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4MTIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2NzIzMDc2MUQ5MDQwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAidGVzdHRocmVhZCAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4MTQwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2NzMwMDc2MUQ5MDQwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAidGVzdGpveXN0aWNrIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgxNjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3M0QwNzYxRDkwNDAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJ0ZXN0a2V5cyAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4MTgwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2NzRBMDc2MUQ5MDQwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAidGVzdGxvY2sgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODFBMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1Njc2NDA3NjFEOTA0MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gInRlc3RwYWxldHRlIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgxQzA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3NzIwNzYxRDkwNTAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJ0ZXN0c2VtIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgxRTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3N0YwNzYxRDkwNTAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJ0ZXN0c3ByaXRlIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgyMDA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3OEQwNzYxRDkwNTAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJ0ZXN0dGltZXIgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODI0MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdBNzA3NjFEOTA1MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gInRlc3R2ZXJzaW9uIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgyNjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3QjQwNzYxRDkwNTAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJ0ZXN0dmlkaW5mbyAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4MjgwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0MxMDc2MUQ5MDUwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAidGVzdHdpbiAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4MkEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0NGMDc2MUQ5MDUwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAidGVzdHdtIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgyQzA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3REQwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJ0aHJlYWR3aW4gKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODJFMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdFQTA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gInRvcnR1cmV0aHJlYWQgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODMwMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4MzIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgzNDA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODM2MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4MzgwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1NjgzQTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODNDMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4M0UwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1Njg0MDA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODQyMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4NDQwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1Njg0NjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODQ4MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4NEEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1Njg0QzA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODRFMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4NTAwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1Njg1MjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODU2MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4NTgwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1Njg1QTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisJCUJFQzU2ODVDMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjk7CisJCQlyZW1vdGVJbmZvID0gImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIjsKKwkJfTsKKwkJQkVDNTY4NUUwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOTsKKwkJCXJlbW90ZUluZm8gPSAibGlic2RsbWFpbi5hIChVcGdyYWRlZCkiOworCQl9OworCQlCRUM1Njg2MDA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5OworCQkJcmVtb3RlSW5mbyA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCX07CisvKiBFbmQgUEJYQ29udGFpbmVySXRlbVByb3h5IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTAwNzk0RTY0MDlEMjA4NEYwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxNjsKKwkJCWZpbGVzID0gKAorCQkJCTAwNzk0RTY2MDlEMjA4NjUwMDNGQzhBMSAvKiBzYW1wbGUud2F2IGluIENvcHlGaWxlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMDA3OTRFQTAwOUQyMzQzQTAwM0ZDOEExIC8qIENvcHlGaWxlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWENvcHlGaWxlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZHN0UGF0aCA9ICIiOworCQkJZHN0U3ViZm9sZGVyU3BlYyA9IDE2OworCQkJZmlsZXMgPSAoCisJCQkJMDA3OTRFQTIwOUQyMzQ0QjAwM0ZDOEExIC8qIGljb24uYm1wIGluIENvcHlGaWxlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMDA3OTRFQTkwOUQyMzRFODAwM0ZDOEExIC8qIENvcHlGaWxlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWENvcHlGaWxlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZHN0UGF0aCA9ICIiOworCQkJZHN0U3ViZm9sZGVyU3BlYyA9IDE2OworCQkJZmlsZXMgPSAoCisJCQkJMDA3OTRFQjcwOUQyMzVGNTAwM0ZDOEExIC8qIHNhbXBsZS5ibXAgaW4gQ29weUZpbGVzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDc5NEVFNTA5RDIzNkU0MDAzRkM4QTEgLyogQ29weUZpbGVzICovID0geworCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlkc3RQYXRoID0gIiI7CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gMTY7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDc5NEVFNzA5RDIzNkVEMDAzRkM4QTEgLyogc2FtcGxlLmJtcCBpbiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwNzk0RUVDMDlEMjM3MUYwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxNjsKKwkJCWZpbGVzID0gKAorCQkJCTAwNzk0RUYwMDlEMjM3MzkwMDNGQzhBMSAvKiB1dGY4LnR4dCBpbiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwNzk0RUY0MDlEMjM3QzcwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxNjsKKwkJCWZpbGVzID0gKAorCQkJCTAwNzk0RUY3MDlEMjM3REUwMDNGQzhBMSAvKiBtb29zZS5kYXQgaW4gQ29weUZpbGVzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDc5NEVGQzA5RDIzODFDMDAzRkM4QTEgLyogQ29weUZpbGVzICovID0geworCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlkc3RQYXRoID0gIiI7CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gMTY7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDc5NEVGRTA5RDIzODJCMDAzRkM4QTEgLyogc2FpbC5ibXAgaW4gQ29weUZpbGVzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDc5NEYwMjA5RDIzODVGMDAzRkM4QTEgLyogQ29weUZpbGVzICovID0geworCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlkc3RQYXRoID0gIiI7CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gMTY7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDc5NEYwNDA5RDIzODY5MDAzRkM4QTEgLyogaWNvbi5ibXAgaW4gQ29weUZpbGVzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDc5NEYwOTA5RDIzOEUzMDAzRkM4QTEgLyogQ29weUZpbGVzICovID0geworCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlkc3RQYXRoID0gIiI7CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gMTY7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDc5NEYwQjA5RDIzOEY0MDAzRkM4QTEgLyogc2FtcGxlLmJtcCBpbiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwNzk0RjBGMDlEMjM5MjMwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxNjsKKwkJCWZpbGVzID0gKAorCQkJCTAwNzk0RjExMDlEMjM5MkIwMDNGQzhBMSAvKiBpY29uLmJtcCBpbiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwNzk0RjYxMDlEMjQxMjUwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxNjsKKwkJCWZpbGVzID0gKAorCQkJCTAwNzk0Rjg3MDlEMjQxM0IwMDNGQzhBMSAvKiBzYW1wbGUuYm1wIGluIENvcHlGaWxlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisJCTAwMkYzMzgxMDlDQTE0RjkwMEVCRUI4OCAvKiB0ZXN0LmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdC5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTAwMkYzMzk3MDlDQTE2QkYwMEVCRUI4OCAvKiB0ZXN0YmxpdHNwZWVkLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdGJsaXRzcGVlZC5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTAwMkYzMzlBMDlDQTE3QkMwMEVCRUI4OCAvKiB0ZXN0YmxpdHNwZWVkLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0ZXN0YmxpdHNwZWVkLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3RibGl0c3BlZWQuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGMzNBNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDb2NvYS5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTAwMkYzM0RCMDlDQTE5QTYwMEVCRUI4OCAvKiB0ZXN0ZHluZ2wuYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSB0ZXN0ZHluZ2wuYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQkwMDJGMzNFMjA5Q0ExQTBCMDBFQkVCODggLyogdGVzdGR5bmdsLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0ZXN0ZHluZ2wuYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdGVzdGR5bmdsLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjM0MTIwOUNBMUJGRjAwRUJFQjg4IC8qIHRlc3RmaWxlLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdGZpbGUuYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQkwMDJGMzQxNzA5Q0ExQzVCMDBFQkVCODggLyogdGVzdGZpbGUuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3RmaWxlLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3RmaWxlLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjM0MzEwOUNBMUYwMzAwRUJFQjg4IC8qIHRlc3RpY29udi5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHRlc3RpY29udi5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTAwMkYzNDM2MDlDQTFGNkYwMEVCRUI4OCAvKiB0ZXN0aWNvbnYuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3RpY29udi5jOyBwYXRoID0gLi4vLi4vdGVzdC90ZXN0aWNvbnYuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGMzQ0RDA5Q0ExRkIzMDBFQkVCODggLyogdGVzdG92ZXJsYXkyLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdG92ZXJsYXkyLmFwcDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMDAyRjM0NTIwOUNBMjAxQzAwRUJFQjg4IC8qIHRlc3RvdmVybGF5Mi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gdGVzdG92ZXJsYXkyLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3RvdmVybGF5Mi5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzNDZBMDlDQTIwNEYwMEVCRUI4OCAvKiB0ZXN0cGxhdGZvcm0uYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSB0ZXN0cGxhdGZvcm0uYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQkwMDJGMzQ2RjA5Q0EyMEE2MDBFQkVCODggLyogdGVzdHBsYXRmb3JtLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0ZXN0cGxhdGZvcm0uYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdGVzdHBsYXRmb3JtLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAzRkE2M0EwOTNGRkQ0MTAwMEM1M0IzIC8qIFNETC54Y29kZXByb2ogKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSAid3JhcHBlci5wYi1wcm9qZWN0IjsgbmFtZSA9IFNETC54Y29kZXByb2o7IHBhdGggPSAuLi9TREwvU0RMLnhjb2RlcHJvajsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDc5NEREODA5RDFGODk0MDAzRkM4QTEgLyogT3BlbkdMLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gT3BlbkdMLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL09wZW5HTC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTAwNzk0RTVEMDlEMjA4MzkwMDNGQzhBMSAvKiBpY29uLmJtcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGltYWdlLmJtcDsgbmFtZSA9IGljb24uYm1wOyBwYXRoID0gLi4vLi4vdGVzdC9pY29uLmJtcDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDc5NEU1RTA5RDIwODM5MDAzRkM4QTEgLyogbW9vc2UuZGF0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gZmlsZTsgbmFtZSA9IG1vb3NlLmRhdDsgcGF0aCA9IC4uLy4uL3Rlc3QvbW9vc2UuZGF0OyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwNzk0RTVGMDlEMjA4MzkwMDNGQzhBMSAvKiBwaWN0dXJlLnhibSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gcGljdHVyZS54Ym07IHBhdGggPSAuLi8uLi90ZXN0L3BpY3R1cmUueGJtOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwNzk0RTYwMDlEMjA4MzkwMDNGQzhBMSAvKiBzYWlsLmJtcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGltYWdlLmJtcDsgbmFtZSA9IHNhaWwuYm1wOyBwYXRoID0gLi4vLi4vdGVzdC9zYWlsLmJtcDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDc5NEU2MTA5RDIwODM5MDAzRkM4QTEgLyogc2FtcGxlLmJtcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGltYWdlLmJtcDsgbmFtZSA9IHNhbXBsZS5ibXA7IHBhdGggPSAuLi8uLi90ZXN0L3NhbXBsZS5ibXA7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDA3OTRFNjIwOUQyMDgzOTAwM0ZDOEExIC8qIHNhbXBsZS53YXYgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhdWRpby53YXY7IG5hbWUgPSBzYW1wbGUud2F2OyBwYXRoID0gLi4vLi4vdGVzdC9zYW1wbGUud2F2OyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwNzk0RTYzMDlEMjA4MzkwMDNGQzhBMSAvKiB1dGY4LnR4dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gdXRmOC50eHQ7IHBhdGggPSAuLi8uLi90ZXN0L3V0ZjgudHh0OyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA4M0U0ODcyMDA2RDg0Qzk3RjAwMDAwMSAvKiBsb29wd2F2ZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gbG9vcHdhdmUuYzsgcGF0aCA9IC4uLy4uL3Rlc3QvbG9vcHdhdmUuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwODNFNDg3NDAwNkQ4NEY3N0YwMDAwMDEgLyogdGVzdGFscGhhLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0ZXN0YWxwaGEuYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdGVzdGFscGhhLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDgzRTQ4NzYwMDZEODUyOTdGMDAwMDAxIC8qIHRlc3RjZHJvbS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gdGVzdGNkcm9tLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3RjZHJvbS5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA4M0U0ODc4MDA2RDg1MzU3RjAwMDAwMSAvKiB0ZXN0ZXJyb3IuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3RlcnJvci5jOyBwYXRoID0gLi4vLi4vdGVzdC90ZXN0ZXJyb3IuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwODNFNDg3QTAwNkQ4NTQ3N0YwMDAwMDEgLyogdGVzdGdhbW1hLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0ZXN0Z2FtbWEuYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdGVzdGdhbW1hLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDgzRTQ4N0MwMDZEODU2QjdGMDAwMDAxIC8qIHRlc3RwYWxldHRlLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0ZXN0cGFsZXR0ZS5jOyBwYXRoID0gLi4vLi4vdGVzdC90ZXN0cGFsZXR0ZS5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA4M0U0ODdFMDA2RDg2QTE3RjAwMDAwMSAvKiB0ZXN0c2VtLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0ZXN0c2VtLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3RzZW0uYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwODNFNDg3RjAwNkQ4NkExN0YwMDAwMDEgLyogdGVzdHNwcml0ZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gdGVzdHNwcml0ZS5jOyBwYXRoID0gLi4vLi4vdGVzdC90ZXN0c3ByaXRlLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDgzRTQ4ODAwMDZEODZBMTdGMDAwMDAxIC8qIHRlc3R0aW1lci5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gdGVzdHRpbWVyLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3R0aW1lci5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA4M0U0ODgyMDA2RDg2QTE3RjAwMDAwMSAvKiB0ZXN0dmVyLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0ZXN0dmVyLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3R2ZXIuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwODNFNDg4MzAwNkQ4NkExN0YwMDAwMDEgLyogdGVzdHZpZGluZm8uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3R2aWRpbmZvLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3R2aWRpbmZvLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDgzRTQ4ODQwMDZEODZBMTdGMDAwMDAxIC8qIHRlc3R3aW4uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3R3aW4uYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdGVzdHdpbi5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA4M0U0ODg1MDA2RDg2QTE3RjAwMDAwMSAvKiB0ZXN0d20uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3R3bS5jOyBwYXRoID0gLi4vLi4vdGVzdC90ZXN0d20uYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwODNFNDg4NjAwNkQ4NkExN0YwMDAwMDEgLyogdGhyZWFkd2luLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0aHJlYWR3aW4uYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdGhyZWFkd2luLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDgzRTQ4ODcwMDZEODZBMTdGMDAwMDAxIC8qIHRvcnR1cmV0aHJlYWQuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRvcnR1cmV0aHJlYWQuYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdG9ydHVyZXRocmVhZC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA5MkQ2RDEwRkZCMzBBMkM3RjAwMDAwMSAvKiBjaGVja2tleXMuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IGNoZWNra2V5cy5jOyBwYXRoID0gLi4vLi4vdGVzdC9jaGVja2tleXMuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwOTJENkQxQkZGQjMwQzIzN0YwMDAwMDEgLyogZ3JheXdpbi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gZ3JheXdpbi5jOyBwYXRoID0gLi4vLi4vdGVzdC9ncmF5d2luLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDkyRDZEMjVGRkIzMEQxQTdGMDAwMDAxIC8qIHRlc3RiaXRtYXAuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3RiaXRtYXAuYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdGVzdGJpdG1hcC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA5MkQ2RDRFRkZCMzExMDg3RjAwMDAwMSAvKiB0ZXN0Z2wuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3RnbC5jOyBwYXRoID0gLi4vLi4vdGVzdC90ZXN0Z2wuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwOTJENkQ1OEZGQjMxMUE5N0YwMDAwMDEgLyogdGVzdGhyZWFkLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB0ZXN0aHJlYWQuYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdGVzdGhyZWFkLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDkyRDZENjJGRkIzMTJBQTdGMDAwMDAxIC8qIHRlc3Rqb3lzdGljay5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gdGVzdGpveXN0aWNrLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3Rqb3lzdGljay5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA5MkQ2RDZDRkZCMzEzNDM3RjAwMDAwMSAvKiB0ZXN0a2V5cy5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gdGVzdGtleXMuYzsgcGF0aCA9IC4uLy4uL3Rlc3QvdGVzdGtleXMuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwOTJENkQ3NUZGQjMxM0JCN0YwMDAwMDEgLyogdGVzdGxvY2suYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3Rsb2NrLmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3Rsb2NrLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMkVFQ0RGM0IwMDg2QzVFQTdGMDAwMDAxIC8qIFNETE1haW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFNETE1haW4uaDsgcGF0aCA9IC4uLy4uL3NyYy9tYWluL21hY29zeC9TRExNYWluLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMkVFQ0RGM0MwMDg2QzVFQTdGMDAwMDAxIC8qIFNETE1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IFNETE1haW4ubTsgcGF0aCA9IC4uLy4uL3NyYy9tYWluL21hY29zeC9TRExNYWluLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMkVFQ0RGM0QwMDg2QzVFQTdGMDAwMDAxIC8qIFNETE1haW4ubmliICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5uaWI7IG5hbWUgPSBTRExNYWluLm5pYjsgcGF0aCA9IC4uLy4uL3NyYy9tYWluL21hY29zeC9TRExNYWluLm5pYjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlCMjA3RkYyNDA0RTFCMTk2MDBBODAwMDIgLyogbGlic2RsbWFpbl9wcmVmaXguaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gbGlic2RsbWFpbl9wcmVmaXguaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQkVDNTY2QjYwNzYxRDkwMzAwQTMzMDI5IC8qIGNoZWNra2V5cy5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGNoZWNra2V5cy5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQzU2NkMzMDc2MUQ5MDMwMEEzMzAyOSAvKiBncmF5d2luLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gZ3JheXdpbi5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQzU2NkQxMDc2MUQ5MDMwMEEzMzAyOSAvKiBsb29wd2F2ZS5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGxvb3B3YXZlLmFwcDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJQkVDNTY2REYwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RhbHBoYS5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHRlc3RhbHBoYS5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQzU2NkVDMDc2MUQ5MDMwMEEzMzAyOSAvKiB0ZXN0Yml0bWFwLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdGJpdG1hcC5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQzU2NkY5MDc2MUQ5MDMwMEEzMzAyOSAvKiB0ZXN0Y2Ryb20uYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSB0ZXN0Y2Ryb20uYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlCRUM1NjcwNjA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGVycm9yLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdGVycm9yLmFwcDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJQkVDNTY3MTQwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RnYW1tYS5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHRlc3RnYW1tYS5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQzU2NzIxMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0Z2wuYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSB0ZXN0Z2wuYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlCRUM1NjcyRTA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdHRocmVhZC5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHRlc3R0aHJlYWQuYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlCRUM1NjczQjA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGpveXN0aWNrLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdGpveXN0aWNrLmFwcDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJQkVDNTY3NDgwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RrZXlzLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdGtleXMuYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlCRUM1Njc1NTA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGxvY2suYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSB0ZXN0bG9jay5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQzU2NzYyMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0b3ZlcmxheS5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHRlc3RvdmVybGF5LmFwcDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJQkVDNTY3NzAwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3RwYWxldHRlLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdHBhbGV0dGUuYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlCRUM1Njc3RDA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHNlbS5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHRlc3RzZW0uYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlCRUM1Njc4QjA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHNwcml0ZS5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHRlc3RzcHJpdGUuYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlCRUM1Njc5ODA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHRpbWVyLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdHRpbWVyLmFwcDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJQkVDNTY3QjIwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R2ZXJzaW9uLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdHZlcnNpb24uYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlCRUM1NjdCRjA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHZpZGluZm8uYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSB0ZXN0dmlkaW5mby5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQzU2N0NEMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0d2luLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGVzdHdpbi5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUJFQzU2N0RCMDc2MUQ5MDYwMEEzMzAyOSAvKiB0ZXN0d20uYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSB0ZXN0d20uYXBwOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlCRUM1NjdFODA3NjFEOTA2MDBBMzMwMjkgLyogdGhyZWFkd2luLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdGhyZWFkd2luLmFwcDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJQkVDNTY3RjUwNzYxRDkwNjAwQTMzMDI5IC8qIHRvcnR1cmV0aHJlYWQuYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSB0b3J0dXJldGhyZWFkLmFwcDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJQkVDNTY3RkYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gbGlic2RsbWFpbi5hOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlGNTdEQzM5ODAyQTZFNkEyMDFEMjg3NjIgLyogdGVzdG92ZXJsYXkuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHRlc3RvdmVybGF5LmM7IHBhdGggPSAuLi8uLi90ZXN0L3Rlc3RvdmVybGF5LmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKy8qIEVuZCBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkwMDJGMzM3ODA5Q0ExNEY5MDBFQkVCODggLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzMzc5MDlDQTE0RjkwMEVCRUI4OCAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzM3QTA5Q0ExNEY5MDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0E5MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMDAyRjMzOEUwOUNBMTZCRjAwRUJFQjg4IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzM4RjA5Q0ExNkJGMDBFQkVCODggLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzOTAwOUNBMTZCRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzNBODA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzM0QxMDlDQTE5QTYwMEVCRUI4OCAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjMzRDIwOUNBMTlBNjAwRUJFQjg4IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0QzMDlDQTE5QTYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzRDQwOUNBMTlBNjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDJGMzQwODA5Q0ExQkZGMDBFQkVCODggLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzNDA5MDlDQTFCRkYwMEVCRUI4OCAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzQwQTA5Q0ExQkZGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzNDBCMDlDQTFCRkYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMDAyRjM0MjcwOUNBMUYwMzAwRUJFQjg4IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzQyODA5Q0ExRjAzMDBFQkVCODggLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjM0MjkwOUNBMUYwMzAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzQyQTA5Q0ExRjAzMDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzNDQzMDlDQTFGQjMwMEVCRUI4OCAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjM0NDQwOUNBMUZCMzAwRUJFQjg4IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzNDQ1MDlDQTFGQjMwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjM0NDYwOUNBMUZCMzAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDJGMzQ2MDA5Q0EyMDRGMDBFQkVCODggLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzNDYxMDlDQTIwNEYwMEVCRUI4OCAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzQ2MjA5Q0EyMDRGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzNDYzMDlDQTIwNEYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY2QjIwNzYxRDkwMzAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njg2MjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAzRkE2NEQwOTNGRkRCMzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzNDMTA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkJGMDc2MUQ5MDMwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY4NjMwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwM0ZBNjRFMDkzRkZEQjUwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzQzAwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjZDQzA3NjFEOTAzMDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2ODY0MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDNGQTY0RjA5M0ZGREI3MDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0JGMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY2REEwNzYxRDkwMzAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njg2NTA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAzRkE2NTAwOTNGRkRCQTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzNCRTA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkU4MDc2MUQ5MDMwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY4NjYwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwM0ZBNjUxMDkzRkZEQkMwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzQkQwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjZGNTA3NjFEOTAzMDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2ODY3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDNGQTY1MjA5M0ZGREJFMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0JCMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3MDIwNzYxRDkwMzAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njg2ODA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAzRkE2NTMwOTNGRkRDMTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzNCQzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzBGMDc2MUQ5MDQwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY4NjkwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwM0ZBNjU0MDkzRkZEQzMwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzQkEwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjcxRDA3NjFEOTA0MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2ODZBMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDNGQTY1NTA5M0ZGREM2MDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0I5MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDc5NEREOTA5RDFGODk0MDAzRkM4QTEgLyogT3BlbkdMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjcyQTA3NjFEOTA0MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2ODZCMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDNGQTY1NjA5M0ZGREM4MDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0I4MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3MzcwNzYxRDkwNDAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njg2QzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAzRkE2NTcwOTNGRkRDQTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzNCNzA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzQ0MDc2MUQ5MDQwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY4NkQwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwM0ZBNjU4MDkzRkZEQ0MwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzQjUwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc1MTA3NjFEOTA0MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2ODZFMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDNGQTY1OTA5M0ZGRENGMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0I2MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3NUUwNzYxRDkwNDAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njg2RjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAzRkE2NUEwOTNGRkREMTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzNCNDA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzZCMDc2MUQ5MDQwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY4NzAwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwM0ZBNjVCMDkzRkZERDMwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzQjMwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc3OTA3NjFEOTA1MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2ODcxMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDNGQTY1QzA5M0ZGREQ1MDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0IyMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3ODYwNzYxRDkwNTAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njg3MjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAzRkE2NUQwOTNGRkRENzAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzNCMTA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2Nzk0MDc2MUQ5MDUwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY4NzMwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwM0ZBNjVFMDkzRkZEREEwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzQjAwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdBRTA3NjFEOTA1MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2ODc1MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDNGQTY2MDA5M0ZGRERGMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0FGMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3QkIwNzYxRDkwNTAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njg3NjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAzRkE2NjEwOTNGRkRFMTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzNBRTA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2N0M4MDc2MUQ5MDUwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY4NzcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwM0ZBNjYyMDkzRkZERTMwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzQUQwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdENjA3NjFEOTA1MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2ODc4MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDNGQTY2MzA5M0ZGREU2MDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzM0FDMDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3RTQwNzYxRDkwNjAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njg3OTA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAzRkE2NjUwOTNGRkRFQTAwMEM1M0IzIC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzNBQjA5Q0ExODg2MDBFQkVCODggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2N0YxMDc2MUQ5MDYwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY4N0EwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwM0ZBNjY0MDkzRkZERTgwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjMzQUEwOUNBMTg4NjAwRUJFQjg4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdGRDA3NjFEOTA2MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwMDJGMzNBMjA5Q0ExODNCMDBFQkVCODggLyogTGlua2VkIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwNzk0REQ4MDlEMUY4OTQwMDNGQzhBMSAvKiBPcGVuR0wuZnJhbWV3b3JrICovLAorCQkJCTAwMkYzM0E3MDlDQTE4ODYwMEVCRUI4OCAvKiBDb2NvYS5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJMaW5rZWQgRnJhbWV3b3JrcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwMDNGQTYzQjA5M0ZGRDQxMDAwQzUzQjMgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwM0ZBNjQzMDkzRkZENDEwMDBDNTNCMyAvKiBTREwuZnJhbWV3b3JrICovLAorCQkJCTAwM0ZBNjQ1MDkzRkZENDEwMDBDNTNCMyAvKiBsaWJTREwuYSAqLywKKwkJCQkwMDNGQTY0NzA5M0ZGRDQxMDAwQzUzQjMgLyogbGliU0RMbWFpbi5hICovLAorCQkJCTAwM0ZBNjQ5MDkzRkZENDEwMDBDNTNCMyAvKiBTdGFuZGFyZCBETUcgKi8sCisJCQkJMDAzRkE2NEIwOTNGRkQ0MTAwMEM1M0IzIC8qIERldmVsb3BlciBFeHRyYXMgUGFja2FnZSAqLywKKwkJCSk7CisJCQluYW1lID0gUHJvZHVjdHM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwMDc5NEU0NjA5RDIwN0I0MDAzRkM4QTEgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDc5NEU1RDA5RDIwODM5MDAzRkM4QTEgLyogaWNvbi5ibXAgKi8sCisJCQkJMDA3OTRFNUUwOUQyMDgzOTAwM0ZDOEExIC8qIG1vb3NlLmRhdCAqLywKKwkJCQkwMDc5NEU1RjA5RDIwODM5MDAzRkM4QTEgLyogcGljdHVyZS54Ym0gKi8sCisJCQkJMDA3OTRFNjAwOUQyMDgzOTAwM0ZDOEExIC8qIHNhaWwuYm1wICovLAorCQkJCTAwNzk0RTYxMDlEMjA4MzkwMDNGQzhBMSAvKiBzYW1wbGUuYm1wICovLAorCQkJCTAwNzk0RTYyMDlEMjA4MzkwMDNGQzhBMSAvKiBzYW1wbGUud2F2ICovLAorCQkJCTAwNzk0RTYzMDlEMjA4MzkwMDNGQzhBMSAvKiB1dGY4LnR4dCAqLywKKwkJCSk7CisJCQluYW1lID0gUmVzb3VyY2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDhGQjc3OTRGRTg0MTU1REMwMkFBQzA3IC8qIFNETFRlc3QgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwM0ZBNjNBMDkzRkZENDEwMDBDNTNCMyAvKiBTREwueGNvZGVwcm9qICovLAorCQkJCTA4RkI3Nzk1RkU4NDE1NURDMDJBQUMwNyAvKiBTb3VyY2UgKi8sCisJCQkJMkVFQ0RGM0IwMDg2QzVFQTdGMDAwMDAxIC8qIFNETE1haW4uaCAqLywKKwkJCQkyRUVDREYzQzAwODZDNUVBN0YwMDAwMDEgLyogU0RMTWFpbi5tICovLAorCQkJCUIyMDdGRjI0MDRFMUIxOTYwMEE4MDAwMiAvKiBsaWJzZGxtYWluX3ByZWZpeC5oICovLAorCQkJCTJFRUNERjNEMDA4NkM1RUE3RjAwMDAwMSAvKiBTRExNYWluLm5pYiAqLywKKwkJCQkwMDJGMzNBMjA5Q0ExODNCMDBFQkVCODggLyogTGlua2VkIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3OTRFNDYwOUQyMDdCNDAwM0ZDOEExIC8qIFJlc291cmNlcyAqLywKKwkJCQkxQUI2NzRBREZFOUQ1NEI1MTFDQTJDQkIgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJY29tbWVudHMgPSAiSSBtYWRlIHRoZXNlIHRlc3RzIGxpbmsgYWdhaW5zdCBvdXIgXCJkZWZhdWx0XCIgZnJhbWV3b3JrIHdoaWNoIGluY2x1ZGVzIFgxMSBzdHVmZi4gSWYgeW91IGRpZG4ndCBpbnN0YWxsIHRoZSBYMTEgaGVhZGVycyB3aXRoIFhjb2RlLCB5b3UgbWlnaHQgaGF2ZSBwcm9ibGVtcyBidWlsZGluZyB0aGUgU0RMLmZyYW1ld29yayAod2hpY2ggaXMgYSBkZXBlbmRlbmN5KS4gWW91IGNhbiBzd2FwIHRoZSBkZXBlbmRlbmNpZXMgYXJvdW5kIHRvIGdldCBhcm91bmQgdGhpcywgb3IgeW91IGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgU0RMLmZyYW1ld29yayB0YXJnZXQgdG8gbm90IGluY2x1ZGUgWDExIHN0dWZmLiAoR28gaW50byBpdHMgdGFyZ2V0IGJ1aWxkIG9wdGlvbnMgYW5kIHJlbW92ZSBhbGwgdGhlIFByZXByb2Nlc3NvciBtYWNyb3MuKVxuXG5cblxuV2UgYXJlIHNvcnQgb2YgaW4gYSBoYWxmLXdheSBzdGF0ZSBhdCB0aGUgbW9tZW50LiBHb2luZyBcImFsbC10aGUtd2F5XCIgbWVhbnMgd2UgY29weSB0aGUgU0RMLmZyYW1ld29yayBpbnNpZGUgdGhlIGFwcCBidW5kbGUgc28gd2UgY2FuIHJ1biB0aGUgdGVzdCB3aXRob3V0IHRoZSBzdGVwIG9mIHRoZSB1c2VyIFwiaW5zdGFsbGluZ1wiIHRoZSBmcmFtZXdvcmsuIEJ1dCB0aGVyZSBpcyBhbiBvdmVyc2lnaHQvYnVnIGluIFhjb2RlIHRoYXQgZG9lc24ndCBjb3JyZWN0bHkgZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIGZyYW1ld29yayB3aGVuIGluIGFuIGVtYmVkZGVkL25lc3RlZCBYY29kZSBwcm9qZWN0LiBXZSBjb3VsZCBwcm9iYWJseSB0cnkgdG8gaGFjayB0aGlzIHdpdGggYSBzaGVsbCBzY3JpcHQgdGhhdCBjaGVja3MgbXVsdGlwbGUgZGlyZWN0b3JpZXMgZm9yIGV4aXN0ZW5jZSwgYnV0IHRoaXMgaXMgbWVzc2llciBhbmQgbW9yZSB3b3JrIHRoYW4gSSBwcmVmZXIsIHNvIEkgcmF0aGVyIGp1c3Qgd2FpdCBmb3IgQXBwbGUgdG8gZml4IHRoaXMuIEluIHRoZSBtZWFudGltZS4uLlxuXG5UaGUgXCJBbGxcIiB0YXJnZXQgd2lsbCBidWlsZCB0aGUgU0RMIGZyYW1ld29yayBmcm9tIHRoZSBYY29kZSBwcm9qZWN0LiBUaGUgb3RoZXIgdGFyZ2V0cyBkbyBub3QgaGF2ZSB0aGlzIGRlcGVuZGVuY3kgc2V0IChmb3IgZmxleGliaWxpdHkgcmVhc29ucyBpbiBjYXNlIHdlIG1ha2UgY2hhbmdlcykuIElmIHlvdSBoYXZlIG5vdCBidWlsdCB0aGUgZnJhbWV3b3JrLCB5b3Ugd2lsbCBwcm9iYWJseSBiZSB1bmFibGUgdG8gbGluay4gWW91IHdpbGwgZWl0aGVyIG5lZWQgdG8gYnVpbGQgdGhlIGZyYW1ld29yaywgb3IgeW91IG5lZWQgdG8gYWRkIFwiLWZyYW1ld29yayBTRExcIiB0byB0aGUgbGluayBvcHRpb25zIGFuZCBtYWtlIHN1cmUgeW91IGhhdmUgdGhlIFNETC5mcmFtZXdvcmsgaW5zdGFsbGVkIHNvbWV3aGVyZSB3aGVyZSBpdCBjYW4gYmUgc2VlbiAobGlrZSAvTGlicmFyeS9GcmFtZXdvcmtzLi4uSSB0aGluayB3ZSBhbHJlYWR5IHNldCB0aGlzIG9uZSB1cC4pIFxuXG5UbyBydW4gdGhvdWdoLCB5b3Ugc2hvdWxkIGhhdmUgYSBjb3B5IG9mIHRoZSBTREwuZnJhbWV3b3JrIGluIC9MaWJyYXJ5L0ZyYW1ld29ya3Mgb3Igfi9MaWJyYXJ5L0ZyYW1ld29ya3MuXG5cblxuXG5cbnRlc3RnbCBhbmQgdGVzdGR5bmdsIG5lZWQgLURIQVZFX09QRU5HTFxudGVzdGdsIG5lZWRzIHRvIGxpbmsgYWdhaW5zdCBPcGVuR0wuZnJhbWV3b3JrXG5cbiI7CisJCQluYW1lID0gU0RMVGVzdDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4RkI3Nzk1RkU4NDE1NURDMDJBQUMwNyAvKiBTb3VyY2UgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA5MkQ2RDEwRkZCMzBBMkM3RjAwMDAwMSAvKiBjaGVja2tleXMuYyAqLywKKwkJCQkwOTJENkQxQkZGQjMwQzIzN0YwMDAwMDEgLyogZ3JheXdpbi5jICovLAorCQkJCTA4M0U0ODcyMDA2RDg0Qzk3RjAwMDAwMSAvKiBsb29wd2F2ZS5jICovLAorCQkJCTA4M0U0ODc0MDA2RDg0Rjc3RjAwMDAwMSAvKiB0ZXN0YWxwaGEuYyAqLywKKwkJCQkwOTJENkQyNUZGQjMwRDFBN0YwMDAwMDEgLyogdGVzdGJpdG1hcC5jICovLAorCQkJCTAwMkYzMzlBMDlDQTE3QkMwMEVCRUI4OCAvKiB0ZXN0YmxpdHNwZWVkLmMgKi8sCisJCQkJMDgzRTQ4NzYwMDZEODUyOTdGMDAwMDAxIC8qIHRlc3RjZHJvbS5jICovLAorCQkJCTAwMkYzM0UyMDlDQTFBMEIwMEVCRUI4OCAvKiB0ZXN0ZHluZ2wuYyAqLywKKwkJCQkwODNFNDg3ODAwNkQ4NTM1N0YwMDAwMDEgLyogdGVzdGVycm9yLmMgKi8sCisJCQkJMDAyRjM0MzYwOUNBMUY2RjAwRUJFQjg4IC8qIHRlc3RpY29udi5jICovLAorCQkJCTAwMkYzNDE3MDlDQTFDNUIwMEVCRUI4OCAvKiB0ZXN0ZmlsZS5jICovLAorCQkJCTA4M0U0ODdBMDA2RDg1NDc3RjAwMDAwMSAvKiB0ZXN0Z2FtbWEuYyAqLywKKwkJCQkwOTJENkQ0RUZGQjMxMTA4N0YwMDAwMDEgLyogdGVzdGdsLmMgKi8sCisJCQkJMDkyRDZENThGRkIzMTFBOTdGMDAwMDAxIC8qIHRlc3RocmVhZC5jICovLAorCQkJCTA5MkQ2RDYyRkZCMzEyQUE3RjAwMDAwMSAvKiB0ZXN0am95c3RpY2suYyAqLywKKwkJCQkwOTJENkQ2Q0ZGQjMxMzQzN0YwMDAwMDEgLyogdGVzdGtleXMuYyAqLywKKwkJCQkwOTJENkQ3NUZGQjMxM0JCN0YwMDAwMDEgLyogdGVzdGxvY2suYyAqLywKKwkJCQlGNTdEQzM5ODAyQTZFNkEyMDFEMjg3NjIgLyogdGVzdG92ZXJsYXkuYyAqLywKKwkJCQkwMDJGMzQ1MjA5Q0EyMDFDMDBFQkVCODggLyogdGVzdG92ZXJsYXkyLmMgKi8sCisJCQkJMDgzRTQ4N0MwMDZEODU2QjdGMDAwMDAxIC8qIHRlc3RwYWxldHRlLmMgKi8sCisJCQkJMDAyRjM0NkYwOUNBMjBBNjAwRUJFQjg4IC8qIHRlc3RwbGF0Zm9ybS5jICovLAorCQkJCTA4M0U0ODdFMDA2RDg2QTE3RjAwMDAwMSAvKiB0ZXN0c2VtLmMgKi8sCisJCQkJMDgzRTQ4N0YwMDZEODZBMTdGMDAwMDAxIC8qIHRlc3RzcHJpdGUuYyAqLywKKwkJCQkwODNFNDg4MDAwNkQ4NkExN0YwMDAwMDEgLyogdGVzdHRpbWVyLmMgKi8sCisJCQkJMDgzRTQ4ODIwMDZEODZBMTdGMDAwMDAxIC8qIHRlc3R2ZXIuYyAqLywKKwkJCQkwODNFNDg4MzAwNkQ4NkExN0YwMDAwMDEgLyogdGVzdHZpZGluZm8uYyAqLywKKwkJCQkwODNFNDg4NDAwNkQ4NkExN0YwMDAwMDEgLyogdGVzdHdpbi5jICovLAorCQkJCTA4M0U0ODg1MDA2RDg2QTE3RjAwMDAwMSAvKiB0ZXN0d20uYyAqLywKKwkJCQkwODNFNDg4NjAwNkQ4NkExN0YwMDAwMDEgLyogdGhyZWFkd2luLmMgKi8sCisJCQkJMDgzRTQ4ODcwMDZEODZBMTdGMDAwMDAxIC8qIHRvcnR1cmV0aHJlYWQuYyAqLywKKwkJCSk7CisJCQluYW1lID0gU291cmNlOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUFCNjc0QURGRTlENTRCNTExQ0EyQ0JCIC8qIFByb2R1Y3RzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlCRUM1NjZCNjA3NjFEOTAzMDBBMzMwMjkgLyogY2hlY2trZXlzLmFwcCAqLywKKwkJCQlCRUM1NjZDMzA3NjFEOTAzMDBBMzMwMjkgLyogZ3JheXdpbi5hcHAgKi8sCisJCQkJQkVDNTY2RDEwNzYxRDkwMzAwQTMzMDI5IC8qIGxvb3B3YXZlLmFwcCAqLywKKwkJCQlCRUM1NjZERjA3NjFEOTAzMDBBMzMwMjkgLyogdGVzdGFscGhhLmFwcCAqLywKKwkJCQlCRUM1NjZFQzA3NjFEOTAzMDBBMzMwMjkgLyogdGVzdGJpdG1hcC5hcHAgKi8sCisJCQkJQkVDNTY2RjkwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RjZHJvbS5hcHAgKi8sCisJCQkJQkVDNTY3MDYwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RlcnJvci5hcHAgKi8sCisJCQkJQkVDNTY3MTQwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RnYW1tYS5hcHAgKi8sCisJCQkJQkVDNTY3MjEwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RnbC5hcHAgKi8sCisJCQkJQkVDNTY3MkUwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3R0aHJlYWQuYXBwICovLAorCQkJCUJFQzU2NzNCMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0am95c3RpY2suYXBwICovLAorCQkJCUJFQzU2NzQ4MDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0a2V5cy5hcHAgKi8sCisJCQkJQkVDNTY3NTUwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3Rsb2NrLmFwcCAqLywKKwkJCQlCRUM1Njc2MjA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdG92ZXJsYXkuYXBwICovLAorCQkJCUJFQzU2NzcwMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0cGFsZXR0ZS5hcHAgKi8sCisJCQkJQkVDNTY3N0QwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3RzZW0uYXBwICovLAorCQkJCUJFQzU2NzhCMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0c3ByaXRlLmFwcCAqLywKKwkJCQlCRUM1Njc5ODA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHRpbWVyLmFwcCAqLywKKwkJCQlCRUM1NjdCMjA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHZlcnNpb24uYXBwICovLAorCQkJCUJFQzU2N0JGMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0dmlkaW5mby5hcHAgKi8sCisJCQkJQkVDNTY3Q0QwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R3aW4uYXBwICovLAorCQkJCUJFQzU2N0RCMDc2MUQ5MDYwMEEzMzAyOSAvKiB0ZXN0d20uYXBwICovLAorCQkJCUJFQzU2N0U4MDc2MUQ5MDYwMEEzMzAyOSAvKiB0aHJlYWR3aW4uYXBwICovLAorCQkJCUJFQzU2N0Y1MDc2MUQ5MDYwMEEzMzAyOSAvKiB0b3J0dXJldGhyZWFkLmFwcCAqLywKKwkJCQlCRUM1NjdGRjA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hICovLAorCQkJCTAwMkYzMzgxMDlDQTE0RjkwMEVCRUI4OCAvKiB0ZXN0LmFwcCAqLywKKwkJCQkwMDJGMzM5NzA5Q0ExNkJGMDBFQkVCODggLyogdGVzdGJsaXRzcGVlZC5hcHAgKi8sCisJCQkJMDAyRjMzREIwOUNBMTlBNjAwRUJFQjg4IC8qIHRlc3RkeW5nbC5hcHAgKi8sCisJCQkJMDAyRjM0MTIwOUNBMUJGRjAwRUJFQjg4IC8qIHRlc3RmaWxlLmFwcCAqLywKKwkJCQkwMDJGMzQzMTA5Q0ExRjAzMDBFQkVCODggLyogdGVzdGljb252LmFwcCAqLywKKwkJCQkwMDJGMzQ0RDA5Q0ExRkIzMDBFQkVCODggLyogdGVzdG92ZXJsYXkyLmFwcCAqLywKKwkJCQkwMDJGMzQ2QTA5Q0EyMDRGMDBFQkVCODggLyogdGVzdHBsYXRmb3JtLmFwcCAqLywKKwkJCSk7CisJCQluYW1lID0gUHJvZHVjdHM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkwMDJGMzM3MzA5Q0ExNEY5MDBFQkVCODggLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDJGMzM4OTA5Q0ExNkJGMDBFQkVCODggLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDJGMzNDRDA5Q0ExOUE2MDBFQkVCODggLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDJGMzQwNDA5Q0ExQkZGMDBFQkVCODggLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDJGMzQyMzA5Q0ExRjAzMDBFQkVCODggLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDJGMzQzRjA5Q0ExRkIzMDBFQkVCODggLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkwMDJGMzQ1QzA5Q0EyMDRGMDBFQkVCODggLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjZBRDA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjZCQTA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjZDNzA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjZENTA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjZFMzA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjZGMDA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjZGRDA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjcwQTA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjcxODA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjcyNTA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjczMjA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjczRjA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc0QzA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc1OTA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc2NjA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc3NDA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc4MTA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc4RjA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdBOTA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdCNjA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdDMzA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdEMTA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdERjA3NjFEOTA2MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdFQzA3NjFEOTA2MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdGODA3NjFEOTA2MDBBMzMwMjkgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2N0Y5MDc2MUQ5MDYwMEEzMzAyOSAvKiBTRExNYWluLmggaW4gSGVhZGVycyAqLywKKwkJCQlCRUM1NjdGQTA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbl9wcmVmaXguaCBpbiBIZWFkZXJzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJMDAyRjMzNzAwOUNBMTRGOTAwRUJFQjg4IC8qIHRlc3QgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAyRjMzN0QwOUNBMTRGOTAwRUJFQjg4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTAwMkYzMzczMDlDQTE0RjkwMEVCRUI4OCAvKiBIZWFkZXJzICovLAorCQkJCTAwMkYzMzc0MDlDQTE0RjkwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJMDAyRjMzNzYwOUNBMTRGOTAwRUJFQjg4IC8qIFNvdXJjZXMgKi8sCisJCQkJMDAyRjMzNzgwOUNBMTRGOTAwRUJFQjg4IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMDAyRjMzNzEwOUNBMTRGOTAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IHRlc3Q7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChVU0VSX0FQUFNfRElSKSI7CisJCQlwcm9kdWN0TmFtZSA9IHRlc3RhbHBoYTsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAwMDJGMzM4MTA5Q0ExNEY5MDBFQkVCODggLyogdGVzdC5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJMDAyRjMzODYwOUNBMTZCRjAwRUJFQjg4IC8qIHRlc3RibGl0c3BlZWQgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAyRjMzOTMwOUNBMTZCRjAwRUJFQjg4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0YmxpdHNwZWVkIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTAwMkYzMzg5MDlDQTE2QkYwMEVCRUI4OCAvKiBIZWFkZXJzICovLAorCQkJCTAwMkYzMzhBMDlDQTE2QkYwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJMDAyRjMzOEMwOUNBMTZCRjAwRUJFQjg4IC8qIFNvdXJjZXMgKi8sCisJCQkJMDAyRjMzOEUwOUNBMTZCRjAwRUJFQjg4IC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3OTRFQTkwOUQyMzRFODAwM0ZDOEExIC8qIENvcHlGaWxlcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkwMDJGMzM4NzA5Q0ExNkJGMDBFQkVCODggLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gdGVzdGJsaXRzcGVlZDsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdGFscGhhOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDAwMkYzMzk3MDlDQTE2QkYwMEVCRUI4OCAvKiB0ZXN0YmxpdHNwZWVkLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQkwMDJGMzNDQTA5Q0ExOUE2MDBFQkVCODggLyogdGVzdGR5bmdsICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMkYzM0Q3MDlDQTE5QTYwMEVCRUI4OCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdGR5bmdsIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTAwMkYzM0NEMDlDQTE5QTYwMEVCRUI4OCAvKiBIZWFkZXJzICovLAorCQkJCTAwMkYzM0NFMDlDQTE5QTYwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJMDAyRjMzRDAwOUNBMTlBNjAwRUJFQjg4IC8qIFNvdXJjZXMgKi8sCisJCQkJMDAyRjMzRDEwOUNBMTlBNjAwRUJFQjg4IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMDAyRjMzQ0IwOUNBMTlBNjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IHRlc3RkeW5nbDsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdGFscGhhOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDAwMkYzM0RCMDlDQTE5QTYwMEVCRUI4OCAvKiB0ZXN0ZHluZ2wuYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCTAwMkYzNDAxMDlDQTFCRkYwMEVCRUI4OCAvKiB0ZXN0ZmlsZSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDJGMzQwRTA5Q0ExQkZGMDBFQkVCODggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RmaWxlIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTAwMkYzNDA0MDlDQTFCRkYwMEVCRUI4OCAvKiBIZWFkZXJzICovLAorCQkJCTAwMkYzNDA1MDlDQTFCRkYwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJMDAyRjM0MDcwOUNBMUJGRjAwRUJFQjg4IC8qIFNvdXJjZXMgKi8sCisJCQkJMDAyRjM0MDgwOUNBMUJGRjAwRUJFQjg4IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMDAyRjM0MDIwOUNBMUJGRjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IHRlc3RmaWxlOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0YWxwaGE7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gMDAyRjM0MTIwOUNBMUJGRjAwRUJFQjg4IC8qIHRlc3RmaWxlLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQkwMDJGMzQyMDA5Q0ExRjAzMDBFQkVCODggLyogdGVzdGljb252ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMkYzNDJEMDlDQTFGMDMwMEVCRUI4OCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdGljb252IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTAwMkYzNDIzMDlDQTFGMDMwMEVCRUI4OCAvKiBIZWFkZXJzICovLAorCQkJCTAwMkYzNDI0MDlDQTFGMDMwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJMDAyRjM0MjYwOUNBMUYwMzAwRUJFQjg4IC8qIFNvdXJjZXMgKi8sCisJCQkJMDAyRjM0MjcwOUNBMUYwMzAwRUJFQjg4IC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3OTRFRUMwOUQyMzcxRjAwM0ZDOEExIC8qIENvcHlGaWxlcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkwMDJGMzQyMTA5Q0ExRjAzMDBFQkVCODggLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gdGVzdGljb252OworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0YWxwaGE7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gMDAyRjM0MzEwOUNBMUYwMzAwRUJFQjg4IC8qIHRlc3RpY29udi5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJMDAyRjM0M0MwOUNBMUZCMzAwRUJFQjg4IC8qIHRlc3RvdmVybGF5MiAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDJGMzQ0OTA5Q0ExRkIzMDBFQkVCODggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RvdmVybGF5MiIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQkwMDJGMzQzRjA5Q0ExRkIzMDBFQkVCODggLyogSGVhZGVycyAqLywKKwkJCQkwMDJGMzQ0MDA5Q0ExRkIzMDBFQkVCODggLyogUmVzb3VyY2VzICovLAorCQkJCTAwMkYzNDQyMDlDQTFGQjMwMEVCRUI4OCAvKiBTb3VyY2VzICovLAorCQkJCTAwMkYzNDQzMDlDQTFGQjMwMEVCRUI4OCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzk0RUY0MDlEMjM3QzcwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMDAyRjM0M0QwOUNBMUZCMzAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IHRlc3RvdmVybGF5MjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdGFscGhhOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDAwMkYzNDREMDlDQTFGQjMwMEVCRUI4OCAvKiB0ZXN0b3ZlcmxheTIuYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCTAwMkYzNDU5MDlDQTIwNEYwMEVCRUI4OCAvKiB0ZXN0cGxhdGZvcm0gKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAyRjM0NjYwOUNBMjA0RjAwRUJFQjg4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0cGxhdGZvcm0iICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMDAyRjM0NUMwOUNBMjA0RjAwRUJFQjg4IC8qIEhlYWRlcnMgKi8sCisJCQkJMDAyRjM0NUQwOUNBMjA0RjAwRUJFQjg4IC8qIFJlc291cmNlcyAqLywKKwkJCQkwMDJGMzQ1RjA5Q0EyMDRGMDBFQkVCODggLyogU291cmNlcyAqLywKKwkJCQkwMDJGMzQ2MDA5Q0EyMDRGMDBFQkVCODggLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkwMDJGMzQ1QTA5Q0EyMDRGMDBFQkVCODggLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gdGVzdHBsYXRmb3JtOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0YWxwaGE7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gMDAyRjM0NkEwOUNBMjA0RjAwRUJFQjg4IC8qIHRlc3RwbGF0Zm9ybS5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJQkVDNTY2QUIwNzYxRDkwMzAwQTMzMDI5IC8qIGNoZWNra2V5cyAoVXBncmFkZWQpICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMUI1OTM4MDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiY2hlY2trZXlzIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY2QUQwNzYxRDkwMzAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY2QUUwNzYxRDkwMzAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1NjZCMDA3NjFEOTAzMDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1NjZCMjA3NjFEOTAzMDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQlCRUM1NjgzMTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gImNoZWNra2V5cyAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gY2hlY2trZXlzOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQzU2NkI2MDc2MUQ5MDMwMEEzMzAyOSAvKiBjaGVja2tleXMuYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCUJFQzU2NkI4MDc2MUQ5MDMwMEEzMzAyOSAvKiBncmF5d2luIChVcGdyYWRlZCkgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAxQjU5M0MwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJncmF5d2luIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY2QkEwNzYxRDkwMzAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY2QkIwNzYxRDkwMzAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1NjZCRDA3NjFEOTAzMDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1NjZCRjA3NjFEOTAzMDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQlCRUM1NjgzMzA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gImdyYXl3aW4gKFVwZ3JhZGVkKSI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChVU0VSX0FQUFNfRElSKSI7CisJCQlwcm9kdWN0TmFtZSA9IGdyYXl3aW47CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY2QzMwNzYxRDkwMzAwQTMzMDI5IC8qIGdyYXl3aW4uYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCUJFQzU2NkM1MDc2MUQ5MDMwMEEzMzAyOSAvKiBsb29wd2F2ZSAoVXBncmFkZWQpICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMUI1OTQwMDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibG9vcHdhdmUgKFVwZ3JhZGVkKSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlCRUM1NjZDNzA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLywKKwkJCQlCRUM1NjZDODA3NjFEOTAzMDBBMzMwMjkgLyogUmVzb3VyY2VzICovLAorCQkJCUJFQzU2NkNBMDc2MUQ5MDMwMEEzMzAyOSAvKiBTb3VyY2VzICovLAorCQkJCUJFQzU2NkNDMDc2MUQ5MDMwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzk0RTY0MDlEMjA4NEYwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJQkVDNTY4MzUwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJsb29wd2F2ZSAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gbG9vcHdhdmU7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY2RDEwNzYxRDkwMzAwQTMzMDI5IC8qIGxvb3B3YXZlLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQlCRUM1NjZEMzA3NjFEOTAzMDBBMzMwMjkgLyogdGVzdGFscGhhIChVcGdyYWRlZCkgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAxQjU5NDQwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0YWxwaGEgKFVwZ3JhZGVkKSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlCRUM1NjZENTA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLywKKwkJCQlCRUM1NjZENjA3NjFEOTAzMDBBMzMwMjkgLyogUmVzb3VyY2VzICovLAorCQkJCUJFQzU2NkQ4MDc2MUQ5MDMwMEEzMzAyOSAvKiBTb3VyY2VzICovLAorCQkJCUJFQzU2NkRBMDc2MUQ5MDMwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzk0RUEwMDlEMjM0M0EwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJQkVDNTY4MzcwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJ0ZXN0YWxwaGEgKFVwZ3JhZGVkKSI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChVU0VSX0FQUFNfRElSKSI7CisJCQlwcm9kdWN0TmFtZSA9IHRlc3RhbHBoYTsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBCRUM1NjZERjA3NjFEOTAzMDBBMzMwMjkgLyogdGVzdGFscGhhLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQlCRUM1NjZFMTA3NjFEOTAzMDBBMzMwMjkgLyogdGVzdGJpdG1hcCAoVXBncmFkZWQpICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMUI1OTQ4MDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdGJpdG1hcCAoVXBncmFkZWQpIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQzU2NkUzMDc2MUQ5MDMwMEEzMzAyOSAvKiBIZWFkZXJzICovLAorCQkJCUJFQzU2NkU0MDc2MUQ5MDMwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJQkVDNTY2RTYwNzYxRDkwMzAwQTMzMDI5IC8qIFNvdXJjZXMgKi8sCisJCQkJQkVDNTY2RTgwNzYxRDkwMzAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJQkVDNTY4MzkwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJ0ZXN0Yml0bWFwIChVcGdyYWRlZCkiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0Yml0bWFwOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQzU2NkVDMDc2MUQ5MDMwMEEzMzAyOSAvKiB0ZXN0Yml0bWFwLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQlCRUM1NjZFRTA3NjFEOTAzMDBBMzMwMjkgLyogdGVzdGNkcm9tIChVcGdyYWRlZCkgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAxQjU5NEMwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0Y2Ryb20gKFVwZ3JhZGVkKSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlCRUM1NjZGMDA3NjFEOTAzMDBBMzMwMjkgLyogSGVhZGVycyAqLywKKwkJCQlCRUM1NjZGMTA3NjFEOTAzMDBBMzMwMjkgLyogUmVzb3VyY2VzICovLAorCQkJCUJFQzU2NkYzMDc2MUQ5MDMwMEEzMzAyOSAvKiBTb3VyY2VzICovLAorCQkJCUJFQzU2NkY1MDc2MUQ5MDMwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCUJFQzU2ODNCMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAidGVzdGNkcm9tIChVcGdyYWRlZCkiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0Y2Ryb207CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY2RjkwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RjZHJvbS5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJQkVDNTY2RkIwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RlcnJvciAoVXBncmFkZWQpICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMUI1OTUwMDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdGVycm9yIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY2RkQwNzYxRDkwMzAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY2RkUwNzYxRDkwMzAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1NjcwMDA3NjFEOTAzMDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1NjcwMjA3NjFEOTAzMDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQlCRUM1NjgzRDA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInRlc3RlcnJvciAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdGVycm9yOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQzU2NzA2MDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0ZXJyb3IuYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCUJFQzU2NzA4MDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0Z2FtbWEgKFVwZ3JhZGVkKSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNTk1NDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RnYW1tYSAoVXBncmFkZWQpIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQzU2NzBBMDc2MUQ5MDQwMEEzMzAyOSAvKiBIZWFkZXJzICovLAorCQkJCUJFQzU2NzBCMDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJQkVDNTY3MEQwNzYxRDkwNDAwQTMzMDI5IC8qIFNvdXJjZXMgKi8sCisJCQkJQkVDNTY3MEYwNzYxRDkwNDAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMDA3OTRFRTUwOUQyMzZFNDAwM0ZDOEExIC8qIENvcHlGaWxlcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQlCRUM1NjgzRjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInRlc3RnYW1tYSAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdGdhbW1hOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQzU2NzE0MDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0Z2FtbWEuYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCUJFQzU2NzE2MDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0Z2wgKFVwZ3JhZGVkKSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNTk1ODA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RnbCAoVXBncmFkZWQpIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQzU2NzE4MDc2MUQ5MDQwMEEzMzAyOSAvKiBIZWFkZXJzICovLAorCQkJCUJFQzU2NzE5MDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJQkVDNTY3MUIwNzYxRDkwNDAwQTMzMDI5IC8qIFNvdXJjZXMgKi8sCisJCQkJQkVDNTY3MUQwNzYxRDkwNDAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJQkVDNTY4NDEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJ0ZXN0Z2wgKFVwZ3JhZGVkKSI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChVU0VSX0FQUFNfRElSKSI7CisJCQlwcm9kdWN0TmFtZSA9IHRlc3RnbDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBCRUM1NjcyMTA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGdsLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQlCRUM1NjcyMzA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdHRocmVhZCAoVXBncmFkZWQpICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMUI1OTVDMDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdHRocmVhZCAoVXBncmFkZWQpIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQzU2NzI1MDc2MUQ5MDQwMEEzMzAyOSAvKiBIZWFkZXJzICovLAorCQkJCUJFQzU2NzI2MDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJQkVDNTY3MjgwNzYxRDkwNDAwQTMzMDI5IC8qIFNvdXJjZXMgKi8sCisJCQkJQkVDNTY3MkEwNzYxRDkwNDAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJQkVDNTY4NDMwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJ0ZXN0dGhyZWFkIChVcGdyYWRlZCkiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0dGhyZWFkOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQzU2NzJFMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0dGhyZWFkLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQlCRUM1NjczMDA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGpveXN0aWNrIChVcGdyYWRlZCkgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAxQjU5NjAwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0am95c3RpY2sgKFVwZ3JhZGVkKSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlCRUM1NjczMjA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLywKKwkJCQlCRUM1NjczMzA3NjFEOTA0MDBBMzMwMjkgLyogUmVzb3VyY2VzICovLAorCQkJCUJFQzU2NzM1MDc2MUQ5MDQwMEEzMzAyOSAvKiBTb3VyY2VzICovLAorCQkJCUJFQzU2NzM3MDc2MUQ5MDQwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCUJFQzU2ODQ1MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAidGVzdGpveXN0aWNrIChVcGdyYWRlZCkiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0am95c3RpY2s7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY3M0IwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3Rqb3lzdGljay5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJQkVDNTY3M0QwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RrZXlzIChVcGdyYWRlZCkgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAxQjU5NjQwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0a2V5cyAoVXBncmFkZWQpIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQzU2NzNGMDc2MUQ5MDQwMEEzMzAyOSAvKiBIZWFkZXJzICovLAorCQkJCUJFQzU2NzQwMDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJQkVDNTY3NDIwNzYxRDkwNDAwQTMzMDI5IC8qIFNvdXJjZXMgKi8sCisJCQkJQkVDNTY3NDQwNzYxRDkwNDAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJQkVDNTY4NDcwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJ0ZXN0a2V5cyAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdGtleXM7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY3NDgwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RrZXlzLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQlCRUM1Njc0QTA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGxvY2sgKFVwZ3JhZGVkKSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNTk2ODA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3Rsb2NrIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY3NEMwNzYxRDkwNDAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY3NEQwNzYxRDkwNDAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1Njc0RjA3NjFEOTA0MDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1Njc1MTA3NjFEOTA0MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQlCRUM1Njg0OTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInRlc3Rsb2NrIChVcGdyYWRlZCkiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0bG9jazsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBCRUM1Njc1NTA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGxvY2suYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCUJFQzU2NzU3MDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0b3ZlcmxheSAoVXBncmFkZWQpICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMUI1OTlDMDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdG92ZXJsYXkgKFVwZ3JhZGVkKSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlCRUM1Njc1OTA3NjFEOTA0MDBBMzMwMjkgLyogSGVhZGVycyAqLywKKwkJCQlCRUM1Njc1QTA3NjFEOTA0MDBBMzMwMjkgLyogUmVzb3VyY2VzICovLAorCQkJCUJFQzU2NzVDMDc2MUQ5MDQwMEEzMzAyOSAvKiBTb3VyY2VzICovLAorCQkJCUJFQzU2NzVFMDc2MUQ5MDQwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzk0RjYxMDlEMjQxMjUwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJQkVDNTY4NEIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJ0ZXN0b3ZlcmxheSAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdG92ZXJsYXk7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY3NjIwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RvdmVybGF5LmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQlCRUM1Njc2NDA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdHBhbGV0dGUgKFVwZ3JhZGVkKSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNTk2QzA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RwYWxldHRlIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY3NjYwNzYxRDkwNDAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY3NjcwNzYxRDkwNDAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1Njc2OTA3NjFEOTA0MDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1Njc2QjA3NjFEOTA0MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkwMDc5NEVGQzA5RDIzODFDMDAzRkM4QTEgLyogQ29weUZpbGVzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCUJFQzU2ODREMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAidGVzdHBhbGV0dGUgKFVwZ3JhZGVkKSI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChVU0VSX0FQUFNfRElSKSI7CisJCQlwcm9kdWN0TmFtZSA9IHRlc3RwYWxldHRlOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQzU2NzcwMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0cGFsZXR0ZS5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJQkVDNTY3NzIwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3RzZW0gKFVwZ3JhZGVkKSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNTk3MDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RzZW0gKFVwZ3JhZGVkKSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlCRUM1Njc3NDA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLywKKwkJCQlCRUM1Njc3NTA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovLAorCQkJCUJFQzU2Nzc3MDc2MUQ5MDUwMEEzMzAyOSAvKiBTb3VyY2VzICovLAorCQkJCUJFQzU2Nzc5MDc2MUQ5MDUwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCUJFQzU2ODRGMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAidGVzdHNlbSAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdHNlbTsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBCRUM1Njc3RDA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHNlbS5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJQkVDNTY3N0YwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3RzcHJpdGUgKFVwZ3JhZGVkKSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNTk3NDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RzcHJpdGUgKFVwZ3JhZGVkKSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlCRUM1Njc4MTA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLywKKwkJCQlCRUM1Njc4MjA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovLAorCQkJCUJFQzU2Nzg0MDc2MUQ5MDUwMEEzMzAyOSAvKiBTb3VyY2VzICovLAorCQkJCUJFQzU2Nzg2MDc2MUQ5MDUwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovLAorCQkJCTAwNzk0RjAyMDlEMjM4NUYwMDNGQzhBMSAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJQkVDNTY4NTEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJ0ZXN0c3ByaXRlIChVcGdyYWRlZCkiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0c3ByaXRlOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQzU2NzhCMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0c3ByaXRlLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQlCRUM1Njc4RDA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHRpbWVyIChVcGdyYWRlZCkgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAxQjU5NzgwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0dGltZXIgKFVwZ3JhZGVkKSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlCRUM1Njc4RjA3NjFEOTA1MDBBMzMwMjkgLyogSGVhZGVycyAqLywKKwkJCQlCRUM1Njc5MDA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovLAorCQkJCUJFQzU2NzkyMDc2MUQ5MDUwMEEzMzAyOSAvKiBTb3VyY2VzICovLAorCQkJCUJFQzU2Nzk0MDc2MUQ5MDUwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCUJFQzU2ODUzMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAidGVzdHRpbWVyIChVcGdyYWRlZCkiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0dGltZXI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY3OTgwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R0aW1lci5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJQkVDNTY3QTcwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R2ZXJzaW9uIChVcGdyYWRlZCkgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAxQjU5ODAwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0dmVyc2lvbiAoVXBncmFkZWQpIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQzU2N0E5MDc2MUQ5MDUwMEEzMzAyOSAvKiBIZWFkZXJzICovLAorCQkJCUJFQzU2N0FBMDc2MUQ5MDUwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJQkVDNTY3QUMwNzYxRDkwNTAwQTMzMDI5IC8qIFNvdXJjZXMgKi8sCisJCQkJQkVDNTY3QUUwNzYxRDkwNTAwQTMzMDI5IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJQkVDNTY4NTcwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJ0ZXN0dmVyc2lvbiAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdHZlcnNpb247CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY3QjIwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R2ZXJzaW9uLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworCQlCRUM1NjdCNDA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHZpZGluZm8gKFVwZ3JhZGVkKSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNTk4NDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3R2aWRpbmZvIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY3QjYwNzYxRDkwNTAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY3QjcwNzYxRDkwNTAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1NjdCOTA3NjFEOTA1MDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1NjdCQjA3NjFEOTA1MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQlCRUM1Njg1OTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInRlc3R2aWRpbmZvIChVcGdyYWRlZCkiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0dmlkaW5mbzsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBCRUM1NjdCRjA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHZpZGluZm8uYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCUJFQzU2N0MxMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0d2luIChVcGdyYWRlZCkgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAxQjU5ODgwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0d2luIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY3QzMwNzYxRDkwNTAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY3QzQwNzYxRDkwNTAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1NjdDNjA3NjFEOTA1MDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1NjdDODA3NjFEOTA1MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkwMDc5NEYwOTA5RDIzOEUzMDAzRkM4QTEgLyogQ29weUZpbGVzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCUJFQzU2ODVCMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAidGVzdHdpbiAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGVzdHdpbjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBCRUM1NjdDRDA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHdpbi5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJQkVDNTY3Q0YwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R3bSAoVXBncmFkZWQpICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMUI1OThDMDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdHdtIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY3RDEwNzYxRDkwNTAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY3RDIwNzYxRDkwNTAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1NjdENDA3NjFEOTA1MDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1NjdENjA3NjFEOTA1MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkwMDc5NEYwRjA5RDIzOTIzMDAzRkM4QTEgLyogQ29weUZpbGVzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCUJFQzU2ODVEMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAidGVzdHdtIChVcGdyYWRlZCkiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoVVNFUl9BUFBTX0RJUikiOworCQkJcHJvZHVjdE5hbWUgPSB0ZXN0d207CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY3REIwNzYxRDkwNjAwQTMzMDI5IC8qIHRlc3R3bS5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKwkJQkVDNTY3REQwNzYxRDkwNjAwQTMzMDI5IC8qIHRocmVhZHdpbiAoVXBncmFkZWQpICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDAwMUI1OTkwMDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGhyZWFkd2luIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY3REYwNzYxRDkwNjAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY3RTAwNzYxRDkwNjAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1NjdFMjA3NjFEOTA2MDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1NjdFNDA3NjFEOTA2MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQlCRUM1Njg1RjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInRocmVhZHdpbiAoVXBncmFkZWQpIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKFVTRVJfQVBQU19ESVIpIjsKKwkJCXByb2R1Y3ROYW1lID0gdGhyZWFkd2luOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQzU2N0U4MDc2MUQ5MDYwMEEzMzAyOSAvKiB0aHJlYWR3aW4uYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCUJFQzU2N0VBMDc2MUQ5MDYwMEEzMzAyOSAvKiB0b3J0dXJldGhyZWFkIChVcGdyYWRlZCkgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMDAxQjU5OTQwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0b3J0dXJldGhyZWFkIChVcGdyYWRlZCkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJQkVDNTY3RUMwNzYxRDkwNjAwQTMzMDI5IC8qIEhlYWRlcnMgKi8sCisJCQkJQkVDNTY3RUQwNzYxRDkwNjAwQTMzMDI5IC8qIFJlc291cmNlcyAqLywKKwkJCQlCRUM1NjdFRjA3NjFEOTA2MDBBMzMwMjkgLyogU291cmNlcyAqLywKKwkJCQlCRUM1NjdGMTA3NjFEOTA2MDBBMzMwMjkgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQlCRUM1Njg2MTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInRvcnR1cmV0aHJlYWQgKFVwZ3JhZGVkKSI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChVU0VSX0FQUFNfRElSKSI7CisJCQlwcm9kdWN0TmFtZSA9IHRvcnR1cmVUaHJlYWQ7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gQkVDNTY3RjUwNzYxRDkwNjAwQTMzMDI5IC8qIHRvcnR1cmV0aHJlYWQuYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisJCUJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNTkzNDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUJFQzU2N0Y4MDc2MUQ5MDYwMEEzMzAyOSAvKiBIZWFkZXJzICovLAorCQkJCUJFQzU2N0ZCMDc2MUQ5MDYwMEEzMzAyOSAvKiBTb3VyY2VzICovLAorCQkJCUJFQzU2N0ZEMDc2MUQ5MDYwMEEzMzAyOSAvKiBGcmFtZXdvcmtzICovLAorCQkJCUJFQzU2N0ZFMDc2MUQ5MDYwMEEzMzAyOSAvKiBSZXogKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAvdXNyL2xvY2FsL2xpYjsKKwkJCXByb2R1Y3ROYW1lID0gbGlic2RsbWFpbi5hOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEJFQzU2N0ZGMDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmxpYnJhcnkuc3RhdGljIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJMDhGQjc3OTNGRTg0MTU1REMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAwMDFCNUEwQzA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJTRExUZXN0IiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDIuNCI7CisJCQlkZXZlbG9wbWVudFJlZ2lvbiA9IEVuZ2xpc2g7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCWtub3duUmVnaW9ucyA9ICgKKwkJCQlFbmdsaXNoLAorCQkJCUphcGFuZXNlLAorCQkJCUZyZW5jaCwKKwkJCQlHZXJtYW4sCisJCQkpOworCQkJbWFpbkdyb3VwID0gMDhGQjc3OTRGRTg0MTU1REMwMkFBQzA3IC8qIFNETFRlc3QgKi87CisJCQlwcm9qZWN0RGlyUGF0aCA9ICIiOworCQkJcHJvamVjdFJlZmVyZW5jZXMgPSAoCisJCQkJeworCQkJCQlQcm9kdWN0R3JvdXAgPSAwMDNGQTYzQjA5M0ZGRDQxMDAwQzUzQjMgLyogUHJvZHVjdHMgKi87CisJCQkJCVByb2plY3RSZWYgPSAwMDNGQTYzQTA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLnhjb2RlcHJvaiAqLzsKKwkJCQl9LAorCQkJKTsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCUJFQzU2NjkyMDc2MUQ5MDMwMEEzMzAyOSAvKiBBbGwgKi8sCisJCQkJQkVDNTY2QUIwNzYxRDkwMzAwQTMzMDI5IC8qIGNoZWNra2V5cyAoVXBncmFkZWQpICovLAorCQkJCUJFQzU2NkI4MDc2MUQ5MDMwMEEzMzAyOSAvKiBncmF5d2luIChVcGdyYWRlZCkgKi8sCisJCQkJQkVDNTY2QzUwNzYxRDkwMzAwQTMzMDI5IC8qIGxvb3B3YXZlIChVcGdyYWRlZCkgKi8sCisJCQkJQkVDNTY2RDMwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RhbHBoYSAoVXBncmFkZWQpICovLAorCQkJCUJFQzU2NkUxMDc2MUQ5MDMwMEEzMzAyOSAvKiB0ZXN0Yml0bWFwIChVcGdyYWRlZCkgKi8sCisJCQkJMDAyRjMzODYwOUNBMTZCRjAwRUJFQjg4IC8qIHRlc3RibGl0c3BlZWQgKi8sCisJCQkJQkVDNTY2RUUwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RjZHJvbSAoVXBncmFkZWQpICovLAorCQkJCTAwMkYzM0NBMDlDQTE5QTYwMEVCRUI4OCAvKiB0ZXN0ZHluZ2wgKi8sCisJCQkJQkVDNTY2RkIwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RlcnJvciAoVXBncmFkZWQpICovLAorCQkJCTAwMkYzNDAxMDlDQTFCRkYwMEVCRUI4OCAvKiB0ZXN0ZmlsZSAqLywKKwkJCQlCRUM1NjcwODA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGdhbW1hIChVcGdyYWRlZCkgKi8sCisJCQkJQkVDNTY3MTYwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RnbCAoVXBncmFkZWQpICovLAorCQkJCTAwMkYzNDIwMDlDQTFGMDMwMEVCRUI4OCAvKiB0ZXN0aWNvbnYgKi8sCisJCQkJQkVDNTY3MzAwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3Rqb3lzdGljayAoVXBncmFkZWQpICovLAorCQkJCUJFQzU2NzNEMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0a2V5cyAoVXBncmFkZWQpICovLAorCQkJCUJFQzU2NzRBMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0bG9jayAoVXBncmFkZWQpICovLAorCQkJCUJFQzU2NzU3MDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0b3ZlcmxheSAoVXBncmFkZWQpICovLAorCQkJCTAwMkYzNDNDMDlDQTFGQjMwMEVCRUI4OCAvKiB0ZXN0b3ZlcmxheTIgKi8sCisJCQkJQkVDNTY3NjQwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RwYWxldHRlIChVcGdyYWRlZCkgKi8sCisJCQkJMDAyRjM0NTkwOUNBMjA0RjAwRUJFQjg4IC8qIHRlc3RwbGF0Zm9ybSAqLywKKwkJCQlCRUM1Njc3MjA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHNlbSAoVXBncmFkZWQpICovLAorCQkJCUJFQzU2NzdGMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0c3ByaXRlIChVcGdyYWRlZCkgKi8sCisJCQkJQkVDNTY3MjMwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3R0aHJlYWQgKFVwZ3JhZGVkKSAqLywKKwkJCQlCRUM1Njc4RDA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHRpbWVyIChVcGdyYWRlZCkgKi8sCisJCQkJQkVDNTY3QTcwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R2ZXJzaW9uIChVcGdyYWRlZCkgKi8sCisJCQkJQkVDNTY3QjQwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R2aWRpbmZvIChVcGdyYWRlZCkgKi8sCisJCQkJQkVDNTY3QzEwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R3aW4gKFVwZ3JhZGVkKSAqLywKKwkJCQlCRUM1NjdDRjA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHdtIChVcGdyYWRlZCkgKi8sCisJCQkJQkVDNTY3REQwNzYxRDkwNjAwQTMzMDI5IC8qIHRocmVhZHdpbiAoVXBncmFkZWQpICovLAorCQkJCUJFQzU2N0VBMDc2MUQ5MDYwMEEzMzAyOSAvKiB0b3J0dXJldGhyZWFkIChVcGdyYWRlZCkgKi8sCisJCQkJQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovLAorCQkJCTAwMkYzMzcwMDlDQTE0RjkwMEVCRUI4OCAvKiB0ZXN0ICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVmZXJlbmNlUHJveHkgc2VjdGlvbiAqLworCQkwMDNGQTY0MzA5M0ZGRDQxMDAwQzUzQjMgLyogU0RMLmZyYW1ld29yayAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlZmVyZW5jZVByb3h5OworCQkJZmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsKKwkJCXBhdGggPSBTREwuZnJhbWV3b3JrOworCQkJcmVtb3RlUmVmID0gMDAzRkE2NDIwOTNGRkQ0MTAwMEM1M0IzIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJCXNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7CisJCX07CisJCTAwM0ZBNjQ1MDkzRkZENDEwMDBDNTNCMyAvKiBsaWJTREwuYSAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlZmVyZW5jZVByb3h5OworCQkJZmlsZVR5cGUgPSBhcmNoaXZlLmFyOworCQkJcGF0aCA9IGxpYlNETC5hOworCQkJcmVtb3RlUmVmID0gMDAzRkE2NDQwOTNGRkQ0MTAwMEM1M0IzIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJCXNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7CisJCX07CisJCTAwM0ZBNjQ3MDkzRkZENDEwMDBDNTNCMyAvKiBsaWJTRExtYWluLmEgKi8gPSB7CisJCQlpc2EgPSBQQlhSZWZlcmVuY2VQcm94eTsKKwkJCWZpbGVUeXBlID0gYXJjaGl2ZS5hcjsKKwkJCXBhdGggPSBsaWJTRExtYWluLmE7CisJCQlyZW1vdGVSZWYgPSAwMDNGQTY0NjA5M0ZGRDQxMDAwQzUzQjMgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQkJc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsKKwkJfTsKKwkJMDAzRkE2NDkwOTNGRkQ0MTAwMEM1M0IzIC8qIFN0YW5kYXJkIERNRyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlZmVyZW5jZVByb3h5OworCQkJZmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOworCQkJcGF0aCA9ICJTdGFuZGFyZCBETUciOworCQkJcmVtb3RlUmVmID0gMDAzRkE2NDgwOTNGRkQ0MTAwMEM1M0IzIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJCXNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7CisJCX07CisJCTAwM0ZBNjRCMDkzRkZENDEwMDBDNTNCMyAvKiBEZXZlbG9wZXIgRXh0cmFzIFBhY2thZ2UgKi8gPSB7CisJCQlpc2EgPSBQQlhSZWZlcmVuY2VQcm94eTsKKwkJCWZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsKKwkJCXBhdGggPSAiRGV2ZWxvcGVyIEV4dHJhcyBQYWNrYWdlIjsKKwkJCXJlbW90ZVJlZiA9IDAwM0ZBNjRBMDkzRkZENDEwMDBDNTNCMyAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCQlzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOworCQl9OworLyogRW5kIFBCWFJlZmVyZW5jZVByb3h5IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTAwMkYzMzc0MDlDQTE0RjkwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzMzc1MDlDQTE0RjkwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzMzhBMDlDQTE2QkYwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzMzhCMDlDQTE2QkYwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzM0NFMDlDQTE5QTYwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzM0NGMDlDQTE5QTYwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzNDA1MDlDQTFCRkYwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzNDA2MDlDQTFCRkYwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzNDI0MDlDQTFGMDMwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzNDI1MDlDQTFGMDMwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzNDQwMDlDQTFGQjMwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzNDQxMDlDQTFGQjMwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzNDVEMDlDQTIwNEYwMEVCRUI4OCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzNDVFMDlDQTIwNEYwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkFFMDc2MUQ5MDMwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NkFGMDc2MUQ5MDMwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkJCMDc2MUQ5MDMwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NkJDMDc2MUQ5MDMwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkM4MDc2MUQ5MDMwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NkM5MDc2MUQ5MDMwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkQ2MDc2MUQ5MDMwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NkQ3MDc2MUQ5MDMwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkU0MDc2MUQ5MDMwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NkU1MDc2MUQ5MDMwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkYxMDc2MUQ5MDMwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NkYyMDc2MUQ5MDMwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkZFMDc2MUQ5MDMwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NkZGMDc2MUQ5MDMwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzBCMDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NzBDMDc2MUQ5MDQwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzE5MDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NzFBMDc2MUQ5MDQwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzI2MDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NzI3MDc2MUQ5MDQwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzMzMDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NzM0MDc2MUQ5MDQwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzQwMDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NzQxMDc2MUQ5MDQwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzREMDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NzRFMDc2MUQ5MDQwMEEzMzAyOSAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzVBMDc2MUQ5MDQwMEEzMzAyOSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc2NzA3NjFEOTA0MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njc2ODA3NjFEOTA0MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc3NTA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njc3NjA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc4MjA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njc4MzA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc5MDA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njc5MTA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdBQTA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdBQjA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdCNzA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdCODA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdDNDA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdDNTA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdEMjA3NjFEOTA1MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdEMzA3NjFEOTA1MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdFMDA3NjFEOTA2MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdFMTA3NjFEOTA2MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdFRDA3NjFEOTA2MDBBMzMwMjkgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdFRTA3NjFEOTA2MDBBMzMwMjkgLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXpCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJQkVDNTY3RkUwNzYxRDkwNjAwQTMzMDI5IC8qIFJleiAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlekJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmV6QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMDAyRjMzNzYwOUNBMTRGOTAwRUJFQjg4IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMDAyRjMzOEMwOUNBMTZCRjAwRUJFQjg4IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzM5QjA5Q0ExN0JDMDBFQkVCODggLyogdGVzdGJsaXRzcGVlZC5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzM0QwMDlDQTE5QTYwMEVCRUI4OCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjMzRTMwOUNBMUEwQjAwRUJFQjg4IC8qIHRlc3RkeW5nbC5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTAwMkYzNDA3MDlDQTFCRkYwMEVCRUI4OCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjM0MTgwOUNBMUM1QjAwRUJFQjg4IC8qIHRlc3RmaWxlLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMDAyRjM0MjYwOUNBMUYwMzAwRUJFQjg4IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzQzNzA5Q0ExRjZGMDBFQkVCODggLyogdGVzdGljb252LmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMDAyRjM0NDIwOUNBMUZCMzAwRUJFQjg4IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzQ1NDA5Q0EyMDIwMDBFQkVCODggLyogdGVzdG92ZXJsYXkyLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMDAyRjM0NUYwOUNBMjA0RjAwRUJFQjg4IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzQ3MDA5Q0EyMEE2MDBFQkVCODggLyogdGVzdHBsYXRmb3JtLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY2QjAwNzYxRDkwMzAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjZCMTA3NjFEOTAzMDBBMzMwMjkgLyogY2hlY2trZXlzLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY2QkQwNzYxRDkwMzAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjZCRTA3NjFEOTAzMDBBMzMwMjkgLyogZ3JheXdpbi5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkNBMDc2MUQ5MDMwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY2Q0IwNzYxRDkwMzAwQTMzMDI5IC8qIGxvb3B3YXZlLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY2RDgwNzYxRDkwMzAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjZEOTA3NjFEOTAzMDBBMzMwMjkgLyogdGVzdGFscGhhLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY2RTYwNzYxRDkwMzAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjZFNzA3NjFEOTAzMDBBMzMwMjkgLyogdGVzdGJpdG1hcC5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NkYzMDc2MUQ5MDMwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY2RjQwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RjZHJvbS5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzAwMDc2MUQ5MDMwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY3MDEwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RlcnJvci5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzBEMDc2MUQ5MDQwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY3MEUwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RnYW1tYS5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzFCMDc2MUQ5MDQwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY3MUMwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RnbC5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzI4MDc2MUQ5MDQwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY3MjkwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RocmVhZC5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzM1MDc2MUQ5MDQwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY3MzYwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3Rqb3lzdGljay5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzQyMDc2MUQ5MDQwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY3NDMwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RrZXlzLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3NEYwNzYxRDkwNDAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njc1MDA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGxvY2suYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc1QzA3NjFEOTA0MDBBMzMwMjkgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NzVEMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0b3ZlcmxheS5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2NzY5MDc2MUQ5MDQwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY3NkEwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RwYWxldHRlLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3NzcwNzYxRDkwNTAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1Njc3ODA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHNlbS5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2Nzg0MDc2MUQ5MDUwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY3ODUwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3RzcHJpdGUuYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1Njc5MjA3NjFEOTA1MDBBMzMwMjkgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2NzkzMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0dGltZXIuYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdBQzA3NjFEOTA1MDBBMzMwMjkgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2N0FEMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0dmVyLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3QjkwNzYxRDkwNTAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdCQTA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHZpZGluZm8uYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlCRUM1NjdDNjA3NjFEOTA1MDBBMzMwMjkgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUJFQzU2N0M3MDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0d2luLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3RDQwNzYxRDkwNTAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdENTA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHdtLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3RTIwNzYxRDkwNjAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdFMzA3NjFEOTA2MDBBMzMwMjkgLyogdGhyZWFkd2luLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJQkVDNTY3RUYwNzYxRDkwNjAwQTMzMDI5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlCRUM1NjdGMDA3NjFEOTA2MDBBMzMwMjkgLyogdG9ydHVyZXRocmVhZC5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUJFQzU2N0ZCMDc2MUQ5MDYwMEEzMzAyOSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJQkVDNTY3RkMwNzYxRDkwNjAwQTMzMDI5IC8qIFNETE1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYVGFyZ2V0RGVwZW5kZW5jeSBzZWN0aW9uICovCisJCTAwMkYzMzcxMDlDQTE0RjkwMEVCRUI4OCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gMDAyRjMzNzIwOUNBMTRGOTAwRUJFQjg4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMDAyRjMzODcwOUNBMTZCRjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSAwMDJGMzM4ODA5Q0ExNkJGMDBFQkVCODggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkwMDJGMzNDQjA5Q0ExOUE2MDBFQkVCODggLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IDAwMkYzM0NDMDlDQTE5QTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTAwMkYzNDAyMDlDQTFCRkYwMEVCRUI4OCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gMDAyRjM0MDMwOUNBMUJGRjAwRUJFQjg4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMDAyRjM0MjEwOUNBMUYwMzAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSAwMDJGMzQyMjA5Q0ExRjAzMDBFQkVCODggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkwMDJGMzQzRDA5Q0ExRkIzMDBFQkVCODggLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IDAwMkYzNDNFMDlDQTFGQjMwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTAwMkYzNDVBMDlDQTIwNEYwMEVCRUI4OCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gMDAyRjM0NUIwOUNBMjA0RjAwRUJFQjg4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMDAyRjM0NzkwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMDAyRjMzODYwOUNBMTZCRjAwRUJFQjg4IC8qIHRlc3RibGl0c3BlZWQgKi87CisJCQl0YXJnZXRQcm94eSA9IDAwMkYzNDc4MDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTAwMkYzNDdCMDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDAwMkYzM0NBMDlDQTE5QTYwMEVCRUI4OCAvKiB0ZXN0ZHluZ2wgKi87CisJCQl0YXJnZXRQcm94eSA9IDAwMkYzNDdBMDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTAwMkYzNDdEMDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDAwMkYzNDAxMDlDQTFCRkYwMEVCRUI4OCAvKiB0ZXN0ZmlsZSAqLzsKKwkJCXRhcmdldFByb3h5ID0gMDAyRjM0N0MwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMDAyRjM0N0YwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMDAyRjM0MjAwOUNBMUYwMzAwRUJFQjg4IC8qIHRlc3RpY29udiAqLzsKKwkJCXRhcmdldFByb3h5ID0gMDAyRjM0N0UwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMDAyRjM0ODEwOUNBMjE1NjAwRUJFQjg4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3NTcwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RvdmVybGF5IChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IDAwMkYzNDgwMDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTAwMkYzNDgzMDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDAwMkYzNDNDMDlDQTFGQjMwMEVCRUI4OCAvKiB0ZXN0b3ZlcmxheTIgKi87CisJCQl0YXJnZXRQcm94eSA9IDAwMkYzNDgyMDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTAwMkYzNDg1MDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDAwMkYzNDU5MDlDQTIwNEYwMEVCRUI4OCAvKiB0ZXN0cGxhdGZvcm0gKi87CisJCQl0YXJnZXRQcm94eSA9IDAwMkYzNDg0MDlDQTIxNTYwMEVCRUI4OCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTAwM0ZBNkE4MDk0MDAyMzYwMDBDNTNCMyAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCW5hbWUgPSBGcmFtZXdvcms7CisJCQl0YXJnZXRQcm94eSA9IDAwM0ZBNkE3MDk0MDAyMzYwMDBDNTNCMyAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODAxMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2NkFCMDc2MUQ5MDMwMEEzMzAyOSAvKiBjaGVja2tleXMgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MDAwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MDMwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY2QjgwNzYxRDkwMzAwQTMzMDI5IC8qIGdyYXl3aW4gKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MDIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MDUwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY2QzUwNzYxRDkwMzAwQTMzMDI5IC8qIGxvb3B3YXZlIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODA0MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODA3MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2NkQzMDc2MUQ5MDMwMEEzMzAyOSAvKiB0ZXN0YWxwaGEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MDYwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MDkwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY2RTEwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RiaXRtYXAgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MDgwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MEIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY2RUUwNzYxRDkwMzAwQTMzMDI5IC8qIHRlc3RjZHJvbSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1NjgwQTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1NjgwRDA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjZGQjA3NjFEOTAzMDBBMzMwMjkgLyogdGVzdGVycm9yIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODBDMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODBGMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2NzA4MDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0Z2FtbWEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MEUwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MTEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3MTYwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RnbCAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1NjgxMDA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1NjgxMzA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjcyMzA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdHRocmVhZCAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1NjgxMjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1NjgxNTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjczMDA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGpveXN0aWNrIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODE0MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODE3MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2NzNEMDc2MUQ5MDQwMEEzMzAyOSAvKiB0ZXN0a2V5cyAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1NjgxNjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1NjgxOTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1Njc0QTA3NjFEOTA0MDBBMzMwMjkgLyogdGVzdGxvY2sgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MTgwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MUIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3NjQwNzYxRDkwNDAwQTMzMDI5IC8qIHRlc3RwYWxldHRlIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODFBMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODFEMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2NzcyMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0c2VtIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODFDMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODFGMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2NzdGMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0c3ByaXRlIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODFFMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODIxMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2NzhEMDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0dGltZXIgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MjAwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MjUwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3QTcwNzYxRDkwNTAwQTMzMDI5IC8qIHRlc3R2ZXJzaW9uIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODI0MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODI3MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0I0MDc2MUQ5MDUwMEEzMzAyOSAvKiB0ZXN0dmlkaW5mbyAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1NjgyNjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1NjgyOTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdDMTA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHdpbiAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1NjgyODA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1NjgyQjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdDRjA3NjFEOTA1MDBBMzMwMjkgLyogdGVzdHdtIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODJBMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODJEMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0REMDc2MUQ5MDYwMEEzMzAyOSAvKiB0aHJlYWR3aW4gKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MkMwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MkYwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RUEwNzYxRDkwNjAwQTMzMDI5IC8qIHRvcnR1cmV0aHJlYWQgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MkUwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MzEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1NjgzMDA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1NjgzMzA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODMyMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODM1MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4MzQwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4MzcwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1NjgzNjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1NjgzOTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODM4MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODNCMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4M0EwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4M0QwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1NjgzQzA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1NjgzRjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODNFMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODQxMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4NDAwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4NDMwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1Njg0MjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1Njg0NTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODQ0MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODQ3MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4NDYwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4NDkwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1Njg0ODA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1Njg0QjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODRBMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODREMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4NEMwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4NEYwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1Njg0RTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1Njg1MTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODUwMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODUzMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4NTIwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4NTcwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1Njg1NjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1Njg1OTA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODU4MDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODVCMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4NUEwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJQkVDNTY4NUQwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gQkVDNTY3RjcwNzYxRDkwNjAwQTMzMDI5IC8qIGxpYnNkbG1haW4uYSAoVXBncmFkZWQpICovOworCQkJdGFyZ2V0UHJveHkgPSBCRUM1Njg1QzA3NjFEOTA2MDBBMzMwMjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlCRUM1Njg1RjA3NjFEOTA2MDBBMzMwMjkgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBCRUM1NjdGNzA3NjFEOTA2MDBBMzMwMjkgLyogbGlic2RsbWFpbi5hIChVcGdyYWRlZCkgKi87CisJCQl0YXJnZXRQcm94eSA9IEJFQzU2ODVFMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUJFQzU2ODYxMDc2MUQ5MDYwMEEzMzAyOSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEJFQzU2N0Y3MDc2MUQ5MDYwMEEzMzAyOSAvKiBsaWJzZGxtYWluLmEgKFVwZ3JhZGVkKSAqLzsKKwkJCXRhcmdldFByb3h5ID0gQkVDNTY4NjAwNzYxRDkwNjAwQTMzMDI5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKy8qIEVuZCBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCQkwMDFCNTkzNTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9IGxpYnNkbG1haW5fcHJlZml4Lmg7CisJCQkJUFJPRFVDVF9OQU1FID0gc2RsbWFpbjsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAxQjU5MzYwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gbGlic2RsbWFpbl9wcmVmaXguaDsKKwkJCQlQUk9EVUNUX05BTUUgPSBzZGxtYWluOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAxQjU5MzcwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSBsaWJzZGxtYWluX3ByZWZpeC5oOworCQkJCVBST0RVQ1RfTkFNRSA9IHNkbG1haW47CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTM5MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tY2hlY2trZXlzX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IGNoZWNra2V5czsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAxQjU5M0EwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tY2hlY2trZXlzX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IGNoZWNra2V5czsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTNCMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tY2hlY2trZXlzX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IGNoZWNra2V5czsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5M0QwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby1ncmF5d2luX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IGdyYXl3aW47CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlcGxveW1lbnQ7CisJCX07CisJCTAwMUI1OTNFMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLWdyYXl3aW5fX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3JheXdpbjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTNGMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tZ3JheXdpbl9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSBncmF5d2luOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk0MTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLWxvb3B3YXZlX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IGxvb3B3YXZlOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk0MjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby1sb29wd2F2ZV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSBsb29wd2F2ZTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTQzMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tbG9vcHdhdmVfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gbG9vcHdhdmU7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTQ1MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGFscGhhX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RhbHBoYTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAxQjU5NDYwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGFscGhhX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RhbHBoYTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTQ3MDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGFscGhhX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RhbHBoYTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NDkwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0Yml0bWFwX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RiaXRtYXA7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlcGxveW1lbnQ7CisJCX07CisJCTAwMUI1OTRBMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RiaXRtYXBfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGJpdG1hcDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTRCMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGJpdG1hcF9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0Yml0bWFwOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk0RDA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RjZHJvbV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0Y2Ryb207CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlcGxveW1lbnQ7CisJCX07CisJCTAwMUI1OTRFMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RjZHJvbV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0Y2Ryb207CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERldmVsb3BtZW50OworCQl9OworCQkwMDFCNTk0RjA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RjZHJvbV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0Y2Ryb207CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTUxMDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGVycm9yX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RlcnJvcjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAxQjU5NTIwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGVycm9yX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RlcnJvcjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTUzMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGVycm9yX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RlcnJvcjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NTUwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0Z2FtbWFfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGdhbW1hOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk1NjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0Z2FtbWFfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGdhbW1hOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAxQjU5NTcwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0Z2FtbWFfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGdhbW1hOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk1OTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gSEFWRV9PUEVOR0w7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0Z2xfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGdsOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk1QTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9IEhBVkVfT1BFTkdMOworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGdsX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RnbDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTVCMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMgPSBIQVZFX09QRU5HTDsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RnbF9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0Z2w7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTVEMDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdHRocmVhZF9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0dGhyZWFkOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk1RTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0dGhyZWFkX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3R0aHJlYWQ7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERldmVsb3BtZW50OworCQl9OworCQkwMDFCNTk1RjA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3R0aHJlYWRfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHRocmVhZDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NjEwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0am95c3RpY2tfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGpveXN0aWNrOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk2MjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0am95c3RpY2tfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGpveXN0aWNrOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAxQjU5NjMwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0am95c3RpY2tfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGpveXN0aWNrOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk2NTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RrZXlzX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RrZXlzOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk2NjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0a2V5c19fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0a2V5czsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTY3MDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGtleXNfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGtleXM7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTY5MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGxvY2tfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGxvY2s7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlcGxveW1lbnQ7CisJCX07CisJCTAwMUI1OTZBMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3Rsb2NrX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3Rsb2NrOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAxQjU5NkIwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0bG9ja19fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0bG9jazsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NkQwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0cGFsZXR0ZV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0cGFsZXR0ZTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAxQjU5NkUwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdHBhbGV0dGVfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHBhbGV0dGU7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERldmVsb3BtZW50OworCQl9OworCQkwMDFCNTk2RjA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RwYWxldHRlX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RwYWxldHRlOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk3MTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RzZW1fX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHNlbTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAxQjU5NzIwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdHNlbV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0c2VtOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAxQjU5NzMwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0c2VtX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RzZW07CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTc1MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdHNwcml0ZV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0c3ByaXRlOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk3NjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0c3ByaXRlX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RzcHJpdGU7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERldmVsb3BtZW50OworCQl9OworCQkwMDFCNTk3NzA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RzcHJpdGVfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHNwcml0ZTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NzkwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0dGltZXJfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHRpbWVyOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk3QTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0dGltZXJfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHRpbWVyOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAxQjU5N0IwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0dGltZXJfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHRpbWVyOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk4MTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3R2ZXJzaW9uX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3R2ZXJzaW9uOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk4MjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0dmVyc2lvbl9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0dmVyc2lvbjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTgzMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdHZlcnNpb25fX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHZlcnNpb247CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTg1MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdHZpZGluZm9fX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHZpZGluZm87CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlcGxveW1lbnQ7CisJCX07CisJCTAwMUI1OTg2MDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3R2aWRpbmZvX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3R2aWRpbmZvOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAxQjU5ODcwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0dmlkaW5mb19fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0dmlkaW5mbzsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5ODkwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0d2luX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3R3aW47CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlcGxveW1lbnQ7CisJCX07CisJCTAwMUI1OThBMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3R3aW5fX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHdpbjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OThCMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdHdpbl9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0d2luOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk4RDA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3R3bV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0d207CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlcGxveW1lbnQ7CisJCX07CisJCTAwMUI1OThFMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3R3bV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0d207CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERldmVsb3BtZW50OworCQl9OworCQkwMDFCNTk4RjA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3R3bV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0d207CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTkxMDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGhyZWFkd2luX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRocmVhZHdpbjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAxQjU5OTIwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGhyZWFkd2luX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRocmVhZHdpbjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTkzMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGhyZWFkd2luX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRocmVhZHdpbjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5OTUwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10b3J0dXJldGhyZWFkX19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRvcnR1cmV0aHJlYWQ7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlcGxveW1lbnQ7CisJCX07CisJCTAwMUI1OTk2MDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRvcnR1cmV0aHJlYWRfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdG9ydHVyZXRocmVhZDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTk3MDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdG9ydHVyZXRocmVhZF9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0b3J0dXJldGhyZWFkOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk5OTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCURFQlVHR0lOR19TWU1CT0xTID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDM7CisJCQkJT1RIRVJfQ0ZMQUdTID0gIiI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICIiOworCQkJCU9USEVSX1JFWkZMQUdTID0gIiI7CisJCQkJUFJPRFVDVF9OQU1FID0gIkJ1aWxkIEFsbCI7CisJCQkJU0VDVE9SREVSX0ZMQUdTID0gIiI7CisJCQkJV0FSTklOR19DRkxBR1MgPSAoCisJCQkJCSItV21vc3QiLAorCQkJCQkiLVduby1mb3VyLWNoYXItY29uc3RhbnRzIiwKKwkJCQkJIi1Xbm8tdW5rbm93bi1wcmFnbWFzIiwKKwkJCQkpOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNTk5QTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IFlFUzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBZRVM7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJT1RIRVJfQ0ZMQUdTID0gIiI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICIiOworCQkJCU9USEVSX1JFWkZMQUdTID0gIiI7CisJCQkJUFJPRFVDVF9OQU1FID0gIkJ1aWxkIEFsbCI7CisJCQkJU0VDVE9SREVSX0ZMQUdTID0gIiI7CisJCQkJV0FSTklOR19DRkxBR1MgPSAoCisJCQkJCSItV21vc3QiLAorCQkJCQkiLVduby1mb3VyLWNoYXItY29uc3RhbnRzIiwKKwkJCQkJIi1Xbm8tdW5rbm93bi1wcmFnbWFzIiwKKwkJCQkpOworCQkJCVpFUk9fTElOSyA9IFlFUzsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1OTlCMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCU9USEVSX0NGTEFHUyA9ICIiOworCQkJCU9USEVSX0xERkxBR1MgPSAiIjsKKwkJCQlPVEhFUl9SRVpGTEFHUyA9ICIiOworCQkJCVBST0RVQ1RfTkFNRSA9ICJCdWlsZCBBbGwiOworCQkJCVNFQ1RPUkRFUl9GTEFHUyA9ICIiOworCQkJCVdBUk5JTkdfQ0ZMQUdTID0gKAorCQkJCQkiLVdtb3N0IiwKKwkJCQkJIi1Xbm8tZm91ci1jaGFyLWNvbnN0YW50cyIsCisJCQkJCSItV25vLXVua25vd24tcHJhZ21hcyIsCisJCQkJKTsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5OUQwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0b3ZlcmxheV9fVXBncmFkZWRfLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0b3ZlcmxheTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAxQjU5OUUwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdG92ZXJsYXlfX1VwZ3JhZGVkXy5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdG92ZXJsYXk7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERldmVsb3BtZW50OworCQl9OworCQkwMDFCNTk5RjA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RvdmVybGF5X19VcGdyYWRlZF8ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RvdmVybGF5OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNUEwRDA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyXzY0X0JJVF9QUkVfWENPREVfM18xKSI7CisJCQkJQVJDSFNfU1RBTkRBUkRfMzJfNjRfQklUX1BSRV9YQ09ERV8zXzEgPSAieDg2XzY0IGkzODYgcHBjIjsKKwkJCQlDT05GSUdVUkFUSU9OX0JVSUxEX0RJUiA9ICIkKEJVSUxEX0RJUikvJChDT05GSUdVUkFUSU9OKSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoU1JDUk9PVCkvLi4vU0RML2J1aWxkLyQoQ09ORklHVVJBVElPTikiLAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzLAorCQkJCSk7CisJCQkJR0NDX1ZFUlNJT05faTM4NiA9IDQuMDsKKwkJCQlHQ0NfVkVSU0lPTl9wcGMgPSA0LjA7CisJCQkJR0NDX1ZFUlNJT05feDg2XzY0ID0gNC4yOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCS4uLy4uL2luY2x1ZGUsCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycywKKwkJCQkpOworCQkJCU1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVF9pMzg2ID0gMTAuNDsKKwkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVRfcHBjID0gMTAuNDsKKwkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVRfeDg2XzY0ID0gMTAuNjsKKwkJCQlXQVJOSU5HX0NGTEFHUyA9ICItV21vc3QiOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDFCNUEwRTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl82NF9CSVRfUFJFX1hDT0RFXzNfMSkiOworCQkJCUFSQ0hTX1NUQU5EQVJEXzMyXzY0X0JJVF9QUkVfWENPREVfM18xID0gIng4Nl82NCBpMzg2IHBwYyI7CisJCQkJQ09ORklHVVJBVElPTl9CVUlMRF9ESVIgPSAiJChCVUlMRF9ESVIpLyQoQ09ORklHVVJBVElPTikiOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKFNSQ1JPT1QpLy4uL1NETC9idWlsZC8kKENPTkZJR1VSQVRJT04pIiwKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3JrcywKKwkJCQkpOworCQkJCUdDQ19WRVJTSU9OX2kzODYgPSA0LjA7CisJCQkJR0NDX1ZFUlNJT05fcHBjID0gNC4wOworCQkJCUdDQ19WRVJTSU9OX3g4Nl82NCA9IDQuMjsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8uLi9pbmNsdWRlLAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMsCisJCQkJKTsKKwkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVRfaTM4NiA9IDEwLjQ7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUX3BwYyA9IDEwLjQ7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUX3g4Nl82NCA9IDEwLjY7CisJCQkJV0FSTklOR19DRkxBR1MgPSAiLVdtb3N0IjsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMUI1QTBGMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfNjRfQklUX1BSRV9YQ09ERV8zXzEpIjsKKwkJCQlBUkNIU19TVEFOREFSRF8zMl82NF9CSVRfUFJFX1hDT0RFXzNfMSA9ICJ4ODZfNjQgaTM4NiBwcGMiOworCQkJCUNPTkZJR1VSQVRJT05fQlVJTERfRElSID0gIiQoQlVJTERfRElSKS8kKENPTkZJR1VSQVRJT04pIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChTUkNST09UKS8uLi9TREwvYnVpbGQvJChDT05GSUdVUkFUSU9OKSIsCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MsCisJCQkJKTsKKwkJCQlHQ0NfVkVSU0lPTl9pMzg2ID0gNC4wOworCQkJCUdDQ19WRVJTSU9OX3BwYyA9IDQuMDsKKwkJCQlHQ0NfVkVSU0lPTl94ODZfNjQgPSA0LjI7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJLi4vLi4vaW5jbHVkZSwKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzLAorCQkJCSk7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUX2kzODYgPSAxMC40OworCQkJCU1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVF9wcGMgPSAxMC40OworCQkJCU1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVF94ODZfNjQgPSAxMC42OworCQkJCVdBUk5JTkdfQ0ZMQUdTID0gIi1XbW9zdCI7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMkYzMzdFMDlDQTE0RjkwMEVCRUI4OCAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdC5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAyRjMzN0YwOUNBMTRGOTAwRUJFQjg4IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdC5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMkYzMzgwMDlDQTE0RjkwMEVCRUI4OCAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdC5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAyRjMzOTQwOUNBMTZCRjAwRUJFQjg4IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0YmxpdHNwZWVkLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0YmxpdHNwZWVkOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDJGMzM5NTA5Q0ExNkJGMDBFQkVCODggLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0YmxpdHNwZWVkLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0YmxpdHNwZWVkOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAyRjMzOTYwOUNBMTZCRjAwRUJFQjg4IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0YmxpdHNwZWVkLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0YmxpdHNwZWVkOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDJGMzNEODA5Q0ExOUE2MDBFQkVCODggLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gKAorCQkJCQkiJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TKSIsCisJCQkJCUhBVkVfT1BFTkdMLAorCQkJCSk7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0ZHluZ2wucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RkeW5nbDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAyRjMzRDkwOUNBMTlBNjAwRUJFQjg4IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMgPSAoCisJCQkJCSIkKEdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMpIiwKKwkJCQkJSEFWRV9PUEVOR0wsCisJCQkJKTsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RkeW5nbC5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGR5bmdsOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAyRjMzREEwOUNBMTlBNjAwRUJFQjg4IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICgKKwkJCQkJIiQoR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUykiLAorCQkJCQlIQVZFX09QRU5HTCwKKwkJCQkpOworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGR5bmdsLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0ZHluZ2w7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMkYzNDBGMDlDQTFCRkYwMEVCRUI4OCAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGZpbGUucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RmaWxlOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDJGMzQxMDA5Q0ExQkZGMDBFQkVCODggLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0ZmlsZS5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGZpbGU7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERldmVsb3BtZW50OworCQl9OworCQkwMDJGMzQxMTA5Q0ExQkZGMDBFQkVCODggLyogRGVmYXVsdCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RmaWxlLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0ZmlsZTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAyRjM0MkUwOUNBMUYwMzAwRUJFQjg4IC8qIERlcGxveW1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0aWNvbnYucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RpY29udjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVwbG95bWVudDsKKwkJfTsKKwkJMDAyRjM0MkYwOUNBMUYwMzAwRUJFQjg4IC8qIERldmVsb3BtZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdGljb252LnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0aWNvbnY7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERldmVsb3BtZW50OworCQl9OworCQkwMDJGMzQzMDA5Q0ExRjAzMDBFQkVCODggLyogRGVmYXVsdCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RpY29udi5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdGljb252OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDJGMzQ0QTA5Q0ExRkIzMDBFQkVCODggLyogRGVwbG95bWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RvdmVybGF5Mi5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdG92ZXJsYXkyOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworCQkwMDJGMzQ0QjA5Q0ExRkIzMDBFQkVCODggLyogRGV2ZWxvcG1lbnQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0b3ZlcmxheTIucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RvdmVybGF5MjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGV2ZWxvcG1lbnQ7CisJCX07CisJCTAwMkYzNDRDMDlDQTFGQjMwMEVCRUI4OCAvKiBEZWZhdWx0ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdG92ZXJsYXkyLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0b3ZlcmxheTI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMkYzNDY3MDlDQTIwNEYwMEVCRUI4OCAvKiBEZXBsb3ltZW50ICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUlORk9QTElTVF9GSUxFID0gIkluZm8tdGVzdHBsYXRmb3JtLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0ZXN0cGxhdGZvcm07CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlcGxveW1lbnQ7CisJCX07CisJCTAwMkYzNDY4MDlDQTIwNEYwMEVCRUI4OCAvKiBEZXZlbG9wbWVudCAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJJbmZvLXRlc3RwbGF0Zm9ybS5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gdGVzdHBsYXRmb3JtOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDAyRjM0NjkwOUNBMjA0RjAwRUJFQjg4IC8qIERlZmF1bHQgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiSW5mby10ZXN0cGxhdGZvcm0ucGxpc3QiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRlc3RwbGF0Zm9ybTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVmYXVsdDsKKwkJfTsKKy8qIEVuZCBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCQkwMDFCNTkzNDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImxpYnNkbG1haW4uYSAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OTM1MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OTM2MDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTkzNzA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTkzODA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImNoZWNra2V5cyAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OTM5MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OTNBMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTkzQjA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTkzQzA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImdyYXl3aW4gKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTkzRDA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTkzRTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5M0YwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NDAwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJsb29wd2F2ZSAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OTQxMDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OTQyMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTk0MzA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk0NDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RhbHBoYSAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OTQ1MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OTQ2MDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTk0NzA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk0ODA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RiaXRtYXAgKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk0OTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk0QTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5NEIwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NEMwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0Y2Ryb20gKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk0RDA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk0RTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5NEYwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NTAwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0ZXJyb3IgKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk1MTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk1MjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5NTMwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NTQwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0Z2FtbWEgKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk1NTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk1NjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5NTcwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NTgwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0Z2wgKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk1OTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk1QTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5NUIwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NUMwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0dGhyZWFkIChVcGdyYWRlZCkiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDAxQjU5NUQwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8sCisJCQkJMDAxQjU5NUUwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovLAorCQkJCTAwMUI1OTVGMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTYwMDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdGpveXN0aWNrIChVcGdyYWRlZCkiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDAxQjU5NjEwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8sCisJCQkJMDAxQjU5NjIwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovLAorCQkJCTAwMUI1OTYzMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTY0MDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdGtleXMgKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk2NTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk2NjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5NjcwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NjgwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0bG9jayAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OTY5MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OTZBMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTk2QjA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk2QzA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RwYWxldHRlIChVcGdyYWRlZCkiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDAxQjU5NkQwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8sCisJCQkJMDAxQjU5NkUwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovLAorCQkJCTAwMUI1OTZGMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTcwMDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdHNlbSAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OTcxMDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OTcyMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTk3MzA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk3NDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RzcHJpdGUgKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk3NTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk3NjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5NzcwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5NzgwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0dGltZXIgKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk3OTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk3QTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5N0IwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5ODAwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0dmVyc2lvbiAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OTgxMDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OTgyMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTk4MzA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk4NDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3R2aWRpbmZvIChVcGdyYWRlZCkiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDAxQjU5ODUwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8sCisJCQkJMDAxQjU5ODYwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovLAorCQkJCTAwMUI1OTg3MDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTg4MDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdHdpbiAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OTg5MDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OThBMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTk4QjA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk4QzA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3R3bSAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OThEMDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OThFMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTk4RjA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk5MDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRocmVhZHdpbiAoVXBncmFkZWQpIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMUI1OTkxMDhCREI4MjYwMDY1MzlFOSAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMUI1OTkyMDhCREI4MjYwMDY1MzlFOSAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDFCNTk5MzA4QkRCODI2MDA2NTM5RTkgLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDFCNTk5NDA4QkRCODI2MDA2NTM5RTkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRvcnR1cmV0aHJlYWQgKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk5NTA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk5NjA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5OTcwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjU5OTgwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJBbGwiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDAxQjU5OTkwOEJEQjgyNjAwNjUzOUU5IC8qIERlcGxveW1lbnQgKi8sCisJCQkJMDAxQjU5OUEwOEJEQjgyNjAwNjUzOUU5IC8qIERldmVsb3BtZW50ICovLAorCQkJCTAwMUI1OTlCMDhCREI4MjYwMDY1MzlFOSAvKiBEZWZhdWx0ICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMUI1OTlDMDhCREI4MjYwMDY1MzlFOSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdG92ZXJsYXkgKFVwZ3JhZGVkKSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNTk5RDA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNTk5RTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjU5OUYwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAxQjVBMEMwOEJEQjgyNjAwNjUzOUU5IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiU0RMVGVzdCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDFCNUEwRDA4QkRCODI2MDA2NTM5RTkgLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDFCNUEwRTA4QkRCODI2MDA2NTM5RTkgLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAxQjVBMEYwOEJEQjgyNjAwNjUzOUU5IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAyRjMzN0QwOUNBMTRGOTAwRUJFQjg4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMkYzMzdFMDlDQTE0RjkwMEVCRUI4OCAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMkYzMzdGMDlDQTE0RjkwMEVCRUI4OCAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDJGMzM4MDA5Q0ExNEY5MDBFQkVCODggLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDJGMzM5MzA5Q0ExNkJGMDBFQkVCODggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RibGl0c3BlZWQiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDAyRjMzOTQwOUNBMTZCRjAwRUJFQjg4IC8qIERlcGxveW1lbnQgKi8sCisJCQkJMDAyRjMzOTUwOUNBMTZCRjAwRUJFQjg4IC8qIERldmVsb3BtZW50ICovLAorCQkJCTAwMkYzMzk2MDlDQTE2QkYwMEVCRUI4OCAvKiBEZWZhdWx0ICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMkYzM0Q3MDlDQTE5QTYwMEVCRUI4OCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdGR5bmdsIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMkYzM0Q4MDlDQTE5QTYwMEVCRUI4OCAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMkYzM0Q5MDlDQTE5QTYwMEVCRUI4OCAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDJGMzNEQTA5Q0ExOUE2MDBFQkVCODggLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDJGMzQwRTA5Q0ExQkZGMDBFQkVCODggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RmaWxlIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMkYzNDBGMDlDQTFCRkYwMEVCRUI4OCAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMkYzNDEwMDlDQTFCRkYwMEVCRUI4OCAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDJGMzQxMTA5Q0ExQkZGMDBFQkVCODggLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworCQkwMDJGMzQyRDA5Q0ExRjAzMDBFQkVCODggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRlc3RpY29udiIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkwMDJGMzQyRTA5Q0ExRjAzMDBFQkVCODggLyogRGVwbG95bWVudCAqLywKKwkJCQkwMDJGMzQyRjA5Q0ExRjAzMDBFQkVCODggLyogRGV2ZWxvcG1lbnQgKi8sCisJCQkJMDAyRjM0MzAwOUNBMUYwMzAwRUJFQjg4IC8qIERlZmF1bHQgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVmYXVsdDsKKwkJfTsKKwkJMDAyRjM0NDkwOUNBMUZCMzAwRUJFQjg4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0ZXN0b3ZlcmxheTIiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMDAyRjM0NEEwOUNBMUZCMzAwRUJFQjg4IC8qIERlcGxveW1lbnQgKi8sCisJCQkJMDAyRjM0NEIwOUNBMUZCMzAwRUJFQjg4IC8qIERldmVsb3BtZW50ICovLAorCQkJCTAwMkYzNDRDMDlDQTFGQjMwMEVCRUI4OCAvKiBEZWZhdWx0ICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlZmF1bHQ7CisJCX07CisJCTAwMkYzNDY2MDlDQTIwNEYwMEVCRUI4OCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidGVzdHBsYXRmb3JtIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTAwMkYzNDY3MDlDQTIwNEYwMEVCRUI4OCAvKiBEZXBsb3ltZW50ICovLAorCQkJCTAwMkYzNDY4MDlDQTIwNEYwMEVCRUI4OCAvKiBEZXZlbG9wbWVudCAqLywKKwkJCQkwMDJGMzQ2OTA5Q0EyMDRGMDBFQkVCODggLyogRGVmYXVsdCAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWZhdWx0OworCQl9OworLyogRW5kIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCX07CisJcm9vdE9iamVjdCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9TRExUZXN0L2xpYnNkbG1haW5fcHJlZml4LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9saWJzZGxtYWluX3ByZWZpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNDFjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvU0RMVGVzdC9saWJzZGxtYWluX3ByZWZpeC5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiAgbGlic2RsbWFpbl9wcmVmaXguaAorICogIFNETFRlc3QKKyAqCisgKiAgQ3JlYXRlZCBieSBEYXJyZWxsIFdhbGlzc2VyIG9uIFdlZCBBdWcgMDYgMjAwMy4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgX19NeUNvbXBhbnlOYW1lX18uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxDb2NvYS9Db2NvYS5oPgorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExNYWluLmgiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MjFiMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vSW5mby5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL0luZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzMzIwNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL0luZm8ucGxpc3QKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+JHtFWEVDVVRBQkxFX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLnlvdXJjb21wYW55Ll9fX1BST0pFQ1ROQU1FQVNYTUxfX188L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW48L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKwk8a2V5PkxTTWluaW11bVN5c3RlbVZlcnNpb25CeUFyY2hpdGVjdHVyZTwva2V5PgorCTxkaWN0PgorCQk8a2V5Png4Nl82NDwva2V5PgorCQk8c3RyaW5nPjEwLjYuMDwvc3RyaW5nPgorCQk8a2V5PmkzODY8L2tleT4KKwkJPHN0cmluZz4xMC40LjA8L3N0cmluZz4KKwkJPGtleT5wcGM8L2tleT4KKwkJPHN0cmluZz4xMC40LjA8L3N0cmluZz4KKwk8L2RpY3Q+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vU0RMTWFpbi5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vU0RMTWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmQ5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9TRExNYWluLmgKQEAgLTAsMCArMSwxNiBAQAorLyogICBTRExNYWluLm0gLSBtYWluIGVudHJ5IHBvaW50IGZvciBvdXIgQ29jb2EtaXplZCBTREwgYXBwCisgICAgICAgSW5pdGlhbCBWZXJzaW9uOiBEYXJyZWxsIFdhbGlzc2VyIDxkd2FsaXNzMUBwdXJkdWUuZWR1PgorICAgICAgIE5vbi1OSUItQ29kZSAmIG90aGVyIGNoYW5nZXM6IE1heCBIb3JuIDxtYXhAcXVlbmRpLmRlPgorCisgICAgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzCisqLworCisjaWZuZGVmIF9TRExNYWluX2hfCisjZGVmaW5lIF9TRExNYWluX2hfCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgU0RMTWFpbiA6IE5TT2JqZWN0CitAZW5kCisKKyNlbmRpZiAvKiBfU0RMTWFpbl9oXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vU0RMTWFpbi5tIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vU0RMTWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjVhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9TRExNYWluLm0KQEAgLTAsMCArMSwzODMgQEAKKy8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAorICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKyAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KKworICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcworKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETE1haW4uaCIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gLyogZm9yIE1BWFBBVEhMRU4gKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogRm9yIHNvbWUgcmVhb24sIEFwcGxlIHJlbW92ZWQgc2V0QXBwbGVNZW51IGZyb20gdGhlIGhlYWRlcnMgaW4gMTAuNCwKKyBidXQgdGhlIG1ldGhvZCBzdGlsbCBpcyB0aGVyZSBhbmQgd29ya3MuIFRvIGF2b2lkIHdhcm5pbmdzLCB3ZSBkZWNsYXJlCisgaXQgb3Vyc2VsdmVzIGhlcmUuICovCitAaW50ZXJmYWNlIE5TQXBwbGljYXRpb24oU0RMX01pc3NpbmdfTWV0aG9kcykKKy0gKHZvaWQpc2V0QXBwbGVNZW51OihOU01lbnUgKiltZW51OworQGVuZAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBTRExNYWluLm5pYiBvciBub3QgKi8KKyNkZWZpbmUJCVNETF9VU0VfTklCX0ZJTEUJMAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBDUFMgKGRvY2tpbmcpIG9yIG5vdCAqLworI2RlZmluZQkJU0RMX1VTRV9DUFMJCTEKKyNpZmRlZiBTRExfVVNFX0NQUworLyogUG9ydGlvbnMgb2YgQ1BTLmggKi8KK3R5cGVkZWYgc3RydWN0IENQU1Byb2Nlc3NTZXJOdW0KK3sKKwlVSW50MzIJCWxvOworCVVJbnQzMgkJaGk7Cit9IENQU1Byb2Nlc3NTZXJOdW07CisKK2V4dGVybiBPU0VycglDUFNHZXRDdXJyZW50UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKK2V4dGVybiBPU0VyciAJQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbiggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuLCBVSW50MzIgX2FyZzIsIFVJbnQzMiBfYXJnMywgVUludDMyIF9hcmc0LCBVSW50MzIgX2FyZzUpOworZXh0ZXJuIE9TRXJyCUNQU1NldEZyb250UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKKworI2VuZGlmIC8qIFNETF9VU0VfQ1BTICovCisKK3N0YXRpYyBpbnQgICAgZ0FyZ2M7CitzdGF0aWMgY2hhciAgKipnQXJndjsKK3N0YXRpYyBCT09MICAgZ0ZpbmRlckxhdW5jaDsKK3N0YXRpYyBCT09MICAgZ0NhbGxlZEFwcE1haW5saW5lID0gRkFMU0U7CisKK3N0YXRpYyBOU1N0cmluZyAqZ2V0QXBwbGljYXRpb25OYW1lKHZvaWQpCit7CisgICAgY29uc3QgTlNEaWN0aW9uYXJ5ICpkaWN0OworICAgIE5TU3RyaW5nICphcHBOYW1lID0gMDsKKworICAgIC8qIERldGVybWluZSB0aGUgYXBwbGljYXRpb24gbmFtZSAqLworICAgIGRpY3QgPSAoY29uc3QgTlNEaWN0aW9uYXJ5ICopQ0ZCdW5kbGVHZXRJbmZvRGljdGlvbmFyeShDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgaWYgKGRpY3QpCisgICAgICAgIGFwcE5hbWUgPSBbZGljdCBvYmplY3RGb3JLZXk6IEAiQ0ZCdW5kbGVOYW1lIl07CisgICAgCisgICAgaWYgKCFbYXBwTmFtZSBsZW5ndGhdKQorICAgICAgICBhcHBOYW1lID0gW1tOU1Byb2Nlc3NJbmZvIHByb2Nlc3NJbmZvXSBwcm9jZXNzTmFtZV07CisKKyAgICByZXR1cm4gYXBwTmFtZTsKK30KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKy8qIEEgaGVscGVyIGNhdGVnb3J5IGZvciBOU1N0cmluZyAqLworQGludGVyZmFjZSBOU1N0cmluZyAoUmVwbGFjZVN1YlN0cmluZykKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgU0RMQXBwbGljYXRpb24gOiBOU0FwcGxpY2F0aW9uCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTRExBcHBsaWNhdGlvbgorLyogSW52b2tlZCBmcm9tIHRoZSBRdWl0IG1lbnUgaXRlbSAqLworLSAodm9pZCl0ZXJtaW5hdGU6KGlkKXNlbmRlcgoreworICAgIC8qIFBvc3QgYSBTRExfUVVJVCBldmVudCAqLworICAgIFNETF9FdmVudCBldmVudDsKKyAgICBldmVudC50eXBlID0gU0RMX1FVSVQ7CisgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOworfQorQGVuZAorCisvKiBUaGUgbWFpbiBjbGFzcyBvZiB0aGUgYXBwbGljYXRpb24sIHRoZSBhcHBsaWNhdGlvbidzIGRlbGVnYXRlICovCitAaW1wbGVtZW50YXRpb24gU0RMTWFpbgorCisvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworLSAodm9pZCkgc2V0dXBXb3JraW5nRGlyZWN0b3J5OihCT09MKXNob3VsZENoZGlyCit7CisgICAgaWYgKHNob3VsZENoZGlyKQorICAgIHsKKyAgICAgICAgY2hhciBwYXJlbnRkaXJbTUFYUEFUSExFTl07CisgICAgICAgIENGVVJMUmVmIHVybCA9IENGQnVuZGxlQ29weUJ1bmRsZVVSTChDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgICAgIENGVVJMUmVmIHVybDIgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KDAsIHVybCk7CisgICAgICAgIGlmIChDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbih1cmwyLCAxLCAoVUludDggKilwYXJlbnRkaXIsIE1BWFBBVEhMRU4pKSB7CisgICAgICAgICAgICBjaGRpcihwYXJlbnRkaXIpOyAgIC8qIGNoZGlyIHRvIHRoZSBiaW5hcnkgYXBwJ3MgcGFyZW50ICovCisgICAgICAgIH0KKyAgICAgICAgQ0ZSZWxlYXNlKHVybCk7CisgICAgICAgIENGUmVsZWFzZSh1cmwyKTsKKyAgICB9Cit9CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisKKy8qIEZpeCBtZW51IHRvIGNvbnRhaW4gdGhlIHJlYWwgYXBwIG5hbWUgaW5zdGVhZCBvZiAiU0RMIEFwcCIgKi8KKy0gKHZvaWQpZml4TWVudTooTlNNZW51ICopYU1lbnUgd2l0aEFwcE5hbWU6KE5TU3RyaW5nICopYXBwTmFtZQoreworICAgIE5TUmFuZ2UgYVJhbmdlOworICAgIE5TRW51bWVyYXRvciAqZW51bWVyYXRvcjsKKyAgICBOU01lbnVJdGVtICptZW51SXRlbTsKKworICAgIGFSYW5nZSA9IFtbYU1lbnUgdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgaWYgKGFSYW5nZS5sZW5ndGggIT0gMCkKKyAgICAgICAgW2FNZW51IHNldFRpdGxlOiBbW2FNZW51IHRpdGxlXSBzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOmFSYW5nZSB3aXRoOmFwcE5hbWVdXTsKKworICAgIGVudW1lcmF0b3IgPSBbW2FNZW51IGl0ZW1BcnJheV0gb2JqZWN0RW51bWVyYXRvcl07CisgICAgd2hpbGUgKChtZW51SXRlbSA9IFtlbnVtZXJhdG9yIG5leHRPYmplY3RdKSkKKyAgICB7CisgICAgICAgIGFSYW5nZSA9IFtbbWVudUl0ZW0gdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgICAgIGlmIChhUmFuZ2UubGVuZ3RoICE9IDApCisgICAgICAgICAgICBbbWVudUl0ZW0gc2V0VGl0bGU6IFtbbWVudUl0ZW0gdGl0bGVdIHN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6YVJhbmdlIHdpdGg6YXBwTmFtZV1dOworICAgICAgICBpZiAoW21lbnVJdGVtIGhhc1N1Ym1lbnVdKQorICAgICAgICAgICAgW3NlbGYgZml4TWVudTpbbWVudUl0ZW0gc3VibWVudV0gd2l0aEFwcE5hbWU6YXBwTmFtZV07CisgICAgfQorICAgIFsgYU1lbnUgc2l6ZVRvRml0IF07Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIHNldEFwcGxpY2F0aW9uTWVudSh2b2lkKQoreworICAgIC8qIHdhcm5pbmc6IHRoaXMgY29kZSBpcyB2ZXJ5IG9kZCAqLworICAgIE5TTWVudSAqYXBwbGVNZW51OworICAgIE5TTWVudUl0ZW0gKm1lbnVJdGVtOworICAgIE5TU3RyaW5nICp0aXRsZTsKKyAgICBOU1N0cmluZyAqYXBwTmFtZTsKKyAgICAKKyAgICBhcHBOYW1lID0gZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgICAgYXBwbGVNZW51ID0gW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCIiXTsKKyAgICAKKyAgICAvKiBBZGQgbWVudSBpdGVtcyAqLworICAgIHRpdGxlID0gW0AiQWJvdXQgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3RvcihvcmRlckZyb250U3RhbmRhcmRBYm91dFBhbmVsOikga2V5RXF1aXZhbGVudDpAIiJdOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtOltOU01lbnVJdGVtIHNlcGFyYXRvckl0ZW1dXTsKKworICAgIHRpdGxlID0gW0AiSGlkZSAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKGhpZGU6KSBrZXlFcXVpdmFsZW50OkAiaCJdOworCisgICAgbWVudUl0ZW0gPSAoTlNNZW51SXRlbSAqKVthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTpAIkhpZGUgT3RoZXJzIiBhY3Rpb246QHNlbGVjdG9yKGhpZGVPdGhlckFwcGxpY2F0aW9uczopIGtleUVxdWl2YWxlbnQ6QCJoIl07CisgICAgW21lbnVJdGVtIHNldEtleUVxdWl2YWxlbnRNb2RpZmllck1hc2s6KE5TQWx0ZXJuYXRlS2V5TWFza3xOU0NvbW1hbmRLZXlNYXNrKV07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6QCJTaG93IEFsbCIgYWN0aW9uOkBzZWxlY3Rvcih1bmhpZGVBbGxBcHBsaWNhdGlvbnM6KSBrZXlFcXVpdmFsZW50OkAiIl07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW06W05TTWVudUl0ZW0gc2VwYXJhdG9ySXRlbV1dOworCisgICAgdGl0bGUgPSBbQCJRdWl0ICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3IodGVybWluYXRlOikga2V5RXF1aXZhbGVudDpAInEiXTsKKworICAgIAorICAgIC8qIFB1dCBtZW51IGludG8gdGhlIG1lbnViYXIgKi8KKyAgICBtZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiIgYWN0aW9uOm5pbCBrZXlFcXVpdmFsZW50OkAiIl07CisgICAgW21lbnVJdGVtIHNldFN1Ym1lbnU6YXBwbGVNZW51XTsKKyAgICBbW05TQXBwIG1haW5NZW51XSBhZGRJdGVtOm1lbnVJdGVtXTsKKworICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSBhcHBsaWNhdGlvbiBtZW51ICovCisgICAgW05TQXBwIHNldEFwcGxlTWVudTphcHBsZU1lbnVdOworCisgICAgLyogRmluYWxseSBnaXZlIHVwIG91ciByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RzICovCisgICAgW2FwcGxlTWVudSByZWxlYXNlXTsKKyAgICBbbWVudUl0ZW0gcmVsZWFzZV07Cit9CisKKy8qIENyZWF0ZSBhIHdpbmRvdyBtZW51ICovCitzdGF0aWMgdm9pZCBzZXR1cFdpbmRvd01lbnUodm9pZCkKK3sKKyAgICBOU01lbnUgICAgICAqd2luZG93TWVudTsKKyAgICBOU01lbnVJdGVtICAqd2luZG93TWVudUl0ZW07CisgICAgTlNNZW51SXRlbSAgKm1lbnVJdGVtOworCisgICAgd2luZG93TWVudSA9IFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiV2luZG93Il07CisgICAgCisgICAgLyogIk1pbmltaXplIiBpdGVtICovCisgICAgbWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJNaW5pbWl6ZSIgYWN0aW9uOkBzZWxlY3RvcihwZXJmb3JtTWluaWF0dXJpemU6KSBrZXlFcXVpdmFsZW50OkAibSJdOworICAgIFt3aW5kb3dNZW51IGFkZEl0ZW06bWVudUl0ZW1dOworICAgIFttZW51SXRlbSByZWxlYXNlXTsKKyAgICAKKyAgICAvKiBQdXQgbWVudSBpbnRvIHRoZSBtZW51YmFyICovCisgICAgd2luZG93TWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJXaW5kb3ciIGFjdGlvbjpuaWwga2V5RXF1aXZhbGVudDpAIiJdOworICAgIFt3aW5kb3dNZW51SXRlbSBzZXRTdWJtZW51OndpbmRvd01lbnVdOworICAgIFtbTlNBcHAgbWFpbk1lbnVdIGFkZEl0ZW06d2luZG93TWVudUl0ZW1dOworICAgIAorICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSB3aW5kb3cgbWVudSAqLworICAgIFtOU0FwcCBzZXRXaW5kb3dzTWVudTp3aW5kb3dNZW51XTsKKworICAgIC8qIEZpbmFsbHkgZ2l2ZSB1cCBvdXIgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyAqLworICAgIFt3aW5kb3dNZW51IHJlbGVhc2VdOworICAgIFt3aW5kb3dNZW51SXRlbSByZWxlYXNlXTsKK30KKworLyogUmVwbGFjZW1lbnQgZm9yIE5TQXBwbGljYXRpb25NYWluICovCitzdGF0aWMgdm9pZCBDdXN0b21BcHBsaWNhdGlvbk1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBOU0F1dG9yZWxlYXNlUG9vbAkqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICAgIFNETE1haW4JCQkJKnNkbE1haW47CisKKyAgICAvKiBFbnN1cmUgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBpcyBpbml0aWFsaXNlZCAqLworICAgIFtTRExBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07CisgICAgCisjaWZkZWYgU0RMX1VTRV9DUFMKKyAgICB7CisgICAgICAgIENQU1Byb2Nlc3NTZXJOdW0gUFNOOworICAgICAgICAvKiBUZWxsIHRoZSBkb2NrIGFib3V0IHVzICovCisgICAgICAgIGlmICghQ1BTR2V0Q3VycmVudFByb2Nlc3MoJlBTTikpCisgICAgICAgICAgICBpZiAoIUNQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb24oJlBTTiwweDAzLDB4M0MsMHgyQywweDExMDMpKQorICAgICAgICAgICAgICAgIGlmICghQ1BTU2V0RnJvbnRQcm9jZXNzKCZQU04pKQorICAgICAgICAgICAgICAgICAgICBbU0RMQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIH0KKyNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLworCisgICAgLyogU2V0IHVwIHRoZSBtZW51YmFyICovCisgICAgW05TQXBwIHNldE1haW5NZW51OltbTlNNZW51IGFsbG9jXSBpbml0XV07CisgICAgc2V0QXBwbGljYXRpb25NZW51KCk7CisgICAgc2V0dXBXaW5kb3dNZW51KCk7CisKKyAgICAvKiBDcmVhdGUgU0RMTWFpbiBhbmQgbWFrZSBpdCB0aGUgYXBwIGRlbGVnYXRlICovCisgICAgc2RsTWFpbiA9IFtbU0RMTWFpbiBhbGxvY10gaW5pdF07CisgICAgW05TQXBwIHNldERlbGVnYXRlOnNkbE1haW5dOworICAgIAorICAgIC8qIFN0YXJ0IHRoZSBtYWluIGV2ZW50IGxvb3AgKi8KKyAgICBbTlNBcHAgcnVuXTsKKyAgICAKKyAgICBbc2RsTWFpbiByZWxlYXNlXTsKKyAgICBbcG9vbCByZWxlYXNlXTsKK30KKworI2VuZGlmCisKKworLyoKKyAqIENhdGNoIGRvY3VtZW50IG9wZW4gcmVxdWVzdHMuLi50aGlzIGxldHMgdXMgbm90aWNlIGZpbGVzIHdoZW4gdGhlIGFwcAorICogIHdhcyBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgYSBkb2N1bWVudCwgb3Igd2hlbiBhIGRvY3VtZW50IHdhcworICogIGRyYWdnZWQvZHJvcHBlZCBvbiB0aGUgYXBwJ3MgaWNvbi4gWW91IG5lZWQgdG8gaGF2ZSBhCisgKiAgQ0ZCdW5kbGVEb2N1bWVudHNUeXBlIHNlY3Rpb24gaW4geW91ciBJbmZvLnBsaXN0IHRvIGdldCB0aGlzIG1lc3NhZ2UsCisgKiAgYXBwYXJlbnRseS4KKyAqCisgKiBGaWxlcyBhcmUgYWRkZWQgdG8gZ0FyZ3YsIHNvIHRvIHRoZSBhcHAsIHRoZXknbGwgbG9vayBsaWtlIGNvbW1hbmQgbGluZQorICogIGFyZ3VtZW50cy4gUHJldmlvdXNseSwgYXBwcyBsYXVuY2hlZCBmcm9tIHRoZSBmaW5kZXIgaGFkIG5vdGhpbmcgYnV0CisgKiAgYW4gYXJndlswXS4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgbWF5IGJlIHJlY2VpdmVkIG11bHRpcGxlIHRpbWVzIHRvIG9wZW4gc2V2ZXJhbCBkb2NzIG9uIGxhdW5jaC4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgaXMgaWdub3JlZCBvbmNlIHRoZSBhcHAncyBtYWlubGluZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKy0gKEJPT0wpYXBwbGljYXRpb246KE5TQXBwbGljYXRpb24gKil0aGVBcHBsaWNhdGlvbiBvcGVuRmlsZTooTlNTdHJpbmcgKilmaWxlbmFtZQoreworICAgIGNvbnN0IGNoYXIgKnRlbXBhcmc7CisgICAgc2l6ZV90IGFyZ2xlbjsKKyAgICBjaGFyICphcmc7CisgICAgY2hhciAqKm5ld2FyZ3Y7CisKKyAgICBpZiAoIWdGaW5kZXJMYXVuY2gpICAvKiBNYWNPUyBpcyBwYXNzaW5nIGNvbW1hbmQgbGluZSBhcmdzLiAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoZ0NhbGxlZEFwcE1haW5saW5lKSAgLyogYXBwIGhhcyBzdGFydGVkLCBpZ25vcmUgdGhpcyBkb2N1bWVudC4gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdGVtcGFyZyA9IFtmaWxlbmFtZSBVVEY4U3RyaW5nXTsKKyAgICBhcmdsZW4gPSBTRExfc3RybGVuKHRlbXBhcmcpICsgMTsKKyAgICBhcmcgPSAoY2hhciAqKSBTRExfbWFsbG9jKGFyZ2xlbik7CisgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBuZXdhcmd2ID0gKGNoYXIgKiopIHJlYWxsb2MoZ0FyZ3YsIHNpemVvZiAoY2hhciAqKSAqIChnQXJnYyArIDIpKTsKKyAgICBpZiAobmV3YXJndiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX2ZyZWUoYXJnKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBnQXJndiA9IG5ld2FyZ3Y7CisKKyAgICBTRExfc3RybGNweShhcmcsIHRlbXBhcmcsIGFyZ2xlbik7CisgICAgZ0FyZ3ZbZ0FyZ2MrK10gPSBhcmc7CisgICAgZ0FyZ3ZbZ0FyZ2NdID0gTlVMTDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKiBDYWxsZWQgd2hlbiB0aGUgaW50ZXJuYWwgZXZlbnQgbG9vcCBoYXMganVzdCBzdGFydGVkIHJ1bm5pbmcgKi8KKy0gKHZvaWQpIGFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOiAoTlNOb3RpZmljYXRpb24gKikgbm90ZQoreworICAgIGludCBzdGF0dXM7CisKKyAgICAvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworICAgIFtzZWxmIHNldHVwV29ya2luZ0RpcmVjdG9yeTpnRmluZGVyTGF1bmNoXTsKKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICAvKiBTZXQgdGhlIG1haW4gbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCisgICAgW3NlbGYgZml4TWVudTpbTlNBcHAgbWFpbk1lbnVdIHdpdGhBcHBOYW1lOmdldEFwcGxpY2F0aW9uTmFtZSgpXTsKKyNlbmRpZgorCisgICAgLyogSGFuZCBvZmYgdG8gbWFpbiBhcHBsaWNhdGlvbiBjb2RlICovCisgICAgZ0NhbGxlZEFwcE1haW5saW5lID0gVFJVRTsKKyAgICBzdGF0dXMgPSBTRExfbWFpbiAoZ0FyZ2MsIGdBcmd2KTsKKworICAgIC8qIFdlJ3JlIGRvbmUsIHRoYW5rIHlvdSBmb3IgcGxheWluZyAqLworICAgIGV4aXQoc3RhdHVzKTsKK30KK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCisKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZmZlclNpemU7CisgICAgdW5zaWduZWQgaW50IHNlbGZMZW4gPSBbc2VsZiBsZW5ndGhdOworICAgIHVuc2lnbmVkIGludCBhU3RyaW5nTGVuID0gW2FTdHJpbmcgbGVuZ3RoXTsKKyAgICB1bmljaGFyICpidWZmZXI7CisgICAgTlNSYW5nZSBsb2NhbFJhbmdlOworICAgIE5TU3RyaW5nICpyZXN1bHQ7CisKKyAgICBidWZmZXJTaXplID0gc2VsZkxlbiArIGFTdHJpbmdMZW4gLSBhUmFuZ2UubGVuZ3RoOworICAgIGJ1ZmZlciA9ICh1bmljaGFyICopTlNBbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlclNpemUqc2l6ZW9mKHVuaWNoYXIpKTsKKyAgICAKKyAgICAvKiBHZXQgZmlyc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVJhbmdlLmxvY2F0aW9uOworICAgIFtzZWxmIGdldENoYXJhY3RlcnM6YnVmZmVyIHJhbmdlOmxvY2FsUmFuZ2VdOworICAgIAorICAgIC8qIEdldCBtaWRkbGUgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVN0cmluZ0xlbjsKKyAgICBbYVN0cmluZyBnZXRDaGFyYWN0ZXJzOihidWZmZXIrYVJhbmdlLmxvY2F0aW9uKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAgCisgICAgLyogR2V0IGxhc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSBhUmFuZ2UubG9jYXRpb24gKyBhUmFuZ2UubGVuZ3RoOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gc2VsZkxlbiAtIGxvY2FsUmFuZ2UubG9jYXRpb247CisgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbithU3RyaW5nTGVuKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAKKyAgICAvKiBCdWlsZCBvdXRwdXQgc3RyaW5nICovCisgICAgcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhDaGFyYWN0ZXJzOmJ1ZmZlciBsZW5ndGg6YnVmZmVyU2l6ZV07CisgICAgCisgICAgTlNEZWFsbG9jYXRlTWVtb3J5UGFnZXMoYnVmZmVyLCBidWZmZXJTaXplKTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCisKKworCisjaWZkZWYgbWFpbgorIyAgdW5kZWYgbWFpbgorI2VuZGlmCisKKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBleGVjdXRhYmxlIC0gc2hvdWxkICpub3QqIGJlIFNETF9tYWluISAqLworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgaW50byBhIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIC8qIFRoaXMgaXMgcGFzc2VkIGlmIHdlIGFyZSBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgKi8KKyAgICBpZiAoIGFyZ2MgPj0gMiAmJiBzdHJuY21wIChhcmd2WzFdLCAiLXBzbiIsIDQpID09IDAgKSB7CisgICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogMik7CisgICAgICAgIGdBcmd2WzBdID0gYXJndlswXTsKKyAgICAgICAgZ0FyZ3ZbMV0gPSBOVUxMOworICAgICAgICBnQXJnYyA9IDE7CisgICAgICAgIGdGaW5kZXJMYXVuY2ggPSBZRVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGdBcmdjID0gYXJnYzsKKyAgICAgICAgZ0FyZ3YgPSAoY2hhciAqKikgU0RMX21hbGxvYyhzaXplb2YgKGNoYXIgKikgKiAoYXJnYysxKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYXJnYzsgaSsrKQorICAgICAgICAgICAgZ0FyZ3ZbaV0gPSBhcmd2W2ldOworICAgICAgICBnRmluZGVyTGF1bmNoID0gTk87CisgICAgfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorICAgIFtTRExBcHBsaWNhdGlvbiBwb3NlQXNDbGFzczpbTlNBcHBsaWNhdGlvbiBjbGFzc11dOworICAgIE5TQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbHNlCisgICAgQ3VzdG9tQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRUFTSURFTlRJRklFUl9fX19QcmVmaXgucGNoIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDA5NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaApAQCAtMCwwICsxLDkgQEAKKy8vCisvLyBQcmVmaXggaGVhZGVyIGZvciBhbGwgc291cmNlIGZpbGVzIG9mIHRoZSAnx1BST0pFQ1ROQU1FyCcgdGFyZ2V0IGluIHRoZSAnx1BST0pFQ1ROQU1FyCcgcHJvamVjdAorLy8KKworI2luY2x1ZGUgIlNETC5oIgorCisjaWZkZWYgX19PQkpDX18KKyAgICAjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJY29uLmljbnMgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJY29uLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwYjAyYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUljb24uaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJbmZvLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWNhNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApAQCAtMCwwICsxLDEyIEBACit7CisJRmlsZXNUb1JlbmFtZSA9IHsKKwkJIlNETEFwcF9QcmVmaXgucGNoIiA9ICLHUFJPSkVDVE5BTUXIX1ByZWZpeC5wY2giOworCX07CisJRmlsZXNUb01hY3JvRXhwYW5kID0gKAorCQkix1BST0pFQ1ROQU1FyF9QcmVmaXgucGNoIiwKKwkJIkluZm8ucGxpc3QiLAorCQkiRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyIsCisJCSJtYWluLmMiLAorCSk7CisJRGVzY3JpcHRpb24gPSAiVGhpcyBwcm9qZWN0IGJ1aWxkcyBhbiBTREwtYmFzZWQgYXBwbGljYXRpb24uIjsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZmYwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsMzA4IEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDI7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJMDAyRjM5RkEwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjNBMDAwOUQwODg0NjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjM5RjkwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzQTJFMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovOyB9OworCQkwMDJGM0EzRjA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNBM0UwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyAqLzsgfTsKKwkJOEQxMTA3MkIwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi87IH07CisJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGRDA5RDA4ODM0MDBFQkVCODggLyogQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxMDsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzQTAwMDlEMDg4NDYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCW5hbWUgPSAiQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUiOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gU0RMLmZyYW1ld29yazsgcGF0aCA9IC9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMDAyRjNBMkIwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETE1haW4uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU0RMTWFpbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBtYWluLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDg5QzE2NURGRTg0MEUwQ0MwMkFBQzA3IC8qIEVuZ2xpc2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMTA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC5zdHJpbmdzOyBuYW1lID0gRW5nbGlzaDsgcGF0aCA9IEVuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTEwNThDN0ExRkVBNTRGMDExMUNBMkNCQiAvKiBDb2NvYS5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENvY29hLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMjlCOTczMjRGRENGQTM5NDExQ0EyQ0VBIC8qIEFwcEtpdC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEFwcEtpdC5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkyOUI5NzMyNUZEQ0ZBMzk0MTFDQTJDRUEgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEZvdW5kYXRpb24uZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvRm91bmRhdGlvbi5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTMyQ0E0RjYzMDM2OEQxRUUwMEM5MTc4MyAvKiBfX19QUk9KRUNUTkFNRV9fX19QcmVmaXgucGNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiX19fUFJPSkVDVE5BTUVfX19fUHJlZml4LnBjaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMTEwNzMxMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMTEwNzMyMDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXy5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9ICJfX19QUk9KRUNUTkFNRV9fXy5hcHAiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzJFMDQ4NkNFQjgwMEU0NzA5MCAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjM5RkEwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQk4RDExMDcyRjA0ODZDRUI4MDBFNDcwOTAgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhHcm91cCBzZWN0aW9uICovCisJCTA4MEU5NkRERkUyMDFENkQ3RjAwMDAwMSAvKiBDbGFzc2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGM0EyQjA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5oICovLAorCQkJCTAwMkYzQTJDMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gKi8sCisJCQkpOworCQkJbmFtZSA9IENsYXNzZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxMDU4QzdBMEZFQTU0RjAxMTFDQTJDQkIgLyogTGlua2VkIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovLAorCQkJCTEwNThDN0ExRkVBNTRGMDExMUNBMkNCQiAvKiBDb2NvYS5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJMaW5rZWQgRnJhbWV3b3JrcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxMDU4QzdBMkZFQTU0RjAxMTFDQTJDQkIgLyogT3RoZXIgRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMjlCOTczMjRGRENGQTM5NDExQ0EyQ0VBIC8qIEFwcEtpdC5mcmFtZXdvcmsgKi8sCisJCQkJMjlCOTczMjVGRENGQTM5NDExQ0EyQ0VBIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovLAorCQkJKTsKKwkJCW5hbWUgPSAiT3RoZXIgRnJhbWV3b3JrcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxOUMyOEZBQ0ZFOUQ1MjBEMTFDQTJDQkIgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCThEMTEwNzMyMDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXy5hcHAgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTRGRENGQTM5NDExQ0EyQ0VBIC8qIF9fX1BST0pFQ1ROQU1FQVNYTUxfX18gKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA4MEU5NkRERkUyMDFENkQ3RjAwMDAwMSAvKiBDbGFzc2VzICovLAorCQkJCTI5Qjk3MzE1RkRDRkEzOTQxMUNBMkNFQSAvKiBPdGhlciBTb3VyY2VzICovLAorCQkJCTI5Qjk3MzE3RkRDRkEzOTQxMUNBMkNFQSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJMjlCOTczMjNGRENGQTM5NDExQ0EyQ0VBIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMTlDMjhGQUNGRTlENTIwRDExQ0EyQ0JCIC8qIFByb2R1Y3RzICovLAorCQkJKTsKKwkJCW5hbWUgPSAiX19fUFJPSkVDVE5BTUVBU1hNTF9fXyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMxNUZEQ0ZBMzk0MTFDQTJDRUEgLyogT3RoZXIgU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMzJDQTRGNjMwMzY4RDFFRTAwQzkxNzgzIC8qIF9fX1BST0pFQ1ROQU1FX19fX1ByZWZpeC5wY2ggKi8sCisJCQkJMDAyRjNBM0UwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyAqLywKKwkJCSk7CisJCQluYW1lID0gIk90aGVyIFNvdXJjZXMiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTdGRENGQTM5NDExQ0EyQ0VBIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQxMTA3MzEwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm8ucGxpc3QgKi8sCisJCQkJMDg5QzE2NUNGRTg0MEUwQ0MwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovLAorCQkJKTsKKwkJCW5hbWUgPSBSZXNvdXJjZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMyM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMTA1OEM3QTBGRUE1NEYwMTExQ0EyQ0JCIC8qIExpbmtlZCBGcmFtZXdvcmtzICovLAorCQkJCTEwNThDN0EyRkVBNTRGMDExMUNBMkNCQiAvKiBPdGhlciBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCW5hbWUgPSBGcmFtZXdvcmtzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCThEMTEwNzI2MDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXyAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBDMDFGQ0Y0QTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIl9fX1BST0pFQ1ROQU1FX19fIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjM5RkQwOUQwODgzNDAwRUJFQjg4IC8qIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiX19fUFJPSkVDVE5BTUVfX18iOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCXByb2R1Y3ROYW1lID0gIl9fX1BST0pFQ1ROQU1FX19fIjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA4RDExMDczMjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18uYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisvKiBFbmQgUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUHJvamVjdCBzZWN0aW9uICovCisJCTI5Qjk3MzEzRkRDRkEzOTQxMUNBMkNFQSAvKiBQcm9qZWN0IG9iamVjdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFByb2plY3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gQzAxRkNGNEUwOEE5NTQ1NDAwNTQyNDdCIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiX19fUFJPSkVDVE5BTUVfX18iICovOworCQkJY29tcGF0aWJpbGl0eVZlcnNpb24gPSAiWGNvZGUgMi40IjsKKwkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOworCQkJbWFpbkdyb3VwID0gMjlCOTczMTRGRENGQTM5NDExQ0EyQ0VBIC8qIF9fX1BST0pFQ1ROQU1FQVNYTUxfX18gKi87CisJCQlwcm9qZWN0RGlyUGF0aCA9ICIiOworCQkJcHJvamVjdFJvb3QgPSAiIjsKKwkJCXRhcmdldHMgPSAoCisJCQkJOEQxMTA3MjYwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCThEMTEwNzJCMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGM0EyRTA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNBM0YwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYVmFyaWFudEdyb3VwIHNlY3Rpb24gKi8KKwkJMDg5QzE2NUNGRTg0MEUwQ0MwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovID0geworCQkJaXNhID0gUEJYVmFyaWFudEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDg5QzE2NURGRTg0MEUwQ0MwMkFBQzA3IC8qIEVuZ2xpc2ggKi8sCisJCQkpOworCQkJbmFtZSA9IEluZm9QbGlzdC5zdHJpbmdzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisJCUMwMUZDRjRCMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIl9fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2giOworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9BcHBsaWNhdGlvbnMiOworCQkJCVBST0RVQ1RfTkFNRSA9ICJfX19QUk9KRUNUTkFNRV9fXyI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlDMDFGQ0Y0QzA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICJfX19QUk9KRUNUTkFNRUFTSURFTlRJRklFUl9fX19QcmVmaXgucGNoIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCQlQUk9EVUNUX05BTUUgPSAiX19fUFJPSkVDVE5BTUVfX18iOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlDMDFGQ0Y0RjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl9CSVRfUFJFX1hDT0RFXzNfMSkiOworCQkJCUFSQ0hTX1NUQU5EQVJEXzMyX0JJVF9QUkVfWENPREVfM18xID0gInBwYyBpMzg2IjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzLAorCQkJCQkiJChGUkFNRVdPUktfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlHQ0NfVkVSU0lPTiA9IDQuMDsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzLAorCQkJCQkiJChIRUFERVJfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJU0RLUk9PVCA9IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGs7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlDMDFGQ0Y1MDA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyX0JJVF9QUkVfWENPREVfM18xKSI7CisJCQkJQVJDSFNfU1RBTkRBUkRfMzJfQklUX1BSRV9YQ09ERV8zXzEgPSAicHBjIGkzODYiOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MsCisJCQkJCSIkKEZSQU1FV09SS19TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCUdDQ19WRVJTSU9OID0gNC4wOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMsCisJCQkJCSIkKEhFQURFUl9TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCQlDMDFGQ0Y0QTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIl9fX1BST0pFQ1ROQU1FX19fIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUMwMUZDRjRCMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLywKKwkJCQlDMDFGQ0Y0QzA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQlDMDFGQ0Y0RTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJfX19QUk9KRUNUTkFNRV9fXyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlDMDFGQ0Y0RjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8sCisJCQkJQzAxRkNGNTAwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAyOUI5NzMxM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9tYWluLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNWRlOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL21haW4uYwpAQCAtMCwwICsxLDY1IEBACisKKy8qIFNpbXBsZSBwcm9ncmFtOiAgQ3JlYXRlIGEgYmxhbmsgd2luZG93LCB3YWl0IGZvciBrZXlwcmVzcywgcXVpdC4KKworICAgUGxlYXNlIHNlZSB0aGUgU0RMIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gdXNpbmcgdGhlIFNETCBBUEk6CisgICAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vU0RML2RvY3MuaHRtbAorKi8KKyAgIAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJVWludDMyIGluaXRmbGFncyA9IFNETF9JTklUX1ZJREVPOyAgLyogU2VlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgKi8KKwlTRExfU3VyZmFjZSAqc2NyZWVuOworCVVpbnQ4ICB2aWRlb19icHAgPSAwOworCVVpbnQzMiB2aWRlb2ZsYWdzID0gU0RMX1NXU1VSRkFDRTsKKwlpbnQgICAgZG9uZTsKKyAgICAgICAgU0RMX0V2ZW50IGV2ZW50OworCisJLyogSW5pdGlhbGl6ZSB0aGUgU0RMIGxpYnJhcnkgKi8KKwlpZiAoIFNETF9Jbml0KGluaXRmbGFncykgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwKKwkJCVNETF9HZXRFcnJvcigpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBTZXQgNjQweDQ4MCB2aWRlbyBtb2RlICovCisJc2NyZWVuPVNETF9TZXRWaWRlb01vZGUoNjQwLDQ4MCwgdmlkZW9fYnBwLCB2aWRlb2ZsYWdzKTsKKyAgICAgICAgaWYgKHNjcmVlbiA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0IDY0MHg0ODB4JWQgdmlkZW8gbW9kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19icHAsIFNETF9HZXRFcnJvcigpKTsKKwkJU0RMX1F1aXQoKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlkb25lID0gMDsKKwl3aGlsZSAoICFkb25lICkgeworCisJCS8qIENoZWNrIGZvciBldmVudHMgKi8KKwkJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZldmVudCkgKSB7CisJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKworCQkJCWNhc2UgU0RMX01PVVNFTU9USU9OOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX0tFWURPV046CisJCQkJCS8qIEFueSBrZXlwcmVzcyBxdWl0cyB0aGUgYXBwLi4uICovCisJCQkJY2FzZSBTRExfUVVJVDoKKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCQorCS8qIENsZWFuIHVwIHRoZSBTREwgbGlicmFyeSAqLworCVNETF9RdWl0KCk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MjFiMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9TRExNYWluLm5pYi9jbGFzc2VzLm5pYiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovU0RMTWFpbi5uaWIvY2xhc3Nlcy5uaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5ZWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovU0RMTWFpbi5uaWIvY2xhc3Nlcy5uaWIKQEAgLTAsMCArMSwxOSBAQAoreworICAgIElCQ2xhc3NlcyA9ICgKKyAgICAgICAge0NMQVNTID0gRmlyc3RSZXNwb25kZXI7IExBTkdVQUdFID0gT2JqQzsgU1VQRVJDTEFTUyA9IE5TT2JqZWN0OyB9LCAKKyAgICAgICAgeworICAgICAgICAgICAgQUNUSU9OUyA9IHsKKyAgICAgICAgICAgICAgICBoZWxwID0gaWQ7IAorICAgICAgICAgICAgICAgIG5ld0dhbWUgPSBpZDsgCisgICAgICAgICAgICAgICAgb3BlbkdhbWUgPSBpZDsgCisgICAgICAgICAgICAgICAgcHJlZnNNZW51ID0gaWQ7IAorICAgICAgICAgICAgICAgIHNhdmVHYW1lID0gaWQ7IAorICAgICAgICAgICAgICAgIHNhdmVHYW1lQXMgPSBpZDsgCisgICAgICAgICAgICB9OyAKKyAgICAgICAgICAgIENMQVNTID0gU0RMTWFpbjsgCisgICAgICAgICAgICBMQU5HVUFHRSA9IE9iakM7IAorICAgICAgICAgICAgU1VQRVJDTEFTUyA9IE5TT2JqZWN0OyAKKyAgICAgICAgfQorICAgICk7IAorICAgIElCVmVyc2lvbiA9IDE7IAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovU0RMTWFpbi5uaWIvaW5mby5uaWIgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliL2luZm8ubmliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmZiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliL2luZm8ubmliCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5JQkRvY3VtZW50TG9jYXRpb248L2tleT4KKwk8c3RyaW5nPjYyIDExNyAzNTYgMjQwIDAgMCAxMTUyIDg0OCA8L3N0cmluZz4KKwk8a2V5PklCRWRpdG9yUG9zaXRpb25zPC9rZXk+CisJPGRpY3Q+CisJCTxrZXk+Mjk8L2tleT4KKwkJPHN0cmluZz42MiAzNjIgMTk1IDQ0IDAgMCAxMTUyIDg0OCA8L3N0cmluZz4KKwk8L2RpY3Q+CisJPGtleT5JQkZyYW1ld29yayBWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4yOTEuMDwvc3RyaW5nPgorCTxrZXk+SUJPcGVuT2JqZWN0czwva2V5PgorCTxhcnJheT4KKwkJPGludGVnZXI+Mjk8L2ludGVnZXI+CisJPC9hcnJheT4KKwk8a2V5PklCU3lzdGVtIFZlcnNpb248L2tleT4KKwk8c3RyaW5nPjZMNjA8L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliL29iamVjdHMubmliIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9TRExNYWluLm5pYi9vYmplY3RzLm5pYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzc4MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9TRExNYWluLm5pYi9vYmplY3RzLm5pYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE5NzBmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vSW5mby5wbGlzdApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20ueW91cmNvbXBhbnkuX19fUFJPSkVDVE5BTUVBU1hNTF9fXzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz4ke1BST0RVQ1RfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorCTxrZXk+TFNNaW5pbXVtU3lzdGVtVmVyc2lvbkJ5QXJjaGl0ZWN0dXJlPC9rZXk+CisJPGRpY3Q+CisJCTxrZXk+eDg2XzY0PC9rZXk+CisJCTxzdHJpbmc+MTAuNi4wPC9zdHJpbmc+CisJCTxrZXk+aTM4Njwva2V5PgorCQk8c3RyaW5nPjEwLjQuMDwvc3RyaW5nPgorCQk8a2V5PnBwYzwva2V5PgorCQk8c3RyaW5nPjEwLjQuMDwvc3RyaW5nPgorCTwvZGljdD4JCis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMTWFpbi5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMTWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmQ5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExNYWluLmgKQEAgLTAsMCArMSwxNiBAQAorLyogICBTRExNYWluLm0gLSBtYWluIGVudHJ5IHBvaW50IGZvciBvdXIgQ29jb2EtaXplZCBTREwgYXBwCisgICAgICAgSW5pdGlhbCBWZXJzaW9uOiBEYXJyZWxsIFdhbGlzc2VyIDxkd2FsaXNzMUBwdXJkdWUuZWR1PgorICAgICAgIE5vbi1OSUItQ29kZSAmIG90aGVyIGNoYW5nZXM6IE1heCBIb3JuIDxtYXhAcXVlbmRpLmRlPgorCisgICAgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzCisqLworCisjaWZuZGVmIF9TRExNYWluX2hfCisjZGVmaW5lIF9TRExNYWluX2hfCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgU0RMTWFpbiA6IE5TT2JqZWN0CitAZW5kCisKKyNlbmRpZiAvKiBfU0RMTWFpbl9oXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMTWFpbi5tIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMTWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjVhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExNYWluLm0KQEAgLTAsMCArMSwzODMgQEAKKy8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAorICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKyAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KKworICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcworKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETE1haW4uaCIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gLyogZm9yIE1BWFBBVEhMRU4gKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogRm9yIHNvbWUgcmVhb24sIEFwcGxlIHJlbW92ZWQgc2V0QXBwbGVNZW51IGZyb20gdGhlIGhlYWRlcnMgaW4gMTAuNCwKKyBidXQgdGhlIG1ldGhvZCBzdGlsbCBpcyB0aGVyZSBhbmQgd29ya3MuIFRvIGF2b2lkIHdhcm5pbmdzLCB3ZSBkZWNsYXJlCisgaXQgb3Vyc2VsdmVzIGhlcmUuICovCitAaW50ZXJmYWNlIE5TQXBwbGljYXRpb24oU0RMX01pc3NpbmdfTWV0aG9kcykKKy0gKHZvaWQpc2V0QXBwbGVNZW51OihOU01lbnUgKiltZW51OworQGVuZAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBTRExNYWluLm5pYiBvciBub3QgKi8KKyNkZWZpbmUJCVNETF9VU0VfTklCX0ZJTEUJMAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBDUFMgKGRvY2tpbmcpIG9yIG5vdCAqLworI2RlZmluZQkJU0RMX1VTRV9DUFMJCTEKKyNpZmRlZiBTRExfVVNFX0NQUworLyogUG9ydGlvbnMgb2YgQ1BTLmggKi8KK3R5cGVkZWYgc3RydWN0IENQU1Byb2Nlc3NTZXJOdW0KK3sKKwlVSW50MzIJCWxvOworCVVJbnQzMgkJaGk7Cit9IENQU1Byb2Nlc3NTZXJOdW07CisKK2V4dGVybiBPU0VycglDUFNHZXRDdXJyZW50UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKK2V4dGVybiBPU0VyciAJQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbiggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuLCBVSW50MzIgX2FyZzIsIFVJbnQzMiBfYXJnMywgVUludDMyIF9hcmc0LCBVSW50MzIgX2FyZzUpOworZXh0ZXJuIE9TRXJyCUNQU1NldEZyb250UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKKworI2VuZGlmIC8qIFNETF9VU0VfQ1BTICovCisKK3N0YXRpYyBpbnQgICAgZ0FyZ2M7CitzdGF0aWMgY2hhciAgKipnQXJndjsKK3N0YXRpYyBCT09MICAgZ0ZpbmRlckxhdW5jaDsKK3N0YXRpYyBCT09MICAgZ0NhbGxlZEFwcE1haW5saW5lID0gRkFMU0U7CisKK3N0YXRpYyBOU1N0cmluZyAqZ2V0QXBwbGljYXRpb25OYW1lKHZvaWQpCit7CisgICAgY29uc3QgTlNEaWN0aW9uYXJ5ICpkaWN0OworICAgIE5TU3RyaW5nICphcHBOYW1lID0gMDsKKworICAgIC8qIERldGVybWluZSB0aGUgYXBwbGljYXRpb24gbmFtZSAqLworICAgIGRpY3QgPSAoY29uc3QgTlNEaWN0aW9uYXJ5ICopQ0ZCdW5kbGVHZXRJbmZvRGljdGlvbmFyeShDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgaWYgKGRpY3QpCisgICAgICAgIGFwcE5hbWUgPSBbZGljdCBvYmplY3RGb3JLZXk6IEAiQ0ZCdW5kbGVOYW1lIl07CisgICAgCisgICAgaWYgKCFbYXBwTmFtZSBsZW5ndGhdKQorICAgICAgICBhcHBOYW1lID0gW1tOU1Byb2Nlc3NJbmZvIHByb2Nlc3NJbmZvXSBwcm9jZXNzTmFtZV07CisKKyAgICByZXR1cm4gYXBwTmFtZTsKK30KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKy8qIEEgaGVscGVyIGNhdGVnb3J5IGZvciBOU1N0cmluZyAqLworQGludGVyZmFjZSBOU1N0cmluZyAoUmVwbGFjZVN1YlN0cmluZykKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgU0RMQXBwbGljYXRpb24gOiBOU0FwcGxpY2F0aW9uCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTRExBcHBsaWNhdGlvbgorLyogSW52b2tlZCBmcm9tIHRoZSBRdWl0IG1lbnUgaXRlbSAqLworLSAodm9pZCl0ZXJtaW5hdGU6KGlkKXNlbmRlcgoreworICAgIC8qIFBvc3QgYSBTRExfUVVJVCBldmVudCAqLworICAgIFNETF9FdmVudCBldmVudDsKKyAgICBldmVudC50eXBlID0gU0RMX1FVSVQ7CisgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOworfQorQGVuZAorCisvKiBUaGUgbWFpbiBjbGFzcyBvZiB0aGUgYXBwbGljYXRpb24sIHRoZSBhcHBsaWNhdGlvbidzIGRlbGVnYXRlICovCitAaW1wbGVtZW50YXRpb24gU0RMTWFpbgorCisvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworLSAodm9pZCkgc2V0dXBXb3JraW5nRGlyZWN0b3J5OihCT09MKXNob3VsZENoZGlyCit7CisgICAgaWYgKHNob3VsZENoZGlyKQorICAgIHsKKyAgICAgICAgY2hhciBwYXJlbnRkaXJbTUFYUEFUSExFTl07CisgICAgICAgIENGVVJMUmVmIHVybCA9IENGQnVuZGxlQ29weUJ1bmRsZVVSTChDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgICAgIENGVVJMUmVmIHVybDIgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KDAsIHVybCk7CisgICAgICAgIGlmIChDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbih1cmwyLCAxLCAoVUludDggKilwYXJlbnRkaXIsIE1BWFBBVEhMRU4pKSB7CisgICAgICAgICAgICBjaGRpcihwYXJlbnRkaXIpOyAgIC8qIGNoZGlyIHRvIHRoZSBiaW5hcnkgYXBwJ3MgcGFyZW50ICovCisgICAgICAgIH0KKyAgICAgICAgQ0ZSZWxlYXNlKHVybCk7CisgICAgICAgIENGUmVsZWFzZSh1cmwyKTsKKyAgICB9Cit9CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisKKy8qIEZpeCBtZW51IHRvIGNvbnRhaW4gdGhlIHJlYWwgYXBwIG5hbWUgaW5zdGVhZCBvZiAiU0RMIEFwcCIgKi8KKy0gKHZvaWQpZml4TWVudTooTlNNZW51ICopYU1lbnUgd2l0aEFwcE5hbWU6KE5TU3RyaW5nICopYXBwTmFtZQoreworICAgIE5TUmFuZ2UgYVJhbmdlOworICAgIE5TRW51bWVyYXRvciAqZW51bWVyYXRvcjsKKyAgICBOU01lbnVJdGVtICptZW51SXRlbTsKKworICAgIGFSYW5nZSA9IFtbYU1lbnUgdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgaWYgKGFSYW5nZS5sZW5ndGggIT0gMCkKKyAgICAgICAgW2FNZW51IHNldFRpdGxlOiBbW2FNZW51IHRpdGxlXSBzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOmFSYW5nZSB3aXRoOmFwcE5hbWVdXTsKKworICAgIGVudW1lcmF0b3IgPSBbW2FNZW51IGl0ZW1BcnJheV0gb2JqZWN0RW51bWVyYXRvcl07CisgICAgd2hpbGUgKChtZW51SXRlbSA9IFtlbnVtZXJhdG9yIG5leHRPYmplY3RdKSkKKyAgICB7CisgICAgICAgIGFSYW5nZSA9IFtbbWVudUl0ZW0gdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgICAgIGlmIChhUmFuZ2UubGVuZ3RoICE9IDApCisgICAgICAgICAgICBbbWVudUl0ZW0gc2V0VGl0bGU6IFtbbWVudUl0ZW0gdGl0bGVdIHN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6YVJhbmdlIHdpdGg6YXBwTmFtZV1dOworICAgICAgICBpZiAoW21lbnVJdGVtIGhhc1N1Ym1lbnVdKQorICAgICAgICAgICAgW3NlbGYgZml4TWVudTpbbWVudUl0ZW0gc3VibWVudV0gd2l0aEFwcE5hbWU6YXBwTmFtZV07CisgICAgfQorICAgIFsgYU1lbnUgc2l6ZVRvRml0IF07Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIHNldEFwcGxpY2F0aW9uTWVudSh2b2lkKQoreworICAgIC8qIHdhcm5pbmc6IHRoaXMgY29kZSBpcyB2ZXJ5IG9kZCAqLworICAgIE5TTWVudSAqYXBwbGVNZW51OworICAgIE5TTWVudUl0ZW0gKm1lbnVJdGVtOworICAgIE5TU3RyaW5nICp0aXRsZTsKKyAgICBOU1N0cmluZyAqYXBwTmFtZTsKKyAgICAKKyAgICBhcHBOYW1lID0gZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgICAgYXBwbGVNZW51ID0gW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCIiXTsKKyAgICAKKyAgICAvKiBBZGQgbWVudSBpdGVtcyAqLworICAgIHRpdGxlID0gW0AiQWJvdXQgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3RvcihvcmRlckZyb250U3RhbmRhcmRBYm91dFBhbmVsOikga2V5RXF1aXZhbGVudDpAIiJdOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtOltOU01lbnVJdGVtIHNlcGFyYXRvckl0ZW1dXTsKKworICAgIHRpdGxlID0gW0AiSGlkZSAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKGhpZGU6KSBrZXlFcXVpdmFsZW50OkAiaCJdOworCisgICAgbWVudUl0ZW0gPSAoTlNNZW51SXRlbSAqKVthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTpAIkhpZGUgT3RoZXJzIiBhY3Rpb246QHNlbGVjdG9yKGhpZGVPdGhlckFwcGxpY2F0aW9uczopIGtleUVxdWl2YWxlbnQ6QCJoIl07CisgICAgW21lbnVJdGVtIHNldEtleUVxdWl2YWxlbnRNb2RpZmllck1hc2s6KE5TQWx0ZXJuYXRlS2V5TWFza3xOU0NvbW1hbmRLZXlNYXNrKV07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6QCJTaG93IEFsbCIgYWN0aW9uOkBzZWxlY3Rvcih1bmhpZGVBbGxBcHBsaWNhdGlvbnM6KSBrZXlFcXVpdmFsZW50OkAiIl07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW06W05TTWVudUl0ZW0gc2VwYXJhdG9ySXRlbV1dOworCisgICAgdGl0bGUgPSBbQCJRdWl0ICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3IodGVybWluYXRlOikga2V5RXF1aXZhbGVudDpAInEiXTsKKworICAgIAorICAgIC8qIFB1dCBtZW51IGludG8gdGhlIG1lbnViYXIgKi8KKyAgICBtZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiIgYWN0aW9uOm5pbCBrZXlFcXVpdmFsZW50OkAiIl07CisgICAgW21lbnVJdGVtIHNldFN1Ym1lbnU6YXBwbGVNZW51XTsKKyAgICBbW05TQXBwIG1haW5NZW51XSBhZGRJdGVtOm1lbnVJdGVtXTsKKworICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSBhcHBsaWNhdGlvbiBtZW51ICovCisgICAgW05TQXBwIHNldEFwcGxlTWVudTphcHBsZU1lbnVdOworCisgICAgLyogRmluYWxseSBnaXZlIHVwIG91ciByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RzICovCisgICAgW2FwcGxlTWVudSByZWxlYXNlXTsKKyAgICBbbWVudUl0ZW0gcmVsZWFzZV07Cit9CisKKy8qIENyZWF0ZSBhIHdpbmRvdyBtZW51ICovCitzdGF0aWMgdm9pZCBzZXR1cFdpbmRvd01lbnUodm9pZCkKK3sKKyAgICBOU01lbnUgICAgICAqd2luZG93TWVudTsKKyAgICBOU01lbnVJdGVtICAqd2luZG93TWVudUl0ZW07CisgICAgTlNNZW51SXRlbSAgKm1lbnVJdGVtOworCisgICAgd2luZG93TWVudSA9IFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiV2luZG93Il07CisgICAgCisgICAgLyogIk1pbmltaXplIiBpdGVtICovCisgICAgbWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJNaW5pbWl6ZSIgYWN0aW9uOkBzZWxlY3RvcihwZXJmb3JtTWluaWF0dXJpemU6KSBrZXlFcXVpdmFsZW50OkAibSJdOworICAgIFt3aW5kb3dNZW51IGFkZEl0ZW06bWVudUl0ZW1dOworICAgIFttZW51SXRlbSByZWxlYXNlXTsKKyAgICAKKyAgICAvKiBQdXQgbWVudSBpbnRvIHRoZSBtZW51YmFyICovCisgICAgd2luZG93TWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJXaW5kb3ciIGFjdGlvbjpuaWwga2V5RXF1aXZhbGVudDpAIiJdOworICAgIFt3aW5kb3dNZW51SXRlbSBzZXRTdWJtZW51OndpbmRvd01lbnVdOworICAgIFtbTlNBcHAgbWFpbk1lbnVdIGFkZEl0ZW06d2luZG93TWVudUl0ZW1dOworICAgIAorICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSB3aW5kb3cgbWVudSAqLworICAgIFtOU0FwcCBzZXRXaW5kb3dzTWVudTp3aW5kb3dNZW51XTsKKworICAgIC8qIEZpbmFsbHkgZ2l2ZSB1cCBvdXIgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyAqLworICAgIFt3aW5kb3dNZW51IHJlbGVhc2VdOworICAgIFt3aW5kb3dNZW51SXRlbSByZWxlYXNlXTsKK30KKworLyogUmVwbGFjZW1lbnQgZm9yIE5TQXBwbGljYXRpb25NYWluICovCitzdGF0aWMgdm9pZCBDdXN0b21BcHBsaWNhdGlvbk1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBOU0F1dG9yZWxlYXNlUG9vbAkqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICAgIFNETE1haW4JCQkJKnNkbE1haW47CisKKyAgICAvKiBFbnN1cmUgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBpcyBpbml0aWFsaXNlZCAqLworICAgIFtTRExBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07CisgICAgCisjaWZkZWYgU0RMX1VTRV9DUFMKKyAgICB7CisgICAgICAgIENQU1Byb2Nlc3NTZXJOdW0gUFNOOworICAgICAgICAvKiBUZWxsIHRoZSBkb2NrIGFib3V0IHVzICovCisgICAgICAgIGlmICghQ1BTR2V0Q3VycmVudFByb2Nlc3MoJlBTTikpCisgICAgICAgICAgICBpZiAoIUNQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb24oJlBTTiwweDAzLDB4M0MsMHgyQywweDExMDMpKQorICAgICAgICAgICAgICAgIGlmICghQ1BTU2V0RnJvbnRQcm9jZXNzKCZQU04pKQorICAgICAgICAgICAgICAgICAgICBbU0RMQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIH0KKyNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLworCisgICAgLyogU2V0IHVwIHRoZSBtZW51YmFyICovCisgICAgW05TQXBwIHNldE1haW5NZW51OltbTlNNZW51IGFsbG9jXSBpbml0XV07CisgICAgc2V0QXBwbGljYXRpb25NZW51KCk7CisgICAgc2V0dXBXaW5kb3dNZW51KCk7CisKKyAgICAvKiBDcmVhdGUgU0RMTWFpbiBhbmQgbWFrZSBpdCB0aGUgYXBwIGRlbGVnYXRlICovCisgICAgc2RsTWFpbiA9IFtbU0RMTWFpbiBhbGxvY10gaW5pdF07CisgICAgW05TQXBwIHNldERlbGVnYXRlOnNkbE1haW5dOworICAgIAorICAgIC8qIFN0YXJ0IHRoZSBtYWluIGV2ZW50IGxvb3AgKi8KKyAgICBbTlNBcHAgcnVuXTsKKyAgICAKKyAgICBbc2RsTWFpbiByZWxlYXNlXTsKKyAgICBbcG9vbCByZWxlYXNlXTsKK30KKworI2VuZGlmCisKKworLyoKKyAqIENhdGNoIGRvY3VtZW50IG9wZW4gcmVxdWVzdHMuLi50aGlzIGxldHMgdXMgbm90aWNlIGZpbGVzIHdoZW4gdGhlIGFwcAorICogIHdhcyBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgYSBkb2N1bWVudCwgb3Igd2hlbiBhIGRvY3VtZW50IHdhcworICogIGRyYWdnZWQvZHJvcHBlZCBvbiB0aGUgYXBwJ3MgaWNvbi4gWW91IG5lZWQgdG8gaGF2ZSBhCisgKiAgQ0ZCdW5kbGVEb2N1bWVudHNUeXBlIHNlY3Rpb24gaW4geW91ciBJbmZvLnBsaXN0IHRvIGdldCB0aGlzIG1lc3NhZ2UsCisgKiAgYXBwYXJlbnRseS4KKyAqCisgKiBGaWxlcyBhcmUgYWRkZWQgdG8gZ0FyZ3YsIHNvIHRvIHRoZSBhcHAsIHRoZXknbGwgbG9vayBsaWtlIGNvbW1hbmQgbGluZQorICogIGFyZ3VtZW50cy4gUHJldmlvdXNseSwgYXBwcyBsYXVuY2hlZCBmcm9tIHRoZSBmaW5kZXIgaGFkIG5vdGhpbmcgYnV0CisgKiAgYW4gYXJndlswXS4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgbWF5IGJlIHJlY2VpdmVkIG11bHRpcGxlIHRpbWVzIHRvIG9wZW4gc2V2ZXJhbCBkb2NzIG9uIGxhdW5jaC4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgaXMgaWdub3JlZCBvbmNlIHRoZSBhcHAncyBtYWlubGluZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKy0gKEJPT0wpYXBwbGljYXRpb246KE5TQXBwbGljYXRpb24gKil0aGVBcHBsaWNhdGlvbiBvcGVuRmlsZTooTlNTdHJpbmcgKilmaWxlbmFtZQoreworICAgIGNvbnN0IGNoYXIgKnRlbXBhcmc7CisgICAgc2l6ZV90IGFyZ2xlbjsKKyAgICBjaGFyICphcmc7CisgICAgY2hhciAqKm5ld2FyZ3Y7CisKKyAgICBpZiAoIWdGaW5kZXJMYXVuY2gpICAvKiBNYWNPUyBpcyBwYXNzaW5nIGNvbW1hbmQgbGluZSBhcmdzLiAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoZ0NhbGxlZEFwcE1haW5saW5lKSAgLyogYXBwIGhhcyBzdGFydGVkLCBpZ25vcmUgdGhpcyBkb2N1bWVudC4gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdGVtcGFyZyA9IFtmaWxlbmFtZSBVVEY4U3RyaW5nXTsKKyAgICBhcmdsZW4gPSBTRExfc3RybGVuKHRlbXBhcmcpICsgMTsKKyAgICBhcmcgPSAoY2hhciAqKSBTRExfbWFsbG9jKGFyZ2xlbik7CisgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBuZXdhcmd2ID0gKGNoYXIgKiopIHJlYWxsb2MoZ0FyZ3YsIHNpemVvZiAoY2hhciAqKSAqIChnQXJnYyArIDIpKTsKKyAgICBpZiAobmV3YXJndiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX2ZyZWUoYXJnKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBnQXJndiA9IG5ld2FyZ3Y7CisKKyAgICBTRExfc3RybGNweShhcmcsIHRlbXBhcmcsIGFyZ2xlbik7CisgICAgZ0FyZ3ZbZ0FyZ2MrK10gPSBhcmc7CisgICAgZ0FyZ3ZbZ0FyZ2NdID0gTlVMTDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKiBDYWxsZWQgd2hlbiB0aGUgaW50ZXJuYWwgZXZlbnQgbG9vcCBoYXMganVzdCBzdGFydGVkIHJ1bm5pbmcgKi8KKy0gKHZvaWQpIGFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOiAoTlNOb3RpZmljYXRpb24gKikgbm90ZQoreworICAgIGludCBzdGF0dXM7CisKKyAgICAvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworICAgIFtzZWxmIHNldHVwV29ya2luZ0RpcmVjdG9yeTpnRmluZGVyTGF1bmNoXTsKKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICAvKiBTZXQgdGhlIG1haW4gbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCisgICAgW3NlbGYgZml4TWVudTpbTlNBcHAgbWFpbk1lbnVdIHdpdGhBcHBOYW1lOmdldEFwcGxpY2F0aW9uTmFtZSgpXTsKKyNlbmRpZgorCisgICAgLyogSGFuZCBvZmYgdG8gbWFpbiBhcHBsaWNhdGlvbiBjb2RlICovCisgICAgZ0NhbGxlZEFwcE1haW5saW5lID0gVFJVRTsKKyAgICBzdGF0dXMgPSBTRExfbWFpbiAoZ0FyZ2MsIGdBcmd2KTsKKworICAgIC8qIFdlJ3JlIGRvbmUsIHRoYW5rIHlvdSBmb3IgcGxheWluZyAqLworICAgIGV4aXQoc3RhdHVzKTsKK30KK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCisKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZmZlclNpemU7CisgICAgdW5zaWduZWQgaW50IHNlbGZMZW4gPSBbc2VsZiBsZW5ndGhdOworICAgIHVuc2lnbmVkIGludCBhU3RyaW5nTGVuID0gW2FTdHJpbmcgbGVuZ3RoXTsKKyAgICB1bmljaGFyICpidWZmZXI7CisgICAgTlNSYW5nZSBsb2NhbFJhbmdlOworICAgIE5TU3RyaW5nICpyZXN1bHQ7CisKKyAgICBidWZmZXJTaXplID0gc2VsZkxlbiArIGFTdHJpbmdMZW4gLSBhUmFuZ2UubGVuZ3RoOworICAgIGJ1ZmZlciA9ICh1bmljaGFyICopTlNBbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlclNpemUqc2l6ZW9mKHVuaWNoYXIpKTsKKyAgICAKKyAgICAvKiBHZXQgZmlyc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVJhbmdlLmxvY2F0aW9uOworICAgIFtzZWxmIGdldENoYXJhY3RlcnM6YnVmZmVyIHJhbmdlOmxvY2FsUmFuZ2VdOworICAgIAorICAgIC8qIEdldCBtaWRkbGUgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVN0cmluZ0xlbjsKKyAgICBbYVN0cmluZyBnZXRDaGFyYWN0ZXJzOihidWZmZXIrYVJhbmdlLmxvY2F0aW9uKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAgCisgICAgLyogR2V0IGxhc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSBhUmFuZ2UubG9jYXRpb24gKyBhUmFuZ2UubGVuZ3RoOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gc2VsZkxlbiAtIGxvY2FsUmFuZ2UubG9jYXRpb247CisgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbithU3RyaW5nTGVuKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAKKyAgICAvKiBCdWlsZCBvdXRwdXQgc3RyaW5nICovCisgICAgcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhDaGFyYWN0ZXJzOmJ1ZmZlciBsZW5ndGg6YnVmZmVyU2l6ZV07CisgICAgCisgICAgTlNEZWFsbG9jYXRlTWVtb3J5UGFnZXMoYnVmZmVyLCBidWZmZXJTaXplKTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCisKKworCisjaWZkZWYgbWFpbgorIyAgdW5kZWYgbWFpbgorI2VuZGlmCisKKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBleGVjdXRhYmxlIC0gc2hvdWxkICpub3QqIGJlIFNETF9tYWluISAqLworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgaW50byBhIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIC8qIFRoaXMgaXMgcGFzc2VkIGlmIHdlIGFyZSBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgKi8KKyAgICBpZiAoIGFyZ2MgPj0gMiAmJiBzdHJuY21wIChhcmd2WzFdLCAiLXBzbiIsIDQpID09IDAgKSB7CisgICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogMik7CisgICAgICAgIGdBcmd2WzBdID0gYXJndlswXTsKKyAgICAgICAgZ0FyZ3ZbMV0gPSBOVUxMOworICAgICAgICBnQXJnYyA9IDE7CisgICAgICAgIGdGaW5kZXJMYXVuY2ggPSBZRVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGdBcmdjID0gYXJnYzsKKyAgICAgICAgZ0FyZ3YgPSAoY2hhciAqKikgU0RMX21hbGxvYyhzaXplb2YgKGNoYXIgKikgKiAoYXJnYysxKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYXJnYzsgaSsrKQorICAgICAgICAgICAgZ0FyZ3ZbaV0gPSBhcmd2W2ldOworICAgICAgICBnRmluZGVyTGF1bmNoID0gTk87CisgICAgfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorICAgIFtTRExBcHBsaWNhdGlvbiBwb3NlQXNDbGFzczpbTlNBcHBsaWNhdGlvbiBjbGFzc11dOworICAgIE5TQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbHNlCisgICAgQ3VzdG9tQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRUFTSURFTlRJRklFUl9fX19QcmVmaXgucGNoIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDA5NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaApAQCAtMCwwICsxLDkgQEAKKy8vCisvLyBQcmVmaXggaGVhZGVyIGZvciBhbGwgc291cmNlIGZpbGVzIG9mIHRoZSAnx1BST0pFQ1ROQU1FyCcgdGFyZ2V0IGluIHRoZSAnx1BST0pFQ1ROQU1FyCcgcHJvamVjdAorLy8KKworI2luY2x1ZGUgIlNETC5oIgorCisjaWZkZWYgX19PQkpDX18KKyAgICAjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJY29uLmljbnMgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJY29uLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwYjAyYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUljb24uaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJbmZvLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGNiZWEyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApAQCAtMCwwICsxLDEyIEBACit7CisJRmlsZXNUb1JlbmFtZSA9IHsKKwkJIlNETEFwcF9QcmVmaXgucGNoIiA9ICLHUFJPSkVDVE5BTUXIX1ByZWZpeC5wY2giOworCX07CisJRmlsZXNUb01hY3JvRXhwYW5kID0gKAorCQkix1BST0pFQ1ROQU1FyF9QcmVmaXgucGNoIiwKKwkJIkluZm8ucGxpc3QiLAorCQkiRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyIsCisJCSJtYWluLmMiLAorCSk7CisJRGVzY3JpcHRpb24gPSAiVGhpcyBwcm9qZWN0IGJ1aWxkcyBhbiBTREwtYmFzZWQgYXBwbGljYXRpb24gd2l0aCBDb2NvYSBtZW51cy4iOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxZTUyNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTAsMCArMSwzMjAgQEAKKy8vICEkKlVURjgqJCEKK3sKKwlhcmNoaXZlVmVyc2lvbiA9IDE7CisJY2xhc3NlcyA9IHsKKwl9OworCW9iamVjdFZlcnNpb24gPSA0MjsKKwlvYmplY3RzID0geworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQkwMDJGMzlGQTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovOyB9OworCQkwMDJGM0EwMDA5RDA4ODQ2MDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjNBMkUwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQTJDMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gKi87IH07CisJCTAwMkYzQTNGMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0EzRTA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jICovOyB9OworCQkwMDJGM0FGMTA5RDA4RjEwMDBFQkVCODggLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQUVGMDlEMDhGMTAwMEVCRUI4OCAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJOEQxMTA3MkIwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi87IH07CisJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGRDA5RDA4ODM0MDBFQkVCODggLyogQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxMDsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzQTAwMDlEMDg4NDYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCW5hbWUgPSAiQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUiOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gU0RMLmZyYW1ld29yazsgcGF0aCA9IC9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMDAyRjNBMkIwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETE1haW4uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU0RMTWFpbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBtYWluLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNBRjAwOUQwOEYxMDAwRUJFQjg4IC8qIEVuZ2xpc2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLm5pYjsgbmFtZSA9IEVuZ2xpc2g7IHBhdGggPSBFbmdsaXNoLmxwcm9qL1NETE1haW4ubmliOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwODlDMTY1REZFODQwRTBDQzAyQUFDMDcgLyogRW5nbGlzaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAxMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnN0cmluZ3M7IG5hbWUgPSBFbmdsaXNoOyBwYXRoID0gRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5nczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQ29jb2EuZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkyOUI5NzMyNEZEQ0ZBMzk0MTFDQTJDRUEgLyogQXBwS2l0LmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQXBwS2l0LmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTI5Qjk3MzI1RkRDRkEzOTQxMUNBMkNFQSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gRm91bmRhdGlvbi5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Gb3VuZGF0aW9uLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMzJDQTRGNjMwMzY4RDFFRTAwQzkxNzgzIC8qIF9fX1BST0pFQ1ROQU1FX19fX1ByZWZpeC5wY2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJfX19QUk9KRUNUTkFNRV9fX19QcmVmaXgucGNoIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQxMTA3MzEwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0OyBwYXRoID0gSW5mby5wbGlzdDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gIl9fX1BST0pFQ1ROQU1FX19fLmFwcCI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzlGQTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KKwkJMDgwRTk2RERGRTIwMUQ2RDdGMDAwMDAxIC8qIENsYXNzZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzQTJCMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLmggKi8sCisJCQkJMDAyRjNBMkMwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSAqLywKKwkJCSk7CisJCQluYW1lID0gQ2xhc3NlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTEwNThDN0EwRkVBNTRGMDExMUNBMkNCQiAvKiBMaW5rZWQgRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDAyRjM5RjkwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgKi8sCisJCQkJMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLywKKwkJCSk7CisJCQluYW1lID0gIkxpbmtlZCBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTEwNThDN0EyRkVBNTRGMDExMUNBMkNCQiAvKiBPdGhlciBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkyOUI5NzMyNEZEQ0ZBMzk0MTFDQTJDRUEgLyogQXBwS2l0LmZyYW1ld29yayAqLywKKwkJCQkyOUI5NzMyNUZEQ0ZBMzk0MTFDQTJDRUEgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fLmFwcCAqLywKKwkJCSk7CisJCQluYW1lID0gUHJvZHVjdHM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMxNEZEQ0ZBMzk0MTFDQTJDRUEgLyogX19fUFJPSkVDVE5BTUVBU1hNTF9fXyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDgwRTk2RERGRTIwMUQ2RDdGMDAwMDAxIC8qIENsYXNzZXMgKi8sCisJCQkJMjlCOTczMTVGRENGQTM5NDExQ0EyQ0VBIC8qIE90aGVyIFNvdXJjZXMgKi8sCisJCQkJMjlCOTczMTdGRENGQTM5NDExQ0EyQ0VBIC8qIFJlc291cmNlcyAqLywKKwkJCQkyOUI5NzMyM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxOUMyOEZBQ0ZFOUQ1MjBEMTFDQTJDQkIgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJbmFtZSA9ICJfX19QUk9KRUNUTkFNRUFTWE1MX19fIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE1RkRDRkEzOTQxMUNBMkNFQSAvKiBPdGhlciBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzMkNBNEY2MzAzNjhEMUVFMDBDOTE3ODMgLyogX19fUFJPSkVDVE5BTUVfX19fUHJlZml4LnBjaCAqLywKKwkJCQkwMDJGM0EzRTA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jICovLAorCQkJKTsKKwkJCW5hbWUgPSAiT3RoZXIgU291cmNlcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMxN0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk4RDExMDczMTA0ODZDRUI4MDBFNDcwOTAgLyogSW5mby5wbGlzdCAqLywKKwkJCQkwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi8sCisJCQkJMDAyRjNBRUYwOUQwOEYxMDAwRUJFQjg4IC8qIFNETE1haW4ubmliICovLAorCQkJKTsKKwkJCW5hbWUgPSBSZXNvdXJjZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMyM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMTA1OEM3QTBGRUE1NEYwMTExQ0EyQ0JCIC8qIExpbmtlZCBGcmFtZXdvcmtzICovLAorCQkJCTEwNThDN0EyRkVBNTRGMDExMUNBMkNCQiAvKiBPdGhlciBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCW5hbWUgPSBGcmFtZXdvcmtzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCThEMTEwNzI2MDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXyAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBDMDFGQ0Y0QTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIl9fX1BST0pFQ1ROQU1FX19fIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjM5RkQwOUQwODgzNDAwRUJFQjg4IC8qIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiX19fUFJPSkVDVE5BTUVfX18iOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCXByb2R1Y3ROYW1lID0gIl9fX1BST0pFQ1ROQU1FX19fIjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA4RDExMDczMjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18uYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisvKiBFbmQgUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUHJvamVjdCBzZWN0aW9uICovCisJCTI5Qjk3MzEzRkRDRkEzOTQxMUNBMkNFQSAvKiBQcm9qZWN0IG9iamVjdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFByb2plY3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gQzAxRkNGNEUwOEE5NTQ1NDAwNTQyNDdCIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiX19fUFJPSkVDVE5BTUVfX18iICovOworCQkJY29tcGF0aWJpbGl0eVZlcnNpb24gPSAiWGNvZGUgMi40IjsKKwkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOworCQkJbWFpbkdyb3VwID0gMjlCOTczMTRGRENGQTM5NDExQ0EyQ0VBIC8qIF9fX1BST0pFQ1ROQU1FQVNYTUxfX18gKi87CisJCQlwcm9qZWN0RGlyUGF0aCA9ICIiOworCQkJcHJvamVjdFJvb3QgPSAiIjsKKwkJCXRhcmdldHMgPSAoCisJCQkJOEQxMTA3MjYwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCThEMTEwNzJCMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8sCisJCQkJMDAyRjNBRjEwOUQwOEYxMDAwRUJFQjg4IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDExMDcyQzA0ODZDRUI4MDBFNDcwOTAgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzQTJFMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gaW4gU291cmNlcyAqLywKKwkJCQkwMDJGM0EzRjA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCQkwMDJGM0FFRjA5RDA4RjEwMDBFQkVCODggLyogU0RMTWFpbi5uaWIgKi8gPSB7CisJCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGM0FGMDA5RDA4RjEwMDBFQkVCODggLyogRW5nbGlzaCAqLywKKwkJCSk7CisJCQluYW1lID0gU0RMTWFpbi5uaWI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi8gPSB7CisJCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODlDMTY1REZFODQwRTBDQzAyQUFDMDcgLyogRW5nbGlzaCAqLywKKwkJCSk7CisJCQluYW1lID0gSW5mb1BsaXN0LnN0cmluZ3M7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWFZhcmlhbnRHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKwkJQzAxRkNGNEIwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL0FwcGxpY2F0aW9ucyI7CisJCQkJUFJPRFVDVF9OQU1FID0gIl9fX1BST0pFQ1ROQU1FX19fIjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUMwMUZDRjRDMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IE5POworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIl9fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2giOworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9BcHBsaWNhdGlvbnMiOworCQkJCVBST0RVQ1RfTkFNRSA9ICJfX19QUk9KRUNUTkFNRV9fXyI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUMwMUZDRjRGMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyX0JJVF9QUkVfWENPREVfM18xKSI7CisJCQkJQVJDSFNfU1RBTkRBUkRfMzJfQklUX1BSRV9YQ09ERV8zXzEgPSAicHBjIGkzODYiOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MsCisJCQkJCSIkKEZSQU1FV09SS19TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCUdDQ19WRVJTSU9OID0gNC4wOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMsCisJCQkJCSIkKEhFQURFUl9TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUMwMUZDRjUwMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfQklUX1BSRV9YQ09ERV8zXzEpIjsKKwkJCQlBUkNIU19TVEFOREFSRF8zMl9CSVRfUFJFX1hDT0RFXzNfMSA9ICJwcGMgaTM4NiI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3JrcywKKwkJCQkJIiQoRlJBTUVXT1JLX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJR0NDX1ZFUlNJT04gPSA0LjA7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycywKKwkJCQkJIiQoSEVBREVSX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVNES1JPT1QgPSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCUMwMUZDRjRBMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiX19fUFJPSkVDVE5BTUVfX18iICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJQzAxRkNGNEIwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovLAorCQkJCUMwMUZDRjRDMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUMwMUZDRjRFMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIl9fX1BST0pFQ1ROQU1FX19fIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUMwMUZDRjRGMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLywKKwkJCQlDMDFGQ0Y1MDA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCX07CisJcm9vdE9iamVjdCA9IDI5Qjk3MzEzRkRDRkEzOTQxMUNBMkNFQSAvKiBQcm9qZWN0IG9iamVjdCAqLzsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL21haW4uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE1ZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vbWFpbi5jCkBAIC0wLDAgKzEsNjUgQEAKKworLyogU2ltcGxlIHByb2dyYW06ICBDcmVhdGUgYSBibGFuayB3aW5kb3csIHdhaXQgZm9yIGtleXByZXNzLCBxdWl0LgorCisgICBQbGVhc2Ugc2VlIHRoZSBTREwgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiB1c2luZyB0aGUgU0RMIEFQSToKKyAgIC9EZXZlbG9wZXIvRG9jdW1lbnRhdGlvbi9TREwvZG9jcy5odG1sCisqLworICAgCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlVaW50MzIgaW5pdGZsYWdzID0gU0RMX0lOSVRfVklERU87ICAvKiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyAqLworCVNETF9TdXJmYWNlICpzY3JlZW47CisJVWludDggIHZpZGVvX2JwcCA9IDA7CisJVWludDMyIHZpZGVvZmxhZ3MgPSBTRExfU1dTVVJGQUNFOworCWludCAgICBkb25lOworICAgICAgICBTRExfRXZlbnQgZXZlbnQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBTREwgbGlicmFyeSAqLworCWlmICggU0RMX0luaXQoaW5pdGZsYWdzKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLAorCQkJU0RMX0dldEVycm9yKCkpOworCQlleGl0KDEpOworCX0KKworCS8qIFNldCA2NDB4NDgwIHZpZGVvIG1vZGUgKi8KKwlzY3JlZW49U0RMX1NldFZpZGVvTW9kZSg2NDAsNDgwLCB2aWRlb19icHAsIHZpZGVvZmxhZ3MpOworICAgICAgICBpZiAoc2NyZWVuID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBzZXQgNjQweDQ4MHglZCB2aWRlbyBtb2RlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2JwcCwgU0RMX0dldEVycm9yKCkpOworCQlTRExfUXVpdCgpOworCQlleGl0KDIpOworCX0KKworCWRvbmUgPSAwOworCXdoaWxlICggIWRvbmUgKSB7CisKKwkJLyogQ2hlY2sgZm9yIGV2ZW50cyAqLworCQl3aGlsZSAoIFNETF9Qb2xsRXZlbnQoJmV2ZW50KSApIHsKKwkJCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCisJCQkJY2FzZSBTRExfTU9VU0VNT1RJT046CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX01PVVNFQlVUVE9ORE9XTjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRExfS0VZRE9XTjoKKwkJCQkJLyogQW55IGtleXByZXNzIHF1aXRzIHRoZSBhcHAuLi4gKi8KKwkJCQljYXNlIFNETF9RVUlUOgorCQkJCQlkb25lID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJCisJLyogQ2xlYW4gdXAgdGhlIFNETCBsaWJyYXJ5ICovCisJU0RMX1F1aXQoKTsKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzIxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vSW5mby5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTk0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vSW5mby5wbGlzdApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20ueW91cmNvbXBhbnkuX19fUFJPSkVDVE5BTUVBU1hNTF9fXzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz4ke1BST0RVQ1RfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+U0RMTWFpbjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorCTxrZXk+TFNNaW5pbXVtU3lzdGVtVmVyc2lvbkJ5QXJjaGl0ZWN0dXJlPC9rZXk+CisJPGRpY3Q+CisJCTxrZXk+eDg2XzY0PC9rZXk+CisJCTxzdHJpbmc+MTAuNi4wPC9zdHJpbmc+CisJCTxrZXk+aTM4Njwva2V5PgorCQk8c3RyaW5nPjEwLjQuMDwvc3RyaW5nPgorCQk8a2V5PnBwYzwva2V5PgorCQk8c3RyaW5nPjEwLjQuMDwvc3RyaW5nPgorCTwvZGljdD4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vU0RMTWFpbi5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL1NETE1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZkOTBjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL1NETE1haW4uaApAQCAtMCwwICsxLDE2IEBACisvKiAgIFNETE1haW4ubSAtIG1haW4gZW50cnkgcG9pbnQgZm9yIG91ciBDb2NvYS1pemVkIFNETCBhcHAKKyAgICAgICBJbml0aWFsIFZlcnNpb246IERhcnJlbGwgV2FsaXNzZXIgPGR3YWxpc3MxQHB1cmR1ZS5lZHU+CisgICAgICAgTm9uLU5JQi1Db2RlICYgb3RoZXIgY2hhbmdlczogTWF4IEhvcm4gPG1heEBxdWVuZGkuZGU+CisKKyAgICBGZWVsIGZyZWUgdG8gY3VzdG9taXplIHRoaXMgZmlsZSB0byBzdWl0IHlvdXIgbmVlZHMKKyovCisKKyNpZm5kZWYgX1NETE1haW5faF8KKyNkZWZpbmUgX1NETE1haW5faF8KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworQGludGVyZmFjZSBTRExNYWluIDogTlNPYmplY3QKK0BlbmQKKworI2VuZGlmIC8qIF9TRExNYWluX2hfICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vU0RMTWFpbi5tIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL1NETE1haW4ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDY1YTIwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL1NETE1haW4ubQpAQCAtMCwwICsxLDM4MyBAQAorLyogICBTRExNYWluLm0gLSBtYWluIGVudHJ5IHBvaW50IGZvciBvdXIgQ29jb2EtaXplZCBTREwgYXBwCisgICAgICAgSW5pdGlhbCBWZXJzaW9uOiBEYXJyZWxsIFdhbGlzc2VyIDxkd2FsaXNzMUBwdXJkdWUuZWR1PgorICAgICAgIE5vbi1OSUItQ29kZSAmIG90aGVyIGNoYW5nZXM6IE1heCBIb3JuIDxtYXhAcXVlbmRpLmRlPgorCisgICAgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzCisqLworCisjaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMTWFpbi5oIgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPiAvKiBmb3IgTUFYUEFUSExFTiAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKiBGb3Igc29tZSByZWFvbiwgQXBwbGUgcmVtb3ZlZCBzZXRBcHBsZU1lbnUgZnJvbSB0aGUgaGVhZGVycyBpbiAxMC40LAorIGJ1dCB0aGUgbWV0aG9kIHN0aWxsIGlzIHRoZXJlIGFuZCB3b3Jrcy4gVG8gYXZvaWQgd2FybmluZ3MsIHdlIGRlY2xhcmUKKyBpdCBvdXJzZWx2ZXMgaGVyZS4gKi8KK0BpbnRlcmZhY2UgTlNBcHBsaWNhdGlvbihTRExfTWlzc2luZ19NZXRob2RzKQorLSAodm9pZClzZXRBcHBsZU1lbnU6KE5TTWVudSAqKW1lbnU7CitAZW5kCisKKy8qIFVzZSB0aGlzIGZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgdXNlIFNETE1haW4ubmliIG9yIG5vdCAqLworI2RlZmluZQkJU0RMX1VTRV9OSUJfRklMRQkwCisKKy8qIFVzZSB0aGlzIGZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgdXNlIENQUyAoZG9ja2luZykgb3Igbm90ICovCisjZGVmaW5lCQlTRExfVVNFX0NQUwkJMQorI2lmZGVmIFNETF9VU0VfQ1BTCisvKiBQb3J0aW9ucyBvZiBDUFMuaCAqLwordHlwZWRlZiBzdHJ1Y3QgQ1BTUHJvY2Vzc1Nlck51bQoreworCVVJbnQzMgkJbG87CisJVUludDMyCQloaTsKK30gQ1BTUHJvY2Vzc1Nlck51bTsKKworZXh0ZXJuIE9TRXJyCUNQU0dldEN1cnJlbnRQcm9jZXNzKCBDUFNQcm9jZXNzU2VyTnVtICpwc24pOworZXh0ZXJuIE9TRXJyIAlDUFNFbmFibGVGb3JlZ3JvdW5kT3BlcmF0aW9uKCBDUFNQcm9jZXNzU2VyTnVtICpwc24sIFVJbnQzMiBfYXJnMiwgVUludDMyIF9hcmczLCBVSW50MzIgX2FyZzQsIFVJbnQzMiBfYXJnNSk7CitleHRlcm4gT1NFcnIJQ1BTU2V0RnJvbnRQcm9jZXNzKCBDUFNQcm9jZXNzU2VyTnVtICpwc24pOworCisjZW5kaWYgLyogU0RMX1VTRV9DUFMgKi8KKworc3RhdGljIGludCAgICBnQXJnYzsKK3N0YXRpYyBjaGFyICAqKmdBcmd2Oworc3RhdGljIEJPT0wgICBnRmluZGVyTGF1bmNoOworc3RhdGljIEJPT0wgICBnQ2FsbGVkQXBwTWFpbmxpbmUgPSBGQUxTRTsKKworc3RhdGljIE5TU3RyaW5nICpnZXRBcHBsaWNhdGlvbk5hbWUodm9pZCkKK3sKKyAgICBjb25zdCBOU0RpY3Rpb25hcnkgKmRpY3Q7CisgICAgTlNTdHJpbmcgKmFwcE5hbWUgPSAwOworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBhcHBsaWNhdGlvbiBuYW1lICovCisgICAgZGljdCA9IChjb25zdCBOU0RpY3Rpb25hcnkgKilDRkJ1bmRsZUdldEluZm9EaWN0aW9uYXJ5KENGQnVuZGxlR2V0TWFpbkJ1bmRsZSgpKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgYXBwTmFtZSA9IFtkaWN0IG9iamVjdEZvcktleTogQCJDRkJ1bmRsZU5hbWUiXTsKKyAgICAKKyAgICBpZiAoIVthcHBOYW1lIGxlbmd0aF0pCisgICAgICAgIGFwcE5hbWUgPSBbW05TUHJvY2Vzc0luZm8gcHJvY2Vzc0luZm9dIHByb2Nlc3NOYW1lXTsKKworICAgIHJldHVybiBhcHBOYW1lOworfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorLyogQSBoZWxwZXIgY2F0ZWdvcnkgZm9yIE5TU3RyaW5nICovCitAaW50ZXJmYWNlIE5TU3RyaW5nIChSZXBsYWNlU3ViU3RyaW5nKQorLSAoTlNTdHJpbmcgKilzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOihOU1JhbmdlKWFSYW5nZSB3aXRoOihOU1N0cmluZyAqKWFTdHJpbmc7CitAZW5kCisjZW5kaWYKKworQGludGVyZmFjZSBTRExBcHBsaWNhdGlvbiA6IE5TQXBwbGljYXRpb24KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFNETEFwcGxpY2F0aW9uCisvKiBJbnZva2VkIGZyb20gdGhlIFF1aXQgbWVudSBpdGVtICovCistICh2b2lkKXRlcm1pbmF0ZTooaWQpc2VuZGVyCit7CisgICAgLyogUG9zdCBhIFNETF9RVUlUIGV2ZW50ICovCisgICAgU0RMX0V2ZW50IGV2ZW50OworICAgIGV2ZW50LnR5cGUgPSBTRExfUVVJVDsKKyAgICBTRExfUHVzaEV2ZW50KCZldmVudCk7Cit9CitAZW5kCisKKy8qIFRoZSBtYWluIGNsYXNzIG9mIHRoZSBhcHBsaWNhdGlvbiwgdGhlIGFwcGxpY2F0aW9uJ3MgZGVsZWdhdGUgKi8KK0BpbXBsZW1lbnRhdGlvbiBTRExNYWluCisKKy8qIFNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIC5hcHAncyBwYXJlbnQgZGlyZWN0b3J5ICovCistICh2b2lkKSBzZXR1cFdvcmtpbmdEaXJlY3Rvcnk6KEJPT0wpc2hvdWxkQ2hkaXIKK3sKKyAgICBpZiAoc2hvdWxkQ2hkaXIpCisgICAgeworICAgICAgICBjaGFyIHBhcmVudGRpcltNQVhQQVRITEVOXTsKKyAgICAgICAgQ0ZVUkxSZWYgdXJsID0gQ0ZCdW5kbGVDb3B5QnVuZGxlVVJMKENGQnVuZGxlR2V0TWFpbkJ1bmRsZSgpKTsKKyAgICAgICAgQ0ZVUkxSZWYgdXJsMiA9IENGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnQoMCwgdXJsKTsKKyAgICAgICAgaWYgKENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKHVybDIsIDEsIChVSW50OCAqKXBhcmVudGRpciwgTUFYUEFUSExFTikpIHsKKyAgICAgICAgICAgIGNoZGlyKHBhcmVudGRpcik7ICAgLyogY2hkaXIgdG8gdGhlIGJpbmFyeSBhcHAncyBwYXJlbnQgKi8KKyAgICAgICAgfQorICAgICAgICBDRlJlbGVhc2UodXJsKTsKKyAgICAgICAgQ0ZSZWxlYXNlKHVybDIpOworICAgIH0KK30KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKworLyogRml4IG1lbnUgdG8gY29udGFpbiB0aGUgcmVhbCBhcHAgbmFtZSBpbnN0ZWFkIG9mICJTREwgQXBwIiAqLworLSAodm9pZClmaXhNZW51OihOU01lbnUgKilhTWVudSB3aXRoQXBwTmFtZTooTlNTdHJpbmcgKilhcHBOYW1lCit7CisgICAgTlNSYW5nZSBhUmFuZ2U7CisgICAgTlNFbnVtZXJhdG9yICplbnVtZXJhdG9yOworICAgIE5TTWVudUl0ZW0gKm1lbnVJdGVtOworCisgICAgYVJhbmdlID0gW1thTWVudSB0aXRsZV0gcmFuZ2VPZlN0cmluZzpAIlNETCBBcHAiXTsKKyAgICBpZiAoYVJhbmdlLmxlbmd0aCAhPSAwKQorICAgICAgICBbYU1lbnUgc2V0VGl0bGU6IFtbYU1lbnUgdGl0bGVdIHN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6YVJhbmdlIHdpdGg6YXBwTmFtZV1dOworCisgICAgZW51bWVyYXRvciA9IFtbYU1lbnUgaXRlbUFycmF5XSBvYmplY3RFbnVtZXJhdG9yXTsKKyAgICB3aGlsZSAoKG1lbnVJdGVtID0gW2VudW1lcmF0b3IgbmV4dE9iamVjdF0pKQorICAgIHsKKyAgICAgICAgYVJhbmdlID0gW1ttZW51SXRlbSB0aXRsZV0gcmFuZ2VPZlN0cmluZzpAIlNETCBBcHAiXTsKKyAgICAgICAgaWYgKGFSYW5nZS5sZW5ndGggIT0gMCkKKyAgICAgICAgICAgIFttZW51SXRlbSBzZXRUaXRsZTogW1ttZW51SXRlbSB0aXRsZV0gc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTphUmFuZ2Ugd2l0aDphcHBOYW1lXV07CisgICAgICAgIGlmIChbbWVudUl0ZW0gaGFzU3VibWVudV0pCisgICAgICAgICAgICBbc2VsZiBmaXhNZW51OlttZW51SXRlbSBzdWJtZW51XSB3aXRoQXBwTmFtZTphcHBOYW1lXTsKKyAgICB9CisgICAgWyBhTWVudSBzaXplVG9GaXQgXTsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgc2V0QXBwbGljYXRpb25NZW51KHZvaWQpCit7CisgICAgLyogd2FybmluZzogdGhpcyBjb2RlIGlzIHZlcnkgb2RkICovCisgICAgTlNNZW51ICphcHBsZU1lbnU7CisgICAgTlNNZW51SXRlbSAqbWVudUl0ZW07CisgICAgTlNTdHJpbmcgKnRpdGxlOworICAgIE5TU3RyaW5nICphcHBOYW1lOworICAgIAorICAgIGFwcE5hbWUgPSBnZXRBcHBsaWNhdGlvbk5hbWUoKTsKKyAgICBhcHBsZU1lbnUgPSBbW05TTWVudSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiJdOworICAgIAorICAgIC8qIEFkZCBtZW51IGl0ZW1zICovCisgICAgdGl0bGUgPSBbQCJBYm91dCAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKG9yZGVyRnJvbnRTdGFuZGFyZEFib3V0UGFuZWw6KSBrZXlFcXVpdmFsZW50OkAiIl07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW06W05TTWVudUl0ZW0gc2VwYXJhdG9ySXRlbV1dOworCisgICAgdGl0bGUgPSBbQCJIaWRlICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3IoaGlkZTopIGtleUVxdWl2YWxlbnQ6QCJoIl07CisKKyAgICBtZW51SXRlbSA9IChOU01lbnVJdGVtICopW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOkAiSGlkZSBPdGhlcnMiIGFjdGlvbjpAc2VsZWN0b3IoaGlkZU90aGVyQXBwbGljYXRpb25zOikga2V5RXF1aXZhbGVudDpAImgiXTsKKyAgICBbbWVudUl0ZW0gc2V0S2V5RXF1aXZhbGVudE1vZGlmaWVyTWFzazooTlNBbHRlcm5hdGVLZXlNYXNrfE5TQ29tbWFuZEtleU1hc2spXTsKKworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTpAIlNob3cgQWxsIiBhY3Rpb246QHNlbGVjdG9yKHVuaGlkZUFsbEFwcGxpY2F0aW9uczopIGtleUVxdWl2YWxlbnQ6QCIiXTsKKworICAgIFthcHBsZU1lbnUgYWRkSXRlbTpbTlNNZW51SXRlbSBzZXBhcmF0b3JJdGVtXV07CisKKyAgICB0aXRsZSA9IFtAIlF1aXQgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3Rvcih0ZXJtaW5hdGU6KSBrZXlFcXVpdmFsZW50OkAicSJdOworCisgICAgCisgICAgLyogUHV0IG1lbnUgaW50byB0aGUgbWVudWJhciAqLworICAgIG1lbnVJdGVtID0gW1tOU01lbnVJdGVtIGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiIiBhY3Rpb246bmlsIGtleUVxdWl2YWxlbnQ6QCIiXTsKKyAgICBbbWVudUl0ZW0gc2V0U3VibWVudTphcHBsZU1lbnVdOworICAgIFtbTlNBcHAgbWFpbk1lbnVdIGFkZEl0ZW06bWVudUl0ZW1dOworCisgICAgLyogVGVsbCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IHRoYXQgdGhpcyBpcyBub3cgdGhlIGFwcGxpY2F0aW9uIG1lbnUgKi8KKyAgICBbTlNBcHAgc2V0QXBwbGVNZW51OmFwcGxlTWVudV07CisKKyAgICAvKiBGaW5hbGx5IGdpdmUgdXAgb3VyIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdHMgKi8KKyAgICBbYXBwbGVNZW51IHJlbGVhc2VdOworICAgIFttZW51SXRlbSByZWxlYXNlXTsKK30KKworLyogQ3JlYXRlIGEgd2luZG93IG1lbnUgKi8KK3N0YXRpYyB2b2lkIHNldHVwV2luZG93TWVudSh2b2lkKQoreworICAgIE5TTWVudSAgICAgICp3aW5kb3dNZW51OworICAgIE5TTWVudUl0ZW0gICp3aW5kb3dNZW51SXRlbTsKKyAgICBOU01lbnVJdGVtICAqbWVudUl0ZW07CisKKyAgICB3aW5kb3dNZW51ID0gW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJXaW5kb3ciXTsKKyAgICAKKyAgICAvKiAiTWluaW1pemUiIGl0ZW0gKi8KKyAgICBtZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIk1pbmltaXplIiBhY3Rpb246QHNlbGVjdG9yKHBlcmZvcm1NaW5pYXR1cml6ZTopIGtleUVxdWl2YWxlbnQ6QCJtIl07CisgICAgW3dpbmRvd01lbnUgYWRkSXRlbTptZW51SXRlbV07CisgICAgW21lbnVJdGVtIHJlbGVhc2VdOworICAgIAorICAgIC8qIFB1dCBtZW51IGludG8gdGhlIG1lbnViYXIgKi8KKyAgICB3aW5kb3dNZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIldpbmRvdyIgYWN0aW9uOm5pbCBrZXlFcXVpdmFsZW50OkAiIl07CisgICAgW3dpbmRvd01lbnVJdGVtIHNldFN1Ym1lbnU6d2luZG93TWVudV07CisgICAgW1tOU0FwcCBtYWluTWVudV0gYWRkSXRlbTp3aW5kb3dNZW51SXRlbV07CisgICAgCisgICAgLyogVGVsbCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IHRoYXQgdGhpcyBpcyBub3cgdGhlIHdpbmRvdyBtZW51ICovCisgICAgW05TQXBwIHNldFdpbmRvd3NNZW51OndpbmRvd01lbnVdOworCisgICAgLyogRmluYWxseSBnaXZlIHVwIG91ciByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RzICovCisgICAgW3dpbmRvd01lbnUgcmVsZWFzZV07CisgICAgW3dpbmRvd01lbnVJdGVtIHJlbGVhc2VdOworfQorCisvKiBSZXBsYWNlbWVudCBmb3IgTlNBcHBsaWNhdGlvbk1haW4gKi8KK3N0YXRpYyB2b2lkIEN1c3RvbUFwcGxpY2F0aW9uTWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIE5TQXV0b3JlbGVhc2VQb29sCSpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisgICAgU0RMTWFpbgkJCQkqc2RsTWFpbjsKKworICAgIC8qIEVuc3VyZSB0aGUgYXBwbGljYXRpb24gb2JqZWN0IGlzIGluaXRpYWxpc2VkICovCisgICAgW1NETEFwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKKyAgICAKKyNpZmRlZiBTRExfVVNFX0NQUworICAgIHsKKyAgICAgICAgQ1BTUHJvY2Vzc1Nlck51bSBQU047CisgICAgICAgIC8qIFRlbGwgdGhlIGRvY2sgYWJvdXQgdXMgKi8KKyAgICAgICAgaWYgKCFDUFNHZXRDdXJyZW50UHJvY2VzcygmUFNOKSkKKyAgICAgICAgICAgIGlmICghQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbigmUFNOLDB4MDMsMHgzQywweDJDLDB4MTEwMykpCisgICAgICAgICAgICAgICAgaWYgKCFDUFNTZXRGcm9udFByb2Nlc3MoJlBTTikpCisgICAgICAgICAgICAgICAgICAgIFtTRExBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07CisgICAgfQorI2VuZGlmIC8qIFNETF9VU0VfQ1BTICovCisKKyAgICAvKiBTZXQgdXAgdGhlIG1lbnViYXIgKi8KKyAgICBbTlNBcHAgc2V0TWFpbk1lbnU6W1tOU01lbnUgYWxsb2NdIGluaXRdXTsKKyAgICBzZXRBcHBsaWNhdGlvbk1lbnUoKTsKKyAgICBzZXR1cFdpbmRvd01lbnUoKTsKKworICAgIC8qIENyZWF0ZSBTRExNYWluIGFuZCBtYWtlIGl0IHRoZSBhcHAgZGVsZWdhdGUgKi8KKyAgICBzZGxNYWluID0gW1tTRExNYWluIGFsbG9jXSBpbml0XTsKKyAgICBbTlNBcHAgc2V0RGVsZWdhdGU6c2RsTWFpbl07CisgICAgCisgICAgLyogU3RhcnQgdGhlIG1haW4gZXZlbnQgbG9vcCAqLworICAgIFtOU0FwcCBydW5dOworICAgIAorICAgIFtzZGxNYWluIHJlbGVhc2VdOworICAgIFtwb29sIHJlbGVhc2VdOworfQorCisjZW5kaWYKKworCisvKgorICogQ2F0Y2ggZG9jdW1lbnQgb3BlbiByZXF1ZXN0cy4uLnRoaXMgbGV0cyB1cyBub3RpY2UgZmlsZXMgd2hlbiB0aGUgYXBwCisgKiAgd2FzIGxhdW5jaGVkIGJ5IGRvdWJsZS1jbGlja2luZyBhIGRvY3VtZW50LCBvciB3aGVuIGEgZG9jdW1lbnQgd2FzCisgKiAgZHJhZ2dlZC9kcm9wcGVkIG9uIHRoZSBhcHAncyBpY29uLiBZb3UgbmVlZCB0byBoYXZlIGEKKyAqICBDRkJ1bmRsZURvY3VtZW50c1R5cGUgc2VjdGlvbiBpbiB5b3VyIEluZm8ucGxpc3QgdG8gZ2V0IHRoaXMgbWVzc2FnZSwKKyAqICBhcHBhcmVudGx5LgorICoKKyAqIEZpbGVzIGFyZSBhZGRlZCB0byBnQXJndiwgc28gdG8gdGhlIGFwcCwgdGhleSdsbCBsb29rIGxpa2UgY29tbWFuZCBsaW5lCisgKiAgYXJndW1lbnRzLiBQcmV2aW91c2x5LCBhcHBzIGxhdW5jaGVkIGZyb20gdGhlIGZpbmRlciBoYWQgbm90aGluZyBidXQKKyAqICBhbiBhcmd2WzBdLgorICoKKyAqIFRoaXMgbWVzc2FnZSBtYXkgYmUgcmVjZWl2ZWQgbXVsdGlwbGUgdGltZXMgdG8gb3BlbiBzZXZlcmFsIGRvY3Mgb24gbGF1bmNoLgorICoKKyAqIFRoaXMgbWVzc2FnZSBpcyBpZ25vcmVkIG9uY2UgdGhlIGFwcCdzIG1haW5saW5lIGhhcyBiZWVuIGNhbGxlZC4KKyAqLworLSAoQk9PTClhcHBsaWNhdGlvbjooTlNBcHBsaWNhdGlvbiAqKXRoZUFwcGxpY2F0aW9uIG9wZW5GaWxlOihOU1N0cmluZyAqKWZpbGVuYW1lCit7CisgICAgY29uc3QgY2hhciAqdGVtcGFyZzsKKyAgICBzaXplX3QgYXJnbGVuOworICAgIGNoYXIgKmFyZzsKKyAgICBjaGFyICoqbmV3YXJndjsKKworICAgIGlmICghZ0ZpbmRlckxhdW5jaCkgIC8qIE1hY09TIGlzIHBhc3NpbmcgY29tbWFuZCBsaW5lIGFyZ3MuICovCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChnQ2FsbGVkQXBwTWFpbmxpbmUpICAvKiBhcHAgaGFzIHN0YXJ0ZWQsIGlnbm9yZSB0aGlzIGRvY3VtZW50LiAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICB0ZW1wYXJnID0gW2ZpbGVuYW1lIFVURjhTdHJpbmddOworICAgIGFyZ2xlbiA9IFNETF9zdHJsZW4odGVtcGFyZykgKyAxOworICAgIGFyZyA9IChjaGFyICopIFNETF9tYWxsb2MoYXJnbGVuKTsKKyAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIG5ld2FyZ3YgPSAoY2hhciAqKikgcmVhbGxvYyhnQXJndiwgc2l6ZW9mIChjaGFyICopICogKGdBcmdjICsgMikpOworICAgIGlmIChuZXdhcmd2ID09IE5VTEwpCisgICAgeworICAgICAgICBTRExfZnJlZShhcmcpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGdBcmd2ID0gbmV3YXJndjsKKworICAgIFNETF9zdHJsY3B5KGFyZywgdGVtcGFyZywgYXJnbGVuKTsKKyAgICBnQXJndltnQXJnYysrXSA9IGFyZzsKKyAgICBnQXJndltnQXJnY10gPSBOVUxMOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qIENhbGxlZCB3aGVuIHRoZSBpbnRlcm5hbCBldmVudCBsb29wIGhhcyBqdXN0IHN0YXJ0ZWQgcnVubmluZyAqLworLSAodm9pZCkgYXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IChOU05vdGlmaWNhdGlvbiAqKSBub3RlCit7CisgICAgaW50IHN0YXR1czsKKworICAgIC8qIFNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIC5hcHAncyBwYXJlbnQgZGlyZWN0b3J5ICovCisgICAgW3NlbGYgc2V0dXBXb3JraW5nRGlyZWN0b3J5OmdGaW5kZXJMYXVuY2hdOworCisjaWYgU0RMX1VTRV9OSUJfRklMRQorICAgIC8qIFNldCB0aGUgbWFpbiBtZW51IHRvIGNvbnRhaW4gdGhlIHJlYWwgYXBwIG5hbWUgaW5zdGVhZCBvZiAiU0RMIEFwcCIgKi8KKyAgICBbc2VsZiBmaXhNZW51OltOU0FwcCBtYWluTWVudV0gd2l0aEFwcE5hbWU6Z2V0QXBwbGljYXRpb25OYW1lKCldOworI2VuZGlmCisKKyAgICAvKiBIYW5kIG9mZiB0byBtYWluIGFwcGxpY2F0aW9uIGNvZGUgKi8KKyAgICBnQ2FsbGVkQXBwTWFpbmxpbmUgPSBUUlVFOworICAgIHN0YXR1cyA9IFNETF9tYWluIChnQXJnYywgZ0FyZ3YpOworCisgICAgLyogV2UncmUgZG9uZSwgdGhhbmsgeW91IGZvciBwbGF5aW5nICovCisgICAgZXhpdChzdGF0dXMpOworfQorQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBOU1N0cmluZyAoUmVwbGFjZVN1YlN0cmluZykKKworLSAoTlNTdHJpbmcgKilzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOihOU1JhbmdlKWFSYW5nZSB3aXRoOihOU1N0cmluZyAqKWFTdHJpbmcKK3sKKyAgICB1bnNpZ25lZCBpbnQgYnVmZmVyU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgc2VsZkxlbiA9IFtzZWxmIGxlbmd0aF07CisgICAgdW5zaWduZWQgaW50IGFTdHJpbmdMZW4gPSBbYVN0cmluZyBsZW5ndGhdOworICAgIHVuaWNoYXIgKmJ1ZmZlcjsKKyAgICBOU1JhbmdlIGxvY2FsUmFuZ2U7CisgICAgTlNTdHJpbmcgKnJlc3VsdDsKKworICAgIGJ1ZmZlclNpemUgPSBzZWxmTGVuICsgYVN0cmluZ0xlbiAtIGFSYW5nZS5sZW5ndGg7CisgICAgYnVmZmVyID0gKHVuaWNoYXIgKilOU0FsbG9jYXRlTWVtb3J5UGFnZXMoYnVmZmVyU2l6ZSpzaXplb2YodW5pY2hhcikpOworICAgIAorICAgIC8qIEdldCBmaXJzdCBwYXJ0IGludG8gYnVmZmVyICovCisgICAgbG9jYWxSYW5nZS5sb2NhdGlvbiA9IDA7CisgICAgbG9jYWxSYW5nZS5sZW5ndGggPSBhUmFuZ2UubG9jYXRpb247CisgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczpidWZmZXIgcmFuZ2U6bG9jYWxSYW5nZV07CisgICAgCisgICAgLyogR2V0IG1pZGRsZSBwYXJ0IGludG8gYnVmZmVyICovCisgICAgbG9jYWxSYW5nZS5sb2NhdGlvbiA9IDA7CisgICAgbG9jYWxSYW5nZS5sZW5ndGggPSBhU3RyaW5nTGVuOworICAgIFthU3RyaW5nIGdldENoYXJhY3RlcnM6KGJ1ZmZlcithUmFuZ2UubG9jYXRpb24pIHJhbmdlOmxvY2FsUmFuZ2VdOworICAgICAKKyAgICAvKiBHZXQgbGFzdCBwYXJ0IGludG8gYnVmZmVyICovCisgICAgbG9jYWxSYW5nZS5sb2NhdGlvbiA9IGFSYW5nZS5sb2NhdGlvbiArIGFSYW5nZS5sZW5ndGg7CisgICAgbG9jYWxSYW5nZS5sZW5ndGggPSBzZWxmTGVuIC0gbG9jYWxSYW5nZS5sb2NhdGlvbjsKKyAgICBbc2VsZiBnZXRDaGFyYWN0ZXJzOihidWZmZXIrYVJhbmdlLmxvY2F0aW9uK2FTdHJpbmdMZW4pIHJhbmdlOmxvY2FsUmFuZ2VdOworICAgIAorICAgIC8qIEJ1aWxkIG91dHB1dCBzdHJpbmcgKi8KKyAgICByZXN1bHQgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aENoYXJhY3RlcnM6YnVmZmVyIGxlbmd0aDpidWZmZXJTaXplXTsKKyAgICAKKyAgICBOU0RlYWxsb2NhdGVNZW1vcnlQYWdlcyhidWZmZXIsIGJ1ZmZlclNpemUpOworICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0BlbmQKKworCisKKyNpZmRlZiBtYWluCisjICB1bmRlZiBtYWluCisjZW5kaWYKKworCisvKiBNYWluIGVudHJ5IHBvaW50IHRvIGV4ZWN1dGFibGUgLSBzaG91bGQgKm5vdCogYmUgU0RMX21haW4hICovCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIC8qIENvcHkgdGhlIGFyZ3VtZW50cyBpbnRvIGEgZ2xvYmFsIHZhcmlhYmxlICovCisgICAgLyogVGhpcyBpcyBwYXNzZWQgaWYgd2UgYXJlIGxhdW5jaGVkIGJ5IGRvdWJsZS1jbGlja2luZyAqLworICAgIGlmICggYXJnYyA+PSAyICYmIHN0cm5jbXAgKGFyZ3ZbMV0sICItcHNuIiwgNCkgPT0gMCApIHsKKyAgICAgICAgZ0FyZ3YgPSAoY2hhciAqKikgU0RMX21hbGxvYyhzaXplb2YgKGNoYXIgKikgKiAyKTsKKyAgICAgICAgZ0FyZ3ZbMF0gPSBhcmd2WzBdOworICAgICAgICBnQXJndlsxXSA9IE5VTEw7CisgICAgICAgIGdBcmdjID0gMTsKKyAgICAgICAgZ0ZpbmRlckxhdW5jaCA9IFlFUzsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZ0FyZ2MgPSBhcmdjOworICAgICAgICBnQXJndiA9IChjaGFyICoqKSBTRExfbWFsbG9jKHNpemVvZiAoY2hhciAqKSAqIChhcmdjKzEpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBhcmdjOyBpKyspCisgICAgICAgICAgICBnQXJndltpXSA9IGFyZ3ZbaV07CisgICAgICAgIGdGaW5kZXJMYXVuY2ggPSBOTzsKKyAgICB9CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisgICAgW1NETEFwcGxpY2F0aW9uIHBvc2VBc0NsYXNzOltOU0FwcGxpY2F0aW9uIGNsYXNzXV07CisgICAgTlNBcHBsaWNhdGlvbk1haW4gKGFyZ2MsIGFyZ3YpOworI2Vsc2UKKyAgICBDdXN0b21BcHBsaWNhdGlvbk1haW4gKGFyZ2MsIGFyZ3YpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRUFTSURFTlRJRklFUl9fX19QcmVmaXgucGNoIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwOTUwNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRUFTSURFTlRJRklFUl9fX19QcmVmaXgucGNoCkBAIC0wLDAgKzEsOSBAQAorLy8KKy8vIFByZWZpeCBoZWFkZXIgZm9yIGFsbCBzb3VyY2UgZmlsZXMgb2YgdGhlICfHUFJPSkVDVE5BTUXIJyB0YXJnZXQgaW4gdGhlICfHUFJPSkVDVE5BTUXIJyBwcm9qZWN0CisvLworCisjaW5jbHVkZSAiU0RMLmgiCisKKyNpZmRlZiBfX09CSkNfXworICAgICNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJY29uLmljbnMgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSWNvbi5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGIwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSWNvbi5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJbmZvLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUluZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4Nzc0NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJbmZvLnBsaXN0CkBAIC0wLDAgKzEsMTIgQEAKK3sKKwlGaWxlc1RvUmVuYW1lID0geworCQkiU0RMQXBwX1ByZWZpeC5wY2giID0gIsdQUk9KRUNUTkFNRchfUHJlZml4LnBjaCI7CisJfTsKKwlGaWxlc1RvTWFjcm9FeHBhbmQgPSAoCisJCSLHUFJPSkVDVE5BTUXIX1ByZWZpeC5wY2giLAorCQkiSW5mby5wbGlzdCIsCisJCSJFbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzIiwKKwkJIm1haW4uYyIsCisJKTsKKwlEZXNjcmlwdGlvbiA9ICJUaGlzIHByb2plY3QgYnVpbGRzIGFuIFNETC1iYXNlZCBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgT3BlbkdMLiI7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWQ0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMCwwICsxLDM1MCBAQAorLy8gISQqVVRGOCokIQoreworCWFyY2hpdmVWZXJzaW9uID0gMTsKKwljbGFzc2VzID0geworCX07CisJb2JqZWN0VmVyc2lvbiA9IDQyOworCW9iamVjdHMgPSB7CisKKy8qIEJlZ2luIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisJCTAwMkYzOUZBMDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjM5RjkwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzQTAwMDlEMDg4NDYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovOyB9OworCQkwMDJGM0EyRTA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNBMkMwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSAqLzsgfTsKKwkJMDAyRjNBM0YwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi87IH07CisJCTAwMkYzQkZBMDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNCRjQwOUQwOTM4OTAwRUJFQjg4IC8qIGF0bGFudGlzLmMgKi87IH07CisJCTAwMkYzQkZDMDlEMDkzODkwMEVCRUI4OCAvKiBkb2xwaGluLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0JGNjA5RDA5Mzg5MDBFQkVCODggLyogZG9scGhpbi5jICovOyB9OworCQkwMDJGM0JGRDA5RDA5Mzg5MDBFQkVCODggLyogc2hhcmsuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQkY3MDlEMDkzODkwMEVCRUI4OCAvKiBzaGFyay5jICovOyB9OworCQkwMDJGM0JGRTA5RDA5Mzg5MDBFQkVCODggLyogc3dpbS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNCRjgwOUQwOTM4OTAwRUJFQjg4IC8qIHN3aW0uYyAqLzsgfTsKKwkJMDAyRjNCRkYwOUQwOTM4OTAwRUJFQjg4IC8qIHdoYWxlLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0JGOTA5RDA5Mzg5MDBFQkVCODggLyogd2hhbGUuYyAqLzsgfTsKKwkJMDAyRjNDMDEwOUQwOTNCRDAwRUJFQjg4IC8qIE9wZW5HTC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0MwMDA5RDA5M0JEMDBFQkVCODggLyogT3BlbkdMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjNDNjEwOUQwOTUxRTAwRUJFQjg4IC8qIEdMVVQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNDNjAwOUQwOTUxRTAwRUJFQjg4IC8qIEdMVVQuZnJhbWV3b3JrICovOyB9OworCQk4RDExMDcyQjA0ODZDRUI4MDBFNDcwOTAgLyogSW5mb1BsaXN0LnN0cmluZ3MgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4OUMxNjVDRkU4NDBFMENDMDJBQUMwNyAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLzsgfTsKKwkJOEQxMTA3MkYwNDg2Q0VCODAwRTQ3MDkwIC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDEwNThDN0ExRkVBNTRGMDExMUNBMkNCQiAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisvKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTAwMkYzOUZEMDlEMDg4MzQwMEVCRUI4OCAvKiBDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvcHlGaWxlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZHN0UGF0aCA9ICIiOworCQkJZHN0U3ViZm9sZGVyU3BlYyA9IDEwOworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjNBMDAwOUQwODg0NjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8sCisJCQkpOworCQkJbmFtZSA9ICJDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSI7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisJCTAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBTREwuZnJhbWV3b3JrOyBwYXRoID0gL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkwMDJGM0EyQjA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU0RMTWFpbi5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQTJDMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBTRExNYWluLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNBM0UwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IG1haW4uYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0JGNDA5RDA5Mzg5MDBFQkVCODggLyogYXRsYW50aXMuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IGF0bGFudGlzLmM7IHBhdGggPSBhdGxhbnRpcy9hdGxhbnRpcy5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQkY1MDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gYXRsYW50aXMuaDsgcGF0aCA9IGF0bGFudGlzL2F0bGFudGlzLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNCRjYwOUQwOTM4OTAwRUJFQjg4IC8qIGRvbHBoaW4uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IGRvbHBoaW4uYzsgcGF0aCA9IGF0bGFudGlzL2RvbHBoaW4uYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0JGNzA5RDA5Mzg5MDBFQkVCODggLyogc2hhcmsuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHNoYXJrLmM7IHBhdGggPSBhdGxhbnRpcy9zaGFyay5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQkY4MDlEMDkzODkwMEVCRUI4OCAvKiBzd2ltLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBzd2ltLmM7IHBhdGggPSBhdGxhbnRpcy9zd2ltLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNCRjkwOUQwOTM4OTAwRUJFQjg4IC8qIHdoYWxlLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSB3aGFsZS5jOyBwYXRoID0gYXRsYW50aXMvd2hhbGUuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0MwMDA5RDA5M0JEMDBFQkVCODggLyogT3BlbkdMLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gT3BlbkdMLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL09wZW5HTC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTAwMkYzQzYwMDlEMDk1MUUwMEVCRUI4OCAvKiBHTFVULmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gR0xVVC5mcmFtZXdvcms7IHBhdGggPSAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0dMVVQuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA4OUMxNjVERkU4NDBFMENDMDJBQUMwNyAvKiBFbmdsaXNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDEwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Quc3RyaW5nczsgbmFtZSA9IEVuZ2xpc2g7IHBhdGggPSBFbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDb2NvYS5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTI5Qjk3MzI0RkRDRkEzOTQxMUNBMkNFQSAvKiBBcHBLaXQuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBBcHBLaXQuZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMjlCOTczMjVGRENGQTM5NDExQ0EyQ0VBIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBGb3VuZGF0aW9uLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0ZvdW5kYXRpb24uZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkzMkNBNEY2MzAzNjhEMUVFMDBDOTE3ODMgLyogX19fUFJPSkVDVE5BTUVfX19fUHJlZml4LnBjaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gIl9fX1BST0pFQ1ROQU1FX19fX1ByZWZpeC5wY2giOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4RDExMDczMTA0ODZDRUI4MDBFNDcwOTAgLyogSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Q7IHBhdGggPSBJbmZvLnBsaXN0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4RDExMDczMjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18uYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSAiX19fUFJPSkVDVE5BTUVfX18uYXBwIjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKy8qIEVuZCBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDExMDcyRTA0ODZDRUI4MDBFNDcwOTAgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzOUZBMDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjNDNjEwOUQwOTUxRTAwRUJFQjg4IC8qIEdMVVQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJOEQxMTA3MkYwNDg2Q0VCODAwRTQ3MDkwIC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzQzAxMDlEMDkzQkQwMEVCRUI4OCAvKiBPcGVuR0wuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhHcm91cCBzZWN0aW9uICovCisJCTAwMkYzQkYzMDlEMDkzNzgwMEVCRUI4OCAvKiBhdGxhbnRpcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDAyRjNCRjQwOUQwOTM4OTAwRUJFQjg4IC8qIGF0bGFudGlzLmMgKi8sCisJCQkJMDAyRjNCRjUwOUQwOTM4OTAwRUJFQjg4IC8qIGF0bGFudGlzLmggKi8sCisJCQkJMDAyRjNCRjYwOUQwOTM4OTAwRUJFQjg4IC8qIGRvbHBoaW4uYyAqLywKKwkJCQkwMDJGM0JGNzA5RDA5Mzg5MDBFQkVCODggLyogc2hhcmsuYyAqLywKKwkJCQkwMDJGM0JGODA5RDA5Mzg5MDBFQkVCODggLyogc3dpbS5jICovLAorCQkJCTAwMkYzQkY5MDlEMDkzODkwMEVCRUI4OCAvKiB3aGFsZS5jICovLAorCQkJKTsKKwkJCW5hbWUgPSBhdGxhbnRpczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4MEU5NkRERkUyMDFENkQ3RjAwMDAwMSAvKiBDbGFzc2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGM0EyQjA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5oICovLAorCQkJCTAwMkYzQTJDMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gKi8sCisJCQkpOworCQkJbmFtZSA9IENsYXNzZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxMDU4QzdBMEZFQTU0RjAxMTFDQTJDQkIgLyogTGlua2VkIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovLAorCQkJCTAwMkYzQzYwMDlEMDk1MUUwMEVCRUI4OCAvKiBHTFVULmZyYW1ld29yayAqLywKKwkJCQkxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovLAorCQkJCTAwMkYzQzAwMDlEMDkzQkQwMEVCRUI4OCAvKiBPcGVuR0wuZnJhbWV3b3JrICovLAorCQkJKTsKKwkJCW5hbWUgPSAiTGlua2VkIEZyYW1ld29ya3MiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMTA1OEM3QTJGRUE1NEYwMTExQ0EyQ0JCIC8qIE90aGVyIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTI5Qjk3MzI0RkRDRkEzOTQxMUNBMkNFQSAvKiBBcHBLaXQuZnJhbWV3b3JrICovLAorCQkJCTI5Qjk3MzI1RkRDRkEzOTQxMUNBMkNFQSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayAqLywKKwkJCSk7CisJCQluYW1lID0gIk90aGVyIEZyYW1ld29ya3MiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMTlDMjhGQUNGRTlENTIwRDExQ0EyQ0JCIC8qIFByb2R1Y3RzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk4RDExMDczMjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18uYXBwICovLAorCQkJKTsKKwkJCW5hbWUgPSBQcm9kdWN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE0RkRDRkEzOTQxMUNBMkNFQSAvKiBfX19QUk9KRUNUTkFNRUFTWE1MX19fICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODBFOTZEREZFMjAxRDZEN0YwMDAwMDEgLyogQ2xhc3NlcyAqLywKKwkJCQkyOUI5NzMxNUZEQ0ZBMzk0MTFDQTJDRUEgLyogT3RoZXIgU291cmNlcyAqLywKKwkJCQkyOUI5NzMxN0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUmVzb3VyY2VzICovLAorCQkJCTI5Qjk3MzIzRkRDRkEzOTQxMUNBMkNFQSAvKiBGcmFtZXdvcmtzICovLAorCQkJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLywKKwkJCSk7CisJCQluYW1lID0gIl9fX1BST0pFQ1ROQU1FQVNYTUxfX18iOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTVGRENGQTM5NDExQ0EyQ0VBIC8qIE90aGVyIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzQkYzMDlEMDkzNzgwMEVCRUI4OCAvKiBhdGxhbnRpcyAqLywKKwkJCQkzMkNBNEY2MzAzNjhEMUVFMDBDOTE3ODMgLyogX19fUFJPSkVDVE5BTUVfX19fUHJlZml4LnBjaCAqLywKKwkJCQkwMDJGM0EzRTA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jICovLAorCQkJKTsKKwkJCW5hbWUgPSAiT3RoZXIgU291cmNlcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMxN0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk4RDExMDczMTA0ODZDRUI4MDBFNDcwOTAgLyogSW5mby5wbGlzdCAqLywKKwkJCQkwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi8sCisJCQkpOworCQkJbmFtZSA9IFJlc291cmNlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzIzRkRDRkEzOTQxMUNBMkNFQSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxMDU4QzdBMEZFQTU0RjAxMTFDQTJDQkIgLyogTGlua2VkIEZyYW1ld29ya3MgKi8sCisJCQkJMTA1OEM3QTJGRUE1NEYwMTExQ0EyQ0JCIC8qIE90aGVyIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJbmFtZSA9IEZyYW1ld29ya3M7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJOEQxMTA3MjYwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEMwMUZDRjRBMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiX19fUFJPSkVDVE5BTUVfX18iICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJOEQxMTA3MjkwNDg2Q0VCODAwRTQ3MDkwIC8qIFJlc291cmNlcyAqLywKKwkJCQk4RDExMDcyQzA0ODZDRUI4MDBFNDcwOTAgLyogU291cmNlcyAqLywKKwkJCQk4RDExMDcyRTA0ODZDRUI4MDBFNDcwOTAgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGMzlGRDA5RDA4ODM0MDBFQkVCODggLyogQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJfX19QUk9KRUNUTkFNRV9fXyI7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChIT01FKS9BcHBsaWNhdGlvbnMiOworCQkJcHJvZHVjdE5hbWUgPSAiX19fUFJPSkVDVE5BTUVfX18iOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDhEMTEwNzMyMDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXy5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJMjlCOTczMTNGRENGQTM5NDExQ0EyQ0VBIC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBDMDFGQ0Y0RTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJfX19QUk9KRUNUTkFNRV9fXyIgKi87CisJCQljb21wYXRpYmlsaXR5VmVyc2lvbiA9ICJYY29kZSAyLjQiOworCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDE7CisJCQltYWluR3JvdXAgPSAyOUI5NzMxNEZEQ0ZBMzk0MTFDQTJDRUEgLyogX19fUFJPSkVDVE5BTUVBU1hNTF9fXyAqLzsKKwkJCXByb2plY3REaXJQYXRoID0gIiI7CisJCQlwcm9qZWN0Um9vdCA9ICIiOworCQkJdGFyZ2V0cyA9ICgKKwkJCQk4RDExMDcyNjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18gKi8sCisJCQkpOworCQl9OworLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MjkwNDg2Q0VCODAwRTQ3MDkwIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJOEQxMTA3MkIwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDExMDcyQzA0ODZDRUI4MDBFNDcwOTAgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzQTJFMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gaW4gU291cmNlcyAqLywKKwkJCQkwMDJGM0EzRjA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNCRkEwOUQwOTM4OTAwRUJFQjg4IC8qIGF0bGFudGlzLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDJGM0JGQzA5RDA5Mzg5MDBFQkVCODggLyogZG9scGhpbi5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNCRkQwOUQwOTM4OTAwRUJFQjg4IC8qIHNoYXJrLmMgaW4gU291cmNlcyAqLywKKwkJCQkwMDJGM0JGRTA5RDA5Mzg5MDBFQkVCODggLyogc3dpbS5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNCRkYwOUQwOTM4OTAwRUJFQjg4IC8qIHdoYWxlLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFZhcmlhbnRHcm91cCBzZWN0aW9uICovCisJCTA4OUMxNjVDRkU4NDBFMENDMDJBQUMwNyAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLyA9IHsKKwkJCWlzYSA9IFBCWFZhcmlhbnRHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA4OUMxNjVERkU4NDBFMENDMDJBQUMwNyAvKiBFbmdsaXNoICovLAorCQkJKTsKKwkJCW5hbWUgPSBJbmZvUGxpc3Quc3RyaW5nczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYVmFyaWFudEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCQlDMDFGQ0Y0QjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICJfX19QUk9KRUNUTkFNRUFTSURFTlRJRklFUl9fX19QcmVmaXgucGNoIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCQlQUk9EVUNUX05BTUUgPSAiX19fUFJPSkVDVE5BTUVfX18iOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJQzAxRkNGNEMwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAoCisJCQkJCXBwYywKKwkJCQkJaTM4NiwKKwkJCQkpOworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IE5POworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIl9fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2giOworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9BcHBsaWNhdGlvbnMiOworCQkJCVBST0RVQ1RfTkFNRSA9ICJfX19QUk9KRUNUTkFNRV9fXyI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUMwMUZDRjRGMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyX0JJVF9QUkVfWENPREVfM18xKSI7CisJCQkJQVJDSFNfU1RBTkRBUkRfMzJfQklUX1BSRV9YQ09ERV8zXzEgPSAicHBjIGkzODYiOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MsCisJCQkJCSIkKEZSQU1FV09SS19TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCUdDQ19WRVJTSU9OID0gNC4wOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMsCisJCQkJCSIkKEhFQURFUl9TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUMwMUZDRjUwMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfQklUX1BSRV9YQ09ERV8zXzEpIjsKKwkJCQlBUkNIU19TVEFOREFSRF8zMl9CSVRfUFJFX1hDT0RFXzNfMSA9ICJwcGMgaTM4NiI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3JrcywKKwkJCQkJIiQoRlJBTUVXT1JLX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJR0NDX1ZFUlNJT04gPSA0LjA7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycywKKwkJCQkJIiQoSEVBREVSX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVNES1JPT1QgPSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCUMwMUZDRjRBMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiX19fUFJPSkVDVE5BTUVfX18iICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJQzAxRkNGNEIwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovLAorCQkJCUMwMUZDRjRDMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUMwMUZDRjRFMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIl9fX1BST0pFQ1ROQU1FX19fIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUMwMUZDRjRGMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLywKKwkJCQlDMDFGQ0Y1MDA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCX07CisJcm9vdE9iamVjdCA9IDI5Qjk3MzEzRkRDRkEzOTQxMUNBMkNFQSAvKiBQcm9qZWN0IG9iamVjdCAqLzsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9hdGxhbnRpcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL2F0bGFudGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmZGY2YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9hdGxhbnRpcy5jCkBAIC0wLDAgKzEsNDU5IEBACisKKy8qIENvcHlyaWdodCAoYykgTWFyayBKLiBLaWxnYXJkLCAxOTk0LiAqLworCisvKioKKyAqIChjKSBDb3B5cmlnaHQgMTk5MywgMTk5NCwgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQUxMIFJJR0hUUyBSRVNFUlZFRAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZQorICogYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKKyAqIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSEUgTUFURVJJQUwgRU1CT0RJRUQgT04gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBUTyBZT1UgIkFTLUlTIgorICogQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLAorICogSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCisgKiBHUkFQSElDUywgSU5DLiAgQkUgTElBQkxFIFRPIFlPVSBPUiBBTllPTkUgRUxTRSBGT1IgQU5ZIERJUkVDVCwKKyAqIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKKyAqIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sCisgKiBMT1NTIE9GIFBST0ZJVCwgTE9TUyBPRiBVU0UsIFNBVklOR1MgT1IgUkVWRU5VRSwgT1IgVEhFIENMQUlNUyBPRgorICogVEhJUkQgUEFSVElFUywgV0hFVEhFUiBPUiBOT1QgU0lMSUNPTiBHUkFQSElDUywgSU5DLiAgSEFTIEJFRU4KKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggTE9TUywgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogUE9TU0VTU0lPTiwgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cworICogVXNlLCBkdXBsaWNhdGlvbiwgb3IgZGlzY2xvc3VyZSBieSB0aGUgR292ZXJubWVudCBpcyBzdWJqZWN0IHRvCisgKiByZXN0cmljdGlvbnMgc2V0IGZvcnRoIGluIEZBUiA1Mi4yMjcuMTkoYykoMikgb3Igc3VicGFyYWdyYXBoCisgKiAoYykoMSkoaWkpIG9mIHRoZSBSaWdodHMgaW4gVGVjaG5pY2FsIERhdGEgYW5kIENvbXB1dGVyIFNvZnR3YXJlCisgKiBjbGF1c2UgYXQgREZBUlMgMjUyLjIyNy03MDEzIGFuZC9vciBpbiBzaW1pbGFyIG9yIHN1Y2Nlc3NvcgorICogY2xhdXNlcyBpbiB0aGUgRkFSIG9yIHRoZSBET0Qgb3IgTkFTQSBGQVIgU3VwcGxlbWVudC4KKyAqIFVucHVibGlzaGVkLS0gcmlnaHRzIHJlc2VydmVkIHVuZGVyIHRoZSBjb3B5cmlnaHQgbGF3cyBvZiB0aGUKKyAqIFVuaXRlZCBTdGF0ZXMuICBDb250cmFjdG9yL21hbnVmYWN0dXJlciBpcyBTaWxpY29uIEdyYXBoaWNzLAorICogSW5jLiwgMjAxMSBOLiAgU2hvcmVsaW5lIEJsdmQuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDAzOS03MzExLgorICoKKyAqIE9wZW5HTChUTSkgaXMgYSB0cmFkZW1hcmsgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxHTFVUL2dsdXQuaD4KKyNpbmNsdWRlICJhdGxhbnRpcy5oIgorCitmaXNoUmVjIHNoYXJrc1tOVU1fU0hBUktTXTsKK2Zpc2hSZWMgbW9tV2hhbGU7CitmaXNoUmVjIGJhYnlXaGFsZTsKK2Zpc2hSZWMgZG9scGg7CisKK0dMYm9vbGVhbiBUaW1pbmcgPSBHTF9UUlVFOworCitpbnQgd193aW4gPSA2NDA7CitpbnQgaF93aW4gPSA0ODA7CitHTGludCBjb3VudCAgPSAwOworR0xlbnVtIFN0ck1vZGUgPSBHTF9WRU5ET1I7CisKK0dMYm9vbGVhbiBtb3Zpbmc7CisKK3N0YXRpYyBkb3VibGUgbXRpbWUodm9pZCkKK3sKKyAgIHN0cnVjdCB0aW1ldmFsIHRrX3RpbWU7CisgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CisgICAKKyAgIGdldHRpbWVvZmRheSgmdGtfdGltZSwgJnR6KTsKKyAgIAorICAgcmV0dXJuIDQyOTQuOTY3Mjk2ICogdGtfdGltZS50dl9zZWMgKyAwLjAwMDAwMSAqIHRrX3RpbWUudHZfdXNlYzsKK30KKworc3RhdGljIGRvdWJsZSBmaWx0ZXIoZG91YmxlIGluLCBkb3VibGUgKnNhdmUpCit7CisJc3RhdGljIGRvdWJsZSBrMSA9IDAuOTsKKwlzdGF0aWMgZG91YmxlIGsyID0gMC4wNTsKKworCXNhdmVbM10gPSBpbjsKKwlzYXZlWzFdID0gc2F2ZVswXSprMSArIGsyKihzYXZlWzNdICsgc2F2ZVsyXSk7CisKKwlzYXZlWzBdPXNhdmVbMV07CisJc2F2ZVsyXT1zYXZlWzNdOworCisJcmV0dXJuKHNhdmVbMV0pOworfQorCit2b2lkIERyYXdTdHIoY29uc3QgY2hhciAqc3RyKQoreworCUdMaW50IGkgPSAwOworCQorCWlmKCFzdHIpIHJldHVybjsKKyAgICAgICAgCisJd2hpbGUoc3RyW2ldKQorCXsKKwkJZ2x1dEJpdG1hcENoYXJhY3RlcihHTFVUX0JJVE1BUF9IRUxWRVRJQ0FfMTIsIHN0cltpXSk7CisJCWkrKzsKKwl9Cit9CisKK3ZvaWQKK0luaXRGaXNocyh2b2lkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9TSEFSS1M7IGkrKykgeworICAgICAgICBzaGFya3NbaV0ueCA9IDcwMDAwLjAgKyByYW5kKCkgJSA2MDAwOworICAgICAgICBzaGFya3NbaV0ueSA9IHJhbmQoKSAlIDYwMDA7CisgICAgICAgIHNoYXJrc1tpXS56ID0gcmFuZCgpICUgNjAwMDsKKyAgICAgICAgc2hhcmtzW2ldLnBzaSA9IHJhbmQoKSAlIDM2MCAtIDE4MC4wOworICAgICAgICBzaGFya3NbaV0udiA9IDEuMDsKKyAgICB9CisKKyAgICBkb2xwaC54ID0gMzAwMDAuMDsKKyAgICBkb2xwaC55ID0gMC4wOworICAgIGRvbHBoLnogPSA2MDAwLjA7CisgICAgZG9scGgucHNpID0gOTAuMDsKKyAgICBkb2xwaC50aGV0YSA9IDAuMDsKKyAgICBkb2xwaC52ID0gMy4wOworCisgICAgbW9tV2hhbGUueCA9IDcwMDAwLjA7CisgICAgbW9tV2hhbGUueSA9IDAuMDsKKyAgICBtb21XaGFsZS56ID0gMC4wOworICAgIG1vbVdoYWxlLnBzaSA9IDkwLjA7CisgICAgbW9tV2hhbGUudGhldGEgPSAwLjA7CisgICAgbW9tV2hhbGUudiA9IDMuMDsKKworICAgIGJhYnlXaGFsZS54ID0gNjAwMDAuMDsKKyAgICBiYWJ5V2hhbGUueSA9IC0yMDAwLjA7CisgICAgYmFieVdoYWxlLnogPSAtMjAwMC4wOworICAgIGJhYnlXaGFsZS5wc2kgPSA5MC4wOworICAgIGJhYnlXaGFsZS50aGV0YSA9IDAuMDsKKyAgICBiYWJ5V2hhbGUudiA9IDMuMDsKK30KKwordm9pZAorQXRsYW50aXNfSW5pdCh2b2lkKQoreworICAgIHN0YXRpYyBmbG9hdCBhbWJpZW50W10gPSB7MC4yLCAwLjIsIDAuMiwgMS4wfTsKKyAgICBzdGF0aWMgZmxvYXQgZGlmZnVzZVtdID0gezEuMCwgMS4wLCAxLjAsIDEuMH07CisgICAgc3RhdGljIGZsb2F0IHBvc2l0aW9uW10gPSB7MC4wLCAxLjAsIDAuMCwgMC4wfTsKKyAgICBzdGF0aWMgZmxvYXQgbWF0X3NoaW5pbmVzc1tdID0gezkwLjB9OworICAgIHN0YXRpYyBmbG9hdCBtYXRfc3BlY3VsYXJbXSA9IHswLjgsIDAuOCwgMC44LCAxLjB9OworICAgIHN0YXRpYyBmbG9hdCBtYXRfZGlmZnVzZVtdID0gezAuNDYsIDAuNjYsIDAuNzk1LCAxLjB9OworICAgIHN0YXRpYyBmbG9hdCBtYXRfYW1iaWVudFtdID0gezAuMywgMC40LCAwLjUsIDEuMH07CisgICAgc3RhdGljIGZsb2F0IGxtb2RlbF9hbWJpZW50W10gPSB7MC40LCAwLjQsIDAuNCwgMS4wfTsKKyAgICBzdGF0aWMgZmxvYXQgbG1vZGVsX2xvY2Fsdmlld2VyW10gPSB7MC4wfTsKKyAgICAvL0dMZmxvYXQgbWFwMVs0XSA9IHswLjAsIDAuMCwgMC4wLCAwLjB9OworICAgIC8vR0xmbG9hdCBtYXAyWzRdID0gezAuMCwgMC4wLCAwLjAsIDAuMH07CisgICAgc3RhdGljIGZsb2F0IGZvZ19jb2xvcltdID0gezAuMCwgMC41LCAwLjksIDEuMH07CisKKyAgICBnbEZyb250RmFjZShHTF9DQ1cpOworCisgICAgZ2xEZXB0aEZ1bmMoR0xfTEVTUyk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisKKyAgICBnbExpZ2h0ZnYoR0xfTElHSFQwLCBHTF9BTUJJRU5ULCBhbWJpZW50KTsKKyAgICBnbExpZ2h0ZnYoR0xfTElHSFQwLCBHTF9ESUZGVVNFLCBkaWZmdXNlKTsKKyAgICBnbExpZ2h0ZnYoR0xfTElHSFQwLCBHTF9QT1NJVElPTiwgcG9zaXRpb24pOworICAgIGdsTGlnaHRNb2RlbGZ2KEdMX0xJR0hUX01PREVMX0FNQklFTlQsIGxtb2RlbF9hbWJpZW50KTsKKyAgICBnbExpZ2h0TW9kZWxmdihHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVIsIGxtb2RlbF9sb2NhbHZpZXdlcik7CisgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMCk7CisKKyAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgbWF0X3NoaW5pbmVzcyk7CisgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgbWF0X3NwZWN1bGFyKTsKKyAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0RJRkZVU0UsIG1hdF9kaWZmdXNlKTsKKyAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0FNQklFTlQsIG1hdF9hbWJpZW50KTsKKworICAgIEluaXRGaXNocygpOworCisgICAgZ2xFbmFibGUoR0xfRk9HKTsKKwlnbEZvZ2koR0xfRk9HX01PREUsIEdMX0VYUCk7CisJZ2xGb2dmKEdMX0ZPR19ERU5TSVRZLCAwLjAwMDAwMjUpOworCWdsRm9nZnYoR0xfRk9HX0NPTE9SLCBmb2dfY29sb3IpOworCisgICAgZ2xDbGVhckNvbG9yKDAuMCwgMC41LCAwLjksIDEuMCk7Cit9CisKK3ZvaWQKK0F0bGFudGlzX1Jlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCXdfd2luID0gd2lkdGg7CisJaF93aW4gPSBoZWlnaHQ7CisJCisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsdVBlcnNwZWN0aXZlKDYwLjAsIChHTGZsb2F0KSB3aWR0aCAvIChHTGZsb2F0KSBoZWlnaHQsIDIwMDAwLjAsIDMwMDAwMC4wKTsKKyAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKK30KKwordm9pZAorQXRsYW50aXNfQW5pbWF0ZSh2b2lkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9TSEFSS1M7IGkrKykgeworICAgICAgICBTaGFya1BpbG90KCZzaGFya3NbaV0pOworICAgICAgICBTaGFya01pc3MoaSk7CisgICAgfQorICAgIFdoYWxlUGlsb3QoJmRvbHBoKTsKKyAgICBkb2xwaC5waGkrKzsKKyAgICAvL2dsdXRQb3N0UmVkaXNwbGF5KCk7CisgICAgV2hhbGVQaWxvdCgmbW9tV2hhbGUpOworICAgIG1vbVdoYWxlLnBoaSsrOworICAgIFdoYWxlUGlsb3QoJmJhYnlXaGFsZSk7CisgICAgYmFieVdoYWxlLnBoaSsrOworfQorCit2b2lkCitBdGxhbnRpc19LZXkodW5zaWduZWQgY2hhciBrZXksIGludCB4LCBpbnQgeSkKK3sKKyAgICBzd2l0Y2ggKGtleSkgeworICAgIGNhc2UgJ3QnOgorICAgIAlUaW1pbmcgPSAhVGltaW5nOworICAgIGJyZWFrOworICAgIGNhc2UgJyAnOgorICAgIAlzd2l0Y2goU3RyTW9kZSkKKyAgICAJeworCQkgICAgY2FzZSBHTF9FWFRFTlNJT05TOgorICAgIAkJCVN0ck1vZGUgPSBHTF9WRU5ET1I7CisJCSAgICBicmVhazsKKwkJICAgIGNhc2UgR0xfVkVORE9SOgorCQkgICAgCVN0ck1vZGUgPSBHTF9SRU5ERVJFUjsKKwkJICAgIGJyZWFrOworCQkgICAgY2FzZSBHTF9SRU5ERVJFUjoKKwkJICAgIAlTdHJNb2RlID0gR0xfVkVSU0lPTjsKKwkJICAgIGJyZWFrOworCQkgICAgY2FzZSBHTF9WRVJTSU9OOgorCQkgICAgCVN0ck1vZGUgPSBHTF9FWFRFTlNJT05TOworCQkgICAgYnJlYWs7CisJCX0KKwlicmVhazsKKyAgICBjYXNlIDI3OiAgICAgICAgICAgLyogRXNjIHdpbGwgcXVpdCAqLworICAgICAgICBleGl0KDEpOworICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOiAgICAgICAgICAgICAJCS8qICJzIiBzdGFydCBhbmltYXRpb24gKi8KKyAgICAgICAgbW92aW5nID0gR0xfVFJVRTsKKyAgICAgICAgLy9nbHV0SWRsZUZ1bmMoQW5pbWF0ZSk7CisgICAgYnJlYWs7CisgICAgY2FzZSAnYSc6ICAgICAgICAgIAkJCS8qICJhIiBzdG9wIGFuaW1hdGlvbiAqLworICAgICAgICBtb3ZpbmcgPSBHTF9GQUxTRTsKKyAgICAgICAgLy9nbHV0SWRsZUZ1bmMoTlVMTCk7CisgICAgYnJlYWs7CisgICAgY2FzZSAnLic6ICAgICAgICAgIAkJCS8qICIuIiB3aWxsIGFkdmFuY2UgZnJhbWUgKi8KKyAgICAgICAgaWYgKCFtb3ZpbmcpIHsKKyAgICAgICAgICAgIEF0bGFudGlzX0FuaW1hdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KKy8qCit2b2lkIERpc3BsYXkodm9pZCkKK3sKKwlzdGF0aWMgZmxvYXQgUDEyM1szXSA9IHstNDQ4Ljk0LCAtMjAzLjE0LCA5NDk5LjYwfTsKKwlzdGF0aWMgZmxvYXQgUDEyNFszXSA9IHstNDQyLjY0LCAtMTg1LjIwLCA5NTI4LjA3fTsKKwlzdGF0aWMgZmxvYXQgUDEyNVszXSA9IHstNDQxLjA3LCAtMTQ4LjA1LCA5NTI4LjA3fTsKKwlzdGF0aWMgZmxvYXQgUDEyNlszXSA9IHstNDQzLjQzLCAtMTI4Ljg0LCA5NDk5LjYwfTsKKwlzdGF0aWMgZmxvYXQgUDEyN1szXSA9IHstNDU2Ljg3LCAtMTQ2Ljc4LCA5NDY2LjY3fTsKKwlzdGF0aWMgZmxvYXQgUDEyOFszXSA9IHstNDUzLjY4LCAtMTgzLjkzLCA5NDY2LjY3fTsKKworCWdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOworCQorCWdsUHVzaE1hdHJpeCgpOworICAgIEZpc2hUcmFuc2Zvcm0oJmRvbHBoKTsKKyAgICBEcmF3RG9scGhpbigmZG9scGgpOworICAgIGdsUG9wTWF0cml4KCk7CisgCisJZ2x1dFN3YXBCdWZmZXJzKCk7Cit9CisqLworCit2b2lkCitBdGxhbnRpc19EaXNwbGF5KHZvaWQpCit7CisgICAgaW50IGk7CisgICAgc3RhdGljIGRvdWJsZSB0aFs0XSA9IHswLjAsIDAuMCwgMC4wLCAwLjB9OworCXN0YXRpYyBkb3VibGUgdDEgPSAwLjAsIHQyID0gMC4wLCB0OworCWNoYXIgbnVtX3N0clsxMjhdOworICAgIAorICAgIHQxID0gdDI7CisKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fU0hBUktTOyBpKyspIHsKKyAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgIEZpc2hUcmFuc2Zvcm0oJnNoYXJrc1tpXSk7CisgICAgICAgIERyYXdTaGFyaygmc2hhcmtzW2ldKTsKKyAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICB9CisKKyAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICBGaXNoVHJhbnNmb3JtKCZkb2xwaCk7CisgICAgRHJhd0RvbHBoaW4oJmRvbHBoKTsKKyAgICBnbFBvcE1hdHJpeCgpOworCisgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgRmlzaFRyYW5zZm9ybSgmbW9tV2hhbGUpOworICAgIERyYXdXaGFsZSgmbW9tV2hhbGUpOworICAgIGdsUG9wTWF0cml4KCk7CisKKyAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICBGaXNoVHJhbnNmb3JtKCZiYWJ5V2hhbGUpOworICAgIGdsU2NhbGVmKDAuNDUsIDAuNDUsIDAuMyk7CisgICAgRHJhd1doYWxlKCZiYWJ5V2hhbGUpOworICAgIGdsUG9wTWF0cml4KCk7CisgICAgCisgICAgaWYoVGltaW5nKQorICAgIHsKKwkJdDIgPSBtdGltZSgpOworCQl0ID0gdDIgLSB0MTsKKwkJaWYodCA+IDAuMDAwMSkgdCA9IDEuMCAvIHQ7CisJCQorCQlnbERpc2FibGUoR0xfTElHSFRJTkcpOworCQkvL2dsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKwkJCisJCWdsQ29sb3IzZigxLjAsIDAuMCwgMC4wKTsKKwkJCisJCWdsTWF0cml4TW9kZSAoR0xfUFJPSkVDVElPTik7CisJCWdsUHVzaE1hdHJpeCgpOworCQlnbExvYWRJZGVudGl0eSgpOworCQlnbE9ydGhvKDAsIHdfd2luLCAwLCBoX3dpbiwgLTEwLjAsIDEwLjApOworCQkKKwkJZ2xSYXN0ZXJQb3MyZig1LjAsIDUuMCk7CisJCQorCQlzd2l0Y2goU3RyTW9kZSkKKwkJeworCQkJY2FzZSBHTF9WRU5ET1I6CisJCQkJc3ByaW50ZihudW1fc3RyLCAiJTAuMmYgSHosICVkeCVkLCBWRU5ET1I6ICIsIGZpbHRlcih0LCB0aCksIHdfd2luLCBoX3dpbik7CisJCQkJRHJhd1N0cihudW1fc3RyKTsKKwkJCQlEcmF3U3RyKGdsR2V0U3RyaW5nKEdMX1ZFTkRPUikpOworCQkJYnJlYWs7CisJCQljYXNlIEdMX1JFTkRFUkVSOgorCQkJCXNwcmludGYobnVtX3N0ciwgIiUwLjJmIEh6LCAlZHglZCwgUkVOREVSRVI6ICIsIGZpbHRlcih0LCB0aCksIHdfd2luLCBoX3dpbik7CisJCQkJRHJhd1N0cihudW1fc3RyKTsKKwkJCQlEcmF3U3RyKGdsR2V0U3RyaW5nKEdMX1JFTkRFUkVSKSk7CisJCQlicmVhazsKKwkJCWNhc2UgR0xfVkVSU0lPTjoKKwkJCQlzcHJpbnRmKG51bV9zdHIsICIlMC4yZiBIeiwgJWR4JWQsIFZFUlNJT046ICIsIGZpbHRlcih0LCB0aCksIHdfd2luLCBoX3dpbik7CisJCQkJRHJhd1N0cihudW1fc3RyKTsKKwkJCQlEcmF3U3RyKGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pKTsKKwkJCWJyZWFrOworCQkJY2FzZSBHTF9FWFRFTlNJT05TOgorCQkJCXNwcmludGYobnVtX3N0ciwgIiUwLjJmIEh6LCAlZHglZCwgRVhURU5TSU9OUzogIiwgZmlsdGVyKHQsIHRoKSwgd193aW4sIGhfd2luKTsKKwkJCQlEcmF3U3RyKG51bV9zdHIpOworCQkJCURyYXdTdHIoZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUykpOworCQkJYnJlYWs7CisJCX0KKwkJCisJCWdsUG9wTWF0cml4KCk7CisJCWdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCQkKKwkJZ2xFbmFibGUoR0xfTElHSFRJTkcpOworCQkvL2dsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworCX0KKwkKKyAgICBjb3VudCsrOworCisgICAgZ2x1dFN3YXBCdWZmZXJzKCk7Cit9CisKKy8qCit2b2lkCitWaXNpYmxlKGludCBzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUgPT0gR0xVVF9WSVNJQkxFKSB7CisgICAgICAgIGlmIChtb3ZpbmcpCisgICAgICAgICAgICBnbHV0SWRsZUZ1bmMoQW5pbWF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1vdmluZykKKyAgICAgICAgICAgIGdsdXRJZGxlRnVuYyhOVUxMKTsKKyAgICB9Cit9CisKKwordm9pZAordGltaW5nU2VsZWN0KGludCB2YWx1ZSkKK3sKKyAgICBzd2l0Y2godmFsdWUpCisgICAgeworCQljYXNlIDE6CisJCQlTdHJNb2RlID0gR0xfVkVORE9SOworCQlicmVhazsKKwkJY2FzZSAyOgorCQkJU3RyTW9kZSA9IEdMX1JFTkRFUkVSOworCQlicmVhazsKKwkJY2FzZSAzOgorCQkJU3RyTW9kZSA9IEdMX1ZFUlNJT047CisJCWJyZWFrOworCQljYXNlIDQ6CisJCQlTdHJNb2RlID0gR0xfRVhURU5TSU9OUzsKKwkJYnJlYWs7CisgICAgfQorfQorCit2b2lkCittZW51U2VsZWN0KGludCB2YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAxOgorICAgICAgICBtb3ZpbmcgPSBHTF9UUlVFOworICAgICAgICBnbHV0SWRsZUZ1bmMoQW5pbWF0ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgbW92aW5nID0gR0xfRkFMU0U7CisgICAgICAgIGdsdXRJZGxlRnVuYyhOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBleGl0KDApOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJR0xib29sZWFuIGZ1bGxzY3JlZW4gPSBHTF9GQUxTRTsgCisJR0xpbnQgdGltZV9tZW51OworIAkKKyAJc3JhbmQoMCk7CisKKyAgICAgICAgZ2x1dEluaXQoJmFyZ2MsIGFyZ3YpOworCWlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItdyIpKQorCQlmdWxsc2NyZWVuID0gR0xfRkFMU0U7CisKKwkvL2dsdXRJbml0RGlzcGxheU1vZGUoR0xVVF9SR0JBIHwgR0xVVF9ET1VCTEUgfCBHTFVUX0RFUFRIKTsKKwlnbHV0SW5pdERpc3BsYXlTdHJpbmcoInJnYmEgZG91YmxlIGRlcHRoPTI0Iik7CisJaWYgKGZ1bGxzY3JlZW4pIHsKKwkgIGdsdXRHYW1lTW9kZVN0cmluZygiMTAyNHg3Njg6MzIiKTsKKwkgIGdsdXRFbnRlckdhbWVNb2RlKCk7CisJfSBlbHNlIHsKKwkgIGdsdXRJbml0V2luZG93U2l6ZSgzMjAsIDI0MCk7CisJICBnbHV0Q3JlYXRlV2luZG93KCJBdGxhbnRpcyBUaW1pbmciKTsKKwl9CisgICAgSW5pdCgpOworICAgIGdsdXREaXNwbGF5RnVuYyhEaXNwbGF5KTsKKyAgICBnbHV0UmVzaGFwZUZ1bmMoUmVzaGFwZSk7CisgICAgZ2x1dEtleWJvYXJkRnVuYyhLZXkpOworICAgIG1vdmluZyA9IEdMX1RSVUU7CitnbHV0SWRsZUZ1bmMoQW5pbWF0ZSk7CisgICAgZ2x1dFZpc2liaWxpdHlGdW5jKFZpc2libGUpOworICAgIAorICAgIHRpbWVfbWVudSA9IGdsdXRDcmVhdGVNZW51KHRpbWluZ1NlbGVjdCk7CisgICAgZ2x1dEFkZE1lbnVFbnRyeSgiR0xfVkVORE9SIiwgMSk7CisgICAgZ2x1dEFkZE1lbnVFbnRyeSgiR0xfUkVOREVSRVIiLCAyKTsKKyAgICBnbHV0QWRkTWVudUVudHJ5KCJHTF9WRVJTSU9OIiwgMyk7CisgICAgZ2x1dEFkZE1lbnVFbnRyeSgiR0xfRVhURU5TSU9OUyIsIDQpOworICAgIAorICAgIGdsdXRDcmVhdGVNZW51KG1lbnVTZWxlY3QpOworICAgIGdsdXRBZGRNZW51RW50cnkoIlN0YXJ0IG1vdGlvbiIsIDEpOworICAgIGdsdXRBZGRNZW51RW50cnkoIlN0b3AgbW90aW9uIiwgMik7CisgICAgZ2x1dEFkZFN1Yk1lbnUoIlRpbWluZyBNb2RlIiwgdGltZV9tZW51KTsKKyAgICBnbHV0QWRkTWVudUVudHJ5KCJRdWl0IiwgNCk7CisgICAgCisgICAgLy9nbHV0QXR0YWNoTWVudShHTFVUX1JJR0hUX0JVVFRPTik7CisgICAgZ2x1dEF0dGFjaE1lbnUoR0xVVF9SSUdIVF9CVVRUT04pOworICAgIGdsdXRNYWluTG9vcCgpOworICAgIHJldHVybiAwOyAgICAgICAgICAgICAvLyBBTlNJIEMgcmVxdWlyZXMgbWFpbiB0byByZXR1cm4gaW50LgorfQorKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvYXRsYW50aXMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9hdGxhbnRpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2YyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvYXRsYW50aXMuaApAQCAtMCwwICsxLDY1IEBACisvKioKKyAqIChjKSBDb3B5cmlnaHQgMTk5MywgMTk5NCwgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQUxMIFJJR0hUUyBSRVNFUlZFRAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZQorICogYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKKyAqIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSEUgTUFURVJJQUwgRU1CT0RJRUQgT04gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBUTyBZT1UgIkFTLUlTIgorICogQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLAorICogSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCisgKiBHUkFQSElDUywgSU5DLiAgQkUgTElBQkxFIFRPIFlPVSBPUiBBTllPTkUgRUxTRSBGT1IgQU5ZIERJUkVDVCwKKyAqIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKKyAqIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sCisgKiBMT1NTIE9GIFBST0ZJVCwgTE9TUyBPRiBVU0UsIFNBVklOR1MgT1IgUkVWRU5VRSwgT1IgVEhFIENMQUlNUyBPRgorICogVEhJUkQgUEFSVElFUywgV0hFVEhFUiBPUiBOT1QgU0lMSUNPTiBHUkFQSElDUywgSU5DLiAgSEFTIEJFRU4KKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggTE9TUywgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogUE9TU0VTU0lPTiwgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cworICogVXNlLCBkdXBsaWNhdGlvbiwgb3IgZGlzY2xvc3VyZSBieSB0aGUgR292ZXJubWVudCBpcyBzdWJqZWN0IHRvCisgKiByZXN0cmljdGlvbnMgc2V0IGZvcnRoIGluIEZBUiA1Mi4yMjcuMTkoYykoMikgb3Igc3VicGFyYWdyYXBoCisgKiAoYykoMSkoaWkpIG9mIHRoZSBSaWdodHMgaW4gVGVjaG5pY2FsIERhdGEgYW5kIENvbXB1dGVyIFNvZnR3YXJlCisgKiBjbGF1c2UgYXQgREZBUlMgMjUyLjIyNy03MDEzIGFuZC9vciBpbiBzaW1pbGFyIG9yIHN1Y2Nlc3NvcgorICogY2xhdXNlcyBpbiB0aGUgRkFSIG9yIHRoZSBET0Qgb3IgTkFTQSBGQVIgU3VwcGxlbWVudC4KKyAqIFVucHVibGlzaGVkLS0gcmlnaHRzIHJlc2VydmVkIHVuZGVyIHRoZSBjb3B5cmlnaHQgbGF3cyBvZiB0aGUKKyAqIFVuaXRlZCBTdGF0ZXMuICBDb250cmFjdG9yL21hbnVmYWN0dXJlciBpcyBTaWxpY29uIEdyYXBoaWNzLAorICogSW5jLiwgMjAxMSBOLiAgU2hvcmVsaW5lIEJsdmQuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDAzOS03MzExLgorICoKKyAqIE9wZW5HTChUTSkgaXMgYSB0cmFkZW1hcmsgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjZGVmaW5lIFJBRCA1Ny4yOTUKKyNkZWZpbmUgUlJBRCAwLjAxNzQ1CisKKyNkZWZpbmUgTlVNX1NIQVJLUyA0CisjZGVmaW5lIFNIQVJLU0laRSA2MDAwCisjZGVmaW5lIFNIQVJLU1BFRUQgMTAwLjAKKworI2RlZmluZSBXSEFMRVNQRUVEIDI1MC4wCisKK3R5cGVkZWYgc3RydWN0IF9maXNoUmVjIHsKKyAgICBmbG9hdCB4LCB5LCB6LCBwaGksIHRoZXRhLCBwc2ksIHY7CisgICAgZmxvYXQgeHQsIHl0LCB6dDsKKyAgICBmbG9hdCBodGFpbCwgdnRhaWw7CisgICAgZmxvYXQgZHRoZXRhOworICAgIGludCBzcHVydCwgYXR0YWNrOworfSBmaXNoUmVjOworCitleHRlcm4gZmlzaFJlYyBzaGFya3NbTlVNX1NIQVJLU107CitleHRlcm4gZmlzaFJlYyBtb21XaGFsZTsKK2V4dGVybiBmaXNoUmVjIGJhYnlXaGFsZTsKK2V4dGVybiBmaXNoUmVjIGRvbHBoOworCitleHRlcm4gdm9pZCBGaXNoVHJhbnNmb3JtKGZpc2hSZWMgKik7CitleHRlcm4gdm9pZCBXaGFsZVBpbG90KGZpc2hSZWMgKik7CitleHRlcm4gdm9pZCBTaGFya1BpbG90KGZpc2hSZWMgKik7CitleHRlcm4gdm9pZCBTaGFya01pc3MoaW50KTsKK2V4dGVybiB2b2lkIERyYXdXaGFsZShmaXNoUmVjICopOworZXh0ZXJuIHZvaWQgRHJhd1NoYXJrKGZpc2hSZWMgKik7CitleHRlcm4gdm9pZCBEcmF3RG9scGhpbihmaXNoUmVjICopOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL2RvbHBoaW4uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9kb2xwaGluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiYTNiYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9kb2xwaGluLmMKQEAgLTAsMCArMSwxOTM0IEBACisvKioKKyAqIChjKSBDb3B5cmlnaHQgMTk5MywgMTk5NCwgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQUxMIFJJR0hUUyBSRVNFUlZFRAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZQorICogYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKKyAqIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSEUgTUFURVJJQUwgRU1CT0RJRUQgT04gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBUTyBZT1UgIkFTLUlTIgorICogQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLAorICogSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCisgKiBHUkFQSElDUywgSU5DLiAgQkUgTElBQkxFIFRPIFlPVSBPUiBBTllPTkUgRUxTRSBGT1IgQU5ZIERJUkVDVCwKKyAqIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKKyAqIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sCisgKiBMT1NTIE9GIFBST0ZJVCwgTE9TUyBPRiBVU0UsIFNBVklOR1MgT1IgUkVWRU5VRSwgT1IgVEhFIENMQUlNUyBPRgorICogVEhJUkQgUEFSVElFUywgV0hFVEhFUiBPUiBOT1QgU0lMSUNPTiBHUkFQSElDUywgSU5DLiAgSEFTIEJFRU4KKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggTE9TUywgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogUE9TU0VTU0lPTiwgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cworICogVXNlLCBkdXBsaWNhdGlvbiwgb3IgZGlzY2xvc3VyZSBieSB0aGUgR292ZXJubWVudCBpcyBzdWJqZWN0IHRvCisgKiByZXN0cmljdGlvbnMgc2V0IGZvcnRoIGluIEZBUiA1Mi4yMjcuMTkoYykoMikgb3Igc3VicGFyYWdyYXBoCisgKiAoYykoMSkoaWkpIG9mIHRoZSBSaWdodHMgaW4gVGVjaG5pY2FsIERhdGEgYW5kIENvbXB1dGVyIFNvZnR3YXJlCisgKiBjbGF1c2UgYXQgREZBUlMgMjUyLjIyNy03MDEzIGFuZC9vciBpbiBzaW1pbGFyIG9yIHN1Y2Nlc3NvcgorICogY2xhdXNlcyBpbiB0aGUgRkFSIG9yIHRoZSBET0Qgb3IgTkFTQSBGQVIgU3VwcGxlbWVudC4KKyAqIFVucHVibGlzaGVkLS0gcmlnaHRzIHJlc2VydmVkIHVuZGVyIHRoZSBjb3B5cmlnaHQgbGF3cyBvZiB0aGUKKyAqIFVuaXRlZCBTdGF0ZXMuICBDb250cmFjdG9yL21hbnVmYWN0dXJlciBpcyBTaWxpY29uIEdyYXBoaWNzLAorICogSW5jLiwgMjAxMSBOLiAgU2hvcmVsaW5lIEJsdmQuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDAzOS03MzExLgorICoKKyAqIE9wZW5HTChUTSkgaXMgYSB0cmFkZW1hcmsgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPEdMVVQvZ2x1dC5oPgorI2luY2x1ZGUgImF0bGFudGlzLmgiCisvKiAqSU5ERU5ULU9GRiogKi8KK3N0YXRpYyBmbG9hdCBOMDAxWzNdID0gey0wLjAwNTkzNyAsLTAuMTAxOTk4ICwtMC45OTQ3Njd9Oworc3RhdGljIGZsb2F0IE4wMDJbM10gPSB7MC45MzY3ODAgLC0wLjIwMDgwMyAsMC4yODY1Njl9Oworc3RhdGljIGZsb2F0IE4wMDNbM10gPSB7LTAuMjMzMDYyICwwLjk3MjA1OCAsMC4wMjgwMDd9Oworc3RhdGljIGZsb2F0IE4wMDVbM10gPSB7MC44OTgxMTcgLDAuMzYwMTcxICwwLjI1MjMxNX07CitzdGF0aWMgZmxvYXQgTjAwNlszXSA9IHstMC45MTU0MzcgLDAuMzQ4NDU2ICwwLjIwMTM3OH07CitzdGF0aWMgZmxvYXQgTjAwN1szXSA9IHswLjYwMjI2MyAsLTAuNzc3NTI3ICwwLjE4MDkyMH07CitzdGF0aWMgZmxvYXQgTjAwOFszXSA9IHstMC45MDY5MTIgLC0wLjQxMjAxNSAsMC4wODgwNjF9Oworc3RhdGljIGZsb2F0IE4wMTJbM10gPSB7MC44ODQ0MDggLC0wLjQyOTQxNyAsLTAuMTgyODIxfTsKK3N0YXRpYyBmbG9hdCBOMDEzWzNdID0gezAuOTIxMTIxICwwLjMxMTA4NCAsLTAuMjM0MDE2fTsKK3N0YXRpYyBmbG9hdCBOMDE0WzNdID0gezAuMzgyNjM1ICwwLjg3Nzg4MiAsLTAuMjg3OTQ4fTsKK3N0YXRpYyBmbG9hdCBOMDE1WzNdID0gey0wLjM4MDA0NiAsMC44ODgxNjYgLC0wLjI1ODMxNn07CitzdGF0aWMgZmxvYXQgTjAxNlszXSA9IHstMC44OTE1MTUgLDAuMzkyMjM4ICwtMC4yMjY2MDd9Oworc3RhdGljIGZsb2F0IE4wMTdbM10gPSB7LTAuOTAxNDE5ICwtMC4zODIwMDIgLC0wLjIwMzc2M307CitzdGF0aWMgZmxvYXQgTjAxOFszXSA9IHstMC4zNjcyMjUgLC0wLjkxMTA5MSAsLTAuMTg3MjQzfTsKK3N0YXRpYyBmbG9hdCBOMDE5WzNdID0gezAuMzM5NTM5ICwtMC45MjQ4NDYgLC0wLjE3MTM4OH07CitzdGF0aWMgZmxvYXQgTjAyMFszXSA9IHswLjkxNDcwNiAsLTAuMzc4NjE3ICwtMC4xNDEyOTB9Oworc3RhdGljIGZsb2F0IE4wMjFbM10gPSB7MC45NTA2NjIgLDAuMjYyNzEzICwtMC4xNjQ5OTR9Oworc3RhdGljIGZsb2F0IE4wMjJbM10gPSB7MC41NDYzNTkgLDAuODAxNDYwICwtMC4yNDMyMTh9Oworc3RhdGljIGZsb2F0IE4wMjNbM10gPSB7LTAuMzE1Nzk2ICwwLjkxNzA2OCAsLTAuMjQzNDMxfTsKK3N0YXRpYyBmbG9hdCBOMDI0WzNdID0gey0wLjgyNTY4NyAsMC41MzIyNzcgLC0wLjE4Njg3NX07CitzdGF0aWMgZmxvYXQgTjAyNVszXSA9IHstMC45NzQ3NjMgLC0wLjE1NTIzMiAsLTAuMTYwNDM1fTsKK3N0YXRpYyBmbG9hdCBOMDI2WzNdID0gey0wLjU2MDU5NiAsLTAuODE2NjU4ICwtMC4xMzcxMTl9Oworc3RhdGljIGZsb2F0IE4wMjdbM10gPSB7MC4zODAyMTAgLC0wLjkxMDgxNyAsLTAuMTYwNzg2fTsKK3N0YXRpYyBmbG9hdCBOMDI4WzNdID0gezAuOTIzNzcyICwtMC4zNTgzMjIgLC0wLjEzNTA5M307CitzdGF0aWMgZmxvYXQgTjAyOVszXSA9IHswLjk1MTIwMiAsMC4yNzUwNTMgLC0wLjEzOTg1OX07CitzdGF0aWMgZmxvYXQgTjAzMFszXSA9IHswLjY4NjA5OSAsMC43MDI1NDggLC0wLjE4ODkzMn07CitzdGF0aWMgZmxvYXQgTjAzMVszXSA9IHstMC41MjE4NjUgLDAuODI2NzE5ICwtMC4yMTAyMjB9Oworc3RhdGljIGZsb2F0IE4wMzJbM10gPSB7LTAuOTIzODIwICwwLjM0NjczOSAsLTAuMTYyMjU4fTsKK3N0YXRpYyBmbG9hdCBOMDMzWzNdID0gey0wLjkwMjA5NSAsLTAuNDA5OTk1ICwtMC4xMzQ2NDZ9Oworc3RhdGljIGZsb2F0IE4wMzRbM10gPSB7LTAuNTA5MTE1ICwtMC44NDg0OTggLC0wLjE0NDQwNH07CitzdGF0aWMgZmxvYXQgTjAzNVszXSA9IHswLjQ1NjQ2OSAsLTAuODgwMjkzICwtMC4xMjkzMDV9Oworc3RhdGljIGZsb2F0IE4wMzZbM10gPSB7MC44NzM0MDEgLC0wLjQ3NTQ4OSAsLTAuMTA1MjY2fTsKK3N0YXRpYyBmbG9hdCBOMDM3WzNdID0gezAuOTcwODI1ICwwLjE3OTg2MSAsLTAuMTU4NTg0fTsKK3N0YXRpYyBmbG9hdCBOMDM4WzNdID0gezAuNjc1NjA5ICwwLjcxNDE4NyAsLTAuMTgzMDA0fTsKK3N0YXRpYyBmbG9hdCBOMDM5WzNdID0gey0wLjUyMzU3NCAsMC44MzAyMTIgLC0wLjE5MTM2MH07CitzdGF0aWMgZmxvYXQgTjA0MFszXSA9IHstMC45NTg4OTUgLDAuMjMwODA4ICwtMC4xNjUwNzF9Oworc3RhdGljIGZsb2F0IE4wNDFbM10gPSB7LTAuOTE4Mjg1ICwtMC4zNzY4MDMgLC0wLjEyMTU0Mn07CitzdGF0aWMgZmxvYXQgTjA0MlszXSA9IHstMC42MjI0NjcgLC0wLjc3NDE2NyAsLTAuMTE0ODg4fTsKK3N0YXRpYyBmbG9hdCBOMDQzWzNdID0gezAuNDA0NDk3ICwtMC45MDg4MDcgLC0wLjEwMjIzMX07CitzdGF0aWMgZmxvYXQgTjA0NFszXSA9IHswLjkzMDUzOCAsLTAuMzY1MTU1ICwtMC4wMjc1ODh9Oworc3RhdGljIGZsb2F0IE4wNDVbM10gPSB7MC45MjE5MjAgLDAuMzc0MTU3ICwtMC4xMDAzNDV9Oworc3RhdGljIGZsb2F0IE4wNDZbM10gPSB7MC41MDczNDYgLDAuODYwNzM5ICwwLjA0MTU2Mn07CitzdGF0aWMgZmxvYXQgTjA0N1szXSA9IHstMC4zOTQ2NDYgLDAuOTE4ODE1ICwtMC4wMDU3MzB9Oworc3RhdGljIGZsb2F0IE4wNDhbM10gPSB7LTAuOTI1NDExICwwLjM3MzAyNCAsLTAuMDY2ODM3fTsKK3N0YXRpYyBmbG9hdCBOMDQ5WzNdID0gey0wLjk0NTMzNyAsLTAuMzIyMzA5ICwtMC4wNDk1NTF9Oworc3RhdGljIGZsb2F0IE4wNTBbM10gPSB7LTAuNjYwNDM3ICwtMC43NTA1NTcgLC0wLjAyMjA3Mn07CitzdGF0aWMgZmxvYXQgTjA1MVszXSA9IHswLjQ4ODgzNSAsLTAuODcxOTUwICwtMC4wMjcyNjF9Oworc3RhdGljIGZsb2F0IE4wNTJbM10gPSB7MC45MDI1OTkgLC0wLjQyMTM5NyAsMC4wODc5Njl9Oworc3RhdGljIGZsb2F0IE4wNTNbM10gPSB7MC45Mzg2MzYgLDAuMzIyNjA2ICwwLjEyMjAyMH07CitzdGF0aWMgZmxvYXQgTjA1NFszXSA9IHswLjQ4NDYwNSAsMC44NzEwNzggLDAuMDc5ODc4fTsKK3N0YXRpYyBmbG9hdCBOMDU1WzNdID0gey0wLjM1MzYwNyAsMC45MzE1NTkgLDAuMDg0NjE5fTsKK3N0YXRpYyBmbG9hdCBOMDU2WzNdID0gey0wLjg2Nzc1OSAsMC40Nzg1NjQgLDAuMTM0MDU0fTsKK3N0YXRpYyBmbG9hdCBOMDU3WzNdID0gey0wLjk1MTU4MyAsLTAuMjk2MDMwICwwLjA4Mjc5NH07CitzdGF0aWMgZmxvYXQgTjA1OFszXSA9IHstMC42NzIzNTUgLC0wLjczMDIwOSAsMC4xMjEzODR9Oworc3RhdGljIGZsb2F0IE4wNTlbM10gPSB7MC41MjgzMzYgLC0wLjg0MjQ1MiAsMC4xMDU1MjV9Oworc3RhdGljIGZsb2F0IE4wNjBbM10gPSB7MC43ODY5MTMgLC0wLjU2NDc2MCAsMC4yNDg2Mjd9Oworc3RhdGljIGZsb2F0IE4wNjJbM10gPSB7MC42MjIwOTggLDAuNzY1MjMwICwwLjE2NTU4NH07CitzdGF0aWMgZmxvYXQgTjA2M1szXSA9IHstMC42MzE3MTEgLDAuNzY3ODE2ICwwLjEwNjc3M307CitzdGF0aWMgZmxvYXQgTjA2NFszXSA9IHstMC42ODc4ODYgLDAuNjA2MzUxICwwLjM5ODkzOH07CitzdGF0aWMgZmxvYXQgTjA2NVszXSA9IHstMC45NDYzMjcgLC0wLjI4MTYyMyAsMC4xNTg1OTh9Oworc3RhdGljIGZsb2F0IE4wNjZbM10gPSB7LTAuNTA5NTQ5ICwtMC44NjA0MzcgLDAuMDAyNzc2fTsKK3N0YXRpYyBmbG9hdCBOMDY3WzNdID0gezAuNDYyNTk0ICwtMC44NzY2OTIgLDAuMTMxOTc3fTsKK3N0YXRpYyBmbG9hdCBOMDcxWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNzdbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wNzhbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wNzlbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wODBbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wODFbM10gPSB7LTAuNTcxMTk3ICwwLjgxNjE3MyAsMC4wODcxNTJ9Oworc3RhdGljIGZsb2F0IE4wODJbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wODNbM10gPSB7LTAuNTcxMTk3ICwwLjgxNjE3MyAsMC4wODcxNTJ9Oworc3RhdGljIGZsb2F0IE4wODRbM10gPSB7LTAuNTcxMTk3ICwwLjgxNjE3MyAsMC4wODcxNTJ9Oworc3RhdGljIGZsb2F0IE4wODVbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wODZbM10gPSB7LTAuNTcxMTk3ICwwLjgxNjE3MyAsMC4wODcxNTJ9Oworc3RhdGljIGZsb2F0IE4wODdbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wODhbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wODlbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wOTBbM10gPSB7LTAuODgwNzcwICwwLjQ2MTQ0OCAsMC4xMDYzNTF9Oworc3RhdGljIGZsb2F0IE4wOTFbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5MlszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDkzWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTRbM10gPSB7MS4wMDAwMDAgLDAuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5NVszXSA9IHstMS4wMDAwMDAgLDAuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5N1szXSA9IHstMC42OTcyOTYgLDAuNzAyODgxICwwLjE0MDQ5MX07CitzdGF0aWMgZmxvYXQgTjA5OFszXSA9IHswLjkxODg2NCAsMC4zNDA4MjEgLDAuMTk4ODE5fTsKK3N0YXRpYyBmbG9hdCBOMDk5WzNdID0gey0wLjkzMjczNyAsMC4yMDExOTUgLDAuMjk5MjAyfTsKK3N0YXRpYyBmbG9hdCBOMTAwWzNdID0gezAuMDI5NTE3ICwwLjk4MTY3OSAsMC4xODgyNDR9Oworc3RhdGljIGZsb2F0IE4xMDJbM10gPSB7MC44MTM1MjEgLC0wLjIwNDkzNiAsMC41NDQyMjl9Oworc3RhdGljIGZsb2F0IE4xMTBbM10gPSB7LTAuNzgxNDgwICwtMC4zODQ3NzkgLDAuNDkxMTU1fTsKK3N0YXRpYyBmbG9hdCBOMTExWzNdID0gey0wLjcyMjI0MyAsMC4zODQ5MjcgLDAuNTc0NjI3fTsKK3N0YXRpYyBmbG9hdCBOMTEyWzNdID0gey0wLjc1MjI3OCAsMC41MDI2NzkgLDAuNDI1OTAxfTsKK3N0YXRpYyBmbG9hdCBOMTEzWzNdID0gezAuNTQ3MjU3ICwwLjM2NzkxMCAsMC43NTE3NjZ9Oworc3RhdGljIGZsb2F0IE4xMTRbM10gPSB7MC43MjU5NDkgLC0wLjIzMjU2OCAsMC42NDcyMzN9Oworc3RhdGljIGZsb2F0IE4xMTVbM10gPSB7LTAuNzQ3MTgyICwtMC42NjA3ODYgLDAuMDcxMjgwfTsKK3N0YXRpYyBmbG9hdCBOMTE2WzNdID0gezAuOTMxNTE5ICwwLjIwMDc0OCAsMC4zMDMyNzB9Oworc3RhdGljIGZsb2F0IE4xMTdbM10gPSB7LTAuODI4OTI4ICwwLjMxMzc1NyAsMC40NjMwNzF9Oworc3RhdGljIGZsb2F0IE4xMThbM10gPSB7MC45MDI1NTQgLC0wLjM3MDk2NyAsMC4yMTg1ODd9Oworc3RhdGljIGZsb2F0IE4xMTlbM10gPSB7LTAuODc5MjU3ICwtMC40NDE4NTEgLDAuMTc3OTczfTsKK3N0YXRpYyBmbG9hdCBOMTIwWzNdID0gezAuNjQyMzI3ICwwLjYxMTkwMSAsMC40NjE1MTJ9Oworc3RhdGljIGZsb2F0IE4xMjFbM10gPSB7MC45NjQ4MTcgLC0wLjIwMjMyMiAsMC4xNjc5MTB9Oworc3RhdGljIGZsb2F0IE4xMjJbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgUDAwMVszXSA9IHs1LjY4LCAtMzAwLjk1LCAxMzI0LjcwfTsKK3N0YXRpYyBmbG9hdCBQMDAyWzNdID0gezMzOC42OSwgLTIxOS42MywgOTY3Ny4wM307CitzdGF0aWMgZmxvYXQgUDAwM1szXSA9IHsxMi4xOCwgNDc0LjU5LCA5MTM4LjE0fTsKK3N0YXRpYyBmbG9hdCBQMDA1WzNdID0gezQ4Ny41MSwgMTk4LjA1LCA5MzUwLjc4fTsKK3N0YXRpYyBmbG9hdCBQMDA2WzNdID0gey00NTcuNjEsIDY4Ljc0LCA5NDI3Ljg1fTsKK3N0YXRpYyBmbG9hdCBQMDA3WzNdID0gezE1Ni41MiwgLTI2Ni43MiwgMTAzMTEuNjh9Oworc3RhdGljIGZsb2F0IFAwMDhbM10gPSB7LTE4NS41NiwgLTI2Ni41MSwgMTAzMTAuNDd9Oworc3RhdGljIGZsb2F0IFAwMDlbM10gPSB7MTI0LjM5LCAtMjYxLjQ2LCAxOTQyLjM0fTsKK3N0YXRpYyBmbG9hdCBQMDEwWzNdID0gey0xMzAuMDUsIC0yNjEuNDYsIDE5NDYuMDN9Oworc3RhdGljIGZsb2F0IFAwMTFbM10gPSB7MTQxLjA3LCAtMzIwLjExLCAxMjM5LjM4fTsKK3N0YXRpYyBmbG9hdCBQMDEyWzNdID0gezE1Ni40OCwgLTM2MC4xMiwgMjA3My40MX07CitzdGF0aWMgZmxvYXQgUDAxM1szXSA9IHsxNjIuMDAsIC0xNzUuODgsIDIwNjQuNDR9Oworc3RhdGljIGZsb2F0IFAwMTRbM10gPSB7ODguMTYsIC04Ny43MiwgMjA2NC4wMn07CitzdGF0aWMgZmxvYXQgUDAxNVszXSA9IHstNjUuMjEsIC05Ni4xMywgMjA2NC4wMn07CitzdGF0aWMgZmxvYXQgUDAxNlszXSA9IHstMTU2LjQ4LCAtMTgwLjk2LCAyMDY0LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDE3WzNdID0gey0xNjIuMDAsIC0zNjguOTMsIDIwODIuMzl9Oworc3RhdGljIGZsb2F0IFAwMThbM10gPSB7LTg4LjE2LCAtNDM5LjIyLCAyMDgyLjM5fTsKK3N0YXRpYyBmbG9hdCBQMDE5WzNdID0gezY1LjIxLCAtNDQwLjMyLCAyMDgzLjM5fTsKK3N0YXRpYyBmbG9hdCBQMDIwWzNdID0gezI0Ni44NywgLTM1Ni4wMiwgMjU3Ni45NX07CitzdGF0aWMgZmxvYXQgUDAyMVszXSA9IHsyNTMuMTcsIC0xMTEuMTUsIDI1NjcuMTV9Oworc3RhdGljIGZsb2F0IFAwMjJbM10gPSB7MTMyLjM0LCA1MS40MSwgMjU1OS44NH07CitzdGF0aWMgZmxvYXQgUDAyM1szXSA9IHstOTcuODgsIDQwLjQ0LCAyNTY3LjE1fTsKK3N0YXRpYyBmbG9hdCBQMDI0WzNdID0gey0yMjIuOTcsIC0xMTcuNDksIDI1NjcuMTV9Oworc3RhdGljIGZsb2F0IFAwMjVbM10gPSB7LTI1Mi4yMiwgLTM3MS41MywgMjU2OS45Mn07CitzdGF0aWMgZmxvYXQgUDAyNlszXSA9IHstMTA4LjQ0LCAtNTE4LjE5LCAyNTg2Ljc1fTsKK3N0YXRpYyBmbG9hdCBQMDI3WzNdID0gezk3Ljg4LCAtNTI0Ljc5LCAyNTg2Ljc1fTsKK3N0YXRpYyBmbG9hdCBQMDI4WzNdID0gezM3MC4wMywgLTQyMS4xOSwgMzQxOS43MH07CitzdGF0aWMgZmxvYXQgUDAyOVszXSA9IHszNTEuMTUsIC0xNi45OCwgMzQyMy4xN307CitzdGF0aWMgZmxvYXQgUDAzMFszXSA9IHsyMDAuNjYsIDI0OC40NiwgMzQzMC4zN307CitzdGF0aWMgZmxvYXQgUDAzMVszXSA9IHstMTQ4LjQyLCAyMzUuMDIsIDM0MTcuOTF9Oworc3RhdGljIGZsb2F0IFAwMzJbM10gPSB7LTM2MC4yMSwgLTMwLjI3LCAzNDE2Ljg0fTsKK3N0YXRpYyBmbG9hdCBQMDMzWzNdID0gey0zNTcuOTAsIC00MTQuODksIDM0MDcuMDR9Oworc3RhdGljIGZsb2F0IFAwMzRbM10gPSB7LTE0OC44OCwgLTYzMS4zNSwgMzQwOS45MH07CitzdGF0aWMgZmxvYXQgUDAzNVszXSA9IHsxNTYuMzgsIC02MzIuNTksIDM0MTkuNzB9Oworc3RhdGljIGZsb2F0IFAwMzZbM10gPSB7NDYyLjYxLCAtNDY5LjIxLCA0NDMxLjUxfTsKK3N0YXRpYyBmbG9hdCBQMDM3WzNdID0gezQ2Ni42MCwgMTAyLjI1LCA0NDM0Ljk4fTsKK3N0YXRpYyBmbG9hdCBQMDM4WzNdID0gezI0My4wNSwgNDc0LjM0LCA0NTYyLjAyfTsKK3N0YXRpYyBmbG9hdCBQMDM5WzNdID0gey0xOTEuMjMsIDQ3NC40MCwgNDU1NC40Mn07CitzdGF0aWMgZmxvYXQgUDA0MFszXSA9IHstNDc2LjEyLCAxMTEuMDUsIDQ0NTEuMTF9Oworc3RhdGljIGZsb2F0IFAwNDFbM10gPSB7LTQ3My4zNiwgLTQ3MC43NCwgNDQ0NC43OH07CitzdGF0aWMgZmxvYXQgUDA0MlszXSA9IHstMjY2Ljk1LCAtNzQ4LjQxLCA0NDQ3Ljc4fTsKK3N0YXRpYyBmbG9hdCBQMDQzWzNdID0gezIxMS4xNCwgLTc0OS45MSwgNDQyOS43M307CitzdGF0aWMgZmxvYXQgUDA0NFszXSA9IHs2ODAuNTcsIC0zNzAuMjcsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNDVbM10gPSB7ODM0LjAxLCAzNjMuMDksIDYzNjAuNjN9Oworc3RhdGljIGZsb2F0IFAwNDZbM10gPSB7MzcxLjI5LCA4MDQuNTEsIDY0ODYuMjZ9Oworc3RhdGljIGZsb2F0IFAwNDdbM10gPSB7LTI5MS40MywgNzk3LjIyLCA2NDk0LjI4fTsKK3N0YXRpYyBmbG9hdCBQMDQ4WzNdID0gey03ODQuMTMsIDM3MC43NSwgNjM3OC4wMX07CitzdGF0aWMgZmxvYXQgUDA0OVszXSA9IHstNzQzLjI5LCAtMzI1LjgyLCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDUwWzNdID0gey0zODMuMjQsIC04MDQuNzcsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNTFbM10gPSB7MjgzLjQ3LCAtODQ2LjA5LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDAwMVszXSA9IHs1LjY4LCAtMzAwLjk1LCAxMzI0LjcwfTsKK3N0YXRpYyBmbG9hdCBpUDAwOVszXSA9IHsxMjQuMzksIC0yNjEuNDYsIDE5NDIuMzR9Oworc3RhdGljIGZsb2F0IGlQMDEwWzNdID0gey0xMzAuMDUsIC0yNjEuNDYsIDE5NDYuMDN9Oworc3RhdGljIGZsb2F0IGlQMDExWzNdID0gezE0MS4wNywgLTMyMC4xMSwgMTIzOS4zOH07CitzdGF0aWMgZmxvYXQgaVAwMTJbM10gPSB7MTU2LjQ4LCAtMzYwLjEyLCAyMDczLjQxfTsKK3N0YXRpYyBmbG9hdCBpUDAxM1szXSA9IHsxNjIuMDAsIC0xNzUuODgsIDIwNjQuNDR9Oworc3RhdGljIGZsb2F0IGlQMDE0WzNdID0gezg4LjE2LCAtODcuNzIsIDIwNjQuMDJ9Oworc3RhdGljIGZsb2F0IGlQMDE1WzNdID0gey02NS4yMSwgLTk2LjEzLCAyMDY0LjAyfTsKK3N0YXRpYyBmbG9hdCBpUDAxNlszXSA9IHstMTU2LjQ4LCAtMTgwLjk2LCAyMDY0LjQ0fTsKK3N0YXRpYyBmbG9hdCBpUDAxN1szXSA9IHstMTYyLjAwLCAtMzY4LjkzLCAyMDgyLjM5fTsKK3N0YXRpYyBmbG9hdCBpUDAxOFszXSA9IHstODguMTYsIC00MzkuMjIsIDIwODIuMzl9Oworc3RhdGljIGZsb2F0IGlQMDE5WzNdID0gezY1LjIxLCAtNDQwLjMyLCAyMDgzLjM5fTsKK3N0YXRpYyBmbG9hdCBpUDAyMFszXSA9IHsyNDYuODcsIC0zNTYuMDIsIDI1NzYuOTV9Oworc3RhdGljIGZsb2F0IGlQMDIxWzNdID0gezI1My4xNywgLTExMS4xNSwgMjU2Ny4xNX07CitzdGF0aWMgZmxvYXQgaVAwMjJbM10gPSB7MTMyLjM0LCA1MS40MSwgMjU1OS44NH07CitzdGF0aWMgZmxvYXQgaVAwMjNbM10gPSB7LTk3Ljg4LCA0MC40NCwgMjU2Ny4xNX07CitzdGF0aWMgZmxvYXQgaVAwMjRbM10gPSB7LTIyMi45NywgLTExNy40OSwgMjU2Ny4xNX07CitzdGF0aWMgZmxvYXQgaVAwMjVbM10gPSB7LTI1Mi4yMiwgLTM3MS41MywgMjU2OS45Mn07CitzdGF0aWMgZmxvYXQgaVAwMjZbM10gPSB7LTEwOC40NCwgLTUxOC4xOSwgMjU4Ni43NX07CitzdGF0aWMgZmxvYXQgaVAwMjdbM10gPSB7OTcuODgsIC01MjQuNzksIDI1ODYuNzV9Oworc3RhdGljIGZsb2F0IGlQMDI4WzNdID0gezM3MC4wMywgLTQyMS4xOSwgMzQxOS43MH07CitzdGF0aWMgZmxvYXQgaVAwMjlbM10gPSB7MzUxLjE1LCAtMTYuOTgsIDM0MjMuMTd9Oworc3RhdGljIGZsb2F0IGlQMDMwWzNdID0gezIwMC42NiwgMjQ4LjQ2LCAzNDMwLjM3fTsKK3N0YXRpYyBmbG9hdCBpUDAzMVszXSA9IHstMTQ4LjQyLCAyMzUuMDIsIDM0MTcuOTF9Oworc3RhdGljIGZsb2F0IGlQMDMyWzNdID0gey0zNjAuMjEsIC0zMC4yNywgMzQxNi44NH07CitzdGF0aWMgZmxvYXQgaVAwMzNbM10gPSB7LTM1Ny45MCwgLTQxNC44OSwgMzQwNy4wNH07CitzdGF0aWMgZmxvYXQgaVAwMzRbM10gPSB7LTE0OC44OCwgLTYzMS4zNSwgMzQwOS45MH07CitzdGF0aWMgZmxvYXQgaVAwMzVbM10gPSB7MTU2LjM4LCAtNjMyLjU5LCAzNDE5LjcwfTsKK3N0YXRpYyBmbG9hdCBpUDAzNlszXSA9IHs0NjIuNjEsIC00NjkuMjEsIDQ0MzEuNTF9Oworc3RhdGljIGZsb2F0IGlQMDM3WzNdID0gezQ2Ni42MCwgMTAyLjI1LCA0NDM0Ljk4fTsKK3N0YXRpYyBmbG9hdCBpUDAzOFszXSA9IHsyNDMuMDUsIDQ3NC4zNCwgNDU2Mi4wMn07CitzdGF0aWMgZmxvYXQgaVAwMzlbM10gPSB7LTE5MS4yMywgNDc0LjQwLCA0NTU0LjQyfTsKK3N0YXRpYyBmbG9hdCBpUDA0MFszXSA9IHstNDc2LjEyLCAxMTEuMDUsIDQ0NTEuMTF9Oworc3RhdGljIGZsb2F0IGlQMDQxWzNdID0gey00NzMuMzYsIC00NzAuNzQsIDQ0NDQuNzh9Oworc3RhdGljIGZsb2F0IGlQMDQyWzNdID0gey0yNjYuOTUsIC03NDguNDEsIDQ0NDcuNzh9Oworc3RhdGljIGZsb2F0IGlQMDQzWzNdID0gezIxMS4xNCwgLTc0OS45MSwgNDQyOS43M307CitzdGF0aWMgZmxvYXQgaVAwNDRbM10gPSB7NjgwLjU3LCAtMzcwLjI3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA0NVszXSA9IHs4MzQuMDEsIDM2My4wOSwgNjM2MC42M307CitzdGF0aWMgZmxvYXQgaVAwNDZbM10gPSB7MzcxLjI5LCA4MDQuNTEsIDY0ODYuMjZ9Oworc3RhdGljIGZsb2F0IGlQMDQ3WzNdID0gey0yOTEuNDMsIDc5Ny4yMiwgNjQ5NC4yOH07CitzdGF0aWMgZmxvYXQgaVAwNDhbM10gPSB7LTc4NC4xMywgMzcwLjc1LCA2Mzc4LjAxfTsKK3N0YXRpYyBmbG9hdCBpUDA0OVszXSA9IHstNzQzLjI5LCAtMzI1LjgyLCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA1MFszXSA9IHstMzgzLjI0LCAtODA0Ljc3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA1MVszXSA9IHsyODMuNDcsIC04NDYuMDksIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNTJbM10gPSB7NTk5LjA5LCAtMzAwLjE1LCA3ODk0LjAzfTsKK3N0YXRpYyBmbG9hdCBQMDUzWzNdID0gezczNS40OCwgMzA2LjI2LCA3OTExLjkyfTsKK3N0YXRpYyBmbG9hdCBQMDU0WzNdID0gezI0Ni4yMiwgNTU4LjUzLCA4NDYwLjUwfTsKK3N0YXRpYyBmbG9hdCBQMDU1WzNdID0gey0yMzAuNDEsIDU1OS44NCwgODQ3My4yM307CitzdGF0aWMgZmxvYXQgUDA1NlszXSA9IHstNjk4LjY2LCAzMjAuODMsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNTdbM10gPSB7LTY0My4yOSwgLTI5OS4xNiwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1OFszXSA9IHstMzQxLjQ3LCAtNzE5LjMwLCA3OTAyLjU5fTsKK3N0YXRpYyBmbG9hdCBQMDU5WzNdID0gezI1Mi41NywgLTc1Ni4xMiwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA2MFszXSA9IHs0NTguMzksIC0yNjUuMzEsIDkzNTUuNDR9Oworc3RhdGljIGZsb2F0IFAwNjJbM10gPSB7MjI0LjA0LCAzMzguNzUsIDk0NTAuMzB9Oworc3RhdGljIGZsb2F0IFAwNjNbM10gPSB7LTE2NS43MSwgMzQxLjA0LCA5NDYyLjM1fTsKK3N0YXRpYyBmbG9hdCBQMDY0WzNdID0gey0yOTguMTEsIDExMC4xMywgMTAxODAuMzd9Oworc3RhdGljIGZsb2F0IFAwNjVbM10gPSB7LTQ3My45OSwgLTIxOS43MSwgOTM1NS40NH07CitzdGF0aWMgZmxvYXQgUDA2NlszXSA9IHstMjExLjk3LCAtNDc5Ljg3LCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDY3WzNdID0gezE5Mi44NiwgLTQ5MS40NSwgOTM0OC43M307CitzdGF0aWMgZmxvYXQgUDA2OFszXSA9IHstMTM2LjI5LCAtMzE5Ljg0LCAxMjI4LjczfTsKK3N0YXRpYyBmbG9hdCBQMDY5WzNdID0gezExMTEuMTcsIC0zMTQuMTQsIDEzMTQuMTl9Oworc3RhdGljIGZsb2F0IFAwNzBbM10gPSB7LTExNjcuMzQsIC0zMjEuNjEsIDEzMTkuNDV9Oworc3RhdGljIGZsb2F0IFAwNzFbM10gPSB7MTQwNC44NiwgLTMwNi42NiwgMTIzNS40NX07CitzdGF0aWMgZmxvYXQgUDA3MlszXSA9IHstMTQwOS43MywgLTMxNC4xNCwgMTI0Ny42Nn07CitzdGF0aWMgZmxvYXQgUDA3M1szXSA9IHsxMjU0LjAxLCAtMjk2Ljg3LCAxNTQ0LjU4fTsKK3N0YXRpYyBmbG9hdCBQMDc0WzNdID0gey0xMjYyLjA5LCAtMjkxLjcwLCAxNTA0LjI2fTsKK3N0YXRpYyBmbG9hdCBQMDc1WzNdID0gezk2NS43MSwgLTI2OS4yNiwgMTc0Mi42NX07CitzdGF0aWMgZmxvYXQgUDA3NlszXSA9IHstOTAwLjk3LCAtMjc2Ljc0LCAxNzI2LjA3fTsKK3N0YXRpYyBmbG9hdCBpUDA2OFszXSA9IHstMTM2LjI5LCAtMzE5Ljg0LCAxMjI4LjczfTsKK3N0YXRpYyBmbG9hdCBpUDA2OVszXSA9IHsxMTExLjE3LCAtMzE0LjE0LCAxMzE0LjE5fTsKK3N0YXRpYyBmbG9hdCBpUDA3MFszXSA9IHstMTE2Ny4zNCwgLTMyMS42MSwgMTMxOS40NX07CitzdGF0aWMgZmxvYXQgaVAwNzFbM10gPSB7MTQwNC44NiwgLTMwNi42NiwgMTIzNS40NX07CitzdGF0aWMgZmxvYXQgaVAwNzJbM10gPSB7LTE0MDkuNzMsIC0zMTQuMTQsIDEyNDcuNjZ9Oworc3RhdGljIGZsb2F0IGlQMDczWzNdID0gezEyNTQuMDEsIC0yOTYuODcsIDE1NDQuNTh9Oworc3RhdGljIGZsb2F0IGlQMDc0WzNdID0gey0xMjYyLjA5LCAtMjkxLjcwLCAxNTA0LjI2fTsKK3N0YXRpYyBmbG9hdCBpUDA3NVszXSA9IHs5NjUuNzEsIC0yNjkuMjYsIDE3NDIuNjV9Oworc3RhdGljIGZsb2F0IGlQMDc2WzNdID0gey05MDAuOTcsIC0yNzYuNzQsIDE3MjYuMDd9Oworc3RhdGljIGZsb2F0IFAwNzdbM10gPSB7MTA1OC4wMCwgLTQ0OC44MSwgODE5NC42Nn07CitzdGF0aWMgZmxvYXQgUDA3OFszXSA9IHstMTAxNi41MSwgLTQ1Ni40MywgODE5MC42Mn07CitzdGF0aWMgZmxvYXQgUDA3OVszXSA9IHstMTUxNS45NiwgLTY3Ni40NSwgNzc1NC45M307CitzdGF0aWMgZmxvYXQgUDA4MFszXSA9IHsxODU2Ljc1LCAtODMwLjM0LCA3Mjk2LjU2fTsKK3N0YXRpYyBmbG9hdCBQMDgxWzNdID0gezE0NzIuMTYsIC00OTcuMzgsIDczOTkuNjh9Oworc3RhdGljIGZsb2F0IFAwODJbM10gPSB7LTE3NzUuMjYsIC04MjkuNTEsIDcyOTguNDZ9Oworc3RhdGljIGZsb2F0IFAwODNbM10gPSB7OTExLjA5LCAtMjUyLjUxLCA3NTEwLjk5fTsKK3N0YXRpYyBmbG9hdCBQMDg0WzNdID0gey0xNDUxLjk0LCAtNDk1LjYyLCA3Mzg0LjMwfTsKK3N0YXRpYyBmbG9hdCBQMDg1WzNdID0gezE1OTguNzUsIC02NjkuMjYsIDc3NjkuOTB9Oworc3RhdGljIGZsb2F0IFAwODZbM10gPSB7LTgzNi41MywgLTI1MC4wOCwgNzQ2My4yNX07CitzdGF0aWMgZmxvYXQgUDA4N1szXSA9IHs3MjIuODcsIC0xNTguMTgsIDgwMDYuNDF9Oworc3RhdGljIGZsb2F0IFAwODhbM10gPSB7LTY4OC44NiwgLTE2Mi4yOCwgNzk5My44OX07CitzdGF0aWMgZmxvYXQgUDA4OVszXSA9IHstNjI2LjkyLCAtMTg1LjMwLCA4MzY0Ljk4fTsKK3N0YXRpYyBmbG9hdCBQMDkwWzNdID0gezY0Ny43MiwgLTE4OS40NiwgODM1NC45OX07CitzdGF0aWMgZmxvYXQgUDA5MVszXSA9IHswLjAwLCA4MzUuMDEsIDU1NTUuNjJ9Oworc3RhdGljIGZsb2F0IFAwOTJbM10gPSB7MC4wMCwgMTM1MC4xOCwgNTIyMC44Nn07CitzdGF0aWMgZmxvYXQgUDA5M1szXSA9IHswLjAwLCAxNDIyLjk0LCA1Mjg1LjI3fTsKK3N0YXRpYyBmbG9hdCBQMDk0WzNdID0gezAuMDAsIDEyOTYuNzUsIDU2NTAuMTl9Oworc3RhdGljIGZsb2F0IFAwOTVbM10gPSB7MC4wMCwgNzk1LjYzLCA2NDkzLjg4fTsKK3N0YXRpYyBmbG9hdCBpUDA5MVszXSA9IHswLjAwLCA4MzUuMDEsIDU1NTUuNjJ9Oworc3RhdGljIGZsb2F0IGlQMDkyWzNdID0gezAuMDAsIDEzNTAuMTgsIDUyMjAuODZ9Oworc3RhdGljIGZsb2F0IGlQMDkzWzNdID0gezAuMDAsIDE0MjIuOTQsIDUyODUuMjd9Oworc3RhdGljIGZsb2F0IGlQMDk0WzNdID0gezAuMDAsIDEyOTYuNzUsIDU2NTAuMTl9Oworc3RhdGljIGZsb2F0IGlQMDk1WzNdID0gezAuMDAsIDc5NS42MywgNjQ5My44OH07CitzdGF0aWMgZmxvYXQgUDA5N1szXSA9IHstMTk0LjkxLCAtMzU3LjE0LCAxMDMxMy4zMn07CitzdGF0aWMgZmxvYXQgUDA5OFszXSA9IHsxMzUuMzUsIC0zNTcuNjYsIDEwMzA3Ljk0fTsKK3N0YXRpYyBmbG9hdCBpUDA5N1szXSA9IHstMTk0LjkxLCAtMzU3LjE0LCAxMDMxMy4zMn07CitzdGF0aWMgZmxvYXQgaVAwOThbM10gPSB7MTM1LjM1LCAtMzU3LjY2LCAxMDMwNy45NH07CitzdGF0aWMgZmxvYXQgUDA5OVszXSA9IHstMzgwLjUzLCAtMjIxLjE0LCA5Njc3Ljk4fTsKK3N0YXRpYyBmbG9hdCBQMTAwWzNdID0gezAuMDAsIDQxMi45OSwgOTYyOS4zM307CitzdGF0aWMgZmxvYXQgUDEwMlszXSA9IHs1OS41MSwgLTQxMi41NSwgMTA2NzcuNTh9Oworc3RhdGljIGZsb2F0IGlQMTAyWzNdID0gezU5LjUxLCAtNDEyLjU1LCAxMDY3Ny41OH07CitzdGF0aWMgZmxvYXQgUDEwM1szXSA9IHs2LjUwLCA0ODQuNzQsIDkwMDkuOTR9Oworc3RhdGljIGZsb2F0IFAxMDVbM10gPSB7LTQxLjg2LCA0NzYuNTEsIDkwNzguMTd9Oworc3RhdGljIGZsb2F0IFAxMDhbM10gPSB7NDkuMjAsIDQ3Ni44MywgOTA3OC4yNH07CitzdGF0aWMgZmxvYXQgUDExMFszXSA9IHstMTg3LjYyLCAtNDEwLjA0LCAxMDY3NC4xMn07CitzdGF0aWMgZmxvYXQgaVAxMTBbM10gPSB7LTE4Ny42MiwgLTQxMC4wNCwgMTA2NzQuMTJ9Oworc3RhdGljIGZsb2F0IFAxMTFbM10gPSB7LTE4NC4yNSwgLTMxOC43MCwgMTA3MjMuODh9Oworc3RhdGljIGZsb2F0IGlQMTExWzNdID0gey0xODQuMjUsIC0zMTguNzAsIDEwNzIzLjg4fTsKK3N0YXRpYyBmbG9hdCBQMTEyWzNdID0gey0xNzkuNjEsIC0xNDIuODEsIDEwNjcwLjI2fTsKK3N0YXRpYyBmbG9hdCBQMTEzWzNdID0gezU3LjQzLCAtMTQ3Ljk0LCAxMDY3NS4yNn07CitzdGF0aWMgZmxvYXQgUDExNFszXSA9IHs1NC4wNiwgLTIxOC45MCwgMTA3MTIuNDR9Oworc3RhdGljIGZsb2F0IFAxMTVbM10gPSB7LTE4Ni4zNSwgLTIxMi4wOSwgMTA3MTMuNzZ9Oworc3RhdGljIGZsb2F0IFAxMTZbM10gPSB7MjA1LjkwLCAtODQuNjEsIDEwMjc1Ljk3fTsKK3N0YXRpYyBmbG9hdCBQMTE3WzNdID0gey0yMzAuOTYsIC04My4yNiwgMTAyODAuMDl9Oworc3RhdGljIGZsb2F0IGlQMTE4WzNdID0gezIxNi43OCwgLTUwOS4xNywgMTAwOTguOTR9Oworc3RhdGljIGZsb2F0IGlQMTE5WzNdID0gey0zMTMuMjEsIC01MTAuNzksIDEwMTAyLjYyfTsKK3N0YXRpYyBmbG9hdCBQMTE4WzNdID0gezIxNi43OCwgLTUwOS4xNywgMTAwOTguOTR9Oworc3RhdGljIGZsb2F0IFAxMTlbM10gPSB7LTMxMy4yMSwgLTUxMC43OSwgMTAxMDIuNjJ9Oworc3RhdGljIGZsb2F0IFAxMjBbM10gPSB7MjE3Ljk1LCA5Ni4zNCwgMTAxNjEuNjJ9Oworc3RhdGljIGZsb2F0IFAxMjFbM10gPSB7NzEuOTksIC0zMTkuNzQsIDEwNzE3LjcwfTsKK3N0YXRpYyBmbG9hdCBpUDEyMVszXSA9IHs3MS45OSwgLTMxOS43NCwgMTA3MTcuNzB9Oworc3RhdGljIGZsb2F0IFAxMjJbM10gPSB7MC4wMCwgNjAyLjc0LCA1Mzc1Ljg0fTsKK3N0YXRpYyBmbG9hdCBpUDEyMlszXSA9IHswLjAwLCA2MDIuNzQsIDUzNzUuODR9Oworc3RhdGljIGZsb2F0IFAxMjNbM10gPSB7LTQ0OC45NCwgLTIwMy4xNCwgOTQ5OS42MH07CitzdGF0aWMgZmxvYXQgUDEyNFszXSA9IHstNDQyLjY0LCAtMTg1LjIwLCA5NTI4LjA3fTsKK3N0YXRpYyBmbG9hdCBQMTI1WzNdID0gey00NDEuMDcsIC0xNDguMDUsIDk1MjguMDd9Oworc3RhdGljIGZsb2F0IFAxMjZbM10gPSB7LTQ0My40MywgLTEyOC44NCwgOTQ5OS42MH07CitzdGF0aWMgZmxvYXQgUDEyN1szXSA9IHstNDU2Ljg3LCAtMTQ2Ljc4LCA5NDY2LjY3fTsKK3N0YXRpYyBmbG9hdCBQMTI4WzNdID0gey00NTMuNjgsIC0xODMuOTMsIDk0NjYuNjd9Oworc3RhdGljIGZsb2F0IFAxMjlbM10gPSB7NDI4LjQzLCAtMTI0LjA4LCA5NTAzLjAzfTsKK3N0YXRpYyBmbG9hdCBQMTMwWzNdID0gezQxOS43MywgLTE0Mi4xNCwgOTUzNC41Nn07CitzdGF0aWMgZmxvYXQgUDEzMVszXSA9IHs0MTkuOTIsIC0xNzkuOTYsIDk1MzQuNTZ9Oworc3RhdGljIGZsb2F0IFAxMzJbM10gPSB7NDMxLjIwLCAtMTk5LjczLCA5NTA1LjI2fTsKK3N0YXRpYyBmbG9hdCBQMTMzWzNdID0gezQ0Mi4yOCwgLTE4MS42NywgOTQ3NS45Nn07CitzdGF0aWMgZmxvYXQgUDEzNFszXSA9IHs0NDIuMDgsIC0xNDMuODQsIDk0NzUuOTZ9OworLyogKklOREVOVC1PTiogKi8KKwordm9pZAorRG9scGhpbjAwMSh2b2lkKQoreworICAgIGdsTm9ybWFsM2Z2KE4wNzEpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzIpOworICAgIGdsVmVydGV4M2Z2KFAwNzQpOworICAgIGdsRW5kKCk7CisgICAgZ2xOb3JtYWwzZnYoTjExOSk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDcyKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDc0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAwMih2b2lkKQoreworICAgIGdsTm9ybWFsM2Z2KE4wNzEpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzEpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7CisgICAgZ2xOb3JtYWwzZnYoTjExOSk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDczKTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAwMyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE3KTsKKyAgICBnbFZlcnRleDNmdihQMDE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDQodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDA1KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbE5vcm1hbDNmdihOMDM0KTsKKyAgICBnbFZlcnRleDNmdihQMDM0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAwNih2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTMpOworICAgIGdsVmVydGV4M2Z2KFAwOTMpOworICAgIGdsTm9ybWFsM2Z2KE4wOTIpOworICAgIGdsVmVydGV4M2Z2KFAwOTIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTQpOworICAgIGdsVmVydGV4M2Z2KFAwOTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDkyKTsKKyAgICBnbFZlcnRleDNmdihQMDkyKTsKKyAgICBnbE5vcm1hbDNmdihOMDkxKTsKKyAgICBnbFZlcnRleDNmdihQMDkxKTsKKyAgICBnbE5vcm1hbDNmdihOMDk1KTsKKyAgICBnbFZlcnRleDNmdihQMDk1KTsKKyAgICBnbE5vcm1hbDNmdihOMDk0KTsKKyAgICBnbFZlcnRleDNmdihQMDk0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA5NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMjIpOworICAgIGdsVmVydGV4M2Z2KFAxMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTUpOworICAgIGdsVmVydGV4M2Z2KFAwOTUpOworICAgIGdsTm9ybWFsM2Z2KE4wOTEpOworICAgIGdsVmVydGV4M2Z2KFAwOTEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTIyKTsKKyAgICBnbFZlcnRleDNmdihQMTIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDkxKTsKKyAgICBnbFZlcnRleDNmdihQMDkxKTsKKyAgICBnbE5vcm1hbDNmdihOMDk1KTsKKyAgICBnbFZlcnRleDNmdihQMDk1KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDA3KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAwOCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDkodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbE5vcm1hbDNmdihOMDU3KTsKKyAgICBnbFZlcnRleDNmdihQMDU3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDEwKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgwKTsKKyAgICBnbFZlcnRleDNmdihQMDgwKTsKKyAgICBnbE5vcm1hbDNmdihOMDgxKTsKKyAgICBnbFZlcnRleDNmdihQMDgxKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDg3KTsKKyAgICBnbFZlcnRleDNmdihQMDg3KTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODEpOworICAgIGdsVmVydGV4M2Z2KFAwODEpOworICAgIGdsTm9ybWFsM2Z2KE4wODApOworICAgIGdsVmVydGV4M2Z2KFAwODApOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDgxKTsKKyAgICBnbFZlcnRleDNmdihQMDgxKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODcpOworICAgIGdsVmVydGV4M2Z2KFAwODcpOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg3KTsKKyAgICBnbFZlcnRleDNmdihQMDg3KTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbE5vcm1hbDNmdihOMDkwKTsKKyAgICBnbFZlcnRleDNmdihQMDkwKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDExKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgyKTsKKyAgICBnbFZlcnRleDNmdihQMDgyKTsKKyAgICBnbE5vcm1hbDNmdihOMDg0KTsKKyAgICBnbFZlcnRleDNmdihQMDg0KTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzkpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDg4KTsKKyAgICBnbFZlcnRleDNmdihQMDg4KTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODgpOworICAgIGdsVmVydGV4M2Z2KFAwODgpOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wODkpOworICAgIGdsVmVydGV4M2Z2KFAwODkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg5KTsKKyAgICBnbFZlcnRleDNmdihQMDg5KTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wNzkpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg0KTsKKyAgICBnbFZlcnRleDNmdihQMDg0KTsKKyAgICBnbE5vcm1hbDNmdihOMDgyKTsKKyAgICBnbFZlcnRleDNmdihQMDgyKTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDEyKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wNjcpOworICAgIGdsVmVydGV4M2Z2KFAwNjcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTIpOworICAgIGdsVmVydGV4M2Z2KFAwNTIpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMTModm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTYpOworICAgIGdsVmVydGV4M2Z2KFAxMTYpOworICAgIGdsTm9ybWFsM2Z2KE4xMTcpOworICAgIGdsVmVydGV4M2Z2KFAxMTcpOworICAgIGdsTm9ybWFsM2Z2KE4xMTIpOworICAgIGdsVmVydGV4M2Z2KFAxMTIpOworICAgIGdsTm9ybWFsM2Z2KE4xMTMpOworICAgIGdsVmVydGV4M2Z2KFAxMTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE0KTsKKyAgICBnbFZlcnRleDNmdihQMTE0KTsKKyAgICBnbE5vcm1hbDNmdihOMTEzKTsKKyAgICBnbFZlcnRleDNmdihQMTEzKTsKKyAgICBnbE5vcm1hbDNmdihOMTEyKTsKKyAgICBnbFZlcnRleDNmdihQMTEyKTsKKyAgICBnbE5vcm1hbDNmdihOMTE1KTsKKyAgICBnbFZlcnRleDNmdihQMTE1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNCk7CisgICAgZ2xOb3JtYWwzZnYoTjExNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNik7CisgICAgZ2xOb3JtYWwzZnYoTjExMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTQpOworICAgIGdsVmVydGV4M2Z2KFAxMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMDcpOworICAgIGdsVmVydGV4M2Z2KFAwMDcpOworICAgIGdsTm9ybWFsM2Z2KE4xMTYpOworICAgIGdsVmVydGV4M2Z2KFAxMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA3KTsKKyAgICBnbFZlcnRleDNmdihQMDA3KTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMTE2KTsKKyAgICBnbFZlcnRleDNmdihQMTE2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDcpOworICAgIGdsVmVydGV4M2Z2KFAxMTQpOworICAgIGdsVmVydGV4M2Z2KFAxMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE3KTsKKyAgICBnbFZlcnRleDNmdihQMTE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDk5KTsKKyAgICBnbFZlcnRleDNmdihQMDk5KTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xOb3JtYWwzZnYoTjExMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTIpOworICAgIGdsVmVydGV4M2Z2KFAxMTIpOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4xMTUpOworICAgIGdsVmVydGV4M2Z2KFAxMTUpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMTQodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTEpOworICAgIGdsVmVydGV4M2Z2KFAxMTEpOworICAgIGdsTm9ybWFsM2Z2KE4xMTApOworICAgIGdsVmVydGV4M2Z2KFAxMTApOworICAgIGdsTm9ybWFsM2Z2KE4xMDIpOworICAgIGdsVmVydGV4M2Z2KFAxMDIpOworICAgIGdsTm9ybWFsM2Z2KE4xMjEpOworICAgIGdsVmVydGV4M2Z2KFAxMjEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTExKTsKKyAgICBnbFZlcnRleDNmdihQMTExKTsKKyAgICBnbE5vcm1hbDNmdihOMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbE5vcm1hbDNmdihOMTEwKTsKKyAgICBnbFZlcnRleDNmdihQMTEwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjExOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOSk7CisgICAgZ2xOb3JtYWwzZnYoTjExMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTcpOworICAgIGdsVmVydGV4M2Z2KFAwOTcpOworICAgIGdsTm9ybWFsM2Z2KE4wOTkpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDk5KTsKKyAgICBnbFZlcnRleDNmdihQMDk5KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMTE5KTsKKyAgICBnbFZlcnRleDNmdihQMTE5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xOb3JtYWwzZnYoTjExOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwOTgpOworICAgIGdsVmVydGV4M2Z2KFAwOTcpOworICAgIGdsVmVydGV4M2Z2KFAxMTEpOworICAgIGdsVmVydGV4M2Z2KFAxMjEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDk5KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMCk7CisgICAgZ2xOb3JtYWwzZnYoTjExOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOSk7CisgICAgZ2xOb3JtYWwzZnYoTjExOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOCk7CisgICAgZ2xOb3JtYWwzZnYoTjEwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjcpOworICAgIGdsVmVydGV4M2Z2KFAwNjcpOworICAgIGdsTm9ybWFsM2Z2KE4xMTgpOworICAgIGdsVmVydGV4M2Z2KFAxMTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjExOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTgpOworICAgIGdsVmVydGV4M2Z2KFAxMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTgpOworICAgIGdsVmVydGV4M2Z2KFAwOTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE4KTsKKyAgICBnbFZlcnRleDNmdihQMTE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDk4KTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbE5vcm1hbDNmdihOMTAyKTsKKyAgICBnbFZlcnRleDNmdihQMTAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjEwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA5OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OCk7CisgICAgZ2xOb3JtYWwzZnYoTjEyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAxNSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbE5vcm1hbDNmdihOMDY0KTsKKyAgICBnbFZlcnRleDNmdihQMDY0KTsKKyAgICBnbE5vcm1hbDNmdihOMTIwKTsKKyAgICBnbFZlcnRleDNmdihQMTIwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjQpOworICAgIGdsVmVydGV4M2Z2KFAwNjQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY0KTsKKyAgICBnbFZlcnRleDNmdihQMDY0KTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDk5KTsKKyAgICBnbFZlcnRleDNmdihQMDk5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xOb3JtYWwzZnYoTjExNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMjApOworICAgIGdsVmVydGV4M2Z2KFAxMjApOworICAgIGdsTm9ybWFsM2Z2KE4wNjQpOworICAgIGdsVmVydGV4M2Z2KFAwNjQpOworICAgIGdsTm9ybWFsM2Z2KE4xMTcpOworICAgIGdsVmVydGV4M2Z2KFAxMTcpOworICAgIGdsTm9ybWFsM2Z2KE4xMTYpOworICAgIGdsVmVydGV4M2Z2KFAxMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMDk5KTsKKyAgICBnbFZlcnRleDNmdihQMDk5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjEyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsTm9ybWFsM2Z2KE4xMjApOworICAgIGdsVmVydGV4M2Z2KFAxMjApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMTIwKTsKKyAgICBnbFZlcnRleDNmdihQMTIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjEyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjExNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMTYodm9pZCkKK3sKKworICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAxMjMpOworICAgIGdsVmVydGV4M2Z2KFAxMjQpOworICAgIGdsVmVydGV4M2Z2KFAxMjUpOworICAgIGdsVmVydGV4M2Z2KFAxMjYpOworICAgIGdsVmVydGV4M2Z2KFAxMjcpOworICAgIGdsVmVydGV4M2Z2KFAxMjgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMTI5KTsKKyAgICBnbFZlcnRleDNmdihQMTMwKTsKKyAgICBnbFZlcnRleDNmdihQMTMxKTsKKyAgICBnbFZlcnRleDNmdihQMTMyKTsKKyAgICBnbFZlcnRleDNmdihQMTMzKTsKKyAgICBnbFZlcnRleDNmdihQMTM0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKK30KKwordm9pZAorRHJhd0RvbHBoaW4oZmlzaFJlYyAqIGZpc2gpCit7CisgICAgZmxvYXQgc2VnMCwgc2VnMSwgc2VnMiwgc2VnMywgc2VnNCwgc2VnNSwgc2VnNiwgc2VnNzsKKyAgICBmbG9hdCBwaXRjaCwgdGhyYXNoLCBjaG9tcDsKKworICAgIGZpc2gtPmh0YWlsID0gKGludCkgKGZpc2gtPmh0YWlsIC0gKGludCkgKDEwLjAgKiBmaXNoLT52KSkgJSAzNjA7CisKKyAgICB0aHJhc2ggPSA3MC4wICogZmlzaC0+djsKKworICAgIHNlZzAgPSAxLjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsKSAqIFJSQUQpOworICAgIHNlZzMgPSAxLjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsKSAqIFJSQUQpOworICAgIHNlZzEgPSAyLjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgNC4wKSAqIFJSQUQpOworICAgIHNlZzIgPSAzLjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgNi4wKSAqIFJSQUQpOworICAgIHNlZzQgPSA0LjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgMTAuMCkgKiBSUkFEKTsKKyAgICBzZWc1ID0gNC41ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDE1LjApICogUlJBRCk7CisgICAgc2VnNiA9IDUuMCAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyAyMC4wKSAqIFJSQUQpOworICAgIHNlZzcgPSA2LjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgMzAuMCkgKiBSUkFEKTsKKworICAgIHBpdGNoID0gZmlzaC0+diAqIHNpbigoZmlzaC0+aHRhaWwgKyAxODAuMCkgKiBSUkFEKTsKKworICAgIGlmIChmaXNoLT52ID4gMi4wKSB7CisgICAgICAgIGNob21wID0gLShmaXNoLT52IC0gMi4wKSAqIDIwMC4wOworICAgIH0KKyAgICBjaG9tcCA9IDEwMC4wOworCisgICAgUDAxMlsxXSA9IGlQMDEyWzFdICsgc2VnNTsKKyAgICBQMDEzWzFdID0gaVAwMTNbMV0gKyBzZWc1OworICAgIFAwMTRbMV0gPSBpUDAxNFsxXSArIHNlZzU7CisgICAgUDAxNVsxXSA9IGlQMDE1WzFdICsgc2VnNTsKKyAgICBQMDE2WzFdID0gaVAwMTZbMV0gKyBzZWc1OworICAgIFAwMTdbMV0gPSBpUDAxN1sxXSArIHNlZzU7CisgICAgUDAxOFsxXSA9IGlQMDE4WzFdICsgc2VnNTsKKyAgICBQMDE5WzFdID0gaVAwMTlbMV0gKyBzZWc1OworCisgICAgUDAyMFsxXSA9IGlQMDIwWzFdICsgc2VnNDsKKyAgICBQMDIxWzFdID0gaVAwMjFbMV0gKyBzZWc0OworICAgIFAwMjJbMV0gPSBpUDAyMlsxXSArIHNlZzQ7CisgICAgUDAyM1sxXSA9IGlQMDIzWzFdICsgc2VnNDsKKyAgICBQMDI0WzFdID0gaVAwMjRbMV0gKyBzZWc0OworICAgIFAwMjVbMV0gPSBpUDAyNVsxXSArIHNlZzQ7CisgICAgUDAyNlsxXSA9IGlQMDI2WzFdICsgc2VnNDsKKyAgICBQMDI3WzFdID0gaVAwMjdbMV0gKyBzZWc0OworCisgICAgUDAyOFsxXSA9IGlQMDI4WzFdICsgc2VnMjsKKyAgICBQMDI5WzFdID0gaVAwMjlbMV0gKyBzZWcyOworICAgIFAwMzBbMV0gPSBpUDAzMFsxXSArIHNlZzI7CisgICAgUDAzMVsxXSA9IGlQMDMxWzFdICsgc2VnMjsKKyAgICBQMDMyWzFdID0gaVAwMzJbMV0gKyBzZWcyOworICAgIFAwMzNbMV0gPSBpUDAzM1sxXSArIHNlZzI7CisgICAgUDAzNFsxXSA9IGlQMDM0WzFdICsgc2VnMjsKKyAgICBQMDM1WzFdID0gaVAwMzVbMV0gKyBzZWcyOworCisgICAgUDAzNlsxXSA9IGlQMDM2WzFdICsgc2VnMTsKKyAgICBQMDM3WzFdID0gaVAwMzdbMV0gKyBzZWcxOworICAgIFAwMzhbMV0gPSBpUDAzOFsxXSArIHNlZzE7CisgICAgUDAzOVsxXSA9IGlQMDM5WzFdICsgc2VnMTsKKyAgICBQMDQwWzFdID0gaVAwNDBbMV0gKyBzZWcxOworICAgIFAwNDFbMV0gPSBpUDA0MVsxXSArIHNlZzE7CisgICAgUDA0MlsxXSA9IGlQMDQyWzFdICsgc2VnMTsKKyAgICBQMDQzWzFdID0gaVAwNDNbMV0gKyBzZWcxOworCisgICAgUDA0NFsxXSA9IGlQMDQ0WzFdICsgc2VnMDsKKyAgICBQMDQ1WzFdID0gaVAwNDVbMV0gKyBzZWcwOworICAgIFAwNDZbMV0gPSBpUDA0NlsxXSArIHNlZzA7CisgICAgUDA0N1sxXSA9IGlQMDQ3WzFdICsgc2VnMDsKKyAgICBQMDQ4WzFdID0gaVAwNDhbMV0gKyBzZWcwOworICAgIFAwNDlbMV0gPSBpUDA0OVsxXSArIHNlZzA7CisgICAgUDA1MFsxXSA9IGlQMDUwWzFdICsgc2VnMDsKKyAgICBQMDUxWzFdID0gaVAwNTFbMV0gKyBzZWcwOworCisgICAgUDAwOVsxXSA9IGlQMDA5WzFdICsgc2VnNjsKKyAgICBQMDEwWzFdID0gaVAwMTBbMV0gKyBzZWc2OworICAgIFAwNzVbMV0gPSBpUDA3NVsxXSArIHNlZzY7CisgICAgUDA3NlsxXSA9IGlQMDc2WzFdICsgc2VnNjsKKworICAgIFAwMDFbMV0gPSBpUDAwMVsxXSArIHNlZzc7CisgICAgUDAxMVsxXSA9IGlQMDExWzFdICsgc2VnNzsKKyAgICBQMDY4WzFdID0gaVAwNjhbMV0gKyBzZWc3OworICAgIFAwNjlbMV0gPSBpUDA2OVsxXSArIHNlZzc7CisgICAgUDA3MFsxXSA9IGlQMDcwWzFdICsgc2VnNzsKKyAgICBQMDcxWzFdID0gaVAwNzFbMV0gKyBzZWc3OworICAgIFAwNzJbMV0gPSBpUDA3MlsxXSArIHNlZzc7CisgICAgUDA3M1sxXSA9IGlQMDczWzFdICsgc2VnNzsKKyAgICBQMDc0WzFdID0gaVAwNzRbMV0gKyBzZWc3OworCisgICAgUDA5MVsxXSA9IGlQMDkxWzFdICsgc2VnMzsKKyAgICBQMDkyWzFdID0gaVAwOTJbMV0gKyBzZWczOworICAgIFAwOTNbMV0gPSBpUDA5M1sxXSArIHNlZzM7CisgICAgUDA5NFsxXSA9IGlQMDk0WzFdICsgc2VnMzsKKyAgICBQMDk1WzFdID0gaVAwOTVbMV0gKyBzZWczOworICAgIFAxMjJbMV0gPSBpUDEyMlsxXSArIHNlZzMgKiAxLjU7CisKKyAgICBQMDk3WzFdID0gaVAwOTdbMV0gKyBjaG9tcDsKKyAgICBQMDk4WzFdID0gaVAwOThbMV0gKyBjaG9tcDsKKyAgICBQMTAyWzFdID0gaVAxMDJbMV0gKyBjaG9tcDsKKyAgICBQMTEwWzFdID0gaVAxMTBbMV0gKyBjaG9tcDsKKyAgICBQMTExWzFdID0gaVAxMTFbMV0gKyBjaG9tcDsKKyAgICBQMTIxWzFdID0gaVAxMjFbMV0gKyBjaG9tcDsKKyAgICBQMTE4WzFdID0gaVAxMThbMV0gKyBjaG9tcDsKKyAgICBQMTE5WzFdID0gaVAxMTlbMV0gKyBjaG9tcDsKKworICAgIGdsUHVzaE1hdHJpeCgpOworCisgICAgZ2xSb3RhdGVmKHBpdGNoLCAxLjAsIDAuMCwgMC4wKTsKKworICAgIGdsVHJhbnNsYXRlZigwLjAsIDAuMCwgNzAwMC4wKTsKKworICAgIGdsUm90YXRlZigxODAuMCwgMC4wLCAxLjAsIDAuMCk7CisKKyAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgIERvbHBoaW4wMTQoKTsKKyAgICBEb2xwaGluMDEwKCk7CisgICAgRG9scGhpbjAwOSgpOworICAgIERvbHBoaW4wMTIoKTsKKyAgICBEb2xwaGluMDEzKCk7CisgICAgRG9scGhpbjAwNigpOworICAgIERvbHBoaW4wMDIoKTsKKyAgICBEb2xwaGluMDAxKCk7CisgICAgRG9scGhpbjAwMygpOworICAgIERvbHBoaW4wMTUoKTsKKyAgICBEb2xwaGluMDA0KCk7CisgICAgRG9scGhpbjAwNSgpOworICAgIERvbHBoaW4wMDcoKTsKKyAgICBEb2xwaGluMDA4KCk7CisgICAgRG9scGhpbjAxMSgpOworICAgIERvbHBoaW4wMTYoKTsKKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKworICAgIGdsUG9wTWF0cml4KCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvc2hhcmsuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9zaGFyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODQ3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvc2hhcmsuYwpAQCAtMCwwICsxLDEzMDggQEAKKy8qKgorICogKGMpIENvcHlyaWdodCAxOTkzLCAxOTk0LCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBTEwgUklHSFRTIFJFU0VSVkVECisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQgbm90aWNlCisgKiBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdAorICogdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZworICogb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorICoKKyAqIFRIRSBNQVRFUklBTCBFTUJPRElFRCBPTiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIFRPIFlPVSAiQVMtSVMiCisgKiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsCisgKiBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIElOIE5PIEVWRU5UIFNIQUxMIFNJTElDT04KKyAqIEdSQVBISUNTLCBJTkMuICBCRSBMSUFCTEUgVE8gWU9VIE9SIEFOWU9ORSBFTFNFIEZPUiBBTlkgRElSRUNULAorICogU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWQorICogS0lORCwgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwKKyAqIExPU1MgT0YgUFJPRklULCBMT1NTIE9GIFVTRSwgU0FWSU5HUyBPUiBSRVZFTlVFLCBPUiBUSEUgQ0xBSU1TIE9GCisgKiBUSElSRCBQQVJUSUVTLCBXSEVUSEVSIE9SIE5PVCBTSUxJQ09OIEdSQVBISUNTLCBJTkMuICBIQVMgQkVFTgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBMT1NTLCBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBQT1NTRVNTSU9OLCBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzCisgKiBVc2UsIGR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlIGJ5IHRoZSBHb3Zlcm5tZW50IGlzIHN1YmplY3QgdG8KKyAqIHJlc3RyaWN0aW9ucyBzZXQgZm9ydGggaW4gRkFSIDUyLjIyNy4xOShjKSgyKSBvciBzdWJwYXJhZ3JhcGgKKyAqIChjKSgxKShpaSkgb2YgdGhlIFJpZ2h0cyBpbiBUZWNobmljYWwgRGF0YSBhbmQgQ29tcHV0ZXIgU29mdHdhcmUKKyAqIGNsYXVzZSBhdCBERkFSUyAyNTIuMjI3LTcwMTMgYW5kL29yIGluIHNpbWlsYXIgb3Igc3VjY2Vzc29yCisgKiBjbGF1c2VzIGluIHRoZSBGQVIgb3IgdGhlIERPRCBvciBOQVNBIEZBUiBTdXBwbGVtZW50LgorICogVW5wdWJsaXNoZWQtLSByaWdodHMgcmVzZXJ2ZWQgdW5kZXIgdGhlIGNvcHlyaWdodCBsYXdzIG9mIHRoZQorICogVW5pdGVkIFN0YXRlcy4gIENvbnRyYWN0b3IvbWFudWZhY3R1cmVyIGlzIFNpbGljb24gR3JhcGhpY3MsCisgKiBJbmMuLCAyMDExIE4uICBTaG9yZWxpbmUgQmx2ZC4sIE1vdW50YWluIFZpZXcsIENBIDk0MDM5LTczMTEuCisgKgorICogT3BlbkdMKFRNKSBpcyBhIHRyYWRlbWFyayBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKi8KKyNpbmNsdWRlIDxHTFVUL2dsdXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiYXRsYW50aXMuaCIKKy8qICpJTkRFTlQtT0ZGKiAqLworc3RhdGljIGZsb2F0IE4wMDJbM10gPSB7MC4wMDAwNzcgLC0wLjAyMDYxMSAsMC45OTk3ODh9Oworc3RhdGljIGZsb2F0IE4wMDNbM10gPSB7MC45NjE0MjUgLDAuMjU4NzI5ICwtMC4wOTMzOTB9Oworc3RhdGljIGZsb2F0IE4wMDRbM10gPSB7MC41MTA4MTEgLC0wLjc2OTYzMyAsLTAuMzgzMDYzfTsKK3N0YXRpYyBmbG9hdCBOMDA1WzNdID0gezAuNDAwMTIzICwwLjg1NTczNCAsLTAuMzI4MDU1fTsKK3N0YXRpYyBmbG9hdCBOMDA2WzNdID0gey0wLjc3MDcxNSAsMC42MTAyMDQgLC0wLjE4MzQ0MH07CitzdGF0aWMgZmxvYXQgTjAwN1szXSA9IHstMC45MTU1OTcgLC0wLjM3MzM0NSAsLTAuMTQ5MzE2fTsKK3N0YXRpYyBmbG9hdCBOMDA4WzNdID0gey0wLjk3Mjc4OCAsMC4yMDg5MjEgLC0wLjEwMDE3OX07CitzdGF0aWMgZmxvYXQgTjAwOVszXSA9IHstMC45Mzk3MTMgLC0wLjMxMjI2OCAsLTAuMTM5MzgzfTsKK3N0YXRpYyBmbG9hdCBOMDEwWzNdID0gey0wLjYyNDEzOCAsLTAuNzQxMDQ3ICwtMC4yNDc1ODl9Oworc3RhdGljIGZsb2F0IE4wMTFbM10gPSB7MC41OTE0MzQgLC0wLjc2ODQwMSAsLTAuMjQ0NDcxfTsKK3N0YXRpYyBmbG9hdCBOMDEyWzNdID0gezAuOTM1MTUyICwtMC4zMjg0OTUgLC0wLjEzMjU5OH07CitzdGF0aWMgZmxvYXQgTjAxM1szXSA9IHswLjk5NzEwMiAsMC4wNzQyNDMgLC0wLjAxNjU5M307CitzdGF0aWMgZmxvYXQgTjAxNFszXSA9IHswLjk2OTk5NSAsMC4yNDE3MTIgLC0wLjAyNjE4Nn07CitzdGF0aWMgZmxvYXQgTjAxNVszXSA9IHswLjg0NDUzOSAsMC41MDI2MjggLC0wLjE4NDcxNH07CitzdGF0aWMgZmxvYXQgTjAxNlszXSA9IHstMC45MDY2MDggLDAuMzg2MzA4ICwtMC4xNjk3ODd9Oworc3RhdGljIGZsb2F0IE4wMTdbM10gPSB7LTAuOTcwMDE2ICwwLjI0MTY5OCAsLTAuMDI1NTE2fTsKK3N0YXRpYyBmbG9hdCBOMDE4WzNdID0gey0wLjk5ODY1MiAsMC4wNTA0OTMgLC0wLjAxMjA0NX07CitzdGF0aWMgZmxvYXQgTjAxOVszXSA9IHstMC45NDI2ODUgLC0wLjMzMzA1MSAsLTAuMDIwNTU2fTsKK3N0YXRpYyBmbG9hdCBOMDIwWzNdID0gey0wLjY2MDk0NCAsLTAuNzUwMjc2ICwwLjAxNTQ4MH07CitzdGF0aWMgZmxvYXQgTjAyMVszXSA9IHswLjUwMzU0OSAsLTAuODYyOTA4ICwtMC4wNDI3NDl9Oworc3RhdGljIGZsb2F0IE4wMjJbM10gPSB7MC45NTMyMDIgLC0wLjMwMjA5MiAsLTAuMDEyMDg5fTsKK3N0YXRpYyBmbG9hdCBOMDIzWzNdID0gezAuOTk4NzM4ICwwLjAyMzU3NCAsMC4wNDQzNDR9Oworc3RhdGljIGZsb2F0IE4wMjRbM10gPSB7MC45NzkyOTcgLDAuMTkzMjcyICwwLjA2MDIwMn07CitzdGF0aWMgZmxvYXQgTjAyNVszXSA9IHswLjc5ODMwMCAsMC40NjQ4ODUgLDAuMzgyODgzfTsKK3N0YXRpYyBmbG9hdCBOMDI2WzNdID0gey0wLjc1NjU5MCAsMC40NTI0MDMgLDAuNDcyMTI2fTsKK3N0YXRpYyBmbG9hdCBOMDI3WzNdID0gey0wLjk1Mzg1NSAsMC4yOTMwMDMgLDAuMDY1NjUxfTsKK3N0YXRpYyBmbG9hdCBOMDI4WzNdID0gey0wLjk5ODAzMyAsMC4wNDAyOTIgLDAuMDQ4MDI4fTsKK3N0YXRpYyBmbG9hdCBOMDI5WzNdID0gey0wLjk3NzA3OSAsLTAuMjA0Mjg4ICwwLjA1OTg1OH07CitzdGF0aWMgZmxvYXQgTjAzMFszXSA9IHstMC43MjkxMTcgLC0wLjY3NTMwNCAsMC4xMTExNDB9Oworc3RhdGljIGZsb2F0IE4wMzFbM10gPSB7MC41OTgzNjEgLC0wLjc5Mjc1MyAsMC4xMTYyMjF9Oworc3RhdGljIGZsb2F0IE4wMzJbM10gPSB7MC45NjUxOTIgLC0wLjI1Mjk5MSAsMC4wNjYzMzJ9Oworc3RhdGljIGZsb2F0IE4wMzNbM10gPSB7MC45OTgyMDEgLC0wLjAwMjc5MCAsMC4wNTk4OTJ9Oworc3RhdGljIGZsb2F0IE4wMzRbM10gPSB7MC45Nzg2NTcgLDAuMTkzMTM1ICwwLjA3MDIwN307CitzdGF0aWMgZmxvYXQgTjAzNVszXSA9IHswLjcxODgxNSAsMC42ODAzOTIgLDAuMTQyNzMzfTsKK3N0YXRpYyBmbG9hdCBOMDM2WzNdID0gey0wLjM4MzA5NiAsMC45MDYyMTIgLDAuMTc4OTM2fTsKK3N0YXRpYyBmbG9hdCBOMDM3WzNdID0gey0wLjk1MjgzMSAsMC4yOTI1OTAgLDAuMDgwNjQ3fTsKK3N0YXRpYyBmbG9hdCBOMDM4WzNdID0gey0wLjk5NzY4MCAsMC4wMzI0MTcgLDAuMDU5ODYxfTsKK3N0YXRpYyBmbG9hdCBOMDM5WzNdID0gey0wLjk4MjYyOSAsLTAuMTY5ODgxICwwLjA3NDcwMH07CitzdGF0aWMgZmxvYXQgTjA0MFszXSA9IHstMC42OTU0MjQgLC0wLjcwMzQ2NiAsMC4xNDY3MDB9Oworc3RhdGljIGZsb2F0IE4wNDFbM10gPSB7MC4zNTkzMjMgLC0wLjkxNTUzMSAsMC4xODA4MDV9Oworc3RhdGljIGZsb2F0IE4wNDJbM10gPSB7MC45NDMzNTYgLC0wLjMxOTM4NyAsMC4wODk4NDJ9Oworc3RhdGljIGZsb2F0IE4wNDNbM10gPSB7MC45OTgyNzIgLC0wLjAzMjQzNSAsMC4wNDg5OTN9Oworc3RhdGljIGZsb2F0IE4wNDRbM10gPSB7MC45Nzg5OTcgLDAuMTkzMjA1ICwwLjA2NTA4NH07CitzdGF0aWMgZmxvYXQgTjA0NVszXSA9IHswLjg3MjE0NCAsMC40NzAwOTQgLC0wLjEzNTU2NX07CitzdGF0aWMgZmxvYXQgTjA0NlszXSA9IHstMC42NjQyODIgLDAuNzM3OTQ1ICwtMC4xMTkwMjd9Oworc3RhdGljIGZsb2F0IE4wNDdbM10gPSB7LTAuOTU0NTA4ICwwLjI4ODU3MCAsMC4wNzUxMDd9Oworc3RhdGljIGZsb2F0IE4wNDhbM10gPSB7LTAuOTk4MjczICwwLjAzMjQwNiAsMC4wNDg5OTN9Oworc3RhdGljIGZsb2F0IE4wNDlbM10gPSB7LTAuOTc5OTA4ICwtMC4xOTM1NzkgLDAuMDQ4MDM4fTsKK3N0YXRpYyBmbG9hdCBOMDUwWzNdID0gey0wLjg1ODczNiAsLTAuNTA3MjAyICwtMC4wNzI5Mzh9Oworc3RhdGljIGZsb2F0IE4wNTFbM10gPSB7MC42NDM1NDUgLC0wLjc2Mzg4NyAsLTAuMDQ4MjM3fTsKK3N0YXRpYyBmbG9hdCBOMDUyWzNdID0gezAuOTU1NTgwICwtMC4yODg5NTQgLDAuMDU4MDY4fTsKK3N0YXRpYyBmbG9hdCBOMDU4WzNdID0gezAuMDAwMDUwICwwLjc5MzAwNyAsLTAuNjA5MjEzfTsKK3N0YXRpYyBmbG9hdCBOMDU5WzNdID0gezAuOTEzNTEwICwwLjIzNTQxOCAsLTAuMzMxNzc5fTsKK3N0YXRpYyBmbG9hdCBOMDYwWzNdID0gey0wLjgwNzk3MCAsMC40OTUwMDAgLC0wLjMxOTYyNX07CitzdGF0aWMgZmxvYXQgTjA2MVszXSA9IHswLjAwMDAwMCAsMC43ODQ2ODcgLC0wLjYxOTg5Mn07CitzdGF0aWMgZmxvYXQgTjA2MlszXSA9IHswLjAwMDAwMCAsLTEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA2M1szXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDY0WzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNjVbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA2NlszXSA9IHstMC4wNTU3ODQgLDAuMjU3MDU5ICwwLjk2NDc4NH07CitzdGF0aWMgZmxvYXQgTjA2OVszXSA9IHstMC4wMDA1MDUgLC0wLjkyOTc3NSAsLTAuMzY4MTI3fTsKK3N0YXRpYyBmbG9hdCBOMDcwWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IFAwMDJbM10gPSB7MC4wMCwgLTM2LjU5LCA1Njg3LjcyfTsKK3N0YXRpYyBmbG9hdCBQMDAzWzNdID0gezkwLjAwLCAxMTQuNzMsIDcyNC4zOH07CitzdGF0aWMgZmxvYXQgUDAwNFszXSA9IHs1OC4yNCwgLTE0Ni44NCwgMjYyLjM1fTsKK3N0YXRpYyBmbG9hdCBQMDA1WzNdID0gezI3LjgxLCAyMzEuNTIsIDUxMC40M307CitzdGF0aWMgZmxvYXQgUDAwNlszXSA9IHstMjcuODEsIDIzMC40MywgNTA5Ljc2fTsKK3N0YXRpYyBmbG9hdCBQMDA3WzNdID0gey00Ni4wOSwgLTE0Ni44MywgMjY1Ljg0fTsKK3N0YXRpYyBmbG9hdCBQMDA4WzNdID0gey05MC4wMCwgMTAzLjg0LCA3MTguNTN9Oworc3RhdGljIGZsb2F0IFAwMDlbM10gPSB7LTEzMS4xMCwgLTE2NS45MiwgODM0Ljg1fTsKK3N0YXRpYyBmbG9hdCBQMDEwWzNdID0gey0yNy44MSwgLTI4NS4zMSwgNTAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDExWzNdID0gezI3LjgxLCAtMjg1LjMyLCA1MDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMTJbM10gPSB7MTQ3Ljk2LCAtMTcwLjg5LCA4NDUuNTB9Oworc3RhdGljIGZsb2F0IFAwMTNbM10gPSB7MTgwLjAwLCAwLjAwLCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDE0WzNdID0gezE0NS42MiwgMzUyLjY3LCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDE1WzNdID0gezU1LjYyLCA1NzAuNjMsIDIwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMTZbM10gPSB7LTU1LjYyLCA1NzAuNjQsIDIwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMTdbM10gPSB7LTE0NS42MiwgMzUyLjY4LCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDE4WzNdID0gey0xODAuMDAsIDAuMDEsIDIwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMTlbM10gPSB7LTE3OC4yMCwgLTM1Mi42NiwgMjAwMS42MX07CitzdGF0aWMgZmxvYXQgUDAyMFszXSA9IHstNTUuNjMsIC01NzAuNjMsIDIwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMjFbM10gPSB7NTUuNjIsIC01NzAuNjQsIDIwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMjJbM10gPSB7MTc5LjkxLCAtMzUyLjY5LCAxOTk4LjM5fTsKK3N0YXRpYyBmbG9hdCBQMDIzWzNdID0gezE1MC4wMCwgMC4wMCwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAyNFszXSA9IHsxMjEuMzUsIDI5My44OSwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAyNVszXSA9IHs0Ni4zNSwgNTAyLjkzLCAyODgzLjA5fTsKK3N0YXRpYyBmbG9hdCBQMDI2WzNdID0gey00Ni4zNSwgNDk3LjQ1LCAyODc3LjI0fTsKK3N0YXRpYyBmbG9hdCBQMDI3WzNdID0gey0xMjEuMzUsIDI5My45MCwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAyOFszXSA9IHstMTUwLjAwLCAwLjAwLCAzMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDI5WzNdID0gey0xNTIuMjEsIC0zMDQuODQsIDI4NTguNjh9Oworc3RhdGljIGZsb2F0IFAwMzBbM10gPSB7LTQ2LjM2LCAtNDc1LjUyLCAzMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDMxWzNdID0gezQ2LjM1LCAtNDc1LjUzLCAzMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDMyWzNdID0gezE1NS42NCwgLTMwNC44NywgMjg2My41MH07CitzdGF0aWMgZmxvYXQgUDAzM1szXSA9IHs5MC4wMCwgMC4wMCwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAzNFszXSA9IHs3Mi44MSwgMTc2LjMzLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDM1WzNdID0gezI3LjgxLCAyODUuMzIsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMzZbM10gPSB7LTI3LjgxLCAyODUuMzIsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMzdbM10gPSB7LTcyLjgxLCAxNzYuMzQsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMzhbM10gPSB7LTkwLjAwLCAwLjAwLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDM5WzNdID0gey03Mi44MSwgLTE3Ni4zMywgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA0MFszXSA9IHstMjcuODEsIC0yODUuMzEsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDFbM10gPSB7MjcuODEsIC0yODUuMzIsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDJbM10gPSB7NzIuODEsIC0xNzYuMzQsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDNbM10gPSB7MzAuMDAsIDAuMDAsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDRbM10gPSB7MjQuMjcsIDU4Ljc4LCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQ1WzNdID0gezkuMjcsIDk1LjExLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQ2WzNdID0gey05LjI3LCA5NS4xMSwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA0N1szXSA9IHstMjQuMjcsIDU4Ljc4LCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQ4WzNdID0gey0zMC4wMCwgMC4wMCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA0OVszXSA9IHstMjQuMjcsIC01OC43OCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA1MFszXSA9IHstOS4yNywgLTk1LjEwLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDUxWzNdID0gezkuMjcsIC05NS4xMSwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA1MlszXSA9IHsyNC4yNywgLTU4Ljc4LCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDU4WzNdID0gezAuMDAsIDEyMTIuNzIsIDI3MDMuMDh9Oworc3RhdGljIGZsb2F0IFAwNTlbM10gPSB7NTAuMzYsIDAuMDAsIDEwOC4xNH07CitzdGF0aWMgZmxvYXQgUDA2MFszXSA9IHstMjIuMTgsIDAuMDAsIDEwOC4xNH07CitzdGF0aWMgZmxvYXQgUDA2MVszXSA9IHswLjAwLCAxMTgxLjYxLCA2MzQ0LjY1fTsKK3N0YXRpYyBmbG9hdCBQMDYyWzNdID0gezUxNi40NSwgLTg4Ny4wOCwgMjUzNS40NX07CitzdGF0aWMgZmxvYXQgUDA2M1szXSA9IHstNTQ1LjY5LCAtODc5LjMxLCAyNTU1LjYzfTsKK3N0YXRpYyBmbG9hdCBQMDY0WzNdID0gezYxOC44OSwgLTEwMDUuNjQsIDI5ODguMzJ9Oworc3RhdGljIGZsb2F0IFAwNjVbM10gPSB7LTYzNS4zNywgLTEwMTQuNzksIDI5MzguNjh9Oworc3RhdGljIGZsb2F0IFAwNjZbM10gPSB7MC4wMCwgMTM3NC40MywgMzA2NC4xOH07CitzdGF0aWMgZmxvYXQgUDA2OVszXSA9IHswLjAwLCAtNDE4LjI1LCA1NzY1LjA0fTsKK3N0YXRpYyBmbG9hdCBQMDcwWzNdID0gezAuMDAsIDEyNjYuOTEsIDY2MjkuNjB9Oworc3RhdGljIGZsb2F0IFAwNzFbM10gPSB7LTEzOS4xMiwgLTEyNC45NiwgOTk3Ljk4fTsKK3N0YXRpYyBmbG9hdCBQMDcyWzNdID0gey0xMzkuMjQsIC0xMTAuMTgsIDEwMjAuNjh9Oworc3RhdGljIGZsb2F0IFAwNzNbM10gPSB7LTEzNy4zMywgLTk0LjUyLCAxMDIyLjYzfTsKK3N0YXRpYyBmbG9hdCBQMDc0WzNdID0gey0xMzcuMDMsIC03OS45MSwgOTk2Ljg5fTsKK3N0YXRpYyBmbG9hdCBQMDc1WzNdID0gey0xMzUuMjEsIC05MS40OCwgOTY5LjE0fTsKK3N0YXRpYyBmbG9hdCBQMDc2WzNdID0gey0xMzUuMzksIC0xMTAuODcsIDk2OC43Nn07CitzdGF0aWMgZmxvYXQgUDA3N1szXSA9IHsxNTAuMjMsIC03OC40NCwgOTk1LjUzfTsKK3N0YXRpYyBmbG9hdCBQMDc4WzNdID0gezE1Mi43OSwgLTkyLjc2LCAxMDE4LjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDc5WzNdID0gezE1NC4xOSwgLTExMC4yMCwgMTAyMC41NX07CitzdGF0aWMgZmxvYXQgUDA4MFszXSA9IHsxNTEuMzMsIC0xMjQuMTUsIDk5My43N307CitzdGF0aWMgZmxvYXQgUDA4MVszXSA9IHsxNTAuNDksIC0xMTEuMTksIDk2OS44Nn07CitzdGF0aWMgZmxvYXQgUDA4MlszXSA9IHsxNTAuNzksIC05Mi40MSwgOTY5LjcwfTsKK3N0YXRpYyBmbG9hdCBpUDAwMlszXSA9IHswLjAwLCAtMzYuNTksIDU2ODcuNzJ9Oworc3RhdGljIGZsb2F0IGlQMDA0WzNdID0gezU4LjI0LCAtMTQ2Ljg0LCAyNjIuMzV9Oworc3RhdGljIGZsb2F0IGlQMDA3WzNdID0gey00Ni4wOSwgLTE0Ni44MywgMjY1Ljg0fTsKK3N0YXRpYyBmbG9hdCBpUDAxMFszXSA9IHstMjcuODEsIC0yODUuMzEsIDUwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMTFbM10gPSB7MjcuODEsIC0yODUuMzIsIDUwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMjNbM10gPSB7MTUwLjAwLCAwLjAwLCAzMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDAyNFszXSA9IHsxMjEuMzUsIDI5My44OSwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMjVbM10gPSB7NDYuMzUsIDUwMi45MywgMjg4My4wOX07CitzdGF0aWMgZmxvYXQgaVAwMjZbM10gPSB7LTQ2LjM1LCA0OTcuNDUsIDI4NzcuMjR9Oworc3RhdGljIGZsb2F0IGlQMDI3WzNdID0gey0xMjEuMzUsIDI5My45MCwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMjhbM10gPSB7LTE1MC4wMCwgMC4wMCwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMjlbM10gPSB7LTEyMS4zNSwgLTMwNC44NCwgMjg1My44Nn07CitzdGF0aWMgZmxvYXQgaVAwMzBbM10gPSB7LTQ2LjM2LCAtNDc1LjUyLCAzMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDAzMVszXSA9IHs0Ni4zNSwgLTQ3NS41MywgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMzJbM10gPSB7MTIxLjM1LCAtMzA0Ljg3LCAyODUzLjg2fTsKK3N0YXRpYyBmbG9hdCBpUDAzM1szXSA9IHs5MC4wMCwgMC4wMCwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMzRbM10gPSB7NzIuODEsIDE3Ni4zMywgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMzVbM10gPSB7MjcuODEsIDI4NS4zMiwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMzZbM10gPSB7LTI3LjgxLCAyODUuMzIsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDM3WzNdID0gey03Mi44MSwgMTc2LjM0LCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDAzOFszXSA9IHstOTAuMDAsIDAuMDAsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDM5WzNdID0gey03Mi44MSwgLTE3Ni4zMywgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNDBbM10gPSB7LTI3LjgxLCAtMjg1LjMxLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0MVszXSA9IHsyNy44MSwgLTI4NS4zMiwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNDJbM10gPSB7NzIuODEsIC0xNzYuMzQsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQzWzNdID0gezMwLjAwLCAwLjAwLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0NFszXSA9IHsyNC4yNywgNTguNzgsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQ1WzNdID0gezkuMjcsIDk1LjExLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0NlszXSA9IHstOS4yNywgOTUuMTEsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQ3WzNdID0gey0yNC4yNywgNTguNzgsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQ4WzNdID0gey0zMC4wMCwgMC4wMCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNDlbM10gPSB7LTI0LjI3LCAtNTguNzgsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDUwWzNdID0gey05LjI3LCAtOTUuMTAsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDUxWzNdID0gezkuMjcsIC05NS4xMSwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNTJbM10gPSB7MjQuMjcsIC01OC43OCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNjFbM10gPSB7MC4wMCwgMTE4MS42MSwgNjM0NC42NX07CitzdGF0aWMgZmxvYXQgaVAwNjlbM10gPSB7MC4wMCwgLTQxOC4yNSwgNTc2NS4wNH07CitzdGF0aWMgZmxvYXQgaVAwNzBbM10gPSB7MC4wMCwgMTI2Ni45MSwgNjYyOS42MH07CisvKiAqSU5ERU5ULU9OKiAqLworCit2b2lkCitGaXNoMDAxKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbE5vcm1hbDNmdihOMDA5KTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDcpOworICAgIGdsVmVydGV4M2Z2KFAwMDcpOworICAgIGdsTm9ybWFsM2Z2KE4wMTApOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA5KTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTApOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEwKTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDcxKTsKKyAgICBnbFZlcnRleDNmdihQMDcyKTsKKyAgICBnbFZlcnRleDNmdihQMDczKTsKKyAgICBnbFZlcnRleDNmdihQMDc0KTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Mik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwMih2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbE5vcm1hbDNmdihOMDE3KTsKKyAgICBnbFZlcnRleDNmdihQMDE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwMyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDM0KTsKKyAgICBnbFZlcnRleDNmdihQMDM0KTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwNCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNTIpOworICAgIGdsVmVydGV4M2Z2KFAwNTIpOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsTm9ybWFsM2Z2KE4wNjEpOworICAgIGdsVmVydGV4M2Z2KFAwNjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYxKTsKKyAgICBnbFZlcnRleDNmdihQMDYxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA2MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNjEpOworICAgIGdsVmVydGV4M2Z2KFAwNjEpOworICAgIGdsTm9ybWFsM2Z2KE4wNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbE5vcm1hbDNmdihOMDYxKTsKKyAgICBnbFZlcnRleDNmdihQMDYxKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitGaXNoMDA1KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNTIpOworICAgIGdsVmVydGV4M2Z2KFAwNTIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwNih2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitGaXNoMDA3KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDY0KTsKKyAgICBnbFZlcnRleDNmdihQMDY0KTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitGaXNoMDA4KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitGaXNoMDA5KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaF8xKHZvaWQpCit7CisgICAgRmlzaDAwNCgpOworICAgIEZpc2gwMDUoKTsKKyAgICBGaXNoMDAzKCk7CisgICAgRmlzaDAwNygpOworICAgIEZpc2gwMDYoKTsKKyAgICBGaXNoMDAyKCk7CisgICAgRmlzaDAwOCgpOworICAgIEZpc2gwMDkoKTsKKyAgICBGaXNoMDAxKCk7Cit9CisKK3ZvaWQKK0Zpc2hfMih2b2lkKQoreworICAgIEZpc2gwMDUoKTsKKyAgICBGaXNoMDA0KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDgoKTsKKyAgICBGaXNoMDA2KCk7CisgICAgRmlzaDAwMigpOworICAgIEZpc2gwMDcoKTsKKyAgICBGaXNoMDA5KCk7CisgICAgRmlzaDAwMSgpOworfQorCit2b2lkCitGaXNoXzModm9pZCkKK3sKKyAgICBGaXNoMDA1KCk7CisgICAgRmlzaDAwNCgpOworICAgIEZpc2gwMDcoKTsKKyAgICBGaXNoMDAzKCk7CisgICAgRmlzaDAwMigpOworICAgIEZpc2gwMDgoKTsKKyAgICBGaXNoMDA5KCk7CisgICAgRmlzaDAwMSgpOworICAgIEZpc2gwMDYoKTsKK30KKwordm9pZAorRmlzaF80KHZvaWQpCit7CisgICAgRmlzaDAwNSgpOworICAgIEZpc2gwMDQoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDIoKTsKKyAgICBGaXNoMDA3KCk7CisgICAgRmlzaDAwOSgpOworICAgIEZpc2gwMDEoKTsKKyAgICBGaXNoMDA2KCk7Cit9CisKK3ZvaWQKK0Zpc2hfNSh2b2lkKQoreworICAgIEZpc2gwMDkoKTsKKyAgICBGaXNoMDA2KCk7CisgICAgRmlzaDAwNygpOworICAgIEZpc2gwMDEoKTsKKyAgICBGaXNoMDAyKCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDgoKTsKKyAgICBGaXNoMDA0KCk7CisgICAgRmlzaDAwNSgpOworfQorCit2b2lkCitGaXNoXzYodm9pZCkKK3sKKyAgICBGaXNoMDA5KCk7CisgICAgRmlzaDAwNigpOworICAgIEZpc2gwMDgoKTsKKyAgICBGaXNoMDAxKCk7CisgICAgRmlzaDAwMigpOworICAgIEZpc2gwMDcoKTsKKyAgICBGaXNoMDAzKCk7CisgICAgRmlzaDAwNCgpOworICAgIEZpc2gwMDUoKTsKK30KKwordm9pZAorRmlzaF83KHZvaWQpCit7CisgICAgRmlzaDAwOSgpOworICAgIEZpc2gwMDEoKTsKKyAgICBGaXNoMDA3KCk7CisgICAgRmlzaDAwNSgpOworICAgIEZpc2gwMDIoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDQoKTsKKyAgICBGaXNoMDA2KCk7Cit9CisKK3ZvaWQKK0Zpc2hfOCh2b2lkKQoreworICAgIEZpc2gwMDkoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwMSgpOworICAgIEZpc2gwMDIoKTsKKyAgICBGaXNoMDA3KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDUoKTsKKyAgICBGaXNoMDA0KCk7CisgICAgRmlzaDAwNigpOworfQorCit2b2lkCitEcmF3U2hhcmsoZmlzaFJlYyAqIGZpc2gpCit7CisgICAgZmxvYXQgbWF0WzRdWzRdOworICAgIGludCBuOworICAgIGZsb2F0IHNlZzEsIHNlZzIsIHNlZzMsIHNlZzQsIHNlZ3VwOworICAgIGZsb2F0IHRocmFzaCwgY2hvbXA7CisKKyAgICBmaXNoLT5odGFpbCA9IChpbnQpIChmaXNoLT5odGFpbCAtIChpbnQpICg1LjAgKiBmaXNoLT52KSkgJSAzNjA7CisKKyAgICB0aHJhc2ggPSA1MC4wICogZmlzaC0+djsKKworICAgIHNlZzEgPSAwLjYgKiB0aHJhc2ggKiBzaW4oZmlzaC0+aHRhaWwgKiBSUkFEKTsKKyAgICBzZWcyID0gMS44ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDQ1LjApICogUlJBRCk7CisgICAgc2VnMyA9IDMuMCAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyA5MC4wKSAqIFJSQUQpOworICAgIHNlZzQgPSA0LjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgMTEwLjApICogUlJBRCk7CisKKyAgICBjaG9tcCA9IDAuMDsKKyAgICBpZiAoZmlzaC0+diA+IDIuMCkgeworICAgICAgICBjaG9tcCA9IC0oZmlzaC0+diAtIDIuMCkgKiAyMDAuMDsKKyAgICB9CisgICAgUDAwNFsxXSA9IGlQMDA0WzFdICsgY2hvbXA7CisgICAgUDAwN1sxXSA9IGlQMDA3WzFdICsgY2hvbXA7CisgICAgUDAxMFsxXSA9IGlQMDEwWzFdICsgY2hvbXA7CisgICAgUDAxMVsxXSA9IGlQMDExWzFdICsgY2hvbXA7CisKKyAgICBQMDIzWzBdID0gaVAwMjNbMF0gKyBzZWcxOworICAgIFAwMjRbMF0gPSBpUDAyNFswXSArIHNlZzE7CisgICAgUDAyNVswXSA9IGlQMDI1WzBdICsgc2VnMTsKKyAgICBQMDI2WzBdID0gaVAwMjZbMF0gKyBzZWcxOworICAgIFAwMjdbMF0gPSBpUDAyN1swXSArIHNlZzE7CisgICAgUDAyOFswXSA9IGlQMDI4WzBdICsgc2VnMTsKKyAgICBQMDI5WzBdID0gaVAwMjlbMF0gKyBzZWcxOworICAgIFAwMzBbMF0gPSBpUDAzMFswXSArIHNlZzE7CisgICAgUDAzMVswXSA9IGlQMDMxWzBdICsgc2VnMTsKKyAgICBQMDMyWzBdID0gaVAwMzJbMF0gKyBzZWcxOworICAgIFAwMzNbMF0gPSBpUDAzM1swXSArIHNlZzI7CisgICAgUDAzNFswXSA9IGlQMDM0WzBdICsgc2VnMjsKKyAgICBQMDM1WzBdID0gaVAwMzVbMF0gKyBzZWcyOworICAgIFAwMzZbMF0gPSBpUDAzNlswXSArIHNlZzI7CisgICAgUDAzN1swXSA9IGlQMDM3WzBdICsgc2VnMjsKKyAgICBQMDM4WzBdID0gaVAwMzhbMF0gKyBzZWcyOworICAgIFAwMzlbMF0gPSBpUDAzOVswXSArIHNlZzI7CisgICAgUDA0MFswXSA9IGlQMDQwWzBdICsgc2VnMjsKKyAgICBQMDQxWzBdID0gaVAwNDFbMF0gKyBzZWcyOworICAgIFAwNDJbMF0gPSBpUDA0MlswXSArIHNlZzI7CisgICAgUDA0M1swXSA9IGlQMDQzWzBdICsgc2VnMzsKKyAgICBQMDQ0WzBdID0gaVAwNDRbMF0gKyBzZWczOworICAgIFAwNDVbMF0gPSBpUDA0NVswXSArIHNlZzM7CisgICAgUDA0NlswXSA9IGlQMDQ2WzBdICsgc2VnMzsKKyAgICBQMDQ3WzBdID0gaVAwNDdbMF0gKyBzZWczOworICAgIFAwNDhbMF0gPSBpUDA0OFswXSArIHNlZzM7CisgICAgUDA0OVswXSA9IGlQMDQ5WzBdICsgc2VnMzsKKyAgICBQMDUwWzBdID0gaVAwNTBbMF0gKyBzZWczOworICAgIFAwNTFbMF0gPSBpUDA1MVswXSArIHNlZzM7CisgICAgUDA1MlswXSA9IGlQMDUyWzBdICsgc2VnMzsKKyAgICBQMDAyWzBdID0gaVAwMDJbMF0gKyBzZWc0OworICAgIFAwNjFbMF0gPSBpUDA2MVswXSArIHNlZzQ7CisgICAgUDA2OVswXSA9IGlQMDY5WzBdICsgc2VnNDsKKyAgICBQMDcwWzBdID0gaVAwNzBbMF0gKyBzZWc0OworCisgICAgZmlzaC0+dnRhaWwgKz0gKChmaXNoLT5kdGhldGEgLSBmaXNoLT52dGFpbCkgKiAwLjEpOworCisgICAgaWYgKGZpc2gtPnZ0YWlsID4gMC41KSB7CisgICAgICAgIGZpc2gtPnZ0YWlsID0gMC41OworICAgIH0gZWxzZSBpZiAoZmlzaC0+dnRhaWwgPCAtMC41KSB7CisgICAgICAgIGZpc2gtPnZ0YWlsID0gLTAuNTsKKyAgICB9CisgICAgc2VndXAgPSB0aHJhc2ggKiBmaXNoLT52dGFpbDsKKworICAgIFAwMjNbMV0gPSBpUDAyM1sxXSArIHNlZ3VwOworICAgIFAwMjRbMV0gPSBpUDAyNFsxXSArIHNlZ3VwOworICAgIFAwMjVbMV0gPSBpUDAyNVsxXSArIHNlZ3VwOworICAgIFAwMjZbMV0gPSBpUDAyNlsxXSArIHNlZ3VwOworICAgIFAwMjdbMV0gPSBpUDAyN1sxXSArIHNlZ3VwOworICAgIFAwMjhbMV0gPSBpUDAyOFsxXSArIHNlZ3VwOworICAgIFAwMjlbMV0gPSBpUDAyOVsxXSArIHNlZ3VwOworICAgIFAwMzBbMV0gPSBpUDAzMFsxXSArIHNlZ3VwOworICAgIFAwMzFbMV0gPSBpUDAzMVsxXSArIHNlZ3VwOworICAgIFAwMzJbMV0gPSBpUDAzMlsxXSArIHNlZ3VwOworICAgIFAwMzNbMV0gPSBpUDAzM1sxXSArIHNlZ3VwICogNS4wOworICAgIFAwMzRbMV0gPSBpUDAzNFsxXSArIHNlZ3VwICogNS4wOworICAgIFAwMzVbMV0gPSBpUDAzNVsxXSArIHNlZ3VwICogNS4wOworICAgIFAwMzZbMV0gPSBpUDAzNlsxXSArIHNlZ3VwICogNS4wOworICAgIFAwMzdbMV0gPSBpUDAzN1sxXSArIHNlZ3VwICogNS4wOworICAgIFAwMzhbMV0gPSBpUDAzOFsxXSArIHNlZ3VwICogNS4wOworICAgIFAwMzlbMV0gPSBpUDAzOVsxXSArIHNlZ3VwICogNS4wOworICAgIFAwNDBbMV0gPSBpUDA0MFsxXSArIHNlZ3VwICogNS4wOworICAgIFAwNDFbMV0gPSBpUDA0MVsxXSArIHNlZ3VwICogNS4wOworICAgIFAwNDJbMV0gPSBpUDA0MlsxXSArIHNlZ3VwICogNS4wOworICAgIFAwNDNbMV0gPSBpUDA0M1sxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDQ0WzFdID0gaVAwNDRbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDA0NVsxXSA9IGlQMDQ1WzFdICsgc2VndXAgKiAxMi4wOworICAgIFAwNDZbMV0gPSBpUDA0NlsxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDQ3WzFdID0gaVAwNDdbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDA0OFsxXSA9IGlQMDQ4WzFdICsgc2VndXAgKiAxMi4wOworICAgIFAwNDlbMV0gPSBpUDA0OVsxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDUwWzFdID0gaVAwNTBbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDA1MVsxXSA9IGlQMDUxWzFdICsgc2VndXAgKiAxMi4wOworICAgIFAwNTJbMV0gPSBpUDA1MlsxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDAyWzFdID0gaVAwMDJbMV0gKyBzZWd1cCAqIDE3LjA7CisgICAgUDA2MVsxXSA9IGlQMDYxWzFdICsgc2VndXAgKiAxNy4wOworICAgIFAwNjlbMV0gPSBpUDA2OVsxXSArIHNlZ3VwICogMTcuMDsKKyAgICBQMDcwWzFdID0gaVAwNzBbMV0gKyBzZWd1cCAqIDE3LjA7CisKKyAgICBnbFB1c2hNYXRyaXgoKTsKKworICAgIGdsVHJhbnNsYXRlZigwLjAsIDAuMCwgLTMwMDAuMCk7CisKKyAgICBnbEdldEZsb2F0dihHTF9NT0RFTFZJRVdfTUFUUklYLCAmbWF0WzBdWzBdKTsKKyAgICBuID0gMDsKKyAgICBpZiAobWF0WzBdWzJdID49IDAuMCkgeworICAgICAgICBuICs9IDE7CisgICAgfQorICAgIGlmIChtYXRbMV1bMl0gPj0gMC4wKSB7CisgICAgICAgIG4gKz0gMjsKKyAgICB9CisgICAgaWYgKG1hdFsyXVsyXSA+PSAwLjApIHsKKyAgICAgICAgbiArPSA0OworICAgIH0KKyAgICBnbFNjYWxlZigyLjAsIDEuMCwgMS4wKTsKKworICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgc3dpdGNoIChuKSB7CisgICAgY2FzZSAwOgorICAgICAgICBGaXNoXzEoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBGaXNoXzIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBGaXNoXzMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBGaXNoXzQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBGaXNoXzUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBGaXNoXzYoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBGaXNoXzcoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICBGaXNoXzgoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworCisgICAgZ2xQb3BNYXRyaXgoKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9zd2ltLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvc3dpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzdiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvc3dpbS5jCkBAIC0wLDAgKzEsMTg4IEBACisvKioKKyAqIChjKSBDb3B5cmlnaHQgMTk5MywgMTk5NCwgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQUxMIFJJR0hUUyBSRVNFUlZFRAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZQorICogYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKKyAqIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSEUgTUFURVJJQUwgRU1CT0RJRUQgT04gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBUTyBZT1UgIkFTLUlTIgorICogQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLAorICogSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCisgKiBHUkFQSElDUywgSU5DLiAgQkUgTElBQkxFIFRPIFlPVSBPUiBBTllPTkUgRUxTRSBGT1IgQU5ZIERJUkVDVCwKKyAqIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKKyAqIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sCisgKiBMT1NTIE9GIFBST0ZJVCwgTE9TUyBPRiBVU0UsIFNBVklOR1MgT1IgUkVWRU5VRSwgT1IgVEhFIENMQUlNUyBPRgorICogVEhJUkQgUEFSVElFUywgV0hFVEhFUiBPUiBOT1QgU0lMSUNPTiBHUkFQSElDUywgSU5DLiAgSEFTIEJFRU4KKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggTE9TUywgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogUE9TU0VTU0lPTiwgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cworICogVXNlLCBkdXBsaWNhdGlvbiwgb3IgZGlzY2xvc3VyZSBieSB0aGUgR292ZXJubWVudCBpcyBzdWJqZWN0IHRvCisgKiByZXN0cmljdGlvbnMgc2V0IGZvcnRoIGluIEZBUiA1Mi4yMjcuMTkoYykoMikgb3Igc3VicGFyYWdyYXBoCisgKiAoYykoMSkoaWkpIG9mIHRoZSBSaWdodHMgaW4gVGVjaG5pY2FsIERhdGEgYW5kIENvbXB1dGVyIFNvZnR3YXJlCisgKiBjbGF1c2UgYXQgREZBUlMgMjUyLjIyNy03MDEzIGFuZC9vciBpbiBzaW1pbGFyIG9yIHN1Y2Nlc3NvcgorICogY2xhdXNlcyBpbiB0aGUgRkFSIG9yIHRoZSBET0Qgb3IgTkFTQSBGQVIgU3VwcGxlbWVudC4KKyAqIFVucHVibGlzaGVkLS0gcmlnaHRzIHJlc2VydmVkIHVuZGVyIHRoZSBjb3B5cmlnaHQgbGF3cyBvZiB0aGUKKyAqIFVuaXRlZCBTdGF0ZXMuICBDb250cmFjdG9yL21hbnVmYWN0dXJlciBpcyBTaWxpY29uIEdyYXBoaWNzLAorICogSW5jLiwgMjAxMSBOLiAgU2hvcmVsaW5lIEJsdmQuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDAzOS03MzExLgorICoKKyAqIE9wZW5HTChUTSkgaXMgYSB0cmFkZW1hcmsgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLyogRm9yIHJhbmQoKS4gKi8KKyNpbmNsdWRlIDxHTFVUL2dsdXQuaD4KKyNpbmNsdWRlICJhdGxhbnRpcy5oIgorCit2b2lkCitGaXNoVHJhbnNmb3JtKGZpc2hSZWMgKiBmaXNoKQoreworCisgICAgZ2xUcmFuc2xhdGVmKGZpc2gtPnksIGZpc2gtPnosIC1maXNoLT54KTsKKyAgICBnbFJvdGF0ZWYoLWZpc2gtPnBzaSwgMC4wLCAxLjAsIDAuMCk7CisgICAgZ2xSb3RhdGVmKGZpc2gtPnRoZXRhLCAxLjAsIDAuMCwgMC4wKTsKKyAgICBnbFJvdGF0ZWYoLWZpc2gtPnBoaSwgMC4wLCAwLjAsIDEuMCk7Cit9CisKK3ZvaWQKK1doYWxlUGlsb3QoZmlzaFJlYyAqIGZpc2gpCit7CisKKyAgICBmaXNoLT5waGkgPSAtMjAuMDsKKyAgICBmaXNoLT50aGV0YSA9IDAuMDsKKyAgICBmaXNoLT5wc2kgLT0gMC41OworCisgICAgZmlzaC0+eCArPSBXSEFMRVNQRUVEICogZmlzaC0+diAqIGNvcyhmaXNoLT5wc2kgLyBSQUQpICogY29zKGZpc2gtPnRoZXRhIC8gUkFEKTsKKyAgICBmaXNoLT55ICs9IFdIQUxFU1BFRUQgKiBmaXNoLT52ICogc2luKGZpc2gtPnBzaSAvIFJBRCkgKiBjb3MoZmlzaC0+dGhldGEgLyBSQUQpOworICAgIGZpc2gtPnogKz0gV0hBTEVTUEVFRCAqIGZpc2gtPnYgKiBzaW4oZmlzaC0+dGhldGEgLyBSQUQpOworfQorCit2b2lkCitTaGFya1BpbG90KGZpc2hSZWMgKiBmaXNoKQoreworICAgIHN0YXRpYyBpbnQgc2lnbiA9IDE7CisgICAgZmxvYXQgWCwgWSwgWiwgdHBzaSwgdHRoZXRhLCB0aGV0YWw7CisKKyAgICBmaXNoLT54dCA9IDYwMDAwLjA7CisgICAgZmlzaC0+eXQgPSAwLjA7CisgICAgZmlzaC0+enQgPSAwLjA7CisKKyAgICBYID0gZmlzaC0+eHQgLSBmaXNoLT54OworICAgIFkgPSBmaXNoLT55dCAtIGZpc2gtPnk7CisgICAgWiA9IGZpc2gtPnp0IC0gZmlzaC0+ejsKKworICAgIHRoZXRhbCA9IGZpc2gtPnRoZXRhOworCisgICAgdHRoZXRhID0gUkFEICogYXRhbihaIC8gKHNxcnQoWCAqIFggKyBZICogWSkpKTsKKworICAgIGlmICh0dGhldGEgPiBmaXNoLT50aGV0YSArIDAuMjUpIHsKKyAgICAgICAgZmlzaC0+dGhldGEgKz0gMC41OworICAgIH0gZWxzZSBpZiAodHRoZXRhIDwgZmlzaC0+dGhldGEgLSAwLjI1KSB7CisgICAgICAgIGZpc2gtPnRoZXRhIC09IDAuNTsKKyAgICB9CisgICAgaWYgKGZpc2gtPnRoZXRhID4gOTAuMCkgeworICAgICAgICBmaXNoLT50aGV0YSA9IDkwLjA7CisgICAgfQorICAgIGlmIChmaXNoLT50aGV0YSA8IC05MC4wKSB7CisgICAgICAgIGZpc2gtPnRoZXRhID0gLTkwLjA7CisgICAgfQorICAgIGZpc2gtPmR0aGV0YSA9IGZpc2gtPnRoZXRhIC0gdGhldGFsOworCisgICAgdHBzaSA9IFJBRCAqIGF0YW4yKFksIFgpOworCisgICAgZmlzaC0+YXR0YWNrID0gMDsKKworICAgIGlmIChmYWJzKHRwc2kgLSBmaXNoLT5wc2kpIDwgMTAuMCkgeworICAgICAgICBmaXNoLT5hdHRhY2sgPSAxOworICAgIH0gZWxzZSBpZiAoZmFicyh0cHNpIC0gZmlzaC0+cHNpKSA8IDQ1LjApIHsKKyAgICAgICAgaWYgKGZpc2gtPnBzaSA+IHRwc2kpIHsKKyAgICAgICAgICAgIGZpc2gtPnBzaSAtPSAwLjU7CisgICAgICAgICAgICBpZiAoZmlzaC0+cHNpIDwgLTE4MC4wKSB7CisgICAgICAgICAgICAgICAgZmlzaC0+cHNpICs9IDM2MC4wOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZpc2gtPnBzaSA8IHRwc2kpIHsKKyAgICAgICAgICAgIGZpc2gtPnBzaSArPSAwLjU7CisgICAgICAgICAgICBpZiAoZmlzaC0+cHNpID4gMTgwLjApIHsKKyAgICAgICAgICAgICAgICBmaXNoLT5wc2kgLT0gMzYwLjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocmFuZCgpICUgMTAwID4gOTgpIHsKKyAgICAgICAgICAgIHNpZ24gPSAxIC0gc2lnbjsKKyAgICAgICAgfQorICAgICAgICBmaXNoLT5wc2kgKz0gc2lnbjsKKyAgICAgICAgaWYgKGZpc2gtPnBzaSA+IDE4MC4wKSB7CisgICAgICAgICAgICBmaXNoLT5wc2kgLT0gMzYwLjA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpc2gtPnBzaSA8IC0xODAuMCkgeworICAgICAgICAgICAgZmlzaC0+cHNpICs9IDM2MC4wOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpc2gtPmF0dGFjaykgeworICAgICAgICBpZiAoZmlzaC0+diA8IDEuMSkgeworICAgICAgICAgICAgZmlzaC0+c3B1cnQgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChmaXNoLT5zcHVydCkgeworICAgICAgICAgICAgZmlzaC0+diArPSAwLjI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpc2gtPnYgPiA1LjApIHsKKyAgICAgICAgICAgIGZpc2gtPnNwdXJ0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGZpc2gtPnYgPiAxLjApICYmICghZmlzaC0+c3B1cnQpKSB7CisgICAgICAgICAgICBmaXNoLT52IC09IDAuMjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghKHJhbmQoKSAlIDQwMCkgJiYgKCFmaXNoLT5zcHVydCkpIHsKKyAgICAgICAgICAgIGZpc2gtPnNwdXJ0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlzaC0+c3B1cnQpIHsKKyAgICAgICAgICAgIGZpc2gtPnYgKz0gMC4wNTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlzaC0+diA+IDMuMCkgeworICAgICAgICAgICAgZmlzaC0+c3B1cnQgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICgoZmlzaC0+diA+IDEuMCkgJiYgKCFmaXNoLT5zcHVydCkpIHsKKyAgICAgICAgICAgIGZpc2gtPnYgLT0gMC4wNTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpc2gtPnggKz0gU0hBUktTUEVFRCAqIGZpc2gtPnYgKiBjb3MoZmlzaC0+cHNpIC8gUkFEKSAqIGNvcyhmaXNoLT50aGV0YSAvIFJBRCk7CisgICAgZmlzaC0+eSArPSBTSEFSS1NQRUVEICogZmlzaC0+diAqIHNpbihmaXNoLT5wc2kgLyBSQUQpICogY29zKGZpc2gtPnRoZXRhIC8gUkFEKTsKKyAgICBmaXNoLT56ICs9IFNIQVJLU1BFRUQgKiBmaXNoLT52ICogc2luKGZpc2gtPnRoZXRhIC8gUkFEKTsKK30KKwordm9pZAorU2hhcmtNaXNzKGludCBpKQoreworICAgIGludCBqOworICAgIGZsb2F0IGF2b2lkLCB0aGV0YWw7CisgICAgZmxvYXQgWCwgWSwgWiwgUjsKKworICAgIGZvciAoaiA9IDA7IGogPCBOVU1fU0hBUktTOyBqKyspIHsKKyAgICAgICAgaWYgKGogIT0gaSkgeworICAgICAgICAgICAgWCA9IHNoYXJrc1tqXS54IC0gc2hhcmtzW2ldLng7CisgICAgICAgICAgICBZID0gc2hhcmtzW2pdLnkgLSBzaGFya3NbaV0ueTsKKyAgICAgICAgICAgIFogPSBzaGFya3Nbal0ueiAtIHNoYXJrc1tpXS56OworCisgICAgICAgICAgICBSID0gc3FydChYICogWCArIFkgKiBZICsgWiAqIFopOworCisgICAgICAgICAgICBhdm9pZCA9IDEuMDsKKyAgICAgICAgICAgIHRoZXRhbCA9IHNoYXJrc1tpXS50aGV0YTsKKworICAgICAgICAgICAgaWYgKFIgPCBTSEFSS1NJWkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoWiA+IDAuMCkgeworICAgICAgICAgICAgICAgICAgICBzaGFya3NbaV0udGhldGEgLT0gYXZvaWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2hhcmtzW2ldLnRoZXRhICs9IGF2b2lkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoYXJrc1tpXS5kdGhldGEgKz0gKHNoYXJrc1tpXS50aGV0YSAtIHRoZXRhbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvd2hhbGUuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy93aGFsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODY0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvd2hhbGUuYwpAQCAtMCwwICsxLDE3OTggQEAKKy8qKgorICogKGMpIENvcHlyaWdodCAxOTkzLCAxOTk0LCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBTEwgUklHSFRTIFJFU0VSVkVECisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQgbm90aWNlCisgKiBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdAorICogdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZworICogb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorICoKKyAqIFRIRSBNQVRFUklBTCBFTUJPRElFRCBPTiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIFRPIFlPVSAiQVMtSVMiCisgKiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsCisgKiBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIElOIE5PIEVWRU5UIFNIQUxMIFNJTElDT04KKyAqIEdSQVBISUNTLCBJTkMuICBCRSBMSUFCTEUgVE8gWU9VIE9SIEFOWU9ORSBFTFNFIEZPUiBBTlkgRElSRUNULAorICogU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWQorICogS0lORCwgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwKKyAqIExPU1MgT0YgUFJPRklULCBMT1NTIE9GIFVTRSwgU0FWSU5HUyBPUiBSRVZFTlVFLCBPUiBUSEUgQ0xBSU1TIE9GCisgKiBUSElSRCBQQVJUSUVTLCBXSEVUSEVSIE9SIE5PVCBTSUxJQ09OIEdSQVBISUNTLCBJTkMuICBIQVMgQkVFTgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBMT1NTLCBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBQT1NTRVNTSU9OLCBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzCisgKiBVc2UsIGR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlIGJ5IHRoZSBHb3Zlcm5tZW50IGlzIHN1YmplY3QgdG8KKyAqIHJlc3RyaWN0aW9ucyBzZXQgZm9ydGggaW4gRkFSIDUyLjIyNy4xOShjKSgyKSBvciBzdWJwYXJhZ3JhcGgKKyAqIChjKSgxKShpaSkgb2YgdGhlIFJpZ2h0cyBpbiBUZWNobmljYWwgRGF0YSBhbmQgQ29tcHV0ZXIgU29mdHdhcmUKKyAqIGNsYXVzZSBhdCBERkFSUyAyNTIuMjI3LTcwMTMgYW5kL29yIGluIHNpbWlsYXIgb3Igc3VjY2Vzc29yCisgKiBjbGF1c2VzIGluIHRoZSBGQVIgb3IgdGhlIERPRCBvciBOQVNBIEZBUiBTdXBwbGVtZW50LgorICogVW5wdWJsaXNoZWQtLSByaWdodHMgcmVzZXJ2ZWQgdW5kZXIgdGhlIGNvcHlyaWdodCBsYXdzIG9mIHRoZQorICogVW5pdGVkIFN0YXRlcy4gIENvbnRyYWN0b3IvbWFudWZhY3R1cmVyIGlzIFNpbGljb24gR3JhcGhpY3MsCisgKiBJbmMuLCAyMDExIE4uICBTaG9yZWxpbmUgQmx2ZC4sIE1vdW50YWluIFZpZXcsIENBIDk0MDM5LTczMTEuCisgKgorICogT3BlbkdMKFRNKSBpcyBhIHRyYWRlbWFyayBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKi8KKyNpbmNsdWRlIDxHTFVUL2dsdXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiYXRsYW50aXMuaCIKKy8qICpJTkRFTlQtT0ZGKiAqLworc3RhdGljIGZsb2F0IE4wMDFbM10gPSB7MC4wMTkyNDkgLDAuMDExMzQwICwtMC45OTk3NTB9Oworc3RhdGljIGZsb2F0IE4wMDJbM10gPSB7LTAuMTMyNTc5ICwwLjk1NDU0NyAsMC4yNjY5NTJ9Oworc3RhdGljIGZsb2F0IE4wMDNbM10gPSB7LTAuMTk2MDYxICwwLjk4MDM5MiAsLTAuMDE5Nzc4fTsKK3N0YXRpYyBmbG9hdCBOMDA0WzNdID0gezAuNjk1NDYxICwwLjYwNDcwNCAsMC4zODgxNTh9Oworc3RhdGljIGZsb2F0IE4wMDVbM10gPSB7MC44NzA2MDAgLDAuNDI1NzU0ICwwLjI0NjU1N307CitzdGF0aWMgZmxvYXQgTjAwNlszXSA9IHstMC44ODExOTEgLDAuMzkyMDEyICwwLjI2NDI1MX07CitzdGF0aWMgZmxvYXQgTjAwOFszXSA9IHstMC4zNDE0MzcgLDAuODg3NDc3ICwwLjMwOTUyM307CitzdGF0aWMgZmxvYXQgTjAwOVszXSA9IHswLjEyNDAzNSAsLTAuOTkyMjc4ICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjAxMFszXSA9IHswLjI0MjUzNiAsMC4wMDAwMDAgLC0wLjk3MDE0M307CitzdGF0aWMgZmxvYXQgTjAxMVszXSA9IHswLjU4ODE3MiAsMC4wMDAwMDAgLDAuODA4NzM2fTsKK3N0YXRpYyBmbG9hdCBOMDEyWzNdID0gezAuOTI5ODI0ICwtMC4zNDA2MjMgLC0wLjEzOTI5OH07CitzdGF0aWMgZmxvYXQgTjAxM1szXSA9IHswLjk1NDE4MyAsMC4yNjcxMDggLC0wLjEzNDg2NX07CitzdGF0aWMgZmxvYXQgTjAxNFszXSA9IHswLjQ5NTEyNyAsMC44NTU0MzYgLC0wLjE1MTkxNH07CitzdGF0aWMgZmxvYXQgTjAxNVszXSA9IHstMC4zOTAxOTkgLDAuOTA2NTY5ICwtMC4xNjA4Njd9Oworc3RhdGljIGZsb2F0IE4wMTZbM10gPSB7LTAuOTIzNjA1ICwwLjM1NDU4MSAsLTAuMTQ1NjkyfTsKK3N0YXRpYyBmbG9hdCBOMDE3WzNdID0gey0wLjk1NTc5NiAsLTAuMjYwNjY3ICwtMC4xMzYwMzZ9Oworc3RhdGljIGZsb2F0IE4wMThbM10gPSB7LTAuNTAxMjgzICwtMC44NTM0NjIgLC0wLjE0MjU0MH07CitzdGF0aWMgZmxvYXQgTjAxOVszXSA9IHswLjQwNTMwMCAsLTAuOTAxOTc0ICwtMC4xNDg5MTN9Oworc3RhdGljIGZsb2F0IE4wMjBbM10gPSB7MC45MDk5MTMgLC0wLjM5Mjc0NiAsLTAuMTMzNDUxfTsKK3N0YXRpYyBmbG9hdCBOMDIxWzNdID0gezAuOTM2NDk0ICwwLjMzMTE0NyAsLTAuMTE1NDE0fTsKK3N0YXRpYyBmbG9hdCBOMDIyWzNdID0gezAuNjAwMTMxICwwLjc5MzcyNCAsLTAuMDk5MjIyfTsKK3N0YXRpYyBmbG9hdCBOMDIzWzNdID0gey0wLjIzMTU1NiAsMC45NjgzNjEgLC0wLjA5MzA1M307CitzdGF0aWMgZmxvYXQgTjAyNFszXSA9IHstMC44NDQzNjkgLDAuNTI1MzMwICwtMC4xMDUyMTF9Oworc3RhdGljIGZsb2F0IE4wMjVbM10gPSB7LTAuOTgyNzI1ICwtMC4xMzYzMjkgLC0wLjEyNTE2NH07CitzdGF0aWMgZmxvYXQgTjAyNlszXSA9IHstMC41NjA4NDQgLC0wLjgyMjY1NCAsLTAuMDkzMjQxfTsKK3N0YXRpYyBmbG9hdCBOMDI3WzNdID0gezAuMjYzODg0ICwtMC45NTk5ODEgLC0wLjA5MzgxN307CitzdGF0aWMgZmxvYXQgTjAyOFszXSA9IHswLjg0MjA1NyAsLTAuNTI1MTkyICwtMC4xMjI5Mzh9Oworc3RhdGljIGZsb2F0IE4wMjlbM10gPSB7MC45MjE2MjAgLDAuMzY3NTY1ICwtMC4xMjQ1NDZ9Oworc3RhdGljIGZsb2F0IE4wMzBbM10gPSB7MC42MTM5MjcgLDAuNzg0MTA5ICwtMC4wOTA5MTh9Oworc3RhdGljIGZsb2F0IE4wMzFbM10gPSB7LTAuNDQ4NzU0ICwwLjg4ODI2MSAsLTAuMDk4MDM3fTsKK3N0YXRpYyBmbG9hdCBOMDMyWzNdID0gey0wLjg5MTg2NSAsMC40MzQzNzYgLC0wLjEyNjA3N307CitzdGF0aWMgZmxvYXQgTjAzM1szXSA9IHstMC44ODE0NDcgLC0wLjQ0ODAxNyAsLTAuMTQ5NDM3fTsKK3N0YXRpYyBmbG9hdCBOMDM0WzNdID0gey0wLjM0NTY0NyAsLTAuOTIyMDU3ICwtMC4xNzQxODN9Oworc3RhdGljIGZsb2F0IE4wMzVbM10gPSB7MC4zMDc5OTggLC0wLjk0MTM3MSAsLTAuMTM3Njg4fTsKK3N0YXRpYyBmbG9hdCBOMDM2WzNdID0gezAuODA2MzE2ICwtMC41NzQ2NDcgLC0wLjE0MDEyNH07CitzdGF0aWMgZmxvYXQgTjAzN1szXSA9IHswLjk2MTM0NiAsMC4yMzM2NDYgLC0wLjE0NTY4MX07CitzdGF0aWMgZmxvYXQgTjAzOFszXSA9IHswLjQ4ODQ1MSAsMC44NjU1ODYgLC0wLjExMDM1MX07CitzdGF0aWMgZmxvYXQgTjAzOVszXSA9IHstMC4zNzQyOTAgLDAuOTIxOTUzICwtMC4wOTk1NTN9Oworc3RhdGljIGZsb2F0IE4wNDBbM10gPSB7LTAuOTI4NTA0ICwwLjM0NDUzMyAsLTAuMTM4NDg1fTsKK3N0YXRpYyBmbG9hdCBOMDQxWzNdID0gey0wLjkxODQxOSAsLTAuMzcxNzkyICwtMC4xMzUxODl9Oworc3RhdGljIGZsb2F0IE4wNDJbM10gPSB7LTAuNTIwNjY2ICwtMC44MzM3MDQgLC0wLjE4Mzk2OH07CitzdGF0aWMgZmxvYXQgTjA0M1szXSA9IHswLjMzOTIwNCAsLTAuOTIwMjczICwtMC4xOTUwMzZ9Oworc3RhdGljIGZsb2F0IE4wNDRbM10gPSB7MC45MjE0NzUgLC0wLjM4NzM4MiAsLTAuMDI4NjM2fTsKK3N0YXRpYyBmbG9hdCBOMDQ1WzNdID0gezAuODQyNDY1ICwwLjUzMzMzNSAsLTAuMDc2MjA0fTsKK3N0YXRpYyBmbG9hdCBOMDQ2WzNdID0gezAuMzgwMTEwICwwLjkyNDkzOSAsMC4wMDIwNzN9Oworc3RhdGljIGZsb2F0IE4wNDdbM10gPSB7LTAuMjc2MTI4ICwwLjk2MTA3MyAsLTAuMDA5NTc5fTsKK3N0YXRpYyBmbG9hdCBOMDQ4WzNdID0gey0wLjg3OTY4NCAsMC40NzMwMDEgLC0wLjA0OTI1MH07CitzdGF0aWMgZmxvYXQgTjA0OVszXSA9IHstMC45NDcxODQgLC0wLjMxNzYxNCAsLTAuMDQ0MzIxfTsKK3N0YXRpYyBmbG9hdCBOMDUwWzNdID0gey0wLjY0MjA1OSAsLTAuNzY0OTMzICwtMC4wNTEzNjN9Oworc3RhdGljIGZsb2F0IE4wNTFbM10gPSB7MC40NjY3OTQgLC0wLjg4MDkyMSAsLTAuMDc3OTkwfTsKK3N0YXRpYyBmbG9hdCBOMDUyWzNdID0gezAuODk4NTA5ICwtMC40MzIyNzcgLDAuMDc2Mjc5fTsKK3N0YXRpYyBmbG9hdCBOMDUzWzNdID0gezAuOTM4OTg1ICwwLjMyODE0MSAsMC4xMDMxMDl9Oworc3RhdGljIGZsb2F0IE4wNTRbM10gPSB7MC40NDI0MjAgLDAuODk1NzQ1ICwwLjA0MzY0N307CitzdGF0aWMgZmxvYXQgTjA1NVszXSA9IHstMC4yNTUxNjMgLDAuOTY2NzIzICwwLjAxODQwN307CitzdGF0aWMgZmxvYXQgTjA1NlszXSA9IHstMC44MzM3NjkgLDAuNTQwNjUwICwwLjExMTkyNH07CitzdGF0aWMgZmxvYXQgTjA1N1szXSA9IHstMC45NTM2NTMgLC0wLjI4OTkzOSAsMC4wODA1MDd9Oworc3RhdGljIGZsb2F0IE4wNThbM10gPSB7LTAuNjcyMzU3ICwtMC43MzA1MjQgLDAuMTE5NDYxfTsKK3N0YXRpYyBmbG9hdCBOMDU5WzNdID0gezAuNTIyMjQ5ICwtMC44NDY2NTIgLDAuMTAyMTU3fTsKK3N0YXRpYyBmbG9hdCBOMDYwWzNdID0gezAuODg1ODY4ICwtMC40Mjc2MzEgLDAuMTc5OTE0fTsKK3N0YXRpYyBmbG9hdCBOMDYyWzNdID0gezAuNjQ4OTQyICwwLjc0MzExNiAsMC4xNjMyNTV9Oworc3RhdGljIGZsb2F0IE4wNjNbM10gPSB7LTAuNTc4OTY3ICwwLjgwNzczMCAsMC4xMTEyMTl9Oworc3RhdGljIGZsb2F0IE4wNjVbM10gPSB7LTAuOTA5ODY0ICwtMC4zNTIyMDIgLDAuMjE5MzIxfTsKK3N0YXRpYyBmbG9hdCBOMDY2WzNdID0gey0wLjUwMjU0MSAsLTAuODE4MDkwICwwLjI3OTYxMH07CitzdGF0aWMgZmxvYXQgTjA2N1szXSA9IHswLjMyMjkxOSAsLTAuOTE1MzU4ICwwLjI0MDUwNH07CitzdGF0aWMgZmxvYXQgTjA2OFszXSA9IHswLjI0MjUzNiAsMC4wMDAwMDAgLC0wLjk3MDE0M307CitzdGF0aWMgZmxvYXQgTjA2OVszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDcwWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNzFbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA3MlszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDczWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNzRbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA3NVszXSA9IHswLjAzMTIyMCAsMC45OTkwMjUgLC0wLjAzMTIyMH07CitzdGF0aWMgZmxvYXQgTjA3NlszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDc3WzNdID0gezAuNDQ2ODIxICwwLjg5MzY0MiAsMC4wNDE4ODl9Oworc3RhdGljIGZsb2F0IE4wNzhbM10gPSB7MC44NjMwMzUgLC0wLjEwMDk4MCAsMC40OTQ5NDl9Oworc3RhdGljIGZsb2F0IE4wNzlbM10gPSB7MC41ODU1OTcgLC0wLjgwODIxNSAsMC4wNjIxNzR9Oworc3RhdGljIGZsb2F0IE4wODBbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA4MVszXSA9IHsxLjAwMDAwMCAsMC4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDgyWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wODNbM10gPSB7LTEuMDAwMDAwICwwLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wODRbM10gPSB7LTAuNDc4ODkzICwwLjgzNzEyOSAsLTAuMjY0MzQzfTsKK3N0YXRpYyBmbG9hdCBOMDg1WzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wODZbM10gPSB7MC43NjM5MDkgLDAuNTM5NDU1ICwtMC4zNTQxNjN9Oworc3RhdGljIGZsb2F0IE4wODdbM10gPSB7MC40NDY4MjEgLDAuODkzNjQyICwwLjA0MTg4OX07CitzdGF0aWMgZmxvYXQgTjA4OFszXSA9IHswLjM4NTEzNCAsLTAuOTA4Mjg4ICwwLjE2MzM1Mn07CitzdGF0aWMgZmxvYXQgTjA4OVszXSA9IHstMC42MDU5NTIgLDAuNzc5MjUzICwtMC4xNTk5NjF9Oworc3RhdGljIGZsb2F0IE4wOTBbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5MVszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDkyWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTNbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5NFszXSA9IHsxLjAwMDAwMCAsMC4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDk1WzNdID0gey0xLjAwMDAwMCAsMC4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDk2WzNdID0gezAuNjQ0NDQ0ICwtMC42MjE1MTYgLDAuNDQ1NDMzfTsKK3N0YXRpYyBmbG9hdCBOMDk3WzNdID0gey0wLjc2MDg5NiAsLTAuNDc0NDE2ICwwLjQ0MjY4MX07CitzdGF0aWMgZmxvYXQgTjA5OFszXSA9IHswLjYzNjg4OCAsLTAuNDY0MzE0ICwwLjYxNTQ1Nn07CitzdGF0aWMgZmxvYXQgTjA5OVszXSA9IHstMC43MTAyOTUgLDAuNjQ3MDM4ICwwLjI3NzE2OH07CitzdGF0aWMgZmxvYXQgTjEwMFszXSA9IHswLjAwOTYwNCAsMC45OTM2NTUgLDAuMTEyMDYzfTsKK3N0YXRpYyBmbG9hdCBpUDAwMVszXSA9IHsxOC43NCwgMTMuMTksIDMuNzZ9Oworc3RhdGljIGZsb2F0IFAwMDFbM10gPSB7MTguNzQsIDEzLjE5LCAzLjc2fTsKK3N0YXRpYyBmbG9hdCBQMDAyWzNdID0gezAuMDAsIDM5MC40MiwgMTAyOTIuNTd9Oworc3RhdGljIGZsb2F0IFAwMDNbM10gPSB7NTUuODAsIDYyMi4zMSwgODI1NC4zNX07CitzdGF0aWMgZmxvYXQgUDAwNFszXSA9IHsyMC44MCwgMjQ3LjY2LCAxMDY1Mi4xM307CitzdGF0aWMgZmxvYXQgUDAwNVszXSA9IHs0ODcuNTEsIDE5OC4wNSwgOTM1MC43OH07CitzdGF0aWMgZmxvYXQgUDAwNlszXSA9IHstNDU3LjYxLCAxOTkuMDQsIDkzNTMuMDF9Oworc3RhdGljIGZsb2F0IFAwMDhbM10gPSB7LTM0LjY3LCAyNDcuNjQsIDEwNjYzLjcxfTsKK3N0YXRpYyBmbG9hdCBpUDAwOVszXSA9IHs5Ny40NiwgNjcuNjMsIDU5My44Mn07CitzdGF0aWMgZmxvYXQgaVAwMTBbM10gPSB7LTg0LjMzLCA2Ny42MywgNTg4LjE4fTsKK3N0YXRpYyBmbG9hdCBpUDAxMVszXSA9IHsxMTguNjksIDguOTgsIC02Ni45MX07CitzdGF0aWMgZmxvYXQgUDAwOVszXSA9IHs5Ny40NiwgNjcuNjMsIDU5My44Mn07CitzdGF0aWMgZmxvYXQgUDAxMFszXSA9IHstODQuMzMsIDY3LjYzLCA1ODguMTh9Oworc3RhdGljIGZsb2F0IFAwMTFbM10gPSB7MTE4LjY5LCA4Ljk4LCAtNjYuOTF9Oworc3RhdGljIGZsb2F0IGlQMDEyWzNdID0gezE1Ni40OCwgLTMxLjk1LCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDEzWzNdID0gezE2Mi4wMCwgMTEwLjIyLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDE0WzNdID0gezg4LjE2LCAyMjEuNjUsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgaVAwMTVbM10gPSB7LTY1LjIxLCAyMzEuMTYsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgaVAwMTZbM10gPSB7LTE1Ni40OCwgMTIxLjk3LCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDE3WzNdID0gey0xNjIuMDAsIC0yMy45MywgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBpUDAxOFszXSA9IHstODguMTYsIC0xMzkuMTAsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgaVAwMTlbM10gPSB7NjUuMjEsIC0xNDguNjEsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgaVAwMjBbM10gPSB7MjQ2Ljg3LCAtOTguNzMsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IGlQMDIxWzNdID0gezI1My4xNywgMTI3Ljc2LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBpUDAyMlszXSA9IHsxMzIuMzQsIDI3MC43NywgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgaVAwMjNbM10gPSB7LTk3Ljg4LCAyODUuMDQsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IGlQMDI0WzNdID0gey0yMjIuOTcsIDEzOS44MCwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgaVAwMjVbM10gPSB7LTIyNS4yOSwgLTg2LjY4LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBpUDAyNlszXSA9IHstMTA4LjQ0LCAtMjI0LjE1LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBpUDAyN1szXSA9IHs5Ny44OCwgLTIyMS41NiwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgaVAwMjhbM10gPSB7NDEwLjU1LCAtMjAwLjY2LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBpUDAyOVszXSA9IHs0MzIuMTksIDE0OC40MiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMzBbM10gPSB7MjAwLjY2LCA0MTAuNTUsIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IGlQMDMxWzNdID0gey0xNDguNDIsIDQzMi4xOSwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMzJbM10gPSB7LTQwNy40OCwgMTcxLjg4LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBpUDAzM1szXSA9IHstNDMyLjE5LCAtMTQ4LjQyLCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBpUDAzNFszXSA9IHstMTQ4Ljg4LCAtMzA5Ljc0LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBpUDAzNVszXSA9IHsxNTYuMzgsIC0zMjAuMTcsIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IGlQMDM2WzNdID0gezUyMy4zOSwgLTMwMy44MSwgNDQyNC41N307CitzdGF0aWMgZmxvYXQgaVAwMzdbM10gPSB7NTc0LjY2LCAyNzYuODQsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDM4WzNdID0gezI0My4wNSwgNDkyLjUwLCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBpUDAzOVszXSA9IHstMTkxLjIzLCA1MjAuMTMsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDQwWzNdID0gey01MjMuMzksIDMwNC4wMSwgNDQyNC41N307CitzdGF0aWMgZmxvYXQgaVAwNDFbM10gPSB7LTU3NC42NiwgLTIzMS44MywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgaVAwNDJbM10gPSB7LTI2Ni45NSwgLTU3OC4xNywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgaVAwNDNbM10gPSB7MjExLjE0LCAtNTc5LjY3LCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBpUDA0NFszXSA9IHs2ODAuNTcsIC0zNzAuMjcsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IGlQMDQ1WzNdID0gezgzNC4wMSwgMzYzLjA5LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA0NlszXSA9IHszNzEuMjksIDYxNC4xMywgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNDdbM10gPSB7LTI5MS40MywgNjIxLjg2LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA0OFszXSA9IHstNzg0LjEzLCAzNjIuNjAsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IGlQMDQ5WzNdID0gey03NDMuMjksIC0zMjUuODIsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IGlQMDUwWzNdID0gey0zODMuMjQsIC04MDQuNzcsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IGlQMDUxWzNdID0gezI4My40NywgLTg0Ni4wOSwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgUDAxMlszXSA9IHsxNTYuNDgsIC0zMS45NSwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDEzWzNdID0gezE2Mi4wMCwgMTEwLjIyLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IFAwMTRbM10gPSB7ODguMTYsIDIyMS42NSwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE1WzNdID0gey02NS4yMSwgMjMxLjE2LCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IFAwMTZbM10gPSB7LTE1Ni40OCwgMTIxLjk3LCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IFAwMTdbM10gPSB7LTE2Mi4wMCwgLTIzLjkzLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IFAwMThbM10gPSB7LTg4LjE2LCAtMTM5LjEwLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IFAwMTlbM10gPSB7NjUuMjEsIC0xNDguNjEsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgUDAyMFszXSA9IHsyNDYuODcsIC05OC43MywgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgUDAyMVszXSA9IHsyNTMuMTcsIDEyNy43NiwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgUDAyMlszXSA9IHsxMzIuMzQsIDI3MC43NywgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgUDAyM1szXSA9IHstOTcuODgsIDI4NS4wNCwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgUDAyNFszXSA9IHstMjIyLjk3LCAxMzkuODAsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjVbM10gPSB7LTIyNS4yOSwgLTg2LjY4LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBQMDI2WzNdID0gey0xMDguNDQsIC0yMjQuMTUsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjdbM10gPSB7OTcuODgsIC0yMjEuNTYsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjhbM10gPSB7NDEwLjU1LCAtMjAwLjY2LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBQMDI5WzNdID0gezQzMi4xOSwgMTQ4LjQyLCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBQMDMwWzNdID0gezIwMC42NiwgNDEwLjU1LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBQMDMxWzNdID0gey0xNDguNDIsIDQzMi4xOSwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAzMlszXSA9IHstNDA3LjQ4LCAxNzEuODgsIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IFAwMzNbM10gPSB7LTQzMi4xOSwgLTE0OC40MiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAzNFszXSA9IHstMTQ4Ljg4LCAtMzA5Ljc0LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBQMDM1WzNdID0gezE1Ni4zOCwgLTMyMC4xNywgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAzNlszXSA9IHs1MjMuMzksIC0zMDMuODEsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IFAwMzdbM10gPSB7NTc0LjY2LCAyNzYuODQsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IFAwMzhbM10gPSB7MjQzLjA1LCA0OTIuNTAsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IFAwMzlbM10gPSB7LTE5MS4yMywgNTIwLjEzLCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDQwWzNdID0gey01MjMuMzksIDMwNC4wMSwgNDQyNC41N307CitzdGF0aWMgZmxvYXQgUDA0MVszXSA9IHstNTc0LjY2LCAtMjMxLjgzLCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDQyWzNdID0gey0yNjYuOTUsIC01NzguMTcsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IFAwNDNbM10gPSB7MjExLjE0LCAtNTc5LjY3LCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDQ0WzNdID0gezY4MC41NywgLTM3MC4yNywgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgUDA0NVszXSA9IHs4MzQuMDEsIDM2My4wOSwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgUDA0NlszXSA9IHszNzEuMjksIDYxNC4xMywgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgUDA0N1szXSA9IHstMjkxLjQzLCA2MjEuODYsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNDhbM10gPSB7LTc4NC4xMywgMzYyLjYwLCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDQ5WzNdID0gey03NDMuMjksIC0zMjUuODIsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNTBbM10gPSB7LTM4My4yNCwgLTgwNC43NywgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgUDA1MVszXSA9IHsyODMuNDcsIC04NDYuMDksIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNTJbM10gPSB7NTk5LjA5LCAtMzMyLjI0LCA3OTAyLjU5fTsKK3N0YXRpYyBmbG9hdCBQMDUzWzNdID0gezczNS40OCwgMzA2LjI2LCA3OTExLjkyfTsKK3N0YXRpYyBmbG9hdCBQMDU0WzNdID0gezMyMS41NSwgNTU4LjUzLCA3OTAyLjU5fTsKK3N0YXRpYyBmbG9hdCBQMDU1WzNdID0gey0yNjAuNTQsIDU1OS44NCwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1NlszXSA9IHstNjk4LjY2LCAzMjAuODMsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNTdbM10gPSB7LTY0My4yOSwgLTI5OS4xNiwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1OFszXSA9IHstMzQxLjQ3LCAtNzE5LjMwLCA3OTAyLjU5fTsKK3N0YXRpYyBmbG9hdCBQMDU5WzNdID0gezI1Mi41NywgLTc1Ni4xMiwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA2MFszXSA9IHs0NTguMzksIC0yNjUuMzEsIDkzNTUuNDR9Oworc3RhdGljIGZsb2F0IFAwNjJbM10gPSB7MjI0LjA0LCA0MzguOTgsIDkzNjQuNzd9Oworc3RhdGljIGZsb2F0IFAwNjNbM10gPSB7LTE2NS43MSwgNDQxLjI3LCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDY1WzNdID0gey00NzMuOTksIC0yMTkuNzEsIDkzNTUuNDR9Oworc3RhdGljIGZsb2F0IFAwNjZbM10gPSB7LTIxMS45NywgLTQ3OS44NywgOTM1NS40NH07CitzdGF0aWMgZmxvYXQgUDA2N1szXSA9IHsxOTIuODYsIC01MDQuMDMsIDkzNTUuNDR9Oworc3RhdGljIGZsb2F0IGlQMDY4WzNdID0gey0xMTIuNDQsIDkuMjUsIC02NC40Mn07CitzdGF0aWMgZmxvYXQgaVAwNjlbM10gPSB7MTE1NS42MywgMC4wMCwgLTE4Mi40Nn07CitzdGF0aWMgZmxvYXQgaVAwNzBbM10gPSB7LTExNDMuMTMsIDAuMDAsIC0xODEuNTR9Oworc3RhdGljIGZsb2F0IGlQMDcxWzNdID0gezE0MjQuMjMsIDAuMDAsIC0zMjIuMDl9Oworc3RhdGljIGZsb2F0IGlQMDcyWzNdID0gey0xMzY4LjAxLCAwLjAwLCAtMzEwLjM4fTsKK3N0YXRpYyBmbG9hdCBpUDA3M1szXSA9IHsxMjU1LjU3LCAyLjMxLCAxMTQuMDV9Oworc3RhdGljIGZsb2F0IGlQMDc0WzNdID0gey0xMTQ5LjM4LCAwLjAwLCAxMTcuMTJ9Oworc3RhdGljIGZsb2F0IGlQMDc1WzNdID0gezcxOC4zNiwgMC4wMCwgNDMzLjM2fTsKK3N0YXRpYyBmbG9hdCBpUDA3NlszXSA9IHstNjU1LjkwLCAwLjAwLCA0MzMuMzZ9Oworc3RhdGljIGZsb2F0IFAwNjhbM10gPSB7LTExMi40NCwgOS4yNSwgLTY0LjQyfTsKK3N0YXRpYyBmbG9hdCBQMDY5WzNdID0gezExNTUuNjMsIDAuMDAsIC0xODIuNDZ9Oworc3RhdGljIGZsb2F0IFAwNzBbM10gPSB7LTExNDMuMTMsIDAuMDAsIC0xODEuNTR9Oworc3RhdGljIGZsb2F0IFAwNzFbM10gPSB7MTQyNC4yMywgMC4wMCwgLTMyMi4wOX07CitzdGF0aWMgZmxvYXQgUDA3MlszXSA9IHstMTM2OC4wMSwgMC4wMCwgLTMxMC4zOH07CitzdGF0aWMgZmxvYXQgUDA3M1szXSA9IHsxMjU1LjU3LCAyLjMxLCAxMTQuMDV9Oworc3RhdGljIGZsb2F0IFAwNzRbM10gPSB7LTExNDkuMzgsIDAuMDAsIDExNy4xMn07CitzdGF0aWMgZmxvYXQgUDA3NVszXSA9IHs3MTguMzYsIDAuMDAsIDQzMy4zNn07CitzdGF0aWMgZmxvYXQgUDA3NlszXSA9IHstNjU1LjkwLCAwLjAwLCA0MzMuMzZ9Oworc3RhdGljIGZsb2F0IFAwNzdbM10gPSB7MTA1OC4wMCwgLTIuNjYsIDc5MjMuNTF9Oworc3RhdGljIGZsb2F0IFAwNzhbM10gPSB7LTEwMTYuNTEsIC0xNS40NywgNzkwMi44N307CitzdGF0aWMgZmxvYXQgUDA3OVszXSA9IHstMTM2My45OSwgLTQ4NC41MCwgNzU5My4zOH07CitzdGF0aWMgZmxvYXQgUDA4MFszXSA9IHsxNDc4LjA5LCAtODYxLjQ3LCA3MDk4LjEyfTsKK3N0YXRpYyBmbG9hdCBQMDgxWzNdID0gezEzMzguMDYsIC0yODQuNjgsIDcwMjQuMTV9Oworc3RhdGljIGZsb2F0IFAwODJbM10gPSB7LTE1NDUuNTEsIC04NjAuNjQsIDcxMDYuNjB9Oworc3RhdGljIGZsb2F0IFAwODNbM10gPSB7MTA2My4xOSwgLTcwLjQ2LCA3NDY2LjYwfTsKK3N0YXRpYyBmbG9hdCBQMDg0WzNdID0gey0xMzY5LjE4LCAtMjg4LjExLCA3MDE1LjM0fTsKK3N0YXRpYyBmbG9hdCBQMDg1WzNdID0gezEzNDguNDQsIC00ODIuNTAsIDc1OTEuNDF9Oworc3RhdGljIGZsb2F0IFAwODZbM10gPSB7LTEwMTUuNDUsIC05Ni44MCwgNzQ3NC44Nn07CitzdGF0aWMgZmxvYXQgUDA4N1szXSA9IHs3MzEuMDQsIDE0OC4zOCwgNzY4Mi41OH07CitzdGF0aWMgZmxvYXQgUDA4OFszXSA9IHstNjk3LjAzLCAxNTEuODIsIDc2NjguODF9Oworc3RhdGljIGZsb2F0IFAwODlbM10gPSB7LTY4Ni44MiwgMTU3LjA5LCA3OTIyLjI5fTsKK3N0YXRpYyBmbG9hdCBQMDkwWzNdID0gezcyNC43MywgMTQ3Ljc1LCA3OTMxLjM5fTsKK3N0YXRpYyBmbG9hdCBpUDA5MVszXSA9IHswLjAwLCAzMjcuMTAsIDIzNDYuNTV9Oworc3RhdGljIGZsb2F0IGlQMDkyWzNdID0gezAuMDAsIDU1Mi4yOCwgMjMxMS4zMX07CitzdGF0aWMgZmxvYXQgaVAwOTNbM10gPSB7MC4wMCwgNzIxLjE2LCAyMTY2LjQxfTsKK3N0YXRpYyBmbG9hdCBpUDA5NFszXSA9IHswLjAwLCA2OTMuNDIsIDIzODguODB9Oworc3RhdGljIGZsb2F0IGlQMDk1WzNdID0gezAuMDAsIDM4OS40NCwgMjg1OS45N307CitzdGF0aWMgZmxvYXQgUDA5MVszXSA9IHswLjAwLCAzMjcuMTAsIDIzNDYuNTV9Oworc3RhdGljIGZsb2F0IFAwOTJbM10gPSB7MC4wMCwgNTUyLjI4LCAyMzExLjMxfTsKK3N0YXRpYyBmbG9hdCBQMDkzWzNdID0gezAuMDAsIDcyMS4xNiwgMjE2Ni40MX07CitzdGF0aWMgZmxvYXQgUDA5NFszXSA9IHswLjAwLCA2OTMuNDIsIDIzODguODB9Oworc3RhdGljIGZsb2F0IFAwOTVbM10gPSB7MC4wMCwgMzg5LjQ0LCAyODU5Ljk3fTsKK3N0YXRpYyBmbG9hdCBpUDA5NlszXSA9IHsyMjIuMDIsIC0xODMuNjcsIDEwMjY2Ljg5fTsKK3N0YXRpYyBmbG9hdCBpUDA5N1szXSA9IHstMTI4LjkwLCAtMTgyLjcwLCAxMDI2Ni44OX07CitzdGF0aWMgZmxvYXQgaVAwOThbM10gPSB7NDEuMDQsIDg4LjMxLCAxMDY1OS4zNn07CitzdGF0aWMgZmxvYXQgaVAwOTlbM10gPSB7LTQ4LjczLCA4OC4zMCwgMTA2NTkuMzZ9Oworc3RhdGljIGZsb2F0IFAwOTZbM10gPSB7MjIyLjAyLCAtMTgzLjY3LCAxMDI2Ni44OX07CitzdGF0aWMgZmxvYXQgUDA5N1szXSA9IHstMTI4LjkwLCAtMTgyLjcwLCAxMDI2Ni44OX07CitzdGF0aWMgZmxvYXQgUDA5OFszXSA9IHs0MS4wNCwgODguMzEsIDEwNjU5LjM2fTsKK3N0YXRpYyBmbG9hdCBQMDk5WzNdID0gey00OC43MywgODguMzAsIDEwNjU5LjM2fTsKK3N0YXRpYyBmbG9hdCBQMTAwWzNdID0gezAuMDAsIDYwMy40MiwgOTM0MC42OH07CitzdGF0aWMgZmxvYXQgUDEwNFszXSA9IHstOS44NiwgNTY3LjYyLCA3ODU4LjY1fTsKK3N0YXRpYyBmbG9hdCBQMTA1WzNdID0gezMxLjk2LCA1NjUuMjcsIDc5MDguNDZ9Oworc3RhdGljIGZsb2F0IFAxMDZbM10gPSB7MjIuNzUsIDU2OC4xMywgNzc4Mi44M307CitzdGF0aWMgZmxvYXQgUDEwN1szXSA9IHs1OC45MywgNTY4LjQyLCA3Nzc1Ljk0fTsKK3N0YXRpYyBmbG9hdCBQMTA4WzNdID0gezU1LjkxLCA1NjUuNTksIDc5MDUuODZ9Oworc3RhdGljIGZsb2F0IFAxMDlbM10gPSB7OTkuMjEsIDU2Ni4wMCwgNzg1OC42NX07CitzdGF0aWMgZmxvYXQgUDExMFszXSA9IHstNDk4LjgzLCAxNDguMTQsIDkxMzUuMTB9Oworc3RhdGljIGZsb2F0IFAxMTFbM10gPSB7LTQ5NS40NiwgMTMzLjI0LCA5MTU4LjQ4fTsKK3N0YXRpYyBmbG9hdCBQMTEyWzNdID0gey00OTAuODIsIDE0Ni4yMywgOTE4Mi43Nn07CitzdGF0aWMgZmxvYXQgUDExM1szXSA9IHstNDg5LjU1LCAxNzQuMTEsIDkxODMuNjZ9Oworc3RhdGljIGZsb2F0IFAxMTRbM10gPSB7LTQ5Mi45MiwgMTg5LjAwLCA5MTYwLjI4fTsKK3N0YXRpYyBmbG9hdCBQMTE1WzNdID0gey00OTcuNTYsIDE3Ni4wMiwgOTEzNi4wMH07CitzdGF0aWMgZmxvYXQgUDExNlszXSA9IHs1MjYuNTQsIDE2OS42OCwgOTEzNy43MH07CitzdGF0aWMgZmxvYXQgUDExN1szXSA9IHs1MjMuNDksIDE4NC44NSwgOTE2MS40Mn07CitzdGF0aWMgZmxvYXQgUDExOFszXSA9IHs1MTguNTYsIDE3MS43OCwgOTE4Ni4wNn07CitzdGF0aWMgZmxvYXQgUDExOVszXSA9IHs1MTYuNjgsIDE0My41MywgOTE4Ni45OH07CitzdGF0aWMgZmxvYXQgUDEyMFszXSA9IHs1MTkuNzMsIDEyOC4zNiwgOTE2My4yNn07CitzdGF0aWMgZmxvYXQgUDEyMVszXSA9IHs1MjQuNjYsIDE0MS40MywgOTEzOC42Mn07CisvKiAqSU5ERU5ULU9OKiAqLworCit2b2lkCitXaGFsZTAwMSh2b2lkKQoreworCisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbE5vcm1hbDNmdihOMDEwKTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjgpOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsTm9ybWFsM2Z2KE4wNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsTm9ybWFsM2Z2KE4wNzYpOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc2KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbE5vcm1hbDNmdihOMDc0KTsKKyAgICBnbFZlcnRleDNmdihQMDc0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA3NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzIpOworICAgIGdsVmVydGV4M2Z2KFAwNzIpOworICAgIGdsTm9ybWFsM2Z2KE4wNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsTm9ybWFsM2Z2KE4wNzQpOworICAgIGdsVmVydGV4M2Z2KFAwNzQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc0KTsKKyAgICBnbFZlcnRleDNmdihQMDc0KTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbE5vcm1hbDNmdihOMDc2KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzYpOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjgpOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTApOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDEwKTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAwMih2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzUpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbE5vcm1hbDNmdihOMDc1KTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzEpOworICAgIGdsVmVydGV4M2Z2KFAwNzEpOworICAgIGdsTm9ybWFsM2Z2KE4wNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsTm9ybWFsM2Z2KE4wNzMpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbE5vcm1hbDNmdihOMDA5KTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsTm9ybWFsM2Z2KE4wNzUpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbE5vcm1hbDNmdihOMDczKTsKKyAgICBnbFZlcnRleDNmdihQMDczKTsKKyAgICBnbE5vcm1hbDNmdihOMDc1KTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMDModm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAwNCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbE5vcm1hbDNmdihOMDE3KTsKKyAgICBnbFZlcnRleDNmdihQMDE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDA1KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbE5vcm1hbDNmdihOMDM0KTsKKyAgICBnbFZlcnRleDNmdihQMDM0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMDYodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTIpOworICAgIGdsVmVydGV4M2Z2KFAwOTIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTMpOworICAgIGdsVmVydGV4M2Z2KFAwOTMpOworICAgIGdsTm9ybWFsM2Z2KE4wOTQpOworICAgIGdsVmVydGV4M2Z2KFAwOTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDkzKTsKKyAgICBnbFZlcnRleDNmdihQMDkzKTsKKyAgICBnbE5vcm1hbDNmdihOMDkyKTsKKyAgICBnbFZlcnRleDNmdihQMDkyKTsKKyAgICBnbE5vcm1hbDNmdihOMDk0KTsKKyAgICBnbFZlcnRleDNmdihQMDk0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA5MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTEpOworICAgIGdsVmVydGV4M2Z2KFAwOTEpOworICAgIGdsTm9ybWFsM2Z2KE4wOTIpOworICAgIGdsVmVydGV4M2Z2KFAwOTIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTQpOworICAgIGdsVmVydGV4M2Z2KFAwOTQpOworICAgIGdsTm9ybWFsM2Z2KE4wOTUpOworICAgIGdsVmVydGV4M2Z2KFAwOTUpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDA3KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMDgodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAwOSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTIpOworICAgIGdsVmVydGV4M2Z2KFAwNTIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDU3KTsKKyAgICBnbFZlcnRleDNmdihQMDU3KTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDEwKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgwKTsKKyAgICBnbFZlcnRleDNmdihQMDgwKTsKKyAgICBnbE5vcm1hbDNmdihOMDgxKTsKKyAgICBnbFZlcnRleDNmdihQMDgxKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDg3KTsKKyAgICBnbFZlcnRleDNmdihQMDg3KTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODEpOworICAgIGdsVmVydGV4M2Z2KFAwODEpOworICAgIGdsTm9ybWFsM2Z2KE4wODApOworICAgIGdsVmVydGV4M2Z2KFAwODApOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDgxKTsKKyAgICBnbFZlcnRleDNmdihQMDgxKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODcpOworICAgIGdsVmVydGV4M2Z2KFAwODcpOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg3KTsKKyAgICBnbFZlcnRleDNmdihQMDg3KTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbE5vcm1hbDNmdihOMDkwKTsKKyAgICBnbFZlcnRleDNmdihQMDkwKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxMSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wNzkpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsTm9ybWFsM2Z2KE4wODgpOworICAgIGdsVmVydGV4M2Z2KFAwODgpOworICAgIGdsTm9ybWFsM2Z2KE4wODkpOworICAgIGdsVmVydGV4M2Z2KFAwODkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg4KTsKKyAgICBnbFZlcnRleDNmdihQMDg4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDg5KTsKKyAgICBnbFZlcnRleDNmdihQMDg5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg0KTsKKyAgICBnbFZlcnRleDNmdihQMDg0KTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMTIodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNjcpOworICAgIGdsVmVydGV4M2Z2KFAwNjcpOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMDU3KTsKKyAgICBnbFZlcnRleDNmdihQMDU3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wNTIpOworICAgIGdsVmVydGV4M2Z2KFAwNTIpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDEzKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbE5vcm1hbDNmdihOMDk2KTsKKyAgICBnbFZlcnRleDNmdihQMDk2KTsKKyAgICBnbE5vcm1hbDNmdihOMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA5OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4wOTcpOworICAgIGdsVmVydGV4M2Z2KFAwOTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDk2KTsKKyAgICBnbFZlcnRleDNmdihQMDk2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTYpOworICAgIGdsVmVydGV4M2Z2KFAwOTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wOTgpOworICAgIGdsVmVydGV4M2Z2KFAwOTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsVmVydGV4M2Z2KFAwOTgpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDE0KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDA0KTsKKyAgICBnbFZlcnRleDNmdihQMDA0KTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDE1KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxNih2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAxMDcpOworICAgIGdsVmVydGV4M2Z2KFAxMDgpOworICAgIGdsVmVydGV4M2Z2KFAxMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMTEwKTsKKyAgICBnbFZlcnRleDNmdihQMTExKTsKKyAgICBnbFZlcnRleDNmdihQMTEyKTsKKyAgICBnbFZlcnRleDNmdihQMTEzKTsKKyAgICBnbFZlcnRleDNmdihQMTE0KTsKKyAgICBnbFZlcnRleDNmdihQMTE1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRHJhd1doYWxlKGZpc2hSZWMgKiBmaXNoKQoreworICAgIGZsb2F0IHNlZzAsIHNlZzEsIHNlZzIsIHNlZzMsIHNlZzQsIHNlZzUsIHNlZzYsIHNlZzc7CisgICAgZmxvYXQgcGl0Y2gsIHRocmFzaCwgY2hvbXA7CisKKyAgICBmaXNoLT5odGFpbCA9IChpbnQpIChmaXNoLT5odGFpbCAtIChpbnQpICg1LjAgKiBmaXNoLT52KSkgJSAzNjA7CisKKyAgICB0aHJhc2ggPSA3MC4wICogZmlzaC0+djsKKworICAgIHNlZzAgPSAxLjUgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsKSAqIFJSQUQpOworICAgIHNlZzEgPSAyLjUgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgMTAuMCkgKiBSUkFEKTsKKyAgICBzZWcyID0gMy43ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDE1LjApICogUlJBRCk7CisgICAgc2VnMyA9IDQuOCAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyAyMy4wKSAqIFJSQUQpOworICAgIHNlZzQgPSA2LjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgMjguMCkgKiBSUkFEKTsKKyAgICBzZWc1ID0gNi41ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDM1LjApICogUlJBRCk7CisgICAgc2VnNiA9IDYuNSAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyA0MC4wKSAqIFJSQUQpOworICAgIHNlZzcgPSA2LjUgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgNTUuMCkgKiBSUkFEKTsKKworICAgIHBpdGNoID0gZmlzaC0+diAqIHNpbigoZmlzaC0+aHRhaWwgLSAxNjAuMCkgKiBSUkFEKTsKKworICAgIGNob21wID0gMC4wOworICAgIGlmIChmaXNoLT52ID4gMi4wKSB7CisgICAgICAgIGNob21wID0gLShmaXNoLT52IC0gMi4wKSAqIDIwMC4wOworICAgIH0KKyAgICBQMDEyWzFdID0gaVAwMTJbMV0gKyBzZWc1OworICAgIFAwMTNbMV0gPSBpUDAxM1sxXSArIHNlZzU7CisgICAgUDAxNFsxXSA9IGlQMDE0WzFdICsgc2VnNTsKKyAgICBQMDE1WzFdID0gaVAwMTVbMV0gKyBzZWc1OworICAgIFAwMTZbMV0gPSBpUDAxNlsxXSArIHNlZzU7CisgICAgUDAxN1sxXSA9IGlQMDE3WzFdICsgc2VnNTsKKyAgICBQMDE4WzFdID0gaVAwMThbMV0gKyBzZWc1OworICAgIFAwMTlbMV0gPSBpUDAxOVsxXSArIHNlZzU7CisKKyAgICBQMDIwWzFdID0gaVAwMjBbMV0gKyBzZWc0OworICAgIFAwMjFbMV0gPSBpUDAyMVsxXSArIHNlZzQ7CisgICAgUDAyMlsxXSA9IGlQMDIyWzFdICsgc2VnNDsKKyAgICBQMDIzWzFdID0gaVAwMjNbMV0gKyBzZWc0OworICAgIFAwMjRbMV0gPSBpUDAyNFsxXSArIHNlZzQ7CisgICAgUDAyNVsxXSA9IGlQMDI1WzFdICsgc2VnNDsKKyAgICBQMDI2WzFdID0gaVAwMjZbMV0gKyBzZWc0OworICAgIFAwMjdbMV0gPSBpUDAyN1sxXSArIHNlZzQ7CisKKyAgICBQMDI4WzFdID0gaVAwMjhbMV0gKyBzZWcyOworICAgIFAwMjlbMV0gPSBpUDAyOVsxXSArIHNlZzI7CisgICAgUDAzMFsxXSA9IGlQMDMwWzFdICsgc2VnMjsKKyAgICBQMDMxWzFdID0gaVAwMzFbMV0gKyBzZWcyOworICAgIFAwMzJbMV0gPSBpUDAzMlsxXSArIHNlZzI7CisgICAgUDAzM1sxXSA9IGlQMDMzWzFdICsgc2VnMjsKKyAgICBQMDM0WzFdID0gaVAwMzRbMV0gKyBzZWcyOworICAgIFAwMzVbMV0gPSBpUDAzNVsxXSArIHNlZzI7CisKKyAgICBQMDM2WzFdID0gaVAwMzZbMV0gKyBzZWcxOworICAgIFAwMzdbMV0gPSBpUDAzN1sxXSArIHNlZzE7CisgICAgUDAzOFsxXSA9IGlQMDM4WzFdICsgc2VnMTsKKyAgICBQMDM5WzFdID0gaVAwMzlbMV0gKyBzZWcxOworICAgIFAwNDBbMV0gPSBpUDA0MFsxXSArIHNlZzE7CisgICAgUDA0MVsxXSA9IGlQMDQxWzFdICsgc2VnMTsKKyAgICBQMDQyWzFdID0gaVAwNDJbMV0gKyBzZWcxOworICAgIFAwNDNbMV0gPSBpUDA0M1sxXSArIHNlZzE7CisKKyAgICBQMDQ0WzFdID0gaVAwNDRbMV0gKyBzZWcwOworICAgIFAwNDVbMV0gPSBpUDA0NVsxXSArIHNlZzA7CisgICAgUDA0NlsxXSA9IGlQMDQ2WzFdICsgc2VnMDsKKyAgICBQMDQ3WzFdID0gaVAwNDdbMV0gKyBzZWcwOworICAgIFAwNDhbMV0gPSBpUDA0OFsxXSArIHNlZzA7CisgICAgUDA0OVsxXSA9IGlQMDQ5WzFdICsgc2VnMDsKKyAgICBQMDUwWzFdID0gaVAwNTBbMV0gKyBzZWcwOworICAgIFAwNTFbMV0gPSBpUDA1MVsxXSArIHNlZzA7CisKKyAgICBQMDA5WzFdID0gaVAwMDlbMV0gKyBzZWc2OworICAgIFAwMTBbMV0gPSBpUDAxMFsxXSArIHNlZzY7CisgICAgUDA3NVsxXSA9IGlQMDc1WzFdICsgc2VnNjsKKyAgICBQMDc2WzFdID0gaVAwNzZbMV0gKyBzZWc2OworCisgICAgUDAwMVsxXSA9IGlQMDAxWzFdICsgc2VnNzsKKyAgICBQMDExWzFdID0gaVAwMTFbMV0gKyBzZWc3OworICAgIFAwNjhbMV0gPSBpUDA2OFsxXSArIHNlZzc7CisgICAgUDA2OVsxXSA9IGlQMDY5WzFdICsgc2VnNzsKKyAgICBQMDcwWzFdID0gaVAwNzBbMV0gKyBzZWc3OworICAgIFAwNzFbMV0gPSBpUDA3MVsxXSArIHNlZzc7CisgICAgUDA3MlsxXSA9IGlQMDcyWzFdICsgc2VnNzsKKyAgICBQMDczWzFdID0gaVAwNzNbMV0gKyBzZWc3OworICAgIFAwNzRbMV0gPSBpUDA3NFsxXSArIHNlZzc7CisKKyAgICBQMDkxWzFdID0gaVAwOTFbMV0gKyBzZWczICogMS4xOworICAgIFAwOTJbMV0gPSBpUDA5MlsxXSArIHNlZzM7CisgICAgUDA5M1sxXSA9IGlQMDkzWzFdICsgc2VnMzsKKyAgICBQMDk0WzFdID0gaVAwOTRbMV0gKyBzZWczOworICAgIFAwOTVbMV0gPSBpUDA5NVsxXSArIHNlZzMgKiAwLjk7CisKKyAgICBQMDk5WzFdID0gaVAwOTlbMV0gKyBjaG9tcDsKKyAgICBQMDk4WzFdID0gaVAwOThbMV0gKyBjaG9tcDsKKyAgICBQMDk3WzFdID0gaVAwOTdbMV0gKyBjaG9tcDsKKyAgICBQMDk2WzFdID0gaVAwOTZbMV0gKyBjaG9tcDsKKworICAgIGdsUHVzaE1hdHJpeCgpOworCisgICAgZ2xSb3RhdGVmKHBpdGNoLCAxLjAsIDAuMCwgMC4wKTsKKworICAgIGdsVHJhbnNsYXRlZigwLjAsIDAuMCwgODAwMC4wKTsKKworICAgIGdsUm90YXRlZigxODAuMCwgMC4wLCAxLjAsIDAuMCk7CisKKyAgICBnbFNjYWxlZigzLjAsIDMuMCwgMy4wKTsKKworICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBXaGFsZTAwMSgpOworICAgIFdoYWxlMDAyKCk7CisgICAgV2hhbGUwMDMoKTsKKyAgICBXaGFsZTAwNCgpOworICAgIFdoYWxlMDA1KCk7CisgICAgV2hhbGUwMDYoKTsKKyAgICBXaGFsZTAwNygpOworICAgIFdoYWxlMDA4KCk7CisgICAgV2hhbGUwMDkoKTsKKyAgICBXaGFsZTAxMCgpOworICAgIFdoYWxlMDExKCk7CisgICAgV2hhbGUwMTIoKTsKKyAgICBXaGFsZTAxMygpOworICAgIFdoYWxlMDE0KCk7CisgICAgV2hhbGUwMTUoKTsKKyAgICBXaGFsZTAxNigpOworCisgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBnbFBvcE1hdHJpeCgpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlTGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL21haW4uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3OTRiMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZUxlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9tYWluLmMKQEAgLTAsMCArMSwxNzkgQEAKKworLyogU2ltcGxlIHByb2dyYW06ICBDcmVhdGUgYSBibGFuayB3aW5kb3csIHdhaXQgZm9yIGtleXByZXNzLCBxdWl0LgorCisgICBQbGVhc2Ugc2VlIHRoZSBTREwgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiB1c2luZyB0aGUgU0RMIEFQSToKKyAgIC9EZXZlbG9wZXIvRG9jdW1lbnRhdGlvbi9TREwvZG9jcy5odG1sCisqLworICAgCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworZXh0ZXJuIHZvaWQgQXRsYW50aXNfSW5pdCAoKTsKK2V4dGVybiB2b2lkIEF0bGFudGlzX1Jlc2hhcGUgKGludCB3LCBpbnQgaCk7CitleHRlcm4gdm9pZCBBdGxhbnRpc19BbmltYXRlICgpOworZXh0ZXJuIHZvaWQgQXRsYW50aXNfRGlzcGxheSAoKTsKKworc3RhdGljIFNETF9TdXJmYWNlICpnU2NyZWVuOworCitzdGF0aWMgdm9pZCBpbml0QXR0cmlidXRlcyAoKQoreworICAgIC8vIFNldHVwIGF0dHJpYnV0ZXMgd2Ugd2FudCBmb3IgdGhlIE9wZW5HTCBjb250ZXh0CisgICAgCisgICAgaW50IHZhbHVlOworICAgIAorICAgIC8vIERvbid0IHNldCBjb2xvciBiaXQgc2l6ZXMgKFNETF9HTF9SRURfU0laRSwgZXRjKQorICAgIC8vICAgIE1hYyBPUyBYIHdpbGwgYWx3YXlzIHVzZSA4LTgtOC04IEFSR0IgZm9yIDMyLWJpdCBzY3JlZW5zIGFuZAorICAgIC8vICAgIDUtNS01IFJHQiBmb3IgMTYtYml0IHNjcmVlbnMKKyAgICAKKyAgICAvLyBSZXF1ZXN0IGEgMTYtYml0IGRlcHRoIGJ1ZmZlciAod2l0aG91dCB0aGlzLCB0aGVyZSBpcyBubyBkZXB0aCBidWZmZXIpCisgICAgdmFsdWUgPSAxNjsKKyAgICBTRExfR0xfU2V0QXR0cmlidXRlIChTRExfR0xfREVQVEhfU0laRSwgdmFsdWUpOworICAgIAorICAgIAorICAgIC8vIFJlcXVlc3QgZG91YmxlLWJ1ZmZlcmVkIE9wZW5HTAorICAgIC8vICAgICBUaGUgZmFjdCB0aGF0IHdpbmRvd3MgYXJlIGRvdWJsZS1idWZmZXJlZCBvbiBNYWMgT1MgWCBoYXMgbm8gZWZmZWN0CisgICAgLy8gICAgIG9uIE9wZW5HTCBkb3VibGUgYnVmZmVyaW5nLgorICAgIHZhbHVlID0gMTsKKyAgICBTRExfR0xfU2V0QXR0cmlidXRlIChTRExfR0xfRE9VQkxFQlVGRkVSLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50QXR0cmlidXRlcyAoKQoreworICAgIC8vIFByaW50IG91dCBhdHRyaWJ1dGVzIG9mIHRoZSBjb250ZXh0IHdlIGNyZWF0ZWQKKyAgICBpbnQgbkF0dHI7CisgICAgaW50IGk7CisgICAgCisgICAgaW50ICBhdHRyW10gPSB7IFNETF9HTF9SRURfU0laRSwgU0RMX0dMX0JMVUVfU0laRSwgU0RMX0dMX0dSRUVOX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIFNETF9HTF9BTFBIQV9TSVpFLCBTRExfR0xfQlVGRkVSX1NJWkUsIFNETF9HTF9ERVBUSF9TSVpFIH07CisgICAgICAgICAgICAgICAgICAgIAorICAgIGNoYXIgKmRlc2NbXSA9IHsgIlJlZCBzaXplOiAlZCBiaXRzXG4iLCAiQmx1ZSBzaXplOiAlZCBiaXRzXG4iLCAiR3JlZW4gc2l6ZTogJWQgYml0c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICJBbHBoYSBzaXplOiAlZCBiaXRzXG4iLCAiQ29sb3IgYnVmZmVyIHNpemU6ICVkIGJpdHNcbiIsIAorICAgICAgICAgICAgICAgICAgICAgIkRlcHRoIGJ1ZmVyIHNpemU6ICVkIGJpdHNcbiIgfTsKKworICAgIG5BdHRyID0gc2l6ZW9mKGF0dHIpIC8gc2l6ZW9mKGludCk7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IG5BdHRyOyBpKyspIHsKKyAgICAKKyAgICAgICAgaW50IHZhbHVlOworICAgICAgICBTRExfR0xfR2V0QXR0cmlidXRlIChhdHRyW2ldLCAmdmFsdWUpOworICAgICAgICBwcmludGYgKGRlc2NbaV0sIHZhbHVlKTsKKyAgICB9IAorfQorCitzdGF0aWMgdm9pZCBjcmVhdGVTdXJmYWNlIChpbnQgZnVsbHNjcmVlbikKK3sKKyAgICBVaW50MzIgZmxhZ3MgPSAwOworICAgIAorICAgIGZsYWdzID0gU0RMX09QRU5HTDsKKyAgICBpZiAoZnVsbHNjcmVlbikKKyAgICAgICAgZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisgICAgCisgICAgLy8gQ3JlYXRlIHdpbmRvdworICAgIGdTY3JlZW4gPSBTRExfU2V0VmlkZW9Nb2RlICg2NDAsIDQ4MCwgMCwgZmxhZ3MpOworICAgIGlmIChnU2NyZWVuID09IE5VTEwpIHsKKwkJCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNvdWxkbid0IHNldCA2NDB4NDgwIE9wZW5HTCB2aWRlbyBtb2RlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgU0RMX0dldEVycm9yKCkpOworCQlTRExfUXVpdCgpOworCQlleGl0KDIpOworCX0KK30KKworc3RhdGljIHZvaWQgaW5pdEdMICgpCit7CisgICAgQXRsYW50aXNfSW5pdCAoKTsKKyAgICBBdGxhbnRpc19SZXNoYXBlIChnU2NyZWVuLT53LCBnU2NyZWVuLT5oKTsKK30KKworc3RhdGljIHZvaWQgZHJhd0dMICgpCit7CisgICAgQXRsYW50aXNfQW5pbWF0ZSAoKTsKKyAgICBBdGxhbnRpc19EaXNwbGF5ICgpOworfQorCitzdGF0aWMgdm9pZCBtYWluTG9vcCAoKQoreworICAgIFNETF9FdmVudCBldmVudDsKKyAgICBpbnQgZG9uZSA9IDA7CisgICAgaW50IGZwcyA9IDI0OworCWludCBkZWxheSA9IDEwMDAvZnBzOworICAgIGludCB0aGVuVGlja3MgPSAtMTsKKyAgICBpbnQgbm93VGlja3M7CisgICAgCisgICAgd2hpbGUgKCAhZG9uZSApIHsKKworCQkvKiBDaGVjayBmb3IgZXZlbnRzICovCisJCXdoaWxlICggU0RMX1BvbGxFdmVudCAoJmV2ZW50KSApIHsKKwkJCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCisJCQkJY2FzZSBTRExfTU9VU0VNT1RJT046CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX01PVVNFQlVUVE9ORE9XTjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRExfS0VZRE9XTjoKKwkJCQkJLyogQW55IGtleXByZXNzIHF1aXRzIHRoZSBhcHAuLi4gKi8KKwkJCQljYXNlIFNETF9RVUlUOgorCQkJCQlkb25lID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKyAgICAKKyAgICAgICAgLy8gRHJhdyBhdCAyNCBoegorICAgICAgICAvLyAgICAgVGhpcyBhcHByb2FjaCBpcyBub3Qgbm9ybWFsbHkgcmVjb21tZW5kZWQgLSBpdCBpcyBiZXR0ZXIgdG8KKyAgICAgICAgLy8gICAgIHVzZSB0aW1lLWJhc2VkIGFuaW1hdGlvbiBhbmQgcnVuIGFzIGZhc3QgYXMgcG9zc2libGUKKyAgICAgICAgZHJhd0dMICgpOworICAgICAgICBTRExfR0xfU3dhcEJ1ZmZlcnMgKCk7CisKKyAgICAgICAgLy8gVGltZSBob3cgbG9uZyBlYWNoIGRyYXctc3dhcC1kZWxheSBjeWNsZSB0YWtlcworICAgICAgICAvLyBhbmQgYWRqdXN0IGRlbGF5IHRvIGdldCBjbG9zZXIgdG8gdGFyZ2V0IGZyYW1lcmF0ZQorICAgICAgICBpZiAodGhlblRpY2tzID4gMCkgeworICAgICAgICAgICAgbm93VGlja3MgPSBTRExfR2V0VGlja3MgKCk7CisgICAgICAgICAgICBkZWxheSArPSAoMTAwMC9mcHMgLSAobm93VGlja3MtdGhlblRpY2tzKSk7CisgICAgICAgICAgICB0aGVuVGlja3MgPSBub3dUaWNrczsKKyAgICAgICAgICAgIGlmIChkZWxheSA8IDApCisgICAgICAgICAgICAgICAgZGVsYXkgPSAxMDAwL2ZwczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRoZW5UaWNrcyA9IFNETF9HZXRUaWNrcyAoKTsKKyAgICAgICAgfQorCisgICAgICAgIFNETF9EZWxheSAoZGVsYXkpOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwkvLyBJbml0IFNETCB2aWRlbyBzdWJzeXN0ZW0KKwlpZiAoIFNETF9Jbml0IChTRExfSU5JVF9WSURFTykgPCAwICkgeworCQkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBpbml0aWFsaXplIFNETDogJXNcbiIsCisJCQlTRExfR2V0RXJyb3IoKSk7CisJCWV4aXQoMSk7CisJfQorCisgICAgLy8gU2V0IEdMIGNvbnRleHQgYXR0cmlidXRlcworICAgIGluaXRBdHRyaWJ1dGVzICgpOworICAgIAorICAgIC8vIENyZWF0ZSBHTCBjb250ZXh0CisgICAgY3JlYXRlU3VyZmFjZSAoMCk7CisgICAgCisgICAgLy8gR2V0IEdMIGNvbnRleHQgYXR0cmlidXRlcworICAgIHByaW50QXR0cmlidXRlcyAoKTsKKyAgICAKKyAgICAvLyBJbml0IEdMIHN0YXRlCisgICAgaW5pdEdMICgpOworICAgIAorICAgIC8vIERyYXcsIGdldCBldmVudHMuLi4KKyAgICBtYWluTG9vcCAoKTsKKyAgICAKKyAgICAvLyBDbGVhbnVwCisJU0RMX1F1aXQoKTsKKwkKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MjFiMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL0luZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzMzIwNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmNvbS55b3VyY29tcGFueS5fX19QUk9KRUNUTkFNRUFTWE1MX19fPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPiR7UFJPRFVDVF9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+CisJPGtleT5MU01pbmltdW1TeXN0ZW1WZXJzaW9uQnlBcmNoaXRlY3R1cmU8L2tleT4KKwk8ZGljdD4KKwkJPGtleT54ODZfNjQ8L2tleT4KKwkJPHN0cmluZz4xMC42LjA8L3N0cmluZz4KKwkJPGtleT5pMzg2PC9rZXk+CisJCTxzdHJpbmc+MTAuNC4wPC9zdHJpbmc+CisJCTxrZXk+cHBjPC9rZXk+CisJCTxzdHJpbmc+MTAuNC4wPC9zdHJpbmc+CisJPC9kaWN0PgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9TRExNYWluLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQXBwbGljYXRpb24vU0RMTWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmQ5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQXBwbGljYXRpb24vU0RMTWFpbi5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAorICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKyAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KKworICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcworKi8KKworI2lmbmRlZiBfU0RMTWFpbl9oXworI2RlZmluZSBfU0RMTWFpbl9oXworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCitAaW50ZXJmYWNlIFNETE1haW4gOiBOU09iamVjdAorQGVuZAorCisjZW5kaWYgLyogX1NETE1haW5faF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9TRExNYWluLm0gYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQXBwbGljYXRpb24vU0RMTWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjVhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQXBwbGljYXRpb24vU0RMTWFpbi5tCkBAIC0wLDAgKzEsMzgzIEBACisvKiAgIFNETE1haW4ubSAtIG1haW4gZW50cnkgcG9pbnQgZm9yIG91ciBDb2NvYS1pemVkIFNETCBhcHAKKyAgICAgICBJbml0aWFsIFZlcnNpb246IERhcnJlbGwgV2FsaXNzZXIgPGR3YWxpc3MxQHB1cmR1ZS5lZHU+CisgICAgICAgTm9uLU5JQi1Db2RlICYgb3RoZXIgY2hhbmdlczogTWF4IEhvcm4gPG1heEBxdWVuZGkuZGU+CisKKyAgICBGZWVsIGZyZWUgdG8gY3VzdG9taXplIHRoaXMgZmlsZSB0byBzdWl0IHlvdXIgbmVlZHMKKyovCisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExNYWluLmgiCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+IC8qIGZvciBNQVhQQVRITEVOICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qIEZvciBzb21lIHJlYW9uLCBBcHBsZSByZW1vdmVkIHNldEFwcGxlTWVudSBmcm9tIHRoZSBoZWFkZXJzIGluIDEwLjQsCisgYnV0IHRoZSBtZXRob2Qgc3RpbGwgaXMgdGhlcmUgYW5kIHdvcmtzLiBUbyBhdm9pZCB3YXJuaW5ncywgd2UgZGVjbGFyZQorIGl0IG91cnNlbHZlcyBoZXJlLiAqLworQGludGVyZmFjZSBOU0FwcGxpY2F0aW9uKFNETF9NaXNzaW5nX01ldGhvZHMpCistICh2b2lkKXNldEFwcGxlTWVudTooTlNNZW51ICopbWVudTsKK0BlbmQKKworLyogVXNlIHRoaXMgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSB1c2UgU0RMTWFpbi5uaWIgb3Igbm90ICovCisjZGVmaW5lCQlTRExfVVNFX05JQl9GSUxFCTAKKworLyogVXNlIHRoaXMgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSB1c2UgQ1BTIChkb2NraW5nKSBvciBub3QgKi8KKyNkZWZpbmUJCVNETF9VU0VfQ1BTCQkxCisjaWZkZWYgU0RMX1VTRV9DUFMKKy8qIFBvcnRpb25zIG9mIENQUy5oICovCit0eXBlZGVmIHN0cnVjdCBDUFNQcm9jZXNzU2VyTnVtCit7CisJVUludDMyCQlsbzsKKwlVSW50MzIJCWhpOworfSBDUFNQcm9jZXNzU2VyTnVtOworCitleHRlcm4gT1NFcnIJQ1BTR2V0Q3VycmVudFByb2Nlc3MoIENQU1Byb2Nlc3NTZXJOdW0gKnBzbik7CitleHRlcm4gT1NFcnIgCUNQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb24oIENQU1Byb2Nlc3NTZXJOdW0gKnBzbiwgVUludDMyIF9hcmcyLCBVSW50MzIgX2FyZzMsIFVJbnQzMiBfYXJnNCwgVUludDMyIF9hcmc1KTsKK2V4dGVybiBPU0VycglDUFNTZXRGcm9udFByb2Nlc3MoIENQU1Byb2Nlc3NTZXJOdW0gKnBzbik7CisKKyNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLworCitzdGF0aWMgaW50ICAgIGdBcmdjOworc3RhdGljIGNoYXIgICoqZ0FyZ3Y7CitzdGF0aWMgQk9PTCAgIGdGaW5kZXJMYXVuY2g7CitzdGF0aWMgQk9PTCAgIGdDYWxsZWRBcHBNYWlubGluZSA9IEZBTFNFOworCitzdGF0aWMgTlNTdHJpbmcgKmdldEFwcGxpY2F0aW9uTmFtZSh2b2lkKQoreworICAgIGNvbnN0IE5TRGljdGlvbmFyeSAqZGljdDsKKyAgICBOU1N0cmluZyAqYXBwTmFtZSA9IDA7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGFwcGxpY2F0aW9uIG5hbWUgKi8KKyAgICBkaWN0ID0gKGNvbnN0IE5TRGljdGlvbmFyeSAqKUNGQnVuZGxlR2V0SW5mb0RpY3Rpb25hcnkoQ0ZCdW5kbGVHZXRNYWluQnVuZGxlKCkpOworICAgIGlmIChkaWN0KQorICAgICAgICBhcHBOYW1lID0gW2RpY3Qgb2JqZWN0Rm9yS2V5OiBAIkNGQnVuZGxlTmFtZSJdOworICAgIAorICAgIGlmICghW2FwcE5hbWUgbGVuZ3RoXSkKKyAgICAgICAgYXBwTmFtZSA9IFtbTlNQcm9jZXNzSW5mbyBwcm9jZXNzSW5mb10gcHJvY2Vzc05hbWVdOworCisgICAgcmV0dXJuIGFwcE5hbWU7Cit9CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisvKiBBIGhlbHBlciBjYXRlZ29yeSBmb3IgTlNTdHJpbmcgKi8KK0BpbnRlcmZhY2UgTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCistIChOU1N0cmluZyAqKXN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGg6KE5TU3RyaW5nICopYVN0cmluZzsKK0BlbmQKKyNlbmRpZgorCitAaW50ZXJmYWNlIFNETEFwcGxpY2F0aW9uIDogTlNBcHBsaWNhdGlvbgorQGVuZAorCitAaW1wbGVtZW50YXRpb24gU0RMQXBwbGljYXRpb24KKy8qIEludm9rZWQgZnJvbSB0aGUgUXVpdCBtZW51IGl0ZW0gKi8KKy0gKHZvaWQpdGVybWluYXRlOihpZClzZW5kZXIKK3sKKyAgICAvKiBQb3N0IGEgU0RMX1FVSVQgZXZlbnQgKi8KKyAgICBTRExfRXZlbnQgZXZlbnQ7CisgICAgZXZlbnQudHlwZSA9IFNETF9RVUlUOworICAgIFNETF9QdXNoRXZlbnQoJmV2ZW50KTsKK30KK0BlbmQKKworLyogVGhlIG1haW4gY2xhc3Mgb2YgdGhlIGFwcGxpY2F0aW9uLCB0aGUgYXBwbGljYXRpb24ncyBkZWxlZ2F0ZSAqLworQGltcGxlbWVudGF0aW9uIFNETE1haW4KKworLyogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgLmFwcCdzIHBhcmVudCBkaXJlY3RvcnkgKi8KKy0gKHZvaWQpIHNldHVwV29ya2luZ0RpcmVjdG9yeTooQk9PTClzaG91bGRDaGRpcgoreworICAgIGlmIChzaG91bGRDaGRpcikKKyAgICB7CisgICAgICAgIGNoYXIgcGFyZW50ZGlyW01BWFBBVEhMRU5dOworICAgICAgICBDRlVSTFJlZiB1cmwgPSBDRkJ1bmRsZUNvcHlCdW5kbGVVUkwoQ0ZCdW5kbGVHZXRNYWluQnVuZGxlKCkpOworICAgICAgICBDRlVSTFJlZiB1cmwyID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCgwLCB1cmwpOworICAgICAgICBpZiAoQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24odXJsMiwgMSwgKFVJbnQ4ICopcGFyZW50ZGlyLCBNQVhQQVRITEVOKSkgeworICAgICAgICAgICAgY2hkaXIocGFyZW50ZGlyKTsgICAvKiBjaGRpciB0byB0aGUgYmluYXJ5IGFwcCdzIHBhcmVudCAqLworICAgICAgICB9CisgICAgICAgIENGUmVsZWFzZSh1cmwpOworICAgICAgICBDRlJlbGVhc2UodXJsMik7CisgICAgfQorfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorCisvKiBGaXggbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCistICh2b2lkKWZpeE1lbnU6KE5TTWVudSAqKWFNZW51IHdpdGhBcHBOYW1lOihOU1N0cmluZyAqKWFwcE5hbWUKK3sKKyAgICBOU1JhbmdlIGFSYW5nZTsKKyAgICBOU0VudW1lcmF0b3IgKmVudW1lcmF0b3I7CisgICAgTlNNZW51SXRlbSAqbWVudUl0ZW07CisKKyAgICBhUmFuZ2UgPSBbW2FNZW51IHRpdGxlXSByYW5nZU9mU3RyaW5nOkAiU0RMIEFwcCJdOworICAgIGlmIChhUmFuZ2UubGVuZ3RoICE9IDApCisgICAgICAgIFthTWVudSBzZXRUaXRsZTogW1thTWVudSB0aXRsZV0gc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTphUmFuZ2Ugd2l0aDphcHBOYW1lXV07CisKKyAgICBlbnVtZXJhdG9yID0gW1thTWVudSBpdGVtQXJyYXldIG9iamVjdEVudW1lcmF0b3JdOworICAgIHdoaWxlICgobWVudUl0ZW0gPSBbZW51bWVyYXRvciBuZXh0T2JqZWN0XSkpCisgICAgeworICAgICAgICBhUmFuZ2UgPSBbW21lbnVJdGVtIHRpdGxlXSByYW5nZU9mU3RyaW5nOkAiU0RMIEFwcCJdOworICAgICAgICBpZiAoYVJhbmdlLmxlbmd0aCAhPSAwKQorICAgICAgICAgICAgW21lbnVJdGVtIHNldFRpdGxlOiBbW21lbnVJdGVtIHRpdGxlXSBzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOmFSYW5nZSB3aXRoOmFwcE5hbWVdXTsKKyAgICAgICAgaWYgKFttZW51SXRlbSBoYXNTdWJtZW51XSkKKyAgICAgICAgICAgIFtzZWxmIGZpeE1lbnU6W21lbnVJdGVtIHN1Ym1lbnVdIHdpdGhBcHBOYW1lOmFwcE5hbWVdOworICAgIH0KKyAgICBbIGFNZW51IHNpemVUb0ZpdCBdOworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBzZXRBcHBsaWNhdGlvbk1lbnUodm9pZCkKK3sKKyAgICAvKiB3YXJuaW5nOiB0aGlzIGNvZGUgaXMgdmVyeSBvZGQgKi8KKyAgICBOU01lbnUgKmFwcGxlTWVudTsKKyAgICBOU01lbnVJdGVtICptZW51SXRlbTsKKyAgICBOU1N0cmluZyAqdGl0bGU7CisgICAgTlNTdHJpbmcgKmFwcE5hbWU7CisgICAgCisgICAgYXBwTmFtZSA9IGdldEFwcGxpY2F0aW9uTmFtZSgpOworICAgIGFwcGxlTWVudSA9IFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiIl07CisgICAgCisgICAgLyogQWRkIG1lbnUgaXRlbXMgKi8KKyAgICB0aXRsZSA9IFtAIkFib3V0ICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3Iob3JkZXJGcm9udFN0YW5kYXJkQWJvdXRQYW5lbDopIGtleUVxdWl2YWxlbnQ6QCIiXTsKKworICAgIFthcHBsZU1lbnUgYWRkSXRlbTpbTlNNZW51SXRlbSBzZXBhcmF0b3JJdGVtXV07CisKKyAgICB0aXRsZSA9IFtAIkhpZGUgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3RvcihoaWRlOikga2V5RXF1aXZhbGVudDpAImgiXTsKKworICAgIG1lbnVJdGVtID0gKE5TTWVudUl0ZW0gKilbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6QCJIaWRlIE90aGVycyIgYWN0aW9uOkBzZWxlY3RvcihoaWRlT3RoZXJBcHBsaWNhdGlvbnM6KSBrZXlFcXVpdmFsZW50OkAiaCJdOworICAgIFttZW51SXRlbSBzZXRLZXlFcXVpdmFsZW50TW9kaWZpZXJNYXNrOihOU0FsdGVybmF0ZUtleU1hc2t8TlNDb21tYW5kS2V5TWFzayldOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOkAiU2hvdyBBbGwiIGFjdGlvbjpAc2VsZWN0b3IodW5oaWRlQWxsQXBwbGljYXRpb25zOikga2V5RXF1aXZhbGVudDpAIiJdOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtOltOU01lbnVJdGVtIHNlcGFyYXRvckl0ZW1dXTsKKworICAgIHRpdGxlID0gW0AiUXVpdCAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKHRlcm1pbmF0ZTopIGtleUVxdWl2YWxlbnQ6QCJxIl07CisKKyAgICAKKyAgICAvKiBQdXQgbWVudSBpbnRvIHRoZSBtZW51YmFyICovCisgICAgbWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCIiIGFjdGlvbjpuaWwga2V5RXF1aXZhbGVudDpAIiJdOworICAgIFttZW51SXRlbSBzZXRTdWJtZW51OmFwcGxlTWVudV07CisgICAgW1tOU0FwcCBtYWluTWVudV0gYWRkSXRlbTptZW51SXRlbV07CisKKyAgICAvKiBUZWxsIHRoZSBhcHBsaWNhdGlvbiBvYmplY3QgdGhhdCB0aGlzIGlzIG5vdyB0aGUgYXBwbGljYXRpb24gbWVudSAqLworICAgIFtOU0FwcCBzZXRBcHBsZU1lbnU6YXBwbGVNZW51XTsKKworICAgIC8qIEZpbmFsbHkgZ2l2ZSB1cCBvdXIgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyAqLworICAgIFthcHBsZU1lbnUgcmVsZWFzZV07CisgICAgW21lbnVJdGVtIHJlbGVhc2VdOworfQorCisvKiBDcmVhdGUgYSB3aW5kb3cgbWVudSAqLworc3RhdGljIHZvaWQgc2V0dXBXaW5kb3dNZW51KHZvaWQpCit7CisgICAgTlNNZW51ICAgICAgKndpbmRvd01lbnU7CisgICAgTlNNZW51SXRlbSAgKndpbmRvd01lbnVJdGVtOworICAgIE5TTWVudUl0ZW0gICptZW51SXRlbTsKKworICAgIHdpbmRvd01lbnUgPSBbW05TTWVudSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIldpbmRvdyJdOworICAgIAorICAgIC8qICJNaW5pbWl6ZSIgaXRlbSAqLworICAgIG1lbnVJdGVtID0gW1tOU01lbnVJdGVtIGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiTWluaW1pemUiIGFjdGlvbjpAc2VsZWN0b3IocGVyZm9ybU1pbmlhdHVyaXplOikga2V5RXF1aXZhbGVudDpAIm0iXTsKKyAgICBbd2luZG93TWVudSBhZGRJdGVtOm1lbnVJdGVtXTsKKyAgICBbbWVudUl0ZW0gcmVsZWFzZV07CisgICAgCisgICAgLyogUHV0IG1lbnUgaW50byB0aGUgbWVudWJhciAqLworICAgIHdpbmRvd01lbnVJdGVtID0gW1tOU01lbnVJdGVtIGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiV2luZG93IiBhY3Rpb246bmlsIGtleUVxdWl2YWxlbnQ6QCIiXTsKKyAgICBbd2luZG93TWVudUl0ZW0gc2V0U3VibWVudTp3aW5kb3dNZW51XTsKKyAgICBbW05TQXBwIG1haW5NZW51XSBhZGRJdGVtOndpbmRvd01lbnVJdGVtXTsKKyAgICAKKyAgICAvKiBUZWxsIHRoZSBhcHBsaWNhdGlvbiBvYmplY3QgdGhhdCB0aGlzIGlzIG5vdyB0aGUgd2luZG93IG1lbnUgKi8KKyAgICBbTlNBcHAgc2V0V2luZG93c01lbnU6d2luZG93TWVudV07CisKKyAgICAvKiBGaW5hbGx5IGdpdmUgdXAgb3VyIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdHMgKi8KKyAgICBbd2luZG93TWVudSByZWxlYXNlXTsKKyAgICBbd2luZG93TWVudUl0ZW0gcmVsZWFzZV07Cit9CisKKy8qIFJlcGxhY2VtZW50IGZvciBOU0FwcGxpY2F0aW9uTWFpbiAqLworc3RhdGljIHZvaWQgQ3VzdG9tQXBwbGljYXRpb25NYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgTlNBdXRvcmVsZWFzZVBvb2wJKnBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyAgICBTRExNYWluCQkJCSpzZGxNYWluOworCisgICAgLyogRW5zdXJlIHRoZSBhcHBsaWNhdGlvbiBvYmplY3QgaXMgaW5pdGlhbGlzZWQgKi8KKyAgICBbU0RMQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIAorI2lmZGVmIFNETF9VU0VfQ1BTCisgICAgeworICAgICAgICBDUFNQcm9jZXNzU2VyTnVtIFBTTjsKKyAgICAgICAgLyogVGVsbCB0aGUgZG9jayBhYm91dCB1cyAqLworICAgICAgICBpZiAoIUNQU0dldEN1cnJlbnRQcm9jZXNzKCZQU04pKQorICAgICAgICAgICAgaWYgKCFDUFNFbmFibGVGb3JlZ3JvdW5kT3BlcmF0aW9uKCZQU04sMHgwMywweDNDLDB4MkMsMHgxMTAzKSkKKyAgICAgICAgICAgICAgICBpZiAoIUNQU1NldEZyb250UHJvY2VzcygmUFNOKSkKKyAgICAgICAgICAgICAgICAgICAgW1NETEFwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKKyAgICB9CisjZW5kaWYgLyogU0RMX1VTRV9DUFMgKi8KKworICAgIC8qIFNldCB1cCB0aGUgbWVudWJhciAqLworICAgIFtOU0FwcCBzZXRNYWluTWVudTpbW05TTWVudSBhbGxvY10gaW5pdF1dOworICAgIHNldEFwcGxpY2F0aW9uTWVudSgpOworICAgIHNldHVwV2luZG93TWVudSgpOworCisgICAgLyogQ3JlYXRlIFNETE1haW4gYW5kIG1ha2UgaXQgdGhlIGFwcCBkZWxlZ2F0ZSAqLworICAgIHNkbE1haW4gPSBbW1NETE1haW4gYWxsb2NdIGluaXRdOworICAgIFtOU0FwcCBzZXREZWxlZ2F0ZTpzZGxNYWluXTsKKyAgICAKKyAgICAvKiBTdGFydCB0aGUgbWFpbiBldmVudCBsb29wICovCisgICAgW05TQXBwIHJ1bl07CisgICAgCisgICAgW3NkbE1haW4gcmVsZWFzZV07CisgICAgW3Bvb2wgcmVsZWFzZV07Cit9CisKKyNlbmRpZgorCisKKy8qCisgKiBDYXRjaCBkb2N1bWVudCBvcGVuIHJlcXVlc3RzLi4udGhpcyBsZXRzIHVzIG5vdGljZSBmaWxlcyB3aGVuIHRoZSBhcHAKKyAqICB3YXMgbGF1bmNoZWQgYnkgZG91YmxlLWNsaWNraW5nIGEgZG9jdW1lbnQsIG9yIHdoZW4gYSBkb2N1bWVudCB3YXMKKyAqICBkcmFnZ2VkL2Ryb3BwZWQgb24gdGhlIGFwcCdzIGljb24uIFlvdSBuZWVkIHRvIGhhdmUgYQorICogIENGQnVuZGxlRG9jdW1lbnRzVHlwZSBzZWN0aW9uIGluIHlvdXIgSW5mby5wbGlzdCB0byBnZXQgdGhpcyBtZXNzYWdlLAorICogIGFwcGFyZW50bHkuCisgKgorICogRmlsZXMgYXJlIGFkZGVkIHRvIGdBcmd2LCBzbyB0byB0aGUgYXBwLCB0aGV5J2xsIGxvb2sgbGlrZSBjb21tYW5kIGxpbmUKKyAqICBhcmd1bWVudHMuIFByZXZpb3VzbHksIGFwcHMgbGF1bmNoZWQgZnJvbSB0aGUgZmluZGVyIGhhZCBub3RoaW5nIGJ1dAorICogIGFuIGFyZ3ZbMF0uCisgKgorICogVGhpcyBtZXNzYWdlIG1heSBiZSByZWNlaXZlZCBtdWx0aXBsZSB0aW1lcyB0byBvcGVuIHNldmVyYWwgZG9jcyBvbiBsYXVuY2guCisgKgorICogVGhpcyBtZXNzYWdlIGlzIGlnbm9yZWQgb25jZSB0aGUgYXBwJ3MgbWFpbmxpbmUgaGFzIGJlZW4gY2FsbGVkLgorICovCistIChCT09MKWFwcGxpY2F0aW9uOihOU0FwcGxpY2F0aW9uICopdGhlQXBwbGljYXRpb24gb3BlbkZpbGU6KE5TU3RyaW5nICopZmlsZW5hbWUKK3sKKyAgICBjb25zdCBjaGFyICp0ZW1wYXJnOworICAgIHNpemVfdCBhcmdsZW47CisgICAgY2hhciAqYXJnOworICAgIGNoYXIgKipuZXdhcmd2OworCisgICAgaWYgKCFnRmluZGVyTGF1bmNoKSAgLyogTWFjT1MgaXMgcGFzc2luZyBjb21tYW5kIGxpbmUgYXJncy4gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGdDYWxsZWRBcHBNYWlubGluZSkgIC8qIGFwcCBoYXMgc3RhcnRlZCwgaWdub3JlIHRoaXMgZG9jdW1lbnQuICovCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHRlbXBhcmcgPSBbZmlsZW5hbWUgVVRGOFN0cmluZ107CisgICAgYXJnbGVuID0gU0RMX3N0cmxlbih0ZW1wYXJnKSArIDE7CisgICAgYXJnID0gKGNoYXIgKikgU0RMX21hbGxvYyhhcmdsZW4pOworICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgbmV3YXJndiA9IChjaGFyICoqKSByZWFsbG9jKGdBcmd2LCBzaXplb2YgKGNoYXIgKikgKiAoZ0FyZ2MgKyAyKSk7CisgICAgaWYgKG5ld2FyZ3YgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNETF9mcmVlKGFyZyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZ0FyZ3YgPSBuZXdhcmd2OworCisgICAgU0RMX3N0cmxjcHkoYXJnLCB0ZW1wYXJnLCBhcmdsZW4pOworICAgIGdBcmd2W2dBcmdjKytdID0gYXJnOworICAgIGdBcmd2W2dBcmdjXSA9IE5VTEw7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyogQ2FsbGVkIHdoZW4gdGhlIGludGVybmFsIGV2ZW50IGxvb3AgaGFzIGp1c3Qgc3RhcnRlZCBydW5uaW5nICovCistICh2b2lkKSBhcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzogKE5TTm90aWZpY2F0aW9uICopIG5vdGUKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgLyogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgLmFwcCdzIHBhcmVudCBkaXJlY3RvcnkgKi8KKyAgICBbc2VsZiBzZXR1cFdvcmtpbmdEaXJlY3Rvcnk6Z0ZpbmRlckxhdW5jaF07CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisgICAgLyogU2V0IHRoZSBtYWluIG1lbnUgdG8gY29udGFpbiB0aGUgcmVhbCBhcHAgbmFtZSBpbnN0ZWFkIG9mICJTREwgQXBwIiAqLworICAgIFtzZWxmIGZpeE1lbnU6W05TQXBwIG1haW5NZW51XSB3aXRoQXBwTmFtZTpnZXRBcHBsaWNhdGlvbk5hbWUoKV07CisjZW5kaWYKKworICAgIC8qIEhhbmQgb2ZmIHRvIG1haW4gYXBwbGljYXRpb24gY29kZSAqLworICAgIGdDYWxsZWRBcHBNYWlubGluZSA9IFRSVUU7CisgICAgc3RhdHVzID0gU0RMX21haW4gKGdBcmdjLCBnQXJndik7CisKKyAgICAvKiBXZSdyZSBkb25lLCB0aGFuayB5b3UgZm9yIHBsYXlpbmcgKi8KKyAgICBleGl0KHN0YXR1cyk7Cit9CitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIE5TU3RyaW5nIChSZXBsYWNlU3ViU3RyaW5nKQorCistIChOU1N0cmluZyAqKXN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGg6KE5TU3RyaW5nICopYVN0cmluZworeworICAgIHVuc2lnbmVkIGludCBidWZmZXJTaXplOworICAgIHVuc2lnbmVkIGludCBzZWxmTGVuID0gW3NlbGYgbGVuZ3RoXTsKKyAgICB1bnNpZ25lZCBpbnQgYVN0cmluZ0xlbiA9IFthU3RyaW5nIGxlbmd0aF07CisgICAgdW5pY2hhciAqYnVmZmVyOworICAgIE5TUmFuZ2UgbG9jYWxSYW5nZTsKKyAgICBOU1N0cmluZyAqcmVzdWx0OworCisgICAgYnVmZmVyU2l6ZSA9IHNlbGZMZW4gKyBhU3RyaW5nTGVuIC0gYVJhbmdlLmxlbmd0aDsKKyAgICBidWZmZXIgPSAodW5pY2hhciAqKU5TQWxsb2NhdGVNZW1vcnlQYWdlcyhidWZmZXJTaXplKnNpemVvZih1bmljaGFyKSk7CisgICAgCisgICAgLyogR2V0IGZpcnN0IHBhcnQgaW50byBidWZmZXIgKi8KKyAgICBsb2NhbFJhbmdlLmxvY2F0aW9uID0gMDsKKyAgICBsb2NhbFJhbmdlLmxlbmd0aCA9IGFSYW5nZS5sb2NhdGlvbjsKKyAgICBbc2VsZiBnZXRDaGFyYWN0ZXJzOmJ1ZmZlciByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAKKyAgICAvKiBHZXQgbWlkZGxlIHBhcnQgaW50byBidWZmZXIgKi8KKyAgICBsb2NhbFJhbmdlLmxvY2F0aW9uID0gMDsKKyAgICBsb2NhbFJhbmdlLmxlbmd0aCA9IGFTdHJpbmdMZW47CisgICAgW2FTdHJpbmcgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbikgcmFuZ2U6bG9jYWxSYW5nZV07CisgICAgIAorICAgIC8qIEdldCBsYXN0IHBhcnQgaW50byBidWZmZXIgKi8KKyAgICBsb2NhbFJhbmdlLmxvY2F0aW9uID0gYVJhbmdlLmxvY2F0aW9uICsgYVJhbmdlLmxlbmd0aDsKKyAgICBsb2NhbFJhbmdlLmxlbmd0aCA9IHNlbGZMZW4gLSBsb2NhbFJhbmdlLmxvY2F0aW9uOworICAgIFtzZWxmIGdldENoYXJhY3RlcnM6KGJ1ZmZlcithUmFuZ2UubG9jYXRpb24rYVN0cmluZ0xlbikgcmFuZ2U6bG9jYWxSYW5nZV07CisgICAgCisgICAgLyogQnVpbGQgb3V0cHV0IHN0cmluZyAqLworICAgIHJlc3VsdCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoQ2hhcmFjdGVyczpidWZmZXIgbGVuZ3RoOmJ1ZmZlclNpemVdOworICAgIAorICAgIE5TRGVhbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlciwgYnVmZmVyU2l6ZSk7CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQGVuZAorCisKKworI2lmZGVmIG1haW4KKyMgIHVuZGVmIG1haW4KKyNlbmRpZgorCisKKy8qIE1haW4gZW50cnkgcG9pbnQgdG8gZXhlY3V0YWJsZSAtIHNob3VsZCAqbm90KiBiZSBTRExfbWFpbiEgKi8KK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgLyogQ29weSB0aGUgYXJndW1lbnRzIGludG8gYSBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICAvKiBUaGlzIGlzIHBhc3NlZCBpZiB3ZSBhcmUgbGF1bmNoZWQgYnkgZG91YmxlLWNsaWNraW5nICovCisgICAgaWYgKCBhcmdjID49IDIgJiYgc3RybmNtcCAoYXJndlsxXSwgIi1wc24iLCA0KSA9PSAwICkgeworICAgICAgICBnQXJndiA9IChjaGFyICoqKSBTRExfbWFsbG9jKHNpemVvZiAoY2hhciAqKSAqIDIpOworICAgICAgICBnQXJndlswXSA9IGFyZ3ZbMF07CisgICAgICAgIGdBcmd2WzFdID0gTlVMTDsKKyAgICAgICAgZ0FyZ2MgPSAxOworICAgICAgICBnRmluZGVyTGF1bmNoID0gWUVTOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBnQXJnYyA9IGFyZ2M7CisgICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogKGFyZ2MrMSkpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGFyZ2M7IGkrKykKKyAgICAgICAgICAgIGdBcmd2W2ldID0gYXJndltpXTsKKyAgICAgICAgZ0ZpbmRlckxhdW5jaCA9IE5POworICAgIH0KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICBbU0RMQXBwbGljYXRpb24gcG9zZUFzQ2xhc3M6W05TQXBwbGljYXRpb24gY2xhc3NdXTsKKyAgICBOU0FwcGxpY2F0aW9uTWFpbiAoYXJnYywgYXJndik7CisjZWxzZQorICAgIEN1c3RvbUFwcGxpY2F0aW9uTWFpbiAoYXJnYywgYXJndik7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2ggYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDA5NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2gKQEAgLTAsMCArMSw5IEBACisvLworLy8gUHJlZml4IGhlYWRlciBmb3IgYWxsIHNvdXJjZSBmaWxlcyBvZiB0aGUgJ8dQUk9KRUNUTkFNRcgnIHRhcmdldCBpbiB0aGUgJ8dQUk9KRUNUTkFNRcgnIHByb2plY3QKKy8vCisKKyNpbmNsdWRlICJTREwuaCIKKworI2lmZGVmIF9fT0JKQ19fCisgICAgI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUljb24uaWNucyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJY29uLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwYjAyYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJY29uLmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUluZm8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWNhNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUluZm8ucGxpc3QKQEAgLTAsMCArMSwxMiBAQAoreworCUZpbGVzVG9SZW5hbWUgPSB7CisJCSJTRExBcHBfUHJlZml4LnBjaCIgPSAix1BST0pFQ1ROQU1FyF9QcmVmaXgucGNoIjsKKwl9OworCUZpbGVzVG9NYWNyb0V4cGFuZCA9ICgKKwkJIsdQUk9KRUNUTkFNRchfUHJlZml4LnBjaCIsCisJCSJJbmZvLnBsaXN0IiwKKwkJIkVuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MiLAorCQkibWFpbi5jIiwKKwkpOworCURlc2NyaXB0aW9uID0gIlRoaXMgcHJvamVjdCBidWlsZHMgYW4gU0RMLWJhc2VkIGFwcGxpY2F0aW9uLiI7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTUzYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMCwwICsxLDMxMCBAQAorLy8gISQqVVRGOCokIQoreworCWFyY2hpdmVWZXJzaW9uID0gMTsKKwljbGFzc2VzID0geworCX07CisJb2JqZWN0VmVyc2lvbiA9IDQ2OworCW9iamVjdHMgPSB7CisKKy8qIEJlZ2luIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisJCTAwMkYzOUZBMDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjM5RjkwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzQTAwMDlEMDg4NDYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovOyB9OworCQkwMDJGM0EyRTA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNBMkMwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSAqLzsgfTsKKwkJMDAyRjNBM0YwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi87IH07CisJCThEMTEwNzJCMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg5QzE2NUNGRTg0MEUwQ0MwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovOyB9OworCQk4RDExMDcyRjA0ODZDRUI4MDBFNDcwOTAgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKy8qIEVuZCBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMDAyRjM5RkQwOUQwODgzNDAwRUJFQjg4IC8qIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovID0geworCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlkc3RQYXRoID0gIiI7CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gMTA7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGM0EwMDA5RDA4ODQ2MDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSAqLywKKwkJCSk7CisJCQluYW1lID0gIkNvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlIjsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KKwkJMDAyRjM5RjkwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IFNETC5mcmFtZXdvcms7IHBhdGggPSAvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTAwMkYzQTJCMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExNYWluLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNBMkMwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNETE1haW4ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0EzRTA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gbWFpbi5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTA4OUMxNjVERkU4NDBFMENDMDJBQUMwNyAvKiBFbmdsaXNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDEwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Quc3RyaW5nczsgbmFtZSA9IEVuZ2xpc2g7IHBhdGggPSBFbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDb2NvYS5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTI5Qjk3MzI0RkRDRkEzOTQxMUNBMkNFQSAvKiBBcHBLaXQuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBBcHBLaXQuZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMjlCOTczMjVGRENGQTM5NDExQ0EyQ0VBIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBGb3VuZGF0aW9uLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0ZvdW5kYXRpb24uZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkzMkNBNEY2MzAzNjhEMUVFMDBDOTE3ODMgLyogX19fUFJPSkVDVE5BTUVfX19fUHJlZml4LnBjaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gIl9fX1BST0pFQ1ROQU1FX19fX1ByZWZpeC5wY2giOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4RDExMDczMTA0ODZDRUI4MDBFNDcwOTAgLyogSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Q7IHBhdGggPSBJbmZvLnBsaXN0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4RDExMDczMjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18uYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSAiX19fUFJPSkVDVE5BTUVfX18uYXBwIjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKy8qIEVuZCBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDExMDcyRTA0ODZDRUI4MDBFNDcwOTAgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzOUZBMDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJOEQxMTA3MkYwNDg2Q0VCODAwRTQ3MDkwIC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwODBFOTZEREZFMjAxRDZEN0YwMDAwMDEgLyogQ2xhc3NlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDAyRjNBMkIwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4uaCAqLywKKwkJCQkwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovLAorCQkJKTsKKwkJCW5hbWUgPSBDbGFzc2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMTA1OEM3QTBGRUE1NEYwMTExQ0EyQ0JCIC8qIExpbmtlZCBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLywKKwkJCQkxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovLAorCQkJKTsKKwkJCW5hbWUgPSAiTGlua2VkIEZyYW1ld29ya3MiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMTA1OEM3QTJGRUE1NEYwMTExQ0EyQ0JCIC8qIE90aGVyIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTI5Qjk3MzI0RkRDRkEzOTQxMUNBMkNFQSAvKiBBcHBLaXQuZnJhbWV3b3JrICovLAorCQkJCTI5Qjk3MzI1RkRDRkEzOTQxMUNBMkNFQSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayAqLywKKwkJCSk7CisJCQluYW1lID0gIk90aGVyIEZyYW1ld29ya3MiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMTlDMjhGQUNGRTlENTIwRDExQ0EyQ0JCIC8qIFByb2R1Y3RzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk4RDExMDczMjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18uYXBwICovLAorCQkJKTsKKwkJCW5hbWUgPSBQcm9kdWN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE0RkRDRkEzOTQxMUNBMkNFQSAvKiBfX19QUk9KRUNUTkFNRUFTWE1MX19fICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODBFOTZEREZFMjAxRDZEN0YwMDAwMDEgLyogQ2xhc3NlcyAqLywKKwkJCQkyOUI5NzMxNUZEQ0ZBMzk0MTFDQTJDRUEgLyogT3RoZXIgU291cmNlcyAqLywKKwkJCQkyOUI5NzMxN0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUmVzb3VyY2VzICovLAorCQkJCTI5Qjk3MzIzRkRDRkEzOTQxMUNBMkNFQSAvKiBGcmFtZXdvcmtzICovLAorCQkJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLywKKwkJCSk7CisJCQluYW1lID0gIl9fX1BST0pFQ1ROQU1FQVNYTUxfX18iOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTVGRENGQTM5NDExQ0EyQ0VBIC8qIE90aGVyIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTMyQ0E0RjYzMDM2OEQxRUUwMEM5MTc4MyAvKiBfX19QUk9KRUNUTkFNRV9fX19QcmVmaXgucGNoICovLAorCQkJCTAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBTb3VyY2VzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE3RkRDRkEzOTQxMUNBMkNFQSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCThEMTEwNzMxMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvLnBsaXN0ICovLAorCQkJCTA4OUMxNjVDRkU4NDBFMENDMDJBQUMwNyAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLywKKwkJCSk7CisJCQluYW1lID0gUmVzb3VyY2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMjNGRENGQTM5NDExQ0EyQ0VBIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTEwNThDN0EwRkVBNTRGMDExMUNBMkNCQiAvKiBMaW5rZWQgRnJhbWV3b3JrcyAqLywKKwkJCQkxMDU4QzdBMkZFQTU0RjAxMTFDQTJDQkIgLyogT3RoZXIgRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQluYW1lID0gRnJhbWV3b3JrczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCQk4RDExMDcyNjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18gKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gQzAxRkNGNEEwOEE5NTQ1NDAwNTQyNDdCIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJfX19QUk9KRUNUTkFNRV9fXyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk4RDExMDcyOTA0ODZDRUI4MDBFNDcwOTAgLyogUmVzb3VyY2VzICovLAorCQkJCThEMTEwNzJDMDQ4NkNFQjgwMEU0NzA5MCAvKiBTb3VyY2VzICovLAorCQkJCThEMTEwNzJFMDQ4NkNFQjgwMEU0NzA5MCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzOUZEMDlEMDg4MzQwMEVCRUI4OCAvKiBDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gIl9fX1BST0pFQ1ROQU1FX19fIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKEhPTUUpL0FwcGxpY2F0aW9ucyI7CisJCQlwcm9kdWN0TmFtZSA9ICJfX19QUk9KRUNUTkFNRV9fXyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkyOUI5NzMxM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEMwMUZDRjRFMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIl9fX1BST0pFQ1ROQU1FX19fIiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDMuMiI7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCW1haW5Hcm91cCA9IDI5Qjk3MzE0RkRDRkEzOTQxMUNBMkNFQSAvKiBfX19QUk9KRUNUTkFNRUFTWE1MX19fICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMTEwNzI2MDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXyAqLywKKwkJCSk7CisJCX07CisvKiBFbmQgUEJYUHJvamVjdCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDExMDcyOTA0ODZDRUI4MDBFNDcwOTAgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk4RDExMDcyQjA0ODZDRUI4MDBFNDcwOTAgLyogSW5mb1BsaXN0LnN0cmluZ3MgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzJDMDQ4NkNFQjgwMEU0NzA5MCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjNBMkUwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzQTNGMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFZhcmlhbnRHcm91cCBzZWN0aW9uICovCisJCTA4OUMxNjVDRkU4NDBFMENDMDJBQUMwNyAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLyA9IHsKKwkJCWlzYSA9IFBCWFZhcmlhbnRHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA4OUMxNjVERkU4NDBFMENDMDJBQUMwNyAvKiBFbmdsaXNoICovLAorCQkJKTsKKwkJCW5hbWUgPSBJbmZvUGxpc3Quc3RyaW5nczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYVmFyaWFudEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCQlDMDFGQ0Y0QjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICJfX19QUk9KRUNUTkFNRUFTSURFTlRJRklFUl9fX19QcmVmaXgucGNoIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCQlQUk9EVUNUX05BTUUgPSAiX19fUFJPSkVDVE5BTUVfX18iOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJQzAxRkNGNEMwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk87CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL0FwcGxpY2F0aW9ucyI7CisJCQkJUFJPRFVDVF9OQU1FID0gIl9fX1BST0pFQ1ROQU1FX19fIjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJQzAxRkNGNEYwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfNjRfQklUKSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3JrcywKKwkJCQkJIiQoRlJBTUVXT1JLX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJR0NDX1ZFUlNJT04gPSA0LjA7CisJCQkJIkdDQ19WRVJTSU9OW2FyY2g9eDg2XzY0XSIgPSA0LjI7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycywKKwkJCQkJIiQoSEVBREVSX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVNES1JPT1QgPSBtYWNvc3gxMC40OworCQkJCSJTREtST09UW2FyY2g9eDg2XzY0XSIgPSBtYWNvc3gxMC42OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJQzAxRkNGNTAwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl82NF9CSVQpIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzLAorCQkJCQkiJChGUkFNRVdPUktfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlHQ0NfVkVSU0lPTiA9IDQuMDsKKwkJCQkiR0NDX1ZFUlNJT05bYXJjaD14ODZfNjRdIiA9IDQuMjsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzLAorCQkJCQkiJChIRUFERVJfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJU0RLUk9PVCA9IG1hY29zeDEwLjQ7CisJCQkJIlNES1JPT1RbYXJjaD14ODZfNjRdIiA9IG1hY29zeDEwLjY7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwkJQzAxRkNGNEEwOEE5NTQ1NDAwNTQyNDdCIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJfX19QUk9KRUNUTkFNRV9fXyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlDMDFGQ0Y0QjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8sCisJCQkJQzAxRkNGNEMwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJQzAxRkNGNEUwOEE5NTQ1NDAwNTQyNDdCIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiX19fUFJPSkVDVE5BTUVfX18iICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJQzAxRkNGNEYwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovLAorCQkJCUMwMUZDRjUwMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJfTsKKwlyb290T2JqZWN0ID0gMjlCOTczMTNGRENGQTM5NDExQ0EyQ0VBIC8qIFByb2plY3Qgb2JqZWN0ICovOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIEFwcGxpY2F0aW9uL21haW4uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNWRlOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBBcHBsaWNhdGlvbi9tYWluLmMKQEAgLTAsMCArMSw2NSBAQAorCisvKiBTaW1wbGUgcHJvZ3JhbTogIENyZWF0ZSBhIGJsYW5rIHdpbmRvdywgd2FpdCBmb3Iga2V5cHJlc3MsIHF1aXQuCisKKyAgIFBsZWFzZSBzZWUgdGhlIFNETCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIHVzaW5nIHRoZSBTREwgQVBJOgorICAgL0RldmVsb3Blci9Eb2N1bWVudGF0aW9uL1NETC9kb2NzLmh0bWwKKyovCisgICAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIlNETC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCVVpbnQzMiBpbml0ZmxhZ3MgPSBTRExfSU5JVF9WSURFTzsgIC8qIFNlZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzICovCisJU0RMX1N1cmZhY2UgKnNjcmVlbjsKKwlVaW50OCAgdmlkZW9fYnBwID0gMDsKKwlVaW50MzIgdmlkZW9mbGFncyA9IFNETF9TV1NVUkZBQ0U7CisJaW50ICAgIGRvbmU7CisgICAgICAgIFNETF9FdmVudCBldmVudDsKKworCS8qIEluaXRpYWxpemUgdGhlIFNETCBsaWJyYXJ5ICovCisJaWYgKCBTRExfSW5pdChpbml0ZmxhZ3MpIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBpbml0aWFsaXplIFNETDogJXNcbiIsCisJCQlTRExfR2V0RXJyb3IoKSk7CisJCWV4aXQoMSk7CisJfQorCisJLyogU2V0IDY0MHg0ODAgdmlkZW8gbW9kZSAqLworCXNjcmVlbj1TRExfU2V0VmlkZW9Nb2RlKDY0MCw0ODAsIHZpZGVvX2JwcCwgdmlkZW9mbGFncyk7CisgICAgICAgIGlmIChzY3JlZW4gPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IHNldCA2NDB4NDgweCVkIHZpZGVvIG1vZGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fYnBwLCBTRExfR2V0RXJyb3IoKSk7CisJCVNETF9RdWl0KCk7CisJCWV4aXQoMik7CisJfQorCisJZG9uZSA9IDA7CisJd2hpbGUgKCAhZG9uZSApIHsKKworCQkvKiBDaGVjayBmb3IgZXZlbnRzICovCisJCXdoaWxlICggU0RMX1BvbGxFdmVudCgmZXZlbnQpICkgeworCQkJc3dpdGNoIChldmVudC50eXBlKSB7CisKKwkJCQljYXNlIFNETF9NT1VTRU1PVElPTjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRExfTU9VU0VCVVRUT05ET1dOOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9LRVlET1dOOgorCQkJCQkvKiBBbnkga2V5cHJlc3MgcXVpdHMgdGhlIGFwcC4uLiAqLworCQkJCWNhc2UgU0RMX1FVSVQ6CisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkKKwkvKiBDbGVhbiB1cCB0aGUgU0RMIGxpYnJhcnkgKi8KKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MjFiMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliL2NsYXNzZXMubmliIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovU0RMTWFpbi5uaWIvY2xhc3Nlcy5uaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5ZWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliL2NsYXNzZXMubmliCkBAIC0wLDAgKzEsMTkgQEAKK3sKKyAgICBJQkNsYXNzZXMgPSAoCisgICAgICAgIHtDTEFTUyA9IEZpcnN0UmVzcG9uZGVyOyBMQU5HVUFHRSA9IE9iakM7IFNVUEVSQ0xBU1MgPSBOU09iamVjdDsgfSwgCisgICAgICAgIHsKKyAgICAgICAgICAgIEFDVElPTlMgPSB7CisgICAgICAgICAgICAgICAgaGVscCA9IGlkOyAKKyAgICAgICAgICAgICAgICBuZXdHYW1lID0gaWQ7IAorICAgICAgICAgICAgICAgIG9wZW5HYW1lID0gaWQ7IAorICAgICAgICAgICAgICAgIHByZWZzTWVudSA9IGlkOyAKKyAgICAgICAgICAgICAgICBzYXZlR2FtZSA9IGlkOyAKKyAgICAgICAgICAgICAgICBzYXZlR2FtZUFzID0gaWQ7IAorICAgICAgICAgICAgfTsgCisgICAgICAgICAgICBDTEFTUyA9IFNETE1haW47IAorICAgICAgICAgICAgTEFOR1VBR0UgPSBPYmpDOyAKKyAgICAgICAgICAgIFNVUEVSQ0xBU1MgPSBOU09iamVjdDsgCisgICAgICAgIH0KKyAgICApOyAKKyAgICBJQlZlcnNpb24gPSAxOyAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9TRExNYWluLm5pYi9pbmZvLm5pYiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliL2luZm8ubmliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmZiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9TRExNYWluLm5pYi9pbmZvLm5pYgpAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+SUJEb2N1bWVudExvY2F0aW9uPC9rZXk+CisJPHN0cmluZz42MiAxMTcgMzU2IDI0MCAwIDAgMTE1MiA4NDggPC9zdHJpbmc+CisJPGtleT5JQkVkaXRvclBvc2l0aW9uczwva2V5PgorCTxkaWN0PgorCQk8a2V5PjI5PC9rZXk+CisJCTxzdHJpbmc+NjIgMzYyIDE5NSA0NCAwIDAgMTE1MiA4NDggPC9zdHJpbmc+CisJPC9kaWN0PgorCTxrZXk+SUJGcmFtZXdvcmsgVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MjkxLjA8L3N0cmluZz4KKwk8a2V5PklCT3Blbk9iamVjdHM8L2tleT4KKwk8YXJyYXk+CisJCTxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgorCTwvYXJyYXk+CisJPGtleT5JQlN5c3RlbSBWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42TDYwPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovU0RMTWFpbi5uaWIvb2JqZWN0cy5uaWIgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9TRExNYWluLm5pYi9vYmplY3RzLm5pYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzc4MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovU0RMTWFpbi5uaWIvb2JqZWN0cy5uaWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0luZm8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE5NzBmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL0luZm8ucGxpc3QKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+JHtFWEVDVVRBQkxFX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLnlvdXJjb21wYW55Ll9fX1BST0pFQ1ROQU1FQVNYTUxfX188L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW48L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKwk8a2V5PkxTTWluaW11bVN5c3RlbVZlcnNpb25CeUFyY2hpdGVjdHVyZTwva2V5PgorCTxkaWN0PgorCQk8a2V5Png4Nl82NDwva2V5PgorCQk8c3RyaW5nPjEwLjYuMDwvc3RyaW5nPgorCQk8a2V5PmkzODY8L2tleT4KKwkJPHN0cmluZz4xMC40LjA8L3N0cmluZz4KKwkJPGtleT5wcGM8L2tleT4KKwkJPHN0cmluZz4xMC40LjA8L3N0cmluZz4KKwk8L2RpY3Q+CQorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExNYWluLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMTWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmQ5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMTWFpbi5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAorICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKyAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KKworICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcworKi8KKworI2lmbmRlZiBfU0RMTWFpbl9oXworI2RlZmluZSBfU0RMTWFpbl9oXworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCitAaW50ZXJmYWNlIFNETE1haW4gOiBOU09iamVjdAorQGVuZAorCisjZW5kaWYgLyogX1NETE1haW5faF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExNYWluLm0gYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMTWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjVhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMTWFpbi5tCkBAIC0wLDAgKzEsMzgzIEBACisvKiAgIFNETE1haW4ubSAtIG1haW4gZW50cnkgcG9pbnQgZm9yIG91ciBDb2NvYS1pemVkIFNETCBhcHAKKyAgICAgICBJbml0aWFsIFZlcnNpb246IERhcnJlbGwgV2FsaXNzZXIgPGR3YWxpc3MxQHB1cmR1ZS5lZHU+CisgICAgICAgTm9uLU5JQi1Db2RlICYgb3RoZXIgY2hhbmdlczogTWF4IEhvcm4gPG1heEBxdWVuZGkuZGU+CisKKyAgICBGZWVsIGZyZWUgdG8gY3VzdG9taXplIHRoaXMgZmlsZSB0byBzdWl0IHlvdXIgbmVlZHMKKyovCisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExNYWluLmgiCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+IC8qIGZvciBNQVhQQVRITEVOICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qIEZvciBzb21lIHJlYW9uLCBBcHBsZSByZW1vdmVkIHNldEFwcGxlTWVudSBmcm9tIHRoZSBoZWFkZXJzIGluIDEwLjQsCisgYnV0IHRoZSBtZXRob2Qgc3RpbGwgaXMgdGhlcmUgYW5kIHdvcmtzLiBUbyBhdm9pZCB3YXJuaW5ncywgd2UgZGVjbGFyZQorIGl0IG91cnNlbHZlcyBoZXJlLiAqLworQGludGVyZmFjZSBOU0FwcGxpY2F0aW9uKFNETF9NaXNzaW5nX01ldGhvZHMpCistICh2b2lkKXNldEFwcGxlTWVudTooTlNNZW51ICopbWVudTsKK0BlbmQKKworLyogVXNlIHRoaXMgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSB1c2UgU0RMTWFpbi5uaWIgb3Igbm90ICovCisjZGVmaW5lCQlTRExfVVNFX05JQl9GSUxFCTAKKworLyogVXNlIHRoaXMgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSB1c2UgQ1BTIChkb2NraW5nKSBvciBub3QgKi8KKyNkZWZpbmUJCVNETF9VU0VfQ1BTCQkxCisjaWZkZWYgU0RMX1VTRV9DUFMKKy8qIFBvcnRpb25zIG9mIENQUy5oICovCit0eXBlZGVmIHN0cnVjdCBDUFNQcm9jZXNzU2VyTnVtCit7CisJVUludDMyCQlsbzsKKwlVSW50MzIJCWhpOworfSBDUFNQcm9jZXNzU2VyTnVtOworCitleHRlcm4gT1NFcnIJQ1BTR2V0Q3VycmVudFByb2Nlc3MoIENQU1Byb2Nlc3NTZXJOdW0gKnBzbik7CitleHRlcm4gT1NFcnIgCUNQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb24oIENQU1Byb2Nlc3NTZXJOdW0gKnBzbiwgVUludDMyIF9hcmcyLCBVSW50MzIgX2FyZzMsIFVJbnQzMiBfYXJnNCwgVUludDMyIF9hcmc1KTsKK2V4dGVybiBPU0VycglDUFNTZXRGcm9udFByb2Nlc3MoIENQU1Byb2Nlc3NTZXJOdW0gKnBzbik7CisKKyNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLworCitzdGF0aWMgaW50ICAgIGdBcmdjOworc3RhdGljIGNoYXIgICoqZ0FyZ3Y7CitzdGF0aWMgQk9PTCAgIGdGaW5kZXJMYXVuY2g7CitzdGF0aWMgQk9PTCAgIGdDYWxsZWRBcHBNYWlubGluZSA9IEZBTFNFOworCitzdGF0aWMgTlNTdHJpbmcgKmdldEFwcGxpY2F0aW9uTmFtZSh2b2lkKQoreworICAgIGNvbnN0IE5TRGljdGlvbmFyeSAqZGljdDsKKyAgICBOU1N0cmluZyAqYXBwTmFtZSA9IDA7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGFwcGxpY2F0aW9uIG5hbWUgKi8KKyAgICBkaWN0ID0gKGNvbnN0IE5TRGljdGlvbmFyeSAqKUNGQnVuZGxlR2V0SW5mb0RpY3Rpb25hcnkoQ0ZCdW5kbGVHZXRNYWluQnVuZGxlKCkpOworICAgIGlmIChkaWN0KQorICAgICAgICBhcHBOYW1lID0gW2RpY3Qgb2JqZWN0Rm9yS2V5OiBAIkNGQnVuZGxlTmFtZSJdOworICAgIAorICAgIGlmICghW2FwcE5hbWUgbGVuZ3RoXSkKKyAgICAgICAgYXBwTmFtZSA9IFtbTlNQcm9jZXNzSW5mbyBwcm9jZXNzSW5mb10gcHJvY2Vzc05hbWVdOworCisgICAgcmV0dXJuIGFwcE5hbWU7Cit9CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisvKiBBIGhlbHBlciBjYXRlZ29yeSBmb3IgTlNTdHJpbmcgKi8KK0BpbnRlcmZhY2UgTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCistIChOU1N0cmluZyAqKXN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGg6KE5TU3RyaW5nICopYVN0cmluZzsKK0BlbmQKKyNlbmRpZgorCitAaW50ZXJmYWNlIFNETEFwcGxpY2F0aW9uIDogTlNBcHBsaWNhdGlvbgorQGVuZAorCitAaW1wbGVtZW50YXRpb24gU0RMQXBwbGljYXRpb24KKy8qIEludm9rZWQgZnJvbSB0aGUgUXVpdCBtZW51IGl0ZW0gKi8KKy0gKHZvaWQpdGVybWluYXRlOihpZClzZW5kZXIKK3sKKyAgICAvKiBQb3N0IGEgU0RMX1FVSVQgZXZlbnQgKi8KKyAgICBTRExfRXZlbnQgZXZlbnQ7CisgICAgZXZlbnQudHlwZSA9IFNETF9RVUlUOworICAgIFNETF9QdXNoRXZlbnQoJmV2ZW50KTsKK30KK0BlbmQKKworLyogVGhlIG1haW4gY2xhc3Mgb2YgdGhlIGFwcGxpY2F0aW9uLCB0aGUgYXBwbGljYXRpb24ncyBkZWxlZ2F0ZSAqLworQGltcGxlbWVudGF0aW9uIFNETE1haW4KKworLyogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgLmFwcCdzIHBhcmVudCBkaXJlY3RvcnkgKi8KKy0gKHZvaWQpIHNldHVwV29ya2luZ0RpcmVjdG9yeTooQk9PTClzaG91bGRDaGRpcgoreworICAgIGlmIChzaG91bGRDaGRpcikKKyAgICB7CisgICAgICAgIGNoYXIgcGFyZW50ZGlyW01BWFBBVEhMRU5dOworICAgICAgICBDRlVSTFJlZiB1cmwgPSBDRkJ1bmRsZUNvcHlCdW5kbGVVUkwoQ0ZCdW5kbGVHZXRNYWluQnVuZGxlKCkpOworICAgICAgICBDRlVSTFJlZiB1cmwyID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCgwLCB1cmwpOworICAgICAgICBpZiAoQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24odXJsMiwgMSwgKFVJbnQ4ICopcGFyZW50ZGlyLCBNQVhQQVRITEVOKSkgeworICAgICAgICAgICAgY2hkaXIocGFyZW50ZGlyKTsgICAvKiBjaGRpciB0byB0aGUgYmluYXJ5IGFwcCdzIHBhcmVudCAqLworICAgICAgICB9CisgICAgICAgIENGUmVsZWFzZSh1cmwpOworICAgICAgICBDRlJlbGVhc2UodXJsMik7CisgICAgfQorfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorCisvKiBGaXggbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCistICh2b2lkKWZpeE1lbnU6KE5TTWVudSAqKWFNZW51IHdpdGhBcHBOYW1lOihOU1N0cmluZyAqKWFwcE5hbWUKK3sKKyAgICBOU1JhbmdlIGFSYW5nZTsKKyAgICBOU0VudW1lcmF0b3IgKmVudW1lcmF0b3I7CisgICAgTlNNZW51SXRlbSAqbWVudUl0ZW07CisKKyAgICBhUmFuZ2UgPSBbW2FNZW51IHRpdGxlXSByYW5nZU9mU3RyaW5nOkAiU0RMIEFwcCJdOworICAgIGlmIChhUmFuZ2UubGVuZ3RoICE9IDApCisgICAgICAgIFthTWVudSBzZXRUaXRsZTogW1thTWVudSB0aXRsZV0gc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTphUmFuZ2Ugd2l0aDphcHBOYW1lXV07CisKKyAgICBlbnVtZXJhdG9yID0gW1thTWVudSBpdGVtQXJyYXldIG9iamVjdEVudW1lcmF0b3JdOworICAgIHdoaWxlICgobWVudUl0ZW0gPSBbZW51bWVyYXRvciBuZXh0T2JqZWN0XSkpCisgICAgeworICAgICAgICBhUmFuZ2UgPSBbW21lbnVJdGVtIHRpdGxlXSByYW5nZU9mU3RyaW5nOkAiU0RMIEFwcCJdOworICAgICAgICBpZiAoYVJhbmdlLmxlbmd0aCAhPSAwKQorICAgICAgICAgICAgW21lbnVJdGVtIHNldFRpdGxlOiBbW21lbnVJdGVtIHRpdGxlXSBzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOmFSYW5nZSB3aXRoOmFwcE5hbWVdXTsKKyAgICAgICAgaWYgKFttZW51SXRlbSBoYXNTdWJtZW51XSkKKyAgICAgICAgICAgIFtzZWxmIGZpeE1lbnU6W21lbnVJdGVtIHN1Ym1lbnVdIHdpdGhBcHBOYW1lOmFwcE5hbWVdOworICAgIH0KKyAgICBbIGFNZW51IHNpemVUb0ZpdCBdOworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBzZXRBcHBsaWNhdGlvbk1lbnUodm9pZCkKK3sKKyAgICAvKiB3YXJuaW5nOiB0aGlzIGNvZGUgaXMgdmVyeSBvZGQgKi8KKyAgICBOU01lbnUgKmFwcGxlTWVudTsKKyAgICBOU01lbnVJdGVtICptZW51SXRlbTsKKyAgICBOU1N0cmluZyAqdGl0bGU7CisgICAgTlNTdHJpbmcgKmFwcE5hbWU7CisgICAgCisgICAgYXBwTmFtZSA9IGdldEFwcGxpY2F0aW9uTmFtZSgpOworICAgIGFwcGxlTWVudSA9IFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiIl07CisgICAgCisgICAgLyogQWRkIG1lbnUgaXRlbXMgKi8KKyAgICB0aXRsZSA9IFtAIkFib3V0ICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3Iob3JkZXJGcm9udFN0YW5kYXJkQWJvdXRQYW5lbDopIGtleUVxdWl2YWxlbnQ6QCIiXTsKKworICAgIFthcHBsZU1lbnUgYWRkSXRlbTpbTlNNZW51SXRlbSBzZXBhcmF0b3JJdGVtXV07CisKKyAgICB0aXRsZSA9IFtAIkhpZGUgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3RvcihoaWRlOikga2V5RXF1aXZhbGVudDpAImgiXTsKKworICAgIG1lbnVJdGVtID0gKE5TTWVudUl0ZW0gKilbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6QCJIaWRlIE90aGVycyIgYWN0aW9uOkBzZWxlY3RvcihoaWRlT3RoZXJBcHBsaWNhdGlvbnM6KSBrZXlFcXVpdmFsZW50OkAiaCJdOworICAgIFttZW51SXRlbSBzZXRLZXlFcXVpdmFsZW50TW9kaWZpZXJNYXNrOihOU0FsdGVybmF0ZUtleU1hc2t8TlNDb21tYW5kS2V5TWFzayldOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOkAiU2hvdyBBbGwiIGFjdGlvbjpAc2VsZWN0b3IodW5oaWRlQWxsQXBwbGljYXRpb25zOikga2V5RXF1aXZhbGVudDpAIiJdOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtOltOU01lbnVJdGVtIHNlcGFyYXRvckl0ZW1dXTsKKworICAgIHRpdGxlID0gW0AiUXVpdCAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKHRlcm1pbmF0ZTopIGtleUVxdWl2YWxlbnQ6QCJxIl07CisKKyAgICAKKyAgICAvKiBQdXQgbWVudSBpbnRvIHRoZSBtZW51YmFyICovCisgICAgbWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCIiIGFjdGlvbjpuaWwga2V5RXF1aXZhbGVudDpAIiJdOworICAgIFttZW51SXRlbSBzZXRTdWJtZW51OmFwcGxlTWVudV07CisgICAgW1tOU0FwcCBtYWluTWVudV0gYWRkSXRlbTptZW51SXRlbV07CisKKyAgICAvKiBUZWxsIHRoZSBhcHBsaWNhdGlvbiBvYmplY3QgdGhhdCB0aGlzIGlzIG5vdyB0aGUgYXBwbGljYXRpb24gbWVudSAqLworICAgIFtOU0FwcCBzZXRBcHBsZU1lbnU6YXBwbGVNZW51XTsKKworICAgIC8qIEZpbmFsbHkgZ2l2ZSB1cCBvdXIgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyAqLworICAgIFthcHBsZU1lbnUgcmVsZWFzZV07CisgICAgW21lbnVJdGVtIHJlbGVhc2VdOworfQorCisvKiBDcmVhdGUgYSB3aW5kb3cgbWVudSAqLworc3RhdGljIHZvaWQgc2V0dXBXaW5kb3dNZW51KHZvaWQpCit7CisgICAgTlNNZW51ICAgICAgKndpbmRvd01lbnU7CisgICAgTlNNZW51SXRlbSAgKndpbmRvd01lbnVJdGVtOworICAgIE5TTWVudUl0ZW0gICptZW51SXRlbTsKKworICAgIHdpbmRvd01lbnUgPSBbW05TTWVudSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIldpbmRvdyJdOworICAgIAorICAgIC8qICJNaW5pbWl6ZSIgaXRlbSAqLworICAgIG1lbnVJdGVtID0gW1tOU01lbnVJdGVtIGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiTWluaW1pemUiIGFjdGlvbjpAc2VsZWN0b3IocGVyZm9ybU1pbmlhdHVyaXplOikga2V5RXF1aXZhbGVudDpAIm0iXTsKKyAgICBbd2luZG93TWVudSBhZGRJdGVtOm1lbnVJdGVtXTsKKyAgICBbbWVudUl0ZW0gcmVsZWFzZV07CisgICAgCisgICAgLyogUHV0IG1lbnUgaW50byB0aGUgbWVudWJhciAqLworICAgIHdpbmRvd01lbnVJdGVtID0gW1tOU01lbnVJdGVtIGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiV2luZG93IiBhY3Rpb246bmlsIGtleUVxdWl2YWxlbnQ6QCIiXTsKKyAgICBbd2luZG93TWVudUl0ZW0gc2V0U3VibWVudTp3aW5kb3dNZW51XTsKKyAgICBbW05TQXBwIG1haW5NZW51XSBhZGRJdGVtOndpbmRvd01lbnVJdGVtXTsKKyAgICAKKyAgICAvKiBUZWxsIHRoZSBhcHBsaWNhdGlvbiBvYmplY3QgdGhhdCB0aGlzIGlzIG5vdyB0aGUgd2luZG93IG1lbnUgKi8KKyAgICBbTlNBcHAgc2V0V2luZG93c01lbnU6d2luZG93TWVudV07CisKKyAgICAvKiBGaW5hbGx5IGdpdmUgdXAgb3VyIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdHMgKi8KKyAgICBbd2luZG93TWVudSByZWxlYXNlXTsKKyAgICBbd2luZG93TWVudUl0ZW0gcmVsZWFzZV07Cit9CisKKy8qIFJlcGxhY2VtZW50IGZvciBOU0FwcGxpY2F0aW9uTWFpbiAqLworc3RhdGljIHZvaWQgQ3VzdG9tQXBwbGljYXRpb25NYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgTlNBdXRvcmVsZWFzZVBvb2wJKnBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyAgICBTRExNYWluCQkJCSpzZGxNYWluOworCisgICAgLyogRW5zdXJlIHRoZSBhcHBsaWNhdGlvbiBvYmplY3QgaXMgaW5pdGlhbGlzZWQgKi8KKyAgICBbU0RMQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIAorI2lmZGVmIFNETF9VU0VfQ1BTCisgICAgeworICAgICAgICBDUFNQcm9jZXNzU2VyTnVtIFBTTjsKKyAgICAgICAgLyogVGVsbCB0aGUgZG9jayBhYm91dCB1cyAqLworICAgICAgICBpZiAoIUNQU0dldEN1cnJlbnRQcm9jZXNzKCZQU04pKQorICAgICAgICAgICAgaWYgKCFDUFNFbmFibGVGb3JlZ3JvdW5kT3BlcmF0aW9uKCZQU04sMHgwMywweDNDLDB4MkMsMHgxMTAzKSkKKyAgICAgICAgICAgICAgICBpZiAoIUNQU1NldEZyb250UHJvY2VzcygmUFNOKSkKKyAgICAgICAgICAgICAgICAgICAgW1NETEFwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKKyAgICB9CisjZW5kaWYgLyogU0RMX1VTRV9DUFMgKi8KKworICAgIC8qIFNldCB1cCB0aGUgbWVudWJhciAqLworICAgIFtOU0FwcCBzZXRNYWluTWVudTpbW05TTWVudSBhbGxvY10gaW5pdF1dOworICAgIHNldEFwcGxpY2F0aW9uTWVudSgpOworICAgIHNldHVwV2luZG93TWVudSgpOworCisgICAgLyogQ3JlYXRlIFNETE1haW4gYW5kIG1ha2UgaXQgdGhlIGFwcCBkZWxlZ2F0ZSAqLworICAgIHNkbE1haW4gPSBbW1NETE1haW4gYWxsb2NdIGluaXRdOworICAgIFtOU0FwcCBzZXREZWxlZ2F0ZTpzZGxNYWluXTsKKyAgICAKKyAgICAvKiBTdGFydCB0aGUgbWFpbiBldmVudCBsb29wICovCisgICAgW05TQXBwIHJ1bl07CisgICAgCisgICAgW3NkbE1haW4gcmVsZWFzZV07CisgICAgW3Bvb2wgcmVsZWFzZV07Cit9CisKKyNlbmRpZgorCisKKy8qCisgKiBDYXRjaCBkb2N1bWVudCBvcGVuIHJlcXVlc3RzLi4udGhpcyBsZXRzIHVzIG5vdGljZSBmaWxlcyB3aGVuIHRoZSBhcHAKKyAqICB3YXMgbGF1bmNoZWQgYnkgZG91YmxlLWNsaWNraW5nIGEgZG9jdW1lbnQsIG9yIHdoZW4gYSBkb2N1bWVudCB3YXMKKyAqICBkcmFnZ2VkL2Ryb3BwZWQgb24gdGhlIGFwcCdzIGljb24uIFlvdSBuZWVkIHRvIGhhdmUgYQorICogIENGQnVuZGxlRG9jdW1lbnRzVHlwZSBzZWN0aW9uIGluIHlvdXIgSW5mby5wbGlzdCB0byBnZXQgdGhpcyBtZXNzYWdlLAorICogIGFwcGFyZW50bHkuCisgKgorICogRmlsZXMgYXJlIGFkZGVkIHRvIGdBcmd2LCBzbyB0byB0aGUgYXBwLCB0aGV5J2xsIGxvb2sgbGlrZSBjb21tYW5kIGxpbmUKKyAqICBhcmd1bWVudHMuIFByZXZpb3VzbHksIGFwcHMgbGF1bmNoZWQgZnJvbSB0aGUgZmluZGVyIGhhZCBub3RoaW5nIGJ1dAorICogIGFuIGFyZ3ZbMF0uCisgKgorICogVGhpcyBtZXNzYWdlIG1heSBiZSByZWNlaXZlZCBtdWx0aXBsZSB0aW1lcyB0byBvcGVuIHNldmVyYWwgZG9jcyBvbiBsYXVuY2guCisgKgorICogVGhpcyBtZXNzYWdlIGlzIGlnbm9yZWQgb25jZSB0aGUgYXBwJ3MgbWFpbmxpbmUgaGFzIGJlZW4gY2FsbGVkLgorICovCistIChCT09MKWFwcGxpY2F0aW9uOihOU0FwcGxpY2F0aW9uICopdGhlQXBwbGljYXRpb24gb3BlbkZpbGU6KE5TU3RyaW5nICopZmlsZW5hbWUKK3sKKyAgICBjb25zdCBjaGFyICp0ZW1wYXJnOworICAgIHNpemVfdCBhcmdsZW47CisgICAgY2hhciAqYXJnOworICAgIGNoYXIgKipuZXdhcmd2OworCisgICAgaWYgKCFnRmluZGVyTGF1bmNoKSAgLyogTWFjT1MgaXMgcGFzc2luZyBjb21tYW5kIGxpbmUgYXJncy4gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGdDYWxsZWRBcHBNYWlubGluZSkgIC8qIGFwcCBoYXMgc3RhcnRlZCwgaWdub3JlIHRoaXMgZG9jdW1lbnQuICovCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHRlbXBhcmcgPSBbZmlsZW5hbWUgVVRGOFN0cmluZ107CisgICAgYXJnbGVuID0gU0RMX3N0cmxlbih0ZW1wYXJnKSArIDE7CisgICAgYXJnID0gKGNoYXIgKikgU0RMX21hbGxvYyhhcmdsZW4pOworICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgbmV3YXJndiA9IChjaGFyICoqKSByZWFsbG9jKGdBcmd2LCBzaXplb2YgKGNoYXIgKikgKiAoZ0FyZ2MgKyAyKSk7CisgICAgaWYgKG5ld2FyZ3YgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNETF9mcmVlKGFyZyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZ0FyZ3YgPSBuZXdhcmd2OworCisgICAgU0RMX3N0cmxjcHkoYXJnLCB0ZW1wYXJnLCBhcmdsZW4pOworICAgIGdBcmd2W2dBcmdjKytdID0gYXJnOworICAgIGdBcmd2W2dBcmdjXSA9IE5VTEw7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyogQ2FsbGVkIHdoZW4gdGhlIGludGVybmFsIGV2ZW50IGxvb3AgaGFzIGp1c3Qgc3RhcnRlZCBydW5uaW5nICovCistICh2b2lkKSBhcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzogKE5TTm90aWZpY2F0aW9uICopIG5vdGUKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgLyogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgLmFwcCdzIHBhcmVudCBkaXJlY3RvcnkgKi8KKyAgICBbc2VsZiBzZXR1cFdvcmtpbmdEaXJlY3Rvcnk6Z0ZpbmRlckxhdW5jaF07CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisgICAgLyogU2V0IHRoZSBtYWluIG1lbnUgdG8gY29udGFpbiB0aGUgcmVhbCBhcHAgbmFtZSBpbnN0ZWFkIG9mICJTREwgQXBwIiAqLworICAgIFtzZWxmIGZpeE1lbnU6W05TQXBwIG1haW5NZW51XSB3aXRoQXBwTmFtZTpnZXRBcHBsaWNhdGlvbk5hbWUoKV07CisjZW5kaWYKKworICAgIC8qIEhhbmQgb2ZmIHRvIG1haW4gYXBwbGljYXRpb24gY29kZSAqLworICAgIGdDYWxsZWRBcHBNYWlubGluZSA9IFRSVUU7CisgICAgc3RhdHVzID0gU0RMX21haW4gKGdBcmdjLCBnQXJndik7CisKKyAgICAvKiBXZSdyZSBkb25lLCB0aGFuayB5b3UgZm9yIHBsYXlpbmcgKi8KKyAgICBleGl0KHN0YXR1cyk7Cit9CitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIE5TU3RyaW5nIChSZXBsYWNlU3ViU3RyaW5nKQorCistIChOU1N0cmluZyAqKXN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGg6KE5TU3RyaW5nICopYVN0cmluZworeworICAgIHVuc2lnbmVkIGludCBidWZmZXJTaXplOworICAgIHVuc2lnbmVkIGludCBzZWxmTGVuID0gW3NlbGYgbGVuZ3RoXTsKKyAgICB1bnNpZ25lZCBpbnQgYVN0cmluZ0xlbiA9IFthU3RyaW5nIGxlbmd0aF07CisgICAgdW5pY2hhciAqYnVmZmVyOworICAgIE5TUmFuZ2UgbG9jYWxSYW5nZTsKKyAgICBOU1N0cmluZyAqcmVzdWx0OworCisgICAgYnVmZmVyU2l6ZSA9IHNlbGZMZW4gKyBhU3RyaW5nTGVuIC0gYVJhbmdlLmxlbmd0aDsKKyAgICBidWZmZXIgPSAodW5pY2hhciAqKU5TQWxsb2NhdGVNZW1vcnlQYWdlcyhidWZmZXJTaXplKnNpemVvZih1bmljaGFyKSk7CisgICAgCisgICAgLyogR2V0IGZpcnN0IHBhcnQgaW50byBidWZmZXIgKi8KKyAgICBsb2NhbFJhbmdlLmxvY2F0aW9uID0gMDsKKyAgICBsb2NhbFJhbmdlLmxlbmd0aCA9IGFSYW5nZS5sb2NhdGlvbjsKKyAgICBbc2VsZiBnZXRDaGFyYWN0ZXJzOmJ1ZmZlciByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAKKyAgICAvKiBHZXQgbWlkZGxlIHBhcnQgaW50byBidWZmZXIgKi8KKyAgICBsb2NhbFJhbmdlLmxvY2F0aW9uID0gMDsKKyAgICBsb2NhbFJhbmdlLmxlbmd0aCA9IGFTdHJpbmdMZW47CisgICAgW2FTdHJpbmcgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbikgcmFuZ2U6bG9jYWxSYW5nZV07CisgICAgIAorICAgIC8qIEdldCBsYXN0IHBhcnQgaW50byBidWZmZXIgKi8KKyAgICBsb2NhbFJhbmdlLmxvY2F0aW9uID0gYVJhbmdlLmxvY2F0aW9uICsgYVJhbmdlLmxlbmd0aDsKKyAgICBsb2NhbFJhbmdlLmxlbmd0aCA9IHNlbGZMZW4gLSBsb2NhbFJhbmdlLmxvY2F0aW9uOworICAgIFtzZWxmIGdldENoYXJhY3RlcnM6KGJ1ZmZlcithUmFuZ2UubG9jYXRpb24rYVN0cmluZ0xlbikgcmFuZ2U6bG9jYWxSYW5nZV07CisgICAgCisgICAgLyogQnVpbGQgb3V0cHV0IHN0cmluZyAqLworICAgIHJlc3VsdCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoQ2hhcmFjdGVyczpidWZmZXIgbGVuZ3RoOmJ1ZmZlclNpemVdOworICAgIAorICAgIE5TRGVhbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlciwgYnVmZmVyU2l6ZSk7CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQGVuZAorCisKKworI2lmZGVmIG1haW4KKyMgIHVuZGVmIG1haW4KKyNlbmRpZgorCisKKy8qIE1haW4gZW50cnkgcG9pbnQgdG8gZXhlY3V0YWJsZSAtIHNob3VsZCAqbm90KiBiZSBTRExfbWFpbiEgKi8KK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgLyogQ29weSB0aGUgYXJndW1lbnRzIGludG8gYSBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICAvKiBUaGlzIGlzIHBhc3NlZCBpZiB3ZSBhcmUgbGF1bmNoZWQgYnkgZG91YmxlLWNsaWNraW5nICovCisgICAgaWYgKCBhcmdjID49IDIgJiYgc3RybmNtcCAoYXJndlsxXSwgIi1wc24iLCA0KSA9PSAwICkgeworICAgICAgICBnQXJndiA9IChjaGFyICoqKSBTRExfbWFsbG9jKHNpemVvZiAoY2hhciAqKSAqIDIpOworICAgICAgICBnQXJndlswXSA9IGFyZ3ZbMF07CisgICAgICAgIGdBcmd2WzFdID0gTlVMTDsKKyAgICAgICAgZ0FyZ2MgPSAxOworICAgICAgICBnRmluZGVyTGF1bmNoID0gWUVTOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBnQXJnYyA9IGFyZ2M7CisgICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogKGFyZ2MrMSkpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGFyZ2M7IGkrKykKKyAgICAgICAgICAgIGdBcmd2W2ldID0gYXJndltpXTsKKyAgICAgICAgZ0ZpbmRlckxhdW5jaCA9IE5POworICAgIH0KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICBbU0RMQXBwbGljYXRpb24gcG9zZUFzQ2xhc3M6W05TQXBwbGljYXRpb24gY2xhc3NdXTsKKyAgICBOU0FwcGxpY2F0aW9uTWFpbiAoYXJnYywgYXJndik7CisjZWxzZQorICAgIEN1c3RvbUFwcGxpY2F0aW9uTWFpbiAoYXJnYywgYXJndik7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2ggYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDA5NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2gKQEAgLTAsMCArMSw5IEBACisvLworLy8gUHJlZml4IGhlYWRlciBmb3IgYWxsIHNvdXJjZSBmaWxlcyBvZiB0aGUgJ8dQUk9KRUNUTkFNRcgnIHRhcmdldCBpbiB0aGUgJ8dQUk9KRUNUTkFNRcgnIHByb2plY3QKKy8vCisKKyNpbmNsdWRlICJTREwuaCIKKworI2lmZGVmIF9fT0JKQ19fCisgICAgI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUljb24uaWNucyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJY29uLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwYjAyYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovVGVtcGxhdGVJY29uLmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUluZm8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGNiZWEyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUluZm8ucGxpc3QKQEAgLTAsMCArMSwxMiBAQAoreworCUZpbGVzVG9SZW5hbWUgPSB7CisJCSJTRExBcHBfUHJlZml4LnBjaCIgPSAix1BST0pFQ1ROQU1FyF9QcmVmaXgucGNoIjsKKwl9OworCUZpbGVzVG9NYWNyb0V4cGFuZCA9ICgKKwkJIsdQUk9KRUNUTkFNRchfUHJlZml4LnBjaCIsCisJCSJJbmZvLnBsaXN0IiwKKwkJIkVuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MiLAorCQkibWFpbi5jIiwKKwkpOworCURlc2NyaXB0aW9uID0gIlRoaXMgcHJvamVjdCBidWlsZHMgYW4gU0RMLWJhc2VkIGFwcGxpY2F0aW9uIHdpdGggQ29jb2EgbWVudXMuIjsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5YTkyNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsMzIyIEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDY7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJMDAyRjM5RkEwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjNBMDAwOUQwODg0NjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjM5RjkwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzQTJFMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovOyB9OworCQkwMDJGM0EzRjA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNBM0UwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyAqLzsgfTsKKwkJMDAyRjNBRjEwOUQwOEYxMDAwRUJFQjg4IC8qIFNETE1haW4ubmliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0FFRjA5RDA4RjEwMDBFQkVCODggLyogU0RMTWFpbi5uaWIgKi87IH07CisJCThEMTEwNzJCMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg5QzE2NUNGRTg0MEUwQ0MwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovOyB9OworCQk4RDExMDcyRjA0ODZDRUI4MDBFNDcwOTAgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKy8qIEVuZCBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMDAyRjM5RkQwOUQwODgzNDAwRUJFQjg4IC8qIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovID0geworCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlkc3RQYXRoID0gIiI7CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gMTA7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGM0EwMDA5RDA4ODQ2MDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSAqLywKKwkJCSk7CisJCQluYW1lID0gIkNvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlIjsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KKwkJMDAyRjM5RjkwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IFNETC5mcmFtZXdvcms7IHBhdGggPSAvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTAwMkYzQTJCMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTRExNYWluLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNBMkMwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNETE1haW4ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0EzRTA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gbWFpbi5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQUYwMDlEMDhGMTAwMEVCRUI4OCAvKiBFbmdsaXNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5uaWI7IG5hbWUgPSBFbmdsaXNoOyBwYXRoID0gRW5nbGlzaC5scHJvai9TRExNYWluLm5pYjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDg5QzE2NURGRTg0MEUwQ0MwMkFBQzA3IC8qIEVuZ2xpc2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMTA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC5zdHJpbmdzOyBuYW1lID0gRW5nbGlzaDsgcGF0aCA9IEVuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTEwNThDN0ExRkVBNTRGMDExMUNBMkNCQiAvKiBDb2NvYS5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENvY29hLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMjlCOTczMjRGRENGQTM5NDExQ0EyQ0VBIC8qIEFwcEtpdC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEFwcEtpdC5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkyOUI5NzMyNUZEQ0ZBMzk0MTFDQTJDRUEgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEZvdW5kYXRpb24uZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvRm91bmRhdGlvbi5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTMyQ0E0RjYzMDM2OEQxRUUwMEM5MTc4MyAvKiBfX19QUk9KRUNUTkFNRV9fX19QcmVmaXgucGNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiX19fUFJPSkVDVE5BTUVfX19fUHJlZml4LnBjaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMTEwNzMxMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMTEwNzMyMDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXy5hcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuYXBwbGljYXRpb247IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9ICJfX19QUk9KRUNUTkFNRV9fXy5hcHAiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzJFMDQ4NkNFQjgwMEU0NzA5MCAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjM5RkEwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQk4RDExMDcyRjA0ODZDRUI4MDBFNDcwOTAgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhHcm91cCBzZWN0aW9uICovCisJCTA4MEU5NkRERkUyMDFENkQ3RjAwMDAwMSAvKiBDbGFzc2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGM0EyQjA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5oICovLAorCQkJCTAwMkYzQTJDMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gKi8sCisJCQkpOworCQkJbmFtZSA9IENsYXNzZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxMDU4QzdBMEZFQTU0RjAxMTFDQTJDQkIgLyogTGlua2VkIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovLAorCQkJCTEwNThDN0ExRkVBNTRGMDExMUNBMkNCQiAvKiBDb2NvYS5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJMaW5rZWQgRnJhbWV3b3JrcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxMDU4QzdBMkZFQTU0RjAxMTFDQTJDQkIgLyogT3RoZXIgRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMjlCOTczMjRGRENGQTM5NDExQ0EyQ0VBIC8qIEFwcEtpdC5mcmFtZXdvcmsgKi8sCisJCQkJMjlCOTczMjVGRENGQTM5NDExQ0EyQ0VBIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovLAorCQkJKTsKKwkJCW5hbWUgPSAiT3RoZXIgRnJhbWV3b3JrcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxOUMyOEZBQ0ZFOUQ1MjBEMTFDQTJDQkIgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCThEMTEwNzMyMDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXy5hcHAgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTRGRENGQTM5NDExQ0EyQ0VBIC8qIF9fX1BST0pFQ1ROQU1FQVNYTUxfX18gKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA4MEU5NkRERkUyMDFENkQ3RjAwMDAwMSAvKiBDbGFzc2VzICovLAorCQkJCTI5Qjk3MzE1RkRDRkEzOTQxMUNBMkNFQSAvKiBPdGhlciBTb3VyY2VzICovLAorCQkJCTI5Qjk3MzE3RkRDRkEzOTQxMUNBMkNFQSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJMjlCOTczMjNGRENGQTM5NDExQ0EyQ0VBIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMTlDMjhGQUNGRTlENTIwRDExQ0EyQ0JCIC8qIFByb2R1Y3RzICovLAorCQkJKTsKKwkJCW5hbWUgPSAiX19fUFJPSkVDVE5BTUVBU1hNTF9fXyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMxNUZEQ0ZBMzk0MTFDQTJDRUEgLyogT3RoZXIgU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMzJDQTRGNjMwMzY4RDFFRTAwQzkxNzgzIC8qIF9fX1BST0pFQ1ROQU1FX19fX1ByZWZpeC5wY2ggKi8sCisJCQkJMDAyRjNBM0UwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyAqLywKKwkJCSk7CisJCQluYW1lID0gIk90aGVyIFNvdXJjZXMiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTdGRENGQTM5NDExQ0EyQ0VBIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQxMTA3MzEwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm8ucGxpc3QgKi8sCisJCQkJMDg5QzE2NUNGRTg0MEUwQ0MwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovLAorCQkJCTAwMkYzQUVGMDlEMDhGMTAwMEVCRUI4OCAvKiBTRExNYWluLm5pYiAqLywKKwkJCSk7CisJCQluYW1lID0gUmVzb3VyY2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMjNGRENGQTM5NDExQ0EyQ0VBIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTEwNThDN0EwRkVBNTRGMDExMUNBMkNCQiAvKiBMaW5rZWQgRnJhbWV3b3JrcyAqLywKKwkJCQkxMDU4QzdBMkZFQTU0RjAxMTFDQTJDQkIgLyogT3RoZXIgRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQluYW1lID0gRnJhbWV3b3JrczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCQk4RDExMDcyNjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18gKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gQzAxRkNGNEEwOEE5NTQ1NDAwNTQyNDdCIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJfX19QUk9KRUNUTkFNRV9fXyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk4RDExMDcyOTA0ODZDRUI4MDBFNDcwOTAgLyogUmVzb3VyY2VzICovLAorCQkJCThEMTEwNzJDMDQ4NkNFQjgwMEU0NzA5MCAvKiBTb3VyY2VzICovLAorCQkJCThEMTEwNzJFMDQ4NkNFQjgwMEU0NzA5MCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzOUZEMDlEMDg4MzQwMEVCRUI4OCAvKiBDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gIl9fX1BST0pFQ1ROQU1FX19fIjsKKwkJCXByb2R1Y3RJbnN0YWxsUGF0aCA9ICIkKEhPTUUpL0FwcGxpY2F0aW9ucyI7CisJCQlwcm9kdWN0TmFtZSA9ICJfX19QUk9KRUNUTkFNRV9fXyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkyOUI5NzMxM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEMwMUZDRjRFMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIl9fX1BST0pFQ1ROQU1FX19fIiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDMuMiI7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCW1haW5Hcm91cCA9IDI5Qjk3MzE0RkRDRkEzOTQxMUNBMkNFQSAvKiBfX19QUk9KRUNUTkFNRUFTWE1MX19fICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMTEwNzI2MDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXyAqLywKKwkJCSk7CisJCX07CisvKiBFbmQgUEJYUHJvamVjdCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDExMDcyOTA0ODZDRUI4MDBFNDcwOTAgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk4RDExMDcyQjA0ODZDRUI4MDBFNDcwOTAgLyogSW5mb1BsaXN0LnN0cmluZ3MgaW4gUmVzb3VyY2VzICovLAorCQkJCTAwMkYzQUYxMDlEMDhGMTAwMEVCRUI4OCAvKiBTRExNYWluLm5pYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGM0EyRTA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNBM0YwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYVmFyaWFudEdyb3VwIHNlY3Rpb24gKi8KKwkJMDAyRjNBRUYwOUQwOEYxMDAwRUJFQjg4IC8qIFNETE1haW4ubmliICovID0geworCQkJaXNhID0gUEJYVmFyaWFudEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDAyRjNBRjAwOUQwOEYxMDAwRUJFQjg4IC8qIEVuZ2xpc2ggKi8sCisJCQkpOworCQkJbmFtZSA9IFNETE1haW4ubmliOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDg5QzE2NUNGRTg0MEUwQ0MwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovID0geworCQkJaXNhID0gUEJYVmFyaWFudEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDg5QzE2NURGRTg0MEUwQ0MwMkFBQzA3IC8qIEVuZ2xpc2ggKi8sCisJCQkpOworCQkJbmFtZSA9IEluZm9QbGlzdC5zdHJpbmdzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisJCUMwMUZDRjRCMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIl9fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2giOworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9BcHBsaWNhdGlvbnMiOworCQkJCVBST0RVQ1RfTkFNRSA9ICJfX19QUk9KRUNUTkFNRV9fXyI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlDMDFGQ0Y0QzA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICJfX19QUk9KRUNUTkFNRUFTSURFTlRJRklFUl9fX19QcmVmaXgucGNoIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCQlQUk9EVUNUX05BTUUgPSAiX19fUFJPSkVDVE5BTUVfX18iOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlDMDFGQ0Y0RjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl82NF9CSVQpIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzLAorCQkJCQkiJChGUkFNRVdPUktfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlHQ0NfVkVSU0lPTiA9IDQuMDsKKwkJCQkiR0NDX1ZFUlNJT05bYXJjaD14ODZfNjRdIiA9IDQuMjsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzLAorCQkJCQkiJChIRUFERVJfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJU0RLUk9PVCA9IG1hY29zeDEwLjQ7CisJCQkJIlNES1JPT1RbYXJjaD14ODZfNjRdIiA9IG1hY29zeDEwLjY7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlDMDFGQ0Y1MDA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyXzY0X0JJVCkiOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MsCisJCQkJCSIkKEZSQU1FV09SS19TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCUdDQ19WRVJTSU9OID0gNC4wOworCQkJCSJHQ0NfVkVSU0lPTlthcmNoPXg4Nl82NF0iID0gNC4yOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMsCisJCQkJCSIkKEhFQURFUl9TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gbWFjb3N4MTAuNDsKKwkJCQkiU0RLUk9PVFthcmNoPXg4Nl82NF0iID0gbWFjb3N4MTAuNjsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCQlDMDFGQ0Y0QTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIl9fX1BST0pFQ1ROQU1FX19fIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUMwMUZDRjRCMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLywKKwkJCQlDMDFGQ0Y0QzA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQlDMDFGQ0Y0RTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJfX19QUk9KRUNUTkFNRV9fXyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlDMDFGQ0Y0RjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8sCisJCQkJQzAxRkNGNTAwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAyOUI5NzMxM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgQ29jb2EgQXBwbGljYXRpb24vbWFpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE1ZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIENvY29hIEFwcGxpY2F0aW9uL21haW4uYwpAQCAtMCwwICsxLDY1IEBACisKKy8qIFNpbXBsZSBwcm9ncmFtOiAgQ3JlYXRlIGEgYmxhbmsgd2luZG93LCB3YWl0IGZvciBrZXlwcmVzcywgcXVpdC4KKworICAgUGxlYXNlIHNlZSB0aGUgU0RMIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gdXNpbmcgdGhlIFNETCBBUEk6CisgICAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vU0RML2RvY3MuaHRtbAorKi8KKyAgIAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJVWludDMyIGluaXRmbGFncyA9IFNETF9JTklUX1ZJREVPOyAgLyogU2VlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgKi8KKwlTRExfU3VyZmFjZSAqc2NyZWVuOworCVVpbnQ4ICB2aWRlb19icHAgPSAwOworCVVpbnQzMiB2aWRlb2ZsYWdzID0gU0RMX1NXU1VSRkFDRTsKKwlpbnQgICAgZG9uZTsKKyAgICAgICAgU0RMX0V2ZW50IGV2ZW50OworCisJLyogSW5pdGlhbGl6ZSB0aGUgU0RMIGxpYnJhcnkgKi8KKwlpZiAoIFNETF9Jbml0KGluaXRmbGFncykgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwKKwkJCVNETF9HZXRFcnJvcigpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBTZXQgNjQweDQ4MCB2aWRlbyBtb2RlICovCisJc2NyZWVuPVNETF9TZXRWaWRlb01vZGUoNjQwLDQ4MCwgdmlkZW9fYnBwLCB2aWRlb2ZsYWdzKTsKKyAgICAgICAgaWYgKHNjcmVlbiA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0IDY0MHg0ODB4JWQgdmlkZW8gbW9kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19icHAsIFNETF9HZXRFcnJvcigpKTsKKwkJU0RMX1F1aXQoKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlkb25lID0gMDsKKwl3aGlsZSAoICFkb25lICkgeworCisJCS8qIENoZWNrIGZvciBldmVudHMgKi8KKwkJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZldmVudCkgKSB7CisJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKworCQkJCWNhc2UgU0RMX01PVVNFTU9USU9OOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX0tFWURPV046CisJCQkJCS8qIEFueSBrZXlwcmVzcyBxdWl0cyB0aGUgYXBwLi4uICovCisJCQkJY2FzZSBTRExfUVVJVDoKKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCQorCS8qIENsZWFuIHVwIHRoZSBTREwgbGlicmFyeSAqLworCVNETF9RdWl0KCk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzIxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTk0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL0luZm8ucGxpc3QKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+JHtFWEVDVVRBQkxFX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLnlvdXJjb21wYW55Ll9fX1BST0pFQ1ROQU1FQVNYTUxfX188L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW48L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKwk8a2V5PkxTTWluaW11bVN5c3RlbVZlcnNpb25CeUFyY2hpdGVjdHVyZTwva2V5PgorCTxkaWN0PgorCQk8a2V5Png4Nl82NDwva2V5PgorCQk8c3RyaW5nPjEwLjYuMDwvc3RyaW5nPgorCQk8a2V5PmkzODY8L2tleT4KKwkJPHN0cmluZz4xMC40LjA8L3N0cmluZz4KKwkJPGtleT5wcGM8L2tleT4KKwkJPHN0cmluZz4xMC40LjA8L3N0cmluZz4KKwk8L2RpY3Q+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExNYWluLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL1NETE1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZkOTBjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExNYWluLmgKQEAgLTAsMCArMSwxNiBAQAorLyogICBTRExNYWluLm0gLSBtYWluIGVudHJ5IHBvaW50IGZvciBvdXIgQ29jb2EtaXplZCBTREwgYXBwCisgICAgICAgSW5pdGlhbCBWZXJzaW9uOiBEYXJyZWxsIFdhbGlzc2VyIDxkd2FsaXNzMUBwdXJkdWUuZWR1PgorICAgICAgIE5vbi1OSUItQ29kZSAmIG90aGVyIGNoYW5nZXM6IE1heCBIb3JuIDxtYXhAcXVlbmRpLmRlPgorCisgICAgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzCisqLworCisjaWZuZGVmIF9TRExNYWluX2hfCisjZGVmaW5lIF9TRExNYWluX2hfCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgU0RMTWFpbiA6IE5TT2JqZWN0CitAZW5kCisKKyNlbmRpZiAvKiBfU0RMTWFpbl9oXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExNYWluLm0gYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL1NETE1haW4ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDY1YTIwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExNYWluLm0KQEAgLTAsMCArMSwzODMgQEAKKy8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAorICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKyAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KKworICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcworKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETE1haW4uaCIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gLyogZm9yIE1BWFBBVEhMRU4gKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogRm9yIHNvbWUgcmVhb24sIEFwcGxlIHJlbW92ZWQgc2V0QXBwbGVNZW51IGZyb20gdGhlIGhlYWRlcnMgaW4gMTAuNCwKKyBidXQgdGhlIG1ldGhvZCBzdGlsbCBpcyB0aGVyZSBhbmQgd29ya3MuIFRvIGF2b2lkIHdhcm5pbmdzLCB3ZSBkZWNsYXJlCisgaXQgb3Vyc2VsdmVzIGhlcmUuICovCitAaW50ZXJmYWNlIE5TQXBwbGljYXRpb24oU0RMX01pc3NpbmdfTWV0aG9kcykKKy0gKHZvaWQpc2V0QXBwbGVNZW51OihOU01lbnUgKiltZW51OworQGVuZAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBTRExNYWluLm5pYiBvciBub3QgKi8KKyNkZWZpbmUJCVNETF9VU0VfTklCX0ZJTEUJMAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBDUFMgKGRvY2tpbmcpIG9yIG5vdCAqLworI2RlZmluZQkJU0RMX1VTRV9DUFMJCTEKKyNpZmRlZiBTRExfVVNFX0NQUworLyogUG9ydGlvbnMgb2YgQ1BTLmggKi8KK3R5cGVkZWYgc3RydWN0IENQU1Byb2Nlc3NTZXJOdW0KK3sKKwlVSW50MzIJCWxvOworCVVJbnQzMgkJaGk7Cit9IENQU1Byb2Nlc3NTZXJOdW07CisKK2V4dGVybiBPU0VycglDUFNHZXRDdXJyZW50UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKK2V4dGVybiBPU0VyciAJQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbiggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuLCBVSW50MzIgX2FyZzIsIFVJbnQzMiBfYXJnMywgVUludDMyIF9hcmc0LCBVSW50MzIgX2FyZzUpOworZXh0ZXJuIE9TRXJyCUNQU1NldEZyb250UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKKworI2VuZGlmIC8qIFNETF9VU0VfQ1BTICovCisKK3N0YXRpYyBpbnQgICAgZ0FyZ2M7CitzdGF0aWMgY2hhciAgKipnQXJndjsKK3N0YXRpYyBCT09MICAgZ0ZpbmRlckxhdW5jaDsKK3N0YXRpYyBCT09MICAgZ0NhbGxlZEFwcE1haW5saW5lID0gRkFMU0U7CisKK3N0YXRpYyBOU1N0cmluZyAqZ2V0QXBwbGljYXRpb25OYW1lKHZvaWQpCit7CisgICAgY29uc3QgTlNEaWN0aW9uYXJ5ICpkaWN0OworICAgIE5TU3RyaW5nICphcHBOYW1lID0gMDsKKworICAgIC8qIERldGVybWluZSB0aGUgYXBwbGljYXRpb24gbmFtZSAqLworICAgIGRpY3QgPSAoY29uc3QgTlNEaWN0aW9uYXJ5ICopQ0ZCdW5kbGVHZXRJbmZvRGljdGlvbmFyeShDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgaWYgKGRpY3QpCisgICAgICAgIGFwcE5hbWUgPSBbZGljdCBvYmplY3RGb3JLZXk6IEAiQ0ZCdW5kbGVOYW1lIl07CisgICAgCisgICAgaWYgKCFbYXBwTmFtZSBsZW5ndGhdKQorICAgICAgICBhcHBOYW1lID0gW1tOU1Byb2Nlc3NJbmZvIHByb2Nlc3NJbmZvXSBwcm9jZXNzTmFtZV07CisKKyAgICByZXR1cm4gYXBwTmFtZTsKK30KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKy8qIEEgaGVscGVyIGNhdGVnb3J5IGZvciBOU1N0cmluZyAqLworQGludGVyZmFjZSBOU1N0cmluZyAoUmVwbGFjZVN1YlN0cmluZykKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgU0RMQXBwbGljYXRpb24gOiBOU0FwcGxpY2F0aW9uCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTRExBcHBsaWNhdGlvbgorLyogSW52b2tlZCBmcm9tIHRoZSBRdWl0IG1lbnUgaXRlbSAqLworLSAodm9pZCl0ZXJtaW5hdGU6KGlkKXNlbmRlcgoreworICAgIC8qIFBvc3QgYSBTRExfUVVJVCBldmVudCAqLworICAgIFNETF9FdmVudCBldmVudDsKKyAgICBldmVudC50eXBlID0gU0RMX1FVSVQ7CisgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOworfQorQGVuZAorCisvKiBUaGUgbWFpbiBjbGFzcyBvZiB0aGUgYXBwbGljYXRpb24sIHRoZSBhcHBsaWNhdGlvbidzIGRlbGVnYXRlICovCitAaW1wbGVtZW50YXRpb24gU0RMTWFpbgorCisvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworLSAodm9pZCkgc2V0dXBXb3JraW5nRGlyZWN0b3J5OihCT09MKXNob3VsZENoZGlyCit7CisgICAgaWYgKHNob3VsZENoZGlyKQorICAgIHsKKyAgICAgICAgY2hhciBwYXJlbnRkaXJbTUFYUEFUSExFTl07CisgICAgICAgIENGVVJMUmVmIHVybCA9IENGQnVuZGxlQ29weUJ1bmRsZVVSTChDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgICAgIENGVVJMUmVmIHVybDIgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KDAsIHVybCk7CisgICAgICAgIGlmIChDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbih1cmwyLCAxLCAoVUludDggKilwYXJlbnRkaXIsIE1BWFBBVEhMRU4pKSB7CisgICAgICAgICAgICBjaGRpcihwYXJlbnRkaXIpOyAgIC8qIGNoZGlyIHRvIHRoZSBiaW5hcnkgYXBwJ3MgcGFyZW50ICovCisgICAgICAgIH0KKyAgICAgICAgQ0ZSZWxlYXNlKHVybCk7CisgICAgICAgIENGUmVsZWFzZSh1cmwyKTsKKyAgICB9Cit9CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisKKy8qIEZpeCBtZW51IHRvIGNvbnRhaW4gdGhlIHJlYWwgYXBwIG5hbWUgaW5zdGVhZCBvZiAiU0RMIEFwcCIgKi8KKy0gKHZvaWQpZml4TWVudTooTlNNZW51ICopYU1lbnUgd2l0aEFwcE5hbWU6KE5TU3RyaW5nICopYXBwTmFtZQoreworICAgIE5TUmFuZ2UgYVJhbmdlOworICAgIE5TRW51bWVyYXRvciAqZW51bWVyYXRvcjsKKyAgICBOU01lbnVJdGVtICptZW51SXRlbTsKKworICAgIGFSYW5nZSA9IFtbYU1lbnUgdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgaWYgKGFSYW5nZS5sZW5ndGggIT0gMCkKKyAgICAgICAgW2FNZW51IHNldFRpdGxlOiBbW2FNZW51IHRpdGxlXSBzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOmFSYW5nZSB3aXRoOmFwcE5hbWVdXTsKKworICAgIGVudW1lcmF0b3IgPSBbW2FNZW51IGl0ZW1BcnJheV0gb2JqZWN0RW51bWVyYXRvcl07CisgICAgd2hpbGUgKChtZW51SXRlbSA9IFtlbnVtZXJhdG9yIG5leHRPYmplY3RdKSkKKyAgICB7CisgICAgICAgIGFSYW5nZSA9IFtbbWVudUl0ZW0gdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgICAgIGlmIChhUmFuZ2UubGVuZ3RoICE9IDApCisgICAgICAgICAgICBbbWVudUl0ZW0gc2V0VGl0bGU6IFtbbWVudUl0ZW0gdGl0bGVdIHN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6YVJhbmdlIHdpdGg6YXBwTmFtZV1dOworICAgICAgICBpZiAoW21lbnVJdGVtIGhhc1N1Ym1lbnVdKQorICAgICAgICAgICAgW3NlbGYgZml4TWVudTpbbWVudUl0ZW0gc3VibWVudV0gd2l0aEFwcE5hbWU6YXBwTmFtZV07CisgICAgfQorICAgIFsgYU1lbnUgc2l6ZVRvRml0IF07Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIHNldEFwcGxpY2F0aW9uTWVudSh2b2lkKQoreworICAgIC8qIHdhcm5pbmc6IHRoaXMgY29kZSBpcyB2ZXJ5IG9kZCAqLworICAgIE5TTWVudSAqYXBwbGVNZW51OworICAgIE5TTWVudUl0ZW0gKm1lbnVJdGVtOworICAgIE5TU3RyaW5nICp0aXRsZTsKKyAgICBOU1N0cmluZyAqYXBwTmFtZTsKKyAgICAKKyAgICBhcHBOYW1lID0gZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgICAgYXBwbGVNZW51ID0gW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCIiXTsKKyAgICAKKyAgICAvKiBBZGQgbWVudSBpdGVtcyAqLworICAgIHRpdGxlID0gW0AiQWJvdXQgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3RvcihvcmRlckZyb250U3RhbmRhcmRBYm91dFBhbmVsOikga2V5RXF1aXZhbGVudDpAIiJdOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtOltOU01lbnVJdGVtIHNlcGFyYXRvckl0ZW1dXTsKKworICAgIHRpdGxlID0gW0AiSGlkZSAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKGhpZGU6KSBrZXlFcXVpdmFsZW50OkAiaCJdOworCisgICAgbWVudUl0ZW0gPSAoTlNNZW51SXRlbSAqKVthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTpAIkhpZGUgT3RoZXJzIiBhY3Rpb246QHNlbGVjdG9yKGhpZGVPdGhlckFwcGxpY2F0aW9uczopIGtleUVxdWl2YWxlbnQ6QCJoIl07CisgICAgW21lbnVJdGVtIHNldEtleUVxdWl2YWxlbnRNb2RpZmllck1hc2s6KE5TQWx0ZXJuYXRlS2V5TWFza3xOU0NvbW1hbmRLZXlNYXNrKV07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6QCJTaG93IEFsbCIgYWN0aW9uOkBzZWxlY3Rvcih1bmhpZGVBbGxBcHBsaWNhdGlvbnM6KSBrZXlFcXVpdmFsZW50OkAiIl07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW06W05TTWVudUl0ZW0gc2VwYXJhdG9ySXRlbV1dOworCisgICAgdGl0bGUgPSBbQCJRdWl0ICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3IodGVybWluYXRlOikga2V5RXF1aXZhbGVudDpAInEiXTsKKworICAgIAorICAgIC8qIFB1dCBtZW51IGludG8gdGhlIG1lbnViYXIgKi8KKyAgICBtZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiIgYWN0aW9uOm5pbCBrZXlFcXVpdmFsZW50OkAiIl07CisgICAgW21lbnVJdGVtIHNldFN1Ym1lbnU6YXBwbGVNZW51XTsKKyAgICBbW05TQXBwIG1haW5NZW51XSBhZGRJdGVtOm1lbnVJdGVtXTsKKworICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSBhcHBsaWNhdGlvbiBtZW51ICovCisgICAgW05TQXBwIHNldEFwcGxlTWVudTphcHBsZU1lbnVdOworCisgICAgLyogRmluYWxseSBnaXZlIHVwIG91ciByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RzICovCisgICAgW2FwcGxlTWVudSByZWxlYXNlXTsKKyAgICBbbWVudUl0ZW0gcmVsZWFzZV07Cit9CisKKy8qIENyZWF0ZSBhIHdpbmRvdyBtZW51ICovCitzdGF0aWMgdm9pZCBzZXR1cFdpbmRvd01lbnUodm9pZCkKK3sKKyAgICBOU01lbnUgICAgICAqd2luZG93TWVudTsKKyAgICBOU01lbnVJdGVtICAqd2luZG93TWVudUl0ZW07CisgICAgTlNNZW51SXRlbSAgKm1lbnVJdGVtOworCisgICAgd2luZG93TWVudSA9IFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiV2luZG93Il07CisgICAgCisgICAgLyogIk1pbmltaXplIiBpdGVtICovCisgICAgbWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJNaW5pbWl6ZSIgYWN0aW9uOkBzZWxlY3RvcihwZXJmb3JtTWluaWF0dXJpemU6KSBrZXlFcXVpdmFsZW50OkAibSJdOworICAgIFt3aW5kb3dNZW51IGFkZEl0ZW06bWVudUl0ZW1dOworICAgIFttZW51SXRlbSByZWxlYXNlXTsKKyAgICAKKyAgICAvKiBQdXQgbWVudSBpbnRvIHRoZSBtZW51YmFyICovCisgICAgd2luZG93TWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJXaW5kb3ciIGFjdGlvbjpuaWwga2V5RXF1aXZhbGVudDpAIiJdOworICAgIFt3aW5kb3dNZW51SXRlbSBzZXRTdWJtZW51OndpbmRvd01lbnVdOworICAgIFtbTlNBcHAgbWFpbk1lbnVdIGFkZEl0ZW06d2luZG93TWVudUl0ZW1dOworICAgIAorICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSB3aW5kb3cgbWVudSAqLworICAgIFtOU0FwcCBzZXRXaW5kb3dzTWVudTp3aW5kb3dNZW51XTsKKworICAgIC8qIEZpbmFsbHkgZ2l2ZSB1cCBvdXIgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyAqLworICAgIFt3aW5kb3dNZW51IHJlbGVhc2VdOworICAgIFt3aW5kb3dNZW51SXRlbSByZWxlYXNlXTsKK30KKworLyogUmVwbGFjZW1lbnQgZm9yIE5TQXBwbGljYXRpb25NYWluICovCitzdGF0aWMgdm9pZCBDdXN0b21BcHBsaWNhdGlvbk1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBOU0F1dG9yZWxlYXNlUG9vbAkqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICAgIFNETE1haW4JCQkJKnNkbE1haW47CisKKyAgICAvKiBFbnN1cmUgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBpcyBpbml0aWFsaXNlZCAqLworICAgIFtTRExBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07CisgICAgCisjaWZkZWYgU0RMX1VTRV9DUFMKKyAgICB7CisgICAgICAgIENQU1Byb2Nlc3NTZXJOdW0gUFNOOworICAgICAgICAvKiBUZWxsIHRoZSBkb2NrIGFib3V0IHVzICovCisgICAgICAgIGlmICghQ1BTR2V0Q3VycmVudFByb2Nlc3MoJlBTTikpCisgICAgICAgICAgICBpZiAoIUNQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb24oJlBTTiwweDAzLDB4M0MsMHgyQywweDExMDMpKQorICAgICAgICAgICAgICAgIGlmICghQ1BTU2V0RnJvbnRQcm9jZXNzKCZQU04pKQorICAgICAgICAgICAgICAgICAgICBbU0RMQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIH0KKyNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLworCisgICAgLyogU2V0IHVwIHRoZSBtZW51YmFyICovCisgICAgW05TQXBwIHNldE1haW5NZW51OltbTlNNZW51IGFsbG9jXSBpbml0XV07CisgICAgc2V0QXBwbGljYXRpb25NZW51KCk7CisgICAgc2V0dXBXaW5kb3dNZW51KCk7CisKKyAgICAvKiBDcmVhdGUgU0RMTWFpbiBhbmQgbWFrZSBpdCB0aGUgYXBwIGRlbGVnYXRlICovCisgICAgc2RsTWFpbiA9IFtbU0RMTWFpbiBhbGxvY10gaW5pdF07CisgICAgW05TQXBwIHNldERlbGVnYXRlOnNkbE1haW5dOworICAgIAorICAgIC8qIFN0YXJ0IHRoZSBtYWluIGV2ZW50IGxvb3AgKi8KKyAgICBbTlNBcHAgcnVuXTsKKyAgICAKKyAgICBbc2RsTWFpbiByZWxlYXNlXTsKKyAgICBbcG9vbCByZWxlYXNlXTsKK30KKworI2VuZGlmCisKKworLyoKKyAqIENhdGNoIGRvY3VtZW50IG9wZW4gcmVxdWVzdHMuLi50aGlzIGxldHMgdXMgbm90aWNlIGZpbGVzIHdoZW4gdGhlIGFwcAorICogIHdhcyBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgYSBkb2N1bWVudCwgb3Igd2hlbiBhIGRvY3VtZW50IHdhcworICogIGRyYWdnZWQvZHJvcHBlZCBvbiB0aGUgYXBwJ3MgaWNvbi4gWW91IG5lZWQgdG8gaGF2ZSBhCisgKiAgQ0ZCdW5kbGVEb2N1bWVudHNUeXBlIHNlY3Rpb24gaW4geW91ciBJbmZvLnBsaXN0IHRvIGdldCB0aGlzIG1lc3NhZ2UsCisgKiAgYXBwYXJlbnRseS4KKyAqCisgKiBGaWxlcyBhcmUgYWRkZWQgdG8gZ0FyZ3YsIHNvIHRvIHRoZSBhcHAsIHRoZXknbGwgbG9vayBsaWtlIGNvbW1hbmQgbGluZQorICogIGFyZ3VtZW50cy4gUHJldmlvdXNseSwgYXBwcyBsYXVuY2hlZCBmcm9tIHRoZSBmaW5kZXIgaGFkIG5vdGhpbmcgYnV0CisgKiAgYW4gYXJndlswXS4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgbWF5IGJlIHJlY2VpdmVkIG11bHRpcGxlIHRpbWVzIHRvIG9wZW4gc2V2ZXJhbCBkb2NzIG9uIGxhdW5jaC4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgaXMgaWdub3JlZCBvbmNlIHRoZSBhcHAncyBtYWlubGluZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKy0gKEJPT0wpYXBwbGljYXRpb246KE5TQXBwbGljYXRpb24gKil0aGVBcHBsaWNhdGlvbiBvcGVuRmlsZTooTlNTdHJpbmcgKilmaWxlbmFtZQoreworICAgIGNvbnN0IGNoYXIgKnRlbXBhcmc7CisgICAgc2l6ZV90IGFyZ2xlbjsKKyAgICBjaGFyICphcmc7CisgICAgY2hhciAqKm5ld2FyZ3Y7CisKKyAgICBpZiAoIWdGaW5kZXJMYXVuY2gpICAvKiBNYWNPUyBpcyBwYXNzaW5nIGNvbW1hbmQgbGluZSBhcmdzLiAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoZ0NhbGxlZEFwcE1haW5saW5lKSAgLyogYXBwIGhhcyBzdGFydGVkLCBpZ25vcmUgdGhpcyBkb2N1bWVudC4gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdGVtcGFyZyA9IFtmaWxlbmFtZSBVVEY4U3RyaW5nXTsKKyAgICBhcmdsZW4gPSBTRExfc3RybGVuKHRlbXBhcmcpICsgMTsKKyAgICBhcmcgPSAoY2hhciAqKSBTRExfbWFsbG9jKGFyZ2xlbik7CisgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBuZXdhcmd2ID0gKGNoYXIgKiopIHJlYWxsb2MoZ0FyZ3YsIHNpemVvZiAoY2hhciAqKSAqIChnQXJnYyArIDIpKTsKKyAgICBpZiAobmV3YXJndiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX2ZyZWUoYXJnKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBnQXJndiA9IG5ld2FyZ3Y7CisKKyAgICBTRExfc3RybGNweShhcmcsIHRlbXBhcmcsIGFyZ2xlbik7CisgICAgZ0FyZ3ZbZ0FyZ2MrK10gPSBhcmc7CisgICAgZ0FyZ3ZbZ0FyZ2NdID0gTlVMTDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKiBDYWxsZWQgd2hlbiB0aGUgaW50ZXJuYWwgZXZlbnQgbG9vcCBoYXMganVzdCBzdGFydGVkIHJ1bm5pbmcgKi8KKy0gKHZvaWQpIGFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOiAoTlNOb3RpZmljYXRpb24gKikgbm90ZQoreworICAgIGludCBzdGF0dXM7CisKKyAgICAvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworICAgIFtzZWxmIHNldHVwV29ya2luZ0RpcmVjdG9yeTpnRmluZGVyTGF1bmNoXTsKKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICAvKiBTZXQgdGhlIG1haW4gbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCisgICAgW3NlbGYgZml4TWVudTpbTlNBcHAgbWFpbk1lbnVdIHdpdGhBcHBOYW1lOmdldEFwcGxpY2F0aW9uTmFtZSgpXTsKKyNlbmRpZgorCisgICAgLyogSGFuZCBvZmYgdG8gbWFpbiBhcHBsaWNhdGlvbiBjb2RlICovCisgICAgZ0NhbGxlZEFwcE1haW5saW5lID0gVFJVRTsKKyAgICBzdGF0dXMgPSBTRExfbWFpbiAoZ0FyZ2MsIGdBcmd2KTsKKworICAgIC8qIFdlJ3JlIGRvbmUsIHRoYW5rIHlvdSBmb3IgcGxheWluZyAqLworICAgIGV4aXQoc3RhdHVzKTsKK30KK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCisKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZmZlclNpemU7CisgICAgdW5zaWduZWQgaW50IHNlbGZMZW4gPSBbc2VsZiBsZW5ndGhdOworICAgIHVuc2lnbmVkIGludCBhU3RyaW5nTGVuID0gW2FTdHJpbmcgbGVuZ3RoXTsKKyAgICB1bmljaGFyICpidWZmZXI7CisgICAgTlNSYW5nZSBsb2NhbFJhbmdlOworICAgIE5TU3RyaW5nICpyZXN1bHQ7CisKKyAgICBidWZmZXJTaXplID0gc2VsZkxlbiArIGFTdHJpbmdMZW4gLSBhUmFuZ2UubGVuZ3RoOworICAgIGJ1ZmZlciA9ICh1bmljaGFyICopTlNBbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlclNpemUqc2l6ZW9mKHVuaWNoYXIpKTsKKyAgICAKKyAgICAvKiBHZXQgZmlyc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVJhbmdlLmxvY2F0aW9uOworICAgIFtzZWxmIGdldENoYXJhY3RlcnM6YnVmZmVyIHJhbmdlOmxvY2FsUmFuZ2VdOworICAgIAorICAgIC8qIEdldCBtaWRkbGUgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVN0cmluZ0xlbjsKKyAgICBbYVN0cmluZyBnZXRDaGFyYWN0ZXJzOihidWZmZXIrYVJhbmdlLmxvY2F0aW9uKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAgCisgICAgLyogR2V0IGxhc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSBhUmFuZ2UubG9jYXRpb24gKyBhUmFuZ2UubGVuZ3RoOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gc2VsZkxlbiAtIGxvY2FsUmFuZ2UubG9jYXRpb247CisgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbithU3RyaW5nTGVuKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAKKyAgICAvKiBCdWlsZCBvdXRwdXQgc3RyaW5nICovCisgICAgcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhDaGFyYWN0ZXJzOmJ1ZmZlciBsZW5ndGg6YnVmZmVyU2l6ZV07CisgICAgCisgICAgTlNEZWFsbG9jYXRlTWVtb3J5UGFnZXMoYnVmZmVyLCBidWZmZXJTaXplKTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCisKKworCisjaWZkZWYgbWFpbgorIyAgdW5kZWYgbWFpbgorI2VuZGlmCisKKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBleGVjdXRhYmxlIC0gc2hvdWxkICpub3QqIGJlIFNETF9tYWluISAqLworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgaW50byBhIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIC8qIFRoaXMgaXMgcGFzc2VkIGlmIHdlIGFyZSBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgKi8KKyAgICBpZiAoIGFyZ2MgPj0gMiAmJiBzdHJuY21wIChhcmd2WzFdLCAiLXBzbiIsIDQpID09IDAgKSB7CisgICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogMik7CisgICAgICAgIGdBcmd2WzBdID0gYXJndlswXTsKKyAgICAgICAgZ0FyZ3ZbMV0gPSBOVUxMOworICAgICAgICBnQXJnYyA9IDE7CisgICAgICAgIGdGaW5kZXJMYXVuY2ggPSBZRVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGdBcmdjID0gYXJnYzsKKyAgICAgICAgZ0FyZ3YgPSAoY2hhciAqKikgU0RMX21hbGxvYyhzaXplb2YgKGNoYXIgKikgKiAoYXJnYysxKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYXJnYzsgaSsrKQorICAgICAgICAgICAgZ0FyZ3ZbaV0gPSBhcmd2W2ldOworICAgICAgICBnRmluZGVyTGF1bmNoID0gTk87CisgICAgfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorICAgIFtTRExBcHBsaWNhdGlvbiBwb3NlQXNDbGFzczpbTlNBcHBsaWNhdGlvbiBjbGFzc11dOworICAgIE5TQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbHNlCisgICAgQ3VzdG9tQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2ggYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FQVNJREVOVElGSUVSX19fX1ByZWZpeC5wY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwOTUwNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaApAQCAtMCwwICsxLDkgQEAKKy8vCisvLyBQcmVmaXggaGVhZGVyIGZvciBhbGwgc291cmNlIGZpbGVzIG9mIHRoZSAnx1BST0pFQ1ROQU1FyCcgdGFyZ2V0IGluIHRoZSAnx1BST0pFQ1ROQU1FyCcgcHJvamVjdAorLy8KKworI2luY2x1ZGUgIlNETC5oIgorCisjaWZkZWYgX19PQkpDX18KKyAgICAjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUljb24uaWNucyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSWNvbi5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGIwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUljb24uaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUluZm8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9UZW1wbGF0ZUluZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4Nzc0NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vX19fUFJPSkVDVE5BTUVfX18ueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApAQCAtMCwwICsxLDEyIEBACit7CisJRmlsZXNUb1JlbmFtZSA9IHsKKwkJIlNETEFwcF9QcmVmaXgucGNoIiA9ICLHUFJPSkVDVE5BTUXIX1ByZWZpeC5wY2giOworCX07CisJRmlsZXNUb01hY3JvRXhwYW5kID0gKAorCQkix1BST0pFQ1ROQU1FyF9QcmVmaXgucGNoIiwKKwkJIkluZm8ucGxpc3QiLAorCQkiRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyIsCisJCSJtYWluLmMiLAorCSk7CisJRGVzY3JpcHRpb24gPSAiVGhpcyBwcm9qZWN0IGJ1aWxkcyBhbiBTREwtYmFzZWQgYXBwbGljYXRpb24gdGhhdCB1c2VzIE9wZW5HTC4iOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9fX19QUk9KRUNUTkFNRV9fXy54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODMyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL19fX1BST0pFQ1ROQU1FX19fLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTAsMCArMSwzNTIgQEAKKy8vICEkKlVURjgqJCEKK3sKKwlhcmNoaXZlVmVyc2lvbiA9IDE7CisJY2xhc3NlcyA9IHsKKwl9OworCW9iamVjdFZlcnNpb24gPSA0NjsKKwlvYmplY3RzID0geworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQkwMDJGMzlGQTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovOyB9OworCQkwMDJGM0EwMDA5RDA4ODQ2MDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjNBMkUwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQTJDMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gKi87IH07CisJCTAwMkYzQTNGMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0EzRTA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jICovOyB9OworCQkwMDJGM0JGQTA5RDA5Mzg5MDBFQkVCODggLyogYXRsYW50aXMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQkY0MDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5jICovOyB9OworCQkwMDJGM0JGQzA5RDA5Mzg5MDBFQkVCODggLyogZG9scGhpbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNCRjYwOUQwOTM4OTAwRUJFQjg4IC8qIGRvbHBoaW4uYyAqLzsgfTsKKwkJMDAyRjNCRkQwOUQwOTM4OTAwRUJFQjg4IC8qIHNoYXJrLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0JGNzA5RDA5Mzg5MDBFQkVCODggLyogc2hhcmsuYyAqLzsgfTsKKwkJMDAyRjNCRkUwOUQwOTM4OTAwRUJFQjg4IC8qIHN3aW0uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQkY4MDlEMDkzODkwMEVCRUI4OCAvKiBzd2ltLmMgKi87IH07CisJCTAwMkYzQkZGMDlEMDkzODkwMEVCRUI4OCAvKiB3aGFsZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNCRjkwOUQwOTM4OTAwRUJFQjg4IC8qIHdoYWxlLmMgKi87IH07CisJCTAwMkYzQzAxMDlEMDkzQkQwMEVCRUI4OCAvKiBPcGVuR0wuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNDMDAwOUQwOTNCRDAwRUJFQjg4IC8qIE9wZW5HTC5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzQzYxMDlEMDk1MUUwMEVCRUI4OCAvKiBHTFVULmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQzYwMDlEMDk1MUUwMEVCRUI4OCAvKiBHTFVULmZyYW1ld29yayAqLzsgfTsKKwkJOEQxMTA3MkIwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi87IH07CisJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGRDA5RDA4ODM0MDBFQkVCODggLyogQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxMDsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzQTAwMDlEMDg4NDYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCW5hbWUgPSAiQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUiOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gU0RMLmZyYW1ld29yazsgcGF0aCA9IC9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMDAyRjNBMkIwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETE1haW4uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU0RMTWFpbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBtYWluLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNCRjQwOUQwOTM4OTAwRUJFQjg4IC8qIGF0bGFudGlzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBhdGxhbnRpcy5jOyBwYXRoID0gYXRsYW50aXMvYXRsYW50aXMuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0JGNTA5RDA5Mzg5MDBFQkVCODggLyogYXRsYW50aXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IGF0bGFudGlzLmg7IHBhdGggPSBhdGxhbnRpcy9hdGxhbnRpcy5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQkY2MDlEMDkzODkwMEVCRUI4OCAvKiBkb2xwaGluLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBkb2xwaGluLmM7IHBhdGggPSBhdGxhbnRpcy9kb2xwaGluLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNCRjcwOUQwOTM4OTAwRUJFQjg4IC8qIHNoYXJrLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBzaGFyay5jOyBwYXRoID0gYXRsYW50aXMvc2hhcmsuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0JGODA5RDA5Mzg5MDBFQkVCODggLyogc3dpbS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gc3dpbS5jOyBwYXRoID0gYXRsYW50aXMvc3dpbS5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQkY5MDlEMDkzODkwMEVCRUI4OCAvKiB3aGFsZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gd2hhbGUuYzsgcGF0aCA9IGF0bGFudGlzL3doYWxlLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNDMDAwOUQwOTNCRDAwRUJFQjg4IC8qIE9wZW5HTC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IE9wZW5HTC5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9PcGVuR0wuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkwMDJGM0M2MDA5RDA5NTFFMDBFQkVCODggLyogR0xVVC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEdMVVQuZnJhbWV3b3JrOyBwYXRoID0gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9HTFVULmZyYW1ld29yazsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwODlDMTY1REZFODQwRTBDQzAyQUFDMDcgLyogRW5nbGlzaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAxMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnN0cmluZ3M7IG5hbWUgPSBFbmdsaXNoOyBwYXRoID0gRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5nczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQ29jb2EuZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkyOUI5NzMyNEZEQ0ZBMzk0MTFDQTJDRUEgLyogQXBwS2l0LmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQXBwS2l0LmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTI5Qjk3MzI1RkRDRkEzOTQxMUNBMkNFQSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gRm91bmRhdGlvbi5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Gb3VuZGF0aW9uLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMzJDQTRGNjMwMzY4RDFFRTAwQzkxNzgzIC8qIF9fX1BST0pFQ1ROQU1FX19fX1ByZWZpeC5wY2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJfX19QUk9KRUNUTkFNRV9fX19QcmVmaXgucGNoIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQxMTA3MzEwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0OyBwYXRoID0gSW5mby5wbGlzdDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gIl9fX1BST0pFQ1ROQU1FX19fLmFwcCI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzlGQTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzQzYxMDlEMDk1MUUwMEVCRUI4OCAvKiBHTFVULmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGM0MwMTA5RDA5M0JEMDBFQkVCODggLyogT3BlbkdMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwMDJGM0JGMzA5RDA5Mzc4MDBFQkVCODggLyogYXRsYW50aXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzQkY0MDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5jICovLAorCQkJCTAwMkYzQkY1MDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5oICovLAorCQkJCTAwMkYzQkY2MDlEMDkzODkwMEVCRUI4OCAvKiBkb2xwaGluLmMgKi8sCisJCQkJMDAyRjNCRjcwOUQwOTM4OTAwRUJFQjg4IC8qIHNoYXJrLmMgKi8sCisJCQkJMDAyRjNCRjgwOUQwOTM4OTAwRUJFQjg4IC8qIHN3aW0uYyAqLywKKwkJCQkwMDJGM0JGOTA5RDA5Mzg5MDBFQkVCODggLyogd2hhbGUuYyAqLywKKwkJCSk7CisJCQluYW1lID0gYXRsYW50aXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwODBFOTZEREZFMjAxRDZEN0YwMDAwMDEgLyogQ2xhc3NlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDAyRjNBMkIwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4uaCAqLywKKwkJCQkwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovLAorCQkJKTsKKwkJCW5hbWUgPSBDbGFzc2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMTA1OEM3QTBGRUE1NEYwMTExQ0EyQ0JCIC8qIExpbmtlZCBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLywKKwkJCQkwMDJGM0M2MDA5RDA5NTFFMDBFQkVCODggLyogR0xVVC5mcmFtZXdvcmsgKi8sCisJCQkJMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLywKKwkJCQkwMDJGM0MwMDA5RDA5M0JEMDBFQkVCODggLyogT3BlbkdMLmZyYW1ld29yayAqLywKKwkJCSk7CisJCQluYW1lID0gIkxpbmtlZCBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTEwNThDN0EyRkVBNTRGMDExMUNBMkNCQiAvKiBPdGhlciBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkyOUI5NzMyNEZEQ0ZBMzk0MTFDQTJDRUEgLyogQXBwS2l0LmZyYW1ld29yayAqLywKKwkJCQkyOUI5NzMyNUZEQ0ZBMzk0MTFDQTJDRUEgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fLmFwcCAqLywKKwkJCSk7CisJCQluYW1lID0gUHJvZHVjdHM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMxNEZEQ0ZBMzk0MTFDQTJDRUEgLyogX19fUFJPSkVDVE5BTUVBU1hNTF9fXyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDgwRTk2RERGRTIwMUQ2RDdGMDAwMDAxIC8qIENsYXNzZXMgKi8sCisJCQkJMjlCOTczMTVGRENGQTM5NDExQ0EyQ0VBIC8qIE90aGVyIFNvdXJjZXMgKi8sCisJCQkJMjlCOTczMTdGRENGQTM5NDExQ0EyQ0VBIC8qIFJlc291cmNlcyAqLywKKwkJCQkyOUI5NzMyM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxOUMyOEZBQ0ZFOUQ1MjBEMTFDQTJDQkIgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJbmFtZSA9ICJfX19QUk9KRUNUTkFNRUFTWE1MX19fIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE1RkRDRkEzOTQxMUNBMkNFQSAvKiBPdGhlciBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGM0JGMzA5RDA5Mzc4MDBFQkVCODggLyogYXRsYW50aXMgKi8sCisJCQkJMzJDQTRGNjMwMzY4RDFFRTAwQzkxNzgzIC8qIF9fX1BST0pFQ1ROQU1FX19fX1ByZWZpeC5wY2ggKi8sCisJCQkJMDAyRjNBM0UwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyAqLywKKwkJCSk7CisJCQluYW1lID0gIk90aGVyIFNvdXJjZXMiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTdGRENGQTM5NDExQ0EyQ0VBIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQxMTA3MzEwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm8ucGxpc3QgKi8sCisJCQkJMDg5QzE2NUNGRTg0MEUwQ0MwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovLAorCQkJKTsKKwkJCW5hbWUgPSBSZXNvdXJjZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMyM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMTA1OEM3QTBGRUE1NEYwMTExQ0EyQ0JCIC8qIExpbmtlZCBGcmFtZXdvcmtzICovLAorCQkJCTEwNThDN0EyRkVBNTRGMDExMUNBMkNCQiAvKiBPdGhlciBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCW5hbWUgPSBGcmFtZXdvcmtzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCThEMTEwNzI2MDQ4NkNFQjgwMEU0NzA5MCAvKiBfX19QUk9KRUNUTkFNRV9fXyAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBDMDFGQ0Y0QTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIl9fX1BST0pFQ1ROQU1FX19fIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjM5RkQwOUQwODgzNDAwRUJFQjg4IC8qIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiX19fUFJPSkVDVE5BTUVfX18iOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCXByb2R1Y3ROYW1lID0gIl9fX1BST0pFQ1ROQU1FX19fIjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA4RDExMDczMjA0ODZDRUI4MDBFNDcwOTAgLyogX19fUFJPSkVDVE5BTUVfX18uYXBwICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5hcHBsaWNhdGlvbiI7CisJCX07CisvKiBFbmQgUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUHJvamVjdCBzZWN0aW9uICovCisJCTI5Qjk3MzEzRkRDRkEzOTQxMUNBMkNFQSAvKiBQcm9qZWN0IG9iamVjdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFByb2plY3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gQzAxRkNGNEUwOEE5NTQ1NDAwNTQyNDdCIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiX19fUFJPSkVDVE5BTUVfX18iICovOworCQkJY29tcGF0aWJpbGl0eVZlcnNpb24gPSAiWGNvZGUgMy4yIjsKKwkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOworCQkJbWFpbkdyb3VwID0gMjlCOTczMTRGRENGQTM5NDExQ0EyQ0VBIC8qIF9fX1BST0pFQ1ROQU1FQVNYTUxfX18gKi87CisJCQlwcm9qZWN0RGlyUGF0aCA9ICIiOworCQkJcHJvamVjdFJvb3QgPSAiIjsKKwkJCXRhcmdldHMgPSAoCisJCQkJOEQxMTA3MjYwNDg2Q0VCODAwRTQ3MDkwIC8qIF9fX1BST0pFQ1ROQU1FX19fICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCThEMTEwNzJCMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGM0EyRTA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNBM0YwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzQkZBMDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNCRkMwOUQwOTM4OTAwRUJFQjg4IC8qIGRvbHBoaW4uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzQkZEMDlEMDkzODkwMEVCRUI4OCAvKiBzaGFyay5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNCRkUwOUQwOTM4OTAwRUJFQjg4IC8qIHN3aW0uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzQkZGMDlEMDkzODkwMEVCRUI4OCAvKiB3aGFsZS5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCQkwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi8gPSB7CisJCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODlDMTY1REZFODQwRTBDQzAyQUFDMDcgLyogRW5nbGlzaCAqLywKKwkJCSk7CisJCQluYW1lID0gSW5mb1BsaXN0LnN0cmluZ3M7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWFZhcmlhbnRHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKwkJQzAxRkNGNEIwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiX19fUFJPSkVDVE5BTUVBU0lERU5USUZJRVJfX19fUHJlZml4LnBjaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL0FwcGxpY2F0aW9ucyI7CisJCQkJUFJPRFVDVF9OQU1FID0gIl9fX1BST0pFQ1ROQU1FX19fIjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUMwMUZDRjRDMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFSQ0hTID0gKAorCQkJCQlwcGMsCisJCQkJCWkzODYsCisJCQkJKTsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICJfX19QUk9KRUNUTkFNRUFTSURFTlRJRklFUl9fX19QcmVmaXgucGNoIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCQlQUk9EVUNUX05BTUUgPSAiX19fUFJPSkVDVE5BTUVfX18iOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlDMDFGQ0Y0RjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl82NF9CSVQpIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzLAorCQkJCQkiJChGUkFNRVdPUktfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlHQ0NfVkVSU0lPTiA9IDQuMDsKKwkJCQkiR0NDX1ZFUlNJT05bYXJjaD14ODZfNjRdIiA9IDQuMjsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzLAorCQkJCQkiJChIRUFERVJfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJU0RLUk9PVCA9IG1hY29zeDEwLjQ7CisJCQkJIlNES1JPT1RbYXJjaD14ODZfNjRdIiA9ICIkKERFVkVMT1BFUl9TREtfRElSKS9NYWNPU1gxMC42LnNkayI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlDMDFGQ0Y1MDA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyXzY0X0JJVCkiOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MsCisJCQkJCSIkKEZSQU1FV09SS19TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCUdDQ19WRVJTSU9OID0gNC4wOworCQkJCSJHQ0NfVkVSU0lPTlthcmNoPXg4Nl82NF0iID0gNC4yOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMsCisJCQkJCSIkKEhFQURFUl9TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gbWFjb3N4MTAuNDsKKwkJCQkiU0RLUk9PVFthcmNoPXg4Nl82NF0iID0gIiQoREVWRUxPUEVSX1NES19ESVIpL01hY09TWDEwLjYuc2RrIjsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCQlDMDFGQ0Y0QTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIl9fX1BST0pFQ1ROQU1FX19fIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUMwMUZDRjRCMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLywKKwkJCQlDMDFGQ0Y0QzA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQlDMDFGQ0Y0RTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJfX19QUk9KRUNUTkFNRV9fXyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlDMDFGQ0Y0RjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8sCisJCQkJQzAxRkNGNTAwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAyOUI5NzMxM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL2F0bGFudGlzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL2F0bGFudGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmZGY2YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvYXRsYW50aXMuYwpAQCAtMCwwICsxLDQ1OSBAQAorCisvKiBDb3B5cmlnaHQgKGMpIE1hcmsgSi4gS2lsZ2FyZCwgMTk5NC4gKi8KKworLyoqCisgKiAoYykgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFMTCBSSUdIVFMgUkVTRVJWRUQKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UKKyAqIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nCisgKiBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogVEhFIE1BVEVSSUFMIEVNQk9ESUVEIE9OIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgVE8gWU9VICJBUy1JUyIKKyAqIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwKKyAqIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorICogR1JBUEhJQ1MsIElOQy4gIEJFIExJQUJMRSBUTyBZT1UgT1IgQU5ZT05FIEVMU0UgRk9SIEFOWSBESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCisgKiBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLAorICogTE9TUyBPRiBQUk9GSVQsIExPU1MgT0YgVVNFLCBTQVZJTkdTIE9SIFJFVkVOVUUsIE9SIFRIRSBDTEFJTVMgT0YKKyAqIFRISVJEIFBBUlRJRVMsIFdIRVRIRVIgT1IgTk9UIFNJTElDT04gR1JBUEhJQ1MsIElOQy4gIEhBUyBCRUVOCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIExPU1MsIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFBPU1NFU1NJT04sIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMKKyAqIFVzZSwgZHVwbGljYXRpb24sIG9yIGRpc2Nsb3N1cmUgYnkgdGhlIEdvdmVybm1lbnQgaXMgc3ViamVjdCB0bworICogcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBpbiBGQVIgNTIuMjI3LjE5KGMpKDIpIG9yIHN1YnBhcmFncmFwaAorICogKGMpKDEpKGlpKSBvZiB0aGUgUmlnaHRzIGluIFRlY2huaWNhbCBEYXRhIGFuZCBDb21wdXRlciBTb2Z0d2FyZQorICogY2xhdXNlIGF0IERGQVJTIDI1Mi4yMjctNzAxMyBhbmQvb3IgaW4gc2ltaWxhciBvciBzdWNjZXNzb3IKKyAqIGNsYXVzZXMgaW4gdGhlIEZBUiBvciB0aGUgRE9EIG9yIE5BU0EgRkFSIFN1cHBsZW1lbnQuCisgKiBVbnB1Ymxpc2hlZC0tIHJpZ2h0cyByZXNlcnZlZCB1bmRlciB0aGUgY29weXJpZ2h0IGxhd3Mgb2YgdGhlCisgKiBVbml0ZWQgU3RhdGVzLiAgQ29udHJhY3Rvci9tYW51ZmFjdHVyZXIgaXMgU2lsaWNvbiBHcmFwaGljcywKKyAqIEluYy4sIDIwMTEgTi4gIFNob3JlbGluZSBCbHZkLiwgTW91bnRhaW4gVmlldywgQ0EgOTQwMzktNzMxMS4KKyAqCisgKiBPcGVuR0woVE0pIGlzIGEgdHJhZGVtYXJrIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjaW5jbHVkZSAiYXRsYW50aXMuaCIKKworZmlzaFJlYyBzaGFya3NbTlVNX1NIQVJLU107CitmaXNoUmVjIG1vbVdoYWxlOworZmlzaFJlYyBiYWJ5V2hhbGU7CitmaXNoUmVjIGRvbHBoOworCitHTGJvb2xlYW4gVGltaW5nID0gR0xfVFJVRTsKKworaW50IHdfd2luID0gNjQwOworaW50IGhfd2luID0gNDgwOworR0xpbnQgY291bnQgID0gMDsKK0dMZW51bSBTdHJNb2RlID0gR0xfVkVORE9SOworCitHTGJvb2xlYW4gbW92aW5nOworCitzdGF0aWMgZG91YmxlIG10aW1lKHZvaWQpCit7CisgICBzdHJ1Y3QgdGltZXZhbCB0a190aW1lOworICAgc3RydWN0IHRpbWV6b25lIHR6OworICAgCisgICBnZXR0aW1lb2ZkYXkoJnRrX3RpbWUsICZ0eik7CisgICAKKyAgIHJldHVybiA0Mjk0Ljk2NzI5NiAqIHRrX3RpbWUudHZfc2VjICsgMC4wMDAwMDEgKiB0a190aW1lLnR2X3VzZWM7Cit9CisKK3N0YXRpYyBkb3VibGUgZmlsdGVyKGRvdWJsZSBpbiwgZG91YmxlICpzYXZlKQoreworCXN0YXRpYyBkb3VibGUgazEgPSAwLjk7CisJc3RhdGljIGRvdWJsZSBrMiA9IDAuMDU7CisKKwlzYXZlWzNdID0gaW47CisJc2F2ZVsxXSA9IHNhdmVbMF0qazEgKyBrMiooc2F2ZVszXSArIHNhdmVbMl0pOworCisJc2F2ZVswXT1zYXZlWzFdOworCXNhdmVbMl09c2F2ZVszXTsKKworCXJldHVybihzYXZlWzFdKTsKK30KKwordm9pZCBEcmF3U3RyKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlHTGludCBpID0gMDsKKwkKKwlpZighc3RyKSByZXR1cm47CisgICAgICAgIAorCXdoaWxlKHN0cltpXSkKKwl7CisJCWdsdXRCaXRtYXBDaGFyYWN0ZXIoR0xVVF9CSVRNQVBfSEVMVkVUSUNBXzEyLCBzdHJbaV0pOworCQlpKys7CisJfQorfQorCit2b2lkCitJbml0RmlzaHModm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fU0hBUktTOyBpKyspIHsKKyAgICAgICAgc2hhcmtzW2ldLnggPSA3MDAwMC4wICsgcmFuZCgpICUgNjAwMDsKKyAgICAgICAgc2hhcmtzW2ldLnkgPSByYW5kKCkgJSA2MDAwOworICAgICAgICBzaGFya3NbaV0ueiA9IHJhbmQoKSAlIDYwMDA7CisgICAgICAgIHNoYXJrc1tpXS5wc2kgPSByYW5kKCkgJSAzNjAgLSAxODAuMDsKKyAgICAgICAgc2hhcmtzW2ldLnYgPSAxLjA7CisgICAgfQorCisgICAgZG9scGgueCA9IDMwMDAwLjA7CisgICAgZG9scGgueSA9IDAuMDsKKyAgICBkb2xwaC56ID0gNjAwMC4wOworICAgIGRvbHBoLnBzaSA9IDkwLjA7CisgICAgZG9scGgudGhldGEgPSAwLjA7CisgICAgZG9scGgudiA9IDMuMDsKKworICAgIG1vbVdoYWxlLnggPSA3MDAwMC4wOworICAgIG1vbVdoYWxlLnkgPSAwLjA7CisgICAgbW9tV2hhbGUueiA9IDAuMDsKKyAgICBtb21XaGFsZS5wc2kgPSA5MC4wOworICAgIG1vbVdoYWxlLnRoZXRhID0gMC4wOworICAgIG1vbVdoYWxlLnYgPSAzLjA7CisKKyAgICBiYWJ5V2hhbGUueCA9IDYwMDAwLjA7CisgICAgYmFieVdoYWxlLnkgPSAtMjAwMC4wOworICAgIGJhYnlXaGFsZS56ID0gLTIwMDAuMDsKKyAgICBiYWJ5V2hhbGUucHNpID0gOTAuMDsKKyAgICBiYWJ5V2hhbGUudGhldGEgPSAwLjA7CisgICAgYmFieVdoYWxlLnYgPSAzLjA7Cit9CisKK3ZvaWQKK0F0bGFudGlzX0luaXQodm9pZCkKK3sKKyAgICBzdGF0aWMgZmxvYXQgYW1iaWVudFtdID0gezAuMiwgMC4yLCAwLjIsIDEuMH07CisgICAgc3RhdGljIGZsb2F0IGRpZmZ1c2VbXSA9IHsxLjAsIDEuMCwgMS4wLCAxLjB9OworICAgIHN0YXRpYyBmbG9hdCBwb3NpdGlvbltdID0gezAuMCwgMS4wLCAwLjAsIDAuMH07CisgICAgc3RhdGljIGZsb2F0IG1hdF9zaGluaW5lc3NbXSA9IHs5MC4wfTsKKyAgICBzdGF0aWMgZmxvYXQgbWF0X3NwZWN1bGFyW10gPSB7MC44LCAwLjgsIDAuOCwgMS4wfTsKKyAgICBzdGF0aWMgZmxvYXQgbWF0X2RpZmZ1c2VbXSA9IHswLjQ2LCAwLjY2LCAwLjc5NSwgMS4wfTsKKyAgICBzdGF0aWMgZmxvYXQgbWF0X2FtYmllbnRbXSA9IHswLjMsIDAuNCwgMC41LCAxLjB9OworICAgIHN0YXRpYyBmbG9hdCBsbW9kZWxfYW1iaWVudFtdID0gezAuNCwgMC40LCAwLjQsIDEuMH07CisgICAgc3RhdGljIGZsb2F0IGxtb2RlbF9sb2NhbHZpZXdlcltdID0gezAuMH07CisgICAgLy9HTGZsb2F0IG1hcDFbNF0gPSB7MC4wLCAwLjAsIDAuMCwgMC4wfTsKKyAgICAvL0dMZmxvYXQgbWFwMls0XSA9IHswLjAsIDAuMCwgMC4wLCAwLjB9OworICAgIHN0YXRpYyBmbG9hdCBmb2dfY29sb3JbXSA9IHswLjAsIDAuNSwgMC45LCAxLjB9OworCisgICAgZ2xGcm9udEZhY2UoR0xfQ0NXKTsKKworICAgIGdsRGVwdGhGdW5jKEdMX0xFU1MpOworICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworCisgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfQU1CSUVOVCwgYW1iaWVudCk7CisgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfRElGRlVTRSwgZGlmZnVzZSk7CisgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfUE9TSVRJT04sIHBvc2l0aW9uKTsKKyAgICBnbExpZ2h0TW9kZWxmdihHTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBsbW9kZWxfYW1iaWVudCk7CisgICAgZ2xMaWdodE1vZGVsZnYoR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSLCBsbW9kZWxfbG9jYWx2aWV3ZXIpOworICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDApOworCisgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TSElOSU5FU1MsIG1hdF9zaGluaW5lc3MpOworICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIG1hdF9zcGVjdWxhcik7CisgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9ESUZGVVNFLCBtYXRfZGlmZnVzZSk7CisgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBtYXRfYW1iaWVudCk7CisKKyAgICBJbml0RmlzaHMoKTsKKworICAgIGdsRW5hYmxlKEdMX0ZPRyk7CisJZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9FWFApOworCWdsRm9nZihHTF9GT0dfREVOU0lUWSwgMC4wMDAwMDI1KTsKKwlnbEZvZ2Z2KEdMX0ZPR19DT0xPUiwgZm9nX2NvbG9yKTsKKworICAgIGdsQ2xlYXJDb2xvcigwLjAsIDAuNSwgMC45LCAxLjApOworfQorCit2b2lkCitBdGxhbnRpc19SZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwl3X3dpbiA9IHdpZHRoOworCWhfd2luID0gaGVpZ2h0OworCQorICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICBnbHVQZXJzcGVjdGl2ZSg2MC4wLCAoR0xmbG9hdCkgd2lkdGggLyAoR0xmbG9hdCkgaGVpZ2h0LCAyMDAwMC4wLCAzMDAwMDAuMCk7CisgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Cit9CisKK3ZvaWQKK0F0bGFudGlzX0FuaW1hdGUodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fU0hBUktTOyBpKyspIHsKKyAgICAgICAgU2hhcmtQaWxvdCgmc2hhcmtzW2ldKTsKKyAgICAgICAgU2hhcmtNaXNzKGkpOworICAgIH0KKyAgICBXaGFsZVBpbG90KCZkb2xwaCk7CisgICAgZG9scGgucGhpKys7CisgICAgLy9nbHV0UG9zdFJlZGlzcGxheSgpOworICAgIFdoYWxlUGlsb3QoJm1vbVdoYWxlKTsKKyAgICBtb21XaGFsZS5waGkrKzsKKyAgICBXaGFsZVBpbG90KCZiYWJ5V2hhbGUpOworICAgIGJhYnlXaGFsZS5waGkrKzsKK30KKwordm9pZAorQXRsYW50aXNfS2V5KHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgeCwgaW50IHkpCit7CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlICd0JzoKKyAgICAJVGltaW5nID0gIVRpbWluZzsKKyAgICBicmVhazsKKyAgICBjYXNlICcgJzoKKyAgICAJc3dpdGNoKFN0ck1vZGUpCisgICAgCXsKKwkJICAgIGNhc2UgR0xfRVhURU5TSU9OUzoKKyAgICAJCQlTdHJNb2RlID0gR0xfVkVORE9SOworCQkgICAgYnJlYWs7CisJCSAgICBjYXNlIEdMX1ZFTkRPUjoKKwkJICAgIAlTdHJNb2RlID0gR0xfUkVOREVSRVI7CisJCSAgICBicmVhazsKKwkJICAgIGNhc2UgR0xfUkVOREVSRVI6CisJCSAgICAJU3RyTW9kZSA9IEdMX1ZFUlNJT047CisJCSAgICBicmVhazsKKwkJICAgIGNhc2UgR0xfVkVSU0lPTjoKKwkJICAgIAlTdHJNb2RlID0gR0xfRVhURU5TSU9OUzsKKwkJICAgIGJyZWFrOworCQl9CisJYnJlYWs7CisgICAgY2FzZSAyNzogICAgICAgICAgIC8qIEVzYyB3aWxsIHF1aXQgKi8KKyAgICAgICAgZXhpdCgxKTsKKyAgICBicmVhazsKKyAgICBjYXNlICdzJzogICAgICAgICAgICAgCQkvKiAicyIgc3RhcnQgYW5pbWF0aW9uICovCisgICAgICAgIG1vdmluZyA9IEdMX1RSVUU7CisgICAgICAgIC8vZ2x1dElkbGVGdW5jKEFuaW1hdGUpOworICAgIGJyZWFrOworICAgIGNhc2UgJ2EnOiAgICAgICAgICAJCQkvKiAiYSIgc3RvcCBhbmltYXRpb24gKi8KKyAgICAgICAgbW92aW5nID0gR0xfRkFMU0U7CisgICAgICAgIC8vZ2x1dElkbGVGdW5jKE5VTEwpOworICAgIGJyZWFrOworICAgIGNhc2UgJy4nOiAgICAgICAgICAJCQkvKiAiLiIgd2lsbCBhZHZhbmNlIGZyYW1lICovCisgICAgICAgIGlmICghbW92aW5nKSB7CisgICAgICAgICAgICBBdGxhbnRpc19BbmltYXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisvKgordm9pZCBEaXNwbGF5KHZvaWQpCit7CisJc3RhdGljIGZsb2F0IFAxMjNbM10gPSB7LTQ0OC45NCwgLTIwMy4xNCwgOTQ5OS42MH07CisJc3RhdGljIGZsb2F0IFAxMjRbM10gPSB7LTQ0Mi42NCwgLTE4NS4yMCwgOTUyOC4wN307CisJc3RhdGljIGZsb2F0IFAxMjVbM10gPSB7LTQ0MS4wNywgLTE0OC4wNSwgOTUyOC4wN307CisJc3RhdGljIGZsb2F0IFAxMjZbM10gPSB7LTQ0My40MywgLTEyOC44NCwgOTQ5OS42MH07CisJc3RhdGljIGZsb2F0IFAxMjdbM10gPSB7LTQ1Ni44NywgLTE0Ni43OCwgOTQ2Ni42N307CisJc3RhdGljIGZsb2F0IFAxMjhbM10gPSB7LTQ1My42OCwgLTE4My45MywgOTQ2Ni42N307CisKKwlnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUKTsKKwkKKwlnbFB1c2hNYXRyaXgoKTsKKyAgICBGaXNoVHJhbnNmb3JtKCZkb2xwaCk7CisgICAgRHJhd0RvbHBoaW4oJmRvbHBoKTsKKyAgICBnbFBvcE1hdHJpeCgpOworIAorCWdsdXRTd2FwQnVmZmVycygpOworfQorKi8KKwordm9pZAorQXRsYW50aXNfRGlzcGxheSh2b2lkKQoreworICAgIGludCBpOworICAgIHN0YXRpYyBkb3VibGUgdGhbNF0gPSB7MC4wLCAwLjAsIDAuMCwgMC4wfTsKKwlzdGF0aWMgZG91YmxlIHQxID0gMC4wLCB0MiA9IDAuMCwgdDsKKwljaGFyIG51bV9zdHJbMTI4XTsKKyAgICAKKyAgICB0MSA9IHQyOworCisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1NIQVJLUzsgaSsrKSB7CisgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICBGaXNoVHJhbnNmb3JtKCZzaGFya3NbaV0pOworICAgICAgICBEcmF3U2hhcmsoJnNoYXJrc1tpXSk7CisgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgfQorCisgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgRmlzaFRyYW5zZm9ybSgmZG9scGgpOworICAgIERyYXdEb2xwaGluKCZkb2xwaCk7CisgICAgZ2xQb3BNYXRyaXgoKTsKKworICAgIGdsUHVzaE1hdHJpeCgpOworICAgIEZpc2hUcmFuc2Zvcm0oJm1vbVdoYWxlKTsKKyAgICBEcmF3V2hhbGUoJm1vbVdoYWxlKTsKKyAgICBnbFBvcE1hdHJpeCgpOworCisgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgRmlzaFRyYW5zZm9ybSgmYmFieVdoYWxlKTsKKyAgICBnbFNjYWxlZigwLjQ1LCAwLjQ1LCAwLjMpOworICAgIERyYXdXaGFsZSgmYmFieVdoYWxlKTsKKyAgICBnbFBvcE1hdHJpeCgpOworICAgIAorICAgIGlmKFRpbWluZykKKyAgICB7CisJCXQyID0gbXRpbWUoKTsKKwkJdCA9IHQyIC0gdDE7CisJCWlmKHQgPiAwLjAwMDEpIHQgPSAxLjAgLyB0OworCQkKKwkJZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKwkJLy9nbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisJCQorCQlnbENvbG9yM2YoMS4wLCAwLjAsIDAuMCk7CisJCQorCQlnbE1hdHJpeE1vZGUgKEdMX1BST0pFQ1RJT04pOworCQlnbFB1c2hNYXRyaXgoKTsKKwkJZ2xMb2FkSWRlbnRpdHkoKTsKKwkJZ2xPcnRobygwLCB3X3dpbiwgMCwgaF93aW4sIC0xMC4wLCAxMC4wKTsKKwkJCisJCWdsUmFzdGVyUG9zMmYoNS4wLCA1LjApOworCQkKKwkJc3dpdGNoKFN0ck1vZGUpCisJCXsKKwkJCWNhc2UgR0xfVkVORE9SOgorCQkJCXNwcmludGYobnVtX3N0ciwgIiUwLjJmIEh6LCAlZHglZCwgVkVORE9SOiAiLCBmaWx0ZXIodCwgdGgpLCB3X3dpbiwgaF93aW4pOworCQkJCURyYXdTdHIobnVtX3N0cik7CisJCQkJRHJhd1N0cihnbEdldFN0cmluZyhHTF9WRU5ET1IpKTsKKwkJCWJyZWFrOworCQkJY2FzZSBHTF9SRU5ERVJFUjoKKwkJCQlzcHJpbnRmKG51bV9zdHIsICIlMC4yZiBIeiwgJWR4JWQsIFJFTkRFUkVSOiAiLCBmaWx0ZXIodCwgdGgpLCB3X3dpbiwgaF93aW4pOworCQkJCURyYXdTdHIobnVtX3N0cik7CisJCQkJRHJhd1N0cihnbEdldFN0cmluZyhHTF9SRU5ERVJFUikpOworCQkJYnJlYWs7CisJCQljYXNlIEdMX1ZFUlNJT046CisJCQkJc3ByaW50ZihudW1fc3RyLCAiJTAuMmYgSHosICVkeCVkLCBWRVJTSU9OOiAiLCBmaWx0ZXIodCwgdGgpLCB3X3dpbiwgaF93aW4pOworCQkJCURyYXdTdHIobnVtX3N0cik7CisJCQkJRHJhd1N0cihnbEdldFN0cmluZyhHTF9WRVJTSU9OKSk7CisJCQlicmVhazsKKwkJCWNhc2UgR0xfRVhURU5TSU9OUzoKKwkJCQlzcHJpbnRmKG51bV9zdHIsICIlMC4yZiBIeiwgJWR4JWQsIEVYVEVOU0lPTlM6ICIsIGZpbHRlcih0LCB0aCksIHdfd2luLCBoX3dpbik7CisJCQkJRHJhd1N0cihudW1fc3RyKTsKKwkJCQlEcmF3U3RyKGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKKwkJCWJyZWFrOworCQl9CisJCQorCQlnbFBvcE1hdHJpeCgpOworCQlnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKwkJCisJCWdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKwkJLy9nbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKwl9CisJCisgICAgY291bnQrKzsKKworICAgIGdsdXRTd2FwQnVmZmVycygpOworfQorCisvKgordm9pZAorVmlzaWJsZShpbnQgc3RhdGUpCit7CisgICAgaWYgKHN0YXRlID09IEdMVVRfVklTSUJMRSkgeworICAgICAgICBpZiAobW92aW5nKQorICAgICAgICAgICAgZ2x1dElkbGVGdW5jKEFuaW1hdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtb3ZpbmcpCisgICAgICAgICAgICBnbHV0SWRsZUZ1bmMoTlVMTCk7CisgICAgfQorfQorCisKK3ZvaWQKK3RpbWluZ1NlbGVjdChpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoKHZhbHVlKQorICAgIHsKKwkJY2FzZSAxOgorCQkJU3RyTW9kZSA9IEdMX1ZFTkRPUjsKKwkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCVN0ck1vZGUgPSBHTF9SRU5ERVJFUjsKKwkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCVN0ck1vZGUgPSBHTF9WRVJTSU9OOworCQlicmVhazsKKwkJY2FzZSA0OgorCQkJU3RyTW9kZSA9IEdMX0VYVEVOU0lPTlM7CisJCWJyZWFrOworICAgIH0KK30KKwordm9pZAorbWVudVNlbGVjdChpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgIGNhc2UgMToKKyAgICAgICAgbW92aW5nID0gR0xfVFJVRTsKKyAgICAgICAgZ2x1dElkbGVGdW5jKEFuaW1hdGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIG1vdmluZyA9IEdMX0ZBTFNFOworICAgICAgICBnbHV0SWRsZUZ1bmMoTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUdMYm9vbGVhbiBmdWxsc2NyZWVuID0gR0xfRkFMU0U7IAorCUdMaW50IHRpbWVfbWVudTsKKyAJCisgCXNyYW5kKDApOworCisgICAgICAgIGdsdXRJbml0KCZhcmdjLCBhcmd2KTsKKwlpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcChhcmd2WzFdLCAiLXciKSkKKwkJZnVsbHNjcmVlbiA9IEdMX0ZBTFNFOworCisJLy9nbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfUkdCQSB8IEdMVVRfRE9VQkxFIHwgR0xVVF9ERVBUSCk7CisJZ2x1dEluaXREaXNwbGF5U3RyaW5nKCJyZ2JhIGRvdWJsZSBkZXB0aD0yNCIpOworCWlmIChmdWxsc2NyZWVuKSB7CisJICBnbHV0R2FtZU1vZGVTdHJpbmcoIjEwMjR4NzY4OjMyIik7CisJICBnbHV0RW50ZXJHYW1lTW9kZSgpOworCX0gZWxzZSB7CisJICBnbHV0SW5pdFdpbmRvd1NpemUoMzIwLCAyNDApOworCSAgZ2x1dENyZWF0ZVdpbmRvdygiQXRsYW50aXMgVGltaW5nIik7CisJfQorICAgIEluaXQoKTsKKyAgICBnbHV0RGlzcGxheUZ1bmMoRGlzcGxheSk7CisgICAgZ2x1dFJlc2hhcGVGdW5jKFJlc2hhcGUpOworICAgIGdsdXRLZXlib2FyZEZ1bmMoS2V5KTsKKyAgICBtb3ZpbmcgPSBHTF9UUlVFOworZ2x1dElkbGVGdW5jKEFuaW1hdGUpOworICAgIGdsdXRWaXNpYmlsaXR5RnVuYyhWaXNpYmxlKTsKKyAgICAKKyAgICB0aW1lX21lbnUgPSBnbHV0Q3JlYXRlTWVudSh0aW1pbmdTZWxlY3QpOworICAgIGdsdXRBZGRNZW51RW50cnkoIkdMX1ZFTkRPUiIsIDEpOworICAgIGdsdXRBZGRNZW51RW50cnkoIkdMX1JFTkRFUkVSIiwgMik7CisgICAgZ2x1dEFkZE1lbnVFbnRyeSgiR0xfVkVSU0lPTiIsIDMpOworICAgIGdsdXRBZGRNZW51RW50cnkoIkdMX0VYVEVOU0lPTlMiLCA0KTsKKyAgICAKKyAgICBnbHV0Q3JlYXRlTWVudShtZW51U2VsZWN0KTsKKyAgICBnbHV0QWRkTWVudUVudHJ5KCJTdGFydCBtb3Rpb24iLCAxKTsKKyAgICBnbHV0QWRkTWVudUVudHJ5KCJTdG9wIG1vdGlvbiIsIDIpOworICAgIGdsdXRBZGRTdWJNZW51KCJUaW1pbmcgTW9kZSIsIHRpbWVfbWVudSk7CisgICAgZ2x1dEFkZE1lbnVFbnRyeSgiUXVpdCIsIDQpOworICAgIAorICAgIC8vZ2x1dEF0dGFjaE1lbnUoR0xVVF9SSUdIVF9CVVRUT04pOworICAgIGdsdXRBdHRhY2hNZW51KEdMVVRfUklHSFRfQlVUVE9OKTsKKyAgICBnbHV0TWFpbkxvb3AoKTsKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgLy8gQU5TSSBDIHJlcXVpcmVzIG1haW4gdG8gcmV0dXJuIGludC4KK30KKyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9hdGxhbnRpcy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9hdGxhbnRpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2YyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL2F0bGFudGlzLmgKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiAoYykgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFMTCBSSUdIVFMgUkVTRVJWRUQKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UKKyAqIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nCisgKiBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogVEhFIE1BVEVSSUFMIEVNQk9ESUVEIE9OIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgVE8gWU9VICJBUy1JUyIKKyAqIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwKKyAqIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorICogR1JBUEhJQ1MsIElOQy4gIEJFIExJQUJMRSBUTyBZT1UgT1IgQU5ZT05FIEVMU0UgRk9SIEFOWSBESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCisgKiBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLAorICogTE9TUyBPRiBQUk9GSVQsIExPU1MgT0YgVVNFLCBTQVZJTkdTIE9SIFJFVkVOVUUsIE9SIFRIRSBDTEFJTVMgT0YKKyAqIFRISVJEIFBBUlRJRVMsIFdIRVRIRVIgT1IgTk9UIFNJTElDT04gR1JBUEhJQ1MsIElOQy4gIEhBUyBCRUVOCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIExPU1MsIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFBPU1NFU1NJT04sIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMKKyAqIFVzZSwgZHVwbGljYXRpb24sIG9yIGRpc2Nsb3N1cmUgYnkgdGhlIEdvdmVybm1lbnQgaXMgc3ViamVjdCB0bworICogcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBpbiBGQVIgNTIuMjI3LjE5KGMpKDIpIG9yIHN1YnBhcmFncmFwaAorICogKGMpKDEpKGlpKSBvZiB0aGUgUmlnaHRzIGluIFRlY2huaWNhbCBEYXRhIGFuZCBDb21wdXRlciBTb2Z0d2FyZQorICogY2xhdXNlIGF0IERGQVJTIDI1Mi4yMjctNzAxMyBhbmQvb3IgaW4gc2ltaWxhciBvciBzdWNjZXNzb3IKKyAqIGNsYXVzZXMgaW4gdGhlIEZBUiBvciB0aGUgRE9EIG9yIE5BU0EgRkFSIFN1cHBsZW1lbnQuCisgKiBVbnB1Ymxpc2hlZC0tIHJpZ2h0cyByZXNlcnZlZCB1bmRlciB0aGUgY29weXJpZ2h0IGxhd3Mgb2YgdGhlCisgKiBVbml0ZWQgU3RhdGVzLiAgQ29udHJhY3Rvci9tYW51ZmFjdHVyZXIgaXMgU2lsaWNvbiBHcmFwaGljcywKKyAqIEluYy4sIDIwMTEgTi4gIFNob3JlbGluZSBCbHZkLiwgTW91bnRhaW4gVmlldywgQ0EgOTQwMzktNzMxMS4KKyAqCisgKiBPcGVuR0woVE0pIGlzIGEgdHJhZGVtYXJrIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2RlZmluZSBSQUQgNTcuMjk1CisjZGVmaW5lIFJSQUQgMC4wMTc0NQorCisjZGVmaW5lIE5VTV9TSEFSS1MgNAorI2RlZmluZSBTSEFSS1NJWkUgNjAwMAorI2RlZmluZSBTSEFSS1NQRUVEIDEwMC4wCisKKyNkZWZpbmUgV0hBTEVTUEVFRCAyNTAuMAorCit0eXBlZGVmIHN0cnVjdCBfZmlzaFJlYyB7CisgICAgZmxvYXQgeCwgeSwgeiwgcGhpLCB0aGV0YSwgcHNpLCB2OworICAgIGZsb2F0IHh0LCB5dCwgenQ7CisgICAgZmxvYXQgaHRhaWwsIHZ0YWlsOworICAgIGZsb2F0IGR0aGV0YTsKKyAgICBpbnQgc3B1cnQsIGF0dGFjazsKK30gZmlzaFJlYzsKKworZXh0ZXJuIGZpc2hSZWMgc2hhcmtzW05VTV9TSEFSS1NdOworZXh0ZXJuIGZpc2hSZWMgbW9tV2hhbGU7CitleHRlcm4gZmlzaFJlYyBiYWJ5V2hhbGU7CitleHRlcm4gZmlzaFJlYyBkb2xwaDsKKworZXh0ZXJuIHZvaWQgRmlzaFRyYW5zZm9ybShmaXNoUmVjICopOworZXh0ZXJuIHZvaWQgV2hhbGVQaWxvdChmaXNoUmVjICopOworZXh0ZXJuIHZvaWQgU2hhcmtQaWxvdChmaXNoUmVjICopOworZXh0ZXJuIHZvaWQgU2hhcmtNaXNzKGludCk7CitleHRlcm4gdm9pZCBEcmF3V2hhbGUoZmlzaFJlYyAqKTsKK2V4dGVybiB2b2lkIERyYXdTaGFyayhmaXNoUmVjICopOworZXh0ZXJuIHZvaWQgRHJhd0RvbHBoaW4oZmlzaFJlYyAqKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvZG9scGhpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9kb2xwaGluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiYTNiYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvZG9scGhpbi5jCkBAIC0wLDAgKzEsMTkzNCBAQAorLyoqCisgKiAoYykgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFMTCBSSUdIVFMgUkVTRVJWRUQKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UKKyAqIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nCisgKiBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogVEhFIE1BVEVSSUFMIEVNQk9ESUVEIE9OIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgVE8gWU9VICJBUy1JUyIKKyAqIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwKKyAqIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorICogR1JBUEhJQ1MsIElOQy4gIEJFIExJQUJMRSBUTyBZT1UgT1IgQU5ZT05FIEVMU0UgRk9SIEFOWSBESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCisgKiBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLAorICogTE9TUyBPRiBQUk9GSVQsIExPU1MgT0YgVVNFLCBTQVZJTkdTIE9SIFJFVkVOVUUsIE9SIFRIRSBDTEFJTVMgT0YKKyAqIFRISVJEIFBBUlRJRVMsIFdIRVRIRVIgT1IgTk9UIFNJTElDT04gR1JBUEhJQ1MsIElOQy4gIEhBUyBCRUVOCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIExPU1MsIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFBPU1NFU1NJT04sIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMKKyAqIFVzZSwgZHVwbGljYXRpb24sIG9yIGRpc2Nsb3N1cmUgYnkgdGhlIEdvdmVybm1lbnQgaXMgc3ViamVjdCB0bworICogcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBpbiBGQVIgNTIuMjI3LjE5KGMpKDIpIG9yIHN1YnBhcmFncmFwaAorICogKGMpKDEpKGlpKSBvZiB0aGUgUmlnaHRzIGluIFRlY2huaWNhbCBEYXRhIGFuZCBDb21wdXRlciBTb2Z0d2FyZQorICogY2xhdXNlIGF0IERGQVJTIDI1Mi4yMjctNzAxMyBhbmQvb3IgaW4gc2ltaWxhciBvciBzdWNjZXNzb3IKKyAqIGNsYXVzZXMgaW4gdGhlIEZBUiBvciB0aGUgRE9EIG9yIE5BU0EgRkFSIFN1cHBsZW1lbnQuCisgKiBVbnB1Ymxpc2hlZC0tIHJpZ2h0cyByZXNlcnZlZCB1bmRlciB0aGUgY29weXJpZ2h0IGxhd3Mgb2YgdGhlCisgKiBVbml0ZWQgU3RhdGVzLiAgQ29udHJhY3Rvci9tYW51ZmFjdHVyZXIgaXMgU2lsaWNvbiBHcmFwaGljcywKKyAqIEluYy4sIDIwMTEgTi4gIFNob3JlbGluZSBCbHZkLiwgTW91bnRhaW4gVmlldywgQ0EgOTQwMzktNzMxMS4KKyAqCisgKiBPcGVuR0woVE0pIGlzIGEgdHJhZGVtYXJrIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxHTFVUL2dsdXQuaD4KKyNpbmNsdWRlICJhdGxhbnRpcy5oIgorLyogKklOREVOVC1PRkYqICovCitzdGF0aWMgZmxvYXQgTjAwMVszXSA9IHstMC4wMDU5MzcgLC0wLjEwMTk5OCAsLTAuOTk0NzY3fTsKK3N0YXRpYyBmbG9hdCBOMDAyWzNdID0gezAuOTM2NzgwICwtMC4yMDA4MDMgLDAuMjg2NTY5fTsKK3N0YXRpYyBmbG9hdCBOMDAzWzNdID0gey0wLjIzMzA2MiAsMC45NzIwNTggLDAuMDI4MDA3fTsKK3N0YXRpYyBmbG9hdCBOMDA1WzNdID0gezAuODk4MTE3ICwwLjM2MDE3MSAsMC4yNTIzMTV9Oworc3RhdGljIGZsb2F0IE4wMDZbM10gPSB7LTAuOTE1NDM3ICwwLjM0ODQ1NiAsMC4yMDEzNzh9Oworc3RhdGljIGZsb2F0IE4wMDdbM10gPSB7MC42MDIyNjMgLC0wLjc3NzUyNyAsMC4xODA5MjB9Oworc3RhdGljIGZsb2F0IE4wMDhbM10gPSB7LTAuOTA2OTEyICwtMC40MTIwMTUgLDAuMDg4MDYxfTsKK3N0YXRpYyBmbG9hdCBOMDEyWzNdID0gezAuODg0NDA4ICwtMC40Mjk0MTcgLC0wLjE4MjgyMX07CitzdGF0aWMgZmxvYXQgTjAxM1szXSA9IHswLjkyMTEyMSAsMC4zMTEwODQgLC0wLjIzNDAxNn07CitzdGF0aWMgZmxvYXQgTjAxNFszXSA9IHswLjM4MjYzNSAsMC44Nzc4ODIgLC0wLjI4Nzk0OH07CitzdGF0aWMgZmxvYXQgTjAxNVszXSA9IHstMC4zODAwNDYgLDAuODg4MTY2ICwtMC4yNTgzMTZ9Oworc3RhdGljIGZsb2F0IE4wMTZbM10gPSB7LTAuODkxNTE1ICwwLjM5MjIzOCAsLTAuMjI2NjA3fTsKK3N0YXRpYyBmbG9hdCBOMDE3WzNdID0gey0wLjkwMTQxOSAsLTAuMzgyMDAyICwtMC4yMDM3NjN9Oworc3RhdGljIGZsb2F0IE4wMThbM10gPSB7LTAuMzY3MjI1ICwtMC45MTEwOTEgLC0wLjE4NzI0M307CitzdGF0aWMgZmxvYXQgTjAxOVszXSA9IHswLjMzOTUzOSAsLTAuOTI0ODQ2ICwtMC4xNzEzODh9Oworc3RhdGljIGZsb2F0IE4wMjBbM10gPSB7MC45MTQ3MDYgLC0wLjM3ODYxNyAsLTAuMTQxMjkwfTsKK3N0YXRpYyBmbG9hdCBOMDIxWzNdID0gezAuOTUwNjYyICwwLjI2MjcxMyAsLTAuMTY0OTk0fTsKK3N0YXRpYyBmbG9hdCBOMDIyWzNdID0gezAuNTQ2MzU5ICwwLjgwMTQ2MCAsLTAuMjQzMjE4fTsKK3N0YXRpYyBmbG9hdCBOMDIzWzNdID0gey0wLjMxNTc5NiAsMC45MTcwNjggLC0wLjI0MzQzMX07CitzdGF0aWMgZmxvYXQgTjAyNFszXSA9IHstMC44MjU2ODcgLDAuNTMyMjc3ICwtMC4xODY4NzV9Oworc3RhdGljIGZsb2F0IE4wMjVbM10gPSB7LTAuOTc0NzYzICwtMC4xNTUyMzIgLC0wLjE2MDQzNX07CitzdGF0aWMgZmxvYXQgTjAyNlszXSA9IHstMC41NjA1OTYgLC0wLjgxNjY1OCAsLTAuMTM3MTE5fTsKK3N0YXRpYyBmbG9hdCBOMDI3WzNdID0gezAuMzgwMjEwICwtMC45MTA4MTcgLC0wLjE2MDc4Nn07CitzdGF0aWMgZmxvYXQgTjAyOFszXSA9IHswLjkyMzc3MiAsLTAuMzU4MzIyICwtMC4xMzUwOTN9Oworc3RhdGljIGZsb2F0IE4wMjlbM10gPSB7MC45NTEyMDIgLDAuMjc1MDUzICwtMC4xMzk4NTl9Oworc3RhdGljIGZsb2F0IE4wMzBbM10gPSB7MC42ODYwOTkgLDAuNzAyNTQ4ICwtMC4xODg5MzJ9Oworc3RhdGljIGZsb2F0IE4wMzFbM10gPSB7LTAuNTIxODY1ICwwLjgyNjcxOSAsLTAuMjEwMjIwfTsKK3N0YXRpYyBmbG9hdCBOMDMyWzNdID0gey0wLjkyMzgyMCAsMC4zNDY3MzkgLC0wLjE2MjI1OH07CitzdGF0aWMgZmxvYXQgTjAzM1szXSA9IHstMC45MDIwOTUgLC0wLjQwOTk5NSAsLTAuMTM0NjQ2fTsKK3N0YXRpYyBmbG9hdCBOMDM0WzNdID0gey0wLjUwOTExNSAsLTAuODQ4NDk4ICwtMC4xNDQ0MDR9Oworc3RhdGljIGZsb2F0IE4wMzVbM10gPSB7MC40NTY0NjkgLC0wLjg4MDI5MyAsLTAuMTI5MzA1fTsKK3N0YXRpYyBmbG9hdCBOMDM2WzNdID0gezAuODczNDAxICwtMC40NzU0ODkgLC0wLjEwNTI2Nn07CitzdGF0aWMgZmxvYXQgTjAzN1szXSA9IHswLjk3MDgyNSAsMC4xNzk4NjEgLC0wLjE1ODU4NH07CitzdGF0aWMgZmxvYXQgTjAzOFszXSA9IHswLjY3NTYwOSAsMC43MTQxODcgLC0wLjE4MzAwNH07CitzdGF0aWMgZmxvYXQgTjAzOVszXSA9IHstMC41MjM1NzQgLDAuODMwMjEyICwtMC4xOTEzNjB9Oworc3RhdGljIGZsb2F0IE4wNDBbM10gPSB7LTAuOTU4ODk1ICwwLjIzMDgwOCAsLTAuMTY1MDcxfTsKK3N0YXRpYyBmbG9hdCBOMDQxWzNdID0gey0wLjkxODI4NSAsLTAuMzc2ODAzICwtMC4xMjE1NDJ9Oworc3RhdGljIGZsb2F0IE4wNDJbM10gPSB7LTAuNjIyNDY3ICwtMC43NzQxNjcgLC0wLjExNDg4OH07CitzdGF0aWMgZmxvYXQgTjA0M1szXSA9IHswLjQwNDQ5NyAsLTAuOTA4ODA3ICwtMC4xMDIyMzF9Oworc3RhdGljIGZsb2F0IE4wNDRbM10gPSB7MC45MzA1MzggLC0wLjM2NTE1NSAsLTAuMDI3NTg4fTsKK3N0YXRpYyBmbG9hdCBOMDQ1WzNdID0gezAuOTIxOTIwICwwLjM3NDE1NyAsLTAuMTAwMzQ1fTsKK3N0YXRpYyBmbG9hdCBOMDQ2WzNdID0gezAuNTA3MzQ2ICwwLjg2MDczOSAsMC4wNDE1NjJ9Oworc3RhdGljIGZsb2F0IE4wNDdbM10gPSB7LTAuMzk0NjQ2ICwwLjkxODgxNSAsLTAuMDA1NzMwfTsKK3N0YXRpYyBmbG9hdCBOMDQ4WzNdID0gey0wLjkyNTQxMSAsMC4zNzMwMjQgLC0wLjA2NjgzN307CitzdGF0aWMgZmxvYXQgTjA0OVszXSA9IHstMC45NDUzMzcgLC0wLjMyMjMwOSAsLTAuMDQ5NTUxfTsKK3N0YXRpYyBmbG9hdCBOMDUwWzNdID0gey0wLjY2MDQzNyAsLTAuNzUwNTU3ICwtMC4wMjIwNzJ9Oworc3RhdGljIGZsb2F0IE4wNTFbM10gPSB7MC40ODg4MzUgLC0wLjg3MTk1MCAsLTAuMDI3MjYxfTsKK3N0YXRpYyBmbG9hdCBOMDUyWzNdID0gezAuOTAyNTk5ICwtMC40MjEzOTcgLDAuMDg3OTY5fTsKK3N0YXRpYyBmbG9hdCBOMDUzWzNdID0gezAuOTM4NjM2ICwwLjMyMjYwNiAsMC4xMjIwMjB9Oworc3RhdGljIGZsb2F0IE4wNTRbM10gPSB7MC40ODQ2MDUgLDAuODcxMDc4ICwwLjA3OTg3OH07CitzdGF0aWMgZmxvYXQgTjA1NVszXSA9IHstMC4zNTM2MDcgLDAuOTMxNTU5ICwwLjA4NDYxOX07CitzdGF0aWMgZmxvYXQgTjA1NlszXSA9IHstMC44Njc3NTkgLDAuNDc4NTY0ICwwLjEzNDA1NH07CitzdGF0aWMgZmxvYXQgTjA1N1szXSA9IHstMC45NTE1ODMgLC0wLjI5NjAzMCAsMC4wODI3OTR9Oworc3RhdGljIGZsb2F0IE4wNThbM10gPSB7LTAuNjcyMzU1ICwtMC43MzAyMDkgLDAuMTIxMzg0fTsKK3N0YXRpYyBmbG9hdCBOMDU5WzNdID0gezAuNTI4MzM2ICwtMC44NDI0NTIgLDAuMTA1NTI1fTsKK3N0YXRpYyBmbG9hdCBOMDYwWzNdID0gezAuNzg2OTEzICwtMC41NjQ3NjAgLDAuMjQ4NjI3fTsKK3N0YXRpYyBmbG9hdCBOMDYyWzNdID0gezAuNjIyMDk4ICwwLjc2NTIzMCAsMC4xNjU1ODR9Oworc3RhdGljIGZsb2F0IE4wNjNbM10gPSB7LTAuNjMxNzExICwwLjc2NzgxNiAsMC4xMDY3NzN9Oworc3RhdGljIGZsb2F0IE4wNjRbM10gPSB7LTAuNjg3ODg2ICwwLjYwNjM1MSAsMC4zOTg5Mzh9Oworc3RhdGljIGZsb2F0IE4wNjVbM10gPSB7LTAuOTQ2MzI3ICwtMC4yODE2MjMgLDAuMTU4NTk4fTsKK3N0YXRpYyBmbG9hdCBOMDY2WzNdID0gey0wLjUwOTU0OSAsLTAuODYwNDM3ICwwLjAwMjc3Nn07CitzdGF0aWMgZmxvYXQgTjA2N1szXSA9IHswLjQ2MjU5NCAsLTAuODc2NjkyICwwLjEzMTk3N307CitzdGF0aWMgZmxvYXQgTjA3MVszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDc3WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDc4WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDc5WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDgwWzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDgxWzNdID0gey0wLjU3MTE5NyAsMC44MTYxNzMgLDAuMDg3MTUyfTsKK3N0YXRpYyBmbG9hdCBOMDgyWzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDgzWzNdID0gey0wLjU3MTE5NyAsMC44MTYxNzMgLDAuMDg3MTUyfTsKK3N0YXRpYyBmbG9hdCBOMDg0WzNdID0gey0wLjU3MTE5NyAsMC44MTYxNzMgLDAuMDg3MTUyfTsKK3N0YXRpYyBmbG9hdCBOMDg1WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDg2WzNdID0gey0wLjU3MTE5NyAsMC44MTYxNzMgLDAuMDg3MTUyfTsKK3N0YXRpYyBmbG9hdCBOMDg3WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDg4WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDg5WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDkwWzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDkxWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTJbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5M1szXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDk0WzNdID0gezEuMDAwMDAwICwwLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTVbM10gPSB7LTEuMDAwMDAwICwwLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTdbM10gPSB7LTAuNjk3Mjk2ICwwLjcwMjg4MSAsMC4xNDA0OTF9Oworc3RhdGljIGZsb2F0IE4wOThbM10gPSB7MC45MTg4NjQgLDAuMzQwODIxICwwLjE5ODgxOX07CitzdGF0aWMgZmxvYXQgTjA5OVszXSA9IHstMC45MzI3MzcgLDAuMjAxMTk1ICwwLjI5OTIwMn07CitzdGF0aWMgZmxvYXQgTjEwMFszXSA9IHswLjAyOTUxNyAsMC45ODE2NzkgLDAuMTg4MjQ0fTsKK3N0YXRpYyBmbG9hdCBOMTAyWzNdID0gezAuODEzNTIxICwtMC4yMDQ5MzYgLDAuNTQ0MjI5fTsKK3N0YXRpYyBmbG9hdCBOMTEwWzNdID0gey0wLjc4MTQ4MCAsLTAuMzg0Nzc5ICwwLjQ5MTE1NX07CitzdGF0aWMgZmxvYXQgTjExMVszXSA9IHstMC43MjIyNDMgLDAuMzg0OTI3ICwwLjU3NDYyN307CitzdGF0aWMgZmxvYXQgTjExMlszXSA9IHstMC43NTIyNzggLDAuNTAyNjc5ICwwLjQyNTkwMX07CitzdGF0aWMgZmxvYXQgTjExM1szXSA9IHswLjU0NzI1NyAsMC4zNjc5MTAgLDAuNzUxNzY2fTsKK3N0YXRpYyBmbG9hdCBOMTE0WzNdID0gezAuNzI1OTQ5ICwtMC4yMzI1NjggLDAuNjQ3MjMzfTsKK3N0YXRpYyBmbG9hdCBOMTE1WzNdID0gey0wLjc0NzE4MiAsLTAuNjYwNzg2ICwwLjA3MTI4MH07CitzdGF0aWMgZmxvYXQgTjExNlszXSA9IHswLjkzMTUxOSAsMC4yMDA3NDggLDAuMzAzMjcwfTsKK3N0YXRpYyBmbG9hdCBOMTE3WzNdID0gey0wLjgyODkyOCAsMC4zMTM3NTcgLDAuNDYzMDcxfTsKK3N0YXRpYyBmbG9hdCBOMTE4WzNdID0gezAuOTAyNTU0ICwtMC4zNzA5NjcgLDAuMjE4NTg3fTsKK3N0YXRpYyBmbG9hdCBOMTE5WzNdID0gey0wLjg3OTI1NyAsLTAuNDQxODUxICwwLjE3Nzk3M307CitzdGF0aWMgZmxvYXQgTjEyMFszXSA9IHswLjY0MjMyNyAsMC42MTE5MDEgLDAuNDYxNTEyfTsKK3N0YXRpYyBmbG9hdCBOMTIxWzNdID0gezAuOTY0ODE3ICwtMC4yMDIzMjIgLDAuMTY3OTEwfTsKK3N0YXRpYyBmbG9hdCBOMTIyWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IFAwMDFbM10gPSB7NS42OCwgLTMwMC45NSwgMTMyNC43MH07CitzdGF0aWMgZmxvYXQgUDAwMlszXSA9IHszMzguNjksIC0yMTkuNjMsIDk2NzcuMDN9Oworc3RhdGljIGZsb2F0IFAwMDNbM10gPSB7MTIuMTgsIDQ3NC41OSwgOTEzOC4xNH07CitzdGF0aWMgZmxvYXQgUDAwNVszXSA9IHs0ODcuNTEsIDE5OC4wNSwgOTM1MC43OH07CitzdGF0aWMgZmxvYXQgUDAwNlszXSA9IHstNDU3LjYxLCA2OC43NCwgOTQyNy44NX07CitzdGF0aWMgZmxvYXQgUDAwN1szXSA9IHsxNTYuNTIsIC0yNjYuNzIsIDEwMzExLjY4fTsKK3N0YXRpYyBmbG9hdCBQMDA4WzNdID0gey0xODUuNTYsIC0yNjYuNTEsIDEwMzEwLjQ3fTsKK3N0YXRpYyBmbG9hdCBQMDA5WzNdID0gezEyNC4zOSwgLTI2MS40NiwgMTk0Mi4zNH07CitzdGF0aWMgZmxvYXQgUDAxMFszXSA9IHstMTMwLjA1LCAtMjYxLjQ2LCAxOTQ2LjAzfTsKK3N0YXRpYyBmbG9hdCBQMDExWzNdID0gezE0MS4wNywgLTMyMC4xMSwgMTIzOS4zOH07CitzdGF0aWMgZmxvYXQgUDAxMlszXSA9IHsxNTYuNDgsIC0zNjAuMTIsIDIwNzMuNDF9Oworc3RhdGljIGZsb2F0IFAwMTNbM10gPSB7MTYyLjAwLCAtMTc1Ljg4LCAyMDY0LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDE0WzNdID0gezg4LjE2LCAtODcuNzIsIDIwNjQuMDJ9Oworc3RhdGljIGZsb2F0IFAwMTVbM10gPSB7LTY1LjIxLCAtOTYuMTMsIDIwNjQuMDJ9Oworc3RhdGljIGZsb2F0IFAwMTZbM10gPSB7LTE1Ni40OCwgLTE4MC45NiwgMjA2NC40NH07CitzdGF0aWMgZmxvYXQgUDAxN1szXSA9IHstMTYyLjAwLCAtMzY4LjkzLCAyMDgyLjM5fTsKK3N0YXRpYyBmbG9hdCBQMDE4WzNdID0gey04OC4xNiwgLTQzOS4yMiwgMjA4Mi4zOX07CitzdGF0aWMgZmxvYXQgUDAxOVszXSA9IHs2NS4yMSwgLTQ0MC4zMiwgMjA4My4zOX07CitzdGF0aWMgZmxvYXQgUDAyMFszXSA9IHsyNDYuODcsIC0zNTYuMDIsIDI1NzYuOTV9Oworc3RhdGljIGZsb2F0IFAwMjFbM10gPSB7MjUzLjE3LCAtMTExLjE1LCAyNTY3LjE1fTsKK3N0YXRpYyBmbG9hdCBQMDIyWzNdID0gezEzMi4zNCwgNTEuNDEsIDI1NTkuODR9Oworc3RhdGljIGZsb2F0IFAwMjNbM10gPSB7LTk3Ljg4LCA0MC40NCwgMjU2Ny4xNX07CitzdGF0aWMgZmxvYXQgUDAyNFszXSA9IHstMjIyLjk3LCAtMTE3LjQ5LCAyNTY3LjE1fTsKK3N0YXRpYyBmbG9hdCBQMDI1WzNdID0gey0yNTIuMjIsIC0zNzEuNTMsIDI1NjkuOTJ9Oworc3RhdGljIGZsb2F0IFAwMjZbM10gPSB7LTEwOC40NCwgLTUxOC4xOSwgMjU4Ni43NX07CitzdGF0aWMgZmxvYXQgUDAyN1szXSA9IHs5Ny44OCwgLTUyNC43OSwgMjU4Ni43NX07CitzdGF0aWMgZmxvYXQgUDAyOFszXSA9IHszNzAuMDMsIC00MjEuMTksIDM0MTkuNzB9Oworc3RhdGljIGZsb2F0IFAwMjlbM10gPSB7MzUxLjE1LCAtMTYuOTgsIDM0MjMuMTd9Oworc3RhdGljIGZsb2F0IFAwMzBbM10gPSB7MjAwLjY2LCAyNDguNDYsIDM0MzAuMzd9Oworc3RhdGljIGZsb2F0IFAwMzFbM10gPSB7LTE0OC40MiwgMjM1LjAyLCAzNDE3LjkxfTsKK3N0YXRpYyBmbG9hdCBQMDMyWzNdID0gey0zNjAuMjEsIC0zMC4yNywgMzQxNi44NH07CitzdGF0aWMgZmxvYXQgUDAzM1szXSA9IHstMzU3LjkwLCAtNDE0Ljg5LCAzNDA3LjA0fTsKK3N0YXRpYyBmbG9hdCBQMDM0WzNdID0gey0xNDguODgsIC02MzEuMzUsIDM0MDkuOTB9Oworc3RhdGljIGZsb2F0IFAwMzVbM10gPSB7MTU2LjM4LCAtNjMyLjU5LCAzNDE5LjcwfTsKK3N0YXRpYyBmbG9hdCBQMDM2WzNdID0gezQ2Mi42MSwgLTQ2OS4yMSwgNDQzMS41MX07CitzdGF0aWMgZmxvYXQgUDAzN1szXSA9IHs0NjYuNjAsIDEwMi4yNSwgNDQzNC45OH07CitzdGF0aWMgZmxvYXQgUDAzOFszXSA9IHsyNDMuMDUsIDQ3NC4zNCwgNDU2Mi4wMn07CitzdGF0aWMgZmxvYXQgUDAzOVszXSA9IHstMTkxLjIzLCA0NzQuNDAsIDQ1NTQuNDJ9Oworc3RhdGljIGZsb2F0IFAwNDBbM10gPSB7LTQ3Ni4xMiwgMTExLjA1LCA0NDUxLjExfTsKK3N0YXRpYyBmbG9hdCBQMDQxWzNdID0gey00NzMuMzYsIC00NzAuNzQsIDQ0NDQuNzh9Oworc3RhdGljIGZsb2F0IFAwNDJbM10gPSB7LTI2Ni45NSwgLTc0OC40MSwgNDQ0Ny43OH07CitzdGF0aWMgZmxvYXQgUDA0M1szXSA9IHsyMTEuMTQsIC03NDkuOTEsIDQ0MjkuNzN9Oworc3RhdGljIGZsb2F0IFAwNDRbM10gPSB7NjgwLjU3LCAtMzcwLjI3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDQ1WzNdID0gezgzNC4wMSwgMzYzLjA5LCA2MzYwLjYzfTsKK3N0YXRpYyBmbG9hdCBQMDQ2WzNdID0gezM3MS4yOSwgODA0LjUxLCA2NDg2LjI2fTsKK3N0YXRpYyBmbG9hdCBQMDQ3WzNdID0gey0yOTEuNDMsIDc5Ny4yMiwgNjQ5NC4yOH07CitzdGF0aWMgZmxvYXQgUDA0OFszXSA9IHstNzg0LjEzLCAzNzAuNzUsIDYzNzguMDF9Oworc3RhdGljIGZsb2F0IFAwNDlbM10gPSB7LTc0My4yOSwgLTMyNS44MiwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgUDA1MFszXSA9IHstMzgzLjI0LCAtODA0Ljc3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDUxWzNdID0gezI4My40NywgLTg0Ni4wOSwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwMDFbM10gPSB7NS42OCwgLTMwMC45NSwgMTMyNC43MH07CitzdGF0aWMgZmxvYXQgaVAwMDlbM10gPSB7MTI0LjM5LCAtMjYxLjQ2LCAxOTQyLjM0fTsKK3N0YXRpYyBmbG9hdCBpUDAxMFszXSA9IHstMTMwLjA1LCAtMjYxLjQ2LCAxOTQ2LjAzfTsKK3N0YXRpYyBmbG9hdCBpUDAxMVszXSA9IHsxNDEuMDcsIC0zMjAuMTEsIDEyMzkuMzh9Oworc3RhdGljIGZsb2F0IGlQMDEyWzNdID0gezE1Ni40OCwgLTM2MC4xMiwgMjA3My40MX07CitzdGF0aWMgZmxvYXQgaVAwMTNbM10gPSB7MTYyLjAwLCAtMTc1Ljg4LCAyMDY0LjQ0fTsKK3N0YXRpYyBmbG9hdCBpUDAxNFszXSA9IHs4OC4xNiwgLTg3LjcyLCAyMDY0LjAyfTsKK3N0YXRpYyBmbG9hdCBpUDAxNVszXSA9IHstNjUuMjEsIC05Ni4xMywgMjA2NC4wMn07CitzdGF0aWMgZmxvYXQgaVAwMTZbM10gPSB7LTE1Ni40OCwgLTE4MC45NiwgMjA2NC40NH07CitzdGF0aWMgZmxvYXQgaVAwMTdbM10gPSB7LTE2Mi4wMCwgLTM2OC45MywgMjA4Mi4zOX07CitzdGF0aWMgZmxvYXQgaVAwMThbM10gPSB7LTg4LjE2LCAtNDM5LjIyLCAyMDgyLjM5fTsKK3N0YXRpYyBmbG9hdCBpUDAxOVszXSA9IHs2NS4yMSwgLTQ0MC4zMiwgMjA4My4zOX07CitzdGF0aWMgZmxvYXQgaVAwMjBbM10gPSB7MjQ2Ljg3LCAtMzU2LjAyLCAyNTc2Ljk1fTsKK3N0YXRpYyBmbG9hdCBpUDAyMVszXSA9IHsyNTMuMTcsIC0xMTEuMTUsIDI1NjcuMTV9Oworc3RhdGljIGZsb2F0IGlQMDIyWzNdID0gezEzMi4zNCwgNTEuNDEsIDI1NTkuODR9Oworc3RhdGljIGZsb2F0IGlQMDIzWzNdID0gey05Ny44OCwgNDAuNDQsIDI1NjcuMTV9Oworc3RhdGljIGZsb2F0IGlQMDI0WzNdID0gey0yMjIuOTcsIC0xMTcuNDksIDI1NjcuMTV9Oworc3RhdGljIGZsb2F0IGlQMDI1WzNdID0gey0yNTIuMjIsIC0zNzEuNTMsIDI1NjkuOTJ9Oworc3RhdGljIGZsb2F0IGlQMDI2WzNdID0gey0xMDguNDQsIC01MTguMTksIDI1ODYuNzV9Oworc3RhdGljIGZsb2F0IGlQMDI3WzNdID0gezk3Ljg4LCAtNTI0Ljc5LCAyNTg2Ljc1fTsKK3N0YXRpYyBmbG9hdCBpUDAyOFszXSA9IHszNzAuMDMsIC00MjEuMTksIDM0MTkuNzB9Oworc3RhdGljIGZsb2F0IGlQMDI5WzNdID0gezM1MS4xNSwgLTE2Ljk4LCAzNDIzLjE3fTsKK3N0YXRpYyBmbG9hdCBpUDAzMFszXSA9IHsyMDAuNjYsIDI0OC40NiwgMzQzMC4zN307CitzdGF0aWMgZmxvYXQgaVAwMzFbM10gPSB7LTE0OC40MiwgMjM1LjAyLCAzNDE3LjkxfTsKK3N0YXRpYyBmbG9hdCBpUDAzMlszXSA9IHstMzYwLjIxLCAtMzAuMjcsIDM0MTYuODR9Oworc3RhdGljIGZsb2F0IGlQMDMzWzNdID0gey0zNTcuOTAsIC00MTQuODksIDM0MDcuMDR9Oworc3RhdGljIGZsb2F0IGlQMDM0WzNdID0gey0xNDguODgsIC02MzEuMzUsIDM0MDkuOTB9Oworc3RhdGljIGZsb2F0IGlQMDM1WzNdID0gezE1Ni4zOCwgLTYzMi41OSwgMzQxOS43MH07CitzdGF0aWMgZmxvYXQgaVAwMzZbM10gPSB7NDYyLjYxLCAtNDY5LjIxLCA0NDMxLjUxfTsKK3N0YXRpYyBmbG9hdCBpUDAzN1szXSA9IHs0NjYuNjAsIDEwMi4yNSwgNDQzNC45OH07CitzdGF0aWMgZmxvYXQgaVAwMzhbM10gPSB7MjQzLjA1LCA0NzQuMzQsIDQ1NjIuMDJ9Oworc3RhdGljIGZsb2F0IGlQMDM5WzNdID0gey0xOTEuMjMsIDQ3NC40MCwgNDU1NC40Mn07CitzdGF0aWMgZmxvYXQgaVAwNDBbM10gPSB7LTQ3Ni4xMiwgMTExLjA1LCA0NDUxLjExfTsKK3N0YXRpYyBmbG9hdCBpUDA0MVszXSA9IHstNDczLjM2LCAtNDcwLjc0LCA0NDQ0Ljc4fTsKK3N0YXRpYyBmbG9hdCBpUDA0MlszXSA9IHstMjY2Ljk1LCAtNzQ4LjQxLCA0NDQ3Ljc4fTsKK3N0YXRpYyBmbG9hdCBpUDA0M1szXSA9IHsyMTEuMTQsIC03NDkuOTEsIDQ0MjkuNzN9Oworc3RhdGljIGZsb2F0IGlQMDQ0WzNdID0gezY4MC41NywgLTM3MC4yNywgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNDVbM10gPSB7ODM0LjAxLCAzNjMuMDksIDYzNjAuNjN9Oworc3RhdGljIGZsb2F0IGlQMDQ2WzNdID0gezM3MS4yOSwgODA0LjUxLCA2NDg2LjI2fTsKK3N0YXRpYyBmbG9hdCBpUDA0N1szXSA9IHstMjkxLjQzLCA3OTcuMjIsIDY0OTQuMjh9Oworc3RhdGljIGZsb2F0IGlQMDQ4WzNdID0gey03ODQuMTMsIDM3MC43NSwgNjM3OC4wMX07CitzdGF0aWMgZmxvYXQgaVAwNDlbM10gPSB7LTc0My4yOSwgLTMyNS44MiwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNTBbM10gPSB7LTM4My4yNCwgLTgwNC43NywgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNTFbM10gPSB7MjgzLjQ3LCAtODQ2LjA5LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDUyWzNdID0gezU5OS4wOSwgLTMwMC4xNSwgNzg5NC4wM307CitzdGF0aWMgZmxvYXQgUDA1M1szXSA9IHs3MzUuNDgsIDMwNi4yNiwgNzkxMS45Mn07CitzdGF0aWMgZmxvYXQgUDA1NFszXSA9IHsyNDYuMjIsIDU1OC41MywgODQ2MC41MH07CitzdGF0aWMgZmxvYXQgUDA1NVszXSA9IHstMjMwLjQxLCA1NTkuODQsIDg0NzMuMjN9Oworc3RhdGljIGZsb2F0IFAwNTZbM10gPSB7LTY5OC42NiwgMzIwLjgzLCA3OTAyLjU5fTsKK3N0YXRpYyBmbG9hdCBQMDU3WzNdID0gey02NDMuMjksIC0yOTkuMTYsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNThbM10gPSB7LTM0MS40NywgLTcxOS4zMCwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1OVszXSA9IHsyNTIuNTcsIC03NTYuMTIsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNjBbM10gPSB7NDU4LjM5LCAtMjY1LjMxLCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDYyWzNdID0gezIyNC4wNCwgMzM4Ljc1LCA5NDUwLjMwfTsKK3N0YXRpYyBmbG9hdCBQMDYzWzNdID0gey0xNjUuNzEsIDM0MS4wNCwgOTQ2Mi4zNX07CitzdGF0aWMgZmxvYXQgUDA2NFszXSA9IHstMjk4LjExLCAxMTAuMTMsIDEwMTgwLjM3fTsKK3N0YXRpYyBmbG9hdCBQMDY1WzNdID0gey00NzMuOTksIC0yMTkuNzEsIDkzNTUuNDR9Oworc3RhdGljIGZsb2F0IFAwNjZbM10gPSB7LTIxMS45NywgLTQ3OS44NywgOTM1NS40NH07CitzdGF0aWMgZmxvYXQgUDA2N1szXSA9IHsxOTIuODYsIC00OTEuNDUsIDkzNDguNzN9Oworc3RhdGljIGZsb2F0IFAwNjhbM10gPSB7LTEzNi4yOSwgLTMxOS44NCwgMTIyOC43M307CitzdGF0aWMgZmxvYXQgUDA2OVszXSA9IHsxMTExLjE3LCAtMzE0LjE0LCAxMzE0LjE5fTsKK3N0YXRpYyBmbG9hdCBQMDcwWzNdID0gey0xMTY3LjM0LCAtMzIxLjYxLCAxMzE5LjQ1fTsKK3N0YXRpYyBmbG9hdCBQMDcxWzNdID0gezE0MDQuODYsIC0zMDYuNjYsIDEyMzUuNDV9Oworc3RhdGljIGZsb2F0IFAwNzJbM10gPSB7LTE0MDkuNzMsIC0zMTQuMTQsIDEyNDcuNjZ9Oworc3RhdGljIGZsb2F0IFAwNzNbM10gPSB7MTI1NC4wMSwgLTI5Ni44NywgMTU0NC41OH07CitzdGF0aWMgZmxvYXQgUDA3NFszXSA9IHstMTI2Mi4wOSwgLTI5MS43MCwgMTUwNC4yNn07CitzdGF0aWMgZmxvYXQgUDA3NVszXSA9IHs5NjUuNzEsIC0yNjkuMjYsIDE3NDIuNjV9Oworc3RhdGljIGZsb2F0IFAwNzZbM10gPSB7LTkwMC45NywgLTI3Ni43NCwgMTcyNi4wN307CitzdGF0aWMgZmxvYXQgaVAwNjhbM10gPSB7LTEzNi4yOSwgLTMxOS44NCwgMTIyOC43M307CitzdGF0aWMgZmxvYXQgaVAwNjlbM10gPSB7MTExMS4xNywgLTMxNC4xNCwgMTMxNC4xOX07CitzdGF0aWMgZmxvYXQgaVAwNzBbM10gPSB7LTExNjcuMzQsIC0zMjEuNjEsIDEzMTkuNDV9Oworc3RhdGljIGZsb2F0IGlQMDcxWzNdID0gezE0MDQuODYsIC0zMDYuNjYsIDEyMzUuNDV9Oworc3RhdGljIGZsb2F0IGlQMDcyWzNdID0gey0xNDA5LjczLCAtMzE0LjE0LCAxMjQ3LjY2fTsKK3N0YXRpYyBmbG9hdCBpUDA3M1szXSA9IHsxMjU0LjAxLCAtMjk2Ljg3LCAxNTQ0LjU4fTsKK3N0YXRpYyBmbG9hdCBpUDA3NFszXSA9IHstMTI2Mi4wOSwgLTI5MS43MCwgMTUwNC4yNn07CitzdGF0aWMgZmxvYXQgaVAwNzVbM10gPSB7OTY1LjcxLCAtMjY5LjI2LCAxNzQyLjY1fTsKK3N0YXRpYyBmbG9hdCBpUDA3NlszXSA9IHstOTAwLjk3LCAtMjc2Ljc0LCAxNzI2LjA3fTsKK3N0YXRpYyBmbG9hdCBQMDc3WzNdID0gezEwNTguMDAsIC00NDguODEsIDgxOTQuNjZ9Oworc3RhdGljIGZsb2F0IFAwNzhbM10gPSB7LTEwMTYuNTEsIC00NTYuNDMsIDgxOTAuNjJ9Oworc3RhdGljIGZsb2F0IFAwNzlbM10gPSB7LTE1MTUuOTYsIC02NzYuNDUsIDc3NTQuOTN9Oworc3RhdGljIGZsb2F0IFAwODBbM10gPSB7MTg1Ni43NSwgLTgzMC4zNCwgNzI5Ni41Nn07CitzdGF0aWMgZmxvYXQgUDA4MVszXSA9IHsxNDcyLjE2LCAtNDk3LjM4LCA3Mzk5LjY4fTsKK3N0YXRpYyBmbG9hdCBQMDgyWzNdID0gey0xNzc1LjI2LCAtODI5LjUxLCA3Mjk4LjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDgzWzNdID0gezkxMS4wOSwgLTI1Mi41MSwgNzUxMC45OX07CitzdGF0aWMgZmxvYXQgUDA4NFszXSA9IHstMTQ1MS45NCwgLTQ5NS42MiwgNzM4NC4zMH07CitzdGF0aWMgZmxvYXQgUDA4NVszXSA9IHsxNTk4Ljc1LCAtNjY5LjI2LCA3NzY5LjkwfTsKK3N0YXRpYyBmbG9hdCBQMDg2WzNdID0gey04MzYuNTMsIC0yNTAuMDgsIDc0NjMuMjV9Oworc3RhdGljIGZsb2F0IFAwODdbM10gPSB7NzIyLjg3LCAtMTU4LjE4LCA4MDA2LjQxfTsKK3N0YXRpYyBmbG9hdCBQMDg4WzNdID0gey02ODguODYsIC0xNjIuMjgsIDc5OTMuODl9Oworc3RhdGljIGZsb2F0IFAwODlbM10gPSB7LTYyNi45MiwgLTE4NS4zMCwgODM2NC45OH07CitzdGF0aWMgZmxvYXQgUDA5MFszXSA9IHs2NDcuNzIsIC0xODkuNDYsIDgzNTQuOTl9Oworc3RhdGljIGZsb2F0IFAwOTFbM10gPSB7MC4wMCwgODM1LjAxLCA1NTU1LjYyfTsKK3N0YXRpYyBmbG9hdCBQMDkyWzNdID0gezAuMDAsIDEzNTAuMTgsIDUyMjAuODZ9Oworc3RhdGljIGZsb2F0IFAwOTNbM10gPSB7MC4wMCwgMTQyMi45NCwgNTI4NS4yN307CitzdGF0aWMgZmxvYXQgUDA5NFszXSA9IHswLjAwLCAxMjk2Ljc1LCA1NjUwLjE5fTsKK3N0YXRpYyBmbG9hdCBQMDk1WzNdID0gezAuMDAsIDc5NS42MywgNjQ5My44OH07CitzdGF0aWMgZmxvYXQgaVAwOTFbM10gPSB7MC4wMCwgODM1LjAxLCA1NTU1LjYyfTsKK3N0YXRpYyBmbG9hdCBpUDA5MlszXSA9IHswLjAwLCAxMzUwLjE4LCA1MjIwLjg2fTsKK3N0YXRpYyBmbG9hdCBpUDA5M1szXSA9IHswLjAwLCAxNDIyLjk0LCA1Mjg1LjI3fTsKK3N0YXRpYyBmbG9hdCBpUDA5NFszXSA9IHswLjAwLCAxMjk2Ljc1LCA1NjUwLjE5fTsKK3N0YXRpYyBmbG9hdCBpUDA5NVszXSA9IHswLjAwLCA3OTUuNjMsIDY0OTMuODh9Oworc3RhdGljIGZsb2F0IFAwOTdbM10gPSB7LTE5NC45MSwgLTM1Ny4xNCwgMTAzMTMuMzJ9Oworc3RhdGljIGZsb2F0IFAwOThbM10gPSB7MTM1LjM1LCAtMzU3LjY2LCAxMDMwNy45NH07CitzdGF0aWMgZmxvYXQgaVAwOTdbM10gPSB7LTE5NC45MSwgLTM1Ny4xNCwgMTAzMTMuMzJ9Oworc3RhdGljIGZsb2F0IGlQMDk4WzNdID0gezEzNS4zNSwgLTM1Ny42NiwgMTAzMDcuOTR9Oworc3RhdGljIGZsb2F0IFAwOTlbM10gPSB7LTM4MC41MywgLTIyMS4xNCwgOTY3Ny45OH07CitzdGF0aWMgZmxvYXQgUDEwMFszXSA9IHswLjAwLCA0MTIuOTksIDk2MjkuMzN9Oworc3RhdGljIGZsb2F0IFAxMDJbM10gPSB7NTkuNTEsIC00MTIuNTUsIDEwNjc3LjU4fTsKK3N0YXRpYyBmbG9hdCBpUDEwMlszXSA9IHs1OS41MSwgLTQxMi41NSwgMTA2NzcuNTh9Oworc3RhdGljIGZsb2F0IFAxMDNbM10gPSB7Ni41MCwgNDg0Ljc0LCA5MDA5Ljk0fTsKK3N0YXRpYyBmbG9hdCBQMTA1WzNdID0gey00MS44NiwgNDc2LjUxLCA5MDc4LjE3fTsKK3N0YXRpYyBmbG9hdCBQMTA4WzNdID0gezQ5LjIwLCA0NzYuODMsIDkwNzguMjR9Oworc3RhdGljIGZsb2F0IFAxMTBbM10gPSB7LTE4Ny42MiwgLTQxMC4wNCwgMTA2NzQuMTJ9Oworc3RhdGljIGZsb2F0IGlQMTEwWzNdID0gey0xODcuNjIsIC00MTAuMDQsIDEwNjc0LjEyfTsKK3N0YXRpYyBmbG9hdCBQMTExWzNdID0gey0xODQuMjUsIC0zMTguNzAsIDEwNzIzLjg4fTsKK3N0YXRpYyBmbG9hdCBpUDExMVszXSA9IHstMTg0LjI1LCAtMzE4LjcwLCAxMDcyMy44OH07CitzdGF0aWMgZmxvYXQgUDExMlszXSA9IHstMTc5LjYxLCAtMTQyLjgxLCAxMDY3MC4yNn07CitzdGF0aWMgZmxvYXQgUDExM1szXSA9IHs1Ny40MywgLTE0Ny45NCwgMTA2NzUuMjZ9Oworc3RhdGljIGZsb2F0IFAxMTRbM10gPSB7NTQuMDYsIC0yMTguOTAsIDEwNzEyLjQ0fTsKK3N0YXRpYyBmbG9hdCBQMTE1WzNdID0gey0xODYuMzUsIC0yMTIuMDksIDEwNzEzLjc2fTsKK3N0YXRpYyBmbG9hdCBQMTE2WzNdID0gezIwNS45MCwgLTg0LjYxLCAxMDI3NS45N307CitzdGF0aWMgZmxvYXQgUDExN1szXSA9IHstMjMwLjk2LCAtODMuMjYsIDEwMjgwLjA5fTsKK3N0YXRpYyBmbG9hdCBpUDExOFszXSA9IHsyMTYuNzgsIC01MDkuMTcsIDEwMDk4Ljk0fTsKK3N0YXRpYyBmbG9hdCBpUDExOVszXSA9IHstMzEzLjIxLCAtNTEwLjc5LCAxMDEwMi42Mn07CitzdGF0aWMgZmxvYXQgUDExOFszXSA9IHsyMTYuNzgsIC01MDkuMTcsIDEwMDk4Ljk0fTsKK3N0YXRpYyBmbG9hdCBQMTE5WzNdID0gey0zMTMuMjEsIC01MTAuNzksIDEwMTAyLjYyfTsKK3N0YXRpYyBmbG9hdCBQMTIwWzNdID0gezIxNy45NSwgOTYuMzQsIDEwMTYxLjYyfTsKK3N0YXRpYyBmbG9hdCBQMTIxWzNdID0gezcxLjk5LCAtMzE5Ljc0LCAxMDcxNy43MH07CitzdGF0aWMgZmxvYXQgaVAxMjFbM10gPSB7NzEuOTksIC0zMTkuNzQsIDEwNzE3LjcwfTsKK3N0YXRpYyBmbG9hdCBQMTIyWzNdID0gezAuMDAsIDYwMi43NCwgNTM3NS44NH07CitzdGF0aWMgZmxvYXQgaVAxMjJbM10gPSB7MC4wMCwgNjAyLjc0LCA1Mzc1Ljg0fTsKK3N0YXRpYyBmbG9hdCBQMTIzWzNdID0gey00NDguOTQsIC0yMDMuMTQsIDk0OTkuNjB9Oworc3RhdGljIGZsb2F0IFAxMjRbM10gPSB7LTQ0Mi42NCwgLTE4NS4yMCwgOTUyOC4wN307CitzdGF0aWMgZmxvYXQgUDEyNVszXSA9IHstNDQxLjA3LCAtMTQ4LjA1LCA5NTI4LjA3fTsKK3N0YXRpYyBmbG9hdCBQMTI2WzNdID0gey00NDMuNDMsIC0xMjguODQsIDk0OTkuNjB9Oworc3RhdGljIGZsb2F0IFAxMjdbM10gPSB7LTQ1Ni44NywgLTE0Ni43OCwgOTQ2Ni42N307CitzdGF0aWMgZmxvYXQgUDEyOFszXSA9IHstNDUzLjY4LCAtMTgzLjkzLCA5NDY2LjY3fTsKK3N0YXRpYyBmbG9hdCBQMTI5WzNdID0gezQyOC40MywgLTEyNC4wOCwgOTUwMy4wM307CitzdGF0aWMgZmxvYXQgUDEzMFszXSA9IHs0MTkuNzMsIC0xNDIuMTQsIDk1MzQuNTZ9Oworc3RhdGljIGZsb2F0IFAxMzFbM10gPSB7NDE5LjkyLCAtMTc5Ljk2LCA5NTM0LjU2fTsKK3N0YXRpYyBmbG9hdCBQMTMyWzNdID0gezQzMS4yMCwgLTE5OS43MywgOTUwNS4yNn07CitzdGF0aWMgZmxvYXQgUDEzM1szXSA9IHs0NDIuMjgsIC0xODEuNjcsIDk0NzUuOTZ9Oworc3RhdGljIGZsb2F0IFAxMzRbM10gPSB7NDQyLjA4LCAtMTQzLjg0LCA5NDc1Ljk2fTsKKy8qICpJTkRFTlQtT04qICovCisKK3ZvaWQKK0RvbHBoaW4wMDEodm9pZCkKK3sKKyAgICBnbE5vcm1hbDNmdihOMDcxKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcyKTsKKyAgICBnbFZlcnRleDNmdihQMDc0KTsKKyAgICBnbEVuZCgpOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzQpOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDIodm9pZCkKK3sKKyAgICBnbE5vcm1hbDNmdihOMDcxKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDcxKTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDczKTsKKyAgICBnbEVuZCgpOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNzEpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDModm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDA0KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE3KTsKKyAgICBnbFZlcnRleDNmdihQMDE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAwNSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDYodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTIpOworICAgIGdsVmVydGV4M2Z2KFAwOTIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTMpOworICAgIGdsVmVydGV4M2Z2KFAwOTMpOworICAgIGdsTm9ybWFsM2Z2KE4wOTQpOworICAgIGdsVmVydGV4M2Z2KFAwOTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDkzKTsKKyAgICBnbFZlcnRleDNmdihQMDkzKTsKKyAgICBnbE5vcm1hbDNmdihOMDkyKTsKKyAgICBnbFZlcnRleDNmdihQMDkyKTsKKyAgICBnbE5vcm1hbDNmdihOMDk0KTsKKyAgICBnbFZlcnRleDNmdihQMDk0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA5MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTEpOworICAgIGdsVmVydGV4M2Z2KFAwOTEpOworICAgIGdsTm9ybWFsM2Z2KE4wOTIpOworICAgIGdsVmVydGV4M2Z2KFAwOTIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTQpOworICAgIGdsVmVydGV4M2Z2KFAwOTQpOworICAgIGdsTm9ybWFsM2Z2KE4wOTUpOworICAgIGdsVmVydGV4M2Z2KFAwOTUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTIyKTsKKyAgICBnbFZlcnRleDNmdihQMTIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDk1KTsKKyAgICBnbFZlcnRleDNmdihQMDk1KTsKKyAgICBnbE5vcm1hbDNmdihOMDkxKTsKKyAgICBnbFZlcnRleDNmdihQMDkxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjEyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMik7CisgICAgZ2xOb3JtYWwzZnYoTjA5MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAwNyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDM0KTsKKyAgICBnbFZlcnRleDNmdihQMDM0KTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDgodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDA5KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wNTIpOworICAgIGdsVmVydGV4M2Z2KFAwNTIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDU3KTsKKyAgICBnbFZlcnRleDNmdihQMDU3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAxMCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODEpOworICAgIGdsVmVydGV4M2Z2KFAwODEpOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsTm9ybWFsM2Z2KE4wODcpOworICAgIGdsVmVydGV4M2Z2KFAwODcpOworICAgIGdsTm9ybWFsM2Z2KE4wOTApOworICAgIGdsVmVydGV4M2Z2KFAwOTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgxKTsKKyAgICBnbFZlcnRleDNmdihQMDgxKTsKKyAgICBnbE5vcm1hbDNmdihOMDgwKTsKKyAgICBnbFZlcnRleDNmdihQMDgwKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg3KTsKKyAgICBnbFZlcnRleDNmdihQMDg3KTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAxMSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wNzkpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsTm9ybWFsM2Z2KE4wODgpOworICAgIGdsVmVydGV4M2Z2KFAwODgpOworICAgIGdsTm9ybWFsM2Z2KE4wODkpOworICAgIGdsVmVydGV4M2Z2KFAwODkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg4KTsKKyAgICBnbFZlcnRleDNmdihQMDg4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDg5KTsKKyAgICBnbFZlcnRleDNmdihQMDg5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg0KTsKKyAgICBnbFZlcnRleDNmdihQMDg0KTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAxMih2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTIpOworICAgIGdsVmVydGV4M2Z2KFAwNTIpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDU3KTsKKyAgICBnbFZlcnRleDNmdihQMDU3KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDEzKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE2KTsKKyAgICBnbFZlcnRleDNmdihQMTE2KTsKKyAgICBnbE5vcm1hbDNmdihOMTE3KTsKKyAgICBnbFZlcnRleDNmdihQMTE3KTsKKyAgICBnbE5vcm1hbDNmdihOMTEyKTsKKyAgICBnbFZlcnRleDNmdihQMTEyKTsKKyAgICBnbE5vcm1hbDNmdihOMTEzKTsKKyAgICBnbFZlcnRleDNmdihQMTEzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNCk7CisgICAgZ2xOb3JtYWwzZnYoTjExMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMyk7CisgICAgZ2xOb3JtYWwzZnYoTjExMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMik7CisgICAgZ2xOb3JtYWwzZnYoTjExNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTQpOworICAgIGdsVmVydGV4M2Z2KFAxMTQpOworICAgIGdsTm9ybWFsM2Z2KE4xMTYpOworICAgIGdsVmVydGV4M2Z2KFAxMTYpOworICAgIGdsTm9ybWFsM2Z2KE4xMTMpOworICAgIGdsVmVydGV4M2Z2KFAxMTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE0KTsKKyAgICBnbFZlcnRleDNmdihQMTE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDA3KTsKKyAgICBnbFZlcnRleDNmdihQMDA3KTsKKyAgICBnbE5vcm1hbDNmdihOMTE2KTsKKyAgICBnbFZlcnRleDNmdihQMTE2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjExNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDcpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDA3KTsKKyAgICBnbFZlcnRleDNmdihQMTE0KTsKKyAgICBnbFZlcnRleDNmdihQMTE1KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTcpOworICAgIGdsVmVydGV4M2Z2KFAxMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4xMTIpOworICAgIGdsVmVydGV4M2Z2KFAxMTIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTEyKTsKKyAgICBnbFZlcnRleDNmdihQMTEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbE5vcm1hbDNmdihOMTE1KTsKKyAgICBnbFZlcnRleDNmdihQMTE1KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDE0KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTExKTsKKyAgICBnbFZlcnRleDNmdihQMTExKTsKKyAgICBnbE5vcm1hbDNmdihOMTEwKTsKKyAgICBnbFZlcnRleDNmdihQMTEwKTsKKyAgICBnbE5vcm1hbDNmdihOMTAyKTsKKyAgICBnbFZlcnRleDNmdihQMTAyKTsKKyAgICBnbE5vcm1hbDNmdihOMTIxKTsKKyAgICBnbFZlcnRleDNmdihQMTIxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjExMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTcpOworICAgIGdsVmVydGV4M2Z2KFAwOTcpOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsTm9ybWFsM2Z2KE4xMTApOworICAgIGdsVmVydGV4M2Z2KFAxMTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbE5vcm1hbDNmdihOMDk5KTsKKyAgICBnbFZlcnRleDNmdihQMDk5KTsKKyAgICBnbE5vcm1hbDNmdihOMTE5KTsKKyAgICBnbFZlcnRleDNmdihQMTE5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjExOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMTExKTsKKyAgICBnbFZlcnRleDNmdihQMTIxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTApOworICAgIGdsVmVydGV4M2Z2KFAxMTApOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsTm9ybWFsM2Z2KE4xMTgpOworICAgIGdsVmVydGV4M2Z2KFAxMTgpOworICAgIGdsTm9ybWFsM2Z2KE4xMDIpOworICAgIGdsVmVydGV4M2Z2KFAxMDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE5KTsKKyAgICBnbFZlcnRleDNmdihQMTE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbE5vcm1hbDNmdihOMTE4KTsKKyAgICBnbFZlcnRleDNmdihQMTE4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjcpOworICAgIGdsVmVydGV4M2Z2KFAwNjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4xMTgpOworICAgIGdsVmVydGV4M2Z2KFAxMTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE4KTsKKyAgICBnbFZlcnRleDNmdihQMTE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDk4KTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOCk7CisgICAgZ2xOb3JtYWwzZnYoTjA5OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OCk7CisgICAgZ2xOb3JtYWwzZnYoTjEwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMDIpOworICAgIGdsVmVydGV4M2Z2KFAxMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTgpOworICAgIGdsVmVydGV4M2Z2KFAwOTgpOworICAgIGdsTm9ybWFsM2Z2KE4xMjEpOworICAgIGdsVmVydGV4M2Z2KFAxMjEpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMTUodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NCk7CisgICAgZ2xOb3JtYWwzZnYoTjEyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wNjQpOworICAgIGdsVmVydGV4M2Z2KFAwNjQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY0KTsKKyAgICBnbFZlcnRleDNmdihQMDY0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjQpOworICAgIGdsVmVydGV4M2Z2KFAwNjQpOworICAgIGdsTm9ybWFsM2Z2KE4wOTkpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsTm9ybWFsM2Z2KE4xMTcpOworICAgIGdsVmVydGV4M2Z2KFAxMTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTIwKTsKKyAgICBnbFZlcnRleDNmdihQMTIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDY0KTsKKyAgICBnbFZlcnRleDNmdihQMDY0KTsKKyAgICBnbE5vcm1hbDNmdihOMTE3KTsKKyAgICBnbFZlcnRleDNmdihQMTE3KTsKKyAgICBnbE5vcm1hbDNmdihOMTE2KTsKKyAgICBnbFZlcnRleDNmdihQMTE2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4xMjApOworICAgIGdsVmVydGV4M2Z2KFAxMjApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMTIwKTsKKyAgICBnbFZlcnRleDNmdihQMTIwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjEyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4xMjApOworICAgIGdsVmVydGV4M2Z2KFAxMjApOworICAgIGdsTm9ybWFsM2Z2KE4xMTYpOworICAgIGdsVmVydGV4M2Z2KFAxMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDE2KHZvaWQpCit7CisKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMTIzKTsKKyAgICBnbFZlcnRleDNmdihQMTI0KTsKKyAgICBnbFZlcnRleDNmdihQMTI1KTsKKyAgICBnbFZlcnRleDNmdihQMTI2KTsKKyAgICBnbFZlcnRleDNmdihQMTI3KTsKKyAgICBnbFZlcnRleDNmdihQMTI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAxMDMpOworICAgIGdsVmVydGV4M2Z2KFAxMDUpOworICAgIGdsVmVydGV4M2Z2KFAxMDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Cit9CisKK3ZvaWQKK0RyYXdEb2xwaGluKGZpc2hSZWMgKiBmaXNoKQoreworICAgIGZsb2F0IHNlZzAsIHNlZzEsIHNlZzIsIHNlZzMsIHNlZzQsIHNlZzUsIHNlZzYsIHNlZzc7CisgICAgZmxvYXQgcGl0Y2gsIHRocmFzaCwgY2hvbXA7CisKKyAgICBmaXNoLT5odGFpbCA9IChpbnQpIChmaXNoLT5odGFpbCAtIChpbnQpICgxMC4wICogZmlzaC0+dikpICUgMzYwOworCisgICAgdGhyYXNoID0gNzAuMCAqIGZpc2gtPnY7CisKKyAgICBzZWcwID0gMS4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCkgKiBSUkFEKTsKKyAgICBzZWczID0gMS4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCkgKiBSUkFEKTsKKyAgICBzZWcxID0gMi4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDQuMCkgKiBSUkFEKTsKKyAgICBzZWcyID0gMy4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDYuMCkgKiBSUkFEKTsKKyAgICBzZWc0ID0gNC4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDEwLjApICogUlJBRCk7CisgICAgc2VnNSA9IDQuNSAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyAxNS4wKSAqIFJSQUQpOworICAgIHNlZzYgPSA1LjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgMjAuMCkgKiBSUkFEKTsKKyAgICBzZWc3ID0gNi4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDMwLjApICogUlJBRCk7CisKKyAgICBwaXRjaCA9IGZpc2gtPnYgKiBzaW4oKGZpc2gtPmh0YWlsICsgMTgwLjApICogUlJBRCk7CisKKyAgICBpZiAoZmlzaC0+diA+IDIuMCkgeworICAgICAgICBjaG9tcCA9IC0oZmlzaC0+diAtIDIuMCkgKiAyMDAuMDsKKyAgICB9CisgICAgY2hvbXAgPSAxMDAuMDsKKworICAgIFAwMTJbMV0gPSBpUDAxMlsxXSArIHNlZzU7CisgICAgUDAxM1sxXSA9IGlQMDEzWzFdICsgc2VnNTsKKyAgICBQMDE0WzFdID0gaVAwMTRbMV0gKyBzZWc1OworICAgIFAwMTVbMV0gPSBpUDAxNVsxXSArIHNlZzU7CisgICAgUDAxNlsxXSA9IGlQMDE2WzFdICsgc2VnNTsKKyAgICBQMDE3WzFdID0gaVAwMTdbMV0gKyBzZWc1OworICAgIFAwMThbMV0gPSBpUDAxOFsxXSArIHNlZzU7CisgICAgUDAxOVsxXSA9IGlQMDE5WzFdICsgc2VnNTsKKworICAgIFAwMjBbMV0gPSBpUDAyMFsxXSArIHNlZzQ7CisgICAgUDAyMVsxXSA9IGlQMDIxWzFdICsgc2VnNDsKKyAgICBQMDIyWzFdID0gaVAwMjJbMV0gKyBzZWc0OworICAgIFAwMjNbMV0gPSBpUDAyM1sxXSArIHNlZzQ7CisgICAgUDAyNFsxXSA9IGlQMDI0WzFdICsgc2VnNDsKKyAgICBQMDI1WzFdID0gaVAwMjVbMV0gKyBzZWc0OworICAgIFAwMjZbMV0gPSBpUDAyNlsxXSArIHNlZzQ7CisgICAgUDAyN1sxXSA9IGlQMDI3WzFdICsgc2VnNDsKKworICAgIFAwMjhbMV0gPSBpUDAyOFsxXSArIHNlZzI7CisgICAgUDAyOVsxXSA9IGlQMDI5WzFdICsgc2VnMjsKKyAgICBQMDMwWzFdID0gaVAwMzBbMV0gKyBzZWcyOworICAgIFAwMzFbMV0gPSBpUDAzMVsxXSArIHNlZzI7CisgICAgUDAzMlsxXSA9IGlQMDMyWzFdICsgc2VnMjsKKyAgICBQMDMzWzFdID0gaVAwMzNbMV0gKyBzZWcyOworICAgIFAwMzRbMV0gPSBpUDAzNFsxXSArIHNlZzI7CisgICAgUDAzNVsxXSA9IGlQMDM1WzFdICsgc2VnMjsKKworICAgIFAwMzZbMV0gPSBpUDAzNlsxXSArIHNlZzE7CisgICAgUDAzN1sxXSA9IGlQMDM3WzFdICsgc2VnMTsKKyAgICBQMDM4WzFdID0gaVAwMzhbMV0gKyBzZWcxOworICAgIFAwMzlbMV0gPSBpUDAzOVsxXSArIHNlZzE7CisgICAgUDA0MFsxXSA9IGlQMDQwWzFdICsgc2VnMTsKKyAgICBQMDQxWzFdID0gaVAwNDFbMV0gKyBzZWcxOworICAgIFAwNDJbMV0gPSBpUDA0MlsxXSArIHNlZzE7CisgICAgUDA0M1sxXSA9IGlQMDQzWzFdICsgc2VnMTsKKworICAgIFAwNDRbMV0gPSBpUDA0NFsxXSArIHNlZzA7CisgICAgUDA0NVsxXSA9IGlQMDQ1WzFdICsgc2VnMDsKKyAgICBQMDQ2WzFdID0gaVAwNDZbMV0gKyBzZWcwOworICAgIFAwNDdbMV0gPSBpUDA0N1sxXSArIHNlZzA7CisgICAgUDA0OFsxXSA9IGlQMDQ4WzFdICsgc2VnMDsKKyAgICBQMDQ5WzFdID0gaVAwNDlbMV0gKyBzZWcwOworICAgIFAwNTBbMV0gPSBpUDA1MFsxXSArIHNlZzA7CisgICAgUDA1MVsxXSA9IGlQMDUxWzFdICsgc2VnMDsKKworICAgIFAwMDlbMV0gPSBpUDAwOVsxXSArIHNlZzY7CisgICAgUDAxMFsxXSA9IGlQMDEwWzFdICsgc2VnNjsKKyAgICBQMDc1WzFdID0gaVAwNzVbMV0gKyBzZWc2OworICAgIFAwNzZbMV0gPSBpUDA3NlsxXSArIHNlZzY7CisKKyAgICBQMDAxWzFdID0gaVAwMDFbMV0gKyBzZWc3OworICAgIFAwMTFbMV0gPSBpUDAxMVsxXSArIHNlZzc7CisgICAgUDA2OFsxXSA9IGlQMDY4WzFdICsgc2VnNzsKKyAgICBQMDY5WzFdID0gaVAwNjlbMV0gKyBzZWc3OworICAgIFAwNzBbMV0gPSBpUDA3MFsxXSArIHNlZzc7CisgICAgUDA3MVsxXSA9IGlQMDcxWzFdICsgc2VnNzsKKyAgICBQMDcyWzFdID0gaVAwNzJbMV0gKyBzZWc3OworICAgIFAwNzNbMV0gPSBpUDA3M1sxXSArIHNlZzc7CisgICAgUDA3NFsxXSA9IGlQMDc0WzFdICsgc2VnNzsKKworICAgIFAwOTFbMV0gPSBpUDA5MVsxXSArIHNlZzM7CisgICAgUDA5MlsxXSA9IGlQMDkyWzFdICsgc2VnMzsKKyAgICBQMDkzWzFdID0gaVAwOTNbMV0gKyBzZWczOworICAgIFAwOTRbMV0gPSBpUDA5NFsxXSArIHNlZzM7CisgICAgUDA5NVsxXSA9IGlQMDk1WzFdICsgc2VnMzsKKyAgICBQMTIyWzFdID0gaVAxMjJbMV0gKyBzZWczICogMS41OworCisgICAgUDA5N1sxXSA9IGlQMDk3WzFdICsgY2hvbXA7CisgICAgUDA5OFsxXSA9IGlQMDk4WzFdICsgY2hvbXA7CisgICAgUDEwMlsxXSA9IGlQMTAyWzFdICsgY2hvbXA7CisgICAgUDExMFsxXSA9IGlQMTEwWzFdICsgY2hvbXA7CisgICAgUDExMVsxXSA9IGlQMTExWzFdICsgY2hvbXA7CisgICAgUDEyMVsxXSA9IGlQMTIxWzFdICsgY2hvbXA7CisgICAgUDExOFsxXSA9IGlQMTE4WzFdICsgY2hvbXA7CisgICAgUDExOVsxXSA9IGlQMTE5WzFdICsgY2hvbXA7CisKKyAgICBnbFB1c2hNYXRyaXgoKTsKKworICAgIGdsUm90YXRlZihwaXRjaCwgMS4wLCAwLjAsIDAuMCk7CisKKyAgICBnbFRyYW5zbGF0ZWYoMC4wLCAwLjAsIDcwMDAuMCk7CisKKyAgICBnbFJvdGF0ZWYoMTgwLjAsIDAuMCwgMS4wLCAwLjApOworCisgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBEb2xwaGluMDE0KCk7CisgICAgRG9scGhpbjAxMCgpOworICAgIERvbHBoaW4wMDkoKTsKKyAgICBEb2xwaGluMDEyKCk7CisgICAgRG9scGhpbjAxMygpOworICAgIERvbHBoaW4wMDYoKTsKKyAgICBEb2xwaGluMDAyKCk7CisgICAgRG9scGhpbjAwMSgpOworICAgIERvbHBoaW4wMDMoKTsKKyAgICBEb2xwaGluMDE1KCk7CisgICAgRG9scGhpbjAwNCgpOworICAgIERvbHBoaW4wMDUoKTsKKyAgICBEb2xwaGluMDA3KCk7CisgICAgRG9scGhpbjAwOCgpOworICAgIERvbHBoaW4wMTEoKTsKKyAgICBEb2xwaGluMDE2KCk7CisgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBnbFBvcE1hdHJpeCgpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9zaGFyay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9zaGFyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODQ3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL3NoYXJrLmMKQEAgLTAsMCArMSwxMzA4IEBACisvKioKKyAqIChjKSBDb3B5cmlnaHQgMTk5MywgMTk5NCwgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQUxMIFJJR0hUUyBSRVNFUlZFRAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZQorICogYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKKyAqIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSEUgTUFURVJJQUwgRU1CT0RJRUQgT04gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBUTyBZT1UgIkFTLUlTIgorICogQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLAorICogSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCisgKiBHUkFQSElDUywgSU5DLiAgQkUgTElBQkxFIFRPIFlPVSBPUiBBTllPTkUgRUxTRSBGT1IgQU5ZIERJUkVDVCwKKyAqIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKKyAqIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sCisgKiBMT1NTIE9GIFBST0ZJVCwgTE9TUyBPRiBVU0UsIFNBVklOR1MgT1IgUkVWRU5VRSwgT1IgVEhFIENMQUlNUyBPRgorICogVEhJUkQgUEFSVElFUywgV0hFVEhFUiBPUiBOT1QgU0lMSUNPTiBHUkFQSElDUywgSU5DLiAgSEFTIEJFRU4KKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggTE9TUywgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogUE9TU0VTU0lPTiwgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cworICogVXNlLCBkdXBsaWNhdGlvbiwgb3IgZGlzY2xvc3VyZSBieSB0aGUgR292ZXJubWVudCBpcyBzdWJqZWN0IHRvCisgKiByZXN0cmljdGlvbnMgc2V0IGZvcnRoIGluIEZBUiA1Mi4yMjcuMTkoYykoMikgb3Igc3VicGFyYWdyYXBoCisgKiAoYykoMSkoaWkpIG9mIHRoZSBSaWdodHMgaW4gVGVjaG5pY2FsIERhdGEgYW5kIENvbXB1dGVyIFNvZnR3YXJlCisgKiBjbGF1c2UgYXQgREZBUlMgMjUyLjIyNy03MDEzIGFuZC9vciBpbiBzaW1pbGFyIG9yIHN1Y2Nlc3NvcgorICogY2xhdXNlcyBpbiB0aGUgRkFSIG9yIHRoZSBET0Qgb3IgTkFTQSBGQVIgU3VwcGxlbWVudC4KKyAqIFVucHVibGlzaGVkLS0gcmlnaHRzIHJlc2VydmVkIHVuZGVyIHRoZSBjb3B5cmlnaHQgbGF3cyBvZiB0aGUKKyAqIFVuaXRlZCBTdGF0ZXMuICBDb250cmFjdG9yL21hbnVmYWN0dXJlciBpcyBTaWxpY29uIEdyYXBoaWNzLAorICogSW5jLiwgMjAxMSBOLiAgU2hvcmVsaW5lIEJsdmQuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDAzOS03MzExLgorICoKKyAqIE9wZW5HTChUTSkgaXMgYSB0cmFkZW1hcmsgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImF0bGFudGlzLmgiCisvKiAqSU5ERU5ULU9GRiogKi8KK3N0YXRpYyBmbG9hdCBOMDAyWzNdID0gezAuMDAwMDc3ICwtMC4wMjA2MTEgLDAuOTk5Nzg4fTsKK3N0YXRpYyBmbG9hdCBOMDAzWzNdID0gezAuOTYxNDI1ICwwLjI1ODcyOSAsLTAuMDkzMzkwfTsKK3N0YXRpYyBmbG9hdCBOMDA0WzNdID0gezAuNTEwODExICwtMC43Njk2MzMgLC0wLjM4MzA2M307CitzdGF0aWMgZmxvYXQgTjAwNVszXSA9IHswLjQwMDEyMyAsMC44NTU3MzQgLC0wLjMyODA1NX07CitzdGF0aWMgZmxvYXQgTjAwNlszXSA9IHstMC43NzA3MTUgLDAuNjEwMjA0ICwtMC4xODM0NDB9Oworc3RhdGljIGZsb2F0IE4wMDdbM10gPSB7LTAuOTE1NTk3ICwtMC4zNzMzNDUgLC0wLjE0OTMxNn07CitzdGF0aWMgZmxvYXQgTjAwOFszXSA9IHstMC45NzI3ODggLDAuMjA4OTIxICwtMC4xMDAxNzl9Oworc3RhdGljIGZsb2F0IE4wMDlbM10gPSB7LTAuOTM5NzEzICwtMC4zMTIyNjggLC0wLjEzOTM4M307CitzdGF0aWMgZmxvYXQgTjAxMFszXSA9IHstMC42MjQxMzggLC0wLjc0MTA0NyAsLTAuMjQ3NTg5fTsKK3N0YXRpYyBmbG9hdCBOMDExWzNdID0gezAuNTkxNDM0ICwtMC43Njg0MDEgLC0wLjI0NDQ3MX07CitzdGF0aWMgZmxvYXQgTjAxMlszXSA9IHswLjkzNTE1MiAsLTAuMzI4NDk1ICwtMC4xMzI1OTh9Oworc3RhdGljIGZsb2F0IE4wMTNbM10gPSB7MC45OTcxMDIgLDAuMDc0MjQzICwtMC4wMTY1OTN9Oworc3RhdGljIGZsb2F0IE4wMTRbM10gPSB7MC45Njk5OTUgLDAuMjQxNzEyICwtMC4wMjYxODZ9Oworc3RhdGljIGZsb2F0IE4wMTVbM10gPSB7MC44NDQ1MzkgLDAuNTAyNjI4ICwtMC4xODQ3MTR9Oworc3RhdGljIGZsb2F0IE4wMTZbM10gPSB7LTAuOTA2NjA4ICwwLjM4NjMwOCAsLTAuMTY5Nzg3fTsKK3N0YXRpYyBmbG9hdCBOMDE3WzNdID0gey0wLjk3MDAxNiAsMC4yNDE2OTggLC0wLjAyNTUxNn07CitzdGF0aWMgZmxvYXQgTjAxOFszXSA9IHstMC45OTg2NTIgLDAuMDUwNDkzICwtMC4wMTIwNDV9Oworc3RhdGljIGZsb2F0IE4wMTlbM10gPSB7LTAuOTQyNjg1ICwtMC4zMzMwNTEgLC0wLjAyMDU1Nn07CitzdGF0aWMgZmxvYXQgTjAyMFszXSA9IHstMC42NjA5NDQgLC0wLjc1MDI3NiAsMC4wMTU0ODB9Oworc3RhdGljIGZsb2F0IE4wMjFbM10gPSB7MC41MDM1NDkgLC0wLjg2MjkwOCAsLTAuMDQyNzQ5fTsKK3N0YXRpYyBmbG9hdCBOMDIyWzNdID0gezAuOTUzMjAyICwtMC4zMDIwOTIgLC0wLjAxMjA4OX07CitzdGF0aWMgZmxvYXQgTjAyM1szXSA9IHswLjk5ODczOCAsMC4wMjM1NzQgLDAuMDQ0MzQ0fTsKK3N0YXRpYyBmbG9hdCBOMDI0WzNdID0gezAuOTc5Mjk3ICwwLjE5MzI3MiAsMC4wNjAyMDJ9Oworc3RhdGljIGZsb2F0IE4wMjVbM10gPSB7MC43OTgzMDAgLDAuNDY0ODg1ICwwLjM4Mjg4M307CitzdGF0aWMgZmxvYXQgTjAyNlszXSA9IHstMC43NTY1OTAgLDAuNDUyNDAzICwwLjQ3MjEyNn07CitzdGF0aWMgZmxvYXQgTjAyN1szXSA9IHstMC45NTM4NTUgLDAuMjkzMDAzICwwLjA2NTY1MX07CitzdGF0aWMgZmxvYXQgTjAyOFszXSA9IHstMC45OTgwMzMgLDAuMDQwMjkyICwwLjA0ODAyOH07CitzdGF0aWMgZmxvYXQgTjAyOVszXSA9IHstMC45NzcwNzkgLC0wLjIwNDI4OCAsMC4wNTk4NTh9Oworc3RhdGljIGZsb2F0IE4wMzBbM10gPSB7LTAuNzI5MTE3ICwtMC42NzUzMDQgLDAuMTExMTQwfTsKK3N0YXRpYyBmbG9hdCBOMDMxWzNdID0gezAuNTk4MzYxICwtMC43OTI3NTMgLDAuMTE2MjIxfTsKK3N0YXRpYyBmbG9hdCBOMDMyWzNdID0gezAuOTY1MTkyICwtMC4yNTI5OTEgLDAuMDY2MzMyfTsKK3N0YXRpYyBmbG9hdCBOMDMzWzNdID0gezAuOTk4MjAxICwtMC4wMDI3OTAgLDAuMDU5ODkyfTsKK3N0YXRpYyBmbG9hdCBOMDM0WzNdID0gezAuOTc4NjU3ICwwLjE5MzEzNSAsMC4wNzAyMDd9Oworc3RhdGljIGZsb2F0IE4wMzVbM10gPSB7MC43MTg4MTUgLDAuNjgwMzkyICwwLjE0MjczM307CitzdGF0aWMgZmxvYXQgTjAzNlszXSA9IHstMC4zODMwOTYgLDAuOTA2MjEyICwwLjE3ODkzNn07CitzdGF0aWMgZmxvYXQgTjAzN1szXSA9IHstMC45NTI4MzEgLDAuMjkyNTkwICwwLjA4MDY0N307CitzdGF0aWMgZmxvYXQgTjAzOFszXSA9IHstMC45OTc2ODAgLDAuMDMyNDE3ICwwLjA1OTg2MX07CitzdGF0aWMgZmxvYXQgTjAzOVszXSA9IHstMC45ODI2MjkgLC0wLjE2OTg4MSAsMC4wNzQ3MDB9Oworc3RhdGljIGZsb2F0IE4wNDBbM10gPSB7LTAuNjk1NDI0ICwtMC43MDM0NjYgLDAuMTQ2NzAwfTsKK3N0YXRpYyBmbG9hdCBOMDQxWzNdID0gezAuMzU5MzIzICwtMC45MTU1MzEgLDAuMTgwODA1fTsKK3N0YXRpYyBmbG9hdCBOMDQyWzNdID0gezAuOTQzMzU2ICwtMC4zMTkzODcgLDAuMDg5ODQyfTsKK3N0YXRpYyBmbG9hdCBOMDQzWzNdID0gezAuOTk4MjcyICwtMC4wMzI0MzUgLDAuMDQ4OTkzfTsKK3N0YXRpYyBmbG9hdCBOMDQ0WzNdID0gezAuOTc4OTk3ICwwLjE5MzIwNSAsMC4wNjUwODR9Oworc3RhdGljIGZsb2F0IE4wNDVbM10gPSB7MC44NzIxNDQgLDAuNDcwMDk0ICwtMC4xMzU1NjV9Oworc3RhdGljIGZsb2F0IE4wNDZbM10gPSB7LTAuNjY0MjgyICwwLjczNzk0NSAsLTAuMTE5MDI3fTsKK3N0YXRpYyBmbG9hdCBOMDQ3WzNdID0gey0wLjk1NDUwOCAsMC4yODg1NzAgLDAuMDc1MTA3fTsKK3N0YXRpYyBmbG9hdCBOMDQ4WzNdID0gey0wLjk5ODI3MyAsMC4wMzI0MDYgLDAuMDQ4OTkzfTsKK3N0YXRpYyBmbG9hdCBOMDQ5WzNdID0gey0wLjk3OTkwOCAsLTAuMTkzNTc5ICwwLjA0ODAzOH07CitzdGF0aWMgZmxvYXQgTjA1MFszXSA9IHstMC44NTg3MzYgLC0wLjUwNzIwMiAsLTAuMDcyOTM4fTsKK3N0YXRpYyBmbG9hdCBOMDUxWzNdID0gezAuNjQzNTQ1ICwtMC43NjM4ODcgLC0wLjA0ODIzN307CitzdGF0aWMgZmxvYXQgTjA1MlszXSA9IHswLjk1NTU4MCAsLTAuMjg4OTU0ICwwLjA1ODA2OH07CitzdGF0aWMgZmxvYXQgTjA1OFszXSA9IHswLjAwMDA1MCAsMC43OTMwMDcgLC0wLjYwOTIxM307CitzdGF0aWMgZmxvYXQgTjA1OVszXSA9IHswLjkxMzUxMCAsMC4yMzU0MTggLC0wLjMzMTc3OX07CitzdGF0aWMgZmxvYXQgTjA2MFszXSA9IHstMC44MDc5NzAgLDAuNDk1MDAwICwtMC4zMTk2MjV9Oworc3RhdGljIGZsb2F0IE4wNjFbM10gPSB7MC4wMDAwMDAgLDAuNzg0Njg3ICwtMC42MTk4OTJ9Oworc3RhdGljIGZsb2F0IE4wNjJbM10gPSB7MC4wMDAwMDAgLC0xLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNjNbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA2NFszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDY1WzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNjZbM10gPSB7LTAuMDU1Nzg0ICwwLjI1NzA1OSAsMC45NjQ3ODR9Oworc3RhdGljIGZsb2F0IE4wNjlbM10gPSB7LTAuMDAwNTA1ICwtMC45Mjk3NzUgLC0wLjM2ODEyN307CitzdGF0aWMgZmxvYXQgTjA3MFszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBQMDAyWzNdID0gezAuMDAsIC0zNi41OSwgNTY4Ny43Mn07CitzdGF0aWMgZmxvYXQgUDAwM1szXSA9IHs5MC4wMCwgMTE0LjczLCA3MjQuMzh9Oworc3RhdGljIGZsb2F0IFAwMDRbM10gPSB7NTguMjQsIC0xNDYuODQsIDI2Mi4zNX07CitzdGF0aWMgZmxvYXQgUDAwNVszXSA9IHsyNy44MSwgMjMxLjUyLCA1MTAuNDN9Oworc3RhdGljIGZsb2F0IFAwMDZbM10gPSB7LTI3LjgxLCAyMzAuNDMsIDUwOS43Nn07CitzdGF0aWMgZmxvYXQgUDAwN1szXSA9IHstNDYuMDksIC0xNDYuODMsIDI2NS44NH07CitzdGF0aWMgZmxvYXQgUDAwOFszXSA9IHstOTAuMDAsIDEwMy44NCwgNzE4LjUzfTsKK3N0YXRpYyBmbG9hdCBQMDA5WzNdID0gey0xMzEuMTAsIC0xNjUuOTIsIDgzNC44NX07CitzdGF0aWMgZmxvYXQgUDAxMFszXSA9IHstMjcuODEsIC0yODUuMzEsIDUwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAxMVszXSA9IHsyNy44MSwgLTI4NS4zMiwgNTAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDEyWzNdID0gezE0Ny45NiwgLTE3MC44OSwgODQ1LjUwfTsKK3N0YXRpYyBmbG9hdCBQMDEzWzNdID0gezE4MC4wMCwgMC4wMCwgMjAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAxNFszXSA9IHsxNDUuNjIsIDM1Mi42NywgMjAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAxNVszXSA9IHs1NS42MiwgNTcwLjYzLCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDE2WzNdID0gey01NS42MiwgNTcwLjY0LCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDE3WzNdID0gey0xNDUuNjIsIDM1Mi42OCwgMjAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAxOFszXSA9IHstMTgwLjAwLCAwLjAxLCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDE5WzNdID0gey0xNzguMjAsIC0zNTIuNjYsIDIwMDEuNjF9Oworc3RhdGljIGZsb2F0IFAwMjBbM10gPSB7LTU1LjYzLCAtNTcwLjYzLCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDIxWzNdID0gezU1LjYyLCAtNTcwLjY0LCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDIyWzNdID0gezE3OS45MSwgLTM1Mi42OSwgMTk5OC4zOX07CitzdGF0aWMgZmxvYXQgUDAyM1szXSA9IHsxNTAuMDAsIDAuMDAsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMjRbM10gPSB7MTIxLjM1LCAyOTMuODksIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMjVbM10gPSB7NDYuMzUsIDUwMi45MywgMjg4My4wOX07CitzdGF0aWMgZmxvYXQgUDAyNlszXSA9IHstNDYuMzUsIDQ5Ny40NSwgMjg3Ny4yNH07CitzdGF0aWMgZmxvYXQgUDAyN1szXSA9IHstMTIxLjM1LCAyOTMuOTAsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMjhbM10gPSB7LTE1MC4wMCwgMC4wMCwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAyOVszXSA9IHstMTUyLjIxLCAtMzA0Ljg0LCAyODU4LjY4fTsKK3N0YXRpYyBmbG9hdCBQMDMwWzNdID0gey00Ni4zNiwgLTQ3NS41MiwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAzMVszXSA9IHs0Ni4zNSwgLTQ3NS41MywgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAzMlszXSA9IHsxNTUuNjQsIC0zMDQuODcsIDI4NjMuNTB9Oworc3RhdGljIGZsb2F0IFAwMzNbM10gPSB7OTAuMDAsIDAuMDAsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMzRbM10gPSB7NzIuODEsIDE3Ni4zMywgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAzNVszXSA9IHsyNy44MSwgMjg1LjMyLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDM2WzNdID0gey0yNy44MSwgMjg1LjMyLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDM3WzNdID0gey03Mi44MSwgMTc2LjM0LCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDM4WzNdID0gey05MC4wMCwgMC4wMCwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAzOVszXSA9IHstNzIuODEsIC0xNzYuMzMsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDBbM10gPSB7LTI3LjgxLCAtMjg1LjMxLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQxWzNdID0gezI3LjgxLCAtMjg1LjMyLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQyWzNdID0gezcyLjgxLCAtMTc2LjM0LCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQzWzNdID0gezMwLjAwLCAwLjAwLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQ0WzNdID0gezI0LjI3LCA1OC43OCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA0NVszXSA9IHs5LjI3LCA5NS4xMSwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA0NlszXSA9IHstOS4yNywgOTUuMTEsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDdbM10gPSB7LTI0LjI3LCA1OC43OCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA0OFszXSA9IHstMzAuMDAsIDAuMDAsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDlbM10gPSB7LTI0LjI3LCAtNTguNzgsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNTBbM10gPSB7LTkuMjcsIC05NS4xMCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA1MVszXSA9IHs5LjI3LCAtOTUuMTEsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNTJbM10gPSB7MjQuMjcsIC01OC43OCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA1OFszXSA9IHswLjAwLCAxMjEyLjcyLCAyNzAzLjA4fTsKK3N0YXRpYyBmbG9hdCBQMDU5WzNdID0gezUwLjM2LCAwLjAwLCAxMDguMTR9Oworc3RhdGljIGZsb2F0IFAwNjBbM10gPSB7LTIyLjE4LCAwLjAwLCAxMDguMTR9Oworc3RhdGljIGZsb2F0IFAwNjFbM10gPSB7MC4wMCwgMTE4MS42MSwgNjM0NC42NX07CitzdGF0aWMgZmxvYXQgUDA2MlszXSA9IHs1MTYuNDUsIC04ODcuMDgsIDI1MzUuNDV9Oworc3RhdGljIGZsb2F0IFAwNjNbM10gPSB7LTU0NS42OSwgLTg3OS4zMSwgMjU1NS42M307CitzdGF0aWMgZmxvYXQgUDA2NFszXSA9IHs2MTguODksIC0xMDA1LjY0LCAyOTg4LjMyfTsKK3N0YXRpYyBmbG9hdCBQMDY1WzNdID0gey02MzUuMzcsIC0xMDE0Ljc5LCAyOTM4LjY4fTsKK3N0YXRpYyBmbG9hdCBQMDY2WzNdID0gezAuMDAsIDEzNzQuNDMsIDMwNjQuMTh9Oworc3RhdGljIGZsb2F0IFAwNjlbM10gPSB7MC4wMCwgLTQxOC4yNSwgNTc2NS4wNH07CitzdGF0aWMgZmxvYXQgUDA3MFszXSA9IHswLjAwLCAxMjY2LjkxLCA2NjI5LjYwfTsKK3N0YXRpYyBmbG9hdCBQMDcxWzNdID0gey0xMzkuMTIsIC0xMjQuOTYsIDk5Ny45OH07CitzdGF0aWMgZmxvYXQgUDA3MlszXSA9IHstMTM5LjI0LCAtMTEwLjE4LCAxMDIwLjY4fTsKK3N0YXRpYyBmbG9hdCBQMDczWzNdID0gey0xMzcuMzMsIC05NC41MiwgMTAyMi42M307CitzdGF0aWMgZmxvYXQgUDA3NFszXSA9IHstMTM3LjAzLCAtNzkuOTEsIDk5Ni44OX07CitzdGF0aWMgZmxvYXQgUDA3NVszXSA9IHstMTM1LjIxLCAtOTEuNDgsIDk2OS4xNH07CitzdGF0aWMgZmxvYXQgUDA3NlszXSA9IHstMTM1LjM5LCAtMTEwLjg3LCA5NjguNzZ9Oworc3RhdGljIGZsb2F0IFAwNzdbM10gPSB7MTUwLjIzLCAtNzguNDQsIDk5NS41M307CitzdGF0aWMgZmxvYXQgUDA3OFszXSA9IHsxNTIuNzksIC05Mi43NiwgMTAxOC40Nn07CitzdGF0aWMgZmxvYXQgUDA3OVszXSA9IHsxNTQuMTksIC0xMTAuMjAsIDEwMjAuNTV9Oworc3RhdGljIGZsb2F0IFAwODBbM10gPSB7MTUxLjMzLCAtMTI0LjE1LCA5OTMuNzd9Oworc3RhdGljIGZsb2F0IFAwODFbM10gPSB7MTUwLjQ5LCAtMTExLjE5LCA5NjkuODZ9Oworc3RhdGljIGZsb2F0IFAwODJbM10gPSB7MTUwLjc5LCAtOTIuNDEsIDk2OS43MH07CitzdGF0aWMgZmxvYXQgaVAwMDJbM10gPSB7MC4wMCwgLTM2LjU5LCA1Njg3LjcyfTsKK3N0YXRpYyBmbG9hdCBpUDAwNFszXSA9IHs1OC4yNCwgLTE0Ni44NCwgMjYyLjM1fTsKK3N0YXRpYyBmbG9hdCBpUDAwN1szXSA9IHstNDYuMDksIC0xNDYuODMsIDI2NS44NH07CitzdGF0aWMgZmxvYXQgaVAwMTBbM10gPSB7LTI3LjgxLCAtMjg1LjMxLCA1MDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDExWzNdID0gezI3LjgxLCAtMjg1LjMyLCA1MDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDIzWzNdID0gezE1MC4wMCwgMC4wMCwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMjRbM10gPSB7MTIxLjM1LCAyOTMuODksIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDI1WzNdID0gezQ2LjM1LCA1MDIuOTMsIDI4ODMuMDl9Oworc3RhdGljIGZsb2F0IGlQMDI2WzNdID0gey00Ni4zNSwgNDk3LjQ1LCAyODc3LjI0fTsKK3N0YXRpYyBmbG9hdCBpUDAyN1szXSA9IHstMTIxLjM1LCAyOTMuOTAsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDI4WzNdID0gey0xNTAuMDAsIDAuMDAsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDI5WzNdID0gey0xMjEuMzUsIC0zMDQuODQsIDI4NTMuODZ9Oworc3RhdGljIGZsb2F0IGlQMDMwWzNdID0gey00Ni4zNiwgLTQ3NS41MiwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMzFbM10gPSB7NDYuMzUsIC00NzUuNTMsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDMyWzNdID0gezEyMS4zNSwgLTMwNC44NywgMjg1My44Nn07CitzdGF0aWMgZmxvYXQgaVAwMzNbM10gPSB7OTAuMDAsIDAuMDAsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDM0WzNdID0gezcyLjgxLCAxNzYuMzMsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDM1WzNdID0gezI3LjgxLCAyODUuMzIsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDM2WzNdID0gey0yNy44MSwgMjg1LjMyLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDAzN1szXSA9IHstNzIuODEsIDE3Ni4zNCwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMzhbM10gPSB7LTkwLjAwLCAwLjAwLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDAzOVszXSA9IHstNzIuODEsIC0xNzYuMzMsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQwWzNdID0gey0yNy44MSwgLTI4NS4zMSwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNDFbM10gPSB7MjcuODEsIC0yODUuMzIsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQyWzNdID0gezcyLjgxLCAtMTc2LjM0LCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0M1szXSA9IHszMC4wMCwgMC4wMCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNDRbM10gPSB7MjQuMjcsIDU4Ljc4LCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0NVszXSA9IHs5LjI3LCA5NS4xMSwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNDZbM10gPSB7LTkuMjcsIDk1LjExLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0N1szXSA9IHstMjQuMjcsIDU4Ljc4LCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0OFszXSA9IHstMzAuMDAsIDAuMDAsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQ5WzNdID0gey0yNC4yNywgLTU4Ljc4LCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA1MFszXSA9IHstOS4yNywgLTk1LjEwLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA1MVszXSA9IHs5LjI3LCAtOTUuMTEsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDUyWzNdID0gezI0LjI3LCAtNTguNzgsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDYxWzNdID0gezAuMDAsIDExODEuNjEsIDYzNDQuNjV9Oworc3RhdGljIGZsb2F0IGlQMDY5WzNdID0gezAuMDAsIC00MTguMjUsIDU3NjUuMDR9Oworc3RhdGljIGZsb2F0IGlQMDcwWzNdID0gezAuMDAsIDEyNjYuOTEsIDY2MjkuNjB9OworLyogKklOREVOVC1PTiogKi8KKwordm9pZAorRmlzaDAwMSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE3KTsKKyAgICBnbFZlcnRleDNmdihQMDE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA3KTsKKyAgICBnbFZlcnRleDNmdihQMDA3KTsKKyAgICBnbE5vcm1hbDNmdihOMDEwKTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbE5vcm1hbDNmdihOMDA5KTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsTm9ybWFsM2Z2KE4wMTApOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEwKTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTApOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsTm9ybWFsM2Z2KE4wMDcpOworICAgIGdsVmVydGV4M2Z2KFAwMDcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA0KTsKKyAgICBnbFZlcnRleDNmdihQMDA0KTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsVmVydGV4M2Z2KFAwODApOworICAgIGdsVmVydGV4M2Z2KFAwODEpOworICAgIGdsVmVydGV4M2Z2KFAwODIpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2gwMDIodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2gwMDModm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2gwMDQodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM0KTsKKyAgICBnbFZlcnRleDNmdihQMDM0KTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbE5vcm1hbDNmdihOMDYxKTsKKyAgICBnbFZlcnRleDNmdihQMDYxKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjEpOworICAgIGdsVmVydGV4M2Z2KFAwNjEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDYxKTsKKyAgICBnbFZlcnRleDNmdihQMDYxKTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwNSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2gwMDYodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwNyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wNjQpOworICAgIGdsVmVydGV4M2Z2KFAwNjQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwOCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwOSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDcpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2hfMSh2b2lkKQoreworICAgIEZpc2gwMDQoKTsKKyAgICBGaXNoMDA1KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDcoKTsKKyAgICBGaXNoMDA2KCk7CisgICAgRmlzaDAwMigpOworICAgIEZpc2gwMDgoKTsKKyAgICBGaXNoMDA5KCk7CisgICAgRmlzaDAwMSgpOworfQorCit2b2lkCitGaXNoXzIodm9pZCkKK3sKKyAgICBGaXNoMDA1KCk7CisgICAgRmlzaDAwNCgpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwNigpOworICAgIEZpc2gwMDIoKTsKKyAgICBGaXNoMDA3KCk7CisgICAgRmlzaDAwOSgpOworICAgIEZpc2gwMDEoKTsKK30KKwordm9pZAorRmlzaF8zKHZvaWQpCit7CisgICAgRmlzaDAwNSgpOworICAgIEZpc2gwMDQoKTsKKyAgICBGaXNoMDA3KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDIoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwOSgpOworICAgIEZpc2gwMDEoKTsKKyAgICBGaXNoMDA2KCk7Cit9CisKK3ZvaWQKK0Zpc2hfNCh2b2lkKQoreworICAgIEZpc2gwMDUoKTsKKyAgICBGaXNoMDA0KCk7CisgICAgRmlzaDAwOCgpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDAyKCk7CisgICAgRmlzaDAwNygpOworICAgIEZpc2gwMDkoKTsKKyAgICBGaXNoMDAxKCk7CisgICAgRmlzaDAwNigpOworfQorCit2b2lkCitGaXNoXzUodm9pZCkKK3sKKyAgICBGaXNoMDA5KCk7CisgICAgRmlzaDAwNigpOworICAgIEZpc2gwMDcoKTsKKyAgICBGaXNoMDAxKCk7CisgICAgRmlzaDAwMigpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwNCgpOworICAgIEZpc2gwMDUoKTsKK30KKwordm9pZAorRmlzaF82KHZvaWQpCit7CisgICAgRmlzaDAwOSgpOworICAgIEZpc2gwMDYoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwMSgpOworICAgIEZpc2gwMDIoKTsKKyAgICBGaXNoMDA3KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDQoKTsKKyAgICBGaXNoMDA1KCk7Cit9CisKK3ZvaWQKK0Zpc2hfNyh2b2lkKQoreworICAgIEZpc2gwMDkoKTsKKyAgICBGaXNoMDAxKCk7CisgICAgRmlzaDAwNygpOworICAgIEZpc2gwMDUoKTsKKyAgICBGaXNoMDAyKCk7CisgICAgRmlzaDAwOCgpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDA0KCk7CisgICAgRmlzaDAwNigpOworfQorCit2b2lkCitGaXNoXzgodm9pZCkKK3sKKyAgICBGaXNoMDA5KCk7CisgICAgRmlzaDAwOCgpOworICAgIEZpc2gwMDEoKTsKKyAgICBGaXNoMDAyKCk7CisgICAgRmlzaDAwNygpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDA1KCk7CisgICAgRmlzaDAwNCgpOworICAgIEZpc2gwMDYoKTsKK30KKwordm9pZAorRHJhd1NoYXJrKGZpc2hSZWMgKiBmaXNoKQoreworICAgIGZsb2F0IG1hdFs0XVs0XTsKKyAgICBpbnQgbjsKKyAgICBmbG9hdCBzZWcxLCBzZWcyLCBzZWczLCBzZWc0LCBzZWd1cDsKKyAgICBmbG9hdCB0aHJhc2gsIGNob21wOworCisgICAgZmlzaC0+aHRhaWwgPSAoaW50KSAoZmlzaC0+aHRhaWwgLSAoaW50KSAoNS4wICogZmlzaC0+dikpICUgMzYwOworCisgICAgdGhyYXNoID0gNTAuMCAqIGZpc2gtPnY7CisKKyAgICBzZWcxID0gMC42ICogdGhyYXNoICogc2luKGZpc2gtPmh0YWlsICogUlJBRCk7CisgICAgc2VnMiA9IDEuOCAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyA0NS4wKSAqIFJSQUQpOworICAgIHNlZzMgPSAzLjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgOTAuMCkgKiBSUkFEKTsKKyAgICBzZWc0ID0gNC4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDExMC4wKSAqIFJSQUQpOworCisgICAgY2hvbXAgPSAwLjA7CisgICAgaWYgKGZpc2gtPnYgPiAyLjApIHsKKyAgICAgICAgY2hvbXAgPSAtKGZpc2gtPnYgLSAyLjApICogMjAwLjA7CisgICAgfQorICAgIFAwMDRbMV0gPSBpUDAwNFsxXSArIGNob21wOworICAgIFAwMDdbMV0gPSBpUDAwN1sxXSArIGNob21wOworICAgIFAwMTBbMV0gPSBpUDAxMFsxXSArIGNob21wOworICAgIFAwMTFbMV0gPSBpUDAxMVsxXSArIGNob21wOworCisgICAgUDAyM1swXSA9IGlQMDIzWzBdICsgc2VnMTsKKyAgICBQMDI0WzBdID0gaVAwMjRbMF0gKyBzZWcxOworICAgIFAwMjVbMF0gPSBpUDAyNVswXSArIHNlZzE7CisgICAgUDAyNlswXSA9IGlQMDI2WzBdICsgc2VnMTsKKyAgICBQMDI3WzBdID0gaVAwMjdbMF0gKyBzZWcxOworICAgIFAwMjhbMF0gPSBpUDAyOFswXSArIHNlZzE7CisgICAgUDAyOVswXSA9IGlQMDI5WzBdICsgc2VnMTsKKyAgICBQMDMwWzBdID0gaVAwMzBbMF0gKyBzZWcxOworICAgIFAwMzFbMF0gPSBpUDAzMVswXSArIHNlZzE7CisgICAgUDAzMlswXSA9IGlQMDMyWzBdICsgc2VnMTsKKyAgICBQMDMzWzBdID0gaVAwMzNbMF0gKyBzZWcyOworICAgIFAwMzRbMF0gPSBpUDAzNFswXSArIHNlZzI7CisgICAgUDAzNVswXSA9IGlQMDM1WzBdICsgc2VnMjsKKyAgICBQMDM2WzBdID0gaVAwMzZbMF0gKyBzZWcyOworICAgIFAwMzdbMF0gPSBpUDAzN1swXSArIHNlZzI7CisgICAgUDAzOFswXSA9IGlQMDM4WzBdICsgc2VnMjsKKyAgICBQMDM5WzBdID0gaVAwMzlbMF0gKyBzZWcyOworICAgIFAwNDBbMF0gPSBpUDA0MFswXSArIHNlZzI7CisgICAgUDA0MVswXSA9IGlQMDQxWzBdICsgc2VnMjsKKyAgICBQMDQyWzBdID0gaVAwNDJbMF0gKyBzZWcyOworICAgIFAwNDNbMF0gPSBpUDA0M1swXSArIHNlZzM7CisgICAgUDA0NFswXSA9IGlQMDQ0WzBdICsgc2VnMzsKKyAgICBQMDQ1WzBdID0gaVAwNDVbMF0gKyBzZWczOworICAgIFAwNDZbMF0gPSBpUDA0NlswXSArIHNlZzM7CisgICAgUDA0N1swXSA9IGlQMDQ3WzBdICsgc2VnMzsKKyAgICBQMDQ4WzBdID0gaVAwNDhbMF0gKyBzZWczOworICAgIFAwNDlbMF0gPSBpUDA0OVswXSArIHNlZzM7CisgICAgUDA1MFswXSA9IGlQMDUwWzBdICsgc2VnMzsKKyAgICBQMDUxWzBdID0gaVAwNTFbMF0gKyBzZWczOworICAgIFAwNTJbMF0gPSBpUDA1MlswXSArIHNlZzM7CisgICAgUDAwMlswXSA9IGlQMDAyWzBdICsgc2VnNDsKKyAgICBQMDYxWzBdID0gaVAwNjFbMF0gKyBzZWc0OworICAgIFAwNjlbMF0gPSBpUDA2OVswXSArIHNlZzQ7CisgICAgUDA3MFswXSA9IGlQMDcwWzBdICsgc2VnNDsKKworICAgIGZpc2gtPnZ0YWlsICs9ICgoZmlzaC0+ZHRoZXRhIC0gZmlzaC0+dnRhaWwpICogMC4xKTsKKworICAgIGlmIChmaXNoLT52dGFpbCA+IDAuNSkgeworICAgICAgICBmaXNoLT52dGFpbCA9IDAuNTsKKyAgICB9IGVsc2UgaWYgKGZpc2gtPnZ0YWlsIDwgLTAuNSkgeworICAgICAgICBmaXNoLT52dGFpbCA9IC0wLjU7CisgICAgfQorICAgIHNlZ3VwID0gdGhyYXNoICogZmlzaC0+dnRhaWw7CisKKyAgICBQMDIzWzFdID0gaVAwMjNbMV0gKyBzZWd1cDsKKyAgICBQMDI0WzFdID0gaVAwMjRbMV0gKyBzZWd1cDsKKyAgICBQMDI1WzFdID0gaVAwMjVbMV0gKyBzZWd1cDsKKyAgICBQMDI2WzFdID0gaVAwMjZbMV0gKyBzZWd1cDsKKyAgICBQMDI3WzFdID0gaVAwMjdbMV0gKyBzZWd1cDsKKyAgICBQMDI4WzFdID0gaVAwMjhbMV0gKyBzZWd1cDsKKyAgICBQMDI5WzFdID0gaVAwMjlbMV0gKyBzZWd1cDsKKyAgICBQMDMwWzFdID0gaVAwMzBbMV0gKyBzZWd1cDsKKyAgICBQMDMxWzFdID0gaVAwMzFbMV0gKyBzZWd1cDsKKyAgICBQMDMyWzFdID0gaVAwMzJbMV0gKyBzZWd1cDsKKyAgICBQMDMzWzFdID0gaVAwMzNbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM0WzFdID0gaVAwMzRbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM1WzFdID0gaVAwMzVbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM2WzFdID0gaVAwMzZbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM3WzFdID0gaVAwMzdbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM4WzFdID0gaVAwMzhbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM5WzFdID0gaVAwMzlbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDQwWzFdID0gaVAwNDBbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDQxWzFdID0gaVAwNDFbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDQyWzFdID0gaVAwNDJbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDQzWzFdID0gaVAwNDNbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDA0NFsxXSA9IGlQMDQ0WzFdICsgc2VndXAgKiAxMi4wOworICAgIFAwNDVbMV0gPSBpUDA0NVsxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDQ2WzFdID0gaVAwNDZbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDA0N1sxXSA9IGlQMDQ3WzFdICsgc2VndXAgKiAxMi4wOworICAgIFAwNDhbMV0gPSBpUDA0OFsxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDQ5WzFdID0gaVAwNDlbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDA1MFsxXSA9IGlQMDUwWzFdICsgc2VndXAgKiAxMi4wOworICAgIFAwNTFbMV0gPSBpUDA1MVsxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDUyWzFdID0gaVAwNTJbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDAwMlsxXSA9IGlQMDAyWzFdICsgc2VndXAgKiAxNy4wOworICAgIFAwNjFbMV0gPSBpUDA2MVsxXSArIHNlZ3VwICogMTcuMDsKKyAgICBQMDY5WzFdID0gaVAwNjlbMV0gKyBzZWd1cCAqIDE3LjA7CisgICAgUDA3MFsxXSA9IGlQMDcwWzFdICsgc2VndXAgKiAxNy4wOworCisgICAgZ2xQdXNoTWF0cml4KCk7CisKKyAgICBnbFRyYW5zbGF0ZWYoMC4wLCAwLjAsIC0zMDAwLjApOworCisgICAgZ2xHZXRGbG9hdHYoR0xfTU9ERUxWSUVXX01BVFJJWCwgJm1hdFswXVswXSk7CisgICAgbiA9IDA7CisgICAgaWYgKG1hdFswXVsyXSA+PSAwLjApIHsKKyAgICAgICAgbiArPSAxOworICAgIH0KKyAgICBpZiAobWF0WzFdWzJdID49IDAuMCkgeworICAgICAgICBuICs9IDI7CisgICAgfQorICAgIGlmIChtYXRbMl1bMl0gPj0gMC4wKSB7CisgICAgICAgIG4gKz0gNDsKKyAgICB9CisgICAgZ2xTY2FsZWYoMi4wLCAxLjAsIDEuMCk7CisKKyAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgIHN3aXRjaCAobikgeworICAgIGNhc2UgMDoKKyAgICAgICAgRmlzaF8xKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgRmlzaF8yKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgRmlzaF8zKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgRmlzaF80KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgRmlzaF81KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgRmlzaF82KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgRmlzaF83KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgRmlzaF84KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKworICAgIGdsUG9wTWF0cml4KCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL3N3aW0uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvc3dpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzdiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL3N3aW0uYwpAQCAtMCwwICsxLDE4OCBAQAorLyoqCisgKiAoYykgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFMTCBSSUdIVFMgUkVTRVJWRUQKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UKKyAqIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nCisgKiBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogVEhFIE1BVEVSSUFMIEVNQk9ESUVEIE9OIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgVE8gWU9VICJBUy1JUyIKKyAqIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwKKyAqIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorICogR1JBUEhJQ1MsIElOQy4gIEJFIExJQUJMRSBUTyBZT1UgT1IgQU5ZT05FIEVMU0UgRk9SIEFOWSBESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCisgKiBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLAorICogTE9TUyBPRiBQUk9GSVQsIExPU1MgT0YgVVNFLCBTQVZJTkdTIE9SIFJFVkVOVUUsIE9SIFRIRSBDTEFJTVMgT0YKKyAqIFRISVJEIFBBUlRJRVMsIFdIRVRIRVIgT1IgTk9UIFNJTElDT04gR1JBUEhJQ1MsIElOQy4gIEhBUyBCRUVOCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIExPU1MsIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFBPU1NFU1NJT04sIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMKKyAqIFVzZSwgZHVwbGljYXRpb24sIG9yIGRpc2Nsb3N1cmUgYnkgdGhlIEdvdmVybm1lbnQgaXMgc3ViamVjdCB0bworICogcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBpbiBGQVIgNTIuMjI3LjE5KGMpKDIpIG9yIHN1YnBhcmFncmFwaAorICogKGMpKDEpKGlpKSBvZiB0aGUgUmlnaHRzIGluIFRlY2huaWNhbCBEYXRhIGFuZCBDb21wdXRlciBTb2Z0d2FyZQorICogY2xhdXNlIGF0IERGQVJTIDI1Mi4yMjctNzAxMyBhbmQvb3IgaW4gc2ltaWxhciBvciBzdWNjZXNzb3IKKyAqIGNsYXVzZXMgaW4gdGhlIEZBUiBvciB0aGUgRE9EIG9yIE5BU0EgRkFSIFN1cHBsZW1lbnQuCisgKiBVbnB1Ymxpc2hlZC0tIHJpZ2h0cyByZXNlcnZlZCB1bmRlciB0aGUgY29weXJpZ2h0IGxhd3Mgb2YgdGhlCisgKiBVbml0ZWQgU3RhdGVzLiAgQ29udHJhY3Rvci9tYW51ZmFjdHVyZXIgaXMgU2lsaWNvbiBHcmFwaGljcywKKyAqIEluYy4sIDIwMTEgTi4gIFNob3JlbGluZSBCbHZkLiwgTW91bnRhaW4gVmlldywgQ0EgOTQwMzktNzMxMS4KKyAqCisgKiBPcGVuR0woVE0pIGlzIGEgdHJhZGVtYXJrIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8qIEZvciByYW5kKCkuICovCisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjaW5jbHVkZSAiYXRsYW50aXMuaCIKKwordm9pZAorRmlzaFRyYW5zZm9ybShmaXNoUmVjICogZmlzaCkKK3sKKworICAgIGdsVHJhbnNsYXRlZihmaXNoLT55LCBmaXNoLT56LCAtZmlzaC0+eCk7CisgICAgZ2xSb3RhdGVmKC1maXNoLT5wc2ksIDAuMCwgMS4wLCAwLjApOworICAgIGdsUm90YXRlZihmaXNoLT50aGV0YSwgMS4wLCAwLjAsIDAuMCk7CisgICAgZ2xSb3RhdGVmKC1maXNoLT5waGksIDAuMCwgMC4wLCAxLjApOworfQorCit2b2lkCitXaGFsZVBpbG90KGZpc2hSZWMgKiBmaXNoKQoreworCisgICAgZmlzaC0+cGhpID0gLTIwLjA7CisgICAgZmlzaC0+dGhldGEgPSAwLjA7CisgICAgZmlzaC0+cHNpIC09IDAuNTsKKworICAgIGZpc2gtPnggKz0gV0hBTEVTUEVFRCAqIGZpc2gtPnYgKiBjb3MoZmlzaC0+cHNpIC8gUkFEKSAqIGNvcyhmaXNoLT50aGV0YSAvIFJBRCk7CisgICAgZmlzaC0+eSArPSBXSEFMRVNQRUVEICogZmlzaC0+diAqIHNpbihmaXNoLT5wc2kgLyBSQUQpICogY29zKGZpc2gtPnRoZXRhIC8gUkFEKTsKKyAgICBmaXNoLT56ICs9IFdIQUxFU1BFRUQgKiBmaXNoLT52ICogc2luKGZpc2gtPnRoZXRhIC8gUkFEKTsKK30KKwordm9pZAorU2hhcmtQaWxvdChmaXNoUmVjICogZmlzaCkKK3sKKyAgICBzdGF0aWMgaW50IHNpZ24gPSAxOworICAgIGZsb2F0IFgsIFksIFosIHRwc2ksIHR0aGV0YSwgdGhldGFsOworCisgICAgZmlzaC0+eHQgPSA2MDAwMC4wOworICAgIGZpc2gtPnl0ID0gMC4wOworICAgIGZpc2gtPnp0ID0gMC4wOworCisgICAgWCA9IGZpc2gtPnh0IC0gZmlzaC0+eDsKKyAgICBZID0gZmlzaC0+eXQgLSBmaXNoLT55OworICAgIFogPSBmaXNoLT56dCAtIGZpc2gtPno7CisKKyAgICB0aGV0YWwgPSBmaXNoLT50aGV0YTsKKworICAgIHR0aGV0YSA9IFJBRCAqIGF0YW4oWiAvIChzcXJ0KFggKiBYICsgWSAqIFkpKSk7CisKKyAgICBpZiAodHRoZXRhID4gZmlzaC0+dGhldGEgKyAwLjI1KSB7CisgICAgICAgIGZpc2gtPnRoZXRhICs9IDAuNTsKKyAgICB9IGVsc2UgaWYgKHR0aGV0YSA8IGZpc2gtPnRoZXRhIC0gMC4yNSkgeworICAgICAgICBmaXNoLT50aGV0YSAtPSAwLjU7CisgICAgfQorICAgIGlmIChmaXNoLT50aGV0YSA+IDkwLjApIHsKKyAgICAgICAgZmlzaC0+dGhldGEgPSA5MC4wOworICAgIH0KKyAgICBpZiAoZmlzaC0+dGhldGEgPCAtOTAuMCkgeworICAgICAgICBmaXNoLT50aGV0YSA9IC05MC4wOworICAgIH0KKyAgICBmaXNoLT5kdGhldGEgPSBmaXNoLT50aGV0YSAtIHRoZXRhbDsKKworICAgIHRwc2kgPSBSQUQgKiBhdGFuMihZLCBYKTsKKworICAgIGZpc2gtPmF0dGFjayA9IDA7CisKKyAgICBpZiAoZmFicyh0cHNpIC0gZmlzaC0+cHNpKSA8IDEwLjApIHsKKyAgICAgICAgZmlzaC0+YXR0YWNrID0gMTsKKyAgICB9IGVsc2UgaWYgKGZhYnModHBzaSAtIGZpc2gtPnBzaSkgPCA0NS4wKSB7CisgICAgICAgIGlmIChmaXNoLT5wc2kgPiB0cHNpKSB7CisgICAgICAgICAgICBmaXNoLT5wc2kgLT0gMC41OworICAgICAgICAgICAgaWYgKGZpc2gtPnBzaSA8IC0xODAuMCkgeworICAgICAgICAgICAgICAgIGZpc2gtPnBzaSArPSAzNjAuMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmaXNoLT5wc2kgPCB0cHNpKSB7CisgICAgICAgICAgICBmaXNoLT5wc2kgKz0gMC41OworICAgICAgICAgICAgaWYgKGZpc2gtPnBzaSA+IDE4MC4wKSB7CisgICAgICAgICAgICAgICAgZmlzaC0+cHNpIC09IDM2MC4wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJhbmQoKSAlIDEwMCA+IDk4KSB7CisgICAgICAgICAgICBzaWduID0gMSAtIHNpZ247CisgICAgICAgIH0KKyAgICAgICAgZmlzaC0+cHNpICs9IHNpZ247CisgICAgICAgIGlmIChmaXNoLT5wc2kgPiAxODAuMCkgeworICAgICAgICAgICAgZmlzaC0+cHNpIC09IDM2MC4wOworICAgICAgICB9CisgICAgICAgIGlmIChmaXNoLT5wc2kgPCAtMTgwLjApIHsKKyAgICAgICAgICAgIGZpc2gtPnBzaSArPSAzNjAuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmaXNoLT5hdHRhY2spIHsKKyAgICAgICAgaWYgKGZpc2gtPnYgPCAxLjEpIHsKKyAgICAgICAgICAgIGZpc2gtPnNwdXJ0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlzaC0+c3B1cnQpIHsKKyAgICAgICAgICAgIGZpc2gtPnYgKz0gMC4yOworICAgICAgICB9CisgICAgICAgIGlmIChmaXNoLT52ID4gNS4wKSB7CisgICAgICAgICAgICBmaXNoLT5zcHVydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChmaXNoLT52ID4gMS4wKSAmJiAoIWZpc2gtPnNwdXJ0KSkgeworICAgICAgICAgICAgZmlzaC0+diAtPSAwLjI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIShyYW5kKCkgJSA0MDApICYmICghZmlzaC0+c3B1cnQpKSB7CisgICAgICAgICAgICBmaXNoLT5zcHVydCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpc2gtPnNwdXJ0KSB7CisgICAgICAgICAgICBmaXNoLT52ICs9IDAuMDU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpc2gtPnYgPiAzLjApIHsKKyAgICAgICAgICAgIGZpc2gtPnNwdXJ0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGZpc2gtPnYgPiAxLjApICYmICghZmlzaC0+c3B1cnQpKSB7CisgICAgICAgICAgICBmaXNoLT52IC09IDAuMDU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaXNoLT54ICs9IFNIQVJLU1BFRUQgKiBmaXNoLT52ICogY29zKGZpc2gtPnBzaSAvIFJBRCkgKiBjb3MoZmlzaC0+dGhldGEgLyBSQUQpOworICAgIGZpc2gtPnkgKz0gU0hBUktTUEVFRCAqIGZpc2gtPnYgKiBzaW4oZmlzaC0+cHNpIC8gUkFEKSAqIGNvcyhmaXNoLT50aGV0YSAvIFJBRCk7CisgICAgZmlzaC0+eiArPSBTSEFSS1NQRUVEICogZmlzaC0+diAqIHNpbihmaXNoLT50aGV0YSAvIFJBRCk7Cit9CisKK3ZvaWQKK1NoYXJrTWlzcyhpbnQgaSkKK3sKKyAgICBpbnQgajsKKyAgICBmbG9hdCBhdm9pZCwgdGhldGFsOworICAgIGZsb2F0IFgsIFksIFosIFI7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgTlVNX1NIQVJLUzsgaisrKSB7CisgICAgICAgIGlmIChqICE9IGkpIHsKKyAgICAgICAgICAgIFggPSBzaGFya3Nbal0ueCAtIHNoYXJrc1tpXS54OworICAgICAgICAgICAgWSA9IHNoYXJrc1tqXS55IC0gc2hhcmtzW2ldLnk7CisgICAgICAgICAgICBaID0gc2hhcmtzW2pdLnogLSBzaGFya3NbaV0uejsKKworICAgICAgICAgICAgUiA9IHNxcnQoWCAqIFggKyBZICogWSArIFogKiBaKTsKKworICAgICAgICAgICAgYXZvaWQgPSAxLjA7CisgICAgICAgICAgICB0aGV0YWwgPSBzaGFya3NbaV0udGhldGE7CisKKyAgICAgICAgICAgIGlmIChSIDwgU0hBUktTSVpFKSB7CisgICAgICAgICAgICAgICAgaWYgKFogPiAwLjApIHsKKyAgICAgICAgICAgICAgICAgICAgc2hhcmtzW2ldLnRoZXRhIC09IGF2b2lkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNoYXJrc1tpXS50aGV0YSArPSBhdm9pZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaGFya3NbaV0uZHRoZXRhICs9IChzaGFya3NbaV0udGhldGEgLSB0aGV0YWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy93aGFsZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy93aGFsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODY0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVTbm93TGVvcGFyZC9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL3doYWxlLmMKQEAgLTAsMCArMSwxNzk4IEBACisvKioKKyAqIChjKSBDb3B5cmlnaHQgMTk5MywgMTk5NCwgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQUxMIFJJR0hUUyBSRVNFUlZFRAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZQorICogYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKKyAqIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSEUgTUFURVJJQUwgRU1CT0RJRUQgT04gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBUTyBZT1UgIkFTLUlTIgorICogQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLAorICogSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCisgKiBHUkFQSElDUywgSU5DLiAgQkUgTElBQkxFIFRPIFlPVSBPUiBBTllPTkUgRUxTRSBGT1IgQU5ZIERJUkVDVCwKKyAqIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKKyAqIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sCisgKiBMT1NTIE9GIFBST0ZJVCwgTE9TUyBPRiBVU0UsIFNBVklOR1MgT1IgUkVWRU5VRSwgT1IgVEhFIENMQUlNUyBPRgorICogVEhJUkQgUEFSVElFUywgV0hFVEhFUiBPUiBOT1QgU0lMSUNPTiBHUkFQSElDUywgSU5DLiAgSEFTIEJFRU4KKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggTE9TUywgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogUE9TU0VTU0lPTiwgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cworICogVXNlLCBkdXBsaWNhdGlvbiwgb3IgZGlzY2xvc3VyZSBieSB0aGUgR292ZXJubWVudCBpcyBzdWJqZWN0IHRvCisgKiByZXN0cmljdGlvbnMgc2V0IGZvcnRoIGluIEZBUiA1Mi4yMjcuMTkoYykoMikgb3Igc3VicGFyYWdyYXBoCisgKiAoYykoMSkoaWkpIG9mIHRoZSBSaWdodHMgaW4gVGVjaG5pY2FsIERhdGEgYW5kIENvbXB1dGVyIFNvZnR3YXJlCisgKiBjbGF1c2UgYXQgREZBUlMgMjUyLjIyNy03MDEzIGFuZC9vciBpbiBzaW1pbGFyIG9yIHN1Y2Nlc3NvcgorICogY2xhdXNlcyBpbiB0aGUgRkFSIG9yIHRoZSBET0Qgb3IgTkFTQSBGQVIgU3VwcGxlbWVudC4KKyAqIFVucHVibGlzaGVkLS0gcmlnaHRzIHJlc2VydmVkIHVuZGVyIHRoZSBjb3B5cmlnaHQgbGF3cyBvZiB0aGUKKyAqIFVuaXRlZCBTdGF0ZXMuICBDb250cmFjdG9yL21hbnVmYWN0dXJlciBpcyBTaWxpY29uIEdyYXBoaWNzLAorICogSW5jLiwgMjAxMSBOLiAgU2hvcmVsaW5lIEJsdmQuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDAzOS03MzExLgorICoKKyAqIE9wZW5HTChUTSkgaXMgYSB0cmFkZW1hcmsgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImF0bGFudGlzLmgiCisvKiAqSU5ERU5ULU9GRiogKi8KK3N0YXRpYyBmbG9hdCBOMDAxWzNdID0gezAuMDE5MjQ5ICwwLjAxMTM0MCAsLTAuOTk5NzUwfTsKK3N0YXRpYyBmbG9hdCBOMDAyWzNdID0gey0wLjEzMjU3OSAsMC45NTQ1NDcgLDAuMjY2OTUyfTsKK3N0YXRpYyBmbG9hdCBOMDAzWzNdID0gey0wLjE5NjA2MSAsMC45ODAzOTIgLC0wLjAxOTc3OH07CitzdGF0aWMgZmxvYXQgTjAwNFszXSA9IHswLjY5NTQ2MSAsMC42MDQ3MDQgLDAuMzg4MTU4fTsKK3N0YXRpYyBmbG9hdCBOMDA1WzNdID0gezAuODcwNjAwICwwLjQyNTc1NCAsMC4yNDY1NTd9Oworc3RhdGljIGZsb2F0IE4wMDZbM10gPSB7LTAuODgxMTkxICwwLjM5MjAxMiAsMC4yNjQyNTF9Oworc3RhdGljIGZsb2F0IE4wMDhbM10gPSB7LTAuMzQxNDM3ICwwLjg4NzQ3NyAsMC4zMDk1MjN9Oworc3RhdGljIGZsb2F0IE4wMDlbM10gPSB7MC4xMjQwMzUgLC0wLjk5MjI3OCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wMTBbM10gPSB7MC4yNDI1MzYgLDAuMDAwMDAwICwtMC45NzAxNDN9Oworc3RhdGljIGZsb2F0IE4wMTFbM10gPSB7MC41ODgxNzIgLDAuMDAwMDAwICwwLjgwODczNn07CitzdGF0aWMgZmxvYXQgTjAxMlszXSA9IHswLjkyOTgyNCAsLTAuMzQwNjIzICwtMC4xMzkyOTh9Oworc3RhdGljIGZsb2F0IE4wMTNbM10gPSB7MC45NTQxODMgLDAuMjY3MTA4ICwtMC4xMzQ4NjV9Oworc3RhdGljIGZsb2F0IE4wMTRbM10gPSB7MC40OTUxMjcgLDAuODU1NDM2ICwtMC4xNTE5MTR9Oworc3RhdGljIGZsb2F0IE4wMTVbM10gPSB7LTAuMzkwMTk5ICwwLjkwNjU2OSAsLTAuMTYwODY3fTsKK3N0YXRpYyBmbG9hdCBOMDE2WzNdID0gey0wLjkyMzYwNSAsMC4zNTQ1ODEgLC0wLjE0NTY5Mn07CitzdGF0aWMgZmxvYXQgTjAxN1szXSA9IHstMC45NTU3OTYgLC0wLjI2MDY2NyAsLTAuMTM2MDM2fTsKK3N0YXRpYyBmbG9hdCBOMDE4WzNdID0gey0wLjUwMTI4MyAsLTAuODUzNDYyICwtMC4xNDI1NDB9Oworc3RhdGljIGZsb2F0IE4wMTlbM10gPSB7MC40MDUzMDAgLC0wLjkwMTk3NCAsLTAuMTQ4OTEzfTsKK3N0YXRpYyBmbG9hdCBOMDIwWzNdID0gezAuOTA5OTEzICwtMC4zOTI3NDYgLC0wLjEzMzQ1MX07CitzdGF0aWMgZmxvYXQgTjAyMVszXSA9IHswLjkzNjQ5NCAsMC4zMzExNDcgLC0wLjExNTQxNH07CitzdGF0aWMgZmxvYXQgTjAyMlszXSA9IHswLjYwMDEzMSAsMC43OTM3MjQgLC0wLjA5OTIyMn07CitzdGF0aWMgZmxvYXQgTjAyM1szXSA9IHstMC4yMzE1NTYgLDAuOTY4MzYxICwtMC4wOTMwNTN9Oworc3RhdGljIGZsb2F0IE4wMjRbM10gPSB7LTAuODQ0MzY5ICwwLjUyNTMzMCAsLTAuMTA1MjExfTsKK3N0YXRpYyBmbG9hdCBOMDI1WzNdID0gey0wLjk4MjcyNSAsLTAuMTM2MzI5ICwtMC4xMjUxNjR9Oworc3RhdGljIGZsb2F0IE4wMjZbM10gPSB7LTAuNTYwODQ0ICwtMC44MjI2NTQgLC0wLjA5MzI0MX07CitzdGF0aWMgZmxvYXQgTjAyN1szXSA9IHswLjI2Mzg4NCAsLTAuOTU5OTgxICwtMC4wOTM4MTd9Oworc3RhdGljIGZsb2F0IE4wMjhbM10gPSB7MC44NDIwNTcgLC0wLjUyNTE5MiAsLTAuMTIyOTM4fTsKK3N0YXRpYyBmbG9hdCBOMDI5WzNdID0gezAuOTIxNjIwICwwLjM2NzU2NSAsLTAuMTI0NTQ2fTsKK3N0YXRpYyBmbG9hdCBOMDMwWzNdID0gezAuNjEzOTI3ICwwLjc4NDEwOSAsLTAuMDkwOTE4fTsKK3N0YXRpYyBmbG9hdCBOMDMxWzNdID0gey0wLjQ0ODc1NCAsMC44ODgyNjEgLC0wLjA5ODAzN307CitzdGF0aWMgZmxvYXQgTjAzMlszXSA9IHstMC44OTE4NjUgLDAuNDM0Mzc2ICwtMC4xMjYwNzd9Oworc3RhdGljIGZsb2F0IE4wMzNbM10gPSB7LTAuODgxNDQ3ICwtMC40NDgwMTcgLC0wLjE0OTQzN307CitzdGF0aWMgZmxvYXQgTjAzNFszXSA9IHstMC4zNDU2NDcgLC0wLjkyMjA1NyAsLTAuMTc0MTgzfTsKK3N0YXRpYyBmbG9hdCBOMDM1WzNdID0gezAuMzA3OTk4ICwtMC45NDEzNzEgLC0wLjEzNzY4OH07CitzdGF0aWMgZmxvYXQgTjAzNlszXSA9IHswLjgwNjMxNiAsLTAuNTc0NjQ3ICwtMC4xNDAxMjR9Oworc3RhdGljIGZsb2F0IE4wMzdbM10gPSB7MC45NjEzNDYgLDAuMjMzNjQ2ICwtMC4xNDU2ODF9Oworc3RhdGljIGZsb2F0IE4wMzhbM10gPSB7MC40ODg0NTEgLDAuODY1NTg2ICwtMC4xMTAzNTF9Oworc3RhdGljIGZsb2F0IE4wMzlbM10gPSB7LTAuMzc0MjkwICwwLjkyMTk1MyAsLTAuMDk5NTUzfTsKK3N0YXRpYyBmbG9hdCBOMDQwWzNdID0gey0wLjkyODUwNCAsMC4zNDQ1MzMgLC0wLjEzODQ4NX07CitzdGF0aWMgZmxvYXQgTjA0MVszXSA9IHstMC45MTg0MTkgLC0wLjM3MTc5MiAsLTAuMTM1MTg5fTsKK3N0YXRpYyBmbG9hdCBOMDQyWzNdID0gey0wLjUyMDY2NiAsLTAuODMzNzA0ICwtMC4xODM5Njh9Oworc3RhdGljIGZsb2F0IE4wNDNbM10gPSB7MC4zMzkyMDQgLC0wLjkyMDI3MyAsLTAuMTk1MDM2fTsKK3N0YXRpYyBmbG9hdCBOMDQ0WzNdID0gezAuOTIxNDc1ICwtMC4zODczODIgLC0wLjAyODYzNn07CitzdGF0aWMgZmxvYXQgTjA0NVszXSA9IHswLjg0MjQ2NSAsMC41MzMzMzUgLC0wLjA3NjIwNH07CitzdGF0aWMgZmxvYXQgTjA0NlszXSA9IHswLjM4MDExMCAsMC45MjQ5MzkgLDAuMDAyMDczfTsKK3N0YXRpYyBmbG9hdCBOMDQ3WzNdID0gey0wLjI3NjEyOCAsMC45NjEwNzMgLC0wLjAwOTU3OX07CitzdGF0aWMgZmxvYXQgTjA0OFszXSA9IHstMC44Nzk2ODQgLDAuNDczMDAxICwtMC4wNDkyNTB9Oworc3RhdGljIGZsb2F0IE4wNDlbM10gPSB7LTAuOTQ3MTg0ICwtMC4zMTc2MTQgLC0wLjA0NDMyMX07CitzdGF0aWMgZmxvYXQgTjA1MFszXSA9IHstMC42NDIwNTkgLC0wLjc2NDkzMyAsLTAuMDUxMzYzfTsKK3N0YXRpYyBmbG9hdCBOMDUxWzNdID0gezAuNDY2Nzk0ICwtMC44ODA5MjEgLC0wLjA3Nzk5MH07CitzdGF0aWMgZmxvYXQgTjA1MlszXSA9IHswLjg5ODUwOSAsLTAuNDMyMjc3ICwwLjA3NjI3OX07CitzdGF0aWMgZmxvYXQgTjA1M1szXSA9IHswLjkzODk4NSAsMC4zMjgxNDEgLDAuMTAzMTA5fTsKK3N0YXRpYyBmbG9hdCBOMDU0WzNdID0gezAuNDQyNDIwICwwLjg5NTc0NSAsMC4wNDM2NDd9Oworc3RhdGljIGZsb2F0IE4wNTVbM10gPSB7LTAuMjU1MTYzICwwLjk2NjcyMyAsMC4wMTg0MDd9Oworc3RhdGljIGZsb2F0IE4wNTZbM10gPSB7LTAuODMzNzY5ICwwLjU0MDY1MCAsMC4xMTE5MjR9Oworc3RhdGljIGZsb2F0IE4wNTdbM10gPSB7LTAuOTUzNjUzICwtMC4yODk5MzkgLDAuMDgwNTA3fTsKK3N0YXRpYyBmbG9hdCBOMDU4WzNdID0gey0wLjY3MjM1NyAsLTAuNzMwNTI0ICwwLjExOTQ2MX07CitzdGF0aWMgZmxvYXQgTjA1OVszXSA9IHswLjUyMjI0OSAsLTAuODQ2NjUyICwwLjEwMjE1N307CitzdGF0aWMgZmxvYXQgTjA2MFszXSA9IHswLjg4NTg2OCAsLTAuNDI3NjMxICwwLjE3OTkxNH07CitzdGF0aWMgZmxvYXQgTjA2MlszXSA9IHswLjY0ODk0MiAsMC43NDMxMTYgLDAuMTYzMjU1fTsKK3N0YXRpYyBmbG9hdCBOMDYzWzNdID0gey0wLjU3ODk2NyAsMC44MDc3MzAgLDAuMTExMjE5fTsKK3N0YXRpYyBmbG9hdCBOMDY1WzNdID0gey0wLjkwOTg2NCAsLTAuMzUyMjAyICwwLjIxOTMyMX07CitzdGF0aWMgZmxvYXQgTjA2NlszXSA9IHstMC41MDI1NDEgLC0wLjgxODA5MCAsMC4yNzk2MTB9Oworc3RhdGljIGZsb2F0IE4wNjdbM10gPSB7MC4zMjI5MTkgLC0wLjkxNTM1OCAsMC4yNDA1MDR9Oworc3RhdGljIGZsb2F0IE4wNjhbM10gPSB7MC4yNDI1MzYgLDAuMDAwMDAwICwtMC45NzAxNDN9Oworc3RhdGljIGZsb2F0IE4wNjlbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA3MFszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDcxWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNzJbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA3M1szXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDc0WzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNzVbM10gPSB7MC4wMzEyMjAgLDAuOTk5MDI1ICwtMC4wMzEyMjB9Oworc3RhdGljIGZsb2F0IE4wNzZbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA3N1szXSA9IHswLjQ0NjgyMSAsMC44OTM2NDIgLDAuMDQxODg5fTsKK3N0YXRpYyBmbG9hdCBOMDc4WzNdID0gezAuODYzMDM1ICwtMC4xMDA5ODAgLDAuNDk0OTQ5fTsKK3N0YXRpYyBmbG9hdCBOMDc5WzNdID0gezAuNTg1NTk3ICwtMC44MDgyMTUgLDAuMDYyMTc0fTsKK3N0YXRpYyBmbG9hdCBOMDgwWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wODFbM10gPSB7MS4wMDAwMDAgLDAuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA4MlszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDgzWzNdID0gey0xLjAwMDAwMCAsMC4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDg0WzNdID0gey0wLjQ3ODg5MyAsMC44MzcxMjkgLC0wLjI2NDM0M307CitzdGF0aWMgZmxvYXQgTjA4NVszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDg2WzNdID0gezAuNzYzOTA5ICwwLjUzOTQ1NSAsLTAuMzU0MTYzfTsKK3N0YXRpYyBmbG9hdCBOMDg3WzNdID0gezAuNDQ2ODIxICwwLjg5MzY0MiAsMC4wNDE4ODl9Oworc3RhdGljIGZsb2F0IE4wODhbM10gPSB7MC4zODUxMzQgLC0wLjkwODI4OCAsMC4xNjMzNTJ9Oworc3RhdGljIGZsb2F0IE4wODlbM10gPSB7LTAuNjA1OTUyICwwLjc3OTI1MyAsLTAuMTU5OTYxfTsKK3N0YXRpYyBmbG9hdCBOMDkwWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTFbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5MlszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDkzWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTRbM10gPSB7MS4wMDAwMDAgLDAuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5NVszXSA9IHstMS4wMDAwMDAgLDAuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5NlszXSA9IHswLjY0NDQ0NCAsLTAuNjIxNTE2ICwwLjQ0NTQzM307CitzdGF0aWMgZmxvYXQgTjA5N1szXSA9IHstMC43NjA4OTYgLC0wLjQ3NDQxNiAsMC40NDI2ODF9Oworc3RhdGljIGZsb2F0IE4wOThbM10gPSB7MC42MzY4ODggLC0wLjQ2NDMxNCAsMC42MTU0NTZ9Oworc3RhdGljIGZsb2F0IE4wOTlbM10gPSB7LTAuNzEwMjk1ICwwLjY0NzAzOCAsMC4yNzcxNjh9Oworc3RhdGljIGZsb2F0IE4xMDBbM10gPSB7MC4wMDk2MDQgLDAuOTkzNjU1ICwwLjExMjA2M307CitzdGF0aWMgZmxvYXQgaVAwMDFbM10gPSB7MTguNzQsIDEzLjE5LCAzLjc2fTsKK3N0YXRpYyBmbG9hdCBQMDAxWzNdID0gezE4Ljc0LCAxMy4xOSwgMy43Nn07CitzdGF0aWMgZmxvYXQgUDAwMlszXSA9IHswLjAwLCAzOTAuNDIsIDEwMjkyLjU3fTsKK3N0YXRpYyBmbG9hdCBQMDAzWzNdID0gezU1LjgwLCA2MjIuMzEsIDgyNTQuMzV9Oworc3RhdGljIGZsb2F0IFAwMDRbM10gPSB7MjAuODAsIDI0Ny42NiwgMTA2NTIuMTN9Oworc3RhdGljIGZsb2F0IFAwMDVbM10gPSB7NDg3LjUxLCAxOTguMDUsIDkzNTAuNzh9Oworc3RhdGljIGZsb2F0IFAwMDZbM10gPSB7LTQ1Ny42MSwgMTk5LjA0LCA5MzUzLjAxfTsKK3N0YXRpYyBmbG9hdCBQMDA4WzNdID0gey0zNC42NywgMjQ3LjY0LCAxMDY2My43MX07CitzdGF0aWMgZmxvYXQgaVAwMDlbM10gPSB7OTcuNDYsIDY3LjYzLCA1OTMuODJ9Oworc3RhdGljIGZsb2F0IGlQMDEwWzNdID0gey04NC4zMywgNjcuNjMsIDU4OC4xOH07CitzdGF0aWMgZmxvYXQgaVAwMTFbM10gPSB7MTE4LjY5LCA4Ljk4LCAtNjYuOTF9Oworc3RhdGljIGZsb2F0IFAwMDlbM10gPSB7OTcuNDYsIDY3LjYzLCA1OTMuODJ9Oworc3RhdGljIGZsb2F0IFAwMTBbM10gPSB7LTg0LjMzLCA2Ny42MywgNTg4LjE4fTsKK3N0YXRpYyBmbG9hdCBQMDExWzNdID0gezExOC42OSwgOC45OCwgLTY2LjkxfTsKK3N0YXRpYyBmbG9hdCBpUDAxMlszXSA9IHsxNTYuNDgsIC0zMS45NSwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBpUDAxM1szXSA9IHsxNjIuMDAsIDExMC4yMiwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBpUDAxNFszXSA9IHs4OC4xNiwgMjIxLjY1LCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDE1WzNdID0gey02NS4yMSwgMjMxLjE2LCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDE2WzNdID0gey0xNTYuNDgsIDEyMS45NywgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBpUDAxN1szXSA9IHstMTYyLjAwLCAtMjMuOTMsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgaVAwMThbM10gPSB7LTg4LjE2LCAtMTM5LjEwLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDE5WzNdID0gezY1LjIxLCAtMTQ4LjYxLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDIwWzNdID0gezI0Ni44NywgLTk4LjczLCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBpUDAyMVszXSA9IHsyNTMuMTcsIDEyNy43NiwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgaVAwMjJbM10gPSB7MTMyLjM0LCAyNzAuNzcsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IGlQMDIzWzNdID0gey05Ny44OCwgMjg1LjA0LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBpUDAyNFszXSA9IHstMjIyLjk3LCAxMzkuODAsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IGlQMDI1WzNdID0gey0yMjUuMjksIC04Ni42OCwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgaVAwMjZbM10gPSB7LTEwOC40NCwgLTIyNC4xNSwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgaVAwMjdbM10gPSB7OTcuODgsIC0yMjEuNTYsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IGlQMDI4WzNdID0gezQxMC41NSwgLTIwMC42NiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMjlbM10gPSB7NDMyLjE5LCAxNDguNDIsIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IGlQMDMwWzNdID0gezIwMC42NiwgNDEwLjU1LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBpUDAzMVszXSA9IHstMTQ4LjQyLCA0MzIuMTksIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IGlQMDMyWzNdID0gey00MDcuNDgsIDE3MS44OCwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMzNbM10gPSB7LTQzMi4xOSwgLTE0OC40MiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMzRbM10gPSB7LTE0OC44OCwgLTMwOS43NCwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMzVbM10gPSB7MTU2LjM4LCAtMzIwLjE3LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBpUDAzNlszXSA9IHs1MjMuMzksIC0zMDMuODEsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDM3WzNdID0gezU3NC42NiwgMjc2Ljg0LCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBpUDAzOFszXSA9IHsyNDMuMDUsIDQ5Mi41MCwgNDQyNC41N307CitzdGF0aWMgZmxvYXQgaVAwMzlbM10gPSB7LTE5MS4yMywgNTIwLjEzLCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBpUDA0MFszXSA9IHstNTIzLjM5LCAzMDQuMDEsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDQxWzNdID0gey01NzQuNjYsIC0yMzEuODMsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDQyWzNdID0gey0yNjYuOTUsIC01NzguMTcsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDQzWzNdID0gezIxMS4xNCwgLTU3OS42NywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgaVAwNDRbM10gPSB7NjgwLjU3LCAtMzcwLjI3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA0NVszXSA9IHs4MzQuMDEsIDM2My4wOSwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNDZbM10gPSB7MzcxLjI5LCA2MTQuMTMsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IGlQMDQ3WzNdID0gey0yOTEuNDMsIDYyMS44NiwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNDhbM10gPSB7LTc4NC4xMywgMzYyLjYwLCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA0OVszXSA9IHstNzQzLjI5LCAtMzI1LjgyLCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA1MFszXSA9IHstMzgzLjI0LCAtODA0Ljc3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA1MVszXSA9IHsyODMuNDcsIC04NDYuMDksIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwMTJbM10gPSB7MTU2LjQ4LCAtMzEuOTUsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgUDAxM1szXSA9IHsxNjIuMDAsIDExMC4yMiwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE0WzNdID0gezg4LjE2LCAyMjEuNjUsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgUDAxNVszXSA9IHstNjUuMjEsIDIzMS4xNiwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE2WzNdID0gey0xNTYuNDgsIDEyMS45NywgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE3WzNdID0gey0xNjIuMDAsIC0yMy45MywgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE4WzNdID0gey04OC4xNiwgLTEzOS4xMCwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE5WzNdID0gezY1LjIxLCAtMTQ4LjYxLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IFAwMjBbM10gPSB7MjQ2Ljg3LCAtOTguNzMsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjFbM10gPSB7MjUzLjE3LCAxMjcuNzYsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjJbM10gPSB7MTMyLjM0LCAyNzAuNzcsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjNbM10gPSB7LTk3Ljg4LCAyODUuMDQsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjRbM10gPSB7LTIyMi45NywgMTM5LjgwLCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBQMDI1WzNdID0gey0yMjUuMjksIC04Ni42OCwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgUDAyNlszXSA9IHstMTA4LjQ0LCAtMjI0LjE1LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBQMDI3WzNdID0gezk3Ljg4LCAtMjIxLjU2LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBQMDI4WzNdID0gezQxMC41NSwgLTIwMC42NiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAyOVszXSA9IHs0MzIuMTksIDE0OC40MiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAzMFszXSA9IHsyMDAuNjYsIDQxMC41NSwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAzMVszXSA9IHstMTQ4LjQyLCA0MzIuMTksIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IFAwMzJbM10gPSB7LTQwNy40OCwgMTcxLjg4LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBQMDMzWzNdID0gey00MzIuMTksIC0xNDguNDIsIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IFAwMzRbM10gPSB7LTE0OC44OCwgLTMwOS43NCwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAzNVszXSA9IHsxNTYuMzgsIC0zMjAuMTcsIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IFAwMzZbM10gPSB7NTIzLjM5LCAtMzAzLjgxLCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDM3WzNdID0gezU3NC42NiwgMjc2Ljg0LCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDM4WzNdID0gezI0My4wNSwgNDkyLjUwLCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDM5WzNdID0gey0xOTEuMjMsIDUyMC4xMywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgUDA0MFszXSA9IHstNTIzLjM5LCAzMDQuMDEsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IFAwNDFbM10gPSB7LTU3NC42NiwgLTIzMS44MywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgUDA0MlszXSA9IHstMjY2Ljk1LCAtNTc4LjE3LCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDQzWzNdID0gezIxMS4xNCwgLTU3OS42NywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgUDA0NFszXSA9IHs2ODAuNTcsIC0zNzAuMjcsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNDVbM10gPSB7ODM0LjAxLCAzNjMuMDksIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNDZbM10gPSB7MzcxLjI5LCA2MTQuMTMsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNDdbM10gPSB7LTI5MS40MywgNjIxLjg2LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDQ4WzNdID0gey03ODQuMTMsIDM2Mi42MCwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgUDA0OVszXSA9IHstNzQzLjI5LCAtMzI1LjgyLCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDUwWzNdID0gey0zODMuMjQsIC04MDQuNzcsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNTFbM10gPSB7MjgzLjQ3LCAtODQ2LjA5LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDUyWzNdID0gezU5OS4wOSwgLTMzMi4yNCwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1M1szXSA9IHs3MzUuNDgsIDMwNi4yNiwgNzkxMS45Mn07CitzdGF0aWMgZmxvYXQgUDA1NFszXSA9IHszMjEuNTUsIDU1OC41MywgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1NVszXSA9IHstMjYwLjU0LCA1NTkuODQsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNTZbM10gPSB7LTY5OC42NiwgMzIwLjgzLCA3OTAyLjU5fTsKK3N0YXRpYyBmbG9hdCBQMDU3WzNdID0gey02NDMuMjksIC0yOTkuMTYsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNThbM10gPSB7LTM0MS40NywgLTcxOS4zMCwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1OVszXSA9IHsyNTIuNTcsIC03NTYuMTIsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNjBbM10gPSB7NDU4LjM5LCAtMjY1LjMxLCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDYyWzNdID0gezIyNC4wNCwgNDM4Ljk4LCA5MzY0Ljc3fTsKK3N0YXRpYyBmbG9hdCBQMDYzWzNdID0gey0xNjUuNzEsIDQ0MS4yNywgOTM1NS40NH07CitzdGF0aWMgZmxvYXQgUDA2NVszXSA9IHstNDczLjk5LCAtMjE5LjcxLCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDY2WzNdID0gey0yMTEuOTcsIC00NzkuODcsIDkzNTUuNDR9Oworc3RhdGljIGZsb2F0IFAwNjdbM10gPSB7MTkyLjg2LCAtNTA0LjAzLCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBpUDA2OFszXSA9IHstMTEyLjQ0LCA5LjI1LCAtNjQuNDJ9Oworc3RhdGljIGZsb2F0IGlQMDY5WzNdID0gezExNTUuNjMsIDAuMDAsIC0xODIuNDZ9Oworc3RhdGljIGZsb2F0IGlQMDcwWzNdID0gey0xMTQzLjEzLCAwLjAwLCAtMTgxLjU0fTsKK3N0YXRpYyBmbG9hdCBpUDA3MVszXSA9IHsxNDI0LjIzLCAwLjAwLCAtMzIyLjA5fTsKK3N0YXRpYyBmbG9hdCBpUDA3MlszXSA9IHstMTM2OC4wMSwgMC4wMCwgLTMxMC4zOH07CitzdGF0aWMgZmxvYXQgaVAwNzNbM10gPSB7MTI1NS41NywgMi4zMSwgMTE0LjA1fTsKK3N0YXRpYyBmbG9hdCBpUDA3NFszXSA9IHstMTE0OS4zOCwgMC4wMCwgMTE3LjEyfTsKK3N0YXRpYyBmbG9hdCBpUDA3NVszXSA9IHs3MTguMzYsIDAuMDAsIDQzMy4zNn07CitzdGF0aWMgZmxvYXQgaVAwNzZbM10gPSB7LTY1NS45MCwgMC4wMCwgNDMzLjM2fTsKK3N0YXRpYyBmbG9hdCBQMDY4WzNdID0gey0xMTIuNDQsIDkuMjUsIC02NC40Mn07CitzdGF0aWMgZmxvYXQgUDA2OVszXSA9IHsxMTU1LjYzLCAwLjAwLCAtMTgyLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDcwWzNdID0gey0xMTQzLjEzLCAwLjAwLCAtMTgxLjU0fTsKK3N0YXRpYyBmbG9hdCBQMDcxWzNdID0gezE0MjQuMjMsIDAuMDAsIC0zMjIuMDl9Oworc3RhdGljIGZsb2F0IFAwNzJbM10gPSB7LTEzNjguMDEsIDAuMDAsIC0zMTAuMzh9Oworc3RhdGljIGZsb2F0IFAwNzNbM10gPSB7MTI1NS41NywgMi4zMSwgMTE0LjA1fTsKK3N0YXRpYyBmbG9hdCBQMDc0WzNdID0gey0xMTQ5LjM4LCAwLjAwLCAxMTcuMTJ9Oworc3RhdGljIGZsb2F0IFAwNzVbM10gPSB7NzE4LjM2LCAwLjAwLCA0MzMuMzZ9Oworc3RhdGljIGZsb2F0IFAwNzZbM10gPSB7LTY1NS45MCwgMC4wMCwgNDMzLjM2fTsKK3N0YXRpYyBmbG9hdCBQMDc3WzNdID0gezEwNTguMDAsIC0yLjY2LCA3OTIzLjUxfTsKK3N0YXRpYyBmbG9hdCBQMDc4WzNdID0gey0xMDE2LjUxLCAtMTUuNDcsIDc5MDIuODd9Oworc3RhdGljIGZsb2F0IFAwNzlbM10gPSB7LTEzNjMuOTksIC00ODQuNTAsIDc1OTMuMzh9Oworc3RhdGljIGZsb2F0IFAwODBbM10gPSB7MTQ3OC4wOSwgLTg2MS40NywgNzA5OC4xMn07CitzdGF0aWMgZmxvYXQgUDA4MVszXSA9IHsxMzM4LjA2LCAtMjg0LjY4LCA3MDI0LjE1fTsKK3N0YXRpYyBmbG9hdCBQMDgyWzNdID0gey0xNTQ1LjUxLCAtODYwLjY0LCA3MTA2LjYwfTsKK3N0YXRpYyBmbG9hdCBQMDgzWzNdID0gezEwNjMuMTksIC03MC40NiwgNzQ2Ni42MH07CitzdGF0aWMgZmxvYXQgUDA4NFszXSA9IHstMTM2OS4xOCwgLTI4OC4xMSwgNzAxNS4zNH07CitzdGF0aWMgZmxvYXQgUDA4NVszXSA9IHsxMzQ4LjQ0LCAtNDgyLjUwLCA3NTkxLjQxfTsKK3N0YXRpYyBmbG9hdCBQMDg2WzNdID0gey0xMDE1LjQ1LCAtOTYuODAsIDc0NzQuODZ9Oworc3RhdGljIGZsb2F0IFAwODdbM10gPSB7NzMxLjA0LCAxNDguMzgsIDc2ODIuNTh9Oworc3RhdGljIGZsb2F0IFAwODhbM10gPSB7LTY5Ny4wMywgMTUxLjgyLCA3NjY4LjgxfTsKK3N0YXRpYyBmbG9hdCBQMDg5WzNdID0gey02ODYuODIsIDE1Ny4wOSwgNzkyMi4yOX07CitzdGF0aWMgZmxvYXQgUDA5MFszXSA9IHs3MjQuNzMsIDE0Ny43NSwgNzkzMS4zOX07CitzdGF0aWMgZmxvYXQgaVAwOTFbM10gPSB7MC4wMCwgMzI3LjEwLCAyMzQ2LjU1fTsKK3N0YXRpYyBmbG9hdCBpUDA5MlszXSA9IHswLjAwLCA1NTIuMjgsIDIzMTEuMzF9Oworc3RhdGljIGZsb2F0IGlQMDkzWzNdID0gezAuMDAsIDcyMS4xNiwgMjE2Ni40MX07CitzdGF0aWMgZmxvYXQgaVAwOTRbM10gPSB7MC4wMCwgNjkzLjQyLCAyMzg4LjgwfTsKK3N0YXRpYyBmbG9hdCBpUDA5NVszXSA9IHswLjAwLCAzODkuNDQsIDI4NTkuOTd9Oworc3RhdGljIGZsb2F0IFAwOTFbM10gPSB7MC4wMCwgMzI3LjEwLCAyMzQ2LjU1fTsKK3N0YXRpYyBmbG9hdCBQMDkyWzNdID0gezAuMDAsIDU1Mi4yOCwgMjMxMS4zMX07CitzdGF0aWMgZmxvYXQgUDA5M1szXSA9IHswLjAwLCA3MjEuMTYsIDIxNjYuNDF9Oworc3RhdGljIGZsb2F0IFAwOTRbM10gPSB7MC4wMCwgNjkzLjQyLCAyMzg4LjgwfTsKK3N0YXRpYyBmbG9hdCBQMDk1WzNdID0gezAuMDAsIDM4OS40NCwgMjg1OS45N307CitzdGF0aWMgZmxvYXQgaVAwOTZbM10gPSB7MjIyLjAyLCAtMTgzLjY3LCAxMDI2Ni44OX07CitzdGF0aWMgZmxvYXQgaVAwOTdbM10gPSB7LTEyOC45MCwgLTE4Mi43MCwgMTAyNjYuODl9Oworc3RhdGljIGZsb2F0IGlQMDk4WzNdID0gezQxLjA0LCA4OC4zMSwgMTA2NTkuMzZ9Oworc3RhdGljIGZsb2F0IGlQMDk5WzNdID0gey00OC43MywgODguMzAsIDEwNjU5LjM2fTsKK3N0YXRpYyBmbG9hdCBQMDk2WzNdID0gezIyMi4wMiwgLTE4My42NywgMTAyNjYuODl9Oworc3RhdGljIGZsb2F0IFAwOTdbM10gPSB7LTEyOC45MCwgLTE4Mi43MCwgMTAyNjYuODl9Oworc3RhdGljIGZsb2F0IFAwOThbM10gPSB7NDEuMDQsIDg4LjMxLCAxMDY1OS4zNn07CitzdGF0aWMgZmxvYXQgUDA5OVszXSA9IHstNDguNzMsIDg4LjMwLCAxMDY1OS4zNn07CitzdGF0aWMgZmxvYXQgUDEwMFszXSA9IHswLjAwLCA2MDMuNDIsIDkzNDAuNjh9Oworc3RhdGljIGZsb2F0IFAxMDRbM10gPSB7LTkuODYsIDU2Ny42MiwgNzg1OC42NX07CitzdGF0aWMgZmxvYXQgUDEwNVszXSA9IHszMS45NiwgNTY1LjI3LCA3OTA4LjQ2fTsKK3N0YXRpYyBmbG9hdCBQMTA2WzNdID0gezIyLjc1LCA1NjguMTMsIDc3ODIuODN9Oworc3RhdGljIGZsb2F0IFAxMDdbM10gPSB7NTguOTMsIDU2OC40MiwgNzc3NS45NH07CitzdGF0aWMgZmxvYXQgUDEwOFszXSA9IHs1NS45MSwgNTY1LjU5LCA3OTA1Ljg2fTsKK3N0YXRpYyBmbG9hdCBQMTA5WzNdID0gezk5LjIxLCA1NjYuMDAsIDc4NTguNjV9Oworc3RhdGljIGZsb2F0IFAxMTBbM10gPSB7LTQ5OC44MywgMTQ4LjE0LCA5MTM1LjEwfTsKK3N0YXRpYyBmbG9hdCBQMTExWzNdID0gey00OTUuNDYsIDEzMy4yNCwgOTE1OC40OH07CitzdGF0aWMgZmxvYXQgUDExMlszXSA9IHstNDkwLjgyLCAxNDYuMjMsIDkxODIuNzZ9Oworc3RhdGljIGZsb2F0IFAxMTNbM10gPSB7LTQ4OS41NSwgMTc0LjExLCA5MTgzLjY2fTsKK3N0YXRpYyBmbG9hdCBQMTE0WzNdID0gey00OTIuOTIsIDE4OS4wMCwgOTE2MC4yOH07CitzdGF0aWMgZmxvYXQgUDExNVszXSA9IHstNDk3LjU2LCAxNzYuMDIsIDkxMzYuMDB9Oworc3RhdGljIGZsb2F0IFAxMTZbM10gPSB7NTI2LjU0LCAxNjkuNjgsIDkxMzcuNzB9Oworc3RhdGljIGZsb2F0IFAxMTdbM10gPSB7NTIzLjQ5LCAxODQuODUsIDkxNjEuNDJ9Oworc3RhdGljIGZsb2F0IFAxMThbM10gPSB7NTE4LjU2LCAxNzEuNzgsIDkxODYuMDZ9Oworc3RhdGljIGZsb2F0IFAxMTlbM10gPSB7NTE2LjY4LCAxNDMuNTMsIDkxODYuOTh9Oworc3RhdGljIGZsb2F0IFAxMjBbM10gPSB7NTE5LjczLCAxMjguMzYsIDkxNjMuMjZ9Oworc3RhdGljIGZsb2F0IFAxMjFbM10gPSB7NTI0LjY2LCAxNDEuNDMsIDkxMzguNjJ9OworLyogKklOREVOVC1PTiogKi8KKwordm9pZAorV2hhbGUwMDEodm9pZCkKK3sKKworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjgpOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsTm9ybWFsM2Z2KE4wNzYpOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTApOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbE5vcm1hbDNmdihOMDc2KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsTm9ybWFsM2Z2KE4wNzIpOworICAgIGdsVmVydGV4M2Z2KFAwNzIpOworICAgIGdsTm9ybWFsM2Z2KE4wNzQpOworICAgIGdsVmVydGV4M2Z2KFAwNzQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDcyKTsKKyAgICBnbFZlcnRleDNmdihQMDcyKTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbE5vcm1hbDNmdihOMDc0KTsKKyAgICBnbFZlcnRleDNmdihQMDc0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsTm9ybWFsM2Z2KE4wNjgpOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsTm9ybWFsM2Z2KE4wNzYpOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc2KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbE5vcm1hbDNmdihOMDEwKTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMDIodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc1KTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbE5vcm1hbDNmdihOMDA5KTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsTm9ybWFsM2Z2KE4wNzUpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsTm9ybWFsM2Z2KE4wNzMpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDcxKTsKKyAgICBnbFZlcnRleDNmdihQMDcxKTsKKyAgICBnbE5vcm1hbDNmdihOMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbE5vcm1hbDNmdihOMDczKTsKKyAgICBnbFZlcnRleDNmdihQMDczKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNzUpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbE5vcm1hbDNmdihOMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbE5vcm1hbDNmdihOMDc1KTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA3NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsTm9ybWFsM2Z2KE4wNzEpOworICAgIGdsVmVydGV4M2Z2KFAwNzEpOworICAgIGdsTm9ybWFsM2Z2KE4wNzMpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDAzKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE3KTsKKyAgICBnbFZlcnRleDNmdihQMDE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMDQodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAwNSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDA2KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDkyKTsKKyAgICBnbFZlcnRleDNmdihQMDkyKTsKKyAgICBnbE5vcm1hbDNmdihOMDkzKTsKKyAgICBnbFZlcnRleDNmdihQMDkzKTsKKyAgICBnbE5vcm1hbDNmdihOMDk0KTsKKyAgICBnbFZlcnRleDNmdihQMDk0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA5NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTIpOworICAgIGdsVmVydGV4M2Z2KFAwOTIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTEpOworICAgIGdsVmVydGV4M2Z2KFAwOTEpOworICAgIGdsTm9ybWFsM2Z2KE4wOTUpOworICAgIGdsVmVydGV4M2Z2KFAwOTUpOworICAgIGdsTm9ybWFsM2Z2KE4wOTQpOworICAgIGdsVmVydGV4M2Z2KFAwOTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDkxKTsKKyAgICBnbFZlcnRleDNmdihQMDkxKTsKKyAgICBnbE5vcm1hbDNmdihOMDkyKTsKKyAgICBnbFZlcnRleDNmdihQMDkyKTsKKyAgICBnbE5vcm1hbDNmdihOMDk0KTsKKyAgICBnbFZlcnRleDNmdihQMDk0KTsKKyAgICBnbE5vcm1hbDNmdihOMDk1KTsKKyAgICBnbFZlcnRleDNmdihQMDk1KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAwNyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDM0KTsKKyAgICBnbFZlcnRleDNmdihQMDM0KTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDA4KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMDkodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbE5vcm1hbDNmdihOMDU3KTsKKyAgICBnbFZlcnRleDNmdihQMDU3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxMCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODEpOworICAgIGdsVmVydGV4M2Z2KFAwODEpOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsTm9ybWFsM2Z2KE4wODcpOworICAgIGdsVmVydGV4M2Z2KFAwODcpOworICAgIGdsTm9ybWFsM2Z2KE4wOTApOworICAgIGdsVmVydGV4M2Z2KFAwOTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgxKTsKKyAgICBnbFZlcnRleDNmdihQMDgxKTsKKyAgICBnbE5vcm1hbDNmdihOMDgwKTsKKyAgICBnbFZlcnRleDNmdihQMDgwKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg3KTsKKyAgICBnbFZlcnRleDNmdihQMDg3KTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMTEodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODIpOworICAgIGdsVmVydGV4M2Z2KFAwODIpOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wNzkpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg0KTsKKyAgICBnbFZlcnRleDNmdihQMDg0KTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wODgpOworICAgIGdsVmVydGV4M2Z2KFAwODgpOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg4KTsKKyAgICBnbFZlcnRleDNmdihQMDg4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg5KTsKKyAgICBnbFZlcnRleDNmdihQMDg5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODkpOworICAgIGdsVmVydGV4M2Z2KFAwODkpOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDg0KTsKKyAgICBnbFZlcnRleDNmdihQMDg0KTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wODIpOworICAgIGdsVmVydGV4M2Z2KFAwODIpOworICAgIGdsTm9ybWFsM2Z2KE4wNzkpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDEyKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wNjcpOworICAgIGdsVmVydGV4M2Z2KFAwNjcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxMyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTcpOworICAgIGdsVmVydGV4M2Z2KFAwOTcpOworICAgIGdsTm9ybWFsM2Z2KE4wOTYpOworICAgIGdsVmVydGV4M2Z2KFAwOTYpOworICAgIGdsTm9ybWFsM2Z2KE4wOTgpOworICAgIGdsVmVydGV4M2Z2KFAwOTgpOworICAgIGdsTm9ybWFsM2Z2KE4wOTkpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wOTYpOworICAgIGdsVmVydGV4M2Z2KFAwOTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDk2KTsKKyAgICBnbFZlcnRleDNmdihQMDk2KTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDk4KTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsTm9ybWFsM2Z2KE4wOTcpOworICAgIGdsVmVydGV4M2Z2KFAwOTcpOworICAgIGdsTm9ybWFsM2Z2KE4wOTkpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDk5KTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxNCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4wMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDA0KTsKKyAgICBnbFZlcnRleDNmdihQMDA0KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxNSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMTYodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAxMDQpOworICAgIGdsVmVydGV4M2Z2KFAxMDUpOworICAgIGdsVmVydGV4M2Z2KFAxMDYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMTA3KTsKKyAgICBnbFZlcnRleDNmdihQMTA4KTsKKyAgICBnbFZlcnRleDNmdihQMTA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAxMTYpOworICAgIGdsVmVydGV4M2Z2KFAxMTcpOworICAgIGdsVmVydGV4M2Z2KFAxMTgpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMjApOworICAgIGdsVmVydGV4M2Z2KFAxMjEpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RyYXdXaGFsZShmaXNoUmVjICogZmlzaCkKK3sKKyAgICBmbG9hdCBzZWcwLCBzZWcxLCBzZWcyLCBzZWczLCBzZWc0LCBzZWc1LCBzZWc2LCBzZWc3OworICAgIGZsb2F0IHBpdGNoLCB0aHJhc2gsIGNob21wOworCisgICAgZmlzaC0+aHRhaWwgPSAoaW50KSAoZmlzaC0+aHRhaWwgLSAoaW50KSAoNS4wICogZmlzaC0+dikpICUgMzYwOworCisgICAgdGhyYXNoID0gNzAuMCAqIGZpc2gtPnY7CisKKyAgICBzZWcwID0gMS41ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCkgKiBSUkFEKTsKKyAgICBzZWcxID0gMi41ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDEwLjApICogUlJBRCk7CisgICAgc2VnMiA9IDMuNyAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyAxNS4wKSAqIFJSQUQpOworICAgIHNlZzMgPSA0LjggKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgMjMuMCkgKiBSUkFEKTsKKyAgICBzZWc0ID0gNi4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDI4LjApICogUlJBRCk7CisgICAgc2VnNSA9IDYuNSAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyAzNS4wKSAqIFJSQUQpOworICAgIHNlZzYgPSA2LjUgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgNDAuMCkgKiBSUkFEKTsKKyAgICBzZWc3ID0gNi41ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDU1LjApICogUlJBRCk7CisKKyAgICBwaXRjaCA9IGZpc2gtPnYgKiBzaW4oKGZpc2gtPmh0YWlsIC0gMTYwLjApICogUlJBRCk7CisKKyAgICBjaG9tcCA9IDAuMDsKKyAgICBpZiAoZmlzaC0+diA+IDIuMCkgeworICAgICAgICBjaG9tcCA9IC0oZmlzaC0+diAtIDIuMCkgKiAyMDAuMDsKKyAgICB9CisgICAgUDAxMlsxXSA9IGlQMDEyWzFdICsgc2VnNTsKKyAgICBQMDEzWzFdID0gaVAwMTNbMV0gKyBzZWc1OworICAgIFAwMTRbMV0gPSBpUDAxNFsxXSArIHNlZzU7CisgICAgUDAxNVsxXSA9IGlQMDE1WzFdICsgc2VnNTsKKyAgICBQMDE2WzFdID0gaVAwMTZbMV0gKyBzZWc1OworICAgIFAwMTdbMV0gPSBpUDAxN1sxXSArIHNlZzU7CisgICAgUDAxOFsxXSA9IGlQMDE4WzFdICsgc2VnNTsKKyAgICBQMDE5WzFdID0gaVAwMTlbMV0gKyBzZWc1OworCisgICAgUDAyMFsxXSA9IGlQMDIwWzFdICsgc2VnNDsKKyAgICBQMDIxWzFdID0gaVAwMjFbMV0gKyBzZWc0OworICAgIFAwMjJbMV0gPSBpUDAyMlsxXSArIHNlZzQ7CisgICAgUDAyM1sxXSA9IGlQMDIzWzFdICsgc2VnNDsKKyAgICBQMDI0WzFdID0gaVAwMjRbMV0gKyBzZWc0OworICAgIFAwMjVbMV0gPSBpUDAyNVsxXSArIHNlZzQ7CisgICAgUDAyNlsxXSA9IGlQMDI2WzFdICsgc2VnNDsKKyAgICBQMDI3WzFdID0gaVAwMjdbMV0gKyBzZWc0OworCisgICAgUDAyOFsxXSA9IGlQMDI4WzFdICsgc2VnMjsKKyAgICBQMDI5WzFdID0gaVAwMjlbMV0gKyBzZWcyOworICAgIFAwMzBbMV0gPSBpUDAzMFsxXSArIHNlZzI7CisgICAgUDAzMVsxXSA9IGlQMDMxWzFdICsgc2VnMjsKKyAgICBQMDMyWzFdID0gaVAwMzJbMV0gKyBzZWcyOworICAgIFAwMzNbMV0gPSBpUDAzM1sxXSArIHNlZzI7CisgICAgUDAzNFsxXSA9IGlQMDM0WzFdICsgc2VnMjsKKyAgICBQMDM1WzFdID0gaVAwMzVbMV0gKyBzZWcyOworCisgICAgUDAzNlsxXSA9IGlQMDM2WzFdICsgc2VnMTsKKyAgICBQMDM3WzFdID0gaVAwMzdbMV0gKyBzZWcxOworICAgIFAwMzhbMV0gPSBpUDAzOFsxXSArIHNlZzE7CisgICAgUDAzOVsxXSA9IGlQMDM5WzFdICsgc2VnMTsKKyAgICBQMDQwWzFdID0gaVAwNDBbMV0gKyBzZWcxOworICAgIFAwNDFbMV0gPSBpUDA0MVsxXSArIHNlZzE7CisgICAgUDA0MlsxXSA9IGlQMDQyWzFdICsgc2VnMTsKKyAgICBQMDQzWzFdID0gaVAwNDNbMV0gKyBzZWcxOworCisgICAgUDA0NFsxXSA9IGlQMDQ0WzFdICsgc2VnMDsKKyAgICBQMDQ1WzFdID0gaVAwNDVbMV0gKyBzZWcwOworICAgIFAwNDZbMV0gPSBpUDA0NlsxXSArIHNlZzA7CisgICAgUDA0N1sxXSA9IGlQMDQ3WzFdICsgc2VnMDsKKyAgICBQMDQ4WzFdID0gaVAwNDhbMV0gKyBzZWcwOworICAgIFAwNDlbMV0gPSBpUDA0OVsxXSArIHNlZzA7CisgICAgUDA1MFsxXSA9IGlQMDUwWzFdICsgc2VnMDsKKyAgICBQMDUxWzFdID0gaVAwNTFbMV0gKyBzZWcwOworCisgICAgUDAwOVsxXSA9IGlQMDA5WzFdICsgc2VnNjsKKyAgICBQMDEwWzFdID0gaVAwMTBbMV0gKyBzZWc2OworICAgIFAwNzVbMV0gPSBpUDA3NVsxXSArIHNlZzY7CisgICAgUDA3NlsxXSA9IGlQMDc2WzFdICsgc2VnNjsKKworICAgIFAwMDFbMV0gPSBpUDAwMVsxXSArIHNlZzc7CisgICAgUDAxMVsxXSA9IGlQMDExWzFdICsgc2VnNzsKKyAgICBQMDY4WzFdID0gaVAwNjhbMV0gKyBzZWc3OworICAgIFAwNjlbMV0gPSBpUDA2OVsxXSArIHNlZzc7CisgICAgUDA3MFsxXSA9IGlQMDcwWzFdICsgc2VnNzsKKyAgICBQMDcxWzFdID0gaVAwNzFbMV0gKyBzZWc3OworICAgIFAwNzJbMV0gPSBpUDA3MlsxXSArIHNlZzc7CisgICAgUDA3M1sxXSA9IGlQMDczWzFdICsgc2VnNzsKKyAgICBQMDc0WzFdID0gaVAwNzRbMV0gKyBzZWc3OworCisgICAgUDA5MVsxXSA9IGlQMDkxWzFdICsgc2VnMyAqIDEuMTsKKyAgICBQMDkyWzFdID0gaVAwOTJbMV0gKyBzZWczOworICAgIFAwOTNbMV0gPSBpUDA5M1sxXSArIHNlZzM7CisgICAgUDA5NFsxXSA9IGlQMDk0WzFdICsgc2VnMzsKKyAgICBQMDk1WzFdID0gaVAwOTVbMV0gKyBzZWczICogMC45OworCisgICAgUDA5OVsxXSA9IGlQMDk5WzFdICsgY2hvbXA7CisgICAgUDA5OFsxXSA9IGlQMDk4WzFdICsgY2hvbXA7CisgICAgUDA5N1sxXSA9IGlQMDk3WzFdICsgY2hvbXA7CisgICAgUDA5NlsxXSA9IGlQMDk2WzFdICsgY2hvbXA7CisKKyAgICBnbFB1c2hNYXRyaXgoKTsKKworICAgIGdsUm90YXRlZihwaXRjaCwgMS4wLCAwLjAsIDAuMCk7CisKKyAgICBnbFRyYW5zbGF0ZWYoMC4wLCAwLjAsIDgwMDAuMCk7CisKKyAgICBnbFJvdGF0ZWYoMTgwLjAsIDAuMCwgMS4wLCAwLjApOworCisgICAgZ2xTY2FsZWYoMy4wLCAzLjAsIDMuMCk7CisKKyAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworCisgICAgV2hhbGUwMDEoKTsKKyAgICBXaGFsZTAwMigpOworICAgIFdoYWxlMDAzKCk7CisgICAgV2hhbGUwMDQoKTsKKyAgICBXaGFsZTAwNSgpOworICAgIFdoYWxlMDA2KCk7CisgICAgV2hhbGUwMDcoKTsKKyAgICBXaGFsZTAwOCgpOworICAgIFdoYWxlMDA5KCk7CisgICAgV2hhbGUwMTAoKTsKKyAgICBXaGFsZTAxMSgpOworICAgIFdoYWxlMDEyKCk7CisgICAgV2hhbGUwMTMoKTsKKyAgICBXaGFsZTAxNCgpOworICAgIFdoYWxlMDE1KCk7CisgICAgV2hhbGUwMTYoKTsKKworICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworCisgICAgZ2xQb3BNYXRyaXgoKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vbWFpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlU25vd0xlb3BhcmQvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3OTRiMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVNub3dMZW9wYXJkL1NETCBPcGVuR0wgQXBwbGljYXRpb24vbWFpbi5jCkBAIC0wLDAgKzEsMTc5IEBACisKKy8qIFNpbXBsZSBwcm9ncmFtOiAgQ3JlYXRlIGEgYmxhbmsgd2luZG93LCB3YWl0IGZvciBrZXlwcmVzcywgcXVpdC4KKworICAgUGxlYXNlIHNlZSB0aGUgU0RMIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gdXNpbmcgdGhlIFNETCBBUEk6CisgICAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vU0RML2RvY3MuaHRtbAorKi8KKyAgIAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKK2V4dGVybiB2b2lkIEF0bGFudGlzX0luaXQgKCk7CitleHRlcm4gdm9pZCBBdGxhbnRpc19SZXNoYXBlIChpbnQgdywgaW50IGgpOworZXh0ZXJuIHZvaWQgQXRsYW50aXNfQW5pbWF0ZSAoKTsKK2V4dGVybiB2b2lkIEF0bGFudGlzX0Rpc3BsYXkgKCk7CisKK3N0YXRpYyBTRExfU3VyZmFjZSAqZ1NjcmVlbjsKKworc3RhdGljIHZvaWQgaW5pdEF0dHJpYnV0ZXMgKCkKK3sKKyAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzIHdlIHdhbnQgZm9yIHRoZSBPcGVuR0wgY29udGV4dAorICAgIAorICAgIGludCB2YWx1ZTsKKyAgICAKKyAgICAvLyBEb24ndCBzZXQgY29sb3IgYml0IHNpemVzIChTRExfR0xfUkVEX1NJWkUsIGV0YykKKyAgICAvLyAgICBNYWMgT1MgWCB3aWxsIGFsd2F5cyB1c2UgOC04LTgtOCBBUkdCIGZvciAzMi1iaXQgc2NyZWVucyBhbmQKKyAgICAvLyAgICA1LTUtNSBSR0IgZm9yIDE2LWJpdCBzY3JlZW5zCisgICAgCisgICAgLy8gUmVxdWVzdCBhIDE2LWJpdCBkZXB0aCBidWZmZXIgKHdpdGhvdXQgdGhpcywgdGhlcmUgaXMgbm8gZGVwdGggYnVmZmVyKQorICAgIHZhbHVlID0gMTY7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSAoU0RMX0dMX0RFUFRIX1NJWkUsIHZhbHVlKTsKKyAgICAKKyAgICAKKyAgICAvLyBSZXF1ZXN0IGRvdWJsZS1idWZmZXJlZCBPcGVuR0wKKyAgICAvLyAgICAgVGhlIGZhY3QgdGhhdCB3aW5kb3dzIGFyZSBkb3VibGUtYnVmZmVyZWQgb24gTWFjIE9TIFggaGFzIG5vIGVmZmVjdAorICAgIC8vICAgICBvbiBPcGVuR0wgZG91YmxlIGJ1ZmZlcmluZy4KKyAgICB2YWx1ZSA9IDE7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSAoU0RMX0dMX0RPVUJMRUJVRkZFUiwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBwcmludEF0dHJpYnV0ZXMgKCkKK3sKKyAgICAvLyBQcmludCBvdXQgYXR0cmlidXRlcyBvZiB0aGUgY29udGV4dCB3ZSBjcmVhdGVkCisgICAgaW50IG5BdHRyOworICAgIGludCBpOworICAgIAorICAgIGludCAgYXR0cltdID0geyBTRExfR0xfUkVEX1NJWkUsIFNETF9HTF9CTFVFX1NJWkUsIFNETF9HTF9HUkVFTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBTRExfR0xfQUxQSEFfU0laRSwgU0RMX0dMX0JVRkZFUl9TSVpFLCBTRExfR0xfREVQVEhfU0laRSB9OworICAgICAgICAgICAgICAgICAgICAKKyAgICBjaGFyICpkZXNjW10gPSB7ICJSZWQgc2l6ZTogJWQgYml0c1xuIiwgIkJsdWUgc2l6ZTogJWQgYml0c1xuIiwgIkdyZWVuIHNpemU6ICVkIGJpdHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAiQWxwaGEgc2l6ZTogJWQgYml0c1xuIiwgIkNvbG9yIGJ1ZmZlciBzaXplOiAlZCBiaXRzXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICJEZXB0aCBidWZlciBzaXplOiAlZCBiaXRzXG4iIH07CisKKyAgICBuQXR0ciA9IHNpemVvZihhdHRyKSAvIHNpemVvZihpbnQpOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBuQXR0cjsgaSsrKSB7CisgICAgCisgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgU0RMX0dMX0dldEF0dHJpYnV0ZSAoYXR0cltpXSwgJnZhbHVlKTsKKyAgICAgICAgcHJpbnRmIChkZXNjW2ldLCB2YWx1ZSk7CisgICAgfSAKK30KKworc3RhdGljIHZvaWQgY3JlYXRlU3VyZmFjZSAoaW50IGZ1bGxzY3JlZW4pCit7CisgICAgVWludDMyIGZsYWdzID0gMDsKKyAgICAKKyAgICBmbGFncyA9IFNETF9PUEVOR0w7CisgICAgaWYgKGZ1bGxzY3JlZW4pCisgICAgICAgIGZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworICAgIAorICAgIC8vIENyZWF0ZSB3aW5kb3cKKyAgICBnU2NyZWVuID0gU0RMX1NldFZpZGVvTW9kZSAoNjQwLCA0ODAsIDAsIGZsYWdzKTsKKyAgICBpZiAoZ1NjcmVlbiA9PSBOVUxMKSB7CisJCQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZG4ndCBzZXQgNjQweDQ4MCBPcGVuR0wgdmlkZW8gbW9kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgIFNETF9HZXRFcnJvcigpKTsKKwkJU0RMX1F1aXQoKTsKKwkJZXhpdCgyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRHTCAoKQoreworICAgIEF0bGFudGlzX0luaXQgKCk7CisgICAgQXRsYW50aXNfUmVzaGFwZSAoZ1NjcmVlbi0+dywgZ1NjcmVlbi0+aCk7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdHTCAoKQoreworICAgIEF0bGFudGlzX0FuaW1hdGUgKCk7CisgICAgQXRsYW50aXNfRGlzcGxheSAoKTsKK30KKworc3RhdGljIHZvaWQgbWFpbkxvb3AgKCkKK3sKKyAgICBTRExfRXZlbnQgZXZlbnQ7CisgICAgaW50IGRvbmUgPSAwOworICAgIGludCBmcHMgPSAyNDsKKwlpbnQgZGVsYXkgPSAxMDAwL2ZwczsKKyAgICBpbnQgdGhlblRpY2tzID0gLTE7CisgICAgaW50IG5vd1RpY2tzOworICAgIAorICAgIHdoaWxlICggIWRvbmUgKSB7CisKKwkJLyogQ2hlY2sgZm9yIGV2ZW50cyAqLworCQl3aGlsZSAoIFNETF9Qb2xsRXZlbnQgKCZldmVudCkgKSB7CisJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKworCQkJCWNhc2UgU0RMX01PVVNFTU9USU9OOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX0tFWURPV046CisJCQkJCS8qIEFueSBrZXlwcmVzcyBxdWl0cyB0aGUgYXBwLi4uICovCisJCQkJY2FzZSBTRExfUVVJVDoKKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisgICAgCisgICAgICAgIC8vIERyYXcgYXQgMjQgaHoKKyAgICAgICAgLy8gICAgIFRoaXMgYXBwcm9hY2ggaXMgbm90IG5vcm1hbGx5IHJlY29tbWVuZGVkIC0gaXQgaXMgYmV0dGVyIHRvCisgICAgICAgIC8vICAgICB1c2UgdGltZS1iYXNlZCBhbmltYXRpb24gYW5kIHJ1biBhcyBmYXN0IGFzIHBvc3NpYmxlCisgICAgICAgIGRyYXdHTCAoKTsKKyAgICAgICAgU0RMX0dMX1N3YXBCdWZmZXJzICgpOworCisgICAgICAgIC8vIFRpbWUgaG93IGxvbmcgZWFjaCBkcmF3LXN3YXAtZGVsYXkgY3ljbGUgdGFrZXMKKyAgICAgICAgLy8gYW5kIGFkanVzdCBkZWxheSB0byBnZXQgY2xvc2VyIHRvIHRhcmdldCBmcmFtZXJhdGUKKyAgICAgICAgaWYgKHRoZW5UaWNrcyA+IDApIHsKKyAgICAgICAgICAgIG5vd1RpY2tzID0gU0RMX0dldFRpY2tzICgpOworICAgICAgICAgICAgZGVsYXkgKz0gKDEwMDAvZnBzIC0gKG5vd1RpY2tzLXRoZW5UaWNrcykpOworICAgICAgICAgICAgdGhlblRpY2tzID0gbm93VGlja3M7CisgICAgICAgICAgICBpZiAoZGVsYXkgPCAwKQorICAgICAgICAgICAgICAgIGRlbGF5ID0gMTAwMC9mcHM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aGVuVGlja3MgPSBTRExfR2V0VGlja3MgKCk7CisgICAgICAgIH0KKworICAgICAgICBTRExfRGVsYXkgKGRlbGF5KTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJLy8gSW5pdCBTREwgdmlkZW8gc3Vic3lzdGVtCisJaWYgKCBTRExfSW5pdCAoU0RMX0lOSVRfVklERU8pIDwgMCApIHsKKwkJCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLAorCQkJU0RMX0dldEVycm9yKCkpOworCQlleGl0KDEpOworCX0KKworICAgIC8vIFNldCBHTCBjb250ZXh0IGF0dHJpYnV0ZXMKKyAgICBpbml0QXR0cmlidXRlcyAoKTsKKyAgICAKKyAgICAvLyBDcmVhdGUgR0wgY29udGV4dAorICAgIGNyZWF0ZVN1cmZhY2UgKDApOworICAgIAorICAgIC8vIEdldCBHTCBjb250ZXh0IGF0dHJpYnV0ZXMKKyAgICBwcmludEF0dHJpYnV0ZXMgKCk7CisgICAgCisgICAgLy8gSW5pdCBHTCBzdGF0ZQorICAgIGluaXRHTCAoKTsKKyAgICAKKyAgICAvLyBEcmF3LCBnZXQgZXZlbnRzLi4uCisgICAgbWFpbkxvb3AgKCk7CisgICAgCisgICAgLy8gQ2xlYW51cAorCVNETF9RdWl0KCk7CisJCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2MTI0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQXBwbGljYXRpb24vSW5mby5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzhkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQXBwbGljYXRpb24vSW5mby5wbGlzdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20ueW91cmNvbXBhbnkuwqtQUk9KRUNUTkFNRUFTWE1Mwrs8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW48L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQXBwbGljYXRpb24vU0RMQXBwLnhjb2RlcHJvai9UZW1wbGF0ZUluZm8ucGxpc3QgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQXBwbGljYXRpb24vU0RMQXBwLnhjb2RlcHJvai9UZW1wbGF0ZUluZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljYTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBBcHBsaWNhdGlvbi9TRExBcHAueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApAQCAtMCwwICsxLDEyIEBACit7CisJRmlsZXNUb1JlbmFtZSA9IHsKKwkJIlNETEFwcF9QcmVmaXgucGNoIiA9ICLHUFJPSkVDVE5BTUXIX1ByZWZpeC5wY2giOworCX07CisJRmlsZXNUb01hY3JvRXhwYW5kID0gKAorCQkix1BST0pFQ1ROQU1FyF9QcmVmaXgucGNoIiwKKwkJIkluZm8ucGxpc3QiLAorCQkiRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyIsCisJCSJtYWluLmMiLAorCSk7CisJRGVzY3JpcHRpb24gPSAiVGhpcyBwcm9qZWN0IGJ1aWxkcyBhbiBTREwtYmFzZWQgYXBwbGljYXRpb24uIjsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBBcHBsaWNhdGlvbi9TRExBcHAueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBBcHBsaWNhdGlvbi9TRExBcHAueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2FjNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIEFwcGxpY2F0aW9uL1NETEFwcC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsMzI0IEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDI7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJMDAyRjM5RkEwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjNBMDAwOUQwODg0NjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjM5RjkwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzQTJFMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovOyB9OworCQkwMDJGM0EzRjA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNBM0UwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyAqLzsgfTsKKwkJOEQxMTA3MkIwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi87IH07CisJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEJ1aWxkU3R5bGUgc2VjdGlvbiAqLworCQk0QTk1MDRDQ0ZGRTZBNEIzMTFDQTBDQkEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBQQlhCdWlsZFN0eWxlOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTRBOTUwNENERkZFNkE0QjMxMUNBMENCQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gUEJYQnVpbGRTdHlsZTsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgUEJYQnVpbGRTdHlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGRDA5RDA4ODM0MDBFQkVCODggLyogQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxMDsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzQTAwMDlEMDg4NDYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCW5hbWUgPSAiQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUiOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gU0RMLmZyYW1ld29yazsgcGF0aCA9IC9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMDAyRjNBMkIwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETE1haW4uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU0RMTWFpbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBtYWluLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDg5QzE2NURGRTg0MEUwQ0MwMkFBQzA3IC8qIEVuZ2xpc2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMTA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC5zdHJpbmdzOyBuYW1lID0gRW5nbGlzaDsgcGF0aCA9IEVuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTEwNThDN0ExRkVBNTRGMDExMUNBMkNCQiAvKiBDb2NvYS5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENvY29hLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMjlCOTczMjRGRENGQTM5NDExQ0EyQ0VBIC8qIEFwcEtpdC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEFwcEtpdC5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkyOUI5NzMyNUZEQ0ZBMzk0MTFDQTJDRUEgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEZvdW5kYXRpb24uZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvRm91bmRhdGlvbi5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTMyQ0E0RjYzMDM2OEQxRUUwMEM5MTc4MyAvKiDCq1BST0pFQ1ROQU1FwrtfUHJlZml4LnBjaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IGZpbGU7IHBhdGggPSAiwqtQUk9KRUNUTkFNRcK7X1ByZWZpeC5wY2giOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4RDExMDczMTA0ODZDRUI4MDBFNDcwOTAgLyogSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Q7IHBhdGggPSBJbmZvLnBsaXN0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4RDExMDczMjA0ODZDRUI4MDBFNDcwOTAgLyogwqtQUk9KRUNUTkFNRcK7LmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gIsKrUFJPSkVDVE5BTUXCuy5hcHAiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzJFMDQ4NkNFQjgwMEU0NzA5MCAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjM5RkEwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQk4RDExMDcyRjA0ODZDRUI4MDBFNDcwOTAgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhHcm91cCBzZWN0aW9uICovCisJCTA4MEU5NkRERkUyMDFENkQ3RjAwMDAwMSAvKiBDbGFzc2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGM0EyQjA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5oICovLAorCQkJCTAwMkYzQTJDMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gKi8sCisJCQkpOworCQkJbmFtZSA9IENsYXNzZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxMDU4QzdBMEZFQTU0RjAxMTFDQTJDQkIgLyogTGlua2VkIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovLAorCQkJCTEwNThDN0ExRkVBNTRGMDExMUNBMkNCQiAvKiBDb2NvYS5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJMaW5rZWQgRnJhbWV3b3JrcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxMDU4QzdBMkZFQTU0RjAxMTFDQTJDQkIgLyogT3RoZXIgRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMjlCOTczMjRGRENGQTM5NDExQ0EyQ0VBIC8qIEFwcEtpdC5mcmFtZXdvcmsgKi8sCisJCQkJMjlCOTczMjVGRENGQTM5NDExQ0EyQ0VBIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovLAorCQkJKTsKKwkJCW5hbWUgPSAiT3RoZXIgRnJhbWV3b3JrcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxOUMyOEZBQ0ZFOUQ1MjBEMTFDQTJDQkIgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCThEMTEwNzMyMDQ4NkNFQjgwMEU0NzA5MCAvKiDCq1BST0pFQ1ROQU1FwrsuYXBwICovLAorCQkJKTsKKwkJCW5hbWUgPSBQcm9kdWN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE0RkRDRkEzOTQxMUNBMkNFQSAvKiDCq1BST0pFQ1ROQU1FQVNYTUzCuyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDgwRTk2RERGRTIwMUQ2RDdGMDAwMDAxIC8qIENsYXNzZXMgKi8sCisJCQkJMjlCOTczMTVGRENGQTM5NDExQ0EyQ0VBIC8qIE90aGVyIFNvdXJjZXMgKi8sCisJCQkJMjlCOTczMTdGRENGQTM5NDExQ0EyQ0VBIC8qIFJlc291cmNlcyAqLywKKwkJCQkyOUI5NzMyM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxOUMyOEZBQ0ZFOUQ1MjBEMTFDQTJDQkIgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJbmFtZSA9ICLCq1BST0pFQ1ROQU1FQVNYTUzCuyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMxNUZEQ0ZBMzk0MTFDQTJDRUEgLyogT3RoZXIgU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMzJDQTRGNjMwMzY4RDFFRTAwQzkxNzgzIC8qIMKrUFJPSkVDVE5BTUXCu19QcmVmaXgucGNoICovLAorCQkJCTAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBTb3VyY2VzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE3RkRDRkEzOTQxMUNBMkNFQSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCThEMTEwNzMxMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvLnBsaXN0ICovLAorCQkJCTA4OUMxNjVDRkU4NDBFMENDMDJBQUMwNyAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLywKKwkJCSk7CisJCQluYW1lID0gUmVzb3VyY2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMjNGRENGQTM5NDExQ0EyQ0VBIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTEwNThDN0EwRkVBNTRGMDExMUNBMkNCQiAvKiBMaW5rZWQgRnJhbWV3b3JrcyAqLywKKwkJCQkxMDU4QzdBMkZFQTU0RjAxMTFDQTJDQkIgLyogT3RoZXIgRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQluYW1lID0gRnJhbWV3b3JrczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCQk4RDExMDcyNjA0ODZDRUI4MDBFNDcwOTAgLyogwqtQUk9KRUNUTkFNRcK7ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEMwMUZDRjRBMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiwqtQUk9KRUNUTkFNRcK7IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjM5RkQwOUQwODgzNDAwRUJFQjg4IC8qIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCX07CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICLCq1BST0pFQ1ROQU1FwrsiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCXByb2R1Y3ROYW1lID0gIsKrUFJPSkVDVE5BTUXCuyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIMKrUFJPSkVDVE5BTUXCuy5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJMjlCOTczMTNGRENGQTM5NDExQ0EyQ0VBIC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBDMDFGQ0Y0RTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJTRExBcHAiICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCX07CisJCQlidWlsZFN0eWxlcyA9ICgKKwkJCQk0QTk1MDRDQ0ZGRTZBNEIzMTFDQTBDQkEgLyogRGVidWcgKi8sCisJCQkJNEE5NTA0Q0RGRkU2QTRCMzExQ0EwQ0JBIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDE7CisJCQltYWluR3JvdXAgPSAyOUI5NzMxNEZEQ0ZBMzk0MTFDQTJDRUEgLyogwqtQUk9KRUNUTkFNRUFTWE1MwrsgKi87CisJCQlwcm9qZWN0RGlyUGF0aCA9ICIiOworCQkJdGFyZ2V0cyA9ICgKKwkJCQk4RDExMDcyNjA0ODZDRUI4MDBFNDcwOTAgLyogwqtQUk9KRUNUTkFNRcK7ICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCThEMTEwNzJCMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGM0EyRTA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNBM0YwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYVmFyaWFudEdyb3VwIHNlY3Rpb24gKi8KKwkJMDg5QzE2NUNGRTg0MEUwQ0MwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovID0geworCQkJaXNhID0gUEJYVmFyaWFudEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDg5QzE2NURGRTg0MEUwQ0MwMkFBQzA3IC8qIEVuZ2xpc2ggKi8sCisJCQkpOworCQkJbmFtZSA9IEluZm9QbGlzdC5zdHJpbmdzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisJCUMwMUZDRjRCMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCQlQUk9EVUNUX05BTUUgPSAiwqtQUk9KRUNUTkFNRcK7IjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCQlaRVJPX0xJTksgPSBZRVM7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlDMDFGQ0Y0QzA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICgKKwkJCQkJcHBjLAorCQkJCQlpMzg2LAorCQkJCSk7CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk87CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9BcHBsaWNhdGlvbnMiOworCQkJCVBST0RVQ1RfTkFNRSA9ICLCq1BST0pFQ1ROQU1FwrsiOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlDMDFGQ0Y0RjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3JrcywKKwkJCQkJIiQoRlJBTUVXT1JLX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycywKKwkJCQkJIiQoSEVBREVSX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVNES1JPT1QgPSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJQzAxRkNGNTAwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3JrcywKKwkJCQkJIiQoRlJBTUVXT1JLX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycywKKwkJCQkJIiQoSEVBREVSX1NFQVJDSF9QQVRIUykiLAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVNES1JPT1QgPSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCUMwMUZDRjRBMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiwqtQUk9KRUNUTkFNRcK7IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUMwMUZDRjRCMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLywKKwkJCQlDMDFGQ0Y0QzA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQlDMDFGQ0Y0RTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJTRExBcHAiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJQzAxRkNGNEYwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovLAorCQkJCUMwMUZDRjUwMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJfTsKKwlyb290T2JqZWN0ID0gMjlCOTczMTNGRENGQTM5NDExQ0EyQ0VBIC8qIFByb2plY3Qgb2JqZWN0ICovOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIEFwcGxpY2F0aW9uL1NETEFwcF9QcmVmaXgucGNoIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIEFwcGxpY2F0aW9uL1NETEFwcF9QcmVmaXgucGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDk1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQXBwbGljYXRpb24vU0RMQXBwX1ByZWZpeC5wY2gKQEAgLTAsMCArMSw5IEBACisvLworLy8gUHJlZml4IGhlYWRlciBmb3IgYWxsIHNvdXJjZSBmaWxlcyBvZiB0aGUgJ8dQUk9KRUNUTkFNRcgnIHRhcmdldCBpbiB0aGUgJ8dQUk9KRUNUTkFNRcgnIHByb2plY3QKKy8vCisKKyNpbmNsdWRlICJTREwuaCIKKworI2lmZGVmIF9fT0JKQ19fCisgICAgI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIEFwcGxpY2F0aW9uL1NETE1haW4uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBBcHBsaWNhdGlvbi9TRExNYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2ZDkwYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBBcHBsaWNhdGlvbi9TRExNYWluLmgKQEAgLTAsMCArMSwxNiBAQAorLyogICBTRExNYWluLm0gLSBtYWluIGVudHJ5IHBvaW50IGZvciBvdXIgQ29jb2EtaXplZCBTREwgYXBwCisgICAgICAgSW5pdGlhbCBWZXJzaW9uOiBEYXJyZWxsIFdhbGlzc2VyIDxkd2FsaXNzMUBwdXJkdWUuZWR1PgorICAgICAgIE5vbi1OSUItQ29kZSAmIG90aGVyIGNoYW5nZXM6IE1heCBIb3JuIDxtYXhAcXVlbmRpLmRlPgorCisgICAgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzCisqLworCisjaWZuZGVmIF9TRExNYWluX2hfCisjZGVmaW5lIF9TRExNYWluX2hfCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgU0RMTWFpbiA6IE5TT2JqZWN0CitAZW5kCisKKyNlbmRpZiAvKiBfU0RMTWFpbl9oXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIEFwcGxpY2F0aW9uL1NETE1haW4ubSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBBcHBsaWNhdGlvbi9TRExNYWluLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2NWEyMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBBcHBsaWNhdGlvbi9TRExNYWluLm0KQEAgLTAsMCArMSwzODMgQEAKKy8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAorICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKyAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KKworICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcworKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETE1haW4uaCIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gLyogZm9yIE1BWFBBVEhMRU4gKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogRm9yIHNvbWUgcmVhb24sIEFwcGxlIHJlbW92ZWQgc2V0QXBwbGVNZW51IGZyb20gdGhlIGhlYWRlcnMgaW4gMTAuNCwKKyBidXQgdGhlIG1ldGhvZCBzdGlsbCBpcyB0aGVyZSBhbmQgd29ya3MuIFRvIGF2b2lkIHdhcm5pbmdzLCB3ZSBkZWNsYXJlCisgaXQgb3Vyc2VsdmVzIGhlcmUuICovCitAaW50ZXJmYWNlIE5TQXBwbGljYXRpb24oU0RMX01pc3NpbmdfTWV0aG9kcykKKy0gKHZvaWQpc2V0QXBwbGVNZW51OihOU01lbnUgKiltZW51OworQGVuZAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBTRExNYWluLm5pYiBvciBub3QgKi8KKyNkZWZpbmUJCVNETF9VU0VfTklCX0ZJTEUJMAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBDUFMgKGRvY2tpbmcpIG9yIG5vdCAqLworI2RlZmluZQkJU0RMX1VTRV9DUFMJCTEKKyNpZmRlZiBTRExfVVNFX0NQUworLyogUG9ydGlvbnMgb2YgQ1BTLmggKi8KK3R5cGVkZWYgc3RydWN0IENQU1Byb2Nlc3NTZXJOdW0KK3sKKwlVSW50MzIJCWxvOworCVVJbnQzMgkJaGk7Cit9IENQU1Byb2Nlc3NTZXJOdW07CisKK2V4dGVybiBPU0VycglDUFNHZXRDdXJyZW50UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKK2V4dGVybiBPU0VyciAJQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbiggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuLCBVSW50MzIgX2FyZzIsIFVJbnQzMiBfYXJnMywgVUludDMyIF9hcmc0LCBVSW50MzIgX2FyZzUpOworZXh0ZXJuIE9TRXJyCUNQU1NldEZyb250UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKKworI2VuZGlmIC8qIFNETF9VU0VfQ1BTICovCisKK3N0YXRpYyBpbnQgICAgZ0FyZ2M7CitzdGF0aWMgY2hhciAgKipnQXJndjsKK3N0YXRpYyBCT09MICAgZ0ZpbmRlckxhdW5jaDsKK3N0YXRpYyBCT09MICAgZ0NhbGxlZEFwcE1haW5saW5lID0gRkFMU0U7CisKK3N0YXRpYyBOU1N0cmluZyAqZ2V0QXBwbGljYXRpb25OYW1lKHZvaWQpCit7CisgICAgY29uc3QgTlNEaWN0aW9uYXJ5ICpkaWN0OworICAgIE5TU3RyaW5nICphcHBOYW1lID0gMDsKKworICAgIC8qIERldGVybWluZSB0aGUgYXBwbGljYXRpb24gbmFtZSAqLworICAgIGRpY3QgPSAoY29uc3QgTlNEaWN0aW9uYXJ5ICopQ0ZCdW5kbGVHZXRJbmZvRGljdGlvbmFyeShDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgaWYgKGRpY3QpCisgICAgICAgIGFwcE5hbWUgPSBbZGljdCBvYmplY3RGb3JLZXk6IEAiQ0ZCdW5kbGVOYW1lIl07CisgICAgCisgICAgaWYgKCFbYXBwTmFtZSBsZW5ndGhdKQorICAgICAgICBhcHBOYW1lID0gW1tOU1Byb2Nlc3NJbmZvIHByb2Nlc3NJbmZvXSBwcm9jZXNzTmFtZV07CisKKyAgICByZXR1cm4gYXBwTmFtZTsKK30KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKy8qIEEgaGVscGVyIGNhdGVnb3J5IGZvciBOU1N0cmluZyAqLworQGludGVyZmFjZSBOU1N0cmluZyAoUmVwbGFjZVN1YlN0cmluZykKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgU0RMQXBwbGljYXRpb24gOiBOU0FwcGxpY2F0aW9uCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTRExBcHBsaWNhdGlvbgorLyogSW52b2tlZCBmcm9tIHRoZSBRdWl0IG1lbnUgaXRlbSAqLworLSAodm9pZCl0ZXJtaW5hdGU6KGlkKXNlbmRlcgoreworICAgIC8qIFBvc3QgYSBTRExfUVVJVCBldmVudCAqLworICAgIFNETF9FdmVudCBldmVudDsKKyAgICBldmVudC50eXBlID0gU0RMX1FVSVQ7CisgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOworfQorQGVuZAorCisvKiBUaGUgbWFpbiBjbGFzcyBvZiB0aGUgYXBwbGljYXRpb24sIHRoZSBhcHBsaWNhdGlvbidzIGRlbGVnYXRlICovCitAaW1wbGVtZW50YXRpb24gU0RMTWFpbgorCisvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworLSAodm9pZCkgc2V0dXBXb3JraW5nRGlyZWN0b3J5OihCT09MKXNob3VsZENoZGlyCit7CisgICAgaWYgKHNob3VsZENoZGlyKQorICAgIHsKKyAgICAgICAgY2hhciBwYXJlbnRkaXJbTUFYUEFUSExFTl07CisgICAgICAgIENGVVJMUmVmIHVybCA9IENGQnVuZGxlQ29weUJ1bmRsZVVSTChDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgICAgIENGVVJMUmVmIHVybDIgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KDAsIHVybCk7CisgICAgICAgIGlmIChDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbih1cmwyLCAxLCAoVUludDggKilwYXJlbnRkaXIsIE1BWFBBVEhMRU4pKSB7CisgICAgICAgICAgICBjaGRpcihwYXJlbnRkaXIpOyAgIC8qIGNoZGlyIHRvIHRoZSBiaW5hcnkgYXBwJ3MgcGFyZW50ICovCisgICAgICAgIH0KKyAgICAgICAgQ0ZSZWxlYXNlKHVybCk7CisgICAgICAgIENGUmVsZWFzZSh1cmwyKTsKKyAgICB9Cit9CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisKKy8qIEZpeCBtZW51IHRvIGNvbnRhaW4gdGhlIHJlYWwgYXBwIG5hbWUgaW5zdGVhZCBvZiAiU0RMIEFwcCIgKi8KKy0gKHZvaWQpZml4TWVudTooTlNNZW51ICopYU1lbnUgd2l0aEFwcE5hbWU6KE5TU3RyaW5nICopYXBwTmFtZQoreworICAgIE5TUmFuZ2UgYVJhbmdlOworICAgIE5TRW51bWVyYXRvciAqZW51bWVyYXRvcjsKKyAgICBOU01lbnVJdGVtICptZW51SXRlbTsKKworICAgIGFSYW5nZSA9IFtbYU1lbnUgdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgaWYgKGFSYW5nZS5sZW5ndGggIT0gMCkKKyAgICAgICAgW2FNZW51IHNldFRpdGxlOiBbW2FNZW51IHRpdGxlXSBzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOmFSYW5nZSB3aXRoOmFwcE5hbWVdXTsKKworICAgIGVudW1lcmF0b3IgPSBbW2FNZW51IGl0ZW1BcnJheV0gb2JqZWN0RW51bWVyYXRvcl07CisgICAgd2hpbGUgKChtZW51SXRlbSA9IFtlbnVtZXJhdG9yIG5leHRPYmplY3RdKSkKKyAgICB7CisgICAgICAgIGFSYW5nZSA9IFtbbWVudUl0ZW0gdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgICAgIGlmIChhUmFuZ2UubGVuZ3RoICE9IDApCisgICAgICAgICAgICBbbWVudUl0ZW0gc2V0VGl0bGU6IFtbbWVudUl0ZW0gdGl0bGVdIHN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6YVJhbmdlIHdpdGg6YXBwTmFtZV1dOworICAgICAgICBpZiAoW21lbnVJdGVtIGhhc1N1Ym1lbnVdKQorICAgICAgICAgICAgW3NlbGYgZml4TWVudTpbbWVudUl0ZW0gc3VibWVudV0gd2l0aEFwcE5hbWU6YXBwTmFtZV07CisgICAgfQorICAgIFsgYU1lbnUgc2l6ZVRvRml0IF07Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIHNldEFwcGxpY2F0aW9uTWVudSh2b2lkKQoreworICAgIC8qIHdhcm5pbmc6IHRoaXMgY29kZSBpcyB2ZXJ5IG9kZCAqLworICAgIE5TTWVudSAqYXBwbGVNZW51OworICAgIE5TTWVudUl0ZW0gKm1lbnVJdGVtOworICAgIE5TU3RyaW5nICp0aXRsZTsKKyAgICBOU1N0cmluZyAqYXBwTmFtZTsKKyAgICAKKyAgICBhcHBOYW1lID0gZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgICAgYXBwbGVNZW51ID0gW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCIiXTsKKyAgICAKKyAgICAvKiBBZGQgbWVudSBpdGVtcyAqLworICAgIHRpdGxlID0gW0AiQWJvdXQgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3RvcihvcmRlckZyb250U3RhbmRhcmRBYm91dFBhbmVsOikga2V5RXF1aXZhbGVudDpAIiJdOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtOltOU01lbnVJdGVtIHNlcGFyYXRvckl0ZW1dXTsKKworICAgIHRpdGxlID0gW0AiSGlkZSAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKGhpZGU6KSBrZXlFcXVpdmFsZW50OkAiaCJdOworCisgICAgbWVudUl0ZW0gPSAoTlNNZW51SXRlbSAqKVthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTpAIkhpZGUgT3RoZXJzIiBhY3Rpb246QHNlbGVjdG9yKGhpZGVPdGhlckFwcGxpY2F0aW9uczopIGtleUVxdWl2YWxlbnQ6QCJoIl07CisgICAgW21lbnVJdGVtIHNldEtleUVxdWl2YWxlbnRNb2RpZmllck1hc2s6KE5TQWx0ZXJuYXRlS2V5TWFza3xOU0NvbW1hbmRLZXlNYXNrKV07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6QCJTaG93IEFsbCIgYWN0aW9uOkBzZWxlY3Rvcih1bmhpZGVBbGxBcHBsaWNhdGlvbnM6KSBrZXlFcXVpdmFsZW50OkAiIl07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW06W05TTWVudUl0ZW0gc2VwYXJhdG9ySXRlbV1dOworCisgICAgdGl0bGUgPSBbQCJRdWl0ICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3IodGVybWluYXRlOikga2V5RXF1aXZhbGVudDpAInEiXTsKKworICAgIAorICAgIC8qIFB1dCBtZW51IGludG8gdGhlIG1lbnViYXIgKi8KKyAgICBtZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiIgYWN0aW9uOm5pbCBrZXlFcXVpdmFsZW50OkAiIl07CisgICAgW21lbnVJdGVtIHNldFN1Ym1lbnU6YXBwbGVNZW51XTsKKyAgICBbW05TQXBwIG1haW5NZW51XSBhZGRJdGVtOm1lbnVJdGVtXTsKKworICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSBhcHBsaWNhdGlvbiBtZW51ICovCisgICAgW05TQXBwIHNldEFwcGxlTWVudTphcHBsZU1lbnVdOworCisgICAgLyogRmluYWxseSBnaXZlIHVwIG91ciByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RzICovCisgICAgW2FwcGxlTWVudSByZWxlYXNlXTsKKyAgICBbbWVudUl0ZW0gcmVsZWFzZV07Cit9CisKKy8qIENyZWF0ZSBhIHdpbmRvdyBtZW51ICovCitzdGF0aWMgdm9pZCBzZXR1cFdpbmRvd01lbnUodm9pZCkKK3sKKyAgICBOU01lbnUgICAgICAqd2luZG93TWVudTsKKyAgICBOU01lbnVJdGVtICAqd2luZG93TWVudUl0ZW07CisgICAgTlNNZW51SXRlbSAgKm1lbnVJdGVtOworCisgICAgd2luZG93TWVudSA9IFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiV2luZG93Il07CisgICAgCisgICAgLyogIk1pbmltaXplIiBpdGVtICovCisgICAgbWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJNaW5pbWl6ZSIgYWN0aW9uOkBzZWxlY3RvcihwZXJmb3JtTWluaWF0dXJpemU6KSBrZXlFcXVpdmFsZW50OkAibSJdOworICAgIFt3aW5kb3dNZW51IGFkZEl0ZW06bWVudUl0ZW1dOworICAgIFttZW51SXRlbSByZWxlYXNlXTsKKyAgICAKKyAgICAvKiBQdXQgbWVudSBpbnRvIHRoZSBtZW51YmFyICovCisgICAgd2luZG93TWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJXaW5kb3ciIGFjdGlvbjpuaWwga2V5RXF1aXZhbGVudDpAIiJdOworICAgIFt3aW5kb3dNZW51SXRlbSBzZXRTdWJtZW51OndpbmRvd01lbnVdOworICAgIFtbTlNBcHAgbWFpbk1lbnVdIGFkZEl0ZW06d2luZG93TWVudUl0ZW1dOworICAgIAorICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSB3aW5kb3cgbWVudSAqLworICAgIFtOU0FwcCBzZXRXaW5kb3dzTWVudTp3aW5kb3dNZW51XTsKKworICAgIC8qIEZpbmFsbHkgZ2l2ZSB1cCBvdXIgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyAqLworICAgIFt3aW5kb3dNZW51IHJlbGVhc2VdOworICAgIFt3aW5kb3dNZW51SXRlbSByZWxlYXNlXTsKK30KKworLyogUmVwbGFjZW1lbnQgZm9yIE5TQXBwbGljYXRpb25NYWluICovCitzdGF0aWMgdm9pZCBDdXN0b21BcHBsaWNhdGlvbk1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBOU0F1dG9yZWxlYXNlUG9vbAkqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICAgIFNETE1haW4JCQkJKnNkbE1haW47CisKKyAgICAvKiBFbnN1cmUgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBpcyBpbml0aWFsaXNlZCAqLworICAgIFtTRExBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07CisgICAgCisjaWZkZWYgU0RMX1VTRV9DUFMKKyAgICB7CisgICAgICAgIENQU1Byb2Nlc3NTZXJOdW0gUFNOOworICAgICAgICAvKiBUZWxsIHRoZSBkb2NrIGFib3V0IHVzICovCisgICAgICAgIGlmICghQ1BTR2V0Q3VycmVudFByb2Nlc3MoJlBTTikpCisgICAgICAgICAgICBpZiAoIUNQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb24oJlBTTiwweDAzLDB4M0MsMHgyQywweDExMDMpKQorICAgICAgICAgICAgICAgIGlmICghQ1BTU2V0RnJvbnRQcm9jZXNzKCZQU04pKQorICAgICAgICAgICAgICAgICAgICBbU0RMQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIH0KKyNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLworCisgICAgLyogU2V0IHVwIHRoZSBtZW51YmFyICovCisgICAgW05TQXBwIHNldE1haW5NZW51OltbTlNNZW51IGFsbG9jXSBpbml0XV07CisgICAgc2V0QXBwbGljYXRpb25NZW51KCk7CisgICAgc2V0dXBXaW5kb3dNZW51KCk7CisKKyAgICAvKiBDcmVhdGUgU0RMTWFpbiBhbmQgbWFrZSBpdCB0aGUgYXBwIGRlbGVnYXRlICovCisgICAgc2RsTWFpbiA9IFtbU0RMTWFpbiBhbGxvY10gaW5pdF07CisgICAgW05TQXBwIHNldERlbGVnYXRlOnNkbE1haW5dOworICAgIAorICAgIC8qIFN0YXJ0IHRoZSBtYWluIGV2ZW50IGxvb3AgKi8KKyAgICBbTlNBcHAgcnVuXTsKKyAgICAKKyAgICBbc2RsTWFpbiByZWxlYXNlXTsKKyAgICBbcG9vbCByZWxlYXNlXTsKK30KKworI2VuZGlmCisKKworLyoKKyAqIENhdGNoIGRvY3VtZW50IG9wZW4gcmVxdWVzdHMuLi50aGlzIGxldHMgdXMgbm90aWNlIGZpbGVzIHdoZW4gdGhlIGFwcAorICogIHdhcyBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgYSBkb2N1bWVudCwgb3Igd2hlbiBhIGRvY3VtZW50IHdhcworICogIGRyYWdnZWQvZHJvcHBlZCBvbiB0aGUgYXBwJ3MgaWNvbi4gWW91IG5lZWQgdG8gaGF2ZSBhCisgKiAgQ0ZCdW5kbGVEb2N1bWVudHNUeXBlIHNlY3Rpb24gaW4geW91ciBJbmZvLnBsaXN0IHRvIGdldCB0aGlzIG1lc3NhZ2UsCisgKiAgYXBwYXJlbnRseS4KKyAqCisgKiBGaWxlcyBhcmUgYWRkZWQgdG8gZ0FyZ3YsIHNvIHRvIHRoZSBhcHAsIHRoZXknbGwgbG9vayBsaWtlIGNvbW1hbmQgbGluZQorICogIGFyZ3VtZW50cy4gUHJldmlvdXNseSwgYXBwcyBsYXVuY2hlZCBmcm9tIHRoZSBmaW5kZXIgaGFkIG5vdGhpbmcgYnV0CisgKiAgYW4gYXJndlswXS4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgbWF5IGJlIHJlY2VpdmVkIG11bHRpcGxlIHRpbWVzIHRvIG9wZW4gc2V2ZXJhbCBkb2NzIG9uIGxhdW5jaC4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgaXMgaWdub3JlZCBvbmNlIHRoZSBhcHAncyBtYWlubGluZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKy0gKEJPT0wpYXBwbGljYXRpb246KE5TQXBwbGljYXRpb24gKil0aGVBcHBsaWNhdGlvbiBvcGVuRmlsZTooTlNTdHJpbmcgKilmaWxlbmFtZQoreworICAgIGNvbnN0IGNoYXIgKnRlbXBhcmc7CisgICAgc2l6ZV90IGFyZ2xlbjsKKyAgICBjaGFyICphcmc7CisgICAgY2hhciAqKm5ld2FyZ3Y7CisKKyAgICBpZiAoIWdGaW5kZXJMYXVuY2gpICAvKiBNYWNPUyBpcyBwYXNzaW5nIGNvbW1hbmQgbGluZSBhcmdzLiAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoZ0NhbGxlZEFwcE1haW5saW5lKSAgLyogYXBwIGhhcyBzdGFydGVkLCBpZ25vcmUgdGhpcyBkb2N1bWVudC4gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdGVtcGFyZyA9IFtmaWxlbmFtZSBVVEY4U3RyaW5nXTsKKyAgICBhcmdsZW4gPSBTRExfc3RybGVuKHRlbXBhcmcpICsgMTsKKyAgICBhcmcgPSAoY2hhciAqKSBTRExfbWFsbG9jKGFyZ2xlbik7CisgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBuZXdhcmd2ID0gKGNoYXIgKiopIHJlYWxsb2MoZ0FyZ3YsIHNpemVvZiAoY2hhciAqKSAqIChnQXJnYyArIDIpKTsKKyAgICBpZiAobmV3YXJndiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX2ZyZWUoYXJnKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBnQXJndiA9IG5ld2FyZ3Y7CisKKyAgICBTRExfc3RybGNweShhcmcsIHRlbXBhcmcsIGFyZ2xlbik7CisgICAgZ0FyZ3ZbZ0FyZ2MrK10gPSBhcmc7CisgICAgZ0FyZ3ZbZ0FyZ2NdID0gTlVMTDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKiBDYWxsZWQgd2hlbiB0aGUgaW50ZXJuYWwgZXZlbnQgbG9vcCBoYXMganVzdCBzdGFydGVkIHJ1bm5pbmcgKi8KKy0gKHZvaWQpIGFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOiAoTlNOb3RpZmljYXRpb24gKikgbm90ZQoreworICAgIGludCBzdGF0dXM7CisKKyAgICAvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworICAgIFtzZWxmIHNldHVwV29ya2luZ0RpcmVjdG9yeTpnRmluZGVyTGF1bmNoXTsKKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICAvKiBTZXQgdGhlIG1haW4gbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCisgICAgW3NlbGYgZml4TWVudTpbTlNBcHAgbWFpbk1lbnVdIHdpdGhBcHBOYW1lOmdldEFwcGxpY2F0aW9uTmFtZSgpXTsKKyNlbmRpZgorCisgICAgLyogSGFuZCBvZmYgdG8gbWFpbiBhcHBsaWNhdGlvbiBjb2RlICovCisgICAgZ0NhbGxlZEFwcE1haW5saW5lID0gVFJVRTsKKyAgICBzdGF0dXMgPSBTRExfbWFpbiAoZ0FyZ2MsIGdBcmd2KTsKKworICAgIC8qIFdlJ3JlIGRvbmUsIHRoYW5rIHlvdSBmb3IgcGxheWluZyAqLworICAgIGV4aXQoc3RhdHVzKTsKK30KK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCisKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZmZlclNpemU7CisgICAgdW5zaWduZWQgaW50IHNlbGZMZW4gPSBbc2VsZiBsZW5ndGhdOworICAgIHVuc2lnbmVkIGludCBhU3RyaW5nTGVuID0gW2FTdHJpbmcgbGVuZ3RoXTsKKyAgICB1bmljaGFyICpidWZmZXI7CisgICAgTlNSYW5nZSBsb2NhbFJhbmdlOworICAgIE5TU3RyaW5nICpyZXN1bHQ7CisKKyAgICBidWZmZXJTaXplID0gc2VsZkxlbiArIGFTdHJpbmdMZW4gLSBhUmFuZ2UubGVuZ3RoOworICAgIGJ1ZmZlciA9ICh1bmljaGFyICopTlNBbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlclNpemUqc2l6ZW9mKHVuaWNoYXIpKTsKKyAgICAKKyAgICAvKiBHZXQgZmlyc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVJhbmdlLmxvY2F0aW9uOworICAgIFtzZWxmIGdldENoYXJhY3RlcnM6YnVmZmVyIHJhbmdlOmxvY2FsUmFuZ2VdOworICAgIAorICAgIC8qIEdldCBtaWRkbGUgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVN0cmluZ0xlbjsKKyAgICBbYVN0cmluZyBnZXRDaGFyYWN0ZXJzOihidWZmZXIrYVJhbmdlLmxvY2F0aW9uKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAgCisgICAgLyogR2V0IGxhc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSBhUmFuZ2UubG9jYXRpb24gKyBhUmFuZ2UubGVuZ3RoOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gc2VsZkxlbiAtIGxvY2FsUmFuZ2UubG9jYXRpb247CisgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbithU3RyaW5nTGVuKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAKKyAgICAvKiBCdWlsZCBvdXRwdXQgc3RyaW5nICovCisgICAgcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhDaGFyYWN0ZXJzOmJ1ZmZlciBsZW5ndGg6YnVmZmVyU2l6ZV07CisgICAgCisgICAgTlNEZWFsbG9jYXRlTWVtb3J5UGFnZXMoYnVmZmVyLCBidWZmZXJTaXplKTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCisKKworCisjaWZkZWYgbWFpbgorIyAgdW5kZWYgbWFpbgorI2VuZGlmCisKKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBleGVjdXRhYmxlIC0gc2hvdWxkICpub3QqIGJlIFNETF9tYWluISAqLworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgaW50byBhIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIC8qIFRoaXMgaXMgcGFzc2VkIGlmIHdlIGFyZSBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgKi8KKyAgICBpZiAoIGFyZ2MgPj0gMiAmJiBzdHJuY21wIChhcmd2WzFdLCAiLXBzbiIsIDQpID09IDAgKSB7CisgICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogMik7CisgICAgICAgIGdBcmd2WzBdID0gYXJndlswXTsKKyAgICAgICAgZ0FyZ3ZbMV0gPSBOVUxMOworICAgICAgICBnQXJnYyA9IDE7CisgICAgICAgIGdGaW5kZXJMYXVuY2ggPSBZRVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGdBcmdjID0gYXJnYzsKKyAgICAgICAgZ0FyZ3YgPSAoY2hhciAqKikgU0RMX21hbGxvYyhzaXplb2YgKGNoYXIgKikgKiAoYXJnYysxKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYXJnYzsgaSsrKQorICAgICAgICAgICAgZ0FyZ3ZbaV0gPSBhcmd2W2ldOworICAgICAgICBnRmluZGVyTGF1bmNoID0gTk87CisgICAgfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorICAgIFtTRExBcHBsaWNhdGlvbiBwb3NlQXNDbGFzczpbTlNBcHBsaWNhdGlvbiBjbGFzc11dOworICAgIE5TQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbHNlCisgICAgQ3VzdG9tQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQXBwbGljYXRpb24vbWFpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIEFwcGxpY2F0aW9uL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE1ZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIEFwcGxpY2F0aW9uL21haW4uYwpAQCAtMCwwICsxLDY1IEBACisKKy8qIFNpbXBsZSBwcm9ncmFtOiAgQ3JlYXRlIGEgYmxhbmsgd2luZG93LCB3YWl0IGZvciBrZXlwcmVzcywgcXVpdC4KKworICAgUGxlYXNlIHNlZSB0aGUgU0RMIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gdXNpbmcgdGhlIFNETCBBUEk6CisgICAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vU0RML2RvY3MuaHRtbAorKi8KKyAgIAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJVWludDMyIGluaXRmbGFncyA9IFNETF9JTklUX1ZJREVPOyAgLyogU2VlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgKi8KKwlTRExfU3VyZmFjZSAqc2NyZWVuOworCVVpbnQ4ICB2aWRlb19icHAgPSAwOworCVVpbnQzMiB2aWRlb2ZsYWdzID0gU0RMX1NXU1VSRkFDRTsKKwlpbnQgICAgZG9uZTsKKyAgICAgICAgU0RMX0V2ZW50IGV2ZW50OworCisJLyogSW5pdGlhbGl6ZSB0aGUgU0RMIGxpYnJhcnkgKi8KKwlpZiAoIFNETF9Jbml0KGluaXRmbGFncykgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwKKwkJCVNETF9HZXRFcnJvcigpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBTZXQgNjQweDQ4MCB2aWRlbyBtb2RlICovCisJc2NyZWVuPVNETF9TZXRWaWRlb01vZGUoNjQwLDQ4MCwgdmlkZW9fYnBwLCB2aWRlb2ZsYWdzKTsKKyAgICAgICAgaWYgKHNjcmVlbiA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0IDY0MHg0ODB4JWQgdmlkZW8gbW9kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19icHAsIFNETF9HZXRFcnJvcigpKTsKKwkJU0RMX1F1aXQoKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlkb25lID0gMDsKKwl3aGlsZSAoICFkb25lICkgeworCisJCS8qIENoZWNrIGZvciBldmVudHMgKi8KKwkJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZldmVudCkgKSB7CisJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKworCQkJCWNhc2UgU0RMX01PVVNFTU9USU9OOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX0tFWURPV046CisJCQkJCS8qIEFueSBrZXlwcmVzcyBxdWl0cyB0aGUgYXBwLi4uICovCisJCQkJY2FzZSBTRExfUVVJVDoKKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCQorCS8qIENsZWFuIHVwIHRoZSBTREwgbGlicmFyeSAqLworCVNETF9RdWl0KCk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNjEyNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovU0RMTWFpbi5uaWIvY2xhc3Nlcy5uaWIgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9TRExNYWluLm5pYi9jbGFzc2VzLm5pYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTllYWFkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovU0RMTWFpbi5uaWIvY2xhc3Nlcy5uaWIKQEAgLTAsMCArMSwxOSBAQAoreworICAgIElCQ2xhc3NlcyA9ICgKKyAgICAgICAge0NMQVNTID0gRmlyc3RSZXNwb25kZXI7IExBTkdVQUdFID0gT2JqQzsgU1VQRVJDTEFTUyA9IE5TT2JqZWN0OyB9LCAKKyAgICAgICAgeworICAgICAgICAgICAgQUNUSU9OUyA9IHsKKyAgICAgICAgICAgICAgICBoZWxwID0gaWQ7IAorICAgICAgICAgICAgICAgIG5ld0dhbWUgPSBpZDsgCisgICAgICAgICAgICAgICAgb3BlbkdhbWUgPSBpZDsgCisgICAgICAgICAgICAgICAgcHJlZnNNZW51ID0gaWQ7IAorICAgICAgICAgICAgICAgIHNhdmVHYW1lID0gaWQ7IAorICAgICAgICAgICAgICAgIHNhdmVHYW1lQXMgPSBpZDsgCisgICAgICAgICAgICB9OyAKKyAgICAgICAgICAgIENMQVNTID0gU0RMTWFpbjsgCisgICAgICAgICAgICBMQU5HVUFHRSA9IE9iakM7IAorICAgICAgICAgICAgU1VQRVJDTEFTUyA9IE5TT2JqZWN0OyAKKyAgICAgICAgfQorICAgICk7IAorICAgIElCVmVyc2lvbiA9IDE7IAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliL2luZm8ubmliIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovU0RMTWFpbi5uaWIvaW5mby5uaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2ZmI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliL2luZm8ubmliCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5JQkRvY3VtZW50TG9jYXRpb248L2tleT4KKwk8c3RyaW5nPjYyIDExNyAzNTYgMjQwIDAgMCAxMTUyIDg0OCA8L3N0cmluZz4KKwk8a2V5PklCRWRpdG9yUG9zaXRpb25zPC9rZXk+CisJPGRpY3Q+CisJCTxrZXk+Mjk8L2tleT4KKwkJPHN0cmluZz42MiAzNjIgMTk1IDQ0IDAgMCAxMTUyIDg0OCA8L3N0cmluZz4KKwk8L2RpY3Q+CisJPGtleT5JQkZyYW1ld29yayBWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4yOTEuMDwvc3RyaW5nPgorCTxrZXk+SUJPcGVuT2JqZWN0czwva2V5PgorCTxhcnJheT4KKwkJPGludGVnZXI+Mjk8L2ludGVnZXI+CisJPC9hcnJheT4KKwk8a2V5PklCU3lzdGVtIFZlcnNpb248L2tleT4KKwk8c3RyaW5nPjZMNjA8L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9TRExNYWluLm5pYi9vYmplY3RzLm5pYiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL1NETE1haW4ubmliL29iamVjdHMubmliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzgwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vRW5nbGlzaC5scHJvai9TRExNYWluLm5pYi9vYmplY3RzLm5pYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vSW5mby5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzhkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vSW5mby5wbGlzdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20ueW91cmNvbXBhbnkuwqtQUk9KRUNUTkFNRUFTWE1Mwrs8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5Pk5TTWFpbk5pYkZpbGU8L2tleT4KKwk8c3RyaW5nPlNETE1haW48L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMQXBwX1ByZWZpeC5wY2ggYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMQXBwX1ByZWZpeC5wY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwOTUwNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExBcHBfUHJlZml4LnBjaApAQCAtMCwwICsxLDkgQEAKKy8vCisvLyBQcmVmaXggaGVhZGVyIGZvciBhbGwgc291cmNlIGZpbGVzIG9mIHRoZSAnx1BST0pFQ1ROQU1FyCcgdGFyZ2V0IGluIHRoZSAnx1BST0pFQ1ROQU1FyCcgcHJvamVjdAorLy8KKworI2luY2x1ZGUgIlNETC5oIgorCisjaWZkZWYgX19PQkpDX18KKyAgICAjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMQ29jb2FBcHAueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExDb2NvYUFwcC54Y29kZXByb2ovVGVtcGxhdGVJbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkY2JlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMQ29jb2FBcHAueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApAQCAtMCwwICsxLDEyIEBACit7CisJRmlsZXNUb1JlbmFtZSA9IHsKKwkJIlNETEFwcF9QcmVmaXgucGNoIiA9ICLHUFJPSkVDVE5BTUXIX1ByZWZpeC5wY2giOworCX07CisJRmlsZXNUb01hY3JvRXhwYW5kID0gKAorCQkix1BST0pFQ1ROQU1FyF9QcmVmaXgucGNoIiwKKwkJIkluZm8ucGxpc3QiLAorCQkiRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyIsCisJCSJtYWluLmMiLAorCSk7CisJRGVzY3JpcHRpb24gPSAiVGhpcyBwcm9qZWN0IGJ1aWxkcyBhbiBTREwtYmFzZWQgYXBwbGljYXRpb24gd2l0aCBDb2NvYSBtZW51cy4iOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL1NETENvY29hQXBwLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vU0RMQ29jb2FBcHAueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU5NjYyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL1NETENvY29hQXBwLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTAsMCArMSwzMzYgQEAKKy8vICEkKlVURjgqJCEKK3sKKwlhcmNoaXZlVmVyc2lvbiA9IDE7CisJY2xhc3NlcyA9IHsKKwl9OworCW9iamVjdFZlcnNpb24gPSA0MjsKKwlvYmplY3RzID0geworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQkwMDJGMzlGQTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovOyB9OworCQkwMDJGM0EwMDA5RDA4ODQ2MDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjNBMkUwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQTJDMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gKi87IH07CisJCTAwMkYzQTNGMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0EzRTA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jICovOyB9OworCQkwMDJGM0FGMTA5RDA4RjEwMDBFQkVCODggLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQUVGMDlEMDhGMTAwMEVCRUI4OCAvKiBTRExNYWluLm5pYiAqLzsgfTsKKwkJOEQxMTA3MkIwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi87IH07CisJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEJ1aWxkU3R5bGUgc2VjdGlvbiAqLworCQk0QTk1MDRDQ0ZGRTZBNEIzMTFDQTBDQkEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBQQlhCdWlsZFN0eWxlOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTRBOTUwNENERkZFNkE0QjMxMUNBMENCQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gUEJYQnVpbGRTdHlsZTsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgUEJYQnVpbGRTdHlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGRDA5RDA4ODM0MDBFQkVCODggLyogQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxMDsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzQTAwMDlEMDg4NDYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCW5hbWUgPSAiQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUiOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gU0RMLmZyYW1ld29yazsgcGF0aCA9IC9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMDAyRjNBMkIwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETE1haW4uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU0RMTWFpbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBtYWluLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNBRjAwOUQwOEYxMDAwRUJFQjg4IC8qIEVuZ2xpc2ggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLm5pYjsgbmFtZSA9IEVuZ2xpc2g7IHBhdGggPSBFbmdsaXNoLmxwcm9qL1NETE1haW4ubmliOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwODlDMTY1REZFODQwRTBDQzAyQUFDMDcgLyogRW5nbGlzaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAxMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnN0cmluZ3M7IG5hbWUgPSBFbmdsaXNoOyBwYXRoID0gRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5nczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQ29jb2EuZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkyOUI5NzMyNEZEQ0ZBMzk0MTFDQTJDRUEgLyogQXBwS2l0LmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQXBwS2l0LmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTI5Qjk3MzI1RkRDRkEzOTQxMUNBMkNFQSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gRm91bmRhdGlvbi5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Gb3VuZGF0aW9uLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMzJDQTRGNjMwMzY4RDFFRTAwQzkxNzgzIC8qIMKrUFJPSkVDVE5BTUXCu19QcmVmaXgucGNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gZmlsZTsgcGF0aCA9ICLCq1BST0pFQ1ROQU1FwrtfUHJlZml4LnBjaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMTEwNzMxMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMTEwNzMyMDQ4NkNFQjgwMEU0NzA5MCAvKiDCq1BST0pFQ1ROQU1FwrsuYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSAiwqtQUk9KRUNUTkFNRcK7LmFwcCI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzlGQTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KKwkJMDgwRTk2RERGRTIwMUQ2RDdGMDAwMDAxIC8qIENsYXNzZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzQTJCMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLmggKi8sCisJCQkJMDAyRjNBMkMwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSAqLywKKwkJCSk7CisJCQluYW1lID0gQ2xhc3NlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTEwNThDN0EwRkVBNTRGMDExMUNBMkNCQiAvKiBMaW5rZWQgRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDAyRjM5RjkwOUQwODgxRjAwRUJFQjg4IC8qIFNETC5mcmFtZXdvcmsgKi8sCisJCQkJMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLywKKwkJCSk7CisJCQluYW1lID0gIkxpbmtlZCBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTEwNThDN0EyRkVBNTRGMDExMUNBMkNCQiAvKiBPdGhlciBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkyOUI5NzMyNEZEQ0ZBMzk0MTFDQTJDRUEgLyogQXBwS2l0LmZyYW1ld29yayAqLywKKwkJCQkyOUI5NzMyNUZEQ0ZBMzk0MTFDQTJDRUEgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIMKrUFJPSkVDVE5BTUXCuy5hcHAgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTRGRENGQTM5NDExQ0EyQ0VBIC8qIMKrUFJPSkVDVE5BTUVBU1hNTMK7ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODBFOTZEREZFMjAxRDZEN0YwMDAwMDEgLyogQ2xhc3NlcyAqLywKKwkJCQkyOUI5NzMxNUZEQ0ZBMzk0MTFDQTJDRUEgLyogT3RoZXIgU291cmNlcyAqLywKKwkJCQkyOUI5NzMxN0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUmVzb3VyY2VzICovLAorCQkJCTI5Qjk3MzIzRkRDRkEzOTQxMUNBMkNFQSAvKiBGcmFtZXdvcmtzICovLAorCQkJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLywKKwkJCSk7CisJCQluYW1lID0gIsKrUFJPSkVDVE5BTUVBU1hNTMK7IjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE1RkRDRkEzOTQxMUNBMkNFQSAvKiBPdGhlciBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzMkNBNEY2MzAzNjhEMUVFMDBDOTE3ODMgLyogwqtQUk9KRUNUTkFNRcK7X1ByZWZpeC5wY2ggKi8sCisJCQkJMDAyRjNBM0UwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyAqLywKKwkJCSk7CisJCQluYW1lID0gIk90aGVyIFNvdXJjZXMiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTdGRENGQTM5NDExQ0EyQ0VBIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQxMTA3MzEwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm8ucGxpc3QgKi8sCisJCQkJMDg5QzE2NUNGRTg0MEUwQ0MwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovLAorCQkJCTAwMkYzQUVGMDlEMDhGMTAwMEVCRUI4OCAvKiBTRExNYWluLm5pYiAqLywKKwkJCSk7CisJCQluYW1lID0gUmVzb3VyY2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMjNGRENGQTM5NDExQ0EyQ0VBIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTEwNThDN0EwRkVBNTRGMDExMUNBMkNCQiAvKiBMaW5rZWQgRnJhbWV3b3JrcyAqLywKKwkJCQkxMDU4QzdBMkZFQTU0RjAxMTFDQTJDQkIgLyogT3RoZXIgRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQluYW1lID0gRnJhbWV3b3JrczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCQk4RDExMDcyNjA0ODZDRUI4MDBFNDcwOTAgLyogwqtQUk9KRUNUTkFNRcK7ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEMwMUZDRjRBMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiwqtQUk9KRUNUTkFNRcK7IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjM5RkQwOUQwODgzNDAwRUJFQjg4IC8qIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCX07CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICLCq1BST0pFQ1ROQU1FwrsiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCXByb2R1Y3ROYW1lID0gIsKrUFJPSkVDVE5BTUXCuyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIMKrUFJPSkVDVE5BTUXCuy5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJMjlCOTczMTNGRENGQTM5NDExQ0EyQ0VBIC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBDMDFGQ0Y0RTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJTRExDb2NvYUFwcCIgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJfTsKKwkJCWJ1aWxkU3R5bGVzID0gKAorCQkJCTRBOTUwNENDRkZFNkE0QjMxMUNBMENCQSAvKiBEZWJ1ZyAqLywKKwkJCQk0QTk1MDRDREZGRTZBNEIzMTFDQTBDQkEgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCW1haW5Hcm91cCA9IDI5Qjk3MzE0RkRDRkEzOTQxMUNBMkNFQSAvKiDCq1BST0pFQ1ROQU1FQVNYTUzCuyAqLzsKKwkJCXByb2plY3REaXJQYXRoID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMTEwNzI2MDQ4NkNFQjgwMEU0NzA5MCAvKiDCq1BST0pFQ1ROQU1FwrsgKi8sCisJCQkpOworCQl9OworLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MjkwNDg2Q0VCODAwRTQ3MDkwIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJOEQxMTA3MkIwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLywKKwkJCQkwMDJGM0FGMTA5RDA4RjEwMDBFQkVCODggLyogU0RMTWFpbi5uaWIgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzJDMDQ4NkNFQjgwMEU0NzA5MCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMDAyRjNBMkUwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzQTNGMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFZhcmlhbnRHcm91cCBzZWN0aW9uICovCisJCTAwMkYzQUVGMDlEMDhGMTAwMEVCRUI4OCAvKiBTRExNYWluLm5pYiAqLyA9IHsKKwkJCWlzYSA9IFBCWFZhcmlhbnRHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzQUYwMDlEMDhGMTAwMEVCRUI4OCAvKiBFbmdsaXNoICovLAorCQkJKTsKKwkJCW5hbWUgPSBTRExNYWluLm5pYjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4OUMxNjVDRkU4NDBFMENDMDJBQUMwNyAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLyA9IHsKKwkJCWlzYSA9IFBCWFZhcmlhbnRHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA4OUMxNjVERkU4NDBFMENDMDJBQUMwNyAvKiBFbmdsaXNoICovLAorCQkJKTsKKwkJCW5hbWUgPSBJbmZvUGxpc3Quc3RyaW5nczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYVmFyaWFudEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCQlDMDFGQ0Y0QjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL0FwcGxpY2F0aW9ucyI7CisJCQkJUFJPRFVDVF9OQU1FID0gIsKrUFJPSkVDVE5BTUXCuyI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQkJWkVST19MSU5LID0gWUVTOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJQzAxRkNGNEMwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAoCisJCQkJCXBwYywKKwkJCQkJaTM4NiwKKwkJCQkpOworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IE5POworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCQlQUk9EVUNUX05BTUUgPSAiwqtQUk9KRUNUTkFNRcK7IjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGFwcDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJQzAxRkNGNEYwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MsCisJCQkJCSIkKEZSQU1FV09SS19TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMsCisJCQkJCSIkKEhFQURFUl9TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUMwMUZDRjUwMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCSIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MsCisJCQkJCSIkKEZSQU1FV09SS19TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzIiwKKwkJCQkJL0xpYnJhcnkvRnJhbWV3b3Jrcy9TREwuZnJhbWV3b3JrL0hlYWRlcnMsCisJCQkJCSIkKEhFQURFUl9TRUFSQ0hfUEFUSFMpIiwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCQlDMDFGQ0Y0QTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIsKrUFJPSkVDVE5BTUXCuyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlDMDFGQ0Y0QjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8sCisJCQkJQzAxRkNGNEMwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJQzAxRkNGNEUwOEE5NTQ1NDAwNTQyNDdCIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiU0RMQ29jb2FBcHAiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJQzAxRkNGNEYwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovLAorCQkJCUMwMUZDRjUwMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJfTsKKwlyb290T2JqZWN0ID0gMjlCOTczMTNGRENGQTM5NDExQ0EyQ0VBIC8qIFByb2plY3Qgb2JqZWN0ICovOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL1NETE1haW4uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExNYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2ZDkwYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExNYWluLmgKQEAgLTAsMCArMSwxNiBAQAorLyogICBTRExNYWluLm0gLSBtYWluIGVudHJ5IHBvaW50IGZvciBvdXIgQ29jb2EtaXplZCBTREwgYXBwCisgICAgICAgSW5pdGlhbCBWZXJzaW9uOiBEYXJyZWxsIFdhbGlzc2VyIDxkd2FsaXNzMUBwdXJkdWUuZWR1PgorICAgICAgIE5vbi1OSUItQ29kZSAmIG90aGVyIGNoYW5nZXM6IE1heCBIb3JuIDxtYXhAcXVlbmRpLmRlPgorCisgICAgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzCisqLworCisjaWZuZGVmIF9TRExNYWluX2hfCisjZGVmaW5lIF9TRExNYWluX2hfCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgU0RMTWFpbiA6IE5TT2JqZWN0CitAZW5kCisKKyNlbmRpZiAvKiBfU0RMTWFpbl9oXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL1NETE1haW4ubSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExNYWluLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2NWEyMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBDb2NvYSBBcHBsaWNhdGlvbi9TRExNYWluLm0KQEAgLTAsMCArMSwzODMgQEAKKy8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAorICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKyAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KKworICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcworKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETE1haW4uaCIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gLyogZm9yIE1BWFBBVEhMRU4gKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogRm9yIHNvbWUgcmVhb24sIEFwcGxlIHJlbW92ZWQgc2V0QXBwbGVNZW51IGZyb20gdGhlIGhlYWRlcnMgaW4gMTAuNCwKKyBidXQgdGhlIG1ldGhvZCBzdGlsbCBpcyB0aGVyZSBhbmQgd29ya3MuIFRvIGF2b2lkIHdhcm5pbmdzLCB3ZSBkZWNsYXJlCisgaXQgb3Vyc2VsdmVzIGhlcmUuICovCitAaW50ZXJmYWNlIE5TQXBwbGljYXRpb24oU0RMX01pc3NpbmdfTWV0aG9kcykKKy0gKHZvaWQpc2V0QXBwbGVNZW51OihOU01lbnUgKiltZW51OworQGVuZAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBTRExNYWluLm5pYiBvciBub3QgKi8KKyNkZWZpbmUJCVNETF9VU0VfTklCX0ZJTEUJMAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBDUFMgKGRvY2tpbmcpIG9yIG5vdCAqLworI2RlZmluZQkJU0RMX1VTRV9DUFMJCTEKKyNpZmRlZiBTRExfVVNFX0NQUworLyogUG9ydGlvbnMgb2YgQ1BTLmggKi8KK3R5cGVkZWYgc3RydWN0IENQU1Byb2Nlc3NTZXJOdW0KK3sKKwlVSW50MzIJCWxvOworCVVJbnQzMgkJaGk7Cit9IENQU1Byb2Nlc3NTZXJOdW07CisKK2V4dGVybiBPU0VycglDUFNHZXRDdXJyZW50UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKK2V4dGVybiBPU0VyciAJQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbiggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuLCBVSW50MzIgX2FyZzIsIFVJbnQzMiBfYXJnMywgVUludDMyIF9hcmc0LCBVSW50MzIgX2FyZzUpOworZXh0ZXJuIE9TRXJyCUNQU1NldEZyb250UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKKworI2VuZGlmIC8qIFNETF9VU0VfQ1BTICovCisKK3N0YXRpYyBpbnQgICAgZ0FyZ2M7CitzdGF0aWMgY2hhciAgKipnQXJndjsKK3N0YXRpYyBCT09MICAgZ0ZpbmRlckxhdW5jaDsKK3N0YXRpYyBCT09MICAgZ0NhbGxlZEFwcE1haW5saW5lID0gRkFMU0U7CisKK3N0YXRpYyBOU1N0cmluZyAqZ2V0QXBwbGljYXRpb25OYW1lKHZvaWQpCit7CisgICAgY29uc3QgTlNEaWN0aW9uYXJ5ICpkaWN0OworICAgIE5TU3RyaW5nICphcHBOYW1lID0gMDsKKworICAgIC8qIERldGVybWluZSB0aGUgYXBwbGljYXRpb24gbmFtZSAqLworICAgIGRpY3QgPSAoY29uc3QgTlNEaWN0aW9uYXJ5ICopQ0ZCdW5kbGVHZXRJbmZvRGljdGlvbmFyeShDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgaWYgKGRpY3QpCisgICAgICAgIGFwcE5hbWUgPSBbZGljdCBvYmplY3RGb3JLZXk6IEAiQ0ZCdW5kbGVOYW1lIl07CisgICAgCisgICAgaWYgKCFbYXBwTmFtZSBsZW5ndGhdKQorICAgICAgICBhcHBOYW1lID0gW1tOU1Byb2Nlc3NJbmZvIHByb2Nlc3NJbmZvXSBwcm9jZXNzTmFtZV07CisKKyAgICByZXR1cm4gYXBwTmFtZTsKK30KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKy8qIEEgaGVscGVyIGNhdGVnb3J5IGZvciBOU1N0cmluZyAqLworQGludGVyZmFjZSBOU1N0cmluZyAoUmVwbGFjZVN1YlN0cmluZykKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgU0RMQXBwbGljYXRpb24gOiBOU0FwcGxpY2F0aW9uCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTRExBcHBsaWNhdGlvbgorLyogSW52b2tlZCBmcm9tIHRoZSBRdWl0IG1lbnUgaXRlbSAqLworLSAodm9pZCl0ZXJtaW5hdGU6KGlkKXNlbmRlcgoreworICAgIC8qIFBvc3QgYSBTRExfUVVJVCBldmVudCAqLworICAgIFNETF9FdmVudCBldmVudDsKKyAgICBldmVudC50eXBlID0gU0RMX1FVSVQ7CisgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOworfQorQGVuZAorCisvKiBUaGUgbWFpbiBjbGFzcyBvZiB0aGUgYXBwbGljYXRpb24sIHRoZSBhcHBsaWNhdGlvbidzIGRlbGVnYXRlICovCitAaW1wbGVtZW50YXRpb24gU0RMTWFpbgorCisvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworLSAodm9pZCkgc2V0dXBXb3JraW5nRGlyZWN0b3J5OihCT09MKXNob3VsZENoZGlyCit7CisgICAgaWYgKHNob3VsZENoZGlyKQorICAgIHsKKyAgICAgICAgY2hhciBwYXJlbnRkaXJbTUFYUEFUSExFTl07CisgICAgICAgIENGVVJMUmVmIHVybCA9IENGQnVuZGxlQ29weUJ1bmRsZVVSTChDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgICAgIENGVVJMUmVmIHVybDIgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KDAsIHVybCk7CisgICAgICAgIGlmIChDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbih1cmwyLCAxLCAoVUludDggKilwYXJlbnRkaXIsIE1BWFBBVEhMRU4pKSB7CisgICAgICAgICAgICBjaGRpcihwYXJlbnRkaXIpOyAgIC8qIGNoZGlyIHRvIHRoZSBiaW5hcnkgYXBwJ3MgcGFyZW50ICovCisgICAgICAgIH0KKyAgICAgICAgQ0ZSZWxlYXNlKHVybCk7CisgICAgICAgIENGUmVsZWFzZSh1cmwyKTsKKyAgICB9Cit9CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisKKy8qIEZpeCBtZW51IHRvIGNvbnRhaW4gdGhlIHJlYWwgYXBwIG5hbWUgaW5zdGVhZCBvZiAiU0RMIEFwcCIgKi8KKy0gKHZvaWQpZml4TWVudTooTlNNZW51ICopYU1lbnUgd2l0aEFwcE5hbWU6KE5TU3RyaW5nICopYXBwTmFtZQoreworICAgIE5TUmFuZ2UgYVJhbmdlOworICAgIE5TRW51bWVyYXRvciAqZW51bWVyYXRvcjsKKyAgICBOU01lbnVJdGVtICptZW51SXRlbTsKKworICAgIGFSYW5nZSA9IFtbYU1lbnUgdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgaWYgKGFSYW5nZS5sZW5ndGggIT0gMCkKKyAgICAgICAgW2FNZW51IHNldFRpdGxlOiBbW2FNZW51IHRpdGxlXSBzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOmFSYW5nZSB3aXRoOmFwcE5hbWVdXTsKKworICAgIGVudW1lcmF0b3IgPSBbW2FNZW51IGl0ZW1BcnJheV0gb2JqZWN0RW51bWVyYXRvcl07CisgICAgd2hpbGUgKChtZW51SXRlbSA9IFtlbnVtZXJhdG9yIG5leHRPYmplY3RdKSkKKyAgICB7CisgICAgICAgIGFSYW5nZSA9IFtbbWVudUl0ZW0gdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgICAgIGlmIChhUmFuZ2UubGVuZ3RoICE9IDApCisgICAgICAgICAgICBbbWVudUl0ZW0gc2V0VGl0bGU6IFtbbWVudUl0ZW0gdGl0bGVdIHN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6YVJhbmdlIHdpdGg6YXBwTmFtZV1dOworICAgICAgICBpZiAoW21lbnVJdGVtIGhhc1N1Ym1lbnVdKQorICAgICAgICAgICAgW3NlbGYgZml4TWVudTpbbWVudUl0ZW0gc3VibWVudV0gd2l0aEFwcE5hbWU6YXBwTmFtZV07CisgICAgfQorICAgIFsgYU1lbnUgc2l6ZVRvRml0IF07Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIHNldEFwcGxpY2F0aW9uTWVudSh2b2lkKQoreworICAgIC8qIHdhcm5pbmc6IHRoaXMgY29kZSBpcyB2ZXJ5IG9kZCAqLworICAgIE5TTWVudSAqYXBwbGVNZW51OworICAgIE5TTWVudUl0ZW0gKm1lbnVJdGVtOworICAgIE5TU3RyaW5nICp0aXRsZTsKKyAgICBOU1N0cmluZyAqYXBwTmFtZTsKKyAgICAKKyAgICBhcHBOYW1lID0gZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgICAgYXBwbGVNZW51ID0gW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCIiXTsKKyAgICAKKyAgICAvKiBBZGQgbWVudSBpdGVtcyAqLworICAgIHRpdGxlID0gW0AiQWJvdXQgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3RvcihvcmRlckZyb250U3RhbmRhcmRBYm91dFBhbmVsOikga2V5RXF1aXZhbGVudDpAIiJdOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtOltOU01lbnVJdGVtIHNlcGFyYXRvckl0ZW1dXTsKKworICAgIHRpdGxlID0gW0AiSGlkZSAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKGhpZGU6KSBrZXlFcXVpdmFsZW50OkAiaCJdOworCisgICAgbWVudUl0ZW0gPSAoTlNNZW51SXRlbSAqKVthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTpAIkhpZGUgT3RoZXJzIiBhY3Rpb246QHNlbGVjdG9yKGhpZGVPdGhlckFwcGxpY2F0aW9uczopIGtleUVxdWl2YWxlbnQ6QCJoIl07CisgICAgW21lbnVJdGVtIHNldEtleUVxdWl2YWxlbnRNb2RpZmllck1hc2s6KE5TQWx0ZXJuYXRlS2V5TWFza3xOU0NvbW1hbmRLZXlNYXNrKV07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6QCJTaG93IEFsbCIgYWN0aW9uOkBzZWxlY3Rvcih1bmhpZGVBbGxBcHBsaWNhdGlvbnM6KSBrZXlFcXVpdmFsZW50OkAiIl07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW06W05TTWVudUl0ZW0gc2VwYXJhdG9ySXRlbV1dOworCisgICAgdGl0bGUgPSBbQCJRdWl0ICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3IodGVybWluYXRlOikga2V5RXF1aXZhbGVudDpAInEiXTsKKworICAgIAorICAgIC8qIFB1dCBtZW51IGludG8gdGhlIG1lbnViYXIgKi8KKyAgICBtZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiIgYWN0aW9uOm5pbCBrZXlFcXVpdmFsZW50OkAiIl07CisgICAgW21lbnVJdGVtIHNldFN1Ym1lbnU6YXBwbGVNZW51XTsKKyAgICBbW05TQXBwIG1haW5NZW51XSBhZGRJdGVtOm1lbnVJdGVtXTsKKworICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSBhcHBsaWNhdGlvbiBtZW51ICovCisgICAgW05TQXBwIHNldEFwcGxlTWVudTphcHBsZU1lbnVdOworCisgICAgLyogRmluYWxseSBnaXZlIHVwIG91ciByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RzICovCisgICAgW2FwcGxlTWVudSByZWxlYXNlXTsKKyAgICBbbWVudUl0ZW0gcmVsZWFzZV07Cit9CisKKy8qIENyZWF0ZSBhIHdpbmRvdyBtZW51ICovCitzdGF0aWMgdm9pZCBzZXR1cFdpbmRvd01lbnUodm9pZCkKK3sKKyAgICBOU01lbnUgICAgICAqd2luZG93TWVudTsKKyAgICBOU01lbnVJdGVtICAqd2luZG93TWVudUl0ZW07CisgICAgTlNNZW51SXRlbSAgKm1lbnVJdGVtOworCisgICAgd2luZG93TWVudSA9IFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiV2luZG93Il07CisgICAgCisgICAgLyogIk1pbmltaXplIiBpdGVtICovCisgICAgbWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJNaW5pbWl6ZSIgYWN0aW9uOkBzZWxlY3RvcihwZXJmb3JtTWluaWF0dXJpemU6KSBrZXlFcXVpdmFsZW50OkAibSJdOworICAgIFt3aW5kb3dNZW51IGFkZEl0ZW06bWVudUl0ZW1dOworICAgIFttZW51SXRlbSByZWxlYXNlXTsKKyAgICAKKyAgICAvKiBQdXQgbWVudSBpbnRvIHRoZSBtZW51YmFyICovCisgICAgd2luZG93TWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJXaW5kb3ciIGFjdGlvbjpuaWwga2V5RXF1aXZhbGVudDpAIiJdOworICAgIFt3aW5kb3dNZW51SXRlbSBzZXRTdWJtZW51OndpbmRvd01lbnVdOworICAgIFtbTlNBcHAgbWFpbk1lbnVdIGFkZEl0ZW06d2luZG93TWVudUl0ZW1dOworICAgIAorICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSB3aW5kb3cgbWVudSAqLworICAgIFtOU0FwcCBzZXRXaW5kb3dzTWVudTp3aW5kb3dNZW51XTsKKworICAgIC8qIEZpbmFsbHkgZ2l2ZSB1cCBvdXIgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyAqLworICAgIFt3aW5kb3dNZW51IHJlbGVhc2VdOworICAgIFt3aW5kb3dNZW51SXRlbSByZWxlYXNlXTsKK30KKworLyogUmVwbGFjZW1lbnQgZm9yIE5TQXBwbGljYXRpb25NYWluICovCitzdGF0aWMgdm9pZCBDdXN0b21BcHBsaWNhdGlvbk1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBOU0F1dG9yZWxlYXNlUG9vbAkqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICAgIFNETE1haW4JCQkJKnNkbE1haW47CisKKyAgICAvKiBFbnN1cmUgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBpcyBpbml0aWFsaXNlZCAqLworICAgIFtTRExBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07CisgICAgCisjaWZkZWYgU0RMX1VTRV9DUFMKKyAgICB7CisgICAgICAgIENQU1Byb2Nlc3NTZXJOdW0gUFNOOworICAgICAgICAvKiBUZWxsIHRoZSBkb2NrIGFib3V0IHVzICovCisgICAgICAgIGlmICghQ1BTR2V0Q3VycmVudFByb2Nlc3MoJlBTTikpCisgICAgICAgICAgICBpZiAoIUNQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb24oJlBTTiwweDAzLDB4M0MsMHgyQywweDExMDMpKQorICAgICAgICAgICAgICAgIGlmICghQ1BTU2V0RnJvbnRQcm9jZXNzKCZQU04pKQorICAgICAgICAgICAgICAgICAgICBbU0RMQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIH0KKyNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLworCisgICAgLyogU2V0IHVwIHRoZSBtZW51YmFyICovCisgICAgW05TQXBwIHNldE1haW5NZW51OltbTlNNZW51IGFsbG9jXSBpbml0XV07CisgICAgc2V0QXBwbGljYXRpb25NZW51KCk7CisgICAgc2V0dXBXaW5kb3dNZW51KCk7CisKKyAgICAvKiBDcmVhdGUgU0RMTWFpbiBhbmQgbWFrZSBpdCB0aGUgYXBwIGRlbGVnYXRlICovCisgICAgc2RsTWFpbiA9IFtbU0RMTWFpbiBhbGxvY10gaW5pdF07CisgICAgW05TQXBwIHNldERlbGVnYXRlOnNkbE1haW5dOworICAgIAorICAgIC8qIFN0YXJ0IHRoZSBtYWluIGV2ZW50IGxvb3AgKi8KKyAgICBbTlNBcHAgcnVuXTsKKyAgICAKKyAgICBbc2RsTWFpbiByZWxlYXNlXTsKKyAgICBbcG9vbCByZWxlYXNlXTsKK30KKworI2VuZGlmCisKKworLyoKKyAqIENhdGNoIGRvY3VtZW50IG9wZW4gcmVxdWVzdHMuLi50aGlzIGxldHMgdXMgbm90aWNlIGZpbGVzIHdoZW4gdGhlIGFwcAorICogIHdhcyBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgYSBkb2N1bWVudCwgb3Igd2hlbiBhIGRvY3VtZW50IHdhcworICogIGRyYWdnZWQvZHJvcHBlZCBvbiB0aGUgYXBwJ3MgaWNvbi4gWW91IG5lZWQgdG8gaGF2ZSBhCisgKiAgQ0ZCdW5kbGVEb2N1bWVudHNUeXBlIHNlY3Rpb24gaW4geW91ciBJbmZvLnBsaXN0IHRvIGdldCB0aGlzIG1lc3NhZ2UsCisgKiAgYXBwYXJlbnRseS4KKyAqCisgKiBGaWxlcyBhcmUgYWRkZWQgdG8gZ0FyZ3YsIHNvIHRvIHRoZSBhcHAsIHRoZXknbGwgbG9vayBsaWtlIGNvbW1hbmQgbGluZQorICogIGFyZ3VtZW50cy4gUHJldmlvdXNseSwgYXBwcyBsYXVuY2hlZCBmcm9tIHRoZSBmaW5kZXIgaGFkIG5vdGhpbmcgYnV0CisgKiAgYW4gYXJndlswXS4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgbWF5IGJlIHJlY2VpdmVkIG11bHRpcGxlIHRpbWVzIHRvIG9wZW4gc2V2ZXJhbCBkb2NzIG9uIGxhdW5jaC4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgaXMgaWdub3JlZCBvbmNlIHRoZSBhcHAncyBtYWlubGluZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKy0gKEJPT0wpYXBwbGljYXRpb246KE5TQXBwbGljYXRpb24gKil0aGVBcHBsaWNhdGlvbiBvcGVuRmlsZTooTlNTdHJpbmcgKilmaWxlbmFtZQoreworICAgIGNvbnN0IGNoYXIgKnRlbXBhcmc7CisgICAgc2l6ZV90IGFyZ2xlbjsKKyAgICBjaGFyICphcmc7CisgICAgY2hhciAqKm5ld2FyZ3Y7CisKKyAgICBpZiAoIWdGaW5kZXJMYXVuY2gpICAvKiBNYWNPUyBpcyBwYXNzaW5nIGNvbW1hbmQgbGluZSBhcmdzLiAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoZ0NhbGxlZEFwcE1haW5saW5lKSAgLyogYXBwIGhhcyBzdGFydGVkLCBpZ25vcmUgdGhpcyBkb2N1bWVudC4gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdGVtcGFyZyA9IFtmaWxlbmFtZSBVVEY4U3RyaW5nXTsKKyAgICBhcmdsZW4gPSBTRExfc3RybGVuKHRlbXBhcmcpICsgMTsKKyAgICBhcmcgPSAoY2hhciAqKSBTRExfbWFsbG9jKGFyZ2xlbik7CisgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBuZXdhcmd2ID0gKGNoYXIgKiopIHJlYWxsb2MoZ0FyZ3YsIHNpemVvZiAoY2hhciAqKSAqIChnQXJnYyArIDIpKTsKKyAgICBpZiAobmV3YXJndiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX2ZyZWUoYXJnKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBnQXJndiA9IG5ld2FyZ3Y7CisKKyAgICBTRExfc3RybGNweShhcmcsIHRlbXBhcmcsIGFyZ2xlbik7CisgICAgZ0FyZ3ZbZ0FyZ2MrK10gPSBhcmc7CisgICAgZ0FyZ3ZbZ0FyZ2NdID0gTlVMTDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKiBDYWxsZWQgd2hlbiB0aGUgaW50ZXJuYWwgZXZlbnQgbG9vcCBoYXMganVzdCBzdGFydGVkIHJ1bm5pbmcgKi8KKy0gKHZvaWQpIGFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOiAoTlNOb3RpZmljYXRpb24gKikgbm90ZQoreworICAgIGludCBzdGF0dXM7CisKKyAgICAvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworICAgIFtzZWxmIHNldHVwV29ya2luZ0RpcmVjdG9yeTpnRmluZGVyTGF1bmNoXTsKKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICAvKiBTZXQgdGhlIG1haW4gbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCisgICAgW3NlbGYgZml4TWVudTpbTlNBcHAgbWFpbk1lbnVdIHdpdGhBcHBOYW1lOmdldEFwcGxpY2F0aW9uTmFtZSgpXTsKKyNlbmRpZgorCisgICAgLyogSGFuZCBvZmYgdG8gbWFpbiBhcHBsaWNhdGlvbiBjb2RlICovCisgICAgZ0NhbGxlZEFwcE1haW5saW5lID0gVFJVRTsKKyAgICBzdGF0dXMgPSBTRExfbWFpbiAoZ0FyZ2MsIGdBcmd2KTsKKworICAgIC8qIFdlJ3JlIGRvbmUsIHRoYW5rIHlvdSBmb3IgcGxheWluZyAqLworICAgIGV4aXQoc3RhdHVzKTsKK30KK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCisKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZmZlclNpemU7CisgICAgdW5zaWduZWQgaW50IHNlbGZMZW4gPSBbc2VsZiBsZW5ndGhdOworICAgIHVuc2lnbmVkIGludCBhU3RyaW5nTGVuID0gW2FTdHJpbmcgbGVuZ3RoXTsKKyAgICB1bmljaGFyICpidWZmZXI7CisgICAgTlNSYW5nZSBsb2NhbFJhbmdlOworICAgIE5TU3RyaW5nICpyZXN1bHQ7CisKKyAgICBidWZmZXJTaXplID0gc2VsZkxlbiArIGFTdHJpbmdMZW4gLSBhUmFuZ2UubGVuZ3RoOworICAgIGJ1ZmZlciA9ICh1bmljaGFyICopTlNBbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlclNpemUqc2l6ZW9mKHVuaWNoYXIpKTsKKyAgICAKKyAgICAvKiBHZXQgZmlyc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVJhbmdlLmxvY2F0aW9uOworICAgIFtzZWxmIGdldENoYXJhY3RlcnM6YnVmZmVyIHJhbmdlOmxvY2FsUmFuZ2VdOworICAgIAorICAgIC8qIEdldCBtaWRkbGUgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVN0cmluZ0xlbjsKKyAgICBbYVN0cmluZyBnZXRDaGFyYWN0ZXJzOihidWZmZXIrYVJhbmdlLmxvY2F0aW9uKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAgCisgICAgLyogR2V0IGxhc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSBhUmFuZ2UubG9jYXRpb24gKyBhUmFuZ2UubGVuZ3RoOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gc2VsZkxlbiAtIGxvY2FsUmFuZ2UubG9jYXRpb247CisgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbithU3RyaW5nTGVuKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAKKyAgICAvKiBCdWlsZCBvdXRwdXQgc3RyaW5nICovCisgICAgcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhDaGFyYWN0ZXJzOmJ1ZmZlciBsZW5ndGg6YnVmZmVyU2l6ZV07CisgICAgCisgICAgTlNEZWFsbG9jYXRlTWVtb3J5UGFnZXMoYnVmZmVyLCBidWZmZXJTaXplKTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCisKKworCisjaWZkZWYgbWFpbgorIyAgdW5kZWYgbWFpbgorI2VuZGlmCisKKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBleGVjdXRhYmxlIC0gc2hvdWxkICpub3QqIGJlIFNETF9tYWluISAqLworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgaW50byBhIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIC8qIFRoaXMgaXMgcGFzc2VkIGlmIHdlIGFyZSBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgKi8KKyAgICBpZiAoIGFyZ2MgPj0gMiAmJiBzdHJuY21wIChhcmd2WzFdLCAiLXBzbiIsIDQpID09IDAgKSB7CisgICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogMik7CisgICAgICAgIGdBcmd2WzBdID0gYXJndlswXTsKKyAgICAgICAgZ0FyZ3ZbMV0gPSBOVUxMOworICAgICAgICBnQXJnYyA9IDE7CisgICAgICAgIGdGaW5kZXJMYXVuY2ggPSBZRVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGdBcmdjID0gYXJnYzsKKyAgICAgICAgZ0FyZ3YgPSAoY2hhciAqKikgU0RMX21hbGxvYyhzaXplb2YgKGNoYXIgKikgKiAoYXJnYysxKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYXJnYzsgaSsrKQorICAgICAgICAgICAgZ0FyZ3ZbaV0gPSBhcmd2W2ldOworICAgICAgICBnRmluZGVyTGF1bmNoID0gTk87CisgICAgfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorICAgIFtTRExBcHBsaWNhdGlvbiBwb3NlQXNDbGFzczpbTlNBcHBsaWNhdGlvbiBjbGFzc11dOworICAgIE5TQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbHNlCisgICAgQ3VzdG9tQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgQ29jb2EgQXBwbGljYXRpb24vbWFpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE1ZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIENvY29hIEFwcGxpY2F0aW9uL21haW4uYwpAQCAtMCwwICsxLDY1IEBACisKKy8qIFNpbXBsZSBwcm9ncmFtOiAgQ3JlYXRlIGEgYmxhbmsgd2luZG93LCB3YWl0IGZvciBrZXlwcmVzcywgcXVpdC4KKworICAgUGxlYXNlIHNlZSB0aGUgU0RMIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gdXNpbmcgdGhlIFNETCBBUEk6CisgICAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vU0RML2RvY3MuaHRtbAorKi8KKyAgIAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJVWludDMyIGluaXRmbGFncyA9IFNETF9JTklUX1ZJREVPOyAgLyogU2VlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgKi8KKwlTRExfU3VyZmFjZSAqc2NyZWVuOworCVVpbnQ4ICB2aWRlb19icHAgPSAwOworCVVpbnQzMiB2aWRlb2ZsYWdzID0gU0RMX1NXU1VSRkFDRTsKKwlpbnQgICAgZG9uZTsKKyAgICAgICAgU0RMX0V2ZW50IGV2ZW50OworCisJLyogSW5pdGlhbGl6ZSB0aGUgU0RMIGxpYnJhcnkgKi8KKwlpZiAoIFNETF9Jbml0KGluaXRmbGFncykgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwKKwkJCVNETF9HZXRFcnJvcigpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBTZXQgNjQweDQ4MCB2aWRlbyBtb2RlICovCisJc2NyZWVuPVNETF9TZXRWaWRlb01vZGUoNjQwLDQ4MCwgdmlkZW9fYnBwLCB2aWRlb2ZsYWdzKTsKKyAgICAgICAgaWYgKHNjcmVlbiA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0IDY0MHg0ODB4JWQgdmlkZW8gbW9kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19icHAsIFNETF9HZXRFcnJvcigpKTsKKwkJU0RMX1F1aXQoKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlkb25lID0gMDsKKwl3aGlsZSAoICFkb25lICkgeworCisJCS8qIENoZWNrIGZvciBldmVudHMgKi8KKwkJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZldmVudCkgKSB7CisJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKworCQkJCWNhc2UgU0RMX01PVVNFTU9USU9OOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX0tFWURPV046CisJCQkJCS8qIEFueSBrZXlwcmVzcyBxdWl0cyB0aGUgYXBwLi4uICovCisJCQkJY2FzZSBTRExfUVVJVDoKKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCQorCS8qIENsZWFuIHVwIHRoZSBTREwgbGlicmFyeSAqLworCVNETF9RdWl0KCk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2MTI0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzhkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL0luZm8ucGxpc3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+JHtFWEVDVVRBQkxFX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLnlvdXJjb21wYW55LsKrUFJPSkVDVE5BTUVBU1hNTMK7PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPiR7UFJPRFVDVF9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5OU01haW5OaWJGaWxlPC9rZXk+CisJPHN0cmluZz5TRExNYWluPC9zdHJpbmc+CisJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+CisJPHN0cmluZz5OU0FwcGxpY2F0aW9uPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExBcHBfUHJlZml4LnBjaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vU0RMQXBwX1ByZWZpeC5wY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwOTUwNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vU0RMQXBwX1ByZWZpeC5wY2gKQEAgLTAsMCArMSw5IEBACisvLworLy8gUHJlZml4IGhlYWRlciBmb3IgYWxsIHNvdXJjZSBmaWxlcyBvZiB0aGUgJ8dQUk9KRUNUTkFNRcgnIHRhcmdldCBpbiB0aGUgJ8dQUk9KRUNUTkFNRcgnIHByb2plY3QKKy8vCisKKyNpbmNsdWRlICJTREwuaCIKKworI2lmZGVmIF9fT0JKQ19fCisgICAgI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExNYWluLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL1NETE1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZkOTBjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExNYWluLmgKQEAgLTAsMCArMSwxNiBAQAorLyogICBTRExNYWluLm0gLSBtYWluIGVudHJ5IHBvaW50IGZvciBvdXIgQ29jb2EtaXplZCBTREwgYXBwCisgICAgICAgSW5pdGlhbCBWZXJzaW9uOiBEYXJyZWxsIFdhbGlzc2VyIDxkd2FsaXNzMUBwdXJkdWUuZWR1PgorICAgICAgIE5vbi1OSUItQ29kZSAmIG90aGVyIGNoYW5nZXM6IE1heCBIb3JuIDxtYXhAcXVlbmRpLmRlPgorCisgICAgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzCisqLworCisjaWZuZGVmIF9TRExNYWluX2hfCisjZGVmaW5lIF9TRExNYWluX2hfCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgU0RMTWFpbiA6IE5TT2JqZWN0CitAZW5kCisKKyNlbmRpZiAvKiBfU0RMTWFpbl9oXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExNYWluLm0gYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL1NETE1haW4ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDY1YTIwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExNYWluLm0KQEAgLTAsMCArMSwzODMgQEAKKy8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAorICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKyAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KKworICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcworKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETE1haW4uaCIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gLyogZm9yIE1BWFBBVEhMRU4gKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogRm9yIHNvbWUgcmVhb24sIEFwcGxlIHJlbW92ZWQgc2V0QXBwbGVNZW51IGZyb20gdGhlIGhlYWRlcnMgaW4gMTAuNCwKKyBidXQgdGhlIG1ldGhvZCBzdGlsbCBpcyB0aGVyZSBhbmQgd29ya3MuIFRvIGF2b2lkIHdhcm5pbmdzLCB3ZSBkZWNsYXJlCisgaXQgb3Vyc2VsdmVzIGhlcmUuICovCitAaW50ZXJmYWNlIE5TQXBwbGljYXRpb24oU0RMX01pc3NpbmdfTWV0aG9kcykKKy0gKHZvaWQpc2V0QXBwbGVNZW51OihOU01lbnUgKiltZW51OworQGVuZAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBTRExNYWluLm5pYiBvciBub3QgKi8KKyNkZWZpbmUJCVNETF9VU0VfTklCX0ZJTEUJMAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBDUFMgKGRvY2tpbmcpIG9yIG5vdCAqLworI2RlZmluZQkJU0RMX1VTRV9DUFMJCTEKKyNpZmRlZiBTRExfVVNFX0NQUworLyogUG9ydGlvbnMgb2YgQ1BTLmggKi8KK3R5cGVkZWYgc3RydWN0IENQU1Byb2Nlc3NTZXJOdW0KK3sKKwlVSW50MzIJCWxvOworCVVJbnQzMgkJaGk7Cit9IENQU1Byb2Nlc3NTZXJOdW07CisKK2V4dGVybiBPU0VycglDUFNHZXRDdXJyZW50UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKK2V4dGVybiBPU0VyciAJQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbiggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuLCBVSW50MzIgX2FyZzIsIFVJbnQzMiBfYXJnMywgVUludDMyIF9hcmc0LCBVSW50MzIgX2FyZzUpOworZXh0ZXJuIE9TRXJyCUNQU1NldEZyb250UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKKworI2VuZGlmIC8qIFNETF9VU0VfQ1BTICovCisKK3N0YXRpYyBpbnQgICAgZ0FyZ2M7CitzdGF0aWMgY2hhciAgKipnQXJndjsKK3N0YXRpYyBCT09MICAgZ0ZpbmRlckxhdW5jaDsKK3N0YXRpYyBCT09MICAgZ0NhbGxlZEFwcE1haW5saW5lID0gRkFMU0U7CisKK3N0YXRpYyBOU1N0cmluZyAqZ2V0QXBwbGljYXRpb25OYW1lKHZvaWQpCit7CisgICAgY29uc3QgTlNEaWN0aW9uYXJ5ICpkaWN0OworICAgIE5TU3RyaW5nICphcHBOYW1lID0gMDsKKworICAgIC8qIERldGVybWluZSB0aGUgYXBwbGljYXRpb24gbmFtZSAqLworICAgIGRpY3QgPSAoY29uc3QgTlNEaWN0aW9uYXJ5ICopQ0ZCdW5kbGVHZXRJbmZvRGljdGlvbmFyeShDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgaWYgKGRpY3QpCisgICAgICAgIGFwcE5hbWUgPSBbZGljdCBvYmplY3RGb3JLZXk6IEAiQ0ZCdW5kbGVOYW1lIl07CisgICAgCisgICAgaWYgKCFbYXBwTmFtZSBsZW5ndGhdKQorICAgICAgICBhcHBOYW1lID0gW1tOU1Byb2Nlc3NJbmZvIHByb2Nlc3NJbmZvXSBwcm9jZXNzTmFtZV07CisKKyAgICByZXR1cm4gYXBwTmFtZTsKK30KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKy8qIEEgaGVscGVyIGNhdGVnb3J5IGZvciBOU1N0cmluZyAqLworQGludGVyZmFjZSBOU1N0cmluZyAoUmVwbGFjZVN1YlN0cmluZykKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgU0RMQXBwbGljYXRpb24gOiBOU0FwcGxpY2F0aW9uCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTRExBcHBsaWNhdGlvbgorLyogSW52b2tlZCBmcm9tIHRoZSBRdWl0IG1lbnUgaXRlbSAqLworLSAodm9pZCl0ZXJtaW5hdGU6KGlkKXNlbmRlcgoreworICAgIC8qIFBvc3QgYSBTRExfUVVJVCBldmVudCAqLworICAgIFNETF9FdmVudCBldmVudDsKKyAgICBldmVudC50eXBlID0gU0RMX1FVSVQ7CisgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOworfQorQGVuZAorCisvKiBUaGUgbWFpbiBjbGFzcyBvZiB0aGUgYXBwbGljYXRpb24sIHRoZSBhcHBsaWNhdGlvbidzIGRlbGVnYXRlICovCitAaW1wbGVtZW50YXRpb24gU0RMTWFpbgorCisvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworLSAodm9pZCkgc2V0dXBXb3JraW5nRGlyZWN0b3J5OihCT09MKXNob3VsZENoZGlyCit7CisgICAgaWYgKHNob3VsZENoZGlyKQorICAgIHsKKyAgICAgICAgY2hhciBwYXJlbnRkaXJbTUFYUEFUSExFTl07CisgICAgICAgIENGVVJMUmVmIHVybCA9IENGQnVuZGxlQ29weUJ1bmRsZVVSTChDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgICAgIENGVVJMUmVmIHVybDIgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KDAsIHVybCk7CisgICAgICAgIGlmIChDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbih1cmwyLCAxLCAoVUludDggKilwYXJlbnRkaXIsIE1BWFBBVEhMRU4pKSB7CisgICAgICAgICAgICBjaGRpcihwYXJlbnRkaXIpOyAgIC8qIGNoZGlyIHRvIHRoZSBiaW5hcnkgYXBwJ3MgcGFyZW50ICovCisgICAgICAgIH0KKyAgICAgICAgQ0ZSZWxlYXNlKHVybCk7CisgICAgICAgIENGUmVsZWFzZSh1cmwyKTsKKyAgICB9Cit9CisKKyNpZiBTRExfVVNFX05JQl9GSUxFCisKKy8qIEZpeCBtZW51IHRvIGNvbnRhaW4gdGhlIHJlYWwgYXBwIG5hbWUgaW5zdGVhZCBvZiAiU0RMIEFwcCIgKi8KKy0gKHZvaWQpZml4TWVudTooTlNNZW51ICopYU1lbnUgd2l0aEFwcE5hbWU6KE5TU3RyaW5nICopYXBwTmFtZQoreworICAgIE5TUmFuZ2UgYVJhbmdlOworICAgIE5TRW51bWVyYXRvciAqZW51bWVyYXRvcjsKKyAgICBOU01lbnVJdGVtICptZW51SXRlbTsKKworICAgIGFSYW5nZSA9IFtbYU1lbnUgdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgaWYgKGFSYW5nZS5sZW5ndGggIT0gMCkKKyAgICAgICAgW2FNZW51IHNldFRpdGxlOiBbW2FNZW51IHRpdGxlXSBzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOmFSYW5nZSB3aXRoOmFwcE5hbWVdXTsKKworICAgIGVudW1lcmF0b3IgPSBbW2FNZW51IGl0ZW1BcnJheV0gb2JqZWN0RW51bWVyYXRvcl07CisgICAgd2hpbGUgKChtZW51SXRlbSA9IFtlbnVtZXJhdG9yIG5leHRPYmplY3RdKSkKKyAgICB7CisgICAgICAgIGFSYW5nZSA9IFtbbWVudUl0ZW0gdGl0bGVdIHJhbmdlT2ZTdHJpbmc6QCJTREwgQXBwIl07CisgICAgICAgIGlmIChhUmFuZ2UubGVuZ3RoICE9IDApCisgICAgICAgICAgICBbbWVudUl0ZW0gc2V0VGl0bGU6IFtbbWVudUl0ZW0gdGl0bGVdIHN0cmluZ0J5UmVwbGFjaW5nUmFuZ2U6YVJhbmdlIHdpdGg6YXBwTmFtZV1dOworICAgICAgICBpZiAoW21lbnVJdGVtIGhhc1N1Ym1lbnVdKQorICAgICAgICAgICAgW3NlbGYgZml4TWVudTpbbWVudUl0ZW0gc3VibWVudV0gd2l0aEFwcE5hbWU6YXBwTmFtZV07CisgICAgfQorICAgIFsgYU1lbnUgc2l6ZVRvRml0IF07Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIHNldEFwcGxpY2F0aW9uTWVudSh2b2lkKQoreworICAgIC8qIHdhcm5pbmc6IHRoaXMgY29kZSBpcyB2ZXJ5IG9kZCAqLworICAgIE5TTWVudSAqYXBwbGVNZW51OworICAgIE5TTWVudUl0ZW0gKm1lbnVJdGVtOworICAgIE5TU3RyaW5nICp0aXRsZTsKKyAgICBOU1N0cmluZyAqYXBwTmFtZTsKKyAgICAKKyAgICBhcHBOYW1lID0gZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgICAgYXBwbGVNZW51ID0gW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCIiXTsKKyAgICAKKyAgICAvKiBBZGQgbWVudSBpdGVtcyAqLworICAgIHRpdGxlID0gW0AiQWJvdXQgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3RvcihvcmRlckZyb250U3RhbmRhcmRBYm91dFBhbmVsOikga2V5RXF1aXZhbGVudDpAIiJdOworCisgICAgW2FwcGxlTWVudSBhZGRJdGVtOltOU01lbnVJdGVtIHNlcGFyYXRvckl0ZW1dXTsKKworICAgIHRpdGxlID0gW0AiSGlkZSAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKGhpZGU6KSBrZXlFcXVpdmFsZW50OkAiaCJdOworCisgICAgbWVudUl0ZW0gPSAoTlNNZW51SXRlbSAqKVthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTpAIkhpZGUgT3RoZXJzIiBhY3Rpb246QHNlbGVjdG9yKGhpZGVPdGhlckFwcGxpY2F0aW9uczopIGtleUVxdWl2YWxlbnQ6QCJoIl07CisgICAgW21lbnVJdGVtIHNldEtleUVxdWl2YWxlbnRNb2RpZmllck1hc2s6KE5TQWx0ZXJuYXRlS2V5TWFza3xOU0NvbW1hbmRLZXlNYXNrKV07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6QCJTaG93IEFsbCIgYWN0aW9uOkBzZWxlY3Rvcih1bmhpZGVBbGxBcHBsaWNhdGlvbnM6KSBrZXlFcXVpdmFsZW50OkAiIl07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW06W05TTWVudUl0ZW0gc2VwYXJhdG9ySXRlbV1dOworCisgICAgdGl0bGUgPSBbQCJRdWl0ICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3IodGVybWluYXRlOikga2V5RXF1aXZhbGVudDpAInEiXTsKKworICAgIAorICAgIC8qIFB1dCBtZW51IGludG8gdGhlIG1lbnViYXIgKi8KKyAgICBtZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiIgYWN0aW9uOm5pbCBrZXlFcXVpdmFsZW50OkAiIl07CisgICAgW21lbnVJdGVtIHNldFN1Ym1lbnU6YXBwbGVNZW51XTsKKyAgICBbW05TQXBwIG1haW5NZW51XSBhZGRJdGVtOm1lbnVJdGVtXTsKKworICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSBhcHBsaWNhdGlvbiBtZW51ICovCisgICAgW05TQXBwIHNldEFwcGxlTWVudTphcHBsZU1lbnVdOworCisgICAgLyogRmluYWxseSBnaXZlIHVwIG91ciByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RzICovCisgICAgW2FwcGxlTWVudSByZWxlYXNlXTsKKyAgICBbbWVudUl0ZW0gcmVsZWFzZV07Cit9CisKKy8qIENyZWF0ZSBhIHdpbmRvdyBtZW51ICovCitzdGF0aWMgdm9pZCBzZXR1cFdpbmRvd01lbnUodm9pZCkKK3sKKyAgICBOU01lbnUgICAgICAqd2luZG93TWVudTsKKyAgICBOU01lbnVJdGVtICAqd2luZG93TWVudUl0ZW07CisgICAgTlNNZW51SXRlbSAgKm1lbnVJdGVtOworCisgICAgd2luZG93TWVudSA9IFtbTlNNZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiV2luZG93Il07CisgICAgCisgICAgLyogIk1pbmltaXplIiBpdGVtICovCisgICAgbWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJNaW5pbWl6ZSIgYWN0aW9uOkBzZWxlY3RvcihwZXJmb3JtTWluaWF0dXJpemU6KSBrZXlFcXVpdmFsZW50OkAibSJdOworICAgIFt3aW5kb3dNZW51IGFkZEl0ZW06bWVudUl0ZW1dOworICAgIFttZW51SXRlbSByZWxlYXNlXTsKKyAgICAKKyAgICAvKiBQdXQgbWVudSBpbnRvIHRoZSBtZW51YmFyICovCisgICAgd2luZG93TWVudUl0ZW0gPSBbW05TTWVudUl0ZW0gYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJXaW5kb3ciIGFjdGlvbjpuaWwga2V5RXF1aXZhbGVudDpAIiJdOworICAgIFt3aW5kb3dNZW51SXRlbSBzZXRTdWJtZW51OndpbmRvd01lbnVdOworICAgIFtbTlNBcHAgbWFpbk1lbnVdIGFkZEl0ZW06d2luZG93TWVudUl0ZW1dOworICAgIAorICAgIC8qIFRlbGwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHRoaXMgaXMgbm93IHRoZSB3aW5kb3cgbWVudSAqLworICAgIFtOU0FwcCBzZXRXaW5kb3dzTWVudTp3aW5kb3dNZW51XTsKKworICAgIC8qIEZpbmFsbHkgZ2l2ZSB1cCBvdXIgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyAqLworICAgIFt3aW5kb3dNZW51IHJlbGVhc2VdOworICAgIFt3aW5kb3dNZW51SXRlbSByZWxlYXNlXTsKK30KKworLyogUmVwbGFjZW1lbnQgZm9yIE5TQXBwbGljYXRpb25NYWluICovCitzdGF0aWMgdm9pZCBDdXN0b21BcHBsaWNhdGlvbk1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBOU0F1dG9yZWxlYXNlUG9vbAkqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICAgIFNETE1haW4JCQkJKnNkbE1haW47CisKKyAgICAvKiBFbnN1cmUgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBpcyBpbml0aWFsaXNlZCAqLworICAgIFtTRExBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07CisgICAgCisjaWZkZWYgU0RMX1VTRV9DUFMKKyAgICB7CisgICAgICAgIENQU1Byb2Nlc3NTZXJOdW0gUFNOOworICAgICAgICAvKiBUZWxsIHRoZSBkb2NrIGFib3V0IHVzICovCisgICAgICAgIGlmICghQ1BTR2V0Q3VycmVudFByb2Nlc3MoJlBTTikpCisgICAgICAgICAgICBpZiAoIUNQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb24oJlBTTiwweDAzLDB4M0MsMHgyQywweDExMDMpKQorICAgICAgICAgICAgICAgIGlmICghQ1BTU2V0RnJvbnRQcm9jZXNzKCZQU04pKQorICAgICAgICAgICAgICAgICAgICBbU0RMQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIH0KKyNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLworCisgICAgLyogU2V0IHVwIHRoZSBtZW51YmFyICovCisgICAgW05TQXBwIHNldE1haW5NZW51OltbTlNNZW51IGFsbG9jXSBpbml0XV07CisgICAgc2V0QXBwbGljYXRpb25NZW51KCk7CisgICAgc2V0dXBXaW5kb3dNZW51KCk7CisKKyAgICAvKiBDcmVhdGUgU0RMTWFpbiBhbmQgbWFrZSBpdCB0aGUgYXBwIGRlbGVnYXRlICovCisgICAgc2RsTWFpbiA9IFtbU0RMTWFpbiBhbGxvY10gaW5pdF07CisgICAgW05TQXBwIHNldERlbGVnYXRlOnNkbE1haW5dOworICAgIAorICAgIC8qIFN0YXJ0IHRoZSBtYWluIGV2ZW50IGxvb3AgKi8KKyAgICBbTlNBcHAgcnVuXTsKKyAgICAKKyAgICBbc2RsTWFpbiByZWxlYXNlXTsKKyAgICBbcG9vbCByZWxlYXNlXTsKK30KKworI2VuZGlmCisKKworLyoKKyAqIENhdGNoIGRvY3VtZW50IG9wZW4gcmVxdWVzdHMuLi50aGlzIGxldHMgdXMgbm90aWNlIGZpbGVzIHdoZW4gdGhlIGFwcAorICogIHdhcyBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgYSBkb2N1bWVudCwgb3Igd2hlbiBhIGRvY3VtZW50IHdhcworICogIGRyYWdnZWQvZHJvcHBlZCBvbiB0aGUgYXBwJ3MgaWNvbi4gWW91IG5lZWQgdG8gaGF2ZSBhCisgKiAgQ0ZCdW5kbGVEb2N1bWVudHNUeXBlIHNlY3Rpb24gaW4geW91ciBJbmZvLnBsaXN0IHRvIGdldCB0aGlzIG1lc3NhZ2UsCisgKiAgYXBwYXJlbnRseS4KKyAqCisgKiBGaWxlcyBhcmUgYWRkZWQgdG8gZ0FyZ3YsIHNvIHRvIHRoZSBhcHAsIHRoZXknbGwgbG9vayBsaWtlIGNvbW1hbmQgbGluZQorICogIGFyZ3VtZW50cy4gUHJldmlvdXNseSwgYXBwcyBsYXVuY2hlZCBmcm9tIHRoZSBmaW5kZXIgaGFkIG5vdGhpbmcgYnV0CisgKiAgYW4gYXJndlswXS4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgbWF5IGJlIHJlY2VpdmVkIG11bHRpcGxlIHRpbWVzIHRvIG9wZW4gc2V2ZXJhbCBkb2NzIG9uIGxhdW5jaC4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgaXMgaWdub3JlZCBvbmNlIHRoZSBhcHAncyBtYWlubGluZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKy0gKEJPT0wpYXBwbGljYXRpb246KE5TQXBwbGljYXRpb24gKil0aGVBcHBsaWNhdGlvbiBvcGVuRmlsZTooTlNTdHJpbmcgKilmaWxlbmFtZQoreworICAgIGNvbnN0IGNoYXIgKnRlbXBhcmc7CisgICAgc2l6ZV90IGFyZ2xlbjsKKyAgICBjaGFyICphcmc7CisgICAgY2hhciAqKm5ld2FyZ3Y7CisKKyAgICBpZiAoIWdGaW5kZXJMYXVuY2gpICAvKiBNYWNPUyBpcyBwYXNzaW5nIGNvbW1hbmQgbGluZSBhcmdzLiAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoZ0NhbGxlZEFwcE1haW5saW5lKSAgLyogYXBwIGhhcyBzdGFydGVkLCBpZ25vcmUgdGhpcyBkb2N1bWVudC4gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdGVtcGFyZyA9IFtmaWxlbmFtZSBVVEY4U3RyaW5nXTsKKyAgICBhcmdsZW4gPSBTRExfc3RybGVuKHRlbXBhcmcpICsgMTsKKyAgICBhcmcgPSAoY2hhciAqKSBTRExfbWFsbG9jKGFyZ2xlbik7CisgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBuZXdhcmd2ID0gKGNoYXIgKiopIHJlYWxsb2MoZ0FyZ3YsIHNpemVvZiAoY2hhciAqKSAqIChnQXJnYyArIDIpKTsKKyAgICBpZiAobmV3YXJndiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX2ZyZWUoYXJnKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBnQXJndiA9IG5ld2FyZ3Y7CisKKyAgICBTRExfc3RybGNweShhcmcsIHRlbXBhcmcsIGFyZ2xlbik7CisgICAgZ0FyZ3ZbZ0FyZ2MrK10gPSBhcmc7CisgICAgZ0FyZ3ZbZ0FyZ2NdID0gTlVMTDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKiBDYWxsZWQgd2hlbiB0aGUgaW50ZXJuYWwgZXZlbnQgbG9vcCBoYXMganVzdCBzdGFydGVkIHJ1bm5pbmcgKi8KKy0gKHZvaWQpIGFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOiAoTlNOb3RpZmljYXRpb24gKikgbm90ZQoreworICAgIGludCBzdGF0dXM7CisKKyAgICAvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworICAgIFtzZWxmIHNldHVwV29ya2luZ0RpcmVjdG9yeTpnRmluZGVyTGF1bmNoXTsKKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICAvKiBTZXQgdGhlIG1haW4gbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCisgICAgW3NlbGYgZml4TWVudTpbTlNBcHAgbWFpbk1lbnVdIHdpdGhBcHBOYW1lOmdldEFwcGxpY2F0aW9uTmFtZSgpXTsKKyNlbmRpZgorCisgICAgLyogSGFuZCBvZmYgdG8gbWFpbiBhcHBsaWNhdGlvbiBjb2RlICovCisgICAgZ0NhbGxlZEFwcE1haW5saW5lID0gVFJVRTsKKyAgICBzdGF0dXMgPSBTRExfbWFpbiAoZ0FyZ2MsIGdBcmd2KTsKKworICAgIC8qIFdlJ3JlIGRvbmUsIHRoYW5rIHlvdSBmb3IgcGxheWluZyAqLworICAgIGV4aXQoc3RhdHVzKTsKK30KK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCisKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZmZlclNpemU7CisgICAgdW5zaWduZWQgaW50IHNlbGZMZW4gPSBbc2VsZiBsZW5ndGhdOworICAgIHVuc2lnbmVkIGludCBhU3RyaW5nTGVuID0gW2FTdHJpbmcgbGVuZ3RoXTsKKyAgICB1bmljaGFyICpidWZmZXI7CisgICAgTlNSYW5nZSBsb2NhbFJhbmdlOworICAgIE5TU3RyaW5nICpyZXN1bHQ7CisKKyAgICBidWZmZXJTaXplID0gc2VsZkxlbiArIGFTdHJpbmdMZW4gLSBhUmFuZ2UubGVuZ3RoOworICAgIGJ1ZmZlciA9ICh1bmljaGFyICopTlNBbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlclNpemUqc2l6ZW9mKHVuaWNoYXIpKTsKKyAgICAKKyAgICAvKiBHZXQgZmlyc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVJhbmdlLmxvY2F0aW9uOworICAgIFtzZWxmIGdldENoYXJhY3RlcnM6YnVmZmVyIHJhbmdlOmxvY2FsUmFuZ2VdOworICAgIAorICAgIC8qIEdldCBtaWRkbGUgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVN0cmluZ0xlbjsKKyAgICBbYVN0cmluZyBnZXRDaGFyYWN0ZXJzOihidWZmZXIrYVJhbmdlLmxvY2F0aW9uKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAgCisgICAgLyogR2V0IGxhc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSBhUmFuZ2UubG9jYXRpb24gKyBhUmFuZ2UubGVuZ3RoOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gc2VsZkxlbiAtIGxvY2FsUmFuZ2UubG9jYXRpb247CisgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbithU3RyaW5nTGVuKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAKKyAgICAvKiBCdWlsZCBvdXRwdXQgc3RyaW5nICovCisgICAgcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhDaGFyYWN0ZXJzOmJ1ZmZlciBsZW5ndGg6YnVmZmVyU2l6ZV07CisgICAgCisgICAgTlNEZWFsbG9jYXRlTWVtb3J5UGFnZXMoYnVmZmVyLCBidWZmZXJTaXplKTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCisKKworCisjaWZkZWYgbWFpbgorIyAgdW5kZWYgbWFpbgorI2VuZGlmCisKKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBleGVjdXRhYmxlIC0gc2hvdWxkICpub3QqIGJlIFNETF9tYWluISAqLworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgaW50byBhIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIC8qIFRoaXMgaXMgcGFzc2VkIGlmIHdlIGFyZSBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgKi8KKyAgICBpZiAoIGFyZ2MgPj0gMiAmJiBzdHJuY21wIChhcmd2WzFdLCAiLXBzbiIsIDQpID09IDAgKSB7CisgICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogMik7CisgICAgICAgIGdBcmd2WzBdID0gYXJndlswXTsKKyAgICAgICAgZ0FyZ3ZbMV0gPSBOVUxMOworICAgICAgICBnQXJnYyA9IDE7CisgICAgICAgIGdGaW5kZXJMYXVuY2ggPSBZRVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGdBcmdjID0gYXJnYzsKKyAgICAgICAgZ0FyZ3YgPSAoY2hhciAqKikgU0RMX21hbGxvYyhzaXplb2YgKGNoYXIgKikgKiAoYXJnYysxKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYXJnYzsgaSsrKQorICAgICAgICAgICAgZ0FyZ3ZbaV0gPSBhcmd2W2ldOworICAgICAgICBnRmluZGVyTGF1bmNoID0gTk87CisgICAgfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorICAgIFtTRExBcHBsaWNhdGlvbiBwb3NlQXNDbGFzczpbTlNBcHBsaWNhdGlvbiBjbGFzc11dOworICAgIE5TQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbHNlCisgICAgQ3VzdG9tQXBwbGljYXRpb25NYWluIChhcmdjLCBhcmd2KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL1NETE9wZW5HTEFwcC54Y29kZXByb2ovVGVtcGxhdGVJbmZvLnBsaXN0IGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExPcGVuR0xBcHAueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTg3NzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExPcGVuR0xBcHAueGNvZGVwcm9qL1RlbXBsYXRlSW5mby5wbGlzdApAQCAtMCwwICsxLDEyIEBACit7CisJRmlsZXNUb1JlbmFtZSA9IHsKKwkJIlNETEFwcF9QcmVmaXgucGNoIiA9ICLHUFJPSkVDVE5BTUXIX1ByZWZpeC5wY2giOworCX07CisJRmlsZXNUb01hY3JvRXhwYW5kID0gKAorCQkix1BST0pFQ1ROQU1FyF9QcmVmaXgucGNoIiwKKwkJIkluZm8ucGxpc3QiLAorCQkiRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyIsCisJCSJtYWluLmMiLAorCSk7CisJRGVzY3JpcHRpb24gPSAiVGhpcyBwcm9qZWN0IGJ1aWxkcyBhbiBTREwtYmFzZWQgYXBwbGljYXRpb24gdGhhdCB1c2VzIE9wZW5HTC4iOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9TRExPcGVuR0xBcHAueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vU0RMT3BlbkdMQXBwLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5NWNjYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vU0RMT3BlbkdMQXBwLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTAsMCArMSwzNjIgQEAKKy8vICEkKlVURjgqJCEKK3sKKwlhcmNoaXZlVmVyc2lvbiA9IDE7CisJY2xhc3NlcyA9IHsKKwl9OworCW9iamVjdFZlcnNpb24gPSA0MjsKKwlvYmplY3RzID0geworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQkwMDJGMzlGQTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzOUY5MDlEMDg4MUYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrICovOyB9OworCQkwMDJGM0EwMDA5RDA4ODQ2MDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBDb3B5IEZyYW1ld29ya3MgaW50byAuYXBwIGJ1bmRsZSAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLzsgfTsKKwkJMDAyRjNBMkUwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQTJDMDlEMDg4ODgwMEVCRUI4OCAvKiBTRExNYWluLm0gKi87IH07CisJCTAwMkYzQTNGMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0EzRTA5RDA4OEJBMDBFQkVCODggLyogbWFpbi5jICovOyB9OworCQkwMDJGM0JGQTA5RDA5Mzg5MDBFQkVCODggLyogYXRsYW50aXMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQkY0MDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5jICovOyB9OworCQkwMDJGM0JGQzA5RDA5Mzg5MDBFQkVCODggLyogZG9scGhpbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNCRjYwOUQwOTM4OTAwRUJFQjg4IC8qIGRvbHBoaW4uYyAqLzsgfTsKKwkJMDAyRjNCRkQwOUQwOTM4OTAwRUJFQjg4IC8qIHNoYXJrLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwMDJGM0JGNzA5RDA5Mzg5MDBFQkVCODggLyogc2hhcmsuYyAqLzsgfTsKKwkJMDAyRjNCRkUwOUQwOTM4OTAwRUJFQjg4IC8qIHN3aW0uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQkY4MDlEMDkzODkwMEVCRUI4OCAvKiBzd2ltLmMgKi87IH07CisJCTAwMkYzQkZGMDlEMDkzODkwMEVCRUI4OCAvKiB3aGFsZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNCRjkwOUQwOTM4OTAwRUJFQjg4IC8qIHdoYWxlLmMgKi87IH07CisJCTAwMkYzQzAxMDlEMDkzQkQwMEVCRUI4OCAvKiBPcGVuR0wuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDAyRjNDMDAwOUQwOTNCRDAwRUJFQjg4IC8qIE9wZW5HTC5mcmFtZXdvcmsgKi87IH07CisJCTAwMkYzQzYxMDlEMDk1MUUwMEVCRUI4OCAvKiBHTFVULmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDAwMkYzQzYwMDlEMDk1MUUwMEVCRUI4OCAvKiBHTFVULmZyYW1ld29yayAqLzsgfTsKKwkJOEQxMTA3MkIwNDg2Q0VCODAwRTQ3MDkwIC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi87IH07CisJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxMDU4QzdBMUZFQTU0RjAxMTFDQTJDQkIgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEJ1aWxkU3R5bGUgc2VjdGlvbiAqLworCQk0QTk1MDRDQ0ZGRTZBNEIzMTFDQTBDQkEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBQQlhCdWlsZFN0eWxlOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTRBOTUwNENERkZFNkE0QjMxMUNBMENCQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gUEJYQnVpbGRTdHlsZTsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgUEJYQnVpbGRTdHlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvcHlGaWxlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGRDA5RDA4ODM0MDBFQkVCODggLyogQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAiIjsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAxMDsKKwkJCWZpbGVzID0gKAorCQkJCTAwMkYzQTAwMDlEMDg4NDYwMEVCRUI4OCAvKiBTREwuZnJhbWV3b3JrIGluIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCW5hbWUgPSAiQ29weSBGcmFtZXdvcmtzIGludG8gLmFwcCBidW5kbGUiOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gU0RMLmZyYW1ld29yazsgcGF0aCA9IC9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMDAyRjNBMkIwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNETE1haW4uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU0RMTWFpbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBtYWluLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNCRjQwOUQwOTM4OTAwRUJFQjg4IC8qIGF0bGFudGlzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBhdGxhbnRpcy5jOyBwYXRoID0gYXRsYW50aXMvYXRsYW50aXMuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0JGNTA5RDA5Mzg5MDBFQkVCODggLyogYXRsYW50aXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IGF0bGFudGlzLmg7IHBhdGggPSBhdGxhbnRpcy9hdGxhbnRpcy5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQkY2MDlEMDkzODkwMEVCRUI4OCAvKiBkb2xwaGluLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBkb2xwaGluLmM7IHBhdGggPSBhdGxhbnRpcy9kb2xwaGluLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNCRjcwOUQwOTM4OTAwRUJFQjg4IC8qIHNoYXJrLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBzaGFyay5jOyBwYXRoID0gYXRsYW50aXMvc2hhcmsuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwMDJGM0JGODA5RDA5Mzg5MDBFQkVCODggLyogc3dpbS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gc3dpbS5jOyBwYXRoID0gYXRsYW50aXMvc3dpbS5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTAwMkYzQkY5MDlEMDkzODkwMEVCRUI4OCAvKiB3aGFsZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gd2hhbGUuYzsgcGF0aCA9IGF0bGFudGlzL3doYWxlLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMDAyRjNDMDAwOUQwOTNCRDAwRUJFQjg4IC8qIE9wZW5HTC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IE9wZW5HTC5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9PcGVuR0wuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkwMDJGM0M2MDA5RDA5NTFFMDBFQkVCODggLyogR0xVVC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEdMVVQuZnJhbWV3b3JrOyBwYXRoID0gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9HTFVULmZyYW1ld29yazsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkwODlDMTY1REZFODQwRTBDQzAyQUFDMDcgLyogRW5nbGlzaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAxMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnN0cmluZ3M7IG5hbWUgPSBFbmdsaXNoOyBwYXRoID0gRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5nczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQ29jb2EuZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQkyOUI5NzMyNEZEQ0ZBMzk0MTFDQTJDRUEgLyogQXBwS2l0LmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQXBwS2l0LmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTI5Qjk3MzI1RkRDRkEzOTQxMUNBMkNFQSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gRm91bmRhdGlvbi5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Gb3VuZGF0aW9uLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJMzJDQTRGNjMwMzY4RDFFRTAwQzkxNzgzIC8qIMKrUFJPSkVDVE5BTUXCu19QcmVmaXgucGNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gZmlsZTsgcGF0aCA9ICLCq1BST0pFQ1ROQU1FwrtfUHJlZml4LnBjaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMTEwNzMxMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMTEwNzMyMDQ4NkNFQjgwMEU0NzA5MCAvKiDCq1BST0pFQ1ROQU1FwrsuYXBwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmFwcGxpY2F0aW9uOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSAiwqtQUk9KRUNUTkFNRcK7LmFwcCI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGMzlGQTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTAwMkYzQzYxMDlEMDk1MUUwMEVCRUI4OCAvKiBHTFVULmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCThEMTEwNzJGMDQ4NkNFQjgwMEU0NzA5MCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkwMDJGM0MwMTA5RDA5M0JEMDBFQkVCODggLyogT3BlbkdMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwMDJGM0JGMzA5RDA5Mzc4MDBFQkVCODggLyogYXRsYW50aXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTAwMkYzQkY0MDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5jICovLAorCQkJCTAwMkYzQkY1MDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5oICovLAorCQkJCTAwMkYzQkY2MDlEMDkzODkwMEVCRUI4OCAvKiBkb2xwaGluLmMgKi8sCisJCQkJMDAyRjNCRjcwOUQwOTM4OTAwRUJFQjg4IC8qIHNoYXJrLmMgKi8sCisJCQkJMDAyRjNCRjgwOUQwOTM4OTAwRUJFQjg4IC8qIHN3aW0uYyAqLywKKwkJCQkwMDJGM0JGOTA5RDA5Mzg5MDBFQkVCODggLyogd2hhbGUuYyAqLywKKwkJCSk7CisJCQluYW1lID0gYXRsYW50aXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwODBFOTZEREZFMjAxRDZEN0YwMDAwMDEgLyogQ2xhc3NlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDAyRjNBMkIwOUQwODg4ODAwRUJFQjg4IC8qIFNETE1haW4uaCAqLywKKwkJCQkwMDJGM0EyQzA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tICovLAorCQkJKTsKKwkJCW5hbWUgPSBDbGFzc2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMTA1OEM3QTBGRUE1NEYwMTExQ0EyQ0JCIC8qIExpbmtlZCBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGMzlGOTA5RDA4ODFGMDBFQkVCODggLyogU0RMLmZyYW1ld29yayAqLywKKwkJCQkwMDJGM0M2MDA5RDA5NTFFMDBFQkVCODggLyogR0xVVC5mcmFtZXdvcmsgKi8sCisJCQkJMTA1OEM3QTFGRUE1NEYwMTExQ0EyQ0JCIC8qIENvY29hLmZyYW1ld29yayAqLywKKwkJCQkwMDJGM0MwMDA5RDA5M0JEMDBFQkVCODggLyogT3BlbkdMLmZyYW1ld29yayAqLywKKwkJCSk7CisJCQluYW1lID0gIkxpbmtlZCBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTEwNThDN0EyRkVBNTRGMDExMUNBMkNCQiAvKiBPdGhlciBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkyOUI5NzMyNEZEQ0ZBMzk0MTFDQTJDRUEgLyogQXBwS2l0LmZyYW1ld29yayAqLywKKwkJCQkyOUI5NzMyNUZEQ0ZBMzk0MTFDQTJDRUEgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIMKrUFJPSkVDVE5BTUXCuy5hcHAgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMTRGRENGQTM5NDExQ0EyQ0VBIC8qIMKrUFJPSkVDVE5BTUVBU1hNTMK7ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODBFOTZEREZFMjAxRDZEN0YwMDAwMDEgLyogQ2xhc3NlcyAqLywKKwkJCQkyOUI5NzMxNUZEQ0ZBMzk0MTFDQTJDRUEgLyogT3RoZXIgU291cmNlcyAqLywKKwkJCQkyOUI5NzMxN0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUmVzb3VyY2VzICovLAorCQkJCTI5Qjk3MzIzRkRDRkEzOTQxMUNBMkNFQSAvKiBGcmFtZXdvcmtzICovLAorCQkJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLywKKwkJCSk7CisJCQluYW1lID0gIsKrUFJPSkVDVE5BTUVBU1hNTMK7IjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE1RkRDRkEzOTQxMUNBMkNFQSAvKiBPdGhlciBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMDJGM0JGMzA5RDA5Mzc4MDBFQkVCODggLyogYXRsYW50aXMgKi8sCisJCQkJMzJDQTRGNjMwMzY4RDFFRTAwQzkxNzgzIC8qIMKrUFJPSkVDVE5BTUXCu19QcmVmaXgucGNoICovLAorCQkJCTAwMkYzQTNFMDlEMDg4QkEwMEVCRUI4OCAvKiBtYWluLmMgKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBTb3VyY2VzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE3RkRDRkEzOTQxMUNBMkNFQSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCThEMTEwNzMxMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvLnBsaXN0ICovLAorCQkJCTA4OUMxNjVDRkU4NDBFMENDMDJBQUMwNyAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLywKKwkJCSk7CisJCQluYW1lID0gUmVzb3VyY2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMjlCOTczMjNGRENGQTM5NDExQ0EyQ0VBIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTEwNThDN0EwRkVBNTRGMDExMUNBMkNCQiAvKiBMaW5rZWQgRnJhbWV3b3JrcyAqLywKKwkJCQkxMDU4QzdBMkZFQTU0RjAxMTFDQTJDQkIgLyogT3RoZXIgRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQluYW1lID0gRnJhbWV3b3JrczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCQk4RDExMDcyNjA0ODZDRUI4MDBFNDcwOTAgLyogwqtQUk9KRUNUTkFNRcK7ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEMwMUZDRjRBMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiwqtQUk9KRUNUTkFNRcK7IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8sCisJCQkJOEQxMTA3MkUwNDg2Q0VCODAwRTQ3MDkwIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMDAyRjM5RkQwOUQwODgzNDAwRUJFQjg4IC8qIENvcHkgRnJhbWV3b3JrcyBpbnRvIC5hcHAgYnVuZGxlICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCX07CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICLCq1BST0pFQ1ROQU1FwrsiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvQXBwbGljYXRpb25zIjsKKwkJCXByb2R1Y3ROYW1lID0gIsKrUFJPSkVDVE5BTUXCuyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gOEQxMTA3MzIwNDg2Q0VCODAwRTQ3MDkwIC8qIMKrUFJPSkVDVE5BTUXCuy5hcHAgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmFwcGxpY2F0aW9uIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJMjlCOTczMTNGRENGQTM5NDExQ0EyQ0VBIC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBDMDFGQ0Y0RTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJTRExPcGVuR0xBcHAiICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCX07CisJCQlidWlsZFN0eWxlcyA9ICgKKwkJCQk0QTk1MDRDQ0ZGRTZBNEIzMTFDQTBDQkEgLyogRGVidWcgKi8sCisJCQkJNEE5NTA0Q0RGRkU2QTRCMzExQ0EwQ0JBIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDE7CisJCQltYWluR3JvdXAgPSAyOUI5NzMxNEZEQ0ZBMzk0MTFDQTJDRUEgLyogwqtQUk9KRUNUTkFNRUFTWE1MwrsgKi87CisJCQlwcm9qZWN0RGlyUGF0aCA9ICIiOworCQkJdGFyZ2V0cyA9ICgKKwkJCQk4RDExMDcyNjA0ODZDRUI4MDBFNDcwOTAgLyogwqtQUk9KRUNUTkFNRcK7ICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMTEwNzI5MDQ4NkNFQjgwMEU0NzA5MCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCThEMTEwNzJCMDQ4NkNFQjgwMEU0NzA5MCAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQxMTA3MkMwNDg2Q0VCODAwRTQ3MDkwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkwMDJGM0EyRTA5RDA4ODg4MDBFQkVCODggLyogU0RMTWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNBM0YwOUQwODhCQTAwRUJFQjg4IC8qIG1haW4uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzQkZBMDlEMDkzODkwMEVCRUI4OCAvKiBhdGxhbnRpcy5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNCRkMwOUQwOTM4OTAwRUJFQjg4IC8qIGRvbHBoaW4uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzQkZEMDlEMDkzODkwMEVCRUI4OCAvKiBzaGFyay5jIGluIFNvdXJjZXMgKi8sCisJCQkJMDAyRjNCRkUwOUQwOTM4OTAwRUJFQjg4IC8qIHN3aW0uYyBpbiBTb3VyY2VzICovLAorCQkJCTAwMkYzQkZGMDlEMDkzODkwMEVCRUI4OCAvKiB3aGFsZS5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCQkwODlDMTY1Q0ZFODQwRTBDQzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi8gPSB7CisJCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODlDMTY1REZFODQwRTBDQzAyQUFDMDcgLyogRW5nbGlzaCAqLywKKwkJCSk7CisJCQluYW1lID0gSW5mb1BsaXN0LnN0cmluZ3M7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWFZhcmlhbnRHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKwkJQzAxRkNGNEIwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9BcHBsaWNhdGlvbnMiOworCQkJCVBST0RVQ1RfTkFNRSA9ICLCq1BST0pFQ1ROQU1FwrsiOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJCVpFUk9fTElOSyA9IFlFUzsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUMwMUZDRjRDMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFSQ0hTID0gKAorCQkJCQlwcGMsCisJCQkJCWkzODYsCisJCQkJKTsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL0FwcGxpY2F0aW9ucyI7CisJCQkJUFJPRFVDVF9OQU1FID0gIsKrUFJPSkVDVE5BTUXCuyI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUMwMUZDRjRGMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzLAorCQkJCQkiJChGUkFNRVdPUktfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzLAorCQkJCQkiJChIRUFERVJfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJU0RLUk9PVCA9IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGs7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlDMDFGQ0Y1MDA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorCQkJCQkvTGlicmFyeS9GcmFtZXdvcmtzLAorCQkJCQkiJChGUkFNRVdPUktfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsvSGVhZGVycyIsCisJCQkJCS9MaWJyYXJ5L0ZyYW1ld29ya3MvU0RMLmZyYW1ld29yay9IZWFkZXJzLAorCQkJCQkiJChIRUFERVJfU0VBUkNIX1BBVEhTKSIsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJU0RLUk9PVCA9IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGs7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwkJQzAxRkNGNEEwOEE5NTQ1NDAwNTQyNDdCIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICLCq1BST0pFQ1ROQU1FwrsiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJQzAxRkNGNEIwOEE5NTQ1NDAwNTQyNDdCIC8qIERlYnVnICovLAorCQkJCUMwMUZDRjRDMDhBOTU0NTQwMDU0MjQ3QiAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUMwMUZDRjRFMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIlNETE9wZW5HTEFwcCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlDMDFGQ0Y0RjA4QTk1NDU0MDA1NDI0N0IgLyogRGVidWcgKi8sCisJCQkJQzAxRkNGNTAwOEE5NTQ1NDAwNTQyNDdCIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAyOUI5NzMxM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL2F0bGFudGlzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL2F0bGFudGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmZGY2YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvYXRsYW50aXMuYwpAQCAtMCwwICsxLDQ1OSBAQAorCisvKiBDb3B5cmlnaHQgKGMpIE1hcmsgSi4gS2lsZ2FyZCwgMTk5NC4gKi8KKworLyoqCisgKiAoYykgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFMTCBSSUdIVFMgUkVTRVJWRUQKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UKKyAqIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nCisgKiBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogVEhFIE1BVEVSSUFMIEVNQk9ESUVEIE9OIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgVE8gWU9VICJBUy1JUyIKKyAqIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwKKyAqIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorICogR1JBUEhJQ1MsIElOQy4gIEJFIExJQUJMRSBUTyBZT1UgT1IgQU5ZT05FIEVMU0UgRk9SIEFOWSBESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCisgKiBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLAorICogTE9TUyBPRiBQUk9GSVQsIExPU1MgT0YgVVNFLCBTQVZJTkdTIE9SIFJFVkVOVUUsIE9SIFRIRSBDTEFJTVMgT0YKKyAqIFRISVJEIFBBUlRJRVMsIFdIRVRIRVIgT1IgTk9UIFNJTElDT04gR1JBUEhJQ1MsIElOQy4gIEhBUyBCRUVOCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIExPU1MsIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFBPU1NFU1NJT04sIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMKKyAqIFVzZSwgZHVwbGljYXRpb24sIG9yIGRpc2Nsb3N1cmUgYnkgdGhlIEdvdmVybm1lbnQgaXMgc3ViamVjdCB0bworICogcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBpbiBGQVIgNTIuMjI3LjE5KGMpKDIpIG9yIHN1YnBhcmFncmFwaAorICogKGMpKDEpKGlpKSBvZiB0aGUgUmlnaHRzIGluIFRlY2huaWNhbCBEYXRhIGFuZCBDb21wdXRlciBTb2Z0d2FyZQorICogY2xhdXNlIGF0IERGQVJTIDI1Mi4yMjctNzAxMyBhbmQvb3IgaW4gc2ltaWxhciBvciBzdWNjZXNzb3IKKyAqIGNsYXVzZXMgaW4gdGhlIEZBUiBvciB0aGUgRE9EIG9yIE5BU0EgRkFSIFN1cHBsZW1lbnQuCisgKiBVbnB1Ymxpc2hlZC0tIHJpZ2h0cyByZXNlcnZlZCB1bmRlciB0aGUgY29weXJpZ2h0IGxhd3Mgb2YgdGhlCisgKiBVbml0ZWQgU3RhdGVzLiAgQ29udHJhY3Rvci9tYW51ZmFjdHVyZXIgaXMgU2lsaWNvbiBHcmFwaGljcywKKyAqIEluYy4sIDIwMTEgTi4gIFNob3JlbGluZSBCbHZkLiwgTW91bnRhaW4gVmlldywgQ0EgOTQwMzktNzMxMS4KKyAqCisgKiBPcGVuR0woVE0pIGlzIGEgdHJhZGVtYXJrIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjaW5jbHVkZSAiYXRsYW50aXMuaCIKKworZmlzaFJlYyBzaGFya3NbTlVNX1NIQVJLU107CitmaXNoUmVjIG1vbVdoYWxlOworZmlzaFJlYyBiYWJ5V2hhbGU7CitmaXNoUmVjIGRvbHBoOworCitHTGJvb2xlYW4gVGltaW5nID0gR0xfVFJVRTsKKworaW50IHdfd2luID0gNjQwOworaW50IGhfd2luID0gNDgwOworR0xpbnQgY291bnQgID0gMDsKK0dMZW51bSBTdHJNb2RlID0gR0xfVkVORE9SOworCitHTGJvb2xlYW4gbW92aW5nOworCitzdGF0aWMgZG91YmxlIG10aW1lKHZvaWQpCit7CisgICBzdHJ1Y3QgdGltZXZhbCB0a190aW1lOworICAgc3RydWN0IHRpbWV6b25lIHR6OworICAgCisgICBnZXR0aW1lb2ZkYXkoJnRrX3RpbWUsICZ0eik7CisgICAKKyAgIHJldHVybiA0Mjk0Ljk2NzI5NiAqIHRrX3RpbWUudHZfc2VjICsgMC4wMDAwMDEgKiB0a190aW1lLnR2X3VzZWM7Cit9CisKK3N0YXRpYyBkb3VibGUgZmlsdGVyKGRvdWJsZSBpbiwgZG91YmxlICpzYXZlKQoreworCXN0YXRpYyBkb3VibGUgazEgPSAwLjk7CisJc3RhdGljIGRvdWJsZSBrMiA9IDAuMDU7CisKKwlzYXZlWzNdID0gaW47CisJc2F2ZVsxXSA9IHNhdmVbMF0qazEgKyBrMiooc2F2ZVszXSArIHNhdmVbMl0pOworCisJc2F2ZVswXT1zYXZlWzFdOworCXNhdmVbMl09c2F2ZVszXTsKKworCXJldHVybihzYXZlWzFdKTsKK30KKwordm9pZCBEcmF3U3RyKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlHTGludCBpID0gMDsKKwkKKwlpZighc3RyKSByZXR1cm47CisgICAgICAgIAorCXdoaWxlKHN0cltpXSkKKwl7CisJCWdsdXRCaXRtYXBDaGFyYWN0ZXIoR0xVVF9CSVRNQVBfSEVMVkVUSUNBXzEyLCBzdHJbaV0pOworCQlpKys7CisJfQorfQorCit2b2lkCitJbml0RmlzaHModm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fU0hBUktTOyBpKyspIHsKKyAgICAgICAgc2hhcmtzW2ldLnggPSA3MDAwMC4wICsgcmFuZCgpICUgNjAwMDsKKyAgICAgICAgc2hhcmtzW2ldLnkgPSByYW5kKCkgJSA2MDAwOworICAgICAgICBzaGFya3NbaV0ueiA9IHJhbmQoKSAlIDYwMDA7CisgICAgICAgIHNoYXJrc1tpXS5wc2kgPSByYW5kKCkgJSAzNjAgLSAxODAuMDsKKyAgICAgICAgc2hhcmtzW2ldLnYgPSAxLjA7CisgICAgfQorCisgICAgZG9scGgueCA9IDMwMDAwLjA7CisgICAgZG9scGgueSA9IDAuMDsKKyAgICBkb2xwaC56ID0gNjAwMC4wOworICAgIGRvbHBoLnBzaSA9IDkwLjA7CisgICAgZG9scGgudGhldGEgPSAwLjA7CisgICAgZG9scGgudiA9IDMuMDsKKworICAgIG1vbVdoYWxlLnggPSA3MDAwMC4wOworICAgIG1vbVdoYWxlLnkgPSAwLjA7CisgICAgbW9tV2hhbGUueiA9IDAuMDsKKyAgICBtb21XaGFsZS5wc2kgPSA5MC4wOworICAgIG1vbVdoYWxlLnRoZXRhID0gMC4wOworICAgIG1vbVdoYWxlLnYgPSAzLjA7CisKKyAgICBiYWJ5V2hhbGUueCA9IDYwMDAwLjA7CisgICAgYmFieVdoYWxlLnkgPSAtMjAwMC4wOworICAgIGJhYnlXaGFsZS56ID0gLTIwMDAuMDsKKyAgICBiYWJ5V2hhbGUucHNpID0gOTAuMDsKKyAgICBiYWJ5V2hhbGUudGhldGEgPSAwLjA7CisgICAgYmFieVdoYWxlLnYgPSAzLjA7Cit9CisKK3ZvaWQKK0F0bGFudGlzX0luaXQodm9pZCkKK3sKKyAgICBzdGF0aWMgZmxvYXQgYW1iaWVudFtdID0gezAuMiwgMC4yLCAwLjIsIDEuMH07CisgICAgc3RhdGljIGZsb2F0IGRpZmZ1c2VbXSA9IHsxLjAsIDEuMCwgMS4wLCAxLjB9OworICAgIHN0YXRpYyBmbG9hdCBwb3NpdGlvbltdID0gezAuMCwgMS4wLCAwLjAsIDAuMH07CisgICAgc3RhdGljIGZsb2F0IG1hdF9zaGluaW5lc3NbXSA9IHs5MC4wfTsKKyAgICBzdGF0aWMgZmxvYXQgbWF0X3NwZWN1bGFyW10gPSB7MC44LCAwLjgsIDAuOCwgMS4wfTsKKyAgICBzdGF0aWMgZmxvYXQgbWF0X2RpZmZ1c2VbXSA9IHswLjQ2LCAwLjY2LCAwLjc5NSwgMS4wfTsKKyAgICBzdGF0aWMgZmxvYXQgbWF0X2FtYmllbnRbXSA9IHswLjMsIDAuNCwgMC41LCAxLjB9OworICAgIHN0YXRpYyBmbG9hdCBsbW9kZWxfYW1iaWVudFtdID0gezAuNCwgMC40LCAwLjQsIDEuMH07CisgICAgc3RhdGljIGZsb2F0IGxtb2RlbF9sb2NhbHZpZXdlcltdID0gezAuMH07CisgICAgLy9HTGZsb2F0IG1hcDFbNF0gPSB7MC4wLCAwLjAsIDAuMCwgMC4wfTsKKyAgICAvL0dMZmxvYXQgbWFwMls0XSA9IHswLjAsIDAuMCwgMC4wLCAwLjB9OworICAgIHN0YXRpYyBmbG9hdCBmb2dfY29sb3JbXSA9IHswLjAsIDAuNSwgMC45LCAxLjB9OworCisgICAgZ2xGcm9udEZhY2UoR0xfQ0NXKTsKKworICAgIGdsRGVwdGhGdW5jKEdMX0xFU1MpOworICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworCisgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfQU1CSUVOVCwgYW1iaWVudCk7CisgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfRElGRlVTRSwgZGlmZnVzZSk7CisgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfUE9TSVRJT04sIHBvc2l0aW9uKTsKKyAgICBnbExpZ2h0TW9kZWxmdihHTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBsbW9kZWxfYW1iaWVudCk7CisgICAgZ2xMaWdodE1vZGVsZnYoR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSLCBsbW9kZWxfbG9jYWx2aWV3ZXIpOworICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDApOworCisgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TSElOSU5FU1MsIG1hdF9zaGluaW5lc3MpOworICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIG1hdF9zcGVjdWxhcik7CisgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9ESUZGVVNFLCBtYXRfZGlmZnVzZSk7CisgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBtYXRfYW1iaWVudCk7CisKKyAgICBJbml0RmlzaHMoKTsKKworICAgIGdsRW5hYmxlKEdMX0ZPRyk7CisJZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9FWFApOworCWdsRm9nZihHTF9GT0dfREVOU0lUWSwgMC4wMDAwMDI1KTsKKwlnbEZvZ2Z2KEdMX0ZPR19DT0xPUiwgZm9nX2NvbG9yKTsKKworICAgIGdsQ2xlYXJDb2xvcigwLjAsIDAuNSwgMC45LCAxLjApOworfQorCit2b2lkCitBdGxhbnRpc19SZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwl3X3dpbiA9IHdpZHRoOworCWhfd2luID0gaGVpZ2h0OworCQorICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICBnbHVQZXJzcGVjdGl2ZSg2MC4wLCAoR0xmbG9hdCkgd2lkdGggLyAoR0xmbG9hdCkgaGVpZ2h0LCAyMDAwMC4wLCAzMDAwMDAuMCk7CisgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Cit9CisKK3ZvaWQKK0F0bGFudGlzX0FuaW1hdGUodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fU0hBUktTOyBpKyspIHsKKyAgICAgICAgU2hhcmtQaWxvdCgmc2hhcmtzW2ldKTsKKyAgICAgICAgU2hhcmtNaXNzKGkpOworICAgIH0KKyAgICBXaGFsZVBpbG90KCZkb2xwaCk7CisgICAgZG9scGgucGhpKys7CisgICAgLy9nbHV0UG9zdFJlZGlzcGxheSgpOworICAgIFdoYWxlUGlsb3QoJm1vbVdoYWxlKTsKKyAgICBtb21XaGFsZS5waGkrKzsKKyAgICBXaGFsZVBpbG90KCZiYWJ5V2hhbGUpOworICAgIGJhYnlXaGFsZS5waGkrKzsKK30KKwordm9pZAorQXRsYW50aXNfS2V5KHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgeCwgaW50IHkpCit7CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlICd0JzoKKyAgICAJVGltaW5nID0gIVRpbWluZzsKKyAgICBicmVhazsKKyAgICBjYXNlICcgJzoKKyAgICAJc3dpdGNoKFN0ck1vZGUpCisgICAgCXsKKwkJICAgIGNhc2UgR0xfRVhURU5TSU9OUzoKKyAgICAJCQlTdHJNb2RlID0gR0xfVkVORE9SOworCQkgICAgYnJlYWs7CisJCSAgICBjYXNlIEdMX1ZFTkRPUjoKKwkJICAgIAlTdHJNb2RlID0gR0xfUkVOREVSRVI7CisJCSAgICBicmVhazsKKwkJICAgIGNhc2UgR0xfUkVOREVSRVI6CisJCSAgICAJU3RyTW9kZSA9IEdMX1ZFUlNJT047CisJCSAgICBicmVhazsKKwkJICAgIGNhc2UgR0xfVkVSU0lPTjoKKwkJICAgIAlTdHJNb2RlID0gR0xfRVhURU5TSU9OUzsKKwkJICAgIGJyZWFrOworCQl9CisJYnJlYWs7CisgICAgY2FzZSAyNzogICAgICAgICAgIC8qIEVzYyB3aWxsIHF1aXQgKi8KKyAgICAgICAgZXhpdCgxKTsKKyAgICBicmVhazsKKyAgICBjYXNlICdzJzogICAgICAgICAgICAgCQkvKiAicyIgc3RhcnQgYW5pbWF0aW9uICovCisgICAgICAgIG1vdmluZyA9IEdMX1RSVUU7CisgICAgICAgIC8vZ2x1dElkbGVGdW5jKEFuaW1hdGUpOworICAgIGJyZWFrOworICAgIGNhc2UgJ2EnOiAgICAgICAgICAJCQkvKiAiYSIgc3RvcCBhbmltYXRpb24gKi8KKyAgICAgICAgbW92aW5nID0gR0xfRkFMU0U7CisgICAgICAgIC8vZ2x1dElkbGVGdW5jKE5VTEwpOworICAgIGJyZWFrOworICAgIGNhc2UgJy4nOiAgICAgICAgICAJCQkvKiAiLiIgd2lsbCBhZHZhbmNlIGZyYW1lICovCisgICAgICAgIGlmICghbW92aW5nKSB7CisgICAgICAgICAgICBBdGxhbnRpc19BbmltYXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisvKgordm9pZCBEaXNwbGF5KHZvaWQpCit7CisJc3RhdGljIGZsb2F0IFAxMjNbM10gPSB7LTQ0OC45NCwgLTIwMy4xNCwgOTQ5OS42MH07CisJc3RhdGljIGZsb2F0IFAxMjRbM10gPSB7LTQ0Mi42NCwgLTE4NS4yMCwgOTUyOC4wN307CisJc3RhdGljIGZsb2F0IFAxMjVbM10gPSB7LTQ0MS4wNywgLTE0OC4wNSwgOTUyOC4wN307CisJc3RhdGljIGZsb2F0IFAxMjZbM10gPSB7LTQ0My40MywgLTEyOC44NCwgOTQ5OS42MH07CisJc3RhdGljIGZsb2F0IFAxMjdbM10gPSB7LTQ1Ni44NywgLTE0Ni43OCwgOTQ2Ni42N307CisJc3RhdGljIGZsb2F0IFAxMjhbM10gPSB7LTQ1My42OCwgLTE4My45MywgOTQ2Ni42N307CisKKwlnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUKTsKKwkKKwlnbFB1c2hNYXRyaXgoKTsKKyAgICBGaXNoVHJhbnNmb3JtKCZkb2xwaCk7CisgICAgRHJhd0RvbHBoaW4oJmRvbHBoKTsKKyAgICBnbFBvcE1hdHJpeCgpOworIAorCWdsdXRTd2FwQnVmZmVycygpOworfQorKi8KKwordm9pZAorQXRsYW50aXNfRGlzcGxheSh2b2lkKQoreworICAgIGludCBpOworICAgIHN0YXRpYyBkb3VibGUgdGhbNF0gPSB7MC4wLCAwLjAsIDAuMCwgMC4wfTsKKwlzdGF0aWMgZG91YmxlIHQxID0gMC4wLCB0MiA9IDAuMCwgdDsKKwljaGFyIG51bV9zdHJbMTI4XTsKKyAgICAKKyAgICB0MSA9IHQyOworCisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1NIQVJLUzsgaSsrKSB7CisgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICBGaXNoVHJhbnNmb3JtKCZzaGFya3NbaV0pOworICAgICAgICBEcmF3U2hhcmsoJnNoYXJrc1tpXSk7CisgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgfQorCisgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgRmlzaFRyYW5zZm9ybSgmZG9scGgpOworICAgIERyYXdEb2xwaGluKCZkb2xwaCk7CisgICAgZ2xQb3BNYXRyaXgoKTsKKworICAgIGdsUHVzaE1hdHJpeCgpOworICAgIEZpc2hUcmFuc2Zvcm0oJm1vbVdoYWxlKTsKKyAgICBEcmF3V2hhbGUoJm1vbVdoYWxlKTsKKyAgICBnbFBvcE1hdHJpeCgpOworCisgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgRmlzaFRyYW5zZm9ybSgmYmFieVdoYWxlKTsKKyAgICBnbFNjYWxlZigwLjQ1LCAwLjQ1LCAwLjMpOworICAgIERyYXdXaGFsZSgmYmFieVdoYWxlKTsKKyAgICBnbFBvcE1hdHJpeCgpOworICAgIAorICAgIGlmKFRpbWluZykKKyAgICB7CisJCXQyID0gbXRpbWUoKTsKKwkJdCA9IHQyIC0gdDE7CisJCWlmKHQgPiAwLjAwMDEpIHQgPSAxLjAgLyB0OworCQkKKwkJZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKwkJLy9nbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisJCQorCQlnbENvbG9yM2YoMS4wLCAwLjAsIDAuMCk7CisJCQorCQlnbE1hdHJpeE1vZGUgKEdMX1BST0pFQ1RJT04pOworCQlnbFB1c2hNYXRyaXgoKTsKKwkJZ2xMb2FkSWRlbnRpdHkoKTsKKwkJZ2xPcnRobygwLCB3X3dpbiwgMCwgaF93aW4sIC0xMC4wLCAxMC4wKTsKKwkJCisJCWdsUmFzdGVyUG9zMmYoNS4wLCA1LjApOworCQkKKwkJc3dpdGNoKFN0ck1vZGUpCisJCXsKKwkJCWNhc2UgR0xfVkVORE9SOgorCQkJCXNwcmludGYobnVtX3N0ciwgIiUwLjJmIEh6LCAlZHglZCwgVkVORE9SOiAiLCBmaWx0ZXIodCwgdGgpLCB3X3dpbiwgaF93aW4pOworCQkJCURyYXdTdHIobnVtX3N0cik7CisJCQkJRHJhd1N0cihnbEdldFN0cmluZyhHTF9WRU5ET1IpKTsKKwkJCWJyZWFrOworCQkJY2FzZSBHTF9SRU5ERVJFUjoKKwkJCQlzcHJpbnRmKG51bV9zdHIsICIlMC4yZiBIeiwgJWR4JWQsIFJFTkRFUkVSOiAiLCBmaWx0ZXIodCwgdGgpLCB3X3dpbiwgaF93aW4pOworCQkJCURyYXdTdHIobnVtX3N0cik7CisJCQkJRHJhd1N0cihnbEdldFN0cmluZyhHTF9SRU5ERVJFUikpOworCQkJYnJlYWs7CisJCQljYXNlIEdMX1ZFUlNJT046CisJCQkJc3ByaW50ZihudW1fc3RyLCAiJTAuMmYgSHosICVkeCVkLCBWRVJTSU9OOiAiLCBmaWx0ZXIodCwgdGgpLCB3X3dpbiwgaF93aW4pOworCQkJCURyYXdTdHIobnVtX3N0cik7CisJCQkJRHJhd1N0cihnbEdldFN0cmluZyhHTF9WRVJTSU9OKSk7CisJCQlicmVhazsKKwkJCWNhc2UgR0xfRVhURU5TSU9OUzoKKwkJCQlzcHJpbnRmKG51bV9zdHIsICIlMC4yZiBIeiwgJWR4JWQsIEVYVEVOU0lPTlM6ICIsIGZpbHRlcih0LCB0aCksIHdfd2luLCBoX3dpbik7CisJCQkJRHJhd1N0cihudW1fc3RyKTsKKwkJCQlEcmF3U3RyKGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKKwkJCWJyZWFrOworCQl9CisJCQorCQlnbFBvcE1hdHJpeCgpOworCQlnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKwkJCisJCWdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKwkJLy9nbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKwl9CisJCisgICAgY291bnQrKzsKKworICAgIGdsdXRTd2FwQnVmZmVycygpOworfQorCisvKgordm9pZAorVmlzaWJsZShpbnQgc3RhdGUpCit7CisgICAgaWYgKHN0YXRlID09IEdMVVRfVklTSUJMRSkgeworICAgICAgICBpZiAobW92aW5nKQorICAgICAgICAgICAgZ2x1dElkbGVGdW5jKEFuaW1hdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtb3ZpbmcpCisgICAgICAgICAgICBnbHV0SWRsZUZ1bmMoTlVMTCk7CisgICAgfQorfQorCisKK3ZvaWQKK3RpbWluZ1NlbGVjdChpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoKHZhbHVlKQorICAgIHsKKwkJY2FzZSAxOgorCQkJU3RyTW9kZSA9IEdMX1ZFTkRPUjsKKwkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCVN0ck1vZGUgPSBHTF9SRU5ERVJFUjsKKwkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCVN0ck1vZGUgPSBHTF9WRVJTSU9OOworCQlicmVhazsKKwkJY2FzZSA0OgorCQkJU3RyTW9kZSA9IEdMX0VYVEVOU0lPTlM7CisJCWJyZWFrOworICAgIH0KK30KKwordm9pZAorbWVudVNlbGVjdChpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgIGNhc2UgMToKKyAgICAgICAgbW92aW5nID0gR0xfVFJVRTsKKyAgICAgICAgZ2x1dElkbGVGdW5jKEFuaW1hdGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIG1vdmluZyA9IEdMX0ZBTFNFOworICAgICAgICBnbHV0SWRsZUZ1bmMoTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUdMYm9vbGVhbiBmdWxsc2NyZWVuID0gR0xfRkFMU0U7IAorCUdMaW50IHRpbWVfbWVudTsKKyAJCisgCXNyYW5kKDApOworCisgICAgICAgIGdsdXRJbml0KCZhcmdjLCBhcmd2KTsKKwlpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcChhcmd2WzFdLCAiLXciKSkKKwkJZnVsbHNjcmVlbiA9IEdMX0ZBTFNFOworCisJLy9nbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfUkdCQSB8IEdMVVRfRE9VQkxFIHwgR0xVVF9ERVBUSCk7CisJZ2x1dEluaXREaXNwbGF5U3RyaW5nKCJyZ2JhIGRvdWJsZSBkZXB0aD0yNCIpOworCWlmIChmdWxsc2NyZWVuKSB7CisJICBnbHV0R2FtZU1vZGVTdHJpbmcoIjEwMjR4NzY4OjMyIik7CisJICBnbHV0RW50ZXJHYW1lTW9kZSgpOworCX0gZWxzZSB7CisJICBnbHV0SW5pdFdpbmRvd1NpemUoMzIwLCAyNDApOworCSAgZ2x1dENyZWF0ZVdpbmRvdygiQXRsYW50aXMgVGltaW5nIik7CisJfQorICAgIEluaXQoKTsKKyAgICBnbHV0RGlzcGxheUZ1bmMoRGlzcGxheSk7CisgICAgZ2x1dFJlc2hhcGVGdW5jKFJlc2hhcGUpOworICAgIGdsdXRLZXlib2FyZEZ1bmMoS2V5KTsKKyAgICBtb3ZpbmcgPSBHTF9UUlVFOworZ2x1dElkbGVGdW5jKEFuaW1hdGUpOworICAgIGdsdXRWaXNpYmlsaXR5RnVuYyhWaXNpYmxlKTsKKyAgICAKKyAgICB0aW1lX21lbnUgPSBnbHV0Q3JlYXRlTWVudSh0aW1pbmdTZWxlY3QpOworICAgIGdsdXRBZGRNZW51RW50cnkoIkdMX1ZFTkRPUiIsIDEpOworICAgIGdsdXRBZGRNZW51RW50cnkoIkdMX1JFTkRFUkVSIiwgMik7CisgICAgZ2x1dEFkZE1lbnVFbnRyeSgiR0xfVkVSU0lPTiIsIDMpOworICAgIGdsdXRBZGRNZW51RW50cnkoIkdMX0VYVEVOU0lPTlMiLCA0KTsKKyAgICAKKyAgICBnbHV0Q3JlYXRlTWVudShtZW51U2VsZWN0KTsKKyAgICBnbHV0QWRkTWVudUVudHJ5KCJTdGFydCBtb3Rpb24iLCAxKTsKKyAgICBnbHV0QWRkTWVudUVudHJ5KCJTdG9wIG1vdGlvbiIsIDIpOworICAgIGdsdXRBZGRTdWJNZW51KCJUaW1pbmcgTW9kZSIsIHRpbWVfbWVudSk7CisgICAgZ2x1dEFkZE1lbnVFbnRyeSgiUXVpdCIsIDQpOworICAgIAorICAgIC8vZ2x1dEF0dGFjaE1lbnUoR0xVVF9SSUdIVF9CVVRUT04pOworICAgIGdsdXRBdHRhY2hNZW51KEdMVVRfUklHSFRfQlVUVE9OKTsKKyAgICBnbHV0TWFpbkxvb3AoKTsKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgLy8gQU5TSSBDIHJlcXVpcmVzIG1haW4gdG8gcmV0dXJuIGludC4KK30KKyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9hdGxhbnRpcy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9hdGxhbnRpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2YyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL2F0bGFudGlzLmgKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiAoYykgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFMTCBSSUdIVFMgUkVTRVJWRUQKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UKKyAqIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nCisgKiBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogVEhFIE1BVEVSSUFMIEVNQk9ESUVEIE9OIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgVE8gWU9VICJBUy1JUyIKKyAqIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwKKyAqIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorICogR1JBUEhJQ1MsIElOQy4gIEJFIExJQUJMRSBUTyBZT1UgT1IgQU5ZT05FIEVMU0UgRk9SIEFOWSBESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCisgKiBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLAorICogTE9TUyBPRiBQUk9GSVQsIExPU1MgT0YgVVNFLCBTQVZJTkdTIE9SIFJFVkVOVUUsIE9SIFRIRSBDTEFJTVMgT0YKKyAqIFRISVJEIFBBUlRJRVMsIFdIRVRIRVIgT1IgTk9UIFNJTElDT04gR1JBUEhJQ1MsIElOQy4gIEhBUyBCRUVOCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIExPU1MsIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFBPU1NFU1NJT04sIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMKKyAqIFVzZSwgZHVwbGljYXRpb24sIG9yIGRpc2Nsb3N1cmUgYnkgdGhlIEdvdmVybm1lbnQgaXMgc3ViamVjdCB0bworICogcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBpbiBGQVIgNTIuMjI3LjE5KGMpKDIpIG9yIHN1YnBhcmFncmFwaAorICogKGMpKDEpKGlpKSBvZiB0aGUgUmlnaHRzIGluIFRlY2huaWNhbCBEYXRhIGFuZCBDb21wdXRlciBTb2Z0d2FyZQorICogY2xhdXNlIGF0IERGQVJTIDI1Mi4yMjctNzAxMyBhbmQvb3IgaW4gc2ltaWxhciBvciBzdWNjZXNzb3IKKyAqIGNsYXVzZXMgaW4gdGhlIEZBUiBvciB0aGUgRE9EIG9yIE5BU0EgRkFSIFN1cHBsZW1lbnQuCisgKiBVbnB1Ymxpc2hlZC0tIHJpZ2h0cyByZXNlcnZlZCB1bmRlciB0aGUgY29weXJpZ2h0IGxhd3Mgb2YgdGhlCisgKiBVbml0ZWQgU3RhdGVzLiAgQ29udHJhY3Rvci9tYW51ZmFjdHVyZXIgaXMgU2lsaWNvbiBHcmFwaGljcywKKyAqIEluYy4sIDIwMTEgTi4gIFNob3JlbGluZSBCbHZkLiwgTW91bnRhaW4gVmlldywgQ0EgOTQwMzktNzMxMS4KKyAqCisgKiBPcGVuR0woVE0pIGlzIGEgdHJhZGVtYXJrIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2RlZmluZSBSQUQgNTcuMjk1CisjZGVmaW5lIFJSQUQgMC4wMTc0NQorCisjZGVmaW5lIE5VTV9TSEFSS1MgNAorI2RlZmluZSBTSEFSS1NJWkUgNjAwMAorI2RlZmluZSBTSEFSS1NQRUVEIDEwMC4wCisKKyNkZWZpbmUgV0hBTEVTUEVFRCAyNTAuMAorCit0eXBlZGVmIHN0cnVjdCBfZmlzaFJlYyB7CisgICAgZmxvYXQgeCwgeSwgeiwgcGhpLCB0aGV0YSwgcHNpLCB2OworICAgIGZsb2F0IHh0LCB5dCwgenQ7CisgICAgZmxvYXQgaHRhaWwsIHZ0YWlsOworICAgIGZsb2F0IGR0aGV0YTsKKyAgICBpbnQgc3B1cnQsIGF0dGFjazsKK30gZmlzaFJlYzsKKworZXh0ZXJuIGZpc2hSZWMgc2hhcmtzW05VTV9TSEFSS1NdOworZXh0ZXJuIGZpc2hSZWMgbW9tV2hhbGU7CitleHRlcm4gZmlzaFJlYyBiYWJ5V2hhbGU7CitleHRlcm4gZmlzaFJlYyBkb2xwaDsKKworZXh0ZXJuIHZvaWQgRmlzaFRyYW5zZm9ybShmaXNoUmVjICopOworZXh0ZXJuIHZvaWQgV2hhbGVQaWxvdChmaXNoUmVjICopOworZXh0ZXJuIHZvaWQgU2hhcmtQaWxvdChmaXNoUmVjICopOworZXh0ZXJuIHZvaWQgU2hhcmtNaXNzKGludCk7CitleHRlcm4gdm9pZCBEcmF3V2hhbGUoZmlzaFJlYyAqKTsKK2V4dGVybiB2b2lkIERyYXdTaGFyayhmaXNoUmVjICopOworZXh0ZXJuIHZvaWQgRHJhd0RvbHBoaW4oZmlzaFJlYyAqKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvZG9scGhpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9kb2xwaGluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiYTNiYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvZG9scGhpbi5jCkBAIC0wLDAgKzEsMTkzNCBAQAorLyoqCisgKiAoYykgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFMTCBSSUdIVFMgUkVTRVJWRUQKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UKKyAqIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nCisgKiBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogVEhFIE1BVEVSSUFMIEVNQk9ESUVEIE9OIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgVE8gWU9VICJBUy1JUyIKKyAqIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwKKyAqIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorICogR1JBUEhJQ1MsIElOQy4gIEJFIExJQUJMRSBUTyBZT1UgT1IgQU5ZT05FIEVMU0UgRk9SIEFOWSBESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCisgKiBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLAorICogTE9TUyBPRiBQUk9GSVQsIExPU1MgT0YgVVNFLCBTQVZJTkdTIE9SIFJFVkVOVUUsIE9SIFRIRSBDTEFJTVMgT0YKKyAqIFRISVJEIFBBUlRJRVMsIFdIRVRIRVIgT1IgTk9UIFNJTElDT04gR1JBUEhJQ1MsIElOQy4gIEhBUyBCRUVOCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIExPU1MsIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFBPU1NFU1NJT04sIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMKKyAqIFVzZSwgZHVwbGljYXRpb24sIG9yIGRpc2Nsb3N1cmUgYnkgdGhlIEdvdmVybm1lbnQgaXMgc3ViamVjdCB0bworICogcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBpbiBGQVIgNTIuMjI3LjE5KGMpKDIpIG9yIHN1YnBhcmFncmFwaAorICogKGMpKDEpKGlpKSBvZiB0aGUgUmlnaHRzIGluIFRlY2huaWNhbCBEYXRhIGFuZCBDb21wdXRlciBTb2Z0d2FyZQorICogY2xhdXNlIGF0IERGQVJTIDI1Mi4yMjctNzAxMyBhbmQvb3IgaW4gc2ltaWxhciBvciBzdWNjZXNzb3IKKyAqIGNsYXVzZXMgaW4gdGhlIEZBUiBvciB0aGUgRE9EIG9yIE5BU0EgRkFSIFN1cHBsZW1lbnQuCisgKiBVbnB1Ymxpc2hlZC0tIHJpZ2h0cyByZXNlcnZlZCB1bmRlciB0aGUgY29weXJpZ2h0IGxhd3Mgb2YgdGhlCisgKiBVbml0ZWQgU3RhdGVzLiAgQ29udHJhY3Rvci9tYW51ZmFjdHVyZXIgaXMgU2lsaWNvbiBHcmFwaGljcywKKyAqIEluYy4sIDIwMTEgTi4gIFNob3JlbGluZSBCbHZkLiwgTW91bnRhaW4gVmlldywgQ0EgOTQwMzktNzMxMS4KKyAqCisgKiBPcGVuR0woVE0pIGlzIGEgdHJhZGVtYXJrIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxHTFVUL2dsdXQuaD4KKyNpbmNsdWRlICJhdGxhbnRpcy5oIgorLyogKklOREVOVC1PRkYqICovCitzdGF0aWMgZmxvYXQgTjAwMVszXSA9IHstMC4wMDU5MzcgLC0wLjEwMTk5OCAsLTAuOTk0NzY3fTsKK3N0YXRpYyBmbG9hdCBOMDAyWzNdID0gezAuOTM2NzgwICwtMC4yMDA4MDMgLDAuMjg2NTY5fTsKK3N0YXRpYyBmbG9hdCBOMDAzWzNdID0gey0wLjIzMzA2MiAsMC45NzIwNTggLDAuMDI4MDA3fTsKK3N0YXRpYyBmbG9hdCBOMDA1WzNdID0gezAuODk4MTE3ICwwLjM2MDE3MSAsMC4yNTIzMTV9Oworc3RhdGljIGZsb2F0IE4wMDZbM10gPSB7LTAuOTE1NDM3ICwwLjM0ODQ1NiAsMC4yMDEzNzh9Oworc3RhdGljIGZsb2F0IE4wMDdbM10gPSB7MC42MDIyNjMgLC0wLjc3NzUyNyAsMC4xODA5MjB9Oworc3RhdGljIGZsb2F0IE4wMDhbM10gPSB7LTAuOTA2OTEyICwtMC40MTIwMTUgLDAuMDg4MDYxfTsKK3N0YXRpYyBmbG9hdCBOMDEyWzNdID0gezAuODg0NDA4ICwtMC40Mjk0MTcgLC0wLjE4MjgyMX07CitzdGF0aWMgZmxvYXQgTjAxM1szXSA9IHswLjkyMTEyMSAsMC4zMTEwODQgLC0wLjIzNDAxNn07CitzdGF0aWMgZmxvYXQgTjAxNFszXSA9IHswLjM4MjYzNSAsMC44Nzc4ODIgLC0wLjI4Nzk0OH07CitzdGF0aWMgZmxvYXQgTjAxNVszXSA9IHstMC4zODAwNDYgLDAuODg4MTY2ICwtMC4yNTgzMTZ9Oworc3RhdGljIGZsb2F0IE4wMTZbM10gPSB7LTAuODkxNTE1ICwwLjM5MjIzOCAsLTAuMjI2NjA3fTsKK3N0YXRpYyBmbG9hdCBOMDE3WzNdID0gey0wLjkwMTQxOSAsLTAuMzgyMDAyICwtMC4yMDM3NjN9Oworc3RhdGljIGZsb2F0IE4wMThbM10gPSB7LTAuMzY3MjI1ICwtMC45MTEwOTEgLC0wLjE4NzI0M307CitzdGF0aWMgZmxvYXQgTjAxOVszXSA9IHswLjMzOTUzOSAsLTAuOTI0ODQ2ICwtMC4xNzEzODh9Oworc3RhdGljIGZsb2F0IE4wMjBbM10gPSB7MC45MTQ3MDYgLC0wLjM3ODYxNyAsLTAuMTQxMjkwfTsKK3N0YXRpYyBmbG9hdCBOMDIxWzNdID0gezAuOTUwNjYyICwwLjI2MjcxMyAsLTAuMTY0OTk0fTsKK3N0YXRpYyBmbG9hdCBOMDIyWzNdID0gezAuNTQ2MzU5ICwwLjgwMTQ2MCAsLTAuMjQzMjE4fTsKK3N0YXRpYyBmbG9hdCBOMDIzWzNdID0gey0wLjMxNTc5NiAsMC45MTcwNjggLC0wLjI0MzQzMX07CitzdGF0aWMgZmxvYXQgTjAyNFszXSA9IHstMC44MjU2ODcgLDAuNTMyMjc3ICwtMC4xODY4NzV9Oworc3RhdGljIGZsb2F0IE4wMjVbM10gPSB7LTAuOTc0NzYzICwtMC4xNTUyMzIgLC0wLjE2MDQzNX07CitzdGF0aWMgZmxvYXQgTjAyNlszXSA9IHstMC41NjA1OTYgLC0wLjgxNjY1OCAsLTAuMTM3MTE5fTsKK3N0YXRpYyBmbG9hdCBOMDI3WzNdID0gezAuMzgwMjEwICwtMC45MTA4MTcgLC0wLjE2MDc4Nn07CitzdGF0aWMgZmxvYXQgTjAyOFszXSA9IHswLjkyMzc3MiAsLTAuMzU4MzIyICwtMC4xMzUwOTN9Oworc3RhdGljIGZsb2F0IE4wMjlbM10gPSB7MC45NTEyMDIgLDAuMjc1MDUzICwtMC4xMzk4NTl9Oworc3RhdGljIGZsb2F0IE4wMzBbM10gPSB7MC42ODYwOTkgLDAuNzAyNTQ4ICwtMC4xODg5MzJ9Oworc3RhdGljIGZsb2F0IE4wMzFbM10gPSB7LTAuNTIxODY1ICwwLjgyNjcxOSAsLTAuMjEwMjIwfTsKK3N0YXRpYyBmbG9hdCBOMDMyWzNdID0gey0wLjkyMzgyMCAsMC4zNDY3MzkgLC0wLjE2MjI1OH07CitzdGF0aWMgZmxvYXQgTjAzM1szXSA9IHstMC45MDIwOTUgLC0wLjQwOTk5NSAsLTAuMTM0NjQ2fTsKK3N0YXRpYyBmbG9hdCBOMDM0WzNdID0gey0wLjUwOTExNSAsLTAuODQ4NDk4ICwtMC4xNDQ0MDR9Oworc3RhdGljIGZsb2F0IE4wMzVbM10gPSB7MC40NTY0NjkgLC0wLjg4MDI5MyAsLTAuMTI5MzA1fTsKK3N0YXRpYyBmbG9hdCBOMDM2WzNdID0gezAuODczNDAxICwtMC40NzU0ODkgLC0wLjEwNTI2Nn07CitzdGF0aWMgZmxvYXQgTjAzN1szXSA9IHswLjk3MDgyNSAsMC4xNzk4NjEgLC0wLjE1ODU4NH07CitzdGF0aWMgZmxvYXQgTjAzOFszXSA9IHswLjY3NTYwOSAsMC43MTQxODcgLC0wLjE4MzAwNH07CitzdGF0aWMgZmxvYXQgTjAzOVszXSA9IHstMC41MjM1NzQgLDAuODMwMjEyICwtMC4xOTEzNjB9Oworc3RhdGljIGZsb2F0IE4wNDBbM10gPSB7LTAuOTU4ODk1ICwwLjIzMDgwOCAsLTAuMTY1MDcxfTsKK3N0YXRpYyBmbG9hdCBOMDQxWzNdID0gey0wLjkxODI4NSAsLTAuMzc2ODAzICwtMC4xMjE1NDJ9Oworc3RhdGljIGZsb2F0IE4wNDJbM10gPSB7LTAuNjIyNDY3ICwtMC43NzQxNjcgLC0wLjExNDg4OH07CitzdGF0aWMgZmxvYXQgTjA0M1szXSA9IHswLjQwNDQ5NyAsLTAuOTA4ODA3ICwtMC4xMDIyMzF9Oworc3RhdGljIGZsb2F0IE4wNDRbM10gPSB7MC45MzA1MzggLC0wLjM2NTE1NSAsLTAuMDI3NTg4fTsKK3N0YXRpYyBmbG9hdCBOMDQ1WzNdID0gezAuOTIxOTIwICwwLjM3NDE1NyAsLTAuMTAwMzQ1fTsKK3N0YXRpYyBmbG9hdCBOMDQ2WzNdID0gezAuNTA3MzQ2ICwwLjg2MDczOSAsMC4wNDE1NjJ9Oworc3RhdGljIGZsb2F0IE4wNDdbM10gPSB7LTAuMzk0NjQ2ICwwLjkxODgxNSAsLTAuMDA1NzMwfTsKK3N0YXRpYyBmbG9hdCBOMDQ4WzNdID0gey0wLjkyNTQxMSAsMC4zNzMwMjQgLC0wLjA2NjgzN307CitzdGF0aWMgZmxvYXQgTjA0OVszXSA9IHstMC45NDUzMzcgLC0wLjMyMjMwOSAsLTAuMDQ5NTUxfTsKK3N0YXRpYyBmbG9hdCBOMDUwWzNdID0gey0wLjY2MDQzNyAsLTAuNzUwNTU3ICwtMC4wMjIwNzJ9Oworc3RhdGljIGZsb2F0IE4wNTFbM10gPSB7MC40ODg4MzUgLC0wLjg3MTk1MCAsLTAuMDI3MjYxfTsKK3N0YXRpYyBmbG9hdCBOMDUyWzNdID0gezAuOTAyNTk5ICwtMC40MjEzOTcgLDAuMDg3OTY5fTsKK3N0YXRpYyBmbG9hdCBOMDUzWzNdID0gezAuOTM4NjM2ICwwLjMyMjYwNiAsMC4xMjIwMjB9Oworc3RhdGljIGZsb2F0IE4wNTRbM10gPSB7MC40ODQ2MDUgLDAuODcxMDc4ICwwLjA3OTg3OH07CitzdGF0aWMgZmxvYXQgTjA1NVszXSA9IHstMC4zNTM2MDcgLDAuOTMxNTU5ICwwLjA4NDYxOX07CitzdGF0aWMgZmxvYXQgTjA1NlszXSA9IHstMC44Njc3NTkgLDAuNDc4NTY0ICwwLjEzNDA1NH07CitzdGF0aWMgZmxvYXQgTjA1N1szXSA9IHstMC45NTE1ODMgLC0wLjI5NjAzMCAsMC4wODI3OTR9Oworc3RhdGljIGZsb2F0IE4wNThbM10gPSB7LTAuNjcyMzU1ICwtMC43MzAyMDkgLDAuMTIxMzg0fTsKK3N0YXRpYyBmbG9hdCBOMDU5WzNdID0gezAuNTI4MzM2ICwtMC44NDI0NTIgLDAuMTA1NTI1fTsKK3N0YXRpYyBmbG9hdCBOMDYwWzNdID0gezAuNzg2OTEzICwtMC41NjQ3NjAgLDAuMjQ4NjI3fTsKK3N0YXRpYyBmbG9hdCBOMDYyWzNdID0gezAuNjIyMDk4ICwwLjc2NTIzMCAsMC4xNjU1ODR9Oworc3RhdGljIGZsb2F0IE4wNjNbM10gPSB7LTAuNjMxNzExICwwLjc2NzgxNiAsMC4xMDY3NzN9Oworc3RhdGljIGZsb2F0IE4wNjRbM10gPSB7LTAuNjg3ODg2ICwwLjYwNjM1MSAsMC4zOTg5Mzh9Oworc3RhdGljIGZsb2F0IE4wNjVbM10gPSB7LTAuOTQ2MzI3ICwtMC4yODE2MjMgLDAuMTU4NTk4fTsKK3N0YXRpYyBmbG9hdCBOMDY2WzNdID0gey0wLjUwOTU0OSAsLTAuODYwNDM3ICwwLjAwMjc3Nn07CitzdGF0aWMgZmxvYXQgTjA2N1szXSA9IHswLjQ2MjU5NCAsLTAuODc2NjkyICwwLjEzMTk3N307CitzdGF0aWMgZmxvYXQgTjA3MVszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDc3WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDc4WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDc5WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDgwWzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDgxWzNdID0gey0wLjU3MTE5NyAsMC44MTYxNzMgLDAuMDg3MTUyfTsKK3N0YXRpYyBmbG9hdCBOMDgyWzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDgzWzNdID0gey0wLjU3MTE5NyAsMC44MTYxNzMgLDAuMDg3MTUyfTsKK3N0YXRpYyBmbG9hdCBOMDg0WzNdID0gey0wLjU3MTE5NyAsMC44MTYxNzMgLDAuMDg3MTUyfTsKK3N0YXRpYyBmbG9hdCBOMDg1WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDg2WzNdID0gey0wLjU3MTE5NyAsMC44MTYxNzMgLDAuMDg3MTUyfTsKK3N0YXRpYyBmbG9hdCBOMDg3WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDg4WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDg5WzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDkwWzNdID0gey0wLjg4MDc3MCAsMC40NjE0NDggLDAuMTA2MzUxfTsKK3N0YXRpYyBmbG9hdCBOMDkxWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTJbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5M1szXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDk0WzNdID0gezEuMDAwMDAwICwwLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTVbM10gPSB7LTEuMDAwMDAwICwwLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTdbM10gPSB7LTAuNjk3Mjk2ICwwLjcwMjg4MSAsMC4xNDA0OTF9Oworc3RhdGljIGZsb2F0IE4wOThbM10gPSB7MC45MTg4NjQgLDAuMzQwODIxICwwLjE5ODgxOX07CitzdGF0aWMgZmxvYXQgTjA5OVszXSA9IHstMC45MzI3MzcgLDAuMjAxMTk1ICwwLjI5OTIwMn07CitzdGF0aWMgZmxvYXQgTjEwMFszXSA9IHswLjAyOTUxNyAsMC45ODE2NzkgLDAuMTg4MjQ0fTsKK3N0YXRpYyBmbG9hdCBOMTAyWzNdID0gezAuODEzNTIxICwtMC4yMDQ5MzYgLDAuNTQ0MjI5fTsKK3N0YXRpYyBmbG9hdCBOMTEwWzNdID0gey0wLjc4MTQ4MCAsLTAuMzg0Nzc5ICwwLjQ5MTE1NX07CitzdGF0aWMgZmxvYXQgTjExMVszXSA9IHstMC43MjIyNDMgLDAuMzg0OTI3ICwwLjU3NDYyN307CitzdGF0aWMgZmxvYXQgTjExMlszXSA9IHstMC43NTIyNzggLDAuNTAyNjc5ICwwLjQyNTkwMX07CitzdGF0aWMgZmxvYXQgTjExM1szXSA9IHswLjU0NzI1NyAsMC4zNjc5MTAgLDAuNzUxNzY2fTsKK3N0YXRpYyBmbG9hdCBOMTE0WzNdID0gezAuNzI1OTQ5ICwtMC4yMzI1NjggLDAuNjQ3MjMzfTsKK3N0YXRpYyBmbG9hdCBOMTE1WzNdID0gey0wLjc0NzE4MiAsLTAuNjYwNzg2ICwwLjA3MTI4MH07CitzdGF0aWMgZmxvYXQgTjExNlszXSA9IHswLjkzMTUxOSAsMC4yMDA3NDggLDAuMzAzMjcwfTsKK3N0YXRpYyBmbG9hdCBOMTE3WzNdID0gey0wLjgyODkyOCAsMC4zMTM3NTcgLDAuNDYzMDcxfTsKK3N0YXRpYyBmbG9hdCBOMTE4WzNdID0gezAuOTAyNTU0ICwtMC4zNzA5NjcgLDAuMjE4NTg3fTsKK3N0YXRpYyBmbG9hdCBOMTE5WzNdID0gey0wLjg3OTI1NyAsLTAuNDQxODUxICwwLjE3Nzk3M307CitzdGF0aWMgZmxvYXQgTjEyMFszXSA9IHswLjY0MjMyNyAsMC42MTE5MDEgLDAuNDYxNTEyfTsKK3N0YXRpYyBmbG9hdCBOMTIxWzNdID0gezAuOTY0ODE3ICwtMC4yMDIzMjIgLDAuMTY3OTEwfTsKK3N0YXRpYyBmbG9hdCBOMTIyWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IFAwMDFbM10gPSB7NS42OCwgLTMwMC45NSwgMTMyNC43MH07CitzdGF0aWMgZmxvYXQgUDAwMlszXSA9IHszMzguNjksIC0yMTkuNjMsIDk2NzcuMDN9Oworc3RhdGljIGZsb2F0IFAwMDNbM10gPSB7MTIuMTgsIDQ3NC41OSwgOTEzOC4xNH07CitzdGF0aWMgZmxvYXQgUDAwNVszXSA9IHs0ODcuNTEsIDE5OC4wNSwgOTM1MC43OH07CitzdGF0aWMgZmxvYXQgUDAwNlszXSA9IHstNDU3LjYxLCA2OC43NCwgOTQyNy44NX07CitzdGF0aWMgZmxvYXQgUDAwN1szXSA9IHsxNTYuNTIsIC0yNjYuNzIsIDEwMzExLjY4fTsKK3N0YXRpYyBmbG9hdCBQMDA4WzNdID0gey0xODUuNTYsIC0yNjYuNTEsIDEwMzEwLjQ3fTsKK3N0YXRpYyBmbG9hdCBQMDA5WzNdID0gezEyNC4zOSwgLTI2MS40NiwgMTk0Mi4zNH07CitzdGF0aWMgZmxvYXQgUDAxMFszXSA9IHstMTMwLjA1LCAtMjYxLjQ2LCAxOTQ2LjAzfTsKK3N0YXRpYyBmbG9hdCBQMDExWzNdID0gezE0MS4wNywgLTMyMC4xMSwgMTIzOS4zOH07CitzdGF0aWMgZmxvYXQgUDAxMlszXSA9IHsxNTYuNDgsIC0zNjAuMTIsIDIwNzMuNDF9Oworc3RhdGljIGZsb2F0IFAwMTNbM10gPSB7MTYyLjAwLCAtMTc1Ljg4LCAyMDY0LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDE0WzNdID0gezg4LjE2LCAtODcuNzIsIDIwNjQuMDJ9Oworc3RhdGljIGZsb2F0IFAwMTVbM10gPSB7LTY1LjIxLCAtOTYuMTMsIDIwNjQuMDJ9Oworc3RhdGljIGZsb2F0IFAwMTZbM10gPSB7LTE1Ni40OCwgLTE4MC45NiwgMjA2NC40NH07CitzdGF0aWMgZmxvYXQgUDAxN1szXSA9IHstMTYyLjAwLCAtMzY4LjkzLCAyMDgyLjM5fTsKK3N0YXRpYyBmbG9hdCBQMDE4WzNdID0gey04OC4xNiwgLTQzOS4yMiwgMjA4Mi4zOX07CitzdGF0aWMgZmxvYXQgUDAxOVszXSA9IHs2NS4yMSwgLTQ0MC4zMiwgMjA4My4zOX07CitzdGF0aWMgZmxvYXQgUDAyMFszXSA9IHsyNDYuODcsIC0zNTYuMDIsIDI1NzYuOTV9Oworc3RhdGljIGZsb2F0IFAwMjFbM10gPSB7MjUzLjE3LCAtMTExLjE1LCAyNTY3LjE1fTsKK3N0YXRpYyBmbG9hdCBQMDIyWzNdID0gezEzMi4zNCwgNTEuNDEsIDI1NTkuODR9Oworc3RhdGljIGZsb2F0IFAwMjNbM10gPSB7LTk3Ljg4LCA0MC40NCwgMjU2Ny4xNX07CitzdGF0aWMgZmxvYXQgUDAyNFszXSA9IHstMjIyLjk3LCAtMTE3LjQ5LCAyNTY3LjE1fTsKK3N0YXRpYyBmbG9hdCBQMDI1WzNdID0gey0yNTIuMjIsIC0zNzEuNTMsIDI1NjkuOTJ9Oworc3RhdGljIGZsb2F0IFAwMjZbM10gPSB7LTEwOC40NCwgLTUxOC4xOSwgMjU4Ni43NX07CitzdGF0aWMgZmxvYXQgUDAyN1szXSA9IHs5Ny44OCwgLTUyNC43OSwgMjU4Ni43NX07CitzdGF0aWMgZmxvYXQgUDAyOFszXSA9IHszNzAuMDMsIC00MjEuMTksIDM0MTkuNzB9Oworc3RhdGljIGZsb2F0IFAwMjlbM10gPSB7MzUxLjE1LCAtMTYuOTgsIDM0MjMuMTd9Oworc3RhdGljIGZsb2F0IFAwMzBbM10gPSB7MjAwLjY2LCAyNDguNDYsIDM0MzAuMzd9Oworc3RhdGljIGZsb2F0IFAwMzFbM10gPSB7LTE0OC40MiwgMjM1LjAyLCAzNDE3LjkxfTsKK3N0YXRpYyBmbG9hdCBQMDMyWzNdID0gey0zNjAuMjEsIC0zMC4yNywgMzQxNi44NH07CitzdGF0aWMgZmxvYXQgUDAzM1szXSA9IHstMzU3LjkwLCAtNDE0Ljg5LCAzNDA3LjA0fTsKK3N0YXRpYyBmbG9hdCBQMDM0WzNdID0gey0xNDguODgsIC02MzEuMzUsIDM0MDkuOTB9Oworc3RhdGljIGZsb2F0IFAwMzVbM10gPSB7MTU2LjM4LCAtNjMyLjU5LCAzNDE5LjcwfTsKK3N0YXRpYyBmbG9hdCBQMDM2WzNdID0gezQ2Mi42MSwgLTQ2OS4yMSwgNDQzMS41MX07CitzdGF0aWMgZmxvYXQgUDAzN1szXSA9IHs0NjYuNjAsIDEwMi4yNSwgNDQzNC45OH07CitzdGF0aWMgZmxvYXQgUDAzOFszXSA9IHsyNDMuMDUsIDQ3NC4zNCwgNDU2Mi4wMn07CitzdGF0aWMgZmxvYXQgUDAzOVszXSA9IHstMTkxLjIzLCA0NzQuNDAsIDQ1NTQuNDJ9Oworc3RhdGljIGZsb2F0IFAwNDBbM10gPSB7LTQ3Ni4xMiwgMTExLjA1LCA0NDUxLjExfTsKK3N0YXRpYyBmbG9hdCBQMDQxWzNdID0gey00NzMuMzYsIC00NzAuNzQsIDQ0NDQuNzh9Oworc3RhdGljIGZsb2F0IFAwNDJbM10gPSB7LTI2Ni45NSwgLTc0OC40MSwgNDQ0Ny43OH07CitzdGF0aWMgZmxvYXQgUDA0M1szXSA9IHsyMTEuMTQsIC03NDkuOTEsIDQ0MjkuNzN9Oworc3RhdGljIGZsb2F0IFAwNDRbM10gPSB7NjgwLjU3LCAtMzcwLjI3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDQ1WzNdID0gezgzNC4wMSwgMzYzLjA5LCA2MzYwLjYzfTsKK3N0YXRpYyBmbG9hdCBQMDQ2WzNdID0gezM3MS4yOSwgODA0LjUxLCA2NDg2LjI2fTsKK3N0YXRpYyBmbG9hdCBQMDQ3WzNdID0gey0yOTEuNDMsIDc5Ny4yMiwgNjQ5NC4yOH07CitzdGF0aWMgZmxvYXQgUDA0OFszXSA9IHstNzg0LjEzLCAzNzAuNzUsIDYzNzguMDF9Oworc3RhdGljIGZsb2F0IFAwNDlbM10gPSB7LTc0My4yOSwgLTMyNS44MiwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgUDA1MFszXSA9IHstMzgzLjI0LCAtODA0Ljc3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDUxWzNdID0gezI4My40NywgLTg0Ni4wOSwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwMDFbM10gPSB7NS42OCwgLTMwMC45NSwgMTMyNC43MH07CitzdGF0aWMgZmxvYXQgaVAwMDlbM10gPSB7MTI0LjM5LCAtMjYxLjQ2LCAxOTQyLjM0fTsKK3N0YXRpYyBmbG9hdCBpUDAxMFszXSA9IHstMTMwLjA1LCAtMjYxLjQ2LCAxOTQ2LjAzfTsKK3N0YXRpYyBmbG9hdCBpUDAxMVszXSA9IHsxNDEuMDcsIC0zMjAuMTEsIDEyMzkuMzh9Oworc3RhdGljIGZsb2F0IGlQMDEyWzNdID0gezE1Ni40OCwgLTM2MC4xMiwgMjA3My40MX07CitzdGF0aWMgZmxvYXQgaVAwMTNbM10gPSB7MTYyLjAwLCAtMTc1Ljg4LCAyMDY0LjQ0fTsKK3N0YXRpYyBmbG9hdCBpUDAxNFszXSA9IHs4OC4xNiwgLTg3LjcyLCAyMDY0LjAyfTsKK3N0YXRpYyBmbG9hdCBpUDAxNVszXSA9IHstNjUuMjEsIC05Ni4xMywgMjA2NC4wMn07CitzdGF0aWMgZmxvYXQgaVAwMTZbM10gPSB7LTE1Ni40OCwgLTE4MC45NiwgMjA2NC40NH07CitzdGF0aWMgZmxvYXQgaVAwMTdbM10gPSB7LTE2Mi4wMCwgLTM2OC45MywgMjA4Mi4zOX07CitzdGF0aWMgZmxvYXQgaVAwMThbM10gPSB7LTg4LjE2LCAtNDM5LjIyLCAyMDgyLjM5fTsKK3N0YXRpYyBmbG9hdCBpUDAxOVszXSA9IHs2NS4yMSwgLTQ0MC4zMiwgMjA4My4zOX07CitzdGF0aWMgZmxvYXQgaVAwMjBbM10gPSB7MjQ2Ljg3LCAtMzU2LjAyLCAyNTc2Ljk1fTsKK3N0YXRpYyBmbG9hdCBpUDAyMVszXSA9IHsyNTMuMTcsIC0xMTEuMTUsIDI1NjcuMTV9Oworc3RhdGljIGZsb2F0IGlQMDIyWzNdID0gezEzMi4zNCwgNTEuNDEsIDI1NTkuODR9Oworc3RhdGljIGZsb2F0IGlQMDIzWzNdID0gey05Ny44OCwgNDAuNDQsIDI1NjcuMTV9Oworc3RhdGljIGZsb2F0IGlQMDI0WzNdID0gey0yMjIuOTcsIC0xMTcuNDksIDI1NjcuMTV9Oworc3RhdGljIGZsb2F0IGlQMDI1WzNdID0gey0yNTIuMjIsIC0zNzEuNTMsIDI1NjkuOTJ9Oworc3RhdGljIGZsb2F0IGlQMDI2WzNdID0gey0xMDguNDQsIC01MTguMTksIDI1ODYuNzV9Oworc3RhdGljIGZsb2F0IGlQMDI3WzNdID0gezk3Ljg4LCAtNTI0Ljc5LCAyNTg2Ljc1fTsKK3N0YXRpYyBmbG9hdCBpUDAyOFszXSA9IHszNzAuMDMsIC00MjEuMTksIDM0MTkuNzB9Oworc3RhdGljIGZsb2F0IGlQMDI5WzNdID0gezM1MS4xNSwgLTE2Ljk4LCAzNDIzLjE3fTsKK3N0YXRpYyBmbG9hdCBpUDAzMFszXSA9IHsyMDAuNjYsIDI0OC40NiwgMzQzMC4zN307CitzdGF0aWMgZmxvYXQgaVAwMzFbM10gPSB7LTE0OC40MiwgMjM1LjAyLCAzNDE3LjkxfTsKK3N0YXRpYyBmbG9hdCBpUDAzMlszXSA9IHstMzYwLjIxLCAtMzAuMjcsIDM0MTYuODR9Oworc3RhdGljIGZsb2F0IGlQMDMzWzNdID0gey0zNTcuOTAsIC00MTQuODksIDM0MDcuMDR9Oworc3RhdGljIGZsb2F0IGlQMDM0WzNdID0gey0xNDguODgsIC02MzEuMzUsIDM0MDkuOTB9Oworc3RhdGljIGZsb2F0IGlQMDM1WzNdID0gezE1Ni4zOCwgLTYzMi41OSwgMzQxOS43MH07CitzdGF0aWMgZmxvYXQgaVAwMzZbM10gPSB7NDYyLjYxLCAtNDY5LjIxLCA0NDMxLjUxfTsKK3N0YXRpYyBmbG9hdCBpUDAzN1szXSA9IHs0NjYuNjAsIDEwMi4yNSwgNDQzNC45OH07CitzdGF0aWMgZmxvYXQgaVAwMzhbM10gPSB7MjQzLjA1LCA0NzQuMzQsIDQ1NjIuMDJ9Oworc3RhdGljIGZsb2F0IGlQMDM5WzNdID0gey0xOTEuMjMsIDQ3NC40MCwgNDU1NC40Mn07CitzdGF0aWMgZmxvYXQgaVAwNDBbM10gPSB7LTQ3Ni4xMiwgMTExLjA1LCA0NDUxLjExfTsKK3N0YXRpYyBmbG9hdCBpUDA0MVszXSA9IHstNDczLjM2LCAtNDcwLjc0LCA0NDQ0Ljc4fTsKK3N0YXRpYyBmbG9hdCBpUDA0MlszXSA9IHstMjY2Ljk1LCAtNzQ4LjQxLCA0NDQ3Ljc4fTsKK3N0YXRpYyBmbG9hdCBpUDA0M1szXSA9IHsyMTEuMTQsIC03NDkuOTEsIDQ0MjkuNzN9Oworc3RhdGljIGZsb2F0IGlQMDQ0WzNdID0gezY4MC41NywgLTM3MC4yNywgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNDVbM10gPSB7ODM0LjAxLCAzNjMuMDksIDYzNjAuNjN9Oworc3RhdGljIGZsb2F0IGlQMDQ2WzNdID0gezM3MS4yOSwgODA0LjUxLCA2NDg2LjI2fTsKK3N0YXRpYyBmbG9hdCBpUDA0N1szXSA9IHstMjkxLjQzLCA3OTcuMjIsIDY0OTQuMjh9Oworc3RhdGljIGZsb2F0IGlQMDQ4WzNdID0gey03ODQuMTMsIDM3MC43NSwgNjM3OC4wMX07CitzdGF0aWMgZmxvYXQgaVAwNDlbM10gPSB7LTc0My4yOSwgLTMyNS44MiwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNTBbM10gPSB7LTM4My4yNCwgLTgwNC43NywgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNTFbM10gPSB7MjgzLjQ3LCAtODQ2LjA5LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDUyWzNdID0gezU5OS4wOSwgLTMwMC4xNSwgNzg5NC4wM307CitzdGF0aWMgZmxvYXQgUDA1M1szXSA9IHs3MzUuNDgsIDMwNi4yNiwgNzkxMS45Mn07CitzdGF0aWMgZmxvYXQgUDA1NFszXSA9IHsyNDYuMjIsIDU1OC41MywgODQ2MC41MH07CitzdGF0aWMgZmxvYXQgUDA1NVszXSA9IHstMjMwLjQxLCA1NTkuODQsIDg0NzMuMjN9Oworc3RhdGljIGZsb2F0IFAwNTZbM10gPSB7LTY5OC42NiwgMzIwLjgzLCA3OTAyLjU5fTsKK3N0YXRpYyBmbG9hdCBQMDU3WzNdID0gey02NDMuMjksIC0yOTkuMTYsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNThbM10gPSB7LTM0MS40NywgLTcxOS4zMCwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1OVszXSA9IHsyNTIuNTcsIC03NTYuMTIsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNjBbM10gPSB7NDU4LjM5LCAtMjY1LjMxLCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDYyWzNdID0gezIyNC4wNCwgMzM4Ljc1LCA5NDUwLjMwfTsKK3N0YXRpYyBmbG9hdCBQMDYzWzNdID0gey0xNjUuNzEsIDM0MS4wNCwgOTQ2Mi4zNX07CitzdGF0aWMgZmxvYXQgUDA2NFszXSA9IHstMjk4LjExLCAxMTAuMTMsIDEwMTgwLjM3fTsKK3N0YXRpYyBmbG9hdCBQMDY1WzNdID0gey00NzMuOTksIC0yMTkuNzEsIDkzNTUuNDR9Oworc3RhdGljIGZsb2F0IFAwNjZbM10gPSB7LTIxMS45NywgLTQ3OS44NywgOTM1NS40NH07CitzdGF0aWMgZmxvYXQgUDA2N1szXSA9IHsxOTIuODYsIC00OTEuNDUsIDkzNDguNzN9Oworc3RhdGljIGZsb2F0IFAwNjhbM10gPSB7LTEzNi4yOSwgLTMxOS44NCwgMTIyOC43M307CitzdGF0aWMgZmxvYXQgUDA2OVszXSA9IHsxMTExLjE3LCAtMzE0LjE0LCAxMzE0LjE5fTsKK3N0YXRpYyBmbG9hdCBQMDcwWzNdID0gey0xMTY3LjM0LCAtMzIxLjYxLCAxMzE5LjQ1fTsKK3N0YXRpYyBmbG9hdCBQMDcxWzNdID0gezE0MDQuODYsIC0zMDYuNjYsIDEyMzUuNDV9Oworc3RhdGljIGZsb2F0IFAwNzJbM10gPSB7LTE0MDkuNzMsIC0zMTQuMTQsIDEyNDcuNjZ9Oworc3RhdGljIGZsb2F0IFAwNzNbM10gPSB7MTI1NC4wMSwgLTI5Ni44NywgMTU0NC41OH07CitzdGF0aWMgZmxvYXQgUDA3NFszXSA9IHstMTI2Mi4wOSwgLTI5MS43MCwgMTUwNC4yNn07CitzdGF0aWMgZmxvYXQgUDA3NVszXSA9IHs5NjUuNzEsIC0yNjkuMjYsIDE3NDIuNjV9Oworc3RhdGljIGZsb2F0IFAwNzZbM10gPSB7LTkwMC45NywgLTI3Ni43NCwgMTcyNi4wN307CitzdGF0aWMgZmxvYXQgaVAwNjhbM10gPSB7LTEzNi4yOSwgLTMxOS44NCwgMTIyOC43M307CitzdGF0aWMgZmxvYXQgaVAwNjlbM10gPSB7MTExMS4xNywgLTMxNC4xNCwgMTMxNC4xOX07CitzdGF0aWMgZmxvYXQgaVAwNzBbM10gPSB7LTExNjcuMzQsIC0zMjEuNjEsIDEzMTkuNDV9Oworc3RhdGljIGZsb2F0IGlQMDcxWzNdID0gezE0MDQuODYsIC0zMDYuNjYsIDEyMzUuNDV9Oworc3RhdGljIGZsb2F0IGlQMDcyWzNdID0gey0xNDA5LjczLCAtMzE0LjE0LCAxMjQ3LjY2fTsKK3N0YXRpYyBmbG9hdCBpUDA3M1szXSA9IHsxMjU0LjAxLCAtMjk2Ljg3LCAxNTQ0LjU4fTsKK3N0YXRpYyBmbG9hdCBpUDA3NFszXSA9IHstMTI2Mi4wOSwgLTI5MS43MCwgMTUwNC4yNn07CitzdGF0aWMgZmxvYXQgaVAwNzVbM10gPSB7OTY1LjcxLCAtMjY5LjI2LCAxNzQyLjY1fTsKK3N0YXRpYyBmbG9hdCBpUDA3NlszXSA9IHstOTAwLjk3LCAtMjc2Ljc0LCAxNzI2LjA3fTsKK3N0YXRpYyBmbG9hdCBQMDc3WzNdID0gezEwNTguMDAsIC00NDguODEsIDgxOTQuNjZ9Oworc3RhdGljIGZsb2F0IFAwNzhbM10gPSB7LTEwMTYuNTEsIC00NTYuNDMsIDgxOTAuNjJ9Oworc3RhdGljIGZsb2F0IFAwNzlbM10gPSB7LTE1MTUuOTYsIC02NzYuNDUsIDc3NTQuOTN9Oworc3RhdGljIGZsb2F0IFAwODBbM10gPSB7MTg1Ni43NSwgLTgzMC4zNCwgNzI5Ni41Nn07CitzdGF0aWMgZmxvYXQgUDA4MVszXSA9IHsxNDcyLjE2LCAtNDk3LjM4LCA3Mzk5LjY4fTsKK3N0YXRpYyBmbG9hdCBQMDgyWzNdID0gey0xNzc1LjI2LCAtODI5LjUxLCA3Mjk4LjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDgzWzNdID0gezkxMS4wOSwgLTI1Mi41MSwgNzUxMC45OX07CitzdGF0aWMgZmxvYXQgUDA4NFszXSA9IHstMTQ1MS45NCwgLTQ5NS42MiwgNzM4NC4zMH07CitzdGF0aWMgZmxvYXQgUDA4NVszXSA9IHsxNTk4Ljc1LCAtNjY5LjI2LCA3NzY5LjkwfTsKK3N0YXRpYyBmbG9hdCBQMDg2WzNdID0gey04MzYuNTMsIC0yNTAuMDgsIDc0NjMuMjV9Oworc3RhdGljIGZsb2F0IFAwODdbM10gPSB7NzIyLjg3LCAtMTU4LjE4LCA4MDA2LjQxfTsKK3N0YXRpYyBmbG9hdCBQMDg4WzNdID0gey02ODguODYsIC0xNjIuMjgsIDc5OTMuODl9Oworc3RhdGljIGZsb2F0IFAwODlbM10gPSB7LTYyNi45MiwgLTE4NS4zMCwgODM2NC45OH07CitzdGF0aWMgZmxvYXQgUDA5MFszXSA9IHs2NDcuNzIsIC0xODkuNDYsIDgzNTQuOTl9Oworc3RhdGljIGZsb2F0IFAwOTFbM10gPSB7MC4wMCwgODM1LjAxLCA1NTU1LjYyfTsKK3N0YXRpYyBmbG9hdCBQMDkyWzNdID0gezAuMDAsIDEzNTAuMTgsIDUyMjAuODZ9Oworc3RhdGljIGZsb2F0IFAwOTNbM10gPSB7MC4wMCwgMTQyMi45NCwgNTI4NS4yN307CitzdGF0aWMgZmxvYXQgUDA5NFszXSA9IHswLjAwLCAxMjk2Ljc1LCA1NjUwLjE5fTsKK3N0YXRpYyBmbG9hdCBQMDk1WzNdID0gezAuMDAsIDc5NS42MywgNjQ5My44OH07CitzdGF0aWMgZmxvYXQgaVAwOTFbM10gPSB7MC4wMCwgODM1LjAxLCA1NTU1LjYyfTsKK3N0YXRpYyBmbG9hdCBpUDA5MlszXSA9IHswLjAwLCAxMzUwLjE4LCA1MjIwLjg2fTsKK3N0YXRpYyBmbG9hdCBpUDA5M1szXSA9IHswLjAwLCAxNDIyLjk0LCA1Mjg1LjI3fTsKK3N0YXRpYyBmbG9hdCBpUDA5NFszXSA9IHswLjAwLCAxMjk2Ljc1LCA1NjUwLjE5fTsKK3N0YXRpYyBmbG9hdCBpUDA5NVszXSA9IHswLjAwLCA3OTUuNjMsIDY0OTMuODh9Oworc3RhdGljIGZsb2F0IFAwOTdbM10gPSB7LTE5NC45MSwgLTM1Ny4xNCwgMTAzMTMuMzJ9Oworc3RhdGljIGZsb2F0IFAwOThbM10gPSB7MTM1LjM1LCAtMzU3LjY2LCAxMDMwNy45NH07CitzdGF0aWMgZmxvYXQgaVAwOTdbM10gPSB7LTE5NC45MSwgLTM1Ny4xNCwgMTAzMTMuMzJ9Oworc3RhdGljIGZsb2F0IGlQMDk4WzNdID0gezEzNS4zNSwgLTM1Ny42NiwgMTAzMDcuOTR9Oworc3RhdGljIGZsb2F0IFAwOTlbM10gPSB7LTM4MC41MywgLTIyMS4xNCwgOTY3Ny45OH07CitzdGF0aWMgZmxvYXQgUDEwMFszXSA9IHswLjAwLCA0MTIuOTksIDk2MjkuMzN9Oworc3RhdGljIGZsb2F0IFAxMDJbM10gPSB7NTkuNTEsIC00MTIuNTUsIDEwNjc3LjU4fTsKK3N0YXRpYyBmbG9hdCBpUDEwMlszXSA9IHs1OS41MSwgLTQxMi41NSwgMTA2NzcuNTh9Oworc3RhdGljIGZsb2F0IFAxMDNbM10gPSB7Ni41MCwgNDg0Ljc0LCA5MDA5Ljk0fTsKK3N0YXRpYyBmbG9hdCBQMTA1WzNdID0gey00MS44NiwgNDc2LjUxLCA5MDc4LjE3fTsKK3N0YXRpYyBmbG9hdCBQMTA4WzNdID0gezQ5LjIwLCA0NzYuODMsIDkwNzguMjR9Oworc3RhdGljIGZsb2F0IFAxMTBbM10gPSB7LTE4Ny42MiwgLTQxMC4wNCwgMTA2NzQuMTJ9Oworc3RhdGljIGZsb2F0IGlQMTEwWzNdID0gey0xODcuNjIsIC00MTAuMDQsIDEwNjc0LjEyfTsKK3N0YXRpYyBmbG9hdCBQMTExWzNdID0gey0xODQuMjUsIC0zMTguNzAsIDEwNzIzLjg4fTsKK3N0YXRpYyBmbG9hdCBpUDExMVszXSA9IHstMTg0LjI1LCAtMzE4LjcwLCAxMDcyMy44OH07CitzdGF0aWMgZmxvYXQgUDExMlszXSA9IHstMTc5LjYxLCAtMTQyLjgxLCAxMDY3MC4yNn07CitzdGF0aWMgZmxvYXQgUDExM1szXSA9IHs1Ny40MywgLTE0Ny45NCwgMTA2NzUuMjZ9Oworc3RhdGljIGZsb2F0IFAxMTRbM10gPSB7NTQuMDYsIC0yMTguOTAsIDEwNzEyLjQ0fTsKK3N0YXRpYyBmbG9hdCBQMTE1WzNdID0gey0xODYuMzUsIC0yMTIuMDksIDEwNzEzLjc2fTsKK3N0YXRpYyBmbG9hdCBQMTE2WzNdID0gezIwNS45MCwgLTg0LjYxLCAxMDI3NS45N307CitzdGF0aWMgZmxvYXQgUDExN1szXSA9IHstMjMwLjk2LCAtODMuMjYsIDEwMjgwLjA5fTsKK3N0YXRpYyBmbG9hdCBpUDExOFszXSA9IHsyMTYuNzgsIC01MDkuMTcsIDEwMDk4Ljk0fTsKK3N0YXRpYyBmbG9hdCBpUDExOVszXSA9IHstMzEzLjIxLCAtNTEwLjc5LCAxMDEwMi42Mn07CitzdGF0aWMgZmxvYXQgUDExOFszXSA9IHsyMTYuNzgsIC01MDkuMTcsIDEwMDk4Ljk0fTsKK3N0YXRpYyBmbG9hdCBQMTE5WzNdID0gey0zMTMuMjEsIC01MTAuNzksIDEwMTAyLjYyfTsKK3N0YXRpYyBmbG9hdCBQMTIwWzNdID0gezIxNy45NSwgOTYuMzQsIDEwMTYxLjYyfTsKK3N0YXRpYyBmbG9hdCBQMTIxWzNdID0gezcxLjk5LCAtMzE5Ljc0LCAxMDcxNy43MH07CitzdGF0aWMgZmxvYXQgaVAxMjFbM10gPSB7NzEuOTksIC0zMTkuNzQsIDEwNzE3LjcwfTsKK3N0YXRpYyBmbG9hdCBQMTIyWzNdID0gezAuMDAsIDYwMi43NCwgNTM3NS44NH07CitzdGF0aWMgZmxvYXQgaVAxMjJbM10gPSB7MC4wMCwgNjAyLjc0LCA1Mzc1Ljg0fTsKK3N0YXRpYyBmbG9hdCBQMTIzWzNdID0gey00NDguOTQsIC0yMDMuMTQsIDk0OTkuNjB9Oworc3RhdGljIGZsb2F0IFAxMjRbM10gPSB7LTQ0Mi42NCwgLTE4NS4yMCwgOTUyOC4wN307CitzdGF0aWMgZmxvYXQgUDEyNVszXSA9IHstNDQxLjA3LCAtMTQ4LjA1LCA5NTI4LjA3fTsKK3N0YXRpYyBmbG9hdCBQMTI2WzNdID0gey00NDMuNDMsIC0xMjguODQsIDk0OTkuNjB9Oworc3RhdGljIGZsb2F0IFAxMjdbM10gPSB7LTQ1Ni44NywgLTE0Ni43OCwgOTQ2Ni42N307CitzdGF0aWMgZmxvYXQgUDEyOFszXSA9IHstNDUzLjY4LCAtMTgzLjkzLCA5NDY2LjY3fTsKK3N0YXRpYyBmbG9hdCBQMTI5WzNdID0gezQyOC40MywgLTEyNC4wOCwgOTUwMy4wM307CitzdGF0aWMgZmxvYXQgUDEzMFszXSA9IHs0MTkuNzMsIC0xNDIuMTQsIDk1MzQuNTZ9Oworc3RhdGljIGZsb2F0IFAxMzFbM10gPSB7NDE5LjkyLCAtMTc5Ljk2LCA5NTM0LjU2fTsKK3N0YXRpYyBmbG9hdCBQMTMyWzNdID0gezQzMS4yMCwgLTE5OS43MywgOTUwNS4yNn07CitzdGF0aWMgZmxvYXQgUDEzM1szXSA9IHs0NDIuMjgsIC0xODEuNjcsIDk0NzUuOTZ9Oworc3RhdGljIGZsb2F0IFAxMzRbM10gPSB7NDQyLjA4LCAtMTQzLjg0LCA5NDc1Ljk2fTsKKy8qICpJTkRFTlQtT04qICovCisKK3ZvaWQKK0RvbHBoaW4wMDEodm9pZCkKK3sKKyAgICBnbE5vcm1hbDNmdihOMDcxKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcyKTsKKyAgICBnbFZlcnRleDNmdihQMDc0KTsKKyAgICBnbEVuZCgpOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzQpOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDIodm9pZCkKK3sKKyAgICBnbE5vcm1hbDNmdihOMDcxKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDcxKTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDczKTsKKyAgICBnbEVuZCgpOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNzEpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDModm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDA0KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE3KTsKKyAgICBnbFZlcnRleDNmdihQMDE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAwNSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDYodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTIpOworICAgIGdsVmVydGV4M2Z2KFAwOTIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTMpOworICAgIGdsVmVydGV4M2Z2KFAwOTMpOworICAgIGdsTm9ybWFsM2Z2KE4wOTQpOworICAgIGdsVmVydGV4M2Z2KFAwOTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDkzKTsKKyAgICBnbFZlcnRleDNmdihQMDkzKTsKKyAgICBnbE5vcm1hbDNmdihOMDkyKTsKKyAgICBnbFZlcnRleDNmdihQMDkyKTsKKyAgICBnbE5vcm1hbDNmdihOMDk0KTsKKyAgICBnbFZlcnRleDNmdihQMDk0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA5MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTEpOworICAgIGdsVmVydGV4M2Z2KFAwOTEpOworICAgIGdsTm9ybWFsM2Z2KE4wOTIpOworICAgIGdsVmVydGV4M2Z2KFAwOTIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTQpOworICAgIGdsVmVydGV4M2Z2KFAwOTQpOworICAgIGdsTm9ybWFsM2Z2KE4wOTUpOworICAgIGdsVmVydGV4M2Z2KFAwOTUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTIyKTsKKyAgICBnbFZlcnRleDNmdihQMTIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDk1KTsKKyAgICBnbFZlcnRleDNmdihQMDk1KTsKKyAgICBnbE5vcm1hbDNmdihOMDkxKTsKKyAgICBnbFZlcnRleDNmdihQMDkxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjEyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMik7CisgICAgZ2xOb3JtYWwzZnYoTjA5MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAwNyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDM0KTsKKyAgICBnbFZlcnRleDNmdihQMDM0KTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMDgodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDA5KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wNTIpOworICAgIGdsVmVydGV4M2Z2KFAwNTIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDU3KTsKKyAgICBnbFZlcnRleDNmdihQMDU3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAxMCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODEpOworICAgIGdsVmVydGV4M2Z2KFAwODEpOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsTm9ybWFsM2Z2KE4wODcpOworICAgIGdsVmVydGV4M2Z2KFAwODcpOworICAgIGdsTm9ybWFsM2Z2KE4wOTApOworICAgIGdsVmVydGV4M2Z2KFAwOTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgxKTsKKyAgICBnbFZlcnRleDNmdihQMDgxKTsKKyAgICBnbE5vcm1hbDNmdihOMDgwKTsKKyAgICBnbFZlcnRleDNmdihQMDgwKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg3KTsKKyAgICBnbFZlcnRleDNmdihQMDg3KTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAxMSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wNzkpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsTm9ybWFsM2Z2KE4wODgpOworICAgIGdsVmVydGV4M2Z2KFAwODgpOworICAgIGdsTm9ybWFsM2Z2KE4wODkpOworICAgIGdsVmVydGV4M2Z2KFAwODkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg4KTsKKyAgICBnbFZlcnRleDNmdihQMDg4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDg5KTsKKyAgICBnbFZlcnRleDNmdihQMDg5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg0KTsKKyAgICBnbFZlcnRleDNmdihQMDg0KTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRG9scGhpbjAxMih2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTIpOworICAgIGdsVmVydGV4M2Z2KFAwNTIpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDU3KTsKKyAgICBnbFZlcnRleDNmdihQMDU3KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDEzKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE2KTsKKyAgICBnbFZlcnRleDNmdihQMTE2KTsKKyAgICBnbE5vcm1hbDNmdihOMTE3KTsKKyAgICBnbFZlcnRleDNmdihQMTE3KTsKKyAgICBnbE5vcm1hbDNmdihOMTEyKTsKKyAgICBnbFZlcnRleDNmdihQMTEyKTsKKyAgICBnbE5vcm1hbDNmdihOMTEzKTsKKyAgICBnbFZlcnRleDNmdihQMTEzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNCk7CisgICAgZ2xOb3JtYWwzZnYoTjExMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMyk7CisgICAgZ2xOb3JtYWwzZnYoTjExMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMik7CisgICAgZ2xOb3JtYWwzZnYoTjExNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTQpOworICAgIGdsVmVydGV4M2Z2KFAxMTQpOworICAgIGdsTm9ybWFsM2Z2KE4xMTYpOworICAgIGdsVmVydGV4M2Z2KFAxMTYpOworICAgIGdsTm9ybWFsM2Z2KE4xMTMpOworICAgIGdsVmVydGV4M2Z2KFAxMTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE0KTsKKyAgICBnbFZlcnRleDNmdihQMTE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDA3KTsKKyAgICBnbFZlcnRleDNmdihQMDA3KTsKKyAgICBnbE5vcm1hbDNmdihOMTE2KTsKKyAgICBnbFZlcnRleDNmdihQMTE2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjExNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDcpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDA3KTsKKyAgICBnbFZlcnRleDNmdihQMTE0KTsKKyAgICBnbFZlcnRleDNmdihQMTE1KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTcpOworICAgIGdsVmVydGV4M2Z2KFAxMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4xMTIpOworICAgIGdsVmVydGV4M2Z2KFAxMTIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTEyKTsKKyAgICBnbFZlcnRleDNmdihQMTEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbE5vcm1hbDNmdihOMTE1KTsKKyAgICBnbFZlcnRleDNmdihQMTE1KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDE0KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTExKTsKKyAgICBnbFZlcnRleDNmdihQMTExKTsKKyAgICBnbE5vcm1hbDNmdihOMTEwKTsKKyAgICBnbFZlcnRleDNmdihQMTEwKTsKKyAgICBnbE5vcm1hbDNmdihOMTAyKTsKKyAgICBnbFZlcnRleDNmdihQMTAyKTsKKyAgICBnbE5vcm1hbDNmdihOMTIxKTsKKyAgICBnbFZlcnRleDNmdihQMTIxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjExMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTcpOworICAgIGdsVmVydGV4M2Z2KFAwOTcpOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsTm9ybWFsM2Z2KE4xMTApOworICAgIGdsVmVydGV4M2Z2KFAxMTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbE5vcm1hbDNmdihOMDk5KTsKKyAgICBnbFZlcnRleDNmdihQMDk5KTsKKyAgICBnbE5vcm1hbDNmdihOMTE5KTsKKyAgICBnbFZlcnRleDNmdihQMTE5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjExOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMTExKTsKKyAgICBnbFZlcnRleDNmdihQMTIxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMTApOworICAgIGdsVmVydGV4M2Z2KFAxMTApOworICAgIGdsTm9ybWFsM2Z2KE4xMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsTm9ybWFsM2Z2KE4xMTgpOworICAgIGdsVmVydGV4M2Z2KFAxMTgpOworICAgIGdsTm9ybWFsM2Z2KE4xMDIpOworICAgIGdsVmVydGV4M2Z2KFAxMDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE5KTsKKyAgICBnbFZlcnRleDNmdihQMTE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbE5vcm1hbDNmdihOMTE4KTsKKyAgICBnbFZlcnRleDNmdihQMTE4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjcpOworICAgIGdsVmVydGV4M2Z2KFAwNjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4xMTgpOworICAgIGdsVmVydGV4M2Z2KFAxMTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTE4KTsKKyAgICBnbFZlcnRleDNmdihQMTE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDk4KTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjExOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExOCk7CisgICAgZ2xOb3JtYWwzZnYoTjA5OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OCk7CisgICAgZ2xOb3JtYWwzZnYoTjEwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMDIpOworICAgIGdsVmVydGV4M2Z2KFAxMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTgpOworICAgIGdsVmVydGV4M2Z2KFAwOTgpOworICAgIGdsTm9ybWFsM2Z2KE4xMjEpOworICAgIGdsVmVydGV4M2Z2KFAxMjEpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RvbHBoaW4wMTUodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NCk7CisgICAgZ2xOb3JtYWwzZnYoTjEyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wNjQpOworICAgIGdsVmVydGV4M2Z2KFAwNjQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY0KTsKKyAgICBnbFZlcnRleDNmdihQMDY0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjQpOworICAgIGdsVmVydGV4M2Z2KFAwNjQpOworICAgIGdsTm9ybWFsM2Z2KE4wOTkpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsTm9ybWFsM2Z2KE4xMTcpOworICAgIGdsVmVydGV4M2Z2KFAxMTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTIwKTsKKyAgICBnbFZlcnRleDNmdihQMTIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDY0KTsKKyAgICBnbFZlcnRleDNmdihQMDY0KTsKKyAgICBnbE5vcm1hbDNmdihOMTE3KTsKKyAgICBnbFZlcnRleDNmdihQMTE3KTsKKyAgICBnbE5vcm1hbDNmdihOMTE2KTsKKyAgICBnbFZlcnRleDNmdihQMTE2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4xMjApOworICAgIGdsVmVydGV4M2Z2KFAxMjApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMTIwKTsKKyAgICBnbFZlcnRleDNmdihQMTIwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjEyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4xMjApOworICAgIGdsVmVydGV4M2Z2KFAxMjApOworICAgIGdsTm9ybWFsM2Z2KE4xMTYpOworICAgIGdsVmVydGV4M2Z2KFAxMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitEb2xwaGluMDE2KHZvaWQpCit7CisKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMTIzKTsKKyAgICBnbFZlcnRleDNmdihQMTI0KTsKKyAgICBnbFZlcnRleDNmdihQMTI1KTsKKyAgICBnbFZlcnRleDNmdihQMTI2KTsKKyAgICBnbFZlcnRleDNmdihQMTI3KTsKKyAgICBnbFZlcnRleDNmdihQMTI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEzNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAxMDMpOworICAgIGdsVmVydGV4M2Z2KFAxMDUpOworICAgIGdsVmVydGV4M2Z2KFAxMDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Cit9CisKK3ZvaWQKK0RyYXdEb2xwaGluKGZpc2hSZWMgKiBmaXNoKQoreworICAgIGZsb2F0IHNlZzAsIHNlZzEsIHNlZzIsIHNlZzMsIHNlZzQsIHNlZzUsIHNlZzYsIHNlZzc7CisgICAgZmxvYXQgcGl0Y2gsIHRocmFzaCwgY2hvbXA7CisKKyAgICBmaXNoLT5odGFpbCA9IChpbnQpIChmaXNoLT5odGFpbCAtIChpbnQpICgxMC4wICogZmlzaC0+dikpICUgMzYwOworCisgICAgdGhyYXNoID0gNzAuMCAqIGZpc2gtPnY7CisKKyAgICBzZWcwID0gMS4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCkgKiBSUkFEKTsKKyAgICBzZWczID0gMS4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCkgKiBSUkFEKTsKKyAgICBzZWcxID0gMi4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDQuMCkgKiBSUkFEKTsKKyAgICBzZWcyID0gMy4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDYuMCkgKiBSUkFEKTsKKyAgICBzZWc0ID0gNC4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDEwLjApICogUlJBRCk7CisgICAgc2VnNSA9IDQuNSAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyAxNS4wKSAqIFJSQUQpOworICAgIHNlZzYgPSA1LjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgMjAuMCkgKiBSUkFEKTsKKyAgICBzZWc3ID0gNi4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDMwLjApICogUlJBRCk7CisKKyAgICBwaXRjaCA9IGZpc2gtPnYgKiBzaW4oKGZpc2gtPmh0YWlsICsgMTgwLjApICogUlJBRCk7CisKKyAgICBpZiAoZmlzaC0+diA+IDIuMCkgeworICAgICAgICBjaG9tcCA9IC0oZmlzaC0+diAtIDIuMCkgKiAyMDAuMDsKKyAgICB9CisgICAgY2hvbXAgPSAxMDAuMDsKKworICAgIFAwMTJbMV0gPSBpUDAxMlsxXSArIHNlZzU7CisgICAgUDAxM1sxXSA9IGlQMDEzWzFdICsgc2VnNTsKKyAgICBQMDE0WzFdID0gaVAwMTRbMV0gKyBzZWc1OworICAgIFAwMTVbMV0gPSBpUDAxNVsxXSArIHNlZzU7CisgICAgUDAxNlsxXSA9IGlQMDE2WzFdICsgc2VnNTsKKyAgICBQMDE3WzFdID0gaVAwMTdbMV0gKyBzZWc1OworICAgIFAwMThbMV0gPSBpUDAxOFsxXSArIHNlZzU7CisgICAgUDAxOVsxXSA9IGlQMDE5WzFdICsgc2VnNTsKKworICAgIFAwMjBbMV0gPSBpUDAyMFsxXSArIHNlZzQ7CisgICAgUDAyMVsxXSA9IGlQMDIxWzFdICsgc2VnNDsKKyAgICBQMDIyWzFdID0gaVAwMjJbMV0gKyBzZWc0OworICAgIFAwMjNbMV0gPSBpUDAyM1sxXSArIHNlZzQ7CisgICAgUDAyNFsxXSA9IGlQMDI0WzFdICsgc2VnNDsKKyAgICBQMDI1WzFdID0gaVAwMjVbMV0gKyBzZWc0OworICAgIFAwMjZbMV0gPSBpUDAyNlsxXSArIHNlZzQ7CisgICAgUDAyN1sxXSA9IGlQMDI3WzFdICsgc2VnNDsKKworICAgIFAwMjhbMV0gPSBpUDAyOFsxXSArIHNlZzI7CisgICAgUDAyOVsxXSA9IGlQMDI5WzFdICsgc2VnMjsKKyAgICBQMDMwWzFdID0gaVAwMzBbMV0gKyBzZWcyOworICAgIFAwMzFbMV0gPSBpUDAzMVsxXSArIHNlZzI7CisgICAgUDAzMlsxXSA9IGlQMDMyWzFdICsgc2VnMjsKKyAgICBQMDMzWzFdID0gaVAwMzNbMV0gKyBzZWcyOworICAgIFAwMzRbMV0gPSBpUDAzNFsxXSArIHNlZzI7CisgICAgUDAzNVsxXSA9IGlQMDM1WzFdICsgc2VnMjsKKworICAgIFAwMzZbMV0gPSBpUDAzNlsxXSArIHNlZzE7CisgICAgUDAzN1sxXSA9IGlQMDM3WzFdICsgc2VnMTsKKyAgICBQMDM4WzFdID0gaVAwMzhbMV0gKyBzZWcxOworICAgIFAwMzlbMV0gPSBpUDAzOVsxXSArIHNlZzE7CisgICAgUDA0MFsxXSA9IGlQMDQwWzFdICsgc2VnMTsKKyAgICBQMDQxWzFdID0gaVAwNDFbMV0gKyBzZWcxOworICAgIFAwNDJbMV0gPSBpUDA0MlsxXSArIHNlZzE7CisgICAgUDA0M1sxXSA9IGlQMDQzWzFdICsgc2VnMTsKKworICAgIFAwNDRbMV0gPSBpUDA0NFsxXSArIHNlZzA7CisgICAgUDA0NVsxXSA9IGlQMDQ1WzFdICsgc2VnMDsKKyAgICBQMDQ2WzFdID0gaVAwNDZbMV0gKyBzZWcwOworICAgIFAwNDdbMV0gPSBpUDA0N1sxXSArIHNlZzA7CisgICAgUDA0OFsxXSA9IGlQMDQ4WzFdICsgc2VnMDsKKyAgICBQMDQ5WzFdID0gaVAwNDlbMV0gKyBzZWcwOworICAgIFAwNTBbMV0gPSBpUDA1MFsxXSArIHNlZzA7CisgICAgUDA1MVsxXSA9IGlQMDUxWzFdICsgc2VnMDsKKworICAgIFAwMDlbMV0gPSBpUDAwOVsxXSArIHNlZzY7CisgICAgUDAxMFsxXSA9IGlQMDEwWzFdICsgc2VnNjsKKyAgICBQMDc1WzFdID0gaVAwNzVbMV0gKyBzZWc2OworICAgIFAwNzZbMV0gPSBpUDA3NlsxXSArIHNlZzY7CisKKyAgICBQMDAxWzFdID0gaVAwMDFbMV0gKyBzZWc3OworICAgIFAwMTFbMV0gPSBpUDAxMVsxXSArIHNlZzc7CisgICAgUDA2OFsxXSA9IGlQMDY4WzFdICsgc2VnNzsKKyAgICBQMDY5WzFdID0gaVAwNjlbMV0gKyBzZWc3OworICAgIFAwNzBbMV0gPSBpUDA3MFsxXSArIHNlZzc7CisgICAgUDA3MVsxXSA9IGlQMDcxWzFdICsgc2VnNzsKKyAgICBQMDcyWzFdID0gaVAwNzJbMV0gKyBzZWc3OworICAgIFAwNzNbMV0gPSBpUDA3M1sxXSArIHNlZzc7CisgICAgUDA3NFsxXSA9IGlQMDc0WzFdICsgc2VnNzsKKworICAgIFAwOTFbMV0gPSBpUDA5MVsxXSArIHNlZzM7CisgICAgUDA5MlsxXSA9IGlQMDkyWzFdICsgc2VnMzsKKyAgICBQMDkzWzFdID0gaVAwOTNbMV0gKyBzZWczOworICAgIFAwOTRbMV0gPSBpUDA5NFsxXSArIHNlZzM7CisgICAgUDA5NVsxXSA9IGlQMDk1WzFdICsgc2VnMzsKKyAgICBQMTIyWzFdID0gaVAxMjJbMV0gKyBzZWczICogMS41OworCisgICAgUDA5N1sxXSA9IGlQMDk3WzFdICsgY2hvbXA7CisgICAgUDA5OFsxXSA9IGlQMDk4WzFdICsgY2hvbXA7CisgICAgUDEwMlsxXSA9IGlQMTAyWzFdICsgY2hvbXA7CisgICAgUDExMFsxXSA9IGlQMTEwWzFdICsgY2hvbXA7CisgICAgUDExMVsxXSA9IGlQMTExWzFdICsgY2hvbXA7CisgICAgUDEyMVsxXSA9IGlQMTIxWzFdICsgY2hvbXA7CisgICAgUDExOFsxXSA9IGlQMTE4WzFdICsgY2hvbXA7CisgICAgUDExOVsxXSA9IGlQMTE5WzFdICsgY2hvbXA7CisKKyAgICBnbFB1c2hNYXRyaXgoKTsKKworICAgIGdsUm90YXRlZihwaXRjaCwgMS4wLCAwLjAsIDAuMCk7CisKKyAgICBnbFRyYW5zbGF0ZWYoMC4wLCAwLjAsIDcwMDAuMCk7CisKKyAgICBnbFJvdGF0ZWYoMTgwLjAsIDAuMCwgMS4wLCAwLjApOworCisgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBEb2xwaGluMDE0KCk7CisgICAgRG9scGhpbjAxMCgpOworICAgIERvbHBoaW4wMDkoKTsKKyAgICBEb2xwaGluMDEyKCk7CisgICAgRG9scGhpbjAxMygpOworICAgIERvbHBoaW4wMDYoKTsKKyAgICBEb2xwaGluMDAyKCk7CisgICAgRG9scGhpbjAwMSgpOworICAgIERvbHBoaW4wMDMoKTsKKyAgICBEb2xwaGluMDE1KCk7CisgICAgRG9scGhpbjAwNCgpOworICAgIERvbHBoaW4wMDUoKTsKKyAgICBEb2xwaGluMDA3KCk7CisgICAgRG9scGhpbjAwOCgpOworICAgIERvbHBoaW4wMTEoKTsKKyAgICBEb2xwaGluMDE2KCk7CisgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBnbFBvcE1hdHJpeCgpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9zaGFyay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy9zaGFyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODQ3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL3NoYXJrLmMKQEAgLTAsMCArMSwxMzA4IEBACisvKioKKyAqIChjKSBDb3B5cmlnaHQgMTk5MywgMTk5NCwgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQUxMIFJJR0hUUyBSRVNFUlZFRAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZQorICogYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKKyAqIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSEUgTUFURVJJQUwgRU1CT0RJRUQgT04gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBUTyBZT1UgIkFTLUlTIgorICogQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLAorICogSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCisgKiBHUkFQSElDUywgSU5DLiAgQkUgTElBQkxFIFRPIFlPVSBPUiBBTllPTkUgRUxTRSBGT1IgQU5ZIERJUkVDVCwKKyAqIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKKyAqIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sCisgKiBMT1NTIE9GIFBST0ZJVCwgTE9TUyBPRiBVU0UsIFNBVklOR1MgT1IgUkVWRU5VRSwgT1IgVEhFIENMQUlNUyBPRgorICogVEhJUkQgUEFSVElFUywgV0hFVEhFUiBPUiBOT1QgU0lMSUNPTiBHUkFQSElDUywgSU5DLiAgSEFTIEJFRU4KKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggTE9TUywgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogUE9TU0VTU0lPTiwgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cworICogVXNlLCBkdXBsaWNhdGlvbiwgb3IgZGlzY2xvc3VyZSBieSB0aGUgR292ZXJubWVudCBpcyBzdWJqZWN0IHRvCisgKiByZXN0cmljdGlvbnMgc2V0IGZvcnRoIGluIEZBUiA1Mi4yMjcuMTkoYykoMikgb3Igc3VicGFyYWdyYXBoCisgKiAoYykoMSkoaWkpIG9mIHRoZSBSaWdodHMgaW4gVGVjaG5pY2FsIERhdGEgYW5kIENvbXB1dGVyIFNvZnR3YXJlCisgKiBjbGF1c2UgYXQgREZBUlMgMjUyLjIyNy03MDEzIGFuZC9vciBpbiBzaW1pbGFyIG9yIHN1Y2Nlc3NvcgorICogY2xhdXNlcyBpbiB0aGUgRkFSIG9yIHRoZSBET0Qgb3IgTkFTQSBGQVIgU3VwcGxlbWVudC4KKyAqIFVucHVibGlzaGVkLS0gcmlnaHRzIHJlc2VydmVkIHVuZGVyIHRoZSBjb3B5cmlnaHQgbGF3cyBvZiB0aGUKKyAqIFVuaXRlZCBTdGF0ZXMuICBDb250cmFjdG9yL21hbnVmYWN0dXJlciBpcyBTaWxpY29uIEdyYXBoaWNzLAorICogSW5jLiwgMjAxMSBOLiAgU2hvcmVsaW5lIEJsdmQuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDAzOS03MzExLgorICoKKyAqIE9wZW5HTChUTSkgaXMgYSB0cmFkZW1hcmsgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImF0bGFudGlzLmgiCisvKiAqSU5ERU5ULU9GRiogKi8KK3N0YXRpYyBmbG9hdCBOMDAyWzNdID0gezAuMDAwMDc3ICwtMC4wMjA2MTEgLDAuOTk5Nzg4fTsKK3N0YXRpYyBmbG9hdCBOMDAzWzNdID0gezAuOTYxNDI1ICwwLjI1ODcyOSAsLTAuMDkzMzkwfTsKK3N0YXRpYyBmbG9hdCBOMDA0WzNdID0gezAuNTEwODExICwtMC43Njk2MzMgLC0wLjM4MzA2M307CitzdGF0aWMgZmxvYXQgTjAwNVszXSA9IHswLjQwMDEyMyAsMC44NTU3MzQgLC0wLjMyODA1NX07CitzdGF0aWMgZmxvYXQgTjAwNlszXSA9IHstMC43NzA3MTUgLDAuNjEwMjA0ICwtMC4xODM0NDB9Oworc3RhdGljIGZsb2F0IE4wMDdbM10gPSB7LTAuOTE1NTk3ICwtMC4zNzMzNDUgLC0wLjE0OTMxNn07CitzdGF0aWMgZmxvYXQgTjAwOFszXSA9IHstMC45NzI3ODggLDAuMjA4OTIxICwtMC4xMDAxNzl9Oworc3RhdGljIGZsb2F0IE4wMDlbM10gPSB7LTAuOTM5NzEzICwtMC4zMTIyNjggLC0wLjEzOTM4M307CitzdGF0aWMgZmxvYXQgTjAxMFszXSA9IHstMC42MjQxMzggLC0wLjc0MTA0NyAsLTAuMjQ3NTg5fTsKK3N0YXRpYyBmbG9hdCBOMDExWzNdID0gezAuNTkxNDM0ICwtMC43Njg0MDEgLC0wLjI0NDQ3MX07CitzdGF0aWMgZmxvYXQgTjAxMlszXSA9IHswLjkzNTE1MiAsLTAuMzI4NDk1ICwtMC4xMzI1OTh9Oworc3RhdGljIGZsb2F0IE4wMTNbM10gPSB7MC45OTcxMDIgLDAuMDc0MjQzICwtMC4wMTY1OTN9Oworc3RhdGljIGZsb2F0IE4wMTRbM10gPSB7MC45Njk5OTUgLDAuMjQxNzEyICwtMC4wMjYxODZ9Oworc3RhdGljIGZsb2F0IE4wMTVbM10gPSB7MC44NDQ1MzkgLDAuNTAyNjI4ICwtMC4xODQ3MTR9Oworc3RhdGljIGZsb2F0IE4wMTZbM10gPSB7LTAuOTA2NjA4ICwwLjM4NjMwOCAsLTAuMTY5Nzg3fTsKK3N0YXRpYyBmbG9hdCBOMDE3WzNdID0gey0wLjk3MDAxNiAsMC4yNDE2OTggLC0wLjAyNTUxNn07CitzdGF0aWMgZmxvYXQgTjAxOFszXSA9IHstMC45OTg2NTIgLDAuMDUwNDkzICwtMC4wMTIwNDV9Oworc3RhdGljIGZsb2F0IE4wMTlbM10gPSB7LTAuOTQyNjg1ICwtMC4zMzMwNTEgLC0wLjAyMDU1Nn07CitzdGF0aWMgZmxvYXQgTjAyMFszXSA9IHstMC42NjA5NDQgLC0wLjc1MDI3NiAsMC4wMTU0ODB9Oworc3RhdGljIGZsb2F0IE4wMjFbM10gPSB7MC41MDM1NDkgLC0wLjg2MjkwOCAsLTAuMDQyNzQ5fTsKK3N0YXRpYyBmbG9hdCBOMDIyWzNdID0gezAuOTUzMjAyICwtMC4zMDIwOTIgLC0wLjAxMjA4OX07CitzdGF0aWMgZmxvYXQgTjAyM1szXSA9IHswLjk5ODczOCAsMC4wMjM1NzQgLDAuMDQ0MzQ0fTsKK3N0YXRpYyBmbG9hdCBOMDI0WzNdID0gezAuOTc5Mjk3ICwwLjE5MzI3MiAsMC4wNjAyMDJ9Oworc3RhdGljIGZsb2F0IE4wMjVbM10gPSB7MC43OTgzMDAgLDAuNDY0ODg1ICwwLjM4Mjg4M307CitzdGF0aWMgZmxvYXQgTjAyNlszXSA9IHstMC43NTY1OTAgLDAuNDUyNDAzICwwLjQ3MjEyNn07CitzdGF0aWMgZmxvYXQgTjAyN1szXSA9IHstMC45NTM4NTUgLDAuMjkzMDAzICwwLjA2NTY1MX07CitzdGF0aWMgZmxvYXQgTjAyOFszXSA9IHstMC45OTgwMzMgLDAuMDQwMjkyICwwLjA0ODAyOH07CitzdGF0aWMgZmxvYXQgTjAyOVszXSA9IHstMC45NzcwNzkgLC0wLjIwNDI4OCAsMC4wNTk4NTh9Oworc3RhdGljIGZsb2F0IE4wMzBbM10gPSB7LTAuNzI5MTE3ICwtMC42NzUzMDQgLDAuMTExMTQwfTsKK3N0YXRpYyBmbG9hdCBOMDMxWzNdID0gezAuNTk4MzYxICwtMC43OTI3NTMgLDAuMTE2MjIxfTsKK3N0YXRpYyBmbG9hdCBOMDMyWzNdID0gezAuOTY1MTkyICwtMC4yNTI5OTEgLDAuMDY2MzMyfTsKK3N0YXRpYyBmbG9hdCBOMDMzWzNdID0gezAuOTk4MjAxICwtMC4wMDI3OTAgLDAuMDU5ODkyfTsKK3N0YXRpYyBmbG9hdCBOMDM0WzNdID0gezAuOTc4NjU3ICwwLjE5MzEzNSAsMC4wNzAyMDd9Oworc3RhdGljIGZsb2F0IE4wMzVbM10gPSB7MC43MTg4MTUgLDAuNjgwMzkyICwwLjE0MjczM307CitzdGF0aWMgZmxvYXQgTjAzNlszXSA9IHstMC4zODMwOTYgLDAuOTA2MjEyICwwLjE3ODkzNn07CitzdGF0aWMgZmxvYXQgTjAzN1szXSA9IHstMC45NTI4MzEgLDAuMjkyNTkwICwwLjA4MDY0N307CitzdGF0aWMgZmxvYXQgTjAzOFszXSA9IHstMC45OTc2ODAgLDAuMDMyNDE3ICwwLjA1OTg2MX07CitzdGF0aWMgZmxvYXQgTjAzOVszXSA9IHstMC45ODI2MjkgLC0wLjE2OTg4MSAsMC4wNzQ3MDB9Oworc3RhdGljIGZsb2F0IE4wNDBbM10gPSB7LTAuNjk1NDI0ICwtMC43MDM0NjYgLDAuMTQ2NzAwfTsKK3N0YXRpYyBmbG9hdCBOMDQxWzNdID0gezAuMzU5MzIzICwtMC45MTU1MzEgLDAuMTgwODA1fTsKK3N0YXRpYyBmbG9hdCBOMDQyWzNdID0gezAuOTQzMzU2ICwtMC4zMTkzODcgLDAuMDg5ODQyfTsKK3N0YXRpYyBmbG9hdCBOMDQzWzNdID0gezAuOTk4MjcyICwtMC4wMzI0MzUgLDAuMDQ4OTkzfTsKK3N0YXRpYyBmbG9hdCBOMDQ0WzNdID0gezAuOTc4OTk3ICwwLjE5MzIwNSAsMC4wNjUwODR9Oworc3RhdGljIGZsb2F0IE4wNDVbM10gPSB7MC44NzIxNDQgLDAuNDcwMDk0ICwtMC4xMzU1NjV9Oworc3RhdGljIGZsb2F0IE4wNDZbM10gPSB7LTAuNjY0MjgyICwwLjczNzk0NSAsLTAuMTE5MDI3fTsKK3N0YXRpYyBmbG9hdCBOMDQ3WzNdID0gey0wLjk1NDUwOCAsMC4yODg1NzAgLDAuMDc1MTA3fTsKK3N0YXRpYyBmbG9hdCBOMDQ4WzNdID0gey0wLjk5ODI3MyAsMC4wMzI0MDYgLDAuMDQ4OTkzfTsKK3N0YXRpYyBmbG9hdCBOMDQ5WzNdID0gey0wLjk3OTkwOCAsLTAuMTkzNTc5ICwwLjA0ODAzOH07CitzdGF0aWMgZmxvYXQgTjA1MFszXSA9IHstMC44NTg3MzYgLC0wLjUwNzIwMiAsLTAuMDcyOTM4fTsKK3N0YXRpYyBmbG9hdCBOMDUxWzNdID0gezAuNjQzNTQ1ICwtMC43NjM4ODcgLC0wLjA0ODIzN307CitzdGF0aWMgZmxvYXQgTjA1MlszXSA9IHswLjk1NTU4MCAsLTAuMjg4OTU0ICwwLjA1ODA2OH07CitzdGF0aWMgZmxvYXQgTjA1OFszXSA9IHswLjAwMDA1MCAsMC43OTMwMDcgLC0wLjYwOTIxM307CitzdGF0aWMgZmxvYXQgTjA1OVszXSA9IHswLjkxMzUxMCAsMC4yMzU0MTggLC0wLjMzMTc3OX07CitzdGF0aWMgZmxvYXQgTjA2MFszXSA9IHstMC44MDc5NzAgLDAuNDk1MDAwICwtMC4zMTk2MjV9Oworc3RhdGljIGZsb2F0IE4wNjFbM10gPSB7MC4wMDAwMDAgLDAuNzg0Njg3ICwtMC42MTk4OTJ9Oworc3RhdGljIGZsb2F0IE4wNjJbM10gPSB7MC4wMDAwMDAgLC0xLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNjNbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA2NFszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDY1WzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNjZbM10gPSB7LTAuMDU1Nzg0ICwwLjI1NzA1OSAsMC45NjQ3ODR9Oworc3RhdGljIGZsb2F0IE4wNjlbM10gPSB7LTAuMDAwNTA1ICwtMC45Mjk3NzUgLC0wLjM2ODEyN307CitzdGF0aWMgZmxvYXQgTjA3MFszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBQMDAyWzNdID0gezAuMDAsIC0zNi41OSwgNTY4Ny43Mn07CitzdGF0aWMgZmxvYXQgUDAwM1szXSA9IHs5MC4wMCwgMTE0LjczLCA3MjQuMzh9Oworc3RhdGljIGZsb2F0IFAwMDRbM10gPSB7NTguMjQsIC0xNDYuODQsIDI2Mi4zNX07CitzdGF0aWMgZmxvYXQgUDAwNVszXSA9IHsyNy44MSwgMjMxLjUyLCA1MTAuNDN9Oworc3RhdGljIGZsb2F0IFAwMDZbM10gPSB7LTI3LjgxLCAyMzAuNDMsIDUwOS43Nn07CitzdGF0aWMgZmxvYXQgUDAwN1szXSA9IHstNDYuMDksIC0xNDYuODMsIDI2NS44NH07CitzdGF0aWMgZmxvYXQgUDAwOFszXSA9IHstOTAuMDAsIDEwMy44NCwgNzE4LjUzfTsKK3N0YXRpYyBmbG9hdCBQMDA5WzNdID0gey0xMzEuMTAsIC0xNjUuOTIsIDgzNC44NX07CitzdGF0aWMgZmxvYXQgUDAxMFszXSA9IHstMjcuODEsIC0yODUuMzEsIDUwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAxMVszXSA9IHsyNy44MSwgLTI4NS4zMiwgNTAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDEyWzNdID0gezE0Ny45NiwgLTE3MC44OSwgODQ1LjUwfTsKK3N0YXRpYyBmbG9hdCBQMDEzWzNdID0gezE4MC4wMCwgMC4wMCwgMjAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAxNFszXSA9IHsxNDUuNjIsIDM1Mi42NywgMjAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAxNVszXSA9IHs1NS42MiwgNTcwLjYzLCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDE2WzNdID0gey01NS42MiwgNTcwLjY0LCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDE3WzNdID0gey0xNDUuNjIsIDM1Mi42OCwgMjAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAxOFszXSA9IHstMTgwLjAwLCAwLjAxLCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDE5WzNdID0gey0xNzguMjAsIC0zNTIuNjYsIDIwMDEuNjF9Oworc3RhdGljIGZsb2F0IFAwMjBbM10gPSB7LTU1LjYzLCAtNTcwLjYzLCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDIxWzNdID0gezU1LjYyLCAtNTcwLjY0LCAyMDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDIyWzNdID0gezE3OS45MSwgLTM1Mi42OSwgMTk5OC4zOX07CitzdGF0aWMgZmxvYXQgUDAyM1szXSA9IHsxNTAuMDAsIDAuMDAsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMjRbM10gPSB7MTIxLjM1LCAyOTMuODksIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMjVbM10gPSB7NDYuMzUsIDUwMi45MywgMjg4My4wOX07CitzdGF0aWMgZmxvYXQgUDAyNlszXSA9IHstNDYuMzUsIDQ5Ny40NSwgMjg3Ny4yNH07CitzdGF0aWMgZmxvYXQgUDAyN1szXSA9IHstMTIxLjM1LCAyOTMuOTAsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMjhbM10gPSB7LTE1MC4wMCwgMC4wMCwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAyOVszXSA9IHstMTUyLjIxLCAtMzA0Ljg0LCAyODU4LjY4fTsKK3N0YXRpYyBmbG9hdCBQMDMwWzNdID0gey00Ni4zNiwgLTQ3NS41MiwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAzMVszXSA9IHs0Ni4zNSwgLTQ3NS41MywgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAzMlszXSA9IHsxNTUuNjQsIC0zMDQuODcsIDI4NjMuNTB9Oworc3RhdGljIGZsb2F0IFAwMzNbM10gPSB7OTAuMDAsIDAuMDAsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwMzRbM10gPSB7NzIuODEsIDE3Ni4zMywgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAzNVszXSA9IHsyNy44MSwgMjg1LjMyLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDM2WzNdID0gey0yNy44MSwgMjg1LjMyLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDM3WzNdID0gey03Mi44MSwgMTc2LjM0LCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDM4WzNdID0gey05MC4wMCwgMC4wMCwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDAzOVszXSA9IHstNzIuODEsIC0xNzYuMzMsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDBbM10gPSB7LTI3LjgxLCAtMjg1LjMxLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQxWzNdID0gezI3LjgxLCAtMjg1LjMyLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQyWzNdID0gezcyLjgxLCAtMTc2LjM0LCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQzWzNdID0gezMwLjAwLCAwLjAwLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBQMDQ0WzNdID0gezI0LjI3LCA1OC43OCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA0NVszXSA9IHs5LjI3LCA5NS4xMSwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA0NlszXSA9IHstOS4yNywgOTUuMTEsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDdbM10gPSB7LTI0LjI3LCA1OC43OCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA0OFszXSA9IHstMzAuMDAsIDAuMDAsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNDlbM10gPSB7LTI0LjI3LCAtNTguNzgsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNTBbM10gPSB7LTkuMjcsIC05NS4xMCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA1MVszXSA9IHs5LjI3LCAtOTUuMTEsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IFAwNTJbM10gPSB7MjQuMjcsIC01OC43OCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgUDA1OFszXSA9IHswLjAwLCAxMjEyLjcyLCAyNzAzLjA4fTsKK3N0YXRpYyBmbG9hdCBQMDU5WzNdID0gezUwLjM2LCAwLjAwLCAxMDguMTR9Oworc3RhdGljIGZsb2F0IFAwNjBbM10gPSB7LTIyLjE4LCAwLjAwLCAxMDguMTR9Oworc3RhdGljIGZsb2F0IFAwNjFbM10gPSB7MC4wMCwgMTE4MS42MSwgNjM0NC42NX07CitzdGF0aWMgZmxvYXQgUDA2MlszXSA9IHs1MTYuNDUsIC04ODcuMDgsIDI1MzUuNDV9Oworc3RhdGljIGZsb2F0IFAwNjNbM10gPSB7LTU0NS42OSwgLTg3OS4zMSwgMjU1NS42M307CitzdGF0aWMgZmxvYXQgUDA2NFszXSA9IHs2MTguODksIC0xMDA1LjY0LCAyOTg4LjMyfTsKK3N0YXRpYyBmbG9hdCBQMDY1WzNdID0gey02MzUuMzcsIC0xMDE0Ljc5LCAyOTM4LjY4fTsKK3N0YXRpYyBmbG9hdCBQMDY2WzNdID0gezAuMDAsIDEzNzQuNDMsIDMwNjQuMTh9Oworc3RhdGljIGZsb2F0IFAwNjlbM10gPSB7MC4wMCwgLTQxOC4yNSwgNTc2NS4wNH07CitzdGF0aWMgZmxvYXQgUDA3MFszXSA9IHswLjAwLCAxMjY2LjkxLCA2NjI5LjYwfTsKK3N0YXRpYyBmbG9hdCBQMDcxWzNdID0gey0xMzkuMTIsIC0xMjQuOTYsIDk5Ny45OH07CitzdGF0aWMgZmxvYXQgUDA3MlszXSA9IHstMTM5LjI0LCAtMTEwLjE4LCAxMDIwLjY4fTsKK3N0YXRpYyBmbG9hdCBQMDczWzNdID0gey0xMzcuMzMsIC05NC41MiwgMTAyMi42M307CitzdGF0aWMgZmxvYXQgUDA3NFszXSA9IHstMTM3LjAzLCAtNzkuOTEsIDk5Ni44OX07CitzdGF0aWMgZmxvYXQgUDA3NVszXSA9IHstMTM1LjIxLCAtOTEuNDgsIDk2OS4xNH07CitzdGF0aWMgZmxvYXQgUDA3NlszXSA9IHstMTM1LjM5LCAtMTEwLjg3LCA5NjguNzZ9Oworc3RhdGljIGZsb2F0IFAwNzdbM10gPSB7MTUwLjIzLCAtNzguNDQsIDk5NS41M307CitzdGF0aWMgZmxvYXQgUDA3OFszXSA9IHsxNTIuNzksIC05Mi43NiwgMTAxOC40Nn07CitzdGF0aWMgZmxvYXQgUDA3OVszXSA9IHsxNTQuMTksIC0xMTAuMjAsIDEwMjAuNTV9Oworc3RhdGljIGZsb2F0IFAwODBbM10gPSB7MTUxLjMzLCAtMTI0LjE1LCA5OTMuNzd9Oworc3RhdGljIGZsb2F0IFAwODFbM10gPSB7MTUwLjQ5LCAtMTExLjE5LCA5NjkuODZ9Oworc3RhdGljIGZsb2F0IFAwODJbM10gPSB7MTUwLjc5LCAtOTIuNDEsIDk2OS43MH07CitzdGF0aWMgZmxvYXQgaVAwMDJbM10gPSB7MC4wMCwgLTM2LjU5LCA1Njg3LjcyfTsKK3N0YXRpYyBmbG9hdCBpUDAwNFszXSA9IHs1OC4yNCwgLTE0Ni44NCwgMjYyLjM1fTsKK3N0YXRpYyBmbG9hdCBpUDAwN1szXSA9IHstNDYuMDksIC0xNDYuODMsIDI2NS44NH07CitzdGF0aWMgZmxvYXQgaVAwMTBbM10gPSB7LTI3LjgxLCAtMjg1LjMxLCA1MDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDExWzNdID0gezI3LjgxLCAtMjg1LjMyLCA1MDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDIzWzNdID0gezE1MC4wMCwgMC4wMCwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMjRbM10gPSB7MTIxLjM1LCAyOTMuODksIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDI1WzNdID0gezQ2LjM1LCA1MDIuOTMsIDI4ODMuMDl9Oworc3RhdGljIGZsb2F0IGlQMDI2WzNdID0gey00Ni4zNSwgNDk3LjQ1LCAyODc3LjI0fTsKK3N0YXRpYyBmbG9hdCBpUDAyN1szXSA9IHstMTIxLjM1LCAyOTMuOTAsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDI4WzNdID0gey0xNTAuMDAsIDAuMDAsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDI5WzNdID0gey0xMjEuMzUsIC0zMDQuODQsIDI4NTMuODZ9Oworc3RhdGljIGZsb2F0IGlQMDMwWzNdID0gey00Ni4zNiwgLTQ3NS41MiwgMzAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMzFbM10gPSB7NDYuMzUsIC00NzUuNTMsIDMwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDMyWzNdID0gezEyMS4zNSwgLTMwNC44NywgMjg1My44Nn07CitzdGF0aWMgZmxvYXQgaVAwMzNbM10gPSB7OTAuMDAsIDAuMDAsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDM0WzNdID0gezcyLjgxLCAxNzYuMzMsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDM1WzNdID0gezI3LjgxLCAyODUuMzIsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDM2WzNdID0gey0yNy44MSwgMjg1LjMyLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDAzN1szXSA9IHstNzIuODEsIDE3Ni4zNCwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwMzhbM10gPSB7LTkwLjAwLCAwLjAwLCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDAzOVszXSA9IHstNzIuODEsIC0xNzYuMzMsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQwWzNdID0gey0yNy44MSwgLTI4NS4zMSwgNDAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNDFbM10gPSB7MjcuODEsIC0yODUuMzIsIDQwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQyWzNdID0gezcyLjgxLCAtMTc2LjM0LCA0MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0M1szXSA9IHszMC4wMCwgMC4wMCwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNDRbM10gPSB7MjQuMjcsIDU4Ljc4LCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0NVszXSA9IHs5LjI3LCA5NS4xMSwgNTAwMC4wMH07CitzdGF0aWMgZmxvYXQgaVAwNDZbM10gPSB7LTkuMjcsIDk1LjExLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0N1szXSA9IHstMjQuMjcsIDU4Ljc4LCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA0OFszXSA9IHstMzAuMDAsIDAuMDAsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDQ5WzNdID0gey0yNC4yNywgLTU4Ljc4LCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA1MFszXSA9IHstOS4yNywgLTk1LjEwLCA1MDAwLjAwfTsKK3N0YXRpYyBmbG9hdCBpUDA1MVszXSA9IHs5LjI3LCAtOTUuMTEsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDUyWzNdID0gezI0LjI3LCAtNTguNzgsIDUwMDAuMDB9Oworc3RhdGljIGZsb2F0IGlQMDYxWzNdID0gezAuMDAsIDExODEuNjEsIDYzNDQuNjV9Oworc3RhdGljIGZsb2F0IGlQMDY5WzNdID0gezAuMDAsIC00MTguMjUsIDU3NjUuMDR9Oworc3RhdGljIGZsb2F0IGlQMDcwWzNdID0gezAuMDAsIDEyNjYuOTEsIDY2MjkuNjB9OworLyogKklOREVOVC1PTiogKi8KKwordm9pZAorRmlzaDAwMSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE3KTsKKyAgICBnbFZlcnRleDNmdihQMDE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDA4KTsKKyAgICBnbFZlcnRleDNmdihQMDA4KTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA3KTsKKyAgICBnbFZlcnRleDNmdihQMDA3KTsKKyAgICBnbE5vcm1hbDNmdihOMDEwKTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbE5vcm1hbDNmdihOMDA5KTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsTm9ybWFsM2Z2KE4wMTApOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEwKTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTApOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsTm9ybWFsM2Z2KE4wMDcpOworICAgIGdsVmVydGV4M2Z2KFAwMDcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDA0KTsKKyAgICBnbFZlcnRleDNmdihQMDA0KTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsVmVydGV4M2Z2KFAwODApOworICAgIGdsVmVydGV4M2Z2KFAwODEpOworICAgIGdsVmVydGV4M2Z2KFAwODIpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2gwMDIodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTMpOworICAgIGdsVmVydGV4M2Z2KFAwMTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2gwMDModm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbE5vcm1hbDNmdihOMDMxKTsKKyAgICBnbFZlcnRleDNmdihQMDMxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2gwMDQodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM0KTsKKyAgICBnbFZlcnRleDNmdihQMDM0KTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbE5vcm1hbDNmdihOMDYxKTsKKyAgICBnbFZlcnRleDNmdihQMDYxKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjEpOworICAgIGdsVmVydGV4M2Z2KFAwNjEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDYxKTsKKyAgICBnbFZlcnRleDNmdihQMDYxKTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwNSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2gwMDYodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjYpOworICAgIGdsVmVydGV4M2Z2KFAwNjYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwNyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wNjQpOworICAgIGdsVmVydGV4M2Z2KFAwNjQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwOCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorRmlzaDAwOSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMTIpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDcpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0Zpc2hfMSh2b2lkKQoreworICAgIEZpc2gwMDQoKTsKKyAgICBGaXNoMDA1KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDcoKTsKKyAgICBGaXNoMDA2KCk7CisgICAgRmlzaDAwMigpOworICAgIEZpc2gwMDgoKTsKKyAgICBGaXNoMDA5KCk7CisgICAgRmlzaDAwMSgpOworfQorCit2b2lkCitGaXNoXzIodm9pZCkKK3sKKyAgICBGaXNoMDA1KCk7CisgICAgRmlzaDAwNCgpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwNigpOworICAgIEZpc2gwMDIoKTsKKyAgICBGaXNoMDA3KCk7CisgICAgRmlzaDAwOSgpOworICAgIEZpc2gwMDEoKTsKK30KKwordm9pZAorRmlzaF8zKHZvaWQpCit7CisgICAgRmlzaDAwNSgpOworICAgIEZpc2gwMDQoKTsKKyAgICBGaXNoMDA3KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDIoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwOSgpOworICAgIEZpc2gwMDEoKTsKKyAgICBGaXNoMDA2KCk7Cit9CisKK3ZvaWQKK0Zpc2hfNCh2b2lkKQoreworICAgIEZpc2gwMDUoKTsKKyAgICBGaXNoMDA0KCk7CisgICAgRmlzaDAwOCgpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDAyKCk7CisgICAgRmlzaDAwNygpOworICAgIEZpc2gwMDkoKTsKKyAgICBGaXNoMDAxKCk7CisgICAgRmlzaDAwNigpOworfQorCit2b2lkCitGaXNoXzUodm9pZCkKK3sKKyAgICBGaXNoMDA5KCk7CisgICAgRmlzaDAwNigpOworICAgIEZpc2gwMDcoKTsKKyAgICBGaXNoMDAxKCk7CisgICAgRmlzaDAwMigpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwNCgpOworICAgIEZpc2gwMDUoKTsKK30KKwordm9pZAorRmlzaF82KHZvaWQpCit7CisgICAgRmlzaDAwOSgpOworICAgIEZpc2gwMDYoKTsKKyAgICBGaXNoMDA4KCk7CisgICAgRmlzaDAwMSgpOworICAgIEZpc2gwMDIoKTsKKyAgICBGaXNoMDA3KCk7CisgICAgRmlzaDAwMygpOworICAgIEZpc2gwMDQoKTsKKyAgICBGaXNoMDA1KCk7Cit9CisKK3ZvaWQKK0Zpc2hfNyh2b2lkKQoreworICAgIEZpc2gwMDkoKTsKKyAgICBGaXNoMDAxKCk7CisgICAgRmlzaDAwNygpOworICAgIEZpc2gwMDUoKTsKKyAgICBGaXNoMDAyKCk7CisgICAgRmlzaDAwOCgpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDA0KCk7CisgICAgRmlzaDAwNigpOworfQorCit2b2lkCitGaXNoXzgodm9pZCkKK3sKKyAgICBGaXNoMDA5KCk7CisgICAgRmlzaDAwOCgpOworICAgIEZpc2gwMDEoKTsKKyAgICBGaXNoMDAyKCk7CisgICAgRmlzaDAwNygpOworICAgIEZpc2gwMDMoKTsKKyAgICBGaXNoMDA1KCk7CisgICAgRmlzaDAwNCgpOworICAgIEZpc2gwMDYoKTsKK30KKwordm9pZAorRHJhd1NoYXJrKGZpc2hSZWMgKiBmaXNoKQoreworICAgIGZsb2F0IG1hdFs0XVs0XTsKKyAgICBpbnQgbjsKKyAgICBmbG9hdCBzZWcxLCBzZWcyLCBzZWczLCBzZWc0LCBzZWd1cDsKKyAgICBmbG9hdCB0aHJhc2gsIGNob21wOworCisgICAgZmlzaC0+aHRhaWwgPSAoaW50KSAoZmlzaC0+aHRhaWwgLSAoaW50KSAoNS4wICogZmlzaC0+dikpICUgMzYwOworCisgICAgdGhyYXNoID0gNTAuMCAqIGZpc2gtPnY7CisKKyAgICBzZWcxID0gMC42ICogdGhyYXNoICogc2luKGZpc2gtPmh0YWlsICogUlJBRCk7CisgICAgc2VnMiA9IDEuOCAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyA0NS4wKSAqIFJSQUQpOworICAgIHNlZzMgPSAzLjAgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgOTAuMCkgKiBSUkFEKTsKKyAgICBzZWc0ID0gNC4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDExMC4wKSAqIFJSQUQpOworCisgICAgY2hvbXAgPSAwLjA7CisgICAgaWYgKGZpc2gtPnYgPiAyLjApIHsKKyAgICAgICAgY2hvbXAgPSAtKGZpc2gtPnYgLSAyLjApICogMjAwLjA7CisgICAgfQorICAgIFAwMDRbMV0gPSBpUDAwNFsxXSArIGNob21wOworICAgIFAwMDdbMV0gPSBpUDAwN1sxXSArIGNob21wOworICAgIFAwMTBbMV0gPSBpUDAxMFsxXSArIGNob21wOworICAgIFAwMTFbMV0gPSBpUDAxMVsxXSArIGNob21wOworCisgICAgUDAyM1swXSA9IGlQMDIzWzBdICsgc2VnMTsKKyAgICBQMDI0WzBdID0gaVAwMjRbMF0gKyBzZWcxOworICAgIFAwMjVbMF0gPSBpUDAyNVswXSArIHNlZzE7CisgICAgUDAyNlswXSA9IGlQMDI2WzBdICsgc2VnMTsKKyAgICBQMDI3WzBdID0gaVAwMjdbMF0gKyBzZWcxOworICAgIFAwMjhbMF0gPSBpUDAyOFswXSArIHNlZzE7CisgICAgUDAyOVswXSA9IGlQMDI5WzBdICsgc2VnMTsKKyAgICBQMDMwWzBdID0gaVAwMzBbMF0gKyBzZWcxOworICAgIFAwMzFbMF0gPSBpUDAzMVswXSArIHNlZzE7CisgICAgUDAzMlswXSA9IGlQMDMyWzBdICsgc2VnMTsKKyAgICBQMDMzWzBdID0gaVAwMzNbMF0gKyBzZWcyOworICAgIFAwMzRbMF0gPSBpUDAzNFswXSArIHNlZzI7CisgICAgUDAzNVswXSA9IGlQMDM1WzBdICsgc2VnMjsKKyAgICBQMDM2WzBdID0gaVAwMzZbMF0gKyBzZWcyOworICAgIFAwMzdbMF0gPSBpUDAzN1swXSArIHNlZzI7CisgICAgUDAzOFswXSA9IGlQMDM4WzBdICsgc2VnMjsKKyAgICBQMDM5WzBdID0gaVAwMzlbMF0gKyBzZWcyOworICAgIFAwNDBbMF0gPSBpUDA0MFswXSArIHNlZzI7CisgICAgUDA0MVswXSA9IGlQMDQxWzBdICsgc2VnMjsKKyAgICBQMDQyWzBdID0gaVAwNDJbMF0gKyBzZWcyOworICAgIFAwNDNbMF0gPSBpUDA0M1swXSArIHNlZzM7CisgICAgUDA0NFswXSA9IGlQMDQ0WzBdICsgc2VnMzsKKyAgICBQMDQ1WzBdID0gaVAwNDVbMF0gKyBzZWczOworICAgIFAwNDZbMF0gPSBpUDA0NlswXSArIHNlZzM7CisgICAgUDA0N1swXSA9IGlQMDQ3WzBdICsgc2VnMzsKKyAgICBQMDQ4WzBdID0gaVAwNDhbMF0gKyBzZWczOworICAgIFAwNDlbMF0gPSBpUDA0OVswXSArIHNlZzM7CisgICAgUDA1MFswXSA9IGlQMDUwWzBdICsgc2VnMzsKKyAgICBQMDUxWzBdID0gaVAwNTFbMF0gKyBzZWczOworICAgIFAwNTJbMF0gPSBpUDA1MlswXSArIHNlZzM7CisgICAgUDAwMlswXSA9IGlQMDAyWzBdICsgc2VnNDsKKyAgICBQMDYxWzBdID0gaVAwNjFbMF0gKyBzZWc0OworICAgIFAwNjlbMF0gPSBpUDA2OVswXSArIHNlZzQ7CisgICAgUDA3MFswXSA9IGlQMDcwWzBdICsgc2VnNDsKKworICAgIGZpc2gtPnZ0YWlsICs9ICgoZmlzaC0+ZHRoZXRhIC0gZmlzaC0+dnRhaWwpICogMC4xKTsKKworICAgIGlmIChmaXNoLT52dGFpbCA+IDAuNSkgeworICAgICAgICBmaXNoLT52dGFpbCA9IDAuNTsKKyAgICB9IGVsc2UgaWYgKGZpc2gtPnZ0YWlsIDwgLTAuNSkgeworICAgICAgICBmaXNoLT52dGFpbCA9IC0wLjU7CisgICAgfQorICAgIHNlZ3VwID0gdGhyYXNoICogZmlzaC0+dnRhaWw7CisKKyAgICBQMDIzWzFdID0gaVAwMjNbMV0gKyBzZWd1cDsKKyAgICBQMDI0WzFdID0gaVAwMjRbMV0gKyBzZWd1cDsKKyAgICBQMDI1WzFdID0gaVAwMjVbMV0gKyBzZWd1cDsKKyAgICBQMDI2WzFdID0gaVAwMjZbMV0gKyBzZWd1cDsKKyAgICBQMDI3WzFdID0gaVAwMjdbMV0gKyBzZWd1cDsKKyAgICBQMDI4WzFdID0gaVAwMjhbMV0gKyBzZWd1cDsKKyAgICBQMDI5WzFdID0gaVAwMjlbMV0gKyBzZWd1cDsKKyAgICBQMDMwWzFdID0gaVAwMzBbMV0gKyBzZWd1cDsKKyAgICBQMDMxWzFdID0gaVAwMzFbMV0gKyBzZWd1cDsKKyAgICBQMDMyWzFdID0gaVAwMzJbMV0gKyBzZWd1cDsKKyAgICBQMDMzWzFdID0gaVAwMzNbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM0WzFdID0gaVAwMzRbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM1WzFdID0gaVAwMzVbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM2WzFdID0gaVAwMzZbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM3WzFdID0gaVAwMzdbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM4WzFdID0gaVAwMzhbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDM5WzFdID0gaVAwMzlbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDQwWzFdID0gaVAwNDBbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDQxWzFdID0gaVAwNDFbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDQyWzFdID0gaVAwNDJbMV0gKyBzZWd1cCAqIDUuMDsKKyAgICBQMDQzWzFdID0gaVAwNDNbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDA0NFsxXSA9IGlQMDQ0WzFdICsgc2VndXAgKiAxMi4wOworICAgIFAwNDVbMV0gPSBpUDA0NVsxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDQ2WzFdID0gaVAwNDZbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDA0N1sxXSA9IGlQMDQ3WzFdICsgc2VndXAgKiAxMi4wOworICAgIFAwNDhbMV0gPSBpUDA0OFsxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDQ5WzFdID0gaVAwNDlbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDA1MFsxXSA9IGlQMDUwWzFdICsgc2VndXAgKiAxMi4wOworICAgIFAwNTFbMV0gPSBpUDA1MVsxXSArIHNlZ3VwICogMTIuMDsKKyAgICBQMDUyWzFdID0gaVAwNTJbMV0gKyBzZWd1cCAqIDEyLjA7CisgICAgUDAwMlsxXSA9IGlQMDAyWzFdICsgc2VndXAgKiAxNy4wOworICAgIFAwNjFbMV0gPSBpUDA2MVsxXSArIHNlZ3VwICogMTcuMDsKKyAgICBQMDY5WzFdID0gaVAwNjlbMV0gKyBzZWd1cCAqIDE3LjA7CisgICAgUDA3MFsxXSA9IGlQMDcwWzFdICsgc2VndXAgKiAxNy4wOworCisgICAgZ2xQdXNoTWF0cml4KCk7CisKKyAgICBnbFRyYW5zbGF0ZWYoMC4wLCAwLjAsIC0zMDAwLjApOworCisgICAgZ2xHZXRGbG9hdHYoR0xfTU9ERUxWSUVXX01BVFJJWCwgJm1hdFswXVswXSk7CisgICAgbiA9IDA7CisgICAgaWYgKG1hdFswXVsyXSA+PSAwLjApIHsKKyAgICAgICAgbiArPSAxOworICAgIH0KKyAgICBpZiAobWF0WzFdWzJdID49IDAuMCkgeworICAgICAgICBuICs9IDI7CisgICAgfQorICAgIGlmIChtYXRbMl1bMl0gPj0gMC4wKSB7CisgICAgICAgIG4gKz0gNDsKKyAgICB9CisgICAgZ2xTY2FsZWYoMi4wLCAxLjAsIDEuMCk7CisKKyAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgIHN3aXRjaCAobikgeworICAgIGNhc2UgMDoKKyAgICAgICAgRmlzaF8xKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgRmlzaF8yKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgRmlzaF8zKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgRmlzaF80KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgRmlzaF81KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgRmlzaF82KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgRmlzaF83KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgRmlzaF84KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKworICAgIGdsUG9wTWF0cml4KCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL3N3aW0uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vYXRsYW50aXMvc3dpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzdiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL3N3aW0uYwpAQCAtMCwwICsxLDE4OCBAQAorLyoqCisgKiAoYykgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFMTCBSSUdIVFMgUkVTRVJWRUQKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UKKyAqIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nCisgKiBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogVEhFIE1BVEVSSUFMIEVNQk9ESUVEIE9OIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgVE8gWU9VICJBUy1JUyIKKyAqIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwKKyAqIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorICogR1JBUEhJQ1MsIElOQy4gIEJFIExJQUJMRSBUTyBZT1UgT1IgQU5ZT05FIEVMU0UgRk9SIEFOWSBESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCisgKiBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLAorICogTE9TUyBPRiBQUk9GSVQsIExPU1MgT0YgVVNFLCBTQVZJTkdTIE9SIFJFVkVOVUUsIE9SIFRIRSBDTEFJTVMgT0YKKyAqIFRISVJEIFBBUlRJRVMsIFdIRVRIRVIgT1IgTk9UIFNJTElDT04gR1JBUEhJQ1MsIElOQy4gIEhBUyBCRUVOCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIExPU1MsIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFBPU1NFU1NJT04sIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMKKyAqIFVzZSwgZHVwbGljYXRpb24sIG9yIGRpc2Nsb3N1cmUgYnkgdGhlIEdvdmVybm1lbnQgaXMgc3ViamVjdCB0bworICogcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBpbiBGQVIgNTIuMjI3LjE5KGMpKDIpIG9yIHN1YnBhcmFncmFwaAorICogKGMpKDEpKGlpKSBvZiB0aGUgUmlnaHRzIGluIFRlY2huaWNhbCBEYXRhIGFuZCBDb21wdXRlciBTb2Z0d2FyZQorICogY2xhdXNlIGF0IERGQVJTIDI1Mi4yMjctNzAxMyBhbmQvb3IgaW4gc2ltaWxhciBvciBzdWNjZXNzb3IKKyAqIGNsYXVzZXMgaW4gdGhlIEZBUiBvciB0aGUgRE9EIG9yIE5BU0EgRkFSIFN1cHBsZW1lbnQuCisgKiBVbnB1Ymxpc2hlZC0tIHJpZ2h0cyByZXNlcnZlZCB1bmRlciB0aGUgY29weXJpZ2h0IGxhd3Mgb2YgdGhlCisgKiBVbml0ZWQgU3RhdGVzLiAgQ29udHJhY3Rvci9tYW51ZmFjdHVyZXIgaXMgU2lsaWNvbiBHcmFwaGljcywKKyAqIEluYy4sIDIwMTEgTi4gIFNob3JlbGluZSBCbHZkLiwgTW91bnRhaW4gVmlldywgQ0EgOTQwMzktNzMxMS4KKyAqCisgKiBPcGVuR0woVE0pIGlzIGEgdHJhZGVtYXJrIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8qIEZvciByYW5kKCkuICovCisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjaW5jbHVkZSAiYXRsYW50aXMuaCIKKwordm9pZAorRmlzaFRyYW5zZm9ybShmaXNoUmVjICogZmlzaCkKK3sKKworICAgIGdsVHJhbnNsYXRlZihmaXNoLT55LCBmaXNoLT56LCAtZmlzaC0+eCk7CisgICAgZ2xSb3RhdGVmKC1maXNoLT5wc2ksIDAuMCwgMS4wLCAwLjApOworICAgIGdsUm90YXRlZihmaXNoLT50aGV0YSwgMS4wLCAwLjAsIDAuMCk7CisgICAgZ2xSb3RhdGVmKC1maXNoLT5waGksIDAuMCwgMC4wLCAxLjApOworfQorCit2b2lkCitXaGFsZVBpbG90KGZpc2hSZWMgKiBmaXNoKQoreworCisgICAgZmlzaC0+cGhpID0gLTIwLjA7CisgICAgZmlzaC0+dGhldGEgPSAwLjA7CisgICAgZmlzaC0+cHNpIC09IDAuNTsKKworICAgIGZpc2gtPnggKz0gV0hBTEVTUEVFRCAqIGZpc2gtPnYgKiBjb3MoZmlzaC0+cHNpIC8gUkFEKSAqIGNvcyhmaXNoLT50aGV0YSAvIFJBRCk7CisgICAgZmlzaC0+eSArPSBXSEFMRVNQRUVEICogZmlzaC0+diAqIHNpbihmaXNoLT5wc2kgLyBSQUQpICogY29zKGZpc2gtPnRoZXRhIC8gUkFEKTsKKyAgICBmaXNoLT56ICs9IFdIQUxFU1BFRUQgKiBmaXNoLT52ICogc2luKGZpc2gtPnRoZXRhIC8gUkFEKTsKK30KKwordm9pZAorU2hhcmtQaWxvdChmaXNoUmVjICogZmlzaCkKK3sKKyAgICBzdGF0aWMgaW50IHNpZ24gPSAxOworICAgIGZsb2F0IFgsIFksIFosIHRwc2ksIHR0aGV0YSwgdGhldGFsOworCisgICAgZmlzaC0+eHQgPSA2MDAwMC4wOworICAgIGZpc2gtPnl0ID0gMC4wOworICAgIGZpc2gtPnp0ID0gMC4wOworCisgICAgWCA9IGZpc2gtPnh0IC0gZmlzaC0+eDsKKyAgICBZID0gZmlzaC0+eXQgLSBmaXNoLT55OworICAgIFogPSBmaXNoLT56dCAtIGZpc2gtPno7CisKKyAgICB0aGV0YWwgPSBmaXNoLT50aGV0YTsKKworICAgIHR0aGV0YSA9IFJBRCAqIGF0YW4oWiAvIChzcXJ0KFggKiBYICsgWSAqIFkpKSk7CisKKyAgICBpZiAodHRoZXRhID4gZmlzaC0+dGhldGEgKyAwLjI1KSB7CisgICAgICAgIGZpc2gtPnRoZXRhICs9IDAuNTsKKyAgICB9IGVsc2UgaWYgKHR0aGV0YSA8IGZpc2gtPnRoZXRhIC0gMC4yNSkgeworICAgICAgICBmaXNoLT50aGV0YSAtPSAwLjU7CisgICAgfQorICAgIGlmIChmaXNoLT50aGV0YSA+IDkwLjApIHsKKyAgICAgICAgZmlzaC0+dGhldGEgPSA5MC4wOworICAgIH0KKyAgICBpZiAoZmlzaC0+dGhldGEgPCAtOTAuMCkgeworICAgICAgICBmaXNoLT50aGV0YSA9IC05MC4wOworICAgIH0KKyAgICBmaXNoLT5kdGhldGEgPSBmaXNoLT50aGV0YSAtIHRoZXRhbDsKKworICAgIHRwc2kgPSBSQUQgKiBhdGFuMihZLCBYKTsKKworICAgIGZpc2gtPmF0dGFjayA9IDA7CisKKyAgICBpZiAoZmFicyh0cHNpIC0gZmlzaC0+cHNpKSA8IDEwLjApIHsKKyAgICAgICAgZmlzaC0+YXR0YWNrID0gMTsKKyAgICB9IGVsc2UgaWYgKGZhYnModHBzaSAtIGZpc2gtPnBzaSkgPCA0NS4wKSB7CisgICAgICAgIGlmIChmaXNoLT5wc2kgPiB0cHNpKSB7CisgICAgICAgICAgICBmaXNoLT5wc2kgLT0gMC41OworICAgICAgICAgICAgaWYgKGZpc2gtPnBzaSA8IC0xODAuMCkgeworICAgICAgICAgICAgICAgIGZpc2gtPnBzaSArPSAzNjAuMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmaXNoLT5wc2kgPCB0cHNpKSB7CisgICAgICAgICAgICBmaXNoLT5wc2kgKz0gMC41OworICAgICAgICAgICAgaWYgKGZpc2gtPnBzaSA+IDE4MC4wKSB7CisgICAgICAgICAgICAgICAgZmlzaC0+cHNpIC09IDM2MC4wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJhbmQoKSAlIDEwMCA+IDk4KSB7CisgICAgICAgICAgICBzaWduID0gMSAtIHNpZ247CisgICAgICAgIH0KKyAgICAgICAgZmlzaC0+cHNpICs9IHNpZ247CisgICAgICAgIGlmIChmaXNoLT5wc2kgPiAxODAuMCkgeworICAgICAgICAgICAgZmlzaC0+cHNpIC09IDM2MC4wOworICAgICAgICB9CisgICAgICAgIGlmIChmaXNoLT5wc2kgPCAtMTgwLjApIHsKKyAgICAgICAgICAgIGZpc2gtPnBzaSArPSAzNjAuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmaXNoLT5hdHRhY2spIHsKKyAgICAgICAgaWYgKGZpc2gtPnYgPCAxLjEpIHsKKyAgICAgICAgICAgIGZpc2gtPnNwdXJ0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlzaC0+c3B1cnQpIHsKKyAgICAgICAgICAgIGZpc2gtPnYgKz0gMC4yOworICAgICAgICB9CisgICAgICAgIGlmIChmaXNoLT52ID4gNS4wKSB7CisgICAgICAgICAgICBmaXNoLT5zcHVydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChmaXNoLT52ID4gMS4wKSAmJiAoIWZpc2gtPnNwdXJ0KSkgeworICAgICAgICAgICAgZmlzaC0+diAtPSAwLjI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIShyYW5kKCkgJSA0MDApICYmICghZmlzaC0+c3B1cnQpKSB7CisgICAgICAgICAgICBmaXNoLT5zcHVydCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpc2gtPnNwdXJ0KSB7CisgICAgICAgICAgICBmaXNoLT52ICs9IDAuMDU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpc2gtPnYgPiAzLjApIHsKKyAgICAgICAgICAgIGZpc2gtPnNwdXJ0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGZpc2gtPnYgPiAxLjApICYmICghZmlzaC0+c3B1cnQpKSB7CisgICAgICAgICAgICBmaXNoLT52IC09IDAuMDU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaXNoLT54ICs9IFNIQVJLU1BFRUQgKiBmaXNoLT52ICogY29zKGZpc2gtPnBzaSAvIFJBRCkgKiBjb3MoZmlzaC0+dGhldGEgLyBSQUQpOworICAgIGZpc2gtPnkgKz0gU0hBUktTUEVFRCAqIGZpc2gtPnYgKiBzaW4oZmlzaC0+cHNpIC8gUkFEKSAqIGNvcyhmaXNoLT50aGV0YSAvIFJBRCk7CisgICAgZmlzaC0+eiArPSBTSEFSS1NQRUVEICogZmlzaC0+diAqIHNpbihmaXNoLT50aGV0YSAvIFJBRCk7Cit9CisKK3ZvaWQKK1NoYXJrTWlzcyhpbnQgaSkKK3sKKyAgICBpbnQgajsKKyAgICBmbG9hdCBhdm9pZCwgdGhldGFsOworICAgIGZsb2F0IFgsIFksIFosIFI7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgTlVNX1NIQVJLUzsgaisrKSB7CisgICAgICAgIGlmIChqICE9IGkpIHsKKyAgICAgICAgICAgIFggPSBzaGFya3Nbal0ueCAtIHNoYXJrc1tpXS54OworICAgICAgICAgICAgWSA9IHNoYXJrc1tqXS55IC0gc2hhcmtzW2ldLnk7CisgICAgICAgICAgICBaID0gc2hhcmtzW2pdLnogLSBzaGFya3NbaV0uejsKKworICAgICAgICAgICAgUiA9IHNxcnQoWCAqIFggKyBZICogWSArIFogKiBaKTsKKworICAgICAgICAgICAgYXZvaWQgPSAxLjA7CisgICAgICAgICAgICB0aGV0YWwgPSBzaGFya3NbaV0udGhldGE7CisKKyAgICAgICAgICAgIGlmIChSIDwgU0hBUktTSVpFKSB7CisgICAgICAgICAgICAgICAgaWYgKFogPiAwLjApIHsKKyAgICAgICAgICAgICAgICAgICAgc2hhcmtzW2ldLnRoZXRhIC09IGF2b2lkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNoYXJrc1tpXS50aGV0YSArPSBhdm9pZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaGFya3NbaV0uZHRoZXRhICs9IChzaGFya3NbaV0udGhldGEgLSB0aGV0YWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy93aGFsZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9hdGxhbnRpcy93aGFsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODY0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvVGVtcGxhdGVzRm9yWGNvZGVUaWdlci9TREwgT3BlbkdMIEFwcGxpY2F0aW9uL2F0bGFudGlzL3doYWxlLmMKQEAgLTAsMCArMSwxNzk4IEBACisvKioKKyAqIChjKSBDb3B5cmlnaHQgMTk5MywgMTk5NCwgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQUxMIFJJR0hUUyBSRVNFUlZFRAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZQorICogYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKKyAqIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSEUgTUFURVJJQUwgRU1CT0RJRUQgT04gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBUTyBZT1UgIkFTLUlTIgorICogQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLAorICogSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCisgKiBHUkFQSElDUywgSU5DLiAgQkUgTElBQkxFIFRPIFlPVSBPUiBBTllPTkUgRUxTRSBGT1IgQU5ZIERJUkVDVCwKKyAqIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkKKyAqIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sCisgKiBMT1NTIE9GIFBST0ZJVCwgTE9TUyBPRiBVU0UsIFNBVklOR1MgT1IgUkVWRU5VRSwgT1IgVEhFIENMQUlNUyBPRgorICogVEhJUkQgUEFSVElFUywgV0hFVEhFUiBPUiBOT1QgU0lMSUNPTiBHUkFQSElDUywgSU5DLiAgSEFTIEJFRU4KKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggTE9TUywgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogUE9TU0VTU0lPTiwgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cworICogVXNlLCBkdXBsaWNhdGlvbiwgb3IgZGlzY2xvc3VyZSBieSB0aGUgR292ZXJubWVudCBpcyBzdWJqZWN0IHRvCisgKiByZXN0cmljdGlvbnMgc2V0IGZvcnRoIGluIEZBUiA1Mi4yMjcuMTkoYykoMikgb3Igc3VicGFyYWdyYXBoCisgKiAoYykoMSkoaWkpIG9mIHRoZSBSaWdodHMgaW4gVGVjaG5pY2FsIERhdGEgYW5kIENvbXB1dGVyIFNvZnR3YXJlCisgKiBjbGF1c2UgYXQgREZBUlMgMjUyLjIyNy03MDEzIGFuZC9vciBpbiBzaW1pbGFyIG9yIHN1Y2Nlc3NvcgorICogY2xhdXNlcyBpbiB0aGUgRkFSIG9yIHRoZSBET0Qgb3IgTkFTQSBGQVIgU3VwcGxlbWVudC4KKyAqIFVucHVibGlzaGVkLS0gcmlnaHRzIHJlc2VydmVkIHVuZGVyIHRoZSBjb3B5cmlnaHQgbGF3cyBvZiB0aGUKKyAqIFVuaXRlZCBTdGF0ZXMuICBDb250cmFjdG9yL21hbnVmYWN0dXJlciBpcyBTaWxpY29uIEdyYXBoaWNzLAorICogSW5jLiwgMjAxMSBOLiAgU2hvcmVsaW5lIEJsdmQuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDAzOS03MzExLgorICoKKyAqIE9wZW5HTChUTSkgaXMgYSB0cmFkZW1hcmsgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImF0bGFudGlzLmgiCisvKiAqSU5ERU5ULU9GRiogKi8KK3N0YXRpYyBmbG9hdCBOMDAxWzNdID0gezAuMDE5MjQ5ICwwLjAxMTM0MCAsLTAuOTk5NzUwfTsKK3N0YXRpYyBmbG9hdCBOMDAyWzNdID0gey0wLjEzMjU3OSAsMC45NTQ1NDcgLDAuMjY2OTUyfTsKK3N0YXRpYyBmbG9hdCBOMDAzWzNdID0gey0wLjE5NjA2MSAsMC45ODAzOTIgLC0wLjAxOTc3OH07CitzdGF0aWMgZmxvYXQgTjAwNFszXSA9IHswLjY5NTQ2MSAsMC42MDQ3MDQgLDAuMzg4MTU4fTsKK3N0YXRpYyBmbG9hdCBOMDA1WzNdID0gezAuODcwNjAwICwwLjQyNTc1NCAsMC4yNDY1NTd9Oworc3RhdGljIGZsb2F0IE4wMDZbM10gPSB7LTAuODgxMTkxICwwLjM5MjAxMiAsMC4yNjQyNTF9Oworc3RhdGljIGZsb2F0IE4wMDhbM10gPSB7LTAuMzQxNDM3ICwwLjg4NzQ3NyAsMC4zMDk1MjN9Oworc3RhdGljIGZsb2F0IE4wMDlbM10gPSB7MC4xMjQwMzUgLC0wLjk5MjI3OCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wMTBbM10gPSB7MC4yNDI1MzYgLDAuMDAwMDAwICwtMC45NzAxNDN9Oworc3RhdGljIGZsb2F0IE4wMTFbM10gPSB7MC41ODgxNzIgLDAuMDAwMDAwICwwLjgwODczNn07CitzdGF0aWMgZmxvYXQgTjAxMlszXSA9IHswLjkyOTgyNCAsLTAuMzQwNjIzICwtMC4xMzkyOTh9Oworc3RhdGljIGZsb2F0IE4wMTNbM10gPSB7MC45NTQxODMgLDAuMjY3MTA4ICwtMC4xMzQ4NjV9Oworc3RhdGljIGZsb2F0IE4wMTRbM10gPSB7MC40OTUxMjcgLDAuODU1NDM2ICwtMC4xNTE5MTR9Oworc3RhdGljIGZsb2F0IE4wMTVbM10gPSB7LTAuMzkwMTk5ICwwLjkwNjU2OSAsLTAuMTYwODY3fTsKK3N0YXRpYyBmbG9hdCBOMDE2WzNdID0gey0wLjkyMzYwNSAsMC4zNTQ1ODEgLC0wLjE0NTY5Mn07CitzdGF0aWMgZmxvYXQgTjAxN1szXSA9IHstMC45NTU3OTYgLC0wLjI2MDY2NyAsLTAuMTM2MDM2fTsKK3N0YXRpYyBmbG9hdCBOMDE4WzNdID0gey0wLjUwMTI4MyAsLTAuODUzNDYyICwtMC4xNDI1NDB9Oworc3RhdGljIGZsb2F0IE4wMTlbM10gPSB7MC40MDUzMDAgLC0wLjkwMTk3NCAsLTAuMTQ4OTEzfTsKK3N0YXRpYyBmbG9hdCBOMDIwWzNdID0gezAuOTA5OTEzICwtMC4zOTI3NDYgLC0wLjEzMzQ1MX07CitzdGF0aWMgZmxvYXQgTjAyMVszXSA9IHswLjkzNjQ5NCAsMC4zMzExNDcgLC0wLjExNTQxNH07CitzdGF0aWMgZmxvYXQgTjAyMlszXSA9IHswLjYwMDEzMSAsMC43OTM3MjQgLC0wLjA5OTIyMn07CitzdGF0aWMgZmxvYXQgTjAyM1szXSA9IHstMC4yMzE1NTYgLDAuOTY4MzYxICwtMC4wOTMwNTN9Oworc3RhdGljIGZsb2F0IE4wMjRbM10gPSB7LTAuODQ0MzY5ICwwLjUyNTMzMCAsLTAuMTA1MjExfTsKK3N0YXRpYyBmbG9hdCBOMDI1WzNdID0gey0wLjk4MjcyNSAsLTAuMTM2MzI5ICwtMC4xMjUxNjR9Oworc3RhdGljIGZsb2F0IE4wMjZbM10gPSB7LTAuNTYwODQ0ICwtMC44MjI2NTQgLC0wLjA5MzI0MX07CitzdGF0aWMgZmxvYXQgTjAyN1szXSA9IHswLjI2Mzg4NCAsLTAuOTU5OTgxICwtMC4wOTM4MTd9Oworc3RhdGljIGZsb2F0IE4wMjhbM10gPSB7MC44NDIwNTcgLC0wLjUyNTE5MiAsLTAuMTIyOTM4fTsKK3N0YXRpYyBmbG9hdCBOMDI5WzNdID0gezAuOTIxNjIwICwwLjM2NzU2NSAsLTAuMTI0NTQ2fTsKK3N0YXRpYyBmbG9hdCBOMDMwWzNdID0gezAuNjEzOTI3ICwwLjc4NDEwOSAsLTAuMDkwOTE4fTsKK3N0YXRpYyBmbG9hdCBOMDMxWzNdID0gey0wLjQ0ODc1NCAsMC44ODgyNjEgLC0wLjA5ODAzN307CitzdGF0aWMgZmxvYXQgTjAzMlszXSA9IHstMC44OTE4NjUgLDAuNDM0Mzc2ICwtMC4xMjYwNzd9Oworc3RhdGljIGZsb2F0IE4wMzNbM10gPSB7LTAuODgxNDQ3ICwtMC40NDgwMTcgLC0wLjE0OTQzN307CitzdGF0aWMgZmxvYXQgTjAzNFszXSA9IHstMC4zNDU2NDcgLC0wLjkyMjA1NyAsLTAuMTc0MTgzfTsKK3N0YXRpYyBmbG9hdCBOMDM1WzNdID0gezAuMzA3OTk4ICwtMC45NDEzNzEgLC0wLjEzNzY4OH07CitzdGF0aWMgZmxvYXQgTjAzNlszXSA9IHswLjgwNjMxNiAsLTAuNTc0NjQ3ICwtMC4xNDAxMjR9Oworc3RhdGljIGZsb2F0IE4wMzdbM10gPSB7MC45NjEzNDYgLDAuMjMzNjQ2ICwtMC4xNDU2ODF9Oworc3RhdGljIGZsb2F0IE4wMzhbM10gPSB7MC40ODg0NTEgLDAuODY1NTg2ICwtMC4xMTAzNTF9Oworc3RhdGljIGZsb2F0IE4wMzlbM10gPSB7LTAuMzc0MjkwICwwLjkyMTk1MyAsLTAuMDk5NTUzfTsKK3N0YXRpYyBmbG9hdCBOMDQwWzNdID0gey0wLjkyODUwNCAsMC4zNDQ1MzMgLC0wLjEzODQ4NX07CitzdGF0aWMgZmxvYXQgTjA0MVszXSA9IHstMC45MTg0MTkgLC0wLjM3MTc5MiAsLTAuMTM1MTg5fTsKK3N0YXRpYyBmbG9hdCBOMDQyWzNdID0gey0wLjUyMDY2NiAsLTAuODMzNzA0ICwtMC4xODM5Njh9Oworc3RhdGljIGZsb2F0IE4wNDNbM10gPSB7MC4zMzkyMDQgLC0wLjkyMDI3MyAsLTAuMTk1MDM2fTsKK3N0YXRpYyBmbG9hdCBOMDQ0WzNdID0gezAuOTIxNDc1ICwtMC4zODczODIgLC0wLjAyODYzNn07CitzdGF0aWMgZmxvYXQgTjA0NVszXSA9IHswLjg0MjQ2NSAsMC41MzMzMzUgLC0wLjA3NjIwNH07CitzdGF0aWMgZmxvYXQgTjA0NlszXSA9IHswLjM4MDExMCAsMC45MjQ5MzkgLDAuMDAyMDczfTsKK3N0YXRpYyBmbG9hdCBOMDQ3WzNdID0gey0wLjI3NjEyOCAsMC45NjEwNzMgLC0wLjAwOTU3OX07CitzdGF0aWMgZmxvYXQgTjA0OFszXSA9IHstMC44Nzk2ODQgLDAuNDczMDAxICwtMC4wNDkyNTB9Oworc3RhdGljIGZsb2F0IE4wNDlbM10gPSB7LTAuOTQ3MTg0ICwtMC4zMTc2MTQgLC0wLjA0NDMyMX07CitzdGF0aWMgZmxvYXQgTjA1MFszXSA9IHstMC42NDIwNTkgLC0wLjc2NDkzMyAsLTAuMDUxMzYzfTsKK3N0YXRpYyBmbG9hdCBOMDUxWzNdID0gezAuNDY2Nzk0ICwtMC44ODA5MjEgLC0wLjA3Nzk5MH07CitzdGF0aWMgZmxvYXQgTjA1MlszXSA9IHswLjg5ODUwOSAsLTAuNDMyMjc3ICwwLjA3NjI3OX07CitzdGF0aWMgZmxvYXQgTjA1M1szXSA9IHswLjkzODk4NSAsMC4zMjgxNDEgLDAuMTAzMTA5fTsKK3N0YXRpYyBmbG9hdCBOMDU0WzNdID0gezAuNDQyNDIwICwwLjg5NTc0NSAsMC4wNDM2NDd9Oworc3RhdGljIGZsb2F0IE4wNTVbM10gPSB7LTAuMjU1MTYzICwwLjk2NjcyMyAsMC4wMTg0MDd9Oworc3RhdGljIGZsb2F0IE4wNTZbM10gPSB7LTAuODMzNzY5ICwwLjU0MDY1MCAsMC4xMTE5MjR9Oworc3RhdGljIGZsb2F0IE4wNTdbM10gPSB7LTAuOTUzNjUzICwtMC4yODk5MzkgLDAuMDgwNTA3fTsKK3N0YXRpYyBmbG9hdCBOMDU4WzNdID0gey0wLjY3MjM1NyAsLTAuNzMwNTI0ICwwLjExOTQ2MX07CitzdGF0aWMgZmxvYXQgTjA1OVszXSA9IHswLjUyMjI0OSAsLTAuODQ2NjUyICwwLjEwMjE1N307CitzdGF0aWMgZmxvYXQgTjA2MFszXSA9IHswLjg4NTg2OCAsLTAuNDI3NjMxICwwLjE3OTkxNH07CitzdGF0aWMgZmxvYXQgTjA2MlszXSA9IHswLjY0ODk0MiAsMC43NDMxMTYgLDAuMTYzMjU1fTsKK3N0YXRpYyBmbG9hdCBOMDYzWzNdID0gey0wLjU3ODk2NyAsMC44MDc3MzAgLDAuMTExMjE5fTsKK3N0YXRpYyBmbG9hdCBOMDY1WzNdID0gey0wLjkwOTg2NCAsLTAuMzUyMjAyICwwLjIxOTMyMX07CitzdGF0aWMgZmxvYXQgTjA2NlszXSA9IHstMC41MDI1NDEgLC0wLjgxODA5MCAsMC4yNzk2MTB9Oworc3RhdGljIGZsb2F0IE4wNjdbM10gPSB7MC4zMjI5MTkgLC0wLjkxNTM1OCAsMC4yNDA1MDR9Oworc3RhdGljIGZsb2F0IE4wNjhbM10gPSB7MC4yNDI1MzYgLDAuMDAwMDAwICwtMC45NzAxNDN9Oworc3RhdGljIGZsb2F0IE4wNjlbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA3MFszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDcxWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNzJbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA3M1szXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDc0WzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wNzVbM10gPSB7MC4wMzEyMjAgLDAuOTk5MDI1ICwtMC4wMzEyMjB9Oworc3RhdGljIGZsb2F0IE4wNzZbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA3N1szXSA9IHswLjQ0NjgyMSAsMC44OTM2NDIgLDAuMDQxODg5fTsKK3N0YXRpYyBmbG9hdCBOMDc4WzNdID0gezAuODYzMDM1ICwtMC4xMDA5ODAgLDAuNDk0OTQ5fTsKK3N0YXRpYyBmbG9hdCBOMDc5WzNdID0gezAuNTg1NTk3ICwtMC44MDgyMTUgLDAuMDYyMTc0fTsKK3N0YXRpYyBmbG9hdCBOMDgwWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wODFbM10gPSB7MS4wMDAwMDAgLDAuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA4MlszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDgzWzNdID0gey0xLjAwMDAwMCAsMC4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDg0WzNdID0gey0wLjQ3ODg5MyAsMC44MzcxMjkgLC0wLjI2NDM0M307CitzdGF0aWMgZmxvYXQgTjA4NVszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDg2WzNdID0gezAuNzYzOTA5ICwwLjUzOTQ1NSAsLTAuMzU0MTYzfTsKK3N0YXRpYyBmbG9hdCBOMDg3WzNdID0gezAuNDQ2ODIxICwwLjg5MzY0MiAsMC4wNDE4ODl9Oworc3RhdGljIGZsb2F0IE4wODhbM10gPSB7MC4zODUxMzQgLC0wLjkwODI4OCAsMC4xNjMzNTJ9Oworc3RhdGljIGZsb2F0IE4wODlbM10gPSB7LTAuNjA1OTUyICwwLjc3OTI1MyAsLTAuMTU5OTYxfTsKK3N0YXRpYyBmbG9hdCBOMDkwWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTFbM10gPSB7MC4wMDAwMDAgLDEuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5MlszXSA9IHswLjAwMDAwMCAsMS4wMDAwMDAgLDAuMDAwMDAwfTsKK3N0YXRpYyBmbG9hdCBOMDkzWzNdID0gezAuMDAwMDAwICwxLjAwMDAwMCAsMC4wMDAwMDB9Oworc3RhdGljIGZsb2F0IE4wOTRbM10gPSB7MS4wMDAwMDAgLDAuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5NVszXSA9IHstMS4wMDAwMDAgLDAuMDAwMDAwICwwLjAwMDAwMH07CitzdGF0aWMgZmxvYXQgTjA5NlszXSA9IHswLjY0NDQ0NCAsLTAuNjIxNTE2ICwwLjQ0NTQzM307CitzdGF0aWMgZmxvYXQgTjA5N1szXSA9IHstMC43NjA4OTYgLC0wLjQ3NDQxNiAsMC40NDI2ODF9Oworc3RhdGljIGZsb2F0IE4wOThbM10gPSB7MC42MzY4ODggLC0wLjQ2NDMxNCAsMC42MTU0NTZ9Oworc3RhdGljIGZsb2F0IE4wOTlbM10gPSB7LTAuNzEwMjk1ICwwLjY0NzAzOCAsMC4yNzcxNjh9Oworc3RhdGljIGZsb2F0IE4xMDBbM10gPSB7MC4wMDk2MDQgLDAuOTkzNjU1ICwwLjExMjA2M307CitzdGF0aWMgZmxvYXQgaVAwMDFbM10gPSB7MTguNzQsIDEzLjE5LCAzLjc2fTsKK3N0YXRpYyBmbG9hdCBQMDAxWzNdID0gezE4Ljc0LCAxMy4xOSwgMy43Nn07CitzdGF0aWMgZmxvYXQgUDAwMlszXSA9IHswLjAwLCAzOTAuNDIsIDEwMjkyLjU3fTsKK3N0YXRpYyBmbG9hdCBQMDAzWzNdID0gezU1LjgwLCA2MjIuMzEsIDgyNTQuMzV9Oworc3RhdGljIGZsb2F0IFAwMDRbM10gPSB7MjAuODAsIDI0Ny42NiwgMTA2NTIuMTN9Oworc3RhdGljIGZsb2F0IFAwMDVbM10gPSB7NDg3LjUxLCAxOTguMDUsIDkzNTAuNzh9Oworc3RhdGljIGZsb2F0IFAwMDZbM10gPSB7LTQ1Ny42MSwgMTk5LjA0LCA5MzUzLjAxfTsKK3N0YXRpYyBmbG9hdCBQMDA4WzNdID0gey0zNC42NywgMjQ3LjY0LCAxMDY2My43MX07CitzdGF0aWMgZmxvYXQgaVAwMDlbM10gPSB7OTcuNDYsIDY3LjYzLCA1OTMuODJ9Oworc3RhdGljIGZsb2F0IGlQMDEwWzNdID0gey04NC4zMywgNjcuNjMsIDU4OC4xOH07CitzdGF0aWMgZmxvYXQgaVAwMTFbM10gPSB7MTE4LjY5LCA4Ljk4LCAtNjYuOTF9Oworc3RhdGljIGZsb2F0IFAwMDlbM10gPSB7OTcuNDYsIDY3LjYzLCA1OTMuODJ9Oworc3RhdGljIGZsb2F0IFAwMTBbM10gPSB7LTg0LjMzLCA2Ny42MywgNTg4LjE4fTsKK3N0YXRpYyBmbG9hdCBQMDExWzNdID0gezExOC42OSwgOC45OCwgLTY2LjkxfTsKK3N0YXRpYyBmbG9hdCBpUDAxMlszXSA9IHsxNTYuNDgsIC0zMS45NSwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBpUDAxM1szXSA9IHsxNjIuMDAsIDExMC4yMiwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBpUDAxNFszXSA9IHs4OC4xNiwgMjIxLjY1LCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDE1WzNdID0gey02NS4yMSwgMjMxLjE2LCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDE2WzNdID0gey0xNTYuNDgsIDEyMS45NywgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBpUDAxN1szXSA9IHstMTYyLjAwLCAtMjMuOTMsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgaVAwMThbM10gPSB7LTg4LjE2LCAtMTM5LjEwLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDE5WzNdID0gezY1LjIxLCAtMTQ4LjYxLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IGlQMDIwWzNdID0gezI0Ni44NywgLTk4LjczLCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBpUDAyMVszXSA9IHsyNTMuMTcsIDEyNy43NiwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgaVAwMjJbM10gPSB7MTMyLjM0LCAyNzAuNzcsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IGlQMDIzWzNdID0gey05Ny44OCwgMjg1LjA0LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBpUDAyNFszXSA9IHstMjIyLjk3LCAxMzkuODAsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IGlQMDI1WzNdID0gey0yMjUuMjksIC04Ni42OCwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgaVAwMjZbM10gPSB7LTEwOC40NCwgLTIyNC4xNSwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgaVAwMjdbM10gPSB7OTcuODgsIC0yMjEuNTYsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IGlQMDI4WzNdID0gezQxMC41NSwgLTIwMC42NiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMjlbM10gPSB7NDMyLjE5LCAxNDguNDIsIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IGlQMDMwWzNdID0gezIwMC42NiwgNDEwLjU1LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBpUDAzMVszXSA9IHstMTQ4LjQyLCA0MzIuMTksIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IGlQMDMyWzNdID0gey00MDcuNDgsIDE3MS44OCwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMzNbM10gPSB7LTQzMi4xOSwgLTE0OC40MiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMzRbM10gPSB7LTE0OC44OCwgLTMwOS43NCwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgaVAwMzVbM10gPSB7MTU2LjM4LCAtMzIwLjE3LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBpUDAzNlszXSA9IHs1MjMuMzksIC0zMDMuODEsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDM3WzNdID0gezU3NC42NiwgMjc2Ljg0LCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBpUDAzOFszXSA9IHsyNDMuMDUsIDQ5Mi41MCwgNDQyNC41N307CitzdGF0aWMgZmxvYXQgaVAwMzlbM10gPSB7LTE5MS4yMywgNTIwLjEzLCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBpUDA0MFszXSA9IHstNTIzLjM5LCAzMDQuMDEsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDQxWzNdID0gey01NzQuNjYsIC0yMzEuODMsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDQyWzNdID0gey0yNjYuOTUsIC01NzguMTcsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IGlQMDQzWzNdID0gezIxMS4xNCwgLTU3OS42NywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgaVAwNDRbM10gPSB7NjgwLjU3LCAtMzcwLjI3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA0NVszXSA9IHs4MzQuMDEsIDM2My4wOSwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNDZbM10gPSB7MzcxLjI5LCA2MTQuMTMsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IGlQMDQ3WzNdID0gey0yOTEuNDMsIDYyMS44NiwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgaVAwNDhbM10gPSB7LTc4NC4xMywgMzYyLjYwLCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA0OVszXSA9IHstNzQzLjI5LCAtMzI1LjgyLCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA1MFszXSA9IHstMzgzLjI0LCAtODA0Ljc3LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBpUDA1MVszXSA9IHsyODMuNDcsIC04NDYuMDksIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwMTJbM10gPSB7MTU2LjQ4LCAtMzEuOTUsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgUDAxM1szXSA9IHsxNjIuMDAsIDExMC4yMiwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE0WzNdID0gezg4LjE2LCAyMjEuNjUsIDkyNC41NH07CitzdGF0aWMgZmxvYXQgUDAxNVszXSA9IHstNjUuMjEsIDIzMS4xNiwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE2WzNdID0gey0xNTYuNDgsIDEyMS45NywgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE3WzNdID0gey0xNjIuMDAsIC0yMy45MywgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE4WzNdID0gey04OC4xNiwgLTEzOS4xMCwgOTI0LjU0fTsKK3N0YXRpYyBmbG9hdCBQMDE5WzNdID0gezY1LjIxLCAtMTQ4LjYxLCA5MjQuNTR9Oworc3RhdGljIGZsb2F0IFAwMjBbM10gPSB7MjQ2Ljg3LCAtOTguNzMsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjFbM10gPSB7MjUzLjE3LCAxMjcuNzYsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjJbM10gPSB7MTMyLjM0LCAyNzAuNzcsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjNbM10gPSB7LTk3Ljg4LCAyODUuMDQsIDE3ODMuMDR9Oworc3RhdGljIGZsb2F0IFAwMjRbM10gPSB7LTIyMi45NywgMTM5LjgwLCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBQMDI1WzNdID0gey0yMjUuMjksIC04Ni42OCwgMTc4My4wNH07CitzdGF0aWMgZmxvYXQgUDAyNlszXSA9IHstMTA4LjQ0LCAtMjI0LjE1LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBQMDI3WzNdID0gezk3Ljg4LCAtMjIxLjU2LCAxNzgzLjA0fTsKK3N0YXRpYyBmbG9hdCBQMDI4WzNdID0gezQxMC41NSwgLTIwMC42NiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAyOVszXSA9IHs0MzIuMTksIDE0OC40MiwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAzMFszXSA9IHsyMDAuNjYsIDQxMC41NSwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAzMVszXSA9IHstMTQ4LjQyLCA0MzIuMTksIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IFAwMzJbM10gPSB7LTQwNy40OCwgMTcxLjg4LCAzMjEzLjg3fTsKK3N0YXRpYyBmbG9hdCBQMDMzWzNdID0gey00MzIuMTksIC0xNDguNDIsIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IFAwMzRbM10gPSB7LTE0OC44OCwgLTMwOS43NCwgMzIxMy44N307CitzdGF0aWMgZmxvYXQgUDAzNVszXSA9IHsxNTYuMzgsIC0zMjAuMTcsIDMyMTMuODd9Oworc3RhdGljIGZsb2F0IFAwMzZbM10gPSB7NTIzLjM5LCAtMzAzLjgxLCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDM3WzNdID0gezU3NC42NiwgMjc2Ljg0LCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDM4WzNdID0gezI0My4wNSwgNDkyLjUwLCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDM5WzNdID0gey0xOTEuMjMsIDUyMC4xMywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgUDA0MFszXSA9IHstNTIzLjM5LCAzMDQuMDEsIDQ0MjQuNTd9Oworc3RhdGljIGZsb2F0IFAwNDFbM10gPSB7LTU3NC42NiwgLTIzMS44MywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgUDA0MlszXSA9IHstMjY2Ljk1LCAtNTc4LjE3LCA0NDI0LjU3fTsKK3N0YXRpYyBmbG9hdCBQMDQzWzNdID0gezIxMS4xNCwgLTU3OS42NywgNDQyNC41N307CitzdGF0aWMgZmxvYXQgUDA0NFszXSA9IHs2ODAuNTcsIC0zNzAuMjcsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNDVbM10gPSB7ODM0LjAxLCAzNjMuMDksIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNDZbM10gPSB7MzcxLjI5LCA2MTQuMTMsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNDdbM10gPSB7LTI5MS40MywgNjIxLjg2LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDQ4WzNdID0gey03ODQuMTMsIDM2Mi42MCwgNTk0My40Nn07CitzdGF0aWMgZmxvYXQgUDA0OVszXSA9IHstNzQzLjI5LCAtMzI1LjgyLCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDUwWzNdID0gey0zODMuMjQsIC04MDQuNzcsIDU5NDMuNDZ9Oworc3RhdGljIGZsb2F0IFAwNTFbM10gPSB7MjgzLjQ3LCAtODQ2LjA5LCA1OTQzLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDUyWzNdID0gezU5OS4wOSwgLTMzMi4yNCwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1M1szXSA9IHs3MzUuNDgsIDMwNi4yNiwgNzkxMS45Mn07CitzdGF0aWMgZmxvYXQgUDA1NFszXSA9IHszMjEuNTUsIDU1OC41MywgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1NVszXSA9IHstMjYwLjU0LCA1NTkuODQsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNTZbM10gPSB7LTY5OC42NiwgMzIwLjgzLCA3OTAyLjU5fTsKK3N0YXRpYyBmbG9hdCBQMDU3WzNdID0gey02NDMuMjksIC0yOTkuMTYsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNThbM10gPSB7LTM0MS40NywgLTcxOS4zMCwgNzkwMi41OX07CitzdGF0aWMgZmxvYXQgUDA1OVszXSA9IHsyNTIuNTcsIC03NTYuMTIsIDc5MDIuNTl9Oworc3RhdGljIGZsb2F0IFAwNjBbM10gPSB7NDU4LjM5LCAtMjY1LjMxLCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDYyWzNdID0gezIyNC4wNCwgNDM4Ljk4LCA5MzY0Ljc3fTsKK3N0YXRpYyBmbG9hdCBQMDYzWzNdID0gey0xNjUuNzEsIDQ0MS4yNywgOTM1NS40NH07CitzdGF0aWMgZmxvYXQgUDA2NVszXSA9IHstNDczLjk5LCAtMjE5LjcxLCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBQMDY2WzNdID0gey0yMTEuOTcsIC00NzkuODcsIDkzNTUuNDR9Oworc3RhdGljIGZsb2F0IFAwNjdbM10gPSB7MTkyLjg2LCAtNTA0LjAzLCA5MzU1LjQ0fTsKK3N0YXRpYyBmbG9hdCBpUDA2OFszXSA9IHstMTEyLjQ0LCA5LjI1LCAtNjQuNDJ9Oworc3RhdGljIGZsb2F0IGlQMDY5WzNdID0gezExNTUuNjMsIDAuMDAsIC0xODIuNDZ9Oworc3RhdGljIGZsb2F0IGlQMDcwWzNdID0gey0xMTQzLjEzLCAwLjAwLCAtMTgxLjU0fTsKK3N0YXRpYyBmbG9hdCBpUDA3MVszXSA9IHsxNDI0LjIzLCAwLjAwLCAtMzIyLjA5fTsKK3N0YXRpYyBmbG9hdCBpUDA3MlszXSA9IHstMTM2OC4wMSwgMC4wMCwgLTMxMC4zOH07CitzdGF0aWMgZmxvYXQgaVAwNzNbM10gPSB7MTI1NS41NywgMi4zMSwgMTE0LjA1fTsKK3N0YXRpYyBmbG9hdCBpUDA3NFszXSA9IHstMTE0OS4zOCwgMC4wMCwgMTE3LjEyfTsKK3N0YXRpYyBmbG9hdCBpUDA3NVszXSA9IHs3MTguMzYsIDAuMDAsIDQzMy4zNn07CitzdGF0aWMgZmxvYXQgaVAwNzZbM10gPSB7LTY1NS45MCwgMC4wMCwgNDMzLjM2fTsKK3N0YXRpYyBmbG9hdCBQMDY4WzNdID0gey0xMTIuNDQsIDkuMjUsIC02NC40Mn07CitzdGF0aWMgZmxvYXQgUDA2OVszXSA9IHsxMTU1LjYzLCAwLjAwLCAtMTgyLjQ2fTsKK3N0YXRpYyBmbG9hdCBQMDcwWzNdID0gey0xMTQzLjEzLCAwLjAwLCAtMTgxLjU0fTsKK3N0YXRpYyBmbG9hdCBQMDcxWzNdID0gezE0MjQuMjMsIDAuMDAsIC0zMjIuMDl9Oworc3RhdGljIGZsb2F0IFAwNzJbM10gPSB7LTEzNjguMDEsIDAuMDAsIC0zMTAuMzh9Oworc3RhdGljIGZsb2F0IFAwNzNbM10gPSB7MTI1NS41NywgMi4zMSwgMTE0LjA1fTsKK3N0YXRpYyBmbG9hdCBQMDc0WzNdID0gey0xMTQ5LjM4LCAwLjAwLCAxMTcuMTJ9Oworc3RhdGljIGZsb2F0IFAwNzVbM10gPSB7NzE4LjM2LCAwLjAwLCA0MzMuMzZ9Oworc3RhdGljIGZsb2F0IFAwNzZbM10gPSB7LTY1NS45MCwgMC4wMCwgNDMzLjM2fTsKK3N0YXRpYyBmbG9hdCBQMDc3WzNdID0gezEwNTguMDAsIC0yLjY2LCA3OTIzLjUxfTsKK3N0YXRpYyBmbG9hdCBQMDc4WzNdID0gey0xMDE2LjUxLCAtMTUuNDcsIDc5MDIuODd9Oworc3RhdGljIGZsb2F0IFAwNzlbM10gPSB7LTEzNjMuOTksIC00ODQuNTAsIDc1OTMuMzh9Oworc3RhdGljIGZsb2F0IFAwODBbM10gPSB7MTQ3OC4wOSwgLTg2MS40NywgNzA5OC4xMn07CitzdGF0aWMgZmxvYXQgUDA4MVszXSA9IHsxMzM4LjA2LCAtMjg0LjY4LCA3MDI0LjE1fTsKK3N0YXRpYyBmbG9hdCBQMDgyWzNdID0gey0xNTQ1LjUxLCAtODYwLjY0LCA3MTA2LjYwfTsKK3N0YXRpYyBmbG9hdCBQMDgzWzNdID0gezEwNjMuMTksIC03MC40NiwgNzQ2Ni42MH07CitzdGF0aWMgZmxvYXQgUDA4NFszXSA9IHstMTM2OS4xOCwgLTI4OC4xMSwgNzAxNS4zNH07CitzdGF0aWMgZmxvYXQgUDA4NVszXSA9IHsxMzQ4LjQ0LCAtNDgyLjUwLCA3NTkxLjQxfTsKK3N0YXRpYyBmbG9hdCBQMDg2WzNdID0gey0xMDE1LjQ1LCAtOTYuODAsIDc0NzQuODZ9Oworc3RhdGljIGZsb2F0IFAwODdbM10gPSB7NzMxLjA0LCAxNDguMzgsIDc2ODIuNTh9Oworc3RhdGljIGZsb2F0IFAwODhbM10gPSB7LTY5Ny4wMywgMTUxLjgyLCA3NjY4LjgxfTsKK3N0YXRpYyBmbG9hdCBQMDg5WzNdID0gey02ODYuODIsIDE1Ny4wOSwgNzkyMi4yOX07CitzdGF0aWMgZmxvYXQgUDA5MFszXSA9IHs3MjQuNzMsIDE0Ny43NSwgNzkzMS4zOX07CitzdGF0aWMgZmxvYXQgaVAwOTFbM10gPSB7MC4wMCwgMzI3LjEwLCAyMzQ2LjU1fTsKK3N0YXRpYyBmbG9hdCBpUDA5MlszXSA9IHswLjAwLCA1NTIuMjgsIDIzMTEuMzF9Oworc3RhdGljIGZsb2F0IGlQMDkzWzNdID0gezAuMDAsIDcyMS4xNiwgMjE2Ni40MX07CitzdGF0aWMgZmxvYXQgaVAwOTRbM10gPSB7MC4wMCwgNjkzLjQyLCAyMzg4LjgwfTsKK3N0YXRpYyBmbG9hdCBpUDA5NVszXSA9IHswLjAwLCAzODkuNDQsIDI4NTkuOTd9Oworc3RhdGljIGZsb2F0IFAwOTFbM10gPSB7MC4wMCwgMzI3LjEwLCAyMzQ2LjU1fTsKK3N0YXRpYyBmbG9hdCBQMDkyWzNdID0gezAuMDAsIDU1Mi4yOCwgMjMxMS4zMX07CitzdGF0aWMgZmxvYXQgUDA5M1szXSA9IHswLjAwLCA3MjEuMTYsIDIxNjYuNDF9Oworc3RhdGljIGZsb2F0IFAwOTRbM10gPSB7MC4wMCwgNjkzLjQyLCAyMzg4LjgwfTsKK3N0YXRpYyBmbG9hdCBQMDk1WzNdID0gezAuMDAsIDM4OS40NCwgMjg1OS45N307CitzdGF0aWMgZmxvYXQgaVAwOTZbM10gPSB7MjIyLjAyLCAtMTgzLjY3LCAxMDI2Ni44OX07CitzdGF0aWMgZmxvYXQgaVAwOTdbM10gPSB7LTEyOC45MCwgLTE4Mi43MCwgMTAyNjYuODl9Oworc3RhdGljIGZsb2F0IGlQMDk4WzNdID0gezQxLjA0LCA4OC4zMSwgMTA2NTkuMzZ9Oworc3RhdGljIGZsb2F0IGlQMDk5WzNdID0gey00OC43MywgODguMzAsIDEwNjU5LjM2fTsKK3N0YXRpYyBmbG9hdCBQMDk2WzNdID0gezIyMi4wMiwgLTE4My42NywgMTAyNjYuODl9Oworc3RhdGljIGZsb2F0IFAwOTdbM10gPSB7LTEyOC45MCwgLTE4Mi43MCwgMTAyNjYuODl9Oworc3RhdGljIGZsb2F0IFAwOThbM10gPSB7NDEuMDQsIDg4LjMxLCAxMDY1OS4zNn07CitzdGF0aWMgZmxvYXQgUDA5OVszXSA9IHstNDguNzMsIDg4LjMwLCAxMDY1OS4zNn07CitzdGF0aWMgZmxvYXQgUDEwMFszXSA9IHswLjAwLCA2MDMuNDIsIDkzNDAuNjh9Oworc3RhdGljIGZsb2F0IFAxMDRbM10gPSB7LTkuODYsIDU2Ny42MiwgNzg1OC42NX07CitzdGF0aWMgZmxvYXQgUDEwNVszXSA9IHszMS45NiwgNTY1LjI3LCA3OTA4LjQ2fTsKK3N0YXRpYyBmbG9hdCBQMTA2WzNdID0gezIyLjc1LCA1NjguMTMsIDc3ODIuODN9Oworc3RhdGljIGZsb2F0IFAxMDdbM10gPSB7NTguOTMsIDU2OC40MiwgNzc3NS45NH07CitzdGF0aWMgZmxvYXQgUDEwOFszXSA9IHs1NS45MSwgNTY1LjU5LCA3OTA1Ljg2fTsKK3N0YXRpYyBmbG9hdCBQMTA5WzNdID0gezk5LjIxLCA1NjYuMDAsIDc4NTguNjV9Oworc3RhdGljIGZsb2F0IFAxMTBbM10gPSB7LTQ5OC44MywgMTQ4LjE0LCA5MTM1LjEwfTsKK3N0YXRpYyBmbG9hdCBQMTExWzNdID0gey00OTUuNDYsIDEzMy4yNCwgOTE1OC40OH07CitzdGF0aWMgZmxvYXQgUDExMlszXSA9IHstNDkwLjgyLCAxNDYuMjMsIDkxODIuNzZ9Oworc3RhdGljIGZsb2F0IFAxMTNbM10gPSB7LTQ4OS41NSwgMTc0LjExLCA5MTgzLjY2fTsKK3N0YXRpYyBmbG9hdCBQMTE0WzNdID0gey00OTIuOTIsIDE4OS4wMCwgOTE2MC4yOH07CitzdGF0aWMgZmxvYXQgUDExNVszXSA9IHstNDk3LjU2LCAxNzYuMDIsIDkxMzYuMDB9Oworc3RhdGljIGZsb2F0IFAxMTZbM10gPSB7NTI2LjU0LCAxNjkuNjgsIDkxMzcuNzB9Oworc3RhdGljIGZsb2F0IFAxMTdbM10gPSB7NTIzLjQ5LCAxODQuODUsIDkxNjEuNDJ9Oworc3RhdGljIGZsb2F0IFAxMThbM10gPSB7NTE4LjU2LCAxNzEuNzgsIDkxODYuMDZ9Oworc3RhdGljIGZsb2F0IFAxMTlbM10gPSB7NTE2LjY4LCAxNDMuNTMsIDkxODYuOTh9Oworc3RhdGljIGZsb2F0IFAxMjBbM10gPSB7NTE5LjczLCAxMjguMzYsIDkxNjMuMjZ9Oworc3RhdGljIGZsb2F0IFAxMjFbM10gPSB7NTI0LjY2LCAxNDEuNDMsIDkxMzguNjJ9OworLyogKklOREVOVC1PTiogKi8KKwordm9pZAorV2hhbGUwMDEodm9pZCkKK3sKKworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjgpOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsTm9ybWFsM2Z2KE4wNzYpOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTApOworICAgIGdsVmVydGV4M2Z2KFAwMTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbE5vcm1hbDNmdihOMDc2KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsTm9ybWFsM2Z2KE4wNzIpOworICAgIGdsVmVydGV4M2Z2KFAwNzIpOworICAgIGdsTm9ybWFsM2Z2KE4wNzQpOworICAgIGdsVmVydGV4M2Z2KFAwNzQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDcyKTsKKyAgICBnbFZlcnRleDNmdihQMDcyKTsKKyAgICBnbE5vcm1hbDNmdihOMDcwKTsKKyAgICBnbFZlcnRleDNmdihQMDcwKTsKKyAgICBnbE5vcm1hbDNmdihOMDc0KTsKKyAgICBnbFZlcnRleDNmdihQMDc0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzApOworICAgIGdsVmVydGV4M2Z2KFAwNzApOworICAgIGdsTm9ybWFsM2Z2KE4wNjgpOworICAgIGdsVmVydGV4M2Z2KFAwNjgpOworICAgIGdsTm9ybWFsM2Z2KE4wNzYpOworICAgIGdsVmVydGV4M2Z2KFAwNzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc2KTsKKyAgICBnbFZlcnRleDNmdihQMDc2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY4KTsKKyAgICBnbFZlcnRleDNmdihQMDY4KTsKKyAgICBnbE5vcm1hbDNmdihOMDEwKTsKKyAgICBnbFZlcnRleDNmdihQMDEwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMDIodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc1KTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbE5vcm1hbDNmdihOMDA5KTsKKyAgICBnbFZlcnRleDNmdihQMDA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsTm9ybWFsM2Z2KE4wNzUpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsTm9ybWFsM2Z2KE4wNzMpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDcxKTsKKyAgICBnbFZlcnRleDNmdihQMDcxKTsKKyAgICBnbE5vcm1hbDNmdihOMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbE5vcm1hbDNmdihOMDczKTsKKyAgICBnbFZlcnRleDNmdihQMDczKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDkpOworICAgIGdsVmVydGV4M2Z2KFAwMDkpOworICAgIGdsTm9ybWFsM2Z2KE4wMTEpOworICAgIGdsVmVydGV4M2Z2KFAwMTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNzUpOworICAgIGdsVmVydGV4M2Z2KFAwNzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDExKTsKKyAgICBnbFZlcnRleDNmdihQMDExKTsKKyAgICBnbE5vcm1hbDNmdihOMDY5KTsKKyAgICBnbFZlcnRleDNmdihQMDY5KTsKKyAgICBnbE5vcm1hbDNmdihOMDc1KTsKKyAgICBnbFZlcnRleDNmdihQMDc1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA3NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjkpOworICAgIGdsVmVydGV4M2Z2KFAwNjkpOworICAgIGdsTm9ybWFsM2Z2KE4wNzEpOworICAgIGdsVmVydGV4M2Z2KFAwNzEpOworICAgIGdsTm9ybWFsM2Z2KE4wNzMpOworICAgIGdsVmVydGV4M2Z2KFAwNzMpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDAzKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE4KTsKKyAgICBnbFZlcnRleDNmdihQMDE4KTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE3KTsKKyAgICBnbFZlcnRleDNmdihQMDE3KTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDEpOworICAgIGdsVmVydGV4M2Z2KFAwMDEpOworICAgIGdsTm9ybWFsM2Z2KE4wMTYpOworICAgIGdsVmVydGV4M2Z2KFAwMTYpOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAxKTsKKyAgICBnbFZlcnRleDNmdihQMDAxKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAxNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMDQodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTQpOworICAgIGdsVmVydGV4M2Z2KFAwMTQpOworICAgIGdsTm9ybWFsM2Z2KE4wMTUpOworICAgIGdsVmVydGV4M2Z2KFAwMTUpOworICAgIGdsTm9ybWFsM2Z2KE4wMjMpOworICAgIGdsVmVydGV4M2Z2KFAwMjMpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE1KTsKKyAgICBnbFZlcnRleDNmdihQMDE1KTsKKyAgICBnbE5vcm1hbDNmdihOMDE2KTsKKyAgICBnbFZlcnRleDNmdihQMDE2KTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDIzKTsKKyAgICBnbFZlcnRleDNmdihQMDIzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNik7CisgICAgZ2xOb3JtYWwzZnYoTjAxNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTcpOworICAgIGdsVmVydGV4M2Z2KFAwMTcpOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjUpOworICAgIGdsVmVydGV4M2Z2KFAwMjUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDEzKTsKKyAgICBnbFZlcnRleDNmdihQMDEzKTsKKyAgICBnbE5vcm1hbDNmdihOMDE0KTsKKyAgICBnbFZlcnRleDNmdihQMDE0KTsKKyAgICBnbE5vcm1hbDNmdihOMDIyKTsKKyAgICBnbFZlcnRleDNmdihQMDIyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMik7CisgICAgZ2xOb3JtYWwzZnYoTjAxMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAxMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMTgpOworICAgIGdsVmVydGV4M2Z2KFAwMTgpOworICAgIGdsTm9ybWFsM2Z2KE4wMTkpOworICAgIGdsVmVydGV4M2Z2KFAwMTkpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDE5KTsKKyAgICBnbFZlcnRleDNmdihQMDE5KTsKKyAgICBnbE5vcm1hbDNmdihOMDEyKTsKKyAgICBnbFZlcnRleDNmdihQMDEyKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI3KTsKKyAgICBnbFZlcnRleDNmdihQMDI3KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAwNSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjIpOworICAgIGdsVmVydGV4M2Z2KFAwMjIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIxKTsKKyAgICBnbFZlcnRleDNmdihQMDIxKTsKKyAgICBnbE5vcm1hbDNmdihOMDMwKTsKKyAgICBnbFZlcnRleDNmdihQMDMwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjQpOworICAgIGdsVmVydGV4M2Z2KFAwMjQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI0KTsKKyAgICBnbFZlcnRleDNmdihQMDI0KTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjApOworICAgIGdsVmVydGV4M2Z2KFAwMjApOworICAgIGdsTm9ybWFsM2Z2KE4wMjEpOworICAgIGdsVmVydGV4M2Z2KFAwMjEpOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDIwKTsKKyAgICBnbFZlcnRleDNmdihQMDIwKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI1KTsKKyAgICBnbFZlcnRleDNmdihQMDI1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI2KTsKKyAgICBnbFZlcnRleDNmdihQMDI2KTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjAyNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyNik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjYpOworICAgIGdsVmVydGV4M2Z2KFAwMjYpOworICAgIGdsTm9ybWFsM2Z2KE4wMjcpOworICAgIGdsVmVydGV4M2Z2KFAwMjcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDA2KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDkyKTsKKyAgICBnbFZlcnRleDNmdihQMDkyKTsKKyAgICBnbE5vcm1hbDNmdihOMDkzKTsKKyAgICBnbFZlcnRleDNmdihQMDkzKTsKKyAgICBnbE5vcm1hbDNmdihOMDk0KTsKKyAgICBnbFZlcnRleDNmdihQMDk0KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA5NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTIpOworICAgIGdsVmVydGV4M2Z2KFAwOTIpOworICAgIGdsTm9ybWFsM2Z2KE4wOTEpOworICAgIGdsVmVydGV4M2Z2KFAwOTEpOworICAgIGdsTm9ybWFsM2Z2KE4wOTUpOworICAgIGdsVmVydGV4M2Z2KFAwOTUpOworICAgIGdsTm9ybWFsM2Z2KE4wOTQpOworICAgIGdsVmVydGV4M2Z2KFAwOTQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDkxKTsKKyAgICBnbFZlcnRleDNmdihQMDkxKTsKKyAgICBnbE5vcm1hbDNmdihOMDkyKTsKKyAgICBnbFZlcnRleDNmdihQMDkyKTsKKyAgICBnbE5vcm1hbDNmdihOMDk0KTsKKyAgICBnbFZlcnRleDNmdihQMDk0KTsKKyAgICBnbE5vcm1hbDNmdihOMDk1KTsKKyAgICBnbFZlcnRleDNmdihQMDk1KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAwNyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjkpOworICAgIGdsVmVydGV4M2Z2KFAwMjkpOworICAgIGdsTm9ybWFsM2Z2KE4wMzApOworICAgIGdsVmVydGV4M2Z2KFAwMzApOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDI5KTsKKyAgICBnbFZlcnRleDNmdihQMDI5KTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAyOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAyOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAyOSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMjgpOworICAgIGdsVmVydGV4M2Z2KFAwMjgpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM1KTsKKyAgICBnbFZlcnRleDNmdihQMDM1KTsKKyAgICBnbE5vcm1hbDNmdihOMDI4KTsKKyAgICBnbFZlcnRleDNmdihQMDI4KTsKKyAgICBnbE5vcm1hbDNmdihOMDM2KTsKKyAgICBnbFZlcnRleDNmdihQMDM2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNSk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzQpOworICAgIGdsVmVydGV4M2Z2KFAwMzQpOworICAgIGdsTm9ybWFsM2Z2KE4wMzUpOworICAgIGdsVmVydGV4M2Z2KFAwMzUpOworICAgIGdsTm9ybWFsM2Z2KE4wNDMpOworICAgIGdsVmVydGV4M2Z2KFAwNDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDIpOworICAgIGdsVmVydGV4M2Z2KFAwNDIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDMzKTsKKyAgICBnbFZlcnRleDNmdihQMDMzKTsKKyAgICBnbE5vcm1hbDNmdihOMDM0KTsKKyAgICBnbFZlcnRleDNmdihQMDM0KTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzEpOworICAgIGdsVmVydGV4M2Z2KFAwMzEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzIpOworICAgIGdsVmVydGV4M2Z2KFAwMzIpOworICAgIGdsTm9ybWFsM2Z2KE4wMzkpOworICAgIGdsVmVydGV4M2Z2KFAwMzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDMyKTsKKyAgICBnbFZlcnRleDNmdihQMDMyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMik7CisgICAgZ2xOb3JtYWwzZnYoTjAzMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wMzMpOworICAgIGdsVmVydGV4M2Z2KFAwMzMpOworICAgIGdsTm9ybWFsM2Z2KE4wNDEpOworICAgIGdsVmVydGV4M2Z2KFAwNDEpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDA4KHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDQzKTsKKyAgICBnbFZlcnRleDNmdihQMDQzKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Myk7CisgICAgZ2xOb3JtYWwzZnYoTjAzNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzNik7CisgICAgZ2xOb3JtYWwzZnYoTjA1MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQxKTsKKyAgICBnbFZlcnRleDNmdihQMDQxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQyKTsKKyAgICBnbFZlcnRleDNmdihQMDQyKTsKKyAgICBnbE5vcm1hbDNmdihOMDUwKTsKKyAgICBnbFZlcnRleDNmdihQMDUwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzYpOworICAgIGdsVmVydGV4M2Z2KFAwMzYpOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDM3KTsKKyAgICBnbFZlcnRleDNmdihQMDM3KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDApOworICAgIGdsVmVydGV4M2Z2KFAwNDApOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM5KTsKKyAgICBnbFZlcnRleDNmdihQMDM5KTsKKyAgICBnbE5vcm1hbDNmdihOMDQwKTsKKyAgICBnbFZlcnRleDNmdihQMDQwKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMzcpOworICAgIGdsVmVydGV4M2Z2KFAwMzcpOworICAgIGdsTm9ybWFsM2Z2KE4wMzgpOworICAgIGdsVmVydGV4M2Z2KFAwMzgpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDM4KTsKKyAgICBnbFZlcnRleDNmdihQMDM4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ1KTsKKyAgICBnbFZlcnRleDNmdihQMDQ1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAzOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOCk7CisgICAgZ2xOb3JtYWwzZnYoTjAzOSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAzOSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMDkodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTApOworICAgIGdsVmVydGV4M2Z2KFAwNTApOworICAgIGdsTm9ybWFsM2Z2KE4wNTEpOworICAgIGdsVmVydGV4M2Z2KFAwNTEpOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUxKTsKKyAgICBnbFZlcnRleDNmdihQMDUxKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDQpOworICAgIGdsVmVydGV4M2Z2KFAwNDQpOworICAgIGdsTm9ybWFsM2Z2KE4wNDUpOworICAgIGdsVmVydGV4M2Z2KFAwNDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ0KTsKKyAgICBnbFZlcnRleDNmdihQMDQ0KTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDkpOworICAgIGdsVmVydGV4M2Z2KFAwNDkpOworICAgIGdsTm9ybWFsM2Z2KE4wNTgpOworICAgIGdsVmVydGV4M2Z2KFAwNTgpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ4KTsKKyAgICBnbFZlcnRleDNmdihQMDQ4KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ5KTsKKyAgICBnbFZlcnRleDNmdihQMDQ5KTsKKyAgICBnbE5vcm1hbDNmdihOMDU3KTsKKyAgICBnbFZlcnRleDNmdihQMDU3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDcpOworICAgIGdsVmVydGV4M2Z2KFAwNDcpOworICAgIGdsTm9ybWFsM2Z2KE4wNDgpOworICAgIGdsVmVydGV4M2Z2KFAwNDgpOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA0NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA0Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA0Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNDYpOworICAgIGdsVmVydGV4M2Z2KFAwNDYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDQ2KTsKKyAgICBnbFZlcnRleDNmdihQMDQ2KTsKKyAgICBnbE5vcm1hbDNmdihOMDQ3KTsKKyAgICBnbFZlcnRleDNmdihQMDQ3KTsKKyAgICBnbE5vcm1hbDNmdihOMDU1KTsKKyAgICBnbFZlcnRleDNmdihQMDU1KTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxMCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODEpOworICAgIGdsVmVydGV4M2Z2KFAwODEpOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsTm9ybWFsM2Z2KE4wODcpOworICAgIGdsVmVydGV4M2Z2KFAwODcpOworICAgIGdsTm9ybWFsM2Z2KE4wOTApOworICAgIGdsVmVydGV4M2Z2KFAwOTApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDgxKTsKKyAgICBnbFZlcnRleDNmdihQMDgxKTsKKyAgICBnbE5vcm1hbDNmdihOMDgwKTsKKyAgICBnbFZlcnRleDNmdihQMDgwKTsKKyAgICBnbE5vcm1hbDNmdihOMDg1KTsKKyAgICBnbFZlcnRleDNmdihQMDg1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Myk7CisgICAgZ2xOb3JtYWwzZnYoTjA4MSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4MSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODMpOworICAgIGdsVmVydGV4M2Z2KFAwODMpOworICAgIGdsTm9ybWFsM2Z2KE4wODUpOworICAgIGdsVmVydGV4M2Z2KFAwODUpOworICAgIGdsTm9ybWFsM2Z2KE4wNzcpOworICAgIGdsVmVydGV4M2Z2KFAwNzcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg3KTsKKyAgICBnbFZlcnRleDNmdihQMDg3KTsKKyAgICBnbE5vcm1hbDNmdihOMDgzKTsKKyAgICBnbFZlcnRleDNmdihQMDgzKTsKKyAgICBnbE5vcm1hbDNmdihOMDc3KTsKKyAgICBnbFZlcnRleDNmdihQMDc3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA3Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5MCk7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMTEodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODIpOworICAgIGdsVmVydGV4M2Z2KFAwODIpOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wNzkpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg0KTsKKyAgICBnbFZlcnRleDNmdihQMDg0KTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDc5KTsKKyAgICBnbFZlcnRleDNmdihQMDc5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wODgpOworICAgIGdsVmVydGV4M2Z2KFAwODgpOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg4KTsKKyAgICBnbFZlcnRleDNmdihQMDg4KTsKKyAgICBnbE5vcm1hbDNmdihOMDg5KTsKKyAgICBnbFZlcnRleDNmdihQMDg5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA4OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODkpOworICAgIGdsVmVydGV4M2Z2KFAwODkpOworICAgIGdsTm9ybWFsM2Z2KE4wODYpOworICAgIGdsVmVydGV4M2Z2KFAwODYpOworICAgIGdsTm9ybWFsM2Z2KE4wNzgpOworICAgIGdsVmVydGV4M2Z2KFAwNzgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDg2KTsKKyAgICBnbFZlcnRleDNmdihQMDg2KTsKKyAgICBnbE5vcm1hbDNmdihOMDg0KTsKKyAgICBnbFZlcnRleDNmdihQMDg0KTsKKyAgICBnbE5vcm1hbDNmdihOMDc4KTsKKyAgICBnbFZlcnRleDNmdihQMDc4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA3OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA4NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA4NCk7CisgICAgZ2xOb3JtYWwzZnYoTjA3OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA3OSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wODQpOworICAgIGdsVmVydGV4M2Z2KFAwODQpOworICAgIGdsTm9ybWFsM2Z2KE4wODIpOworICAgIGdsVmVydGV4M2Z2KFAwODIpOworICAgIGdsTm9ybWFsM2Z2KE4wNzkpOworICAgIGdsVmVydGV4M2Z2KFAwNzkpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK1doYWxlMDEyKHZvaWQpCit7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDU5KTsKKyAgICBnbFZlcnRleDNmdihQMDU5KTsKKyAgICBnbE5vcm1hbDNmdihOMDY3KTsKKyAgICBnbFZlcnRleDNmdihQMDY3KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Mik7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTkpOworICAgIGdsVmVydGV4M2Z2KFAwNTkpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wNjcpOworICAgIGdsVmVydGV4M2Z2KFAwNjcpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU4KTsKKyAgICBnbFZlcnRleDNmdihQMDU4KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1OCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1OCk7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wNTcpOworICAgIGdsVmVydGV4M2Z2KFAwNTcpOworICAgIGdsTm9ybWFsM2Z2KE4wNjUpOworICAgIGdsVmVydGV4M2Z2KFAwNjUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU2KTsKKyAgICBnbFZlcnRleDNmdihQMDU2KTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Nik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTYpOworICAgIGdsVmVydGV4M2Z2KFAwNTYpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDU0KTsKKyAgICBnbFZlcnRleDNmdihQMDU0KTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xOb3JtYWwzZnYoTjA1Myk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1Myk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTMpOworICAgIGdsVmVydGV4M2Z2KFAwNTMpOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDUzKTsKKyAgICBnbFZlcnRleDNmdihQMDUzKTsKKyAgICBnbE5vcm1hbDNmdihOMDYwKTsKKyAgICBnbFZlcnRleDNmdihQMDYwKTsKKyAgICBnbE5vcm1hbDNmdihOMDUyKTsKKyAgICBnbFZlcnRleDNmdihQMDUyKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxMyh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nik7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wOTcpOworICAgIGdsVmVydGV4M2Z2KFAwOTcpOworICAgIGdsTm9ybWFsM2Z2KE4wOTYpOworICAgIGdsVmVydGV4M2Z2KFAwOTYpOworICAgIGdsTm9ybWFsM2Z2KE4wOTgpOworICAgIGdsVmVydGV4M2Z2KFAwOTgpOworICAgIGdsTm9ybWFsM2Z2KE4wOTkpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDY1KTsKKyAgICBnbFZlcnRleDNmdihQMDY1KTsKKyAgICBnbE5vcm1hbDNmdihOMDY2KTsKKyAgICBnbFZlcnRleDNmdihQMDY2KTsKKyAgICBnbE5vcm1hbDNmdihOMDk3KTsKKyAgICBnbFZlcnRleDNmdihQMDk3KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Nyk7CisgICAgZ2xOb3JtYWwzZnYoTjA2MCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2MCk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nik7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNjApOworICAgIGdsVmVydGV4M2Z2KFAwNjApOworICAgIGdsTm9ybWFsM2Z2KE4wMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsTm9ybWFsM2Z2KE4wOTYpOworICAgIGdsVmVydGV4M2Z2KFAwOTYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDk2KTsKKyAgICBnbFZlcnRleDNmdihQMDk2KTsKKyAgICBnbE5vcm1hbDNmdihOMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbE5vcm1hbDNmdihOMDk4KTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjA2NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2NSk7CisgICAgZ2xOb3JtYWwzZnYoTjA5Nyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA5Nyk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsTm9ybWFsM2Z2KE4wOTcpOworICAgIGdsVmVydGV4M2Z2KFAwOTcpOworICAgIGdsTm9ybWFsM2Z2KE4wOTkpOworICAgIGdsVmVydGV4M2Z2KFAwOTkpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMDA1KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDk5KTsKKyAgICBnbFZlcnRleDNmdihQMDk4KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxNCh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwNSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAwMDYpOworICAgIGdsVmVydGV4M2Z2KFAwMDUpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDA2KTsKKyAgICBnbFZlcnRleDNmdihQMDA2KTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjAwNik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwNik7CisgICAgZ2xOb3JtYWwzZnYoTjAwOCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwOCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDIpOworICAgIGdsVmVydGV4M2Z2KFAwMDIpOworICAgIGdsTm9ybWFsM2Z2KE4wMDgpOworICAgIGdsVmVydGV4M2Z2KFAwMDgpOworICAgIGdsTm9ybWFsM2Z2KE4wMDQpOworICAgIGdsVmVydGV4M2Z2KFAwMDQpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDYyKTsKKyAgICBnbFZlcnRleDNmdihQMDYyKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbE5vcm1hbDNmdihOMDA0KTsKKyAgICBnbFZlcnRleDNmdihQMDA0KTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkCitXaGFsZTAxNSh2b2lkKQoreworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjA1NSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NSk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wMDMpOworICAgIGdsVmVydGV4M2Z2KFAwMDMpOworICAgIGdsTm9ybWFsM2Z2KE4wNTUpOworICAgIGdsVmVydGV4M2Z2KFAwNTUpOworICAgIGdsTm9ybWFsM2Z2KE4wNjMpOworICAgIGdsVmVydGV4M2Z2KFAwNjMpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMDAzKTsKKyAgICBnbFZlcnRleDNmdihQMDAzKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjAwMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMyk7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjA1NCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDA1NCk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsTm9ybWFsM2Z2KE4wNTQpOworICAgIGdsVmVydGV4M2Z2KFAwNTQpOworICAgIGdsTm9ybWFsM2Z2KE4xMDApOworICAgIGdsVmVydGV4M2Z2KFAxMDApOworICAgIGdsTm9ybWFsM2Z2KE4wNjIpOworICAgIGdsVmVydGV4M2Z2KFAwNjIpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbE5vcm1hbDNmdihOMTAwKTsKKyAgICBnbFZlcnRleDNmdihQMTAwKTsKKyAgICBnbE5vcm1hbDNmdihOMDYzKTsKKyAgICBnbFZlcnRleDNmdihQMDYzKTsKKyAgICBnbE5vcm1hbDNmdihOMDAyKTsKKyAgICBnbFZlcnRleDNmdihQMDAyKTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xOb3JtYWwzZnYoTjEwMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDEwMCk7CisgICAgZ2xOb3JtYWwzZnYoTjAwMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDAwMik7CisgICAgZ2xOb3JtYWwzZnYoTjA2Mik7CisgICAgZ2xWZXJ0ZXgzZnYoUDA2Mik7CisgICAgZ2xFbmQoKTsKK30KKwordm9pZAorV2hhbGUwMTYodm9pZCkKK3sKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAxMDQpOworICAgIGdsVmVydGV4M2Z2KFAxMDUpOworICAgIGdsVmVydGV4M2Z2KFAxMDYpOworICAgIGdsRW5kKCk7CisgICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKyAgICBnbFZlcnRleDNmdihQMTA3KTsKKyAgICBnbFZlcnRleDNmdihQMTA4KTsKKyAgICBnbFZlcnRleDNmdihQMTA5KTsKKyAgICBnbEVuZCgpOworICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMSk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMik7CisgICAgZ2xWZXJ0ZXgzZnYoUDExMyk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNCk7CisgICAgZ2xWZXJ0ZXgzZnYoUDExNSk7CisgICAgZ2xFbmQoKTsKKyAgICBnbEJlZ2luKEdMX1BPTFlHT04pOworICAgIGdsVmVydGV4M2Z2KFAxMTYpOworICAgIGdsVmVydGV4M2Z2KFAxMTcpOworICAgIGdsVmVydGV4M2Z2KFAxMTgpOworICAgIGdsVmVydGV4M2Z2KFAxMTkpOworICAgIGdsVmVydGV4M2Z2KFAxMjApOworICAgIGdsVmVydGV4M2Z2KFAxMjEpOworICAgIGdsRW5kKCk7Cit9CisKK3ZvaWQKK0RyYXdXaGFsZShmaXNoUmVjICogZmlzaCkKK3sKKyAgICBmbG9hdCBzZWcwLCBzZWcxLCBzZWcyLCBzZWczLCBzZWc0LCBzZWc1LCBzZWc2LCBzZWc3OworICAgIGZsb2F0IHBpdGNoLCB0aHJhc2gsIGNob21wOworCisgICAgZmlzaC0+aHRhaWwgPSAoaW50KSAoZmlzaC0+aHRhaWwgLSAoaW50KSAoNS4wICogZmlzaC0+dikpICUgMzYwOworCisgICAgdGhyYXNoID0gNzAuMCAqIGZpc2gtPnY7CisKKyAgICBzZWcwID0gMS41ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCkgKiBSUkFEKTsKKyAgICBzZWcxID0gMi41ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDEwLjApICogUlJBRCk7CisgICAgc2VnMiA9IDMuNyAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyAxNS4wKSAqIFJSQUQpOworICAgIHNlZzMgPSA0LjggKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgMjMuMCkgKiBSUkFEKTsKKyAgICBzZWc0ID0gNi4wICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDI4LjApICogUlJBRCk7CisgICAgc2VnNSA9IDYuNSAqIHRocmFzaCAqIHNpbigoZmlzaC0+aHRhaWwgKyAzNS4wKSAqIFJSQUQpOworICAgIHNlZzYgPSA2LjUgKiB0aHJhc2ggKiBzaW4oKGZpc2gtPmh0YWlsICsgNDAuMCkgKiBSUkFEKTsKKyAgICBzZWc3ID0gNi41ICogdGhyYXNoICogc2luKChmaXNoLT5odGFpbCArIDU1LjApICogUlJBRCk7CisKKyAgICBwaXRjaCA9IGZpc2gtPnYgKiBzaW4oKGZpc2gtPmh0YWlsIC0gMTYwLjApICogUlJBRCk7CisKKyAgICBjaG9tcCA9IDAuMDsKKyAgICBpZiAoZmlzaC0+diA+IDIuMCkgeworICAgICAgICBjaG9tcCA9IC0oZmlzaC0+diAtIDIuMCkgKiAyMDAuMDsKKyAgICB9CisgICAgUDAxMlsxXSA9IGlQMDEyWzFdICsgc2VnNTsKKyAgICBQMDEzWzFdID0gaVAwMTNbMV0gKyBzZWc1OworICAgIFAwMTRbMV0gPSBpUDAxNFsxXSArIHNlZzU7CisgICAgUDAxNVsxXSA9IGlQMDE1WzFdICsgc2VnNTsKKyAgICBQMDE2WzFdID0gaVAwMTZbMV0gKyBzZWc1OworICAgIFAwMTdbMV0gPSBpUDAxN1sxXSArIHNlZzU7CisgICAgUDAxOFsxXSA9IGlQMDE4WzFdICsgc2VnNTsKKyAgICBQMDE5WzFdID0gaVAwMTlbMV0gKyBzZWc1OworCisgICAgUDAyMFsxXSA9IGlQMDIwWzFdICsgc2VnNDsKKyAgICBQMDIxWzFdID0gaVAwMjFbMV0gKyBzZWc0OworICAgIFAwMjJbMV0gPSBpUDAyMlsxXSArIHNlZzQ7CisgICAgUDAyM1sxXSA9IGlQMDIzWzFdICsgc2VnNDsKKyAgICBQMDI0WzFdID0gaVAwMjRbMV0gKyBzZWc0OworICAgIFAwMjVbMV0gPSBpUDAyNVsxXSArIHNlZzQ7CisgICAgUDAyNlsxXSA9IGlQMDI2WzFdICsgc2VnNDsKKyAgICBQMDI3WzFdID0gaVAwMjdbMV0gKyBzZWc0OworCisgICAgUDAyOFsxXSA9IGlQMDI4WzFdICsgc2VnMjsKKyAgICBQMDI5WzFdID0gaVAwMjlbMV0gKyBzZWcyOworICAgIFAwMzBbMV0gPSBpUDAzMFsxXSArIHNlZzI7CisgICAgUDAzMVsxXSA9IGlQMDMxWzFdICsgc2VnMjsKKyAgICBQMDMyWzFdID0gaVAwMzJbMV0gKyBzZWcyOworICAgIFAwMzNbMV0gPSBpUDAzM1sxXSArIHNlZzI7CisgICAgUDAzNFsxXSA9IGlQMDM0WzFdICsgc2VnMjsKKyAgICBQMDM1WzFdID0gaVAwMzVbMV0gKyBzZWcyOworCisgICAgUDAzNlsxXSA9IGlQMDM2WzFdICsgc2VnMTsKKyAgICBQMDM3WzFdID0gaVAwMzdbMV0gKyBzZWcxOworICAgIFAwMzhbMV0gPSBpUDAzOFsxXSArIHNlZzE7CisgICAgUDAzOVsxXSA9IGlQMDM5WzFdICsgc2VnMTsKKyAgICBQMDQwWzFdID0gaVAwNDBbMV0gKyBzZWcxOworICAgIFAwNDFbMV0gPSBpUDA0MVsxXSArIHNlZzE7CisgICAgUDA0MlsxXSA9IGlQMDQyWzFdICsgc2VnMTsKKyAgICBQMDQzWzFdID0gaVAwNDNbMV0gKyBzZWcxOworCisgICAgUDA0NFsxXSA9IGlQMDQ0WzFdICsgc2VnMDsKKyAgICBQMDQ1WzFdID0gaVAwNDVbMV0gKyBzZWcwOworICAgIFAwNDZbMV0gPSBpUDA0NlsxXSArIHNlZzA7CisgICAgUDA0N1sxXSA9IGlQMDQ3WzFdICsgc2VnMDsKKyAgICBQMDQ4WzFdID0gaVAwNDhbMV0gKyBzZWcwOworICAgIFAwNDlbMV0gPSBpUDA0OVsxXSArIHNlZzA7CisgICAgUDA1MFsxXSA9IGlQMDUwWzFdICsgc2VnMDsKKyAgICBQMDUxWzFdID0gaVAwNTFbMV0gKyBzZWcwOworCisgICAgUDAwOVsxXSA9IGlQMDA5WzFdICsgc2VnNjsKKyAgICBQMDEwWzFdID0gaVAwMTBbMV0gKyBzZWc2OworICAgIFAwNzVbMV0gPSBpUDA3NVsxXSArIHNlZzY7CisgICAgUDA3NlsxXSA9IGlQMDc2WzFdICsgc2VnNjsKKworICAgIFAwMDFbMV0gPSBpUDAwMVsxXSArIHNlZzc7CisgICAgUDAxMVsxXSA9IGlQMDExWzFdICsgc2VnNzsKKyAgICBQMDY4WzFdID0gaVAwNjhbMV0gKyBzZWc3OworICAgIFAwNjlbMV0gPSBpUDA2OVsxXSArIHNlZzc7CisgICAgUDA3MFsxXSA9IGlQMDcwWzFdICsgc2VnNzsKKyAgICBQMDcxWzFdID0gaVAwNzFbMV0gKyBzZWc3OworICAgIFAwNzJbMV0gPSBpUDA3MlsxXSArIHNlZzc7CisgICAgUDA3M1sxXSA9IGlQMDczWzFdICsgc2VnNzsKKyAgICBQMDc0WzFdID0gaVAwNzRbMV0gKyBzZWc3OworCisgICAgUDA5MVsxXSA9IGlQMDkxWzFdICsgc2VnMyAqIDEuMTsKKyAgICBQMDkyWzFdID0gaVAwOTJbMV0gKyBzZWczOworICAgIFAwOTNbMV0gPSBpUDA5M1sxXSArIHNlZzM7CisgICAgUDA5NFsxXSA9IGlQMDk0WzFdICsgc2VnMzsKKyAgICBQMDk1WzFdID0gaVAwOTVbMV0gKyBzZWczICogMC45OworCisgICAgUDA5OVsxXSA9IGlQMDk5WzFdICsgY2hvbXA7CisgICAgUDA5OFsxXSA9IGlQMDk4WzFdICsgY2hvbXA7CisgICAgUDA5N1sxXSA9IGlQMDk3WzFdICsgY2hvbXA7CisgICAgUDA5NlsxXSA9IGlQMDk2WzFdICsgY2hvbXA7CisKKyAgICBnbFB1c2hNYXRyaXgoKTsKKworICAgIGdsUm90YXRlZihwaXRjaCwgMS4wLCAwLjAsIDAuMCk7CisKKyAgICBnbFRyYW5zbGF0ZWYoMC4wLCAwLjAsIDgwMDAuMCk7CisKKyAgICBnbFJvdGF0ZWYoMTgwLjAsIDAuMCwgMS4wLCAwLjApOworCisgICAgZ2xTY2FsZWYoMy4wLCAzLjAsIDMuMCk7CisKKyAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworCisgICAgV2hhbGUwMDEoKTsKKyAgICBXaGFsZTAwMigpOworICAgIFdoYWxlMDAzKCk7CisgICAgV2hhbGUwMDQoKTsKKyAgICBXaGFsZTAwNSgpOworICAgIFdoYWxlMDA2KCk7CisgICAgV2hhbGUwMDcoKTsKKyAgICBXaGFsZTAwOCgpOworICAgIFdoYWxlMDA5KCk7CisgICAgV2hhbGUwMTAoKTsKKyAgICBXaGFsZTAxMSgpOworICAgIFdoYWxlMDEyKCk7CisgICAgV2hhbGUwMTMoKTsKKyAgICBXaGFsZTAxNCgpOworICAgIFdoYWxlMDE1KCk7CisgICAgV2hhbGUwMTYoKTsKKworICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworCisgICAgZ2xQb3BNYXRyaXgoKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vbWFpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL1RlbXBsYXRlc0Zvclhjb2RlVGlnZXIvU0RMIE9wZW5HTCBBcHBsaWNhdGlvbi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3OTRiMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9UZW1wbGF0ZXNGb3JYY29kZVRpZ2VyL1NETCBPcGVuR0wgQXBwbGljYXRpb24vbWFpbi5jCkBAIC0wLDAgKzEsMTc5IEBACisKKy8qIFNpbXBsZSBwcm9ncmFtOiAgQ3JlYXRlIGEgYmxhbmsgd2luZG93LCB3YWl0IGZvciBrZXlwcmVzcywgcXVpdC4KKworICAgUGxlYXNlIHNlZSB0aGUgU0RMIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gdXNpbmcgdGhlIFNETCBBUEk6CisgICAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vU0RML2RvY3MuaHRtbAorKi8KKyAgIAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKK2V4dGVybiB2b2lkIEF0bGFudGlzX0luaXQgKCk7CitleHRlcm4gdm9pZCBBdGxhbnRpc19SZXNoYXBlIChpbnQgdywgaW50IGgpOworZXh0ZXJuIHZvaWQgQXRsYW50aXNfQW5pbWF0ZSAoKTsKK2V4dGVybiB2b2lkIEF0bGFudGlzX0Rpc3BsYXkgKCk7CisKK3N0YXRpYyBTRExfU3VyZmFjZSAqZ1NjcmVlbjsKKworc3RhdGljIHZvaWQgaW5pdEF0dHJpYnV0ZXMgKCkKK3sKKyAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzIHdlIHdhbnQgZm9yIHRoZSBPcGVuR0wgY29udGV4dAorICAgIAorICAgIGludCB2YWx1ZTsKKyAgICAKKyAgICAvLyBEb24ndCBzZXQgY29sb3IgYml0IHNpemVzIChTRExfR0xfUkVEX1NJWkUsIGV0YykKKyAgICAvLyAgICBNYWMgT1MgWCB3aWxsIGFsd2F5cyB1c2UgOC04LTgtOCBBUkdCIGZvciAzMi1iaXQgc2NyZWVucyBhbmQKKyAgICAvLyAgICA1LTUtNSBSR0IgZm9yIDE2LWJpdCBzY3JlZW5zCisgICAgCisgICAgLy8gUmVxdWVzdCBhIDE2LWJpdCBkZXB0aCBidWZmZXIgKHdpdGhvdXQgdGhpcywgdGhlcmUgaXMgbm8gZGVwdGggYnVmZmVyKQorICAgIHZhbHVlID0gMTY7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSAoU0RMX0dMX0RFUFRIX1NJWkUsIHZhbHVlKTsKKyAgICAKKyAgICAKKyAgICAvLyBSZXF1ZXN0IGRvdWJsZS1idWZmZXJlZCBPcGVuR0wKKyAgICAvLyAgICAgVGhlIGZhY3QgdGhhdCB3aW5kb3dzIGFyZSBkb3VibGUtYnVmZmVyZWQgb24gTWFjIE9TIFggaGFzIG5vIGVmZmVjdAorICAgIC8vICAgICBvbiBPcGVuR0wgZG91YmxlIGJ1ZmZlcmluZy4KKyAgICB2YWx1ZSA9IDE7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSAoU0RMX0dMX0RPVUJMRUJVRkZFUiwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBwcmludEF0dHJpYnV0ZXMgKCkKK3sKKyAgICAvLyBQcmludCBvdXQgYXR0cmlidXRlcyBvZiB0aGUgY29udGV4dCB3ZSBjcmVhdGVkCisgICAgaW50IG5BdHRyOworICAgIGludCBpOworICAgIAorICAgIGludCAgYXR0cltdID0geyBTRExfR0xfUkVEX1NJWkUsIFNETF9HTF9CTFVFX1NJWkUsIFNETF9HTF9HUkVFTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBTRExfR0xfQUxQSEFfU0laRSwgU0RMX0dMX0JVRkZFUl9TSVpFLCBTRExfR0xfREVQVEhfU0laRSB9OworICAgICAgICAgICAgICAgICAgICAKKyAgICBjaGFyICpkZXNjW10gPSB7ICJSZWQgc2l6ZTogJWQgYml0c1xuIiwgIkJsdWUgc2l6ZTogJWQgYml0c1xuIiwgIkdyZWVuIHNpemU6ICVkIGJpdHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAiQWxwaGEgc2l6ZTogJWQgYml0c1xuIiwgIkNvbG9yIGJ1ZmZlciBzaXplOiAlZCBiaXRzXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICJEZXB0aCBidWZlciBzaXplOiAlZCBiaXRzXG4iIH07CisKKyAgICBuQXR0ciA9IHNpemVvZihhdHRyKSAvIHNpemVvZihpbnQpOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBuQXR0cjsgaSsrKSB7CisgICAgCisgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgU0RMX0dMX0dldEF0dHJpYnV0ZSAoYXR0cltpXSwgJnZhbHVlKTsKKyAgICAgICAgcHJpbnRmIChkZXNjW2ldLCB2YWx1ZSk7CisgICAgfSAKK30KKworc3RhdGljIHZvaWQgY3JlYXRlU3VyZmFjZSAoaW50IGZ1bGxzY3JlZW4pCit7CisgICAgVWludDMyIGZsYWdzID0gMDsKKyAgICAKKyAgICBmbGFncyA9IFNETF9PUEVOR0w7CisgICAgaWYgKGZ1bGxzY3JlZW4pCisgICAgICAgIGZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworICAgIAorICAgIC8vIENyZWF0ZSB3aW5kb3cKKyAgICBnU2NyZWVuID0gU0RMX1NldFZpZGVvTW9kZSAoNjQwLCA0ODAsIDAsIGZsYWdzKTsKKyAgICBpZiAoZ1NjcmVlbiA9PSBOVUxMKSB7CisJCQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZG4ndCBzZXQgNjQweDQ4MCBPcGVuR0wgdmlkZW8gbW9kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgIFNETF9HZXRFcnJvcigpKTsKKwkJU0RMX1F1aXQoKTsKKwkJZXhpdCgyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRHTCAoKQoreworICAgIEF0bGFudGlzX0luaXQgKCk7CisgICAgQXRsYW50aXNfUmVzaGFwZSAoZ1NjcmVlbi0+dywgZ1NjcmVlbi0+aCk7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdHTCAoKQoreworICAgIEF0bGFudGlzX0FuaW1hdGUgKCk7CisgICAgQXRsYW50aXNfRGlzcGxheSAoKTsKK30KKworc3RhdGljIHZvaWQgbWFpbkxvb3AgKCkKK3sKKyAgICBTRExfRXZlbnQgZXZlbnQ7CisgICAgaW50IGRvbmUgPSAwOworICAgIGludCBmcHMgPSAyNDsKKwlpbnQgZGVsYXkgPSAxMDAwL2ZwczsKKyAgICBpbnQgdGhlblRpY2tzID0gLTE7CisgICAgaW50IG5vd1RpY2tzOworICAgIAorICAgIHdoaWxlICggIWRvbmUgKSB7CisKKwkJLyogQ2hlY2sgZm9yIGV2ZW50cyAqLworCQl3aGlsZSAoIFNETF9Qb2xsRXZlbnQgKCZldmVudCkgKSB7CisJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKworCQkJCWNhc2UgU0RMX01PVVNFTU9USU9OOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX0tFWURPV046CisJCQkJCS8qIEFueSBrZXlwcmVzcyBxdWl0cyB0aGUgYXBwLi4uICovCisJCQkJY2FzZSBTRExfUVVJVDoKKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisgICAgCisgICAgICAgIC8vIERyYXcgYXQgMjQgaHoKKyAgICAgICAgLy8gICAgIFRoaXMgYXBwcm9hY2ggaXMgbm90IG5vcm1hbGx5IHJlY29tbWVuZGVkIC0gaXQgaXMgYmV0dGVyIHRvCisgICAgICAgIC8vICAgICB1c2UgdGltZS1iYXNlZCBhbmltYXRpb24gYW5kIHJ1biBhcyBmYXN0IGFzIHBvc3NpYmxlCisgICAgICAgIGRyYXdHTCAoKTsKKyAgICAgICAgU0RMX0dMX1N3YXBCdWZmZXJzICgpOworCisgICAgICAgIC8vIFRpbWUgaG93IGxvbmcgZWFjaCBkcmF3LXN3YXAtZGVsYXkgY3ljbGUgdGFrZXMKKyAgICAgICAgLy8gYW5kIGFkanVzdCBkZWxheSB0byBnZXQgY2xvc2VyIHRvIHRhcmdldCBmcmFtZXJhdGUKKyAgICAgICAgaWYgKHRoZW5UaWNrcyA+IDApIHsKKyAgICAgICAgICAgIG5vd1RpY2tzID0gU0RMX0dldFRpY2tzICgpOworICAgICAgICAgICAgZGVsYXkgKz0gKDEwMDAvZnBzIC0gKG5vd1RpY2tzLXRoZW5UaWNrcykpOworICAgICAgICAgICAgdGhlblRpY2tzID0gbm93VGlja3M7CisgICAgICAgICAgICBpZiAoZGVsYXkgPCAwKQorICAgICAgICAgICAgICAgIGRlbGF5ID0gMTAwMC9mcHM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aGVuVGlja3MgPSBTRExfR2V0VGlja3MgKCk7CisgICAgICAgIH0KKworICAgICAgICBTRExfRGVsYXkgKGRlbGF5KTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJLy8gSW5pdCBTREwgdmlkZW8gc3Vic3lzdGVtCisJaWYgKCBTRExfSW5pdCAoU0RMX0lOSVRfVklERU8pIDwgMCApIHsKKwkJCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLAorCQkJU0RMX0dldEVycm9yKCkpOworCQlleGl0KDEpOworCX0KKworICAgIC8vIFNldCBHTCBjb250ZXh0IGF0dHJpYnV0ZXMKKyAgICBpbml0QXR0cmlidXRlcyAoKTsKKyAgICAKKyAgICAvLyBDcmVhdGUgR0wgY29udGV4dAorICAgIGNyZWF0ZVN1cmZhY2UgKDApOworICAgIAorICAgIC8vIEdldCBHTCBjb250ZXh0IGF0dHJpYnV0ZXMKKyAgICBwcmludEF0dHJpYnV0ZXMgKCk7CisgICAgCisgICAgLy8gSW5pdCBHTCBzdGF0ZQorICAgIGluaXRHTCAoKTsKKyAgICAKKyAgICAvLyBEcmF3LCBnZXQgZXZlbnRzLi4uCisgICAgbWFpbkxvb3AgKCk7CisgICAgCisgICAgLy8gQ2xlYW51cAorCVNETF9RdWl0KCk7CisJCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvWGNvZGVEb2NTZXQvRG94eWZpbGUgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvWGNvZGVEb2NTZXQvRG94eWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlMTIyOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9YY29kZURvY1NldC9Eb3h5ZmlsZQpAQCAtMCwwICsxLDE1NTggQEAKKyMgRG94eWZpbGUgMS42LjEKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QKKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkCisjIFRoZSBmb3JtYXQgaXM6CisjICAgICAgIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6CisjICAgICAgIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoIiAiKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZSAKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCAKKyMgdGV4dCBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIAorIyBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSAKKyMgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZCAKKyMgYnkgcXVvdGVzKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUgcHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9IFNETAorCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4gCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gMS4yLjE0CisKKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSAKKyMgYmFzZSBwYXRoIHdoZXJlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiAKKyMgd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgCisjIDQwOTYgc3ViLWRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgCisjIGZvcm1hdCBhbmQgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4gCisjIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZiAKKyMgc291cmNlIGZpbGVzLCB3aGVyZSBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIAorIyBvdGhlcndpc2UgY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKworQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwgCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzIAorIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuIAorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZTogCisjIEFmcmlrYWFucywgQXJhYmljLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsIENoaW5lc2UtVHJhZGl0aW9uYWwsIAorIyBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVzcGVyYW50bywgRmFyc2ksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCAKKyMgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2ggCisjIG1lc3NhZ2VzKSwgS29yZWFuLCBLb3JlYW4tZW4sIExpdGh1YW5pYW4sIE5vcndlZ2lhbiwgTWFjZWRvbmlhbiwgUGVyc2lhbiwgCisjIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxpYywgU2xvdmFrLCAKKyMgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVWtyYWluaWFuLCBhbmQgVmlldG5hbWVzZS4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIGluY2x1ZGUgYnJpZWYgbWVtYmVyIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4gCisjIHRoZSBmaWxlIGFuZCBjbGFzcyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFEb2MpLiAKKyMgU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgcHJlcGVuZCAKKyMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24uIAorIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlIAorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgCisjIHRoYXQgaXMgdXNlZCB0byBmb3JtIHRoZSB0ZXh0IGluIHZhcmlvdXMgbGlzdGluZ3MuIEVhY2ggc3RyaW5nIAorIyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlIAorIyBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0IGFuZCB0aGUgcmVzdWx0IGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzIAorIyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gCisjIElmIGxlZnQgYmxhbmssIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgiJG5hbWUiIGlzIGF1dG9tYXRpY2FsbHkgCisjIHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGVudGl0eSk6ICJUaGUgJG5hbWUgY2xhc3MiICJUaGUgJG5hbWUgd2lkZ2V0IiAKKyMgIlRoZSAkbmFtZSBmaWxlIiAiaXMiICJwcm92aWRlcyIgInNwZWNpZmllcyIgImNvbnRhaW5zIiAKKyMgInJlcHJlc2VudHMiICJhIiAiYW4iICJ0aGUiCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuIAorIyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmIAorIyBkZXNjcmlwdGlvbi4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsIAorIyBpbmhlcml0ZWQgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UgCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50IAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKworSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IE5PCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsIAorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCAKKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBOTworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgU1RSSVBfRlJPTV9QQVRIIHRhZyAKKyMgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4gU3RyaXBwaW5nIGlzIAorIyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQgcGFydCBvZiAKKyMgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LiAKKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgCisjIHBhdGggdG8gc3RyaXAuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSAKKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiAKKyMgdGhlIHBhdGggbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgY2xhc3MsIHdoaWNoIHRlbGxzIAorIyB0aGUgcmVhZGVyIHdoaWNoIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIAorIyBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIAorIyBkZWZpbml0aW9uIGlzIHVzZWQuIE90aGVyd2lzZSBvbmUgc2hvdWxkIHNwZWNpZnkgdGhlIGluY2x1ZGUgcGF0aHMgdGhhdCAKKyMgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSAKKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgCisjIChidXQgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlzIHlvdXIgZmlsZSBzeXN0ZW1zIAorIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gCisjIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFEb2Mtc3R5bGUgCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhRG9jIAorIyBjb21tZW50cyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAKKyMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IFlFUworCisjIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgCisjIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSAKKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIGNvbW1lbnRzIAorIyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcgCisjIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIERveHlnZW4gCisjIHRyZWF0IGEgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLyAKKyMgY29tbWVudHMpIGFzIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuIAorIyBUaGUgbmV3IGRlZmF1bHQgaXMgdG8gdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBjb21tZW50IGJsb2NrIGFzIGEgZGV0YWlsZWQgCisjIGRlc2NyaXB0aW9uLiBTZXQgdGhpcyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvdXIgaW5zdGVhZC4KKworTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCisKKyMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYW4gdW5kb2N1bWVudGVkIAorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdCAKKyMgcmUtaW1wbGVtZW50cy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgCisjIGEgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwgCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiAKKyMgRG94eWdlbiB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDQKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3RzIAorIyBhcyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8gCisjIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZSBkb2N1bWVudGF0aW9uLCB3aGljaCAKKyMgd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZyAiU2lkZSBFZmZlY3RzOiIuIAorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMgCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gCisjIEZvciBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3QgCisjIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gWUVTCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIAorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIAorIyBKYXZhLiBGb3IgaW5zdGFuY2UsIG5hbWVzcGFjZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGFja2FnZXMsIHF1YWxpZmllZCAKKyMgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuIAorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIAorIyBGb3J0cmFuLgorCitPUFRJTUlaRV9GT1JfRk9SVFJBTiAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9WSERMIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIFZIREwgCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciAKKyMgVkhETC4KKworT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PCisKKyMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdCBwYXJzZXMuIAorIyBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4gZXh0ZW5zaW9uLiAKKyMgRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQgdXNpbmcgdGhpcyB0YWcuIAorIyBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sIGFuZCBsYW5ndWFnZSBpcyBvbmUgb2YgCisjIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsIEMjLCBDLCBDKyssIEQsIFBIUCwgCisjIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4sIFZIREwsIEMsIEMrKy4gRm9yIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAKKyMgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0IGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDIChkZWZhdWx0IGlzIEZvcnRyYW4pLCAKKyMgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQKKyMgRklMRV9QQVRURVJOUyBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0gCisKKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudCAKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkIAorIyBzZXQgdGhpcyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kIAorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsgdi5zLiAKKyMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gCisjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PCisKKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisKK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIHNvdXJjZXMgb25seS4gCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyAKKyMgaW5zdGVhZCBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisKK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTworCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSBnZXR0ZXIgCisjIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgKHRoZSBkZWZhdWx0KSAKKyMgd2lsbCBtYWtlIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSAKKyMgZG9jdW1lbnRhdGlvbi4gVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3IgCisjIHNldHRpbmcgYSBzaW1wbGUgdHlwZS4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlIAorIyBtZXRob2RzIGFueXdheSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DIAorIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0IAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQgCisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgCisjIHRoZSBzYW1lIHR5cGUgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIAorIyBzdWJncm91cCBvZiB0aGF0IHR5cGUgKGUuZy4gdW5kZXIgdGhlIFB1YmxpYyBGdW5jdGlvbnMgc2VjdGlvbikuIFNldCBpdCB0byAKKyMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgCisjIHRoZSBcbm9zdWJncm91cGluZyBjb21tYW5kLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIAorIyBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28gCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdCAKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwgCisjIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseSAKKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQgCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKworVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IFlFUworCisjIFRoZSBTWU1CT0xfQ0FDSEVfU0laRSBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZSB1c2UgdG8gCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLiAKKyMgV2hlbiB0aGUgY2FjaGUgaXMgZnVsbCwgbGVzcyBvZnRlbiB1c2VkIHN5bWJvbHMgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suIAorIyBGb3Igc21hbGwgdG8gbWVkaXVtIHNpemUgcHJvamVjdHMgKDwxMDAwIGlucHV0IGZpbGVzKSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAKKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UgCisjIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZSAKKyMgY2F1c2luZyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHBlbmFsaXR5LiAKKyMgSWYgdGhlIHN5c3RlbSBoYXMgZW5vdWdoIHBoeXNpY2FsIG1lbW9yeSBpbmNyZWFzaW5nIHRoZSBjYWNoZSB3aWxsIGltcHJvdmUgdGhlIAorIyBwZXJmb3JtYW5jZSBieSBrZWVwaW5nIG1vcmUgc3ltYm9scyBpbiBtZW1vcnkuIE5vdGUgdGhhdCB0aGUgdmFsdWUgd29ya3Mgb24gCisjIGEgbG9nYXJpdGhtaWMgc2NhbGUgc28gaW5jcmVhc2luZyB0aGUgc2l6ZSBieSBvbmUgd2lsbCByb3VnbHkgZG91YmxlIHRoZSAKKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6IAorIyAyXigxNitTWU1CT0xfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLCAKKyMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMKKworU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbiAKKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIAorIyBQcml2YXRlIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIAorIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyAKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpIAorIyBkZWZpbmVkIGxvY2FsbHkgaW4gc291cmNlIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIAorIyBJZiBzZXQgdG8gTk8gb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IE5PCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwgCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4gCisjIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAKKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZSAKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkIAorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlIAorIyBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgCisjIGFub255bW91cyBuYW1lc3BhY2UgYXJlIGhpZGRlbi4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsIAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIAorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIAorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbCAKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiAKKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIAorIyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsIAorIyBmcmllbmQgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLiAKKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIAorIyBkb2N1bWVudGF0aW9uLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFueSAKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgCisjIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCisKKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbiAKKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCAKKyMgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgZXhjbHVkZWQuIAorIyBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBEb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSAKKyMgZmlsZSBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvIAorIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyIAorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MgCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbiAKKyMgd2lsbCBzaG93IG1lbWJlcnMgd2l0aCB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSAKKyMgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIFlFUyB0aGUgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCisKK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuIAorIyB3aWxsIHB1dCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKyMgb2YgdGhhdCBmaWxlLgorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXSAKKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4gCisjIHdpbGwgc29ydCB0aGUgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgCisjIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gCisjIGRlY2xhcmF0aW9uIG9yZGVyLgorCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIAorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSAKKyMgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIAorIyBkZWNsYXJhdGlvbiBvcmRlci4KKworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgc29ydCB0aGUgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQKKyMgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorIyB0aGUgY29uc3RydWN0b3JzIHdpbGwgYXBwZWFyIGluIHRoZSByZXNwZWN0aXZlIG9yZGVycyBkZWZpbmVkIGJ5CisjIFNPUlRfTUVNQkVSX0RPQ1MgYW5kIFNPUlRfQlJJRUZfRE9DUy4KKyMgVGhpcyB0YWcgd2lsbCBiZSBpZ25vcmVkIGZvciBicmllZiBkb2NzIGlmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8KKyMgYW5kIGlnbm9yZWQgZm9yIGRldGFpbGVkIGRvY3MgaWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8uCisKK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTworCisjIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIAorIyBoaWVyYXJjaHkgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIAorIyB0aGUgZ3JvdXAgbmFtZXMgd2lsbCBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSAKKyMgc29ydGVkIGJ5IGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0byAKKyMgTk8gKHRoZSBkZWZhdWx0KSwgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLCAKKyMgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuIAorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLiAKKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlIAorIyBhbHBoYWJldGljYWwgbGlzdC4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgCisjIGRpc2FibGUgKE5PKSB0aGUgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIAorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIAorIyBkaXNhYmxlIChOTykgdGhlIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdCAKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIAorIyBkaXNhYmxlIChOTykgdGhlIGJ1ZyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcgCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgCisjIGRpc2FibGUgKE5PKSB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIAorIyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwgCisjIGRvY3VtZW50YXRpb24gc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgc2VjdGlvbm5hbWUgLi4uIFxlbmRpZi4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IAorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIAorIyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIGRlZmluZSBjb25zaXN0cyBvZiBmb3IgaXQgdG8gYXBwZWFyIGluIAorIyB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQgCisjIGhlcmUgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4gCisjIFRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbml0aWFsaXplciBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgZGVmaW5lcyBpbiB0aGUgCisjIGRvY3VtZW50YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyIAorIyBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgCisjIGF0IHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUyB0aGUgCisjIGxpc3Qgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKworU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUworCisjIElmIHRoZSBzb3VyY2VzIGluIHlvdXIgcHJvamVjdCBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBtdWx0aXBsZSBkaXJlY3RvcmllcyAKKyMgdGhlbiBzZXR0aW5nIHRoZSBTSE9XX0RJUkVDVE9SSUVTIHRhZyB0byBZRVMgd2lsbCBzaG93IHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5IAorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIGRlZmF1bHQgaXMgTk8uCisKK1NIT1dfRElSRUNUT1JJRVMgICAgICAgPSBOTworCisjIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4gCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZSAKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIAorIyBOYW1lc3BhY2VzIHBhZ2UuICBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IAorIyBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX05BTUVTUEFDRVMgICAgICAgID0gTk8KKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQgCisjIGRveHlnZW4gc2hvdWxkIGludm9rZSB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZWFjaCBmaWxlICh0eXBpY2FsbHkgZnJvbSAKKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhIAorIyBwb3BlbigpKSB0aGUgY29tbWFuZCA8Y29tbWFuZD4gPGlucHV0LWZpbGU+LCB3aGVyZSA8Y29tbWFuZD4gaXMgdGhlIHZhbHVlIG9mIAorIyB0aGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSAKKyMgcHJvdmlkZWQgYnkgZG94eWdlbi4gV2hhdGV2ZXIgdGhlIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dCAKKyMgaXMgdXNlZCBhcyB0aGUgZmlsZSB2ZXJzaW9uLiBTZWUgdGhlIG1hbnVhbCBmb3IgZXhhbXBsZXMuCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPSAKKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZCBieSAKKyMgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGZpbGVzIAorIyBpbiBhbiBvdXRwdXQgZm9ybWF0IGluZGVwZW5kZW50IHdheS4gVGhlIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUgdGhhdCByZXByZXNlbnRzIAorIyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSAKKyMgZmlsZSBuYW1lIGFmdGVyIHRoZSBvcHRpb24sIGlmIG9taXR0ZWQgRG94eWdlbkxheW91dC54bWwgd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIAorIyBvZiB0aGUgbGF5b3V0IGZpbGUuCisKK0xBWU9VVF9GSUxFICAgICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCAKKyMgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK1FVSUVUICAgICAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlIAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIAorIyBOTyBpcyB1c2VkLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9VTkRPQ1VNRU5URUQgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgCisjIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZyB3aWxsIAorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvciAKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSAKKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCAKKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBhYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIAorIyBmdW5jdGlvbnMgdGhhdCBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyAKKyMgb3IgcmV0dXJuIHZhbHVlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0IAorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIAorIyBkb2N1bWVudGF0aW9uLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gWUVTCisKKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCAKKyMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgCisjIHRhZ3MsIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIAorIyB3YXJuaW5nIG9yaWdpbmF0ZWQgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbiAKKyMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIAorIyBiZSBvYnRhaW5lZCB2aWEgRklMRV9WRVJTSU9OX0ZJTFRFUikKKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyAKKyMgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbiAKKyMgdG8gc3RkZXJyLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIAorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgIm15ZmlsZS5jcHAiIG9yIAorIyBkaXJlY3RvcmllcyBsaWtlICIvdXNyL3NyYy9teXByb2plY3QiLiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgCisjIHdpdGggc3BhY2VzLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gLi4vLi4vaW5jbHVkZQorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzIAorIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzIAorIyBhbHNvIHRoZSBkZWZhdWx0IGlucHV0IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCAKKyMgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvciAKKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlIAorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgCisjIGJsYW5rIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDogCisjICouYyAqLmNjICouY3h4ICouY3BwICouYysrICouamF2YSAqLmlpICouaXh4ICouaXBwICouaSsrICouaW5sICouaCAqLmhoICouaHh4IAorIyAqLmhwcCAqLmgrKyAqLmlkbCAqLm9kbCAqLmNzICoucGhwICoucGhwMyAqLmluYyAqLm0gKi5tbSAqLnB5ICouZjkwCisKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouY2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouY3h4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5jKysgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5qYXZhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmlpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLml4eCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaSsrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmlubCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmhoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmh4eCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5ocHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaCsrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmlkbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5vZGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouY3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICoucGhwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnBocDMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaW5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLm0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICoubW0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICouZG94IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnB5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmY5MCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5mIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnZoZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi52aGRsCisKKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzIAorIyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gCisjIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIAorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYSAKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yIAorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGVzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkIAorIyBmcm9tIHRoZSBpbnB1dC4KKworRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZSAKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlIAorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIAorIyBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8gZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyAKKyMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAKKworIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcyAKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZSAKKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywgCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKworRVhDTFVERV9TWU1CT0xTICAgICAgICA9IAorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgCisjIHRoZSBcaW5jbHVkZSBjb21tYW5kKS4KKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlIAorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgCisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAqCisKKyMgSWYgdGhlIEVYQU1QTEVfUkVDVVJTSVZFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gc3ViZGlyZWN0b3JpZXMgd2lsbCBiZSAKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlIAorIyBjb21tYW5kcyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLiAKKyMgUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIAorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW1hZ2UgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSAKKyMgdGhlIFxpbWFnZSBjb21tYW5kKS4KKworSU1BR0VfUEFUSCAgICAgICAgICAgICA9IAorCisjIFRoZSBJTlBVVF9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRoYXQgZG94eWdlbiBzaG91bGQgCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0gCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxmaWx0ZXI+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGZpbHRlcj4gCisjIGlzIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVRfRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbiAKKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzIAorIyB0byBzdGFuZGFyZCBvdXRwdXQuICBJZiBGSUxURVJfUEFUVEVSTlMgaXMgc3BlY2lmaWVkLCB0aGlzIHRhZyB3aWxsIGJlIAorIyBpZ25vcmVkLgorCitJTlBVVF9GSUxURVIgICAgICAgICAgID0gCisKKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybiAKKyMgYmFzaXMuICBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUgCisjIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLiAgVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogCisjIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyIAorIyBpbmZvIG9uIGhvdyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiBGSUxURVJfUEFUVEVSTlMgaXMgZW1wdHksIElOUFVUX0ZJTFRFUiAKKyMgaXMgYXBwbGllZCB0byBhbGwgZmlsZXMuCisKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nIAorIyBJTlBVVF9GSUxURVIpIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzIHdoZW4gcHJvZHVjaW5nIHNvdXJjZSAKKyMgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCAKKyMgYmUgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuIAorIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIGFsc28gCisjIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSAKKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIGluc3RydWN0IAorIyBkb3h5Z2VuIHRvIGhpZGUgYW55IHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgCisjIGZyYWdtZW50cy4gTm9ybWFsIEMgYW5kIEMrKyBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIAorIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgCisjIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIAorIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMgCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIAorIyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbSAKKyMgZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbCAKKyMgbGluayB0byB0aGUgc291cmNlIGNvZGUuICBPdGhlcndpc2UgdGhleSB3aWxsIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uCisKK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgCisjIHdpbGwgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbiAKKyMgYnVpbHQtaW4gc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZSAKKyMgdGFnZ2luZyBzeXN0ZW0gKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IAorIyB3aWxsIG5lZWQgdmVyc2lvbiA0LjguNiBvciBoaWdoZXIuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuIAorIyB3aWxsIGdlbmVyYXRlIGEgdmVyYmF0aW0gY29weSBvZiB0aGUgaGVhZGVyIGZpbGUgZm9yIGVhY2ggY2xhc3MgZm9yIAorIyB3aGljaCBhbiBpbmNsdWRlIGlzIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCAKKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgCisjIGNvbnRhaW5zIGEgbG90IG9mIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucyBvciBpbnRlcmZhY2VzLgorCitBTFBIQUJFVElDQUxfSU5ERVggICAgID0gWUVTCisKKyMgSWYgdGhlIGFscGhhYmV0aWNhbCBpbmRleCBpcyBlbmFibGVkIChzZWUgQUxQSEFCRVRJQ0FMX0lOREVYKSB0aGVuIAorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgCisjIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCAKKyMgY2xhc3NlcyB3aWxsIGJlIHB1dCB1bmRlciB0aGUgc2FtZSBoZWFkZXIgaW4gdGhlIGFscGhhYmV0aWNhbCBpbmRleC4gCisjIFRoZSBJR05PUkVfUFJFRklYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHByZWZpeGVzIHRoYXQgCisjIHNob3VsZCBiZSBpZ25vcmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisKK0lHTk9SRV9QUkVGSVggICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgSFRNTCBvdXRwdXQuCisKK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKKworIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LiAKKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSAKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBodG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIAorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLC5waHAsLmFzcCkuIElmIGl0IGlzIGxlZnQgYmxhbmsgCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBmaWxlcyB3aXRoIC5odG1sIGV4dGVuc2lvbi4KKworSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCisKKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yIAorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgCisjIHN0YW5kYXJkIGhlYWRlci4KKworSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgZm9vdGVyIGZvciAKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIAorIyBzdGFuZGFyZCBmb290ZXIuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZyAKKyMgc3R5bGUgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0byAKKyMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LiBOb3RlIHRoYXQgZG94eWdlbiB3aWxsIHRyeSB0byBjb3B5IAorIyB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCBzbyBkb24ndCBwdXQgeW91ciBvd24gCisjIHN0eWxlc2hlZXQgaW4gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSBhcyB3ZWxsLCBvciBpdCB3aWxsIGJlIGVyYXNlZCEKKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorCisjIElmIHRoZSBIVE1MX0FMSUdOX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGNsYXNzZXMsIAorIyBmaWxlcyBvciBuYW1lc3BhY2VzIHdpbGwgYmUgYWxpZ25lZCBpbiBIVE1MIHVzaW5nIHRhYmxlcy4gSWYgc2V0IHRvIAorIyBOTyBhIGJ1bGxldCBsaXN0IHdpbGwgYmUgdXNlZC4KKworSFRNTF9BTElHTl9NRU1CRVJTICAgICA9IFlFUworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwgCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlIAorIyBwYWdlIGhhcyBsb2FkZWQuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgCisjIEphdmFTY3JpcHQgYW5kIERIVE1MIGlzIHJlcXVpcmVkIChmb3IgaW5zdGFuY2UgTW96aWxsYSAxLjArLCBGaXJlZm94IAorIyBOZXRzY2FwZSA2LjArLCBJbnRlcm5ldCBleHBsb3JlciA1LjArLCBLb25xdWVyb3IsIG9yIFNhZmFyaSkuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMyAKKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4gCisjIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBNYWtlZmlsZSBpbiB0aGUgCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluIHRoYXQgCisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbiAKKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIAorIyBpdCBhdCBzdGFydHVwLiAKKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBZRVMKKworIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgCisjIGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlIAorIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgCisjIGNhbiBiZSBncm91cGVkLgorCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MgZm9yIFNETCIKKworIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgCisjIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhIAorIyByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIAorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmxpYnNkbC5zZGwKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRvb2xzIGxpa2UgdGhlIAorIyBNaWNyb3NvZnQgSFRNTCBoZWxwIHdvcmtzaG9wIHRvIGdlbmVyYXRlIGEgY29tcGlsZWQgSFRNTCBoZWxwIGZpbGUgKC5jaG0pIAorIyBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0ZJTEUgdGFnIGNhbiAKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdSAKKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlIAorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisKK0NITV9GSUxFICAgICAgICAgICAgICAgPSBTREwuY2htCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4gCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGggaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YgCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPSAiQzovUHJvZ3JhbSBGaWxlcy9IVE1MIEhlbHAgV29ya3Nob3AvaGhjLmV4ZSIKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBHRU5FUkFURV9DSEkgZmxhZyAKKyMgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIHRoYXQgCisjIGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fSU5ERVhfRU5DT0RJTkcgCisjIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpIGFuZCBwcm9qZWN0IGZpbGUgCisjIGNvbnRlbnQuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBCSU5BUllfVE9DIGZsYWcgCisjIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIGEgCisjIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuCisKK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzIAorIyB0byB0aGUgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZCBRSFBfVklSVFVBTF9GT0xERVIgCisjIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciAKKyMgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhIFF0IENvbXByZXNzZWQgSGVscCAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCAKKyMgSFRNTCBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuIAorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4gCisjIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0byB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorCitRQ0hfRklMRSAgICAgICAgICAgICAgID0gCisKKyMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgCisjIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlCisKK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSAKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIAorIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIAorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtZm9sZGVycworCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgUUhQX0NVU1RfRklMVEVSX05BTUUgaXMgc2V0LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20gZmlsdGVyIHRvIGFkZC4gCisjIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMKKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9IAorCisjIFRoZSBRSFBfQ1VTVF9GSUxUX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLkZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMiPlF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzIHByb2plY3QncyAKKyMgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMiPlF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzPC9hPi4KKworUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbiAKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzIHFoZWxwZ2VuZXJhdG9yLiAKKyMgSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZSBnZW5lcmF0ZWQgCisjIC5xaHAgZmlsZS4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4IGF0IAorIyB0b3Agb2YgZWFjaCBIVE1MIHBhZ2UuIFRoZSB2YWx1ZSBOTyAodGhlIGRlZmF1bHQpIGVuYWJsZXMgdGhlIGluZGV4IGFuZCAKKyMgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcyBpdC4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgKHJhbmdlIFsxLi4yMF0pIAorIyB0aGF0IGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKKworIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4IAorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4gCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkIAorIyBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdCAKKyMgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIAorIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4gCisjIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlIEhUTUwgaGVscCBmZWF0dXJlLgorCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KKworIyBCeSBlbmFibGluZyBVU0VfSU5MSU5FX1RSRUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIEdyb3VwcywgRGlyZWN0b3JpZXMsIAorIyBhbmQgQ2xhc3MgSGllcmFyY2h5IHBhZ2VzIHVzaW5nIGEgdHJlZSB2aWV3IGluc3RlYWQgb2YgYW4gb3JkZXJlZCBsaXN0LgorCitVU0VfSU5MSU5FX1RSRUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZSAKKyMgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIAorIyBpcyBzaG93bi4KKworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYXRleCBmb3JtdWxhcyBpbmNsdWRlZCAKKyMgYXMgaW1hZ2VzIGluIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFRoZSBkZWZhdWx0IGlzIDEwLiBOb3RlIHRoYXQgCisjIHdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkb3h5Z2VuIHJ1biB5b3UgbmVlZCAKKyMgdG8gbWFudWFsbHkgcmVtb3ZlIGFueSBmb3JtXyoucG5nIGltYWdlcyBmcm9tIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgCisjIHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHNlYXJjaCBib3gKKyMgZm9yIHRoZSBIVE1MIG91dHB1dC4gVGhlIHVuZGVybHlpbmcgc2VhcmNoIGVuZ2luZSB1c2VzIGphdmFzY3JpcHQgCisjIGFuZCBESFRNTCBhbmQgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZworIyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSBvciBRdCBoZWxwIChHRU5FUkFURV9RSFApIAorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgCisjIGJlIGRpc2FibGVkLgorCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBMYXRleCBvdXRwdXQuCisKK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZSAKKyMgaW52b2tlZC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0byAKKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgCisjIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IAorIyBMYVRlWCBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIAorIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgCisjIGJ5IHRoZSBwcmludGVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCwgYTR3aWRlLCBsZXR0ZXIsIGxlZ2FsIGFuZCAKKyMgZXhlY3V0aXZlLiBJZiBsZWZ0IGJsYW5rIGE0d2lkZSB3aWxsIGJlIHVzZWQuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUKKworIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG5hbWVzIG9mIExhVGVYIAorIyBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCAKKyMgdGhlIGZpcnN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCAKKyMgaXMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gcGRmICh1c2luZyBwczJwZGYpLiBUaGUgcGRmIGZpbGUgd2lsbCAKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMgCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgcGRmIHZpZXdlci4KKworUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIHBkZmxhdGV4IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIAorIyBwbGFpbiBsYXRleCBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhIAorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLiAKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCAKKyMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiAKKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiBMQVRFWF9ISURFX0lORElDRVMgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgCisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKSAKKyMgaW4gdGhlIG91dHB1dC4KKworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisKKyMgSWYgTEFURVhfU09VUkNFX0NPREUgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlCisjIHNvdXJjZSBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzCisjIHN1Y2ggYXMgU09VUkNFX0JST1dTRVIuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dCAKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aCAKKyMgb3RoZXIgUlRGIHJlYWRlcnMgb3IgZWRpdG9ycy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIAorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IAorIyBSVEYgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byAKKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCAKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIFdPUkQgb3Igb3RoZXIgCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLiAKKyMgTm90ZTogd29yZHBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyAKKyMgY29uZmlnIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSAKKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuIAorIyBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0byAKKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCAKKyMgdGhlbiBpdCB3aWxsIGdlbmVyYXRlIG9uZSBhZGRpdGlvbmFsIG1hbiBmaWxlIGZvciBlYWNoIGVudGl0eSAKKyMgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbCBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcyAKKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kIAorIyB3b3VsZCBiZSB1bmFibGUgdG8gZmluZCB0aGUgY29ycmVjdCBwYWdlLiBUaGUgZGVmYXVsdCBpcyBOTy4KKworTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIAorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgeG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBzY2hlbWEsIAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgCisjIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgorCitYTUxfU0NIRU1BICAgICAgICAgICAgID0gCisKKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIERURCwgCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZSAKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKK1hNTF9EVEQgICAgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCAKKyMgZHVtcCB0aGUgcHJvZ3JhbSBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgCisjIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8gdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdCAKKyMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgCisjIGdlbmVyYXRlIGFuIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBhdXRvZ2VuLnNmLm5ldCkgZmlsZSAKKyMgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIAorIyBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIAorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIAorIyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgCisjIG1vbWVudC4KKworR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIAorIyB0aGUgbmVjZXNzYXJ5IE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZSAKKyMgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSAKKyMgbmljZWx5IGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiAgVGhpcyBpcyB1c2VmdWwgCisjIGlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIAorIyB0YWcgaXMgc2V0IHRvIE5PIHRoZSBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIgCisjIGFuZCBQZXJsIHdpbGwgcGFyc2UgaXQganVzdCB0aGUgc2FtZS4KKworUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUworCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlIAorIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiAKKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lIAorIyBNYWtlZmlsZSBkb24ndCBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4KKworUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIAorIyBmaWxlcy4KKworRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gCisjIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBjb25kaXRpb25hbCAKKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgCisjIHdheSBieSBzZXR0aW5nIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuCisKK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhQQU5EX09OTFlfUFJFREVGIGFuZCBNQUNST19FWFBBTlNJT04gdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIAorIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSAKKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMgCisjIGluIHRoZSBJTkNMVURFX1BBVEggKHNlZSBiZWxvdykgd2lsbCBiZSBzZWFyY2ggaWYgYSAjaW5jbHVkZSBpcyBmb3VuZC4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IE5PCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0IAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IAorIyB0aGUgcHJlcHJvY2Vzc29yLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gCisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCAKKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZSAKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgCisjIGJlIHVzZWQuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0IAorIyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUgCisjIG9yIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSA9IGFyZSAKKyMgb21pdHRlZCA9MSBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nIAorIyB1bmRlZmluZWQgdmlhICN1bmRlZiBvciByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIAorIyBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiAKKyMgdGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuIAorIyBUaGUgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gCisjIFVzZSB0aGUgUFJFREVGSU5FRCB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24uCisKK0VYUEFORF9BU19ERUZJTkVEICAgICAgPSBERUNMU1BFQyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RMQ0FMTAorCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gCisjIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbCByZW1vdmUgYWxsIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIAorIyBvbiBhIGxpbmUsIGhhdmUgYW4gYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGEgc2VtaWNvbG9uLiBTdWNoIAorIyBmdW5jdGlvbiBtYWNyb3MgYXJlIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSAKKyMgdGhlIHBhcnNlciBpZiBub3QgcmVtb3ZlZC4KKworU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnZmlsZXMuIAorIyBPcHRpb25hbGx5IGFuIGluaXRpYWwgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gCisjIGNhbiBiZSBhZGRlZCBmb3IgZWFjaCB0YWdmaWxlLiBUaGUgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dCAKKyMgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOiAKKyMgICBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLiAKKyMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czogCisjICAgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLiAKKyMgd2hlcmUgImxvYzEiIGFuZCAibG9jMiIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIAorIyBVUkxzLiBJZiBhIGxvY2F0aW9uIGlzIHByZXNlbnQgZm9yIGVhY2ggdGFnLCB0aGUgaW5zdGFsbGRveCB0b29sIAorIyBkb2VzIG5vdCBoYXZlIHRvIGJlIHJ1biB0byBjb3JyZWN0IHRoZSBsaW5rcy4gCisjIE5vdGUgdGhhdCBlYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lIAorIyAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcGF0aCkgCisjIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIAorIyBpcyBydW4sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgdGFnZmlsZSBoZXJlLgorCitUQUdGSUxFUyAgICAgICAgICAgICAgID0gCisKKyMgV2hlbiBhIGZpbGUgbmFtZSBpcyBzcGVjaWZpZWQgYWZ0ZXIgR0VORVJBVEVfVEFHRklMRSwgZG94eWdlbiB3aWxsIGNyZWF0ZSAKKyMgYSB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4KKworR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQgCisjIGluIHRoZSBjbGFzcyBpbmRleC4gSWYgc2V0IHRvIE5PIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzIAorIyB3aWxsIGJlIGxpc3RlZC4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkIAorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCAKKyMgYmUgbGlzdGVkLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0IAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEhUTUwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSAKKyMgb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdCAKKyMgdGhpcyBvcHRpb24gaXMgc3VwZXJzZWRlZCBieSB0aGUgSEFWRV9ET1Qgb3B0aW9uIGJlbG93LiBUaGlzIGlzIG9ubHkgYSAKKyMgZmFsbGJhY2suIEl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlIAorIyBwb3dlcmZ1bCBncmFwaHMuCisKK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBOTworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjIAorIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWUgCisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUgCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlIAorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUgCisjIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgCisjIG9yIGlzIG5vdCBhIGNsYXNzLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzIAorIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbiAKKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiAKKyMgaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKKworSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgd3JpdGUgYSBmb250IGNhbGxlZCBGcmVlU2Fucy50dGYgdG8gdGhlIG91dHB1dCAKKyMgZGlyZWN0b3J5IGFuZCByZWZlcmVuY2UgaXQgaW4gYWxsIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4gZ2VuZXJhdGVzLiBUaGlzIAorIyBmb250IGRvZXMgbm90IGluY2x1ZGUgYWxsIHBvc3NpYmxlIHVuaWNvZGUgY2hhcmFjdGVycyBob3dldmVyLCBzbyB3aGVuIHlvdSBuZWVkIAorIyB0aGVzZSAob3IganVzdCB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250KSB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSAKKyMgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCBuZWVkIHRvIG1ha2Ugc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCAKKyMgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcgdGhlIAorIyBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5IAorIyBjb250YWluaW5nIHRoZSBmb250LgorCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gRnJlZVNhbnMKKworIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGZvbnQgb2YgZG90IGdyYXBocy4gCisjIFRoZSBkZWZhdWx0IHNpemUgaXMgMTBwdC4KKworRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRvIGxvb2sgZm9yIHRoZSAKKyMgRnJlZVNhbnMudHRmIGZvbnQgKHdoaWNoIGRveHlnZW4gd2lsbCBwdXQgdGhlcmUgaXRzZWxmKS4gSWYgeW91IHNwZWNpZnkgYSAKKyMgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0IHRoZSBwYXRoIHdoZXJlIGRvdCAKKyMgY2FuIGZpbmQgaXQgdXNpbmcgdGhpcyB0YWcuCisKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIAorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIAorIyBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlIAorIyB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIAorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIAorIyBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kIAorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcworCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQgCisjIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nIAorIyBMYW5ndWFnZS4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIAorIyByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyIGluc3RhbmNlcy4KKworVEVNUExBVEVfUkVMQVRJT05TICAgICA9IE5PCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVfR1JBUEgsIGFuZCBIQVZFX0RPVCAKKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIAorIyBvdGhlciBkb2N1bWVudGVkIGZpbGVzLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVEX0JZX0dSQVBILCBhbmQgCisjIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCAKKyMgZG9jdW1lbnRlZCBoZWFkZXIgZmlsZSBzaG93aW5nIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3IgCisjIGluZGlyZWN0bHkgaW5jbHVkZSB0aGlzIGZpbGUuCisKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ0FMTF9HUkFQSCBhbmQgSEFWRV9ET1Qgb3B0aW9ucyBhcmUgc2V0IHRvIFlFUyB0aGVuIAorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiAKKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIAorIyB0aGUgdGltZSBvZiBhIHJ1bi4gU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbCBncmFwaHMgCisjIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gCisjIG9yIGNsYXNzIG1ldGhvZC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSAKKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciAKKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiAKKyMgd2lsbCBncmFwaGljYWwgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEgsIFNIT1dfRElSRUNUT1JJRVMgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgCisjIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMgCisjIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSAKKyMgcmVsYXRpb25zIGJldHdlZW4gdGhlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzIAorIyBnZW5lcmF0ZWQgYnkgZG90LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHBuZywganBnLCBvciBnaWYgCisjIElmIGxlZnQgYmxhbmsgcG5nIHdpbGwgYmUgdXNlZC4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworCisjIFRoZSB0YWcgRE9UX1BBVEggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlIAorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorCitET1RfUEFUSCAgICAgICAgICAgICAgID0gL0FwcGxpY2F0aW9ucy9HcmFwaHZpei5hcHAvQ29udGVudHMvTWFjT1MKKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQgCisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIAorIyBcZG90ZmlsZSBjb21tYW5kKS4KKworRE9URklMRV9ESVJTICAgICAgICAgICA9IAorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIAorIyBub2RlcyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggCisjIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMgCisjIHZpc3VhbGl6ZWQgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSAKKyMgbnVtYmVyIG9mIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbiAKKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZSAKKyMgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDY3CisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgCisjIGdyYXBocyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSAKKyMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMgCisjIHRoYXQgbGF5IGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyAKKyMgb3B0aW9uIHRvIDEgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSAKKyMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IAorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisKK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAyCisKKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50IAorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3QgCisjIHNlZW0gdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIAorIyBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0byBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZiAKKyMgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvIHJlYWQpLgorCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dCAKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcyAKKyMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkgCisjIHN1cHBvcnQgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisKK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQgCisjIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZCBncmFwaHMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIGRvdCBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIAorIyB0aGUgdmFyaW91cyBncmFwaHMuCisKK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9ta3hjb2RlLmNzaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9ta3hjb2RlLmNzaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYWY2NDgxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL21reGNvZGUuY3NoCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9jc2gKKworIyMjCisjIyBUaGlzIHNjcmlwdCBjcmVhdGVzICJYY29kZS50YXIuZ3oiIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5CisjIyMKKworIyByZW1vdmUgYnVpbGQgcHJvZHVjdHMKK3JtIC1yZiBTREwvYnVpbGQKK3JtIC1yZiBTRExUZXN0L2J1aWxkCisKKyMgcmVtb3ZlIEZpbmRlciBpbmZvIGZpbGVzCitmaW5kIC4gLW5hbWUgIi5EU19TdG9yZSIgLWV4ZWMgcm0gInt9IiAiOyIKKworIyByZW1vdmUgdXNlciBwcm9qZWN0IHByZWZzCitmaW5kIC4gLW5hbWUgIioucGJ4dXNlcioiIC1leGVjIHJtICJ7fSIgIjsiCitmaW5kIC4gLW5hbWUgIioubW9kZSoiIC1leGVjIHJtICJ7fSIgIjsiCitmaW5kIC4gLW5hbWUgIioucGVyc3BlY3RpdmUqIiAtZXhlYyBybSAie30iICI7IgorCisjIGNyZWF0ZSB0aGUgYXJjaGl2ZQorKGNkIC4uICYmIGdudXRhciAtemN2ZiBYY29kZS50YXIuZ3ogWGNvZGUpCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvcGFja2FnZSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS9wYWNrYWdlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlNmI1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvcGFja2FnZQpAQCAtMCwwICsxLDI3MiBAQAorIyEgL2Jpbi9jc2ggLWVmCisKK3NldCBwcm9nID0gYC91c3IvYmluL2Jhc2VuYW1lICQwYAorc2V0IHVzYWdlID0gIlVzYWdlOiAkcHJvZyBbLWZdIHJvb3QtZGlyIGluZm8tZmlsZSBbdGlmZi1maWxlXSBbLWQgZGVzdC1kaXJdIFstciByZXNvdXJjZS1kaXJdIFstdHJhZGl0aW9uYWwgfCAtZ251dGFyXSIKK3NldCBub2dsb2IKKworaWYgKC14IC91c3IvYmluL21rYm9tKSB0aGVuCisgICAgc2V0IG1rYm9tPS91c3IvYmluL21rYm9tCisgICAgc2V0IGxzYm9tPS91c3IvYmluL2xzYm9tCitlbHNlCisgICAgc2V0IG1rYm9tPS91c3IvZXRjL21rYm9tCisgICAgc2V0IGxzYm9tPS91c3IvZXRjL2xzYm9tCitlbmRpZgorCitpZiAoLXggL3Vzci9iaW4vYXdrKSB0aGVuCisgICAgc2V0IGF3az0vdXNyL2Jpbi9hd2sKK2Vsc2UKKyAgICBzZXQgYXdrPS9iaW4vYXdrCitlbmRpZgorCitzZXQgZ251dGFyPS91c3IvYmluL2dudXRhcgorc2V0IHRhcj0vdXNyL2Jpbi90YXIKK3NldCBwYXg9L2Jpbi9wYXgKKworIyBnYXRoZXIgcGFyYW1ldGVycworaWYgKCQjYXJndiA9PSAwKSB0aGVuCisgICAgZWNobyAkdXNhZ2UKKyAgICBleGl0KDEpCitlbmRpZgorCit3aGlsZSAoICQjYXJndiA+IDAgKQorICAgIHN3aXRjaCAoICRhcmd2WzFdICkKKwljYXNlIC1kOgorCSAgICBpZiAoICQ/ZGVzdERpciApIHRoZW4KKwkJZWNobyAke3Byb2d9OiBkZXN0LWRpciBwYXJhbWV0ZXIgYWxyZWFkeSBzZXQgdG8gJHtkZXN0RGlyfS4KKwkJZWNobyAkdXNhZ2UKKwkJZXhpdCgxKQorCSAgICBlbHNlIGlmICggJCNhcmd2IDwgMiApIHRoZW4KKwkJZWNobyAke3Byb2d9OiAtZCBvcHRpb24gcmVxdWlyZXMgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorCQllY2hvICR1c2FnZQorCQlleGl0KDEpCisJICAgIGVsc2UKKwkJc2V0IGRlc3REaXIgPSAkYXJndlsyXQorCQlzaGlmdDsgc2hpZnQKKwkJYnJlYWtzdworCSAgICBlbmRpZgorCWNhc2UgLWY6CisJICAgIGlmICggJD9yb290RGlyICkgdGhlbgorCQllY2hvICR7cHJvZ306IHJvb3QtZGlyIHBhcmFtZXRlciBhbHJlYWR5IHNldCB0byAke3Jvb3REaXJ9LgorCQllY2hvICR1c2FnZQorCQlleGl0KDEpCisJICAgIGVsc2UgaWYgKCAkI2FyZ3YgPCAyICkgdGhlbgorCQllY2hvICR7cHJvZ306IC1mIG9wdGlvbiByZXF1aXJlcyBwYWNrYWdlIHJvb3QgZGlyZWN0b3J5LgorCQllY2hvICR1c2FnZQorCQlleGl0KDEpCisJICAgIGVsc2UKKwkJc2V0IHJvb3REaXIgPSAkYXJndlsyXQorCQlzZXQgZmZsYWcKKwkJc2hpZnQ7IHNoaWZ0CisJCWJyZWFrc3cKKwkgICAgZW5kaWYKKwljYXNlIC1yOgorCSAgICBpZiAoICQ/cmVzRGlyICkgdGhlbgorCQllY2hvICR7cHJvZ306IHJlc291cmNlLWRpciBwYXJhbWV0ZXIgYWxyZWFkeSBzZXQgdG8gJHtyZXNEaXJ9LgorCQllY2hvICR1c2FnZQorCQlleGl0KDEpCisJICAgIGVsc2UgaWYgKCAkI2FyZ3YgPCAyICkgdGhlbgorCQllY2hvICR7cHJvZ306IC1yIG9wdGlvbiByZXF1aXJlcyBwYWNrYWdlIHJlc291cmNlIGRpcmVjdG9yeS4KKwkJZWNobyAkdXNhZ2UKKwkJZXhpdCgxKQorCSAgICBlbHNlCisJCXNldCByZXNEaXIgPSAkYXJndlsyXQorCQlzaGlmdDsgc2hpZnQKKwkJYnJlYWtzdworCSAgICBlbmRpZgorCWNhc2UgLXRyYWRpdGlvbmFsOgorCSAgICBzZXQgdXNldGFyCisgICAgICAgICAgICB1bnNldCB1c2VnbnV0YXIKKwkgICAgdW5zZXQgdXNlcGF4CisJICAgIGJyZWFrc3cKKyAgICAgICAgY2FzZSAtZ251dGFyOgorCSAgICBzZXQgdXNlZ251dGFyCisgICAgICAgICAgICB1bnNldCB1c2VwYXgKKwkgICAgdW5zZXQgdXNldGFyCisJY2FzZSAtQjoKKwkgICAgIyBXZSBnb3QgbG9uZyBmaWxlIG5hbWVzLCBiZXR0ZXIgdXNlIGJpZ3RhciBpbnN0ZWFkCisJICAgICNzZXQgYXJjaGl2ZXIgPSAvTmV4dEFkbWluL0luc3RhbGxlci5hcHAvUmVzb3VyY2VzL2luc3RhbGxlcl9iaWd0YXIKKwkgICAgZWNobyAyPiYxICR7cHJvZ306IC1CIGZsYWcgaXMgbm8gbG9uZ2VyIHJlbGV2YW50LgorCSAgICBzaGlmdAorCSAgICBicmVha3N3CisJY2FzZSAtKjoKKwkgICAgZWNobyAke3Byb2d9OiBVbmtub3duIG9wdGlvbjogJGFyZ3ZbMV0KKwkgICAgZWNobyAkdXNhZ2UKKwkgICAgZXhpdCgxKQorCWNhc2UgKi5pbmZvOgorCSAgICBpZiAoICQ/aW5mbyApIHRoZW4KKwkJZWNobyAke3Byb2d9OiBpbmZvLWZpbGUgcGFyYW1ldGVyIGFscmVhZHkgc2V0IHRvICR7aW5mb30uCisJCWVjaG8gJHVzYWdlCisJCWV4aXQoMSkKKwkgICAgZWxzZQorCQlzZXQgaW5mbyA9ICIkYXJndlsxXSIKKwkJc2hpZnQKKwkJYnJlYWtzdworCSAgICBlbmRpZgorCWNhc2UgKi50aWZmOgorCSAgICBpZiAoICQ/dGlmZiApIHRoZW4KKwkJZWNobyAke3Byb2d9OiB0aWZmLWZpbGUgcGFyYW1ldGVyIGFscmVhZHkgc2V0IHRvICR7dGlmZn0uCisJCWVjaG8gJHVzYWdlCisJCWV4aXQoMSkKKwkgICAgZWxzZQorCQlzZXQgdGlmZiA9ICIkYXJndlsxXSIKKwkJc2hpZnQKKwkJYnJlYWtzdworCSAgICBlbmRpZgorCWRlZmF1bHQ6CisJICAgIGlmICggJD9yb290RGlyICkgdGhlbgorCQllY2hvICR7cHJvZ306IHVucmVjb2duaXplZCBwYXJhbWV0ZXI6ICRhcmd2WzFdCisJCWVjaG8gJHVzYWdlCisJCWV4aXQoMSkKKwkgICAgZWxzZQorCQlzZXQgcm9vdERpciA9ICIkYXJndlsxXSIKKwkJc2hpZnQKKwkJYnJlYWtzdworCSAgICBlbmRpZgorICAgIGVuZHN3CitlbmQKKworIyBjaGVjayBmb3IgbWFuZGF0b3J5IHBhcmFtZXRlcnMKK2lmICggISAkP3Jvb3REaXIgKSB0aGVuCisgICAgZWNobyAke3Byb2d9OiBtaXNzaW5nIHJvb3QtZGlyIHBhcmFtZXRlci4KKyAgICBlY2hvICR1c2FnZQorICAgIGV4aXQoMSkKK2Vsc2UgaWYgKCAhICQ/aW5mbykgdGhlbgorICAgIGVjaG8gJHtwcm9nfTogbWlzc2luZyBpbmZvLWZpbGUgcGFyYW1ldGVyLgorICAgIGVjaG8gJHVzYWdlCisgICAgZXhpdCgxKQorZW5kaWYKKworIyBkZXN0RGlyIGdldHMgZGVmYXVsdCB2YWx1ZSBpZiB1bnNldCBvbiBjb21tYW5kIGxpbmUKK2lmICggJD9kZXN0RGlyICkgdGhlbgorICAgIC9iaW4vbWtkaXIgLXAgJGRlc3REaXIKK2Vsc2UKKyAgICBzZXQgZGVzdERpciA9IC4KK2VuZGlmCisKKyMgZGVyaXZlIHRoZSByb290IG5hbWUgZm9yIHRoZSBwYWNrYWdlIGZyb20gdGhlIHJvb3QgbmFtZSBvZiB0aGUgaW5mbyBmaWxlCitzZXQgcm9vdCA9IGAvdXNyL2Jpbi9iYXNlbmFtZSAkaW5mbyAuaW5mb2AKKworIyBjcmVhdGUgcGFja2FnZSBkaXJlY3RvcnkKK3NldCBwa2cgPSAke2Rlc3REaXJ9LyR7cm9vdH0ucGtnCitlY2hvIEdlbmVyYXRpbmcgSW5zdGFsbGVyIHBhY2thZ2UgJHBrZyAuLi4KK2lmICggLWUgJHBrZyApIC9iaW4vcm0gLXJmICRwa2cKKy9iaW4vbWtkaXIgLXAgLW0gNzU1ICRwa2cKKworIyAoZ251KXRhci9wYXggYW5kIGNvbXByZXNzIHJvb3QgZGlyZWN0b3J5IHRvIHBhY2thZ2UgYXJjaGl2ZQorZWNobyAtbiAiCWNyZWF0aW5nIHBhY2thZ2UgYXJjaGl2ZSAuLi4gIgoraWYgKCAkP2ZmbGFnICkgdGhlbgorICAgIHNldCBwa2dUb3AgPSAke3Jvb3REaXI6dH0KKyAgICBzZXQgcGFyZW50ID0gJHtyb290RGlyOmh9CisgICAgaWYgKCAiJHBhcmVudCIgPT0gIiRwa2dUb3AiICkgc2V0IHBhcmVudCA9ICIuIgorZWxzZQorICAgIHNldCBwYXJlbnQgPSAkcm9vdERpcgorICAgIHNldCBwa2dUb3AgPSAuICAgIAorZW5kaWYKK2lmICggJD91c2V0YXIgKSB0aGVuCisgICAgc2V0IHBrZ0FyY2hpdmUgPSAkcGtnLyRyb290LnRhci5aCisgICAgKGNkICRwYXJlbnQ7ICR0YXIgLXcgJHBrZ1RvcCkgfCAvdXNyL2Jpbi9jb21wcmVzcyAtZiAtYyA+ICRwa2dBcmNoaXZlCitlbHNlIGlmICggJD91c2VnbnV0YXIgKSB0aGVuCisgICAgc2V0IHBrZ0FyY2hpdmUgPSAkcGtnLyRyb290LnRhci5negorICAgIChjZCAkcGFyZW50OyAkZ251dGFyIHpjZiAkcGtnQXJjaGl2ZSAkcGtnVG9wKQorZWxzZQorICAgIHNldCBwa2dBcmNoaXZlID0gJHBrZy8kcm9vdC5wYXguZ3oKKyAgICAoY2QgJHBhcmVudDsgJHBheCAtdyAteiAteCBjcGlvICRwa2dUb3ApID4gJHBrZ0FyY2hpdmUKK2VuZGlmCisvYmluL2NobW9kIDQ0NCAkcGtnQXJjaGl2ZQorZWNobyBkb25lLgorCisjIGNvcHkgaW5mbyBmaWxlIHRvIHBhY2thZ2UKK3NldCBwa2dJbmZvID0gJHBrZy8kcm9vdC5pbmZvCitlY2hvIC1uICIJY29weWluZyAke2luZm86dH0gLi4uICIKKy9iaW4vY3AgJGluZm8gJHBrZ0luZm8KKy9iaW4vY2htb2QgNDQ0ICRwa2dJbmZvCitlY2hvIGRvbmUuCisKKyMgY29weSB0aWZmIGZpbGUgdG8gcGFja2FnZQoraWYgKCAkP3RpZmYgKSB0aGVuCisgICAgc2V0IHBrZ1RpZmYgPSAkcGtnLyRyb290LnRpZmYKKyAgICBlY2hvIC1uICIJY29weWluZyAke3RpZmY6dH0gLi4uICIKKyAgICAvYmluL2NwICR0aWZmICRwa2dUaWZmCisgICAgL2Jpbi9jaG1vZCA0NDQgJHBrZ1RpZmYKKyAgICBlY2hvIGRvbmUuCitlbmRpZgorCisjIGNvcHkgcmVzb3VyY2VzIHRvIHBhY2thZ2UKK2lmICggJD9yZXNEaXIgKSB0aGVuCisgICAgZWNobyAtbiAiCWNvcHlpbmcgJHtyZXNEaXI6dH0gLi4uICIKKworICAgICMgZG9uJ3Qgd2FudCB0byBzZWUgcHVzaC9wb3Agb3V0cHV0CisgICAgcHVzaGQgJHJlc0RpciA+IC9kZXYvbnVsbAorCSMgZ2V0IGxpc3RzIG9mIHJlc291cmNlcy4gV2UnbGwgd2FudCB0byBjaGFuZ2UKKwkjIHBlcm1pc3Npb25zIG9uIGp1c3QgdGhlc2UgdGhpbmdzIGxhdGVyLgorICAgICAgICBzZXQgZGlyZWN0b3JpZXNJblJlc0RpciA9IGBmaW5kIC4gLXR5cGUgZGAKKyAgICAgICAgc2V0IGZpbGVzSW5SZXNEaXIgPSBgZmluZCAuIC10eXBlIGZgCisgICAgcG9wZCA+IC9kZXYvbnVsbAorCisgICAgIyBjb3B5IHRoZSByZXNvdXJjZSBkaXJlY3RvcnkgY29udGVudHMgaW50byB0aGUgcGFja2FnZSBkaXJlY3RvcnkKKyAgICBmb3JlYWNoIHJlc0ZpbGUgKGBscyAkcmVzRGlyYCkKKwljcCAtciAkcmVzRGlyLyRyZXNGaWxlICRwa2cKKyAgICBlbmQKKworICAgIHB1c2hkICRwa2cgPiAvZGV2L251bGwKKwkjIENoYW5nZSBhbGwgZGlyZWN0b3JpZXMgdG8gK3IreCwgZXhjZXB0IHRoZSBwYWNrYWdlCisJIyBkaXJlY3RvcnkgaXRzZWxmCisgICAgICAgIGZvcmVhY2ggcmVzRmlsZUl0ZW0gKCRkaXJlY3Rvcmllc0luUmVzRGlyKQorICAgICAgICAgICAgaWYgKCAkcmVzRmlsZUl0ZW0gIT0gIi4iICkgdGhlbgorICAgICAgICAgICAgICAgIGNobW9kIDU1NSAkcmVzRmlsZUl0ZW0KKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZAorCSMgY2hhbmdlIGFsbCBmbGF0IGZpbGVzIHRvIHJlYWQgb25seQorICAgICAgICBmb3JlYWNoIHJlc0ZpbGVJdGVtICgkZmlsZXNJblJlc0RpcikKKyAgICAgICAgICAgIGNobW9kIDQ0NCAkcmVzRmlsZUl0ZW0KKyAgICAgICAgZW5kCisgICAgcG9wZCA+IC9kZXYvbnVsbAorCisgICAgZWNobyBkb25lLgorZW5kaWYKKworIyBnZW5lcmF0ZSBib20gZmlsZQorc2V0IHBrZ0JvbSA9ICRwa2cvJHJvb3QuYm9tCitlY2hvIC1uICIJZ2VuZXJhdGluZyBib20gZmlsZSAuLi4gIgorL2Jpbi9ybSAtZiAkcGtnQm9tCitpZiAoICQ/ZmZsYWcgKSB0aGVuCisgICAgJG1rYm9tICRwYXJlbnQgJHBrZ0JvbSA+JiAvZGV2L251bGwKK2Vsc2UKKyAgICAkbWtib20gJHJvb3REaXIgJHBrZ0JvbSA+JiAvZGV2L251bGwKK2VuZGlmCisvYmluL2NobW9kIDQ0NCAkcGtnQXJjaGl2ZQorZWNobyBkb25lLgorCQorIyBnZW5lcmF0ZSBzaXplcyBmaWxlCitzZXQgcGtnU2l6ZXMgPSAkcGtnLyRyb290LnNpemVzCitlY2hvIC1uICIJZ2VuZXJhdGluZyBzaXplcyBmaWxlIC4uLiAiCisKKyMgY29tcHV0ZSBudW1iZXIgb2YgZmlsZXMgaW4gcGFja2FnZQorc2V0IG51bUZpbGVzID0gYCRsc2JvbSAtcyAkcGtnQm9tIHwgL3Vzci9iaW4vd2MgLWxgCisKKyMgY29tcHV0ZSBwYWNrYWdlIHNpemUgd2hlbiBjb21wcmVzc2VkCitAIGNvbXByZXNzZWRTaXplID0gYC91c3IvYmluL2R1IC1rIC1zICRwa2cgfCAkYXdrICd7cHJpbnQgJDF9J2AKK0AgY29tcHJlc3NlZFNpemUgKz0gMwkJIyBhZGQgMUtCIGVhY2ggZm9yIHNpemVzLCBsb2NhdGlvbiwgc3RhdHVzIGZpbGVzCisKK0AgaW5mb1NpemUgPSBgL2Jpbi9scyAtcyAkcGtnSW5mbyB8ICRhd2sgJ3twcmludCAkMX0nYAorQCBib21TaXplID0gYC9iaW4vbHMgLXMgJHBrZ0JvbSB8ICRhd2sgJ3twcmludCAkMX0nYAoraWYgKCAkP3RpZmYgKSB0aGVuCisgICAgQCB0aWZmU2l6ZSA9IGAvYmluL2xzIC1zICRwa2dUaWZmIHwgJGF3ayAne3ByaW50ICQxfSdgCitlbHNlCisgICAgQCB0aWZmU2l6ZSA9IDAKK2VuZGlmIAorCitAIGluc3RhbGxlZFNpemUgPSBgL3Vzci9iaW4vZHUgLWsgLXMgJHJvb3REaXIgfCAkYXdrICd7cHJpbnQgJDF9J2AKK0AgaW5zdGFsbGVkU2l6ZSArPSAkaW5mb1NpemUgKyAkYm9tU2l6ZSArICR0aWZmU2l6ZSArIDMKKworIyBlY2hvIHNpemUgcGFyYW1ldGVycyB0byBzaXplcyBmaWxlCitlY2hvIE51bUZpbGVzICRudW1GaWxlcyAgICAgICAgICAgICA+ICAkcGtnU2l6ZXMKK2VjaG8gSW5zdGFsbGVkU2l6ZSAkaW5zdGFsbGVkU2l6ZSAgID4+ICRwa2dTaXplcworZWNobyBDb21wcmVzc2VkU2l6ZSAkY29tcHJlc3NlZFNpemUgPj4gJHBrZ1NpemVzCitlY2hvIGRvbmUuCitlY2hvICIgLi4uIGZpbmlzaGVkIGdlbmVyYXRpbmcgJHBrZy4iCisKK2V4aXQoMCkKKworIyBlbmQgcGFja2FnZQorCQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL3N0YXRpb25hcnkuY3NoIGIvZGlzdHJpYi9zZGwtMS4yLjE1L1hjb2RlL3N0YXRpb25hcnkuY3NoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhNWEzODUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvc3RhdGlvbmFyeS5jc2gKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL2NzaAorCisjIyMKKyMjIFRoaXMgc2NyaXB0IGluc3RhbGxzIHRoZSBzdGF0aW9uYXJ5CisjIyMKKworc3VkbyAtdiAtcCAiUGxlYXNlIGVudGVyIHRoZSBhZG1pbmlzdHJhdG9yIHBhc3N3b3JkOiAiCisKKyMgcHJvamVjdCB0ZW1wbGF0ZXMKK3N1ZG8gL0RldmVsb3Blci9Ub29scy9DcE1hYyAtciAiUHJvamVjdCBTdGF0aW9uYXJ5L1NETCBBcHBsaWNhdGlvbiIgIi9EZXZlbG9wZXIvUHJvamVjdEJ1aWxkZXIgRXh0cmFzL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uLyIKKworc3VkbyAvRGV2ZWxvcGVyL1Rvb2xzL0NwTWFjIC1yICJQcm9qZWN0IFN0YXRpb25hcnkvU0RMIENvY29hIEFwcGxpY2F0aW9uIiAiL0RldmVsb3Blci9Qcm9qZWN0QnVpbGRlciBFeHRyYXMvUHJvamVjdCBUZW1wbGF0ZXMvQXBwbGljYXRpb24vIgorCitzdWRvIC9EZXZlbG9wZXIvVG9vbHMvQ3BNYWMgLXIgIlByb2plY3QgU3RhdGlvbmFyeS9TREwgQ3VzdG9tIENvY29hIEFwcGxpY2F0aW9uIiAiL0RldmVsb3Blci9Qcm9qZWN0QnVpbGRlciBFeHRyYXMvUHJvamVjdCBUZW1wbGF0ZXMvQXBwbGljYXRpb24vIgorCitzdWRvIC9EZXZlbG9wZXIvVG9vbHMvQ3BNYWMgLXIgIlByb2plY3QgU3RhdGlvbmFyeS9TREwgT3BlbkdMIEFwcGxpY2F0aW9uIiAiL0RldmVsb3Blci9Qcm9qZWN0QnVpbGRlciBFeHRyYXMvUHJvamVjdCBUZW1wbGF0ZXMvQXBwbGljYXRpb24vIgorCisKKyMgdGFyZ2V0IHRlbXBsYXRlcworc3VkbyBta2RpciAtcCAiL0RldmVsb3Blci9Qcm9qZWN0QnVpbGRlciBFeHRyYXMvVGFyZ2V0IFRlbXBsYXRlcy9TREwiCisKK3N1ZG8gL0RldmVsb3Blci9Ub29scy9DcE1hYyAtciAiUHJvamVjdCBTdGF0aW9uYXJ5L0FwcGxpY2F0aW9uLnRyZ3R0bXBsIiAiL0RldmVsb3Blci9Qcm9qZWN0QnVpbGRlciBFeHRyYXMvVGFyZ2V0IFRlbXBsYXRlcy9TREwiCisKKworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvdW5pbnN0YWxsLmNzaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9YY29kZS91bmluc3RhbGwuY3NoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhYjhkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvWGNvZGUvdW5pbnN0YWxsLmNzaApAQCAtMCwwICsxLDMyIEBACisjIS9iaW4vY3NoCisKKyMjIworIyMgVGhpcyBzY3JpcHQgcmVtb3ZlcyB0aGUgRGV2ZWxvcGVyIFNETCBwYWNrYWdlCisjIyMKKworc2V0ZW52IEhPTUVfRElSIH4KKworc3VkbyAtdiAtcCAiRW50ZXIgYWRtaW5pc3RyYXRvciBwYXNzd29yZCB0byByZW1vdmUgU0RMOiAiCisKK3N1ZG8gcm0gLXJmICIkSE9NRV9ESVIvTGlicmFyeS9GcmFtZXdvcmtzL1NETC5mcmFtZXdvcmsiCisKKyMgd2lsbCBvbmx5IHJlbW92ZSB0aGUgRnJhbWV3b3JrcyBkaXIgaWYgZW1wdHkgKHNpbmNlIHdlIHB1dCBpdCB0aGVyZSkKK3N1ZG8gcm1kaXIgIiRIT01FX0RJUi9MaWJyYXJ5L0ZyYW1ld29ya3MiCisKK3N1ZG8gcm0gLXIgIiRIT01FX0RJUi9SZWFkbWUgU0RMIERldmVsb3Blci50eHQiCitzdWRvIHJtIC1yICIvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vU0RMIgorc3VkbyBybSAtciAiL0RldmVsb3Blci9Eb2N1bWVudGF0aW9uL01hblBhZ2VzL21hbjMvU0RMIioKK3N1ZG8gcm0gLXIgIi9EZXZlbG9wZXIvUHJvamVjdEJ1aWxkZXIgRXh0cmFzL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uL1NETCBBcHBsaWNhdGlvbiIKK3N1ZG8gcm0gLXIgIi9EZXZlbG9wZXIvUHJvamVjdEJ1aWxkZXIgRXh0cmFzL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uL1NETCBDb2NvYSBBcHBsaWNhdGlvbiIKK3N1ZG8gcm0gLXIgIi9EZXZlbG9wZXIvUHJvamVjdEJ1aWxkZXIgRXh0cmFzL1Byb2plY3QgVGVtcGxhdGVzL0FwcGxpY2F0aW9uL1NETCBDdXN0b20gQ29jb2EgQXBwbGljYXRpb24iCitzdWRvIHJtIC1yICIvRGV2ZWxvcGVyL1Byb2plY3RCdWlsZGVyIEV4dHJhcy9Qcm9qZWN0IFRlbXBsYXRlcy9BcHBsaWNhdGlvbi9TREwgT3BlbkdMIEFwcGxpY2F0aW9uIgorc3VkbyBybSAtciAiL0RldmVsb3Blci9Qcm9qZWN0QnVpbGRlciBFeHRyYXMvVGFyZ2V0IFRlbXBsYXRlcy9TREwiCitzdWRvIHJtIC1yICIvTGlicmFyeS9SZWNlaXB0cy9TREwtZGV2ZWwucGtnIgorCisjIHJlYnVpbGQgYXByb3BvcyBkYXRhYmFzZQorc3VkbyAvdXNyL2xpYmV4ZWMvbWFrZXdoYXRpcworCit1bnNldGVudiBIT01FX0RJUgorCisKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2FjaW5jbHVkZS9hbHNhLm00IGIvZGlzdHJpYi9zZGwtMS4yLjE1L2FjaW5jbHVkZS9hbHNhLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MThlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2Fsc2EubTQKQEAgLTAsMCArMSwxNDUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIENvbmZpZ3VyZSBQYXRocyBmb3IgQWxzYQorZG5sIFNvbWUgbW9kaWZpY2F0aW9ucyBieSBSaWNoYXJkIEJvdWx0b24gPHJpY2hhcmQtYWxzYUB0YXJ0YXJ1cy5vcmc+CitkbmwgQ2hyaXN0b3BoZXIgTGFuc2Rvd24gPGxhbnNkb2N0QGNzLmFsZnJlZC5lZHU+CitkbmwgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorZG5sIExhc3QgbW9kaWZpY2F0aW9uOiBhbHNhLm00LHYgMS4yMyAyMDA0LzAxLzE2IDE4OjE0OjIyIHRpd2FpIEV4cAorZG5sIEFNX1BBVEhfQUxTQShbTUlOSU1VTS1WRVJTSU9OIFssIEFDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV1dKQorZG5sIFRlc3QgZm9yIGxpYmFzb3VuZCwgYW5kIGRlZmluZSBBTFNBX0NGTEFHUyBhbmQgQUxTQV9MSUJTIGFzIGFwcHJvcHJpYXRlLgorZG5sIGVuYWJsZXMgYXJndW1lbnRzIC0td2l0aC1hbHNhLXByZWZpeD0KK2RubCAgICAgICAgICAgICAgICAgICAtLXdpdGgtYWxzYS1lbmMtcHJlZml4PQorZG5sICAgICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1hbHNhdGVzdAorZG5sCitkbmwgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpZiBBQ1RJT05fSUZfTk9UX0ZPVU5EIGlzIG5vdCBzcGVjaWZpZWQsCitkbmwgYW5kIHRoZSBhbHNhIGxpYnJhcmllcyBhcmUgbm90IGZvdW5kLCBhIGZhdGFsIEFDX01TR19FUlJPUigpIHdpbGwgcmVzdWx0LgorZG5sCitBQ19ERUZVTihbQU1fUEFUSF9BTFNBXSwKK1tkbmwgU2F2ZSB0aGUgb3JpZ2luYWwgQ0ZMQUdTLCBMREZMQUdTLCBhbmQgTElCUworYWxzYV9zYXZlX0NGTEFHUz0iJENGTEFHUyIKK2Fsc2Ffc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKK2Fsc2Ffc2F2ZV9MSUJTPSIkTElCUyIKK2Fsc2FfZm91bmQ9eWVzCisKK2RubAorZG5sIEdldCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMgZm9yIGFsc2EKK2RubAorQUNfQVJHX1dJVEgoYWxzYS1wcmVmaXgsCitbICAtLXdpdGgtYWxzYS1wcmVmaXg9UEZYICBQcmVmaXggd2hlcmUgQWxzYSBsaWJyYXJ5IGlzIGluc3RhbGxlZChvcHRpb25hbCldLAorW2Fsc2FfcHJlZml4PSIkd2l0aHZhbCJdLCBbYWxzYV9wcmVmaXg9IiJdKQorCitBQ19BUkdfV0lUSChhbHNhLWluYy1wcmVmaXgsCitbICAtLXdpdGgtYWxzYS1pbmMtcHJlZml4PVBGWCAgUHJlZml4IHdoZXJlIGluY2x1ZGUgbGlicmFyaWVzIGFyZSAob3B0aW9uYWwpXSwKK1thbHNhX2luY19wcmVmaXg9IiR3aXRodmFsIl0sIFthbHNhX2luY19wcmVmaXg9IiJdKQorCitkbmwgRklYTUU6IHRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZAorQUNfQVJHX0VOQUJMRShhbHNhdGVzdCwKK1sgIC0tZGlzYWJsZS1hbHNhdGVzdCAgICAgIERvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBBbHNhIHByb2dyYW1dLAorW2VuYWJsZV9hbHNhdGVzdD0iJGVuYWJsZXZhbCJdLAorW2VuYWJsZV9hbHNhdGVzdD15ZXNdKQorCitkbmwgQWRkIGFueSBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3JpZXMKK0FDX01TR19DSEVDS0lORyhmb3IgQUxTQSBDRkxBR1MpCitpZiB0ZXN0ICIkYWxzYV9pbmNfcHJlZml4IiAhPSAiIiA7IHRoZW4KKwlBTFNBX0NGTEFHUz0iJEFMU0FfQ0ZMQUdTIC1JJGFsc2FfaW5jX3ByZWZpeCIKKwlDRkxBR1M9IiRDRkxBR1MgLUkkYWxzYV9pbmNfcHJlZml4IgorZmkKK0FDX01TR19SRVNVTFQoJEFMU0FfQ0ZMQUdTKQorCitkbmwgYWRkIGFueSBzcGVjaWFsIGxpYiBkaXJzCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEFMU0EgTERGTEFHUykKK2lmIHRlc3QgIiRhbHNhX3ByZWZpeCIgIT0gIiIgOyB0aGVuCisJQUxTQV9MSUJTPSIkQUxTQV9MSUJTIC1MJGFsc2FfcHJlZml4IgorCUxERkxBR1M9IiRMREZMQUdTICRBTFNBX0xJQlMiCitmaQorCitkbmwgYWRkIHRoZSBhbHNhIGxpYnJhcnkKK0FMU0FfTElCUz0iJEFMU0FfTElCUyAtbGFzb3VuZCAtbG0gLWxkbCAtbHB0aHJlYWQiCitMSUJTPWBlY2hvICRMSUJTIHwgc2VkICdzLy1sbS8vJ2AKK0xJQlM9YGVjaG8gJExJQlMgfCBzZWQgJ3MvLWxkbC8vJ2AKK0xJQlM9YGVjaG8gJExJQlMgfCBzZWQgJ3MvLWxwdGhyZWFkLy8nYAorTElCUz1gZWNobyAkTElCUyB8IHNlZCAncy8gIC8vJ2AKK0xJQlM9IiRBTFNBX0xJQlMgJExJQlMiCitBQ19NU0dfUkVTVUxUKCRBTFNBX0xJQlMpCisKK2RubCBDaGVjayBmb3IgYSB3b3JraW5nIHZlcnNpb24gb2YgbGliYXNvdW5kIHRoYXQgaXMgb2YgdGhlIHJpZ2h0IHZlcnNpb24uCittaW5fYWxzYV92ZXJzaW9uPWlmZWxzZShbJDFdLCAsMC4xLjEsJDEpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxpYmFzb3VuZCBoZWFkZXJzIHZlcnNpb24gPj0gJG1pbl9hbHNhX3ZlcnNpb24pCitub19hbHNhPSIiCisgICAgYWxzYV9taW5fbWFqb3JfdmVyc2lvbj1gZWNobyAkbWluX2Fsc2FfdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wxLydgCisgICAgYWxzYV9taW5fbWlub3JfdmVyc2lvbj1gZWNobyAkbWluX2Fsc2FfdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wyLydgCisgICAgYWxzYV9taW5fbWljcm9fdmVyc2lvbj1gZWNobyAkbWluX2Fsc2FfdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCisKK0FDX0xBTkdfU0FWRQorQUNfTEFOR19DCitBQ19UUllfQ09NUElMRShbCisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KK10sIFsKKy8qIGVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjaWYgIWRlZmluZWQoU05EX0xJQl9NQUpPUikgJiYgZGVmaW5lZChTT1VORExJQl9WRVJTSU9OX01BSk9SKQorI2RlZmluZSBTTkRfTElCX01BSk9SIFNPVU5ETElCX1ZFUlNJT05fTUFKT1IKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNORF9MSUJfTUlOT1IpICYmIGRlZmluZWQoU09VTkRMSUJfVkVSU0lPTl9NSU5PUikKKyNkZWZpbmUgU05EX0xJQl9NSU5PUiBTT1VORExJQl9WRVJTSU9OX01JTk9SCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTTkRfTElCX1NVQk1JTk9SKSAmJiBkZWZpbmVkKFNPVU5ETElCX1ZFUlNJT05fU1VCTUlOT1IpCisjZGVmaW5lIFNORF9MSUJfU1VCTUlOT1IgU09VTkRMSUJfVkVSU0lPTl9TVUJNSU5PUgorI2VuZGlmCisKKyMgIGlmKFNORF9MSUJfTUFKT1IgPiAkYWxzYV9taW5fbWFqb3JfdmVyc2lvbikKKyAgZXhpdCgwKTsKKyMgIGVsc2UKKyMgICAgaWYoU05EX0xJQl9NQUpPUiA8ICRhbHNhX21pbl9tYWpvcl92ZXJzaW9uKQorIyAgICAgICBlcnJvciBub3QgcHJlc2VudAorIyAgICBlbmRpZgorCisjICAgaWYoU05EX0xJQl9NSU5PUiA+ICRhbHNhX21pbl9taW5vcl92ZXJzaW9uKQorICBleGl0KDApOworIyAgIGVsc2UKKyMgICAgIGlmKFNORF9MSUJfTUlOT1IgPCAkYWxzYV9taW5fbWlub3JfdmVyc2lvbikKKyMgICAgICAgICAgZXJyb3Igbm90IHByZXNlbnQKKyMgICAgICBlbmRpZgorCisjICAgICAgaWYoU05EX0xJQl9TVUJNSU5PUiA8ICRhbHNhX21pbl9taWNyb192ZXJzaW9uKQorIyAgICAgICAgZXJyb3Igbm90IHByZXNlbnQKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKK2V4aXQoMCk7CitdLAorICBbQUNfTVNHX1JFU1VMVChmb3VuZC4pXSwKKyAgW0FDX01TR19SRVNVTFQobm90IHByZXNlbnQuKQorICAgaWZlbHNlKFskM10sICwgW0FDX01TR19FUlJPUihTdWZmaWNpZW50bHkgbmV3IHZlcnNpb24gb2YgbGliYXNvdW5kIG5vdCBmb3VuZC4pXSkKKyAgIGFsc2FfZm91bmQ9bm9dCispCitBQ19MQU5HX1JFU1RPUkUKKworZG5sIE5vdyB0aGF0IHdlIGtub3cgdGhhdCB3ZSBoYXZlIHRoZSByaWdodCB2ZXJzaW9uLCBsZXQncyBzZWUgaWYgd2UgaGF2ZSB0aGUgbGlicmFyeSBhbmQgbm90IGp1c3QgdGhlIGhlYWRlcnMuCitpZiB0ZXN0ICJ4JGVuYWJsZV9hbHNhdGVzdCIgPSAieHllcyI7IHRoZW4KK0FDX0NIRUNLX0xJQihbYXNvdW5kXSwgW3NuZF9jdGxfb3Blbl0sLAorCVtpZmVsc2UoWyQzXSwgLCBbQUNfTVNHX0VSUk9SKE5vIGxpbmthYmxlIGxpYmFzb3VuZCB3YXMgZm91bmQuKV0pCisJIGFsc2FfZm91bmQ9bm9dCispCitmaQorCitpZiB0ZXN0ICJ4JGFsc2FfZm91bmQiID0gInh5ZXMiIDsgdGhlbgorICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgIExJQlM9YGVjaG8gJExJQlMgfCBzZWQgJ3MvLWxhc291bmQvL2cnYAorICAgTElCUz1gZWNobyAkTElCUyB8IHNlZCAncy8gIC8vJ2AKKyAgIExJQlM9Ii1sYXNvdW5kICRMSUJTIgorZmkKK2lmIHRlc3QgIngkYWxzYV9mb3VuZCIgPSAieG5vIiA7IHRoZW4KKyAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCisgICBDRkxBR1M9IiRhbHNhX3NhdmVfQ0ZMQUdTIgorICAgTERGTEFHUz0iJGFsc2Ffc2F2ZV9MREZMQUdTIgorICAgTElCUz0iJGFsc2Ffc2F2ZV9MSUJTIgorICAgQUxTQV9DRkxBR1M9IiIKKyAgIEFMU0FfTElCUz0iIgorZmkKKworZG5sIFRoYXQgc2hvdWxkIGJlIGl0LiAgTm93IGp1c3QgZXhwb3J0IG91dCBzeW1ib2xzOgorQUNfU1VCU1QoQUxTQV9DRkxBR1MpCitBQ19TVUJTVChBTFNBX0xJQlMpCitdKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2FjaW5jbHVkZS9lc2QubTQgYi9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2VzZC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQ2NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2FjaW5jbHVkZS9lc2QubTQKQEAgLTAsMCArMSwxNjggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAtLS0gZXNkLm00IC0tLQorIworIyBDb25maWd1cmUgcGF0aHMgZm9yIEVTRAorIyBNYW5pc2ggU2luZ2ggICAgOTgtOS0zMAorIyBzdG9sZW4gYmFjayBmcm9tIEZyYW5rIEJlbGV3CisjIHN0b2xlbiBmcm9tIE1hbmlzaCBTaW5naAorIyBTaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBPd2VuIFRheWxvcgorCitkbmwgQU1fUEFUSF9FU0QoW01JTklNVU0tVkVSU0lPTiwgW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV1dKQorZG5sIFRlc3QgZm9yIEVTRCwgYW5kIGRlZmluZSBFU0RfQ0ZMQUdTIGFuZCBFU0RfTElCUworZG5sCitBQ19ERUZVTihbQU1fUEFUSF9FU0RdLAorW2RubCAKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzIGZyb20gdGhlIGVzZC1jb25maWcgc2NyaXB0CitkbmwKK0FDX0FSR19XSVRIKGVzZC1wcmVmaXgsWyAgLS13aXRoLWVzZC1wcmVmaXg9UEZYICAgUHJlZml4IHdoZXJlIEVTRCBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBlc2RfcHJlZml4PSIkd2l0aHZhbCIsIGVzZF9wcmVmaXg9IiIpCitBQ19BUkdfV0lUSChlc2QtZXhlYy1wcmVmaXgsWyAgLS13aXRoLWVzZC1leGVjLXByZWZpeD1QRlggRXhlYyBwcmVmaXggd2hlcmUgRVNEIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKyAgICAgICAgICAgIGVzZF9leGVjX3ByZWZpeD0iJHdpdGh2YWwiLCBlc2RfZXhlY19wcmVmaXg9IiIpCitBQ19BUkdfRU5BQkxFKGVzZHRlc3QsIFsgIC0tZGlzYWJsZS1lc2R0ZXN0ICAgICAgIERvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBFU0QgcHJvZ3JhbV0sCisJCSAgICAsIGVuYWJsZV9lc2R0ZXN0PXllcykKKworICBpZiB0ZXN0IHgkZXNkX2V4ZWNfcHJlZml4ICE9IHggOyB0aGVuCisgICAgIGVzZF9hcmdzPSIkZXNkX2FyZ3MgLS1leGVjLXByZWZpeD0kZXNkX2V4ZWNfcHJlZml4IgorICAgICBpZiB0ZXN0IHgke0VTRF9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgICBFU0RfQ09ORklHPSRlc2RfZXhlY19wcmVmaXgvYmluL2VzZC1jb25maWcKKyAgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCB4JGVzZF9wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgZXNkX2FyZ3M9IiRlc2RfYXJncyAtLXByZWZpeD0kZXNkX3ByZWZpeCIKKyAgICAgaWYgdGVzdCB4JHtFU0RfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICAgICAgRVNEX0NPTkZJRz0kZXNkX3ByZWZpeC9iaW4vZXNkLWNvbmZpZworICAgICBmaQorICBmaQorCisgIEFDX1BBVEhfUFJPRyhFU0RfQ09ORklHLCBlc2QtY29uZmlnLCBubykKKyAgbWluX2VzZF92ZXJzaW9uPWlmZWxzZShbJDFdLCAsMC4yLjcsJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgRVNEIC0gdmVyc2lvbiA+PSAkbWluX2VzZF92ZXJzaW9uKQorICBub19lc2Q9IiIKKyAgaWYgdGVzdCAiJEVTRF9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICBub19lc2Q9eWVzCisgIGVsc2UKKyAgICBFU0RfQ0ZMQUdTPWAkRVNEX0NPTkZJRyAkZXNkY29uZl9hcmdzIC0tY2ZsYWdzYAorICAgIEVTRF9MSUJTPWAkRVNEX0NPTkZJRyAkZXNkY29uZl9hcmdzIC0tbGlic2AKKworICAgIGVzZF9tYWpvcl92ZXJzaW9uPWAkRVNEX0NPTkZJRyAkZXNkX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBlc2RfbWlub3JfdmVyc2lvbj1gJEVTRF9DT05GSUcgJGVzZF9hcmdzIC0tdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wyLydgCisgICAgZXNkX21pY3JvX3ZlcnNpb249YCRFU0RfQ09ORklHICRlc2RfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9lc2R0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkRVNEX0NGTEFHUyIKKyAgICAgIExJQlM9IiRMSUJTICRFU0RfTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIEVTRCBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2YgZXNkLWNvbmZpZyB0byBzb21lIGV4dGVudAorZG5sCisgICAgICBybSAtZiBjb25mLmVzZHRlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXNkLmg+CisKK2NoYXIqCitteV9zdHJkdXAgKGNoYXIgKnN0cikKK3sKKyAgY2hhciAqbmV3X3N0cjsKKyAgCisgIGlmIChzdHIpCisgICAgeworICAgICAgbmV3X3N0ciA9IG1hbGxvYyAoKHN0cmxlbiAoc3RyKSArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgIHN0cmNweSAobmV3X3N0ciwgc3RyKTsKKyAgICB9CisgIGVsc2UKKyAgICBuZXdfc3RyID0gTlVMTDsKKyAgCisgIHJldHVybiBuZXdfc3RyOworfQorCitpbnQgbWFpbiAoKQoreworICBpbnQgbWFqb3IsIG1pbm9yLCBtaWNybzsKKyAgY2hhciAqdG1wX3ZlcnNpb247CisKKyAgc3lzdGVtICgidG91Y2ggY29uZi5lc2R0ZXN0Iik7CisKKyAgLyogSFAvVVggOSAoJUAjISkgd3JpdGVzIHRvIHNzY2FuZiBzdHJpbmdzICovCisgIHRtcF92ZXJzaW9uID0gbXlfc3RyZHVwKCIkbWluX2VzZF92ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9lc2RfdmVyc2lvbiIpOworICAgICBleGl0KDEpOworICAgfQorCisgICBpZiAoKCRlc2RfbWFqb3JfdmVyc2lvbiA+IG1ham9yKSB8fAorICAgICAgKCgkZXNkX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmICgkZXNkX21pbm9yX3ZlcnNpb24gPiBtaW5vcikpIHx8CisgICAgICAoKCRlc2RfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKCRlc2RfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYgKCRlc2RfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZigiXG4qKiogJ2VzZC1jb25maWcgLS12ZXJzaW9uJyByZXR1cm5lZCAlZC4lZC4lZCwgYnV0IHRoZSBtaW5pbXVtIHZlcnNpb25cbiIsICRlc2RfbWFqb3JfdmVyc2lvbiwgJGVzZF9taW5vcl92ZXJzaW9uLCAkZXNkX21pY3JvX3ZlcnNpb24pOworICAgICAgcHJpbnRmKCIqKiogb2YgRVNEIHJlcXVpcmVkIGlzICVkLiVkLiVkLiBJZiBlc2QtY29uZmlnIGlzIGNvcnJlY3QsIHRoZW4gaXQgaXNcbiIsIG1ham9yLCBtaW5vciwgbWljcm8pOworICAgICAgcHJpbnRmKCIqKiogYmVzdCB0byB1cGdyYWRlIHRvIHRoZSByZXF1aXJlZCB2ZXJzaW9uLlxuIik7CisgICAgICBwcmludGYoIioqKiBJZiBlc2QtY29uZmlnIHdhcyB3cm9uZywgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBFU0RfQ09ORklHXG4iKTsKKyAgICAgIHByaW50ZigiKioqIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IGNvcHkgb2YgZXNkLWNvbmZpZywgYW5kIHJlbW92ZSB0aGUgZmlsZVxuIik7CisgICAgICBwcmludGYoIioqKiBjb25maWcuY2FjaGUgYmVmb3JlIHJlLXJ1bm5pbmcgY29uZmlndXJlXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KK30KKworXSwsIG5vX2VzZD15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fZXNkIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJEVTRF9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICAgICBlY2hvICIqKiogVGhlIGVzZC1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBFU0QgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBFU0Qgd2FzIGluc3RhbGxlZCBpbiBQUkVGSVgsIG1ha2Ugc3VyZSBQUkVGSVgvYmluIGlzIGluIgorICAgICAgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgRVNEX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgICAgZWNobyAiKioqIGZ1bGwgcGF0aCB0byBlc2QtY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5lc2R0ZXN0IDsgdGhlbgorICAgICAgICA6CisgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIEVTRCB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJEVTRF9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJEVTRF9MSUJTIgorICAgICAgICAgIEFDX1RSWV9MSU5LKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVzZC5oPgorXSwgICAgICBbIHJldHVybiAwOyBdLAorICAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGNvbXBpbGVkLCBidXQgZGlkIG5vdCBydW4uIFRoaXMgdXN1YWxseSBtZWFucyIKKyAgICAgICAgICBlY2hvICIqKiogdGhhdCB0aGUgcnVuLXRpbWUgbGlua2VyIGlzIG5vdCBmaW5kaW5nIEVTRCBvciBmaW5kaW5nIHRoZSB3cm9uZyIKKyAgICAgICAgICBlY2hvICIqKiogdmVyc2lvbiBvZiBFU0QuIElmIGl0IGlzIG5vdCBmaW5kaW5nIEVTRCwgeW91J2xsIG5lZWQgdG8gc2V0IHlvdXIiCisgICAgICAgICAgZWNobyAiKioqIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgZWRpdCAvZXRjL2xkLnNvLmNvbmYgdG8gcG9pbnQiCisgICAgICAgICAgZWNobyAiKioqIHRvIHRoZSBpbnN0YWxsZWQgbG9jYXRpb24gIEFsc28sIG1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gbGRjb25maWcgaWYgdGhhdCIKKyAgICAgICAgICBlY2hvICIqKiogaXMgcmVxdWlyZWQgb24geW91ciBzeXN0ZW0iCisJICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqIElmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIGluc3RhbGxlZCwgaXQgaXMgYmVzdCB0byByZW1vdmUgaXQsIGFsdGhvdWdoIgorICAgICAgICAgIGVjaG8gIioqKiB5b3UgbWF5IGFsc28gYmUgYWJsZSB0byBnZXQgdGhpbmdzIHRvIHdvcmsgYnkgbW9kaWZ5aW5nIExEX0xJQlJBUllfUEFUSCJdLAorICAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGZhaWxlZCB0byBjb21waWxlIG9yIGxpbmsuIFNlZSB0aGUgZmlsZSBjb25maWcubG9nIGZvciB0aGUiCisgICAgICAgICAgZWNobyAiKioqIGV4YWN0IGVycm9yIHRoYXQgb2NjdXJlZC4gVGhpcyB1c3VhbGx5IG1lYW5zIEVTRCB3YXMgaW5jb3JyZWN0bHkgaW5zdGFsbGVkIgorICAgICAgICAgIGVjaG8gIioqKiBvciB0aGF0IHlvdSBoYXZlIG1vdmVkIEVTRCBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHlvdSIKKyAgICAgICAgICBlY2hvICIqKiogbWF5IHdhbnQgdG8gZWRpdCB0aGUgZXNkLWNvbmZpZyBzY3JpcHQ6ICRFU0RfQ09ORklHIiBdKQorICAgICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgICAgZmkKKyAgICAgZmkKKyAgICAgRVNEX0NGTEFHUz0iIgorICAgICBFU0RfTElCUz0iIgorICAgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICBmaQorICBBQ19TVUJTVChFU0RfQ0ZMQUdTKQorICBBQ19TVUJTVChFU0RfTElCUykKKyAgcm0gLWYgY29uZi5lc2R0ZXN0CitdKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2FjaW5jbHVkZS9saWJ0b29sLm00IGIvZGlzdHJpYi9zZGwtMS4yLjE1L2FjaW5jbHVkZS9saWJ0b29sLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDIyM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2xpYnRvb2wubTQKQEAgLTAsMCArMSw3MzcwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmFzZWQgb24gbGlidG9vbC0yLjIuNmEKKyMgbGlidG9vbC5tNCAtIENvbmZpZ3VyZSBsaWJ0b29sIGZvciB0aGUgaG9zdCBzeXN0ZW0uIC0qLUF1dG9jb25mLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworbTRfZGVmaW5lKFtfTFRfQ09QWUlOR10sIFtkbmwKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQsIDE5OTYKKyMKKyMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbC4KKyMKKyMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAorIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKKyMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQorIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwgb3IKKyMgb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KK10pCisKKyMgc2VyaWFsIDU2IExUX0lOSVQKKworCisjIExUX1BSRVJFUShWRVJTSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGxhaW4gYW5kIGV4aXQgaWYgdGhpcyBsaWJ0b29sIHZlcnNpb24gaXMgbGVzcyB0aGF0IFZFUlNJT04uCittNF9kZWZ1bihbTFRfUFJFUkVRXSwKK1ttNF9pZihtNF92ZXJzaW9uX2NvbXBhcmUobTRfZGVmbihbTFRfUEFDS0FHRV9WRVJTSU9OXSksIFskMV0pLCAtMSwKKyAgICAgICBbbTRfZGVmYXVsdChbJDNdLAorCQkgICBbbTRfZmF0YWwoW0xpYnRvb2wgdmVyc2lvbiAkMSBvciBoaWdoZXIgaXMgcmVxdWlyZWRdLAorCQkgICAgICAgICAgICAgNjMpXSldLAorICAgICAgIFskMl0pXSkKKworCisjIF9MVF9DSEVDS19CVUlMRERJUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGxhaW4gaWYgdGhlIGFic29sdXRlIGJ1aWxkIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycworbTRfZGVmdW4oW19MVF9DSEVDS19CVUlMRERJUl0sCitbY2FzZSBgcHdkYCBpbgorICAqXCAqIHwgKlwJKikKKyAgICBBQ19NU0dfV0FSTihbTGlidG9vbCBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCB3aGl0ZXNwYWNlIGluIGBwd2RgXSkgOzsKK2VzYWMKK10pCisKKworIyBMVF9JTklUKFtPUFRJT05TXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfSU5JVF0sCitbQUNfUFJFUkVRKFsyLjU4XSlkbmwgV2UgdXNlIEFDX0lOQ0xVREVTX0RFRkFVTFQKK0FDX0JFRk9SRShbJDBdLCBbTFRfTEFOR10pZG5sCitBQ19CRUZPUkUoWyQwXSwgW0xUX09VVFBVVF0pZG5sCitBQ19CRUZPUkUoWyQwXSwgW0xURExfSU5JVF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfQlVJTERESVJdKWRubAorCitkbmwgQXV0b2NvbmYgZG9lc24ndCBjYXRjaCB1bmV4cGFuZGVkIExUXyBtYWNyb3MgYnkgZGVmYXVsdDoKK200X3BhdHRlcm5fZm9yYmlkKFteXz9MVF9bQS1aX10rJF0pZG5sCittNF9wYXR0ZXJuX2FsbG93KFteKF9MVF9FT0Z8TFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PV3xMVF9NVUxUSV9NT0RVTEUpJF0pZG5sCitkbmwgYWNsb2NhbCBkb2Vzbid0IHB1bGwgbHRvcHRpb25zLm00LCBsdHN1Z2FyLm00LCBvciBsdHZlcnNpb24ubTQKK2RubCB1bmxlc3Mgd2UgcmVxdWlyZSBhbiBBQ19ERUZVTmVkIG1hY3JvOgorQUNfUkVRVUlSRShbTFRPUFRJT05TX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRTVUdBUl9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUVkVSU0lPTl9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUT0JTT0xFVEVfVkVSU0lPTl0pZG5sCittNF9yZXF1aXJlKFtfTFRfUFJPR19MVE1BSU5dKWRubAorCitkbmwgUGFyc2UgT1BUSU9OUworX0xUX1NFVF9PUFRJT05TKFskMF0sIFskMV0pCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGx0bWFpbiIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworQUNfU1VCU1QoTElCVE9PTClkbmwKKworX0xUX1NFVFVQCisKKyMgT25seSBleHBhbmQgb25jZToKK200X2RlZmluZShbTFRfSU5JVF0pCitdKSMgTFRfSU5JVAorCisjIE9sZCBuYW1lczoKK0FVX0FMSUFTKFtBQ19QUk9HX0xJQlRPT0xdLCBbTFRfSU5JVF0pCitBVV9BTElBUyhbQU1fUFJPR19MSUJUT09MXSwgW0xUX0lOSVRdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX0xJQlRPT0xdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fUFJPR19MSUJUT09MXSwgW10pCisKKworIyBfTFRfQ0NfQkFTRU5BTUUoQ0MpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsY3VsYXRlIGNjX2Jhc2VuYW1lLiAgU2tpcCBrbm93biBjb21waWxlciB3cmFwcGVycyBhbmQgY3Jvc3MtcHJlZml4LgorbTRfZGVmdW4oW19MVF9DQ19CQVNFTkFNRV0sCitbZm9yIGNjX3RlbXAgaW4gJDEiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1tcXC9dXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1tcXC9dXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltbXFwvXV1kaXN0Y2MgfCBwdXJpZnkgfCAqW1tcXC9dXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRFQ0hPICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCitdKQorCisKKyMgX0xUX0ZJTEVVVElMU19ERUZBVUxUUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEl0IGlzIG9rYXkgdG8gdXNlIHRoZXNlIGZpbGUgY29tbWFuZHMgYW5kIGFzc3VtZSB0aGV5IGhhdmUgYmVlbiBzZXQKKyMgc2Vuc2libHkgYWZ0ZXIgYG00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKScuCittNF9kZWZ1bihbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10sCitbOiAke0NQPSJjcCAtZiJ9Cis6ICR7TVY9Im12IC1mIn0KKzogJHtSTT0icm0gLWYifQorXSkjIF9MVF9GSUxFVVRJTFNfREVGQVVMVFMKKworCisjIF9MVF9TRVRVUAorIyAtLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfU0VUVVBdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitfTFRfREVDTChbXSwgW2hvc3RfYWxpYXNdLCBbMF0sIFtUaGUgaG9zdCBzeXN0ZW1dKWRubAorX0xUX0RFQ0woW10sIFtob3N0XSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtob3N0X29zXSwgWzBdKWRubAorZG5sCitfTFRfREVDTChbXSwgW2J1aWxkX2FsaWFzXSwgWzBdLCBbVGhlIGJ1aWxkIHN5c3RlbV0pZG5sCitfTFRfREVDTChbXSwgW2J1aWxkXSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtidWlsZF9vc10sIFswXSlkbmwKK2RubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAordGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgorX0xUX0RFQ0woW10sIFtMTl9TXSwgWzFdLCBbV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rc10pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0xUX0NNRF9NQVhfTEVOXSlkbmwKK19MVF9ERUNMKFtvYmpleHRdLCBbYWNfb2JqZXh0XSwgWzBdLCBbT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpXSlkbmwKK19MVF9ERUNMKFtdLCBbZXhlZXh0XSwgWzBdLCBbRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpXSlkbmwKK2RubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9SRUxPQURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX09MRF9BUkNISVZFXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbCisjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCisjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcyBJTklULgoraWYgdGVzdCAtbiAiXCR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKK10pCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCisKK19MVF9DSEVDS19PQkpESVIKKworbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSAorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtbImAkXFxdXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbWyJgXFxdXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaW5nbGUgcXVvdGUuCitkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3Q9J3MvJ1wnJy8nXCdcXFxcXFxcJ1wnJy9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKK25vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJworCisjIEdsb2JhbCB2YXJpYWJsZXM6CitvZmlsZT1saWJ0b29sCitjYW5fYnVpbGRfc2hhcmVkPXllcworCisjIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTVNWQywKKyMgd2hpY2ggbmVlZHMgJy5saWInKS4KK2xpYmV4dD1hCisKK3dpdGhfZ251X2xkPSIkbHRfY3ZfcHJvZ19nbnVfbGQiCisKK29sZF9DQz0iJENDIgorb2xkX0NGTEFHUz0iJENGTEFHUyIKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKK3Rlc3QgLXogIiRDQyIgJiYgQ0M9Y2MKK3Rlc3QgLXogIiRMVENDIiAmJiBMVENDPSRDQwordGVzdCAteiAiJExUQ0ZMQUdTIiAmJiBMVENGTEFHUz0kQ0ZMQUdTCit0ZXN0IC16ICIkTEQiICYmIExEPWxkCit0ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bworCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAordGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKK2Nhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCitmaWxlX21hZ2ljKikKKyAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgorICAgIF9MVF9QQVRIX01BR0lDCisgIGZpCisgIDs7Citlc2FjCisKKyMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0CitMVF9TVVBQT1JURURfVEFHKFtDQ10pCitfTFRfTEFOR19DX0NPTkZJRworX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKK19MVF9DT05GSUdfQ09NTUFORFMKK10pIyBfTFRfU0VUVVAKKworCisjIF9MVF9QUk9HX0xUTUFJTgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTm90ZSB0aGF0IHRoaXMgY29kZSBpcyBjYWxsZWQgYm90aCBmcm9tIGBjb25maWd1cmUnLCBhbmQgYGNvbmZpZy5zdGF0dXMnCisjIG5vdyB0aGF0IHdlIHVzZSBBQ19DT05GSUdfQ09NTUFORFMgdG8gZ2VuZXJhdGUgbGlidG9vbC4gIE5vdGFibHksCisjIGBjb25maWcuc3RhdHVzJyBoYXMgbm8gdmFsdWUgZm9yIGFjX2F1eF9kaXIgdW5sZXNzIHdlIGFyZSB1c2luZyBBdXRvbWFrZSwKKyMgc28gd2UgcGFzcyBhIGNvcHkgYWxvbmcgdG8gbWFrZSBzdXJlIGl0IGhhcyBhIHNlbnNpYmxlIHZhbHVlIGFueXdheS4KK200X2RlZnVuKFtfTFRfUFJPR19MVE1BSU5dLAorW200X2lmZGVmKFtBQ19SRVFVSVJFX0FVWF9GSUxFXSwgW0FDX1JFUVVJUkVfQVVYX0ZJTEUoW2x0bWFpbi5zaF0pXSlkbmwKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFthY19hdXhfZGlyPSckYWNfYXV4X2RpciddKQorbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCitdKSMgX0xUX1BST0dfTFRNQUlOCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQWNjdW11bGF0ZSBjb2RlIGZvciBjcmVhdGluZyBsaWJ0b29sLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIFNvIHRoYXQgd2UgY2FuIHJlY3JlYXRlIGEgZnVsbCBsaWJ0b29sIHNjcmlwdCBpbmNsdWRpbmcgYWRkaXRpb25hbAorIyB0YWdzLCB3ZSBhY2N1bXVsYXRlIHRoZSBjaHVua3Mgb2YgY29kZSB0byBzZW5kIHRvIEFDX0NPTkZJR19DT01NQU5EUworIyBpbiBtYWNyb3MgYW5kIHRoZW4gbWFrZSBhIHNpbmdsZSBjYWxsIGF0IHRoZSBlbmQgdXNpbmcgdGhlIGBsaWJ0b29sJworIyBsYWJlbC4KKworCisjIF9MVF9DT05GSUdfTElCVE9PTF9JTklUKFtJTklULUNPTU1BTkRTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWdpc3RlciBJTklULUNPTU1BTkRTIHRvIGJlIHBhc3NlZCB0byBBQ19DT05GSUdfQ09NTUFORFMgbGF0ZXIuCittNF9kZWZpbmUoW19MVF9DT05GSUdfTElCVE9PTF9JTklUXSwKK1ttNF9pZnZhbChbJDFdLAorICAgICAgICAgIFttNF9hcHBlbmQoW19MVF9PVVRQVVRfTElCVE9PTF9JTklUXSwKKyAgICAgICAgICAgICAgICAgICAgIFskMQorXSldKV0pCisKKyMgSW5pdGlhbGl6ZS4KK200X2RlZmluZShbX0xUX09VVFBVVF9MSUJUT09MX0lOSVRdKQorCisKKyMgX0xUX0NPTkZJR19MSUJUT09MKFtDT01NQU5EU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWdpc3RlciBDT01NQU5EUyB0byBiZSBwYXNzZWQgdG8gQUNfQ09ORklHX0NPTU1BTkRTIGxhdGVyLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX0xJQlRPT0xdLAorW200X2lmdmFsKFskMV0sCisgICAgICAgICAgW200X2FwcGVuZChbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgIFskMQorXSldKV0pCisKKyMgSW5pdGlhbGl6ZS4KK200X2RlZmluZShbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTXSkKKworCisjIF9MVF9DT05GSUdfU0FWRV9DT01NQU5EUyhbQ09NTUFORFNdLCBbSU5JVF9DT01NQU5EU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTXSwKK1tfTFRfQ09ORklHX0xJQlRPT0woWyQxXSkKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFskMl0pCitdKQorCisKKyMgX0xUX0ZPUk1BVF9DT01NRU5UKFtDT01NRU5UXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIGxlYWRpbmcgY29tbWVudCBtYXJrcyB0byB0aGUgc3RhcnQgb2YgZWFjaCBsaW5lLCBhbmQgYSB0cmFpbGluZworIyBmdWxsLXN0b3AgdG8gdGhlIHdob2xlIGNvbW1lbnQgaWYgb25lIGlzIG5vdCBwcmVzZW50IGFscmVhZHkuCittNF9kZWZpbmUoW19MVF9GT1JNQVRfQ09NTUVOVF0sCitbbTRfaWZ2YWwoWyQxXSwgWworbTRfYnBhdHN1YnN0KFttNF9icGF0c3Vic3QoWyQxXSwgW14gKl0sIFsjIF0pXSwKKyAgICAgICAgICAgICAgW1snYCRcXV0sIFtcXFwmXSldbTRfYm1hdGNoKFskMV0sIFtbIT8uXSRdLCBbXSwgWy5dKQorKV0pCisKKworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEZJWE1FOiBFbGltaW5hdGUgVkFSTkFNRSAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKworIyBfTFRfREVDTChbQ09ORklHTkFNRV0sIFZBUk5BTUUsIFZBTFVFLCBbREVTQ1JJUFRJT05dLCBbSVMtVEFHR0VEP10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ09ORklHTkFNRSBpcyB0aGUgbmFtZSBnaXZlbiB0byB0aGUgdmFsdWUgaW4gdGhlIGxpYnRvb2wgc2NyaXB0LgorIyBWQVJOQU1FIGlzIHRoZSAoYmFzZSkgbmFtZSB1c2VkIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgorIyBWQUxVRSBtYXkgYmUgMCwgMSBvciAyIGZvciBhIGNvbXB1dGVkIHF1b3RlIGVzY2FwZWQgdmFsdWUgYmFzZWQgb24KKyMgVkFSTkFNRS4gIEFueSBvdGhlciB2YWx1ZSB3aWxsIGJlIHVzZWQgZGlyZWN0bHkuCittNF9kZWZpbmUoW19MVF9ERUNMXSwKK1tsdF9pZl9hcHBlbmRfdW5pcShbbHRfZGVjbF92YXJuYW1lc10sIFskMl0sIFssIF0sCisgICAgW2x0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW2xpYnRvb2xfbmFtZV0sCisJW200X2lmdmFsKFskMV0sIFskMV0sIFskMl0pXSkKKyAgICBsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFt2YWx1ZV0sIFskM10pCisgICAgbTRfaWZ2YWwoWyQ0XSwKKwlbbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbZGVzY3JpcHRpb25dLCBbJDRdKV0pCisgICAgbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLAorCVt0YWdnZWQ/XSwgW200X2lmdmFsKFskNV0sIFt5ZXNdLCBbbm9dKV0pXSkKK10pCisKKworIyBfTFRfVEFHREVDTChbQ09ORklHTkFNRV0sIFZBUk5BTUUsIFZBTFVFLCBbREVTQ1JJUFRJT05dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfVEFHREVDTF0sIFtfTFRfREVDTChbJDFdLCBbJDJdLCBbJDNdLCBbJDRdLCBbeWVzXSldKQorCisKKyMgbHRfZGVjbF90YWdfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3RhZ192YXJuYW1lc10sCitbX2x0X2RlY2xfZmlsdGVyKFt0YWdnZWQ/XSwgW3llc10sICRAKV0pCisKKworIyBfbHRfZGVjbF9maWx0ZXIoU1VCS0VZLCBWQUxVRSwgW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19sdF9kZWNsX2ZpbHRlcl0sCitbbTRfY2FzZShbJCNdLAorICBbMF0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkI10pXSwKKyAgWzFdLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCM6ICQxXSldLAorICBbMl0sIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgWyQxXSwgWyQyXSwgW10sIGx0X2RlY2xfdmFybmFtZXMpXSwKKyAgWzNdLCBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sIFskMV0sIFskMl0sIFskM10sIGx0X2RlY2xfdmFybmFtZXMpXSwKKyAgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCAkQCldKVtdZG5sCitdKQorCisKKyMgbHRfZGVjbF9xdW90ZV92YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF9xdW90ZV92YXJuYW1lc10sCitbX2x0X2RlY2xfZmlsdGVyKFt2YWx1ZV0sIFsxXSwgJEApXSkKKworCisjIGx0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF9kcXVvdGVfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdmFsdWVdLCBbMl0sICRAKV0pCisKKworIyBsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZChbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfdmFybmFtZXNfdGFnZ2VkXSwKK1ttNF9hc3NlcnQoWyQjIDw9IDJdKWRubAorXyQwKG00X3F1b3RlKG00X2RlZmF1bHQoWyQxXSwgW1ssIF1dKSksCisgICAgbTRfaWZ2YWwoWyQyXSwgW1skMl1dLCBbbTRfZHF1b3RlKGx0X2RlY2xfdGFnX3Zhcm5hbWVzKV0pLAorICAgIG00X3NwbGl0KG00X25vcm1hbGl6ZShtNF9xdW90ZShfTFRfVEFHUykpLCBbIF0pKV0pCittNF9kZWZpbmUoW19sdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZF0sCitbbTRfaWZ2YWwoWyQzXSwgW2x0X2NvbWJpbmUoWyQxXSwgWyQyXSwgW19dLCAkMyldKV0pCisKKworIyBsdF9kZWNsX2FsbF92YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfYWxsX3Zhcm5hbWVzXSwKK1tfJDAobTRfcXVvdGUobTRfZGVmYXVsdChbJDFdLCBbWywgXV0pKSwKKyAgICAgbTRfaWYoWyQyXSwgW10sCisJICAgbTRfcXVvdGUobHRfZGVjbF92YXJuYW1lcyksCisJbTRfcXVvdGUobTRfc2hpZnQoJEApKSkpW11kbmwKK10pCittNF9kZWZpbmUoW19sdF9kZWNsX2FsbF92YXJuYW1lc10sCitbbHRfam9pbigkQCwgbHRfZGVjbF92YXJuYW1lc190YWdnZWQoWyQxXSwKKwkJCWx0X2RlY2xfdGFnX3Zhcm5hbWVzKFtbLCBdXSwgbTRfc2hpZnQoJEApKSkpZG5sCitdKQorCisKKyMgX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRShbVkFSTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBRdW90ZSBhIHZhcmlhYmxlIHZhbHVlLCBhbmQgZm9yd2FyZCBpdCB0byBgY29uZmlnLnN0YXR1cycgc28gdGhhdCBpdHMKKyMgZGVjbGFyYXRpb24gdGhlcmUgd2lsbCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGluIGBjb25maWd1cmUnLiAgVkFSTkFNRQorIyBtdXN0IGhhdmUgYSBzaW5nbGUgcXVvdGUgZGVsaW1pdGVkIHZhbHVlIGZvciB0aGlzIHRvIHdvcmsuCittNF9kZWZpbmUoW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkVdLAorWyQxPSdgJEVDSE8gIlgkXVskMSIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJ10pCisKKworIyBfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFdlIGRlbGltaXQgbGlidG9vbCBjb25maWcgdmFyaWFibGVzIHdpdGggc2luZ2xlIHF1b3Rlcywgc28gd2hlbgorIyB3ZSB3cml0ZSB0aGVtIHRvIGNvbmZpZy5zdGF0dXMsIHdlIGhhdmUgdG8gYmUgc3VyZSB0byBxdW90ZSBhbGwKKyMgZW1iZWRkZWQgc2luZ2xlIHF1b3RlcyBwcm9wZXJseS4gIEluIGNvbmZpZ3VyZSwgdGhpcyBtYWNybyBleHBhbmRzCisjIGVhY2ggdmFyaWFibGUgZGVjbGFyZWQgd2l0aCBfTFRfREVDTCAoYW5kIF9MVF9UQUdERUNMKSBpbnRvOgorIworIyAgICA8dmFyPj0nYCRFQ0hPICJYJDx2YXI+IiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittNF9kZWZ1bihbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF9hbGxfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFKF9sdF92YXIpXSldKV0pCisKKworIyBfTFRfTElCVE9PTF9UQUdTCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0IGNvbW1lbnQgYW5kIGxpc3Qgb2YgdGFncyBzdXBwb3J0ZWQgYnkgdGhlIHNjcmlwdAorbTRfZGVmdW4oW19MVF9MSUJUT09MX1RBR1NdLAorW19MVF9GT1JNQVRfQ09NTUVOVChbVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0XSlkbmwKK2F2YWlsYWJsZV90YWdzPSJfTFRfVEFHUyJkbmwKK10pCisKKworIyBfTFRfTElCVE9PTF9ERUNMQVJFKFZBUk5BTUUsIFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeHRyYWN0IHRoZSBkaWN0aW9uYXJ5IHZhbHVlcyBmb3IgVkFSTkFNRSAob3B0aW9uYWxseSB3aXRoIFRBRykgYW5kCisjIGV4cGFuZCB0byBhIGNvbW1lbnRlZCBzaGVsbCB2YXJpYWJsZSBzZXR0aW5nOgorIworIyAgICAjIFNvbWUgY29tbWVudCBhYm91dCB3aGF0IFZBUiBpcyBmb3IuCisjICAgIHZpc2libGVfbmFtZT0kbHRfaW50ZXJuYWxfbmFtZQorbTRfZGVmaW5lKFtfTFRfTElCVE9PTF9ERUNMQVJFXSwKK1tfTFRfRk9STUFUX0NPTU1FTlQobTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwKKwkJCQkJICAgW2Rlc2NyaXB0aW9uXSkpKVtdZG5sCittNF9wdXNoZGVmKFtfbGlidG9vbF9uYW1lXSwKKyAgICBtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbbGlidG9vbF9uYW1lXSkpKVtdZG5sCittNF9jYXNlKG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFt2YWx1ZV0pKSwKKyAgICBbMF0sIFtfbGlidG9vbF9uYW1lPVskXSQxXSwKKyAgICBbMV0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbMl0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbX2xpYnRvb2xfbmFtZT1sdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbdmFsdWVdKV0pW11kbmwKK200X2lmdmFsKFskMl0sIFtfJDJdKVtdbTRfcG9wZGVmKFtfbGlidG9vbF9uYW1lXSlbXWRubAorXSkKKworCisjIF9MVF9MSUJUT09MX0NPTkZJR19WQVJTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgY29tbWVudGVkIGRlY2xhcmF0aW9ucyBvZiBub24tdGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcworIyBzdWl0YWJsZSBmb3IgaW5zZXJ0aW9uIGluIHRoZSBMSUJUT09MIENPTkZJRyBzZWN0aW9uIG9mIHRoZSBgbGlidG9vbCcKKyMgc2NyaXB0LiAgVGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcyAoZXZlbiBmb3IgdGhlIExJQlRPT0wgQ09ORklHCisjIHNlY3Rpb24pIGFyZSBwcm9kdWNlZCBieSBfTFRfTElCVE9PTF9UQUdfVkFSUy4KK200X2RlZnVuKFtfTFRfTElCVE9PTF9DT05GSUdfVkFSU10sCitbbTRfZm9yZWFjaChbX2x0X3Zhcl0sCisgICAgbTRfcXVvdGUoX2x0X2RlY2xfZmlsdGVyKFt0YWdnZWQ/XSwgW25vXSwgW10sIGx0X2RlY2xfdmFybmFtZXMpKSwKKyAgICBbbTRfbihbX0xUX0xJQlRPT0xfREVDTEFSRShfbHRfdmFyKV0pXSldKQorCisKKyMgX0xUX0xJQlRPT0xfVEFHX1ZBUlMoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9MSUJUT09MX1RBR19WQVJTXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF90YWdfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfTElCVE9PTF9ERUNMQVJFKF9sdF92YXIsIFskMV0pXSldKV0pCisKKworIyBfTFRfVEFHVkFSKFZBUk5BTUUsIFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9UQUdWQVJdLCBbbTRfaWZ2YWwoWyQyXSwgWyQxXyQyXSwgWyQxXSldKQorCisKKyMgX0xUX0NPTkZJR19DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlbmQgYWNjdW11bGF0ZWQgb3V0cHV0IHRvICRDT05GSUdfU1RBVFVTLiAgVGhhbmtzIHRvIHRoZSBsaXN0cyBvZgorIyB2YXJpYWJsZXMgZm9yIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlIGVzY2FwaW5nIHdlIHNhdmVkIGZyb20gY2FsbHMKKyMgdG8gX0xUX0RFQ0wsIHdlIGNhbiBwdXQgcXVvdGUgZXNjYXBlZCB2YXJpYWJsZXMgZGVjbGFyYXRpb25zCisjIGludG8gYGNvbmZpZy5zdGF0dXMnLCBhbmQgdGhlbiB0aGUgc2hlbGwgY29kZSB0byBxdW90ZSBlc2NhcGUgdGhlbSBpbgorIyBmb3IgbG9vcHMgaW4gYGNvbmZpZy5zdGF0dXMnLiAgRmluYWxseSwgYW55IGFkZGl0aW9uYWwgY29kZSBhY2N1bXVsYXRlZAorIyBmcm9tIGNhbGxzIHRvIF9MVF9DT05GSUdfTElCVE9PTF9JTklUIGlzIGV4cGFuZGVkLgorbTRfZGVmdW4oW19MVF9DT05GSUdfQ09NTUFORFNdLAorW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9PVVRQVVRdLAorCWRubCBJZiB0aGUgbGlidG9vbCBnZW5lcmF0aW9uIGNvZGUgaGFzIGJlZW4gcGxhY2VkIGluICRDT05GSUdfTFQsCisJZG5sIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQgYWxsIG92ZXIgYWdhaW4gaW50byBjb25maWcuc3RhdHVzLAorCWRubCB0aGVuIHdlIHdpbGwgaGF2ZSBjb25maWcuc3RhdHVzIHJ1biAkQ09ORklHX0xUIGxhdGVyLCBzbyBpdAorCWRubCBuZWVkcyB0byBrbm93IHdoYXQgbmFtZSBpcyBzdG9yZWQgdGhlcmU6CisgICAgICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICAgICAgWyRTSEVMTCAkQ09ORklHX0xUIHx8IEFTX0VYSVQoMSldLCBbQ09ORklHX0xUPSckQ09ORklHX0xUJ10pXSwKKyAgICBkbmwgSWYgdGhlIGxpYnRvb2wgZ2VuZXJhdGlvbiBjb2RlIGlzIGRlc3RpbmVkIGZvciBjb25maWcuc3RhdHVzLAorICAgIGRubCBleHBhbmQgdGhlIGFjY3VtdWxhdGVkIGNvbW1hbmRzIGFuZCBpbml0IGNvZGUgbm93OgorICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICBbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTXSwgW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUXSldKQorXSkjX0xUX0NPTkZJR19DT01NQU5EUworCisKKyMgSW5pdGlhbGl6ZS4KK200X2RlZmluZShbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVRdLAorWworCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCitkb3VibGVfcXVvdGVfc3Vic3Q9JyRkb3VibGVfcXVvdGVfc3Vic3QnCitkZWxheV92YXJpYWJsZV9zdWJzdD0nJGRlbGF5X3ZhcmlhYmxlX3N1YnN0JworX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TCitMVENDPSckTFRDQycKK0xUQ0ZMQUdTPSckTFRDRkxBR1MnCitjb21waWxlcj0nJGNvbXBpbGVyX0RFRkFVTFQnCisKKyMgUXVvdGUgZXZhbGVkIHN0cmluZ3MuCitmb3IgdmFyIGluIGx0X2RlY2xfYWxsX3Zhcm5hbWVzKFtbIFwKK11dLCBsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzKTsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPICJYXFxcXFwkXCR2YXIiXGAgaW4KKyAgICAqW1tcXFxcXFxcYFxcIlxcXCRdXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlhcXFwkXCR2YXJcXCIgfCBcXFwkWHNlZCAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcJFwkdmFyXFxcXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworZG9uZQorCisjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCitmb3IgdmFyIGluIGx0X2RlY2xfYWxsX3Zhcm5hbWVzKFtbIFwKK11dLCBsdF9kZWNsX2RxdW90ZV92YXJuYW1lcyk7IGRvCisgICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyAiWFxcXFxcJFwkdmFyIlxgIGluCisgICAgKltbXFxcXFxcXGBcXCJcXFwkXV0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJYXFxcJFwkdmFyXFwiIHwgXFxcJFhzZWQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworIyBGaXgtdXAgZmFsbGJhY2sgZWNobyBpZiBpdCB3YXMgbWFuZ2xlZCBieSB0aGUgYWJvdmUgcXVvdGluZyBydWxlcy4KK2Nhc2UgXCRsdF9FQ0hPIGluCisqJ1xcXFskXTAgLS1mYWxsYmFjay1lY2hvIicpZG5sICIKKyAgbHRfRUNITz1cYFwkRUNITyAiWFwkbHRfRUNITyIgfCBcJFhzZWQgLWUgJ3MvXFxcXFxcXFxcXFxcXFxcWyRdMCAtLWZhbGxiYWNrLWVjaG8iXFskXS9cWyRdMCAtLWZhbGxiYWNrLWVjaG8iLydcYAorICA7OworZXNhYworCitfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVAorXSkKKworCisjIExUX09VVFBVVAorIyAtLS0tLS0tLS0KKyMgVGhpcyBtYWNybyBhbGxvd3MgZWFybHkgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQgKGJlZm9yZQorIyBBQ19PVVRQVVQgaXMgY2FsbGVkKSwgaW5jYXNlIGl0IGlzIHVzZWQgaW4gY29uZmlndXJlIGZvciBjb21waWxhdGlvbgorIyB0ZXN0cy4KK0FDX0RFRlVOKFtMVF9PVVRQVVRdLAorWzogJHtDT05GSUdfTFQ9Li9jb25maWcubHR9CitBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkQ09ORklHX0xUXSkKK2NhdCA+IiRDT05GSUdfTFQiIDw8X0xURU9GCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSBhIGxpYnRvb2wgc3R1YiB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisKK2x0X2NsX3NpbGVudD1mYWxzZQorU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK19MVEVPRgorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitBU19TSEVMTF9TQU5JVElaRQorX0FTX1BSRVBBUkUKKworZXhlYyBBU19NRVNTQUdFX0ZEPiYxCitleGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgQVNfQk9YKFtSdW5uaW5nICRhc19tZS5dKQorfSA+JkFTX01FU1NBR0VfTE9HX0ZECisKK2x0X2NsX2hlbHA9IlwKK1xgJGFzX21lJyBjcmVhdGVzIGEgbG9jYWwgbGlidG9vbCBzdHViIGZyb20gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwKK2ZvciB1c2UgaW4gZnVydGhlciBjb25maWd1cmUgdGltZSB0ZXN0cyBiZWZvcmUgdGhlIHJlYWwgbGlidG9vbCBpcworZ2VuZXJhdGVkLgorCitVc2FnZTogJFswXSBbW09QVElPTlNdXQorCisgIC1oLCAtLWhlbHAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCisgIC1kLCAtLWRlYnVnICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisKK1JlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4iCisKK2x0X2NsX3ZlcnNpb249IlwKK200X2lmc2V0KFtBQ19QQUNLQUdFX05BTUVdLCBbQUNfUEFDS0FHRV9OQU1FIF0pY29uZmlnLmx0W11kbmwKK200X2lmc2V0KFtBQ19QQUNLQUdFX1ZFUlNJT05dLCBbIEFDX1BBQ0tBR0VfVkVSU0lPTl0pCitjb25maWd1cmVkIGJ5ICRbMF0sIGdlbmVyYXRlZCBieSBtNF9QQUNLQUdFX1NUUklORy4KKworQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcubHQgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNpb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKword2hpbGUgdGVzdCAkWyNdICE9IDAKK2RvCisgIGNhc2UgJFsxXSBpbgorICAgIC0tdmVyc2lvbiB8IC0tdiogfCAtViApCisgICAgICBlY2hvICIkbHRfY2xfdmVyc2lvbiI7IGV4aXQgMCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICBlY2hvICIkbHRfY2xfaGVscCI7IGV4aXQgMCA7OworICAgIC0tZGVidWcgfCAtLWQqIHwgLWQgKQorICAgICAgZGVidWc9OiA7OworICAgIC0tcXVpZXQgfCAtLXEqIHwgLS1zaWxlbnQgfCAtLXMqIHwgLXEgKQorICAgICAgbHRfY2xfc2lsZW50PTogOzsKKworICAgIC0qKSBBQ19NU0dfRVJST1IoW3VucmVjb2duaXplZCBvcHRpb246ICRbMV0KK1RyeSBcYCRbMF0gLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5dKSA7OworCisgICAgKikgQUNfTVNHX0VSUk9SKFt1bnJlY29nbml6ZWQgYXJndW1lbnQ6ICRbMV0KK1RyeSBcYCRbMF0gLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5dKSA7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2lmICRsdF9jbF9zaWxlbnQ7IHRoZW4KKyAgZXhlYyBBU19NRVNTQUdFX0ZEPi9kZXYvbnVsbAorZmkKK19MVEVPRgorCitjYXQgPj4iJENPTkZJR19MVCIgPDxfTFRFT0YKK19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUCitfTFRFT0YKKworY2F0ID4+IiRDT05GSUdfTFQiIDw8XF9MVEVPRgorQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJG9maWxlXSkKK19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EUworQVNfRVhJVCgwKQorX0xURU9GCitjaG1vZCAreCAiJENPTkZJR19MVCIKKworIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBidXQgY29uZmlnLmx0IGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwKKyMgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2csIHdoaWNoIGZhaWxzIG9uIERPUywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0CisjIG9wZW4gYnkgY29uZmlndXJlLiAgSGVyZSB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsIGVmZmVjdGl2ZWx5IGNsb3NpbmcKKyMgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5sdC4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBsdF9jbF9zdWNjZXNzPToKKyAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKKyAgICBsdF9jb25maWdfbHRfYXJncz0iJGx0X2NvbmZpZ19sdF9hcmdzIC0tcXVpZXQiCisgIGV4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+L2Rldi9udWxsCisgICRTSEVMTCAiJENPTkZJR19MVCIgJGx0X2NvbmZpZ19sdF9hcmdzIHx8IGx0X2NsX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZworICAkbHRfY2xfc3VjY2VzcyB8fCBBU19FWElUKDEpCitmaQorXSkjIExUX09VVFBVVAorCisKKyMgX0xUX0NPTkZJRyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBJZiBUQUcgaXMgdGhlIGJ1aWx0LWluIHRhZywgY3JlYXRlIGFuIGluaXRpYWwgbGlidG9vbCBzY3JpcHQgd2l0aCBhCisjIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSB1bnRhZ2dlZCBjb25maWcgdmFycy4gIE90aGVyd2lzZSBhZGQgY29kZQorIyB0byBjb25maWcuc3RhdHVzIGZvciBhcHBlbmRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZWQgYnkgVEFHIGZyb20gdGhlCisjIG1hdGNoaW5nIHRhZ2dlZCBjb25maWcgdmFycy4KK200X2RlZnVuKFtfTFRfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT05GSUdfU0FWRV9DT01NQU5EUyhbCisgIG00X2RlZmluZShbX0xUX1RBR10sIG00X2lmKFskMV0sIFtdLCBbQ10sIFskMV0pKWRubAorICBtNF9pZihfTFRfVEFHLCBbQ10sIFsKKyAgICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCisgICAgIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgICAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgICAgZmkKKworICAgIGNmZ2ZpbGU9IiR7b2ZpbGV9VCIKKyAgICB0cmFwICIkUk0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQorICAgICRSTSAiJGNmZ2ZpbGUiCisKKyAgICBjYXQgPDxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMhICRTSEVMTAorCisjIGAkRUNITyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkYXNfbWUgKCRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgorIworX0xUX0NPUFlJTkcKK19MVF9MSUJUT09MX1RBR1MKKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKK19MVF9MSUJUT09MX0NPTkZJR19WQVJTCitfTFRfTElCVE9PTF9UQUdfVkFSUworIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCisKK19MVF9FT0YKKworICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIGNhdCA8PFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitfTFRfRU9GCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9QUk9HX0xUTUFJTgorCisgICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgorICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCisgICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCisgICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/CisgIHNlZCAnL14jIEdlbmVyYXRlZCBzaGVsbCBmdW5jdGlvbnMgaW5zZXJ0ZWQgaGVyZS9xJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBfTFRfUFJPR19YU0lfU0hFTExGTlMKKworICBzZWQgLW4gJy9eIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUvLCRwJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8CisgICAgKHJtIC1mICIkb2ZpbGUiICYmIGNwICIkY2ZnZmlsZSIgIiRvZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlIikKKyAgY2htb2QgK3ggIiRvZmlsZSIKK10sCitbY2F0IDw8X0xUX0VPRiA+PiAiJG9maWxlIgorCitkbmwgVW5mb3J0dW5hdGVseSB3ZSBoYXZlIHRvIHVzZSAkMSBoZXJlLCBzaW5jZSBfTFRfVEFHIGlzIG5vdCBleHBhbmRlZAorZG5sIGluIGEgY29tbWVudCAoaWUgYWZ0ZXIgYSAjKS4KKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJDEKK19MVF9MSUJUT09MX1RBR19WQVJTKF9MVF9UQUcpCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkMQorX0xUX0VPRgorXSlkbmwgL200X2lmCitdLAorW200X2lmKFskMV0sIFtdLCBbCisgICAgUEFDS0FHRT0nJFBBQ0tBR0UnCisgICAgVkVSU0lPTj0nJFZFUlNJT04nCisgICAgVElNRVNUQU1QPSckVElNRVNUQU1QJworICAgIFJNPSckUk0nCisgICAgb2ZpbGU9JyRvZmlsZSddLCBbXSkKK10pZG5sIC9fTFRfQ09ORklHX1NBVkVfQ09NTUFORFMKK10pIyBfTFRfQ09ORklHCisKKworIyBMVF9TVVBQT1JURURfVEFHKFRBRykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyYWNlIHRoaXMgbWFjcm8gdG8gZGlzY292ZXIgd2hhdCB0YWdzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGxpYnRvb2wKKyMgLS10YWcgb3B0aW9uLCB1c2luZzoKKyMgICAgYXV0b2NvbmYgLS10cmFjZSAnTFRfU1VQUE9SVEVEX1RBRzokMScKK0FDX0RFRlVOKFtMVF9TVVBQT1JURURfVEFHXSwgW10pCisKKworIyBDIHN1cHBvcnQgaXMgYnVpbHQtaW4gZm9yIG5vdworbTRfZGVmaW5lKFtfTFRfTEFOR19DX2VuYWJsZWRdLCBbXSkKK200X2RlZmluZShbX0xUX1RBR1NdLCBbXSkKKworCisjIExUX0xBTkcoTEFORykKKyMgLS0tLS0tLS0tLS0tLQorIyBFbmFibGUgbGlidG9vbCBzdXBwb3J0IGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaWYgbm90IGFscmVhZHkgZW5hYmxlZC4KK0FDX0RFRlVOKFtMVF9MQU5HXSwKK1tBQ19CRUZPUkUoWyQwXSwgW0xUX09VVFBVVF0pZG5sCittNF9jYXNlKFskMV0sCisgIFtDXSwJCQlbX0xUX0xBTkcoQyldLAorICBbQysrXSwJCVtfTFRfTEFORyhDWFgpXSwKKyAgW0phdmFdLAkJW19MVF9MQU5HKEdDSildLAorICBbRm9ydHJhbiA3N10sCQlbX0xUX0xBTkcoRjc3KV0sCisgIFtGb3J0cmFuXSwJCVtfTFRfTEFORyhGQyldLAorICBbV2luZG93cyBSZXNvdXJjZV0sCVtfTFRfTEFORyhSQyldLAorICBbbTRfaWZkZWYoW19MVF9MQU5HX10kMVtfQ09ORklHXSwKKyAgICBbX0xUX0xBTkcoJDEpXSwKKyAgICBbbTRfZmF0YWwoWyQwOiB1bnN1cHBvcnRlZCBsYW5ndWFnZTogIiQxIl0pXSldKWRubAorXSkjIExUX0xBTkcKKworCisjIF9MVF9MQU5HKExBTkdOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfTEFOR10sCitbbTRfaWZkZWYoW19MVF9MQU5HX10kMVtfZW5hYmxlZF0sIFtdLAorICBbTFRfU1VQUE9SVEVEX1RBRyhbJDFdKWRubAorICBtNF9hcHBlbmQoW19MVF9UQUdTXSwgWyQxIF0pZG5sCisgIG00X2RlZmluZShbX0xUX0xBTkdfXSQxW19lbmFibGVkXSwgW10pZG5sCisgIF9MVF9MQU5HXyQxX0NPTkZJRygkMSldKWRubAorXSkjIF9MVF9MQU5HCisKKworIyBfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9MQU5HX0RFRkFVTFRfQ09ORklHXSwKK1tBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAorICBbTFRfTEFORyhDWFgpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19DWFhdLCBkZWZuKFtBQ19QUk9HX0NYWF0pW0xUX0xBTkcoQ1hYKV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRjc3XSwKKyAgW0xUX0xBTkcoRjc3KV0sCisgIFttNF9kZWZpbmUoW0FDX1BST0dfRjc3XSwgZGVmbihbQUNfUFJPR19GNzddKVtMVF9MQU5HKEY3NyldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0ZDXSwKKyAgW0xUX0xBTkcoRkMpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19GQ10sIGRlZm4oW0FDX1BST0dfRkNdKVtMVF9MQU5HKEZDKV0pXSkKKworZG5sIFRoZSBjYWxsIHRvIFtBXVtNX1BST0dfR0NKXSBpcyBxdW90ZWQgbGlrZSB0aGF0IHRvIHN0b3AgYWNsb2NhbAorZG5sIHB1bGxpbmcgdGhpbmdzIGluIG5lZWRsZXNzbHkuCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19HQ0pdLAorICBbTFRfTEFORyhHQ0opXSwKKyAgW0FDX1BST1ZJREVfSUZFTFNFKFtBXVtNX1BST0dfR0NKXSwKKyAgICBbTFRfTEFORyhHQ0opXSwKKyAgICBbQUNfUFJPVklERV9JRkVMU0UoW0xUX1BST0dfR0NKXSwKKyAgICAgIFtMVF9MQU5HKEdDSildLAorICAgICAgW200X2lmZGVmKFtBQ19QUk9HX0dDSl0sCisJW200X2RlZmluZShbQUNfUFJPR19HQ0pdLCBkZWZuKFtBQ19QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSkKKyAgICAgICBtNF9pZmRlZihbQV1bTV9QUk9HX0dDSl0sCisJW200X2RlZmluZShbQV1bTV9QUk9HX0dDSl0sIGRlZm4oW0FdW01fUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pCisgICAgICAgbTRfaWZkZWYoW0xUX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtMVF9QUk9HX0dDSl0sIGRlZm4oW0xUX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKV0pXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbTFRfUFJPR19SQ10sCisgIFtMVF9MQU5HKFJDKV0sCisgIFttNF9kZWZpbmUoW0xUX1BST0dfUkNdLCBkZWZuKFtMVF9QUk9HX1JDXSlbTFRfTEFORyhSQyldKV0pCitdKSMgX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKKworIyBPYnNvbGV0ZSBtYWNyb3M6CitBVV9ERUZVTihbQUNfTElCVE9PTF9DWFhdLCBbTFRfTEFORyhDKyspXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sIFtMVF9MQU5HKEZvcnRyYW4gNzcpXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0ZDXSwgW0xUX0xBTkcoRm9ydHJhbildKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW0xUX0xBTkcoSmF2YSldKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0ZDXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW10pCisKKworIyBfTFRfVEFHX0NPTVBJTEVSCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfVEFHX0NPTVBJTEVSXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKKworX0xUX0RFQ0woW0xUQ0NdLCBbQ0NdLCBbMV0sIFtBIEMgY29tcGlsZXJdKWRubAorX0xUX0RFQ0woW0xUQ0ZMQUdTXSwgW0NGTEFHU10sIFsxXSwgW0xUQ0MgY29tcGlsZXIgZmxhZ3NdKWRubAorX0xUX1RBR0RFQ0woW0NDXSwgW2NvbXBpbGVyXSwgWzFdLCBbQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlcl0pZG5sCitfTFRfVEFHREVDTChbd2l0aF9nY2NdLCBbR0NDXSwgWzBdLCBbSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgY29tcGlsZXI/XSlkbmwKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworXSkjIF9MVF9UQUdfQ09NUElMRVIKKworCisjIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGNvbXBpbGVyIGJvaWxlcnBsYXRlIG91dHB1dCBvciB3YXJuaW5ncyB3aXRoCisjIHRoZSBzaW1wbGUgY29tcGlsZXIgdGVzdCBjb2RlLgorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorXSkjIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorCisKKyMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBsaW5rZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKKyMgdGhlIHNpbXBsZSBsaW5rIHRlc3QgY29kZS4KK200X2RlZnVuKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIC1yIGNvbmZ0ZXN0KgorXSkjIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bl9vbmNlKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10sWworICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luKikKKyAgICBBQ19DSEVDS19UT09MKFtEU1lNVVRJTF0sIFtkc3ltdXRpbF0sIFs6XSkKKyAgICBBQ19DSEVDS19UT09MKFtOTUVESVRdLCBbbm1lZGl0XSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW0xJUE9dLCBbbGlwb10sIFs6XSkKKyAgICBBQ19DSEVDS19UT09MKFtPVE9PTF0sIFtvdG9vbF0sIFs6XSkKKyAgICBBQ19DSEVDS19UT09MKFtPVE9PTDY0XSwgW290b29sNjRdLCBbOl0pCisgICAgX0xUX0RFQ0woW10sIFtEU1lNVVRJTF0sIFsxXSwKKyAgICAgIFtUb29sIHRvIG1hbmlwdWxhdGUgYXJjaGl2ZWQgRFdBUkYgZGVidWcgc3ltYm9sIGZpbGVzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW05NRURJVF0sIFsxXSwKKyAgICAgIFtUb29sIHRvIGNoYW5nZSBnbG9iYWwgdG8gbG9jYWwgc3ltYm9scyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtMSVBPXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gbWFuaXB1bGF0ZSBmYXQgb2JqZWN0cyBhbmQgYXJjaGl2ZXMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbT1RPT0xdLCBbMV0sCisgICAgICBbbGRkL3JlYWRlbGYgbGlrZSB0b29sIGZvciBNYWNoLU8gYmluYXJpZXMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbT1RPT0w2NF0sIFsxXSwKKyAgICAgIFtsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIDY0IGJpdCBNYWNoLU8gYmluYXJpZXMgb24gTWFjIE9TIFggMTAuNF0pCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1zaW5nbGVfbW9kdWxlIGxpbmtlciBmbGFnXSxbbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZF0sCisgICAgICBbbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubworICAgICAgaWYgdGVzdCAteiAiJHtMVF9NVUxUSV9NT0RVTEV9IjsgdGhlbgorCSMgQnkgZGVmYXVsdCB3ZSB3aWxsIGFkZCB0aGUgLXNpbmdsZV9tb2R1bGUgZmxhZy4gWW91IGNhbiBvdmVycmlkZQorCSMgYnkgZWl0aGVyIHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExUX01VTFRJX01PRFVMRQorCSMgbm9uLWVtcHR5IGF0IGNvbmZpZ3VyZSB0aW1lLCBvciBieSBhZGRpbmcgLW11bHRpX21vZHVsZSB0byB0aGUKKwkjIGxpbmsgZmxhZ3MuCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCWVjaG8gImludCBmb28odm9pZCl7cmV0dXJuIDE7fSIgPiBjb25mdGVzdC5jCisJZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKKy1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIiA+JkFTX01FU1NBR0VfTE9HX0ZECisJJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKKwkgIC1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIDI+Y29uZnRlc3QuZXJyCisgICAgICAgIF9sdF9yZXN1bHQ9JD8KKwlpZiB0ZXN0IC1mIGxpYmNvbmZ0ZXN0LmR5bGliICYmIHRlc3QgISAtcyBjb25mdGVzdC5lcnIgJiYgdGVzdCAkX2x0X3Jlc3VsdCA9IDA7IHRoZW4KKwkgIGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9eWVzCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisJZmkKKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJcm0gLWYgY29uZnRlc3QuKgorICAgICAgZmldKQorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBsaW5rZXIgZmxhZ10sCisgICAgICBbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0XSwKKyAgICAgIFtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm8KKyAgICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgICAgZWNobyAiX21haW4iID4gY29uZnRlc3Quc3ltCisgICAgICBMREZMQUdTPSIkTERGTEFHUyAtV2wsLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCxjb25mdGVzdC5zeW0iCisgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCisJW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD15ZXNdLAorCVtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm9dKQorCUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgXSkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bWzAxMl1dKQorICAgICAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworICAgIGRhcndpbjEuKikKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4qKSAjIGRhcndpbiA1Lnggb24KKyAgICAgICMgaWYgcnVubmluZyBvbiAxMC41IG9yIGxhdGVyLCB0aGUgZGVwbG95bWVudCB0YXJnZXQgZGVmYXVsdHMKKyAgICAgICMgdG8gdGhlIE9TIHZlcnNpb24sIGlmIG9uIHg4NiwgYW5kIDEwLjQsIHRoZSBkZXBsb3ltZW50CisgICAgICAjIHRhcmdldCBkZWZhdWx0cyB0byAxMC40LiBEb24ndCB5b3UgbG92ZSBpdD8KKyAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQtMTAuMH0sJGhvc3QgaW4KKwkxMC4wLCo4NiotZGFyd2luOCp8MTAuMCwqLWRhcndpbltbOTFdXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisJMTAuW1swMTJdXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisJMTAuKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKyAgICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gInllcyI7IHRoZW4KKyAgICAgIF9sdF9kYXJfc2luZ2xlX21vZD0nJHNpbmdsZV9tb2R1bGUnCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPScgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sc19saXN0LCRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0nCisgICAgZWxzZQorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nfiROTUVESVQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkRFNZTVVUSUwiICE9ICI6IjsgdGhlbgorICAgICAgX2x0X2RzeW11dGlsPSd+JERTWU1VVElMICRsaWIgfHwgOicKKyAgICBlbHNlCisgICAgICBfbHRfZHN5bXV0aWw9CisgICAgZmkKKyAgICA7OworICBlc2FjCitdKQorCisKKyMgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2tzIGZvciBsaW5rZXIgYW5kIGNvbXBpbGVyIGZlYXR1cmVzIG9uIGRhcndpbgorbTRfZGVmdW4oW19MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTXSwKK1sKKyAgbTRfcmVxdWlyZShbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdKQorICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPXllcworICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKKyAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICBpZm9ydCopIF9sdF9kYXJfY2FuX3NoYXJlZD15ZXMgOzsKKyAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKKyAgZXNhYworICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZWNobworICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgbTRfaWYoWyQxXSwgW0NYWF0sCitbICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiICE9ICJ5ZXMiOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSJcJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZHN5bXV0aWx9IgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgZmkKK10sW10pCisgIGVsc2UKKyAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICBmaQorXSkKKworIyBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaW5rcyBhIG1pbmltYWwgcHJvZ3JhbSBhbmQgY2hlY2tzIHRoZSBleGVjdXRhYmxlCisjIGZvciB0aGUgc3lzdGVtIGRlZmF1bHQgaGFyZGNvZGVkIGxpYnJhcnkgcGF0aC4gSW4gbW9zdCBjYXNlcywKKyMgdGhpcyBpcyAvdXNyL2xpYjovbGliLCBidXQgd2hlbiB0aGUgTVBJIGNvbXBpbGVycyBhcmUgdXNlZAorIyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbW11bmljYXRpb24gYW5kIE1QSSBsaWJzIGFyZSBpbmNsdWRlZCB0b28uCisjIElmIHdlIGRvbid0IGZpbmQgYW55dGhpbmcsIHVzZSB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggYWNjb3JkaW5nCisjIHRvIHRoZSBhaXggbGQgbWFudWFsLgorbTRfZGVmdW4oW19MVF9TWVNfTU9EVUxFX1BBVEhfQUlYXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfTElOS19JRkVMU0UoQUNfTEFOR19QUk9HUkFNLFsKK2x0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCS9eMC8geworCSAgICBzL14wICAqXCguKlwpJC9cMS8KKwkgICAgcAorCX0KKyAgICB9JworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCisgIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorZmldLFtdKQoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCitdKSMgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKworCisjIF9MVF9TSEVMTF9JTklUKEFSRykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfU0hFTExfSU5JVF0sCitbaWZkZWYoW0FDX0RJVkVSU0lPTl9OT1RJQ0VdLAorCSAgICAgW0FDX0RJVkVSVF9QVVNIKEFDX0RJVkVSU0lPTl9OT1RJQ0UpXSwKKwkgW0FDX0RJVkVSVF9QVVNIKE5PVElDRSldKQorJDEKK0FDX0RJVkVSVF9QT1AKK10pIyBfTFRfU0hFTExfSU5JVAorCisKKyMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIHNvbWUgY29kZSB0byB0aGUgc3RhcnQgb2YgdGhlIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0IHdoaWNoCisjIHdpbGwgZmluZCBhbiBlY2hvIGNvbW1hbmQgd2hpY2ggZG9lc24ndCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCittNF9kZWZ1bihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAorW19MVF9TSEVMTF9JTklUKFsKKyMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKK2Nhc2UgWCRsdF9FQ0hPIGluCitYKi0tZmFsbGJhY2stZWNobykKKyAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KKyAgRUNITz1gZWNobyAiJGx0X0VDSE8iIHwgc2VkICdzLFxcXFxcWyRdXFxbJF0wLCdbJF0wJywnYAorICA7OworZXNhYworCitFQ0hPPSR7bHRfRUNITy1lY2hvfQoraWYgdGVzdCAiWFskXTEiID0gWC0tbm8tcmVleGVjOyB0aGVuCisgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICBzaGlmdAorZWxpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKKyAgOgorZWxpZiB0ZXN0ICJYYHsgJEVDSE8gJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgOyB0aGVuCisgICMgWWlwcGVlLCAkRUNITyB3b3JrcyEKKyAgOgorZWxzZQorICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCisgIGV4ZWMgJFNIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQorZmkKKworaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobworICBzaGlmdAorICBjYXQgPDxfTFRfRU9GCitbJF0qCitfTFRfRU9GCisgIGV4aXQgMAorZmkKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworaWYgdGVzdCAteiAiJGx0X0VDSE8iOyB0aGVuCisgIGlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgICMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAorICAgIGZvciBjbWQgaW4gJ3NlZCA1MHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAycSAiWyRdMCInICdlY2hvIHRlc3QnOyBkbworICAgICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KKyAgICAgIGlmIHsgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYDsgfSAyPi9kZXYvbnVsbCAmJgorCSB7IHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgfSAyPi9kZXYvbnVsbAorICAgICAgdGhlbgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisKKyAgaWYgdGVzdCAiWGB7ICRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YHsgJEVDSE8gIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgfSAyPi9kZXYvbnVsbGAgJiYKKyAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgOgorICBlbHNlCisgICAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCisgICAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZworICAgICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCisgICAgIworICAgICMgU28sIGZpcnN0IHdlIGxvb2sgZm9yIGEgd29ya2luZyBlY2hvIGluIHRoZSB1c2VyJ3MgUEFUSC4KKworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCisgICAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICAgIEVDSE89IiRkaXIvZWNobyIKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorCisgICAgaWYgdGVzdCAiWCRFQ0hPIiA9IFhlY2hvOyB0aGVuCisgICAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KKyAgICAgIGlmIHRlc3QgIlhgeyBwcmludCAtciAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1geyBwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsYCAmJgorICAgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCisgICAgICAgIEVDSE89J3ByaW50IC1yJworICAgICAgZWxpZiB7IHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQ7IH0gJiYKKwkgICB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCisgICAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgorICAgICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyAgICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAorICAgICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKKyAgICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorICAgICAgICBleGVjICRDT05GSUdfU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9CisgICAgICBlbHNlCisgICAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KKyAgICAgICAgRUNITz0ncHJpbnRmICVzXG4nCisgICAgICAgIGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YHsgJEVDSE8gIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgfSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwkgICMgQ29vbCwgcHJpbnRmIHdvcmtzCisJICA6CisgICAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSAgQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKKwkgIGV4cG9ydCBDT05GSUdfU0hFTEwKKwkgIFNIRUxMPSIkQ09ORklHX1NIRUxMIgorCSAgZXhwb3J0IFNIRUxMCisJICBFQ0hPPSIkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIgorICAgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCisJICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwkgIEVDSE89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICAgIGVsc2UKKwkgICMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCisJICBwcmV2PToKKworCSAgZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgNTBxICJbJF0wIic7IGRvCisJICAgIGlmIHsgdGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiOyB9IDI+L2Rldi9udWxsCisJICAgIHRoZW4KKwkgICAgICBicmVhaworCSAgICBmaQorCSAgICBwcmV2PSIkY21kIgorCSAgZG9uZQorCisJICBpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIlskXTAiJzsgdGhlbgorCSAgICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAorCSAgICBleHBvcnQgZWNob190ZXN0X3N0cmluZworCSAgICBleGVjICR7T1JJR0lOQUxfQ09ORklHX1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fSAiWyRdMCIgJHsxKyJbJF1AIn0KKwkgIGVsc2UKKwkgICAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KKwkgICAgRUNITz1lY2hvCisJICBmaQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorZmkKKworIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5IHN1aXRhYmx5IGZvciBwYXNzaW5nIHRvIGxpYnRvb2wgZnJvbQorIyB0aGUgTWFrZWZpbGUsIGluc3RlYWQgb2YgcXVvdGluZyB0aGUgb3JpZ2luYWwsIHdoaWNoIGlzIHVzZWQgbGF0ZXIuCitsdF9FQ0hPPSRFQ0hPCitpZiB0ZXN0ICJYJGx0X0VDSE8iID0gIlgkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgorICAgbHRfRUNITz0iJENPTkZJR19TSEVMTCBcXFwkXFskXTAgLS1mYWxsYmFjay1lY2hvIgorZmkKKworQUNfU1VCU1QobHRfRUNITykKK10pCitfTFRfREVDTChbXSwgW1NIRUxMXSwgWzFdLCBbU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0c10pCitfTFRfREVDTChbXSwgW0VDSE9dLCBbMV0sCisgICAgW0FuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlc10pCitdKSMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKKworCisjIF9MVF9FTkFCTEVfTE9DSworIyAtLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfRU5BQkxFX0xPQ0tdLAorW0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCisgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYnRvb2wtbG9ja10sCisgICAgW2F2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKV0pCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgoraWE2NC0qLWhwdXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICAgKkVMRi0zMiopCisJSFBVWF9JQTY0X01PREU9IjMyIgorCTs7CisgICAgICAqRUxGLTY0KikKKwlIUFVYX0lBNjRfTU9ERT0iNjQiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtMzIiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1uMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwkgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmtmcmVlYnNkKi1nbnV8eDg2XzY0LSpsaW51eCp8cHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCp8IFwKK3MzOTAqLSpsaW51eCp8czM5MCotKnRwZip8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgICAqMzItYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4Nl9mYnNkIgorCSAgICA7OworCSAgeDg2XzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkgICAgOzsKKwkgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgorCSAgICA7OworCSAgczM5MHgtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgorCSAgICA7OworCSAgc3BhcmM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqNjQtYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisJICAgIDs7CisJICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorCSAgICA7OworCSAgczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisJICAgIDs7CisJICBzcGFyYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKKyAgICBbQUNfTEFOR19QVVNIKEMpCisgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSxbW11dKV0sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCisgICAgIEFDX0xBTkdfUE9QXSkKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKK3NwYXJjKi0qc29sYXJpcyopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgKjY0LWJpdCopCisgICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgorICAgICAgeWVzKikgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIiA7OworICAgICAgKikKKwlpZiAke0xELWxkfSAtNjQgLXIgLW8gY29uZnRlc3QyLm8gY29uZnRlc3QubyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIExEPSIke0xELWxkfSAtNjQiCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKK2VzYWMKKworbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCitdKSMgX0xUX0VOQUJMRV9MT0NLCisKKworIyBfTFRfQ01EX09MRF9BUkNISVZFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX09MRF9BUkNISVZFXSwKK1tBQ19DSEVDS19UT09MKEFSLCBhciwgZmFsc2UpCit0ZXN0IC16ICIkQVIiICYmIEFSPWFyCit0ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQorX0xUX0RFQ0woW10sIFtBUl0sIFsxXSwgW1RoZSBhcmNoaXZlcl0pCitfTFRfREVDTChbXSwgW0FSX0ZMQUdTXSwgWzFdKQorCitBQ19DSEVDS19UT09MKFNUUklQLCBzdHJpcCwgOikKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgorX0xUX0RFQ0woW10sIFtTVFJJUF0sIFsxXSwgW0Egc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtXSkKKworQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06CitfTFRfREVDTChbXSwgW1JBTkxJQl0sIFsxXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJG9sZGxpYiIKKyAgICA7OworICAqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCisgICAgOzsKKyAgZXNhYworICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKK2ZpCitfTFRfREVDTChbXSwgW29sZF9wb3N0aW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX0RFQ0woW10sIFtvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKK10pIyBfTFRfQ01EX09MRF9BUkNISVZFCisKKworIyBfTFRfQ09NUElMRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAorIwkJW09VVFBVVC1GSUxFXSwgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb21waWxlciBvcHRpb24gd29ya3MKK0FDX0RFRlVOKFtfTFRfQ09NUElMRVJfT1BUSU9OXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAorICBbJDI9bm8KKyAgIG00X2lmKFskNF0sICwgW2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dF0sIFthY19vdXRmaWxlPSQ0XSkKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJDMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJEVDSE8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICQyPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKK10pCisKK2lmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCisgICAgbTRfaWYoWyQ1XSwgLCA6LCBbJDVdKQorZWxzZQorICAgIG00X2lmKFskNl0sICwgOiwgWyQ2XSkKK2ZpCitdKSMgX0xUX0NPTVBJTEVSX09QVElPTgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW19MVF9DT01QSUxFUl9PUFRJT05dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTl0sIFtdKQorCisKKyMgX0xUX0xJTktFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjICAgICAgICAgICAgICAgICAgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBsaW5rZXIgb3B0aW9uIHdvcmtzCitBQ19ERUZVTihbX0xUX0xJTktFUl9PUFRJT05dLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICQzIgorICAgZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICRFQ0hPICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAkMj15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKK10pCisKK2lmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCisgICAgbTRfaWYoWyQ0XSwgLCA6LCBbJDRdKQorZWxzZQorICAgIG00X2lmKFskNV0sICwgOiwgWyQ1XSkKK2ZpCitdKSMgX0xUX0xJTktFUl9PUFRJT04KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbX0xUX0xJTktFUl9PUFRJT05dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbXSkKKworCisjIExUX0NNRF9NQVhfTEVOCisjLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfQ01EX01BWF9MRU5dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKyMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworQUNfTVNHX0NIRUNLSU5HKFt0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50c10pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19tYXhfY21kX2xlbl0sIFtkbmwKKyAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGJlb3MqKQorICAgICMgT24gQmVPUywgdGhpcyB0ZXN0IHRha2VzIGEgcmVhbGx5IHJlYWxseSBsb25nIHRpbWUuCisgICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3NmKikKKyAgICAjIERyLiBIYW5zIEVra2VoYXJkIFBsZXNzZXIgcmVwb3J0cyBzZWVpbmcgYSBrZXJuZWwgcGFuaWMgcnVubmluZyBjb25maWd1cmUKKyAgICAjIGR1ZSB0byB0aGlzIHRlc3Qgd2hlbiBleGVjX2Rpc2FibGVfYXJnX2xpbWl0IGlzIDEgb24gVHJ1NjQuIEl0IGlzIG5vdAorICAgICMgbmljZSB0byBjYXVzZSBrZXJuZWwgcGFuaWNzIHNvIGxldHMgYXZvaWQgdGhlIGxvb3AgYmVsb3cuCisgICAgIyBGaXJzdCBzZXQgYSByZWFzb25hYmxlIGRlZmF1bHQuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE2Mzg0CisgICAgIworICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY29uZmlnOyB0aGVuCisgICAgICBjYXNlIGAvc2Jpbi9zeXNjb25maWcgLXEgcHJvYyBleGVjX2Rpc2FibGVfYXJnX2xpbWl0YCBpbgorICAgICAgICAqMSopIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMSA7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgc2NvMy4ydjUqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMDI0MDAKKyAgICA7OworICBzeXN2NSogfCBzY281djYqIHwgc3lzdjQuMnV3MiopCisgICAga2FyZ21heD1gZ3JlcCBBUkdfTUFYIC9ldGMvY29uZi9jZi5kL3N0dW5lIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRrYXJnbWF4IjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBlY2hvICRrYXJnbWF4IHwgc2VkICdzLy4qW1sJIF1dLy8nYAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YChnZXRjb25mIEFSR19NQVgpIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgZWxzZQorICAgICAgIyBNYWtlIHRlc3RzdHJpbmcgYSBsaXR0bGUgYmlnZ2VyIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyB3aXRoIGl0LgorICAgICAgIyBhIDFLIHN0cmluZyBzaG91bGQgYmUgYSByZWFzb25hYmxlIHN0YXJ0LgorICAgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDsgZG8KKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQorICAgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKKyAgICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0CisgICAgICAjIHdlIGNhbid0IHRlbGwuCisgICAgICB3aGlsZSB7IHRlc3QgIlgiYCRTSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyAiWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCisJICAgICAgICAgPSAiWFgkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIjsgfSA+L2Rldi9udWxsIDI+JjEgJiYKKwkgICAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKKyAgICAgIGRvCisgICAgICAgIGk9YGV4cHIgJGkgKyAxYAorICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgICMgT25seSBjaGVjayB0aGUgc3RyaW5nIGxlbmd0aCBvdXRzaWRlIHRoZSBsb29wLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYAorICAgICAgdGVzdHN0cmluZz0KKyAgICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24KKyAgICAgICMgbWFzc2l2ZSBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlCisgICAgICAjIGxpbmtlci4gIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCisgICAgZmkKKyAgICA7OworICBlc2FjCitdKQoraWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRsdF9jdl9zeXNfbWF4X2NtZF9sZW4pCitlbHNlCisgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCitfTFRfREVDTChbXSwgW21heF9jbWRfbGVuXSwgWzBdLAorICAgIFtXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/XSkKK10pIyBMVF9DTURfTUFYX0xFTgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwgW0xUX0NNRF9NQVhfTEVOXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLCBbXSkKKworCisjIF9MVF9IRUFERVJfRExGQ04KKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9IRUFERVJfRExGQ05dLAorW0FDX0NIRUNLX0hFQURFUlMoW2RsZmNuLmhdLCBbXSwgW10sIFtBQ19JTkNMVURFU19ERUZBVUxUXSlkbmwKK10pIyBfTFRfSEVBREVSX0RMRkNOCisKKworIyBfTFRfVFJZX0RMT1BFTl9TRUxGIChBQ1RJT04tSUYtVFJVRSwgQUNUSU9OLUlGLVRSVUUtVy1VU0NPUkUsCisjICAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GQUxTRSwgQUNUSU9OLUlGLUNST1NTLUNPTVBJTElORykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9UUllfRExPUEVOX1NFTEZdLAorW200X3JlcXVpcmUoW19MVF9IRUFERVJfRExGQ05dKWRubAoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBbJDRdCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK1sjbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwdXRzIChkbGVycm9yICgpKTsKKworICByZXR1cm4gc3RhdHVzOworfV0KK19MVF9FT0YKKyAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSAkMSA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSAkMiA7OworICAgICAgeCRsdF9kbHVua25vd258eCopICQzIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgICQzCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorXSkjIF9MVF9UUllfRExPUEVOX1NFTEYKKworCisjIExUX1NZU19ETE9QRU5fU0VMRgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9TWVNfRExPUEVOX1NFTEZdLAorW200X3JlcXVpcmUoW19MVF9IRUFERVJfRExGQ05dKWRubAoraWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCisgIGVuYWJsZV9kbG9wZW49dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KK2Vsc2UKKyAgbHRfY3ZfZGxvcGVuPW5vCisgIGx0X2N2X2Rsb3Blbl9saWJzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYmVvcyopCisgICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICA7OworCisgIG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBjeWd3aW4qKQorICAgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIDs7CisKKyAgZGFyd2luKikKKyAgIyBpZiBsaWJkbCBpcyBpbnN0YWxsZWQgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgaXQKKyAgICBBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSxbCisgICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIF0pCisgICAgOzsKKworICAqKQorICAgIEFDX0NIRUNLX0ZVTkMoW3NobF9sb2FkXSwKKwkgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIl0sCisgICAgICBbQUNfQ0hFQ0tfTElCKFtkbGRdLCBbc2hsX2xvYWRdLAorCSAgICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIl0sCisJW0FDX0NIRUNLX0ZVTkMoW2Rsb3Blbl0sCisJICAgICAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIl0sCisJICBbQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLAorCQlbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sCisJICAgIFtBQ19DSEVDS19MSUIoW3N2bGRdLCBbZGxvcGVuXSwKKwkJICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbHN2bGQiXSwKKwkgICAgICBbQUNfQ0hFQ0tfTElCKFtkbGRdLCBbZGxkX2xpbmtdLAorCQkgICAgW2x0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCJdKQorCSAgICAgIF0pCisJICAgIF0pCisJICBdKQorCV0pCisgICAgICBdKQorICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZWxzZQorICAgIGVuYWJsZV9kbG9wZW49bm8KKyAgZmkKKworICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KKyAgZGxvcGVuKQorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXMgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKKworICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgorCisgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAorCSAgbHRfY3ZfZGxvcGVuX3NlbGYsIFtkbmwKKwkgIF9MVF9UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubywgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MpCisgICAgXSkKKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCisgICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAorCSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljLCBbZG5sCisJICBfTFRfVFJZX0RMT1BFTl9TRUxGKAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8sICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MpCisgICAgICBdKQorICAgIGZpCisKKyAgICBDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MiCisgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZiBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKKyAgZXNhYworZmkKK19MVF9ERUNMKFtkbG9wZW5fc3VwcG9ydF0sIFtlbmFibGVfZGxvcGVuXSwgWzBdLAorCSBbV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkXSkKK19MVF9ERUNMKFtkbG9wZW5fc2VsZl0sIFtlbmFibGVfZGxvcGVuX3NlbGZdLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWRdKQorX0xUX0RFQ0woW2Rsb3Blbl9zZWxmX3N0YXRpY10sIFtlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljXSwgWzBdLAorCSBbV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkXSkKK10pIyBMVF9TWVNfRExPUEVOX1NFTEYKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX0RMT1BFTl9TRUxGXSwgW0xUX1NZU19ETE9QRU5fU0VMRl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLCBbXSkKKworCisjIF9MVF9DT01QSUxFUl9DX08oW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLWMgYW5kIC1vIGFyZSBzaW11bHRhbmVvdXNseSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIuCisjIFRoaXMgbWFjcm8gZG9lcyBub3QgaGFyZCBjb2RlIHRoZSBjb21waWxlciBsaWtlIEFDX1BST0dfQ0NfQ19PLgorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9DX09dLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2lmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHRdLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpXSwKKyAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFtbXiBdXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorXSkKK19MVF9UQUdERUNMKFtjb21waWxlcl9jX29dLCBbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbMV0sCisJW0RvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz9dKQorXSkjIF9MVF9DT01QSUxFUl9DX08KKworCisjIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIGhhcmQgbGlua3MgdG8gbG9jayBzb21lIGZpbGVzIGlmIG5lZWRlZAorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9GSUxFX0xPQ0tTXSwKK1ttNF9yZXF1aXJlKFtfTFRfRU5BQkxFX0xPQ0tdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCitfTFRfQ09NUElMRVJfQ19PKFskMV0pCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSkiID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rc10pCisgIGhhcmRfbGlua3M9eWVzCisgICRSTSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIEFDX01TR19SRVNVTFQoWyRoYXJkX2xpbmtzXSkKKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICBBQ19NU0dfV0FSTihbYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBgLWMgLW8nLCBzbyBgbWFrZSAtaicgbWF5IGJlIHVuc2FmZV0pCisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCitfTFRfREVDTChbXSwgW25lZWRfbG9ja3NdLCBbMV0sIFtNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj9dKQorXSkjIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTCisKKworIyBfTFRfQ0hFQ0tfT0JKRElSCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ0hFQ0tfT0JKRElSXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yIG9iamRpcl0sIFtsdF9jdl9vYmpkaXJdLAorW3JtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBsdF9jdl9vYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgbHRfY3Zfb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGxdKQorb2JqZGlyPSRsdF9jdl9vYmpkaXIKK19MVF9ERUNMKFtdLCBbb2JqZGlyXSwgWzBdLAorICAgICAgICAgW1RoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlc10pZG5sCittNF9wYXR0ZXJuX2FsbG93KFtMVF9PQkpESVJdKWRubAorQUNfREVGSU5FX1VOUVVPVEVEKExUX09CSkRJUiwgIiRsdF9jdl9vYmpkaXIvIiwKKyAgW0RlZmluZSB0byB0aGUgc3ViLWRpcmVjdG9yeSBpbiB3aGljaCBsaWJ0b29sIHN0b3JlcyB1bmluc3RhbGxlZCBsaWJyYXJpZXMuXSkKK10pIyBfTFRfQ0hFQ0tfT0JKRElSCisKKworIyBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBoYXJkY29kaW5nIGF0dHJpYnV0ZXMuCittNF9kZWZ1bihbX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXNdKQorX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT0KK2lmIHRlc3QgLW4gIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSIgfHwKKyAgIHRlc3QgLW4gIiRfTFRfVEFHVkFSKHJ1bnBhdGhfdmFyLCAkMSkiIHx8CisgICB0ZXN0ICJYJF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSkiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGVudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSkiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpIiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT11bnN1cHBvcnRlZAorZmkKK0FDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpXSkKKworaWYgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSkiID0gcmVsaW5rIHx8CisgICB0ZXN0ICIkX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSkiID0geWVzOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9hY3Rpb25dLCBbMF0sCisgICAgW0hvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlXSkKK10pIyBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgKKworCisjIF9MVF9DTURfU1RSSVBMSUIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DTURfU1RSSVBMSUJdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSkKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGVdKQoraWYgdGVzdCAtbiAiJFNUUklQIiAmJiAkU1RSSVAgLVYgMj4mMSB8ICRHUkVQICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KKyAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKKyAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCisgIEFDX01TR19SRVNVTFQoW3llc10pCitlbHNlCisjIEZJWE1FIC0gaW5zZXJ0IHNvbWUgcmVhbCB0ZXN0cywgaG9zdF9vcyBpc24ndCByZWFsbHkgZ29vZCBlbm91Z2gKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgLW4gIiRTVFJJUCIgOyB0aGVuCisgICAgICBzdHJpcGxpYj0iJFNUUklQIC14IgorICAgICAgb2xkX3N0cmlwbGliPSIkU1RSSVAgLVMiCisgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgIGVsc2UKKyAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICBmaQorICAgIDs7CisgICopCisgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIDs7CisgIGVzYWMKK2ZpCitfTFRfREVDTChbXSwgW29sZF9zdHJpcGxpYl0sIFsxXSwgW0NvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllc10pCitfTFRfREVDTChbXSwgW3N0cmlwbGliXSwgWzFdKQorXSkjIF9MVF9DTURfU1RSSVBMSUIKKworCisjIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBPUlRNRSBGaWxsIGluIHlvdXIgbGQuc28gY2hhcmFjdGVyaXN0aWNzCittNF9kZWZ1bihbX0xUX1NZU19EWU5BTUlDX0xJTktFUl0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2R5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljc10pCittNF9pZihbJDFdLAorCVtdLCBbCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgZGFyd2luKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LywvTFIvIiA7OworICAgICopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8iIDs7CisgIGVzYWMKKyAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGF3ayAkbHRfYXdrX2FyZyB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgaWYgJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRHUkVQICc7JyA+L2Rldi9udWxsIDsgdGhlbgorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgIGVsc2UKKyAgICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgIGZpCisgICMgT2ssIG5vdyB3ZSBoYXZlIHRoZSBwYXRoLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCB3ZSBjYW4gc3RlcCB0aHJvdWdoIGl0CisgICMgYW5kIGFkZCBtdWx0aWxpYiBkaXIgaWYgbmVjZXNzYXJ5LgorICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0KKyAgbHRfbXVsdGlfb3NfZGlyPWAkQ0MgJENQUEZMQUdTICRDRkxBR1MgJExERkxBR1MgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSAyPi9kZXYvbnVsbGAKKyAgZm9yIGx0X3N5c19wYXRoIGluICRsdF9zZWFyY2hfcGF0aF9zcGVjOyBkbworICAgIGlmIHRlc3QgLWQgIiRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIjsgdGhlbgorICAgICAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciIKKyAgICBlbHNlCisgICAgICB0ZXN0IC1kICIkbHRfc3lzX3BhdGgiICYmIFwKKwlsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aCIKKyAgICBmaQorICBkb25lCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyB8IGF3ayAnCitCRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7CisgIGx0X2Zvbz0iIjsKKyAgbHRfY291bnQ9MDsKKyAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKKyAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7CisgICAgICBpZiAoJGx0X2kgPT0gIi4uIikgeworICAgICAgICBsdF9jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKKyAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsdF9jb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtbbHRfZm9vXV0rKzsgfQorICBpZiAobHRfZnJlcVtbbHRfZm9vXV0gPT0gMSkgeyBwcmludCBsdF9mb287IH0KK30nYAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICRsdF9zZWFyY2hfcGF0aF9zcGVjYAorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaV0pCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4W1s0LTldXSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LltbMDFdXSB8IGFpeDQuW1swMV1dLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIHBvd2VycGMpCisgICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgorICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICA7OworICBtNjhrKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRFQ0hPICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbW14vXV0qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJFJNIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICAgIDs7CisgIGVzYWMKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVtbNDVdXSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCisgICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCisgICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdworICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICB2ZXJzaW9uX3R5cGU9d2luZG93cworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworCisgIGNhc2UgJEdDQywkaG9zdF9vcyBpbgorICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiogfCB5ZXMsY2VnY2MqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICAjc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliLy8nYCR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCisgICAgICA7OworICAgIG1pbmd3KiB8IGNlZ2NjKikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICAjc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8ICRTRUQgLWUgJ3MvXmxpYi8vJ2Ake3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgJEdSRVAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgICAgIGlmICRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IFskR1JFUCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGxdOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQorICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCisgICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKKyAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAorICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCisgICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIDs7CisgIGVzYWMKKyAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworbTRfaWYoWyQxXSwgW10sWworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9sb2NhbC9saWIiXSkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK2ZyZWVic2QxKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3CisgICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgorICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgorICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAorICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGZyZWVic2RbWzEyM11dKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bWzAxXV0qIHwgZnJlZWJzZGVsZjMuW1swMV1dKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QzLltbMi05XV0qIHwgZnJlZWJzZGVsZjMuW1syLTldXSogfCBcCisgIGZyZWVic2Q0LltbMC01XV0gfCBmcmVlYnNkZWxmNC5bWzAtNV1dIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5CisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgIDs7CisKK2ludGVyaXhbWzMtOV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBTb21lIGJpbnV0aWxzIGxkIGFyZSBwYXRjaGVkIHRvIHNldCBEVF9SVU5QQVRICisgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICBzYXZlX2xpYmRpcj0kbGliZGlyCisgIGV2YWwgImxpYmRpcj0vZm9vOyB3bD1cIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKVwiOyBcCisgICAgICAgTERGTEFHUz1cIlwkTERGTEFHUyAkX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSlcIiIKKyAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSxbXSldLAorICAgIFtBU19JRihbICgkT0JKRFVNUCAtcCBjb25mdGVzdCRhY19leGVleHQpIDI+L2Rldi9udWxsIHwgZ3JlcCAiUlVOUEFUSC4qJGxpYmRpciIgPi9kZXYvbnVsbF0sCisgICAgICAgW3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXNdKV0pCisgIExERkxBR1M9JHNhdmVfTERGTEFHUworICBsaWJkaXI9JHNhdmVfbGliZGlyCisKKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcWyRdMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXFskXTA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87L15bCSBdKmh3Y2FwWwkgXS9kO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworKm50byogfCAqcW54KikKKyAgdmVyc2lvbl90eXBlPXFueAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nbGRxbnguc28nCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikJbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopCQkJCW5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuW1s4OV1dIHwgb3BlbmJzZDIuW1s4OV1dLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCityZG9zKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJworICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit0cGYqKQorICAjIFRQRiBpcyBhIGNyb3NzLXRhcmdldCBvbmx5LiAgUHJlZmVycmVkIGNyb3NzLWhvc3QgPSBHTlUvTGludXguCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworQUNfTVNHX1JFU1VMVChbJGR5bmFtaWNfbGlua2VyXSkKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworaWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorZmkKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCisKK19MVF9ERUNMKFtdLCBbdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmtdLCBbMV0sCisgICAgW1ZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorICAgIHJlc3RvcmVkIGF0IGxpbmsgdGltZV0pCitfTFRfREVDTChbXSwgW25lZWRfbGliX3ByZWZpeF0sIFswXSwKKyAgICBbRG8gd2UgbmVlZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzP10pCitfTFRfREVDTChbXSwgW25lZWRfdmVyc2lvbl0sIFswXSwgW0RvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/XSkKK19MVF9ERUNMKFtdLCBbdmVyc2lvbl90eXBlXSwgWzBdLCBbTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGVdKQorX0xUX0RFQ0woW10sIFtydW5wYXRoX3Zhcl0sIFswXSwgIFtTaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGVdKQorX0xUX0RFQ0woW10sIFtzaGxpYnBhdGhfdmFyXSwgWzBdLFtTaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlXSkKK19MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoXSwgWzBdLAorICAgIFtJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/XSkKK19MVF9ERUNMKFtdLCBbbGlibmFtZV9zcGVjXSwgWzFdLCBbRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXhdKQorX0xUX0RFQ0woW10sIFtsaWJyYXJ5X25hbWVzX3NwZWNdLCBbMV0sCisgICAgW1tMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorICAgIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUVdXSkKK19MVF9ERUNMKFtdLCBbc29uYW1lX3NwZWNdLCBbMV0sCisgICAgW1tUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZV1dKQorX0xUX0RFQ0woW10sIFtwb3N0aW5zdGFsbF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kIHRvIHVzZSBhZnRlciBpbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW3Bvc3R1bmluc3RhbGxfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgdW5pbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW2ZpbmlzaF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnldKQorX0xUX0RFQ0woW10sIFtmaW5pc2hfZXZhbF0sIFsxXSwKKyAgICBbW0FzICJmaW5pc2hfY21kcyIsIGV4Y2VwdCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dAorICAgIG5vdCBzaG93bl1dKQorX0xUX0RFQ0woW10sIFtoYXJkY29kZV9pbnRvX2xpYnNdLCBbMF0sCisgICAgW1doZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNdLCBbMl0sCisgICAgW0NvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitfTFRfREVDTChbXSwgW3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAorICAgIFtSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitdKSMgX0xUX1NZU19EWU5BTUlDX0xJTktFUgorCisKKyMgX0xUX1BBVEhfVE9PTF9QUkVGSVgoVE9PTCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJ5CitBQ19ERUZVTihbX0xUX1BBVEhfVE9PTF9QUkVGSVhdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKK1tjYXNlICRNQUdJQ19DTUQgaW4KK1tbXFwvKl0gfCAgPzpbXFwvXSpdKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitkbmwgJGFjX2R1bW15IGZvcmNlcyBzcGxpdHRpbmcgb24gY29uc3RhbnQgdXNlci1zdXBwbGllZCBwYXRocy4KK2RubCBQT1NJWC4yIHdvcmQgc3BsaXR0aW5nIGlzIGRvbmUgb25seSBvbiB0aGUgb3V0cHV0IG9mIHdvcmQgZXhwYW5zaW9ucywKK2RubCBub3QgZXZlcnkgd29yZC4gIFRoaXMgY2xvc2VzIGEgbG9uZ3N0YW5kaW5nIHNoIHNlY3VyaXR5IGhvbGUuCisgIGFjX2R1bW15PSJtNF9pZihbJDJdLCAsICRQQVRILCBbJDJdKSIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJDE7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyQxIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworX0xUX0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWNdKQorTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCitpZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRNQUdJQ19DTUQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorX0xUX0RFQ0woW10sIFtNQUdJQ19DTURdLCBbMF0sCisJIFtVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiXSlkbmwKK10pIyBfTFRfUEFUSF9UT09MX1BSRUZJWAorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX1BBVEhfVE9PTF9QUkVGSVhdLCBbX0xUX1BBVEhfVE9PTF9QUkVGSVhdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW10pCisKKworIyBfTFRfUEFUSF9NQUdJQworIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pemUgYSBzaGFyZWQgbGlicmFyeQorbTRfZGVmdW4oW19MVF9QQVRIX01BR0lDXSwKK1tfTFRfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCitpZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICBfTFRfUEFUSF9UT09MX1BSRUZJWChmaWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQorICBlbHNlCisgICAgTUFHSUNfQ01EPToKKyAgZmkKK2ZpCitdKSMgX0xUX1BBVEhfTUFHSUMKKworCisjIExUX1BBVEhfTEQKKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCitBQ19ERUZVTihbTFRfUEFUSF9MRF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKKworQUNfQVJHX1dJVEgoW2dudS1sZF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZ251LWxkXSwKKwlbYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIEA8OkBkZWZhdWx0PW5vQDo+QF0pXSwKKyAgICBbdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzXSwKKyAgICBbd2l0aF9nbnVfbGQ9bm9dKWRubAorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSAkQ0NdKQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtbXFwvXV0qIHwgPzpbW1xcL11dKikKKyAgICAgIHJlX2RpcmVsdD0nL1tbXi9dXVtbXi9dXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJExEKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCitfTFRfUEFUSF9MRF9HTlUKK0FDX1NVQlNUKFtMRF0pCisKK19MVF9UQUdERUNMKFtdLCBbTERdLCBbMV0sIFtUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzXSkKK10pIyBMVF9QQVRIX0xECisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FNX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCitBVV9BTElBUyhbQUNfUFJPR19MRF0sIFtMVF9QQVRIX0xEXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fUFJPR19MRF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX0xEXSwgW10pCisKKworIyBfTFRfUEFUSF9MRF9HTlUKKyMtIC0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BBVEhfTERfR05VXSwKK1tBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWNdKQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCitdKSMgX0xUX1BBVEhfTERfR05VCisKKworIyBfTFRfQ01EX1JFTE9BRAorIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIHJlbG9hZCBmbGFnIGZvciBsaW5rZXIKKyMgICAtLSBQT1JUTUUgU29tZSBsaW5rZXJzIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgorbTRfZGVmdW4oW19MVF9DTURfUkVMT0FEXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAorICBbbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJ10pCityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9JyRMVENDICRMVENGTEFHUyAtbm9zdGRsaWIgJHt3bH0tciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGVsc2UKKyAgICAgIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBmaQorICAgIDs7Citlc2FjCitfTFRfREVDTChbXSwgW3JlbG9hZF9mbGFnXSwgWzFdLCBbSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlc10pZG5sCitfTFRfREVDTChbXSwgW3JlbG9hZF9jbWRzXSwgWzJdKWRubAorXSkjIF9MVF9DTURfUkVMT0FECisKKworIyBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaG93IHRvIGNoZWNrIGZvciBsaWJyYXJ5IGRlcGVuZGVuY2llcworIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9DSEVDS19NQUdJQ19NRVRIT0RdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKQorQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllc10sCitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCwKK1tsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKK2x0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCisjIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKKyMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgorIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCisjICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCisjICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCisjICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCisjIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgorIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCisjIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgorCitjYXNlICRob3N0X29zIGluCithaXhbWzQtOV1dKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGlbWzQ1XV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJworICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbworICA7OworCitjeWd3aW4qKQorICAjIGZ1bmNfd2luMzJfbGliaWQgaXMgYSBzaGVsbCBmdW5jdGlvbiBkZWZpbmVkIGluIGx0bWFpbi5zaAorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgOzsKKworbWluZ3cqIHwgcHczMiopCisgICMgQmFzZSBNU1lTL01pbkdXIGRvIG5vdCBwcm92aWRlIHRoZSAnZmlsZScgY29tbWFuZCBuZWVkZWQgYnkKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIHNoZWxsIGZ1bmN0aW9uLCBzbyB1c2UgYSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcsCisgICMgdW5sZXNzIHdlIGZpbmQgJ2ZpbGUnLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHdlIGFyZSBjcm9zcy1jb21waWxpbmcuCisgIGlmICggZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIGZpCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2NlZ2NjKQorICAjIHVzZSB0aGUgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLiBTZWUgbWluZ3cqLgorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZS1hcm0tLipsaXR0bGUoLiphcmNoaXRlY3R1cmU6IGFybSk/JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBpKjg2ICkKKyAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCisgICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgorICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRHxEcmFnb25GbHkpL2lbWzMtOV1dODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCisgICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGZpCisgIDs7CisKK2dudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hwdXgxMC4yMCogfCBocHV4MTEqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfEVMRi1bWzAtOV1dW1swLTldXSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIFtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gUEEtUklTQyBbMC05XS5bMC05XSddCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxQQS1SSVNDW1swLTldXS5bWzAtOV1dKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4W1szLTldXSopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xcLmEpJCcKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqIHwgaypic2QqLWdudSkKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworbmV0YnNkKikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc298X3BpY1wuYSkkJworICBmaQorICA7OworCituZXdvczYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCisgIDs7CisKKypudG8qIHwgKnFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK29wZW5ic2QqKQorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfFwuc298X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCityZG9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICBtb3Rvcm9sYSkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVtbMC05XV1bWzAtOV1dKiBWZXJzaW9uIFtbMC05XV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgOzsKKyAgbmNyKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgc2VxdWVudCkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCisgICAgOzsKKyAgc25pKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgZHluYW1pYyBsaWIiCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgICAgOzsKKyAgc2llbWVucykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHBjKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgZXNhYworICA7OworCit0cGYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworZXNhYworXSkKK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworX0xUX0RFQ0woW10sIFtkZXBsaWJzX2NoZWNrX21ldGhvZF0sIFsxXSwKKyAgICBbTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHNdKQorX0xUX0RFQ0woW10sIFtmaWxlX21hZ2ljX2NtZF0sIFsxXSwKKyAgICBbQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSAiZmlsZV9tYWdpYyJdKQorXSkjIF9MVF9DSEVDS19NQUdJQ19NRVRIT0QKKworCisjIExUX1BBVEhfTk0KKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byBhIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgorQUNfREVGVU4oW0xUX1BBVEhfTk1dLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKV0sIGx0X2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCisgIGZpCisgIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgorICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisJIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJICAqL2Rldi9udWxsKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgICopCisJICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICBkb25lCisgIDogJHtsdF9jdl9wYXRoX05NPW5vfQorZmldKQoraWYgdGVzdCAiJGx0X2N2X3BhdGhfTk0iICE9ICJubyI7IHRoZW4KKyAgTk09IiRsdF9jdl9wYXRoX05NIgorZWxzZQorICAjIERpZG4ndCBmaW5kIGFueSBCU0QgY29tcGF0aWJsZSBuYW1lIGxpc3RlciwgbG9vayBmb3IgZHVtcGJpbi4KKyAgQUNfQ0hFQ0tfVE9PTFMoRFVNUEJJTiwgWyJkdW1wYmluIC1zeW1ib2xzIiAibGluayAtZHVtcCAtc3ltYm9scyJdLCA6KQorICBBQ19TVUJTVChbRFVNUEJJTl0pCisgIGlmIHRlc3QgIiREVU1QQklOIiAhPSAiOiI7IHRoZW4KKyAgICBOTT0iJERVTVBCSU4iCisgIGZpCitmaQordGVzdCAteiAiJE5NIiAmJiBOTT1ubQorQUNfU1VCU1QoW05NXSkKK19MVF9ERUNMKFtdLCBbTk1dLCBbMV0sIFtBIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3Rlcl0pZG5sCisKK0FDX0NBQ0hFX0NIRUNLKFt0aGUgbmFtZSBsaXN0ZXIgKCROTSkgaW50ZXJmYWNlXSwgW2x0X2N2X25tX2ludGVyZmFjZV0sCisgIFtsdF9jdl9ubV9pbnRlcmZhY2U9IkJTRCBubSIKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRhY19jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIChldmFsICIkYWNfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkTk0gXFxcImNvbmZ0ZXN0LiRhY19vYmpleHRcXFwiXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIChldmFsICIkTk0gXCJjb25mdGVzdC4kYWNfb2JqZXh0XCIiIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0KQorICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogb3V0cHV0XCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIGNhdCBjb25mdGVzdC5vdXQgPiZBU19NRVNTQUdFX0xPR19GRAorICBpZiAkR1JFUCAnRXh0ZXJuYWwuKnNvbWVfdmFyaWFibGUnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X25tX2ludGVyZmFjZT0iTVMgZHVtcGJpbiIKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqXSkKK10pIyBMVF9QQVRIX05NCisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FNX1BST0dfTk1dLCBbTFRfUEFUSF9OTV0pCitBVV9BTElBUyhbQUNfUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fUFJPR19OTV0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX05NXSwgW10pCisKKworIyBMVF9MSUJfTQorIyAtLS0tLS0tLQorIyBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5CitBQ19ERUZVTihbTFRfTElCX01dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0xJQk09CitjYXNlICRob3N0IGluCisqLSotYmVvcyogfCAqLSotY3lnd2luKiB8ICotKi1wdzMyKiB8ICotKi1kYXJ3aW4qKQorICAjIFRoZXNlIHN5c3RlbSBkb24ndCBoYXZlIGxpYm0sIG9yIGRvbid0IG5lZWQgaXQKKyAgOzsKKyotbmNyLXN5c3Y0LjMqKQorICBBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsLCBMSUJNPSItbG13IikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iJExJQk0gLWxtIikKKyAgOzsKKyopCisgIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09Ii1sbSIpCisgIDs7Citlc2FjCitBQ19TVUJTVChbTElCTV0pCitdKSMgTFRfTElCX00KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19DSEVDS19MSUJNXSwgW0xUX0xJQl9NXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfQ0hFQ0tfTElCTV0sIFtdKQorCisKKyMgX0xUX0NPTVBJTEVSX05PX1JUVEkoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX05PX1JUVEldLAorW200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorCitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKKworICBfTFRfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMsCisgICAgWy1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLCBbXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPSIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiXSkKK2ZpCitfTFRfVEFHREVDTChbbm9fYnVpbHRpbl9mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgWzFdLAorCVtDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zXSkKK10pIyBfTFRfQ09NUElMRVJfTk9fUlRUSQorCisKKyMgX0xUX0NNRF9HTE9CQUxfU1lNQk9MUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorCisjIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgorQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0XSkKK0FDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sCitbCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tbQkNERUdSU1RdXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCitzeW1wYXQ9J1woW1tfQS1aYS16XV1bW19BLVphLXowLTldXSpcKScKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tbQkNEVF1dJworICA7OworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVNUV11dJworICA7OworaHB1eCopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgc3ltY29kZT0nW1tBQkNERUdSU1RdXScKKyAgZmkKKyAgOzsKK2lyaXgqIHwgbm9uc3RvcHV4KikKKyAgc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworICA7Oworb3NmKikKKyAgc3ltY29kZT0nW1tCQ0RFR1FSU1RdXScKKyAgOzsKK3NvbGFyaXMqKQorICBzeW1jb2RlPSdbW0JEUlRdXScKKyAgOzsKK3NjbzMuMnY1KikKKyAgc3ltY29kZT0nW1tEVF1dJworICA7Oworc3lzdjQuMnV3MiopCisgIHN5bWNvZGU9J1tbRFRdXScKKyAgOzsKK3N5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgIHN5bWNvZGU9J1tbQUJEVF1dJworICA7Oworc3lzdjQpCisgIHN5bWNvZGU9J1tbREZOU1RVXV0nCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgorY2FzZSBgJE5NIC1WIDI+JjFgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgc3ltY29kZT0nW1tBQkNER0lSU1RXXV0nIDs7Citlc2FjCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24uCisjIFNvbWUgc3lzdGVtcyAoZXNwLiBvbiBpYTY0KSBsaW5rIGRhdGEgYW5kIGNvZGUgc3ltYm9scyBkaWZmZXJlbnRseSwKKyMgc28gdXNlIHRoaXMgZ2VuZXJhbCBhcHByb2FjaC4KK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIHN5bWJvbCBuYW1lIGFuZCBzeW1ib2wgYWRkcmVzcworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwobGliW1teIF1dKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcImxpYlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRidWlsZF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YCRFQ0hPICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJzY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCisgIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICAgICMgRmFrZSBpdCBmb3IgZHVtcGJpbiBhbmQgc2F5IFQgZm9yIGFueSBub24tc3RhdGljIGZ1bmN0aW9uCisgICAgIyBhbmQgRCBmb3IgYW55IGdsb2JhbCB2YXJpYWJsZS4KKyAgICAjIEFsc28gZmluZCBDKysgYW5kIF9fZmFzdGNhbGwgc3ltYm9scyBmcm9tIE1TVkMrKywKKyAgICAjIHdoaWNoIHN0YXJ0IHdpdGggQCBvciA/LgorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRBV0sgWyciXAorIiAgICAge2xhc3Rfc2VjdGlvbj1zZWN0aW9uOyBzZWN0aW9uPVwkIDN9OyJcCisiICAgICAvU2VjdGlvbiBsZW5ndGggLiojcmVsb2NzLioocGljayBhbnkpL3toaWRlW2xhc3Rfc2VjdGlvbl09MX07IlwKKyIgICAgIFwkIDAhfi9FeHRlcm5hbCAqXHwve25leHR9OyJcCisiICAgICAvIDArIFVOREVGIC97bmV4dH07IC8gVU5ERUYgXChbXnxdXCkqKCkve25leHR9OyJcCisiICAgICB7aWYoaGlkZVtzZWN0aW9uXSkgbmV4dH07IlwKKyIgICAgIHtmPTB9OyBcJCAwfi9cKFwpLipcfC97Zj0xfTsge3ByaW50ZiBmID8gXCJUIFwiIDogXCJEIFwifTsiXAorIiAgICAge3NwbGl0KFwkIDAsIGEsIC9cfHxcci8pOyBzcGxpdChhWzJdLCBzKX07IlwKKyIgICAgIHNbMV1+L15bQD9dL3twcmludCBzWzFdLCBzWzFdOyBuZXh0fTsiXAorIiAgICAgc1sxXX5wcmZ4IHtzcGxpdChzWzFdLHQsXCJAXCIpOyBwcmludCB0WzFdLCBzdWJzdHIodFsxXSxsZW5ndGgocHJmeCkpfSJcCisiICAgICAnIHByZng9XiRhY19zeW1wcmZ4XSIKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbWwkgXV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbWwkgXV1bWwkgXV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisgIGZpCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKTsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorX0xUX0VPRgorCisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgorICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCisJbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCisgICAgICBlbHNlCisJcm0gLWYgIiRubGlzdCJUCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgICBpZiAkR1JFUCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmICRHUkVQICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8X0xUX0VPRiA+IGNvbmZ0ZXN0LiRhY19leHQKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworX0xUX0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8X0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHZvaWQgICAgICAgKmFkZHJlc3M7Cit9CitsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW1tdXSA9Cit7CisgIHsgIkBQUk9HUkFNQCIsICh2b2lkICopIDAgfSwKK19MVF9FT0YKKwkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sLyIgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAorCSAgY2F0IDw8XF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorICB7MCwgKHZvaWQgKikgMH0KK307CisKKy8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLworI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAorc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKKyAgcmV0dXJuIGx0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHM7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK19MVF9FT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIGx0X3NhdmVfTElCUz0iJExJQlMiCisJICBsdF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1MkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIgorCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCisJICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KiBjb25mdHN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgYnJlYWsKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9CisgIGZpCitkb25lCitdKQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZmkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKGZhaWxlZCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChvaykKK2ZpCisKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3BpcGVdLCBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sIFsxXSwKKyAgICBbVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lc10pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbl0pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc10sCisgICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzXSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXJdKQorX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeF0sCisgICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXhdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpciB3aGVuIGxpYiBwcmVmaXggaXMgbmVlZGVkXSkKK10pICMgX0xUX0NNRF9HTE9CQUxfU1lNQk9MUworCisKKyMgX0xUX0NPTVBJTEVSX1BJQyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9QSUNdLAorW200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9CitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisKK0FDX01TR19DSEVDS0lORyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdKQorbTRfaWYoWyQxXSwgW0NYWF0sIFsKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKyAgICAqZGpncHAqKQorICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgICA7OworICAgIGludGVyaXhbWzMtOV1dKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciA2NC1iaXQgUEEgSFAtVVgsIGJ1dCBub3QgZm9yIDMyLWJpdAorICAgICAgIyBQQSBIUC1VWC4gIE9uIElBNjQgSFAtVVgsIFBJQyBpcyB0aGUgZGVmYXVsdCBidXQgdGhlIHBpYyBmbGFnCisgICAgICAjIHNldHMgdGhlIGRlZmF1bHQgVExTIG1vZGVsIGFuZCBhZmZlY3RzIGlubGluaW5nLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqKQorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgKnFueCogfCAqbnRvKikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXhbWzQtOV1dKikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCWVsc2UKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCisJICA7OworCWVzYWMKKwk7OworICAgICAgZGd1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGVjKysqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICA7OworCSAgZ2hjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisJIyBGcmVlQlNEIHVzZXMgR05VIEMrKworCTs7CisgICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwkgICAgZmkKKwkgICAgOzsKKwkgIGFDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBocHBhKjY0KnxpYTY0KikKKwkgICAgICAjICtaIHRoZSBkZWZhdWx0CisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBpbnRlcml4KikKKwkjIFRoaXMgaXMgYzg5LCB3aGljaCBpcyBNUyBWaXN1YWwgQysrIChubyBzaGFyZWQgbGlicykKKwkjIEFueW9uZSB3YW50cyB0byBkbyBhIHBvcnQ/CisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgICMgQ0MgcGljIGZsYWcgLUtQSUMgaXMgdGhlIGRlZmF1bHQuCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbGludXgqIHwgaypic2QqLWdudSkKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwkgICAgOzsKKwkgIGVjcGMqICkKKwkgICAgIyBvbGQgSW50ZWwgQysrIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgICA7OworCSAgaWNwYyogKQorCSAgICAjIEludGVsIEMrKywgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisJICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyogfCBwZ2NwcCopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICB4bGMqIHwgeGxDKikKKwkgICAgIyBJQk0gWEwgOC4wIG9uIFBQQworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcXBpYycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctcXN0YXRpY2xpbmsnCisJICAgIDs7CisJICAqKQorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkgICAgKlN1blwgQyopCisJICAgICAgIyBTdW4gQysrIDUuOQorCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGx5bnhvcyopCisJOzsKKyAgICAgIG04OGsqKQorCTs7CisgICAgICBtdnMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBjeHgqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1XIGMsZXhwb3J0YWxsJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIG5ldGJzZCopCisJOzsKKyAgICAgICpxbngqIHwgKm50byopCisgICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgICA7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworCTs7CisgICAgZXNhYworICBmaQorXSwKK1sKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciA2NC1iaXQgUEEgSFAtVVgsIGJ1dCBub3QgZm9yIDMyLWJpdAorICAgICAgIyBQQSBIUC1VWC4gIE9uIElBNjQgSFAtVVgsIFBJQyBpcyB0aGUgZGVmYXVsdCBidXQgdGhlIHBpYyBmbGFnCisgICAgICAjIHNldHMgdGhlIGRlZmF1bHQgVExTIG1vZGVsIGFuZCBhZmZlY3RzIGlubGluaW5nLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKworICAgIG1zZG9zZGpncHAqKQorICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCVtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbGludXgqIHwgaypic2QqLWdudSkKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAjIG9sZCBJbnRlbCBmb3IgeDg2XzY0IHdoaWNoIHN0aWxsIHN1cHBvcnRlZCAtS1BJQy4KKyAgICAgIGVjYyopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICAjIGljYyB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KKyAgICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorICAgICAgaWNjKiB8IGlmb3J0KikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgTGFoZXkgRm9ydHJhbiA4LjEuCisgICAgICBsZjk1KikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy0tc2hhcmVkJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLS1zdGF0aWMnCisJOzsKKyAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgeGwqKQorCSMgSUJNIFhMIEMgOC4wL0ZvcnRyYW4gMTAuMSBvbiBQUEMKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJworCTs7CisgICAgICAqKQorCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICA7OworCSpTdW5cIEYqKQorCSAgIyBTdW4gRm9ydHJhbiA4LjMgcGFzc2VzIGFsbCB1bnJlY29nbml6ZWQgZmxhZ3MgdG8gdGhlIGxpbmtlcgorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nJworCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworCisgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgcmRvcyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS2NvbmZvcm1fcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHVuaWNvcyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorXSkKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorICAgIDs7CisgICopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpQCZ0QG00X2lmKFskMV0sW10sWyAtRFBJQ10sW200X2lmKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSkiCisgICAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSldKQorX0xUX1RBR0RFQ0woW3dsXSwgW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbMV0sCisJW0hvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXJdKQorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIjsgdGhlbgorICBfTFRfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgUElDIGZsYWcgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSB3b3Jrc10sCisgICAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3MsICQxKV0sCisgICAgWyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlAJnRAbTRfaWYoWyQxXSxbXSxbIC1EUElDXSxbbTRfaWYoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKV0sIFtdLAorICAgIFtjYXNlICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIiA7OworICAgICBlc2FjXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vXSkKK2ZpCitfTFRfVEFHREVDTChbcGljX2ZsYWddLCBbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbMV0sCisJW0FkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0c10pCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKSBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSlcIgorX0xUX0xJTktFUl9PUFRJT04oW2lmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzXSwKKyAgX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcywgJDEpLAorICAkbHRfdG1wX3N0YXRpY19mbGFnLAorICBbXSwKKyAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT1dKQorX0xUX1RBR0RFQ0woW2xpbmtfc3RhdGljX2ZsYWddLCBbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbMV0sCisJW0NvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmddKQorXSkjIF9MVF9DT01QSUxFUl9QSUMKKworCisjIF9MVF9MSU5LRVJfU0hMSUJTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfU0hMSUJTXSwKK1tBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKK200X2lmKFskMV0sIFtDWFhdLCBbCisgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4W1s0LTldXSopCisgICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisgICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorICAgIGlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZWxzZQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZmkKKyAgICA7OworICBwdzMyKikKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0iJGx0ZGxsX2NtZHMiCisgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEgREFUQS87L14uKltbIF1dX19ubV9fL3MvXi4qW1sgXV1fX25tX19cKFtbXiBdXSpcKVtbIF1dW1teIF1dKi9cMSBEQVRBLzsvXklbWyBdXS9kOy9eW1tBSVRXXV1bWyBdXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICAqKQorICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIDs7CisgIGVzYWMKKyAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKiddCitdLCBbCisgIHJ1bnBhdGhfdmFyPQorICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKKyAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorICBfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBfTFRfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpPQorICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisgICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCisgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQorICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgIyBFeGNsdWRlIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uL2ZpbmFsaXphdGlvbiBzeW1ib2xzLgorZG5sIE5vdGUgYWxzbyBhZGp1c3QgZXhjbHVkZV9leHBzeW1zIGZvciBDKysgYWJvdmUuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGVzYWMKKworICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgorICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4W1szLTldXSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICisqKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPScnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltbQUlUV11dW1sgXV0vcy8uKltbIF1dLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGdudSogfCBsaW51eCogfCB0cGYqIHwgaypic2QqLWdudSkKKyAgICAgIHRtcF9kaWV0PW5vCisgICAgICBpZiB0ZXN0ICIkaG9zdF9vcyIgPSBsaW51eC1kaWV0bGliYzsgdGhlbgorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBkaWV0XCAqKSB0bXBfZGlldD15ZXM7OwkjIGxpbnV4LWRpZXRsaWJjIHdpdGggc3RhdGljIGxpbmtpbmcgKCFkaWV0LWR5bikKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEVHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGwgXAorCSAmJiB0ZXN0ICIkdG1wX2RpZXQiID0gbm8KKyAgICAgIHRoZW4KKwl0bXBfYWRkZmxhZz0KKwl0bXBfc2hhcmVkZmxhZz0nLXNoYXJlZCcKKwljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KKyAgICAgICAgcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwkgIDs7CisJcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycworCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKKwllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWxmOTUqKQkJCQkjIExhaGV5IEZvcnRyYW4gOC4xCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisJICB0bXBfc2hhcmVkZmxhZz0nLS1zaGFyZWQnIDs7CisJeGxbW2NDXV0qKQkJCSMgSUJNIFhMIEMgOC4wIG9uIFBQQyAoZGVhbCB3aXRoIHhsZiBiZWxvdykKKwkgIHRtcF9zaGFyZWRmbGFnPSctcW1rc2hyb2JqJworCSAgdG1wX2FkZGZsYWc9IDs7CisJZXNhYworCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQkJCSMgU3VuIEMgNS45CisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCWVzYWMKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCisgICAgICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKyAgICAgICAgZmkKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJeGxmKikKKwkgICMgSUJNIFhMIEZvcnRyYW4gMTAuMSBvbiBQUEMgY2Fubm90IGNyZWF0ZSBzaGFyZWQgbGlicyBpdHNlbGYKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlIC0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtbyAkbGliJworCSAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICBmaQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKwl3bGFyYz0KKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCAkR1JFUCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xW1swLTVdXS4qKQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKwkgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCisJICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworCSAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubzsgdGhlbgorICAgICAgcnVucGF0aF92YXI9CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CisgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXhbWzQtOV1dKikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKwlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgIGVsc2UKKwkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKwkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeFtbNS05XV0qKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgZmkKKwkgIGRvbmUKKwkgIDs7CisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nJHt3bH0tZiwnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisJIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgorCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKwkgIDoKKwkgIGVsc2UKKwkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKKwkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorCSAgZmkKKwkgIDs7CisJZXNhYworCXNoYXJlZF9mbGFnPSctc2hhcmVkJworCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJZmkKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKwllbHNlCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICBlbHNlCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICBmaQorCWZpCisgICAgICBmaQorCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1iZXhwYWxsJworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisgICAgICAgICMgZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiAkRUNITyAiWCR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iIHwgJFhzZWQ7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAjIGVtcHR5IGV4ZWN1dGFibGUuCisJIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisJIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJzZGlbWzQ1XV0qKQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0tcmR5bmFtaWMKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKyAgICAgIGxpYmV4dD1saWIKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYCRFQ0hPICJYJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKyAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKyAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCisgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nbGliIC1PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworICAgICAgX0xUX1RBR1ZBUihmaXhfc3JjZmlsZV9wYXRoLCAkMSk9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJworICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgIF9MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTKCQxKQorICAgICAgOzsKKworICAgIGRndXgqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgZnJlZWJzZDEqKQorICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgICAgZnJlZWJzZDIqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICA7OworCisgICAgaHB1eDEwKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPScrYiAkbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKKwkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCisJIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KKyAgICAgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLXNoYXJlZCAke3dsfS1leHBvcnRlZF9zeW1ib2wgJHt3bH1mb28gJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9L2Rldi9udWxsIgorICAgICAgICBBQ19MSU5LX0lGRUxTRShpbnQgZm9vKHZvaWQpIHt9LAorICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zICR7d2x9LWV4cG9ydHNfZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgICApCisgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgIDs7CisKKyAgICBvcGVuYnNkKikKKyAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwllbHNlCisJICBjYXNlICRob3N0X29zIGluCisJICAgb3BlbmJzZFtbMDFdXS4qIHwgb3BlbmJzZDIuW1swLTddXSB8IG9wZW5ic2QyLltbMC03XV0uKikKKwkgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgICAgOzsKKwkgICAqKQorCSAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgICA7OworCSAgZXNhYworCWZpCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckRUNITyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IHByaW50ZiAiJXNcXG4iICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAkY29tcGlsZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JFJNICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXogZGVmcycKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJd2xhcmM9JyR7d2x9JworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworICAgICAgZWxzZQorCWNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSoiQ29tcGlsZXJzIDUuMCIqKQorCSAgd2xhcmM9JycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJKikKKwkgIHdsYXJjPScke3dsfScKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisgICAgICAqKQorCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4gIEdDQyBkaXNjYXJkcyBpdCB3aXRob3V0IGAkd2wnLAorCSMgYnV0IGlzIGNhcmVmdWwgZW5vdWdoIG5vdCB0byByZW9yZGVyLgorCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIsJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCB4JGhvc3RfdmVuZG9yID0geHNuaTsgdGhlbgorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJsYXJnZWR5bnN5bScKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCitdKQorQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSldKQordGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCitfTFRfVEFHVkFSKHdpdGhfZ251X2xkLCAkMSk9JHdpdGhfZ251X2xkCisKK19MVF9ERUNMKFtdLCBbbGliZXh0XSwgWzBdLCBbT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpXSlkbmwKK19MVF9ERUNMKFtdLCBbc2hyZXh0X2NtZHNdLCBbMV0sIFtTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKV0pZG5sCitfTFRfREVDTChbXSwgW2V4dHJhY3RfZXhwc3ltc19jbWRzXSwgWzJdLAorICAgIFtUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlXSkKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbl0pCisgICAgICAkUk0gY29uZnRlc3QqCisgICAgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgc29uYW1lPWNvbmZ0ZXN0CisgICAgICAgIGxpYj1jb25mdGVzdAorICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgICAgICAgZGVwbGlicz0KKyAgICAgICAgd2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpCisJcGljX2ZsYWc9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKQorICAgICAgICBjb21waWxlcl9mbGFncz0tdgorICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKKyAgICAgICAgdmVyc3RyaW5nPQorICAgICAgICBvdXRwdXRfb2JqZGlyPS4KKyAgICAgICAgbGlibmFtZT1jb25mdGVzdAorICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkKKyAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorICAgICAgICBpZiBBQ19UUllfRVZBTChfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQorICAgICAgICB0aGVuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgICAgZWxzZQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworICAgICAgICBmaQorICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJFJNIGNvbmZ0ZXN0KgorICAgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKV0pCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworX0xUX1RBR0RFQ0woW2J1aWxkX2xpYnRvb2xfbmVlZF9sY10sIFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFswXSwKKyAgICBbV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllc10pCitfTFRfVEFHREVDTChbYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwKKyAgICBbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFswXSwKKyAgICBbV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpY10pCitfTFRfVEFHREVDTChbXSwgW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVuc10pCitfTFRfVEFHREVDTChbXSwgW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXNdKQorX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9uZWVkc19vYmplY3RdLCBbMV0sCisgICAgW1doZXRoZXIgdGhlIGNvbXBpbGVyIGNvcGVzIHdpdGggcGFzc2luZyBubyBvYmplY3RzIGRpcmVjdGx5XSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFsyXSwKKyAgICBbQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgWzJdLAorICAgIFtDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX1RBR0RFQ0woW10sIFthcmNoaXZlX2NtZHNdLCBbMl0sIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX1RBR0RFQ0woW10sIFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFttb2R1bGVfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZworICAgIGEgc2hhcmVkIGFyY2hpdmUuXSkKK19MVF9UQUdERUNMKFtdLCBbbW9kdWxlX2V4cHN5bV9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFt3aXRoX2dudV9sZF0sIFsxXSwKKyAgICBbV2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgd2l0aCBHTlUgbGQgb3Igbm90XSkKK19MVF9UQUdERUNMKFtdLCBbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbMV0sCisgICAgW0ZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0XSkKK19MVF9UQUdERUNMKFtdLCBbbm9fdW5kZWZpbmVkX2ZsYWddLCBbMV0sCisgICAgW0ZsYWcgdGhhdCBlbmZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9sc10pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbMV0sCisgICAgW0ZsYWcgdG8gaGFyZGNvZGUgJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorICAgIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgJGxpYmRpciBkb2VzIG5vdCBleGlzdF0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbMV0sCisgICAgW1tJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkKKyAgICBkdXJpbmcgbGlua2luZy4gIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgJGxpYmRpciBkb2VzIG5vdCBleGlzdF1dKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgWzFdLAorICAgIFtXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0XSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5IGFuZCB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZGVwZW5kZW5jeSBpcworICAgICJhYnNvbHV0ZSIsIGkuZSBpbXBvc3NpYmxlIHRvIGNoYW5nZSBieSBzZXR0aW5nICR7c2hsaWJwYXRoX3Zhcn0gaWYgdGhlCisgICAgbGlicmFyeSBpcyByZWxvY2F0ZWRdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9taW51c19MXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIGxpYnJhcnkgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkCisgICAgYWdhaW5zdCBpdF0pCitfTFRfVEFHREVDTChbXSwgW2luaGVyaXRfcnBhdGhdLCBbMF0sCisgICAgW1NldCB0byB5ZXMgaWYgbGlua2VyIGFkZHMgcnVudGltZSBwYXRocyBvZiBkZXBlbmRlbnQgbGlicmFyaWVzCisgICAgdG8gcnVudGltZSBwYXRoIGxpc3RdKQorX0xUX1RBR0RFQ0woW10sIFtsaW5rX2FsbF9kZXBsaWJzXSwgWzBdLAorICAgIFtXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXNdKQorX0xUX1RBR0RFQ0woW10sIFtmaXhfc3JjZmlsZV9wYXRoXSwgWzFdLAorICAgIFtGaXggdGhlIHNoZWxsIHZhcmlhYmxlICRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXJdKQorX0xUX1RBR0RFQ0woW10sIFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZF0pCitfTFRfVEFHREVDTChbXSwgW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbMl0sCisgICAgW1RoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtleGNsdWRlX2V4cHN5bXNdLCBbMV0sCisgICAgW1N5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtpbmNsdWRlX2V4cHN5bXNdLCBbMV0sCisgICAgW1N5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZF0pCitfTFRfVEFHREVDTChbXSwgW3ByZWxpbmtfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHByb2dyYW1zIChhZ2FpbnN0IGxpYnJhcmllcykgd2l0aCB0ZW1wbGF0ZXNdKQorX0xUX1RBR0RFQ0woW10sIFtmaWxlX2xpc3Rfc3BlY10sIFsxXSwKKyAgICBbU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzXSkKK2RubCBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAorZG5sIF9MVF9UQUdERUNMKFtdLCBbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgWzFdLAorZG5sICAgIFtDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZCBzYWZlIG9iamVjdHNdKQorXSkjIF9MVF9MSU5LRVJfU0hMSUJTCisKKworIyBfTFRfTEFOR19DX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBDIGNvbXBpbGVyIGFyZSBzdWl0YWJseQorIyBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHIHRvIHdyaXRlCisjIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19DX0NPTkZJR10sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbHRfc2F2ZV9DQz0iJENDIgorQUNfTEFOR19QVVNIKEMpCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fScKKworX0xUX1RBR19DT01QSUxFUgorIyBTYXZlIHRoZSBkZWZhdWx0IGNvbXBpbGVyLCBzaW5jZSBpdCBnZXRzIG92ZXJ3cml0dGVuIHdoZW4gdGhlIG90aGVyCisjIHRhZ3MgYXJlIGJlaW5nIHRlc3RlZCwgYW5kIF9MVF9UQUdWQVIoY29tcGlsZXIsIFtdKSBpcyBhIE5PUC4KK2NvbXBpbGVyX0RFRkFVTFQ9JENDCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9OT19SVFRJKCQxKQorICBfTFRfQ09NUElMRVJfUElDKCQxKQorICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKyAgTFRfU1lTX0RMT1BFTl9TRUxGCisgIF9MVF9DTURfU1RSSVBMSUIKKworICAjIFJlcG9ydCB3aGljaCBsaWJyYXJ5IHR5cGVzIHdpbGwgYWN0dWFsbHkgYmUgYnVpbHQKKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyAgIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgICBmaQorICAgIDs7CisKKyAgYWl4W1s0LTldXSopCisgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQorCisgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCitBQ19MQU5HX1BPUAorQ0M9IiRsdF9zYXZlX0NDIgorXSkjIF9MVF9MQU5HX0NfQ09ORklHCisKKworIyBfTFRfUFJPR19DWFgKKyMgLS0tLS0tLS0tLS0tCisjIFNpbmNlIEFDX1BST0dfQ1hYIGlzIGJyb2tlbiwgaW4gdGhhdCBpdCByZXR1cm5zIGcrKyBpZiB0aGVyZSBpcyBubyBjKysKKyMgY29tcGlsZXIsIHdlIGhhdmUgb3VyIG93biB2ZXJzaW9uIGhlcmUuCittNF9kZWZ1bihbX0xUX1BST0dfQ1hYXSwKK1sKK3B1c2hkZWYoW0FDX01TR19FUlJPUl0sIFtfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXNdKQorQUNfUFJPR19DWFgKK2lmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisgIEFDX1BST0dfQ1hYQ1BQCitlbHNlCisgIF9sdF9jYXVnaHRfQ1hYX2Vycm9yPXllcworZmkKK3BvcGRlZihbQUNfTVNHX0VSUk9SXSkKK10pIyBfTFRfUFJPR19DWFgKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtfTFRfUFJPR19DWFhdLCBbXSkKKworCisjIF9MVF9MQU5HX0NYWF9DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBDKysgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NYWF9DT05GSUddLAorW0FDX1JFUVVJUkUoW19MVF9QUk9HX0NYWF0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKKworQUNfTEFOR19QVVNIKEMrKykKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPW5vCitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQysrIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jcHAKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMrKyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIENYWCBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9jYXVnaHRfQ1hYX2Vycm9yIiAhPSB5ZXM7IHRoZW4KKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKKyAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oaW50LCBjaGFyICpbW11dKSB7IHJldHVybigwKTsgfScKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9JENDCisgIGx0X3NhdmVfTEQ9JExECisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgR0NDPSRHWFgKKyAgbHRfc2F2ZV93aXRoX2dudV9sZD0kd2l0aF9nbnVfbGQKKyAgbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECisgIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcHJvZ19nbnVfbGRjeHgrc2V0fSI7IHRoZW4KKyAgICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGRjeHgKKyAgZWxzZQorICAgICRhc191bnNldCBsdF9jdl9wcm9nX2dudV9sZAorICBmaQorICBpZiB0ZXN0IC1uICIke2x0X2N2X3BhdGhfTERDWFgrc2V0fSI7IHRoZW4KKyAgICBsdF9jdl9wYXRoX0xEPSRsdF9jdl9wYXRoX0xEQ1hYCisgIGVsc2UKKyAgICAkYXNfdW5zZXQgbHRfY3ZfcGF0aF9MRAorICBmaQorICB0ZXN0IC16ICIke0xEQ1hYK3NldH0iIHx8IExEPSRMRENYWAorICBDQz0ke0NYWC0iYysrIn0KKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICAjIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2hlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKKyAgICAjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisgICAgZmkKKworICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgorCisgICAgICBMVF9QQVRIX0xECisKKyAgICAgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAgICAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKyAgICAgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAgICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bworICAgICAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQorICAgICAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgICAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8CisJICAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgIGVsc2UKKyAgICAgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgICAgIGZpCisgICAgICBlbHNlCisgICAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICAgIHdsYXJjPQorCisgICAgICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCisgICAgICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCisgICAgICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgorICAgICAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgICBmaQorCisgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgIlwtTCInCisKKyAgICBlbHNlCisgICAgICBHWFg9bm8KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICB3bGFyYz0KKyAgICBmaQorCisgICAgIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeFtbNS05XV0qKQorCSAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgICAgICBjYXNlICRsZF9mbGFnIGluCisJICAgICAgKi1icnRsKikKKwkgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgICAgICBicmVhaworCSAgICAgICAgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgOzsKKyAgICAgICAgICBlc2FjCisKKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgICAgZmkKKworICAgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQorICAgICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgICA6CisJICBlbHNlCisJICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorICAgICAgICAgIGVzYWMKKyAgICAgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwkgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkgICMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisgICAgICAgICAgZWxzZQorCSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgICAgZWxzZQorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1iZXhwYWxsJworICAgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvCisJIyBleHBvcnQuCisgICAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkKKyAgICAgICAgICAjIGV4ZWN1dGFibGUuCisgICAgICAgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKyAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKworICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiAkRUNITyAiWCR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iIHwgJFhzZWQ7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorICAgICAgICAgIGVsc2UKKwkgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisJICAgICMgZW1wdHkgZXhlY3V0YWJsZS4KKwkgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCisJICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm9rJworCSAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkgICAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkCisJICAgICMgbGlicmFyaWVzLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIDs7CisKKyAgICAgIGJlb3MqKQorCWlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWVsc2UKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisKKyAgICAgIGNob3J1cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgKikKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgICAgICAgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCisgICAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICAgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorICAgICAgICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKyAgICAgICAgICBlbHNlCisJICAgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworICAgICAgICAgIGZpfgorICAgICAgICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgICAgZWxzZQorICAgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAgIF9MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTKCQxKQorCTs7CisKKyAgICAgIGRndXgqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIGVjKysqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZFtbMTJdXSopCisgICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUKKwkjIHN3aXRjaCB0byBFTEYKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkLWVsZiopCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCisgICAgICAgICMgY29udmVudGlvbnMKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgICAgOzsKKworICAgICAgZ251KikKKyAgICAgICAgOzsKKworICAgICAgaHB1eDkqKQorICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkgICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkgICAgICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKyAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICBhQ0MqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorICAgICAgICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKyAgICAgICAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKyAgICAgICAgICAgICMgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRFR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBocHV4MTAqfGhwdXgxMSopCisgICAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworICAgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisJICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCQkgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCQkgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGFDQyopCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgaHBwYSo2NCopCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICAgIGlhNjQqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICAqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7ICRFQ0hPICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgICAgICBocHBhKjY0KikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgICAgaWE2NCopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICAgICopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgIGVzYWMKKwkgICAgICBmaQorCSAgICBlbHNlCisJICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICBmaQorCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGludGVyaXhbWzMtOV1dKikKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCSMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKwkjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisJIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorCSMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKwkjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisJIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKwk7OworICAgICAgaXJpeDUqIHwgaXJpeDYqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBTR0kgQysrCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1hbGwgLW11bHRpZ290ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICBlbHNlCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAtbyAkbGliJworCSAgICAgIGZpCisJICAgIGZpCisJICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgICAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8ICRHUkVQICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKwkgIGljcGMqIHwgZWNwYyogKQorCSAgICAjIEludGVsIEMrKworCSAgICB3aXRoX2dudV9sZD15ZXMKKwkgICAgIyB2ZXJzaW9uIDguMCBhbmQgYWJvdmUgb2YgaWNwYyBjaG9rZSBvbiBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMKKwkgICAgIyBpZiB3ZSBhZGQgJHByZWRlcF9vYmplY3RzIGFuZCAkcG9zdGRlcF9vYmplY3RzLCBob3dldmVyIDcuMSBhbmQKKwkgICAgIyBlYXJsaWVyIGRvIG5vdCBhZGQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy4KKwkgICAgY2FzZSBgJENDIC1WIDI+JjFgIGluCisJICAgICAgKiJWZXJzaW9uIDcuIiopCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICAgICopICAjIFZlcnNpb24gOC4wIG9yIG5ld2VyCisJICAgICAgICB0bXBfaWR5bj0KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJCSAgaWE2NCopIHRtcF9pZHluPScgLWlfZHluYW1pYyc7OworCQllc2FjCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJCTs7CisJICAgIGVzYWMKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgIDs7CisgICAgICAgICAgcGdDQyogfCBwZ2NwcCopCisgICAgICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgorCSAgICBjYXNlIGAkQ0MgLVZgIGluCisJICAgICpwZ0NDXCBbWzEtNV1dKiB8ICpwZ2NwcFwgW1sxLTVdXSopCisJICAgICAgX0xUX1RBR1ZBUihwcmVsaW5rX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJG9ianMgJGxpYm9ianMgJGNvbXBpbGVfZGVwbGlic34KKwkJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8ICROTDJTUGAiJworCSAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2xkb2JqcyRvbGRfZGVwbGlic34KKwkJJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgJE5MMlNQYH4KKwkJJFJBTkxJQiAkb2xkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgorCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgKikgIyBWZXJzaW9uIDYgd2lsbCB1c2Ugd2VhayBzeW1ib2xzCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgZXNhYworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICAgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKKworCSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiYDsgdGVtcGxpc3Q9YCRFQ0hPICJYJHRlbXBsaXN0IiB8ICRYc2VkIC1lICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7ICRFQ0hPICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIDs7CisJICB4bCopCisJICAgICMgSUJNIFhMIDguMCBvbiBQUEMsIHdpdGggR05VIGxkCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQllY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICAgIGZpCisJICAgIDs7CisJICAqKQorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkgICAgKlN1blwgQyopCisJICAgICAgIyBTdW4gQysrIDUuOQorCSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzJworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCisJICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHNvbWV0aGluZyBiYXNlZCBvbgorCSAgICAgICMgJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEKKwkgICAgICAjIHdvdWxkIGJlIGJldHRlci4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKworCSAgICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworCisgICAgICBseW54b3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbTg4ayopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbXZzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBjeHgqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworCSAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbmV0YnNkKikKKyAgICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkbGlua2VyX2ZsYWdzJworCSAgd2xhcmM9CisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJZmkKKwkjIFdvcmthcm91bmQgc29tZSBicm9rZW4gcHJlLTEuNSB0b29sY2hhaW5zCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJworCTs7CisKKyAgICAgICpudG8qIHwgKnFueCopCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisJOzsKKworICAgICAgb3BlbmJzZDIqKQorICAgICAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisKKyAgICAgIG9wZW5ic2QqKQorCWlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisJICBmaQorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZWNobworCWVsc2UKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAiJGxpYiIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICBvc2YzKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICAgICopIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG9sZGxpYiAkb2xkb2JqcycgOzsKKwkgICAgZXNhYworCSAgICA7OworICAgICAgICAgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgY3h4KikKKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJCTs7CisJICAgICAgKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KKwkgICAgICAgICAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICAgICAgICAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgorCSAgICAgICAgICAkUk0gJGxpYi5leHAnCisJICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJCTs7CisJICAgIGVzYWMKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkIiB8ICRHUkVQIC12ICJsZDoiYDsgdGVtcGxpc3Q9YCRFQ0hPICJYJHRlbXBsaXN0IiB8ICRYc2VkIC1lICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICAgb3NmMyopCisJICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICAgICopCisJICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgZXNhYworCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgIlwtTCInCisKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBwc29zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKworICAgICAgc3Vub3M0KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBzb2xhcmlzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsJDEpPXllcworCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAgICAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0tTSAke3dsfSRsaWIuZXhwIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwkgICAgY2FzZSAkaG9zdF9vcyBpbgorCSAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJICAgICAgKikKKwkJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4KKwkgICAgICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJCV9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwkgICAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisKKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJICAgICMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0teiAke3dsfWRlZnMnCisJICAgICAgaWYgJENDIC0tdmVyc2lvbiB8ICRHUkVQIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJcLUwiJworCSAgICAgIGVsc2UKKwkgICAgICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKKwkgICAgICAgICMgcGxhdGZvcm0uCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKKwkgICAgICBmaQorCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJHdsJGxpYmRpcicKKwkgICAgICBjYXNlICRob3N0X29zIGluCisJCXNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJCSopCisJCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJCSAgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuW1swMjRdXSopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgQ0MqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorCSMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisJIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworCSMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorCSMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKwkjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKwkjIGFzIC16IGRlZnMuCisJX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SLCRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisJX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKwlydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKwljYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIDs7CisJICAqKQorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIDs7CisJZXNhYworICAgICAgOzsKKworICAgICAgdGFuZGVtKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHZ4d29ya3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworICAgIGVzYWMKKworICAgIEFDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKKyAgICB0ZXN0ICIkX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKKyAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkR1hYIgorICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorCisgICAgIyMgQ0FWRUFUIEVNUFRPUjoKKyAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisgICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisgICAgX0xUX1NZU19ISURERU5fTElCREVQUygkMSkKKyAgICBfTFRfQ09NUElMRVJfUElDKCQxKQorICAgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgICAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgICAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgICAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgICBfTFRfQ09ORklHKCQxKQorICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKKworICBDQz0kbHRfc2F2ZV9DQworICBMRENYWD0kTEQKKyAgTEQ9JGx0X3NhdmVfTEQKKyAgR0NDPSRsdF9zYXZlX0dDQworICB3aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorICBsdF9jdl9wYXRoX0xEQ1hYPSRsdF9jdl9wYXRoX0xECisgIGx0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAorICBsdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKK2ZpICMgdGVzdCAiJF9sdF9jYXVnaHRfQ1hYX2Vycm9yIiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19DWFhfQ09ORklHCisKKworIyBfTFRfU1lTX0hJRERFTl9MSUJERVBTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpZ3VyZSBvdXQgImhpZGRlbiIgbGlicmFyeSBkZXBlbmRlbmNpZXMgZnJvbSB2ZXJib3NlCisjIGNvbXBpbGVyIG91dHB1dCB3aGVuIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KK200X2RlZnVuKFtfTFRfU1lTX0hJRERFTl9MSUJERVBTXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6CitfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9CitfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPQorX0xUX1RBR1ZBUihwcmVkZXBzLCAkMSk9CitfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9CitfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPQorCitkbmwgd2UgY2FuJ3QgdXNlIHRoZSBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUgaGVyZSwKK2RubCBiZWNhdXNlIGl0IGNvbnRhaW5zIGNvZGUgaW50ZW5kZWQgZm9yIGFuIGV4ZWN1dGFibGUsCitkbmwgbm90IGEgbGlicmFyeS4gIEl0J3MgcG9zc2libGUgd2Ugc2hvdWxkIGxldCBlYWNoCitkbmwgdGFnIGRlZmluZSBhIG5ldyBsdF8/Pz8/X2xpbmtfdGVzdF9jb2RlIHZhcmlhYmxlLAorZG5sIGJ1dCBpdCdzIG9ubHkgdXNlZCBoZXJlLi4uCittNF9pZihbJDFdLCBbXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitpbnQgYTsKK3ZvaWQgZm9vICh2b2lkKSB7IGEgPSAwOyB9CitfTFRfRU9GCitdLCBbJDFdLCBbQ1hYXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitjbGFzcyBGb28KK3sKK3B1YmxpYzoKKyAgRm9vICh2b2lkKSB7IGEgPSAwOyB9Citwcml2YXRlOgorICBpbnQgYTsKK307CitfTFRfRU9GCitdLCBbJDFdLCBbRjc3XSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlcio0IGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK19MVF9FT0YKK10sIFskMV0sIFtGQ10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorICAgICAgc3Vicm91dGluZSBmb28KKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIgYQorICAgICAgYT0wCisgICAgICByZXR1cm4KKyAgICAgIGVuZAorX0xUX0VPRgorXSwgWyQxXSwgW0dDSl0sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorcHVibGljIGNsYXNzIGZvbyB7CisgIHByaXZhdGUgaW50IGE7CisgIHB1YmxpYyB2b2lkIGJhciAodm9pZCkgeworICAgIGEgPSAwOworICB9Cit9OworX0xUX0VPRgorXSkKK2RubCBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKK2RubCBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCitpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgZm9yIHAgaW4gYGV2YWwgIiRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCJgOyBkbworICAgIGNhc2UgJHAgaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiB8fAorICAgICAgICAgIHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBlbHNlCisJIHByZXY9CisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGNhc2UgJHAgaW4KKwkgLUwqIHwgLVIqKQorCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQorCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQorCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgorCSAgIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIjsgdGhlbgorCSAgICAgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtwcmV2fSR7cH0iCisJICAgZWxzZQorCSAgICAgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSAke3ByZXZ9JHtwfSIKKwkgICBmaQorCSAgIDs7CisJICMgVGhlICItbCIgY2FzZSB3b3VsZCBuZXZlciBjb21lIGJlZm9yZSB0aGUgb2JqZWN0IGJlaW5nCisJICMgbGlua2VkLCBzbyBkb24ndCBib3RoZXIgaGFuZGxpbmcgdGhpcyBjYXNlLgorCSBlc2FjCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtwcmV2fSR7cH0iCisJIGVsc2UKKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7X0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpfSAke3ByZXZ9JHtwfSIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRwIgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgJDEgdGVzdCBwcm9ncmFtIgorZmkKKworJFJNIC1mIGNvbmZlc3QuJG9iamV4dAorCisjIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgorbTRfaWYoWyQxXSwgW0NYWF0sCitbY2FzZSAkaG9zdF9vcyBpbgoraW50ZXJpeFtbMy05XV0qKQorICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCisgICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCisgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsJDEpPQorICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywkMSk9CisgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPQorICA7OworCitsaW51eCopCisgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorICAqU3VuXCBDKikKKyAgICAjIFN1biBDKysgNS45CisKKyAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKKyAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKKyAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCisgICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgorICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCisgICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCisgICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7CisKK3NvbGFyaXMqKQorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBDQyopCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7Citlc2FjCitdKQorCitjYXNlICIgJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSAiIGluCisqIiAtbGMgIiopIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubyA7OworZXNhYworIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9CitpZiB0ZXN0IC1uICIke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IjsgdGhlbgorIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9YGVjaG8gIiAke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IiB8ICR7U0VEfSAtZSAncyEgLUwhICFnJyAtZSAncyFeICEhJ2AKK2ZpCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlyc10sIFsxXSwKKyAgICBbVGhlIGRpcmVjdG9yaWVzIHNlYXJjaGVkIGJ5IHRoaXMgY29tcGlsZXIgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcHJlZGVwX29iamVjdHNdLCBbMV0sCisgICAgW0RlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworICAgIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGRlcF9vYmplY3RzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwcmVkZXBzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwb3N0ZGVwc10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgWzFdLAorICAgIFtUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworICAgIGEgc2hhcmVkIGxpYnJhcnldKQorXSkjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMKKworCisjIF9MVF9QUk9HX0Y3NworIyAtLS0tLS0tLS0tLS0KKyMgU2luY2UgQUNfUFJPR19GNzcgaXMgYnJva2VuLCBpbiB0aGF0IGl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZworIyBpZiB0aGVyZSBpcyBubyBmb3J0cmFuIGNvbXBpbGVyLCB3ZSBoYXZlIG91ciBvd24gdmVyc2lvbiBoZXJlLgorbTRfZGVmdW4oW19MVF9QUk9HX0Y3N10sCitbCitwdXNoZGVmKFtBQ19NU0dfRVJST1JdLCBbX2x0X2Rpc2FibGVfRjc3PXllc10pCitBQ19QUk9HX0Y3NworaWYgdGVzdCAteiAiJEY3NyIgfHwgdGVzdCAiWCRGNzciID0gIlhubyI7IHRoZW4KKyAgX2x0X2Rpc2FibGVfRjc3PXllcworZmkKK3BvcGRlZihbQUNfTVNHX0VSUk9SXSkKK10pIyBfTFRfUFJPR19GNzcKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtfTFRfUFJPR19GNzddLCBbXSkKKworCisjIF9MVF9MQU5HX0Y3N19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIDc3IGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GNzdfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtfTFRfUFJPR19GNzddKWRubAorQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpCisKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmNzcgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWYKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGY3NyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIEY3NyBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9kaXNhYmxlX0Y3NyIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iXAorICAgICAgc3Vicm91dGluZSB0CisgICAgICByZXR1cm4KKyAgICAgIGVuZAorIgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iXAorICAgICAgcHJvZ3JhbSB0CisgICAgICBlbmQKKyIKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9IiRDQyIKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBDQz0ke0Y3Ny0iZjc3In0KKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorICBHQ0M9JEc3NworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisJaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorCSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKwlmaQorICAgICAgICA7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJEc3NyIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgQ0M9IiRsdF9zYXZlX0NDIgorZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRjc3IiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19GNzdfQ09ORklHCisKKworIyBfTFRfUFJPR19GQworIyAtLS0tLS0tLS0tLQorIyBTaW5jZSBBQ19QUk9HX0ZDIGlzIGJyb2tlbiwgaW4gdGhhdCBpdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcKKyMgaWYgdGhlcmUgaXMgbm8gZm9ydHJhbiBjb21waWxlciwgd2UgaGF2ZSBvdXIgb3duIHZlcnNpb24gaGVyZS4KK200X2RlZnVuKFtfTFRfUFJPR19GQ10sCitbCitwdXNoZGVmKFtBQ19NU0dfRVJST1JdLCBbX2x0X2Rpc2FibGVfRkM9eWVzXSkKK0FDX1BST0dfRkMKK2lmIHRlc3QgLXogIiRGQyIgfHwgdGVzdCAiWCRGQyIgPSAiWG5vIjsgdGhlbgorICBfbHRfZGlzYWJsZV9GQz15ZXMKK2ZpCitwb3BkZWYoW0FDX01TR19FUlJPUl0pCitdKSMgX0xUX1BST0dfRkMKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtfTFRfUFJPR19GQ10sIFtdKQorCisKKyMgX0xUX0xBTkdfRkNfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GQ19DT05GSUddLAorW0FDX1JFUVVJUkUoW19MVF9QUk9HX0ZDXSlkbmwKK0FDX0xBTkdfUFVTSChGb3J0cmFuKQorCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZmMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PSR7YWNfZmNfc3JjZXh0LWZ9CisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmYyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIEZDIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKKyAgICAgIHN1YnJvdXRpbmUgdAorICAgICAgcmV0dXJuCisgICAgICBlbmQKKyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKKyAgICAgIHByb2dyYW0gdAorICAgICAgZW5kCisiCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSIkQ0MiCisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgQ0M9JHtGQy0iZjk1In0KKyAgY29tcGlsZXI9JENDCisgIEdDQz0kYWNfY3ZfZmNfY29tcGlsZXJfZ251CisKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgICAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyAgICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGFpeFtbNC05XV0qKQorCWlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKwkgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisJZmkKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRhY19jdl9mY19jb21waWxlcl9nbnUiCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgQ0M9IiRsdF9zYXZlX0NDIgorZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllcworCitBQ19MQU5HX1BPUAorXSkjIF9MVF9MQU5HX0ZDX0NPTkZJRworCisKKyMgX0xUX0xBTkdfR0NKX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgR05VIEphdmEgQ29tcGlsZXIgY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0dDSl9DT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX1BST0dfR0NKXSlkbmwKK0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCithY19leHQ9amF2YQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fSIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW1tdXSBhcmd2KSB7fTsgfScKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX1RBR19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9eWVzCitDQz0ke0dDSi0iZ2NqIn0KK2NvbXBpbGVyPSRDQworX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgIF9MVF9DT05GSUcoJDEpCitmaQorCitBQ19MQU5HX1JFU1RPUkUKKworR0NDPSRsdF9zYXZlX0dDQworQ0M9IiRsdF9zYXZlX0NDIgorXSkjIF9MVF9MQU5HX0dDSl9DT05GSUcKKworCisjIF9MVF9MQU5HX1JDX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBXaW5kb3dzIHJlc291cmNlIGNvbXBpbGVyCisjIGFyZSBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19SQ19DT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX1BST0dfUkNdKWRubAorQUNfTEFOR19TQVZFCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9cmMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfScKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX1RBR19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9CitDQz0ke1JDLSJ3aW5kcmVzIn0KK2NvbXBpbGVyPSRDQworX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcworCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIDoKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCisKK0dDQz0kbHRfc2F2ZV9HQ0MKK0FDX0xBTkdfUkVTVE9SRQorQ0M9IiRsdF9zYXZlX0NDIgorXSkjIF9MVF9MQU5HX1JDX0NPTkZJRworCisKKyMgTFRfUFJPR19HQ0oKKyMgLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9QUk9HX0dDSl0sCitbbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwgW0FDX1BST0dfR0NKXSwKKyAgW200X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwgW0FdW01fUFJPR19HQ0pdLAorICAgIFtBQ19DSEVDS19UT09MKEdDSiwgZ2NqLCkKKyAgICAgIHRlc3QgIngke0dDSkZMQUdTK3NldH0iID0geHNldCB8fCBHQ0pGTEFHUz0iLWcgLU8yIgorICAgICAgQUNfU1VCU1QoR0NKRkxBR1MpXSldKVtdZG5sCitdKQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfR0NKXSwgW0xUX1BST0dfR0NKXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbTFRfQUNfUFJPR19HQ0pdLCBbXSkKKworCisjIExUX1BST0dfUkMKKyMgLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfUkNdLAorW0FDX0NIRUNLX1RPT0woUkMsIHdpbmRyZXMsKQorXSkKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX1JDXSwgW0xUX1BST0dfUkNdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX1JDXSwgW10pCisKKworIyBfTFRfREVDTF9FR1JFUAorIyAtLS0tLS0tLS0tLS0tLQorIyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IGVub3VnaCBBdXRvY29uZiB0byBjaG9vc2UgdGhlIGJlc3QgZ3JlcAorIyBhdmFpbGFibGUsIGNob29zZSB0aGUgb25lIGZpcnN0IGluIHRoZSB1c2VyJ3MgUEFUSC4KK200X2RlZnVuKFtfTFRfREVDTF9FR1JFUF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0ZHUkVQXSlkbmwKK3Rlc3QgLXogIiRHUkVQIiAmJiBHUkVQPWdyZXAKK19MVF9ERUNMKFtdLCBbR1JFUF0sIFsxXSwgW0EgZ3JlcCBwcm9ncmFtIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzXSkKK19MVF9ERUNMKFtdLCBbRUdSRVBdLCBbMV0sIFtBbiBFUkUgbWF0Y2hlcl0pCitfTFRfREVDTChbXSwgW0ZHUkVQXSwgWzFdLCBbQSBsaXRlcmFsIHN0cmluZyBtYXRjaGVyXSkKK2RubCBOb24tYmxlZWRpbmctZWRnZSBhdXRvY29uZiBkb2Vzbid0IHN1YnN0IEdSRVAsIHNvIGRvIGl0IGhlcmUgdG9vCitBQ19TVUJTVChbR1JFUF0pCitdKQorCisKKyMgX0xUX0RFQ0xfT0JKRFVNUAorIyAtLS0tLS0tLS0tLS0tLQorIyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IGVub3VnaCBBdXRvY29uZiB0byBjaG9vc2UgdGhlIGJlc3Qgb2JqZHVtcAorIyBhdmFpbGFibGUsIGNob29zZSB0aGUgb25lIGZpcnN0IGluIHRoZSB1c2VyJ3MgUEFUSC4KK200X2RlZnVuKFtfTFRfREVDTF9PQkpEVU1QXSwKK1tBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAorX0xUX0RFQ0woW10sIFtPQkpEVU1QXSwgWzFdLCBbQW4gb2JqZWN0IHN5bWJvbCBkdW1wZXJdKQorQUNfU1VCU1QoW09CSkRVTVBdKQorXSkKKworCisjIF9MVF9ERUNMX1NFRAorIyAtLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGEgZnVsbHktZnVuY3Rpb25hbCBzZWQgcHJvZ3JhbSwgdGhhdCB0cnVuY2F0ZXMKKyMgYXMgZmV3IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuICBQcmVmZXIgR05VIHNlZCBpZiBmb3VuZC4KK200X2RlZnVuKFtfTFRfREVDTF9TRURdLAorW0FDX1BST0dfU0VECit0ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCitYc2VkPSIkU0VEIC1lIDFzL15YLy8iCitfTFRfREVDTChbXSwgW1NFRF0sIFsxXSwgW0Egc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQorX0xUX0RFQ0woW10sIFtYc2VkXSwgWyJcJFNFRCAtZSAxcy9eWC8vIl0sCisgICAgW1NlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uXSkKK10pIyBfTFRfREVDTF9TRUQKKworbTRfaWZuZGVmKFtBQ19QUk9HX1NFRF0sIFsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19TRUQuICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbTRfZGVmdW4oW0FDX1BST0dfU0VEXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9TRUQsCitbIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCisjIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKK2x0X2FjX21heD0wCitsdF9hY19jb3VudD0wCisjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcworIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KK2ZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbworICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQorICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KKyAgbHRfYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KKyAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGJyZWFrCisgIGZpCisgIHdoaWxlIHRydWU7IGRvCisgICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKKyAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KKyAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAorICAgIGVjaG8gPj5jb25mdGVzdC5ubAorICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCisgICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhaworICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KKyAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKKyAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBmaQorICBkb25lCitkb25lCitdKQorU0VEPSRsdF9jdl9wYXRoX1NFRAorQUNfU1VCU1QoW1NFRF0pCitBQ19NU0dfUkVTVUxUKFskU0VEXSkKK10pI0FDX1BST0dfU0VECitdKSNtNF9pZm5kZWYKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX1NFRF0sIFtBQ19QUk9HX1NFRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSwgW10pCisKKworIyBfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgb3V0IHdoZXRoZXIgdGhlIHNoZWxsIGlzIEJvdXJuZSBvciBYU0kgY29tcGF0aWJsZSwKKyMgb3IgaGFzIHNvbWUgb3RoZXIgdXNlZnVsIGZlYXR1cmVzLgorbTRfZGVmdW4oW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzXSkKKyMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCit4c2lfc2hlbGw9bm8KKyggX2x0X2R1bW15PSJhL2IvYyIKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sIiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsLCBcCisgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAorICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCisgICYmIHhzaV9zaGVsbD15ZXMKK0FDX01TR19SRVNVTFQoWyR4c2lfc2hlbGxdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW3hzaV9zaGVsbD0nJHhzaV9zaGVsbCddKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzICIrPSJdKQorbHRfc2hlbGxfYXBwZW5kPW5vCisoIGZvbz1iYXI7IHNldCBmb28gYmF6OyBldmFsICIkWzFdKz1cJFsyXSIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCisgICAgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcworQUNfTVNHX1JFU1VMVChbJGx0X3NoZWxsX2FwcGVuZF0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbbHRfc2hlbGxfYXBwZW5kPSckbHRfc2hlbGxfYXBwZW5kJ10pCisKK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBsdF91bnNldD11bnNldAorZWxzZQorICBsdF91bnNldD1mYWxzZQorZmkKK19MVF9ERUNMKFtdLCBbbHRfdW5zZXRdLCBbMF0sIFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAidW5zZXQiXSlkbmwKKworIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQorY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgorIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCisgICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgorICBsdF9TUDJOTD0ndHIgXDA0MCBcMDEyJworICBsdF9OTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCisgIDs7CisgKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCisgIGx0X1NQMk5MPSd0ciBcMTAwIFxuJworICBsdF9OTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKKyAgOzsKK2VzYWMKK19MVF9ERUNMKFtTUDJOTF0sIFtsdF9TUDJOTF0sIFsxXSwgW3R1cm4gc3BhY2VzIGludG8gbmV3bGluZXNdKWRubAorX0xUX0RFQ0woW05MMlNQXSwgW2x0X05MMlNQXSwgWzFdLCBbdHVybiBuZXdsaW5lcyBpbnRvIHNwYWNlc10pZG5sCitdKSMgX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTCisKKworIyBfTFRfUFJPR19YU0lfU0hFTExGTlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJvdXJuZSBhbmQgWFNJIGNvbXBhdGlibGUgdmFyaWFudHMgb2Ygc29tZSB1c2VmdWwgc2hlbGwgZnVuY3Rpb25zLgorbTRfZGVmdW4oW19MVF9QUk9HX1hTSV9TSEVMTEZOU10sCitbY2FzZSAkeHNpX3NoZWxsIGluCisgIHllcykKKyAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorCisjIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKKyMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorZnVuY19kaXJuYW1lICgpCit7CisgIGNhc2UgJHsxfSBpbgorICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7CisgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7OworICBlc2FjCit9CisKKyMgZnVuY19iYXNlbmFtZSBmaWxlCitmdW5jX2Jhc2VuYW1lICgpCit7CisgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSIKK30KKworIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAorIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgorIyBjYWxsOgorIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKKyMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAorIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisjIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKKyMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KKyMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgorZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQoreworICBjYXNlICR7MX0gaW4KKyAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OworICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKKyAgZXNhYworICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iCit9CisKKyMgZnVuY19zdHJpcG5hbWUgcHJlZml4IHN1ZmZpeCBuYW1lCisjIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgorIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKKyMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZworIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgorZnVuY19zdHJpcG5hbWUgKCkKK3sKKyAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZQorICAjIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgc28gYXNzaWduIG9uZSB0byBvcmRpbmFyeSBwYXJhbWV0ZXIgZmlyc3QuCisgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9CisgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9CisgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCUiJHsyfSJ9Cit9CisKKyMgZnVuY19vcHRfc3BsaXQKK2Z1bmNfb3B0X3NwbGl0ICgpCit7CisgIGZ1bmNfb3B0X3NwbGl0X29wdD0kezElJT0qfQorICBmdW5jX29wdF9zcGxpdF9hcmc9JHsxIyo9fQorfQorCisjIGZ1bmNfbG8ybyBvYmplY3QKK2Z1bmNfbG8ybyAoKQoreworICBjYXNlICR7MX0gaW4KKyAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7OworICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7OworICBlc2FjCit9CisKKyMgZnVuY194Zm9ybSBsaWJvYmotb3Itc291cmNlCitmdW5jX3hmb3JtICgpCit7CisgIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG8KK30KKworIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgorZnVuY19hcml0aCAoKQoreworICBmdW5jX2FyaXRoX3Jlc3VsdD0kKCggJFsqXSApKQorfQorCisjIGZ1bmNfbGVuIHN0cmluZworIyBTVFJJTkcgbWF5IG5vdCBzdGFydCB3aXRoIGEgaHlwaGVuLgorZnVuY19sZW4gKCkKK3sKKyAgZnVuY19sZW5fcmVzdWx0PSR7IzF9Cit9CisKK19MVF9FT0YKKyAgICA7OworICAqKSAjIEJvdXJuZSBjb21wYXRpYmxlIGZ1bmN0aW9ucy4KKyAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorCisjIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKKyMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorZnVuY19kaXJuYW1lICgpCit7CisgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGRpcm5hbWUiYAorICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgorICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iCisgIGVsc2UKKyAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCisgIGZpCit9CisKKyMgZnVuY19iYXNlbmFtZSBmaWxlCitmdW5jX2Jhc2VuYW1lICgpCit7CisgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRiYXNlbmFtZSJgCit9CisKK2RubCBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lCitkbmwgQSBwb3J0YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgYWxyZWFkeSBkZWZpbmVkIGluIGdlbmVyYWwubTRzaAorZG5sIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGl0IGhlcmUuCisKKyMgZnVuY19zdHJpcG5hbWUgcHJlZml4IHN1ZmZpeCBuYW1lCisjIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgorIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKKyMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZworIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgorIyBmdW5jX3N0cmlwX3N1ZmZpeCBwcmVmaXggbmFtZQorZnVuY19zdHJpcG5hbWUgKCkKK3sKKyAgY2FzZSAkezJ9IGluCisgICAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezN9IiBcCisgICAgICAgICAgIHwgJFhzZWQgLWUgInMlXiR7MX0lJSIgLWUgInMlXFxcXCR7Mn1cJCUlImA7OworICAgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHszfSIgXAorICAgICAgICAgICB8ICRYc2VkIC1lICJzJV4kezF9JSUiIC1lICJzJSR7Mn1cJCUlImA7OworICBlc2FjCit9CisKKyMgc2VkIHNjcmlwdHM6CitteV9zZWRfbG9uZ19vcHQ9JzFzL15cKC1bW149XV0qXCk9LiovXDEvO3EnCitteV9zZWRfbG9uZ19hcmc9JzFzL14tW1tePV1dKj0vLycKKworIyBmdW5jX29wdF9zcGxpdAorZnVuY19vcHRfc3BsaXQgKCkKK3sKKyAgZnVuY19vcHRfc3BsaXRfb3B0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRteV9zZWRfbG9uZ19vcHQiYAorICBmdW5jX29wdF9zcGxpdF9hcmc9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJG15X3NlZF9sb25nX2FyZyJgCit9CisKKyMgZnVuY19sbzJvIG9iamVjdAorZnVuY19sbzJvICgpCit7CisgIGZ1bmNfbG8yb19yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorfQorCisjIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQorZnVuY194Zm9ybSAoKQoreworICBmdW5jX3hmb3JtX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICdzL1wuW1teLl1dKiQvLmxvLydgCit9CisKKyMgZnVuY19hcml0aCBhcml0aG1ldGljLXRlcm0uLi4KK2Z1bmNfYXJpdGggKCkKK3sKKyAgZnVuY19hcml0aF9yZXN1bHQ9YGV4cHIgIiRbQF0iYAorfQorCisjIGZ1bmNfbGVuIHN0cmluZworIyBTVFJJTkcgbWF5IG5vdCBzdGFydCB3aXRoIGEgaHlwaGVuLgorZnVuY19sZW4gKCkKK3sKKyAgZnVuY19sZW5fcmVzdWx0PWBleHByICIkWzFdIiA6ICIuKiIgMj4vZGV2L251bGwgfHwgZWNobyAkbWF4X2NtZF9sZW5gCit9CisKK19MVF9FT0YKK2VzYWMKKworY2FzZSAkbHRfc2hlbGxfYXBwZW5kIGluCisgIHllcykKKyAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorCisjIGZ1bmNfYXBwZW5kIHZhciB2YWx1ZQorIyBBcHBlbmQgVkFMVUUgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIuCitmdW5jX2FwcGVuZCAoKQoreworICBldmFsICIkWzFdKz1cJFsyXSIKK30KK19MVF9FT0YKKyAgICA7OworICAqKQorICAgIGNhdCA8PCBcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgZnVuY19hcHBlbmQgdmFyIHZhbHVlCisjIEFwcGVuZCBWQUxVRSB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUi4KK2Z1bmNfYXBwZW5kICgpCit7CisgIGV2YWwgIiRbMV09XCQkWzFdXCRbMl0iCit9CisKK19MVF9FT0YKKyAgICA7OworICBlc2FjCitdKQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2x0ZGwubTQgYi9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2x0ZGwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiNzEyOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9hY2luY2x1ZGUvbHRkbC5tNApAQCAtMCwwICsxLDgwNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGx0ZGwubTQgLSBDb25maWd1cmUgbHRkbCBmb3IgdGhlIHRhcmdldCBzeXN0ZW0uIC0qLUF1dG9jb25mLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBUaG9tYXMgVGFubmVyLCAxOTk5CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMTcgTFRETF9JTklUCisKKyMgTFRfQ09ORklHX0xURExfRElSKERJUkVDVE9SWSwgW0xUREwtTU9ERV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBESVJFQ1RPUlkgY29udGFpbnMgdGhlIGxpYmx0ZGwgc291cmNlcy4gIEl0IGlzIG9rYXkgdG8gY2FsbCB0aGlzCisjIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzLCBhcyBsb25nIGFzIHRoZSBzYW1lIERJUkVDVE9SWSBpcyBhbHdheXMgZ2l2ZW4uCitBQ19ERUZVTihbTFRfQ09ORklHX0xURExfRElSXSwKK1tBQ19CRUZPUkUoWyQwXSwgW0xURExfSU5JVF0pCitfJDAoJCopCitdKSMgTFRfQ09ORklHX0xURExfRElSCisKKyMgV2UgYnJlYWsgdGhpcyBvdXQgaW50byBhIHNlcGFyYXRlIG1hY3JvLCBzbyB0aGF0IHdlIGNhbiBjYWxsIGl0IHNhZmVseQorIyBpbnRlcm5hbGx5IHdpdGhvdXQgYmVpbmcgY2F1Z2h0IGFjY2lkZW50YWxseSBieSB0aGUgc2VkIHNjYW4gaW4gbGlidG9vbGl6ZS4KK200X2RlZnVuKFtfTFRfQ09ORklHX0xURExfRElSXSwKK1tkbmwgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMKK200X3B1c2hkZWYoW19BUkdfRElSXSwgbTRfYnBhdHN1YnN0KFskMV0sIFsvKiRdKSkKK200X2Nhc2UoX0xURExfRElSLAorCVtdLCBbZG5sIG9ubHkgc2V0IGx0X2x0ZGxfZGlyIGlmIF9BUkdfRElSIGlzIG5vdCBzaW1wbHkgYC4nCisJICAgICBtNF9pZihfQVJHX0RJUiwgWy5dLAorCSAgICAgICAgICAgICBbXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX0RJUl0sIF9BUkdfRElSKQorCSAgICAgICAgICBfTFRfU0hFTExfSU5JVChbbHRfbHRkbF9kaXI9J11fQVJHX0RJUlsnXSldKV0sCisgICAgW200X2lmKF9BUkdfRElSLCBfTFRETF9ESVIsCisJICAgIFtdLAorCVttNF9mYXRhbChbbXVsdGlwbGUgbGlibHRkbCBkaXJlY3RvcmllczogYF1fTFRETF9ESVJbJywgYF1fQVJHX0RJUlsnXSldKV0pCittNF9wb3BkZWYoW19BUkdfRElSXSkKK10pIyBfTFRfQ09ORklHX0xURExfRElSCisKKyMgSW5pdGlhbGlzZToKK200X2RlZmluZShbX0xURExfRElSXSwgW10pCisKKworIyBfTFRfQlVJTERfUFJFRklYCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgSWYgQXV0b2NvbmYgaXMgbmV3IGVub3VnaCwgZXhwYW5kIHRvIGAke3RvcF9idWlsZF9wcmVmaXh9Jywgb3RoZXJ3aXNlCisjIHRvIGAke3RvcF9idWlsZGRpcn0vJy4KK200X2RlZmluZShbX0xUX0JVSUxEX1BSRUZJWF0sCitbbTRfaWZkZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAorICAgW200X2lmKG00X3ZlcnNpb25fY29tcGFyZShtNF9kZWZuKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSksIFsyLjYyXSksCisJICBbLTFdLCBbbTRfaWZkZWYoW19BQ19IQVZFX1RPUF9CVUlMRF9QUkVGSVhdLAorCQkJICBbJHt0b3BfYnVpbGRfcHJlZml4fV0sCisJCQkgIFske3RvcF9idWlsZGRpcn0vXSldLAorCSAgWyR7dG9wX2J1aWxkX3ByZWZpeH1dKV0sCisgICBbJHt0b3BfYnVpbGRkaXJ9L10pW11kbmwKK10pCisKKworIyBMVERMX0NPTlZFTklFTkNFCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvciB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5IGFuZAorIyBMVERMSU5DTCB0byB0aGUgaW5jbHVkZSBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgaGVhZGVyIGFuZCBhZGRzCisjIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8gdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQKKyMgQUNfQ09ORklHX1NVQkRJUlMgaXMgbm90IGNhbGxlZCBoZXJlLiAgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkIHdpdGgKKyMgJyR7dG9wX2J1aWxkX3ByZWZpeH0nIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHdpdGggJyR7dG9wX2J1aWxkZGlyfS8nLAorIyBhbmQgTFRETElOQ0wgd2lsbCBiZSBwcmVmaXhlZCB3aXRoICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZQorIyBxdW90ZXMhKS4gIElmIHlvdXIgcGFja2FnZSBpcyBub3QgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwKKyMgZGVmaW5lIHRvcF9idWlsZF9wcmVmaXgsIHRvcF9idWlsZGRpciwgYW5kIHRvcF9zcmNkaXIgYXBwcm9wcmlhdGVseQorIyBpbiB5b3VyIE1ha2VmaWxlcy4KK0FDX0RFRlVOKFtMVERMX0NPTlZFTklFTkNFXSwKK1tBQ19CRUZPUkUoWyQwXSwgW0xURExfSU5JVF0pZG5sCitkbmwgQWx0aG91Z2ggdGhlIGFyZ3VtZW50IGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2N1bWVudGVkLAorZG5sIExURExfQ09OVkVOSUVOQ0UgdXNlZCB0byB0YWtlIGEgRElSRUNUT1JZIG9yZ3VtZW50LCBpZiB3ZSBoYXZlIG9uZQorZG5sIGhlcmUgbWFrZSBzdXJlIGl0IGlzIHRoZSBzYW1lIGFzIGFueSBvdGhlciBkZWNsYXJhdGlvbiBvZiBsaWJsdGRsJ3MKK2RubCBsb2NhdGlvbiEgIFRoaXMgYWxzbyBlbnN1cmVzIGx0X2x0ZGxfZGlyIGlzIHNldCB3aGVuIGNvbmZpZ3VyZS5hYyBpcworZG5sIG5vdCB5ZXQgdXNpbmcgYW4gZXhwbGljaXQgTFRfQ09ORklHX0xURExfRElSLgorbTRfaWZ2YWwoWyQxXSwgW19MVF9DT05GSUdfTFRETF9ESVIoWyQxXSldKWRubAorXyQwKCkKK10pIyBMVERMX0NPTlZFTklFTkNFCisKKyMgQUNfTElCTFRETF9DT05WRU5JRU5DRSBhY2NlcHRlZCBhIGRpcmVjdG9yeSBhcmd1bWVudCBpbiBvbGRlciBsaWJ0b29scywKKyMgbm93IHdlIGhhdmUgTFRfQ09ORklHX0xURExfRElSOgorQVVfREVGVU4oW0FDX0xJQkxURExfQ09OVkVOSUVOQ0VdLAorW19MVF9DT05GSUdfTFRETF9ESVIoW200X2RlZmF1bHQoWyQxXSwgW2xpYmx0ZGxdKV0pCitfTFRETF9DT05WRU5JRU5DRV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCTFRETF9DT05WRU5JRU5DRV0sIFtdKQorCisKKyMgX0xURExfQ09OVkVOSUVOQ0UKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29kZSBzaGFyZWQgYnkgTFRETF9DT05WRU5JRU5DRSBhbmQgTFRETF9JTklUKFtjb252ZW5pZW5jZV0pLgorbTRfZGVmdW4oW19MVERMX0NPTlZFTklFTkNFXSwKK1tjYXNlICRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSBpbgorICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKKyAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcworICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OworZXNhYworTElCTFRETD0nX0xUX0JVSUxEX1BSRUZJWCciJHtsdF9sdGRsX2RpciskbHRfbHRkbF9kaXIvfWxpYmx0ZGxjLmxhIgorTFRETERFUFM9JExJQkxUREwKK0xURExJTkNMPSctSSR7dG9wX3NyY2Rpcn0nIiR7bHRfbHRkbF9kaXIrLyRsdF9sdGRsX2Rpcn0iCisKK0FDX1NVQlNUKFtMSUJMVERMXSkKK0FDX1NVQlNUKFtMVERMREVQU10pCitBQ19TVUJTVChbTFRETElOQ0xdKQorCisjIEZvciBiYWNrd2FyZHMgbm9uLWdldHRleHQgY29uc2lzdGVudCBjb21wYXRpYmlsaXR5Li4uCitJTkNMVERMPSIkTFRETElOQ0wiCitBQ19TVUJTVChbSU5DTFRETF0pCitdKSMgX0xURExfQ09OVkVOSUVOQ0UKKworCisjIExURExfSU5TVEFMTEFCTEUKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnkKKyMgYW5kIExURExJTkNMIHRvIHRoZSBpbmNsdWRlIGZsYWdzIGZvciB0aGUgbGlibHRkbCBoZWFkZXIgYW5kIGFkZHMKKyMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0CisjIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgZnJvbSBoZXJlLiAgSWYgYW4gaW5zdGFsbGVkIGxpYmx0ZGwKKyMgaXMgbm90IGZvdW5kLCBMSUJMVERMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3BfYnVpbGRfcHJlZml4fScgaWYKKyMgYXZhaWxhYmxlLCBvdGhlcndpc2Ugd2l0aCAnJHt0b3BfYnVpbGRkaXJ9LycsIGFuZCBMVERMSU5DTCB3aWxsIGJlCisjIHByZWZpeGVkIHdpdGggJyR7dG9wX3NyY2Rpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpLiAgSWYgeW91cgorIyBwYWNrYWdlIGlzIG5vdCBmbGF0IGFuZCB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkX3ByZWZpeCwKKyMgdG9wX2J1aWxkZGlyLCBhbmQgdG9wX3NyY2RpciBhcHByb3ByaWF0ZWx5IGluIHlvdXIgTWFrZWZpbGVzLgorIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBMVF9JTklULgorQUNfREVGVU4oW0xURExfSU5TVEFMTEFCTEVdLAorW0FDX0JFRk9SRShbJDBdLCBbTFRETF9JTklUXSlkbmwKK2RubCBBbHRob3VnaCB0aGUgYXJndW1lbnQgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvY3VtZW50ZWQsCitkbmwgTFRETF9JTlNUQUxMQUJMRSB1c2VkIHRvIHRha2UgYSBESVJFQ1RPUlkgb3JndW1lbnQsIGlmIHdlIGhhdmUgb25lCitkbmwgaGVyZSBtYWtlIHN1cmUgaXQgaXMgdGhlIHNhbWUgYXMgYW55IG90aGVyIGRlY2xhcmF0aW9uIG9mIGxpYmx0ZGwncworZG5sIGxvY2F0aW9uISAgVGhpcyBhbHNvIGVuc3VyZXMgbHRfbHRkbF9kaXIgaXMgc2V0IHdoZW4gY29uZmlndXJlLmFjIGlzCitkbmwgbm90IHlldCB1c2luZyBhbiBleHBsaWNpdCBMVF9DT05GSUdfTFRETF9ESVIuCittNF9pZnZhbChbJDFdLCBbX0xUX0NPTkZJR19MVERMX0RJUihbJDFdKV0pZG5sCitfJDAoKQorXSkjIExURExfSU5TVEFMTEFCTEUKKworIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFIGFjY2VwdGVkIGEgZGlyZWN0b3J5IGFyZ3VtZW50IGluIG9sZGVyIGxpYnRvb2xzLAorIyBub3cgd2UgaGF2ZSBMVF9DT05GSUdfTFRETF9ESVI6CitBVV9ERUZVTihbQUNfTElCTFRETF9JTlNUQUxMQUJMRV0sCitbX0xUX0NPTkZJR19MVERMX0RJUihbbTRfZGVmYXVsdChbJDFdLCBbbGlibHRkbF0pXSkKK19MVERMX0lOU1RBTExBQkxFXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJMVERMX0lOU1RBTExBQkxFXSwgW10pCisKKworIyBfTFRETF9JTlNUQUxMQUJMRQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBDb2RlIHNoYXJlZCBieSBMVERMX0lOU1RBTExBQkxFIGFuZCBMVERMX0lOSVQoW2luc3RhbGxhYmxlXSkuCittNF9kZWZ1bihbX0xURExfSU5TVEFMTEFCTEVdLAorW2lmIHRlc3QgLWYgJHByZWZpeC9saWIvbGlibHRkbC5sYTsgdGhlbgorICBsdF9zYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICBMREZMQUdTPSItTCRwcmVmaXgvbGliICRMREZMQUdTIgorICBBQ19DSEVDS19MSUIoW2x0ZGxdLCBbbHRfZGxpbml0XSwgW2x0X2xpYl9sdGRsPXllc10pCisgIExERkxBR1M9IiRsdF9zYXZlX0xERkxBR1MiCisgIGlmIHRlc3QgeCIke2x0X2xpYl9sdGRsLW5vfSIgPSB4eWVzOyB0aGVuCisgICAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4eWVzOyB0aGVuCisgICAgICAjIERvbid0IG92ZXJ3cml0ZSAkcHJlZml4L2xpYi9saWJsdGRsLmxhIHdpdGhvdXQgLS1lbmFibGUtbHRkbC1pbnN0YWxsCisgICAgICBBQ19NU0dfV0FSTihbbm90IG92ZXJ3cml0aW5nIGxpYmx0ZGwgYXQgJHByZWZpeCwgZm9yY2Ugd2l0aCBgLS1lbmFibGUtbHRkbC1pbnN0YWxsJ10pCisgICAgICBlbmFibGVfbHRkbF9pbnN0YWxsPW5vCisgICAgZmkKKyAgZWxpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geG5vOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pCisgIGZpCitmaQorCisjIElmIGNvbmZpZ3VyZS5hYyBkZWNsYXJlZCBhbiBpbnN0YWxsYWJsZSBsdGRsLCBhbmQgdGhlIHVzZXIgZGlkbid0IG92ZXJyaWRlCisjIHdpdGggLS1kaXNhYmxlLWx0ZGwtaW5zdGFsbCwgd2Ugd2lsbCBpbnN0YWxsIHRoZSBzaGlwcGVkIGxpYmx0ZGwuCitjYXNlICRlbmFibGVfbHRkbF9pbnN0YWxsIGluCisgIG5vKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbD1ubyIKKyAgICAgIExJQkxUREw9Ii1sbHRkbCIKKyAgICAgIExURExERVBTPQorICAgICAgTFRETElOQ0w9CisgICAgICA7OworICAqKSAgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIgorICAgICAgTElCTFRETD0nX0xUX0JVSUxEX1BSRUZJWCciJHtsdF9sdGRsX2RpciskbHRfbHRkbF9kaXIvfWxpYmx0ZGwubGEiCisgICAgICBMVERMREVQUz0kTElCTFRETAorICAgICAgTFRETElOQ0w9Jy1JJHt0b3Bfc3JjZGlyfSciJHtsdF9sdGRsX2RpcisvJGx0X2x0ZGxfZGlyfSIKKyAgICAgIDs7Citlc2FjCisKK0FDX1NVQlNUKFtMSUJMVERMXSkKK0FDX1NVQlNUKFtMVERMREVQU10pCitBQ19TVUJTVChbTFRETElOQ0xdKQorCisjIEZvciBiYWNrd2FyZHMgbm9uLWdldHRleHQgY29uc2lzdGVudCBjb21wYXRpYmlsaXR5Li4uCitJTkNMVERMPSIkTFRETElOQ0wiCitBQ19TVUJTVChbSU5DTFRETF0pCitdKSMgTFRETF9JTlNUQUxMQUJMRQorCisKKyMgX0xURExfTU9ERV9ESVNQQVRDSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVERMX01PREVfRElTUEFUQ0hdLAorW2RubCBJZiBfTFRETF9ESVIgaXMgYC4nLCB0aGVuIHdlIGFyZSBjb25maWd1cmluZyBsaWJsdGRsIGl0c2VsZjoKK200X2lmKF9MVERMX0RJUiwgW10sCisJW10sCisgICAgZG5sIGlmIF9MVERMX01PREUgd2FzIG5vdCBzZXQgYWxyZWFkeSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYHN1YnByb2plY3QnOgorICAgIFttNF9jYXNlKG00X2RlZmF1bHQoX0xURExfTU9ERSwgW3N1YnByb2plY3RdKSwKKwkgIFtzdWJwcm9qZWN0XSwgW0FDX0NPTkZJR19TVUJESVJTKF9MVERMX0RJUikKKwkJCSAgX0xUX1NIRUxMX0lOSVQoW2x0X2Rsb3Blbl9kaXI9IiRsdF9sdGRsX2RpciJdKV0sCisJICBbbm9ucmVjdXJzaXZlXSwgW19MVF9TSEVMTF9JTklUKFtsdF9kbG9wZW5fZGlyPSIkbHRfbHRkbF9kaXIiOyBsdF9saWJvYmpfcHJlZml4PSIkbHRfbHRkbF9kaXIvIl0pXSwKKwkgIFtyZWN1cnNpdmVdLCBbXSwKKwlbbTRfZmF0YWwoW3Vua25vd24gbGlibHRkbCBtb2RlOiBdX0xURExfTU9ERSldKV0pZG5sCitkbmwgQmUgY2FyZWZ1bCBub3QgdG8gZXhwYW5kIHR3aWNlOgorbTRfZGVmaW5lKFskMF0sIFtdKQorXSkjIF9MVERMX01PREVfRElTUEFUQ0gKKworCisjIF9MVF9MSUJPQkooTU9EVUxFX05BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExpa2UgQUNfTElCT0JKLCBleGNlcHQgdGhhdCBNT0RVTEVfTkFNRSBnb2VzIGludG8gX0xUX0xJQk9CSlMgaW5zdGVhZAorIyBvZiBpbnRvIExJQk9CSlMuCitBQ19ERUZVTihbX0xUX0xJQk9CSl0sIFsKKyAgbTRfcGF0dGVybl9hbGxvdyhbXl9MVF9MSUJPQkpTJF0pCisgIF9MVF9MSUJPQkpTPSIkX0xUX0xJQk9CSlMgJDEuJGFjX29iamV4dCIKK10pIyBfTFRfTElCT0JKUworCisKKyMgTFRETF9JTklUKFtPUFRJT05TXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2xpZW50cyBvZiBsaWJsdGRsIGNhbiB1c2UgdGhpcyBtYWNybyB0byBhbGxvdyB0aGUgaW5zdGFsbGVyIHRvCisjIGNob29zZSBiZXR3ZWVuIGEgc2hpcHBlZCBjb3B5IG9mIHRoZSBsdGRsIHNvdXJjZXMgb3IgYSBwcmVpbnN0YWxsZWQKKyMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gIElmIHRoZSBzaGlwcGVkIGx0ZGwgc291cmNlcyBhcmUgbm90IGluIGEKKyMgc3ViZGlyZWN0b3J5IG5hbWVkIGxpYmx0ZGwsIHRoZSBkaXJlY3RvcnkgbmFtZSBtdXN0IGJlIGdpdmVuIGJ5CisjIExUX0NPTkZJR19MVERMX0RJUi4KK0FDX0RFRlVOKFtMVERMX0lOSVRdLAorW2RubCBQYXJzZSBPUFRJT05TCitfTFRfU0VUX09QVElPTlMoWyQwXSwgWyQxXSkKKworZG5sIFdlIG5lZWQgdG8ga2VlcCBvdXIgb3duIGxpc3Qgb2YgbGlib2JqcyBzZXBhcmF0ZSBmcm9tIG91ciBwYXJlbnQgcHJvamVjdCwKK2RubCBhbmQgdGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoYXQgaXMgcmVkZWZpbmUgdGhlIEFDX0xJQk9CSnMgbWFjcm8gd2hpbGUKK2RubCB3ZSBsb29rIGZvciBvdXIgb3duIExJQk9CSnMuCittNF9wdXNoZGVmKFtBQ19MSUJPQkpdLCBtNF9kZWZuKFtfTFRfTElCT0JKXSkpCittNF9wdXNoZGVmKFtBQ19MSUJTT1VSQ0VTXSkKKworZG5sIElmIG5vdCBvdGhlcndpc2UgZGVmaW5lZCwgZGVmYXVsdCB0byB0aGUgMS41LnggY29tcGF0aWJsZSBzdWJwcm9qZWN0IG1vZGU6CittNF9pZihfTFRETF9NT0RFLCBbXSwKKyAgICAgICAgW200X2RlZmluZShbX0xURExfTU9ERV0sIG00X2RlZmF1bHQoWyQyXSwgW3N1YnByb2plY3RdKSkKKyAgICAgICAgbTRfaWYoWy0xXSwgW200X2JyZWdleHAoX0xURExfTU9ERSwgW1woc3VicHJvamVjdFx8XChub25cKT9yZWN1cnNpdmVcKV0pXSwKKyAgICAgICAgICAgICAgICBbbTRfZmF0YWwoW3Vua25vd24gbGlibHRkbCBtb2RlOiBdX0xURExfTU9ERSldKV0pCisKK0FDX0FSR19XSVRIKFtpbmNsdWRlZF9sdGRsXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1pbmNsdWRlZC1sdGRsXSwKKyAgICAgICAgICAgICAgICAgICAgW3VzZSB0aGUgR05VIGx0ZGwgc291cmNlcyBpbmNsdWRlZCBoZXJlXSldKQorCitpZiB0ZXN0ICJ4JHdpdGhfaW5jbHVkZWRfbHRkbCIgIT0geHllczsgdGhlbgorICAjIFdlIGFyZSBub3QgYmVpbmcgZm9yY2VkIHRvIHVzZSB0aGUgaW5jbHVkZWQgbGlibHRkbCBzb3VyY2VzLCBzbworICAjIGRlY2lkZSB3aGV0aGVyIHRoZXJlIGlzIGEgdXNlZnVsIGluc3RhbGxlZCB2ZXJzaW9uIHdlIGNhbiB1c2UuCisgIEFDX0NIRUNLX0hFQURFUihbbHRkbC5oXSwKKyAgICAgIFtBQ19DSEVDS19ERUNMKFtsdF9kbGludGVyZmFjZV9yZWdpc3Rlcl0sCisJICAgW0FDX0NIRUNLX0xJQihbbHRkbF0sIFtsdF9kbGFkdmlzZV9wcmVsb2FkXSwKKwkgICAgICAgW3dpdGhfaW5jbHVkZWRfbHRkbD1ub10sCisJICAgICAgIFt3aXRoX2luY2x1ZGVkX2x0ZGw9eWVzXSldLAorCSAgIFt3aXRoX2luY2x1ZGVkX2x0ZGw9eWVzXSwKKwkgICBbQUNfSU5DTFVERVNfREVGQVVMVAorCSAgICAjaW5jbHVkZSA8bHRkbC5oPl0pXSwKKyAgICAgIFt3aXRoX2luY2x1ZGVkX2x0ZGw9eWVzXSwKKyAgICAgIFtBQ19JTkNMVURFU19ERUZBVUxUXQorICApCitmaQorCitkbmwgSWYgbmVpdGhlciBMVF9DT05GSUdfTFRETF9ESVIsIExURExfQ09OVkVOSUVOQ0Ugbm9yIExURExfSU5TVEFMTEFCTEUKK2RubCB3YXMgY2FsbGVkIHlldCwgdGhlbiBmb3Igb2xkIHRpbWVzJyBzYWtlLCB3ZSBhc3N1bWUgbGlibHRkbCBpcyBpbiBhbgorZG5sIGVwb255bW91cyBkaXJlY3Rvcnk6CitBQ19QUk9WSURFX0lGRUxTRShbTFRfQ09ORklHX0xURExfRElSXSwgW10sIFtfTFRfQ09ORklHX0xURExfRElSKFtsaWJsdGRsXSldKQorCitBQ19BUkdfV0lUSChbbHRkbF9pbmNsdWRlXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1sdGRsLWluY2x1ZGU9RElSXSwKKyAgICAgICAgICAgICAgICAgICAgW3VzZSB0aGUgbHRkbCBoZWFkZXJzIGluc3RhbGxlZCBpbiBESVJdKV0pCisKK2lmIHRlc3QgLW4gIiR3aXRoX2x0ZGxfaW5jbHVkZSI7IHRoZW4KKyAgaWYgdGVzdCAtZiAiJHdpdGhfbHRkbF9pbmNsdWRlL2x0ZGwuaCI7IHRoZW4gOgorICBlbHNlCisgICAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIGx0ZGwgaW5jbHVkZSBkaXJlY3Rvcnk6IGAkd2l0aF9sdGRsX2luY2x1ZGUnXSkKKyAgZmkKK2Vsc2UKKyAgd2l0aF9sdGRsX2luY2x1ZGU9bm8KK2ZpCisKK0FDX0FSR19XSVRIKFtsdGRsX2xpYl0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtbHRkbC1saWI9RElSXSwKKyAgICAgICAgICAgICAgICAgICAgW3VzZSB0aGUgbGlibHRkbC5sYSBpbnN0YWxsZWQgaW4gRElSXSldKQorCitpZiB0ZXN0IC1uICIkd2l0aF9sdGRsX2xpYiI7IHRoZW4KKyAgaWYgdGVzdCAtZiAiJHdpdGhfbHRkbF9saWIvbGlibHRkbC5sYSI7IHRoZW4gOgorICBlbHNlCisgICAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIGx0ZGwgbGlicmFyeSBkaXJlY3Rvcnk6IGAkd2l0aF9sdGRsX2xpYiddKQorICBmaQorZWxzZQorICB3aXRoX2x0ZGxfbGliPW5vCitmaQorCitjYXNlICwkd2l0aF9pbmNsdWRlZF9sdGRsLCR3aXRoX2x0ZGxfaW5jbHVkZSwkd2l0aF9sdGRsX2xpYiwgaW4KKyAgLHllcyxubyxubywpCisJbTRfY2FzZShtNF9kZWZhdWx0KF9MVERMX1RZUEUsIFtjb252ZW5pZW5jZV0pLAorCSAgICBbY29udmVuaWVuY2VdLCBbX0xURExfQ09OVkVOSUVOQ0VdLAorCSAgICBbaW5zdGFsbGFibGVdLCBbX0xURExfSU5TVEFMTEFCTEVdLAorCSAgW200X2ZhdGFsKFt1bmtub3duIGxpYmx0ZGwgYnVpbGQgdHlwZTogXV9MVERMX1RZUEUpXSkKKwk7OworICAsbm8sbm8sbm8sKQorCSMgSWYgdGhlIGluY2x1ZGVkIGx0ZGwgaXMgbm90IHRvIGJlIHVzZWQsIHRoZW4gdXNlIHRoZQorCSMgcHJlaW5zdGFsbGVkIGxpYmx0ZGwgd2UgZm91bmQuCisJQUNfREVGSU5FKFtIQVZFX0xURExdLCBbMV0sCisJICBbRGVmaW5lIHRoaXMgaWYgYSBtb2Rlcm4gbGlibHRkbCBpcyBhbHJlYWR5IGluc3RhbGxlZF0pCisJTElCTFRETD0tbGx0ZGwKKwlMVERMREVQUz0KKwlMVERMSU5DTD0KKwk7OworICAsbm8qLG5vLCopCisJQUNfTVNHX0VSUk9SKFtgLS13aXRoLWx0ZGwtaW5jbHVkZScgYW5kIGAtLXdpdGgtbHRkbC1saWInIG9wdGlvbnMgbXVzdCBiZSB1c2VkIHRvZ2V0aGVyXSkKKwk7OworICAqKQl3aXRoX2luY2x1ZGVkX2x0ZGw9bm8KKwlMSUJMVERMPSItTCR3aXRoX2x0ZGxfbGliIC1sbHRkbCIKKwlMVERMREVQUz0KKwlMVERMSU5DTD0iLUkkd2l0aF9sdGRsX2luY2x1ZGUiCisJOzsKK2VzYWMKK0lOQ0xUREw9IiRMVERMSU5DTCIKKworIyBSZXBvcnQgb3VyIGRlY2lzaW9uLi4uCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXJlIHRvIGZpbmQgbGlibHRkbCBoZWFkZXJzXSkKK0FDX01TR19SRVNVTFQoWyRMVERMSU5DTF0pCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXJlIHRvIGZpbmQgbGlibHRkbCBsaWJyYXJ5XSkKK0FDX01TR19SRVNVTFQoWyRMSUJMVERMXSkKKworX0xURExfU0VUVVAKKworZG5sIHJlc3RvcmUgYXV0b2NvbmYgZGVmaW5pdGlvbi4KK200X3BvcGRlZihbQUNfTElCT0JKXSkKK200X3BvcGRlZihbQUNfTElCU09VUkNFU10pCisKK0FDX0NPTkZJR19DT01NQU5EU19QUkUoWworICAgIF9sdGRsX2xpYm9ianM9CisgICAgX2x0ZGxfbHRsaWJvYmpzPQorICAgIGlmIHRlc3QgLW4gIiRfTFRfTElCT0JKUyI7IHRoZW4KKyAgICAgICMgUmVtb3ZlIHRoZSBleHRlbnNpb24uCisgICAgICBfbHRfc2VkX2Ryb3Bfb2JqZXh0PSdzL1wubyQvLztzL1wub2JqJC8vJworICAgICAgZm9yIGkgaW4gYGZvciBpIGluICRfTFRfTElCT0JKUzsgZG8gZWNobyAiJGkiOyBkb25lIHwgc2VkICIkX2x0X3NlZF9kcm9wX29iamV4dCIgfCBzb3J0IC11YDsgZG8KKyAgICAgICAgX2x0ZGxfbGlib2Jqcz0iJF9sdGRsX2xpYm9ianMgJGx0X2xpYm9ial9wcmVmaXgkaS4kYWNfb2JqZXh0IgorICAgICAgICBfbHRkbF9sdGxpYm9ianM9IiRfbHRkbF9sdGxpYm9ianMgJGx0X2xpYm9ial9wcmVmaXgkaS5sbyIKKyAgICAgIGRvbmUKKyAgICBmaQorICAgIEFDX1NVQlNUKFtsdGRsX0xJQk9CSlNdLCBbJF9sdGRsX2xpYm9ianNdKQorICAgIEFDX1NVQlNUKFtsdGRsX0xUTElCT0JKU10sIFskX2x0ZGxfbHRsaWJvYmpzXSkKK10pCisKKyMgT25seSBleHBhbmQgb25jZToKK200X2RlZmluZShbTFRETF9JTklUXSkKK10pIyBMVERMX0lOSVQKKworIyBPbGQgbmFtZXM6CitBVV9ERUZVTihbQUNfTElCX0xURExdLCBbTFRETF9JTklUKCRAKV0pCitBVV9ERUZVTihbQUNfV0lUSF9MVERMXSwgW0xURExfSU5JVCgkQCldKQorQVVfREVGVU4oW0xUX1dJVEhfTFRETF0sIFtMVERMX0lOSVQoJEApXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCX0xURExdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfV0lUSF9MVERMXSwgW10pCitkbmwgQUNfREVGVU4oW0xUX1dJVEhfTFRETF0sIFtdKQorCisKKyMgX0xURExfU0VUVVAKKyMgLS0tLS0tLS0tLS0KKyMgUGVyZm9ybSBhbGwgdGhlIGNoZWNrcyBuZWNlc3NhcnkgZm9yIGNvbXBpbGF0aW9uIG9mIHRoZSBsdGRsIG9iamVjdHMKKyMgIC0tIGluY2x1ZGluZyBjb21waWxlciBjaGVja3MgYW5kIGhlYWRlciBjaGVja3MuICBUaGlzIGlzIGEgcHVibGljCisjIGludGVyZmFjZSAgbWFpbmx5IGZvciB0aGUgYmVuZWZpdCBvZiBsaWJsdGRsJ3Mgb3duIGNvbmZpZ3VyZS5hYywgbW9zdAorIyBvdGhlciB1c2VycyBzaG91bGQgY2FsbCBMVERMX0lOSVQgaW5zdGVhZC4KK0FDX0RFRlVOKFtfTFRETF9TRVRVUF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtMVF9TWVNfTU9EVUxFX0VYVF0pZG5sCitBQ19SRVFVSVJFKFtMVF9TWVNfTU9EVUxFX1BBVEhdKWRubAorQUNfUkVRVUlSRShbTFRfU1lTX0RMU0VBUkNIX1BBVEhdKWRubAorQUNfUkVRVUlSRShbTFRfTElCX0RMTE9BRF0pZG5sCitBQ19SRVFVSVJFKFtMVF9TWVNfU1lNQk9MX1VTQ09SRV0pZG5sCitBQ19SRVFVSVJFKFtMVF9GVU5DX0RMU1lNX1VTQ09SRV0pZG5sCitBQ19SRVFVSVJFKFtMVF9TWVNfRExPUEVOX0RFUExJQlNdKWRubAorQUNfUkVRVUlSRShbZ2xfRlVOQ19BUkdaXSlkbmwKKworbTRfcmVxdWlyZShbX0xUX0NIRUNLX09CSkRJUl0pZG5sCittNF9yZXF1aXJlKFtfTFRfSEVBREVSX0RMRkNOXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19ETFBSRU9QRU5dKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKKworZG5sIERvbid0IHJlcXVpcmUgdGhpcywgb3IgaXQgd2lsbCBiZSBleHBhbmRlZCBlYXJsaWVyIHRoYW4gdGhlIGNvZGUKK2RubCB0aGF0IHNldHMgdGhlIHZhcmlhYmxlcyBpdCByZWxpZXMgb246CitfTFRfRU5BQkxFX0lOU1RBTEwKKworZG5sIF9MVERMX01PREUgc3BlY2lmaWMgY29kZSBtdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlOgorX0xURExfTU9ERV9ESVNQQVRDSAorCisjIEluIG9yZGVyIHRoYXQgbHRkbC5jIGNhbiBjb21waWxlLCBmaW5kIG91dCB0aGUgZmlyc3QgQUNfQ09ORklHX0hFQURFUlMKKyMgdGhlIHVzZXIgdXNlZC4gIFRoaXMgaXMgc28gdGhhdCBsdGRsLmggY2FuIHBpY2sgdXAgdGhlIHBhcmVudCBwcm9qZWN0cworIyBjb25maWcuaCBmaWxlLCBUaGUgZmlyc3QgZmlsZSBpbiBBQ19DT05GSUdfSEVBREVSUyBtdXN0IGNvbnRhaW4gdGhlCisjIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IGx0ZGwuYy4KKyMgRklYTUU6IFJlbW92ZSB1c2Ugb2YgdW5kb2N1bWVudGVkIEFDX0xJU1RfSEVBREVSUyAoMi41OSBjb21wYXRpYmlsaXR5KS4KK0FDX0NPTkZJR19DT01NQU5EU19QUkUoW2RubAorbTRfcGF0dGVybl9hbGxvdyhbXkxUX0NPTkZJR19IJF0pZG5sCittNF9pZnNldChbQUhfSEVBREVSXSwKKyAgICBbTFRfQ09ORklHX0g9QUhfSEVBREVSXSwKKyAgICBbbTRfaWZzZXQoW0FDX0xJU1RfSEVBREVSU10sCisJICAgIFtMVF9DT05GSUdfSD1gZWNobyAiQUNfTElTVF9IRUFERVJTIiB8ICRTRUQgJ3MsXltbICAgICAgXV0qLCw7cyxbWyA6XV0uKiQsLCdgXSwKKwlbXSldKV0pCitBQ19TVUJTVChbTFRfQ09ORklHX0hdKQorCitBQ19DSEVDS19IRUFERVJTKFt1bmlzdGQuaCBkbC5oIHN5cy9kbC5oIGRsZC5oIG1hY2gtby9keWxkLmggZGlyZW50LmhdLAorCVtdLCBbXSwgW0FDX0lOQ0xVREVTX0RFRkFVTFRdKQorCitBQ19DSEVDS19GVU5DUyhbY2xvc2VkaXIgb3BlbmRpciByZWFkZGlyXSwgW10sIFtBQ19MSUJPQkooW2x0X19kaXJlbnRdKV0pCitBQ19DSEVDS19GVU5DUyhbc3RybGNhdCBzdHJsY3B5XSwgW10sIFtBQ19MSUJPQkooW2x0X19zdHJsXSldKQorCitBQ19ERUZJTkVfVU5RVU9URUQoW0xUX0xJQkVYVF0sWyIkbGliZXh0Il0sW1RoZSBhcmNoaXZlIGV4dGVuc2lvbl0pCisKK25hbWU9bHRkbAorTFRETE9QRU49YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorQUNfU1VCU1QoW0xURExPUEVOXSkKK10pIyBfTFRETF9TRVRVUAorCisKKyMgX0xUX0VOQUJMRV9JTlNUQUxMCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0lOU1RBTExdLAorW0FDX0FSR19FTkFCTEUoW2x0ZGwtaW5zdGFsbF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1sdGRsLWluc3RhbGxdLCBbaW5zdGFsbCBsaWJsdGRsXSldKQorCitjYXNlICwke2VuYWJsZV9sdGRsX2luc3RhbGx9LCR7ZW5hYmxlX2x0ZGxfY29udmVuaWVuY2V9IGluCisgICp5ZXMqKSA7OworICAqKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMgOzsKK2VzYWMKKworbTRfaWZkZWYoW0FNX0NPTkRJVElPTkFMXSwKK1tBTV9DT05ESVRJT05BTChJTlNUQUxMX0xUREwsIHRlc3QgeCIke2VuYWJsZV9sdGRsX2luc3RhbGwtbm99IiAhPSB4bm8pCisgQU1fQ09ORElUSU9OQUwoQ09OVkVOSUVOQ0VfTFRETCwgdGVzdCB4IiR7ZW5hYmxlX2x0ZGxfY29udmVuaWVuY2Utbm99IiAhPSB4bm8pXSkKK10pIyBfTFRfRU5BQkxFX0lOU1RBTEwKKworCisjIExUX1NZU19ETE9QRU5fREVQTElCUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9TWVNfRExPUEVOX0RFUExJQlNdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGRlcGxpYnMgYXJlIGxvYWRlZCBieSBkbG9wZW5dLAorICBbbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzXSwKKyAgWyMgUE9SVE1FIGRvZXMgeW91ciBzeXN0ZW0gYXV0b21hdGljYWxseSBsb2FkIGRlcGxpYnMgZm9yIGRsb3Blbj8KKyAgIyBvciBpdHMgbG9naWNhbCBlcXVpdmFsZW50IChlLmcuIHNobF9sb2FkIGZvciBIUC1VWCA8IDExKQorICAjIEZvciBub3csIHdlIGp1c3QgY2F0Y2ggT1NlcyB3ZSBrbm93IHNvbWV0aGluZyBhYm91dCAtLSBpbiB0aGUKKyAgIyBmdXR1cmUsIHdlJ2xsIHRyeSB0ZXN0IHRoaXMgcHJvZ3JhbW1hdGljYWxseS4KKyAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXVua25vd24KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKnxhaXg0LjEuKnxhaXg0LjIuKikKKyAgICAjIFVua25vd24gd2hldGhlciB0aGlzIGlzIHRydWUgZm9yIHRoZXNlIHZlcnNpb25zIG9mIEFJWCwgYnV0CisgICAgIyB3ZSB3YW50IHRoaXMgYGNhc2UnIGhlcmUgdG8gZXhwbGljaXRseSBjYXRjaCB0aG9zZSB2ZXJzaW9ucy4KKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9dW5rbm93bgorICAgIDs7CisgIGFpeFtbNC05XV0qKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBhbWlnYW9zKikKKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIHBvd2VycGMpCisgICAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9bm8KKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGRhcndpbiopCisgICAgIyBBc3N1bWluZyB0aGUgdXNlciBoYXMgaW5zdGFsbGVkIGEgbGliZGwgZnJvbSBzb21ld2hlcmUsIHRoaXMgaXMgdHJ1ZQorICAgICMgSWYgeW91IGFyZSBsb29raW5nIGZvciBvbmUgaHR0cDovL3d3dy5vcGVuZGFyd2luLm9yZy9wcm9qZWN0cy9kbGNvbXBhdAorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGdudSogfCBsaW51eCogfCBrKmJzZCotZ251KQorICAgICMgR05VIGFuZCBpdHMgdmFyaWFudHMsIHVzaW5nIGdudSBsZC5zbyAoR2xpYmMpCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGhwdXgxMCp8aHB1eDExKikKKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9eWVzCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGlyaXhbWzEyMzQ1XV0qfGlyaXg2LltbMDFdXSopCisgICAgIyBDYXRjaCBhbGwgdmVyc2lvbnMgb2YgSVJJWCBiZWZvcmUgNi4yLCBhbmQgaW5kaWNhdGUgdGhhdCB3ZSBkb24ndAorICAgICMga25vdyBob3cgaXQgd29ya2VkIGZvciBhbnkgb2YgdGhvc2UgdmVyc2lvbnMuCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXVua25vd24KKyAgICA7OworICBpcml4KikKKyAgICAjIFRoZSBjYXNlIGFib3ZlIGNhdGNoZXMgYW55dGhpbmcgYmVmb3JlIDYuMiwgYW5kIGl0J3Mga25vd24gdGhhdAorICAgICMgYXQgNi4yIGFuZCBsYXRlciBkbG9wZW4gZG9lcyBsb2FkIGRlcGxpYnMuCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIG5ldGJzZCopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBvc2ZbWzEyMzRdXSopCisgICAgIyBkbG9wZW4gZGlkIGxvYWQgZGVwbGlicyAoYXQgbGVhc3QgYXQgNC54KSwgYnV0IHVudGlsIHRoZSA1Lnggc2VyaWVzLAorICAgICMgaXQgZGlkICpub3QqIHVzZSBhbiBSUEFUSCBpbiBhIHNoYXJlZCBsaWJyYXJ5IHRvIGZpbmQgb2JqZWN0cyB0aGUKKyAgICAjIGxpYnJhcnkgZGVwZW5kcyBvbiwgc28gd2UgZXhwbGljaXRseSBzYXkgYG5vJy4KKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9bm8KKyAgICA7OworICBvc2Y1LjB8b3NmNS4wYXxvc2Y1LjEpCisgICAgIyBkbG9wZW4gKmRvZXMqIGxvYWQgZGVwbGlicyBhbmQgd2l0aCB0aGUgcmlnaHQgbG9hZGVyIHBhdGNoIGFwcGxpZWQKKyAgICAjIGl0IGV2ZW4gdXNlcyBSUEFUSCBpbiBhIHNoYXJlZCBsaWJyYXJ5IHRvIHNlYXJjaCBmb3Igc2hhcmVkIG9iamVjdHMKKyAgICAjIHRoYXQgdGhlIGxpYnJhcnkgZGVwZW5kcyBvbiwgYnV0IHRoZXJlJ3Mgbm8gZWFzeSB3YXkgdG8ga25vdyBpZiB0aGF0CisgICAgIyBwYXRjaCBpcyBpbnN0YWxsZWQuICBTaW5jZSB0aGlzIGlzIHRoZSBjYXNlLCBhbGwgd2UgY2FuIHJlYWxseQorICAgICMgc2F5IGlzIHVua25vd24gLS0gaXQgZGVwZW5kcyBvbiB0aGUgcGF0Y2ggYmVpbmcgaW5zdGFsbGVkLiAgSWYKKyAgICAjIGl0IGlzLCB0aGlzIGNoYW5nZXMgdG8gYHllcycuICBXaXRob3V0IGl0LCBpdCB3b3VsZCBiZSBgbm8nLgorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz11bmtub3duCisgICAgOzsKKyAgb3NmKikKKyAgICAjIHRoZSB0d28gY2FzZXMgYWJvdmUgc2hvdWxkIGNhdGNoIGFsbCB2ZXJzaW9ucyBvZiBvc2YgPD0gNS4xLiAgUmVhZAorICAgICMgdGhlIGNvbW1lbnRzIGFib3ZlIGZvciB3aGF0IHdlIGtub3cgYWJvdXQgdGhlbS4KKyAgICAjIEF0ID4gNS4xLCBkZXBsaWJzIGFyZSBsb2FkZWQgKmFuZCogYW55IFJQQVRIIGluIGEgc2hhcmVkIGxpYnJhcnkKKyAgICAjIGlzIHVzZWQgdG8gZmluZCB0aGVtIHNvIHdlIGNhbiBmaW5hbGx5IHNheSBgeWVzJy4KKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9eWVzCisgICAgOzsKKyAgcW54KikKKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9eWVzCisgICAgOzsKKyAgc29sYXJpcyopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICAgIGxpYmx0ZGxfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgXSkKK2lmIHRlc3QgIiRsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnMiICE9IHllczsgdGhlbgorIEFDX0RFRklORShbTFRETF9ETE9QRU5fREVQTElCU10sIFsxXSwKKyAgICBbRGVmaW5lIGlmIHRoZSBPUyBuZWVkcyBoZWxwIHRvIGxvYWQgZGVwZW5kZW50IGxpYnJhcmllcyBmb3IgZGxvcGVuKCkuXSkKK2ZpCitdKSMgTFRfU1lTX0RMT1BFTl9ERVBMSUJTCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTFRETF9TWVNfRExPUEVOX0RFUExJQlNdLCBbTFRfU1lTX0RMT1BFTl9ERVBMSUJTXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTFRETF9TWVNfRExPUEVOX0RFUExJQlNdLCBbXSkKKworCisjIExUX1NZU19NT0RVTEVfRVhUCisjIC0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfU1lTX01PRFVMRV9FWFRdLAorW200X3JlcXVpcmUoW19MVF9TWVNfRFlOQU1JQ19MSU5LRVJdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW3doaWNoIGV4dGVuc2lvbiBpcyB1c2VkIGZvciBydW50aW1lIGxvYWRhYmxlIG1vZHVsZXNdLAorICBbbGlibHRkbF9jdl9zaGxpYmV4dF0sCitbCittb2R1bGU9eWVzCitldmFsIGxpYmx0ZGxfY3Zfc2hsaWJleHQ9JHNocmV4dF9jbWRzCisgIF0pCitpZiB0ZXN0IC1uICIkbGlibHRkbF9jdl9zaGxpYmV4dCI7IHRoZW4KKyAgbTRfcGF0dGVybl9hbGxvdyhbTFRfTU9EVUxFX0VYVF0pZG5sCisgIEFDX0RFRklORV9VTlFVT1RFRChbTFRfTU9EVUxFX0VYVF0sIFsiJGxpYmx0ZGxfY3Zfc2hsaWJleHQiXSwKKyAgICBbRGVmaW5lIHRvIHRoZSBleHRlbnNpb24gdXNlZCBmb3IgcnVudGltZSBsb2FkYWJsZSBtb2R1bGVzLCBzYXksICIuc28iLl0pCitmaQorXSkjIExUX1NZU19NT0RVTEVfRVhUCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTFRETF9TSExJQkVYVF0sIFtMVF9TWVNfTU9EVUxFX0VYVF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xURExfU0hMSUJFWFRdLCBbXSkKKworCisjIExUX1NZU19NT0RVTEVfUEFUSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9TWVNfTU9EVUxFX1BBVEhdLAorW200X3JlcXVpcmUoW19MVF9TWVNfRFlOQU1JQ19MSU5LRVJdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW3doaWNoIHZhcmlhYmxlIHNwZWNpZmllcyBydW4tdGltZSBtb2R1bGUgc2VhcmNoIHBhdGhdLAorICBbbHRfY3ZfbW9kdWxlX3BhdGhfdmFyXSwgW2x0X2N2X21vZHVsZV9wYXRoX3Zhcj0iJHNobGlicGF0aF92YXIiXSkKK2lmIHRlc3QgLW4gIiRsdF9jdl9tb2R1bGVfcGF0aF92YXIiOyB0aGVuCisgIG00X3BhdHRlcm5fYWxsb3coW0xUX01PRFVMRV9QQVRIX1ZBUl0pZG5sCisgIEFDX0RFRklORV9VTlFVT1RFRChbTFRfTU9EVUxFX1BBVEhfVkFSXSwgWyIkbHRfY3ZfbW9kdWxlX3BhdGhfdmFyIl0sCisgICAgW0RlZmluZSB0byB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdGhhdCBkZXRlcm1pbmVzIHRoZSBydW4tdGltZSBtb2R1bGUgc2VhcmNoIHBhdGguXSkKK2ZpCitdKSMgTFRfU1lTX01PRFVMRV9QQVRICisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTFRETF9TSExJQlBBVEhdLCBbTFRfU1lTX01PRFVMRV9QQVRIXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTFRETF9TSExJQlBBVEhdLCBbXSkKKworCisjIExUX1NZU19ETFNFQVJDSF9QQVRICisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfU1lTX0RMU0VBUkNIX1BBVEhdLAorW200X3JlcXVpcmUoW19MVF9TWVNfRFlOQU1JQ19MSU5LRVJdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2ZvciB0aGUgZGVmYXVsdCBsaWJyYXJ5IHNlYXJjaCBwYXRoXSwKKyAgW2x0X2N2X3N5c19kbHNlYXJjaF9wYXRoXSwKKyAgW2x0X2N2X3N5c19kbHNlYXJjaF9wYXRoPSIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiXSkKK2lmIHRlc3QgLW4gIiRsdF9jdl9zeXNfZGxzZWFyY2hfcGF0aCI7IHRoZW4KKyAgc3lzX2Rsc2VhcmNoX3BhdGg9CisgIGZvciBkaXIgaW4gJGx0X2N2X3N5c19kbHNlYXJjaF9wYXRoOyBkbworICAgIGlmIHRlc3QgLXogIiRzeXNfZGxzZWFyY2hfcGF0aCI7IHRoZW4KKyAgICAgIHN5c19kbHNlYXJjaF9wYXRoPSIkZGlyIgorICAgIGVsc2UKKyAgICAgIHN5c19kbHNlYXJjaF9wYXRoPSIkc3lzX2Rsc2VhcmNoX3BhdGgkUEFUSF9TRVBBUkFUT1IkZGlyIgorICAgIGZpCisgIGRvbmUKKyAgbTRfcGF0dGVybl9hbGxvdyhbTFRfRExTRUFSQ0hfUEFUSF0pZG5sCisgIEFDX0RFRklORV9VTlFVT1RFRChbTFRfRExTRUFSQ0hfUEFUSF0sIFsiJHN5c19kbHNlYXJjaF9wYXRoIl0sCisgICAgW0RlZmluZSB0byB0aGUgc3lzdGVtIGRlZmF1bHQgbGlicmFyeSBzZWFyY2ggcGF0aC5dKQorZmkKK10pIyBMVF9TWVNfRExTRUFSQ0hfUEFUSAorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xURExfU1lTU0VBUkNIUEFUSF0sIFtMVF9TWVNfRExTRUFSQ0hfUEFUSF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xURExfU1lTU0VBUkNIUEFUSF0sIFtdKQorCisKKyMgX0xUX0NIRUNLX0RMUFJFT1BFTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NIRUNLX0RMUFJFT1BFTl0sCitbbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCitBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBsaWJ0b29sIHN1cHBvcnRzIC1kbG9wZW4vLWRscHJlb3Blbl0sCisgIFtsaWJsdGRsX2N2X3ByZWxvYWRlZF9zeW1ib2xzXSwKKyAgW2lmIHRlc3QgLW4gIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICAgIGxpYmx0ZGxfY3ZfcHJlbG9hZGVkX3N5bWJvbHM9eWVzCisgIGVsc2UKKyAgICBsaWJsdGRsX2N2X3ByZWxvYWRlZF9zeW1ib2xzPW5vCisgIGZpCisgIF0pCitpZiB0ZXN0IHgiJGxpYmx0ZGxfY3ZfcHJlbG9hZGVkX3N5bWJvbHMiID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoW0hBVkVfUFJFTE9BREVEX1NZTUJPTFNdLCBbMV0sCisgICAgW0RlZmluZSBpZiBsaWJ0b29sIGNhbiBleHRyYWN0IHN5bWJvbCBsaXN0cyBmcm9tIG9iamVjdCBmaWxlcy5dKQorZmkKK10pIyBfTFRfQ0hFQ0tfRExQUkVPUEVOCisKKworIyBMVF9MSUJfRExMT0FECisjIC0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9MSUJfRExMT0FEXSwKK1ttNF9wYXR0ZXJuX2FsbG93KFteTFRfRExMT0FERVJTJF0pCitMVF9ETExPQURFUlM9CitBQ19TVUJTVChbTFRfRExMT0FERVJTXSkKKworQUNfTEFOR19QVVNIKFtDXSkKKworTElCQUREX0RMT1BFTj0KK0FDX1NFQVJDSF9MSUJTKFtkbG9wZW5dLCBbZGxdLAorCVtBQ19ERUZJTkUoW0hBVkVfTElCRExdLCBbMV0sCisJCSAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGxpYmRsIGxpYnJhcnkgb3IgZXF1aXZhbGVudC5dKQorCWlmIHRlc3QgIiRhY19jdl9zZWFyY2hfZGxvcGVuIiAhPSAibm9uZSByZXF1aXJlZCIgOyB0aGVuCisJICBMSUJBRERfRExPUEVOPSItbGRsIgorCWZpCisJbGlibHRkbF9jdl9saWJfZGxfZGxvcGVuPSJ5ZXMiCisJTFRfRExMT0FERVJTPSIkTFRfRExMT0FERVJTICR7bHRfZGxvcGVuX2RpciskbHRfZGxvcGVuX2Rpci99ZGxvcGVuLmxhIl0sCisgICAgW0FDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sjaWYgSEFWRV9ETEZDTl9ICisjICBpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisgICAgXV0sIFtbZGxvcGVuKDAsIDApO11dKV0sCisJICAgIFtBQ19ERUZJTkUoW0hBVkVfTElCRExdLCBbMV0sCisJCSAgICAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBsaWJkbCBsaWJyYXJ5IG9yIGVxdWl2YWxlbnQuXSkKKwkgICAgbGlibHRkbF9jdl9mdW5jX2Rsb3Blbj0ieWVzIgorCSAgICBMVF9ETExPQURFUlM9IiRMVF9ETExPQURFUlMgJHtsdF9kbG9wZW5fZGlyKyRsdF9kbG9wZW5fZGlyL31kbG9wZW4ubGEiXSwKKwlbQUNfQ0hFQ0tfTElCKFtzdmxkXSwgW2Rsb3Blbl0sCisJCVtBQ19ERUZJTkUoW0hBVkVfTElCRExdLCBbMV0sCisJCQkgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbGliZGwgbGlicmFyeSBvciBlcXVpdmFsZW50Ll0pCisJICAgICAgICBMSUJBRERfRExPUEVOPSItbHN2bGQiIGxpYmx0ZGxfY3ZfZnVuY19kbG9wZW49InllcyIKKwkJTFRfRExMT0FERVJTPSIkTFRfRExMT0FERVJTICR7bHRfZGxvcGVuX2RpciskbHRfZGxvcGVuX2Rpci99ZGxvcGVuLmxhIl0pXSldKQoraWYgdGVzdCB4IiRsaWJsdGRsX2N2X2Z1bmNfZGxvcGVuIiA9IHh5ZXMgfHwgdGVzdCB4IiRsaWJsdGRsX2N2X2xpYl9kbF9kbG9wZW4iID0geHllcwordGhlbgorICBsdF9zYXZlX0xJQlM9IiRMSUJTIgorICBMSUJTPSIkTElCUyAkTElCQUREX0RMT1BFTiIKKyAgQUNfQ0hFQ0tfRlVOQ1MoW2RsZXJyb3JdKQorICBMSUJTPSIkbHRfc2F2ZV9MSUJTIgorZmkKK0FDX1NVQlNUKFtMSUJBRERfRExPUEVOXSkKKworTElCQUREX1NITF9MT0FEPQorQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAorCVtBQ19ERUZJTkUoW0hBVkVfU0hMX0xPQURdLCBbMV0sCisJCSAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNobF9sb2FkIGZ1bmN0aW9uLl0pCisJTFRfRExMT0FERVJTPSIkTFRfRExMT0FERVJTICR7bHRfZGxvcGVuX2RpciskbHRfZGxvcGVuX2Rpci99c2hsX2xvYWQubGEiXSwKKyAgICBbQUNfQ0hFQ0tfTElCKFtkbGRdLCBbc2hsX2xvYWRdLAorCSAgICBbQUNfREVGSU5FKFtIQVZFX1NITF9MT0FEXSwgWzFdLAorCQkgICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2hsX2xvYWQgZnVuY3Rpb24uXSkKKwkgICAgTFRfRExMT0FERVJTPSIkTFRfRExMT0FERVJTICR7bHRfZGxvcGVuX2RpciskbHRfZGxvcGVuX2Rpci99c2hsX2xvYWQubGEiCisJICAgIExJQkFERF9TSExfTE9BRD0iLWxkbGQiXSldKQorQUNfU1VCU1QoW0xJQkFERF9TSExfTE9BRF0pCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2RhcndpbltbMTU2N11dLiopCisjIFdlIG9ubHkgd2FudCB0aGlzIGZvciBwcmUtTWFjIE9TIFggMTAuNC4KKyAgQUNfQ0hFQ0tfRlVOQyhbX2R5bGRfZnVuY19sb29rdXBdLAorCVtBQ19ERUZJTkUoW0hBVkVfRFlMRF0sIFsxXSwKKwkJICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX2R5bGRfZnVuY19sb29rdXAgZnVuY3Rpb24uXSkKKwlMVF9ETExPQURFUlM9IiRMVF9ETExPQURFUlMgJHtsdF9kbG9wZW5fZGlyKyRsdF9kbG9wZW5fZGlyL31keWxkLmxhIl0pCisgIDs7CitiZW9zKikKKyAgTFRfRExMT0FERVJTPSIkTFRfRExMT0FERVJTICR7bHRfZGxvcGVuX2RpciskbHRfZGxvcGVuX2Rpci99bG9hZF9hZGRfb24ubGEiCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgb3MyKiB8IHB3MzIqKQorICBBQ19DSEVDS19ERUNMUyhbY3lnd2luX2NvbnZfcGF0aF0sIFtdLCBbXSwgW1sjaW5jbHVkZSA8c3lzL2N5Z3dpbi5oPl1dKQorICBMVF9ETExPQURFUlM9IiRMVF9ETExPQURFUlMgJHtsdF9kbG9wZW5fZGlyKyRsdF9kbG9wZW5fZGlyL31sb2FkbGlicmFyeS5sYSIKKyAgOzsKK2VzYWMKKworQUNfQ0hFQ0tfTElCKFtkbGRdLCBbZGxkX2xpbmtdLAorCVtBQ19ERUZJTkUoW0hBVkVfRExEXSwgWzFdLAorCQkgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBHTlUgZGxkIGxpYnJhcnkuXSkKKwkJTFRfRExMT0FERVJTPSIkTFRfRExMT0FERVJTICR7bHRfZGxvcGVuX2RpciskbHRfZGxvcGVuX2Rpci99ZGxkX2xpbmsubGEiXSkKK0FDX1NVQlNUKFtMSUJBRERfRExEX0xJTktdKQorCittNF9wYXR0ZXJuX2FsbG93KFteTFRfRExQUkVPUEVOJF0pCitMVF9ETFBSRU9QRU49CitpZiB0ZXN0IC1uICIkTFRfRExMT0FERVJTIgordGhlbgorICBmb3IgbHRfbG9hZGVyIGluICRMVF9ETExPQURFUlM7IGRvCisgICAgTFRfRExQUkVPUEVOPSIkTFRfRExQUkVPUEVOLWRscHJlb3BlbiAkbHRfbG9hZGVyICIKKyAgZG9uZQorICBBQ19ERUZJTkUoW0hBVkVfTElCRExMT0FERVJdLCBbMV0sCisgICAgICAgICAgICBbRGVmaW5lIGlmIGxpYmRsbG9hZGVyIHdpbGwgYmUgYnVpbHQgb24gdGhpcyBwbGF0Zm9ybV0pCitmaQorQUNfU1VCU1QoW0xUX0RMUFJFT1BFTl0pCisKK2RubCBUaGlzIGlzbid0IHVzZWQgYW55bW9yZSwgYnV0IHNldCBpdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK0xJQkFERF9ETD0iJExJQkFERF9ETE9QRU4gJExJQkFERF9TSExfTE9BRCIKK0FDX1NVQlNUKFtMSUJBRERfRExdKQorCitBQ19MQU5HX1BPUAorXSkjIExUX0xJQl9ETExPQUQKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MVERMX0RMTElCXSwgW0xUX0xJQl9ETExPQURdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MVERMX0RMTElCXSwgW10pCisKKworIyBMVF9TWVNfU1lNQk9MX1VTQ09SRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBkb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMgd2l0aCBhbiB1bmRlcnNjb3JlPworQUNfREVGVU4oW0xUX1NZU19TWU1CT0xfVVNDT1JFXSwKK1ttNF9yZXF1aXJlKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10sCisgIFtsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmVdLAorICBbbHRfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCit2b2lkIG5tX3Rlc3RfZnVuYygpe30KK2ludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KK19MVF9FT0YKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBhY19ubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCisgICAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCisgICAgICBpZiBncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIGx0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgOgorICAgICAgICBlbHNlCisJICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGNhdCBjb25mdGVzdC5jID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBdKQorICBzeXNfc3ltYm9sX3VuZGVyc2NvcmU9JGx0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZQorICBBQ19TVUJTVChbc3lzX3N5bWJvbF91bmRlcnNjb3JlXSkKK10pIyBMVF9TWVNfU1lNQk9MX1VTQ09SRQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xURExfU1lNQk9MX1VTQ09SRV0sIFtMVF9TWVNfU1lNQk9MX1VTQ09SRV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xURExfU1lNQk9MX1VTQ09SRV0sIFtdKQorCisKKyMgTFRfRlVOQ19ETFNZTV9VU0NPUkUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9GVU5DX0RMU1lNX1VTQ09SRV0sCitbQUNfUkVRVUlSRShbTFRfU1lTX1NZTUJPTF9VU0NPUkVdKWRubAoraWYgdGVzdCB4IiRsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiID0geHllczsgdGhlbgorICBpZiB0ZXN0IHgiJGxpYmx0ZGxfY3ZfZnVuY19kbG9wZW4iID0geHllcyB8fAorICAgICB0ZXN0IHgiJGxpYmx0ZGxfY3ZfbGliX2RsX2Rsb3BlbiIgPSB4eWVzIDsgdGhlbgorCUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHdlIGhhdmUgdG8gYWRkIGFuIHVuZGVyc2NvcmUgZm9yIGRsc3ltXSwKKwkgIFtsaWJsdGRsX2N2X25lZWRfdXNjb3JlXSwKKwkgIFtsaWJsdGRsX2N2X25lZWRfdXNjb3JlPXVua25vd24KKyAgICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICAgIExJQlM9IiRMSUJTICRMSUJBRERfRExPUEVOIgorCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgW2xpYmx0ZGxfY3ZfbmVlZF91c2NvcmU9bm9dLCBbbGlibHRkbF9jdl9uZWVkX3VzY29yZT15ZXNdLAorCSAgICBbXSwJCQkJIFtsaWJsdGRsX2N2X25lZWRfdXNjb3JlPWNyb3NzXSkKKwkgIExJQlM9IiRzYXZlX0xJQlMiCisJXSkKKyAgZmkKK2ZpCisKK2lmIHRlc3QgeCIkbGlibHRkbF9jdl9uZWVkX3VzY29yZSIgPSB4eWVzOyB0aGVuCisgIEFDX0RFRklORShbTkVFRF9VU0NPUkVdLCBbMV0sCisgICAgW0RlZmluZSBpZiBkbHN5bSgpIHJlcXVpcmVzIGEgbGVhZGluZyB1bmRlcnNjb3JlIGluIHN5bWJvbCBuYW1lcy5dKQorZmkKK10pIyBMVF9GVU5DX0RMU1lNX1VTQ09SRQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xURExfRExTWU1fVVNDT1JFXSwgW0xUX0ZVTkNfRExTWU1fVVNDT1JFXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTFRETF9ETFNZTV9VU0NPUkVdLCBbXSkKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2FjaW5jbHVkZS9sdG9wdGlvbnMubTQgYi9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2x0b3B0aW9ucy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGRmNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2FjaW5jbHVkZS9sdG9wdGlvbnMubTQKQEAgLTAsMCArMSwzNzAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNiBsdG9wdGlvbnMubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVE9QVElPTlNfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKKworCisjIF9MVF9NQU5HTEVfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX01BTkdMRV9PUFRJT05dLAorW1tfTFRfT1BUSU9OX11tNF9icGF0c3Vic3QoJDFfXyQyLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisKKyMgX0xUX1NFVF9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE9QVElPTi1OQU1FIGZvciBtYWNybyBNQUNSTy1OQU1FLCBhbmQgaWYgdGhlcmUgaXMgYQorIyBtYXRjaGluZyBoYW5kbGVyIGRlZmluZWQsIGRpc3BhdGNoIHRvIGl0LiAgT3RoZXIgT1BUSU9OLU5BTUVzIGFyZQorIyBzYXZlZCBhcyBhIGZsYWcuCittNF9kZWZpbmUoW19MVF9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSkpZG5sCittNF9pZmRlZihfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgICAgICBfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgIFttNF93YXJuaW5nKFtVbmtub3duICQxIG9wdGlvbiBgJDInXSldKVtdZG5sCitdKQorCisKKyMgX0xUX0lGX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK200X2RlZmluZShbX0xUX0lGX09QVElPTl0sCitbbTRfaWZkZWYoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSksIFskM10sIFskNF0pXSkKKworCisjIF9MVF9VTkxFU1NfT1BUSU9OUyhNQUNSTy1OQU1FLCBPUFRJT04tTElTVCwgSUYtTk9ULVNFVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLU5PVC1TRVQgdW5sZXNzIGFsbCBvcHRpb25zIGluIE9QVElPTi1MSVNUIGZvciBNQUNSTy1OQU1FCisjIGFyZSBzZXQuCittNF9kZWZpbmUoW19MVF9VTkxFU1NfT1BUSU9OU10sCitbbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCisJICAgIFttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKSwKKwkJICAgICAgW200X2RlZmluZShbJDBfZm91bmRdKV0pXSlbXWRubAorbTRfaWZkZWYoWyQwX2ZvdW5kXSwgW200X3VuZGVmaW5lKFskMF9mb3VuZF0pXSwgWyQzCitdKVtdZG5sCitdKQorCisKKyMgX0xUX1NFVF9PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTi1MSVNUIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgTGlidG9vbCBvcHRpb25zIGFzc29jaWF0ZWQKKyMgd2l0aCBNQUNSTy1OQU1FLiAgSWYgYW55IE9QVElPTiBoYXMgYSBtYXRjaGluZyBoYW5kbGVyIGRlY2xhcmVkIHdpdGgKKyMgTFRfT1BUSU9OX0RFRklORSwgZGlzcGF0Y2ggdG8gdGhhdCBtYWNybzsgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0CisjIHRoZSB1bmtub3duIG9wdGlvbiBhbmQgZXhpdC4KK200X2RlZnVuKFtfTFRfU0VUX09QVElPTlNdLAorWyMgU2V0IG9wdGlvbnMKK200X2ZvcmVhY2goW19MVF9PcHRpb25dLCBtNF9zcGxpdChtNF9ub3JtYWxpemUoWyQyXSkpLAorICAgIFtfTFRfU0VUX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKV0pCisKK200X2lmKFskMV0sW0xUX0lOSVRdLFsKKyAgZG5sCisgIGRubCBTaW1wbHkgc2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKGkuZSBvZmYpIGlmIGJvb2xlYW4gb3B0aW9ucyB3ZXJlIG5vdAorICBkbmwgc3BlY2lmaWVkOgorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49bm8KKyAgXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0sIFtlbmFibGVfd2luMzJfZGxsPW5vCisgIF0pCisgIGRubAorICBkbmwgSWYgbm8gcmVmZXJlbmNlIHdhcyBtYWRlIHRvIHZhcmlvdXMgcGFpcnMgb2Ygb3Bwb3Npbmcgb3B0aW9ucywgdGhlbgorICBkbmwgd2UgcnVuIHRoZSBkZWZhdWx0IG1vZGUgaGFuZGxlciBmb3IgdGhlIHBhaXIuICBGb3IgZXhhbXBsZSwgaWYgbmVpdGhlcgorICBkbmwgYHNoYXJlZCcgbm9yIGBkaXNhYmxlLXNoYXJlZCcgd2FzIHBhc3NlZCwgd2UgZW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZAorICBkbmwgYXJjaGl2ZXMgYnkgZGVmYXVsdDoKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3NoYXJlZCBkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRF0pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtzdGF0aWMgZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUNdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbcGljLW9ubHkgbm8tcGljXSwgW19MVF9XSVRIX1BJQ10pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGwgZGlzYWJsZS1mYXN0LWluc3RhbGxdLAorICAJCSAgIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pCisgIF0pCitdKSMgX0xUX1NFVF9PUFRJT05TCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWNyb3MgdG8gaGFuZGxlIExUX0lOSVQgb3B0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIF9MVF9NQU5HTEVfREVGVU4oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9NQU5HTEVfREVGVU5dLAorW1tfTFRfT1BUSU9OX0RFRlVOX11tNF9icGF0c3Vic3QobTRfdG91cHBlcihbJDFfXyQyXSksIFtbXkEtWjAtOV9dXSwgW19dKV0pCisKKworIyBMVF9PUFRJT05fREVGSU5FKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBDT0RFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtMVF9PUFRJT05fREVGSU5FXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwgWyQzXSlbXWRubAorXSkjIExUX09QVElPTl9ERUZJTkUKKworCisjIGRsb3BlbgorIyAtLS0tLS0KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49eWVzCitdKQorCitBVV9ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rsb3Blbl0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgZGxvcGVuJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwgW10pCisKKworIyB3aW4zMi1kbGwKKyMgLS0tLS0tLS0tCisjIERlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncy4KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwKK1tlbmFibGVfd2luMzJfZGxsPXllcworCitjYXNlICRob3N0IGluCisqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLWNlZ2NjKikKKyAgQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQorICA7OworZXNhYworCit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCitfTFRfREVDTChbXSwgW0FTXSwgICAgICBbMF0sIFtBc3NlbWJsZXIgcHJvZ3JhbV0pZG5sCisKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK19MVF9ERUNMKFtdLCBbRExMVE9PTF0sIFswXSwgW0RMTCBjcmVhdGlvbiBwcm9ncmFtXSlkbmwKKwordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAorX0xUX0RFQ0woW10sIFtPQkpEVU1QXSwgWzBdLCBbT2JqZWN0IGR1bXBlciBwcm9ncmFtXSlkbmwKK10pIyB3aW4zMi1kbGwKKworQVVfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFt3aW4zMi1kbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UKK3B1dCB0aGUgYHdpbjMyLWRsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sIFtdKQorCisKKyMgX0xUX0VOQUJMRV9TSEFSRUQoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcsIGFuZCBzdXBwb3J0cyB0aGUgYHNoYXJlZCcgYW5kCisjIGBkaXNhYmxlLXNoYXJlZCcgTFRfSU5JVCBvcHRpb25zLgorIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCittNF9kZWZpbmUoW19MVF9FTkFCTEVfU0hBUkVEXSwKK1ttNF9kZWZpbmUoW19MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCitBQ19BUkdfRU5BQkxFKFtzaGFyZWRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc2hhcmVkQDw6QD1QS0dTQDo+QF0sCisJW2J1aWxkIHNoYXJlZCBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zaGFyZWQ9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3NoYXJlZD1dX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVCkKKworICAgIF9MVF9ERUNMKFtidWlsZF9saWJ0b29sX2xpYnNdLCBbZW5hYmxlX3NoYXJlZF0sIFswXSwKKwlbV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCitdKSMgX0xUX0VOQUJMRV9TSEFSRUQKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtzaGFyZWRdLCBbX0xUX0VOQUJMRV9TSEFSRUQoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1zaGFyZWRdLCBbX0xUX0VOQUJMRV9TSEFSRUQoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FDX0RFRlVOKFtBQ19FTkFCTEVfU0hBUkVEXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW3NoYXJlZF0pCitdKQorCitBQ19ERUZVTihbQUNfRElTQUJMRV9TSEFSRURdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtc2hhcmVkXSkKK10pCisKK0FVX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgW0FDX0VOQUJMRV9TSEFSRUQoJEApXSkKK0FVX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtBQ19ESVNBQkxFX1NIQVJFRCgkQCldKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9TSEFSRURdLCBbXSkKKworCisKKyMgX0xUX0VOQUJMRV9TVEFUSUMoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgc3RhdGljJyBhbmQKKyMgYGRpc2FibGUtc3RhdGljJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9TVEFUSUNdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW3N0YXRpY10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zdGF0aWNAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc3RhdGljIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9zdGF0aWM9XV9MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFQpCisKKyAgICBfTFRfREVDTChbYnVpbGRfb2xkX2xpYnNdLCBbZW5hYmxlX3N0YXRpY10sIFswXSwKKwlbV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCitdKSMgX0xUX0VOQUJMRV9TVEFUSUMKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtzdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUMoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUMoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FDX0RFRlVOKFtBQ19FTkFCTEVfU1RBVElDXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW3N0YXRpY10pCitdKQorCitBQ19ERUZVTihbQUNfRElTQUJMRV9TVEFUSUNdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtc3RhdGljXSkKK10pCisKK0FVX0RFRlVOKFtBTV9FTkFCTEVfU1RBVElDXSwgW0FDX0VOQUJMRV9TVEFUSUMoJEApXSkKK0FVX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtBQ19ESVNBQkxFX1NUQVRJQygkQCldKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbXSkKKworCisKKyMgX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgZmFzdC1pbnN0YWxsJworIyBhbmQgYGRpc2FibGUtZmFzdC1pbnN0YWxsJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW2Zhc3QtaW5zdGFsbF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1mYXN0LWluc3RhbGxAPDpAPVBLR1NAOj5AXSwKKyAgICBbb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9mYXN0X2luc3RhbGw9XV9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpCisKK19MVF9ERUNMKFtmYXN0X2luc3RhbGxdLCBbZW5hYmxlX2Zhc3RfaW5zdGFsbF0sIFswXSwKKwkgW1doZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbl0pZG5sCitdKSMgX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGxdLCBbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1mYXN0LWluc3RhbGxdLCBbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FVX0RFRlVOKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW2Zhc3QtaW5zdGFsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdSBwdXQKK3RoZSBgZmFzdC1pbnN0YWxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitBVV9ERUZVTihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtZmFzdC1pbnN0YWxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91IHB1dAordGhlIGBkaXNhYmxlLWZhc3QtaW5zdGFsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwgW10pCisKKworIyBfTFRfV0lUSF9QSUMoW01PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0td2l0aC1waWMgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBwaWMtb25seScgYW5kIGBuby1waWMnCisjIExUX0lOSVQgb3B0aW9ucy4KKyMgTU9ERSBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBib3RoJy4KK200X2RlZmluZShbX0xUX1dJVEhfUElDXSwKK1tBQ19BUkdfV0lUSChbcGljXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1waWNdLAorCVt0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBAPDpAZGVmYXVsdD11c2UgYm90aEA6PkBdKV0sCisgICAgW3BpY19tb2RlPSIkd2l0aHZhbCJdLAorICAgIFtwaWNfbW9kZT1kZWZhdWx0XSkKKwordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1tNF9kZWZhdWx0KFskMV0sIFtkZWZhdWx0XSkKKworX0xUX0RFQ0woW10sIFtwaWNfbW9kZV0sIFswXSwgW1doYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkXSlkbmwKK10pIyBfTFRfV0lUSF9QSUMKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtwaWMtb25seV0sIFtfTFRfV0lUSF9QSUMoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbbm8tcGljXSwgW19MVF9XSVRIX1BJQyhbbm9dKV0pCisKKyMgT2xkIG5hbWU6CitBVV9ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtwaWMtb25seV0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgcGljLW9ubHknIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwgW10pCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBMVERMX0lOSVQgT3B0aW9ucyAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbbm9ucmVjdXJzaXZlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbbm9ucmVjdXJzaXZlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW3JlY3Vyc2l2ZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW3JlY3Vyc2l2ZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtzdWJwcm9qZWN0XSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbc3VicHJvamVjdF0pXSkKKworbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbaW5zdGFsbGFibGVdLAorCQkgW200X2RlZmluZShbX0xURExfVFlQRV0sIFtpbnN0YWxsYWJsZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtjb252ZW5pZW5jZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW2NvbnZlbmllbmNlXSldKQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2x0c3VnYXIubTQgYi9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2x0c3VnYXIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhOTM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9hY2luY2x1ZGUvbHRzdWdhci5tNApAQCAtMCwwICsxLDEyNSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGx0c3VnYXIubTQgLS0gbGlidG9vbCBtNCBiYXNlIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAtKi1BdXRvY29uZi0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNiBsdHN1Z2FyLm00CisKKyMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCitBQ19ERUZVTihbTFRTVUdBUl9WRVJTSU9OXSwgW200X2lmKFswLjFdKV0pCisKKworIyBsdF9qb2luKFNFUCwgQVJHMSwgW0FSRzIuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIEFSRzFTRVBBUkcyLi4uU0VQQVJHbiwgb21pdHRpbmcgW10gYXJndW1lbnRzIGFuZCB0aGVpcgorIyBhc3NvY2lhdGVkIHNlcGFyYXRvci4KKyMgTmVlZGVkIHVudGlsIHdlIGNhbiByZWx5IG9uIG00X2pvaW4gZnJvbSBBdXRvY29uZiAyLjYyLCBzaW5jZSBhbGwgZWFybGllcgorIyB2ZXJzaW9ucyBpbiBtNHN1Z2FyIGhhZCBidWdzLgorbTRfZGVmaW5lKFtsdF9qb2luXSwKK1ttNF9pZihbJCNdLCBbMV0sIFtdLAorICAgICAgIFskI10sIFsyXSwgW1skMl1dLAorICAgICAgIFttNF9pZihbJDJdLCBbXSwgW10sIFtbJDJdX10pJDAoWyQxXSwgbTRfc2hpZnQobTRfc2hpZnQoJEApKSldKV0pCittNF9kZWZpbmUoW19sdF9qb2luXSwKK1ttNF9pZihbJCMkMl0sIFsyXSwgW10sCisgICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMSQyXV0pJDAoWyQxXSwgbTRfc2hpZnQobTRfc2hpZnQoJEApKSldKV0pCisKKworIyBsdF9jYXIoTElTVCkKKyMgbHRfY2RyKExJU1QpCisjIC0tLS0tLS0tLS0tLQorIyBNYW5pcHVsYXRlIG00IGxpc3RzLgorIyBUaGVzZSBtYWNyb3MgYXJlIG5lY2Vzc2FyeSBhcyBsb25nIGFzIHdpbGwgc3RpbGwgbmVlZCB0byBzdXBwb3J0CisjIEF1dG9jb25mLTIuNTkgd2hpY2ggcXVvdGVzIGRpZmZlcmVudGx5LgorbTRfZGVmaW5lKFtsdF9jYXJdLCBbWyQxXV0pCittNF9kZWZpbmUoW2x0X2Nkcl0sCitbbTRfaWYoWyQjXSwgMCwgW200X2ZhdGFsKFskMDogY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50c10pXSwKKyAgICAgICBbJCNdLCAxLCBbXSwKKyAgICAgICBbbTRfZHF1b3RlKG00X3NoaWZ0KCRAKSldKV0pCittNF9kZWZpbmUoW2x0X3VucXVvdGVdLCAkMSkKKworCisjIGx0X2FwcGVuZChNQUNSTy1OQU1FLCBTVFJJTkcsIFtTRVBBUkFUT1JdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVkZWZpbmUgTUFDUk8tTkFNRSB0byBob2xkIGl0cyBmb3JtZXIgY29udGVudCBwbHVzIGBTRVBBUkFUT1InYFNUUklORycuCisjIE5vdGUgdGhhdCBuZWl0aGVyIFNFUEFSQVRPUiBub3IgU1RSSU5HIGFyZSBleHBhbmRlZDsgdGhleSBhcmUgYXBwZW5kZWQKKyMgdG8gTUFDUk8tTkFNRSBhcyBpcyAobGVhdmluZyB0aGUgZXhwYW5zaW9uIGZvciB3aGVuIE1BQ1JPLU5BTUUgaXMgaW52b2tlZCkuCisjIE5vIFNFUEFSQVRPUiBpcyBvdXRwdXQgaWYgTUFDUk8tTkFNRSB3YXMgcHJldmlvdXNseSB1bmRlZmluZWQgKGRpZmZlcmVudAorIyB0aGFuIGRlZmluZWQgYW5kIGVtcHR5KS4KKyMKKyMgVGhpcyBtYWNybyBpcyBuZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gQXV0b2NvbmYgMi42Miwgc2luY2UgZWFybGllcgorIyB2ZXJzaW9ucyBvZiBtNHN1Z2FyIG1pc3Rha2VubHkgZXhwYW5kZWQgU0VQQVJBVE9SIGJ1dCBub3QgU1RSSU5HLgorbTRfZGVmaW5lKFtsdF9hcHBlbmRdLAorW200X2RlZmluZShbJDFdLAorCSAgIG00X2lmZGVmKFskMV0sIFttNF9kZWZuKFskMV0pWyQzXV0pWyQyXSldKQorCisKKworIyBsdF9jb21iaW5lKFNFUCwgUFJFRklYLUxJU1QsIElORklYLCBTVUZGSVgxLCBbU1VGRklYMi4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvZHVjZSBhIFNFUCBkZWxpbWl0ZWQgbGlzdCBvZiBhbGwgcGFpcmVkIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBvZgorIyBQUkVGSVgtTElTVCB3aXRoIFNVRkZJWDEgdGhyb3VnaCBTVUZGSVhuLiAgRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0CisjIGhhcyB0aGUgZm9ybSBQUkVGSVhtSU5GSVhTVUZGSVhuLgorIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfY29tYmluZSBhZGRlZCBpbiBBdXRvY29uZiAyLjYyLgorbTRfZGVmaW5lKFtsdF9jb21iaW5lXSwKK1ttNF9pZihtNF9ldmFsKFskIyA+IDNdKSwgWzFdLAorICAgICAgIFttNF9wdXNoZGVmKFtfTHRfc2VwXSwgW200X2RlZmluZShbX0x0X3NlcF0sIG00X2RlZm4oW2x0X2Nhcl0pKV0pXV1kbmwKK1tbbTRfZm9yZWFjaChbX0x0X3ByZWZpeF0sIFskMl0sCisJICAgICBbbTRfZm9yZWFjaChbX0x0X3N1ZmZpeF0sCisJCV1tNF9kcXVvdGUobTRfZHF1b3RlKG00X3NoaWZ0KG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpKSlbLAorCVtfTHRfc2VwKFskMV0pW11tNF9kZWZuKFtfTHRfcHJlZml4XSlbJDNdbTRfZGVmbihbX0x0X3N1ZmZpeF0pXSldKV0pXSkKKworCisjIGx0X2lmX2FwcGVuZF91bmlxKE1BQ1JPLU5BTUUsIFZBUk5BTUUsIFtTRVBBUkFUT1JdLCBbVU5JUV0sIFtOT1QtVU5JUV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElmZiBNQUNSTy1OQU1FIGRvZXMgbm90IHlldCBjb250YWluIFZBUk5BTUUsIHRoZW4gYXBwZW5kIGl0IChkZWxpbWl0ZWQKKyMgYnkgU0VQQVJBVE9SIGlmIHN1cHBsaWVkKSBhbmQgZXhwYW5kIFVOSVEsIGVsc2UgTk9ULVVOSVEuCittNF9kZWZpbmUoW2x0X2lmX2FwcGVuZF91bmlxXSwKK1ttNF9pZmRlZihbJDFdLAorCSAgW200X2lmKG00X2luZGV4KFskM11tNF9kZWZuKFskMV0pWyQzXSwgWyQzJDIkM10pLCBbLTFdLAorCQkgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSwKKwkJIFskNV0pXSwKKwkgIFtsdF9hcHBlbmQoWyQxXSwgWyQyXSwgWyQzXSkkNF0pXSkKKworCisjIGx0X2RpY3RfYWRkKERJQ1QsIEtFWSwgVkFMVUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfYWRkXSwKK1ttNF9kZWZpbmUoWyQxKCQyKV0sIFskM10pXSkKKworCisjIGx0X2RpY3RfYWRkX3N1YmtleShESUNULCBLRVksIFNVQktFWSwgVkFMVUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfYWRkX3N1YmtleV0sCitbbTRfZGVmaW5lKFskMSgkMjokMyldLCBbJDRdKV0pCisKKworIyBsdF9kaWN0X2ZldGNoKERJQ1QsIEtFWSwgW1NVQktFWV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9mZXRjaF0sCitbbTRfaWZ2YWwoWyQzXSwKKwltNF9pZmRlZihbJDEoJDI6JDMpXSwgW200X2RlZm4oWyQxKCQyOiQzKV0pXSksCisgICAgbTRfaWZkZWYoWyQxKCQyKV0sIFttNF9kZWZuKFskMSgkMildKV0pKV0pCisKKworIyBsdF9pZl9kaWN0X2ZldGNoKERJQ1QsIEtFWSwgW1NVQktFWV0sIFZBTFVFLCBJRi1UUlVFLCBbSUYtRkFMU0VdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9pZl9kaWN0X2ZldGNoXSwKK1ttNF9pZihsdF9kaWN0X2ZldGNoKFskMV0sIFskMl0sIFskM10pLCBbJDRdLAorCVskNV0sCisgICAgWyQ2XSldKQorCisKKyMgbHRfZGljdF9maWx0ZXIoRElDVCwgW1NVQktFWV0sIFZBTFVFLCBbU0VQQVJBVE9SXSwgS0VZLCBbLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9maWx0ZXJdLAorW200X2lmKFskNV0sIFtdLCBbXSwKKyAgW2x0X2pvaW4obTRfcXVvdGUobTRfZGVmYXVsdChbJDRdLCBbWywgXV0pKSwKKyAgICAgICAgICAgbHRfdW5xdW90ZShtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfZm9yZWFjaChfTHRfa2V5LCBsdF9jYXIoW200X3NoaWZ0big0LCAkQCldKSwKKwkJICAgICAgW2x0X2lmX2RpY3RfZmV0Y2goWyQxXSwgX0x0X2tleSwgWyQyXSwgWyQzXSwgW19MdF9rZXkgXSldKSkpKSldKVtdZG5sCitdKQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2x0dmVyc2lvbi5tNCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9hY2luY2x1ZGUvbHR2ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYTgzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2x0dmVyc2lvbi5tNApAQCAtMCwwICsxLDI1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbHR2ZXJzaW9uLm00IC0tIHZlcnNpb24gbnVtYmVycwkJCS0qLSBBdXRvY29uZiAtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBHZW5lcmF0ZWQgZnJvbSBsdHZlcnNpb24uaW4uCisKKyMgc2VyaWFsIDMwMTIgbHR2ZXJzaW9uLm00CisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sCisKK200X2RlZmluZShbTFRfUEFDS0FHRV9WRVJTSU9OXSwgWzIuMi42XSkKK200X2RlZmluZShbTFRfUEFDS0FHRV9SRVZJU0lPTl0sIFsxLjMwMTJdKQorCitBQ19ERUZVTihbTFRWRVJTSU9OX1ZFUlNJT05dLAorW21hY3JvX3ZlcnNpb249JzIuMi42JworbWFjcm9fcmV2aXNpb249JzEuMzAxMicKK19MVF9ERUNMKCwgbWFjcm9fdmVyc2lvbiwgMCwgW1doaWNoIHJlbGVhc2Ugb2YgbGlidG9vbC5tNCB3YXMgdXNlZD9dKQorX0xUX0RFQ0woLCBtYWNyb19yZXZpc2lvbiwgMCkKK10pCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9hY2luY2x1ZGUvbHR+b2Jzb2xldGUubTQgYi9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2x0fm9ic29sZXRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMmFjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvYWNpbmNsdWRlL2x0fm9ic29sZXRlLm00CkBAIC0wLDAgKzEsOTMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBsdH5vYnNvbGV0ZS5tNCAtLSBhY2xvY2FsIHNhdGlzZnlpbmcgb2Jzb2xldGUgZGVmaW5pdGlvbnMuICAgIC0qLUF1dG9jb25mLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNC4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA0IGx0fm9ic29sZXRlLm00CisKKyMgVGhlc2UgZXhpc3QgZW50aXJlbHkgdG8gZm9vbCBhY2xvY2FsIHdoZW4gYm9vdHN0cmFwcGluZyBsaWJ0b29sLgorIworIyBJbiB0aGUgcGFzdCBsaWJ0b29sLm00IGhhcyBwcm92aWRlZCBtYWNyb3MgdmlhIEFDX0RFRlVOIChvciBBVV9ERUZVTikKKyMgd2hpY2ggaGF2ZSBsYXRlciBiZWVuIGNoYW5nZWQgdG8gbTRfZGVmaW5lIGFzIHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlCisjIGV4cG9ydGVkIEFQSSwgb3IgbW92ZWQgdG8gQXV0b2NvbmYgb3IgQXV0b21ha2Ugd2hlcmUgdGhleSBiZWxvbmcuCisjCisjIFRoZSB0cm91YmxlIGlzLCBhY2xvY2FsIGlzIGEgYml0IHRoaWNrLiAgSXQnbGwgc2VlIHRoZSBvbGQgQUNfREVGVU4KKyMgaW4gL3Vzci9zaGFyZS9hY2xvY2FsL2xpYnRvb2wubTQgYW5kIHJlbWVtYmVyIGl0LCB0aGVuIHdoZW4gaXQgc2VlcyB1cworIyB1c2luZyBhIG1hY3JvIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBvdXIgbG9jYWwgbTQvbGlidG9vbC5tNCBpdCdsbAorIyBwdWxsIHRoZSBvbGQgbGlidG9vbC5tNCBpbiAoaXQgZG9lc24ndCBzZWUgb3VyIHNoaW55IG5ldyBtNF9kZWZpbmUKKyMgYW5kIGRvZXNuJ3Qga25vdyBhYm91dCBBdXRvY29uZiBtYWNyb3MgYXQgYWxsLikKKyMKKyMgU28gd2UgcHJvdmlkZSB0aGlzIGZpbGUsIHdoaWNoIGhhcyBhIHNpbGx5IGZpbGVuYW1lIHNvIGl0J3MgYWx3YXlzCisjIGluY2x1ZGVkIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgcHJvdmlkZXMgYWNsb2NhbCB3aXRoIHRoZQorIyBBQ19ERUZVTnMgaXQgd2FudHMsIGJ1dCB3aGVuIG00IHByb2Nlc3NlcyBpdCwgaXQgZG9lc24ndCBkbyBhbnl0aGluZworIyBiZWNhdXNlIHRob3NlIG1hY3JvcyBhbHJlYWR5IGV4aXN0LCBvciB3aWxsIGJlIG92ZXJ3cml0dGVuIGxhdGVyLgorIyBXZSB1c2UgQUNfREVGVU4gb3ZlciBBVV9ERUZVTiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFjbG9jYWwtMS42LiAKKyMKKyMgQW55dGltZSB3ZSB3aXRoZHJhdyBhbiBBQ19ERUZVTiBvciBBVV9ERUZVTiwgcmVtZW1iZXIgdG8gYWRkIGl0IGhlcmUuCisjIFllcywgdGhhdCBtZWFucyBldmVyeSBuYW1lIG9uY2UgdGFrZW4gd2lsbCBuZWVkIHRvIHJlbWFpbiBoZXJlIHVudGlsCisjIHdlIGdpdmUgdXAgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjcsIGF0IHdoaWNoIHBvaW50CisjIHdlIG5lZWQgdG8ga2VlcCBvbmx5IHRob3NlIG5hbWVzIHdoaWNoIHdlIHN0aWxsIHJlZmVyIHRvLgorCisjIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgorQUNfREVGVU4oW0xUT0JTT0xFVEVfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKKworbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0pXSkKK200X2lmbmRlZihbQUNfUFJPR19FR1JFUF0sCQlbQUNfREVGVU4oW0FDX1BST0dfRUdSRVBdKV0pCittNF9pZm5kZWYoW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSwJW0FDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1NIRUxMX0lOSVRdLAkJW0FDX0RFRlVOKFtfTFRfQUNfU0hFTExfSU5JVF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0sCVtBQ19ERUZVTihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0pXSkKK200X2lmbmRlZihbX0xUX1BST0dfTFRNQUlOXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfTFRNQUlOXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVEFHVkFSXSwJCVtBQ19ERUZVTihbX0xUX0FDX1RBR1ZBUl0pXSkKK200X2lmbmRlZihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0sCVtBQ19ERUZVTihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0pXSkKK200X2lmbmRlZihbQUNfTFRETF9QUkVPUEVOXSwJCVtBQ19ERUZVTihbQUNfTFRETF9QUkVPUEVOXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSwJW0FDX0RFRlVOKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTE9DS10sCQlbQUNfREVGVU4oW19MVF9BQ19MT0NLXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19PTERfQVJDSElWRV0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfT0xEX0FSQ0hJVkVdKV0pCittNF9pZm5kZWYoW19MVF9BQ19UUllfRExPUEVOX1NFTEZdLAlbQUNfREVGVU4oW19MVF9BQ19UUllfRExPUEVOX1NFTEZdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfT0JKRElSXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xURExfT0JKRElSXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEhdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSldKQorbTRfaWZuZGVmKFtBQ19QQVRIX01BR0lDXSwJCVtBQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10pXSkKK200X2lmbmRlZihbQUNfUFJPR19MRF9HTlVdLAkJW0FDX0RFRlVOKFtBQ19QUk9HX0xEX0dOVV0pXSkKK200X2lmbmRlZihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10sCVtBQ19ERUZVTihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pXSkKK200X2lmbmRlZihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdLAlbQUNfREVGVU4oW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEldKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSldKQorbTRfaWZuZGVmKFtMVF9BQ19QUk9HX0VHUkVQXSwJCVtBQ19ERUZVTihbTFRfQUNfUFJPR19FR1JFUF0pXSkKK200X2lmbmRlZihbTFRfQUNfUFJPR19TRURdLAkJW0FDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0pXSkKK200X2lmbmRlZihbX0xUX0NDX0JBU0VOQU1FXSwJCVtBQ19ERUZVTihbX0xUX0NDX0JBU0VOQU1FXSldKQorbTRfaWZuZGVmKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAlbQUNfREVGVU4oW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0pXSkKK200X2lmbmRlZihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sCVtBQ19ERUZVTihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0pXSkKK200X2lmbmRlZihbX0FDX1BST0dfTElCVE9PTF0sCQlbQUNfREVGVU4oW19BQ19QUk9HX0xJQlRPT0xdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU0VUVVBdLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfQ0hFQ0tfRExGQ05dLAkJW0FDX0RFRlVOKFtfTFRfQUNfQ0hFQ0tfRExGQ05dKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUl0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RBR0NPTkZJR10sCQlbQUNfREVGVU4oW19MVF9BQ19UQUdDT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwJW0FDX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzddLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl0sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9SQ10sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl9DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0NPTkZJR10sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfRklMRV9MVERMTF9DXSwJW0FDX0RFRlVOKFtfTFRfQUNfRklMRV9MVERMTF9DXSldKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2FuZHJvaWQtY29uZmlndXJlLnNoIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2FuZHJvaWQtY29uZmlndXJlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk0ZWY3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvYW5kcm9pZC1jb25maWd1cmUuc2gKQEAgLTAsMCArMSw1NTMgQEAKKyMvYmluL3NoCisjCisjIHRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gcmVidWlsZCBTREwgZnJvbSBzb3VyY2VzIGluIHRoZSBjdXJyZW50CisjIGRpcmVjdG9yeS4gSXQgZGVwZW5kcyBvbiB0aGUgQW5kcm9pZCBlbXVsYXRvciBidWlsZCBzY3JpcHRzCisjIHRoYXQgc2hvdWxkIG5vcm1hbGx5IGJlIGxvY2F0ZWQgaW4gLi4vZW11bGF0b3IvYW5kcm9pZC9idWlsZAorIyBidXQgeW91IGNhbiBhbHNvIHVzZSBBTkRST0lEX1FFTVVfUEFUSCBpbiB5b3VyIGVudmlyb25tZW50CisjIHRvIHBvaW50IHRvIHRoZSB0b3Agb2YgdGhlIEFuZHJvaWQgZW11bGF0b3Igc291cmNlcworIworIworCisjIGZpcnN0LCBsZXQncyBzZWUgd2hpY2ggc3lzdGVtIHdlJ3JlIHJ1bm5pbmcgdGhpcyBvbgorY2QgYGRpcm5hbWUgJDBgCisKKyMgdHJ5IHRvIGZpbmQgdGhlIEFuZHJvaWQgYnVpbGQgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkKK2lmIFsgLXogIiRBTkRST0lEX1FFTVVfUEFUSCIgXSA7IHRoZW4KKyAgICBpZiBbIC1mIC4uLy4uL2FuZHJvaWQvYnVpbGQvY29tbW9uLnNoIF0gOyB0aGVuCisgICAgICAgIEFORFJPSURfUUVNVV9QQVRIPS4uLy4uCisgICAgZWxzZQorICAgICAgICBlY2hvICJZb3UgbXVzdCBkZWZpbmUgQU5EUk9JRF9RRU1VX1BBVEggaW4geW91ciBlbnZpcm9ubWVudCB0byBwb2ludCIKKyAgICAgICAgZWNobyAidG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBBbmRyb2lkIGVtdWxhdG9yJ3Mgc291cmNlcy4iCisgICAgICAgIGV4aXQgMQorICAgIGZpCitmaQorCitpZiBbICEgLWQgJEFORFJPSURfUUVNVV9QQVRIIF0gOyB0aGVuCisgICAgZWNobyAiWW91ciBBTkRST0lEX1FFTVVfUEFUSCBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIGRpcmVjdG9yeS4iCisgICAgZXhpdCAxCitmaQorCitpZiBbICEgLWYgJEFORFJPSURfUUVNVV9QQVRIL2FuZHJvaWQvYnVpbGQvY29tbW9uLnNoIF0gOyB0aGVuCisgICAgZWNobyAiWW91ciBBTkRST0lEX1FFTVVfUEFUSCBkb2VzIG5vdCBwb2ludCB0byBhIGRpcmVjdG9yeSB0aGF0IgorICAgIGVjaG8gImNvbnRhaW5zIHRoZSBBbmRyb2lkIGVtdWxhdG9yIGJ1aWxkIHNjcmlwdHMuIgorICAgIGV4aXQgMQorZmkKKworIyBzb3VyY2UgY29tbW9uIGZ1bmN0aW9ucyBkZWZpbml0aW9ucworLiAkQU5EUk9JRF9RRU1VX1BBVEgvYW5kcm9pZC9idWlsZC9jb21tb24uc2gKKworIyBQYXJzZSBvcHRpb25zCitPUFRJT05fVFJZXzY0PW5vCitPUFRJT05fSEVMUD1ubworT1BUSU9OX1RBUkdFVFM9CitPUFRJT05fRk9SQ0VfQVVUT0RFVEVDVD1ubworT1BUSU9OX05PX1RJR0VSPW5vCisKK2lmIFsgLXogIiRDQyIgXSA7IHRoZW4KKyAgQ0M9Z2NjCitmaQorCitmb3Igb3B0IGRvCisgIG9wdGFyZz1gZXhwciAieCRvcHQiIDogJ3hbXj1dKj1cKC4qXCknYAorICBjYXNlICIkb3B0IiBpbgorICAtLWhlbHB8LWh8LVw/KSBPUFRJT05fSEVMUD15ZXMKKyAgOzsKKyAgLS12ZXJib3NlKQorICAgIGlmIFsgIiRWRVJCT1NFIiA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgICAgIFZFUkJPU0UyPXllcworICAgIGVsc2UKKyAgICAgICAgVkVSQk9TRT15ZXMKKyAgICBmaQorICA7OworICAtLWNjPSopIENDPSIkb3B0YXJnIiA7IEhPU1RDQz0kQ0MKKyAgOzsKKyAgLS10cnktNjQpIE9QVElPTl9UUllfNjQ9eWVzCisgIDs7CisgIC0tcHJlZml4PSopIE9QVElPTl9UQVJHRVRTPSIkT1BUSU9OX1RBUkdFVFMgJG9wdGFyZyIKKyAgOzsKKyAgLS1mb3JjZS1hdXRvZGV0ZWN0KSBPUFRJT05fRk9SQ0VfQVVUT0RFVEVDVD15ZXMKKyAgOzsKKyAgLS1uby10aWdlcikgT1BUSU9OX05PX1RJR0VSPXllcworICA7OworICAqKQorICAgIGVjaG8gInVua25vd24gb3B0aW9uICckb3B0JywgdXNlIC0taGVscCIKKyAgICBleGl0IDEKKyAgZXNhYworZG9uZQorCisjIFByaW50IHRoZSBoZWxwIG1lc3NhZ2UKKyMKK2lmIFsgIiRPUFRJT05fSEVMUCIgPSAieWVzIiBdIDsgdGhlbgorICAgIGNhdCA8PCBFT0YKKworVXNhZ2U6IHJlYnVpbGQuc2ggW29wdGlvbnNdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorRU9GCisgICAgZWNobyAiU3RhbmRhcmQgb3B0aW9uczoiCisgICAgZWNobyAiICAtLWhlbHAgICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIgorICAgIGVjaG8gIiAgLS1jYz1QQVRIICAgICAgICAgICAgICAgIHNwZWNpZnkgQyBjb21waWxlciBbJENDXSIKKyAgICBlY2hvICIgIC0tdHJ5LTY0ICAgICAgICAgICAgICAgICB0cnkgdG8gYnVpbGQgYSA2NC1iaXQgZXhlY3V0YWJsZSAobWF5IGNyYXNoKSIKKyAgICBlY2hvICIgIC0tdmVyYm9zZSAgICAgICAgICAgICAgICB2ZXJib3NlIGNvbmZpZ3VyYXRpb24iCisgICAgZWNobyAiICAtLWZvcmNlLWF1dG9kZXRlY3QgICAgICAgZm9yY2UgZmVhdHVyZSBhdXRvLWRldGVjdGlvbiIKKyAgICBlY2hvICIgIC0tbm8tdGlnZXIgICAgICAgICAgICAgICBkbyBub3QgZ2VuZXJhdGUgVGlnZXItY29tcGF0aWJsZSBiaW5hcmllcyAoT1MgWCBvbmx5KSIKKyAgICBlY2hvICIiCisgICAgZXhpdCAxCitmaQorCisjIHdlIG9ubHkgc3VwcG9ydCBnZW5lcmF0aW5nIDMyLWJpdCBiaW5hcmlzIG9uIDY0LWJpdCBzeXN0ZW1zLgorIyBBbmQgd2UgbWF5IG5lZWQgdG8gYWRkIGEgLVdhLC0tMzIgdG8gQ0ZMQUdTIHRvIGxldCB0aGUgYXNzZW1ibGVyCisjIGdlbmVyYXRlIDMyLWJpdCBiaW5hcmllcyBvbiBMaW51eCB4ODZfNjQuCisjCitpZiBbICIkT1BUSU9OX1RSWV82NCIgIT0gInllcyIgXSA7IHRoZW4KKyAgICBmb3JjZV8zMmJpdF9iaW5hcmllcworZmkKKworIyBkZWZhdWx0IHRhcmdldAoraWYgWyAteiAiJE9QVElPTl9UQVJHRVRTIiBdIDsgdGhlbgorICBPUFRJT05fVEFSR0VUUz1vdXQvJE9TCitmaQorCisjIHdlIGNhbiBidWlsZCBTREwgd2l0aCBDeWd3aW4sIHNvIGVuYWJsZSBpdAorZW5hYmxlX2N5Z3dpbgorCitzZXR1cF90b29sY2hhaW4KKworIyMjCisjIyMgU3BlY2lhbCBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzCisjIyMKKworY2FzZSAiJE9TIiBpbgorICAgIGxpbnV4LSopCisgICAgICAgIEJVSUxEX0NGTEFHUz0iLURfR05VX1NPVVJDRT0xIC1mdmlzaWJpbGl0eT1oaWRkZW4gLURYVEhSRUFEUyAtRF9SRUVOVFJBTlQiCisgICAgICAgICMgcHJldmVudCAtZnN0YWNrLXByb3RlY3RvciBvciB0aGUgZ2VuZXJhdGVkIGJpbmFyaWVzIHdpbGwgbm90IGxpbmsKKyAgICAgICAgQlVJTERfQ0ZMQUdTPSIkQlVJTERfQ0ZMQUdTIC1mbm8tc3RhY2stcHJvdGVjdG9yIgorICAgICAgICA7OworICAgIGRhcndpbi0qKQorICAgICAgICBCVUlMRF9DRkxBR1M9Ii1EX0dOVV9TT1VSQ0U9MSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EVEFSR0VUX0FQSV9NQUNfQ0FSQk9OIC1EVEFSR0VUX0FQSV9NQUNfT1NYIC1EX1RIUkVBRF9TQUZFIC1mb3JjZV9jcHVzdWJ0eXBlX0FMTCAtZnBhc2NhbC1zdHJpbmdzIgorICAgICAgICAjIGRldGVjdCB0aGUgMTAuNCBTREsgYW5kIHVzZSBpdCBhdXRvbWF0aWNhbGx5CisgICAgICAgIFRJR0VSX1NESz0vRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrCisgICAgICAgIGlmIFsgISAtZCAkVElHRVJfU0RLIC1hICRPUFRJT05fTk9fVElHRVIgPSBubyBdIDsgdGhlbgorICAgICAgICAgICAgZWNobyAiUGxlYXNlIGluc3RhbGwgdGhlIDEwLjQgU0RLIGF0ICRUSUdFUl9TREsgdG8gZ2VuZXJhdGUgVGlnZXItY29tcGF0aWJsZSBiaW5hcmllcy4iCisgICAgICAgICAgICBlY2hvICJJZiB5b3UgZG9uJ3Qgd2FudCBjb21wYXRpYmlsaXR5LCB1c2UgLS1uby10aWdlciBvcHRpb24gaW5zdGVhZC4iCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAtZCAkVElHRVJfU0RLIF0gOyB0aGVuCisgICAgICAgICAgICBUSUdFUl9PUFRTPSItaXN5c3Jvb3QgJFRJR0VSX1NESyAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC40IgorICAgICAgICAgICAgQlVJTERfQ0ZMQUdTPSIkQlVJTERfQ0ZMQUdTICRUSUdFUl9PUFRTIgorICAgICAgICAgICAgQlVJTERfTERGTEFHUz0iJEJVSUxEX0xERkxBR1MgJFRJR0VSX09QVFMgLVdsLC1zeXNsaWJyb290LCQoVElHRVJfU0RLKSIKKyAgICAgICAgICAgIGVjaG8gIlVzaW5nIE9TIFggMTAuNCBTREsgdG8gZ2VuZXJhdGUgVGlnZXItY29tcGF0aWJsZSBiaW5hcmllcy4iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIldhcm5pbmc6IHRoZSBnZW5lcmF0ZWQgYmluYXJpZXMgd2lsbCBub3QgYmUgY29tcGF0aWJsZSB3aXRoIFRpZ2VyLiIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICB3aW5kb3dzKQorICAgICAgICBCVUlMRF9DRkxBR1M9Ii1EX0dOVV9TT1VSQ0U9MSIKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBCVUlMRF9DRkxBR1M9Citlc2FjCisKKyMgQlVJTERfQ0ZMQUdTIGFyZSB1c2VkIHRvIGJ1aWxkIFNETCwgYnV0IFNETF9DRkxBR1MgYXJlIHVzZWQKKyMgd2hlbiBjbGllbnRzIHdhbnQgdG8gdXNlIGl0cyBmYWNpbGl0aWVzCisjCitjYXNlICIkSE9TVF9PUyIgaW4KKyAgICBsaW51eCkKKyAgICAgICAgU0RMX0NGTEFHUz0iLURfR05VX1NPVVJDRT0xIC1EX1JFRU5UUkFOVCIKKyAgICAgICAgU0RMX1NUQVRJQ19MSUJTPSItbG0gLWxkbCAtbHB0aHJlYWQgLWxydCIKKyAgICAgICAgOzsKKyAgICBkYXJ3aW4pCisgICAgICAgIFNETF9DRkxBR1M9Ii1EX0dOVV9TT1VSQ0U9MSAtRF9USFJFQURfU0FGRSIKKyAgICAgICAgU0RMX1NUQVRJQ19MSUJTPSItV2wsLWZyYW1ld29yayxPcGVuR0wgLVdsLC1mcmFtZXdvcmssQ29jb2EgLVdsLC1mcmFtZXdvcmssUXVpY2tUaW1lIC1XbCwtZnJhbWV3b3JrLEFwcGxpY2F0aW9uU2VydmljZXMgLVdsLC1mcmFtZXdvcmssQ2FyYm9uIC1XbCwtZnJhbWV3b3JrLElPS2l0IgorICAgICAgICA7OworICAgIHdpbmRvd3MpCisgICAgICAgIFNETF9DRkxBR1M9Ii1EX0dOVV9TT1VSQ0U9MSAtRG1haW49U0RMX21haW4iCisgICAgICAgIFNETF9TVEFUSUNfTElCUz0iLWx1c2VyMzIgLWxnZGkzMiAtbHdpbm1tIgorICAgICAgICA7OworICAgICopCisgICAgICAgIFNETF9DRkxBR1M9CisgICAgICAgIFNETF9TVEFUSUNfTElCUz0KK2VzYWMKKworRE9MTEFSPSIkIgorU0RMX1NUQVRJQ19MSUJTPSIkRE9MTEFSe2xpYmRpcn0vbGliU0RMbWFpbi5hICRET0xMQVJ7bGliZGlyfS9saWJTREwuYSAkU0RMX1NUQVRJQ19MSUJTIgorCisjIyMKKyMjIyBGZWF0dXJlcyBwcm9iZXMKKyMjIworCitDT05GSUdfTElCQz15ZXMKKworIyMjCisjIyMgQ29uZmlndXJhdGlvbiBmaWxlcyBnZW5lcmF0aW9uCisjIyMKKworIyBjcmVhdGUgdGhlIG9ianMgZGlyZWN0b3J5IHRoYXQgaXMgZ29pbmcgdG8gY29udGFpbiBhbGwgZ2VuZXJhdGVkIGZpbGVzCisjIGluY2x1ZGluZyB0aGUgY29uZmlndXJhdGlvbiBvbmVzCisjCitta2RpciAtcCBvYmpzCisKK2NvbmZpZ19hZGQgKCkKK3sKKyAgICBlY2hvICIkMSIgPj4gJGNvbmZpZ19oCit9CisKKyMgdXNlZCB0byBhZGQgYSBtYWNybyBkZWZpbmUvdW5kZWYgbGluZSB0byB0aGUgY29uZmlndXJhdGlvbgorIyAkMTogbWFjcm8gbmFtZQorIyAkMjogMSwgMCwgeWVzIG9yIG5vCisjICQzOiBvcHRpb25hbCBsb2cgcHJlZml4Citjb25maWdfYWRkX21hY3JvICgpCit7CisgICAgbG9jYWwgbG9nbmFtZQorICAgIGxvZ25hbWU9IiR7MzotQ2ZnTWFjcm8gICB9IgorICAgIGNhc2UgIiQyIiBpbgorICAgICAgICAwfG5vfGZhbHNlKQorICAgICAgICAgICAgY29uZmlnX2FkZCAiLyogI3VuZGVmICQxICovIgorICAgICAgICAgICAgbG9nICIkbG9nbmFtZTogJDE9MCIKKyAgICAgICAgICAgIDs7CisgICAgICAgIDF8eWVzfHRydWUpCisgICAgICAgICAgICBjb25maWdfYWRkICIjZGVmaW5lICQxIDEiCisgICAgICAgICAgICBsb2cgIiRsb2duYW1lOiAkMT0xIgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCit9CisKKyMgdXNlZCB0byBhZGQgaG9zdC1vcy1zcGVjaWZpYyBkcml2ZXIgbWFjcm9zIHRvIHRoZSBjb25maWcgZmlsZQorIyAkMSA6IGRyaXZlciBwcmVmaXgsIGUuZy4gRFJJVkVSU19WSURFTworIyAkMiA6IG1hY3JvIHByZWZpeAorIyB0aGlzIHdpbGwgbG9vayBmb3IgRFJJVkVSU19WSURFT18ke0hPU1RfT1N9LCBhbmQsIGlmIGl0IGlzIG5vdAorIyBkZWZpbmVkIGluIERSSVZFUlNfVklERU9fZGVmYXVsdAorIworIyB0aGVuIHRoaXMgd2lsbCBjYWxsICdjb25maWdfYWRkICR7Mn1fJHtkcml2ZXJ9JyBmb3IgZWFjaCBkcml2ZXIgbGlzdGVkCisjCitjb25maWdfYWRkX2RyaXZlcl9tYWNyb3MgKCkKK3sKKyAgICBsb2NhbCAgZHJpdmVyX2xpc3Q9ImB2YXJfdmFsdWUgJHsxfV8ke0hPU1RfT1N9YCIKKyAgICBsb2NhbCAgZHJpdmVyX25hbWUKKyAgICBpZiBbIC16ICIkZHJpdmVyX2xpc3QiIF0gOyB0aGVuCisgICAgICAgIGRyaXZlcl9saXN0PSJgdmFyX3ZhbHVlICR7MX1fZGVmYXVsdGAiCisgICAgZmkKKyAgICBmb3IgZHJpdmVyX25hbWUgaW4gJGRyaXZlcl9saXN0OyBkbworICAgICAgICBjb25maWdfYWRkX21hY3JvICIkezJ9XyR7ZHJpdmVyX25hbWV9IiB5ZXMKKyAgICBkb25lCit9CisKK2NvbmZpZ19oPW9ianMvU0RMX2NvbmZpZy5oCisKKyMgYSBmdW5jdGlvbiB1c2VkIHRvIGNoZWNrIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBnaXZlbiBTdGFuZGFyZCBDIGhlYWRlcgorIyAkMSA6IGhlYWRlciBuYW1lLCB3aXRob3V0IHRoZSAuaCBzdWZmaXggbm9yIGVuY2xvc2luZyBicmFja2V0cyAoZS5nLiAnbWVtb3J5JyBmb3IgPG1lbW9yeS5oPikKKyMgdGhpcyB3aWxsIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGEgcmVsZXZhbnQgbGluZQorc2RsX2NoZWNrX2hlYWRlciAoKQoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIGhlYWRlcgorICAgIGxvY2FsIG1hY3JvCisgICAgaGVhZGVyPSI8JDEuaD4iCisgICAgbWFjcm89YHRvX3VwcGVyY2FzZSAkMWAKKyAgICBtYWNybz1gZWNobyAkbWFjcm8gfCB0ciAnLycgJ18nYAorICAgIGZlYXR1cmVfY2hlY2tfaGVhZGVyIHJlc3VsdCAiJGhlYWRlciIKKyAgICBjb25maWdfYWRkX21hY3JvIEhBVkVfJHttYWNyb31fSCAkcmVzdWx0ICJTdGRDSGVhZGVyICIKK30KKworIyBjYWxsIHNkbF9jaGVja19oZWFkZXIgd2l0aCBhIGxpc3Qgb2YgaGVhZGVyIG5hbWVzCitzZGxfY2hlY2tfaGVhZGVycyAoKQoreworICAgIGZvciBoaCBpbiAkKjsgZG8KKyAgICAgICAgc2RsX2NoZWNrX2hlYWRlciAiJGhoIgorICAgIGRvbmUKK30KKworIyBhIGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgdGhhdCBhIGdpdmVuIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgQyBsaWJyYXJ5CisjIHRoaXMgd2lsbCB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBhIHJlbGV2YW50IGxpbmUKKyMgJDE6IGZ1bmN0aW9uIG5hbWUKKyMgJDI6IG9wdGlvbmFsLCBsaWJyYXJpZXMgdG8gbGluayBhZ2FpbnN0CisjCitzZGxfY2hlY2tfZnVuYyAoKQoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIGZ1bmNuYW1lCisgICAgbG9jYWwgbWFjcm8KKyAgICBmdW5jbmFtZT0iJDEiCisgICAgbWFjcm89YHRvX3VwcGVyY2FzZSAkMWAKKyAgICBybSAtZiAkVE1QQworICAgIGNhdCA+ICRUTVBDIDw8RU9GCisjdW5kZWYgJGZ1bmNuYW1lCisjZGVmaW5lICRmdW5jbmFtZSAgX2lubm9jdW91c18kZnVuY25hbWUKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyN1bmRlZiAkZnVuY25hbWUKKwordHlwZWRlZiB2b2lkICgqZnVuY190KSh2b2lkKTsKK2V4dGVybiB2b2lkICRmdW5jbmFtZSh2b2lkKTsKK2Z1bmNfdCAgX2R1bW15ID0gJGZ1bmNuYW1lOworaW50ICAgbWFpbih2b2lkKQoreworICAgIHJldHVybiBfZHVtbXkgPT0gJGZ1bmNuYW1lOworfQorRU9GCisgICAgRVhUUkFfTERGTEFHUz0iJDIiCisgICAgZmVhdHVyZV9jaGVja19saW5rIHJlc3VsdAorICAgIGNvbmZpZ19hZGRfbWFjcm8gSEFWRV8ke21hY3JvfSAkcmVzdWx0ICJTdGRDRnVuYyAgICIKK30KKworIyBjYWxsIHNkbF9jaGVja19mdW5jIHdpdGggYSBsaXN0IG9mIGZ1bmN0aW9ucworc2RsX2NoZWNrX2Z1bmNzICgpCit7CisgICAgZm9yIGZmIGluICQqOyBkbworICAgICAgICBzZGxfY2hlY2tfZnVuYyAiJGZmIgorICAgIGRvbmUKK30KKworIyBjaGVjayBlbmRpYW5lc3Mgb2YgdGhlIGhvc3QgcGxhdGZvcm0KK3NkbF9jaGVja19lbmRpYW5lc3MgKCkKK3sKKyAgICBjYXQgPiAkVE1QQyA8PEVPRgorICAgIGludCAgbWFpbih2b2lkKQorICAgIHsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgIHY7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgYlsyXTsKKyAgICAgICAgfSB1OworCisgICAgICAgIHUudiA9IDB4MTIzNDsKKyAgICAgICAgcmV0dXJuICh1LmJbMF0gPT0gMHgxMik7CisgICAgfQorRU9GCisgICAgZmVhdHVyZV9ydW5fZXhlYyB0ZXN0X2UKKyAgICBpZiBbICIkdGVzdF9lIiA9ICIxIiBdIDsgdGhlbgorICAgICAgICBldmFsICQxPTQzMjEKKyAgICBlbHNlCisgICAgICAgIGV2YWwgJDE9MTIzNAorICAgIGZpCit9CisKKworZ2VuZXJhdGVfU0RMX2NvbmZpZ19oICgpCit7CisgICAgZWNobyAiLyogVGhpcyBmaWxlIHdhcyBhdXRvZ2VuZXJhdGVkIGJ5ICckUFJPR05BTUUnIC0gZG8gbm90IGVkaXQgKi8iID4gJGNvbmZpZ19oCisKKyAgICBjb25maWdfYWRkICIjaWZuZGVmIF9TRExfY29uZmlnX2giCisgICAgY29uZmlnX2FkZCAiI2RlZmluZSBfU0RMX2NvbmZpZ19oIgorICAgIGNvbmZpZ19hZGQgIiIKKyAgICBjb25maWdfYWRkICIjaW5jbHVkZSBcIlNETF9wbGF0Zm9ybS5oXCIiCisgICAgY29uZmlnX2FkZCAiIgorICAgIAorICAgICMgdHJ1ZSBmb3IgYWxsIGFyY2hpdGVjdHVyZXMgdGhlc2UgZGF5cworICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX0hBU182NEJJVF9UWVBFICAxCisKKyAgICBzZGxfY2hlY2tfZW5kaWFuZXNzIEVORElBTkVTUworICAgIGNvbmZpZ19hZGQgIiNkZWZpbmUgU0RMX0JZVEVPUkRFUiAkRU5ESUFORVNTIgorICAgIGNvbmZpZ19hZGQgIiIKKworICAgIGNvbmZpZ19hZGRfbWFjcm8gSEFWRV9MSUJDICRDT05GSUdfTElCQworCisgICAgY29uZmlnX2FkZCAiI2lmIEhBVkVfTElCQyIKKyAgICBjb25maWdfYWRkICIiCisgICAgY29uZmlnX2FkZCAiLyogVXNlZnVsIGhlYWRlcnMgKi8iCisKKyAgICBzZGxfY2hlY2tfaGVhZGVycyAgYWxsb2NhIHN5cy90eXBlcyBzdGRpbworCisgICAgIyBqdXN0IGxpa2UgY29uZmlndXJlIC0gZm9yY2UgaXQgdG8gMQorICAgIGNvbmZpZ19hZGQgIiNkZWZpbmUgU1REQ19IRUFERVJTICAxIgorCisgICAgc2RsX2NoZWNrX2hlYWRlcnMgIHN0ZGxpYiBzdGRhcmcgbWFsbG9jIG1lbW9yeSBzdHJpbmcgc3RyaW5ncyBpbnR0eXBlcyBzdGRpbnQgY3R5cGUgbWF0aCBpY29udiBzaWduYWwgYWx0aXZlYworCisgICAgY29uZmlnX2FkZCAiLyogQyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLyIKKworICAgIHNkbF9jaGVja19mdW5jcyAgbWFsbG9jIGNhbGxvYyByZWFsbG9jIGZyZWUgYWxsb2MKKworICAgIGNvbmZpZ19hZGQgIiNpZm5kZWYgX1dJTjMyIC8qIERvbid0IHVzZSBvbiBXaW5kb3dzICovIgorCisgICAgc2RsX2NoZWNrX2Z1bmNzICBnZXRlbnYgcHV0ZW52IHVuc2V0ZW52CisKKyAgICBjb25maWdfYWRkICIjZW5kaWYiCisgICAgc2RsX2NoZWNrX2Z1bmNzIHFzb3J0IGFicyBiY29weSBtZW1zZXQgbWVtY3B5IG1lbW1vdmUgbWVtY21wIHN0cmxlbiBzdHJsY3B5IHN0cmxjYXQKKyAgICBzZGxfY2hlY2tfZnVuY3Mgc3RyZHVwIF9zdHJyZXYgX3N0cnVwciBfc3RybHdyIGluZGV4IHJpbmRleCBzdHJjaHIgc3RycmNociBpdG9hIF9sdG9hCisgICAgc2RsX2NoZWNrX2Z1bmNzIF91aXRvYSBfdWx0b2Egc3RydG9sIHN0cnRvdWwgX2k2NHRvYSBfdWk2NHRvYSBzdHJ0b2xsIHN0cnRvdWxsCisgICAgc2RsX2NoZWNrX2Z1bmNzIHN0cnRvZCBhdG9pIGF0b2Ygc3RyY21wIHN0cm5jbXAgX3N0cmljbXAgc3RyY2FzZWNtcCBfc3RybmljbXAKKyAgICBzZGxfY2hlY2tfZnVuY3MgdnNucHJpbnRmIGljb252IHNpZ2FjdGlvbiBzZXRqbXAgbmFub3NsZWVwCisKKyAgICBzZGxfY2hlY2tfZnVuYyBjbG9ja19nZXR0aW1lIC1scnQKKyAgICBzZGxfY2hlY2tfZnVuYyBkbHZzeW0gLWxkbAorCisgICAgc2RsX2NoZWNrX2Z1bmNzIGdldHBhZ2VzaXplCisKKyAgICBjb25maWdfYWRkICIjZWxzZSIKKyAgICBjb25maWdfYWRkICIvKiBXZSBtYXkgbmVlZCBzb21lIHJlcGxhY2VtZW50IGZvciBzdGRhcmcuaCBoZXJlICovIgorICAgIGNvbmZpZ19hZGQgIiNpbmNsdWRlIDxzdGRhcmcuaD4iCisgICAgY29uZmlnX2FkZCAiI2VuZGlmIC8qIEhBVkVfTElCQyAqLyIKKyAgICBjb25maWdfYWRkICIiCisKKyAgICBjb25maWdfYWRkICIvKiBBbGxvdyBkaXNhYmxpbmcgb2YgY29yZSBzdWJzeXN0ZW1zICovIgorCisgICAgY29uZmlnX2FkZF9tYWNybyBTRExfQVVESU9fRElTQUJMRUQgeWVzCisgICAgY29uZmlnX2FkZF9tYWNybyBTRExfQ0RST01fRElTQUJMRUQgeWVzCisgICAgY29uZmlnX2FkZF9tYWNybyBTRExfQ1BVSU5GT19ESVNBQkxFRCBubworICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX0VWRU5UU19ESVNBQkxFRCBubworICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX0ZJTEVfRElTQUJMRUQgeWVzCisgICAgY29uZmlnX2FkZF9tYWNybyBTRExfSk9ZU1RJQ0tfRElTQUJMRUQgeWVzCisgICAgY29uZmlnX2FkZF9tYWNybyBTRExfTE9BRFNPX0RJU0FCTEVEIG5vCisgICAgY29uZmlnX2FkZF9tYWNybyBTRExfVEhSRUFEU19ESVNBQkxFRCBubworICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX1RJTUVSU19ESVNBQkxFRCBubworICAgIGNvbmZpZ19hZGRfbWFjcm8gU0RMX1ZJREVPX0RJU0FCTEVEIG5vCisKKyAgICBjb25maWdfYWRkICIiCisgICAgY29uZmlnX2FkZCAiLyogRW5hYmxlIHZhcmlvdXMgc2hhcmVkIG9iamVjdCBsb2FkaW5nIHN5c3RlbXMgKi8iCisKKyAgICBjb25maWdfYWRkX2RyaXZlcl9tYWNyb3MgRFJJVkVSU19MT0FEU08gU0RMX0xPQURTTworCisgICAgY29uZmlnX2FkZCAiIgorICAgIGNvbmZpZ19hZGQgIi8qIEVuYWJsZSB2YXJpb3VzIHRocmVhZGluZyBzeXN0ZW1zICovIgorCisgICAgY29uZmlnX2FkZF9kcml2ZXJfbWFjcm9zIERSSVZFUlNfVEhSRUFEIFNETF9USFJFQUQKKworICAgIGNvbmZpZ19hZGQgIiIKKyAgICBjb25maWdfYWRkICIvKiBFbmFibGUgdmFyaW91cyB0aW1lciBzeXN0ZW1zICovIgorCisgICAgY29uZmlnX2FkZF9kcml2ZXJfbWFjcm9zIERSSVZFUlNfVElNRVIgU0RMX1RJTUVSCisKKyAgICBjb25maWdfYWRkICIiCisgICAgY29uZmlnX2FkZCAiLyogRW5hYmxlIHZhcmlvdXMgdmlkZW8gZHJpdmVycyAqLyIKKworICAgIGNvbmZpZ19hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX1ZJREVPIFNETF9WSURFT19EUklWRVIKKworICAgIGNvbmZpZ19hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX01BSU4gU0RMX01BSU4KKworICAgICMgdGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBnb29kIGVub3VnaCBmb3IgYWxsIHJlY2VudCBVbml4IGRpc3RyaWJ1dGlvbnMKKyAgICBjb25maWdfYWRkICIjZGVmaW5lIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUMgXCJsaWJYMTEuc28uNlwiIgorICAgIGNvbmZpZ19hZGQgIiNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YRVhUIFwibGliWGV4dC5zby42XCIiCisgICAgY29uZmlnX2FkZCAiI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSQU5EUiBcImxpYlhyYW5kci5zby4yXCIiCisgICAgY29uZmlnX2FkZCAiI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSRU5ERVIgXCJsaWJYcmVuZGVyLnNvLjFcIiIKKworICAgICMgdG9kbzogT3BlbkdMIHN1cHBvcnQgPworICAgICMgdG9kbzogQXNzZW1ibHkgcm91dGluZXMgc3VwcG9ydCA/CisKKyAgICBjb25maWdfYWRkICIjZW5kaWYgLyogX1NETF9jb25maWdfaCAqLyIKK30KKworIyMjIEJ1aWxkIHRoZSBjb25maWcgc3ViLW1ha2VmaWxlCisjIyMKKworbWFrZV9hZGQgKCkKK3sKKyAgICBlY2hvICIkMSIgPj4gJGNvbmZpZ19taworfQorCittYWtlX2FkZF9kcml2ZXJfbWFjcm9zICgpCit7CisgICAgbG9jYWwgZHJpdmVyX2xpc3Q9ImB2YXJfdmFsdWUgJHsxfV8ke0hPU1RfT1N9YCIKKyAgICBsb2NhbCBkcml2ZXJfbmFtZQorICAgIGlmIFsgLXogIiRkcml2ZXJfbGlzdCIgXSA7IHRoZW4KKyAgICAgICAgZHJpdmVyX2xpc3Q9ImB2YXJfdmFsdWUgJHsxfV9kZWZhdWx0YCIKKyAgICBmaQorICAgIGZvciBkcml2ZXJfbmFtZSBpbiAkZHJpdmVyX2xpc3Q7IGRvCisgICAgICAgIG1ha2VfYWRkICJTRExfJDJfJHtkcml2ZXJfbmFtZX0gOj0geWVzIgorICAgIGRvbmUKK30KKworZ2VuZXJhdGVfc2RsX2NvbmZpZ19tayAoKQoreworICAgIENGTEFHUz0iJENGTEFHUyAkQlVJTERfQ0ZMQUdTIgorICAgIExERkxBR1M9IiRMREZMQUdTICRCVUlMRF9MREZMQUdTIgorICAgIGNyZWF0ZV9jb25maWdfbWsKKworICAgIG1ha2VfYWRkICIiCisgICAgUFdEPWBwd2RgCisgICAgbWFrZV9hZGQgIlNSQ19QQVRIPSRQV0QiCisgICAgbWFrZV9hZGQgIkJVSUxEX1NZU1RFTT0kQU5EUk9JRF9RRU1VX1BBVEgvYW5kcm9pZC9idWlsZCIKKworICAgIG1ha2VfYWRkICJTRExfQ09ORklHX0xJQkMgOj0gJENPTkZJR19MSUJDIgorICAgIG1ha2VfYWRkICJTRExfQ09ORklHX0NQVUlORk8gOj0geWVzIgorCisgICAgbWFrZV9hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX0xPQURTTyBDT05GSUdfTE9BRFNPCisgICAgbWFrZV9hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX1RIUkVBRCBDT05GSUdfVEhSRUFECisgICAgbWFrZV9hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX1RJTUVSICBDT05GSUdfVElNRVIKKyAgICBtYWtlX2FkZF9kcml2ZXJfbWFjcm9zIERSSVZFUlNfVklERU8gIENPTkZJR19WSURFTworCisgICAgbWFrZV9hZGRfZHJpdmVyX21hY3JvcyBEUklWRVJTX01BSU4gICBDT05GSUdfTUFJTgorCisgICAgbWFrZV9hZGQgIklOU1RBTExfVEFSR0VUUyA6PSAkT1BUSU9OX1RBUkdFVFMiCit9CisKKyMjIyBCdWlsZCB0aGUgZmluYWwgc2RsLWNvbmZpZyBzY3JpcHQgZnJvbSB0aGUgdGVtcGxhdGUKKyMjIworCitnZW5lcmF0ZV9zZGxfY29uZmlnICgpCit7CisgICAgIyBidWlsZCBhIHNlZCBzY3JpcHQgdGhhdCB3aWxsIHJlcGxhY2UgYWxsIEBWQVJJQUJMRVNAIGluIHRoZSB0ZW1wbGF0ZQorICAgICMgd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZXMKKyAgICBybSAtZiAkVE1QQworCisgICAgIyByZXBsYWNlIEBleGVjX3ByZWZpeEAgd2l0aCAie3ByZWZpeH0iLCBhbmQgQGxpYmRpckAgd2l0aCAie2xpYmRpcn0iCisgICAgY2F0ID4gJFRNUEMgPDxFT0YKK3MhQGV4ZWNfcHJlZml4QCFcJFx7cHJlZml4XH0hZworcyFAbGliZGlyQCFcJFx7ZXhlY19wcmVmaXhcfS9saWJzIWcKK3MhQGluY2x1ZGVkaXJAIVwkXHtwcmVmaXhcfS9pbmNsdWRlIWcKK0VPRgorCisgICAgIyB3ZSB3YW50IHRvIGVuYWJsZSBzdGF0aWMgbGlua2luZywgZG8gQEVOQUJMRV9TVEFUSUNfRkFMU0VAIGFuZCBARU5BQkxFX1NUQVRJQ19UUlVFQAorICAgIGNhdCA+PiAkVE1QQyA8PEVPRgorcyFARU5BQkxFX1NUQVRJQ19GQUxTRUAhXCMhZworcyFARU5BQkxFX1NUQVRJQ19UUlVFQCEhZworcyFARU5BQkxFX1NIQVJFRF9UUlVFQCFcIyFnCitzIUBFTkFCTEVfU0hBUkVEX0ZBTFNFQCEhZworRU9GCisKKyAgICAjIHNldCB0aGUgdmVyc2lvbiB0byAxLjIuMTUKKyAgICBjYXQgPj4gJFRNUEMgPDxFT0YKK3MhQFNETF9WRVJTSU9OQCExLjIuMTUhZworRU9GCisKKyAgICAjCisgICAgY2F0ID4+ICRUTVBDIDw8RU9GCitzIUBTRExfQ0ZMQUdTQCEkU0RMX0NGTEFHUyFnCitzIUBTRExfU1RBVElDX0xJQlNAISRTRExfU1RBVElDX0xJQlMhZworRU9GCisKKyAgICBjYXQgc2RsLWNvbmZpZy5pbiB8IHNlZCAtZiAkVE1QQyA+IG9ianMvc2RsLWNvbmZpZworICAgIGNobW9kICt4IG9ianMvc2RsLWNvbmZpZworfQorCisjIGNvcHkgYSBjb25maWd1cmF0aW9uIGZpbGUgb3IgcGVyZm9ybSBhdXRvLWRldGVjdGlvbiBpZiBvbmUgaXMgbm90IGF2YWlsYWJsZQorIyBvciB0aGUgLS1mb3JjZS1hdXRvZGV0ZWN0IG9wdGlvbiB3YXMgdXNlZAorIyAkMTogYmFzZW5hbWUgb2YgY29uZmlnIGZpbGUKKyMgJDI6IGNvbW1hbmQgdG8gcnVuIHRvIHBlcmZvcm0gYXV0by1kZXRlY3Rpb24vZ2VuZXJhdGlvbgorIworY29weV9vcl9hdXRvZGV0ZWN0ICgpCit7CisgICAgaWYgWyAiJE9QVElPTl9GT1JDRV9BVVRPREVURUNUIiAhPSAieWVzIiAtYSAtZiBhbmRyb2lkL2J1aWxkLyRPUy8kMSBdIDsgdGhlbgorICAgICAgICBsb2cgIlNldHVwICAgICAgOiBDb3B5aW5nICQxIGZyb20gYW5kcm9pZC9idWlsZC8kT1MiCisgICAgICAgIGNwIC1mIGFuZHJvaWQvYnVpbGQvJE9TLyQxIG9ianMvJDEKKyAgICBlbHNlCisgICAgICAgIGxvZyAiU2V0dXAgICAgICA6IEF1dG8tZ2VuZXJhdGluZyAkMSIKKyAgICAgICAgZXZhbCAkMgorICAgIGZpCit9CisKK2dlbmVyYXRlX2FsbCAoKQoreworICBjb3B5X29yX2F1dG9kZXRlY3QgU0RMX2NvbmZpZy5oIGdlbmVyYXRlX1NETF9jb25maWdfaAorICBnZW5lcmF0ZV9zZGxfY29uZmlnX21rCisgIGNvcHlfb3JfYXV0b2RldGVjdCBzZGwtY29uZmlnIGdlbmVyYXRlX3NkbF9jb25maWcKK30KKworRFJJVkVSU19MT0FEU09fZGVmYXVsdD1ETE9QRU4KK0RSSVZFUlNfTE9BRFNPX2Rhcndpbj1ETENPTVBBVAorRFJJVkVSU19MT0FEU09fd2luZG93cz1XSU4zMgorCisjIFRPRE86IGRldGVybWluZSBpZiBQVEhSRUFEX1JFQ1VSU0lWRSBvciBQVEhSRUFEX1JFQ1VSU0lWRV9OUCBpcyB2YWxpZCBmb3IgdGhlIHBsYXRmb3JtCitEUklWRVJTX1RIUkVBRF9kZWZhdWx0PSJQVEhSRUFEIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYIgorRFJJVkVSU19USFJFQURfbGludXg9IlBUSFJFQUQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfTlAiCitEUklWRVJTX1RIUkVBRF93aW5kb3dzPVdJTjMyCisKK0RSSVZFUlNfVElNRVJfZGVmYXVsdD1VTklYCitEUklWRVJTX1RJTUVSX3dpbmRvd3M9V0lOMzIKKworIyBUT0RPOiBhY3R1YWxseSBjb21wdXRlIHRoaXMgcHJvcGVybHkgZm9yIFgxMSBhbmQgZHluYW1pYyBsb2FkaW5nICEhCitEUklWRVJTX1ZJREVPX2RlZmF1bHQ9IlgxMSBYMTFfRFBNUyBYMTFfWElORVJBTUEgWDExX1hNRSIKK0RSSVZFUlNfVklERU9fZGFyd2luPSJRVUFSVFoiCitEUklWRVJTX1ZJREVPX3dpbmRvd3M9IldJTkRJQiIKKworRFJJVkVSU19NQUlOX2RlZmF1bHQ9RFVNTVkKK0RSSVZFUlNfTUFJTl9kYXJ3aW49TUFDT1NYCitEUklWRVJTX01BSU5fd2luZG93cz1XSU4zMgorCitnZW5lcmF0ZV9hbGwKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9hdXRvZ2VuLnNoIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2F1dG9nZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQ5ZDdiMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9hdXRvZ2VuLnNoCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorIworZWNobyAiR2VuZXJhdGluZyBidWlsZCBpbmZvcm1hdGlvbiB1c2luZyBhdXRvY29uZiIKK2VjaG8gIlRoaXMgbWF5IHRha2UgYSB3aGlsZSAuLi4iCisKKyMgUmVnZW5lcmF0ZSBjb25maWd1cmF0aW9uIGZpbGVzCitjYXQgYWNpbmNsdWRlLyogPmFjbG9jYWwubTQKK2ZvdW5kPWZhbHNlCitmb3IgYXV0b2NvbmYgaW4gYXV0b2NvbmYgYXV0b2NvbmYyNTkgYXV0b2NvbmYtMi41OQorZG8gaWYgd2hpY2ggJGF1dG9jb25mID4vZGV2L251bGwgMj4mMTsgdGhlbiAkYXV0b2NvbmYgJiYgZm91bmQ9dHJ1ZTsgYnJlYWs7IGZpCitkb25lCitpZiB0ZXN0IHgkZm91bmQgPSB4ZmFsc2U7IHRoZW4KKyAgICBlY2hvICJDb3VsZG4ndCBmaW5kIGF1dG9jb25mLCBhYm9ydGluZyIKKyAgICBleGl0IDEKK2ZpCisoY2QgdGVzdDsgc2ggYXV0b2dlbi5zaCkKKworIyBSdW4gY29uZmlndXJlIGZvciB0aGlzIHBsYXRmb3JtCitlY2hvICJOb3cgeW91IGFyZSByZWFkeSB0byBydW4gLi9jb25maWd1cmUiCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvYnVpbGQtc2NyaXB0cy9jb25maWcuZ3Vlc3MgYi9kaXN0cmliL3NkbC0xLjIuMTUvYnVpbGQtc2NyaXB0cy9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTc5MmFhYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDE0OTQgQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMDktMDktMTgnCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuICBQbGVhc2Ugc2VuZCBwYXRjaGVzIChjb250ZXh0CisjIGRpZmYgZm9ybWF0KSB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gYW5kIGluY2x1ZGUgYSBDaGFuZ2VMb2cKKyMgZW50cnkuCisjCisjIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KKyMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCisjIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgorIworIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dCisKK091dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQorCitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIC1xIF9fRUxGX18KKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJICAgICAgICBvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCA7OworICAgICo6T3BlbkJTRDoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlNvbGlkQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwljYXNlICRVTkFNRV9SRUxFQVNFIGluCisJKjQuMCkKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwkJOzsKKwkqNS4qKQorCSAgICAgICAgVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKKwkJOzsKKwllc2FjCisJIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KKwkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAorCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKKwkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KKwlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCisJY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgorCSAgICAiRVY0ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNC41ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY1ICgyMTE2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKKwkgICAgIkVWNS42ICgyMTE2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OworCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKKwkgICAgIkVWNS43ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7CisJICAgICJFVjYgKDIxMjY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OworCSAgICAiRVY2LjcgKDIxMjY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7CisJICAgICJFVjYuOENCICgyMTI2NEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKKwkgICAgIkVWNyAoMjEzNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7CisJICAgICJFVjcuOSAoMjEzNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKKwllc2FjCisJIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KKwkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KKwkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgorCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgorCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCWV4aXQgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCA7OworICAgICo6T1M0MDA6KjoqKQorICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCisJZXhpdCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFybTpyaXNjb3M6KjoqfGFybTpSSVNDT1M6KjoqKQorCWVjaG8gYXJtLXVua25vd24tcmlzY29zCisJZXhpdCA7OworICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCA7OworICAgIE5JTEUqOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCA7OworICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQorCWVjaG8gc3BhcmMtaWNsLW54NgorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCisJY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCisJICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDc7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgczM5MHg6U3VuT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNEg6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KiB8IGk4NnhlbjpTdW5PUzo1Lio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJU1VOX0FSQ0g9ImkzODYiCisJIyBJZiB0aGVyZSBpcyBhIGNvbXBpbGVyLCBzZWUgaWYgaXQgaXMgY29uZmlndXJlZCBmb3IgNjQtYml0IG9iamVjdHMuCisJIyBOb3RlIHRoYXQgdGhlIFN1biBjYyBkb2VzIG5vdCB0dXJuIF9fTFA2NF9fIGludG8gMSBsaWtlIGdjYyBkb2VzLgorCSMgVGhpcyB0ZXN0IHdvcmtzIGZvciBib3RoIGNvbXBpbGVycy4KKwlpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KKwkgICAgaWYgKGVjaG8gJyNpZmRlZiBfX2FtZDY0JzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKKwkJKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8IFwKKwkJZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkgICAgdGhlbgorCQlTVU5fQVJDSD0ieDg2XzY0IgorCSAgICBmaQorCWZpCisJZWNobyAke1NVTl9BUkNIfS1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQorICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKKyAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCisgICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKKyAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAorICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAorICAgICMgYmUgbm8gcHJvYmxlbS4KKyAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIG02OGs6bWFjaHRlbjoqOiopCisJZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgorCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKKwkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgorCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQorCXRoZW4KKwkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCisJICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCisJICAgIHRoZW4KKwkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJICAgIGVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJICAgIGZpCisJZWxzZQorCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwlmaQorIAlleGl0IDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDs7ICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCWlmICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgCisJCXRoZW4KKwkJCWVjaG8gIiRTWVNURU1fTkFNRSIKKwkJZWxzZQorCQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJCWZpCisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDs7CisgICAgKjpBSVg6KjpbNDU2XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgorCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKyAgICAgICAgICAgICAgICAgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKyAgICAgICAgICAgICAgICAgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisJCWZpCisJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgorCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisKKyAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCisgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgICAgICAgIH0KK0VPRgorCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKKwkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKKwkJZmkgOzsKKwllc2FjCisJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCisJdGhlbgorCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisKKwkgICAgIyBocHBhMi4wdy1ocC1ocHV4KiBoYXMgYSA2NC1iaXQga2VybmVsIGFuZCBhIGNvbXBpbGVyIGdlbmVyYXRpbmcKKwkgICAgIyAzMi1iaXQgY29kZS4gIGhwcGE2NC1ocC1ocHV4KiBoYXMgdGhlIHNhbWUga2VybmVsIGFuZCBhIGNvbXBpbGVyCisJICAgICMgZ2VuZXJhdGluZyA2NC1iaXQgY29kZS4gIEdOVSBhbmQgSFAgdXNlIGRpZmZlcmVudCBub21lbmNsYXR1cmU6CisJICAgICMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD1jYyAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGEyLjB3LWhwLWhwdXgxMS4yMworCSAgICAjICQgQ0NfRk9SX0JVSUxEPSJjYyArREEyLjB3IiAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGE2NC1ocC1ocHV4MTEuMjMKKworCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8CisJCWdyZXAgLXEgX19MUDY0X18KKwkgICAgdGhlbgorCQlIUF9BUkNIPSJocHBhMi4wdyIKKwkgICAgZWxzZQorCQlIUF9BUkNIPSJocHBhNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIGlhNjQ6SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgMzA1MCo6SEktVVg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQKKwltYWluICgpCisJeworCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKKwkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0CisJICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KKwkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKKwkgICAgeworCSAgICAgIHN3aXRjaCAoY3B1KQorCQl7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKKwkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7CisJICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZXhpdCAoMCk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgOzsKKyAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCisJZWNobyBocHBhMS4xLWhwLWJzZAorCWV4aXQgOzsKKyAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1ic2QKKwlleGl0IDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgOzsKKyAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtb3NmCisJZXhpdCA7OworICAgIGhwOD8/Ok9TRjE6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1vc2YKKwlleGl0IDs7CisgICAgaSo4NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCA7OworICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKKwllY2hvIGhwcGExLjEtaHAtbGl0ZXMKKwlleGl0IDs7CisgICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKKwllY2hvIGMxLWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorICAgICAgICBleGl0IDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisgICAgICAgIGV4aXQgOzsKKyAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorCWV4aXQgOzsKKyAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3BhcmMqOkJTRC9PUzoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6QlNEL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICBwYzk4KQorCQllY2hvIGkzODYtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICBhbWQ2NCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICAqKQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCWVzYWMKKwlleGl0IDs7CisgICAgaSo6Q1lHV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KKwlleGl0IDs7CisgICAgKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjp3aW5kb3dzMzIqOiopCisgICAgCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCA7OworICAgICo6SW50ZXJpeCo6WzM0NTZdKikKKyAgICAJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHg4NikKKwkJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgRU02NFQgfCBhdXRoZW50aWNhbWQgfCBnZW51aW5laW50ZWwpCisJCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBJQTY0KQorCQllY2hvIGlhNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJZXNhYyA7OworICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKKwllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcworCWV4aXQgOzsKKyAgICA4NjY0OldpbmRvd3NfTlQ6KikKKwllY2hvIHg4Nl82NC1wYy1ta3MKKwlleGl0IDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIC1xIGxkLnNvLjEKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDs7CisgICAgYXJtKjpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWlmIGVjaG8gX19BUk1fRUFCSV9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkgICAgfCBncmVwIC1xIF9fQVJNX0VBQklfXworCXRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVlYWJpCisJZmkKKwlleGl0IDs7CisgICAgYXZyMzIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyBjcmlzLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBmcnY6TGludXg6KjoqKQorICAgIAllY2hvIGZydi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251CisJZXhpdCA7OworICAgIGlhNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtMzJyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG02OCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtaXBzOkxpbnV4Oio6KiB8IG1pcHM2NDpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9CisJI3VuZGVmICR7VU5BTUVfTUFDSElORX1lbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPSR7VU5BTUVfTUFDSElORX1lbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9JHtVTkFNRV9NQUNISU5FfQorCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJworCSAgICAvXkNQVS97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgb3IzMjpMaW51eDoqOiopCisJZWNobyBvcjMyLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhZHJlOkxpbnV4Oio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQorCSMgTG9vayBmb3IgQ1BVIGxldmVsCisJY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KKwkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7CisJICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKKwllc2FjCisJZXhpdCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHNoKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB2YXg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtZ251CisJZXhpdCA7OworICAgIHg4Nl82NDpMaW51eDoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgeHRlbnNhKjpMaW51eDoqOiopCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQorCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCisJIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAorCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCisJZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpVTklYX1NWOjQuMk1QOjIuKikKKyAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCisgICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKKwkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCisgICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgOzsKKyAgICBpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgOzsKKyAgICBpKjg2Oio6NTpbNjc4XSopCisgICAgCSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCBhbmQgT3BlblNlcnZlciA2LgorCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCisJICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OworCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKKwkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6KjozLjI6KikKKwlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCisJCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKKwllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAorCQkoL2Jpbi91bmFtZSAtWHxncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudCAqSUknID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgorCWZpCisJZXhpdCA7OworICAgIHBjOio6KjoqKQorCSMgTGVmdCBoZXJlIGZvciBjb21wYXRpYmlsaXR5OgorICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAorICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgorCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKKwkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKKwkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KKwllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDs7CisgICAgSW50ZWw6TWFjaDozKjoqKQorCWVjaG8gaTM4Ni1wYy1tYWNoMworCWV4aXQgOzsKKyAgICBwYXJhZ29uOio6KjoqKQorCWVjaG8gaTg2MC1pbnRlbC1vc2YxCisJZXhpdCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDs7CisgICAgbWluaSo6Q1RJWDpTWVMqNToqKQorCSMgIm1pbmlmcmFtZSIKKwllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQorCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgTTY4MD8wOkQtTklYOjUuMzoqKQorCWVjaG8gbTY4ay1kaWFiLWRuaXgKKwlleGl0IDs7CisgICAgTTY4KjoqOlIzVls1Njc4XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgeyBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnOyBleGl0OyB9IDs7CisgICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCB8IFM3NTAxKjoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQorICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKyAgICAgICAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKKwlPU19SRUw9Jy4zJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgOzsKKyAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KKyAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAorICAgICAgICBleGl0IDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZXhpdCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJICAgIGkzODYpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJCSAgaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCSAgICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCSAgICAgIGdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJCSAgdGhlbgorCQkgICAgICBVTkFNRV9QUk9DRVNTT1I9Ing4Nl82NCIKKwkJICBmaQorCQlmaSA7OworCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UU5YOio6NCopCisJZWNobyBpMzg2LXBjLXFueAorCWV4aXQgOzsKKyAgICBOU0UtPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc2UtdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNSLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6Tm9uU3RvcC1VWDoqOiopCisJZWNobyBtaXBzLWNvbXBhcS1ub25zdG9wdXgKKwlleGl0IDs7CisgICAgQlMyMDAwOlBPU0lYKjoqOiopCisJZWNobyBiczIwMDAtc2llbWVucy1zeXN2CisJZXhpdCA7OworICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UGxhbjk6KjoqKQorCSMgInVuYW1lIC1tIiBpcyBub3QgY29uc2lzdGVudCwgc28gdXNlICRjcHV0eXBlIGluc3RlYWQuIDM4NgorCSMgaXMgY29udmVydGVkIHRvIGkzODYgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgeDg2CisJIyBvcGVyYXRpbmcgc3lzdGVtcy4KKwlpZiB0ZXN0ICIkY3B1dHlwZSIgPSAiMzg2IjsgdGhlbgorCSAgICBVTkFNRV9NQUNISU5FPWkzODYKKwllbHNlCisJICAgIFVOQU1FX01BQ0hJTkU9IiRjcHV0eXBlIgorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tcGxhbjkKKwlleGl0IDs7CisgICAgKjpUT1BTLTEwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCisJZXhpdCA7OworICAgICo6VEVORVg6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAorCWV4aXQgOzsKKyAgICBLUzEwOlRPUFMtMjA6KjoqIHwgS0wxMDpUT1BTLTIwOio6KiB8IFRZUEU0OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtZGVjLXRvcHMyMAorCWV4aXQgOzsKKyAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAteGtsLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKKwlleGl0IDs7CisgICAgKjpJVFM6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi1pdHMKKwlleGl0IDs7CisgICAgU0VJOio6KjpTRUlVWCkKKyAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKyAgICAJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7CisJICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OworCWVzYWMgOzsKKyAgICAqOlhFTklYOio6U3lzVikKKwllY2hvIGkzODYtcGMteGVuaXgKKwlleGl0IDs7CisgICAgaSo4Njpza3lvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJworCWV4aXQgOzsKKyAgICBpKjg2OnJkb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCisJZXhpdCA7OworICAgIGkqODY6QVJPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWFyb3MKKwlleGl0IDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCisgIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE5lWFQpCisjaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCisjZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCisjZW5kaWYKKyAgaW50IHZlcnNpb247CisgIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKKyAgaWYgKHZlcnNpb24gPCA0KQorICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGVsc2UKKyAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKKyNpZiBkZWZpbmVkIChVTUFYVikKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaWYgZGVmaW5lZCAoQ01VKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX18zODZCU0RfXykKKyAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoc2VxdWVudCkKKyNpZiBkZWZpbmVkIChpMzg2KQorICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKG5zMzIwMDApCisgIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCisgICAgc3RydWN0IHV0c25hbWUgdW47CisKKyAgICB1bmFtZSgmdW4pOworCisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgeworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKHZheCkKKyMgaWYgIWRlZmluZWQgKHVsdHJpeCkKKyMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgaWYgZGVmaW5lZCAoQlNEKQorIyAgIGlmIEJTRCA9PSA0MworICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKKyMgICBlbHNlCisjICAgIGlmIEJTRCA9PSAxOTkwMDYKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOworIyAgICBlbHNlCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQorICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworICBleGl0ICgxKTsKK30KK0VPRgorCiskQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQorCisjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCisKK2lmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCit0aGVuCisgICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KKyAgICBjMSopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGMyKikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMzgqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzQqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKK2FuZAorICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKK0lmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQorc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKK3BlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCitpbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCisKK2NvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCisKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAorCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAorL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCisKK1VOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9CitVTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQorVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQorVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KK0VPRgorCitleGl0IDEKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2J1aWxkLXNjcmlwdHMvY29uZmlnLnN1YiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWVjYzE4YgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNzAwIEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMDktMTAtMDcnCisKKyMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgorIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCisjIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0CisjIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIEdOVSBDaGFuZ2VMb2cgZW50cnkuCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgorIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKKyMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCisjIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcworIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgorIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucworIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKKyMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcworIyBjb25maWd1cmF0aW9uLgorCisjIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgorIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKKyAgICAgICAkMCBbT1BUSU9OXSBBTElBUworCitDYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCisKK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKzIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKKyAgICAgICBleGl0IDEgOzsKKworICAgICpsb2NhbCopCisgICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCisgICAgICAgZWNobyAkMQorICAgICAgIGV4aXQgOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgbGludXgtdWNsaWJjKiB8IFwKKyAgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICAqKQorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKKyAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KKyAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCisgICAgZWxzZSBvcz07IGZpCisgICAgOzsKK2VzYWMKKworIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCisjIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbworIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQorIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCitjYXNlICRvcyBpbgorCS1zdW4qb3MqKQorCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KKwkJOzsKKwktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAorCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAorCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCisJLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKKwktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAorCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAorCS1hcHBsZSB8IC1heGlzIHwgLWtudXRoIHwgLWNyYXkgfCAtbWljcm9ibGF6ZSkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKyAgICAgICAgLWJsdWVnZW5lKikKKwkgICAgICAgIG9zPS1jbmsKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgCS1jaG9ydXNyZGIpCisgCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKyAJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY282KQorCQlvcz0tc2NvNXY2CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNSkKKwkJb3M9LXNjbzMuMnY1CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNCkKKwkJb3M9LXNjbzMuMnY0CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4yLls0LTldKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMnZbNC05XSopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNXY2KikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgfCBhdnIzMiBcCisJfCBiZmluIFwKKwl8IGM0eCB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbG0zMiBcCisJfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKKwl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSB8IG1lcCB8IG1ldGFnIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NG9jdGVvbiB8IG1pcHM2NG9jdGVvbmVsIFwKKwl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjRyNTkwMCB8IG1pcHM2NHI1OTAwZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKKwl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKKwl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKKwl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKKwl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKKwl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCisJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCisJfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAorCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAorCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKKwl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtb3hpZSBcCisJfCBtdCBcCisJfCBtc3A0MzAgXAorCXwgbmlvcyB8IG5pb3MyIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCByeCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IHwgc3Ryb25nYXJtIFwKKwl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB2ODUwIHwgdjg1MGUgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeGMxNnggfCB4c2NhbGUgfCB4c2NhbGVlW2JsXSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCisJfCB6OGsgfCB6ODApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMiB8IHBpY29jaGlwKQorCQkjIE1vdG9yb2xhIDY4SEMxMS8xMi4KKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1ub25lCisJCTs7CisJbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCisJCTs7CisJbXMxKQorCQliYXNpY19tYWNoaW5lPW10LXVua25vd24KKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogfCBhdnIzMi0qIFwKKwl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIHwgYzU0eC0qIHwgYzU1eC0qIHwgYzZ4LSogXAorCXwgY2xpcHBlci0qIHwgY3JheW52LSogfCBjeWRyYS0qIFwKKwl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKKwl8IGVseHNpLSogXAorCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZmlkby0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAorCXwgaDgzMDAtKiB8IGg4NTAwLSogXAorCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKKwl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCisJfCBpcDJrLSogfCBpcTIwMDAtKiBcCisJfCBsbTMyLSogXAorCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiB8IG1ldGFnLSogfCBtaWNyb2JsYXplLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NG9jdGVvbi0qIHwgbWlwczY0b2N0ZW9uZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHI1OTAwLSogfCBtaXBzNjRyNTkwMGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzNjR2cjU5MDAtKiB8IG1pcHM2NHZyNTkwMGVsLSogXAorCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKKwl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtbWl4LSogXAorCXwgbXQtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBuaW9zLSogfCBuaW9zMi0qIFwKKwl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcm9tcC0qIHwgcnM2MDAwLSogfCByeC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjRdYS0qIHwgc2hbMjRdYWViLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAorCXwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiB8IHRodW1iLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogfCB0aWxlLSogXAorCXwgdHJvbi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogfCB4c2NhbGUtKiB8IHhzY2FsZWVbYmxdLSogXAorCXwgeHN0b3JteTE2LSogfCB4dGVuc2EqLSogXAorCXwgeW1wLSogXAorCXwgejhrLSogfCB6ODAtKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCisJeHRlbnNhKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKyAgICAJYWJhY3VzKQorCQliYXNpY19tYWNoaW5lPWFiYWN1cy11bmtub3duCisJCTs7CisJYWRvYmU2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCisJCW9zPS1zY291dAorCQk7OworCWFsbGlhbnQgfCBmeDgwKQorCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAorCQk7OworCWFsdG9zIHwgYWx0b3MzMDY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKKwkJOzsKKwlhbTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKKwkJb3M9LWJzZAorCQk7OworCWFtZDY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQk7OworCWFtZDY0LSopCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCTs7CisJYW1pZ2FvcyB8IGFtaWdhZG9zKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXBvbGxvNjhic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LWJzZAorCQk7OworCWFyb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tYXJvcworCQk7OworCWF1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCW9zPS1hdXgKKwkJOzsKKwliYWxhbmNlKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJYmxhY2tmaW4pCisJCWJhc2ljX21hY2hpbmU9YmZpbi11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCWJsYWNrZmluLSopCisJCWJhc2ljX21hY2hpbmU9YmZpbi1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwlibHVlZ2VuZSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LWNuaworCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisgICAgICAgIGNlZ2NjKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1jZWdjYworCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyYXludikKKwkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQorCQlvcz0tdW5pY29zbXAKKwkJOzsKKwljcjE2KQorCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJY3JkcyB8IHVub3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCisJCTs7CisJY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQorCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcworCQk7OworCWNyaXMgfCBjcmlzLSogfCBldHJheCopCisJCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCisJCTs7CisJY3J4KQorCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwlkYTMwIHwgZGEzMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAorCQk7OworCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKKwkJYmFzaWNfbWFjaGluZT1taXBzLWRlYworCQk7OworCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMxMAorCQk7OworCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMyMAorCQk7OworCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCisJICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQorCQk7OworCWRlbHRhODgpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQorCQlvcz0tc3lzdjMKKwkJOzsKKwlkaWNvcykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1kaWNvcworCQk7OworCWRqZ3BwKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJb3M9LW1zZG9zZGpncHAKKwkJOzsKKwlkcHgyMCB8IGRweDIwLSopCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKKwkJb3M9LWJvc3gKKwkJOzsKKwlkcHgyKiB8IGRweDIqLWJ1bGwpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MworCQk7OworCWVibW9uMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS1lYm1vbgorCQk7OworCWVseHNpKQorCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCisJCW9zPS1ic2QKKwkJOzsKKwllbmNvcmUgfCB1bWF4IHwgbW1heCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKKwkJOzsKKwllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJZ28zMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1nbzMyCisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWg4MzAweHJheSkKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS14cmF5CisJCTs7CisJaDg1MDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaGFycmlzKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1zeXN2MworCQk7OworCWhwMzAwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwMzAwYnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWJzZAorCQk7OworCWhwMzAwaHB1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ocHV4CisJCTs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlocHBhb3NmKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LW9zZgorCQk7OworCWhwcHJvKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LXByb2VsZgorCQk7OworCWkzNzAtaWJtKiB8IGlibSopCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJOzsKKyMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW02OGtub21tdSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJbTY4a25vbW11LSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKyAgICAgICAgbWljcm9ibGF6ZSkKKwkJYmFzaWNfbWFjaGluZT1taWNyb2JsYXplLXhpbGlueAorCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmd3MzJjZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tbWluZ3czMmNlCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXMxLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9wZW5yaXNjIHwgb3BlbnJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYXJpc2MpCisJCWJhc2ljX21hY2hpbmU9aHBwYS11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCXBhcmlzYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGEtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXJkb3MKKwkJOzsKKwlyb202OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJczM5MCB8IHMzOTAtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQorCQk7OworCXMzOTB4IHwgczM5MHgtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJOzsKKwlzYTI5MjAwKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlzYjEpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KKwkJOzsKKwlzYjFlbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCisJCTs7CisJc2RlKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKKwkJb3M9LWVsZgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNWVsKQorCQliYXNpY19tYWNoaW5lPXNoNWxlLXVua25vd24KKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3YxKQorCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlzeW1tZXRyeSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJdDNlKQorCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXQ5MCkKKwkJYmFzaWNfbWFjaGluZT10OTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdGljNTR4IHwgYzU0eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXggfCBjNTV4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4IHwgYzZ4KikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGlsZSopCisJCWJhc2ljX21hY2hpbmU9dGlsZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1jbmsqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKKwkgICAgICB8IC1rb3BlbnNvbGFyaXMqIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIHwgLWFyb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKKwkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogfCAtY2VnY2MqIFwKKwkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC1uZXdsaWIqIHwgLWxpbnV4LXVjbGliYyogXAorCSAgICAgIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKKwkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1ta3MqIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAorCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAorCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAorCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKKwkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqIHwgLXdpbmRpc3MqIFwKKwkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSogXAorCSAgICAgIHwgLXNreW9zKiB8IC1oYWlrdSogfCAtcmRvcyogfCAtdG9wcGVycyogfCAtZHJvcHMqIHwgLWVzKikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLXFueCopCisJCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkJICAgIHg4Ni0qIHwgaSo4Ni0qKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0tbnRvJG9zCisJCQk7OworCQllc2FjCisJCTs7CisJLW50by1xbngqKQorCQk7OworCS1udG8qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKKwkJOzsKKwktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCisJICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiB8IC1oYWlrdSogXAorCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCisJCTs7CisJLW1hYyopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKKwkJOzsKKwktbGludXgtZGlldGxpYmMpCisJCW9zPS1saW51eC1kaWV0bGliYworCQk7OworCS1saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwktc3Vub3M1KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAorCQk7OworCS1zdW5vczYqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCisJCTs7CisJLW9wZW5lZCopCisJCW9zPS1vcGVuZWRpdGlvbgorCQk7OworICAgICAgICAtb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWF0aGVvcyopCisJCW9zPS1hdGhlb3MKKwkJOzsKKwktc3lsbGFibGUqKQorCQlvcz0tc3lsbGFibGUKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5vdmEqKQorCQlvcz0tcnRtay1ub3ZhCisJCTs7CisJLW5zMiApCisJCW9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisgICAgICAgIC10cGYqKQorCQlvcz0tdHBmCisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLWthb3MqKQorCQlvcz0ta2FvcworCQk7OworCS16dm1vZSkKKwkJb3M9LXp2bW9lCisJCTs7CisJLWRpY29zKikKKwkJb3M9LWRpY29zCisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKyAgICAgICAgc2NvcmUtKikKKwkJb3M9LWVsZgorCQk7OworICAgICAgICBzcHUtKikKKwkJb3M9LWVsZgorCQk7OworCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisgICAgICAgIGM0eC0qIHwgdGljNHgtKikKKyAgICAgICAgCW9zPS1jb2ZmCisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgorCXBkcDEwLSopCisJCW9zPS10b3BzMjAKKwkJOzsKKwlwZHAxMS0qKQorCQlvcz0tbm9uZQorCQk7OworCSotZGVjIHwgdmF4LSopCisJCW9zPS11bHRyaXg0LjIKKwkJOzsKKwltNjgqLWFwb2xsbykKKwkJb3M9LWRvbWFpbgorCQk7OworCWkzODYtc3VuKQorCQlvcz0tc3Vub3M0LjAuMgorCQk7OworCW02ODAwMC1zdW4pCisJCW9zPS1zdW5vczMKKwkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCisJCSMgZGVmYXVsdC4KKwkJIyBvcz0tc3Vub3M0CisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKyAgICAgICAgbWVwLSopCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKyAgICAJKi1rbnV0aCkKKwkJb3M9LW1taXh3YXJlCisJCTs7CisJKi13ZWMpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLXdpbmJvbmQpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLW9raSkKKwkJb3M9LXByb2VsZgorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCSotZ291bGQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworCSotc2dpKQorCQlvcz0taXJpeAorCQk7OworCSotc2llbWVucykKKwkJb3M9LXN5c3Y0CisJCTs7CisJKi1tYXNzY29tcCkKKwkJb3M9LXJ0dQorCQk7OworCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKKwkJb3M9LXV4cHYKKwkJOzsKKwkqLXJvbTY4aykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLSpidWcpCisJCW9zPS1jb2ZmCisJCTs7CisJKi1hcHBsZSkKKwkJb3M9LW1hY29zCisJCTs7CisJKi1hdGFyaSopCisJCW9zPS1taW50CisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1jbmsqfC1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWJlb3MqKQorCQkJCXZlbmRvcj1iZQorCQkJCTs7CisJCQktaHB1eCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1tcGVpeCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1oaXV4KikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktdW5vcyopCisJCQkJdmVuZG9yPWNyZHMKKwkJCQk7OworCQkJLWRndXgqKQorCQkJCXZlbmRvcj1kZworCQkJCTs7CisJCQktbHVuYSopCisJCQkJdmVuZG9yPW9tcm9uCisJCQkJOzsKKwkJCS1nZW5peCopCisJCQkJdmVuZG9yPW5zCisJCQkJOzsKKwkJCS1tdnMqIHwgLW9wZW5lZCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktb3M0MDAqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXRwZiopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQorCQkJCXZlbmRvcj13cnMKKwkJCQk7OworCQkJLWF1eCopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS1obXMqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS1tcHcqIHwgLW1hY29zKikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJCQl2ZW5kb3I9YXRhcmkKKwkJCQk7OworCQkJLXZvcyopCisJCQkJdmVuZG9yPXN0cmF0dXMKKwkJCQk7OworCQllc2FjCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCisJCTs7Citlc2FjCisKK2VjaG8gJGJhc2ljX21hY2hpbmUkb3MKK2V4aXQKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2J1aWxkLXNjcmlwdHMvZmF0YnVpbGQuc2ggYi9kaXN0cmliL3NkbC0xLjIuMTUvYnVpbGQtc2NyaXB0cy9mYXRidWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Yjk5YzFkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2J1aWxkLXNjcmlwdHMvZmF0YnVpbGQuc2gKQEAgLTAsMCArMSwzMTAgQEAKKyMhL2Jpbi9zaAorIworIyBCdWlsZCBhIGZhdCBiaW5hcnkgb24gTWFjIE9TIFgsIHRoYW5rcyBSeWFuIQorCisjIE51bWJlciBvZiBDUFVzIChmb3IgbWFrZSAtaikKK05DUFU9YHN5c2N0bCAtbiBody5uY3B1YAoraWYgdGVzdCB4JE5KT0IgPSB4OyB0aGVuCisgICAgTkpPQj0kTkNQVQorZmkKKworIyBTREsgcGF0aAoraWYgdGVzdCB4JFNES19QQVRIID0geDsgdGhlbgorICAgIFNES19QQVRIPS9EZXZlbG9wZXIvU0RLcworZmkKKworIyBHZW5lcmljLCBjcm9zcy1wbGF0Zm9ybSBDRkxBR1MgeW91IGFsd2F5cyB3YW50IGdvIGhlcmUuCitDRkxBR1M9Ii1PMyAtZyAtcGlwZSIKKworIyBXZSBkeW5hbWljYWxseSBsb2FkIFgxMSwgc28gdXNpbmcgdGhlIHN5c3RlbSBYMTEgaGVhZGVycyBpcyBmaW5lLgorQkFTRV9DT05GSUdfRkxBR1M9Ii0tYnVpbGQ9YHVuYW1lIC1wYC1hcHBsZS1kYXJ3aW4gXAorLS14LWluY2x1ZGVzPS91c3IvWDExUjYvaW5jbHVkZSAtLXgtbGlicmFyaWVzPS91c3IvWDExUjYvbGliIgorCisjIFBvd2VyUEMgMzItYml0IGNvbXBpbGVyIGZsYWdzCitDT05GSUdfUFBDPSItLWhvc3Q9cG93ZXJwYy1hcHBsZS1kYXJ3aW4iCitDQ19QUEM9ImdjYy00LjAiCitDWFhfUFBDPSJnKystNC4wIgorQlVJTERfRkxBR1NfUFBDPSItYXJjaCBwcGMgLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuNCIKKworIyBJbnRlbCAzMi1iaXQgY29tcGlsZXIgZmxhZ3MKK0NPTkZJR19YODY9Ii0taG9zdD1pMzg2LWFwcGxlLWRhcndpbiIKK0NDX1g4Nj0iZ2NjIgorQ1hYX1g4Nj0iZysrIgorQlVJTERfRkxBR1NfWDg2PSItYXJjaCBpMzg2IC1tbWFjb3N4LXZlcnNpb24tbWluPTEwLjQiCisKKyMgSW50ZWwgNjQtYml0IGNvbXBpbGVyIGZsYWdzCitDT05GSUdfWDY0PSItLWhvc3Q9eDg2XzY0LWFwcGxlLWRhcndpbiIKK0NDX1g2ND0iZ2NjIgorQ1hYX1g2ND0iZysrIgorQlVJTERfRkxBR1NfWDY0PSItYXJjaCB4ODZfNjQgLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuNiIKKworIworIyBGaW5kIHRoZSBjb25maWd1cmUgc2NyaXB0CisjCitzcmNkaXI9YGRpcm5hbWUgJDBgLy4uCithdXhkaXI9JHNyY2Rpci9idWlsZC1zY3JpcHRzCitjZCAkc3JjZGlyCisKK2FsbG93X3BwYz0ieWVzIgord2hpY2ggZ2NjLTQuMCA+L2Rldi9udWxsIDI+L2Rldi9udWxsCitpZiBbICJ4JD8iID0gIngxIiBdOyB0aGVuCisgICAgI2VjaG8gIldBUk5JTkc6IENhbid0IGZpbmQgZ2NjLTQuMCwgd2hpY2ggbWVhbnMgeW91IGRvbid0IGhhdmUgWGNvZGUgMy4iCisgICAgI2VjaG8gIldBUk5JTkc6IFRoZXJlZm9yZSwgd2UgY2FuJ3QgZG8gUG93ZXJQQyBzdXBwb3J0LiIKKyAgICBhbGxvd19wcGM9Im5vIgorZmkKKworIworIyBGaWd1cmUgb3V0IHdoaWNoIHBoYXNlIHRvIGJ1aWxkOgorIyBhbGwsCisjIGNvbmZpZ3VyZSwgY29uZmlndXJlLXBwYywgY29uZmlndXJlLXg4NiwgY29uZmlndXJlLXg2NAorIyBtYWtlLCBtYWtlLXBwYywgbWFrZS14ODYsIG1ha2UteDY0LCBtZXJnZQorIyBpbnN0YWxsCisjIGNsZWFuCitpZiB0ZXN0IHgiJDEiID0geDsgdGhlbgorICAgIHBoYXNlPWFsbAorZWxzZQorICAgIHBoYXNlPSIkMSIKK2ZpCitjYXNlICRwaGFzZSBpbgorICAgIGFsbCkKKyAgICAgICAgY29uZmlndXJlX3BwYz0iJGFsbG93X3BwYyIKKyAgICAgICAgY29uZmlndXJlX3g4Nj0ieWVzIgorICAgICAgICBjb25maWd1cmVfeDY0PSJ5ZXMiCisgICAgICAgIG1ha2VfcHBjPSIkYWxsb3dfcHBjIgorICAgICAgICBtYWtlX3g4Nj0ieWVzIgorICAgICAgICBtYWtlX3g2ND0ieWVzIgorICAgICAgICBtZXJnZT0ieWVzIgorICAgICAgICA7OworICAgIGNvbmZpZ3VyZSkKKyAgICAgICAgY29uZmlndXJlX3BwYz0iJGFsbG93X3BwYyIKKyAgICAgICAgY29uZmlndXJlX3g4Nj0ieWVzIgorICAgICAgICBjb25maWd1cmVfeDY0PSJ5ZXMiCisgICAgICAgIDs7CisgICAgY29uZmlndXJlLXBwYykKKyAgICAgICAgY29uZmlndXJlX3BwYz0iJGFsbG93X3BwYyIKKyAgICAgICAgOzsKKyAgICBjb25maWd1cmUteDg2KQorICAgICAgICBjb25maWd1cmVfeDg2PSJ5ZXMiCisgICAgICAgIDs7CisgICAgY29uZmlndXJlLXg2NCkKKyAgICAgICAgY29uZmlndXJlX3g2ND0ieWVzIgorICAgICAgICA7OworICAgIG1ha2UpCisgICAgICAgIG1ha2VfcHBjPSIkYWxsb3dfcHBjIgorICAgICAgICBtYWtlX3g4Nj0ieWVzIgorICAgICAgICBtYWtlX3g2ND0ieWVzIgorICAgICAgICBtZXJnZT0ieWVzIgorICAgICAgICA7OworICAgIG1ha2UtcHBjKQorICAgICAgICBtYWtlX3BwYz0iJGFsbG93X3BwYyIKKyAgICAgICAgOzsKKyAgICBtYWtlLXg4NikKKyAgICAgICAgbWFrZV94ODY9InllcyIKKyAgICAgICAgOzsKKyAgICBtYWtlLXg2NCkKKyAgICAgICAgbWFrZV94NjQ9InllcyIKKyAgICAgICAgOzsKKyAgICBtZXJnZSkKKyAgICAgICAgbWVyZ2U9InllcyIKKyAgICAgICAgOzsKKyAgICBpbnN0YWxsKQorICAgICAgICBpbnN0YWxsX2Jpbj0ieWVzIgorICAgICAgICBpbnN0YWxsX2hkcnM9InllcyIKKyAgICAgICAgaW5zdGFsbF9saWI9InllcyIKKyAgICAgICAgaW5zdGFsbF9kYXRhPSJ5ZXMiCisgICAgICAgIGluc3RhbGxfbWFuPSJ5ZXMiCisgICAgICAgIDs7CisgICAgaW5zdGFsbC1iaW4pCisgICAgICAgIGluc3RhbGxfYmluPSJ5ZXMiCisgICAgICAgIDs7CisgICAgaW5zdGFsbC1oZHJzKQorICAgICAgICBpbnN0YWxsX2hkcnM9InllcyIKKyAgICAgICAgOzsKKyAgICBpbnN0YWxsLWxpYikKKyAgICAgICAgaW5zdGFsbF9saWI9InllcyIKKyAgICAgICAgOzsKKyAgICBpbnN0YWxsLWRhdGEpCisgICAgICAgIGluc3RhbGxfZGF0YT0ieWVzIgorICAgICAgICA7OworICAgIGluc3RhbGwtbWFuKQorICAgICAgICBpbnN0YWxsX21hbj0ieWVzIgorICAgICAgICA7OworICAgIGNsZWFuKQorICAgICAgICBjbGVhbl9wcGM9InllcyIKKyAgICAgICAgY2xlYW5feDg2PSJ5ZXMiCisgICAgICAgIGNsZWFuX3g2ND0ieWVzIgorICAgICAgICA7OworICAgIGNsZWFuLXBwYykKKyAgICAgICAgY2xlYW5fcHBjPSJ5ZXMiCisgICAgICAgIDs7CisgICAgY2xlYW4teDg2KQorICAgICAgICBjbGVhbl94ODY9InllcyIKKyAgICAgICAgOzsKKyAgICBjbGVhbi14NjQpCisgICAgICAgIGNsZWFuX3g2ND0ieWVzIgorICAgICAgICA7OworICAgICopCisgICAgICAgIGVjaG8gIlVzYWdlOiAkMCBbYWxsfGNvbmZpZ3VyZVstcHBjfC14ODZ8LXg2NF18bWFrZVstcHBjfC14ODZ8LXg2NF18bWVyZ2V8aW5zdGFsbHxjbGVhblstcHBjfC14ODZ8LXg2NF1dIgorICAgICAgICBleGl0IDEKKyAgICAgICAgOzsKK2VzYWMKK2Nhc2UgYHVuYW1lIC1wYCBpbgorICAgICo4NikKKyAgICAgICAgbmF0aXZlX3BhdGg9eDg2CisgICAgICAgIDs7CisgICAgKnBvd2VycGMpCisgICAgICAgIG5hdGl2ZV9wYXRoPXBwYworICAgICAgICA7OworICAgIHg4Nl82NCkKKyAgICAgICAgbmF0aXZlX3BhdGg9eDY0CisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgZWNobyAiQ291bGRuJ3QgZmlndXJlIG91dCBuYXRpdmUgYXJjaGl0ZWN0dXJlIHBhdGgiCisgICAgICAgIGV4aXQgMQorICAgICAgICA7OworZXNhYworCisjCisjIENyZWF0ZSB0aGUgYnVpbGQgZGlyZWN0b3JpZXMKKyMKK2ZvciBkaXIgaW4gYnVpbGQgYnVpbGQvcHBjIGJ1aWxkL3g4NiBidWlsZC94NjQ7IGRvCisgICAgaWYgdGVzdCAtZCAkZGlyOyB0aGVuCisgICAgICAgIDoKKyAgICBlbHNlCisgICAgICAgIG1rZGlyICRkaXIgfHwgZXhpdCAxCisgICAgZmkKK2RvbmUKKworCisjCisjIEJ1aWxkIHRoZSBQb3dlclBDIDMyLWJpdCBiaW5hcnkKKyMKK2lmIHRlc3QgeCRjb25maWd1cmVfcHBjID0geHllczsgdGhlbgorICAgIChjZCBidWlsZC9wcGMgJiYgXAorICAgICBzaCAuLi8uLi9jb25maWd1cmUgJEJBU0VfQ09ORklHX0ZMQUdTICRDT05GSUdfUFBDIENDPSIkQ0NfUFBDIiBDWFg9IiRDWFhfUFBDIiBDRkxBR1M9IiRDRkxBR1MgJEJVSUxEX0ZMQUdTX1BQQyAkQ0ZMQUdTX1BQQyIgTERGTEFHUz0iJEJVSUxEX0ZMQUdTX1BQQyAkTEZMQUdTX1BQQyIpIHx8IGV4aXQgMgorZmkKK2lmIHRlc3QgeCRtYWtlX3BwYyA9IHh5ZXM7IHRoZW4KKyAgICAoY2QgYnVpbGQvcHBjICYmIG1ha2UgLWokTkpPQikgfHwgZXhpdCAzCitmaQorIworIyBCdWlsZCB0aGUgSW50ZWwgMzItYml0IGJpbmFyeQorIworaWYgdGVzdCB4JGNvbmZpZ3VyZV94ODYgPSB4eWVzOyB0aGVuCisgICAgKGNkIGJ1aWxkL3g4NiAmJiBcCisgICAgIHNoIC4uLy4uL2NvbmZpZ3VyZSAkQkFTRV9DT05GSUdfRkxBR1MgJENPTkZJR19YODYgQ0M9IiRDQ19YODYiIENYWD0iJENYWF9YODYiIENGTEFHUz0iJENGTEFHUyAkQlVJTERfRkxBR1NfWDg2ICRDRkxBR1NfWDg2IiBMREZMQUdTPSIkQlVJTERfRkxBR1NfWDg2ICRMRkxBR1NfWDg2IikgfHwgZXhpdCAyCitmaQoraWYgdGVzdCB4JG1ha2VfeDg2ID0geHllczsgdGhlbgorICAgIChjZCBidWlsZC94ODYgJiYgbWFrZSAtaiROSk9CKSB8fCBleGl0IDMKK2ZpCisKKyMKKyMgQnVpbGQgdGhlIEludGVsIDY0LWJpdCBiaW5hcnkKKyMKK2lmIHRlc3QgeCRjb25maWd1cmVfeDY0ID0geHllczsgdGhlbgorICAgIChjZCBidWlsZC94NjQgJiYgXAorICAgICBzaCAuLi8uLi9jb25maWd1cmUgJEJBU0VfQ09ORklHX0ZMQUdTICRDT05GSUdfWDY0IENDPSIkQ0NfWDY0IiBDWFg9IiRDWFhfWDY0IiBDRkxBR1M9IiRDRkxBR1MgJEJVSUxEX0ZMQUdTX1g2NCAkQ0ZMQUdTX1g2NCIgTERGTEFHUz0iJEJVSUxEX0ZMQUdTX1g2NCAkTEZMQUdTX1g2NCIpIHx8IGV4aXQgMgorZmkKK2lmIHRlc3QgeCRtYWtlX3g2NCA9IHh5ZXM7IHRoZW4KKyAgICAoY2QgYnVpbGQveDY0ICYmIG1ha2UgLWokTkpPQikgfHwgZXhpdCAzCitmaQorCisjCisjIENvbWJpbmUgaW50byBmYXQgYmluYXJ5CisjCitpZiB0ZXN0IHgkbWVyZ2UgPSB4eWVzOyB0aGVuCisgICAgb3V0cHV0PS5saWJzCisgICAgc2ggJGF1eGRpci9ta2luc3RhbGxkaXJzIGJ1aWxkLyRvdXRwdXQKKyAgICBjZCBidWlsZAorICAgIHRhcmdldD1gZmluZCAuIC1taW5kZXB0aCA0IC1tYXhkZXB0aCA0IC10eXBlIGYgLW5hbWUgJyouZHlsaWInIHwgaGVhZCAtMSB8IHNlZCAnc3wuKi98fCdgCisgICAgKGxpcG8gLWNyZWF0ZSAtbyAkb3V0cHV0LyR0YXJnZXQgYGZpbmQgLiAtbWluZGVwdGggNCAtbWF4ZGVwdGggNCAtdHlwZSBmIC1uYW1lICIqLmR5bGliImAgJiYKKyAgICAgbG4gLXNmICR0YXJnZXQgJG91dHB1dC9saWJTREwuZHlsaWIgJiYKKyAgICAgbGlwbyAtY3JlYXRlIC1vICRvdXRwdXQvbGliU0RMLmEgKi9idWlsZC8ubGlicy9saWJTREwuYSAmJgorICAgICBjcCAkbmF0aXZlX3BhdGgvYnVpbGQvLmxpYnMvbGliU0RMLmxhICRvdXRwdXQgJiYKKyAgICAgY3AgJG5hdGl2ZV9wYXRoL2J1aWxkLy5saWJzL2xpYlNETC5sYWkgJG91dHB1dCAmJgorICAgICBjcCAkbmF0aXZlX3BhdGgvYnVpbGQvbGliU0RMLmxhIC4gJiYKKyAgICAgbGlwbyAtY3JlYXRlIC1vICRvdXRwdXQvbGliU0RMbWFpbi5hICovYnVpbGQvLmxpYnMvbGliU0RMbWFpbi5hICYmCisgICAgIGNwICRuYXRpdmVfcGF0aC9idWlsZC8ubGlicy9saWJTRExtYWluLmxhICRvdXRwdXQgJiYKKyAgICAgY3AgJG5hdGl2ZV9wYXRoL2J1aWxkLy5saWJzL2xpYlNETG1haW4ubGFpICRvdXRwdXQgJiYKKyAgICAgY3AgJG5hdGl2ZV9wYXRoL2J1aWxkL2xpYlNETG1haW4ubGEgLiAmJgorICAgICBlY2hvICJCdWlsZCBjb21wbGV0ZSEiICYmCisgICAgIGVjaG8gIkZpbGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LiIpIHx8IGV4aXQgNAorICAgIGNkIC4uCitmaQorCisjCisjIEluc3RhbGwKKyMKK2RvX2luc3RhbGwoKQoreworICAgIGVjaG8gJCoKKyAgICAkKiB8fCBleGl0IDUKK30KK2lmIHRlc3QgeCRwcmVmaXggPSB4OyB0aGVuCisgICAgcHJlZml4PS91c3IvbG9jYWwKK2ZpCitpZiB0ZXN0IHgkZXhlY19wcmVmaXggPSB4OyB0aGVuCisgICAgZXhlY19wcmVmaXg9JHByZWZpeAorZmkKK2lmIHRlc3QgeCRiaW5kaXIgPSB4OyB0aGVuCisgICAgYmluZGlyPSRleGVjX3ByZWZpeC9iaW4KK2ZpCitpZiB0ZXN0IHgkbGliZGlyID0geDsgdGhlbgorICAgIGxpYmRpcj0kZXhlY19wcmVmaXgvbGliCitmaQoraWYgdGVzdCB4JGluY2x1ZGVkaXIgPSB4OyB0aGVuCisgICAgaW5jbHVkZWRpcj0kcHJlZml4L2luY2x1ZGUKK2ZpCitpZiB0ZXN0IHgkZGF0YWRpciA9IHg7IHRoZW4KKyAgICBkYXRhZGlyPSRwcmVmaXgvc2hhcmUKK2ZpCitpZiB0ZXN0IHgkbWFuZGlyID0geDsgdGhlbgorICAgIG1hbmRpcj0kcHJlZml4L21hbgorZmkKK2lmIHRlc3QgeCRpbnN0YWxsX2JpbiA9IHh5ZXM7IHRoZW4KKyAgICBkb19pbnN0YWxsIHNoICRhdXhkaXIvbWtpbnN0YWxsZGlycyAkYmluZGlyCisgICAgZG9faW5zdGFsbCAvdXNyL2Jpbi9pbnN0YWxsIC1jIC1tIDc1NSBidWlsZC8kbmF0aXZlX3BhdGgvc2RsLWNvbmZpZyAkYmluZGlyL3NkbC1jb25maWcKK2ZpCitpZiB0ZXN0IHgkaW5zdGFsbF9oZHJzID0geHllczsgdGhlbgorICAgIGRvX2luc3RhbGwgc2ggJGF1eGRpci9ta2luc3RhbGxkaXJzICRpbmNsdWRlZGlyL1NETAorICAgIGZvciBzcmMgaW4gJHNyY2Rpci9pbmNsdWRlLyouaDsgZG8gXAorICAgICAgICBmaWxlPWBlY2hvICRzcmMgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKyAgICAgICAgZG9faW5zdGFsbCAvdXNyL2Jpbi9pbnN0YWxsIC1jIC1tIDY0NCAkc3JjICRpbmNsdWRlZGlyL1NETC8kZmlsZTsgXAorICAgIGRvbmUKKyAgICBkb19pbnN0YWxsIC91c3IvYmluL2luc3RhbGwgLWMgLW0gNjQ0ICRzcmNkaXIvaW5jbHVkZS9TRExfY29uZmlnX21hY29zeC5oICRpbmNsdWRlZGlyL1NETC9TRExfY29uZmlnLmgKK2ZpCitpZiB0ZXN0IHgkaW5zdGFsbF9saWIgPSB4eWVzOyB0aGVuCisgICAgZG9faW5zdGFsbCBzaCAkYXV4ZGlyL21raW5zdGFsbGRpcnMgJGxpYmRpcgorICAgIGRvX2luc3RhbGwgc2ggYnVpbGQvJG5hdGl2ZV9wYXRoL2xpYnRvb2wgLS1tb2RlPWluc3RhbGwgL3Vzci9iaW4vaW5zdGFsbCAtYyAgYnVpbGQvbGliU0RMLmxhICRsaWJkaXIvbGliU0RMLmxhCisgICAgZG9faW5zdGFsbCBzaCBidWlsZC8kbmF0aXZlX3BhdGgvbGlidG9vbCAtLW1vZGU9aW5zdGFsbCAvdXNyL2Jpbi9pbnN0YWxsIC1jICBidWlsZC9saWJTRExtYWluLmxhICRsaWJkaXIvbGliU0RMbWFpbi5sYQorZmkKK2lmIHRlc3QgeCRpbnN0YWxsX2RhdGEgPSB4eWVzOyB0aGVuCisgICAgZG9faW5zdGFsbCBzaCAkYXV4ZGlyL21raW5zdGFsbGRpcnMgJGRhdGFkaXIvYWNsb2NhbAorICAgIGRvX2luc3RhbGwgL3Vzci9iaW4vaW5zdGFsbCAtYyAtbSA2NDQgJHNyY2Rpci9zZGwubTQgJGRhdGFkaXIvYWNsb2NhbC9zZGwubTQKKyAgICBkb19pbnN0YWxsIHNoICRhdXhkaXIvbWtpbnN0YWxsZGlycyAkbGliZGlyL3BrZ2NvbmZpZworICAgIGRvX2luc3RhbGwgL3Vzci9iaW4vaW5zdGFsbCAtbSA2NDQgYnVpbGQvJG5hdGl2ZV9wYXRoL3NkbC5wYyAkbGliZGlyL3BrZ2NvbmZpZy9zZGwucGMKK2ZpCitpZiB0ZXN0IHgkaW5zdGFsbF9tYW4gPSB4eWVzOyB0aGVuCisgICAgZG9faW5zdGFsbCBzaCAkYXV4ZGlyL21raW5zdGFsbGRpcnMgJG1hbmRpci9tYW4zCisgICAgZm9yIHNyYyBpbiAkc3JjZGlyL2RvY3MvbWFuMy8qLjM7IGRvIFwKKyAgICAgICAgZmlsZT1gZWNobyAkc3JjIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCisgICAgICAgIGRvX2luc3RhbGwgL3Vzci9iaW4vaW5zdGFsbCAtYyAtbSA2NDQgJHNyYyAkbWFuZGlyL21hbjMvJGZpbGU7IFwKKyAgICBkb25lCitmaQorCisjCisjIENsZWFuIHVwCisjCitkb19jbGVhbigpCit7CisgICAgZWNobyAkKgorICAgICQqIHx8IGV4aXQgNgorfQoraWYgdGVzdCB4JGNsZWFuX3BwYyA9IHh5ZXM7IHRoZW4KKyAgICBkb19jbGVhbiBybSAtciBidWlsZC9wcGMKK2ZpCitpZiB0ZXN0IHgkY2xlYW5feDg2ID0geHllczsgdGhlbgorICAgIGRvX2NsZWFuIHJtIC1yIGJ1aWxkL3g4NgorZmkKK2lmIHRlc3QgeCRjbGVhbl94NjQgPSB4eWVzOyB0aGVuCisgICAgZG9fY2xlYW4gcm0gLXIgYnVpbGQveDY0CitmaQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2J1aWxkLXNjcmlwdHMvaW5zdGFsbC1zaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWE4MzUzNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL2luc3RhbGwtc2gKQEAgLTAsMCArMSwzMjMgQEAKKyMhL2Jpbi9zaAorIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKworc2NyaXB0dmVyc2lvbj0yMDA1LTAyLTAyLjIxCisKKyMgVGhpcyBvcmlnaW5hdGVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCksIHdoaWNoIHdhcworIyBsYXRlciByZWxlYXNlZCBpbiBYMTFSNiAoeGMvY29uZmlnL3V0aWwvaW5zdGFsbC5zaCkgd2l0aCB0aGUKKyMgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk0IFggQ29uc29ydGl1bQorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisjIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bworIyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQorIyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyMgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisjIFggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDLQorIyBUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIworIyBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdAorIyBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KKyMgaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29yLQorIyB0aXVtLgorIworIworIyBGU0YgY2hhbmdlcyB0byB0aGlzIGZpbGUgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgorIworIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAorIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAorIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgorIworIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCisjIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCisjIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgorCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgorCisjIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KKworbXZwcm9nPSIke01WUFJPRy1tdn0iCitjcHByb2c9IiR7Q1BQUk9HLWNwfSIKK2NobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgorY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCitjaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKK3N0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igorcm1wcm9nPSIke1JNUFJPRy1ybX0iCitta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKKworY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKK2Nob3duY21kPQorY2hncnBjbWQ9CitzdHJpcGNtZD0KK3JtY21kPSIkcm1wcm9nIC1mIgorbXZjbWQ9IiRtdnByb2ciCitzcmM9Citkc3Q9CitkaXJfYXJnPQorZHN0YXJnPQorbm9fdGFyZ2V0X2RpcmVjdG9yeT0KKwordXNhZ2U9IlVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQorICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQorICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgorICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCisKK0luIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCitJbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KK0luIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KKworT3B0aW9uczoKKy1jICAgICAgICAgKGlnbm9yZWQpCistZCAgICAgICAgIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGluc3RhbGxpbmcgZmlsZXMuCistZyBHUk9VUCAgICRjaGdycHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIEdST1VQLgorLW0gTU9ERSAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgorLW8gVVNFUiAgICAkY2hvd25wcm9nIGluc3RhbGxlZCBmaWxlcyB0byBVU0VSLgorLXMgICAgICAgICAkc3RyaXBwcm9nIGluc3RhbGxlZCBmaWxlcy4KKy10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KKy1UICAgICAgICAgcmVwb3J0IGFuIGVycm9yIGlmIERTVEZJTEUgaXMgYSBkaXJlY3RvcnkuCistLWhlbHAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0LgorLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgorICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDUFBST0cgTUtESVJQUk9HIE1WUFJPRyBSTVBST0cgU1RSSVBQUk9HCisiCisKK3doaWxlIHRlc3QgLW4gIiQxIjsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1jKSBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtZCkgZGlyX2FyZz10cnVlCisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKKyAgICAgICAgc2hpZnQKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKKworICAgIC1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKyAgICAgICAgc2hpZnQKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorICAgICAgICBzaGlmdAorICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZworICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtdCkgZHN0YXJnPSQyCisJc2hpZnQKKwlzaGlmdAorCWNvbnRpbnVlOzsKKworICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWUKKwlzaGlmdAorCWNvbnRpbnVlOzsKKworICAgIC0tdmVyc2lvbikgZWNobyAiJDAgJHNjcmlwdHZlcnNpb24iOyBleGl0ICQ/OzsKKworICAgICopICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KKwkjIFdoZW4gLXQgaXMgdXNlZCwgdGhlIGRlc3RpbmF0aW9uIGlzIGFscmVhZHkgc3BlY2lmaWVkLgorCXRlc3QgLW4gIiRkaXJfYXJnJGRzdGFyZyIgJiYgYnJlYWsKKyAgICAgICAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgorCWZvciBhcmcKKwlkbworICAgICAgICAgIGlmIHRlc3QgLW4gIiRkc3RhcmciOyB0aGVuCisJICAgICMgJEAgaXMgbm90IGVtcHR5OiBpdCBjb250YWlucyBhdCBsZWFzdCAkYXJnLgorCSAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdGFyZyIKKwkgICAgc2hpZnQgIyBmbm9yZAorCSAgZmkKKwkgIHNoaWZ0ICMgYXJnCisJICBkc3Rhcmc9JGFyZworCWRvbmUKKwlicmVhazs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAteiAiJDEiOyB0aGVuCisgIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgorICAgIGV4aXQgMQorICBmaQorICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KKyAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KKyAgZXhpdCAwCitmaQorCitmb3Igc3JjCitkbworICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCisgIGNhc2UgJHNyYyBpbgorICAgIC0qKSBzcmM9Li8kc3JjIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIHNyYz0KKworICAgIGlmIHRlc3QgLWQgIiRkc3QiOyB0aGVuCisgICAgICBta2RpcmNtZD06CisgICAgICBjaG1vZGNtZD0KKyAgICBlbHNlCisgICAgICBta2RpcmNtZD0kbWtkaXJwcm9nCisgICAgZmkKKyAgZWxzZQorICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0YXJnIjsgdGhlbgorICAgICAgZWNobyAiJDA6IG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4iID4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGRzdD0kZHN0YXJnCisgICAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICAgIGNhc2UgJGRzdCBpbgorICAgICAgLSopIGRzdD0uLyRkc3QgOzsKKyAgICBlc2FjCisKKyAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCisgICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KKyAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCisJZWNobyAiJDA6ICRkc3Rhcmc6IElzIGEgZGlyZWN0b3J5IiA+JjIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgICBkc3Q9JGRzdC9gYmFzZW5hbWUgIiRzcmMiYAorICAgIGZpCisgIGZpCisKKyAgIyBUaGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQuCisgIGRzdGRpcj1gZWNobyAiJGRzdCIgfCBzZWQgLWUgJ3MsLyokLCw7cyxbXi9dKiQsLDtzLC8qJCwsO3MsXiQsLiwnYAorCisgICMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisKKyAgIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KKyAgaWYgdGVzdCAhIC1kICIkZHN0ZGlyIjsgdGhlbgorICAgIGRlZmF1bHRJRlM9JworCSAnCisgICAgSUZTPSIke0lGUy0kZGVmYXVsdElGU30iCisKKyAgICBvSUZTPSRJRlMKKyAgICAjIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgorICAgIElGUz0nJScKKyAgICBzZXQgeCBgZWNobyAiJGRzdGRpciIgfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKKyAgICBzaGlmdAorICAgIElGUz0kb0lGUworCisgICAgcGF0aGNvbXA9CisKKyAgICB3aGlsZSB0ZXN0ICQjIC1uZSAwIDsgZG8KKyAgICAgIHBhdGhjb21wPSRwYXRoY29tcCQxCisgICAgICBzaGlmdAorICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisgICAgICAgICRta2RpcnByb2cgIiRwYXRoY29tcCIKKwkjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaW4gY2FzZSBzZXZlcmFsCisJIyBpbnN0YWxsLXNoIGFyZSBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IGNvbmN1cnJlbnRseS4gIFRoaXMKKwkjIGlzIE9LLgorCXRlc3QgLWQgIiRwYXRoY29tcCIgfHwgZXhpdAorICAgICAgZmkKKyAgICAgIHBhdGhjb21wPSRwYXRoY29tcC8KKyAgICBkb25lCisgIGZpCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgJGRvaXQgJG1rZGlyY21kICIkZHN0IiBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRzdHJpcGNtZCIgfHwgJGRvaXQgJHN0cmlwY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICIkZHN0IjsgfQorCisgIGVsc2UKKyAgICBkc3RmaWxlPWBiYXNlbmFtZSAiJGRzdCJgCisKKyAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXworICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXworCisgICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KKyAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKKyAgICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQorCisgICAgIyBDb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZS4KKyAgICAkZG9pdCAkY3Bwcm9nICIkc3JjIiAiJGRzdHRtcCIgJiYKKworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAiJGRzdHRtcCI7IH0gJiYKKworICAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKyAgICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdHRtcCIgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKKyAgICAgIHx8IHsKKwkgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCisJICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKwkgICAjIHN1cHBvcnQgLWYuCisKKwkgICAjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJICAgIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkgICAjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJICAgIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJICAgIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwkgICB7CisJICAgICBpZiB0ZXN0IC1mICIkZHN0ZGlyLyRkc3RmaWxlIjsgdGhlbgorCSAgICAgICAkZG9pdCAkcm1jbWQgLWYgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKKwkgICAgICAgfHwgJGRvaXQgJG12Y21kIC1mICIkZHN0ZGlyLyRkc3RmaWxlIiAiJHJtdG1wIiAyPi9kZXYvbnVsbCBcCisJICAgICAgIHx8IHsKKwkJIGVjaG8gIiQwOiBjYW5ub3QgdW5saW5rIG9yIHJlbmFtZSAkZHN0ZGlyLyRkc3RmaWxlIiA+JjIKKwkJIChleGl0IDEpOyBleGl0IDEKKwkgICAgICAgfQorCSAgICAgZWxzZQorCSAgICAgICA6CisJICAgICBmaQorCSAgIH0gJiYKKworCSAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKwkgICAkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0ZGlyLyRkc3RmaWxlIgorCSB9CisgICAgfQorICBmaSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK2RvbmUKKworIyBUaGUgZmluYWwgbGl0dGxlIHRyaWNrIHRvICJjb3JyZWN0bHkiIHBhc3MgdGhlIGV4aXQgc3RhdHVzIHRvIHRoZSBleGl0IHRyYXAuCit7CisgIChleGl0IDApOyBleGl0IDAKK30KKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvYnVpbGQtc2NyaXB0cy9sdG1haW4uc2ggYi9kaXN0cmliL3NkbC0xLjIuMTUvYnVpbGQtc2NyaXB0cy9sdG1haW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwNGYwOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL2x0bWFpbi5zaApAQCAtMCwwICsxLDg0MDcgQEAKKyMgR2VuZXJhdGVkIGZyb20gbHRtYWluLm00c2guCisKKyMgbHRtYWluLnNoIChHTlUgbGlidG9vbCkgMi4yLjYKKyMgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KKyMgd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKyMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAorIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKKyMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQorIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwKKyMgb3Igb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworIyBVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KKyMKKyMgUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjCisjICAgICAtLWNvbmZpZyAgICAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworIyAgICAgLS1kZWJ1ZyAgICAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZworIyAtbiwgLS1kcnktcnVuICAgICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKKyMgICAgIC0tZmVhdHVyZXMgICAgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorIyAgICAgLS1tb2RlPU1PREUgICAgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUKKyMgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMgIGRvbid0IHJlbW92ZSBkdXBsaWNhdGUgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKyMgICAgIC0tcXVpZXQsIC0tc2lsZW50ICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyMgICAgIC0tdGFnPVRBRyAgICAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKKyMgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgKGRlZmF1bHQpCisjICAgICAtLXZlcnNpb24gICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisjIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBwcmludCBzaG9ydCBvciBsb25nIGhlbHAgbWVzc2FnZQorIworIyBNT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisjCisjICAgICAgIGNsZWFuICAgICAgICAgICAgICByZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5CisjICAgICAgIGNvbXBpbGUgICAgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0CisjICAgICAgIGV4ZWN1dGUgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQorIyAgICAgICBmaW5pc2ggICAgICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcworIyAgICAgICBpbnN0YWxsICAgICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKKyMgICAgICAgbGluayAgICAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQorIyAgICAgICB1bmluc3RhbGwgICAgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKKyMKKyMgTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLgorIyBUcnkgYCRwcm9nbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4KKyMKKyMgV2hlbiByZXBvcnRpbmcgYSBidWcsIHBsZWFzZSBkZXNjcmliZSBhIHRlc3QgY2FzZSB0byByZXByb2R1Y2UgaXQgYW5kCisjIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKyMKKyMgICAgICAgaG9zdC10cmlwbGV0OgkkaG9zdAorIyAgICAgICBzaGVsbDoJCSRTSEVMTAorIyAgICAgICBjb21waWxlcjoJCSRMVENDCisjICAgICAgIGNvbXBpbGVyIGZsYWdzOgkJJExUQ0ZMQUdTCisjICAgICAgIGxpbmtlcjoJCSRMRCAoZ251PyAkd2l0aF9nbnVfbGQpCisjICAgICAgICRwcm9nbmFtZToJCShHTlUgbGlidG9vbCkgMi4yLjYKKyMgICAgICAgYXV0b21ha2U6CQkkYXV0b21ha2VfdmVyc2lvbgorIyAgICAgICBhdXRvY29uZjoJCSRhdXRvY29uZl92ZXJzaW9uCisjCisjIFJlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4KKworUFJPR1JBTT1sdG1haW4uc2gKK1BBQ0tBR0U9bGlidG9vbAorVkVSU0lPTj0yLjIuNgorVElNRVNUQU1QPSIiCitwYWNrYWdlX3JldmlzaW9uPTEuMzAxMgorCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKK2ZpCitCSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIE5MUyBudWlzYW5jZXM6IFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgorIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KKyMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCisjIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCitsdF91c2VyX2xvY2FsZT0KK2x0X3NhZmVfbG9jYWxlPQorZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCitkbworICBldmFsICJpZiB0ZXN0IFwiXCR7JGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKyAgICAgICAgICBzYXZlXyRsdF92YXI9XCQkbHRfdmFyCisgICAgICAgICAgJGx0X3Zhcj1DCisJICBleHBvcnQgJGx0X3ZhcgorCSAgbHRfdXNlcl9sb2NhbGU9XCIkbHRfdmFyPVxcXCRzYXZlX1wkbHRfdmFyOyBcJGx0X3VzZXJfbG9jYWxlXCIKKwkgIGx0X3NhZmVfbG9jYWxlPVwiJGx0X3Zhcj1DOyBcJGx0X3NhZmVfbG9jYWxlXCIKKwlmaSIKK2RvbmUKKworJGx0X3Vuc2V0IENEUEFUSAorCisKKworCisKKzogJHtDUD0iY3AgLWYifQorOiAke0VDSE89ImVjaG8ifQorOiAke0VHUkVQPSIvdXNyL2Jpbi9ncmVwIC1FIn0KKzogJHtGR1JFUD0iL3Vzci9iaW4vZ3JlcCAtRiJ9Cis6ICR7R1JFUD0iL3Vzci9iaW4vZ3JlcCJ9Cis6ICR7TE5fUz0ibG4gLXMifQorOiAke01BS0U9Im1ha2UifQorOiAke01LRElSPSJta2RpciJ9Cis6ICR7TVY9Im12IC1mIn0KKzogJHtSTT0icm0gLWYifQorOiAke1NFRD0iL29wdC9sb2NhbC9iaW4vZ3NlZCJ9Cis6ICR7U0hFTEw9IiR7Q09ORklHX1NIRUxMLS9iaW4vc2h9In0KKzogJHtYc2VkPSIkU0VEIC1lIDFzL15YLy8ifQorCisjIEdsb2JhbCB2YXJpYWJsZXM6CitFWElUX1NVQ0NFU1M9MAorRVhJVF9GQUlMVVJFPTEKK0VYSVRfTUlTTUFUQ0g9NjMgICMgJD8gPSA2MyBpcyB1c2VkIHRvIGluZGljYXRlIHZlcnNpb24gbWlzbWF0Y2ggdG8gbWlzc2luZy4KK0VYSVRfU0tJUD03NwkgICMgJD8gPSA3NyBpcyB1c2VkIHRvIGluZGljYXRlIGEgc2tpcHBlZCB0ZXN0IHRvIGF1dG9tYWtlLgorCitleGl0X3N0YXR1cz0kRVhJVF9TVUNDRVNTCisKKyMgTWFrZSBzdXJlIElGUyBoYXMgYSBzZW5zaWJsZSBkZWZhdWx0CitsdF9ubD0nCisnCitJRlM9IiAJJGx0X25sIgorCitkaXJuYW1lPSJzLC9bXi9dKiQsLCIKK2Jhc2VuYW1lPSJzLF4uKi8sLCIKKworIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAorIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgorIyBjYWxsOgorIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKKyMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAorIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisjIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKKyMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KKyMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgorZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQoreworICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRkaXJuYW1lImAKKyAgaWYgdGVzdCAiWCRmdW5jX2Rpcm5hbWVfcmVzdWx0IiA9ICJYJHsxfSI7IHRoZW4KKyAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgorICBlbHNlCisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkezJ9IgorICBmaQorICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAorfQorCisjIEdlbmVyYXRlZCBzaGVsbCBmdW5jdGlvbnMgaW5zZXJ0ZWQgaGVyZS4KKworIyBXb3JrIGFyb3VuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlIG9uIElSSVggNi41LiBPbiBJUklYIDYuNCssIHNoCisjIGlzIGtzaCBidXQgd2hlbiB0aGUgc2hlbGwgaXMgaW52b2tlZCBhcyAic2giIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBvZgorIyB0aGUgX1hQRyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZXF1YWwgdG8gMSAob25lKSwgdGhlIHNwZWNpYWwKKyMgcG9zaXRpb25hbCBwYXJhbWV0ZXIgJDAsIHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGwsIGlzIHRoZSBuYW1lIG9mIHRoZQorIyBmdW5jdGlvbi4KK3Byb2dwYXRoPSIkMCIKKworIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW06CisjIEluIHRoZSB1bmxpa2VseSBldmVudCAkcHJvZ25hbWUgYmVnYW4gd2l0aCBhICctJywgaXQgd291bGQgcGxheSBoYXZvYyB3aXRoCisjIGZ1bmNfZWNobyAoaW1hZ2luZSBwcm9nbmFtZT0tbiksIHNvIHdlIHByZXBlbmQgLi8gaW4gdGhhdCBjYXNlOgorZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJHByb2dwYXRoIgorcHJvZ25hbWU9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CitjYXNlICRwcm9nbmFtZSBpbgorICAtKikgcHJvZ25hbWU9Li8kcHJvZ25hbWUgOzsKK2VzYWMKKworIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBhYnNvbHV0ZSBwYXRoIGZvciByZWV4ZWN1dGlvbjoKK2Nhc2UgJHByb2dwYXRoIGluCisgIFtcXC9dKnxbQS1aYS16XTpcXCopIDs7CisgICpbXFwvXSopCisgICAgIHByb2dkaXI9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKyAgICAgcHJvZ2Rpcj1gY2QgIiRwcm9nZGlyIiAmJiBwd2RgCisgICAgIHByb2dwYXRoPSIkcHJvZ2Rpci8kcHJvZ25hbWUiCisgICAgIDs7CisgICopCisgICAgIHNhdmVfSUZTPSIkSUZTIgorICAgICBJRlM9OgorICAgICBmb3IgcHJvZ2RpciBpbiAkUEFUSDsgZG8KKyAgICAgICBJRlM9IiRzYXZlX0lGUyIKKyAgICAgICB0ZXN0IC14ICIkcHJvZ2Rpci8kcHJvZ25hbWUiICYmIGJyZWFrCisgICAgIGRvbmUKKyAgICAgSUZTPSIkc2F2ZV9JRlMiCisgICAgIHRlc3QgLW4gIiRwcm9nZGlyIiB8fCBwcm9nZGlyPWBwd2RgCisgICAgIHByb2dwYXRoPSIkcHJvZ2Rpci8kcHJvZ25hbWUiCisgICAgIDs7Citlc2FjCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSIke1NFRH0iJyAtZSAxcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSdzL1woW2AiJFxcXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbImBcXF1cKS9cXFwxL2cnCisKKyMgUmUtYFwnIHBhcmFtZXRlciBleHBhbnNpb25zIGluIG91dHB1dCBvZiBkb3VibGVfcXVvdGVfc3Vic3QgdGhhdCB3ZXJlCisjIGBcJy1lZCBpbiBpbnB1dCB0byB0aGUgc2FtZS4gIElmIGFuIG9kZCBudW1iZXIgb2YgYFwnIHByZWNlZGVkIGEgJyQnCisjIGluIGlucHV0IHRvIGRvdWJsZV9xdW90ZV9zdWJzdCwgdGhhdCAnJCcgd2FzIHByb3RlY3RlZCBmcm9tIGV4cGFuc2lvbi4KKyMgU2luY2UgZWFjaCBpbnB1dCBgXCcgaXMgbm93IHR3byBgXCdzLCBsb29rIGZvciBhbnkgbnVtYmVyIG9mIHJ1bnMgb2YKKyMgZm91ciBgXCdzIGZvbGxvd2VkIGJ5IHR3byBgXCdzIGFuZCB0aGVuIGEgJyQnLiAgYFwnIHRoYXQgJyQnLgorYnM9J1xcJworYnMyPSdcXFxcJworYnM0PSdcXFxcXFxcXCcKK2RvbGxhcj0nXCQnCitzZWRfZG91YmxlX2JhY2tzbGFzaD0iXAorICBzLyRiczQvJlxcCisvZworICBzL14kYnMyJGRvbGxhci8kYnMmLworICBzL1xcKFteJGJzXVxcKSRiczIkZG9sbGFyL1xcMSRiczIkYnMkZG9sbGFyL2cKKyAgcy9cbi8vZyIKKworIyBTdGFuZGFyZCBvcHRpb25zOgorb3B0X2RyeV9ydW49ZmFsc2UKK29wdF9oZWxwPWZhbHNlCitvcHRfcXVpZXQ9ZmFsc2UKK29wdF92ZXJib3NlPWZhbHNlCitvcHRfd2FybmluZz06CisKKyMgZnVuY19lY2hvIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IG1vZGUKKyMgbmFtZSBpZiBpdCBoYXMgYmVlbiBzZXQgeWV0LgorZnVuY19lY2hvICgpCit7CisgICAgJEVDSE8gIiRwcm9nbmFtZSR7bW9kZSs6IH0kbW9kZTogJCoiCit9CisKKyMgZnVuY192ZXJib3NlIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIGluIHZlcmJvc2UgbW9kZSBvbmx5LgorZnVuY192ZXJib3NlICgpCit7CisgICAgJG9wdF92ZXJib3NlICYmIGZ1bmNfZWNobyAkezErIiRAIn0KKworICAgICMgQSBidWcgaW4gYmFzaCBoYWx0cyB0aGUgc2NyaXB0IGlmIHRoZSBsYXN0IGxpbmUgb2YgYSBmdW5jdGlvbgorICAgICMgZmFpbHMgd2hlbiBzZXQgLWUgaXMgaW4gZm9yY2UsIHNvIHdlIG5lZWQgYW5vdGhlciBjb21tYW5kIHRvCisgICAgIyB3b3JrIGFyb3VuZCB0aGF0OgorICAgIDoKK30KKworIyBmdW5jX2Vycm9yIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLgorZnVuY19lcnJvciAoKQoreworICAgICRFQ0hPICIkcHJvZ25hbWUke21vZGUrOiB9JG1vZGU6ICIkezErIiRAIn0gMT4mMgorfQorCisjIGZ1bmNfd2FybmluZyBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgd2FybmluZyBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLgorZnVuY193YXJuaW5nICgpCit7CisgICAgJG9wdF93YXJuaW5nICYmICRFQ0hPICIkcHJvZ25hbWUke21vZGUrOiB9JG1vZGU6IHdhcm5pbmc6ICIkezErIiRAIn0gMT4mMgorCisgICAgIyBiYXNoIGJ1ZyBhZ2FpbjoKKyAgICA6Cit9CisKKyMgZnVuY19mYXRhbF9lcnJvciBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgYW5kIGV4aXQuCitmdW5jX2ZhdGFsX2Vycm9yICgpCit7CisgICAgZnVuY19lcnJvciAkezErIiRAIn0KKyAgICBleGl0ICRFWElUX0ZBSUxVUkUKK30KKworIyBmdW5jX2ZhdGFsX2hlbHAgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGZvbGxvd2VkIGJ5CisjIGEgaGVscCBoaW50LCBhbmQgZXhpdC4KK2Z1bmNfZmF0YWxfaGVscCAoKQoreworICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9CisgICAgZnVuY19mYXRhbF9lcnJvciAiJGhlbHAiCit9CitoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iICAjIyBkZWZhdWx0CisKKworIyBmdW5jX2dyZXAgZXhwcmVzc2lvbiBmaWxlbmFtZQorIyBDaGVjayB3aGV0aGVyIEVYUFJFU1NJT04gbWF0Y2hlcyBhbnkgbGluZSBvZiBGSUxFTkFNRSwgd2l0aG91dCBvdXRwdXQuCitmdW5jX2dyZXAgKCkKK3sKKyAgICAkR1JFUCAiJDEiICIkMiIgPi9kZXYvbnVsbCAyPiYxCit9CisKKworIyBmdW5jX21rZGlyX3AgZGlyZWN0b3J5LXBhdGgKKyMgTWFrZSBzdXJlIHRoZSBlbnRpcmUgcGF0aCB0byBESVJFQ1RPUlktUEFUSCBpcyBhdmFpbGFibGUuCitmdW5jX21rZGlyX3AgKCkKK3sKKyAgICBteV9kaXJlY3RvcnlfcGF0aD0iJDEiCisgICAgbXlfZGlyX2xpc3Q9CisKKyAgICBpZiB0ZXN0IC1uICIkbXlfZGlyZWN0b3J5X3BhdGgiICYmIHRlc3QgIiRvcHRfZHJ5X3J1biIgIT0gIjoiOyB0aGVuCisKKyAgICAgICMgUHJvdGVjdCBkaXJlY3RvcnkgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScKKyAgICAgIGNhc2UgJG15X2RpcmVjdG9yeV9wYXRoIGluCisgICAgICAgIC0qKSBteV9kaXJlY3RvcnlfcGF0aD0iLi8kbXlfZGlyZWN0b3J5X3BhdGgiIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgV2hpbGUgc29tZSBwb3J0aW9uIG9mIERJUiBkb2VzIG5vdCB5ZXQgZXhpc3QuLi4KKyAgICAgIHdoaWxlIHRlc3QgISAtZCAiJG15X2RpcmVjdG9yeV9wYXRoIjsgZG8KKyAgICAgICAgIyAuLi5tYWtlIGEgbGlzdCBpbiB0b3Btb3N0IGZpcnN0IG9yZGVyLiAgVXNlIGEgY29sb24gZGVsaW1pdGVkCisJIyBsaXN0IGluY2FzZSBzb21lIHBvcnRpb24gb2YgcGF0aCBjb250YWlucyB3aGl0ZXNwYWNlLgorICAgICAgICBteV9kaXJfbGlzdD0iJG15X2RpcmVjdG9yeV9wYXRoOiRteV9kaXJfbGlzdCIKKworICAgICAgICAjIElmIHRoZSBsYXN0IHBvcnRpb24gYWRkZWQgaGFzIG5vIHNsYXNoIGluIGl0LCB0aGUgbGlzdCBpcyBkb25lCisgICAgICAgIGNhc2UgJG15X2RpcmVjdG9yeV9wYXRoIGluICovKikgOzsgKikgYnJlYWsgOzsgZXNhYworCisgICAgICAgICMgLi4ub3RoZXJ3aXNlIHRocm93IGF3YXkgdGhlIGNoaWxkIGRpcmVjdG9yeSBhbmQgbG9vcAorICAgICAgICBteV9kaXJlY3RvcnlfcGF0aD1gJEVDSE8gIlgkbXlfZGlyZWN0b3J5X3BhdGgiIHwgJFhzZWQgLWUgIiRkaXJuYW1lImAKKyAgICAgIGRvbmUKKyAgICAgIG15X2Rpcl9saXN0PWAkRUNITyAiWCRteV9kaXJfbGlzdCIgfCAkWHNlZCAtZSAncyw6KiQsLCdgCisKKyAgICAgIHNhdmVfbWtkaXJfcF9JRlM9IiRJRlMiOyBJRlM9JzonCisgICAgICBmb3IgbXlfZGlyIGluICRteV9kaXJfbGlzdDsgZG8KKwlJRlM9IiRzYXZlX21rZGlyX3BfSUZTIgorICAgICAgICAjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaWYgdHdvIHByb2Nlc3NlcworICAgICAgICAjIHRyeSB0byBjcmVhdGUgb25lIG9mIHRoZSBkaXJlY3RvcmllcyBjb25jdXJyZW50bHkuICBEb24ndAorICAgICAgICAjIHN0b3AgaW4gdGhhdCBjYXNlIQorICAgICAgICAkTUtESVIgIiRteV9kaXIiIDI+L2Rldi9udWxsIHx8IDoKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfbWtkaXJfcF9JRlMiCisKKyAgICAgICMgQmFpbCBvdXQgaWYgd2UgKG9yIHNvbWUgb3RoZXIgcHJvY2VzcykgZmFpbGVkIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyAgICAgIHRlc3QgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCIgfHwgXAorICAgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJGYWlsZWQgdG8gY3JlYXRlIFxgJDEnIgorICAgIGZpCit9CisKKworIyBmdW5jX21rdGVtcGRpciBbc3RyaW5nXQorIyBNYWtlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdvbid0IGNsYXNoIHdpdGggb3RoZXIgcnVubmluZworIyBsaWJ0b29sIHByb2Nlc3NlcywgYW5kIGF2b2lkcyByYWNlIGNvbmRpdGlvbnMgaWYgcG9zc2libGUuICBJZgorIyBnaXZlbiwgU1RSSU5HIGlzIHRoZSBiYXNlbmFtZSBmb3IgdGhhdCBkaXJlY3RvcnkuCitmdW5jX21rdGVtcGRpciAoKQoreworICAgIG15X3RlbXBsYXRlPSIke1RNUERJUi0vdG1wfS8kezEtJHByb2duYW1lfSIKKworICAgIGlmIHRlc3QgIiRvcHRfZHJ5X3J1biIgPSAiOiI7IHRoZW4KKyAgICAgICMgUmV0dXJuIGEgZGlyZWN0b3J5IG5hbWUsIGJ1dCBkb24ndCBjcmVhdGUgaXQgaW4gZHJ5LXJ1biBtb2RlCisgICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSQkIgorICAgIGVsc2UKKworICAgICAgIyBJZiBta3RlbXAgd29ya3MsIHVzZSB0aGF0IGZpcnN0IGFuZCBmb3JlbW9zdAorICAgICAgbXlfdG1wZGlyPWBta3RlbXAgLWQgIiR7bXlfdGVtcGxhdGV9LVhYWFhYWFhYIiAyPi9kZXYvbnVsbGAKKworICAgICAgaWYgdGVzdCAhIC1kICIkbXlfdG1wZGlyIjsgdGhlbgorICAgICAgICAjIEZhaWxpbmcgdGhhdCwgYXQgbGVhc3QgdHJ5IGFuZCB1c2UgJFJBTkRPTSB0byBhdm9pZCBhIHJhY2UKKyAgICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0ke1JBTkRPTS0wfSQkIgorCisgICAgICAgIHNhdmVfbWt0ZW1wZGlyX3VtYXNrPWB1bWFza2AKKyAgICAgICAgdW1hc2sgMDA3NworICAgICAgICAkTUtESVIgIiRteV90bXBkaXIiCisgICAgICAgIHVtYXNrICRzYXZlX21rdGVtcGRpcl91bWFzaworICAgICAgZmkKKworICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gZHJ5LXJ1biBtb2RlLCBib21iIG91dCBvbiBmYWlsdXJlCisgICAgICB0ZXN0IC1kICIkbXlfdG1wZGlyIiB8fCBcCisgICAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCRteV90bXBkaXInIgorICAgIGZpCisKKyAgICAkRUNITyAiWCRteV90bXBkaXIiIHwgJFhzZWQKK30KKworCisjIGZ1bmNfcXVvdGVfZm9yX2V2YWwgYXJnCisjIEFlc3RoZXRpY2FsbHkgcXVvdGUgQVJHIHRvIGJlIGV2YWxlZCBsYXRlci4KKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR3byB2YWx1ZXM6IEZVTkNfUVVPVEVfRk9SX0VWQUxfUkVTVUxUCisjIGlzIGRvdWJsZS1xdW90ZWQsIHN1aXRhYmxlIGZvciBhIHN1YnNlcXVlbnQgZXZhbCwgd2hlcmVhcworIyBGVU5DX1FVT1RFX0ZPUl9FVkFMX1VOUVVPVEVEX1JFU1VMVCBoYXMgbWVyZWx5IGFsbCBjaGFyYWN0ZXJzCisjIHdoaWNoIGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZSBxdW90ZXMgYmFja3NsYXNoaWZpZWQuCitmdW5jX3F1b3RlX2Zvcl9ldmFsICgpCit7CisgICAgY2FzZSAkMSBpbgorICAgICAgKltcXFxgXCJcJF0qKQorCWZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0PWAkRUNITyAiWCQxIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAgOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0PSIkMSIgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdCBpbgorICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHRvIGRlbGF5CisgICAgICAjIHdvcmQgc3BsaXR0aW5nLCBjb21tYW5kIHN1YnN0aXR1dGlvbiBhbmQgYW5kIHZhcmlhYmxlCisgICAgICAjIGV4cGFuc2lvbiBmb3IgYSBzdWJzZXF1ZW50IGV2YWwuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdD0iXCIkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHRcIiIKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0PSIkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQiCisgICAgZXNhYworfQorCisKKyMgZnVuY19xdW90ZV9mb3JfZXhwYW5kIGFyZworIyBBZXN0aGV0aWNhbGx5IHF1b3RlIEFSRyB0byBiZSBldmFsZWQgbGF0ZXI7IHNhbWUgYXMgYWJvdmUsCisjIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2Z1bmNfcXVvdGVfZm9yX2V4cGFuZCAoKQoreworICAgIGNhc2UgJDEgaW4KKyAgICAgICpbXFxcYFwiXSopCisJbXlfYXJnPWAkRUNITyAiWCQxIiB8ICRYc2VkIFwKKwkgICAgLWUgIiRkb3VibGVfcXVvdGVfc3Vic3QiIC1lICIkc2VkX2RvdWJsZV9iYWNrc2xhc2giYCA7OworICAgICAgKikKKyAgICAgICAgbXlfYXJnPSIkMSIgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRteV9hcmcgaW4KKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycyB0byBkZWxheQorICAgICAgIyB3b3JkIHNwbGl0dGluZyBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24gZm9yIGEgc3Vic2VxdWVudCBldmFsLgorICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKyAgICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKyAgICAgICAgbXlfYXJnPSJcIiRteV9hcmdcIiIKKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0PSIkbXlfYXJnIgorfQorCisKKyMgZnVuY19zaG93X2V2YWwgY21kIFtmYWlsX2V4cF0KKyMgVW5sZXNzIG9wdF9zaWxlbnQgaXMgdHJ1ZSwgdGhlbiBvdXRwdXQgQ01ELiAgVGhlbiwgaWYgb3B0X2RyeXJ1biBpcworIyBub3QgdHJ1ZSwgZXZhbHVhdGUgQ01ELiAgSWYgdGhlIGV2YWx1YXRpb24gb2YgQ01EIGZhaWxzLCBhbmQgRkFJTF9FWFAKKyMgaXMgZ2l2ZW4sIHRoZW4gZXZhbHVhdGUgaXQuCitmdW5jX3Nob3dfZXZhbCAoKQoreworICAgIG15X2NtZD0iJDEiCisgICAgbXlfZmFpbF9leHA9IiR7Mi06fSIKKworICAgICR7b3B0X3NpbGVudC1mYWxzZX0gfHwgeworICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkbXlfY21kIgorICAgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorICAgIH0KKworICAgIGlmICR7b3B0X2RyeV9ydW4tZmFsc2V9OyB0aGVuIDo7IGVsc2UKKyAgICAgIGV2YWwgIiRteV9jbWQiCisgICAgICBteV9zdGF0dXM9JD8KKyAgICAgIGlmIHRlc3QgIiRteV9zdGF0dXMiIC1lcSAwOyB0aGVuIDo7IGVsc2UKKwlldmFsICIoZXhpdCAkbXlfc3RhdHVzKTsgJG15X2ZhaWxfZXhwIgorICAgICAgZmkKKyAgICBmaQorfQorCisKKyMgZnVuY19zaG93X2V2YWxfbG9jYWxlIGNtZCBbZmFpbF9leHBdCisjIFVubGVzcyBvcHRfc2lsZW50IGlzIHRydWUsIHRoZW4gb3V0cHV0IENNRC4gIFRoZW4sIGlmIG9wdF9kcnlydW4gaXMKKyMgbm90IHRydWUsIGV2YWx1YXRlIENNRC4gIElmIHRoZSBldmFsdWF0aW9uIG9mIENNRCBmYWlscywgYW5kIEZBSUxfRVhQCisjIGlzIGdpdmVuLCB0aGVuIGV2YWx1YXRlIGl0LiAgVXNlIHRoZSBzYXZlZCBsb2NhbGUgZm9yIGV2YWx1YXRpb24uCitmdW5jX3Nob3dfZXZhbF9sb2NhbGUgKCkKK3sKKyAgICBteV9jbWQ9IiQxIgorICAgIG15X2ZhaWxfZXhwPSIkezItOn0iCisKKyAgICAke29wdF9zaWxlbnQtZmFsc2V9IHx8IHsKKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJG15X2NtZCIKKyAgICAgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKyAgICB9CisKKyAgICBpZiAke29wdF9kcnlfcnVuLWZhbHNlfTsgdGhlbiA6OyBlbHNlCisgICAgICBldmFsICIkbHRfdXNlcl9sb2NhbGUKKwkgICAgJG15X2NtZCIKKyAgICAgIG15X3N0YXR1cz0kPworICAgICAgZXZhbCAiJGx0X3NhZmVfbG9jYWxlIgorICAgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLWVxIDA7IHRoZW4gOjsgZWxzZQorCWV2YWwgIihleGl0ICRteV9zdGF0dXMpOyAkbXlfZmFpbF9leHAiCisgICAgICBmaQorICAgIGZpCit9CisKKworCisKKworIyBmdW5jX3ZlcnNpb24KKyMgRWNobyB2ZXJzaW9uIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgorZnVuY192ZXJzaW9uICgpCit7CisgICAgJFNFRCAtbiAnL14jICckUFJPR1JBTScgKEdOVSAvLC8jIHdhcnJhbnR5OyAvIHsKKyAgICAgICAgcy9eIyAvLworCXMvXiMgKiQvLworICAgICAgICBzL1woKEMpXClbIDAtOSwtXSpcKCBbMS05XVswLTldKlwpL1wxXDIvCisgICAgICAgIHAKKyAgICAgfScgPCAiJHByb2dwYXRoIgorICAgICBleGl0ICQ/Cit9CisKKyMgZnVuY191c2FnZQorIyBFY2hvIHNob3J0IGhlbHAgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCitmdW5jX3VzYWdlICgpCit7CisgICAgJFNFRCAtbiAnL14jIFVzYWdlOi8sLyMgLWgvIHsKKyAgICAgICAgcy9eIyAvLworCXMvXiMgKiQvLworCXMvXCRwcm9nbmFtZS8nJHByb2duYW1lJy8KKwlwCisgICAgfScgPCAiJHByb2dwYXRoIgorICAgICRFQ0hPCisgICAgJEVDSE8gInJ1biBcYCRwcm9nbmFtZSAtLWhlbHAgfCBtb3JlJyBmb3IgZnVsbCB1c2FnZSIKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19oZWxwCisjIEVjaG8gbG9uZyBoZWxwIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgorZnVuY19oZWxwICgpCit7CisgICAgJFNFRCAtbiAnL14jIFVzYWdlOi8sLyMgUmVwb3J0IGJ1Z3MgdG8vIHsKKyAgICAgICAgcy9eIyAvLworCXMvXiMgKiQvLworCXMqXCRwcm9nbmFtZSonJHByb2duYW1lJyoKKwlzKlwkaG9zdConIiRob3N0IicqCisJcypcJFNIRUxMKiciJFNIRUxMIicqCisJcypcJExUQ0MqJyIkTFRDQyInKgorCXMqXCRMVENGTEFHUyonIiRMVENGTEFHUyInKgorCXMqXCRMRConIiRMRCInKgorCXMvXCR3aXRoX2dudV9sZC8nIiR3aXRoX2dudV9sZCInLworCXMvXCRhdXRvbWFrZV92ZXJzaW9uLyciYChhdXRvbWFrZSAtLXZlcnNpb24pIDI+L2Rldi9udWxsIHwkU0VEIDFxYCInLworCXMvXCRhdXRvY29uZl92ZXJzaW9uLyciYChhdXRvY29uZiAtLXZlcnNpb24pIDI+L2Rldi9udWxsIHwkU0VEIDFxYCInLworCXAKKyAgICAgfScgPCAiJHByb2dwYXRoIgorICAgIGV4aXQgJD8KK30KKworIyBmdW5jX21pc3NpbmdfYXJnIGFyZ25hbWUKKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciBhbmQgc2V0IGdsb2JhbAorIyBleGl0X2NtZC4KK2Z1bmNfbWlzc2luZ19hcmcgKCkKK3sKKyAgICBmdW5jX2Vycm9yICJtaXNzaW5nIGFyZ3VtZW50IGZvciAkMSIKKyAgICBleGl0X2NtZD1leGl0Cit9CisKK2V4aXRfY21kPToKKworCisKKworCisjIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHdvcmtpbmcgJEVDSE8uCitpZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCisgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICBzaGlmdAorZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCisgIDoKK2VsaWYgdGVzdCAiWGB7ICRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCisgICMgWWlwcGVlLCAkRUNITyB3b3JrcyEKKyAgOgorZWxzZQorICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlICRFQ0hPIHdpbGwgd29yay4KKyAgZXhlYyAkU0hFTEwgIiRwcm9ncGF0aCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9CitmaQorCitpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobworICBzaGlmdAorICBjYXQgPDxFT0YKKyQqCitFT0YKKyAgZXhpdCAkRVhJVF9TVUNDRVNTCitmaQorCittYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCittYWdpY19leGU9IiUlJU1BR0lDIEVYRSB2YXJpYWJsZSUlJSIKKworIyBHbG9iYWwgdmFyaWFibGVzLgorIyAkbW9kZSBpcyB1bnNldAorbm9ub3B0PQorZXhlY3V0ZV9kbGZpbGVzPQorcHJlc2VydmVfYXJncz0KK2xvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKK28ybG89InMvXFwuJHtvYmpleHR9XCQvLmxvLyIKK2V4dHJhY3RlZF9hcmNoaXZlcz0KK2V4dHJhY3RlZF9zZXJpYWw9MAorCitvcHRfZHJ5X3J1bj1mYWxzZQorb3B0X2R1cGxpY2F0ZV9kZXBzPWZhbHNlCitvcHRfc2lsZW50PWZhbHNlCitvcHRfZGVidWc9OgorCisjIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKKyMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZworIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgorZXhlY19jbWQ9CisKKyMgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQorIyBhIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSBoaW50LCBhbmQgZXhpdC4KK2Z1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAoKQoreworICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9CisgICAgZnVuY19lcnJvciAiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKyAgICBmdW5jX2ZhdGFsX2Vycm9yICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiIKK30KKworCisjIGZ1bmNfY29uZmlnCisjIERpc3BsYXkgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCB0aGUgdGFncyBpbiB0aGlzIHNjcmlwdC4KK2Z1bmNfY29uZmlnICgpCit7CisgICAgcmVfYmVnaW5jZj0nXiMgIyMjIEJFR0lOIExJQlRPT0wnCisgICAgcmVfZW5kY2Y9J14jICMjIyBFTkQgTElCVE9PTCcKKworICAgICMgRGVmYXVsdCBjb25maWd1cmF0aW9uLgorICAgICRTRUQgIjEsLyRyZV9iZWdpbmNmIENPTkZJRy9kOy8kcmVfZW5kY2YgQ09ORklHLyxcJGQiIDwgIiRwcm9ncGF0aCIKKworICAgICMgTm93IHByaW50IHRoZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHRhZ3MuCisgICAgZm9yIHRhZ25hbWUgaW4gJHRhZ2xpc3Q7IGRvCisgICAgICAkU0VEIC1uICIvJHJlX2JlZ2luY2YgVEFHIENPTkZJRzogJHRhZ25hbWVcJC8sLyRyZV9lbmRjZiBUQUcgQ09ORklHOiAkdGFnbmFtZVwkL3AiIDwgIiRwcm9ncGF0aCIKKyAgICBkb25lCisKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19mZWF0dXJlcworIyBEaXNwbGF5IHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQuCitmdW5jX2ZlYXR1cmVzICgpCit7CisgICAgJEVDSE8gImhvc3Q6ICRob3N0IgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAkRUNITyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgJEVDSE8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICRFQ0hPICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBlbHNlCisgICAgICAkRUNITyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGZpCisKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19lbmFibGVfdGFnIHRhZ25hbWUKKyMgVmVyaWZ5IHRoYXQgVEFHTkFNRSBpcyB2YWxpZCwgYW5kIGVpdGhlciBmbGFnIGFuIGVycm9yIGFuZCBleGl0LCBvcgorIyBlbmFibGUgdGhlIFRBR05BTUUgdGFnLiAgV2UgYWxzbyBhZGQgVEFHTkFNRSB0byB0aGUgZ2xvYmFsICR0YWdsaXN0CisjIHZhcmlhYmxlIGhlcmUuCitmdW5jX2VuYWJsZV90YWcgKCkKK3sKKyAgIyBHbG9iYWwgdmFyaWFibGU6CisgIHRhZ25hbWU9IiQxIgorCisgIHJlX2JlZ2luY2Y9Il4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCisgIHJlX2VuZGNmPSJeIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVcJCIKKyAgc2VkX2V4dHJhY3RjZj0iLyRyZV9iZWdpbmNmLywvJHJlX2VuZGNmL3AiCisKKyAgIyBWYWxpZGF0ZSB0YWduYW1lLgorICBjYXNlICR0YWduYW1lIGluCisgICAgKlshLV9BLVphLXowLTksL10qKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiCisgICAgICA7OworICBlc2FjCisKKyAgIyBEb24ndCB0ZXN0IGZvciB0aGUgImRlZmF1bHQiIEMgdGFnLCBhcyB3ZSBrbm93IGl0J3MKKyAgIyB0aGVyZSBidXQgbm90IHNwZWNpYWxseSBtYXJrZWQuCisgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICBDQykgOzsKKyAgICAqKQorICAgICAgaWYgJEdSRVAgIiRyZV9iZWdpbmNmIiAiJHByb2dwYXRoIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwl0YWdsaXN0PSIkdGFnbGlzdCAkdGFnbmFtZSIKKworCSMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uICBCZSBjYXJlZnVsIHRvIHF1b3RlIHRoZSBwYXRoCisJIyBhbmQgdGhlIHNlZCBzY3JpcHQsIHRvIGF2b2lkIHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlLCBidXQKKwkjIGFsc28gZG9uJ3QgdXNlIG5vbi1wb3J0YWJsZSBxdW90ZXMgd2l0aGluIGJhY2txdW90ZXMgd2l0aGluCisJIyBxdW90ZXMgd2UgaGF2ZSB0byBkbyBpdCBpbiAyIHN0ZXBzOgorCWV4dHJhY3RlZGNmPWAkU0VEIC1uIC1lICIkc2VkX2V4dHJhY3RjZiIgPCAiJHByb2dwYXRoImAKKwlldmFsICIkZXh0cmFjdGVkY2YiCisgICAgICBlbHNlCisJZnVuY19lcnJvciAiaWdub3JpbmcgdW5rbm93biB0YWcgJHRhZ25hbWUiCisgICAgICBmaQorICAgICAgOzsKKyAgZXNhYworfQorCisjIFBhcnNlIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4gIFRoaXMgY29tZXMgYXMgc29vbiBhcyBwb3NzaWJsZSBpbgorIyB0aGUgc2NyaXB0IHRvIG1ha2UgdGhpbmdzIGxpa2UgYGxpYnRvb2wgLS12ZXJzaW9uJyBoYXBwZW4gcXVpY2tseS4KK3sKKworICAjIFNob3J0aGFuZCBmb3IgLS1tb2RlPWZvbywgb25seSB2YWxpZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKKyAgY2FzZSAkMSBpbgorICBjbGVhbnxjbGVhfGNsZXxjbCkKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBjbGVhbiAkezErIiRAIn07IHNoaWZ0CisgICAgOzsKKyAgY29tcGlsZXxjb21waWx8Y29tcGl8Y29tcHxjb218Y298YykKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBjb21waWxlICR7MSsiJEAifTsgc2hpZnQKKyAgICA7OworICBleGVjdXRlfGV4ZWN1dHxleGVjdXxleGVjfGV4ZXxleHxlKQorICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGV4ZWN1dGUgJHsxKyIkQCJ9OyBzaGlmdAorICAgIDs7CisgIGZpbmlzaHxmaW5pc3xmaW5pfGZpbnxmaXxmKQorICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGZpbmlzaCAkezErIiRAIn07IHNoaWZ0CisgICAgOzsKKyAgaW5zdGFsbHxpbnN0YWx8aW5zdGF8aW5zdHxpbnN8aW58aSkKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBpbnN0YWxsICR7MSsiJEAifTsgc2hpZnQKKyAgICA7OworICBsaW5rfGxpbnxsaXxsKQorICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGxpbmsgJHsxKyIkQCJ9OyBzaGlmdAorICAgIDs7CisgIHVuaW5zdGFsbHx1bmluc3RhbHx1bmluc3RhfHVuaW5zdHx1bmluc3x1bmlufHVuaXx1bnx1KQorICAgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIHVuaW5zdGFsbCAkezErIiRAIn07IHNoaWZ0CisgICAgOzsKKyAgZXNhYworCisgICMgUGFyc2Ugbm9uLW1vZGUgc3BlY2lmaWMgYXJndW1lbnRzOgorICB3aGlsZSB0ZXN0ICIkIyIgLWd0IDA7IGRvCisgICAgb3B0PSIkMSIKKyAgICBzaGlmdAorCisgICAgY2FzZSAkb3B0IGluCisgICAgICAtLWNvbmZpZykJCWZ1bmNfY29uZmlnCQkJCQk7OworCisgICAgICAtLWRlYnVnKQkJcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJG9wdCIKKwkJCWZ1bmNfZWNobyAiZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKKwkJCW9wdF9kZWJ1Zz0nc2V0IC14JworCQkJJG9wdF9kZWJ1ZworCQkJOzsKKworICAgICAgLWRsb3BlbikJCXRlc3QgIiQjIiAtZXEgMCAmJiBmdW5jX21pc3NpbmdfYXJnICIkb3B0IiAmJiBicmVhaworCQkJZXhlY3V0ZV9kbGZpbGVzPSIkZXhlY3V0ZV9kbGZpbGVzICQxIgorCQkJc2hpZnQKKwkJCTs7CisKKyAgICAgIC0tZHJ5LXJ1biB8IC1uKQlvcHRfZHJ5X3J1bj06CQkJCQk7OworICAgICAgLS1mZWF0dXJlcykgICAgICAgZnVuY19mZWF0dXJlcwkJCQkJOzsKKyAgICAgIC0tZmluaXNoKQkJbW9kZT0iZmluaXNoIgkJCQkJOzsKKworICAgICAgLS1tb2RlKQkJdGVzdCAiJCMiIC1lcSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgIiRvcHQiICYmIGJyZWFrCisJCQljYXNlICQxIGluCisJCQkgICMgVmFsaWQgbW9kZSBhcmd1bWVudHM6CisJCQkgIGNsZWFuKQk7OworCQkJICBjb21waWxlKQk7OworCQkJICBleGVjdXRlKQk7OworCQkJICBmaW5pc2gpCTs7CisJCQkgIGluc3RhbGwpCTs7CisJCQkgIGxpbmspCQk7OworCQkJICByZWxpbmspCTs7CisJCQkgIHVuaW5zdGFsbCkJOzsKKworCQkJICAjIENhdGNoIGFueXRoaW5nIGVsc2UgYXMgYW4gZXJyb3IKKwkJCSAgKikgZnVuY19lcnJvciAiaW52YWxpZCBhcmd1bWVudCBmb3IgJG9wdCIKKwkJCSAgICAgZXhpdF9jbWQ9ZXhpdAorCQkJICAgICBicmVhaworCQkJICAgICA7OworCQkgICAgICAgIGVzYWMKKworCQkJbW9kZT0iJDEiCisJCQlzaGlmdAorCQkJOzsKKworICAgICAgLS1wcmVzZXJ2ZS1kdXAtZGVwcykKKwkJCW9wdF9kdXBsaWNhdGVfZGVwcz06CQkJCTs7CisKKyAgICAgIC0tcXVpZXR8LS1zaWxlbnQpCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQiCisJCQlvcHRfc2lsZW50PToKKwkJCTs7CisKKyAgICAgIC0tdmVyYm9zZXwgLXYpCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQiCisJCQlvcHRfc2lsZW50PWZhbHNlCisJCQk7OworCisgICAgICAtLXRhZykJCXRlc3QgIiQjIiAtZXEgMCAmJiBmdW5jX21pc3NpbmdfYXJnICIkb3B0IiAmJiBicmVhaworCQkJcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJG9wdCAkMSIKKwkJCWZ1bmNfZW5hYmxlX3RhZyAiJDEiCSMgdGFnbmFtZSBpcyBzZXQgaGVyZQorCQkJc2hpZnQKKwkJCTs7CisKKyAgICAgICMgU2VwYXJhdGUgb3B0YXJncyB0byBsb25nIG9wdGlvbnM6CisgICAgICAtZGxvcGVuPSp8LS1tb2RlPSp8LS10YWc9KikKKwkJCWZ1bmNfb3B0X3NwbGl0ICIkb3B0IgorCQkJc2V0IGR1bW15ICIkZnVuY19vcHRfc3BsaXRfb3B0IiAiJGZ1bmNfb3B0X3NwbGl0X2FyZyIgJHsxKyIkQCJ9CisJCQlzaGlmdAorCQkJOzsKKworICAgICAgLVw/fC1oKQkJZnVuY191c2FnZQkJCQkJOzsKKyAgICAgIC0taGVscCkJCW9wdF9oZWxwPToJCQkJCTs7CisgICAgICAtLXZlcnNpb24pCWZ1bmNfdmVyc2lvbgkJCQkJOzsKKworICAgICAgLSopCQlmdW5jX2ZhdGFsX2hlbHAgInVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0JyIJOzsKKworICAgICAgKikJCW5vbm9wdD0iJG9wdCIKKwkJCWJyZWFrCisJCQk7OworICAgIGVzYWMKKyAgZG9uZQorCisKKyAgY2FzZSAkaG9zdCBpbgorICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpwdzMyKiB8ICpjZWdjYyopCisgICAgICAjIGRvbid0IGVsaW1pbmF0ZSBkdXBsaWNhdGlvbnMgaW4gJHBvc3RkZXBzIGFuZCAkcHJlZGVwcworICAgICAgb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz06CisgICAgICA7OworICAgICopCisgICAgICBvcHRfZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPSRvcHRfZHVwbGljYXRlX2RlcHMKKyAgICAgIDs7CisgIGVzYWMKKworICAjIEhhdmluZyB3YXJuZWQgYWJvdXQgYWxsIG1pcy1zcGVjaWZpZWQgb3B0aW9ucywgYmFpbCBvdXQgaWYKKyAgIyBhbnl0aGluZyB3YXMgd3JvbmcuCisgICRleGl0X2NtZCAkRVhJVF9GQUlMVVJFCit9CisKKyMgZnVuY19jaGVja192ZXJzaW9uX21hdGNoCisjIEVuc3VyZSB0aGF0IHdlIGFyZSB1c2luZyBtNCBtYWNyb3MsIGFuZCBsaWJ0b29sIHNjcmlwdCBmcm9tIHRoZSBzYW1lCisjIHJlbGVhc2Ugb2YgbGlidG9vbC4KK2Z1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaCAoKQoreworICBpZiB0ZXN0ICIkcGFja2FnZV9yZXZpc2lvbiIgIT0gIiRtYWNyb19yZXZpc2lvbiI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkVkVSU0lPTiIgIT0gIiRtYWNyb192ZXJzaW9uIjsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiJG1hY3JvX3ZlcnNpb24iOyB0aGVuCisgICAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCBidXQgdGhlCiskcHJvZ25hbWU6IGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gYW4gb2xkZXIgcmVsZWFzZS4KKyRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gJFBBQ0tBR0UgJFZFUlNJT04KKyRwcm9nbmFtZTogYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KK19MVF9FT0YKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0ID4mMiA8PF9MVF9FT0YKKyRwcm9nbmFtZTogVmVyc2lvbiBtaXNtYXRjaCBlcnJvci4gIFRoaXMgaXMgJFBBQ0tBR0UgJFZFUlNJT04sIGJ1dCB0aGUKKyRwcm9nbmFtZTogZGVmaW5pdGlvbiBvZiB0aGlzIExUX0lOSVQgY29tZXMgZnJvbSAkUEFDS0FHRSAkbWFjcm9fdmVyc2lvbi4KKyRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gJFBBQ0tBR0UgJFZFUlNJT04KKyRwcm9nbmFtZTogYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KK19MVF9FT0YKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgY2F0ID4mMiA8PF9MVF9FT0YKKyRwcm9nbmFtZTogVmVyc2lvbiBtaXNtYXRjaCBlcnJvci4gIFRoaXMgaXMgJFBBQ0tBR0UgJFZFUlNJT04sIHJldmlzaW9uICRwYWNrYWdlX3JldmlzaW9uLAorJHByb2duYW1lOiBidXQgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gcmV2aXNpb24gJG1hY3JvX3JldmlzaW9uLgorJHByb2duYW1lOiBZb3Ugc2hvdWxkIHJlY3JlYXRlIGFjbG9jYWwubTQgd2l0aCBtYWNyb3MgZnJvbSByZXZpc2lvbiAkcGFja2FnZV9yZXZpc2lvbgorJHByb2duYW1lOiBvZiAkUEFDS0FHRSAkVkVSU0lPTiBhbmQgcnVuIGF1dG9jb25mIGFnYWluLgorX0xUX0VPRgorICAgIGZpCisKKyAgICBleGl0ICRFWElUX01JU01BVENICisgIGZpCit9CisKKworIyMgLS0tLS0tLS0tLS0gIyMKKyMjICAgIE1haW4uICAgICMjCisjIyAtLS0tLS0tLS0tLSAjIworCiskb3B0X2hlbHAgfHwgeworICAjIFNhbml0eSBjaGVja3MgZmlyc3Q6CisgIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAorCisgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiICE9IHllczsgdGhlbgorICAgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAibm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIKKyAgZmkKKworICB0ZXN0IC16ICIkbW9kZSIgJiYgZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFLiIKKworCisgICMgRGFyd2luIHN1Y2tzCisgIGV2YWwgc3RkX3NocmV4dD1cIiRzaHJleHRfY21kc1wiCisKKworICAjIE9ubHkgZXhlY3V0ZSBtb2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSAtZGxvcGVuIGZsYWdzLgorICBpZiB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiB0ZXN0ICIkbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgorICAgIGZ1bmNfZXJyb3IgInVucmVjb2duaXplZCBvcHRpb24gXGAtZGxvcGVuJyIKKyAgICAkRUNITyAiJGhlbHAiIDE+JjIKKyAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgZmkKKworICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCisgIGdlbmVyaWNfaGVscD0iJGhlbHAiCisgIGhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAgLS1tb2RlPSRtb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCit9CisKKworIyBmdW5jX2xhbGliX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCBgLmxhJyBsaWJyYXJ5IG9yIGAubG8nIG9iamVjdCBmaWxlLgorIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAorIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KK2Z1bmNfbGFsaWJfcCAoKQoreworICAgIHRlc3QgLWYgIiQxIiAmJgorICAgICAgJFNFRCAtZSA0cSAiJDEiIDI+L2Rldi9udWxsIFwKKyAgICAgICAgfCAkR1JFUCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiID4gL2Rldi9udWxsIDI+JjEKK30KKworIyBmdW5jX2xhbGliX3Vuc2FmZV9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgYC5sYScgbGlicmFyeSBvciBgLmxvJyBvYmplY3QgZmlsZS4KKyMgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBzYW1lIGNoZWNrIGFzIGZ1bmNfbGFsaWJfcCB3aXRob3V0CisjIHJlc29ydGluZyB0byBleHRlcm5hbCBwcm9ncmFtcy4gIFRvIHRoaXMgZW5kLCBpdCByZWRpcmVjdHMgc3RkaW4gYW5kCisjIGNsb3NlcyBpdCBhZnRlcndhcmRzLCB3aXRob3V0IHNhdmluZyB0aGUgb3JpZ2luYWwgZmlsZSBkZXNjcmlwdG9yLgorIyBBcyBhIHNhZmV0eSBtZWFzdXJlLCB1c2UgaXQgb25seSB3aGVyZSBhIG5lZ2F0aXZlIHJlc3VsdCB3b3VsZCBiZQorIyBmYXRhbCBhbnl3YXkuICBXb3JrcyBpZiBgZmlsZScgZG9lcyBub3QgZXhpc3QuCitmdW5jX2xhbGliX3Vuc2FmZV9wICgpCit7CisgICAgbGFsaWJfcD1ubworICAgIGlmIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC1yICIkMSIgJiYgZXhlYyA1PCYwIDwiJDEiOyB0aGVuCisJZm9yIGxhbGliX3BfbCBpbiAxIDIgMyA0CisJZG8KKwkgICAgcmVhZCBsYWxpYl9wX2xpbmUKKwkgICAgY2FzZSAiJGxhbGliX3BfbGluZSIgaW4KKwkJXCNcIEdlbmVyYXRlZFwgYnlcICokUEFDS0FHRSogKSBsYWxpYl9wPXllczsgYnJlYWs7OworCSAgICBlc2FjCisJZG9uZQorCWV4ZWMgMDwmNSA1PCYtCisgICAgZmkKKyAgICB0ZXN0ICIkbGFsaWJfcCIgPSB5ZXMKK30KKworIyBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0CisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgKCkKK3sKKyAgICBmdW5jX2xhbGliX3AgIiQxIgorfQorCisjIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIHdyYXBwZXIgZXhlY3V0YWJsZQorIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAorIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KK2Z1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAoKQoreworICAgIGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4PQorICAgIGNhc2UgJDEgaW4KKyAgICAqLmV4ZSkgOzsKKyAgICAqKSBmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeD0uZXhlIDs7CisgICAgZXNhYworICAgICRHUkVQICIkbWFnaWNfZXhlIiAiJDEkZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXgiID4vZGV2L251bGwgMj4mMQorfQorCisjIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgZmlsZQorIyBBc3N1bWVzIGZpbGUgaXMgYW4gbHR3cmFwcGVyX2V4ZWN1dGFibGUKKyMgdXNlcyAkZmlsZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGZpbGVuYW1lIGZvciBhCisjIHRlbXBvcmFyeSBsdHdyYXBwZXJfc2NyaXB0LgorZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAoKQoreworICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0PSIiCisgICAgaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkMSI7IHRoZW4KKwlmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkMSIgIiIgIi4iCisJZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0LyRvYmpkaXIvJHtmdW5jX3N0cmlwbmFtZV9yZXN1bHR9X2x0c2h3cmFwcGVyIgorICAgIGZpCit9CisKKyMgZnVuY19sdHdyYXBwZXJfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9yIHdyYXBwZXIgZXhlY3V0YWJsZQorIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAorIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KK2Z1bmNfbHR3cmFwcGVyX3AgKCkKK3sKKyAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJDEiIHx8IGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJDEiCit9CisKKworIyBmdW5jX2V4ZWN1dGVfY21kcyBjb21tYW5kcyBmYWlsX2NtZAorIyBFeGVjdXRlIHRpbGRlLWRlbGltaXRlZCBDT01NQU5EUy4KKyMgSWYgRkFJTF9DTUQgaXMgZ2l2ZW4sIGV2YWwgdGhhdCB1cG9uIGZhaWx1cmUuCisjIEZBSUxfQ01EIG1heSByZWFkLWFjY2VzcyB0aGUgY3VycmVudCBjb21tYW5kIGluIHZhcmlhYmxlIENNRCEKK2Z1bmNfZXhlY3V0ZV9jbWRzICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIHNhdmVfaWZzPSRJRlM7IElGUz0nficKKyAgICBmb3IgY21kIGluICQxOyBkbworICAgICAgSUZTPSRzYXZlX2lmcworICAgICAgZXZhbCBjbWQ9XCIkY21kXCIKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkY21kIiAiJHsyLTp9IgorICAgIGRvbmUKKyAgICBJRlM9JHNhdmVfaWZzCit9CisKKworIyBmdW5jX3NvdXJjZSBmaWxlCisjIFNvdXJjZSBGSUxFLCBhZGRpbmcgZGlyZWN0b3J5IGNvbXBvbmVudCBpZiBuZWNlc3NhcnkuCisjIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IG9uIGN5Z3dpbi9taW5ndyB0byBhcHBlbmQgYSBkb3QgdG8KKyMgRklMRSBldmVuIGlmIGJvdGggRklMRSBhbmQgRklMRS5leGUgZXhpc3Q6IGF1dG9tYXRpYy1hcHBlbmQtLmV4ZQorIyBiZWhhdmlvciBoYXBwZW5zIG9ubHkgZm9yIGV4ZWMoMyksIG5vdCBmb3Igb3BlbigyKSEgIEFsc28sIHNvdXJjaW5nCisjIGBGSUxFLicgZG9lcyBub3Qgd29yayBvbiBjeWd3aW4gbWFuYWdlZCBtb3VudHMuCitmdW5jX3NvdXJjZSAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBjYXNlICQxIGluCisgICAgKi8qIHwgKlxcKikJLiAiJDEiIDs7CisgICAgKikJCS4gIi4vJDEiIDs7CisgICAgZXNhYworfQorCisKKyMgZnVuY19pbmZlcl90YWcgYXJnCisjIEluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIHRvIHVzZSBpZiBhbnkgYXJlIGF2YWlsYWJsZSBhbmQKKyMgaWYgb25lIHdhc24ndCBjaG9zZW4gdmlhIHRoZSAiLS10YWciIGNvbW1hbmQgbGluZSBvcHRpb24uCisjIE9ubHkgYXR0ZW1wdCB0aGlzIGlmIHRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlCisjIGNvbW1hbmQgZG9lc24ndCBtYXRjaCB0aGUgZGVmYXVsdCBjb21waWxlci4KKyMgYXJnIGlzIHVzdWFsbHkgb2YgdGhlIGZvcm0gJ2djYyAuLi4nCitmdW5jX2luZmVyX3RhZyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBpZiB0ZXN0IC1uICIkYXZhaWxhYmxlX3RhZ3MiICYmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorICAgICAgQ0NfcXVvdGVkPQorICAgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJQ0NfcXVvdGVkPSIkQ0NfcXVvdGVkICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICAgIGRvbmUKKyAgICAgIGNhc2UgJEAgaW4KKyAgICAgICMgQmxhbmtzIGluIHRoZSBjb21tYW5kIG1heSBoYXZlIGJlZW4gc3RyaXBwZWQgYnkgdGhlIGNhbGxpbmcgc2hlbGwsCisgICAgICAjIGJ1dCBub3QgZnJvbSB0aGUgQ0MgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBjb25maWd1cmUgd2FzIHJ1bi4KKyAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgYCRFQ0hPICRDQ2AgIiogfCAiYCRFQ0hPICRDQ2AgIiogfCAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiBgJEVDSE8gJENDX3F1b3RlZGAgIiogfCAiYCRFQ0hPICRDQ19xdW90ZWRgICIqKSA7OworICAgICAgIyBCbGFua3MgYXQgdGhlIHN0YXJ0IG9mICRiYXNlX2NvbXBpbGUgd2lsbCBjYXVzZSB0aGlzIHRvIGZhaWwKKyAgICAgICMgaWYgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoZW0gYXMgd2VsbC4KKyAgICAgICopCisJZm9yIHogaW4gJGF2YWlsYWJsZV90YWdzOyBkbworCSAgaWYgJEdSRVAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR6JCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgorCSAgICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvcCcgPCAkcHJvZ3BhdGhgIgorCSAgICBDQ19xdW90ZWQ9CisJICAgIGZvciBhcmcgaW4gJENDOyBkbworCSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKwkgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCSAgICAgIENDX3F1b3RlZD0iJENDX3F1b3RlZCAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICAgIGRvbmUKKwkgICAgY2FzZSAiJEAgIiBpbgorCSAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgYCRFQ0hPICRDQ2AgIiogfCAiYCRFQ0hPICRDQ2AgIiogfCAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiBgJEVDSE8gJENDX3F1b3RlZGAgIiogfCAiYCRFQ0hPICRDQ19xdW90ZWRgICIqKQorCSAgICAgICMgVGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUgY29tbWFuZCBtYXRjaGVzCisJICAgICAgIyB0aGUgb25lIGluIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbi4KKwkgICAgICAjIEFzc3VtZSB0aGlzIGlzIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbiB3ZSB3YW50LgorCSAgICAgIHRhZ25hbWU9JHoKKwkgICAgICBicmVhaworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisJZG9uZQorCSMgSWYgJHRhZ25hbWUgc3RpbGwgaXNuJ3Qgc2V0LCB0aGVuIG5vIHRhZ2dlZCBjb25maWd1cmF0aW9uCisJIyB3YXMgZm91bmQgYW5kIGxldCB0aGUgdXNlciBrbm93IHRoYXQgdGhlICItLXRhZyIgY29tbWFuZAorCSMgbGluZSBvcHRpb24gbXVzdCBiZSB1c2VkLgorCWlmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorCSAgZnVuY19lY2hvICJ1bmFibGUgdG8gaW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCisJICBmdW5jX2ZhdGFsX2Vycm9yICJzcGVjaWZ5IGEgdGFnIHdpdGggXGAtLXRhZyciCisjCWVsc2UKKyMJICBmdW5jX3ZlcmJvc2UgInVzaW5nICR0YWduYW1lIHRhZ2dlZCBjb25maWd1cmF0aW9uIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorfQorCisKKworIyBmdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0IG91dHB1dF9uYW1lIHBpY19uYW1lIG5vbnBpY19uYW1lCisjIENyZWF0ZSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUgKGFuYWxvZ291cyB0byBhICIubGEiIGZpbGUpLAorIyBidXQgZG9uJ3QgY3JlYXRlIGl0IGlmIHdlJ3JlIGRvaW5nIGEgZHJ5IHJ1bi4KK2Z1bmNfd3JpdGVfbGlidG9vbF9vYmplY3QgKCkKK3sKKyAgICB3cml0ZV9saWJvYmo9JHsxfQorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICB3cml0ZV9sb2JqPVwnJHsyfVwnCisgICAgZWxzZQorICAgICAgd3JpdGVfbG9iaj1ub25lCisgICAgZmkKKworICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHdyaXRlX29sZG9iaj1cJyR7M31cJworICAgIGVsc2UKKyAgICAgIHdyaXRlX29sZG9iaj1ub25lCisgICAgZmkKKworICAgICRvcHRfZHJ5X3J1biB8fCB7CisgICAgICBjYXQgPiR7d3JpdGVfbGlib2JqfVQgPDxFT0YKKyMgJHdyaXRlX2xpYm9iaiAtIGEgbGlidG9vbCBvYmplY3QgZmlsZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisjCisjIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKKyMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgorCisjIE5hbWUgb2YgdGhlIFBJQyBvYmplY3QuCitwaWNfb2JqZWN0PSR3cml0ZV9sb2JqCisKKyMgTmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QKK25vbl9waWNfb2JqZWN0PSR3cml0ZV9vbGRvYmoKKworRU9GCisgICAgICAkTVYgIiR7d3JpdGVfbGlib2JqfVQiICIke3dyaXRlX2xpYm9ian0iCisgICAgfQorfQorCisjIGZ1bmNfbW9kZV9jb21waWxlIGFyZy4uLgorZnVuY19tb2RlX2NvbXBpbGUgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KKyAgICBiYXNlX2NvbXBpbGU9CisgICAgc3JjZmlsZT0iJG5vbm9wdCIgICMgIGFsd2F5cyBrZWVwIGEgbm9uLWVtcHR5IHZhbHVlIGluICJzcmNmaWxlIgorICAgIHN1cHByZXNzX29wdD15ZXMKKyAgICBzdXBwcmVzc19vdXRwdXQ9CisgICAgYXJnX21vZGU9bm9ybWFsCisgICAgbGlib2JqPQorICAgIGxhdGVyPQorICAgIHBpZV9mbGFnPQorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgICAgYXJnICApCisJIyBkbyBub3QgImNvbnRpbnVlIi4gIEluc3RlYWQsIGFkZCB0aGlzIHRvIGJhc2VfY29tcGlsZQorCWxhc3Rhcmc9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJOzsKKworICAgICAgdGFyZ2V0ICkKKwlsaWJvYmo9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJY29udGludWUKKwk7OworCisgICAgICBub3JtYWwgKQorCSMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKwljYXNlICRhcmcgaW4KKwktbykKKwkgIHRlc3QgLW4gIiRsaWJvYmoiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAieW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIgorCSAgYXJnX21vZGU9dGFyZ2V0CisJICBjb250aW51ZQorCSAgOzsKKworCS1waWUgfCAtZnBpZSB8IC1mUElFKQorICAgICAgICAgIHBpZV9mbGFnPSIkcGllX2ZsYWcgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLXNoYXJlZCB8IC1zdGF0aWMgfCAtcHJlZmVyLXBpYyB8IC1wcmVmZXItbm9uLXBpYykKKwkgIGxhdGVyPSIkbGF0ZXIgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLW5vLXN1cHByZXNzKQorCSAgc3VwcHJlc3Nfb3B0PW5vCisJICBjb250aW51ZQorCSAgOzsKKworCS1YY29tcGlsZXIpCisJICBhcmdfbW9kZT1hcmcgICMgIHRoZSBuZXh0IG9uZSBnb2VzIGludG8gdGhlICJiYXNlX2NvbXBpbGUiIGFyZyBsaXN0CisJICBjb250aW51ZSAgICAgICMgIFRoZSBjdXJyZW50ICJzcmNmaWxlIiB3aWxsIGVpdGhlciBiZSByZXRhaW5lZCBvcgorCSAgOzsgICAgICAgICAgICAjICByZXBsYWNlZCBsYXRlci4gIEkgd291bGQgZ3Vlc3MgdGhhdCB3b3VsZCBiZSBhIGJ1Zy4KKworCS1XYywqKQorCSAgZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCSAgYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBsYXN0YXJnPQorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJICBmb3IgYXJnIGluICRhcmdzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwkgICAgbGFzdGFyZz0iJGxhc3RhcmcgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRsYXN0YXJnIgorCSAgbGFzdGFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKwkgICMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgorCSAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgorCSAgY29udGludWUKKwkgIDs7CisKKwkqKQorCSAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgorCSAgIyBUaGUgcHJldmlvdXMgInNyY2ZpbGUiIGJlY29tZXMgdGhlIGN1cnJlbnQgYXJndW1lbnQuCisJICAjCisJICBsYXN0YXJnPSIkc3JjZmlsZSIKKwkgIHNyY2ZpbGU9IiRhcmciCisJICA7OworCWVzYWMgICMgIGNhc2UgJGFyZworCTs7CisgICAgICBlc2FjICAgICMgIGNhc2UgJGFyZ19tb2RlCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbGFzdGFyZyIKKyAgICAgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgZG9uZSAjIGZvciBhcmcKKworICAgIGNhc2UgJGFyZ19tb2RlIGluCisgICAgYXJnKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhbiBhcmd1bWVudCBmb3IgLVhjb21waWxlIgorICAgICAgOzsKKyAgICB0YXJnZXQpCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJ5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciCisgICAgICA7OworICAgICopCisgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiB7CisJZnVuY19iYXNlbmFtZSAiJHNyY2ZpbGUiCisJbGlib2JqPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICB9CisgICAgICA7OworICAgIGVzYWMKKworICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCisgICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLltjQ0ZTaWZtc29dIHwgXAorICAgICouYWRhIHwgKi5hZGIgfCAqLmFkcyB8ICouYXNtIHwgXAorICAgICouYysrIHwgKi5jYyB8ICouaWkgfCAqLmNsYXNzIHwgKi5jcHAgfCAqLmN4eCB8IFwKKyAgICAqLltmRl1bMDldPyB8ICouZm9yIHwgKi5qYXZhIHwgKi5vYmogfCAqLnN4KQorICAgICAgZnVuY194Zm9ybSAiJGxpYm9iaiIKKyAgICAgIGxpYm9iaj0kZnVuY194Zm9ybV9yZXN1bHQKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5sbykgZnVuY19sbzJvICIkbGlib2JqIjsgb2JqPSRmdW5jX2xvMm9fcmVzdWx0IDs7CisgICAgKikKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJGxpYm9iaiciCisgICAgICA7OworICAgIGVzYWMKKworICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKKworICAgIGZvciBhcmcgaW4gJGxhdGVyOyBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtc2hhcmVkKQorCXRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBcCisJICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gImNhbiBub3QgYnVpbGQgYSBzaGFyZWQgbGlicmFyeSIKKwlidWlsZF9vbGRfbGlicz1ubworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYykKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItcGljKQorCXBpY19tb2RlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXByZWZlci1ub24tcGljKQorCXBpY19tb2RlPW5vCisJY29udGludWUKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRsaWJvYmoiCisgICAgdGVzdCAiWCRsaWJvYmoiICE9ICJYJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IiBcCisgICAgICAmJiAkRUNITyAiWCRsaWJvYmoiIHwgJEdSRVAgJ1tdfiNeKnt9Ozw+PyInIiciJwkgJigpfGAkW10nIFwKKyAgICAgICYmIGZ1bmNfd2FybmluZyAibGlib2JqIG5hbWUgXGAkbGlib2JqJyBtYXkgbm90IGNvbnRhaW4gc2hlbGwgc3BlY2lhbCBjaGFyYWN0ZXJzLiIKKyAgICBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkb2JqIiAiLyIgIiIKKyAgICBvYmpuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisgICAgbG9iaj0ke3hkaXJ9JG9iamRpci8kb2JqbmFtZQorCisgICAgdGVzdCAteiAiJGJhc2VfY29tcGlsZSIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGEgY29tcGlsYXRpb24gY29tbWFuZCIKKworICAgICMgRGVsZXRlIGFueSBsZWZ0b3ZlciBsaWJyYXJ5IG9iamVjdHMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgcmVtb3ZlbGlzdD0iJG9iaiAkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCisgICAgZWxzZQorICAgICAgcmVtb3ZlbGlzdD0iJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgorICAgIGZpCisKKyAgICAjIE9uIEN5Z3dpbiB0aGVyZSdzIG5vICJyZWFsIiBQSUMgZmxhZyBzbyB3ZSBtdXN0IGJ1aWxkIGJvdGggb2JqZWN0IHR5cGVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgICA7OworICAgIGVzYWMKKyAgICBpZiB0ZXN0ICIkcGljX21vZGUiID0gbm8gJiYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgorICAgICAgIyBub24tUElDIGNvZGUgaW4gc2hhcmVkIGxpYnJhcmllcyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgZmkKKworICAgICMgQ2FsY3VsYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IG9iamVjdCBpZiBjb21waWxlciBkb2VzCisgICAgIyBub3Qgc3VwcG9ydCAtbyB3aXRoIC1jCisgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubzsgdGhlbgorICAgICAgb3V0cHV0X29iaj1gJEVDSE8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzJVwuW14uXSokJSUnYC4ke29iamV4dH0KKyAgICAgIGxvY2tmaWxlPSIkb3V0cHV0X29iai5sb2NrIgorICAgIGVsc2UKKyAgICAgIG91dHB1dF9vYmo9CisgICAgICBuZWVkX2xvY2tzPW5vCisgICAgICBsb2NrZmlsZT0KKyAgICBmaQorCisgICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKKyAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCisgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCisgICAgICB1bnRpbCAkb3B0X2RyeV9ydW4gfHwgbG4gIiRwcm9ncGF0aCIgIiRsb2NrZmlsZSIgMj4vZGV2L251bGw7IGRvCisJZnVuY19lY2hvICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKKwlzbGVlcCAyCisgICAgICBkb25lCisgICAgZWxpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuOyB0aGVuCisgICAgICBpZiB0ZXN0IC1mICIkbG9ja2ZpbGUiOyB0aGVuCisJJEVDSE8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisgICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkb3V0cHV0X29iaiIKKyAgICAgICRFQ0hPICIkc3JjZmlsZSIgPiAiJGxvY2tmaWxlIgorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJGxvY2tmaWxlIgorICAgIHRyYXAgJyRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScgMSAyIDE1CisKKyAgICBpZiB0ZXN0IC1uICIkZml4X3NyY2ZpbGVfcGF0aCI7IHRoZW4KKyAgICAgIGV2YWwgc3JjZmlsZT1cIiRmaXhfc3JjZmlsZV9wYXRoXCIKKyAgICBmaQorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRzcmNmaWxlIgorICAgIHFzcmNmaWxlPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdAorCisgICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCisgICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKKworICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSBubzsgdGhlbgorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKKyAgICAgIGVsc2UKKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCisgICAgICBmaQorCisgICAgICBmdW5jX21rZGlyX3AgIiR4ZGlyJG9iamRpciIKKworICAgICAgaWYgdGVzdCAteiAiJG91dHB1dF9vYmoiOyB0aGVuCisJIyBQbGFjZSBQSUMgb2JqZWN0cyBpbiAkb2JqZGlyCisJY29tbWFuZD0iJGNvbW1hbmQgLW8gJGxvYmoiCisgICAgICBmaQorCisgICAgICBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgIiRjb21tYW5kIglcCisgICAgICAgICAgJ3Rlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJGxvYmoiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyRNViAiJG91dHB1dF9vYmoiICIkbG9iaiInIFwKKwkgICdlcnJvcj0kPzsgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkZXJyb3InCisgICAgICBmaQorCisgICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCisgICAgICBpZiB0ZXN0ICIkc3VwcHJlc3Nfb3B0IiA9IHllczsgdGhlbgorCXN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSRwaWVfZmxhZyIKKyAgICAgIGVsc2UKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KKwljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgorICAgICAgZmkKKworICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCisgICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCisgICAgICBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgIiRjb21tYW5kIiBcCisgICAgICAgICckb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCisgICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRvYmoiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyRNViAiJG91dHB1dF9vYmoiICIkb2JqIicgXAorCSAgJ2Vycm9yPSQ/OyAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRlcnJvcicKKyAgICAgIGZpCisgICAgZmkKKworICAgICRvcHRfZHJ5X3J1biB8fCB7CisgICAgICBmdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0ICIkbGlib2JqIiAiJG9iamRpci8kb2JqbmFtZSIgIiRvYmpuYW1lIgorCisgICAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKwlyZW1vdmVsaXN0PSRsb2NrZmlsZQorICAgICAgICAkUk0gIiRsb2NrZmlsZSIKKyAgICAgIGZpCisgICAgfQorCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKKyRvcHRfaGVscCB8fCB7Cit0ZXN0ICIkbW9kZSIgPSBjb21waWxlICYmIGZ1bmNfbW9kZV9jb21waWxlICR7MSsiJEAifQorfQorCitmdW5jX21vZGVfaGVscCAoKQoreworICAgICMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgorICAgIGNhc2UgJG1vZGUgaW4KKyAgICAgICIiKQorICAgICAgICAjIEdlbmVyaWMgaGVscCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgdXNhZ2UgY29tbWVudHMKKyAgICAgICAgIyBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmaWxlLgorICAgICAgICBmdW5jX2hlbHAKKyAgICAgICAgOzsKKworICAgICAgY2xlYW4pCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jbGVhbiBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKK3dpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgICAgICAgOzsKKworICAgICAgY29tcGlsZSkKKyAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCisKK0NvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCisgIC1uby1zdXBwcmVzcyAgICAgIGRvIG5vdCBzdXBwcmVzcyBjb21waWxlciBvdXRwdXQgZm9yIG11bHRpcGxlIHBhc3NlcworICAtcHJlZmVyLXBpYyAgICAgICB0cnkgdG8gYnVpbGRpbmcgUElDIG9iamVjdHMgb25seQorICAtcHJlZmVyLW5vbi1waWMgICB0cnkgdG8gYnVpbGRpbmcgbm9uLVBJQyBvYmplY3RzIG9ubHkKKyAgLXNoYXJlZCAgICAgICAgICAgZG8gbm90IGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKKyAgLXN0YXRpYyAgICAgICAgICAgb25seSBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisKK0NPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCitmcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgorCitUaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KK1NPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQorbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgorICAgICAgICA7OworCisgICAgICBleGVjdXRlKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgorCitBdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKKworVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJworZmxhZ3MuCisKK0lmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKK2ludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQorZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCisKK1RoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgorICAgICAgICA7OworCisgICAgICBmaW5pc2gpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KKworQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KKworRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KKworVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCit0aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKKyAgICAgICAgOzsKKworICAgICAgaW5zdGFsbCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCisKK0luc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgorCitJTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKK2VpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgSU5TVEFMTC1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtaW5zdC1wcmVmaXggUFJFRklYLURJUiAgVXNlIFBSRUZJWC1ESVIgYXMgYSBzdGFnaW5nIGFyZWEgZm9yIGluc3RhbGxhdGlvbgorCitUaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQorQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCisgICAgICAgIDs7CisKKyAgICAgIGxpbmspCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgorCitMaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCitjcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgorCitMSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKK2EgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKKyAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCisgIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQorICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scworICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQorICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQorICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKKyAgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4IFJFR0VYCisgICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBtYXRjaGluZyBSRUdFWAorICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCisgIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCisgIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAorICAtbm8tZmFzdC1pbnN0YWxsICBkaXNhYmxlIHRoZSBmYXN0LWluc3RhbGwgbW9kZQorICAtbm8taW5zdGFsbCAgICAgICBsaW5rIGEgbm90LWluc3RhbGxhYmxlIGV4ZWN1dGFibGUKKyAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCisgIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cworICAtb2JqZWN0bGlzdCBGSUxFICBVc2UgYSBsaXN0IG9mIG9iamVjdCBmaWxlcyBmb3VuZCBpbiBGSUxFIHRvIHNwZWNpZnkgb2JqZWN0cworICAtcHJlY2lvdXMtZmlsZXMtcmVnZXggUkVHRVgKKyAgICAgICAgICAgICAgICAgICAgZG9uJ3QgcmVtb3ZlIG91dHB1dCBmaWxlcyBtYXRjaGluZyBSRUdFWAorICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgorICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCisgIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCisgIC1zaGFyZWQgICAgICAgICAgIG9ubHkgZG8gZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC1zaHJleHQgU1VGRklYICAgIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBzaGFyZWQgbGlicmFyeSBmaWxlIGV4dGVuc2lvbgorICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAtc3RhdGljLWxpYnRvb2wtbGlicworICAgICAgICAgICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcworICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQorICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCisgIC13ZWFrIExJQk5BTUUgICAgIGRlY2xhcmUgdGhhdCB0aGUgdGFyZ2V0IHByb3ZpZGVzIHRoZSBMSUJOQU1FIGludGVyZmFjZQorCitBbGwgb3RoZXIgb3B0aW9ucyAoYXJndW1lbnRzIGJlZ2lubmluZyB3aXRoIFxgLScpIGFyZSBpZ25vcmVkLgorCitFdmVyeSBvdGhlciBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWUuICBGaWxlcyBlbmRpbmcgaW4gXGAubGEnIGFyZQordHJlYXRlZCBhcyB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcywgb3RoZXIgZmlsZXMgYXJlIHN0YW5kYXJkIG9yIGxpYnJhcnkKK29iamVjdCBmaWxlcy4KKworSWYgdGhlIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubGEnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5IGlzIGNyZWF0ZWQsCitvbmx5IGxpYnJhcnkgb2JqZWN0cyAoXGAubG8nIGZpbGVzKSBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgXGAtcnBhdGgnIGlzCityZXF1aXJlZCwgZXhjZXB0IHdoZW4gY3JlYXRpbmcgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmEnIG9yIFxgLmxpYicsIHRoZW4gYSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGNyZWF0ZWQKK3VzaW5nIFxgYXInIGFuZCBcYHJhbmxpYicsIG9yIG9uIFdpbmRvd3MgdXNpbmcgXGBsaWInLgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxvJyBvciBcYC4ke29iamV4dH0nLCB0aGVuIGEgcmVsb2FkYWJsZSBvYmplY3QgZmlsZQoraXMgY3JlYXRlZCwgb3RoZXJ3aXNlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBjcmVhdGVkLiIKKyAgICAgICAgOzsKKworICAgICAgdW5pbnN0YWxsKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KKworUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgorT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgorICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICBmdW5jX2ZhdGFsX2hlbHAgImludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgJEVDSE8KKyAgICAkRUNITyAiVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgorCisgICAgZXhpdCAkPworfQorCisgICMgTm93IHRoYXQgd2UndmUgY29sbGVjdGVkIGEgcG9zc2libGUgLS1tb2RlIGFyZywgc2hvdyBoZWxwIGlmIG5lY2Vzc2FyeQorICAkb3B0X2hlbHAgJiYgZnVuY19tb2RlX2hlbHAKKworCisjIGZ1bmNfbW9kZV9leGVjdXRlIGFyZy4uLgorZnVuY19tb2RlX2V4ZWN1dGUgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KKyAgICBjbWQ9IiRub25vcHQiCisgICAgdGVzdCAteiAiJGNtZCIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIKKworICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCisgICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KKyAgICAgIHRlc3QgLWYgIiRmaWxlIiBcCisJfHwgZnVuY19mYXRhbF9oZWxwICJcYCRmaWxlJyBpcyBub3QgYSBmaWxlIgorCisgICAgICBkaXI9CisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLmxhKQorCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGZpbGUiIFwKKwkgIHx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KKwlkbG5hbWU9CisJbGlicmFyeV9uYW1lcz0KKwlmdW5jX3NvdXJjZSAiJGZpbGUiCisKKwkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmIFwKKwkgICAgZnVuY193YXJuaW5nICJcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKKwkgIGNvbnRpbnVlCisJZmkKKworCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KKwkgIGRpcj0iJGRpci8kb2JqZGlyIgorCWVsc2UKKwkgIGlmIHRlc3QgISAtZiAiJGRpci8kZGxuYW1lIjsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgorCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJOzsKKworICAgICAgKikKKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIgorCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBHZXQgdGhlIGFic29sdXRlIHBhdGhuYW1lLgorICAgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorICAgICAgdGVzdCAtbiAiJGFic2RpciIgJiYgZGlyPSIkYWJzZGlyIgorCisgICAgICAjIE5vdyBhZGQgdGhlIGRpcmVjdG9yeSB0byBzaGxpYnBhdGhfdmFyLgorICAgICAgaWYgZXZhbCAidGVzdCAteiBcIlwkJHNobGlicGF0aF92YXJcIiI7IHRoZW4KKwlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyXCIiCisgICAgICBlbHNlCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpcjpcJCRzaGxpYnBhdGhfdmFyXCIiCisgICAgICBmaQorICAgIGRvbmUKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgc2hsaWJwYXRoX3ZhcgorICAgICMgcmF0aGVyIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2V4ZWN1dGVfbWFnaWM9IiRtYWdpYyIKKworICAgICMgQ2hlY2sgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgYSB3cmFwcGVyIHNjcmlwdC4KKyAgICBhcmdzPQorICAgIGZvciBmaWxlCisgICAgZG8KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgIC0qKSA7OworICAgICAgKikKKwkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisJaWYgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiRmaWxlIjsgdGhlbgorCSAgZnVuY19zb3VyY2UgIiRmaWxlIgorCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWVsaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgZnVuY19zb3VyY2UgIiRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdCIKKwkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCisJICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZpbGUiCisgICAgICBhcmdzPSIkYXJncyAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiWCRvcHRfZHJ5X3J1biIgPSBYZmFsc2U7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCSMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgorCWV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgIGZpCisKKyAgICAgICMgUmVzdG9yZSBzYXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgIGZvciBsdF92YXIgaW4gTEFORyBMQU5HVUFHRSBMQ19BTEwgTENfQ1RZUEUgTENfQ09MTEFURSBMQ19NRVNTQUdFUworICAgICAgZG8KKwlldmFsICJpZiB0ZXN0IFwiXCR7c2F2ZV8kbHRfdmFyK3NldH1cIiA9IHNldDsgdGhlbgorICAgICAgICAgICAgICAgICRsdF92YXI9XCRzYXZlXyRsdF92YXI7IGV4cG9ydCAkbHRfdmFyCisJICAgICAgZWxzZQorCQkkbHRfdW5zZXQgJGx0X3ZhcgorCSAgICAgIGZpIgorICAgICAgZG9uZQorCisgICAgICAjIE5vdyBwcmVwYXJlIHRvIGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCisgICAgICBleGVjX2NtZD0iXCRjbWQkYXJncyIKKyAgICBlbHNlCisgICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJZXZhbCAiXCRFQ0hPIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKKwkkRUNITyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKyAgICAgICRFQ0hPICIkY21kJGFyZ3MiCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICBmaQorfQorCit0ZXN0ICIkbW9kZSIgPSBleGVjdXRlICYmIGZ1bmNfbW9kZV9leGVjdXRlICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX2ZpbmlzaCBhcmcuLi4KK2Z1bmNfbW9kZV9maW5pc2ggKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbGliZGlycz0iJG5vbm9wdCIKKyAgICBhZG1pbmNtZHM9CisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZm9yIGRpcgorICAgICAgZG8KKwlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgorICAgICAgZG9uZQorCisgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJGZpbmlzaF9jbWRzIiAnYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisnIiRjbWQiJyInCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCisJICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCisJICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWRzIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKKyAgICAgICAkY21kcyIKKwlmaQorICAgICAgZG9uZQorICAgIGZpCisKKyAgICAjIEV4aXQgaGVyZSBpZiB0aGV5IHdhbnRlZCBzaWxlbnQgbW9kZS4KKyAgICAkb3B0X3NpbGVudCAmJiBleGl0ICRFWElUX1NVQ0NFU1MKKworICAgICRFQ0hPICJYLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgfCAkWHNlZAorICAgICRFQ0hPICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCisgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKyAgICAgICRFQ0hPICIgICAkbGliZGlyIgorICAgIGRvbmUKKyAgICAkRUNITworICAgICRFQ0hPICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKKyAgICAkRUNITyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCisgICAgJEVDSE8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSB0aGUgXGAtTExJQkRJUiciCisgICAgJEVDSE8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICRFQ0hPICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorICAgICAgJEVDSE8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKyAgICAgICRFQ0hPICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgICRFQ0hPICIgICAgIGR1cmluZyBsaW5raW5nIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisgICAgICBsaWJkaXI9TElCRElSCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgICRFQ0hPICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgorICAgICAgJEVDSE8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgorICAgIGZpCisgICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICAgICRFQ0hPICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKKyAgICBmaQorICAgICRFQ0hPCisKKyAgICAkRUNITyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCisgICAgY2FzZSAkaG9zdCBpbgorICAgICAgc29sYXJpczIuWzY3ODldfHNvbGFyaXMyLjFbMC05XSkKKyAgICAgICAgJEVDSE8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpLCBjcmxlKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwiCisJJEVDSE8gInBhZ2VzLiIKKwk7OworICAgICAgKikKKyAgICAgICAgJEVDSE8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorICAgICAgICA7OworICAgIGVzYWMKKyAgICAkRUNITyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKwordGVzdCAiJG1vZGUiID0gZmluaXNoICYmIGZ1bmNfbW9kZV9maW5pc2ggJHsxKyIkQCJ9CisKKworIyBmdW5jX21vZGVfaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV9pbnN0YWxsICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KKyAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaCB8fAorICAgICAgICMgQWxsb3cgdGhlIHVzZSBvZiBHTlUgc2h0b29sJ3MgaW5zdGFsbCBjb21tYW5kLgorICAgICAgICRFQ0hPICJYJG5vbm9wdCIgfCAkR1JFUCBzaHRvb2wgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJG5vbm9wdCIKKyAgICAgIGluc3RhbGxfcHJvZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0ICIKKyAgICAgIGFyZz0kMQorICAgICAgc2hpZnQKKyAgICBlbHNlCisgICAgICBpbnN0YWxsX3Byb2c9CisgICAgICBhcmc9JG5vbm9wdAorICAgIGZpCisKKyAgICAjIFRoZSByZWFsIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2dyYW0uCisgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCisgICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgorICAgIGRlc3Q9CisgICAgZmlsZXM9CisgICAgb3B0cz0KKyAgICBwcmV2PQorICAgIGluc3RhbGxfdHlwZT0KKyAgICBpc2Rpcj1ubworICAgIHN0cmlwbWU9CisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KKwlmaWxlcz0iJGZpbGVzICRkZXN0IgorCWRlc3Q9JGFyZworCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKKyAgICAgIC1mKQorCWNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KKwkqW1xcXCAvXWNwXCAqKSA7OworCSopIHByZXY9JGFyZyA7OworCWVzYWMKKwk7OworICAgICAgLWcgfCAtbSB8IC1vKQorCXByZXY9JGFyZworCTs7CisgICAgICAtcykKKwlzdHJpcG1lPSIgLXMiCisJY29udGludWUKKwk7OworICAgICAgLSopCisJOzsKKyAgICAgICopCisJIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgorCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCSAgcHJldj0KKwllbHNlCisJICBkZXN0PSRhcmcKKwkgIGNvbnRpbnVlCisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKyAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgZG9uZQorCisgICAgdGVzdCAteiAiJGluc3RhbGxfcHJvZyIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIKKworICAgIHRlc3QgLW4gIiRwcmV2IiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiCisKKyAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KKwlmdW5jX2ZhdGFsX2hlbHAgIm5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIgorICAgICAgZWxzZQorCWZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIgorICAgICAgZmkKKyAgICBmaQorCisgICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCisgICAgZnVuY19zdHJpcG5hbWUgJycgJy8nICIkZGVzdCIKKyAgICBkZXN0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKworICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgorICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKKyAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCisgICAgICBkZXN0ZGlyPSIkZGVzdCIKKyAgICAgIGRlc3RuYW1lPQorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRkZXN0IiAiIiAiLiIKKyAgICAgIGRlc3RkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgICAgZGVzdG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgorICAgICAgc2V0IGR1bW15ICRmaWxlczsgc2hpZnQKKyAgICAgIHRlc3QgIiQjIiAtZ3QgMSAmJiBcCisJZnVuY19mYXRhbF9oZWxwICJcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiCisgICAgZmkKKyAgICBjYXNlICRkZXN0ZGlyIGluCisgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworICAgICopCisgICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisJY2FzZSAkZmlsZSBpbgorCSoubG8pIDs7CisJKikKKwkgIGZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIHN0YXRpY2xpYnM9CisgICAgZnV0dXJlX2xpYmRpcnM9CisgICAgY3VycmVudF9saWJkaXJzPQorICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKworICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICouJGxpYmV4dCkKKwkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgorCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgorCTs7CisKKyAgICAgICoubGEpCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAorCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCXJlbGlua19jb21tYW5kPQorCWZ1bmNfc291cmNlICIkZmlsZSIKKworCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KKwlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgorCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZWxzZQorCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKworCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIvIiAiIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJZGlyPSIkZGlyJG9iamRpciIKKworCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICMgRGV0ZXJtaW5lIHRoZSBwcmVmaXggdGhlIHVzZXIgaGFzIGFwcGxpZWQgdG8gb3VyIGZ1dHVyZSBkaXIuCisJICBpbnN0X3ByZWZpeF9kaXI9YCRFQ0hPICJYJGRlc3RkaXIiIHwgJFhzZWQgLWUgInMlJGxpYmRpclwkJSUiYAorCisJICAjIERvbid0IGFsbG93IHRoZSB1c2VyIHRvIHBsYWNlIHVzIG91dHNpZGUgb2Ygb3VyIGV4cGVjdGVkCisJICAjIGxvY2F0aW9uIGIvYyB0aGlzIHByZXZlbnRzIGZpbmRpbmcgZGVwZW5kZW50IGxpYnJhcmllcyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgdG8gdGhlIHNhbWUgcHJlZml4LgorCSAgIyBBdCBwcmVzZW50LCB0aGlzIGNoZWNrIGRvZXNuJ3QgYWZmZWN0IHdpbmRvd3MgLmRsbCdzIHRoYXQKKwkgICMgYXJlIGluc3RhbGxlZCBpbnRvICRsaWJkaXIvLi4vYmluIChjdXJyZW50bHksIHRoYXQgd29ya3MgZmluZSkKKwkgICMgYnV0IGl0J3Mgc29tZXRoaW5nIHRvIGtlZXAgYW4gZXllIG9uLgorCSAgdGVzdCAiJGluc3RfcHJlZml4X2RpciIgPSAiJGRlc3RkaXIiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IGNhbm5vdCBpbnN0YWxsIFxgJGZpbGUnIHRvIGEgZGlyZWN0b3J5IG5vdCBlbmRpbmcgaW4gJGxpYmRpciIKKworCSAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkgICAgIyBTdGljayB0aGUgaW5zdF9wcmVmaXhfZGlyIGRhdGEgaW50byB0aGUgbGluayBjb21tYW5kLgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQGluc3RfcHJlZml4X2RpckAlLWluc3QtcHJlZml4LWRpciAkaW5zdF9wcmVmaXhfZGlyJSJgCisJICBlbHNlCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAaW5zdF9wcmVmaXhfZGlyQCUlImAKKwkgIGZpCisKKwkgIGZ1bmNfd2FybmluZyAicmVsaW5raW5nIFxgJGZpbGUnIgorCSAgZnVuY19zaG93X2V2YWwgIiRyZWxpbmtfY29tbWFuZCIgXAorCSAgICAnZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IHJlbGluayBcYCRmaWxlJ1wnJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IicKKwlmaQorCisJIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXM7IHNoaWZ0CisJaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisJICByZWFsbmFtZT0iJDEiCisJICBzaGlmdAorCisJICBzcmNuYW1lPSIkcmVhbG5hbWUiCisJICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCisKKwkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiBcCisJICAgICAgJ2V4aXQgJD8nCisJICB0c3RyaXBtZT0iJHN0cmlwbWUiCisJICBjYXNlICRob3N0X29zIGluCisJICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisJICAgIGNhc2UgJHJlYWxuYW1lIGluCisJICAgICouZGxsLmEpCisJICAgICAgdHN0cmlwbWU9IiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0IC1uICIkdHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KKwkgICAgZnVuY19zaG93X2V2YWwgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiICdleGl0ICQ/JworCSAgZmkKKworCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCisJICAgICMgVHJ5IGBsbiAtc2YnIGZpcnN0LCBiZWNhdXNlIHRoZSBgbG4nIGJpbmFyeSBtaWdodCBkZXBlbmQgb24KKwkgICAgIyB0aGUgc3ltbGluayB3ZSByZXBsYWNlISAgU29sYXJpcyAvYmluL2xuIGRvZXMgbm90IHVuZGVyc3RhbmQgLWYsCisJICAgICMgc28gd2UgYWxzbyBuZWVkIHRvIHRyeSBybSAmJiBsbiAtcy4KKwkgICAgZm9yIGxpbmtuYW1lCisJICAgIGRvCisJICAgICAgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIiBcCisJCSYmIGZ1bmNfc2hvd19ldmFsICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJFJNICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKKwkgICAgZG9uZQorCSAgZmkKKworCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RpbnN0YWxsX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KKwlmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKwluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQorCWZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgJ2V4aXQgJD8nCisKKwkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCisJdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKKwk7OworCisgICAgICAqLmxvKQorCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgorCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisJICBkZXN0ZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwljYXNlICRkZXN0ZmlsZSBpbgorCSoubG8pCisJICBmdW5jX2xvMm8gIiRkZXN0ZmlsZSIKKwkgIHN0YXRpY2Rlc3Q9JGZ1bmNfbG8yb19yZXN1bHQKKwkgIDs7CisJKi4kb2JqZXh0KQorCSAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgorCSAgZGVzdGZpbGU9CisJICA7OworCSopCisJICBmdW5jX2ZhdGFsX2hlbHAgImNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIgorCSAgOzsKKwllc2FjCisKKwkjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KKwl0ZXN0IC1uICIkZGVzdGZpbGUiICYmIFwKKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgJ2V4aXQgJD8nCisKKwkjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KKwlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorCSAgZnVuY19sbzJvICIkZmlsZSIKKwkgIHN0YXRpY29iaj0kZnVuY19sbzJvX3Jlc3VsdAorCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiAnZXhpdCAkPycKKwlmaQorCWV4aXQgJEVYSVRfU1VDQ0VTUworCTs7CisKKyAgICAgICopCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisJICBkZXN0ZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nLCBhbmQgdGhlcmUgaXMgYSAuZXhlIG9uIHRoZSBlbmQsIHN0cmlwIGl0CisJIyBiZWNhdXNlIGl0IGlzIG1vc3QgbGlrZWx5IGEgbGlidG9vbCBzY3JpcHQgd2UgYWN0dWFsbHkgd2FudCB0bworCSMgaW5zdGFsbAorCXN0cmlwcGVkX2V4dD0iIgorCWNhc2UgJGZpbGUgaW4KKwkgICouZXhlKQorCSAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCisJICAgICAgZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgc3RyaXBwZWRfZXh0PSIuZXhlIgorCSAgICBmaQorCSAgICA7OworCWVzYWMKKworCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKwljYXNlICRob3N0IGluCisJKmN5Z3dpbiogfCAqbWluZ3cqKQorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHdyYXBwZXI9JGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgIGVsc2UKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICAgIHdyYXBwZXI9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICBmaQorCSAgICA7OworCSopCisJICAgIHdyYXBwZXI9JGZpbGUKKwkgICAgOzsKKwllc2FjCisJaWYgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiR3cmFwcGVyIjsgdGhlbgorCSAgbm90aW5zdF9kZXBsaWJzPQorCSAgcmVsaW5rX2NvbW1hbmQ9CisKKwkgIGZ1bmNfc291cmNlICIkd3JhcHBlciIKKworCSAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCisJICB0ZXN0IC16ICIkZ2VuZXJhdGVkX2J5X2xpYnRvb2xfdmVyc2lvbiIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkd3JhcHBlciciCisKKwkgIGZpbmFsaXplPXllcworCSAgZm9yIGxpYiBpbiAkbm90aW5zdF9kZXBsaWJzOyBkbworCSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCisJICAgIGxpYmRpcj0KKwkgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KKwkgICAgICBmdW5jX3NvdXJjZSAiJGxpYiIKKwkgICAgZmkKKwkgICAgbGliZmlsZT0iJGxpYmRpci8iYCRFQ0hPICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSVnJ2AgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiICYmIHRlc3QgISAtZiAiJGxpYmZpbGUiOyB0aGVuCisJICAgICAgZnVuY193YXJuaW5nICJcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIKKwkgICAgICBmaW5hbGl6ZT1ubworCSAgICBmaQorCSAgZG9uZQorCisJICByZWxpbmtfY29tbWFuZD0KKwkgIGZ1bmNfc291cmNlICIkd3JhcHBlciIKKworCSAgb3V0cHV0bmFtZT0KKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0gbm8gJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXM7IHRoZW4KKwkgICAgICAgIHRtcGRpcj1gZnVuY19ta3RlbXBkaXJgCisJCWZ1bmNfYmFzZW5hbWUgIiRmaWxlJHN0cmlwcGVkX2V4dCIKKwkJZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKKwkgICAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwkgICAgICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCisKKwkgICAgICAgICRvcHRfc2lsZW50IHx8IHsKKwkgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkcmVsaW5rX2NvbW1hbmQiCisJCSAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgICAgICAgfQorCSAgICAgICAgaWYgZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6CisJICAgICAgICAgIGVsc2UKKwkJICBmdW5jX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiCisJCSAgJG9wdF9kcnlfcnVuIHx8ICR7Uk19ciAiJHRtcGRpciIKKwkJICBjb250aW51ZQorCSAgICAgICAgZmkKKwkgICAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IHJlbGluayBcYCRmaWxlJyIKKwkgICAgICBmaQorCSAgICB9CisJICBlbHNlCisJICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KKwkgICAgZmlsZT1gJEVDSE8gIlgkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCisJICBmaQorCWZpCisKKwkjIHJlbW92ZSAuZXhlIHNpbmNlIGN5Z3dpbiAvdXNyL2Jpbi9pbnN0YWxsIHdpbGwgYXBwZW5kIGFub3RoZXIKKwkjIG9uZSBhbnl3YXkKKwljYXNlICRpbnN0YWxsX3Byb2csJGhvc3QgaW4KKwkqL3Vzci9iaW4vaW5zdGFsbCosKmN5Z3dpbiopCisJICBjYXNlICRmaWxlOiRkZXN0ZmlsZSBpbgorCSAgKi5leGU6Ki5leGUpCisJICAgICMgdGhpcyBpcyBvaworCSAgICA7OworCSAgKi5leGU6KikKKwkgICAgZGVzdGZpbGU9JGRlc3RmaWxlLmV4ZQorCSAgICA7OworCSAgKjoqLmV4ZSkKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZGVzdGZpbGUiCisJICAgIGRlc3RmaWxlPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCWZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiAnZXhpdCAkPycKKwkkb3B0X2RyeV9ydW4gfHwgaWYgdGVzdCAtbiAiJG91dHB1dG5hbWUiOyB0aGVuCisJICAke1JNfXIgIiR0bXBkaXIiCisJZmkKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbworICAgICAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisgICAgICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisKKyAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KKyAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCisKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgJ2V4aXQgJD8nCisKKyAgICAgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkb2xkX3N0cmlwbGliIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICIkb2xkX3N0cmlwbGliICRvbGRsaWIiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfcG9zdGluc3RhbGxfY21kcyIgJ2V4aXQgJD8nCisgICAgZG9uZQorCisgICAgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIiAmJiBcCisgICAgICBmdW5jX3dhcm5pbmcgInJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciCisKKyAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgorICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KKyAgICAgICRvcHRfZHJ5X3J1biAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjX2NtZD0nJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMnCisgICAgZWxzZQorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKK30KKwordGVzdCAiJG1vZGUiID0gaW5zdGFsbCAmJiBmdW5jX21vZGVfaW5zdGFsbCAkezErIiRAIn0KKworCisjIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zIG91dHB1dG5hbWUgb3JpZ2luYXRvciBwaWNfcAorIyBFeHRyYWN0IHN5bWJvbHMgZnJvbSBkbHByZWZpbGVzIGFuZCBjcmVhdGUgJHtvdXRwdXRuYW1lfVMubyB3aXRoCisjIGEgZGxwcmVvcGVuIHN5bWJvbCB0YWJsZS4KK2Z1bmNfZ2VuZXJhdGVfZGxzeW1zICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIG15X291dHB1dG5hbWU9IiQxIgorICAgIG15X29yaWdpbmF0b3I9IiQyIgorICAgIG15X3BpY19wPSIkezMtbm99IgorICAgIG15X3ByZWZpeD1gJEVDSE8gIiRteV9vcmlnaW5hdG9yIiB8IHNlZCAncyVbXmEtekEtWjAtOV0lXyVnJ2AKKyAgICBteV9kbHN5bXM9CisKKyAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJE5NIiAmJiB0ZXN0IC1uICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCW15X2Rsc3ltcz0iJHtteV9vdXRwdXRuYW1lfVMuYyIKKyAgICAgIGVsc2UKKwlmdW5jX2Vycm9yICJub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkbXlfZGxzeW1zIjsgdGhlbgorICAgICAgY2FzZSAkbXlfZGxzeW1zIGluCisgICAgICAiIikgOzsKKyAgICAgICouYykKKwkjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgorCW5saXN0PSIkb3V0cHV0X29iamRpci8ke215X291dHB1dG5hbWV9Lm5tIgorCisJZnVuY19zaG93X2V2YWwgIiRSTSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKKworCSMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCisJZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCisJJG9wdF9kcnlfcnVuIHx8ICRFQ0hPID4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisvKiAkbXlfZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG15X291dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KKy8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gXCJDXCIgeworI2VuZGlmCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwlpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgorCSAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgorCisJICAkb3B0X2RyeV9ydW4gfHwgZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCisKKwkgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KKwkgIHByb2dmaWxlcz1gJEVDSE8gIlgkb2JqcyRvbGRfZGVwbGlicyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCSAgZm9yIHByb2dmaWxlIGluICRwcm9nZmlsZXM7IGRvCisJICAgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkcHJvZ2ZpbGUnIgorCSAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJE5NICRwcm9nZmlsZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICBkb25lCisKKwkgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgZXZhbCAnJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgfQorCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICB9CisJICBmaQorCisJICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCSAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICBldmFsICIke1NFRH0gLW4gLWUgJy9eOiBAUFJPR1JBTUAgJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisgICAgICAgICAgICAgICAgZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKyAgICAgICAgICAgICAgICBldmFsICdjYXQgIiRleHBvcnRfc3ltYm9scyIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgfQorCSAgZWxzZQorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgIiR7U0VEfSAtZSAncy9cKFtdLlsqXiRdXCkvXFxcXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiJworCSAgICAgIGV2YWwgJyRHUkVQIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICAqY3lnd2luIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgICAgICAgICBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgICBldmFsICdjYXQgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICB9CisJICBmaQorCWZpCisKKwlmb3IgZGxwcmVmaWxlIGluICRkbHByZWZpbGVzOyBkbworCSAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRkbHByZWZpbGUnIgorCSAgZnVuY19iYXNlbmFtZSAiJGRscHJlZmlsZSIKKwkgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgIGV2YWwgIiROTSAkZGxwcmVmaWxlIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgIH0KKwlkb25lCisKKwkkb3B0X2RyeV9ydW4gfHwgeworCSAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgorCSAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKKworCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKKwkgICAgJE1WICIkbmxpc3QiVCAiJG5saXN0IgorCSAgZmkKKworCSAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKwkgIGlmICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgfAorCSAgICAgIGlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlzb3J0IC1rIDMKKwkgICAgICBlbHNlCisJCXNvcnQgKzIKKwkgICAgICBmaSB8CisJICAgICAgdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKKwkgIGZpCisKKwkgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiJworCSAgZWxzZQorCSAgICAkRUNITyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisJICBmaQorCisJICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICB2b2lkICphZGRyZXNzOworfSBsdF9kbHN5bWxpc3Q7CisiCisJICBjYXNlICRob3N0IGluCisJICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgJEVDSE8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNvbid0IGJlIGNvbnN0LCBiZWNhdXNlCisgICBydW50aW1lIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbgorICAgb24gcHNldWRvLXJlbG9jcy4gICovIgorCSAgICBsdF9kbHN5bV9jb25zdD0gOzsKKwkgICpvc2Y1KikKKwkgICAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEgKi8iCisJICAgIGx0X2Rsc3ltX2NvbnN0PSA7OworCSAgKikKKwkgICAgbHRfZGxzeW1fY29uc3Q9Y29uc3QgOzsKKwkgIGVzYWMKKworCSAgJEVDSE8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCitleHRlcm4gJGx0X2Rsc3ltX2NvbnN0IGx0X2Rsc3ltbGlzdAorbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdOworJGx0X2Rsc3ltX2NvbnN0IGx0X2Rsc3ltbGlzdAorbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3tcCisgIHsgXCIkbXlfb3JpZ2luYXRvclwiLCAodm9pZCAqKSAwIH0sIgorCisJICBjYXNlICRuZWVkX2xpYl9wcmVmaXggaW4KKwkgIG5vKQorCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgICAgOzsKKwkgICopCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXgiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisJICAgIDs7CisJICBlc2FjCisJICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKyAgezAsICh2b2lkICopIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmXAorIgorCX0gIyAhJG9wdF9kcnlfcnVuCisKKwlwaWNfZmxhZ19mb3Jfc3ltdGFibGU9CisJY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJKiIgLXN0YXRpYyAiKikgOzsKKwkqKQorCSAgY2FzZSAkaG9zdCBpbgorCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCisJICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKKwkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKKwkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgorCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KKwkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikKKwkgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1ERlJFRUJTRF9XT1JLQVJPVU5EIiA7OworCSAgKi0qLWhwdXgqKQorCSAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiWCRteV9waWNfcCIgIT0gWG5vOyB0aGVuCisJICAgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIgorCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJc3ltdGFiX2NmbGFncz0KKwlmb3IgYXJnIGluICRMVENGTEFHUzsgZG8KKwkgIGNhc2UgJGFyZyBpbgorCSAgLXBpZSB8IC1mcGllIHwgLWZQSUUpIDs7CisJICAqKSBzeW10YWJfY2ZsYWdzPSIkc3ltdGFiX2NmbGFncyAkYXJnIiA7OworCSAgZXNhYworCWRvbmUKKworCSMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCisJZnVuY19zaG93X2V2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyRzeW10YWJfY2ZsYWdzIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRteV9kbHN5bXMiKScgJ2V4aXQgJD8nCisKKwkjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCInCisKKwkjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgorCXN5bWZpbGVvYmo9IiRvdXRwdXRfb2JqZGlyLyR7bXlfb3V0cHV0bmFtZX1TLiRvYmpleHQiCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmIjsgdGhlbgorCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAorCSAgZWxzZQorCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIGZpCisJICA7OworCSopCisJICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlmdW5jX2ZhdGFsX2Vycm9yICJ1bmtub3duIHN1ZmZpeCBmb3IgXGAkbXlfZGxzeW1zJyIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgICMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCisgICAgICAjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCisgICAgICAjIHJlYWxseSB3YXMgcmVxdWlyZWQuCisKKyAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisgICAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgIGZpCit9CisKKyMgZnVuY193aW4zMl9saWJpZCBhcmcKKyMgcmV0dXJuIHRoZSBsaWJyYXJ5IHR5cGUgb2YgZmlsZSAnYXJnJworIworIyBOZWVkIGEgbG90IG9mIGdvbyB0byBoYW5kbGUgKmJvdGgqIERMTHMgYW5kIGltcG9ydCBsaWJzCisjIEhhcyB0byBiZSBhIHNoZWxsIGZ1bmN0aW9uIGluIG9yZGVyIHRvICdlYXQnIHRoZSBhcmd1bWVudAorIyB0aGF0IGlzIHN1cHBsaWVkIHdoZW4gJGZpbGVfbWFnaWNfY29tbWFuZCBpcyBjYWxsZWQuCitmdW5jX3dpbjMyX2xpYmlkICgpCit7CisgICRvcHRfZGVidWcKKyAgd2luMzJfbGliaWRfdHlwZT0idW5rbm93biIKKyAgd2luMzJfZmlsZXJlcz1gZmlsZSAtTCAkMSAyPi9kZXYvbnVsbGAKKyAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAqYXJcIGFyY2hpdmVcIGltcG9ydFwgbGlicmFyeSopICMgZGVmaW5pdGVseSBpbXBvcnQKKyAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCisgICAgOzsKKyAgKmFyXCBhcmNoaXZlKikgIyBjb3VsZCBiZSBhbiBpbXBvcnQsIG9yIHN0YXRpYworICAgIGlmIGV2YWwgJE9CSkRVTVAgLWYgJDEgfCAkU0VEIC1lICcxMHEnIDI+L2Rldi9udWxsIHwKKyAgICAgICAkRUdSRVAgJ2ZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSAkMSB8CisJJFNFRCAtbiAtZSAnCisJICAgIDEsMTAweworCQkvIEkgL3sKKwkJICAgIHMsLiosaW1wb3J0LAorCQkgICAgcAorCQkgICAgcQorCQl9CisJICAgIH0nYAorICAgICAgY2FzZSAkd2luMzJfbm1yZXMgaW4KKyAgICAgIGltcG9ydCopICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiOzsKKyAgICAgICopICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBzdGF0aWMiOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgICpETEwqKQorICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgOzsKKyAgKmV4ZWN1dGFibGUqKSAjIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSAiZXhlY3V0YWJsZSIgdG9vLi4uCisgICAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAgICpNU1wgV2luZG93c1wgUEVcIEludGVsKikKKyAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICRFQ0hPICIkd2luMzJfbGliaWRfdHlwZSIKK30KKworCisKKyMgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgZGlyIG9sZGxpYgorZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgZl9leF9hbl9hcl9kaXI9IiQxIjsgc2hpZnQKKyAgICBmX2V4X2FuX2FyX29sZGxpYj0iJDEiCisgICAgZnVuY19zaG93X2V2YWwgIihjZCBcJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4IFwiXCRmX2V4X2FuX2FyX29sZGxpYlwiKSIgJ2V4aXQgJD8nCisgICAgaWYgKCRBUiB0ICIkZl9leF9hbl9hcl9vbGRsaWIiIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgOgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9iamVjdCBuYW1lIGNvbmZsaWN0cyBpbiBhcmNoaXZlOiAkZl9leF9hbl9hcl9kaXIvJGZfZXhfYW5fYXJfb2xkbGliIgorICAgIGZpCit9CisKKworIyBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgZ2VudG9wIG9sZGxpYiAuLi4KK2Z1bmNfZXh0cmFjdF9hcmNoaXZlcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBteV9nZW50b3A9IiQxIjsgc2hpZnQKKyAgICBteV9vbGRsaWJzPSR7MSsiJEAifQorICAgIG15X29sZG9ianM9IiIKKyAgICBteV94bGliPSIiCisgICAgbXlfeGFicz0iIgorICAgIG15X3hkaXI9IiIKKworICAgIGZvciBteV94bGliIGluICRteV9vbGRsaWJzOyBkbworICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorICAgICAgY2FzZSAkbXlfeGxpYiBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgbXlfeGFicz0iJG15X3hsaWIiIDs7CisJKikgbXlfeGFicz1gcHdkYCIvJG15X3hsaWIiIDs7CisgICAgICBlc2FjCisgICAgICBmdW5jX2Jhc2VuYW1lICIkbXlfeGxpYiIKKyAgICAgIG15X3hsaWI9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgIG15X3hsaWJfdT0kbXlfeGxpYgorICAgICAgd2hpbGUgOjsgZG8KKyAgICAgICAgY2FzZSAiICRleHRyYWN0ZWRfYXJjaGl2ZXMgIiBpbgorCSoiICRteV94bGliX3UgIiopCisJICBmdW5jX2FyaXRoICRleHRyYWN0ZWRfc2VyaWFsICsgMQorCSAgZXh0cmFjdGVkX3NlcmlhbD0kZnVuY19hcml0aF9yZXN1bHQKKwkgIG15X3hsaWJfdT1sdCRleHRyYWN0ZWRfc2VyaWFsLSRteV94bGliIDs7CisJKikgYnJlYWsgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBleHRyYWN0ZWRfYXJjaGl2ZXM9IiRleHRyYWN0ZWRfYXJjaGl2ZXMgJG15X3hsaWJfdSIKKyAgICAgIG15X3hkaXI9IiRteV9nZW50b3AvJG15X3hsaWJfdSIKKworICAgICAgZnVuY19ta2Rpcl9wICIkbXlfeGRpciIKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi1kYXJ3aW4qKQorCWZ1bmNfdmVyYm9zZSAiRXh0cmFjdGluZyAkbXlfeGFicyIKKwkjIERvIG5vdCBib3RoZXIgZG9pbmcgYW55dGhpbmcgaWYganVzdCBhIGRyeSBydW4KKwkkb3B0X2RyeV9ydW4gfHwgeworCSAgZGFyd2luX29yaWdfZGlyPWBwd2RgCisJICBjZCAkbXlfeGRpciB8fCBleGl0ICQ/CisJICBkYXJ3aW5fYXJjaGl2ZT0kbXlfeGFicworCSAgZGFyd2luX2N1cmRpcj1gcHdkYAorCSAgZGFyd2luX2Jhc2VfYXJjaGl2ZT1gYmFzZW5hbWUgIiRkYXJ3aW5fYXJjaGl2ZSJgCisJICBkYXJ3aW5fYXJjaGVzPWAkTElQTyAtaW5mbyAiJGRhcndpbl9hcmNoaXZlIiAyPi9kZXYvbnVsbCB8ICRHUkVQIEFyY2hpdGVjdHVyZXMgMj4vZGV2L251bGwgfHwgdHJ1ZWAKKwkgIGlmIHRlc3QgLW4gIiRkYXJ3aW5fYXJjaGVzIjsgdGhlbgorCSAgICBkYXJ3aW5fYXJjaGVzPWAkRUNITyAiJGRhcndpbl9hcmNoZXMiIHwgJFNFRCAtZSAncy8uKmFyZTovLydgCisJICAgIGRhcndpbl9hcmNoPQorCSAgICBmdW5jX3ZlcmJvc2UgIiRkYXJ3aW5fYmFzZV9hcmNoaXZlIGhhcyBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzICRkYXJ3aW5fYXJjaGVzIgorCSAgICBmb3IgZGFyd2luX2FyY2ggaW4gICRkYXJ3aW5fYXJjaGVzIDsgZG8KKwkgICAgICBmdW5jX21rZGlyX3AgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCisJICAgICAgJExJUE8gLXRoaW4gJGRhcndpbl9hcmNoIC1vdXRwdXQgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIgIiR7ZGFyd2luX2FyY2hpdmV9IgorCSAgICAgIGNkICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICJgcHdkYCIgIiR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCisJICAgICAgY2QgIiRkYXJ3aW5fY3VyZGlyIgorCSAgICAgICRSTSAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICBkb25lICMgJGRhcndpbl9hcmNoZXMKKyAgICAgICAgICAgICMjIE9rYXkgbm93IHdlJ3ZlIGEgYnVuY2ggb2YgdGhpbiBvYmplY3RzLCBnb3R0YSBmYXR0ZW4gdGhlbSB1cCA6KQorCSAgICBkYXJ3aW5fZmlsZWxpc3Q9YGZpbmQgdW5mYXQtJCQgLXR5cGUgZiAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkU0VEIC1lICIkYmFzZW5hbWUiIHwgc29ydCAtdWAKKwkgICAgZGFyd2luX2ZpbGU9CisJICAgIGRhcndpbl9maWxlcz0KKwkgICAgZm9yIGRhcndpbl9maWxlIGluICRkYXJ3aW5fZmlsZWxpc3Q7IGRvCisJICAgICAgZGFyd2luX2ZpbGVzPWBmaW5kIHVuZmF0LSQkIC1uYW1lICRkYXJ3aW5fZmlsZSAtcHJpbnQgfCAkTkwyU1BgCisJICAgICAgJExJUE8gLWNyZWF0ZSAtb3V0cHV0ICIkZGFyd2luX2ZpbGUiICRkYXJ3aW5fZmlsZXMKKwkgICAgZG9uZSAjICRkYXJ3aW5fZmlsZWxpc3QKKwkgICAgJFJNIC1yZiB1bmZhdC0kJAorCSAgICBjZCAiJGRhcndpbl9vcmlnX2RpciIKKwkgIGVsc2UKKwkgICAgY2QgJGRhcndpbl9vcmlnX2RpcgorCSAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKKwkgIGZpICMgJGRhcndpbl9hcmNoZXMKKwl9ICMgISRvcHRfZHJ5X3J1bgorCTs7CisgICAgICAqKQorICAgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKKwk7OworICAgICAgZXNhYworICAgICAgbXlfb2xkb2Jqcz0iJG15X29sZG9ianMgImBmaW5kICRteV94ZGlyIC1uYW1lIFwqLiRvYmpleHQgLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKKyAgICBkb25lCisKKyAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0PSIkbXlfb2xkb2JqcyIKK30KKworCisKKyMgZnVuY19lbWl0X3dyYXBwZXJfcGFydDEgW2FyZz1ub10KKyMKKyMgRW1pdCB0aGUgZmlyc3QgcGFydCBvZiBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb24gc3Rkb3V0LgorIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkZXNjcmlwdGlvbiBhc3NvY2lhdGVkIHdpdGgKKyMgZnVuY19lbWl0X3dyYXBwZXIoKSwgYmVsb3cuCitmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MSAoKQoreworCWZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxX2FyZzE9bm8KKwlpZiB0ZXN0IC1uICIkMSIgOyB0aGVuCisJICBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MV9hcmcxPSQxCisJZmkKKworCSRFQ0hPICJcCisjISAkU0hFTEwKKworIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisjIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKyMKKyMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCisjIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9JyR7U0VEfSAtZSAxcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uIFwiXCR7WlNIX1ZFUlNJT04rc2V0fVwiICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCitmaQorQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgorCisjIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCitpZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CisgIGdlbmVyYXRlZF9ieV9saWJ0b29sX3ZlcnNpb249JyRtYWNyb192ZXJzaW9uJworICBub3RpbnN0X2RlcGxpYnM9JyRub3RpbnN0X2RlcGxpYnMnCitlbHNlCisgICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRFQ0hPIGFyZSBhbHJlYWR5IHNldC4KKyAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgIEVDSE89XCIkcWVjaG9cIgorICAgIGZpbGU9XCJcJDBcIgorICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCisgICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgICAgICBzaGlmdAorICAgIGVsaWYgdGVzdCBcIlhcYHsgXCRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KKyAgICAgICMgWWlwcGVlLCBcJEVDSE8gd29ya3MhCisgICAgICA6CisgICAgZWxzZQorICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJEVDSE8gd2lsbCB3b3JrLgorICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9CisgICAgZmkKKyAgZmlcCisiCisJJEVDSE8gIlwKKworICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgorICB0aGlzZGlyPVxgXCRFQ0hPIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAorICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCisKKyAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCisgIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAorICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCisgICAgZGVzdGRpcj1cYFwkRUNITyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCisKKyAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCisgICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgorICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCisgICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKKyAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorCisgICAgZmlsZT1cYFwkRUNITyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKKyAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCisgIGRvbmUKKyIKK30KKyMgZW5kOiBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MQorCisjIGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQyIFthcmc9bm9dCisjCisjIEVtaXQgdGhlIHNlY29uZCBwYXJ0IG9mIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvbiBzdGRvdXQuCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aAorIyBmdW5jX2VtaXRfd3JhcHBlcigpLCBiZWxvdy4KK2Z1bmNfZW1pdF93cmFwcGVyX3BhcnQyICgpCit7CisJZnVuY19lbWl0X3dyYXBwZXJfcGFydDJfYXJnMT1ubworCWlmIHRlc3QgLW4gIiQxIiA7IHRoZW4KKwkgIGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQyX2FyZzE9JDEKKwlmaQorCisJJEVDSE8gIlwKKworICAjIFVzdWFsbHkgJ25vJywgZXhjZXB0IG9uIGN5Z3dpbi9taW5ndyB3aGVuIGVtYmVkZGVkIGludG8KKyAgIyB0aGUgY3dyYXBwZXIuCisgIFdSQVBQRVJfU0NSSVBUX0JFTE9OR1NfSU5fT0JKRElSPSRmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0Ml9hcmcxCisgIGlmIHRlc3QgXCJcJFdSQVBQRVJfU0NSSVBUX0JFTE9OR1NfSU5fT0JKRElSXCIgPSBcInllc1wiOyB0aGVuCisgICAgIyBzcGVjaWFsIGNhc2UgZm9yICcuJworICAgIGlmIHRlc3QgXCJcJHRoaXNkaXJcIiA9IFwiLlwiOyB0aGVuCisgICAgICB0aGlzZGlyPVxgcHdkXGAKKyAgICBmaQorICAgICMgcmVtb3ZlIC5saWJzIGZyb20gdGhpc2RpcgorICAgIGNhc2UgXCJcJHRoaXNkaXJcIiBpbgorICAgICpbXFxcXC9dJG9iamRpciApIHRoaXNkaXI9XGBcJEVDSE8gXCJYXCR0aGlzZGlyXCIgfCBcJFhzZWQgLWUgJ3MlW1xcXFwvXVteXFxcXC9dKiQlJSdcYCA7OworICAgICRvYmpkaXIgKSAgIHRoaXNkaXI9LiA7OworICAgIGVzYWMKKyAgZmkKKworICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgorICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCisgIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCisiCisKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgJEVDSE8gIlwKKyAgcHJvZ3JhbT1sdC0nJG91dHB1dG5hbWUnJGV4ZWV4dAorICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorCisgIGlmIHRlc3QgISAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiB8fAorICAgICB7IGZpbGU9XGBscyAtMWR0IFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwiXCRwcm9nZGlyLy4uL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHwgJHtTRUR9IDFxXGA7IFxcCisgICAgICAgdGVzdCBcIlhcJGZpbGVcIiAhPSBcIlhcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH07IHRoZW4KKworICAgIGZpbGU9XCJcJFwkLVwkcHJvZ3JhbVwiCisKKyAgICBpZiB0ZXN0ICEgLWQgXCJcJHByb2dkaXJcIjsgdGhlbgorICAgICAgJE1LRElSIFwiXCRwcm9nZGlyXCIKKyAgICBlbHNlCisgICAgICAkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKyAgICBmaSIKKworCSAgJEVDSE8gIlwKKworICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5CisgICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgorICAgICAgaWYgcmVsaW5rX2NvbW1hbmRfb3V0cHV0PVxgZXZhbCBcJHJlbGlua19jb21tYW5kIDI+JjFcYDsgdGhlbiA6CisgICAgICBlbHNlCisJJEVDSE8gXCJcJHJlbGlua19jb21tYW5kX291dHB1dFwiID4mMgorCSRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorCWV4aXQgMQorICAgICAgZmkKKyAgICBmaQorCisgICAgJE1WIFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8CisgICAgeyAkUk0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7CisgICAgICAkTVYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KKyAgICAkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKyAgZmkiCisJZWxzZQorCSAgJEVDSE8gIlwKKyAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCisgIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCisiCisJZmkKKworCSRFQ0hPICJcCisKKyAgaWYgdGVzdCAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgdGhlbiIKKworCSMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgorCWlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KKwkgICRFQ0hPICJcCisgICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKKyAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCisKKyAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKKyAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAorICAgICRzaGxpYnBhdGhfdmFyPVxgXCRFQ0hPIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCisKKyAgICBleHBvcnQgJHNobGlicGF0aF92YXIKKyIKKwlmaQorCisJIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KKwlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKwkgICRFQ0hPICJcCisgICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKKyAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAorIgorCWZpCisKKwkkRUNITyAiXAorICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCisiCisJY2FzZSAkaG9zdCBpbgorCSMgQmFja3NsYXNoZXMgc2VwYXJhdGUgZGlyZWN0b3JpZXMgb24gcGxhaW4gd2luZG93cworCSotKi1taW5ndyB8ICotKi1vczIqIHwgKi1jZWdjYyopCisJICAkRUNITyAiXAorICAgICAgZXhlYyBcIlwkcHJvZ2RpclxcXFxcJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9CisiCisJICA7OworCisJKikKKwkgICRFQ0hPICJcCisgICAgICBleGVjIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKwkgIDs7CisJZXNhYworCSRFQ0hPICJcCisgICAgICBcJEVDSE8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJCpcIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorICBlbHNlCisgICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgorICAgIFwkRUNITyBcIlwkMDogZXJyb3I6IFxcXGBcJHByb2dkaXIvXCRwcm9ncmFtJyBkb2VzIG5vdCBleGlzdFwiIDE+JjIKKyAgICBcJEVDSE8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKKyAgICAkRUNITyBcIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCitmaVwKKyIKK30KKyMgZW5kOiBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MgorCisKKyMgZnVuY19lbWl0X3dyYXBwZXIgW2FyZz1ub10KKyMKKyMgRW1pdCBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb24gc3Rkb3V0LgorIyBEb24ndCBkaXJlY3RseSBvcGVuIGEgZmlsZSBiZWNhdXNlIHdlIG1heSB3YW50IHRvCisjIGluY29ycG9yYXRlIHRoZSBzY3JpcHQgY29udGVudHMgd2l0aGluIGEgY3lnd2luL21pbmd3CisjIHdyYXBwZXIgZXhlY3V0YWJsZS4gIE11c3QgT05MWSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4KKyMgZnVuY19tb2RlX2xpbmsgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIGEgbnVtYmVyIG9mIHZhcmlhYmxlcworIyBzZXQgdGhlcmVpbi4KKyMKKyMgQVJHIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZSBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUgorIyB2YXJpYWJsZSB3aWxsIHRha2UuICBJZiAneWVzJywgdGhlbiB0aGUgZW1pdHRlZCBzY3JpcHQKKyMgd2lsbCBhc3N1bWUgdGhhdCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGlzIHN0b3JlZCBpcworIyB0aGUgJG9iamRpciBkaXJlY3RvcnkuICBUaGlzIGlzIGEgY3lnd2luL21pbmd3LXNwZWNpZmljCisjIGJlaGF2aW9yLgorZnVuY19lbWl0X3dyYXBwZXIgKCkKK3sKKwlmdW5jX2VtaXRfd3JhcHBlcl9hcmcxPW5vCisJaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgorCSAgZnVuY19lbWl0X3dyYXBwZXJfYXJnMT0kMQorCWZpCisKKwkjIHNwbGl0IHRoaXMgdXAgc28gdGhhdCBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCisJIyBjYW4gY2FsbCBlYWNoIHBhcnQgaW5kZXBlbmRlbnRseS4KKwlmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MSAiJHtmdW5jX2VtaXRfd3JhcHBlcl9hcmcxfSIKKwlmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MiAiJHtmdW5jX2VtaXRfd3JhcHBlcl9hcmcxfSIKK30KKworCisjIGZ1bmNfdG9faG9zdF9wYXRoIGFyZworIworIyBDb252ZXJ0IHBhdGhzIHRvIGhvc3QgZm9ybWF0IHdoZW4gdXNlZCB3aXRoIGJ1aWxkIHRvb2xzLgorIyBJbnRlbmRlZCBmb3IgdXNlIHdpdGggIm5hdGl2ZSIgbWluZ3cgKHdoZXJlIGxpYnRvb2wgaXRzZWxmCisjIGlzIHJ1bm5pbmcgdW5kZXIgdGhlIG1zeXMgc2hlbGwpLCBvciBpbiB0aGUgZm9sbG93aW5nIGNyb3NzLQorIyBidWlsZCBlbnZpcm9ubWVudHM6CisjICAgICRidWlsZCAgICAgICAgICAkaG9zdAorIyAgICBtaW5ndyAobXN5cykgICAgbWluZ3cgIFtlLmcuIG5hdGl2ZV0KKyMgICAgY3lnd2luICAgICAgICAgIG1pbmd3CisjICAgICpuaXggKyB3aW5lICAgICBtaW5ndworIyB3aGVyZSB3aW5lIGlzIGVxdWlwcGVkIHdpdGggdGhlIGB3aW5lcGF0aCcgZXhlY3V0YWJsZS4KKyMgSW4gdGhlIG5hdGl2ZSBtaW5ndyBjYXNlLCB0aGUgKG1zeXMpIHNoZWxsIGF1dG9tYXRpY2FsbHkKKyMgY29udmVydHMgcGF0aHMgZm9yIGFueSBub24tbXN5cyBhcHBsaWNhdGlvbnMgaXQgbGF1bmNoZXMsCisjIGJ1dCB0aGF0IGZhY2lsaXR5IGlzbid0IGF2YWlsYWJsZSBmcm9tIGluc2lkZSB0aGUgY3dyYXBwZXIuCisjIFNpbWlsYXIgYWNjb21tb2RhdGlvbnMgYXJlIG5lY2Vzc2FyeSBmb3IgJGhvc3QgbWluZ3cgYW5kCisjICRidWlsZCBjeWd3aW4uICBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gZG9lcyBubyBoYXJtIGZvciBvdGhlcgorIyAkaG9zdC8kYnVpbGQgY29tYmluYXRpb25zIG5vdCBsaXN0ZWQgYWJvdmUuCisjCisjIEFSRyBpcyB0aGUgcGF0aCAob24gJGJ1aWxkKSB0aGF0IHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8KKyMgdGhlIHByb3BlciByZXByZXNlbnRhdGlvbiBmb3IgJGhvc3QuIFRoZSByZXN1bHQgaXMgc3RvcmVkCisjIGluICRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQuCitmdW5jX3RvX2hvc3RfcGF0aCAoKQoreworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSIgOyB0aGVuCisgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKm1pbmd3KiApCisgICAgICAgIGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnk9J3N8XFxcXCp8XFx8ZztzfC98XFx8ZztzfFxcfFxcXFx8ZycKKyAgICAgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICAgICAqbWluZ3cqICkgIyBhY3R1YWxseSwgbXN5cworICAgICAgICAgICAgIyBhd2t3YXJkOiBjbWQgYXBwZW5kcyBzcGFjZXMgdG8gcmVzdWx0CisgICAgICAgICAgICBsdF9zZWRfc3RyaXBfdHJhaWxpbmdfc3BhY2VzPSJzL1sgXSpcJC8vIgorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT1gKCBjbWQgLy9jIGVjaG8gIiQxIiB8XAorICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcyIgKSAyPi9kZXYvbnVsbCB8fCBlY2hvICIiYAorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgfFwKKyAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAorICAgICAgICAgICAgOzsKKyAgICAgICAgICAqY3lnd2luKiApCisgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPWBjeWdwYXRoIC13ICIkMSJgCisgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiB8XAorICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCisgICAgICAgICAgICA7OworICAgICAgICAgICogKQorICAgICAgICAgICAgIyBVbmZvcnR1bmF0ZWx5LCB3aW5lcGF0aCBkb2VzIG5vdCBleGl0IHdpdGggYSBub24temVybworICAgICAgICAgICAgIyBlcnJvciBjb2RlLCBzbyB3ZSBhcmUgZm9yY2VkIHRvIGNoZWNrIHRoZSBjb250ZW50cyBvZgorICAgICAgICAgICAgIyBzdGRvdXQuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgY29tbWFuZCBpcyBub3QKKyAgICAgICAgICAgICMgZm91bmQsIHRoZSBzaGVsbCB3aWxsIHNldCBhbiBleGl0IGNvZGUgb2YgMTI3IGFuZCBwcmludAorICAgICAgICAgICAgIyAqYW4gZXJyb3IgbWVzc2FnZSogdG8gc3Rkb3V0LiBTbyB3ZSBtdXN0IGNoZWNrIGZvciBib3RoCisgICAgICAgICAgICAjIGVycm9yIGNvZGUgb2YgemVybyBBTkQgbm9uLWVtcHR5IHN0ZG91dCwgd2hpY2ggZXhwbGFpbnMKKyAgICAgICAgICAgICMgdGhlIG9kZCBjb25zdHJ1Y3Rpb246CisgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPWB3aW5lcGF0aCAtdyAiJDEiIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgaWYgdGVzdCAiJD8iIC1lcSAwICYmIHRlc3QgLW4gIiR7ZnVuY190b19ob3N0X3BhdGhfdG1wMX0iOyB0aGVuCisgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiIHxcCisgICAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAjIEFsbG93IHdhcm5pbmcgYmVsb3cuCisgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgaWYgdGVzdCAteiAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIgOyB0aGVuCisgICAgICAgICAgI2Z1bmNfZXJyb3IgIkNvdWxkIG5vdCBkZXRlcm1pbmUgaG9zdCBwYXRoIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgICAgICAgI2Z1bmNfZXJyb3IgIiAgJyQxJyIKKyAgICAgICAgICAjZnVuY19lcnJvciAiQ29udGludWluZywgYnV0IHVuaW5zdGFsbGVkIGV4ZWN1dGFibGVzIG1heSBub3Qgd29yay4iCisgICAgICAgICAgIyBGYWxsYmFjazoKKyAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICAgICAgICBmaQorICAgICAgICA7OworICAgIGVzYWMKKyAgZmkKK30KKyMgZW5kOiBmdW5jX3RvX2hvc3RfcGF0aAorCisjIGZ1bmNfdG9faG9zdF9wYXRobGlzdCBhcmcKKyMKKyMgQ29udmVydCBwYXRobGlzdHMgdG8gaG9zdCBmb3JtYXQgd2hlbiB1c2VkIHdpdGggYnVpbGQgdG9vbHMuCisjIFNlZSBmdW5jX3RvX2hvc3RfcGF0aCgpLCBhYm92ZS4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyB0aGUKKyMgZm9sbG93aW5nICRidWlsZC8kaG9zdCBjb21iaW5hdGlvbnMgKGJ1dCBkb2VzIG5vIGhhcm0gZm9yCisjIGNvbWJpbmF0aW9ucyBub3QgbGlzdGVkIGhlcmUpOgorIyAgICAkYnVpbGQgICAgICAgICAgJGhvc3QKKyMgICAgbWluZ3cgKG1zeXMpICAgIG1pbmd3ICBbZS5nLiBuYXRpdmVdCisjICAgIGN5Z3dpbiAgICAgICAgICBtaW5ndworIyAgICAqbml4ICsgd2luZSAgICAgbWluZ3cKKyMKKyMgUGF0aCBzZXBhcmF0b3JzIGFyZSBhbHNvIGNvbnZlcnRlZCBmcm9tICRidWlsZCBmb3JtYXQgdG8KKyMgJGhvc3QgZm9ybWF0LiBJZiBBUkcgYmVnaW5zIG9yIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yCisjIGNoYXJhY3RlciwgaXQgaXMgcHJlc2VydmVkIChidXQgY29udmVydGVkIHRvICRob3N0IGZvcm1hdCkKKyMgb24gb3V0cHV0LgorIworIyBBUkcgaXMgYSBwYXRobGlzdCAob24gJGJ1aWxkKSB0aGF0IHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8KKyMgdGhlIHByb3BlciByZXByZXNlbnRhdGlvbiBvbiAkaG9zdC4gVGhlIHJlc3VsdCBpcyBzdG9yZWQKKyMgaW4gJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQuCitmdW5jX3RvX2hvc3RfcGF0aGxpc3QgKCkKK3sKKyAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIiA7IHRoZW4KKyAgICBjYXNlICRob3N0IGluCisgICAgICAqbWluZ3cqICkKKyAgICAgICAgbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeT0nc3xcXFxcKnxcXHxnO3N8L3xcXHxnO3N8XFx8XFxcXHxnJworICAgICAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZyb20KKyAgICAgICAgIyBBUkcuIG1zeXMgYmVoYXZpb3IgaXMgaW5jb25zaXN0ZW50IGhlcmUsIGN5Z3BhdGggdHVybnMgdGhlbQorICAgICAgICAjIGludG8gJy47JyBhbmQgJzsuJywgYW5kIHdpbmVwYXRoIGlnbm9yZXMgdGhlbSBjb21wbGV0ZWx5LgorICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMj0iJDEiCisgICAgICAgICMgT25jZSBzZXQgZm9yIHRoaXMgY2FsbCwgdGhpcyB2YXJpYWJsZSBzaG91bGQgbm90IGJlCisgICAgICAgICMgcmVhc3NpZ25lZC4gSXQgaXMgdXNlZCBpbiB0aGEgZmFsbGJhY2sgY2FzZS4KKyAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDE9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMiIgfFwKKyAgICAgICAgICAkU0VEIC1lICdzfF46Knx8JyAtZSAnc3w6KiR8fCdgCisgICAgICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAgICAgKm1pbmd3KiApICMgQWN0dWFsbHksIG1zeXMuCisgICAgICAgICAgICAjIEF3a3dhcmQ6IGNtZCBhcHBlbmRzIHNwYWNlcyB0byByZXN1bHQuCisgICAgICAgICAgICBsdF9zZWRfc3RyaXBfdHJhaWxpbmdfc3BhY2VzPSJzL1sgXSpcJC8vIgorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDI9YCggY21kIC8vYyBlY2hvICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDEiIHxcCisgICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfc3RyaXBfdHJhaWxpbmdfc3BhY2VzIiApIDI+L2Rldi9udWxsIHx8IGVjaG8gIiJgCisgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDIiIHxcCisgICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKmN5Z3dpbiogKQorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDI9YGN5Z3BhdGggLXcgLXAgIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfdG1wMSJgCisgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDIiIHxcCisgICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKiApCisgICAgICAgICAgICAjIHVuZm9ydHVuYXRlbHksIHdpbmVwYXRoIGRvZXNuJ3QgY29udmVydCBwYXRobGlzdHMKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9IiIKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9vbGRJRlM9JElGUworICAgICAgICAgICAgSUZTPToKKyAgICAgICAgICAgIGZvciBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfZiBpbiAkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDEgOyBkbworICAgICAgICAgICAgICBJRlM9JGZ1bmNfdG9faG9zdF9wYXRobGlzdF9vbGRJRlMKKyAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9mIiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aCAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9mIgorICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdDskZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBJRlM9OgorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgSUZTPSRmdW5jX3RvX2hvc3RfcGF0aGxpc3Rfb2xkSUZTCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0IiA7IHRoZW4KKyAgICAgICAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBob3N0IHBhdGgocykgY29ycmVzcG9uZGluZyB0byIKKyAgICAgICAgICBmdW5jX2Vycm9yICIgICckMSciCisgICAgICAgICAgZnVuY19lcnJvciAiQ29udGludWluZywgYnV0IHVuaW5zdGFsbGVkIGV4ZWN1dGFibGVzIG1heSBub3Qgd29yay4iCisgICAgICAgICAgIyBGYWxsYmFjay4gVGhpcyBtYXkgYnJlYWsgaWYgJDEgY29udGFpbnMgRE9TLXN0eWxlIGRyaXZlCisgICAgICAgICAgIyBzcGVjaWZpY2F0aW9ucy4gVGhlIGZpeCBpcyBub3QgdG8gY29tcGxpY2F0ZSB0aGUgZXhwcmVzc2lvbgorICAgICAgICAgICMgYmVsb3csIGJ1dCBmb3IgdGhlIHVzZXIgdG8gcHJvdmlkZSBhIHdvcmtpbmcgd2luZSBpbnN0YWxsYXRpb24KKyAgICAgICAgICAjIHdpdGggd2luZXBhdGggc28gdGhhdCBwYXRoIHRyYW5zbGF0aW9uIGluIHRoZSBjcm9zcy10by1taW5ndworICAgICAgICAgICMgY2FzZSB3b3JrcyBwcm9wZXJseS4KKyAgICAgICAgICBsdF9yZXBsYWNlX3BhdGhzZXBfbml4X3RvX2Rvcz0ic3w6fDt8ZyIKKyAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDEiIHxcCisgICAgICAgICAgICAkU0VEIC1lICIkbHRfcmVwbGFjZV9wYXRoc2VwX25peF90b19kb3MiYAorICAgICAgICBmaQorICAgICAgICAjIE5vdywgYWRkIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvcnMgYmFjaworICAgICAgICBjYXNlICIkMSIgaW4KKyAgICAgICAgICA6KiApIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9IjskZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCIKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgY2FzZSAiJDEiIGluCisgICAgICAgICAgKjogKSBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdDsiCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisgICAgZXNhYworICBmaQorfQorIyBlbmQ6IGZ1bmNfdG9faG9zdF9wYXRobGlzdAorCisjIGZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMKKyMgZW1pdCB0aGUgc291cmNlIGNvZGUgZm9yIGEgd3JhcHBlciBleGVjdXRhYmxlIG9uIHN0ZG91dAorIyBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UKKyMgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZSBzZXQgdGhlcmVpbi4KK2Z1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMgKCkKK3sKKwljYXQgPDxFT0YKKworLyogJGN3cmFwcGVyc291cmNlIC0gdGVtcG9yYXJ5IHdyYXBwZXIgZXhlY3V0YWJsZSBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorICAgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorCisgICBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKKyAgIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKworICAgVGhpcyB3cmFwcGVyIGV4ZWN1dGFibGUgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorICAgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgorCisgICBDdXJyZW50bHksIGl0IHNpbXBseSBleGVjcyB0aGUgd3JhcHBlciAqc2NyaXB0KiAiJFNIRUxMICRvdXRwdXQiLAorICAgYnV0IGNvdWxkIGV2ZW50dWFsbHkgYWJzb3JiIGFsbCBvZiB0aGUgc2NyaXB0cyBmdW5jdGlvbmFsaXR5IGFuZAorICAgZXhlYyAkb2JqZGlyLyRvdXRwdXRuYW1lIGRpcmVjdGx5LgorKi8KK0VPRgorCSAgICBjYXQgPDwiRU9GIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPHByb2Nlc3MuaD4KKyMgaW5jbHVkZSA8aW8uaD4KKyMgZGVmaW5lIHNldG1vZGUgX3NldG1vZGUKKyNlbHNlCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaWZkZWYgX19DWUdXSU5fXworIyAgaW5jbHVkZSA8aW8uaD4KKyMgIGRlZmluZSBIQVZFX1NFVEVOVgorIyAgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCitjaGFyICpyZWFscGF0aCAoY29uc3QgY2hhciAqLCBjaGFyICopOworaW50IHB1dGVudiAoY2hhciAqKTsKK2ludCBzZXRlbnYgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpZiBkZWZpbmVkKFBBVEhfTUFYKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBQQVRIX01BWAorI2VsaWYgZGVmaW5lZChNQVhQQVRITEVOKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBNQVhQQVRITEVOCisjZWxzZQorIyBkZWZpbmUgTFRfUEFUSE1BWCAxMDI0CisjZW5kaWYKKworI2lmbmRlZiBTX0lYT1RICisjIGRlZmluZSBTX0lYT1RIIDAKKyNlbmRpZgorI2lmbmRlZiBTX0lYR1JQCisjIGRlZmluZSBTX0lYR1JQIDAKKyNlbmRpZgorCisjaWZkZWYgX01TQ19WRVIKKyMgZGVmaW5lIFNfSVhVU1IgX1NfSUVYRUMKKyMgZGVmaW5lIHN0YXQgX3N0YXQKKyMgaWZuZGVmIF9JTlRQVFJfVF9ERUZJTkVECisjICBkZWZpbmUgaW50cHRyX3QgaW50CisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBESVJfU0VQQVJBVE9SCisjIGRlZmluZSBESVJfU0VQQVJBVE9SICcvJworIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfX0RKR1BQX18pIHx8IFwKKyAgZGVmaW5lZCAoX19PUzJfXykKKyMgZGVmaW5lIEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNCisjIGRlZmluZSBGT1BFTl9XQiAid2IiCisjIGlmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBESVJfU0VQQVJBVE9SXzIgJ1xcJworIyBlbmRpZgorIyBpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyAgZGVmaW5lIFBBVEhfU0VQQVJBVE9SXzIgJzsnCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpICgoY2gpID09IERJUl9TRVBBUkFUT1IpCisjZWxzZSAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpIFwKKwkoKChjaCkgPT0gRElSX1NFUEFSQVRPUikgfHwgKChjaCkgPT0gRElSX1NFUEFSQVRPUl8yKSkKKyNlbmRpZiAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKworI2lmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1IpCisjZWxzZSAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1JfMikKKyNlbmRpZiAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisKKyNpZmRlZiBfX0NZR1dJTl9fCisjIGRlZmluZSBGT1BFTl9XQiAid2IiCisjZW5kaWYKKworI2lmbmRlZiBGT1BFTl9XQgorIyBkZWZpbmUgRk9QRU5fV0IgInciCisjZW5kaWYKKyNpZm5kZWYgX09fQklOQVJZCisjIGRlZmluZSBfT19CSU5BUlkgMAorI2VuZGlmCisKKyNkZWZpbmUgWE1BTExPQyh0eXBlLCBudW0pICAgICAgKCh0eXBlICopIHhtYWxsb2MgKChudW0pICogc2l6ZW9mKHR5cGUpKSkKKyNkZWZpbmUgWEZSRUUoc3RhbGUpIGRvIHsgXAorICBpZiAoc3RhbGUpIHsgZnJlZSAoKHZvaWQgKikgc3RhbGUpOyBzdGFsZSA9IDA7IH0gXAorfSB3aGlsZSAoMCkKKworI3VuZGVmIExUV1JBUFBFUl9ERUJVR1BSSU5URgorI2lmIGRlZmluZWQgREVCVUdXUkFQUEVSCisjIGRlZmluZSBMVFdSQVBQRVJfREVCVUdQUklOVEYoYXJncykgbHR3cmFwcGVyX2RlYnVncHJpbnRmIGFyZ3MKK3N0YXRpYyB2b2lkCitsdHdyYXBwZXJfZGVidWdwcmludGYgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgICAodm9pZCkgdmZwcmludGYgKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgICB2YV9lbmQgKGFyZ3MpOworfQorI2Vsc2UKKyMgZGVmaW5lIExUV1JBUFBFUl9ERUJVR1BSSU5URihhcmdzKQorI2VuZGlmCisKK2NvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9IE5VTEw7CisKK3ZvaWQgKnhtYWxsb2MgKHNpemVfdCBudW0pOworY2hhciAqeHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKTsKK2NvbnN0IGNoYXIgKmJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSk7CitjaGFyICpmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpOworY2hhciAqY2hhc2Vfc3ltbGlua3MgKGNvbnN0IGNoYXIgKnBhdGhzcGVjKTsKK2ludCBtYWtlX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGNoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOworY2hhciAqc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCk7Cit2b2lkIGx0X2ZhdGFsIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOwordm9pZCBsdF9zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2NoYXIgKmx0X2V4dGVuZF9zdHIgKGNvbnN0IGNoYXIgKm9yaWdfdmFsdWUsIGNvbnN0IGNoYXIgKmFkZCwgaW50IHRvX2VuZCk7Cit2b2lkIGx0X29wdF9wcm9jZXNzX2Vudl9zZXQgKGNvbnN0IGNoYXIgKmFyZyk7Cit2b2lkIGx0X29wdF9wcm9jZXNzX2Vudl9wcmVwZW5kIChjb25zdCBjaGFyICphcmcpOwordm9pZCBsdF9vcHRfcHJvY2Vzc19lbnZfYXBwZW5kIChjb25zdCBjaGFyICphcmcpOworaW50IGx0X3NwbGl0X25hbWVfdmFsdWUgKGNvbnN0IGNoYXIgKmFyZywgY2hhcioqIG5hbWUsIGNoYXIqKiB2YWx1ZSk7Cit2b2lkIGx0X3VwZGF0ZV9leGVfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOwordm9pZCBsdF91cGRhdGVfbGliX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnNjcmlwdF90ZXh0X3BhcnQxID0KK0VPRgorCisJICAgIGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxIHllcyB8CisJICAgICAgICAkU0VEIC1lICdzL1woW1xcIl1cKS9cXFwxL2cnIFwKKwkgICAgICAgICAgICAgLWUgJ3MvXi8gICIvJyAtZSAncy8kL1xcbiIvJworCSAgICBlY2hvICI7IgorCSAgICBjYXQgPDxFT0YKKworc3RhdGljIGNvbnN0IGNoYXIgKnNjcmlwdF90ZXh0X3BhcnQyID0KK0VPRgorCSAgICBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MiB5ZXMgfAorCSAgICAgICAgJFNFRCAtZSAncy9cKFtcXCJdXCkvXFxcMS9nJyBcCisJICAgICAgICAgICAgIC1lICdzL14vICAiLycgLWUgJ3MvJC9cXG4iLycKKwkgICAgZWNobyAiOyIKKworCSAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBNQUdJQ19FWEUgPSAiJG1hZ2ljX2V4ZSI7Citjb25zdCBjaGFyICogTElCX1BBVEhfVkFSTkFNRSA9ICIkc2hsaWJwYXRoX3ZhciI7CitFT0YKKworCSAgICBpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdCAiJHRlbXBfcnBhdGgiCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCI7CitFT0YKKwkgICAgZWxzZQorCSAgICAgIGNhdCA8PCJFT0YiCitjb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIiOworRU9GCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdCAiJGRsbHNlYXJjaHBhdGg6IgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBUk5BTUUgPSAiUEFUSCI7Citjb25zdCBjaGFyICogRVhFX1BBVEhfVkFMVUUgICA9ICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCI7CitFT0YKKwkgICAgZWxzZQorCSAgICAgIGNhdCA8PCJFT0YiCitjb25zdCBjaGFyICogRVhFX1BBVEhfVkFSTkFNRSA9ICIiOworY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiIjsKK0VPRgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICJsdC0kb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBUQVJHRVRfUFJPR1JBTV9OQU1FID0gIiRvdXRwdXRuYW1lIjsgLyogaG9wZWZ1bGx5LCBubyAuZXhlICovCitFT0YKKwkgICAgZmkKKworCisJICAgIGNhdCA8PCJFT0YiCisKKyNkZWZpbmUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVggICAgICAgICAiLS1sdC0iCisjZGVmaW5lIExUV1JBUFBFUl9PUFRJT05fUFJFRklYX0xFTkdUSCAgNQorCitzdGF0aWMgY29uc3Qgc2l6ZV90IG9wdF9wcmVmaXhfbGVuICAgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWF9MRU5HVEg7CitzdGF0aWMgY29uc3QgY2hhciAqbHR3cmFwcGVyX29wdGlvbl9wcmVmaXggPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmR1bXBzY3JpcHRfb3B0ICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImR1bXAtc2NyaXB0IjsKKworc3RhdGljIGNvbnN0IHNpemVfdCBlbnZfc2V0X29wdF9sZW4gICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVhfTEVOR1RIICsgNzsKK3N0YXRpYyBjb25zdCBjaGFyICplbnZfc2V0X29wdCAgICAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJlbnYtc2V0IjsKKyAgLyogYXJndW1lbnQgaXMgcHV0ZW52LXN0eWxlICJmb289YmFyIiwgdmFsdWUgb2YgZm9vIGlzIHNldCB0byBiYXIgKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBlbnZfcHJlcGVuZF9vcHRfbGVuID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVhfTEVOR1RIICsgMTE7CitzdGF0aWMgY29uc3QgY2hhciAqZW52X3ByZXBlbmRfb3B0ICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZW52LXByZXBlbmQiOworICAvKiBhcmd1bWVudCBpcyBwdXRlbnYtc3R5bGUgImZvbz1iYXIiLCBuZXcgdmFsdWUgb2YgZm9vIGlzIGJhciR7Zm9vfSAqLworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGVudl9hcHBlbmRfb3B0X2xlbiAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWF9MRU5HVEggKyAxMDsKK3N0YXRpYyBjb25zdCBjaGFyICplbnZfYXBwZW5kX29wdCAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJlbnYtYXBwZW5kIjsKKyAgLyogYXJndW1lbnQgaXMgcHV0ZW52LXN0eWxlICJmb289YmFyIiwgbmV3IHZhbHVlIG9mIGZvbyBpcyAke2Zvb31iYXIgKi8KKworI3VuZGVmIG1haW4KK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciAqKm5ld2FyZ3o7CisgIGludCAgbmV3YXJnYzsKKyAgY2hhciAqdG1wX3BhdGhzcGVjOworICBjaGFyICphY3R1YWxfY3dyYXBwZXJfcGF0aDsKKyAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX25hbWU7CisgIGNoYXIgKnRhcmdldF9uYW1lOworICBjaGFyICpsdF9hcmd2X3plcm87CisgIGludHB0cl90IHJ2YWwgPSAxMjc7CisKKyAgaW50IGk7CisKKyAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgYXJndlswXSAgICAgIDogJXNcbiIsIGFyZ3ZbMF0pKTsKKyAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBwcm9ncmFtX25hbWUgOiAlc1xuIiwgcHJvZ3JhbV9uYW1lKSk7CisKKyAgLyogdmVyeSBzaW1wbGUgYXJnIHBhcnNpbmc7IGRvbid0IHdhbnQgdG8gcmVseSBvbiBnZXRvcHQgKi8KKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkdW1wc2NyaXB0X29wdCkgPT0gMCkKKwl7CitFT0YKKwkgICAgY2FzZSAiJGhvc3QiIGluCisJICAgICAgKm1pbmd3KiB8ICpjeWd3aW4qICkKKwkJIyBtYWtlIHN0ZG91dCB1c2UgInVuaXgiIGxpbmUgZW5kaW5ncworCQllY2hvICIgICAgICAgICAgc2V0bW9kZSgxLF9PX0JJTkFSWSk7IgorCQk7OworCSAgICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorCSAgcHJpbnRmICgiJXMiLCBzY3JpcHRfdGV4dF9wYXJ0MSk7CisJICBwcmludGYgKCIlcyIsIHNjcmlwdF90ZXh0X3BhcnQyKTsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgbmV3YXJneiA9IFhNQUxMT0MgKGNoYXIgKiwgYXJnYyArIDEpOworICB0bXBfcGF0aHNwZWMgPSBmaW5kX2V4ZWN1dGFibGUgKGFyZ3ZbMF0pOworICBpZiAodG1wX3BhdGhzcGVjID09IE5VTEwpCisgICAgbHRfZmF0YWwgKCJDb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgZm91bmQgZXhlIChiZWZvcmUgc3ltbGluayBjaGFzZSkgYXQgOiAlc1xuIiwKKwkJCSAgdG1wX3BhdGhzcGVjKSk7CisKKyAgYWN0dWFsX2N3cmFwcGVyX3BhdGggPSBjaGFzZV9zeW1saW5rcyAodG1wX3BhdGhzcGVjKTsKKyAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBmb3VuZCBleGUgKGFmdGVyIHN5bWxpbmsgY2hhc2UpIGF0IDogJXNcbiIsCisJCQkgIGFjdHVhbF9jd3JhcHBlcl9wYXRoKSk7CisgIFhGUkVFICh0bXBfcGF0aHNwZWMpOworCisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0geHN0cmR1cCggYmFzZV9uYW1lIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkpOworICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9wYXRoLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgLyogd3JhcHBlciBuYW1lIHRyYW5zZm9ybXMgKi8KKyAgc3RyZW5kemFwIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAoYWN0dWFsX2N3cmFwcGVyX25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIC8qIHRhcmdldF9uYW1lIHRyYW5zZm9ybXMgLS0gdXNlIGFjdHVhbCB0YXJnZXQgcHJvZ3JhbSBuYW1lOyBtaWdodCBoYXZlIGx0LSBwcmVmaXggKi8KKyAgdGFyZ2V0X25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKFRBUkdFVF9QUk9HUkFNX05BTUUpKTsKKyAgc3RyZW5kemFwICh0YXJnZXRfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAodGFyZ2V0X25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFICh0YXJnZXRfbmFtZSk7CisgIHRhcmdldF9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgbGlidG9vbCB0YXJnZXQgbmFtZTogJXNcbiIsCisJCQkgIHRhcmdldF9uYW1lKSk7CitFT0YKKworCSAgICBjYXQgPDxFT0YKKyAgbmV3YXJnelswXSA9CisgICAgWE1BTExPQyAoY2hhciwgKHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpICsKKwkJICAgIHN0cmxlbiAoIiRvYmpkaXIiKSArIDEgKyBzdHJsZW4gKGFjdHVhbF9jd3JhcHBlcl9uYW1lKSArIDEpKTsKKyAgc3RyY3B5IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIHN0cmNhdCAobmV3YXJnelswXSwgIiRvYmpkaXIiKTsKKyAgc3RyY2F0IChuZXdhcmd6WzBdLCAiLyIpOworRU9GCisKKwkgICAgY2F0IDw8IkVPRiIKKyAgLyogc3RvcCBoZXJlLCBhbmQgY29weSBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoaXMgdHdpY2UgKi8KKyAgdG1wX3BhdGhzcGVjID0geHN0cmR1cCAobmV3YXJnelswXSk7CisKKyAgLyogZG8gTk9UIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSwgc28gdXNlIGFjdHVhbF9jd3JhcHBlcl9uYW1lICovCisgIHN0cmNhdCAobmV3YXJnelswXSwgYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIC8qIERPIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSBpZiBpdCBleGlzdHMsIHNvIHVzZSB0YXJnZXRfbmFtZSAqLworICBsdF9hcmd2X3plcm8gPSBsdF9leHRlbmRfc3RyICh0bXBfcGF0aHNwZWMsIHRhcmdldF9uYW1lLCAxKTsKKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisgIHRtcF9wYXRoc3BlYyA9IE5VTEw7CitFT0YKKworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCSAgICBjYXQgPDwiRU9GIgorICB7CisgICAgY2hhciogcDsKKyAgICB3aGlsZSAoKHAgPSBzdHJjaHIgKG5ld2FyZ3pbMF0sICdcXCcpKSAhPSBOVUxMKQorICAgICAgeworCSpwID0gJy8nOworICAgICAgfQorICAgIHdoaWxlICgocCA9IHN0cmNociAobHRfYXJndl96ZXJvLCAnXFwnKSkgIT0gTlVMTCkKKyAgICAgIHsKKwkqcCA9ICcvJzsKKyAgICAgIH0KKyAgfQorRU9GCisJICAgIDs7CisJICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorICBYRlJFRSAodGFyZ2V0X25hbWUpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIGx0X3NldGVudiAoIkJJTl9TSCIsICJ4cGc0Iik7IC8qIGZvciBUcnU2NCAqLworICBsdF9zZXRlbnYgKCJEVUFMQ0FTRSIsICIxIik7ICAvKiBmb3IgTVNLIHNoICovCisgIGx0X3VwZGF0ZV9saWJfcGF0aCAoTElCX1BBVEhfVkFSTkFNRSwgTElCX1BBVEhfVkFMVUUpOworICBsdF91cGRhdGVfZXhlX3BhdGggKEVYRV9QQVRIX1ZBUk5BTUUsIEVYRV9QQVRIX1ZBTFVFKTsKKworICBuZXdhcmdjPTA7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgaWYgKHN0cm5jbXAgKGFyZ3ZbaV0sIGVudl9zZXRfb3B0LCBlbnZfc2V0X29wdF9sZW4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYXJndltpXVtlbnZfc2V0X29wdF9sZW5dID09ICc9JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IGFyZ3ZbaV0gKyBlbnZfc2V0X29wdF9sZW4gKyAxOworICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfc2V0IChwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChhcmd2W2ldW2Vudl9zZXRfb3B0X2xlbl0gPT0gJ1wwJyAmJiBpICsgMSA8IGFyZ2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGx0X29wdF9wcm9jZXNzX2Vudl9zZXQgKGFyZ3ZbKytpXSk7IC8qIGRvbid0IGNvcHkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBsdF9mYXRhbCAoIiVzIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQiLCBlbnZfc2V0X29wdCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGlmIChzdHJuY21wIChhcmd2W2ldLCBlbnZfcHJlcGVuZF9vcHQsIGVudl9wcmVwZW5kX29wdF9sZW4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYXJndltpXVtlbnZfcHJlcGVuZF9vcHRfbGVuXSA9PSAnPScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBhcmd2W2ldICsgZW52X3ByZXBlbmRfb3B0X2xlbiArIDE7CisgICAgICAgICAgICAgIGx0X29wdF9wcm9jZXNzX2Vudl9wcmVwZW5kIChwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChhcmd2W2ldW2Vudl9wcmVwZW5kX29wdF9sZW5dID09ICdcMCcgJiYgaSArIDEgPCBhcmdjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAoYXJndlsrK2ldKTsgLyogZG9uJ3QgY29weSAqLworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGx0X2ZhdGFsICgiJXMgbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCIsIGVudl9wcmVwZW5kX29wdCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGlmIChzdHJuY21wIChhcmd2W2ldLCBlbnZfYXBwZW5kX29wdCwgZW52X2FwcGVuZF9vcHRfbGVuKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFyZ3ZbaV1bZW52X2FwcGVuZF9vcHRfbGVuXSA9PSAnPScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBhcmd2W2ldICsgZW52X2FwcGVuZF9vcHRfbGVuICsgMTsKKyAgICAgICAgICAgICAgbHRfb3B0X3Byb2Nlc3NfZW52X2FwcGVuZCAocCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYXJndltpXVtlbnZfYXBwZW5kX29wdF9sZW5dID09ICdcMCcgJiYgaSArIDEgPCBhcmdjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfYXBwZW5kIChhcmd2WysraV0pOyAvKiBkb24ndCBjb3B5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbHRfZmF0YWwgKCIlcyBtaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50IiwgZW52X2FwcGVuZF9vcHQpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBpZiAoc3RybmNtcCAoYXJndltpXSwgbHR3cmFwcGVyX29wdGlvbl9wcmVmaXgsIG9wdF9wcmVmaXhfbGVuKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogaG93ZXZlciwgaWYgdGhlcmUgaXMgYW4gb3B0aW9uIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZSwgYnV0IGl0IGlzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2Uga25vdyBhYm91dCBhbmQKKyAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZGVhbHQgd2l0aCwgYWJvdmUgKGlubHVkaW5nIGR1bXAtc2NyaXB0KSwgdGhlbgorICAgICAgICAgICAgIHJlcG9ydCBhbiBlcnJvci4gT3RoZXJ3aXNlLCB0YXJnZXRzIG1pZ2h0IGJlZ2luIHRvIGJlbGlldmUKKyAgICAgICAgICAgICB0aGV5IGFyZSBhbGxvd2VkIHRvIHVzZSBvcHRpb25zIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZS4gVGhlIGZpcnN0IHRpbWUgYW55IHVzZXIgY29tcGxhaW5zIGFib3V0IHRoaXMsIHdlJ2xsCisgICAgICAgICAgICAgbmVlZCB0byBtYWtlIExUV1JBUFBFUl9PUFRJT05fUFJFRklYIGEgY29uZmlndXJlLXRpbWUgb3B0aW9uCisgICAgICAgICAgICAgb3IgYSBjb25maWd1cmUuYWMtc2V0dGFibGUgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgbHRfZmF0YWwgKCJVbnJlY29nbml6ZWQgb3B0aW9uIGluICVzIG5hbWVzcGFjZTogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4LCBhcmd2W2ldKTsKKyAgICAgICAgfQorICAgICAgLyogb3RoZXJ3aXNlIC4uLiAqLworICAgICAgbmV3YXJnelsrK25ld2FyZ2NdID0geHN0cmR1cCAoYXJndltpXSk7CisgICAgfQorICBuZXdhcmd6WysrbmV3YXJnY10gPSBOVUxMOworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAgICAgKCgiKG1haW4pIGx0X2FyZ3ZfemVybyA6ICVzXG4iLCAobHRfYXJndl96ZXJvID8gbHRfYXJndl96ZXJvIDogIjxOVUxMPiIpKSk7CisgIGZvciAoaSA9IDA7IGkgPCBuZXdhcmdjOyBpKyspCisgICAgeworICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBuZXdhcmd6WyVkXSAgIDogJXNcbiIsIGksIChuZXdhcmd6W2ldID8gbmV3YXJneltpXSA6ICI8TlVMTD4iKSkpOworICAgIH0KKworRU9GCisKKwkgICAgY2FzZSAkaG9zdF9vcyBpbgorCSAgICAgIG1pbmd3KikKKwkJY2F0IDw8IkVPRiIKKyAgLyogZXhlY3YgZG9lc24ndCBhY3R1YWxseSB3b3JrIG9uIG1pbmd3IGFzIGV4cGVjdGVkIG9uIHVuaXggKi8KKyAgcnZhbCA9IF9zcGF3bnYgKF9QX1dBSVQsIGx0X2FyZ3ZfemVybywgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBuZXdhcmd6KTsKKyAgaWYgKHJ2YWwgPT0gLTEpCisgICAgeworICAgICAgLyogZmFpbGVkIHRvIHN0YXJ0IHByb2Nlc3MgKi8KKyAgICAgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgZmFpbGVkIHRvIGxhdW5jaCB0YXJnZXQgXCIlc1wiOiBlcnJubyA9ICVkXG4iLCBsdF9hcmd2X3plcm8sIGVycm5vKSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKyAgcmV0dXJuIHJ2YWw7CitFT0YKKwkJOzsKKwkgICAgICAqKQorCQljYXQgPDwiRU9GIgorICBleGVjdiAobHRfYXJndl96ZXJvLCBuZXdhcmd6KTsKKyAgcmV0dXJuIHJ2YWw7IC8qID0xMjcsIGJ1dCBhdm9pZHMgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcgKi8KK0VPRgorCQk7OworCSAgICBlc2FjCisKKwkgICAgY2F0IDw8IkVPRiIKK30KKwordm9pZCAqCit4bWFsbG9jIChzaXplX3QgbnVtKQoreworICB2b2lkICpwID0gKHZvaWQgKikgbWFsbG9jIChudW0pOworICBpZiAoIXApCisgICAgbHRfZmF0YWwgKCJNZW1vcnkgZXhoYXVzdGVkIik7CisKKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgoreHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICByZXR1cm4gc3RyaW5nID8gc3RyY3B5ICgoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0cmluZykgKyAxKSwKKwkJCSAgc3RyaW5nKSA6IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKgorYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBjaGFyICpiYXNlOworCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KKyAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBuYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKKyAgICBuYW1lICs9IDI7CisjZW5kaWYKKworICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCisgICAgICBiYXNlID0gbmFtZSArIDE7CisgIHJldHVybiBiYXNlOworfQorCitpbnQKK2NoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIoY2hlY2tfZXhlY3V0YWJsZSkgIDogJXNcbiIsCisJCQkgIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIikpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKKyAgICAgICYmIChzdC5zdF9tb2RlICYgKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkpKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKQoreworICBpbnQgcnZhbCA9IDA7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFrZV9leGVjdXRhYmxlKSAgIDogJXNcbiIsCisJCQkgIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIikpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3RhdCAocGF0aCwgJnN0KSA+PSAwKQorICAgIHsKKyAgICAgIHJ2YWwgPSBjaG1vZCAocGF0aCwgc3Quc3RfbW9kZSB8IFNfSVhPVEggfCBTX0lYR1JQIHwgU19JWFVTUik7CisgICAgfQorICByZXR1cm4gcnZhbDsKK30KKworLyogU2VhcmNoZXMgZm9yIHRoZSBmdWxsIHBhdGggb2YgdGhlIHdyYXBwZXIuICBSZXR1cm5zCisgICBuZXdseSBhbGxvY2F0ZWQgZnVsbCBwYXRoIG5hbWUgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisgICBEb2VzIG5vdCBjaGFzZSBzeW1saW5rcywgZXZlbiBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHRoZW0uCisqLworY2hhciAqCitmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpCit7CisgIGludCBoYXNfc2xhc2ggPSAwOworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpwX25leHQ7CisgIC8qIHN0YXRpYyBidWZmZXIgZm9yIGdldGN3ZCAqLworICBjaGFyIHRtcFtMVF9QQVRITUFYICsgMV07CisgIGludCB0bXBfbGVuOworICBjaGFyICpjb25jYXRfbmFtZTsKKworICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKGZpbmRfZXhlY3V0YWJsZSkgICA6ICVzXG4iLAorCQkJICB3cmFwcGVyID8gKCp3cmFwcGVyID8gd3JhcHBlciA6ICJFTVBUWSEiKSA6ICJOVUxMISIpKTsKKworICBpZiAoKHdyYXBwZXIgPT0gTlVMTCkgfHwgKCp3cmFwcGVyID09ICdcMCcpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEFic29sdXRlIHBhdGg/ICovCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgd3JhcHBlclswXSkgJiYgd3JhcHBlclsxXSA9PSAnOicpCisgICAgeworICAgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKyAgICAgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisJcmV0dXJuIGNvbmNhdF9uYW1lOworICAgICAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjZW5kaWYKKyAgICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICh3cmFwcGVyWzBdKSkKKwl7CisJICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOworCSAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKwl9CisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgICAgfQorI2VuZGlmCisKKyAgZm9yIChwID0gd3JhcHBlcjsgKnA7IHArKykKKyAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgeworCWhhc19zbGFzaCA9IDE7CisJYnJlYWs7CisgICAgICB9CisgIGlmICghaGFzX3NsYXNoKQorICAgIHsKKyAgICAgIC8qIG5vIHNsYXNoZXM7IHNlYXJjaCBQQVRIICovCisgICAgICBjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52ICgiUEFUSCIpOworICAgICAgaWYgKHBhdGggIT0gTlVMTCkKKwl7CisJICBmb3IgKHAgPSBwYXRoOyAqcDsgcCA9IHBfbmV4dCkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKnE7CisJICAgICAgc2l6ZV90IHBfbGVuOworCSAgICAgIGZvciAocSA9IHA7ICpxOyBxKyspCisJCWlmIChJU19QQVRIX1NFUEFSQVRPUiAoKnEpKQorCQkgIGJyZWFrOworCSAgICAgIHBfbGVuID0gcSAtIHA7CisJICAgICAgcF9uZXh0ID0gKCpxID09ICdcMCcgPyBxIDogcSArIDEpOworCSAgICAgIGlmIChwX2xlbiA9PSAwKQorCQl7CisJCSAgLyogZW1wdHkgcGF0aDogY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisJCSAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKKwkJICB0bXBfbGVuID0gc3RybGVuICh0bXApOworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworCQkgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisJCSAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7CisJCSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKKwkJICBtZW1jcHkgKGNvbmNhdF9uYW1lLCBwLCBwX2xlbik7CisJCSAgY29uY2F0X25hbWVbcF9sZW5dID0gJy8nOworCQkgIHN0cmNweSAoY29uY2F0X25hbWUgKyBwX2xlbiArIDEsIHdyYXBwZXIpOworCQl9CisJICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkJcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7CisJICAgIH0KKwl9CisgICAgICAvKiBub3QgZm91bmQgaW4gUEFUSDsgYXNzdW1lIGN1cmRpciAqLworICAgIH0KKyAgLyogUmVsYXRpdmUgcGF0aCB8IG5vdCBmb3VuZCBpbiBwYXRoOiBwcmVwZW5kIGN3ZCAqLworICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisgICAgbHRfZmF0YWwgKCJnZXRjd2QgZmFpbGVkIik7CisgIHRtcF9sZW4gPSBzdHJsZW4gKHRtcCk7CisgIGNvbmNhdF9uYW1lID0gWE1BTExPQyAoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7CisgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOworICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCisgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICBYRlJFRSAoY29uY2F0X25hbWUpOworICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpCit7CisjaWZuZGVmIFNfSVNMTksKKyAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyNlbHNlCisgIGNoYXIgYnVmW0xUX1BBVEhNQVhdOworICBzdHJ1Y3Qgc3RhdCBzOworICBjaGFyICp0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChwYXRoc3BlYyk7CisgIGNoYXIgKnA7CisgIGludCBoYXNfc3ltbGlua3MgPSAwOworICB3aGlsZSAoc3RybGVuICh0bXBfcGF0aHNwZWMpICYmICFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoImNoZWNraW5nIHBhdGggY29tcG9uZW50IGZvciBzeW1saW5rczogJXNcbiIsCisJCQkgICAgICB0bXBfcGF0aHNwZWMpKTsKKyAgICAgIGlmIChsc3RhdCAodG1wX3BhdGhzcGVjLCAmcykgPT0gMCkKKwl7CisJICBpZiAoU19JU0xOSyAocy5zdF9tb2RlKSAhPSAwKQorCSAgICB7CisJICAgICAgaGFzX3N5bWxpbmtzID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBzZWFyY2ggYmFja3dhcmRzIGZvciBsYXN0IERJUl9TRVBBUkFUT1IgKi8KKwkgIHAgPSB0bXBfcGF0aHNwZWMgKyBzdHJsZW4gKHRtcF9wYXRoc3BlYykgLSAxOworCSAgd2hpbGUgKChwID4gdG1wX3BhdGhzcGVjKSAmJiAoIUlTX0RJUl9TRVBBUkFUT1IgKCpwKSkpCisJICAgIHAtLTsKKwkgIGlmICgocCA9PSB0bXBfcGF0aHNwZWMpICYmICghSVNfRElSX1NFUEFSQVRPUiAoKnApKSkKKwkgICAgeworCSAgICAgIC8qIG5vIG1vcmUgRElSX1NFUEFSQVRPUlMgbGVmdCAqLworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAqcCA9ICdcMCc7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNoYXIgKmVycnN0ciA9IHN0cmVycm9yIChlcnJubyk7CisJICBsdF9mYXRhbCAoIkVycm9yIGFjY2Vzc2luZyBmaWxlICVzICglcykiLCB0bXBfcGF0aHNwZWMsIGVycnN0cik7CisJfQorICAgIH0KKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisKKyAgaWYgKCFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyAgICB9CisKKyAgdG1wX3BhdGhzcGVjID0gcmVhbHBhdGggKHBhdGhzcGVjLCBidWYpOworICBpZiAodG1wX3BhdGhzcGVjID09IDApCisgICAgeworICAgICAgbHRfZmF0YWwgKCJDb3VsZCBub3QgZm9sbG93IHN5bWxpbmtzIGZvciAlcyIsIHBhdGhzcGVjKTsKKyAgICB9CisgIHJldHVybiB4c3RyZHVwICh0bXBfcGF0aHNwZWMpOworI2VuZGlmCit9CisKK2NoYXIgKgorc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKyAgc2l6ZV90IGxlbiwgcGF0bGVuOworCisgIGFzc2VydCAoc3RyICE9IE5VTEwpOworICBhc3NlcnQgKHBhdCAhPSBOVUxMKTsKKworICBsZW4gPSBzdHJsZW4gKHN0cik7CisgIHBhdGxlbiA9IHN0cmxlbiAocGF0KTsKKworICBpZiAocGF0bGVuIDw9IGxlbikKKyAgICB7CisgICAgICBzdHIgKz0gbGVuIC0gcGF0bGVuOworICAgICAgaWYgKHN0cmNtcCAoc3RyLCBwYXQpID09IDApCisJKnN0ciA9ICdcMCc7CisgICAgfQorICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZAorbHRfZXJyb3JfY29yZSAoaW50IGV4aXRfc3RhdHVzLCBjb25zdCBjaGFyICptb2RlLAorCSAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLCB2YV9saXN0IGFwKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICIsIHByb2dyYW1fbmFtZSwgbW9kZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7CisKKyAgaWYgKGV4aXRfc3RhdHVzID49IDApCisgICAgZXhpdCAoZXhpdF9zdGF0dXMpOworfQorCit2b2lkCitsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOworICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CisKK3ZvaWQKK2x0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobHRfc2V0ZW52KSBzZXR0aW5nICclcycgdG8gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUgPyBuYW1lIDogIjxOVUxMPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPyB2YWx1ZSA6ICI8TlVMTD4iKSkpOworICB7CisjaWZkZWYgSEFWRV9TRVRFTlYKKyAgICAvKiBhbHdheXMgbWFrZSBhIGNvcHksIGZvciBjb25zaXN0ZW5jeSB3aXRoICFIQVZFX1NFVEVOViAqLworICAgIGNoYXIgKnN0ciA9IHhzdHJkdXAgKHZhbHVlKTsKKyAgICBzZXRlbnYgKG5hbWUsIHN0ciwgMSk7CisjZWxzZQorICAgIGludCBsZW4gPSBzdHJsZW4gKG5hbWUpICsgMSArIHN0cmxlbiAodmFsdWUpICsgMTsKKyAgICBjaGFyICpzdHIgPSBYTUFMTE9DIChjaGFyLCBsZW4pOworICAgIHNwcmludGYgKHN0ciwgIiVzPSVzIiwgbmFtZSwgdmFsdWUpOworICAgIGlmIChwdXRlbnYgKHN0cikgIT0gRVhJVF9TVUNDRVNTKQorICAgICAgeworICAgICAgICBYRlJFRSAoc3RyKTsKKyAgICAgIH0KKyNlbmRpZgorICB9Cit9CisKK2NoYXIgKgorbHRfZXh0ZW5kX3N0ciAoY29uc3QgY2hhciAqb3JpZ192YWx1ZSwgY29uc3QgY2hhciAqYWRkLCBpbnQgdG9fZW5kKQoreworICBjaGFyICpuZXdfdmFsdWU7CisgIGlmIChvcmlnX3ZhbHVlICYmICpvcmlnX3ZhbHVlKQorICAgIHsKKyAgICAgIGludCBvcmlnX3ZhbHVlX2xlbiA9IHN0cmxlbiAob3JpZ192YWx1ZSk7CisgICAgICBpbnQgYWRkX2xlbiA9IHN0cmxlbiAoYWRkKTsKKyAgICAgIG5ld192YWx1ZSA9IFhNQUxMT0MgKGNoYXIsIGFkZF9sZW4gKyBvcmlnX3ZhbHVlX2xlbiArIDEpOworICAgICAgaWYgKHRvX2VuZCkKKyAgICAgICAgeworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlLCBvcmlnX3ZhbHVlKTsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSArIG9yaWdfdmFsdWVfbGVuLCBhZGQpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSwgYWRkKTsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSArIGFkZF9sZW4sIG9yaWdfdmFsdWUpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbmV3X3ZhbHVlID0geHN0cmR1cCAoYWRkKTsKKyAgICB9CisgIHJldHVybiBuZXdfdmFsdWU7Cit9CisKK2ludAorbHRfc3BsaXRfbmFtZV92YWx1ZSAoY29uc3QgY2hhciAqYXJnLCBjaGFyKiogbmFtZSwgY2hhcioqIHZhbHVlKQoreworICBjb25zdCBjaGFyICpwOworICBpbnQgbGVuOworICBpZiAoIWFyZyB8fCAhKmFyZykKKyAgICByZXR1cm4gMTsKKworICBwID0gc3RyY2hyIChhcmcsIChpbnQpJz0nKTsKKworICBpZiAoIXApCisgICAgcmV0dXJuIDE7CisKKyAgKnZhbHVlID0geHN0cmR1cCAoKytwKTsKKworICBsZW4gPSBzdHJsZW4gKGFyZykgLSBzdHJsZW4gKCp2YWx1ZSk7CisgICpuYW1lID0gWE1BTExPQyAoY2hhciwgbGVuKTsKKyAgc3RybmNweSAoKm5hbWUsIGFyZywgbGVuLTEpOworICAoKm5hbWUpW2xlbiAtIDFdID0gJ1wwJzsKKworICByZXR1cm4gMDsKK30KKwordm9pZAorbHRfb3B0X3Byb2Nlc3NfZW52X3NldCAoY29uc3QgY2hhciAqYXJnKQoreworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgY2hhciAqdmFsdWUgPSBOVUxMOworCisgIGlmIChsdF9zcGxpdF9uYW1lX3ZhbHVlIChhcmcsICZuYW1lLCAmdmFsdWUpICE9IDApCisgICAgeworICAgICAgWEZSRUUgKG5hbWUpOworICAgICAgWEZSRUUgKHZhbHVlKTsKKyAgICAgIGx0X2ZhdGFsICgiYmFkIGFyZ3VtZW50IGZvciAlczogJyVzJyIsIGVudl9zZXRfb3B0LCBhcmcpOworICAgIH0KKworICBsdF9zZXRlbnYgKG5hbWUsIHZhbHVlKTsKKyAgWEZSRUUgKG5hbWUpOworICBYRlJFRSAodmFsdWUpOworfQorCit2b2lkCitsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAoY29uc3QgY2hhciAqYXJnKQoreworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgY2hhciAqdmFsdWUgPSBOVUxMOworICBjaGFyICpuZXdfdmFsdWUgPSBOVUxMOworCisgIGlmIChsdF9zcGxpdF9uYW1lX3ZhbHVlIChhcmcsICZuYW1lLCAmdmFsdWUpICE9IDApCisgICAgeworICAgICAgWEZSRUUgKG5hbWUpOworICAgICAgWEZSRUUgKHZhbHVlKTsKKyAgICAgIGx0X2ZhdGFsICgiYmFkIGFyZ3VtZW50IGZvciAlczogJyVzJyIsIGVudl9wcmVwZW5kX29wdCwgYXJnKTsKKyAgICB9CisKKyAgbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOworICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgIFhGUkVFIChuZXdfdmFsdWUpOworICBYRlJFRSAobmFtZSk7CisgIFhGUkVFICh2YWx1ZSk7Cit9CisKK3ZvaWQKK2x0X29wdF9wcm9jZXNzX2Vudl9hcHBlbmQgKGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgY2hhciAqbmFtZSA9IE5VTEw7CisgIGNoYXIgKnZhbHVlID0gTlVMTDsKKyAgY2hhciAqbmV3X3ZhbHVlID0gTlVMTDsKKworICBpZiAobHRfc3BsaXRfbmFtZV92YWx1ZSAoYXJnLCAmbmFtZSwgJnZhbHVlKSAhPSAwKQorICAgIHsKKyAgICAgIFhGUkVFIChuYW1lKTsKKyAgICAgIFhGUkVFICh2YWx1ZSk7CisgICAgICBsdF9mYXRhbCAoImJhZCBhcmd1bWVudCBmb3IgJXM6ICclcyciLCBlbnZfYXBwZW5kX29wdCwgYXJnKTsKKyAgICB9CisKKyAgbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDEpOworICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgIFhGUkVFIChuZXdfdmFsdWUpOworICBYRlJFRSAobmFtZSk7CisgIFhGUkVFICh2YWx1ZSk7Cit9CisKK3ZvaWQKK2x0X3VwZGF0ZV9leGVfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobHRfdXBkYXRlX2V4ZV9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lID8gbmFtZSA6ICI8TlVMTD4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID8gdmFsdWUgOiAiPE5VTEw+IikpKTsKKworICBpZiAobmFtZSAmJiAqbmFtZSAmJiB2YWx1ZSAmJiAqdmFsdWUpCisgICAgeworICAgICAgY2hhciAqbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOworICAgICAgLyogc29tZSBzeXN0ZW1zIGNhbid0IGNvcGUgd2l0aCBhICc6Jy10ZXJtaW5hdGVkIHBhdGggIycgKi8KKyAgICAgIGludCBsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSk7CisgICAgICB3aGlsZSAoKChsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSkpID4gMCkgJiYgSVNfUEFUSF9TRVBBUkFUT1IgKG5ld192YWx1ZVtsZW4tMV0pKQorICAgICAgICB7CisgICAgICAgICAgbmV3X3ZhbHVlW2xlbi0xXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKKyAgICAgIFhGUkVFIChuZXdfdmFsdWUpOworICAgIH0KK30KKwordm9pZAorbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihsdF91cGRhdGVfbGliX3BhdGgpIG1vZGlmeWluZyAnJXMnIGJ5IHByZXBlbmRpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUgPyBuYW1lIDogIjxOVUxMPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPyB2YWx1ZSA6ICI8TlVMTD4iKSkpOworCisgIGlmIChuYW1lICYmICpuYW1lICYmIHZhbHVlICYmICp2YWx1ZSkKKyAgICB7CisgICAgICBjaGFyICpuZXdfdmFsdWUgPSBsdF9leHRlbmRfc3RyIChnZXRlbnYgKG5hbWUpLCB2YWx1ZSwgMCk7CisgICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKKyAgICB9Cit9CisKKworRU9GCit9CisjIGVuZDogZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworCisjIGZ1bmNfbW9kZV9saW5rIGFyZy4uLgorZnVuY19tb2RlX2xpbmsgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkaG9zdCBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi1jZWdjYyopCisgICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCisgICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0CisgICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCisgICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2NhdGlvbi4KKyAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCisKKyAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZworICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKKyAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5CisgICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KKyAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgICopCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKyAgICBsaWJ0b29sX2FyZ3M9JG5vbm9wdAorICAgIGJhc2VfY29tcGlsZT0iJG5vbm9wdCAkQCIKKyAgICBjb21waWxlX2NvbW1hbmQ9JG5vbm9wdAorICAgIGZpbmFsaXplX2NvbW1hbmQ9JG5vbm9wdAorCisgICAgY29tcGlsZV9ycGF0aD0KKyAgICBmaW5hbGl6ZV9ycGF0aD0KKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgY29udmVuaWVuY2U9CisgICAgb2xkX2NvbnZlbmllbmNlPQorICAgIGRlcGxpYnM9CisgICAgb2xkX2RlcGxpYnM9CisgICAgY29tcGlsZXJfZmxhZ3M9CisgICAgbGlua2VyX2ZsYWdzPQorICAgIGRsbHNlYXJjaHBhdGg9CisgICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCisgICAgaW5zdF9wcmVmaXhfZGlyPQorICAgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPQorCisgICAgYXZvaWRfdmVyc2lvbj1ubworICAgIGRsZmlsZXM9CisgICAgZGxwcmVmaWxlcz0KKyAgICBkbHNlbGY9bm8KKyAgICBleHBvcnRfZHluYW1pYz1ubworICAgIGV4cG9ydF9zeW1ib2xzPQorICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQorICAgIGdlbmVyYXRlZD0KKyAgICBsaWJvYmpzPQorICAgIGx0bGlicz0KKyAgICBtb2R1bGU9bm8KKyAgICBub19pbnN0YWxsPW5vCisgICAgb2Jqcz0KKyAgICBub25fcGljX29iamVjdHM9CisgICAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9CisgICAgcHJlZmVyX3N0YXRpY19saWJzPW5vCisgICAgcHJlbG9hZD1ubworICAgIHByZXY9CisgICAgcHJldmFyZz0KKyAgICByZWxlYXNlPQorICAgIHJwYXRoPQorICAgIHhycGF0aD0KKyAgICBwZXJtX3JwYXRoPQorICAgIHRlbXBfcnBhdGg9CisgICAgdGhyZWFkX3NhZmU9bm8KKyAgICB2aW5mbz0KKyAgICB2aW5mb19udW1iZXI9bm8KKyAgICB3ZWFrX2xpYnM9CisgICAgc2luZ2xlX21vZHVsZT0iJHt3bH0tc2luZ2xlX21vZHVsZSIKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1zaGFyZWQpCisJdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIFwKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAiY2FuIG5vdCBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IgorCWJ1aWxkX29sZF9saWJzPW5vCisJYnJlYWsKKwk7OworICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljIHwgLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJY2FzZSAkYXJnIGluCisJLWFsbC1zdGF0aWMpCisJICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKKwkgIDs7CisJLXN0YXRpYykKKwkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9YnVpbHQKKwkgIDs7CisJLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPXllcworCSAgOzsKKwllc2FjCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KKyAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCisKKyAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KKyAgICB3aGlsZSB0ZXN0ICIkIyIgLWd0IDA7IGRvCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgICBxYXJnPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdAorICAgICAgZnVuY19hcHBlbmQgbGlidG9vbF9hcmdzICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCisgICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCWNhc2UgJHByZXYgaW4KKwlvdXRwdXQpCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiBAT1VUUFVUQCIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiBAT1VUUFVUQCIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcHJldiBpbgorCWRsZmlsZXN8ZGxwcmVmaWxlcykKKwkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCisJICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgcHJlbG9hZD15ZXMKKwkgIGZpCisJICBjYXNlICRhcmcgaW4KKwkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCisJICBmb3JjZSkKKwkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgc2VsZikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbHNlCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKwkgICAgZWxzZQorCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWV4cHN5bXMpCisJICBleHBvcnRfc3ltYm9scz0iJGFyZyIKKwkgIHRlc3QgLWYgIiRhcmciIFwKKwkgICAgfHwgZnVuY19mYXRhbF9lcnJvciAic3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlleHBzeW1zX3JlZ2V4KQorCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZnJhbWV3b3JrKQorCSAgY2FzZSAkaG9zdCBpbgorCSAgICAqLSotZGFyd2luKikKKwkgICAgICBjYXNlICIkZGVwbGlicyAiIGluCisJCSoiICRxYXJnLmx0ZnJhbWV3b3JrICIqKSA7OworCQkqKSBkZXBsaWJzPSIkZGVwbGlicyAkcWFyZy5sdGZyYW1ld29yayIgIyB0aGlzIGlzIGZpeGVkIGxhdGVyCisJCSAgIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICBlc2FjCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJaW5zdF9wcmVmaXgpCisJICBpbnN0X3ByZWZpeF9kaXI9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJb2JqZWN0bGlzdCkKKwkgIGlmIHRlc3QgLWYgIiRhcmciOyB0aGVuCisJICAgIHNhdmVfYXJnPSRhcmcKKwkgICAgbW9yZWFyZ3M9CisJICAgIGZvciBmaWwgaW4gYGNhdCAiJHNhdmVfYXJnImAKKwkgICAgZG8KKyMJICAgICAgbW9yZWFyZ3M9IiRtb3JlYXJncyAkZmlsIgorCSAgICAgIGFyZz0kZmlsCisJICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJICAgICAgaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkJcGljX29iamVjdD0KKwkJbm9uX3BpY19vYmplY3Q9CisKKwkJIyBSZWFkIHRoZSAubG8gZmlsZQorCQlmdW5jX3NvdXJjZSAiJGFyZyIKKworCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKKwkJICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCQkgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmCisJCSAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJCWZpCisKKwkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkJeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkJaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCisKKwkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgorCQkgICAgICBwcmV2PQorCQkgICAgICBjb250aW51ZQorCQkgICAgZWxzZQorCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQkgICAgICBwcmV2PWRscHJlZmlsZXMKKwkJICAgIGZpCisJCSAgZmkKKworCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCisJCSAgICBwcmV2PQorCQkgIGZpCisKKwkJICAjIEEgUElDIG9iamVjdC4KKwkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJCSAgYXJnPSIkcGljX29iamVjdCIKKwkJZmkKKworCQkjIE5vbi1QSUMgb2JqZWN0LgorCQlpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKKworCQkgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCQkgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KKwkJICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCQkgIGZpCisJCWVsc2UKKwkJICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJCSAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJCWZpCisJICAgICAgZWxzZQorCQkjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KKwkJaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJICBmdW5jX2Rpcm5hbWUgIiRhcmciICIvIiAiIgorCQkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJCSAgZnVuY19sbzJvICIkYXJnIgorCQkgIHBpY19vYmplY3Q9JHhkaXIkb2JqZGlyLyRmdW5jX2xvMm9fcmVzdWx0CisJCSAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCQkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgICAgICBlbHNlCisJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkJZmkKKwkgICAgICBmaQorCSAgICBkb25lCisJICBlbHNlCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImxpbmsgaW5wdXQgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgZmkKKwkgIGFyZz0kc2F2ZV9hcmcKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlwcmVjaW91c19yZWdleCkKKwkgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJlbGVhc2UpCisJICByZWxlYXNlPSItJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlycGF0aCB8IHhycGF0aCkKKwkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCSAgY2FzZSAkYXJnIGluCisJICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRwcmV2IiA9IHJwYXRoOyB0aGVuCisJICAgIGNhc2UgIiRycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIHJwYXRoPSIkcnBhdGggJGFyZyIgOzsKKwkgICAgZXNhYworCSAgZWxzZQorCSAgICBjYXNlICIkeHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJc2hyZXh0KQorCSAgc2hyZXh0X2NtZHM9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJd2VhaykKKwkgIHdlYWtfbGlicz0iJHdlYWtfbGlicyAkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXhjY2xpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwl4Y29tcGlsZXIpCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgorCSAgcHJldj0KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGxpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwkqKQorCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMKKyAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCisKKyAgICAgIHByZXZhcmc9IiRhcmciCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAjIFNlZSBjb21tZW50IGZvciAtc3RhdGljIGZsYWcgYmVsb3csIGZvciBtb3JlIGRldGFpbHMuCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJZnVuY19mYXRhbF9lcnJvciAiXGAtYWxsb3ctdW5kZWZpbmVkJyBtdXN0IG5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiCisJOzsKKworICAgICAgLWF2b2lkLXZlcnNpb24pCisJYXZvaWRfdmVyc2lvbj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisJcHJldj1kbGZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxwcmVvcGVuKQorCXByZXY9ZGxwcmVmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorCWV4cG9ydF9keW5hbWljPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAibW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKKwlmaQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgorCSAgcHJldj1leHBzeW1zCisJZWxzZQorCSAgcHJldj1leHBzeW1zX3JlZ2V4CisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1mcmFtZXdvcmspCisJcHJldj1mcmFtZXdvcmsKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1pbnN0LXByZWZpeC1kaXIpCisJcHJldj1pbnN0X3ByZWZpeAorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgorICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAorICAgICAgLUxbQS1aXVtBLVpdKjoqKQorCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCisJbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLUwqKQorCWZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRhcmciCisJZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlpZiB0ZXN0IC16ICIkZGlyIjsgdGhlbgorCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgInJlcXVpcmUgbm8gc3BhY2UgYmV0d2VlbiBcYC1MJyBhbmQgXGAkMSciCisJICBlbHNlCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm5lZWQgcGF0aCBmb3IgXGAtTCcgb3B0aW9uIgorCSAgZmkKKwlmaQorCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkqKQorCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCSAgdGVzdCAteiAiJGFic2RpciIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciCisJICBkaXI9IiRhYnNkaXIiCisJICA7OworCWVzYWMKKwljYXNlICIkZGVwbGlicyAiIGluCisJKiIgLUwkZGlyICIqKSA7OworCSopCisJICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIiCisJICBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIKKwkgIDs7CisJZXNhYworCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJEVDSE8gIlgkZGlyIiB8ICRYc2VkIC1lICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSRkaXI7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRpciI7OworCSAgZXNhYworCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokdGVzdGJpbmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSR0ZXN0YmluZGlyOzsKKwkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiR0ZXN0YmluZGlyIjs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1sKikKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgfHwgdGVzdCAiWCRhcmciID0gIlgtbG0iOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotYmVvcyogfCAqLWNlZ2NjKikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vczIqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBkZXBsaWJzPSIkZGVwbGlicyBTeXN0ZW0ubHRmcmFtZXdvcmsiCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCisJICAgICMgQ2F1c2VzIHByb2JsZW1zIHdpdGggX19jdHlwZQorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwllbGlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjX3IiOyB0aGVuCisJIGNhc2UgJGhvc3QgaW4KKwkgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjX3IgZGlyZWN0bHksIHVzZSAtcHRocmVhZCBmbGFnLgorCSAgIGNvbnRpbnVlCisJICAgOzsKKwkgZXNhYworCWZpCisJZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tb2R1bGUpCisJbW9kdWxlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUcnU2NCBVTklYIHVzZXMgLW1vZGVsIFthcmddIHRvIGRldGVybWluZSB0aGUgbGF5b3V0IG9mIEMrKworICAgICAgIyBjbGFzc2VzLCBuYW1lIG1hbmdsaW5nLCBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgIyBEYXJ3aW4gdXNlcyB0aGUgLWFyY2ggZmxhZyB0byBkZXRlcm1pbmUgb3V0cHV0IGFyY2hpdGVjdHVyZS4KKyAgICAgIC1tb2RlbHwtYXJjaHwtaXN5c3Jvb3QpCisJY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmV8LXRocmVhZHMpCisJY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGFyZyIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbXVsdGlfbW9kdWxlKQorCXNpbmdsZV9tb2R1bGU9IiR7d2x9LW11bHRpX21vZHVsZSIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1mYXN0LWluc3RhbGwpCisJZmFzdF9pbnN0YWxsPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbm8taW5zdGFsbCkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotZGFyd2luKiB8ICotY2VnY2MqKQorCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCisJICAjIGFuZCBEYXJ3aW4gaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KKwkgIGZ1bmNfd2FybmluZyAiXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiCisJICBmdW5jX3dhcm5pbmcgImFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIKKwkgIGZhc3RfaW5zdGFsbD1ubworCSAgOzsKKwkqKSBub19pbnN0YWxsPXllcyA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby11bmRlZmluZWQpCisJYWxsb3dfdW5kZWZpbmVkPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtb2JqZWN0bGlzdCkKKwlwcmV2PW9iamVjdGxpc3QKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vKSBwcmV2PW91dHB1dCA7OworCisgICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCisJcHJldj1wcmVjaW91c19yZWdleAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJlbGVhc2UpCisJcHJldj1yZWxlYXNlCisJY29udGludWUKKwk7OworCisgICAgICAtcnBhdGgpCisJcHJldj1ycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIpCisJcHJldj14cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKikKKwlmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkYXJnIgorCWRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSopCisJICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgIDs7CisJZXNhYworCWNhc2UgIiR4cnBhdGggIiBpbgorCSoiICRkaXIgIiopIDs7CisJKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNoYXJlZCkKKwkjIFRoZSBlZmZlY3RzIG9mIC1zaGFyZWQgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNocmV4dCkKKwlwcmV2PXNocmV4dAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0CisJIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cworCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAorCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCisJY29udGludWUKKwk7OworCisgICAgICAtdGhyZWFkLXNhZmUpCisJdGhyZWFkX3NhZmU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtdmVyc2lvbi1pbmZvKQorCXByZXY9dmluZm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLW51bWJlcikKKwlwcmV2PXZpbmZvCisJdmluZm9fbnVtYmVyPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXdlYWspCisgICAgICAgIHByZXY9d2VhaworCWNvbnRpbnVlCisJOzsKKworICAgICAgLVdjLCopCisJZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgorCSAgYXJnPSIkYXJnICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCisJYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwk7OworCisgICAgICAtV2wsKikKKwlmdW5jX3N0cmlwbmFtZSAnLVdsLCcgJycgIiRhcmciCisJYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZsYWciCisJICBhcmc9IiRhcmcgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCisJYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwk7OworCisgICAgICAtWGNvbXBpbGVyKQorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtWGxpbmtlcikKKwlwcmV2PXhsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YQ0NsaW5rZXIpCisJcHJldj14Y2NsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgLW1zZ18qIGZvciBvc2YgY2MKKyAgICAgIC1tc2dfKikKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisKKyAgICAgICMgLTY0LCAtbWlwc1swLTldIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC1yWzAtOV1bMC05XSogc3BlY2lmaWVzIHRoZSBwcm9jZXNzb3Igb24gdGhlIFNHSSBjb21waWxlcgorICAgICAgIyAteGFyY2g9KiwgLXh0YXJnZXQ9KiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFN1biBjb21waWxlcgorICAgICAgIyArREEqLCArREQqIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgSFAgY29tcGlsZXIKKyAgICAgICMgLXEqIHBhc3MgdGhyb3VnaCBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCisgICAgICAjIC1tKiwgLXRbNDVdKiwgLXR4c2NhbGUqIHBhc3MgdGhyb3VnaCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMKKyAgICAgICMgY29tcGlsZXIgYXJncyBmb3IgR0NDCisgICAgICAjIC1GL3BhdGggZ2l2ZXMgcGF0aCB0byB1bmluc3RhbGxlZCBmcmFtZXdvcmtzLCBnY2Mgb24gZGFyd2luCisgICAgICAjIC1wLCAtcGcsIC0tY292ZXJhZ2UsIC1mcHJvZmlsZS0qIHBhc3MgdGhyb3VnaCBwcm9maWxpbmcgZmxhZyBmb3IgR0NDCisgICAgICAjIEBmaWxlIEdDQyByZXNwb25zZSBmaWxlcworICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qfCBcCisgICAgICAtdFs0NV0qfC10eHNjYWxlKnwtcHwtcGd8LS1jb3ZlcmFnZXwtZnByb2ZpbGUtKnwtRip8QCopCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgorICAgICAgLSogfCArKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwk7OworCisgICAgICAqLiRvYmpleHQpCisJIyBBIHN0YW5kYXJkIG9iamVjdC4KKwlvYmpzPSIkb2JqcyAkYXJnIgorCTs7CisKKyAgICAgICoubG8pCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkgIHBpY19vYmplY3Q9CisJICBub25fcGljX29iamVjdD0KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgZnVuY19zb3VyY2UgIiRhcmciCisKKwkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJICBmaQorCisJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgorCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCWRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgorCQlwcmV2PQorCQljb250aW51ZQorCSAgICAgIGVsc2UKKwkJIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkJcHJldj1kbHByZWZpbGVzCisJICAgICAgZmkKKwkgICAgZmkKKworCSAgICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgorCSAgICAgIHByZXY9CisJICAgIGZpCisKKwkgICAgIyBBIFBJQyBvYmplY3QuCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkgICAgYXJnPSIkcGljX29iamVjdCIKKwkgIGZpCisKKwkgICMgTm9uLVBJQyBvYmplY3QuCisJICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCSAgICBmaQorCSAgZWxzZQorCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICBmaQorCWVsc2UKKwkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCSAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJICAgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICAgIGZ1bmNfbG8ybyAiJGFyZyIKKwkgICAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKKwkgICAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLiRsaWJleHQpCisJIyBBbiBhcmNoaXZlLgorCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgKi5sYSkKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBwcmV2PQorCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICBwcmV2PQorCWVsc2UKKwkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisgICAgICBlc2FjICMgYXJnCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgZmkKKyAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKyAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKyAgICBmaQorCisgICAgb2xkbGlicz0KKyAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5CisgICAgZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKKyAgICBvdXRwdXRuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKKworICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgorICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkRUNITyBcIlhcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAorICAgIGVsc2UKKyAgICAgIHNobGliX3NlYXJjaF9wYXRoPQorICAgIGZpCisgICAgZXZhbCBzeXNfbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wiCisgICAgZXZhbCBzeXNfbGliX2Rsc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNcIgorCisgICAgZnVuY19kaXJuYW1lICIkb3V0cHV0IiAiLyIgIiIKKyAgICBvdXRwdXRfb2JqZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCRvYmpkaXIiCisgICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCisgICAgZnVuY19ta2Rpcl9wICIkb3V0cHV0X29iamRpciIKKworICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICIiKQorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIgorICAgICAgOzsKKyAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OworICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OworICAgICoubGEpIGxpbmttb2RlPWxpYiA7OworICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCisgICAgZXNhYworCisgICAgc3BlY2lhbGRlcGxpYnM9CisKKyAgICBsaWJzPQorICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcworICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQorICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisgICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9kZXBzIDsgdGhlbgorCWNhc2UgIiRsaWJzICIgaW4KKwkqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGxpYnM9IiRsaWJzICRkZXBsaWIiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCisKKyAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCisgICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCisgICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwczsgdGhlbgorCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbworCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgorCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkcHJlX3Bvc3RfZGVwcyIgOzsKKwkgIGVzYWMKKwkgIHByZV9wb3N0X2RlcHM9IiRwcmVfcG9zdF9kZXBzICRwcmVfcG9zdF9kZXAiCisJZG9uZQorICAgICAgZmkKKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgZmkKKworICAgIGRlcGxpYnM9CisgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQorICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKyAgICBuZWVkX3JlbGluaz1ubyAjIHdoZXRoZXIgd2UncmUgbGlua2luZyBhbnkgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBub3RpbnN0X2RlcGxpYnM9ICMgbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIG5vdGluc3RfcGF0aD0gIyBwYXRocyB0aGF0IGNvbnRhaW4gbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworCisgICAgY2FzZSAkbGlua21vZGUgaW4KKyAgICBsaWIpCisJcGFzc2VzPSJjb252IGRscHJlb3BlbiBsaW5rIgorCWZvciBmaWxlIGluICRkbGZpbGVzICRkbHByZWZpbGVzOyBkbworCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5sYSkgOzsKKwkgICopCisJICAgIGZ1bmNfZmF0YWxfaGVscCAibGlicmFyaWVzIGNhbiBcYC1kbG9wZW4nIG9ubHkgbGlidG9vbCBsaWJyYXJpZXM6ICRmaWxlIgorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwk7OworICAgIHByb2cpCisJY29tcGlsZV9kZXBsaWJzPQorCWZpbmFsaXplX2RlcGxpYnM9CisJYWxsZGVwbGlicz1ubworCW5ld2RsZmlsZXM9CisJbmV3ZGxwcmVmaWxlcz0KKwlwYXNzZXM9ImNvbnYgc2NhbiBkbG9wZW4gZGxwcmVvcGVuIGxpbmsiCisJOzsKKyAgICAqKSAgcGFzc2VzPSJjb252IgorCTs7CisgICAgZXNhYworCisgICAgZm9yIHBhc3MgaW4gJHBhc3NlczsgZG8KKyAgICAgICMgVGhlIHByZW9wZW4gcGFzcyBpbiBsaWIgbW9kZSByZXZlcnNlcyAkZGVwbGliczsgcHV0IGl0IGJhY2sgaGVyZQorICAgICAgIyBzbyB0aGF0IC1MIGNvbWVzIGJlZm9yZSBsaWJzIHRoYXQgbmVlZCBpdCBmb3IgaW5zdGFuY2UuLi4KKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiOyB0aGVuCisJIyMgRklYTUU6IEZpbmQgdGhlIHBsYWNlIHdoZXJlIHRoZSBsaXN0IGlzIHJlYnVpbHQgaW4gdGhlIHdyb25nCisJIyMgICAgICAgIG9yZGVyLCBhbmQgZml4IGl0IHRoZXJlIHByb3Blcmx5CisgICAgICAgIHRtcF9kZXBsaWJzPQorCWZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICB0bXBfZGVwbGlicz0iJGRlcGxpYiAkdG1wX2RlcGxpYnMiCisJZG9uZQorCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8CisJIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIjsgdGhlbgorCWxpYnM9IiRkZXBsaWJzIgorCWRlcGxpYnM9CisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwljYXNlICRwYXNzIGluCisJZGxvcGVuKSBsaWJzPSIkZGxmaWxlcyIgOzsKKwlkbHByZW9wZW4pIGxpYnM9IiRkbHByZWZpbGVzIiA7OworCWxpbmspIGxpYnM9IiRkZXBsaWJzICVERVBMSUJTJSAkZGVwZW5kZW5jeV9saWJzIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixkbHByZW9wZW4iOyB0aGVuCisJIyBDb2xsZWN0IGFuZCBmb3J3YXJkIGRlcGxpYnMgb2YgcHJlb3BlbmVkIGxpYnRvb2wgbGlicworCWZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCisJICAjIElnbm9yZSBub24tbGlidG9vbC1saWJzCisJICBkZXBlbmRlbmN5X2xpYnM9CisJICBjYXNlICRsaWIgaW4KKwkgICoubGEpCWZ1bmNfc291cmNlICIkbGliIiA7OworCSAgZXNhYworCisJICAjIENvbGxlY3QgcHJlb3BlbmVkIGxpYnRvb2wgZGVwbGlicywgZXhjZXB0IGFueSB0aGlzIGxpYnJhcnkKKwkgICMgaGFzIGRlY2xhcmVkIGFzIHdlYWsgbGlicworCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworICAgICAgICAgICAgZGVwbGliX2Jhc2U9YCRFQ0hPICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKKwkgICAgY2FzZSAiICR3ZWFrX2xpYnMgIiBpbgorCSAgICAqIiAkZGVwbGliX2Jhc2UgIiopIDs7CisJICAgICopIGRlcGxpYnM9IiRkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlkb25lCisJbGlicz0iJGRscHJlZmlsZXMiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisKKyAgICAgIGZvciBkZXBsaWIgaW4gJGxpYnM7IGRvCisJbGliPQorCWZvdW5kPW5vCisJY2FzZSAkZGVwbGliIGluCisJLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZGVwbGliIgorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliIDsgdGhlbgorCQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCQkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkJICAgICogKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRkZXBsaWIiIDs7CisJCWVzYWMKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwktbCopCisJICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJcYC1sJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGZ1bmNfc3RyaXBuYW1lICctbCcgJycgIiRkZXBsaWIiCisJICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgICAgc2VhcmNoZGlycz0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGliX3NlYXJjaF9wYXRoICRjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZWxzZQorCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZmkKKwkgIGZvciBzZWFyY2hkaXIgaW4gJHNlYXJjaGRpcnM7IGRvCisJICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCisJICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQorCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKKwkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgorCQkgIGZvdW5kPXllcworCQllbHNlCisJCSAgZm91bmQ9bm8KKwkJZmkKKwkJYnJlYWsgMgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGRvbmUKKwkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCisJICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQorCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKKwkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KKwkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopCisJCWlmIGZ1bmNfbGFsaWJfcCAiJGxpYiI7IHRoZW4KKwkJICBsaWJyYXJ5X25hbWVzPQorCQkgIG9sZF9saWJyYXJ5PQorCQkgIGZ1bmNfc291cmNlICIkbGliIgorCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkJICAgIGxsPSIkbCIKKwkJICBkb25lCisJCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKKwkJICAgIGZvdW5kPW5vCisJCSAgICBmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCQkgICAgbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCQkgICAgbGliPSRsYWRpci8kb2xkX2xpYnJhcnkKKwkJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkJICAgIGVsc2UKKwkJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkJICAgIGZpCisJCSAgICBjb250aW51ZQorCQkgIGZpCisJCWZpCisJCTs7CisJICAgICAgKikgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCSAgOzsgIyAtbAorCSoubHRmcmFtZXdvcmspCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCisJCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCisJCSAgICAqIiAkZGVwbGliICIqKSA7OworCQkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGRlcGxpYiIgOzsKKwkJZXNhYworCSAgICBmaQorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCS1MKikKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgY29udGludWUKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgOzsKKwkgICopCisJICAgIGZ1bmNfd2FybmluZyAiXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgY29udGludWUKKwkgIDs7ICMgLUwKKwktUiopCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJICAgIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRkZXBsaWIiCisJICAgIGRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBjb250aW51ZQorCSAgOzsKKwkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7CisJKi4kbGliZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgICMgTGlua2luZyBjb252ZW5pZW5jZSBtb2R1bGVzIGludG8gc2hhcmVkIGxpYnJhcmllcyBpcyBhbGxvd2VkLAorCSAgICAjIGJ1dCBsaW5raW5nIG90aGVyIHN0YXRpYyBsaWJyYXJpZXMgaXMgbm9uLXBvcnRhYmxlLgorCSAgICBjYXNlICIgJGRscHJlY29udmVuaWVuY2VsaWJzICIgaW4KKwkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICAgKikKKwkgICAgICB2YWxpZF9hX2xpYj1ubworCSAgICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJCW1hdGNoX3BhdHRlcm4qKQorCQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAorCQkgIGlmIGV2YWwgIlwkRUNITyBcIlgkZGVwbGliXCIiIDI+L2Rldi9udWxsIHwgJFhzZWQgLWUgMTBxIFwKKwkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgIHZhbGlkX2FfbGliPXllcworCQkgIGZpCisJCTs7CisJCXBhc3NfYWxsKQorCQkgIHZhbGlkX2FfbGliPXllcworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgorCQkkRUNITworCQkkRUNITyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgorCQkkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSRFQ0hPICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKKwkJJEVDSE8gIioqKiB0aGF0IGl0IGlzIGp1c3QgYSBzdGF0aWMgYXJjaGl2ZSB0aGF0IEkgc2hvdWxkIG5vdCB1c2UgaGVyZS4iCisJICAgICAgZWxzZQorCQkkRUNITworCQkkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUiCisJCSRFQ0hPICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgorCQlkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjb250aW51ZQorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgOzsgIyAqLiRsaWJleHQKKwkqLmxvIHwgKi4kb2JqZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAorCSAgICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkZXBsaWIiCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRkZXBsaWIiCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJJURFUExJQlMlKQorCSAgYWxsZGVwbGlicz15ZXMKKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMgIyBjYXNlICRkZXBsaWIKKworCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgorCWVsc2UKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciCisJZmkKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGxpYiIgXAorCSAgfHwgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwlmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCWxhZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCWRsbmFtZT0KKwlkbG9wZW49CisJZGxwcmVvcGVuPQorCWxpYmRpcj0KKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCWluaGVyaXRlZF9saW5rZXJfZmxhZ3M9CisJIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKKwkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlcyBpbnN0YWxsZWQsIG9yIHNob3VsZG5vdGxpbmsKKwlpbnN0YWxsZWQ9eWVzCisJc2hvdWxkbm90bGluaz1ubworCWF2b2lkdGVtcHJwYXRoPQorCisKKwkjIFJlYWQgdGhlIC5sYSBmaWxlCisJZnVuY19zb3VyY2UgIiRsaWIiCisKKwkjIENvbnZlcnQgIi1mcmFtZXdvcmsgZm9vIiB0byAiZm9vLmx0ZnJhbWV3b3JrIgorCWlmIHRlc3QgLW4gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIjsgdGhlbgorCSAgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICJYJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MvLWZyYW1ld29yayBcKFteICRdKlwpL1wxLmx0ZnJhbWV3b3JrL2cnYAorCSAgZm9yIHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgaW4gJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWdzOyBkbworCSAgICBjYXNlICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgICAqIiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyAiKikgOzsKKwkgICAgICAqKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIjs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIlggJGRlcGVuZGVuY3lfbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSAgIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIiB8fAorCSAgIHsgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB9OyB0aGVuCisJICB0ZXN0IC1uICIkZGxvcGVuIiAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkZGxvcGVuIgorCSAgdGVzdCAtbiAiJGRscHJlb3BlbiIgJiYgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRscHJlb3BlbiIKKwlmaQorCisJaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgIyBPbmx5IGNoZWNrIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCisJICAgIGZpCisJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KKwkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiCisJICBmaQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCisJICBkb25lCisJICBjb250aW51ZQorCWZpICMgJHBhc3MgPSBjb252CisKKworCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KKwlsaW5rbGliPQorCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkgIGxpbmtsaWI9IiRsIgorCWRvbmUKKwlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIgorCWZpCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKKwkgIGZpCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAorCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKKwkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKKwkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKKwkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgorCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliICRkZXBlbmRlbmN5X2xpYnMiCisJICBlbHNlCisJICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gZGxvcGVuCisKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRsYWRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7CisJKikKKwkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAorCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGxhZGlyJyIKKwkgICAgZnVuY193YXJuaW5nICJwYXNzaW5nIGl0IGxpdGVyYWxseSB0byB0aGUgbGlua2VyLCBhbHRob3VnaCBpdCBtaWdodCBmYWlsIgorCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKKwkgIGZpCisJICA7OworCWVzYWMKKwlmdW5jX2Jhc2VuYW1lICIkbGliIgorCWxhbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCisJIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCisJaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgorCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGxpYmRpciIKKwkgICAgYWJzZGlyPSIkbGliZGlyIgorCSAgZmkKKwkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgorCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCisJICBmaQorCWZpICMgJGluc3RhbGxlZCA9IHllcworCWZ1bmNfc3RyaXBuYW1lICdsaWInICcubGEnICIkbGFuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIiAmJiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGxpYnJhcmllcyBtYXkgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciCisJICBmaQorCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKwkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjaworCSAgICAjIHRoYXQgdGhleSBhcmUgYmVpbmcgdXNlZCBjb3JyZWN0bHkgaW4gdGhlIGxpbmsgcGFzcy4KKwkgICAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQlkbHByZWNvbnZlbmllbmNlbGlicz0iJGRscHJlY29udmVuaWVuY2VsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KKwkgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kZGxuYW1lIgorCSAgZWxzZQorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgorCSAgZmkKKwlmaSAjICRwYXNzID0gZGxwcmVvcGVuCisKKwlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcworCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkKKworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGFkaXIiCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCisJICBsaW5rYWxsZGVwbGlicz1ubworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAorCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKKwkgIGZpCisKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICAgICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCQkgOzsKKwkgICAgZXNhYworCSAgICAjIE5lZWQgdG8gbGluayBhZ2FpbnN0IGFsbCBkZXBlbmRlbmN5X2xpYnM/CisJICAgIGlmIHRlc3QgIiRsaW5rYWxsZGVwbGlicyIgPSB5ZXM7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgIyBOZWVkIHRvIGhhcmRjb2RlIHNoYXJlZCBsaWJyYXJ5IHBhdGhzCisJICAgICAgIyBvci9hbmQgbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZmkKKwkgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgIGRvbmUgIyBmb3IgZGVwbGliCisJICBjb250aW51ZQorCWZpICMgJGxpbmttb2RlID0gcHJvZy4uLgorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKKwkgICAgIHsgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8CisJICAgICAgICAgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicywkaW5zdGFsbGVkIiA9ICJidWlsdCx5ZXMiOyB9IHx8CisJICAgICAgIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKKwkgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLXogIiRhdm9pZHRlbXBycGF0aCIgOyB0aGVuCisJICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoOiIgaW4KKwkgICAgICAqIiRhYnNkaXI6IiopIDs7CisJICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGgkYWJzZGlyOiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisKKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgorCisJICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKKwkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8CisJICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKKwkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgorCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgY29udGludWUKKwkgIGZpCisJZmkKKworCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKKwl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicworCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgIHVzZV9zdGF0aWNfbGlicz1ubworCWZpCisJaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgeyB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgIyBObyBwb2ludCBpbiByZWxpbmtpbmcgRExMcyBiZWNhdXNlIHBhdGhzIGFyZSBub3QgZW5jb2RlZAorCSAgICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgorCSAgICAgIG5lZWRfcmVsaW5rPW5vCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCisJICAgICAgbm90aW5zdF9kZXBsaWJzPSIkbm90aW5zdF9kZXBsaWJzICRsaWIiCisJICAgICAgbmVlZF9yZWxpbms9eWVzCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJICAjIFRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeQorCisJICAjIFdhcm4gYWJvdXQgcG9ydGFiaWxpdHksIGNhbid0IGxpbmsgYWdhaW5zdCAtbW9kdWxlJ3Mgb24gc29tZQorCSAgIyBzeXN0ZW1zIChkYXJ3aW4pLiAgRG9uJ3QgYmxlYXQgYWJvdXQgZGxvcGVuZWQgbW9kdWxlcyB0aG91Z2ghCisJICBkbG9wZW5tb2R1bGU9IiIKKwkgIGZvciBkbHByZW1vZHVsZXRlc3QgaW4gJGRscHJlZmlsZXM7IGRvCisJICAgIGlmIHRlc3QgIlgkZGxwcmVtb2R1bGV0ZXN0IiA9ICJYJGxpYiI7IHRoZW4KKwkgICAgICBkbG9wZW5tb2R1bGU9IiRkbHByZW1vZHVsZXRlc3QiCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgIGRvbmUKKwkgIGlmIHRlc3QgLXogIiRkbG9wZW5tb2R1bGUiICYmIHRlc3QgIiRzaG91bGRub3RsaW5rIiA9IHllcyAmJiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJICAgICRFQ0hPCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBlbHNlCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZmkKKwkgICAgJEVDSE8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgZmkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKKwkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIjsgdGhlbgorCSAgICAjIGZpZ3VyZSBvdXQgdGhlIHNvbmFtZQorCSAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwkgICAgc2hpZnQKKwkgICAgcmVhbG5hbWU9IiQxIgorCSAgICBzaGlmdAorCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkgICAgIyB1c2UgZGxuYW1lIGlmIHdlIGdvdCBpdC4gaXQncyBwZXJmZWN0bHkgZ29vZCwgbm8/CisJICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgc29uYW1lPSIkZGxuYW1lIgorCSAgICBlbGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KKwkgICAgICAjIGJsZWggd2luZG93cworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAqY3lnd2luKiB8IG1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCQltYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKwkJdmVyc3VmZml4PSItJG1ham9yIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJICAgIGVsc2UKKwkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKKwkgICAgZmkKKworCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQorCSAgICBzb3Jvb3Q9IiRzb25hbWUiCisJICAgIGZ1bmNfYmFzZW5hbWUgIiRzb3Jvb3QiCisJICAgIHNvbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmRsbCcgIiRzb25hbWUiCisJICAgIG5ld2xpYj1saWJpbXAtJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdC5hCisKKwkgICAgIyBJZiB0aGUgbGlicmFyeSBoYXMgbm8gZXhwb3J0IGxpc3QsIHRoZW4gY3JlYXRlIG9uZSBub3cKKwkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYiOyB0aGVuIDoKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRleHRyYWN0X2V4cHN5bXNfY21kcyIgJ2V4aXQgJD8nCisJICAgIGZpCisKKwkgICAgIyBDcmVhdGUgJG5ld2xpYgorCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCisJICAgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIGltcG9ydCBsaWJyYXJ5IGZvciBcYCRzb25hbWUnIgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiICdleGl0ICQ/JworCSAgICBmaQorCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQorCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKKwkgICAgbGlua2xpYj0kbmV3bGliCisJICBmaSAjIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIKKworCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgIGxpYl9saW5rZWQ9eWVzCisJICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgorCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkJY2FzZSAkaG9zdCBpbgorCQkgICotKi1zY28zLjJ2NS4wLlswMjRdKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NCp1dzIqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y1T3BlblVOSVgqIHwgKi0qLXN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCBcCisJCSAgICAqLSotdW5peHdhcmU3KikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1kYXJ3aW4qICkKKwkJICAgICMgaWYgdGhlIGxpYiBpcyBhIChub24tZGxvcGVuZWQpIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QKKwkJICAgICMgbGluayBhZ2FpbnN0IGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBlYXJsaWVyIHdhcm5pbmdzCisJCSAgICBpZiAvdXNyL2Jpbi9maWxlIC1MICRhZGQgMj4gL2Rldi9udWxsIHwKKwkJCSAkR1JFUCAiOiBbXjpdKiBidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCisJCSAgICAgIGlmIHRlc3QgIlgkZGxvcGVubW9kdWxlIiAhPSAiWCRsaWIiOyB0aGVuCisJCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCisJCQlpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgorCQkJICAkRUNITworCQkJICAkRUNITyAiKioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCisJCQkgICRFQ0hPICIqKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKKwkJCWVsc2UKKwkJCSAgYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJCWZpCisJCSAgICAgIGVsaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCQkJYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJICAgICAgZmkKKwkJICAgIGZpCisJCWVzYWMKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCisJCWNhc2UgJGhvc3QgaW4KKwkJKi0qLXN1bm9zKikgYWRkX3NobGlicGF0aD0iJGRpciIgOzsKKwkJZXNhYworCQlhZGRfZGlyPSItTCRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgIHJlbGluaykKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICAgIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUiID0gbm87IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgorCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQkgIGNhc2UgJGxpYmRpciBpbgorCQkgICAgW1xcL10qKQorCQkgICAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopIGxpYl9saW5rZWQ9bm8gOzsKKwkgICAgZXNhYworCisJICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGFkZF9zaGxpYnBhdGgiOyB0aGVuCisJICAgICAgY2FzZSA6JGNvbXBpbGVfc2hsaWJwYXRoOiBpbgorCSAgICAgICoiOiRhZGRfc2hsaWJwYXRoOiIqKSA7OworCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWRkX3NobGlicGF0aDoiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgorCQkqIjokbGliZGlyOiIqKSA7OworCQkqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCisJICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgorCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgorCQlhZGQ9IiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGVsc2UKKwkJYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJY2FzZSAkbGliZGlyIGluCisJCSAgW1xcL10qKQorCQkgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgIGZpCisJICBmaQorCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZmkKKwllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQorCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCisJICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgorCSAgICAkRUNITworCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IFRoaXMgc3lzdGVtIGNhbiBub3QgbGluayB0byBzdGF0aWMgbGliIGFyY2hpdmUgJGxpYi4iCisJICAgICRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICAkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICAgJEVDSE8gIioqKiBCdXQgYXMgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSBsaWJyYXJ5LCBsaWJ0b29sIHdpbGwgc3RpbGwgY3JlYXRlICIKKwkgICAgICAkRUNITyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCisJICAgICAgJEVDSE8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKKwkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCQkkRUNITworCQkkRUNITyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCSRFQ0hPICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCQkkRUNITyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCQkkRUNITyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgICBsaW5rX3N0YXRpYz15ZXMKKwkgIGZpCisJZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCisJICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8CisJICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCisJICAgIHRlbXBfZGVwbGlicz0KKwkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGxpYmRpciBpbgorCSAgICAgIC1SKikgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGxpYmRpciIKKwkgICAgICAgICAgIHRlbXBfeHJwYXRoPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJICAgY2FzZSAiICR4cnBhdGggIiBpbgorCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7CisJCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKKwkJICAgZXNhYzs7CisJICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgorCSAgZmkKKworCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCisJICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKKwkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzZWFyY2ggcGF0aHMgb2YgYWxsIGRlcGVuZGVuY3kgbGlicmFyaWVzCisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgICAtTCopIHBhdGg9IiRkZXBsaWIiIDs7CisJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfZGlybmFtZSAiJGRlcGxpYiIgIiIgIi4iCisJCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCQljYXNlICRkaXIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNkaXI9IiRkaXIiIDs7CisJCSopCisJCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCisJCSAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIKKwkJICAgIGFic2Rpcj0iJGRpciIKKwkJICBmaQorCQkgIDs7CisJCWVzYWMKKwkJaWYgJEdSRVAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotZGFyd2luKikKKwkJICBkZXBkZXBsPQorCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCisJCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KKwkJICAgICAgZGVwZGVwbD0kdG1wCisJCSAgICBkb25lCisJCSAgICBpZiB0ZXN0IC1mICIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiIDsgdGhlbgorCQkgICAgICBkZXBkZXBsPSIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiCisJCSAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0x9IC1MICRkZXBkZXBsIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRkYXJ3aW5faW5zdGFsbF9uYW1lIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXJ3aW5faW5zdGFsbF9uYW1lPWAke09UT09MNjR9IC1MICRkZXBkZXBsICB8IGF3ayAne2lmIChOUiA9PSAyKSB7cHJpbnQgJDE7ZXhpdH19J2AKKyAgICAgICAgICAgICAgICAgICAgICBmaQorCQkgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWR5bGliX2ZpbGUgJHt3bH0ke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAtZHlsaWJfZmlsZSAke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIHBhdGg9CisJCSAgICBmaQorCQkgIGZpCisJCSAgOzsKKwkJKikKKwkJICBwYXRoPSItTCRhYnNkaXIvJG9iamRpciIKKwkJICA7OworCQllc2FjCisJCWVsc2UKKwkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQkgIHRlc3QgIiRhYnNkaXIiICE9ICIkbGliZGlyIiAmJiBcCisJCSAgICBmdW5jX3dhcm5pbmcgIlxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiCisKKwkJICBwYXRoPSItTCRhYnNkaXIiCisJCWZpCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAgICAgKiIgJHBhdGggIiopIDs7CisJICAgICAgKikgZGVwbGlicz0iJHBhdGggJGRlcGxpYnMiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KKwlmaSAjIGxpbmttb2RlID0gbGliCisgICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicworICAgICAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSAicHJvZyI7IHRoZW4KKwkgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRjb21waWxlX2RlcGxpYnMiCisJICBmaW5hbGl6ZV9kZXBsaWJzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGZpbmFsaXplX2RlcGxpYnMiCisJZWxzZQorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAiYCRFQ0hPICJYICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlmaQorICAgICAgZmkKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgorCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKKwlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCisJaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KKwkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgIGxpYl9zZWFyY2hfcGF0aD0KKwkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KKwkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBuZXdsaWJfc2VhcmNoX3BhdGg9CisJZmkKKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KKwkgIHZhcnM9ImRlcGxpYnMiCisJZWxzZQorCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCisJZmkKKwlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKKwkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgorCSAgbmV3X2xpYnM9CisJICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KKwkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KKwkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKKwkgICAgIyAgICAgICAgYnJva2VuOgorCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgorCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KKwkgICAgIyBwcmFjdGljZToKKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAtUiopIDs7CisJICAgICopCisJICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKKwkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKKwkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQorCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCisJICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcworCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQorCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKKwkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAorCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKKwkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKKwkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5CisJICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQorCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0CisJICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCisJICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAgICopCisJCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCQkqIiAkZGVwbGliICIqKSA7OworCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJCWVzYWMKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikKKwkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSA7OworCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgorCWRvbmUgIyBmb3IgdmFyCisgICAgICBmaQorICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKyAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQorICAgICAgdG1wX2xpYnM9CisgICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KKwljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgorCSoiICRpICIqKQorCSAgaT0iIgorCSAgOzsKKwllc2FjCisJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCSAgdG1wX2xpYnM9IiR0bXBfbGlicyAkaSIKKwlmaQorICAgICAgZG9uZQorICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicworICAgIGRvbmUgIyBmb3IgcGFzcworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisgICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKyAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorICAgIGZpCisKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIG9sZGxpYikKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorICAgICAgZmkKKworICAgICAgY2FzZSAiICRkZXBsaWJzIiBpbgorICAgICAgKlwgLWwqIHwgKlwgLUwqKQorCWZ1bmNfd2FybmluZyAiXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgOzsKKyAgICAgIGVzYWMKKworICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiR4cnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgb2xkbGlicz0iJG91dHB1dCIKKyAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgorICAgICAgOzsKKworICAgIGxpYikKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KKyAgICAgIGxpYiopCisJZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRvdXRwdXRuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJOzsKKyAgICAgICopCisJdGVzdCAiJG1vZHVsZSIgPSBubyAmJiBcCisJICBmdW5jX2ZhdGFsX2hlbHAgImxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciCisKKwlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgorCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJZWxzZQorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbGlibmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIKKwllbHNlCisJICAkRUNITworCSAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgorCSAgJEVDSE8gIioqKiBvYmplY3RzICRvYmpzIGlzIG5vdCBwb3J0YWJsZSEiCisJICBsaWJvYmpzPSIkbGlib2JqcyAkb2JqcyIKKwlmaQorICAgICAgZmkKKworICAgICAgdGVzdCAiJGRsc2VsZiIgIT0gbm8gJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIgorCisgICAgICBzZXQgZHVtbXkgJHJwYXRoCisgICAgICBzaGlmdAorICAgICAgdGVzdCAiJCMiIC1ndCAxICYmIFwKKwlmdW5jX3dhcm5pbmcgImlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IgorCisgICAgICBpbnN0YWxsX2xpYmRpcj0iJDEiCisKKyAgICAgIG9sZGxpYnM9CisgICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCisJaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgQnVpbGRpbmcgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnkuCisJICAjIFNvbWUgY29tcGlsZXJzIGhhdmUgcHJvYmxlbXMgd2l0aCBhIGAuYWwnIGV4dGVuc2lvbiBzbworCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZXh0ZW5zaW9uIGFuCisJICAjIGFyY2hpdmUgbm9ybWFsbHkgd291bGQuCisJICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCisJICBidWlsZF9vbGRfbGlicz15ZXMKKwlmaQorCisJdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKworCXRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKyAgICAgIGVsc2UKKworCSMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCisJc2V0IGR1bW15ICR2aW5mbyAwIDAgMAorCXNoaWZ0CisJSUZTPSIkc2F2ZV9pZnMiCisKKwl0ZXN0IC1uICIkNyIgJiYgXAorCSAgZnVuY19mYXRhbF9oZWxwICJ0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciCisKKwkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcworCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCisJIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKKworCWNhc2UgJHZpbmZvX251bWJlciBpbgorCXllcykKKwkgIG51bWJlcl9tYWpvcj0iJDEiCisJICBudW1iZXJfbWlub3I9IiQyIgorCSAgbnVtYmVyX3JldmlzaW9uPSIkMyIKKwkgICMKKwkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0CisJICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgorCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKKwkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKKwkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCisJICAjCisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbnxsaW51eHxvc2Z8d2luZG93c3xub25lKQorCSAgICBmdW5jX2FyaXRoICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yCisJICAgIGN1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGFnZT0iJG51bWJlcl9taW5vciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfcmV2aXNpb24iCisJICAgIDs7CisJICBmcmVlYnNkLWFvdXR8ZnJlZWJzZC1lbGZ8c3Vub3MpCisJICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBhZ2U9IjAiCisJICAgIDs7CisJICBpcml4fG5vbnN0b3B1eCkKKwkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgorCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBsdF9pcml4X2luY3JlbWVudD1ubworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlubykKKwkgIGN1cnJlbnQ9IiQxIgorCSAgcmV2aXNpb249IiQyIgorCSAgYWdlPSIkMyIKKwkgIDs7CisJZXNhYworCisJIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKwljYXNlICRjdXJyZW50IGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICBmdW5jX2Vycm9yICJDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRyZXZpc2lvbiBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgZnVuY19lcnJvciAiUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRhZ2UgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgorCSAgZnVuY19lcnJvciAiQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciCisJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgJHZlcnNpb25fdHlwZSBpbgorCW5vbmUpIDs7CisKKwlkYXJ3aW4pCisJICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCisJICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgorCSAgZnVuY19hcml0aCAkY3VycmVudCArIDEKKwkgIG1pbm9yX2N1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB4bGN2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkbWlub3JfY3VycmVudCAtY3VycmVudF92ZXJzaW9uICRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwlmcmVlYnNkLWFvdXQpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKKwkgIDs7CisKKwlmcmVlYnNkLWVsZikKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlpcml4IHwgbm9uc3RvcHV4KQorCSAgaWYgdGVzdCAiWCRsdF9pcml4X2luY3JlbWVudCIgPSAiWG5vIjsgdGhlbgorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgZWxzZQorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZSArIDEKKwkgIGZpCisJICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKKwkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OworCSAgZXNhYworCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRyZXZpc2lvbgorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRyZXZpc2lvbiAtICRsb29wCisJICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQorCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgorCSAgZG9uZQorCisJICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCisJICBtYWpvcj0uJG1ham9yCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCisJICA7OworCisJbGludXgpCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICA7OworCisJb3NmKQorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKworCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KKwkgIGxvb3A9JGFnZQorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGxvb3AKKwkgICAgaWZhY2U9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXJpdGggJGxvb3AgLSAxCisJICAgIGxvb3A9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgorCSAgZG9uZQorCisJICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCisJICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgorCSAgOzsKKworCXFueCkKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlzdW5vcykKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJd2luZG93cykKKwkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKKwkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJICA7OworCisJKikKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAidW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIgorCSAgOzsKKwllc2FjCisKKwkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgorCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICBtYWpvcj0KKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgZGFyd2luKQorCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKKwkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQorCSAgICB2ZXJzdHJpbmc9CisJICAgIDs7CisJICAqKQorCSAgICB2ZXJzdHJpbmc9IjAuMCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgICAgdmVyc3VmZml4PQorCSAgZWxzZQorCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCisJICBmaQorCWZpCisKKwkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKKwlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgbWFqb3I9CisJICB2ZXJzdWZmaXg9CisJICB2ZXJzdHJpbmc9IiIKKwlmaQorCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgorCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJ1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIgorCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisJICBmaQorCWVsc2UKKwkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgorCWZpCisKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkbGlibmFtZSIgIiRsaWJuYW1lIiAieWVzIgorICAgICAgbGlib2Jqcz0iJGxpYm9ianMgJHN5bWZpbGVvYmoiCisgICAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCisgICAgICBpZiB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJIyBSZW1vdmUgb3VyIG91dHB1dHMsIGJ1dCBkb24ndCByZW1vdmUgb2JqZWN0IGZpbGVzIHNpbmNlIHRoZXkKKwkjIG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBQSUMgb2JqZWN0cy4KKwlyZW1vdmVsaXN0PQorCXRlbXByZW1vdmVsaXN0PWAkRUNITyAiJG91dHB1dF9vYmpkaXIvKiJgCisJZm9yIHAgaW4gJHRlbXByZW1vdmVsaXN0OyBkbworCSAgY2FzZSAkcCBpbgorCSAgICAqLiRvYmpleHQgfCAqLmdjbm8pCisJICAgICAgIDs7CisJICAgICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIHwgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiB8ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LiopCisJICAgICAgIGlmIHRlc3QgIlgkcHJlY2lvdXNfZmlsZXNfcmVnZXgiICE9ICJYIjsgdGhlbgorCQkgaWYgJEVDSE8gIiRwIiB8ICRFR1JFUCAtZSAiJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiA+L2Rldi9udWxsIDI+JjEKKwkJIHRoZW4KKwkJICAgY29udGludWUKKwkJIGZpCisJICAgICAgIGZpCisJICAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRwIgorCSAgICAgICA7OworCSAgICAqKSA7OworCSAgZXNhYworCWRvbmUKKwl0ZXN0IC1uICIkcmVtb3ZlbGlzdCIgJiYgXAorCSAgZnVuY19zaG93X2V2YWwgIiR7Uk19ciBcJHJlbW92ZWxpc3QiCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCisJb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKworCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KKwlvbGRvYmpzPSIkb2JqcyAiYCRFQ0hPICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KKyAgICAgICNmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworICAgICAgIwlsaWJfc2VhcmNoX3BhdGg9YCRFQ0hPICJYJGxpYl9zZWFyY2hfcGF0aCAiIHwgJFhzZWQgLWUgInMlICRwYXRoICUgJWciYAorICAgICAgIwlkZXBsaWJzPWAkRUNITyAiWCRkZXBsaWJzICIgfCAkWHNlZCAtZSAicyUgLUwkcGF0aCAlICVnImAKKyAgICAgICMJZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiWCRkZXBlbmRlbmN5X2xpYnMgIiB8ICRYc2VkIC1lICJzJSAtTCRwYXRoICUgJWciYAorICAgICAgI2RvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJdGVtcF94cnBhdGg9CisJZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbworCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisJaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIGRsZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMgdGhhdCB3b24ndCBiZSBkbHByZW9wZW5lZAorICAgICAgb2xkX2RsZmlsZXM9IiRkbGZpbGVzIgorICAgICAgZGxmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbGZpbGVzOyBkbworCWNhc2UgIiAkZGxwcmVmaWxlcyAkZGxmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBkbGZpbGVzPSIkZGxmaWxlcyAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgIyBNYWtlIHN1cmUgZGxwcmVmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcworICAgICAgb2xkX2RscHJlZmlsZXM9IiRkbHByZWZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbHByZWZpbGVzOyBkbworCWNhc2UgIiRkbHByZWZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWJlb3MqIHwgKi1jZWdjYyopCisJICAgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKKwkgICAgOzsKKwkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICAgIyBSaGFwc29keSBDIGxpYnJhcnkgaXMgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgICAgZGVwbGlicz0iJGRlcGxpYnMgU3lzdGVtLmx0ZnJhbWV3b3JrIgorCSAgICA7OworCSAgKi0qLW5ldGJzZCopCisJICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICA7OworCSAgKikKKwkgICAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBvdGhlciBzeXN0ZW1zIGlmIG5lY2Vzc2FyeS4KKwkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbmVlZF9sYyIgPSAieWVzIjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sYyIKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCisJIyBUcmFuc2Zvcm0gZGVwbGlicyBpbnRvIG9ubHkgZGVwbGlicyB0aGF0IGNhbiBiZSBsaW5rZWQgaW4gc2hhcmVkLgorCW5hbWVfc2F2ZT0kbmFtZQorCWxpYm5hbWVfc2F2ZT0kbGlibmFtZQorCXJlbGVhc2Vfc2F2ZT0kcmVsZWFzZQorCXZlcnN1ZmZpeF9zYXZlPSR2ZXJzdWZmaXgKKwltYWpvcl9zYXZlPSRtYWpvcgorCSMgSSdtIG5vdCBzdXJlIGlmIEknbSB0cmVhdGluZyB0aGUgcmVsZWFzZSBjb3JyZWN0bHkuICBJIHRoaW5rCisJIyByZWxlYXNlIHNob3VsZCBzaG93IHVwIGluIHRoZSAtbCAoaWUgLWxnbXA1KSBzbyB3ZSBkb24ndCB3YW50IHRvCisJIyBhZGQgaXQgaW4gdHdpY2UuICBJcyB0aGF0IGNvcnJlY3Q/CisJcmVsZWFzZT0iIgorCXZlcnN1ZmZpeD0iIgorCW1ham9yPSIiCisJbmV3ZGVwbGlicz0KKwlkcm9wcGVkZGVwcz1ubworCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJcGFzc19hbGwpCisJICAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KKwkgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKKwkgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KKwkgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAorCSAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3IuCisJICBuZXdkZXBsaWJzPSRkZXBsaWJzCisJICA7OworCXRlc3RfY29tcGlsZSkKKwkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCisJICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAorCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKKwkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdC5jCisJICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisJICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdAorCSAgaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnM7IHRoZW4KKwkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQlpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCSAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSAgKiIgJGkgIiopCisJCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKKwkJICAgIGk9IiIKKwkJICAgIDs7CisJCSAgZXNhYworCQlmaQorCQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgIlxcJEVDSE8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCIiYAorCQkgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgZGVwbGliX21hdGNoPSQxCisJCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgZWxzZQorCQkgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICAkRUNITworCQkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICAkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCisJCSAgICAkRUNITyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgorCQkgICAgJEVDSE8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICBmaQorCQlmaQorCQk7OworCSAgICAgICopCisJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAjIEVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKKwkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQkkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0CisJCWlmICRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpOyB0aGVuCisJCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICAgKiIgJGkgIiopCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgICBpPSIiCisJCSAgICAgIDs7CisJCSAgICBlc2FjCisJCSAgZmkKKwkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsICJcXCRFQ0hPIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiImAKKwkJICAgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgICBkZXBsaWJfbWF0Y2g9JDEKKwkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgICBlbHNlCisJCSAgICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgICAkRUNITworCQkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCisJCSAgICAgICRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgICAkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICAgJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJICAgICAgJEVDSE8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIHRoaXMgb25lIgorCQkgICAgICAkRUNITyAiKioqIGFzIGEgZHluYW1pYyBkZXBlbmRlbmN5IHRoYXQgcHJvZ3JhbXMgY2FuIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgorCQkgICAgZmkKKwkJICBmaQorCQllbHNlCisJCSAgZHJvcHBlZGRlcHM9eWVzCisJCSAgJEVDSE8KKwkJICAkRUNITyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgorCQkgICRFQ0hPICIqKiogbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCisJCSAgJEVDSE8gIioqKiBsaWJyYXJ5IHRoYXQgaXQgZGVwZW5kcyBvbiBiZWZvcmUgdGhpcyBsaWJyYXJ5IHdpbGwgYmUgZnVsbHkiCisJCSAgJEVDSE8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCisJCWZpCisJCTs7CisJICAgICAgKikKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaQorCSAgOzsKKwlmaWxlX21hZ2ljKikKKwkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIGNhc2UgJGFfZGVwbGliIGluCisJICAgIC1sKikKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGFfZGVwbGliIgorCSAgICAgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSoiICRhX2RlcGxpYiAiKikKKwkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJCSAgYV9kZXBsaWI9IiIKKwkJICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgorCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgfAorCQkJICRHUkVQICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCisJCQljb250aW51ZQorCQkgICAgICBmaQorCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KKwkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgorCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCisJCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKKwkJICAgICAgIyBidXQgc28gd2hhdD8KKwkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKKwkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCisJCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCisJCQljYXNlICRwb3RsaWJsaW5rIGluCisJCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKKwkJCSopIHBvdGxpYj1gJEVDSE8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKKwkJCWVzYWMKKwkJICAgICAgZG9uZQorCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgfAorCQkJICRTRUQgLWUgMTBxIHwKKwkJCSAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkJYV9kZXBsaWI9IiIKKwkJCWJyZWFrIDIKKwkJICAgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQkkRUNITworCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCSRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJJEVDSE8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCisJCWVsc2UKKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkRUNITyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCisJICA7OworCW1hdGNoX3BhdHRlcm4qKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKKwkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKKwkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgICAgY2FzZSAkYV9kZXBsaWIgaW4KKwkgICAgLWwqKQorCSAgICAgIGZ1bmNfc3RyaXBuYW1lIC1sICcnICIkYV9kZXBsaWIiCisJICAgICAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICBwb3RsaWI9IiRwb3RlbnRfbGliIiAjIHNlZSBzeW1saW5rLWNoZWNrIGFib3ZlIGluIGZpbGVfbWFnaWMgdGVzdAorCQkgICAgaWYgZXZhbCAiXCRFQ0hPIFwiWCRwb3RlbnRfbGliXCIiIDI+L2Rldi9udWxsIHwgJFhzZWQgLWUgMTBxIHwgXAorCQkgICAgICAgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkgICAgICBhX2RlcGxpYj0iIgorCQkgICAgICBicmVhayAyCisJCSAgICBmaQorCQkgIGRvbmUKKwkJZG9uZQorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCSRFQ0hPCisJCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKKwkJJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSRFQ0hPICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkkRUNITyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQkkRUNITyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKKwkJZWxzZQorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgorCQkgICRFQ0hPICIqKiogdXNpbmcgYSByZWdleCBwYXR0ZXJuLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKKwkJZmkKKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbm9uZSB8IHVua25vd24gfCAqKQorCSAgbmV3ZGVwbGlicz0iIgorCSAgdG1wX2RlcGxpYnM9YCRFQ0hPICJYICRkZXBsaWJzIiB8ICRYc2VkIFwKKwkgICAgICAtZSAncy8gLWxjJC8vJyAtZSAncy8gLVtMUl1bXiBdKi8vZydgCisJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJICAgIGZvciBpIGluICRwcmVkZXBzICRwb3N0ZGVwcyA7IGRvCisJICAgICAgIyBjYW4ndCB1c2UgWHNlZCBiZWxvdywgYmVjYXVzZSAkaSBtaWdodCBjb250YWluICcvJworCSAgICAgIHRtcF9kZXBsaWJzPWAkRUNITyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgInMsJGksLCJgCisJICAgIGRvbmUKKwkgIGZpCisJICBpZiAkRUNITyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvWwkgXS8vZycgfAorCSAgICAgJEdSRVAgLiA+L2Rldi9udWxsOyB0aGVuCisJICAgICRFQ0hPCisJICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgorCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCisJICAgIGVsc2UKKwkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKKwkgICAgZmkKKwkgICAgJEVDSE8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgorCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkgIGZpCisJICA7OworCWVzYWMKKwl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCisJbWFqb3I9JG1ham9yX3NhdmUKKwlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKKwlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKKwluYW1lPSRuYW1lX3NhdmUKKworCWNhc2UgJGhvc3QgaW4KKwkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSB3aXRoIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICBuZXdkZXBsaWJzPWAkRUNITyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICAkRUNITworCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCisJICAgICRFQ0hPICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKKwkgICAgJEVDSE8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgorCSAgICAkRUNITyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgorCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCSAgICAgICRFQ0hPCisJICAgICAgJEVDSE8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCSAgICAgICRFQ0hPICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCSAgICAgICRFQ0hPICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJICAgICAgJEVDSE8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgZWxzZQorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBmaQorCSAgZWxzZQorCSAgICAkRUNITyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKKwkgICAgJEVDSE8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCisJICAgICRFQ0hPICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCisKKwkgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSBubzsgdGhlbgorCSAgICAgICRFQ0hPCisJICAgICAgJEVDSE8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCisJICAgICAgJEVDSE8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgorCSAgICAgICRFQ0hPICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCisJICAgICAgJEVDSE8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkJYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgICAgZWxzZQorCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkKKwlmaQorCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQorCWRlcGxpYnM9JG5ld2RlcGxpYnMKKyAgICAgIGZpCisgICAgICAjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisgICAgICBjYXNlICRob3N0IGluCisJKi0qLWRhcndpbiopCisJICBuZXdkZXBsaWJzPWAkRUNITyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPWAkRUNITyAiWCAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBkZXBsaWJzPWAkRUNITyAiWCAkZGVwbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAorICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKKyAgICAgIG5ld19saWJzPQorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwljYXNlICIgJG5ld19saWJzICIgaW4KKwkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7CisJKikKKwkgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCisJICAgIG5ld19saWJzPSIkbmV3X2xpYnMgLUwkcGF0aC8kb2JqZGlyIiA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGRlcGxpYnM9IiRuZXdfbGlicyIKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorCisgICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgorCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCQlpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkJICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCQllbHNlCisJCSAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQkgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJCSAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQkgICAgOzsKKwkJICAqKQorCQkgICAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZGVwX3JwYXRoPSIkZGVwX3JwYXRoICRmbGFnIgorCSAgICAgIGZpCisJICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZG9uZQorCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIjsgdGhlbgorCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRcIgorCSAgICBlbHNlCisJICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJICAgIGZpCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgICAgcnBhdGg9CisJICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgICBkb25lCisJICAgIGV2YWwgIiRydW5wYXRoX3Zhcj0nJHJwYXRoXCQkcnVucGF0aF92YXInOyBleHBvcnQgJHJ1bnBhdGhfdmFyIgorCSAgZmkKKwkgIHRlc3QgLW4gIiRkZXBfcnBhdGgiICYmIGRlcGxpYnM9IiRkZXBfcnBhdGggJGRlcGxpYnMiCisJZmkKKworCXNobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCIKKwl0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKKwlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgorCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCWZpCisKKwkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KKwlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXNoaWZ0CisJcmVhbG5hbWU9IiQxIgorCXNoaWZ0CisKKwlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJZWxzZQorCSAgc29uYW1lPSIkcmVhbG5hbWUiCisJZmkKKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgZGxuYW1lPSRzb25hbWUKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJbGlua25hbWVzPQorCWZvciBsaW5rCisJZG8KKwkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKKwlkb25lCisKKwkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYworCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJEVDSE8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCXRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisKKwlkZWxmaWxlcz0KKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgY3AgIiRleHBvcnRfc3ltYm9scyIgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCisJICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudWV4cCIKKwkgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJGV4cG9ydF9zeW1ib2xzIgorCWZpCisKKwlvcmlnX2V4cG9ydF9zeW1ib2xzPQorCWNhc2UgJGhvc3Rfb3MgaW4KKwljeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICMgZXhwb3J0aW5nIHVzaW5nIHVzZXIgc3VwcGxpZWQgc3ltZmlsZQorCSAgICBpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgIT0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAjIGFuZCBpdCdzIE5PVCBhbHJlYWR5IGEgLmRlZiBmaWxlLiBNdXN0IGZpZ3VyZSBvdXQKKwkgICAgICAjIHdoaWNoIG9mIHRoZSBnaXZlbiBzeW1ib2xzIGFyZSBkYXRhIHN5bWJvbHMgYW5kIHRhZworCSAgICAgICMgdGhlbSBhcyBzdWNoLiBTbywgdHJpZ2dlciB1c2Ugb2YgZXhwb3J0X3N5bWJvbHNfY21kcy4KKwkgICAgICAjIGV4cG9ydF9zeW1ib2xzIGdldHMgcmVhc3NpZ25lZCBpbnNpZGUgdGhlICJwcmVwYXJlCisJICAgICAgIyB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzIiBpZiBzdGF0ZW1lbnQsIHNvIHRoZQorCSAgICAgICMgaW5jbHVkZV9leHBzeW1zIGxvZ2ljIHN0aWxsIHdvcmtzLgorCSAgICAgIG9yaWdfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICBleHBvcnRfc3ltYm9scz0KKwkgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisJICAgIGZpCisJICBmaQorCSAgOzsKKwllc2FjCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcworCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICBldmFsIGNtZD1cIiRjbWRcIgorCSAgICAgIGZ1bmNfbGVuICIgJGNtZCIKKwkgICAgICBsZW49JGZ1bmNfbGVuX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCQlmdW5jX3Nob3dfZXZhbCAiJGNtZCIgJ2V4aXQgJD8nCisJCXNraXBwZWRfZXhwb3J0PWZhbHNlCisJICAgICAgZWxzZQorCQkjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gZXhlY3V0ZSBpbiBvbmUgc3RlcC4KKwkJZnVuY192ZXJib3NlICJ1c2luZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGZvciBleHBvcnQgbGlzdC4uLiIKKwkJc2tpcHBlZF9leHBvcnQ9OgorCQkjIEJyZWFrIG91dCBlYXJseSwgb3RoZXJ3aXNlIHNraXBwZWRfZXhwb3J0IG1heSBiZQorCQkjIHNldCB0byBmYWxzZSBieSBhIGxhdGVyIGJ1dCBzaG9ydGVyIGNtZC4KKwkJYnJlYWsKKwkgICAgICBmaQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiI7IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgIHRtcF9leHBvcnRfc3ltYm9scz0iJGV4cG9ydF9zeW1ib2xzIgorCSAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRYc2VkIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICMgVGhlIGdpdmVuIGV4cG9ydHNfc3ltYm9scyBmaWxlIGhhcyB0byBiZSBmaWx0ZXJlZCwgc28gZmlsdGVyIGl0LgorCSAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgorCSAgIyAncycgY29tbWFuZHMgd2hpY2ggbm90IGFsbCBzZWRzIGNhbiBoYW5kbGUuIEdOVSBzZWQgc2hvdWxkIGJlIGZpbmUKKwkgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKKwkgICMgaXNuJ3QgYSBibGVzc2VkIHRvb2wuCisJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKKwkgIGV4cG9ydF9zeW1ib2xzPSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZgorCSAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwlmaQorCisJdG1wX2RlcGxpYnM9CisJZm9yIHRlc3RfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgY2FzZSAiICRjb252ZW5pZW5jZSAiIGluCisJICAqIiAkdGVzdF9kZXBsaWIgIiopIDs7CisJICAqKQorCSAgICB0bXBfZGVwbGlicz0iJHRtcF9kZXBsaWJzICR0ZXN0X2RlcGxpYiIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJZGVwbGlicz0iJHRtcF9kZXBsaWJzIgorCisJaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIiAmJgorCSAgICB0ZXN0ICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0IiA9IHllcyAmJgorCSAgICB0ZXN0IC16ICIkbGlib2JqcyI7IHRoZW4KKwkgICAgIyBleHRyYWN0IHRoZSBhcmNoaXZlcywgc28gd2UgaGF2ZSBvYmplY3RzIHRvIGxpc3QuCisJICAgICMgVE9ETzogY291bGQgb3B0aW1pemUgdGhpcyB0byBqdXN0IGV4dHJhY3Qgb25lIGFyY2hpdmUuCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCSAgZWxzZQorCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgICAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJICBmaQorCWZpCisKKwlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKKwlmaQorCisJIyBNYWtlIGEgYmFja3VwIG9mIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IHdoZW4gcmVsaW5raW5nCisJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRSTSAke3JlYWxuYW1lfVUgJiYgJE1WICRyZWFsbmFtZSAke3JlYWxuYW1lfVUpJyB8fCBleGl0ICQ/CisJZmkKKworCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgIGVsc2UKKwkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfY21kcworCSAgZmkKKwllbHNlCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2V4cHN5bV9jbWRzXCIKKwkgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2NtZHNcIgorCSAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYKKwkgICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiICYmCisJICAgbGVuPSRmdW5jX2xlbl9yZXN1bHQgJiYKKwkgICB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIDoKKwllbHNlCisJICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBwaWVjZXdpc2UKKwkgICMgb3IsIGlmIHVzaW5nIEdOVSBsZCBhbmQgc2tpcHBlZF9leHBvcnQgaXMgbm90IDosIHVzZSBhIGxpbmtlcgorCSAgIyBzY3JpcHQuCisKKwkgICMgU2F2ZSB0aGUgdmFsdWUgb2YgJG91dHB1dCBhbmQgJGxpYm9ianMgYmVjYXVzZSB3ZSB3YW50IHRvCisJICAjIHVzZSB0aGVtIGxhdGVyLiAgSWYgd2UgaGF2ZSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgd2UKKwkgICMgd2FudCB0byB1c2Ugc2F2ZV9saWJvYmpzIGFzIGl0IHdhcyBiZWZvcmUKKwkgICMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgd2FzIGV4cGFuZGVkLCBiZWNhdXNlIHdlIGNhbid0CisJICAjIGFzc3VtZSB0aGUgbGlua2VyIHVuZGVyc3RhbmRzIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLgorCSAgIyBUaGlzIG1heSBoYXZlIHRvIGJlIHJldmlzaXRlZCwgaW4gY2FzZSB0b28gbWFueQorCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgZ2V0IGxpbmtlZCBpbiBhbmQgZW5kIHVwIGV4Y2VlZGluZworCSAgIyB0aGUgc3BlYy4KKwkgIGlmIHRlc3QgLXogIiRjb252ZW5pZW5jZSIgfHwgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgIGZpCisJICBzYXZlX291dHB1dD0kb3V0cHV0CisJICBvdXRwdXRfbGE9YCRFQ0hPICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKKworCSAgIyBDbGVhciB0aGUgcmVsb2FkYWJsZSBvYmplY3QgY3JlYXRpb24gY29tbWFuZCBxdWV1ZSBhbmQKKwkgICMgaW5pdGlhbGl6ZSBrIHRvIG9uZS4KKwkgIHRlc3RfY21kcz0KKwkgIGNvbmNhdF9jbWRzPQorCSAgb2JqbGlzdD0KKwkgIGxhc3Rfcm9iaj0KKwkgIGs9MQorCisJICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgb3V0cHV0PSR7b3V0cHV0X29iamRpcn0vJHtvdXRwdXRfbGF9Lmxua3NjcmlwdAorCSAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIEdOVSBsZCBzY3JpcHQ6ICRvdXRwdXQiCisJICAgICRFQ0hPICdJTlBVVCAoJyA+ICRvdXRwdXQKKwkgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgIGRvCisJICAgICAgJEVDSE8gIiRvYmoiID4+ICRvdXRwdXQKKwkgICAgZG9uZQorCSAgICAkRUNITyAnKScgPj4gJG91dHB1dAorCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXQiCisJICBlbGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiWCRmaWxlX2xpc3Rfc3BlYyIgIT0gWDsgdGhlbgorCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rCisJICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgbGlua2VyIGlucHV0IGZpbGUgbGlzdDogJG91dHB1dCIKKwkgICAgOiA+ICRvdXRwdXQKKwkgICAgc2V0IHggJHNhdmVfbGlib2JqcworCSAgICBzaGlmdAorCSAgICBmaXJzdG9iaj0KKwkgICAgaWYgdGVzdCAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgPSB5ZXM7IHRoZW4KKwkgICAgICBmaXJzdG9iaj0iJDEgIgorCSAgICAgIHNoaWZ0CisJICAgIGZpCisJICAgIGZvciBvYmoKKwkgICAgZG8KKwkgICAgICAkRUNITyAiJG9iaiIgPj4gJG91dHB1dAorCSAgICBkb25lCisJICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dCIKKwkgICAgb3V0cHV0PSRmaXJzdG9ialwiJGZpbGVfbGlzdF9zcGVjJG91dHB1dFwiCisJICBlbHNlCisJICAgIGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiOyB0aGVuCisJICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4uLiIKKwkgICAgICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKKwkgICAgICBldmFsIHRlc3RfY21kcz1cIiRyZWxvYWRfY21kc1wiCisJICAgICAgZnVuY19sZW4gIiAkdGVzdF9jbWRzIgorCSAgICAgIGxlbjA9JGZ1bmNfbGVuX3Jlc3VsdAorCSAgICAgIGxlbj0kbGVuMAorCisJICAgICAgIyBMb29wIG92ZXIgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBiZSBsaW5rZWQuCisJICAgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgICAgZG8KKwkJZnVuY19sZW4gIiAkb2JqIgorCQlmdW5jX2FyaXRoICRsZW4gKyAkZnVuY19sZW5fcmVzdWx0CisJCWxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJaWYgdGVzdCAiWCRvYmpsaXN0IiA9IFggfHwKKwkJICAgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iOyB0aGVuCisJCSAgZnVuY19hcHBlbmQgb2JqbGlzdCAiICRvYmoiCisJCWVsc2UKKwkJICAjIFRoZSBjb21tYW5kICR0ZXN0X2NtZHMgaXMgYWxtb3N0IHRvbyBsb25nLCBhZGQgYQorCQkgICMgY29tbWFuZCB0byB0aGUgcXVldWUuCisJCSAgaWYgdGVzdCAiJGsiIC1lcSAxIDsgdGhlbgorCQkgICAgIyBUaGUgZmlyc3QgZmlsZSBkb2Vzbid0IGhhdmUgYSBwcmV2aW91cyBjb21tYW5kIHRvIGFkZC4KKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCIkcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCisJCSAgZWxzZQorCQkgICAgIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KKwkJICAgICMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJCSAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc34kcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ian5cJFJNICRsYXN0X3JvYmpcIgorCQkgIGZpCisJCSAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJCSAgZnVuY19hcml0aCAkayArIDEKKwkJICBrPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCQkgIG9iamxpc3Q9JG9iagorCQkgIGZ1bmNfbGVuICIgJGxhc3Rfcm9iaiIKKwkJICBmdW5jX2FyaXRoICRsZW4wICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQkgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0CisJICAgICAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKKwkgICAgICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgorCSAgICAgIGlmIHRlc3QgLW4gIiRsYXN0X3JvYmoiOyB0aGVuCisJICAgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9flwkUk0gJGxhc3Rfcm9ialwiCisJICAgICAgZmkKKwkgICAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXQiCisKKwkgICAgZWxzZQorCSAgICAgIG91dHB1dD0KKwkgICAgZmkKKworCSAgICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCisJICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRleHBvcnRfc3ltYm9scworCSAgICAgIGxpYm9ianM9JG91dHB1dAorCSAgICAgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgZXhwb3J0IGZpbGUuCisJICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+CisJICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHMkZXhwb3J0X3N5bWJvbHNfY21kc1wiCisJICAgICAgaWYgdGVzdCAtbiAiJGxhc3Rfcm9iaiI7IHRoZW4KKwkJZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+XCRSTSAkbGFzdF9yb2JqXCIKKwkgICAgICBmaQorCSAgICBmaQorCisJICAgIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmCisJICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBhIHRlbXBvcmFyeSByZWxvYWRhYmxlIG9iamVjdCBmaWxlOiAkb3V0cHV0IgorCisJICAgICMgTG9vcCB0aHJvdWdoIHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgYWJvdmUgYW5kIGV4ZWN1dGUgdGhlbS4KKwkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgIGZvciBjbWQgaW4gJGNvbmNhdF9jbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICRvcHRfc2lsZW50IHx8IHsKKwkJICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRjbWQiCisJCSAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgICAgIH0KKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZCIgfHwgeworCQlsdF9leGl0PSQ/CisKKwkJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCQkgICggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiBcCisJCSAgICAkUk0gIiR7cmVhbG5hbWV9VCIgJiYgXAorCQkgICAgJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkJZmkKKworCQlleGl0ICRsdF9leGl0CisJICAgICAgfQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisKKyAgICAgICAgICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICAgICAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkWHNlZCB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICAgICAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCisJICAgICAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAgICAgIyBGSVhNRTogJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIHBvdGVudGlhbGx5IGNvbnRhaW5zIGxvdHMgb2YKKwkgICAgICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQorCSAgICAgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgICAgICMgZ2xvYmFsIHZhcmlhYmxlcy4gam9pbigxKSB3b3VsZCBiZSBuaWNlIGhlcmUsIGJ1dCB1bmZvcnR1bmF0ZWx5CisJICAgICAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgICAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIiCisJICAgICAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCisJICAgICAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwkgICAgZmkKKwkgIGZpCisKKwkgIGxpYm9ianM9JG91dHB1dAorCSAgIyBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBvdXRwdXQuCisJICBvdXRwdXQ9JHNhdmVfb3V0cHV0CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSIgJiYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwkgIGZpCisJICAjIEV4cGFuZCB0aGUgbGlicmFyeSBsaW5raW5nIGNvbW1hbmRzIGFnYWluIHRvIHJlc2V0IHRoZQorCSAgIyB2YWx1ZSBvZiAkbGlib2JqcyBmb3IgcGllY2V3aXNlIGxpbmtpbmcuCisKKwkgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgICAgZWxzZQorCSAgICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICAgIGZpCisJICBlbHNlCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kYXJjaGl2ZV9jbWRzCisJICAgIGZpCisJICBmaQorCWZpCisKKwlpZiB0ZXN0IC1uICIkZGVsZmlsZXMiOyB0aGVuCisJICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIHRvICRjbWRzLgorCSAgZXZhbCBjbWRzPVwiXCRjbWRzflwkUk0gJGRlbGZpbGVzXCIKKwlmaQorCisJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCisJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBsaWJvYmpzPSIkbGlib2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJZmkKKworCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCWZvciBjbWQgaW4gJGNtZHM7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGV2YWwgY21kPVwiJGNtZFwiCisJICAkb3B0X3NpbGVudCB8fCB7CisJICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJGNtZCIKKwkgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgfQorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKKwkgICAgbHRfZXhpdD0kPworCisJICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCSAgICBpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAorCSAgICAgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKKwkJJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkgICAgZmkKKworCSAgICBleGl0ICRsdF9leGl0CisJICB9CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCisJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRSTSAke3JlYWxuYW1lfVQgJiYgJE1WICRyZWFsbmFtZSAke3JlYWxuYW1lfVQgJiYgJE1WICR7cmVhbG5hbWV9VSAkcmVhbG5hbWUpJyB8fCBleGl0ICQ/CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCSAgICBmaQorCSAgZmkKKworCSAgZXhpdCAkRVhJVF9TVUNDRVNTCisJZmkKKworCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCisJZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCisJICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCisJICAgIGZ1bmNfc2hvd19ldmFsICcoY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiAkUk0gIiRsaW5rbmFtZSIgJiYgJExOX1MgIiRyZWFsbmFtZSIgIiRsaW5rbmFtZSIpJyAnZXhpdCAkPycKKwkgIGZpCisJZG9uZQorCisJIyBJZiAtbW9kdWxlIG9yIC1leHBvcnQtZHluYW1pYyB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGRsbmFtZS4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyB8fCB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzOyB0aGVuCisJICAjIE9uIGFsbCBrbm93biBvcGVyYXRpbmcgc3lzdGVtcywgdGhlc2UgYXJlIGlkZW50aWNhbC4KKwkgIGRsbmFtZT0iJHNvbmFtZSIKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvYmopCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorICAgICAgZmkKKworICAgICAgY2FzZSAiICRkZXBsaWJzIiBpbgorICAgICAgKlwgLWwqIHwgKlwgLUwqKQorCWZ1bmNfd2FybmluZyAiXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiA7OworICAgICAgZXNhYworCisgICAgICB0ZXN0IC1uICIkcnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICB0ZXN0IC1uICIkeHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIGNhc2UgJG91dHB1dCBpbgorICAgICAgKi5sbykKKwl0ZXN0IC1uICIkb2JqcyRvbGRfZGVwbGlicyIgJiYgXAorCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIgorCisJbGlib2JqPSRvdXRwdXQKKwlmdW5jX2xvMm8gIiRsaWJvYmoiCisJb2JqPSRmdW5jX2xvMm9fcmVzdWx0CisJOzsKKyAgICAgICopCisJbGlib2JqPQorCW9iaj0iJG91dHB1dCIKKwk7OworICAgICAgZXNhYworCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRvYmogJGxpYm9iagorCisgICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKKyAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCisgICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQorICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KKyAgICAgIHJlbG9hZF9jb252X29ianM9CisgICAgICBnZW50b3A9CisgICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgorICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBhbmQgaG9wZSB3ZSBjYW4gZ2V0IGJ5IHdpdGgKKyAgICAgICMgdHVybmluZyBjb21tYSBpbnRvIHNwYWNlLi4KKyAgICAgIHdsPQorCisgICAgICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgZXZhbCB0bXBfd2hvbGVfYXJjaGl2ZV9mbGFncz1cIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICByZWxvYWRfY29udl9vYmpzPSRyZWxvYWRfb2Jqc1wgYCRFQ0hPICJYJHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzIiB8ICRYc2VkIC1lICdzfCx8IHxnJ2AKKwllbHNlCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b2JqfXgiCisJICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCisJICByZWxvYWRfY29udl9vYmpzPSIkcmVsb2FkX29ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorICAgICAgcmVsb2FkX29ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJEVDSE8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSQnL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgIiAkcmVsb2FkX2NvbnZfb2JqcyIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisKKyAgICAgIG91dHB1dD0iJG9iaiIKKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworCisgICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KKyAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCisJaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwlmaQorCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKwkjICRvcHRfZHJ5X3J1biB8fCBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgfHwgdGVzdCAiJHBpY19tb2RlIiAhPSBkZWZhdWx0OyB0aGVuCisJIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKwlyZWxvYWRfb2Jqcz0iJGxpYm9ianMgJHJlbG9hZF9jb252X29ianMiCisJb3V0cHV0PSIkbGlib2JqIgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgOzsKKworICAgIHByb2cpCisgICAgICBjYXNlICRob3N0IGluCisJKmN5Z3dpbiopIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKKwkgICAgICAgICAgb3V0cHV0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuZXhlOzsKKyAgICAgIGVzYWMKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIgorCisgICAgICB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgXAorICAgICAgICAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biBcCisJJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gXAorCSYmIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93biAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgTFRfSU5JVChbZGxvcGVuXSknIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIlggJGNvbXBpbGVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi0qLWRhcndpbiopCisJIyBEb24ndCBhbGxvdyBsYXp5IGxpbmtpbmcsIGl0IGJyZWFrcyBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycworCSMgQnV0IGlzIHN1cHBvc2VkbHkgZml4ZWQgb24gMTAuNCBvciBsYXRlciAoeWF5ISkuCisJaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgorCSAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSBpbgorCSAgICAxMC5bMDEyM10pCisJICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKKwkgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgIDs7CisJICBlc2FjCisJZmkKKwkjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisJY29tcGlsZV9kZXBsaWJzPWAkRUNITyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCTs7CisgICAgICBlc2FjCisKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRjb21waWxlX2RlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkY29tcGlsZV9kZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19saWJzIgorCisKKyAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCisJICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJHtFQ0hPfSAiJGxpYmRpciIgfCAke1NFRH0gLWUgJ3MqL2xpYiQqL2JpbionYAorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokbGliZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JGxpYmRpcjs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7CisJICBlc2FjCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JHRlc3RiaW5kaXI7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKKworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgorCWNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZnVuY19nZW5lcmF0ZV9kbHN5bXMgIiRvdXRwdXRuYW1lIiAiQFBST0dSQU1AIiAibm8iCisKKyAgICAgICMgdGVtcGxhdGUgcHJlbGlua2luZyBzdGVwCisgICAgICBpZiB0ZXN0IC1uICIkcHJlbGlua19jbWRzIjsgdGhlbgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcHJlbGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPXllcworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICpjZWdjYykKKyAgICAgICAgIyBEaXNhYmxlIHdyYXBwZXJzIGZvciBjZWdjYywgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyBhbnl3YXkuCisgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBpZiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGlmIHRlc3QgIiR3cmFwcGVyc19yZXF1aXJlZCIgPSBubzsgdGhlbgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKworCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorCWV4aXRfc3RhdHVzPTAKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXRfc3RhdHVzPSQ/JworCisJIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwlpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iJworCWZpCisKKwlleGl0ICRleGl0X3N0YXR1cworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgY29tcGlsZV92YXI9CisgICAgICBmaW5hbGl6ZV92YXI9CisgICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICBkb25lCisJICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgIGRvbmUKKwkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRub19pbnN0YWxsIiA9IHllczsgdGhlbgorCSMgV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNjcmlwdC4KKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJbGlua19jb21tYW5kPWAkRUNITyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQKKwkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgorCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisKKwlmdW5jX3dhcm5pbmcgInRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIgorCWZ1bmNfd2FybmluZyAiXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KKwkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJEVDSE8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKKworICAgICAgZnVuY19zaG93X2V2YWwgIiRsaW5rX2NvbW1hbmQiICdleGl0ICQ/JworCisgICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgorICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCSAgaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8ICRsdF91bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZWxzZQorCSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBmaQorCWRvbmUKKwlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgorCXJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIFF1b3RlICRFQ0hPIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgIlgkRUNITyIgPSAiWCRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjsgdGhlbgorCWNhc2UgJHByb2dwYXRoIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKKwkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKKwllc2FjCisJcWVjaG89YCRFQ0hPICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGVsc2UKKwlxZWNobz1gJEVDSE8gIlgkRUNITyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgorCSAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisJZXNhYworCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qKQorCSAgICBleGVleHQ9LmV4ZQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXRuYW1lIgorCSAgICBvdXRwdXRuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG91dHB1dCIgIiIgIi4iCisJICAgIG91dHB1dF9uYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBvdXRwdXRfcGF0aD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorCSAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCisJICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKKwkgICAgJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKKwkgICAgdHJhcCAiJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyA+ICRjd3JhcHBlcnNvdXJjZQorCisJICAgICMgVGhlIHdyYXBwZXIgZXhlY3V0YWJsZSBpcyBidWlsdCB1c2luZyB0aGUgJGhvc3QgY29tcGlsZXIsCisJICAgICMgYmVjYXVzZSBpdCBjb250YWlucyAkaG9zdCBwYXRocyBhbmQgZmlsZXMuIElmIGNyb3NzLQorCSAgICAjIGNvbXBpbGluZywgaXQsIGxpa2UgdGhlIHRhcmdldCBleGVjdXRhYmxlLCBtdXN0IGJlCisJICAgICMgZXhlY3V0ZWQgb24gdGhlICRob3N0IG9yIHVuZGVyIGFuIGVtdWxhdGlvbiBlbnZpcm9ubWVudC4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAkTFRDQyAkTFRDRkxBR1MgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQorCSAgICAgICRTVFJJUCAkY3dyYXBwZXIKKwkgICAgfQorCisJICAgICMgTm93LCBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZvciBmdW5jX3NvdXJjZSB1c2U6CisJICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgJGN3cmFwcGVyCisJICAgICRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgdHJhcCAiJFJNICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAjIG5vdGU6IHRoaXMgc2NyaXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCBzbyBkbyBub3QgY2htb2QuCisJICAgICAgaWYgdGVzdCAieCRidWlsZCIgPSAieCRob3N0IiA7IHRoZW4KKwkJJGN3cmFwcGVyIC0tbHQtZHVtcC1zY3JpcHQgPiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgICBlbHNlCisJCWZ1bmNfZW1pdF93cmFwcGVyIG5vID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZmkKKwkgICAgfQorCSAgOzsKKwkgICogKQorCSAgICAkUk0gJG91dHB1dAorCSAgICB0cmFwICIkUk0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSAgICBmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRvdXRwdXQKKwkgICAgY2htb2QgK3ggJG91dHB1dAorCSAgOzsKKwllc2FjCisgICAgICB9CisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUgJHN5bWZpbGVvYmoiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgJiYgdGVzdCAtZiAiJHN5bWZpbGVvYmoiOyB0aGVuCisJICAgIG9sZG9ianM9IiRvbGRvYmpzICRzeW1maWxlb2JqIgorCSAgZmkKKwlmaQorCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkYWRkbGlicyI7IHRoZW4KKwlnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKKwlvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKyAgICAgIGZpCisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcworICAgICAgZWxzZQorCisJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCisJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwlmaQorCisJIyBQT1NJWCBkZW1hbmRzIG5vIHBhdGhzIHRvIGJlIGVuY29kZWQgaW4gYXJjaGl2ZXMuICBXZSBoYXZlCisJIyB0byBhdm9pZCBjcmVhdGluZyBhcmNoaXZlcyB3aXRoIGR1cGxpY2F0ZSBiYXNlbmFtZXMgaWYgd2UKKwkjIG1pZ2h0IGhhdmUgdG8gZXh0cmFjdCB0aGVtIGFmdGVyd2FyZHMsIGUuZy4sIHdoZW4gY3JlYXRpbmcgYQorCSMgc3RhdGljIGFyY2hpdmUgb3V0IG9mIGEgY29udmVuaWVuY2UgbGlicmFyeSwgb3Igd2hlbiBsaW5raW5nCisJIyB0aGUgZW50aXJldHkgb2YgYSBsaWJ0b29sIGFyY2hpdmUgaW50byBhbm90aGVyIChjdXJyZW50bHkKKwkjIG5vdCBzdXBwb3J0ZWQgYnkgbGlidG9vbCkuCisJaWYgKGZvciBvYmogaW4gJG9sZG9ianMKKwkgICAgZG8KKwkgICAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgorCSAgICAgICRFQ0hPICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgIGRvbmUgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICRFQ0hPICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisJICBmdW5jX21rZGlyX3AgIiRnZW50b3AiCisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKwkgIG9sZG9ianM9CisJICBjb3VudGVyPTEKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKKwkgICAgb2JqYmFzZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBjYXNlICIgJG9sZG9ianMgIiBpbgorCSAgICAiICIpIG9sZG9ianM9JG9iaiA7OworCSAgICAqW1wgL10iJG9iamJhc2UgIiopCisJICAgICAgd2hpbGUgOjsgZG8KKwkJIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcGljayBhbiBhbHRlcm5hdGUgbmFtZSB0aGF0IGFsc28KKwkJIyBvdmVybGFwcy4KKwkJbmV3b2JqPWx0JGNvdW50ZXItJG9iamJhc2UKKwkJZnVuY19hcml0aCAkY291bnRlciArIDEKKwkJY291bnRlcj0kZnVuY19hcml0aF9yZXN1bHQKKwkJY2FzZSAiICRvbGRvYmpzICIgaW4KKwkJKltcIC9dIiRuZXdvYmogIiopIDs7CisJCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKKwkJZXNhYworCSAgICAgIGRvbmUKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCisJICAgICAgb2xkb2Jqcz0iJG9sZG9ianMgJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIDs7CisJICAgICopIG9sZG9ianM9IiRvbGRvYmpzICRvYmoiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKworCWZ1bmNfbGVuICIgJGNtZHMiCisJbGVuPSRmdW5jX2xlbl9yZXN1bHQKKwlpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKKwllbHNlCisJICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cworCSAgZnVuY192ZXJib3NlICJ1c2luZyBwaWVjZXdpc2UgYXJjaGl2ZSBsaW5raW5nLi4uIgorCSAgc2F2ZV9SQU5MSUI9JFJBTkxJQgorCSAgUkFOTElCPToKKwkgIG9iamxpc3Q9CisJICBjb25jYXRfY21kcz0KKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PworCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBsYXN0X29sZG9iaj0kb2JqCisJICBkb25lCisJICBldmFsIHRlc3RfY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKKwkgIGxlbjA9JGZ1bmNfbGVuX3Jlc3VsdAorCSAgbGVuPSRsZW4wCisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIGZ1bmNfbGVuICIgJG9iaiIKKwkgICAgZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAorCSAgICBsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgorCSAgICBpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiI7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICAjIHRoZSBhYm92ZSBjb21tYW5kIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBpdCBnZXRzIHRvbyBsb25nCisJICAgICAgb2xkb2Jqcz0kb2JqbGlzdAorCSAgICAgIGlmIHRlc3QgIiRvYmoiID0gIiRsYXN0X29sZG9iaiIgOyB0aGVuCisJCVJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgICAgICBmaQorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCisJICAgICAgb2JqbGlzdD0KKwkgICAgICBsZW49JGxlbjAKKwkgICAgZmkKKwkgIGRvbmUKKwkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgIG9sZG9ianM9JG9iamxpc3QKKwkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgorCSAgZWxzZQorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCisJICBmaQorCWZpCisgICAgICBmaQorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRjbWRzIiAnZXhpdCAkPycKKyAgICBkb25lCisKKyAgICB0ZXN0IC1uICIkZ2VuZXJhdGVkIiAmJiBcCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJHtSTX1yJGdlbmVyYXRlZCIKKworICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCisgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKKyAgICAgIGZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCWlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwllbHNlCisJICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCWZpCisgICAgICBkb25lCisgICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MgQGluc3RfcHJlZml4X2RpckApIgorICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzIDsgdGhlbgorCXJlbGlua19jb21tYW5kPQorICAgICAgZmkKKworICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbworCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQorCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgICoubGEpCisJCWZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdkbGZpbGVzPQorCisJICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCisJICAgICAgY2FzZSAkbGliIGluCisJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQluZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgorCQk7OworCSAgICAgICopIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICoubGEpCisJCSMgT25seSBwYXNzIHByZW9wZW5lZCBmaWxlcyB0byB0aGUgcHNldWRvLWFyY2hpdmUgKGZvcgorCQkjIGV2ZW50dWFsIGxpbmtpbmcgd2l0aCB0aGUgYXBwLiB0aGF0IGxpbmtzIGl0KSBpZiB3ZQorCQkjIGRpZG4ndCBhbHJlYWR5IGxpbmsgdGhlIHByZW9wZW5lZCBvYmplY3RzIGRpcmVjdGx5IGludG8KKwkJIyB0aGUgbGlicmFyeToKKwkJZnVuY19iYXNlbmFtZSAiJGxpYiIKKwkJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAorCQl0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJCW5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZmkKKwkgICRSTSAkb3V0cHV0CisJICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCB8ICpjZWdjYyosKmxhaSx5ZXMsbm8sKi5kbGwpIHRkbG5hbWU9Li4vYmluLyRkbG5hbWUgOzsKKwkgIGVzYWMKKwkgICRFQ0hPID4gJG91dHB1dCAiXAorIyAkb3V0cHV0bmFtZSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9JyR0ZGxuYW1lJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCisKKyMgTGlua2VyIGZsYWdzIHRoYXQgY2FuIG5vdCBnbyBpbiBkZXBlbmRlbmN5X2xpYnMuCitpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSckbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJworCisjIE5hbWVzIG9mIGFkZGl0aW9uYWwgd2VhayBsaWJyYXJpZXMgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5Cit3ZWFrX2xpYnJhcnlfbmFtZXM9JyR3ZWFrX2xpYnMnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCitjdXJyZW50PSRjdXJyZW50CithZ2U9JGFnZQorcmV2aXNpb249JHJldmlzaW9uCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPSRpbnN0YWxsZWQKKworIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KK3Nob3VsZG5vdGxpbms9JG1vZHVsZQorCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJGRsZmlsZXMnCitkbHByZW9wZW49JyRkbHByZWZpbGVzJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgIiRuZWVkX3JlbGluayIgPSB5ZXM7IHRoZW4KKwkgICAgJEVDSE8gPj4gJG91dHB1dCAiXAorcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIiIKKwkgIGZpCisJZG9uZQorICAgICAgfQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgZnVuY19zaG93X2V2YWwgJyggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiAkUk0gIiRvdXRwdXRuYW1lIiAmJiAkTE5fUyAiLi4vJG91dHB1dG5hbWUiICIkb3V0cHV0bmFtZSIgKScgJ2V4aXQgJD8nCisgICAgICA7OworICAgIGVzYWMKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKworeyB0ZXN0ICIkbW9kZSIgPSBsaW5rIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgfSAmJgorICAgIGZ1bmNfbW9kZV9saW5rICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX3VuaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV91bmluc3RhbGwgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgUk09IiRub25vcHQiCisgICAgZmlsZXM9CisgICAgcm1mb3JjZT0KKyAgICBleGl0X3N0YXR1cz0wCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZikgUk09IiRSTSAkYXJnIjsgcm1mb3JjZT15ZXMgOzsKKyAgICAgIC0qKSBSTT0iJFJNICRhcmciIDs7CisgICAgICAqKSBmaWxlcz0iJGZpbGVzICRhcmciIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgdGVzdCAteiAiJFJNIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIKKworICAgIHJtZGlycz0KKworICAgIG9yaWdvYmpkaXI9IiRvYmpkaXIiCisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworICAgICAgZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisgICAgICBkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgICAgaWYgdGVzdCAiWCRkaXIiID0gWC47IHRoZW4KKwlvYmpkaXI9IiRvcmlnb2JqZGlyIgorICAgICAgZWxzZQorCW9iamRpcj0iJGRpci8kb3JpZ29iamRpciIKKyAgICAgIGZpCisgICAgICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKyAgICAgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgIHRlc3QgIiRtb2RlIiA9IHVuaW5zdGFsbCAmJiBvYmpkaXI9IiRkaXIiCisKKyAgICAgICMgUmVtZW1iZXIgb2JqZGlyIGZvciByZW1vdmFsIGxhdGVyLCBiZWluZyBjYXJlZnVsIHRvIGF2b2lkIGR1cGxpY2F0ZXMKKyAgICAgIGlmIHRlc3QgIiRtb2RlIiA9IGNsZWFuOyB0aGVuCisJY2FzZSAiICRybWRpcnMgIiBpbgorCSAgKiIgJG9iamRpciAiKikgOzsKKwkgICopIHJtZGlycz0iJHJtZGlycyAkb2JqZGlyIiA7OworCWVzYWMKKyAgICAgIGZpCisKKyAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCisgICAgICBpZiB7IHRlc3QgLUwgIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKKwkgeyB0ZXN0IC1oICIkZmlsZSI7IH0gPi9kZXYvbnVsbCAyPiYxIHx8CisJIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgorCToKKyAgICAgIGVsaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisJZXhpdF9zdGF0dXM9MQorCWNvbnRpbnVlCisgICAgICBlbGlmIHRlc3QgIiRybWZvcmNlIiA9IHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBybWZpbGVzPSIkZmlsZSIKKworICAgICAgY2FzZSAkbmFtZSBpbgorICAgICAgKi5sYSkKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCisJaWYgZnVuY19sYWxpYl9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKwkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuIgorCSAgZG9uZQorCSAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRvbGRfbGlicmFyeSIKKworCSAgY2FzZSAiJG1vZGUiIGluCisJICBjbGVhbikKKwkgICAgY2FzZSAiICAkbGlicmFyeV9uYW1lcyAiIGluCisJICAgICMgIiAgIiBpbiB0aGUgYmVnaW5uaW5nIGNhdGNoZXMgZW1wdHkgJGRsbmFtZQorCSAgICAqIiAkZGxuYW1lICIqKSA7OworCSAgICAqKSBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRkbG5hbWUiIDs7CisJICAgIGVzYWMKKwkgICAgdGVzdCAtbiAiJGxpYmRpciIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1pIgorCSAgICA7OworCSAgdW5pbnN0YWxsKQorCSAgICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KKwkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3R1bmluc3RhbGxfY21kcyIgJ3Rlc3QgIiRybWZvcmNlIiA9IHllcyB8fCBleGl0X3N0YXR1cz0xJworCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIiAndGVzdCAiJHJtZm9yY2UiID0geWVzIHx8IGV4aXRfc3RhdHVzPTEnCisJICAgIGZpCisJICAgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgorCSAgICA7OworCSAgZXNhYworCWZpCisJOzsKKworICAgICAgKi5sbykKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBvYmplY3QsIHNvIHZlcmlmeSBpdC4KKwlpZiBmdW5jX2xhbGliX3AgIiRmaWxlIjsgdGhlbgorCisJICAjIFJlYWQgdGhlIC5sbyBmaWxlCisJICBmdW5jX3NvdXJjZSAkZGlyLyRuYW1lCisKKwkgICMgQWRkIFBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJHBpY19vYmplY3QiICYmCisJICAgICB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBBZGQgbm9uLVBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJG5vbl9waWNfb2JqZWN0IiAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG5vbl9waWNfb2JqZWN0IgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICopCisJaWYgdGVzdCAiJG1vZGUiID0gY2xlYW4gOyB0aGVuCisJICBub2V4ZW5hbWU9JG5hbWUKKwkgIGNhc2UgJGZpbGUgaW4KKwkgICouZXhlKQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICBmaWxlPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkbmFtZSIKKwkgICAgbm9leGVuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgIyAkZmlsZSB3aXRoIC5leGUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBybWZpbGVzLAorCSAgICAjIGFkZCAkZmlsZSB3aXRob3V0IC5leGUKKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KKwkgIGlmIGZ1bmNfbHR3cmFwcGVyX3AgIiRmaWxlIjsgdGhlbgorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdCIKKwkgICAgZWxzZQorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRkaXIvJG5vZXhlbmFtZQorCSAgICBmaQorCisJICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5CisJICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9Uy4ke29iamV4dH0iCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSRuYW1lIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCisJICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0ke25vZXhlbmFtZX0uYyIKKwkgICAgZmkKKwkgIGZpCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgZnVuY19zaG93X2V2YWwgIiRSTSAkcm1maWxlcyIgJ2V4aXRfc3RhdHVzPTEnCisgICAgZG9uZQorICAgIG9iamRpcj0iJG9yaWdvYmpkaXIiCisKKyAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKKyAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCisgICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICJybWRpciAkZGlyID4vZGV2L251bGwgMj4mMSIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKK30KKworeyB0ZXN0ICIkbW9kZSIgPSB1bmluc3RhbGwgfHwgdGVzdCAiJG1vZGUiID0gY2xlYW47IH0gJiYKKyAgICBmdW5jX21vZGVfdW5pbnN0YWxsICR7MSsiJEAifQorCit0ZXN0IC16ICIkbW9kZSIgJiYgeworICBoZWxwPSIkZ2VuZXJpY19oZWxwIgorICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIgorfQorCit0ZXN0IC16ICIkZXhlY19jbWQiICYmIFwKKyAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIgorCitpZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCisgIGV2YWwgZXhlYyAiJGV4ZWNfY21kIgorICBleGl0ICRFWElUX0ZBSUxVUkUKK2ZpCisKK2V4aXQgJGV4aXRfc3RhdHVzCisKKworIyBUaGUgVEFHcyBiZWxvdyBhcmUgZGVmaW5lZCBzdWNoIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gYSBzaXR1YXRpb24KKyMgaW4gd2hpY2ggd2UgZGlzYWJsZSBib3RoIGtpbmRzIG9mIGxpYnJhcmllcy4gIEdpdmVuIGNvbmZsaWN0aW5nCisjIGNob2ljZXMsIHdlIGdvIGZvciBhIHN0YXRpYyBsaWJyYXJ5LCB0aGF0IGlzIHRoZSBtb3N0IHBvcnRhYmxlLAorIyBzaW5jZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgc2hhcmVkIGxpYnJhcmllcyB3ZXJlIGRpc2FibGVkIGJlY2F1c2UKKyMgdGhlIHVzZXIgYXNrZWQgZm9yIHRoYXQgb3IgYmVjYXVzZSB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0CisjIHRoZW0uICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgb24gQUlYLCBiZWNhdXNlIHdlIGRvbid0CisjIHN1cHBvcnQgaGF2aW5nIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYXQgdGhlIHNhbWUKKyMgdGltZSBvbiB0aGF0IHBsYXRmb3JtLCBzbyB3ZSBkZWZhdWx0IHRvIGEgc2hhcmVkLW9ubHkgY29uZmlndXJhdGlvbi4KKyMgSWYgYSBkaXNhYmxlLXNoYXJlZCB0YWcgaXMgZ2l2ZW4sIHdlJ2xsIGZhbGxiYWNrIHRvIGEgc3RhdGljLW9ubHkKKyMgY29uZmlndXJhdGlvbi4gIEJ1dCB3ZSdsbCBuZXZlciBnbyBmcm9tIHN0YXRpYy1vbmx5IHRvIHNoYXJlZC1vbmx5LgorCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCitidWlsZF9saWJ0b29sX2xpYnM9bm8KK2J1aWxkX29sZF9saWJzPXllcworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworYnVpbGRfb2xkX2xpYnM9YGNhc2UgJGJ1aWxkX2xpYnRvb2xfbGlicyBpbiB5ZXMpIGVjaG8gbm87OyAqKSBlY2hvIHllczs7IGVzYWNgCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTpzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246MgorIyBFbmQ6CisjIHZpOnN3PTIKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2J1aWxkLXNjcmlwdHMvbWFrZWRlcC5zaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL21ha2VkZXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2IzODYzYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL21ha2VkZXAuc2gKQEAgLTAsMCArMSw5MyBAQAorIyEvYmluL3NoCisjCisjIEdlbmVyYXRlIGRlcGVuZGVuY2llcyBmcm9tIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMKKworIyBDaGVjayB0byBtYWtlIHN1cmUgb3VyIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CitpZiB0ZXN0IHgiJElOQ0xVREUiID0geCAtbyB4IiRTT1VSQ0VTIiA9IHggLW8geCIkb3V0cHV0IiA9IHg7IHRoZW4KKyAgICBlY2hvICJTT1VSQ0VTLCBJTkNMVURFLCBhbmQgb3V0cHV0IG5lZWRzIHRvIGJlIHNldCIKKyAgICBleGl0IDEKK2ZpCitjYWNoZV9wcmVmaXg9Ii4jJCQiCisKK2dlbmVyYXRlX3ZhcigpCit7CisgICAgZWNobyAkMSB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzfFwufF98ZycKK30KKworc2VhcmNoX2RlcHMoKQoreworICAgIGJhc2U9YGVjaG8gJDEgfCBzZWQgJ3N8L1teL10qJHx8J2AKKyAgICBncmVwICcjaW5jbHVkZSAiJyA8JDEgfCBzZWQgLWUgJ3N8LioiXChbXiJdKlwpIi4qfFwxfCcgfCBcCisgICAgd2hpbGUgcmVhZCBmaWxlCisgICAgZG8gY2FjaGU9JHtjYWNoZV9wcmVmaXh9X2BnZW5lcmF0ZV92YXIgJGZpbGVgCisgICAgICAgaWYgdGVzdCAtZiAkY2FjaGU7IHRoZW4KKyAgICAgICAgICA6ICMgV2UgYWxyZWFkeSBhaHZlIHRoaXMgY2FjaGVkCisgICAgICAgZWxzZQorICAgICAgICAgICA6ID4kY2FjaGUKKyAgICAgICAgICAgZm9yIHBhdGggaW4gJGJhc2UgYGVjaG8gJElOQ0xVREUgfCBzZWQgJ3N8LUl8fGcnYAorICAgICAgICAgICBkbyBkZXA9IiRwYXRoLyRmaWxlIgorICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGVwIjsgdGhlbgorICAgICAgICAgICAgICAgICBlY2hvICIJJGRlcCBcXCIgPj4kY2FjaGUKKyAgICAgICAgICAgICAgICAgc2VhcmNoX2RlcHMgJGRlcCA+PiRjYWNoZQorICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgICBkb25lCisgICAgICAgZmkKKyAgICAgICBjYXQgJGNhY2hlCisgICAgZG9uZQorfQorCis6PiR7b3V0cHV0fS5uZXcKK2ZvciBzcmMgaW4gJFNPVVJDRVMKK2RvICBlY2hvICJHZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBmb3IgJHNyYyIKKyAgICBleHQ9YGVjaG8gJHNyYyB8IHNlZCAnc3wuKlwuXCguKlwpfFwxfCdgCisgICAgb2JqPWBlY2hvICRzcmMgfCBzZWQgInN8Xi4qL1woW14gXSpcKVwuLip8XDEubG98ZyJgCisgICAgZWNobyAiXCQob2JqZWN0cykvJG9iajogJHNyYyBcXCIgPj4ke291dHB1dH0ubmV3CisKKyAgICAjIE5vIHNlYXJjaCB0byBiZSBkb25lIHdpdGggV2luZG93cyByZXNvdXJjZSBmaWxlcworICAgIGlmIHRlc3QgeCIkZXh0IiAhPSB4InJjIjsgdGhlbgorICAgICAgICBzZWFyY2hfZGVwcyAkc3JjIHwgc29ydCB8IHVuaXEgPj4ke291dHB1dH0ubmV3CisgICAgZmkKKyAgICBjYXNlICRleHQgaW4KKyAgICAgICAgYykgY2F0ID4+JHtvdXRwdXR9Lm5ldyA8PF9fRU9GX18KKworCVwkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlIFwkKENDKSBcJChDRkxBR1MpIFwkKEVYVFJBX0NGTEFHUykgLWMgJHNyYyAgLW8gXCRACisKK19fRU9GX18KKyAgICAgICAgOzsKKyAgICAgICAgY2MpIGNhdCA+PiR7b3V0cHV0fS5uZXcgPDxfX0VPRl9fCisKKwlcJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSBcJChDQykgXCQoQ0ZMQUdTKSBcJChFWFRSQV9DRkxBR1MpIC1jICRzcmMgIC1vIFwkQAorCitfX0VPRl9fCisgICAgICAgIDs7CisgICAgICAgIG0pIGNhdCA+PiR7b3V0cHV0fS5uZXcgPDxfX0VPRl9fCisKKwlcJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSBcJChDQykgXCQoQ0ZMQUdTKSBcJChFWFRSQV9DRkxBR1MpIC1jICRzcmMgIC1vIFwkQAorCitfX0VPRl9fCisgICAgICAgIDs7CisgICAgICAgIGFzbSkgY2F0ID4+JHtvdXRwdXR9Lm5ldyA8PF9fRU9GX18KKworCVwkKExJQlRPT0wpIC0tdGFnPUNDIC0tbW9kZT1jb21waWxlIFwkKGF1eGRpcikvc3RyaXBfZlBJQy5zaCBcJChOQVNNKSAtSVwkKHNyY2Rpcikvc3JjL2hlcm1lcy8gJHNyYyAtbyBcJEAKKworX19FT0ZfXworICAgICAgICA7OworICAgICAgICBTKSBjYXQgPj4ke291dHB1dH0ubmV3IDw8X19FT0ZfXworCisJXCQoTElCVE9PTCkgIC0tbW9kZT1jb21waWxlIFwkKENDKSBcJChDRkxBR1MpIFwkKEVYVFJBX0NGTEFHUykgLWMgJHNyYyAgLW8gXCRACisKK19fRU9GX18KKyAgICAgICAgOzsKKyAgICAgICAgcmMpIGNhdCA+PiR7b3V0cHV0fS5uZXcgPDxfX0VPRl9fCisKKwlcJChMSUJUT09MKSAgLS10YWc9UkMgLS1tb2RlPWNvbXBpbGUgXCQoV0lORFJFUykgJHNyYyAtbyBcJEAKKworX19FT0ZfXworICAgICAgICA7OworICAgICAgICAqKSAgIGVjaG8gIlVua25vd24gZmlsZSBleHRlbnNpb246ICRleHQiOzsKKyAgICBlc2FjCisgICAgZWNobyAiIiA+PiR7b3V0cHV0fS5uZXcKK2RvbmUKK212ICR7b3V0cHV0fS5uZXcgJHtvdXRwdXR9CitybSAtZiAke2NhY2hlX3ByZWZpeH0qCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvYnVpbGQtc2NyaXB0cy9ta2luc3RhbGxkaXJzIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2J1aWxkLXNjcmlwdHMvbWtpbnN0YWxsZGlycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YWI4ODVlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2J1aWxkLXNjcmlwdHMvbWtpbnN0YWxsZGlycwpAQCAtMCwwICsxLDk5IEBACisjISAvYmluL3NoCisjIG1raW5zdGFsbGRpcnMgLS0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQorIyBBdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KKyMgQ3JlYXRlZDogMTk5My0wNS0xNgorIyBQdWJsaWMgZG9tYWluCisKK2VycnN0YXR1cz0wCitkaXJtb2RlPSIiCisKK3VzYWdlPSJcCitVc2FnZTogbWtpbnN0YWxsZGlycyBbLWhdIFstLWhlbHBdIFstbSBtb2RlXSBkaXIgLi4uIgorCisjIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cword2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgICBjYXNlICIkezF9IiBpbgorICAgICAtaCB8IC0taGVscCB8IC0taCogKQkJCSMgLWggZm9yIGhlbHAKKwllY2hvICIke3VzYWdlfSIgMT4mMjsgZXhpdCAwIDs7CisgICAgIC1tICkJCQkJCSMgLW0gUEVSTSBhcmcKKwlzaGlmdAorCXRlc3QgJCMgLWVxIDAgJiYgeyBlY2hvICIke3VzYWdlfSIgMT4mMjsgZXhpdCAxOyB9CisJZGlybW9kZT0iJHsxfSIKKwlzaGlmdCA7OworICAgICAtLSApIHNoaWZ0OyBicmVhayA7OwkJCSMgc3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAtKiApIGVjaG8gIiR7dXNhZ2V9IiAxPiYyOyBleGl0IDEgOzsJIyB1bmtub3duIG9wdGlvbgorICAgICAqICkgIGJyZWFrIDs7CQkJCSMgZmlyc3Qgbm9uLW9wdCBhcmcKKyAgIGVzYWMKK2RvbmUKKworZm9yIGZpbGUKK2RvCisgIGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgorICAgIHNoaWZ0CisgIGVsc2UKKyAgICBicmVhaworICBmaQorZG9uZQorCitjYXNlICQjIGluCiswKSBleGl0IDAgOzsKK2VzYWMKKworY2FzZSAkZGlybW9kZSBpbgorJycpCisgIGlmIG1rZGlyIC1wIC0tIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICJta2RpciAtcCAtLSAkKiIKKyAgICBleGVjIG1rZGlyIC1wIC0tICIkQCIKKyAgZmkgOzsKKyopCisgIGlmIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS0gLiAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIm1rZGlyIC1tICRkaXJtb2RlIC1wIC0tICQqIgorICAgIGV4ZWMgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLSAiJEAiCisgIGZpIDs7Citlc2FjCisKK2ZvciBmaWxlCitkbworICAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKKyAgIHNoaWZ0CisKKyAgIHBhdGhjb21wPQorICAgZm9yIGQKKyAgIGRvCisgICAgIHBhdGhjb21wPSIkcGF0aGNvbXAkZCIKKyAgICAgY2FzZSAiJHBhdGhjb21wIiBpbgorICAgICAgIC0qICkgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKKyAgICAgZXNhYworCisgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorCWVjaG8gIm1rZGlyICRwYXRoY29tcCIKKworCW1rZGlyICIkcGF0aGNvbXAiIHx8IGxhc3RlcnI9JD8KKworCWlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorCSAgZXJyc3RhdHVzPSRsYXN0ZXJyCisJZWxzZQorCSAgaWYgdGVzdCAhIC16ICIkZGlybW9kZSI7IHRoZW4KKwkgICAgIGVjaG8gImNobW9kICRkaXJtb2RlICRwYXRoY29tcCIKKworCSAgICAgbGFzdGVycj0iIgorCSAgICAgY2htb2QgIiRkaXJtb2RlIiAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKwkgICAgIGlmIHRlc3QgISAteiAiJGxhc3RlcnIiOyB0aGVuCisJICAgICAgIGVycnN0YXR1cz0kbGFzdGVycgorCSAgICAgZmkKKwkgIGZpCisJZmkKKyAgICAgZmkKKworICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKKyAgIGRvbmUKK2RvbmUKKworZXhpdCAkZXJyc3RhdHVzCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246IDMKKyMgRW5kOgorIyBta2luc3RhbGxkaXJzIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2J1aWxkLXNjcmlwdHMvc3RyaXBfZlBJQy5zaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL3N0cmlwX2ZQSUMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDVkMzRiYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9idWlsZC1zY3JpcHRzL3N0cmlwX2ZQSUMuc2gKQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisjCisjIGxpYnRvb2wgYXNzdW1lcyB0aGF0IHRoZSBjb21waWxlciBjYW4gaGFuZGxlIHRoZSAtZlBJQyBmbGFnCisjIFRoaXMgaXNuJ3QgYWx3YXlzIHRydWUgKGZvciBleGFtcGxlLCBuYXNtIGNhbid0IGhhbmRsZSBpdCkKK2NvbW1hbmQ9IiIKK3doaWxlIFsgJCMgLWd0IDAgXTsgZG8KKyAgICBjYXNlICIkMSIgaW4KKyAgICAgICAgLWZQSUMpCisgICAgICAgICAgICAjIElnbm9yZSAtZlBJQyBvcHRpb24KKyAgICAgICAgICAgIDs7CisgICAgICAgIC1mbm8tY29tbW9uKQorICAgICAgICAgICAgIyBJZ25vcmUgLWZQSUMgYW5kIC1EUElDIG9wdGlvbnMKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBjb21tYW5kPSIkY29tbWFuZCAkMSIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICAgIHNoaWZ0Citkb25lCitlY2hvICRjb21tYW5kCitleGVjICRjb21tYW5kCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvY29uZmlndXJlLmluIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGM4ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDI5NjUgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorQUNfSU5JVChSRUFETUUpCitBQ19DT05GSUdfSEVBREVSKGluY2x1ZGUvU0RMX2NvbmZpZy5oKQorQUNfR05VX1NPVVJDRQorQUNfQ09ORklHX0FVWF9ESVJTKCRzcmNkaXIvYnVpbGQtc2NyaXB0cykKKworZG5sIFNldCB2YXJpb3VzIHZlcnNpb24gc3RyaW5ncyAtIHRha2VuIGdyYXRlZnVsbHkgZnJvbSB0aGUgR1RrIHNvdXJjZXMKKyMKKyMgTWFraW5nIHJlbGVhc2VzOgorIyBFZGl0IGluY2x1ZGUvU0RML1NETF92ZXJzaW9uLmggYW5kIGNoYW5nZSB0aGUgdmVyc2lvbiwgdGhlbjoKKyMgICBTRExfTUlDUk9fVkVSU0lPTiArPSAxOworIyAgIFNETF9JTlRFUkZBQ0VfQUdFICs9IDE7CisjICAgU0RMX0JJTkFSWV9BR0UgKz0gMTsKKyMgaWYgYW55IGZ1bmN0aW9ucyBoYXZlIGJlZW4gYWRkZWQsIHNldCBTRExfSU5URVJGQUNFX0FHRSB0byAwLgorIyBpZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBoYXMgYmVlbiBicm9rZW4sCisjIHNldCBTRExfQklOQVJZX0FHRSBhbmQgU0RMX0lOVEVSRkFDRV9BR0UgdG8gMC4KKyMKK1NETF9NQUpPUl9WRVJTSU9OPTEKK1NETF9NSU5PUl9WRVJTSU9OPTIKK1NETF9NSUNST19WRVJTSU9OPTE1CitTRExfSU5URVJGQUNFX0FHRT00CitTRExfQklOQVJZX0FHRT0xNQorU0RMX1ZFUlNJT049JFNETF9NQUpPUl9WRVJTSU9OLiRTRExfTUlOT1JfVkVSU0lPTi4kU0RMX01JQ1JPX1ZFUlNJT04KKworQUNfU1VCU1QoU0RMX01BSk9SX1ZFUlNJT04pCitBQ19TVUJTVChTRExfTUlOT1JfVkVSU0lPTikKK0FDX1NVQlNUKFNETF9NSUNST19WRVJTSU9OKQorQUNfU1VCU1QoU0RMX0lOVEVSRkFDRV9BR0UpCitBQ19TVUJTVChTRExfQklOQVJZX0FHRSkKK0FDX1NVQlNUKFNETF9WRVJTSU9OKQorCisjIGxpYnRvb2wgdmVyc2lvbmluZworTFRfSU5JVChbd2luMzItZGxsXSkKKworTFRfUkVMRUFTRT0kU0RMX01BSk9SX1ZFUlNJT04uJFNETF9NSU5PUl9WRVJTSU9OCitMVF9DVVJSRU5UPWBleHByICRTRExfTUlDUk9fVkVSU0lPTiAtICRTRExfSU5URVJGQUNFX0FHRWAKK0xUX1JFVklTSU9OPSRTRExfSU5URVJGQUNFX0FHRQorTFRfQUdFPWBleHByICRTRExfQklOQVJZX0FHRSAtICRTRExfSU5URVJGQUNFX0FHRWAKK200X3BhdHRlcm5fYWxsb3coW15MVF9dKQorCitBQ19TVUJTVChMVF9SRUxFQVNFKQorQUNfU1VCU1QoTFRfQ1VSUkVOVCkKK0FDX1NVQlNUKExUX1JFVklTSU9OKQorQUNfU1VCU1QoTFRfQUdFKQorCitkbmwgRGV0ZWN0IHRoZSBjYW5vbmljYWwgYnVpbGQgYW5kIGhvc3QgZW52aXJvbm1lbnRzCitBQ19DT05GSUdfQVVYX0RJUihbYnVpbGQtc2NyaXB0c10pCitkbmwgQUNfQ0FOT05JQ0FMX0hPU1QKK0FDX0NfQklHRU5ESUFOCitpZiB0ZXN0IHgkYWNfY3ZfY19iaWdlbmRpYW4gPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKFNETF9CWVRFT1JERVIsIDQzMjEpCitlbHNlCisgICAgQUNfREVGSU5FKFNETF9CWVRFT1JERVIsIDEyMzQpCitmaQorCitkbmwgQ2hlY2sgZm9yIHRvb2xzCitBQ19QUk9HX0xJQlRPT0wKK0FDX1BST0dfQ0MKK0FDX1BST0dfQ1hYCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfTUFLRV9TRVQKK0FDX0NIRUNLX1RPT0woV0lORFJFUywgW3dpbmRyZXNdLCBbOl0pCisKK2RubCBTZXQgdXAgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIgZmxhZ3MKK0lOQ0xVREU9Ii1JJHNyY2Rpci9pbmNsdWRlIgoraWYgdGVzdCB4JHNyY2RpciAhPSB4LjsgdGhlbgorICAgICMgUmVtb3ZlIFNETF9jb25maWcuaCBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBzaW5jZSBpdCdzIHRoZQorICAgICMgZGVmYXVsdCBvbmUsIGFuZCB3ZSB3YW50IHRvIGluY2x1ZGUgdGhlIG9uZSB0aGF0IHdlIGdlbmVyYXRlLgorICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9pbmNsdWRlL1NETF9jb25maWcuaDsgdGhlbgorICAgICAgICBybSAkc3JjZGlyL2luY2x1ZGUvU0RMX2NvbmZpZy5oCisgICAgZmkKKyAgICBJTkNMVURFPSItSWluY2x1ZGUgJElOQ0xVREUiCitmaQorY2FzZSAiJGhvc3QiIGluCisgICAgKi0qLWN5Z3dpbiopCisgICAgICAgICMgV2UgYnVpbGQgU0RMIG9uIGN5Z3dpbiB3aXRob3V0IHRoZSBVTklYIGVtdWxhdGlvbiBsYXllcgorICAgICAgICBCQVNFX0NGTEFHUz0iLUkvdXNyL2luY2x1ZGUvbWluZ3cgLW1uby1jeWd3aW4iCisgICAgICAgIEJBU0VfTERGTEFHUz0iLW1uby1jeWd3aW4iCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgQkFTRV9DRkxBR1M9Ii1EX0dOVV9TT1VSQ0U9MSIKKyAgICAgICAgQkFTRV9MREZMQUdTPSIiCisgICAgICAgIDs7Citlc2FjCitCVUlMRF9DRkxBR1M9IiRDRkxBR1MgJENQUEZMQUdTIgorRVhUUkFfQ0ZMQUdTPSIkSU5DTFVERSAkQkFTRV9DRkxBR1MiCitCVUlMRF9MREZMQUdTPSIkTERGTEFHUyIKK0VYVFJBX0xERkxBR1M9IiRCQVNFX0xERkxBR1MiCisjIyBUaGVzZSBhcmUgY29tbW9uIGRpcmVjdG9yaWVzIHRvIGZpbmQgc29mdHdhcmUgcGFja2FnZXMKKyNmb3IgcGF0aCBpbiAvdXNyL2ZyZWV3YXJlIC91c3IvcGtnIC91c3IvWDExUjYgL3Vzci9sb2NhbDsgZG8KKyMgICAgaWYgdGVzdCAtZCAkcGF0aC9pbmNsdWRlOyB0aGVuCisjICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgLUkkcGF0aC9pbmNsdWRlIgorIyAgICBmaQorIyAgICBpZiB0ZXN0IC1kICRwYXRoL2xpYjsgdGhlbgorIyAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLUwkcGF0aC9saWIiCisjICAgIGZpCisjZG9uZQorU0RMX0NGTEFHUz0iJEJBU0VfQ0ZMQUdTIgorU0RMX0xJQlM9Ii1sU0RMICRCQVNFX0xERkxBR1MiCitDUFBGTEFHUz0iJENQUEZMQUdTICRFWFRSQV9DRkxBR1MiCitDRkxBR1M9IiRDRkxBR1MgJEVYVFJBX0NGTEFHUyIKK0xERkxBR1M9IiRMREZMQUdTICRFWFRSQV9MREZMQUdTIgorCitkbmwgc2V0IHRoaXMgdG8gdXNlIG9uIHN5c3RlbXMgdGhhdCB1c2UgbGliNjQgaW5zdGVhZCBvZiBsaWIKK2Jhc2VfbGliZGlyPWBlY2hvIFwke2xpYmRpcn0gfCBzZWQgJ3MvLipcL1woLipcKS9cMS87IHEnYAorCitkbmwgRnVuY3Rpb24gdG8gZmluZCBhIGxpYnJhcnkgaW4gdGhlIGNvbXBpbGVyIHNlYXJjaCBwYXRoCitmaW5kX2xpYigpCit7CisgICAgZ2NjX2Jpbl9wYXRoPVtgJENDIC1wcmludC1zZWFyY2gtZGlycyAyPi9kZXYvbnVsbCB8IGZncmVwIHByb2dyYW1zOiB8IHNlZCAncy9bXj1dKj1cKC4qXCkvXDEvJyB8IHNlZCAncy86LyAvZydgXQorICAgIGdjY19saWJfcGF0aD1bYCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgMj4vZGV2L251bGwgfCBmZ3JlcCBsaWJyYXJpZXM6IHwgc2VkICdzL1tePV0qPVwoLipcKS9cMS8nIHwgc2VkICdzLzovIC9nJ2BdCisgICAgZW52X2xpYl9wYXRoPVtgZWNobyAkTElCUyAkTERGTEFHUyAkKiB8IHNlZCAncy8tTFsgXSovL2cnYF0KKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgICAgICBob3N0X2xpYl9wYXRoPSIiCisgICAgZWxzZQorICAgICAgICBob3N0X2xpYl9wYXRoPSIvdXNyLyRiYXNlX2xpYmRpciAvdXNyL2xvY2FsLyRiYXNlX2xpYmRpciIKKyAgICBmaQorICAgIGZvciBwYXRoIGluICRnY2NfYmluX3BhdGggJGdjY19saWJfcGF0aCAkZW52X2xpYl9wYXRoICRob3N0X2xpYl9wYXRoOyBkbworICAgICAgICBsaWI9W2BscyAtLSAkcGF0aC8kMSAyPi9kZXYvbnVsbCB8IHNvcnQgfCBzZWQgJ3MvLipcL1woLipcKS9cMS87IHEnYF0KKyAgICAgICAgaWYgdGVzdCB4JGxpYiAhPSB4OyB0aGVuCisgICAgICAgICAgICBlY2hvICRsaWIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmaQorICAgIGRvbmUKK30KKworZG5sIENoZWNrIGZvciBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MKK0FDX0NfQ09OU1QKK0FDX0NfSU5MSU5FCitBQ19DX1ZPTEFUSUxFCisKK2RubCBTZWUgd2hldGhlciB3ZSBhcmUgYWxsb3dlZCB0byB1c2UgdGhlIHN5c3RlbSBDIGxpYnJhcnkKK0FDX0FSR19FTkFCTEUobGliYywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJjXSwgW1VzZSB0aGUgc3lzdGVtIEMgbGlicmFyeSBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgLCBlbmFibGVfbGliYz15ZXMpCitpZiB0ZXN0IHgkZW5hYmxlX2xpYmMgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfTElCQykKKworICAgIGRubCBDaGVjayBmb3IgQyBsaWJyYXJ5IGhlYWRlcnMKKyAgICBBQ19IRUFERVJfU1REQworICAgIEFDX0NIRUNLX0hFQURFUlMoc3lzL3R5cGVzLmggc3RkaW8uaCBzdGRsaWIuaCBzdGRkZWYuaCBzdGRhcmcuaCBtYWxsb2MuaCBtZW1vcnkuaCBzdHJpbmcuaCBzdHJpbmdzLmggaW50dHlwZXMuaCBzdGRpbnQuaCBjdHlwZS5oIG1hdGguaCBpY29udi5oIHNpZ25hbC5oKQorCisgICAgZG5sIENoZWNrIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgZXRjLgorICAgIEFDX1RZUEVfU0laRV9UCisgICAgaWYgdGVzdCB4JGFjX2N2X2hlYWRlcl9pbnR0eXBlc19oID0geHllcyAtbyB4JGFjX2N2X2hlYWRlcl9zdGRpbnRfaCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfQ0hFQ0tfVFlQRShpbnQ2NF90KQorICAgICAgICBpZiB0ZXN0IHgkYWNfY3ZfdHlwZV9pbnQ2NF90ID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9IQVNfNjRCSVRfVFlQRSkKKyAgICAgICAgZmkKKyAgICAgICAgaGF2ZV9pbnR0eXBlcz15ZXMKKyAgICBmaQorCisgICAgZG5sIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCisgICAgY2FzZSAiJGhvc3QiIGluCisgICAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3czMiopCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgQUNfRlVOQ19BTExPQ0EKKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBBQ19GVU5DX01FTUNNUAorICAgIGlmIHRlc3QgeCRhY19jdl9mdW5jX21lbWNtcF93b3JraW5nID0geHllczsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoSEFWRV9NRU1DTVApCisgICAgZmkKKyAgICBBQ19GVU5DX1NUUlRPRAorICAgIGlmIHRlc3QgeCRhY19jdl9mdW5jX3N0cnRvZCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKEhBVkVfU1RSVE9EKQorICAgIGZpCisgICAgQUNfQ0hFQ0tfRlVOQyhtcHJvdGVjdCwKKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgICAgICAgICAjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyAgICAgICAgXSxbCisgICAgICAgIF0sWworICAgICAgICBBQ19ERUZJTkUoSEFWRV9NUFJPVEVDVCkKKyAgICAgICAgXSksCisgICAgKQorICAgIEFDX0NIRUNLX0ZVTkNTKG1hbGxvYyBjYWxsb2MgcmVhbGxvYyBmcmVlIGdldGVudiBwdXRlbnYgdW5zZXRlbnYgcXNvcnQgYWJzIGJjb3B5IG1lbXNldCBtZW1jcHkgbWVtbW92ZSBzdHJsZW4gc3RybGNweSBzdHJsY2F0IHN0cmR1cCBfc3RycmV2IF9zdHJ1cHIgX3N0cmx3ciBzdHJjaHIgc3RycmNociBzdHJzdHIgaXRvYSBfbHRvYSBfdWl0b2EgX3VsdG9hIHN0cnRvbCBzdHJ0b3VsIF9pNjR0b2EgX3VpNjR0b2Egc3RydG9sbCBzdHJ0b3VsbCBhdG9pIGF0b2Ygc3RyY21wIHN0cm5jbXAgX3N0cmljbXAgc3RyY2FzZWNtcCBfc3RybmljbXAgc3RybmNhc2VjbXAgc3NjYW5mIHNucHJpbnRmIHZzbnByaW50ZiBpY29udiBzaWdhY3Rpb24gc2V0am1wIG5hbm9zbGVlcCkKKworICAgIEFDX0NIRUNLX0xJQihpY29udiwgbGliaWNvbnZfb3BlbiwgW0VYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1saWNvbnYiXSkKKyAgICBBQ19DSEVDS19MSUIobSwgcG93LCBbRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLWxtIl0pCisKKyAgICBBQ19DSEVDS19NRU1CRVIoc3RydWN0IHNpZ2FjdGlvbi5zYV9zaWdhY3Rpb24sW0FDX0RFRklORShIQVZFX1NBX1NJR0FDVElPTildLCAsWyNpbmNsdWRlIDxzaWduYWwuaD5dKQorZmkKKworaWYgdGVzdCB4JGhhdmVfaW50dHlwZXMgIT0geHllczsgdGhlbgorICAgIEFDX0NIRUNLX1NJWkVPRihjaGFyLCAxKQorICAgIEFDX0NIRUNLX1NJWkVPRihzaG9ydCwgMikKKyAgICBBQ19DSEVDS19TSVpFT0YoaW50LCA0KQorICAgIEFDX0NIRUNLX1NJWkVPRihsb25nLCA0KQorICAgIEFDX0NIRUNLX1NJWkVPRihsb25nIGxvbmcsIDgpCisgICAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9jaGFyID0geDE7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKGludDhfdCwgc2lnbmVkIGNoYXIpCisgICAgICAgIEFDX0RFRklORSh1aW50OF90LCB1bnNpZ25lZCBjaGFyKQorICAgIGZpCisgICAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9zaG9ydCA9IHgyOyB0aGVuCisgICAgICAgIEFDX0RFRklORShpbnQxNl90LCBzaWduZWQgc2hvcnQpCisgICAgICAgIEFDX0RFRklORSh1aW50MTZfdCwgdW5zaWduZWQgc2hvcnQpCisgICAgZWxzZQorICAgICAgICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2ludCA9IHgyOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoaW50MTZfdCwgc2lnbmVkIGludCkKKyAgICAgICAgICAgIEFDX0RFRklORSh1aW50MTZfdCwgdW5zaWduZWQgaW50KQorICAgICAgICBmaQorICAgIGZpCisgICAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9pbnQgPSB4NDsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoaW50MzJfdCwgc2lnbmVkIGludCkKKyAgICAgICAgQUNfREVGSU5FKHVpbnQzMl90LCB1bnNpZ25lZCBpbnQpCisgICAgZWxzZQorICAgICAgICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2xvbmcgPSB4NDsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKGludDMyX3QsIHNpZ25lZCBsb25nKQorICAgICAgICAgICAgQUNfREVGSU5FKHVpbnQzMl90LCB1bnNpZ25lZCBsb25nKQorICAgICAgICBmaQorICAgIGZpCisgICAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl9sb25nID0geDg7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKGludDY0X3QsIHNpZ25lZCBsb25nKQorICAgICAgICBBQ19ERUZJTkUodWludDY0X3QsIHVuc2lnbmVkIGxvbmcpCisgICAgICAgIEFDX0RFRklORShTRExfSEFTXzY0QklUX1RZUEUpCisgICAgZWxzZQorICAgICAgICBpZiB0ZXN0IHgkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyA9IHg4OyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoaW50NjRfdCwgc2lnbmVkIGxvbmcgbG9uZykKKyAgICAgICAgICAgIEFDX0RFRklORSh1aW50NjRfdCwgdW5zaWduZWQgbG9uZyBsb25nKQorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9IQVNfNjRCSVRfVFlQRSkKKyAgICAgICAgZmkKKyAgICBmaQorICAgIEFDX0RFRklORShzaXplX3QsIHVuc2lnbmVkIGludCkKKyAgICBBQ19ERUZJTkUodWludHB0cl90LCB1bnNpZ25lZCBsb25nKQorZmkKKworIyBTdGFuZGFyZCBDIHNvdXJjZXMKK1NPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjLyouYyIKK1NPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2F1ZGlvLyouYyIKK1NPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2Nkcm9tLyouYyIKK1NPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2NwdWluZm8vKi5jIgorU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvZXZlbnRzLyouYyIKK1NPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2ZpbGUvKi5jIgorU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvc3RkbGliLyouYyIKK1NPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RocmVhZC8qLmMiCitTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aW1lci8qLmMiCitTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby8qLmMiCisKK2RubCBFbmFibGUvZGlzYWJsZSB2YXJpb3VzIHN1YnN5c3RlbXMgb2YgdGhlIFNETCBsaWJyYXJ5CisKK0FDX0FSR19FTkFCTEUoYXVkaW8sCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtYXVkaW9dLCBbRW5hYmxlIHRoZSBhdWRpbyBzdWJzeXN0ZW0gW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICwgZW5hYmxlX2F1ZGlvPXllcykKK2lmIHRlc3QgeCRlbmFibGVfYXVkaW8gIT0geHllczsgdGhlbgorICAgIEFDX0RFRklORShTRExfQVVESU9fRElTQUJMRUQpCitmaQorQUNfQVJHX0VOQUJMRSh2aWRlbywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12aWRlb10sIFtFbmFibGUgdGhlIHZpZGVvIHN1YnN5c3RlbSBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW89eWVzKQoraWYgdGVzdCB4JGVuYWJsZV92aWRlbyAhPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKFNETF9WSURFT19ESVNBQkxFRCkKK2ZpCitBQ19BUkdfRU5BQkxFKGV2ZW50cywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1ldmVudHNdLCBbRW5hYmxlIHRoZSBldmVudHMgc3Vic3lzdGVtIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAsIGVuYWJsZV9ldmVudHM9eWVzKQoraWYgdGVzdCB4JGVuYWJsZV9ldmVudHMgIT0geHllczsgdGhlbgorICAgIEFDX0RFRklORShTRExfRVZFTlRTX0RJU0FCTEVEKQorZmkKK0FDX0FSR19FTkFCTEUoam95c3RpY2ssCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtam95c3RpY2tdLCBbRW5hYmxlIHRoZSBqb3lzdGljayBzdWJzeXN0ZW0gW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICwgZW5hYmxlX2pveXN0aWNrPXllcykKK2lmIHRlc3QgeCRlbmFibGVfam95c3RpY2sgIT0geHllczsgdGhlbgorICAgIEFDX0RFRklORShTRExfSk9ZU1RJQ0tfRElTQUJMRUQpCitlbHNlCisgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvam95c3RpY2svKi5jIgorZmkKK0FDX0FSR19FTkFCTEUoY2Ryb20sCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtY2Ryb21dLCBbRW5hYmxlIHRoZSBjZHJvbSBzdWJzeXN0ZW0gW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICwgZW5hYmxlX2Nkcm9tPXllcykKK2lmIHRlc3QgeCRlbmFibGVfY2Ryb20gIT0geHllczsgdGhlbgorICAgIEFDX0RFRklORShTRExfQ0RST01fRElTQUJMRUQpCitmaQorQUNfQVJHX0VOQUJMRSh0aHJlYWRzLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRocmVhZHNdLCBbRW5hYmxlIHRoZSB0aHJlYWRpbmcgc3Vic3lzdGVtIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAsIGVuYWJsZV90aHJlYWRzPXllcykKK2lmIHRlc3QgeCRlbmFibGVfdGhyZWFkcyAhPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKFNETF9USFJFQURTX0RJU0FCTEVEKQorZmkKK0FDX0FSR19FTkFCTEUodGltZXJzLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRpbWVyc10sIFtFbmFibGUgdGhlIHRpbWVyIHN1YnN5c3RlbSBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgLCBlbmFibGVfdGltZXJzPXllcykKK2lmIHRlc3QgeCRlbmFibGVfdGltZXJzICE9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoU0RMX1RJTUVSU19ESVNBQkxFRCkKK2ZpCitBQ19BUkdfRU5BQkxFKGZpbGUsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZmlsZV0sIFtFbmFibGUgdGhlIGZpbGUgc3Vic3lzdGVtIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAsIGVuYWJsZV9maWxlPXllcykKK2lmIHRlc3QgeCRlbmFibGVfZmlsZSAhPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKFNETF9GSUxFX0RJU0FCTEVEKQorZmkKK0FDX0FSR19FTkFCTEUobG9hZHNvLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxvYWRzb10sIFtFbmFibGUgdGhlIHNoYXJlZCBvYmplY3QgbG9hZGluZyBzdWJzeXN0ZW0gW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICwgZW5hYmxlX2xvYWRzbz15ZXMpCitpZiB0ZXN0IHgkZW5hYmxlX2xvYWRzbyAhPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKFNETF9MT0FEU09fRElTQUJMRUQpCitmaQorQUNfQVJHX0VOQUJMRShjcHVpbmZvLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNwdWluZm9dLCBbRW5hYmxlIHRoZSBjcHVpbmZvIHN1YnN5c3RlbSBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgLCBlbmFibGVfY3B1aW5mbz15ZXMpCitpZiB0ZXN0IHgkZW5hYmxlX2NwdWluZm8gIT0geHllczsgdGhlbgorICAgIEFDX0RFRklORShTRExfQ1BVSU5GT19ESVNBQkxFRCkKK2ZpCitBQ19BUkdfRU5BQkxFKGFzc2VtYmx5LAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFzc2VtYmx5XSwgW0VuYWJsZSBhc3NlbWJseSByb3V0aW5lcyBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgLCBlbmFibGVfYXNzZW1ibHk9eWVzKQoraWYgdGVzdCB4JGVuYWJsZV9hc3NlbWJseSA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQorZmkKKworZG5sIFNlZSBpZiB0aGUgT1NTIGF1ZGlvIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQKK0NoZWNrT1NTKCkKK3sKKyAgICBBQ19BUkdfRU5BQkxFKG9zcywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1vc3NdLCBbc3VwcG9ydCB0aGUgT1NTIGF1ZGlvIEFQSSBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX29zcz15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV9hdWRpbyA9IHh5ZXMgLWEgeCRlbmFibGVfb3NzID0geHllczsgdGhlbgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIE9TUyBhdWRpbyBzdXBwb3J0KQorICAgICAgICBoYXZlX29zcz1ubworICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9vc3MgIT0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgICAgICAjaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorICAgICAgICAgICAgXSxbCisgICAgICAgICAgICAgIGludCBhcmcgPSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOworICAgICAgICAgICAgXSxbCisgICAgICAgICAgICBoYXZlX29zcz15ZXMKKyAgICAgICAgICAgIF0pCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX29zcyAhPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgICAgICNpbmNsdWRlIDxzb3VuZGNhcmQuaD4KKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICBpbnQgYXJnID0gU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDsKKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgaGF2ZV9vc3M9eWVzCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0FVRElPX0RSSVZFUl9PU1NfU09VTkRDQVJEX0gpCisgICAgICAgICAgICBdKQorICAgICAgICBmaQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRoYXZlX29zcykKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfb3NzID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9BVURJT19EUklWRVJfT1NTKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvYXVkaW8vZHNwLyouYyIKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2F1ZGlvL2RtYS8qLmMiCisgICAgICAgICAgICBoYXZlX2F1ZGlvPXllcworCisgICAgICAgICAgICAjIFdlIG1heSBuZWVkIHRvIGxpbmsgd2l0aCBvc3NhdWRpbyBlbXVsYXRpb24gbGlicmFyeQorICAgICAgICAgICAgY2FzZSAiJGhvc3QiIGluCisgICAgICAgICAgICAgICAgKi0qLW9wZW5ic2QqfCotKi1uZXRic2QqKQorICAgICAgICAgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtbG9zc2F1ZGlvIjs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIFNlZSBpZiB0aGUgQUxTQSBhdWRpbyBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkCitDaGVja0FMU0EoKQoreworICAgIEFDX0FSR19FTkFCTEUoYWxzYSwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hbHNhXSwgW3N1cHBvcnQgdGhlIEFMU0EgYXVkaW8gQVBJIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfYWxzYT15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV9hdWRpbyA9IHh5ZXMgLWEgeCRlbmFibGVfYWxzYSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQU1fUEFUSF9BTFNBKDAuOS4wLCBoYXZlX2Fsc2E9eWVzLCBoYXZlX2Fsc2E9bm8pCisgICAgICAgICMgUmVzdG9yZSBhbGwgZmxhZ3MgZnJvbSBiZWZvcmUgdGhlIEFMU0EgZGV0ZWN0aW9uIHJ1bnMKKyAgICAgICAgQ0ZMQUdTPSIkYWxzYV9zYXZlX0NGTEFHUyIKKyAgICAgICAgTERGTEFHUz0iJGFsc2Ffc2F2ZV9MREZMQUdTIgorICAgICAgICBMSUJTPSIkYWxzYV9zYXZlX0xJQlMiCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX2Fsc2EgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19BUkdfRU5BQkxFKGFsc2Etc2hhcmVkLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFsc2Etc2hhcmVkXSwgW2R5bmFtaWNhbGx5IGxvYWQgQUxTQSBhdWRpbyBzdXBwb3J0IFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAsIGVuYWJsZV9hbHNhX3NoYXJlZD15ZXMpCisgICAgICAgICAgICBhbHNhX2xpYj1bYGZpbmRfbGliICJsaWJhc291bmQuc28uKiIgIiRBTFNBX0xJQlMiIHwgc2VkICdzLy4qXC9cKC4qXCkvXDEvOyBxJ2BdCisKKyAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX0FMU0EpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby9hbHNhLyouYyIKKyAgICAgICAgICAgIEVYVFJBX0NGTEFHUz0iJEVYVFJBX0NGTEFHUyAkQUxTQV9DRkxBR1MiCisgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9sb2Fkc28gIT0geHllcyAmJiBcCisgICAgICAgICAgICAgICB0ZXN0IHgkZW5hYmxlX2Fsc2Ffc2hhcmVkID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19XQVJOKFtZb3UgbXVzdCBoYXZlIFNETF9Mb2FkT2JqZWN0KCkgc3VwcG9ydCBmb3IgZHluYW1pYyBBTFNBIGxvYWRpbmddKQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGlmIHRlc3QgeCRoYXZlX2xvYWRzbyA9IHh5ZXMgJiYgXAorICAgICAgICAgICAgICAgdGVzdCB4JGVuYWJsZV9hbHNhX3NoYXJlZCA9IHh5ZXMgJiYgdGVzdCB4JGFsc2FfbGliICE9IHg7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICItLSBkeW5hbWljIGxpYmFzb3VuZCAtPiAkYWxzYV9saWIiCisgICAgICAgICAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFNETF9BVURJT19EUklWRVJfQUxTQV9EWU5BTUlDLCAiJGFsc2FfbGliIikKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAkQUxTQV9MSUJTIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGhhdmVfYXVkaW89eWVzCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIENoZWNrIHdoZXRoZXIgd2Ugd2FudCB0byB1c2UgSVJJWCA2LjUrIG5hdGl2ZSBhdWRpbyBvciBub3QKK0NoZWNrRE1FRElBKCkKK3sKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2F1ZGlvID0geHllczsgdGhlbgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGRtZWRpYSBhdWRpbyBzdXBwb3J0KQorICAgICAgICBoYXZlX2RtZWRpYT1ubworICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgI2luY2x1ZGUgPGRtZWRpYS9hdWRpby5oPgorICAgICAgICBdLFsKKyAgICAgICAgICBBTHBvcnQgYXVkaW9fcG9ydDsKKyAgICAgICAgXSxbCisgICAgICAgIGhhdmVfZG1lZGlhPXllcworICAgICAgICBdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRoYXZlX2RtZWRpYSkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSBhdWRpbyBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRoYXZlX2RtZWRpYSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX0RNRURJQSkKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2F1ZGlvL2RtZWRpYS8qLmMiCisgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtbGF1ZGlvIgorICAgICAgICAgICAgaGF2ZV9hdWRpbz15ZXMKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgQ2hlY2sgd2hldGhlciB3ZSB3YW50IHRvIHVzZSBUcnU2NCBVTklYIG5hdGl2ZSBhdWRpbyBvciBub3QKK0NoZWNrTU1FKCkKK3sKKyAgICBkbmwgTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIG9uIGFuIFRydTY0IFVOSVgKKyAgICBjYXNlICRBUkNIIGluCisgICAgICAgIG9zZikKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgeCRlbmFibGVfYXVkaW8gPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgTU1FIGF1ZGlvIHN1cHBvcnQpCisgICAgICAgIE1NRV9DRkxBR1M9Ii1JL3Vzci9pbmNsdWRlL21tZSIKKyAgICAgICAgTU1FX0xJQlM9Ii1sbW1lIgorICAgICAgICBoYXZlX21tZT1ubworICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRNTUVfQ0ZMQUdTIgorICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgI2luY2x1ZGUgPG1tZV9hcGkuaD4KKyAgICAgICAgXSxbCisgICAgICAgICAgSFdBVkVPVVQgc291bmQ7CisgICAgICAgIF0sWworICAgICAgICBoYXZlX21tZT15ZXMKKyAgICAgICAgXSkKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgICAgICAgIEFDX01TR19SRVNVTFQoJGhhdmVfbW1lKQorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIGF1ZGlvIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfbW1lID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9BVURJT19EUklWRVJfTU1FQVVESU8pCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby9tbWUvKi5jIgorICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTICRNTUVfQ0ZMQUdTIgorICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgJE1NRV9MSUJTIgorICAgICAgICAgICAgaGF2ZV9hdWRpbz15ZXMKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgRmluZCB0aGUgRVNEIGluY2x1ZGVzIGFuZCBsaWJyYXJpZXMKK0NoZWNrRVNEKCkKK3sKKyAgICBBQ19BUkdfRU5BQkxFKGVzZCwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1lc2RdLCBbc3VwcG9ydCB0aGUgRW5saWdodGVuZWQgU291bmQgRGFlbW9uIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfZXNkPXllcykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2F1ZGlvID0geHllcyAtYSB4JGVuYWJsZV9lc2QgPSB4eWVzOyB0aGVuCisgICAgICAgIEFNX1BBVEhfRVNEKDAuMi44LCBoYXZlX2VzZD15ZXMsIGhhdmVfZXNkPW5vKQorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9lc2QgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19BUkdfRU5BQkxFKGVzZC1zaGFyZWQsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZXNkLXNoYXJlZF0sIFtkeW5hbWljYWxseSBsb2FkIEVTRCBhdWRpbyBzdXBwb3J0IFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAsIGVuYWJsZV9lc2Rfc2hhcmVkPXllcykKKyAgICAgICAgICAgIGVzZF9saWI9W2BmaW5kX2xpYiAibGliZXNkLnNvLioiICIkRVNEX0xJQlMiIHwgc2VkICdzLy4qXC9cKC4qXCkvXDEvOyBxJ2BdCisKKyAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX0VTRCkKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2F1ZGlvL2VzZC8qLmMiCisgICAgICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgJEVTRF9DRkxBR1MiCisgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9sb2Fkc28gIT0geHllcyAmJiBcCisgICAgICAgICAgICAgICB0ZXN0IHgkZW5hYmxlX2VzZF9zaGFyZWQgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW1lvdSBtdXN0IGhhdmUgU0RMX0xvYWRPYmplY3QoKSBzdXBwb3J0IGZvciBkeW5hbWljIEVTRCBsb2FkaW5nXSkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9sb2Fkc28gPSB4eWVzICYmIFwKKyAgICAgICAgICAgICAgIHRlc3QgeCRlbmFibGVfZXNkX3NoYXJlZCA9IHh5ZXMgJiYgdGVzdCB4JGVzZF9saWIgIT0geDsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIi0tIGR5bmFtaWMgbGliZXNkIC0+ICRlc2RfbGliIgorICAgICAgICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChTRExfQVVESU9fRFJJVkVSX0VTRF9EWU5BTUlDLCAiJGVzZF9saWIiKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTICRFU0RfTElCUyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBoYXZlX2F1ZGlvPXllcworICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBGaW5kIFB1bHNlQXVkaW8KK0NoZWNrUHVsc2VBdWRpbygpCit7CisgICAgQUNfQVJHX0VOQUJMRShwdWxzZWF1ZGlvLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXB1bHNlYXVkaW9dLCBbdXNlIFB1bHNlQXVkaW8gW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV9wdWxzZWF1ZGlvPXllcykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2F1ZGlvID0geHllcyAtYSB4JGVuYWJsZV9wdWxzZWF1ZGlvID0geHllczsgdGhlbgorICAgICAgICBhdWRpb19wdWxzZT1ubworCisgICAgICAgIFBVTFNFX1JFUVVJUkVEX1ZFUlNJT049MC45CisKKyAgICAgICAgQUNfUEFUSF9QUk9HKFBLR19DT05GSUcsIHBrZy1jb25maWcsIG5vKQorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFB1bHNlQXVkaW8gJFBVTFNFX1JFUVVJUkVEX1ZFUlNJT04gc3VwcG9ydCkKKyAgICAgICAgaWYgdGVzdCB4JFBLR19DT05GSUcgIT0geG5vOyB0aGVuCisgICAgICAgICAgICBpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC43ICYmICRQS0dfQ09ORklHIC0tYXRsZWFzdC12ZXJzaW9uICRQVUxTRV9SRVFVSVJFRF9WRVJTSU9OIGxpYnB1bHNlLXNpbXBsZTsgdGhlbgorICAgICAgICAgICAgICAgIFBVTFNFX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgbGlicHVsc2Utc2ltcGxlYAorICAgICAgICAgICAgICAgIFBVTFNFX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyBsaWJwdWxzZS1zaW1wbGVgCisgICAgICAgICAgICAgICAgYXVkaW9fcHVsc2U9eWVzCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRhdWRpb19wdWxzZSkKKworICAgICAgICBpZiB0ZXN0IHgkYXVkaW9fcHVsc2UgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19BUkdfRU5BQkxFKHB1bHNlYXVkaW8tc2hhcmVkLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXB1bHNlYXVkaW8tc2hhcmVkXSwgW2R5bmFtaWNhbGx5IGxvYWQgUHVsc2VBdWRpbyBzdXBwb3J0IFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAsIGVuYWJsZV9wdWxzZWF1ZGlvX3NoYXJlZD15ZXMpCisgICAgICAgICAgICBwdWxzZV9saWI9W2BmaW5kX2xpYiAibGlicHVsc2Utc2ltcGxlLnNvLioiICIkUFVMU0VfTElCUyIgfCBzZWQgJ3MvLipcL1woLipcKS9cMS87IHEnYF0KKworICAgICAgICAgICAgQUNfREVGSU5FKFNETF9BVURJT19EUklWRVJfUFVMU0UpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby9wdWxzZS8qLmMiCisgICAgICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgJFBVTFNFX0NGTEFHUyIKKyAgICAgICAgICAgIGlmIHRlc3QgeCRoYXZlX2xvYWRzbyAhPSB4eWVzICYmIFwKKyAgICAgICAgICAgICAgIHRlc3QgeCRlbmFibGVfcHVsc2VhdWRpb19zaGFyZWQgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW1lvdSBtdXN0IGhhdmUgU0RMX0xvYWRPYmplY3QoKSBzdXBwb3J0IGZvciBkeW5hbWljIFB1bHNlQXVkaW8gbG9hZGluZ10pCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgaWYgdGVzdCB4JGhhdmVfbG9hZHNvID0geHllcyAmJiBcCisgICAgICAgICAgICAgICB0ZXN0IHgkZW5hYmxlX3B1bHNlYXVkaW9fc2hhcmVkID0geHllcyAmJiB0ZXN0IHgkcHVsc2VfbGliICE9IHg7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICItLSBkeW5hbWljIGxpYnB1bHNlLXNpbXBsZSAtPiAkcHVsc2VfbGliIgorICAgICAgICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChTRExfQVVESU9fRFJJVkVSX1BVTFNFX0RZTkFNSUMsICIkcHVsc2VfbGliIikKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAkUFVMU0VfTElCUyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBoYXZlX2F1ZGlvPXllcworICAgICAgICBmaQorICAgIGZpCit9CisKK0NoZWNrQVJUU0MoKQoreworICAgIEFDX0FSR19FTkFCTEUoYXJ0cywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hcnRzXSwgW3N1cHBvcnQgdGhlIEFuYWxvZyBSZWFsIFRpbWUgU3ludGhlc2l6ZXIgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV9hcnRzPXllcykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2F1ZGlvID0geHllcyAtYSB4JGVuYWJsZV9hcnRzID0geHllczsgdGhlbgorICAgICAgICBBQ19QQVRIX1BST0coQVJUU0NPTkZJRywgYXJ0c2MtY29uZmlnKQorICAgICAgICBpZiB0ZXN0IHgkQVJUU0NPTkZJRyA9IHggLW8geCRBUlRTQ09ORklHID0geCciJEFSVFNDT05GSUciJzsgdGhlbgorICAgICAgICAgICAgOiAjIGFydHMgaXNuJ3QgaW5zdGFsbGVkCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFSVFNfQ0ZMQUdTPWAkQVJUU0NPTkZJRyAtLWNmbGFnc2AKKyAgICAgICAgICAgIEFSVFNfTElCUz1gJEFSVFNDT05GSUcgLS1saWJzYAorICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBhUnRzIGRldmVsb3BtZW50IGVudmlyb25tZW50KQorICAgICAgICAgICAgYXVkaW9fYXJ0cz1ubworICAgICAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJEFSVFNfQ0ZMQUdTIgorICAgICAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgICAgICNpbmNsdWRlIDxhcnRzYy5oPgorICAgICAgICAgICAgXSxbCisgICAgICAgICAgICAgYXJ0c19zdHJlYW1fdCBzdHJlYW07CisgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgIGF1ZGlvX2FydHM9eWVzCisgICAgICAgICAgICBdKQorICAgICAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKCRhdWRpb19hcnRzKQorICAgICAgICAgICAgaWYgdGVzdCB4JGF1ZGlvX2FydHMgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfQVJHX0VOQUJMRShhcnRzLXNoYXJlZCwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hcnRzLXNoYXJlZF0sIFtkeW5hbWljYWxseSBsb2FkIGFSdHMgYXVkaW8gc3VwcG9ydCBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZW5hYmxlX2FydHNfc2hhcmVkPXllcykKKyAgICAgICAgICAgICAgICBhcnRzX2xpYj1bYGZpbmRfbGliICJsaWJhcnRzYy5zby4qIiAiJEFSVFNfTElCUyIgfCBzZWQgJ3MvLipcL1woLipcKS9cMS87IHEnYF0KKworICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX0FSVFMpCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvYXVkaW8vYXJ0cy8qLmMiCisgICAgICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTICRBUlRTX0NGTEFHUyIKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9sb2Fkc28gIT0geHllcyAmJiBcCisgICAgICAgICAgICAgICAgICAgdGVzdCB4JGVuYWJsZV9hcnRzX3NoYXJlZCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW1lvdSBtdXN0IGhhdmUgU0RMX0xvYWRPYmplY3QoKSBzdXBwb3J0IGZvciBkeW5hbWljIEFSVFMgbG9hZGluZ10pCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9sb2Fkc28gPSB4eWVzICYmIFwKKyAgICAgICAgICAgICAgICAgICB0ZXN0IHgkZW5hYmxlX2FydHNfc2hhcmVkID0geHllcyAmJiB0ZXN0IHgkYXJ0c19saWIgIT0geDsgdGhlbgorICAgICAgICAgICAgICAgICAgICBlY2hvICItLSBkeW5hbWljIGxpYmFydHNjIC0+ICRhcnRzX2xpYiIKKyAgICAgICAgICAgICAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFNETF9BVURJT19EUklWRVJfQVJUU19EWU5BTUlDLCAiJGFydHNfbGliIikKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTICRBUlRTX0xJQlMiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBoYXZlX2F1ZGlvPXllcworICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgU2VlIGlmIHRoZSBOQVMgYXVkaW8gaW50ZXJmYWNlIGlzIHN1cHBvcnRlZAorQ2hlY2tOQVMoKQoreworICAgIEFDX0FSR19FTkFCTEUobmFzLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW5hc10sIFtzdXBwb3J0IHRoZSBOQVMgYXVkaW8gQVBJIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfbmFzPXllcykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2F1ZGlvID0geHllcyAtYSB4JGVuYWJsZV9uYXMgPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX0NIRUNLX0hFQURFUihhdWRpby9hdWRpb2xpYi5oLCBoYXZlX25hc19oZHI9eWVzKQorICAgICAgICBBQ19DSEVDS19MSUIoYXVkaW8sIEF1T3BlblNlcnZlciwgaGF2ZV9uYXNfbGliPXllcykKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIE5BUyBhdWRpbyBzdXBwb3J0KQorICAgICAgICBoYXZlX25hcz1ubworCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX25hc19oZHIgPSB4eWVzIC1hIHgkaGF2ZV9uYXNfbGliID0geHllczsgdGhlbgorICAgICAgICAgICAgaGF2ZV9uYXM9eWVzCisgICAgICAgICAgICBOQVNfTElCUz0iLWxhdWRpbyIKKworICAgICAgICBlbGlmIHRlc3QgLXIgL3Vzci9YMTFSNi9pbmNsdWRlL2F1ZGlvL2F1ZGlvbGliLmg7IHRoZW4KKyAgICAgICAgICAgIGhhdmVfbmFzPXllcworICAgICAgICAgICAgTkFTX0NGTEFHUz0iLUkvdXNyL1gxMVI2L2luY2x1ZGUvIgorICAgICAgICAgICAgTkFTX0xJQlM9Ii1ML3Vzci9YMTFSNi9saWIgLWxhdWRpbyAtbFh0IgorCisgICAgICAgIGRubCBPbiBJUklYLCB0aGUgTkFTIGluY2x1ZGVzIGFyZSBpbiBhIGRpZmZlcmVudCBkaXJlY3RvcnksCisgICAgICAgIGRubCBhbmQgbGlibmFzIG11c3QgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4KKworICAgICAgICBlbGlmIHRlc3QgLXIgL3Vzci9mcmVld2FyZS9pbmNsdWRlL25hcy9hdWRpb2xpYi5oOyB0aGVuCisgICAgICAgICAgICBoYXZlX25hcz15ZXMKKyAgICAgICAgICAgIE5BU19MSUJTPSItbG5hcyAtbFh0IgorICAgICAgICBmaQorCisgICAgICAgIEFDX01TR19SRVNVTFQoJGhhdmVfbmFzKQorCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX25hcyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0FSR19FTkFCTEUobmFzLXNoYXJlZCwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1uYXMtc2hhcmVkXSwgW2R5bmFtaWNhbGx5IGxvYWQgTkFTIGF1ZGlvIHN1cHBvcnQgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICwgZW5hYmxlX25hc19zaGFyZWQ9eWVzKQorICAgICAgICAgICAgbmFzX2xpYj1bYGZpbmRfbGliICJsaWJhdWRpby5zby4qIiAiJE5BU19MSUJTIiB8IHNlZCAncy8uKlwvXCguKlwpL1wxLzsgcSdgXQorCisgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9sb2Fkc28gIT0geHllcyAmJiBcCisgICAgICAgICAgICAgICB0ZXN0IHgkZW5hYmxlX25hc19zaGFyZWQgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW1lvdSBtdXN0IGhhdmUgU0RMX0xvYWRPYmplY3QoKSBzdXBwb3J0IGZvciBkeW5hbWljIE5BUyBsb2FkaW5nXSkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9sb2Fkc28gPSB4eWVzICYmIFwKKyAgICAgICAgICAgICAgIHRlc3QgeCRlbmFibGVfbmFzX3NoYXJlZCA9IHh5ZXMgJiYgdGVzdCB4JG5hc19saWIgIT0geDsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIi0tIGR5bmFtaWMgbGliYXVkaW8gLT4gJG5hc19saWIiCisgICAgICAgICAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFNETF9BVURJT19EUklWRVJfTkFTX0RZTkFNSUMsICIkbmFzX2xpYiIpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgJE5BU19MSUJTIgorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgQUNfREVGSU5FKFNETF9BVURJT19EUklWRVJfTkFTKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvYXVkaW8vbmFzLyouYyIKKyAgICAgICAgICAgIEVYVFJBX0NGTEFHUz0iJEVYVFJBX0NGTEFHUyAkTkFTX0NGTEFHUyIKKyAgICAgICAgICAgIGhhdmVfYXVkaW89eWVzCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIHJjZzA3MTQyMDAxIFNlZSBpZiB0aGUgdXNlciB3YW50cyB0aGUgZGlzayB3cml0ZXIgYXVkaW8gZHJpdmVyLi4uCitDaGVja0Rpc2tBdWRpbygpCit7CisgICAgQUNfQVJHX0VOQUJMRShkaXNrYXVkaW8sCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZGlza2F1ZGlvXSwgW3N1cHBvcnQgdGhlIGRpc2sgd3JpdGVyIGF1ZGlvIGRyaXZlciBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX2Rpc2thdWRpbz15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV9hdWRpbyA9IHh5ZXMgLWEgeCRlbmFibGVfZGlza2F1ZGlvID0geHllczsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoU0RMX0FVRElPX0RSSVZFUl9ESVNLKQorICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby9kaXNrLyouYyIKKyAgICBmaQorfQorCitkbmwgcmNnMDMxNDIwMDYgU2VlIGlmIHRoZSB1c2VyIHdhbnRzIHRoZSBkdW1teSBhdWRpbyBkcml2ZXIuLi4KK0NoZWNrRHVtbXlBdWRpbygpCit7CisgICAgQUNfQVJHX0VOQUJMRShkdW1teWF1ZGlvLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWR1bW15YXVkaW9dLCBbc3VwcG9ydCB0aGUgZHVtbXkgYXVkaW8gZHJpdmVyIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfZHVtbXlhdWRpbz15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV9hdWRpbyA9IHh5ZXMgLWEgeCRlbmFibGVfZHVtbXlhdWRpbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKFNETF9BVURJT19EUklWRVJfRFVNTVkpCisgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2F1ZGlvL2R1bW15LyouYyIKKyAgICBmaQorfQorCitkbmwgU2V0IHVwIHRoZSBBdGFyaSBBdWRpbyBkcml2ZXIKK0NoZWNrQXRhcmlBdWRpbygpCit7CisgICAgQUNfQVJHX0VOQUJMRShtaW50YXVkaW8sCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtbWludGF1ZGlvXSwgW3N1cHBvcnQgQXRhcmkgYXVkaW8gZHJpdmVyIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfbWludGF1ZGlvPXllcykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2F1ZGlvID0geHllcyAtYSB4JGVuYWJsZV9taW50YXVkaW8gPSB4eWVzOyB0aGVuCisgICAgICAgIG1pbnRhdWRpbz1ubworICAgICAgICBBQ19DSEVDS19IRUFERVIobWludC9mYWxjb24uaCwgaGF2ZV9taW50X2ZhbGNvbl9oZHI9eWVzKQorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9taW50X2ZhbGNvbl9oZHIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBtaW50YXVkaW89eWVzCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0FVRElPX0RSSVZFUl9NSU5UKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvYXVkaW8vbWludC8qLmMiCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby9taW50LyouUyIKKyAgICAgICAgICAgIGhhdmVfYXVkaW89eWVzCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIFNlZSBpZiB3ZSBjYW4gdXNlIHg4NiBhc3NlbWJseSBibGl0dGVycworIyBOQVNNIGlzIGF2YWlsYWJsZSBmcm9tOiBodHRwOi8vbmFzbS5zb3VyY2Vmb3JnZS5uZXQKK0NoZWNrTkFTTSgpCit7CisgICAgZG5sIE1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBvbiBhbiB4ODYgcGxhdGZvcm0KKyAgICBjYXNlICRob3N0IGluCisgICAgICAgIGk/ODYqKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgIyBOb3BlLCBiYWlsIGVhcmx5LgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICA7OworICAgIGVzYWMKKworICAgIGRubCBNYWMgT1MgWCBtaWdodCByZXBvcnQgaXRzZWxmIGFzICJpMzg2IiBidXQgZ2VuZXJhdGUgeDg2XzY0IGNvZGUuCisgICAgZG5sICBTbyBzZWUgd2hhdCBzaXplIHdlIHRoaW5rIGEgcG9pbnRlciBpcywgYW5kIGJhaWwgaWYgbm90IDMyLWJpdC4KKyAgICBBQ19DSEVDS19TSVpFT0YoW3ZvaWQgKl0sIDQpCisgICAgaWYgdGVzdCB4JGFjX2N2X3NpemVvZl92b2lkX3AgIT0geDQ7IHRoZW4KKyAgICAgICAgcmV0dXJuCisgICAgZmkKKworICAgIGRubCBDaGVjayBmb3IgTkFTTSAoZm9yIGFzc2VtYmx5IGJsaXQgcm91dGluZXMpCisgICAgQUNfQVJHX0VOQUJMRShuYXNtLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW5hc21dLCBbdXNlIG5hc20gYXNzZW1ibHkgYmxpdHRlcnMgb24geDg2IFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfbmFzbT15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfYXNzZW1ibHkgPSB4eWVzIC1hIHgkZW5hYmxlX25hc20gPSB4eWVzOyB0aGVuCisgICAgICAgIENvbXBpbGVOQVNNKCkKKyAgICAgICAgeworICAgICAgICAgICAgIyBVc2FnZTogQ29tcGlsZU5BU00gPGZpbGVuYW1lPgorICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKHRvIHNlZSBpZiAkTkFTTSBzdXBwb3J0cyAkMSkKKyAgICAgICAgICAgIGlmICROQVNNICROQVNNRkxBR1MgJDEgLW8gJDEubyA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjE7IHRoZW4KKyAgICAgICAgICAgICAgICBDb21waWxlTkFTTV9yZXQ9InllcyIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBDb21waWxlTkFTTV9yZXQ9Im5vIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIHJtIC1mICQxICQxLm8KKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoJENvbXBpbGVOQVNNX3JldCkKKyAgICAgICAgICAgIHRlc3QgIiRDb21waWxlTkFTTV9yZXQiID0gInllcyIKKyAgICAgICAgfQorCisgICAgICAgIGlmIHRlc3QgeCIkTkFTTUZMQUdTIiA9IHg7IHRoZW4KKyAgICAgICAgICAgIGNhc2UgJEFSQ0ggaW4KKyAgICAgICAgICAgICAgd2luMzIpCisgICAgICAgICAgICAgICAgICBOQVNNRkxBR1M9Ii1mIHdpbjMyIgorICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgbWFjb3N4KQorICAgICAgICAgICAgICAgICAgTkFTTUZMQUdTPSItZiBtYWNobyIKKyAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICBOQVNNRkxBR1M9Ii1mIGVsZjMyIgorICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkKKworICAgICAgICBBQ19QQVRIX1BST0coTkFTTSwgbmFzbSkKKyAgICAgICAgZWNobyAiJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjMyIiA+IHVucXVvdGVkLXNlY3Rpb25zCisgICAgICAgIGVjaG8gInNlY3Rpb24gLm5vdGUuR05VLXN0YWNrIG5vYWxsb2Mgbm9leGVjIG5vd3JpdGUgcHJvZ2JpdHMiID4+IHVucXVvdGVkLXNlY3Rpb25zCisgICAgICAgIGVjaG8gIiVlbmRpZiIgPj4gdW5xdW90ZWQtc2VjdGlvbnMKKyAgICAgICAgQ29tcGlsZU5BU00gdW5xdW90ZWQtc2VjdGlvbnMgfHwgTkFTTT0iIgorCisgICAgICAgIGlmIHRlc3QgIngkTkFTTSIgIT0geCAtYSAieCROQVNNIiAhPSB4JyIkTkFTTSInOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0hFUk1FU19CTElUVEVSUykKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2hlcm1lcy8qLmFzbSIKKyAgICAgICAgICAgIE5BU01GTEFHUz0iJE5BU01GTEFHUyAtSSAkc3JjZGlyL3NyYy9oZXJtZXMvIgorCisgICAgICAgICAgICBkbmwgU2VlIGlmIGhpZGRlbiB2aXNpYmlsaXR5IGlzIHN1cHBvcnRlZAorICAgICAgICAgICAgZWNobyAiR0xPQkFMIF9iYXI6ZnVuY3Rpb24gaGlkZGVuIiA+IHN5bWJvbC12aXNpYmlsaXR5CisgICAgICAgICAgICBlY2hvICJfYmFyOiIgPj4gc3ltYm9sLXZpc2liaWxpdHkKKyAgICAgICAgICAgIENvbXBpbGVOQVNNIHN5bWJvbC12aXNpYmlsaXR5ICYmIE5BU01GTEFHUz0iJE5BU01GTEFHUyAtREhJRERFTl9WSVNJQklMSVRZIgorCisgICAgICAgICAgICBBQ19TVUJTVChOQVNNKQorICAgICAgICAgICAgQUNfU1VCU1QoTkFTTUZMQUdTKQorCisgICAgICAgICAgICBjYXNlICIkaG9zdCIgaW4KKyAgICAgICAgICAgICAgICAjIHRoaXMgbGluZSBpcyBuZWVkZWQgZm9yIFFOWCwgYmVjYXVzZSBpdCdzIG5vdCBkZWZpbmVkIHRoZSBfX0VMRl9fCisgICAgICAgICAgICAgICAgKi0qLXFueCopCisgICAgICAgICAgICAgICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgLURfX0VMRl9fIjs7CisgICAgICAgICAgICAgICAgKi0qLXNvbGFyaXMqKQorICAgICAgICAgICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1EX19FTEZfXyI7OworICAgICAgICAgICAgZXNhYworICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBDaGVjayBmb3IgYWx0aXZlYyBpbnN0cnVjdGlvbiBzdXBwb3J0IHVzaW5nIGdhcyBzeW50YXgKK0NoZWNrQWx0aXZlYygpCit7CisgICAgQUNfQVJHX0VOQUJMRShhbHRpdmVjLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFsdGl2ZWNdLCBbdXNlIGFsdGl2ZWMgYXNzZW1ibHkgYmxpdHRlcnMgb24gUFBDIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfYWx0aXZlYz15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfYXNzZW1ibHkgPSB4eWVzIC1hIHgkZW5hYmxlX2FsdGl2ZWMgPSB4eWVzOyB0aGVuCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBoYXZlX2djY19hbHRpdmVjPW5vCisgICAgICAgIGhhdmVfYWx0aXZlY19oX2hkcj1ubworICAgICAgICBhbHRpdmVjX0NGTEFHUz0iLW1hbHRpdmVjIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyAkYWx0aXZlY19DRkxBR1MiCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBBbHRpdmVjIHdpdGggR0NDIGFsdGl2ZWMuaCBhbmQgLW1hbHRpdmVjIG9wdGlvbikKKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAjaW5jbHVkZSA8YWx0aXZlYy5oPgorICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZ6ZXJvKCkgeworICAgICAgICAgICAgcmV0dXJuIHZlY19zcGxhdF91MzIoMCk7CisgICAgICAgIH0KKyAgICAgICAgXSxbCisgICAgICAgIF0sWworICAgICAgICBoYXZlX2djY19hbHRpdmVjPXllcworICAgICAgICBoYXZlX2FsdGl2ZWNfaF9oZHI9eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJGhhdmVfZ2NjX2FsdGl2ZWMpCisKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfZ2NjX2FsdGl2ZWMgPSB4bm87IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgQWx0aXZlYyB3aXRoIEdDQyAtbWFsdGl2ZWMgb3B0aW9uKQorICAgICAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2emVybygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmVjX3NwbGF0X3UzMigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgXSxbCisgICAgICAgICAgICBoYXZlX2djY19hbHRpdmVjPXllcworICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoJGhhdmVfZ2NjX2FsdGl2ZWMpCisgICAgICAgIGZpCisKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfZ2NjX2FsdGl2ZWMgPSB4bm87IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgQWx0aXZlYyB3aXRoIEdDQyBhbHRpdmVjLmggYW5kIC1mYWx0aXZlYyBvcHRpb24pCisgICAgICAgICAgICBhbHRpdmVjX0NGTEFHUz0iLWZhbHRpdmVjIgorICAgICAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MgJGFsdGl2ZWNfQ0ZMQUdTIgorICAgICAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgICAgI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgdnplcm8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZlY19zcGxhdF91MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgaGF2ZV9nY2NfYWx0aXZlYz15ZXMKKyAgICAgICAgICAgIGhhdmVfYWx0aXZlY19oX2hkcj15ZXMKKyAgICAgICAgICAgIF0pCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKCRoYXZlX2djY19hbHRpdmVjKQorCWZpCisKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfZ2NjX2FsdGl2ZWMgPSB4bm87IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgQWx0aXZlYyB3aXRoIEdDQyAtZmFsdGl2ZWMgb3B0aW9uKQorICAgICAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2emVybygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmVjX3NwbGF0X3UzMigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgXSxbCisgICAgICAgICAgICBoYXZlX2djY19hbHRpdmVjPXllcworICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoJGhhdmVfZ2NjX2FsdGl2ZWMpCisgICAgICAgIGZpCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX2djY19hbHRpdmVjID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9BTFRJVkVDX0JMSVRURVJTKQorICAgICAgICAgICAgaWYgdGVzdCB4JGhhdmVfYWx0aXZlY19oX2hkciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfQUxUSVZFQ19IKQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEVYVFJBX0NGTEFHUz0iJEVYVFJBX0NGTEFHUyAkYWx0aXZlY19DRkxBR1MiCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIFNlZSBpZiBHQ0MncyAtZnZpc2liaWxpdHk9aGlkZGVuIGlzIHN1cHBvcnRlZCAoZ2NjNCBhbmQgbGF0ZXIsIHVzdWFsbHkpLgorZG5sICBEZXRhaWxzIG9mIHRoaXMgZmxhZyBhcmUgaGVyZTogaHR0cDovL2djYy5nbnUub3JnL3dpa2kvVmlzaWJpbGl0eQorQ2hlY2tWaXNpYmlsaXR5SGlkZGVuKCkKK3sKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEdDQyAtZnZpc2liaWxpdHk9aGlkZGVuIG9wdGlvbikKKyAgICBoYXZlX2djY19mdmlzaWJpbGl0eT1ubworCisgICAgdmlzaWJpbGl0eV9DRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iCisgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MgJHZpc2liaWxpdHlfQ0ZMQUdTIC1XZXJyb3IiCisgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICNpZiAhZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPCA0CisgICAgI2Vycm9yIFNETCBvbmx5IHVzZXMgdmlzaWJpbGl0eSBhdHRyaWJ1dGVzIGluIEdDQyA0IG9yIG5ld2VyCisgICAgI2VuZGlmCisgICAgXSxbCisgICAgXSxbCisgICAgaGF2ZV9nY2NfZnZpc2liaWxpdHk9eWVzCisgICAgXSkKKyAgICBBQ19NU0dfUkVTVUxUKCRoYXZlX2djY19mdmlzaWJpbGl0eSkKKyAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworICAgIGlmIHRlc3QgeCRoYXZlX2djY19mdmlzaWJpbGl0eSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTICR2aXNpYmlsaXR5X0NGTEFHUyIKKyAgICBmaQorfQorCitkbmwgU2VlIGlmIEdDQydzIC1XYWxsIGlzIHN1cHBvcnRlZC4KK0NoZWNrV2FybkFsbCgpCit7CisgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBHQ0MgLVdhbGwgb3B0aW9uKQorICAgIGhhdmVfZ2NjX1dhbGw9bm8KKworICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIC1XYWxsIgorICAgIEFDX1RSWV9DT01QSUxFKFsKKyAgICBpbnQgeCA9IDA7CisgICAgXSxbCisgICAgXSxbCisgICAgaGF2ZV9nY2NfV2FsbD15ZXMKKyAgICBdKQorICAgIEFDX01TR19SRVNVTFQoJGhhdmVfZ2NjX1dhbGwpCisgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKKyAgICBpZiB0ZXN0IHgkaGF2ZV9nY2NfV2FsbCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1XYWxsIgorCisgICAgICAgIGRubCBIYWlrdSBoZWFkZXJzIHVzZSBtdWx0aWNoYXJhY3RlciBjb25zdGFudHMgYWxsIG92ZXIgdGhlIHBsYWNlLiBJZ25vcmUgdGhlc2Ugd2FybmluZ3Mgd2hlbiB1c2luZyAtV2FsbC4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBuZWNlc3NhcnkgR0NDIC1Xbm8tbXVsdGljaGFyIG9wdGlvbikKKyAgICAgICAgbmVlZF9nY2NfV25vX211bHRpY2hhcj1ubworICAgICAgICBjYXNlICIkaG9zdCIgaW4KKyAgICAgICAgICAgICotKi1iZW9zKiB8ICotKi1oYWlrdSopCisgICAgICAgICAgICAgICAgbmVlZF9nY2NfV25vX211bHRpY2hhcj15ZXMKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIEFDX01TR19SRVNVTFQoJG5lZWRfZ2NjX1dub19tdWx0aWNoYXIpCisgICAgICAgIGlmIHRlc3QgeCRuZWVkX2djY19Xbm9fbXVsdGljaGFyID0geHllczsgdGhlbgorICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1Xbm8tbXVsdGljaGFyIgorICAgICAgICBmaQorICAgIGZpCit9CisKKworZG5sIERvIHRoZSBpUG9kIHRoaW5nCitDaGVja0lQb2QoKQoreworICAgIEFDX0FSR19FTkFCTEUoaXBvZCwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1pcG9kXSwgW2NvbmZpZ3VyZSBTREwgdG8gd29yayB3aXRoIGlQb2RMaW51eCBbW2RlZmF1bHQ9bm9dXV0pLAorICAgICAgICAsIGVuYWJsZV9pcG9kPW5vKQorCisgICAgaWYgdGVzdCB4JGVuYWJsZV9pcG9kID0geHllczsgdGhlbgorICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgLURJUE9EIgorICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9JUE9EKQorICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9pcG9kLyouYyIKKyAgICBmaQorfQorCitkbmwgRmluZCB0aGUgbmFub3ggaW5jbHVkZSBhbmQgbGlicmFyeSBkaXJlY3RvcmllcworQ2hlY2tOQU5PWCgpCit7CisgICAgQUNfQVJHX0VOQUJMRSh2aWRlby1uYW5veCwKKyAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLW5hbm94XSwgW3VzZSBuYW5veCB2aWRlbyBkcml2ZXIgW1tkZWZhdWx0PW5vXV1dKSwKKyAgICAgICAgLCBlbmFibGVfdmlkZW9fbmFub3g9bm8pCisKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19uYW5veCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfQVJHX0VOQUJMRShuYW5veC1kZWJ1ZywgIAorICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW5hbm94LWRlYnVnXSwgW3ByaW50IGRlYnVnIG1lc3NhZ2VzIFtbZGVmYXVsdD1ub11dXSksCisgICAgICAgICAgICAsIGVuYWJsZV9uYW5veF9kZWJ1Zz1ubykKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9uYW5veF9kZWJ1ZyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEVYVFJBX0NGTEFHUz0iJEVYVFJBX0NGTEFHUyAtREVOQUJMRV9OQU5PWF9ERUJVRyIKKyAgICAgICAgZmkKKworICAgICAgICBBQ19BUkdfRU5BQkxFKG5hbm94LXNoYXJlLW1lbW9yeSwgIAorICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW5hbm94LXNoYXJlLW1lbW9yeV0sIFt1c2Ugc2hhcmUgbWVtb3J5IFtbZGVmYXVsdD1ub11dXSksCisgICAgICAgICAgICAsIGVuYWJsZV9uYW5veF9zaGFyZV9tZW1vcnk9bm8pCisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfbmFub3hfc2hhcmVfbWVtb3J5ID0geHllczsgdGhlbgorICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1ETkFOT1hfU0hBUkVfTUVNT1JZIgorICAgICAgICBmaQorCisgICAgICAgIEFDX0FSR19FTkFCTEUobmFub3hfZGlyZWN0X2ZiLCAKKyAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1uYW5veC1kaXJlY3QtZmJdLCBbdXNlIGRpcmVjdCBmcmFtZWJ1ZmZlciBhY2Nlc3MgW1tkZWZhdWx0PW5vXV1dKSwKKyAgICAgICAgICAgICwgZW5hYmxlX25hbm94X2RpcmVjdF9mYj1ubykKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9uYW5veF9kaXJlY3RfZmIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgLURFTkFCTEVfTkFOT1hfRElSRUNUX0ZCIgorICAgICAgICBmaQorCisgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX05BTk9YKQorICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9uYW5veC8qLmMiCisgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1sbmFuby1YIgorICAgICAgICBoYXZlX3ZpZGVvPXllcworICAgIGZpCit9CisKK2RubCBGaW5kIHRoZSBYMTEgaW5jbHVkZSBhbmQgbGlicmFyeSBkaXJlY3RvcmllcworQ2hlY2tYMTEoKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8teDExLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLXgxMV0sIFt1c2UgWDExIHZpZGVvIGRyaXZlciBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3ZpZGVvX3gxMT15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9feDExID0geHllczsgdGhlbgorICAgICAgICBjYXNlICIkaG9zdCIgaW4KKyAgICAgICAgICAgICotKi1kYXJ3aW4qKQorICAgICAgICAgICAgICAgICMgVGhpcyBpc24ndCBuZWNlc3NhcnkgZm9yIFgxMSwgYnV0IGZpeGVzIEdMWCBkZXRlY3Rpb24KKyAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JHhfaW5jbHVkZXMiID0geE5PTkUgJiYgdGVzdCAieCR4X2xpYnJhcmllcyIgPSB4Tk9ORTsgdGhlbgorICAgICAgICAgICAgICAgICAgICB4X2luY2x1ZGVzPSIvdXNyL1gxMVI2L2luY2x1ZGUiCisgICAgICAgICAgICAgICAgICAgIHhfbGlicmFyaWVzPSIvdXNyL1gxMVI2L2xpYiIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgQUNfUEFUSF9YCisgICAgICAgIEFDX1BBVEhfWFRSQQorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV94ID0geHllczsgdGhlbgorICAgICAgICAgICAgIyBPbmx5IGFsbG93IGR5bmFtaWNhbGx5IGxvYWRlZCBYMTEgaWYgdGhlIFgxMSBmdW5jdGlvbiBwb2ludGVycworICAgICAgICAgICAgIyB3aWxsIG5vdCBlbmQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UsIHdoaWNoIGNhdXNlcyBwcm9ibGVtcworICAgICAgICAgICAgIyB3aXRoIG90aGVyIGxpYnJhcmllcyBjYWxsaW5nIFgxMSBmdW5jdGlvbnMuCisgICAgICAgICAgICB4MTFfc3ltYm9sc19wcml2YXRlPSRoYXZlX2djY19mdmlzaWJpbGl0eQorCisgICAgICAgICAgICBBQ19BUkdfRU5BQkxFKHgxMS1zaGFyZWQsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUteDExLXNoYXJlZF0sIFtkeW5hbWljYWxseSBsb2FkIFgxMSBzdXBwb3J0IFtbZGVmYXVsdD1tYXliZV1dXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3gxMV9zaGFyZWQ9bWF5YmUpCisKKyAgICAgICAgICAgIGNhc2UgIiRob3N0IiBpbgorICAgICAgICAgICAgICAgICotKi1kYXJ3aW4qKSAjIExhdGVzdCBNYWMgT1MgWCBhY3R1YWxseSBzaGlwcyB3aXRoIFhyYW5kci9YcmVuZGVyIGxpYnMuLi4KKyAgICAgICAgICAgICAgICAgICAgeDExX3N5bWJvbHNfcHJpdmF0ZT15ZXMKKyAgICAgICAgICAgICAgICAgICAgeDExX2xpYj0nL3Vzci9YMTFSNi9saWIvbGliWDExLjYuZHlsaWInCisgICAgICAgICAgICAgICAgICAgIHgxMWV4dF9saWI9Jy91c3IvWDExUjYvbGliL2xpYlhleHQuNi5keWxpYicKKyAgICAgICAgICAgICAgICAgICAgeHJlbmRlcl9saWI9Jy91c3IvWDExUjYvbGliL2xpYlhyZW5kZXIuMS5keWxpYicKKyAgICAgICAgICAgICAgICAgICAgeHJhbmRyX2xpYj0nL3Vzci9YMTFSNi9saWIvbGliWHJhbmRyLjIuZHlsaWInCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgKi0qLW9zZiopCisgICAgICAgICAgICAgICAgICAgIHgxMV9saWI9J2xpYlgxMS5zbycKKyAgICAgICAgICAgICAgICAgICAgeDExZXh0X2xpYj0nbGliWGV4dC5zbycKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAqLSotaXJpeCopICMgSVJJWCA2LjUgcmVxdWlyZXMgdGhhdCB3ZSB1c2UgL3Vzci9saWIzMgorICAgICAgICAgICAgICAgICAgICB4MTFfbGliPSdsaWJYMTEuc28nCisgICAgICAgICAgICAgICAgICAgIHgxMWV4dF9saWI9J2xpYlhleHQuc28nCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgeDExX2xpYj1bYGZpbmRfbGliICJsaWJYMTEuc28uKiIgIiRYX0xJQlMgLUwvdXNyL1gxMS8kYmFzZV9saWJkaXIgLUwvdXNyL1gxMVI2LyRiYXNlX2xpYmRpciIgfCBzZWQgJ3MvLipcL1woLipcKS9cMS87IHEnYF0KKyAgICAgICAgICAgICAgICAgICAgeDExZXh0X2xpYj1bYGZpbmRfbGliICJsaWJYZXh0LnNvLioiICIkWF9MSUJTIC1ML3Vzci9YMTEvJGJhc2VfbGliZGlyIC1ML3Vzci9YMTFSNi8kYmFzZV9saWJkaXIiIHwgc2VkICdzLy4qXC9cKC4qXCkvXDEvOyBxJ2BdCisgICAgICAgICAgICAgICAgICAgIHhyZW5kZXJfbGliPVtgZmluZF9saWIgImxpYlhyZW5kZXIuc28uKiIgIiRYX0xJQlMgLUwvdXNyL1gxMS8kYmFzZV9saWJkaXIgLUwvdXNyL1gxMVI2LyRiYXNlX2xpYmRpciIgfCBzZWQgJ3MvLipcL1woLipcKS9cMS87IHEnYF0KKyAgICAgICAgICAgICAgICAgICAgeHJhbmRyX2xpYj1bYGZpbmRfbGliICJsaWJYcmFuZHIuc28uKiIgIiRYX0xJQlMgLUwvdXNyL1gxMS8kYmFzZV9saWJkaXIgLUwvdXNyL1gxMVI2LyRiYXNlX2xpYmRpciIgfCBzZWQgJ3MvLipcL1woLipcKS9cMS87IHEnYF0KKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKworICAgICAgICAgICAgWF9DRkxBR1M9IiRYX0NGTEFHUyAtRFhUSFJFQURTIgorICAgICAgICAgICAgaWYgdGVzdCB4JGFjX2N2X2Z1bmNfc2htYXQgIT0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIFhfQ0ZMQUdTPSIkWF9DRkxBR1MgLUROT19TSEFSRURfTUVNT1JZIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkWF9DRkxBR1MiCisgICAgICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAkWF9MSUJTIgorCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9YMTEpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby94MTEvKi5jIgorICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTICRYX0NGTEFHUyIKKworICAgICAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV94MTFfc2hhcmVkID0geG1heWJlOyB0aGVuCisgICAgICAgICAgICAgICAgZW5hYmxlX3gxMV9zaGFyZWQ9JHgxMV9zeW1ib2xzX3ByaXZhdGUKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9sb2Fkc28gIT0geHllcyAmJiBcCisgICAgICAgICAgICAgICB0ZXN0IHgkZW5hYmxlX3gxMV9zaGFyZWQgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW1lvdSBtdXN0IGhhdmUgU0RMX0xvYWRPYmplY3QoKSBzdXBwb3J0IGZvciBkeW5hbWljIFgxMSBsb2FkaW5nXSkKKyAgICAgICAgICAgICAgICBlbmFibGVfeDExX3NoYXJlZD1ubworICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGlmIHRlc3QgeCR4MTFfc3ltYm9sc19wcml2YXRlICE9IHh5ZXMgJiYgXAorICAgICAgICAgICAgICAgdGVzdCB4JGVuYWJsZV94MTFfc2hhcmVkID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19XQVJOKFtZb3UgbXVzdCBoYXZlIGdjYzQgKC1mdmlzaWJpbGl0eT1oaWRkZW4pIGZvciBkeW5hbWljIFgxMSBsb2FkaW5nXSkKKyAgICAgICAgICAgICAgICBlbmFibGVfeDExX3NoYXJlZD1ubworICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCB4JGhhdmVfbG9hZHNvID0geHllcyAmJiBcCisgICAgICAgICAgICAgICB0ZXN0IHgkZW5hYmxlX3gxMV9zaGFyZWQgPSB4eWVzICYmIHRlc3QgeCR4MTFfbGliICE9IHggJiYgdGVzdCB4JHgxMWV4dF9saWIgIT0geDsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIi0tIGR5bmFtaWMgbGliWDExIC0+ICR4MTFfbGliIgorICAgICAgICAgICAgICAgIGVjaG8gIi0tIGR5bmFtaWMgbGliWDExZXh0IC0+ICR4MTFleHRfbGliIgorICAgICAgICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDLCAiJHgxMV9saWIiKQorICAgICAgICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hFWFQsICIkeDExZXh0X2xpYiIpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZW5hYmxlX3gxMV9zaGFyZWQ9bm8KKyAgICAgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAkWF9MSUJTIC1sWDExIC1sWGV4dCIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBoYXZlX3ZpZGVvPXllcworCisgICAgICAgICAgICBBQ19BUkdfRU5BQkxFKGRnYSwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kZ2FdLCBbYWxsb3cgdXNlIG9mIFgxMSBER0EgY29kZSBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLCBlbmFibGVfZGdhPXllcykKKyAgICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfZGdhID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL1hleHQvWHhmODZkZ2EvKi5jIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEFDX0FSR19FTkFCTEUodmlkZW8tZGdhLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLWRnYV0sIFt1c2UgREdBIDIuMCB2aWRlbyBkcml2ZXIgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV92aWRlb19kZ2E9eWVzKQorICAgICAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9kZ2EgPSB4eWVzIC1hIHgkZW5hYmxlX3ZpZGVvX2RnYSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9ER0EpCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vZGdhLyouYyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBBQ19BUkdfRU5BQkxFKHZpZGVvLXgxMS1kZ2Ftb3VzZSwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12aWRlby14MTEtZGdhbW91c2VdLCBbdXNlIFgxMSBER0EgZm9yIG1vdXNlIGV2ZW50cyBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9feDExX2RnYW1vdXNlPXllcykKKyAgICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfZGdhID0geHllcyAtYSB4JGVuYWJsZV92aWRlb194MTFfZGdhbW91c2UgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19EUklWRVJfWDExX0RHQU1PVVNFKQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEFDX0FSR19FTkFCTEUodmlkZW8teDExLXZtLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLXgxMS12bV0sIFt1c2UgWDExIFZNIGV4dGVuc2lvbiBmb3IgZnVsbHNjcmVlbiBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9feDExX3ZtPXllcykKKyAgICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW9feDExX3ZtID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFKQorICAgICAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL1hleHQvWHhmODZ2bS8qLmMiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgQUNfQVJHX0VOQUJMRSh2aWRlby14MTEteHYsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmlkZW8teDExLXh2XSwgW3VzZSBYMTEgWHZJbWFnZSBleHRlbnNpb24gZm9yIHZpZGVvIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAsIGVuYWJsZV92aWRlb194MTFfeHY9eWVzKQorICAgICAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlb194MTFfeHYgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19EUklWRVJfWDExX1hWKQorICAgICAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL1hleHQvWHYvKi5jIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEFDX0FSR19FTkFCTEUodmlkZW8teDExLXhpbmVyYW1hLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLXgxMS14aW5lcmFtYV0sIFtlbmFibGUgWDExIFhpbmVyYW1hIHN1cHBvcnQgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9feDExX3hpbmVyYW1hPXllcykKKyAgICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW9feDExX3hpbmVyYW1hID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQSkKKyAgICAgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9YZXh0L1hpbmVyYW1hLyouYyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBBQ19BUkdfRU5BQkxFKHZpZGVvLXgxMS14bWUsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmlkZW8teDExLXhtZV0sIFtlbmFibGUgWGkgR3JhcGhpY3MgWE1FIGZvciBmdWxsc2NyZWVuIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3ZpZGVvX3gxMV94bWU9eWVzKQorICAgICAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlb194MTFfeG1lID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX1gxMV9YTUUpCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vWGV4dC9YTUUvKi5jIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEFDX0FSR19FTkFCTEUodmlkZW8teDExLXhyYW5kciwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12aWRlby14MTEteHJhbmRyXSwgW2VuYWJsZSBYMTEgWHJhbmRyIGV4dGVuc2lvbiBmb3IgZnVsbHNjcmVlbiBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGVuYWJsZV92aWRlb194MTFfeHJhbmRyPXllcykKKyAgICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW9feDExX3hyYW5kciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBkZWZpbml0ZWx5X2VuYWJsZV92aWRlb194MTFfeHJhbmRyPW5vCisgICAgICAgICAgICAgICAgQUNfQ0hFQ0tfSEVBREVSKFgxMS9leHRlbnNpb25zL1hyYW5kci5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX3hyYW5kcl9oX2hkcj15ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVfeHJhbmRyX2hfaGRyPW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbI2luY2x1ZGUgPFgxMS9YbGliLmg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICAgICAgaWYgdGVzdCB4JGhhdmVfeHJhbmRyX2hfaGRyID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX3gxMV9zaGFyZWQgPSB4eWVzICYmIHRlc3QgeCR4cmFuZHJfbGliICE9IHggOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICItLSBkeW5hbWljIGxpYlhyZW5kZXIgLT4gJHhyZW5kZXJfbGliIgorICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiLS0gZHluYW1pYyBsaWJYcmFuZHIgLT4gJHhyYW5kcl9saWIiCisgICAgICAgICAgICAgICAgICAgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YUkVOREVSLCAiJHhyZW5kZXJfbGliIikKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSQU5EUiwgIiR4cmFuZHJfbGliIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRlbHlfZW5hYmxlX3ZpZGVvX3gxMV94cmFuZHI9eWVzCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDX0NIRUNLX0xJQihYcmVuZGVyLCBYUmVuZGVyUXVlcnlFeHRlbnNpb24sIGhhdmVfeHJlbmRlcl9saWI9eWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgQUNfQ0hFQ0tfTElCKFhyYW5kciwgWFJSUXVlcnlFeHRlbnNpb24sIGhhdmVfeHJhbmRyX2xpYj15ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV94cmVuZGVyX2xpYiA9IHh5ZXMgJiYgdGVzdCB4JGhhdmVfeHJhbmRyX2xpYiA9IHh5ZXMgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLWxYcmFuZHIgLWxYcmVuZGVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRlbHlfZW5hYmxlX3ZpZGVvX3gxMV94cmFuZHI9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgaWYgdGVzdCB4JGRlZmluaXRlbHlfZW5hYmxlX3ZpZGVvX3gxMV94cmFuZHIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUikKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIENoZWNrIGZvciBRTlggcGhvdG9uIHZpZGVvIGRyaXZlcgorQ2hlY2tQSE9UT04oKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8tcGhvdG9uLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLXBob3Rvbl0sIFt1c2UgUU5YIFBob3RvbiB2aWRlbyBkcml2ZXIgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV92aWRlb19waG90b249eWVzKQorICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW8gPSB4eWVzIC1hIHgkZW5hYmxlX3ZpZGVvX3Bob3RvbiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBRTlggUGhvdG9uIHN1cHBvcnQpCisgICAgICAgIHZpZGVvX3Bob3Rvbj1ubworICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgI2luY2x1ZGUgPFBoLmg+CisgICAgICAgICAgI2luY2x1ZGUgPFB0Lmg+CisgICAgICAgICAgI2luY2x1ZGUgPHBob3Rvbi9QZy5oPgorICAgICAgICAgICNpbmNsdWRlIDxwaG90b24vUGREaXJlY3QuaD4KKyAgICAgICAgXSxbCisgICAgICAgICBQZ0Rpc3BsYXlTZXR0aW5nc190ICp2aXN1YWw7CisgICAgICAgIF0sWworICAgICAgICB2aWRlb19waG90b249eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJHZpZGVvX3Bob3RvbikKKyAgICAgICAgaWYgdGVzdCB4JHZpZGVvX3Bob3RvbiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX1BIT1RPTikKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL3Bob3Rvbi8qLmMiCisgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtbHBoIgorICAgICAgICAgICAgaGF2ZV92aWRlbz15ZXMKKworICAgICAgICAgICAgQ2hlY2tPcGVuR0xRTlgKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgU2V0IHVwIHRoZSBCV2luZG93IHZpZGVvIGRyaXZlciBpZiBlbmFibGVkCitDaGVja0JXSU5ET1coKQoreworICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW8gPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX0JXSU5ET1cpCisgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL2J3aW5kb3cvKi5jYyIKKyAgICAgICAgaGF2ZV92aWRlbz15ZXMKKyAgICBmaQorfQorCitkbmwgU2V0IHVwIHRoZSBDYXJib24vUXVpY2tEcmF3IHZpZGVvIGRyaXZlciBmb3IgTWFjIE9TIFggKGJ1dCBub3QgRGFyd2luKQorQ2hlY2tDQVJCT04oKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8tY2FyYm9uLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLWNhcmJvbl0sIFt1c2UgQ2FyYm9uL1F1aWNrRHJhdyB2aWRlbyBkcml2ZXIgW1tkZWZhdWx0PW5vXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3ZpZGVvX2NhcmJvbj1ubykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19jYXJib24gPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgQ2FyYm9uIGZyYW1ld29yaykKKyAgICAgICAgaGF2ZV9jYXJib249bm8KKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgICNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CisgICAgICAgIF0sWworICAgICAgICBdLFsKKyAgICAgICAgaGF2ZV9jYXJib249eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJGhhdmVfY2FyYm9uKQorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9jYXJib24gPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9UT09MQk9YKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vbWFjY29tbW9uLyouYyIKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL21hY3JvbS8qLmMiCisgICAgICAgICAgICBoYXZlX3ZpZGVvPXllcworICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBTZXQgdXAgdGhlIENvY29hL1F1YXJ0eiB2aWRlbyBkcml2ZXIgZm9yIE1hYyBPUyBYIChidXQgbm90IERhcndpbikKK0NoZWNrQ09DT0EoKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8tY29jb2EsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmlkZW8tY29jb2FdLCBbdXNlIENvY29hL1F1YXJ0eiB2aWRlbyBkcml2ZXIgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV92aWRlb19jb2NvYT15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9fY29jb2EgPSB4eWVzOyB0aGVuCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBkbmwgd29yayBhcm91bmQgdGhhdCB3ZSBkb24ndCBoYXZlIE9iamVjdGl2ZS1DIHN1cHBvcnQgaW4gYXV0b2NvbmYKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC14IG9iamVjdGl2ZS1jIgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIENvY29hIGZyYW1ld29yaykKKyAgICAgICAgaGF2ZV9jb2NvYT1ubworICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyAgICAgICAgXSxbCisgICAgICAgIF0sWworICAgICAgICBoYXZlX2NvY29hPXllcworICAgICAgICBdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRoYXZlX2NvY29hKQorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfY29jb2EgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9RVUFSVFopCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9xdWFydHovKi5tIgorICAgICAgICAgICAgaGF2ZV92aWRlbz15ZXMKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgRmluZCB0aGUgZnJhbWVidWZmZXIgY29uc29sZSBpbmNsdWRlcworQ2hlY2tGQkNPTigpCit7CisgICAgQUNfQVJHX0VOQUJMRSh2aWRlby1mYmNvbiwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12aWRlby1mYmNvbl0sIFt1c2UgZnJhbWVidWZmZXIgY29uc29sZSB2aWRlbyBkcml2ZXIgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV92aWRlb19mYmNvbj15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9fZmJjb24gPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgZnJhbWVidWZmZXIgY29uc29sZSBzdXBwb3J0KQorICAgICAgICB2aWRlb19mYmNvbj1ubworICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAjaW5jbHVkZSA8bGludXgvZmIuaD4KKyAgICAgICAgICNpbmNsdWRlIDxsaW51eC9rZC5oPgorICAgICAgICAgI2luY2x1ZGUgPGxpbnV4L2tleWJvYXJkLmg+CisgICAgICAgIF0sWworICAgICAgICBdLFsKKyAgICAgICAgdmlkZW9fZmJjb249eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJHZpZGVvX2ZiY29uKQorICAgICAgICBpZiB0ZXN0IHgkdmlkZW9fZmJjb24gPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19DSEVDS19GVU5DUyhnZXRwYWdlc2l6ZSkKKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX0ZCQ09OKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vZmJjb24vKi5jIgorICAgICAgICAgICAgaGF2ZV92aWRlbz15ZXMKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgRmluZCBEaXJlY3RGQgorQ2hlY2tEaXJlY3RGQigpCit7CisgICAgQUNfQVJHX0VOQUJMRSh2aWRlby1kaXJlY3RmYiwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12aWRlby1kaXJlY3RmYl0sIFt1c2UgRGlyZWN0RkIgdmlkZW8gZHJpdmVyIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9fZGlyZWN0ZmI9eWVzKQorICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW8gPSB4eWVzIC1hIHgkZW5hYmxlX3ZpZGVvX2RpcmVjdGZiID0geHllczsgdGhlbgorICAgICAgICB2aWRlb19kaXJlY3RmYj1ubworCisgICAgICAgIERJUkVDVEZCX1JFUVVJUkVEX1ZFUlNJT049MC45LjE1CisKKyAgICAgICAgQUNfUEFUSF9QUk9HKERJUkVDVEZCQ09ORklHLCBkaXJlY3RmYi1jb25maWcsIG5vKQorICAgICAgICBpZiB0ZXN0IHgkRElSRUNURkJDT05GSUcgPSB4bm87IHRoZW4KKyAgICAgICAgICAgIEFDX1BBVEhfUFJPRyhQS0dfQ09ORklHLCBwa2ctY29uZmlnLCBubykKKyAgICAgICAgICAgIGlmIHRlc3QgeCRQS0dfQ09ORklHICE9IHhubzsgdGhlbgorICAgICAgICAgICAgICAgIGlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjcgJiYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXZlcnNpb24gJERJUkVDVEZCX1JFUVVJUkVEX1ZFUlNJT04gZGlyZWN0ZmI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgRElSRUNURkJfQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyBkaXJlY3RmYmAKKyAgICAgICAgICAgICAgICAgICAgRElSRUNURkJfTElCUz1gJFBLR19DT05GSUcgLS1saWJzIGRpcmVjdGZiYAorICAgICAgICAgICAgICAgICAgICB2aWRlb19kaXJlY3RmYj15ZXMKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0IC0tIGBlY2hvICRESVJFQ1RGQl9SRVFVSVJFRF9WRVJTSU9OIHwgc2VkICdzL1wuLyAvZydgCisgICAgICAgICAgICBORUVEX1ZFUlNJT049YGV4cHIgJDEgXCogMTAwMDAgKyAkMiBcKiAxMDAgKyAkM2AKKyAgICAgICAgICAgIHNldCAtLSBgZGlyZWN0ZmItY29uZmlnIC0tdmVyc2lvbiB8IHNlZCAncy9cLi8gL2cnYAorICAgICAgICAgICAgSEFWRV9WRVJTSU9OPWBleHByICQxIFwqIDEwMDAwICsgJDIgXCogMTAwICsgJDNgCisgICAgICAgICAgICBpZiB0ZXN0ICRIQVZFX1ZFUlNJT04gLWdlICRORUVEX1ZFUlNJT047IHRoZW4KKyAgICAgICAgICAgICAgICBESVJFQ1RGQl9DRkxBR1M9YCRESVJFQ1RGQkNPTkZJRyAtLWNmbGFnc2AKKyAgICAgICAgICAgICAgICBESVJFQ1RGQl9MSUJTPWAkRElSRUNURkJDT05GSUcgLS1saWJzYAorICAgICAgICAgICAgICAgIHZpZGVvX2RpcmVjdGZiPXllcworICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgaWYgdGVzdCB4JHZpZGVvX2RpcmVjdGZiID0geHllczsgdGhlbgorICAgICAgICAgICAgIyBTdVNFIDExLjEgaW5zdGFsbHMgZGlyZWN0ZmItY29uZmlnIHdpdGhvdXQgZGlyZWN0ZmItZGV2ZWwKKyAgICAgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRESVJFQ1RGQl9DRkxBR1MiCisgICAgICAgICAgICBBQ19DSEVDS19IRUFERVIoZGlyZWN0ZmIuaCwgaGF2ZV9kaXJlY3RmYl9oZHI9eWVzLCBoYXZlX2RpcmVjdGZiX2hkcj1ubykKKyAgICAgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICAgICAgICAgICAgdmlkZW9fZGlyZWN0ZmI9JGhhdmVfZGlyZWN0ZmJfaGRyCisgICAgICAgIGZpCisgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgRGlyZWN0RkIgJERJUkVDVEZCX1JFUVVJUkVEX1ZFUlNJT04gc3VwcG9ydCkKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkdmlkZW9fZGlyZWN0ZmIpCisKKyAgICAgICAgaWYgdGVzdCB4JHZpZGVvX2RpcmVjdGZiID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19EUklWRVJfRElSRUNURkIpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9kaXJlY3RmYi8qLmMiCisgICAgICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgJERJUkVDVEZCX0NGTEFHUyIKKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTICRESVJFQ1RGQl9MSUJTIgorICAgICAgICAgICAgaGF2ZV92aWRlbz15ZXMKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgb24gUGxheVN0YXRpb24gMiBoYXJkd2FyZQorQ2hlY2tQUzJHUygpCit7CisgICAgQUNfQVJHX0VOQUJMRSh2aWRlby1wczJncywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12aWRlby1wczJnc10sIFt1c2UgUGxheVN0YXRpb24gMiBHUyB2aWRlbyBkcml2ZXIgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV92aWRlb19wczJncz15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9fcHMyZ3MgPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgUGxheVN0YXRpb24gMiBHUyBzdXBwb3J0KQorICAgICAgICB2aWRlb19wczJncz1ubworICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAjaW5jbHVkZSA8bGludXgvcHMyL2Rldi5oPgorICAgICAgICAgI2luY2x1ZGUgPGxpbnV4L3BzMi9ncy5oPgorICAgICAgICBdLFsKKyAgICAgICAgXSxbCisgICAgICAgIHZpZGVvX3BzMmdzPXllcworICAgICAgICBdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCR2aWRlb19wczJncykKKyAgICAgICAgaWYgdGVzdCB4JHZpZGVvX3BzMmdzID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19EUklWRVJfUFMyR1MpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9wczJncy8qLmMiCisgICAgICAgICAgICBoYXZlX3ZpZGVvPXllcworICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBTZWUgaWYgd2UncmUgcnVubmluZyBvbiBQbGF5U3RhdGlvbiAzIENlbGwgaGFyZHdhcmUKK0NoZWNrUFMzKCkKK3sKKyAgQUNfQVJHX0VOQUJMRSh2aWRlby1wczMsCisgICAgICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLXBzM10sIFt1c2UgUGxheVN0YXRpb24gMyBDZWxsIGRyaXZlciBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAsIGVuYWJsZV92aWRlb19wczM9eWVzKQorICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19wczMgPSB4eWVzOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBQbGF5U3RhdGlvbiAzIENlbGwgc3VwcG9ydCkKKyAgICB2aWRlb19wczM9bm8KKyAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAjaW5jbHVkZSA8bGludXgvZmIuaD4KKyAgICAgICNpbmNsdWRlIDxhc20vcHMzZmIuaD4KKyAgICAgICNpbmNsdWRlIDxsaWJzcGUyLmg+CisgICAgXSxbCisgICAgXSxbCisgICAgICB2aWRlb19wczM9eWVzCisgICAgXSkKKyAgICBBQ19NU0dfUkVTVUxUKCR2aWRlb19wczMpCisgICAgaWYgdGVzdCB4JHZpZGVvX3BzMyA9IHh5ZXM7IHRoZW4KKyAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX1BTMykKKyAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL3BzMy8qLmMiCisgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgLUkvb3B0L2NlbGwvc2RrL3Vzci9pbmNsdWRlIgorICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLWxiaWxpbl9zY2FsZXJfc3B1IC1sZmJfd3JpdGVyX3NwdSAtbHl1djJyZ2Jfc3B1IC1ML29wdC9jZWxsL3Nkay91c3IvbGliIC1sc3BlMiIKKyAgICAgIGhhdmVfdmlkZW89eWVzCisgICAgZmkKKyAgZmkKK30KKworZG5sIEZpbmQgdGhlIEdHSSBpbmNsdWRlcworQ2hlY2tHR0koKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8tZ2dpLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLWdnaV0sIFt1c2UgR0dJIHZpZGVvIGRyaXZlciBbW2RlZmF1bHQ9bm9dXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9fZ2dpPW5vKQorICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW8gPSB4eWVzIC1hIHgkZW5hYmxlX3ZpZGVvX2dnaSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBHR0kgc3VwcG9ydCkKKyAgICAgICAgdmlkZW9fZ2dpPW5vCisgICAgICAgIEFDX1RSWV9DT01QSUxFKFsKKyAgICAgICAgICNpbmNsdWRlIDxnZ2kvZ2dpLmg+CisgICAgICAgICAjaW5jbHVkZSA8Z2dpL2dpaS5oPgorICAgICAgICBdLFsKKyAgICAgICAgXSxbCisgICAgICAgIHZpZGVvX2dnaT15ZXMKKyAgICAgICAgXSkKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkdmlkZW9fZ2dpKQorICAgICAgICBpZiB0ZXN0IHgkdmlkZW9fZ2dpID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19EUklWRVJfR0dJKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vZ2dpLyouYyIKKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1sZ2dpIC1sZ2lpIC1sZ2ciCisgICAgICAgICAgICBoYXZlX3ZpZGVvPXllcworICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBGaW5kIHRoZSBTVkdBbGliIGluY2x1ZGVzIGFuZCBsaWJyYXJpZXMKK0NoZWNrU1ZHQSgpCit7CisgICAgQUNfQVJHX0VOQUJMRSh2aWRlby1zdmdhLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLXN2Z2FdLCBbdXNlIFNWR0FsaWIgdmlkZW8gZHJpdmVyIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9fc3ZnYT15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9fc3ZnYSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBTVkdBbGliICgxLjQuMCspIHN1cHBvcnQpCisgICAgICAgIHZpZGVvX3N2Z2E9bm8KKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgI2luY2x1ZGUgPHZnYS5oPgorICAgICAgICAgI2luY2x1ZGUgPHZnYW1vdXNlLmg+CisgICAgICAgICAjaW5jbHVkZSA8dmdha2V5Ym9hcmQuaD4KKyAgICAgICAgXSxbCisgICAgICAgICBpZiAoIFNDQU5DT0RFX1JJR0hUV0lOICYmIFNDQU5DT0RFX0xFRlRXSU4gKSB7CisgICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgIH0KKyAgICAgICAgXSxbCisgICAgICAgIHZpZGVvX3N2Z2E9eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJHZpZGVvX3N2Z2EpCisgICAgICAgIGlmIHRlc3QgeCR2aWRlb19zdmdhID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19EUklWRVJfU1ZHQUxJQikKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL3N2Z2EvKi5jIgorICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLWx2Z2EiCisgICAgICAgICAgICBoYXZlX3ZpZGVvPXllcworICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBGaW5kIHRoZSBWR0wgaW5jbHVkZXMgYW5kIGxpYnJhcmllcworQ2hlY2tWR0woKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8tdmdsLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLXZnbF0sIFt1c2UgVkdMIHZpZGVvIGRyaXZlciBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3ZpZGVvX3ZnbD15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9fdmdsID0geHllczsgdGhlbgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxpYlZHTCBzdXBwb3J0KQorICAgICAgICB2aWRlb192Z2w9bm8KKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgI2luY2x1ZGUgPHN5cy9mYmlvLmg+CisgICAgICAgICAjaW5jbHVkZSA8c3lzL2NvbnNpby5oPgorICAgICAgICAgI2luY2x1ZGUgPHN5cy9rYmlvLmg+CisgICAgICAgICAjaW5jbHVkZSA8dmdsLmg+CisgICAgICAgIF0sWworICAgICAgICAgVkdMQml0bWFwIGJpdG1hcDsKKyAgICAgICAgIGJpdG1hcC5UeXBlID0gVklEQlVGMzI7CisgICAgICAgICBiaXRtYXAuUGl4ZWxCeXRlcyA9IDQ7CisgICAgICAgICBleGl0KGJpdG1hcC5CaXRtYXApOworICAgICAgICBdLFsKKyAgICAgICAgdmlkZW9fdmdsPXllcworICAgICAgICBdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCR2aWRlb192Z2wpCisgICAgICAgIGlmIHRlc3QgeCR2aWRlb192Z2wgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9WR0wpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby92Z2wvKi5jIgorICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLWx2Z2wiCisgICAgICAgICAgICBoYXZlX3ZpZGVvPXllcworICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBTZXQgdXAgdGhlIHdzY29ucyB2aWRlbyBkcml2ZXIgaWYgZW5hYmxlZAorQ2hlY2tXc2NvbnMoKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8td3Njb25zLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLXdzY29uc10sIFt1c2Ugd3Njb25zIHZpZGVvIGRyaXZlciBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3ZpZGVvX3dzY29ucz15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9fd3Njb25zID0geHllczsgdGhlbgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdzY29ucyBzdXBwb3J0KQorICAgICAgICB2aWRlb193c2NvbnM9bm8KKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisgICAgICAgICAjaW5jbHVkZSA8ZGV2L3dzY29ucy93c2NvbnNpby5oPgorICAgICAgICAgI2luY2x1ZGUgPGRldi93c2NvbnMvd3NkaXNwbGF5X3VzbF9pby5oPgorICAgICAgICBdLFsKKyAgICAgICAgIGludCB3c21vZGUgPSBXU0RJU1BMQVlJT19NT0RFX0RVTUJGQjsKKyAgICAgICAgXSxbCisgICAgICAgIHZpZGVvX3dzY29ucz15ZXMKKyAgICAgICAgXSkKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkdmlkZW9fd3Njb25zKQorICAgICAgICBpZiB0ZXN0IHgkdmlkZW9fd3Njb25zID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19EUklWRVJfV1NDT05TKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vd3Njb25zLyouYyIKKyAgICAgICAgICAgIGhhdmVfdmlkZW89eWVzCisgICAgICAgIGZpCisgICAgZmkKK30KKworCitkbmwgRmluZCB0aGUgQUFsaWIgaW5jbHVkZXMKK0NoZWNrQUFsaWIoKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8tYWFsaWIsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmlkZW8tYWFsaWJdLCBbdXNlIEFBbGliIHZpZGVvIGRyaXZlciBbW2RlZmF1bHQ9bm9dXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9fYWFsaWI9bm8pCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9fYWFsaWIgPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgQUFsaWIgc3VwcG9ydCkKKyAgICAgICAgdmlkZW9fYWFsaWI9bm8KKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgI2luY2x1ZGUgPGFhbGliLmg+CisgICAgICAgIF0sWworICAgICAgICBdLFsKKyAgICAgICAgdmlkZW9fYWFsaWI9eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJHZpZGVvX2FhbGliKQorICAgICAgICBpZiB0ZXN0IHgkdmlkZW9fYWFsaWIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9BQUxJQikKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL2FhbGliLyouYyIKKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1sYWEiCisgICAgICAgICAgICBoYXZlX3ZpZGVvPXllcworICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBGaW5kIHRoZSBsaWJjYWNhIGluY2x1ZGVzCitDaGVja0NhY2EoKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8tY2FjYSwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12aWRlby1jYWNhXSwgW3VzZSBsaWJjYWNhIHZpZGVvIGRyaXZlciBbW2RlZmF1bHQ9bm9dXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9fY2FjYT1ubykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19jYWNhID0geHllczsgdGhlbgorICAgICAgICB2aWRlb19jYWNhPW5vCisgICAgICAgIEFDX1BBVEhfUFJPRyhDQUNBQ09ORklHLCBjYWNhLWNvbmZpZywgbm8pCisgICAgICAgIGlmIHRlc3QgeCRDQUNBQ09ORklHICE9IHhubzsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBsaWJjYWNhIHN1cHBvcnQpCisgICAgICAgICAgICBDQUNBX0NGTEFHUz1gJENBQ0FDT05GSUcgLS1jZmxhZ3NgCisgICAgICAgICAgICBDQUNBX0xERkxBR1M9YCRDQUNBQ09ORklHIC0tbGlic2AKKyAgICAgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgICAgICNpbmNsdWRlIDxjYWNhLmg+CisgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgIHZpZGVvX2NhY2E9eWVzCisgICAgICAgICAgICBdKQorICAgICAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKCR2aWRlb19jYWNhKQorICAgICAgICAgICAgaWYgdGVzdCB4JHZpZGVvX2NhY2EgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19EUklWRVJfQ0FDQSkKKyAgICAgICAgICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgJENBQ0FfQ0ZMQUdTIgorICAgICAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTICRDQUNBX0xERkxBR1MiCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vY2FjYS8qLmMiCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBTZXQgdXAgdGhlIFFUb3BpYSB2aWRlbyBkcml2ZXIgaWYgZW5hYmxlZAorQ2hlY2tRdG9waWEoKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8tcXRvcGlhLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpZGVvLXF0b3BpYV0sIFt1c2UgUXRvcGlhIHZpZGVvIGRyaXZlciBbW2RlZmF1bHQ9bm9dXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9fcXRvcGlhPW5vKQorICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW8gPSB4eWVzIC1hIHgkZW5hYmxlX3ZpZGVvX3F0b3BpYSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBRdG9waWEgc3VwcG9ydCkKKyAgICAgICAgdmlkZW9fcXRvcGlhPW5vCisgICAgICAgIFFUT1BJQV9GTEFHUz0iLURRVF9RV1NfRUJYIC1EUVRfUVdTX0NVU1RPTSAtRFFXUyAtSSR7UVBFRElSfS9pbmNsdWRlIC1JJHtRVERJUn0vaW5jbHVkZS8gLUROT19ERUJVRyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgorICAgICAgICBBQ19MQU5HX0NQTFVTUExVUworICAgICAgICBPTERfQ1hYPSIkQ1hYRkxBR1MiCisgICAgICAgIENYWEZMQUdTPSIkUVRPUElBX0ZMQUdTIgorICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAjaW5jbHVkZSA8cXBlL3FwZWFwcGxpY2F0aW9uLmg+CisgICAgICAgIF0sWworICAgICAgICBdLFsKKyAgICAgICAgdmlkZW9fcXRvcGlhPXllcworICAgICAgICBdKQorICAgICAgICBDWFhGTEFHUz0iJE9MRF9DWFgiCisgICAgICAgIEFDX01TR19SRVNVTFQoJHZpZGVvX3F0b3BpYSkKKyAgICAgICAgaWYgdGVzdCB4JHZpZGVvX3F0b3BpYSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX1FUT1BJQSkKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL3F0b3BpYS8qLmNjIgorICAgICAgICAgICAgU0RMTUFJTl9TT1VSQ0VTPSIkc3JjZGlyL3NyYy9tYWluL3F0b3BpYS8qLmNjIgorICAgICAgICAgICAgU0RMTUFJTl9MREZMQUdTPSItc3RhdGljIgorICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTICRRVE9QSUFfRkxBR1MiCisgICAgICAgICAgICBTRExfQ0ZMQUdTPSIkU0RMX0NGTEFHUyAtRFFXUyAtRG1haW49U0RMX21haW4iCisgICAgICAgICAgICBTRExfTElCUz0iLWxTRExtYWluICRTRExfTElCUyAtTCR7UVBFRElSfS9saWIgLUwke1FURElSfS9saWIvIC1scXBlIC1scXRlIgorICAgICAgICAgICAgaGF2ZV92aWRlbz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgQUNfTEFOR19DCisgICAgZmkKK30KKworZG5sIFNldCB1cCB0aGUgUGljb0dVSSB2aWRlbyBkcml2ZXIgaWYgZW5hYmxlZAorQ2hlY2tQaWNvR1VJKCkKK3sKKyAgICBBQ19BUkdfRU5BQkxFKHZpZGVvLXBpY29ndWksCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmlkZW8tcGljb2d1aV0sIFt1c2UgUGljb0dVSSB2aWRlbyBkcml2ZXIgW1tkZWZhdWx0PW5vXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3ZpZGVvX3BpY29ndWk9bm8pCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9fcGljb2d1aSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBQaWNvR1VJIHN1cHBvcnQpCisgICAgICAgIHZpZGVvX3BpY29ndWk9bm8KKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgI2luY2x1ZGUgPHBpY29ndWkuaD4KKyAgICAgICAgXSxbCisgICAgICAgIF0sWworICAgICAgICB2aWRlb19waWNvZ3VpPXllcworICAgICAgICBdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCR2aWRlb19waWNvZ3VpKQorICAgICAgICBpZiB0ZXN0IHgkdmlkZW9fcGljb2d1aSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX1BJQ09HVUkpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9waWNvZ3VpLyouYyIKKyAgICAgICAgICAgIFNETF9MSUJTPSIkU0RMX0xJQlMgLWxwZ3VpIgorICAgICAgICAgICAgaGF2ZV92aWRlbz15ZXMKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgU2V0IHVwIHRoZSBBdGFyaSBCaW9zIGtleWJvYXJkIGRyaXZlcgorQ2hlY2tBdGFyaUJpb3NFdmVudCgpCit7CisgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vYXRhcmljb21tb24vKi5jIgorICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL2F0YXJpY29tbW9uLyouUyIKK30KKworZG5sIFNldCB1cCB0aGUgQXRhcmkgWGJpb3MgZHJpdmVyCitDaGVja0F0YXJpWGJpb3NWaWRlbygpCit7CisgICAgQUNfQVJHX0VOQUJMRSh4YmlvcywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12aWRlby14Ymlvc10sIFt1c2UgQXRhcmkgWGJpb3MgdmlkZW8gZHJpdmVyIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9feGJpb3M9eWVzKQorICAgIHZpZGVvX3hiaW9zPW5vCisgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXMgLWEgeCRlbmFibGVfdmlkZW9feGJpb3MgPSB4eWVzOyB0aGVuCisgICAgICAgIHZpZGVvX3hiaW9zPXllcworICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9YQklPUykKKyAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8veGJpb3MvKi5jIgorICAgICAgICBoYXZlX3ZpZGVvPXllcworICAgIGZpCit9CisKK2RubCBTZXQgdXAgdGhlIEF0YXJpIEdlbSBkcml2ZXIKK0NoZWNrQXRhcmlHZW1WaWRlbygpCit7CisgICAgQUNfQVJHX0VOQUJMRShnZW0sCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmlkZW8tZ2VtXSwgW3VzZSBBdGFyaSBHZW0gdmlkZW8gZHJpdmVyIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfdmlkZW9fZ2VtPXllcykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19nZW0gPSB4eWVzOyB0aGVuCisgICAgICAgIHZpZGVvX2dlbT1ubworICAgICAgICBBQ19DSEVDS19IRUFERVIoZ2VtLmgsIGhhdmVfZ2VtX2hkcj15ZXMpCisgICAgICAgIEFDX0NIRUNLX0xJQihnZW0sIGFwcGxfaW5pdCwgaGF2ZV9nZW1fbGliPXllcykKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfZ2VtX2hkciA9IHh5ZXMgLWEgeCRoYXZlX2dlbV9saWIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICB2aWRlb19nZW09eWVzCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9HRU0pCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9nZW0vKi5jIgorICAgICAgICAgICAgU0RMX0xJQlM9IiRTRExfTElCUyAtbGdlbSIKKyAgICAgICAgICAgIGhhdmVfdmlkZW89eWVzCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIHJjZzA0MTcyMDAxIFNldCB1cCB0aGUgTnVsbCB2aWRlbyBkcml2ZXIuCitDaGVja0R1bW15VmlkZW8oKQoreworICAgIEFDX0FSR19FTkFCTEUodmlkZW8tZHVtbXksCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmlkZW8tZHVtbXldLCBbdXNlIGR1bW15IHZpZGVvIGRyaXZlciBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3ZpZGVvX2R1bW15PXllcykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvX2R1bW15ID0geHllczsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9EVU1NWSkKKyAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vZHVtbXkvKi5jIgorICAgICAgICBoYXZlX3ZpZGVvPXllcworICAgIGZpCit9CisKK2RubCBDaGVjayB0byBzZWUgaWYgT3BlbkdMIHN1cHBvcnQgaXMgZGVzaXJlZAorQUNfQVJHX0VOQUJMRSh2aWRlby1vcGVuZ2wsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmlkZW8tb3BlbmdsXSwgW2luY2x1ZGUgT3BlbkdMIGNvbnRleHQgY3JlYXRpb24gW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICwgZW5hYmxlX3ZpZGVvX29wZW5nbD15ZXMpCisKK2RubCBGaW5kIE9wZW5HTAorQ2hlY2tPcGVuR0xYMTEoKQoreworICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW8gPSB4eWVzIC1hIHgkZW5hYmxlX3ZpZGVvX29wZW5nbCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBPcGVuR0wgKEdMWCkgc3VwcG9ydCkKKyAgICAgICAgdmlkZW9fb3BlbmdsPW5vCisgICAgICAgIEFDX1RSWV9DT01QSUxFKFsKKyAgICAgICAgICNpbmNsdWRlIDxHTC9nbC5oPgorICAgICAgICAgI2luY2x1ZGUgPEdML2dseC5oPgorICAgICAgICAgI2luY2x1ZGUgPEdML2dsdS5oPgorICAgICAgICBdLFsKKyAgICAgICAgXSxbCisgICAgICAgIHZpZGVvX29wZW5nbD15ZXMKKyAgICAgICAgXSkKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkdmlkZW9fb3BlbmdsKQorICAgICAgICBpZiB0ZXN0IHgkdmlkZW9fb3BlbmdsID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9WSURFT19PUEVOR0wpCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX09QRU5HTF9HTFgpCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIEZpbmQgUU5YIFJ0UCBPcGVuR0wKK0NoZWNrT3BlbkdMUU5YKCkKK3sKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19vcGVuZ2wgPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgT3BlbkdMIChQaG90b24pIHN1cHBvcnQpCisgICAgICAgIHZpZGVvX29wZW5nbD1ubworICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAjaW5jbHVkZSA8R0wvZ2wuaD4KKyAgICAgICAgXSxbCisgICAgICAgIF0sWworICAgICAgICB2aWRlb19vcGVuZ2w9eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJHZpZGVvX29wZW5nbCkKKyAgICAgICAgaWYgdGVzdCB4JHZpZGVvX29wZW5nbCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fT1BFTkdMKQorICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLWxHTCIKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgQ2hlY2sgZm9yIFdpbjMyIE9wZW5HTAorQ2hlY2tXSU4zMkdMKCkKK3sKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19vcGVuZ2wgPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX0RFRklORShTRExfVklERU9fT1BFTkdMKQorICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX09QRU5HTF9XR0wpCisgICAgZmkKK30KKworZG5sIENoZWNrIGZvciBCZU9TIE9wZW5HTAorQ2hlY2tCZUdMKCkKK3sKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19vcGVuZ2wgPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX0RFRklORShTRExfVklERU9fT1BFTkdMKQorICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtbEdMIgorICAgIGZpCit9CisKK2RubCBDaGVjayBmb3IgTWFjT1MgT3BlbkdMCitDaGVja01hY0dMKCkKK3sKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19vcGVuZ2wgPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX0RFRklORShTRExfVklERU9fT1BFTkdMKQorICAgICAgICBjYXNlICIkaG9zdCIgaW4KKyAgICAgICAgICAgICotKi1kYXJ3aW4qKQorICAgICAgICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW9fY29jb2EgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1XbCwtZnJhbWV3b3JrLE9wZW5HTCIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW9fY2FyYm9uID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtV2wsLWZyYW1ld29yayxBR0wiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgZXNhYworICAgIGZpCit9CisKK2RubCBDaGVjayBmb3IgTWVzYSBvZmZzY3JlZW4gcmVuZGVyaW5nCitDaGVja0F0YXJpT1NNZXNhKCkKK3sKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV92aWRlbyIgPSAieHllcyIgLWEgIngkZW5hYmxlX3ZpZGVvX29wZW5nbCIgPSAieHllcyI7IHRoZW4KKyAgICAgICAgQUNfQ0hFQ0tfSEVBREVSKEdML29zbWVzYS5oLCBoYXZlX29zbWVzYV9oZHI9eWVzKQorICAgICAgICBBQ19DSEVDS19MSUIoT1NNZXNhLCBPU01lc2FDcmVhdGVDb250ZXh0LCBoYXZlX29zbWVzYV9saWI9eWVzLCBoYXZlX29zbWVzYV9saWI9bm8sIC1sbSkKKworICAgICAgICAjIFN0YXRpYyBsaW5raW5nIHRvIC1sT1NNZXNhCisgICAgICAgIEFDX1BBVEhfUFJPRyhPU01FU0FfQ09ORklHLCBvc21lc2EtY29uZmlnLCBubykKKyAgICAgICAgaWYgdGVzdCAieCRPU01FU0FfQ09ORklHIiA9ICJ4bm8iIC1vICJ4JGVuYWJsZV9hdGFyaV9sZGciID0gInhubyI7IHRoZW4KKyAgICAgICAgICAgICMgLWxPU01lc2EgaXMgcmVhbGx5IHRoZSBzdGF0aWMgbGlicmFyeQorICAgICAgICAgICAgaWYgdGVzdCAieCRoYXZlX29zbWVzYV9oZHIiID0gInh5ZXMiIC1hICJ4JGhhdmVfb3NtZXNhX2xpYiIgPSAieHllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBPU01FU0FfTElCUz0iLWxPU01lc2EiCisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICAjIC1sT1NNZXNhIGlzIGEgbG9hZGVyIGZvciBPU01lc2EubGRnCisgICAgICAgICAgICBPU01FU0FfQ0ZMQUdTPWAkT1NNRVNBX0NPTkZJRyAtLWNmbGFnc2AKKyAgICAgICAgICAgIE9TTUVTQV9MSUJTPWAkT1NNRVNBX0NPTkZJRyAtLWxpYnNgCisgICAgICAgIGZpCisgICAgICAgIEFDX0RFRklORShTRExfVklERU9fT1BFTkdMKQorICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX09QRU5HTF9PU01FU0EpCisgICAgICAgIFNETF9DRkxBR1M9IiRTRExfQ0ZMQUdTICRPU01FU0FfQ0ZMQUdTIgorICAgICAgICBTRExfTElCUz0iJFNETF9MSUJTICRPU01FU0FfTElCUyIKKworICAgICAgICBBQ19BUkdfRU5BQkxFKG9zbWVzYS1zaGFyZWQsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtb3NtZXNhLXNoYXJlZF0sIFtkeW5hbWljYWxseSBsb2FkIE9TTWVzYSBPcGVuR0wgc3VwcG9ydCBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZW5hYmxlX29zbWVzYV9zaGFyZWQ9eWVzKQorICAgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9vc21lc2Ffc2hhcmVkIiA9ICJ4eWVzIiAtYSAieCRlbmFibGVfYXRhcmlfbGRnIiA9ICJ4eWVzIjsgdGhlbgorICAgICAgICAgICAgIyBEeW5hbWljIGxpbmtpbmcKKyAgICAgICAgICAgIGlmIHRlc3QgIngkaGF2ZV9vc21lc2FfaGRyIiA9ICJ4eWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fT1BFTkdMX09TTUVTQV9EWU5BTUlDKQorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitBQ19BUkdfRU5BQkxFKHNjcmVlbnNhdmVyLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNjcmVlbnNhdmVyXSwgW2VuYWJsZSBzY3JlZW5zYXZlciBieSBkZWZhdWx0IHdoaWxlIGFueSBTREwgYXBwbGljYXRpb24gaXMgcnVubmluZyBbW2RlZmF1bHQ9bm9dXV0pLAorICAgICAgICAgICAgICAsIGVuYWJsZV9zY3JlZW5zYXZlcj1ubykKK2lmIHRlc3QgeCRlbmFibGVfc2NyZWVuc2F2ZXIgPSB4bm87IHRoZW4KKyAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RJU0FCTEVfU0NSRUVOU0FWRVIpCitmaQorCitkbmwgU2VlIGlmIHdlIGNhbiB1c2UgdGhlIG5ldyB1bmlmaWVkIGV2ZW50IGludGVyZmFjZSBpbiBMaW51eCAyLjQKK0NoZWNrSW5wdXRFdmVudHMoKQoreworICAgIGRubCBDaGVjayBmb3IgTGludXggMi40IHVuaWZpZWQgaW5wdXQgZXZlbnQgaW50ZXJmYWNlIHN1cHBvcnQKKyAgICBBQ19BUkdfRU5BQkxFKGlucHV0LWV2ZW50cywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1pbnB1dC1ldmVudHNdLCBbdXNlIExpbnV4IDIuNCB1bmlmaWVkIGlucHV0IGludGVyZmFjZSBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX2lucHV0X2V2ZW50cz15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV9pbnB1dF9ldmVudHMgPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgTGludXggMi40IHVuaWZpZWQgaW5wdXQgaW50ZXJmYWNlKQorICAgICAgICB1c2VfaW5wdXRfZXZlbnRzPW5vCisgICAgICAgIEFDX1RSWV9DT01QSUxFKFsKKyAgICAgICAgICAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyAgICAgICAgXSxbCisgICAgICAgICAgI2lmbmRlZiBFVklPQ0dOQU1FCisgICAgICAgICAgI2Vycm9yIEVWSU9DR05BTUUoKSBpb2N0bCBub3QgYXZhaWxhYmxlCisgICAgICAgICAgI2VuZGlmCisgICAgICAgIF0sWworICAgICAgICB1c2VfaW5wdXRfZXZlbnRzPXllcworICAgICAgICBdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCR1c2VfaW5wdXRfZXZlbnRzKQorICAgICAgICBpZiB0ZXN0IHgkdXNlX2lucHV0X2V2ZW50cyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfSU5QVVRfTElOVVhFVikKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgU2VlIGlmIHdlIGNhbiB1c2UgdGhlIFRvdWNoc2NyZWVuIGlucHV0IGxpYnJhcnkKK0NoZWNrVHNsaWIoKQoreworICAgIEFDX0FSR19FTkFCTEUoaW5wdXQtdHNsaWIsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtaW5wdXQtdHNsaWJdLCBbdXNlIHRoZSBUb3VjaHNjcmVlbiBsaWJyYXJ5IGZvciBpbnB1dCBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX2lucHV0X3RzbGliPXllcykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2lucHV0X3RzbGliID0geHllczsgdGhlbgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFRvdWNoc2NyZWVuIGxpYnJhcnkgc3VwcG9ydCkKKyAgICAgICAgZW5hYmxlX2lucHV0X3RzbGliPW5vCisgICAgICAgIEFDX1RSWV9DT01QSUxFKFsKKyAgICAgICAgICAjaW5jbHVkZSAidHNsaWIuaCIKKyAgICAgICAgXSxbCisgICAgICAgIF0sWworICAgICAgICBlbmFibGVfaW5wdXRfdHNsaWI9eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJGVuYWJsZV9pbnB1dF90c2xpYikKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9pbnB1dF90c2xpYiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfSU5QVVRfVFNMSUIpCisgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtbHRzIgorICAgICAgICBmaQorICAgIGZpCit9CisKK2RubCBTZWUgaWYgd2UgY2FuIHVzZSBHTlUgcHRoIGxpYnJhcnkgZm9yIHRocmVhZHMKK0NoZWNrUFRIKCkKK3sKKyAgICBkbmwgQ2hlY2sgZm9yIHB0aCBzdXBwb3J0CisgICAgQUNfQVJHX0VOQUJMRShwdGgsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtcHRoXSwgW3VzZSBHTlUgcHRoIGxpYnJhcnkgZm9yIG11bHRpLXRocmVhZGluZyBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3B0aD15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV90aHJlYWRzID0geHllcyAtYSB4JGVuYWJsZV9wdGggPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX1BBVEhfUFJPRyhQVEhfQ09ORklHLCBwdGgtY29uZmlnLCBubykKKyAgICAgICAgaWYgdGVzdCAiJFBUSF9DT05GSUciID0gIm5vIjsgdGhlbgorICAgICAgICAgICAgdXNlX3B0aD1ubworICAgICAgICBlbHNlCisgICAgICAgICAgICB1c2VfcHRoPXllcworICAgICAgICBmaQorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcocHRoKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCR1c2VfcHRoKQorICAgICAgICBpZiB0ZXN0ICJ4JHVzZV9wdGgiID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9USFJFQURfUFRIKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdGhyZWFkL3B0aC8qLmMiCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzc2VtLmMiCisgICAgICAgICAgICBTRExfQ0ZMQUdTPSIkU0RMX0NGTEFHUyBgJFBUSF9DT05GSUcgLS1jZmxhZ3NgIgorICAgICAgICAgICAgU0RMX0xJQlM9IiRTRExfTElCUyBgJFBUSF9DT05GSUcgLS1saWJzIC0tYWxsYCIKKyAgICAgICAgICAgIGhhdmVfdGhyZWFkcz15ZXMKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgU2VlIHdoYXQgdHlwZSBvZiB0aHJlYWQgbW9kZWwgdG8gdXNlIG9uIExpbnV4IGFuZCBTb2xhcmlzCitDaGVja1BUSFJFQUQoKQoreworICAgIGRubCBDaGVjayBmb3IgcHRocmVhZCBzdXBwb3J0CisgICAgQUNfQVJHX0VOQUJMRShwdGhyZWFkcywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wdGhyZWFkc10sIFt1c2UgUE9TSVggdGhyZWFkcyBmb3IgbXVsdGktdGhyZWFkaW5nIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfcHRocmVhZHM9eWVzKQorICAgIGRubCBUaGlzIGlzIHVzZWQgb24gTGludXggZm9yIGdsaWJjIGJpbmFyeSBjb21wYXRpYmlsaXR5IChEb2ghKQorICAgIEFDX0FSR19FTkFCTEUocHRocmVhZC1zZW0sCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtcHRocmVhZC1zZW1dLCBbdXNlIHB0aHJlYWQgc2VtYXBob3JlcyBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3B0aHJlYWRfc2VtPXllcykKKyAgICBjYXNlICIkaG9zdCIgaW4KKyAgICAgICAgKi0qLWxpbnV4KnwqLSotdWNsaW51eCopCisgICAgICAgICAgICBwdGhyZWFkX2NmbGFncz0iLURfUkVFTlRSQU5UIgorICAgICAgICAgICAgcHRocmVhZF9saWI9Ii1scHRocmVhZCIKKyAgICAgICAgICAgIDs7CisgICAgICAgICotKi1ic2RpKikKKyAgICAgICAgICAgIHB0aHJlYWRfY2ZsYWdzPSItRF9SRUVOVFJBTlQgLURfVEhSRUFEX1NBRkUiCisgICAgICAgICAgICBwdGhyZWFkX2xpYj0iIgorICAgICAgICAgICAgOzsKKyAgICAgICAgKi0qLWRhcndpbiopCisgICAgICAgICAgICBwdGhyZWFkX2NmbGFncz0iLURfVEhSRUFEX1NBRkUiCisjIGNhdXNlcyBDYXJib24ucCBjb21wbGFpbnRzPworIyAgICAgICAgICAgIHB0aHJlYWRfY2ZsYWdzPSItRF9SRUVOVFJBTlQgLURfVEhSRUFEX1NBRkUiCisgICAgICAgICAgICA7OworICAgICAgICAqLSotZnJlZWJzZCp8Ki0qLWRyYWdvbmZseSopCisgICAgICAgICAgICBwdGhyZWFkX2NmbGFncz0iLURfUkVFTlRSQU5UIC1EX1RIUkVBRF9TQUZFIgorICAgICAgICAgICAgcHRocmVhZF9saWI9Ii1wdGhyZWFkIgorICAgICAgICAgICAgOzsKKyAgICAgICAgKi0qLW5ldGJzZCopCisgICAgICAgICAgICBwdGhyZWFkX2NmbGFncz0iLURfUkVFTlRSQU5UIC1EX1RIUkVBRF9TQUZFIgorICAgICAgICAgICAgcHRocmVhZF9saWI9Ii1scHRocmVhZCIKKyAgICAgICAgICAgIDs7CisgICAgICAgICotKi1vcGVuYnNkKikKKyAgICAgICAgICAgIHB0aHJlYWRfY2ZsYWdzPSItRF9SRUVOVFJBTlQiCisgICAgICAgICAgICBwdGhyZWFkX2xpYj0iLXB0aHJlYWQiCisgICAgICAgICAgICA7OworICAgICAgICAqLSotc29sYXJpcyopCisgICAgICAgICAgICBwdGhyZWFkX2NmbGFncz0iLURfUkVFTlRSQU5UIgorICAgICAgICAgICAgcHRocmVhZF9saWI9Ii1scHRocmVhZCAtbHBvc2l4NCIKKyAgICAgICAgICAgIDs7CisgICAgICAgICotKi1zeXN2NSopCisgICAgICAgICAgICBwdGhyZWFkX2NmbGFncz0iLURfUkVFTlRSQU5UIC1LdGhyZWFkIgorICAgICAgICAgICAgcHRocmVhZF9saWI9IiIKKyAgICAgICAgICAgIDs7CisgICAgICAgICotKi1pcml4KikKKyAgICAgICAgICAgIHB0aHJlYWRfY2ZsYWdzPSItRF9TR0lfTVBfU09VUkNFIgorICAgICAgICAgICAgcHRocmVhZF9saWI9Ii1scHRocmVhZCIKKyAgICAgICAgICAgIDs7CisgICAgICAgICotKi1haXgqKQorICAgICAgICAgICAgcHRocmVhZF9jZmxhZ3M9Ii1EX1JFRU5UUkFOVCAtbXRocmVhZHMiCisgICAgICAgICAgICBwdGhyZWFkX2xpYj0iLWxwdGhyZWFkIgorICAgICAgICAgICAgOzsKKyAgICAgICAgKi0qLWhwdXgxMSopCisgICAgICAgICAgICBwdGhyZWFkX2NmbGFncz0iLURfUkVFTlRSQU5UIgorICAgICAgICAgICAgcHRocmVhZF9saWI9Ii1ML3Vzci9saWIgLWxwdGhyZWFkIgorICAgICAgICAgICAgOzsKKyAgICAgICAgKi0qLXFueCopCisgICAgICAgICAgICBwdGhyZWFkX2NmbGFncz0iIgorICAgICAgICAgICAgcHRocmVhZF9saWI9IiIKKyAgICAgICAgICAgIDs7CisgICAgICAgICotKi1vc2YqKQorICAgICAgICAgICAgcHRocmVhZF9jZmxhZ3M9Ii1EX1JFRU5UUkFOVCIKKyAgICAgICAgICAgIGlmIHRlc3QgeCRhY19jdl9wcm9nX2djYyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBwdGhyZWFkX2xpYj0iLWxwdGhyZWFkIC1scnQiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHRocmVhZF9saWI9Ii1scHRocmVhZCAtbGV4YyAtbHJ0IgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwdGhyZWFkX2NmbGFncz0iLURfUkVFTlRSQU5UIgorICAgICAgICAgICAgcHRocmVhZF9saWI9Ii1scHRocmVhZCIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgeCRlbmFibGVfdGhyZWFkcyA9IHh5ZXMgLWEgeCRlbmFibGVfcHRocmVhZHMgPSB4eWVzIC1hIHgkZW5hYmxlX2lwb2QgIT0geHllczsgdGhlbgorICAgICAgICAjIFNhdmUgdGhlIG9yaWdpbmFsIGNvbXBpbGVyIGZsYWdzIGFuZCBsaWJyYXJpZXMKKyAgICAgICAgYWNfc2F2ZV9jZmxhZ3M9IiRDRkxBR1MiOyBhY19zYXZlX2xpYnM9IiRMSUJTIgorICAgICAgICAjIEFkZCB0aGUgcHRocmVhZCBjb21waWxlciBmbGFncyBhbmQgbGlicmFyaWVzCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkcHRocmVhZF9jZmxhZ3MiOyBMSUJTPSIkTElCUyAkcHRocmVhZF9saWIiCisgICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgcHRocmVhZCBzdXBwb3J0IG9uIHRoaXMgc3lzdGVtCisgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgcHRocmVhZHMpCisgICAgICAgIHVzZV9wdGhyZWFkcz1ubworICAgICAgICBBQ19UUllfTElOSyhbCisgICAgICAgICAjaW5jbHVkZSA8cHRocmVhZC5oPgorICAgICAgICBdLFsKKyAgICAgICAgIHB0aHJlYWRfYXR0cl90IHR5cGU7CisgICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgmdHlwZSk7CisgICAgICAgIF0sWworICAgICAgICB1c2VfcHRocmVhZHM9eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJHVzZV9wdGhyZWFkcykKKyAgICAgICAgIyBSZXN0b3JlIHRoZSBjb21waWxlciBmbGFncyBhbmQgbGlicmFyaWVzCisgICAgICAgIENGTEFHUz0iJGFjX3NhdmVfY2ZsYWdzIjsgTElCUz0iJGFjX3NhdmVfbGlicyIKKworICAgICAgICAjIERvIGZ1dGhlciB0ZXN0aW5nIGlmIHdlIGhhdmUgcHRocmVhZCBzdXBwb3J0Li4uCisgICAgICAgIGlmIHRlc3QgeCR1c2VfcHRocmVhZHMgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1RIUkVBRF9QVEhSRUFEKQorICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTICRwdGhyZWFkX2NmbGFncyIKKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTICRwdGhyZWFkX2xpYiIKKyAgICAgICAgICAgIFNETF9DRkxBR1M9IiRTRExfQ0ZMQUdTICRwdGhyZWFkX2NmbGFncyIKKyAgICAgICAgICAgIFNETF9MSUJTPSIkU0RMX0xJQlMgJHB0aHJlYWRfbGliIgorCisgICAgICAgICAgICAjIFNhdmUgdGhlIG9yaWdpbmFsIGNvbXBpbGVyIGZsYWdzIGFuZCBsaWJyYXJpZXMKKyAgICAgICAgICAgIGFjX3NhdmVfY2ZsYWdzPSIkQ0ZMQUdTIjsgYWNfc2F2ZV9saWJzPSIkTElCUyIKKyAgICAgICAgICAgICMgQWRkIHRoZSBwdGhyZWFkIGNvbXBpbGVyIGZsYWdzIGFuZCBsaWJyYXJpZXMKKyAgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkcHRocmVhZF9jZmxhZ3MiOyBMSUJTPSIkTElCUyAkcHRocmVhZF9saWIiCisKKyAgICAgICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHJlY3Vyc2l2ZSBtdXRleGVzIGFyZSBhdmFpbGFibGUKKyAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgcmVjdXJzaXZlIG11dGV4ZXMpCisgICAgICAgICAgICBoYXNfcmVjdXJzaXZlX211dGV4ZXM9bm8KKyAgICAgICAgICAgIGlmIHRlc3QgeCRoYXNfcmVjdXJzaXZlX211dGV4ZXMgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgICAgICAgICAjaW5jbHVkZSA8cHRocmVhZC5oPgorICAgICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfdCBhdHRyOworICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmYXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOworICAgICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgIGhhc19yZWN1cnNpdmVfbXV0ZXhlcz15ZXMKKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1RIUkVBRF9QVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWCkKKyAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGlmIHRlc3QgeCRoYXNfcmVjdXJzaXZlX211dGV4ZXMgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgICAgICAgICAjaW5jbHVkZSA8cHRocmVhZC5oPgorICAgICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfdCBhdHRyOworICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucCgmYXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOworICAgICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgIGhhc19yZWN1cnNpdmVfbXV0ZXhlcz15ZXMKKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1RIUkVBRF9QVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9OUCkKKyAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoJGhhc19yZWN1cnNpdmVfbXV0ZXhlcykKKworICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgcHRocmVhZCBzZW1hcGhvcmUgc3VwcG9ydCBpcyBtaXNzaW5nCisgICAgICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX3B0aHJlYWRfc2VtID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgcHRocmVhZCBzZW1hcGhvcmVzKQorICAgICAgICAgICAgICAgIGhhdmVfcHRocmVhZF9zZW09bm8KKyAgICAgICAgICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgICAgICAgICAjaW5jbHVkZSA8cHRocmVhZC5oPgorICAgICAgICAgICAgICAgICAgI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgorICAgICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgIGhhdmVfcHRocmVhZF9zZW09eWVzCisgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKCRoYXZlX3B0aHJlYWRfc2VtKQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGlmIHRlc3QgeCRoYXZlX3B0aHJlYWRfc2VtID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3Igc2VtX3RpbWVkd2FpdCkKKyAgICAgICAgICAgICAgICBoYXZlX3NlbV90aW1lZHdhaXQ9bm8KKyAgICAgICAgICAgICAgICBBQ19UUllfTElOSyhbCisgICAgICAgICAgICAgICAgICAjaW5jbHVkZSA8cHRocmVhZC5oPgorICAgICAgICAgICAgICAgICAgI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgorICAgICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgICAgc2VtX3RpbWVkd2FpdChOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgICAgICBoYXZlX3NlbV90aW1lZHdhaXQ9eWVzCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfU0VNX1RJTUVEV0FJVCkKKyAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoJGhhdmVfc2VtX3RpbWVkd2FpdCkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICMgUmVzdG9yZSB0aGUgY29tcGlsZXIgZmxhZ3MgYW5kIGxpYnJhcmllcworICAgICAgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9jZmxhZ3MiOyBMSUJTPSIkYWNfc2F2ZV9saWJzIgorCisgICAgICAgICAgICAjIEJhc2ljIHRocmVhZCBjcmVhdGlvbiBmdW5jdGlvbnMKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXN0aHJlYWQuYyIKKworICAgICAgICAgICAgIyBTZW1hcGhvcmVzCisgICAgICAgICAgICAjIFdlIGNhbiBmYWtlIHRoZXNlIHdpdGggbXV0ZXhlcyBhbmQgY29uZGl0aW9uIHZhcmlhYmxlcyBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmIHRlc3QgeCRoYXZlX3B0aHJlYWRfc2VtID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXNzZW0uYyIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzc2VtLmMiCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAjIE11dGV4ZXMKKyAgICAgICAgICAgICMgV2UgY2FuIGZha2UgdGhlc2Ugd2l0aCBzZW1hcGhvcmVzIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c211dGV4LmMiCisKKyAgICAgICAgICAgICMgQ29uZGl0aW9uIHZhcmlhYmxlcworICAgICAgICAgICAgIyBXZSBjYW4gZmFrZSB0aGVzZSB3aXRoIHNlbWFwaG9yZXMgYW5kIG11dGV4ZXMgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzY29uZC5jIgorCisgICAgICAgICAgICBoYXZlX3RocmVhZHM9eWVzCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENoZWNrUFRICisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIERldGVybWluZSB3aGV0aGVyIHRoZSBjb21waWxlciBjYW4gcHJvZHVjZSBXaW4zMiBleGVjdXRhYmxlcworQ2hlY2tXSU4zMigpCit7CisgICAgQUNfTVNHX0NIRUNLSU5HKFdpbjMyIGNvbXBpbGVyKQorICAgIGhhdmVfd2luMzJfZ2NjPW5vCisgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAjaW5jbHVkZSA8d2luZG93cy5oPgorICAgIF0sWworICAgIF0sWworICAgIGhhdmVfd2luMzJfZ2NjPXllcworICAgIF0pCisgICAgQUNfTVNHX1JFU1VMVCgkaGF2ZV93aW4zMl9nY2MpCisgICAgaWYgdGVzdCB4JGhhdmVfd2luMzJfZ2NjICE9IHh5ZXM7IHRoZW4KKyAgICAgICBBQ19NU0dfRVJST1IoWworKioqIFlvdXIgY29tcGlsZXIgKCRDQykgZG9lcyBub3QgcHJvZHVjZSBXaW4zMiBleGVjdXRhYmxlcyEKKyAgICAgICBdKQorICAgIGZpCisKKyAgICBkbmwgU2VlIGlmIHRoZSB1c2VyIHdhbnRzIHRvIHJlZGlyZWN0IHN0YW5kYXJkIG91dHB1dCB0byBmaWxlcworICAgIEFDX0FSR19FTkFCTEUoc3RkaW8tcmVkaXJlY3QsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RkaW8tcmVkaXJlY3RdLCBbUmVkaXJlY3QgU1RESU8gdG8gZmlsZXMgb24gV2luMzIgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV9zdGRpb19yZWRpcmVjdD15ZXMpCisgICAgaWYgdGVzdCB4JGVuYWJsZV9zdGRpb19yZWRpcmVjdCAhPSB4eWVzOyB0aGVuCisgICAgICAgIEVYVFJBX0NGTEFHUz0iJEVYVFJBX0NGTEFHUyAtRE5PX1NURElPX1JFRElSRUNUIgorICAgIGZpCisKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllczsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoU0RMX1ZJREVPX0RSSVZFUl9XSU5ESUIpCisgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL3dpbmNvbW1vbi8qLmMiCisgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL3dpbmRpYi8qLmMiCisgICAgICAgIGhhdmVfdmlkZW89eWVzCisgICAgZmkKK30KKworZG5sIEZpbmQgdGhlIERpcmVjdFggaW5jbHVkZXMgYW5kIGxpYnJhcmllcworQ2hlY2tESVJFQ1RYKCkKK3sKKyAgICBBQ19BUkdfRU5BQkxFKGRpcmVjdHgsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZGlyZWN0eF0sIFt1c2UgRGlyZWN0WCBmb3IgV2luMzIgYXVkaW8vdmlkZW8gW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV9kaXJlY3R4PXllcykKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2RpcmVjdHggPSB4eWVzOyB0aGVuCisgICAgICAgIGhhdmVfZGlyZWN0eD1ubworICAgICAgICBBQ19DSEVDS19IRUFERVIoZGRyYXcuaCwgaGF2ZV9kZHJhdz15ZXMpCisgICAgICAgIEFDX0NIRUNLX0hFQURFUihkc291bmQuaCwgaGF2ZV9kc291bmQ9eWVzKQorICAgICAgICBBQ19DSEVDS19IRUFERVIoZGlucHV0LmgsIHVzZV9kaW5wdXQ9eWVzKQorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9kZHJhdyA9IHh5ZXMgLWEgeCRoYXZlX2Rzb3VuZCA9IHh5ZXMgLWEgeCR1c2VfZGlucHV0ID0geHllczsgdGhlbgorICAgICAgICAgICAgaGF2ZV9kaXJlY3R4PXllcworICAgICAgICBmaQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGhhdmVfZGlyZWN0eCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX0REUkFXKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdmlkZW8vd2luZHg1LyouYyIKKyAgICAgICAgICAgIGhhdmVfdmlkZW89eWVzCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIENoZWNrIGZvciB0aGUgZGxmY24uaCBpbnRlcmZhY2UgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgb2JqZWN0cworQ2hlY2tETE9QRU4oKQoreworICAgIEFDX0FSR19FTkFCTEUoc2RsLWRsb3BlbiwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zZGwtZGxvcGVuXSwgW3VzZSBkbG9wZW4gZm9yIHNoYXJlZCBvYmplY3QgbG9hZGluZyBbW2RlZmF1bHQ9eWVzXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX3NkbF9kbG9wZW49eWVzKQorICAgIGlmIHRlc3QgeCRlbmFibGVfc2RsX2Rsb3BlbiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBkbG9wZW4pCisgICAgICAgIGhhdmVfZGxvcGVuPW5vCisgICAgICAgIEFDX1RSWV9DT01QSUxFKFsKKyAgICAgICAgICNpbmNsdWRlIDxkbGZjbi5oPgorICAgICAgICBdLFsKKyAgICAgICAgICNpZiBkZWZpbmVkKE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEKSAmJiBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSAxMDIwCisgICAgICAgICAjZXJyb3IgVXNlIGRsY29tcGF0IGZvciBNYWMgT1MgWCAxMC4yIGNvbXBhdGliaWxpdHkKKyAgICAgICAgICNlbmRpZgorICAgICAgICBdLFsKKyAgICAgICAgaGF2ZV9kbG9wZW49eWVzCisgICAgICAgIF0pCisgICAgICAgIEFDX01TR19SRVNVTFQoJGhhdmVfZGxvcGVuKQorCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX2Rsb3BlbiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0NIRUNLX0xJQihjLCBkbG9wZW4sIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIiwKKyAgICAgICAgICAgICAgIEFDX0NIRUNLX0xJQihkbCwgZGxvcGVuLCBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtbGRsIiwKKyAgICAgICAgICAgICAgICAgIEFDX0NIRUNLX0xJQihsdGRsLCBkbG9wZW4sIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1sbHRkbCIpKSkKKyAgICAgICAgICAgIEFDX0RFRklORShTRExfTE9BRFNPX0RMT1BFTikKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2xvYWRzby9kbG9wZW4vKi5jIgorICAgICAgICAgICAgaGF2ZV9sb2Fkc289eWVzCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIFNldCB1cCB0aGUgQXRhcmkgTERHIChzaGFyZWQgb2JqZWN0IGxvYWRlcikKK0NoZWNrQXRhcmlMZGcoKQoreworICAgIEFDX0FSR19FTkFCTEUoYXRhcmktbGRnLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWF0YXJpLWxkZ10sIFt1c2UgQXRhcmkgTERHIGZvciBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgW1tkZWZhdWx0PXllc11dXSksCisgICAgICAgICAgICAgICAgICAsIGVuYWJsZV9hdGFyaV9sZGc9eWVzKQorICAgIGlmIHRlc3QgeCR2aWRlb19nZW0gPSB4eWVzIC1hIHgkZW5hYmxlX2F0YXJpX2xkZyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfQ0hFQ0tfSEVBREVSKGxkZy5oLCBoYXZlX2xkZ19oZHI9eWVzKQorICAgICAgICBBQ19DSEVDS19MSUIobGRnLCBsZGdfb3BlbiwgaGF2ZV9sZGdfbGliPXllcywgaGF2ZV9sZGdfbGliPW5vLCAtbGdlbSkKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfbGRnX2hkciA9IHh5ZXMgLWEgeCRoYXZlX2xkZ19saWIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0xPQURTT19MREcpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9sb2Fkc28vbWludC8qLmMiCisgICAgICAgICAgICBTRExfTElCUz0iJFNETF9MSUJTIC1sbGRnIC1sZ2VtIgorICAgICAgICAgICAgaGF2ZV9sb2Fkc289eWVzCisgICAgICAgIGZpCisgICAgZmkKK30KKworZG5sIENoZWNrIGZvciB0aGUgdXNiaGlkKDMpIGxpYnJhcnkgb24gKkJTRAorQ2hlY2tVU0JISUQoKQoreworICAgIGlmIHRlc3QgeCRlbmFibGVfam95c3RpY2sgPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX0NIRUNLX0xJQih1c2JoaWQsIGhpZF9pbml0LCBoYXZlX2xpYnVzYmhpZD15ZXMpCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX2xpYnVzYmhpZCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0NIRUNLX0hFQURFUih1c2JoaWQuaCwgW1VTQl9DRkxBR1M9Ii1ESEFWRV9VU0JISURfSCJdKQorICAgICAgICAgICAgQUNfQ0hFQ0tfSEVBREVSKGxpYnVzYmhpZC5oLCBbVVNCX0NGTEFHUz0iLURIQVZFX0xJQlVTQkhJRF9IIl0pCisgICAgICAgICAgICBVU0JfTElCUz0iJFVTQl9MSUJTIC1sdXNiaGlkIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19DSEVDS19IRUFERVIodXNiLmgsIFtVU0JfQ0ZMQUdTPSItREhBVkVfVVNCX0giXSkKKyAgICAgICAgICAgIEFDX0NIRUNLX0hFQURFUihsaWJ1c2IuaCwgW1VTQl9DRkxBR1M9Ii1ESEFWRV9MSUJVU0JfSCJdKQorICAgICAgICAgICAgQUNfQ0hFQ0tfTElCKHVzYiwgaGlkX2luaXQsIFtVU0JfTElCUz0iJFVTQl9MSUJTIC1sdXNiIl0pCisgICAgICAgIGZpCisgICAgICAgICAgICAKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkVVNCX0NGTEFHUyIKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHVzYmhpZCkKKyAgICAgICAgaGF2ZV91c2JoaWQ9bm8KKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgICAgICAgICAjaWYgZGVmaW5lZChIQVZFX1VTQl9IKQorICAgICAgICAgICNpbmNsdWRlIDx1c2IuaD4KKyAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAjaWZkZWYgX19EcmFnb25GbHlfXworICAgICAgICAgICMgaW5jbHVkZSA8YnVzL3VzYi91c2IuaD4KKyAgICAgICAgICAjIGluY2x1ZGUgPGJ1cy91c2IvdXNiaGlkLmg+CisgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAjIGluY2x1ZGUgPGRldi91c2IvdXNiLmg+CisgICAgICAgICAgIyBpbmNsdWRlIDxkZXYvdXNiL3VzYmhpZC5oPgorICAgICAgICAgICNlbmRpZgorICAgICAgICAgICNpZiBkZWZpbmVkKEhBVkVfVVNCSElEX0gpCisgICAgICAgICAgI2luY2x1ZGUgPHVzYmhpZC5oPgorICAgICAgICAgICNlbGlmIGRlZmluZWQoSEFWRV9MSUJVU0JfSCkKKyAgICAgICAgICAjaW5jbHVkZSA8bGlidXNiLmg+CisgICAgICAgICAgI2VsaWYgZGVmaW5lZChIQVZFX0xJQlVTQkhJRF9IKQorICAgICAgICAgICNpbmNsdWRlIDxsaWJ1c2JoaWQuaD4KKyAgICAgICAgICAjZW5kaWYKKyAgICAgICAgXSxbCisgICAgICAgICAgc3RydWN0IHJlcG9ydF9kZXNjICpyZXBkZXNjOworICAgICAgICAgIHN0cnVjdCB1c2JfY3RsX3JlcG9ydCAqcmVwYnVmOworICAgICAgICAgIGhpZF9raW5kX3QgaGlka2luZDsKKyAgICAgICAgXSxbCisgICAgICAgIGhhdmVfdXNiaGlkPXllcworICAgICAgICBdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRoYXZlX3VzYmhpZCkKKworICAgICAgICBpZiB0ZXN0IHgkaGF2ZV91c2JoaWQgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHVjcl9kYXRhIG1lbWJlciBvZiB1c2JfY3RsX3JlcG9ydCkKKyAgICAgICAgICAgIGhhdmVfdXNiaGlkX3Vjcl9kYXRhPW5vCisgICAgICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoSEFWRV9VU0JfSCkKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHVzYi5oPgorICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgI2lmZGVmIF9fRHJhZ29uRmx5X18KKyAgICAgICAgICAgICAgIyBpbmNsdWRlIDxidXMvdXNiL3VzYi5oPgorICAgICAgICAgICAgICAjIGluY2x1ZGUgPGJ1cy91c2IvdXNiaGlkLmg+CisgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICMgaW5jbHVkZSA8ZGV2L3VzYi91c2IuaD4KKyAgICAgICAgICAgICAgIyBpbmNsdWRlIDxkZXYvdXNiL3VzYmhpZC5oPgorICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoSEFWRV9VU0JISURfSCkKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHVzYmhpZC5oPgorICAgICAgICAgICAgICAjZWxpZiBkZWZpbmVkKEhBVkVfTElCVVNCX0gpCisgICAgICAgICAgICAgICNpbmNsdWRlIDxsaWJ1c2IuaD4KKyAgICAgICAgICAgICAgI2VsaWYgZGVmaW5lZChIQVZFX0xJQlVTQkhJRF9IKQorICAgICAgICAgICAgICAjaW5jbHVkZSA8bGlidXNiaGlkLmg+CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgXSxbCisgICAgICAgICAgICAgIHN0cnVjdCB1c2JfY3RsX3JlcG9ydCBidWY7CisgICAgICAgICAgICAgIGlmIChidWYudWNyX2RhdGEpIHsgfQorICAgICAgICAgICAgXSxbCisgICAgICAgICAgICBoYXZlX3VzYmhpZF91Y3JfZGF0YT15ZXMKKyAgICAgICAgICAgIF0pCisgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV91c2JoaWRfdWNyX2RhdGEgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgVVNCX0NGTEFHUz0iJFVTQl9DRkxBR1MgLURVU0JISURfVUNSX0RBVEEiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCgkaGF2ZV91c2JoaWRfdWNyX2RhdGEpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgbmV3IHVzYmhpZCBBUEkpCisgICAgICAgICAgICBoYXZlX3VzYmhpZF9uZXc9bm8KKyAgICAgICAgICAgIEFDX1RSWV9DT01QSUxFKFsKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAgICAgICAgICAgICAjaWYgZGVmaW5lZChIQVZFX1VTQl9IKQorICAgICAgICAgICAgICAjaW5jbHVkZSA8dXNiLmg+CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAjaWZkZWYgX19EcmFnb25GbHlfXworICAgICAgICAgICAgICAjaW5jbHVkZSA8YnVzL3VzYi91c2IuaD4KKyAgICAgICAgICAgICAgI2luY2x1ZGUgPGJ1cy91c2IvdXNiaGlkLmg+CisgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICNpbmNsdWRlIDxkZXYvdXNiL3VzYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8ZGV2L3VzYi91c2JoaWQuaD4KKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKEhBVkVfVVNCSElEX0gpCisgICAgICAgICAgICAgICNpbmNsdWRlIDx1c2JoaWQuaD4KKyAgICAgICAgICAgICAgI2VsaWYgZGVmaW5lZChIQVZFX0xJQlVTQl9IKQorICAgICAgICAgICAgICAjaW5jbHVkZSA8bGlidXNiLmg+CisgICAgICAgICAgICAgICNlbGlmIGRlZmluZWQoSEFWRV9MSUJVU0JISURfSCkKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPGxpYnVzYmhpZC5oPgorICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICByZXBvcnRfZGVzY190IGQ7CisgICAgICAgICAgICAgIGhpZF9zdGFydF9wYXJzZShkLCAxLCAxKTsKKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgaGF2ZV91c2JoaWRfbmV3PXllcworICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIGlmIHRlc3QgeCRoYXZlX3VzYmhpZF9uZXcgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgVVNCX0NGTEFHUz0iJFVTQl9DRkxBR1MgLURVU0JISURfTkVXIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoJGhhdmVfdXNiaGlkX25ldykKKworICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBzdHJ1Y3Qgam95c3RpY2sgaW4gbWFjaGluZS9qb3lzdGljay5oKQorICAgICAgICAgICAgaGF2ZV9tYWNoaW5lX2pveXN0aWNrPW5vCisgICAgICAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAgICAgICNpbmNsdWRlIDxtYWNoaW5lL2pveXN0aWNrLmg+CisgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgICAgc3RydWN0IGpveXN0aWNrIHQ7CisgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgIGhhdmVfbWFjaGluZV9qb3lzdGljaz15ZXMKKyAgICAgICAgICAgIF0pCisgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9tYWNoaW5lX2pveXN0aWNrID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfSk9ZU1RJQ0tfVVNCSElEX01BQ0hJTkVfSk9ZU1RJQ0tfSCkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKCRoYXZlX21hY2hpbmVfam95c3RpY2spCisKKyAgICAgICAgICAgIEFDX0RFRklORShTRExfSk9ZU1RJQ0tfVVNCSElEKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvam95c3RpY2svYnNkLyouYyIKKyAgICAgICAgICAgIEVYVFJBX0NGTEFHUz0iJEVYVFJBX0NGTEFHUyAkVVNCX0NGTEFHUyIKKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTICRVU0JfTElCUyIKKyAgICAgICAgICAgIGhhdmVfam95c3RpY2s9eWVzCisgICAgICAgIGZpCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICAgIGZpCit9CisKK2RubCBDaGVjayBmb3IgY2xvY2tfZ2V0dGltZSgpCitDaGVja0Nsb2NrR2V0dGltZSgpCit7CisgICAgQUNfQVJHX0VOQUJMRShjbG9ja19nZXR0aW1lLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNsb2NrX2dldHRpbWVdLCBbdXNlIGNsb2NrX2dldHRpbWUoKSBpbnN0ZWFkIG9mIGdldHRpbWVvZmRheSgpIG9uIFVOSVggW1tkZWZhdWx0PW5vXV1dKSwKKyAgICAgICAgICAgICAgICAgICwgZW5hYmxlX2Nsb2NrX2dldHRpbWU9bm8pCisgICAgaWYgdGVzdCB4JGVuYWJsZV9jbG9ja19nZXR0aW1lID0geHllczsgdGhlbgorICAgICAgICBBQ19DSEVDS19MSUIocnQsIGNsb2NrX2dldHRpbWUsIGhhdmVfY2xvY2tfZ2V0dGltZT15ZXMpCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX2Nsb2NrX2dldHRpbWUgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoSEFWRV9DTE9DS19HRVRUSU1FKQorICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLWxydCIKKyAgICAgICAgZmkKKyAgICBmaQorfQorCitkbmwgQ2hlY2sgZm9yIGEgdmFsaWQgbGludXgvdmVyc2lvbi5oCitDaGVja0xpbnV4VmVyc2lvbigpCit7CisgICAgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgaGF2ZV9saW51eF92ZXJzaW9uX2g9eWVzKQorICAgIGlmIHRlc3QgeCRoYXZlX2xpbnV4X3ZlcnNpb25faCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1ESEFWRV9MSU5VWF9WRVJTSU9OX0giCisgICAgZmkKK30KKworZG5sIENoZWNrIGlmIHdlIHdhbnQgdG8gdXNlIFJQQVRICitDaGVja1JQQVRIKCkKK3sKKyAgICBBQ19BUkdfRU5BQkxFKHJwYXRoLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXJwYXRoXSwgW3VzZSBhbiBycGF0aCB3aGVuIGxpbmtpbmcgU0RMIFtbZGVmYXVsdD15ZXNdXV0pLAorICAgICAgICAgICAgICAgICAgLCBlbmFibGVfcnBhdGg9eWVzKQorfQorCitkbmwgU2V0IHVwIHRoZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBob3N0IHBsYXRmb3JtIQorY2FzZSAiJGhvc3QiIGluCisgICAgYXJtLSotZWxmKikgIyBGSVhNRTogQ2FuIHdlIGdldCBtb3JlIHNwZWNpZmljIGZvciBpUG9kTGludXg/CisgICAgICAgIEFSQ0g9bGludXgKKyAgICAgICAgQ2hlY2tEdW1teVZpZGVvCisgICAgICAgIENoZWNrSVBvZAorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIHRpbWVyIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV90aW1lcnMgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1RJTUVSX1VOSVgpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aW1lci91bml4LyouYyIKKyAgICAgICAgICAgIGhhdmVfdGltZXJzPXllcworICAgICAgICBmaQorICAgICAgICA7OworICAgICotKi1saW51eCp8Ki0qLXVjbGludXgqfCotKi1nbnUqfCotKi1rKmJzZCotZ251fCotKi1ic2RpKnwqLSotZnJlZWJzZCp8Ki0qLWRyYWdvbmZseSp8Ki0qLW5ldGJzZCp8Ki0qLW9wZW5ic2QqfCotKi1zeXN2NSp8Ki0qLXNvbGFyaXMqfCotKi1ocHV4KnwqLSotaXJpeCp8Ki0qLWFpeCp8Ki0qLW9zZiopCisgICAgICAgIGNhc2UgIiRob3N0IiBpbgorICAgICAgICAgICAgKi0qLWxpbnV4KikgICAgICAgICBBUkNIPWxpbnV4IDs7CisgICAgICAgICAgICAqLSotdWNsaW51eCopICAgICAgIEFSQ0g9bGludXggOzsKKyAgICAgICAgICAgICotKi1rZnJlZWJzZCotZ251KSAgQVJDSD1rZnJlZWJzZC1nbnUgOzsKKyAgICAgICAgICAgICotKi1rbmV0YnNkKi1nbnUpICAgQVJDSD1rbmV0YnNkLWdudSA7OworICAgICAgICAgICAgKi0qLWtvcGVuYnNkKi1nbnUpICBBUkNIPWtvcGVuYnNkLWdudSA7OworICAgICAgICAgICAgKi0qLWdudSopICAgICAgICAgICBBUkNIPWdudSA7OyAjIG11c3QgYmUgbGFzdCBvZiB0aGUgZ251IHZhcmlhbnRzCisgICAgICAgICAgICAqLSotYnNkaSopICAgICAgICAgIEFSQ0g9YnNkaSA7OworICAgICAgICAgICAgKi0qLWZyZWVic2QqKSAgICAgICBBUkNIPWZyZWVic2QgOzsKKyAgICAgICAgICAgICotKi1kcmFnb25mbHkqKSAgICAgQVJDSD1mcmVlYnNkIDs7CisgICAgICAgICAgICAqLSotbmV0YnNkKikgICAgICAgIEFSQ0g9bmV0YnNkIDs7CisgICAgICAgICAgICAqLSotb3BlbmJzZCopICAgICAgIEFSQ0g9b3BlbmJzZCA7OworICAgICAgICAgICAgKi0qLXN5c3Y1KikgICAgICAgICBBUkNIPXN5c3Y1IDs7CisgICAgICAgICAgICAqLSotc29sYXJpcyopICAgICAgIEFSQ0g9c29sYXJpcyA7OworICAgICAgICAgICAgKi0qLWhwdXgqKSAgICAgICAgICBBUkNIPWhwdXggOzsKKyAgICAgICAgICAgICotKi1pcml4KikgICAgICAgICAgQVJDSD1pcml4IDs7CisgICAgICAgICAgICAqLSotYWl4KikgICAgICAgICAgIEFSQ0g9YWl4IDs7CisgICAgICAgICAgICAqLSotb3NmKikgICAgICAgICAgIEFSQ0g9b3NmIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgQ2hlY2tWaXNpYmlsaXR5SGlkZGVuCisgICAgICAgIENoZWNrRHVtbXlWaWRlbworICAgICAgICBDaGVja0Rpc2tBdWRpbworICAgICAgICBDaGVja0R1bW15QXVkaW8KKyAgICAgICAgQ2hlY2tETE9QRU4KKyAgICAgICAgQ2hlY2tOQVNNCisgICAgICAgIENoZWNrQWx0aXZlYworICAgICAgICBDaGVja09TUworICAgICAgICBDaGVja0RNRURJQQorICAgICAgICBDaGVja01NRQorICAgICAgICBDaGVja0FMU0EKKyAgICAgICAgQ2hlY2tBUlRTQworICAgICAgICBDaGVja0VTRAorICAgICAgICBDaGVja1B1bHNlQXVkaW8KKyAgICAgICAgQ2hlY2tOQVMKKyAgICAgICAgQ2hlY2tYMTEKKyAgICAgICAgQ2hlY2tOQU5PWAorICAgICAgICBDaGVja0ZCQ09OCisgICAgICAgIENoZWNrRGlyZWN0RkIKKyAgICAgICAgQ2hlY2tQUzJHUworICAgICAgICBDaGVja1BTMworICAgICAgICBDaGVja0dHSQorICAgICAgICBDaGVja1NWR0EKKyAgICAgICAgQ2hlY2tWR0wKKyAgICAgICAgQ2hlY2tXc2NvbnMKKyAgICAgICAgQ2hlY2tBQWxpYgorICAgICAgICBDaGVja0NhY2EKKyAgICAgICAgQ2hlY2tRdG9waWEKKyAgICAgICAgQ2hlY2tQaWNvR1VJCisgICAgICAgIENoZWNrT3BlbkdMWDExCisgICAgICAgIENoZWNrSW5wdXRFdmVudHMKKyAgICAgICAgQ2hlY2tUc2xpYgorICAgICAgICBDaGVja1VTQkhJRAorICAgICAgICBDaGVja1BUSFJFQUQKKyAgICAgICAgQ2hlY2tDbG9ja0dldHRpbWUKKyAgICAgICAgQ2hlY2tMaW51eFZlcnNpb24KKyAgICAgICAgQ2hlY2tSUEFUSAorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIGF1ZGlvIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9hdWRpbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBjYXNlICRBUkNIIGluCisgICAgICAgICAgICBzeXN2NXxzb2xhcmlzfGhwdXgpCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKFNETF9BVURJT19EUklWRVJfU1VOQVVESU8pCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvYXVkaW8vc3VuLyouYyIKKyAgICAgICAgICAgICAgICBoYXZlX2F1ZGlvPXllcworICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIG5ldGJzZHxvcGVuYnNkKQorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX0JTRCkKKyAgICAgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby9ic2QvKi5jIgorICAgICAgICAgICAgICAgIGhhdmVfYXVkaW89eWVzCisgICAgICAgICAgICA7OworICAgICAgICAgICAgYWl4KQorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX1BBVUQpCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvYXVkaW8vcGF1ZGlvLyouYyIKKyAgICAgICAgICAgICAgICBoYXZlX2F1ZGlvPXllcworICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgam95c3RpY2sgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2pveXN0aWNrID0geHllczsgdGhlbgorICAgICAgICAgIGNhc2UgJEFSQ0ggaW4KKyAgICAgICAgICAgIGxpbnV4KQorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfSk9ZU1RJQ0tfTElOVVgpCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvam95c3RpY2svbGludXgvKi5jIgorICAgICAgICAgICAgICAgIGhhdmVfam95c3RpY2s9eWVzCisgICAgICAgICAgICA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSBjZHJvbSBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfY2Ryb20gPSB4eWVzOyB0aGVuCisgICAgICAgICAgY2FzZSAkQVJDSCBpbgorICAgICAgICAgICAgbGludXh8c29sYXJpcykKKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0NEUk9NX0xJTlVYKQorICAgICAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2Nkcm9tL2xpbnV4LyouYyIKKyAgICAgICAgICAgICAgICBoYXZlX2Nkcm9tPXllcworICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICpmcmVlYnNkKikKKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0NEUk9NX0ZSRUVCU0QpCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvY2Ryb20vZnJlZWJzZC8qLmMiCisgICAgICAgICAgICAgICAgaGF2ZV9jZHJvbT15ZXMKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqb3BlbmJzZCp8Km5ldGJzZCopCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKFNETF9DRFJPTV9PUEVOQlNEKQorICAgICAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2Nkcm9tL29wZW5ic2QvKi5jIgorICAgICAgICAgICAgICAgIGhhdmVfY2Ryb209eWVzCisgICAgICAgICAgICA7OworICAgICAgICAgICAgYnNkaSkKKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0NEUk9NX0JTREkpCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvY2Ryb20vYnNkaS8qLmMiCisgICAgICAgICAgICAgICAgaGF2ZV9jZHJvbT15ZXMKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICBhaXgpCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKFNETF9DRFJPTV9BSVgpCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvY2Ryb20vYWl4LyouYyIKKyAgICAgICAgICAgICAgICBoYXZlX2Nkcm9tPXllcworICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIG9zZikKKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0NEUk9NX09TRikKKyAgICAgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9jZHJvbS9vc2YvKi5jIgorICAgICAgICAgICAgICAgIGhhdmVfY2Ryb209eWVzCisgICAgICAgICAgICA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSB0aHJlYWQgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX3RocmVhZHMgPSB4eWVzIC1hIHgkdXNlX3B0aHJlYWRzICE9IHh5ZXMgLWEgeCR1c2VfcHRoICE9IHh5ZXMgLWEgeCRBUkNIID0geGlyaXg7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVEhSRUFEX1NQUk9DKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdGhyZWFkL2lyaXgvKi5jIgorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdGhyZWFkL2dlbmVyaWMvU0RMX3N5c211dGV4LmMiCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzY29uZC5jIgorICAgICAgICAgICAgaGF2ZV90aHJlYWRzPXllcworICAgICAgICBmaQorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIHRpbWVyIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV90aW1lcnMgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1RJTUVSX1VOSVgpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aW1lci91bml4LyouYyIKKyAgICAgICAgICAgIGhhdmVfdGltZXJzPXllcworICAgICAgICBmaQorICAgICAgICA7OworICAgICotKi1xbngqKQorICAgICAgICBBUkNIPXFueAorICAgICAgICBDaGVja0R1bW15VmlkZW8KKyAgICAgICAgQ2hlY2tEaXNrQXVkaW8KKyAgICAgICAgQ2hlY2tEdW1teUF1ZGlvCisgICAgICAgICMgQ2hlY2tOQVNNCisgICAgICAgIENoZWNrRExPUEVOCisgICAgICAgIENoZWNrTkFTCisgICAgICAgIENoZWNrUEhPVE9OCisgICAgICAgIENoZWNrWDExCisgICAgICAgIENoZWNrT3BlbkdMWDExCisgICAgICAgIENoZWNrUFRIUkVBRAorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIGF1ZGlvIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9hdWRpbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX1FOWE5UTykKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2F1ZGlvL250by8qLmMiCisgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtbGFzb3VuZCIKKyAgICAgICAgICAgIGhhdmVfYXVkaW89eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgY2Ryb20gbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2Nkcm9tID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9DRFJPTV9RTlgpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9jZHJvbS9xbngvKi5jIgorICAgICAgICAgICAgaGF2ZV9jZHJvbT15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSB0aW1lciBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdGltZXJzID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9USU1FUl9VTklYKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdGltZXIvdW5peC8qLmMiCisgICAgICAgICAgICBoYXZlX3RpbWVycz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndzMyKikKKyAgICAgICAgQVJDSD13aW4zMgorICAgICAgICBpZiB0ZXN0ICIkYnVpbGQiICE9ICIkaG9zdCI7IHRoZW4gIyBjcm9zcy1jb21waWxpbmcKKyAgICAgICAgICAgICMgRGVmYXVsdCBjcm9zcy1jb21waWxlIGxvY2F0aW9uCisgICAgICAgICAgICBhY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsL2Nyb3NzLXRvb2xzL2kzODYtbWluZ3czMgorICAgICAgICBlbHNlCisgICAgICAgICAgICAjIExvb2sgZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUgdG9vbHMgYW5kIGluc3RhbGwgdGhlcmUKKyAgICAgICAgICAgIGlmIHRlc3QgIiRCVUlMRF9QUkVGSVgiICE9ICIiOyB0aGVuCisgICAgICAgICAgICAgICAgYWNfZGVmYXVsdF9wcmVmaXg9JEJVSUxEX1BSRUZJWAorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgQ2hlY2tEdW1teVZpZGVvCisgICAgICAgIENoZWNrRGlza0F1ZGlvCisgICAgICAgIENoZWNrRHVtbXlBdWRpbworICAgICAgICBDaGVja1dJTjMyCisgICAgICAgIENoZWNrV0lOMzJHTAorICAgICAgICBDaGVja0RJUkVDVFgKKyAgICAgICAgQ2hlY2tOQVNNCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgYXVkaW8gbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2F1ZGlvID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9BVURJT19EUklWRVJfV0FWRU9VVCkKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2F1ZGlvL3dpbmRpYi8qLmMiCisgICAgICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9kaXJlY3R4ID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX0RTT1VORCkKKyAgICAgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby93aW5keDUvKi5jIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGhhdmVfYXVkaW89eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgam95c3RpY2sgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2pveXN0aWNrID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9KT1lTVElDS19XSU5NTSkKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2pveXN0aWNrL3dpbjMyLyouYyIKKyAgICAgICAgICAgIGhhdmVfam95c3RpY2s9eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgY2Ryb20gbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2Nkcm9tID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9DRFJPTV9XSU4zMikKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2Nkcm9tL3dpbjMyLyouYyIKKyAgICAgICAgICAgIGhhdmVfY2Ryb209eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgdGhyZWFkIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV90aHJlYWRzID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9USFJFQURfV0lOMzIpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c211dGV4LmMiCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c3NlbS5jIgorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdGhyZWFkL3dpbjMyL1NETF9zeXN0aHJlYWQuYyIKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXNjb25kLmMiCisgICAgICAgICAgICBoYXZlX3RocmVhZHM9eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgdGltZXIgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX3RpbWVycyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVElNRVJfV0lOMzIpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aW1lci93aW4zMi8qLmMiCisgICAgICAgICAgICBoYXZlX3RpbWVycz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2xvYWRzbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfTE9BRFNPX1dJTjMyKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvbG9hZHNvL3dpbjMyLyouYyIKKyAgICAgICAgICAgIGhhdmVfbG9hZHNvPXllcworICAgICAgICBmaQorICAgICAgICAjIFNldCB1cCB0aGUgc3lzdGVtIGxpYnJhcmllcyB3ZSBuZWVkCisgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1sdXNlcjMyIC1sZ2RpMzIgLWx3aW5tbSIKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfZGlyZWN0eCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1sZHhndWlkIgorICAgICAgICBmaQorICAgICAgICAjIFRoZSBXaW4zMiBwbGF0Zm9ybSByZXF1aXJlcyBzcGVjaWFsIHNldHVwCisgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL21haW4vd2luMzIvKi5yYyIKKyAgICAgICAgU0RMTUFJTl9TT1VSQ0VTPSIkc3JjZGlyL3NyYy9tYWluL3dpbjMyLyouYyIKKyAgICAgICAgU0RMTUFJTl9MREZMQUdTPSItc3RhdGljIgorICAgICAgICBTRExfQ0ZMQUdTPSIkU0RMX0NGTEFHUyAtRG1haW49U0RMX21haW4iCisgICAgICAgIFNETF9MSUJTPSItbG1pbmd3MzIgLWxTRExtYWluICRTRExfTElCUyAtbXdpbmRvd3MiCisgICAgICAgIDs7CisgICAgKi13aW5jZSopCisgICAgICAgIEFSQ0g9d2luMzIKKyAgICAgICAgQ2hlY2tEdW1teVZpZGVvCisgICAgICAgIENoZWNrRGlza0F1ZGlvCisgICAgICAgIENoZWNrRHVtbXlBdWRpbworICAgICAgICBDaGVja1dJTjMyCisgICAgICAgIENoZWNrTkFTTQorICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9nYXBpLyouYyIKKyAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1EX1dJTjMyX1dDRT0weDQyMCIKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9hdWRpbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX1dBVkVPVVQpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby93aW5kaWIvKi5jIgorICAgICAgICAgICAgaGF2ZV9hdWRpbz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSB0aHJlYWQgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX3RocmVhZHMgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1RIUkVBRF9XSU4zMikKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzbXV0ZXguYyIKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzc2VtLmMiCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c3RocmVhZC5jIgorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdGhyZWFkL2dlbmVyaWMvU0RMX3N5c2NvbmQuYyIKKyAgICAgICAgICAgIGhhdmVfdGhyZWFkcz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSB0aW1lciBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdGltZXJzID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9USU1FUl9XSU5DRSkKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RpbWVyL3dpbmNlLyouYyIKKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1sY29yZWRsbCAtbG1tdGltZXIiCisgICAgICAgICAgICBoYXZlX3RpbWVycz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2xvYWRzbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfTE9BRFNPX1dJTjMyKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvbG9hZHNvL3dpbjMyLyouYyIKKyAgICAgICAgICAgIGhhdmVfbG9hZHNvPXllcworICAgICAgICBmaQorICAgICAgICAjIFNldCB1cCB0aGUgc3lzdGVtIGxpYnJhcmllcyB3ZSBuZWVkCisgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1sY29yZWRsbCAtbGNvbW1jdHJsIgorICAgICAgICAjIFRoZSBXaW4zMiBwbGF0Zm9ybSByZXF1aXJlcyBzcGVjaWFsIHNldHVwCisgICAgICAgIFNETE1BSU5fU09VUkNFUz0iJHNyY2Rpci9zcmMvbWFpbi93aW4zMi8qLmMiCisgICAgICAgIFNETE1BSU5fTERGTEFHUz0iLXN0YXRpYyIKKyAgICAgICAgU0RMX0NGTEFHUz0iJFNETF9DRkxBR1MgLURtYWluPVNETF9tYWluIC1EX1dJTjMyX1dDRT0weDQyMCIKKyAgICAgICAgU0RMX0xJQlM9Ii1sU0RMbWFpbiAkU0RMX0xJQlMiCisgICAgICAgIDs7CisgICAgKi0qLWJlb3MqIHwgKi0qLWhhaWt1KikKKyAgICAgICAgQVJDSD1iZW9zCisgICAgICAgIGFjX2RlZmF1bHRfcHJlZml4PS9ib290L2RldmVsb3AvdG9vbHMvZ251cHJvCisgICAgICAgIENoZWNrRHVtbXlWaWRlbworICAgICAgICBDaGVja0Rpc2tBdWRpbworICAgICAgICBDaGVja0R1bW15QXVkaW8KKyAgICAgICAgQ2hlY2tOQVNNCisgICAgICAgIENoZWNrQldJTkRPVworICAgICAgICBDaGVja0JlR0wKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSBhdWRpbyBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfYXVkaW8gPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0FVRElPX0RSSVZFUl9CQVVESU8pCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby9iYXVkaW8vKi5jYyIKKyAgICAgICAgICAgIGhhdmVfYXVkaW89eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgam95c3RpY2sgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2pveXN0aWNrID0geHllczsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKFNETF9KT1lTVElDS19CRU9TKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvam95c3RpY2svYmVvcy8qLmNjIgorICAgICAgICAgICAgaGF2ZV9qb3lzdGljaz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSBjZHJvbSBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfY2Ryb20gPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0NEUk9NX0JFT1MpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9jZHJvbS9iZW9zLyouY2MiCisgICAgICAgICAgICBoYXZlX2Nkcm9tPXllcworICAgICAgICBmaQorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIHRocmVhZCBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdGhyZWFkcyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVEhSRUFEX0JFT1MpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvYmVvcy8qLmMiCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzbXV0ZXguYyIKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXNjb25kLmMiCisgICAgICAgICAgICBoYXZlX3RocmVhZHM9eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgdGltZXIgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX3RpbWVycyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVElNRVJfQkVPUykKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RpbWVyL2Jlb3MvKi5jIgorICAgICAgICAgICAgaGF2ZV90aW1lcnM9eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgc2hhcmVkIG9iamVjdCBsb2FkaW5nIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9sb2Fkc28gPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBjYXNlICIkaG9zdCIgaW4KKyAgICAgICAgICAgICAgICAqLSotYmVvcyopCisgICAgICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfTE9BRFNPX0JFT1MpCisgICAgICAgICAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2xvYWRzby9iZW9zLyouYyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICotKi1oYWlrdSopCisgICAgICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfTE9BRFNPX0RMT1BFTikKKyAgICAgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvbG9hZHNvL2Rsb3Blbi8qLmMiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMgICAgCisgICAgICAgICAgICBoYXZlX2xvYWRzbz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBUaGUgQmVPUyBwbGF0Zm9ybSByZXF1aXJlcyBzcGVjaWFsIHNldHVwLgorICAgICAgICBTT1VSQ0VTPSIkc3JjZGlyL3NyYy9tYWluL2Jlb3MvKi5jYyAkU09VUkNFUyIKKyAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLWxyb290IC1sYmUgLWxtZWRpYSAtbGdhbWUgLWxkZXZpY2UgLWx0ZXh0ZW5jb2RpbmciCisgICAgICAgIDs7CisgICAgKi0qLWRhcndpbiogKQorICAgICAgICAjIFRoaXMgY291bGQgYmUgZWl0aGVyIGZ1bGwgIk1hYyBPUyBYIiwgb3IgcGxhaW4gIkRhcndpbiIgd2hpY2ggaXMKKyAgICAgICAgIyBqdXN0IHRoZSBPUyBYIGtlcm5lbCBzYW5zIHVwcGVyIGxheWVycyBsaWtlIENhcmJvbiBhbmQgQ29jb2EuCisgICAgICAgICMgTmV4dCBsaW5lIGlzIGJyb2tlbiwgYW5kIGEgZmV3IGZpbGVzIGJlbG93IHJlcXVpcmUgTWFjIE9TIFggKGZ1bGwpCisgICAgICAgIEFSQ0g9bWFjb3N4CisKKyAgICAgICAgIyBNYWMgT1MgWCBidWlsZHMgd2l0aCBib3RoIHRoZSBDYXJib24gYW5kIE9TWCBBUElzIGF0IHRoZSBtb21lbnQKKyAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1EVEFSR0VUX0FQSV9NQUNfQ0FSQk9OIgorICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgLURUQVJHRVRfQVBJX01BQ19PU1giCisKKyAgICAgICAgIyBIQUNLOiBSZXNldCBFWFRSQV9MREZMQUdTOyB0aGUgb25seSB0aGluZyBpdCBjb250YWlucyBhdCB0aGlzIHBvaW50CisgICAgICAgICMgaXMgLWxtIHdoaWNoIGlzIG5vdCBuZWVkZWQgdW5kZXIgTWFjIE9TIFguIEJ1dCBmb3Igc29tZSByZWFzb25zIGl0CisgICAgICAgICMgYWxzbyB0ZW5kcyB0byBjb250YWluIHNwdXJpb3VzIC1MIHN3aXRjaGVzLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvCisgICAgICAgICMgdXNlIGhlcmUgb3IgaW4gc2RsLWNvbmZpZy4gSGVuY2Ugd2UgcmVzZXQgaXQuCisgICAgICAgIEVYVFJBX0xERkxBR1M9IiIKKworICAgICAgICBDaGVja1Zpc2liaWxpdHlIaWRkZW4KKyAgICAgICAgQ2hlY2tEdW1teVZpZGVvCisgICAgICAgIENoZWNrRGlza0F1ZGlvCisgICAgICAgIENoZWNrRHVtbXlBdWRpbworICAgICAgICBDaGVja0RMT1BFTgorICAgICAgICBDaGVja05BU00KKworICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIHNoYXJlZCBvYmplY3QgbG9hZGluZyBsaWJyYXJ5CisgICAgICAgICMgKHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgdGhlIGR5bmFtaWMgWDExIGNoZWNrKQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2xvYWRzbyA9IHh5ZXMgLWEgeCRoYXZlX2Rsb3BlbiAhPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0xPQURTT19ETENPTVBBVCkKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2xvYWRzby9tYWNvc3gvKi5jIgorICAgICAgICAgICAgaGF2ZV9sb2Fkc289eWVzCisgICAgICAgIGZpCisKKyAgICAgICAgQ2hlY2tDT0NPQQorICAgICAgICBDaGVja0NBUkJPTgorICAgICAgICBDaGVja1gxMQorICAgICAgICBDaGVja01hY0dMCisgICAgICAgIENoZWNrT3BlbkdMWDExCisgICAgICAgIENoZWNrUFRIUkVBRAorICAgICAgICBDaGVja0FsdGl2ZWMKKworICAgICAgICAjIE5lZWQgdGhpcyBvciB0aGluZ3MgbWlnaHQgbWlzYnVpbGQgb24gYSBHMy4KKyAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1mb3JjZV9jcHVzdWJ0eXBlX0FMTCIKKworICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIGF1ZGlvIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9hdWRpbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfQVVESU9fRFJJVkVSX0NPUkVBVURJTykKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2F1ZGlvL21hY29zeC8qLmMiCisgICAgICAgICAgICBoYXZlX2F1ZGlvPXllcworICAgICAgICBmaQorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIGpveXN0aWNrIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9qb3lzdGljayA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfSk9ZU1RJQ0tfSU9LSVQpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9qb3lzdGljay9kYXJ3aW4vKi5jIgorICAgICAgICAgICAgaGF2ZV9qb3lzdGljaz15ZXMKKyAgICAgICAgICAgIG5lZWRfaW9raXRfZnJhbWV3b3JrPXllcworICAgICAgICBmaQorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIGNkcm9tIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9jZHJvbSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfQ0RST01fTUFDT1NYKQorICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvY2Ryb20vbWFjb3N4LyouYyIKKyAgICAgICAgICAgIGhhdmVfY2Ryb209eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgdGltZXIgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX3RpbWVycyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVElNRVJfVU5JWCkKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RpbWVyL3VuaXgvKi5jIgorICAgICAgICAgICAgaGF2ZV90aW1lcnM9eWVzCisgICAgICAgIGZpCisgICAgICAgICMgVGhlIE1hYyBPUyBYIHBsYXRmb3JtIHJlcXVpcmVzIHNwZWNpYWwgc2V0dXAuCisgICAgICAgIFNETE1BSU5fU09VUkNFUz0iJHNyY2Rpci9zcmMvbWFpbi9tYWNvc3gvKi5tIgorICAgICAgICBTRExNQUlOX0xERkxBR1M9Ii1zdGF0aWMiCisgICAgICAgIEVYVFJBX0NGTEFHUz0iJEVYVFJBX0NGTEFHUyAtZnBhc2NhbC1zdHJpbmdzIgorICAgICAgICBTRExfTElCUz0iLWxTRExtYWluICRTRExfTElCUyIKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlb19jb2NvYSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1XbCwtZnJhbWV3b3JrLENvY29hIgorICAgICAgICAgICAgbmVlZF9pb2tpdF9mcmFtZXdvcms9eWVzCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdmlkZW9fY2FyYm9uID0geHllcyAtbyB4JGVuYWJsZV92aWRlb19jb2NvYSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICMgVGhlIENvY29hIGJhY2tlbmQgc3RpbGwgbmVlZHMgQ2FyYm9uCisgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtV2wsLWZyYW1ld29yayxBcHBsaWNhdGlvblNlcnZpY2VzIgorICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLVdsLC1mcmFtZXdvcmssQ2FyYm9uIgorICAgICAgICBmaQorICAgICAgICAjIElmIGVpdGhlciB0aGUgYXVkaW8gb3IgQ0QgZHJpdmVyIGlzIHVzZWQsIGFkZCB0aGUgQXVkaW9Vbml0IGZyYW1ld29yaworICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2F1ZGlvID0geHllcyAtbyB4JGVuYWJsZV9jZHJvbSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1XbCwtZnJhbWV3b3JrLEF1ZGlvVG9vbGJveCAtV2wsLWZyYW1ld29yayxBdWRpb1VuaXQiCisgICAgICAgIGZpCisgICAgICAgICMgU29tZSBzdWJzeXN0ZW1zIHJlZmVyZW5jZSBJT0tpdC4uLgorICAgICAgICBpZiB0ZXN0IHgkbmVlZF9pb2tpdF9mcmFtZXdvcmsgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtV2wsLWZyYW1ld29yayxJT0tpdCIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAqLSotbWludCopCisgICAgICAgIEFSQ0g9bWludAorICAgICAgICBDaGVja0R1bW15VmlkZW8KKyAgICAgICAgQ2hlY2tEaXNrQXVkaW8KKyAgICAgICAgQ2hlY2tEdW1teUF1ZGlvCisgICAgICAgIENoZWNrQXRhcmlCaW9zRXZlbnQKKyAgICAgICAgQ2hlY2tBdGFyaVhiaW9zVmlkZW8KKyAgICAgICAgQ2hlY2tBdGFyaUdlbVZpZGVvCisgICAgICAgIENoZWNrQXRhcmlBdWRpbworICAgICAgICBDaGVja0F0YXJpTGRnCisgICAgICAgIENoZWNrQXRhcmlPU01lc2EKKyAgICAgICAgQ2hlY2tQVEgKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSBhdWRpbyBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdGhyZWFkcyA9IHh5ZXMgLWEgeCRlbmFibGVfcHRoID0geHllczsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9hdWRpbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0FVRElPX0RSSVZFUl9TVU5BVURJTykKKyAgICAgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9hdWRpby9zdW4vKi5jIgorICAgICAgICAgICAgICAgIGhhdmVfYXVkaW89eWVzCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIGpveXN0aWNrIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV9qb3lzdGljayA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfSk9ZU1RJQ0tfTUlOVCkKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2pveXN0aWNrL21pbnQvKi5jIgorICAgICAgICAgICAgaGF2ZV9qb3lzdGljaz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSBjZHJvbSBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfY2Ryb20gPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0NEUk9NX01JTlQpCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9jZHJvbS9taW50LyouYyIKKyAgICAgICAgICAgIGhhdmVfY2Ryb209eWVzCisgICAgICAgIGZpCisgICAgICAgICMgU2V0IHVwIGZpbGVzIGZvciB0aGUgdGltZXIgbGlicmFyeQorICAgICAgICBpZiB0ZXN0IHgkZW5hYmxlX3RpbWVycyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfdGhyZWFkcyA9IHh5ZXMgLWEgeCRlbmFibGVfcHRoID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX0RFRklORShTRExfVElNRVJfVU5JWCkKKyAgICAgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aW1lci91bml4LyouYyIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1RJTUVSX01JTlQpCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdGltZXIvbWludC8qLmMiCisgICAgICAgICAgICAgICAgU09VUkNFUz0iJFNPVVJDRVMgJHNyY2Rpci9zcmMvdGltZXIvbWludC8qLlMiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgaGF2ZV90aW1lcnM9eWVzCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgKi1yaXNjb3MpCisgICAgICAgIEFSQ0g9cmlzY29zCisgICAgICAgIENoZWNrT1NTCisgICAgICAgIENoZWNrUFRIUkVBRAorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIHZpZGVvIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV92aWRlbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShTRExfVklERU9fRFJJVkVSX1JJU0NPUykKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3ZpZGVvL3Jpc2Nvcy8qLmMiCisgICAgICAgICAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy92aWRlby9yaXNjb3MvKi5TIgorICAgICAgICAgICAgaGF2ZV92aWRlbz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdXAgZmlsZXMgZm9yIHRoZSBqb3lzdGljayBsaWJyYXJ5CisgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfam95c3RpY2sgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX0pPWVNUSUNLX1JJU0NPUykKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL2pveXN0aWNrL3Jpc2Nvcy8qLmMiCisgICAgICAgICAgICBoYXZlX2pveXN0aWNrPXllcworICAgICAgICBmaQorICAgICAgICAjIFNldCB1cCBmaWxlcyBmb3IgdGhlIHRpbWVyIGxpYnJhcnkKKyAgICAgICAgaWYgdGVzdCB4JGVuYWJsZV90aW1lcnMgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkUoU0RMX1RJTUVSX1JJU0NPUykKKyAgICAgICAgICAgIFNPVVJDRVM9IiRTT1VSQ0VTICRzcmNkaXIvc3JjL3RpbWVyL3Jpc2Nvcy8qLmMiCisgICAgICAgICAgICBoYXZlX3RpbWVycz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgIyBUaGUgUklTQyBPUyBwbGF0Zm9ybSByZXF1aXJlcyBzcGVjaWFsIHNldHVwLgorICAgICAgICBFWFRSQV9MREZMQUdTPSIkRVhUUkFfTERGTEFHUyAtbGpwZWcgLWx0aWZmIC1scG5nIC1seiIKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBBQ19NU0dfRVJST1IoWworKioqIFVuc3VwcG9ydGVkIGhvc3Q6ICBQbGVhc2UgYWRkIHRvIGNvbmZpZ3VyZS5pbgorICAgICAgICBdKQorICAgICAgICA7OworZXNhYworCitkbmwgRG8gdGhpcyBvbiBhbGwgcGxhdGZvcm1zLCBhZnRlciBldmVyeXRoaW5nIGVsc2UuCitDaGVja1dhcm5BbGwKKworIyBWZXJpZnkgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgZmlsZXMgd2UgbmVlZAorCitpZiB0ZXN0IHgkZW5hYmxlX2pveXN0aWNrID0geHllczsgdGhlbgorICBpZiB0ZXN0IHgkaGF2ZV9qb3lzdGljayAhPSB4eWVzOyB0aGVuCisgICAgIyBXYW50cyBqb3lzdGljayBzdWJzeXN0ZW0sIGJ1dCBkb2Vzbid0IGhhdmUgYSBwbGF0Zm9ybS1zcGVjaWZpYyBiYWNrZW5kLi4uCisgICAgQUNfREVGSU5FKFNETF9KT1lTVElDS19EVU1NWSkKKyAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9qb3lzdGljay9kdW1teS8qLmMiCisgIGZpCitmaQoraWYgdGVzdCB4JGhhdmVfY2Ryb20gIT0geHllczsgdGhlbgorICAgIGlmIHRlc3QgeCRlbmFibGVfY2Ryb20gPSB4eWVzOyB0aGVuCisgICAgICAgIEFDX0RFRklORShTRExfQ0RST01fRElTQUJMRUQpCisgICAgZmkKKyAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9jZHJvbS9kdW1teS8qLmMiCitmaQoraWYgdGVzdCB4JGhhdmVfdGhyZWFkcyAhPSB4eWVzOyB0aGVuCisgICAgaWYgdGVzdCB4JGVuYWJsZV90aHJlYWRzID0geHllczsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoU0RMX1RIUkVBRFNfRElTQUJMRUQpCisgICAgZmkKKyAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aHJlYWQvZ2VuZXJpYy8qLmMiCitmaQoraWYgdGVzdCB4JGhhdmVfdGltZXJzICE9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3RpbWVycyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKFNETF9USU1FUlNfRElTQUJMRUQpCisgICAgZmkKKyAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy90aW1lci9kdW1teS8qLmMiCitmaQoraWYgdGVzdCB4JGhhdmVfbG9hZHNvICE9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2xvYWRzbyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKFNETF9MT0FEU09fRElTQUJMRUQpCisgICAgZmkKKyAgICBTT1VSQ0VTPSIkU09VUkNFUyAkc3JjZGlyL3NyYy9sb2Fkc28vZHVtbXkvKi5jIgorZmkKK2lmIHRlc3QgeCRTRExNQUlOX1NPVVJDRVMgPSB4OyB0aGVuCisgICAgU0RMTUFJTl9TT1VSQ0VTPSIkc3JjZGlyL3NyYy9tYWluL2R1bW15LyouYyIKKyAgICBTRExNQUlOX0xERkxBR1M9Ii1zdGF0aWMiCitmaQorCitPQkpFQ1RTPWBlY2hvICRTT1VSQ0VTIHwgc2VkICdzLFtbXiBdXSovXChbW14gXV0qXClcLmFzbSwkKG9iamVjdHMpL1wxLmxvLGcnYAorT0JKRUNUUz1gZWNobyAkT0JKRUNUUyB8IHNlZCAncyxbW14gXV0qL1woW1teIF1dKlwpXC5jYywkKG9iamVjdHMpL1wxLmxvLGcnYAorT0JKRUNUUz1gZWNobyAkT0JKRUNUUyB8IHNlZCAncyxbW14gXV0qL1woW1teIF1dKlwpXC5tLCQob2JqZWN0cykvXDEubG8sZydgCitPQkpFQ1RTPWBlY2hvICRPQkpFQ1RTIHwgc2VkICdzLFtbXiBdXSovXChbW14gXV0qXClcLmMsJChvYmplY3RzKS9cMS5sbyxnJ2AKK09CSkVDVFM9YGVjaG8gJE9CSkVDVFMgfCBzZWQgJ3MsW1teIF1dKi9cKFtbXiBdXSpcKVwuUywkKG9iamVjdHMpL1wxLmxvLGcnYAorT0JKRUNUUz1gZWNobyAkT0JKRUNUUyB8IHNlZCAncyxbW14gXV0qL1woW1teIF1dKlwpXC5yYywkKG9iamVjdHMpL1wxLmxvLGcnYAorCitTRExNQUlOX09CSkVDVFM9YGVjaG8gJFNETE1BSU5fU09VUkNFUyB8IHNlZCAncyxbW14gXV0qL1woW1teIF1dKlwpXC5jYywkKG9iamVjdHMpL1wxLmxvLGcnYAorU0RMTUFJTl9PQkpFQ1RTPWBlY2hvICRTRExNQUlOX09CSkVDVFMgfCBzZWQgJ3MsW1teIF1dKi9cKFtbXiBdXSpcKVwubSwkKG9iamVjdHMpL1wxLmxvLGcnYAorU0RMTUFJTl9PQkpFQ1RTPWBlY2hvICRTRExNQUlOX09CSkVDVFMgfCBzZWQgJ3MsW1teIF1dKi9cKFtbXiBdXSpcKVwuYywkKG9iamVjdHMpL1wxLmxvLGcnYAorCisjIFNldCBydW50aW1lIHNoYXJlZCBsaWJyYXJ5IHBhdGhzIGFzIG5lZWRlZAorCitpZiB0ZXN0ICJ4JGVuYWJsZV9ycGF0aCIgPSAieHllcyI7IHRoZW4KKyAgaWYgdGVzdCAkQVJDSCA9IGJzZGkgLW8gJEFSQ0ggPSBmcmVlYnNkIC1vICRBUkNIID0gaXJpeCAtbyAkQVJDSCA9IGxpbnV4IC1vICRBUkNIID0gbmV0YnNkOyB0aGVuCisgICAgU0RMX1JMRF9GTEFHUz0iLVdsLC1ycGF0aCxcJHtsaWJkaXJ9IgorICBmaQorICBpZiB0ZXN0ICRBUkNIID0gc29sYXJpczsgdGhlbgorICAgIFNETF9STERfRkxBR1M9Ii1SXCR7bGliZGlyfSIKKyAgZmkKK2Vsc2UKKyAgU0RMX1JMRF9GTEFHUz0iIgorZmkKKworY2FzZSAiJEFSQ0giIGluCisgIG1hY29zeCkKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19jb2NvYSA9IHh5ZXM7IHRoZW4KKyAgICAgIFNETF9MSUJTPSIkU0RMX0xJQlMgLVdsLC1mcmFtZXdvcmssQ29jb2EiCisgICAgZmkKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3ZpZGVvID0geHllcyAtYSB4JGVuYWJsZV92aWRlb19jYXJib24gPSB4eWVzOyB0aGVuCisgICAgICBTRExfTElCUz0iJFNETF9MSUJTIC1XbCwtZnJhbWV3b3JrLENhcmJvbiIKKyAgICBmaQorICAgICMgRXZpbCBoYWNrIHRvIGFsbG93IHN0YXRpYyBsaW5raW5nIG9uIE1hYyBPUyBYCisgICAgU0RMX1NUQVRJQ19MSUJTPSJcJHtsaWJkaXJ9L2xpYlNETG1haW4uYSBcJHtsaWJkaXJ9L2xpYlNETC5hICRFWFRSQV9MREZMQUdTIgorICAgIDs7CisgICopCisgICAgU0RMX1NUQVRJQ19MSUJTPSIkU0RMX0xJQlMgJEVYVFJBX0xERkxBR1MiCisgICAgOzsKK2VzYWMKKworZG5sIEV4cGFuZCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMgbmVlZGVkIGJ5IGFwcHMgdXNpbmcgU0RMCitBQ19TVUJTVChTRExfQ0ZMQUdTKQorQUNfU1VCU1QoU0RMX0xJQlMpCitBQ19TVUJTVChTRExfU1RBVElDX0xJQlMpCitBQ19TVUJTVChTRExfUkxEX0ZMQUdTKQoraWYgdGVzdCB4JGVuYWJsZV9zaGFyZWQgPSB4eWVzOyB0aGVuCisgICAgRU5BQkxFX1NIQVJFRF9UUlVFPQorICAgIEVOQUJMRV9TSEFSRURfRkFMU0U9IiMiCitlbHNlCisgICAgRU5BQkxFX1NIQVJFRF9UUlVFPSIjIgorICAgIEVOQUJMRV9TSEFSRURfRkFMU0U9CitmaQoraWYgdGVzdCB4JGVuYWJsZV9zdGF0aWMgPSB4eWVzOyB0aGVuCisgICAgRU5BQkxFX1NUQVRJQ19UUlVFPQorICAgIEVOQUJMRV9TVEFUSUNfRkFMU0U9IiMiCitlbHNlCisgICAgRU5BQkxFX1NUQVRJQ19UUlVFPSIjIgorICAgIEVOQUJMRV9TVEFUSUNfRkFMU0U9CitmaQorQUNfU1VCU1QoRU5BQkxFX1NIQVJFRF9UUlVFKQorQUNfU1VCU1QoRU5BQkxFX1NIQVJFRF9GQUxTRSkKK0FDX1NVQlNUKEVOQUJMRV9TVEFUSUNfVFJVRSkKK0FDX1NVQlNUKEVOQUJMRV9TVEFUSUNfRkFMU0UpCisKK2RubCBFeHBhbmQgdGhlIHNvdXJjZXMgYW5kIG9iamVjdHMgbmVlZGVkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5CitBQ19TVUJTVChhY19hdXhfZGlyKQorQUNfU1VCU1QoSU5DTFVERSkKK0FDX1NVQlNUKFNPVVJDRVMpCitBQ19TVUJTVChPQkpFQ1RTKQorQUNfU1VCU1QoU0RMTUFJTl9TT1VSQ0VTKQorQUNfU1VCU1QoU0RMTUFJTl9PQkpFQ1RTKQorQUNfU1VCU1QoU0RMTUFJTl9MREZMQUdTKQorQUNfU1VCU1QoQlVJTERfQ0ZMQUdTKQorQUNfU1VCU1QoRVhUUkFfQ0ZMQUdTKQorQUNfU1VCU1QoQlVJTERfTERGTEFHUykKK0FDX1NVQlNUKEVYVFJBX0xERkxBR1MpCitBQ19TVUJTVChXSU5EUkVTKQorCitBQ19PVVRQVVQoWworICAgIE1ha2VmaWxlIHNkbC1jb25maWcgU0RMLnNwZWMgU0RMLnFwZyBzZGwucGMKK10sIFsKKyAgICA6ID5idWlsZC1kZXBzCisgICAgaWYgdGVzdCB4IiRNQUtFIiA9IHg7IHRoZW4gTUFLRT1tYWtlOyBmaTsgJE1BS0UgZGVwZW5kCitdKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxNmRmYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzLmh0bWwKQEAgLTAsMCArMSw2OTggQEAKKzxIVE1MPgorPEhFQUQ+PFRJVExFPlNETCBTdGFibGUgUmVsZWFzZTwvVElUTEU+PC9IRUFEPgorPEJPRFkgQkdDT0xPUj0iI0ZGRUJDRCIgVEVYVD0iIzAwMDAwMCI+CisKKzxJTUcgU1JDPSJkb2NzL2ltYWdlcy9yYWluYm93LmdpZiIgQUxUPSJbc2VwYXJhdG9yXSIgV0lEVEg9IjEwMCUiPgorPFA+CitUaGlzIHNvdXJjZSBpcyBzdGFibGUsIGFuZCBpcyBmdWxseSB0ZXN0ZWQgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuPGJyPgorUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgb3IgcXVlc3Rpb25zIHRvIHRoZSBTREwgbWFpbGluZyBsaXN0Ojxicj4KKzxhIGhyZWY9Imh0dHA6Ly93d3cubGlic2RsLm9yZy9tYWlsaW5nLWxpc3QucGhwIgorICAgICAgICA+aHR0cDovL3d3dy5saWJzZGwub3JnL21haWxpbmctbGlzdC5waHA8L2E+PGJyPgorVGhlIGxhdGVzdCBzdGFibGUgcmVsZWFzZSBtYXkgYmUgZm91bmQgb24gdGhlCisJPGEgaHJlZj0iaHR0cDovL3d3dy5saWJzZGwub3JnLyI+U0RMIHdlYnNpdGU8L0E+LgorPC9QPgorCis8SDI+IDxBIEhSRUY9ImRvY3MvaW5kZXguaHRtbCI+QVBJIERvY3VtZW50YXRpb248L0E+IDwvSDI+CisKKzxJTUcgU1JDPSJkb2NzL2ltYWdlcy9yYWluYm93LmdpZiIgQUxUPSJbc2VwYXJhdG9yXSIgV0lEVEg9IjEwMCUiPgorCis8SDI+IFNETCAxLjIuMTUgUmVsZWFzZSBOb3RlcyA8L0gyPgorPFA+CitTREwgMS4yLjE1IGlzIGEgbWlub3IgYnVnIGZpeCByZWxlYXNlLgorPC9QPgorCis8SDM+IEdlbmVyYWwgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlGaXhlZCBhc3NlbWJseSByZWdpc3RlciBjbG9iYmVyaW5nIGluIENQVSBpbmZvIHJvdXRpbmVzCis8L1A+Cis8UD4KKwlGaXhlZCBtZW1vcnkgc3RvbXAgd2hlbiB1c2luZyBzdHJldGNoIGJsaXQgb24gbGFyZ2UgaW1hZ2VzCis8L1A+Cis8UD4KKwlGaXhlZCBwaXhlbCBjb3JydXB0aW9uIHdpdGggb3ZlcmxhcHBpbmcgYmxpdHMKKzwvUD4KKzxQPgorCVNETF9KT1lTVElDS19ERVZJQ0UgY2FuIGJlIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2Ygam95c3RpY2sgZGV2aWNlcworPC9QPgorPFA+CisJRGlzYWJsZWQgTU1YIGJsaXR0ZXJzIHNpbmNlIHRoZXkgZG9uJ3QgY29tcGlsZSBvbiBtb2Rlcm4gY29tcGlsZXJzCis8L1A+Cis8L0JMT0NLUVVPVEU+CisKKzxIMz4gVW5peCBOb3RlcyA8L0gzPgorCis8QkxPQ0tRVU9URT4KKzxQPgorCUZpeGVkIGNyYXNoIGluIGpveXN0aWNrIGNvZGUgb24gbmV3ZXIgTGludXgga2VybmVscworPC9QPgorPFA+CisJRml4ZWQgY2hhbm5lbCBzd2l6emxpbmcgZm9yIEFMU0EgdGFyZ2V0IHdpdGggNi1jaGFubmVsIG91dHB1dAorPC9QPgorPFA+CisJVXNlIHRoZSBPcGVuR0wgR0xYX0VYVF9zd2FwX2NvbnRyb2wgZXh0ZW5zaW9uIGlmIGF2YWlsYWJsZQorPC9QPgorPFA+CisJWFJhbmRSIHN1cHBvcnQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGl0IGNhdXNlcyBkZXNrdG9wIHJlY29uZmlndXJpbmcuICBJdCBjYW4gYmUgZW5hYmxlZCB3aXRoIHRoZSBTRExfVklERU9fWDExX1hSQU5EUj0xIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBieSBhcHBseWluZyB0aGlzIHBhdGNoOiA8YSBocmVmPSJodHRwOi8vaGcubGlic2RsLm9yZy9TREwvcmF3LXJldi84ZWMzMDM2MDk4ZGYiPmh0dHA6Ly9oZy5saWJzZGwub3JnL1NETC9yYXctcmV2LzhlYzMwMzYwOThkZjwvYT4KKzwvUD4KKzwvQkxPQ0tRVU9URT4KKworPEgzPiBXaW5kb3dzIE5vdGVzIDwvSDM+CisKKzxCTE9DS1FVT1RFPgorPFA+CisJRml4ZWQgU0RMX0dMX0FDQ0VMRVJBVEVEX1ZJU1VBTCBoYW5kbGluZworPC9QPgorPFA+CisJRml4ZWQgYXBwbGljYXRpb24gc3RhdGUgaGFuZGxpbmcgd2l0aCBBTFQtVGFiCis8L1A+Cis8UD4KKwlGaXhlZCBvY2Nhc2lvbmFsIGNyYXNoIGhhbmRsaW5nIFdNX0FDVElWQVRFQVBQIGluIERpcmVjdCBYIGNvZGUKKzwvUD4KKzxQPgorCUZpeGVkIFVURi04IGRlY29kaW5nIG9mIFJ1c3NpYW4gY2hhcmFjdGVycworPC9QPgorPC9CTE9DS1FVT1RFPgorCis8SDM+IE1hYyBPUyBYIE5vdGVzIDwvSDM+CisKKzxCTE9DS1FVT1RFPgorPFA+CisJRml4ZWQgYnVpbGRpbmcgYW5kIHJ1bm5pbmcgb24gTWFjIE9TIFggMTAuNyAoTGlvbikKKzwvUD4KKzwvQkxPQ0tRVU9URT4KKworPElNRyBTUkM9ImRvY3MvaW1hZ2VzL3JhaW5ib3cuZ2lmIiBBTFQ9IltzZXBhcmF0b3JdIiBXSURUSD0iMTAwJSI+CisKKzxIMj4gU0RMIDEuMi4xNCBSZWxlYXNlIE5vdGVzIDwvSDI+Cis8UD4KK1NETCAxLjIuMTQgaXMgYSBzaWduaWZpY2FudCBidWcgZml4IHJlbGVhc2UgYW5kIGEgcmVjb21tZW5kZWQgdXBkYXRlLgorPC9QPgorCis8SDM+IEdlbmVyYWwgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlGaXhlZCBmbGlja2VyIHdoZW4gcmVzaXppbmcgdGhlIFNETCB3aW5kb3cKKzwvUD4KKzxQPgorCUZpeGVkIGNyYXNoIGluIFNETF9TZXRHYW1tYVJhbXAoKQorPC9QPgorPFA+CisJRml4ZWQgZnJlZXplIGluIFNETF9tZW1zZXQoKSB3aXRoIDAgbGVuZ3RoIHdoZW4gYXNzZW1ibHkgY29kZSBpcyBkaXNhYmxlZC4KKzwvUD4KKzxQPgorCUFkZGVkIFNETF9ESVNBQkxFX0xPQ0tfS0VZUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbmFibGUgbm9ybWFsIHVwL2Rvd24gZXZlbnRzIGZvciBDYXBzLUxvY2sgYW5kIE51bS1Mb2NrIGtleXMuCis8L1A+Cis8UD4KKwlGaXhlZCBhdWRpbyBxdWFsaXR5IHByb2JsZW0gd2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gMjIwNTAgSHogYW5kIDQ0MTAwIEh6LgorPC9QPgorPFA+CisJRml4ZWQgYSB0aHJlYWRpbmcgY3Jhc2ggd2hlbiBhIGZldyB0aHJlYWRzIGFyZSByYXBpZGx5IGNyZWF0ZWQgYW5kIGNvbXBsZXRlLgorPC9QPgorPFA+CisJSW5jcmVhc2VkIGFjY3VyYWN5IG9mIGFscGhhIGJsZW5kaW5nIHJvdXRpbmVzLgorPC9QPgorPFA+CisJRml4ZWQgY3Jhc2ggbG9hZGluZyBCTVAgZmlsZXMgc2F2ZWQgd2l0aCB0aGUgc2NhbmxpbmVzIGludmVydGVkLgorPC9QPgorPFA+CisJRml4ZWQgbW91c2UgY29vcmRpbmF0ZSBjbGFtcGluZyBpZiBTRExfU2V0VmlkZW9Nb2RlKCkgaXNuJ3QgY2FsbGVkIGluIHJlc3BvbnNlIHRvIFNETF9WSURFT1JFU0laRSBldmVudC4KKzwvUD4KKzxQPgorCUFkZGVkIGRveHlnZW4gZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFNETCBBUEkgaGVhZGVycy4KKzwvUD4KKzwvQkxPQ0tRVU9URT4KKworPEgzPiBVbml4IE5vdGVzIDwvSDM+CisKKzxCTE9DS1FVT1RFPgorPFA+CisJRml4ZWQgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uIGR1ZSB0byBhc3NlbWJseSBidWcgd2l0aCBTRExfcmV2Y3B5KCkKKzwvUD4KKzxQPgorCUZpeGVkIGNyYXNoZXMgdHJ5aW5nIHRvIGRldGVjdCBTU0UgZmVhdHVyZXMgb24geDg2XzY0IGFyY2hpdGVjdHVyZS4KKzwvUD4KKzxQPgorCUZpeGVkIGFzc2VtYmx5IGZvciBHQ0Mgb3B0aW1pemVkIDUwJSBhbHBoYSBibGVuZGluZyBibGl0cy4KKzwvUD4KKzxQPgorCUFkZGVkIGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtc2NyZWVuc2F2ZXIsIHRvIGFsbG93IGVuYWJsaW5nIHRoZSBzY3JlZW5zYXZlciBieSBkZWZhdWx0LgorPC9QPgorPFA+CisJVXNlIFhSZXNldFNjcmVlblNhdmVyKCkgaW5zdGVhZCBvZiBkaXNhYmxpbmcgc2NyZWVuc2F2ZXIgZW50aXJlbHkuCis8L1A+Cis8UD4KKwlSZW1vdmVkIHRoZSBtYXhpbXVtIHdpbmRvdyBzaXplIGxpbWl0YXRpb24gb24gWDExLgorPC9QPgorPFA+CisJRml4ZWQgU0RMX0dMX1NXQVBfQ09OVFJPTCBvbiBYMTEuCis8L1A+Cis8UD4KKwlGaXhlZCBzZXR0aW5nIHRoZSBYMTEgd2luZG93IGlucHV0IGhpbnQuCis8L1A+Cis8UD4KKwlGaXhlZCBkaXN0b3J0ZWQgWDExIHdpbmRvdyBpY29uIGZvciBzb21lIHZpc3VhbHMuCis8L1A+Cis8UD4KKwlGaXhlZCBkZXRlY3RpbmcgWDExIGxpYnJhcmllcyBmb3IgZHluYW1pYyBsb2FkaW5nIG9uIDY0LWJpdCBMaW51eC4KKzwvUD4KKzxQPgorCVNETF9HTF9HZXRBdHRyaWJ1dGUoU0RMX0dMX1NXQVBfQ09OVFJPTCkgcmV0dXJucyB0aGUgY29ycmVjdCB2YWx1ZSB3aXRoIEdMWF9TR0lfc3dhcF9jb250cm9sLgorPC9QPgorPFA+CisJQWRkZWQgU0RMX1ZJREVPX0ZVTExTQ1JFRU5fRElTUExBWSBhcyBhIHByZWZlcnJlZCBzeW5vbnltIGZvciBTRExfVklERU9fRlVMTFNDUkVFTl9IRUFEIG9uIFgxMS4KKzwvUD4KKzxQPgorCVRoZSBTRExfVklERU9fRlVMTFNDUkVFTl9ESVNQTEFZIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8gMCB0byBwbGFjZSBmdWxsc2NyZWVuIFNETCB3aW5kb3dzIG9uIHRoZSBmaXJzdCBYaW5lcmFtYSBzY3JlZW4uCis8L1A+Cis8UD4KKwlBZGRlZCB0aGUgU0RMX1ZJREVPX0ZCQ09OX1JPVEFUSU9OIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGNvbnRyb2wgb3V0cHV0IG9yaWVudGF0aW9uIG9uIHRoZSBmcmFtZWJ1ZmZlciBjb25zb2xlLgorCTxCUj4KKwlWYWxpZCB2YWx1ZXMgYXJlOgorCTxVTD4KKwk8TEk+bm90IHNldCAgIC0gTm90IHJvdGF0aW5nLCBubyBzaGFkb3cuCisJPExJPiJOT05FIiAgICAtIE5vdCByb3RhdGluZywgYnV0IHN0aWxsIHVzaW5nIHNoYWRvdy4KKwk8TEk+IkNXIiAgICAgIC0gUm90YXRpbmcgc2NyZWVuIGNsb2Nrd2lzZS4KKwk8TEk+IlVEIiAgICAgIC0gUm90YXRpbmcgc2NyZWVuIHVwc2lkZSBkb3duLgorCTxMST4iQ0NXIiAgICAgLSBSb3RhdGluZyBzY3JlZW4gY291bnRlciBjbG9ja3dpc2UuCisJPC9VTD4KKzwvUD4KKzxQPgorCUZpeGVkIERpcmVjdEZCIGRldGVjdGlvbiBvbiBzb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMuCis8L1A+Cis8UD4KKwlBZGRlZCBjb2RlIHRvIHVzZSB0aGUgUFMzIFNQRSBwcm9jZXNzb3JzIGZvciBZVVYgY29udmVyc2lvbiBvbiBMaW51eC4KKzwvUD4KKzxQPgorCVVwZGF0ZWQgQUxTQSBzdXBwb3J0IHRvIHRoZSBsYXRlc3Qgc3RhYmxlIEFQSQorPC9QPgorPFA+CisJQUxTQSBpcyBub3cgcHJlZmVycmVkIG92ZXIgT1NTIGF1ZGlvLiAgKFNETF9BVURJT0RSSVZFUj1kc3Agd2lsbCByZXN0b3JlIHRoZSBwcmV2aW91cyBiZWhhdmlvci4pCis8L1A+Cis8UD4KKwlJbXByb3ZlZCBzdXBwb3J0IGZvciBQdWxzZUF1ZGlvCis8L1A+Cis8UD4KKwlUaGUgTmV0d29yayBBdWRpbyBTeXN0ZW0gc3VwcG9ydCBpcyBub3cgZHluYW1pY2FsbHkgbG9hZGVkIGF0IHJ1bnRpbWUuCis8L1A+Cis8UD4KKwlGaXhlZCBjcmFzaCB3aXRoIHRoZSBNUC04ODY2IER1YWwgVVNCIEpveXBhZCBvbiBuZXdlciBMaW51eCBrZXJuZWxzLgorPC9QPgorPFA+CisJRml4ZWQgY3Jhc2ggaW4gU0RMX1F1aXQoKSB3aGVuIGEgam95c3RpY2sgaGFzIGJlZW4gdW5wbHVnZ2VkLgorPC9QPgorPC9CTE9DS1FVT1RFPgorCis8SDM+IFdpbmRvd3MgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlWZXJpZmllZCAxMDAlIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzIDcuCis8L1A+Cis8UD4KKwlQcmV2ZW50IGxvc3Mgb2YgT3BlbkdMIGNvbnRleHQgd2hlbiBzZXR0aW5nIHRoZSB2aWRlbyBtb2RlIGluIHJlc3BvbnNlIHRvIGEgd2luZG93IHJlc2l6ZSBldmVudC4KKzwvUD4KKzxQPgorCUZpeGVkIHZpZGVvIGluaXRpYWxpemF0aW9uIHdpdGggU0RMX1dJTkRPV0lEIG9uIFdpbmRvd3MgWFAuCis8L1A+Cis8UD4KKwlJbXByb3ZlZCBtb3VzZSBpbnB1dCByZXNwb25zaXZlbmVzcyBmb3IgZmlyc3QtcGVyc29uLXNob290ZXIgZ2FtZXMuCis8L1A+Cis8UD4KKwlJTUUgbWVzc2FnZXMgYXJlIG5vdyBnZW5lcmF0ZWQgZm9yIGxvY2FsaXplZCBpbnB1dC4KKzwvUD4KKzxQPgorCVNETF9SV0Zyb21GaWxlKCkgdGFrZXMgYSBVVEYtOCBmaWxlbmFtZSB3aGVuIG9wZW5pbmcgYSBmaWxlLgorPC9QPgorPFA+CisJVGhlIFNETF9TVERJT19SRURJUkVDVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB3aGV0aGVyIFNETCByZWRpcmVjdHMgc3RkaW8gdG8gc3Rkb3V0LnR4dCBhbmQgc3RkZXJyLnR4dC4KKzwvUD4KKzxQPgorCUZpeGVkIGR5bmFtaWMgb2JqZWN0IGxvYWRpbmcgb24gV2luZG93cyBDRS4KKzwvUD4KKzwvQkxPQ0tRVU9URT4KKworPEgzPiBNYWMgT1MgWCBOb3RlcyA8L0gzPgorCis8QkxPQ0tRVU9URT4KKzxQPgorCVNETCBub3cgYnVpbGRzIG9uIE1hYyBPUyBYIDEwLjYgKFNub3cgTGVvcGFyZCkuCisJPEJSPgorCUVyaWMgV2luZyBwb3N0ZWQgYSBnb29kIHJ1bmRvd24gb24gdGhlIG51bWVyb3VzIGNoYW5nZXMgaGVyZTogPEEgSFJFRj0iaHR0cDovL3BsYXljb250cm9sLm5ldC9ld2luZy9qaWJiZXJqYWJiZXIvYmlnX2JlaGluZC10aGUtc2NlbmVzX2NoYW5nLmh0bWwiPmh0dHA6Ly9wbGF5Y29udHJvbC5uZXQvZXdpbmcvamliYmVyamFiYmVyL2JpZ19iZWhpbmQtdGhlLXNjZW5lc19jaGFuZy5odG1sPC9BPgorPC9QPgorPFA+CisJVGhlIFgxMSB2aWRlbyBkcml2ZXIgaXMgYnVpbHQgYnkgZGVmYXVsdC4KKzwvUD4KKzxQPgorCUZpeGVkIFNETF9WSURFT19XSU5ET1dfUE9TIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBRdWFydHogdGFyZ2V0LgorPC9QPgorPFA+CisJRml4ZWQgc2V0dGluZyB0aGUgc3RhcnRpbmcgd29ya2luZyBkaXJlY3RvcnkgaW4gcmVsZWFzZSBidWlsZHMuCis8L1A+Cis8L0JMT0NLUVVPVEU+CisKKzxJTUcgU1JDPSJkb2NzL2ltYWdlcy9yYWluYm93LmdpZiIgQUxUPSJbc2VwYXJhdG9yXSIgV0lEVEg9IjEwMCUiPgorCis8SDI+IFNETCAxLjIuMTMgUmVsZWFzZSBOb3RlcyA8L0gyPgorPFA+CitTREwgMS4yLjEzIGlzIGEgbWlub3IgYnVnIGZpeCByZWxlYXNlLgorPC9QPgorCis8SDM+IEdlbmVyYWwgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlGaXhlZCBsaW5rIGVycm9yIHdoZW4gYnVpbGRpbmcgd2l0aCBJbnRlbCBDb21waWxlciAxMC4KKzwvUD4KKzxQPgorCVJlbW92ZWQgc3RyYXkgQysrIGNvbW1lbnQgZnJvbSBwdWJsaWMgaGVhZGVycy4KKzwvUD4KKzwvQkxPQ0tRVU9URT4KKworPEgzPiBVbml4IE5vdGVzIDwvSDM+CisKKzxCTE9DS1FVT1RFPgorPFA+CisJRml4ZWQgY3Jhc2ggaW4gU0RMX1NvZnRTdHJldGNoKCkgb24gc2VjdXJlIG9wZXJhdGluZyBzeXN0ZW1zLgorPC9QPgorPFA+CisJRml4ZWQgdW5kZWZpbmVkIHN5bWJvbCBvbiBYMTEgaW1wbGVtZW50YXRpb25zIHdpdGhvdXQgVVRGLTggc3VwcG9ydC4KKzwvUD4KKzxQPgorCVdvcmtlZCBhcm91bmQgQmFkQWxsb2MgZXJyb3Igd2hlbiB1c2luZyBYVmlkZW8gb24gdGhlIFhGcmVlODYgSW50ZWwgSW50ZWdyYXRlZCBHcmFwaGljcyBkcml2ZXIuCis8L1A+Cis8UD4KKwlTY2FuIGZvciBhbGwgam95c3RpY2tzIG9uIExpbnV4IGluc3RlYWQgb2Ygc3RvcHBpbmcgYXQgb25lIHRoYXQgd2FzIHJlbW92ZWQuCis8L1A+Cis8UD4KKwlGaXhlZCB1c2Ugb2Ygc2RsLWNvbmZpZyBhcmd1bWVudHMgaW4gc2RsLm00Cis8L1A+Cis8L0JMT0NLUVVPVEU+CisKKzxIMz4gV2luZG93cyBOb3RlcyA8L0gzPgorCis8QkxPQ0tRVU9URT4KKzxQPgorCUZpeGVkIGNyYXNoIHdoZW4gYSB2aWRlbyBkcml2ZXIgcmVwb3J0cyBoaWdoZXIgdGhhbiAzMiBicHAgdmlkZW8gbW9kZXMuCis8L1A+Cis8UD4KKwlGaXhlZCByZXN0b3JpbmcgdGhlIGRlc2t0b3AgYWZ0ZXIgc2V0dGluZyBhIDI0LWJpdCBPcGVuR0wgdmlkZW8gbW9kZS4KKzwvUD4KKzxQPgorCUZpeGVkIHdpbmRvdyB0aXRsZXMgb24gV2luZG93cyA5NS85OC9NRS4KKzwvUD4KKzxQPgorCUFkZGVkIFNETF9CVVRUT05fWDEgYW5kIFNETF9CVVRUT05fWDIgY29uc3RhbnRzIGZvciBleHRlbmRlZCBtb3VzZSBidXR0b25zLgorPC9QPgorPFA+CisJQWRkZWQgc3VwcG9ydCBmb3IgcXVvdGVkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCis8L1A+Cis8L0JMT0NLUVVPVEU+CisKKzxIMz4gTWFjIE9TIFggTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlTREwgbm93IGJ1aWxkcyBvbiBNYWMgT1MgWCAxMC41IChMZW9wYXJkKS4KKzwvUD4KKzxQPgorCUZpeGVkIGhpZ2ggZnJlcXVlbmN5IGNyYXNoIGludm9sdmluZyB0ZXh0IGlucHV0LgorPC9QPgorPFA+CisJRml4ZWQgYmVlcGluZyB3aGVuIHRoZSBlc2NhcGUga2V5IGlzIHByZXNzZWQgYW5kIFVOSUNPREUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZC4KKzwvUD4KKzxQPgorCUltcHJvdmVkIHRyYWNrcGFkIHNjcm9sbGluZyBzdXBwb3J0LgorPC9QPgorPFA+CisJRml4ZWQgam95c3RpY2sgaGF0IHJlcG9ydGluZyBmb3IgY2VydGFpbiBqb3lzdGlja3MuCis8L1A+Cis8L0JMT0NLUVVPVEU+CisKKzxJTUcgU1JDPSJkb2NzL2ltYWdlcy9yYWluYm93LmdpZiIgQUxUPSJbc2VwYXJhdG9yXSIgV0lEVEg9IjEwMCUiPgorCis8SDI+IFNETCAxLjIuMTIgUmVsZWFzZSBOb3RlcyA8L0gyPgorPFA+CitTREwgMS4yLjEyIGlzIGEgbWlub3IgYnVnIGZpeCByZWxlYXNlLgorPC9QPgorCis8SDM+IEdlbmVyYWwgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlBZGRlZCBzdXBwb3J0IGZvciB0aGUgUHVsc2VBdWRpbyBzb3VuZCBzZXJ2ZXI6IGh0dHA6Ly93d3cucHVsc2VhdWRpby5vcmcvCis8L1A+Cis8UD4KKwlBZGRlZCBTRExfVklERU9fQUxMT1dfU0NSRUVOU0FWRVIgdG8gb3ZlcnJpZGUgU0RMJ3MgZGlzYWJsaW5nIG9mIHRoZSBzY3JlZW5zYXZlciBvbiBNYWMgT1MgWCwgV2luZG93cywgYW5kIFgxMS4KKzwvUD4KKzxQPgorCUZpeGVkIGJ1ZmZlciBvdmVycnVuIGNyYXNoIHdoZW4gcmVzYW1wbGluZyBhdWRpbyByYXRlcy4KKzwvUD4KKzxQPgorCUZpeGVkIGF1ZGlvIGJ1ZyB3aGVyZSBjb252ZXJ0aW5nIHRvIG1vbm8gd2FzIGRvdWJsaW5nIHRoZSB2b2x1bWUuCis8L1A+Cis8UD4KKwlGaXhlZCBvZmYtYnktb25lIGVycm9yIGluIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFNETF9yZXZjcHkoKQorPC9QPgorPFA+CisJRml4ZWQgY29tcGlsaW5nIHdpdGggU3VuIFN0dWRpby4KKzwvUD4KKzxQPgorCVN1cHBvcnQgZm9yIEFtaWdhT1MgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYWluIFNETCBjb2RlLgorPC9QPgorPFA+CisJU3VwcG9ydCBmb3IgTm9raWEgOTIxMCAiRVBPQyIgZHJpdmVyIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbWFpbiBTREwgY29kZS4KKzwvUD4KKzxQPgorCVVub2ZmaWNpYWwgc3VwcG9ydCBmb3IgdGhlIFM2MC9TeW1iaWFuT1MgcGxhdGZvcm0gaGFzIGJlZW4gYWRkZWQuCis8L1A+Cis8UD4KKwlVbm9mZmljaWFsIHN1cHBvcnQgZm9yIHRoZSBOaW50ZW5kbyBEUyBwbGF0Zm9ybSBoYXMgYmVlbiBhZGRlZC4KKzwvUD4KKzxQPgorCVJlZW5hYmxlZCBNTVggYXNzZW1ibHkgZm9yIFlVViBvdmVybGF5IHByb2Nlc3NpbmcgKEdOVSBDIENvbXBpbGVyIG9ubHkpLgorPC9QPgorPC9CTE9DS1FVT1RFPgorCis8SDM+IFVuaXggTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlGaXhlZCBkZXRlY3Rpb24gb2YgWDExIERHQSBtb3VzZSBzdXBwb3J0LgorPC9QPgorPFA+CisJSW1wcm92ZWQgWElNIHN1cHBvcnQgZm9yIGFzaWFuIGNoYXJhY3RlciBzZXRzLgorPC9QPgorPFA+CisJVGhlIEdGWF9EaXNwbGF5IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBYMTEgd2luZG93IGluZm9ybWF0aW9uIGluIFNETF9zeXN3bS5oLgorPC9QPgorPFA+CisJRml4ZWQgUEFHRV9TSVpFIGNvbXBpbGUgZXJyb3IgaW4gdGhlIGZiY29uIHZpZGVvIGRyaXZlciBvbiBuZXdlciBMaW51eCBrZXJuZWxzLgorPC9QPgorPFA+CisJRml4ZWQgaGFuZyBvciBjcmFzaCBhdCBzdGFydHVwIGlmIGFSdHMgY2FuJ3QgYWNjZXNzIHRoZSBoYXJkd2FyZS4KKzwvUD4KKzxQPgorCUZpeGVkIHJlbGF0aXZlIG1vdXNlIG1vZGUgd2hlbiB0aGUgY3Vyc29yIHN0YXJ0cyBvdXRzaWRlIHRoZSBYMTEgd2luZG93LgorPC9QPgorPFA+CisJRml4ZWQgYWNjaWRlbnRhbCBmcmVlIG9mIHN0YWNrIG1lbW9yeSBpbiBYMTEgbW91c2UgYWNjZWxlcmF0aW9uIGNvZGUuCis8L1A+Cis8UD4KKwlDbG9zZWQgbWlub3IgbWVtb3J5IGxlYWsgaW4gWE1FIGNvZGUuCis8L1A+Cis8UD4KKwlGaXhlZCBURVhUUkVMcyBpbiB0aGUgbGlicmFyeSB0byByZXNvbHZlIHNvbWUgUElDIGlzc3Vlcy4KKzwvUD4KKzwvQkxPQ0tRVU9URT4KKworPEgzPiBXaW5kb3dzIE5vdGVzIDwvSDM+CisKKzxCTE9DS1FVT1RFPgorPFA+CisJVGhlIEdESSB2aWRlbyBkcml2ZXIgbWFrZXMgYmV0dGVyIHVzZSBvZiB0aGUgcGFsZXR0ZSBpbiA4LWJpdCBtb2Rlcy4KKzwvUD4KKzxQPgorCVRoZSB3aW5kaWIgZHJpdmVyIG5vdyBzdXBwb3J0cyBtb3JlIG1vdXNlIGJ1dHRvbnMgd2l0aCBXTV9YQlVUVE9OIGV2ZW50cy4KKzwvUD4KKzxQPgorCU9uIFdpbmRvd3MsIFNETF9TZXRWaWRlb01vZGUoKSB3aWxsIHJlLWNyZWF0ZSB0aGUgd2luZG93IGluc3RlYWQgb2YgZmFpbGluZyBpZiB0aGUgbXVsdGlzYW1wbGUgc2V0dGluZ3MgYXJlIGNoYW5nZWQuCis8L1A+Cis8UD4KKwlBZGRlZCBzdXBwb3J0IGZvciBVVEYtOCB3aW5kb3cgdGl0bGVzIG9uIFdpbmRvd3MuCis8L1A+Cis8UD4KKwlGaXhlZCBqb3lzdGljayBkZXRlY3Rpb24gb24gV2luZG93cy4KKzwvUD4KKzxQPgorCUltcHJvdmVkIHBlcmZvcm1hbmNlIHdpdGggV2luMzIgZmlsZSBJL08uCis8L1A+Cis8UD4KKwlGaXhlZCBIQklUTUFQIGxlYWsgaW4gR0FQSSBkcml2ZXIuCis8L1A+Cis8L0JMT0NLUVVPVEU+CisKKzxIMz4gTWFjIE9TIFggTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlBZGRlZCBzdXBwb3J0IGZvciBtdWx0aS1heGlzIGNvbnRyb2xsZXJzIGxpa2UgM0Rjb25ueGlvbidzIFNwYWNlTmF2aWdhdG9yIG9uIE1hYyBPUyBYLgorPC9QPgorPFA+CisJRml4ZWQgWVVWIG92ZXJsYXkgY3Jhc2ggaW5zaWRlIFF1aWNrdGltZSBvbiBJbnRlbCBNYWMgT1MgWC4KKzwvUD4KKzxQPgorCUZpeGVkIGJsaXR0aW5nIGFsaWdubWVudCBpbiBBbHRpdmVjIGFscGhhIGJsaXQgZnVuY3Rpb25zLgorPC9QPgorPFA+CisJS2V5cyBGMTMsIEYxNCwgYW5kIEYxNSBhcmUgbm93IHVzYWJsZSBvbiBBcHBsZSBrZXlib2FyZHMgdW5kZXIgTWFjIE9TIFguCis8L1A+Cis8UD4KKwlGaXhlZCBqb3lzdGljayBjYWxpYnJhdGlvbiBjb2RlIG9uIE1hYyBPUyBYLgorPC9QPgorPFA+CisJRml4ZWQgbW91c2Ugaml0dGVyIHdoZW4gbXVsdGlwbGUgbW90aW9uIGV2ZW50cyBhcmUgcXVldWVkIHVwIGluIE1hYyBPUyBYLgorPC9QPgorPFA+CisJRml4ZWQgY2hhbmdpbmcgdGhlIGN1cnNvciBpbiBmdWxsc2NyZWVuIG1vZGUgb24gTWFjIE9TIFguCis8L1A+Cis8L0JMT0NLUVVPVEU+CisKKzxIMz4gTWFjIE9TIENsYXNzaWMgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlBZGRlZCBzdXBwb3J0IGZvciBnYW1tYSByYW1wcyB0byBib3RoIHRvb2xib3ggYW5kIERyYXdTcHJvY2tldCB2aWRlbyBkcml2ZXJzLgorPC9QPgorPC9CTE9DS1FVT1RFPgorCis8SDM+IEJlT1MgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlJbXBsZW1lbnRlZCBtb3VzZSBncmFiYmluZyBhbmQgbW91c2UgcmVsYXRpdmUgbW9kZSBvbiBCZU9TLgorPC9QPgorPC9CTE9DS1FVT1RFPgorCis8SU1HIFNSQz0iZG9jcy9pbWFnZXMvcmFpbmJvdy5naWYiIEFMVD0iW3NlcGFyYXRvcl0iIFdJRFRIPSIxMDAlIj4KKworPEgyPiBTREwgMS4yLjExIFJlbGVhc2UgTm90ZXMgPC9IMj4KKzxQPgorU0RMIDEuMi4xMSBpcyBhIG1pbm9yIGJ1ZyBmaXggcmVsZWFzZS4KKzwvUD4KKworPEgzPiBVbml4IE5vdGVzIDwvSDM+CisKKzxCTE9DS1FVT1RFPgorPFA+CisJRHluYW1pYyBYMTEgbG9hZGluZyBpcyBvbmx5IGVuYWJsZWQgd2l0aCBnY2MgNCBzdXBwb3J0aW5nIC1mdmlzaWJpbGl0eT1oaWRkZW4uICBUaGlzIGZpeGVzIGNyYXNoZXMgcmVsYXRlZCB0byBzeW1ib2wgY29sbGlzaW9ucywgYW5kIGFsbG93cyBidWlsZGluZyBvbiBTb2xhcmlzIGFuZCBJUklYLgorPC9QPgorPFA+CisJRml4ZWQgYnVpbGRpbmcgU0RMIHdpdGggWGluZXJhbWEgZGlzYWJsZWQuCis8L1A+Cis8UD4KKwlGaXhlZCBEUkkgT3BlbkdMIGxpYnJhcnkgbG9hZGluZywgdXNpbmcgUlRMRF9HTE9CQUwgaW4gZGxvcGVuKCkuCis8L1A+Cis8UD4KKwlBZGRlZCBwa2djb25maWcgY29uZmlndXJhdGlvbiBzdXBwb3J0LgorPC9QPgorPC9CTE9DS1FVT1RFPgorCis8SDM+IFdpbmRvd3MgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlTZXR0aW5nIFNETF9HTF9TV0FQX0NPTlRST0wgbm93IHdvcmtzIHdpdGggV2luZG93cyBPcGVuR0wuCis8L1A+Cis8UD4KKwlUaGUgV2luMzIgd2luZG93IHBvc2l0aW9uaW5nIGNvZGUgd29ya3MgcHJvcGVybHkgZm9yIHdpbmRvd3Mgd2l0aCBtZW51cy4KKzwvUD4KKzxQPgorCURpcmVjdFNvdW5kIGF1ZGlvIHF1YWxpdHkgaGFzIGJlZW4gaW1wcm92ZWQgb24gY2VydGFpbiBzb3VuZCBjYXJkcy4KKzwvUD4KKzxQPgorCUZpeGVkIDUuMSBhdWRpbyBjaGFubmVsIG9yZGVyaW5nIG9uIFdpbmRvd3MgYW5kIE1hYyBPUyBYLgorPC9QPgorPFA+CisJUGx1Z2dlZCBhIGNvdXBsZSBvZiBtaW5vciBtZW1vcnkgbGVha3MgaW4gdGhlIHdpbmRpYiB2aWRlbyBkcml2ZXIuCis8L1A+Cis8UD4KKwlGaXhlZCB0eXBlIGNvbGxpc2lvbiB3aXRoIHN0ZGludC5oIHdoZW4gYnVpbGRpbmcgd2l0aCBnY2Mgb24gV2luMzIuCis8L1A+Cis8UD4KKwlGaXhlZCBidWlsZGluZyB3aXRoIHRoZSBEaWdpdGFsIE1hcnMgQ29tcGlsZXIgb24gV2luMzIuCis8L1A+Cis8L0JMT0NLUVVPVEU+CisKKzxIMz4gTWFjIE9TIFggTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlUaGUgUXVhcnR6IHZpZGVvIGRyaXZlciBzdXBwb3J0cyAzMngzMiBjdXJzb3JzIG9uIE1hYyBPUyBYIDEwLjMgYW5kIGFib3ZlLgorPC9QPgorPC9CTE9DS1FVT1RFPgorCis8SU1HIFNSQz0iZG9jcy9pbWFnZXMvcmFpbmJvdy5naWYiIEFMVD0iW3NlcGFyYXRvcl0iIFdJRFRIPSIxMDAlIj4KKworPEgyPiBTREwgMS4yLjEwIFJlbGVhc2UgTm90ZXMgPC9IMj4KKzxQPgorU0RMIDEuMi4xMCBpcyBhIG1ham9yIHJlbGVhc2UsIGZlYXR1cmluZyBhIHJldmFtcCBvZiB0aGUgYnVpbGQgc3lzdGVtIGFuZCBtYW55IEFQSSBpbXByb3ZlbWVudHMgYW5kIGJ1ZyBmaXhlcy4KKzwvUD4KKzxIMz4gQVBJIGVuaGFuY2VtZW50cyA8L0gzPgorPFVMPgorPExJPgorCUlmIFNETF9PcGVuQXVkaW8oKSBpcyBwYXNzZWQgemVybyBmb3IgdGhlIGRlc2lyZWQgZm9ybWF0CisJZmllbGRzLCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGJlIHVzZWQKKwl0byBmaWxsIHRoZW0gaW46Cis8cHJlPjxjb2RlPgorCQlTRExfQVVESU9fRlJFUVVFTkNZCisJCVNETF9BVURJT19GT1JNQVQKKwkJU0RMX0FVRElPX0NIQU5ORUxTCisJCVNETF9BVURJT19TQU1QTEVTCis8L2NvZGU+PC9wcmU+CisJSWYgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNwZWNpZmllZCwgaXQgd2lsbCBiZSBzZXQKKwl0byBhIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZS4KKzxMST4KKwlTRExfU2V0VmlkZW9Nb2RlKCkgbm93IGFjY2VwdHMgMCBmb3Igd2lkdGggb3IgaGVpZ2h0IGFuZCB3aWxsIHVzZQorCXRoZSBjdXJyZW50IHZpZGVvIG1vZGUgKG9yIHRoZSBkZXNrdG9wIG1vZGUgaWYgbm8gbW9kZSBoYXMgYmVlbiBzZXQuKQorPExJPgorCUFkZGVkIGN1cnJlbnRfdyBhbmQgY3VycmVudF9oIHRvIHRoZSBTRExfVmlkZW9JbmZvIHN0cnVjdHVyZSwKKwl3aGljaCBpcyBzZXQgdG8gdGhlIGRlc2t0b3AgcmVzb2x1dGlvbiBkdXJpbmcgdmlkZW8gaW50aWFsaXphdGlvbiwKKwlhbmQgdGhlbiBzZXQgdG8gdGhlIGN1cnJlbnQgcmVzb2x1dGlvbiB3aGVuIGEgdmlkZW8gbW9kZSBpcyBzZXQuCis8TEk+CisJU0RMX0dMX0xvYWRMaWJyYXJ5KCkgd2lsbCBsb2FkIHRoZSBzeXN0ZW0gZGVmYXVsdCBPcGVuR0wgbGlicmFyeQorCWlmIGl0IGlzIHBhc3NlZCBOVUxMIGFzIGEgcGFyYW1ldGVyLgorPExJPgorCUFkZGVkIFNETF9HTF9TV0FQX0NPTlRST0wgdG8gd2FpdCBmb3IgdnN5bmMgaW4gT3BlbkdMIGFwcGxpY2F0aW9ucy4KKzxMST4KKwlBZGRlZCBTRExfR0xfQUNDRUxFUkFURURfVklTVUFMIHRvIGd1YXJhbnRlZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24uCis8TEk+CisJU0RMX1dNX1NldENhcHRpb24oKSBub3cgb2ZmaWNpYWxseSB0YWtlcyBVVEYtOCB0aXRsZSBhbmQgaWNvbiBzdHJpbmdzLCBhbmQgZGlzcGxheXMgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzIG9uIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCis8TEk+CisJQWRkZWQgU0RMX0dldEtleVJlcGVhdCgpIHRvIHF1ZXJ5IHRoZSBrZXkgcmVwZWF0IHNldHRpbmdzLgorPExJPgorCUFkZGVkIHRoZSAiZHVtbXkiIGF1ZGlvIGRyaXZlciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZW11bGF0ZSBhdWRpbworCW91dHB1dCB3aXRob3V0IGEgc291bmQgY2FyZC4KKzxMST4KKwlBZGRlZCBTRExfY29uZmlnLmgsIHdpdGggZGVmYXVsdHMgZm9yIHZhcmlvdXMgYnVpbGQgZW52aXJvbm1lbnRzLgorPC9VTD4KKworPEgzPiBHZW5lcmFsIE5vdGVzIDwvSDM+CisKKzxCTE9DS1FVT1RFPgorPFA+CisJVGhlIFNETCB3ZWJzaXRlIG5vdyBoYXMgYW4gPEEgSFJFRj0iaHR0cDovL3d3dy5saWJzZGwub3JnL3Jzcy9yc3MueG1sIj5SU1MgZmVlZDwvQT4hCis8UD4KKwlUaGUgU0RMIGRldmVsb3BtZW50IHNvdXJjZSBjb2RlIGlzIG5vdyBtYW5hZ2VkIHdpdGggPEEgSFJFRj0iaHR0cDovL3d3dy5saWJzZGwub3JnL3N2bi5waHAiPlN1YnZlcnNpb248L0E+LgorPFA+CisJU0RMIG5vdyB1c2VzIHRoZSBCdWd6aWxsYSA8QSBIUkVGPSJodHRwOi8vYnVnemlsbGEubGlic2RsLm9yZy8iPmJ1ZyB0cmFja2luZyBzeXN0ZW08L0E+LCBob3N0ZWQgYnkgaWNjdWx1cy5vcmcuCis8UD4KKwlTREwgaXMgbGljZW5zZWQgdW5kZXIgdmVyc2lvbiAyLjEgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKzxQPgorCVRoZSBlbnRpcmUgYnVpbGQgc3lzdGVtIGhhcyBiZWVuIHJldmFtcGVkIHRvIG1ha2UgaXQgbXVjaCBtb3JlIHBvcnRhYmxlLCBpbmNsdWRpbmcgdmVyc2lvbnMgb2YgQyBsaWJyYXJ5IGZ1bmN0aW9ucyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHJ1biBTREwgb24gYSBtaW5pbWFsIGVtYmVkZGVkIGVudmlyb25tZW50LiAgU2VlIFJFQURNRS5Qb3J0aW5nIGluIHRoZSBTREwgc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHBvcnQgU0RMIHRvIGEgbmV3IHBsYXRmb3JtLgorPFA+CisJU0RMX29wZW5nbC5oIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aGUgbGF0ZXN0IGdsZXh0LmggZnJvbSA8QSBIUkVGPSJodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvb2dsLXNhbXBsZS9yZWdpc3RyeS8iPmh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9vZ2wtc2FtcGxlL3JlZ2lzdHJ5LzwvQT4KKzxQPgorCUFsZXggVm9sa292IGNvbnRyaWJ1dGVkIGhpZ2hseSBvcHRpbWl6ZWQgUkdCIDwtPiBSR0JBIGJsaXR0ZXJzLgorPC9CTE9DS1FVT1RFPgorCis8SDM+IFVuaXggTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlUaGUgWDExIGxpYnJhcmllcyBhcmUgZHluYW1pY2FsbHkgbG9hZGVkIGF0IHJ1bnRpbWUgYnkgZGVmYXVsdC4gIFRoaXMgYWxsb3dzIHRoZSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIFNETCB0byBydW4gb24gc3lzdGVtcyB3aXRob3V0IFgxMSBsaWJyYXJpZXMgaW5zdGFsbGVkLgorPFA+CisJVGhlIFhpRyBYTUUgZXh0ZW5zaW9uIGNvZGUgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBYMTEgdmlkZW8gZHJpdmVyIGJ5IGRlZmF1bHQuCis8UD4KKwlYUmFuZFIgc3VwcG9ydCBmb3IgdmlkZW8gbW9kZSBzd2l0Y2hpbmcgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFgxMSBkcml2ZXIsIGJ1dCBpcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVzaXJlZCBpbnRlcmFjdGlvbnMgd2l0aCB3aW5kb3cgbWFuYWdlcnMuICBZb3UgY2FuIGVuYWJsZSB0aGlzIGJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFNETF9WSURFT19YMTFfWFJBTkRSIHRvIDEuCis8UD4KKwlYaW5lcmFtYSBtdWx0aS1oZWFkIGRpc3BsYXlzIGFyZSBwcm9wZXJseSBoYW5kbGVkIG5vdywgYW5kIHRoZSBTRExfVklERU9fRlVMTFNDUkVFTl9IRUFEIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgc2NyZWVuIHVzZWQgZm9yIGZ1bGxzY3JlZW4gdmlkZW8gbW9kZXMuICBOb3RlIHRoYXQgY2hhbmdpbmcgdGhlIHZpZGVvIG1vZGVzIG9ubHkgd29ya3Mgb24gc2NyZWVuIDAuCis8UD4KKwlYVmlkTW9kZSB2aWRlbyBtb2RlcyBhcmUgbm93IHNvcnRlZCBzbyB0aGV5IG1haW50YWluIHRoZSByZWZyZXNoIHJhdGVzIHNwZWNpZmllZCBpbiB0aGUgWDExIGNvbmZpZ3VyYXRpb24gZmlsZS4KKzxQPgorCVNETCB3aW5kb3dzIGFyZSBubyBsb25nZXIgdHJhbnNwYXJlbnQgaW4gWDExIGNvbXBvc2l0aW5nIHN5c3RlbXMgbGlrZSBYR0wuCis8UD4KKwlUaGUgbW91c2UgaXMgcHJvcGVybHkgcmVsZWFzZWQgYnkgdGhlIFgxMSB2aWRlbyBkcml2ZXIgaWYgdGhlIGZ1bGxzY3JlZW4gd2luZG93IGxvc2VzIGZvY3VzLgorPFA+CisJVGhlIFgxMSBpbnB1dCBkcml2ZXIgbm93IHVzZXMgWElNIHRvIGhhbmRsZSBpbnRlcm5hdGlvbmFsIGlucHV0LgorPFA+CisJVGhlIHNjcmVlbnNhdmVyIGFuZCBEUE1TIG1vbml0b3IgYmxhbmtpbmcgYXJlIGRpc2FibGVkIHdoaWxlIFNETCBnYW1lcyBhcmUgcnVubmluZyB1bmRlciB0aGUgWDExIGFuZCBER0EgdmlkZW8gZHJpdmVycy4gIFRoaXMgYmVoYXZpb3Igd2lsbCBiZSBmb3JtYWxpemVkIGFuZCBzZWxlY3RhYmxlIGluIFNETCAxLjMuCis8UD4KKwlGaXhlZCBhIGJ1ZyBwcmV2ZW50aW5nIHN0ZXJlbyBPcGVuR0wgY29udGV4dHMgZnJvbSBiZWluZyBzZWxlY3RlZCBvbiB0aGUgWDExIGRyaXZlci4KKzxQPgorCVRoZSBER0EgdmlkZW8gZHJpdmVyIG5vdyB3YWl0cyBmb3IgcGVuZGluZyBibGl0cyBpbnZvbHZpbmcgc3VyZmFjZXMgYmVmb3JlIHRoZXkgYXJlIGZyZWVkLiAgVGhpcyBwcmV2ZW50cyBkaXNwbGF5IG9kZGl0aWVzIHdoZW4gdXNpbmcgU0RMX0Rpc3BsYXlGb3JtYXQoKSB0byBjb252ZXJ0IG1hbnkgaW1hZ2VzLgorPFA+CisJVGhlIGZyYW1lYnVmZmVyIGNvbnNvbGUgdmlkZW8gZHJpdmVyIG5vdyBoYXMgYSBwYXJzZXIgZm9yIC9ldGMvZmIubW9kZXMgZm9yIGltcHJvdmVkIHZpZGVvIG1vZGUgaGFuZGxpbmcuCis8UD4KKwlUaGUgZnJhbWVidWZmZXIgY29uc29sZSB2aWRlbyBkcml2ZXIgbm93IGFsbG93cyBhc3luY2hyb25vdXMgVlQgc3dpdGNoaW5nLCBhbmQgcmVzdG9yZXMgdGhlIGZ1bGwgY29udGVudHMgb2YgdGhlIHNjcmVlbiB3aGVuIHN3aXRjaGVkIGJhY2suCis8UD4KKwlUaGUgZnJhbWVidWZmZXIgY29uc29sZSBub3cgdXNlcyBDVFJMLUFMVC1GTiB0byBzd2l0Y2ggdmlydHVhbCB0ZXJtaW5hbHMsIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBhcHBsaWNhdGlvbiBrZXkgYmluZGluZ3MuCis8UD4KKwlUaGUgZnJhbWVidWZmZXIgY29uc29sZSBpbnB1dCBkcml2ZXIgY29ycmVjdGx5IHNldHMgSU1QUy8yIG1vZGUgZm9yIHdoZWVsIG1pY2UuICBJdCBhbHNvIHByb3Blcmx5IGRldGVjdHMgd2hlbiBncG0gaXMgaW4gSU1QUy8yIHByb3RvY29sIG1vZGUsIG9yIHBhc3NpbmcgcmF3IHByb3RvY29sIGZyb20gYW4gSU1QUy8yIG1vdXNlLgorPFA+CisJVGhlIFNWR0FsaWIgdmlkZW8gZHJpdmVyIG5vdyBoYXMgc3VwcG9ydCBmb3IgYmFua2VkIChub24tbGluZWFyKSB2aWRlbyBtb2Rlcy4KKzxQPgorCUEgdmlkZW8gZHJpdmVyIGZvciBPcGVuQlNEIG9uIHRoZSBTaGFycCBaYXVydXMgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgU3RhZmZhbiBVbGZiZXJnLiAgU2VlIHRoZSBmaWxlIFJFQURNRS53c2NvbnMgaW4gdGhlIFNETCBzb3VyY2UgZGlzdHJpYnV0aW9uIGZvciBkZXRhaWxzLgorPFA+CisJTWFueSBwYXRjaGVzIGhhdmUgYmVlbiBpbmNvcnBvcmF0ZWQgZnJvbSAqQlNEIHBvcnRzLgorPC9CTE9DS1FVT1RFPgorCis8SDM+IFdpbmRvd3MgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlUaGUgIndpbmRpYiIgdmlkZW8gZHJpdmVyIGlzIHRoZSBkZWZhdWx0IG5vdywgdG8gcHJldmVudCBwcm9ibGVtcyB3aXRoIGNlcnRhaW4gbGFwdG9wcywgNjQtYml0IFdpbmRvd3MsIGFuZCBXaW5kb3dzIFZpc3RhLiAgVGhlIERpcmVjdFggZHJpdmVyIGlzIHN0aWxsIGF2YWlsYWJsZSwgYW5kIGNhbiBiZSBzZWxlY3RlZCBieSBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBTRExfVklERU9EUklWRVIgdG8gImRpcmVjdHgiLgorPFA+CisJU0RMIGhhcyBiZWVuIHBvcnRlZCB0byA2NC1iaXQgV2luZG93cy4KKzxQPgorCURtaXRyeSBZYWtpbW92IGNvbnRyaWJ1dGVkIGEgR0FQSSB2aWRlbyBkcml2ZXIgZm9yIFdpbmRvd3MgQ0UuCis8UD4KKwlUaGUgZGVmYXVsdCBmdWxsc2NyZWVuIHJlZnJlc2ggcmF0ZSBoYXMgYmVlbiBpbmNyZWFzZWQgdG8gbWF0Y2ggdGhlIGRlc2t0b3AgcmVmcmVzaCByYXRlLCB3aGVuIHVzaW5nIGVxdWl2YWxlbnQgcmVzb2x1dGlvbnMuICBBIGZ1bGwgQVBJIGZvciBxdWVyeWluZyBhbmQgc2VsZWN0aW5nIHJlZnJlc2ggcmF0ZXMgaXMgcGxhbm5lZCBmb3IgU0RMIDEuMy4KKzxQPgorCURpYWxvZyBib3hlcyBhcmUgbm93IHNob3duIHdoZW4gU0RMIGlzIGluIHdpbmRvd2VkIE9wZW5HTCBtb2RlLgorPFA+CisJVGhlIFNETCB3aW5kb3cgaXMgcmVjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IHRvIG1haW50YWluIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMsIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gd2luZG93ZWQgYW5kIGZ1bGxzY3JlZW4gbW9kZXMuCis8UD4KKwlBbiBTRExfVklERU9SRVNJWkUgZXZlbnQgaXMgcHJvcGVybHkgc2VudCB3aGVuIHRoZSBTREwgd2luZG93IGlzIG1heGltaXplZCBhbmQgcmVzdG9yZWQuCis8UD4KKwlXaW5kb3cgcG9zaXRpb25zIGFyZSByZXRhaW5lZCB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGZ1bGxzY3JlZW4gYW5kIHdpbmRvd2VkIG1vZGVzLgorPFA+CisJVG9Vbmljb2RlKCkgaXMgdXNlZCwgd2hlbiBhdmFpbGFibGUsIGZvciBpbXByb3ZlZCBoYW5kbGluZyBvZiBpbnRlcm5hdGlvbmFsIGtleWJvYXJkIGlucHV0LgorPFA+CisJVGhlIFBydFNjcm4gaXMgbm93IHRyZWF0ZWQgbm9ybWFsbHkgd2l0aCBib3RoIGtleSBkb3duIGFuZCBrZXkgdXAgZXZlbnRzLgorPFA+CisJUHJlc3NpbmcgQUxULUY0IG5vdyBkZWxpdmVycyBhbiBTRExfUVVJVCBldmVudCB0byBTREwgYXBwbGljYXRpb25zLgorPFA+CisJSm95c3RpY2sgbmFtZXMgYXJlIG5vdyBjb3JyZWN0IGZvciBqb3lzdGlja3Mgd2hpY2ggaGF2ZSBiZWVuIHVucGx1Z2dlZCBhbmQgdGhlbiBwbHVnZ2VkIGJhY2sgaW4gc2luY2UgYm9vdGluZy4KKzxQPgorCUFuIE1DSSBlcnJvciB3aGVuIHBsYXlpbmcgdGhlIGxhc3QgdHJhY2sgb24gYSBDRC1ST00gaGFzIGJlZW4gZml4ZWQuCis8UD4KKwlPcGVuV2F0Y29tIHByb2plY3RzIGZvciBidWlsZGluZyBTREwgaGF2ZSBiZWVuIHByb3ZpZGVkIGJ5IE1hcmMgUGV0ZXIuCis8L0JMT0NLUVVPVEU+CisKKzxIMz4gTWFjIE9TIFggTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlTREwgbm93IHN1cHBvcnRzIGJ1aWxkaW5nIFVuaXZlcnNhbCBiaW5hcmllcywgYm90aCB0aHJvdWdoIFhjb2RlIHByb2plY3RzIGFuZCB3aGVuIHVzaW5nIGNvbmZpZ3VyZS9tYWtlLiAgU2VlIFJFQURNRS5NYWNPU1ggaW4gdGhlIFNETCBzb3VyY2UgYXJjaGl2ZSBmb3IgZGV0YWlscy4KKzxQPgorCVRoZSBYMTEgdmlkZW8gZHJpdmVyIHdpdGggR0xYIHN1cHBvcnQgY2FuIGJlIGJ1aWx0IG9uIE1hYyBPUyBYLCBpZiB0aGUgWDExIGRldmVsb3BtZW50IFNESyBpcyBpbnN0YWxsZWQuCis8UD4KKwlUcmFuc2l0aW9ucyBiZXR3ZWVuIGZ1bGxzY3JlZW4gcmVzb2x1dGlvbnMgYW5kIHdpbmRvd2VkIG1vZGUgbm93IHVzZSBhIG11Y2ggZmFzdGVyIGFzeW5jaHJvbm91cyBmYWRlIHRvIGhpZGUgZGVza3RvcCBmbGlja2VyLgorPFA+CisJSWNvbnMgc2V0IHdpdGggU0RMX1dNX1NldEljb24oKSBub3cgaGF2ZSB0aGUgcHJvcGVyIGNvbG9ycyBvbiBJbnRlbCBNYWNzLgorPC9CTE9DS1FVT1RFPgorCis8SDM+IE9TLzIgTm90ZXMgPC9IMz4KKworPEJMT0NLUVVPVEU+Cis8UD4KKwlQcm9qZWN0cyBmb3IgYnVpbGRpbmcgU0RMIG9uIE9TLzIgd2l0aCBPcGVuV2F0Y29tIGhhdmUgYmVlbiBjb250cmlidXRlZCBieSBEb29kbGUuICBTZWUgdGhlIGZpbGUgUkVBRE1FLk9TMiBpbiB0aGUgU0RMIHNvdXJjZSBkaXN0cmlidXRpb24gZm9yIGRldGFpbHMuCis8L0JMT0NLUVVPVEU+CisKKzxJTUcgU1JDPSJkb2NzL2ltYWdlcy9yYWluYm93LmdpZiIgQUxUPSJbc2VwYXJhdG9yXSIgV0lEVEg9IjEwMCUiPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2F1ZGlvLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2F1ZGlvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwNzVlMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvYXVkaW8uaHRtbApAQCAtMCwwICsxLDI0MiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPkF1ZGlvPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBSZWZlcmVuY2UiCitIUkVGPSJyZWZlcmVuY2UuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0pveXN0aWNrQ2xvc2UiCitIUkVGPSJzZGxqb3lzdGlja2Nsb3NlLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0F1ZGlvU3BlYyIKK0hSRUY9InNkbGF1ZGlvc3BlYy5odG1sIj48TUVUQQorTkFNRT0iS0VZV09SRCIKK0NPTlRFTlQ9ImF1ZGlvIj48TUVUQQorTkFNRT0iS0VZV09SRCIKK0NPTlRFTlQ9ImZ1bmN0aW9uIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IkNIQVBURVIiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveXN0aWNrY2xvc2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGF1ZGlvc3BlYy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IkNIQVBURVIiCis+PEgxCis+PEEKK05BTUU9IkFVRElPIgorPjwvQQorPkNoYXB0ZXIgMTAuIEF1ZGlvPC9IMQorPjxESVYKK0NMQVNTPSJUT0MiCis+PERMCis+PERUCis+PEIKKz5UYWJsZSBvZiBDb250ZW50czwvQgorPjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsYXVkaW9zcGVjLmh0bWwiCis+U0RMX0F1ZGlvU3BlYzwvQQorPiZuYnNwOy0tJm5ic3A7QXVkaW8gU3BlY2lmaWNhdGlvbiBTdHJ1Y3R1cmU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbG9wZW5hdWRpby5odG1sIgorPlNETF9PcGVuQXVkaW88L0EKKz4mbmJzcDstLSZuYnNwO09wZW5zIHRoZSBhdWRpbyBkZXZpY2Ugd2l0aCB0aGUgZGVzaXJlZCBwYXJhbWV0ZXJzLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RscGF1c2VhdWRpby5odG1sIgorPlNETF9QYXVzZUF1ZGlvPC9BCis+Jm5ic3A7LS0mbmJzcDtQYXVzZXMgYW5kIHVucGF1c2VzIHRoZSBhdWRpbyBjYWxsYmFjayBwcm9jZXNzaW5nPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXRhdWRpb3N0YXR1cy5odG1sIgorPlNETF9HZXRBdWRpb1N0YXR1czwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBjdXJyZW50IGF1ZGlvIHN0YXRlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxsb2Fkd2F2Lmh0bWwiCis+U0RMX0xvYWRXQVY8L0EKKz4mbmJzcDstLSZuYnNwO0xvYWQgYSBXQVZFIGZpbGU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGZyZWV3YXYuaHRtbCIKKz5TRExfRnJlZVdBVjwvQQorPiZuYnNwOy0tJm5ic3A7RnJlZXMgcHJldmlvdXNseSBvcGVuZWQgV0FWIGRhdGE8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGF1ZGlvY3Z0Lmh0bWwiCis+U0RMX0F1ZGlvQ1ZUPC9BCis+Jm5ic3A7LS0mbmJzcDtBdWRpbyBDb252ZXJzaW9uIFN0cnVjdHVyZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsYnVpbGRhdWRpb2N2dC5odG1sIgorPlNETF9CdWlsZEF1ZGlvQ1ZUPC9BCis+Jm5ic3A7LS0mbmJzcDtJbml0aWFsaXplcyBhIFNETF9BdWRpb0NWVCBzdHJ1Y3R1cmUgZm9yIGNvbnZlcnNpb248L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNvbnZlcnRhdWRpby5odG1sIgorPlNETF9Db252ZXJ0QXVkaW88L0EKKz4mbmJzcDstLSZuYnNwO0NvbnZlcnQgYXVkaW8gZGF0YSB0byBhIGRlc2lyZWQgYXVkaW8gZm9ybWF0LjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbWl4YXVkaW8uaHRtbCIKKz5TRExfTWl4QXVkaW88L0EKKz4mbmJzcDstLSZuYnNwO01peCBhdWRpbyBkYXRhPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxsb2NrYXVkaW8uaHRtbCIKKz5TRExfTG9ja0F1ZGlvPC9BCis+Jm5ic3A7LS0mbmJzcDtMb2NrIG91dCB0aGUgY2FsbGJhY2sgZnVuY3Rpb248L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHVubG9ja2F1ZGlvLmh0bWwiCis+U0RMX1VubG9ja0F1ZGlvPC9BCis+Jm5ic3A7LS0mbmJzcDtVbmxvY2sgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjbG9zZWF1ZGlvLmh0bWwiCis+U0RMX0Nsb3NlQXVkaW88L0EKKz4mbmJzcDstLSZuYnNwO1NodXRzIGRvd24gYXVkaW8gcHJvY2Vzc2luZyBhbmQgY2xvc2VzIHRoZSBhdWRpbyBkZXZpY2UuPC9EVAorPjwvREwKKz48L0RJVgorPjxQCis+U291bmQgb24gdGhlIGNvbXB1dGVyIGlzIHRyYW5zbGF0ZWQgZnJvbSB3YXZlcyB0aGF0IHlvdSBoZWFyIGludG8gYSBzZXJpZXMgb2YgCit2YWx1ZXMsIG9yIHNhbXBsZXMsIGVhY2ggcmVwcmVzZW50aW5nIHRoZSBhbXBsaXR1ZGUgb2YgdGhlIHdhdmUuICBXaGVuIHRoZXNlCitzYW1wbGVzIGFyZSBzZW50IGluIGEgc3RyZWFtIHRvIGEgc291bmQgY2FyZCwgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgb3JpZ2luYWwKK3dhdmUgY2FuIGJlIHJlY3JlYXRlZC4gIFRoZSBtb3JlIGJpdHMgdXNlZCB0byByZXByZXNlbnQgdGhlIGFtcGxpdHVkZSwgYW5kIHRoZQorZ3JlYXRlciBmcmVxdWVuY3kgdGhlc2Ugc2FtcGxlcyBhcmUgZ2F0aGVyZWQsIHRoZSBjbG9zZXIgdGhlIGFwcHJveGltYXRlZAorc291bmQgaXMgdG8gdGhlIG9yaWdpbmFsLCBhbmQgdGhlIGJldHRlciB0aGUgcXVhbGl0eSBvZiBzb3VuZC48L1AKKz48UAorPlRoaXMgbGlicmFyeSBzdXBwb3J0cyBib3RoIDggYW5kIDE2IGJpdCBzaWduZWQgYW5kIHVuc2lnbmVkIHNvdW5kIHNhbXBsZXMsCithdCBmcmVxdWVuY2llcyByYW5naW5nIGZyb20gMTEwMjUgSHogdG8gNDQxMDAgSHosIGRlcGVuZGluZyBvbiB0aGUgCit1bmRlcmx5aW5nIGhhcmR3YXJlLiAgSWYgdGhlIGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZGVzaXJlZCBhdWRpbworZm9ybWF0IG9yIGZyZXF1ZW5jeSwgaXQgY2FuIGJlIGVtdWxhdGVkIGlmIGRlc2lyZWQgKFNlZSAKKzxBCitIUkVGPSJzZGxvcGVuYXVkaW8uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfT3BlbkF1ZGlvKCk8L1RUCis+PC9BCis+KTwvUAorPjxQCis+QSBjb21tb25seSBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0IGlzIDE2IGJpdHMgcGVyIHNhbXBsZSBhdCAyMjA1MCBIei48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrY2xvc2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxhdWRpb3NwZWMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja0Nsb3NlPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0icmVmZXJlbmNlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0F1ZGlvU3BlYzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9jZHJvbS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9jZHJvbS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDZiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2Nkcm9tLmh0bWwKQEAgLTAsMCArMSwyNjAgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5DRC1ST008L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iU0RMIFJlZmVyZW5jZSIKK0hSRUY9InJlZmVyZW5jZS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfQ2xvc2VBdWRpbyIKK0hSRUY9InNkbGNsb3NlYXVkaW8uaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ0ROdW1Ecml2ZXMiCitIUkVGPSJzZGxjZG51bWRyaXZlcy5odG1sIj48TUVUQQorTkFNRT0iS0VZV09SRCIKK0NPTlRFTlQ9ImNkcm9tIj48TUVUQQorTkFNRT0iS0VZV09SRCIKK0NPTlRFTlQ9ImZ1bmN0aW9uIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IkNIQVBURVIiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNsb3NlYXVkaW8uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNkbnVtZHJpdmVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iQ0hBUFRFUiIKKz48SDEKKz48QQorTkFNRT0iQ0RST00iCis+PC9BCis+Q2hhcHRlciAxMS4gQ0QtUk9NPC9IMQorPjxESVYKK0NMQVNTPSJUT0MiCis+PERMCis+PERUCis+PEIKKz5UYWJsZSBvZiBDb250ZW50czwvQgorPjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RudW1kcml2ZXMuaHRtbCIKKz5TRExfQ0ROdW1Ecml2ZXM8L0EKKz4mbmJzcDstLSZuYnNwO1JldHVybnMgdGhlIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIG9uIHRoZSBzeXN0ZW0uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjZG5hbWUuaHRtbCIKKz5TRExfQ0ROYW1lPC9BCis+Jm5ic3A7LS0mbmJzcDtSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUsIHN5c3RlbS1kZXBlbmRlbnQgaWRlbnRpZmllciBmb3IgdGhlIENELVJPTS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNkb3Blbi5odG1sIgorPlNETF9DRE9wZW48L0EKKz4mbmJzcDstLSZuYnNwO09wZW5zIGEgQ0QtUk9NIGRyaXZlIGZvciBhY2Nlc3MuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjZHN0YXR1cy5odG1sIgorPlNETF9DRFN0YXR1czwvQQorPiZuYnNwOy0tJm5ic3A7UmV0dXJucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGdpdmVuIGRyaXZlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RwbGF5Lmh0bWwiCis+U0RMX0NEUGxheTwvQQorPiZuYnNwOy0tJm5ic3A7UGxheSBhIENEPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjZHBsYXl0cmFja3MuaHRtbCIKKz5TRExfQ0RQbGF5VHJhY2tzPC9BCis+Jm5ic3A7LS0mbmJzcDtQbGF5IHRoZSBnaXZlbiBDRCB0cmFjayhzKTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RwYXVzZS5odG1sIgorPlNETF9DRFBhdXNlPC9BCis+Jm5ic3A7LS0mbmJzcDtQYXVzZXMgYSBDRFJPTTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RyZXN1bWUuaHRtbCIKKz5TRExfQ0RSZXN1bWU8L0EKKz4mbmJzcDstLSZuYnNwO1Jlc3VtZXMgYSBDRFJPTTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RzdG9wLmh0bWwiCis+U0RMX0NEU3RvcDwvQQorPiZuYnNwOy0tJm5ic3A7U3RvcHMgYSBDRFJPTTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RlamVjdC5odG1sIgorPlNETF9DREVqZWN0PC9BCis+Jm5ic3A7LS0mbmJzcDtFamVjdHMgYSBDRFJPTTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RjbG9zZS5odG1sIgorPlNETF9DRENsb3NlPC9BCis+Jm5ic3A7LS0mbmJzcDtDbG9zZXMgYSBTRExfQ0QgaGFuZGxlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjZC5odG1sIgorPlNETF9DRDwvQQorPiZuYnNwOy0tJm5ic3A7Q0RST00gRHJpdmUgSW5mb3JtYXRpb248L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNkdHJhY2suaHRtbCIKKz5TRExfQ0R0cmFjazwvQQorPiZuYnNwOy0tJm5ic3A7Q0QgVHJhY2sgSW5mb3JtYXRpb24gU3RydWN0dXJlPC9EVAorPjwvREwKKz48L0RJVgorPjxQCis+U0RMIHN1cHBvcnRzIGF1ZGlvIGNvbnRyb2wgb2YgdXAgdG8gMzIgbG9jYWwgQ0QtUk9NIGRyaXZlcyBhdCBvbmNlLjwvUAorPjxQCis+WW91IHVzZSB0aGlzIEFQSSB0byBwZXJmb3JtIGFsbCB0aGUgYmFzaWMgZnVuY3Rpb25zIG9mIGEgQ0QgcGxheWVyLAoraW5jbHVkaW5nIGxpc3RpbmcgdGhlIHRyYWNrcywgcGxheWluZywgc3RvcHBpbmcsIGFuZCBlamVjdGluZyB0aGUgQ0QtUk9NLgorKEN1cnJlbnRseSwgbXVsdGktY2hhbmdlciBDRCBkcml2ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuKTwvUAorPjxQCis+QmVmb3JlIHlvdSBjYWxsIGFueSBvZiB0aGUgU0RMIENELVJPTSBmdW5jdGlvbnMsIHlvdSBtdXN0IGZpcnN0IGNhbGwKKyI8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdChTRExfSU5JVF9DRFJPTSk8L1RUCis+Iiwgd2hpY2ggc2NhbnMgdGhlIHN5c3RlbSBmb3IKK0NELVJPTSBkcml2ZXMsIGFuZCBzZXRzIHRoZSBwcm9ncmFtIHVwIGZvciBhdWRpbyBjb250cm9sLiAgQ2hlY2sgdGhlIAorcmV0dXJuIGNvZGUsIHdoaWNoIHNob3VsZCBiZSA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4sIHRvIHNlZSBpZiB0aGVyZSAKK3dlcmUgYW55IGVycm9ycyBpbiBzdGFydGluZyB1cC48L1AKKz48UAorPkFmdGVyIHlvdSBoYXZlIGluaXRpYWxpemVkIHRoZSBsaWJyYXJ5LCB5b3UgY2FuIGZpbmQgb3V0IGhvdyBtYW55IGRyaXZlcworYXJlIGF2YWlsYWJsZSB1c2luZyB0aGUgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NETnVtRHJpdmVzKCk8L1RUCis+IGZ1bmN0aW9uLiAgCitUaGUgZmlyc3QgZHJpdmUgbGlzdGVkIGlzIHRoZSBzeXN0ZW0gZGVmYXVsdCBDRC1ST00gZHJpdmUuICBBZnRlciB5b3UgaGF2ZSAKK2Nob3NlbiBhIGRyaXZlLCBhbmQgaGF2ZSBvcGVuZWQgaXQgd2l0aCA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ0RPcGVuKCk8L1RUCis+LCAKK3lvdSBjYW4gY2hlY2sgdGhlIHN0YXR1cyBhbmQgc3RhcnQgcGxheWluZyBpZiB0aGVyZSdzIGEgQ0QgaW4gdGhlIGRyaXZlLjwvUAorPjxQCis+QSBDRC1ST00gaXMgb3JnYW5pemVkIGludG8gb25lIG9yIG1vcmUgdHJhY2tzLCBlYWNoIGNvbnNpc3Rpbmcgb2YgYSBjZXJ0YWluCitudW1iZXIgb2YgImZyYW1lcyIuICBFYWNoIGZyYW1lIGlzIH4ySyBpbiBzaXplLCBhbmQgYXQgbm9ybWFsIHBsYXlpbmcgc3BlZWQsCithIENEIHBsYXlzIDc1IGZyYW1lcyBwZXIgc2Vjb25kLiAgU0RMIHdvcmtzIHdpdGggdGhlIG51bWJlciBvZiBmcmFtZXMgb24gYQorQ0QsIGJ1dCB0aGlzIGNhbiBlYXNpbHkgYmUgY29udmVydGVkIHRvIHRoZSBtb3JlIGZhbWlsaWFyIG1pbnV0ZXMvc2Vjb25kcworZm9ybWF0IGJ5IHVzaW5nIHRoZSA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5GUkFNRVNfVE9fTVNGKCk8L1RUCis+IG1hY3JvLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY2xvc2VhdWRpby5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNkbnVtZHJpdmVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQ2xvc2VBdWRpbzwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InJlZmVyZW5jZS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DRE51bURyaXZlczwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ldmVudC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ldmVudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYmRkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2V2ZW50Lmh0bWwKQEAgLTAsMCArMSwyMTYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5FdmVudHM8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iU0RMIFJlZmVyZW5jZSIKK0hSRUY9InJlZmVyZW5jZS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfV01fR3JhYklucHV0IgorSFJFRj0ic2Rsd21ncmFiaW5wdXQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PE1FVEEKK05BTUU9IktFWVdPUkQiCitDT05URU5UPSJldmVudHMiPjxNRVRBCitOQU1FPSJLRVlXT1JEIgorQ09OVEVOVD0iZnVuY3Rpb24iPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iQ0hBUFRFUiIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsd21ncmFiaW5wdXQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IkNIQVBURVIiCis+PEgxCis+PEEKK05BTUU9IkVWRU5UIgorPjwvQQorPkNoYXB0ZXIgOC4gRXZlbnRzPC9IMQorPjxESVYKK0NMQVNTPSJUT0MiCis+PERMCis+PERUCis+PEIKKz5UYWJsZSBvZiBDb250ZW50czwvQgorPjwvRFQKKz48RFQKKz48QQorSFJFRj0iZXZlbnQuaHRtbCNBRU4zNjkxIgorPkludHJvZHVjdGlvbjwvQQorPjwvRFQKKz48RFQKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCis+U0RMIEV2ZW50IFN0cnVjdHVyZXMuPC9BCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIgorPkV2ZW50IEZ1bmN0aW9ucy48L0EKKz48L0RUCis+PC9ETAorPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QxIgorPjxIMQorQ0xBU1M9IlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zNjkxIgorPjwvQQorPkludHJvZHVjdGlvbjwvSDEKKz48UAorPkV2ZW50IGhhbmRsaW5nIGFsbG93cyB5b3VyIGFwcGxpY2F0aW9uIHRvIHJlY2VpdmUgaW5wdXQgZnJvbSB0aGUgdXNlci4gRXZlbnQgaGFuZGxpbmcgaXMgaW5pdGFsaXNlZCAoYWxvbmcgd2l0aCB2aWRlbykgd2l0aCBhIGNhbGwgdG86Cis8UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+U0RMX0luaXQoU0RMX0lOSVRfVklERU8pOzwvUFJFCis+CitJbnRlcm5hbGx5LCBTREwgc3RvcmVzIGFsbCB0aGUgZXZlbnRzIHdhaXRpbmcgdG8gYmUgaGFuZGxlZCBpbiBhbiBldmVudCBxdWV1ZS4gVXNpbmcgZnVuY3Rpb25zIGxpa2UgPEEKK0hSRUY9InNkbHBvbGxldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Qb2xsRXZlbnQ8L1RUCis+PC9BCis+IGFuZCA8QQorSFJFRj0ic2RscGVlcGV2ZW50cy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QZWVwRXZlbnRzPC9UVAorPjwvQQorPiB5b3UgY2FuIG9ic2VydmUgYW5kIGhhbmRsZSB3YWl0aW5nIGlucHV0IGV2ZW50cy48L1AKKz48UAorPlRoZSBrZXkgdG8gZXZlbnQgaGFuZGxpbmcgaW4gU0RMIGlzIHRoZSA8QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+IHVuaW9uLiBUaGUgZXZlbnQgcXVldWUgaXRzZWxmIGlzIGNvbXBvc2VkIG9mIGEgc2VyaWVzIG9mIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz4gdW5pb25zLCBvbmUgZm9yIGVhY2ggd2FpdGluZyBldmVudC4gPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPiB1bmlvbnMgYXJlIHJlYWQgZnJvbSB0aGUgcXVldWUgd2l0aCB0aGUgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1BvbGxFdmVudDwvVFQKKz4gZnVuY3Rpb24gYW5kIGl0IGlzIHRoZW4gdXAgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIHN0b3JlZCB3aXRoIHRoZW0uPC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHdtZ3JhYmlucHV0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfV01fR3JhYklucHV0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0icmVmZXJlbmNlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMIEV2ZW50IFN0cnVjdHVyZXMuPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2V2ZW50ZnVuY3Rpb25zLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2V2ZW50ZnVuY3Rpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4YTI5YQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZXZlbnRmdW5jdGlvbnMuaHRtbApAQCAtMCwwICsxLDQ4MSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPkV2ZW50IEZ1bmN0aW9ucy48L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iRXZlbnRzIgorSFJFRj0iZXZlbnQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMS2V5IgorSFJFRj0ic2Rsa2V5Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1B1bXBFdmVudHMiCitIUkVGPSJzZGxwdW1wZXZlbnRzLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iU0VDVDEiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGtleS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPkNoYXB0ZXIgOC4gRXZlbnRzPC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxwdW1wZXZlbnRzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDEiCis+PEgxCitDTEFTUz0iU0VDVDEiCis+PEEKK05BTUU9IkVWRU5URlVOQ1RJT05TIgorPjwvQQorPkV2ZW50IEZ1bmN0aW9ucy48L0gxCis+PERJVgorQ0xBU1M9IlRPQyIKKz48REwKKz48RFQKKz48QgorPlRhYmxlIG9mIENvbnRlbnRzPC9CCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxwdW1wZXZlbnRzLmh0bWwiCis+U0RMX1B1bXBFdmVudHM8L0EKKz4mbmJzcDstLSZuYnNwO1B1bXBzIHRoZSBldmVudCBsb29wLCBnYXRoZXJpbmcgZXZlbnRzIGZyb20gdGhlIGlucHV0IGRldmljZXMuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxwZWVwZXZlbnRzLmh0bWwiCis+U0RMX1BlZXBFdmVudHM8L0EKKz4mbmJzcDstLSZuYnNwO0NoZWNrcyB0aGUgZXZlbnQgcXVldWUgZm9yIG1lc3NhZ2VzIGFuZCBvcHRpb25hbGx5IHJldHVybnMgdGhlbS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHBvbGxldmVudC5odG1sIgorPlNETF9Qb2xsRXZlbnQ8L0EKKz4mbmJzcDstLSZuYnNwO1BvbGxzIGZvciBjdXJyZW50bHkgcGVuZGluZyBldmVudHMuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGx3YWl0ZXZlbnQuaHRtbCIKKz5TRExfV2FpdEV2ZW50PC9BCis+Jm5ic3A7LS0mbmJzcDtXYWl0cyBpbmRlZmluaXRlbHkgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSBldmVudC48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIgorPlNETF9QdXNoRXZlbnQ8L0EKKz4mbmJzcDstLSZuYnNwO1B1c2hlcyBhbiBldmVudCBvbnRvIHRoZSBldmVudCBxdWV1ZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2V0ZXZlbnRmaWx0ZXIuaHRtbCIKKz5TRExfU2V0RXZlbnRGaWx0ZXI8L0EKKz4mbmJzcDstLSZuYnNwO1NldHMgdXAgYSBmaWx0ZXIgdG8gcHJvY2VzcyBhbGwgZXZlbnRzIGJlZm9yZSB0aGV5IGFyZSBwb3N0ZWQgCit0byB0aGUgZXZlbnQgcXVldWUuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXRldmVudGZpbHRlci5odG1sIgorPlNETF9HZXRFdmVudEZpbHRlcjwvQQorPiZuYnNwOy0tJm5ic3A7UmV0cmlldmVzIGEgcG9pbnRlciB0byBoZSBldmVudCBmaWx0ZXI8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGV2ZW50c3RhdGUuaHRtbCIKKz5TRExfRXZlbnRTdGF0ZTwvQQorPiZuYnNwOy0tJm5ic3A7VGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgc3RhdGUgb2YgcHJvY2Vzc2luZyBjZXJ0YWluIGV2ZW50cy48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdldGtleXN0YXRlLmh0bWwiCis+U0RMX0dldEtleVN0YXRlPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCBrZXlib2FyZCBzdGF0ZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0bW9kc3RhdGUuaHRtbCIKKz5TRExfR2V0TW9kU3RhdGU8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgc3RhdGUgb2YgbW9kaWZpZXIga2V5cy48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNldG1vZHN0YXRlLmh0bWwiCis+U0RMX1NldE1vZFN0YXRlPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXQgdGhlIGN1cnJlbnQga2V5IG1vZGlmaWVyIHN0YXRlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXRrZXluYW1lLmh0bWwiCis+U0RMX0dldEtleU5hbWU8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgbmFtZSBvZiBhbiBTREwgdmlydHVhbCBrZXlzeW08L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGVuYWJsZXVuaWNvZGUuaHRtbCIKKz5TRExfRW5hYmxlVU5JQ09ERTwvQQorPiZuYnNwOy0tJm5ic3A7RW5hYmxlIFVOSUNPREUgdHJhbnNsYXRpb248L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGVuYWJsZWtleXJlcGVhdC5odG1sIgorPlNETF9FbmFibGVLZXlSZXBlYXQ8L0EKKz4mbmJzcDstLSZuYnNwO1NldCBrZXlib2FyZCByZXBlYXQgcmF0ZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdldG1vdXNlc3RhdGUuaHRtbCIKKz5TRExfR2V0TW91c2VTdGF0ZTwvQQorPiZuYnNwOy0tJm5ic3A7UmV0cmlldmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdXNlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXRyZWxhdGl2ZW1vdXNlc3RhdGUuaHRtbCIKKz5TRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlPC9BCis+Jm5ic3A7LS0mbmJzcDtSZXRyaWV2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW91c2U8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdldGFwcHN0YXRlLmh0bWwiCis+U0RMX0dldEFwcFN0YXRlPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tldmVudHN0YXRlLmh0bWwiCis+U0RMX0pveXN0aWNrRXZlbnRTdGF0ZTwvQQorPiZuYnNwOy0tJm5ic3A7RW5hYmxlL2Rpc2FibGUgam95c3RpY2sgZXZlbnQgcG9sbGluZzwvRFQKKz48L0RMCis+PC9ESVYKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVONTMxMiIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbHB1bXBldmVudHMuaHRtbCIKKz5TRExfUHVtcEV2ZW50czwvQQorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UHVtcHMgdGhlIGV2ZW50IGxvb3AsIGdhdGhlcmluZyBldmVudHMgZnJvbSB0aGUgaW5wdXQgZGV2aWNlczwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxwZWVwZXZlbnRzLmh0bWwiCis+U0RMX1BlZXBFdmVudHM8L0EKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkNoZWNrcyB0aGUgZXZlbnQgcXVldWUgZm9yIG1lc3NhZ2VzIGFuZCBvcHRpb25hbGx5IHJldHVybnMgdGhlbTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxwb2xsZXZlbnQuaHRtbCIKKz5TRExfUG9sbEV2ZW50PC9BCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Qb2xscyBmb3IgY3VycmVudGx5IHBlbmRpbmcgZXZlbnRzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbHdhaXRldmVudC5odG1sIgorPlNETF9XYWl0RXZlbnQ8L0EKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPldhaXRzIGluZGVmaW5pdGVseSBmb3IgdGhlIG5leHQgYXZhaWxhYmxlIGV2ZW50PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIgorPlNETF9QdXNoRXZlbnQ8L0EKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlB1c2hlcyBhbiBldmVudCBvbnRvIHRoZSBldmVudCBxdWV1ZTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxzZXRldmVudGZpbHRlci5odG1sIgorPlNETF9TZXRFdmVudEZpbHRlcjwvQQorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U2V0cyB1cCBhIGZpbHRlciB0byBwcm9jZXNzIGFsbCBldmVudHM8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2RsZXZlbnRzdGF0ZS5odG1sIgorPlNETF9FdmVudFN0YXRlPC9BCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5BbGxvd3MgeW91IHRvIHNldCB0aGUgc3RhdGUgb2YgcHJvY2Vzc2luZyBjZXJ0YWluIGV2ZW50czwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxnZXRrZXlzdGF0ZS5odG1sIgorPlNETF9HZXRLZXlTdGF0ZTwvQQorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+R2V0IGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQga2V5Ym9hcmQgc3RhdGU8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2RsZ2V0bW9kc3RhdGUuaHRtbCIKKz5TRExfR2V0TW9kU3RhdGU8L0EKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkdldCB0aGUgc3RhdGUgb2YgbW9kaWZpZXIga2V5czwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxzZXRtb2RzdGF0ZS5odG1sIgorPlNETF9TZXRNb2RTdGF0ZTwvQQorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U2V0IHRoZSBzdGF0ZSBvZiBtb2RpZmllciBrZXlzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbGdldGtleW5hbWUuaHRtbCIKKz5TRExfR2V0S2V5TmFtZTwvQQorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+R2V0IHRoZSBuYW1lIG9mIGFuIFNETCB2aXJ0dWFsIGtleXN5bTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxlbmFibGV1bmljb2RlLmh0bWwiCis+U0RMX0VuYWJsZVVOSUNPREU8L0EKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkVuYWJsZSBVTklDT0RFIHRyYW5zbGF0aW9uPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbGVuYWJsZWtleXJlcGVhdC5odG1sIgorPlNETF9FbmFibGVLZXlSZXBlYXQ8L0EKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNldCBrZXlib2FyZCByZXBlYXQgcmF0ZTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxnZXRtb3VzZXN0YXRlLmh0bWwiCis+U0RMX0dldE1vdXNlU3RhdGU8L0EKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlJldHJpZXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb3VzZTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxnZXRyZWxhdGl2ZW1vdXNlc3RhdGUuaHRtbCIKKz5TRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlPC9BCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5SZXRyaWV2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW91c2U8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2RsZ2V0YXBwc3RhdGUuaHRtbCIKKz5TRExfR2V0QXBwU3RhdGU8L0EKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkdldCB0aGUgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZXZlbnRzdGF0ZS5odG1sIgorPlNETF9Kb3lzdGlja0V2ZW50U3RhdGU8L0EKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkVuYWJsZS9kaXNhYmxlIGpveXN0aWNrIGV2ZW50IHBvbGxpbmc8L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsa2V5Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RscHVtcGV2ZW50cy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMS2V5PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfUHVtcEV2ZW50czwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ldmVudHN0cnVjdHVyZXMuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZXZlbnRzdHJ1Y3R1cmVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1OTI5NgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZXZlbnRzdHJ1Y3R1cmVzLmh0bWwKQEAgLTAsMCArMSwyMzMgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TREwgRXZlbnQgU3RydWN0dXJlcy48L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iRXZlbnRzIgorSFJFRj0iZXZlbnQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iRXZlbnRzIgorSFJFRj0iZXZlbnQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfRXZlbnQiCitIUkVGPSJzZGxldmVudC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlNFQ1QxIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPkNoYXB0ZXIgOC4gRXZlbnRzPC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QxIgorPjxIMQorQ0xBU1M9IlNFQ1QxIgorPjxBCitOQU1FPSJFVkVOVFNUUlVDVFVSRVMiCis+PC9BCis+U0RMIEV2ZW50IFN0cnVjdHVyZXMuPC9IMQorPjxESVYKK0NMQVNTPSJUT0MiCis+PERMCis+PERUCis+PEIKKz5UYWJsZSBvZiBDb250ZW50czwvQgorPjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz5TRExfRXZlbnQ8L0EKKz4mbmJzcDstLSZuYnNwO0dlbmVyYWwgZXZlbnQgc3RydWN0dXJlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxhY3RpdmVldmVudC5odG1sIgorPlNETF9BY3RpdmVFdmVudDwvQQorPiZuYnNwOy0tJm5ic3A7QXBwbGljYXRpb24gdmlzaWJpbGl0eSBldmVudCBzdHJ1Y3R1cmU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGtleWJvYXJkZXZlbnQuaHRtbCIKKz5TRExfS2V5Ym9hcmRFdmVudDwvQQorPiZuYnNwOy0tJm5ic3A7S2V5Ym9hcmQgZXZlbnQgc3RydWN0dXJlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxtb3VzZW1vdGlvbmV2ZW50Lmh0bWwiCis+U0RMX01vdXNlTW90aW9uRXZlbnQ8L0EKKz4mbmJzcDstLSZuYnNwO01vdXNlIG1vdGlvbiBldmVudCBzdHJ1Y3R1cmU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbG1vdXNlYnV0dG9uZXZlbnQuaHRtbCIKKz5TRExfTW91c2VCdXR0b25FdmVudDwvQQorPiZuYnNwOy0tJm5ic3A7TW91c2UgYnV0dG9uIGV2ZW50IHN0cnVjdHVyZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95YXhpc2V2ZW50Lmh0bWwiCis+U0RMX0pveUF4aXNFdmVudDwvQQorPiZuYnNwOy0tJm5ic3A7Sm95c3RpY2sgYXhpcyBtb3Rpb24gZXZlbnQgc3RydWN0dXJlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lidXR0b25ldmVudC5odG1sIgorPlNETF9Kb3lCdXR0b25FdmVudDwvQQorPiZuYnNwOy0tJm5ic3A7Sm95c3RpY2sgYnV0dG9uIGV2ZW50IHN0cnVjdHVyZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95aGF0ZXZlbnQuaHRtbCIKKz5TRExfSm95SGF0RXZlbnQ8L0EKKz4mbmJzcDstLSZuYnNwO0pveXN0aWNrIGhhdCBwb3NpdGlvbiBjaGFuZ2UgZXZlbnQgc3RydWN0dXJlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3liYWxsZXZlbnQuaHRtbCIKKz5TRExfSm95QmFsbEV2ZW50PC9BCis+Jm5ic3A7LS0mbmJzcDtKb3lzdGljayB0cmFja2JhbGwgbW90aW9uIGV2ZW50IHN0cnVjdHVyZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RscmVzaXplZXZlbnQuaHRtbCIKKz5TRExfUmVzaXplRXZlbnQ8L0EKKz4mbmJzcDstLSZuYnNwO1dpbmRvdyByZXNpemUgZXZlbnQgc3RydWN0dXJlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxleHBvc2VldmVudC5odG1sIgorPlNETF9FeHBvc2VFdmVudDwvQQorPiZuYnNwOy0tJm5ic3A7UXVpdCByZXF1ZXN0ZWQgZXZlbnQ8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHN5c3dtZXZlbnQuaHRtbCIKKz5TRExfU3lzV01FdmVudDwvQQorPiZuYnNwOy0tJm5ic3A7UGxhdGZvcm0tZGVwZW5kZW50IHdpbmRvdyBtYW5hZ2VyIGV2ZW50LjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsdXNlcmV2ZW50Lmh0bWwiCis+U0RMX1VzZXJFdmVudDwvQQorPiZuYnNwOy0tJm5ic3A7QSB1c2VyLWRlZmluZWQgZXZlbnQgdHlwZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RscXVpdGV2ZW50Lmh0bWwiCis+U0RMX1F1aXRFdmVudDwvQQorPiZuYnNwOy0tJm5ic3A7UXVpdCByZXF1ZXN0ZWQgZXZlbnQ8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGtleXN5bS5odG1sIgorPlNETF9rZXlzeW08L0EKKz4mbmJzcDstLSZuYnNwO0tleXN5bSBzdHJ1Y3R1cmU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGtleS5odG1sIgorPlNETEtleTwvQQorPiZuYnNwOy0tJm5ic3A7S2V5c3ltIGRlZmluaXRpb25zLjwvRFQKKz48L0RMCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPkV2ZW50czwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0V2ZW50PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2dlbmVyYWwuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ2VuZXJhbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZWI1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2dlbmVyYWwuaHRtbApAQCAtMCwwICsxLDIyNSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPkdlbmVyYWw8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iU0RMIFJlZmVyZW5jZSIKK0hSRUY9InJlZmVyZW5jZS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTREwgUmVmZXJlbmNlIgorSFJFRj0icmVmZXJlbmNlLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0luaXQiCitIUkVGPSJzZGxpbml0Lmh0bWwiPjxNRVRBCitOQU1FPSJLRVlXT1JEIgorQ09OVEVOVD0iZ2VuZXJhbCI+PE1FVEEKK05BTUU9IktFWVdPUkQiCitDT05URU5UPSJmdW5jdGlvbiI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJDSEFQVEVSIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJyZWZlcmVuY2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGluaXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxESVYKK0NMQVNTPSJDSEFQVEVSIgorPjxIMQorPjxBCitOQU1FPSJHRU5FUkFMIgorPjwvQQorPkNoYXB0ZXIgNS4gR2VuZXJhbDwvSDEKKz48RElWCitDTEFTUz0iVE9DIgorPjxETAorPjxEVAorPjxCCis+VGFibGUgb2YgQ29udGVudHM8L0IKKz48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz5TRExfSW5pdDwvQQorPiZuYnNwOy0tJm5ic3A7SW5pdGlhbGl6ZXMgU0RMPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxpbml0c3Vic3lzdGVtLmh0bWwiCis+U0RMX0luaXRTdWJTeXN0ZW08L0EKKz4mbmJzcDstLSZuYnNwO0luaXRpYWxpemUgc3Vic3lzdGVtczwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RscXVpdHN1YnN5c3RlbS5odG1sIgorPlNETF9RdWl0U3ViU3lzdGVtPC9BCis+Jm5ic3A7LS0mbmJzcDtTaHV0IGRvd24gYSBzdWJzeXN0ZW08L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHF1aXQuaHRtbCIKKz5TRExfUXVpdDwvQQorPiZuYnNwOy0tJm5ic3A7U2h1dCBkb3duIFNETDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd2FzaW5pdC5odG1sIgorPlNETF9XYXNJbml0PC9BCis+Jm5ic3A7LS0mbmJzcDtDaGVjayB3aGljaCBzdWJzeXN0ZW1zIGFyZSBpbml0aWFsaXplZDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0ZXJyb3IuaHRtbCIKKz5TRExfR2V0RXJyb3I8L0EKKz4mbmJzcDstLSZuYnNwO0dldCBTREwgZXJyb3Igc3RyaW5nPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxlbnZ2YXJzLmh0bWwiCis+U0RMX2VudnZhcnM8L0EKKz4mbmJzcDstLSZuYnNwO1NETCBlbnZpcm9ubWVudCB2YXJpYWJsZXM8L0RUCis+PC9ETAorPjwvRElWCis+PFAKKz5CZWZvcmUgU0RMIGNhbiBiZSB1c2VkIGluIGEgcHJvZ3JhbSBpdCBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggPEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdDwvVFQKKz48L0EKKz4uIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Jbml0PC9UVAorPiBpbml0aWFsaXplcyBhbGwgdGhlIHN1YnN5c3RlbXMgdGhhdCB0aGUgdXNlciByZXF1ZXN0cyAodmlkZW8sIGF1ZGlvLCBqb3lzdGljaywgdGltZXJzIGFuZC9vciBjZHJvbSkuIE9uY2UgU0RMIGlzIGluaXRpYWxpemVkIHdpdGggPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXQ8L1RUCis+IHN1YnN5c3RlbXMgY2FuIGJlIHNodXQgZG93biBhbmQgaW5pdGlhbGl6ZWQgYXMgbmVlZGVkIHVzaW5nIDxBCitIUkVGPSJzZGxpbml0c3Vic3lzdGVtLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXRTdWJTeXN0ZW08L1RUCis+PC9BCis+IGFuZCA8QQorSFJFRj0ic2RscXVpdHN1YnN5c3RlbS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0U3ViU3lzdGVtPC9UVAorPjwvQQorPi48L1AKKz48UAorPlNETCBtdXN0IGFsc28gYmUgc2h1dCBkb3duIGJlZm9yZSB0aGUgcHJvZ3JhbSBleGl0cyB0byBtYWtlIHN1cmUgaXQgY2xlYW5zIHVwIGNvcnJlY3RseS4gQ2FsbGluZyA8QQorSFJFRj0ic2RscXVpdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0PC9UVAorPjwvQQorPiBzaHV0cyBkb3duIGFsbCBzdWJzeXN0ZW1zIGFuZCBmcmVlcyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCB0byBTREwuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJyZWZlcmVuY2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxpbml0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TREwgUmVmZXJlbmNlPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0icmVmZXJlbmNlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0luaXQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzEyOTdlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZS5odG1sCkBAIC0wLDAgKzEsMTc0IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMIEd1aWRlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlByZWZhY2UiCitIUkVGPSJndWlkZXByZWZhY2UuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJQQVJUIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGVwcmVmYWNlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iUEFSVCIKKz48QQorTkFNRT0iR1VJREUiCis+PC9BCis+PERJVgorQ0xBU1M9IlRJVExFUEFHRSIKKz48SDEKK0NMQVNTPSJUSVRMRSIKKz5JLiBTREwgR3VpZGU8L0gxCis+PERJVgorQ0xBU1M9IlRPQyIKKz48REwKKz48RFQKKz48QgorPlRhYmxlIG9mIENvbnRlbnRzPC9CCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZXByZWZhY2UuaHRtbCIKKz5QcmVmYWNlPC9BCis+PC9EVAorPjxEVAorPjEuIDxBCitIUkVGPSJndWlkZXRoZWJhc2ljcy5odG1sIgorPlRoZSBCYXNpY3M8L0EKKz48L0RUCis+PERUCis+Mi4gPEEKK0hSRUY9Imd1aWRldmlkZW8uaHRtbCIKKz5HcmFwaGljcyBhbmQgVmlkZW88L0EKKz48L0RUCis+PERUCis+My4gPEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCIKKz5JbnB1dCBoYW5kbGluZzwvQQorPjwvRFQKKz48RFQKKz40LiA8QQorSFJFRj0iZ3VpZGVleGFtcGxlcy5odG1sIgorPkV4YW1wbGVzPC9BCis+PC9EVAorPjwvREwKKz48L0RJVgorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlcHJlZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlByZWZhY2U8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGVhYm91dHNkbGRvYy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWFib3V0c2RsZG9jLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiMGQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGVhYm91dHNkbGRvYy5odG1sCkBAIC0wLDAgKzEsMTQ4IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+QWJvdXQgU0RMZG9jPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlByZWZhY2UiCitIUkVGPSJndWlkZXByZWZhY2UuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iUHJlZmFjZSIKK0hSRUY9Imd1aWRlcHJlZmFjZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IkNyZWRpdHMiCitIUkVGPSJndWlkZWNyZWRpdHMuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJTRUNUMSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGVwcmVmYWNlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+UHJlZmFjZTwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGVjcmVkaXRzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDEiCis+PEgxCitDTEFTUz0iU0VDVDEiCis+PEEKK05BTUU9IkdVSURFQUJPVVRTRExET0MiCis+PC9BCis+QWJvdXQgU0RMZG9jPC9IMQorPjxQCis+U0RMZG9jIChUaGUgU0RMIERvY3VtZW50YXRpb24gUHJvamVjdCkgd2FzIGZvcm1lZCB0byBjb21wbGV0ZWx5IHJld3JpdGUgdGhlIFNETCBkb2N1bWVudGF0aW9uIGFuZCB0byBrZWVwIGl0IGNvbnRpbnVhbGx5IHVwIHRvIGRhdGUuIFRoZSB0ZWFtIGNvbnNpc3RzIGNvbXBsZXRlbHkgb2Ygdm9sdW50ZWVycyByYW5naW5nIGZyb20gcGVvcGxlIHdvcmtpbmcgd2l0aCBTREwgaW4gdGhlaXIgc3BhcmUgdGltZSB0byBwZW9wbGUgd2hvIHVzZSBTREwgaW4gdGhlaXIgZXZlcnlkYXkgd29ya2luZyBsaXZlcy48L1AKKz48UAorPlRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50YXRpb24gY2FuIGFsd2F5cyBiZSBmb3VuZCBoZXJlOiBodHRwOi8vc2RsZG9jLmNzbi51bC5pZSAgRG93bmxvYWRhYmxlIFBTLCBtYW4gcGFnZXMgYW5kIGh0bWwgdGFyYmFsbHMgYXJlIGF2YWlsYWJsZSBhdCBodHRwOi8vc2RsZG9jLmNzbi51bC5pZS9wdWIvPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZXByZWZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZWNyZWRpdHMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlByZWZhY2U8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZXByZWZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5DcmVkaXRzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRlYXVkaW9leGFtcGxlcy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWF1ZGlvZXhhbXBsZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI3NTIyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWF1ZGlvZXhhbXBsZXMuaHRtbApAQCAtMCwwICsxLDIyOCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPkF1ZGlvIEV4YW1wbGVzPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkV4YW1wbGVzIgorSFJFRj0iZ3VpZGVleGFtcGxlcy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJFdmVudCBFeGFtcGxlcyIKK0hSRUY9Imd1aWRlZXZlbnRleGFtcGxlcy5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IkNEUk9NIEV4YW1wbGVzIgorSFJFRj0iZ3VpZGVjZHJvbWV4YW1wbGVzLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iU0VDVDEiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRlZXZlbnRleGFtcGxlcy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPkNoYXB0ZXIgNC4gRXhhbXBsZXM8L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRlY2Ryb21leGFtcGxlcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QxIgorPjxIMQorQ0xBU1M9IlNFQ1QxIgorPjxBCitOQU1FPSJHVUlERUFVRElPRVhBTVBMRVMiCis+PC9BCis+QXVkaW8gRXhhbXBsZXM8L0gxCis+PFAKKz48L1AKKz48RElWCitDTEFTUz0iU0VDVDIiCis+PEgyCitDTEFTUz0iU0VDVDIiCis+PEEKK05BTUU9IkFFTjM4MiIKKz48L0EKKz5PcGVuaW5nIHRoZSBhdWRpbyBkZXZpY2U8L0gyCis+PFAKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgIFNETF9BdWRpb1NwZWMgd2FudGVkOworICAgIGV4dGVybiB2b2lkIGZpbGxfYXVkaW8odm9pZCAqdWRhdGEsIFVpbnQ4ICpzdHJlYW0sIGludCBsZW4pOworCisgICAgLyogU2V0IHRoZSBhdWRpbyBmb3JtYXQgKi8KKyAgICB3YW50ZWQuZnJlcSA9IDIyMDUwOworICAgIHdhbnRlZC5mb3JtYXQgPSBBVURJT19TMTY7CisgICAgd2FudGVkLmNoYW5uZWxzID0gMjsgICAgLyogMSA9IG1vbm8sIDIgPSBzdGVyZW8gKi8KKyAgICB3YW50ZWQuc2FtcGxlcyA9IDEwMjQ7ICAvKiBHb29kIGxvdy1sYXRlbmN5IHZhbHVlIGZvciBjYWxsYmFjayAqLworICAgIHdhbnRlZC5jYWxsYmFjayA9IGZpbGxfYXVkaW87CisgICAgd2FudGVkLnVzZXJkYXRhID0gTlVMTDsKKworICAgIC8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSwgZm9yY2luZyB0aGUgZGVzaXJlZCBmb3JtYXQgKi8KKyAgICBpZiAoIFNETF9PcGVuQXVkaW8oJiMzODt3YW50ZWQsIE5VTEwpICYjNjA7IDAgKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgb3BlbiBhdWRpbzogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgcmV0dXJuKDApOzwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDIiCis+PEgyCitDTEFTUz0iU0VDVDIiCis+PEEKK05BTUU9IkFFTjM4NiIKKz48L0EKKz5QbGF5aW5nIGF1ZGlvPC9IMgorPjxQCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPiAgICBzdGF0aWMgVWludDggKmF1ZGlvX2NodW5rOworICAgIHN0YXRpYyBVaW50MzIgYXVkaW9fbGVuOworICAgIHN0YXRpYyBVaW50OCAqYXVkaW9fcG9zOworCisgICAgLyogVGhlIGF1ZGlvIGZ1bmN0aW9uIGNhbGxiYWNrIHRha2VzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAgICAgICBzdHJlYW06ICBBIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIGJ1ZmZlciB0byBiZSBmaWxsZWQKKyAgICAgICBsZW46ICAgICBUaGUgbGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIGF1ZGlvIGJ1ZmZlcgorICAgICovCisgICAgdm9pZCBmaWxsX2F1ZGlvKHZvaWQgKnVkYXRhLCBVaW50OCAqc3RyZWFtLCBpbnQgbGVuKQorICAgIHsKKyAgICAgICAgLyogT25seSBwbGF5IGlmIHdlIGhhdmUgZGF0YSBsZWZ0ICovCisgICAgICAgIGlmICggYXVkaW9fbGVuID09IDAgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8qIE1peCBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUgKi8KKyAgICAgICAgbGVuID0gKCBsZW4gJiM2MjsgYXVkaW9fbGVuID8gYXVkaW9fbGVuIDogbGVuICk7CisgICAgICAgIFNETF9NaXhBdWRpbyhzdHJlYW0sIGF1ZGlvX3BvcywgbGVuLCBTRExfTUlYX01BWFZPTFVNRSk7CisgICAgICAgIGF1ZGlvX3BvcyArPSBsZW47CisgICAgICAgIGF1ZGlvX2xlbiAtPSBsZW47CisgICAgfQorCisgICAgLyogTG9hZCB0aGUgYXVkaW8gZGF0YSAuLi4gKi8KKworICAgIDs7Ozs7CisKKyAgICBhdWRpb19wb3MgPSBhdWRpb19jaHVuazsKKworICAgIC8qIExldCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcGxheSB0aGUgYXVkaW8gY2h1bmsgKi8KKyAgICBTRExfUGF1c2VBdWRpbygwKTsKKworICAgIC8qIERvIHNvbWUgcHJvY2Vzc2luZyAqLworCisgICAgOzs7OzsKKworICAgIC8qIFdhaXQgZm9yIHNvdW5kIHRvIGNvbXBsZXRlICovCisgICAgd2hpbGUgKCBhdWRpb19sZW4gJiM2MjsgMCApIHsKKyAgICAgICAgU0RMX0RlbGF5KDEwMCk7ICAgICAgICAgLyogU2xlZXAgMS8xMCBzZWNvbmQgKi8KKyAgICB9CisgICAgU0RMX0Nsb3NlQXVkaW8oKTs8L1BSRQorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZWV2ZW50ZXhhbXBsZXMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZWNkcm9tZXhhbXBsZXMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPkV2ZW50IEV4YW1wbGVzPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGVleGFtcGxlcy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPkNEUk9NIEV4YW1wbGVzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRlYmFzaWNzaW5pdC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWJhc2ljc2luaXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWFmZGJkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWJhc2ljc2luaXQuaHRtbApAQCAtMCwwICsxLDI0MCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPkluaXRpYWxpemluZyBTREw8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVGhlIEJhc2ljcyIKK0hSRUY9Imd1aWRldGhlYmFzaWNzLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlRoZSBCYXNpY3MiCitIUkVGPSJndWlkZXRoZWJhc2ljcy5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IkdyYXBoaWNzIGFuZCBWaWRlbyIKK0hSRUY9Imd1aWRldmlkZW8uaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJTRUNUMSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGV0aGViYXNpY3MuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz5DaGFwdGVyIDEuIFRoZSBCYXNpY3M8L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRldmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxESVYKK0NMQVNTPSJTRUNUMSIKKz48SDEKK0NMQVNTPSJTRUNUMSIKKz48QQorTkFNRT0iR1VJREVCQVNJQ1NJTklUIgorPjwvQQorPkluaXRpYWxpemluZyBTREw8L0gxCis+PFAKKz5TREwgaXMgY29tcG9zZWQgb2YgZWlnaHQgc3Vic3lzdGVtcyAtIEF1ZGlvLCBDRFJPTSwgRXZlbnQgSGFuZGxpbmcsIEZpbGUgSS9PLCBKb3lzdGljayBIYW5kbGluZywgVGhyZWFkaW5nLCBUaW1lcnMgYW5kIFZpZGVvLiBCZWZvcmUgeW91IGNhbiB1c2UgYW55IG9mIHRoZXNlIHN1YnN5c3RlbXMgdGhleSBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgPEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdDwvVFQKKz48L0EKKz4gKG9yIDxBCitIUkVGPSJzZGxpbml0c3Vic3lzdGVtLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXRTdWJTeXN0ZW08L1RUCis+PC9BCis+KS4gPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXQ8L1RUCis+IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgU0RMIGZ1bmN0aW9uLiBJdCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVzIHRoZSBFdmVudCBIYW5kbGluZywgRmlsZSBJL08gYW5kIFRocmVhZGluZyBzdWJzeXN0ZW1zIGFuZCBpdCB0YWtlcyBhIHBhcmFtZXRlciBzcGVjaWZ5aW5nIHdoaWNoIG90aGVyIHN1YnN5c3RlbXMgdG8gaW5pdGlhbGl6ZS4gU28sIHRvIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgc3Vic3lzdGVtcyBhbmQgdGhlIFZpZGVvIHN1YnN5c3RlbXMgeW91IHdvdWxkIGNhbGw6Cis8UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgIFNETF9Jbml0ICggU0RMX0lOSVRfVklERU8gKTs8L1BSRQorPgorVG8gaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBzdWJzeXN0ZW1zLCB0aGUgVmlkZW8gc3Vic3lzdGVtIGFuZCB0aGUgVGltZXJzIHN1YnN5c3RlbSB5b3Ugd291bGQgY2FsbDoKKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgU0RMX0luaXQgKCBTRExfSU5JVF9WSURFTyB8IFNETF9JTklUX1RJTUVSICk7PC9QUkUKKz48L1AKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Jbml0PC9UVAorPiBpcyBjb21wbGVtZW50ZWQgYnkgPEEKK0hSRUY9InNkbHF1aXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUXVpdDwvVFQKKz48L0EKKz4gKGFuZCA8QQorSFJFRj0ic2RscXVpdHN1YnN5c3RlbS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0U3ViU3lzdGVtPC9UVAorPjwvQQorPikuIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0PC9UVAorPiBzaHV0cyBkb3duIGFsbCBzdWJzeXN0ZW1zLCBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgb25lcy4gSXQgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlIGEgU0RMIGFwcGxpY2F0aW9uIGV4aXRzLjwvUAorPjxQCis+V2l0aCA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdDwvVFQKKz4gYW5kIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0PC9UVAorPiBmaXJtbHkgZW1iZWRkZWQgaW4geW91ciBwcm9ncmFtbWVycyB0b29sa2l0IHlvdSBjYW4gd3JpdGUgeW91ciBmaXJzdCBhbmQgbW9zdCBiYXNpYyBTREwgYXBwbGljYXRpb24uIEhvd2V2ZXIsIHdlIG11c3QgYmUgcHJlcGFyZSB0byBoYW5kbGUgZXJyb3JzLiBNYW55IFNETCBmdW5jdGlvbnMgcmV0dXJuIGEgdmFsdWUgYW5kIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBoYXMgc3VjY2VlZGVkIG9yIGZhaWxlZCwgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXQ8L1RUCis+LCBmb3IgaW5zdGFuY2UsIHJldHVybnMgLTEgaWYgaXQgY291bGQgbm90IGluaXRpYWxpemUgYSBzdWJzeXN0ZW0uIFNETCBwcm92aWRlcyBhIHVzZWZ1bCBmYWNpbGl0eSB0aGF0IGFsbG93cyB5b3UgdG8gZGV0ZXJtaW5lIGV4YWN0bHkgd2hhdCB0aGUgcHJvYmxlbSB3YXMsIGV2ZXJ5IHRpbWUgYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiBTREwgYW4gZXJyb3IgbWVzc2FnZSBpcyBzdG9yZWQgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB1c2luZyA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0RXJyb3I8L1RUCis+LiBVc2UgdGhpcyBvZnRlbiwgeW91IGNhbiBuZXZlciBrbm93IHRvbyBtdWNoIGFib3V0IGFuIGVycm9yLjwvUAorPjxESVYKK0NMQVNTPSJFWEFNUExFIgorPjxBCitOQU1FPSJBRU42MCIKKz48L0EKKz48UAorPjxCCis+RXhhbXBsZSAxLTEuIEluaXRpYWxpemluZyBTREw8L0IKKz48L1AKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+I2luY2x1ZGUgIlNETC5oIiAgIC8qIEFsbCBTREwgQXBwJ3MgbmVlZCB0aGlzICovCisjaW5jbHVkZSAmIzYwO3N0ZGlvLmgmIzYyOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgICAgCisgICAgcHJpbnRmKCJJbml0aWFsaXppbmcgU0RMLlxuIik7CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSBkZWZhdWx0cywgVmlkZW8gYW5kIEF1ZGlvICovCisgICAgaWYoKFNETF9Jbml0KFNETF9JTklUX1ZJREVPfFNETF9JTklUX0FVRElPKT09LTEpKSB7IAorICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBpbml0aWFsaXplIFNETDogJXMuXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIGV4aXQoLTEpOworICAgIH0KKworICAgIHByaW50ZigiU0RMIGluaXRpYWxpemVkLlxuIik7CisKKyAgICBwcmludGYoIlF1aXRpbmcgU0RMLlxuIik7CisgICAgCisgICAgLyogU2h1dGRvd24gYWxsIHN1YnN5c3RlbXMgKi8KKyAgICBTRExfUXVpdCgpOworICAgIAorICAgIHByaW50ZigiUXVpdGluZy4uLi5cbiIpOworCisgICAgZXhpdCgwKTsKK30mIzEzOzwvUFJFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRldGhlYmFzaWNzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGV2aWRlby5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+VGhlIEJhc2ljczwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRldGhlYmFzaWNzLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+R3JhcGhpY3MgYW5kIFZpZGVvPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRlY2Ryb21leGFtcGxlcy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWNkcm9tZXhhbXBsZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmM1YTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWNkcm9tZXhhbXBsZXMuaHRtbApAQCAtMCwwICsxLDI3NSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPkNEUk9NIEV4YW1wbGVzPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkV4YW1wbGVzIgorSFJFRj0iZ3VpZGVleGFtcGxlcy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJBdWRpbyBFeGFtcGxlcyIKK0hSRUY9Imd1aWRlYXVkaW9leGFtcGxlcy5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlRpbWUgRXhhbXBsZXMiCitIUkVGPSJndWlkZXRpbWVleGFtcGxlcy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlNFQ1QxIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJndWlkZWF1ZGlvZXhhbXBsZXMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz5DaGFwdGVyIDQuIEV4YW1wbGVzPC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJndWlkZXRpbWVleGFtcGxlcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QxIgorPjxIMQorQ0xBU1M9IlNFQ1QxIgorPjxBCitOQU1FPSJHVUlERUNEUk9NRVhBTVBMRVMiCis+PC9BCis+Q0RST00gRXhhbXBsZXM8L0gxCis+PFAKKz48L1AKKz48RElWCitDTEFTUz0iU0VDVDIiCis+PEgyCitDTEFTUz0iU0VDVDIiCis+PEEKK05BTUU9IkFFTjM5MyIKKz48L0EKKz5MaXN0aW5nIENELVJPTSBkcml2ZXM8L0gyCis+PFAKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgICNpbmNsdWRlICJTREwuaCIKKworICAgIC8qIEluaXRpYWxpemUgU0RMIGZpcnN0ICovCisgICAgaWYgKCBTRExfSW5pdChTRExfSU5JVF9DRFJPTSkgJiM2MDsgMCApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBpbml0aWFsaXplIFNETDogJXNcbiIsU0RMX0dldEVycm9yKCkpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBhdGV4aXQoU0RMX1F1aXQpOworCisgICAgLyogRmluZCBvdXQgaG93IG1hbnkgQ0QtUk9NIGRyaXZlcyBhcmUgY29ubmVjdGVkIHRvIHRoZSBzeXN0ZW0gKi8KKyAgICBwcmludGYoIkRyaXZlcyBhdmFpbGFibGU6ICVkXG4iLCBTRExfQ0ROdW1Ecml2ZXMoKSk7CisgICAgZm9yICggaT0wOyBpJiM2MDtTRExfQ0ROdW1Ecml2ZXMoKTsgKytpICkgeworICAgICAgICBwcmludGYoIkRyaXZlICVkOiAgXCIlc1wiXG4iLCBpLCBTRExfQ0ROYW1lKGkpKTsKKyAgICB9PC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJTRUNUMiIKKz48SDIKK0NMQVNTPSJTRUNUMiIKKz48QQorTkFNRT0iQUVOMzk3IgorPjwvQQorPk9wZW5pbmcgdGhlIGRlZmF1bHQgZHJpdmU8L0gyCis+PFAKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgIFNETF9DRCAqY2Ryb207CisgICAgQ0RzdGF0dXMgc3RhdHVzOworICAgIGNoYXIgKnN0YXR1c19zdHI7CisKKyAgICBjZHJvbSA9IFNETF9DRE9wZW4oMCk7CisgICAgaWYgKCBjZHJvbSA9PSBOVUxMICkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IG9wZW4gZGVmYXVsdCBDRC1ST00gZHJpdmU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0dldEVycm9yKCkpOworICAgICAgICBleGl0KDIpOworICAgIH0KKworICAgIHN0YXR1cyA9IFNETF9DRFN0YXR1cyhjZHJvbSk7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDRF9UUkFZRU1QVFk6CisgICAgICAgICAgICBzdGF0dXNfc3RyID0gInRyYXkgZW1wdHkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0RfU1RPUFBFRDoKKyAgICAgICAgICAgIHN0YXR1c19zdHIgPSAic3RvcHBlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRF9QTEFZSU5HOgorICAgICAgICAgICAgc3RhdHVzX3N0ciA9ICJwbGF5aW5nIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENEX1BBVVNFRDoKKyAgICAgICAgICAgIHN0YXR1c19zdHIgPSAicGF1c2VkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENEX0VSUk9SOgorICAgICAgICAgICAgc3RhdHVzX3N0ciA9ICJlcnJvciBzdGF0ZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcHJpbnRmKCJEcml2ZSBzdGF0dXM6ICVzXG4iLCBzdGF0dXNfc3RyKTsKKyAgICBpZiAoIHN0YXR1cyAmIzYyOz0gQ0RfUExBWUlORyApIHsKKyAgICAgICAgaW50IG0sIHMsIGY7CisgICAgICAgIEZSQU1FU19UT19NU0YoY2Ryb20tJiM2MjtjdXJfZnJhbWUsICYjMzg7bSwgJiMzODtzLCAmIzM4O2YpOworICAgICAgICBwcmludGYoIkN1cnJlbnRseSBwbGF5aW5nIHRyYWNrICVkLCAlZDolMi4yZFxuIiwKKyAgICAgICAgY2Ryb20tJiM2Mjt0cmFja1tjZHJvbS0mIzYyO2N1cl90cmFja10uaWQsIG0sIHMpOworICAgIH08L1BSRQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QyIgorPjxIMgorQ0xBU1M9IlNFQ1QyIgorPjxBCitOQU1FPSJBRU40MDEiCis+PC9BCis+TGlzdGluZyB0aGUgdHJhY2tzIG9uIGEgQ0Q8L0gyCis+PFAKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgIFNETF9DRCAqY2Ryb207ICAgICAgICAgIC8qIEFzc3VtaW5nIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBzZXQuLiAqLworICAgIGludCBpOworICAgIGludCBtLCBzLCBmOworCisgICAgU0RMX0NEU3RhdHVzKGNkcm9tKTsKKyAgICBwcmludGYoIkRyaXZlIHRyYWNrczogJWRcbiIsIGNkcm9tLSYjNjI7bnVtdHJhY2tzKTsKKyAgICBmb3IgKCBpPTA7IGkmIzYwO2Nkcm9tLSYjNjI7bnVtdHJhY2tzOyArK2kgKSB7CisgICAgICAgIEZSQU1FU19UT19NU0YoY2Ryb20tJiM2Mjt0cmFja1tpXS5sZW5ndGgsICYjMzg7bSwgJiMzODtzLCAmIzM4O2YpOworICAgICAgICBpZiAoIGYgJiM2MjsgMCApCisgICAgICAgICAgICArK3M7CisgICAgICAgIHByaW50ZigiXHRUcmFjayAoaW5kZXggJWQpICVkOiAlZDolMi4yZFxuIiwgaSwKKyAgICAgICAgY2Ryb20tJiM2Mjt0cmFja1tpXS5pZCwgbSwgcyk7CisgICAgfTwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDIiCis+PEgyCitDTEFTUz0iU0VDVDIiCis+PEEKK05BTUU9IkFFTjQwNSIKKz48L0EKKz5QbGF5IGFuIGVudGlyZSBDRDwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgU0RMX0NEICpjZHJvbTsgICAgICAgICAgLyogQXNzdW1pbmcgdGhpcyBoYXMgYWxyZWFkeSBiZWVuIHNldC4uICovCisKKyAgICAvLyBQbGF5IGVudGlyZSBDRDoKKyAgICBpZiAoIENEX0lORFJJVkUoU0RMX0NEU3RhdHVzKGNkcm9tKSkgKQorICAgICAgICBTRExfQ0RQbGF5VHJhY2tzKGNkcm9tLCAwLCAwLCAwLCAwKTsKKworICAgICAgICAvLyBQbGF5IGxhc3QgdHJhY2s6CisgICAgICAgIGlmICggQ0RfSU5EUklWRShTRExfQ0RTdGF0dXMoY2Ryb20pKSApIHsKKyAgICAgICAgICAgIFNETF9DRFBsYXlUcmFja3MoY2Ryb20sIGNkcm9tLSYjNjI7bnVtdHJhY2tzLTEsIDAsIDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGxheSBmaXJzdCBhbmQgc2Vjb25kIHRyYWNrIGFuZCAxMCBzZWNvbmRzIG9mIHRoaXJkIHRyYWNrOgorICAgICAgICBpZiAoIENEX0lORFJJVkUoU0RMX0NEU3RhdHVzKGNkcm9tKSkgKQorICAgICAgICAgICAgU0RMX0NEUGxheVRyYWNrcyhjZHJvbSwgMCwgMCwgMiwgQ0RfRlBTICogMTApOzwvUFJFCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlYXVkaW9leGFtcGxlcy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRldGltZWV4YW1wbGVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5BdWRpbyBFeGFtcGxlczwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlZXhhbXBsZXMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5UaW1lIEV4YW1wbGVzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRlY3JlZGl0cy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWNyZWRpdHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZiMjhmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWNyZWRpdHMuaHRtbApAQCAtMCwwICsxLDE5NSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPkNyZWRpdHM8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iUHJlZmFjZSIKK0hSRUY9Imd1aWRlcHJlZmFjZS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJBYm91dCBTRExkb2MiCitIUkVGPSJndWlkZWFib3V0c2RsZG9jLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iVGhlIEJhc2ljcyIKK0hSRUY9Imd1aWRldGhlYmFzaWNzLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iU0VDVDEiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRlYWJvdXRzZGxkb2MuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz5QcmVmYWNlPC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJndWlkZXRoZWJhc2ljcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QxIgorPjxIMQorQ0xBU1M9IlNFQ1QxIgorPjxBCitOQU1FPSJHVUlERUNSRURJVFMiCis+PC9BCis+Q3JlZGl0czwvSDEKKz48UAorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjAiCis+PFRCT0RZCis+PFRSCis+PFRECis+U2FtIExhbnRpbmdhLCBzbG91a2VuQGxpYnNkbC5vcmc8L1RECis+PC9UUgorPjxUUgorPjxURAorPk1hcnRpbiBEb25sb24sIGFrYXdha2FAc2t5bmV0LmllPC9URAorPjwvVFIKKz48VFIKKz48VEQKKz5NYXR0aWFzIEVuZ2RlZ+VyZDwvVEQKKz48L1RSCis+PFRSCis+PFRECis+SnVsaWFuIFBldGVyc29uPC9URAorPjwvVFIKKz48VFIKKz48VEQKKz5LZW4gSm9yZGFuPC9URAorPjwvVFIKKz48VFIKKz48VEQKKz5NYXhpbSBTb2JvbGV2PC9URAorPjwvVFIKKz48VFIKKz48VEQKKz5XZXNsZXkgUG9vbGU8L1RECis+PC9UUgorPjxUUgorPjxURAorPk1pY2hhZWwgVmFuY2U8L1RECis+PC9UUgorPjxUUgorPjxURAorPkFuZHJlYXMgVW1iYWNoPC9URAorPjwvVFIKKz48VFIKKz48VEQKKz5BbmRyZWFzIEhvZm1laXN0ZXI8L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlYWJvdXRzZGxkb2MuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZXRoZWJhc2ljcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+QWJvdXQgU0RMZG9jPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGVwcmVmYWNlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+VGhlIEJhc2ljczwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWV2ZW50ZXhhbXBsZXMuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGVldmVudGV4YW1wbGVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwMTM2OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGVldmVudGV4YW1wbGVzLmh0bWwKQEAgLTAsMCArMSwyNDcgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5FdmVudCBFeGFtcGxlczwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJFeGFtcGxlcyIKK0hSRUY9Imd1aWRlZXhhbXBsZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iRXhhbXBsZXMiCitIUkVGPSJndWlkZWV4YW1wbGVzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iQXVkaW8gRXhhbXBsZXMiCitIUkVGPSJndWlkZWF1ZGlvZXhhbXBsZXMuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJTRUNUMSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGVleGFtcGxlcy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPkNoYXB0ZXIgNC4gRXhhbXBsZXM8L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRlYXVkaW9leGFtcGxlcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QxIgorPjxIMQorQ0xBU1M9IlNFQ1QxIgorPjxBCitOQU1FPSJHVUlERUVWRU5URVhBTVBMRVMiCis+PC9BCis+RXZlbnQgRXhhbXBsZXM8L0gxCis+PFAKKz48L1AKKz48RElWCitDTEFTUz0iU0VDVDIiCis+PEgyCitDTEFTUz0iU0VDVDIiCis+PEEKK05BTUU9IkFFTjM3NSIKKz48L0EKKz5GaWx0ZXJpbmcgYW5kIEhhbmRsaW5nIEV2ZW50czwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4jaW5jbHVkZSAmIzYwO3N0ZGlvLmgmIzYyOworI2luY2x1ZGUgJiM2MDtzdGRsaWIuaCYjNjI7CisKKyNpbmNsdWRlICJTREwuaCIKKworLyogVGhpcyBmdW5jdGlvbiBtYXkgcnVuIGluIGEgc2VwYXJhdGUgZXZlbnQgdGhyZWFkICovCitpbnQgRmlsdGVyRXZlbnRzKGNvbnN0IFNETF9FdmVudCAqZXZlbnQpIHsKKyAgICBzdGF0aWMgaW50IGJveWNvdHQgPSAxOworCisgICAgLyogVGhpcyBxdWl0IGV2ZW50IHNpZ25hbHMgdGhlIGNsb3Npbmcgb2YgdGhlIHdpbmRvdyAqLworICAgIGlmICggKGV2ZW50LSYjNjI7dHlwZSA9PSBTRExfUVVJVCkgJiMzODsmIzM4OyBib3ljb3R0ICkgeworICAgICAgICBwcmludGYoIlF1aXQgZXZlbnQgZmlsdGVyZWQgb3V0IC0tIHRyeSBhZ2Fpbi5cbiIpOworICAgICAgICBib3ljb3R0ID0gMDsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoIGV2ZW50LSYjNjI7dHlwZSA9PSBTRExfTU9VU0VNT1RJT04gKSB7CisgICAgICAgIHByaW50ZigiTW91c2UgbW92ZWQgdG8gKCVkLCVkKVxuIiwKKyAgICAgICAgICAgICAgICBldmVudC0mIzYyO21vdGlvbi54LCBldmVudC0mIzYyO21vdGlvbi55KTsKKyAgICAgICAgcmV0dXJuKDApOyAgICAvKiBEcm9wIGl0LCB3ZSd2ZSBoYW5kbGVkIGl0ICovCisgICAgfQorICAgIHJldHVybigxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBTRExfRXZlbnQgZXZlbnQ7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBTREwgbGlicmFyeSAoc3RhcnRzIHRoZSBldmVudCBsb29wKSAqLworICAgIGlmICggU0RMX0luaXQoU0RMX0lOSVRfVklERU8pICYjNjA7IDAgKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJDb3VsZG4ndCBpbml0aWFsaXplIFNETDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBDbGVhbiB1cCBvbiBleGl0LCBleGl0IG9uIHdpbmRvdyBjbG9zZSBhbmQgaW50ZXJydXB0ICovCisgICAgYXRleGl0KFNETF9RdWl0KTsKKworICAgIC8qIElnbm9yZSBrZXkgZXZlbnRzICovCisgICAgU0RMX0V2ZW50U3RhdGUoU0RMX0tFWURPV04sIFNETF9JR05PUkUpOworICAgIFNETF9FdmVudFN0YXRlKFNETF9LRVlVUCwgU0RMX0lHTk9SRSk7CisKKyAgICAvKiBGaWx0ZXIgcXVpdCBhbmQgbW91c2UgbW90aW9uIGV2ZW50cyAqLworICAgIFNETF9TZXRFdmVudEZpbHRlcihGaWx0ZXJFdmVudHMpOworCisgICAgLyogVGhlIG1vdXNlIGlzbid0IG11Y2ggdXNlIHVubGVzcyB3ZSBoYXZlIGEgZGlzcGxheSBmb3IgcmVmZXJlbmNlICovCisgICAgaWYgKCBTRExfU2V0VmlkZW9Nb2RlKDY0MCwgNDgwLCA4LCAwKSA9PSBOVUxMICkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IHNldCA2NDB4NDgweDggdmlkZW8gbW9kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogTG9vcCB3YWl0aW5nIGZvciBFU0MrTW91c2VfQnV0dG9uICovCisgICAgd2hpbGUgKCBTRExfV2FpdEV2ZW50KCYjMzg7ZXZlbnQpICYjNjI7PSAwICkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU0RMX0FDVElWRUVWRU5UOiB7CisgICAgICAgICAgICAgICAgaWYgKCBldmVudC5hY3RpdmUuc3RhdGUgJiMzODsgU0RMX0FQUEFDVElWRSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBldmVudC5hY3RpdmUuZ2FpbiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQXBwIGFjdGl2YXRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkFwcCBpY29uaWZpZWRcbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBTRExfTU9VU0VCVVRUT05ET1dOOiB7CisgICAgICAgICAgICAgICAgVWludDggKmtleXM7CisKKyAgICAgICAgICAgICAgICBrZXlzID0gU0RMX0dldEtleVN0YXRlKE5VTEwpOworICAgICAgICAgICAgICAgIGlmICgga2V5c1tTRExLX0VTQ0FQRV0gPT0gU0RMX1BSRVNTRUQgKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQnllIGJ5ZS4uLlxuIik7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZigiTW91c2UgYnV0dG9uIHByZXNzZWRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU0RMX1FVSVQ6IHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlF1aXQgcmVxdWVzdGVkLCBxdWl0dGluZy5cbiIpOworICAgICAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICBwcmludGYoIlNETF9XYWl0RXZlbnQgZXJyb3I6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgZXhpdCgxKTsKK308L1BSRQorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZWV4YW1wbGVzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGVhdWRpb2V4YW1wbGVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5FeGFtcGxlczwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlZXhhbXBsZXMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5BdWRpbyBFeGFtcGxlczwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWV4YW1wbGVzLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRlZXhhbXBsZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjlhODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWV4YW1wbGVzLmh0bWwKQEAgLTAsMCArMSwxODggQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5FeGFtcGxlczwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgR3VpZGUiCitIUkVGPSJndWlkZS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJIYW5kbGluZyB0aGUgS2V5Ym9hcmQiCitIUkVGPSJndWlkZWlucHV0a2V5Ym9hcmQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJFdmVudCBFeGFtcGxlcyIKK0hSRUY9Imd1aWRlZXZlbnRleGFtcGxlcy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IkNIQVBURVIiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRlaW5wdXRrZXlib2FyZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGVldmVudGV4YW1wbGVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iQ0hBUFRFUiIKKz48SDEKKz48QQorTkFNRT0iR1VJREVFWEFNUExFUyIKKz48L0EKKz5DaGFwdGVyIDQuIEV4YW1wbGVzPC9IMQorPjxESVYKK0NMQVNTPSJUT0MiCis+PERMCis+PERUCis+PEIKKz5UYWJsZSBvZiBDb250ZW50czwvQgorPjwvRFQKKz48RFQKKz48QQorSFJFRj0iZ3VpZGVleGFtcGxlcy5odG1sI0FFTjM2OSIKKz5JbnRyb2R1Y3Rpb248L0EKKz48L0RUCis+PERUCis+PEEKK0hSRUY9Imd1aWRlZXZlbnRleGFtcGxlcy5odG1sIgorPkV2ZW50IEV4YW1wbGVzPC9BCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZWF1ZGlvZXhhbXBsZXMuaHRtbCIKKz5BdWRpbyBFeGFtcGxlczwvQQorPjwvRFQKKz48RFQKKz48QQorSFJFRj0iZ3VpZGVjZHJvbWV4YW1wbGVzLmh0bWwiCis+Q0RST00gRXhhbXBsZXM8L0EKKz48L0RUCis+PERUCis+PEEKK0hSRUY9Imd1aWRldGltZWV4YW1wbGVzLmh0bWwiCis+VGltZSBFeGFtcGxlczwvQQorPjwvRFQKKz48L0RMCis+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDEiCis+PEgxCitDTEFTUz0iU0VDVDEiCis+PEEKK05BTUU9IkFFTjM2OSIKKz48L0EKKz5JbnRyb2R1Y3Rpb248L0gxCis+PFAKKz5Gb3IgdGhlIG1vbWVudCB0aGVzZSBleGFtcGxlcyBhcmUgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgb2xkIFNETCBkb2N1bWVudGF0aW9uLiBCeSB0aGUgMS4yIHJlbGVhc2UgdGhlc2UgZXhhbXBsZXMgc2hvdWxkIGhvcGVmdWxseSBkZWFsIHdpdGggbW9zdCBjb21tb24gU0RMIHByb2dyYW1taW5nIHByb2JsZW1zLjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZWlucHV0a2V5Ym9hcmQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZWV2ZW50ZXhhbXBsZXMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPkhhbmRsaW5nIHRoZSBLZXlib2FyZDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+RXZlbnQgRXhhbXBsZXM8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGVpbnB1dC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZWlucHV0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5YmJlMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGVpbnB1dC5odG1sCkBAIC0wLDAgKzEsNzM5IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+SW5wdXQgaGFuZGxpbmc8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iU0RMIEd1aWRlIgorSFJFRj0iZ3VpZGUuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iVXNpbmcgT3BlbkdMIFdpdGggU0RMIgorSFJFRj0iZ3VpZGV2aWRlb29wZW5nbC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IkhhbmRsaW5nIHRoZSBLZXlib2FyZCIKK0hSRUY9Imd1aWRlaW5wdXRrZXlib2FyZC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IkNIQVBURVIiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRldmlkZW9vcGVuZ2wuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRlaW5wdXRrZXlib2FyZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IkNIQVBURVIiCis+PEgxCis+PEEKK05BTUU9IkdVSURFSU5QVVQiCis+PC9BCis+Q2hhcHRlciAzLiBJbnB1dCBoYW5kbGluZzwvSDEKKz48RElWCitDTEFTUz0iVE9DIgorPjxETAorPjxEVAorPjxCCis+VGFibGUgb2YgQ29udGVudHM8L0IKKz48L0RUCis+PERUCis+PEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCNHVUlERUlOUFVUSk9ZU1RJQ0siCis+SGFuZGxpbmcgSm95c3RpY2tzPC9BCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZWlucHV0a2V5Ym9hcmQuaHRtbCIKKz5IYW5kbGluZyB0aGUgS2V5Ym9hcmQ8L0EKKz48L0RUCis+PC9ETAorPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QxIgorPjxIMQorQ0xBU1M9IlNFQ1QxIgorPjxBCitOQU1FPSJHVUlERUlOUFVUSk9ZU1RJQ0siCis+PC9BCis+SGFuZGxpbmcgSm95c3RpY2tzPC9IMQorPjxESVYKK0NMQVNTPSJTRUNUMiIKKz48SDIKK0NMQVNTPSJTRUNUMiIKKz48QQorTkFNRT0iQUVOMTM1IgorPjwvQQorPkluaXRpYWxpemF0aW9uPC9IMgorPjxQCis+VGhlIGZpcnN0IHN0ZXAgaW4gdXNpbmcgYSBqb3lzdGljayBpbiBhIFNETCBwcm9ncmFtIGlzIHRvIGluaXRpYWxpemUgdGhlIEpveXN0aWNrIHN1YnN5c3RlbXMgb2YgU0RMLiBUaGlzIGRvbmUgYnkgcGFzc2luZyB0aGUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSU5JVF9KT1lTVElDSzwvVFQKKz4gZmxhZyB0byA8QQorSFJFRj0ic2RsaW5pdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Jbml0PC9UVAorPjwvQQorPi4gIFRoZSBqb3lzdGljayBmbGFnIHdpbGwgdXN1YWxseSBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgZmxhZ3MgKGxpa2UgdGhlIHZpZGVvIGZsYWcpIGJlY2F1c2UgdGhlIGpveXN0aWNrIGlzIHVzdWFsbHkgdXNlZCB0byBjb250cm9sIHNvbWV0aGluZy48L1AKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVOMTQxIgorPjwvQQorPjxQCis+PEIKKz5FeGFtcGxlIDMtMS4gSW5pdGlhbGl6aW5nIFNETCB3aXRoIEpveXN0aWNrIFN1cHBvcnQ8L0IKKz48L1AKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgIGlmIChTRExfSW5pdCggU0RMX0lOSVRfVklERU8gfCBTRExfSU5JVF9KT1lTVElDSyApICYjNjA7IDApCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICBleGl0KDEpOworICAgIH08L1BSRQorPjwvRElWCis+PFAKKz5UaGlzIHdpbGwgYXR0ZW1wdCB0byBzdGFydCBTREwgd2l0aCBib3RoIHRoZSB2aWRlbyBhbmQgdGhlIGpveXN0aWNrIHN1YnN5c3RlbXMgYWN0aXZhdGVkLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QyIgorPjxIMgorQ0xBU1M9IlNFQ1QyIgorPjxBCitOQU1FPSJBRU4xNDUiCis+PC9BCis+UXVlcnlpbmc8L0gyCis+PFAKKz5JZiB3ZSBoYXZlIHJlYWNoZWQgdGhpcyBwb2ludCB0aGVuIHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoYXQgdGhlIFNETCBsaWJyYXJ5IGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCB0aGF0IHRoZSBKb3lzdGljayBzdWJzeXN0ZW0gaXMgYWN0aXZlLiBXZSBjYW4gbm93IGNhbGwgc29tZSB2aWRlbyBhbmQvb3Igc291bmQgZnVuY3Rpb25zIHRvIGdldCB0aGluZ3MgZ29pbmcgYmVmb3JlIHdlIG5lZWQgdGhlIGpveXN0aWNrLiBFdmVudHVhbGx5IHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYWN0dWFsbHkgYSBqb3lzdGljayB0byB3b3JrIHdpdGguIEl0J3Mgd2lzZSB0byBhbHdheXMgY2hlY2sgZXZlbiBpZiB5b3Uga25vdyBhIGpveXN0aWNrIHdpbGwgYmUgcHJlc2VudCBvbiB0aGUgc3lzdGVtIGJlY2F1c2UgaXQgY2FuIGFsc28gaGVscCBkZXRlY3Qgd2hlbiB0aGUgam95c3RpY2sgaXMgdW5wbHVnZ2VkLiBUaGUgZnVuY3Rpb24gdXNlZCB0byBjaGVjayBmb3Igam95c3RpY2tzIGlzIDxBCitIUkVGPSJzZGxudW1qb3lzdGlja3MuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTnVtSm95c3RpY2tzPC9UVAorPjwvQQorPi48L1AKKz48UAorPlRoaXMgZnVuY3Rpb24gc2ltcGx5IHJldHVybnMgdGhlIG51bWJlciBvZiBqb3lzdGlja3MgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0uIElmIGl0IGlzIGF0IGxlYXN0IG9uZSB0aGVuIHdlIGFyZSBpbiBnb29kIHNoYXBlLiBUaGUgbmV4dCBzdGVwIGlzIHRvIGRldGVybWluZSB3aGljaCBqb3lzdGljayB0aGUgdXNlciB3YW50cyB0byB1c2UuIElmIHRoZSBudW1iZXIgb2Ygam95c3RpY2tzIGF2YWlsYWJsZSBpcyBvbmx5IG9uZSB0aGVuIGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQgb25lIGpveXN0aWNrIGlzIHRoZSBvbmUgdGhlIHVzZXIgd2FudHMgdG8gdXNlLiBTREwgaGFzIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuYW1lIG9mIHRoZSBqb3lzdGlja3MgYXMgYXNzaWduZWQgYnkgdGhlIG9wZXJhdGlvbnMgc3lzdGVtIGFuZCB0aGF0IGZ1bmN0aW9uIGlzIDxBCitIUkVGPSJzZGxqb3lzdGlja25hbWUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tOYW1lPC9UVAorPjwvQQorPi4gIFRoZSBqb3lzdGljayBpcyBzcGVjaWZpZWQgYnkgYW4gaW5kZXggd2hlcmUgMCBpcyB0aGUgZmlyc3Qgam95c3RpY2sgYW5kIHRoZSBsYXN0IGpveXN0aWNrIGlzIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX051bUpveXN0aWNrczwvVFQKKz4gLSAxLiAgSW4gdGhlIGRlbW9uc3RyYXRpb24gYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgam95c3RpY2tzIGlzIHByaW50ZWQgdG8gc3Rkb3V0LjwvUAorPjxESVYKK0NMQVNTPSJFWEFNUExFIgorPjxBCitOQU1FPSJBRU4xNTQiCis+PC9BCis+PFAKKz48QgorPkV4YW1wbGUgMy0yLiBRdWVyeWluZyB0aGUgTnVtYmVyIG9mIEF2YWlsYWJsZSBKb3lzdGlja3M8L0IKKz48L1AKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgIHByaW50ZigiJWkgam95c3RpY2tzIHdlcmUgZm91bmQuXG5cbiIsIFNETF9OdW1Kb3lzdGlja3MoKSApOworICAgIHByaW50ZigiVGhlIG5hbWVzIG9mIHRoZSBqb3lzdGlja3MgYXJlOlxuIik7CisJCQorICAgIGZvciggaT0wOyBpICYjNjA7IFNETF9OdW1Kb3lzdGlja3MoKTsgaSsrICkgCisgICAgeworICAgICAgICBwcmludGYoIiAgICAlc1xuIiwgU0RMX0pveXN0aWNrTmFtZShpKSk7CisgICAgfTwvUFJFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJTRUNUMiIKKz48SDIKK0NMQVNTPSJTRUNUMiIKKz48QQorTkFNRT0iQUVOMTU3IgorPjwvQQorPk9wZW5pbmcgYSBKb3lzdGljayBhbmQgUmVjZWl2aW5nIEpveXN0aWNrIEV2ZW50czwvSDIKKz48UAorPlNETCdzIGV2ZW50IGRyaXZlbiBhcmNoaXRlY3R1cmUgbWFrZXMgd29ya2luZyB3aXRoIGpveXN0aWNrcyBhIHNuYXAuICBKb3lzdGlja3MgY2FuIHRyaWdnZXIgNCBkaWZmZXJlbnQgdHlwZXMgb2YgZXZlbnRzOgorPFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKKz48VEJPRFkKKz48VFIKKz48VEQKKz48QQorSFJFRj0ic2Rsam95YXhpc2V2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Kb3lBeGlzRXZlbnQ8L1NQQU4KKz48L0EKKz48L1RECis+PFRECis+T2NjdXJzIHdoZW4gYW4gYXhpcyBjaGFuZ2VzPC9URAorPjwvVFIKKz48VFIKKz48VEQKKz48QQorSFJFRj0ic2Rsam95YmFsbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Kb3lCYWxsRXZlbnQ8L1NQQU4KKz48L0EKKz48L1RECis+PFRECis+T2NjdXJzIHdoZW4gYSBqb3lzdGljayB0cmFja2JhbGwncyBwb3NpdGlvbiBjaGFuZ2VzPC9URAorPjwvVFIKKz48VFIKKz48VEQKKz48QQorSFJFRj0ic2Rsam95aGF0ZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveUhhdEV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjxURAorPk9jY3VycyB3aGVuIGEgaGF0J3MgcG9zaXRpb24gY2hhbmdlczwvVEQKKz48L1RSCis+PFRSCis+PFRECis+PEEKK0hSRUY9InNkbGpveWJ1dHRvbmV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Kb3lCdXR0b25FdmVudDwvU1BBTgorPjwvQQorPjwvVEQKKz48VEQKKz5PY2N1cnMgd2hlbiBhIGJ1dHRvbiBpcyBwcmVzc2VkIG9yIHJlbGVhc2VkPC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PC9QCis+PFAKKz5FdmVudHMgYXJlIHJlY2VpdmVkIGZyb20gYWxsIGpveXN0aWNrcyBvcGVuZWQuIFRoZSBmaXJzdCB0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaW4gb3JkZXIgdG8gcmVjZWl2ZSBqb3lzdGljayBldmVudHMgaXMgdG8gY2FsbCA8QQorSFJFRj0ic2Rsam95c3RpY2tldmVudHN0YXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrRXZlbnRTdGF0ZTwvVFQKKz48L0EKKz4gd2l0aCB0aGUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRU5BQkxFPC9UVAorPiBmbGFnLiBOZXh0IHlvdSBtdXN0IG9wZW4gdGhlIGpveXN0aWNrcyB0aGF0IHlvdSB3YW50IHRvIHJlY2VpdmUgZXZlbnRzIGZyb20uIFRoaXMgaXMgZG9uZSB3aXRoIHRoZSA8QQorSFJFRj0ic2Rsam95c3RpY2tvcGVuLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrT3BlbjwvVFQKKz48L0EKKz4gZnVuY3Rpb24uIEZvciB0aGUgZXhhbXBsZSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGV2ZW50cyBmcm9tIHRoZSBmaXJzdCBqb3lzdGljayBvbiB0aGUgc3lzdGVtLCByZWdhcmRsZXNzIG9mIHdoYXQgaXQgbWF5IGJlLiBUbyByZWNlaXZlIGV2ZW50cyBmcm9tIGl0IHdlIHdvdWxkIGRvIHRoaXM6PC9QCis+PERJVgorQ0xBU1M9IkVYQU1QTEUiCis+PEEKK05BTUU9IkFFTjE4MyIKKz48L0EKKz48UAorPjxCCis+RXhhbXBsZSAzLTMuIE9wZW5pbmcgYSBKb3lzdGljazwvQgorPjwvUAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgU0RMX0pveXN0aWNrICpqb3lzdGljazsKKworICAgIFNETF9Kb3lzdGlja0V2ZW50U3RhdGUoU0RMX0VOQUJMRSk7CisgICAgam95c3RpY2sgPSBTRExfSm95c3RpY2tPcGVuKDApOzwvUFJFCis+PC9ESVYKKz48UAorPklmIHdlIHdhbnRlZCB0byByZWNlaXZlIGV2ZW50cyBmb3Igb3RoZXIgam95c3RpY2tzIHdlIHdvdWxkIG9wZW4gdGhlbSB3aXRoIGNhbGxzIHRvIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja09wZW48L1RUCis+IGp1c3QgbGlrZSB3ZSBvcGVuZWQgam95c3RpY2sgMCwgZXhjZXB0IHdlIHdvdWxkIHN0b3JlIHRoZSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveXN0aWNrPC9TUEFOCis+IHN0cnVjdHVyZSB0aGV5IHJldHVybiBpbiBhIGRpZmZlcmVudCBwb2ludGVyLiAgV2Ugb25seSBuZWVkIHRoZSBqb3lzdGljayBwb2ludGVyIHdoZW4gd2UgYXJlIHF1ZXJ5aW5nIHRoZSBqb3lzdGlja3Mgb3Igd2hlbiB3ZSBhcmUgY2xvc2luZyB0aGUgam95c3RpY2suPC9QCis+PFAKKz5VcCB0byB0aGlzIHBvaW50IGFsbCB0aGUgY29kZSB3ZSBoYXZlIGlzIHVzZWQganVzdCB0byBpbml0aWFsaXplIHRoZSBqb3lzdGlja3MgaW4gb3JkZXIgdG8gcmVhZCB2YWx1ZXMgYXQgcnVuIHRpbWUuIEFsbCB3ZSBuZWVkIG5vdyBpcyBhbiBldmVudCBsb29wLCB3aGljaCBpcyBzb21ldGhpbmcgdGhhdCBhbGwgU0RMIHByb2dyYW1zIHNob3VsZCBoYXZlIGFueXdheSB0byByZWNlaXZlIHRoZSBzeXN0ZW1zIHF1aXQgZXZlbnRzLiBXZSBtdXN0IG5vdyBhZGQgY29kZSB0byBjaGVjayB0aGUgZXZlbnQgbG9vcCBmb3IgYXQgbGVhc3Qgc29tZSBvZiB0aGUgYWJvdmUgbWVudGlvbmVkIGV2ZW50cy4gTGV0J3MgYXNzdW1lIG91ciBldmVudCBsb29wIGxvb2tzIGxpa2UgdGhpczoKKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgU0RMX0V2ZW50IGV2ZW50OworICAgIC8qIE90aGVyIGluaXRpYWxpenRpb24gY29kZSBnb2VzIGhlcmUgKi8gICAKKworICAgIC8qIFN0YXJ0IG1haW4gZ2FtZSBsb29wIGhlcmUgKi8KKworICAgIHdoaWxlKFNETF9Qb2xsRXZlbnQoJiMzODtldmVudCkpCisgICAgeyAgCisgICAgICAgIHN3aXRjaChldmVudC50eXBlKQorICAgICAgICB7ICAKKyAgICAgICAgICAgIGNhc2UgU0RMX0tFWURPV046CisgICAgICAgICAgICAvKiBoYW5kbGUga2V5Ym9hcmQgc3R1ZmYgaGVyZSAqLwkJCQkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNETF9RVUlUOgorICAgICAgICAgICAgLyogU2V0IHdoYXRldmVyIGZsYWdzIGFyZSBuZWNlc3NhcnkgdG8gKi8KKyAgICAgICAgICAgIC8qIGVuZCB0aGUgbWFpbiBnYW1lIGxvb3AgaGVyZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFbmQgbG9vcCBoZXJlICovPC9QUkUKKz4KK1RvIGhhbmRsZSBKb3lzdGljayBldmVudHMgd2UgbWVyZWx5IGFkZCBjYXNlcyBmb3IgdGhlbSwgZmlyc3Qgd2UnbGwgYWRkIGF4aXMgaGFuZGxpbmcgY29kZS4gQXhpcyBjaGVja3MgY2FuIGdldCBraW5kYSBvZiB0cmlja3kgYmVjYXVzZSBhbG90IG9mIHRoZSBqb3lzdGljayBldmVudHMgcmVjZWl2ZWQgYXJlIGp1bmsuIEpveXN0aWNrIGF4aXMgaGF2ZSBhIHRlbmRlbmN5IHRvIHZhcnkganVzdCBhIGxpdHRsZSBiZXR3ZWVuIHBvbGxpbmcgZHVlIHRvIHRoZSB3YXkgdGhleSBhcmUgZGVzaWduZWQuIFRvIGNvbXBlbnNhdGUgZm9yIHRoaXMgeW91IGhhdmUgdG8gc2V0IGEgdGhyZXNob2xkIGZvciBjaGFuZ2VzIGFuZCBpZ25vcmUgdGhlIGV2ZW50cyB0aGF0IGhhdmUnbnQgZXhjZWVkZWQgdGhlIHRocmVzaG9sZC4gMTAlIGlzIHVzdWFsbHkgYSBnb29kIHRocmVzaG9sZCB2YWx1ZS4gIFRoaXMgc291bmRzIGEgbG90IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCBpcy4gSGVyZSBpcyB0aGUgQXhpcyBldmVudCBoYW5kbGVyOjwvUAorPjxESVYKK0NMQVNTPSJFWEFNUExFIgorPjxBCitOQU1FPSJBRU4xOTEiCis+PC9BCis+PFAKKz48QgorPkV4YW1wbGUgMy00LiBKb3lzdGljayBBeGlzIEV2ZW50czwvQgorPjwvUAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgY2FzZSBTRExfSk9ZQVhJU01PVElPTjogIC8qIEhhbmRsZSBKb3lzdGljayBNb3Rpb24gKi8KKyAgICBpZiAoICggZXZlbnQuamF4aXMudmFsdWUgJiM2MDsgLTMyMDAgKSB8fCAoZXZlbnQuamF4aXMudmFsdWUgJiM2MjsgMzIwMCApICkgCisgICAgeworICAgICAgLyogY29kZSBnb2VzIGhlcmUgKi8KKyAgICB9CisgICAgYnJlYWs7PC9QUkUKKz48L0RJVgorPjxQCis+QW5vdGhlciB0cmljayB3aXRoIGF4aXMgZXZlbnRzIGlzIHRoYXQgdXAtZG93biBhbmQgbGVmdC1yaWdodCBtb3ZlbWVudCBhcmUgdHdvIGRpZmZlcmVudCBzZXRzIG9mIGF4ZXMuIFRoZSBtb3N0IGltcG9ydGFudCBheGlzIGlzIGF4aXMgMCAobGVmdC1yaWdodCkgYW5kIGF4aXMgMSAodXAtZG93bikuICBUbyBoYW5kbGUgdGhlbSBzZXBlcmF0bHkgaW4gdGhlIGNvZGUgd2UgZG8gdGhlIGZvbGxvd2luZzo8L1AKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVOMTk1IgorPjwvQQorPjxQCis+PEIKKz5FeGFtcGxlIDMtNS4gTW9yZSBKb3lzdGljayBBeGlzIEV2ZW50czwvQgorPjwvUAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgY2FzZSBTRExfSk9ZQVhJU01PVElPTjogIC8qIEhhbmRsZSBKb3lzdGljayBNb3Rpb24gKi8KKyAgICBpZiAoICggZXZlbnQuamF4aXMudmFsdWUgJiM2MDsgLTMyMDAgKSB8fCAoZXZlbnQuamF4aXMudmFsdWUgJiM2MjsgMzIwMCApICkgCisgICAgeworICAgICAgICBpZiggZXZlbnQuamF4aXMuYXhpcyA9PSAwKSAKKyAgICAgICAgeworICAgICAgICAgICAgLyogTGVmdC1yaWdodCBtb3ZlbWVudCBjb2RlIGdvZXMgaGVyZSAqLworICAgICAgICB9CisKKyAgICAgICAgaWYoIGV2ZW50LmpheGlzLmF4aXMgPT0gMSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVwLURvd24gbW92ZW1lbnQgY29kZSBnb2VzIGhlcmUgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBicmVhazs8L1BSRQorPjwvRElWCis+PFAKKz5JZGVhbGx5IHRoZSBjb2RlIGhlcmUgc2hvdWxkIHVzZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmV2ZW50LmpheGlzLnZhbHVlPC9JCis+PC9UVAorPiB0byBzY2FsZSBzb21ldGhpbmcuIEZvciBleGFtcGxlIGxldHMgYXNzdW1lIHlvdSBhcmUgdXNpbmcgdGhlIGpveXN0aWNrIHRvIGNvbnRyb2wgdGhlIG1vdmVtZW50IG9mIGEgc3BhY2VzaGlwLiBJZiB0aGUgdXNlciBpcyB1c2luZyBhbiBhbmFsb2cgam95c3RpY2sgYW5kIHRoZXkgcHVzaCB0aGUgc3RpY2sgYSBsaXR0bGUgYml0IHRoZXkgZXhwZWN0IHRvIG1vdmUgbGVzcyB0aGFuIGlmIHRoZXkgcHVzaGVkIGl0IGEgbG90LiBEZXNpZ25pbmcgeW91ciBjb2RlIGZvciB0aGlzIHNpdHVhdGlvbiBpcyBwcmVmZXJyZWQgYmVjYXVzZSBpdCBtYWtlcyB0aGUgZXhwZXJpZW5jZSBmb3IgdXNlcnMgb2YgYW5hbG9nIGNvbnRyb2xzIGJldHRlciBhbmQgcmVtYWlucyB0aGUgc2FtZSBmb3IgdXNlcnMgb2YgZGlnaXRhbCBjb250cm9scy48L1AKKz48UAorPklmIHlvdXIgam95c3RpY2sgaGFzIGFueSBhZGRpdGlvbmFsIGF4aXMgdGhlbiB0aGV5IG1heSBiZSB1c2VkIGZvciBvdGhlciBzdGlja3Mgb3IgdGhyb3R0bGUgY29udHJvbHMgYW5kIHRob3NlIGF4aXMgcmV0dXJuIHZhbHVlcyB0b28ganVzdCB3aXRoIGRpZmZlcmVudCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmV2ZW50LmpheGlzLmF4aXM8L0kKKz48L1RUCis+IHZhbHVlcy48L1AKKz48UAorPkJ1dHRvbiBoYW5kbGluZyBpcyBzaW1wbGUgY29tcGFyZWQgdG8gdGhlIGF4aXMgY2hlY2tpbmcuPC9QCis+PERJVgorQ0xBU1M9IkVYQU1QTEUiCis+PEEKK05BTUU9IkFFTjIwMyIKKz48L0EKKz48UAorPjxCCis+RXhhbXBsZSAzLTYuIEpveXN0aWNrIEJ1dHRvbiBFdmVudHM8L0IKKz48L1AKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgIGNhc2UgU0RMX0pPWUJVVFRPTkRPV046ICAvKiBIYW5kbGUgSm95c3RpY2sgQnV0dG9uIFByZXNzZXMgKi8KKyAgICBpZiAoIGV2ZW50LmpidXR0b24uYnV0dG9uID09IDAgKSAKKyAgICB7CisgICAgICAgIC8qIGNvZGUgZ29lcyBoZXJlICovCisgICAgfQorICAgIGJyZWFrOzwvUFJFCis+PC9ESVYKKz48UAorPkJ1dHRvbiBjaGVja3MgYXJlIHNpbXBsZXIgdGhhbiBheGlzIGNoZWNrcyBiZWNhdXNlIGEgYnV0dG9uIGNhbiBvbmx5IGJlIHByZXNzZWQgb3Igbm90IHByZXNzZWQuICBUaGUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSk9ZQlVUVE9ORE9XTjwvVFQKKz4gZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gYSBidXR0b24gaXMgcHJlc3NlZCBhbmQgdGhlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0pPWUJVVFRPTlVQPC9UVAorPiBldmVudCBpcyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIHJlbGVhc2VkLiBXZSBkbyBoYXZlIHRvIGtub3cgd2hhdCBidXR0b24gd2FzIHByZXNzZWQgdGhvdWdoLCB0aGF0IGlzIGRvbmUgYnkgcmVhZGluZyB0aGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5ldmVudC5qYnV0dG9uLmJ1dHRvbjwvSQorPjwvVFQKKz4gZmllbGQuPC9QCis+PFAKKz5MYXN0bHkgd2hlbiB3ZSBhcmUgdGhyb3VnaCB1c2luZyBvdXIgam95c3RpY2tzIHdlIHNob3VsZCBjbG9zZSB0aGVtIHdpdGggYSBjYWxsIHRvIDxBCitIUkVGPSJzZGxqb3lzdGlja2Nsb3NlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrQ2xvc2U8L1RUCis+PC9BCis+LiBUbyBjbG9zZSBvdXIgb3BlbmVkIGpveXN0aWNrIDAgd2Ugd291bGQgZG8gdGhpcyBhdCB0aGUgZW5kIG9mIG91ciBwcm9ncmFtOgorPFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPiAgICBTRExfSm95c3RpY2tDbG9zZShqb3lzdGljayk7PC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJTRUNUMiIKKz48SDIKK0NMQVNTPSJTRUNUMiIKKz48QQorTkFNRT0iQUVOMjE0IgorPjwvQQorPkFkdmFuY2VkIEpveXN0aWNrIEZ1bmN0aW9uczwvSDIKKz48UAorPlRoYXQgdGFrZXMgY2FyZSBvZiB0aGUgY29udHJvbHMgdGhhdCB5b3UgY2FuIGNvdW50IG9uIGJlaW5nIG9uIGV2ZXJ5IGpveXN0aWNrIHVuZGVyIHRoZSBzdW4sIGJ1dCB0aGVyZSBhcmUgYSBmZXcgZXh0cmEgdGhpbmdzIHRoYXQgU0RMIGNhbiBzdXBwb3J0LiAgSm95YmFsbHMgYXJlIG5leHQgb24gb3VyIGxpc3QsIHRoZXkgYXJlIGFsb3QgbGlrZSBheGlzIHdpdGggYSBmZXcgbWlub3IgZGlmZmVyZW5jZXMuICBKb3liYWxscyBzdG9yZSByZWxhdGl2ZSBjaGFuZ2VzIHVubGlrZSB0aGUgdGhlIGFic29sdXRlIHBvc3Rpb24gc3RvcmVkIGluIGEgYXhpcyBldmVudC4gQWxzbyBvbmUgdHJhY2tiYWxsIGV2ZW50IGNvbnRhaW5zIGJvdGggdGhlIGNoYW5nZSBpbiB4IGFuZCB0aGV5IGNoYW5nZSBpbiB5LiAgT3VyIGNhc2UgZm9yIGl0IGlzIGFzIGZvbGxvd3M6PC9QCis+PERJVgorQ0xBU1M9IkVYQU1QTEUiCis+PEEKK05BTUU9IkFFTjIxNyIKKz48L0EKKz48UAorPjxCCis+RXhhbXBsZSAzLTcuIEpveXN0aWNrIEJhbGwgRXZlbnRzPC9CCis+PC9QCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPiAgICBjYXNlIFNETF9KT1lCQUxMTU9USU9OOiAgLyogSGFuZGxlIEpveWJhbGwgTW90aW9uICovCisgICAgaWYoIGV2ZW50LmpiYWxsLmJhbGwgPT0gMCApCisgICAgeworICAgICAgLyogYmFsbCBoYW5kbGluZyAqLworICAgIH0KKyAgICBicmVhazs8L1BSRQorPjwvRElWCis+PFAKKz5UaGUgYWJvdmUgY2hlY2tzIHRoZSBmaXJzdCBqb3liYWxsIG9uIHRoZSBqb3lzdGljay4gVGhlIGNoYW5nZSBpbiBwb3NpdGlvbiB3aWxsIGJlIHN0b3JlZCBpbiA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmV2ZW50LmpiYWxsLnhyZWw8L0kKKz48L1RUCis+IGFuZCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmV2ZW50LmpiYWxsLnlyZWw8L0kKKz48L1RUCis+LjwvUAorPjxQCis+RmluYWxseSB3ZSBoYXZlIHRoZSBoYXQgZXZlbnQuIEhhdHMgcmVwb3J0IG9ubHkgdGhlIGRpcmVjdGlvbiB0aGV5IGFyZSBwdXNoZWQgaW4uIFdlIGNoZWNrIGhhdCdzIHBvc2l0aW9uIHdpdGggdGhlIGJpdG1hc2tzOgorCis8UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorPjxUQk9EWQorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9DRU5URVJFRDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9VUDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9SSUdIVDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9ET1dOPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSEFUX0xFRlQ8L1RUCis+PC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+CisKK0Fsc28gdGhlcmUgYXJlIHNvbWUgcHJlZGVmaW5lZCBjb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlOgorPFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKKz48VEJPRFkKKz48VFIKKz48VEQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IQVRfUklHSFRVUDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9SSUdIVERPV048L1RUCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IQVRfTEVGVFVQPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSEFUX0xFRlRET1dOPC9UVAorPjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPgorCitPdXIgY2FzZSBmb3IgdGhlIGhhdCBtYXkgcmVzZW1ibGUgdGhlIGZvbGxvd2luZzo8L1AKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVOMjQ0IgorPjwvQQorPjxQCis+PEIKKz5FeGFtcGxlIDMtOC4gSm95c3RpY2sgSGF0IEV2ZW50czwvQgorPjwvUAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgY2FzZSBTRExfSk9ZSEFUTU9USU9OOiAgLyogSGFuZGxlIEhhdCBNb3Rpb24gKi8KKyAgICBpZiAoIGV2ZW50LmpoYXQudmFsdWUgJiMzODsgU0RMX0hBVF9VUCApCisgICAgeworICAgICAgICAvKiBEbyB1cCBzdHVmZiBoZXJlICovCisgICAgfQorCisgICAgaWYgKCBldmVudC5qaGF0LnZhbHVlICYjMzg7IFNETF9IQVRfTEVGVCApCisgICAgeworICAgICAgICAvKiBEbyBsZWZ0IHN0dWZmIGhlcmUgKi8KKyAgICB9CisKKyAgICBpZiAoIGV2ZW50LmpoYXQudmFsdWUgJiMzODsgU0RMX0hBVF9SSUdIVERPV04gKQorICAgIHsKKyAgICAgICAgLyogRG8gcmlnaHQgYW5kIGRvd24gdG9nZXRoZXIgc3R1ZmYgaGVyZSAqLworICAgIH0KKyAgICBicmVhazs8L1BSRQorPjwvRElWCis+PFAKKz5JbiBhZGRpdGlvbiB0byB0aGUgcXVlcmllcyBmb3IgbnVtYmVyIG9mIGpveXN0aWNrcyBvbiB0aGUgc3lzdGVtIGFuZCB0aGVpciBuYW1lcyB0aGVyZSBhcmUgYWRkaXRpb25hbCBmdW5jdGlvbnMgdG8gcXVlcnkgdGhlIGNhcGFiaWxpdGllcyBvZiBhdHRhY2hlZCBqb3lzdGlja3M6Cis8UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorPjxUQk9EWQorPjxUUgorPjxURAorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWF4ZXMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tOdW1BeGVzPC9UVAorPjwvQQorPjwvVEQKKz48VEQKKz5SZXR1cm5zIHRoZSBudW1iZXIgb2Ygam95c2l0Y2sgYXhlczwvVEQKKz48L1RSCis+PFRSCis+PFRECis+PEEKK0hSRUY9InNkbGpveXN0aWNrbnVtYnV0dG9ucy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja051bUJ1dHRvbnM8L1RUCis+PC9BCis+PC9URAorPjxURAorPlJldHVybnMgdGhlIG51bWJlciBvZiBqb3lzaXRjayBidXR0b25zPC9URAorPjwvVFIKKz48VFIKKz48VEQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1iYWxscy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja051bUJhbGxzPC9UVAorPjwvQQorPjwvVEQKKz48VEQKKz5SZXR1cm5zIHRoZSBudW1iZXIgb2Ygam95c2l0Y2sgYmFsbHM8L1RECis+PC9UUgorPjxUUgorPjxURAorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWhhdHMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tOdW1IYXRzPC9UVAorPjwvQQorPjwvVEQKKz48VEQKKz5SZXR1cm5zIHRoZSBudW1iZXIgb2Ygam95c2l0Y2sgaGF0czwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPgorCitUbyB1c2UgdGhlc2UgZnVuY3Rpb25zIHdlIGp1c3QgaGF2ZSB0byBwYXNzIGluIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgd2UgZ290IHdoZW4gd2Ugb3BlbmVkIHRoZSBqb3lzdGljay4gRm9yIEV4YW1wbGU6PC9QCis+PERJVgorQ0xBU1M9IkVYQU1QTEUiCis+PEEKK05BTUU9IkFFTjI2NSIKKz48L0EKKz48UAorPjxCCis+RXhhbXBsZSAzLTkuIFF1ZXJ5aW5nIEpveXN0aWNrIENoYXJhY3RlcmlzdGljczwvQgorPjwvUAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgaW50IG51bWJlcl9vZl9idXR0b25zOworICAgIFNETF9Kb3lzdGljayAqam95c3RpY2s7CisKKyAgICBqb3lzdGljayA9IFNETF9Kb3lzdGlja09wZW4oMCk7CisgICAgbnVtYmVyX29mX2J1dHRvbnMgPSBTRExfSm95c3RpY2tOdW1CdXR0b25zKGpveXN0aWNrKTs8L1BSRQorPjwvRElWCis+PFAKKz5UaGlzIGJsb2NrIG9mIGNvZGUgd291bGQgZ2V0IHRoZSBudW1iZXIgb2YgYnV0dG9ucyBvbiB0aGUgZmlyc3Qgam95c3RpY2sgaW4gdGhlIHN5c3RlbS4JPC9QCis+PC9ESVYKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGV2aWRlb29wZW5nbC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlaW5wdXRrZXlib2FyZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+VXNpbmcgT3BlbkdMIFdpdGggU0RMPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGUuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5IYW5kbGluZyB0aGUgS2V5Ym9hcmQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGVpbnB1dGtleWJvYXJkLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRlaW5wdXRrZXlib2FyZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzAzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRlaW5wdXRrZXlib2FyZC5odG1sCkBAIC0wLDAgKzEsNzQ2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+SGFuZGxpbmcgdGhlIEtleWJvYXJkPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IklucHV0IGhhbmRsaW5nIgorSFJFRj0iZ3VpZGVpbnB1dC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJJbnB1dCBoYW5kbGluZyIKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJFeGFtcGxlcyIKK0hSRUY9Imd1aWRlZXhhbXBsZXMuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJTRUNUMSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGVpbnB1dC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPkNoYXB0ZXIgMy4gSW5wdXQgaGFuZGxpbmc8L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRlZXhhbXBsZXMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxESVYKK0NMQVNTPSJTRUNUMSIKKz48SDEKK0NMQVNTPSJTRUNUMSIKKz48QQorTkFNRT0iR1VJREVJTlBVVEtFWUJPQVJEIgorPjwvQQorPkhhbmRsaW5nIHRoZSBLZXlib2FyZDwvSDEKKz48RElWCitDTEFTUz0iU0VDVDIiCis+PEgyCitDTEFTUz0iU0VDVDIiCis+PEEKK05BTUU9IkFFTjI3MSIKKz48L0EKKz5LZXlib2FyZCBSZWxhdGVkIFN0cnVjdHVyZXM8L0gyCis+PFAKKz5JdCBzaG91bGQgbWFrZSBpdCBhIGxvdCBlYXNpZXIgdG8gdW5kZXJzdGFuZCB0aGlzIHR1dG9yaWFsIGlzIHlvdSBhcmUgZmFtaWxpYXIgd2l0aCB0aGUgZGF0YSB0eXBlcyBpbnZvbHZlZCBpbiBrZXlib2FyZCBhY2Nlc3MsIHNvIEknbGwgZXhwbGFpbiB0aGVtIGZpcnN0LjwvUAorPjxESVYKK0NMQVNTPSJTRUNUMyIKKz48SDMKK0NMQVNTPSJTRUNUMyIKKz48QQorTkFNRT0iQUVOMjc0IgorPjwvQQorPlNETEtleTwvSDMKKz48UAorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExLZXk8L1NQQU4KKz4gaXMgYW4gZW51bWVyYXRlZCB0eXBlIGRlZmluZWQgaW4gU0RML2luY2x1ZGUvU0RMX2tleXN5bS5oIGFuZCBkZXRhaWxlZCA8QQorSFJFRj0ic2Rsa2V5Lmh0bWwiCis+aGVyZTwvQQorPi4gRWFjaCA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMS2V5PC9TUEFOCis+IHN5bWJvbCByZXByZXNlbnRzIGEga2V5LCA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETEtfYTwvVFQKKz4gY29ycmVzcG9uZHMgdG8gdGhlICdhJyBrZXkgb24gYSBrZXlib2FyZCwgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExLX1NQQUNFPC9UVAorPiBjb3JyZXNwb25kcyB0byB0aGUgc3BhY2UgYmFyLCBhbmQgc28gb24uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDMiCis+PEgzCitDTEFTUz0iU0VDVDMiCis+PEEKK05BTUU9IkFFTjI4MiIKKz48L0EKKz5TRExNb2Q8L0gzCis+PFAKKz5TRExNb2QgaXMgYW4gZW51bWVyYXRlZCB0eXBlLCBzaW1pbGFyIHRvIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExLZXk8L1NQQU4KKz4sIGhvd2V2ZXIgaXQgZW51bWVyYXRlcyBrZXlib2FyZCBtb2RpZmllcnMgKENvbnRyb2wsIEFsdCwgU2hpZnQpLiBUaGUgZnVsbCBsaXN0IG9mIG1vZGlmaWVyIHN5bWJvbHMgaXMgPEEKK0hSRUY9InNkbGtleS5odG1sI1NETE1PRCIKKz5oZXJlPC9BCis+LiA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMTW9kPC9TUEFOCis+IHZhbHVlcyBjYW4gYmUgQU5EJ2QgdG9nZXRoZXIgdG8gcmVwcmVzZW50IHNldmVyYWwgbW9kaWZpZXJzLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QzIgorPjxIMworQ0xBU1M9IlNFQ1QzIgorPjxBCitOQU1FPSJBRU4yODgiCis+PC9BCis+U0RMX2tleXN5bTwvSDMKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHNjYW5jb2RlOworICBTRExLZXkgc3ltOworICBTRExNb2QgbW9kOworICBVaW50MTYgdW5pY29kZTsKK30gU0RMX2tleXN5bTs8L1BSRQorPjxQCis+VGhlIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfa2V5c3ltPC9TUEFOCis+IHN0cnVjdHVyZSBkZXNjcmliZXMgYSBrZXkgcHJlc3Mgb3IgYSBrZXkgcmVsZWFzZS4gVGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c2NhbmNvZGU8L0kKKz48L1RUCis+IGZpZWxkIGlzIGhhcmR3YXJlIHNwZWNpZmljIGFuZCBzaG91bGQgYmUgaWdub3JlZCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3VyIGRvaW5nLiBUaGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zeW08L0kKKz48L1RUCis+IGZpZWxkIGlzIHRoZSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMS2V5PC9TUEFOCis+IHZhbHVlIG9mIHRoZSBrZXkgYmVpbmcgcHJlc3NlZCBvciByZWxlYXNlZC4gVGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bW9kPC9JCis+PC9UVAorPiBmaWVsZCBkZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBrZXlib2FyZCBtb2RpZmllcnMgYXQgdGhlIHRpbWUgdGhlIGtleSBwcmVzcyBvciByZWxlYXNlIG9jY3VycmVkLiBTbyBhIHZhbHVlIG9mIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+S01PRF9OVU0gfCBLTU9EX0NBUFMgfCBLTU9EX0xTSElGVDwvVFQKKz4gd291bGQgbWVhbiB0aGF0IE51bWxvY2ssIENhcHNsb2NrIGFuZCB0aGUgbGVmdCBzaGlmdCBrZXkgd2VyZSBhbGwgcHJlc3MgKG9yIGVuYWJsZWQgaW4gdGhlIGNhc2Ugb2YgdGhlIGxvY2sga2V5cykuIEZpbmFsbHksIHRoZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnVuaWNvZGU8L0kKKz48L1RUCis+IGZpZWxkIHN0b3JlcyB0aGUgMTYtYml0IHVuaWNvZGUgdmFsdWUgb2YgdGhlIGtleS48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPkl0IHNob3VsZCBiZSBub3RlZCBhbmQgdW5kZXJzdG9vZCB0aGF0IHRoaXMgZmllbGQgaXMgb25seSB2YWxpZCB3aGVuIHRoZSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX2tleXN5bTwvU1BBTgorPiBpcyBkZXNjcmliaW5nIGEga2V5IHByZXNzLCBub3QgYSBrZXkgcmVsZWFzZS4gVW5pY29kZSB2YWx1ZXMgb25seSBtYWtlIHNlbnNlIG9uIGEga2V5IHByZXNzIGJlY2F1c2UgdGhlIHVuaWNvZGUgdmFsdWUgZGVzY3JpYmVzIGFuIGludGVybmF0aW9uYWwgY2hhcmFjdGVyIGFuZCBvbmx5IGtleSBwcmVzc2VzIHByb2R1Y2UgY2hhcmFjdGVycy4gTW9yZSBpbmZvcm1hdGlvbiBvbiBVbmljb2RlIGNhbiBiZSBmb3VuZCBhdCA8QQorSFJFRj0iaHR0cDovL3d3dy51bmljb2RlLm9yZyIKK1RBUkdFVD0iX3RvcCIKKz53d3cudW5pY29kZS5vcmc8L0EKKz48L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+VW5pY29kZSB0cmFuc2xhdGlvbiBtdXN0IGJlIGVuYWJsZWQgdXNpbmcgdGhlIDxBCitIUkVGPSJzZGxlbmFibGV1bmljb2RlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0VuYWJsZVVOSUNPREU8L1RUCis+PC9BCis+IGZ1bmN0aW9uLjwvUAorPjwvQkxPQ0tRVU9URQorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDMiCis+PEgzCitDTEFTUz0iU0VDVDMiCis+PEEKK05BTUU9IkFFTjMwNyIKKz48L0EKKz5TRExfS2V5Ym9hcmRFdmVudDwvSDMKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGU7CisgIFVpbnQ4IHN0YXRlOworICBTRExfa2V5c3ltIGtleXN5bTsKK30gU0RMX0tleWJvYXJkRXZlbnQ7PC9QUkUKKz48UAorPlRoZSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0tleWJvYXJkRXZlbnQ8L1NQQU4KKz4gZGVzY3JpYmVzIGEga2V5Ym9hcmQgZXZlbnQgKG9idmlvdXNseSkuIFRoZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmtleTwvSQorPjwvVFQKKz4gbWVtYmVyIG9mIHRoZSA8QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+IHVuaW9uIGlzIGEgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9LZXlib2FyZEV2ZW50PC9TUEFOCis+IHN0cnVjdHVyZS4gVGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz4gZmllbGQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEga2V5IHJlbGVhc2UgKDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0tFWVVQPC9UVAorPikgb3IgYSBrZXkgcHJlc3MgKDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0tFWURPV048L1RUCis+KSBldmVudC4gVGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c3RhdGU8L0kKKz48L1RUCis+IGlzIGxhcmdlbHkgcmVkdW5kYW50LCBpdCByZXBvcnRzIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+IGZpZWxkIGJ1dCB1c2VzIGRpZmZlcmVudCB2YWx1ZXMgKDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1JFTEVBU0VEPC9UVAorPiBhbmQgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUFJFU1NFRDwvVFQKKz4pLiBUaGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5rZXlzeW08L0kKKz48L1RUCis+IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9mIHRoZSBrZXkgcHJlc3Mgb3IgcmVsZWFzZSB0aGF0IHRoaXMgZXZlbnQgcmVwcmVzZW50cyAoc2VlIGFib3ZlKS48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QyIgorPjxIMgorQ0xBU1M9IlNFQ1QyIgorPjxBCitOQU1FPSJBRU4zMjQiCis+PC9BCis+UmVhZGluZyBLZXlib2FyZCBFdmVudHM8L0gyCis+PFAKKz5SZWFkaW5nIGtleWJhb3JkIGV2ZW50cyBmcm9tIHRoZSBldmVudCBxdWV1ZSBpcyBxdWl0ZSBzaW1wbGUgKHRoZSBldmVudCBxdWV1ZSBhbmQgdXNpbmcgaXQgaXMgZGVzY3JpYmVkIDxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPmhlcmU8L0EKKz4pLiBXZSByZWFkIGV2ZW50cyB1c2luZyA8QQorSFJFRj0ic2RscG9sbGV2ZW50Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1BvbGxFdmVudDwvVFQKKz48L0EKKz4gaW4gYSA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPndoaWxlKCk8L1RUCis+IGxvb3AgYW5kIGNoZWNrIGZvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9LRVlVUDwvVFQKKz4gYW5kIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0tFWURPV048L1RUCis+IGV2ZW50cyB1c2luZyBhIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+c3dpdGNoPC9UVAorPiBzdGF0ZW1lbnQsIGxpa2Ugc286PC9QCis+PERJVgorQ0xBU1M9IkVYQU1QTEUiCis+PEEKK05BTUU9IkFFTjMzNCIKKz48L0EKKz48UAorPjxCCis+RXhhbXBsZSAzLTEwLiBSZWFkaW5nIEtleWJvYXJkIEV2ZW50czwvQgorPjwvUAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gIFNETF9FdmVudCBldmVudDsKKyAgLgorICAuCisgIC8qIFBvbGwgZm9yIGV2ZW50cy4gU0RMX1BvbGxFdmVudCgpIHJldHVybnMgMCB3aGVuIHRoZXJlIGFyZSBubyAgKi8KKyAgLyogbW9yZSBldmVudHMgb24gdGhlIGV2ZW50IHF1ZXVlLCBvdXIgd2hpbGUgbG9vcCB3aWxsIGV4aXQgd2hlbiAqLworICAvKiB0aGF0IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHdoaWxlKCBTRExfUG9sbEV2ZW50KCAmIzM4O2V2ZW50ICkgKXsKKyAgICAvKiBXZSBhcmUgb25seSB3b3JyaWVkIGFib3V0IFNETF9LRVlET1dOIGFuZCBTRExfS0VZVVAgZXZlbnRzICovCisgICAgc3dpdGNoKCBldmVudC50eXBlICl7CisgICAgICBjYXNlIFNETF9LRVlET1dOOgorICAgICAgICBwcmludGYoICJLZXkgcHJlc3MgZGV0ZWN0ZWRcbiIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU0RMX0tFWVVQOgorICAgICAgICBwcmludGYoICJLZXkgcmVsZWFzZSBkZXRlY3RlZFxuIiApOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC4KKyAgLjwvUFJFCis+PC9ESVYKKz48UAorPlRoaXMgaXMgYSB2ZXJ5IGJhc2ljIGV4YW1wbGUuIE5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXkgcHJlc3Mgb3IgcmVsZWFzZSBpcyBpbnRlcnByZXRlZC4gV2Ugd2lsbCBleHBsb3JlIHRoZSBvdGhlciBleHRyZW1lIG91dCBvdXIgZmlyc3QgZnVsbCBleGFtcGxlIGJlbG93IC0gcmVwb3J0aW5nIGFsbCBhdmFpbGFibGUgaW5mb3JtYXRpb24gYWJvdXQgYSBrZXlib2FyZCBldmVudC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJTRUNUMiIKKz48SDIKK0NMQVNTPSJTRUNUMiIKKz48QQorTkFNRT0iQUVOMzM4IgorPjwvQQorPkEgTW9yZSBEZXRhaWxlZCBMb29rPC9IMgorPjxQCis+QmVmb3JlIHdlIGNhbiByZWFkIGV2ZW50cyBTREwgbXVzdCBiZSBpbml0aWFsaXNlZCB3aXRoIDxBCitIUkVGPSJzZGxpbml0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXQ8L1RUCis+PC9BCis+IGFuZCBhIHZpZGVvIG1vZGUgbXVzdCBiZSBzZXQgdXNpbmcgPEEKK0hSRUY9InNkbHNldHZpZGVvbW9kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+PC9BCis+LiBUaGVyZSBhcmUsIGhvd2V2ZXIsIHR3byBvdGhlciBmdW5jdGlvbnMgd2UgbXVzdCB1c2UgdG8gb2J0YWluIGFsbCB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQuIFdlIG11c3QgZW5hYmxlIHVuaWNvZGUgdHJhbnNsYXRpb24gYnkgY2FsbGluZyA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRW5hYmxlVU5JQ09ERSgxKTwvVFQKKz4gYW5kIHdlIG11c3QgY29udmVydCA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMS2V5PC9TUEFOCis+IHZhbHVlcyBpbnRvIHNvbWV0aGluZyBwcmludGFibGUsIHVzaW5nIDxBCitIUkVGPSJzZGxnZXRrZXluYW1lLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dldEtleU5hbWU8L1RUCis+PC9BCis+PC9QCis+PERJVgorQ0xBU1M9Ik5PVEUiCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJOT1RFIgorPjxQCis+PEIKKz5Ob3RlOiA8L0IKKz5JdCBpcyB1c2VmdWwgdG8gbm90ZSB0aGF0IHVuaWNvZGUgdmFsdWVzICYjNjA7IDB4ODAgdHJhbnNsYXRlIGRpcmVjdGx5IGEgY2hhcmFjdGVycyBBU0NJSSB2YWx1ZS4gVEhpcyBpcyB1c2VkIGluIHRoZSBleGFtcGxlIGJlbG93PC9QCis+PC9CTE9DS1FVT1RFCis+PC9ESVYKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVOMzUxIgorPjwvQQorPjxQCis+PEIKKz5FeGFtcGxlIDMtMTEuIEludGVycHJldGluZyBLZXkgRXZlbnQgSW5mb3JtYXRpb248L0IKKz48L1AKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+JiMxMzsgICAgI2luY2x1ZGUgIlNETC5oIgorCisgICAgLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworICAgIHZvaWQgUHJpbnRLZXlJbmZvKCBTRExfS2V5Ym9hcmRFdmVudCAqa2V5ICk7CisgICAgdm9pZCBQcmludE1vZGlmaWVycyggU0RMTW9kIG1vZCApOworCisgICAgLyogbWFpbiAqLworICAgIGludCBtYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICl7CisgICAgICAgIAorICAgICAgICBTRExfRXZlbnQgZXZlbnQ7CisgICAgICAgIGludCBxdWl0ID0gMDsKKyAgICAgICAgCisgICAgICAgIC8qIEluaXRpYWxpc2UgU0RMICovCisgICAgICAgIGlmKCBTRExfSW5pdCggU0RMX0lOSVRfVklERU8gKSAmIzYwOyAwKXsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNvdWxkIG5vdCBpbml0aWFsaXNlIFNETDogJXNcbiIsIFNETF9HZXRFcnJvcigpICk7CisgICAgICAgICAgICBleGl0KCAtMSApOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IGEgdmlkZW8gbW9kZSAqLworICAgICAgICBpZiggIVNETF9TZXRWaWRlb01vZGUoIDMyMCwgMjAwLCAwLCAwICkgKXsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNvdWxkIG5vdCBzZXQgdmlkZW8gbW9kZTogJXNcbiIsIFNETF9HZXRFcnJvcigpICk7CisgICAgICAgICAgICBTRExfUXVpdCgpOworICAgICAgICAgICAgZXhpdCggLTEgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVuYWJsZSBVbmljb2RlIHRyYW5zbGF0aW9uICovCisgICAgICAgIFNETF9FbmFibGVVTklDT0RFKCAxICk7CisKKyAgICAgICAgLyogTG9vcCB1bnRpbCBhbiBTRExfUVVJVCBldmVudCBpcyBmb3VuZCAqLworICAgICAgICB3aGlsZSggIXF1aXQgKXsKKworICAgICAgICAgICAgLyogUG9sbCBmb3IgZXZlbnRzICovCisgICAgICAgICAgICB3aGlsZSggU0RMX1BvbGxFdmVudCggJiMzODtldmVudCApICl7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3dpdGNoKCBldmVudC50eXBlICl7CisgICAgICAgICAgICAgICAgICAgIC8qIEtleWJvYXJkIGV2ZW50ICovCisgICAgICAgICAgICAgICAgICAgIC8qIFBhc3MgdGhlIGV2ZW50IGRhdGEgb250byBQcmludEtleUluZm8oKSAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIFNETF9LRVlET1dOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNETF9LRVlVUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50S2V5SW5mbyggJiMzODtldmVudC5rZXkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8qIFNETF9RVUlUIGV2ZW50ICh3aW5kb3cgY2xvc2UpICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0RMX1FVSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBxdWl0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLyogQ2xlYW4gdXAgKi8KKyAgICAgICAgU0RMX1F1aXQoKTsKKyAgICAgICAgZXhpdCggMCApOworICAgIH0KKworICAgIC8qIFByaW50IGFsbCBpbmZvcm1hdGlvbiBhYm91dCBhIGtleSBldmVudCAqLworICAgIHZvaWQgUHJpbnRLZXlJbmZvKCBTRExfS2V5Ym9hcmRFdmVudCAqa2V5ICl7CisgICAgICAgIC8qIElzIGl0IGEgcmVsZWFzZSBvciBhIHByZXNzPyAqLworICAgICAgICBpZigga2V5LSYjNjI7dHlwZSA9PSBTRExfS0VZVVAgKQorICAgICAgICAgICAgcHJpbnRmKCAiUmVsZWFzZTotICIgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCAiUHJlc3M6LSAiICk7CisKKyAgICAgICAgLyogUHJpbnQgdGhlIGhhcmR3YXJlIHNjYW5jb2RlIGZpcnN0ICovCisgICAgICAgIHByaW50ZiggIlNjYW5jb2RlOiAweCUwMlgiLCBrZXktJiM2MjtrZXlzeW0uc2NhbmNvZGUgKTsKKyAgICAgICAgLyogUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGtleSAqLworICAgICAgICBwcmludGYoICIsIE5hbWU6ICVzIiwgU0RMX0dldEtleU5hbWUoIGtleS0mIzYyO2tleXN5bS5zeW0gKSApOworICAgICAgICAvKiBXZSB3YW50IHRvIHByaW50IHRoZSB1bmljb2RlIGluZm8sIGJ1dCB3ZSBuZWVkIHRvIG1ha2UgKi8KKyAgICAgICAgLyogc3VyZSBpdHMgYSBwcmVzcyBldmVudCBmaXJzdCAocmVtZW1iZXIsIHJlbGVhc2UgZXZlbnRzICovCisgICAgICAgIC8qIGRvbid0IGhhdmUgdW5pY29kZSBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZigga2V5LSYjNjI7dHlwZSA9PSBTRExfS0VZRE9XTiApeworICAgICAgICAgICAgLyogSWYgdGhlIFVuaWNvZGUgdmFsdWUgaXMgbGVzcyB0aGFuIDB4ODAgdGhlbiB0aGUgICAgKi8KKyAgICAgICAgICAgIC8qIHVuaWNvZGUgdmFsdWUgY2FuIGJlIHVzZWQgdG8gZ2V0IGEgcHJpbnRhYmxlICAgICAgICovCisgICAgICAgICAgICAvKiByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5LCB1c2luZyAoY2hhcil1bmljb2RlLiAgICAqLworICAgICAgICAgICAgcHJpbnRmKCIsIFVuaWNvZGU6ICIgKTsKKyAgICAgICAgICAgIGlmKCBrZXktJiM2MjtrZXlzeW0udW5pY29kZSAmIzYwOyAweDgwICYjMzg7JiMzODsga2V5LSYjNjI7a2V5c3ltLnVuaWNvZGUgJiM2MjsgMCApeworICAgICAgICAgICAgICAgIHByaW50ZiggIiVjICgweCUwNFgpIiwgKGNoYXIpa2V5LSYjNjI7a2V5c3ltLnVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBrZXktJiM2MjtrZXlzeW0udW5pY29kZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBwcmludGYoICI/ICgweCUwNFgpIiwga2V5LSYjNjI7a2V5c3ltLnVuaWNvZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGYoICJcbiIgKTsKKyAgICAgICAgLyogUHJpbnQgbW9kaWZpZXIgaW5mbyAqLworICAgICAgICBQcmludE1vZGlmaWVycygga2V5LSYjNjI7a2V5c3ltLm1vZCApOworICAgIH0KKworICAgIC8qIFByaW50IG1vZGlmaWVyIGluZm8gKi8KKyAgICB2b2lkIFByaW50TW9kaWZpZXJzKCBTRExNb2QgbW9kICl7CisgICAgICAgIHByaW50ZiggIk1vZGlmZXJzOiAiICk7CisKKyAgICAgICAgLyogSWYgdGhlcmUgYXJlIG5vbmUgdGhlbiBzYXkgc28gYW5kIHJldHVybiAqLworICAgICAgICBpZiggbW9kID09IEtNT0RfTk9ORSApeworICAgICAgICAgICAgcHJpbnRmKCAiTm9uZVxuIiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBlYWNoIFNETE1vZCB2YWx1ZSAqLworICAgICAgICAvKiBUaGlzIGxvb2tzIG1lc3N5LCBidXQgdGhlcmUgcmVhbGx5IGlzbid0ICAgICovCisgICAgICAgIC8qIGEgY2xlYXJlciB3YXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYoIG1vZCAmIzM4OyBLTU9EX05VTSApIHByaW50ZiggIk5VTUxPQ0sgIiApOworICAgICAgICBpZiggbW9kICYjMzg7IEtNT0RfQ0FQUyApIHByaW50ZiggIkNBUFNMT0NLICIgKTsKKyAgICAgICAgaWYoIG1vZCAmIzM4OyBLTU9EX0xDVFJMICkgcHJpbnRmKCAiTENUUkwgIiApOworICAgICAgICBpZiggbW9kICYjMzg7IEtNT0RfUkNUUkwgKSBwcmludGYoICJSQ1RSTCAiICk7CisgICAgICAgIGlmKCBtb2QgJiMzODsgS01PRF9SU0hJRlQgKSBwcmludGYoICJSU0hJRlQgIiApOworICAgICAgICBpZiggbW9kICYjMzg7IEtNT0RfTFNISUZUICkgcHJpbnRmKCAiTFNISUZUICIgKTsKKyAgICAgICAgaWYoIG1vZCAmIzM4OyBLTU9EX1JBTFQgKSBwcmludGYoICJSQUxUICIgKTsKKyAgICAgICAgaWYoIG1vZCAmIzM4OyBLTU9EX0xBTFQgKSBwcmludGYoICJMQUxUICIgKTsKKyAgICAgICAgaWYoIG1vZCAmIzM4OyBLTU9EX0NUUkwgKSBwcmludGYoICJDVFJMICIgKTsKKyAgICAgICAgaWYoIG1vZCAmIzM4OyBLTU9EX1NISUZUICkgcHJpbnRmKCAiU0hJRlQgIiApOworICAgICAgICBpZiggbW9kICYjMzg7IEtNT0RfQUxUICkgcHJpbnRmKCAiQUxUICIgKTsKKyAgICAgICAgcHJpbnRmKCAiXG4iICk7CisgICAgfTwvUFJFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJTRUNUMiIKKz48SDIKK0NMQVNTPSJTRUNUMiIKKz48QQorTkFNRT0iQUVOMzU0IgorPjwvQQorPkdhbWUtdHlwZSBJbnB1dDwvSDIKKz48UAorPkkgaGF2ZSBmb3VuZCB0aGF0IHBlb3BsZSB1c2luZyBrZXlib2FyZCBldmVudHMgZm9yIGdhbWVzIGFuZCBvdGhlciBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMgZG9uJ3QgYWx3YXlzIHVuZGVyc3RhbmQgb25lIGZ1bmRlbWVudGFsIHBvaW50LjwvUAorPjxBCitOQU1FPSJBRU4zNTciCis+PC9BCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJCTE9DS1FVT1RFIgorPjxQCis+S2V5Ym9hcmQgZXZlbnRzIDxTUEFOCitDTEFTUz0iZW1waGFzaXMiCis+PEkKK0NMQVNTPSJFTVBIQVNJUyIKKz5vbmx5PC9JCis+PC9TUEFOCis+IHRha2UgcGxhY2Ugd2hlbiBhIGtleXMgc3RhdGUgY2hhbmdlcyBmcm9tIGJlaW5nIHVucHJlc3NlZCB0byBwcmVzc2VkLCBhbmQgdmljZSB2ZXJzYS48L1AKKz48L0JMT0NLUVVPVEUKKz48UAorPkltYWdpbmUgeW91IGhhdmUgYW4gaW1hZ2Ugb2YgYW4gYWxpZW4gdGhhdCB5b3Ugd2lzaCB0byBtb3ZlIGFyb3VuZCB1c2luZyB0aGUgY3Vyc29yIGtleXM6IHdoZW4geW91IHByZXNzZWQgdGhlIGxlZnQgYXJyb3cga2V5IHlvdSB3YW50IGhpbSB0byBzbGlkZSBvdmVyIHRvIHRoZSBsZWZ0LCBhbmQgd2hlbiB5b3UgcHJlc3MgdGhlIGRvd24ga2V5IHlvdSB3YW50IGhpbSB0byBzbGlkZSBkb3duIHRoZSBzY3JlZW4uIEV4YW1pbmUgdGhlIGZvbGxvd2luZyBjb2RlOyBpdCBoaWdobGlnaHRzIGFuIGVycm9yIHRoYXQgbWFueSBwZW9wbGUgaGF2ZSBtYWRlLgorPFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPiAgICAvKiBBbGllbiBzY3JlZW4gY29vcmRpbmF0ZXMgKi8KKyAgICBpbnQgYWxpZW5feD0wLCBhbGllbl95PTA7CisgICAgLgorICAgIC4KKyAgICAvKiBJbml0aWFsaXNlIFNETCBhbmQgdmlkZW8gbW9kZXMgYW5kIGFsbCB0aGF0ICovCisgICAgLgorICAgIC8qIE1haW4gZ2FtZSBsb29wICovCisgICAgLyogQ2hlY2sgZm9yIGV2ZW50cyAqLworICAgIHdoaWxlKCBTRExfUG9sbEV2ZW50KCAmIzM4O2V2ZW50ICkgKXsKKyAgICAgICAgc3dpdGNoKCBldmVudC50eXBlICl7CisgICAgICAgICAgICAvKiBMb29rIGZvciBhIGtleXByZXNzICovCisgICAgICAgICAgICBjYXNlIFNETF9LRVlET1dOOgorICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoZSBTRExLZXkgdmFsdWVzIGFuZCBtb3ZlIGNoYW5nZSB0aGUgY29vcmRzICovCisgICAgICAgICAgICAgICAgc3dpdGNoKCBldmVudC5rZXkua2V5c3ltLnN5bSApeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNETEtfTEVGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWVuX3ggLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNETEtfUklHSFQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGllbl94ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTRExLX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZW5feSAtPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0RMS19ET1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZW5feSArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLgorICAgIC48L1BSRQorPgorQXQgZmlyc3QgZ2xhbmNlIHlvdSBtYXkgdGhpbmsgdGhpcyBpcyBhIHBlcmZlY3RseSByZWFzb25hYmxlIHBpZWNlIG9mIGNvZGUgZm9yIHRoZSB0YXNrLCBidXQgaXQgaXNuJ3QuIExpa2UgSSBzYWlkIGtleWJvYXJkIGV2ZW50cyBvbmx5IG9jY3VyIHdoZW4gYSBrZXkgY2hhbmdlcyBzdGF0ZSwgc28gdGhlIHVzZXIgd291bGQgaGF2ZSB0byBwcmVzcyBhbmQgcmVsZWFzZSB0aGUgbGVmdCBjdXJzb3Iga2V5IDEwMCB0aW1lcyB0byBtb3ZlIHRoZSBhbGllbiAxMDAgcGl4ZWxzIHRvIHRoZSBsZWZ0LjwvUAorPjxQCis+VG8gZ2V0IGFyb3VuZCB0aGlzIHByb2JsZW0gd2UgbXVzdCBub3QgdXNlIHRoZSBldmVudHMgdG8gY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWxpZW4sIHdlIHVzZSB0aGUgZXZlbnRzIHRvIHNldCBmbGFncyB3aGljaCBhcmUgdGhlbiB1c2VkIGluIGEgc2VwZXJhdGUgc2VjdGlvbiBvZiBjb2RlIHRvIG1vdmUgdGhlIGFsaWVuLiBTb21ldGhpbmcgbGlrZSB0aGlzOjwvUAorPjxESVYKK0NMQVNTPSJFWEFNUExFIgorPjxBCitOQU1FPSJBRU4zNjMiCis+PC9BCis+PFAKKz48QgorPkV4YW1wbGUgMy0xMi4gUHJvcGVyIEdhbWUgTW92ZW1lbnQ8L0IKKz48L1AKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgIC8qIEFsaWVuIHNjcmVlbiBjb29yZGluYXRlcyAqLworICAgIGludCBhbGllbl94PTAsIGFsaWVuX3k9MDsKKyAgICBpbnQgYWxpZW5feHZlbD0wLCBhbGllbl95dmVsPTA7CisgICAgLgorICAgIC4KKyAgICAvKiBJbml0aWFsaXNlIFNETCBhbmQgdmlkZW8gbW9kZXMgYW5kIGFsbCB0aGF0ICovCisgICAgLgorICAgIC8qIE1haW4gZ2FtZSBsb29wICovCisgICAgLyogQ2hlY2sgZm9yIGV2ZW50cyAqLworICAgIHdoaWxlKCBTRExfUG9sbEV2ZW50KCAmIzM4O2V2ZW50ICkgKXsKKyAgICAgICAgc3dpdGNoKCBldmVudC50eXBlICl7CisgICAgICAgICAgICAvKiBMb29rIGZvciBhIGtleXByZXNzICovCisgICAgICAgICAgICBjYXNlIFNETF9LRVlET1dOOgorICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoZSBTRExLZXkgdmFsdWVzIGFuZCBtb3ZlIGNoYW5nZSB0aGUgY29vcmRzICovCisgICAgICAgICAgICAgICAgc3dpdGNoKCBldmVudC5rZXkua2V5c3ltLnN5bSApeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNETEtfTEVGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWVuX3h2ZWwgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNETEtfUklHSFQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGllbl94dmVsID0gIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTRExLX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZW5feXZlbCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0RMS19ET1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZW5feXZlbCA9ICAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBXZSBtdXN0IGFsc28gdXNlIHRoZSBTRExfS0VZVVAgZXZlbnRzIHRvIHplcm8gdGhlIHggKi8KKyAgICAgICAgICAgIC8qIGFuZCB5IHZlbG9jaXR5IHZhcmlhYmxlcy4gQnV0IHdlIG11c3QgYWxzbyBiZSAgICAgICAqLworICAgICAgICAgICAgLyogY2FyZWZ1bCBub3QgdG8gemVybyB0aGUgdmVsb2NpdGllcyB3aGVuIHdlIHNob3VsZG4ndCovCisgICAgICAgICAgICBjYXNlIFNETF9LRVlVUDoKKyAgICAgICAgICAgICAgICBzd2l0Y2goIGV2ZW50LmtleS5rZXlzeW0uc3ltICl7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0RMS19MRUZUOgorICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBhbGllbiBpcyBtb3ZpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIHRoZSBsZWZ0LiBJZiBpdCBpcyB0aGVuIHdlIHplcm8gdGhlICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZWxvY2l0eS4gSWYgdGhlIGFsaWVuIGlzIG1vdmluZyB0byB0aGUgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHQgdGhlbiB0aGUgcmlnaHQga2V5IGlzIHN0aWxsIHByZXNzICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvIHdlIGRvbid0IHRvY3VoIHRoZSB2ZWxvY2l0eSAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggYWxpZW5feHZlbCAmIzYwOyAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGllbl94dmVsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNETEtfUklHSFQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggYWxpZW5feHZlbCAmIzYyOyAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGllbl94dmVsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNETEtfVVA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggYWxpZW5feXZlbCAmIzYwOyAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGllbl95dmVsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNETEtfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbGllbl95dmVsICYjNjI7IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWVuX3l2ZWwgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgLgorICAgIC4KKyAgICAvKiBVcGRhdGUgdGhlIGFsaWVuIHBvc2l0aW9uICovCisgICAgYWxpZW5feCArPSBhbGllbl94dmVsOworICAgIGFsaWVuX3kgKz0gYWxpZW5feXZlbDs8L1BSRQorPjwvRElWCis+PFAKKz5BcyBjYW4gYmUgc2Vlbiwgd2UgdXNlIHR3byBleHRyYSB2YXJpYWJsZXMsIGFsaWVuX3h2ZWwgYW5kIGFsaWVuX3l2ZWwsIHdoaWNoIHJlcHJlc2VudCB0aGUgbW90aW9uIG9mIHRoZSBzaGlwLCBpdCBpcyB0aGVzZSB2YXJpYWJsZXMgdGhhdCB3ZSB1cGRhdGUgd2hlbiB3ZSBkZXRlY3Qga2V5cHJlc3NlcyBhbmQgcmVsZWFzZXMuPC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZWV4YW1wbGVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5JbnB1dCBoYW5kbGluZzwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5FeGFtcGxlczwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZXByZWZhY2UuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGVwcmVmYWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4NmZjNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGVwcmVmYWNlLmh0bWwKQEAgLTAsMCArMSwxNzggQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5QcmVmYWNlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBHdWlkZSIKK0hSRUY9Imd1aWRlLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETCBHdWlkZSIKK0hSRUY9Imd1aWRlLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iQWJvdXQgU0RMZG9jIgorSFJFRj0iZ3VpZGVhYm91dHNkbGRvYy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlBSRUZBQ0UiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJndWlkZWFib3V0c2RsZG9jLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iUFJFRkFDRSIKKz48SDEKKz48QQorTkFNRT0iR1VJREVQUkVGQUNFIgorPjwvQQorPlByZWZhY2U8L0gxCis+PERJVgorQ0xBU1M9IlRPQyIKKz48REwKKz48RFQKKz48QgorPlRhYmxlIG9mIENvbnRlbnRzPC9CCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZXByZWZhY2UuaHRtbCNHVUlERUFCT1VUU0RMIgorPkFib3V0IFNETDwvQQorPjwvRFQKKz48RFQKKz48QQorSFJFRj0iZ3VpZGVhYm91dHNkbGRvYy5odG1sIgorPkFib3V0IFNETGRvYzwvQQorPjwvRFQKKz48RFQKKz48QQorSFJFRj0iZ3VpZGVjcmVkaXRzLmh0bWwiCis+Q3JlZGl0czwvQQorPjwvRFQKKz48L0RMCis+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDEiCis+PEgxCitDTEFTUz0iU0VDVDEiCis+PEEKK05BTUU9IkdVSURFQUJPVVRTREwiCis+PC9BCis+QWJvdXQgU0RMPC9IMQorPjxQCis+VGhlIFNETCBsaWJyYXJ5IGlzIGRlc2lnbmVkIHRvIG1ha2UgaXQgZWFzeSB0byB3cml0ZSBnYW1lcyB0aGF0IHJ1biBvbiBMaW51eCwgKkJTRCwgTWFjT1MsIFdpbjMyIGFuZCBCZU9TIHVzaW5nIHRoZSB2YXJpb3VzIG5hdGl2ZSBoaWdoLXBlcmZvcm1hbmNlIG1lZGlhIGludGVyZmFjZXMsIChmb3IgdmlkZW8sIGF1ZGlvLCBldGMpIGFuZCBwcmVzZW50aW5nIGEgc2luZ2xlIHNvdXJjZS1jb2RlIGxldmVsIEFQSSB0byB5b3VyIGFwcGxpY2F0aW9uLiBTREwgaXMgYSBmYWlybHkgbG93IGxldmVsIEFQSSwgYnV0IHVzaW5nIGl0LCBjb21wbGV0ZWx5IHBvcnRhYmxlIGFwcGxpY2F0aW9ucyBjYW4gYmUgd3JpdHRlbiB3aXRoIGEgZ3JlYXQgZGVhbCBvZiBmbGV4aWJpbGl0eS48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZWFib3V0c2RsZG9jLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TREwgR3VpZGU8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPkFib3V0IFNETGRvYzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZXRoZWJhc2ljcy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZXRoZWJhc2ljcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzIzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRldGhlYmFzaWNzLmh0bWwKQEAgLTAsMCArMSwxNzMgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5UaGUgQmFzaWNzPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBHdWlkZSIKK0hSRUY9Imd1aWRlLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IkNyZWRpdHMiCitIUkVGPSJndWlkZWNyZWRpdHMuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJJbml0aWFsaXppbmcgU0RMIgorSFJFRj0iZ3VpZGViYXNpY3Npbml0Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iQ0hBUFRFUiIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGVjcmVkaXRzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJndWlkZWJhc2ljc2luaXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxESVYKK0NMQVNTPSJDSEFQVEVSIgorPjxIMQorPjxBCitOQU1FPSJHVUlERVRIRUJBU0lDUyIKKz48L0EKKz5DaGFwdGVyIDEuIFRoZSBCYXNpY3M8L0gxCis+PERJVgorQ0xBU1M9IlRPQyIKKz48REwKKz48RFQKKz48QgorPlRhYmxlIG9mIENvbnRlbnRzPC9CCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZXRoZWJhc2ljcy5odG1sI0dVSURFSU5UUk9EVUNUSU9OIgorPkludHJvZHVjdGlvbjwvQQorPjwvRFQKKz48RFQKKz48QQorSFJFRj0iZ3VpZGViYXNpY3Npbml0Lmh0bWwiCis+SW5pdGlhbGl6aW5nIFNETDwvQQorPjwvRFQKKz48L0RMCis+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDEiCis+PEgxCitDTEFTUz0iU0VDVDEiCis+PEEKK05BTUU9IkdVSURFSU5UUk9EVUNUSU9OIgorPjwvQQorPkludHJvZHVjdGlvbjwvSDEKKz48UAorPlRoZSBTREwgR3VpZGUgc2VjdGlvbiBpcyBwcmV0dHkgaW5jb21wbGV0ZS4gSWYgeW91IGZlZWwgeW91IGhhdmUgYW55dGhpbmcgdG8gYWRkIG1haWwgYWthd2FrYUBza3luZXQuaWUgb3IgdmlzaXQgaHR0cDovL2FrYXdha2EuY3NuLnVsLmllL3RuZS8uPC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlY3JlZGl0cy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlYmFzaWNzaW5pdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+Q3JlZGl0czwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+SW5pdGlhbGl6aW5nIFNETDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZXRpbWVleGFtcGxlcy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZXRpbWVleGFtcGxlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjUwMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRldGltZWV4YW1wbGVzLmh0bWwKQEAgLTAsMCArMSwxODMgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5UaW1lIEV4YW1wbGVzPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkV4YW1wbGVzIgorSFJFRj0iZ3VpZGVleGFtcGxlcy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJDRFJPTSBFeGFtcGxlcyIKK0hSRUY9Imd1aWRlY2Ryb21leGFtcGxlcy5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETCBSZWZlcmVuY2UiCitIUkVGPSJyZWZlcmVuY2UuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJTRUNUMSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGVjZHJvbWV4YW1wbGVzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+Q2hhcHRlciA0LiBFeGFtcGxlczwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0icmVmZXJlbmNlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDEiCis+PEgxCitDTEFTUz0iU0VDVDEiCis+PEEKK05BTUU9IkdVSURFVElNRUVYQU1QTEVTIgorPjwvQQorPlRpbWUgRXhhbXBsZXM8L0gxCis+PFAKKz48L1AKKz48RElWCitDTEFTUz0iU0VDVDIiCis+PEgyCitDTEFTUz0iU0VDVDIiCis+PEEKK05BTUU9IkFFTjQxMiIKKz48L0EKKz5UaW1lIGJhc2VkIGdhbWUgbG9vcDwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4jZGVmaW5lIFRJQ0tfSU5URVJWQUwgICAgMzAKKworc3RhdGljIFVpbnQzMiBuZXh0X3RpbWU7CisKK1VpbnQzMiB0aW1lX2xlZnQodm9pZCkKK3sKKyAgICBVaW50MzIgbm93OworCisgICAgbm93ID0gU0RMX0dldFRpY2tzKCk7CisgICAgaWYobmV4dF90aW1lICYjNjA7PSBub3cpCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG5leHRfdGltZSAtIG5vdzsKK30KKworCisvKiBtYWluIGdhbWUgbG9vcCAqLworCisgICAgbmV4dF90aW1lID0gU0RMX0dldFRpY2tzKCkgKyBUSUNLX0lOVEVSVkFMOworICAgIHdoaWxlICggZ2FtZV9ydW5uaW5nICkgeworICAgICAgICB1cGRhdGVfZ2FtZV9zdGF0ZSgpOworICAgICAgICBTRExfRGVsYXkodGltZV9sZWZ0KCkpOworICAgICAgICBuZXh0X3RpbWUgKz0gVElDS19JTlRFUlZBTDsKKyAgICB9JiMxMzs8L1BSRQorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZWNkcm9tZXhhbXBsZXMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJyZWZlcmVuY2UuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPkNEUk9NIEV4YW1wbGVzPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGVleGFtcGxlcy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETCBSZWZlcmVuY2U8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGV2aWRlby5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9ndWlkZXZpZGVvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkYTc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGV2aWRlby5odG1sCkBAIC0wLDAgKzEsNDYzIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+R3JhcGhpY3MgYW5kIFZpZGVvPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBHdWlkZSIKK0hSRUY9Imd1aWRlLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IkluaXRpYWxpemluZyBTREwiCitIUkVGPSJndWlkZWJhc2ljc2luaXQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJVc2luZyBPcGVuR0wgV2l0aCBTREwiCitIUkVGPSJndWlkZXZpZGVvb3BlbmdsLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iQ0hBUFRFUiIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGViYXNpY3Npbml0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJndWlkZXZpZGVvb3BlbmdsLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iQ0hBUFRFUiIKKz48SDEKKz48QQorTkFNRT0iR1VJREVWSURFTyIKKz48L0EKKz5DaGFwdGVyIDIuIEdyYXBoaWNzIGFuZCBWaWRlbzwvSDEKKz48RElWCitDTEFTUz0iVE9DIgorPjxETAorPjxEVAorPjxCCis+VGFibGUgb2YgQ29udGVudHM8L0IKKz48L0RUCis+PERUCis+PEEKK0hSRUY9Imd1aWRldmlkZW8uaHRtbCNHVUlERVZJREVPSU5UUk8iCis+SW50cm9kdWN0aW9uIHRvIFNETCBWaWRlbzwvQQorPjwvRFQKKz48RFQKKz48QQorSFJFRj0iZ3VpZGV2aWRlb29wZW5nbC5odG1sIgorPlVzaW5nIE9wZW5HTCBXaXRoIFNETDwvQQorPjwvRFQKKz48L0RMCis+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDEiCis+PEgxCitDTEFTUz0iU0VDVDEiCis+PEEKK05BTUU9IkdVSURFVklERU9JTlRSTyIKKz48L0EKKz5JbnRyb2R1Y3Rpb24gdG8gU0RMIFZpZGVvPC9IMQorPjxQCis+VmlkZW8gaXMgcHJvYmFibHkgdGhlIG1vc3QgY29tbW9uIHRoaW5nIHRoYXQgU0RMIGlzIHVzZWQgZm9yLCBhbmQKK3NvIGl0IGhhcyB0aGUgbW9zdCBjb21wbGV0ZSBzdWJzeXN0ZW0uIEhlcmUgYXJlIGEgZmV3CitleGFtcGxlcyB0byBkZW1vbnN0cmF0ZSB0aGUgYmFzaWNzLjwvUAorPjxESVYKK0NMQVNTPSJTRUNUMiIKKz48SDIKK0NMQVNTPSJTRUNUMiIKKz48QQorTkFNRT0iQUVONjgiCis+PC9BCis+SW5pdGlhbGl6aW5nIHRoZSBWaWRlbyBEaXNwbGF5PC9IMgorPjxQCis+VGhpcyBpcyB3aGF0IGFsbW9zdCBhbGwgU0RMIHByb2dyYW1zIGhhdmUgdG8gZG8gaW4gb25lIHdheSBvcgorYW5vdGhlci48L1AKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVONzEiCis+PC9BCis+PFAKKz48QgorPkV4YW1wbGUgMi0xLiBJbml0aWFsaXppbmcgdGhlIFZpZGVvIERpc3BsYXk8L0IKKz48L1AKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgIFNETF9TdXJmYWNlICpzY3JlZW47CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBTREwgbGlicmFyeSAqLworICAgIGlmKCBTRExfSW5pdChTRExfSU5JVF9WSURFTykgJiM2MDsgMCApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8qIENsZWFuIHVwIG9uIGV4aXQgKi8KKyAgICBhdGV4aXQoU0RMX1F1aXQpOworICAgIAorICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSB0aGUgZGlzcGxheSBpbiBhIDY0MHg0ODAgOC1iaXQgcGFsZXR0aXplZCBtb2RlLAorICAgICAqIHJlcXVlc3RpbmcgYSBzb2Z0d2FyZSBzdXJmYWNlCisgICAgICovCisgICAgc2NyZWVuID0gU0RMX1NldFZpZGVvTW9kZSg2NDAsIDQ4MCwgOCwgU0RMX1NXU1VSRkFDRSk7CisgICAgaWYgKCBzY3JlZW4gPT0gTlVMTCApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBzZXQgNjQweDQ4MHg4IHZpZGVvIG1vZGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0dldEVycm9yKCkpOworICAgICAgICBleGl0KDEpOworICAgIH08L1BSRQorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDIiCis+PEgyCitDTEFTUz0iU0VDVDIiCis+PEEKK05BTUU9IkFFTjc0IgorPjwvQQorPkluaXRpYWxpemluZyB0aGUgQmVzdCBWaWRlbyBNb2RlPC9IMgorPjxQCis+SWYgeW91IGhhdmUgYSBwcmVmZXJlbmNlIGZvciBhIGNlcnRhaW4gcGl4ZWwgZGVwdGggYnV0IHdpbGwgYWNjZXB0IGFueQorb3RoZXIsIHVzZSBTRExfU2V0VmlkZW9Nb2RlIHdpdGggU0RMX0FOWUZPUk1BVCBhcyBiZWxvdy4gWW91IGNhbiBhbHNvCit1c2UgU0RMX1ZpZGVvTW9kZU9LKCkgdG8gZmluZCB0aGUgbmF0aXZlIHZpZGVvIG1vZGUgdGhhdCBpcyBjbG9zZXN0IHRvCit0aGUgbW9kZSB5b3UgcmVxdWVzdC48L1AKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVONzciCis+PC9BCis+PFAKKz48QgorPkV4YW1wbGUgMi0yLiBJbml0aWFsaXppbmcgdGhlIEJlc3QgVmlkZW8gTW9kZTwvQgorPjwvUAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgLyogSGF2ZSBhIHByZWZlcmVuY2UgZm9yIDgtYml0LCBidXQgYWNjZXB0IGFueSBkZXB0aCAqLworICAgIHNjcmVlbiA9IFNETF9TZXRWaWRlb01vZGUoNjQwLCA0ODAsIDgsIFNETF9TV1NVUkZBQ0V8U0RMX0FOWUZPUk1BVCk7CisgICAgaWYgKCBzY3JlZW4gPT0gTlVMTCApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBzZXQgNjQweDQ4MHg4IHZpZGVvIG1vZGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0dldEVycm9yKCkpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBwcmludGYoIlNldCA2NDB4NDgwIGF0ICVkIGJpdHMtcGVyLXBpeGVsIG1vZGVcbiIsCisgICAgICAgICAgIHNjcmVlbi0mIzYyO2Zvcm1hdC0mIzYyO0JpdHNQZXJQaXhlbCk7PC9QUkUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QyIgorPjxIMgorQ0xBU1M9IlNFQ1QyIgorPjxBCitOQU1FPSJBRU44MCIKKz48L0EKKz5Mb2FkaW5nIGFuZCBEaXNwbGF5aW5nIGEgQk1QIEZpbGU8L0gyCis+PFAKKz5UaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGxvYWRzIGFuZCBkaXNwbGF5cyBhIEJNUCBmaWxlIGdpdmVuIGFzCithcmd1bWVudCwgb25jZSBTREwgaXMgaW5pdGlhbGlzZWQgYW5kIGEgdmlkZW8gbW9kZSBoYXMgYmVlbiBzZXQuPC9QCis+PERJVgorQ0xBU1M9IkVYQU1QTEUiCis+PEEKK05BTUU9IkFFTjgzIgorPjwvQQorPjxQCis+PEIKKz5FeGFtcGxlIDItMy4gTG9hZGluZyBhbmQgRGlzcGxheWluZyBhIEJNUCBGaWxlPC9CCis+PC9QCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnZvaWQgZGlzcGxheV9ibXAoY2hhciAqZmlsZV9uYW1lKQoreworICAgIFNETF9TdXJmYWNlICppbWFnZTsKKworICAgIC8qIExvYWQgdGhlIEJNUCBmaWxlIGludG8gYSBzdXJmYWNlICovCisgICAgaW1hZ2UgPSBTRExfTG9hZEJNUChmaWxlX25hbWUpOworICAgIGlmIChpbWFnZSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgbG9hZCAlczogJXNcbiIsIGZpbGVfbmFtZSwgU0RMX0dldEVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYWxldHRpemVkIHNjcmVlbiBtb2RlcyB3aWxsIGhhdmUgYSBkZWZhdWx0IHBhbGV0dGUgKGEgc3RhbmRhcmQKKyAgICAgKiA4KjgqNCBjb2xvdXIgY3ViZSksIGJ1dCBpZiB0aGUgaW1hZ2UgaXMgcGFsZXR0aXplZCBhcyB3ZWxsIHdlIGNhbgorICAgICAqIHVzZSB0aGF0IHBhbGV0dGUgZm9yIGEgbmljZXIgY29sb3VyIG1hdGNoaW5nCisgICAgICovCisgICAgaWYgKGltYWdlLSYjNjI7Zm9ybWF0LSYjNjI7cGFsZXR0ZSAmIzM4OyYjMzg7IHNjcmVlbi0mIzYyO2Zvcm1hdC0mIzYyO3BhbGV0dGUpIHsKKyAgICBTRExfU2V0Q29sb3JzKHNjcmVlbiwgaW1hZ2UtJiM2Mjtmb3JtYXQtJiM2MjtwYWxldHRlLSYjNjI7Y29sb3JzLCAwLAorICAgICAgICAgICAgICAgICAgaW1hZ2UtJiM2Mjtmb3JtYXQtJiM2MjtwYWxldHRlLSYjNjI7bmNvbG9ycyk7CisgICAgfQorCisgICAgLyogQmxpdCBvbnRvIHRoZSBzY3JlZW4gc3VyZmFjZSAqLworICAgIGlmKFNETF9CbGl0U3VyZmFjZShpbWFnZSwgTlVMTCwgc2NyZWVuLCBOVUxMKSAmIzYwOyAwKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJsaXRTdXJmYWNlIGVycm9yOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCisgICAgU0RMX1VwZGF0ZVJlY3Qoc2NyZWVuLCAwLCAwLCBpbWFnZS0mIzYyO3csIGltYWdlLSYjNjI7aCk7CisKKyAgICAvKiBGcmVlIHRoZSBhbGxvY2F0ZWQgQk1QIHN1cmZhY2UgKi8KKyAgICBTRExfRnJlZVN1cmZhY2UoaW1hZ2UpOworfTwvUFJFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJTRUNUMiIKKz48SDIKK0NMQVNTPSJTRUNUMiIKKz48QQorTkFNRT0iQUVOODYiCis+PC9BCis+RHJhd2luZyBEaXJlY3RseSB0byB0aGUgRGlzcGxheTwvSDIKKz48UAorPlRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBnZXQgYW5kIHNldCBzaW5nbGUKK3BpeGVscyBvZiBhIHN1cmZhY2UuIFRoZXkgYXJlIGNhcmVmdWxseSB3cml0dGVuIHRvIHdvcmsgd2l0aCBhbnkgZGVwdGgKK2N1cnJlbnRseSBzdXBwb3J0ZWQgYnkgU0RMLiBSZW1lbWJlciB0byBsb2NrIHRoZSBzdXJmYWNlIGJlZm9yZQorY2FsbGluZyB0aGVtLCBhbmQgdG8gdW5sb2NrIGl0IGJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBTREwKK2Z1bmN0aW9ucy48L1AKKz48UAorPlRvIGNvbnZlcnQgYmV0d2VlbiBwaXhlbCB2YWx1ZXMgYW5kIHRoZWlyIHJlZCwgZ3JlZW4sIGJsdWUKK2NvbXBvbmVudHMsIHVzZSBTRExfR2V0UkdCKCkgYW5kIFNETF9NYXBSR0IoKS48L1AKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVOOTAiCis+PC9BCis+PFAKKz48QgorPkV4YW1wbGUgMi00LiBnZXRwaXhlbCgpPC9CCis+PC9QCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPi8qCisgKiBSZXR1cm4gdGhlIHBpeGVsIHZhbHVlIGF0ICh4LCB5KQorICogTk9URTogVGhlIHN1cmZhY2UgbXVzdCBiZSBsb2NrZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyEKKyAqLworVWludDMyIGdldHBpeGVsKFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgeCwgaW50IHkpCit7CisgICAgaW50IGJwcCA9IHN1cmZhY2UtJiM2Mjtmb3JtYXQtJiM2MjtCeXRlc1BlclBpeGVsOworICAgIC8qIEhlcmUgcCBpcyB0aGUgYWRkcmVzcyB0byB0aGUgcGl4ZWwgd2Ugd2FudCB0byByZXRyaWV2ZSAqLworICAgIFVpbnQ4ICpwID0gKFVpbnQ4ICopc3VyZmFjZS0mIzYyO3BpeGVscyArIHkgKiBzdXJmYWNlLSYjNjI7cGl0Y2ggKyB4ICogYnBwOworCisgICAgc3dpdGNoKGJwcCkgeworICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuICpwOworCisgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gKihVaW50MTYgKilwOworCisgICAgY2FzZSAzOgorICAgICAgICBpZihTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKQorICAgICAgICAgICAgcmV0dXJuIHBbMF0gJiM2MDsmIzYwOyAxNiB8IHBbMV0gJiM2MDsmIzYwOyA4IHwgcFsyXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHBbMF0gfCBwWzFdICYjNjA7JiM2MDsgOCB8IHBbMl0gJiM2MDsmIzYwOyAxNjsKKworICAgIGNhc2UgNDoKKyAgICAgICAgcmV0dXJuICooVWludDMyICopcDsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOyAgICAgICAvKiBzaG91bGRuJ3QgaGFwcGVuLCBidXQgYXZvaWRzIHdhcm5pbmdzICovCisgICAgfQorfTwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVOOTMiCis+PC9BCis+PFAKKz48QgorPkV4YW1wbGUgMi01LiBwdXRwaXhlbCgpPC9CCis+PC9QCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPi8qCisgKiBTZXQgdGhlIHBpeGVsIGF0ICh4LCB5KSB0byB0aGUgZ2l2ZW4gdmFsdWUKKyAqIE5PVEU6IFRoZSBzdXJmYWNlIG11c3QgYmUgbG9ja2VkIGJlZm9yZSBjYWxsaW5nIHRoaXMhCisgKi8KK3ZvaWQgcHV0cGl4ZWwoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCB4LCBpbnQgeSwgVWludDMyIHBpeGVsKQoreworICAgIGludCBicHAgPSBzdXJmYWNlLSYjNjI7Zm9ybWF0LSYjNjI7Qnl0ZXNQZXJQaXhlbDsKKyAgICAvKiBIZXJlIHAgaXMgdGhlIGFkZHJlc3MgdG8gdGhlIHBpeGVsIHdlIHdhbnQgdG8gc2V0ICovCisgICAgVWludDggKnAgPSAoVWludDggKilzdXJmYWNlLSYjNjI7cGl4ZWxzICsgeSAqIHN1cmZhY2UtJiM2MjtwaXRjaCArIHggKiBicHA7CisKKyAgICBzd2l0Y2goYnBwKSB7CisgICAgY2FzZSAxOgorICAgICAgICAqcCA9IHBpeGVsOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgICAgKihVaW50MTYgKilwID0gcGl4ZWw7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgICBpZihTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB7CisgICAgICAgICAgICBwWzBdID0gKHBpeGVsICYjNjI7JiM2MjsgMTYpICYjMzg7IDB4ZmY7CisgICAgICAgICAgICBwWzFdID0gKHBpeGVsICYjNjI7JiM2MjsgOCkgJiMzODsgMHhmZjsKKyAgICAgICAgICAgIHBbMl0gPSBwaXhlbCAmIzM4OyAweGZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFswXSA9IHBpeGVsICYjMzg7IDB4ZmY7CisgICAgICAgICAgICBwWzFdID0gKHBpeGVsICYjNjI7JiM2MjsgOCkgJiMzODsgMHhmZjsKKyAgICAgICAgICAgIHBbMl0gPSAocGl4ZWwgJiM2MjsmIzYyOyAxNikgJiMzODsgMHhmZjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyAgICAgICAgKihVaW50MzIgKilwID0gcGl4ZWw7CisgICAgICAgIGJyZWFrOworICAgIH0KK308L1BSRQorPjwvRElWCis+PFAKKz5UaGUgZm9sbG93aW5nIGNvZGUgdXNlcyB0aGUgcHV0cGl4ZWwoKSBmdW5jdGlvbiBhYm92ZSB0byBzZXQgYQoreWVsbG93IHBpeGVsIGluIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbi48L1AKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVOOTciCis+PC9BCis+PFAKKz48QgorPkV4YW1wbGUgMi02LiBVc2luZyBwdXRwaXhlbCgpPC9CCis+PC9QCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPiYjMTM7ICAgIC8qIENvZGUgdG8gc2V0IGEgeWVsbG93IHBpeGVsIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbiAqLworCisgICAgaW50IHgsIHk7CisgICAgVWludDMyIHllbGxvdzsKKworICAgIC8qIE1hcCB0aGUgY29sb3IgeWVsbG93IHRvIHRoaXMgZGlzcGxheSAoUj0weGZmLCBHPTB4RkYsIEI9MHgwMCkKKyAgICAgICBOb3RlOiAgSWYgdGhlIGRpc3BsYXkgaXMgcGFsZXR0aXplZCwgeW91IG11c3Qgc2V0IHRoZSBwYWxldHRlIGZpcnN0LgorICAgICovCisgICAgeWVsbG93ID0gU0RMX01hcFJHQihzY3JlZW4tJiM2Mjtmb3JtYXQsIDB4ZmYsIDB4ZmYsIDB4MDApOworCisgICAgeCA9IHNjcmVlbi0mIzYyO3cgLyAyOworICAgIHkgPSBzY3JlZW4tJiM2MjtoIC8gMjsKKworICAgIC8qIExvY2sgdGhlIHNjcmVlbiBmb3IgZGlyZWN0IGFjY2VzcyB0byB0aGUgcGl4ZWxzICovCisgICAgaWYgKCBTRExfTVVTVExPQ0soc2NyZWVuKSApIHsKKyAgICAgICAgaWYgKCBTRExfTG9ja1N1cmZhY2Uoc2NyZWVuKSAmIzYwOyAwICkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBsb2NrIHNjcmVlbjogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1dHBpeGVsKHNjcmVlbiwgeCwgeSwgeWVsbG93KTsKKworICAgIGlmICggU0RMX01VU1RMT0NLKHNjcmVlbikgKSB7CisgICAgICAgIFNETF9VbmxvY2tTdXJmYWNlKHNjcmVlbik7CisgICAgfQorICAgIC8qIFVwZGF0ZSBqdXN0IHRoZSBwYXJ0IG9mIHRoZSBkaXNwbGF5IHRoYXQgd2UndmUgY2hhbmdlZCAqLworICAgIFNETF9VcGRhdGVSZWN0KHNjcmVlbiwgeCwgeSwgMSwgMSk7CisKKyAgICByZXR1cm47JiMxMzs8L1BSRQorPjwvRElWCis+PC9ESVYKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGViYXNpY3Npbml0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGV2aWRlb29wZW5nbC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+SW5pdGlhbGl6aW5nIFNETDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9Imd1aWRlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+VXNpbmcgT3BlbkdMIFdpdGggU0RMPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRldmlkZW9vcGVuZ2wuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvZ3VpZGV2aWRlb29wZW5nbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYmQ1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2d1aWRldmlkZW9vcGVuZ2wuaHRtbApAQCAtMCwwICsxLDczMCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlVzaW5nIE9wZW5HTCBXaXRoIFNETDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJHcmFwaGljcyBhbmQgVmlkZW8iCitIUkVGPSJndWlkZXZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IkdyYXBoaWNzIGFuZCBWaWRlbyIKK0hSRUY9Imd1aWRldmlkZW8uaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJJbnB1dCBoYW5kbGluZyIKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJTRUNUMSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ3VpZGV2aWRlby5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPkNoYXB0ZXIgMi4gR3JhcGhpY3MgYW5kIFZpZGVvPC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJndWlkZWlucHV0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iU0VDVDEiCis+PEgxCitDTEFTUz0iU0VDVDEiCis+PEEKK05BTUU9IkdVSURFVklERU9PUEVOR0wiCis+PC9BCis+VXNpbmcgT3BlbkdMIFdpdGggU0RMPC9IMQorPjxQCis+U0RMIGhhcyB0aGUgYWJpbGl0eSB0byBjcmVhdGUgYW5kIHVzZSBPcGVuR0wgY29udGV4dHMgb24gc2V2ZXJhbCBwbGF0Zm9ybXMoTGludXgvWDExLCBXaW4zMiwgQmVPUywgTWFjT1MgQ2xhc3NpYy9Ub29sYm94LCBNYWMgT1MgWCwgRnJlZUJTRC9YMTEgYW5kIFNvbGFyaXMvWDExKS4gVGhpcyBhbGxvd3MgeW91IHRvIHVzZSBTREwncyBhdWRpbywgZXZlbnQgaGFuZGxpbmcsIHRocmVhZHMgYW5kIHRpbWVzIGluIHlvdXIgT3BlbkdMIGFwcGxpY2F0aW9ucyAoYSBmdW5jdGlvbiBvZnRlbiBwZXJmb3JtZWQgYnkgR0xVVCkuPC9QCis+PERJVgorQ0xBU1M9IlNFQ1QyIgorPjxIMgorQ0xBU1M9IlNFQ1QyIgorPjxBCitOQU1FPSJBRU4xMDMiCis+PC9BCis+SW5pdGlhbGlzYXRpb248L0gyCis+PFAKKz5Jbml0aWFsaXNpbmcgU0RMIHRvIHVzZSBPcGVuR0wgaXMgbm90IHZlcnkgZGlmZmVyZW50IHRvIGluaXRpYWxpc2luZyBTREwgbm9ybWFsbHkuIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbmNlczsgeW91IG11c3QgcGFzcyA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9PUEVOR0w8L1RUCis+IHRvIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0VmlkZW9Nb2RlPC9UVAorPjwvQQorPiwgeW91IG11c3Qgc3BlY2lmeSBzZXZlcmFsIEdMIGF0dHJpYnV0ZXMgKGRlcHRoIGJ1ZmZlciBzaXplLCBmcmFtZWJ1ZmZlciBzaXplcykgdXNpbmcgPEEKK0hSRUY9InNkbGdsc2V0YXR0cmlidXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dMX1NldEF0dHJpYnV0ZTwvVFQKKz48L0EKKz4gYW5kIGZpbmFsbHksIGlmIHlvdSB3aXNoIHRvIHVzZSBkb3VibGUgYnVmZmVyaW5nIHlvdSBtdXN0IHNwZWNpZnkgaXQgYXMgYSBHTCBhdHRyaWJ1dGUsIDxTUEFOCitDTEFTUz0iZW1waGFzaXMiCis+PEkKK0NMQVNTPSJFTVBIQVNJUyIKKz5ub3Q8L0kKKz48L1NQQU4KKz4gYnkgcGFzc2luZyB0aGUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRE9VQkxFQlVGPC9UVAorPiBmbGFnIHRvIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+LjwvUAorPjxESVYKK0NMQVNTPSJFWEFNUExFIgorPjxBCitOQU1FPSJBRU4xMTQiCis+PC9BCis+PFAKKz48QgorPkV4YW1wbGUgMi03LiBJbml0aWFsaXppbmcgU0RMIHdpdGggT3BlbkdMPC9CCis+PC9QCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPiAgICAvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB2aWRlbyBzZXR0aW5ncy4gKi8KKyAgICBjb25zdCBTRExfVmlkZW9JbmZvKiBpbmZvID0gTlVMTDsKKyAgICAvKiBEaW1lbnNpb25zIG9mIG91ciB3aW5kb3cuICovCisgICAgaW50IHdpZHRoID0gMDsKKyAgICBpbnQgaGVpZ2h0ID0gMDsKKyAgICAvKiBDb2xvciBkZXB0aCBpbiBiaXRzIG9mIG91ciB3aW5kb3cuICovCisgICAgaW50IGJwcCA9IDA7CisgICAgLyogRmxhZ3Mgd2Ugd2lsbCBwYXNzIGludG8gU0RMX1NldFZpZGVvTW9kZS4gKi8KKyAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgLyogRmlyc3QsIGluaXRpYWxpemUgU0RMJ3MgdmlkZW8gc3Vic3lzdGVtLiAqLworICAgIGlmKCBTRExfSW5pdCggU0RMX0lOSVRfVklERU8gKSAmIzYwOyAwICkgeworICAgICAgICAvKiBGYWlsZWQsIGV4aXQuICovCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlZpZGVvIGluaXRpYWxpemF0aW9uIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgU0RMX0dldEVycm9yKCApICk7CisgICAgICAgIHF1aXRfdHV0b3JpYWwoIDEgKTsKKyAgICB9CisKKyAgICAvKiBMZXQncyBnZXQgc29tZSB2aWRlbyBpbmZvcm1hdGlvbi4gKi8KKyAgICBpbmZvID0gU0RMX0dldFZpZGVvSW5mbyggKTsKKworICAgIGlmKCAhaW5mbyApIHsKKyAgICAgICAgLyogVGhpcyBzaG91bGQgcHJvYmFibHkgbmV2ZXIgaGFwcGVuLiAqLworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJWaWRlbyBxdWVyeSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgIFNETF9HZXRFcnJvciggKSApOworICAgICAgICBxdWl0X3R1dG9yaWFsKCAxICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgb3VyIHdpZHRoL2hlaWdodCB0byA2NDAvNDgwICh5b3Ugd291bGQKKyAgICAgKiBvZiBjb3Vyc2UgbGV0IHRoZSB1c2VyIGRlY2lkZSB0aGlzIGluIGEgbm9ybWFsCisgICAgICogYXBwKS4gV2UgZ2V0IHRoZSBicHAgd2Ugd2lsbCByZXF1ZXN0IGZyb20KKyAgICAgKiB0aGUgZGlzcGxheS4gT24gWDExLCBWaWRNb2RlIGNhbid0IGNoYW5nZQorICAgICAqIHJlc29sdXRpb24sIHNvIHRoaXMgaXMgcHJvYmFibHkgYmVpbmcgb3Zlcmx5CisgICAgICogc2FmZS4gVW5kZXIgV2luMzIsIENoYW5nZURpc3BsYXlTZXR0aW5ncworICAgICAqIGNhbiBjaGFuZ2UgdGhlIGJwcC4KKyAgICAgKi8KKyAgICB3aWR0aCA9IDY0MDsKKyAgICBoZWlnaHQgPSA0ODA7CisgICAgYnBwID0gaW5mby0mIzYyO3ZmbXQtJiM2MjtCaXRzUGVyUGl4ZWw7CisKKyAgICAvKgorICAgICAqIE5vdywgd2Ugd2FudCB0byBzZXR1cCBvdXIgcmVxdWVzdGVkCisgICAgICogd2luZG93IGF0dHJpYnV0ZXMgZm9yIG91ciBPcGVuR0wgd2luZG93LgorICAgICAqIFdlIHdhbnQgKmF0IGxlYXN0KiA1IGJpdHMgb2YgcmVkLCBncmVlbgorICAgICAqIGFuZCBibHVlLiBXZSBhbHNvIHdhbnQgYXQgbGVhc3QgYSAxNi1iaXQKKyAgICAgKiBkZXB0aCBidWZmZXIuCisgICAgICoKKyAgICAgKiBUaGUgbGFzdCB0aGluZyB3ZSBkbyBpcyByZXF1ZXN0IGEgZG91YmxlCisgICAgICogYnVmZmVyZWQgd2luZG93LiAnMScgdHVybnMgb24gZG91YmxlCisgICAgICogYnVmZmVyaW5nLCAnMCcgdHVybnMgaXQgb2ZmLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCB1c2UgU0RMX0RPVUJMRUJVRiBpbgorICAgICAqIHRoZSBmbGFncyB0byBTRExfU2V0VmlkZW9Nb2RlLiBUaGF0IGRvZXMKKyAgICAgKiBub3QgYWZmZWN0IHRoZSBHTCBhdHRyaWJ1dGUgc3RhdGUsIG9ubHkKKyAgICAgKiB0aGUgc3RhbmRhcmQgMkQgYmxpdHRpbmcgc2V0dXAuCisgICAgICovCisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX1JFRF9TSVpFLCA1ICk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX0dSRUVOX1NJWkUsIDUgKTsKKyAgICBTRExfR0xfU2V0QXR0cmlidXRlKCBTRExfR0xfQkxVRV9TSVpFLCA1ICk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX0RFUFRIX1NJWkUsIDE2ICk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX0RPVUJMRUJVRkZFUiwgMSApOworCisgICAgLyoKKyAgICAgKiBXZSB3YW50IHRvIHJlcXVlc3QgdGhhdCBTREwgcHJvdmlkZSB1cworICAgICAqIHdpdGggYW4gT3BlbkdMIHdpbmRvdywgaW4gYSBmdWxsc2NyZWVuCisgICAgICogdmlkZW8gbW9kZS4KKyAgICAgKgorICAgICAqIEVYRVJDSVNFOgorICAgICAqIE1ha2Ugc3RhcnRpbmcgd2luZG93ZWQgYW4gb3B0aW9uLCBhbmQKKyAgICAgKiBoYW5kbGUgdGhlIHJlc2l6ZSBldmVudHMgcHJvcGVybHkgd2l0aAorICAgICAqIGdsVmlld3BvcnQuCisgICAgICovCisgICAgZmxhZ3MgPSBTRExfT1BFTkdMIHwgU0RMX0ZVTExTQ1JFRU47CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgdmlkZW8gbW9kZQorICAgICAqLworICAgIGlmKCBTRExfU2V0VmlkZW9Nb2RlKCB3aWR0aCwgaGVpZ2h0LCBicHAsIGZsYWdzICkgPT0gMCApIHsKKyAgICAgICAgLyogCisgICAgICAgICAqIFRoaXMgY291bGQgaGFwcGVuIGZvciBhIHZhcmlldHkgb2YgcmVhc29ucywKKyAgICAgICAgICogaW5jbHVkaW5nIERJU1BMQVkgbm90IGJlaW5nIHNldCwgdGhlIHNwZWNpZmllZAorICAgICAgICAgKiByZXNvbHV0aW9uIG5vdCBiZWluZyBhdmFpbGFibGUsIGV0Yy4KKyAgICAgICAgICovCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlZpZGVvIG1vZGUgc2V0IGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgU0RMX0dldEVycm9yKCApICk7CisgICAgICAgIHF1aXRfdHV0b3JpYWwoIDEgKTsKKyAgICB9PC9QUkUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlNFQ1QyIgorPjxIMgorQ0xBU1M9IlNFQ1QyIgorPjxBCitOQU1FPSJBRU4xMTciCis+PC9BCis+RHJhd2luZzwvSDIKKz48UAorPkFwYXJ0IGZyb20gaW5pdGlhbGlzYXRpb24sIHVzaW5nIE9wZW5HTCB3aXRoaW4gU0RMIGlzIHRoZSBzYW1lIGFzIHVzaW5nIE9wZW5HTAord2l0aCBhbnkgb3RoZXIgQVBJLCBlLmcuIEdMVVQuIFlvdSBzdGlsbCB1c2UgYWxsIHRoZSBzYW1lIGZ1bmN0aW9uIGNhbGxzIGFuZAorZGF0YSB0eXBlcy4gSG93ZXZlciBpZiB5b3UgYXJlIHVzaW5nIGEgZG91YmxlLWJ1ZmZlcmVkIGRpc3BsYXksIHRoZW4geW91IG11c3QKK3VzZQorPEEKK0hSRUY9InNkbGdsc3dhcGJ1ZmZlcnMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR0xfU3dhcEJ1ZmZlcnMoKTwvVFQKKz48L0EKKz4KK3RvIHN3YXAgdGhlIGJ1ZmZlcnMgYW5kIHVwZGF0ZSB0aGUgZGlzcGxheS4gVG8gcmVxdWVzdCBkb3VibGUtYnVmZmVyaW5nCit3aXRoIE9wZW5HTCwgdXNlCis8QQorSFJFRj0ic2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR0xfU2V0QXR0cmlidXRlPC9UVAorPjwvQQorPgord2l0aCA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9HTF9ET1VCTEVCVUZGRVI8L1RUCis+LCBhbmQgdXNlCis8QQorSFJFRj0ic2RsZ2xnZXRhdHRyaWJ1dGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR0xfR2V0QXR0cmlidXRlPC9UVAorPjwvQQorPgordG8gc2VlIGlmIHlvdSBhY3R1YWxseSBnb3QgaXQuPC9QCis+PFAKKz5BIGZ1bGwgZXhhbXBsZSBjb2RlIGxpc3RpbmcgaXMgbm93IHByZXNlbnRlZCBiZWxvdy48L1AKKz48RElWCitDTEFTUz0iRVhBTVBMRSIKKz48QQorTkFNRT0iQUVOMTI4IgorPjwvQQorPjxQCis+PEIKKz5FeGFtcGxlIDItOC4gU0RMIGFuZCBPcGVuR0w8L0IKKz48L1AKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+LyoKKyAqIFNETCBPcGVuR0wgVHV0b3JpYWwuCisgKiAoYykgTWljaGFlbCBWYW5jZSwgMjAwMAorICogYnJpYXJlb3NAbG9raWdhbWVzLmNvbQorICoKKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRlcm1zIG9mIHRoZSBMR1BMLiAKKyAqLworCisjaW5jbHVkZSAmIzYwO1NETC9TREwuaCYjNjI7CisjaW5jbHVkZSAmIzYwO0dML2dsLmgmIzYyOworI2luY2x1ZGUgJiM2MDtHTC9nbHUuaCYjNjI7CisKKyNpbmNsdWRlICYjNjA7c3RkaW8uaCYjNjI7CisjaW5jbHVkZSAmIzYwO3N0ZGxpYi5oJiM2MjsKKworc3RhdGljIEdMYm9vbGVhbiBzaG91bGRfcm90YXRlID0gR0xfVFJVRTsKKworc3RhdGljIHZvaWQgcXVpdF90dXRvcmlhbCggaW50IGNvZGUgKQoreworICAgIC8qCisgICAgICogUXVpdCBTREwgc28gd2UgY2FuIHJlbGVhc2UgdGhlIGZ1bGxzY3JlZW4KKyAgICAgKiBtb2RlIGFuZCByZXN0b3JlIHRoZSBwcmV2aW91cyB2aWRlbyBzZXR0aW5ncywKKyAgICAgKiBldGMuCisgICAgICovCisgICAgU0RMX1F1aXQoICk7CisKKyAgICAvKiBFeGl0IHByb2dyYW0uICovCisgICAgZXhpdCggY29kZSApOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfa2V5X2Rvd24oIFNETF9rZXlzeW0qIGtleXN5bSApCit7CisKKyAgICAvKiAKKyAgICAgKiBXZSdyZSBvbmx5IGludGVyZXN0ZWQgaWYgJ0VzYycgaGFzCisgICAgICogYmVlbiBwcmVzc3NlZC4KKyAgICAgKgorICAgICAqIEVYRVJDSVNFOiAKKyAgICAgKiBIYW5kbGUgdGhlIGFycm93IGtleXMgYW5kIGhhdmUgdGhhdCBjaGFuZ2UgdGhlCisgICAgICogdmlld2luZyBwb3NpdGlvbi9hbmdsZS4KKyAgICAgKi8KKyAgICBzd2l0Y2goIGtleXN5bS0mIzYyO3N5bSApIHsKKyAgICBjYXNlIFNETEtfRVNDQVBFOgorICAgICAgICBxdWl0X3R1dG9yaWFsKCAwICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0RMS19TUEFDRToKKyAgICAgICAgc2hvdWxkX3JvdGF0ZSA9ICFzaG91bGRfcm90YXRlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19ldmVudHMoIHZvaWQgKQoreworICAgIC8qIE91ciBTREwgZXZlbnQgcGxhY2Vob2xkZXIuICovCisgICAgU0RMX0V2ZW50IGV2ZW50OworCisgICAgLyogR3JhYiBhbGwgdGhlIGV2ZW50cyBvZmYgdGhlIHF1ZXVlLiAqLworICAgIHdoaWxlKCBTRExfUG9sbEV2ZW50KCAmIzM4O2V2ZW50ICkgKSB7CisKKyAgICAgICAgc3dpdGNoKCBldmVudC50eXBlICkgeworICAgICAgICBjYXNlIFNETF9LRVlET1dOOgorICAgICAgICAgICAgLyogSGFuZGxlIGtleSBwcmVzc2VzLiAqLworICAgICAgICAgICAgaGFuZGxlX2tleV9kb3duKCAmIzM4O2V2ZW50LmtleS5rZXlzeW0gKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNETF9RVUlUOgorICAgICAgICAgICAgLyogSGFuZGxlIHF1aXQgcmVxdWVzdHMgKGxpa2UgQ3RybC1jKS4gKi8KKyAgICAgICAgICAgIHF1aXRfdHV0b3JpYWwoIDAgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQgZHJhd19zY3JlZW4oIHZvaWQgKQoreworICAgIC8qIE91ciBhbmdsZSBvZiByb3RhdGlvbi4gKi8KKyAgICBzdGF0aWMgZmxvYXQgYW5nbGUgPSAwLjBmOworCisgICAgLyoKKyAgICAgKiBFWEVSQ0lTRToKKyAgICAgKiBSZXBsYWNlIHRoaXMgYXdmdWwgbWVzcyB3aXRoIHZlcnRleAorICAgICAqIGFycmF5cyBhbmQgYSBjYWxsIHRvIGdsRHJhd0VsZW1lbnRzLgorICAgICAqCisgICAgICogRVhFUkNJU0U6CisgICAgICogQWZ0ZXIgY29tcGxldGluZyB0aGUgYWJvdmUsIGNoYW5nZQorICAgICAqIGl0IHRvIHVzZSBjb21waWxlZCB2ZXJ0ZXggYXJyYXlzLgorICAgICAqCisgICAgICogRVhFUkNJU0U6CisgICAgICogVmVyaWZ5IG15IHdpbmRpbmdzIGFyZSBjb3JyZWN0IGhlcmUgOykuCisgICAgICovCisgICAgc3RhdGljIEdMZmxvYXQgdjBbXSA9IHsgLTEuMGYsIC0xLjBmLCAgMS4wZiB9OworICAgIHN0YXRpYyBHTGZsb2F0IHYxW10gPSB7ICAxLjBmLCAtMS4wZiwgIDEuMGYgfTsKKyAgICBzdGF0aWMgR0xmbG9hdCB2MltdID0geyAgMS4wZiwgIDEuMGYsICAxLjBmIH07CisgICAgc3RhdGljIEdMZmxvYXQgdjNbXSA9IHsgLTEuMGYsICAxLjBmLCAgMS4wZiB9OworICAgIHN0YXRpYyBHTGZsb2F0IHY0W10gPSB7IC0xLjBmLCAtMS4wZiwgLTEuMGYgfTsKKyAgICBzdGF0aWMgR0xmbG9hdCB2NVtdID0geyAgMS4wZiwgLTEuMGYsIC0xLjBmIH07CisgICAgc3RhdGljIEdMZmxvYXQgdjZbXSA9IHsgIDEuMGYsICAxLjBmLCAtMS4wZiB9OworICAgIHN0YXRpYyBHTGZsb2F0IHY3W10gPSB7IC0xLjBmLCAgMS4wZiwgLTEuMGYgfTsKKyAgICBzdGF0aWMgR0x1Ynl0ZSByZWRbXSAgICA9IHsgMjU1LCAgIDAsICAgMCwgMjU1IH07CisgICAgc3RhdGljIEdMdWJ5dGUgZ3JlZW5bXSAgPSB7ICAgMCwgMjU1LCAgIDAsIDI1NSB9OworICAgIHN0YXRpYyBHTHVieXRlIGJsdWVbXSAgID0geyAgIDAsICAgMCwgMjU1LCAyNTUgfTsKKyAgICBzdGF0aWMgR0x1Ynl0ZSB3aGl0ZVtdICA9IHsgMjU1LCAyNTUsIDI1NSwgMjU1IH07CisgICAgc3RhdGljIEdMdWJ5dGUgeWVsbG93W10gPSB7ICAgMCwgMjU1LCAyNTUsIDI1NSB9OworICAgIHN0YXRpYyBHTHVieXRlIGJsYWNrW10gID0geyAgIDAsICAgMCwgICAwLCAyNTUgfTsKKyAgICBzdGF0aWMgR0x1Ynl0ZSBvcmFuZ2VbXSA9IHsgMjU1LCAyNTUsICAgMCwgMjU1IH07CisgICAgc3RhdGljIEdMdWJ5dGUgcHVycGxlW10gPSB7IDI1NSwgICAwLCAyNTUsICAgMCB9OworCisgICAgLyogQ2xlYXIgdGhlIGNvbG9yIGFuZCBkZXB0aCBidWZmZXJzLiAqLworICAgIGdsQ2xlYXIoIEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUICk7CisKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIG1vZGlmeSB0aGUgcHJvamVjdGlvbiBtYXRyaXguICovCisgICAgZ2xNYXRyaXhNb2RlKCBHTF9NT0RFTFZJRVcgKTsKKyAgICBnbExvYWRJZGVudGl0eSggKTsKKworICAgIC8qIE1vdmUgZG93biB0aGUgei1heGlzLiAqLworICAgIGdsVHJhbnNsYXRlZiggMC4wLCAwLjAsIC01LjAgKTsKKworICAgIC8qIFJvdGF0ZS4gKi8KKyAgICBnbFJvdGF0ZWYoIGFuZ2xlLCAwLjAsIDEuMCwgMC4wICk7CisKKyAgICBpZiggc2hvdWxkX3JvdGF0ZSApIHsKKworICAgICAgICBpZiggKythbmdsZSAmIzYyOyAzNjAuMGYgKSB7CisgICAgICAgICAgICBhbmdsZSA9IDAuMGY7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qIFNlbmQgb3VyIHRyaWFuZ2xlIGRhdGEgdG8gdGhlIHBpcGVsaW5lLiAqLworICAgIGdsQmVnaW4oIEdMX1RSSUFOR0xFUyApOworCisgICAgZ2xDb2xvcjR1YnYoIHJlZCApOworICAgIGdsVmVydGV4M2Z2KCB2MCApOworICAgIGdsQ29sb3I0dWJ2KCBncmVlbiApOworICAgIGdsVmVydGV4M2Z2KCB2MSApOworICAgIGdsQ29sb3I0dWJ2KCBibHVlICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHYyICk7CisKKyAgICBnbENvbG9yNHVidiggcmVkICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHYwICk7CisgICAgZ2xDb2xvcjR1YnYoIGJsdWUgKTsKKyAgICBnbFZlcnRleDNmdiggdjIgKTsKKyAgICBnbENvbG9yNHVidiggd2hpdGUgKTsKKyAgICBnbFZlcnRleDNmdiggdjMgKTsKKworICAgIGdsQ29sb3I0dWJ2KCBncmVlbiApOworICAgIGdsVmVydGV4M2Z2KCB2MSApOworICAgIGdsQ29sb3I0dWJ2KCBibGFjayApOworICAgIGdsVmVydGV4M2Z2KCB2NSApOworICAgIGdsQ29sb3I0dWJ2KCBvcmFuZ2UgKTsKKyAgICBnbFZlcnRleDNmdiggdjYgKTsKKworICAgIGdsQ29sb3I0dWJ2KCBncmVlbiApOworICAgIGdsVmVydGV4M2Z2KCB2MSApOworICAgIGdsQ29sb3I0dWJ2KCBvcmFuZ2UgKTsKKyAgICBnbFZlcnRleDNmdiggdjYgKTsKKyAgICBnbENvbG9yNHVidiggYmx1ZSApOworICAgIGdsVmVydGV4M2Z2KCB2MiApOworCisgICAgZ2xDb2xvcjR1YnYoIGJsYWNrICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHY1ICk7CisgICAgZ2xDb2xvcjR1YnYoIHllbGxvdyApOworICAgIGdsVmVydGV4M2Z2KCB2NCApOworICAgIGdsQ29sb3I0dWJ2KCBwdXJwbGUgKTsKKyAgICBnbFZlcnRleDNmdiggdjcgKTsKKworICAgIGdsQ29sb3I0dWJ2KCBibGFjayApOworICAgIGdsVmVydGV4M2Z2KCB2NSApOworICAgIGdsQ29sb3I0dWJ2KCBwdXJwbGUgKTsKKyAgICBnbFZlcnRleDNmdiggdjcgKTsKKyAgICBnbENvbG9yNHVidiggb3JhbmdlICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHY2ICk7CisKKyAgICBnbENvbG9yNHVidiggeWVsbG93ICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHY0ICk7CisgICAgZ2xDb2xvcjR1YnYoIHJlZCApOworICAgIGdsVmVydGV4M2Z2KCB2MCApOworICAgIGdsQ29sb3I0dWJ2KCB3aGl0ZSApOworICAgIGdsVmVydGV4M2Z2KCB2MyApOworCisgICAgZ2xDb2xvcjR1YnYoIHllbGxvdyApOworICAgIGdsVmVydGV4M2Z2KCB2NCApOworICAgIGdsQ29sb3I0dWJ2KCB3aGl0ZSApOworICAgIGdsVmVydGV4M2Z2KCB2MyApOworICAgIGdsQ29sb3I0dWJ2KCBwdXJwbGUgKTsKKyAgICBnbFZlcnRleDNmdiggdjcgKTsKKworICAgIGdsQ29sb3I0dWJ2KCB3aGl0ZSApOworICAgIGdsVmVydGV4M2Z2KCB2MyApOworICAgIGdsQ29sb3I0dWJ2KCBibHVlICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHYyICk7CisgICAgZ2xDb2xvcjR1YnYoIG9yYW5nZSApOworICAgIGdsVmVydGV4M2Z2KCB2NiApOworCisgICAgZ2xDb2xvcjR1YnYoIHdoaXRlICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHYzICk7CisgICAgZ2xDb2xvcjR1YnYoIG9yYW5nZSApOworICAgIGdsVmVydGV4M2Z2KCB2NiApOworICAgIGdsQ29sb3I0dWJ2KCBwdXJwbGUgKTsKKyAgICBnbFZlcnRleDNmdiggdjcgKTsKKworICAgIGdsQ29sb3I0dWJ2KCBncmVlbiApOworICAgIGdsVmVydGV4M2Z2KCB2MSApOworICAgIGdsQ29sb3I0dWJ2KCByZWQgKTsKKyAgICBnbFZlcnRleDNmdiggdjAgKTsKKyAgICBnbENvbG9yNHVidiggeWVsbG93ICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHY0ICk7CisKKyAgICBnbENvbG9yNHVidiggZ3JlZW4gKTsKKyAgICBnbFZlcnRleDNmdiggdjEgKTsKKyAgICBnbENvbG9yNHVidiggeWVsbG93ICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHY0ICk7CisgICAgZ2xDb2xvcjR1YnYoIGJsYWNrICk7CisgICAgZ2xWZXJ0ZXgzZnYoIHY1ICk7CisKKyAgICBnbEVuZCggKTsKKworICAgIC8qCisgICAgICogRVhFUkNJU0U6CisgICAgICogRHJhdyB0ZXh0IHRlbGxpbmcgdGhlIHVzZXIgdGhhdCAnU3BjJworICAgICAqIHBhdXNlcyB0aGUgcm90YXRpb24gYW5kICdFc2MnIHF1aXRzLgorICAgICAqIERvIGl0IHVzaW5nIHZldG9ycyBhbmQgdGV4dHVyZWQgcXVhZHMuCisgICAgICovCisKKyAgICAvKgorICAgICAqIFN3YXAgdGhlIGJ1ZmZlcnMuIFRoaXMgdGhpcyB0ZWxscyB0aGUgZHJpdmVyIHRvCisgICAgICogcmVuZGVyIHRoZSBuZXh0IGZyYW1lIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgICAqIGJhY2stYnVmZmVyLCBhbmQgdG8gc2V0IGFsbCByZW5kZXJpbmcgb3BlcmF0aW9ucworICAgICAqIHRvIG9jY3VyIG9uIHdoYXQgd2FzIHRoZSBmcm9udC1idWZmZXIuCisgICAgICoKKyAgICAgKiBEb3VibGUgYnVmZmVyaW5nIHByZXZlbnRzIG5hc3R5IHZpc3VhbCB0ZWFyaW5nCisgICAgICogZnJvbSB0aGUgYXBwbGljYXRpb24gZHJhd2luZyBvbiBhcmVhcyBvZiB0aGUKKyAgICAgKiBzY3JlZW4gdGhhdCBhcmUgYmVpbmcgdXBkYXRlZCBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAqLworICAgIFNETF9HTF9Td2FwQnVmZmVycyggKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfb3BlbmdsKCBpbnQgd2lkdGgsIGludCBoZWlnaHQgKQoreworICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0OworCisgICAgLyogT3VyIHNoYWRpbmcgbW9kZWwtLUdvdXJhdWQgKHNtb290aCkuICovCisgICAgZ2xTaGFkZU1vZGVsKCBHTF9TTU9PVEggKTsKKworICAgIC8qIEN1bGxpbmcuICovCisgICAgZ2xDdWxsRmFjZSggR0xfQkFDSyApOworICAgIGdsRnJvbnRGYWNlKCBHTF9DQ1cgKTsKKyAgICBnbEVuYWJsZSggR0xfQ1VMTF9GQUNFICk7CisKKyAgICAvKiBTZXQgdGhlIGNsZWFyIGNvbG9yLiAqLworICAgIGdsQ2xlYXJDb2xvciggMCwgMCwgMCwgMCApOworCisgICAgLyogU2V0dXAgb3VyIHZpZXdwb3J0LiAqLworICAgIGdsVmlld3BvcnQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKKworICAgIC8qCisgICAgICogQ2hhbmdlIHRvIHRoZSBwcm9qZWN0aW9uIG1hdHJpeCBhbmQgc2V0CisgICAgICogb3VyIHZpZXdpbmcgdm9sdW1lLgorICAgICAqLworICAgIGdsTWF0cml4TW9kZSggR0xfUFJPSkVDVElPTiApOworICAgIGdsTG9hZElkZW50aXR5KCApOworICAgIC8qCisgICAgICogRVhFUkNJU0U6CisgICAgICogUmVwbGFjZSB0aGlzIHdpdGggYSBjYWxsIHRvIGdsRnJ1c3R1bS4KKyAgICAgKi8KKyAgICBnbHVQZXJzcGVjdGl2ZSggNjAuMCwgcmF0aW8sIDEuMCwgMTAyNC4wICk7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkKK3sKKyAgICAvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB2aWRlbyBzZXR0aW5ncy4gKi8KKyAgICBjb25zdCBTRExfVmlkZW9JbmZvKiBpbmZvID0gTlVMTDsKKyAgICAvKiBEaW1lbnNpb25zIG9mIG91ciB3aW5kb3cuICovCisgICAgaW50IHdpZHRoID0gMDsKKyAgICBpbnQgaGVpZ2h0ID0gMDsKKyAgICAvKiBDb2xvciBkZXB0aCBpbiBiaXRzIG9mIG91ciB3aW5kb3cuICovCisgICAgaW50IGJwcCA9IDA7CisgICAgLyogRmxhZ3Mgd2Ugd2lsbCBwYXNzIGludG8gU0RMX1NldFZpZGVvTW9kZS4gKi8KKyAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgLyogRmlyc3QsIGluaXRpYWxpemUgU0RMJ3MgdmlkZW8gc3Vic3lzdGVtLiAqLworICAgIGlmKCBTRExfSW5pdCggU0RMX0lOSVRfVklERU8gKSAmIzYwOyAwICkgeworICAgICAgICAvKiBGYWlsZWQsIGV4aXQuICovCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlZpZGVvIGluaXRpYWxpemF0aW9uIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgU0RMX0dldEVycm9yKCApICk7CisgICAgICAgIHF1aXRfdHV0b3JpYWwoIDEgKTsKKyAgICB9CisKKyAgICAvKiBMZXQncyBnZXQgc29tZSB2aWRlbyBpbmZvcm1hdGlvbi4gKi8KKyAgICBpbmZvID0gU0RMX0dldFZpZGVvSW5mbyggKTsKKworICAgIGlmKCAhaW5mbyApIHsKKyAgICAgICAgLyogVGhpcyBzaG91bGQgcHJvYmFibHkgbmV2ZXIgaGFwcGVuLiAqLworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJWaWRlbyBxdWVyeSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgIFNETF9HZXRFcnJvciggKSApOworICAgICAgICBxdWl0X3R1dG9yaWFsKCAxICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgb3VyIHdpZHRoL2hlaWdodCB0byA2NDAvNDgwICh5b3Ugd291bGQKKyAgICAgKiBvZiBjb3Vyc2UgbGV0IHRoZSB1c2VyIGRlY2lkZSB0aGlzIGluIGEgbm9ybWFsCisgICAgICogYXBwKS4gV2UgZ2V0IHRoZSBicHAgd2Ugd2lsbCByZXF1ZXN0IGZyb20KKyAgICAgKiB0aGUgZGlzcGxheS4gT24gWDExLCBWaWRNb2RlIGNhbid0IGNoYW5nZQorICAgICAqIHJlc29sdXRpb24sIHNvIHRoaXMgaXMgcHJvYmFibHkgYmVpbmcgb3Zlcmx5CisgICAgICogc2FmZS4gVW5kZXIgV2luMzIsIENoYW5nZURpc3BsYXlTZXR0aW5ncworICAgICAqIGNhbiBjaGFuZ2UgdGhlIGJwcC4KKyAgICAgKi8KKyAgICB3aWR0aCA9IDY0MDsKKyAgICBoZWlnaHQgPSA0ODA7CisgICAgYnBwID0gaW5mby0mIzYyO3ZmbXQtJiM2MjtCaXRzUGVyUGl4ZWw7CisKKyAgICAvKgorICAgICAqIE5vdywgd2Ugd2FudCB0byBzZXR1cCBvdXIgcmVxdWVzdGVkCisgICAgICogd2luZG93IGF0dHJpYnV0ZXMgZm9yIG91ciBPcGVuR0wgd2luZG93LgorICAgICAqIFdlIHdhbnQgKmF0IGxlYXN0KiA1IGJpdHMgb2YgcmVkLCBncmVlbgorICAgICAqIGFuZCBibHVlLiBXZSBhbHNvIHdhbnQgYXQgbGVhc3QgYSAxNi1iaXQKKyAgICAgKiBkZXB0aCBidWZmZXIuCisgICAgICoKKyAgICAgKiBUaGUgbGFzdCB0aGluZyB3ZSBkbyBpcyByZXF1ZXN0IGEgZG91YmxlCisgICAgICogYnVmZmVyZWQgd2luZG93LiAnMScgdHVybnMgb24gZG91YmxlCisgICAgICogYnVmZmVyaW5nLCAnMCcgdHVybnMgaXQgb2ZmLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCB1c2UgU0RMX0RPVUJMRUJVRiBpbgorICAgICAqIHRoZSBmbGFncyB0byBTRExfU2V0VmlkZW9Nb2RlLiBUaGF0IGRvZXMKKyAgICAgKiBub3QgYWZmZWN0IHRoZSBHTCBhdHRyaWJ1dGUgc3RhdGUsIG9ubHkKKyAgICAgKiB0aGUgc3RhbmRhcmQgMkQgYmxpdHRpbmcgc2V0dXAuCisgICAgICovCisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX1JFRF9TSVpFLCA1ICk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX0dSRUVOX1NJWkUsIDUgKTsKKyAgICBTRExfR0xfU2V0QXR0cmlidXRlKCBTRExfR0xfQkxVRV9TSVpFLCA1ICk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX0RFUFRIX1NJWkUsIDE2ICk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX0RPVUJMRUJVRkZFUiwgMSApOworCisgICAgLyoKKyAgICAgKiBXZSB3YW50IHRvIHJlcXVlc3QgdGhhdCBTREwgcHJvdmlkZSB1cworICAgICAqIHdpdGggYW4gT3BlbkdMIHdpbmRvdywgaW4gYSBmdWxsc2NyZWVuCisgICAgICogdmlkZW8gbW9kZS4KKyAgICAgKgorICAgICAqIEVYRVJDSVNFOgorICAgICAqIE1ha2Ugc3RhcnRpbmcgd2luZG93ZWQgYW4gb3B0aW9uLCBhbmQKKyAgICAgKiBoYW5kbGUgdGhlIHJlc2l6ZSBldmVudHMgcHJvcGVybHkgd2l0aAorICAgICAqIGdsVmlld3BvcnQuCisgICAgICovCisgICAgZmxhZ3MgPSBTRExfT1BFTkdMIHwgU0RMX0ZVTExTQ1JFRU47CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgdmlkZW8gbW9kZQorICAgICAqLworICAgIGlmKCBTRExfU2V0VmlkZW9Nb2RlKCB3aWR0aCwgaGVpZ2h0LCBicHAsIGZsYWdzICkgPT0gMCApIHsKKyAgICAgICAgLyogCisgICAgICAgICAqIFRoaXMgY291bGQgaGFwcGVuIGZvciBhIHZhcmlldHkgb2YgcmVhc29ucywKKyAgICAgICAgICogaW5jbHVkaW5nIERJU1BMQVkgbm90IGJlaW5nIHNldCwgdGhlIHNwZWNpZmllZAorICAgICAgICAgKiByZXNvbHV0aW9uIG5vdCBiZWluZyBhdmFpbGFibGUsIGV0Yy4KKyAgICAgICAgICovCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlZpZGVvIG1vZGUgc2V0IGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgU0RMX0dldEVycm9yKCApICk7CisgICAgICAgIHF1aXRfdHV0b3JpYWwoIDEgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBoYXZlIGEgcHJvcGVybHkgc2V0dXAKKyAgICAgKiBkb3VibGUtYnVmZmVyZWQgd2luZG93IGZvciB1c2Ugd2l0aCBPcGVuR0wuCisgICAgICovCisgICAgc2V0dXBfb3BlbmdsKCB3aWR0aCwgaGVpZ2h0ICk7CisKKyAgICAvKgorICAgICAqIE5vdyB3ZSB3YW50IHRvIGJlZ2luIG91ciBub3JtYWwgYXBwIHByb2Nlc3MtLQorICAgICAqIGFuIGV2ZW50IGxvb3Agd2l0aCBhIGxvdCBvZiByZWRyYXdpbmcuCisgICAgICovCisgICAgd2hpbGUoIDEgKSB7CisgICAgICAgIC8qIFByb2Nlc3MgaW5jb21pbmcgZXZlbnRzLiAqLworICAgICAgICBwcm9jZXNzX2V2ZW50cyggKTsKKyAgICAgICAgLyogRHJhdyB0aGUgc2NyZWVuLiAqLworICAgICAgICBkcmF3X3NjcmVlbiggKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEVYRVJDSVNFOgorICAgICAqIFJlY29yZCB0aW1pbmdzIHVzaW5nIFNETF9HZXRUaWNrcygpIGFuZAorICAgICAqIGFuZCBwcmludCBvdXQgZnJhbWVzIHBlciBzZWNvbmQgYXQgcHJvZ3JhbQorICAgICAqIGVuZC4KKyAgICAgKi8KKworICAgIC8qIE5ldmVyIHJlYWNoZWQuICovCisgICAgcmV0dXJuIDA7Cit9PC9QUkUKKz48L0RJVgorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZXZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGVpbnB1dC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+R3JhcGhpY3MgYW5kIFZpZGVvPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGV2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPklucHV0IGhhbmRsaW5nPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2luZGV4Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2ZmYxOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvaW5kZXguaHRtbApAQCAtMCwwICsxLDExNTYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz48L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTREwgR3VpZGUiCitIUkVGPSJndWlkZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IkJPT0siCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJCT09LIgorPjxBCitOQU1FPSJBRU4xIgorPjwvQQorPjxESVYKK0NMQVNTPSJUT0MiCis+PERMCis+PERUCis+PEIKKz5UYWJsZSBvZiBDb250ZW50czwvQgorPjwvRFQKKz48RFQKKz5JLiA8QQorSFJFRj0iZ3VpZGUuaHRtbCIKKz5TREwgR3VpZGU8L0EKKz48L0RUCis+PERECis+PERMCis+PERUCis+PEEKK0hSRUY9Imd1aWRlcHJlZmFjZS5odG1sIgorPlByZWZhY2U8L0EKKz48L0RUCis+PERECis+PERMCis+PERUCis+PEEKK0hSRUY9Imd1aWRlcHJlZmFjZS5odG1sI0dVSURFQUJPVVRTREwiCis+QWJvdXQgU0RMPC9BCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZWFib3V0c2RsZG9jLmh0bWwiCis+QWJvdXQgU0RMZG9jPC9BCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZWNyZWRpdHMuaHRtbCIKKz5DcmVkaXRzPC9BCis+PC9EVAorPjwvREwKKz48L0RECis+PERUCis+MS4gPEEKK0hSRUY9Imd1aWRldGhlYmFzaWNzLmh0bWwiCis+VGhlIEJhc2ljczwvQQorPjwvRFQKKz48REQKKz48REwKKz48RFQKKz48QQorSFJFRj0iZ3VpZGV0aGViYXNpY3MuaHRtbCNHVUlERUlOVFJPRFVDVElPTiIKKz5JbnRyb2R1Y3Rpb248L0EKKz48L0RUCis+PERUCis+PEEKK0hSRUY9Imd1aWRlYmFzaWNzaW5pdC5odG1sIgorPkluaXRpYWxpemluZyBTREw8L0EKKz48L0RUCis+PC9ETAorPjwvREQKKz48RFQKKz4yLiA8QQorSFJFRj0iZ3VpZGV2aWRlby5odG1sIgorPkdyYXBoaWNzIGFuZCBWaWRlbzwvQQorPjwvRFQKKz48REQKKz48REwKKz48RFQKKz48QQorSFJFRj0iZ3VpZGV2aWRlby5odG1sI0dVSURFVklERU9JTlRSTyIKKz5JbnRyb2R1Y3Rpb24gdG8gU0RMIFZpZGVvPC9BCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZXZpZGVvb3BlbmdsLmh0bWwiCis+VXNpbmcgT3BlbkdMIFdpdGggU0RMPC9BCis+PC9EVAorPjwvREwKKz48L0RECis+PERUCis+My4gPEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCIKKz5JbnB1dCBoYW5kbGluZzwvQQorPjwvRFQKKz48REQKKz48REwKKz48RFQKKz48QQorSFJFRj0iZ3VpZGVpbnB1dC5odG1sI0dVSURFSU5QVVRKT1lTVElDSyIKKz5IYW5kbGluZyBKb3lzdGlja3M8L0EKKz48L0RUCis+PERUCis+PEEKK0hSRUY9Imd1aWRlaW5wdXRrZXlib2FyZC5odG1sIgorPkhhbmRsaW5nIHRoZSBLZXlib2FyZDwvQQorPjwvRFQKKz48L0RMCis+PC9ERAorPjxEVAorPjQuIDxBCitIUkVGPSJndWlkZWV4YW1wbGVzLmh0bWwiCis+RXhhbXBsZXM8L0EKKz48L0RUCis+PERECis+PERMCis+PERUCis+PEEKK0hSRUY9Imd1aWRlZXhhbXBsZXMuaHRtbCNBRU4zNjkiCis+SW50cm9kdWN0aW9uPC9BCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZWV2ZW50ZXhhbXBsZXMuaHRtbCIKKz5FdmVudCBFeGFtcGxlczwvQQorPjwvRFQKKz48RFQKKz48QQorSFJFRj0iZ3VpZGVhdWRpb2V4YW1wbGVzLmh0bWwiCis+QXVkaW8gRXhhbXBsZXM8L0EKKz48L0RUCis+PERUCis+PEEKK0hSRUY9Imd1aWRlY2Ryb21leGFtcGxlcy5odG1sIgorPkNEUk9NIEV4YW1wbGVzPC9BCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJndWlkZXRpbWVleGFtcGxlcy5odG1sIgorPlRpbWUgRXhhbXBsZXM8L0EKKz48L0RUCis+PC9ETAorPjwvREQKKz48L0RMCis+PC9ERAorPjxEVAorPklJLiA8QQorSFJFRj0icmVmZXJlbmNlLmh0bWwiCis+U0RMIFJlZmVyZW5jZTwvQQorPjwvRFQKKz48REQKKz48REwKKz48RFQKKz41LiA8QQorSFJFRj0iZ2VuZXJhbC5odG1sIgorPkdlbmVyYWw8L0EKKz48L0RUCis+PERECis+PERMCis+PERUCis+PEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz5TRExfSW5pdDwvQQorPiZuYnNwOy0tJm5ic3A7SW5pdGlhbGl6ZXMgU0RMPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxpbml0c3Vic3lzdGVtLmh0bWwiCis+U0RMX0luaXRTdWJTeXN0ZW08L0EKKz4mbmJzcDstLSZuYnNwO0luaXRpYWxpemUgc3Vic3lzdGVtczwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RscXVpdHN1YnN5c3RlbS5odG1sIgorPlNETF9RdWl0U3ViU3lzdGVtPC9BCis+Jm5ic3A7LS0mbmJzcDtTaHV0IGRvd24gYSBzdWJzeXN0ZW08L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHF1aXQuaHRtbCIKKz5TRExfUXVpdDwvQQorPiZuYnNwOy0tJm5ic3A7U2h1dCBkb3duIFNETDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd2FzaW5pdC5odG1sIgorPlNETF9XYXNJbml0PC9BCis+Jm5ic3A7LS0mbmJzcDtDaGVjayB3aGljaCBzdWJzeXN0ZW1zIGFyZSBpbml0aWFsaXplZDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0ZXJyb3IuaHRtbCIKKz5TRExfR2V0RXJyb3I8L0EKKz4mbmJzcDstLSZuYnNwO0dldCBTREwgZXJyb3Igc3RyaW5nPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxlbnZ2YXJzLmh0bWwiCis+U0RMX2VudnZhcnM8L0EKKz4mbmJzcDstLSZuYnNwO1NETCBlbnZpcm9ubWVudCB2YXJpYWJsZXM8L0RUCis+PC9ETAorPjwvREQKKz48RFQKKz42LiA8QQorSFJFRj0idmlkZW8uaHRtbCIKKz5WaWRlbzwvQQorPjwvRFQKKz48REQKKz48REwKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0dmlkZW9zdXJmYWNlLmh0bWwiCis+U0RMX0dldFZpZGVvU3VyZmFjZTwvQQorPiZuYnNwOy0tJm5ic3A7cmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGlzcGxheSBzdXJmYWNlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXR2aWRlb2luZm8uaHRtbCIKKz5TRExfR2V0VmlkZW9JbmZvPC9BCis+Jm5ic3A7LS0mbmJzcDtyZXR1cm5zIGEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gaGFyZHdhcmU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHZpZGVvZHJpdmVybmFtZS5odG1sIgorPlNETF9WaWRlb0RyaXZlck5hbWU8L0EKKz4mbmJzcDstLSZuYnNwO09idGFpbiB0aGUgbmFtZSBvZiB0aGUgdmlkZW8gZHJpdmVyPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxsaXN0bW9kZXMuaHRtbCIKKz5TRExfTGlzdE1vZGVzPC9BCis+Jm5ic3A7LS0mbmJzcDtSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdmFpbGFibGUgc2NyZWVuIGRpbWVuc2lvbnMgZm9yIAordGhlIGdpdmVuIGZvcm1hdCBhbmQgdmlkZW8gZmxhZ3M8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHZpZGVvbW9kZW9rLmh0bWwiCis+U0RMX1ZpZGVvTW9kZU9LPC9BCis+Jm5ic3A7LS0mbmJzcDtDaGVjayB0byBzZWUgaWYgYSBwYXJ0aWN1bGFyIHZpZGVvIG1vZGUgaXMgc3VwcG9ydGVkLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiCis+U0RMX1NldFZpZGVvTW9kZTwvQQorPiZuYnNwOy0tJm5ic3A7U2V0IHVwIGEgdmlkZW8gbW9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCBhbmQgYml0cy1wZXItcGl4ZWwuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGx1cGRhdGVyZWN0Lmh0bWwiCis+U0RMX1VwZGF0ZVJlY3Q8L0EKKz4mbmJzcDstLSZuYnNwO01ha2VzIHN1cmUgdGhlIGdpdmVuIGFyZWEgaXMgdXBkYXRlZCBvbiB0aGUgZ2l2ZW4gc2NyZWVuLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsdXBkYXRlcmVjdHMuaHRtbCIKKz5TRExfVXBkYXRlUmVjdHM8L0EKKz4mbmJzcDstLSZuYnNwO01ha2VzIHN1cmUgdGhlIGdpdmVuIGxpc3Qgb2YgcmVjdGFuZ2xlcyBpcyB1cGRhdGVkIG9uIHRoZSBnaXZlbiBzY3JlZW4uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxmbGlwLmh0bWwiCis+U0RMX0ZsaXA8L0EKKz4mbmJzcDstLSZuYnNwO1N3YXBzIHNjcmVlbiBidWZmZXJzPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZXRjb2xvcnMuaHRtbCIKKz5TRExfU2V0Q29sb3JzPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXRzIGEgcG9ydGlvbiBvZiB0aGUgY29sb3JtYXAgZm9yIHRoZSBnaXZlbiA4LWJpdCBzdXJmYWNlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2V0cGFsZXR0ZS5odG1sIgorPlNETF9TZXRQYWxldHRlPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXRzIHRoZSBjb2xvcnMgaW4gdGhlIHBhbGV0dGUgb2YgYW4gOC1iaXQgc3VyZmFjZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNldGdhbW1hLmh0bWwiCis+U0RMX1NldEdhbW1hPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXRzIHRoZSBjb2xvciBnYW1tYSBmdW5jdGlvbiBmb3IgdGhlIGRpc3BsYXk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdldGdhbW1hcmFtcC5odG1sIgorPlNETF9HZXRHYW1tYVJhbXA8L0EKKz4mbmJzcDstLSZuYnNwO0dldHMgdGhlIGNvbG9yIGdhbW1hIGxvb2t1cCB0YWJsZXMgZm9yIHRoZSBkaXNwbGF5PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZXRnYW1tYXJhbXAuaHRtbCIKKz5TRExfU2V0R2FtbWFSYW1wPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXRzIHRoZSBjb2xvciBnYW1tYSBsb29rdXAgdGFibGVzIGZvciB0aGUgZGlzcGxheTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbWFwcmdiLmh0bWwiCis+U0RMX01hcFJHQjwvQQorPiZuYnNwOy0tJm5ic3A7TWFwIGEgUkdCIGNvbG9yIHZhbHVlIHRvIGEgcGl4ZWwgZm9ybWF0LjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbWFwcmdiYS5odG1sIgorPlNETF9NYXBSR0JBPC9BCis+Jm5ic3A7LS0mbmJzcDtNYXAgYSBSR0JBIGNvbG9yIHZhbHVlIHRvIGEgcGl4ZWwgZm9ybWF0LjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0cmdiLmh0bWwiCis+U0RMX0dldFJHQjwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IFJHQiB2YWx1ZXMgZnJvbSBhIHBpeGVsIGluIHRoZSBzcGVjaWZpZWQgcGl4ZWwgZm9ybWF0LjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0cmdiYS5odG1sIgorPlNETF9HZXRSR0JBPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgUkdCQSB2YWx1ZXMgZnJvbSBhIHBpeGVsIGluIHRoZSBzcGVjaWZpZWQgcGl4ZWwgZm9ybWF0LjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY3JlYXRlcmdic3VyZmFjZS5odG1sIgorPlNETF9DcmVhdGVSR0JTdXJmYWNlPC9BCis+Jm5ic3A7LS0mbmJzcDtDcmVhdGUgYW4gZW1wdHkgU0RMX1N1cmZhY2U8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2Vmcm9tLmh0bWwiCis+U0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tPC9BCis+Jm5ic3A7LS0mbmJzcDtDcmVhdGUgYW4gU0RMX1N1cmZhY2UgZnJvbSBwaXhlbCBkYXRhPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxmcmVlc3VyZmFjZS5odG1sIgorPlNETF9GcmVlU3VyZmFjZTwvQQorPiZuYnNwOy0tJm5ic3A7RnJlZXMgKGRlbGV0ZXMpIGEgU0RMX1N1cmZhY2U8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGxvY2tzdXJmYWNlLmh0bWwiCis+U0RMX0xvY2tTdXJmYWNlPC9BCis+Jm5ic3A7LS0mbmJzcDtMb2NrIGEgc3VyZmFjZSBmb3IgZGlyZWN0bHkgYWNjZXNzLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsdW5sb2Nrc3VyZmFjZS5odG1sIgorPlNETF9VbmxvY2tTdXJmYWNlPC9BCis+Jm5ic3A7LS0mbmJzcDtVbmxvY2tzIGEgcHJldmlvdXNseSBsb2NrZWQgc3VyZmFjZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGxvYWRibXAuaHRtbCIKKz5TRExfTG9hZEJNUDwvQQorPiZuYnNwOy0tJm5ic3A7TG9hZCBhIFdpbmRvd3MgQk1QIGZpbGUgaW50byBhbiBTRExfU3VyZmFjZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNhdmVibXAuaHRtbCIKKz5TRExfU2F2ZUJNUDwvQQorPiZuYnNwOy0tJm5ic3A7U2F2ZSBhbiBTRExfU3VyZmFjZSBhcyBhIFdpbmRvd3MgQk1QIGZpbGUuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZXRjb2xvcmtleS5odG1sIgorPlNETF9TZXRDb2xvcktleTwvQQorPiZuYnNwOy0tJm5ic3A7U2V0cyB0aGUgY29sb3Iga2V5ICh0cmFuc3BhcmVudCBwaXhlbCkgaW4gYSBibGl0dGFibGUgc3VyZmFjZSBhbmQKK1JMRSBhY2NlbGVyYXRpb24uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZXRhbHBoYS5odG1sIgorPlNETF9TZXRBbHBoYTwvQQorPiZuYnNwOy0tJm5ic3A7QWRqdXN0IHRoZSBhbHBoYSBwcm9wZXJ0aWVzIG9mIGEgc3VyZmFjZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2V0Y2xpcHJlY3QuaHRtbCIKKz5TRExfU2V0Q2xpcFJlY3Q8L0EKKz4mbmJzcDstLSZuYnNwO1NldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBmb3IgYSBzdXJmYWNlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0Y2xpcHJlY3QuaHRtbCIKKz5TRExfR2V0Q2xpcFJlY3Q8L0EKKz4mbmJzcDstLSZuYnNwO0dldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBmb3IgYSBzdXJmYWNlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY29udmVydHN1cmZhY2UuaHRtbCIKKz5TRExfQ29udmVydFN1cmZhY2U8L0EKKz4mbmJzcDstLSZuYnNwO0NvbnZlcnRzIGEgc3VyZmFjZSB0byB0aGUgc2FtZSBmb3JtYXQgYXMgYW5vdGhlciBzdXJmYWNlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsYmxpdHN1cmZhY2UuaHRtbCIKKz5TRExfQmxpdFN1cmZhY2U8L0EKKz4mbmJzcDstLSZuYnNwO1RoaXMgcGVyZm9ybXMgYSBmYXN0IGJsaXQgZnJvbSB0aGUgc291cmNlIHN1cmZhY2UgdG8gdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxmaWxscmVjdC5odG1sIgorPlNETF9GaWxsUmVjdDwvQQorPiZuYnNwOy0tJm5ic3A7VGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGZhc3QgZmlsbCBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIHdpdGggc29tZSBjb2xvcjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZGlzcGxheWZvcm1hdC5odG1sIgorPlNETF9EaXNwbGF5Rm9ybWF0PC9BCis+Jm5ic3A7LS0mbmJzcDtDb252ZXJ0IGEgc3VyZmFjZSB0byB0aGUgZGlzcGxheSBmb3JtYXQ8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGRpc3BsYXlmb3JtYXRhbHBoYS5odG1sIgorPlNETF9EaXNwbGF5Rm9ybWF0QWxwaGE8L0EKKz4mbmJzcDstLSZuYnNwO0NvbnZlcnQgYSBzdXJmYWNlIHRvIHRoZSBkaXNwbGF5IGZvcm1hdDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd2FycG1vdXNlLmh0bWwiCis+U0RMX1dhcnBNb3VzZTwvQQorPiZuYnNwOy0tJm5ic3A7U2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbW91c2UgY3Vyc29yLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY3JlYXRlY3Vyc29yLmh0bWwiCis+U0RMX0NyZWF0ZUN1cnNvcjwvQQorPiZuYnNwOy0tJm5ic3A7Q3JlYXRlcyBhIG5ldyBtb3VzZSBjdXJzb3IuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxmcmVlY3Vyc29yLmh0bWwiCis+U0RMX0ZyZWVDdXJzb3I8L0EKKz4mbmJzcDstLSZuYnNwO0ZyZWVzIGEgY3Vyc29yIGNyZWF0ZWQgd2l0aCBTRExfQ3JlYXRlQ3Vyc29yLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2V0Y3Vyc29yLmh0bWwiCis+U0RMX1NldEN1cnNvcjwvQQorPiZuYnNwOy0tJm5ic3A7U2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIG1vdXNlIGN1cnNvci48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdldGN1cnNvci5odG1sIgorPlNETF9HZXRDdXJzb3I8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBtb3VzZSBjdXJzb3IuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzaG93Y3Vyc29yLmh0bWwiCis+U0RMX1Nob3dDdXJzb3I8L0EKKz4mbmJzcDstLSZuYnNwO1RvZ2dsZSB3aGV0aGVyIG9yIG5vdCB0aGUgY3Vyc29yIGlzIHNob3duIG9uIHRoZSBzY3JlZW4uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnbGxvYWRsaWJyYXJ5Lmh0bWwiCis+U0RMX0dMX0xvYWRMaWJyYXJ5PC9BCis+Jm5ic3A7LS0mbmJzcDtTcGVjaWZ5IGFuIE9wZW5HTCBsaWJyYXJ5PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnbGdldHByb2NhZGRyZXNzLmh0bWwiCis+U0RMX0dMX0dldFByb2NBZGRyZXNzPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIGFkZHJlc3Mgb2YgYSBHTCBmdW5jdGlvbjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2xnZXRhdHRyaWJ1dGUuaHRtbCIKKz5TRExfR0xfR2V0QXR0cmlidXRlPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lhbCBTREwvT3BlbkdMIGF0dHJpYnV0ZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCIKKz5TRExfR0xfU2V0QXR0cmlidXRlPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXQgYSBzcGVjaWFsIFNETC9PcGVuR0wgYXR0cmlidXRlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnbHN3YXBidWZmZXJzLmh0bWwiCis+U0RMX0dMX1N3YXBCdWZmZXJzPC9BCis+Jm5ic3A7LS0mbmJzcDtTd2FwIE9wZW5HTCBmcmFtZWJ1ZmZlcnMvVXBkYXRlIERpc3BsYXk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNyZWF0ZXl1dm92ZXJsYXkuaHRtbCIKKz5TRExfQ3JlYXRlWVVWT3ZlcmxheTwvQQorPiZuYnNwOy0tJm5ic3A7Q3JlYXRlIGEgWVVWIHZpZGVvIG92ZXJsYXk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGxvY2t5dXZvdmVybGF5Lmh0bWwiCis+U0RMX0xvY2tZVVZPdmVybGF5PC9BCis+Jm5ic3A7LS0mbmJzcDtMb2NrIGFuIG92ZXJsYXk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHVubG9ja3l1dm92ZXJsYXkuaHRtbCIKKz5TRExfVW5sb2NrWVVWT3ZlcmxheTwvQQorPiZuYnNwOy0tJm5ic3A7VW5sb2NrIGFuIG92ZXJsYXk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGRpc3BsYXl5dXZvdmVybGF5Lmh0bWwiCis+U0RMX0Rpc3BsYXlZVVZPdmVybGF5PC9BCis+Jm5ic3A7LS0mbmJzcDtCbGl0IHRoZSBvdmVybGF5IHRvIHRoZSBkaXNwbGF5PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxmcmVleXV2b3ZlcmxheS5odG1sIgorPlNETF9GcmVlWVVWT3ZlcmxheTwvQQorPiZuYnNwOy0tJm5ic3A7RnJlZSBhIFlVViB2aWRlbyBvdmVybGF5PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnbGF0dHIuaHRtbCIKKz5TRExfR0xhdHRyPC9BCis+Jm5ic3A7LS0mbmJzcDtTREwgR0wgQXR0cmlidXRlczwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RscmVjdC5odG1sIgorPlNETF9SZWN0PC9BCis+Jm5ic3A7LS0mbmJzcDtEZWZpbmVzIGEgcmVjdGFuZ3VsYXIgYXJlYTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY29sb3IuaHRtbCIKKz5TRExfQ29sb3I8L0EKKz4mbmJzcDstLSZuYnNwO0Zvcm1hdCBpbmRlcGVuZGVudCBjb2xvciBkZXNjcmlwdGlvbjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RscGFsZXR0ZS5odG1sIgorPlNETF9QYWxldHRlPC9BCis+Jm5ic3A7LS0mbmJzcDtDb2xvciBwYWxldHRlIGZvciA4LWJpdCBwaXhlbCBmb3JtYXRzPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorPlNETF9QaXhlbEZvcm1hdDwvQQorPiZuYnNwOy0tJm5ic3A7U3RvcmVzIHN1cmZhY2UgZm9ybWF0IGluZm9ybWF0aW9uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+U0RMX1N1cmZhY2U8L0EKKz4mbmJzcDstLSZuYnNwO0dyYXBoaWNhbCBTdXJmYWNlIFN0cnVjdHVyZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsdmlkZW9pbmZvLmh0bWwiCis+U0RMX1ZpZGVvSW5mbzwvQQorPiZuYnNwOy0tJm5ic3A7VmlkZW8gVGFyZ2V0IGluZm9ybWF0aW9uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxvdmVybGF5Lmh0bWwiCis+U0RMX092ZXJsYXk8L0EKKz4mbmJzcDstLSZuYnNwO1lVViB2aWRlbyBvdmVybGF5PC9EVAorPjwvREwKKz48L0RECis+PERUCis+Ny4gPEEKK0hSRUY9IndtLmh0bWwiCis+V2luZG93IE1hbmFnZW1lbnQ8L0EKKz48L0RUCis+PERECis+PERMCis+PERUCis+PEEKK0hSRUY9InNkbHdtc2V0Y2FwdGlvbi5odG1sIgorPlNETF9XTV9TZXRDYXB0aW9uPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXRzIHRoZSB3aW5kb3cgdGlsZSBhbmQgaWNvbiBuYW1lLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd21nZXRjYXB0aW9uLmh0bWwiCis+U0RMX1dNX0dldENhcHRpb248L0EKKz4mbmJzcDstLSZuYnNwO0dldHMgdGhlIHdpbmRvdyB0aXRsZSBhbmQgaWNvbiBuYW1lLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd21zZXRpY29uLmh0bWwiCis+U0RMX1dNX1NldEljb248L0EKKz4mbmJzcDstLSZuYnNwO1NldHMgdGhlIGljb24gZm9yIHRoZSBkaXNwbGF5IHdpbmRvdy48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHdtaWNvbmlmeXdpbmRvdy5odG1sIgorPlNETF9XTV9JY29uaWZ5V2luZG93PC9BCis+Jm5ic3A7LS0mbmJzcDtJY29uaWZ5L01pbmltaXNlIHRoZSB3aW5kb3c8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHdtdG9nZ2xlZnVsbHNjcmVlbi5odG1sIgorPlNETF9XTV9Ub2dnbGVGdWxsU2NyZWVuPC9BCis+Jm5ic3A7LS0mbmJzcDtUb2dnbGVzIGZ1bGxzY3JlZW4gbW9kZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd21ncmFiaW5wdXQuaHRtbCIKKz5TRExfV01fR3JhYklucHV0PC9BCis+Jm5ic3A7LS0mbmJzcDtHcmFicyBtb3VzZSBhbmQga2V5Ym9hcmQgaW5wdXQuPC9EVAorPjwvREwKKz48L0RECis+PERUCis+OC4gPEEKK0hSRUY9ImV2ZW50Lmh0bWwiCis+RXZlbnRzPC9BCis+PC9EVAorPjxERAorPjxETAorPjxEVAorPjxBCitIUkVGPSJldmVudC5odG1sI0FFTjM2OTEiCis+SW50cm9kdWN0aW9uPC9BCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCIKKz5TREwgRXZlbnQgU3RydWN0dXJlcy48L0EKKz48L0RUCis+PERUCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCis+RXZlbnQgRnVuY3Rpb25zLjwvQQorPjwvRFQKKz48L0RMCis+PC9ERAorPjxEVAorPjkuIDxBCitIUkVGPSJqb3lzdGljay5odG1sIgorPkpveXN0aWNrPC9BCis+PC9EVAorPjxERAorPjxETAorPjxEVAorPjxBCitIUkVGPSJzZGxudW1qb3lzdGlja3MuaHRtbCIKKz5TRExfTnVtSm95c3RpY2tzPC9BCis+Jm5ic3A7LS0mbmJzcDtDb3VudCBhdmFpbGFibGUgam95c3RpY2tzLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tuYW1lLmh0bWwiCis+U0RMX0pveXN0aWNrTmFtZTwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IGpveXN0aWNrIG5hbWUuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKKz5TRExfSm95c3RpY2tPcGVuPC9BCis+Jm5ic3A7LS0mbmJzcDtPcGVucyBhIGpveXN0aWNrIGZvciB1c2UuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lzdGlja29wZW5lZC5odG1sIgorPlNETF9Kb3lzdGlja09wZW5lZDwvQQorPiZuYnNwOy0tJm5ic3A7RGV0ZXJtaW5lIGlmIGEgam95c3RpY2sgaGFzIGJlZW4gb3BlbmVkPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lzdGlja2luZGV4Lmh0bWwiCis+U0RMX0pveXN0aWNrSW5kZXg8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgaW5kZXggb2YgYW4gU0RMX0pveXN0aWNrLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1heGVzLmh0bWwiCis+U0RMX0pveXN0aWNrTnVtQXhlczwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBudW1iZXIgb2Ygam95c3RpY2sgYXhlczwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1iYWxscy5odG1sIgorPlNETF9Kb3lzdGlja051bUJhbGxzPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIG51bWJlciBvZiBqb3lzdGljayB0cmFja2JhbGxzPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWhhdHMuaHRtbCIKKz5TRExfSm95c3RpY2tOdW1IYXRzPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIG51bWJlciBvZiBqb3lzdGljayBoYXRzPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWJ1dHRvbnMuaHRtbCIKKz5TRExfSm95c3RpY2tOdW1CdXR0b25zPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIG51bWJlciBvZiBqb3lzaXRjayBidXR0b25zPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lzdGlja3VwZGF0ZS5odG1sIgorPlNETF9Kb3lzdGlja1VwZGF0ZTwvQQorPiZuYnNwOy0tJm5ic3A7VXBkYXRlcyB0aGUgc3RhdGUgb2YgYWxsIGpveXN0aWNrczwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tnZXRheGlzLmh0bWwiCis+U0RMX0pveXN0aWNrR2V0QXhpczwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIGF4aXM8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0aGF0Lmh0bWwiCis+U0RMX0pveXN0aWNrR2V0SGF0PC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBqb3lzdGljayBoYXQ8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YnV0dG9uLmh0bWwiCis+U0RMX0pveXN0aWNrR2V0QnV0dG9uPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBnaXZlbiBidXR0b24gb24gYSBnaXZlbiBqb3lzdGljazwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tnZXRiYWxsLmh0bWwiCis+U0RMX0pveXN0aWNrR2V0QmFsbDwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHJlbGF0aXZlIHRyYWNrYmFsbCBtb3Rpb248L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGpveXN0aWNrY2xvc2UuaHRtbCIKKz5TRExfSm95c3RpY2tDbG9zZTwvQQorPiZuYnNwOy0tJm5ic3A7Q2xvc2VzIGEgcHJldmlvdXNseSBvcGVuZWQgam95c3RpY2s8L0RUCis+PC9ETAorPjwvREQKKz48RFQKKz4xMC4gPEEKK0hSRUY9ImF1ZGlvLmh0bWwiCis+QXVkaW88L0EKKz48L0RUCis+PERECis+PERMCis+PERUCis+PEEKK0hSRUY9InNkbGF1ZGlvc3BlYy5odG1sIgorPlNETF9BdWRpb1NwZWM8L0EKKz4mbmJzcDstLSZuYnNwO0F1ZGlvIFNwZWNpZmljYXRpb24gU3RydWN0dXJlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxvcGVuYXVkaW8uaHRtbCIKKz5TRExfT3BlbkF1ZGlvPC9BCis+Jm5ic3A7LS0mbmJzcDtPcGVucyB0aGUgYXVkaW8gZGV2aWNlIHdpdGggdGhlIGRlc2lyZWQgcGFyYW1ldGVycy48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHBhdXNlYXVkaW8uaHRtbCIKKz5TRExfUGF1c2VBdWRpbzwvQQorPiZuYnNwOy0tJm5ic3A7UGF1c2VzIGFuZCB1bnBhdXNlcyB0aGUgYXVkaW8gY2FsbGJhY2sgcHJvY2Vzc2luZzwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0YXVkaW9zdGF0dXMuaHRtbCIKKz5TRExfR2V0QXVkaW9TdGF0dXM8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgY3VycmVudCBhdWRpbyBzdGF0ZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbG9hZHdhdi5odG1sIgorPlNETF9Mb2FkV0FWPC9BCis+Jm5ic3A7LS0mbmJzcDtMb2FkIGEgV0FWRSBmaWxlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxmcmVld2F2Lmh0bWwiCis+U0RMX0ZyZWVXQVY8L0EKKz4mbmJzcDstLSZuYnNwO0ZyZWVzIHByZXZpb3VzbHkgb3BlbmVkIFdBViBkYXRhPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxhdWRpb2N2dC5odG1sIgorPlNETF9BdWRpb0NWVDwvQQorPiZuYnNwOy0tJm5ic3A7QXVkaW8gQ29udmVyc2lvbiBTdHJ1Y3R1cmU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGJ1aWxkYXVkaW9jdnQuaHRtbCIKKz5TRExfQnVpbGRBdWRpb0NWVDwvQQorPiZuYnNwOy0tJm5ic3A7SW5pdGlhbGl6ZXMgYSBTRExfQXVkaW9DVlQgc3RydWN0dXJlIGZvciBjb252ZXJzaW9uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjb252ZXJ0YXVkaW8uaHRtbCIKKz5TRExfQ29udmVydEF1ZGlvPC9BCis+Jm5ic3A7LS0mbmJzcDtDb252ZXJ0IGF1ZGlvIGRhdGEgdG8gYSBkZXNpcmVkIGF1ZGlvIGZvcm1hdC48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbG1peGF1ZGlvLmh0bWwiCis+U0RMX01peEF1ZGlvPC9BCis+Jm5ic3A7LS0mbmJzcDtNaXggYXVkaW8gZGF0YTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbG9ja2F1ZGlvLmh0bWwiCis+U0RMX0xvY2tBdWRpbzwvQQorPiZuYnNwOy0tJm5ic3A7TG9jayBvdXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGx1bmxvY2thdWRpby5odG1sIgorPlNETF9VbmxvY2tBdWRpbzwvQQorPiZuYnNwOy0tJm5ic3A7VW5sb2NrIHRoZSBjYWxsYmFjayBmdW5jdGlvbjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2xvc2VhdWRpby5odG1sIgorPlNETF9DbG9zZUF1ZGlvPC9BCis+Jm5ic3A7LS0mbmJzcDtTaHV0cyBkb3duIGF1ZGlvIHByb2Nlc3NpbmcgYW5kIGNsb3NlcyB0aGUgYXVkaW8gZGV2aWNlLjwvRFQKKz48L0RMCis+PC9ERAorPjxEVAorPjExLiA8QQorSFJFRj0iY2Ryb20uaHRtbCIKKz5DRC1ST008L0EKKz48L0RUCis+PERECis+PERMCis+PERUCis+PEEKK0hSRUY9InNkbGNkbnVtZHJpdmVzLmh0bWwiCis+U0RMX0NETnVtRHJpdmVzPC9BCis+Jm5ic3A7LS0mbmJzcDtSZXR1cm5zIHRoZSBudW1iZXIgb2YgQ0QtUk9NIGRyaXZlcyBvbiB0aGUgc3lzdGVtLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RuYW1lLmh0bWwiCis+U0RMX0NETmFtZTwvQQorPiZuYnNwOy0tJm5ic3A7UmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlLCBzeXN0ZW0tZGVwZW5kZW50IGlkZW50aWZpZXIgZm9yIHRoZSBDRC1ST00uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjZG9wZW4uaHRtbCIKKz5TRExfQ0RPcGVuPC9BCis+Jm5ic3A7LS0mbmJzcDtPcGVucyBhIENELVJPTSBkcml2ZSBmb3IgYWNjZXNzLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RzdGF0dXMuaHRtbCIKKz5TRExfQ0RTdGF0dXM8L0EKKz4mbmJzcDstLSZuYnNwO1JldHVybnMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBnaXZlbiBkcml2ZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNkcGxheS5odG1sIgorPlNETF9DRFBsYXk8L0EKKz4mbmJzcDstLSZuYnNwO1BsYXkgYSBDRDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2RwbGF5dHJhY2tzLmh0bWwiCis+U0RMX0NEUGxheVRyYWNrczwvQQorPiZuYnNwOy0tJm5ic3A7UGxheSB0aGUgZ2l2ZW4gQ0QgdHJhY2socyk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNkcGF1c2UuaHRtbCIKKz5TRExfQ0RQYXVzZTwvQQorPiZuYnNwOy0tJm5ic3A7UGF1c2VzIGEgQ0RST008L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNkcmVzdW1lLmh0bWwiCis+U0RMX0NEUmVzdW1lPC9BCis+Jm5ic3A7LS0mbmJzcDtSZXN1bWVzIGEgQ0RST008L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNkc3RvcC5odG1sIgorPlNETF9DRFN0b3A8L0EKKz4mbmJzcDstLSZuYnNwO1N0b3BzIGEgQ0RST008L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNkZWplY3QuaHRtbCIKKz5TRExfQ0RFamVjdDwvQQorPiZuYnNwOy0tJm5ic3A7RWplY3RzIGEgQ0RST008L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNkY2xvc2UuaHRtbCIKKz5TRExfQ0RDbG9zZTwvQQorPiZuYnNwOy0tJm5ic3A7Q2xvc2VzIGEgU0RMX0NEIGhhbmRsZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY2QuaHRtbCIKKz5TRExfQ0Q8L0EKKz4mbmJzcDstLSZuYnNwO0NEUk9NIERyaXZlIEluZm9ybWF0aW9uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjZHRyYWNrLmh0bWwiCis+U0RMX0NEdHJhY2s8L0EKKz4mbmJzcDstLSZuYnNwO0NEIFRyYWNrIEluZm9ybWF0aW9uIFN0cnVjdHVyZTwvRFQKKz48L0RMCis+PC9ERAorPjxEVAorPjEyLiA8QQorSFJFRj0idGhyZWFkLmh0bWwiCis+TXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmc8L0EKKz48L0RUCis+PERECis+PERMCis+PERUCis+PEEKK0hSRUY9InNkbGNyZWF0ZXRocmVhZC5odG1sIgorPlNETF9DcmVhdGVUaHJlYWQ8L0EKKz4mbmJzcDstLSZuYnNwO0NyZWF0ZXMgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbiB0aGF0IHNoYXJlcyBpdHMgcGFyZW50J3MgcHJvcGVydGllcy48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHRocmVhZGlkLmh0bWwiCis+U0RMX1RocmVhZElEPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIDMyLWJpdCB0aHJlYWQgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0dGhyZWFkaWQuaHRtbCIKKz5TRExfR2V0VGhyZWFkSUQ8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgU0RMIHRocmVhZCBJRCBvZiBhIFNETF9UaHJlYWQ8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHdhaXR0aHJlYWQuaHRtbCIKKz5TRExfV2FpdFRocmVhZDwvQQorPiZuYnNwOy0tJm5ic3A7V2FpdCBmb3IgYSB0aHJlYWQgdG8gZmluaXNoLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsa2lsbHRocmVhZC5odG1sIgorPlNETF9LaWxsVGhyZWFkPC9BCis+Jm5ic3A7LS0mbmJzcDtHcmFjZWxlc3NseSB0ZXJtaW5hdGVzIHRoZSB0aHJlYWQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjcmVhdGVtdXRleC5odG1sIgorPlNETF9DcmVhdGVNdXRleDwvQQorPiZuYnNwOy0tJm5ic3A7Q3JlYXRlIGEgbXV0ZXg8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGRlc3Ryb3ltdXRleC5odG1sIgorPlNETF9EZXN0cm95TXV0ZXg8L0EKKz4mbmJzcDstLSZuYnNwO0Rlc3Ryb3kgYSBtdXRleDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbXV0ZXhwLmh0bWwiCis+U0RMX211dGV4UDwvQQorPiZuYnNwOy0tJm5ic3A7TG9jayBhIG11dGV4PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxtdXRleHYuaHRtbCIKKz5TRExfbXV0ZXhWPC9BCis+Jm5ic3A7LS0mbmJzcDtVbmxvY2sgYSBtdXRleDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiCis+U0RMX0NyZWF0ZVNlbWFwaG9yZTwvQQorPiZuYnNwOy0tJm5ic3A7Q3JlYXRlcyBhIG5ldyBzZW1hcGhvcmUgYW5kIGFzc2lnbnMgYW4gaW5pdGlhbCB2YWx1ZSB0byBpdC48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGRlc3Ryb3lzZW1hcGhvcmUuaHRtbCIKKz5TRExfRGVzdHJveVNlbWFwaG9yZTwvQQorPiZuYnNwOy0tJm5ic3A7RGVzdHJveXMgYSBzZW1hcGhvcmUgdGhhdCB3YXMgY3JlYXRlZCBieSA8QQorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiCis+U0RMX0NyZWF0ZVNlbWFwaG9yZTwvQQorPi48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNlbXdhaXQuaHRtbCIKKz5TRExfU2VtV2FpdDwvQQorPiZuYnNwOy0tJm5ic3A7TG9jayBhIHNlbWFwaG9yZSBhbmQgc3VzcGVuZCB0aGUgdGhyZWFkIGlmIHRoZSBzZW1hcGhvcmUgdmFsdWUgaXMgemVyby48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNlbXRyeXdhaXQuaHRtbCIKKz5TRExfU2VtVHJ5V2FpdDwvQQorPiZuYnNwOy0tJm5ic3A7QXR0ZW1wdCB0byBsb2NrIGEgc2VtYXBob3JlIGJ1dCBkb24ndCBzdXNwZW5kIHRoZSB0aHJlYWQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZW13YWl0dGltZW91dC5odG1sIgorPlNETF9TZW1XYWl0VGltZW91dDwvQQorPiZuYnNwOy0tJm5ic3A7TG9jayBhIHNlbWFwaG9yZSwgYnV0IG9ubHkgd2FpdCB1cCB0byBhIHNwZWNpZmllZCBtYXhpbXVtIHRpbWUuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZW1wb3N0Lmh0bWwiCis+U0RMX1NlbVBvc3Q8L0EKKz4mbmJzcDstLSZuYnNwO1VubG9jayBhIHNlbWFwaG9yZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNlbXZhbHVlLmh0bWwiCis+U0RMX1NlbVZhbHVlPC9BCis+Jm5ic3A7LS0mbmJzcDtSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBzZW1hcGhvcmUuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjcmVhdGVjb25kLmh0bWwiCis+U0RMX0NyZWF0ZUNvbmQ8L0EKKz4mbmJzcDstLSZuYnNwO0NyZWF0ZSBhIGNvbmRpdGlvbiB2YXJpYWJsZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZGVzdHJveWNvbmQuaHRtbCIKKz5TRExfRGVzdHJveUNvbmQ8L0EKKz4mbmJzcDstLSZuYnNwO0Rlc3Ryb3kgYSBjb25kaXRpb24gdmFyaWFibGU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNvbmRzaWduYWwuaHRtbCIKKz5TRExfQ29uZFNpZ25hbDwvQQorPiZuYnNwOy0tJm5ic3A7UmVzdGFydCBhIHRocmVhZCB3YWl0IG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjb25kYnJvYWRjYXN0Lmh0bWwiCis+U0RMX0NvbmRCcm9hZGNhc3Q8L0EKKz4mbmJzcDstLSZuYnNwO1Jlc3RhcnQgYWxsIHRocmVhZHMgd2FpdGluZyBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY29uZHdhaXQuaHRtbCIKKz5TRExfQ29uZFdhaXQ8L0EKKz4mbmJzcDstLSZuYnNwO1dhaXQgb24gYSBjb25kaXRpb24gdmFyaWFibGU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNvbmR3YWl0dGltZW91dC5odG1sIgorPlNETF9Db25kV2FpdFRpbWVvdXQ8L0EKKz4mbmJzcDstLSZuYnNwO1dhaXQgb24gYSBjb25kaXRpb24gdmFyaWFibGUsIHdpdGggdGltZW91dDwvRFQKKz48L0RMCis+PC9ERAorPjxEVAorPjEzLiA8QQorSFJFRj0idGltZS5odG1sIgorPlRpbWU8L0EKKz48L0RUCis+PERECis+PERMCis+PERUCis+PEEKK0hSRUY9InNkbGdldHRpY2tzLmh0bWwiCis+U0RMX0dldFRpY2tzPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIFNETCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZGVsYXkuaHRtbCIKKz5TRExfRGVsYXk8L0EKKz4mbmJzcDstLSZuYnNwO1dhaXQgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmV0dXJuaW5nLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsYWRkdGltZXIuaHRtbCIKKz5TRExfQWRkVGltZXI8L0EKKz4mbmJzcDstLSZuYnNwO0FkZCBhIHRpbWVyIHdoaWNoIHdpbGwgY2FsbCBhIGNhbGxiYWNrIGFmdGVyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXMKK2VsYXBzZWQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxyZW1vdmV0aW1lci5odG1sIgorPlNETF9SZW1vdmVUaW1lcjwvQQorPiZuYnNwOy0tJm5ic3A7UmVtb3ZlIGEgdGltZXIgd2hpY2ggd2FzIGFkZGVkIHdpdGgKKzxBCitIUkVGPSJzZGxhZGR0aW1lci5odG1sIgorPlNETF9BZGRUaW1lcjwvQQorPi48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNldHRpbWVyLmh0bWwiCis+U0RMX1NldFRpbWVyPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXQgYSBjYWxsYmFjayB0byBydW4gYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGhhcworZWxhcHNlZC48L0RUCis+PC9ETAorPjwvREQKKz48L0RMCis+PC9ERAorPjwvREwKKz48L0RJVgorPjxESVYKK0NMQVNTPSJMT1QiCis+PERMCitDTEFTUz0iTE9UIgorPjxEVAorPjxCCis+TGlzdCBvZiBUYWJsZXM8L0IKKz48L0RUCis+PERUCis+OC0xLiA8QQorSFJFRj0ic2Rsa2V5Lmh0bWwjQUVONDcyMCIKKz5TREwgS2V5c3ltIGRlZmluaXRpb25zPC9BCis+PC9EVAorPjxEVAorPjgtMi4gPEEKK0hSRUY9InNkbGtleS5odG1sI1NETE1PRCIKKz5TREwgbW9kaWZpZXIgZGVmaW5pdGlvbnM8L0EKKz48L0RUCis+PC9ETAorPjwvRElWCis+PERJVgorQ0xBU1M9IkxPVCIKKz48REwKK0NMQVNTPSJMT1QiCis+PERUCis+PEIKKz5MaXN0IG9mIEV4YW1wbGVzPC9CCis+PC9EVAorPjxEVAorPjEtMS4gPEEKK0hSRUY9Imd1aWRlYmFzaWNzaW5pdC5odG1sI0FFTjYwIgorPkluaXRpYWxpemluZyBTREw8L0EKKz48L0RUCis+PERUCis+Mi0xLiA8QQorSFJFRj0iZ3VpZGV2aWRlby5odG1sI0FFTjcxIgorPkluaXRpYWxpemluZyB0aGUgVmlkZW8gRGlzcGxheTwvQQorPjwvRFQKKz48RFQKKz4yLTIuIDxBCitIUkVGPSJndWlkZXZpZGVvLmh0bWwjQUVONzciCis+SW5pdGlhbGl6aW5nIHRoZSBCZXN0IFZpZGVvIE1vZGU8L0EKKz48L0RUCis+PERUCis+Mi0zLiA8QQorSFJFRj0iZ3VpZGV2aWRlby5odG1sI0FFTjgzIgorPkxvYWRpbmcgYW5kIERpc3BsYXlpbmcgYSBCTVAgRmlsZTwvQQorPjwvRFQKKz48RFQKKz4yLTQuIDxBCitIUkVGPSJndWlkZXZpZGVvLmh0bWwjQUVOOTAiCis+Z2V0cGl4ZWwoKTwvQQorPjwvRFQKKz48RFQKKz4yLTUuIDxBCitIUkVGPSJndWlkZXZpZGVvLmh0bWwjQUVOOTMiCis+cHV0cGl4ZWwoKTwvQQorPjwvRFQKKz48RFQKKz4yLTYuIDxBCitIUkVGPSJndWlkZXZpZGVvLmh0bWwjQUVOOTciCis+VXNpbmcgcHV0cGl4ZWwoKTwvQQorPjwvRFQKKz48RFQKKz4yLTcuIDxBCitIUkVGPSJndWlkZXZpZGVvb3BlbmdsLmh0bWwjQUVOMTE0IgorPkluaXRpYWxpemluZyBTREwgd2l0aCBPcGVuR0w8L0EKKz48L0RUCis+PERUCis+Mi04LiA8QQorSFJFRj0iZ3VpZGV2aWRlb29wZW5nbC5odG1sI0FFTjEyOCIKKz5TREwgYW5kIE9wZW5HTDwvQQorPjwvRFQKKz48RFQKKz4zLTEuIDxBCitIUkVGPSJndWlkZWlucHV0Lmh0bWwjQUVOMTQxIgorPkluaXRpYWxpemluZyBTREwgd2l0aCBKb3lzdGljayBTdXBwb3J0PC9BCis+PC9EVAorPjxEVAorPjMtMi4gPEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCNBRU4xNTQiCis+UXVlcnlpbmcgdGhlIE51bWJlciBvZiBBdmFpbGFibGUgSm95c3RpY2tzPC9BCis+PC9EVAorPjxEVAorPjMtMy4gPEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCNBRU4xODMiCis+T3BlbmluZyBhIEpveXN0aWNrPC9BCis+PC9EVAorPjxEVAorPjMtNC4gPEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCNBRU4xOTEiCis+Sm95c3RpY2sgQXhpcyBFdmVudHM8L0EKKz48L0RUCis+PERUCis+My01LiA8QQorSFJFRj0iZ3VpZGVpbnB1dC5odG1sI0FFTjE5NSIKKz5Nb3JlIEpveXN0aWNrIEF4aXMgRXZlbnRzPC9BCis+PC9EVAorPjxEVAorPjMtNi4gPEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCNBRU4yMDMiCis+Sm95c3RpY2sgQnV0dG9uIEV2ZW50czwvQQorPjwvRFQKKz48RFQKKz4zLTcuIDxBCitIUkVGPSJndWlkZWlucHV0Lmh0bWwjQUVOMjE3IgorPkpveXN0aWNrIEJhbGwgRXZlbnRzPC9BCis+PC9EVAorPjxEVAorPjMtOC4gPEEKK0hSRUY9Imd1aWRlaW5wdXQuaHRtbCNBRU4yNDQiCis+Sm95c3RpY2sgSGF0IEV2ZW50czwvQQorPjwvRFQKKz48RFQKKz4zLTkuIDxBCitIUkVGPSJndWlkZWlucHV0Lmh0bWwjQUVOMjY1IgorPlF1ZXJ5aW5nIEpveXN0aWNrIENoYXJhY3RlcmlzdGljczwvQQorPjwvRFQKKz48RFQKKz4zLTEwLiA8QQorSFJFRj0iZ3VpZGVpbnB1dGtleWJvYXJkLmh0bWwjQUVOMzM0IgorPlJlYWRpbmcgS2V5Ym9hcmQgRXZlbnRzPC9BCis+PC9EVAorPjxEVAorPjMtMTEuIDxBCitIUkVGPSJndWlkZWlucHV0a2V5Ym9hcmQuaHRtbCNBRU4zNTEiCis+SW50ZXJwcmV0aW5nIEtleSBFdmVudCBJbmZvcm1hdGlvbjwvQQorPjwvRFQKKz48RFQKKz4zLTEyLiA8QQorSFJFRj0iZ3VpZGVpbnB1dGtleWJvYXJkLmh0bWwjQUVOMzYzIgorPlByb3BlciBHYW1lIE1vdmVtZW50PC9BCis+PC9EVAorPjwvREwKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ3VpZGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETCBHdWlkZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9qb3lzdGljay5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9qb3lzdGljay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGEwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL2pveXN0aWNrLmh0bWwKQEAgLTAsMCArMSwyOTYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5Kb3lzdGljazwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgUmVmZXJlbmNlIgorSFJFRj0icmVmZXJlbmNlLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Kb3lzdGlja0V2ZW50U3RhdGUiCitIUkVGPSJzZGxqb3lzdGlja2V2ZW50c3RhdGUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfTnVtSm95c3RpY2tzIgorSFJFRj0ic2RsbnVtam95c3RpY2tzLmh0bWwiPjxNRVRBCitOQU1FPSJLRVlXT1JEIgorQ09OVEVOVD0iam95c3RpY2siPjxNRVRBCitOQU1FPSJLRVlXT1JEIgorQ09OVEVOVD0iZnVuY3Rpb24iPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iQ0hBUFRFUiIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tldmVudHN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxudW1qb3lzdGlja3MuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxESVYKK0NMQVNTPSJDSEFQVEVSIgorPjxIMQorPjxBCitOQU1FPSJKT1lTVElDSyIKKz48L0EKKz5DaGFwdGVyIDkuIEpveXN0aWNrPC9IMQorPjxESVYKK0NMQVNTPSJUT0MiCis+PERMCis+PERUCis+PEIKKz5UYWJsZSBvZiBDb250ZW50czwvQgorPjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbnVtam95c3RpY2tzLmh0bWwiCis+U0RMX051bUpveXN0aWNrczwvQQorPiZuYnNwOy0tJm5ic3A7Q291bnQgYXZhaWxhYmxlIGpveXN0aWNrcy48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGpveXN0aWNrbmFtZS5odG1sIgorPlNETF9Kb3lzdGlja05hbWU8L0EKKz4mbmJzcDstLSZuYnNwO0dldCBqb3lzdGljayBuYW1lLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tvcGVuLmh0bWwiCis+U0RMX0pveXN0aWNrT3BlbjwvQQorPiZuYnNwOy0tJm5ic3A7T3BlbnMgYSBqb3lzdGljayBmb3IgdXNlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tvcGVuZWQuaHRtbCIKKz5TRExfSm95c3RpY2tPcGVuZWQ8L0EKKz4mbmJzcDstLSZuYnNwO0RldGVybWluZSBpZiBhIGpveXN0aWNrIGhhcyBiZWVuIG9wZW5lZDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tpbmRleC5odG1sIgorPlNETF9Kb3lzdGlja0luZGV4PC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIGluZGV4IG9mIGFuIFNETF9Kb3lzdGljay48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGpveXN0aWNrbnVtYXhlcy5odG1sIgorPlNETF9Kb3lzdGlja051bUF4ZXM8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgbnVtYmVyIG9mIGpveXN0aWNrIGF4ZXM8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGpveXN0aWNrbnVtYmFsbHMuaHRtbCIKKz5TRExfSm95c3RpY2tOdW1CYWxsczwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBudW1iZXIgb2Ygam95c3RpY2sgdHJhY2tiYWxsczwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1oYXRzLmh0bWwiCis+U0RMX0pveXN0aWNrTnVtSGF0czwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBudW1iZXIgb2Ygam95c3RpY2sgaGF0czwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1idXR0b25zLmh0bWwiCis+U0RMX0pveXN0aWNrTnVtQnV0dG9uczwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBudW1iZXIgb2Ygam95c2l0Y2sgYnV0dG9uczwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsam95c3RpY2t1cGRhdGUuaHRtbCIKKz5TRExfSm95c3RpY2tVcGRhdGU8L0EKKz4mbmJzcDstLSZuYnNwO1VwZGF0ZXMgdGhlIHN0YXRlIG9mIGFsbCBqb3lzdGlja3M8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YXhpcy5odG1sIgorPlNETF9Kb3lzdGlja0dldEF4aXM8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBheGlzPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lzdGlja2dldGhhdC5odG1sIgorPlNETF9Kb3lzdGlja0dldEhhdDwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgam95c3RpY2sgaGF0PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lzdGlja2dldGJ1dHRvbi5odG1sIgorPlNETF9Kb3lzdGlja0dldEJ1dHRvbjwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ2l2ZW4gYnV0dG9uIG9uIGEgZ2l2ZW4gam95c3RpY2s8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YmFsbC5odG1sIgorPlNETF9Kb3lzdGlja0dldEJhbGw8L0EKKz4mbmJzcDstLSZuYnNwO0dldCByZWxhdGl2ZSB0cmFja2JhbGwgbW90aW9uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxqb3lzdGlja2Nsb3NlLmh0bWwiCis+U0RMX0pveXN0aWNrQ2xvc2U8L0EKKz4mbmJzcDstLSZuYnNwO0Nsb3NlcyBhIHByZXZpb3VzbHkgb3BlbmVkIGpveXN0aWNrPC9EVAorPjwvREwKKz48L0RJVgorPjxQCis+Sm95c3RpY2tzLCBhbmQgb3RoZXIgc2ltaWxhciBpbnB1dCBkZXZpY2VzLCBoYXZlIGEgdmVyeSBzdHJvbmcgcm9sZSBpbiBnYW1lIHBsYXlpbmcgYW5kIFNETCBwcm92aWRlcyBjb21wcmVoZW5zaXZlIHN1cHBvcnQgZm9yIHRoZW0uIEF4ZXMsIEJ1dHRvbnMsIFBPViBIYXRzIGFuZCB0cmFja2JhbGxzIGFyZSBhbGwgc3VwcG9ydGVkLjwvUAorPjxQCis+Sm95c3RpY2sgc3VwcG9ydCBpcyBpbml0aWFsaXplZCBieSBwYXNzZWQgdGhlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0lOSVRfSk9ZU1RJQ0s8L1RUCis+IGZsYWcgdG8gPEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdDwvVFQKKz48L0EKKz4uIE9uY2UgaW5pdGlsaXplZCBqb3lzdGlja3MgbXVzdCBiZSBvcGVuZWQgdXNpbmcgPEEKK0hSRUY9InNkbGpveXN0aWNrb3Blbi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja09wZW48L1RUCis+PC9BCis+LjwvUAorPjxQCis+V2hpbGUgdXNpbmcgdGhlIGZ1bmN0aW9ucyBkZXNjcmliZSBpbiB0aGlzIHNlY3RvbiBtYXkgc2VlbSBsaWtlIHRoZSBiZXN0IHdheSB0byBhY2Nlc3MgYW5kIHJlYWQgZnJvbSBqb3lzdGlja3MsIGluIG1vc3QgY2FzZXMgdGhleSBhcmVuJ3QuIElkZWFsbHkgam95c3RpY2tzIHNob3VsZCBiZSByZWFkIHVzaW5nIHRoZSA8QQorSFJFRj0iZXZlbnQuaHRtbCIKKz5ldmVudDwvQQorPiBzeXN0ZW0uIFRvIGVuYWJsZSB0aGlzLCB5b3UgbXVzdCBzZXQgdGhlIGpveXN0aWNrIGV2ZW50IHByb2Nlc3Npbmcgc3RhdGUgd2l0aCA8QQorSFJFRj0ic2Rsam95c3RpY2tldmVudHN0YXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrRXZlbnRTdGF0ZTwvVFQKKz48L0EKKz4uIEpveXN0aWNrcyBtdXN0IGJlIDxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKKz5vcGVuZWQ8L0EKKz4gYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQgb2YgY291cnNlLjwvUAorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+SWYgeW91IGFyZSA8U1BBTgorQ0xBU1M9ImVtcGhhc2lzIgorPjxJCitDTEFTUz0iRU1QSEFTSVMiCis+bm90PC9JCis+PC9TUEFOCis+IGhhbmRsaW5nIHRoZSBqb3lzdGljayB2aWEgdGhlIGV2ZW50IHF1ZXVlIHRoZW4geW91IG11c3QgZXhwbGljaXRseSByZXF1ZXN0IGEgam95c3RpY2sgdXBkYXRlIGJ5IGNhbGxpbmcgPEEKK0hSRUY9InNkbGpveXN0aWNrdXBkYXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrVXBkYXRlPC9UVAorPjwvQQorPi48L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+Rm9yY2UgRmVlZGJhY2sgaXMgbm90IHlldCBzdXBwb3J0ZWQuIFNhbSAoc2xvdWtlbkBsaWJzZGwub3JnKSBpcyBzb2xpY2l0aW5nIHN1Z2dlc3Rpb25zIGZyb20gcGVvcGxlIHdpdGggZm9yY2UtZmVlZGJhY2sgZXhwZXJpZW5jZSBvbiB0aGUgYmVzdCB3YXkgdG8gZGVzaWduIHRoZSBBUEkuPC9QCis+PC9CTE9DS1FVT1RFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZXZlbnRzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbG51bWpveXN0aWNrcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveXN0aWNrRXZlbnRTdGF0ZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InJlZmVyZW5jZS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9OdW1Kb3lzdGlja3M8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvcmVmZXJlbmNlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3JlZmVyZW5jZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NzA3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3JlZmVyZW5jZS5odG1sCkBAIC0wLDAgKzEsMTk0IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMIFJlZmVyZW5jZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJUaW1lIEV4YW1wbGVzIgorSFJFRj0iZ3VpZGV0aW1lZXhhbXBsZXMuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJHZW5lcmFsIgorSFJFRj0iZ2VuZXJhbC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlBBUlQiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9Imd1aWRldGltZWV4YW1wbGVzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJnZW5lcmFsLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iUEFSVCIKKz48QQorTkFNRT0iUkVGRVJFTkNFIgorPjwvQQorPjxESVYKK0NMQVNTPSJUSVRMRVBBR0UiCis+PEgxCitDTEFTUz0iVElUTEUiCis+SUkuIFNETCBSZWZlcmVuY2U8L0gxCis+PERJVgorQ0xBU1M9IlRPQyIKKz48REwKKz48RFQKKz48QgorPlRhYmxlIG9mIENvbnRlbnRzPC9CCis+PC9EVAorPjxEVAorPjUuIDxBCitIUkVGPSJnZW5lcmFsLmh0bWwiCis+R2VuZXJhbDwvQQorPjwvRFQKKz48RFQKKz42LiA8QQorSFJFRj0idmlkZW8uaHRtbCIKKz5WaWRlbzwvQQorPjwvRFQKKz48RFQKKz43LiA8QQorSFJFRj0id20uaHRtbCIKKz5XaW5kb3cgTWFuYWdlbWVudDwvQQorPjwvRFQKKz48RFQKKz44LiA8QQorSFJFRj0iZXZlbnQuaHRtbCIKKz5FdmVudHM8L0EKKz48L0RUCis+PERUCis+OS4gPEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCis+Sm95c3RpY2s8L0EKKz48L0RUCis+PERUCis+MTAuIDxBCitIUkVGPSJhdWRpby5odG1sIgorPkF1ZGlvPC9BCis+PC9EVAorPjxEVAorPjExLiA8QQorSFJFRj0iY2Ryb20uaHRtbCIKKz5DRC1ST008L0EKKz48L0RUCis+PERUCis+MTIuIDxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKKz5NdWx0aS10aHJlYWRlZCBQcm9ncmFtbWluZzwvQQorPjwvRFQKKz48RFQKKz4xMy4gPEEKK0hSRUY9InRpbWUuaHRtbCIKKz5UaW1lPC9BCis+PC9EVAorPjwvREwKKz48L0RJVgorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJndWlkZXRpbWVleGFtcGxlcy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImdlbmVyYWwuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlRpbWUgRXhhbXBsZXM8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5HZW5lcmFsPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGFjdGl2ZWV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGFjdGl2ZWV2ZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmMjgyMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsYWN0aXZlZXZlbnQuaHRtbApAQCAtMCwwICsxLDMzNSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9BY3RpdmVFdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0V2ZW50IgorSFJFRj0ic2RsZXZlbnQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfS2V5Ym9hcmRFdmVudCIKK0hSRUY9InNkbGtleWJvYXJkZXZlbnQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGtleWJvYXJkZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExBQ1RJVkVFVkVOVCIKKz48L0EKKz5TRExfQWN0aXZlRXZlbnQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjM5NTUiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfQWN0aXZlRXZlbnQmbmJzcDstLSZuYnNwO0FwcGxpY2F0aW9uIHZpc2liaWxpdHkgZXZlbnQgc3RydWN0dXJlPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM5NTgiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBVaW50OCB0eXBlOworICBVaW50OCBnYWluOworICBVaW50OCBzdGF0ZTsKK30gU0RMX0FjdGl2ZUV2ZW50OzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM5NjEiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjM5NjMiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FDVElWRUVWRU5ULjwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmdhaW48L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4wIGlmIHRoZSBldmVudCBpcyBhIGxvc3Mgb3IgMSBpZiBpdCBpcyBhIGdhaW4uPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zdGF0ZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FQUE1PVVNFRk9DVVM8L1RUCis+IGlmIG1vdXNlIGZvY3VzIHdhcyBnYWluZWQgb3IgbG9zdCwgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQVBQSU5QVVRGT0NVUzwvVFQKKz4gaWYgaW5wdXQgZm9jdXMgd2FzIGdhaW5lZCBvciBsb3N0LCBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9BUFBBQ1RJVkU8L1RUCis+IGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgaWNvbmlmaWVkICg8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmdhaW48L0kKKz48L1RUCis+PTApIG9yIHJlc3RvcmVkKDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Z2FpbjwvSQorPjwvVFQKKz49MSkuPC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzk4NCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQWN0aXZlRXZlbnQ8L1NQQU4KKz4gaXMgYSBtZW1iZXIgb2YgdGhlIDxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4gdW5pb24gYW5kIGlzIHVzZWQgd2hlbiBhbiBldmVudCBvZiB0eXBlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FDVElWRUVWRU5UPC9UVAorPiBpcyByZXBvcnRlZC48L1AKKz48UAorPldoZW4gdGhlIG1vdXNlIGxlYXZlcyBvciBlbnRlcnMgdGhlIHdpbmRvdyBhcmVhIGEgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQVBQTU9VU0VGT0NVUzwvVFQKKz4gdHlwZSBhY3RpdmF0aW9uIGV2ZW50IG9jY3VycywgaWYgdGhlIG1vdXNlIGVudGVyZWQgdGhlIHdpbmRvdyB0aGVuIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Z2FpbjwvSQorPjwvVFQKKz4gd2lsbCBiZSAxLCBvdGhlcndpc2UgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5nYWluPC9JCis+PC9UVAorPiB3aWxsIGJlIDAuIEEgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQVBQSU5QVVRGT0NVUzwvVFQKKz4gdHlwZSBhY3RpdmF0aW9uIGV2ZW50IG9jY3VycyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBsb3NlcyBvciBnYWlucyBrZXlib2FyZCBmb2N1cy4gVGhpcyB1c3VhbGx5IG9jY3VycyB3aGVuIGFub3RoZXIgYXBwbGljYXRpb24gaXMgbWFkZSBhY3RpdmUuIEZpbmFsbHksIGEgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQVBQQUNUSVZFPC9UVAorPiB0eXBlIGV2ZW50IG9jY3VycyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBlaXRoZXIgbWluaW1pc2VkL2ljb25pZmllZCAoPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5nYWluPC9JCis+PC9UVAorPj0wKSBvciByZXN0b3JlZC48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPlRoaXMgZXZlbnQgZG9lcyBub3Qgb2NjdXIgd2hlbiBhbiBhcHBsaWNhdGlvbiB3aW5kb3cgaXMgZmlyc3QgY3JlYXRlZC48L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MDAwIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxnZXRhcHBzdGF0ZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRBcHBTdGF0ZTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsa2V5Ym9hcmRldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0V2ZW50PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0tleWJvYXJkRXZlbnQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsYWRkdGltZXIuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsYWRkdGltZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWM0OWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxhZGR0aW1lci5odG1sCkBAIC0wLDAgKzEsMjk2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0FkZFRpbWVyPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlRpbWUiCitIUkVGPSJ0aW1lLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9EZWxheSIKK0hSRUY9InNkbGRlbGF5Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1JlbW92ZVRpbWVyIgorSFJFRj0ic2RscmVtb3ZldGltZXIuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZGVsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHJlbW92ZXRpbWVyLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQUREVElNRVIiCis+PC9BCis+U0RMX0FkZFRpbWVyPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU44NDgyIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0FkZFRpbWVyJm5ic3A7LS0mbmJzcDtBZGQgYSB0aW1lciB3aGljaCB3aWxsIGNhbGwgYSBjYWxsYmFjayBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGFzCitlbGFwc2VkLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU44NDg1IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjg0ODYiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9UaW1lcklEIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9BZGRUaW1lcjwvQgorPjwvQ09ERQorPihVaW50MzIgaW50ZXJ2YWwsIFNETF9OZXdUaW1lckNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwYXJhbSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJTRExORVdUSU1FUkNBTExCQUNLIgorPjwvQQorPjxIMgorPkNhbGxiYWNrPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4vKiB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSAibmV3IiB0aW1lciBjYWxsYmFjayBmdW5jdGlvbiAqLwordHlwZWRlZiBVaW50MzIgKCpTRExfTmV3VGltZXJDYWxsYmFjaykoVWludDMyIGludGVydmFsLCB2b2lkICpwYXJhbSk7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODQ5NSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBydW4gYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YKK21pbGxpc2Vjb25kcyBoYXMgZWxhcHNlZC4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgY3VycmVudAordGltZXIgaW50ZXJ2YWwgYW5kIHRoZSB1c2VyIHN1cHBsaWVkIHBhcmFtZXRlciBmcm9tIHRoZQorPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0FkZFRpbWVyPC9UVAorPiBjYWxsIGFuZCByZXR1cm5zIHRoZSBuZXh0IHRpbWVyCitpbnRlcnZhbC4gSWYgdGhlIHJldHVybmVkIHZhbHVlIGZyb20gdGhlIGNhbGxiYWNrIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUKK3Bhc3NlZCBpbiwgdGhlIHBlcmlvZGljIGFsYXJtIGNvbnRpbnVlcywgb3RoZXJ3aXNlIGEgbmV3IGFsYXJtIGlzCitzY2hlZHVsZWQuPC9QCis+PFAKKz5UbyBjYW5jZWwgYSBjdXJyZW50bHkgcnVubmluZyB0aW1lciBjYWxsCis8QQorSFJFRj0ic2RscmVtb3ZldGltZXIuaHRtbCIKKz5TRExfUmVtb3ZlVGltZXI8L0EKKz4gd2l0aCB0aGUKK3RpbWVyIElEIHJldHVybmVkIGZyb20KKzxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9BZGRUaW1lcjwvVFQKKz4uPC9QCis+PFAKKz5UaGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gbWF5IHJ1biBpbiBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB5b3VyCittYWluIHByb2dyYW0sIGFuZCBzbyBzaG91bGRuJ3QgY2FsbCBhbnkgZnVuY3Rpb25zIGZyb20gd2l0aGluIGl0c2VsZi4KK1lvdSBtYXkgYWx3YXlzIGNhbGwgPEEKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIgorPlNETF9QdXNoRXZlbnQ8L0EKKz4sIGhvd2V2ZXIuPC9QCis+PFAKKz5UaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHRpbWVyIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IHlvdSBzaG91bGQgY291bnQKK29uIGl0IGJlaW5nIGF0IGxlYXN0IDEwIG1zIGFzIHRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIG51bWJlci4KK1RoaXMgbWVhbnMgdGhhdCBpZgoreW91IHJlcXVlc3QgYSAxNiBtcyB0aW1lciwgeW91ciBjYWxsYmFjayB3aWxsIHJ1biBhcHByb3hpbWF0ZWx5IDIwIG1zCitsYXRlciBvbiBhbiB1bmxvYWRlZCBzeXN0ZW0uICBJZiB5b3Ugd2FudGVkIHRvIHNldCBhIGZsYWcgc2lnbmFsaW5nCithIGZyYW1lIHVwZGF0ZSBhdCAzMCBmcmFtZXMgcGVyIHNlY29uZCAoZXZlcnkgMzMgbXMpLCB5b3UgbWlnaHQgc2V0IGEKK3RpbWVyIGZvciAzMCBtcyAoc2VlIGV4YW1wbGUgYmVsb3cpLgorCitJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24sIHlvdSBuZWVkIHRvIHBhc3MgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSU5JVF9USU1FUjwvVFQKKz4KK3RvIDxBCitIUkVGPSJzZGxpbml0Lmh0bWwiCis+U0RMX0luaXQ8L0EKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjg1MDciCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyBhbiBJRCB2YWx1ZSBmb3IgdGhlIGFkZGVkIHRpbWVyIG9yCis8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPk5VTEw8L1NQQU4KKz4gaWYgdGhlcmUgd2FzIGFuIGVycm9yLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44NTExIgorPjwvQQorPjxIMgorPkV4YW1wbGVzPC9IMgorPjxQCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPm15X3RpbWVyX2lkID0gU0RMX0FkZFRpbWVyKCgzMy8xMCkqMTAsIG15X2NhbGxiYWNrZnVuYywgbXlfY2FsbGJhY2tfcGFyYW0pOzwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjg1MTUiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RscmVtb3ZldGltZXIuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUmVtb3ZlVGltZXI8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QdXNoRXZlbnQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxkZWxheS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHJlbW92ZXRpbWVyLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfRGVsYXk8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aW1lLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1JlbW92ZVRpbWVyPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGF1ZGlvY3Z0Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGF1ZGlvY3Z0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzOTIwOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsYXVkaW9jdnQuaHRtbApAQCAtMCwwICsxLDU1NiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9BdWRpb0NWVDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJBdWRpbyIKK0hSRUY9ImF1ZGlvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9GcmVlV0FWIgorSFJFRj0ic2RsZnJlZXdhdi5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9CdWlsZEF1ZGlvQ1ZUIgorSFJFRj0ic2RsYnVpbGRhdWRpb2N2dC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxmcmVld2F2Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxidWlsZGF1ZGlvY3Z0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQVVESU9DVlQiCis+PC9BCis+U0RMX0F1ZGlvQ1ZUPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42ODg0IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0F1ZGlvQ1ZUJm5ic3A7LS0mbmJzcDtBdWRpbyBDb252ZXJzaW9uIFN0cnVjdHVyZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42ODg3IgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEZWZpbml0aW9uPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz50eXBlZGVmIHN0cnVjdHsKKyAgaW50IG5lZWRlZDsKKyAgVWludDE2IHNyY19mb3JtYXQ7CisgIFVpbnQxNiBkZXN0X2Zvcm1hdDsKKyAgZG91YmxlIHJhdGVfaW5jcjsKKyAgVWludDggKmJ1ZjsKKyAgaW50IGxlbjsKKyAgaW50IGxlbl9jdnQ7CisgIGludCBsZW5fbXVsdDsKKyAgZG91YmxlIGxlbl9yYXRpbzsKKyAgdm9pZCAoKmZpbHRlcnNbMTBdKShzdHJ1Y3QgU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpOworICBpbnQgZmlsdGVyX2luZGV4OworfSBTRExfQXVkaW9DVlQ7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjg5MCIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGF0YTwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVONjg5MiIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5uZWVkZWQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TZXQgdG8gb25lIGlmIHRoZSBjb252ZXJzaW9uIGlzIHBvc3NpYmxlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zcmNfZm9ybWF0PC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXVkaW8gZm9ybWF0IG9mIHRoZSBzb3VyY2U8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmRlc3RfZm9ybWF0PC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXVkaW8gZm9ybWF0IG9mIHRoZSBkZXN0aW5hdGlvbjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+cmF0ZV9pbmNyPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UmF0ZSBjb252ZXJzaW9uIGluY3JlbWVudDwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+YnVmPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXVkaW8gYnVmZmVyPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5sZW48L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5MZW5ndGggb2YgdGhlIG9yaWdpbmFsIGF1ZGlvIGJ1ZmZlciBpbiBieXRlczwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bGVuX2N2dDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkxlbmd0aCBvZiBjb252ZXJ0ZWQgYXVkaW8gYnVmZmVyIGluIGJ5dGVzIChjYWxjdWxhdGVkKTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bGVuX211bHQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmJ1ZjwvSQorPjwvVFQKKz4gbXVzdCBiZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmxlbjwvSQorPjwvVFQKKz4qPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5sZW5fbXVsdDwvSQorPjwvVFQKKz4gYnl0ZXMgaW4gc2l6ZShjYWxjdWxhdGVkKTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bGVuX3JhdGlvPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+RmluYWwgYXVkaW8gc2l6ZSBpcyA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmxlbjwvSQorPjwvVFQKKz4qPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5sZW5fcmF0aW88L0kKKz48L1RUCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5maWx0ZXJzWzEwXSguLik8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Qb2ludGVycyB0byBmdW5jdGlvbnMgbmVlZGVkIGZvciB0aGlzIGNvbnZlcnNpb248L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmZpbHRlcl9pbmRleDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkN1cnJlbnQgY29udmVyc2lvbiBmdW5jdGlvbjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY5NDQiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGUgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9BdWRpb0NWVDwvU1BBTgorPiBpcyB1c2VkIHRvIGNvbnZlcnQgYXVkaW8gZGF0YSBiZXR3ZWVuIGRpZmZlcmVudCBmb3JtYXRzLiBBIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQXVkaW9DVlQ8L1NQQU4KKz4gc3RydWN0dXJlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgPEEKK0hSRUY9InNkbGJ1aWxkYXVkaW9jdnQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQnVpbGRBdWRpb0NWVDwvVFQKKz48L0EKKz4gZnVuY3Rpb24sIHdoaWxlIHRoZSBhY3R1YWwgY29udmVyc2lvbiBpcyBkb25lIGJ5IHRoZSA8QQorSFJFRj0ic2RsY29udmVydGF1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NvbnZlcnRBdWRpbzwvVFQKKz48L0EKKz4gZnVuY3Rpb24uPC9QCis+PFAKKz5NYW55IG9mIHRoZSBmaWVsZHMgaW4gdGhlIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQXVkaW9DVlQ8L1NQQU4KKz4gc3RydWN0dXJlIHNob3VsZCBiZSBjb25zaWRlcmVkIHByaXZhdGUgYW5kIHRoZWlyIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGRpc2N1c3NlZCBoZXJlLjwvUAorPjxQCis+PC9QCis+PERJVgorQ0xBU1M9IlZBUklBQkxFTElTVCIKKz48REwKKz48RFQKKz48U1BBTgorQ0xBU1M9IlRZUEUiCis+VWludDggKjwvU1BBTgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+YnVmPC9JCis+PC9UVAorPjwvRFQKKz48REQKKz48UAorPlRoaXMgcG9pbnRzIHRvIHRoZSBhdWRpbyBkYXRhIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjb252ZXJzaW9uLiBJdCBpcyBib3RoIHRoZSBzb3VyY2UgYW5kIHRoZSBkZXN0aW5hdGlvbiwgd2hpY2ggbWVhbnMgdGhlIGNvbnZlcnRlZCBhdWRpbyBkYXRhIG92ZXJ3cml0ZXMgdGhlIG9yaWdpbmFsIGRhdGEuIEl0IGFsc28gbWVhbnMgdGhhdCB0aGUgY29udmVydGVkIGRhdGEgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBvcmlnaW5hbCBkYXRhIChpZiB5b3Ugd2VyZSBjb252ZXJ0aW5nIGZyb20gOC1iaXQgdG8gMTYtYml0LCBmb3IgaW5zdGFuY2UpLCBzbyB5b3UgbXVzdCBlbnN1cmUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5idWY8L0kKKz48L1RUCis+IGlzIGxhcmdlIGVub3VnaC4gU2VlIGJlbG93LjwvUAorPjwvREQKKz48RFQKKz48U1BBTgorQ0xBU1M9IlRZUEUiCis+aW50PC9TUEFOCis+IDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bGVuPC9JCis+PC9UVAorPjwvRFQKKz48REQKKz48UAorPlRoaXMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgb3JpZ2luYWwgYXVkaW8gZGF0YSBpbiBieXRlcy48L1AKKz48L0RECis+PERUCis+PFNQQU4KK0NMQVNTPSJUWVBFIgorPmludDwvU1BBTgorPiA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmxlbl9tdWx0PC9JCis+PC9UVAorPjwvRFQKKz48REQKKz48UAorPkFzIGV4cGxhaW5lZCBhYm92ZSwgdGhlIGF1ZGlvIGJ1ZmZlciBuZWVkcyB0byBiZSBiaWcgZW5vdWdoIHRvIHN0b3JlIHRoZSBjb252ZXJ0ZWQgZGF0YSwgd2hpY2ggbWF5IGJlIGJpZ2dlciB0aGFuIHRoZSBvcmlnaW5hbCBhdWRpbyBkYXRhLiBUaGUgbGVuZ3RoIG9mIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+YnVmPC9JCis+PC9UVAorPiBzaG91bGQgYmUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5sZW48L0kKKz48L1RUCis+KjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bGVuX211bHQ8L0kKKz48L1RUCis+LjwvUAorPjwvREQKKz48RFQKKz48U1BBTgorQ0xBU1M9IlRZUEUiCis+ZG91YmxlPC9TUEFOCis+IDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bGVuX3JhdGlvPC9JCis+PC9UVAorPjwvRFQKKz48REQKKz48UAorPldoZW4geW91IGhhdmUgZmluaXNoZWQgY29udmVydGluZyB5b3VyIGF1ZGlvIGRhdGEsIHlvdSBuZWVkIHRvIGtub3cgaG93IG11Y2ggb2YgeW91ciBhdWRpbyBidWZmZXIgaXMgdmFsaWQuIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bGVuPC9JCis+PC9UVAorPio8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmxlbl9yYXRpbzwvSQorPjwvVFQKKz4gaXMgdGhlIHNpemUgb2YgdGhlIGNvbnZlcnRlZCBhdWRpbyBkYXRhIGluIGJ5dGVzLiBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmxlbl9tdWx0PC9JCis+PC9UVAorPiwgaG93ZXZlciB3aGVuIHRoZSBjb252ZXJ0IGF1ZGlvIGRhdGEgaXMgc2hvcnRlciB0aGFuIHRoZSBvcmlnaW5hbCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmxlbl9tdWx0PC9JCis+PC9UVAorPiB3b3VsZCBiZSAxLiA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmxlbl9yYXRpbzwvSQorPjwvVFQKKz4sIG9uIHRoZSBvdGhlciBoYW5kLCB3b3VsZCBiZSBhIGZyYWN0aW9uYWwgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS48L1AKKz48L0RECis+PC9ETAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY5ODkiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsYnVpbGRhdWRpb2N2dC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9CdWlsZEF1ZGlvQ1ZUPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxjb252ZXJ0YXVkaW8uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ29udmVydEF1ZGlvPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxhdWRpb3NwZWMuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0F1ZGlvU3BlYzwvU1BBTgorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZnJlZXdhdi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGJ1aWxkYXVkaW9jdnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9GcmVlV0FWPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iYXVkaW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQnVpbGRBdWRpb0NWVDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxhdWRpb3NwZWMuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsYXVkaW9zcGVjLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2ZmE3NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsYXVkaW9zcGVjLmh0bWwKQEAgLTAsMCArMSw1ODkgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfQXVkaW9TcGVjPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkF1ZGlvIgorSFJFRj0iYXVkaW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iQXVkaW8iCitIUkVGPSJhdWRpby5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9PcGVuQXVkaW8iCitIUkVGPSJzZGxvcGVuYXVkaW8uaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iYXVkaW8uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG9wZW5hdWRpby5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEFVRElPU1BFQyIKKz48L0EKKz5TRExfQXVkaW9TcGVjPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42NTA3IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0F1ZGlvU3BlYyZuYnNwOy0tJm5ic3A7QXVkaW8gU3BlY2lmaWNhdGlvbiBTdHJ1Y3R1cmU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjUxMCIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIGludCBmcmVxOworICBVaW50MTYgZm9ybWF0OworICBVaW50OCBjaGFubmVsczsKKyAgVWludDggc2lsZW5jZTsKKyAgVWludDE2IHNhbXBsZXM7CisgIFVpbnQzMiBzaXplOworICB2b2lkICgqY2FsbGJhY2spKHZvaWQgKnVzZXJkYXRhLCBVaW50OCAqc3RyZWFtLCBpbnQgbGVuKTsKKyAgdm9pZCAqdXNlcmRhdGE7Cit9IFNETF9BdWRpb1NwZWM7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjUxMyIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGF0YTwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVONjUxNSIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5mcmVxPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXVkaW8gZnJlcXVlbmN5IGluIHNhbXBsZXMgcGVyIHNlY29uZDwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Zm9ybWF0PC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXVkaW8gZGF0YSBmb3JtYXQ8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmNoYW5uZWxzPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+TnVtYmVyIG9mIGNoYW5uZWxzOiAxIG1vbm8sIDIgc3RlcmVvPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zaWxlbmNlPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXVkaW8gYnVmZmVyIHNpbGVuY2UgdmFsdWUgKGNhbGN1bGF0ZWQpPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zYW1wbGVzPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXVkaW8gYnVmZmVyIHNpemUgaW4gc2FtcGxlczwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c2l6ZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkF1ZGlvIGJ1ZmZlciBzaXplIGluIGJ5dGVzIChjYWxjdWxhdGVkKTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Y2FsbGJhY2soLi4pPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Q2FsbGJhY2sgZnVuY3Rpb24gZm9yIGZpbGxpbmcgdGhlIGF1ZGlvIGJ1ZmZlcjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dXNlcmRhdGE8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Qb2ludGVyIHRoZSB1c2VyIGRhdGEgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY1NTAiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGUgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9BdWRpb1NwZWM8L1NQQU4KKz4gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBzb21lIGF1ZGlvIGRhdGEuIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgPEEKK0hSRUY9InNkbG9wZW5hdWRpby5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9PcGVuQXVkaW88L1RUCis+PC9BCis+IGFuZCA8QQorSFJFRj0ic2RsbG9hZHdhdi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Mb2FkV0FWPC9UVAorPjwvQQorPi4gV2hpbGUgYWxsIGZpZWxkcyBhcmUgdXNlZCBieSA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfT3BlbkF1ZGlvPC9UVAorPiBvbmx5IDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+ZnJlcTwvSQorPjwvVFQKKz4sIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Zm9ybWF0PC9JCis+PC9UVAorPiwgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zYW1wbGVzPC9JCis+PC9UVAorPiBhbmQgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5jaGFubmVsczwvSQorPjwvVFQKKz4gYXJlIHVzZWQgYnkgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvYWRXQVY8L1RUCis+LiBXZSB3aWxsIGRldGFpbCB0aGVzZSBjb21tb24gbWVtYmVycyBoZXJlLjwvUAorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU42NTY0IgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjAiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUQk9EWQorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmZyZXE8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPlRoZSBudW1iZXIgb2Ygc2FtcGxlcyBzZW50IHRvIHRoZSBzb3VuZCBkZXZpY2UgZXZlcnkgc2Vjb25kLiBDb21tb24gdmFsdWVzIGFyZSAxMTAyNSwgMjIwNTAgYW5kIDQ0MTAwLiBUaGUgaGlnaGVyIHRoZSBiZXR0ZXIuPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5mb3JtYXQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPlNwZWNpZmllcyB0aGUgc2l6ZSBhbmQgdHlwZSBvZiBlYWNoIHNhbXBsZSBlbGVtZW50Cis8UAorPjwvUAorPjxESVYKK0NMQVNTPSJWQVJJQUJMRUxJU1QiCis+PERMCis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5BVURJT19VODwvVFQKKz48L0RUCis+PERECis+PFAKKz5VbnNpZ25lZCA4LWJpdCBzYW1wbGVzPC9QCis+PC9ERAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+QVVESU9fUzg8L1RUCis+PC9EVAorPjxERAorPjxQCis+U2lnbmVkIDgtYml0IHNhbXBsZXM8L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5BVURJT19VMTY8L1RUCis+IG9yIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+QVVESU9fVTE2TFNCPC9UVAorPjwvRFQKKz48REQKKz48UAorPlVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIHNhbXBsZXM8L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5BVURJT19TMTY8L1RUCis+IG9yIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+QVVESU9fUzE2TFNCPC9UVAorPjwvRFQKKz48REQKKz48UAorPlNpZ25lZCAxNi1iaXQgbGl0dGxlLWVuZGlhbiBzYW1wbGVzPC9QCis+PC9ERAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+QVVESU9fVTE2TVNCPC9UVAorPjwvRFQKKz48REQKKz48UAorPlVuc2lnbmVkIDE2LWJpdCBiaWctZW5kaWFuIHNhbXBsZXM8L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5BVURJT19TMTZNU0I8L1RUCis+PC9EVAorPjxERAorPjxQCis+U2lnbmVkIDE2LWJpdCBiaWctZW5kaWFuIHNhbXBsZXM8L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5BVURJT19VMTZTWVM8L1RUCis+PC9EVAorPjxERAorPjxQCis+RWl0aGVyIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+QVVESU9fVTE2TFNCPC9UVAorPiBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPkFVRElPX1UxNk1TQjwvVFQKKz4gZGVwZW5kaW5nIG9uIHlvdSBzeXN0ZW1zIGVuZGlhbm5lc3M8L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5BVURJT19TMTZTWVM8L1RUCis+PC9EVAorPjxERAorPjxQCis+RWl0aGVyIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+QVVESU9fUzE2TFNCPC9UVAorPiBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPkFVRElPX1MxNk1TQjwvVFQKKz4gZGVwZW5kaW5nIG9uIHlvdSBzeXN0ZW1zIGVuZGlhbm5lc3M8L1AKKz48L0RECis+PC9ETAorPjwvRElWCis+PC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5jaGFubmVsczwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlRoZSBudW1iZXIgb2Ygc2VwZXJhdGUgc291bmQgY2hhbm5lbHMuIDEgaXMgbW9ubyAoc2luZ2xlIGNoYW5uZWwpLCAyIGlzIHN0ZXJlbyAoZHVhbCBjaGFubmVsKS48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnNhbXBsZXM8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5XaGVuIHVzZWQgd2l0aCA8QQorSFJFRj0ic2Rsb3BlbmF1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX09wZW5BdWRpbzwvVFQKKz48L0EKKz4gdGhpcyByZWZlcnMgdG8gdGhlIHNpemUgb2YgdGhlIGF1ZGlvIGJ1ZmZlciBpbiBzYW1wbGVzLiBBIHNhbXBsZSBhIGNodW5rIG9mIGF1ZGlvIGRhdGEgb2YgdGhlIHNpemUgc3BlY2lmaWVkIGluIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmZvcm1hdDwvSQorPjwvVFQKKz4gbXVsaXRwbGllZCBieSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLiBXaGVuIHRoZSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0F1ZGlvU3BlYzwvU1BBTgorPiBpcyB1c2VkIHdpdGggPEEKK0hSRUY9InNkbGxvYWR3YXYuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9hZFdBVjwvVFQKKz48L0EKKz4gPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zYW1wbGVzPC9JCis+PC9UVAorPiBpcyBzZXQgdG8gNDA5Ni48L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42NjM5IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbG9wZW5hdWRpby5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9PcGVuQXVkaW88L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGxvYWR3YXYuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9hZFdBVjwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsb3BlbmF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5BdWRpbzwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX09wZW5BdWRpbzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxibGl0c3VyZmFjZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxibGl0c3VyZmFjZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMjNmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGJsaXRzdXJmYWNlLmh0bWwKQEAgLTAsMCArMSwzMzkgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfQmxpdFN1cmZhY2U8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfQ29udmVydFN1cmZhY2UiCitIUkVGPSJzZGxjb252ZXJ0c3VyZmFjZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9GaWxsUmVjdCIKK0hSRUY9InNkbGZpbGxyZWN0Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNvbnZlcnRzdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxmaWxscmVjdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEJMSVRTVVJGQUNFIgorPjwvQQorPlNETF9CbGl0U3VyZmFjZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMjI5OSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9CbGl0U3VyZmFjZSZuYnNwOy0tJm5ic3A7VGhpcyBwZXJmb3JtcyBhIGZhc3QgYmxpdCBmcm9tIHRoZSBzb3VyY2Ugc3VyZmFjZSB0byB0aGUgZGVzdGluYXRpb24gc3VyZmFjZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMjMwMiIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4yMzAzIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0JsaXRTdXJmYWNlPC9CCis+PC9DT0RFCis+KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LCBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMzA5IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+VGhpcyBwZXJmb3JtcyBhIGZhc3QgYmxpdCBmcm9tIHRoZSBzb3VyY2Ugc3VyZmFjZSB0byB0aGUgZGVzdGluYXRpb24gc3VyZmFjZS48L1AKKz48UAorPlRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnNyY3JlY3Q8L0kKKz48L1RUCis+IGRldGVybWluZSB0aGUKK3NpemUgb2YgdGhlIGNvcGllZCByZWN0YW5nbGUuIE9ubHkgdGhlIHBvc2l0aW9uIGlzIHVzZWQgaW4gdGhlCis8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kc3RyZWN0PC9JCis+PC9UVAorPiAodGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGlnbm9yZWQpLjwvUAorPjxQCis+SWYgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c3JjcmVjdDwvSQorPjwvVFQKKz4gaXMgPFRUCitDTEFTUz0iTElURVJBTCIKKz5OVUxMPC9UVAorPiwgdGhlCitlbnRpcmUgc3VyZmFjZSBpcyBjb3BpZWQuIElmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRzdHJlY3Q8L0kKKz48L1RUCis+IGlzCis8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+LCB0aGVuIHRoZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiAodXBwZXIgbGVmdAorY29ybmVyKSBpcyAoMCwgMCkuPC9QCis+PFAKKz5UaGUgZmluYWwgYmxpdCByZWN0YW5nbGUgaXMgc2F2ZWQgaW4KKzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRzdHJlY3Q8L0kKKz48L1RUCis+IGFmdGVyIGFsbCBjbGlwcGluZyBpcyBwZXJmb3JtZWQKKyg8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zcmNyZWN0PC9JCis+PC9UVAorPiBpcyBub3QgbW9kaWZpZWQpLjwvUAorPjxQCis+VGhlIGJsaXQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYSBsb2NrZWQgc3VyZmFjZS48L1AKKz48UAorPlRoZSByZXN1bHRzIG9mIGJsaXR0aW5nIG9wZXJhdGlvbnMgdmFyeSBncmVhdGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1NSQ0FQTEhBPC9UVAorPiBpcyBzZXQgb3Igbm90LiBTZWUgPEEKK0hSRUY9InNkbHNldGFscGhhLmh0bWwiCis+U0RMX1NldEFscGhhPC9BCis+IGZvciBhbiBleHBsYWluYXRpb24gb2YgaG93IHRoaXMgYWZmZWN0cyB5b3VyIHJlc3VsdHMuIENvbG9ya2V5aW5nIGFuZCBhbHBoYSBhdHRyaWJ1dGVzIGFsc28gaW50ZXJhY3Qgd2l0aCBzdXJmYWNlIGJsaXR0aW5nLCBhcyB0aGUgZm9sbG93aW5nIHBzZXVkby1jb2RlIHNob3VsZCBob3BlZnVsbHkgZXhwbGFpbi4KKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5pZiAoc291cmNlIHN1cmZhY2UgaGFzIFNETF9TUkNBTFBIQSBzZXQpIHsKKyAgICBpZiAoc291cmNlIHN1cmZhY2UgaGFzIGFscGhhIGNoYW5uZWwgKHRoYXQgaXMsIGZvcm1hdC0mIzYyO0FtYXNrICE9IDApKQorICAgICAgICBibGl0IHVzaW5nIHBlci1waXhlbCBhbHBoYSwgaWdub3JpbmcgYW55IGNvbG91ciBrZXkKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNvdXJjZSBzdXJmYWNlIGhhcyBTRExfU1JDQ09MT1JLRVkgc2V0KQorICAgICAgICAgICAgYmxpdCB1c2luZyB0aGUgY29sb3VyIGtleSBBTkQgdGhlIHBlci1zdXJmYWNlIGFscGhhIHZhbHVlCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJsaXQgdXNpbmcgdGhlIHBlci1zdXJmYWNlIGFscGhhIHZhbHVlCisgICAgfQorfSBlbHNlIHsKKyAgICBpZiAoc291cmNlIHN1cmZhY2UgaGFzIFNETF9TUkNDT0xPUktFWSBzZXQpCisgICAgICAgIGJsaXQgdXNpbmcgdGhlIGNvbG91ciBrZXkKKyAgICBlbHNlCisgICAgICAgIG9yZGluYXJ5IG9wYXF1ZSByZWN0YW5ndWxhciBibGl0Cit9PC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjMyOCIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5JZiB0aGUgYmxpdCBpcyBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiwKK290aGVyd2lzZSBpdCByZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4uPC9QCis+PFAKKz5JZiBlaXRoZXIgb2YgdGhlIHN1cmZhY2VzIHdlcmUgaW4gdmlkZW8gbWVtb3J5LCBhbmQgdGhlIGJsaXQgcmV0dXJucworPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4tMjwvU1BBTgorPiwgdGhlIHZpZGVvIG1lbW9yeSB3YXMgbG9zdCwgc28gaXQgc2hvdWxkIGJlCityZWxvYWRlZCB3aXRoIGFydHdvcmsgYW5kIHJlLWJsaXR0ZWQ6Cis8UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICAgICAgICB3aGlsZSAoIFNETF9CbGl0U3VyZmFjZShpbWFnZSwgaW1ncmVjdCwgc2NyZWVuLCBkc3RyZWN0KSA9PSAtMiApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIFNETF9Mb2NrU3VyZmFjZShpbWFnZSkpICYjNjA7IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0RlbGF5KDEwKTsKKyAgICAgICAgICAgICAgICAtLSBXcml0ZSBpbWFnZSBwaXhlbHMgdG8gaW1hZ2UtJiM2MjtwaXhlbHMgLS0KKyAgICAgICAgICAgICAgICBTRExfVW5sb2NrU3VyZmFjZShpbWFnZSk7CisgICAgICAgIH08L1BSRQorPgorVGhpcyBoYXBwZW5zIHVuZGVyIERpcmVjdFggNS4wIHdoZW4gdGhlIHN5c3RlbSBzd2l0Y2hlcyBhd2F5IGZyb20geW91cgorZnVsbHNjcmVlbiBhcHBsaWNhdGlvbi4gIExvY2tpbmcgdGhlIHN1cmZhY2Ugd2lsbCBhbHNvIGZhaWwgdW50aWwgeW91CitoYXZlIGFjY2VzcyB0byB0aGUgdmlkZW8gbWVtb3J5IGFnYWluLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMzM2IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGxvY2tzdXJmYWNlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvY2tTdXJmYWNlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxmaWxscmVjdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9GaWxsUmVjdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfU3VyZmFjZTwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxyZWN0Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9SZWN0PC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjb252ZXJ0c3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGZpbGxyZWN0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQ29udmVydFN1cmZhY2U8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9GaWxsUmVjdDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxidWlsZGF1ZGlvY3Z0Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGJ1aWxkYXVkaW9jdnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg0MjBlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxidWlsZGF1ZGlvY3Z0Lmh0bWwKQEAgLTAsMCArMSwyOTEgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfQnVpbGRBdWRpb0NWVDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJBdWRpbyIKK0hSRUY9ImF1ZGlvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9BdWRpb0NWVCIKK0hSRUY9InNkbGF1ZGlvY3Z0Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0NvbnZlcnRBdWRpbyIKK0hSRUY9InNkbGNvbnZlcnRhdWRpby5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxhdWRpb2N2dC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY29udmVydGF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQlVJTERBVURJT0NWVCIKKz48L0EKKz5TRExfQnVpbGRBdWRpb0NWVDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzAwMiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9CdWlsZEF1ZGlvQ1ZUJm5ic3A7LS0mbmJzcDtJbml0aWFsaXplcyBhIFNETF9BdWRpb0NWVCBzdHJ1Y3R1cmUgZm9yIGNvbnZlcnNpb248L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONzAwNSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU43MDA2IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0J1aWxkQXVkaW9DVlQ8L0IKKz48L0NPREUKKz4oU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBzcmNfZm9ybWF0LCBVaW50OCBzcmNfY2hhbm5lbHMsIGludCBzcmNfcmF0ZSwgVWludDE2IGRzdF9mb3JtYXQsIFVpbnQ4IGRzdF9jaGFubmVscywgaW50IGRzdF9yYXRlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjcwMTIiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5CZWZvcmUgYW4gPEEKK0hSRUY9InNkbGF1ZGlvY3Z0Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9BdWRpb0NWVDwvU1BBTgorPjwvQQorPiBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhdWRpbyBkYXRhIGl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGluZm9ybWF0aW9uLiA8L1AKKz48UAorPjxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnNyY19mb3JtYXQ8L0kKKz48L1RUCis+IGFuZCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kc3RfZm9ybWF0PC9JCis+PC9UVAorPiBhcmUgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZm9ybWF0IG9mIHRoZSBjb252ZXJzaW9uLiAoRm9yIGluZm9ybWF0aW9uIG9uIGF1ZGlvIGZvcm1hdHMgc2VlIDxBCitIUkVGPSJzZGxhdWRpb3NwZWMuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+IFNETF9BdWRpb1NwZWM8L1NQQU4KKz48L0EKKz4pLiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zcmNfY2hhbm5lbHM8L0kKKz48L1RUCis+IGFuZCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kc3RfY2hhbm5lbHM8L0kKKz48L1RUCis+IGFyZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGZvcm1hdHMuIEZpbmFsbHksIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnNyY19yYXRlPC9JCis+PC9UVAorPiBhbmQgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZHN0X3JhdGU8L0kKKz48L1RUCis+IGFyZSB0aGUgZnJlcXVlbmN5IG9yIHNhbXBsZXMtcGVyLXNlY29uZCBvZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBmb3JtYXRzLiBPbmNlIGFnYWluLCBzZWUgPEEKK0hSRUY9InNkbGF1ZGlvc3BlYy5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQXVkaW9TcGVjPC9TUEFOCis+PC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MDI4IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZXM8L0gyCis+PFAKKz5SZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gaWYgdGhlIGZpbHRlciBjb3VsZCBub3QgYmUgYnVpbHQgb3IgMSBpZiBpdCBjb3VsZC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzAzMiIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPlNlZSA8QQorSFJFRj0ic2RsY29udmVydGF1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NvbnZlcnRBdWRpbzwvVFQKKz48L0EKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjcwMzciCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY29udmVydGF1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NvbnZlcnRBdWRpbzwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsYXVkaW9jdnQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQXVkaW9DVlQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxhdWRpb2N2dC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNvbnZlcnRhdWRpby5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0F1ZGlvQ1ZUPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iYXVkaW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ29udmVydEF1ZGlvPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4YTdjZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2QuaHRtbApAQCAtMCwwICsxLDM1OSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DRDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJDRC1ST00iCitIUkVGPSJjZHJvbS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfQ0RDbG9zZSIKK0hSRUY9InNkbGNkY2xvc2UuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ0R0cmFjayIKK0hSRUY9InNkbGNkdHJhY2suaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2RjbG9zZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2R0cmFjay5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETENEIgorPjwvQQorPlNETF9DRDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzU2NiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9DRCZuYnNwOy0tJm5ic3A7Q0RST00gRHJpdmUgSW5mb3JtYXRpb248L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzU2OSIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIGludCBpZDsKKyAgQ0RzdGF0dXMgc3RhdHVzOworICBpbnQgbnVtdHJhY2tzOworICBpbnQgY3VyX3RyYWNrOworICBpbnQgY3VyX2ZyYW1lOworICBTRExfQ0R0cmFjayB0cmFja1tTRExfTUFYX1RSQUNLUysxXTsKK30gU0RMX0NEOzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc1NzIiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjc1NzQiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+aWQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Qcml2YXRlIGRyaXZlIGlkZW50aWZpZXI8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnN0YXR1czwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkRyaXZlIDxBCitIUkVGPSJzZGxjZHN0YXR1cy5odG1sIgorPnN0YXR1czwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bnVtdHJhY2tzPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+TnVtYmVyIG9mIHRyYWNrcyBvbiB0aGUgQ0Q8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmN1cl90cmFjazwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkN1cnJlbnQgdHJhY2s8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmN1cl9mcmFtZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkN1cnJlbnQgZnJhbWUgb2Zmc2V0IHdpdGhpbiB0aGUgdHJhY2s8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnRyYWNrPC9JCis+PC9UVAorPltTRExfTUFYX1RSQUNLUysxXTwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXJyYXkgb2YgdHJhY2sgZGVzY3JpcHRpb25zLiAoc2VlIDxBCitIUkVGPSJzZGxjZHRyYWNrLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9DRHRyYWNrPC9TUEFOCis+PC9BCis+KTwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc2MDQiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5BbiA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0NEPC9TUEFOCis+IHN0cnVjdHVyZSBpcyByZXR1cm5lZCBieSA8QQorSFJFRj0ic2RsY2RvcGVuLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NET3BlbjwvVFQKKz48L0EKKz4uIEl0IHJlcHJlc2VudHMgYW4gb3BlbmVkIENEUk9NIGRldmljZSBhbmQgc3RvcmVzIGluZm9ybWF0aW9uIG9uIHRoZSBsYXlvdXQgb2YgdGhlIHRyYWNrcyBvbiB0aGUgZGlzYy48L1AKKz48UAorPkEgZnJhbWUgaXMgdGhlIGJhc2UgZGF0YSB1bml0IG9mIGEgQ0QuIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+Q0RfRlBTPC9UVAorPiBmcmFtZXMgaXMgZXF1YWwgdG8gMSBzZWNvbmQgb2YgbXVzaWMuIFNETCBwcm92aWRlcyB0d28gbWFjcm9zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGltZSBhbmQgZnJhbWVzOiA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPkZSQU1FU19UT19NU0YoZiwgTSxTLEYpPC9UVAorPiBhbmQgPFRUCitDTEFTUz0iTElURVJBTCIKKz5NU0ZfVE9fRlJBTUVTPC9UVAorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzYxNCIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+aW50IG1pbiwgc2VjLCBmcmFtZTsKK2ludCBmcmFtZV9vZmZzZXQ7CisKK0ZSQU1FU19UT19NU0YoY2Ryb20tJiM2MjtjdXJfZnJhbWUsICYjMzg7bWluLCAmIzM4O3NlYywgJiMzODtmcmFtZSk7CitwcmludGYoIkN1cnJlbnQgUG9zaXRpb246ICVkIG1pbnV0ZXMsICVkIHNlY29uZHMsICVkIGZyYW1lc1xuIiwgbWluLCBzZWMsIGZyYW1lKTsKKworZnJhbWVfb2Zmc2V0PU1TRl9UT19GUkFNRVMobWluLCBzZWMsIGZyYW1lKTs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NjE3IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNkb3Blbi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DRE9wZW48L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGNkdHJhY2suaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0NEdHJhY2s8L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNkY2xvc2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZHRyYWNrLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQ0RDbG9zZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImNkcm9tLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NEdHJhY2s8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2RjbG9zZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZGNsb3NlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5ODRhOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2RjbG9zZS5odG1sCkBAIC0wLDAgKzEsMjE3IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NEQ2xvc2U8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQ0QtUk9NIgorSFJFRj0iY2Ryb20uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NERWplY3QiCitIUkVGPSJzZGxjZGVqZWN0Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0NEIgorSFJFRj0ic2RsY2QuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2RlamVjdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2QuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDRENMT1NFIgorPjwvQQorPlNETF9DRENsb3NlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43NTQxIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NEQ2xvc2UmbmJzcDstLSZuYnNwO0Nsb3NlcyBhIFNETF9DRCBoYW5kbGU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONzU0NCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU43NTQ1IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9DRENsb3NlPC9CCis+PC9DT0RFCis+KFNETF9DRCAqY2Ryb20pOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzU1MSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkNsb3NlcyB0aGUgZ2l2ZW4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+Y2Ryb208L0kKKz48L1RUCis+IGhhbmRsZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzU1NSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxjZG9wZW4uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ0RPcGVuPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxjZC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQ0Q8L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNkZWplY3QuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NERWplY3Q8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJjZHJvbS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DRDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZGVqZWN0Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkZWplY3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2EzYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZGVqZWN0Lmh0bWwKQEAgLTAsMCArMSwyMjYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfQ0RFamVjdDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJDRC1ST00iCitIUkVGPSJjZHJvbS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfQ0RTdG9wIgorSFJFRj0ic2RsY2RzdG9wLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0NEQ2xvc2UiCitIUkVGPSJzZGxjZGNsb3NlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNkc3RvcC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2RjbG9zZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETENERUpFQ1QiCis+PC9BCis+U0RMX0NERWplY3Q8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjc1MTMiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfQ0RFamVjdCZuYnNwOy0tJm5ic3A7RWplY3RzIGEgQ0RST008L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONzUxNiIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU43NTE3IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0NERWplY3Q8L0IKKz48L0NPREUKKz4oU0RMX0NEICpjZHJvbSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NTIzIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+RWplY3RzIHRoZSBnaXZlbiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5jZHJvbTwvSQorPjwvVFQKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc1MjciCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gb24gc3VjY2Vzcywgb3IgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4tMTwvU1BBTgorPiBvbiBhbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzUzMiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxjZC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQ0Q8L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNkc3RvcC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNkY2xvc2UuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9DRFN0b3A8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJjZHJvbS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DRENsb3NlPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkbmFtZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZG5hbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWExOGUyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZG5hbWUuaHRtbApAQCAtMCwwICsxLDIzOSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DRE5hbWU8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQ0QtUk9NIgorSFJFRj0iY2Ryb20uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NETnVtRHJpdmVzIgorSFJFRj0ic2RsY2RudW1kcml2ZXMuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ0RPcGVuIgorSFJFRj0ic2RsY2RvcGVuLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNkbnVtZHJpdmVzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjZG9wZW4uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDRE5BTUUiCis+PC9BCis+U0RMX0NETmFtZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzI0MCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9DRE5hbWUmbmJzcDstLSZuYnNwO1JldHVybnMgYSBodW1hbi1yZWFkYWJsZSwgc3lzdGVtLWRlcGVuZGVudCBpZGVudGlmaWVyIGZvciB0aGUgQ0QtUk9NLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43MjQzIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjcyNDQiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmNvbnN0IGNoYXIgKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9DRE5hbWU8L0IKKz48L0NPREUKKz4oaW50IGRyaXZlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjcyNTAiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5SZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUsIHN5c3RlbS1kZXBlbmRlbnQgaWRlbnRpZmllciBmb3IgdGhlIENELVJPTS4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZHJpdmU8L0kKKz48L1RUCis+IGlzIHRoZSBpbmRleCBvZiB0aGUgZHJpdmUuIERyaXZlIGluZGljZXMgc3RhcnQgdG8gMCBhbmQgZW5kIGF0IDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DRE51bURyaXZlcygpPC9UVAorPi0xLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MjU1IgorPjwvQQorPjxIMgorPkV4YW1wbGVzPC9IMgorPjxQCis+PFAKKz48L1AKKz48VUwKKz48TEkKKz48UAorPiIvZGV2L2Nkcm9tIjwvUAorPjwvTEkKKz48TEkKKz48UAorPiJFOiI8L1AKKz48L0xJCis+PExJCis+PFAKKz4iL2Rldi9kaXNrL2lkZS8xL21hc3RlciI8L1AKKz48L0xJCis+PC9VTAorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MjY1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNkbnVtZHJpdmVzLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NETnVtRHJpdmVzPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY2RudW1kcml2ZXMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZG9wZW4uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9DRE51bURyaXZlczwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImNkcm9tLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NET3BlbjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZG51bWRyaXZlcy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZG51bWRyaXZlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTZhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkbnVtZHJpdmVzLmh0bWwKQEAgLTAsMCArMSwyMDUgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfQ0ROdW1Ecml2ZXM8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQ0QtUk9NIgorSFJFRj0iY2Ryb20uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iQ0QtUk9NIgorSFJFRj0iY2Ryb20uaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ0ROYW1lIgorSFJFRj0ic2RsY2RuYW1lLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9ImNkcm9tLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjZG5hbWUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDRE5VTURSSVZFUyIKKz48L0EKKz5TRExfQ0ROdW1Ecml2ZXM8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjcyMTgiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfQ0ROdW1Ecml2ZXMmbmJzcDstLSZuYnNwO1JldHVybnMgdGhlIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIG9uIHRoZSBzeXN0ZW0uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjcyMjEiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONzIyMiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9DRE51bURyaXZlczwvQgorPjwvQ09ERQorPih2b2lkKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjcyMjgiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5SZXR1cm5zIHRoZSBudW1iZXIgb2YgQ0QtUk9NIGRyaXZlcyBvbiB0aGUgc3lzdGVtLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MjMxIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNkb3Blbi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DRE9wZW48L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJjZHJvbS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNkbmFtZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+Q0QtUk9NPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iY2Ryb20uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ0ROYW1lPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkb3Blbi5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZG9wZW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWE2YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZG9wZW4uaHRtbApAQCAtMCwwICsxLDI3NSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DRE9wZW48L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQ0QtUk9NIgorSFJFRj0iY2Ryb20uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NETmFtZSIKK0hSRUY9InNkbGNkbmFtZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9DRFN0YXR1cyIKK0hSRUY9InNkbGNkc3RhdHVzLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNkbmFtZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2RzdGF0dXMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDRE9QRU4iCis+PC9BCis+U0RMX0NET3BlbjwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzI3NCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9DRE9wZW4mbmJzcDstLSZuYnNwO09wZW5zIGEgQ0QtUk9NIGRyaXZlIGZvciBhY2Nlc3MuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjcyNzciCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONzI3OCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+U0RMX0NEICo8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfQ0RPcGVuPC9CCis+PC9DT0RFCis+KGludCBkcml2ZSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43Mjg0IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+T3BlbnMgYSBDRC1ST00gZHJpdmUgZm9yIGFjY2Vzcy4gIEl0IHJldHVybnMgYSA8QQorSFJFRj0ic2RsY2QuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0NEPC9TUEFOCis+PC9BCis+IHN0cnVjdHVyZSBvbiBzdWNjZXNzLCBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+IGlmIHRoZSBkcml2ZSB3YXMgaW52YWxpZCBvciBidXN5LiAgVGhpcyBuZXdseSBvcGVuZWQgQ0QtUk9NIGJlY29tZXMgdGhlIGRlZmF1bHQgQ0QgdXNlZCB3aGVuIG90aGVyIENEIGZ1bmN0aW9ucyBhcmUgcGFzc2VkIGEgPFRUCitDTEFTUz0iTElURVJBTCIKKz5OVUxMPC9UVAorPiBDRC1ST00gaGFuZGxlLiA8L1AKKz48UAorPkRyaXZlcyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgd2l0aCAwLiAgCitEcml2ZSAwIGlzIHRoZSBzeXN0ZW0gZGVmYXVsdCBDRC1ST00uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjcyOTIiCis+PC9BCis+PEgyCis+RXhhbXBsZXM8L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPlNETF9DRCAqY2Ryb207CitpbnQgY3VyX3RyYWNrOworaW50IG1pbiwgc2VjLCBmcmFtZTsKK1NETF9Jbml0KFNETF9JTklUX0NEUk9NKTsKK2F0ZXhpdChTRExfUXVpdCk7CisKKy8qIENoZWNrIGZvciBDRCBkcml2ZXMgKi8KK2lmKCFTRExfQ0ROdW1Ecml2ZXMoKSl7CisgIC8qIE5vbmUgZm91bmQgKi8KKyAgZnByaW50ZihzdGRlcnIsICJObyBDRFJPTSBkZXZpY2VzIGF2YWlsYWJsZVxuIik7CisgIGV4aXQoLTEpOworfQorCisvKiBPcGVuIHRoZSBkZWZhdWx0IGRyaXZlICovCitjZHJvbT1TRExfQ0RPcGVuKDApOworCisvKiBEaWQgaWYgb3Blbj8gQ2hlY2sgaWYgY2Ryb20gaXMgTlVMTCAqLworaWYoIWNkcm9tKXsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBvcGVuIGRyaXZlOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICBleGl0KC0xKTsKK30KKworLyogUHJpbnQgVm9sdW1lIGluZm8gKi8KK3ByaW50ZigiTmFtZTogJXNcbiIsIFNETF9DRE5hbWUoMCkpOworcHJpbnRmKCJUcmFja3M6ICVkXG4iLCBjZHJvbS0mIzYyO251bXRyYWNrcyk7Citmb3IoY3VyX3RyYWNrPTA7Y3VyX3RyYWNrICYjNjA7IGNkcm9tLSYjNjI7bnVtdHJhY2tzOyBjdXJfdHJhY2srKyl7CisgIEZSQU1FU19UT19NU0YoY2Ryb20tJiM2Mjt0cmFja1tjdXJfdHJhY2tdLmxlbmd0aCwgJiMzODttaW4sICYjMzg7c2VjLCAmIzM4O2ZyYW1lKTsKKyAgcHJpbnRmKCJcdFRyYWNrICVkOiBMZW5ndGggJWQ6JWRcbiIsIGN1cl90cmFjaywgbWluLCBzZWMpOworfQorCitTRExfQ0RDbG9zZShjZHJvbSk7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzI5NSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxjZC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQ0Q8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY2R0cmFjay5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQ0R0cmFjazwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxjZGNsb3NlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NEQ2xvc2U8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZG5hbWUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZHN0YXR1cy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NETmFtZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImNkcm9tLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NEU3RhdHVzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkcGF1c2UuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2RwYXVzZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZWY4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkcGF1c2UuaHRtbApAQCAtMCwwICsxLDIzMyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DRFBhdXNlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkNELVJPTSIKK0hSRUY9ImNkcm9tLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9DRFBsYXlUcmFja3MiCitIUkVGPSJzZGxjZHBsYXl0cmFja3MuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ0RSZXN1bWUiCitIUkVGPSJzZGxjZHJlc3VtZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjZHBsYXl0cmFja3MuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNkcmVzdW1lLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQ0RQQVVTRSIKKz48L0EKKz5TRExfQ0RQYXVzZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzQyNSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9DRFBhdXNlJm5ic3A7LS0mbmJzcDtQYXVzZXMgYSBDRFJPTTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43NDI4IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjc0MjkiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfQ0RQYXVzZTwvQgorPjwvQ09ERQorPihTRExfQ0QgKmNkcm9tKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc0MzUiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5QYXVzZXMgcGxheSBvbiB0aGUgZ2l2ZW4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+Y2Ryb208L0kKKz48L1RUCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NDM5IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IG9uIHN1Y2Nlc3MsIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gb24gYW4gZXJyb3IuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc0NDQiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY2RwbGF5Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NEUGxheTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY2RyZXN1bWUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ0RSZXN1bWU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZHBsYXl0cmFja3MuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZHJlc3VtZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NEUGxheVRyYWNrczwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImNkcm9tLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NEUmVzdW1lPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkcGxheS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZHBsYXkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzY0ODljCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZHBsYXkuaHRtbApAQCAtMCwwICsxLDI0MyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DRFBsYXk8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQ0QtUk9NIgorSFJFRj0iY2Ryb20uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NEU3RhdHVzIgorSFJFRj0ic2RsY2RzdGF0dXMuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ0RQbGF5VHJhY2tzIgorSFJFRj0ic2RsY2RwbGF5dHJhY2tzLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNkc3RhdHVzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjZHBsYXl0cmFja3MuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDRFBMQVkiCis+PC9BCis+U0RMX0NEUGxheTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzM0MyIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9DRFBsYXkmbmJzcDstLSZuYnNwO1BsYXkgYSBDRDwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43MzQ2IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjczNDciCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfQ0RQbGF5PC9CCis+PC9DT0RFCis+KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MzUzIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UGxheXMgdGhlIGdpdmVuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmNkcm9tPC9JCis+PC9UVAorPiwgc3RhcnRpbmcgYSBmcmFtZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zdGFydDwvSQorPjwvVFQKKz4gZm9yIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmxlbmd0aDwvSQorPjwvVFQKKz4gZnJhbWVzLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MzU5IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZXM8L0gyCis+PFAKKz5SZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBvbiBzdWNjZXNzLCBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IG9uIGFuIGVycm9yLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MzY0IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNkcGxheXRyYWNrcy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DRFBsYXlUcmFja3M8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGNkc3RvcC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DRFN0b3A8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZHN0YXR1cy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNkcGxheXRyYWNrcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NEU3RhdHVzPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iY2Ryb20uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ0RQbGF5VHJhY2tzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkcGxheXRyYWNrcy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZHBsYXl0cmFja3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTQ2MTgxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZHBsYXl0cmFja3MuaHRtbApAQCAtMCwwICsxLDMyNSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DRFBsYXlUcmFja3M8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQ0QtUk9NIgorSFJFRj0iY2Ryb20uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NEUGxheSIKK0hSRUY9InNkbGNkcGxheS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9DRFBhdXNlIgorSFJFRj0ic2RsY2RwYXVzZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjZHBsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNkcGF1c2UuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDRFBMQVlUUkFDS1MiCis+PC9BCis+U0RMX0NEUGxheVRyYWNrczwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzM3NSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9DRFBsYXlUcmFja3MmbmJzcDstLSZuYnNwO1BsYXkgdGhlIGdpdmVuIENEIHRyYWNrKHMpPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjczNzgiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONzM3OSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9DRFBsYXlUcmFja3M8L0IKKz48L0NPREUKKz4oU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0X3RyYWNrLCBpbnQgc3RhcnRfZnJhbWUsIGludCBudHJhY2tzLCBpbnQgbmZyYW1lcykpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzM4NSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DRFBsYXlUcmFja3M8L1RUCis+IHBsYXlzIHRoZSBnaXZlbiBDRCBzdGFydGluZyBhdCB0cmFjaworPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c3RhcnRfdHJhY2s8L0kKKz48L1RUCis+LCBmb3IgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+bnRyYWNrczwvSQorPjwvVFQKKz4gdHJhY2tzLiAgPC9QCis+PFAKKz48VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zdGFydF9mcmFtZTwvSQorPjwvVFQKKz4gaXMgdGhlIGZyYW1lIG9mZnNldCwgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zdGFydF90cmFjazwvSQorPjwvVFQKKz4sIGF0IHdoaWNoIHRvIHN0YXJ0LiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5uZnJhbWVzPC9JCis+PC9UVAorPiBpcyB0aGUgZnJhbWUgb2Zmc2V0LCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxhc3QgdHJhY2sgKDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnN0YXJ0X3RyYWNrPC9JCis+PC9UVAorPis8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5udHJhY2tzPC9JCis+PC9UVAorPiksIGF0IHdoaWNoIHRvIGVuZCBwbGF5aW5nLjwvUAorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NEUGxheVRyYWNrczwvVFQKKz4gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGNhbGxpbmcgCis8QQorSFJFRj0ic2RsY2RzdGF0dXMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ0RTdGF0dXM8L1RUCis+PC9BCis+IAordG8gZ2V0IHRyYWNrIGluZm9ybWF0aW9uIGFib3V0IHRoZSBDRC48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPkRhdGEgdHJhY2tzIGFyZSBpZ25vcmVkLjwvUAorPjwvQkxPQ0tRVU9URQorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc0MDMiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4sIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gCitpZiB0aGVyZSB3YXMgYW4gZXJyb3IuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc0MDgiCis+PC9BCis+PEgyCis+RXhhbXBsZXM8L0gyCis+PFAKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+LyogYXNzdW1pbmcgY2Ryb20gaXMgYSBwcmV2aW91c2x5IG9wZW5lZCBkZXZpY2UgKi8KKy8qIFBsYXkgdGhlIGVudGlyZSBDRCAqLworaWYoQ0RfSU5EUklWRShTRExfQ0RTdGF0dXMoY2Ryb20pKSkKKyAgU0RMX0NEUGxheVRyYWNrcyhjZHJvbSwgMCwgMCwgMCwgMCk7CisKKy8qIFBsYXkgdGhlIGZpcnN0IHRyYWNrICovCitpZihDRF9JTkRSSVZFKFNETF9DRFN0YXR1cyhjZHJvbSkpKQorICBTRExfQ0RQbGF5VHJhY2tzKGNkcm9tLCAwLCAwLCAxLCAwKTsKKworLyogUGxheSBmaXJzdCAxNSBzZWNvbmRzIG9mIHRoZSAybmQgdHJhY2sgKi8KK2lmKENEX0lORFJJVkUoU0RMX0NEU3RhdHVzKGNkcm9tKSkpCisgIFNETF9DRFBsYXlUcmFja3MoY2Ryb20sIDEsIDAsIDAsIENEX0ZQUyoxNSk7PC9QUkUKKz4KKyYjMTM7PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc0MTIiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY2RwbGF5Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NEUGxheTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY2RzdGF0dXMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ0RTdGF0dXM8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGNkLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NEPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY2RwbGF5Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY2RwYXVzZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NEUGxheTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImNkcm9tLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NEUGF1c2U8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2RyZXN1bWUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2RyZXN1bWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI1YWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZHJlc3VtZS5odG1sCkBAIC0wLDAgKzEsMjMzIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NEUmVzdW1lPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkNELVJPTSIKK0hSRUY9ImNkcm9tLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9DRFBhdXNlIgorSFJFRj0ic2RsY2RwYXVzZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9DRFN0b3AiCitIUkVGPSJzZGxjZHN0b3AuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2RwYXVzZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2RzdG9wLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQ0RSRVNVTUUiCis+PC9BCis+U0RMX0NEUmVzdW1lPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43NDU1IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NEUmVzdW1lJm5ic3A7LS0mbmJzcDtSZXN1bWVzIGEgQ0RST008L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONzQ1OCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU43NDU5IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0NEUmVzdW1lPC9CCis+PC9DT0RFCis+KFNETF9DRCAqY2Ryb20pOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzQ2NSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlJlc3VtZXMgcGxheSBvbiB0aGUgZ2l2ZW4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+Y2Ryb208L0kKKz48L1RUCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NDY5IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IG9uIHN1Y2Nlc3MsIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gb24gYW4gZXJyb3IuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc0NzQiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY2RwbGF5Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NEUGxheTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY2RwYXVzZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DRFBhdXNlPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY2RwYXVzZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNkc3RvcC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NEUGF1c2U8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJjZHJvbS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DRFN0b3A8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2RzdGF0dXMuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2RzdGF0dXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJmOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjZHN0YXR1cy5odG1sCkBAIC0wLDAgKzEsMjczIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NEU3RhdHVzPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkNELVJPTSIKK0hSRUY9ImNkcm9tLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9DRE9wZW4iCitIUkVGPSJzZGxjZG9wZW4uaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ0RQbGF5IgorSFJFRj0ic2RsY2RwbGF5Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNkb3Blbi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2RwbGF5Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQ0RTVEFUVVMiCis+PC9BCis+U0RMX0NEU3RhdHVzPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43MzA4IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NEU3RhdHVzJm5ic3A7LS0mbmJzcDtSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZ2l2ZW4gZHJpdmUuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjczMTEiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONzMxMiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+Q0RzdGF0dXMgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0NEU3RhdHVzPC9CCis+PC9DT0RFCis+KFNETF9DRCAqY2Ryb20pOzwvQ09ERQorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPi8qIEdpdmVuIGEgc3RhdHVzLCByZXR1cm5zIHRydWUgaWYgdGhlcmUncyBhIGRpc2sgaW4gdGhlIGRyaXZlICovCisjZGVmaW5lIENEX0lORFJJVkUoc3RhdHVzKSAgICAgICgoaW50KXN0YXR1cyAmIzYyOyAwKTwvUFJFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MzE5IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+VGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZ2l2ZW4gZHJpdmUuIFN0YXR1cyBpcyBkZXNjcmliZWQgbGlrZSBzbzoKKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz50eXBlZGVmIGVudW0geworICBDRF9UUkFZRU1QVFksCisgIENEX1NUT1BQRUQsCisgIENEX1BMQVlJTkcsCisgIENEX1BBVVNFRCwKKyAgQ0RfRVJST1IgPSAtMQorfSBDRHN0YXR1czs8L1BSRQorPjwvUAorPjxQCis+SWYgdGhlIGRyaXZlIGhhcyBhIENEIGluIGl0LCB0aGUgdGFibGUgb2YgY29udGVudHMgb2YgdGhlIENEIGFuZCBjdXJyZW50CitwbGF5IHBvc2l0aW9uIG9mIHRoZSBDRCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgU0RMX0NEIHN0cnVjdHVyZS48L1AKKz48UAorPlRoZSBtYWNybyA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPkNEX0lORFJJVkU8L1RUCis+IGlzIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZSwgCithbmQgZ2l2ZW4gYSBzdGF0dXMgcmV0dXJucyB0cnVlIGlmIHRoZXJlJ3MgYSBkaXNrIGluIHRoZSBkcml2ZS48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DRFN0YXR1czwvVFQKKz4gYWxzbyB1cGRhdGVzIHRoZSA8QQorSFJFRj0ic2RsY2QuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0NEPC9TUEFOCis+PC9BCis+IHN0cnVjdHVyZSBwYXNzZWQgdG8gaXQuPC9QCis+PC9CTE9DS1FVT1RFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzMzMSIKKz48L0EKKz48SDIKKz5FeGFtcGxlPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5pbnQgcGxheVRyYWNrKGludCB0cmFjaykKK3sKKyAgaW50IHBsYXlpbmcgPSAwOworCisgIGlmICggQ0RfSU5EUklWRShTRExfQ0RTdGF0dXMoY2Ryb20pKSApIHsKKyAgLyogY2xhbXAgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgdHJhY2tzIG9uIHRoZSBDRCAqLworICAgIGlmICh0cmFjayAmIzYyOz0gY2Ryb20tJiM2MjtudW10cmFja3MpIHsKKyAgICAgIHRyYWNrID0gY2Ryb20tJiM2MjtudW10cmFja3MtMTsKKyAgICB9CisKKyAgICBpZiAoIFNETF9DRFBsYXlUcmFja3MoY2Ryb20sIHRyYWNrLCAwLCAxLCAwKSA9PSAwICkgeworICAgICAgcGxheWluZyA9IDE7CisgICAgfQorICB9CisgIHJldHVybiBwbGF5aW5nOworfTwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjczMzQiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY2QuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ0Q8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZG9wZW4uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZHBsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9DRE9wZW48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJjZHJvbS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DRFBsYXk8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2RzdG9wLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkc3RvcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjhkODEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkc3RvcC5odG1sCkBAIC0wLDAgKzEsMjI2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NEU3RvcDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJDRC1ST00iCitIUkVGPSJjZHJvbS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfQ0RSZXN1bWUiCitIUkVGPSJzZGxjZHJlc3VtZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9DREVqZWN0IgorSFJFRj0ic2RsY2RlamVjdC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjZHJlc3VtZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2RlamVjdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETENEU1RPUCIKKz48L0EKKz5TRExfQ0RTdG9wPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43NDg1IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NEU3RvcCZuYnNwOy0tJm5ic3A7U3RvcHMgYSBDRFJPTTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43NDg4IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjc0ODkiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfQ0RTdG9wPC9CCis+PC9DT0RFCis+KFNETF9DRCAqY2Ryb20pOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzQ5NSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlN0b3BzIHBsYXkgb24gdGhlIGdpdmVuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmNkcm9tPC9JCis+PC9UVAorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzQ5OSIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5SZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBvbiBzdWNjZXNzLCBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IG9uIGFuIGVycm9yLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NTA0IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNkcGxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DRFBsYXk8L1RUCis+PC9BCis+LDwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY2RyZXN1bWUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZGVqZWN0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQ0RSZXN1bWU8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJjZHJvbS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DREVqZWN0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkdHJhY2suaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2R0cmFjay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjA0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNkdHJhY2suaHRtbApAQCAtMCwwICsxLDMxMyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DRHRyYWNrPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkNELVJPTSIKK0hSRUY9ImNkcm9tLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9DRCIKK0hSRUY9InNkbGNkLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iTXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmciCitIUkVGPSJ0aHJlYWQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2QuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETENEVFJBQ0siCis+PC9BCis+U0RMX0NEdHJhY2s8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjc2MjgiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfQ0R0cmFjayZuYnNwOy0tJm5ic3A7Q0QgVHJhY2sgSW5mb3JtYXRpb24gU3RydWN0dXJlPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc2MzEiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBVaW50OCBpZDsKKyAgVWludDggdHlwZTsKKyAgVWludDMyIGxlbmd0aDsKKyAgVWludDMyIG9mZnNldDsKK30gU0RMX0NEdHJhY2s7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzYzNCIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGF0YTwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVONzYzNiIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5pZDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlRyYWNrIG51bWJlciAoMC05OSk8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9BVURJT19UUkFDSzwvVFQKKz4gb3IgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfREFUQV9UUkFDSzwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmxlbmd0aDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkxlbmd0aCwgaW4gZnJhbWVzLCBvZiB0aGlzIHRyYWNrPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5vZmZzZXQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GcmFtZSBvZmZzZXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIHRyYWNrPC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzY1NyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQ0R0cmFjazwvU1BBTgorPiBzdG9yZXMgZGF0YSBvbiBlYWNoIHRyYWNrIG9uIGEgQ0QsIGl0cyBmaWVsZHMgc2hvdWxkIGJlIHByZXR0eSBzZWxmIGV4cGxhaW5hdG9yeS4gSXQgaXMgYSBtZW1iZXIgYSB0aGUgPEEKK0hSRUY9InNkbGNkLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9DRDwvU1BBTgorPjwvQQorPiBzdHJ1Y3R1cmUuPC9QCis+PERJVgorQ0xBU1M9Ik5PVEUiCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJOT1RFIgorPjxQCis+PEIKKz5Ob3RlOiA8L0IKKz5GcmFtZXMgY2FuIGJlIGNvbnZlcnRlZCB0byBzdGFuZGFyZCB0aW1pbmdzLiBUaGVyZSBhcmUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5DRF9GUFM8L1RUCis+IGZyYW1lcyBwZXIgc2Vjb25kLCBzbyA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0NEdHJhY2s8L1NQQU4KKz4uPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5sZW5ndGg8L0kKKz48L1RUCis+LzxUVAorQ0xBU1M9IkxJVEVSQUwiCis+Q0RfRlBTPC9UVAorPj1sZW5ndGhfaW5fc2Vjb25kcy48L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NjY5IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNkLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9DRDwvU1BBTgorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY2QuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9DRDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImNkcm9tLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+TXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmc8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2xvc2VhdWRpby5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjbG9zZWF1ZGlvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5ZjA1OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY2xvc2VhdWRpby5odG1sCkBAIC0wLDAgKzEsMjA1IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0Nsb3NlQXVkaW88L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQXVkaW8iCitIUkVGPSJhdWRpby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfVW5sb2NrQXVkaW8iCitIUkVGPSJzZGx1bmxvY2thdWRpby5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IkNELVJPTSIKK0hSRUY9ImNkcm9tLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHVubG9ja2F1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJjZHJvbS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETENMT1NFQVVESU8iCis+PC9BCis+U0RMX0Nsb3NlQXVkaW88L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjcxODAiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfQ2xvc2VBdWRpbyZuYnNwOy0tJm5ic3A7U2h1dHMgZG93biBhdWRpbyBwcm9jZXNzaW5nIGFuZCBjbG9zZXMgdGhlIGF1ZGlvIGRldmljZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONzE4MyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU43MTg0IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9DbG9zZUF1ZGlvPC9CCis+PC9DT0RFCis+KHZvaWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzE5MCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRoaXMgZnVuY3Rpb24gc2h1dHMgZG93biBhdWRpbyBwcm9jZXNzaW5nIGFuZCBjbG9zZXMgdGhlIGF1ZGlvIGRldmljZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzE5MyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxvcGVuYXVkaW8uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfT3BlbkF1ZGlvPC9UVAorPjwvQQorPiA8L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHVubG9ja2F1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iY2Ryb20uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9VbmxvY2tBdWRpbzwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+Q0QtUk9NPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbG9yLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiN2Q0NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY29sb3IuaHRtbApAQCAtMCwwICsxLDMwMCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Db2xvcjwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9SZWN0IgorSFJFRj0ic2RscmVjdC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9QYWxldHRlIgorSFJFRj0ic2RscGFsZXR0ZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxyZWN0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxwYWxldHRlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQ09MT1IiCis+PC9BCis+U0RMX0NvbG9yPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4zMDgyIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NvbG9yJm5ic3A7LS0mbmJzcDtGb3JtYXQgaW5kZXBlbmRlbnQgY29sb3IgZGVzY3JpcHRpb248L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzA4NSIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHI7CisgIFVpbnQ4IGc7CisgIFVpbnQ4IGI7CisgIFVpbnQ4IHVudXNlZDsKK30gU0RMX0NvbG9yOzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMwODgiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjMwOTAiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+cjwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlJlZCBpbnRlbnNpdHk8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmc8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5HcmVlbiBpbnRlbnNpdHk8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmI8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5CbHVlIGludGVuc2l0eTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dW51c2VkPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+VW51c2VkPC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzEwOSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQ29sb3I8L1NQQU4KKz4gZGVzY3JpYmVzIGEgY29sb3IgaW4gYSBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBZb3UgY2FuIGNvbnZlcnQgYSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0NvbG9yPC9TUEFOCis+IHRvIGEgcGl4ZWwgdmFsdWUgZm9yIGEgY2VydGFpbiBwaXhlbCBmb3JtYXQgdXNpbmcgPEEKK0hSRUY9InNkbG1hcHJnYi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9NYXBSR0I8L1RUCis+PC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zMTE2IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHBpeGVsZm9ybWF0Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9QaXhlbEZvcm1hdDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZXRjb2xvcnMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0Q29sb3JzPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxwYWxldHRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1BhbGV0dGU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxyZWN0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RscGFsZXR0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1JlY3Q8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9QYWxldHRlPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbmRicm9hZGNhc3QuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY29uZGJyb2FkY2FzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGZjODMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbmRicm9hZGNhc3QuaHRtbApAQCAtMCwwICsxLDIyNCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Db25kQnJvYWRjYXN0PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9Ik11bHRpLXRocmVhZGVkIFByb2dyYW1taW5nIgorSFJFRj0idGhyZWFkLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Db25kU2lnbmFsIgorSFJFRj0ic2RsY29uZHNpZ25hbC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Db25kV2FpdCIKK0hSRUY9InNkbGNvbmR3YWl0Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNvbmRzaWduYWwuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNvbmR3YWl0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQ09OREJST0FEQ0FTVCIKKz48L0EKKz5TRExfQ29uZEJyb2FkY2FzdDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOODMzNyIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Db25kQnJvYWRjYXN0Jm5ic3A7LS0mbmJzcDtSZXN0YXJ0IGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gYSBjb25kaXRpb24gdmFyaWFibGU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOODM0MCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU44MzQxIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Db25kQnJvYWRjYXN0PC9CCis+PC9DT0RFCis+KFNETF9jb25kICpjb25kKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjgzNDciCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5SZXN0YXJ0cyBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUsIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmNvbmQ8L0kKKz48L1RUCis+LiBSZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBvbiBzdWNjZXNzLCBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IG9uIGFuIGVycm9yLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MzUzIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNvbmRzaWduYWwuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ29uZFNpZ25hbDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY29uZHdhaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ29uZFdhaXQ8L1RUCis+PC9BCis+JiMxMzs8L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNvbmRzaWduYWwuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjb25kd2FpdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NvbmRTaWduYWw8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ29uZFdhaXQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY29uZHNpZ25hbC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjb25kc2lnbmFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlOTE3NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY29uZHNpZ25hbC5odG1sCkBAIC0wLDAgKzEsMjI0IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NvbmRTaWduYWw8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iTXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmciCitIUkVGPSJ0aHJlYWQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0Rlc3Ryb3lDb25kIgorSFJFRj0ic2RsZGVzdHJveWNvbmQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ29uZEJyb2FkY2FzdCIKK0hSRUY9InNkbGNvbmRicm9hZGNhc3QuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZGVzdHJveWNvbmQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNvbmRicm9hZGNhc3QuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDT05EU0lHTkFMIgorPjwvQQorPlNETF9Db25kU2lnbmFsPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU44MzEwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NvbmRTaWduYWwmbmJzcDstLSZuYnNwO1Jlc3RhcnQgYSB0aHJlYWQgd2FpdCBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU44MzEzIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjgzMTQiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0NvbmRTaWduYWw8L0IKKz48L0NPREUKKz4oU0RMX2NvbmQgKmNvbmQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODMyMCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlJlc3RhcnQgb25lIG9mIHRoZSB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+Y29uZDwvSQorPjwvVFQKKz4uIFJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IG9uIHN1Y2Nlc3Mgb2YgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4tMTwvU1BBTgorPiBvbiBhbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODMyNiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxjb25kd2FpdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Db25kV2FpdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY29uZGJyb2FkY2FzdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Db25kQnJvYWRjYXN0PC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZGVzdHJveWNvbmQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjb25kYnJvYWRjYXN0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfRGVzdHJveUNvbmQ8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ29uZEJyb2FkY2FzdDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjb25kd2FpdC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjb25kd2FpdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTU0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbmR3YWl0Lmh0bWwKQEAgLTAsMCArMSwyMzEgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfQ29uZFdhaXQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iTXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmciCitIUkVGPSJ0aHJlYWQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NvbmRCcm9hZGNhc3QiCitIUkVGPSJzZGxjb25kYnJvYWRjYXN0Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0NvbmRXYWl0VGltZW91dCIKK0hSRUY9InNkbGNvbmR3YWl0dGltZW91dC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjb25kYnJvYWRjYXN0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjb25kd2FpdHRpbWVvdXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDT05EV0FJVCIKKz48L0EKKz5TRExfQ29uZFdhaXQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjgzNjQiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfQ29uZFdhaXQmbmJzcDstLSZuYnNwO1dhaXQgb24gYSBjb25kaXRpb24gdmFyaWFibGU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOODM2NyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU44MzY4IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Db25kV2FpdDwvQgorPjwvQ09ERQorPihTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODM3NCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPldhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5jb25kPC9JCis+PC9UVAorPiBhbmQgdW5sb2NrIHRoZSBwcm92aWRlZCBtdXRleC4gVGhlIG11dGV4IG11c3QgdGhlIGxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbi4gUmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gd2hlbiBpdCBpcyBzaWduYWxsZWQsIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gb24gYW4gZXJyb3IuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjgzODAiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY29uZHdhaXR0aW1lb3V0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NvbmRXYWl0VGltZW91dDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY29uZHNpZ25hbC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Db25kU2lnbmFsPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxtdXRleHAuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfbXV0ZXhQPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY29uZGJyb2FkY2FzdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNvbmR3YWl0dGltZW91dC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NvbmRCcm9hZGNhc3Q8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ29uZFdhaXRUaW1lb3V0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbmR3YWl0dGltZW91dC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjb25kd2FpdHRpbWVvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWVkNTBiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjb25kd2FpdHRpbWVvdXQuaHRtbApAQCAtMCwwICsxLDIzMCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Db25kV2FpdFRpbWVvdXQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iTXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmciCitIUkVGPSJ0aHJlYWQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NvbmRXYWl0IgorSFJFRj0ic2RsY29uZHdhaXQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJUaW1lIgorSFJFRj0idGltZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjb25kd2FpdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0idGltZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETENPTkRXQUlUVElNRU9VVCIKKz48L0EKKz5TRExfQ29uZFdhaXRUaW1lb3V0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU44MzkzIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NvbmRXYWl0VGltZW91dCZuYnNwOy0tJm5ic3A7V2FpdCBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZSwgd2l0aCB0aW1lb3V0PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjgzOTYiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOODM5NyIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfQ29uZFdhaXRUaW1lb3V0PC9CCis+PC9DT0RFCis+KFNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dGV4LCBVaW50MzIgbXMpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODQwMyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPldhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5jb25kPC9JCis+PC9UVAorPiBmb3IsIGF0IG1vc3QsIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm1zPC9JCis+PC9UVAorPiBtaWxsaXNlY29uZHMuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm11dDwvSQorPjwvVFQKKz4gaXMgdW5sb2NrZWQgc28gaXQgbXVzdCBiZSBsb2NrZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBSZXR1cm5zIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01VVEVYX1RJTUVET1VUPC9UVAorPiBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzaWduYWxsZWQgaW4gdGhlIGFsbG90dGVkIHRpbWUsIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBpZiBpdCB3YXMgc2lnbmFsbGVkIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gb24gYW4gZXJyb3IuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjg0MTIiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY29uZHdhaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ29uZFdhaXQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjb25kd2FpdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InRpbWUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Db25kV2FpdDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlRpbWU8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY29udmVydGF1ZGlvLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbnZlcnRhdWRpby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjEyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbnZlcnRhdWRpby5odG1sCkBAIC0wLDAgKzEsNDA3IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NvbnZlcnRBdWRpbzwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJBdWRpbyIKK0hSRUY9ImF1ZGlvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9CdWlsZEF1ZGlvQ1ZUIgorSFJFRj0ic2RsYnVpbGRhdWRpb2N2dC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9NaXhBdWRpbyIKK0hSRUY9InNkbG1peGF1ZGlvLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGJ1aWxkYXVkaW9jdnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG1peGF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQ09OVkVSVEFVRElPIgorPjwvQQorPlNETF9Db252ZXJ0QXVkaW88L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjcwNDgiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfQ29udmVydEF1ZGlvJm5ic3A7LS0mbmJzcDtDb252ZXJ0IGF1ZGlvIGRhdGEgdG8gYSBkZXNpcmVkIGF1ZGlvIGZvcm1hdC48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONzA1MSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU43MDUyIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0NvbnZlcnRBdWRpbzwvQgorPjwvQ09ERQorPihTRExfQXVkaW9DVlQgKmN2dCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MDU4IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NvbnZlcnRBdWRpbzwvVFQKKz4gdGFrZXMgb25lIHBhcmFtZXRlciwgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+Y3Z0PC9JCis+PC9UVAorPiwgd2hpY2ggd2FzIHByZXZpb3VzbHkgaW5pdGlsaXplZC4gSW5pdGlsaXppbmcgYSA8QQorSFJFRj0ic2RsYXVkaW9jdnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0F1ZGlvQ1ZUPC9TUEFOCis+PC9BCis+IGlzIGEgdHdvIHN0ZXAgcHJvY2Vzcy4gRmlyc3Qgb2YgYWxsLCB0aGUgc3RydWN0dXJlIG11c3QgYmUgcGFzc2VkIHRvIDxBCitIUkVGPSJzZGxidWlsZGF1ZGlvY3Z0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0J1aWxkQXVkaW9DVlQ8L1RUCis+PC9BCis+IGFsb25nIHdpdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBmb3JtYXQgcGFyYW1ldGVycy4gU2Vjb25kbHksIHRoZSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+Y3Z0PC9TUEFOCis+LSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5idWY8L0kKKz48L1RUCis+IGFuZCA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+Y3Z0PC9TUEFOCis+LSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5sZW48L0kKKz48L1RUCis+IGZpZWxkcyBtdXN0IGJlIHNldHVwLiA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+Y3Z0PC9TUEFOCis+LSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5idWY8L0kKKz48L1RUCis+IHNob3VsZCBwb2ludCB0byB0aGUgYXVkaW8gZGF0YSBhbmQgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPmN2dDwvU1BBTgorPi0mIzYyOzxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bGVuPC9JCis+PC9UVAorPiBzaG91bGQgYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIGF1ZGlvIGRhdGEgaW4gYnl0ZXMuIFJlbWVtYmVyLCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmJ1ZjwvSQorPjwvVFQKKz4gc2hvdyBiZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmxlbjwvSQorPjwvVFQKKz4qPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5sZW5fbXVsdDwvSQorPjwvVFQKKz4gYnl0ZXMgaW4gbGVuZ3RoLjwvUAorPjxQCis+T25jZSB0aGUgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9BdWRpb0NWVDwvU1BBTgorPnN0cnVjdHVyZSBpcyBpbml0aWxpemVkIHRoZW4gd2UgY2FuIHBhc3MgaXQgdG8gPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NvbnZlcnRBdWRpbzwvVFQKKz4sIHdoaWNoIHdpbGwgY29udmVydCB0aGUgYXVkaW8gZGF0YSBwb2ludGVyIHRvIGJ5IDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5jdnQ8L1NQQU4KKz4tJiM2Mjs8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmJ1ZjwvSQorPjwvVFQKKz4uIElmIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Db252ZXJ0QXVkaW88L1RUCis+IHJldHVybmVkIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiB0aGVuIHRoZSBjb252ZXJzaW9uIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4tMTwvU1BBTgorPiBpcyByZXR1cm5lZC48L1AKKz48UAorPklmIHRoZSBjb252ZXJzaW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgdGhlbiB0aGUgY29udmVydGVkIGF1ZGlvIGRhdGEgY2FuIGJlIHJlYWQgZnJvbSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+Y3Z0PC9TUEFOCis+LSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5idWY8L0kKKz48L1RUCis+LiBUaGUgYW1vdW50IG9mIHZhbGlkLCBjb252ZXJ0ZWQsIGF1ZGlvIGRhdGEgaW4gdGhlIGJ1ZmZlciBpcyBlcXVhbCB0byA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+Y3Z0PC9TUEFOCis+LSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5sZW48L0kKKz48L1RUCis+KjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Y3Z0PC9JCis+PC9UVAorPi0mIzYyOzxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5sZW5fcmF0aW88L1NQQU4KKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjcwOTMiCis+PC9BCis+PEgyCis+RXhhbXBsZXM8L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPi8qIENvbnZlcnRpbmcgc29tZSBXQVYgZGF0YSB0byBoYXJkd2FyZSBmb3JtYXQgKi8KK3ZvaWQgbXlfYXVkaW9fY2FsbGJhY2sodm9pZCAqdXNlcmRhdGEsIFVpbnQ4ICpzdHJlYW0sIGludCBsZW4pOworCitTRExfQXVkaW9TcGVjICpkZXNpcmVkLCAqb2J0YWluZWQ7CitTRExfQXVkaW9TcGVjIHdhdl9zcGVjOworU0RMX0F1ZGlvQ1ZUICB3YXZfY3Z0OworVWludDMyIHdhdl9sZW47CitVaW50OCAqd2F2X2J1ZjsKK2ludCByZXQ7CisKKy8qIEFsbG9jYXRlZCBhdWRpbyBzcGVjcyAqLworZGVzaXJlZCA9IG1hbGxvYyhzaXplb2YoU0RMX0F1ZGlvU3BlYykpOworb2J0YWluZWQgPSBtYWxsb2Moc2l6ZW9mKFNETF9BdWRpb1NwZWMpKTsKKworLyogU2V0IGRlc2lyZWQgZm9ybWF0ICovCitkZXNpcmVkLSYjNjI7ZnJlcT0yMjA1MDsKK2Rlc2lyZWQtJiM2Mjtmb3JtYXQ9QVVESU9fUzE2TFNCOworZGVzaXJlZC0mIzYyO3NhbXBsZXM9ODE5MjsKK2Rlc2lyZWQtJiM2MjtjYWxsYmFjaz1teV9hdWRpb19jYWxsYmFjazsKK2Rlc2lyZWQtJiM2Mjt1c2VyZGF0YT1OVUxMOworCisvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KK2lmICggU0RMX09wZW5BdWRpbyhkZXNpcmVkLCBvYnRhaW5lZCkgJiM2MDsgMCApeworICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IG9wZW4gYXVkaW86ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgIGV4aXQoLTEpOworfQorICAgICAgICAKK2ZyZWUoZGVzaXJlZCk7CisKKy8qIExvYWQgdGhlIHRlc3Qud2F2ICovCitpZiggU0RMX0xvYWRXQVYoInRlc3Qud2F2IiwgJiMzODt3YXZfc3BlYywgJiMzODt3YXZfYnVmLCAmIzM4O3dhdl9sZW4pID09IE5VTEwgKXsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiB0ZXN0LndhdjogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgU0RMX0Nsb3NlQXVkaW8oKTsKKyAgZnJlZShvYnRhaW5lZCk7CisgIGV4aXQoLTEpOworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qIEJ1aWxkIEF1ZGlvQ1ZUICovCityZXQgPSBTRExfQnVpbGRBdWRpb0NWVCgmIzM4O3dhdl9jdnQsCisgICAgICAgICAgICAgICAgICAgICAgICB3YXZfc3BlYy5mb3JtYXQsIHdhdl9zcGVjLmNoYW5uZWxzLCB3YXZfc3BlYy5mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgb2J0YWluZWQtJiM2Mjtmb3JtYXQsIG9idGFpbmVkLSYjNjI7Y2hhbm5lbHMsIG9idGFpbmVkLSYjNjI7ZnJlcSk7CisKKy8qIENoZWNrIHRoYXQgdGhlIGNvbnZlcnQgd2FzIGJ1aWx0ICovCitpZihyZXQ9PS0xKXsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBidWlsZCBjb252ZXJ0ZXIhXG4iKTsKKyAgU0RMX0Nsb3NlQXVkaW8oKTsKKyAgZnJlZShvYnRhaW5lZCk7CisgIFNETF9GcmVlV0FWKHdhdl9idWYpOworfQorCisvKiBTZXR1cCBmb3IgY29udmVyc2lvbiAqLword2F2X2N2dC5idWYgPSBtYWxsb2Mod2F2X2xlbiAqIHdhdl9jdnQubGVuX211bHQpOword2F2X2N2dC5sZW4gPSB3YXZfbGVuOworbWVtY3B5KHdhdl9jdnQuYnVmLCB3YXZfYnVmLCB3YXZfbGVuKTsKKworLyogV2UgY2FuIGRlbGV0ZSB0byBvcmlnaW5hbCBXQVYgZGF0YSBub3cgKi8KK1NETF9GcmVlV0FWKHdhdl9idWYpOworCisvKiBBbmQgbm93IHdlJ3JlIHJlYWR5IHRvIGNvbnZlcnQgKi8KK1NETF9Db252ZXJ0QXVkaW8oJiMzODt3YXZfY3Z0KTsKKworLyogZG8gd2hhdGV2ZXIgKi8KKy4KKy4KKy4KKy4KKyYjMTM7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzA5NiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxidWlsZGF1ZGlvY3Z0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0J1aWxkQXVkaW9DVlQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGF1ZGlvY3Z0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0F1ZGlvQ1ZUPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsYnVpbGRhdWRpb2N2dC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbG1peGF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQnVpbGRBdWRpb0NWVDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX01peEF1ZGlvPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbnZlcnRzdXJmYWNlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNvbnZlcnRzdXJmYWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyMWY3OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY29udmVydHN1cmZhY2UuaHRtbApAQCAtMCwwICsxLDI3MSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Db252ZXJ0U3VyZmFjZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9HZXRDbGlwUmVjdCIKK0hSRUY9InNkbGdldGNsaXByZWN0Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0JsaXRTdXJmYWNlIgorSFJFRj0ic2RsYmxpdHN1cmZhY2UuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0Y2xpcHJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGJsaXRzdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQ09OVkVSVFNVUkZBQ0UiCis+PC9BCis+U0RMX0NvbnZlcnRTdXJmYWNlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yMjU4IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NvbnZlcnRTdXJmYWNlJm5ic3A7LS0mbmJzcDtDb252ZXJ0cyBhIHN1cmZhY2UgdG8gdGhlIHNhbWUgZm9ybWF0IGFzIGFub3RoZXIgc3VyZmFjZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMjI2MSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4yMjYyIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC9TREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+U0RMX1N1cmZhY2UgKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Db252ZXJ0U3VyZmFjZTwvQgorPjwvQ09ERQorPihTRExfU3VyZmFjZSAqc3JjLCBTRExfUGl4ZWxGb3JtYXQgKmZtdCwgVWludDMyIGZsYWdzKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjIyNjgiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5DcmVhdGVzIGEgbmV3IHN1cmZhY2Ugb2YgdGhlIHNwZWNpZmllZCBmb3JtYXQsIGFuZCB0aGVuIGNvcGllcyBhbmQgbWFwcwordGhlIGdpdmVuIHN1cmZhY2UgdG8gaXQuICBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCBpdCByZXR1cm5zCis8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+LjwvUAorPjxQCis+VGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmZsYWdzPC9JCis+PC9UVAorPiBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRvIAorPEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlUkdCU3VyZmFjZTwvVFQKKz48L0EKKz4KK2FuZCBoYXMgdGhvc2Ugc2VtYW50aWNzLjwvUAorPjxQCis+VGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFsbHkgYnkgCis8QQorSFJFRj0ic2RsZGlzcGxheWZvcm1hdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9EaXNwbGF5Rm9ybWF0PC9UVAorPjwvQQorPi48L1AKKz48UAorPlRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIFNETF9Jbml0LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMjgwIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgZWl0aGVyIGEgcG9pbnRlciB0byB0aGUgbmV3IHN1cmZhY2UsIG9yCis8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+IG9uIGVycm9yLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMjg0IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlUkdCU3VyZmFjZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZGlzcGxheWZvcm1hdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9EaXNwbGF5Rm9ybWF0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUGl4ZWxGb3JtYXQ8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfU3VyZmFjZTwvU1BBTgorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0Y2xpcHJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxibGl0c3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldENsaXBSZWN0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQmxpdFN1cmZhY2U8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRlY29uZC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjcmVhdGVjb25kLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmY2RiMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRlY29uZC5odG1sCkBAIC0wLDAgKzEsMjQwIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NyZWF0ZUNvbmQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iTXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmciCitIUkVGPSJ0aHJlYWQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1NlbVZhbHVlIgorSFJFRj0ic2Rsc2VtdmFsdWUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfRGVzdHJveUNvbmQiCitIUkVGPSJzZGxkZXN0cm95Y29uZC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZW12YWx1ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZGVzdHJveWNvbmQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDUkVBVEVDT05EIgorPjwvQQorPlNETF9DcmVhdGVDb25kPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU44MjU5IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NyZWF0ZUNvbmQmbmJzcDstLSZuYnNwO0NyZWF0ZSBhIGNvbmRpdGlvbiB2YXJpYWJsZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU44MjYyIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjgyNjMiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5TRExfY29uZCAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0NyZWF0ZUNvbmQ8L0IKKz48L0NPREUKKz4odm9pZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MjY5IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+Q3JlYXRlcyBhIGNvbmRpdGlvbiB2YXJpYWJsZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODI3MiIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+U0RMX2NvbmQgKmNvbmQ7CisKK2NvbmQ9U0RMX0NyZWF0ZUNvbmQoKTsKKy4KKy4KKy8qIERvIHN0dWZmICovCisKKy4KKy4KK1NETF9EZXN0cm95Q29uZChjb25kKTs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44Mjc1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGRlc3Ryb3ljb25kLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0Rlc3Ryb3lDb25kPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxjb25kd2FpdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Db25kV2FpdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY29uZHNpZ25hbC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Db25kU2lnbmFsPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2VtdmFsdWUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxkZXN0cm95Y29uZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NlbVZhbHVlPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0Rlc3Ryb3lDb25kPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNyZWF0ZWN1cnNvci5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjcmVhdGVjdXJzb3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQ0MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjcmVhdGVjdXJzb3IuaHRtbApAQCAtMCwwICsxLDM5OCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DcmVhdGVDdXJzb3I8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfV2FycE1vdXNlIgorSFJFRj0ic2Rsd2FycG1vdXNlLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0ZyZWVDdXJzb3IiCitIUkVGPSJzZGxmcmVlY3Vyc29yLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHdhcnBtb3VzZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZnJlZWN1cnNvci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETENSRUFURUNVUlNPUiIKKz48L0EKKz5TRExfQ3JlYXRlQ3Vyc29yPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yNDg3IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NyZWF0ZUN1cnNvciZuYnNwOy0tJm5ic3A7Q3JlYXRlcyBhIG5ldyBtb3VzZSBjdXJzb3IuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjI0OTAiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjQ5MSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+U0RMX0N1cnNvciAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0NyZWF0ZUN1cnNvcjwvQgorPjwvQ09ERQorPihVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjQ5NyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkNyZWF0ZSBhIGN1cnNvciB1c2luZyB0aGUgc3BlY2lmaWVkIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRhdGE8L0kKKz48L1RUCis+IGFuZCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5tYXNrPC9JCis+PC9UVAorPiAoaW4gTVNCIGZvcm1hdCkuCitUaGUgY3Vyc29yIHdpZHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGJpdHMuPC9QCis+PFAKKz5UaGUgY3Vyc29yIGlzIGNyZWF0ZWQgaW4gYmxhY2sgYW5kIHdoaXRlIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nOgorPERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjI1MDMiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMSIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRIRUFECis+PFRSCis+PFRICitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkRhdGEgLyBNYXNrPC9USAorPjxUSAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5SZXN1bHRpbmcgcGl4ZWwgb24gc2NyZWVuPC9USAorPjwvVFIKKz48L1RIRUFECis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjAgLyAxPC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5XaGl0ZTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjEgLyAxPC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5CbGFjazwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjAgLyAwPC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UcmFuc3BhcmVudDwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjEgLyAwPC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5JbnZlcnRlZCBjb2xvciBpZiBwb3NzaWJsZSwgYmxhY2sgaWYgbm90LjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9QCis+PFAKKz5DdXJzb3JzIGNyZWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgZnJlZWQgd2l0aAorPEEKK0hSRUY9InNkbGZyZWVjdXJzb3IuaHRtbCIKKz5TRExfRnJlZUN1cnNvcjwvQQorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjUyNCIKKz48L0EKKz48SDIKKz5FeGFtcGxlPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4vKiBTdG9sZW4gZnJvbSB0aGUgbWFpbGluZyBsaXN0ICovCisvKiBDcmVhdGVzIGEgbmV3IG1vdXNlIGN1cnNvciBmcm9tIGFuIFhQTSAqLworCisKKy8qIFhQTSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFycm93W10gPSB7CisgIC8qIHdpZHRoIGhlaWdodCBudW1fY29sb3JzIGNoYXJzX3Blcl9waXhlbCAqLworICAiICAgIDMyICAgIDMyICAgICAgICAzICAgICAgICAgICAgMSIsCisgIC8qIGNvbG9ycyAqLworICAiWCBjICMwMDAwMDAiLAorICAiLiBjICNmZmZmZmYiLAorICAiICBjIE5vbmUiLAorICAvKiBwaXhlbHMgKi8KKyAgIlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguLlggICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguLi5YICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguLi4uWCAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguLi4uLlggICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguLi4uLi5YICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguLi4uLi4uWCAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguLi4uLi4uLlggICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguLi4uLlhYWFhYICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguLlguLlggICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlguWCBYLi5YICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlhYICBYLi5YICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlggICAgWC4uWCAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgWC4uWCAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgIFguLlggICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgIFguLlggICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICBYWCAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIjAsMCIKK307CisKK3N0YXRpYyBTRExfQ3Vyc29yICppbml0X3N5c3RlbV9jdXJzb3IoY29uc3QgY2hhciAqaW1hZ2VbXSkKK3sKKyAgaW50IGksIHJvdywgY29sOworICBVaW50OCBkYXRhWzQqMzJdOworICBVaW50OCBtYXNrWzQqMzJdOworICBpbnQgaG90X3gsIGhvdF95OworCisgIGkgPSAtMTsKKyAgZm9yICggcm93PTA7IHJvdyYjNjA7MzI7ICsrcm93ICkgeworICAgIGZvciAoIGNvbD0wOyBjb2wmIzYwOzMyOyArK2NvbCApIHsKKyAgICAgIGlmICggY29sICUgOCApIHsKKyAgICAgICAgZGF0YVtpXSAmIzYwOyYjNjA7PSAxOworICAgICAgICBtYXNrW2ldICYjNjA7JiM2MDs9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICArK2k7CisgICAgICAgIGRhdGFbaV0gPSBtYXNrW2ldID0gMDsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoaW1hZ2VbNCtyb3ddW2NvbF0pIHsKKyAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgZGF0YVtpXSB8PSAweDAxOworICAgICAgICAgIG1hc2tbaV0gfD0gMHgwMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnLic6CisgICAgICAgICAgbWFza1tpXSB8PSAweDAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc3NjYW5mKGltYWdlWzQrcm93XSwgIiVkLCVkIiwgJiMzODtob3RfeCwgJiMzODtob3RfeSk7CisgIHJldHVybiBTRExfQ3JlYXRlQ3Vyc29yKGRhdGEsIG1hc2ssIDMyLCAzMiwgaG90X3gsIGhvdF95KTsKK308L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNTI3IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGZyZWVjdXJzb3IuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRnJlZUN1cnNvcjwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2V0Y3Vyc29yLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldEN1cnNvcjwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2hvd2N1cnNvci5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TaG93Q3Vyc29yPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsd2FycG1vdXNlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZnJlZWN1cnNvci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1dhcnBNb3VzZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0ZyZWVDdXJzb3I8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRlbXV0ZXguaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRlbXV0ZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2VkNDhiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjcmVhdGVtdXRleC5odG1sCkBAIC0wLDAgKzEsMjQ5IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NyZWF0ZU11dGV4PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9Ik11bHRpLXRocmVhZGVkIFByb2dyYW1taW5nIgorSFJFRj0idGhyZWFkLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9LaWxsVGhyZWFkIgorSFJFRj0ic2Rsa2lsbHRocmVhZC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9EZXN0cm95TXV0ZXgiCitIUkVGPSJzZGxkZXN0cm95bXV0ZXguaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsa2lsbHRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZGVzdHJveW11dGV4Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQ1JFQVRFTVVURVgiCis+PC9BCis+U0RMX0NyZWF0ZU11dGV4PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43ODIwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NyZWF0ZU11dGV4Jm5ic3A7LS0mbmJzcDtDcmVhdGUgYSBtdXRleDwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43ODIzIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjc4MjQiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5TRExfbXV0ZXggKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9DcmVhdGVNdXRleDwvQgorPjwvQ09ERQorPih2b2lkKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc4MzAiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5DcmVhdGUgYSBuZXcsIHVubG9ja2VkIG11dGV4LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43ODMzIgorPjwvQQorPjxIMgorPkV4YW1wbGVzPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfbXV0ZXggKm11dDsKKworbXV0PVNETF9DcmVhdGVNdXRleCgpOworLgorLgoraWYoU0RMX211dGV4UChtdXQpPT0tMSl7CisgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgbG9jayBtdXRleFxuIik7CisgIGV4aXQoLTEpOworfQorLgorLyogRG8gc3R1ZmYgd2hpbGUgbXV0ZXggaXMgbG9ja2VkICovCisuCisuCitpZihTRExfbXV0ZXhWKG11dCk9PS0xKXsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCB1bmxvY2sgbXV0ZXhcbiIpOworICBleGl0KC0xKTsKK30KKworU0RMX0Rlc3Ryb3lNdXRleChtdXQpOyYjMTM7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzgzNiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxtdXRleHAuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfbXV0ZXhQPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxtdXRleHYuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfbXV0ZXhWPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxkZXN0cm95bXV0ZXguaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRGVzdHJveU11dGV4PC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsa2lsbHRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGRlc3Ryb3ltdXRleC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0tpbGxUaHJlYWQ8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfRGVzdHJveU11dGV4PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNyZWF0ZXJnYnN1cmZhY2UuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRlcmdic3VyZmFjZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNmVjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNyZWF0ZXJnYnN1cmZhY2UuaHRtbApAQCAtMCwwICsxLDQ1OCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DcmVhdGVSR0JTdXJmYWNlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0dldFJHQkEiCitIUkVGPSJzZGxnZXRyZ2JhLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tIgorSFJFRj0ic2RsY3JlYXRlcmdic3VyZmFjZWZyb20uaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0cmdiYS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY3JlYXRlcmdic3VyZmFjZWZyb20uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDUkVBVEVSR0JTVVJGQUNFIgorPjwvQQorPlNETF9DcmVhdGVSR0JTdXJmYWNlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4xNzczIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NyZWF0ZVJHQlN1cmZhY2UmbmJzcDstLSZuYnNwO0NyZWF0ZSBhbiBlbXB0eSBTRExfU3VyZmFjZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4xNzc2IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjE3NzciCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9TdXJmYWNlICo8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfQ3JlYXRlUkdCU3VyZmFjZTwvQgorPjwvQ09ERQorPihVaW50MzIgZmxhZ3MsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBVaW50MzIgUm1hc2ssIFVpbnQzMiBHbWFzaywgVWludDMyIEJtYXNrLCBVaW50MzIgQW1hc2spOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTc4MyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkFsbG9jYXRlIGFuIGVtcHR5IHN1cmZhY2UgKG11c3QgYmUgY2FsbGVkIGFmdGVyIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz5TRExfU2V0VmlkZW9Nb2RlPC9BCis+KTwvUAorPjxQCis+SWYgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZGVwdGg8L0kKKz48L1RUCis+IGlzIDggYml0cyBhbiBlbXB0eSBwYWxldHRlIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHN1cmZhY2UsIG90aGVyd2lzZSBhICdwYWNrZWQtcGl4ZWwnIDxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUGl4ZWxGb3JtYXQ8L1NQQU4KKz48L0EKKz4gaXMgY3JlYXRlZCB1c2luZyB0aGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+W1JHQkFdbWFzazwvSQorPjwvVFQKKz4ncyBwcm92aWRlZCAoc2VlIDxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUGl4ZWxGb3JtYXQ8L1NQQU4KKz48L0EKKz4pLiBUaGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZmxhZ3M8L0kKKz48L1RUCis+IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBzdXJmYWNlIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQsIGl0IGlzIGFuIE9SJ2QgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBwb3NzaWJsZSB2YWx1ZXMuPC9QCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjE3OTUiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMSIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1NXU1VSRkFDRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETCB3aWxsIGNyZWF0ZSB0aGUgc3VyZmFjZSBpbiBzeXN0ZW0gbWVtb3J5LiBUaGlzIGltcHJvdmVzIHRoZSBwZXJmb3JtYW5jZSBvZiBwaXhlbCBsZXZlbCBhY2Nlc3MsIGhvd2V2ZXIgeW91IG1heSBub3QgYmUgYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZiBzb21lIHR5cGVzIG9mIGhhcmR3YXJlIGJsaXR0aW5nLjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hXU1VSRkFDRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETCB3aWxsIGF0dGVtcHQgdG8gY3JlYXRlIHRoZSBzdXJmYWNlIGluIHZpZGVvIG1lbW9yeS4gVGhpcyB3aWxsIGFsbG93IFNETCB0byB0YWtlIGFkdmFudGFnZSBvZiBWaWRlby0mIzYyO1ZpZGVvIGJsaXRzICh3aGljaCBhcmUgb2Z0ZW4gYWNjZWxlcmF0ZWQpLjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1NSQ0NPTE9SS0VZPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+VGhpcyBmbGFnIHR1cm5zIG9uIGNvbG91cmtleWluZyBmb3IgYmxpdHMgZnJvbSB0aGlzIHN1cmZhY2UuIElmCis8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IV1NVUkZBQ0U8L1RUCis+IGlzIGFsc28gc3BlY2lmaWVkIGFuZCBjb2xvdXJrZXllZCBibGl0cworYXJlIGhhcmR3YXJlLWFjY2VsZXJhdGVkLCB0aGVuIFNETCB3aWxsIGF0dGVtcHQgdG8gcGxhY2UgdGhlIHN1cmZhY2UgaW4KK3ZpZGVvIG1lbW9yeS4KK1VzZSA8QQorSFJFRj0ic2Rsc2V0Y29sb3JrZXkuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0Q29sb3JLZXk8L1RUCis+PC9BCis+Cit0byBzZXQgb3IgY2xlYXIgdGhpcyBmbGFnIGFmdGVyIHN1cmZhY2UgY3JlYXRpb24uPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1JDQUxQSEE8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UaGlzIGZsYWcgdHVybnMgb24gYWxwaGEtYmxlbmRpbmcgZm9yIGJsaXRzIGZyb20gdGhpcyBzdXJmYWNlLiBJZgorPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSFdTVVJGQUNFPC9UVAorPiBpcyBhbHNvIHNwZWNpZmllZCBhbmQgYWxwaGEtYmxlbmRpbmcgYmxpdHMKK2FyZSBoYXJkd2FyZS1hY2NlbGVyYXRlZCwgdGhlbiB0aGUgc3VyZmFjZSB3aWxsIGJlIHBsYWNlZCBpbiB2aWRlbyBtZW1vcnkgaWYKK3Bvc3NpYmxlLgorVXNlIDxBCitIUkVGPSJzZGxzZXRhbHBoYS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRBbHBoYTwvVFQKKz48L0EKKz4gdG8KK3NldCBvciBjbGVhciB0aGlzIGZsYWcgYWZ0ZXIgc3VyZmFjZSBjcmVhdGlvbi48L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+SWYgYW4gYWxwaGEtY2hhbm5lbCBpcyBzcGVjaWZpZWQgKHRoYXQgaXMsIGlmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPkFtYXNrPC9JCis+PC9UVAorPiBpcworbm9uemVybyksIHRoZW4gdGhlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1NSQ0FMUEhBPC9UVAorPiBmbGFnIGlzIGF1dG9tYXRpY2FsbHkKK3NldC4gWW91IG1heSByZW1vdmUgdGhpcyBmbGFnIGJ5IGNhbGxpbmcgCis8QQorSFJFRj0ic2Rsc2V0YWxwaGEuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0QWxwaGE8L1RUCis+PC9BCis+CithZnRlciBzdXJmYWNlIGNyZWF0aW9uLjwvUAorPjwvQkxPQ0tRVU9URQorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE4MjYiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyB0aGUgY3JlYXRlZCBzdXJmYWNlLCBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPk5VTEw8L1NQQU4KKz4gdXBvbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTgzMCIKKz48L0EKKz48SDIKKz5FeGFtcGxlPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgLyogQ3JlYXRlIGEgMzItYml0IHN1cmZhY2Ugd2l0aCB0aGUgYnl0ZXMgb2YgZWFjaCBwaXhlbCBpbiBSLEcsQixBIG9yZGVyLAorICAgICAgIGFzIGV4cGVjdGVkIGJ5IE9wZW5HTCBmb3IgdGV4dHVyZXMgKi8KKyAgICBTRExfU3VyZmFjZSAqc3VyZmFjZTsKKyAgICBVaW50MzIgcm1hc2ssIGdtYXNrLCBibWFzaywgYW1hc2s7CisKKyAgICAvKiBTREwgaW50ZXJwcmV0cyBlYWNoIHBpeGVsIGFzIGEgMzItYml0IG51bWJlciwgc28gb3VyIG1hc2tzIG11c3QgZGVwZW5kCisgICAgICAgb24gdGhlIGVuZGlhbm5lc3MgKGJ5dGUgb3JkZXIpIG9mIHRoZSBtYWNoaW5lICovCisjaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTgorICAgIHJtYXNrID0gMHhmZjAwMDAwMDsKKyAgICBnbWFzayA9IDB4MDBmZjAwMDA7CisgICAgYm1hc2sgPSAweDAwMDBmZjAwOworICAgIGFtYXNrID0gMHgwMDAwMDBmZjsKKyNlbHNlCisgICAgcm1hc2sgPSAweDAwMDAwMGZmOworICAgIGdtYXNrID0gMHgwMDAwZmYwMDsKKyAgICBibWFzayA9IDB4MDBmZjAwMDA7CisgICAgYW1hc2sgPSAweGZmMDAwMDAwOworI2VuZGlmCisKKyAgICBzdXJmYWNlID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwgd2lkdGgsIGhlaWdodCwgMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtYXNrLCBnbWFzaywgYm1hc2ssIGFtYXNrKTsKKyAgICBpZihzdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDcmVhdGVSR0JTdXJmYWNlIGZhaWxlZDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTgzMyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxjcmVhdGVyZ2JzdXJmYWNlZnJvbS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVSR0JTdXJmYWNlRnJvbTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZnJlZXN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRnJlZVN1cmZhY2U8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNldHZpZGVvbW9kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGxvY2tzdXJmYWNlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvY2tTdXJmYWNlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUGl4ZWxGb3JtYXQ8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfU3VyZmFjZTwvU1BBTgorPjwvQQorPgorPEEKK0hSRUY9InNkbHNldGFscGhhLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldEFscGhhPC9UVAorPjwvQQorPgorPEEKK0hSRUY9InNkbHNldGNvbG9ya2V5Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldENvbG9yS2V5PC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0cmdiYS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2Vmcm9tLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfR2V0UkdCQTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNyZWF0ZXJnYnN1cmZhY2Vmcm9tLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNyZWF0ZXJnYnN1cmZhY2Vmcm9tLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjZmRjYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRlcmdic3VyZmFjZWZyb20uaHRtbApAQCAtMCwwICsxLDI1NiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9DcmVhdGVSR0JTdXJmYWNlRnJvbTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9DcmVhdGVSR0JTdXJmYWNlIgorSFJFRj0ic2RsY3JlYXRlcmdic3VyZmFjZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9GcmVlU3VyZmFjZSIKK0hSRUY9InNkbGZyZWVzdXJmYWNlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGZyZWVzdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMQ1JFQVRFUkdCU1VSRkFDRUZST00iCis+PC9BCis+U0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4xODU2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tJm5ic3A7LS0mbmJzcDtDcmVhdGUgYW4gU0RMX1N1cmZhY2UgZnJvbSBwaXhlbCBkYXRhPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjE4NTkiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMTg2MCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+U0RMX1N1cmZhY2UgKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9DcmVhdGVSR0JTdXJmYWNlRnJvbTwvQgorPjwvQ09ERQorPih2b2lkICpwaXhlbHMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGl0Y2gsIFVpbnQzMiBSbWFzaywgVWludDMyIEdtYXNrLCBVaW50MzIgQm1hc2ssIFVpbnQzMiBBbWFzayk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xODY2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+Q3JlYXRlcyBhbiBTRExfU3VyZmFjZSBmcm9tIHRoZSBwcm92aWRlZCBwaXhlbCBkYXRhLjwvUAorPjxQCis+VGhlIGRhdGEgc3RvcmVkIGluIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnBpeGVsczwvSQorPjwvVFQKKz4gaXMgYXNzdW1lZCB0byBiZSBvZiB0aGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZGVwdGg8L0kKKz48L1RUCis+IHNwZWNpZmllZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QuIFRoZSBwaXhlbCBkYXRhIGlzIG5vdCBjb3BpZWQgaW50byB0aGUgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+IHN0cnVjdHVyZSBzbyBpdCBzaG91bGQgbm90IGJlIGZyZWVkIHVudGlsIHRoZSBzdXJmYWNlIGhhcyBiZWVuIGZyZWVkIHdpdGggYSBjYWxsZWQgdG8gPEEKK0hSRUY9InNkbGZyZWVzdXJmYWNlLmh0bWwiCis+U0RMX0ZyZWVTdXJmYWNlPC9BCis+LiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5waXRjaDwvSQorPjwvVFQKKz4gaXMgdGhlIGxlbmd0aCBvZiBlYWNoIHNjYW5saW5lIGluIGJ5dGVzLiAgPC9QCis+PFAKKz5TZWUgPEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlUkdCU3VyZmFjZTwvVFQKKz48L0EKKz4gZm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgb3RoZXIgcGFyYW1ldGVycy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTg3OCIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5SZXR1cm5zIHRoZSBjcmVhdGVkIHN1cmZhY2UsIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+TlVMTDwvU1BBTgorPiB1cG9uIGVycm9yLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xODgyIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlUkdCU3VyZmFjZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZnJlZXN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRnJlZVN1cmZhY2U8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjcmVhdGVyZ2JzdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZnJlZXN1cmZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9DcmVhdGVSR0JTdXJmYWNlPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfRnJlZVN1cmZhY2U8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRlc2VtYXBob3JlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNyZWF0ZXNlbWFwaG9yZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZGNiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNyZWF0ZXNlbWFwaG9yZS5odG1sCkBAIC0wLDAgKzEsMzAzIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NyZWF0ZVNlbWFwaG9yZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJNdWx0aS10aHJlYWRlZCBQcm9ncmFtbWluZyIKK0hSRUY9InRocmVhZC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfbXV0ZXhWIgorSFJFRj0ic2RsbXV0ZXh2Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0Rlc3Ryb3lTZW1hcGhvcmUiCitIUkVGPSJzZGxkZXN0cm95c2VtYXBob3JlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG11dGV4di5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZGVzdHJveXNlbWFwaG9yZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETENSRUFURVNFTUFQSE9SRSIKKz48L0EKKz5TRExfQ3JlYXRlU2VtYXBob3JlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43OTM2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NyZWF0ZVNlbWFwaG9yZSZuYnNwOy0tJm5ic3A7Q3JlYXRlcyBhIG5ldyBzZW1hcGhvcmUgYW5kIGFzc2lnbnMgYW4gaW5pdGlhbCB2YWx1ZSB0byBpdC48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONzkzOSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU43OTQwIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+U0RMX3NlbSAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0NyZWF0ZVNlbWFwaG9yZTwvQgorPjwvQ09ERQorPihVaW50MzIgaW5pdGlhbF92YWx1ZSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43OTQ2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NyZWF0ZVNlbWFwaG9yZSgpPC9UVAorPiBjcmVhdGVzIGEgbmV3IHNlbWFwaG9yZSBhbmQKK2luaXRpYWxpemVzIGl0IHdpdGggdGhlIHZhbHVlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmluaXRpYWxfdmFsdWU8L0kKKz48L1RUCis+LgorRWFjaCBsb2NraW5nIG9wZXJhdGlvbiBvbiB0aGUgc2VtYXBob3JlIGJ5Cis8QQorSFJFRj0ic2Rsc2Vtd2FpdC5odG1sIgorPlNETF9TZW1XYWl0PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXRyeXdhaXQuaHRtbCIKKz5TRExfU2VtVHJ5V2FpdDwvQQorPiBvcgorPEEKK0hSRUY9InNkbHNlbXdhaXR0aW1lb3V0Lmh0bWwiCis+U0RMX1NlbVdhaXRUaW1lb3V0PC9BCis+Cit3aWxsIGF0b21pY2FsbHkgZGVjcmVtZW50IHRoZSBzZW1hcGhvcmUgdmFsdWUuIFRoZSBsb2NraW5nIG9wZXJhdGlvbiB3aWxsIGJlIGJsb2NrZWQKK2lmIHRoZSBzZW1hcGhvcmUgdmFsdWUgaXMgbm90IHBvc2l0aXZlIChncmVhdGVyIHRoYW4gemVybykuIEVhY2ggdW5sb2NrIG9wZXJhdGlvbiBieQorPEEKK0hSRUY9InNkbHNlbXBvc3QuaHRtbCIKKz5TRExfU2VtUG9zdDwvQQorPgord2lsbCBhdG9taWNhbGx5IGluY3JlbWVudCB0aGUgc2VtYXBob3JlIHZhbHVlLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43OTU1IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgYSBwb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIHNlbWFwaG9yZSBvcgorPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz5OVUxMPC9TUEFOCis+IGlmIHRoZXJlIHdhcyBhbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzk1OSIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfc2VtICpteV9zZW07CisKK215X3NlbSA9IFNETF9DcmVhdGVTZW1hcGhvcmUoSU5JVElBTF9TRU1fVkFMVUUpOworCitpZiAobXlfc2VtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIENSRUFURV9TRU1fRkFJTEVEOworfTwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc5NjMiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZGVzdHJveXNlbWFwaG9yZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9EZXN0cm95U2VtYXBob3JlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW13YWl0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVdhaXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXRyeXdhaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtVHJ5V2FpdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2Vtd2FpdHRpbWVvdXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtV2FpdFRpbWVvdXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXBvc3QuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtUG9zdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2VtdmFsdWUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtVmFsdWU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxtdXRleHYuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxkZXN0cm95c2VtYXBob3JlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfbXV0ZXhWPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0Rlc3Ryb3lTZW1hcGhvcmU8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRldGhyZWFkLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNyZWF0ZXRocmVhZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2MyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGNyZWF0ZXRocmVhZC5odG1sCkBAIC0wLDAgKzEsMjIzIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NyZWF0ZVRocmVhZDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJNdWx0aS10aHJlYWRlZCBQcm9ncmFtbWluZyIKK0hSRUY9InRocmVhZC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJNdWx0aS10aHJlYWRlZCBQcm9ncmFtbWluZyIKK0hSRUY9InRocmVhZC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9UaHJlYWRJRCIKK0hSRUY9InNkbHRocmVhZGlkLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsdGhyZWFkaWQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDUkVBVEVUSFJFQUQiCis+PC9BCis+U0RMX0NyZWF0ZVRocmVhZDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzcwMSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9DcmVhdGVUaHJlYWQmbmJzcDstLSZuYnNwO0NyZWF0ZXMgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbiB0aGF0IHNoYXJlcyBpdHMgcGFyZW50J3MgcHJvcGVydGllcy48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONzcwNCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU43NzA1IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+U0RMX1RocmVhZCAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0NyZWF0ZVRocmVhZDwvQgorPjwvQ09ERQorPihpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NzExIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NyZWF0ZVRocmVhZDwvVFQKKz4gY3JlYXRlcyBhIG5ldyB0aHJlYWQgb2YgZXhlY3V0aW9uIAordGhhdCBzaGFyZXMgYWxsIG9mIGl0cyBwYXJlbnQncyBnbG9iYWwgbWVtb3J5LCBzaWduYWwgaGFuZGxlcnMsIAorZmlsZSBkZXNjcmlwdG9ycywgZXRjLCBhbmQgcnVucyB0aGUgZnVuY3Rpb24gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+Zm48L0kKKz48L1RUCis+CitwYXNzZWQgdGhlIHZvaWQgcG9pbnRlciA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kYXRhPC9JCis+PC9UVAorPgorVGhlIHRocmVhZCBxdWl0cyB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzcxNyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxraWxsdGhyZWFkLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0tpbGxUaHJlYWQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx0aHJlYWRpZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+TXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmc8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfVGhyZWFkSUQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxjcmVhdGV5dXZvdmVybGF5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0ZWY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsY3JlYXRleXV2b3ZlcmxheS5odG1sCkBAIC0wLDAgKzEsMjU2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0NyZWF0ZVlVVk92ZXJsYXk8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR0xfU3dhcEJ1ZmZlcnMiCitIUkVGPSJzZGxnbHN3YXBidWZmZXJzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0xvY2tZVVZPdmVybGF5IgorSFJFRj0ic2RsbG9ja3l1dm92ZXJsYXkuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2xzd2FwYnVmZmVycy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsbG9ja3l1dm92ZXJsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExDUkVBVEVZVVZPVkVSTEFZIgorPjwvQQorPlNETF9DcmVhdGVZVVZPdmVybGF5PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yODA4IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0NyZWF0ZVlVVk92ZXJsYXkmbmJzcDstLSZuYnNwO0NyZWF0ZSBhIFlVViB2aWRlbyBvdmVybGF5PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjI4MTEiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjgxMiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+U0RMX092ZXJsYXkgKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9DcmVhdGVZVVZPdmVybGF5PC9CCis+PC9DT0RFCis+KGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjgxOCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVZVVZPdmVybGF5PC9UVAorPiBjcmVhdGVzIGEgWVVWIG92ZXJsYXkgb2YgdGhlIHNwZWNpZmllZCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz53aWR0aDwvSQorPjwvVFQKKz4sIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmhlaWdodDwvSQorPjwvVFQKKz4gYW5kIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmZvcm1hdDwvSQorPjwvVFQKKz4gKHNlZSA8QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfT3ZlcmxheTwvU1BBTgorPjwvQQorPiBmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBmb3JtYXRzKSwgZm9yIHRoZSBwcm92aWRlZCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kaXNwbGF5PC9JCis+PC9UVAorPi4gQSA8QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfT3ZlcmxheTwvU1BBTgorPjwvQQorPiBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuPC9QCis+PFAKKz5UaGUgdGVybSAnb3ZlcmxheScgaXMgYSBtaXNub21lciBzaW5jZSwgdW5sZXNzIHRoZSBvdmVybGF5IGlzIGNyZWF0ZWQgaW4gaGFyZHdhcmUsIHRoZSBjb250ZW50cyBmb3IgdGhlIGRpc3BsYXkgc3VyZmFjZSB1bmRlcm5lYXRoIHRoZSBhcmVhIHdoZXJlIHRoZSBvdmVybGF5IGlzIHNob3duIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3ZlcmxheSBpcyBkaXNwbGF5ZWQuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI4MzEiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfT3ZlcmxheTwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxkaXNwbGF5eXV2b3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9EaXNwbGF5WVVWT3ZlcmxheTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZnJlZXl1dm92ZXJsYXkuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRnJlZVlVVk92ZXJsYXk8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnbHN3YXBidWZmZXJzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsbG9ja3l1dm92ZXJsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9HTF9Td2FwQnVmZmVyczwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0xvY2tZVVZPdmVybGF5PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRlbGF5Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRlbGF5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0MTdmYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZGVsYXkuaHRtbApAQCAtMCwwICsxLDIzMSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9EZWxheTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJUaW1lIgorSFJFRj0idGltZS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR2V0VGlja3MiCitIUkVGPSJzZGxnZXR0aWNrcy5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9BZGRUaW1lciIKK0hSRUY9InNkbGFkZHRpbWVyLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdldHRpY2tzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxhZGR0aW1lci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETERFTEFZIgorPjwvQQorPlNETF9EZWxheTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOODQ1NSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9EZWxheSZuYnNwOy0tJm5ic3A7V2FpdCBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSByZXR1cm5pbmcuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjg0NTgiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOODQ1OSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfRGVsYXk8L0IKKz48L0NPREUKKz4oVWludDMyIG1zKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjg0NjUiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5XYWl0IGEgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHJldHVybmluZy4gPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0RlbGF5PC9UVAorPiB3aWxsIHdhaXQgYXQgPFNQQU4KK0NMQVNTPSJlbXBoYXNpcyIKKz48SQorQ0xBU1M9IkVNUEhBU0lTIgorPmxlYXN0PC9JCis+PC9TUEFOCis+IHRoZSBzcGVjaWZpZWQgdGltZSwgYnV0IHBvc3NpYmxlIGxvbmdlciBkdWUgdG8gT1Mgc2NoZWR1bGluZy48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPkNvdW50IG9uIGEgZGVsYXkgZ3JhbnVsYXJpdHkgb2YgPFNQQU4KK0NMQVNTPSJlbXBoYXNpcyIKKz48SQorQ0xBU1M9IkVNUEhBU0lTIgorPmF0IGxlYXN0PC9JCis+PC9TUEFOCis+IDEwIG1zLgorU29tZSBwbGF0Zm9ybXMgaGF2ZSBzaG9ydGVyIGNsb2NrIHRpY2tzIGJ1dCB0aGlzIGlzIHRoZSBtb3N0IGNvbW1vbi48L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44NDczIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGFkZHRpbWVyLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0FkZFRpbWVyPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0dGlja3MuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxhZGR0aW1lci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldFRpY2tzPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGltZS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9BZGRUaW1lcjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxkZXN0cm95Y29uZC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxkZXN0cm95Y29uZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMDgwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRlc3Ryb3ljb25kLmh0bWwKQEAgLTAsMCArMSwyMDYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfRGVzdHJveUNvbmQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iTXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmciCitIUkVGPSJ0aHJlYWQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NyZWF0ZUNvbmQiCitIUkVGPSJzZGxjcmVhdGVjb25kLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0NvbmRTaWduYWwiCitIUkVGPSJzZGxjb25kc2lnbmFsLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNyZWF0ZWNvbmQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNvbmRzaWduYWwuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExERVNUUk9ZQ09ORCIKKz48L0EKKz5TRExfRGVzdHJveUNvbmQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjgyODgiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfRGVzdHJveUNvbmQmbmJzcDstLSZuYnNwO0Rlc3Ryb3kgYSBjb25kaXRpb24gdmFyaWFibGU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOODI5MSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU44MjkyIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfRGVzdHJveUNvbmQ8L0IKKz48L0NPREUKKz4oU0RMX2NvbmQgKmNvbmQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODI5OCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkRlc3Ryb3lzIGEgY29uZGl0aW9uIHZhcmlhYmxlLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MzAxIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZWNvbmQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlQ29uZDwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNyZWF0ZWNvbmQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjb25kc2lnbmFsLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQ3JlYXRlQ29uZDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Db25kU2lnbmFsPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRlc3Ryb3ltdXRleC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxkZXN0cm95bXV0ZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDliZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxkZXN0cm95bXV0ZXguaHRtbApAQCAtMCwwICsxLDIwOSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9EZXN0cm95TXV0ZXg8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iTXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmciCitIUkVGPSJ0aHJlYWQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NyZWF0ZU11dGV4IgorSFJFRj0ic2RsY3JlYXRlbXV0ZXguaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfbXV0ZXhQIgorSFJFRj0ic2RsbXV0ZXhwLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNyZWF0ZW11dGV4Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxtdXRleHAuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExERVNUUk9ZTVVURVgiCis+PC9BCis+U0RMX0Rlc3Ryb3lNdXRleDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzg0OSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9EZXN0cm95TXV0ZXgmbmJzcDstLSZuYnNwO0Rlc3Ryb3kgYSBtdXRleDwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43ODUyIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjc4NTMiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9EZXN0cm95TXV0ZXg8L0IKKz48L0NPREUKKz4oU0RMX211dGV4ICptdXRleCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43ODU5IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+RGVzdHJveSBhIHByZXZpb3VzbHkgPEEKK0hSRUY9InNkbGNyZWF0ZW11dGV4Lmh0bWwiCis+Y3JlYXRlZDwvQQorPiBtdXRleC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzg2MyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxjcmVhdGVtdXRleC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVNdXRleDwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNyZWF0ZW11dGV4Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsbXV0ZXhwLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQ3JlYXRlTXV0ZXg8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfbXV0ZXhQPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRlc3Ryb3lzZW1hcGhvcmUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZGVzdHJveXNlbWFwaG9yZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMmJkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRlc3Ryb3lzZW1hcGhvcmUuaHRtbApAQCAtMCwwICsxLDI3OCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9EZXN0cm95U2VtYXBob3JlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9Ik11bHRpLXRocmVhZGVkIFByb2dyYW1taW5nIgorSFJFRj0idGhyZWFkLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9DcmVhdGVTZW1hcGhvcmUiCitIUkVGPSJzZGxjcmVhdGVzZW1hcGhvcmUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2VtV2FpdCIKK0hSRUY9InNkbHNlbXdhaXQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZW13YWl0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMREVTVFJPWVNFTUFQSE9SRSIKKz48L0EKKz5TRExfRGVzdHJveVNlbWFwaG9yZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzk4MiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9EZXN0cm95U2VtYXBob3JlJm5ic3A7LS0mbmJzcDtEZXN0cm95cyBhIHNlbWFwaG9yZSB0aGF0IHdhcyBjcmVhdGVkIGJ5IDxBCitIUkVGPSJzZGxjcmVhdGVzZW1hcGhvcmUuaHRtbCIKKz5TRExfQ3JlYXRlU2VtYXBob3JlPC9BCis+LjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43OTg2IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjc5ODciCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9EZXN0cm95U2VtYXBob3JlPC9CCis+PC9DT0RFCis+KFNETF9zZW0gKnNlbSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43OTkzIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0Rlc3Ryb3lTZW1hcGhvcmU8L1RUCis+IGRlc3Ryb3lzIHRoZSBzZW1hcGhvcmUgcG9pbnRlZCB0bworYnkgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c2VtPC9JCis+PC9UVAorPiB0aGF0IHdhcyBjcmVhdGVkIGJ5Cis8QQorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NyZWF0ZVNlbWFwaG9yZTwvVFQKKz48L0EKKz4uCitJdCBpcyBub3Qgc2FmZSB0byBkZXN0cm95IGEgc2VtYXBob3JlIGlmIHRoZXJlIGFyZSB0aHJlYWRzIGN1cnJlbnRseSBibG9ja2VkCit3YWl0aW5nIG9uIGl0LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MDAwIgorPjwvQQorPjxIMgorPkV4YW1wbGVzPC9IMgorPjxQCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPmlmIChteV9zZW0gIT0gTlVMTCkgeworICAgICAgICBTRExfRGVzdHJveVNlbWFwaG9yZShteV9zZW0pOworICAgICAgICBteV9zZW0gPSBOVUxMOworfTwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjgwMDQiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NyZWF0ZVNlbWFwaG9yZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2Vtd2FpdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZW1XYWl0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW10cnl3YWl0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVRyeVdhaXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXdhaXR0aW1lb3V0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVdhaXRUaW1lb3V0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW1wb3N0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVBvc3Q8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXZhbHVlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVZhbHVlPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2Vtd2FpdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NyZWF0ZVNlbWFwaG9yZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9TZW1XYWl0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRpc3BsYXlmb3JtYXQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZGlzcGxheWZvcm1hdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MWFkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRpc3BsYXlmb3JtYXQuaHRtbApAQCAtMCwwICsxLDI2MiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9EaXNwbGF5Rm9ybWF0PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0ZpbGxSZWN0IgorSFJFRj0ic2RsZmlsbHJlY3QuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfRGlzcGxheUZvcm1hdEFscGhhIgorSFJFRj0ic2RsZGlzcGxheWZvcm1hdGFscGhhLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGZpbGxyZWN0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxkaXNwbGF5Zm9ybWF0YWxwaGEuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExESVNQTEFZRk9STUFUIgorPjwvQQorPlNETF9EaXNwbGF5Rm9ybWF0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yMzk0IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0Rpc3BsYXlGb3JtYXQmbmJzcDstLSZuYnNwO0NvbnZlcnQgYSBzdXJmYWNlIHRvIHRoZSBkaXNwbGF5IGZvcm1hdDwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4yMzk3IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjIzOTgiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9TdXJmYWNlICo8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfRGlzcGxheUZvcm1hdDwvQgorPjwvQ09ERQorPihTRExfU3VyZmFjZSAqc3VyZmFjZSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNDA0IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+VGhpcyBmdW5jdGlvbiB0YWtlcyBhIHN1cmZhY2UgYW5kIGNvcGllcyBpdCB0byBhIG5ldyBzdXJmYWNlIG9mIHRoZQorcGl4ZWwgZm9ybWF0IGFuZCBjb2xvcnMgb2YgdGhlIHZpZGVvIGZyYW1lYnVmZmVyLCBzdWl0YWJsZSBmb3IgZmFzdAorYmxpdHRpbmcgb250byB0aGUgZGlzcGxheSBzdXJmYWNlLiAgSXQgY2FsbHMKKzxBCitIUkVGPSJzZGxjb252ZXJ0c3VyZmFjZS5odG1sIgorPlNETF9Db252ZXJ0U3VyZmFjZTwvQQorPjwvUAorPjxQCis+SWYgeW91IHdhbnQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFyZHdhcmUgY29sb3JrZXkgb3IgYWxwaGEgYmxpdAorYWNjZWxlcmF0aW9uLCB5b3Ugc2hvdWxkIHNldCB0aGUgY29sb3JrZXkgYW5kIGFscGhhIHZhbHVlIGJlZm9yZQorY2FsbGluZyB0aGlzIGZ1bmN0aW9uLjwvUAorPjxQCis+SWYgeW91IHdhbnQgYW4gYWxwaGEgY2hhbm5lbCwgc2VlIDxBCitIUkVGPSJzZGxkaXNwbGF5Zm9ybWF0YWxwaGEuaHRtbCIKKz5TRExfRGlzcGxheUZvcm1hdEFscGhhPC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNDExIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPklmIHRoZSBjb252ZXJzaW9uIGZhaWxzIG9yIHJ1bnMgb3V0IG9mIG1lbW9yeSwgaXQgcmV0dXJucworPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz5OVUxMPC9TUEFOCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI0MTUiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY29udmVydHN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ29udmVydFN1cmZhY2U8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGRpc3BsYXlmb3JtYXRhbHBoYS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9EaXNwbGF5Rm9ybWF0QWxwaGE8L1RUCis+PC9BCis+Cis8QQorSFJFRj0ic2Rsc2V0YWxwaGEuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0QWxwaGE8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNldGNvbG9ya2V5Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldENvbG9yS2V5PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxmaWxscmVjdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGRpc3BsYXlmb3JtYXRhbHBoYS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0ZpbGxSZWN0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfRGlzcGxheUZvcm1hdEFscGhhPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRpc3BsYXlmb3JtYXRhbHBoYS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxkaXNwbGF5Zm9ybWF0YWxwaGEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTg4NjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxkaXNwbGF5Zm9ybWF0YWxwaGEuaHRtbApAQCAtMCwwICsxLDI1MCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9EaXNwbGF5Rm9ybWF0QWxwaGE8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfRGlzcGxheUZvcm1hdCIKK0hSRUY9InNkbGRpc3BsYXlmb3JtYXQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfV2FycE1vdXNlIgorSFJFRj0ic2Rsd2FycG1vdXNlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGRpc3BsYXlmb3JtYXQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHdhcnBtb3VzZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETERJU1BMQVlGT1JNQVRBTFBIQSIKKz48L0EKKz5TRExfRGlzcGxheUZvcm1hdEFscGhhPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yNDMyIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0Rpc3BsYXlGb3JtYXRBbHBoYSZuYnNwOy0tJm5ic3A7Q29udmVydCBhIHN1cmZhY2UgdG8gdGhlIGRpc3BsYXkgZm9ybWF0PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjI0MzUiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjQzNiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+U0RMX1N1cmZhY2UgKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9EaXNwbGF5Rm9ybWF0QWxwaGE8L0IKKz48L0NPREUKKz4oU0RMX1N1cmZhY2UgKnN1cmZhY2UpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjQ0MiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzdXJmYWNlIGFuZCBjb3BpZXMgaXQgdG8gYSBuZXcgc3VyZmFjZSBvZiB0aGUKK3BpeGVsIGZvcm1hdCBhbmQgY29sb3JzIG9mIHRoZSB2aWRlbyBmcmFtZWJ1ZmZlciBwbHVzIGFuIGFscGhhIGNoYW5uZWwsCitzdWl0YWJsZSBmb3IgZmFzdCBibGl0dGluZyBvbnRvIHRoZSBkaXNwbGF5IHN1cmZhY2UuICBJdCBjYWxscworPEEKK0hSRUY9InNkbGNvbnZlcnRzdXJmYWNlLmh0bWwiCis+U0RMX0NvbnZlcnRTdXJmYWNlPC9BCis+PC9QCis+PFAKKz5JZiB5b3Ugd2FudCB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXJkd2FyZSBjb2xvcmtleSBvciBhbHBoYSBibGl0CithY2NlbGVyYXRpb24sIHlvdSBzaG91bGQgc2V0IHRoZSBjb2xvcmtleSBhbmQgYWxwaGEgdmFsdWUgYmVmb3JlCitjYWxsaW5nIHRoaXMgZnVuY3Rpb24uPC9QCis+PFAKKz5UaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSBjb2xvdXJrZXkgdG8gYW4gYWxwaGEgY2hhbm5lbCwKK2lmIHRoZSA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9TUkNDT0xPUktFWTwvVFQKKz4gZmxhZyBpcyBzZXQgb24gdGhlIHN1cmZhY2UuCitUaGUgZ2VuZXJhdGVkIHN1cmZhY2Ugd2lsbCB0aGVuIGJlIHRyYW5zcGFyZW50IChhbHBoYT0wKSB3aGVyZSB0aGUKK3BpeGVscyBtYXRjaCB0aGUgY29sb3Vya2V5LCBhbmQgb3BhcXVlIChhbHBoYT0yNTUpIGVsc2V3aGVyZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjQ0OSIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5JZiB0aGUgY29udmVyc2lvbiBmYWlscyBvciBydW5zIG91dCBvZiBtZW1vcnksIGl0IHJldHVybnMKKzxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+TlVMTDwvU1BBTgorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNDUzIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNvbnZlcnRzdXJmYWNlLmh0bWwiCis+U0RMX0NvbnZlcnRTdXJmYWNlPC9BCis+LAorPEEKK0hSRUY9InNkbHNldGFscGhhLmh0bWwiCis+U0RMX1NldEFscGhhPC9BCis+LAorPEEKK0hSRUY9InNkbHNldGNvbG9ya2V5Lmh0bWwiCis+U0RMX1NldENvbG9yS2V5PC9BCis+LAorPEEKK0hSRUY9InNkbGRpc3BsYXlmb3JtYXQuaHRtbCIKKz5TRExfRGlzcGxheUZvcm1hdDwvQQorPiwKKzxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+U0RMX1N1cmZhY2U8L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGRpc3BsYXlmb3JtYXQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx3YXJwbW91c2UuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9EaXNwbGF5Rm9ybWF0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfV2FycE1vdXNlPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRpc3BsYXl5dXZvdmVybGF5Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGRpc3BsYXl5dXZvdmVybGF5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2Yzk5OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZGlzcGxheXl1dm92ZXJsYXkuaHRtbApAQCAtMCwwICsxLDI0NiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9EaXNwbGF5WVVWT3ZlcmxheTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9VbmxvY2tZVVZPdmVybGF5IgorSFJFRj0ic2RsdW5sb2NreXV2b3ZlcmxheS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9GcmVlWVVWT3ZlcmxheSIKK0hSRUY9InNkbGZyZWV5dXZvdmVybGF5Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHVubG9ja3l1dm92ZXJsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGZyZWV5dXZvdmVybGF5Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMRElTUExBWVlVVk9WRVJMQVkiCis+PC9BCis+U0RMX0Rpc3BsYXlZVVZPdmVybGF5PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yOTA4IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0Rpc3BsYXlZVVZPdmVybGF5Jm5ic3A7LS0mbmJzcDtCbGl0IHRoZSBvdmVybGF5IHRvIHRoZSBkaXNwbGF5PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjI5MTEiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjkxMiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9EaXNwbGF5WVVWT3ZlcmxheTwvQgorPjwvQ09ERQorPihTRExfT3ZlcmxheSAqb3ZlcmxheSwgU0RMX1JlY3QgKmRzdHJlY3QpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjkxOCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkJsaXQgdGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm92ZXJsYXk8L0kKKz48L1RUCis+IHRvIHRoZSBzdXJmYWNlIHNwZWNpZmllZCB3aGVuIGl0IHdhcyA8QQorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIgorPmNyZWF0ZWQ8L0EKKz4uIFRoZSA8QQorSFJFRj0ic2RscmVjdC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUmVjdDwvU1BBTgorPjwvQQorPiBzdHJ1Y3R1cmUsIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRzdHJlY3Q8L0kKKz48L1RUCis+LCBzcGVjaWZpZXMgdGhlIHBvc2l0aW9uIGFuZCBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbi4gSWYgdGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRzdHJlY3Q8L0kKKz48L1RUCis+IGlzIGEgbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiB0aGUgb3ZlcmxheSB0aGVuIHRoZSBvdmVybGF5IHdpbGwgYmUgc2NhbGVkLCB0aGlzIGlzIG9wdGltaXplZCBmb3IgMnggc2NhbGluZy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjkyNyIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWVzPC9IMgorPjxQCis+UmV0dXJucyAwIG9uIHN1Y2Nlc3M8L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjkzMCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxvdmVybGF5Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9PdmVybGF5PC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGNyZWF0ZXl1dm92ZXJsYXkuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlWVVWT3ZlcmxheTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHVubG9ja3l1dm92ZXJsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxmcmVleXV2b3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1VubG9ja1lVVk92ZXJsYXk8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9GcmVlWVVWT3ZlcmxheTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxlbmFibGVrZXlyZXBlYXQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZW5hYmxla2V5cmVwZWF0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4ZmViMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZW5hYmxla2V5cmVwZWF0Lmh0bWwKQEAgLTAsMCArMSwyMzggQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfRW5hYmxlS2V5UmVwZWF0PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkV2ZW50IEZ1bmN0aW9ucy4iCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfRW5hYmxlVU5JQ09ERSIKK0hSRUY9InNkbGVuYWJsZXVuaWNvZGUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfR2V0TW91c2VTdGF0ZSIKK0hSRUY9InNkbGdldG1vdXNlc3RhdGUuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZW5hYmxldW5pY29kZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0bW91c2VzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEVOQUJMRUtFWVJFUEVBVCIKKz48L0EKKz5TRExfRW5hYmxlS2V5UmVwZWF0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU41ODM5IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0VuYWJsZUtleVJlcGVhdCZuYnNwOy0tJm5ic3A7U2V0IGtleWJvYXJkIHJlcGVhdCByYXRlLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU41ODQyIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjU4NDMiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfRW5hYmxlS2V5UmVwZWF0PC9CCis+PC9DT0RFCis+KGludCBkZWxheSwgaW50IGludGVydmFsKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU4NDkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5FbmFibGVzIG9yIGRpc2FibGVzIHRoZSBrZXlib2FyZCByZXBlYXQgcmF0ZS4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZGVsYXk8L0kKKz48L1RUCis+IHNwZWNpZmllcyBob3cgbG9uZyB0aGUga2V5IG11c3QgYmUgcHJlc3NlZCBiZWZvcmUgaXQgYmVnaW5zIHJlcGVhdGluZywgaXQgdGhlbiByZXBlYXRzIGF0IHRoZSBzcGVlZCBzcGVjaWZpZWQgYnkgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+aW50ZXJ2YWw8L0kKKz48L1RUCis+LiBCb3RoIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRlbGF5PC9JCis+PC9UVAorPiBhbmQgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+aW50ZXJ2YWw8L0kKKz48L1RUCis+IGFyZSBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzLjwvUAorPjxQCis+U2V0dGluZyA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kZWxheTwvSQorPjwvVFQKKz4gdG8gMCBkaXNhYmxlcyBrZXkgcmVwZWF0aW5nIGNvbXBsZXRlbHkuIEdvb2QgZGVmYXVsdCB2YWx1ZXMgYXJlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0RFRkFVTFRfUkVQRUFUX0RFTEFZPC9UVAorPiBhbmQgPFNQQU4KK0NMQVNTPSJTWU1CT0wiCis+U0RMX0RFRkFVTFRfUkVQRUFUX0lOVEVSVkFMPC9TUEFOCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41ODYwIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IG9uIHN1Y2Nlc3MgYW5kIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gb24gZmFpbHVyZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGVuYWJsZXVuaWNvZGUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXRtb3VzZXN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfRW5hYmxlVU5JQ09ERTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldE1vdXNlU3RhdGU8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZW5hYmxldW5pY29kZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxlbmFibGV1bmljb2RlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1ZGViYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZW5hYmxldW5pY29kZS5odG1sCkBAIC0wLDAgKzEsMjUyIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0VuYWJsZVVOSUNPREU8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iRXZlbnQgRnVuY3Rpb25zLiIKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9HZXRLZXlOYW1lIgorSFJFRj0ic2RsZ2V0a2V5bmFtZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9FbmFibGVLZXlSZXBlYXQiCitIUkVGPSJzZGxlbmFibGVrZXlyZXBlYXQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0a2V5bmFtZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZW5hYmxla2V5cmVwZWF0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMRU5BQkxFVU5JQ09ERSIKKz48L0EKKz5TRExfRW5hYmxlVU5JQ09ERTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTgwNSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9FbmFibGVVTklDT0RFJm5ic3A7LS0mbmJzcDtFbmFibGUgVU5JQ09ERSB0cmFuc2xhdGlvbjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU41ODA4IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjU4MDkiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfRW5hYmxlVU5JQ09ERTwvQgorPjwvQ09ERQorPihpbnQgZW5hYmxlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU4MTUiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5FbmFibGVzL0Rpc2FibGVzIFVuaWNvZGUga2V5Ym9hcmQgdHJhbnNsYXRpb24uPC9QCis+PFAKKz5UbyBvYnRhaW4gdGhlIGNoYXJhY3RlciBjb2RlcyBjb3JyZXNwb25kaW5nIHRvIHJlY2VpdmVkIGtleWJvYXJkIGV2ZW50cywKK1VuaWNvZGUgdHJhbnNsYXRpb24gbXVzdCBmaXJzdCBiZSB0dXJuZWQgb24gdXNpbmcgdGhpcyBmdW5jdGlvbi4gVGhlCit0cmFuc2xhdGlvbiBpbmN1cnMgYSBzbGlnaHQgb3ZlcmhlYWQgZm9yIGVhY2gga2V5Ym9hcmQgZXZlbnQgYW5kIGlzIHRoZXJlZm9yZQorZGlzYWJsZWQgYnkgZGVmYXVsdC4gRm9yIGVhY2ggc3Vic2VxdWVudGx5IHJlY2VpdmVkIGtleSBkb3duIGV2ZW50LCB0aGUKKzxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dW5pY29kZTwvSQorPjwvVFQKKz4gbWVtYmVyIG9mIHRoZQorPEEKK0hSRUY9InNkbGtleXN5bS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfa2V5c3ltPC9TUEFOCis+PC9BCis+IHN0cnVjdHVyZQord2lsbCB0aGVuIGNvbnRhaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIGNvZGUsIG9yIHplcm8gZm9yIGtleXN5bXMgdGhhdCBkbworbm90IGNvcnJlc3BvbmQgdG8gYW55IGNoYXJhY3RlciBjb2RlLjwvUAorPjxQCis+QSB2YWx1ZSBvZiAxIGZvciA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5lbmFibGU8L0kKKz48L1RUCis+IGVuYWJsZXMgVW5pY29kZSB0cmFuc2xhdGlvbjsKKzAgZGlzYWJsZXMgaXQsIGFuZCAtMSBsZWF2ZXMgaXQgdW5jaGFuZ2VkICh1c2VmdWwgZm9yIHF1ZXJ5aW5nIHRoZSBjdXJyZW50Cit0cmFuc2xhdGlvbiBtb2RlKS48L1AKKz48UAorPk5vdGUgdGhhdCBvbmx5IGtleSBwcmVzcyBldmVudHMgd2lsbCBiZSB0cmFuc2xhdGVkLCBub3QgcmVsZWFzZSBldmVudHMuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU4MjUiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyB0aGUgcHJldmlvdXMgdHJhbnNsYXRpb24gbW9kZSAoPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MTwvU1BBTgorPikuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU4MzAiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsa2V5c3ltLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9rZXlzeW08L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldGtleW5hbWUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxlbmFibGVrZXlyZXBlYXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9HZXRLZXlOYW1lPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfRW5hYmxlS2V5UmVwZWF0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGVudnZhcnMuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZW52dmFycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTllZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGVudnZhcnMuaHRtbApAQCAtMCwwICsxLDEyMjcgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfZW52dmFyczwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJHZW5lcmFsIgorSFJFRj0iZ2VuZXJhbC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR2V0RXJyb3IiCitIUkVGPSJzZGxnZXRlcnJvci5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0ZXJyb3IuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMRU5WVkFSUyIKKz48L0EKKz5TRExfZW52dmFyczwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONjc1IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX2VudnZhcnMmbmJzcDstLSZuYnNwO1NETCBlbnZpcm9ubWVudCB2YXJpYWJsZXM8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjc4IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+Tm90IGEgZnVuY3Rpb24sIHNldCB1c2luZyBzZXRlbnYoKTwvUAorPjxQCis+U2V2ZXJhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSB0byBtb2RpZnkgdGhlCitiZWhhdmlvdXIgb2YgU0RMLiBVc2luZyB0aGVzZSB2YXJpYWJsZXMgaXNuJ3QgcmVjb21tZW5lZCBhbmQgdGhlIG5hbWVzCithbmQgcHJlc2VuY2Ugb2YgdGhlc2UgdmFyaWFibGVzIGFyZW4ndCBndWFyYW50ZWVkIGZyb20gb25lIHJlbGVhc2UgdG8KK3RoZSBuZXh0LiBIb3dldmVyLCB0aGV5IGNhbiBiZSB2ZXJ5IHVzZWZ1bCBmb3IgZGVidWdnaW5nCitwdXJwb3Nlcy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjgyIgorPjwvQQorPjxIMgorPlZpZGVvPC9IMgorPjxQCis+PC9QCis+PERJVgorQ0xBU1M9IlZBUklBQkxFTElTVCIKKz48REwKKz48RFQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9GQkFDQ0VMPC9UVAorPjwvRFQKKz48REQKKz48UAorPklmIHNldCB0byAwLCBkaXNhYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpbiB0aGUgbGludXggZmJjb24gZHJpdmVyLjwvUAorPjwvREQKKz48RFQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9GQkRFVjwvVFQKKz48L0RUCis+PERECis+PFAKKz5GcmFtZSBidWZmZXIgZGV2aWNlIHRvIHVzZSBpbiB0aGUgbGludXggZmJjb24gZHJpdmVyLCBpbnN0ZWFkIG9mIC9kZXYvZmIwPC9QCis+PC9ERAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0ZVTExTQ1JFRU5fVVBEQVRFPC9UVAorPjwvRFQKKz48REQKKz48UAorPkluIHRoZSBwczJncyBkcml2ZXIsIHNldHMgdGhlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FTWU5DQkxJVDwvVFQKKz4gZmxhZyBvbiB0aGUKK2Rpc3BsYXkgc3VyZmFjZS48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9EUklWRVI8L1RUCis+PC9EVAorPjxERAorPjxQCis+U2VsZWN0ZXMgdGhlIHZpZGVvIGRyaXZlciBmb3IgU0RMIHRvIHVzZS4gUG9zc2libGUgdmFsdWVzLCBpbiB0aGUKK29yZGVyIHRoZXkgYXJlIHRyaWVkIGlmIHRoaXMgdmFyaWFibGUgaXMgbm90IHNldDo8L1AKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVONzA2IgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjAiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUQk9EWQorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPngxMTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+PC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5kZ2E8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPih0aGUgWEZyZWU4NiBER0EyKTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+bmFub3g8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPihMaW51eCk8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPmZiY29uPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz4oTGludXgpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5kaXJlY3RmYjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KExpbnV4KTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+cHMyZ3M8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPihQbGF5c3RhdGlvbiAyKTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+Z2dpPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz48L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPnZnbDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KEJTRCk8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPnN2Z2FsaWI8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPihMaW51eCk8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPmFhbGliPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz48L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPmRpcmVjdHg8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPihXaW4zMik8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPndpbmRpYjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KFdpbjMyKTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+YndpbmRvdzwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KEJlT1MpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz50b29sYm94PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz4oTWFjT1MgQ2xhc3NpYyk8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPkRTcDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KE1hY09TIENsYXNzaWMpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5RdWFydHo8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPihNYWMgT1MgWCk8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPkNHWDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KEFtaWdhKTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+cGhvdG9uPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz4oUU5YKTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+ZHVtbXk8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPjwvUAorPjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ERAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1ZJREVPX0NFTlRFUkVEPC9UVAorPjwvRFQKKz48REQKKz48UAorPklmIHNldCwgdHJpZXMgdG8gY2VudGVyIHRoZSBTREwgd2luZG93IHdoZW4gcnVubmluZyBpbiBYMTEgd2luZG93ZWQKK21vZGUsIG9yIHVzaW5nIHRoZSBDeWJlckdyYWZpeCBkcml2ZXIuPC9QCis+PC9ERAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1ZJREVPX0dMX0RSSVZFUjwvVFQKKz48L0RUCis+PERECis+PFAKKz5UaGUgb3BlbkdMIGRyaXZlciAoc2hhcmVkIGxpYnJhcnkpIHRvIHVzZSBmb3IgWDExLiBEZWZhdWx0IGlzIGxpYkdMLnNvLjE8L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9fWDExX0RHQU1PVVNFPC9UVAorPjwvRFQKKz48REQKKz48UAorPldpdGggWEZyZWU4NiwgZW5hYmxlcyB1c2Ugb2YgREdBIG1vdXNlIGlmIHNldC48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9fWDExX01PVVNFQUNDRUw8L1RUCis+PC9EVAorPjxERAorPjxQCis+Rm9yIFgxMSwgc2V0cyB0aGUgbW91c2UgYWNjZWxlcmF0aW9uLiBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgc3RyaW5nCitvbiB0aGUgZm9ybTo8L1AKKz48UAorPiI8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5uPC9JCis+PC9UVAorPi88VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kPC9JCis+PC9UVAorPi88VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz50PC9JCis+PC9UVAorPiI8L1AKKz48UAorPndoZXJlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm48L0kKKz48L1RUCis+IGFuZCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kPC9JCis+PC9UVAorPiBhcmUgdGhlCithY2NlbGVyYXRpb24gbnVtZXJhdG9yL2RlbnVtZXJhdG9ycyAoc28JbW91c2UgbW92ZW1lbnQgaXMgYWNjZWxlcmF0ZWQgYnkKKzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm48L0kKKz48L1RUCis+LzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmQ8L0kKKz48L1RUCis+KSwgYW5kCis8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz50PC9JCis+PC9UVAorPiBpcyB0aGUgdGhyZXNob2xkIGFib3ZlIHdoaWNoIGFjY2VsZXJhdGlvbiBhcHBsaWVzCisoY291bnRlZCBhcyBudW1iZXIgb2YgcGl4ZWxzIHRoZSBtb3VzZSBtb3ZlcyBhdCBvbmNlKS48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9fWDExX05PRElSRUNUQ09MT1I8L1RUCis+PC9EVAorPjxERAorPjxQCis+SWYgc2V0LCBkb24ndCBhdHRlbXB0IHRvIHVzZSBEaXJlY3RDb2xvciB2aXN1YWxzIGV2ZW4gaWYgdGhleSBhcmUKK3ByZXNlbnQuIChTREwgd2lsbCB1c2UgdGhlbSBvdGhlcndpc2UgZm9yIGdhbW1hIGNvcnJlY3Rpb24pLgorVGhpcyBpcyBuZWVkZWQgd2l0aCBvbGRlciBYIHNlcnZlcnMgd2hlbiB1c2luZyB0aGUgWFZpZGVvIGV4dGVuc2lvbi48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9fWDExX1ZJU1VBTElEPC9UVAorPjwvRFQKKz48REQKKz48UAorPklEIG9mIGFuIFgxMSB2aXN1YWwgdG8gdXNlLCBvdmVycmlkaW5nIFNETCdzIGRlZmF1bHQgdmlzdWFsIHNlbGVjdGlvbgorYWxnb3JpdGhtLiBJdCBjYW4gYmUgaW4gZGVjaW1hbCBvciBpbiBoZXggKHByZWZpeGVkIGJ5IDB4KS48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9fWVVWX0RJUkVDVDwvVFQKKz48L0RUCis+PERECis+PFAKKz5JZiBzZXQsIGRpc3BsYXkgWVVWIG92ZXJsYXkgZGlyZWN0bHkgb24gdGhlIHZpZGVvIHN1cmZhY2UgaWYgcG9zc2libGUsCitpbnN0ZWFkIG9mIG9uIHRoZSBzdXJmYWNlIHBhc3NlZCB0bworPEEKK0hSRUY9InNkbGNyZWF0ZXl1dm92ZXJsYXkuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlWVVWT3ZlcmxheTwvVFQKKz48L0EKKz4uPC9QCis+PC9ERAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1ZJREVPX1lVVl9IV0FDQ0VMPC9UVAorPjwvRFQKKz48REQKKz48UAorPklmIG5vdCBzZXQgb3Igc2V0IHRvIGEgbm9uemVybyB2YWx1ZSwgU0RMIHdpbGwgYXR0ZW1wdCB0byB1c2UKK2hhcmR3YXJlIFlVViBhY2NlbGVyYXRpb24gZm9yIHZpZGVvIHBsYXliYWNrLjwvUAorPjwvREQKKz48RFQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9XSU5ET1dJRDwvVFQKKz48L0RUCis+PERECis+PFAKKz5Gb3IgWDExIG9yIFdpbjMyLCBjb250YWlucyB0aGUgSUQgbnVtYmVyIG9mIHRoZSB3aW5kb3cgdG8gYmUgdXNlZCBieQorU0RMIGluc3RlYWQgb2YgY3JlYXRpbmcgaXRzIG93biB3aW5kb3cuIEVpdGhlciBpbiBkZWNpbWFsIG9yCitpbiBoZXggKHByZWZpeGVkIGJ5IDB4KS48L1AKKz48L0RECis+PC9ETAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjg2NiIKKz48L0EKKz48SDIKKz5FdmVudHMvSW5wdXQ8L0gyCis+PFAKKz48L1AKKz48RElWCitDTEFTUz0iVkFSSUFCTEVMSVNUIgorPjxETAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01PVVNFX1JFTEFUSVZFPC9UVAorPjwvRFQKKz48REQKKz48UAorPklmIHNldCB0byAwLCBkbyBub3QgdXNlIG1vdXNlIHJlbGF0aXZlIG1vZGUgaW4gWDExLiBUaGUgZGVmYXVsdCBpcwordG8gdXNlIGl0IGlmIHRoZSBtb3VzZSBpcyBoaWRkZW4gYW5kIGlucHV0IGlzIGdyYWJiZWQuPC9QCis+PC9ERAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01PVVNFREVWPC9UVAorPjwvRFQKKz48REQKKz48UAorPlRoZSBtb3VzZSBkZXZpY2UgdG8gdXNlIGZvciB0aGUgbGludXggZmJjb24gZHJpdmVyLiBJZiBub3Qgc2V0LAorU0RMIGZpcnN0IHRyaWVzIHRvIHVzZSBHUE0gaW4gcmVwZWF0ZXIgbW9kZSwgdGhlbiB2YXJpb3VzIG90aGVyCitkZXZpY2VzICgvZGV2L3BjYXV4LCAvZGV2L2FkYm1vdXNlLCAvZGV2L21vdXNlIGV0YykuPC9QCis+PC9ERAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01PVVNFREVWX0lNUFMyPC9UVAorPjwvRFQKKz48REQKKz48UAorPklmIHNldCwgU0RMIHdpbGwgbm90IHRyeSB0byBhdXRvLWRldGVjdAl0aGUgSU1QUy8yIHByb3RvY29sIG9mCithIFBTLzIgbW91c2UgYnV0IHVzZSBpdCByaWdodCBhd2F5LiBGb3IgdGhlIGZiY29uIGFuZCBwczJncyBkcml2ZXJzLjwvUAorPjwvREQKKz48RFQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9NT1VTRURSVjwvVFQKKz48L0RUCis+PERECis+PFAKKz5Gb3IgdGhlIGxpbnV4IGZiY29uIGRyaXZlcjogaWYgc2V0IHRvIEVMTywgdXNlIHRoZSBFTE8gdG91Y2hzY3JlZW4KK2NvbnRyb2xsZXIgYXMgYSBwb2ludGVyIGRldmljZTwvUAorPjwvREQKKz48RFQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9OT19SQVdLQkQ8L1RUCis+PC9EVAorPjxERAorPjxQCis+Rm9yIHRoZSBsaWJ2Z2EgZHJpdmVyOiBJZiBzZXQsIGRvIG5vdCBhdHRlbXB0IHRvIHB1dCB0aGUga2V5Ym9hcmQgaW4gcmF3IG1vZGUuPC9QCis+PC9ERAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX05PTU9VU0U8L1RUCis+PC9EVAorPjxERAorPjxQCis+SWYgc2V0LCB0aGUgbGludXggZmJjb24gZHJpdmVyIHdpbGwgbm90IHVzZSBhIG1vdXNlIGF0IGFsbC48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfTk9fTE9DS19LRVlTPC9UVAorPjwvRFQKKz48REQKKz48UAorPkRpc2FibGUgQ0FQUy1MT0NLIGFuZCBOVU0tTE9DSyBzdXBwcmVzc2lvbiBvZiBkb3duK3VwIGtleSBldmVudHMsCitzdWl0YWJsZSBmb3IgZ2FtZXMgd2hlcmUgdGhlIHBsYXllciBuZWVkcyB0aGVzZSBrZXlzIHRvIGRvIG1vcmUgdGhhbiBqdXN0IHRvZ2dsZS4KK0EgdmFsdWUgb2YgMSB3aWxsIGVmZmVjdCBib3RoIENBUFMtTE9DSyBhbmQgTlVNLUxPQ0suCitBIHZhbHVlIG9mIDIgd2lsbCBlZmZlY3Qgb25seSBDQVBTLUxPQ0suCitBIHZhbHVlIG9mIDMgd2lsbCBlZmZlY3Qgb25seSBOVU0tTE9DSy4KK0FsbCBvdGhlciB2YWx1ZXMgaGF2ZSBubyBlZmZlY3QuCis8L1AKKz48L0RECis+PC9ETAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjg5OSIKKz48L0EKKz48SDIKKz5BdWRpbzwvSDIKKz48UAorPjwvUAorPjxESVYKK0NMQVNTPSJWQVJJQUJMRUxJU1QiCis+PERMCis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5BVURJT0RFVjwvVFQKKz48L0RUCis+PERECis+PFAKKz5UaGUgYXVkaW8gZGV2aWNlIHRvIHVzZSwgaWYgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUEFUSF9EU1A8L1RUCis+IGlzbid0IHNldC48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQVVESU9EUklWRVI8L1RUCis+PC9EVAorPjxERAorPjxQCis+U2VsZWN0cyB0aGUgYXVkaW8gZHJpdmVyIGZvciBTREwgdG8gdXNlLiBQb3NzaWJsZSB2YWx1ZXMsIGluIHRoZQorb3JkZXIgdGhleSBhcmUgdHJpZWQgaWYgdGhpcyB2YXJpYWJsZSBpcyBub3Qgc2V0OjwvUAorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU45MTMiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+b3BlbmJzZDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KE9wZW5CU0QpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5kc3A8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPihPU1MgL2Rldi9kc3A6IExpbnV4LCBTb2xhcmlzLCBCU0QgZXRjKTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+YWxzYTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KExpbnV4KTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+cHVsc2U8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPihQdWxzZUF1ZGlvIGRhZW1vbik8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPmF1ZGlvPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz4oVW5peCBzdHlsZSAvZGV2L2F1ZGlvOiBTdW5PUywgU29sYXJpcyBldGMpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5BTDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KElyaXgpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5hcnRzYzwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KEFSVFMgYXVkaW8gZGFlbW9uKTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+ZXNkPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz4oZXNvdW5kIGF1ZGlvIGRhZW1vbik8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPm5hczwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KE5BUyBhdWRpbyBkYWVtb24pPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5kbWE8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPihPU1MgL2Rldi9kc3AsIHVzaW5nIERNQSk8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPmRzb3VuZDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KFdpbjMyIERpcmVjdFgpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz53YXZlb3V0PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz4oV2luMzIgV2F2ZU91dCk8L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPmJhdWRpbzwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+KEJlT1MpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5zbmRtZ3I8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPihNYWNPUyBTb3VuZE1hbmFnZXIpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5wYXVkPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz4oQUlYKTwvUAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+QUhJPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz4oQW1pZ2EpPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5kaXNrPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz4oYWxsOyBvdXRwdXQgdG8gZmlsZSk8L1AKKz48L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvREQKKz48RFQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9ESVNLQVVESU9GSUxFPC9UVAorPjwvRFQKKz48REQKKz48UAorPlRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSBmb3IgdGhlICJkaXNrIiBhdWRpbyBkcml2ZXIuIElmIG5vdAorc2V0LCB0aGUgbmFtZSA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPnNkbGF1ZGlvLnJhdzwvVFQKKz4gaXMgdXNlZC48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRElTS0FVRElPREVMQVk8L1RUCis+PC9EVAorPjxERAorPjxQCis+Rm9yIHRoZSAiZGlzayIgYXVkaW8gZHJpdmVyLCBob3cgbG9uZyB0byB3YWl0IChpbiBtcykgYmVmb3JlIHdyaXRpbmcKK2EgZnVsbCBzb3VuZCBidWZmZXIuIFRoZSBkZWZhdWx0IGlzIDE1MCBtcy48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRFNQX05PU0VMRUNUPC9UVAorPjwvRFQKKz48REQKKz48UAorPkZvciBzb21lIGF1ZGlvIGRyaXZlcnMgKGFsc2EsIHBhdWQsIGRtYSBhbmQgZHNwKSwgZG9uJ3QgdXNlIHNlbGVjdCgpCitidXQgYSB0aW1lZCBtZXRob2QgaW5zdGVhZC4gTWF5IGN1cmUgc29tZSBhdWRpbyBwcm9ibGVtcywgb3IgY2F1c2UKK290aGVycy48L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUEFUSF9EU1A8L1RUCis+PC9EVAorPjxERAorPjxQCis+VGhlIGF1ZGlvIGRldmljZSB0byB1c2UuIElmIG5vdCBzZXQsIFNETCB0cmllcyBBVURJT0RFViBhbmQgdGhlbgorYSBwbGF0Zm9ybS1kZXBlbmRlbnQgZGVmYXVsdCB2YWx1ZSAoL2Rldi9hdWRpbyBvbiBTb2xhcmlzLAorL2Rldi9kc3Agb24gTGludXggZXRjKS48L1AKKz48L0RECis+PC9ETAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjEwMTciCis+PC9BCis+PEgyCis+Q0QtUk9NPC9IMgorPjxQCis+PC9QCis+PERJVgorQ0xBU1M9IlZBUklBQkxFTElTVCIKKz48REwKKz48RFQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9DRFJPTTwvVFQKKz48L0RUCis+PERECis+PFAKKz5BIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIENELVJPTSBkZXZpY2VzIHRvIHVzZSwgaW4gYWRkaXRpb24gdG8KK3RoZSBzdGFuZGFyZCBkZXZpY2VzICh0eXBpY2FsbHkgL2Rldi9jZHJvbSwgcGxhdGZvcm0tZGVwZW5kZW50KS48L1AKKz48L0RECis+PC9ETAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjEwMjUiCis+PC9BCis+PEgyCis+RGVidWdnaW5nPC9IMgorPjxQCis+PC9QCis+PERJVgorQ0xBU1M9IlZBUklBQkxFTElTVCIKKz48REwKKz48RFQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9ERUJVRzwvVFQKKz48L0RUCis+PERECis+PFAKKz5JZiBzZXQsIGNhdXNlcyBldmVyeSBjYWxsIHRvIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRFcnJvcjwvVFQKKz4gKHRoYXQKK2lzLCBldmVyeSB0aW1lIFNETCBzaWduYWxzIGFuIGVycm9yKSB0byBhbHNvIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24KK3N0ZGVyci48L1AKKz48L0RECis+PC9ETAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjEwMzQiCis+PC9BCis+PEgyCis+Sm95c3RpY2s8L0gyCis+PFAKKz48L1AKKz48RElWCitDTEFTUz0iVkFSSUFCTEVMSVNUIgorPjxETAorPjxEVAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0pPWVNUSUNLX0RFVklDRTwvVFQKKz48L0RUCis+PERECis+PFAKKz5Kb3lzdGljayBkZXZpY2UgdG8gdXNlIGluIHRoZSBsaW51eCBqb3lzdGljayBkcml2ZXIsIGluIGFkZGl0aW9uCit0byB0aGUgdXN1YWw6IC9kZXYvanMqLCAvZGV2L2lucHV0L2V2ZW50KiwgL2Rldi9pbnB1dC9qcyo8L1AKKz48L0RECis+PERUCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfTElOVVhfSk9ZU1RJQ0s8L1RUCis+PC9EVAorPjxERAorPjxQCis+U3BlY2lhbCBqb3lzdGljayBjb25maWd1cmF0aW9uIHN0cmluZyBmb3IgbGludXguIFRoZSBmb3JtYXQgaXM8L1AKKz48UAorPiI8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5uYW1lPC9JCis+PC9UVAorPiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5udW1heGVzPC9JCis+PC9UVAorPiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5udW1oYXRzPC9JCis+PC9UVAorPiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5udW1iYWxsczwvSQorPjwvVFQKKz4iPC9QCis+PFAKKz53aGVyZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5uYW1lPC9JCis+PC9UVAorPiBpcyB0aGUgbmFtZSBzdHJpbmcgb2YgdGhlIGpveXN0aWNrCisocG9zc2libHkgaW4gc2luZ2xlIHF1b3RlcyksIGFuZCB0aGUgcmVzdCBhcmUgdGhlIG51bWJlciBvZiBheGVzLCBoYXRzCithbmQgYmFsbHMgcmVzcGVjdGl2ZWx5LjwvUAorPjwvREQKKz48L0RMCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldGVycm9yLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9HZXRFcnJvcjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImdlbmVyYWwuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5WaWRlbzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGV2ZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkMjFiNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZXZlbnQuaHRtbApAQCAtMCwwICsxLDk5NCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9FdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMIEV2ZW50IFN0cnVjdHVyZXMuIgorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0FjdGl2ZUV2ZW50IgorSFJFRj0ic2RsYWN0aXZlZXZlbnQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxhY3RpdmVldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEVWRU5UIgorPjwvQQorPlNETF9FdmVudDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMzcxMSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9FdmVudCZuYnNwOy0tJm5ic3A7R2VuZXJhbCBldmVudCBzdHJ1Y3R1cmU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzcxNCIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiB1bmlvbnsKKyAgVWludDggdHlwZTsKKyAgU0RMX0FjdGl2ZUV2ZW50IGFjdGl2ZTsKKyAgU0RMX0tleWJvYXJkRXZlbnQga2V5OworICBTRExfTW91c2VNb3Rpb25FdmVudCBtb3Rpb247CisgIFNETF9Nb3VzZUJ1dHRvbkV2ZW50IGJ1dHRvbjsKKyAgU0RMX0pveUF4aXNFdmVudCBqYXhpczsKKyAgU0RMX0pveUJhbGxFdmVudCBqYmFsbDsKKyAgU0RMX0pveUhhdEV2ZW50IGpoYXQ7CisgIFNETF9Kb3lCdXR0b25FdmVudCBqYnV0dG9uOworICBTRExfUmVzaXplRXZlbnQgcmVzaXplOworICBTRExfRXhwb3NlRXZlbnQgZXhwb3NlOworICBTRExfUXVpdEV2ZW50IHF1aXQ7CisgIFNETF9Vc2VyRXZlbnQgdXNlcjsKKyAgU0RMX1N5c1dNRXZlbnQgc3lzd207Cit9IFNETF9FdmVudDs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zNzE3IgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEYXRhPC9IMgorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU4zNzE5IgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjAiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUQk9EWQorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UaGUgdHlwZSBvZiBldmVudDwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+YWN0aXZlPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbGFjdGl2ZWV2ZW50Lmh0bWwiCis+QWN0aXZhdGlvbiBldmVudDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+a2V5PC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbGtleWJvYXJkZXZlbnQuaHRtbCIKKz5LZXlib2FyZCBldmVudDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bW90aW9uPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbG1vdXNlbW90aW9uZXZlbnQuaHRtbCIKKz5Nb3VzZSBtb3Rpb24gZXZlbnQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmJ1dHRvbjwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxtb3VzZWJ1dHRvbmV2ZW50Lmh0bWwiCis+TW91c2UgYnV0dG9uIGV2ZW50PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5qYXhpczwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxqb3lheGlzZXZlbnQuaHRtbCIKKz5Kb3lzdGljayBheGlzIG1vdGlvbiBldmVudDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+amJhbGw8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2Rsam95YmFsbGV2ZW50Lmh0bWwiCis+Sm95c3RpY2sgdHJhY2tiYWxsIG1vdGlvbiBldmVudDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+amhhdDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxqb3loYXRldmVudC5odG1sIgorPkpveXN0aWNrIGhhdCBtb3Rpb24gZXZlbnQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmpidXR0b248L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2Rsam95YnV0dG9uZXZlbnQuaHRtbCIKKz5Kb3lzdGljayBidXR0b24gZXZlbnQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnJlc2l6ZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxyZXNpemVldmVudC5odG1sIgorPkFwcGxpY2F0aW9uIHdpbmRvdyByZXNpemUgZXZlbnQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmV4cG9zZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxleHBvc2VldmVudC5odG1sIgorPkFwcGxpY2F0aW9uIHdpbmRvdyBleHBvc2UgZXZlbnQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnF1aXQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2RscXVpdGV2ZW50Lmh0bWwiCis+QXBwbGljYXRpb24gcXVpdCByZXF1ZXN0IGV2ZW50PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz51c2VyPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbHVzZXJldmVudC5odG1sIgorPlVzZXIgZGVmaW5lZCBldmVudDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c3lzd208L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2Rsc3lzd21ldmVudC5odG1sIgorPlVuZGVmaW5lZCB3aW5kb3cgbWFuYWdlciBldmVudDwvQQorPjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM3OTEiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGUgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPiB1bmlvbiBpcyB0aGUgY29yZSB0byBhbGwgZXZlbnQgaGFuZGxpbmcgaXMgU0RMLCBpdHMgcHJvYmFibHkgdGhlIG1vc3QgaW1wb3J0YW50IHN0cnVjdHVyZSBhZnRlciA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1N1cmZhY2U8L1NQQU4KKz4uIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz4gaXMgYSB1bmlvbiBvZiBhbGwgZXZlbnQgc3RydWN0dXJlcyB1c2VkIGluIFNETCwgdXNpbmcgaXQgaXMgYSBzaW1wbGUgbWF0dGVyIG9mIGtub3dpbmcgd2hpY2ggdW5pb24gbWVtYmVyIHJlbGF0ZXMgdG8gd2hpY2ggZXZlbnQgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz50eXBlPC9JCis+PC9UVAorPi48L1AKKz48UAorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU4zNzk5IgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjEiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUSEVBRAorPjxUUgorPjxUSAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5FdmVudCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+PC9USAorPjxUSAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5FdmVudCBTdHJ1Y3R1cmU8L1RICis+PC9UUgorPjwvVEhFQUQKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJNSURETEUiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQUNUSVZFRVZFTlQ8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049Ik1JRERMRSIKKz48QQorSFJFRj0ic2RsYWN0aXZlZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0FjdGl2ZUV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfS0VZRE9XTi9VUDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxrZXlib2FyZGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9LZXlib2FyZEV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfTU9VU0VNT1RJT048L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2RsbW91c2Vtb3Rpb25ldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfTW91c2VNb3Rpb25FdmVudDwvU1BBTgorPjwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01PVVNFQlVUVE9ORE9XTi9VUDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxtb3VzZWJ1dHRvbmV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Nb3VzZUJ1dHRvbkV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSk9ZQVhJU01PVElPTjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxqb3lheGlzZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveUF4aXNFdmVudDwvU1BBTgorPjwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0pPWUJBTExNT1RJT048L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2Rsam95YmFsbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Kb3lCYWxsRXZlbnQ8L1NQQU4KKz48L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9KT1lIQVRNT1RJT048L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2Rsam95aGF0ZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveUhhdEV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSk9ZQlVUVE9ORE9XTi9VUDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxqb3lidXR0b25ldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfSm95QnV0dG9uRXZlbnQ8L1NQQU4KKz48L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9RVUlUPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbHF1aXRldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUXVpdEV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1lTV01FVkVOVDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxBCitIUkVGPSJzZGxzeXN3bWV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TeXNXTUV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9SRVNJWkU8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2RscmVzaXplZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1Jlc2l6ZUV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9FWFBPU0U8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2RsZXhwb3NlZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V4cG9zZUV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVVNFUkVWRU5UPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PEEKK0hSRUY9InNkbHVzZXJldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfVXNlckV2ZW50PC9TUEFOCis+PC9BCis+PC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PC9ESVYKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzg4NSIKKz48L0EKKz48SDIKKz5Vc2U8L0gyCis+PFAKKz5UaGUgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPiBzdHJ1Y3R1cmUgaGFzIHR3byB1c2VzPC9QCis+PFAKKz48L1AKKz48VUwKK0NPTVBBQ1Q9IkNPTVBBQ1QiCis+PExJCis+PFAKKz5SZWFkaW5nIGV2ZW50cyBvbiB0aGUgZXZlbnQgcXVldWU8L1AKKz48L0xJCis+PExJCis+PFAKKz5QbGFjaW5nIGV2ZW50cyBvbiB0aGUgZXZlbnQgcXVldWU8L1AKKz48L0xJCis+PC9VTAorPjxQCis+UmVhZGluZyBldmVudHMgZnJvbSB0aGUgZXZlbnQgcXVldWUgaXMgZG9uZSB3aXRoIGVpdGhlciA8QQorSFJFRj0ic2RscG9sbGV2ZW50Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1BvbGxFdmVudDwvVFQKKz48L0EKKz4gb3IgPEEKK0hSRUY9InNkbHBlZXBldmVudHMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUGVlcEV2ZW50czwvVFQKKz48L0EKKz4uIFdlJ2xsIHVzZSA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUG9sbEV2ZW50PC9UVAorPiBhbmQgc3RlcCB0aHJvdWdoIGFuIGV4YW1wbGUuPC9QCis+PFAKKz5GaXJzdCBvZmYsIHdlIGNyZWF0ZSBhbiBlbXB0eSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+IHN0cnVjdHVyZS4KKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfRXZlbnQgdGVzdF9ldmVudDs8L1BSRQorPgorPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1BvbGxFdmVudDwvVFQKKz4gcmVtb3ZlcyB0aGUgbmV4dCBldmVudCBmcm9tIHRoZSBldmVudCBxdWV1ZSwgaWYgdGhlcmUgYXJlIG5vIGV2ZW50cyBvbiB0aGUgcXVldWUgaXQgcmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gb3RoZXJ3aXNlIGl0IHJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4xPC9TUEFOCis+LiBXZSB1c2UgYSA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz53aGlsZTwvVFQKKz4gbG9vcCB0byBwcm9jZXNzIGVhY2ggZXZlbnQgaW4gdHVybi4KKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz53aGlsZShTRExfUG9sbEV2ZW50KCYjMzg7dGVzdF9ldmVudCkpIHs8L1BSRQorPgorVGhlIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Qb2xsRXZlbnQ8L1RUCis+IGZ1bmN0aW9uIHRha2UgYSBwb2ludGVyIHRvIGFuIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz4gc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgZmlsbGVkIHdpdGggZXZlbnQgaW5mb3JtYXRpb24uIFdlIGtub3cgdGhhdCBpZiA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUG9sbEV2ZW50PC9UVAorPiByZW1vdmVzIGFuIGV2ZW50IGZyb20gdGhlIHF1ZXVlIHRoZW4gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHdpbGwgYmUgcGxhY2VkIGluIG91ciA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+dGVzdF9ldmVudDwvU1BBTgorPiBzdHJ1Y3R1cmUsIGJ1dCB3ZSBhbHNvIGtub3cgdGhhdCB0aGUgPFNQQU4KK0NMQVNTPSJlbXBoYXNpcyIKKz48SQorQ0xBU1M9IkVNUEhBU0lTIgorPnR5cGU8L0kKKz48L1NQQU4KKz4gb2YgZXZlbnQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz4gbWVtYmVyIG9mIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz50ZXN0X2V2ZW50PC9TUEFOCis+LiBTbyB0byBoYW5kbGUgZWFjaCBldmVudCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+IHNlcGVyYXRlbHkgd2UgdXNlIGEgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+c3dpdGNoPC9UVAorPiBzdGF0ZW1lbnQuCis8UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+ICBzd2l0Y2godGVzdF9ldmVudC50eXBlKSB7PC9QUkUKKz4KK1dlIG5lZWQgdG8ga25vdyB3aGF0IGtpbmQgb2YgZXZlbnRzIHdlJ3JlIGxvb2tpbmcgZm9yIDxTUEFOCitDTEFTUz0iZW1waGFzaXMiCis+PEkKK0NMQVNTPSJFTVBIQVNJUyIKKz5hbmQ8L0kKKz48L1NQQU4KKz4gdGhlIGV2ZW50IDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz4ncyBvZiB0aG9zZSBldmVudHMuIFNvIGxldHMgYXNzdW1lIHdlIHdhbnQgdG8gZGV0ZWN0IHdoZXJlIHRoZSB1c2VyIGlzIG1vdmluZyB0aGUgbW91c2UgcG9pbnRlciB3aXRoaW4gb3VyIGFwcGxpY2F0aW9uLiBXZSBsb29rIHRocm91Z2ggb3VyIGV2ZW50IHR5cGVzIGFuZCBub3RpY2UgdGhhdCA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9NT1VTRU1PVElPTjwvVFQKKz4gaXMsIG1vcmUgdGhhbiBsaWtlbHksIHRoZSBldmVudCB3ZSdyZSBsb29raW5nIGZvci4gQSBsaXR0bGUgPEEKK0hSRUY9InNkbG1vdXNlbW90aW9uZXZlbnQuaHRtbCIKKz5tb3JlPC9BCis+IHJlc2VhcmNoIHRlbGxzIHVzZSB0aGF0IDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01PVVNFTU9USU9OPC9UVAorPiBldmVudHMgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSA8QQorSFJFRj0ic2RsbW91c2Vtb3Rpb25ldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfTW91c2VNb3Rpb25FdmVudDwvU1BBTgorPjwvQQorPiBzdHJ1Y3R1cmUgd2hpY2ggaXMgdGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bW90aW9uPC9JCis+PC9UVAorPiBtZW1iZXIgb2YgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPi4gV2UgY2FuIGNoZWNrIGZvciB0aGUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfTU9VU0VNT1RJT048L1RUCis+IGV2ZW50IDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz4gd2l0aGluIG91ciA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5zd2l0Y2g8L1RUCis+IHN0YXRlbWVudCBsaWtlIHNvOgorPFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPiAgICBjYXNlIFNETF9NT1VTRU1PVElPTjo8L1BSRQorPgorQWxsIHdlIG5lZWQgZG8gbm93IGlzIHJlYWQgdGhlIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5tb3Rpb248L0kKKz48L1RUCis+IG1lbWJlciBvZiA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+dGVzdF9ldmVudDwvU1BBTgorPi4KKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgICBwcmludGYoIldlIGdvdCBhIG1vdGlvbiBldmVudC5cbiIpOworICAgICAgcHJpbnRmKCJDdXJyZW50IG1vdXNlIHBvc2l0aW9uIGlzOiAoJWQsICVkKVxuIiwgdGVzdF9ldmVudC5tb3Rpb24ueCwgdGVzdF9ldmVudC5tb3Rpb24ueSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmKCJVbmhhbmRsZWQgRXZlbnQhXG4iKTsKKyAgICAgIGJyZWFrOworICB9Cit9CitwcmludGYoIkV2ZW50IHF1ZXVlIGVtcHR5LlxuIik7PC9QUkUKKz48L1AKKz48UAorPkl0IGlzIGFsc28gcG9zc2libGUgdG8gcHVzaCBldmVudHMgb250byB0aGUgZXZlbnQgcXVldWUgYW5kIHNvIHVzZSBpdCBhcyBhIHR3by13YXkgY29tbXVuaWNhdGlvbiBwYXRoLiBCb3RoIDxBCitIUkVGPSJzZGxwdXNoZXZlbnQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUHVzaEV2ZW50PC9UVAorPjwvQQorPiBhbmQgPEEKK0hSRUY9InNkbHBlZXBldmVudHMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUGVlcEV2ZW50czwvVFQKKz48L0EKKz4gYWxsb3cgeW91IHRvIHBsYWNlIGV2ZW50cyBvbnRvIHRoZSBldmVudCBxdWV1ZS4gVGhpcyBpcyB1c3VhbGx5IHVzZWQgdG8gcGxhY2UgYSA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9VU0VSRVZFTlQ8L1RUCis+IG9uIHRoZSBldmVudCBxdWV1ZSwgaG93ZXZlciB5b3UgY291bGQgdXNlIGl0IHRvIHBvc3QgZmFrZSBpbnB1dCBldmVudHMgaWYgeW91IHdpc2hlZC4gQ3JlYXRpbmcgeW91ciBvd24gZXZlbnRzIGlzIGEgc2ltcGxlIG1hdHRlciBvZiBjaG9vc2luZyB0aGUgZXZlbnQgdHlwZSB5b3Ugd2FudCwgc2V0dGluZyB0aGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz50eXBlPC9JCis+PC9UVAorPiBtZW1iZXIgYW5kIGZpbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1lbWJlciBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbi4KKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfRXZlbnQgdXNlcl9ldmVudDsKKwordXNlcl9ldmVudC50eXBlPVNETF9VU0VSRVZFTlQ7Cit1c2VyX2V2ZW50LnVzZXIuY29kZT0yOwordXNlcl9ldmVudC51c2VyLmRhdGExPU5VTEw7Cit1c2VyX2V2ZW50LnVzZXIuZGF0YTI9TlVMTDsKK1NETF9QdXNoRXZlbnQoJiMzODt1c2VyX2V2ZW50KTs8L1BSRQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zOTQyIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHBvbGxldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Qb2xsRXZlbnQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QdXNoRXZlbnQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHBlZXBldmVudHMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUGVlcEV2ZW50czwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGFjdGl2ZWV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TREwgRXZlbnQgU3RydWN0dXJlcy48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQWN0aXZlRXZlbnQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxldmVudHN0YXRlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGV2ZW50c3RhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWEyNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxldmVudHN0YXRlLmh0bWwKQEAgLTAsMCArMSwyNzYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfRXZlbnRTdGF0ZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJFdmVudCBGdW5jdGlvbnMuIgorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0dldEV2ZW50RmlsdGVyIgorSFJFRj0ic2RsZ2V0ZXZlbnRmaWx0ZXIuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfR2V0S2V5U3RhdGUiCitIUkVGPSJzZGxnZXRrZXlzdGF0ZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRldmVudGZpbHRlci5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0a2V5c3RhdGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExFVkVOVFNUQVRFIgorPjwvQQorPlNETF9FdmVudFN0YXRlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU41NjQ2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0V2ZW50U3RhdGUmbmJzcDstLSZuYnNwO1RoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgdGhlIHN0YXRlIG9mIHByb2Nlc3NpbmcgY2VydGFpbiBldmVudHMuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU2NDkiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTY1MCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+VWludDggPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0V2ZW50U3RhdGU8L0IKKz48L0NPREUKKz4oVWludDggdHlwZSwgaW50IHN0YXRlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU2NTYiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBzdGF0ZSBvZiBwcm9jZXNzaW5nIGNlcnRhaW4gZXZlbnQgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz4ncy48L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnN0YXRlPC9JCis+PC9UVAorPiBpcyBzZXQgdG8gPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSUdOT1JFPC9UVAorPiwgCit0aGF0IGV2ZW50IDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+IHdpbGwgYmUgYXV0b21hdGljYWxseSBkcm9wcGVkIGZyb20gdGhlIGV2ZW50IHF1ZXVlIGFuZCB3aWxsIAorbm90IGJlIGZpbHRlcmVkLjwvUAorPjxQCis+SWYgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c3RhdGU8L0kKKz48L1RUCis+IGlzIHNldCB0byA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9FTkFCTEU8L1RUCis+LCAKK3RoYXQgZXZlbnQgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz4gd2lsbCBiZSBwcm9jZXNzZWQgbm9ybWFsbHkuPC9QCis+PFAKKz5JZiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zdGF0ZTwvSQorPjwvVFQKKz4gaXMgc2V0IHRvIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1FVRVJZPC9UVAorPiwKKzxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9FdmVudFN0YXRlPC9UVAorPiB3aWxsIHJldHVybiB0aGUgY3VycmVudCBwcm9jZXNzaW5nIAorc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBldmVudCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz50eXBlPC9JCis+PC9UVAorPi48L1AKKz48UAorPkEgbGlzdCBvZiBldmVudCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz50eXBlPC9JCis+PC9UVAorPidzIGNhbiBiZSBmb3VuZCBpbiB0aGUgPEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiBzZWN0aW9uLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41Njc3IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0ZXZlbnRmaWx0ZXIuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXRrZXlzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldEV2ZW50RmlsdGVyPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfR2V0S2V5U3RhdGU8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZXhwb3NlZXZlbnQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZXhwb3NlZXZlbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmMyYTNlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxleHBvc2VldmVudC5odG1sCkBAIC0wLDAgKzEsMjUyIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0V4cG9zZUV2ZW50PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBFdmVudCBTdHJ1Y3R1cmVzLiIKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfUmVzaXplRXZlbnQiCitIUkVGPSJzZGxyZXNpemVldmVudC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9TeXNXTUV2ZW50IgorSFJFRj0ic2Rsc3lzd21ldmVudC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxyZXNpemVldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc3lzd21ldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEVYUE9TRUVWRU5UIgorPjwvQQorPlNETF9FeHBvc2VFdmVudDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONDUwMyIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9FeHBvc2VFdmVudCZuYnNwOy0tJm5ic3A7UXVpdCByZXF1ZXN0ZWQgZXZlbnQ8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDUwNiIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGUKK30gU0RMX0V4cG9zZUV2ZW50OzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ1MDkiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjQ1MTEiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1ZJREVPRVhQT1NFPC9UVAorPjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ1MTkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V4cG9zZUV2ZW50PC9TUEFOCis+IGlzIGEgbWVtYmVyIG9mIHRoZSA8QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+IHVuaW9uIGFuZCBpcyB1c2VkIHdoYW4gYW4gZXZlbnQgb2YgdHlwZSA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9WSURFT0VYUE9TRTwvVFQKKz4gaXMgcmVwb3J0ZWQuPC9QCis+PFAKKz5BIFZJREVPRVhQT1NFIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBzY3JlZW4gaGFzIGJlZW4gbW9kaWZpZWQKK291dHNpZGUgb2YgdGhlIGFwcGxpY2F0aW9uLCB1c3VhbGx5IGJ5IHRoZSB3aW5kb3cgbWFuYWdlciBhbmQgbmVlZHMgdG8KK2JlIHJlZHJhd24uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ1MjciCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNldGV2ZW50ZmlsdGVyLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldEV2ZW50RmlsdGVyPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RscmVzaXplZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzeXN3bWV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfUmVzaXplRXZlbnQ8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfU3lzV01FdmVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGZpbGxyZWN0Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGZpbGxyZWN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjZTA2MgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZmlsbHJlY3QuaHRtbApAQCAtMCwwICsxLDI5MSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9GaWxsUmVjdDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9CbGl0U3VyZmFjZSIKK0hSRUY9InNkbGJsaXRzdXJmYWNlLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0Rpc3BsYXlGb3JtYXQiCitIUkVGPSJzZGxkaXNwbGF5Zm9ybWF0Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGJsaXRzdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxkaXNwbGF5Zm9ybWF0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMRklMTFJFQ1QiCis+PC9BCis+U0RMX0ZpbGxSZWN0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yMzUxIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0ZpbGxSZWN0Jm5ic3A7LS0mbmJzcDtUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZmFzdCBmaWxsIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUgd2l0aCBzb21lIGNvbG9yPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjIzNTQiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjM1NSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9GaWxsUmVjdDwvQgorPjwvQ09ERQorPihTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCwgVWludDMyIGNvbG9yKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjIzNjEiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZmFzdCBmaWxsIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUgd2l0aAorPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+Y29sb3I8L0kKKz48L1RUCis+LiAgSWYgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZHN0cmVjdDwvSQorPjwvVFQKKz4KK2lzIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+TlVMTDwvVFQKKz4sIHRoZSB3aG9sZSBzdXJmYWNlIHdpbGwgYmUgZmlsbGVkIHdpdGgKKzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmNvbG9yPC9JCis+PC9UVAorPi48L1AKKz48UAorPlRoZSBjb2xvciBzaG91bGQgYmUgYSBwaXhlbCBvZiB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIHN1cmZhY2UsIGFuZAorY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUKKzxBCitIUkVGPSJzZGxtYXByZ2IuaHRtbCIKKz5TRExfTWFwUkdCPC9BCis+IG9yIDxBCitIUkVGPSJzZGxtYXByZ2JhLmh0bWwiCis+U0RMX01hcFJHQkE8L0EKKz4KK2Z1bmN0aW9ucy4gSWYgdGhlIGNvbG9yIHZhbHVlIGNvbnRhaW5zIGFuIGFscGhhIHZhbHVlIHRoZW4gdGhlCitkZXN0aW5hdGlvbiBpcyBzaW1wbHkgImZpbGxlZCIgd2l0aCB0aGF0IGFscGhhIGluZm9ybWF0aW9uLCBubyBibGVuZGluZwordGFrZXMgcGxhY2UuPC9QCis+PFAKKz5JZiB0aGVyZSBpcyBhIGNsaXAgcmVjdGFuZ2xlIHNldCBvbiB0aGUgZGVzdGluYXRpb24gKHNldCB2aWEKKzxBCitIUkVGPSJzZGxzZXRjbGlwcmVjdC5odG1sIgorPlNETF9TZXRDbGlwUmVjdDwvQQorPikgdGhlbiB0aGlzCitmdW5jdGlvbiB3aWxsIGNsaXAgYmFzZWQgb24gdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgY2xpcCByZWN0YW5nbGUgYW5kCit0aGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZHN0cmVjdDwvSQorPjwvVFQKKz4gcmVjdGFuZ2xlIGFuZCB0aGUgZHN0cmVjdCByZWN0YW5nbGUKK3dpbGwgYmUgbW9kaWZpZWQgdG8gcmVwcmVzZW50IHRoZSBhcmVhIGFjdHVhbGx5IGZpbGxlZC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjM3NCIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5UaGlzIGZ1bmN0aW9uIHJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IG9uIHN1Y2Nlc3MsIG9yCis8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IG9uIGVycm9yLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMzc5IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbG1hcHJnYi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9NYXBSR0I8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbG1hcHJnYi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9NYXBSR0JBPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxibGl0c3VyZmFjZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9CbGl0U3VyZmFjZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RscmVjdC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUmVjdDwvU1BBTgorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsYmxpdHN1cmZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxkaXNwbGF5Zm9ybWF0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQmxpdFN1cmZhY2U8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9EaXNwbGF5Rm9ybWF0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGZsaXAuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZmxpcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODBmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGZsaXAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9GbGlwPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1VwZGF0ZVJlY3RzIgorSFJFRj0ic2RsdXBkYXRlcmVjdHMuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2V0Q29sb3JzIgorSFJFRj0ic2Rsc2V0Y29sb3JzLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHVwZGF0ZXJlY3RzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZXRjb2xvcnMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExGTElQIgorPjwvQQorPlNETF9GbGlwPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4xNDI2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0ZsaXAmbmJzcDstLSZuYnNwO1N3YXBzIHNjcmVlbiBidWZmZXJzPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjE0MjkiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMTQzMCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9GbGlwPC9CCis+PC9DT0RFCis+KFNETF9TdXJmYWNlICpzY3JlZW4pOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTQzNiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPk9uIGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgZG91YmxlLWJ1ZmZlcmluZywgdGhpcyBmdW5jdGlvbiBzZXRzIHVwIGEgZmxpcAorYW5kIHJldHVybnMuICBUaGUgaGFyZHdhcmUgd2lsbCB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlLCBhbmQgdGhlbiBzd2FwCit2aWRlbyBidWZmZXJzIGJlZm9yZSB0aGUgbmV4dCB2aWRlbyBzdXJmYWNlIGJsaXQgb3IgbG9jayB3aWxsIHJldHVybi4KK09uIGhhcmR3YXJlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGRvdWJsZS1idWZmZXJpbmcsIHRoaXMgaXMgZXF1aXZhbGVudAordG8gY2FsbGluZyA8QQorSFJFRj0ic2RsdXBkYXRlcmVjdC5odG1sIgorPlNETF9VcGRhdGVSZWN0PC9BCis+PFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+KHNjcmVlbiwgMCwgMCwgMCwgMCk8L0kKKz48L1RUCis+PC9QCis+PFAKKz5UaGUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRE9VQkxFQlVGPC9UVAorPiBmbGFnIG11c3QgaGF2ZSBiZWVuIHBhc3NlZCB0byAKKzxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz5TRExfU2V0VmlkZW9Nb2RlPC9BCis+LAorIHdoZW4KK3NldHRpbmcgdGhlIHZpZGVvIG1vZGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcGVyZm9ybSBoYXJkd2FyZSBmbGlwcGluZy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTQ0NCIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5UaGlzIGZ1bmN0aW9uIHJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IGlmIHN1Y2Nlc3NmdWwsIG9yIAorPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4tMTwvU1BBTgorPiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE0NDkiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFZpZGVvTW9kZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsdXBkYXRlcmVjdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9VcGRhdGVSZWN0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx1cGRhdGVyZWN0cy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldGNvbG9ycy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1VwZGF0ZVJlY3RzPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfU2V0Q29sb3JzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGZyZWVjdXJzb3IuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZnJlZWN1cnNvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTRmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGZyZWVjdXJzb3IuaHRtbApAQCAtMCwwICsxLDIwOSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9GcmVlQ3Vyc29yPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NyZWF0ZUN1cnNvciIKK0hSRUY9InNkbGNyZWF0ZWN1cnNvci5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9TZXRDdXJzb3IiCitIUkVGPSJzZGxzZXRjdXJzb3IuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY3JlYXRlY3Vyc29yLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZXRjdXJzb3IuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExGUkVFQ1VSU09SIgorPjwvQQorPlNETF9GcmVlQ3Vyc29yPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yNTQwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0ZyZWVDdXJzb3ImbmJzcDstLSZuYnNwO0ZyZWVzIGEgY3Vyc29yIGNyZWF0ZWQgd2l0aCBTRExfQ3JlYXRlQ3Vyc29yLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4yNTQzIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjI1NDQiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0ZyZWVDdXJzb3I8L0IKKz48L0NPREUKKz4oU0RMX0N1cnNvciAqY3Vyc29yKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI1NTAiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5GcmVlcyBhIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQ3Vyc29yPC9TUEFOCis+IHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcKKzxBCitIUkVGPSJzZGxjcmVhdGVjdXJzb3IuaHRtbCIKKz5TRExfQ3JlYXRlQ3Vyc29yPC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNTU1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZWN1cnNvci5odG1sIgorPlNETF9DcmVhdGVDdXJzb3I8L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNyZWF0ZWN1cnNvci5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldGN1cnNvci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NyZWF0ZUN1cnNvcjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NldEN1cnNvcjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxmcmVlc3VyZmFjZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxmcmVlc3VyZmFjZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjYwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGZyZWVzdXJmYWNlLmh0bWwKQEAgLTAsMCArMSwyMTkgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfRnJlZVN1cmZhY2U8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfQ3JlYXRlUkdCU3VyZmFjZUZyb20iCitIUkVGPSJzZGxjcmVhdGVyZ2JzdXJmYWNlZnJvbS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Mb2NrU3VyZmFjZSIKK0hSRUY9InNkbGxvY2tzdXJmYWNlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2Vmcm9tLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxsb2Nrc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEZSRUVTVVJGQUNFIgorPjwvQQorPlNETF9GcmVlU3VyZmFjZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTg5MyIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9GcmVlU3VyZmFjZSZuYnNwOy0tJm5ic3A7RnJlZXMgKGRlbGV0ZXMpIGEgU0RMX1N1cmZhY2U8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTg5NiIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xODk3IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9GcmVlU3VyZmFjZTwvQgorPjwvQ09ERQorPihTRExfU3VyZmFjZSAqc3VyZmFjZSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xOTAzIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+RnJlZXMgdGhlIHJlc291cmNlcyB1c2VkIGJ5IGEgcHJldmlvdXNseSBjcmVhdGVkIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfU3VyZmFjZTwvU1BBTgorPi4gSWYgdGhlIHN1cmZhY2Ugd2FzIGNyZWF0ZWQgdXNpbmcgCis8QQorSFJFRj0ic2RsY3JlYXRlcmdic3VyZmFjZWZyb20uaHRtbCIKKz5TRExfQ3JlYXRlUkdCU3VyZmFjZUZyb208L0EKKz4gdGhlbiB0aGUgcGl4ZWwgZGF0YSBpcyBub3QgZnJlZWQuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE5MDgiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY3JlYXRlcmdic3VyZmFjZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVSR0JTdXJmYWNlPC9UVAorPjwvQQorPgorPEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2Vmcm9tLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY3JlYXRlcmdic3VyZmFjZWZyb20uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxsb2Nrc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfTG9ja1N1cmZhY2U8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZnJlZXdhdi5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxmcmVld2F2Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNDJjNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZnJlZXdhdi5odG1sCkBAIC0wLDAgKzEsMjIyIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0ZyZWVXQVY8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQXVkaW8iCitIUkVGPSJhdWRpby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfTG9hZFdBViIKK0hSRUY9InNkbGxvYWR3YXYuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQXVkaW9DVlQiCitIUkVGPSJzZGxhdWRpb2N2dC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxsb2Fkd2F2Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxhdWRpb2N2dC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEZSRUVXQVYiCis+PC9BCis+U0RMX0ZyZWVXQVY8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjY4NTciCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfRnJlZVdBViZuYnNwOy0tJm5ic3A7RnJlZXMgcHJldmlvdXNseSBvcGVuZWQgV0FWIGRhdGE8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONjg2MCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU42ODYxIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9GcmVlV0FWPC9CCis+PC9DT0RFCis+KFVpbnQ4ICphdWRpb19idWYpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjg2NyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkFmdGVyIGEgV0FWRSBmaWxlIGhhcyBiZWVuIG9wZW5lZCB3aXRoIDxBCitIUkVGPSJzZGxsb2Fkd2F2Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvYWRXQVY8L1RUCis+PC9BCis+IGl0cyBkYXRhIGNhbiBldmVudHVhbGx5IGJlIGZyZWVkIHdpdGggPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0ZyZWVXQVY8L1RUCis+LiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5hdWRpb19idWY8L0kKKz48L1RUCis+IGlzIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIGNyZWF0ZWQgYnkgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvYWRXQVY8L1RUCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42ODc1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGxvYWR3YXYuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9hZFdBVjwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGxvYWR3YXYuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxhdWRpb2N2dC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0xvYWRXQVY8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJhdWRpby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9BdWRpb0NWVDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxmcmVleXV2b3ZlcmxheS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxmcmVleXV2b3ZlcmxheS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGZyZWV5dXZvdmVybGF5Lmh0bWwKQEAgLTAsMCArMSwyMzMgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfRnJlZVlVVk92ZXJsYXk8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfRGlzcGxheVlVVk92ZXJsYXkiCitIUkVGPSJzZGxkaXNwbGF5eXV2b3ZlcmxheS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9HTGF0dHIiCitIUkVGPSJzZGxnbGF0dHIuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZGlzcGxheXl1dm92ZXJsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdsYXR0ci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEZSRUVZVVZPVkVSTEFZIgorPjwvQQorPlNETF9GcmVlWVVWT3ZlcmxheTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMjk0MSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9GcmVlWVVWT3ZlcmxheSZuYnNwOy0tJm5ic3A7RnJlZSBhIFlVViB2aWRlbyBvdmVybGF5PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjI5NDQiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjk0NSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfRnJlZVlVVk92ZXJsYXk8L0IKKz48L0NPREUKKz4oU0RMX092ZXJsYXkgKm92ZXJsYXkpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjk1MSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkZyZWVzIGFuZCA8QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm92ZXJsYXk8L0kKKz48L1RUCis+PC9BCis+IGNyZWF0ZWQgYnkgPEEKK0hSRUY9InNkbGNyZWF0ZXl1dm92ZXJsYXkuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlWVVWT3ZlcmxheTwvVFQKKz48L0EKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI5NTgiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfT3ZlcmxheTwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxkaXNwbGF5eXV2b3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9EaXNwbGF5WVVWT3ZlcmxheTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9GcmVlWVVWT3ZlcmxheTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGRpc3BsYXl5dXZvdmVybGF5Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2xhdHRyLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfRGlzcGxheVlVVk92ZXJsYXk8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9HTGF0dHI8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0YXBwc3RhdGUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0YXBwc3RhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDllMmUwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRhcHBzdGF0ZS5odG1sCkBAIC0wLDAgKzEsMjYzIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dldEFwcFN0YXRlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkV2ZW50IEZ1bmN0aW9ucy4iCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlIgorSFJFRj0ic2RsZ2V0cmVsYXRpdmVtb3VzZXN0YXRlLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrRXZlbnRTdGF0ZSIKK0hSRUY9InNkbGpveXN0aWNrZXZlbnRzdGF0ZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRyZWxhdGl2ZW1vdXNlc3RhdGUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZXZlbnRzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEdFVEFQUFNUQVRFIgorPjwvQQorPlNETF9HZXRBcHBTdGF0ZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTkzMSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRBcHBTdGF0ZTwvVFQKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU5MzUiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTkzNiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+VWludDggPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0dldEFwcFN0YXRlPC9CCis+PC9DT0RFCis+KHZvaWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTk0MiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIGJpdHdpc2UgY29tYmluYXRpb24gb2Y6PC9QCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjU5NDUiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FQUE1PVVNFRk9DVVM8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UaGUgYXBwbGljYXRpb24gaGFzIG1vdXNlIGZvY3VzLjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FQUElOUFVURk9DVVM8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UaGUgYXBwbGljYXRpb24gaGFzIGtleWJvYXJkIGZvY3VzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQVBQQUNUSVZFPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+VGhlIGFwcGxpY2F0aW9uIGlzIHZpc2libGU8L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41OTYwIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGFjdGl2ZWV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9BY3RpdmVFdmVudDwvU1BBTgorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0cmVsYXRpdmVtb3VzZXN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tldmVudHN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tFdmVudFN0YXRlPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldGF1ZGlvc3RhdHVzLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldGF1ZGlvc3RhdHVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjM2EwOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0YXVkaW9zdGF0dXMuaHRtbApAQCAtMCwwICsxLDIyMSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9HZXRBdWRpb1N0YXR1czwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJBdWRpbyIKK0hSRUY9ImF1ZGlvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9QYXVzZUF1ZGlvIgorSFJFRj0ic2RscGF1c2VhdWRpby5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Mb2FkV0FWIgorSFJFRj0ic2RsbG9hZHdhdi5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxwYXVzZWF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxsb2Fkd2F2Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMR0VUQVVESU9TVEFUVVMiCis+PC9BCis+U0RMX0dldEF1ZGlvU3RhdHVzPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42NzkwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0dldEF1ZGlvU3RhdHVzJm5ic3A7LS0mbmJzcDtHZXQgdGhlIGN1cnJlbnQgYXVkaW8gc3RhdGU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONjc5MyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU42Nzk0IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5TRExfYXVkaW9zdGF0dXM8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfR2V0QXVkaW9TdGF0dXM8L0IKKz48L0NPREUKKz4odm9pZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42ODAwIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz50eXBlZGVmIGVudW17CisgIFNETF9BVURJT19TVE9QUEVELAorICBTRExfQVVESU9fUEFVU0VELAorICBTRExfQVVESU9fUExBWUlORworfSBTRExfYXVkaW9zdGF0dXM7PC9QUkUKKz48UAorPlJldHVybnMgZWl0aGVyIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FVRElPX1NUT1BQRUQ8L1RUCis+LCA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9BVURJT19QQVVTRUQ8L1RUCis+IG9yIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FVRElPX1BMQVlJTkc8L1RUCis+IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBhdWRpbyBzdGF0ZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjgwNyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxwYXVzZWF1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1BhdXNlQXVkaW88L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxwYXVzZWF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsbG9hZHdhdi5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1BhdXNlQXVkaW88L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJhdWRpby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Mb2FkV0FWPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldGNsaXByZWN0Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldGNsaXByZWN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwYWM3NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0Y2xpcHJlY3QuaHRtbApAQCAtMCwwICsxLDIyOSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9HZXRDbGlwUmVjdDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9TZXRDbGlwUmVjdCIKK0hSRUY9InNkbHNldGNsaXByZWN0Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0NvbnZlcnRTdXJmYWNlIgorSFJFRj0ic2RsY29udmVydHN1cmZhY2UuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc2V0Y2xpcHJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNvbnZlcnRzdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMR0VUQ0xJUFJFQ1QiCis+PC9BCis+U0RMX0dldENsaXBSZWN0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yMjMwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0dldENsaXBSZWN0Jm5ic3A7LS0mbmJzcDtHZXRzIHRoZSBjbGlwcGluZyByZWN0YW5nbGUgZm9yIGEgc3VyZmFjZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMjIzMyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4yMjM0IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9HZXRDbGlwUmVjdDwvQgorPjwvQ09ERQorPihTRExfU3VyZmFjZSAqc3VyZmFjZSwgU0RMX1JlY3QgKnJlY3QpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjI0MCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkdldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBmb3IgYSBzdXJmYWNlLiAgV2hlbiB0aGlzIHN1cmZhY2UgaXMgdGhlCitkZXN0aW5hdGlvbiBvZiBhIGJsaXQsIG9ubHkgdGhlIGFyZWEgd2l0aGluIHRoZSBjbGlwIHJlY3RhbmdsZSBpcworZHJhd24gaW50by48L1AKKz48UAorPlRoZSByZWN0YW5nbGUgcG9pbnRlZCB0byBieSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5yZWN0PC9JCis+PC9UVAorPiB3aWxsIGJlCitmaWxsZWQgd2l0aCB0aGUgY2xpcHBpbmcgcmVjdGFuZ2xlIG9mIHRoZSBzdXJmYWNlLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMjQ1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHNldGNsaXByZWN0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldENsaXBSZWN0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxibGl0c3VyZmFjZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9CbGl0U3VyZmFjZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfU3VyZmFjZTwvU1BBTgorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2V0Y2xpcHJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjb252ZXJ0c3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NldENsaXBSZWN0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ29udmVydFN1cmZhY2U8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0Y3Vyc29yLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldGN1cnNvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWNiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldGN1cnNvci5odG1sCkBAIC0wLDAgKzEsMjE5IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dldEN1cnNvcjwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9TZXRDdXJzb3IiCitIUkVGPSJzZGxzZXRjdXJzb3IuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2hvd0N1cnNvciIKK0hSRUY9InNkbHNob3djdXJzb3IuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc2V0Y3Vyc29yLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzaG93Y3Vyc29yLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMR0VUQ1VSU09SIgorPjwvQQorPlNETF9HZXRDdXJzb3I8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjI1ODkiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfR2V0Q3Vyc29yJm5ic3A7LS0mbmJzcDtHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgbW91c2UgY3Vyc29yLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4yNTkyIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjI1OTMiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9DdXJzb3IgKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9HZXRDdXJzb3I8L0IKKz48L0NPREUKKz4odm9pZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNTk5IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UmV0dXJucyB0aGUgY3VycmVudGx5IGFjdGl2ZSBtb3VzZSBjdXJzb3IuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI2MDIiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsc2V0Y3Vyc29yLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldEN1cnNvcjwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY3JlYXRlY3Vyc29yLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NyZWF0ZUN1cnNvcjwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2hvd2N1cnNvci5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TaG93Q3Vyc29yPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2V0Y3Vyc29yLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2hvd2N1cnNvci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NldEN1cnNvcjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1Nob3dDdXJzb3I8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0ZXJyb3IuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0ZXJyb3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY1NzkyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRlcnJvci5odG1sCkBAIC0wLDAgKzEsMjA1IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dldEVycm9yPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkdlbmVyYWwiCitIUkVGPSJnZW5lcmFsLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9XYXNJbml0IgorSFJFRj0ic2Rsd2FzaW5pdC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9lbnZ2YXJzIgorSFJFRj0ic2RsZW52dmFycy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx3YXNpbml0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxlbnZ2YXJzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMR0VURVJST1IiCis+PC9BCis+U0RMX0dldEVycm9yPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42NTMiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfR2V0RXJyb3ImbmJzcDstLSZuYnNwO0dldCBTREwgZXJyb3Igc3RyaW5nPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjY1NiIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU42NTciCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RML1NETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5jaGFyICo8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfR2V0RXJyb3I8L0IKKz48L0NPREUKKz4odm9pZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42NjMiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0RXJyb3I8L1RUCis+IHJldHVybnMgYSBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgaW50ZXJuYWwgU0RMIGVycm9yLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42NjciCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dldEVycm9yPC9UVAorPiByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxhc3QgZXJyb3IuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx3YXNpbml0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZW52dmFycy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1dhc0luaXQ8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJnZW5lcmFsLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX2VudnZhcnM8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0ZXZlbnRmaWx0ZXIuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0ZXZlbnRmaWx0ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjU0ZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRldmVudGZpbHRlci5odG1sCkBAIC0wLDAgKzEsMjM1IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dldEV2ZW50RmlsdGVyPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkV2ZW50IEZ1bmN0aW9ucy4iCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfU2V0RXZlbnRGaWx0ZXIiCitIUkVGPSJzZGxzZXRldmVudGZpbHRlci5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9FdmVudFN0YXRlIgorSFJFRj0ic2RsZXZlbnRzdGF0ZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZXRldmVudGZpbHRlci5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZXZlbnRzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEdFVEVWRU5URklMVEVSIgorPjwvQQorPlNETF9HZXRFdmVudEZpbHRlcjwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTYxNSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HZXRFdmVudEZpbHRlciZuYnNwOy0tJm5ic3A7UmV0cmlldmVzIGEgcG9pbnRlciB0byBoZSBldmVudCBmaWx0ZXI8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONTYxOCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU41NjE5IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5TRExfRXZlbnRGaWx0ZXIgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0dldEV2ZW50RmlsdGVyPC9CCis+PC9DT0RFCis+KHZvaWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTYyNSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRoaXMgZnVuY3Rpb24gcmV0cmllY2VzIGEgcG9pbnRlciB0byB0aGUgZXZlbnQgZmlsdGVyIHRoYXQgd2FzIHByZXZpb3VzbHkgc2V0IHVzaW5nIDxBCitIUkVGPSJzZGxzZXRldmVudGZpbHRlci5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRFdmVudEZpbHRlcjwvVFQKKz48L0EKKz4uIEFuIFNETF9FdmVudEZpbHRlciBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzOgorPFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgaW50ICgqU0RMX0V2ZW50RmlsdGVyKShjb25zdCBTRExfRXZlbnQgKmV2ZW50KTs8L1BSRQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41NjMxIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBldmVudCBmaWx0ZXIgb3IgPFRUCitDTEFTUz0iTElURVJBTCIKKz5OVUxMPC9UVAorPiBpZiBubyBmaWx0ZXIgaGFzIGJlZW4gc2V0LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41NjM1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZXRldmVudGZpbHRlci5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRFdmVudEZpbHRlcjwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldGV2ZW50ZmlsdGVyLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZXZlbnRzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NldEV2ZW50RmlsdGVyPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfRXZlbnRTdGF0ZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRnYW1tYXJhbXAuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0Z2FtbWFyYW1wLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjYzAzYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0Z2FtbWFyYW1wLmh0bWwKQEAgLTAsMCArMSwyMTkgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfR2V0R2FtbWFSYW1wPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1NldEdhbW1hIgorSFJFRj0ic2Rsc2V0Z2FtbWEuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2V0R2FtbWFSYW1wIgorSFJFRj0ic2Rsc2V0Z2FtbWFyYW1wLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNldGdhbW1hLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZXRnYW1tYXJhbXAuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHRVRHQU1NQVJBTVAiCis+PC9BCis+U0RMX0dldEdhbW1hUmFtcDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTU5OCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HZXRHYW1tYVJhbXAmbmJzcDstLSZuYnNwO0dldHMgdGhlIGNvbG9yIGdhbW1hIGxvb2t1cCB0YWJsZXMgZm9yIHRoZSBkaXNwbGF5PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjE2MDEiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMTYwMiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9HZXRHYW1tYVJhbXA8L0IKKz48L0NPREUKKz4oVWludDE2ICpyZWR0YWJsZSwgVWludDE2ICpncmVlbnRhYmxlLCBVaW50MTYgKmJsdWV0YWJsZSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xNjA4IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+R2V0cyB0aGUgZ2FtbWEgdHJhbnNsYXRpb24gbG9va3VwIHRhYmxlcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgZGlzcGxheS4KK0VhY2ggdGFibGUgaXMgYW4gYXJyYXkgb2YgMjU2IFVpbnQxNiB2YWx1ZXMuPC9QCis+PFAKKz5Ob3QgYWxsIGRpc3BsYXkgaGFyZHdhcmUgaXMgYWJsZSB0byBjaGFuZ2UgZ2FtbWEuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE2MTIiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyAtMSBvbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTYxNSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxzZXRnYW1tYS5odG1sIgorPlNETF9TZXRHYW1tYTwvQQorPgorPEEKK0hSRUY9InNkbHNldGdhbW1hcmFtcC5odG1sIgorPlNETF9TZXRHYW1tYVJhbXA8L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldGdhbW1hLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2V0Z2FtbWFyYW1wLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfU2V0R2FtbWE8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRHYW1tYVJhbXA8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0a2V5bmFtZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRrZXluYW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1MWM5NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0a2V5bmFtZS5odG1sCkBAIC0wLDAgKzEsMjE2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dldEtleU5hbWU8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iRXZlbnQgRnVuY3Rpb25zLiIKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9TZXRNb2RTdGF0ZSIKK0hSRUY9InNkbHNldG1vZHN0YXRlLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0VuYWJsZVVOSUNPREUiCitIUkVGPSJzZGxlbmFibGV1bmljb2RlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNldG1vZHN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxlbmFibGV1bmljb2RlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMR0VUS0VZTkFNRSIKKz48L0EKKz5TRExfR2V0S2V5TmFtZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTc4MCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HZXRLZXlOYW1lJm5ic3A7LS0mbmJzcDtHZXQgdGhlIG5hbWUgb2YgYW4gU0RMIHZpcnR1YWwga2V5c3ltPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU3ODMiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTc4NCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+Y2hhciAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0dldEtleU5hbWU8L0IKKz48L0NPREUKKz4oU0RMS2V5IGtleSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41NzkwIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UmV0dXJucyB0aGUgU0RMLWRlZmluZWQgbmFtZSBvZiB0aGUgPEEKK0hSRUY9InNkbGtleS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExLZXk8L1NQQU4KKz48L0EKKz4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+a2V5PC9JCis+PC9UVAorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTc5NiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxrZXkuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMS2V5PC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzZXRtb2RzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGVuYWJsZXVuaWNvZGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRNb2RTdGF0ZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0VuYWJsZVVOSUNPREU8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0a2V5c3RhdGUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0a2V5c3RhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzE2ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRrZXlzdGF0ZS5odG1sCkBAIC0wLDAgKzEsMjUzIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dldEtleVN0YXRlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkV2ZW50IEZ1bmN0aW9ucy4iCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfRXZlbnRTdGF0ZSIKK0hSRUY9InNkbGV2ZW50c3RhdGUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfR2V0TW9kU3RhdGUiCitIUkVGPSJzZGxnZXRtb2RzdGF0ZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxldmVudHN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRtb2RzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEdFVEtFWVNUQVRFIgorPjwvQQorPlNETF9HZXRLZXlTdGF0ZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTY4NiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HZXRLZXlTdGF0ZSZuYnNwOy0tJm5ic3A7R2V0IGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQga2V5Ym9hcmQgc3RhdGU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONTY4OSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU41NjkwIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5VaW50OCAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0dldEtleVN0YXRlPC9CCis+PC9DT0RFCis+KGludCAqbnVta2V5cyk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41Njk2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+R2V0cyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGtleWJvYXJkIHN0YXRlLiBUaGUgY3VycmVudCBzdGF0ZSBpcyByZXR1cm4gYXMgYSBwb2ludGVyIHRvIGFuIGFycmF5LCB0aGUgc2l6ZSBvZiB0aGlzIGFycmF5IGlzIHN0b3JlZCBpbiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5udW1rZXlzPC9JCis+PC9UVAorPi4gVGhlIGFycmF5IGlzIGluZGV4ZWQgYnkgdGhlIDxBCitIUkVGPSJzZGxrZXkuaHRtbCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETEtfKjwvVFQKKz48L0EKKz4gc3ltYm9scy4gQSB2YWx1ZSBvZiAxIG1lYW5zIHRoZSBrZXkgaXMgcHJlc3NlZCBhbmQgYSB2YWx1ZSBvZiAwIG1lYW5zIGl0cyBub3QuIFRoZSBwb2ludGVyIHJldHVybmVkIGlzIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbCBTREwgYXJyYXkgYW5kIHNob3VsZCBub3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPlVzZSA8QQorSFJFRj0ic2RscHVtcGV2ZW50cy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QdW1wRXZlbnRzPC9UVAorPjwvQQorPiB0byB1cGRhdGUgdGhlIHN0YXRlIGFycmF5LjwvUAorPjwvQkxPQ0tRVU9URQorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU3MDYiCis+PC9BCis+PEgyCis+RXhhbXBsZTwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5VaW50OCAqa2V5c3RhdGUgPSBTRExfR2V0S2V5U3RhdGUoTlVMTCk7CitpZiAoIGtleXN0YXRlW1NETEtfUkVUVVJOXSApIHByaW50ZigiUmV0dXJuIEtleSBQcmVzc2VkLlxuIik7PC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTcxMCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxrZXkuaHRtbCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETCBLZXkgU3ltYm9sczwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RscHVtcGV2ZW50cy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QdW1wRXZlbnRzPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZXZlbnRzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldG1vZHN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfRXZlbnRTdGF0ZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldE1vZFN0YXRlPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldG1vZHN0YXRlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldG1vZHN0YXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkMmYzNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0bW9kc3RhdGUuaHRtbApAQCAtMCwwICsxLDI1NyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9HZXRNb2RTdGF0ZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJFdmVudCBGdW5jdGlvbnMuIgorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0dldEtleVN0YXRlIgorSFJFRj0ic2RsZ2V0a2V5c3RhdGUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2V0TW9kU3RhdGUiCitIUkVGPSJzZGxzZXRtb2RzdGF0ZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRrZXlzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc2V0bW9kc3RhdGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHRVRNT0RTVEFURSIKKz48L0EKKz5TRExfR2V0TW9kU3RhdGU8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjU3MjEiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfR2V0TW9kU3RhdGUmbmJzcDstLSZuYnNwO0dldCB0aGUgc3RhdGUgb2YgbW9kaWZpZXIga2V5cy48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONTcyNCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU41NzI1IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5TRExNb2QgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0dldE1vZFN0YXRlPC9CCis+PC9DT0RFCis+KHZvaWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTczMSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vZGlmaWVyIGtleXMgKENUUkwsIEFMVCwgZXRjLikuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU3MzQiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+VGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgYW4gT1InZCBjb21iaW5hdGlvbiBvZiB0aGUgU0RMTW9kIGVudW0uPC9QCis+PFAKKz48QQorTkFNRT0iQUVONTczOCIKKz48L0EKKz48QkxPQ0tRVU9URQorQ0xBU1M9IkJMT0NLUVVPVEUiCis+PFAKKz48QgorPlNETE1vZDwvQgorPjwvUAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz50eXBlZGVmIGVudW0geworICBLTU9EX05PTkUgID0gMHgwMDAwLAorICBLTU9EX0xTSElGVD0gMHgwMDAxLAorICBLTU9EX1JTSElGVD0gMHgwMDAyLAorICBLTU9EX0xDVFJMID0gMHgwMDQwLAorICBLTU9EX1JDVFJMID0gMHgwMDgwLAorICBLTU9EX0xBTFQgID0gMHgwMTAwLAorICBLTU9EX1JBTFQgID0gMHgwMjAwLAorICBLTU9EX0xNRVRBID0gMHgwNDAwLAorICBLTU9EX1JNRVRBID0gMHgwODAwLAorICBLTU9EX05VTSAgID0gMHgxMDAwLAorICBLTU9EX0NBUFMgID0gMHgyMDAwLAorICBLTU9EX01PREUgID0gMHg0MDAwLAorfSBTRExNb2Q7PC9QUkUKKz48L0JMT0NLUVVPVEUKKz4KK1NETCBhbHNvIGRlZmluZXMgdGhlIGZvbGxvd2luZyBzeW1ib2xzIGZvciBjb252ZW5pZW5jZToKKzxBCitOQU1FPSJBRU41NzQxIgorPjwvQQorPjxCTE9DS1FVT1RFCitDTEFTUz0iQkxPQ0tRVU9URSIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+I2RlZmluZSBLTU9EX0NUUkwgKEtNT0RfTENUUkx8S01PRF9SQ1RSTCkKKyNkZWZpbmUgS01PRF9TSElGVCAgKEtNT0RfTFNISUZUfEtNT0RfUlNISUZUKQorI2RlZmluZSBLTU9EX0FMVCAgKEtNT0RfTEFMVHxLTU9EX1JBTFQpCisjZGVmaW5lIEtNT0RfTUVUQSAoS01PRF9MTUVUQXxLTU9EX1JNRVRBKTwvUFJFCis+PC9CTE9DS1FVT1RFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU3NDMiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZ2V0a2V5c3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0S2V5U3RhdGU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXRrZXlzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldG1vZHN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfR2V0S2V5U3RhdGU8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRNb2RTdGF0ZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRtb3VzZXN0YXRlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldG1vdXNlc3RhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTZhNTViCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRtb3VzZXN0YXRlLmh0bWwKQEAgLTAsMCArMSwyNTMgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfR2V0TW91c2VTdGF0ZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJFdmVudCBGdW5jdGlvbnMuIgorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0VuYWJsZUtleVJlcGVhdCIKK0hSRUY9InNkbGVuYWJsZWtleXJlcGVhdC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9HZXRSZWxhdGl2ZU1vdXNlU3RhdGUiCitIUkVGPSJzZGxnZXRyZWxhdGl2ZW1vdXNlc3RhdGUuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZW5hYmxla2V5cmVwZWF0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRyZWxhdGl2ZW1vdXNlc3RhdGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHRVRNT1VTRVNUQVRFIgorPjwvQQorPlNETF9HZXRNb3VzZVN0YXRlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU41ODY5IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0dldE1vdXNlU3RhdGUmbmJzcDstLSZuYnNwO1JldHJpZXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb3VzZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU41ODcyIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjU4NzMiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlVpbnQ4IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9HZXRNb3VzZVN0YXRlPC9CCis+PC9DT0RFCis+KGludCAqeCwgaW50ICp5KTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU4NzkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGUgY3VycmVudCBidXR0b24gc3RhdGUgaXMgcmV0dXJuZWQgYXMgYSBidXR0b24gYml0bWFzaywgd2hpY2ggY2FuCitiZSB0ZXN0ZWQgdXNpbmcgdGhlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0JVVFRPTihYKTwvVFQKKz4gbWFjcm9zLCBhbmQgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+eDwvSQorPjwvVFQKKz4gYW5kIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnk8L0kKKz48L1RUCis+IGFyZSBzZXQgdG8gdGhlCitjdXJyZW50IG1vdXNlIGN1cnNvciBwb3NpdGlvbi4gIFlvdSBjYW4gcGFzcyA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+IGZvciBlaXRoZXIgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+eDwvSQorPjwvVFQKKz4gb3IgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+eTwvSQorPjwvVFQKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU4ODgiCis+PC9BCis+PEgyCis+RXhhbXBsZTwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+U0RMX1B1bXBFdmVudHMoKTsKK2lmKFNETF9HZXRNb3VzZVN0YXRlKE5VTEwsIE5VTEwpJiMzODtTRExfQlVUVE9OKDEpKQorICBwcmludGYoIk1vdXNlIEJ1dHRvbiAxKGxlZnQpIGlzIHByZXNzZWQuXG4iKTs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41ODkxIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGdldHJlbGF0aXZlbW91c2VzdGF0ZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRSZWxhdGl2ZU1vdXNlU3RhdGU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHB1bXBldmVudHMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUHVtcEV2ZW50czwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGVuYWJsZWtleXJlcGVhdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldHJlbGF0aXZlbW91c2VzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0VuYWJsZUtleVJlcGVhdDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRyZWxhdGl2ZW1vdXNlc3RhdGUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0cmVsYXRpdmVtb3VzZXN0YXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhNTEwNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0cmVsYXRpdmVtb3VzZXN0YXRlLmh0bWwKQEAgLTAsMCArMSwyMzUgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkV2ZW50IEZ1bmN0aW9ucy4iCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR2V0TW91c2VTdGF0ZSIKK0hSRUY9InNkbGdldG1vdXNlc3RhdGUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfR2V0QXBwU3RhdGUiCitIUkVGPSJzZGxnZXRhcHBzdGF0ZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRtb3VzZXN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRhcHBzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEdFVFJFTEFUSVZFTU9VU0VTVEFURSIKKz48L0EKKz5TRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU41OTAyIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZSZuYnNwOy0tJm5ic3A7UmV0cmlldmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdXNlPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU5MDUiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTkwNiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+VWludDggPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZTwvQgorPjwvQ09ERQorPihpbnQgKngsIGludCAqeSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41OTEyIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+VGhlIGN1cnJlbnQgYnV0dG9uIHN0YXRlIGlzIHJldHVybmVkIGFzIGEgYnV0dG9uIGJpdG1hc2ssIHdoaWNoIGNhbgorYmUgdGVzdGVkIHVzaW5nIHRoZSA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9CVVRUT04oWCk8L1RUCis+IG1hY3JvcywgYW5kIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPng8L0kKKz48L1RUCis+IGFuZCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz55PC9JCis+PC9UVAorPiBhcmUgc2V0IHRvIHRoZSBjaGFuZ2UgaW4gdGhlIG1vdXNlIHBvc2l0aW9uIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZTwvVFQKKz4gb3Igc2luY2UgZXZlbnQgaW5pdGlhbGl6YXRpb24uICBZb3UgY2FuIHBhc3MgPFRUCitDTEFTUz0iTElURVJBTCIKKz5OVUxMPC9UVAorPiBmb3IgZWl0aGVyIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPng8L0kKKz48L1RUCis+IG9yIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnk8L0kKKz48L1RUCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41OTIyIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGdldG1vdXNlc3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0TW91c2VTdGF0ZTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldG1vdXNlc3RhdGUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXRhcHBzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldE1vdXNlU3RhdGU8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9HZXRBcHBTdGF0ZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXRyZ2IuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0cmdiLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3NzRkYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0cmdiLmh0bWwKQEAgLTAsMCArMSwyMzEgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfR2V0UkdCPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX01hcFJHQkEiCitIUkVGPSJzZGxtYXByZ2JhLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0dldFJHQkEiCitIUkVGPSJzZGxnZXRyZ2JhLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG1hcHJnYmEuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdldHJnYmEuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHRVRSR0IiCis+PC9BCis+U0RMX0dldFJHQjwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTcxOCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HZXRSR0ImbmJzcDstLSZuYnNwO0dldCBSR0IgdmFsdWVzIGZyb20gYSBwaXhlbCBpbiB0aGUgc3BlY2lmaWVkIHBpeGVsIGZvcm1hdC48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTcyMSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xNzIyIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9HZXRSR0I8L0IKKz48L0NPREUKKz4oVWludDMyIHBpeGVsLCBTRExfUGl4ZWxGb3JtYXQgKmZtdCwgVWludDggKnIsIFVpbnQ4ICpnLCBVaW50OCAqYik7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xNzI4IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+R2V0IFJHQiBjb21wb25lbnQgdmFsdWVzIGZyb20gYSBwaXhlbCBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQuPC9QCis+PFAKKz5UaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGVudGlyZSA4LWJpdCBbMC4uMjU1XSByYW5nZSB3aGVuIGNvbnZlcnRpbmcgY29sb3IKK2NvbXBvbmVudHMgZnJvbSBwaXhlbCBmb3JtYXRzIHdpdGggbGVzcyB0aGFuIDgtYml0cyBwZXIgUkdCIGNvbXBvbmVudAorKGUuZy4sIGEgY29tcGxldGVseSB3aGl0ZSBwaXhlbCBpbiAxNi1iaXQgUkdCNTY1IGZvcm1hdCB3b3VsZCByZXR1cm4KK1sweGZmLCAweGZmLCAweGZmXSBub3QgWzB4ZjgsIDB4ZmMsIDB4ZjhdKS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTczMiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxnZXRyZ2JhLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dldFJHQkE8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbG1hcHJnYi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9NYXBSR0I8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbG1hcHJnYmEuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTWFwUkdCQTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RscGl4ZWxmb3JtYXQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1BpeGVsRm9ybWF0PC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxtYXByZ2JhLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0cmdiYS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX01hcFJHQkE8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9HZXRSR0JBPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldHJnYmEuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0cmdiYS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTEwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldHJnYmEuaHRtbApAQCAtMCwwICsxLDIyMiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9HZXRSR0JBPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0dldFJHQiIKK0hSRUY9InNkbGdldHJnYi5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9DcmVhdGVSR0JTdXJmYWNlIgorSFJFRj0ic2RsY3JlYXRlcmdic3VyZmFjZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRyZ2IuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHRVRSR0JBIgorPjwvQQorPlNETF9HZXRSR0JBPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4xNzQ3IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0dldFJHQkEmbmJzcDstLSZuYnNwO0dldCBSR0JBIHZhbHVlcyBmcm9tIGEgcGl4ZWwgaW4gdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjE3NTAiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMTc1MSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfR2V0UkdCQTwvQgorPjwvQ09ERQorPihVaW50MzIgcGl4ZWwsIFNETF9QaXhlbEZvcm1hdCAqZm10LCBVaW50OCAqciwgVWludDggKmcsIFVpbnQ4ICpiLCBVaW50OCAqYSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xNzU3IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+R2V0IFJHQkEgY29tcG9uZW50IHZhbHVlcyBmcm9tIGEgcGl4ZWwgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgcGl4ZWwgZm9ybWF0LjwvUAorPjxQCis+VGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBlbnRpcmUgOC1iaXQgWzAuLjI1NV0gcmFuZ2Ugd2hlbiBjb252ZXJ0aW5nIGNvbG9yCitjb21wb25lbnRzIGZyb20gcGl4ZWwgZm9ybWF0cyB3aXRoIGxlc3MgdGhhbiA4LWJpdHMgcGVyIFJHQiBjb21wb25lbnQKKyhlLmcuLCBhIGNvbXBsZXRlbHkgd2hpdGUgcGl4ZWwgaW4gMTYtYml0IFJHQjU2NSBmb3JtYXQgd291bGQgcmV0dXJuCitbMHhmZiwgMHhmZiwgMHhmZl0gbm90IFsweGY4LCAweGZjLCAweGY4XSkuPC9QCis+PFAKKz5JZiB0aGUgc3VyZmFjZSBoYXMgbm8gYWxwaGEgY29tcG9uZW50LCB0aGUgYWxwaGEgd2lsbCBiZSByZXR1cm5lZCBhcyAweGZmCisoMTAwJSBvcGFxdWUpLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xNzYyIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGdldHJnYi5odG1sIgorPlNETF9HZXRSR0I8L0EKKz4sCis8QQorSFJFRj0ic2RsbWFwcmdiLmh0bWwiCis+U0RMX01hcFJHQjwvQQorPiwKKzxBCitIUkVGPSJzZGxtYXByZ2JhLmh0bWwiCis+U0RMX01hcFJHQkE8L0EKKz4sCis8QQorSFJFRj0ic2RscGl4ZWxmb3JtYXQuaHRtbCIKKz5TRExfUGl4ZWxGb3JtYXQ8L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldHJnYi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNyZWF0ZXJnYnN1cmZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9HZXRSR0I8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DcmVhdGVSR0JTdXJmYWNlPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldHRocmVhZGlkLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldHRocmVhZGlkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjNTljYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0dGhyZWFkaWQuaHRtbApAQCAtMCwwICsxLDIwOSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9HZXRUaHJlYWRJRDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJNdWx0aS10aHJlYWRlZCBQcm9ncmFtbWluZyIKK0hSRUY9InRocmVhZC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfVGhyZWFkSUQiCitIUkVGPSJzZGx0aHJlYWRpZC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9XYWl0VGhyZWFkIgorSFJFRj0ic2Rsd2FpdHRocmVhZC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx0aHJlYWRpZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsd2FpdHRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEdFVFRIUkVBRElEIgorPjwvQQorPlNETF9HZXRUaHJlYWRJRDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzc0MyIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HZXRUaHJlYWRJRCZuYnNwOy0tJm5ic3A7R2V0IHRoZSBTREwgdGhyZWFkIElEIG9mIGEgU0RMX1RocmVhZDwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43NzQ2IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjc3NDciCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5VaW50MzIgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0dldFRocmVhZElEPC9CCis+PC9DT0RFCis+KFNETF9UaHJlYWQgKnRocmVhZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NzUzIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UmV0dXJucyB0aGUgSUQgb2YgYSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1RocmVhZDwvU1BBTgorPiBjcmVhdGVkIGJ5IDxBCitIUkVGPSJzZGxjcmVhdGV0aHJlYWQuaHRtbCIKKz5TRExfQ3JlYXRlVGhyZWFkPC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NzU4IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZXRocmVhZC5odG1sIgorPlNETF9DcmVhdGVUaHJlYWQ8L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHRocmVhZGlkLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsd2FpdHRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1RocmVhZElEPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1dhaXRUaHJlYWQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0dGlja3MuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0dGlja3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTExYWFlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXR0aWNrcy5odG1sCkBAIC0wLDAgKzEsMjA2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dldFRpY2tzPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlRpbWUiCitIUkVGPSJ0aW1lLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlRpbWUiCitIUkVGPSJ0aW1lLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0RlbGF5IgorSFJFRj0ic2RsZGVsYXkuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0idGltZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZGVsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHRVRUSUNLUyIKKz48L0EKKz5TRExfR2V0VGlja3M8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjg0MzMiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfR2V0VGlja3MmbmJzcDstLSZuYnNwO0dldCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgU0RMIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjg0MzYiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOODQzNyIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+VWludDMyIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9HZXRUaWNrczwvQgorPjwvQ09ERQorPih2b2lkKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjg0NDMiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5HZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIFNETCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLgorTm90ZSB0aGF0IHRoaXMgdmFsdWUgd3JhcHMgaWYgdGhlIHByb2dyYW0gcnVucyBmb3IgbW9yZSB0aGFuIH40OSBkYXlzLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44NDQ2IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGRlbGF5Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0RlbGF5PC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGltZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGRlbGF5Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5UaW1lPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGltZS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9EZWxheTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnZXR2aWRlb2luZm8uaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0dmlkZW9pbmZvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjNGI0NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0dmlkZW9pbmZvLmh0bWwKQEAgLTAsMCArMSwyMjYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfR2V0VmlkZW9JbmZvPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0dldFZpZGVvU3VyZmFjZSIKK0hSRUY9InNkbGdldHZpZGVvc3VyZmFjZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9WaWRlb0RyaXZlck5hbWUiCitIUkVGPSJzZGx2aWRlb2RyaXZlcm5hbWUuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0dmlkZW9zdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx2aWRlb2RyaXZlcm5hbWUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHRVRWSURFT0lORk8iCis+PC9BCis+U0RMX0dldFZpZGVvSW5mbzwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTEwMCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HZXRWaWRlb0luZm8mbmJzcDstLSZuYnNwO3JldHVybnMgYSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyBoYXJkd2FyZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4xMTAzIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjExMDQiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9WaWRlb0luZm8gKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9HZXRWaWRlb0luZm88L0IKKz48L0NPREUKKz4odm9pZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xMTEwIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+VGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmVhZC1vbmx5IHBvaW50ZXIgdG8gPEEKK0hSRUY9InNkbHZpZGVvaW5mby5odG1sIgorPmluZm9ybWF0aW9uPC9BCis+IGFib3V0IHRoZSB2aWRlbworaGFyZHdhcmUuICBJZiB0aGlzIGlzIGNhbGxlZCBiZWZvcmUgPEEKK0hSRUY9InNkbHNldHZpZGVvbW9kZS5odG1sIgorPlNETF9TZXRWaWRlb01vZGU8L0EKKz4sIHRoZQorPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz52Zm10PC9JCis+PC9UVAorPiBtZW1iZXIgb2YgdGhlIHJldHVybmVkIHN0cnVjdHVyZSB3aWxsIGNvbnRhaW4gdGhlCitwaXhlbCBmb3JtYXQgb2YgdGhlICJiZXN0IiB2aWRlbyBtb2RlLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xMTE2IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHNldHZpZGVvbW9kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHZpZGVvaW5mby5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfVmlkZW9JbmZvPC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXR2aWRlb3N1cmZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx2aWRlb2RyaXZlcm5hbWUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9HZXRWaWRlb1N1cmZhY2U8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9WaWRlb0RyaXZlck5hbWU8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2V0dmlkZW9zdXJmYWNlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldHZpZGVvc3VyZmFjZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWIxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdldHZpZGVvc3VyZmFjZS5odG1sCkBAIC0wLDAgKzEsMjA4IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dldFZpZGVvU3VyZmFjZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfR2V0VmlkZW9JbmZvIgorSFJFRj0ic2RsZ2V0dmlkZW9pbmZvLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXR2aWRlb2luZm8uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHRVRWSURFT1NVUkZBQ0UiCis+PC9BCis+U0RMX0dldFZpZGVvU3VyZmFjZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTA3OCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HZXRWaWRlb1N1cmZhY2UmbmJzcDstLSZuYnNwO3JldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRpc3BsYXkgc3VyZmFjZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4xMDgxIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjEwODIiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9TdXJmYWNlICo8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfR2V0VmlkZW9TdXJmYWNlPC9CCis+PC9DT0RFCis+KHZvaWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTA4OCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGlzcGxheSBzdXJmYWNlLgorSWYgU0RMIGlzIGRvaW5nIGZvcm1hdCBjb252ZXJzaW9uIG9uIHRoZSBkaXNwbGF5IHN1cmZhY2UsIHRoaXMKK2Z1bmN0aW9uIHJldHVybnMgdGhlIHB1YmxpY2x5IHZpc2libGUgc3VyZmFjZSwgbm90IHRoZSByZWFsIHZpZGVvCitzdXJmYWNlLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xMDkxIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHN1cmZhY2UuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1N1cmZhY2U8L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0dmlkZW9pbmZvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5WaWRlbzwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldFZpZGVvSW5mbzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnbGF0dHIuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2xhdHRyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlMDEyNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2xhdHRyLmh0bWwKQEAgLTAsMCArMSwzNzkgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfR0xhdHRyPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0ZyZWVZVVZPdmVybGF5IgorSFJFRj0ic2RsZnJlZXl1dm92ZXJsYXkuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfUmVjdCIKK0hSRUY9InNkbHJlY3QuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZnJlZXl1dm92ZXJsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHTEFUVFIiCis+PC9BCis+U0RMX0dMYXR0cjwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMjk3MSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HTGF0dHImbmJzcDstLSZuYnNwO1NETCBHTCBBdHRyaWJ1dGVzPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI5NzQiCis+PC9BCis+PEgyCis+QXR0cmlidXRlczwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVOMjk3NiIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfR0xfUkVEX1NJWkU8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TaXplIG9mIHRoZSBmcmFtZWJ1ZmZlciByZWQgY29tcG9uZW50LCBpbiBiaXRzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfR0xfR1JFRU5fU0laRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNpemUgb2YgdGhlIGZyYW1lYnVmZmVyIGdyZWVuIGNvbXBvbmVudCwgaW4gYml0czwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0dMX0JMVUVfU0laRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNpemUgb2YgdGhlIGZyYW1lYnVmZmVyIGJsdWUgY29tcG9uZW50LCBpbiBiaXRzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfR0xfQUxQSEFfU0laRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNpemUgb2YgdGhlIGZyYW1lYnVmZmVyIGFscGhhIGNvbXBvbmVudCwgaW4gYml0czwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0dMX0RPVUJMRUJVRkZFUjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjAgb3IgMSwgZW5hYmxlIG9yIGRpc2FibGUgZG91YmxlIGJ1ZmZlcmluZzwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0dMX0JVRkZFUl9TSVpFPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U2l6ZSBvZiB0aGUgZnJhbWVidWZmZXIsIGluIGJpdHM8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9HTF9ERVBUSF9TSVpFPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U2l6ZSBvZiB0aGUgZGVwdGggYnVmZmVyLCBpbiBiaXRzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfR0xfU1RFTkNJTF9TSVpFPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U2l6ZSBvZiB0aGUgc3RlbmNpbCBidWZmZXIsIGluIGJpdHM8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9HTF9BQ0NVTV9SRURfU0laRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNpemUgb2YgdGhlIGFjY3VtdWxhdGlvbiBidWZmZXIgcmVkIGNvbXBvbmVudCwgaW4gYml0czwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkU8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TaXplIG9mIHRoZSBhY2N1bXVsYXRpb24gYnVmZmVyIGdyZWVuIGNvbXBvbmVudCwgaW4gYml0czwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0dMX0FDQ1VNX0JMVUVfU0laRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNpemUgb2YgdGhlIGFjY3VtdWxhdGlvbiBidWZmZXIgYmx1ZSBjb21wb25lbnQsIGluIGJpdHM8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9HTF9BQ0NVTV9BTFBIQV9TSVpFPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U2l6ZSBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlciBhbHBoYSBjb21wb25lbnQsIGluIGJpdHM8L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zMDI3IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+V2hpbGUgeW91IGNhbiBzZXQgbW9zdCBPcGVuR0wgYXR0cmlidXRlcyBub3JtYWxseSwgdGhlIGF0dHJpYnV0ZXMgbGlzdCBhYm92ZSBtdXN0IGJlIGtub3duIDxTUEFOCitDTEFTUz0iZW1waGFzaXMiCis+PEkKK0NMQVNTPSJFTVBIQVNJUyIKKz5iZWZvcmU8L0kKKz48L1NQQU4KKz4gU0RMIHNldHMgdGhlIHZpZGVvIG1vZGUuIFRoZXNlIGF0dHJpYnV0ZXMgYSBzZXQgYW5kIHJlYWQgd2l0aCA8QQorSFJFRj0ic2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR0xfU2V0QXR0cmlidXRlPC9UVAorPjwvQQorPiBhbmQgPEEKK0hSRUY9InNkbGdsZ2V0YXR0cmlidXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dMX0dldEF0dHJpYnV0ZTwvVFQKKz48L0EKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMwMzUiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR0xfU2V0QXR0cmlidXRlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxnbGdldGF0dHJpYnV0ZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HTF9HZXRBdHRyaWJ1dGU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxmcmVleXV2b3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9GcmVlWVVWT3ZlcmxheTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1JlY3Q8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2xnZXRhdHRyaWJ1dGUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2xnZXRhdHRyaWJ1dGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmM4OTEzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnbGdldGF0dHJpYnV0ZS5odG1sCkBAIC0wLDAgKzEsMjQ3IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dMX0dldEF0dHJpYnV0ZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9HTF9HZXRQcm9jQWRkcmVzcyIKK0hSRUY9InNkbGdsZ2V0cHJvY2FkZHJlc3MuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfR0xfU2V0QXR0cmlidXRlIgorSFJFRj0ic2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2xnZXRwcm9jYWRkcmVzcy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHTEdFVEFUVFJJQlVURSIKKz48L0EKKz5TRExfR0xfR2V0QXR0cmlidXRlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yNzA4IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0dMX0dldEF0dHJpYnV0ZSZuYnNwOy0tJm5ic3A7R2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpYWwgU0RML09wZW5HTCBhdHRyaWJ1dGU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMjcxMSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4yNzEyIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0dMX0dldEF0dHJpYnV0ZTwvQgorPjwvQ09ERQorPihTRExHTGF0dHIgYXR0ciwgaW50ICp2YWx1ZSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNzE4IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UGxhY2VzIHRoZSB2YWx1ZSBvZiB0aGUgU0RML09wZW5HTCA8QQorSFJFRj0ic2RsZ2xhdHRyLmh0bWwiCis+YXR0cmlidXRlPC9BCis+IDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmF0dHI8L0kKKz48L1RUCis+IGludG8gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+dmFsdWU8L0kKKz48L1RUCis+LiBUaGlzIGlzIHVzZWZ1bCBhZnRlciBhIGNhbGwgdG8gPEEKK0hSRUY9InNkbHNldHZpZGVvbW9kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+PC9BCis+IHRvIGNoZWNrIHdoZXRoZXIgeW91ciBhdHRyaWJ1dGVzIGhhdmUgYmVlbiA8QQorSFJFRj0ic2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCIKKz5zZXQ8L0EKKz4gYXMgeW91IGV4cGVjdGVkLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNzI3IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IG9uIHN1Y2Nlc3MsIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gb24gYW4gZXJyb3IuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI3MzIiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR0xfU2V0QXR0cmlidXRlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxnbGF0dHIuaHRtbCIKKz5HTCBBdHRyaWJ1dGVzPC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnbGdldHByb2NhZGRyZXNzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9HTF9HZXRQcm9jQWRkcmVzczwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dMX1NldEF0dHJpYnV0ZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnbGdldHByb2NhZGRyZXNzLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdsZ2V0cHJvY2FkZHJlc3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmNmNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnbGdldHByb2NhZGRyZXNzLmh0bWwKQEAgLTAsMCArMSwyNjIgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfR0xfR2V0UHJvY0FkZHJlc3M8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR0xfTG9hZExpYnJhcnkiCitIUkVGPSJzZGxnbGxvYWRsaWJyYXJ5Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0dMX0dldEF0dHJpYnV0ZSIKK0hSRUY9InNkbGdsZ2V0YXR0cmlidXRlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdsbG9hZGxpYnJhcnkuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdsZ2V0YXR0cmlidXRlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMR0xHRVRQUk9DQUREUkVTUyIKKz48L0EKKz5TRExfR0xfR2V0UHJvY0FkZHJlc3M8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjI2NzgiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfR0xfR2V0UHJvY0FkZHJlc3MmbmJzcDstLSZuYnNwO0dldCB0aGUgYWRkcmVzcyBvZiBhIEdMIGZ1bmN0aW9uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjI2ODEiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjY4MiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0dMX0dldFByb2NBZGRyZXNzPC9CCis+PC9DT0RFCis+KGNvbnN0IGNoYXIqIHByb2MpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjY4OCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIEdMIGZ1bmN0aW9uIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnByb2M8L0kKKz48L1RUCis+LCBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPk5VTEw8L1NQQU4KKz4gaWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBmb3VuZC4gSWYgdGhlIEdMIGxpYnJhcnkgaXMgbG9hZGVkIGF0IHJ1bnRpbWUsIHdpdGggPEEKK0hSRUY9InNkbGdsbG9hZGxpYnJhcnkuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR0xfTG9hZExpYnJhcnk8L1RUCis+PC9BCis+LCB0aGVuIDxTUEFOCitDTEFTUz0iZW1waGFzaXMiCis+PEkKK0NMQVNTPSJFTVBIQVNJUyIKKz5hbGw8L0kKKz48L1NQQU4KKz4gR0wgZnVuY3Rpb25zIG11c3QgYmUgcmV0cmlldmVkIHRoaXMgd2F5LiBVc3VhbGx5IHRoaXMgaXMgdXNlZCB0byByZXRyaWV2ZSBmdW5jdGlvbiBwb2ludGVycyB0byBPcGVuR0wgZXh0ZW5zaW9ucy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjY5NiIKKz48L0EKKz48SDIKKz5FeGFtcGxlPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz50eXBlZGVmIHZvaWQgKCpHTF9BY3RpdmVUZXh0dXJlQVJCX0Z1bmMpKHVuc2lnbmVkIGludCk7CitHTF9BY3RpdmVUZXh0dXJlQVJCX0Z1bmMgZ2xBY3RpdmVUZXh0dXJlQVJCX3B0ciA9IDA7CitpbnQgaGFzX211bHRpdGV4dHVyZT0xOworLgorLgorLgorLyogR2V0IGZ1bmN0aW9uIHBvaW50ZXIgKi8KK2dsQWN0aXZlVGV4dHVyZUFSQl9wdHI9KEdMX0FjdGl2ZVRleHR1cmVBUkJfRnVuYykgU0RMX0dMX0dldFByb2NBZGRyZXNzKCJnbEFjdGl2ZVRleHR1cmVBUkIiKTsKKworLyogQ2hlY2sgZm9yIGEgdmFsaWQgZnVuY3Rpb24gcHRyICovCitpZighZ2xBY3RpdmVUZXh0dXJlQVJCX3B0cil7CisgIGZwcmludGYoc3RkZXJyLCAiTXVsdGl0ZXh0dXJlIEV4dGVuc2lvbnMgbm90IHByZXNlbnQuXG4iKTsKKyAgaGFzX211bHRpdGV4dHVyZT0wOworfQorLgorLgorLgorLgoraWYoaGFzX211bHRpdGV4dHVyZSl7CisgIGdsQWN0aXZlVGV4dHVyZUFSQl9wdHIoR0xfVEVYVFVSRTBfQVJCKTsKKyAgLgorICAuCit9CitlbHNleworICAuCisgIC4KK308L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNjk5IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGdsbG9hZGxpYnJhcnkuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR0xfTG9hZExpYnJhcnk8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnbGxvYWRsaWJyYXJ5Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2xnZXRhdHRyaWJ1dGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9HTF9Mb2FkTGlicmFyeTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dMX0dldEF0dHJpYnV0ZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnbGxvYWRsaWJyYXJ5Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdsbG9hZGxpYnJhcnkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2M0YzZkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnbGxvYWRsaWJyYXJ5Lmh0bWwKQEAgLTAsMCArMSwyMzEgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfR0xfTG9hZExpYnJhcnk8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfU2hvd0N1cnNvciIKK0hSRUY9InNkbHNob3djdXJzb3IuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfR0xfR2V0UHJvY0FkZHJlc3MiCitIUkVGPSJzZGxnbGdldHByb2NhZGRyZXNzLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNob3djdXJzb3IuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdsZ2V0cHJvY2FkZHJlc3MuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHTExPQURMSUJSQVJZIgorPjwvQQorPlNETF9HTF9Mb2FkTGlicmFyeTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMjY0OCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9HTF9Mb2FkTGlicmFyeSZuYnNwOy0tJm5ic3A7U3BlY2lmeSBhbiBPcGVuR0wgbGlicmFyeTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4yNjUxIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjI2NTIiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfR0xfTG9hZExpYnJhcnk8L0IKKz48L0NPREUKKz4oY29uc3QgY2hhciAqcGF0aCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNjU4IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+SWYgeW91IHdpc2gsIHlvdSBtYXkgbG9hZCB0aGUgT3BlbkdMIGxpYnJhcnkgYXQgcnVudGltZSwgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0VmlkZW9Nb2RlPC9UVAorPjwvQQorPiBpcyBjYWxsZWQuIFRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5wYXRoPC9JCis+PC9UVAorPiBvZiB0aGUgR0wgbGlicmFyeSBpcyBwYXNzZWQgdG8gPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dMX0xvYWRMaWJyYXJ5PC9UVAorPiBhbmQgaXQgcmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gb24gc3VjY2Vzcywgb3IgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4tMTwvU1BBTgorPiBvbiBhbiBlcnJvci4gWW91IG11c3QgdGhlbiB1c2UgPEEKK0hSRUY9InNkbGdsZ2V0cHJvY2FkZHJlc3MuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR0xfR2V0UHJvY0FkZHJlc3M8L1RUCis+PC9BCis+IHRvIHJldHJpZXZlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIEdMIGZ1bmN0aW9ucy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjY2OSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxnbGdldHByb2NhZGRyZXNzLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dMX0dldFByb2NBZGRyZXNzPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2hvd2N1cnNvci5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdsZ2V0cHJvY2FkZHJlc3MuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9TaG93Q3Vyc29yPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfR0xfR2V0UHJvY0FkZHJlc3M8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2xzZXRhdHRyaWJ1dGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmIxMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxnbHNldGF0dHJpYnV0ZS5odG1sCkBAIC0wLDAgKzEsMjg2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0dMX1NldEF0dHJpYnV0ZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9HTF9HZXRBdHRyaWJ1dGUiCitIUkVGPSJzZGxnbGdldGF0dHJpYnV0ZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9HTF9Td2FwQnVmZmVycyIKK0hSRUY9InNkbGdsc3dhcGJ1ZmZlcnMuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2xnZXRhdHRyaWJ1dGUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdsc3dhcGJ1ZmZlcnMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExHTFNFVEFUVFJJQlVURSIKKz48L0EKKz5TRExfR0xfU2V0QXR0cmlidXRlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yNzQyIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0dMX1NldEF0dHJpYnV0ZSZuYnNwOy0tJm5ic3A7U2V0IGEgc3BlY2lhbCBTREwvT3BlbkdMIGF0dHJpYnV0ZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4yNzQ1IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjI3NDYiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfR0xfU2V0QXR0cmlidXRlPC9CCis+PC9DT0RFCis+KFNETF9HTGF0dHIgYXR0ciwgaW50IHZhbHVlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI3NTIiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5TZXRzIHRoZSBPcGVuR0wgPEEKK0hSRUY9InNkbGdsYXR0ci5odG1sIgorPmF0dHJpYnV0ZTwvQQorPiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5hdHRyPC9JCis+PC9UVAorPiB0byA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz52YWx1ZTwvSQorPjwvVFQKKz4uIFRoZSBhdHRyaWJ1dGVzIHlvdSBzZXQgZG9uJ3QgdGFrZSBlZmZlY3QgdW50aWwgYWZ0ZXIgYSBjYWxsIHRvIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0VmlkZW9Nb2RlPC9UVAorPjwvQQorPi4gWW91IHNob3VsZCB1c2UgPEEKK0hSRUY9InNkbGdsZ2V0YXR0cmlidXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dMX0dldEF0dHJpYnV0ZTwvVFQKKz48L0EKKz4gdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBhIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+IGNhbGwuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI3NjMiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gb24gc3VjY2Vzcywgb3IgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4tMTwvU1BBTgorPiBvbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjc2OCIKKz48L0EKKz48SDIKKz5FeGFtcGxlPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfR0xfU2V0QXR0cmlidXRlKCBTRExfR0xfUkVEX1NJWkUsIDUgKTsKK1NETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9HUkVFTl9TSVpFLCA1ICk7CitTRExfR0xfU2V0QXR0cmlidXRlKCBTRExfR0xfQkxVRV9TSVpFLCA1ICk7CitTRExfR0xfU2V0QXR0cmlidXRlKCBTRExfR0xfREVQVEhfU0laRSwgMTYgKTsKK1NETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9ET1VCTEVCVUZGRVIsIDEgKTsKK2lmICggKHNjcmVlbj1TRExfU2V0VmlkZW9Nb2RlKCA2NDAsIDQ4MCwgMTYsIFNETF9PUEVOR0wgKSkgPT0gTlVMTCApIHsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBzZXQgR0wgbW9kZTogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgU0RMX1F1aXQoKTsKKyAgcmV0dXJuOworfTwvUFJFCis+PERJVgorQ0xBU1M9Ik5PVEUiCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJOT1RFIgorPjxQCis+PEIKKz5Ob3RlOiA8L0IKKz5UaGUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRE9VQkxFQlVGPC9UVAorPiBmbGFnIGlzIG5vdCByZXF1aXJlZCB0byBlbmFibGUgZG91YmxlIGJ1ZmZlcmluZyB3aGVuIHNldHRpbmcgYW4gT3BlbkdMIHZpZGVvIG1vZGUuIERvdWJsZSBidWZmZXJpbmcgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCB1c2luZyB0aGUgU0RMX0dMX0RPVUJMRUJVRkZFUiBhdHRyaWJ1dGUuPC9QCis+PC9CTE9DS1FVT1RFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjc3NCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxnbGdldGF0dHJpYnV0ZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HTF9HZXRBdHRyaWJ1dGU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGdsYXR0ci5odG1sIgorPkdMIEF0dHJpYnV0ZXM8L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdsZ2V0YXR0cmlidXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2xzd2FwYnVmZmVycy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dMX0dldEF0dHJpYnV0ZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dMX1N3YXBCdWZmZXJzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdsc3dhcGJ1ZmZlcnMuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsZ2xzd2FwYnVmZmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMzgzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGdsc3dhcGJ1ZmZlcnMuaHRtbApAQCAtMCwwICsxLDIxMiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9HTF9Td2FwQnVmZmVyczwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9HTF9TZXRBdHRyaWJ1dGUiCitIUkVGPSJzZGxnbHNldGF0dHJpYnV0ZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9DcmVhdGVZVVZPdmVybGF5IgorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnbHNldGF0dHJpYnV0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEdMU1dBUEJVRkZFUlMiCis+PC9BCis+U0RMX0dMX1N3YXBCdWZmZXJzPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yNzg0IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0dMX1N3YXBCdWZmZXJzJm5ic3A7LS0mbmJzcDtTd2FwIE9wZW5HTCBmcmFtZWJ1ZmZlcnMvVXBkYXRlIERpc3BsYXk8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMjc4NyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4yNzg4IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9HTF9Td2FwQnVmZmVyczwvQgorPjwvQ09ERQorPih2b2lkICk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNzk0IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+U3dhcCB0aGUgT3BlbkdMIGJ1ZmZlcnMsIGlmIGRvdWJsZS1idWZmZXJpbmcgaXMgc3VwcG9ydGVkLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNzk3IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHNldHZpZGVvbW9kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGdsc2V0YXR0cmlidXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dMX1NldEF0dHJpYnV0ZTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdsc2V0YXR0cmlidXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dMX1NldEF0dHJpYnV0ZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NyZWF0ZVlVVk92ZXJsYXk8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsaW5pdC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxpbml0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmMjdiOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsaW5pdC5odG1sCkBAIC0wLDAgKzEsMzY4IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0luaXQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iR2VuZXJhbCIKK0hSRUY9ImdlbmVyYWwuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iR2VuZXJhbCIKK0hSRUY9ImdlbmVyYWwuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfSW5pdFN1YlN5c3RlbSIKK0hSRUY9InNkbGluaXRzdWJzeXN0ZW0uaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZ2VuZXJhbC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsaW5pdHN1YnN5c3RlbS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETElOSVQiCis+PC9BCis+U0RMX0luaXQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjQ0MCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Jbml0Jm5ic3A7LS0mbmJzcDtJbml0aWFsaXplcyBTREw8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONDQzIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjQ0NCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Jbml0PC9CCis+PC9DT0RFCis+KFVpbnQzMiBmbGFncyk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40NTAiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5Jbml0aWFsaXplcyBTREwuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYWxsIG90aGVyIFNETCBmdW5jdGlvbnMuIFRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5mbGFnczwvSQorPjwvVFQKKz4gcGFyYW1ldGVyIHNwZWNpZmllcyB3aGF0IHBhcnQocykgb2YgU0RMIHRvIGluaXRpYWxpemUuPC9QCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjQ1NCIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIxIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSU5JVF9USU1FUjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkluaXRpYWxpemVzIHRoZSA8QQorSFJFRj0idGltZS5odG1sIgorPnRpbWVyPC9BCis+IHN1YnN5c3RlbS48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9JTklUX0FVRElPPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+SW5pdGlhbGl6ZXMgdGhlIDxBCitIUkVGPSJhdWRpby5odG1sIgorPmF1ZGlvPC9BCis+IHN1YnN5c3RlbS48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9JTklUX1ZJREVPPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+SW5pdGlhbGl6ZXMgdGhlIDxBCitIUkVGPSJ2aWRlby5odG1sIgorPnZpZGVvPC9BCis+IHN1YnN5c3RlbS48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9JTklUX0NEUk9NPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+SW5pdGlhbGl6ZXMgdGhlIDxBCitIUkVGPSJjZHJvbS5odG1sIgorPmNkcm9tPC9BCis+IHN1YnN5c3RlbS48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9JTklUX0pPWVNUSUNLPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+SW5pdGlhbGl6ZXMgdGhlIDxBCitIUkVGPSJqb3lzdGljay5odG1sIgorPmpveXN0aWNrPC9BCis+IHN1YnN5c3RlbS48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9JTklUX0VWRVJZVEhJTkc8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Jbml0aWFsaXplIGFsbCBvZiB0aGUgYWJvdmUuPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSU5JVF9OT1BBUkFDSFVURTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlByZXZlbnRzIFNETCBmcm9tIGNhdGNoaW5nIGZhdGFsIHNpZ25hbHMuPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSU5JVF9FVkVOVFRIUkVBRDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ5NCIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5SZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gb24gYW4gZXJyb3Igb3IgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IG9uIHN1Y2Nlc3MuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ5OSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxxdWl0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1F1aXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGluaXRzdWJzeXN0ZW0uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdFN1YlN5c3RlbTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImdlbmVyYWwuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxpbml0c3Vic3lzdGVtLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5HZW5lcmFsPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ2VuZXJhbC5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Jbml0U3ViU3lzdGVtPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGluaXRzdWJzeXN0ZW0uaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsaW5pdHN1YnN5c3RlbS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxN2ZkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGluaXRzdWJzeXN0ZW0uaHRtbApAQCAtMCwwICsxLDI4MyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Jbml0U3ViU3lzdGVtPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkdlbmVyYWwiCitIUkVGPSJnZW5lcmFsLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Jbml0IgorSFJFRj0ic2RsaW5pdC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9RdWl0U3ViU3lzdGVtIgorSFJFRj0ic2RscXVpdHN1YnN5c3RlbS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxpbml0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxxdWl0c3Vic3lzdGVtLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMSU5JVFNVQlNZU1RFTSIKKz48L0EKKz5TRExfSW5pdFN1YlN5c3RlbTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTEwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0luaXRTdWJTeXN0ZW0mbmJzcDstLSZuYnNwO0luaXRpYWxpemUgc3Vic3lzdGVtczwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU41MTMiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTE0IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0luaXRTdWJTeXN0ZW08L0IKKz48L0NPREUKKz4oVWludDMyIGZsYWdzKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjUyMCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkFmdGVyIFNETCBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIDxBCitIUkVGPSJzZGxpbml0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXQ8L1RUCis+PC9BCis+IHlvdSBtYXkgaW5pdGlhbGl6ZSB1bmluaXRpYWxpemVkIHN1YnN5c3RlbXMgd2l0aCA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdFN1YlN5c3RlbTwvVFQKKz4uIFRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5mbGFnczwvSQorPjwvVFQKKz4gcGFyYW1ldGVyIGlzIHRoZSBzYW1lIGFzIHRoYXQgdXNlZCBpbiA8QQorSFJFRj0ic2RsaW5pdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Jbml0PC9UVAorPjwvQQorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTI5IgorPjwvQQorPjxIMgorPkV4YW1wbGVzPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4vKiBTZXBlcmF0aW5nIEpveXN0aWNrIGFuZCBWaWRlbyBpbml0aWFsaXphdGlvbi4gKi8KK1NETF9Jbml0KFNETF9JTklUX1ZJREVPKTsKKy4KKy4KK1NETF9TZXRWaWRlb01vZGUoNjQwLCA0ODAsIDE2LCBTRExfRE9VQkxFQlVGfFNETF9GVUxMU0NSRUVOKTsKKy4KKy8qIERvIFNvbWUgVmlkZW8gc3R1ZmYgKi8KKy4KKy4KKy8qIEluaXRpYWxpemUgdGhlIGpveXN0aWNrIHN1YnN5c3RlbSAqLworU0RMX0luaXRTdWJTeXN0ZW0oU0RMX0lOSVRfSk9ZU1RJQ0spOworCisvKiBEbyBzb21lIHN0dWZmIHdpdGggdmlkZW8gYW5kIGpveXN0aWNrICovCisuCisuCisuCisvKiBTaHV0IHRoZW0gYm90aCBkb3duICovCitTRExfUXVpdCgpOzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjUzMiIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5SZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gb24gYW4gZXJyb3Igb3IgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IG9uIHN1Y2Nlc3MuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjUzNyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxpbml0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHF1aXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUXVpdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RscXVpdHN1YnN5c3RlbS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0U3ViU3lzdGVtPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsaW5pdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHF1aXRzdWJzeXN0ZW0uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Jbml0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ2VuZXJhbC5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9RdWl0U3ViU3lzdGVtPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveWF4aXNldmVudC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lheGlzZXZlbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAxNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lheGlzZXZlbnQuaHRtbApAQCAtMCwwICsxLDMzMCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Kb3lBeGlzRXZlbnQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iU0RMIEV2ZW50IFN0cnVjdHVyZXMuIgorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Nb3VzZUJ1dHRvbkV2ZW50IgorSFJFRj0ic2RsbW91c2VidXR0b25ldmVudC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Kb3lCdXR0b25FdmVudCIKK0hSRUY9InNkbGpveWJ1dHRvbmV2ZW50Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG1vdXNlYnV0dG9uZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveWJ1dHRvbmV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMSk9ZQVhJU0VWRU5UIgorPjwvQQorPlNETF9Kb3lBeGlzRXZlbnQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjQyMDMiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfSm95QXhpc0V2ZW50Jm5ic3A7LS0mbmJzcDtKb3lzdGljayBheGlzIG1vdGlvbiBldmVudCBzdHJ1Y3R1cmU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDIwNiIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGU7CisgIFVpbnQ4IHdoaWNoOworICBVaW50OCBheGlzOworICBTaW50MTYgdmFsdWU7Cit9IFNETF9Kb3lBeGlzRXZlbnQ7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDIwOSIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGF0YTwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVONDIxMSIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz50eXBlPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSk9ZQVhJU01PVElPTjwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPndoaWNoPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Sm95c3RpY2sgZGV2aWNlIGluZGV4PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5heGlzPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Sm95c3RpY2sgYXhpcyBpbmRleDwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dmFsdWU8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5BeGlzIHZhbHVlIChyYW5nZTogLTMyNzY4IHRvIDMyNzY3KTwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQyMzEiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveUF4aXNFdmVudDwvU1BBTgorPiBpcyBhIG1lbWJlciBvZiB0aGUgPEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiB1bmlvbiBhbmQgaXMgdXNlZCB3aGVuIGFuIGV2ZW50IG9mIHR5cGUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSk9ZQVhJU01PVElPTjwvVFQKKz4gaXMgcmVwb3J0ZWQuPC9QCis+PFAKKz5BIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0pPWUFYSVNNT1RJT048L1RUCis+IGV2ZW50IG9jY3VycyB3aGVuIGV2ZXIgYSB1c2VyIG1vdmVzIGFuIGF4aXMgb24gdGhlIGpveXN0aWNrLiBUaGUgZmllbGQgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz53aGljaDwvSQorPjwvVFQKKz4gaXMgdGhlIGluZGV4IG9mIHRoZSBqb3lzdGljayB0aGF0IHJlcG9ydGVkIHRoZSBldmVudCBhbmQgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5heGlzPC9JCis+PC9UVAorPiBpcyB0aGUgaW5kZXggb2YgdGhlIGF4aXMgKGZvciBhIG1vcmUgZGV0YWlsZWQgZXhwbGFpbmF0aW9uIHNlZSB0aGUgPEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCis+Sm95c3RpY2sgc2VjdGlvbjwvQQorPikuIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dmFsdWU8L0kKKz48L1RUCis+IGlzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBheGlzLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MjQ0IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJqb3lzdGljay5odG1sIgorPkpveXN0aWNrIEZ1bmN0aW9uczwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja2V2ZW50c3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tFdmVudFN0YXRlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja2dldGF4aXMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tHZXRBeGlzPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsbW91c2VidXR0b25ldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveWJ1dHRvbmV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfTW91c2VCdXR0b25FdmVudDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lCdXR0b25FdmVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3liYWxsZXZlbnQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95YmFsbGV2ZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiOTZmZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95YmFsbGV2ZW50Lmh0bWwKQEAgLTAsMCArMSwzNDAgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfSm95QmFsbEV2ZW50PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBFdmVudCBTdHJ1Y3R1cmVzLiIKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfSm95SGF0RXZlbnQiCitIUkVGPSJzZGxqb3loYXRldmVudC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9SZXNpemVFdmVudCIKK0hSRUY9InNkbHJlc2l6ZWV2ZW50Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveWhhdGV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxyZXNpemVldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWUJBTExFVkVOVCIKKz48L0EKKz5TRExfSm95QmFsbEV2ZW50PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU40Mzk2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0pveUJhbGxFdmVudCZuYnNwOy0tJm5ic3A7Sm95c3RpY2sgdHJhY2tiYWxsIG1vdGlvbiBldmVudCBzdHJ1Y3R1cmU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDM5OSIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGU7CisgIFVpbnQ4IHdoaWNoOworICBVaW50OCBiYWxsOworICBTaW50MTYgeHJlbCwgeXJlbDsKK30gU0RMX0pveUJhbGxFdmVudDs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40NDAyIgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEYXRhPC9IMgorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU40NDA0IgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjAiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUQk9EWQorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9KT1lCQUxMTU9USU9OPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+d2hpY2g8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Kb3lzdGljayBkZXZpY2UgaW5kZXg8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmJhbGw8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Kb3lzdGljayB0cmFja2JhbGwgaW5kZXg8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnhyZWw8L0kKKz48L1RUCis+LCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnlyZWw8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UaGUgcmVsYXRpdmUgbW90aW9uIGluIHRoZSBYL1kgZGlyZWN0aW9uPC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDQyNSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfSm95QmFsbEV2ZW50PC9TUEFOCis+IGlzIGEgbWVtYmVyIG9mIHRoZSA8QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+IHVuaW9uIGFuZCBpcyB1c2VkIHdoZW4gYW4gZXZlbnQgb2YgdHlwZSA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9KT1lCQUxMTU9USU9OPC9UVAorPiBpcyByZXBvcnRlZC48L1AKKz48UAorPkEgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSk9ZQkFMTE1PVElPTjwvVFQKKz4gZXZlbnQgb2NjdXJzIHdoZW4gYSB1c2VyIG1vdmVzIGEgdHJhY2tiYWxsIG9uIHRoZSBqb3lzdGljay4gVGhlIGZpZWxkIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+d2hpY2g8L0kKKz48L1RUCis+IGlzIHRoZSBpbmRleCBvZiB0aGUgam95c3RpY2sgdGhhdCByZXBvcnRlZCB0aGUgZXZlbnQgYW5kIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+YmFsbDwvSQorPjwvVFQKKz4gaXMgdGhlIGluZGV4IG9mIHRoZSB0cmFja2JhbGwgKGZvciBhIG1vcmUgZGV0YWlsZWQgZXhwbGFpbmF0aW9uIHNlZSB0aGUgPEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCis+Sm95c3RpY2sgc2VjdGlvbjwvQQorPikuIFRyYWNrYmFsbHMgb25seSByZXR1cm4gcmVsYXRpdmUgbW90aW9uLCB0aGlzIGlzIHRoZSBjaGFuZ2UgaW4gcG9zaXRpb24gb24gdGhlIGJhbGwgc2luY2UgaXQgd2FzIGxhc3QgcG9sbGVkIChsYXN0IGN5Y2xlIG9mIHRoZSBldmVudCBsb29wKSBhbmQgaXQgaXMgc3RvcmVkIGluIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+eHJlbDwvSQorPjwvVFQKKz4gYW5kIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+eXJlbDwvSQorPjwvVFQKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ0MzkiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCis+Sm95c3RpY2sgRnVuY3Rpb25zPC9BCis+LAorPEEKK0hSRUY9InNkbGpveXN0aWNrZXZlbnRzdGF0ZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja0V2ZW50U3RhdGU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YmFsbC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja0dldEJhbGw8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3loYXRldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHJlc2l6ZWV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfSm95SGF0RXZlbnQ8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfUmVzaXplRXZlbnQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95YnV0dG9uZXZlbnQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95YnV0dG9uZXZlbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQ5YzFlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lidXR0b25ldmVudC5odG1sCkBAIC0wLDAgKzEsMzUxIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0pveUJ1dHRvbkV2ZW50PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBFdmVudCBTdHJ1Y3R1cmVzLiIKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfSm95QXhpc0V2ZW50IgorSFJFRj0ic2Rsam95YXhpc2V2ZW50Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveUhhdEV2ZW50IgorSFJFRj0ic2Rsam95aGF0ZXZlbnQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsam95YXhpc2V2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3loYXRldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWUJVVFRPTkVWRU5UIgorPjwvQQorPlNETF9Kb3lCdXR0b25FdmVudDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONDI1OCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Kb3lCdXR0b25FdmVudCZuYnNwOy0tJm5ic3A7Sm95c3RpY2sgYnV0dG9uIGV2ZW50IHN0cnVjdHVyZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MjYxIgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEZWZpbml0aW9uPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz50eXBlZGVmIHN0cnVjdHsKKyAgVWludDggdHlwZTsKKyAgVWludDggd2hpY2g7CisgIFVpbnQ4IGJ1dHRvbjsKKyAgVWludDggc3RhdGU7Cit9IFNETF9Kb3lCdXR0b25FdmVudDs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MjY0IgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEYXRhPC9IMgorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU40MjY2IgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjAiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUQk9EWQorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9KT1lCVVRUT05ET1dOPC9UVAorPiBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9KT1lCVVRUT05VUDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPndoaWNoPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Sm95c3RpY2sgZGV2aWNlIGluZGV4PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5idXR0b248L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Kb3lzdGljayBidXR0b24gaW5kZXg8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnN0YXRlPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUFJFU1NFRDwvVFQKKz4gb3IgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUkVMRUFTRUQ8L1RUCis+PC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDI4OSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfSm95QnV0dG9uRXZlbnQ8L1NQQU4KKz4gaXMgYSBtZW1iZXIgb2YgdGhlIDxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4gdW5pb24gYW5kIGlzIHVzZWQgd2hlbiBhbiBldmVudCBvZiB0eXBlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0pPWUJVVFRPTkRPV048L1RUCis+IG9yIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0pPWUJVVFRPTlVQPC9UVAorPiBpcyByZXBvcnRlZC48L1AKKz48UAorPkEgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSk9ZQlVUVE9ORE9XTjwvVFQKKz4gb3IgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSk9ZQlVUVE9OVVA8L1RUCis+IGV2ZW50IG9jY3VycyB3aGVuIGV2ZXIgYSB1c2VyIHByZXNzZXMgb3IgcmVsZWFzZXMgYSBidXR0b24gb24gYSBqb3lzdGljay4gVGhlIGZpZWxkIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+d2hpY2g8L0kKKz48L1RUCis+IGlzIHRoZSBpbmRleCBvZiB0aGUgam95c3RpY2sgdGhhdCByZXBvcnRlZCB0aGUgZXZlbnQgYW5kIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+YnV0dG9uPC9JCis+PC9UVAorPiBpcyB0aGUgaW5kZXggb2YgdGhlIGJ1dHRvbiAoZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYWluYXRpb24gc2VlIHRoZSA8QQorSFJFRj0iam95c3RpY2suaHRtbCIKKz5Kb3lzdGljayBzZWN0aW9uPC9BCis+KS4gPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zdGF0ZTwvSQorPjwvVFQKKz4gaXMgdGhlIGN1cnJlbnQgc3RhdGUgb3IgdGhlIGJ1dHRvbiB3aGljaCBpcyBlaXRoZXIgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUFJFU1NFRDwvVFQKKz4gb3IgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUkVMRUFTRUQ8L1RUCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MzA2IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJqb3lzdGljay5odG1sIgorPkpveXN0aWNrIEZ1bmN0aW9uczwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja2V2ZW50c3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tFdmVudFN0YXRlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja2dldGJ1dHRvbi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja0dldEJ1dHRvbjwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveWF4aXNldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveWhhdGV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfSm95QXhpc0V2ZW50PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveUhhdEV2ZW50PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveWhhdGV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveWhhdGV2ZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxMTViZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95aGF0ZXZlbnQuaHRtbApAQCAtMCwwICsxLDQxMyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Kb3lIYXRFdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0pveUJ1dHRvbkV2ZW50IgorSFJFRj0ic2Rsam95YnV0dG9uZXZlbnQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfSm95QmFsbEV2ZW50IgorSFJFRj0ic2Rsam95YmFsbGV2ZW50Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveWJ1dHRvbmV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3liYWxsZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExKT1lIQVRFVkVOVCIKKz48L0EKKz5TRExfSm95SGF0RXZlbnQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjQzMjAiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfSm95SGF0RXZlbnQmbmJzcDstLSZuYnNwO0pveXN0aWNrIGhhdCBwb3NpdGlvbiBjaGFuZ2UgZXZlbnQgc3RydWN0dXJlPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQzMjMiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBVaW50OCB0eXBlOworICBVaW50OCB3aGljaDsKKyAgVWludDggaGF0OworICBVaW50OCB2YWx1ZTsKK30gU0RMX0pveUhhdEV2ZW50OzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQzMjYiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjQzMjgiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0pPWTwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPndoaWNoPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Sm95c3RpY2sgZGV2aWNlIGluZGV4PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5oYXQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Kb3lzdGljayBoYXQgaW5kZXg8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnZhbHVlPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+SGF0IHBvc2l0aW9uPC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDM0OCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfSm95SGF0RXZlbnQ8L1NQQU4KKz4gaXMgYSBtZW1iZXIgb2YgdGhlIDxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4gdW5pb24gYW5kIGlzIHVzZWQgd2hlbiBhbiBldmVudCBvZiB0eXBlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0pPWUhBVE1PVElPTjwvVFQKKz4gaXMgcmVwb3J0ZWQuPC9QCis+PFAKKz5BIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0pPWUhBVE1PVElPTjwvVFQKKz4gZXZlbnQgb2NjdXJzIHdoZW4gZXZlciBhIHVzZXIgbW92ZXMgYSBoYXQgb24gdGhlIGpveXN0aWNrLiBUaGUgZmllbGQgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz53aGljaDwvSQorPjwvVFQKKz4gaXMgdGhlIGluZGV4IG9mIHRoZSBqb3lzdGljayB0aGF0IHJlcG9ydGVkIHRoZSBldmVudCBhbmQgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5oYXQ8L0kKKz48L1RUCis+IGlzIHRoZSBpbmRleCBvZiB0aGUgaGF0IChmb3IgYSBtb3JlIGRldGFpbGVkIGV4bGFpbmF0aW9uIHNlZSB0aGUgPEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCis+Sm95c3RpY2sgc2VjdGlvbjwvQQorPikuIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dmFsdWU8L0kKKz48L1RUCis+IGlzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBoYXQuIEl0IGlzIGEgbG9naWNhbGx5IE9SJ2QgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgKHdob3NlIG1lYW5pbmdzIHNob3VsZCBiZSBwcmV0dHkgb2J2aW91czopIDo8L1AKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorPjxUQk9EWQorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9DRU5URVJFRDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9VUDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9SSUdIVDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9ET1dOPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSEFUX0xFRlQ8L1RUCis+PC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PFAKKz5UaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGFsc28gcHJvdmlkZWQ6PC9QCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKKz48VEJPRFkKKz48VFIKKz48VEQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IQVRfUklHSFRVUDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9SSUdIVERPV048L1RUCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IQVRfTEVGVFVQPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSEFUX0xFRlRET1dOPC9UVAorPjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MzgyIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJqb3lzdGljay5odG1sIgorPkpveXN0aWNrIEZ1bmN0aW9uczwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja2V2ZW50c3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tFdmVudFN0YXRlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja2dldGJhbGwuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tHZXRIYXQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lidXR0b25ldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveWJhbGxldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveUJ1dHRvbkV2ZW50PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveUJhbGxFdmVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja2Nsb3NlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrY2xvc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmI0NGUwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja2Nsb3NlLmh0bWwKQEAgLTAsMCArMSwyMjMgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfSm95c3RpY2tDbG9zZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJKb3lzdGljayIKK0hSRUY9ImpveXN0aWNrLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Kb3lzdGlja0dldEJhbGwiCitIUkVGPSJzZGxqb3lzdGlja2dldGJhbGwuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJBdWRpbyIKK0hSRUY9ImF1ZGlvLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YmFsbC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iYXVkaW8uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExKT1lTVElDS0NMT1NFIgorPjwvQQorPlNETF9Kb3lzdGlja0Nsb3NlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42NDY5IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0pveXN0aWNrQ2xvc2UmbmJzcDstLSZuYnNwO0Nsb3NlcyBhIHByZXZpb3VzbHkgb3BlbmVkIGpveXN0aWNrPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjY0NzIiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONjQ3MyIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfSm95c3RpY2tDbG9zZTwvQgorPjwvQ09ERQorPihTRExfSm95c3RpY2sgKmpveXN0aWNrKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY0NzkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5DbG9zZSBhIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmpveXN0aWNrPC9JCis+PC9UVAorPiB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIDxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tPcGVuPC9UVAorPjwvQQorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjQ4NSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tPcGVuPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja29wZW5lZC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja09wZW5lZDwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YmFsbC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tHZXRCYWxsPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iam95c3RpY2suaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5BdWRpbzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja2V2ZW50c3RhdGUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95c3RpY2tldmVudHN0YXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiMTQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95c3RpY2tldmVudHN0YXRlLmh0bWwKQEAgLTAsMCArMSwyOTAgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfSm95c3RpY2tFdmVudFN0YXRlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkV2ZW50IEZ1bmN0aW9ucy4iCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR2V0QXBwU3RhdGUiCitIUkVGPSJzZGxnZXRhcHBzdGF0ZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IkpveXN0aWNrIgorSFJFRj0iam95c3RpY2suaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0YXBwc3RhdGUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMSk9ZU1RJQ0tFVkVOVFNUQVRFIgorPjwvQQorPlNETF9Kb3lzdGlja0V2ZW50U3RhdGU8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjU5NjkiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfSm95c3RpY2tFdmVudFN0YXRlJm5ic3A7LS0mbmJzcDtFbmFibGUvZGlzYWJsZSBqb3lzdGljayBldmVudCBwb2xsaW5nPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU5NzIiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTk3MyIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Kb3lzdGlja0V2ZW50U3RhdGU8L0IKKz48L0NPREUKKz4oaW50IHN0YXRlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU5NzkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgam95c3RpY2sgZXZlbnQgcHJvY2Vzc2luZy4gV2l0aCBqb3lzdGljayBldmVudCBwcm9jZXNzaW5nIGRpc2FibGVkIHlvdSB3aWxsIGhhdmUgdG8gdXBkYXRlIGpveXN0aWNrIHN0YXRlcyB3aXRoIDxBCitIUkVGPSJzZGxqb3lzdGlja3VwZGF0ZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja1VwZGF0ZTwvVFQKKz48L0EKKz4gYW5kIHJlYWQgdGhlIGpveXN0aWNrIGluZm9ybWF0aW9uIG1hbnVhbGx5LiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zdGF0ZTwvSQorPjwvVFQKKz4gaXMgZWl0aGVyIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1FVRVJZPC9UVAorPiwgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRU5BQkxFPC9UVAorPiBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9JR05PUkU8L1RUCis+LjwvUAorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+Sm95c3RpY2sgZXZlbnQgaGFuZGxpbmcgaXMgcHJlZmVyZWQ8L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41OTkwIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnN0YXRlPC9JCis+PC9UVAorPiBpcyA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9RVUVSWTwvVFQKKz4gdGhlbiB0aGUgY3VycmVudCBzdGF0ZSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSBuZXcgcHJvY2Vzc2luZyA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zdGF0ZTwvSQorPjwvVFQKKz4gaXMgcmV0dXJuZWQuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU5OTYiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0iam95c3RpY2suaHRtbCIKKz5TREwgSm95c3RpY2sgRnVuY3Rpb25zPC9BCis+LAorPEEKK0hSRUY9InNkbGpveXN0aWNrdXBkYXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrVXBkYXRlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lheGlzZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveUF4aXNFdmVudDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3liYWxsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveUJhbGxFdmVudDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lidXR0b25ldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfSm95QnV0dG9uRXZlbnQ8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsam95aGF0ZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveUhhdEV2ZW50PC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXRhcHBzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfR2V0QXBwU3RhdGU8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPkpveXN0aWNrPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrZ2V0YXhpcy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja2dldGF4aXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGExN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja2dldGF4aXMuaHRtbApAQCAtMCwwICsxLDI3MSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Kb3lzdGlja0dldEF4aXM8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iSm95c3RpY2siCitIUkVGPSJqb3lzdGljay5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfSm95c3RpY2tVcGRhdGUiCitIUkVGPSJzZGxqb3lzdGlja3VwZGF0ZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Kb3lzdGlja0dldEhhdCIKK0hSRUY9InNkbGpveXN0aWNrZ2V0aGF0Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveXN0aWNrdXBkYXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja2dldGhhdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWVNUSUNLR0VUQVhJUyIKKz48L0EKKz5TRExfSm95c3RpY2tHZXRBeGlzPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42MzIwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0pveXN0aWNrR2V0QXhpcyZuYnNwOy0tJm5ic3A7R2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIGF4aXM8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONjMyMyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU42MzI0IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5TaW50MTYgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0pveXN0aWNrR2V0QXhpczwvQgorPjwvQ09ERQorPihTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYXhpcyk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MzMwIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrR2V0QXhpczwvVFQKKz4gcmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+YXhpczwvSQorPjwvVFQKKz4gb24gdGhlIGdpdmVuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmpveXN0aWNrPC9JCis+PC9UVAorPi48L1AKKz48UAorPk9uIG1vc3QgbW9kZXJuIGpveXN0aWNrcyB0aGUgWCBheGlzIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+YXhpczwvSQorPjwvVFQKKz4gMCBhbmQgdGhlIFkgYXhpcyBieSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5heGlzPC9JCis+PC9UVAorPiAxLiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrR2V0QXhpczwvVFQKKz4gaXMgYSBzaWduZWQgaW50ZWdlciAoLTMyNzY4IHRvIDMyNzY4KSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmF4aXM8L0kKKz48L1RUCis+LCBpdCBtYXliZSBuZWNlc3NhcnkgdG8gaW1wb3NlIGNlcnRhaW4gdG9sZXJhbmNlcyBvbiB0aGVzZSB2YWx1ZXMgdG8gYWNjb3VudCBmb3Igaml0dGVyLiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBzb21lIGpveXN0aWNrcyB1c2UgYXhlcyAyIGFuZCAzIGZvciBleHRyYSBidXR0b25zLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MzQxIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgYSAxNi1iaXQgc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5heGlzPC9JCis+PC9UVAorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjM0NSIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TaW50MTYgeF9tb3ZlLCB5X21vdmU7CitTRExfSm95c3RpY2sgKmpveTE7CisuCisuCit4X21vdmU9U0RMX0pveXN0aWNrR2V0QXhpcyhqb3kxLCAwKTsKK3lfbW92ZT1TRExfSm95c3RpY2tHZXRBeGlzKGpveTEsIDEpOzwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjYzNDkiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1heGVzLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrTnVtQXhlczwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrdXBkYXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tnZXRoYXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja1VwZGF0ZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveXN0aWNrR2V0SGF0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrZ2V0YmFsbC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja2dldGJhbGwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGEyNTJhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja2dldGJhbGwuaHRtbApAQCAtMCwwICsxLDI2MiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Kb3lzdGlja0dldEJhbGw8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iSm95c3RpY2siCitIUkVGPSJqb3lzdGljay5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfSm95c3RpY2tHZXRCdXR0b24iCitIUkVGPSJzZGxqb3lzdGlja2dldGJ1dHRvbi5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Kb3lzdGlja0Nsb3NlIgorSFJFRj0ic2Rsam95c3RpY2tjbG9zZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja2dldGJ1dHRvbi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tjbG9zZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWVNUSUNLR0VUQkFMTCIKKz48L0EKKz5TRExfSm95c3RpY2tHZXRCYWxsPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42NDMzIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0pveXN0aWNrR2V0QmFsbCZuYnNwOy0tJm5ic3A7R2V0IHJlbGF0aXZlIHRyYWNrYmFsbCBtb3Rpb248L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONjQzNiIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU42NDM3IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0pveXN0aWNrR2V0QmFsbDwvQgorPjwvQ09ERQorPihTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYmFsbCwgaW50ICpkeCwgaW50ICpkeSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42NDQzIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+R2V0IHRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5iYWxsPC9JCis+PC9UVAorPiBheGlzIGNoYW5nZS48L1AKKz48UAorPlRyYWNrYmFsbHMgY2FuIG9ubHkgcmV0dXJuIHJlbGF0aXZlIG1vdGlvbiBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja0dldEJhbGw8L1RUCis+LCB0aGVzZSBtb3Rpb24gZGVsdGFzIGEgcGxhY2VkIGludG8gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZHg8L0kKKz48L1RUCis+IGFuZCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5keTwvSQorPjwvVFQKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY0NTEiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gb24gc3VjY2VzcyBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IG9uIGZhaWx1cmU8L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjQ1NiIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5pbnQgZGVsdGFfeCwgZGVsdGFfeTsKK1NETF9Kb3lzdGljayAqam95OworLgorLgorLgorU0RMX0pveXN0aWNrVXBkYXRlKCk7CitpZihTRExfSm95c3RpY2tHZXRCYWxsKGpveSwgMCwgJiMzODtkZWx0YV94LCAmIzM4O2RlbHRhX3kpPT0tMSkKKyAgcHJpbnRmKCJUcmFja0JhbGwgUmVhZCBFcnJvciFcbiIpOworcHJpbnRmKCJUcmFja2JhbGwgRGVsdGEtIFg6JWQsIFk6JWRcbiIsIGRlbHRhX3gsIGRlbHRhX3kpOzwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY0NjAiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1iYWxscy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja051bUJhbGxzPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tnZXRidXR0b24uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja2Nsb3NlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tHZXRCdXR0b248L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJqb3lzdGljay5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja0Nsb3NlPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrZ2V0YnV0dG9uLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrZ2V0YnV0dG9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwZTM1NgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95c3RpY2tnZXRidXR0b24uaHRtbApAQCAtMCwwICsxLDIzMSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Kb3lzdGlja0dldEJ1dHRvbjwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJKb3lzdGljayIKK0hSRUY9ImpveXN0aWNrLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Kb3lzdGlja0dldEhhdCIKK0hSRUY9InNkbGpveXN0aWNrZ2V0aGF0Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrR2V0QmFsbCIKK0hSRUY9InNkbGpveXN0aWNrZ2V0YmFsbC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja2dldGhhdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tnZXRiYWxsLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMSk9ZU1RJQ0tHRVRCVVRUT04iCis+PC9BCis+U0RMX0pveXN0aWNrR2V0QnV0dG9uPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42NDA0IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0pveXN0aWNrR2V0QnV0dG9uJm5ic3A7LS0mbmJzcDtHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBnaXZlbiBidXR0b24gb24gYSBnaXZlbiBqb3lzdGljazwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU42NDA3IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjY0MDgiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlVpbnQ4IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Kb3lzdGlja0dldEJ1dHRvbjwvQgorPjwvQ09ERQorPihTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYnV0dG9uKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY0MTQiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5TRExfSm95c3RpY2tHZXRCdXR0b24gcmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+YnV0dG9uPC9JCis+PC9UVAorPiBvbiB0aGUgZ2l2ZW4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+am95c3RpY2s8L0kKKz48L1RUCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42NDE5IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPjxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MTwvU1BBTgorPiBpZiB0aGUgYnV0dG9uIGlzIHByZXNzZWQuIE90aGVyd2lzZSwgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42NDI0IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGpveXN0aWNrbnVtYnV0dG9ucy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja051bUJ1dHRvbnM8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja2dldGhhdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YmFsbC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveXN0aWNrR2V0SGF0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iam95c3RpY2suaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tHZXRCYWxsPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrZ2V0aGF0Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrZ2V0aGF0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzOGFiYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95c3RpY2tnZXRoYXQuaHRtbApAQCAtMCwwICsxLDI5NyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Kb3lzdGlja0dldEhhdDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJKb3lzdGljayIKK0hSRUY9ImpveXN0aWNrLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Kb3lzdGlja0dldEF4aXMiCitIUkVGPSJzZGxqb3lzdGlja2dldGF4aXMuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfSm95c3RpY2tHZXRCdXR0b24iCitIUkVGPSJzZGxqb3lzdGlja2dldGJ1dHRvbi5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja2dldGF4aXMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YnV0dG9uLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMSk9ZU1RJQ0tHRVRIQVQiCis+PC9BCis+U0RMX0pveXN0aWNrR2V0SGF0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42MzU4IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0pveXN0aWNrR2V0SGF0Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBqb3lzdGljayBoYXQ8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONjM2MSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU42MzYyIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5VaW50OCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfSm95c3RpY2tHZXRIYXQ8L0IKKz48L0NPREUKKz4oU0RMX0pveXN0aWNrICpqb3lzdGljaywgaW50IGhhdCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MzY4IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+U0RMX0pveXN0aWNrR2V0SGF0IHJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGdpdmVuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmhhdDwvSQorPjwvVFQKKz4gb24gdGhlIGdpdmVuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmpveXN0aWNrPC9JCis+PC9UVAorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjM3MyIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5UaGUgY3VycmVudCBzdGF0ZSBpcyByZXR1cm5lZCBhcyBhIFVpbnQ4IHdoaWNoIGlzIGRlZmluZWQgYXMgYW4gT1InZCBjb21iaW5hdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nPC9QCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKKz48VEJPRFkKKz48VFIKKz48VEQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IQVRfQ0VOVEVSRUQ8L1RUCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IQVRfVVA8L1RUCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IQVRfUklHSFQ8L1RUCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IQVRfRE9XTjwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9MRUZUPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSEFUX1JJR0hUVVA8L1RUCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IQVRfUklHSFRET1dOPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSEFUX0xFRlRVUDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hBVF9MRUZURE9XTjwvVFQKKz48L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjM5NSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWhhdHMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tOdW1IYXRzPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tnZXRheGlzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tnZXRidXR0b24uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja0dldEF4aXM8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJqb3lzdGljay5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja0dldEJ1dHRvbjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja2luZGV4Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNraW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjhhNzVhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyMTggQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfSm95c3RpY2tJbmRleDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJKb3lzdGljayIKK0hSRUY9ImpveXN0aWNrLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Kb3lzdGlja09wZW5lZCIKK0hSRUY9InNkbGpveXN0aWNrb3BlbmVkLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrTnVtQXhlcyIKK0hSRUY9InNkbGpveXN0aWNrbnVtYXhlcy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja29wZW5lZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1heGVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMSk9ZU1RJQ0tJTkRFWCIKKz48L0EKKz5TRExfSm95c3RpY2tJbmRleDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONjE1OCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Kb3lzdGlja0luZGV4Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIGluZGV4IG9mIGFuIFNETF9Kb3lzdGljay48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONjE2MSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU42MTYyIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0pveXN0aWNrSW5kZXg8L0IKKz48L0NPREUKKz4oU0RMX0pveXN0aWNrICpqb3lzdGljayk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MTY4IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UmV0dXJucyB0aGUgaW5kZXggb2YgYSBnaXZlbiA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveXN0aWNrPC9TUEFOCis+IHN0cnVjdHVyZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjE3MiIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5JbmRleCBudW1iZXIgb2YgdGhlIGpveXN0aWNrLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MTc1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGpveXN0aWNrb3Blbi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja09wZW48L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja29wZW5lZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrbnVtYXhlcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveXN0aWNrT3BlbmVkPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iam95c3RpY2suaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tOdW1BeGVzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrbmFtZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja25hbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWRkODE3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja25hbWUuaHRtbApAQCAtMCwwICsxLDIzOCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Kb3lzdGlja05hbWU8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iSm95c3RpY2siCitIUkVGPSJqb3lzdGljay5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfTnVtSm95c3RpY2tzIgorSFJFRj0ic2RsbnVtam95c3RpY2tzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrT3BlbiIKK0hSRUY9InNkbGpveXN0aWNrb3Blbi5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxudW1qb3lzdGlja3MuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveXN0aWNrb3Blbi5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWVNUSUNLTkFNRSIKKz48L0EKKz5TRExfSm95c3RpY2tOYW1lPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42MDY2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0pveXN0aWNrTmFtZSZuYnNwOy0tJm5ic3A7R2V0IGpveXN0aWNrIG5hbWUuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjYwNjkiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONjA3MCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+Y29uc3QgY2hhciAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0pveXN0aWNrTmFtZTwvQgorPjwvQ09ERQorPihpbnQgaW5kZXgpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjA3NiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkdldCB0aGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IG5hbWUgb2Ygam95c3RpY2suIFRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5pbmRleDwvSQorPjwvVFQKKz4gcGFyYW1ldGVyIHJlZmVycyB0byB0aGUgTid0aCBqb3lzdGljayBvbiB0aGUgc3lzdGVtLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MDgwIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgYSBjaGFyIHBvaW50ZXIgdG8gdGhlIGpveXN0aWNrIG5hbWUuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjYwODMiCis+PC9BCis+PEgyCis+RXhhbXBsZXM8L0gyCis+PFAKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+LyogUHJpbnQgdGhlIG5hbWVzIG9mIGFsbCBhdHRhY2hlZCBqb3lzdGlja3MgKi8KK2ludCBudW1fam95LCBpOworbnVtX2pveT1TRExfTnVtSm95c3RpY2tzKCk7CitwcmludGYoIiVkIGpveXN0aWNrcyBmb3VuZFxuIiwgbnVtX2pveSk7Citmb3IoaT0wO2kmIzYwO251bV9qb3k7aSsrKQorICBwcmludGYoIiVzXG4iLCBTRExfSm95c3RpY2tOYW1lKGkpKTs8L1BSRQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MDg3IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGpveXN0aWNrb3Blbi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja09wZW48L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxudW1qb3lzdGlja3MuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9OdW1Kb3lzdGlja3M8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJqb3lzdGljay5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja09wZW48L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95c3RpY2tudW1heGVzLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrbnVtYXhlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjY3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrbnVtYXhlcy5odG1sCkBAIC0wLDAgKzEsMjI1IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0pveXN0aWNrTnVtQXhlczwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJKb3lzdGljayIKK0hSRUY9ImpveXN0aWNrLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Kb3lzdGlja0luZGV4IgorSFJFRj0ic2Rsam95c3RpY2tpbmRleC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Kb3lzdGlja051bUJhbGxzIgorSFJFRj0ic2Rsam95c3RpY2tudW1iYWxscy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja2luZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWJhbGxzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMSk9ZU1RJQ0tOVU1BWEVTIgorPjwvQQorPlNETF9Kb3lzdGlja051bUF4ZXM8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjYxODQiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfSm95c3RpY2tOdW1BeGVzJm5ic3A7LS0mbmJzcDtHZXQgdGhlIG51bWJlciBvZiBqb3lzdGljayBheGVzPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjYxODciCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONjE4OCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Kb3lzdGlja051bUF4ZXM8L0IKKz48L0NPREUKKz4oU0RMX0pveXN0aWNrICpqb3lzdGljayk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MTk0IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UmV0dXJuIHRoZSBudW1iZXIgb2YgYXhlcyBhdmFpbGFibGUgZnJvbSBhIHByZXZpb3VzbHkgb3BlbmVkIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfSm95c3RpY2s8L1NQQU4KKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjYxOTgiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+TnVtYmVyIG9mIGF4ZXMuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjYyMDEiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsam95c3RpY2tnZXRheGlzLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrR2V0QXhpczwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsam95c3RpY2tvcGVuLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrT3BlbjwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNraW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWJhbGxzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tJbmRleDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveXN0aWNrTnVtQmFsbHM8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95c3RpY2tudW1iYWxscy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja251bWJhbGxzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4NDA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95c3RpY2tudW1iYWxscy5odG1sCkBAIC0wLDAgKzEsMjI1IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0pveXN0aWNrTnVtQmFsbHM8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iSm95c3RpY2siCitIUkVGPSJqb3lzdGljay5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfSm95c3RpY2tOdW1BeGVzIgorSFJFRj0ic2Rsam95c3RpY2tudW1heGVzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrTnVtSGF0cyIKK0hSRUY9InNkbGpveXN0aWNrbnVtaGF0cy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWF4ZXMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveXN0aWNrbnVtaGF0cy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWVNUSUNLTlVNQkFMTFMiCis+PC9BCis+U0RMX0pveXN0aWNrTnVtQmFsbHM8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjYyMTIiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfSm95c3RpY2tOdW1CYWxscyZuYnNwOy0tJm5ic3A7R2V0IHRoZSBudW1iZXIgb2Ygam95c3RpY2sgdHJhY2tiYWxsczwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU42MjE1IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjYyMTYiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfSm95c3RpY2tOdW1CYWxsczwvQgorPjwvQ09ERQorPihTRExfSm95c3RpY2sgKmpveXN0aWNrKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjYyMjIiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5SZXR1cm4gdGhlIG51bWJlciBvZiB0cmFja2JhbGxzIGF2YWlsYWJsZSBmcm9tIGEgcHJldmlvdXNseSBvcGVuZWQgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Kb3lzdGljazwvU1BBTgorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjIyNiIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5OdW1iZXIgb2YgdHJhY2tiYWxscy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjIyOSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxqb3lzdGlja2dldGJhbGwuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tHZXRCYWxsPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tPcGVuPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1heGVzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1oYXRzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tOdW1BeGVzPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iam95c3RpY2suaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tOdW1IYXRzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrbnVtYnV0dG9ucy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja251bWJ1dHRvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjViODkzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja251bWJ1dHRvbnMuaHRtbApAQCAtMCwwICsxLDIyNSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Kb3lzdGlja051bUJ1dHRvbnM8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iSm95c3RpY2siCitIUkVGPSJqb3lzdGljay5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfSm95c3RpY2tOdW1IYXRzIgorSFJFRj0ic2Rsam95c3RpY2tudW1oYXRzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrVXBkYXRlIgorSFJFRj0ic2Rsam95c3RpY2t1cGRhdGUuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1oYXRzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja3VwZGF0ZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWVNUSUNLTlVNQlVUVE9OUyIKKz48L0EKKz5TRExfSm95c3RpY2tOdW1CdXR0b25zPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42MjY4IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0pveXN0aWNrTnVtQnV0dG9ucyZuYnNwOy0tJm5ic3A7R2V0IHRoZSBudW1iZXIgb2Ygam95c2l0Y2sgYnV0dG9uczwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU42MjcxIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjYyNzIiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfSm95c3RpY2tOdW1CdXR0b25zPC9CCis+PC9DT0RFCis+KFNETF9Kb3lzdGljayAqam95c3RpY2spOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjI3OCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlJldHVybiB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMgYXZhaWxhYmxlIGZyb20gYSBwcmV2aW91c2x5IG9wZW5lZCA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0pveXN0aWNrPC9TUEFOCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MjgyIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPk51bWJlciBvZiBidXR0b25zLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42Mjg1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YnV0dG9uLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrR2V0QnV0dG9uPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tPcGVuPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tudW1oYXRzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2t1cGRhdGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja051bUhhdHM8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJqb3lzdGljay5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja1VwZGF0ZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja251bWhhdHMuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95c3RpY2tudW1oYXRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1MzIzNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsam95c3RpY2tudW1oYXRzLmh0bWwKQEAgLTAsMCArMSwyMjUgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfSm95c3RpY2tOdW1IYXRzPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkpveXN0aWNrIgorSFJFRj0iam95c3RpY2suaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0pveXN0aWNrTnVtQmFsbHMiCitIUkVGPSJzZGxqb3lzdGlja251bWJhbGxzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrTnVtQnV0dG9ucyIKK0hSRUY9InNkbGpveXN0aWNrbnVtYnV0dG9ucy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWJhbGxzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWJ1dHRvbnMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExKT1lTVElDS05VTUhBVFMiCis+PC9BCis+U0RMX0pveXN0aWNrTnVtSGF0czwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONjI0MCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Kb3lzdGlja051bUhhdHMmbmJzcDstLSZuYnNwO0dldCB0aGUgbnVtYmVyIG9mIGpveXN0aWNrIGhhdHM8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONjI0MyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU42MjQ0IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0pveXN0aWNrTnVtSGF0czwvQgorPjwvQ09ERQorPihTRExfSm95c3RpY2sgKmpveXN0aWNrKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjYyNTAiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5SZXR1cm4gdGhlIG51bWJlciBvZiBoYXRzIGF2YWlsYWJsZSBmcm9tIGEgcHJldmlvdXNseSBvcGVuZWQgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Kb3lzdGljazwvU1BBTgorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjI1NCIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5OdW1iZXIgb2YgaGF0cy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjI1NyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxqb3lzdGlja2dldGhhdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja0dldEhhdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsam95c3RpY2tvcGVuLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrT3BlbjwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrbnVtYmFsbHMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWJ1dHRvbnMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja051bUJhbGxzPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iam95c3RpY2suaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tOdW1CdXR0b25zPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrb3Blbi5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja29wZW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjA4YzQzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja29wZW4uaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Kb3lzdGlja09wZW48L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iSm95c3RpY2siCitIUkVGPSJqb3lzdGljay5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfSm95c3RpY2tOYW1lIgorSFJFRj0ic2Rsam95c3RpY2tuYW1lLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrT3BlbmVkIgorSFJFRj0ic2Rsam95c3RpY2tvcGVuZWQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tuYW1lLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja29wZW5lZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWVNUSUNLT1BFTiIKKz48L0EKKz5TRExfSm95c3RpY2tPcGVuPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42MDk2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0pveXN0aWNrT3BlbiZuYnNwOy0tJm5ic3A7T3BlbnMgYSBqb3lzdGljayBmb3IgdXNlLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU42MDk5IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjYxMDAiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9Kb3lzdGljayAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0pveXN0aWNrT3BlbjwvQgorPjwvQ09ERQorPihpbnQgaW5kZXgpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjEwNiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPk9wZW5zIGEgam95c3RpY2sgZm9yIHVzZSB3aXRoaW4gU0RMLiBUaGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+aW5kZXg8L0kKKz48L1RUCis+IHJlZmVycyB0byB0aGUgTid0aCBqb3lzdGljayBpbiB0aGUgc3lzdGVtLiBBIGpveXN0aWNrIG11c3QgYmUgb3BlbmVkIGJlZm9yZSBpdCBnYW1lIGJlIHVzZWQuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjYxMTAiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyBhIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfSm95c3RpY2s8L1NQQU4KKz4gc3RydWN0dXJlIG9uIHN1Y2Nlc3MuIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+TlVMTDwvU1BBTgorPiBvbiBmYWlsdXJlLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MTE1IgorPjwvQQorPjxIMgorPkV4YW1wbGVzPC9IMgorPjxQCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPlNETF9Kb3lzdGljayAqam95OworLy8gQ2hlY2sgZm9yIGpveXN0aWNrCitpZihTRExfTnVtSm95c3RpY2tzKCkmIzYyOzApeworICAvLyBPcGVuIGpveXN0aWNrCisgIGpveT1TRExfSm95c3RpY2tPcGVuKDApOworICAKKyAgaWYoam95KQorICB7CisgICAgcHJpbnRmKCJPcGVuZWQgSm95c3RpY2sgMFxuIik7CisgICAgcHJpbnRmKCJOYW1lOiAlc1xuIiwgU0RMX0pveXN0aWNrTmFtZSgwKSk7CisgICAgcHJpbnRmKCJOdW1iZXIgb2YgQXhlczogJWRcbiIsIFNETF9Kb3lzdGlja051bUF4ZXMoam95KSk7CisgICAgcHJpbnRmKCJOdW1iZXIgb2YgQnV0dG9uczogJWRcbiIsIFNETF9Kb3lzdGlja051bUJ1dHRvbnMoam95KSk7CisgICAgcHJpbnRmKCJOdW1iZXIgb2YgQmFsbHM6ICVkXG4iLCBTRExfSm95c3RpY2tOdW1CYWxscyhqb3kpKTsKKyAgfQorICBlbHNlCisgICAgcHJpbnRmKCJDb3VsZG4ndCBvcGVuIEpveXN0aWNrIDBcbiIpOworICAKKyAgLy8gQ2xvc2UgaWYgb3BlbmVkCisgIGlmKFNETF9Kb3lzdGlja09wZW5lZCgwKSkKKyAgICBTRExfSm95c3RpY2tDbG9zZShqb3kpOworfTwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjYxMTkiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsam95c3RpY2tjbG9zZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Kb3lzdGlja0Nsb3NlPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tuYW1lLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tvcGVuZWQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja05hbWU8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJqb3lzdGljay5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Kb3lzdGlja09wZW5lZDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja29wZW5lZC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja29wZW5lZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzVhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrb3BlbmVkLmh0bWwKQEAgLTAsMCArMSwyMzMgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfSm95c3RpY2tPcGVuZWQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iSm95c3RpY2siCitIUkVGPSJqb3lzdGljay5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfSm95c3RpY2tPcGVuIgorSFJFRj0ic2Rsam95c3RpY2tvcGVuLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrSW5kZXgiCitIUkVGPSJzZGxqb3lzdGlja2luZGV4Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveXN0aWNrb3Blbi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tpbmRleC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWVNUSUNLT1BFTkVEIgorPjwvQQorPlNETF9Kb3lzdGlja09wZW5lZDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONjEyOCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Kb3lzdGlja09wZW5lZCZuYnNwOy0tJm5ic3A7RGV0ZXJtaW5lIGlmIGEgam95c3RpY2sgaGFzIGJlZW4gb3BlbmVkPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjYxMzEiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONjEzMiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Kb3lzdGlja09wZW5lZDwvQgorPjwvQ09ERQorPihpbnQgaW5kZXgpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjEzOCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkRldGVybWluZXMgd2hldGhlciBhIGpveXN0aWNrIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmluZGV4PC9JCis+PC9UVAorPiByZWZlcnMgdG8gdGhlIE4ndGggam95c3RpY2sgb24gdGhlIHN5c3RlbS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjE0MiIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5SZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MTwvU1BBTgorPiBpZiB0aGUgam95c3RpY2sgaGFzIGJlZW4gb3BlbmVkLCBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gaWYgaXQgaGFzIG5vdC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjE0NyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tPcGVuPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja2Nsb3NlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrQ2xvc2U8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja2luZGV4Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tPcGVuPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iam95c3RpY2suaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tJbmRleDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja3VwZGF0ZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxqb3lzdGlja3VwZGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjM3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGpveXN0aWNrdXBkYXRlLmh0bWwKQEAgLTAsMCArMSwyMTEgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfSm95c3RpY2tVcGRhdGU8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iSm95c3RpY2siCitIUkVGPSJqb3lzdGljay5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfSm95c3RpY2tOdW1CdXR0b25zIgorSFJFRj0ic2Rsam95c3RpY2tudW1idXR0b25zLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrR2V0QXhpcyIKK0hSRUY9InNkbGpveXN0aWNrZ2V0YXhpcy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja251bWJ1dHRvbnMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YXhpcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEpPWVNUSUNLVVBEQVRFIgorPjwvQQorPlNETF9Kb3lzdGlja1VwZGF0ZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONjI5NiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Kb3lzdGlja1VwZGF0ZSZuYnNwOy0tJm5ic3A7VXBkYXRlcyB0aGUgc3RhdGUgb2YgYWxsIGpveXN0aWNrczwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU42Mjk5IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjYzMDAiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0pveXN0aWNrVXBkYXRlPC9CCis+PC9DT0RFCis+KHZvaWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjMwNiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlVwZGF0ZXMgdGhlIHN0YXRlKHBvc2l0aW9uLCBidXR0b25zLCBldGMuKSBvZiBhbGwgb3BlbiBqb3lzdGlja3MuIElmIGpveXN0aWNrIGV2ZW50cyBoYXZlIGJlZW4gZW5hYmxlZCB3aXRoIDxBCitIUkVGPSJzZGxqb3lzdGlja2V2ZW50c3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tFdmVudFN0YXRlPC9UVAorPjwvQQorPiB0aGVuIHRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgaW4gdGhlIGV2ZW50IGxvb3AuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjYzMTEiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsam95c3RpY2tldmVudHN0YXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0pveXN0aWNrRXZlbnRTdGF0ZTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrbnVtYnV0dG9ucy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGpveXN0aWNrZ2V0YXhpcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveXN0aWNrTnVtQnV0dG9uczwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImpveXN0aWNrLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveXN0aWNrR2V0QXhpczwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxrZXkuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsa2V5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5MTg4NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsa2V5Lmh0bWwKQEAgLTAsMCArMSwyNjMwIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMS2V5PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBFdmVudCBTdHJ1Y3R1cmVzLiIKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfa2V5c3ltIgorSFJFRj0ic2Rsa2V5c3ltLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iRXZlbnQgRnVuY3Rpb25zLiIKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGtleXN5bS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExLRVkiCis+PC9BCis+U0RMS2V5PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU40NzE0IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMS2V5Jm5ic3A7LS0mbmJzcDtLZXlzeW0gZGVmaW5pdGlvbnMuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ3MTciCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz4mIzEzOzxESVYKK0NMQVNTPSJUQUJMRSIKKz48QQorTkFNRT0iQUVONDcyMCIKKz48L0EKKz48UAorPjxCCis+VGFibGUgOC0xLiBTREwgS2V5c3ltIGRlZmluaXRpb25zPC9CCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjEiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUSEVBRAorPjxUUgorPjxUSAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS2V5PC9USAorPjxUSAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QVNDSUkgdmFsdWU8L1RICis+PFRICitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Db21tb24gbmFtZTwvVEgKKz48L1RSCis+PC9USEVBRAorPjxUQk9EWQorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19CQUNLU1BBQ0U8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nXGInPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+YmFja3NwYWNlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfVEFCPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J1x0JzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnRhYjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0NMRUFSPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Y2xlYXI8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19SRVRVUk48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nXHInPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+cmV0dXJuPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfUEFVU0U8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5wYXVzZTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0VTQ0FQRTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPideWyc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5lc2NhcGU8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19TUEFDRTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPicgJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnNwYWNlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfRVhDTEFJTTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPichJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmV4Y2xhaW08L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19RVU9URURCTDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiciJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnF1b3RlZGJsPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfSEFTSDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPicjJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmhhc2g8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19ET0xMQVI8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nJCc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5kb2xsYXI8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19BTVBFUlNBTkQ8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nJiMzODsnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+YW1wZXJzYW5kPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfUVVPVEU8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nJyc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5xdW90ZTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0xFRlRQQVJFTjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPicoJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmxlZnQgcGFyZW50aGVzaXM8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19SSUdIVFBBUkVOPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JyknPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+cmlnaHQgcGFyZW50aGVzaXM8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19BU1RFUklTSzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPicqJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmFzdGVyaXNrPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfUExVUzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPicrJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnBsdXMgc2lnbjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0NPTU1BPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JywnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Y29tbWE8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19NSU5VUzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPictJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPm1pbnVzIHNpZ248L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19QRVJJT0Q8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nLic8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5wZXJpb2Q8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19TTEFTSDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPicvJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmZvcndhcmQgc2xhc2g8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS18wPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JzAnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+MDwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLXzE8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nMSc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4xPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfMjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPicyJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjI8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS18zPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JzMnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+MzwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLXzQ8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nNCc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz40PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfNTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPic1JzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjU8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS182PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JzYnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+NjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLXzc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nNyc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz43PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfODwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPic4JzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjg8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS185PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JzknPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+OTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0NPTE9OPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JzonPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Y29sb248L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19TRU1JQ09MT048L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nOyc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5zZW1pY29sb248L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19MRVNTPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JyZsdDsnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+bGVzcy10aGFuIHNpZ248L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19FUVVBTFM8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nPSc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5lcXVhbHMgc2lnbjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0dSRUFURVI8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nJmd0Oyc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5ncmVhdGVyLXRoYW4gc2lnbjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX1FVRVNUSU9OPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jz8nPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+cXVlc3Rpb24gbWFyazwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0FUPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J0AnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+YXQ8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19MRUZUQlJBQ0tFVDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPidbJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmxlZnQgYnJhY2tldDwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0JBQ0tTTEFTSDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPidcJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmJhY2tzbGFzaDwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX1JJR0hUQlJBQ0tFVDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiddJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnJpZ2h0IGJyYWNrZXQ8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19DQVJFVDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPideJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmNhcmV0PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfVU5ERVJTQ09SRTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPidfJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnVuZGVyc2NvcmU8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19CQUNLUVVPVEU8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nYCc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5ncmF2ZTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX2E8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nYSc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5hPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfYjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPidiJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmI8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19jPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J2MnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+YzwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX2Q8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nZCc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5kPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfZTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPidlJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmU8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19mPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J2YnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+ZjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX2c8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nZyc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5nPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfaDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPidoJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmg8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19pPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J2knPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+aTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX2o8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4naic8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5qPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfazwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPidrJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPms8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19sPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J2wnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+bDwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX208L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nbSc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5tPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfbjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiduJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPm48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19vPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J28nPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+bzwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX3A8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4ncCc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5wPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfcTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPidxJzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnE8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19yPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J3InPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+cjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX3M8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4ncyc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5zPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfdDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPid0JzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnQ8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS191PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J3UnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+dTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX3Y8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4ndic8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz52PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfdzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPid3JzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnc8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS194PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+J3gnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+eDwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX3k8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4neSc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz55PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfejwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPid6JzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPno8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19ERUxFVEU8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nXj8nPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+ZGVsZXRlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfS1AwPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+a2V5cGFkIDA8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19LUDE8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5rZXlwYWQgMTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0tQMjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmtleXBhZCAyPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfS1AzPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+a2V5cGFkIDM8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19LUDQ8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5rZXlwYWQgNDwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0tQNTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmtleXBhZCA1PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfS1A2PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+a2V5cGFkIDY8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19LUDc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5rZXlwYWQgNzwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0tQODwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmtleXBhZCA4PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfS1A5PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+a2V5cGFkIDk8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19LUF9QRVJJT0Q8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nLic8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5rZXlwYWQgcGVyaW9kPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfS1BfRElWSURFPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jy8nPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+a2V5cGFkIGRpdmlkZTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0tQX01VTFRJUExZPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JyonPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+a2V5cGFkIG11bHRpcGx5PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfS1BfTUlOVVM8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nLSc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5rZXlwYWQgbWludXM8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19LUF9QTFVTPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+JysnPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+a2V5cGFkIHBsdXM8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19LUF9FTlRFUjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPidccic8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5rZXlwYWQgZW50ZXI8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19LUF9FUVVBTFM8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4nPSc8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5rZXlwYWQgZXF1YWxzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfVVA8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz51cCBhcnJvdzwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0RPV048L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5kb3duIGFycm93PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfUklHSFQ8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5yaWdodCBhcnJvdzwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0xFRlQ8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5sZWZ0IGFycm93PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfSU5TRVJUPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+aW5zZXJ0PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfSE9NRTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmhvbWU8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19FTkQ8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5lbmQ8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19QQUdFVVA8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5wYWdlIHVwPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfUEFHRURPV048L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5wYWdlIGRvd248L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19GMTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkYxPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfRjI8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GMjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0YzPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+RjM8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19GNDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkY0PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfRjU8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GNTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0Y2PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+RjY8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19GNzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkY3PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfRjg8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GODwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0Y5PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Rjk8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19GMTA8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GMTA8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19GMTE8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GMTE8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19GMTI8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GMTI8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19GMTM8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GMTM8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19GMTQ8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GMTQ8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19GMTU8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5GMTU8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19OVU1MT0NLPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+bnVtbG9jazwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0NBUFNMT0NLPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Y2Fwc2xvY2s8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19TQ1JPTExPQ0s8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5zY3JvbGxvY2s8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19SU0hJRlQ8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5yaWdodCBzaGlmdDwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0xTSElGVDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmxlZnQgc2hpZnQ8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19SQ1RSTDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnJpZ2h0IGN0cmw8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19MQ1RSTDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmxlZnQgY3RybDwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX1JBTFQ8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5yaWdodCBhbHQ8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19MQUxUPC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Jm5ic3A7PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+bGVmdCBhbHQ8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19STUVUQTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnJpZ2h0IG1ldGE8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19MTUVUQTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmxlZnQgbWV0YTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0xTVVBFUjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmxlZnQgd2luZG93cyBrZXk8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19SU1VQRVI8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5yaWdodCB3aW5kb3dzIGtleTwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX01PREU8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5tb2RlIHNoaWZ0PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfSEVMUDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPmhlbHA8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMS19QUklOVDwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPnByaW50LXNjcmVlbjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX1NZU1JFUTwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPiZuYnNwOzwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlN5c1JxPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfQlJFQUs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5icmVhazwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX01FTlU8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5tZW51PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETEtfUE9XRVI8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5wb3dlcjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TRExLX0VVUk88L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz4mbmJzcDs8L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5ldXJvPC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjwvRElWCis+CisKKzxESVYKK0NMQVNTPSJUQUJMRSIKKz48QQorTkFNRT0iU0RMTU9EIgorPjwvQQorPjxQCis+PEIKKz5UYWJsZSA4LTIuIFNETCBtb2RpZmllciBkZWZpbml0aW9uczwvQgorPjwvUAorPjxUQUJMRQorQk9SREVSPSIxIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEhFQUQKKz48VFIKKz48VEgKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlNETCBNb2RpZmllcjwvVEgKKz48VEgKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPk1lYW5pbmc8L1RICis+PC9UUgorPjwvVEhFQUQKKz48VEJPRFkKKz48VFIKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPktNT0RfTk9ORTwvVEQKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPk5vIG1vZGlmaWVycyBhcHBsaWNhYmxlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPktNT0RfTlVNPC9URAorPjxURAorV0lEVEg9IjUwJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+TnVtbG9jayBpcyBkb3duPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPktNT0RfQ0FQUzwvVEQKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkNhcHNsb2NrIGlzIGRvd248L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjUwJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+S01PRF9MQ1RSTDwvVEQKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkxlZnQgQ29udHJvbCBpcyBkb3duPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPktNT0RfUkNUUkw8L1RECis+PFRECitXSURUSD0iNTAlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5SaWdodCBDb250cm9sIGlzIGRvd248L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjUwJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+S01PRF9SU0hJRlQ8L1RECis+PFRECitXSURUSD0iNTAlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5SaWdodCBTaGlmdCBpcyBkb3duPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPktNT0RfTFNISUZUPC9URAorPjxURAorV0lEVEg9IjUwJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+TGVmdCBTaGlmdCBpcyBkb3duPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPktNT0RfUkFMVDwvVEQKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlJpZ2h0IEFsdCBpcyBkb3duPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPktNT0RfTEFMVDwvVEQKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkxlZnQgQWx0IGlzIGRvd248L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjUwJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+S01PRF9DVFJMPC9URAorPjxURAorV0lEVEg9IjUwJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QSBDb250cm9sIGtleSBpcyBkb3duPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPktNT0RfU0hJRlQ8L1RECis+PFRECitXSURUSD0iNTAlIgorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5BIFNoaWZ0IGtleSBpcyBkb3duPC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSI1MCUiCitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPktNT0RfQUxUPC9URAorPjxURAorV0lEVEg9IjUwJSIKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QW4gQWx0IGtleSBpcyBkb3duPC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjwvRElWCis+JiMxMzs8L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGtleXN5bS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfa2V5c3ltPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+RXZlbnQgRnVuY3Rpb25zLjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxrZXlib2FyZGV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGtleWJvYXJkZXZlbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTY5NjJjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxrZXlib2FyZGV2ZW50Lmh0bWwKQEAgLTAsMCArMSwzNzUgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfS2V5Ym9hcmRFdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0FjdGl2ZUV2ZW50IgorSFJFRj0ic2RsYWN0aXZlZXZlbnQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfTW91c2VNb3Rpb25FdmVudCIKK0hSRUY9InNkbG1vdXNlbW90aW9uZXZlbnQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsYWN0aXZlZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG1vdXNlbW90aW9uZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExLRVlCT0FSREVWRU5UIgorPjwvQQorPlNETF9LZXlib2FyZEV2ZW50PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU40MDExIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0tleWJvYXJkRXZlbnQmbmJzcDstLSZuYnNwO0tleWJvYXJkIGV2ZW50IHN0cnVjdHVyZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MDE0IgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEZWZpbml0aW9uPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz50eXBlZGVmIHN0cnVjdHsKKyAgVWludDggdHlwZTsKKyAgVWludDggc3RhdGU7CisgIFNETF9rZXlzeW0ga2V5c3ltOworfSBTRExfS2V5Ym9hcmRFdmVudDs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MDE3IgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEYXRhPC9IMgorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU40MDE5IgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjAiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUQk9EWQorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9LRVlET1dOPC9UVAorPiBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9LRVlVUDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnN0YXRlPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUFJFU1NFRDwvVFQKKz4gb3IgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUkVMRUFTRUQ8L1RUCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5rZXlzeW08L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5Db250YWlucyBrZXkgcHJlc3MgaW5mb3JtYXRpb248L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MDM4IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9LZXlib2FyZEV2ZW50PC9TUEFOCis+IGlzIGEgbWVtYmVyIG9mIHRoZSA8QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+IHVuaW9uIGFuZCBpcyB1c2VkIHdoZW4gYW4gZXZlbnQgb2YgdHlwZSA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9LRVlET1dOPC9UVAorPiBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9LRVlVUDwvVFQKKz4gaXMgcmVwb3J0ZWQuPC9QCis+PFAKKz5UaGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz50eXBlPC9JCis+PC9UVAorPiBhbmQgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zdGF0ZTwvSQorPjwvVFQKKz4gYWN0dWFsbHkgcmVwb3J0IHRoZSBzYW1lIGluZm9ybWF0aW9uLCB0aGV5IGp1c3QgdXNlIGRpZmZlcmVudCB2YWx1ZXMgdG8gZG8gaXQhIEEga2V5Ym9hcmQgZXZlbnQgb2NjdXJzIHdoZW4gYSBrZXkgaXMgcmVsZWFzZWQgKDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz49PFRUCitDTEFTUz0iTElURVJBTCIKKz5TREtfS0VZVVA8L1RUCis+IG9yIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c3RhdGU8L0kKKz48L1RUCis+PTxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1JFTEVBU0VEPC9UVAorPikgYW5kIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCAoPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz50eXBlPC9JCis+PC9UVAorPj08VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9LRVlET1dOPC9UVAorPiBvciA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnN0YXRlPC9JCis+PC9UVAorPj08VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9QUkVTU0VEPC9UVAorPikuIFRoZSBpbmZvcm1hdGlvbiBvbiB3aGF0IGtleSB3YXMgcHJlc3NlZCBvciByZWxlYXNlZCBpcyBpbiB0aGUgPEEKK0hSRUY9InNkbGtleXN5bS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5rZXlzeW08L1NQQU4KKz48L0EKKz4gc3RydWN0dXJlLjwvUAorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+UmVwZWF0aW5nIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0tFWURPV048L1RUCis+IGV2ZW50cyB3aWxsIG9jY3VyIGlmIGtleSByZXBlYXQgaXMgZW5hYmxlZCAoc2VlIDxBCitIUkVGPSJzZGxlbmFibGVrZXlyZXBlYXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRW5hYmxlS2V5UmVwZWF0PC9UVAorPjwvQQorPikuPC9QCis+PC9CTE9DS1FVT1RFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDA2NCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsa2V5c3ltLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9rZXlzeW08L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZW5hYmxla2V5cmVwZWF0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0VuYWJsZUtleVJlcGVhdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZW5hYmxldW5pY29kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9FbmFibGVVTklDT0RFPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsYWN0aXZlZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxtb3VzZW1vdGlvbmV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQWN0aXZlRXZlbnQ8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfTW91c2VNb3Rpb25FdmVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxrZXlzeW0uaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsa2V5c3ltLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyMmY3OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsa2V5c3ltLmh0bWwKQEAgLTAsMCArMSwzNTUgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfa2V5c3ltPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBFdmVudCBTdHJ1Y3R1cmVzLiIKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfUXVpdEV2ZW50IgorSFJFRj0ic2RscXVpdGV2ZW50Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMS2V5IgorSFJFRj0ic2Rsa2V5Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHF1aXRldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsa2V5Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMS0VZU1lNIgorPjwvQQorPlNETF9rZXlzeW08L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjQ2NTkiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfa2V5c3ltJm5ic3A7LS0mbmJzcDtLZXlzeW0gc3RydWN0dXJlPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ2NjIiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBVaW50OCBzY2FuY29kZTsKKyAgU0RMS2V5IHN5bTsKKyAgU0RMTW9kIG1vZDsKKyAgVWludDE2IHVuaWNvZGU7Cit9IFNETF9rZXlzeW07PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDY2NSIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGF0YTwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVONDY2NyIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zY2FuY29kZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkhhcmR3YXJlIHNwZWNpZmljIHNjYW5jb2RlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zeW08L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TREwgdmlydHVhbCBrZXlzeW08L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPm1vZDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkN1cnJlbnQga2V5IG1vZGlmaWVyczwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dW5pY29kZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlRyYW5zbGF0ZWQgY2hhcmFjdGVyPC9URAorPjwvVFIKKz48L1RCT0RZCis+PC9UQUJMRQorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDY4NiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRoZSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX2tleXN5bTwvU1BBTgorPiBzdHJ1Y3R1cmUgaXMgdXNlZCBieSByZXBvcnRpbmcga2V5IHByZXNzZXMgYW5kIHJlbGVhc2VzIHNpbmNlIGl0IGlzIGEgcGFydCBvZiB0aGUgPEEKK0hSRUY9InNkbGtleWJvYXJkZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0tleWJvYXJkRXZlbnQ8L1NQQU4KKz48L0EKKz4uPC9QCis+PFAKKz5UaGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zY2FuY29kZTwvSQorPjwvVFQKKz4gZmllbGQgc2hvdWxkIGdlbmVyYWxseSBiZSBsZWZ0IGFsb25lLCBpdCBpcyB0aGUgaGFyZHdhcmUgZGVwZW5kZW50IHNjYW5jb2RlIHJldHVybmVkIGJ5IHRoZSBrZXlib2FyZC4gVGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c3ltPC9JCis+PC9UVAorPiBmaWVsZCBpcyBleHRyZW1lbHkgdXNlZnVsLiBJdCBpcyB0aGUgU0RMLWRlZmluZWQgdmFsdWUgb2YgdGhlIGtleSAoc2VlIDxBCitIUkVGPSJzZGxrZXkuaHRtbCIKKz5TREwgS2V5IFN5bXM8L0EKKz4uIFRoaXMgZmllbGQgaXMgdmVyeSB1c2VmdWwgd2hlbiB5b3UgYXJlIGNoZWNraW5nIGZvciBjZXJ0YWluIGtleSBwcmVzc2VzLCBsaWtlIHNvOgorPFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPi4KKy4KK3doaWxlKFNETF9Qb2xsRXZlbnQoJiMzODtldmVudCkpeworICBzd2l0Y2goZXZlbnQudHlwZSl7CisgICAgY2FzZSBTRExfS0VZRE9XTjoKKyAgICAgIGlmKGV2ZW50LmtleS5rZXlzeW0uc3ltPT1TRExLX0xFRlQpCisgICAgICAgIG1vdmVfbGVmdCgpOworICAgICAgYnJlYWs7CisgICAgLgorICAgIC4KKyAgICAuCisgIH0KK30KKy4KKy48L1BSRQorPgorPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5tb2Q8L0kKKz48L1RUCis+IHN0b3JlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQgbW9kaWZpZXJzIGFzIGV4cGxhaW5lZCBpbiA8QQorSFJFRj0ic2RsZ2V0bW9kc3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0TW9kU3RhdGU8L1RUCis+PC9BCis+LiBUaGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz51bmljb2RlPC9JCis+PC9UVAorPiBpcyBvbmx5IHVzZWQgd2hlbiBVTklDT0RFIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQgd2l0aCA8QQorSFJFRj0ic2RsZW5hYmxldW5pY29kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9FbmFibGVVTklDT0RFPC9UVAorPjwvQQorPi4gSWYgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz51bmljb2RlPC9JCis+PC9UVAorPiBpcyBub24temVybyB0aGVuIHRoaXMgYSB0aGUgVU5JQ09ERSBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUga2V5cHJlc3MuIElmIHRoZSBoaWdoIDkgYml0cyBvZiB0aGUgY2hhcmFjdGVyIGFyZSAwLCB0aGVuIHRoaXMgbWFwcyB0byB0aGUgZXF1aXZhbGVudCBBU0NJSSBjaGFyYWN0ZXI6Cis8UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+Y2hhciBjaDsKK2lmICggKGtleXN5bS51bmljb2RlICYjMzg7IDB4RkY4MCkgPT0gMCApIHsKKyAgY2ggPSBrZXlzeW0udW5pY29kZSAmIzM4OyAweDdGOworfQorZWxzZSB7CisgIHByaW50ZigiQW4gSW50ZXJuYXRpb25hbCBDaGFyYWN0ZXIuXG4iKTsKK308L1BSRQorPgorVU5JQ09ERSB0cmFuc2xhdGlvbiBkb2VzIGhhdmUgYSBzbGlnaHQgb3ZlcmhlYWQgc28gZG9uJ3QgZW5hYmxlIGl0IHVubGVzcyBpdHMgbmVlZGVkLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40NzA1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGtleS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExLZXk8L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHF1aXRldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGtleS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1F1aXRFdmVudDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETEtleTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxraWxsdGhyZWFkLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGtpbGx0aHJlYWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2U3YjliCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxraWxsdGhyZWFkLmh0bWwKQEAgLTAsMCArMSwyMjMgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfS2lsbFRocmVhZDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJNdWx0aS10aHJlYWRlZCBQcm9ncmFtbWluZyIKK0hSRUY9InRocmVhZC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfV2FpdFRocmVhZCIKK0hSRUY9InNkbHdhaXR0aHJlYWQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ3JlYXRlTXV0ZXgiCitIUkVGPSJzZGxjcmVhdGVtdXRleC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx3YWl0dGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjcmVhdGVtdXRleC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETEtJTExUSFJFQUQiCis+PC9BCis+U0RMX0tpbGxUaHJlYWQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjc3OTQiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfS2lsbFRocmVhZCZuYnNwOy0tJm5ic3A7R3JhY2VsZXNzbHkgdGVybWluYXRlcyB0aGUgdGhyZWFkLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43Nzk3IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjc3OTgiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9LaWxsVGhyZWFkPC9CCis+PC9DT0RFCis+KFNETF9UaHJlYWQgKnRocmVhZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43ODA0IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0tpbGxUaHJlYWQ8L1RUCis+IGdyYWNlbGVzc2x5IHRlcm1pbmF0ZXMgdGhlIHRocmVhZCAKK2Fzc29jaWF0ZWQgd2l0aCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz50aHJlYWQ8L0kKKz48L1RUCis+LiAgSWYgcG9zc2libGUsIHlvdSBzaG91bGQgCit1c2Ugc29tZSBvdGhlciBmb3JtIG9mIElQQyB0byBzaWduYWwgdGhlIHRocmVhZCB0byBxdWl0LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43ODA5IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZXRocmVhZC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVUaHJlYWQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHdhaXR0aHJlYWQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfV2FpdFRocmVhZDwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHdhaXR0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjcmVhdGVtdXRleC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1dhaXRUaHJlYWQ8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ3JlYXRlTXV0ZXg8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbGlzdG1vZGVzLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGxpc3Rtb2Rlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlN2JjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGxpc3Rtb2Rlcy5odG1sCkBAIC0wLDAgKzEsMzEwIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0xpc3RNb2RlczwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9WaWRlb0RyaXZlck5hbWUiCitIUkVGPSJzZGx2aWRlb2RyaXZlcm5hbWUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfVmlkZW9Nb2RlT0siCitIUkVGPSJzZGx2aWRlb21vZGVvay5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx2aWRlb2RyaXZlcm5hbWUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHZpZGVvbW9kZW9rLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMTElTVE1PREVTIgorPjwvQQorPlNETF9MaXN0TW9kZXM8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjExNTkiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfTGlzdE1vZGVzJm5ic3A7LS0mbmJzcDtSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdmFpbGFibGUgc2NyZWVuIGRpbWVuc2lvbnMgZm9yIAordGhlIGdpdmVuIGZvcm1hdCBhbmQgdmlkZW8gZmxhZ3M8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTE2MiIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xMTYzIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5TRExfUmVjdCAqKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9MaXN0TW9kZXM8L0IKKz48L0NPREUKKz4oU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xMTY5IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UmV0dXJuIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdmFpbGFibGUgc2NyZWVuIGRpbWVuc2lvbnMgZm9yIHRoZSBnaXZlbgorZm9ybWF0IGFuZCB2aWRlbyBmbGFncywgc29ydGVkIGxhcmdlc3QgdG8gc21hbGxlc3QuICBSZXR1cm5zCis8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+IGlmIHRoZXJlIGFyZSBubyBkaW1lbnNpb25zIGF2YWlsYWJsZSBmb3IgYSBwYXJ0aWN1bGFyCitmb3JtYXQsIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gaWYgYW55IGRpbWVuc2lvbiBpcyBva2F5IGZvcgordGhlIGdpdmVuIGZvcm1hdC48L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmZvcm1hdDwvSQorPjwvVFQKKz4gaXMgPFRUCitDTEFTUz0iTElURVJBTCIKKz5OVUxMPC9UVAorPiwgdGhlIG1vZGUgbGlzdAord2lsbCBiZSBmb3IgdGhlIGZvcm1hdCByZXR1cm5lZCBieSA8QQorSFJFRj0ic2RsZ2V0dmlkZW9pbmZvLmh0bWwiCis+U0RMX0dldFZpZGVvSW5mbygpPC9BCis+LSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz52Zm10PC9JCis+PC9UVAorPi4gVGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmZsYWc8L0kKKz48L1RUCis+IHBhcmFtZXRlciBpcyBhbiBPUidkIGNvbWJpbmF0aW9uIG9mIDxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+c3VyZmFjZTwvQQorPiBmbGFncy4gVGhlIGZsYWdzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSB1c2VkIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0VmlkZW9Nb2RlPC9UVAorPjwvQQorPiBhbmQgdGhleSBwbGF5IGEgc3Ryb25nIHJvbGUgaW4gZGVjaWRpbmcgd2hhdCBtb2RlcyBhcmUgdmFsaWQuIEZvciBpbnN0YW5jZSwgaWYgeW91IHBhc3MgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSFdTVVJGQUNFPC9UVAorPiBhcyBhIGZsYWcgb25seSBtb2RlcyB0aGF0IHN1cHBvcnQgaGFyZHdhcmUgdmlkZW8gc3VyZmFjZXMgd2lsbCBiZSByZXR1cm5lZC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTE4NCIKKz48L0EKKz48SDIKKz5FeGFtcGxlPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfUmVjdCAqKm1vZGVzOworaW50IGk7CisuCisuCisuCisKKy8qIEdldCBhdmFpbGFibGUgZnVsbHNjcmVlbi9oYXJkd2FyZSBtb2RlcyAqLworbW9kZXM9U0RMX0xpc3RNb2RlcyhOVUxMLCBTRExfRlVMTFNDUkVFTnxTRExfSFdTVVJGQUNFKTsKKworLyogQ2hlY2sgaXMgdGhlcmUgYXJlIGFueSBtb2RlcyBhdmFpbGFibGUgKi8KK2lmKG1vZGVzID09IChTRExfUmVjdCAqKikwKXsKKyAgcHJpbnRmKCJObyBtb2RlcyBhdmFpbGFibGUhXG4iKTsKKyAgZXhpdCgtMSk7Cit9CisKKy8qIENoZWNrIGlmIG91ciByZXNvbHV0aW9uIGlzIHJlc3RyaWN0ZWQgKi8KK2lmKG1vZGVzID09IChTRExfUmVjdCAqKiktMSl7CisgIHByaW50ZigiQWxsIHJlc29sdXRpb25zIGF2YWlsYWJsZS5cbiIpOworfQorZWxzZXsKKyAgLyogUHJpbnQgdmFsaWQgbW9kZXMgKi8KKyAgcHJpbnRmKCJBdmFpbGFibGUgTW9kZXNcbiIpOworICBmb3IoaT0wO21vZGVzW2ldOysraSkKKyAgICBwcmludGYoIiAgJWQgeCAlZFxuIiwgbW9kZXNbaV0tJiM2Mjt3LCBtb2Rlc1tpXS0mIzYyO2gpOworfQorLgorLjwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjExODciCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFZpZGVvTW9kZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZ2V0dmlkZW9pbmZvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dldFZpZGVvSW5mbzwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RscmVjdC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUmVjdDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUGl4ZWxGb3JtYXQ8L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHZpZGVvZHJpdmVybmFtZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHZpZGVvbW9kZW9rLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfVmlkZW9Ecml2ZXJOYW1lPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfVmlkZW9Nb2RlT0s8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbG9hZGJtcC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxsb2FkYm1wLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1NTZlMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbG9hZGJtcC5odG1sCkBAIC0wLDAgKzEsMjE5IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0xvYWRCTVA8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfVW5sb2NrU3VyZmFjZSIKK0hSRUY9InNkbHVubG9ja3N1cmZhY2UuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2F2ZUJNUCIKK0hSRUY9InNkbHNhdmVibXAuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsdW5sb2Nrc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc2F2ZWJtcC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETExPQURCTVAiCis+PC9BCis+U0RMX0xvYWRCTVA8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjE5ODkiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfTG9hZEJNUCZuYnNwOy0tJm5ic3A7TG9hZCBhIFdpbmRvd3MgQk1QIGZpbGUgaW50byBhbiBTRExfU3VyZmFjZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTk5MiIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xOTkzIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5TRExfU3VyZmFjZSAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0xvYWRCTVA8L0IKKz48L0NPREUKKz4oY29uc3QgY2hhciAqZmlsZSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xOTk5IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+TG9hZHMgYSBzdXJmYWNlIGZyb20gYSBuYW1lZCBXaW5kb3dzIEJNUCBmaWxlLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMDAyIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgdGhlIG5ldyBzdXJmYWNlLCBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+IAoraWYgdGhlcmUgd2FzIGFuIGVycm9yLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMDA2IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHNhdmVibXAuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2F2ZUJNUDwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHVubG9ja3N1cmZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzYXZlYm1wLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfVW5sb2NrU3VyZmFjZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NhdmVCTVA8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbG9hZHdhdi5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxsb2Fkd2F2Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiYjczZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbG9hZHdhdi5odG1sCkBAIC0wLDAgKzEsMjk2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX0xvYWRXQVY8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQXVkaW8iCitIUkVGPSJhdWRpby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR2V0QXVkaW9TdGF0dXMiCitIUkVGPSJzZGxnZXRhdWRpb3N0YXR1cy5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9GcmVlV0FWIgorSFJFRj0ic2RsZnJlZXdhdi5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRhdWRpb3N0YXR1cy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZnJlZXdhdi5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETExPQURXQVYiCis+PC9BCis+U0RMX0xvYWRXQVY8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjY4MTYiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfTG9hZFdBViZuYnNwOy0tJm5ic3A7TG9hZCBhIFdBVkUgZmlsZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU42ODE5IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjY4MjAiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9BdWRpb1NwZWMgKjxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Mb2FkV0FWPC9CCis+PC9DT0RFCis+KGNvbnN0IGNoYXIgKmZpbGUsIFNETF9BdWRpb1NwZWMgKnNwZWMsIFVpbnQ4ICoqYXVkaW9fYnVmLCBVaW50MzIgKmF1ZGlvX2xlbik7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42ODI2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvYWRXQVY8L1RUCis+CitUaGlzIGZ1bmN0aW9uIGxvYWRzIGEgV0FWRSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5maWxlPC9JCis+PC9UVAorPiBpbnRvIG1lbW9yeS48L1AKKz48UAorPklmIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMsIGl0IHJldHVybnMgdGhlIGdpdmVuIAorPEEKK0hSRUY9InNkbGF1ZGlvc3BlYy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9BdWRpb1NwZWM8L1RUCis+PC9BCis+LCAKK2ZpbGxlZCB3aXRoIHRoZSBhdWRpbyBkYXRhIGZvcm1hdCBvZiB0aGUgd2F2ZSBkYXRhLCBhbmQgc2V0cyAKKzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmF1ZGlvX2J1ZjwvSQorPjwvVFQKKz4gdG8gYSA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5tYWxsb2M8L1RUCis+J2QgCitidWZmZXIgY29udGFpbmluZyB0aGUgYXVkaW8gZGF0YSwgYW5kIHNldHMgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+YXVkaW9fbGVuPC9JCis+PC9UVAorPiAKK3RvIHRoZSBsZW5ndGggb2YgdGhhdCBhdWRpbyBidWZmZXIsIGluIGJ5dGVzLiAgWW91IG5lZWQgdG8gZnJlZSB0aGUgYXVkaW8gCitidWZmZXIgd2l0aCA8QQorSFJFRj0ic2RsZnJlZXdhdi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9GcmVlV0FWPC9UVAorPjwvQQorPiB3aGVuIHlvdSBhcmUKK2RvbmUgd2l0aCBpdC48L1AKKz48UAorPlRoaXMgZnVuY3Rpb24gcmV0dXJucyA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+IGFuZCBzZXRzIHRoZSBTREwgCitlcnJvciBtZXNzYWdlIGlmIHRoZSB3YXZlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCwgdXNlcyBhbiB1bmtub3duIGRhdGEgZm9ybWF0LCAKK29yIGlzIGNvcnJ1cHQuICBDdXJyZW50bHkgcmF3LCBNUy1BRFBDTSBhbmQgSU1BLUFEUENNIFdBVkUgZmlsZXMgYXJlIHN1cHBvcnRlZC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjg0MSIKKz48L0EKKz48SDIKKz5FeGFtcGxlPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfQXVkaW9TcGVjIHdhdl9zcGVjOworVWludDMyIHdhdl9sZW5ndGg7CitVaW50OCAqd2F2X2J1ZmZlcjsKKworLyogTG9hZCB0aGUgV0FWICovCitpZiggU0RMX0xvYWRXQVYoInRlc3Qud2F2IiwgJiMzODt3YXZfc3BlYywgJiMzODt3YXZfYnVmZmVyLCAmIzM4O3dhdl9sZW5ndGgpID09IE5VTEwgKXsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiB0ZXN0LndhdjogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgZXhpdCgtMSk7Cit9CisuCisuCisuCisvKiBEbyBzdHVmZiB3aXRoIHRoZSBXQVYgKi8KKy4KKy4KKy8qIEZyZWUgSXQgKi8KK1NETF9GcmVlV0FWKHdhdl9idWZmZXIpOzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY4NDQiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsYXVkaW9zcGVjLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9BdWRpb1NwZWM8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsb3BlbmF1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX09wZW5BdWRpbzwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZnJlZXdhdi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9GcmVlV0FWPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0YXVkaW9zdGF0dXMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxmcmVld2F2Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfR2V0QXVkaW9TdGF0dXM8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJhdWRpby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9GcmVlV0FWPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGxvY2thdWRpby5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxsb2NrYXVkaW8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZmYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxsb2NrYXVkaW8uaHRtbApAQCAtMCwwICsxLDIwOCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9Mb2NrQXVkaW88L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQXVkaW8iCitIUkVGPSJhdWRpby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfTWl4QXVkaW8iCitIUkVGPSJzZGxtaXhhdWRpby5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9VbmxvY2tBdWRpbyIKK0hSRUY9InNkbHVubG9ja2F1ZGlvLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG1peGF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx1bmxvY2thdWRpby5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETExPQ0tBVURJTyIKKz48L0EKKz5TRExfTG9ja0F1ZGlvPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43MTM0IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX0xvY2tBdWRpbyZuYnNwOy0tJm5ic3A7TG9jayBvdXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjcxMzciCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONzEzOCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfTG9ja0F1ZGlvPC9CCis+PC9DT0RFCis+KHZvaWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzE0NCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRoZSBsb2NrIG1hbmlwdWxhdGVkIGJ5IHRoZXNlIGZ1bmN0aW9ucyBwcm90ZWN0cyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCitEdXJpbmcgYSBMb2NrQXVkaW8gcGVyaW9kLCB5b3UgY2FuIGJlIGd1YXJhbnRlZWQgdGhhdCB0aGUKK2NhbGxiYWNrIGZ1bmN0aW9uIGlzIG5vdCBydW5uaW5nLiAgRG8gbm90IGNhbGwgdGhlc2UgZnJvbSB0aGUgY2FsbGJhY2sKK2Z1bmN0aW9uIG9yIHlvdSB3aWxsIGNhdXNlIGRlYWRsb2NrLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MTQ3IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbG9wZW5hdWRpby5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9PcGVuQXVkaW88L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxtaXhhdWRpby5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHVubG9ja2F1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfTWl4QXVkaW88L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJhdWRpby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9VbmxvY2tBdWRpbzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxsb2Nrc3VyZmFjZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxsb2Nrc3VyZmFjZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzg5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGxvY2tzdXJmYWNlLmh0bWwKQEAgLTAsMCArMSwzMDYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfTG9ja1N1cmZhY2U8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfRnJlZVN1cmZhY2UiCitIUkVGPSJzZGxmcmVlc3VyZmFjZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9VbmxvY2tTdXJmYWNlIgorSFJFRj0ic2RsdW5sb2Nrc3VyZmFjZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxmcmVlc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsdW5sb2Nrc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETExPQ0tTVVJGQUNFIgorPjwvQQorPlNETF9Mb2NrU3VyZmFjZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTkxOSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Mb2NrU3VyZmFjZSZuYnNwOy0tJm5ic3A7TG9jayBhIHN1cmZhY2UgZm9yIGRpcmVjdGx5IGFjY2Vzcy48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTkyMiIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xOTIzIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX0xvY2tTdXJmYWNlPC9CCis+PC9DT0RFCis+KFNETF9TdXJmYWNlICpzdXJmYWNlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE5MjkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9ja1N1cmZhY2U8L1RUCis+IHNldHMgdXAgYSBzdXJmYWNlIGZvciBkaXJlY3RseSAKK2FjY2Vzc2luZyB0aGUgcGl4ZWxzLiAgQmV0d2VlbiBjYWxscyB0byA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9ja1N1cmZhY2U8L1RUCis+CithbmQgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1VubG9ja1N1cmZhY2U8L1RUCis+LCB5b3UgY2FuIHdyaXRlIHRvIGFuZCByZWFkIGZyb20gCis8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zdXJmYWNlLSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5waXhlbHM8L0kKKz48L1RUCis+PC9JCis+PC9UVAorPiwgdXNpbmcgdGhlIHBpeGVsIGZvcm1hdCBzdG9yZWQgaW4KKzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnN1cmZhY2UtJiM2Mjs8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmZvcm1hdDwvSQorPjwvVFQKKz48L0kKKz48L1RUCis+LiAgT25jZSB5b3UgYXJlIGRvbmUgYWNjZXNzaW5nIHRoZQorc3VyZmFjZSwgeW91IHNob3VsZCB1c2UgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1VubG9ja1N1cmZhY2U8L1RUCis+IHRvIHJlbGVhc2UgaXQuPC9QCis+PFAKKz5Ob3QgYWxsIHN1cmZhY2VzIHJlcXVpcmUgbG9ja2luZy4gIAorSWYgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfTVVTVExPQ0s8L1RUCis+KDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnN1cmZhY2U8L0kKKz48L1RUCis+KQorZXZhbHVhdGVzIHRvIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiwgdGhlbiB5b3UgY2FuIHJlYWQgYW5kIHdyaXRlIHRvIHRoZSAKK3N1cmZhY2UgYXQgYW55IHRpbWUsIGFuZCB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSBzdXJmYWNlIHdpbGwgbm90IGNoYW5nZS4gPC9QCis+PFAKKz5ObyBvcGVyYXRpbmcgc3lzdGVtIG9yIGxpYnJhcnkgY2FsbHMgc2hvdWxkIGJlIG1hZGUgYmV0d2VlbiBsb2NrL3VubG9jaworcGFpcnMsIGFzIGNyaXRpY2FsIHN5c3RlbSBsb2NrcyBtYXkgYmUgaGVsZCBkdXJpbmcgdGhpcyB0aW1lLjwvUAorPjxQCis+SXQgc2hvdWxkIGJlIG5vdGVkLCB0aGF0IHNpbmNlIFNETCAxLjEuOCBzdXJmYWNlIGxvY2tzIGFyZSByZWN1cnNpdmUuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGxvY2sgYSBzdXJmYWNlIG11bHRpcGxlIHRpbWVzLCBidXQgZWFjaCBsb2NrIG11c3QgaGF2ZSBhIG1hdGNoIHVubG9jay4KKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gICAgLgorICAgIC4KKyAgICBTRExfTG9ja1N1cmZhY2UoIHN1cmZhY2UgKTsKKyAgICAuCisgICAgLyogU3VyZmFjZSBpcyBsb2NrZWQgKi8KKyAgICAvKiBEaXJlY3QgcGl4ZWwgYWNjZXNzIG9uIHN1cmZhY2UgaGVyZSAqLworICAgIC4KKyAgICBTRExfTG9ja1N1cmZhY2UoIHN1cmZhY2UgKTsKKyAgICAuCisgICAgLyogTW9yZSBkaXJlY3QgcGl4ZWwgYWNjZXNzIG9uIHN1cmZhY2UgKi8KKyAgICAuCisgICAgU0RMX1VubG9ja1N1cmZhY2UoIHN1cmZhY2UgKTsKKyAgICAvKiBTdXJmYWNlIGlzIHN0aWxsIGxvY2tlZCAqLworICAgIC8qIE5vdGU6IElzIHZlcnNpb25zICYjNjA7IDEuMS44LCB0aGUgc3VyZmFjZSB3b3VsZCBoYXZlIGJlZW4gKi8KKyAgICAvKiBubyBsb25nZXIgbG9ja2VkIGF0IHRoaXMgc3RhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAuCisgICAgU0RMX1VubG9ja1N1cmZhY2UoIHN1cmZhY2UgKTsKKyAgICAvKiBTdXJmYWNlIGlzIG5vdyB1bmxvY2tlZCAqLworICAgIC4KKyAgICAuPC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTk0NyIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9ja1N1cmZhY2U8L1RUCis+IHJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+LCAKK29yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gaWYgdGhlIHN1cmZhY2UgY291bGRuJ3QgYmUgbG9ja2VkLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xOTUzIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHVubG9ja3N1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfVW5sb2NrU3VyZmFjZTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGZyZWVzdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsdW5sb2Nrc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0ZyZWVTdXJmYWNlPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfVW5sb2NrU3VyZmFjZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxsb2NreXV2b3ZlcmxheS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxsb2NreXV2b3ZlcmxheS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTZjZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbGxvY2t5dXZvdmVybGF5Lmh0bWwKQEAgLTAsMCArMSwyNTIgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfTG9ja1lVVk92ZXJsYXk8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfQ3JlYXRlWVVWT3ZlcmxheSIKK0hSRUY9InNkbGNyZWF0ZXl1dm92ZXJsYXkuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfVW5sb2NrWVVWT3ZlcmxheSIKK0hSRUY9InNkbHVubG9ja3l1dm92ZXJsYXkuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsdW5sb2NreXV2b3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETExPQ0tZVVZPVkVSTEFZIgorPjwvQQorPlNETF9Mb2NrWVVWT3ZlcmxheTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMjg0NCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Mb2NrWVVWT3ZlcmxheSZuYnNwOy0tJm5ic3A7TG9jayBhbiBvdmVybGF5PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjI4NDciCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjg0OCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Mb2NrWVVWT3ZlcmxheTwvQgorPjwvQ09ERQorPihTRExfT3ZlcmxheSAqb3ZlcmxheSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yODU0IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+TXVjaCB0aGUgc2FtZSBhcyA8QQorSFJFRj0ic2RsbG9ja3N1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9ja1N1cmZhY2U8L1RUCis+PC9BCis+LCA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9ja1lVVk92ZXJsYXk8L1RUCis+IGxvY2tzIHRoZSA8QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm92ZXJsYXk8L0kKKz48L1RUCis+PC9BCis+IGZvciBkaXJlY3QgYWNjZXNzIHRvIHBpeGVsIGRhdGEuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI4NjIiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gb24gc3VjY2Vzcywgb3IgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4tMTwvU1BBTgorPiBvbiBhbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjg2NyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGx1bmxvY2t5dXZvdmVybGF5Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1VubG9ja1lVVk92ZXJsYXk8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGNyZWF0ZXl1dm92ZXJsYXkuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlWVVWT3ZlcmxheTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfT3ZlcmxheTwvU1BBTgorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHVubG9ja3l1dm92ZXJsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9DcmVhdGVZVVZPdmVybGF5PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfVW5sb2NrWVVWT3ZlcmxheTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxtYXByZ2IuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbWFwcmdiLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4NmQwYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbWFwcmdiLmh0bWwKQEAgLTAsMCArMSwyNTQgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfTWFwUkdCPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1NldEdhbW1hUmFtcCIKK0hSRUY9InNkbHNldGdhbW1hcmFtcC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9NYXBSR0JBIgorSFJFRj0ic2RsbWFwcmdiYS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZXRnYW1tYXJhbXAuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG1hcHJnYmEuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExNQVBSR0IiCis+PC9BCis+U0RMX01hcFJHQjwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTY1MiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9NYXBSR0ImbmJzcDstLSZuYnNwO01hcCBhIFJHQiBjb2xvciB2YWx1ZSB0byBhIHBpeGVsIGZvcm1hdC48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTY1NSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xNjU2IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5VaW50MzIgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX01hcFJHQjwvQgorPjwvQ09ERQorPihTRExfUGl4ZWxGb3JtYXQgKmZtdCwgVWludDggciwgVWludDggZywgVWludDggYik7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xNjYyIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+TWFwcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgcGl4ZWwgZm9ybWF0IGFuZCByZXR1cm5zIHRoZQorcGl4ZWwgdmFsdWUgYXMgYSAzMi1iaXQgaW50LjwvUAorPjxQCis+SWYgdGhlIGZvcm1hdCBoYXMgYSBwYWxldHRlICg4LWJpdCkgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hdGNoaW5nCitjb2xvciBpbiB0aGUgcGFsZXR0ZSB3aWxsIGJlIHJldHVybmVkLjwvUAorPjxQCis+SWYgdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQgaGFzIGFuIGFscGhhIGNvbXBvbmVudCBpdCB3aWxsIGJlIHJldHVybmVkCithcyBhbGwgMSBiaXRzIChmdWxseSBvcGFxdWUpLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xNjY3IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPkEgcGl4ZWwgdmFsdWUgYmVzdCBhcHByb3hpbWF0aW5nIHRoZSBnaXZlbiBSR0IgY29sb3IgdmFsdWUgZm9yIGEgZ2l2ZW4KK3BpeGVsIGZvcm1hdC4gSWYgdGhlIHBpeGVsIGZvcm1hdCBicHAgKGNvbG9yIGRlcHRoKSBpcyBsZXNzIHRoYW4gMzItYnBwCit0aGVuIHRoZSB1bnVzZWQgdXBwZXIgYml0cyBvZiB0aGUgcmV0dXJuIHZhbHVlIGNhbiBzYWZlbHkgYmUgaWdub3JlZAorKGUuZy4sIHdpdGggYSAxNi1icHAgZm9ybWF0IHRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIGFzc2lnbmVkIHRvIGEKKzxTUEFOCitDTEFTUz0iVFlQRSIKKz5VaW50MTY8L1NQQU4KKz4sIGFuZCBzaW1pbGFybHkgYSA8U1BBTgorQ0xBU1M9IlRZUEUiCis+VWludDg8L1NQQU4KKz4gZm9yIGFuIDgtYnBwCitmb3JtYXQpLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xNjcyIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGdldHJnYi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRSR0I8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGdldHJnYmEuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0UkdCQTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsbWFwcmdiYS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9NYXBSR0JBPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUGl4ZWxGb3JtYXQ8L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldGdhbW1hcmFtcC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbG1hcHJnYmEuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRHYW1tYVJhbXA8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9NYXBSR0JBPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG1hcHJnYmEuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbWFwcmdiYS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YmZmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG1hcHJnYmEuaHRtbApAQCAtMCwwICsxLDI0MiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9NYXBSR0JBPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX01hcFJHQiIKK0hSRUY9InNkbG1hcHJnYi5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9HZXRSR0IiCitIUkVGPSJzZGxnZXRyZ2IuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsbWFwcmdiLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRyZ2IuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExNQVBSR0JBIgorPjwvQQorPlNETF9NYXBSR0JBPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4xNjg3IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX01hcFJHQkEmbmJzcDstLSZuYnNwO01hcCBhIFJHQkEgY29sb3IgdmFsdWUgdG8gYSBwaXhlbCBmb3JtYXQuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjE2OTAiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMTY5MSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+VWludDMyIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9NYXBSR0JBPC9CCis+PC9DT0RFCis+KFNETF9QaXhlbEZvcm1hdCAqZm10LCBVaW50OCByLCBVaW50OCBnLCBVaW50OCBiLCBVaW50OCBhKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE2OTciCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5NYXBzIHRoZSBSR0JBIGNvbG9yIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgcGl4ZWwgZm9ybWF0IGFuZCByZXR1cm5zIHRoZQorcGl4ZWwgdmFsdWUgYXMgYSAzMi1iaXQgaW50LjwvUAorPjxQCis+SWYgdGhlIGZvcm1hdCBoYXMgYSBwYWxldHRlICg4LWJpdCkgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hdGNoaW5nCitjb2xvciBpbiB0aGUgcGFsZXR0ZSB3aWxsIGJlIHJldHVybmVkLjwvUAorPjxQCis+SWYgdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQgaGFzIG5vIGFscGhhIGNvbXBvbmVudCB0aGUgYWxwaGEgdmFsdWUKK3dpbGwgYmUgaWdub3JlZCAoYXMgaXQgd2lsbCBiZSBpbiBmb3JtYXRzIHdpdGggYSBwYWxldHRlKS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTcwMiIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5BIHBpeGVsIHZhbHVlIGJlc3QgYXBwcm94aW1hdGluZyB0aGUgZ2l2ZW4gUkdCQSBjb2xvciB2YWx1ZSBmb3IgYSBnaXZlbgorcGl4ZWwgZm9ybWF0LiBJZiB0aGUgcGl4ZWwgZm9ybWF0IGJwcCAoY29sb3IgZGVwdGgpIGlzIGxlc3MgdGhhbiAzMi1icHAKK3RoZW4gdGhlIHVudXNlZCB1cHBlciBiaXRzIG9mIHRoZSByZXR1cm4gdmFsdWUgY2FuIHNhZmVseSBiZSBpZ25vcmVkCisoZS5nLiwgd2l0aCBhIDE2LWJwcCBmb3JtYXQgdGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgYXNzaWduZWQgdG8gYQorPFNQQU4KK0NMQVNTPSJUWVBFIgorPlVpbnQxNjwvU1BBTgorPiwgYW5kIHNpbWlsYXJseSBhIDxTUEFOCitDTEFTUz0iVFlQRSIKKz5VaW50ODwvU1BBTgorPiBmb3IgYW4gOC1icHAKK2Zvcm1hdCkuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE3MDciCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZ2V0cmdiLmh0bWwiCis+U0RMX0dldFJHQjwvQQorPiwKKzxBCitIUkVGPSJzZGxnZXRyZ2JhLmh0bWwiCis+U0RMX0dldFJHQkE8L0EKKz4sCis8QQorSFJFRj0ic2RsbWFwcmdiLmh0bWwiCis+U0RMX01hcFJHQjwvQQorPiwKKzxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorPlNETF9QaXhlbEZvcm1hdDwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsbWFwcmdiLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0cmdiLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfTWFwUkdCPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfR2V0UkdCPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG1peGF1ZGlvLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG1peGF1ZGlvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZjBmMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbWl4YXVkaW8uaHRtbApAQCAtMCwwICsxLDIzNyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9NaXhBdWRpbzwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJBdWRpbyIKK0hSRUY9ImF1ZGlvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Db252ZXJ0QXVkaW8iCitIUkVGPSJzZGxjb252ZXJ0YXVkaW8uaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfTG9ja0F1ZGlvIgorSFJFRj0ic2RsbG9ja2F1ZGlvLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNvbnZlcnRhdWRpby5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsbG9ja2F1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMTUlYQVVESU8iCis+PC9BCis+U0RMX01peEF1ZGlvPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43MTA3IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX01peEF1ZGlvJm5ic3A7LS0mbmJzcDtNaXggYXVkaW8gZGF0YTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43MTEwIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjcxMTEiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX01peEF1ZGlvPC9CCis+PC9DT0RFCis+KFVpbnQ4ICpkc3QsIFVpbnQ4ICpzcmMsIFVpbnQzMiBsZW4sIGludCB2b2x1bWUpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzExNyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRoaXMgZnVuY3Rpb24gdGFrZXMgdHdvIGF1ZGlvIGJ1ZmZlcnMgb2YgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+bGVuPC9JCis+PC9UVAorPiBieXRlcyBlYWNoCitvZiB0aGUgcGxheWluZyBhdWRpbyBmb3JtYXQgYW5kIG1peGVzIHRoZW0sIHBlcmZvcm1pbmcgYWRkaXRpb24sIHZvbHVtZQorYWRqdXN0bWVudCwgYW5kIG92ZXJmbG93IGNsaXBwaW5nLiBUaGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+dm9sdW1lPC9JCis+PC9UVAorPiByYW5nZXMKK2Zyb20gMCB0byA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9NSVhfTUFYVk9MVU1FPC9UVAorPiBhbmQgc2hvdWxkIGJlIHNldCB0byB0aGUgbWF4aW11bQordmFsdWUgZm9yIGZ1bGwgYXVkaW8gdm9sdW1lLiBOb3RlIHRoaXMgZG9lcyBub3QgY2hhbmdlIGhhcmR3YXJlIHZvbHVtZS4gVGhpcyBpcworcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlIC0tIHlvdSBjYW4gbWl4IHlvdXIgb3duIGF1ZGlvIGRhdGEuPC9QCis+PERJVgorQ0xBU1M9Ik5PVEUiCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJOT1RFIgorPjxQCis+PEIKKz5Ob3RlOiA8L0IKKz5EbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIG1peGluZyB0b2dldGhlciBtb3JlIHRoYW4gdHdvIHN0cmVhbXMgb2Ygc2FtcGxlCitkYXRhLiBUaGUgb3V0cHV0IGZyb20gcmVwZWF0ZWQgYXBwbGljYXRpb24gb2YgdGhpcyBmdW5jdGlvbiBtYXkgYmUgZGlzdG9ydGVkCitieSBjbGlwcGluZywgYmVjYXVzZSB0aGVyZSBpcyBubyBhY2N1bXVsYXRvciB3aXRoIGdyZWF0ZXIgcmFuZ2UgdGhhbiB0aGUKK2lucHV0IChub3QgdG8gbWVudGlvbiB0aGlzIGJlaW5nIGFuIGluZWZmaWNpZW50IHdheSBvZiBkb2luZyBpdCkuCitVc2UgbWl4aW5nIGZ1bmN0aW9ucyBmcm9tIFNETF9taXhlciwgT3BlbkFMLCBvciB3cml0ZSB5b3VyIG93biBtaXhlciBpbnN0ZWFkLjwvUAorPjwvQkxPQ0tRVU9URQorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjcxMjUiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsb3BlbmF1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX09wZW5BdWRpbzwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNvbnZlcnRhdWRpby5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGxvY2thdWRpby5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NvbnZlcnRBdWRpbzwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0xvY2tBdWRpbzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxtb3VzZWJ1dHRvbmV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG1vdXNlYnV0dG9uZXZlbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGI0MGRmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxtb3VzZWJ1dHRvbmV2ZW50Lmh0bWwKQEAgLTAsMCArMSwzNDYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfTW91c2VCdXR0b25FdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX01vdXNlTW90aW9uRXZlbnQiCitIUkVGPSJzZGxtb3VzZW1vdGlvbmV2ZW50Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveUF4aXNFdmVudCIKK0hSRUY9InNkbGpveWF4aXNldmVudC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxtb3VzZW1vdGlvbmV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxqb3lheGlzZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExNT1VTRUJVVFRPTkVWRU5UIgorPjwvQQorPlNETF9Nb3VzZUJ1dHRvbkV2ZW50PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU40MTQ0IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX01vdXNlQnV0dG9uRXZlbnQmbmJzcDstLSZuYnNwO01vdXNlIGJ1dHRvbiBldmVudCBzdHJ1Y3R1cmU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDE0NyIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGU7CisgIFVpbnQ4IGJ1dHRvbjsKKyAgVWludDggc3RhdGU7CisgIFVpbnQxNiB4LCB5OworfSBTRExfTW91c2VCdXR0b25FdmVudDs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MTUwIgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEYXRhPC9IMgorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU40MTUyIgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjAiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUQk9EWQorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnR5cGU8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9NT1VTRUJVVFRPTkRPV048L1RUCis+IG9yIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01PVVNFQlVUVE9OVVA8L1RUCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5idXR0b248L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UaGUgbW91c2UgYnV0dG9uIGluZGV4IChTRExfQlVUVE9OX0xFRlQsIFNETF9CVVRUT05fTUlERExFLCBTRExfQlVUVE9OX1JJR0hUKTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c3RhdGU8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9QUkVTU0VEPC9UVAorPiBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9SRUxFQVNFRDwvVFQKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPng8L0kKKz48L1RUCis+LCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnk8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UaGUgWC9ZIGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBhdCBwcmVzcy9yZWxlYXNlIHRpbWU8L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40MTc2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Nb3VzZUJ1dHRvbkV2ZW50PC9TUEFOCis+IGlzIGEgbWVtYmVyIG9mIHRoZSA8QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+IHVuaW9uIGFuZCBpcyB1c2VkIHdoZW4gYW4gZXZlbnQgb2YgdHlwZSA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9NT1VTRUJVVFRPTkRPV048L1RUCis+IG9yIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01PVVNFQlVUVE9OVVA8L1RUCis+IGlzIHJlcG9ydGVkLjwvUAorPjxQCis+V2hlbiBhIG1vdXNlIGJ1dHRvbiBwcmVzcyBvciByZWxlYXNlIGlzIGRldGVjdGVkIHRoZW4gbnVtYmVyIG9mIHRoZSBidXR0b24gcHJlc3NlZCAoZnJvbSAxIHRvIDI1NSwgd2l0aCAxIHVzdWFsbHkgYmVpbmcgdGhlIGxlZnQgYnV0dG9uIGFuZCAyIHRoZSByaWdodCkgaXMgcGxhY2VkIGludG8gPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5idXR0b248L0kKKz48L1RUCis+LCB0aGUgcG9zaXRpb24gb2YgdGhlIG1vdXNlIHdoZW4gdGhpcyBldmVudCBvY2N1cmVkIGlzIHN0b3JlZCBpbiB0aGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz54PC9JCis+PC9UVAorPiBhbmQgdGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+eTwvSQorPjwvVFQKKz4gZmllbGRzLiBMaWtlIDxBCitIUkVGPSJzZGxrZXlib2FyZGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9LZXlib2FyZEV2ZW50PC9TUEFOCis+PC9BCis+LCBpbmZvcm1hdGlvbiBvbiB3aGV0aGVyIHRoZSBldmVudCB3YXMgYSBwcmVzcyBvciBhIHJlbGVhc2UgZXZlbnQgaXMgc3RvcmVkIGluIGJvdGggdGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz4gYW5kIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c3RhdGU8L0kKKz48L1RUCis+IGZpZWxkcywgYnV0IHRoaXMgc2hvdWxkIGJlIG9idmlvdXMuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQxOTIiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbG1vdXNlbW90aW9uZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX01vdXNlTW90aW9uRXZlbnQ8L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbG1vdXNlbW90aW9uZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lheGlzZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Nb3VzZU1vdGlvbkV2ZW50PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveUF4aXNFdmVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxtb3VzZW1vdGlvbmV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG1vdXNlbW90aW9uZXZlbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2M3Y2I1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxtb3VzZW1vdGlvbmV2ZW50Lmh0bWwKQEAgLTAsMCArMSwzNjUgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfTW91c2VNb3Rpb25FdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0tleWJvYXJkRXZlbnQiCitIUkVGPSJzZGxrZXlib2FyZGV2ZW50Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX01vdXNlQnV0dG9uRXZlbnQiCitIUkVGPSJzZGxtb3VzZWJ1dHRvbmV2ZW50Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGtleWJvYXJkZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG1vdXNlYnV0dG9uZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExNT1VTRU1PVElPTkVWRU5UIgorPjwvQQorPlNETF9Nb3VzZU1vdGlvbkV2ZW50PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU40MDc5IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX01vdXNlTW90aW9uRXZlbnQmbmJzcDstLSZuYnNwO01vdXNlIG1vdGlvbiBldmVudCBzdHJ1Y3R1cmU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDA4MiIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGU7CisgIFVpbnQ4IHN0YXRlOworICBVaW50MTYgeCwgeTsKKyAgU2ludDE2IHhyZWwsIHlyZWw7Cit9IFNETF9Nb3VzZU1vdGlvbkV2ZW50OzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQwODUiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjQwODciCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01PVVNFTU9USU9OPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c3RhdGU8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UaGUgY3VycmVudCBidXR0b24gc3RhdGU8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPng8L0kKKz48L1RUCis+LCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnk8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5UaGUgWC9ZIGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+eHJlbDwvSQorPjwvVFQKKz4sIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+eXJlbDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlJlbGF0aXZlIG1vdGlvbiBpbiB0aGUgWC9ZIGRpcmVjdGlvbjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQxMDkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX01vdXNlTW90aW9uRXZlbnQ8L1NQQU4KKz4gaXMgYSBtZW1iZXIgb2YgdGhlIDxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4gdW5pb24gYW5kIGlzIHVzZWQgd2hlbiBhbiBldmVudCBvZiB0eXBlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX01PVVNFTU9USU9OPC9UVAorPiBpcyByZXBvcnRlZC48L1AKKz48UAorPlNpbXBseSBwdXQsIGEgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfTU9VU0VNT1RJT048L1RUCis+IHR5cGUgZXZlbnQgb2NjdXJzIHdoZW4gYSB1c2VyIG1vdmVzIHRoZSBtb3VzZSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIHdpbmRvdyBvciB3aGVuIDxBCitIUkVGPSJzZGx3YXJwbW91c2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfV2FycE1vdXNlPC9UVAorPjwvQQorPiBpcyBjYWxsZWQuIEJvdGggdGhlIGFic29sdXRlICg8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPng8L0kKKz48L1RUCis+IGFuZCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnk8L0kKKz48L1RUCis+KSBhbmQgcmVsYXRpdmUgKDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+eHJlbDwvSQorPjwvVFQKKz4gYW5kIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+eXJlbDwvSQorPjwvVFQKKz4pIGNvb3JkaW5hdGVzIGFyZSByZXBvcnRlZCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IGJ1dHRvbiBzdGF0ZXMgKDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c3RhdGU8L0kKKz48L1RUCis+KS4gVGhlIGJ1dHRvbiBzdGF0ZSBjYW4gYmUgaW50ZXJwcmV0ZWQgdXNpbmcgdGhlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0JVVFRPTjwvVFQKKz4gbWFjcm8gKHNlZSA8QQorSFJFRj0ic2RsZ2V0bW91c2VzdGF0ZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRNb3VzZVN0YXRlPC9UVAorPjwvQQorPikuPC9QCis+PFAKKz5JZiB0aGUgY3Vyc29yIGlzIGhpZGRlbiAoPEEKK0hSRUY9InNkbHNob3djdXJzb3IuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2hvd0N1cnNvcjwvVFQKKz4oMCk8L0EKKz4pIGFuZCB0aGUgaW5wdXQgaXMgZ3JhYmJlZCAoPEEKK0hSRUY9InNkbHdtZ3JhYmlucHV0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1dNX0dyYWJJbnB1dDwvVFQKKz4oU0RMX0dSQUJfT04pPC9BCis+KSwgdGhlbiB0aGUgbW91c2Ugd2lsbCBnaXZlIHJlbGF0aXZlIG1vdGlvbiBldmVudHMgZXZlbiB3aGVuIHRoZSBjdXJzb3IgcmVhY2hlcyB0aGUgZWRnZSBmbyB0aGUgc2NyZWVuLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4L1VuaXgtYS1saWtlcy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDEzMyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2RsbW91c2VidXR0b25ldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfTW91c2VCdXR0b25FdmVudDwvU1BBTgorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsa2V5Ym9hcmRldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbG1vdXNlYnV0dG9uZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9LZXlib2FyZEV2ZW50PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX01vdXNlQnV0dG9uRXZlbnQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbXV0ZXhwLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG11dGV4cC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzJjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG11dGV4cC5odG1sCkBAIC0wLDAgKzEsMjQxIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX211dGV4UDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJNdWx0aS10aHJlYWRlZCBQcm9ncmFtbWluZyIKK0hSRUY9InRocmVhZC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfRGVzdHJveU11dGV4IgorSFJFRj0ic2RsZGVzdHJveW11dGV4Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX211dGV4ViIKK0hSRUY9InNkbG11dGV4di5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxkZXN0cm95bXV0ZXguaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG11dGV4di5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETE1VVEVYUCIKKz48L0EKKz5TRExfbXV0ZXhQPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43ODcyIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX211dGV4UCZuYnNwOy0tJm5ic3A7TG9jayBhIG11dGV4PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjc4NzUiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONzg3NiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfbXV0ZXhQPC9CCis+PC9DT0RFCis+KFNETF9tdXRleCAqbXV0ZXgpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONzg4MiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkxvY2tzIHRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5tdXRleDwvSQorPjwvVFQKKz4sIHdoaWNoIHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgd2l0aCA8QQorSFJFRj0ic2RsY3JlYXRlbXV0ZXguaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlTXV0ZXg8L1RUCis+PC9BCis+LiBJZiB0aGUgbXV0ZXggaXMgYWxyZWFkeSBsb2NrZWQgdGhlbiA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfbXV0ZXhQPC9UVAorPiB3aWxsIG5vdCByZXR1cm4gdW50aWwgaXQgaXMgPEEKK0hSRUY9InNkbG11dGV4di5odG1sIgorPnVubG9ja2VkPC9BCis+LiBSZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBvbiBzdWNjZXNzLCBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IG9uIGFuIGVycm9yLjwvUAorPjxQCis+U0RMIGFsc28gZGVmaW5lcyBhIG1hY3JvIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+I2RlZmluZSBTRExfTG9ja011dGV4KG0pIFNETF9tdXRleFAobSk8L1RUCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43ODk0IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZW11dGV4Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NyZWF0ZU11dGV4PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxtdXRleHYuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfbXV0ZXhWPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZGVzdHJveW11dGV4Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsbXV0ZXh2Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfRGVzdHJveU11dGV4PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX211dGV4VjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxtdXRleHYuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbXV0ZXh2Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhNjhiZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsbXV0ZXh2Lmh0bWwKQEAgLTAsMCArMSwyMzUgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfbXV0ZXhWPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9Ik11bHRpLXRocmVhZGVkIFByb2dyYW1taW5nIgorSFJFRj0idGhyZWFkLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9tdXRleFAiCitIUkVGPSJzZGxtdXRleHAuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ3JlYXRlU2VtYXBob3JlIgorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG11dGV4cC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMTVVURVhWIgorPjwvQQorPlNETF9tdXRleFY8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjc5MDUiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfbXV0ZXhWJm5ic3A7LS0mbmJzcDtVbmxvY2sgYSBtdXRleDwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU43OTA4IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjc5MDkiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX211dGV4VjwvQgorPjwvQ09ERQorPihTRExfbXV0ZXggKm11dGV4KTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc5MTUiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5VbmxvY2tzIHRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5tdXRleDwvSQorPjwvVFQKKz4sIHdoaWNoIHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgd2l0aCA8QQorSFJFRj0ic2RsY3JlYXRlbXV0ZXguaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlTXV0ZXg8L1RUCis+PC9BCis+LiBSZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBvbiBzdWNjZXNzLCBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IG9uIGFuIGVycm9yLjwvUAorPjxQCis+U0RMIGFsc28gZGVmaW5lcyBhIG1hY3JvIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+I2RlZmluZSBTRExfVW5sb2NrTXV0ZXgobSkgU0RMX211dGV4VihtKTwvVFQKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc5MjUiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY3JlYXRlbXV0ZXguaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlTXV0ZXg8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbG11dGV4cC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9tdXRleFA8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxtdXRleHAuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjcmVhdGVzZW1hcGhvcmUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9tdXRleFA8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ3JlYXRlU2VtYXBob3JlPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG51bWpveXN0aWNrcy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxudW1qb3lzdGlja3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUzZTNhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxudW1qb3lzdGlja3MuaHRtbApAQCAtMCwwICsxLDIyMiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9OdW1Kb3lzdGlja3M8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iSm95c3RpY2siCitIUkVGPSJqb3lzdGljay5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJKb3lzdGljayIKK0hSRUY9ImpveXN0aWNrLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0pveXN0aWNrTmFtZSIKK0hSRUY9InNkbGpveXN0aWNrbmFtZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJqb3lzdGljay5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsam95c3RpY2tuYW1lLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMTlVNSk9ZU1RJQ0tTIgorPjwvQQorPlNETF9OdW1Kb3lzdGlja3M8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjYwMzkiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfTnVtSm95c3RpY2tzJm5ic3A7LS0mbmJzcDtDb3VudCBhdmFpbGFibGUgam95c3RpY2tzLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU42MDQyIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjYwNDMiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfTnVtSm95c3RpY2tzPC9CCis+PC9DT0RFCis+KHZvaWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjA0OSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPkNvdW50cyB0aGUgbnVtYmVyIG9mIGpveXN0aWNrcyBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MDUyIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgdGhlIG51bWJlciBvZiBhdHRhY2hlZCBqb3lzdGlja3M8L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjA1NSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxqb3lzdGlja25hbWUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tOYW1lPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxqb3lzdGlja29wZW4uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSm95c3RpY2tPcGVuPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iam95c3RpY2suaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3lzdGlja25hbWUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPkpveXN0aWNrPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iam95c3RpY2suaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfSm95c3RpY2tOYW1lPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG9wZW5hdWRpby5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxvcGVuYXVkaW8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ZlZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxvcGVuYXVkaW8uaHRtbApAQCAtMCwwICsxLDU3OCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9PcGVuQXVkaW88L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQXVkaW8iCitIUkVGPSJhdWRpby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfQXVkaW9TcGVjIgorSFJFRj0ic2RsYXVkaW9zcGVjLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1BhdXNlQXVkaW8iCitIUkVGPSJzZGxwYXVzZWF1ZGlvLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGF1ZGlvc3BlYy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RscGF1c2VhdWRpby5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETE9QRU5BVURJTyIKKz48L0EKKz5TRExfT3BlbkF1ZGlvPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42NjUwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX09wZW5BdWRpbyZuYnNwOy0tJm5ic3A7T3BlbnMgdGhlIGF1ZGlvIGRldmljZSB3aXRoIHRoZSBkZXNpcmVkIHBhcmFtZXRlcnMuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjY2NTMiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONjY1NCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9PcGVuQXVkaW88L0IKKz48L0NPREUKKz4oU0RMX0F1ZGlvU3BlYyAqZGVzaXJlZCwgU0RMX0F1ZGlvU3BlYyAqb2J0YWluZWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjY2MCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGF1ZGlvIGRldmljZSB3aXRoIHRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kZXNpcmVkPC9JCis+PC9UVAorPiBwYXJhbWV0ZXJzLCBhbmQKK3JldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBwbGFjaW5nIHRoZSBhY3R1YWwgaGFyZHdhcmUgcGFyYW1ldGVycyBpbiB0aGUKK3N0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm9idGFpbmVkPC9JCis+PC9UVAorPi4gIElmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm9idGFpbmVkPC9JCis+PC9UVAorPiBpcyBOVUxMLCB0aGUgYXVkaW8KK2RhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGd1YXJhbnRlZWQgdG8gYmUgaW4gdGhlCityZXF1ZXN0ZWQgZm9ybWF0LCBhbmQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byB0aGUgaGFyZHdhcmUKK2F1ZGlvIGZvcm1hdCBpZiBuZWNlc3NhcnkuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgLTEgaWYgaXQgZmFpbGVkIAordG8gb3BlbiB0aGUgYXVkaW8gZGV2aWNlLCBvciBjb3VsZG4ndCBzZXQgdXAgdGhlIGF1ZGlvIHRocmVhZC48L1AKKz48UAorPlRvIG9wZW4gdGhlIGF1ZGlvIGRldmljZSBhIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRlc2lyZWQ8L0kKKz48L1RUCis+IDxBCitIUkVGPSJzZGxhdWRpb3NwZWMuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0F1ZGlvU3BlYzwvU1BBTgorPjwvQQorPiBtdXN0IGJlIGNyZWF0ZWQuCis8UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+U0RMX0F1ZGlvU3BlYyAqZGVzaXJlZDsKKy4KKy4KK2Rlc2lyZWQgPSBtYWxsb2Moc2l6ZW9mKFNETF9BdWRpb1NwZWMpKTs8L1BSRQorPgorWW91IG11c3QgdGhlbiBmaWxsIHRoaXMgc3RydWN0dXJlIHdpdGggeW91ciBkZXNpcmVkIGF1ZGlvIHNwZWNpZmljYXRpb25zLjwvUAorPjxQCis+PC9QCis+PERJVgorQ0xBU1M9IlZBUklBQkxFTElTVCIKKz48REwKKz48RFQKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+ZGVzaXJlZDwvU1BBTgorPi0mIzYyOzxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+ZnJlcTwvSQorPjwvVFQKKz48L0RUCis+PERECis+PFAKKz5UaGUgZGVzaXJlZCBhdWRpbyBmcmVxdWVuY3kgaW4gc2FtcGxlcy1wZXItc2Vjb25kLjwvUAorPjwvREQKKz48RFQKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+ZGVzaXJlZDwvU1BBTgorPi0mIzYyOzxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Zm9ybWF0PC9JCis+PC9UVAorPjwvRFQKKz48REQKKz48UAorPlRoZSBkZXNpcmVkIGF1ZGlvIGZvcm1hdCAoc2VlIDxBCitIUkVGPSJzZGxhdWRpb3NwZWMuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0F1ZGlvU3BlYzwvU1BBTgorPjwvQQorPik8L1AKKz48L0RECis+PERUCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPmRlc2lyZWQ8L1NQQU4KKz4tJiM2Mjs8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnNhbXBsZXM8L0kKKz48L1RUCis+PC9EVAorPjxERAorPjxQCis+VGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgYXVkaW8gYnVmZmVyIGluIHNhbXBsZXMuIFRoaXMgbnVtYmVyIHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3bywgYW5kIG1heSBiZSBhZGp1c3RlZCBieSB0aGUgYXVkaW8gZHJpdmVyIHRvIGEgdmFsdWUgbW9yZSBzdWl0YWJsZSBmb3IgdGhlIGhhcmR3YXJlLiAgR29vZCB2YWx1ZXMgc2VlbSB0byByYW5nZSBiZXR3ZWVuIDUxMiBhbmQgODE5MiBpbmNsdXNpdmUsIGRlcGVuZGluZyBvbiB0aGUgYXBwbGljYXRpb24gYW5kIENQVSBzcGVlZC4gIFNtYWxsZXIgdmFsdWVzIHlpZWxkIGZhc3RlciByZXNwb25zZSB0aW1lLCBidXQgY2FuIGxlYWQgdG8gdW5kZXJmbG93IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBkb2luZyBoZWF2eSBwcm9jZXNzaW5nIGFuZCBjYW5ub3QgZmlsbCB0aGUgYXVkaW8gYnVmZmVyIGluIHRpbWUuICBBIHN0ZXJlbyBzYW1wbGUgY29uc2lzdHMgb2YgYm90aCByaWdodCBhbmQgbGVmdCBjaGFubmVscyBpbiBMUiBvcmRlcmluZy4gIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgZGlyZWN0bHkgcmVsYXRlZCB0byB0aW1lIGJ5IHRoZSBmb2xsb3dpbmcgZm9ybXVsYTogIG1zID0gKHNhbXBsZXMqMTAwMCkvZnJlcTwvUAorPjwvREQKKz48RFQKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+ZGVzaXJlZDwvU1BBTgorPi0mIzYyOzxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Y2FsbGJhY2s8L0kKKz48L1RUCis+PC9EVAorPjxERAorPjxQCis+VGhpcyBzaG91bGQgYmUgc2V0IHRvIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgaXMgcmVhZHkgZm9yIG1vcmUgZGF0YS4gIEl0IGlzIHBhc3NlZCBhIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIGJ1ZmZlciwgYW5kIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGF1ZGlvIGJ1ZmZlci4gVGhpcyBmdW5jdGlvbiB1c3VhbGx5IHJ1bnMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQsIGFuZCBzbyB5b3Ugc2hvdWxkIHByb3RlY3QgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaXQgYWNjZXNzZXMgYnkgY2FsbGluZyA8QQorSFJFRj0ic2RsbG9ja2F1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvY2tBdWRpbzwvVFQKKz48L0EKKz4gYW5kIDxBCitIUkVGPSJzZGx1bmxvY2thdWRpby5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9VbmxvY2tBdWRpbzwvVFQKKz48L0EKKz4gaW4geW91ciBjb2RlLiBUaGUgY2FsbGJhY2sgcHJvdG90eXBlIGlzOgorPFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnZvaWQgY2FsbGJhY2sodm9pZCAqdXNlcmRhdGEsIFVpbnQ4ICpzdHJlYW0sIGludCBsZW4pOzwvUFJFCis+Cis8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz51c2VyZGF0YTwvSQorPjwvVFQKKz4gaXMgdGhlIHBvaW50ZXIgc3RvcmVkIGluIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dXNlcmRhdGE8L0kKKz48L1RUCis+IGZpZWxkIG9mIHRoZSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0F1ZGlvU3BlYzwvU1BBTgorPi4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c3RyZWFtPC9JCis+PC9UVAorPiBpcyBhIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIGJ1ZmZlciB5b3Ugd2FudCB0byBmaWxsIHdpdGggaW5mb3JtYXRpb24gYW5kIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmxlbjwvSQorPjwvVFQKKz4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgYXVkaW8gYnVmZmVyIGluIGJ5dGVzLjwvUAorPjwvREQKKz48RFQKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+ZGVzaXJlZDwvU1BBTgorPi0mIzYyOzxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dXNlcmRhdGE8L0kKKz48L1RUCis+PC9EVAorPjxERAorPjxQCis+VGhpcyBwb2ludGVyIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIHRoZSA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5jYWxsYmFjazwvVFQKKz4gZnVuY3Rpb24uPC9QCis+PC9ERAorPjwvREwKKz48L0RJVgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX09wZW5BdWRpbzwvVFQKKz4gcmVhZHMgdGhlc2UgZmllbGRzIGZyb20gdGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRlc2lyZWQ8L0kKKz48L1RUCis+IDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQXVkaW9TcGVjPC9TUEFOCis+IHN0cnVjdHVyZSBwYXNzIHRvIHRoZSBmdW5jdGlvbiBhbmQgYXR0ZW1wdHMgdG8gZmluZCBhbiBhdWRpbyBjb25maWd1cmF0aW9uIG1hdGNoaW5nIHlvdXIgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZGVzaXJlZDwvSQorPjwvVFQKKz4uIEFzIG1lbnRpb25lZCBhYm92ZSwgaWYgdGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm9idGFpbmVkPC9JCis+PC9UVAorPiBwYXJhbWV0ZXIgaXMgPFRUCitDTEFTUz0iTElURVJBTCIKKz5OVUxMPC9UVAorPiB0aGVuIFNETCB3aXRoIGNvbnZlcnQgZnJvbSB5b3VyIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRlc2lyZWQ8L0kKKz48L1RUCis+IGF1ZGlvIHNldHRpbmdzIHRvIHRoZSBoYXJkd2FyZSBzZXR0aW5ncyBhcyBpdCBwbGF5cy48L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm9idGFpbmVkPC9JCis+PC9UVAorPiBpcyA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+IHRoZW4gdGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmRlc2lyZWQ8L0kKKz48L1RUCis+IDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQXVkaW9TcGVjPC9TUEFOCis+IGlzIHlvdXIgd29ya2luZyBzcGVjaWZpY2F0aW9uLCBvdGhlcndpc2UgdGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm9idGFpbmVkPC9JCis+PC9UVAorPiA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0F1ZGlvU3BlYzwvU1BBTgorPiBiZWNvbWVzIHRoZSB3b3JraW5nIHNwZWNpZmljYXRpb24gYW5kIHRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kZXNpcmVjPC9JCis+PC9UVAorPiBzcGVjaWZpY2F0aW9uIGNhbiBiZSBkZWxldGVkLiBUaGUgZGF0YSBpbiB0aGUgd29ya2luZyBzcGVjaWZpY2F0aW9uIGlzIHVzZWQgd2hlbiBidWlsZGluZyA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0F1ZGlvQ1ZUPC9TUEFOCis+J3MgZm9yIGNvbnZlcnRpbmcgbG9hZGVkIGRhdGEgdG8gdGhlIGhhcmR3YXJlIGZvcm1hdC48L1AKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9PcGVuQXVkaW88L1RUCis+IGNhbGN1bGF0ZXMgdGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c2l6ZTwvSQorPjwvVFQKKz4gYW5kIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c2lsZW5jZTwvSQorPjwvVFQKKz4gZmllbGRzIGZvciBib3RoIHRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5kZXNpcmVkPC9JCis+PC9UVAorPiBhbmQgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+b2J0YWluZWQ8L0kKKz48L1RUCis+IHNwZWNpZmljYXRpb25zLiBUaGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5zaXplPC9JCis+PC9UVAorPiBmaWVsZCBzdG9yZXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGF1ZGlvIGJ1ZmZlciBpbiBieXRlcywgd2hpbGUgdGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c2lsZW5jZTwvSQorPjwvVFQKKz4gc3RvcmVzIHRoZSB2YWx1ZSB1c2VkIHRvIHJlcHJlc2VudCBzaWxlbmNlIGluIHRoZSBhdWRpbyBidWZmZXI8L1AKKz48UAorPlRoZSBhdWRpbyBkZXZpY2Ugc3RhcnRzIG91dCBwbGF5aW5nIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+c2lsZW5jZTwvSQorPjwvVFQKKz4gd2hlbiBpdCdzIG9wZW5lZCwgYW5kIHNob3VsZCBiZSBlbmFibGVkIGZvciBwbGF5aW5nIGJ5IGNhbGxpbmcgPEEKK0hSRUY9InNkbHBhdXNlYXVkaW8uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUGF1c2VBdWRpbzwvVFQKKz4oPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+MDwvSQorPjwvVFQKKz4pPC9BCis+IHdoZW4geW91IGFyZSByZWFkeSBmb3IgeW91ciBhdWRpbyA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmNhbGxiYWNrPC9JCis+PC9UVAorPiBmdW5jdGlvbiB0byBiZSBjYWxsZWQuICBTaW5jZSB0aGUgYXVkaW8gZHJpdmVyIG1heSBtb2RpZnkgdGhlIHJlcXVlc3RlZCA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnNpemU8L0kKKz48L1RUCis+IG9mIHRoZSBhdWRpbyBidWZmZXIsIHlvdSBzaG91bGQgYWxsb2NhdGUgYW55IGxvY2FsIG1peGluZyBidWZmZXJzIGFmdGVyIHlvdSBvcGVuIHRoZSBhdWRpbyBkZXZpY2UuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY3NDciCis+PC9BCis+PEgyCis+RXhhbXBsZXM8L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPi8qIFByb3RvdHlwZSBvZiBvdXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3ZvaWQgbXlfYXVkaW9fY2FsbGJhY2sodm9pZCAqdXNlcmRhdGEsIFVpbnQ4ICpzdHJlYW0sIGludCBsZW4pOworCisvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KK1NETF9BdWRpb1NwZWMgKmRlc2lyZWQsICpvYnRhaW5lZDsKK1NETF9BdWRpb1NwZWMgKmhhcmR3YXJlX3NwZWM7CisKKy8qIEFsbG9jYXRlIGEgZGVzaXJlZCBTRExfQXVkaW9TcGVjICovCitkZXNpcmVkID0gbWFsbG9jKHNpemVvZihTRExfQXVkaW9TcGVjKSk7CisKKy8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgb2J0YWluZWQgU0RMX0F1ZGlvU3BlYyAqLworb2J0YWluZWQgPSBtYWxsb2Moc2l6ZW9mKFNETF9BdWRpb1NwZWMpKTsKKworLyogMjIwNTBIeiAtIEZNIFJhZGlvIHF1YWxpdHkgKi8KK2Rlc2lyZWQtJiM2MjtmcmVxPTIyMDUwOworCisvKiAxNi1iaXQgc2lnbmVkIGF1ZGlvICovCitkZXNpcmVkLSYjNjI7Zm9ybWF0PUFVRElPX1MxNkxTQjsKKworLyogTW9ubyAqLworZGVzaXJlZC0mIzYyO2NoYW5uZWxzPTA7CisKKy8qIExhcmdlIGF1ZGlvIGJ1ZmZlciByZWR1Y2VzIHJpc2sgb2YgZHJvcG91dHMgYnV0IGluY3JlYXNlcyByZXNwb25zZSB0aW1lICovCitkZXNpcmVkLSYjNjI7c2FtcGxlcz04MTkyOworCisvKiBPdXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK2Rlc2lyZWQtJiM2MjtjYWxsYmFjaz1teV9hdWRpb19jYWxsYmFjazsKKworZGVzaXJlZC0mIzYyO3VzZXJkYXRhPU5VTEw7CisKKy8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLworaWYgKCBTRExfT3BlbkF1ZGlvKGRlc2lyZWQsIG9idGFpbmVkKSAmIzYwOyAwICl7CisgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgb3BlbiBhdWRpbzogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgZXhpdCgtMSk7Cit9CisvKiBkZXNpcmVkIHNwZWMgaXMgbm8gbG9uZ2VyIG5lZWRlZCAqLworZnJlZShkZXNpcmVkKTsKK2hhcmR3YXJlX3NwZWM9b2J0YWluZWQ7CisuCisuCisvKiBQcmVwYXJlIGNhbGxiYWNrIGZvciBwbGF5aW5nICovCisuCisuCisuCisvKiBTdGFydCBwbGF5aW5nICovCitTRExfUGF1c2VBdWRpbygwKTs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42NzUwIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGF1ZGlvc3BlYy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9BdWRpb1NwZWM8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGxvY2thdWRpby5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Mb2NrQXVkaW88L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHVubG9ja2F1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1VubG9ja0F1ZGlvPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxwYXVzZWF1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1BhdXNlQXVkaW88L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxhdWRpb3NwZWMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxwYXVzZWF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQXVkaW9TcGVjPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iYXVkaW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfUGF1c2VBdWRpbzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxvdmVybGF5Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbG92ZXJsYXkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjI5MTllCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxvdmVybGF5Lmh0bWwKQEAgLTAsMCArMSwzNjIgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfT3ZlcmxheTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9WaWRlb0luZm8iCitIUkVGPSJzZGx2aWRlb2luZm8uaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJXaW5kb3cgTWFuYWdlbWVudCIKK0hSRUY9IndtLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHZpZGVvaW5mby5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0id20uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExPVkVSTEFZIgorPjwvQQorPlNETF9PdmVybGF5PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4zNDY0IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX092ZXJsYXkmbmJzcDstLSZuYnNwO1lVViB2aWRlbyBvdmVybGF5PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM0NjciCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBVaW50MzIgZm9ybWF0OworICBpbnQgdywgaDsKKyAgaW50IHBsYW5lczsKKyAgVWludDE2ICpwaXRjaGVzOworICBVaW50OCAqKnBpeGVsczsKKyAgVWludDMyIGh3X292ZXJsYXk6MTsKK30gU0RMX092ZXJsYXk7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzQ3MCIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGF0YTwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVOMzQ3MiIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5mb3JtYXQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5PdmVybGF5IGZvcm1hdCAoc2VlIGJlbG93KTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dywgaDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPldpZHRoIGFuZCBoZWlnaHQgb2Ygb3ZlcmxheTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+cGxhbmVzPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+TnVtYmVyIG9mIHBsYW5lcyBpbiB0aGUgb3ZlcmxheS4gVXN1YWxseSBlaXRoZXIgMSBvciAzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5waXRjaGVzPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QW4gYXJyYXkgb2YgcGl0Y2hlcywgb25lIGZvciBlYWNoIHBsYW5lLiBQaXRjaCBpcyB0aGUgbGVuZ3RoIG9mIGEgcm93IGluIGJ5dGVzLjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+cGl4ZWxzPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGVoIGRhdGEgb2YgZWFjaCBwbGFuZS4gVGhlIG92ZXJsYXkgc2hvdWxkIGJlIGxvY2tlZCBiZWZvcmUgdGhlc2UgcG9pbnRlcnMgYXJlIHVzZWQuPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5od19vdmVybGF5PC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+VGhpcyB3aWxsIGJlIHNldCB0byAxIGlmIHRoZSBvdmVybGF5IGlzIGhhcmR3YXJlIGFjY2VsZXJhdGVkLjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM0OTkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5BIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfT3ZlcmxheTwvU1BBTgorPiBpcyBzaW1pbGFyIHRvIGEgPEEKK0hSRUY9InNkbHN1cmZhY2UuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1N1cmZhY2U8L1NQQU4KKz48L0EKKz4gZXhjZXB0IGl0IHN0b3JlcyBhIFlVViBvdmVybGF5LiBBbGwgdGhlIGZpZWxkcyBhcmUgcmVhZCBvbmx5LCBleGNlcHQgZm9yIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+cGl4ZWxzPC9JCis+PC9UVAorPiB3aGljaCBzaG91bGQgYmUgPEEKK0hSRUY9InNkbGxvY2t5dXZvdmVybGF5Lmh0bWwiCis+bG9ja2VkPC9BCis+IGJlZm9yZSB1c2UuIFRoZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmZvcm1hdDwvSQorPjwvVFQKKz4gZmllbGQgc3RvcmVzIHRoZSBmb3JtYXQgb2YgdGhlIG92ZXJsYXkgd2hpY2ggaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Cis8UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+I2RlZmluZSBTRExfWVYxMl9PVkVSTEFZICAweDMyMzE1NjU5ICAvKiBQbGFuYXIgbW9kZTogWSArIFYgKyBVICovCisjZGVmaW5lIFNETF9JWVVWX09WRVJMQVkgIDB4NTY1NTU5NDkgIC8qIFBsYW5hciBtb2RlOiBZICsgVSArIFYgKi8KKyNkZWZpbmUgU0RMX1lVWTJfT1ZFUkxBWSAgMHgzMjU5NTU1OSAgLyogUGFja2VkIG1vZGU6IFkwK1UwK1kxK1YwICovCisjZGVmaW5lIFNETF9VWVZZX09WRVJMQVkgIDB4NTk1NjU5NTUgIC8qIFBhY2tlZCBtb2RlOiBVMCtZMCtWMCtZMSAqLworI2RlZmluZSBTRExfWVZZVV9PVkVSTEFZICAweDU1NTk1NjU5ICAvKiBQYWNrZWQgbW9kZTogWTArVjArWTErVTAgKi88L1BSRQorPgorTW9yZSBpbmZvcm1hdGlvbiBvbiBZVVYgZm9ybWF0cyBjYW4gYmUgZm91bmQgYXQgPEEKK0hSRUY9Imh0dHA6Ly93d3cud2ViYXJ0ei5jb20vZm91cmNjL2luZGV4eXV2Lmh0bSIKK1RBUkdFVD0iX3RvcCIKKz5odHRwOi8vd3d3LndlYmFydHouY29tL2ZvdXJjYy9pbmRleHl1di5odG08L0EKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM1MTAiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVZVVZPdmVybGF5PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxsb2NreXV2b3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Mb2NrWVVWT3ZlcmxheTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsdW5sb2NreXV2b3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9VbmxvY2tZVVZPdmVybGF5PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxmcmVleXV2b3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9GcmVlWVVWT3ZlcmxheTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHZpZGVvaW5mby5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9IndtLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfVmlkZW9JbmZvPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5XaW5kb3cgTWFuYWdlbWVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxwYWxldHRlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHBhbGV0dGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDk4YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxwYWxldHRlLmh0bWwKQEAgLTAsMCArMSwzMDEgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfUGFsZXR0ZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Db2xvciIKK0hSRUY9InNkbGNvbG9yLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1BpeGVsRm9ybWF0IgorSFJFRj0ic2RscGl4ZWxmb3JtYXQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY29sb3IuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHBpeGVsZm9ybWF0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMUEFMRVRURSIKKz48L0EKKz5TRExfUGFsZXR0ZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMzEyOSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9QYWxldHRlJm5ic3A7LS0mbmJzcDtDb2xvciBwYWxldHRlIGZvciA4LWJpdCBwaXhlbCBmb3JtYXRzPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMxMzIiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBpbnQgbmNvbG9yczsKKyAgU0RMX0NvbG9yICpjb2xvcnM7Cit9IFNETF9QYWxldHRlOzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMxMzUiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjMxMzciCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+bmNvbG9yczwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPk51bWJlciBvZiBjb2xvcnMgdXNlZCBpbiB0aGlzIHBhbGV0dGU8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmNvbG9yczwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlBvaW50ZXIgdG8gPEEKK0hSRUY9InNkbGNvbG9yLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Db2xvcjwvU1BBTgorPjwvQQorPiBzdHJ1Y3R1cmVzIHRoYXQgbWFrZSB1cCB0aGUgcGFsZXR0ZS48L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zMTUwIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+RWFjaCBwaXhlbCBpbiBhbiA4LWJpdCBzdXJmYWNlIGlzIGFuIGluZGV4IGludG8gdGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Y29sb3JzPC9JCis+PC9UVAorPiBmaWVsZCBvZiB0aGUgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9QYWxldHRlPC9TUEFOCis+IHN0cnVjdHVyZSBzdG9yZSBpbiA8QQorSFJFRj0ic2RscGl4ZWxmb3JtYXQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1BpeGVsRm9ybWF0PC9TUEFOCis+PC9BCis+LiBBIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUGFsZXR0ZTwvU1BBTgorPiBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBjcmVhdGVkIG1hbnVhbGx5LiBJdCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2hlbiBTREwgYWxsb2NhdGVzIGEgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9QaXhlbEZvcm1hdDwvU1BBTgorPiBmb3IgYSBzdXJmYWNlLiBUaGUgY29sb3JzIHZhbHVlcyBvZiBhIDxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+PC9BCis+cyBwYWxldHRlIGNhbiBiZSBzZXQgd2l0aCB0aGUgPEEKK0hSRUY9InNkbHNldGNvbG9ycy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRDb2xvcnM8L1RUCis+PC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zMTYzIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNvbG9yLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Db2xvcjwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNldGNvbG9ycy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRDb2xvcnM8L1RUCis+PC9BCis+Cis8QQorSFJFRj0ic2Rsc2V0cGFsZXR0ZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRQYWxldHRlPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY29sb3IuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0NvbG9yPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfUGl4ZWxGb3JtYXQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscGF1c2VhdWRpby5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxwYXVzZWF1ZGlvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkNWEwZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscGF1c2VhdWRpby5odG1sCkBAIC0wLDAgKzEsMjIxIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1BhdXNlQXVkaW88L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iQXVkaW8iCitIUkVGPSJhdWRpby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfT3BlbkF1ZGlvIgorSFJFRj0ic2Rsb3BlbmF1ZGlvLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0dldEF1ZGlvU3RhdHVzIgorSFJFRj0ic2RsZ2V0YXVkaW9zdGF0dXMuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsb3BlbmF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRhdWRpb3N0YXR1cy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFBBVVNFQVVESU8iCis+PC9BCis+U0RMX1BhdXNlQXVkaW88L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjY3NjUiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfUGF1c2VBdWRpbyZuYnNwOy0tJm5ic3A7UGF1c2VzIGFuZCB1bnBhdXNlcyB0aGUgYXVkaW8gY2FsbGJhY2sgcHJvY2Vzc2luZzwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU42NzY4IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjY3NjkiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1BhdXNlQXVkaW88L0IKKz48L0NPREUKKz4oaW50IHBhdXNlX29uKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY3NzUiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGlzIGZ1bmN0aW9uIHBhdXNlcyBhbmQgdW5wYXVzZXMgdGhlIGF1ZGlvIGNhbGxiYWNrIHByb2Nlc3NpbmcuCitJdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+cGF1c2Vfb248L0kKKz48L1RUCis+PTAgYWZ0ZXIgb3BlbmluZyB0aGUgYXVkaW8KK2RldmljZSB0byBzdGFydCBwbGF5aW5nIHNvdW5kLiAgVGhpcyBpcyBzbyB5b3UgY2FuIHNhZmVseSBpbml0aWFsaXplCitkYXRhIGZvciB5b3VyIGNhbGxiYWNrIGZ1bmN0aW9uIGFmdGVyIG9wZW5pbmcgdGhlIGF1ZGlvIGRldmljZS4KK1NpbGVuY2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBhdWRpbyBkZXZpY2UgZHVyaW5nIHRoZSBwYXVzZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONjc3OSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxnZXRhdWRpb3N0YXR1cy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRBdWRpb1N0YXR1czwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsb3BlbmF1ZGlvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX09wZW5BdWRpbzwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbG9wZW5hdWRpby5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldGF1ZGlvc3RhdHVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfT3BlbkF1ZGlvPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iYXVkaW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfR2V0QXVkaW9TdGF0dXM8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscGVlcGV2ZW50cy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxwZWVwZXZlbnRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhMGZmNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscGVlcGV2ZW50cy5odG1sCkBAIC0wLDAgKzEsMzIxIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1BlZXBFdmVudHM8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iRXZlbnQgRnVuY3Rpb25zLiIKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9QdW1wRXZlbnRzIgorSFJFRj0ic2RscHVtcGV2ZW50cy5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Qb2xsRXZlbnQiCitIUkVGPSJzZGxwb2xsZXZlbnQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RscHVtcGV2ZW50cy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RscG9sbGV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMUEVFUEVWRU5UUyIKKz48L0EKKz5TRExfUGVlcEV2ZW50czwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTQyMSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9QZWVwRXZlbnRzJm5ic3A7LS0mbmJzcDtDaGVja3MgdGhlIGV2ZW50IHF1ZXVlIGZvciBtZXNzYWdlcyBhbmQgb3B0aW9uYWxseSByZXR1cm5zIHRoZW0uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU0MjQiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTQyNSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9QZWVwRXZlbnRzPC9CCis+PC9DT0RFCis+KFNETF9FdmVudCAqZXZlbnRzLCBpbnQgbnVtZXZlbnRzLCBTRExfZXZlbnRhY3Rpb24gYWN0aW9uLCBVaW50MzIgbWFzayk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41NDMxIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+Q2hlY2tzIHRoZSBldmVudCBxdWV1ZSBmb3IgbWVzc2FnZXMgYW5kIG9wdGlvbmFsbHkgcmV0dXJucyB0aGVtLjwvUAorPjxQCis+SWYgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+YWN0aW9uPC9JCis+PC9UVAorPiBpcyA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9BRERFVkVOVDwvVFQKKz4sIHVwIHRvIAorPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+bnVtZXZlbnRzPC9JCis+PC9UVAorPiBldmVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmFjayBvZiB0aGUgZXZlbnQKKyBxdWV1ZS48L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmFjdGlvbjwvSQorPjwvVFQKKz4gaXMgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUEVFS0VWRU5UPC9UVAorPiwgdXAgdG8KKzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm51bWV2ZW50czwvSQorPjwvVFQKKz4gZXZlbnRzIGF0IHRoZSBmcm9udCBvZiB0aGUgZXZlbnQgcXVldWUsIAorbWF0Y2hpbmcgPEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+bWFzazwvSQorPjwvVFQKKz48L0EKKz4sIAord2lsbCBiZSByZXR1cm5lZCBhbmQgd2lsbCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS48L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmFjdGlvbjwvSQorPjwvVFQKKz4gaXMgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfR0VURVZFTlQ8L1RUCis+LCB1cCB0byAKKzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm51bWV2ZW50czwvSQorPjwvVFQKKz4gZXZlbnRzIGF0IHRoZSBmcm9udCBvZiB0aGUgZXZlbnQgcXVldWUsIAorbWF0Y2hpbmcgPEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+bWFzazwvSQorPjwvVFQKKz48L0EKKz4sIAord2lsbCBiZSByZXR1cm5lZCBhbmQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlLjwvUAorPjxQCis+VGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm1hc2s8L0kKKz48L1RUCis+IHBhcmFtZXRlciBpcyBhbiBiaXR3aXNlIE9SIG9mCis8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9FVkVOVE1BU0s8L1RUCis+KDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmV2ZW50X3R5cGU8L0kKKz48L1RUCis+KSwgZm9yIGFsbAorZXZlbnQgdHlwZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluLjwvUAorPjxQCis+VGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTQ1NSIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBldmVudHMgYWN0dWFsbHkgc3RvcmVkLCBvciAKKzxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gaWYgdGhlcmUgd2FzIGFuIGVycm9yLiAgPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU0NTkiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHBvbGxldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Qb2xsRXZlbnQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QdXNoRXZlbnQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxwdW1wZXZlbnRzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RscG9sbGV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfUHVtcEV2ZW50czwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1BvbGxFdmVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxwaXhlbGZvcm1hdC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxwaXhlbGZvcm1hdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMGRkYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHBpeGVsZm9ybWF0Lmh0bWwKQEAgLTAsMCArMSw1MjggQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfUGl4ZWxGb3JtYXQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfUGFsZXR0ZSIKK0hSRUY9InNkbHBhbGV0dGUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU3VyZmFjZSIKK0hSRUY9InNkbHN1cmZhY2UuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RscGFsZXR0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFBJWEVMRk9STUFUIgorPjwvQQorPlNETF9QaXhlbEZvcm1hdDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMzE3OCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9QaXhlbEZvcm1hdCZuYnNwOy0tJm5ic3A7U3RvcmVzIHN1cmZhY2UgZm9ybWF0IGluZm9ybWF0aW9uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMxODEiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0IFNETF9QaXhlbEZvcm1hdCB7CisgIFNETF9QYWxldHRlICpwYWxldHRlOworICBVaW50OCAgQml0c1BlclBpeGVsOworICBVaW50OCAgQnl0ZXNQZXJQaXhlbDsKKyAgVWludDggIFJsb3NzLCBHbG9zcywgQmxvc3MsIEFsb3NzOworICBVaW50OCAgUnNoaWZ0LCBHc2hpZnQsIEJzaGlmdCwgQXNoaWZ0OworICBVaW50MzIgUm1hc2ssIEdtYXNrLCBCbWFzaywgQW1hc2s7CisgIFVpbnQzMiBjb2xvcmtleTsKKyAgVWludDggIGFscGhhOworfSBTRExfUGl4ZWxGb3JtYXQ7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzE4NCIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGF0YTwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVOMzE4NiIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5wYWxldHRlPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UG9pbnRlciB0byB0aGUgPEEKK0hSRUY9InNkbHBhbGV0dGUuaHRtbCIKKz5wYWxldHRlPC9BCis+LCBvciA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPk5VTEw8L1RUCis+IGlmIHRoZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPkJpdHNQZXJQaXhlbDwvSQorPjwvVFQKKz4mIzYyOzg8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPkJpdHNQZXJQaXhlbDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIHJlcHJlc2VudCBlYWNoIHBpeGVsIGluIGEgc3VyZmFjZS4gVXN1YWxseSA4LCAxNiwgMjQgb3IgMzIuPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5CeXRlc1BlclBpeGVsPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+VGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIHJlcHJlc2VudCBlYWNoIHBpeGVsIGluIGEgc3VyZmFjZS4gVXN1YWxseSBvbmUgdG8gZm91ci48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPltSR0JBXW1hc2s8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5CaW5hcnkgbWFzayB1c2VkIHRvIHJldHJpZXZlIGluZGl2aWR1YWwgY29sb3IgdmFsdWVzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5bUkdCQV1sb3NzPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UHJlY2lzaW9uIGxvc3Mgb2YgZWFjaCBjb2xvciBjb21wb25lbnQgKDI8U1VQCis+W1JHQkFdbG9zczwvU1VQCis+KTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+W1JHQkFdc2hpZnQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5CaW5hcnkgbGVmdCBzaGlmdCBvZiBlYWNoIGNvbG9yIGNvbXBvbmVudCBpbiB0aGUgcGl4ZWwgdmFsdWU8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmNvbG9ya2V5PC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UGl4ZWwgdmFsdWUgb2YgdHJhbnNwYXJlbnQgcGl4ZWxzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5hbHBoYTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPk92ZXJhbGwgc3VyZmFjZSBhbHBoYSB2YWx1ZTwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMyMjUiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5BIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUGl4ZWxGb3JtYXQ8L1NQQU4KKz4gZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIHBpeGVsIGRhdGEgc3RvcmVkIGF0IHRoZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnBpeGVsczwvSQorPjwvVFQKKz4gZmllbGQgb2YgYSA8QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfU3VyZmFjZTwvU1BBTgorPjwvQQorPi4gRXZlcnkgc3VyZmFjZSBzdG9yZXMgYSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1BpeGVsRm9ybWF0PC9TUEFOCis+IGluIHRoZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmZvcm1hdDwvSQorPjwvVFQKKz4gZmllbGQuPC9QCis+PFAKKz5JZiB5b3Ugd2lzaCB0byBkbyBwaXhlbCBsZXZlbCBtb2RpZmljYXRpb25zIG9uIGEgc3VyZmFjZSwgdGhlbiB1bmRlcnN0YW5kaW5nIGhvdyBTREwgc3RvcmVzIGl0cyBjb2xvciBpbmZvcm1hdGlvbiBpcyBlc3NlbnRpYWwuPC9QCis+PFAKKz44LWJpdCBwaXhlbCBmb3JtYXRzIGFyZSB0aGUgZWFzaWVzdCB0byB1bmRlcnN0YW5kLiBTaW5jZSBpdHMgYW4gOC1iaXQgZm9ybWF0LCB3ZSBoYXZlIDggPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5CaXRzUGVyUGl4ZWw8L0kKKz48L1RUCis+IGFuZCAxIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Qnl0ZXNQZXJQaXhlbDwvSQorPjwvVFQKKz4uIFNpbmNlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Qnl0ZXNQZXJQaXhlbDwvSQorPjwvVFQKKz4gaXMgMSwgYWxsIHBpeGVscyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBVaW50OCB3aGljaCBjb250YWlucyBhbiBpbmRleCBpbnRvIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+cGFsZXR0ZTwvSQorPjwvVFQKKz4tJiM2Mjs8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmNvbG9yczwvSQorPjwvVFQKKz4uIFNvLCB0byBkZXRlcm1pbmUgdGhlIGNvbG9yIG9mIGEgcGl4ZWwgaW4gYSA4LWJpdCBzdXJmYWNlOiB3ZSByZWFkIHRoZSBjb2xvciBpbmRleCBmcm9tIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5zdXJmYWNlPC9TUEFOCis+LSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5waXhlbHM8L0kKKz48L1RUCis+IGFuZCB3ZSB1c2UgdGhhdCBpbmRleCB0byByZWFkIHRoZSA8QQorSFJFRj0ic2RsY29sb3IuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0NvbG9yPC9TUEFOCis+PC9BCis+IHN0cnVjdHVyZSBmcm9tIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5zdXJmYWNlPC9TUEFOCis+LSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5mb3JtYXQ8L0kKKz48L1RUCis+LSYjNjI7PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5wYWxldHRlPC9JCis+PC9UVAorPi0mIzYyOzxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Y29sb3JzPC9JCis+PC9UVAorPi4gTGlrZSBzbzoKKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfU3VyZmFjZSAqc3VyZmFjZTsKK1NETF9QaXhlbEZvcm1hdCAqZm10OworU0RMX0NvbG9yICpjb2xvcjsKK1VpbnQ4IGluZGV4OworCisuCisuCisKKy8qIENyZWF0ZSBzdXJmYWNlICovCisuCisuCitmbXQ9c3VyZmFjZS0mIzYyO2Zvcm1hdDsKKworLyogQ2hlY2sgdGhlIGJpdGRlcHRoIG9mIHRoZSBzdXJmYWNlICovCitpZihmbXQtJiM2MjtCaXRzUGVyUGl4ZWwhPTgpeworICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBhbiA4LWJpdCBzdXJmYWNlLlxuIik7CisgIHJldHVybigtMSk7Cit9CisKKy8qIExvY2sgdGhlIHN1cmZhY2UgKi8KK1NETF9Mb2NrU3VyZmFjZShzdXJmYWNlKTsKKworLyogR2V0IHRoZSB0b3BsZWZ0IHBpeGVsICovCitpbmRleD0qKFVpbnQ4ICopc3VyZmFjZS0mIzYyO3BpeGVsczsKK2NvbG9yPWZtdC0mIzYyO3BhbGV0dGUtJiM2Mjtjb2xvcnNbaW5kZXhdOworCisvKiBVbmxvY2sgdGhlIHN1cmZhY2UgKi8KK1NETF9VbmxvY2tTdXJmYWNlKHN1cmZhY2UpOworcHJpbnRmKCJQaXhlbCBDb2xvci0mIzYyOyBSZWQ6ICVkLCBHcmVlbjogJWQsIEJsdWU6ICVkLiBJbmRleDogJWRcbiIsCisgICAgICAgICAgY29sb3ItJiM2MjtyLCBjb2xvci0mIzYyO2csIGNvbG9yLSYjNjI7YiwgaW5kZXgpOworLgorLjwvUFJFCis+PC9QCis+PFAKKz5QaXhlbCBmb3JtYXRzIGFib3ZlIDgtYml0IGFyZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQgZXhwZXJpZW5jZS4gVGhleSBhcmUKK2NvbnNpZGVyZWQgdG8gYmUgIlRydWVDb2xvciIgZm9ybWF0cyBhbmQgdGhlIGNvbG9yIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUKK3BpeGVscyB0aGVtc2VsdmVzLCBub3QgaW4gYSBwYWxldHRlLiBUaGUgbWFzaywgc2hpZnQgYW5kIGxvc3MgZmllbGRzIHRlbGwgdXMKK2hvdyB0aGUgY29sb3IgaW5mb3JtYXRpb24gaXMgZW5jb2RlZC4gVGhlIG1hc2sgZmllbGRzIGFsbG93IHVzIHRvIGlzb2xhdGUgZWFjaAorY29sb3IgY29tcG9uZW50LCB0aGUgc2hpZnQgZmllbGRzIHRlbGwgdXMgdGhlIG51bWJlciBvZiBiaXRzIHRvIHRoZSByaWdodCBvZgorZWFjaCBjb21wb25lbnQgaW4gdGhlIHBpeGVsIHZhbHVlIGFuZCB0aGUgbG9zcyBmaWVsZHMgdGVsbCB1cyB0aGUgbnVtYmVyIG9mCitiaXRzIGxvc3QgZnJvbSBlYWNoIGNvbXBvbmVudCB3aGVuIHBhY2tpbmcgOC1iaXQgY29sb3IgY29tcG9uZW50IGluIGEgcGl4ZWwuCis8UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+LyogRXh0cmFjdGluZyBjb2xvciBjb21wb25lbnRzIGZyb20gYSAzMi1iaXQgY29sb3IgdmFsdWUgKi8KK1NETF9QaXhlbEZvcm1hdCAqZm10OworU0RMX1N1cmZhY2UgKnN1cmZhY2U7CitVaW50MzIgdGVtcCwgcGl4ZWw7CitVaW50OCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKy4KKy4KKy4KK2ZtdD1zdXJmYWNlLSYjNjI7Zm9ybWF0OworU0RMX0xvY2tTdXJmYWNlKHN1cmZhY2UpOworcGl4ZWw9KigoVWludDMyKilzdXJmYWNlLSYjNjI7cGl4ZWxzKTsKK1NETF9VbmxvY2tTdXJmYWNlKHN1cmZhY2UpOworCisvKiBHZXQgUmVkIGNvbXBvbmVudCAqLwordGVtcD1waXhlbCYjMzg7Zm10LSYjNjI7Um1hc2s7IC8qIElzb2xhdGUgcmVkIGNvbXBvbmVudCAqLwordGVtcD10ZW1wJiM2MjsmIzYyO2ZtdC0mIzYyO1JzaGlmdDsvKiBTaGlmdCBpdCBkb3duIHRvIDgtYml0ICovCit0ZW1wPXRlbXAmIzYwOyYjNjA7Zm10LSYjNjI7Umxvc3M7IC8qIEV4cGFuZCB0byBhIGZ1bGwgOC1iaXQgbnVtYmVyICovCityZWQ9KFVpbnQ4KXRlbXA7CisKKy8qIEdldCBHcmVlbiBjb21wb25lbnQgKi8KK3RlbXA9cGl4ZWwmIzM4O2ZtdC0mIzYyO0dtYXNrOyAvKiBJc29sYXRlIGdyZWVuIGNvbXBvbmVudCAqLwordGVtcD10ZW1wJiM2MjsmIzYyO2ZtdC0mIzYyO0dzaGlmdDsvKiBTaGlmdCBpdCBkb3duIHRvIDgtYml0ICovCit0ZW1wPXRlbXAmIzYwOyYjNjA7Zm10LSYjNjI7R2xvc3M7IC8qIEV4cGFuZCB0byBhIGZ1bGwgOC1iaXQgbnVtYmVyICovCitncmVlbj0oVWludDgpdGVtcDsKKworLyogR2V0IEJsdWUgY29tcG9uZW50ICovCit0ZW1wPXBpeGVsJiMzODtmbXQtJiM2MjtCbWFzazsgLyogSXNvbGF0ZSBibHVlIGNvbXBvbmVudCAqLwordGVtcD10ZW1wJiM2MjsmIzYyO2ZtdC0mIzYyO0JzaGlmdDsvKiBTaGlmdCBpdCBkb3duIHRvIDgtYml0ICovCit0ZW1wPXRlbXAmIzYwOyYjNjA7Zm10LSYjNjI7Qmxvc3M7IC8qIEV4cGFuZCB0byBhIGZ1bGwgOC1iaXQgbnVtYmVyICovCitibHVlPShVaW50OCl0ZW1wOworCisvKiBHZXQgQWxwaGEgY29tcG9uZW50ICovCit0ZW1wPXBpeGVsJiMzODtmbXQtJiM2MjtBbWFzazsgLyogSXNvbGF0ZSBhbHBoYSBjb21wb25lbnQgKi8KK3RlbXA9dGVtcCYjNjI7JiM2MjtmbXQtJiM2MjtBc2hpZnQ7LyogU2hpZnQgaXQgZG93biB0byA4LWJpdCAqLwordGVtcD10ZW1wJiM2MDsmIzYwO2ZtdC0mIzYyO0Fsb3NzOyAvKiBFeHBhbmQgdG8gYSBmdWxsIDgtYml0IG51bWJlciAqLworYWxwaGE9KFVpbnQ4KXRlbXA7CisKK3ByaW50ZigiUGl4ZWwgQ29sb3IgLSYjNjI7IFI6ICVkLCAgRzogJWQsICBCOiAlZCwgIEE6ICVkXG4iLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisuCisuCisuPC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzI1MiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbG1hcHJnYi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9NYXBSR0I8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxwYWxldHRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1BhbGV0dGU8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9TdXJmYWNlPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscG9sbGV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHBvbGxldmVudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5N2MyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHBvbGxldmVudC5odG1sCkBAIC0wLDAgKzEsMjY5IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1BvbGxFdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJFdmVudCBGdW5jdGlvbnMuIgorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1BlZXBFdmVudHMiCitIUkVGPSJzZGxwZWVwZXZlbnRzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1dhaXRFdmVudCIKK0hSRUY9InNkbHdhaXRldmVudC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxwZWVwZXZlbnRzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx3YWl0ZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExQT0xMRVZFTlQiCis+PC9BCis+U0RMX1BvbGxFdmVudDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTQ3MiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Qb2xsRXZlbnQmbmJzcDstLSZuYnNwO1BvbGxzIGZvciBjdXJyZW50bHkgcGVuZGluZyBldmVudHMuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU0NzUiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTQ3NiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9Qb2xsRXZlbnQ8L0IKKz48L0NPREUKKz4oU0RMX0V2ZW50ICpldmVudCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41NDgyIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UG9sbHMgZm9yIGN1cnJlbnRseSBwZW5kaW5nIGV2ZW50cywgYW5kIHJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4xPC9TUEFOCis+IAoraWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIGV2ZW50cywgb3IgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IGlmIHRoZXJlIAorYXJlIG5vbmUgYXZhaWxhYmxlLiAgPC9QCis+PFAKKz5JZiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5ldmVudDwvSQorPjwvVFQKKz4gaXMgbm90IDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+TlVMTDwvVFQKKz4sIHRoZSBuZXh0IAorZXZlbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBhbmQgc3RvcmVkIGluIHRoYXQgYXJlYS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTQ5MCIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfRXZlbnQgZXZlbnQ7IC8qIEV2ZW50IHN0cnVjdHVyZSAqLworCisuCisuCisuCisvKiBDaGVjayBmb3IgZXZlbnRzICovCit3aGlsZShTRExfUG9sbEV2ZW50KCYjMzg7ZXZlbnQpKXsgIC8qIExvb3AgdW50aWwgdGhlcmUgYXJlIG5vIGV2ZW50cyBsZWZ0IG9uIHRoZSBxdWV1ZSAqLworICBzd2l0Y2goZXZlbnQudHlwZSl7ICAvKiBQcm9jZXNzIHRoZSBhcHByb3BpYXRlIGV2ZW50IHR5cGUgKi8KKyAgICBjYXNlIFNETF9LRVlET1dOOiAgLyogSGFuZGxlIGEgS0VZRE9XTiBldmVudCAqLyAgICAgICAgIAorICAgICAgcHJpbnRmKCJPaCEgS2V5IHByZXNzXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0RMX01PVVNFTU9USU9OOgorICAgICAgLgorICAgICAgLgorICAgICAgLgorICAgIGRlZmF1bHQ6IC8qIFJlcG9ydCBhbiB1bmhhbmRsZWQgZXZlbnQgKi8KKyAgICAgIHByaW50ZigiSSBkb24ndCBrbm93IHdoYXQgdGhpcyBldmVudCBpcyFcbiIpOworICB9Cit9PC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTQ5NCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsd2FpdGV2ZW50Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1dhaXRFdmVudDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RscGVlcGV2ZW50cy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QZWVwRXZlbnRzPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RscGVlcGV2ZW50cy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHdhaXRldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1BlZXBFdmVudHM8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9XYWl0RXZlbnQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscHVtcGV2ZW50cy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxwdW1wZXZlbnRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlNTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscHVtcGV2ZW50cy5odG1sCkBAIC0wLDAgKzEsMjQ0IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1B1bXBFdmVudHM8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iRXZlbnQgRnVuY3Rpb25zLiIKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IkV2ZW50IEZ1bmN0aW9ucy4iCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9QZWVwRXZlbnRzIgorSFJFRj0ic2RscGVlcGV2ZW50cy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RscGVlcGV2ZW50cy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFBVTVBFVkVOVFMiCis+PC9BCis+U0RMX1B1bXBFdmVudHM8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjUzODciCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfUHVtcEV2ZW50cyZuYnNwOy0tJm5ic3A7UHVtcHMgdGhlIGV2ZW50IGxvb3AsIGdhdGhlcmluZyBldmVudHMgZnJvbSB0aGUgaW5wdXQgZGV2aWNlcy48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONTM5MCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU41MzkxIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9QdW1wRXZlbnRzPC9CCis+PC9DT0RFCis+KHZvaWQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTM5NyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlB1bXBzIHRoZSBldmVudCBsb29wLCBnYXRoZXJpbmcgZXZlbnRzIGZyb20gdGhlIGlucHV0IGRldmljZXMuPC9QCis+PFAKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUHVtcEV2ZW50czwvVFQKKz4gZ2F0aGVycyBhbGwgdGhlIHBlbmRpbmcgaW5wdXQgaW5mb3JtYXRpb24gZnJvbSBkZXZpY2VzIGFuZCBwbGFjZXMgaXQgb24gdGhlIGV2ZW50IHF1ZXVlLiBXaXRob3V0IGNhbGxzIHRvIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QdW1wRXZlbnRzPC9UVAorPiBubyBldmVudHMgd291bGQgZXZlciBiZSBwbGFjZWQgb24gdGhlIHF1ZXVlLiBPZnRlbiBjYWxscyB0aGUgbmVlZCBmb3IgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1B1bXBFdmVudHM8L1RUCis+IGlzIGhpZGRlbiBmcm9tIHRoZSB1c2VyIHNpbmNlIDxBCitIUkVGPSJzZGxwb2xsZXZlbnQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUG9sbEV2ZW50PC9UVAorPjwvQQorPiBhbmQgPEEKK0hSRUY9InNkbHdhaXRldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9XYWl0RXZlbnQ8L1RUCis+PC9BCis+IGltcGxpY2l0bHkgY2FsbCA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUHVtcEV2ZW50czwvVFQKKz4uIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IHBvbGxpbmcgb3Igd2FpdGluZyBmb3IgZXZlbnRzIChlLmcuIHlvdSBhcmUgZmlsdGVyaW5nIHRoZW0pLCB0aGVuIHlvdSBtdXN0IGNhbGwgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1B1bXBFdmVudHM8L1RUCis+IHRvIGZvcmNlIGFuIGV2ZW50IHF1ZXVlIHVwZGF0ZS48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPllvdSBjYW4gb25seSBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gdGhlIHRocmVhZCB0aGF0IHNldCB0aGUgdmlkZW8gbW9kZS48L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41NDEyIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHBvbGxldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Qb2xsRXZlbnQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHBlZXBldmVudHMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPkV2ZW50IEZ1bmN0aW9ucy48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJldmVudGZ1bmN0aW9ucy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9QZWVwRXZlbnRzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHB1c2hldmVudC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxwdXNoZXZlbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA1Mzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxwdXNoZXZlbnQuaHRtbApAQCAtMCwwICsxLDI2NiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9QdXNoRXZlbnQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iRXZlbnQgRnVuY3Rpb25zLiIKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9XYWl0RXZlbnQiCitIUkVGPSJzZGx3YWl0ZXZlbnQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2V0RXZlbnRGaWx0ZXIiCitIUkVGPSJzZGxzZXRldmVudGZpbHRlci5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx3YWl0ZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNldGV2ZW50ZmlsdGVyLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMUFVTSEVWRU5UIgorPjwvQQorPlNETF9QdXNoRXZlbnQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjU1MzYiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfUHVzaEV2ZW50Jm5ic3A7LS0mbmJzcDtQdXNoZXMgYW4gZXZlbnQgb250byB0aGUgZXZlbnQgcXVldWU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONTUzOSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU41NTQwIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1B1c2hFdmVudDwvQgorPjwvQ09ERQorPihTRExfRXZlbnQgKmV2ZW50KTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU1NDYiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGUgZXZlbnQgcXVldWUgY2FuIGFjdHVhbGx5IGJlIHVzZWQgYXMgYSB0d28gd2F5IGNvbW11bmljYXRpb24gY2hhbm5lbC4gTm90IG9ubHkgY2FuIGV2ZW50cyBiZSByZWFkIGZyb20gdGhlIHF1ZXVlLCBidXQgdGhlIHVzZXIgY2FuIGFsc28gcHVzaCB0aGVpciBvd24gZXZlbnRzIG9udG8gaXQuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmV2ZW50PC9JCis+PC9UVAorPiBpcyBhIHBvaW50ZXIgdG8gdGhlIGV2ZW50IHN0cnVjdHVyZSB5b3Ugd2lzaCB0byBwdXNoIG9udG8gdGhlIHF1ZXVlLjwvUAorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+UHVzaGluZyBkZXZpY2UgaW5wdXQgZXZlbnRzIG9udG8gdGhlIHF1ZXVlIGRvZXNuJ3QgbW9kaWZ5IHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlIHdpdGhpbiBTREwuPC9QCis+PC9CTE9DS1FVT1RFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTU1MiIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5SZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBvbiBzdWNjZXNzIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gaWYgdGhlIGV2ZW50IGNvdWxkbid0IGJlIHB1c2hlZC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTU1NyIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPlNlZSA8QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41NTYyIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHBvbGxldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Qb2xsRXZlbnQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHBlZXBldmVudHMuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUGVlcEV2ZW50czwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx3YWl0ZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzZXRldmVudGZpbHRlci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1dhaXRFdmVudDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NldEV2ZW50RmlsdGVyPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHF1aXQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscXVpdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzFjODIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHF1aXQuaHRtbApAQCAtMCwwICsxLDI0NCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9RdWl0PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IkdlbmVyYWwiCitIUkVGPSJnZW5lcmFsLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9RdWl0U3ViU3lzdGVtIgorSFJFRj0ic2RscXVpdHN1YnN5c3RlbS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9XYXNJbml0IgorSFJFRj0ic2Rsd2FzaW5pdC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxxdWl0c3Vic3lzdGVtLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx3YXNpbml0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMUVVJVCIKKz48L0EKKz5TRExfUXVpdDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTg1IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1F1aXQmbmJzcDstLSZuYnNwO1NodXQgZG93biBTREw8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONTg4IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjU4OSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfUXVpdDwvQgorPjwvQ09ERQorPih2b2lkKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU5NSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0PC9UVAorPiBzaHV0cyBkb3duIGFsbCBTREwgc3Vic3lzdGVtcyBhbmQgZnJlZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhlbS4gVGhpcyBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCBiZWZvcmUgeW91IGV4aXQuIEZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5IHlvdSBjYW4gc2V0IDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0PC9UVAorPiBhcyB5b3VyIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPmF0ZXhpdDwvVFQKKz4gY2FsbCwgbGlrZToKKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfSW5pdChTRExfSU5JVF9WSURFT3xTRExfSU5JVF9BVURJTyk7CithdGV4aXQoU0RMX1F1aXQpOworLgorLjwvUFJFCis+PC9QCis+PERJVgorQ0xBU1M9Ik5PVEUiCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJOT1RFIgorPjxQCis+PEIKKz5Ob3RlOiA8L0IKKz5XaGlsZSB1c2luZyA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5hdGV4aXQ8L1RUCis+IG1heWJlIGJlIGZpbmUgZm9yIHNtYWxsIHByb2dyYW1zLCBtb3JlIGFkdmFuY2VkIHVzZXJzIHNob3VsZCBzaHV0IGRvd24gU0RMIGluIHRoZWlyIG93biBjbGVhbnVwIGNvZGUuIFBsdXMsIHVzaW5nIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPmF0ZXhpdDwvVFQKKz4gaW4gYSBsaWJyYXJ5IGlzIGEgc3VyZSB3YXkgdG8gY3Jhc2ggZHluYW1pY2FsbHkgbG9hZGVkIGNvZGU8L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MDYiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RscXVpdHN1YnN5c3RlbS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0U3Vic3lzdGVtPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxpbml0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxxdWl0c3Vic3lzdGVtLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsd2FzaW5pdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1F1aXRTdWJTeXN0ZW08L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJnZW5lcmFsLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1dhc0luaXQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscXVpdGV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHF1aXRldmVudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NzVmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHF1aXRldmVudC5odG1sCkBAIC0wLDAgKzEsMjYzIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1F1aXRFdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1VzZXJFdmVudCIKK0hSRUY9InNkbHVzZXJldmVudC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9rZXlzeW0iCitIUkVGPSJzZGxrZXlzeW0uaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsdXNlcmV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxrZXlzeW0uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExRVUlURVZFTlQiCis+PC9BCis+U0RMX1F1aXRFdmVudDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONDYyMSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9RdWl0RXZlbnQmbmJzcDstLSZuYnNwO1F1aXQgcmVxdWVzdGVkIGV2ZW50PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ2MjQiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBVaW50OCB0eXBlCit9IFNETF9RdWl0RXZlbnQ7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDYyNyIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGF0YTwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVONDYyOSIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz50eXBlPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUVVJVDwvVFQKKz48L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40NjM3IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9RdWl0RXZlbnQ8L1NQQU4KKz4gaXMgYSBtZW1iZXIgb2YgdGhlIDxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4gdW5pb24gYW5kIGlzIHVzZWQgd2hhbiBhbiBldmVudCBvZiB0eXBlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1FVSVQ8L1RUCis+IGlzIHJlcG9ydGVkLjwvUAorPjxQCis+QXMgY2FuIGJlIHNlZW4sIHRoZSBTRExfUXVpdEV2ZW50IHN0cnVjdHVyZSBzZXJ2ZXMgbm8gdXNlZnVsIHB1cnBvc2UuIFRoZSBldmVudCBpdHNlbGYsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyB2ZXJ5IGltcG9ydGFudC4gSWYgeW91IGZpbHRlciBvdXQgb3IgaWdub3JlIGEgcXVpdCBldmVudCB0aGVuIGl0IGlzIGltcG9zc2libGUgZm9yIHRoZSB1c2VyIHRvIGNsb3NlIHRoZSB3aW5kb3cuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3UgZG8gYWNjZXB0IGEgcXVpdCBldmVudCB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3cgd2lsbCBiZSBjbG9zZWQsIGFuZCBzY3JlZW4gdXBkYXRlcyB3aWxsIHN0aWxsIHJlcG9ydCBzdWNjZXNzIGV2ZW50IHRob3VnaCB0aGUgYXBwbGljYXRpb24gd2lsbCBubyBsb25nZXIgYmUgdmlzaWJsZS48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPlRoZSBtYWNybyA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUXVpdFJlcXVlc3RlZDwvVFQKKz4gd2lsbCByZXR1cm4gbm9uLXplcm8gaWYgYSBxdWl0IGV2ZW50IGlzIHBlbmRpbmc8L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40NjQ4IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZXRldmVudGZpbHRlci5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRFdmVudEZpbHRlcjwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHVzZXJldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGtleXN5bS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1VzZXJFdmVudDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9rZXlzeW08L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscXVpdHN1YnN5c3RlbS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxxdWl0c3Vic3lzdGVtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3ZTNjZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscXVpdHN1YnN5c3RlbS5odG1sCkBAIC0wLDAgKzEsMjQ4IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1F1aXRTdWJTeXN0ZW08L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iR2VuZXJhbCIKK0hSRUY9ImdlbmVyYWwuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0luaXRTdWJTeXN0ZW0iCitIUkVGPSJzZGxpbml0c3Vic3lzdGVtLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1F1aXQiCitIUkVGPSJzZGxxdWl0Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGluaXRzdWJzeXN0ZW0uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHF1aXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExRVUlUU1VCU1lTVEVNIgorPjwvQQorPlNETF9RdWl0U3ViU3lzdGVtPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU41NTAiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfUXVpdFN1YlN5c3RlbSZuYnNwOy0tJm5ic3A7U2h1dCBkb3duIGEgc3Vic3lzdGVtPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU1MyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU41NTQiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1F1aXRTdWJTeXN0ZW08L0IKKz48L0NPREUKKz4oVWludDMyIGZsYWdzKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU2MCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9RdWl0U3ViU3lzdGVtPC9UVAorPiBhbGxvd3MgeW91IHRvIHNodXQgZG93biBhIHN1YnN5c3RlbSB0aGF0IGhhcyBiZWVuIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgPEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdDwvVFQKKz48L0EKKz4gb3IgPEEKK0hSRUY9InNkbGluaXRzdWJzeXN0ZW0uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdFN1YlN5c3RlbTwvVFQKKz48L0EKKz4uIFRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5mbGFnczwvSQorPjwvVFQKKz4gdGVsbHMgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1F1aXRTdWJTeXN0ZW08L1RUCis+IHdoaWNoIHN1YnN5c3RlbXMgdG8gc2h1dCBkb3duLCBpdCB1c2VzIHRoZSBzYW1lIHZhbHVlcyB0aGF0IGFyZSBwYXNzZWQgdG8gPEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdDwvVFQKKz48L0EKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU3MiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxxdWl0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1F1aXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsaW5pdHN1YnN5c3RlbS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Jbml0U3ViU3lzdGVtPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsaW5pdHN1YnN5c3RlbS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHF1aXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Jbml0U3ViU3lzdGVtPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZ2VuZXJhbC5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9RdWl0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHJlY3QuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscmVjdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGE4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHJlY3QuaHRtbApAQCAtMCwwICsxLDI1OCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9SZWN0PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0dMYXR0ciIKK0hSRUY9InNkbGdsYXR0ci5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Db2xvciIKK0hSRUY9InNkbGNvbG9yLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdsYXR0ci5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY29sb3IuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExSRUNUIgorPjwvQQorPlNETF9SZWN0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4zMDQ2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1JlY3QmbmJzcDstLSZuYnNwO0RlZmluZXMgYSByZWN0YW5ndWxhciBhcmVhPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMwNDkiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBTaW50MTYgeCwgeTsKKyAgVWludDE2IHcsIGg7Cit9IFNETF9SZWN0OzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMwNTIiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjMwNTQiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+eCwgeTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlBvc2l0aW9uIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz53LCBoPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+VGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZTwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMwNjUiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5BIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfUmVjdDwvU1BBTgorPiBkZWZpbmVzIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuIEl0IGlzIHVzZWQgYnkgPEEKK0hSRUY9InNkbGJsaXRzdXJmYWNlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0JsaXRTdXJmYWNlPC9UVAorPjwvQQorPiB0byBkZWZpbmUgYmxpdHRpbmcgcmVnaW9ucyBhbmQgYnkgc2V2ZXJhbCBvdGhlciB2aWRlbyBmdW5jdGlvbnMuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMwNzEiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsYmxpdHN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQmxpdFN1cmZhY2U8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHVwZGF0ZXJlY3QuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfVXBkYXRlUmVjdDwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdsYXR0ci5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNvbG9yLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfR0xhdHRyPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ29sb3I8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscmVtb3ZldGltZXIuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscmVtb3ZldGltZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmEzZDExCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxyZW1vdmV0aW1lci5odG1sCkBAIC0wLDAgKzEsMjM2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1JlbW92ZVRpbWVyPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlRpbWUiCitIUkVGPSJ0aW1lLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9BZGRUaW1lciIKK0hSRUY9InNkbGFkZHRpbWVyLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1NldFRpbWVyIgorSFJFRj0ic2Rsc2V0dGltZXIuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsYWRkdGltZXIuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNldHRpbWVyLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMUkVNT1ZFVElNRVIiCis+PC9BCis+U0RMX1JlbW92ZVRpbWVyPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU44NTI2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1JlbW92ZVRpbWVyJm5ic3A7LS0mbmJzcDtSZW1vdmUgYSB0aW1lciB3aGljaCB3YXMgYWRkZWQgd2l0aAorPEEKK0hSRUY9InNkbGFkZHRpbWVyLmh0bWwiCis+U0RMX0FkZFRpbWVyPC9BCis+LjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU44NTMwIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjg1MzEiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9ib29sIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9SZW1vdmVUaW1lcjwvQgorPjwvQ09ERQorPihTRExfVGltZXJJRCBpZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44NTM3IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+UmVtb3ZlcyBhIHRpbWVyIGNhbGxiYWNrIHByZXZpb3VzbHkgYWRkZWQgd2l0aAorPEEKK0hSRUY9InNkbGFkZHRpbWVyLmh0bWwiCis+U0RMX0FkZFRpbWVyPC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44NTQxIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgc3VjY2Vzcy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODU0NCIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5TRExfUmVtb3ZlVGltZXIobXlfdGltZXJfaWQpOzwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjg1NDgiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsYWRkdGltZXIuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQWRkVGltZXI8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxhZGR0aW1lci5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldHRpbWVyLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQWRkVGltZXI8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aW1lLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NldFRpbWVyPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHJlc2l6ZWV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHJlc2l6ZWV2ZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NDZhNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RscmVzaXplZXZlbnQuaHRtbApAQCAtMCwwICsxLDMwNyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9SZXNpemVFdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0pveUJhbGxFdmVudCIKK0hSRUY9InNkbGpveWJhbGxldmVudC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9FeHBvc2VFdmVudCIKK0hSRUY9InNkbGV4cG9zZWV2ZW50Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGpveWJhbGxldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZXhwb3NlZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExSRVNJWkVFVkVOVCIKKz48L0EKKz5TRExfUmVzaXplRXZlbnQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjQ0NTMiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfUmVzaXplRXZlbnQmbmJzcDstLSZuYnNwO1dpbmRvdyByZXNpemUgZXZlbnQgc3RydWN0dXJlPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ0NTYiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBVaW50OCB0eXBlOworICBpbnQgdywgaDsKK30gU0RMX1Jlc2l6ZUV2ZW50OzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ0NTkiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjQ0NjEiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1ZJREVPUkVTSVpFPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dzwvSQorPjwvVFQKKz4sIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+aDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPk5ldyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSB3aW5kb3c8L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40NDc0IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9SZXNpemVFdmVudDwvU1BBTgorPiBpcyBhIG1lbWJlciBvZiB0aGUgPEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiB1bmlvbiBhbmQgaXMgdXNlZCB3aGVuIGFuIGV2ZW50IG9mIHR5cGUgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9SRVNJWkU8L1RUCis+IGlzIHJlcG9ydGVkLjwvUAorPjxQCis+V2hlbiA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9SRVNJWkFCTEU8L1RUCis+IGlzIHBhc3NlZCBhcyBhIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmZsYWc8L0kKKz48L1RUCis+IHRvIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0VmlkZW9Nb2RlPC9UVAorPjwvQQorPiB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIHJlc2l6ZSB0aGUgYXBwbGljYXRpb25zIHdpbmRvdy4gV2hlbiB0aGUgd2luZG93IGlzIHJlc2l6ZWQgYW4gPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVklERU9SRVNJWkU8L1RUCis+IGlzIHJlcG9ydCwgd2l0aCB0aGUgbmV3IHdpbmRvdyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyBzdG9yZWQgaW4gPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz53PC9JCis+PC9UVAorPiBhbmQgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5oPC9JCis+PC9UVAorPiwgcmVzcGVjdGl2ZWx5LiBXaGVuIGFuIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1ZJREVPUkVTSVpFPC9UVAorPiBpcyByZWNpZXZlZCB0aGUgd2luZG93IHNob3VsZCBiZSByZXNpemVkIHRvIHRoZSBuZXcgZGltZW5zaW9ucyB1c2luZyA8QQorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFZpZGVvTW9kZTwvVFQKKz48L0EKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ0OTIiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNldHZpZGVvbW9kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxqb3liYWxsZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxleHBvc2VldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0pveUJhbGxFdmVudDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9FeHBvc2VFdmVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzYXZlYm1wLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNhdmVibXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMxOGVkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzYXZlYm1wLmh0bWwKQEAgLTAsMCArMSwyMzYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfU2F2ZUJNUDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Mb2FkQk1QIgorSFJFRj0ic2RsbG9hZGJtcC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9TZXRDb2xvcktleSIKK0hSRUY9InNkbHNldGNvbG9ya2V5Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGxvYWRibXAuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNldGNvbG9ya2V5Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMU0FWRUJNUCIKKz48L0EKKz5TRExfU2F2ZUJNUDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMjAxNSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9TYXZlQk1QJm5ic3A7LS0mbmJzcDtTYXZlIGFuIFNETF9TdXJmYWNlIGFzIGEgV2luZG93cyBCTVAgZmlsZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMjAxOCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4yMDE5IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1NhdmVCTVA8L0IKKz48L0NPREUKKz4oU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGNvbnN0IGNoYXIgKmZpbGUpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjAyNSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlNhdmVzIHRoZSA8U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1N1cmZhY2U8L1NQQU4KKz4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c3VyZmFjZTwvSQorPjwvVFQKKz4gYXMgYSBXaW5kb3dzIEJNUCBmaWxlIG5hbWVkIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmZpbGU8L0kKKz48L1RUCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMDMxIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IGlmIHN1Y2Nlc3NmdWwgb3IKKzxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4KK2lmIHRoZXJlIHdhcyBhbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjAzNiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxsb2FkYm1wLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvYWRCTVA8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxsb2FkYm1wLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2V0Y29sb3JrZXkuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9Mb2FkQk1QPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfU2V0Q29sb3JLZXk8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2VtcG9zdC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZW1wb3N0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmYjAxYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2VtcG9zdC5odG1sCkBAIC0wLDAgKzEsMjk5IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1NlbVBvc3Q8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iTXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmciCitIUkVGPSJ0aHJlYWQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1NlbVdhaXRUaW1lb3V0IgorSFJFRj0ic2Rsc2Vtd2FpdHRpbWVvdXQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2VtVmFsdWUiCitIUkVGPSJzZGxzZW12YWx1ZS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZW13YWl0dGltZW91dC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc2VtdmFsdWUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExTRU1QT1NUIgorPjwvQQorPlNETF9TZW1Qb3N0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU44MTcwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1NlbVBvc3QmbmJzcDstLSZuYnNwO1VubG9jayBhIHNlbWFwaG9yZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOODE3MyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU44MTc0IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9TZW1Qb3N0PC9CCis+PC9DT0RFCis+KFNETF9zZW0gKnNlbSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MTgwIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVBvc3Q8L1RUCis+IHVubG9ja3MgdGhlIHNlbWFwaG9yZSBwb2ludGVkIHRvIGJ5Cis8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zZW08L0kKKz48L1RUCis+IGFuZCBhdG9taWNhbGx5IGluY3JlbWVudHMgdGhlIHNlbWFwaG9yZXMgdmFsdWUuCitUaHJlYWRzIHRoYXQgd2VyZSBibG9ja2luZyBvbiB0aGUgc2VtYXBob3JlIG1heSBiZSBzY2hlZHVsZWQgYWZ0ZXIgdGhpcyBjYWxsCitzdWNjZWVkcy48L1AKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZW1Qb3N0PC9UVAorPiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgc2VtYXBob3JlIGlzIGxvY2tlZCBieSBhIHN1Y2Nlc3NmdWwgY2FsbCB0bworPEEKK0hSRUY9InNkbHNlbXdhaXQuaHRtbCIKKz5TRExfU2VtV2FpdDwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW10cnl3YWl0Lmh0bWwiCis+U0RMX1NlbVRyeVdhaXQ8L0EKKz4gb3IKKzxBCitIUkVGPSJzZGxzZW13YWl0dGltZW91dC5odG1sIgorPlNETF9TZW1XYWl0VGltZW91dDwvQQorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODE5MCIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5SZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBpZiBzdWNjZXNzZnVsIG9yCis8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IGlmIHRoZXJlIHdhcyBhbiBlcnJvciAobGVhdmluZyB0aGUgc2VtYXBob3JlIHVuY2hhbmdlZCkuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjgxOTUiCis+PC9BCis+PEgyCis+RXhhbXBsZXM8L0gyCis+PFAKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+U0RMX1NlbVBvc3QobXlfc2VtKTs8L1BSRQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MTk5IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZXNlbWFwaG9yZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVTZW1hcGhvcmU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGRlc3Ryb3lzZW1hcGhvcmUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRGVzdHJveVNlbWFwaG9yZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2Vtd2FpdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZW1XYWl0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW10cnl3YWl0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVRyeVdhaXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXdhaXR0aW1lb3V0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVdhaXRUaW1lb3V0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW12YWx1ZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZW1WYWx1ZTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNlbXdhaXR0aW1lb3V0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2VtdmFsdWUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9TZW1XYWl0VGltZW91dDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9TZW1WYWx1ZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZW10cnl3YWl0Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNlbXRyeXdhaXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmY0N2ExCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZW10cnl3YWl0Lmh0bWwKQEAgLTAsMCArMSwzMTkgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfU2VtVHJ5V2FpdDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJNdWx0aS10aHJlYWRlZCBQcm9ncmFtbWluZyIKK0hSRUY9InRocmVhZC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfU2VtV2FpdCIKK0hSRUY9InNkbHNlbXdhaXQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2VtV2FpdFRpbWVvdXQiCitIUkVGPSJzZGxzZW13YWl0dGltZW91dC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZW13YWl0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZW13YWl0dGltZW91dC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFNFTVRSWVdBSVQiCis+PC9BCis+U0RMX1NlbVRyeVdhaXQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjgwNjkiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfU2VtVHJ5V2FpdCZuYnNwOy0tJm5ic3A7QXR0ZW1wdCB0byBsb2NrIGEgc2VtYXBob3JlIGJ1dCBkb24ndCBzdXNwZW5kIHRoZSB0aHJlYWQuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjgwNzIiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOODA3MyIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfU2VtVHJ5V2FpdDwvQgorPjwvQ09ERQorPihTRExfc2VtICpzZW0pOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODA3OSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZW1UcnlXYWl0PC9UVAorPiBpcyBhIG5vbi1ibG9ja2luZyB2YXJpZW50IG9mCis8QQorSFJFRj0ic2Rsc2Vtd2FpdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZW1XYWl0PC9UVAorPjwvQQorPi4gSWYgdGhlIHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUKK3BvaW50ZWQgdG8gYnkgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c2VtPC9JCis+PC9UVAorPiBpcyBwb3NpdGl2ZSBpdCB3aWxsIGF0b21pY2FsbHkKK2RlY3JlbWVudCB0aGUgc2VtYXBob3JlIHZhbHVlIGFuZCByZXR1cm4gMCwgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuCis8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPlNETF9NVVRFWF9USU1FRE9VVDwvU1BBTgorPiBpbnN0ZWFkIG9mIHN1c3BlbmRpbmcgdGhlIHRocmVhZC48L1AKKz48UAorPkFmdGVyIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZW1UcnlXYWl0PC9UVAorPiBpcyBzdWNjZXNzZnVsLCB0aGUgc2VtYXBob3JlCitjYW4gYmUgcmVsZWFzZWQgYW5kIGl0cyBjb3VudCBhdG9taWNhbGx5IGluY3JlbWVudGVkIGJ5IGEgc3VjY2Vzc2Z1bCBjYWxsIHRvCis8QQorSFJFRj0ic2Rsc2VtcG9zdC5odG1sIgorPlNETF9TZW1Qb3N0PC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MDkwIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IGlmIHRoZSBzZW1hcGhvcmUgd2FzIHN1Y2Nlc3NmdWxseSBsb2NrZWQgb3IKK2VpdGhlciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPlNETF9NVVRFWF9USU1FRE9VVDwvU1BBTgorPiBvciA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+CitpZiB0aGUgdGhyZWFkIHdvdWxkIGhhdmUgc3VzcGVuZGVkIG9yIHRoZXJlIHdhcyBhbiBlcnJvciwgcmVzcGVjdGl2bHkuPC9QCis+PFAKKz5JZiB0aGUgc2VtYXBob3JlIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGxvY2tlZCwgdGhlIHNlbWFwaG9yZSB3aWxsIGJlIHVuY2hhbmdlZC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODA5NyIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5yZXMgPSBTRExfU2VtVHJ5V2FpdChteV9zZW0pOworCitpZiAocmVzID09IFNETF9NVVRFWF9USU1FRE9VVCkgeworICAgICAgICByZXR1cm4gVFJZX0FHQUlOOworfQoraWYgKHJlcyA9PSAtMSkgeworICAgICAgICByZXR1cm4gV0FJVF9FUlJPUjsKK30KKworLi4uCisKK1NETF9TZW1Qb3N0KG15X3NlbSk7PC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODEwMSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxjcmVhdGVzZW1hcGhvcmUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlU2VtYXBob3JlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxkZXN0cm95c2VtYXBob3JlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0Rlc3Ryb3lTZW1hcGhvcmU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXdhaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtV2FpdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2Vtd2FpdHRpbWVvdXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtV2FpdFRpbWVvdXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXBvc3QuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtUG9zdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2VtdmFsdWUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtVmFsdWU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzZW13YWl0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2Vtd2FpdHRpbWVvdXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9TZW1XYWl0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NlbVdhaXRUaW1lb3V0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNlbXZhbHVlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNlbXZhbHVlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2NzM2OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2VtdmFsdWUuaHRtbApAQCAtMCwwICsxLDI3MyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9TZW1WYWx1ZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJNdWx0aS10aHJlYWRlZCBQcm9ncmFtbWluZyIKK0hSRUY9InRocmVhZC5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfU2VtUG9zdCIKK0hSRUY9InNkbHNlbXBvc3QuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ3JlYXRlQ29uZCIKK0hSRUY9InNkbGNyZWF0ZWNvbmQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc2VtcG9zdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY3JlYXRlY29uZC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFNFTVZBTFVFIgorPjwvQQorPlNETF9TZW1WYWx1ZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOODIxOCIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9TZW1WYWx1ZSZuYnNwOy0tJm5ic3A7UmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgc2VtYXBob3JlLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU44MjIxIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjgyMjIiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RML1NETF90aHJlYWQuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+VWludDMyIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9TZW1WYWx1ZTwvQgorPjwvQ09ERQorPihTRExfc2VtICpzZW0pOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODIyOCIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZW1WYWx1ZSgpPC9UVAorPiByZXR1cm5zIHRoZSBjdXJyZW50IHNlbWFwaG9yZSB2YWx1ZSBmcm9tCit0aGUgc2VtYXBob3JlIHBvaW50ZWQgdG8gYnkgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c2VtPC9JCis+PC9UVAorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODIzMyIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5SZXR1cm5zIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbWFwaG9yZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODIzNiIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz4gIHNlbV92YWx1ZSA9IFNETF9TZW1WYWx1ZShteV9zZW0pOzwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjgyNDAiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NyZWF0ZVNlbWFwaG9yZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZGVzdHJveXNlbWFwaG9yZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9EZXN0cm95U2VtYXBob3JlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW13YWl0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVdhaXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXRyeXdhaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtVHJ5V2FpdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2Vtd2FpdHRpbWVvdXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtV2FpdFRpbWVvdXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXBvc3QuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtUG9zdDwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNlbXBvc3QuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjcmVhdGVjb25kLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfU2VtUG9zdDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DcmVhdGVDb25kPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNlbXdhaXQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2Vtd2FpdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOThkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNlbXdhaXQuaHRtbApAQCAtMCwwICsxLDI5OCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9TZW1XYWl0PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9Ik11bHRpLXRocmVhZGVkIFByb2dyYW1taW5nIgorSFJFRj0idGhyZWFkLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9EZXN0cm95U2VtYXBob3JlIgorSFJFRj0ic2RsZGVzdHJveXNlbWFwaG9yZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9TZW1UcnlXYWl0IgorSFJFRj0ic2Rsc2VtdHJ5d2FpdC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxkZXN0cm95c2VtYXBob3JlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZW10cnl3YWl0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMU0VNV0FJVCIKKz48L0EKKz5TRExfU2VtV2FpdDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOODAyMyIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9TZW1XYWl0Jm5ic3A7LS0mbmJzcDtMb2NrIGEgc2VtYXBob3JlIGFuZCBzdXNwZW5kIHRoZSB0aHJlYWQgaWYgdGhlIHNlbWFwaG9yZSB2YWx1ZSBpcyB6ZXJvLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU44MDI2IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjgwMjciCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1NlbVdhaXQ8L0IKKz48L0NPREUKKz4oU0RMX3NlbSAqc2VtKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjgwMzMiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtV2FpdCgpPC9UVAorPiBzdXNwZW5kcyB0aGUgY2FsbGluZyB0aHJlYWQgdW50aWwgZWl0aGVyCit0aGUgc2VtYXBob3JlIHBvaW50ZWQgdG8gYnkgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c2VtPC9JCis+PC9UVAorPiBoYXMgYSBwb3NpdGl2ZSB2YWx1ZSwKK3RoZSBjYWxsIGlzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIG9yIGVycm9yLiBJZiB0aGUgY2FsbCBpcyBzdWNjZXNzZnVsIGl0Cit3aWxsIGF0b21pY2FsbHkgZGVjcmVtZW50IHRoZSBzZW1hcGhvcmUgdmFsdWUuPC9QCis+PFAKKz5BZnRlciA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtV2FpdCgpPC9UVAorPiBpcyBzdWNjZXNzZnVsLCB0aGUgc2VtYXBob3JlCitjYW4gYmUgcmVsZWFzZWQgYW5kIGl0cyBjb3VudCBhdG9taWNhbGx5IGluY3JlbWVudGVkIGJ5IGEgc3VjY2Vzc2Z1bCBjYWxsIHRvCis8QQorSFJFRj0ic2Rsc2VtcG9zdC5odG1sIgorPlNETF9TZW1Qb3N0PC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MDQxIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+IGlmIHN1Y2Nlc3NmdWwgb3IKKzxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4gaWYgdGhlcmUgd2FzIGFuIGVycm9yIChsZWF2aW5nIHRoZSBzZW1hcGhvcmUgdW5jaGFuZ2VkKS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODA0NiIKKz48L0EKKz48SDIKKz5FeGFtcGxlczwvSDIKKz48UAorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz5pZiAoU0RMX1NlbVdhaXQobXlfc2VtKSA9PSAtMSkgeworICAgICAgICByZXR1cm4gV0FJVF9GQUlMRUQ7Cit9CisKKy4uLgorCitTRExfU2VtUG9zdChteV9zZW0pOzwvUFJFCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjgwNTAiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsY3JlYXRlc2VtYXBob3JlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0NyZWF0ZVNlbWFwaG9yZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZGVzdHJveXNlbWFwaG9yZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9EZXN0cm95U2VtYXBob3JlPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW10cnl3YWl0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVRyeVdhaXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXdhaXR0aW1lb3V0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVdhaXRUaW1lb3V0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW1wb3N0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVBvc3Q8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXZhbHVlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVZhbHVlPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZGVzdHJveXNlbWFwaG9yZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNlbXRyeXdhaXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9EZXN0cm95U2VtYXBob3JlPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NlbVRyeVdhaXQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2Vtd2FpdHRpbWVvdXQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2Vtd2FpdHRpbWVvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODhmNWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZW13YWl0dGltZW91dC5odG1sCkBAIC0wLDAgKzEsMzIyIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1NlbVdhaXRUaW1lb3V0PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9Ik11bHRpLXRocmVhZGVkIFByb2dyYW1taW5nIgorSFJFRj0idGhyZWFkLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9TZW1UcnlXYWl0IgorSFJFRj0ic2Rsc2VtdHJ5d2FpdC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9TZW1Qb3N0IgorSFJFRj0ic2Rsc2VtcG9zdC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZW10cnl3YWl0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZW1wb3N0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMU0VNV0FJVFRJTUVPVVQiCis+PC9BCis+U0RMX1NlbVdhaXRUaW1lb3V0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU44MTIwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1NlbVdhaXRUaW1lb3V0Jm5ic3A7LS0mbmJzcDtMb2NrIGEgc2VtYXBob3JlLCBidXQgb25seSB3YWl0IHVwIHRvIGEgc3BlY2lmaWVkIG1heGltdW0gdGltZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOODEyMyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU44MTI0IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9TZW1XYWl0VGltZW91dDwvQgorPjwvQ09ERQorPihTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0KTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjgxMzAiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtV2FpdFRpbWVvdXQoKTwvVFQKKz4gaXMgYSB2YXJpZW50IG9mCis8QQorSFJFRj0ic2Rsc2Vtd2FpdC5odG1sIgorPlNETF9TZW1XYWl0PC9BCis+Cit3aXRoIGEgbWF4aW11bSB0aW1lb3V0IHZhbHVlLgorSWYgdGhlIHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUgcG9pbnRlZCB0byBieSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zZW08L0kKKz48L1RUCis+IGlzCitwb3NpdGl2ZSAoZ3JlYXRlciB0aGFuIHplcm8pIGl0IHdpbGwgYXRvbWljYWxseSBkZWNyZW1lbnQgdGhlIHNlbWFwaG9yZSB2YWx1ZQorYW5kIHJldHVybiAwLCBvdGhlcndpc2UgaXQgd2lsbCB3YWl0IHVwIHRvIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnRpbWVvdXQ8L0kKKz48L1RUCis+CittaWxsaXNlY29uZHMgdHJ5aW5nIHRvIGxvY2sgdGhlIHNlbWFwaG9yZS4gVGhpcyBmdW5jdGlvbiBpcyB0byBiZSBhdm9pZGVkIGlmCitwb3NzaWJsZSBzaW5jZSBvbiBzb21lIHBsYXRmb3JtcyBpdCBpcyBpbXBsZW1lbnRlZCBieSBwb2xsaW5nIHRoZSBzZW1hcGhvcmUKK2V2ZXJ5IG1pbGxpc2Vjb25kIGluIGEgYnVzeSBsb29wLjwvUAorPjxQCis+QWZ0ZXIgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVdhaXRUaW1lb3V0KCk8L1RUCis+IGlzIHN1Y2Nlc3NmdWwsIHRoZSBzZW1hcGhvcmUKK2NhbiBiZSByZWxlYXNlZCBhbmQgaXRzIGNvdW50IGF0b21pY2FsbHkgaW5jcmVtZW50ZWQgYnkgYSBzdWNjZXNzZnVsIGNhbGwgdG8KKzxBCitIUkVGPSJzZGxzZW1wb3N0Lmh0bWwiCis+U0RMX1NlbVBvc3Q8L0EKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjgxNDAiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gaWYgdGhlIHNlbWFwaG9yZSB3YXMgc3VjY2Vzc2Z1bGx5IGxvY2tlZCBvcgorZWl0aGVyIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+U0RMX01VVEVYX1RJTUVET1VUPC9TUEFOCis+IG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+LTE8L1NQQU4KKz4KK2lmIHRoZSB0aW1lb3V0IHBlcmlvZCB3YXMgZXhjZWVkZWQgb3IgdGhlcmUgd2FzIGFuIGVycm9yLCByZXNwZWN0aXZseS48L1AKKz48UAorPklmIHRoZSBzZW1hcGhvcmUgd2FzIG5vdCBzdWNjZXNzZnVsbHkgbG9ja2VkLCB0aGUgc2VtYXBob3JlIHdpbGwgYmUgdW5jaGFuZ2VkLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MTQ3IgorPjwvQQorPjxIMgorPkV4YW1wbGVzPC9IMgorPjxQCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnJlcyA9IFNETF9TZW1XYWl0VGltZW91dChteV9zZW0sIFdBSVRfVElNRU9VVF9NSUxMSVNFQyk7CisKK2lmIChyZXMgPT0gU0RMX01VVEVYX1RJTUVET1VUKSB7CisgICAgICAgIHJldHVybiBUUllfQUdBSU47Cit9CitpZiAocmVzID09IC0xKSB7CisgICAgICAgIHJldHVybiBXQUlUX0VSUk9SOworfQorCisuLi4KKworU0RMX1NlbVBvc3QobXlfc2VtKTs8L1BSRQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44MTUxIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZXNlbWFwaG9yZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVTZW1hcGhvcmU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGRlc3Ryb3lzZW1hcGhvcmUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRGVzdHJveVNlbWFwaG9yZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2Vtd2FpdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZW1XYWl0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZW10cnl3YWl0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NlbVRyeVdhaXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNlbXBvc3QuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtUG9zdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2VtdmFsdWUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2VtVmFsdWU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzZW10cnl3YWl0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2VtcG9zdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NlbVRyeVdhaXQ8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfU2VtUG9zdDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRhbHBoYS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRhbHBoYS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjODQ0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGFscGhhLmh0bWwKQEAgLTAsMCArMSw1MDAgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfU2V0QWxwaGE8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfU2V0Q29sb3JLZXkiCitIUkVGPSJzZGxzZXRjb2xvcmtleS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9TZXRDbGlwUmVjdCIKK0hSRUY9InNkbHNldGNsaXByZWN0Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNldGNvbG9ya2V5Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZXRjbGlwcmVjdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFNFVEFMUEhBIgorPjwvQQorPlNETF9TZXRBbHBoYTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMjA5NiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9TZXRBbHBoYSZuYnNwOy0tJm5ic3A7QWRqdXN0IHRoZSBhbHBoYSBwcm9wZXJ0aWVzIG9mIGEgc3VyZmFjZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4yMDk5IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjIxMDAiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfU2V0QWxwaGE8L0IKKz48L0NPREUKKz4oU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBmbGFnLCBVaW50OCBhbHBoYSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMTA2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+VGhpcyBmdW5jdGlvbiBhbmQgdGhlIHNlbWFudGljcyBvZiBTREwgYWxwaGEgYmxlbmRpbmcgaGF2ZSBjaGFuZ2VkIHNpbmNlIHZlcnNpb24gMS4xLjQuIFVwIHVudGlsIHZlcnNpb24gMS4xLjUsIGFuIGFscGhhIHZhbHVlIG9mIDAgd2FzIGNvbnNpZGVyZWQgb3BhcXVlIGFuZCBhIHZhbHVlIG9mIDI1NSB3YXMgY29uc2lkZXJlZCB0cmFuc3BhcmVudC4gVGhpcyBoYXMgbm93IGJlZW4gaW52ZXJ0ZWQ6IDAgKDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FMUEhBX1RSQU5TUEFSRU5UPC9UVAorPikgaXMgbm93IGNvbnNpZGVyZWQgdHJhbnNwYXJlbnQgYW5kIDI1NSAoPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQUxQSEFfT1BBUVVFPC9UVAorPikgaXMgbm93IGNvbnNpZGVyZWQgb3BhcXVlLjwvUAorPjwvQkxPQ0tRVU9URQorPjwvRElWCis+PFAKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0QWxwaGE8L1RUCis+IGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIHBlci1zdXJmYWNlIGFscGhhCit2YWx1ZSBhbmQvb3IgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBhbHBoYSBibGVuZGluZy48L1AKKz48UAorPlRoZTxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnN1cmZhY2U8L0kKKz48L1RUCis+IHBhcmFtZXRlciBzcGVjaWZpZXMgd2hpY2ggc3VyZmFjZSB3aG9zZSBhbHBoYQorYXR0cmlidXRlcyB5b3Ugd2lzaCB0byBhZGp1c3QuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmZsYWdzPC9JCis+PC9UVAorPiBpcyB1c2VkIHRvIHNwZWNpZnkKK3doZXRoZXIgYWxwaGEgYmxlbmRpbmcgc2hvdWxkIGJlIHVzZWQgKDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1NSQ0FMUEhBPC9UVAorPikgYW5kCit3aGV0aGVyIHRoZSBzdXJmYWNlIHNob3VsZCB1c2UgUkxFIGFjY2VsZXJhdGlvbiBmb3IgYmxpdHRpbmcKKyg8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9STEVBQ0NFTDwvVFQKKz4pLiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5mbGFnczwvSQorPjwvVFQKKz4gY2FuIGJlIGFuIE9SJ2QKK2NvbWJpbmF0aW9uIG9mIHRoZXNlIHR3byBvcHRpb25zLCBvbmUgb2YgdGhlc2Ugb3B0aW9ucyBvciAwLiBJZgorPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1JDQUxQSEE8L1RUCis+IGlzIG5vdCBwYXNzZWQgYXMgYSBmbGFnIHRoZW4gYWxsIGFscGhhCitpbmZvcm1hdGlvbiBpcyBpZ25vcmVkIHdoZW4gYmxpdHRpbmcgdGhlIHN1cmZhY2UuIFRoZQorPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+YWxwaGE8L0kKKz48L1RUCis+IHBhcmFtZXRlciBpcyB0aGUgcGVyLXN1cmZhY2UgYWxwaGEgdmFsdWU7IGEKK3N1cmZhY2UgbmVlZCBub3QgaGF2ZSBhbiBhbHBoYSBjaGFubmVsIHRvIHVzZSBwZXItc3VyZmFjZSBhbHBoYSBhbmQgYmxpdHRpbmcKK2NhbiBzdGlsbCBiZSBhY2NlbGVyYXRlZCB3aXRoIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1JMRUFDQ0VMPC9UVAorPi48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPlRoZSBwZXItc3VyZmFjZSBhbHBoYSB2YWx1ZSBvZiAxMjggaXMgY29uc2lkZXJlZCBhIHNwZWNpYWwgY2FzZSBhbmQKK2lzIG9wdGltaXNlZCwgc28gaXQncyBtdWNoIGZhc3RlciB0aGFuIG90aGVyIHBlci1zdXJmYWNlIHZhbHVlcy48L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjxQCis+QWxwaGEgZWZmZWN0cyBzdXJmYWNlIGJsaXR0aW5nIGluIHRoZSBmb2xsb3dpbmcgd2F5czo8L1AKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVOMjEyNiIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UkdCQS0mIzYyO1JHQiB3aXRoIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1NSQ0FMUEhBPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz5UaGUgc291cmNlIGlzIGFscGhhLWJsZW5kZWQgd2l0aCB0aGUgZGVzdGluYXRpb24sIHVzaW5nIHRoZSBhbHBoYSBjaGFubmVsLiA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9TUkNDT0xPUktFWTwvVFQKKz4gYW5kIHRoZSBwZXItc3VyZmFjZSBhbHBoYSBhcmUgaWdub3JlZC48L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5SR0JBLSYjNjI7UkdCIHdpdGhvdXQgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1JDQUxQSEE8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPlRoZSBSR0IgZGF0YSBpcyBjb3BpZWQgZnJvbSB0aGUgc291cmNlLiBUaGUgc291cmNlIGFscGhhIGNoYW5uZWwgYW5kIHRoZSBwZXItc3VyZmFjZSBhbHBoYSB2YWx1ZSBhcmUgaWdub3JlZC48L1AKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5SR0ItJiM2MjtSR0JBIHdpdGggPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1JDQUxQSEE8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPlRoZSBzb3VyY2UgaXMgYWxwaGEtYmxlbmRlZCB3aXRoIHRoZSBkZXN0aW5hdGlvbiB1c2luZyB0aGUgcGVyLXN1cmZhY2UgYWxwaGEKK3ZhbHVlLiBJZiA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9TUkNDT0xPUktFWTwvVFQKKz4gaXMgc2V0LCBvbmx5IHRoZSBwaXhlbHMgbm90CittYXRjaGluZyB0aGUgY29sb3JrZXkgdmFsdWUgYXJlIGNvcGllZC4gVGhlIGFscGhhIGNoYW5uZWwgb2YgdGhlIGNvcGllZCBwaXhlbHMKK2lzIHNldCB0byBvcGFxdWUuPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UkdCLSYjNjI7UkdCQSB3aXRob3V0IDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1NSQ0FMUEhBPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFAKKz5UaGUgUkdCIGRhdGEgaXMgY29waWVkIGZyb20gdGhlIHNvdXJjZSBhbmQgdGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb3BpZWQgcGl4ZWxzCitpcyBzZXQgdG8gb3BhcXVlLiBJZiA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9TUkNDT0xPUktFWTwvVFQKKz4gaXMgc2V0LCBvbmx5IHRoZSBwaXhlbHMKK25vdCBtYXRjaGluZyB0aGUgY29sb3JrZXkgdmFsdWUgYXJlIGNvcGllZC4gPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UkdCQS0mIzYyO1JHQkEgd2l0aCA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9TUkNBTFBIQTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+VGhlIHNvdXJjZSBpcyBhbHBoYS1ibGVuZGVkIHdpdGggdGhlIGRlc3RpbmF0aW9uIHVzaW5nIHRoZSBzb3VyY2UgYWxwaGEKK2NoYW5uZWwuIFRoZSBhbHBoYSBjaGFubmVsIGluIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlIGlzIGxlZnQgdW50b3VjaGVkLgorPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1JDQ09MT1JLRVk8L1RUCis+IGlzIGlnbm9yZWQuPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UkdCQS0mIzYyO1JHQkEgd2l0aG91dCA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9TUkNBTFBIQTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxQCis+VGhlIFJHQkEgZGF0YSBpcyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UuIElmIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1NSQ0NPTE9SS0VZPC9UVAorPiBpcyBzZXQsIG9ubHkgdGhlIHBpeGVscyBub3QgbWF0Y2hpbmcgdGhlIGNvbG9ya2V5IHZhbHVlIGFyZSBjb3BpZWQuPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UkdCLSYjNjI7UkdCIHdpdGggPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1JDQUxQSEE8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPlRoZSBzb3VyY2UgaXMgYWxwaGEtYmxlbmRlZCB3aXRoIHRoZSBkZXN0aW5hdGlvbiB1c2luZyB0aGUgcGVyLXN1cmZhY2UgYWxwaGEgdmFsdWUuIElmIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1NSQ0NPTE9SS0VZPC9UVAorPiBpcyBzZXQsIG9ubHkgdGhlIHBpeGVscyBub3QgbWF0Y2hpbmcgdGhlIGNvbG9ya2V5IHZhbHVlIGFyZSBjb3BpZWQuPC9QCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+UkdCLSYjNjI7UkdCIHdpdGhvdXQgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1JDQUxQSEE8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48UAorPlRoZSBSR0IgZGF0YSBpcyBjb3BpZWQgZnJvbSB0aGUgc291cmNlLiBJZiA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9TUkNDT0xPUktFWTwvVFQKKz4gaXMgc2V0LCBvbmx5IHRoZSBwaXhlbHMgbm90IG1hdGNoaW5nIHRoZSBjb2xvcmtleSB2YWx1ZSBhcmUgY29waWVkLjwvUAorPjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5PVEUiCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJOT1RFIgorPjxQCis+PEIKKz5Ob3RlOiA8L0IKKz4gTm90ZSB0aGF0IFJHQkEtJiM2MjtSR0JBIGJsaXRzICh3aXRoIFNETF9TUkNBTFBIQSBzZXQpIGtlZXAgdGhlIGFscGhhCitvZiB0aGUgZGVzdGluYXRpb24gc3VyZmFjZS4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW5ub3QgY29tcG9zZSB0d28gYXJiaXRyYXJ5CitSR0JBIHN1cmZhY2VzIHRoaXMgd2F5IGFuZCBnZXQgdGhlIHJlc3VsdCB5b3Ugd291bGQgZXhwZWN0IGZyb20gIm92ZXJsYXlpbmciCit0aGVtOyB0aGUgZGVzdGluYXRpb24gYWxwaGEgd2lsbCB3b3JrIGFzIGEgbWFzay48L1AKKz48UAorPkFsc28gbm90ZSB0aGF0IHBlci1waXhlbCBhbmQgcGVyLXN1cmZhY2UgYWxwaGEgY2Fubm90IGJlIGNvbWJpbmVkOwordGhlIHBlci1waXhlbCBhbHBoYSBpcyBhbHdheXMgdXNlZCBpZiBhdmFpbGFibGU8L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMTc5IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlRoaXMgZnVuY3Rpb24gcmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4sIG9yCis8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IGlmIHRoZXJlIHdhcyBhbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjE4NCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxtYXByZ2JhLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX01hcFJHQkE8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGdldHJnYmEuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0UkdCQTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZGlzcGxheWZvcm1hdGFscGhhLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0Rpc3BsYXlGb3JtYXRBbHBoYTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsYmxpdHN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQmxpdFN1cmZhY2U8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzZXRjb2xvcmtleS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldGNsaXByZWN0Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfU2V0Q29sb3JLZXk8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRDbGlwUmVjdDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRjbGlwcmVjdC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRjbGlwcmVjdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODk4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGNsaXByZWN0Lmh0bWwKQEAgLTAsMCArMSwyNDEgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfU2V0Q2xpcFJlY3Q8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfU2V0QWxwaGEiCitIUkVGPSJzZGxzZXRhbHBoYS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9HZXRDbGlwUmVjdCIKK0hSRUY9InNkbGdldGNsaXByZWN0Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNldGFscGhhLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRjbGlwcmVjdC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFNFVENMSVBSRUNUIgorPjwvQQorPlNETF9TZXRDbGlwUmVjdDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMjE5OSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9TZXRDbGlwUmVjdCZuYnNwOy0tJm5ic3A7U2V0cyB0aGUgY2xpcHBpbmcgcmVjdGFuZ2xlIGZvciBhIHN1cmZhY2UuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjIyMDIiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjIwMyIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfU2V0Q2xpcFJlY3Q8L0IKKz48L0NPREUKKz4oU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFNETF9SZWN0ICpyZWN0KTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjIyMDkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5TZXRzIHRoZSBjbGlwcGluZyByZWN0YW5nbGUgZm9yIGEgc3VyZmFjZS4gIFdoZW4gdGhpcyBzdXJmYWNlIGlzIHRoZQorZGVzdGluYXRpb24gb2YgYSBibGl0LCBvbmx5IHRoZSBhcmVhIHdpdGhpbiB0aGUgY2xpcCByZWN0YW5nbGUgd2lsbCBiZQorZHJhd24gaW50by48L1AKKz48UAorPlRoZSByZWN0YW5nbGUgcG9pbnRlZCB0byBieSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5yZWN0PC9JCis+PC9UVAorPiB3aWxsIGJlCitjbGlwcGVkIHRvIHRoZSBlZGdlcyBvZiB0aGUgc3VyZmFjZSBzbyB0aGF0IHRoZSBjbGlwIHJlY3RhbmdsZSBmb3IgYQorc3VyZmFjZSBjYW4gbmV2ZXIgZmFsbCBvdXRzaWRlIHRoZSBlZGdlcyBvZiB0aGUgc3VyZmFjZS48L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnJlY3Q8L0kKKz48L1RUCis+IGlzIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+TlVMTDwvVFQKKz4gdGhlIGNsaXBwaW5nCityZWN0YW5nbGUgd2lsbCBiZSBzZXQgdG8gdGhlIGZ1bGwgc2l6ZSBvZiB0aGUgc3VyZmFjZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjIxNyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxnZXRjbGlwcmVjdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRDbGlwUmVjdDwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsYmxpdHN1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQmxpdFN1cmZhY2U8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHN1cmZhY2UuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1N1cmZhY2U8L1NQQU4KKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldGFscGhhLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0Y2xpcHJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRBbHBoYTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldENsaXBSZWN0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGNvbG9ya2V5Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGNvbG9ya2V5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiNjY5NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0Y29sb3JrZXkuaHRtbApAQCAtMCwwICsxLDMyMSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9TZXRDb2xvcktleTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9TYXZlQk1QIgorSFJFRj0ic2Rsc2F2ZWJtcC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9TZXRBbHBoYSIKK0hSRUY9InNkbHNldGFscGhhLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNhdmVibXAuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNldGFscGhhLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMU0VUQ09MT1JLRVkiCis+PC9BCis+U0RMX1NldENvbG9yS2V5PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yMDQ1IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1NldENvbG9yS2V5Jm5ic3A7LS0mbmJzcDtTZXRzIHRoZSBjb2xvciBrZXkgKHRyYW5zcGFyZW50IHBpeGVsKSBpbiBhIGJsaXR0YWJsZSBzdXJmYWNlIGFuZAorUkxFIGFjY2VsZXJhdGlvbi48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMjA0OCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4yMDQ5IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1NldENvbG9yS2V5PC9CCis+PC9DT0RFCis+KFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIgZmxhZywgVWludDMyIGtleSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMDU1IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+IFNldHMgdGhlIGNvbG9yIGtleSAodHJhbnNwYXJlbnQgcGl4ZWwpIGluIGEgYmxpdHRhYmxlIHN1cmZhY2UgYW5kIGVuYWJsZXMgb3IKKyBkaXNhYmxlcyBSTEUgYmxpdCBhY2NlbGVyYXRpb24uPC9QCis+PFAKKz5STEUgYWNjZWxlcmF0aW9uIGNhbiBzdWJzdGFudGlhbGx5IHNwZWVkIHVwIGJsaXR0aW5nIG9mIGltYWdlcyB3aXRoIGxhcmdlCitob3Jpem9udGFsIHJ1bnMgb2YgdHJhbnNwYXJlbnQgcGl4ZWxzIChpLmUuLCBwaXhlbHMgdGhhdCBtYXRjaCB0aGUKKzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmtleTwvSQorPjwvVFQKKz4gdmFsdWUpLiBUaGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+a2V5PC9JCis+PC9UVAorPiBtdXN0IGJlIG9mIHRoZSBzYW1lIHBpeGVsIGZvcm1hdCBhcyB0aGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c3VyZmFjZTwvSQorPjwvVFQKKz4sIDxBCitIUkVGPSJzZGxtYXByZ2IuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTWFwUkdCPC9UVAorPjwvQQorPiBpcyBvZnRlbiB1c2VmdWwgZm9yIG9idGFpbmluZyBhbiBhY2NlcHRhYmxlIHZhbHVlLjwvUAorPjxQCis+SWYgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZmxhZzwvSQorPjwvVFQKKz4gaXMgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1JDQ09MT1JLRVk8L1RUCis+IHRoZW4KKzxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmtleTwvSQorPjwvVFQKKz4gaXMgdGhlIHRyYW5zcGFyZW50IHBpeGVsIHZhbHVlIGluIHRoZSBzb3VyY2UgaW1hZ2Ugb2YgYQorYmxpdC48L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmZsYWc8L0kKKz48L1RUCis+IGlzIE9SJ2Qgd2l0aAorPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUkxFQUNDRUw8L1RUCis+IHRoZW4gdGhlIHN1cmZhY2Ugd2lsbCBiZSBkcmF3IHVzaW5nIFJMRQorYWNjZWxlcmF0aW9uIHdoZW4gZHJhd24gd2l0aAorPEEKK0hSRUY9InNkbGJsaXRzdXJmYWNlLmh0bWwiCis+U0RMX0JsaXRTdXJmYWNlPC9BCis+LiAgVGhlIHN1cmZhY2Ugd2lsbAorYWN0dWFsbHkgYmUgZW5jb2RlZCBmb3IgUkxFIGFjY2VsZXJhdGlvbiB0aGUgZmlyc3QgdGltZQorPEEKK0hSRUY9InNkbGJsaXRzdXJmYWNlLmh0bWwiCis+U0RMX0JsaXRTdXJmYWNlPC9BCis+IG9yCis8QQorSFJFRj0ic2RsZGlzcGxheWZvcm1hdC5odG1sIgorPlNETF9EaXNwbGF5Rm9ybWF0PC9BCis+IGlzIGNhbGxlZCBvbiB0aGUKK3N1cmZhY2UuPC9QCis+PFAKKz5JZiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5mbGFnPC9JCis+PC9UVAorPiBpcyAwLCB0aGlzIGZ1bmN0aW9uIGNsZWFycworYW55IGN1cnJlbnQgY29sb3Iga2V5LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yMDc2IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlRoaXMgZnVuY3Rpb24gcmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4sIG9yCis8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPi0xPC9TUEFOCis+IGlmIHRoZXJlIHdhcyBhbiBlcnJvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjA4MSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxibGl0c3VyZmFjZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9CbGl0U3VyZmFjZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZGlzcGxheWZvcm1hdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9EaXNwbGF5Rm9ybWF0PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxtYXByZ2IuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTWFwUkdCPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZXRhbHBoYS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRBbHBoYTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNhdmVibXAuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzZXRhbHBoYS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NhdmVCTVA8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRBbHBoYTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRjb2xvcnMuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0Y29sb3JzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5NTY0NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0Y29sb3JzLmh0bWwKQEAgLTAsMCArMSwzNTggQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfU2V0Q29sb3JzPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0ZsaXAiCitIUkVGPSJzZGxmbGlwLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1NldFBhbGV0dGUiCitIUkVGPSJzZGxzZXRwYWxldHRlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGZsaXAuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHNldHBhbGV0dGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExTRVRDT0xPUlMiCis+PC9BCis+U0RMX1NldENvbG9yczwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTQ2MiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9TZXRDb2xvcnMmbmJzcDstLSZuYnNwO1NldHMgYSBwb3J0aW9uIG9mIHRoZSBjb2xvcm1hcCBmb3IgdGhlIGdpdmVuIDgtYml0IHN1cmZhY2UuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjE0NjUiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMTQ2NiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9TZXRDb2xvcnM8L0IKKz48L0NPREUKKz4oU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFNETF9Db2xvciAqY29sb3JzLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTQ3MiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlNldHMgYSBwb3J0aW9uIG9mIHRoZSBjb2xvcm1hcCBmb3IgdGhlIGdpdmVuIDgtYml0IHN1cmZhY2UuPC9QCis+PFAKKz5XaGVuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnN1cmZhY2U8L0kKKz48L1RUCis+IGlzIHRoZSBzdXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudAorZGlzcGxheSwgdGhlIGRpc3BsYXkgY29sb3JtYXAgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBjb2xvcnMuICBJZgorPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSFdQQUxFVFRFPC9UVAorPiB3YXMgc2V0IGluIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz5TRExfU2V0VmlkZW9Nb2RlPC9BCis+IGZsYWdzLAorPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldENvbG9yczwvVFQKKz4gd2lsbCBhbHdheXMgcmV0dXJuIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MTwvU1BBTgorPiwKK2FuZCB0aGUgcGFsZXR0ZSBpcyBndWFyYW50ZWVkIHRvIGJlIHNldCB0aGUgd2F5IHlvdSBkZXNpcmUsIGV2ZW4gaWYgdGhlIHdpbmRvdworY29sb3JtYXAgaGFzIHRvIGJlIHdhcnBlZCBvciBydW4gdW5kZXIgZW11bGF0aW9uLjwvUAorPjxQCis+VGhlIGNvbG9yIGNvbXBvbmVudHMgb2YgYQorPEEKK0hSRUY9InNkbGNvbG9yLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Db2xvcjwvU1BBTgorPjwvQQorPgorc3RydWN0dXJlIGFyZSA4LWJpdHMgaW4gc2l6ZSwgZ2l2aW5nIHlvdSBhIHRvdGFsIG9mIDI1NjxTVVAKKz4zPC9TVVAKKz4KKz0xNjc3NzIxNiBjb2xvcnMuPC9QCis+PFAKKz5QYWxldHRpemVkICg4LWJpdCkgc2NyZWVuIHN1cmZhY2VzIHdpdGggdGhlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hXUEFMRVRURTwvVFQKKz4KK2ZsYWcgaGF2ZSB0d28gcGFsZXR0ZXMsIGEgbG9naWNhbCBwYWxldHRlIHRoYXQgaXMgdXNlZCBmb3IgbWFwcGluZyBibGl0cwordG8vZnJvbSB0aGUgc3VyZmFjZSBhbmQgYSBwaHlzaWNhbCBwYWxldHRlICh0aGF0IGRldGVybWluZXMgaG93IHRoZQoraGFyZHdhcmUgd2lsbCBtYXAgdGhlIGNvbG9ycyB0byB0aGUgZGlzcGxheSkuIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRDb2xvcnM8L1RUCis+Cittb2RpZmllcyBib3RoIHBhbGV0dGVzIChpZiBwcmVzZW50KSwgYW5kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworPEEKK0hSRUY9InNkbHNldHBhbGV0dGUuaHRtbCIKKz5TRExfU2V0UGFsZXR0ZTwvQQorPiB3aXRoIHRoZQorPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZmxhZ3M8L0kKKz48L1RUCis+IHNldCB0bworPFRUCitDTEFTUz0iTElURVJBTCIKKz4oU0RMX0xPR1BBTCB8IFNETF9QSFlTUEFMKTwvVFQKKz4uPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE0OTEiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+SWYgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c3VyZmFjZTwvSQorPjwvVFQKKz4gaXMgbm90IGEgcGFsZXR0aXplZCBzdXJmYWNlLCB0aGlzIGZ1bmN0aW9uCitkb2VzIG5vdGhpbmcsIHJldHVybmluZyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4uICBJZiBhbGwgb2YgdGhlIGNvbG9ycyB3ZXJlIHNldAorYXMgcGFzc2VkIHRvIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRDb2xvcnM8L1RUCis+LCBpdCB3aWxsIHJldHVybgorPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4xPC9TUEFOCis+LiAgSWYgbm90IGFsbCB0aGUgY29sb3IgZW50cmllcyB3ZXJlIHNldCBleGFjdGx5IGFzCitnaXZlbiwgaXQgd2lsbCByZXR1cm4gPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+LCBhbmQgeW91IHNob3VsZCBsb29rIGF0IHRoZQorc3VyZmFjZSBwYWxldHRlIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIGNvbG9yIHBhbGV0dGUuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE0OTkiCis+PC9BCis+PEgyCis+RXhhbXBsZTwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+LyogQ3JlYXRlIGEgZGlzcGxheSBzdXJmYWNlIHdpdGggYSBncmF5c2NhbGUgcGFsZXR0ZSAqLworU0RMX1N1cmZhY2UgKnNjcmVlbjsKK1NETF9Db2xvciBjb2xvcnNbMjU2XTsKK2ludCBpOworLgorLgorLgorLyogRmlsbCBjb2xvcnMgd2l0aCBjb2xvciBpbmZvcm1hdGlvbiAqLworZm9yKGk9MDtpJiM2MDsyNTY7aSsrKXsKKyAgY29sb3JzW2ldLnI9aTsKKyAgY29sb3JzW2ldLmc9aTsKKyAgY29sb3JzW2ldLmI9aTsKK30KKworLyogQ3JlYXRlIGRpc3BsYXkgKi8KK3NjcmVlbj1TRExfU2V0VmlkZW9Nb2RlKDY0MCwgNDgwLCA4LCBTRExfSFdQQUxFVFRFKTsKK2lmKCFzY3JlZW4peworICBwcmludGYoIkNvdWxkbid0IHNldCB2aWRlbyBtb2RlOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICBleGl0KC0xKTsKK30KKworLyogU2V0IHBhbGV0dGUgKi8KK1NETF9TZXRDb2xvcnMoc2NyZWVuLCBjb2xvcnMsIDAsIDI1Nik7CisuCisuCisuCisuPC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTUwMiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxjb2xvci5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQ29sb3I8L1NQQU4KKz48L0EKKz4KKzxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHNldHBhbGV0dGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0UGFsZXR0ZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFZpZGVvTW9kZTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGZsaXAuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzZXRwYWxldHRlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfRmxpcDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NldFBhbGV0dGU8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0Y3Vyc29yLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGN1cnNvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTQ0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGN1cnNvci5odG1sCkBAIC0wLDAgKzEsMjIyIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1NldEN1cnNvcjwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9GcmVlQ3Vyc29yIgorSFJFRj0ic2RsZnJlZWN1cnNvci5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9HZXRDdXJzb3IiCitIUkVGPSJzZGxnZXRjdXJzb3IuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZnJlZWN1cnNvci5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0Y3Vyc29yLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMU0VUQ1VSU09SIgorPjwvQQorPlNETF9TZXRDdXJzb3I8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjI1NjMiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfU2V0Q3Vyc29yJm5ic3A7LS0mbmJzcDtTZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgbW91c2UgY3Vyc29yLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4yNTY2IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjI1NjciCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1NldEN1cnNvcjwvQgorPjwvQ09ERQorPihTRExfQ3Vyc29yICpjdXJzb3IpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjU3MyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY3Vyc29yIHRvIAordGhlIHNwZWNpZmllZCBvbmUuCitJZiB0aGUgY3Vyc29yIGlzIGN1cnJlbnRseSB2aXNpYmxlLCB0aGUgY2hhbmdlIHdpbGwgYmUgaW1tZWRpYXRlbHkgCityZXByZXNlbnRlZCBvbiB0aGUgZGlzcGxheS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjU3NiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxnZXRjdXJzb3IuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0Q3Vyc29yPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxjcmVhdGVjdXJzb3IuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlQ3Vyc29yPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzaG93Y3Vyc29yLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1Nob3dDdXJzb3I8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxmcmVlY3Vyc29yLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0Y3Vyc29yLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfRnJlZUN1cnNvcjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldEN1cnNvcjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGV2ZW50ZmlsdGVyLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGV2ZW50ZmlsdGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwOGJhYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0ZXZlbnRmaWx0ZXIuaHRtbApAQCAtMCwwICsxLDI4NCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9TZXRFdmVudEZpbHRlcjwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJFdmVudCBGdW5jdGlvbnMuIgorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1B1c2hFdmVudCIKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9HZXRFdmVudEZpbHRlciIKK0hSRUY9InNkbGdldGV2ZW50ZmlsdGVyLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0ZXZlbnRmaWx0ZXIuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExTRVRFVkVOVEZJTFRFUiIKKz48L0EKKz5TRExfU2V0RXZlbnRGaWx0ZXI8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjU1NzUiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfU2V0RXZlbnRGaWx0ZXImbmJzcDstLSZuYnNwO1NldHMgdXAgYSBmaWx0ZXIgdG8gcHJvY2VzcyBhbGwgZXZlbnRzIGJlZm9yZSB0aGV5IGFyZSBwb3N0ZWQgCit0byB0aGUgZXZlbnQgcXVldWUuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU1NzgiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTU3OSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfU2V0RXZlbnRGaWx0ZXI8L0IKKz48L0NPREUKKz4oU0RMX0V2ZW50RmlsdGVyIGZpbHRlcik7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41NTg1IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+VGhpcyBmdW5jdGlvbiBzZXRzIHVwIGEgZmlsdGVyIHRvIHByb2Nlc3MgYWxsIGV2ZW50cyBiZWZvcmUgdGhleSBhcmUgcG9zdGVkIAordG8gdGhlIGV2ZW50IHF1ZXVlLiAgVGhpcyBpcyBhIHZlcnkgcG93ZXJmdWwgYW5kIGZsZXhpYmxlIGZlYXR1cmUuICBUaGUgZmlsdGVyIAoraXMgcHJvdG90eXBlZCBhczoKKzxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz50eXBlZGVmIGludCAoKlNETF9FdmVudEZpbHRlcikoY29uc3QgU0RMX0V2ZW50ICpldmVudCk7PC9QUkUKKz4KK0lmIHRoZSBmaWx0ZXIgcmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjE8L1NQQU4KKz4sIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmUgCithZGRlZCB0byB0aGUgaW50ZXJuYWwgcXVldWUuICBJZiBpdCByZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiwgCit0aGVuIHRoZSBldmVudCB3aWxsIGJlIGRyb3BwZWQgZnJvbSB0aGUgcXVldWUuICBUaGlzIGFsbG93cyBzZWxlY3RpdmUKK2ZpbHRlcmluZyBvZiBkeW5hbWljYWxseS48L1AKKz48UAorPlRoZXJlIGlzIG9uZSBjYXZlYXQgd2hlbiBkZWFsaW5nIHdpdGggdGhlIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1FVSVRFVkVOVDwvVFQKKz4gZXZlbnQgdHlwZS4gIFRoZQorZXZlbnQgZmlsdGVyIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHdpbmRvdyBtYW5hZ2VyIGRlc2lyZXMgdG8gY2xvc2UgdGhlCithcHBsaWNhdGlvbiB3aW5kb3cuICBJZiB0aGUgZXZlbnQgZmlsdGVyIHJldHVybnMgMSwgdGhlbiB0aGUgd2luZG93IHdpbGwKK2JlIGNsb3NlZCwgb3RoZXJ3aXNlIHRoZSB3aW5kb3cgd2lsbCByZW1haW4gb3BlbiBpZiBwb3NzaWJsZS4KK0lmIHRoZSBxdWl0IGV2ZW50IGlzIGdlbmVyYXRlZCBieSBhbiBpbnRlcnJ1cHQgc2lnbmFsLCBpdCB3aWxsIGJ5cGFzcyB0aGUKK2ludGVybmFsIHF1ZXVlIGFuZCBiZSBkZWxpdmVyZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGF0IHRoZSBuZXh0IGV2ZW50IHBvbGwuPC9QCis+PERJVgorQ0xBU1M9Ik5PVEUiCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJOT1RFIgorPjxQCis+PEIKKz5Ob3RlOiA8L0IKKz5FdmVudHMgcHVzaGVkIG9udG8gdGhlIHF1ZXVlIHdpdGggPEEKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QdXNoRXZlbnQ8L1RUCis+PC9BCis+IG9yIDxBCitIUkVGPSJzZGxwZWVwZXZlbnRzLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1BlZXBFdmVudHM8L1RUCis+PC9BCis+IGRvIG5vdCBnZXQgcGFzc2VkIHRocm91Z2ggdGhlIGV2ZW50IGZpbHRlci48L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+PFNQQU4KK0NMQVNTPSJlbXBoYXNpcyIKKz48SQorQ0xBU1M9IkVNUEhBU0lTIgorPkJlIENhcmVmdWwhPC9JCis+PC9TUEFOCis+IFRoZSBldmVudCBmaWx0ZXIgZnVuY3Rpb24gbWF5IHJ1biBpbiBhIGRpZmZlcmVudCB0aHJlYWQgc28gYmUgY2FyZWZ1bCB3aGF0IHlvdSBkbyB3aXRoaW4gaXQuPC9QCis+PC9CTE9DS1FVT1RFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTYwMiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZ2V0ZXZlbnRmaWx0ZXIuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0RXZlbnRGaWx0ZXI8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHB1c2hldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9QdXNoRXZlbnQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxwdXNoZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXRldmVudGZpbHRlci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1B1c2hFdmVudDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldEV2ZW50RmlsdGVyPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGdhbW1hLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGdhbW1hLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0M2E5NgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0Z2FtbWEuaHRtbApAQCAtMCwwICsxLDIzMSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9TZXRHYW1tYTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9TZXRQYWxldHRlIgorSFJFRj0ic2Rsc2V0cGFsZXR0ZS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9HZXRHYW1tYVJhbXAiCitIUkVGPSJzZGxnZXRnYW1tYXJhbXAuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc2V0cGFsZXR0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0Z2FtbWFyYW1wLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMU0VUR0FNTUEiCis+PC9BCis+U0RMX1NldEdhbW1hPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4xNTY5IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1NldEdhbW1hJm5ic3A7LS0mbmJzcDtTZXRzIHRoZSBjb2xvciBnYW1tYSBmdW5jdGlvbiBmb3IgdGhlIGRpc3BsYXk8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTU3MiIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xNTczIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1NldEdhbW1hPC9CCis+PC9DT0RFCis+KGZsb2F0IHJlZGdhbW1hLCBmbG9hdCBncmVlbmdhbW1hLCBmbG9hdCBibHVlZ2FtbWEpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTU3OSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlNldHMgdGhlICJnYW1tYSBmdW5jdGlvbiIgZm9yIHRoZSBkaXNwbGF5IG9mIGVhY2ggY29sb3IgY29tcG9uZW50LiAgR2FtbWEKK2NvbnRyb2xzIHRoZSBicmlnaHRuZXNzL2NvbnRyYXN0IG9mIGNvbG9ycyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4KK0EgZ2FtbWEgdmFsdWUgb2YgPFRUCitDTEFTUz0iQ09OU1RBTlQiCis+MS4wPC9UVAorPiBpcyBpZGVudGl0eSAoaS5lLiwgbm8gYWRqdXN0bWVudAoraXMgbWFkZSkuPC9QCis+PFAKKz5UaGlzIGZ1bmN0aW9uIGFkanVzdHMgdGhlIGdhbW1hIGJhc2VkIG9uIHRoZSAiZ2FtbWEgZnVuY3Rpb24iIHBhcmFtZXRlciwKK3lvdSBjYW4gZGlyZWN0bHkgc3BlY2lmeSBsb29rdXAgdGFibGVzIGZvciBnYW1tYSBhZGp1c3RtZW50IHdpdGgKKzxBCitIUkVGPSJzZGxzZXRnYW1tYXJhbXAuaHRtbCIKKz5TRExfU2V0R2FtbWFSYW1wPC9BCis+LjwvUAorPjxQCis+Tm90IGFsbCBkaXNwbGF5IGhhcmR3YXJlIGlzIGFibGUgdG8gY2hhbmdlIGdhbW1hLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xNTg2IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgLTEgb24gZXJyb3IgKG9yIGlmIGdhbW1hIGFkanVzdG1lbnQgaXMgbm90IHN1cHBvcnRlZCkuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE1ODkiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZ2V0Z2FtbWFyYW1wLmh0bWwiCis+U0RMX0dldEdhbW1hUmFtcDwvQQorPgorPEEKK0hSRUY9InNkbHNldGdhbW1hcmFtcC5odG1sIgorPlNETF9TZXRHYW1tYVJhbXA8L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHNldHBhbGV0dGUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXRnYW1tYXJhbXAuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRQYWxldHRlPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfR2V0R2FtbWFSYW1wPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldGdhbW1hcmFtcC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRnYW1tYXJhbXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU5OWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRnYW1tYXJhbXAuaHRtbApAQCAtMCwwICsxLDIzMCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9TZXRHYW1tYVJhbXA8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR2V0R2FtbWFSYW1wIgorSFJFRj0ic2RsZ2V0Z2FtbWFyYW1wLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX01hcFJHQiIKK0hSRUY9InNkbG1hcHJnYi5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRnYW1tYXJhbXAuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbG1hcHJnYi5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFNFVEdBTU1BUkFNUCIKKz48L0EKKz5TRExfU2V0R2FtbWFSYW1wPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4xNjI0IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1NldEdhbW1hUmFtcCZuYnNwOy0tJm5ic3A7U2V0cyB0aGUgY29sb3IgZ2FtbWEgbG9va3VwIHRhYmxlcyBmb3IgdGhlIGRpc3BsYXk8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTYyNyIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xNjI4IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1NldEdhbW1hUmFtcDwvQgorPjwvQ09ERQorPihVaW50MTYgKnJlZHRhYmxlLCBVaW50MTYgKmdyZWVudGFibGUsIFVpbnQxNiAqYmx1ZXRhYmxlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE2MzQiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5TZXRzIHRoZSBnYW1tYSBsb29rdXAgdGFibGVzIGZvciB0aGUgZGlzcGxheSBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCitFYWNoIHRhYmxlIGlzIGFuIGFycmF5IG9mIDI1NiBVaW50MTYgdmFsdWVzLCByZXByZXNlbnRpbmcgYSBtYXBwaW5nCitiZXR3ZWVuIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZvciB0aGF0IGNoYW5uZWwuIFRoZSBpbnB1dCBpcyB0aGUgaW5kZXgKK2ludG8gdGhlIGFycmF5LCBhbmQgdGhlIG91dHB1dCBpcyB0aGUgMTYtYml0IGdhbW1hIHZhbHVlIGF0IHRoYXQgaW5kZXgsCitzY2FsZWQgdG8gdGhlIG91dHB1dCBjb2xvciBwcmVjaXNpb24uIFlvdSBtYXkgcGFzcyBOVUxMIHRvIGFueSBvZiB0aGUKK2NoYW5uZWxzIHRvIGxlYXZlIHRoZW0gdW5jaGFuZ2VkLjwvUAorPjxQCis+VGhpcyBmdW5jdGlvbiBhZGp1c3RzIHRoZSBnYW1tYSBiYXNlZCBvbiBsb29rdXAgdGFibGVzLCB5b3UgY2FuIGFsc28KK2hhdmUgdGhlIGdhbW1hIGNhbGN1bGF0ZWQgYmFzZWQgb24gYSAiZ2FtbWEgZnVuY3Rpb24iIHBhcmFtZXRlciB3aXRoCis8QQorSFJFRj0ic2Rsc2V0Z2FtbWEuaHRtbCIKKz5TRExfU2V0R2FtbWE8L0EKKz4uPC9QCis+PFAKKz5Ob3QgYWxsIGRpc3BsYXkgaGFyZHdhcmUgaXMgYWJsZSB0byBjaGFuZ2UgZ2FtbWEuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE2NDAiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyAtMSBvbiBlcnJvciAob3IgaWYgZ2FtbWEgYWRqdXN0bWVudCBpcyBub3Qgc3VwcG9ydGVkKS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTY0MyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxzZXRnYW1tYS5odG1sIgorPlNETF9TZXRHYW1tYTwvQQorPgorPEEKK0hSRUY9InNkbGdldGdhbW1hcmFtcC5odG1sIgorPlNETF9HZXRHYW1tYVJhbXA8L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldGdhbW1hcmFtcC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbG1hcHJnYi5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldEdhbW1hUmFtcDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX01hcFJHQjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRtb2RzdGF0ZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRtb2RzdGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjlhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldG1vZHN0YXRlLmh0bWwKQEAgLTAsMCArMSwyMzcgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfU2V0TW9kU3RhdGU8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iRXZlbnQgRnVuY3Rpb25zLiIKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9HZXRNb2RTdGF0ZSIKK0hSRUY9InNkbGdldG1vZHN0YXRlLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0dldEtleU5hbWUiCitIUkVGPSJzZGxnZXRrZXluYW1lLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdldG1vZHN0YXRlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRrZXluYW1lLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMU0VUTU9EU1RBVEUiCis+PC9BCis+U0RMX1NldE1vZFN0YXRlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU41NzUyIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1NldE1vZFN0YXRlJm5ic3A7LS0mbmJzcDtTZXQgdGhlIGN1cnJlbnQga2V5IG1vZGlmaWVyIHN0YXRlPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjU3NTUiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONTc1NiIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfU2V0TW9kU3RhdGU8L0IKKz48L0NPREUKKz4oU0RMTW9kIG1vZHN0YXRlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU3NjIiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGUgaW52ZXJzZSBvZiA8QQorSFJFRj0ic2RsZ2V0bW9kc3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0TW9kU3RhdGU8L1RUCis+PC9BCis+LCA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0TW9kU3RhdGU8L1RUCis+IGFsbG93cyB5b3UgdG8gaW1wb3NlIG1vZGlmaWVyIGtleSBzdGF0ZXMgb24geW91ciBhcHBsaWNhdGlvbi48L1AKKz48UAorPlNpbXBseSBwYXNzIHlvdXIgZGVzaXJlZCBtb2RpZmllciBzdGF0ZXMgaW50byA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5tb2RzdGF0ZTwvSQorPjwvVFQKKz4uIFRoaXMgdmFsdWUgbXkgYmUgYSBsb2dpY2FsIE9SJ2QgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZzo8L1AKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBlbnVtIHsKKyAgS01PRF9OT05FICA9IDB4MDAwMCwKKyAgS01PRF9MU0hJRlQ9IDB4MDAwMSwKKyAgS01PRF9SU0hJRlQ9IDB4MDAwMiwKKyAgS01PRF9MQ1RSTCA9IDB4MDA0MCwKKyAgS01PRF9SQ1RSTCA9IDB4MDA4MCwKKyAgS01PRF9MQUxUICA9IDB4MDEwMCwKKyAgS01PRF9SQUxUICA9IDB4MDIwMCwKKyAgS01PRF9MTUVUQSA9IDB4MDQwMCwKKyAgS01PRF9STUVUQSA9IDB4MDgwMCwKKyAgS01PRF9OVU0gICA9IDB4MTAwMCwKKyAgS01PRF9DQVBTICA9IDB4MjAwMCwKKyAgS01PRF9NT0RFICA9IDB4NDAwMCwKK30gU0RMTW9kOzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjU3NzEiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsZ2V0bW9kc3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfR2V0TW9kU3RhdGU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXRtb2RzdGF0ZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldGtleW5hbWUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9HZXRNb2RTdGF0ZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50ZnVuY3Rpb25zLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldEtleU5hbWU8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0cGFsZXR0ZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXRwYWxldHRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyMmYxNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0cGFsZXR0ZS5odG1sCkBAIC0wLDAgKzEsMzUyIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1NldFBhbGV0dGU8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfU2V0Q29sb3JzIgorSFJFRj0ic2Rsc2V0Y29sb3JzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1NldEdhbW1hIgorSFJFRj0ic2Rsc2V0Z2FtbWEuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc2V0Y29sb3JzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZXRnYW1tYS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFNFVFBBTEVUVEUiCis+PC9BCis+U0RMX1NldFBhbGV0dGU8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjE1MTciCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfU2V0UGFsZXR0ZSZuYnNwOy0tJm5ic3A7U2V0cyB0aGUgY29sb3JzIGluIHRoZSBwYWxldHRlIG9mIGFuIDgtYml0IHN1cmZhY2UuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjE1MjAiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMTUyMSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9TZXRQYWxldHRlPC9CCis+PC9DT0RFCis+KFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgZmxhZ3MsIFNETF9Db2xvciAqY29sb3JzLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTUyNyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlNldHMgYSBwb3J0aW9uIG9mIHRoZSBwYWxldHRlIGZvciB0aGUgZ2l2ZW4gOC1iaXQgc3VyZmFjZS48L1AKKz48UAorPlBhbGV0dGl6ZWQgKDgtYml0KSBzY3JlZW4gc3VyZmFjZXMgd2l0aCB0aGUKKzxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hXUEFMRVRURTwvVFQKKz4gZmxhZyBoYXZlIHR3byBwYWxldHRlcywgYSBsb2dpY2FsCitwYWxldHRlIHRoYXQgaXMgdXNlZCBmb3IgbWFwcGluZyBibGl0cyB0by9mcm9tIHRoZSBzdXJmYWNlIGFuZCBhCitwaHlzaWNhbCBwYWxldHRlICh0aGF0IGRldGVybWluZXMgaG93IHRoZSBoYXJkd2FyZSB3aWxsIG1hcCB0aGUgY29sb3JzCit0byB0aGUgZGlzcGxheSkuIDxBCitIUkVGPSJzZGxibGl0c3VyZmFjZS5odG1sIgorPlNETF9CbGl0U3VyZmFjZTwvQQorPgorYWx3YXlzIHVzZXMgdGhlIGxvZ2ljYWwgcGFsZXR0ZSB3aGVuIGJsaXR0aW5nIHN1cmZhY2VzIChpZiBpdCBoYXMgdG8KK2NvbnZlcnQgYmV0d2VlbiBzdXJmYWNlIHBpeGVsIGZvcm1hdHMpLiBCZWNhdXNlIG9mIHRoaXMsIGl0IGlzIG9mdGVuCit1c2VmdWwgdG8gbW9kaWZ5IG9ubHkgb25lIG9yIHRoZSBvdGhlciBwYWxldHRlIHRvIGFjaGlldmUgdmFyaW91cworc3BlY2lhbCBjb2xvciBlZmZlY3RzIChlLmcuLCBzY3JlZW4gZmFkaW5nLCBjb2xvciBmbGFzaGVzLCBzY3JlZW4gZGltbWluZykuPC9QCis+PFAKKz5UaGlzIGZ1bmN0aW9uIGNhbiBtb2RpZnkgZWl0aGVyIHRoZSBsb2dpY2FsIG9yIHBoeXNpY2FsIHBhbGV0dGUgYnkKK3NwZWNpZmluZyA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9MT0dQQUw8L1RUCis+IG9yCis8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9QSFlTUEFMPC9UVAorPnRoZSBpbiB0aGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZmxhZ3M8L0kKKz48L1RUCis+CitwYXJhbWV0ZXIuPC9QCis+PFAKKz5XaGVuIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPnN1cmZhY2U8L0kKKz48L1RUCis+IGlzIHRoZSBzdXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudAorZGlzcGxheSwgdGhlIGRpc3BsYXkgY29sb3JtYXAgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBjb2xvcnMuICBJZgorPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSFdQQUxFVFRFPC9UVAorPiB3YXMgc2V0IGluIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz5TRExfU2V0VmlkZW9Nb2RlPC9BCis+IGZsYWdzLAorPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFBhbGV0dGU8L1RUCis+IHdpbGwgYWx3YXlzIHJldHVybiA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjE8L1NQQU4KKz4sCithbmQgdGhlIHBhbGV0dGUgaXMgZ3VhcmFudGVlZCB0byBiZSBzZXQgdGhlIHdheSB5b3UgZGVzaXJlLCBldmVuIGlmIHRoZSB3aW5kb3cKK2NvbG9ybWFwIGhhcyB0byBiZSB3YXJwZWQgb3IgcnVuIHVuZGVyIGVtdWxhdGlvbi48L1AKKz48UAorPlRoZSBjb2xvciBjb21wb25lbnRzIG9mIGEKKzxBCitIUkVGPSJzZGxjb2xvci5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfQ29sb3I8L1NQQU4KKz48L0EKKz4gc3RydWN0dXJlCithcmUgOC1iaXRzIGluIHNpemUsIGdpdmluZyB5b3UgYSB0b3RhbCBvZgorMjU2PFNVUAorPjM8L1NVUAorPj0xNjc3NzIxNiBjb2xvcnMuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE1NDciCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+SWYgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+c3VyZmFjZTwvSQorPjwvVFQKKz4gaXMgbm90IGEgcGFsZXR0aXplZCBzdXJmYWNlLCB0aGlzIGZ1bmN0aW9uCitkb2VzIG5vdGhpbmcsIHJldHVybmluZyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4uICBJZiBhbGwgb2YgdGhlIGNvbG9ycyB3ZXJlIHNldAorYXMgcGFzc2VkIHRvIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRQYWxldHRlPC9UVAorPiwgaXQgd2lsbCByZXR1cm4KKzxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MTwvU1BBTgorPi4gIElmIG5vdCBhbGwgdGhlIGNvbG9yIGVudHJpZXMgd2VyZSBzZXQgZXhhY3RseSBhcworZ2l2ZW4sIGl0IHdpbGwgcmV0dXJuIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiwgYW5kIHlvdSBzaG91bGQgbG9vayBhdCB0aGUKK3N1cmZhY2UgcGFsZXR0ZSB0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBjb2xvciBwYWxldHRlLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xNTU1IgorPjwvQQorPjxIMgorPkV4YW1wbGU8L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPiAgICAgICAgLyogQ3JlYXRlIGEgZGlzcGxheSBzdXJmYWNlIHdpdGggYSBncmF5c2NhbGUgcGFsZXR0ZSAqLworICAgICAgICBTRExfU3VyZmFjZSAqc2NyZWVuOworICAgICAgICBTRExfQ29sb3IgY29sb3JzWzI1Nl07CisgICAgICAgIGludCBpOworICAgICAgICAuCisgICAgICAgIC4KKyAgICAgICAgLgorICAgICAgICAvKiBGaWxsIGNvbG9ycyB3aXRoIGNvbG9yIGluZm9ybWF0aW9uICovCisgICAgICAgIGZvcihpPTA7aSYjNjA7MjU2O2krKyl7CisgICAgICAgICAgY29sb3JzW2ldLnI9aTsKKyAgICAgICAgICBjb2xvcnNbaV0uZz1pOworICAgICAgICAgIGNvbG9yc1tpXS5iPWk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDcmVhdGUgZGlzcGxheSAqLworICAgICAgICBzY3JlZW49U0RMX1NldFZpZGVvTW9kZSg2NDAsIDQ4MCwgOCwgU0RMX0hXUEFMRVRURSk7CisgICAgICAgIGlmKCFzY3JlZW4peworICAgICAgICAgIHByaW50ZigiQ291bGRuJ3Qgc2V0IHZpZGVvIG1vZGU6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgcGFsZXR0ZSAqLworICAgICAgICBTRExfU2V0UGFsZXR0ZShzY3JlZW4sIFNETF9MT0dQQUx8U0RMX1BIWVNQQUwsIGNvbG9ycywgMCwgMjU2KTsKKyAgICAgICAgLgorICAgICAgICAuCisgICAgICAgIC4KKyAgICAgICAgLjwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE1NTgiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsc2V0Y29sb3JzLmh0bWwiCis+U0RMX1NldENvbG9yczwvQQorPiwKKzxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz5TRExfU2V0VmlkZW9Nb2RlPC9BCis+LAorPEEKK0hSRUY9InNkbHN1cmZhY2UuaHRtbCIKKz5TRExfU3VyZmFjZTwvQQorPiwKKzxBCitIUkVGPSJzZGxjb2xvci5odG1sIgorPlNETF9Db2xvcjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2V0Y29sb3JzLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsc2V0Z2FtbWEuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRDb2xvcnM8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRHYW1tYTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXR0aW1lci5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXR0aW1lci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYjczN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHNldHRpbWVyLmh0bWwKQEAgLTAsMCArMSwyNjcgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfU2V0VGltZXI8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVGltZSIKK0hSRUY9InRpbWUuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1JlbW92ZVRpbWVyIgorSFJFRj0ic2RscmVtb3ZldGltZXIuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RscmVtb3ZldGltZXIuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+Jm5ic3A7PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExTRVRUSU1FUiIKKz48L0EKKz5TRExfU2V0VGltZXI8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjg1NTciCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfU2V0VGltZXImbmJzcDstLSZuYnNwO1NldCBhIGNhbGxiYWNrIHRvIHJ1biBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGFzCitlbGFwc2VkLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU44NTYwIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjg1NjEiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfU2V0VGltZXI8L0IKKz48L0NPREUKKz4oVWludDMyIGludGVydmFsLCBTRExfVGltZXJDYWxsYmFjayBjYWxsYmFjayk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJTRExUSU1FUkNBTExCQUNLIgorPjwvQQorPjxIMgorPkNhbGxiYWNrPC9IMgorPjxQCis+LyogRnVuY3Rpb24gcHJvdG90eXBlIGZvciB0aGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgVWludDMyICgqU0RMX1RpbWVyQ2FsbGJhY2spKFVpbnQzMiBpbnRlcnZhbCk7PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjg1NzAiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5TZXQgYSBjYWxsYmFjayB0byBydW4gYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGhhcworZWxhcHNlZC4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgY3VycmVudCB0aW1lciBpbnRlcnZhbAorYW5kIHJldHVybnMgdGhlIG5leHQgdGltZXIgaW50ZXJ2YWwuICBJZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlCitzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIGluLCB0aGUgcGVyaW9kaWMgYWxhcm0gY29udGludWVzLCBvdGhlcndpc2UgYQorbmV3IGFsYXJtIGlzIHNjaGVkdWxlZC48L1AKKz48UAorPlRvIGNhbmNlbCBhIGN1cnJlbnRseSBydW5uaW5nIHRpbWVyLCBjYWxsCis8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0VGltZXIoMCwgTlVMTCk7PC9UVAorPjwvUAorPjxQCis+VGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIG1heSBydW4gaW4gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4geW91cgorbWFpbiBjb25zdGFudCwgYW5kIHNvIHNob3VsZG4ndCBjYWxsIGFueSBmdW5jdGlvbnMgZnJvbSB3aXRoaW4gaXRzZWxmLjwvUAorPjxQCis+VGhlIG1heGltdW0gcmVzb2x1dGlvbiBvZiB0aGlzIHRpbWVyIGlzIDEwIG1zLCB3aGljaCBtZWFucyB0aGF0IGlmCit5b3UgcmVxdWVzdCBhIDE2IG1zIHRpbWVyLCB5b3VyIGNhbGxiYWNrIHdpbGwgcnVuIGFwcHJveGltYXRlbHkgMjAgbXMKK2xhdGVyIG9uIGFuIHVubG9hZGVkIHN5c3RlbS4gIElmIHlvdSB3YW50ZWQgdG8gc2V0IGEgZmxhZyBzaWduYWxpbmcKK2EgZnJhbWUgdXBkYXRlIGF0IDMwIGZyYW1lcyBwZXIgc2Vjb25kIChldmVyeSAzMyBtcyksIHlvdSBtaWdodCBzZXQgYQordGltZXIgZm9yIDMwIG1zIChzZWUgZXhhbXBsZSBiZWxvdykuPC9QCis+PFAKKz5JZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24sIHlvdSBuZWVkIHRvIHBhc3MgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSU5JVF9USU1FUjwvVFQKKz4KK3RvIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Jbml0KCk8L1RUCis+LjwvUAorPjxESVYKK0NMQVNTPSJOT1RFIgorPjxCTE9DS1FVT1RFCitDTEFTUz0iTk9URSIKKz48UAorPjxCCis+Tm90ZTogPC9CCis+VGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBjb21wYXRpYmlsaXR5IGJ1dCBoYXMgYmVlbiBzdXBlcnNlZGVkCitieSB0aGUgbmV3IHRpbWVyIGZ1bmN0aW9ucworPEEKK0hSRUY9InNkbGFkZHRpbWVyLmh0bWwiCis+U0RMX0FkZFRpbWVyPC9BCis+IGFuZAorPEEKK0hSRUY9InNkbHJlbW92ZXRpbWVyLmh0bWwiCis+U0RMX1JlbW92ZVRpbWVyPC9BCis+IHdoaWNoIHN1cHBvcnQKK211bHRpcGxlIHRpbWVycy48L1AKKz48L0JMT0NLUVVPVEUKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU44NTg0IgorPjwvQQorPjxIMgorPkV4YW1wbGVzPC9IMgorPjxQCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPlNETF9TZXRUaW1lcigoMzMvMTApKjEwLCBteV9jYWxsYmFjayk7PC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOODU4OCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxhZGR0aW1lci5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9BZGRUaW1lcjwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHJlbW92ZXRpbWVyLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz4mbmJzcDs8L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1JlbW92ZVRpbWVyPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGltZS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPiZuYnNwOzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzZXR2aWRlb21vZGUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0dmlkZW9tb2RlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzMDliMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2V0dmlkZW9tb2RlLmh0bWwKQEAgLTAsMCArMSw1NTggQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfU2V0VmlkZW9Nb2RlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1ZpZGVvTW9kZU9LIgorSFJFRj0ic2RsdmlkZW9tb2Rlb2suaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfVXBkYXRlUmVjdCIKK0hSRUY9InNkbHVwZGF0ZXJlY3QuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsdmlkZW9tb2Rlb2suaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHVwZGF0ZXJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExTRVRWSURFT01PREUiCis+PC9BCis+U0RMX1NldFZpZGVvTW9kZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTIzOSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9TZXRWaWRlb01vZGUmbmJzcDstLSZuYnNwO1NldCB1cCBhIHZpZGVvIG1vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQgYW5kIGJpdHMtcGVyLXBpeGVsLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4xMjQyIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjEyNDMiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9TdXJmYWNlICo8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfU2V0VmlkZW9Nb2RlPC9CCis+PC9DT0RFCis+KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjEyNDkiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5TZXQgdXAgYSB2aWRlbyBtb2RlIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCwgaGVpZ2h0IGFuZCBiaXRzLXBlci1waXhlbC48L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmJwcDwvSQorPjwvVFQKKz4gaXMgMCwgaXQgaXMgdHJlYXRlZCBhcyB0aGUgCitjdXJyZW50IGRpc3BsYXkgYml0cyBwZXIgcGl4ZWwuPC9QCis+PFAKKz5UaGUgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZmxhZ3M8L0kKKz48L1RUCis+IHBhcmFtZXRlciBpcyB0aGUgc2FtZSBhcyB0aGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5mbGFnczwvSQorPjwvVFQKKz4gZmllbGQgb2YgdGhlIDxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+PC9BCis+IHN0cnVjdHVyZS4gT1InZCBjb21iaW5hdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHZhbGlkLjwvUAorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU4xMjU5IgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjEiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUQk9EWQorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9TV1NVUkZBQ0U8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5DcmVhdGUgdGhlIHZpZGVvIHN1cmZhY2UgaW4gc3lzdGVtIG1lbW9yeTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hXU1VSRkFDRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkNyZWF0ZSB0aGUgdmlkZW8gc3VyZmFjZSBpbiB2aWRlbyBtZW1vcnk8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9BU1lOQ0JMSVQ8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5FbmFibGVzIHRoZSB1c2Ugb2YgYXN5bmNocm9ub3VzIHVwZGF0ZXMgb2YgdGhlIGRpc3BsYXkgc3VyZmFjZS4gVGhpcyB3aWxsCit1c3VhbGx5IHNsb3cgZG93biBibGl0dGluZyBvbiBzaW5nbGUgQ1BVIG1hY2hpbmVzLCBidXQgbWF5IHByb3ZpZGUgYSBzcGVlZAoraW5jcmVhc2Ugb24gU01QIHN5c3RlbXMuPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQU5ZRk9STUFUPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Tm9ybWFsbHksIGlmIGEgdmlkZW8gc3VyZmFjZSBvZiB0aGUgcmVxdWVzdGVkIGJpdHMtcGVyLXBpeGVsICg8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5icHA8L0kKKz48L1RUCis+KSBpcyBub3QgYXZhaWxhYmxlLCBTREwgd2lsbCBlbXVsYXRlIG9uZSB3aXRoIGEgc2hhZG93IHN1cmZhY2UuIFBhc3NpbmcgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfQU5ZRk9STUFUPC9UVAorPiBwcmV2ZW50cyB0aGlzIGFuZCBjYXVzZXMgU0RMIHRvIHVzZSB0aGUgdmlkZW8gc3VyZmFjZSwgcmVnYXJkbGVzcyBvZiBpdHMgcGl4ZWwgZGVwdGguPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfSFdQQUxFVFRFPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+R2l2ZSBTREwgZXhjbHVzaXZlIHBhbGV0dGUgYWNjZXNzLiBXaXRob3V0IHRoaXMgZmxhZyB5b3UgbWF5IG5vdCBhbHdheXMgZ2V0IHRoZSB0aGUgY29sb3JzIHlvdSByZXF1ZXN0IHdpdGggPEEKK0hSRUY9InNkbHNldGNvbG9ycy5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRDb2xvcnM8L1RUCis+PC9BCis+IG9yIDxBCitIUkVGPSJzZGxzZXRwYWxldHRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFBhbGV0dGU8L1RUCis+PC9BCis+LjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0RPVUJMRUJVRjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkVuYWJsZSBoYXJkd2FyZSBkb3VibGUgYnVmZmVyaW5nOyBvbmx5IHZhbGlkIHdpdGggU0RMX0hXU1VSRkFDRS4gQ2FsbGluZworPEEKK0hSRUY9InNkbGZsaXAuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRmxpcDwvVFQKKz48L0EKKz4gd2lsbCBmbGlwIHRoZQorYnVmZmVycyBhbmQgdXBkYXRlIHRoZSBzY3JlZW4uIEFsbCBkcmF3aW5nIHdpbGwgdGFrZSBwbGFjZSBvbiB0aGUgc3VyZmFjZQordGhhdCBpcyBub3QgZGlzcGxheWVkIGF0IHRoZSBtb21lbnQuIElmIGRvdWJsZSBidWZmZXJpbmcgY291bGQgbm90IGJlIGVuYWJsZWQKK3RoZW4gPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0ZsaXA8L1RUCis+IHdpbGwganVzdCBwZXJmb3JtIGEKKzxBCitIUkVGPSJzZGx1cGRhdGVyZWN0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1VwZGF0ZVJlY3Q8L1RUCis+PC9BCis+CitvbiB0aGUgZW50aXJlIHNjcmVlbi48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9GVUxMU0NSRUVOPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U0RMIHdpbGwgYXR0ZW1wdCB0byB1c2UgYSBmdWxsc2NyZWVuIG1vZGUuIElmIGEgaGFyZHdhcmUgcmVzb2x1dGlvbiBjaGFuZ2UgaXMKK25vdCBwb3NzaWJsZSAoZm9yIHdoYXRldmVyIHJlYXNvbiksIHRoZSBuZXh0IGhpZ2hlciByZXNvbHV0aW9uIHdpbGwgYmUgdXNlZCBhbmQKK3RoZSBkaXNwbGF5IHdpbmRvdyBjZW50ZXJlZCBvbiBhIGJsYWNrIGJhY2tncm91bmQuPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfT1BFTkdMPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Q3JlYXRlIGFuIE9wZW5HTCByZW5kZXJpbmcgY29udGV4dC4gWW91IHNob3VsZCBoYXZlIHByZXZpb3VzbHkgc2V0IE9wZW5HTCB2aWRlbyBhdHRyaWJ1dGVzIHdpdGggPEEKK0hSRUY9InNkbGdsc2V0YXR0cmlidXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dMX1NldEF0dHJpYnV0ZTwvVFQKKz48L0EKKz4uPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfT1BFTkdMQkxJVDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkNyZWF0ZSBhbiBPcGVuR0wgcmVuZGVyaW5nIGNvbnRleHQsIGxpa2UgYWJvdmUsIGJ1dCBhbGxvdyBub3JtYWwgYmxpdHRpbmcKK29wZXJhdGlvbnMuIFRoZSBzY3JlZW4gKDJEKSBzdXJmYWNlIG1heSBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIGFuZAorPEEKK0hSRUY9InNkbHVwZGF0ZXJlY3RzLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1VwZGF0ZVJlY3RzPC9UVAorPjwvQQorPgorbXVzdCBiZSB1c2VkIGZvciB1cGRhdGluZyBjaGFuZ2VzIHRvIHRoZSBzY3JlZW4gc3VyZmFjZS4gTk9URTogVGhpcyBvcHRpb24KK2lzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgb25seSwgYW5kIGlzIDxTUEFOCitDTEFTUz0iZW1waGFzaXMiCis+PEkKK0NMQVNTPSJFTVBIQVNJUyIKKz5ub3Q8L0kKKz48L1NQQU4KKz4gcmVjb21tZW5kZWQgZm9yCituZXcgY29kZS48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9SRVNJWkFCTEU8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5DcmVhdGUgYSByZXNpemFibGUgd2luZG93LiBXaGVuIHRoZSB3aW5kb3cgaXMgcmVzaXplZCBieSB0aGUgdXNlciBhIDxBCitIUkVGPSJzZGxyZXNpemVldmVudC5odG1sIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1ZJREVPUkVTSVpFPC9UVAorPjwvQQorPiBldmVudCBpcyBnZW5lcmF0ZWQgYW5kIDxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+IGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgbmV3IHNpemUuPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfTk9GUkFNRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPklmIHBvc3NpYmxlLCA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9OT0ZSQU1FPC9UVAorPiBjYXVzZXMgU0RMIHRvIGNyZWF0ZSBhIHdpbmRvdyB3aXRoIG5vIHRpdGxlIGJhciBvciBmcmFtZSBkZWNvcmF0aW9uLiBGdWxsc2NyZWVuIG1vZGVzIGF1dG9tYXRpY2FsbHkgaGF2ZSB0aGlzIGZsYWcgc2V0LjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5PVEUiCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJOT1RFIgorPjxQCis+PEIKKz5Ob3RlOiA8L0IKKz5XaGF0ZXZlciA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5mbGFnczwvSQorPjwvVFQKKz4gPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFZpZGVvTW9kZTwvVFQKKz4gY291bGQgc2F0aXNmeSBhcmUgc2V0IGluIHRoZSA8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmZsYWdzPC9JCis+PC9UVAorPiBtZW1iZXIgb2YgdGhlIHJldHVybmVkIHN1cmZhY2UuPC9QCis+PC9CTE9DS1FVT1RFCis+PC9ESVYKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPlRoZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5icHA8L0kKKz48L1RUCis+IHBhcmFtZXRlciBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsLAorc28gYSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5icHA8L0kKKz48L1RUCis+IG9mIDI0IHVzZXMgdGhlIHBhY2tlZCByZXByZXNlbnRhdGlvbiBvZgorMyBieXRlcy9waXhlbC4gRm9yIHRoZSBtb3JlIGNvbW1vbiA0IGJ5dGVzL3BpeGVsIG1vZGUsIHVzZSBhCis8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5icHA8L0kKKz48L1RUCis+IG9mIDMyLiBTb21ld2hhdCBvZGRseSwgYm90aCAxNSBhbmQgMTYgd2lsbAorcmVxdWVzdCBhIDIgYnl0ZXMvcGl4ZWwgbW9kZSwgYnV0IGRpZmZlcmVudCBwaXhlbCBmb3JtYXRzLjwvUAorPjwvQkxPQ0tRVU9URQorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjEzMzYiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+VGhlIGZyYW1lYnVmZmVyIHN1cmZhY2UsIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+TlVMTDwvU1BBTgorPiBpZiBpdCBmYWlscy4KK1RoZSBzdXJmYWNlIHJldHVybmVkIGlzIGZyZWVkIGJ5IFNETF9RdWl0KCkgYW5kIHNob3VsZCBudCBiZSBmcmVlZCBieQordGhlIGNhbGxlci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTM0MCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxsb2Nrc3VyZmFjZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Mb2NrU3VyZmFjZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc2V0Y29sb3JzLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldENvbG9yczwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsZmxpcC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9GbGlwPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx2aWRlb21vZGVvay5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHVwZGF0ZXJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9WaWRlb01vZGVPSzwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1VwZGF0ZVJlY3Q8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2hvd2N1cnNvci5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGxzaG93Y3Vyc29yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4ZjE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc2hvd2N1cnNvci5odG1sCkBAIC0wLDAgKzEsMjM5IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1Nob3dDdXJzb3I8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfR2V0Q3Vyc29yIgorSFJFRj0ic2RsZ2V0Y3Vyc29yLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0dMX0xvYWRMaWJyYXJ5IgorSFJFRj0ic2RsZ2xsb2FkbGlicmFyeS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXRjdXJzb3IuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdsbG9hZGxpYnJhcnkuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExTSE9XQ1VSU09SIgorPjwvQQorPlNETF9TaG93Q3Vyc29yPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yNjE1IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1Nob3dDdXJzb3ImbmJzcDstLSZuYnNwO1RvZ2dsZSB3aGV0aGVyIG9yIG5vdCB0aGUgY3Vyc29yIGlzIHNob3duIG9uIHRoZSBzY3JlZW4uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjI2MTgiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjYxOSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+aW50IDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9TaG93Q3Vyc29yPC9CCis+PC9DT0RFCis+KGludCB0b2dnbGUpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjYyNSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRvZ2dsZSB3aGV0aGVyIG9yIG5vdCB0aGUgY3Vyc29yIGlzIHNob3duIG9uIHRoZSBzY3JlZW4uIFBhc3NpbmcgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRU5BQkxFPC9UVAorPiBkaXNwbGF5cyB0aGUgY3Vyc29yIGFuZCBwYXNzaW5nIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0RJU0FCTEU8L1RUCis+IGhpZGVzIGl0LiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW91c2UgY3Vyc29yIGNhbiBiZSBxdWVyaWVkIGJ5IHBhc3NpbmcgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUVVFUlk8L1RUCis+LCBlaXRoZXIgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRElTQUJMRTwvVFQKKz4gb3IgPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRU5BQkxFPC9UVAorPiB3aWxsIGJlIHJldHVybmVkLjwvUAorPjxQCis+VGhlIGN1cnNvciBzdGFydHMgb2ZmIGRpc3BsYXllZCwgYnV0IGNhbiBiZSB0dXJuZWQgb2ZmLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yNjM0IgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGN1cnNvci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjYzNyIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxjcmVhdGVjdXJzb3IuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfQ3JlYXRlQ3Vyc29yPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxzZXRjdXJzb3IuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU2V0Q3Vyc29yPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0Y3Vyc29yLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2xsb2FkbGlicmFyeS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldEN1cnNvcjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dMX0xvYWRMaWJyYXJ5PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHN1cmZhY2UuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc3VyZmFjZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTU1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHN1cmZhY2UuaHRtbApAQCAtMCwwICsxLDU5NyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9TdXJmYWNlPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1BpeGVsRm9ybWF0IgorSFJFRj0ic2RscGl4ZWxmb3JtYXQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfVmlkZW9JbmZvIgorSFJFRj0ic2RsdmlkZW9pbmZvLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHBpeGVsZm9ybWF0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx2aWRlb2luZm8uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExTVVJGQUNFIgorPjwvQQorPlNETF9TdXJmYWNlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4zMjYzIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1N1cmZhY2UmbmJzcDstLSZuYnNwO0dyYXBoaWNhbCBTdXJmYWNlIFN0cnVjdHVyZTwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zMjY2IgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEZWZpbml0aW9uPC9IMgorPjxQUkUKK0NMQVNTPSJQUk9HUkFNTElTVElORyIKKz50eXBlZGVmIHN0cnVjdCBTRExfU3VyZmFjZSB7CisgICAgICAgIFVpbnQzMiBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkLW9ubHkgKi8KKyAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQ7ICAgICAgICAgICAgICAgIC8qIFJlYWQtb25seSAqLworICAgICAgICBpbnQgdywgaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZC1vbmx5ICovCisgICAgICAgIFVpbnQxNiBwaXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkLW9ubHkgKi8KKyAgICAgICAgdm9pZCAqcGl4ZWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQtd3JpdGUgKi8KKworICAgICAgICAvKiBjbGlwcGluZyBpbmZvcm1hdGlvbiAqLworICAgICAgICBTRExfUmVjdCBjbGlwX3JlY3Q7ICAgICAgICAgICAgICAgICAgICAgLyogUmVhZC1vbmx5ICovCisKKyAgICAgICAgLyogUmVmZXJlbmNlIGNvdW50IC0tIHVzZWQgd2hlbiBmcmVlaW5nIHN1cmZhY2UgKi8KKyAgICAgICAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQtbW9zdGx5ICovCisKKwkvKiBUaGlzIHN0cnVjdHVyZSBhbHNvIGNvbnRhaW5zIHByaXZhdGUgZmllbGRzIG5vdCBzaG93biBoZXJlICovCit9IFNETF9TdXJmYWNlOzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMyNjkiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERhdGE8L0gyCis+PERJVgorQ0xBU1M9IklORk9STUFMVEFCTEUiCis+PEEKK05BTUU9IkFFTjMyNzEiCis+PC9BCis+PFAKKz48L1AKKz48VEFCTEUKK0JPUkRFUj0iMCIKK0NMQVNTPSJDQUxTVEFCTEUiCis+PFRCT0RZCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+ZmxhZ3M8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TdXJmYWNlIGZsYWdzPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5mb3JtYXQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5QaXhlbCA8QQorSFJFRj0ic2RscGl4ZWxmb3JtYXQuaHRtbCIKKz5mb3JtYXQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPncsIGg8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5XaWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzdXJmYWNlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5waXRjaDwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkxlbmd0aCBvZiBhIHN1cmZhY2Ugc2NhbmxpbmUgaW4gYnl0ZXM8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnBpeGVsczwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlBvaW50ZXIgdG8gdGhlIGFjdHVhbCBwaXhlbCBkYXRhPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5jbGlwX3JlY3Q8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5zdXJmYWNlIGNsaXAgPEEKK0hSRUY9InNkbHJlY3QuaHRtbCIKKz5yZWN0YW5nbGU8L0EKKz48L1RECis+PC9UUgorPjwvVEJPRFkKKz48L1RBQkxFCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zMzAwIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9TdXJmYWNlPC9TUEFOCis+J3MgcmVwcmVzZW50IGFyZWFzIG9mICJncmFwaGljYWwiCittZW1vcnksIG1lbW9yeSB0aGF0IGNhbiBiZSBkcmF3biB0by4gVGhlIHZpZGVvIGZyYW1lYnVmZmVyIGlzIHJldHVybmVkCithcyBhIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfU3VyZmFjZTwvU1BBTgorPiBieQorPEEKK0hSRUY9InNkbHNldHZpZGVvbW9kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+PC9BCis+CithbmQgPEEKK0hSRUY9InNkbGdldHZpZGVvc3VyZmFjZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRWaWRlb1N1cmZhY2U8L1RUCis+PC9BCis+LgorTW9zdCBvZiB0aGUgZmllbGRzIHNob3VsZCBiZSBwcmV0dHkgb2J2aW91cy4KKzxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dzwvSQorPjwvVFQKKz4gYW5kIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+aDwvSQorPjwvVFQKKz4gYXJlIHRoZQord2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3VyZmFjZSBpbiBwaXhlbHMuCis8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnBpeGVsczwvSQorPjwvVFQKKz4gaXMgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgcGl4ZWwgZGF0YSwKK3RoZSBzdXJmYWNlIHNob3VsZCBiZSA8QQorSFJFRj0ic2RsbG9ja3N1cmZhY2UuaHRtbCIKKz5sb2NrZWQ8L0EKKz4KK2JlZm9yZSBhY2Nlc3NpbmcgdGhpcyBmaWVsZC4gVGhlIDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Y2xpcF9yZWN0PC9JCis+PC9UVAorPiBmaWVsZAoraXMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBhcyBzZXQgYnkKKzxBCitIUkVGPSJzZGxzZXRjbGlwcmVjdC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRDbGlwUmVjdDwvVFQKKz48L0EKKz4uPC9QCis+PFAKKz5UaGUgZm9sbG93aW5nIGFyZSBzdXBwb3J0ZWQgaW4gdGhlCis8VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmZsYWdzPC9JCis+PC9UVAorPiBmaWVsZC48L1AKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVOMzMxOCIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIxIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1dTVVJGQUNFPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U3VyZmFjZSBpcyBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hXU1VSRkFDRTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlN1cmZhY2UgaXMgc3RvcmVkIGluIHZpZGVvIG1lbW9yeTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0FTWU5DQkxJVDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlN1cmZhY2UgdXNlcyBhc3luY2hyb25vdXMgYmxpdHMgaWYgcG9zc2libGU8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9BTllGT1JNQVQ8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5BbGxvd3MgYW55IHBpeGVsLWZvcm1hdCAoRGlzcGxheSBzdXJmYWNlKTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX0hXUEFMRVRURTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlN1cmZhY2UgaGFzIGV4Y2x1c2l2ZSBwYWxldHRlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfRE9VQkxFQlVGPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U3VyZmFjZSBpcyBkb3VibGUgYnVmZmVyZWQgKERpc3BsYXkgc3VyZmFjZSk8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9GVUxMU0NSRUVOPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U3VyZmFjZSBpcyBmdWxsIHNjcmVlbiAoRGlzcGxheSBTdXJmYWNlKTwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX09QRU5HTDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlN1cmZhY2UgaGFzIGFuIE9wZW5HTCBjb250ZXh0IChEaXNwbGF5IFN1cmZhY2UpPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfT1BFTkdMQkxJVDwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlN1cmZhY2Ugc3VwcG9ydHMgT3BlbkdMIGJsaXR0aW5nIChEaXNwbGF5IFN1cmZhY2UpPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUkVTSVpBQkxFPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U3VyZmFjZSBpcyByZXNpemFibGUgKERpc3BsYXkgU3VyZmFjZSk8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9IV0FDQ0VMPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+U3VyZmFjZSBibGl0IHVzZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfU1JDQ09MT1JLRVk8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TdXJmYWNlIHVzZSBjb2xvcmtleSBibGl0dGluZzwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1JMRUFDQ0VMPC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+Q29sb3JrZXkgYmxpdHRpbmcgaXMgYWNjZWxlcmF0ZWQgd2l0aCBSTEU8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9TUkNBTFBIQTwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlN1cmZhY2UgYmxpdCB1c2VzIGFscGhhIGJsZW5kaW5nPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfUFJFQUxMT0M8L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5TdXJmYWNlIHVzZXMgcHJlYWxsb2NhdGVkIG1lbW9yeTwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMzODEiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RscGl4ZWxmb3JtYXQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1BpeGVsRm9ybWF0PC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxwaXhlbGZvcm1hdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHZpZGVvaW5mby5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1BpeGVsRm9ybWF0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfVmlkZW9JbmZvPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHN5c3dtZXZlbnQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsc3lzd21ldmVudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzE4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHN5c3dtZXZlbnQuaHRtbApAQCAtMCwwICsxLDIzMyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9TeXNXTUV2ZW50PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBFdmVudCBTdHJ1Y3R1cmVzLiIKK0hSRUY9ImV2ZW50c3RydWN0dXJlcy5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfRXhwb3NlRXZlbnQiCitIUkVGPSJzZGxleHBvc2VldmVudC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9Vc2VyRXZlbnQiCitIUkVGPSJzZGx1c2VyZXZlbnQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZXhwb3NlZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHVzZXJldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFNZU1dNRVZFTlQiCis+PC9BCis+U0RMX1N5c1dNRXZlbnQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjQ1MzgiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfU3lzV01FdmVudCZuYnNwOy0tJm5ic3A7UGxhdGZvcm0tZGVwZW5kZW50IHdpbmRvdyBtYW5hZ2VyIGV2ZW50LjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40NTQxIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+VGhlIHN5c3RlbSB3aW5kb3cgbWFuYWdlciBldmVudCBjb250YWlucyBhIHBvaW50ZXIgdG8gc3lzdGVtLXNwZWNpZmljIAoraW5mb3JtYXRpb24gYWJvdXQgdW5rbm93biB3aW5kb3cgbWFuYWdlciBldmVudHMuICBJZiB5b3UgZW5hYmxlIHRoaXMgZXZlbnQKK3VzaW5nIAorPEEKK0hSRUY9InNkbGV2ZW50c3RhdGUuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfRXZlbnRTdGF0ZSgpPC9UVAorPjwvQQorPiwgCitpdCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuZXZlciB1bmhhbmRsZWQgZXZlbnRzIGFyZSByZWNlaXZlZCBmcm9tIHRoZSB3aW5kb3cgCittYW5hZ2VyLiAgVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGltcGxlbWVudCBjdXQtYW5kLXBhc3RlIGluIHlvdXIgCithcHBsaWNhdGlvbi4KKworPFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgIFVpbnQ4IHR5cGU7ICAgLyogQWx3YXlzIFNETF9TWVNXTUVWRU5UICovCisgICAgICAgICBTRExfU3lzV01tc2cgKm1zZzsKKyB9IFNETF9TeXNXTUV2ZW50OzwvUFJFCis+CisKK0lmIHlvdSB3YW50IHRvIG9idGFpbiBzeXN0ZW0tc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdpbmRvdyBtYW5hZ2VyLAoreW91IGNhbiBmaWxsIHRoZSB2ZXJzaW9uIG1lbWJlciBvZiBhIDxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfU3lzV01pbmZvPC9TUEFOCis+IAorc3RydWN0dXJlIChkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiA8VFQKK0NMQVNTPSJGSUxFTkFNRSIKKz5TRExfc3lzd20uaDwvVFQKKz4sIHdoaWNoIG11c3QgYmUgaW5jbHVkZWQpIHVzaW5nIHRoZSA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfVkVSU0lPTigpPC9UVAorPiBtYWNybyBmb3VuZCBpbiAKKzxUVAorQ0xBU1M9IkZJTEVOQU1FIgorPlNETF92ZXJzaW9uLmg8L1RUCis+LCBhbmQgcGFzcyBpdCB0byB0aGUgCitmdW5jdGlvbjoKKzxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjQ1NTEiCis+PC9BCis+PFAKKz48L1AKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfR2V0V01JbmZvPC9CCis+PC9DT0RFCis+KFNETF9TeXNXTWluZm8gKmluZm8pOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDU1NiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxldmVudHN0YXRlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0V2ZW50U3RhdGU8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxleHBvc2VldmVudC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHVzZXJldmVudC5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0V4cG9zZUV2ZW50PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1VzZXJFdmVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx0aHJlYWRpZC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx0aHJlYWRpZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYmRlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHRocmVhZGlkLmh0bWwKQEAgLTAsMCArMSwxOTAgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfVGhyZWFkSUQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iTXVsdGktdGhyZWFkZWQgUHJvZ3JhbW1pbmciCitIUkVGPSJ0aHJlYWQuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NyZWF0ZVRocmVhZCIKK0hSRUY9InNkbGNyZWF0ZXRocmVhZC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9HZXRUaHJlYWRJRCIKK0hSRUY9InNkbGdldHRocmVhZGlkLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNyZWF0ZXRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0dGhyZWFkaWQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExUSFJFQURJRCIKKz48L0EKKz5TRExfVGhyZWFkSUQ8L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjc3MjYiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfVGhyZWFkSUQmbmJzcDstLSZuYnNwO0dldCB0aGUgMzItYml0IHRocmVhZCBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjc3MjkiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONzczMCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlVpbnQzMiA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfVGhyZWFkSUQ8L0IKKz48L0NPREUKKz4odm9pZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43NzM2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+R2V0IHRoZSAzMi1iaXQgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNyZWF0ZXRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldHRocmVhZGlkLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQ3JlYXRlVGhyZWFkPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldFRocmVhZElEPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVubG9ja2F1ZGlvLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVubG9ja2F1ZGlvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxOWJkNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsdW5sb2NrYXVkaW8uaHRtbApAQCAtMCwwICsxLDIxMSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9VbmxvY2tBdWRpbzwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJBdWRpbyIKK0hSRUY9ImF1ZGlvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Mb2NrQXVkaW8iCitIUkVGPSJzZGxsb2NrYXVkaW8uaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfQ2xvc2VBdWRpbyIKK0hSRUY9InNkbGNsb3NlYXVkaW8uaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsbG9ja2F1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxjbG9zZWF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMVU5MT0NLQVVESU8iCis+PC9BCis+U0RMX1VubG9ja0F1ZGlvPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU43MTU2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1VubG9ja0F1ZGlvJm5ic3A7LS0mbmJzcDtVbmxvY2sgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjcxNTkiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONzE2MCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfVW5sb2NrQXVkaW88L0IKKz48L0NPREUKKz4odm9pZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MTY2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+VW5sb2NrcyBhIHByZXZpb3VzIDxBCitIUkVGPSJzZGxsb2NrYXVkaW8uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9ja0F1ZGlvPC9UVAorPjwvQQorPiBjYWxsLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43MTcxIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbG9wZW5hdWRpby5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9PcGVuQXVkaW88L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxsb2NrYXVkaW8uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjbG9zZWF1ZGlvLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfTG9ja0F1ZGlvPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iYXVkaW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfQ2xvc2VBdWRpbzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx1bmxvY2tzdXJmYWNlLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVubG9ja3N1cmZhY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2JhNWZjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx1bmxvY2tzdXJmYWNlLmh0bWwKQEAgLTAsMCArMSwyMTkgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfVW5sb2NrU3VyZmFjZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Mb2NrU3VyZmFjZSIKK0hSRUY9InNkbGxvY2tzdXJmYWNlLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0xvYWRCTVAiCitIUkVGPSJzZGxsb2FkYm1wLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGxvY2tzdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxsb2FkYm1wLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMVU5MT0NLU1VSRkFDRSIKKz48L0EKKz5TRExfVW5sb2NrU3VyZmFjZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTk2MiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9VbmxvY2tTdXJmYWNlJm5ic3A7LS0mbmJzcDtVbmxvY2tzIGEgcHJldmlvdXNseSBsb2NrZWQgc3VyZmFjZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTk2NSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xOTY2IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9VbmxvY2tTdXJmYWNlPC9CCis+PC9DT0RFCis+KFNETF9TdXJmYWNlICpzdXJmYWNlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE5NzIiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5TdXJmYWNlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBsb2NrZWQgdXNpbmcgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvY2tTdXJmYWNlPC9UVAorPiBtdXN0IGJlIHVubG9ja2VkIHdpdGggPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1VubG9ja1N1cmZhY2U8L1RUCis+LiBTdXJmYWNlcyBzaG91bGQgYmUgdW5sb2NrZWQgYXMgc29vbiBhcyBwb3NzaWJsZS48L1AKKz48UAorPkl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHNpbmNlIDEuMS44LCBzdXJmYWNlIGxvY2tzIGFyZSByZWN1cnNpdmUuIFNlZSA8QQorSFJFRj0ic2RsbG9ja3N1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9ja1N1cmZhY2U8L1RUCis+PC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xOTgwIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGxvY2tzdXJmYWNlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0xvY2tTdXJmYWNlPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsbG9ja3N1cmZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxsb2FkYm1wLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfTG9ja1N1cmZhY2U8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9Mb2FkQk1QPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVubG9ja3l1dm92ZXJsYXkuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsdW5sb2NreXV2b3ZlcmxheS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmVkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVubG9ja3l1dm92ZXJsYXkuaHRtbApAQCAtMCwwICsxLDIyNSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9VbmxvY2tZVVZPdmVybGF5PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0xvY2tZVVZPdmVybGF5IgorSFJFRj0ic2RsbG9ja3l1dm92ZXJsYXkuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfRGlzcGxheVlVVk92ZXJsYXkiCitIUkVGPSJzZGxkaXNwbGF5eXV2b3ZlcmxheS5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxsb2NreXV2b3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZGlzcGxheXl1dm92ZXJsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExVTkxPQ0tZVVZPVkVSTEFZIgorPjwvQQorPlNETF9VbmxvY2tZVVZPdmVybGF5PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yODgwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1VubG9ja1lVVk92ZXJsYXkmbmJzcDstLSZuYnNwO1VubG9jayBhbiBvdmVybGF5PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjI4ODMiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMjg4NCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+dm9pZCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfVW5sb2NrWVVWT3ZlcmxheTwvQgorPjwvQ09ERQorPihTRExfT3ZlcmxheSAqb3ZlcmxheSk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4yODkwIgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+VGhlIG9wcG9zaXRlIHRvIDxBCitIUkVGPSJzZGxsb2NreXV2b3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Mb2NrWVVWT3ZlcmxheTwvVFQKKz48L0EKKz4uIFVubG9ja3MgYSBwcmV2aW91c2x5IGxvY2tlZCBvdmVybGF5LiBBbiBvdmVybGF5IG11c3QgYmUgdW5sb2NrZWQgYmVmb3JlIGl0IGNhbiBiZSBkaXNwbGF5ZWQuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjI4OTUiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RsbG9ja3l1dm92ZXJsYXkuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfVW5sb2NrWVVWT3ZlcmxheTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVZVVZPdmVybGF5PC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxvdmVybGF5Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9PdmVybGF5PC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxsb2NreXV2b3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGRpc3BsYXl5dXZvdmVybGF5Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfTG9ja1lVVk92ZXJsYXk8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9EaXNwbGF5WVVWT3ZlcmxheTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx1cGRhdGVyZWN0Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVwZGF0ZXJlY3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRkOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx1cGRhdGVyZWN0Lmh0bWwKQEAgLTAsMCArMSwyNjYgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfVXBkYXRlUmVjdDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9TZXRWaWRlb01vZGUiCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfVXBkYXRlUmVjdHMiCitIUkVGPSJzZGx1cGRhdGVyZWN0cy5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHVwZGF0ZXJlY3RzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMVVBEQVRFUkVDVCIKKz48L0EKKz5TRExfVXBkYXRlUmVjdDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTM1NSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9VcGRhdGVSZWN0Jm5ic3A7LS0mbmJzcDtNYWtlcyBzdXJlIHRoZSBnaXZlbiBhcmVhIGlzIHVwZGF0ZWQgb24gdGhlIGdpdmVuIHNjcmVlbi48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMTM1OCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4xMzU5IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9VcGRhdGVSZWN0PC9CCis+PC9DT0RFCis+KFNETF9TdXJmYWNlICpzY3JlZW4sIFNpbnQzMiB4LCBTaW50MzIgeSwgU2ludDMyIHcsIFNpbnQzMiBoKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjEzNjUiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5NYWtlcyBzdXJlIHRoZSBnaXZlbiBhcmVhIGlzIHVwZGF0ZWQgb24gdGhlIGdpdmVuIHNjcmVlbi4gVGhlIHJlY3RhbmdsZSBtdXN0CitiZSBjb25maW5lZCB3aXRoaW4gdGhlIHNjcmVlbiBib3VuZGFyaWVzIChubyBjbGlwcGluZyBpcyBkb25lKS48L1AKKz48UAorPklmICc8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz54PC9JCis+PC9UVAorPicsICc8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz55PC9JCis+PC9UVAorPicsICc8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz53PC9JCis+PC9UVAorPicKK2FuZCAnPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+aDwvSQorPjwvVFQKKz4nIGFyZSBhbGwgMCwKKzxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9VcGRhdGVSZWN0PC9UVAorPiB3aWxsIHVwZGF0ZSB0aGUKK2VudGlyZSBzY3JlZW4uPC9QCis+PFAKKz5UaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoaWxlICc8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zY3JlZW48L0kKKz48L1RUCis+JyBpcworPEEKK0hSRUY9InNkbGxvY2tzdXJmYWNlLmh0bWwiCis+bG9ja2VkPC9BCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xMzc3IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHVwZGF0ZXJlY3RzLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1VwZGF0ZVJlY3RzPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxyZWN0Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9SZWN0PC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHN1cmZhY2UuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1N1cmZhY2U8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2RsbG9ja3N1cmZhY2UuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfTG9ja1N1cmZhY2U8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx1cGRhdGVyZWN0cy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1NldFZpZGVvTW9kZTwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1VwZGF0ZVJlY3RzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVwZGF0ZXJlY3RzLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVwZGF0ZXJlY3RzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1M2E3YQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsdXBkYXRlcmVjdHMuaHRtbApAQCAtMCwwICsxLDI1NSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9VcGRhdGVSZWN0czwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9VcGRhdGVSZWN0IgorSFJFRj0ic2RsdXBkYXRlcmVjdC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9GbGlwIgorSFJFRj0ic2RsZmxpcC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx1cGRhdGVyZWN0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxmbGlwLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMVVBEQVRFUkVDVFMiCis+PC9BCis+U0RMX1VwZGF0ZVJlY3RzPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4xMzkyIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1VwZGF0ZVJlY3RzJm5ic3A7LS0mbmJzcDtNYWtlcyBzdXJlIHRoZSBnaXZlbiBsaXN0IG9mIHJlY3RhbmdsZXMgaXMgdXBkYXRlZCBvbiB0aGUgZ2l2ZW4gc2NyZWVuLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4xMzk1IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjEzOTYiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1VwZGF0ZVJlY3RzPC9CCis+PC9DT0RFCis+KFNETF9TdXJmYWNlICpzY3JlZW4sIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjE0MDIiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5NYWtlcyBzdXJlIHRoZSBnaXZlbiBsaXN0IG9mIHJlY3RhbmdsZXMgaXMgdXBkYXRlZCBvbiB0aGUgZ2l2ZW4gc2NyZWVuLgorVGhlIHJlY3RhbmdsZXMgbXVzdCBhbGwgYmUgY29uZmluZWQgd2l0aGluIHRoZSBzY3JlZW4gYm91bmRhcmllcyAobm8KK2NsaXBwaW5nIGlzIGRvbmUpLjwvUAorPjxQCis+VGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGlsZSA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zY3JlZW48L0kKKz48L1RUCis+IGlzCis8QQorSFJFRj0ic2RsbG9ja3N1cmZhY2UuaHRtbCIKKz5sb2NrZWQ8L0EKKz4uPC9QCis+PERJVgorQ0xBU1M9Ik5PVEUiCis+PEJMT0NLUVVPVEUKK0NMQVNTPSJOT1RFIgorPjxQCis+PEIKKz5Ob3RlOiA8L0IKKz5JdCBpcyBhZHZpY2VkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbmx5IG9uY2UgcGVyIGZyYW1lLCBzaW5jZSBlYWNoCitjYWxsIGhhcyBzb21lIHByb2Nlc3Npbmcgb3ZlcmhlYWQuIFRoaXMgaXMgbm8gcmVzdHJpY3Rpb24gc2luY2UgeW91CitjYW4gcGFzcyBhbnkgbnVtYmVyIG9mIHJlY3RhbmdsZXMgZWFjaCB0aW1lLjwvUAorPjxQCis+VGhlIHJlY3RhbmdsZXMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IG1lcmdlZCBvciBjaGVja2VkIGZvciBvdmVybGFwLiBJbgorZ2VuZXJhbCwgdGhlIHByb2dyYW1tZXIgY2FuIHVzZSBoaXMga25vd2xlZGdlIGFib3V0IGhpcyBwYXJ0aWN1bGFyCityZWN0YW5nbGVzIHRvIG1lcmdlIHRoZW0gaW4gYW4gZWZmaWNpZW50IHdheSwgdG8gYXZvaWQgb3ZlcmRyYXcuPC9QCis+PC9CTE9DS1FVT1RFCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTQxMSIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGx1cGRhdGVyZWN0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1VwZGF0ZVJlY3Q8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHJlY3QuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1JlY3Q8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfU3VyZmFjZTwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxsb2Nrc3VyZmFjZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Mb2NrU3VyZmFjZTwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHVwZGF0ZXJlY3QuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxmbGlwLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfVXBkYXRlUmVjdDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InZpZGVvLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0ZsaXA8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsdXNlcmV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVzZXJldmVudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODc2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHVzZXJldmVudC5odG1sCkBAIC0wLDAgKzEsMzM3IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1VzZXJFdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgRXZlbnQgU3RydWN0dXJlcy4iCitIUkVGPSJldmVudHN0cnVjdHVyZXMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1N5c1dNRXZlbnQiCitIUkVGPSJzZGxzeXN3bWV2ZW50Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1F1aXRFdmVudCIKK0hSRUY9InNkbHF1aXRldmVudC5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxzeXN3bWV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxxdWl0ZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExVU0VSRVZFTlQiCis+PC9BCis+U0RMX1VzZXJFdmVudDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONDU2NSIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9Vc2VyRXZlbnQmbmJzcDstLSZuYnNwO0EgdXNlci1kZWZpbmVkIGV2ZW50IHR5cGU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDU2OCIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGVmaW5pdGlvbjwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+dHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGU7CisgIGludCBjb2RlOworICB2b2lkICpkYXRhMTsKKyAgdm9pZCAqZGF0YTI7Cit9IFNETF9Vc2VyRXZlbnQ7PC9QUkUKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDU3MSIKKz48L0EKKz48SDIKKz5TdHJ1Y3R1cmUgRGF0YTwvSDIKKz48RElWCitDTEFTUz0iSU5GT1JNQUxUQUJMRSIKKz48QQorTkFNRT0iQUVONDU3MyIKKz48L0EKKz48UAorPjwvUAorPjxUQUJMRQorQk9SREVSPSIwIgorQ0xBU1M9IkNBTFNUQUJMRSIKKz48VEJPRFkKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz50eXBlPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfVVNFUkVWRU5UPC9UVAorPiB0aHJvdWdoIHRvIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX05VTUVWRU5UUy0xPC9UVAorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+Y29kZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlVzZXIgZGVmaW5lZCBldmVudCBjb2RlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5kYXRhMTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPlVzZXIgZGVmaW5lZCBkYXRhIHBvaW50ZXI8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmRhdGEyPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+VXNlciBkZWZpbmVkIGRhdGEgcG9pbnRlcjwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjQ1OTQiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1VzZXJFdmVudDwvU1BBTgorPiBpcyBpbiB0aGUgPFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz51c2VyPC9JCis+PC9UVAorPiBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSA8QQorSFJFRj0ic2RsZXZlbnQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX0V2ZW50PC9TUEFOCis+PC9BCis+LiBUaGlzIGV2ZW50IGlzIHVuaXF1ZSwgaXQgaXMgbmV2ZXIgY3JlYXRlZCBieSBTREwgYnV0IG9ubHkgYnkgdGhlIHVzZXIuIFRoZSBldmVudCBjYW4gYmUgcHVzaGVkIG9udG8gdGhlIGV2ZW50IHF1ZXVlIHVzaW5nIDxBCitIUkVGPSJzZGxwdXNoZXZlbnQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUHVzaEV2ZW50PC9UVAorPjwvQQorPi4gVGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBvciBjb21wbGV0ZWx5IHVwIHRvIHRoZSBwcm9ncmFtbWVyLCB0aGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IDxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dHlwZTwvSQorPjwvVFQKKz4gaXMgYSB2YWx1ZSBmcm9tIDxUVAorQ0xBU1M9IkxJVEVSQUwiCis+U0RMX1VTRVJFVkVOVDwvVFQKKz4gdG8gPFRUCitDTEFTUz0iTElURVJBTCIKKz5TRExfTlVNRVZFTlRTLTE8L1RUCis+IChpbmNsdXNpdmUpLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU40NjA2IgorPjwvQQorPjxIMgorPkV4YW1wbGVzPC9IMgorPjxQCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPlNETF9FdmVudCBldmVudDsKKworZXZlbnQudHlwZSA9IFNETF9VU0VSRVZFTlQ7CitldmVudC51c2VyLmNvZGUgPSBteV9ldmVudF9jb2RlOworZXZlbnQudXNlci5kYXRhMSA9IHNpZ25pZmljYW50X2RhdGE7CitldmVudC51c2VyLmRhdGEyID0gMDsKK1NETF9QdXNoRXZlbnQoJiMzODtldmVudCk7PC9QUkUKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONDYxMCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxldmVudC5odG1sIgorPjxTUEFOCitDTEFTUz0iU1RSVUNUTkFNRSIKKz5TRExfRXZlbnQ8L1NQQU4KKz48L0EKKz4sCis8QQorSFJFRj0ic2RscHVzaGV2ZW50Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1B1c2hFdmVudDwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHN5c3dtZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxxdWl0ZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9TeXNXTUV2ZW50PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRzdHJ1Y3R1cmVzLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1F1aXRFdmVudDwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx2aWRlb2RyaXZlcm5hbWUuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsdmlkZW9kcml2ZXJuYW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxOTY1NgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsdmlkZW9kcml2ZXJuYW1lLmh0bWwKQEAgLTAsMCArMSwyNDMgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfVmlkZW9Ecml2ZXJOYW1lPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlZpZGVvIgorSFJFRj0idmlkZW8uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0dldFZpZGVvSW5mbyIKK0hSRUY9InNkbGdldHZpZGVvaW5mby5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9MaXN0TW9kZXMiCitIUkVGPSJzZGxsaXN0bW9kZXMuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0dmlkZW9pbmZvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxsaXN0bW9kZXMuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExWSURFT0RSSVZFUk5BTUUiCis+PC9BCis+U0RMX1ZpZGVvRHJpdmVyTmFtZTwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMTEyNyIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9WaWRlb0RyaXZlck5hbWUmbmJzcDstLSZuYnNwO09idGFpbiB0aGUgbmFtZSBvZiB0aGUgdmlkZW8gZHJpdmVyPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjExMzAiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVOMTEzMSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+Y2hhciAqPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1ZpZGVvRHJpdmVyTmFtZTwvQgorPjwvQ09ERQorPihjaGFyICpuYW1lYnVmLCBpbnQgbWF4bGVuKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjExMzciCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+bmFtZWJ1ZjwvSQorPjwvVFQKKz4gaXMgZmlsbGVkIHVwIHRvIGEgbWF4aW11bSBvZiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5tYXhsZW48L0kKKz48L1RUCis+IGNoYXJhY3RlcnMgKGluY2x1ZGUgdGhlIE5VTEwgdGVybWluYXRvcikgd2l0aCB0aGUgbmFtZSBvZiB0aGUgaW5pdGlhbGlzZWQgdmlkZW8gZHJpdmVyLiBUaGUgZHJpdmVyIG5hbWUgaXMgYSBzaW1wbGUgb25lIHdvcmQgaWRlbnRpZmllciBsaWtlICJ4MTEiIG9yICJ3aW5kaWIiLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xMTQyIgorPjwvQQorPjxIMgorPlJldHVybiBWYWx1ZTwvSDIKKz48UAorPlJldHVybnMgPFRUCitDTEFTUz0iTElURVJBTCIKKz5OVUxMPC9UVAorPiBpZiB2aWRlbyBoYXMgbm90IGJlZW4gaW5pdGlhbGlzZWQgd2l0aCA8VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdDwvVFQKKz4gb3IgYSBwb2ludGVyIHRvIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm5hbWVidWY8L0kKKz48L1RUCis+IG90aGVyd2lzZS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTE0OCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxpbml0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXQ8L1RUCis+PC9BCis+Cis8QQorSFJFRj0ic2RsaW5pdHN1YnN5c3RlbS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9Jbml0U3ViU3lzdGVtPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsZ2V0dmlkZW9pbmZvLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsbGlzdG1vZGVzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfR2V0VmlkZW9JbmZvPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0idmlkZW8uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfTGlzdE1vZGVzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHZpZGVvaW5mby5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx2aWRlb2luZm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTBkYTMxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx2aWRlb2luZm8uaHRtbApAQCAtMCwwICsxLDQwOCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9WaWRlb0luZm88L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfU3VyZmFjZSIKK0hSRUY9InNkbHN1cmZhY2UuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfT3ZlcmxheSIKK0hSRUY9InNkbG92ZXJsYXkuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFZJREVPSU5GTyIKKz48L0EKKz5TRExfVmlkZW9JbmZvPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4zMzkwIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1ZpZGVvSW5mbyZuYnNwOy0tJm5ic3A7VmlkZW8gVGFyZ2V0IGluZm9ybWF0aW9uPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjMzOTMiCis+PC9BCis+PEgyCis+U3RydWN0dXJlIERlZmluaXRpb248L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgc3RydWN0eworICBVaW50MzIgaHdfYXZhaWxhYmxlOjE7CisgIFVpbnQzMiB3bV9hdmFpbGFibGU6MTsKKyAgVWludDMyIGJsaXRfaHc6MTsKKyAgVWludDMyIGJsaXRfaHdfQ0M6MTsKKyAgVWludDMyIGJsaXRfaHdfQToxOworICBVaW50MzIgYmxpdF9zdzoxOworICBVaW50MzIgYmxpdF9zd19DQzoxOworICBVaW50MzIgYmxpdF9zd19BOjE7CisgIFVpbnQzMiBibGl0X2ZpbGw7CisgIFVpbnQzMiB2aWRlb19tZW07CisgIFNETF9QaXhlbEZvcm1hdCAqdmZtdDsKK30gU0RMX1ZpZGVvSW5mbzs8L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zMzk2IgorPjwvQQorPjxIMgorPlN0cnVjdHVyZSBEYXRhPC9IMgorPjxESVYKK0NMQVNTPSJJTkZPUk1BTFRBQkxFIgorPjxBCitOQU1FPSJBRU4zMzk4IgorPjwvQQorPjxQCis+PC9QCis+PFRBQkxFCitCT1JERVI9IjAiCitDTEFTUz0iQ0FMU1RBQkxFIgorPjxUQk9EWQorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmh3X2F2YWlsYWJsZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPklzIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSBoYXJkd2FyZSBzdXJmYWNlcz88L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPndtX2F2YWlsYWJsZTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPklzIHRoZXJlIGEgd2luZG93IG1hbmFnZXIgYXZhaWxhYmxlPC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5ibGl0X2h3PC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXJlIGhhcmR3YXJlIHRvIGhhcmR3YXJlIGJsaXRzIGFjY2VsZXJhdGVkPzwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+YmxpdF9od19DQzwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkFyZSBoYXJkd2FyZSB0byBoYXJkd2FyZSBjb2xvcmtleSBibGl0cyBhY2NlbGVyYXRlZD88L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmJsaXRfaHdfQTwvSQorPjwvVFQKKz48L1RECis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPkFyZSBoYXJkd2FyZSB0byBoYXJkd2FyZSBhbHBoYSBibGl0cyBhY2NlbGVyYXRlZD88L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPmJsaXRfc3c8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz5BcmUgc29mdHdhcmUgdG8gaGFyZHdhcmUgYmxpdHMgYWNjZWxlcmF0ZWQ/PC9URAorPjwvVFIKKz48VFIKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+PFRUCitDTEFTUz0iU1RSVUNURklFTEQiCis+PEkKKz5ibGl0X3N3X0NDPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXJlIHNvZnR3YXJlIHRvIGhhcmR3YXJlIGNvbG9ya2V5IGJsaXRzIGFjY2VsZXJhdGVkPzwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+YmxpdF9zd19BPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXJlIHNvZnR3YXJlIHRvIGhhcmR3YXJlIGFscGhhIGJsaXRzIGFjY2VsZXJhdGVkPzwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+YmxpdF9maWxsPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+QXJlIGNvbG9yIGZpbGxzIGFjY2VsZXJhdGVkPzwvVEQKKz48L1RSCis+PFRSCis+PFRECitBTElHTj0iTEVGVCIKK1ZBTElHTj0iVE9QIgorPjxUVAorQ0xBU1M9IlNUUlVDVEZJRUxEIgorPjxJCis+dmlkZW9fbWVtPC9JCis+PC9UVAorPjwvVEQKKz48VEQKK0FMSUdOPSJMRUZUIgorVkFMSUdOPSJUT1AiCis+VG90YWwgYW1vdW50IG9mIHZpZGVvIG1lbW9yeSBpbiBLaWxvYnl0ZXM8L1RECis+PC9UUgorPjxUUgorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48VFQKK0NMQVNTPSJTVFJVQ1RGSUVMRCIKKz48SQorPnZmbXQ8L0kKKz48L1RUCis+PC9URAorPjxURAorQUxJR049IkxFRlQiCitWQUxJR049IlRPUCIKKz48QQorSFJFRj0ic2RscGl4ZWxmb3JtYXQuaHRtbCIKKz5QaXhlbCBmb3JtYXQ8L0EKKz4gb2YgdGhlIHZpZGVvIGRldmljZTwvVEQKKz48L1RSCis+PC9UQk9EWQorPjwvVEFCTEUKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM0NDYiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5UaGlzIChyZWFkLW9ubHkpIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBieSA8QQorSFJFRj0ic2RsZ2V0dmlkZW9pbmZvLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0dldFZpZGVvSW5mbzwvVFQKKz48L0EKKz4uIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGVpdGhlciB0aGUgJ2Jlc3QnIGF2YWlsYWJsZSBtb2RlICAoaWYgY2FsbGVkIGJlZm9yZSA8QQorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFZpZGVvTW9kZTwvVFQKKz48L0EKKz4pIG9yIHRoZSBjdXJyZW50IHZpZGVvIG1vZGUuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM0NTMiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2RscGl4ZWxmb3JtYXQuaHRtbCIKKz48U1BBTgorQ0xBU1M9IlNUUlVDVE5BTUUiCis+U0RMX1BpeGVsRm9ybWF0PC9TUEFOCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGdldHZpZGVvaW5mby5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRWaWRlb0luZm88L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzdXJmYWNlLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1N1cmZhY2U8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9PdmVybGF5PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHZpZGVvbW9kZW9rLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHZpZGVvbW9kZW9rLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyZDZjNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2RsdmlkZW9tb2Rlb2suaHRtbApAQCAtMCwwICsxLDI3MCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9WaWRlb01vZGVPSzwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJWaWRlbyIKK0hSRUY9InZpZGVvLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9MaXN0TW9kZXMiCitIUkVGPSJzZGxsaXN0bW9kZXMuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfU2V0VmlkZW9Nb2RlIgorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGxpc3Rtb2Rlcy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMVklERU9NT0RFT0siCis+PC9BCis+U0RMX1ZpZGVvTW9kZU9LPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4xMjAyIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1ZpZGVvTW9kZU9LJm5ic3A7LS0mbmJzcDtDaGVjayB0byBzZWUgaWYgYSBwYXJ0aWN1bGFyIHZpZGVvIG1vZGUgaXMgc3VwcG9ydGVkLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4xMjA1IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjEyMDYiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfVmlkZW9Nb2RlT0s8L0IKKz48L0NPREUKKz4oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMTIxMiIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9WaWRlb01vZGVPSzwvVFQKKz4gcmV0dXJucyA8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjA8L1NQQU4KKz4gCitpZiB0aGUgcmVxdWVzdGVkIG1vZGUgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgYml0IGRlcHRoLCBvciByZXR1cm5zIHRoZSAKK2JpdHMtcGVyLXBpeGVsIG9mIHRoZSBjbG9zZXN0IGF2YWlsYWJsZSBtb2RlIHdpdGggdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQgYW5kIHJlcXVlc3RlZCA8QQorSFJFRj0ic2Rsc3VyZmFjZS5odG1sIgorPnN1cmZhY2U8L0EKKz4gZmxhZ3MgKHNlZSA8QQorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFZpZGVvTW9kZTwvVFQKKz48L0EKKz4pLjwvUAorPjxQCis+VGhlIGJpdHMtcGVyLXBpeGVsIHZhbHVlIHJldHVybmVkIGlzIG9ubHkgYSBzdWdnZXN0ZWQgbW9kZS4gWW91IGNhbiB1c3VhbGx5IHJlcXVlc3QgYW5kIGJwcCB5b3Ugd2FudCB3aGVuIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz5zZXR0aW5nPC9BCis+ICB0aGUgdmlkZW8gbW9kZSBhbmQgU0RMIHdpbGwgZW11bGF0ZSB0aGF0IGNvbG9yIGRlcHRoIHdpdGggYSBzaGFkb3cgdmlkZW8gc3VyZmFjZS48L1AKKz48UAorPlRoZSBhcmd1bWVudHMgdG8gPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1ZpZGVvTW9kZU9LPC9UVAorPiBhcmUgdGhlIHNhbWUgb25lcyB5b3UgCit3b3VsZCBwYXNzIHRvIDxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz5TRExfU2V0VmlkZW9Nb2RlPC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjEyMjUiCis+PC9BCis+PEgyCis+RXhhbXBsZTwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+U0RMX1N1cmZhY2UgKnNjcmVlbjsKK1VpbnQzMiBicHA7CisuCisuCisuCitwcmludGYoIkNoZWNraW5nIG1vZGUgNjQweDQ4MEAxNmJwcC5cbiIpOworYnBwPVNETF9WaWRlb01vZGVPSyg2NDAsIDQ4MCwgMTYsIFNETF9IV1NVUkZBQ0UpOworCitpZighYnBwKXsKKyAgcHJpbnRmKCJNb2RlIG5vdCBhdmFpbGFibGUuXG4iKTsKKyAgZXhpdCgtMSk7Cit9CisKK3ByaW50ZigiU0RMIFJlY29tbWVuZHMgNjQweDQ4MEAlZGJwcC5cbiIsIGJwcCk7CitzY3JlZW49U0RMX1NldFZpZGVvTW9kZSg2NDAsIDQ4MCwgYnBwLCBTRExfSFdTVVJGQUNFKTsKKy4KKy48L1BSRQorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4xMjI4IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHNldHZpZGVvbW9kZS5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9TZXRWaWRlb01vZGU8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGdldHZpZGVvaW5mby5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9HZXRWaWRlb0luZm88L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxsaXN0bW9kZXMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9MaXN0TW9kZXM8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9TZXRWaWRlb01vZGU8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd2FpdGV2ZW50Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdhaXRldmVudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzNkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdhaXRldmVudC5odG1sCkBAIC0wLDAgKzEsMjMxIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1dhaXRFdmVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJFdmVudCBGdW5jdGlvbnMuIgorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1BvbGxFdmVudCIKK0hSRUY9InNkbHBvbGxldmVudC5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9QdXNoRXZlbnQiCitIUkVGPSJzZGxwdXNoZXZlbnQuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RscG9sbGV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxwdXNoZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExXQUlURVZFTlQiCis+PC9BCis+U0RMX1dhaXRFdmVudDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONTUwNyIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9XYWl0RXZlbnQmbmJzcDstLSZuYnNwO1dhaXRzIGluZGVmaW5pdGVseSBmb3IgdGhlIG5leHQgYXZhaWxhYmxlIGV2ZW50LjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU41NTEwIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjU1MTEiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPmludCA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfV2FpdEV2ZW50PC9CCis+PC9DT0RFCis+KFNETF9FdmVudCAqZXZlbnQpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVONTUxNyIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPldhaXRzIGluZGVmaW5pdGVseSBmb3IgdGhlIG5leHQgYXZhaWxhYmxlIGV2ZW50LCByZXR1cm5pbmcgCis8U1BBTgorQ0xBU1M9IlJFVFVSTlZBTFVFIgorPjE8L1NQQU4KKz4sIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBpZiB0aGVyZSB3YXMgCithbiBlcnJvciB3aGlsZSB3YWl0aW5nIGZvciBldmVudHMuICA8L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPmV2ZW50PC9JCis+PC9UVAorPiBpcyBub3QgPFRUCitDTEFTUz0iTElURVJBTCIKKz5OVUxMPC9UVAorPiwgdGhlIG5leHQgCitldmVudCBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGFuZCBzdG9yZWQgaW4gdGhhdCBhcmVhLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU41NTI1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9FdmVudDwvU1BBTgorPjwvQQorPiwKKzxBCitIUkVGPSJzZGxwb2xsZXZlbnQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfUG9sbEV2ZW50PC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RscG9sbGV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RscHVzaGV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfUG9sbEV2ZW50PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iZXZlbnRmdW5jdGlvbnMuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfUHVzaEV2ZW50PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdhaXR0aHJlYWQuaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd2FpdHRocmVhZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWNmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdhaXR0aHJlYWQuaHRtbApAQCAtMCwwICsxLDIzMSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9XYWl0VGhyZWFkPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9Ik11bHRpLXRocmVhZGVkIFByb2dyYW1taW5nIgorSFJFRj0idGhyZWFkLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9HZXRUaHJlYWRJRCIKK0hSRUY9InNkbGdldHRocmVhZGlkLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0tpbGxUaHJlYWQiCitIUkVGPSJzZGxraWxsdGhyZWFkLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdldHRocmVhZGlkLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxraWxsdGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMV0FJVFRIUkVBRCIKKz48L0EKKz5TRExfV2FpdFRocmVhZDwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVONzc2NiIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9XYWl0VGhyZWFkJm5ic3A7LS0mbmJzcDtXYWl0IGZvciBhIHRocmVhZCB0byBmaW5pc2guPC9ESVYKKz48RElWCitDTEFTUz0iUkVGU1lOT1BTSVNESVYiCis+PEEKK05BTUU9IkFFTjc3NjkiCis+PC9BCis+PEgyCis+U3lub3BzaXM8L0gyCis+PERJVgorQ0xBU1M9IkZVTkNTWU5PUFNJUyIKKz48QQorTkFNRT0iQUVONzc3MCIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1dhaXRUaHJlYWQ8L0IKKz48L0NPREUKKz4oU0RMX1RocmVhZCAqdGhyZWFkLCBpbnQgKnN0YXR1cyk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43Nzc2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+V2FpdCBmb3IgYSB0aHJlYWQgdG8gZmluaXNoICh0aW1lb3V0cyBhcmUgbm90IHN1cHBvcnRlZCkuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjc3NzkiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+VGhlIHJldHVybiBjb2RlIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uIGlzIHBsYWNlZCBpbiB0aGUgYXJlYSBwb2ludGVkIHRvIGJ5Cis8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zdGF0dXM8L0kKKz48L1RUCis+LCBpZiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5zdGF0dXM8L0kKKz48L1RUCis+IGlzIG5vdAorPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz5OVUxMPC9TUEFOCis+LjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU43Nzg1IgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbGNyZWF0ZXRocmVhZC5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9DcmVhdGVUaHJlYWQ8L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXR0aHJlYWRpZC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGtpbGx0aHJlYWQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9HZXRUaHJlYWRJRDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InRocmVhZC5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9LaWxsVGhyZWFkPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdhcnBtb3VzZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx3YXJwbW91c2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2IyZDhkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx3YXJwbW91c2UuaHRtbApAQCAtMCwwICsxLDIwNSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9XYXJwTW91c2U8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iVmlkZW8iCitIUkVGPSJ2aWRlby5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfRGlzcGxheUZvcm1hdEFscGhhIgorSFJFRj0ic2RsZGlzcGxheWZvcm1hdGFscGhhLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0NyZWF0ZUN1cnNvciIKK0hSRUY9InNkbGNyZWF0ZWN1cnNvci5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxkaXNwbGF5Zm9ybWF0YWxwaGEuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGNyZWF0ZWN1cnNvci5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFdBUlBNT1VTRSIKKz48L0EKKz5TRExfV2FycE1vdXNlPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4yNDY1IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1dhcnBNb3VzZSZuYnNwOy0tJm5ic3A7U2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbW91c2UgY3Vyc29yLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4yNDY4IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjI0NjkiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1dhcnBNb3VzZTwvQgorPjwvQ09ERQorPihVaW50MTYgeCwgVWludDE2IHkpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjQ3NSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlNldCB0aGUgcG9zaXRpb24gb2YgdGhlIG1vdXNlIGN1cnNvciAoZ2VuZXJhdGVzIGEgbW91c2UgbW90aW9uIGV2ZW50KS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMjQ3OCIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxtb3VzZW1vdGlvbmV2ZW50Lmh0bWwiCis+PFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9Nb3VzZU1vdGlvbkV2ZW50PC9TUEFOCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxkaXNwbGF5Zm9ybWF0YWxwaGEuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjcmVhdGVjdXJzb3IuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9EaXNwbGF5Rm9ybWF0QWxwaGE8L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ2aWRlby5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DcmVhdGVDdXJzb3I8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd2FzaW5pdC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx3YXNpbml0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlZmZlYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd2FzaW5pdC5odG1sCkBAIC0wLDAgKzEsMjg0IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1dhc0luaXQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iR2VuZXJhbCIKK0hSRUY9ImdlbmVyYWwuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1F1aXQiCitIUkVGPSJzZGxxdWl0Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0dldEVycm9yIgorSFJFRj0ic2RsZ2V0ZXJyb3IuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RscXVpdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsZ2V0ZXJyb3IuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExXQVNJTklUIgorPjwvQQorPlNETF9XYXNJbml0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU42MTciCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfV2FzSW5pdCZuYnNwOy0tJm5ic3A7Q2hlY2sgd2hpY2ggc3Vic3lzdGVtcyBhcmUgaW5pdGlhbGl6ZWQ8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVONjIwIgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjYyMSIKKz48L0EKKz48UAorPjwvUAorPjxQUkUKK0NMQVNTPSJGVU5DU1lOT1BTSVNJTkZPIgorPiNpbmNsdWRlICJTREwuaCI8L1BSRQorPjxQCis+PENPREUKKz48Q09ERQorQ0xBU1M9IkZVTkNERUYiCis+VWludDMyIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9XYXNJbml0PC9CCis+PC9DT0RFCis+KFVpbnQzMiBmbGFncyk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MjciCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfV2FzSW5pdDwvVFQKKz4gYWxsb3dzIHlvdSB0byBzZWUgd2hpY2ggU0RMIHN1YnN5dGVtcyBoYXZlIGJlZW4gPEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz5pbml0aWFsaXplZDwvQQorPi4gPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+ZmxhZ3M8L0kKKz48L1RUCis+IGlzIGEgYml0d2lzZSBPUidkIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWJzeXN0ZW1zIHlvdSB3aXNoIHRvIGNoZWNrIChzZWUgPEEKK0hSRUY9InNkbGluaXQuaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfSW5pdDwvVFQKKz48L0EKKz4gZm9yIGEgbGlzdCBvZiBzdWJzeXN0ZW0gZmxhZ3MpLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MzUiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1dhc0luaXQ8L1RUCis+IHJldHVybnMgYSBiaXR3aXNlZCBPUidkIGNvbWJpbmF0aW9uIG9mIHRoZSBpbml0aWFsaXplZCBzdWJzeXN0ZW1zLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU42MzkiCis+PC9BCis+PEgyCis+RXhhbXBsZXM8L0gyCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPiYjMTM7LyogSGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHlvdSBjYW4gdXNlIFNETF9XYXNJbml0KCkgKi8KKworLyogR2V0IGluaXQgZGF0YSBvbiBhbGwgdGhlIHN1YnN5c3RlbXMgKi8KK1VpbnQzMiBzdWJzeXN0ZW1faW5pdDsKKworc3Vic3lzdGVtX2luaXQ9U0RMX1dhc0luaXQoU0RMX0lOSVRfRVZFUllUSElORyk7CisKK2lmKHN1YnN5c3RlbV9pbml0JiMzODtTRExfSU5JVF9WSURFTykKKyAgcHJpbnRmKCJWaWRlbyBpcyBpbml0aWFsaXplZC5cbiIpOworZWxzZQorICBwcmludGYoIlZpZGVvIGlzIG5vdCBpbml0aWFsaXplZC5cbiIpOworCisKKworLyogSnVzdCBjaGVjayBmb3Igb25lIHNwZWNmaWMgc3Vic3lzdGVtICovCisKK2lmKFNETF9XYXNJbml0KFNETF9JTklUX1ZJREVPKSE9MCkKKyAgcHJpbnRmKCJWaWRlbyBpcyBpbml0aWFsaXplZC5cbiIpOworZWxzZQorICBwcmludGYoIlZpZGVvIGlzIG5vdCBpbml0aWFsaXplZC5cbiIpOworCisKKworCisvKiBDaGVjayBmb3IgdHdvIHN1YnN5c3RlbXMgKi8KKworVWludDMyIHN1YnN5c3RlbV9tYXNrPVNETF9JTklUX1ZJREVPfFNETF9JTklUX0FVRElPOworCitpZihTRExfV2FzSW5pdChzdWJzeXN0ZW1fbWFzayk9PXN1YnN5c3RlbV9tYXNrKQorICBwcmludGYoIlZpZGVvIGFuZCBBdWRpbyBpbml0aWFsaXplZC5cbiIpOworZWxzZQorICBwcmludGYoIlZpZGVvIGFuZCBBdWRpbyBub3QgaW5pdGlhbGl6ZWQuXG4iKTsmIzEzOzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjY0MiIKKz48L0EKKz48SDIKKz5TZWUgQWxzbzwvSDIKKz48UAorPjxBCitIUkVGPSJzZGxpbml0Lmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX0luaXQ8L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbGluaXRzdWJzeXN0ZW0uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfU3Vic3lzdGVtPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RscXVpdC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldGVycm9yLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfUXVpdDwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImdlbmVyYWwuaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfR2V0RXJyb3I8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd21nZXRjYXB0aW9uLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdtZ2V0Y2FwdGlvbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOWM2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdtZ2V0Y2FwdGlvbi5odG1sCkBAIC0wLDAgKzEsMjIyIEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+U0RMX1dNX0dldENhcHRpb248L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iV2luZG93IE1hbmFnZW1lbnQiCitIUkVGPSJ3bS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfV01fU2V0Q2FwdGlvbiIKK0hSRUY9InNkbHdtc2V0Y2FwdGlvbi5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9XTV9TZXRJY29uIgorSFJFRj0ic2Rsd21zZXRpY29uLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHdtc2V0Y2FwdGlvbi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsd21zZXRpY29uLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48SDEKKz48QQorTkFNRT0iU0RMV01HRVRDQVBUSU9OIgorPjwvQQorPlNETF9XTV9HZXRDYXB0aW9uPC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4zNTU2IgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1dNX0dldENhcHRpb24mbmJzcDstLSZuYnNwO0dldHMgdGhlIHdpbmRvdyB0aXRsZSBhbmQgaWNvbiBuYW1lLjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4zNTU5IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjM1NjAiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1dNX0dldENhcHRpb248L0IKKz48L0NPREUKKz4oY2hhciAqKnRpdGxlLCBjaGFyICoqaWNvbik7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zNTY2IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+U2V0IHBvaW50ZXJzIHRvIHRoZSB3aW5kb3cgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+dGl0bGU8L0kKKz48L1RUCis+IGFuZCA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5pY29uPC9JCis+PC9UVAorPiBuYW1lLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zNTcxIgorPjwvQQorPjxIMgorPlNlZSBBbHNvPC9IMgorPjxQCis+PEEKK0hSRUY9InNkbHdtc2V0Y2FwdGlvbi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9XTV9TZXRDYXB0aW9uPC9UVAorPjwvQQorPiwKKzxBCitIUkVGPSJzZGx3bXNldGljb24uaHRtbCIKKz48VFQKK0NMQVNTPSJGVU5DVElPTiIKKz5TRExfV01fU2V0SWNvbjwvVFQKKz48L0EKKz48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHdtc2V0Y2FwdGlvbi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHdtc2V0aWNvbi5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1dNX1NldENhcHRpb248L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ3bS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9XTV9TZXRJY29uPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdtZ3JhYmlucHV0Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdtZ3JhYmlucHV0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwZGNkNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd21ncmFiaW5wdXQuaHRtbApAQCAtMCwwICsxLDIyNCBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9XTV9HcmFiSW5wdXQ8L1RJVExFCis+PE1FVEEKK05BTUU9IkdFTkVSQVRPUiIKK0NPTlRFTlQ9Ik1vZHVsYXIgRG9jQm9vayBIVE1MIFN0eWxlc2hlZXQgVmVyc2lvbiAxLjc2YisKKyI+PExJTksKK1JFTD0iSE9NRSIKK1RJVExFPSJTREwgTGlicmFyeSBEb2N1bWVudGF0aW9uIgorSFJFRj0iaW5kZXguaHRtbCI+PExJTksKK1JFTD0iVVAiCitUSVRMRT0iV2luZG93IE1hbmFnZW1lbnQiCitIUkVGPSJ3bS5odG1sIj48TElOSworUkVMPSJQUkVWSU9VUyIKK1RJVExFPSJTRExfV01fVG9nZ2xlRnVsbFNjcmVlbiIKK0hSRUY9InNkbHdtdG9nZ2xlZnVsbHNjcmVlbi5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IkV2ZW50cyIKK0hSRUY9ImV2ZW50Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHdtdG9nZ2xlZnVsbHNjcmVlbi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0iZXZlbnQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExXTUdSQUJJTlBVVCIKKz48L0EKKz5TRExfV01fR3JhYklucHV0PC9IMQorPjxESVYKK0NMQVNTPSJSRUZOQU1FRElWIgorPjxBCitOQU1FPSJBRU4zNjYzIgorPjwvQQorPjxIMgorPk5hbWU8L0gyCis+U0RMX1dNX0dyYWJJbnB1dCZuYnNwOy0tJm5ic3A7R3JhYnMgbW91c2UgYW5kIGtleWJvYXJkIGlucHV0LjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4zNjY2IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjM2NjciCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPlNETF9HcmFiTW9kZSA8QgorQ0xBU1M9IkZTRlVOQyIKKz5TRExfV01fR3JhYklucHV0PC9CCis+PC9DT0RFCis+KFNETF9HcmFiTW9kZSBtb2RlKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM2NzMiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5HcmFiYmluZyBtZWFucyB0aGF0IHRoZSBtb3VzZSBpcyBjb25maW5lZCB0byB0aGUgYXBwbGljYXRpb24gd2luZG93LAorYW5kIG5lYXJseSBhbGwga2V5Ym9hcmQgaW5wdXQgaXMgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBhcHBsaWNhdGlvbiwKK2FuZCBub3QgaW50ZXJwcmV0ZWQgYnkgYSB3aW5kb3cgbWFuYWdlciwgaWYgYW55LjwvUAorPjxQCis+V2hlbiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5tb2RlPC9JCis+PC9UVAorPiBpcyA8VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9HUkFCX1FVRVJZPC9UVAorPiB0aGUgZ3JhYiBtb2RlIGlzIG5vdCBjaGFuZ2VkLCBidXQgdGhlIGN1cnJlbnQgZ3JhYiBtb2RlIGlzIHJldHVybmVkLjwvUAorPjxQCis+PFBSRQorQ0xBU1M9IlBST0dSQU1MSVNUSU5HIgorPnR5cGVkZWYgZW51bSB7CisgIFNETF9HUkFCX1FVRVJZLAorICBTRExfR1JBQl9PRkYsCisgIFNETF9HUkFCX09OCit9IFNETF9HcmFiTW9kZTs8L1BSRQorPgorICAgICAgICAgICAgICAgICAgICA8L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzY4MSIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5UaGUgY3VycmVudC9uZXcgPFNQQU4KK0NMQVNTPSJTVFJVQ1ROQU1FIgorPlNETF9HcmFiTW9kZTwvU1BBTgorPi48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHdtdG9nZ2xlZnVsbHNjcmVlbi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImV2ZW50Lmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfV01fVG9nZ2xlRnVsbFNjcmVlbjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9IndtLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+RXZlbnRzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdtaWNvbmlmeXdpbmRvdy5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx3bWljb25pZnl3aW5kb3cuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTEzNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx3bWljb25pZnl3aW5kb3cuaHRtbApAQCAtMCwwICsxLDIxMSBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9XTV9JY29uaWZ5V2luZG93PC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IldpbmRvdyBNYW5hZ2VtZW50IgorSFJFRj0id20uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX1dNX1NldEljb24iCitIUkVGPSJzZGx3bXNldGljb24uaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfV01fVG9nZ2xlRnVsbFNjcmVlbiIKK0hSRUY9InNkbHdtdG9nZ2xlZnVsbHNjcmVlbi5odG1sIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IlJFRkVOVFJZIgorQkdDT0xPUj0iI0ZGRjhEQyIKK1RFWFQ9IiMwMDAwMDAiCitMSU5LPSIjMDAwMGVlIgorVkxJTks9IiM1NTFhOGIiCitBTElOSz0iI2ZmMDAwMCIKKz48RElWCitDTEFTUz0iTkFWSEVBREVSIgorPjxUQUJMRQorU1VNTUFSWT0iSGVhZGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRICitDT0xTUEFOPSIzIgorQUxJR049ImNlbnRlciIKKz5TREwgTGlicmFyeSBEb2N1bWVudGF0aW9uPC9USAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx3bXNldGljb24uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHdtdG9nZ2xlZnVsbHNjcmVlbi5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PEgxCis+PEEKK05BTUU9IlNETFdNSUNPTklGWVdJTkRPVyIKKz48L0EKKz5TRExfV01fSWNvbmlmeVdpbmRvdzwvSDEKKz48RElWCitDTEFTUz0iUkVGTkFNRURJViIKKz48QQorTkFNRT0iQUVOMzYxNyIKKz48L0EKKz48SDIKKz5OYW1lPC9IMgorPlNETF9XTV9JY29uaWZ5V2luZG93Jm5ic3A7LS0mbmJzcDtJY29uaWZ5L01pbmltaXNlIHRoZSB3aW5kb3c8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMzYyMCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4zNjIxIgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1dNX0ljb25pZnlXaW5kb3c8L0IKKz48L0NPREUKKz4odm9pZCk7PC9DT0RFCis+PC9QCis+PFAKKz48L1AKKz48L0RJVgorPjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNFQ1QxIgorPjxBCitOQU1FPSJBRU4zNjI3IgorPjwvQQorPjxIMgorPkRlc2NyaXB0aW9uPC9IMgorPjxQCis+SWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gYSB3aW5kb3cgbWFuYWdlZCBlbnZpcm9ubWVudCBTREwgYXR0ZW1wdHMgdG8gaWNvbmlmeS9taW5pbWlzZSBpdC4gSWYgPFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1dNX0ljb25pZnlXaW5kb3c8L1RUCis+IGlzIHN1Y2Nlc3NmdWwsIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlY2VpdmUgYSA8QQorSFJFRj0ic2RsYWN0aXZlZXZlbnQuaHRtbCIKKz48VFQKK0NMQVNTPSJMSVRFUkFMIgorPlNETF9BUFBBQ1RJVkU8L1RUCis+PC9BCis+IGxvc3MgZXZlbnQuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM2MzMiCis+PC9BCis+PEgyCis+UmV0dXJuIFZhbHVlPC9IMgorPjxQCis+UmV0dXJucyBub24temVybyBvbiBzdWNjZXNzIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBpZiBpY29uaWZpY2F0aW9uIGlzIG5vdCBzdXBwb3J0IG9yIHdhcyByZWZ1c2VkIGJ5IHRoZSB3aW5kb3cgbWFuYWdlci48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHdtc2V0aWNvbi5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbHdtdG9nZ2xlZnVsbHNjcmVlbi5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1dNX1NldEljb248L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJ3bS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9XTV9Ub2dnbGVGdWxsU2NyZWVuPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3NkbHdtc2V0Y2FwdGlvbi5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx3bXNldGNhcHRpb24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ3YzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx3bXNldGNhcHRpb24uaHRtbApAQCAtMCwwICsxLDIxMiBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlNETF9XTV9TZXRDYXB0aW9uPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IldpbmRvdyBNYW5hZ2VtZW50IgorSFJFRj0id20uaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iV2luZG93IE1hbmFnZW1lbnQiCitIUkVGPSJ3bS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9XTV9HZXRDYXB0aW9uIgorSFJFRj0ic2Rsd21nZXRjYXB0aW9uLmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9IndtLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx3bWdldGNhcHRpb24uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExXTVNFVENBUFRJT04iCis+PC9BCis+U0RMX1dNX1NldENhcHRpb248L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjM1MzIiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfV01fU2V0Q2FwdGlvbiZuYnNwOy0tJm5ic3A7U2V0cyB0aGUgd2luZG93IHRpbGUgYW5kIGljb24gbmFtZS48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMzUzNSIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4zNTM2IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz52b2lkIDxCCitDTEFTUz0iRlNGVU5DIgorPlNETF9XTV9TZXRDYXB0aW9uPC9CCis+PC9DT0RFCis+KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM1NDIiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5TZXRzIHRoZSB0aXRsZS1iYXIgYW5kIGljb24gbmFtZSBvZiB0aGUgZGlzcGxheSB3aW5kb3cuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM1NDUiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsd21nZXRjYXB0aW9uLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1dNX0dldENhcHRpb248L1RUCis+PC9BCis+LAorPEEKK0hSRUY9InNkbHdtc2V0aWNvbi5odG1sIgorPjxUVAorQ0xBU1M9IkZVTkNUSU9OIgorPlNETF9XTV9TZXRJY29uPC9UVAorPjwvQQorPjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0id20uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx3bWdldGNhcHRpb24uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPldpbmRvdyBNYW5hZ2VtZW50PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0id20uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfV01fR2V0Q2FwdGlvbjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx3bXNldGljb24uaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd21zZXRpY29uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlYjIwNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd21zZXRpY29uLmh0bWwKQEAgLTAsMCArMSwyNjAgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfV01fU2V0SWNvbjwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJXaW5kb3cgTWFuYWdlbWVudCIKK0hSRUY9IndtLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9XTV9HZXRDYXB0aW9uIgorSFJFRj0ic2Rsd21nZXRjYXB0aW9uLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1dNX0ljb25pZnlXaW5kb3ciCitIUkVGPSJzZGx3bWljb25pZnl3aW5kb3cuaHRtbCI+PC9IRUFECis+PEJPRFkKK0NMQVNTPSJSRUZFTlRSWSIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsd21nZXRjYXB0aW9uLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGx3bWljb25pZnl3aW5kb3cuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExXTVNFVElDT04iCis+PC9BCis+U0RMX1dNX1NldEljb248L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjM1ODIiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfV01fU2V0SWNvbiZuYnNwOy0tJm5ic3A7U2V0cyB0aGUgaWNvbiBmb3IgdGhlIGRpc3BsYXkgd2luZG93LjwvRElWCis+PERJVgorQ0xBU1M9IlJFRlNZTk9QU0lTRElWIgorPjxBCitOQU1FPSJBRU4zNTg1IgorPjwvQQorPjxIMgorPlN5bm9wc2lzPC9IMgorPjxESVYKK0NMQVNTPSJGVU5DU1lOT1BTSVMiCis+PEEKK05BTUU9IkFFTjM1ODYiCis+PC9BCis+PFAKKz48L1AKKz48UFJFCitDTEFTUz0iRlVOQ1NZTk9QU0lTSU5GTyIKKz4jaW5jbHVkZSAiU0RMLmgiPC9QUkUKKz48UAorPjxDT0RFCis+PENPREUKK0NMQVNTPSJGVU5DREVGIgorPnZvaWQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1dNX1NldEljb248L0IKKz48L0NPREUKKz4oU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKTs8L0NPREUKKz48L1AKKz48UAorPjwvUAorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM1OTIiCis+PC9BCis+PEgyCis+RGVzY3JpcHRpb248L0gyCis+PFAKKz5TZXRzIHRoZSBpY29uIGZvciB0aGUgZGlzcGxheSB3aW5kb3cuIFdpbjMyIGljb25zIG11c3QgYmUgMzJ4MzIuPC9QCis+PFAKKz5UaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byAKKzxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz5TRExfU2V0VmlkZW9Nb2RlPC9BCis+LjwvUAorPjxQCis+VGhlIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm1hc2s8L0kKKz48L1RUCis+IGlzIGEgYml0bWFzayB0aGF0IGRlc2NyaWJlcyB0aGUgc2hhcGUgb2YgdGhlCitpY29uLiBJZiA8VFQKK0NMQVNTPSJQQVJBTUVURVIiCis+PEkKKz5tYXNrPC9JCis+PC9UVAorPiBpcyBOVUxMLCB0aGVuIHRoZSBzaGFwZSBpcyBkZXRlcm1pbmVkIGJ5Cit0aGUgY29sb3JrZXkgb2YgPFRUCitDTEFTUz0iUEFSQU1FVEVSIgorPjxJCis+aWNvbjwvSQorPjwvVFQKKz4sIGlmIGFueSwgb3IgbWFrZXMgdGhlIGljb24KK3JlY3Rhbmd1bGFyIChubyB0cmFuc3BhcmVuY3kpIG90aGVyd2lzZS48L1AKKz48UAorPklmIDxUVAorQ0xBU1M9IlBBUkFNRVRFUiIKKz48SQorPm1hc2s8L0kKKz48L1RUCis+IGlzIG5vbi1OVUxMLCBpdCBwb2ludHMgdG8gYSBiaXRtYXAgd2l0aCBiaXRzIHNldAord2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgcGl4ZWwgc2hvdWxkIGJlIHZpc2libGUuIFRoZSBmb3JtYXQgb2YgdGhlIGJpdG1hcCBpcyBhcworZm9sbG93czogU2NhbmxpbmVzIGNvbWUgaW4gdGhlIHVzdWFsIHRvcC1kb3duIG9yZGVyLiBFYWNoIHNjYW5saW5lIGNvbnNpc3RzIG9mCisod2lkdGggLyA4KSBieXRlcywgcm91bmRlZCB1cC4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGVhY2ggYnl0ZSByZXByZXNlbnRzCit0aGUgbGVmdG1vc3QgcGl4ZWwuPC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM2MDMiCis+PC9BCis+PEgyCis+RXhhbXBsZTwvSDIKKz48UFJFCitDTEFTUz0iUFJPR1JBTUxJU1RJTkciCis+U0RMX1dNX1NldEljb24oU0RMX0xvYWRCTVAoImljb24uYm1wIiksIE5VTEwpOzwvUFJFCis+PC9ESVYKKz48RElWCitDTEFTUz0iUkVGU0VDVDEiCis+PEEKK05BTUU9IkFFTjM2MDYiCis+PC9BCis+PEgyCis+U2VlIEFsc288L0gyCis+PFAKKz48QQorSFJFRj0ic2Rsc2V0dmlkZW9tb2RlLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1NldFZpZGVvTW9kZTwvVFQKKz48L0EKKz4sCis8QQorSFJFRj0ic2Rsd21zZXRjYXB0aW9uLmh0bWwiCis+PFRUCitDTEFTUz0iRlVOQ1RJT04iCis+U0RMX1dNX1NldENhcHRpb248L1RUCis+PC9BCis+PC9QCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx3bWdldGNhcHRpb24uaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx3bWljb25pZnl3aW5kb3cuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9XTV9HZXRDYXB0aW9uPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0id20uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfV01fSWNvbmlmeVdpbmRvdzwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC9zZGx3bXRvZ2dsZWZ1bGxzY3JlZW4uaHRtbCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd210b2dnbGVmdWxsc2NyZWVuLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5NzNkZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvc2Rsd210b2dnbGVmdWxsc2NyZWVuLmh0bWwKQEAgLTAsMCArMSwyMDUgQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5TRExfV01fVG9nZ2xlRnVsbFNjcmVlbjwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJXaW5kb3cgTWFuYWdlbWVudCIKK0hSRUY9IndtLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9XTV9JY29uaWZ5V2luZG93IgorSFJFRj0ic2Rsd21pY29uaWZ5d2luZG93Lmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX1dNX0dyYWJJbnB1dCIKK0hSRUY9InNkbHdtZ3JhYmlucHV0Lmh0bWwiPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iUkVGRU5UUlkiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbHdtaWNvbmlmeXdpbmRvdy5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsd21ncmFiaW5wdXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48L1RBQkxFCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48L0RJVgorPjxIMQorPjxBCitOQU1FPSJTRExXTVRPR0dMRUZVTExTQ1JFRU4iCis+PC9BCis+U0RMX1dNX1RvZ2dsZUZ1bGxTY3JlZW48L0gxCis+PERJVgorQ0xBU1M9IlJFRk5BTUVESVYiCis+PEEKK05BTUU9IkFFTjM2NDEiCis+PC9BCis+PEgyCis+TmFtZTwvSDIKKz5TRExfV01fVG9nZ2xlRnVsbFNjcmVlbiZuYnNwOy0tJm5ic3A7VG9nZ2xlcyBmdWxsc2NyZWVuIG1vZGU8L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTWU5PUFNJU0RJViIKKz48QQorTkFNRT0iQUVOMzY0NCIKKz48L0EKKz48SDIKKz5TeW5vcHNpczwvSDIKKz48RElWCitDTEFTUz0iRlVOQ1NZTk9QU0lTIgorPjxBCitOQU1FPSJBRU4zNjQ1IgorPjwvQQorPjxQCis+PC9QCis+PFBSRQorQ0xBU1M9IkZVTkNTWU5PUFNJU0lORk8iCis+I2luY2x1ZGUgIlNETC5oIjwvUFJFCis+PFAKKz48Q09ERQorPjxDT0RFCitDTEFTUz0iRlVOQ0RFRiIKKz5pbnQgPEIKK0NMQVNTPSJGU0ZVTkMiCis+U0RMX1dNX1RvZ2dsZUZ1bGxTY3JlZW48L0IKKz48L0NPREUKKz4oU0RMX1N1cmZhY2UgKnN1cmZhY2UpOzwvQ09ERQorPjwvUAorPjxQCis+PC9QCis+PC9ESVYKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzY1MSIKKz48L0EKKz48SDIKKz5EZXNjcmlwdGlvbjwvSDIKKz48UAorPlRvZ2dsZXMgdGhlIGFwcGxpY2F0aW9uIGJldHdlZW4gd2luZG93ZWQgYW5kIGZ1bGxzY3JlZW4gbW9kZSwgaWYgc3VwcG9ydGVkLiAoWDExIGlzIHRoZSBvbmx5IHRhcmdldCBjdXJyZW50bHkgc3VwcG9ydGVkLCBCZU9TIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsKS48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJSRUZTRUNUMSIKKz48QQorTkFNRT0iQUVOMzY1NCIKKz48L0EKKz48SDIKKz5SZXR1cm4gVmFsdWU8L0gyCis+PFAKKz5SZXR1cm5zIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MDwvU1BBTgorPiBvbiBmYWlsdXJlIG9yIDxTUEFOCitDTEFTUz0iUkVUVVJOVkFMVUUiCis+MTwvU1BBTgorPiBvbiBzdWNjZXNzLjwvUAorPjwvRElWCis+PERJVgorQ0xBU1M9Ik5BVkZPT1RFUiIKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjxUQUJMRQorU1VNTUFSWT0iRm9vdGVyIG5hdmlnYXRpb24gdGFibGUiCitXSURUSD0iMTAwJSIKK0JPUkRFUj0iMCIKK0NFTExQQURESU5HPSIwIgorQ0VMTFNQQUNJTkc9IjAiCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsd21pY29uaWZ5d2luZG93Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2Rsd21ncmFiaW5wdXQuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9XTV9JY29uaWZ5V2luZG93PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0id20uaHRtbCIKK0FDQ0VTU0tFWT0iVSIKKz5VcDwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz5TRExfV01fR3JhYklucHV0PC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3RocmVhZC5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC90aHJlYWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWYyYzkyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC90aHJlYWQuaHRtbApAQCAtMCwwICsxLDMxMyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPk11bHRpLXRocmVhZGVkIFByb2dyYW1taW5nPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBSZWZlcmVuY2UiCitIUkVGPSJyZWZlcmVuY2UuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX0NEdHJhY2siCitIUkVGPSJzZGxjZHRyYWNrLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0NyZWF0ZVRocmVhZCIKK0hSRUY9InNkbGNyZWF0ZXRocmVhZC5odG1sIj48TUVUQQorTkFNRT0iS0VZV09SRCIKK0NPTlRFTlQ9InRocmVhZHMiPjxNRVRBCitOQU1FPSJLRVlXT1JEIgorQ09OVEVOVD0iZnVuY3Rpb24iPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iQ0hBUFRFUiIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY2R0cmFjay5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY3JlYXRldGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iQ0hBUFRFUiIKKz48SDEKKz48QQorTkFNRT0iVEhSRUFEIgorPjwvQQorPkNoYXB0ZXIgMTIuIE11bHRpLXRocmVhZGVkIFByb2dyYW1taW5nPC9IMQorPjxESVYKK0NMQVNTPSJUT0MiCis+PERMCis+PERUCis+PEIKKz5UYWJsZSBvZiBDb250ZW50czwvQgorPjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY3JlYXRldGhyZWFkLmh0bWwiCis+U0RMX0NyZWF0ZVRocmVhZDwvQQorPiZuYnNwOy0tJm5ic3A7Q3JlYXRlcyBhIG5ldyB0aHJlYWQgb2YgZXhlY3V0aW9uIHRoYXQgc2hhcmVzIGl0cyBwYXJlbnQncyBwcm9wZXJ0aWVzLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsdGhyZWFkaWQuaHRtbCIKKz5TRExfVGhyZWFkSUQ8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgMzItYml0IHRocmVhZCBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXR0aHJlYWRpZC5odG1sIgorPlNETF9HZXRUaHJlYWRJRDwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBTREwgdGhyZWFkIElEIG9mIGEgU0RMX1RocmVhZDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd2FpdHRocmVhZC5odG1sIgorPlNETF9XYWl0VGhyZWFkPC9BCis+Jm5ic3A7LS0mbmJzcDtXYWl0IGZvciBhIHRocmVhZCB0byBmaW5pc2guPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxraWxsdGhyZWFkLmh0bWwiCis+U0RMX0tpbGxUaHJlYWQ8L0EKKz4mbmJzcDstLSZuYnNwO0dyYWNlbGVzc2x5IHRlcm1pbmF0ZXMgdGhlIHRocmVhZC48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNyZWF0ZW11dGV4Lmh0bWwiCis+U0RMX0NyZWF0ZU11dGV4PC9BCis+Jm5ic3A7LS0mbmJzcDtDcmVhdGUgYSBtdXRleDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZGVzdHJveW11dGV4Lmh0bWwiCis+U0RMX0Rlc3Ryb3lNdXRleDwvQQorPiZuYnNwOy0tJm5ic3A7RGVzdHJveSBhIG11dGV4PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxtdXRleHAuaHRtbCIKKz5TRExfbXV0ZXhQPC9BCis+Jm5ic3A7LS0mbmJzcDtMb2NrIGEgbXV0ZXg8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbG11dGV4di5odG1sIgorPlNETF9tdXRleFY8L0EKKz4mbmJzcDstLSZuYnNwO1VubG9jayBhIG11dGV4PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjcmVhdGVzZW1hcGhvcmUuaHRtbCIKKz5TRExfQ3JlYXRlU2VtYXBob3JlPC9BCis+Jm5ic3A7LS0mbmJzcDtDcmVhdGVzIGEgbmV3IHNlbWFwaG9yZSBhbmQgYXNzaWducyBhbiBpbml0aWFsIHZhbHVlIHRvIGl0LjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZGVzdHJveXNlbWFwaG9yZS5odG1sIgorPlNETF9EZXN0cm95U2VtYXBob3JlPC9BCis+Jm5ic3A7LS0mbmJzcDtEZXN0cm95cyBhIHNlbWFwaG9yZSB0aGF0IHdhcyBjcmVhdGVkIGJ5IDxBCitIUkVGPSJzZGxjcmVhdGVzZW1hcGhvcmUuaHRtbCIKKz5TRExfQ3JlYXRlU2VtYXBob3JlPC9BCis+LjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2Vtd2FpdC5odG1sIgorPlNETF9TZW1XYWl0PC9BCis+Jm5ic3A7LS0mbmJzcDtMb2NrIGEgc2VtYXBob3JlIGFuZCBzdXNwZW5kIHRoZSB0aHJlYWQgaWYgdGhlIHNlbWFwaG9yZSB2YWx1ZSBpcyB6ZXJvLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2VtdHJ5d2FpdC5odG1sIgorPlNETF9TZW1UcnlXYWl0PC9BCis+Jm5ic3A7LS0mbmJzcDtBdHRlbXB0IHRvIGxvY2sgYSBzZW1hcGhvcmUgYnV0IGRvbid0IHN1c3BlbmQgdGhlIHRocmVhZC48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNlbXdhaXR0aW1lb3V0Lmh0bWwiCis+U0RMX1NlbVdhaXRUaW1lb3V0PC9BCis+Jm5ic3A7LS0mbmJzcDtMb2NrIGEgc2VtYXBob3JlLCBidXQgb25seSB3YWl0IHVwIHRvIGEgc3BlY2lmaWVkIG1heGltdW0gdGltZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNlbXBvc3QuaHRtbCIKKz5TRExfU2VtUG9zdDwvQQorPiZuYnNwOy0tJm5ic3A7VW5sb2NrIGEgc2VtYXBob3JlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2VtdmFsdWUuaHRtbCIKKz5TRExfU2VtVmFsdWU8L0EKKz4mbmJzcDstLSZuYnNwO1JldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIHNlbWFwaG9yZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNyZWF0ZWNvbmQuaHRtbCIKKz5TRExfQ3JlYXRlQ29uZDwvQQorPiZuYnNwOy0tJm5ic3A7Q3JlYXRlIGEgY29uZGl0aW9uIHZhcmlhYmxlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxkZXN0cm95Y29uZC5odG1sIgorPlNETF9EZXN0cm95Q29uZDwvQQorPiZuYnNwOy0tJm5ic3A7RGVzdHJveSBhIGNvbmRpdGlvbiB2YXJpYWJsZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY29uZHNpZ25hbC5odG1sIgorPlNETF9Db25kU2lnbmFsPC9BCis+Jm5ic3A7LS0mbmJzcDtSZXN0YXJ0IGEgdGhyZWFkIHdhaXQgb24gYSBjb25kaXRpb24gdmFyaWFibGU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGNvbmRicm9hZGNhc3QuaHRtbCIKKz5TRExfQ29uZEJyb2FkY2FzdDwvQQorPiZuYnNwOy0tJm5ic3A7UmVzdGFydCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjb25kd2FpdC5odG1sIgorPlNETF9Db25kV2FpdDwvQQorPiZuYnNwOy0tJm5ic3A7V2FpdCBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY29uZHdhaXR0aW1lb3V0Lmh0bWwiCis+U0RMX0NvbmRXYWl0VGltZW91dDwvQQorPiZuYnNwOy0tJm5ic3A7V2FpdCBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZSwgd2l0aCB0aW1lb3V0PC9EVAorPjwvREwKKz48L0RJVgorPjxQCis+U0RMIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgdGhyZWFkcywgbXV0ZXhlcywgc2VtcGhvcmVzIGFuZCBjb25kaXRpb24gdmFyaWFibGVzLjwvUAorPjxQCis+SW4gZ2VuZXJhbCwgeW91IG11c3QgYmUgdmVyeSBhd2FyZSBvZiBjb25jdXJyZW5jeSBhbmQgZGF0YSBpbnRlZ3JpdHkgaXNzdWVzCit3aGVuIHdyaXRpbmcgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMuICBTb21lIGdvb2QgZ3VpZGVsaW5lcyBpbmNsdWRlOgorPFAKKz48L1AKKz48VUwKKz48TEkKKz48UAorPkRvbid0IGNhbGwgU0RMIHZpZGVvL2V2ZW50IGZ1bmN0aW9ucyBmcm9tIHNlcGFyYXRlIHRocmVhZHM8L1AKKz48L0xJCis+PExJCis+PFAKKz5Eb24ndCB1c2UgYW55IGxpYnJhcnkgZnVuY3Rpb25zIGluIHNlcGFyYXRlIHRocmVhZHM8L1AKKz48L0xJCis+PExJCis+PFAKKz5Eb24ndCBwZXJmb3JtIGFueSBtZW1vcnkgbWFuYWdlbWVudCBpbiBzZXBhcmF0ZSB0aHJlYWRzPC9QCis+PC9MSQorPjxMSQorPjxQCis+TG9jayBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG1heSBiZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzPC9QCis+PC9MSQorPjxMSQorPjxQCis+TmV2ZXIgdGVybWluYXRlIHRocmVhZHMsIGFsd2F5cyBzZXQgYSBmbGFnIGFuZCB3YWl0IGZvciB0aGVtIHRvIHF1aXQ8L1AKKz48L0xJCis+PExJCis+PFAKKz5UaGluayB2ZXJ5IGNhcmVmdWxseSBhYm91dCBhbGwgcG9zc2libGUgd2F5cyB5b3VyIGNvZGUgbWF5IGludGVyYWN0PC9QCis+PC9MSQorPjwvVUwKKz48L1AKKz48RElWCitDTEFTUz0iTk9URSIKKz48QkxPQ0tRVU9URQorQ0xBU1M9Ik5PVEUiCis+PFAKKz48QgorPk5vdGU6IDwvQgorPlNETCdzIHRocmVhZGluZyBpcyBub3QgaW1wbGVtZW50ZWQgb24gTWFjT1MsIGR1ZSB0byB0aGUgbGFjayBvZiBwcmVlbXB0aXZlIHRocmVhZCBzdXBwb3J0IG9uIHRoYXQgT1MgKE1hYyBPUyBYIGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhpcyBwcm9ibGVtKTwvUAorPjwvQkxPQ0tRVU9URQorPjwvRElWCis+PC9ESVYKKz48RElWCitDTEFTUz0iTkFWRk9PVEVSIgorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PFRBQkxFCitTVU1NQVJZPSJGb290ZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxjZHRyYWNrLmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9ImluZGV4Lmh0bWwiCitBQ0NFU1NLRVk9IkgiCis+SG9tZTwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0icmlnaHQiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0ic2RsY3JlYXRldGhyZWFkLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQ0R0cmFjazwvVEQKKz48VEQKK1dJRFRIPSIzNCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InJlZmVyZW5jZS5odG1sIgorQUNDRVNTS0VZPSJVIgorPlVwPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPlNETF9DcmVhdGVUaHJlYWQ8L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvdGltZS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC90aW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0YjdjYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvdGltZS5odG1sCkBAIC0wLDAgKzEsMjA2IEBACis8SFRNTAorPjxIRUFECis+PFRJVExFCis+VGltZTwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgUmVmZXJlbmNlIgorSFJFRj0icmVmZXJlbmNlLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9Db25kV2FpdFRpbWVvdXQiCitIUkVGPSJzZGxjb25kd2FpdHRpbWVvdXQuaHRtbCI+PExJTksKK1JFTD0iTkVYVCIKK1RJVExFPSJTRExfR2V0VGlja3MiCitIUkVGPSJzZGxnZXR0aWNrcy5odG1sIj48TUVUQQorTkFNRT0iS0VZV09SRCIKK0NPTlRFTlQ9InRpbWUiPjxNRVRBCitOQU1FPSJLRVlXT1JEIgorQ09OVEVOVD0iZnVuY3Rpb24iPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iQ0hBUFRFUiIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2RsY29uZHdhaXR0aW1lb3V0Lmh0bWwiCitBQ0NFU1NLRVk9IlAiCis+UHJldjwvQQorPjwvVEQKKz48VEQKK1dJRFRIPSI4MCUiCitBTElHTj0iY2VudGVyIgorVkFMSUdOPSJib3R0b20iCis+PC9URAorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0iYm90dG9tIgorPjxBCitIUkVGPSJzZGxnZXR0aWNrcy5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IkNIQVBURVIiCis+PEgxCis+PEEKK05BTUU9IlRJTUUiCis+PC9BCis+Q2hhcHRlciAxMy4gVGltZTwvSDEKKz48RElWCitDTEFTUz0iVE9DIgorPjxETAorPjxEVAorPjxCCis+VGFibGUgb2YgQ29udGVudHM8L0IKKz48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdldHRpY2tzLmh0bWwiCis+U0RMX0dldFRpY2tzPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIFNETCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZGVsYXkuaHRtbCIKKz5TRExfRGVsYXk8L0EKKz4mbmJzcDstLSZuYnNwO1dhaXQgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmV0dXJuaW5nLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsYWRkdGltZXIuaHRtbCIKKz5TRExfQWRkVGltZXI8L0EKKz4mbmJzcDstLSZuYnNwO0FkZCBhIHRpbWVyIHdoaWNoIHdpbGwgY2FsbCBhIGNhbGxiYWNrIGFmdGVyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXMKK2VsYXBzZWQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxyZW1vdmV0aW1lci5odG1sIgorPlNETF9SZW1vdmVUaW1lcjwvQQorPiZuYnNwOy0tJm5ic3A7UmVtb3ZlIGEgdGltZXIgd2hpY2ggd2FzIGFkZGVkIHdpdGgKKzxBCitIUkVGPSJzZGxhZGR0aW1lci5odG1sIgorPlNETF9BZGRUaW1lcjwvQQorPi48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNldHRpbWVyLmh0bWwiCis+U0RMX1NldFRpbWVyPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXQgYSBjYWxsYmFjayB0byBydW4gYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGhhcworZWxhcHNlZC48L0RUCis+PC9ETAorPjwvRElWCis+PFAKKz5TREwgcHJvdmlkZXMgc2V2ZXJhbCBjcm9zcy1wbGF0Zm9ybSBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aW1lLgorSXQgcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUsIGEgd2F5IHRvIHdhaXQgYSBsaXR0bGUgd2hpbGUsCithbmQgYSBzaW1wbGUgdGltZXIgbWVjaGFuaXNtLiAgVGhlc2UgZnVuY3Rpb25zIGdpdmUgeW91IHR3byB3YXlzIG9mIG1vdmluZyBhbgorb2JqZWN0IGV2ZXJ5IHggbWlsbGlzZWNvbmRzOgorCis8UAorPjwvUAorPjxVTAorPjxMSQorPjxQCis+VXNlIGEgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24uICBUaGlzIG1heSBoYXZlIHRoZSBiYWQgZWZmZWN0IHRoYXQgaXQgcnVucyBpbiBhIHNlcGVyYXRlIHRocmVhZCBvciB1c2VzIGFsYXJtIHNpZ25hbHMsIGJ1dCBpdCdzIGVhc2llciB0byBpbXBsZW1lbnQuPC9QCis+PC9MSQorPjxMSQorPjxQCis+T3IgeW91IGNhbiBnZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgcGFzc2VkLCBhbmQgbW92ZSB0aGUgb2JqZWN0IGlmLCBmb3IgZXhhbXBsZSwgMzAgbXMgcGFzc2VkLjwvUAorPjwvTEkKKz48L1VMCis+JiMxMzs8L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGNvbmR3YWl0dGltZW91dC5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iMzQlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJpbmRleC5odG1sIgorQUNDRVNTS0VZPSJIIgorPkhvbWU8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGdldHRpY2tzLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMzMlIgorQUxJR049ImxlZnQiCitWQUxJR049InRvcCIKKz5TRExfQ29uZFdhaXRUaW1lb3V0PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0icmVmZXJlbmNlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldFRpY2tzPC9URAorPjwvVFIKKz48L1RBQkxFCis+PC9ESVYKKz48L0JPRFkKKz48L0hUTUwKKz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3ZpZGVvLmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3ZpZGVvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxNDM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2h0bWwvdmlkZW8uaHRtbApAQCAtMCwwICsxLDUwNyBAQAorPEhUTUwKKz48SEVBRAorPjxUSVRMRQorPlZpZGVvPC9USVRMRQorPjxNRVRBCitOQU1FPSJHRU5FUkFUT1IiCitDT05URU5UPSJNb2R1bGFyIERvY0Jvb2sgSFRNTCBTdHlsZXNoZWV0IFZlcnNpb24gMS43NmIrCisiPjxMSU5LCitSRUw9IkhPTUUiCitUSVRMRT0iU0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbiIKK0hSRUY9ImluZGV4Lmh0bWwiPjxMSU5LCitSRUw9IlVQIgorVElUTEU9IlNETCBSZWZlcmVuY2UiCitIUkVGPSJyZWZlcmVuY2UuaHRtbCI+PExJTksKK1JFTD0iUFJFVklPVVMiCitUSVRMRT0iU0RMX2VudnZhcnMiCitIUkVGPSJzZGxlbnZ2YXJzLmh0bWwiPjxMSU5LCitSRUw9Ik5FWFQiCitUSVRMRT0iU0RMX0dldFZpZGVvU3VyZmFjZSIKK0hSRUY9InNkbGdldHZpZGVvc3VyZmFjZS5odG1sIj48TUVUQQorTkFNRT0iS0VZV09SRCIKK0NPTlRFTlQ9InZpZGVvIj48TUVUQQorTkFNRT0iS0VZV09SRCIKK0NPTlRFTlQ9ImZ1bmN0aW9uIj48L0hFQUQKKz48Qk9EWQorQ0xBU1M9IkNIQVBURVIiCitCR0NPTE9SPSIjRkZGOERDIgorVEVYVD0iIzAwMDAwMCIKK0xJTks9IiMwMDAwZWUiCitWTElOSz0iIzU1MWE4YiIKK0FMSU5LPSIjZmYwMDAwIgorPjxESVYKK0NMQVNTPSJOQVZIRUFERVIiCis+PFRBQkxFCitTVU1NQVJZPSJIZWFkZXIgbmF2aWdhdGlvbiB0YWJsZSIKK1dJRFRIPSIxMDAlIgorQk9SREVSPSIwIgorQ0VMTFBBRERJTkc9IjAiCitDRUxMU1BBQ0lORz0iMCIKKz48VFIKKz48VEgKK0NPTFNQQU49IjMiCitBTElHTj0iY2VudGVyIgorPlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb248L1RICis+PC9UUgorPjxUUgorPjxURAorV0lEVEg9IjEwJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGVudnZhcnMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjgwJSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049ImJvdHRvbSIKKz48L1RECis+PFRECitXSURUSD0iMTAlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJib3R0b20iCis+PEEKK0hSRUY9InNkbGdldHZpZGVvc3VyZmFjZS5odG1sIgorQUNDRVNTS0VZPSJOIgorPk5leHQ8L0EKKz48L1RECis+PC9UUgorPjwvVEFCTEUKKz48SFIKK0FMSUdOPSJMRUZUIgorV0lEVEg9IjEwMCUiPjwvRElWCis+PERJVgorQ0xBU1M9IkNIQVBURVIiCis+PEgxCis+PEEKK05BTUU9IlZJREVPIgorPjwvQQorPkNoYXB0ZXIgNi4gVmlkZW88L0gxCis+PERJVgorQ0xBU1M9IlRPQyIKKz48REwKKz48RFQKKz48QgorPlRhYmxlIG9mIENvbnRlbnRzPC9CCis+PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXR2aWRlb3N1cmZhY2UuaHRtbCIKKz5TRExfR2V0VmlkZW9TdXJmYWNlPC9BCis+Jm5ic3A7LS0mbmJzcDtyZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBkaXNwbGF5IHN1cmZhY2U8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdldHZpZGVvaW5mby5odG1sIgorPlNETF9HZXRWaWRlb0luZm88L0EKKz4mbmJzcDstLSZuYnNwO3JldHVybnMgYSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyBoYXJkd2FyZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsdmlkZW9kcml2ZXJuYW1lLmh0bWwiCis+U0RMX1ZpZGVvRHJpdmVyTmFtZTwvQQorPiZuYnNwOy0tJm5ic3A7T2J0YWluIHRoZSBuYW1lIG9mIHRoZSB2aWRlbyBkcml2ZXI8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGxpc3Rtb2Rlcy5odG1sIgorPlNETF9MaXN0TW9kZXM8L0EKKz4mbmJzcDstLSZuYnNwO1JldHVybnMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGF2YWlsYWJsZSBzY3JlZW4gZGltZW5zaW9ucyBmb3IgCit0aGUgZ2l2ZW4gZm9ybWF0IGFuZCB2aWRlbyBmbGFnczwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsdmlkZW9tb2Rlb2suaHRtbCIKKz5TRExfVmlkZW9Nb2RlT0s8L0EKKz4mbmJzcDstLSZuYnNwO0NoZWNrIHRvIHNlZSBpZiBhIHBhcnRpY3VsYXIgdmlkZW8gbW9kZSBpcyBzdXBwb3J0ZWQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZXR2aWRlb21vZGUuaHRtbCIKKz5TRExfU2V0VmlkZW9Nb2RlPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXQgdXAgYSB2aWRlbyBtb2RlIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCwgaGVpZ2h0IGFuZCBiaXRzLXBlci1waXhlbC48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHVwZGF0ZXJlY3QuaHRtbCIKKz5TRExfVXBkYXRlUmVjdDwvQQorPiZuYnNwOy0tJm5ic3A7TWFrZXMgc3VyZSB0aGUgZ2l2ZW4gYXJlYSBpcyB1cGRhdGVkIG9uIHRoZSBnaXZlbiBzY3JlZW4uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGx1cGRhdGVyZWN0cy5odG1sIgorPlNETF9VcGRhdGVSZWN0czwvQQorPiZuYnNwOy0tJm5ic3A7TWFrZXMgc3VyZSB0aGUgZ2l2ZW4gbGlzdCBvZiByZWN0YW5nbGVzIGlzIHVwZGF0ZWQgb24gdGhlIGdpdmVuIHNjcmVlbi48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGZsaXAuaHRtbCIKKz5TRExfRmxpcDwvQQorPiZuYnNwOy0tJm5ic3A7U3dhcHMgc2NyZWVuIGJ1ZmZlcnM8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNldGNvbG9ycy5odG1sIgorPlNETF9TZXRDb2xvcnM8L0EKKz4mbmJzcDstLSZuYnNwO1NldHMgYSBwb3J0aW9uIG9mIHRoZSBjb2xvcm1hcCBmb3IgdGhlIGdpdmVuIDgtYml0IHN1cmZhY2UuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZXRwYWxldHRlLmh0bWwiCis+U0RMX1NldFBhbGV0dGU8L0EKKz4mbmJzcDstLSZuYnNwO1NldHMgdGhlIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBvZiBhbiA4LWJpdCBzdXJmYWNlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2V0Z2FtbWEuaHRtbCIKKz5TRExfU2V0R2FtbWE8L0EKKz4mbmJzcDstLSZuYnNwO1NldHMgdGhlIGNvbG9yIGdhbW1hIGZ1bmN0aW9uIGZvciB0aGUgZGlzcGxheTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0Z2FtbWFyYW1wLmh0bWwiCis+U0RMX0dldEdhbW1hUmFtcDwvQQorPiZuYnNwOy0tJm5ic3A7R2V0cyB0aGUgY29sb3IgZ2FtbWEgbG9va3VwIHRhYmxlcyBmb3IgdGhlIGRpc3BsYXk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNldGdhbW1hcmFtcC5odG1sIgorPlNETF9TZXRHYW1tYVJhbXA8L0EKKz4mbmJzcDstLSZuYnNwO1NldHMgdGhlIGNvbG9yIGdhbW1hIGxvb2t1cCB0YWJsZXMgZm9yIHRoZSBkaXNwbGF5PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxtYXByZ2IuaHRtbCIKKz5TRExfTWFwUkdCPC9BCis+Jm5ic3A7LS0mbmJzcDtNYXAgYSBSR0IgY29sb3IgdmFsdWUgdG8gYSBwaXhlbCBmb3JtYXQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxtYXByZ2JhLmh0bWwiCis+U0RMX01hcFJHQkE8L0EKKz4mbmJzcDstLSZuYnNwO01hcCBhIFJHQkEgY29sb3IgdmFsdWUgdG8gYSBwaXhlbCBmb3JtYXQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXRyZ2IuaHRtbCIKKz5TRExfR2V0UkdCPC9BCis+Jm5ic3A7LS0mbmJzcDtHZXQgUkdCIHZhbHVlcyBmcm9tIGEgcGl4ZWwgaW4gdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXRyZ2JhLmh0bWwiCis+U0RMX0dldFJHQkE8L0EKKz4mbmJzcDstLSZuYnNwO0dldCBSR0JBIHZhbHVlcyBmcm9tIGEgcGl4ZWwgaW4gdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjcmVhdGVyZ2JzdXJmYWNlLmh0bWwiCis+U0RMX0NyZWF0ZVJHQlN1cmZhY2U8L0EKKz4mbmJzcDstLSZuYnNwO0NyZWF0ZSBhbiBlbXB0eSBTRExfU3VyZmFjZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY3JlYXRlcmdic3VyZmFjZWZyb20uaHRtbCIKKz5TRExfQ3JlYXRlUkdCU3VyZmFjZUZyb208L0EKKz4mbmJzcDstLSZuYnNwO0NyZWF0ZSBhbiBTRExfU3VyZmFjZSBmcm9tIHBpeGVsIGRhdGE8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGZyZWVzdXJmYWNlLmh0bWwiCis+U0RMX0ZyZWVTdXJmYWNlPC9BCis+Jm5ic3A7LS0mbmJzcDtGcmVlcyAoZGVsZXRlcykgYSBTRExfU3VyZmFjZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbG9ja3N1cmZhY2UuaHRtbCIKKz5TRExfTG9ja1N1cmZhY2U8L0EKKz4mbmJzcDstLSZuYnNwO0xvY2sgYSBzdXJmYWNlIGZvciBkaXJlY3RseSBhY2Nlc3MuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGx1bmxvY2tzdXJmYWNlLmh0bWwiCis+U0RMX1VubG9ja1N1cmZhY2U8L0EKKz4mbmJzcDstLSZuYnNwO1VubG9ja3MgYSBwcmV2aW91c2x5IGxvY2tlZCBzdXJmYWNlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbG9hZGJtcC5odG1sIgorPlNETF9Mb2FkQk1QPC9BCis+Jm5ic3A7LS0mbmJzcDtMb2FkIGEgV2luZG93cyBCTVAgZmlsZSBpbnRvIGFuIFNETF9TdXJmYWNlLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsc2F2ZWJtcC5odG1sIgorPlNETF9TYXZlQk1QPC9BCis+Jm5ic3A7LS0mbmJzcDtTYXZlIGFuIFNETF9TdXJmYWNlIGFzIGEgV2luZG93cyBCTVAgZmlsZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNldGNvbG9ya2V5Lmh0bWwiCis+U0RMX1NldENvbG9yS2V5PC9BCis+Jm5ic3A7LS0mbmJzcDtTZXRzIHRoZSBjb2xvciBrZXkgKHRyYW5zcGFyZW50IHBpeGVsKSBpbiBhIGJsaXR0YWJsZSBzdXJmYWNlIGFuZAorUkxFIGFjY2VsZXJhdGlvbi48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNldGFscGhhLmh0bWwiCis+U0RMX1NldEFscGhhPC9BCis+Jm5ic3A7LS0mbmJzcDtBZGp1c3QgdGhlIGFscGhhIHByb3BlcnRpZXMgb2YgYSBzdXJmYWNlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZXRjbGlwcmVjdC5odG1sIgorPlNETF9TZXRDbGlwUmVjdDwvQQorPiZuYnNwOy0tJm5ic3A7U2V0cyB0aGUgY2xpcHBpbmcgcmVjdGFuZ2xlIGZvciBhIHN1cmZhY2UuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnZXRjbGlwcmVjdC5odG1sIgorPlNETF9HZXRDbGlwUmVjdDwvQQorPiZuYnNwOy0tJm5ic3A7R2V0cyB0aGUgY2xpcHBpbmcgcmVjdGFuZ2xlIGZvciBhIHN1cmZhY2UuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjb252ZXJ0c3VyZmFjZS5odG1sIgorPlNETF9Db252ZXJ0U3VyZmFjZTwvQQorPiZuYnNwOy0tJm5ic3A7Q29udmVydHMgYSBzdXJmYWNlIHRvIHRoZSBzYW1lIGZvcm1hdCBhcyBhbm90aGVyIHN1cmZhY2UuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxibGl0c3VyZmFjZS5odG1sIgorPlNETF9CbGl0U3VyZmFjZTwvQQorPiZuYnNwOy0tJm5ic3A7VGhpcyBwZXJmb3JtcyBhIGZhc3QgYmxpdCBmcm9tIHRoZSBzb3VyY2Ugc3VyZmFjZSB0byB0aGUgZGVzdGluYXRpb24gc3VyZmFjZS48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGZpbGxyZWN0Lmh0bWwiCis+U0RMX0ZpbGxSZWN0PC9BCis+Jm5ic3A7LS0mbmJzcDtUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZmFzdCBmaWxsIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUgd2l0aCBzb21lIGNvbG9yPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxkaXNwbGF5Zm9ybWF0Lmh0bWwiCis+U0RMX0Rpc3BsYXlGb3JtYXQ8L0EKKz4mbmJzcDstLSZuYnNwO0NvbnZlcnQgYSBzdXJmYWNlIHRvIHRoZSBkaXNwbGF5IGZvcm1hdDwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZGlzcGxheWZvcm1hdGFscGhhLmh0bWwiCis+U0RMX0Rpc3BsYXlGb3JtYXRBbHBoYTwvQQorPiZuYnNwOy0tJm5ic3A7Q29udmVydCBhIHN1cmZhY2UgdG8gdGhlIGRpc3BsYXkgZm9ybWF0PC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGx3YXJwbW91c2UuaHRtbCIKKz5TRExfV2FycE1vdXNlPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3IuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjcmVhdGVjdXJzb3IuaHRtbCIKKz5TRExfQ3JlYXRlQ3Vyc29yPC9BCis+Jm5ic3A7LS0mbmJzcDtDcmVhdGVzIGEgbmV3IG1vdXNlIGN1cnNvci48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGZyZWVjdXJzb3IuaHRtbCIKKz5TRExfRnJlZUN1cnNvcjwvQQorPiZuYnNwOy0tJm5ic3A7RnJlZXMgYSBjdXJzb3IgY3JlYXRlZCB3aXRoIFNETF9DcmVhdGVDdXJzb3IuPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxzZXRjdXJzb3IuaHRtbCIKKz5TRExfU2V0Q3Vyc29yPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgbW91c2UgY3Vyc29yLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZ2V0Y3Vyc29yLmh0bWwiCis+U0RMX0dldEN1cnNvcjwvQQorPiZuYnNwOy0tJm5ic3A7R2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIG1vdXNlIGN1cnNvci48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHNob3djdXJzb3IuaHRtbCIKKz5TRExfU2hvd0N1cnNvcjwvQQorPiZuYnNwOy0tJm5ic3A7VG9nZ2xlIHdoZXRoZXIgb3Igbm90IHRoZSBjdXJzb3IgaXMgc2hvd24gb24gdGhlIHNjcmVlbi48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdsbG9hZGxpYnJhcnkuaHRtbCIKKz5TRExfR0xfTG9hZExpYnJhcnk8L0EKKz4mbmJzcDstLSZuYnNwO1NwZWNpZnkgYW4gT3BlbkdMIGxpYnJhcnk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdsZ2V0cHJvY2FkZHJlc3MuaHRtbCIKKz5TRExfR0xfR2V0UHJvY0FkZHJlc3M8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgYWRkcmVzcyBvZiBhIEdMIGZ1bmN0aW9uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnbGdldGF0dHJpYnV0ZS5odG1sIgorPlNETF9HTF9HZXRBdHRyaWJ1dGU8L0EKKz4mbmJzcDstLSZuYnNwO0dldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWFsIFNETC9PcGVuR0wgYXR0cmlidXRlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxnbHNldGF0dHJpYnV0ZS5odG1sIgorPlNETF9HTF9TZXRBdHRyaWJ1dGU8L0EKKz4mbmJzcDstLSZuYnNwO1NldCBhIHNwZWNpYWwgU0RML09wZW5HTCBhdHRyaWJ1dGU8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdsc3dhcGJ1ZmZlcnMuaHRtbCIKKz5TRExfR0xfU3dhcEJ1ZmZlcnM8L0EKKz4mbmJzcDstLSZuYnNwO1N3YXAgT3BlbkdMIGZyYW1lYnVmZmVycy9VcGRhdGUgRGlzcGxheTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsY3JlYXRleXV2b3ZlcmxheS5odG1sIgorPlNETF9DcmVhdGVZVVZPdmVybGF5PC9BCis+Jm5ic3A7LS0mbmJzcDtDcmVhdGUgYSBZVVYgdmlkZW8gb3ZlcmxheTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsbG9ja3l1dm92ZXJsYXkuaHRtbCIKKz5TRExfTG9ja1lVVk92ZXJsYXk8L0EKKz4mbmJzcDstLSZuYnNwO0xvY2sgYW4gb3ZlcmxheTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsdW5sb2NreXV2b3ZlcmxheS5odG1sIgorPlNETF9VbmxvY2tZVVZPdmVybGF5PC9BCis+Jm5ic3A7LS0mbmJzcDtVbmxvY2sgYW4gb3ZlcmxheTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2RsZGlzcGxheXl1dm92ZXJsYXkuaHRtbCIKKz5TRExfRGlzcGxheVlVVk92ZXJsYXk8L0EKKz4mbmJzcDstLSZuYnNwO0JsaXQgdGhlIG92ZXJsYXkgdG8gdGhlIGRpc3BsYXk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGZyZWV5dXZvdmVybGF5Lmh0bWwiCis+U0RMX0ZyZWVZVVZPdmVybGF5PC9BCis+Jm5ic3A7LS0mbmJzcDtGcmVlIGEgWVVWIHZpZGVvIG92ZXJsYXk8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbGdsYXR0ci5odG1sIgorPlNETF9HTGF0dHI8L0EKKz4mbmJzcDstLSZuYnNwO1NETCBHTCBBdHRyaWJ1dGVzPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxyZWN0Lmh0bWwiCis+U0RMX1JlY3Q8L0EKKz4mbmJzcDstLSZuYnNwO0RlZmluZXMgYSByZWN0YW5ndWxhciBhcmVhPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxjb2xvci5odG1sIgorPlNETF9Db2xvcjwvQQorPiZuYnNwOy0tJm5ic3A7Rm9ybWF0IGluZGVwZW5kZW50IGNvbG9yIGRlc2NyaXB0aW9uPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGxwYWxldHRlLmh0bWwiCis+U0RMX1BhbGV0dGU8L0EKKz4mbmJzcDstLSZuYnNwO0NvbG9yIHBhbGV0dGUgZm9yIDgtYml0IHBpeGVsIGZvcm1hdHM8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHBpeGVsZm9ybWF0Lmh0bWwiCis+U0RMX1BpeGVsRm9ybWF0PC9BCis+Jm5ic3A7LS0mbmJzcDtTdG9yZXMgc3VyZmFjZSBmb3JtYXQgaW5mb3JtYXRpb248L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHN1cmZhY2UuaHRtbCIKKz5TRExfU3VyZmFjZTwvQQorPiZuYnNwOy0tJm5ic3A7R3JhcGhpY2FsIFN1cmZhY2UgU3RydWN0dXJlPC9EVAorPjxEVAorPjxBCitIUkVGPSJzZGx2aWRlb2luZm8uaHRtbCIKKz5TRExfVmlkZW9JbmZvPC9BCis+Jm5ic3A7LS0mbmJzcDtWaWRlbyBUYXJnZXQgaW5mb3JtYXRpb248L0RUCis+PERUCis+PEEKK0hSRUY9InNkbG92ZXJsYXkuaHRtbCIKKz5TRExfT3ZlcmxheTwvQQorPiZuYnNwOy0tJm5ic3A7WVVWIHZpZGVvIG92ZXJsYXk8L0RUCis+PC9ETAorPjwvRElWCis+PFAKKz5TREwgcHJlc2VudHMgYSB2ZXJ5IHNpbXBsZSBpbnRlcmZhY2UgdG8gdGhlIGRpc3BsYXkgZnJhbWVidWZmZXIuICBUaGUKK2ZyYW1lYnVmZmVyIGlzIHJlcHJlc2VudGVkIGFzIGFuIG9mZnNjcmVlbiBzdXJmYWNlIHRvIHdoaWNoIHlvdSBjYW4gd3JpdGUKK2RpcmVjdGx5LiAgSWYgeW91IHdhbnQgdGhlIHNjcmVlbiB0byBzaG93IHdoYXQgeW91IGhhdmUgd3JpdHRlbiwgY2FsbCB0aGUgPEEKK0hSRUY9InNkbHVwZGF0ZXJlY3RzLmh0bWwiCis+dXBkYXRlPC9BCis+IGZ1bmN0aW9uIHdoaWNoIHdpbGwKK2d1YXJhbnRlZSB0aGF0IHRoZSBkZXNpcmVkIHBvcnRpb24gb2YgdGhlIHNjcmVlbiBpcyB1cGRhdGVkLjwvUAorPjxQCis+QmVmb3JlIHlvdSBjYWxsIGFueSBvZiB0aGUgU0RMIHZpZGVvIGZ1bmN0aW9ucywgeW91IG11c3QgZmlyc3QgY2FsbAorPFNQQU4KK0NMQVNTPSJUT0tFTiIKKz5TRExfSW5pdChTRExfSU5JVF9WSURFTyk8L1NQQU4KKz4sIHdoaWNoIGluaXRpYWxpemVzIHRoZSB2aWRlbworYW5kIGV2ZW50cyBpbiB0aGUgU0RMIGxpYnJhcnkuICBDaGVjayB0aGUgcmV0dXJuIGNvZGUsIHdoaWNoIHNob3VsZCBiZQorPFNQQU4KK0NMQVNTPSJSRVRVUk5WQUxVRSIKKz4wPC9TUEFOCis+LCB0byBzZWUgaWYgdGhlcmUgd2VyZSBhbnkgZXJyb3JzIGluIHN0YXJ0aW5nIHVwLjwvUAorPjxQCis+SWYgeW91IHVzZSBib3RoIHNvdW5kIGFuZCB2aWRlbyBpbiB5b3VyIGFwcGxpY2F0aW9uLCB5b3UgbmVlZCB0byBjYWxsCis8U1BBTgorQ0xBU1M9IlRPS0VOIgorPlNETF9Jbml0KFNETF9JTklUX0FVRElPIHwgU0RMX0lOSVRfVklERU8pPC9TUEFOCis+IGJlZm9yZSBvcGVuaW5nIHRoZQorc291bmQgZGV2aWNlLCBvdGhlcndpc2UgdW5kZXIgV2luMzIgRGlyZWN0WCwgeW91IHdvbid0IGJlIGFibGUgdG8gc2V0CitmdWxsLXNjcmVlbiBkaXNwbGF5IG1vZGVzLjwvUAorPjxQCis+QWZ0ZXIgeW91IGhhdmUgaW5pdGlhbGl6ZWQgdGhlIGxpYnJhcnksIHlvdSBjYW4gc3RhcnQgdXAgdGhlIHZpZGVvIGRpc3BsYXkgaW4gYQorbnVtYmVyIG9mIHdheXMuICBUaGUgZWFzaWVzdCB3YXkgaXMgdG8gcGljayBhIGNvbW1vbiBzY3JlZW4gcmVzb2x1dGlvbiBhbmQKK2RlcHRoIGFuZCBqdXN0IGluaXRpYWxpemUgdGhlIHZpZGVvLCBjaGVja2luZyBmb3IgZXJyb3JzLiAgWW91IHdpbGwgcHJvYmFibHkKK2dldCB3aGF0IHlvdSB3YW50LCBidXQgU0RMIG1heSBiZSBlbXVsYXRpbmcgeW91ciByZXF1ZXN0ZWQgbW9kZSBhbmQgY29udmVydGluZwordGhlIGRpc3BsYXkgb24gdXBkYXRlLiAgVGhlIGJlc3Qgd2F5IGlzIHRvCis8QQorSFJFRj0ic2RsZ2V0dmlkZW9pbmZvLmh0bWwiCis+cXVlcnk8L0EKKz4sIGZvciB0aGUgYmVzdAordmlkZW8gbW9kZSBjbG9zZXN0IHRvIHRoZSBkZXNpcmVkIG9uZSwgYW5kIHRoZW4KKzxBCitIUkVGPSJzZGxkaXNwbGF5Zm9ybWF0Lmh0bWwiCis+Y29udmVydDwvQQorPgoreW91ciBpbWFnZXMgdG8gdGhhdCBwaXhlbCBmb3JtYXQuPC9QCis+PFAKKz5TREwgY3VycmVudGx5IHN1cHBvcnRzIGFueSBiaXQgZGVwdGggJmd0Oz0gOCBiaXRzIHBlciBwaXhlbC4gIDggYnBwIGZvcm1hdHMgYXJlCitjb25zaWRlcmVkIDgtYml0IHBhbGV0dGl6ZWQgbW9kZXMsIHdoaWxlIDEyLCAxNSwgMTYsIDI0LCBhbmQgMzIgYml0cyBwZXIgcGl4ZWwKK2FyZSBjb25zaWRlcmVkICJwYWNrZWQgcGl4ZWwiIG1vZGVzLCBtZWFuaW5nIGVhY2ggcGl4ZWwgY29udGFpbnMgdGhlIFJHQiBjb2xvcgorY29tcG9uZW50cyBwYWNrZWQgaW4gdGhlIGJpdHMgb2YgdGhlIHBpeGVsLjwvUAorPjxQCis+QWZ0ZXIgeW91IGhhdmUgaW5pdGlhbGl6ZWQgeW91ciB2aWRlbyBtb2RlLCB5b3UgY2FuIHRha2UgdGhlIHN1cmZhY2UgdGhhdCB3YXMKK3JldHVybmVkLCBhbmQgd3JpdGUgdG8gaXQgbGlrZSBhbnkgb3RoZXIgZnJhbWVidWZmZXIsIGNhbGxpbmcgdGhlIHVwZGF0ZQorcm91dGluZSBhcyB5b3UgZ28uPC9QCis+PFAKKz5XaGVuIHlvdSBoYXZlIGZpbmlzaGVkIHlvdXIgdmlkZW8gYWNjZXNzIGFuZCBhcmUgcmVhZHkgdG8gcXVpdCB5b3VyCithcHBsaWNhdGlvbiwgeW91IHNob3VsZCBjYWxsICI8U1BBTgorQ0xBU1M9IlRPS0VOIgorPlNETF9RdWl0KCk8L1NQQU4KKz4iIHRvIHNodXRkb3duIHRoZQordmlkZW8gYW5kIGV2ZW50cy48L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbGVudnZhcnMuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGxnZXR2aWRlb3N1cmZhY2UuaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9lbnZ2YXJzPC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0icmVmZXJlbmNlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX0dldFZpZGVvU3VyZmFjZTwvVEQKKz48L1RSCis+PC9UQUJMRQorPjwvRElWCis+PC9CT0RZCis+PC9IVE1MCis+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC93bS5odG1sIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaHRtbC93bS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1M2EzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9odG1sL3dtLmh0bWwKQEAgLTAsMCArMSwxODggQEAKKzxIVE1MCis+PEhFQUQKKz48VElUTEUKKz5XaW5kb3cgTWFuYWdlbWVudDwvVElUTEUKKz48TUVUQQorTkFNRT0iR0VORVJBVE9SIgorQ09OVEVOVD0iTW9kdWxhciBEb2NCb29rIEhUTUwgU3R5bGVzaGVldCBWZXJzaW9uIDEuNzZiKworIj48TElOSworUkVMPSJIT01FIgorVElUTEU9IlNETCBMaWJyYXJ5IERvY3VtZW50YXRpb24iCitIUkVGPSJpbmRleC5odG1sIj48TElOSworUkVMPSJVUCIKK1RJVExFPSJTREwgUmVmZXJlbmNlIgorSFJFRj0icmVmZXJlbmNlLmh0bWwiPjxMSU5LCitSRUw9IlBSRVZJT1VTIgorVElUTEU9IlNETF9PdmVybGF5IgorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIj48TElOSworUkVMPSJORVhUIgorVElUTEU9IlNETF9XTV9TZXRDYXB0aW9uIgorSFJFRj0ic2Rsd21zZXRjYXB0aW9uLmh0bWwiPjxNRVRBCitOQU1FPSJLRVlXT1JEIgorQ09OVEVOVD0id20iPjxNRVRBCitOQU1FPSJLRVlXT1JEIgorQ09OVEVOVD0iZnVuY3Rpb24iPjwvSEVBRAorPjxCT0RZCitDTEFTUz0iQ0hBUFRFUiIKK0JHQ09MT1I9IiNGRkY4REMiCitURVhUPSIjMDAwMDAwIgorTElOSz0iIzAwMDBlZSIKK1ZMSU5LPSIjNTUxYThiIgorQUxJTks9IiNmZjAwMDAiCis+PERJVgorQ0xBU1M9Ik5BVkhFQURFUiIKKz48VEFCTEUKK1NVTU1BUlk9IkhlYWRlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxUSAorQ09MU1BBTj0iMyIKK0FMSUdOPSJjZW50ZXIiCis+U0RMIExpYnJhcnkgRG9jdW1lbnRhdGlvbjwvVEgKKz48L1RSCis+PFRSCis+PFRECitXSURUSD0iMTAlIgorQUxJR049ImxlZnQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsb3ZlcmxheS5odG1sIgorQUNDRVNTS0VZPSJQIgorPlByZXY8L0EKKz48L1RECis+PFRECitXSURUSD0iODAlIgorQUxJR049ImNlbnRlciIKK1ZBTElHTj0iYm90dG9tIgorPjwvVEQKKz48VEQKK1dJRFRIPSIxMCUiCitBTElHTj0icmlnaHQiCitWQUxJR049ImJvdHRvbSIKKz48QQorSFJFRj0ic2Rsd21zZXRjYXB0aW9uLmh0bWwiCitBQ0NFU1NLRVk9Ik4iCis+TmV4dDwvQQorPjwvVEQKKz48L1RSCis+PC9UQUJMRQorPjxIUgorQUxJR049IkxFRlQiCitXSURUSD0iMTAwJSI+PC9ESVYKKz48RElWCitDTEFTUz0iQ0hBUFRFUiIKKz48SDEKKz48QQorTkFNRT0iV00iCis+PC9BCis+Q2hhcHRlciA3LiBXaW5kb3cgTWFuYWdlbWVudDwvSDEKKz48RElWCitDTEFTUz0iVE9DIgorPjxETAorPjxEVAorPjxCCis+VGFibGUgb2YgQ29udGVudHM8L0IKKz48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHdtc2V0Y2FwdGlvbi5odG1sIgorPlNETF9XTV9TZXRDYXB0aW9uPC9BCis+Jm5ic3A7LS0mbmJzcDtTZXRzIHRoZSB3aW5kb3cgdGlsZSBhbmQgaWNvbiBuYW1lLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd21nZXRjYXB0aW9uLmh0bWwiCis+U0RMX1dNX0dldENhcHRpb248L0EKKz4mbmJzcDstLSZuYnNwO0dldHMgdGhlIHdpbmRvdyB0aXRsZSBhbmQgaWNvbiBuYW1lLjwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd21zZXRpY29uLmh0bWwiCis+U0RMX1dNX1NldEljb248L0EKKz4mbmJzcDstLSZuYnNwO1NldHMgdGhlIGljb24gZm9yIHRoZSBkaXNwbGF5IHdpbmRvdy48L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHdtaWNvbmlmeXdpbmRvdy5odG1sIgorPlNETF9XTV9JY29uaWZ5V2luZG93PC9BCis+Jm5ic3A7LS0mbmJzcDtJY29uaWZ5L01pbmltaXNlIHRoZSB3aW5kb3c8L0RUCis+PERUCis+PEEKK0hSRUY9InNkbHdtdG9nZ2xlZnVsbHNjcmVlbi5odG1sIgorPlNETF9XTV9Ub2dnbGVGdWxsU2NyZWVuPC9BCis+Jm5ic3A7LS0mbmJzcDtUb2dnbGVzIGZ1bGxzY3JlZW4gbW9kZTwvRFQKKz48RFQKKz48QQorSFJFRj0ic2Rsd21ncmFiaW5wdXQuaHRtbCIKKz5TRExfV01fR3JhYklucHV0PC9BCis+Jm5ic3A7LS0mbmJzcDtHcmFicyBtb3VzZSBhbmQga2V5Ym9hcmQgaW5wdXQuPC9EVAorPjwvREwKKz48L0RJVgorPjxQCis+U0RMIHByb3ZpZGVzIGEgc21hbGwgc2V0IG9mIHdpbmRvdyBtYW5hZ2VtZW50IGZ1bmN0aW9ucyB3aGljaCBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gY2hhbmdlIHRoZWlyIHRpdGxlIGFuZCB0b2dnbGUgZnJvbSB3aW5kb3dlZCBtb2RlIHRvIGZ1bGxzY3JlZW4gKGlmIGF2YWlsYWJsZSk8L1AKKz48L0RJVgorPjxESVYKK0NMQVNTPSJOQVZGT09URVIiCis+PEhSCitBTElHTj0iTEVGVCIKK1dJRFRIPSIxMDAlIj48VEFCTEUKK1NVTU1BUlk9IkZvb3RlciBuYXZpZ2F0aW9uIHRhYmxlIgorV0lEVEg9IjEwMCUiCitCT1JERVI9IjAiCitDRUxMUEFERElORz0iMCIKK0NFTExTUEFDSU5HPSIwIgorPjxUUgorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJsZWZ0IgorVkFMSUdOPSJ0b3AiCis+PEEKK0hSRUY9InNkbG92ZXJsYXkuaHRtbCIKK0FDQ0VTU0tFWT0iUCIKKz5QcmV2PC9BCis+PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0iaW5kZXguaHRtbCIKK0FDQ0VTU0tFWT0iSCIKKz5Ib21lPC9BCis+PC9URAorPjxURAorV0lEVEg9IjMzJSIKK0FMSUdOPSJyaWdodCIKK1ZBTElHTj0idG9wIgorPjxBCitIUkVGPSJzZGx3bXNldGNhcHRpb24uaHRtbCIKK0FDQ0VTU0tFWT0iTiIKKz5OZXh0PC9BCis+PC9URAorPjwvVFIKKz48VFIKKz48VEQKK1dJRFRIPSIzMyUiCitBTElHTj0ibGVmdCIKK1ZBTElHTj0idG9wIgorPlNETF9PdmVybGF5PC9URAorPjxURAorV0lEVEg9IjM0JSIKK0FMSUdOPSJjZW50ZXIiCitWQUxJR049InRvcCIKKz48QQorSFJFRj0icmVmZXJlbmNlLmh0bWwiCitBQ0NFU1NLRVk9IlUiCis+VXA8L0EKKz48L1RECis+PFRECitXSURUSD0iMzMlIgorQUxJR049InJpZ2h0IgorVkFMSUdOPSJ0b3AiCis+U0RMX1dNX1NldENhcHRpb248L1RECis+PC9UUgorPjwvVEFCTEUKKz48L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2ltYWdlcy9yYWluYm93LmdpZiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2ltYWdlcy9yYWluYm93LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2ViMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvaW1hZ2VzL3JhaW5ib3cuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL2luZGV4Lmh0bWwgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTcyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9pbmRleC5odG1sCkBAIC0wLDAgKzEsNTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vTm9ybWFuIFdhbHNoLy9EVEQgRG9jQm9vayBIVE1MIDEuMC8vRU4iPgorPEhUTUw+Cis8SEVBRD48VElUTEU+U2ltcGxlIERpcmVjdE1lZGlhIExheWVyIEludHJvZHVjdGlvbjwvVElUTEU+PC9IRUFEPgorPEJPRFkgQkdDT0xPUj0iI0ZGRjhEQyIgVEVYVD0iIzAwMDAwMCIgTElOSz0iIzAwMDBlZSIgVkxJTks9IiM1NTFhOGIiIEFMSU5LPSIjZmYwMDAwIj4KKzxESVYgQ0xBU1M9Ik5BVkhFQURFUiI+Cis8SFIgQUxJR049IkxFRlQiIFdJRFRIPSIxMDAlIj4KKzwvRElWPgorPERJViBDTEFTUz0iUFJFRkFDRSI+Cis8SDI+PEEgTkFNRT0iQUVOOCI+U2ltcGxlIERpcmVjdE1lZGlhIExheWVyIEludHJvZHVjdGlvbjwvQT48L0gyPgorPFA+CitUaGlzIGxpYnJhcnkgaXMgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IHRvIHdyaXRlIGdhbWVzIHRoYXQgcnVuIG9uIG1hbnkKK2RpZmZlcmVudCBwbGF0Zm9ybXMgdXNpbmcgdGhlIHZhcmlvdXMgbmF0aXZlIGhpZ2gtcGVyZm9ybWFuY2UgbWVkaWEgaW50ZXJmYWNlcywKKyhmb3IgdmlkZW8sIGF1ZGlvLCBldGMpIGFuZCBwcmVzZW50aW5nIGEgc2luZ2xlIHNvdXJjZS1jb2RlIGxldmVsIEFQSSB0bworeW91ciBhcHBsaWNhdGlvbi4gIFRoaXMgaXMgYSBmYWlybHkgbG93IGxldmVsIEFQSSwgYnV0IHVzaW5nIHRoaXMsIGNvbXBsZXRlbHkKK3BvcnRhYmxlIGFwcGxpY2F0aW9ucyBjYW4gYmUgd3JpdHRlbiB3aXRoIGEgZ3JlYXQgZGVhbCBvZiBmbGV4aWJpbGl0eS4KKzwvUD48UD4KK0FuIGludHJvZHVjdGlvbiB0byBTREwgY2FuIGJlIGZvdW5kIG9ubGluZSBhdDoKKzxBIEhSRUY9Imh0dHA6Ly93d3cubGlic2RsLm9yZy9pbnRyby5waHAiIFRBUkdFVD0iX3RvcCI+CisgICAgICAgICBodHRwOi8vd3d3LmxpYnNkbC5vcmcvaW50cm8ucGhwPC9BPgorPC9QPjxQPgorVHV0b3JpYWxzIG9uIGEgdmFyaWV0eSBvZiB0b3BpY3MgY2FuIGJlIGZvdW5kIG9ubGluZSBhdDoKKzxBIEhSRUY9Imh0dHA6Ly93d3cubGlic2RsLm9yZy90dXRvcmlhbHMucGhwIiBUQVJHRVQ9Il90b3AiPgorICAgICAgICAgaHR0cDovL3d3dy5saWJzZGwub3JnL3R1dG9yaWFscy5waHA8L0E+Cis8L1A+PFA+CitEb2N1bWVudGF0aW9uIGluIFdpa2kgZm9ybSBjYW4gYmUgZm91bmQgb25saW5lIGF0OgorPEEgSFJFRj0iaHR0cDovL3d3dy5saWJzZGwub3JnL2NnaS9kb2N3aWtpLmNnaS8iIFRBUkdFVD0iX3RvcCI+CisgICAgICAgICBodHRwOi8vd3d3LmxpYnNkbC5vcmcvY2dpL2RvY3dpa2kuY2dpLzwvQT4KKzwvUD48UD4KK0Vuam95IQorPC9QPjxQPgorJm5ic3A7Jm5ic3A7Jm5ic3A7IFNhbSBMYW50aW5nYQorPFRUIENMQVNTPSJFTUFJTCI+JiM2MDs8QSBIUkVGPSJtYWlsdG86c2xvdWtlbkBsaWJzZGwub3JnIj48QSBIUkVGPSJtYWlsdG86c2xvdWtlbkBsaWJzZGwub3JnIiBUQVJHRVQ9Il90b3AiID5zbG91a2VuQGxpYnNkbC5vcmc8L0E+PC9BPiYjNjI7PC9UVD4KKzwvUD4gPFA+Cis8YnI+PGJyPjxIUj4KKzxIMT5UYWJsZSBvZiBDb250ZW50czwvSDE+Cis8VUw+Cis8TEk+PEEgSFJFRj0iaHRtbC9pbmRleC5odG1sIj5GdWxsIFRhYmxlIG9mIENvbnRlbnRzPC9BPjwvTEk+Cis8TEk+PEEgSFJFRj0iaHRtbC9ndWlkZS5odG1sIj5UaGUgU0RMIEd1aWRlPC9BPjwvTEk+Cis8TEk+PEEgSFJFRj0iaHRtbC9yZWZlcmVuY2UuaHRtbCI+VGhlIFNETCBSZWZlcmVuY2U8L0E+PC9MST4KKzxVTD4KKzxMST48QSBIUkVGPSJodG1sL2dlbmVyYWwuaHRtbCI+SW5pdGlhbGl6YXRpb248L0E+PC9MST4KKzxMST48QSBIUkVGPSJodG1sL3ZpZGVvLmh0bWwiPlZpZGVvPC9BPjwvTEk+Cis8TEk+PEEgSFJFRj0iaHRtbC93bS5odG1sIj5XaW5kb3cgTWFuYWdlcjwvQT48L0xJPgorPExJPjxBIEhSRUY9Imh0bWwvZXZlbnQuaHRtbCI+RXZlbnQgSGFuZGxpbmc8L0E+PC9MST4KKzxMST48QSBIUkVGPSJodG1sL2pveXN0aWNrLmh0bWwiPkpveXN0aWNrPC9BPjwvTEk+Cis8TEk+PEEgSFJFRj0iaHRtbC9hdWRpby5odG1sIj5BdWRpbzwvQT48L0xJPgorPExJPjxBIEhSRUY9Imh0bWwvY2Ryb20uaHRtbCI+Q0RST008L0E+PC9MST4KKzxMST48QSBIUkVGPSJodG1sL3RocmVhZC5odG1sIj5UaHJlYWRzPC9BPjwvTEk+Cis8TEk+PEEgSFJFRj0iaHRtbC90aW1lLmh0bWwiPlRpbWVyczwvQT48L0xJPgorPC9VTD4KKzwvVUw+Cis8L0RJVgorPjwvQk9EWQorPjwvSFRNTAorPgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExLZXkuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMS2V5LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3NGRmYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMS2V5LjMKQEAgLTAsMCArMSwxNjEgQEAKKy5USCAiU0RMS2V5IiAiMyIgIldlZCAxMSBPY3QgMjAwMCwgMjI6MjgiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIKKy5TSCAiTkFNRSIKK1NETEtleSBcLSBTREwgS2V5c3ltIERlZmluaXRpb25zCisuU0ggIlNETCBLZXlzeW0gZGVmaW5pdGlvbnMiCisuUFAKK1xmQlNETEtleSAgICAgICAgICAgICAgIEFTQ0lJIHZhbHVlICAgIENvbW1vbiBOYW1lXGZSCisubmYKK1xmKENXU0RMS19CQUNLU1BBQ0UgICAgICAgJ1xcYicgICAgICAgICAgIGJhY2tzcGFjZQorU0RMS19UQUIgICAgICAgICAgICAgJ1xcdCcgICAgICAgICAgIHRhYgorU0RMS19DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXIKK1NETEtfUkVUVVJOICAgICAgICAgICdcXHInICAgICAgICAgICByZXR1cm4KK1NETEtfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdXNlCitTRExLX0VTQ0FQRSAgICAgICAgICAnXlsnICAgICAgICAgICBlc2NhcGUKK1NETEtfU1BBQ0UgICAgICAgICAgICcgJyAgICAgICAgICAgIHNwYWNlCitTRExLX0VYQ0xBSU0gICAgICAgICAnIScgICAgICAgICAgICBleGNsYWltCitTRExLX1FVT1RFREJMICAgICAgICAnIicgICAgICAgICAgICBxdW90ZWRibAorU0RMS19IQVNIICAgICAgICAgICAgJyMnICAgICAgICAgICAgaGFzaAorU0RMS19ET0xMQVIgICAgICAgICAgJyQnICAgICAgICAgICAgZG9sbGFyCitTRExLX0FNUEVSU0FORCAgICAgICAnJicgICAgICAgICAgICBhbXBlcnNhbmQKK1NETEtfUVVPVEUgICAgICAgICAgICcnJyAgICAgICAgICAgIHF1b3RlCitTRExLX0xFRlRQQVJFTiAgICAgICAnKCcgICAgICAgICAgICBsZWZ0IHBhcmVudGhlc2lzCitTRExLX1JJR0hUUEFSRU4gICAgICAnKScgICAgICAgICAgICByaWdodCBwYXJlbnRoZXNpcworU0RMS19BU1RFUklTSyAgICAgICAgJyonICAgICAgICAgICAgYXN0ZXJpc2sKK1NETEtfUExVUyAgICAgICAgICAgICcrJyAgICAgICAgICAgIHBsdXMgc2lnbgorU0RMS19DT01NQSAgICAgICAgICAgJywnICAgICAgICAgICAgY29tbWEKK1NETEtfTUlOVVMgICAgICAgICAgICctJyAgICAgICAgICAgIG1pbnVzIHNpZ24KK1NETEtfUEVSSU9EICAgICAgICAgICcuJyAgICAgICAgICAgIHBlcmlvZAorU0RMS19TTEFTSCAgICAgICAgICAgJy8nICAgICAgICAgICAgZm9yd2FyZCBzbGFzaAorU0RMS18wICAgICAgICAgICAgICAgJzAnICAgICAgICAgICAgMAorU0RMS18xICAgICAgICAgICAgICAgJzEnICAgICAgICAgICAgMQorU0RMS18yICAgICAgICAgICAgICAgJzInICAgICAgICAgICAgMgorU0RMS18zICAgICAgICAgICAgICAgJzMnICAgICAgICAgICAgMworU0RMS180ICAgICAgICAgICAgICAgJzQnICAgICAgICAgICAgNAorU0RMS181ICAgICAgICAgICAgICAgJzUnICAgICAgICAgICAgNQorU0RMS182ICAgICAgICAgICAgICAgJzYnICAgICAgICAgICAgNgorU0RMS183ICAgICAgICAgICAgICAgJzcnICAgICAgICAgICAgNworU0RMS184ICAgICAgICAgICAgICAgJzgnICAgICAgICAgICAgOAorU0RMS185ICAgICAgICAgICAgICAgJzknICAgICAgICAgICAgOQorU0RMS19DT0xPTiAgICAgICAgICAgJzonICAgICAgICAgICAgY29sb24KK1NETEtfU0VNSUNPTE9OICAgICAgICc7JyAgICAgICAgICAgIHNlbWljb2xvbgorU0RMS19MRVNTICAgICAgICAgICAgJzwnICAgICAgICAgICAgbGVzcy10aGFuIHNpZ24KK1NETEtfRVFVQUxTICAgICAgICAgICc9JyAgICAgICAgICAgIGVxdWFscyBzaWduCitTRExLX0dSRUFURVIgICAgICAgICAnPicgICAgICAgICAgICBncmVhdGVyLXRoYW4gc2lnbgorU0RMS19RVUVTVElPTiAgICAgICAgJz8nICAgICAgICAgICAgcXVlc3Rpb24gbWFyaworU0RMS19BVCAgICAgICAgICAgICAgJ0AnICAgICAgICAgICAgYXQKK1NETEtfTEVGVEJSQUNLRVQgICAgICdbJyAgICAgICAgICAgIGxlZnQgYnJhY2tldAorU0RMS19CQUNLU0xBU0ggICAgICAgJ1xcJyAgICAgICAgICAgIGJhY2tzbGFzaAorU0RMS19SSUdIVEJSQUNLRVQgICAgJ10nICAgICAgICAgICAgcmlnaHQgYnJhY2tldAorU0RMS19DQVJFVCAgICAgICAgICAgJ14nICAgICAgICAgICAgY2FyZXQKK1NETEtfVU5ERVJTQ09SRSAgICAgICdfJyAgICAgICAgICAgIHVuZGVyc2NvcmUKK1NETEtfQkFDS1FVT1RFICAgICAgICdgJyAgICAgICAgICAgIGdyYXZlCitTRExLX2EgICAgICAgICAgICAgICAnYScgICAgICAgICAgICBhCitTRExLX2IgICAgICAgICAgICAgICAnYicgICAgICAgICAgICBiCitTRExLX2MgICAgICAgICAgICAgICAnYycgICAgICAgICAgICBjCitTRExLX2QgICAgICAgICAgICAgICAnZCcgICAgICAgICAgICBkCitTRExLX2UgICAgICAgICAgICAgICAnZScgICAgICAgICAgICBlCitTRExLX2YgICAgICAgICAgICAgICAnZicgICAgICAgICAgICBmCitTRExLX2cgICAgICAgICAgICAgICAnZycgICAgICAgICAgICBnCitTRExLX2ggICAgICAgICAgICAgICAnaCcgICAgICAgICAgICBoCitTRExLX2kgICAgICAgICAgICAgICAnaScgICAgICAgICAgICBpCitTRExLX2ogICAgICAgICAgICAgICAnaicgICAgICAgICAgICBqCitTRExLX2sgICAgICAgICAgICAgICAnaycgICAgICAgICAgICBrCitTRExLX2wgICAgICAgICAgICAgICAnbCcgICAgICAgICAgICBsCitTRExLX20gICAgICAgICAgICAgICAnbScgICAgICAgICAgICBtCitTRExLX24gICAgICAgICAgICAgICAnbicgICAgICAgICAgICBuCitTRExLX28gICAgICAgICAgICAgICAnbycgICAgICAgICAgICBvCitTRExLX3AgICAgICAgICAgICAgICAncCcgICAgICAgICAgICBwCitTRExLX3EgICAgICAgICAgICAgICAncScgICAgICAgICAgICBxCitTRExLX3IgICAgICAgICAgICAgICAncicgICAgICAgICAgICByCitTRExLX3MgICAgICAgICAgICAgICAncycgICAgICAgICAgICBzCitTRExLX3QgICAgICAgICAgICAgICAndCcgICAgICAgICAgICB0CitTRExLX3UgICAgICAgICAgICAgICAndScgICAgICAgICAgICB1CitTRExLX3YgICAgICAgICAgICAgICAndicgICAgICAgICAgICB2CitTRExLX3cgICAgICAgICAgICAgICAndycgICAgICAgICAgICB3CitTRExLX3ggICAgICAgICAgICAgICAneCcgICAgICAgICAgICB4CitTRExLX3kgICAgICAgICAgICAgICAneScgICAgICAgICAgICB5CitTRExLX3ogICAgICAgICAgICAgICAneicgICAgICAgICAgICB6CitTRExLX0RFTEVURSAgICAgICAgICAnXj8nICAgICAgICAgICBkZWxldGUKK1NETEtfS1AwICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXBhZCAwCitTRExLX0tQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlwYWQgMQorU0RMS19LUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cGFkIDIKK1NETEtfS1AzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXBhZCAzCitTRExLX0tQNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlwYWQgNAorU0RMS19LUDUgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cGFkIDUKK1NETEtfS1A2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXBhZCA2CitTRExLX0tQNyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlwYWQgNworU0RMS19LUDggICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cGFkIDgKK1NETEtfS1A5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXBhZCA5CitTRExLX0tQX1BFUklPRCAgICAgICAnLicgICAgICAgICAgICBrZXlwYWQgcGVyaW9kCitTRExLX0tQX0RJVklERSAgICAgICAnLycgICAgICAgICAgICBrZXlwYWQgZGl2aWRlCitTRExLX0tQX01VTFRJUExZICAgICAnKicgICAgICAgICAgICBrZXlwYWQgbXVsdGlwbHkKK1NETEtfS1BfTUlOVVMgICAgICAgICctJyAgICAgICAgICAgIGtleXBhZCBtaW51cworU0RMS19LUF9QTFVTICAgICAgICAgJysnICAgICAgICAgICAga2V5cGFkIHBsdXMKK1NETEtfS1BfRU5URVIgICAgICAgICdcXHInICAgICAgICAgICBrZXlwYWQgZW50ZXIKK1NETEtfS1BfRVFVQUxTICAgICAgICc9JyAgICAgICAgICAgIGtleXBhZCBlcXVhbHMKK1NETEtfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwIGFycm93CitTRExLX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duIGFycm93CitTRExLX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCBhcnJvdworU0RMS19MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhcnJvdworU0RMS19JTlNFUlQgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0CitTRExLX0hPTUUgICAgICAgICAgICAgICAgICAgICAgICAgICBob21lCitTRExLX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKK1NETEtfUEFHRVVQICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgdXAKK1NETEtfUEFHRURPV04gICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZG93bgorU0RMS19GMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjEKK1NETEtfRjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYyCitTRExLX0YzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMworU0RMS19GNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjQKK1NETEtfRjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEY1CitTRExLX0Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGNgorU0RMS19GNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjcKK1NETEtfRjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIEY4CitTRExLX0Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGOQorU0RMS19GMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjEwCitTRExLX0YxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMTEKK1NETEtfRjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYxMgorU0RMS19GMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjEzCitTRExLX0YxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMTQKK1NETEtfRjE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYxNQorU0RMS19OVU1MT0NLICAgICAgICAgICAgICAgICAgICAgICAgbnVtbG9jaworU0RMS19DQVBTTE9DSyAgICAgICAgICAgICAgICAgICAgICAgY2Fwc2xvY2sKK1NETEtfU0NST0xMT0NLICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbG9jaworU0RMS19SU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgc2hpZnQKK1NETEtfTFNISUZUICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgc2hpZnQKK1NETEtfUkNUUkwgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IGN0cmwKK1NETEtfTENUUkwgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgY3RybAorU0RMS19SQUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgYWx0CitTRExLX0xBTFQgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFsdAorU0RMS19STUVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgbWV0YQorU0RMS19MTUVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBtZXRhCitTRExLX0xTVVBFUiAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IHdpbmRvd3Mga2V5CitTRExLX1JTVVBFUiAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCB3aW5kb3dzIGtleQorU0RMS19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBzaGlmdAorU0RMS19IRUxQICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscAorU0RMS19QUklOVCAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQtc2NyZWVuCitTRExLX1NZU1JFUSAgICAgICAgICAgICAgICAgICAgICAgICBTeXNScQorU0RMS19CUkVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKK1NETEtfTUVOVSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUKK1NETEtfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyCitTRExLX0VVUk8gICAgICAgICAgICAgICAgICAgICAgICAgICBldXJvXGZSCisuZmkKKworCisuU0ggIlNETCBtb2RpZmllciBkZWZpbml0aW9ucyIKKy5QUAorXGZCU0RMIE1vZGlmaWVyICAgIE1lYW5pbmdcZlIKKy5uZgorXGYoQ1dLTU9EX05PTkUgICAgICAgTm8gbW9kaWZpZXJzIGFwcGxpY2FibGUKK0tNT0RfTlVNICAgICAgICBOdW1sb2NrIGlzIGRvd24KK0tNT0RfQ0FQUyAgICAgICBDYXBzbG9jayBpcyBkb3duCitLTU9EX0xDVFJMICAgICAgTGVmdCBDb250cm9sIGlzIGRvd24KK0tNT0RfUkNUUkwgICAgICBSaWdodCBDb250cm9sIGlzIGRvd24KK0tNT0RfUlNISUZUICAgICBSaWdodCBTaGlmdCBpcyBkb3duCitLTU9EX0xTSElGVCAgICAgTGVmdCBTaGlmdCBpcyBkb3duCitLTU9EX1JBTFQgICAgICAgUmlnaHQgQWx0IGlzIGRvd24KK0tNT0RfTEFMVCAgICAgICBMZWZ0IEFsdCBpcyBkb3duCitLTU9EX0NUUkwgICAgICAgQSBDb250cm9sIGtleSBpcyBkb3duCitLTU9EX1NISUZUICAgICAgQSBTaGlmdCBrZXkgaXMgZG93bgorS01PRF9BTFQgICAgICAgIEFuIEFsdCBrZXkgaXMgZG93blxmUgorLmZpCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0FjdGl2ZUV2ZW50LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9BY3RpdmVFdmVudC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OGU3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9BY3RpdmVFdmVudC4zCkBAIC0wLDAgKzEsMzggQEAKKy5USCAiU0RMX0FjdGl2ZUV2ZW50IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQWN0aXZlRXZlbnQgXC0gQXBwbGljYXRpb24gdmlzaWJpbGl0eSBldmVudCBzdHJ1Y3R1cmUKKy5TSCAiU1RSVUNUVVJFIERFRklOSVRJT04iCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIHN0cnVjdHsKKyAgVWludDggdHlwZTsKKyAgVWludDggZ2FpbjsKKyAgVWludDggc3RhdGU7Cit9IFNETF9BY3RpdmVFdmVudDtcZlIKKy5maQorLlBQCisuU0ggIlNUUlVDVFVSRSBEQVRBIgorLlRQIDIwCitcZkJ0eXBlXGZSCitcZkJTRExfQUNUSVZFRVZFTlRcJi5cZlAKKy5UUCAyMAorXGZCZ2FpblxmUgorMCBpZiB0aGUgZXZlbnQgaXMgYSBsb3NzIG9yIDEgaWYgaXQgaXMgYSBnYWluXCYuCisuVFAgMjAKK1xmQnN0YXRlXGZSCitcZkJTRExfQVBQTU9VU0VGT0NVU1xmUCBpZiBtb3VzZSBmb2N1cyB3YXMgZ2FpbmVkIG9yIGxvc3QsIFxmQlNETF9BUFBJTlBVVEZPQ1VTXGZQIGlmIGlucHV0IGZvY3VzIHdhcyBnYWluZWQgb3IgbG9zdCwgb3IgXGZCU0RMX0FQUEFDVElWRVxmUCBpZiB0aGUgYXBwbGljYXRpb24gd2FzIGljb25pZmllZCAoXGZCZ2FpblxmUj0wKSBvciByZXN0b3JlZChcZkJnYWluXGZSPTEpXCYuCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJTRExfQWN0aXZlRXZlbnRcZlIgaXMgYSBtZW1iZXIgb2YgdGhlIFxmSVxmQlNETF9FdmVudFxmUlxmUiB1bmlvbiBhbmQgaXMgdXNlZCB3aGVuIGFuIGV2ZW50IG9mIHR5cGUgXGZCU0RMX0FDVElWRUVWRU5UXGZQIGlzIHJlcG9ydGVkXCYuCisuUFAKK1doZW4gdGhlIG1vdXNlIGxlYXZlcyBvciBlbnRlcnMgdGhlIHdpbmRvdyBhcmVhIGEgXGZCU0RMX0FQUE1PVVNFRk9DVVNcZlAgdHlwZSBhY3RpdmF0aW9uIGV2ZW50IG9jY3VycywgaWYgdGhlIG1vdXNlIGVudGVyZWQgdGhlIHdpbmRvdyB0aGVuIFxmQmdhaW5cZlIgd2lsbCBiZSAxLCBvdGhlcndpc2UgXGZCZ2FpblxmUiB3aWxsIGJlIDBcJi4gQSBcZkJTRExfQVBQSU5QVVRGT0NVU1xmUCB0eXBlIGFjdGl2YXRpb24gZXZlbnQgb2NjdXJzIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGxvc2VzIG9yIGdhaW5zIGtleWJvYXJkIGZvY3VzXCYuIFRoaXMgdXN1YWxseSBvY2N1cnMgd2hlbiBhbm90aGVyIGFwcGxpY2F0aW9uIGlzIG1hZGUgYWN0aXZlXCYuIEZpbmFsbHksIGEgXGZCU0RMX0FQUEFDVElWRVxmUCB0eXBlIGV2ZW50IG9jY3VycyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBlaXRoZXIgbWluaW1pc2VkL2ljb25pZmllZCAoXGZCZ2FpblxmUj0wKSBvciByZXN0b3JlZFwmLgorLlBQCisuUlMKK1xmQk5vdGU6ICAKKy5QUAorVGhpcyBldmVudCBkb2VzIG5vdCBvY2N1ciB3aGVuIGFuIGFwcGxpY2F0aW9uIHdpbmRvdyBpcyBmaXJzdCBjcmVhdGVkXCYuCisuUkUKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9FdmVudFxmUlxmUiwgXGZJXGZCU0RMX0dldEFwcFN0YXRlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0FkZFRpbWVyLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9BZGRUaW1lci4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDk0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9BZGRUaW1lci4zCkBAIC0wLDAgKzEsMzggQEAKKy5USCAiU0RMX0FkZFRpbWVyIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQWRkVGltZXIgXC0gQWRkIGEgdGltZXIgd2hpY2ggd2lsbCBjYWxsIGEgY2FsbGJhY2sgYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGhhcyBlbGFwc2VkXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCU0RMX1RpbWVySUQgXGZCU0RMX0FkZFRpbWVyXGZQXGZSKFxmQlVpbnQzMiBpbnRlcnZhbCwgU0RMX05ld1RpbWVyQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBhcmFtXGZSKTsKKy5TSCAiQ0FMTEJBQ0siCisuUFAKKy5uZgorXGYoQ1cvKiB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSAibmV3IiB0aW1lciBjYWxsYmFjayBmdW5jdGlvbiAqLwordHlwZWRlZiBVaW50MzIgKCpTRExfTmV3VGltZXJDYWxsYmFjaykoVWludDMyIGludGVydmFsLCB2b2lkICpwYXJhbSk7XGZSCisuZmkKKy5QUAorLlNIICJERVNDUklQVElPTiIKKy5QUAorQWRkcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHJ1biBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGFzIGVsYXBzZWRcJi4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgY3VycmVudCB0aW1lciBpbnRlcnZhbCBhbmQgdGhlIHVzZXIgc3VwcGxpZWQgcGFyYW1ldGVyIGZyb20gdGhlIFxmQlNETF9BZGRUaW1lclxmUCBjYWxsIGFuZCByZXR1cm5zIHRoZSBuZXh0IHRpbWVyIGludGVydmFsXCYuIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBmcm9tIHRoZSBjYWxsYmFjayBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBpbiwgdGhlIHBlcmlvZGljIGFsYXJtIGNvbnRpbnVlcywgb3RoZXJ3aXNlIGEgbmV3IGFsYXJtIGlzIHNjaGVkdWxlZFwmLgorLlBQCitUbyBjYW5jZWwgYSBjdXJyZW50bHkgcnVubmluZyB0aW1lciBjYWxsIFxmSVNETF9SZW1vdmVUaW1lclxmUiB3aXRoIHRoZSB0aW1lciBJRCByZXR1cm5lZCBmcm9tIFxmQlNETF9BZGRUaW1lclxmUFwmLgorLlBQCitUaGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gbWF5IHJ1biBpbiBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB5b3VyIG1haW4gcHJvZ3JhbSwgYW5kIHNvIHNob3VsZG5cJid0IGNhbGwgYW55IGZ1bmN0aW9ucyBmcm9tIHdpdGhpbiBpdHNlbGZcJi4gWW91IG1heSBhbHdheXMgY2FsbCBcZklTRExfUHVzaEV2ZW50XGZSLCBob3dldmVyXCYuCisuUFAKK1RoZSBncmFudWxhcml0eSBvZiB0aGUgdGltZXIgaXMgcGxhdGZvcm0tZGVwZW5kZW50LCBidXQgeW91IHNob3VsZCBjb3VudCBvbiBpdCBiZWluZyBhdCBsZWFzdCAxMCBtcyBhcyB0aGlzIGlzIHRoZSBtb3N0IGNvbW1vbiBudW1iZXJcJi4gVGhpcyBtZWFucyB0aGF0IGlmIHlvdSByZXF1ZXN0IGEgMTYgbXMgdGltZXIsIHlvdXIgY2FsbGJhY2sgd2lsbCBydW4gYXBwcm94aW1hdGVseSAyMCBtcyBsYXRlciBvbiBhbiB1bmxvYWRlZCBzeXN0ZW1cJi4gSWYgeW91IHdhbnRlZCB0byBzZXQgYSBmbGFnIHNpZ25hbGluZyBhIGZyYW1lIHVwZGF0ZSBhdCAzMCBmcmFtZXMgcGVyIHNlY29uZCAoZXZlcnkgMzMgbXMpLCB5b3UgbWlnaHQgc2V0IGEgdGltZXIgZm9yIDMwIG1zIChzZWUgZXhhbXBsZSBiZWxvdylcJi4gSWYgeW91IHVzZSB0aGlzIGZ1bmN0aW9uLCB5b3UgbmVlZCB0byBwYXNzIFxmQlNETF9JTklUX1RJTUVSXGZQIHRvIFxmSVNETF9Jbml0XGZSXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyBhbiBJRCB2YWx1ZSBmb3IgdGhlIGFkZGVkIHRpbWVyIG9yIFxmQk5VTExcZlIgaWYgdGhlcmUgd2FzIGFuIGVycm9yXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisuUFAKKy5uZgorXGYoQ1dteV90aW1lcl9pZCA9IFNETF9BZGRUaW1lcigoMzMvMTApKjEwLCBteV9jYWxsYmFja2Z1bmMsIG15X2NhbGxiYWNrX3BhcmFtKTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfUmVtb3ZlVGltZXJcZlBcZlIsIFxmSVxmQlNETF9QdXNoRXZlbnRcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQXVkaW9DVlQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0F1ZGlvQ1ZULjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlMzQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0F1ZGlvQ1ZULjMKQEAgLTAsMCArMSw2OCBAQAorLlRIICJTRExfQXVkaW9DVlQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9BdWRpb0NWVCBcLSBBdWRpbyBDb252ZXJzaW9uIFN0cnVjdHVyZQorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBpbnQgbmVlZGVkOworICBVaW50MTYgc3JjX2Zvcm1hdDsKKyAgVWludDE2IGRlc3RfZm9ybWF0OworICBkb3VibGUgcmF0ZV9pbmNyOworICBVaW50OCAqYnVmOworICBpbnQgbGVuOworICBpbnQgbGVuX2N2dDsKKyAgaW50IGxlbl9tdWx0OworICBkb3VibGUgbGVuX3JhdGlvOworICB2b2lkICgqZmlsdGVyc1sxMF0pKHN0cnVjdCBTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCk7CisgIGludCBmaWx0ZXJfaW5kZXg7Cit9IFNETF9BdWRpb0NWVDtcZlIKKy5maQorLlBQCisuU0ggIlNUUlVDVFVSRSBEQVRBIgorLlRQIDIwCitcZkJuZWVkZWRcZlIKK1NldCB0byBvbmUgaWYgdGhlIGNvbnZlcnNpb24gaXMgcG9zc2libGUKKy5UUCAyMAorXGZCc3JjX2Zvcm1hdFxmUgorQXVkaW8gZm9ybWF0IG9mIHRoZSBzb3VyY2UKKy5UUCAyMAorXGZCZGVzdF9mb3JtYXRcZlIKK0F1ZGlvIGZvcm1hdCBvZiB0aGUgZGVzdGluYXRpb24KKy5UUCAyMAorXGZCcmF0ZV9pbmNyXGZSCitSYXRlIGNvbnZlcnNpb24gaW5jcmVtZW50CisuVFAgMjAKK1xmQmJ1ZlxmUgorQXVkaW8gYnVmZmVyCisuVFAgMjAKK1xmQmxlblxmUgorTGVuZ3RoIG9mIHRoZSBvcmlnaW5hbCBhdWRpbyBidWZmZXIgaW4gYnl0ZXMKKy5UUCAyMAorXGZCbGVuX2N2dFxmUgorTGVuZ3RoIG9mIGNvbnZlcnRlZCBhdWRpbyBidWZmZXIgaW4gYnl0ZXMgKGNhbGN1bGF0ZWQpCisuVFAgMjAKK1xmQmxlbl9tdWx0XGZSCitcZkJidWZcZlIgbXVzdCBiZSBcZkJsZW5cZlIqXGZCbGVuX211bHRcZlIgYnl0ZXMgaW4gc2l6ZShjYWxjdWxhdGVkKQorLlRQIDIwCitcZkJsZW5fcmF0aW9cZlIKK0ZpbmFsIGF1ZGlvIHNpemUgaXMgXGZCbGVuXGZSKlxmQmxlbl9yYXRpb1xmUgorLlRQIDIwCitcZkJmaWx0ZXJzWzEwXShcJi5cJi4pXGZSCitQb2ludGVycyB0byBmdW5jdGlvbnMgbmVlZGVkIGZvciB0aGlzIGNvbnZlcnNpb24KKy5UUCAyMAorXGZCZmlsdGVyX2luZGV4XGZSCitDdXJyZW50IGNvbnZlcnNpb24gZnVuY3Rpb24KKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoZSBcZkJTRExfQXVkaW9DVlRcZlIgaXMgdXNlZCB0byBjb252ZXJ0IGF1ZGlvIGRhdGEgYmV0d2VlbiBkaWZmZXJlbnQgZm9ybWF0c1wmLiBBIFxmQlNETF9BdWRpb0NWVFxmUiBzdHJ1Y3R1cmUgaXMgY3JlYXRlZCB3aXRoIHRoZSBcZklcZkJTRExfQnVpbGRBdWRpb0NWVFxmUFxmUiBmdW5jdGlvbiwgd2hpbGUgdGhlIGFjdHVhbCBjb252ZXJzaW9uIGlzIGRvbmUgYnkgdGhlIFxmSVxmQlNETF9Db252ZXJ0QXVkaW9cZlBcZlIgZnVuY3Rpb25cJi4KKy5QUAorTWFueSBvZiB0aGUgZmllbGRzIGluIHRoZSBcZkJTRExfQXVkaW9DVlRcZlIgc3RydWN0dXJlIHNob3VsZCBiZSBjb25zaWRlcmVkIHByaXZhdGUgYW5kIHRoZWlyIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGRpc2N1c3NlZCBoZXJlXCYuCisuSVAgIlxmQlVpbnQ4ICpcZlBcZkJidWZcZlIiIDEwVGhpcyBwb2ludHMgdG8gdGhlIGF1ZGlvIGRhdGEgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvbnZlcnNpb25cJi4gSXQgaXMgYm90aCB0aGUgc291cmNlIGFuZCB0aGUgZGVzdGluYXRpb24sIHdoaWNoIG1lYW5zIHRoZSBjb252ZXJ0ZWQgYXVkaW8gZGF0YSBvdmVyd3JpdGVzIHRoZSBvcmlnaW5hbCBkYXRhXCYuIEl0IGFsc28gbWVhbnMgdGhhdCB0aGUgY29udmVydGVkIGRhdGEgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBvcmlnaW5hbCBkYXRhIChpZiB5b3Ugd2VyZSBjb252ZXJ0aW5nIGZyb20gOC1iaXQgdG8gMTYtYml0LCBmb3IgaW5zdGFuY2UpLCBzbyB5b3UgbXVzdCBlbnN1cmUgXGZCYnVmXGZSIGlzIGxhcmdlIGVub3VnaFwmLiBTZWUgYmVsb3dcJi4KKy5JUCAiXGZCaW50XGZQIFxmQmxlblxmUiIgMTBUaGlzIGlzIHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsIGF1ZGlvIGRhdGEgaW4gYnl0ZXNcJi4KKy5JUCAiXGZCaW50XGZQIFxmQmxlbl9tdWx0XGZSIiAxMEFzIGV4cGxhaW5lZCBhYm92ZSwgdGhlIGF1ZGlvIGJ1ZmZlciBuZWVkcyB0byBiZSBiaWcgZW5vdWdoIHRvIHN0b3JlIHRoZSBjb252ZXJ0ZWQgZGF0YSwgd2hpY2ggbWF5IGJlIGJpZ2dlciB0aGFuIHRoZSBvcmlnaW5hbCBhdWRpbyBkYXRhXCYuIFRoZSBsZW5ndGggb2YgXGZCYnVmXGZSIHNob3VsZCBiZSBcZkJsZW5cZlIqXGZCbGVuX211bHRcZlJcJi4KKy5JUCAiXGZCZG91YmxlXGZQIFxmQmxlbl9yYXRpb1xmUiIgMTBXaGVuIHlvdSBoYXZlIGZpbmlzaGVkIGNvbnZlcnRpbmcgeW91ciBhdWRpbyBkYXRhLCB5b3UgbmVlZCB0byBrbm93IGhvdyBtdWNoIG9mIHlvdXIgYXVkaW8gYnVmZmVyIGlzIHZhbGlkXCYuIFxmQmxlblxmUipcZkJsZW5fcmF0aW9cZlIgaXMgdGhlIHNpemUgb2YgdGhlIGNvbnZlcnRlZCBhdWRpbyBkYXRhIGluIGJ5dGVzXCYuIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIFxmQmxlbl9tdWx0XGZSLCBob3dldmVyIHdoZW4gdGhlIGNvbnZlcnQgYXVkaW8gZGF0YSBpcyBzaG9ydGVyIHRoYW4gdGhlIG9yaWdpbmFsIFxmQmxlbl9tdWx0XGZSIHdvdWxkIGJlIDFcJi4gXGZCbGVuX3JhdGlvXGZSLCBvbiB0aGUgb3RoZXIgaGFuZCwgd291bGQgYmUgYSBmcmFjdGlvbmFsIG51bWJlciBiZXR3ZWVuIDAgYW5kIDFcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9CdWlsZEF1ZGlvQ1ZUXGZQXGZSLCBcZklcZkJTRExfQ29udmVydEF1ZGlvXGZQXGZSLCBcZklcZkJTRExfQXVkaW9TcGVjXGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0F1ZGlvU3BlYy4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQXVkaW9TcGVjLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwZmZkMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0F1ZGlvU3BlYy4zCkBAIC0wLDAgKzEsNzAgQEAKKy5USCAiU0RMX0F1ZGlvU3BlYyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU4IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0F1ZGlvU3BlYyBcLSBBdWRpbyBTcGVjaWZpY2F0aW9uIFN0cnVjdHVyZQorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBpbnQgZnJlcTsKKyAgVWludDE2IGZvcm1hdDsKKyAgVWludDggY2hhbm5lbHM7CisgIFVpbnQ4IHNpbGVuY2U7CisgIFVpbnQxNiBzYW1wbGVzOworICBVaW50MzIgc2l6ZTsKKyAgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICp1c2VyZGF0YSwgVWludDggKnN0cmVhbSwgaW50IGxlbik7CisgIHZvaWQgKnVzZXJkYXRhOworfSBTRExfQXVkaW9TcGVjO1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQmZyZXFcZlIKK0F1ZGlvIGZyZXF1ZW5jeSBpbiBzYW1wbGVzIHBlciBzZWNvbmQKKy5UUCAyMAorXGZCZm9ybWF0XGZSCitBdWRpbyBkYXRhIGZvcm1hdAorLlRQIDIwCitcZkJjaGFubmVsc1xmUgorTnVtYmVyIG9mIGNoYW5uZWxzOiAxIG1vbm8sIDIgc3RlcmVvCisuVFAgMjAKK1xmQnNpbGVuY2VcZlIKK0F1ZGlvIGJ1ZmZlciBzaWxlbmNlIHZhbHVlIChjYWxjdWxhdGVkKQorLlRQIDIwCitcZkJzYW1wbGVzXGZSCitBdWRpbyBidWZmZXIgc2l6ZSBpbiBzYW1wbGVzCisuVFAgMjAKK1xmQnNpemVcZlIKK0F1ZGlvIGJ1ZmZlciBzaXplIGluIGJ5dGVzIChjYWxjdWxhdGVkKQorLlRQIDIwCitcZkJjYWxsYmFjayhcJi5cJi4pXGZSCitDYWxsYmFjayBmdW5jdGlvbiBmb3IgZmlsbGluZyB0aGUgYXVkaW8gYnVmZmVyCisuVFAgMjAKK1xmQnVzZXJkYXRhXGZSCitQb2ludGVyIHRoZSB1c2VyIGRhdGEgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhlIFxmQlNETF9BdWRpb1NwZWNcZlIgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBzb21lIGF1ZGlvIGRhdGFcJi4gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSBcZklcZkJTRExfT3BlbkF1ZGlvXGZQXGZSIGFuZCBcZklcZkJTRExfTG9hZFdBVlxmUFxmUlwmLiBXaGlsZSBhbGwgZmllbGRzIGFyZSB1c2VkIGJ5IFxmQlNETF9PcGVuQXVkaW9cZlAgb25seSBcZkJmcmVxXGZSLCBcZkJmb3JtYXRcZlIsIFxmQnNhbXBsZXNcZlIgYW5kIFxmQmNoYW5uZWxzXGZSIGFyZSB1c2VkIGJ5IFxmQlNETF9Mb2FkV0FWXGZQXCYuIFdlIHdpbGwgZGV0YWlsIHRoZXNlIGNvbW1vbiBtZW1iZXJzIGhlcmVcJi4KKy5UUCAyMAorXGZCZnJlcVxmUgorVGhlIG51bWJlciBvZiBzYW1wbGVzIHNlbnQgdG8gdGhlIHNvdW5kIGRldmljZSBldmVyeSBzZWNvbmRcJi4gQ29tbW9uIHZhbHVlcyBhcmUgMTEwMjUsIDIyMDUwIGFuZCA0NDEwMFwmLiBUaGUgaGlnaGVyIHRoZSBiZXR0ZXJcJi4KKy5UUCAyMAorXGZCZm9ybWF0XGZSCitTcGVjaWZpZXMgdGhlIHNpemUgYW5kIHR5cGUgb2YgZWFjaCBzYW1wbGUgZWxlbWVudCAKKy5JUCAiXGZCQVVESU9fVThcZlAiIDEwVW5zaWduZWQgOC1iaXQgc2FtcGxlcworLklQICJcZkJBVURJT19TOFxmUCIgMTBTaWduZWQgOC1iaXQgc2FtcGxlcworLklQICJcZkJBVURJT19VMTZcZlAgb3IgXGZCQVVESU9fVTE2TFNCXGZQIiAxMFVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIHNhbXBsZXMKKy5JUCAiXGZCQVVESU9fUzE2XGZQIG9yIFxmQkFVRElPX1MxNkxTQlxmUCIgMTBTaWduZWQgMTYtYml0IGxpdHRsZS1lbmRpYW4gc2FtcGxlcworLklQICJcZkJBVURJT19VMTZNU0JcZlAiIDEwVW5zaWduZWQgMTYtYml0IGJpZy1lbmRpYW4gc2FtcGxlcworLklQICJcZkJBVURJT19TMTZNU0JcZlAiIDEwU2lnbmVkIDE2LWJpdCBiaWctZW5kaWFuIHNhbXBsZXMKKy5JUCAiXGZCQVVESU9fVTE2U1lTXGZQIiAxMEVpdGhlciBcZkJBVURJT19VMTZMU0JcZlAgb3IgXGZCQVVESU9fVTE2TVNCXGZQIGRlcGVuZGluZyBvbiB5b3Ugc3lzdGVtcyBlbmRpYW5uZXNzCisuSVAgIlxmQkFVRElPX1MxNlNZU1xmUCIgMTBFaXRoZXIgXGZCQVVESU9fUzE2TFNCXGZQIG9yIFxmQkFVRElPX1MxNk1TQlxmUCBkZXBlbmRpbmcgb24geW91IHN5c3RlbXMgZW5kaWFubmVzcworLlRQIDIwCitcZkJjaGFubmVsc1xmUgorVGhlIG51bWJlciBvZiBzZXBlcmF0ZSBzb3VuZCBjaGFubmVsc1wmLiAxIGlzIG1vbm8gKHNpbmdsZSBjaGFubmVsKSwgMiBpcyBzdGVyZW8gKGR1YWwgY2hhbm5lbClcJi4KKy5UUCAyMAorXGZCc2FtcGxlc1xmUgorV2hlbiB1c2VkIHdpdGggXGZJXGZCU0RMX09wZW5BdWRpb1xmUFxmUiB0aGlzIHJlZmVycyB0byB0aGUgc2l6ZSBvZiB0aGUgYXVkaW8gYnVmZmVyIGluIHNhbXBsZXNcJi4gQSBzYW1wbGUgYSBjaHVuayBvZiBhdWRpbyBkYXRhIG9mIHRoZSBzaXplIHNwZWNpZmllZCBpbiBcZkJmb3JtYXRcZlIgbXVsaXRwbGllZCBieSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzXCYuIFdoZW4gdGhlIFxmQlNETF9BdWRpb1NwZWNcZlIgaXMgdXNlZCB3aXRoIFxmSVxmQlNETF9Mb2FkV0FWXGZQXGZSIFxmQnNhbXBsZXNcZlIgaXMgc2V0IHRvIDQwOTZcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9PcGVuQXVkaW9cZlBcZlIsIFxmSVxmQlNETF9Mb2FkV0FWXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0JsaXRTdXJmYWNlLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9CbGl0U3VyZmFjZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjJmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9CbGl0U3VyZmFjZS4zCkBAIC0wLDAgKzEsNjAgQEAKKy5USCAiU0RMX0JsaXRTdXJmYWNlIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQmxpdFN1cmZhY2UgXC0gVGhpcyBwZXJmb3JtcyBhIGZhc3QgYmxpdCBmcm9tIHRoZSBzb3VyY2Ugc3VyZmFjZSB0byB0aGUgZGVzdGluYXRpb24gc3VyZmFjZVwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQmxpdFN1cmZhY2VcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoaXMgcGVyZm9ybXMgYSBmYXN0IGJsaXQgZnJvbSB0aGUgc291cmNlIHN1cmZhY2UgdG8gdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2VcJi4KKy5QUAorT25seSB0aGUgcG9zaXRpb24gaXMgdXNlZCBpbiB0aGUgXGZCZHN0cmVjdFxmUiAodGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGlnbm9yZWQpXCYuCisuUFAKK0lmIGVpdGhlciBcZkJzcmNyZWN0XGZSIG9yIFxmQmRzdHJlY3RcZlIgYXJlIFxmQk5VTExcZlAsIHRoZSBlbnRpcmUgc3VyZmFjZSAoXGZCc3JjXGZSIG9yIFxmQmRzdFxmUikgaXMgY29waWVkXCYuCisuUFAKK1RoZSBmaW5hbCBibGl0IHJlY3RhbmdsZSBpcyBzYXZlZCBpbiBcZkJkc3RyZWN0XGZSIGFmdGVyIGFsbCBjbGlwcGluZyBpcyBwZXJmb3JtZWQgKFxmQnNyY3JlY3RcZlIgaXMgbm90IG1vZGlmaWVkKVwmLgorLlBQCitUaGUgYmxpdCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBhIGxvY2tlZCBzdXJmYWNlXCYuCisuUFAKK1RoZSByZXN1bHRzIG9mIGJsaXR0aW5nIG9wZXJhdGlvbnMgdmFyeSBncmVhdGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyIFxmQlNETF9TUkNBUExIQVxmUCBpcyBzZXQgb3Igbm90XCYuIFNlZSBcZklTRExfU2V0QWxwaGFcZlIgZm9yIGFuIGV4cGxhaW5hdGlvbiBvZiBob3cgdGhpcyBhZmZlY3RzIHlvdXIgcmVzdWx0c1wmLiBDb2xvcmtleWluZyBhbmQgYWxwaGEgYXR0cmlidXRlcyBhbHNvIGludGVyYWN0IHdpdGggc3VyZmFjZSBibGl0dGluZywgYXMgdGhlIGZvbGxvd2luZyBwc2V1ZG8tY29kZSBzaG91bGQgaG9wZWZ1bGx5IGV4cGxhaW5cJi4gCisuUFAKKy5uZgorXGYoQ1dpZiAoc291cmNlIHN1cmZhY2UgaGFzIFNETF9TUkNBTFBIQSBzZXQpIHsKKyAgICBpZiAoc291cmNlIHN1cmZhY2UgaGFzIGFscGhhIGNoYW5uZWwgKHRoYXQgaXMsIGZvcm1hdC0+QW1hc2sgIT0gMCkpCisgICAgICAgIGJsaXQgdXNpbmcgcGVyLXBpeGVsIGFscGhhLCBpZ25vcmluZyBhbnkgY29sb3VyIGtleQorICAgIGVsc2UgeworICAgICAgICBpZiAoc291cmNlIHN1cmZhY2UgaGFzIFNETF9TUkNDT0xPUktFWSBzZXQpCisgICAgICAgICAgICBibGl0IHVzaW5nIHRoZSBjb2xvdXIga2V5IEFORCB0aGUgcGVyLXN1cmZhY2UgYWxwaGEgdmFsdWUKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmxpdCB1c2luZyB0aGUgcGVyLXN1cmZhY2UgYWxwaGEgdmFsdWUKKyAgICB9Cit9IGVsc2UgeworICAgIGlmIChzb3VyY2Ugc3VyZmFjZSBoYXMgU0RMX1NSQ0NPTE9SS0VZIHNldCkKKyAgICAgICAgYmxpdCB1c2luZyB0aGUgY29sb3VyIGtleQorICAgIGVsc2UKKyAgICAgICAgb3JkaW5hcnkgb3BhcXVlIHJlY3Rhbmd1bGFyIGJsaXQKK31cZlIKKy5maQorLlBQCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorSWYgdGhlIGJsaXQgaXMgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyBcZkIwXGZSLCBvdGhlcndpc2UgaXQgcmV0dXJucyBcZkItMVxmUlwmLgorLlBQCitJZiBlaXRoZXIgb2YgdGhlIHN1cmZhY2VzIHdlcmUgaW4gdmlkZW8gbWVtb3J5LCBhbmQgdGhlIGJsaXQgcmV0dXJucyBcZkItMlxmUiwgdGhlIHZpZGVvIG1lbW9yeSB3YXMgbG9zdCwgc28gaXQgc2hvdWxkIGJlIHJlbG9hZGVkIHdpdGggYXJ0d29yayBhbmQgcmUtYmxpdHRlZDogCisuUFAKKy5uZgorXGYoQ1cgICAgICAgIHdoaWxlICggU0RMX0JsaXRTdXJmYWNlKGltYWdlLCBpbWdyZWN0LCBzY3JlZW4sIGRzdHJlY3QpID09IC0yICkgeworICAgICAgICAgICAgICAgIHdoaWxlICggU0RMX0xvY2tTdXJmYWNlKGltYWdlKSkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsZWVwKDEwKTsKKyAgICAgICAgICAgICAgICAtLSBXcml0ZSBpbWFnZSBwaXhlbHMgdG8gaW1hZ2UtPnBpeGVscyAtLQorICAgICAgICAgICAgICAgIFNETF9VbmxvY2tTdXJmYWNlKGltYWdlKTsKKyAgICAgICAgfVxmUgorLmZpCisuUFAKKyBUaGlzIGhhcHBlbnMgdW5kZXIgRGlyZWN0WCA1XCYuMCB3aGVuIHRoZSBzeXN0ZW0gc3dpdGNoZXMgYXdheSBmcm9tIHlvdXIgZnVsbHNjcmVlbiBhcHBsaWNhdGlvblwmLiBMb2NraW5nIHRoZSBzdXJmYWNlIHdpbGwgYWxzbyBmYWlsIHVudGlsIHlvdSBoYXZlIGFjY2VzcyB0byB0aGUgdmlkZW8gbWVtb3J5IGFnYWluXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfTG9ja1N1cmZhY2VcZlBcZlIsIFxmSVxmQlNETF9GaWxsUmVjdFxmUFxmUiwgXGZJXGZCU0RMX1N1cmZhY2VcZlJcZlIsIFxmSVxmQlNETF9SZWN0XGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0J1aWxkQXVkaW9DVlQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0J1aWxkQXVkaW9DVlQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmNhNjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQnVpbGRBdWRpb0NWVC4zCkBAIC0wLDAgKzEsMjMgQEAKKy5USCAiU0RMX0J1aWxkQXVkaW9DVlQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9CdWlsZEF1ZGlvQ1ZUIFwtIEluaXRpYWxpemVzIGEgU0RMX0F1ZGlvQ1ZUIHN0cnVjdHVyZSBmb3IgY29udmVyc2lvbgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQnVpbGRBdWRpb0NWVFxmUFxmUihcZkJTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IHNyY19mb3JtYXQsIFVpbnQ4IHNyY19jaGFubmVscywgaW50IHNyY19yYXRlLCBVaW50MTYgZHN0X2Zvcm1hdCwgVWludDggZHN0X2NoYW5uZWxzLCBpbnQgZHN0X3JhdGVcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorQmVmb3JlIGFuIFxmSVxmQlNETF9BdWRpb0NWVFxmUlxmUiBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhdWRpbyBkYXRhIGl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGluZm9ybWF0aW9uXCYuIAorLlBQCitcZkJzcmNfZm9ybWF0XGZSIGFuZCBcZkJkc3RfZm9ybWF0XGZSIGFyZSB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBmb3JtYXQgb2YgdGhlIGNvbnZlcnNpb25cJi4gKEZvciBpbmZvcm1hdGlvbiBvbiBhdWRpbyBmb3JtYXRzIHNlZSBcZklcZkIgU0RMX0F1ZGlvU3BlY1xmUlxmUilcJi4gXGZCc3JjX2NoYW5uZWxzXGZSIGFuZCBcZkJkc3RfY2hhbm5lbHNcZlIgYXJlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZm9ybWF0c1wmLiBGaW5hbGx5LCBcZkJzcmNfcmF0ZVxmUiBhbmQgXGZCZHN0X3JhdGVcZlIgYXJlIHRoZSBmcmVxdWVuY3kgb3Igc2FtcGxlcy1wZXItc2Vjb25kIG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGZvcm1hdHNcJi4gT25jZSBhZ2Fpbiwgc2VlIFxmSVxmQlNETF9BdWRpb1NwZWNcZlJcZlJcJi4KKy5TSCAiUkVUVVJOIFZBTFVFUyIKKy5QUAorUmV0dXJucyBcZkItMVxmUiBpZiB0aGUgZmlsdGVyIGNvdWxkIG5vdCBiZSBidWlsdCBvciAxIGlmIGl0IGNvdWxkXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCitTZWUgXGZJXGZCU0RMX0NvbnZlcnRBdWRpb1xmUFxmUlwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NvbnZlcnRBdWRpb1xmUFxmUiwgXGZJXGZCU0RMX0F1ZGlvQ1ZUXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NELjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMjE4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRC4zCkBAIC0wLDAgKzEsNTcgQEAKKy5USCAiU0RMX0NEIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQ0QgXC0gQ0RST00gRHJpdmUgSW5mb3JtYXRpb24KKy5TSCAiU1RSVUNUVVJFIERFRklOSVRJT04iCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIHN0cnVjdHsKKyAgaW50IGlkOworICBDRHN0YXR1cyBzdGF0dXM7CisgIGludCBudW10cmFja3M7CisgIGludCBjdXJfdHJhY2s7CisgIGludCBjdXJfZnJhbWU7CisgIFNETF9DRHRyYWNrIHRyYWNrW1NETF9NQVhfVFJBQ0tTKzFdOworfSBTRExfQ0Q7XGZSCisuZmkKKy5QUAorLlNIICJTVFJVQ1RVUkUgREFUQSIKKy5UUCAyMAorXGZCaWRcZlIKK1ByaXZhdGUgZHJpdmUgaWRlbnRpZmllcgorLlRQIDIwCitcZkJzdGF0dXNcZlIKK0RyaXZlIFxmSXN0YXR1c1xmUgorLlRQIDIwCitcZkJudW10cmFja3NcZlIKK051bWJlciBvZiB0cmFja3Mgb24gdGhlIENECisuVFAgMjAKK1xmQmN1cl90cmFja1xmUgorQ3VycmVudCB0cmFjaworLlRQIDIwCitcZkJjdXJfZnJhbWVcZlIKK0N1cnJlbnQgZnJhbWUgb2Zmc2V0IHdpdGhpbiB0aGUgdHJhY2sKKy5UUCAyMAorXGZCdHJhY2tcZlJbU0RMX01BWF9UUkFDS1MrMV0KK0FycmF5IG9mIHRyYWNrIGRlc2NyaXB0aW9uc1wmLiAoc2VlIFxmSVxmQlNETF9DRHRyYWNrXGZSXGZSKQorLlNIICJERVNDUklQVElPTiIKKy5QUAorQW4gXGZCU0RMX0NEXGZSIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBieSBcZklcZkJTRExfQ0RPcGVuXGZQXGZSXCYuIEl0IHJlcHJlc2VudHMgYW4gb3BlbmVkIENEUk9NIGRldmljZSBhbmQgc3RvcmVzIGluZm9ybWF0aW9uIG9uIHRoZSBsYXlvdXQgb2YgdGhlIHRyYWNrcyBvbiB0aGUgZGlzY1wmLgorLlBQCitBIGZyYW1lIGlzIHRoZSBiYXNlIGRhdGEgdW5pdCBvZiBhIENEXCYuIFxmQkNEX0ZQU1xmUCBmcmFtZXMgaXMgZXF1YWwgdG8gMSBzZWNvbmQgb2YgbXVzaWNcJi4gU0RMIHByb3ZpZGVzIHR3byBtYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aW1lIGFuZCBmcmFtZXM6IFxmQkZSQU1FU19UT19NU0YoZiwgTSxTLEYpXGZQIGFuZCBcZkJNU0ZfVE9fRlJBTUVTXGZQXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisubmYKK1xmKENXaW50IG1pbiwgc2VjLCBmcmFtZTsKK2ludCBmcmFtZV9vZmZzZXQ7CisKK0ZSQU1FU19UT19NU0YoY2Ryb20tPmN1cl9mcmFtZSwgJm1pbiwgJnNlYywgJmZyYW1lKTsKK3ByaW50ZigiQ3VycmVudCBQb3NpdGlvbjogJWQgbWludXRlcywgJWQgc2Vjb25kcywgJWQgZnJhbWVzCisiLCBtaW4sIHNlYywgZnJhbWUpOworCitmcmFtZV9vZmZzZXQ9TVNGX1RPX0ZSQU1FUyhtaW4sIHNlYywgZnJhbWUpO1xmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DRE9wZW5cZlBcZlIsIFxmSVxmQlNETF9DRHRyYWNrXGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NEQ2xvc2UuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NEQ2xvc2UuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQyOWZiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RDbG9zZS4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX0NEQ2xvc2UiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9DRENsb3NlIFwtIENsb3NlcyBhIFNETF9DRCBoYW5kbGUKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9DRENsb3NlXGZQXGZSKFxmQlNETF9DRCAqY2Ryb21cZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorQ2xvc2VzIHRoZSBnaXZlbiBcZkJjZHJvbVxmUiBoYW5kbGVcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DRE9wZW5cZlBcZlIsIFxmSVxmQlNETF9DRFxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU4CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DREVqZWN0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DREVqZWN0LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyOTgzZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NERWplY3QuMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9DREVqZWN0IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQ0RFamVjdCBcLSBFamVjdHMgYSBDRFJPTQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQ0RFamVjdFxmUFxmUihcZkJTRExfQ0QgKmNkcm9tXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0VqZWN0cyB0aGUgZ2l2ZW4gXGZCY2Ryb21cZlJcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIFxmQjBcZlIgb24gc3VjY2Vzcywgb3IgXGZCLTFcZlIgb24gYW4gZXJyb3JcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DRFxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU4CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRE5hbWUuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NETmFtZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjYyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRE5hbWUuMwpAQCAtMCwwICsxLDIzIEBACisuVEggIlNETF9DRE5hbWUiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9DRE5hbWUgXC0gUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlLCBzeXN0ZW0tZGVwZW5kZW50IGlkZW50aWZpZXIgZm9yIHRoZSBDRC1ST01cJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJjb25zdCBjaGFyICpcZkJTRExfQ0ROYW1lXGZQXGZSKFxmQmludCBkcml2ZVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUsIHN5c3RlbS1kZXBlbmRlbnQgaWRlbnRpZmllciBmb3IgdGhlIENELVJPTVwmLiBcZkJkcml2ZVxmUiBpcyB0aGUgaW5kZXggb2YgdGhlIGRyaXZlXCYuIERyaXZlIGluZGljZXMgc3RhcnQgdG8gMCBhbmQgZW5kIGF0IFxmQlNETF9DRE51bURyaXZlcygpXGZQLTFcJi4KKy5TSCAiRVhBTVBMRVMiCisuUFAKKy5JUCAiICAgXChidSIgNgorIi9kZXYvY2Ryb20iCisuSVAgIiAgIFwoYnUiIDYKKyJFOiIKKy5JUCAiICAgXChidSIgNgorIi9kZXYvZGlzay9pZGUvMS9tYXN0ZXIiCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ0ROdW1Ecml2ZXNcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0ROdW1Ecml2ZXMuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NETnVtRHJpdmVzLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2MmI2OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NETnVtRHJpdmVzLjMKQEAgLTAsMCArMSwxNSBAQAorLlRIICJTRExfQ0ROdW1Ecml2ZXMiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9DRE51bURyaXZlcyBcLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgQ0QtUk9NIGRyaXZlcyBvbiB0aGUgc3lzdGVtXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9DRE51bURyaXZlc1xmUFxmUihcZkJ2b2lkXGZSKQorLlNIICJERVNDUklQVElPTiIKKy5QUAorUmV0dXJucyB0aGUgbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgb24gdGhlIHN5c3RlbVwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NET3BlblxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU4CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRE9wZW4uMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NET3Blbi4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjIzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRE9wZW4uMwpAQCAtMCwwICsxLDU4IEBACisuVEggIlNETF9DRE9wZW4iICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9DRE9wZW4gXC0gT3BlbnMgYSBDRC1ST00gZHJpdmUgZm9yIGFjY2Vzc1wmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQlNETF9DRCAqXGZCU0RMX0NET3BlblxmUFxmUihcZkJpbnQgZHJpdmVcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorT3BlbnMgYSBDRC1ST00gZHJpdmUgZm9yIGFjY2Vzc1wmLiBJdCByZXR1cm5zIGEgXGZJXGZCU0RMX0NEXGZSXGZSIHN0cnVjdHVyZSBvbiBzdWNjZXNzLCBvciBcZkJOVUxMXGZQIGlmIHRoZSBkcml2ZSB3YXMgaW52YWxpZCBvciBidXN5XCYuIFRoaXMgbmV3bHkgb3BlbmVkIENELVJPTSBiZWNvbWVzIHRoZSBkZWZhdWx0IENEIHVzZWQgd2hlbiBvdGhlciBDRCBmdW5jdGlvbnMgYXJlIHBhc3NlZCBhIFxmQk5VTExcZlAgQ0QtUk9NIGhhbmRsZVwmLiAKKy5QUAorRHJpdmVzIGFyZSBudW1iZXJlZCBzdGFydGluZyB3aXRoIDBcJi4gRHJpdmUgMCBpcyB0aGUgc3lzdGVtIGRlZmF1bHQgQ0QtUk9NXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisubmYKK1xmKENXU0RMX0NEICpjZHJvbTsKK2ludCBjdXJfdHJhY2s7CitpbnQgbWluLCBzZWMsIGZyYW1lOworU0RMX0luaXQoU0RMX0lOSVRfQ0RST00pOworYXRleGl0KFNETF9RdWl0KTsKKworLyogQ2hlY2sgZm9yIENEIGRyaXZlcyAqLworaWYoIVNETF9DRE51bURyaXZlcygpKXsKKyAgLyogTm9uZSBmb3VuZCAqLworICBmcHJpbnRmKHN0ZGVyciwgIk5vIENEUk9NIGRldmljZXMgYXZhaWxhYmxlCisiKTsKKyAgZXhpdCgtMSk7Cit9CisKKy8qIE9wZW4gdGhlIGRlZmF1bHQgZHJpdmUgKi8KK2Nkcm9tPVNETF9DRE9wZW4oMCk7CisKKy8qIERpZCBpZiBvcGVuPyBDaGVjayBpZiBjZHJvbSBpcyBOVUxMICovCitpZighY2Ryb20peworICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkblwmJ3Qgb3BlbiBkcml2ZTogJXMKKyIsIFNETF9HZXRFcnJvcigpKTsKKyAgZXhpdCgtMSk7Cit9CisKKy8qIFByaW50IFZvbHVtZSBpbmZvICovCitwcmludGYoIk5hbWU6ICVzCisiLCBTRExfQ0ROYW1lKDApKTsKK3ByaW50ZigiVHJhY2tzOiAlZAorIiwgY2Ryb20tPm51bXRyYWNrcyk7Citmb3IoY3VyX3RyYWNrPTA7Y3VyX3RyYWNrIDwgY2Ryb20tPm51bXRyYWNrczsgY3VyX3RyYWNrKyspeworICBGUkFNRVNfVE9fTVNGKGNkcm9tLT50cmFja1tjdXJfdHJhY2tdXCYubGVuZ3RoLCAmbWluLCAmc2VjLCAmZnJhbWUpOworICBwcmludGYoIglUcmFjayAlZDogTGVuZ3RoICVkOiVkCisiLCBjdXJfdHJhY2ssIG1pbiwgc2VjKTsKK30KKworU0RMX0NEQ2xvc2UoY2Ryb20pO1xmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DRFxmUlxmUiwgXGZJXGZCU0RMX0NEdHJhY2tcZlJcZlIsIFxmSVxmQlNETF9DRENsb3NlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NEUGF1c2UuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NEUGF1c2UuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2EwNmMwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RQYXVzZS4zCkBAIC0wLDAgKzEsMTggQEAKKy5USCAiU0RMX0NEUGF1c2UiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9DRFBhdXNlIFwtIFBhdXNlcyBhIENEUk9NCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9DRFBhdXNlXGZQXGZSKFxmQlNETF9DRCAqY2Ryb21cZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorUGF1c2VzIHBsYXkgb24gdGhlIGdpdmVuIFxmQmNkcm9tXGZSXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyBcZkIwXGZSIG9uIHN1Y2Nlc3MsIG9yIFxmQi0xXGZSIG9uIGFuIGVycm9yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ0RQbGF5XGZQXGZSLCBcZklcZkJTRExfQ0RSZXN1bWVcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RQbGF5LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRFBsYXkuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWMyNWVjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RQbGF5LjMKQEAgLTAsMCArMSwxOCBAQAorLlRIICJTRExfQ0RQbGF5IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQ0RQbGF5IFwtIFBsYXkgYSBDRAorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQ0RQbGF5XGZQXGZSKFxmQlNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitQbGF5cyB0aGUgZ2l2ZW4gXGZCY2Ryb21cZlIsIHN0YXJ0aW5nIGEgZnJhbWUgXGZCc3RhcnRcZlIgZm9yIFxmQmxlbmd0aFxmUiBmcmFtZXNcJi4KKy5TSCAiUkVUVVJOIFZBTFVFUyIKKy5QUAorUmV0dXJucyBcZkIwXGZSIG9uIHN1Y2Nlc3MsIG9yIFxmQi0xXGZSIG9uIGFuIGVycm9yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ0RQbGF5VHJhY2tzXGZQXGZSLCBcZklcZkJTRExfQ0RTdG9wXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NEUGxheVRyYWNrcy4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RQbGF5VHJhY2tzLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0MDNiMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NEUGxheVRyYWNrcy4zCkBAIC0wLDAgKzEsNDcgQEAKKy5USCAiU0RMX0NEUGxheVRyYWNrcyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU4IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NEUGxheVRyYWNrcyBcLSBQbGF5IHRoZSBnaXZlbiBDRCB0cmFjayhzKQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQ0RQbGF5VHJhY2tzXGZQXGZSKFxmQlNETF9DRCAqY2Ryb20sIGludCBzdGFydF90cmFjaywgaW50IHN0YXJ0X2ZyYW1lLCBpbnQgbnRyYWNrcywgaW50IG5mcmFtZXMpXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9DRFBsYXlUcmFja3NcZlAgcGxheXMgdGhlIGdpdmVuIENEIHN0YXJ0aW5nIGF0IHRyYWNrIFxmQnN0YXJ0X3RyYWNrXGZSLCBmb3IgXGZCbnRyYWNrc1xmUiB0cmFja3NcJi4gCisuUFAKK1xmQnN0YXJ0X2ZyYW1lXGZSIGlzIHRoZSBmcmFtZSBvZmZzZXQsIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgXGZCc3RhcnRfdHJhY2tcZlIsIGF0IHdoaWNoIHRvIHN0YXJ0XCYuIFxmQm5mcmFtZXNcZlIgaXMgdGhlIGZyYW1lIG9mZnNldCwgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsYXN0IHRyYWNrIChcZkJzdGFydF90cmFja1xmUitcZkJudHJhY2tzXGZSKSwgYXQgd2hpY2ggdG8gZW5kIHBsYXlpbmdcJi4KKy5QUAorXGZCU0RMX0NEUGxheVRyYWNrc1xmUCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgY2FsbGluZyBcZklcZkJTRExfQ0RTdGF0dXNcZlBcZlIgdG8gZ2V0IHRyYWNrIGluZm9ybWF0aW9uIGFib3V0IHRoZSBDRFwmLgorLlBQCisuUlMKK1xmQk5vdGU6ICAKKy5QUAorRGF0YSB0cmFja3MgYXJlIGlnbm9yZWRcJi4KKy5SRQorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgXGZCMFxmUiwgb3IgXGZCLTFcZlIgaWYgdGhlcmUgd2FzIGFuIGVycm9yXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisuUFAKKy5uZgorXGYoQ1cvKiBhc3N1bWluZyBjZHJvbSBpcyBhIHByZXZpb3VzbHkgb3BlbmVkIGRldmljZSAqLworLyogUGxheSB0aGUgZW50aXJlIENEICovCitpZihDRF9JTkRSSVZFKFNETF9DRFN0YXR1cyhjZHJvbSkpKQorICBTRExfQ0RQbGF5VHJhY2tzKGNkcm9tLCAwLCAwLCAwLCAwKTsKKworLyogUGxheSB0aGUgZmlyc3QgdHJhY2sgKi8KK2lmKENEX0lORFJJVkUoU0RMX0NEU3RhdHVzKGNkcm9tKSkpCisgIFNETF9DRFBsYXlUcmFja3MoY2Ryb20sIDAsIDAsIDEsIDApOworCisvKiBQbGF5IGZpcnN0IDE1IHNlY29uZHMgb2YgdGhlIDJuZCB0cmFjayAqLworaWYoQ0RfSU5EUklWRShTRExfQ0RTdGF0dXMoY2Ryb20pKSkKKyAgU0RMX0NEUGxheVRyYWNrcyhjZHJvbSwgMSwgMCwgMCwgQ0RfRlBTKjE1KTtcZlIKKy5maQorLlBQCisgCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ0RQbGF5XGZQXGZSLCBcZklcZkJTRExfQ0RTdGF0dXNcZlBcZlIsIFxmSVxmQlNETF9DRFxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU4CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRFJlc3VtZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RSZXN1bWUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmY2YzJkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RSZXN1bWUuMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9DRFJlc3VtZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU4IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NEUmVzdW1lIFwtIFJlc3VtZXMgYSBDRFJPTQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQ0RSZXN1bWVcZlBcZlIoXGZCU0RMX0NEICpjZHJvbVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitSZXN1bWVzIHBsYXkgb24gdGhlIGdpdmVuIFxmQmNkcm9tXGZSXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyBcZkIwXGZSIG9uIHN1Y2Nlc3MsIG9yIFxmQi0xXGZSIG9uIGFuIGVycm9yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ0RQbGF5XGZQXGZSLCBcZklcZkJTRExfQ0RQYXVzZVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU4CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRFN0YXR1cy4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RTdGF0dXMuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2VlZDcyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RTdGF0dXMuMwpAQCAtMCwwICsxLDU5IEBACisuVEggIlNETF9DRFN0YXR1cyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU4IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NEU3RhdHVzIFwtIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBnaXZlbiBkcml2ZVwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQkNEc3RhdHVzIFxmQlNETF9DRFN0YXR1c1xmUFxmUihcZkJTRExfQ0QgKmNkcm9tXGZSKTsKK1xmQi8qIEdpdmVuIGEgc3RhdHVzLCByZXR1cm5zIHRydWUgaWYgdGhlcmVcJidzIGEgZGlzayBpbiB0aGUgZHJpdmUgKi8KKyNkZWZpbmUgQ0RfSU5EUklWRShzdGF0dXMpICAgICAgKChpbnQpc3RhdHVzID4gMCkKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGdpdmVuIGRyaXZlXCYuIFN0YXR1cyBpcyBkZXNjcmliZWQgbGlrZSBzbzogCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIGVudW0geworICBDRF9UUkFZRU1QVFksCisgIENEX1NUT1BQRUQsCisgIENEX1BMQVlJTkcsCisgIENEX1BBVVNFRCwKKyAgQ0RfRVJST1IgPSAtMQorfSBDRHN0YXR1cztcZlIKKy5maQorLlBQCisuUFAKK0lmIHRoZSBkcml2ZSBoYXMgYSBDRCBpbiBpdCwgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG9mIHRoZSBDRCBhbmQgY3VycmVudCBwbGF5IHBvc2l0aW9uIG9mIHRoZSBDRCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgU0RMX0NEIHN0cnVjdHVyZVwmLgorLlBQCitUaGUgbWFjcm8gXGZCQ0RfSU5EUklWRVxmUCBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2UsIGFuZCBnaXZlbiBhIHN0YXR1cyByZXR1cm5zIHRydWUgaWYgdGhlcmVcJidzIGEgZGlzayBpbiB0aGUgZHJpdmVcJi4KKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK1xmQlNETF9DRFN0YXR1c1xmUCBhbHNvIHVwZGF0ZXMgdGhlIFxmSVxmQlNETF9DRFxmUlxmUiBzdHJ1Y3R1cmUgcGFzc2VkIHRvIGl0XCYuCisuUkUKKy5TSCAiRVhBTVBMRSIKKy5QUAorLm5mCitcZihDV2ludCBwbGF5VHJhY2soaW50IHRyYWNrKQoreworICBpbnQgcGxheWluZyA9IDA7CisKKyAgaWYgKCBDRF9JTkRSSVZFKFNETF9DRFN0YXR1cyhjZHJvbSkpICkgeworICAvKiBjbGFtcCB0byB0aGUgYWN0dWFsIG51bWJlciBvZiB0cmFja3Mgb24gdGhlIENEICovCisgICAgaWYgKHRyYWNrID49IGNkcm9tLT5udW10cmFja3MpIHsKKyAgICAgIHRyYWNrID0gY2Ryb20tPm51bXRyYWNrcy0xOworICAgIH0KKworICAgIGlmICggU0RMX0NEUGxheVRyYWNrcyhjZHJvbSwgdHJhY2ssIDAsIDEsIDApID09IDAgKSB7CisgICAgICBwbGF5aW5nID0gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBsYXlpbmc7Cit9XGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NEXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NEU3RvcC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0RTdG9wLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlMmIyMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NEU3RvcC4zCkBAIC0wLDAgKzEsMTggQEAKKy5USCAiU0RMX0NEU3RvcCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU5IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NEU3RvcCBcLSBTdG9wcyBhIENEUk9NCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9DRFN0b3BcZlBcZlIoXGZCU0RMX0NEICpjZHJvbVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitTdG9wcyBwbGF5IG9uIHRoZSBnaXZlbiBcZkJjZHJvbVxmUlwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgXGZCMFxmUiBvbiBzdWNjZXNzLCBvciBcZkItMVxmUiBvbiBhbiBlcnJvclwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NEUGxheVxmUFxmUiwKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0R0cmFjay4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ0R0cmFjay4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYWM2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DRHRyYWNrLjMKQEAgLTAsMCArMSw0MCBAQAorLlRIICJTRExfQ0R0cmFjayIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU5IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NEdHJhY2sgXC0gQ0QgVHJhY2sgSW5mb3JtYXRpb24gU3RydWN0dXJlCisuU0ggIlNUUlVDVFVSRSBERUZJTklUSU9OIgorLlBQCisubmYKK1xmKENXdHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IGlkOworICBVaW50OCB0eXBlOworICBVaW50MzIgbGVuZ3RoOworICBVaW50MzIgb2Zmc2V0OworfSBTRExfQ0R0cmFjaztcZlIKKy5maQorLlBQCisuU0ggIlNUUlVDVFVSRSBEQVRBIgorLlRQIDIwCitcZkJpZFxmUgorVHJhY2sgbnVtYmVyICgwLTk5KQorLlRQIDIwCitcZkJ0eXBlXGZSCitcZkJTRExfQVVESU9fVFJBQ0tcZlAgb3IgXGZCU0RMX0RBVEFfVFJBQ0tcZlAKKy5UUCAyMAorXGZCbGVuZ3RoXGZSCitMZW5ndGgsIGluIGZyYW1lcywgb2YgdGhpcyB0cmFjaworLlRQIDIwCitcZkJvZmZzZXRcZlIKK0ZyYW1lIG9mZnNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgdHJhY2sKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9DRHRyYWNrXGZSIHN0b3JlcyBkYXRhIG9uIGVhY2ggdHJhY2sgb24gYSBDRCwgaXRzIGZpZWxkcyBzaG91bGQgYmUgcHJldHR5IHNlbGYgZXhwbGFpbmF0b3J5XCYuIEl0IGlzIGEgbWVtYmVyIGEgdGhlIFxmSVxmQlNETF9DRFxmUlxmUiBzdHJ1Y3R1cmVcJi4KKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK0ZyYW1lcyBjYW4gYmUgY29udmVydGVkIHRvIHN0YW5kYXJkIHRpbWluZ3NcJi4gVGhlcmUgYXJlIFxmQkNEX0ZQU1xmUCBmcmFtZXMgcGVyIHNlY29uZCwgc28gXGZCU0RMX0NEdHJhY2tcZlJcJi5cZkJsZW5ndGhcZlIvXGZCQ0RfRlBTXGZQPWxlbmd0aF9pbl9zZWNvbmRzXCYuCisuUkUKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DRFxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DbG9zZUF1ZGlvLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DbG9zZUF1ZGlvLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmZjFhNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0Nsb3NlQXVkaW8uMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9DbG9zZUF1ZGlvIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQ2xvc2VBdWRpbyBcLSBTaHV0cyBkb3duIGF1ZGlvIHByb2Nlc3NpbmcgYW5kIGNsb3NlcyB0aGUgYXVkaW8gZGV2aWNlXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfQ2xvc2VBdWRpb1xmUFxmUihcZkJ2b2lkXGZSKQorLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhpcyBmdW5jdGlvbiBzaHV0cyBkb3duIGF1ZGlvIHByb2Nlc3NpbmcgYW5kIGNsb3NlcyB0aGUgYXVkaW8gZGV2aWNlXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfT3BlbkF1ZGlvXGZQXGZSIAorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU4CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Db2xvci4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ29sb3IuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZlZThhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ29sb3IuMwpAQCAtMCwwICsxLDM0IEBACisuVEggIlNETF9Db2xvciIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NvbG9yIFwtIEZvcm1hdCBpbmRlcGVuZGVudCBjb2xvciBkZXNjcmlwdGlvbgorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBVaW50OCByOworICBVaW50OCBnOworICBVaW50OCBiOworICBVaW50OCB1bnVzZWQ7Cit9IFNETF9Db2xvcjtcZlIKKy5maQorLlBQCisuU0ggIlNUUlVDVFVSRSBEQVRBIgorLlRQIDIwCitcZkJyXGZSCitSZWQgaW50ZW5zaXR5CisuVFAgMjAKK1xmQmdcZlIKK0dyZWVuIGludGVuc2l0eQorLlRQIDIwCitcZkJiXGZSCitCbHVlIGludGVuc2l0eQorLlRQIDIwCitcZkJ1bnVzZWRcZlIKK1VudXNlZAorLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX0NvbG9yXGZSIGRlc2NyaWJlcyBhIGNvbG9yIGluIGEgZm9ybWF0IGluZGVwZW5kZW50IHdheVwmLiBZb3UgY2FuIGNvbnZlcnQgYSBcZkJTRExfQ29sb3JcZlIgdG8gYSBwaXhlbCB2YWx1ZSBmb3IgYSBjZXJ0YWluIHBpeGVsIGZvcm1hdCB1c2luZyBcZklcZkJTRExfTWFwUkdCXGZQXGZSXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfUGl4ZWxGb3JtYXRcZlJcZlIsIFxmSVxmQlNETF9TZXRDb2xvcnNcZlBcZlIsIFxmSVxmQlNETF9QYWxldHRlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NvbmRCcm9hZGNhc3QuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NvbmRCcm9hZGNhc3QuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM1MGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ29uZEJyb2FkY2FzdC4zCkBAIC0wLDAgKzEsMTYgQEAKKy5USCAiU0RMX0NvbmRCcm9hZGNhc3QiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Db25kQnJvYWRjYXN0IFwtIFJlc3RhcnQgYWxsIHRocmVhZHMgd2FpdGluZyBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQ29uZEJyb2FkY2FzdFxmUFxmUihcZkJTRExfY29uZCAqY29uZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitSZXN0YXJ0cyBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUsIFxmQmNvbmRcZlJcJi4gUmV0dXJucyBcZkIwXGZSIG9uIHN1Y2Nlc3MsIG9yIFxmQi0xXGZSIG9uIGFuIGVycm9yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ29uZFNpZ25hbFxmUFxmUiwgXGZJXGZCU0RMX0NvbmRXYWl0XGZQXGZSIAorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Db25kU2lnbmFsLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Db25kU2lnbmFsLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5Yzg3NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NvbmRTaWduYWwuMwpAQCAtMCwwICsxLDE2IEBACisuVEggIlNETF9Db25kU2lnbmFsIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQ29uZFNpZ25hbCBcLSBSZXN0YXJ0IGEgdGhyZWFkIHdhaXQgb24gYSBjb25kaXRpb24gdmFyaWFibGUKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorI2luY2x1ZGUgIlNETF90aHJlYWRcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX0NvbmRTaWduYWxcZlBcZlIoXGZCU0RMX2NvbmQgKmNvbmRcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorUmVzdGFydCBvbmUgb2YgdGhlIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLCBcZkJjb25kXGZSXCYuIFJldHVybnMgXGZCMFxmUiBvbiBzdWNjZXNzIG9mIFxmQi0xXGZSIG9uIGFuIGVycm9yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ29uZFdhaXRcZlBcZlIsIFxmSVxmQlNETF9Db25kQnJvYWRjYXN0XGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NvbmRXYWl0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Db25kV2FpdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MmY1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Db25kV2FpdC4zCkBAIC0wLDAgKzEsMTYgQEAKKy5USCAiU0RMX0NvbmRXYWl0IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQ29uZFdhaXQgXC0gV2FpdCBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQ29uZFdhaXRcZlBcZlIoXGZCU0RMX2NvbmQgKmNvbmQsIFNETF9tdXRleCAqbXV0XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1dhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBcZkJjb25kXGZSIGFuZCB1bmxvY2sgdGhlIHByb3ZpZGVkIG11dGV4XCYuIFRoZSBtdXRleCBtdXN0IHRoZSBsb2NrZWQgYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuY3Rpb25cJi4gUmV0dXJucyBcZkIwXGZSIHdoZW4gaXQgaXMgc2lnbmFsbGVkLCBvciBcZkItMVxmUiBvbiBhbiBlcnJvclwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NvbmRXYWl0VGltZW91dFxmUFxmUiwgXGZJXGZCU0RMX0NvbmRTaWduYWxcZlBcZlIsIFxmSVxmQlNETF9tdXRleFBcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ29uZFdhaXRUaW1lb3V0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Db25kV2FpdFRpbWVvdXQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjM0MjRkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ29uZFdhaXRUaW1lb3V0LjMKQEAgLTAsMCArMSwxNiBAQAorLlRIICJTRExfQ29uZFdhaXRUaW1lb3V0IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQ29uZFdhaXRUaW1lb3V0IFwtIFdhaXQgb24gYSBjb25kaXRpb24gdmFyaWFibGUsIHdpdGggdGltZW91dAorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQ29uZFdhaXRUaW1lb3V0XGZQXGZSKFxmQlNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dGV4LCBVaW50MzIgbXNcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorV2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIFxmQmNvbmRcZlIgZm9yLCBhdCBtb3N0LCBcZkJtc1xmUiBtaWxsaXNlY29uZHNcJi4gXGZCbXV0XGZSIGlzIHVubG9ja2VkIHNvIGl0IG11c3QgYmUgbG9ja2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZFwmLiBSZXR1cm5zIFxmQlNETF9NVVRFWF9USU1FRE9VVFxmUCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzaWduYWxsZWQgaW4gdGhlIGFsbG90dGVkIHRpbWUsIFxmQjBcZlIgaWYgaXQgd2FzIHNpZ25hbGxlZCBvciBcZkItMVxmUiBvbiBhbiBlcnJvclwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NvbmRXYWl0XGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NvbnZlcnRBdWRpby4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ29udmVydEF1ZGlvLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlZjk3NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NvbnZlcnRBdWRpby4zCkBAIC0wLDAgKzEsOTUgQEAKKy5USCAiU0RMX0NvbnZlcnRBdWRpbyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU4IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NvbnZlcnRBdWRpbyBcLSBDb252ZXJ0IGF1ZGlvIGRhdGEgdG8gYSBkZXNpcmVkIGF1ZGlvIGZvcm1hdFwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfQ29udmVydEF1ZGlvXGZQXGZSKFxmQlNETF9BdWRpb0NWVCAqY3Z0XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9Db252ZXJ0QXVkaW9cZlAgdGFrZXMgb25lIHBhcmFtZXRlciwgXGZCY3Z0XGZSLCB3aGljaCB3YXMgcHJldmlvdXNseSBpbml0aWxpemVkXCYuIEluaXRpbGl6aW5nIGEgXGZJXGZCU0RMX0F1ZGlvQ1ZUXGZSXGZSIGlzIGEgdHdvIHN0ZXAgcHJvY2Vzc1wmLiBGaXJzdCBvZiBhbGwsIHRoZSBzdHJ1Y3R1cmUgbXVzdCBiZSBwYXNzZWQgdG8gXGZJXGZCU0RMX0J1aWxkQXVkaW9DVlRcZlBcZlIgYWxvbmcgd2l0aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGZvcm1hdCBwYXJhbWV0ZXJzXCYuIFNlY29uZGx5LCB0aGUgXGZCY3Z0XGZSLT5cZkJidWZcZlIgYW5kIFxmQmN2dFxmUi0+XGZCbGVuXGZSIGZpZWxkcyBtdXN0IGJlIHNldHVwXCYuIFxmQmN2dFxmUi0+XGZCYnVmXGZSIHNob3VsZCBwb2ludCB0byB0aGUgYXVkaW8gZGF0YSBhbmQgXGZCY3Z0XGZSLT5cZkJsZW5cZlIgc2hvdWxkIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBhdWRpbyBkYXRhIGluIGJ5dGVzXCYuIFJlbWVtYmVyLCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBcZkJidWZcZlIgc2hvdyBiZSBcZkJsZW5cZlIqXGZCbGVuX211bHRcZlIgYnl0ZXMgaW4gbGVuZ3RoXCYuCisuUFAKK09uY2UgdGhlIFxmQlNETF9BdWRpb0NWVFxmUnN0cnVjdHVyZSBpcyBpbml0aWxpemVkIHRoZW4gd2UgY2FuIHBhc3MgaXQgdG8gXGZCU0RMX0NvbnZlcnRBdWRpb1xmUCwgd2hpY2ggd2lsbCBjb252ZXJ0IHRoZSBhdWRpbyBkYXRhIHBvaW50ZXIgdG8gYnkgXGZCY3Z0XGZSLT5cZkJidWZcZlJcJi4gSWYgXGZCU0RMX0NvbnZlcnRBdWRpb1xmUCByZXR1cm5lZCBcZkIwXGZSIHRoZW4gdGhlIGNvbnZlcnNpb24gd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSBcZkItMVxmUiBpcyByZXR1cm5lZFwmLgorLlBQCitJZiB0aGUgY29udmVyc2lvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IHRoZW4gdGhlIGNvbnZlcnRlZCBhdWRpbyBkYXRhIGNhbiBiZSByZWFkIGZyb20gXGZCY3Z0XGZSLT5cZkJidWZcZlJcJi4gVGhlIGFtb3VudCBvZiB2YWxpZCwgY29udmVydGVkLCBhdWRpbyBkYXRhIGluIHRoZSBidWZmZXIgaXMgZXF1YWwgdG8gXGZCY3Z0XGZSLT5cZkJsZW5cZlIqXGZCY3Z0XGZSLT5cZkJsZW5fcmF0aW9cZlJcJi4KKy5TSCAiRVhBTVBMRVMiCisuUFAKKy5uZgorXGYoQ1cvKiBDb252ZXJ0aW5nIHNvbWUgV0FWIGRhdGEgdG8gaGFyZHdhcmUgZm9ybWF0ICovCit2b2lkIG15X2F1ZGlvX2NhbGxiYWNrKHZvaWQgKnVzZXJkYXRhLCBVaW50OCAqc3RyZWFtLCBpbnQgbGVuKTsKKworU0RMX0F1ZGlvU3BlYyAqZGVzaXJlZCwgKm9idGFpbmVkOworU0RMX0F1ZGlvU3BlYyB3YXZfc3BlYzsKK1NETF9BdWRpb0NWVCAgd2F2X2N2dDsKK1VpbnQzMiB3YXZfbGVuOworVWludDggKndhdl9idWY7CitpbnQgcmV0OworCisvKiBBbGxvY2F0ZWQgYXVkaW8gc3BlY3MgKi8KK2Rlc2lyZWQ9KFNETF9BdWRpb1NwZWMgKiltYWxsb2Moc2l6ZW9mKFNETF9BdWRpb1NwZWMpKTsKK29idGFpbmVkPShTRExfQXVkaW9TcGVjICopbWFsbG9jKHNpemVvZihTRExfQXVkaW9TcGVjKSk7CisKKy8qIFNldCBkZXNpcmVkIGZvcm1hdCAqLworZGVzaXJlZC0+ZnJlcT0yMjA1MDsKK2Rlc2lyZWQtPmZvcm1hdD1BVURJT19TMTZMU0I7CitkZXNpcmVkLT5zYW1wbGVzPTgxOTI7CitkZXNpcmVkLT5jYWxsYmFjaz1teV9hdWRpb19jYWxsYmFjazsKK2Rlc2lyZWQtPnVzZXJkYXRhPU5VTEw7CisKKy8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLworaWYgKCBTRExfT3BlbkF1ZGlvKGRlc2lyZWQsIG9idGFpbmVkKSA8IDAgKXsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZG5cJid0IG9wZW4gYXVkaW86ICVzCisiLCBTRExfR2V0RXJyb3IoKSk7CisgIGV4aXQoLTEpOworfQorICAgICAgICAKK2ZyZWUoZGVzaXJlZCk7CisKKy8qIExvYWQgdGhlIHRlc3RcJi53YXYgKi8KK2lmKCBTRExfTG9hZFdBVigidGVzdFwmLndhdiIsICZ3YXZfc3BlYywgJndhdl9idWYsICZ3YXZfbGVuKSA9PSBOVUxMICl7CisgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gdGVzdFwmLndhdjogJXMKKyIsIFNETF9HZXRFcnJvcigpKTsKKyAgU0RMX0Nsb3NlQXVkaW8oKTsKKyAgZnJlZShvYnRhaW5lZCk7CisgIGV4aXQoLTEpOworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qIEJ1aWxkIEF1ZGlvQ1ZUICovCityZXQgPSBTRExfQnVpbGRBdWRpb0NWVCgmd2F2X2N2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhdl9zcGVjXCYuZm9ybWF0LCB3YXZfc3BlY1wmLmNoYW5uZWxzLCB3YXZfc3BlY1wmLmZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5lZC0+Zm9ybWF0LCBvYnRhaW5lZC0+Y2hhbm5lbHMsIG9idGFpbmVkLT5mcmVxKTsKKworLyogQ2hlY2sgdGhhdCB0aGUgY29udmVydCB3YXMgYnVpbHQgKi8KK2lmKHJldD09LTEpeworICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkblwmJ3QgYnVpbGQgY29udmVydGVyIQorIik7CisgIFNETF9DbG9zZUF1ZGlvKCk7CisgIGZyZWUob2J0YWluZWQpOworICBTRExfRnJlZVdBVih3YXZfYnVmKTsKK30KKworLyogU2V0dXAgZm9yIGNvbnZlcnNpb24gKi8KK3dhdl9jdnRcJi5idWY9KFVpbnQ4ICopbWFsbG9jKHdhdl9sZW4qd2F2X2N2dFwmLmxlbl9tdWx0KTsKK3dhdl9jdnRcJi5sZW49d2F2X2xlbjsKK21lbWNweSh3YXZfY3Z0XCYuYnVmLCB3YXZfYnVmLCB3YXZfbGVuKTsKKworLyogV2UgY2FuIGRlbGV0ZSB0byBvcmlnaW5hbCBXQVYgZGF0YSBub3cgKi8KK1NETF9GcmVlV0FWKHdhdl9idWYpOworCisvKiBBbmQgbm93IHdlXCYncmUgcmVhZHkgdG8gY29udmVydCAqLworU0RMX0NvbnZlcnRBdWRpbygmd2F2X2N2dCk7CisKKy8qIGRvIHdoYXRldmVyICovCitcJi4KK1wmLgorXCYuCitcJi4KKworXGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0J1aWxkQXVkaW9DVlRcZlBcZlIsIFxmSVxmQlNETF9BdWRpb0NWVFxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU4CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Db252ZXJ0U3VyZmFjZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ29udmVydFN1cmZhY2UuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI0ZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ29udmVydFN1cmZhY2UuMwpAQCAtMCwwICsxLDI0IEBACisuVEggIlNETF9Db252ZXJ0U3VyZmFjZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NvbnZlcnRTdXJmYWNlIFwtIENvbnZlcnRzIGEgc3VyZmFjZSB0byB0aGUgc2FtZSBmb3JtYXQgYXMgYW5vdGhlciBzdXJmYWNlXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RML1NETFwmLmgiCisuc3AKK1xmQlNETF9TdXJmYWNlICpcZkJTRExfQ29udmVydFN1cmZhY2VcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnNyYywgU0RMX1BpeGVsRm9ybWF0ICpmbXQsIFVpbnQzMiBmbGFnc1xmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitDcmVhdGVzIGEgbmV3IHN1cmZhY2Ugb2YgdGhlIHNwZWNpZmllZCBmb3JtYXQsIGFuZCB0aGVuIGNvcGllcyBhbmQgbWFwcyB0aGUgZ2l2ZW4gc3VyZmFjZSB0byBpdFwmLiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCBpdCByZXR1cm5zIFxmQk5VTExcZlBcJi4KKy5QUAorVGhlIFxmQmZsYWdzXGZSIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gXGZJXGZCU0RMX0NyZWF0ZVJHQlN1cmZhY2VcZlBcZlIgYW5kIGhhcyB0aG9zZSBzZW1hbnRpY3NcJi4KKy5QUAorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFsbHkgYnkgXGZJXGZCU0RMX0Rpc3BsYXlGb3JtYXRcZlBcZlJcJi4KKy5QUAorVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgU0RMX0luaXRcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIGVpdGhlciBhIHBvaW50ZXIgdG8gdGhlIG5ldyBzdXJmYWNlLCBvciBcZkJOVUxMXGZQIG9uIGVycm9yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ3JlYXRlUkdCU3VyZmFjZVxmUFxmUiwgXGZJXGZCU0RMX0Rpc3BsYXlGb3JtYXRcZlBcZlIsIFxmSVxmQlNETF9QaXhlbEZvcm1hdFxmUlxmUiwgXGZJXGZCU0RMX1N1cmZhY2VcZlJcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlQ29uZC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlQ29uZC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YzI4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DcmVhdGVDb25kLjMKQEAgLTAsMCArMSwzMSBAQAorLlRIICJTRExfQ3JlYXRlQ29uZCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NyZWF0ZUNvbmQgXC0gQ3JlYXRlIGEgY29uZGl0aW9uIHZhcmlhYmxlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkXCYuaCIKKy5zcAorXGZCU0RMX2NvbmQgKlxmQlNETF9DcmVhdGVDb25kXGZQXGZSKFxmQnZvaWRcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorQ3JlYXRlcyBhIGNvbmRpdGlvbiB2YXJpYWJsZVwmLgorLlNIICJFWEFNUExFUyIKKy5QUAorLm5mCitcZihDV1NETF9jb25kICpjb25kOworCitjb25kPVNETF9DcmVhdGVDb25kKCk7CitcJi4KK1wmLgorLyogRG8gc3R1ZmYgKi8KKworXCYuCitcJi4KK1NETF9EZXN0cm95Q29uZChjb25kKTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfRGVzdHJveUNvbmRcZlBcZlIsIFxmSVxmQlNETF9Db25kV2FpdFxmUFxmUiwgXGZJXGZCU0RMX0NvbmRTaWduYWxcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlQ3Vyc29yLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DcmVhdGVDdXJzb3IuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjIwNWMzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlQ3Vyc29yLjMKQEAgLTAsMCArMSwxMjAgQEAKKy5USCAiU0RMX0NyZWF0ZUN1cnNvciIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NyZWF0ZUN1cnNvciBcLSBDcmVhdGVzIGEgbmV3IG1vdXNlIGN1cnNvclwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQlNETF9DdXJzb3IgKlxmQlNETF9DcmVhdGVDdXJzb3JcZlBcZlIoXGZCVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0NyZWF0ZSBhIGN1cnNvciB1c2luZyB0aGUgc3BlY2lmaWVkIFxmQmRhdGFcZlIgYW5kIFxmQm1hc2tcZlIgKGluIE1TQiBmb3JtYXQpXCYuIFRoZSBjdXJzb3Igd2lkdGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYml0c1wmLgorLlBQCitUaGUgY3Vyc29yIGlzIGNyZWF0ZWQgaW4gYmxhY2sgYW5kIHdoaXRlIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nOiAKKy5UUCAyMAorXGZCRGF0YSAvIE1hc2tcZlIKK1xmQlJlc3VsdGluZyBwaXhlbCBvbiBzY3JlZW5cZlIKKy5UUCAyMAorMCAvIDEKK1doaXRlCisuVFAgMjAKKzEgLyAxCitCbGFjaworLlRQIDIwCiswIC8gMAorVHJhbnNwYXJlbnQKKy5UUCAyMAorMSAvIDAKK0ludmVydGVkIGNvbG9yIGlmIHBvc3NpYmxlLCBibGFjayBpZiBub3RcJi4KKy5QUAorQ3Vyc29ycyBjcmVhdGVkIHdpdGggdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGZyZWVkIHdpdGggXGZJU0RMX0ZyZWVDdXJzb3JcZlJcJi4KKy5TSCAiRVhBTVBMRSIKKy5QUAorLm5mCitcZihDVy8qIFN0b2xlbiBmcm9tIHRoZSBtYWlsaW5nIGxpc3QgKi8KKy8qIENyZWF0ZXMgYSBuZXcgbW91c2UgY3Vyc29yIGZyb20gYW4gWFBNICovCisKKworLyogWFBNICovCitzdGF0aWMgY29uc3QgY2hhciAqYXJyb3dbXSA9IHsKKyAgLyogd2lkdGggaGVpZ2h0IG51bV9jb2xvcnMgY2hhcnNfcGVyX3BpeGVsICovCisgICIgICAgMzIgICAgMzIgICAgICAgIDMgICAgICAgICAgICAxIiwKKyAgLyogY29sb3JzICovCisgICJYIGMgIzAwMDAwMCIsCisgICJcJi4gYyAjZmZmZmZmIiwKKyAgIiAgYyBOb25lIiwKKyAgLyogcGl4ZWxzICovCisgICJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisgICJYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisgICJYXCYuWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlhcJi5cJi5YICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisgICJYXCYuXCYuXCYuWCAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisgICJYXCYuXCYuXCYuXCYuWCAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlhcJi5cJi5cJi5cJi5cJi5YICAgICAgICAgICAgICAgICAgICAgICAgICIsCisgICJYXCYuXCYuXCYuXCYuXCYuXCYuWCAgICAgICAgICAgICAgICAgICAgICAgICIsCisgICJYXCYuXCYuXCYuXCYuXCYuXCYuXCYuWCAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIlhcJi5cJi5cJi5cJi5cJi5cJi5cJi5cJi5YICAgICAgICAgICAgICAgICAgICAgICIsCisgICJYXCYuXCYuXCYuXCYuXCYuWFhYWFggICAgICAgICAgICAgICAgICAgICAiLAorICAiWFwmLlwmLlhcJi5cJi5YICAgICAgICAgICAgICAgICAgICAgICAgICIsCisgICJYXCYuWCBYXCYuXCYuWCAgICAgICAgICAgICAgICAgICAgICAgICIsCisgICJYWCAgWFwmLlwmLlggICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWCAgICBYXCYuXCYuWCAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgWFwmLlwmLlggICAgICAgICAgICAgICAgICAgICAgICIsCisgICIgICAgICBYXCYuXCYuWCAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgWFwmLlwmLlggICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICBYWCAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyAgIjAsMCIKK307CisKK3N0YXRpYyBTRExfQ3Vyc29yICppbml0X3N5c3RlbV9jdXJzb3IoY29uc3QgY2hhciAqaW1hZ2VbXSkKK3sKKyAgaW50IGksIHJvdywgY29sOworICBVaW50OCBkYXRhWzQqMzJdOworICBVaW50OCBtYXNrWzQqMzJdOworICBpbnQgaG90X3gsIGhvdF95OworCisgIGkgPSAtMTsKKyAgZm9yICggcm93PTA7IHJvdzwzMjsgKytyb3cgKSB7CisgICAgZm9yICggY29sPTA7IGNvbDwzMjsgKytjb2wgKSB7CisgICAgICBpZiAoIGNvbCAlIDggKSB7CisgICAgICAgIGRhdGFbaV0gPDw9IDE7CisgICAgICAgIG1hc2tbaV0gPDw9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICArK2k7CisgICAgICAgIGRhdGFbaV0gPSBtYXNrW2ldID0gMDsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoaW1hZ2VbNCtyb3ddW2NvbF0pIHsKKyAgICAgICAgY2FzZSBcJidYXCYnOgorICAgICAgICAgIGRhdGFbaV0gfD0gMHgwMTsKKyAgICAgICAgICBrW2ldIHw9IDB4MDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgXCYnXCYuXCYnOgorICAgICAgICAgIG1hc2tbaV0gfD0gMHgwMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBcJicgXCYnOgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBzc2NhbmYoaW1hZ2VbNCtyb3ddLCAiJWQsJWQiLCAmaG90X3gsICZob3RfeSk7CisgIHJldHVybiBTRExfQ3JlYXRlQ3Vyc29yKGRhdGEsIG1hc2ssIDMyLCAzMiwgaG90X3gsIGhvdF95KTsKK31cZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfRnJlZUN1cnNvclxmUFxmUiwgXGZJXGZCU0RMX1NldEN1cnNvclxmUFxmUiwgXGZJXGZCU0RMX1Nob3dDdXJzb3JcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlTXV0ZXguMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NyZWF0ZU11dGV4LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2NWUxYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NyZWF0ZU11dGV4LjMKQEAgLTAsMCArMSw0MyBAQAorLlRIICJTRExfQ3JlYXRlTXV0ZXgiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9DcmVhdGVNdXRleCBcLSBDcmVhdGUgYSBtdXRleAorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQlNETF9tdXRleCAqXGZCU0RMX0NyZWF0ZU11dGV4XGZQXGZSKFxmQnZvaWRcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorQ3JlYXRlIGEgbmV3LCB1bmxvY2tlZCBtdXRleFwmLgorLlNIICJFWEFNUExFUyIKKy5QUAorLm5mCitcZihDV1NETF9tdXRleCAqbXV0OworCittdXQ9U0RMX0NyZWF0ZU11dGV4KCk7CitcJi4KK1wmLgoraWYoU0RMX211dGV4UChtdXQpPT0tMSl7CisgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuXCYndCBsb2NrIG11dGV4CisiKTsKKyAgZXhpdCgtMSk7Cit9CitcJi4KKy8qIERvIHN0dWZmIHdoaWxlIG11dGV4IGlzIGxvY2tlZCAqLworXCYuCitcJi4KK2lmKFNETF9tdXRleFYobXV0KT09LTEpeworICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkblwmJ3QgdW5sb2NrIG11dGV4CisiKTsKKyAgZXhpdCgtMSk7Cit9CisKK1NETF9EZXN0cm95TXV0ZXgobXV0KTsKK1xmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9tdXRleFBcZlBcZlIsIFxmSVxmQlNETF9tdXRleFZcZlBcZlIsIFxmSVxmQlNETF9EZXN0cm95TXV0ZXhcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlUkdCU3VyZmFjZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlUkdCU3VyZmFjZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MmI3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DcmVhdGVSR0JTdXJmYWNlLjMKQEAgLTAsMCArMSw2OSBAQAorLlRIICJTRExfQ3JlYXRlUkdCU3VyZmFjZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NyZWF0ZVJHQlN1cmZhY2UgXC0gQ3JlYXRlIGFuIGVtcHR5IFNETF9TdXJmYWNlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCU0RMX1N1cmZhY2UgKlxmQlNETF9DcmVhdGVSR0JTdXJmYWNlXGZQXGZSKFxmQlVpbnQzMiBmbGFncywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIFVpbnQzMiBSbWFzaywgVWludDMyIEdtYXNrLCBVaW50MzIgQm1hc2ssIFVpbnQzMiBBbWFza1xmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitBbGxvY2F0ZSBhbiBlbXB0eSBzdXJmYWNlIChtdXN0IGJlIGNhbGxlZCBhZnRlciBcZklTRExfU2V0VmlkZW9Nb2RlXGZSKQorLlBQCitJZiBcZkJkZXB0aFxmUiBpcyA4IGJpdHMgYW4gZW1wdHkgcGFsZXR0ZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzdXJmYWNlLCBvdGhlcndpc2UgYSBcJidwYWNrZWQtcGl4ZWxcJicgXGZJXGZCU0RMX1BpeGVsRm9ybWF0XGZSXGZSIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIFxmQltSR0JBXW1hc2tcZlJcJidzIHByb3ZpZGVkIChzZWUgXGZJXGZCU0RMX1BpeGVsRm9ybWF0XGZSXGZSKVwmLiBUaGUgXGZCZmxhZ3NcZlIgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHN1cmZhY2UgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCwgaXQgaXMgYW4gT1JcJidkIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgdmFsdWVzXCYuCisuVFAgMjAKK1xmQlNETF9TV1NVUkZBQ0VcZlAKK1NETCB3aWxsIGNyZWF0ZSB0aGUgc3VyZmFjZSBpbiBzeXN0ZW0gbWVtb3J5XCYuIFRoaXMgaW1wcm92ZXMgdGhlIHBlcmZvcm1hbmNlIG9mIHBpeGVsIGxldmVsIGFjY2VzcywgaG93ZXZlciB5b3UgbWF5IG5vdCBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIHNvbWUgdHlwZXMgb2YgaGFyZHdhcmUgYmxpdHRpbmdcJi4KKy5UUCAyMAorXGZCU0RMX0hXU1VSRkFDRVxmUAorU0RMIHdpbGwgYXR0ZW1wdCB0byBjcmVhdGUgdGhlIHN1cmZhY2UgaW4gdmlkZW8gbWVtb3J5XCYuIFRoaXMgd2lsbCBhbGxvdyBTREwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgVmlkZW8tPlZpZGVvIGJsaXRzICh3aGljaCBhcmUgb2Z0ZW4gYWNjZWxlcmF0ZWQpXCYuCisuVFAgMjAKK1xmQlNETF9TUkNDT0xPUktFWVxmUAorVGhpcyBmbGFnIHR1cm5zIG9uIGNvbG91cmtleWluZyBmb3IgYmxpdHMgZnJvbSB0aGlzIHN1cmZhY2VcJi4gSWYgXGZCU0RMX0hXU1VSRkFDRVxmUCBpcyBhbHNvIHNwZWNpZmllZCBhbmQgY29sb3Vya2V5ZWQgYmxpdHMgYXJlIGhhcmR3YXJlLWFjY2VsZXJhdGVkLCB0aGVuIFNETCB3aWxsIGF0dGVtcHQgdG8gcGxhY2UgdGhlIHN1cmZhY2UgaW4gdmlkZW8gbWVtb3J5XCYuIFVzZSBcZklcZkJTRExfU2V0Q29sb3JLZXlcZlBcZlIgdG8gc2V0IG9yIGNsZWFyIHRoaXMgZmxhZyBhZnRlciBzdXJmYWNlIGNyZWF0aW9uXCYuCisuVFAgMjAKK1xmQlNETF9TUkNBTFBIQVxmUAorVGhpcyBmbGFnIHR1cm5zIG9uIGFscGhhLWJsZW5kaW5nIGZvciBibGl0cyBmcm9tIHRoaXMgc3VyZmFjZVwmLiBJZiBcZkJTRExfSFdTVVJGQUNFXGZQIGlzIGFsc28gc3BlY2lmaWVkIGFuZCBhbHBoYS1ibGVuZGluZyBibGl0cyBhcmUgaGFyZHdhcmUtYWNjZWxlcmF0ZWQsIHRoZW4gdGhlIHN1cmZhY2Ugd2lsbCBiZSBwbGFjZWQgaW4gdmlkZW8gbWVtb3J5IGlmIHBvc3NpYmxlXCYuIFVzZSBcZklcZkJTRExfU2V0QWxwaGFcZlBcZlIgdG8gc2V0IG9yIGNsZWFyIHRoaXMgZmxhZyBhZnRlciBzdXJmYWNlIGNyZWF0aW9uXCYuCisuUFAKKy5SUworXGZCTm90ZTogIAorLlBQCitJZiBhbiBhbHBoYS1jaGFubmVsIGlzIHNwZWNpZmllZCAodGhhdCBpcywgaWYgXGZCQW1hc2tcZlIgaXMgbm9uemVybyksIHRoZW4gdGhlIFxmQlNETF9TUkNBTFBIQVxmUCBmbGFnIGlzIGF1dG9tYXRpY2FsbHkgc2V0XCYuIFlvdSBtYXkgcmVtb3ZlIHRoaXMgZmxhZyBieSBjYWxsaW5nIFxmSVxmQlNETF9TZXRBbHBoYVxmUFxmUiBhZnRlciBzdXJmYWNlIGNyZWF0aW9uXCYuCisuUkUKKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIHRoZSBjcmVhdGVkIHN1cmZhY2UsIG9yIFxmQk5VTExcZlIgdXBvbiBlcnJvclwmLgorLlNIICJFWEFNUExFIgorLlBQCisubmYKK1xmKENXICAgIC8qIENyZWF0ZSBhIDMyLWJpdCBzdXJmYWNlIHdpdGggdGhlIGJ5dGVzIG9mIGVhY2ggcGl4ZWwgaW4gUixHLEIsQSBvcmRlciwKKyAgICAgICBhcyBleHBlY3RlZCBieSBPcGVuR0wgZm9yIHRleHR1cmVzICovCisgICAgU0RMX1N1cmZhY2UgKnN1cmZhY2U7CisgICAgVWludDMyIHJtYXNrLCBnbWFzaywgYm1hc2ssIGFtYXNrOworCisgICAgLyogU0RMIGludGVycHJldHMgZWFjaCBwaXhlbCBhcyBhIDMyLWJpdCBudW1iZXIsIHNvIG91ciBtYXNrcyBtdXN0IGRlcGVuZAorICAgICAgIG9uIHRoZSBlbmRpYW5uZXNzIChieXRlIG9yZGVyKSBvZiB0aGUgbWFjaGluZSAqLworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KKyAgICBybWFzayA9IDB4ZmYwMDAwMDA7CisgICAgZ21hc2sgPSAweDAwZmYwMDAwOworICAgIGJtYXNrID0gMHgwMDAwZmYwMDsKKyAgICBhbWFzayA9IDB4MDAwMDAwZmY7CisjZWxzZQorICAgIHJtYXNrID0gMHgwMDAwMDBmZjsKKyAgICBnbWFzayA9IDB4MDAwMGZmMDA7CisgICAgYm1hc2sgPSAweDAwZmYwMDAwOworICAgIGFtYXNrID0gMHhmZjAwMDAwMDsKKyNlbmRpZgorCisgICAgc3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsIHdpZHRoLCBoZWlnaHQsIDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWFzaywgZ21hc2ssIGJtYXNrLCBhbWFzayk7CisgICAgaWYoc3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ3JlYXRlUkdCU3VyZmFjZSBmYWlsZWQ6ICVzCisiLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfVxmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVSR0JTdXJmYWNlRnJvbVxmUFxmUiwgXGZJXGZCU0RMX0ZyZWVTdXJmYWNlXGZQXGZSLCBcZklcZkJTRExfU2V0VmlkZW9Nb2RlXGZQXGZSLCBcZklcZkJTRExfTG9ja1N1cmZhY2VcZlBcZlIsIFxmSVxmQlNETF9QaXhlbEZvcm1hdFxmUlxmUiwgXGZJXGZCU0RMX1N1cmZhY2VcZlJcZlIgXGZJXGZCU0RMX1NldEFscGhhXGZQXGZSIFxmSVxmQlNETF9TZXRDb2xvcktleVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DcmVhdGVSR0JTdXJmYWNlRnJvbS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlUkdCU3VyZmFjZUZyb20uMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzMwYzFiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlUkdCU3VyZmFjZUZyb20uMwpAQCAtMCwwICsxLDIyIEBACisuVEggIlNETF9DcmVhdGVSR0JTdXJmYWNlRnJvbSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tIFwtIENyZWF0ZSBhbiBTRExfU3VyZmFjZSBmcm9tIHBpeGVsIGRhdGEKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJTRExfU3VyZmFjZSAqXGZCU0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tXGZQXGZSKFxmQnZvaWQgKnBpeGVscywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBwaXRjaCwgVWludDMyIFJtYXNrLCBVaW50MzIgR21hc2ssIFVpbnQzMiBCbWFzaywgVWludDMyIEFtYXNrXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0NyZWF0ZXMgYW4gU0RMX1N1cmZhY2UgZnJvbSB0aGUgcHJvdmlkZWQgcGl4ZWwgZGF0YVwmLgorLlBQCitUaGUgZGF0YSBzdG9yZWQgaW4gXGZCcGl4ZWxzXGZSIGlzIGFzc3VtZWQgdG8gYmUgb2YgdGhlIFxmQmRlcHRoXGZSIHNwZWNpZmllZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3RcJi4gVGhlIHBpeGVsIGRhdGEgaXMgbm90IGNvcGllZCBpbnRvIHRoZSBcZkJTRExfU3VyZmFjZVxmUiBzdHJ1Y3R1cmUgc28gaXQgc2hvdWxkIG5vdCBiZSBmcmVlZCB1bnRpbCB0aGUgc3VyZmFjZSBoYXMgYmVlbiBmcmVlZCB3aXRoIGEgY2FsbGVkIHRvIFxmSVNETF9GcmVlU3VyZmFjZVxmUlwmLiBcZkJwaXRjaFxmUiBpcyB0aGUgbGVuZ3RoIG9mIGVhY2ggc2NhbmxpbmUgaW4gYnl0ZXNcJi4gCisuUFAKK1NlZSBcZklcZkJTRExfQ3JlYXRlUkdCU3VyZmFjZVxmUFxmUiBmb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBvdGhlciBwYXJhbWV0ZXJzXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyB0aGUgY3JlYXRlZCBzdXJmYWNlLCBvciBcZkJOVUxMXGZSIHVwb24gZXJyb3JcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVSR0JTdXJmYWNlXGZQXGZSLCBcZklcZkJTRExfRnJlZVN1cmZhY2VcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlU2VtYXBob3JlLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DcmVhdGVTZW1hcGhvcmUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODAzZWFkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlU2VtYXBob3JlLjMKQEAgLTAsMCArMSwzMiBAQAorLlRIICJTRExfQ3JlYXRlU2VtYXBob3JlIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQ3JlYXRlU2VtYXBob3JlIFwtIENyZWF0ZXMgYSBuZXcgc2VtYXBob3JlIGFuZCBhc3NpZ25zIGFuIGluaXRpYWwgdmFsdWUgdG8gaXRcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorI2luY2x1ZGUgIlNETF90aHJlYWRcJi5oIgorLnNwCitcZkJTRExfc2VtICpcZkJTRExfQ3JlYXRlU2VtYXBob3JlXGZQXGZSKFxmQlVpbnQzMiBpbml0aWFsX3ZhbHVlXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9DcmVhdGVTZW1hcGhvcmUoKVxmUCBjcmVhdGVzIGEgbmV3IHNlbWFwaG9yZSBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCB0aGUgdmFsdWUgXGZCaW5pdGlhbF92YWx1ZVxmUlwmLiBFYWNoIGxvY2tpbmcgb3BlcmF0aW9uIG9uIHRoZSBzZW1hcGhvcmUgYnkgXGZJU0RMX1NlbVdhaXRcZlIsIFxmSVNETF9TZW1UcnlXYWl0XGZSIG9yIFxmSVNETF9TZW1XYWl0VGltZW91dFxmUiB3aWxsIGF0b21pY2FsbHkgZGVjcmVtZW50IHRoZSBzZW1hcGhvcmUgdmFsdWVcJi4gVGhlIGxvY2tpbmcgb3BlcmF0aW9uIHdpbGwgYmUgYmxvY2tlZCBpZiB0aGUgc2VtYXBob3JlIHZhbHVlIGlzIG5vdCBwb3NpdGl2ZSAoZ3JlYXRlciB0aGFuIHplcm8pXCYuIEVhY2ggdW5sb2NrIG9wZXJhdGlvbiBieSBcZklTRExfU2VtUG9zdFxmUiB3aWxsIGF0b21pY2FsbHkgaW5jcmVtZW50IHRoZSBzZW1hcGhvcmUgdmFsdWVcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBpbml0aWFsaXplZCBzZW1hcGhvcmUgb3IgXGZCTlVMTFxmUiBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcJi4KKy5TSCAiRVhBTVBMRVMiCisuUFAKKy5QUAorLm5mCitcZihDV1NETF9zZW0gKm15X3NlbTsKKworbXlfc2VtID0gU0RMX0NyZWF0ZVNlbWFwaG9yZShJTklUSUFMX1NFTV9WQUxVRSk7CisKK2lmIChteV9zZW0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQ1JFQVRFX1NFTV9GQUlMRUQ7Cit9XGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0Rlc3Ryb3lTZW1hcGhvcmVcZlBcZlIsIFxmSVxmQlNETF9TZW1XYWl0XGZQXGZSLCBcZklcZkJTRExfU2VtVHJ5V2FpdFxmUFxmUiwgXGZJXGZCU0RMX1NlbVdhaXRUaW1lb3V0XGZQXGZSLCBcZklcZkJTRExfU2VtUG9zdFxmUFxmUiwgXGZJXGZCU0RMX1NlbVZhbHVlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NyZWF0ZVRocmVhZC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfQ3JlYXRlVGhyZWFkLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5ZTc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NyZWF0ZVRocmVhZC4zCkBAIC0wLDAgKzEsMTYgQEAKKy5USCAiU0RMX0NyZWF0ZVRocmVhZCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0NyZWF0ZVRocmVhZCBcLSBDcmVhdGVzIGEgbmV3IHRocmVhZCBvZiBleGVjdXRpb24gdGhhdCBzaGFyZXMgaXRzIHBhcmVudFwmJ3MgcHJvcGVydGllc1wmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQlNETF9UaHJlYWQgKlxmQlNETF9DcmVhdGVUaHJlYWRcZlBcZlIoXGZCaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmRhdGFcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX0NyZWF0ZVRocmVhZFxmUCBjcmVhdGVzIGEgbmV3IHRocmVhZCBvZiBleGVjdXRpb24gdGhhdCBzaGFyZXMgYWxsIG9mIGl0cyBwYXJlbnRcJidzIGdsb2JhbCBtZW1vcnksIHNpZ25hbCBoYW5kbGVycywgZmlsZSBkZXNjcmlwdG9ycywgZXRjLCBhbmQgcnVucyB0aGUgZnVuY3Rpb24gXGZCZm5cZlIgcGFzc2VkIHRoZSB2b2lkIHBvaW50ZXIgXGZCZGF0YVxmUiBUaGUgdGhyZWFkIHF1aXRzIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfS2lsbFRocmVhZFxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DcmVhdGVZVVZPdmVybGF5LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9DcmVhdGVZVVZPdmVybGF5LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhNmJjOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0NyZWF0ZVlVVk92ZXJsYXkuMwpAQCAtMCwwICsxLDE3IEBACisuVEggIlNETF9DcmVhdGVZVVZPdmVybGF5IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfQ3JlYXRlWVVWT3ZlcmxheSBcLSBDcmVhdGUgYSBZVVYgdmlkZW8gb3ZlcmxheQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQlNETF9PdmVybGF5ICpcZkJTRExfQ3JlYXRlWVVWT3ZlcmxheVxmUFxmUihcZkJpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9DcmVhdGVZVVZPdmVybGF5XGZQIGNyZWF0ZXMgYSBZVVYgb3ZlcmxheSBvZiB0aGUgc3BlY2lmaWVkIFxmQndpZHRoXGZSLCBcZkJoZWlnaHRcZlIgYW5kIFxmQmZvcm1hdFxmUiAoc2VlIFxmSVxmQlNETF9PdmVybGF5XGZSXGZSIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIGZvcm1hdHMpLCBmb3IgdGhlIHByb3ZpZGVkIFxmQmRpc3BsYXlcZlJcJi4gQSBcZklcZkJTRExfT3ZlcmxheVxmUlxmUiBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWRcJi4KKy5QUAorVGhlIHRlcm0gXCYnb3ZlcmxheVwmJyBpcyBhIG1pc25vbWVyIHNpbmNlLCB1bmxlc3MgdGhlIG92ZXJsYXkgaXMgY3JlYXRlZCBpbiBoYXJkd2FyZSwgdGhlIGNvbnRlbnRzIGZvciB0aGUgZGlzcGxheSBzdXJmYWNlIHVuZGVybmVhdGggdGhlIGFyZWEgd2hlcmUgdGhlIG92ZXJsYXkgaXMgc2hvd24gd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBvdmVybGF5IGlzIGRpc3BsYXllZFwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX092ZXJsYXlcZlJcZlIsIFxmSVxmQlNETF9EaXNwbGF5WVVWT3ZlcmxheVxmUFxmUiwgXGZJXGZCU0RMX0ZyZWVZVVZPdmVybGF5XGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0RlbGF5LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9EZWxheS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTgwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9EZWxheS4zCkBAIC0wLDAgKzEsMjEgQEAKKy5USCAiU0RMX0RlbGF5IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfRGVsYXkgXC0gV2FpdCBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSByZXR1cm5pbmdcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9EZWxheVxmUFxmUihcZkJVaW50MzIgbXNcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorV2FpdCBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSByZXR1cm5pbmdcJi4gXGZCU0RMX0RlbGF5XGZQIHdpbGwgd2FpdCBhdCBcZklsZWFzdFxmUCB0aGUgc3BlY2lmaWVkIHRpbWUsIGJ1dCBwb3NzaWJsZSBsb25nZXIgZHVlIHRvIE9TIHNjaGVkdWxpbmdcJi4KKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK0NvdW50IG9uIGEgZGVsYXkgZ3JhbnVsYXJpdHkgb2YgXGZJYXQgbGVhc3RcZlAgMTAgbXNcJi4gU29tZSBwbGF0Zm9ybXMgaGF2ZSBzaG9ydGVyIGNsb2NrIHRpY2tzIGJ1dCB0aGlzIGlzIHRoZSBtb3N0IGNvbW1vblwmLgorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQWRkVGltZXJcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRGVzdHJveUNvbmQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0Rlc3Ryb3lDb25kLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4YjlkMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0Rlc3Ryb3lDb25kLjMKQEAgLTAsMCArMSwxNiBAQAorLlRIICJTRExfRGVzdHJveUNvbmQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9EZXN0cm95Q29uZCBcLSBEZXN0cm95IGEgY29uZGl0aW9uIHZhcmlhYmxlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfRGVzdHJveUNvbmRcZlBcZlIoXGZCU0RMX2NvbmQgKmNvbmRcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorRGVzdHJveXMgYSBjb25kaXRpb24gdmFyaWFibGVcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVDb25kXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0Rlc3Ryb3lNdXRleC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRGVzdHJveU11dGV4LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4MmU0OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0Rlc3Ryb3lNdXRleC4zCkBAIC0wLDAgKzEsMTYgQEAKKy5USCAiU0RMX0Rlc3Ryb3lNdXRleCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0Rlc3Ryb3lNdXRleCBcLSBEZXN0cm95IGEgbXV0ZXgKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorI2luY2x1ZGUgIlNETF90aHJlYWRcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9EZXN0cm95TXV0ZXhcZlBcZlIoXGZCU0RMX211dGV4ICptdXRleFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitEZXN0cm95IGEgcHJldmlvdXNseSBcZkljcmVhdGVkXGZSIG11dGV4XCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ3JlYXRlTXV0ZXhcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRGVzdHJveVNlbWFwaG9yZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRGVzdHJveVNlbWFwaG9yZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjMzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9EZXN0cm95U2VtYXBob3JlLjMKQEAgLTAsMCArMSwyNiBAQAorLlRIICJTRExfRGVzdHJveVNlbWFwaG9yZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0Rlc3Ryb3lTZW1hcGhvcmUgXC0gRGVzdHJveXMgYSBzZW1hcGhvcmUgdGhhdCB3YXMgY3JlYXRlZCBieSBcZklTRExfQ3JlYXRlU2VtYXBob3JlXGZSXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfRGVzdHJveVNlbWFwaG9yZVxmUFxmUihcZkJTRExfc2VtICpzZW1cZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX0Rlc3Ryb3lTZW1hcGhvcmVcZlAgZGVzdHJveXMgdGhlIHNlbWFwaG9yZSBwb2ludGVkIHRvIGJ5IFxmQnNlbVxmUiB0aGF0IHdhcyBjcmVhdGVkIGJ5IFxmSVxmQlNETF9DcmVhdGVTZW1hcGhvcmVcZlBcZlJcJi4gSXQgaXMgbm90IHNhZmUgdG8gZGVzdHJveSBhIHNlbWFwaG9yZSBpZiB0aGVyZSBhcmUgdGhyZWFkcyBjdXJyZW50bHkgYmxvY2tlZCB3YWl0aW5nIG9uIGl0XCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisuUFAKKy5uZgorXGYoQ1dpZiAobXlfc2VtICE9IE5VTEwpIHsKKyAgICAgICAgU0RMX0Rlc3Ryb3lTZW1hcGhvcmUobXlfc2VtKTsKKyAgICAgICAgbXlfc2VtID0gTlVMTDsKK31cZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ3JlYXRlU2VtYXBob3JlXGZQXGZSLCBcZklcZkJTRExfU2VtV2FpdFxmUFxmUiwgXGZJXGZCU0RMX1NlbVRyeVdhaXRcZlBcZlIsIFxmSVxmQlNETF9TZW1XYWl0VGltZW91dFxmUFxmUiwgXGZJXGZCU0RMX1NlbVBvc3RcZlBcZlIsIFxmSVxmQlNETF9TZW1WYWx1ZVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9EaXNwbGF5Rm9ybWF0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9EaXNwbGF5Rm9ybWF0LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExNmUyYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0Rpc3BsYXlGb3JtYXQuMwpAQCAtMCwwICsxLDIyIEBACisuVEggIlNETF9EaXNwbGF5Rm9ybWF0IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfRGlzcGxheUZvcm1hdCBcLSBDb252ZXJ0IGEgc3VyZmFjZSB0byB0aGUgZGlzcGxheSBmb3JtYXQKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJTRExfU3VyZmFjZSAqXGZCU0RMX0Rpc3BsYXlGb3JtYXRcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnN1cmZhY2VcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHN1cmZhY2UgYW5kIGNvcGllcyBpdCB0byBhIG5ldyBzdXJmYWNlIG9mIHRoZSBwaXhlbCBmb3JtYXQgYW5kIGNvbG9ycyBvZiB0aGUgdmlkZW8gZnJhbWVidWZmZXIsIHN1aXRhYmxlIGZvciBmYXN0IGJsaXR0aW5nIG9udG8gdGhlIGRpc3BsYXkgc3VyZmFjZVwmLiBJdCBjYWxscyBcZklTRExfQ29udmVydFN1cmZhY2VcZlIKKy5QUAorSWYgeW91IHdhbnQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFyZHdhcmUgY29sb3JrZXkgb3IgYWxwaGEgYmxpdCBhY2NlbGVyYXRpb24sIHlvdSBzaG91bGQgc2V0IHRoZSBjb2xvcmtleSBhbmQgYWxwaGEgdmFsdWUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvblwmLgorLlBQCitJZiB5b3Ugd2FudCBhbiBhbHBoYSBjaGFubmVsLCBzZWUgXGZJU0RMX0Rpc3BsYXlGb3JtYXRBbHBoYVxmUlwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK0lmIHRoZSBjb252ZXJzaW9uIGZhaWxzIG9yIHJ1bnMgb3V0IG9mIG1lbW9yeSwgaXQgcmV0dXJucyBcZkJOVUxMXGZSCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ29udmVydFN1cmZhY2VcZlBcZlIsIFxmSVxmQlNETF9EaXNwbGF5Rm9ybWF0QWxwaGFcZlBcZlIgXGZJXGZCU0RMX1NldEFscGhhXGZQXGZSLCBcZklcZkJTRExfU2V0Q29sb3JLZXlcZlBcZlIsIFxmSVxmQlNETF9TdXJmYWNlXGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0Rpc3BsYXlGb3JtYXRBbHBoYS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRGlzcGxheUZvcm1hdEFscGhhLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZGRkNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0Rpc3BsYXlGb3JtYXRBbHBoYS4zCkBAIC0wLDAgKzEsMjIgQEAKKy5USCAiU0RMX0Rpc3BsYXlGb3JtYXRBbHBoYSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0Rpc3BsYXlGb3JtYXRBbHBoYSBcLSBDb252ZXJ0IGEgc3VyZmFjZSB0byB0aGUgZGlzcGxheSBmb3JtYXQKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJTRExfU3VyZmFjZSAqXGZCU0RMX0Rpc3BsYXlGb3JtYXRBbHBoYVxmUFxmUihcZkJTRExfU3VyZmFjZSAqc3VyZmFjZVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc3VyZmFjZSBhbmQgY29waWVzIGl0IHRvIGEgbmV3IHN1cmZhY2Ugb2YgdGhlIHBpeGVsIGZvcm1hdCBhbmQgY29sb3JzIG9mIHRoZSB2aWRlbyBmcmFtZWJ1ZmZlciBwbHVzIGFuIGFscGhhIGNoYW5uZWwsIHN1aXRhYmxlIGZvciBmYXN0IGJsaXR0aW5nIG9udG8gdGhlIGRpc3BsYXkgc3VyZmFjZVwmLiBJdCBjYWxscyBcZklTRExfQ29udmVydFN1cmZhY2VcZlIKKy5QUAorSWYgeW91IHdhbnQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFyZHdhcmUgY29sb3JrZXkgb3IgYWxwaGEgYmxpdCBhY2NlbGVyYXRpb24sIHlvdSBzaG91bGQgc2V0IHRoZSBjb2xvcmtleSBhbmQgYWxwaGEgdmFsdWUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvblwmLgorLlBQCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSBjb2xvdXJrZXkgdG8gYW4gYWxwaGEgY2hhbm5lbCwgaWYgdGhlIFxmQlNETF9TUkNDT0xPUktFWVxmUCBmbGFnIGlzIHNldCBvbiB0aGUgc3VyZmFjZVwmLiBUaGUgZ2VuZXJhdGVkIHN1cmZhY2Ugd2lsbCB0aGVuIGJlIHRyYW5zcGFyZW50IChhbHBoYT0wKSB3aGVyZSB0aGUgcGl4ZWxzIG1hdGNoIHRoZSBjb2xvdXJrZXksIGFuZCBvcGFxdWUgKGFscGhhPTI1NSkgZWxzZXdoZXJlXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMgb3IgcnVucyBvdXQgb2YgbWVtb3J5LCBpdCByZXR1cm5zIFxmQk5VTExcZlIKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVNETF9Db252ZXJ0U3VyZmFjZVxmUiwgXGZJU0RMX1NldEFscGhhXGZSLCBcZklTRExfU2V0Q29sb3JLZXlcZlIsIFxmSVNETF9EaXNwbGF5Rm9ybWF0XGZSLCBcZklTRExfU3VyZmFjZVxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9EaXNwbGF5WVVWT3ZlcmxheS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRGlzcGxheVlVVk92ZXJsYXkuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODlkOTRjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRGlzcGxheVlVVk92ZXJsYXkuMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9EaXNwbGF5WVVWT3ZlcmxheSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0Rpc3BsYXlZVVZPdmVybGF5IFwtIEJsaXQgdGhlIG92ZXJsYXkgdG8gdGhlIGRpc3BsYXkKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX0Rpc3BsYXlZVVZPdmVybGF5XGZQXGZSKFxmQlNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqZHN0cmVjdFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitCbGl0IHRoZSBcZkJvdmVybGF5XGZSIHRvIHRoZSBzdXJmYWNlIHNwZWNpZmllZCB3aGVuIGl0IHdhcyBcZkljcmVhdGVkXGZSXCYuIFRoZSBcZklcZkJTRExfUmVjdFxmUlxmUiBzdHJ1Y3R1cmUsIFxmQmRzdHJlY3RcZlIsIHNwZWNpZmllcyB0aGUgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uXCYuIElmIHRoZSBcZkJkc3RyZWN0XGZSIGlzIGEgbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiB0aGUgb3ZlcmxheSB0aGVuIHRoZSBvdmVybGF5IHdpbGwgYmUgc2NhbGVkLCB0aGlzIGlzIG9wdGltaXplZCBmb3IgMnggc2NhbGluZ1wmLgorLlNIICJSRVRVUk4gVkFMVUVTIgorLlBQCitSZXR1cm5zIDAgb24gc3VjY2VzcworLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX092ZXJsYXlcZlJcZlIsIFxmSVxmQlNETF9DcmVhdGVZVVZPdmVybGF5XGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0VuYWJsZUtleVJlcGVhdC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRW5hYmxlS2V5UmVwZWF0LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0YjIzMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0VuYWJsZUtleVJlcGVhdC4zCkBAIC0wLDAgKzEsMTcgQEAKKy5USCAiU0RMX0VuYWJsZUtleVJlcGVhdCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU5IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0VuYWJsZUtleVJlcGVhdCBcLSBTZXQga2V5Ym9hcmQgcmVwZWF0IHJhdGVcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX0VuYWJsZUtleVJlcGVhdFxmUFxmUihcZkJpbnQgZGVsYXksIGludCBpbnRlcnZhbFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBrZXlib2FyZCByZXBlYXQgcmF0ZVwmLiBcZkJkZWxheVxmUiBzcGVjaWZpZXMgaG93IGxvbmcgdGhlIGtleSBtdXN0IGJlIHByZXNzZWQgYmVmb3JlIGl0IGJlZ2lucyByZXBlYXRpbmcsIGl0IHRoZW4gcmVwZWF0cyBhdCB0aGUgc3BlZWQgc3BlY2lmaWVkIGJ5IFxmQmludGVydmFsXGZSXCYuIEJvdGggXGZCZGVsYXlcZlIgYW5kIFxmQmludGVydmFsXGZSIGFyZSBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzXCYuCisuUFAKK1NldHRpbmcgXGZCZGVsYXlcZlIgdG8gMCBkaXNhYmxlcyBrZXkgcmVwZWF0aW5nIGNvbXBsZXRlbHlcJi4gR29vZCBkZWZhdWx0IHZhbHVlcyBhcmUgXGZCU0RMX0RFRkFVTFRfUkVQRUFUX0RFTEFZXGZQIGFuZCBcZklTRExfREVGQVVMVF9SRVBFQVRfSU5URVJWQUxcZlBcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIFxmQjBcZlIgb24gc3VjY2VzcyBhbmQgXGZCLTFcZlIgb24gZmFpbHVyZVwmLgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9FbmFibGVVTklDT0RFLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9FbmFibGVVTklDT0RFLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkMjAyNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0VuYWJsZVVOSUNPREUuMwpAQCAtMCwwICsxLDI0IEBACisuVEggIlNETF9FbmFibGVVTklDT0RFIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfRW5hYmxlVU5JQ09ERSBcLSBFbmFibGUgVU5JQ09ERSB0cmFuc2xhdGlvbgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfRW5hYmxlVU5JQ09ERVxmUFxmUihcZkJpbnQgZW5hYmxlXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0VuYWJsZXMvRGlzYWJsZXMgVW5pY29kZSBrZXlib2FyZCB0cmFuc2xhdGlvblwmLgorLlBQCitUbyBvYnRhaW4gdGhlIGNoYXJhY3RlciBjb2RlcyBjb3JyZXNwb25kaW5nIHRvIHJlY2VpdmVkIGtleWJvYXJkIGV2ZW50cywgVW5pY29kZSB0cmFuc2xhdGlvbiBtdXN0IGZpcnN0IGJlIHR1cm5lZCBvbiB1c2luZyB0aGlzIGZ1bmN0aW9uXCYuIFRoZSB0cmFuc2xhdGlvbiBpbmN1cnMgYSBzbGlnaHQgb3ZlcmhlYWQgZm9yIGVhY2gga2V5Ym9hcmQgZXZlbnQgYW5kIGlzIHRoZXJlZm9yZSBkaXNhYmxlZCBieSBkZWZhdWx0XCYuIEZvciBlYWNoIHN1YnNlcXVlbnRseSByZWNlaXZlZCBrZXkgZG93biBldmVudCwgdGhlIFxmQnVuaWNvZGVcZlIgbWVtYmVyIG9mIHRoZSBcZklcZkJTRExfa2V5c3ltXGZSXGZSIHN0cnVjdHVyZSB3aWxsIHRoZW4gY29udGFpbiB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgY29kZSwgb3IgemVybyBmb3Iga2V5c3ltcyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIGFueSBjaGFyYWN0ZXIgY29kZVwmLgorLlBQCitBIHZhbHVlIG9mIDEgZm9yIFxmQmVuYWJsZVxmUiBlbmFibGVzIFVuaWNvZGUgdHJhbnNsYXRpb247IDAgZGlzYWJsZXMgaXQsIGFuZCAtMSBsZWF2ZXMgaXQgdW5jaGFuZ2VkICh1c2VmdWwgZm9yIHF1ZXJ5aW5nIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIG1vZGUpXCYuCisuUFAKK05vdGUgdGhhdCBvbmx5IGtleSBwcmVzcyBldmVudHMgd2lsbCBiZSB0cmFuc2xhdGVkLCBub3QgcmVsZWFzZSBldmVudHNcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIHRoZSBwcmV2aW91cyB0cmFuc2xhdGlvbiBtb2RlIChcZkIwXGZSIG9yIFxmQjFcZlIpXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfa2V5c3ltXGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0V2ZW50LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9FdmVudC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDhmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9FdmVudC4zCkBAIC0wLDAgKzEsMTgyIEBACisuVEggIlNETF9FdmVudCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU5IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0V2ZW50IFwtIEdlbmVyYWwgZXZlbnQgc3RydWN0dXJlCisuU0ggIlNUUlVDVFVSRSBERUZJTklUSU9OIgorLlBQCisubmYKK1xmKENXdHlwZWRlZiB1bmlvbnsKKyAgVWludDggdHlwZTsKKyAgU0RMX0FjdGl2ZUV2ZW50IGFjdGl2ZTsKKyAgU0RMX0tleWJvYXJkRXZlbnQga2V5OworICBTRExfTW91c2VNb3Rpb25FdmVudCBtb3Rpb247CisgIFNETF9Nb3VzZUJ1dHRvbkV2ZW50IGJ1dHRvbjsKKyAgU0RMX0pveUF4aXNFdmVudCBqYXhpczsKKyAgU0RMX0pveUJhbGxFdmVudCBqYmFsbDsKKyAgU0RMX0pveUhhdEV2ZW50IGpoYXQ7CisgIFNETF9Kb3lCdXR0b25FdmVudCBqYnV0dG9uOworICBTRExfUmVzaXplRXZlbnQgcmVzaXplOworICBTRExfRXhwb3NlRXZlbnQgZXhwb3NlOworICBTRExfUXVpdEV2ZW50IHF1aXQ7CisgIFNETF9Vc2VyRXZlbnQgdXNlcjsKKyAgU0RMX1N5c1dNRXZlbnQgc3lzd207Cit9IFNETF9FdmVudDtcZlIKKy5maQorLlBQCisuU0ggIlNUUlVDVFVSRSBEQVRBIgorLlRQIDIwCitcZkJ0eXBlXGZSCitUaGUgdHlwZSBvZiBldmVudAorLlRQIDIwCitcZkJhY3RpdmVcZlIKK1xmSUFjdGl2YXRpb24gZXZlbnRcZlIKKy5UUCAyMAorXGZCa2V5XGZSCitcZklLZXlib2FyZCBldmVudFxmUgorLlRQIDIwCitcZkJtb3Rpb25cZlIKK1xmSU1vdXNlIG1vdGlvbiBldmVudFxmUgorLlRQIDIwCitcZkJidXR0b25cZlIKK1xmSU1vdXNlIGJ1dHRvbiBldmVudFxmUgorLlRQIDIwCitcZkJqYXhpc1xmUgorXGZJSm95c3RpY2sgYXhpcyBtb3Rpb24gZXZlbnRcZlIKKy5UUCAyMAorXGZCamJhbGxcZlIKK1xmSUpveXN0aWNrIHRyYWNrYmFsbCBtb3Rpb24gZXZlbnRcZlIKKy5UUCAyMAorXGZCamhhdFxmUgorXGZJSm95c3RpY2sgaGF0IG1vdGlvbiBldmVudFxmUgorLlRQIDIwCitcZkJqYnV0dG9uXGZSCitcZklKb3lzdGljayBidXR0b24gZXZlbnRcZlIKKy5UUCAyMAorXGZCcmVzaXplXGZSCitcZklBcHBsaWNhdGlvbiB3aW5kb3cgcmVzaXplIGV2ZW50XGZSCisuVFAgMjAKK1xmQmV4cG9zZVxmUgorXGZJQXBwbGljYXRpb24gd2luZG93IGV4cG9zZSBldmVudFxmUgorLlRQIDIwCitcZkJxdWl0XGZSCitcZklBcHBsaWNhdGlvbiBxdWl0IHJlcXVlc3QgZXZlbnRcZlIKKy5UUCAyMAorXGZCdXNlclxmUgorXGZJVXNlciBkZWZpbmVkIGV2ZW50XGZSCisuVFAgMjAKK1xmQnN5c3dtXGZSCitcZklVbmRlZmluZWQgd2luZG93IG1hbmFnZXIgZXZlbnRcZlIKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoZSBcZkJTRExfRXZlbnRcZlIgdW5pb24gaXMgdGhlIGNvcmUgdG8gYWxsIGV2ZW50IGhhbmRsaW5nIGlzIFNETCwgaXRzIHByb2JhYmx5IHRoZSBtb3N0IGltcG9ydGFudCBzdHJ1Y3R1cmUgYWZ0ZXIgXGZCU0RMX1N1cmZhY2VcZlJcJi4gXGZCU0RMX0V2ZW50XGZSIGlzIGEgdW5pb24gb2YgYWxsIGV2ZW50IHN0cnVjdHVyZXMgdXNlZCBpbiBTREwsIHVzaW5nIGl0IGlzIGEgc2ltcGxlIG1hdHRlciBvZiBrbm93aW5nIHdoaWNoIHVuaW9uIG1lbWJlciByZWxhdGVzIHRvIHdoaWNoIGV2ZW50IFxmQnR5cGVcZlJcJi4KKy5QUAorLlRQIDIwCitcZkJFdmVudCBcZkJ0eXBlXGZSXGZSCitcZkJFdmVudCBTdHJ1Y3R1cmVcZlIKKy5UUCAyMAorXGZCU0RMX0FDVElWRUVWRU5UXGZQCitcZklcZkJTRExfQWN0aXZlRXZlbnRcZlJcZlIKKy5UUCAyMAorXGZCU0RMX0tFWURPV04vVVBcZlAKK1xmSVxmQlNETF9LZXlib2FyZEV2ZW50XGZSXGZSCisuVFAgMjAKK1xmQlNETF9NT1VTRU1PVElPTlxmUAorXGZJXGZCU0RMX01vdXNlTW90aW9uRXZlbnRcZlJcZlIKKy5UUCAyMAorXGZCU0RMX01PVVNFQlVUVE9ORE9XTi9VUFxmUAorXGZJXGZCU0RMX01vdXNlQnV0dG9uRXZlbnRcZlJcZlIKKy5UUCAyMAorXGZCU0RMX0pPWUFYSVNNT1RJT05cZlAKK1xmSVxmQlNETF9Kb3lBeGlzRXZlbnRcZlJcZlIKKy5UUCAyMAorXGZCU0RMX0pPWUJBTExNT1RJT05cZlAKK1xmSVxmQlNETF9Kb3lCYWxsRXZlbnRcZlJcZlIKKy5UUCAyMAorXGZCU0RMX0pPWUhBVE1PVElPTlxmUAorXGZJXGZCU0RMX0pveUhhdEV2ZW50XGZSXGZSCisuVFAgMjAKK1xmQlNETF9KT1lCVVRUT05ET1dOL1VQXGZQCitcZklcZkJTRExfSm95QnV0dG9uRXZlbnRcZlJcZlIKKy5UUCAyMAorXGZCU0RMX1FVSVRcZlAKK1xmSVxmQlNETF9RdWl0RXZlbnRcZlJcZlIKKy5UUCAyMAorXGZCU0RMX1NZU1dNRVZFTlRcZlAKK1xmSVxmQlNETF9TeXNXTUV2ZW50XGZSXGZSCisuVFAgMjAKK1xmQlNETF9WSURFT1JFU0laRVxmUAorXGZJXGZCU0RMX1Jlc2l6ZUV2ZW50XGZSXGZSCisuVFAgMjAKK1xmQlNETF9WSURFT0VYUE9TRVxmUAorXGZJXGZCU0RMX0V4cG9zZUV2ZW50XGZSXGZSCisuVFAgMjAKK1xmQlNETF9VU0VSRVZFTlRcZlAKK1xmSVxmQlNETF9Vc2VyRXZlbnRcZlJcZlIKKy5TSCAiVVNFIgorLlBQCitUaGUgXGZCU0RMX0V2ZW50XGZSIHN0cnVjdHVyZSBoYXMgdHdvIHVzZXMKKy5JUCAiICAgXChidSIgNgorUmVhZGluZyBldmVudHMgb24gdGhlIGV2ZW50IHF1ZXVlCisuSVAgIiAgIFwoYnUiIDYKK1BsYWNpbmcgZXZlbnRzIG9uIHRoZSBldmVudCBxdWV1ZQorLlBQCitSZWFkaW5nIGV2ZW50cyBmcm9tIHRoZSBldmVudCBxdWV1ZSBpcyBkb25lIHdpdGggZWl0aGVyIFxmSVxmQlNETF9Qb2xsRXZlbnRcZlBcZlIgb3IgXGZJXGZCU0RMX1BlZXBFdmVudHNcZlBcZlJcJi4gV2VcJidsbCB1c2UgXGZCU0RMX1BvbGxFdmVudFxmUCBhbmQgc3RlcCB0aHJvdWdoIGFuIGV4YW1wbGVcJi4KKy5QUAorRmlyc3Qgb2ZmLCB3ZSBjcmVhdGUgYW4gZW1wdHkgXGZCU0RMX0V2ZW50XGZSIHN0cnVjdHVyZVwmLiAKKy5QUAorLm5mCitcZihDV1NETF9FdmVudCB0ZXN0X2V2ZW50O1xmUgorLmZpCisuUFAKKyBcZkJTRExfUG9sbEV2ZW50XGZQIHJlbW92ZXMgdGhlIG5leHQgZXZlbnQgZnJvbSB0aGUgZXZlbnQgcXVldWUsIGlmIHRoZXJlIGFyZSBubyBldmVudHMgb24gdGhlIHF1ZXVlIGl0IHJldHVybnMgXGZCMFxmUiBvdGhlcndpc2UgaXQgcmV0dXJucyBcZkIxXGZSXCYuIFdlIHVzZSBhIFxmQndoaWxlXGZQIGxvb3AgdG8gcHJvY2VzcyBlYWNoIGV2ZW50IGluIHR1cm5cJi4gCisuUFAKKy5uZgorXGYoQ1d3aGlsZShTRExfUG9sbEV2ZW50KCZ0ZXN0X2V2ZW50KSkge1xmUgorLmZpCisuUFAKKyBUaGUgXGZCU0RMX1BvbGxFdmVudFxmUCBmdW5jdGlvbiB0YWtlIGEgcG9pbnRlciB0byBhbiBcZkJTRExfRXZlbnRcZlIgc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgZmlsbGVkIHdpdGggZXZlbnQgaW5mb3JtYXRpb25cJi4gV2Uga25vdyB0aGF0IGlmIFxmQlNETF9Qb2xsRXZlbnRcZlAgcmVtb3ZlcyBhbiBldmVudCBmcm9tIHRoZSBxdWV1ZSB0aGVuIHRoZSBldmVudCBpbmZvcm1hdGlvbiB3aWxsIGJlIHBsYWNlZCBpbiBvdXIgXGZCdGVzdF9ldmVudFxmUiBzdHJ1Y3R1cmUsIGJ1dCB3ZSBhbHNvIGtub3cgdGhhdCB0aGUgXGZJdHlwZVxmUCBvZiBldmVudCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgXGZCdHlwZVxmUiBtZW1iZXIgb2YgXGZCdGVzdF9ldmVudFxmUlwmLiBTbyB0byBoYW5kbGUgZWFjaCBldmVudCBcZkJ0eXBlXGZSIHNlcGVyYXRlbHkgd2UgdXNlIGEgXGZCc3dpdGNoXGZQIHN0YXRlbWVudFwmLiAKKy5QUAorLm5mCitcZihDVyAgc3dpdGNoKHRlc3RfZXZlbnRcJi50eXBlKSB7XGZSCisuZmkKKy5QUAorIFdlIG5lZWQgdG8ga25vdyB3aGF0IGtpbmQgb2YgZXZlbnRzIHdlXCYncmUgbG9va2luZyBmb3IgXGZJYW5kXGZQIHRoZSBldmVudCBcZkJ0eXBlXGZSXCYncyBvZiB0aG9zZSBldmVudHNcJi4gU28gbGV0cyBhc3N1bWUgd2Ugd2FudCB0byBkZXRlY3Qgd2hlcmUgdGhlIHVzZXIgaXMgbW92aW5nIHRoZSBtb3VzZSBwb2ludGVyIHdpdGhpbiBvdXIgYXBwbGljYXRpb25cJi4gV2UgbG9vayB0aHJvdWdoIG91ciBldmVudCB0eXBlcyBhbmQgbm90aWNlIHRoYXQgXGZCU0RMX01PVVNFTU9USU9OXGZQIGlzLCBtb3JlIHRoYW4gbGlrZWx5LCB0aGUgZXZlbnQgd2VcJidyZSBsb29raW5nIGZvclwmLiBBIGxpdHRsZSBcZkltb3JlXGZSIHJlc2VhcmNoIHRlbGxzIHVzZSB0aGF0IFxmQlNETF9NT1VTRU1PVElPTlxmUCBldmVudHMgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSBcZklcZkJTRExfTW91c2VNb3Rpb25FdmVudFxmUlxmUiBzdHJ1Y3R1cmUgd2hpY2ggaXMgdGhlIFxmQm1vdGlvblxmUiBtZW1iZXIgb2YgXGZCU0RMX0V2ZW50XGZSXCYuIFdlIGNhbiBjaGVjayBmb3IgdGhlIFxmQlNETF9NT1VTRU1PVElPTlxmUCBldmVudCBcZkJ0eXBlXGZSIHdpdGhpbiBvdXIgXGZCc3dpdGNoXGZQIHN0YXRlbWVudCBsaWtlIHNvOiAKKy5QUAorLm5mCitcZihDVyAgICBjYXNlIFNETF9NT1VTRU1PVElPTjpcZlIKKy5maQorLlBQCisgQWxsIHdlIG5lZWQgZG8gbm93IGlzIHJlYWQgdGhlIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgXGZCbW90aW9uXGZSIG1lbWJlciBvZiBcZkJ0ZXN0X2V2ZW50XGZSXCYuIAorLlBQCisubmYKK1xmKENXICAgICAgcHJpbnRmKCJXZSBnb3QgYSBtb3Rpb24gZXZlbnRcJi4KKyIpOworICAgICAgcHJpbnRmKCJDdXJyZW50IG1vdXNlIHBvc2l0aW9uIGlzOiAoJWQsICVkKQorIiwgdGVzdF9ldmVudFwmLm1vdGlvblwmLngsIHRlc3RfZXZlbnRcJi5tb3Rpb25cJi55KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBwcmludGYoIlVuaGFuZGxlZCBFdmVudCEKKyIpOworICAgICAgYnJlYWs7CisgIH0KK30KK3ByaW50ZigiRXZlbnQgcXVldWUgZW1wdHlcJi4KKyIpO1xmUgorLmZpCisuUFAKKy5QUAorSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwdXNoIGV2ZW50cyBvbnRvIHRoZSBldmVudCBxdWV1ZSBhbmQgc28gdXNlIGl0IGFzIGEgdHdvLXdheSBjb21tdW5pY2F0aW9uIHBhdGhcJi4gQm90aCBcZklcZkJTRExfUHVzaEV2ZW50XGZQXGZSIGFuZCBcZklcZkJTRExfUGVlcEV2ZW50c1xmUFxmUiBhbGxvdyB5b3UgdG8gcGxhY2UgZXZlbnRzIG9udG8gdGhlIGV2ZW50IHF1ZXVlXCYuIFRoaXMgaXMgdXN1YWxseSB1c2VkIHRvIHBsYWNlIGEgXGZCU0RMX1VTRVJFVkVOVFxmUCBvbiB0aGUgZXZlbnQgcXVldWUsIGhvd2V2ZXIgeW91IGNvdWxkIHVzZSBpdCB0byBwb3N0IGZha2UgaW5wdXQgZXZlbnRzIGlmIHlvdSB3aXNoZWRcJi4gQ3JlYXRpbmcgeW91ciBvd24gZXZlbnRzIGlzIGEgc2ltcGxlIG1hdHRlciBvZiBjaG9vc2luZyB0aGUgZXZlbnQgdHlwZSB5b3Ugd2FudCwgc2V0dGluZyB0aGUgXGZCdHlwZVxmUiBtZW1iZXIgYW5kIGZpbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1lbWJlciBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvblwmLiAKKy5QUAorLm5mCitcZihDV1NETF9FdmVudCB1c2VyX2V2ZW50OworCit1c2VyX2V2ZW50XCYudHlwZT1TRExfVVNFUkVWRU5UOwordXNlcl9ldmVudFwmLnVzZXJcJi5jb2RlPTI7Cit1c2VyX2V2ZW50XCYudXNlclwmLmRhdGExPU5VTEw7Cit1c2VyX2V2ZW50XCYudXNlclwmLmRhdGEyPU5VTEw7CitTRExfUHVzaEV2ZW50KCZ1c2VyX2V2ZW50KTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfUG9sbEV2ZW50XGZQXGZSLCBcZklcZkJTRExfUHVzaEV2ZW50XGZQXGZSLCBcZklcZkJTRExfUGVlcEV2ZW50c1xmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9FdmVudFN0YXRlLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9FdmVudFN0YXRlLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlNmFiNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0V2ZW50U3RhdGUuMwpAQCAtMCwwICsxLDIzIEBACisuVEggIlNETF9FdmVudFN0YXRlIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfRXZlbnRTdGF0ZSBcLSBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBzdGF0ZSBvZiBwcm9jZXNzaW5nIGNlcnRhaW4gZXZlbnRzXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCVWludDggXGZCU0RMX0V2ZW50U3RhdGVcZlBcZlIoXGZCVWludDggdHlwZSwgaW50IHN0YXRlXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgdGhlIHN0YXRlIG9mIHByb2Nlc3NpbmcgY2VydGFpbiBldmVudCBcZkJ0eXBlXGZSXCYnc1wmLgorLlBQCitJZiBcZkJzdGF0ZVxmUiBpcyBzZXQgdG8gXGZCU0RMX0lHTk9SRVxmUCwgdGhhdCBldmVudCBcZkJ0eXBlXGZSIHdpbGwgYmUgYXV0b21hdGljYWxseSBkcm9wcGVkIGZyb20gdGhlIGV2ZW50IHF1ZXVlIGFuZCB3aWxsIG5vdCBiZSBmaWx0ZXJlZFwmLgorLlBQCitJZiBcZkJzdGF0ZVxmUiBpcyBzZXQgdG8gXGZCU0RMX0VOQUJMRVxmUCwgdGhhdCBldmVudCBcZkJ0eXBlXGZSIHdpbGwgYmUgcHJvY2Vzc2VkIG5vcm1hbGx5XCYuCisuUFAKK0lmIFxmQnN0YXRlXGZSIGlzIHNldCB0byBcZkJTRExfUVVFUllcZlAsIFxmQlNETF9FdmVudFN0YXRlXGZQIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHByb2Nlc3Npbmcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBldmVudCBcZkJ0eXBlXGZSXCYuCisuUFAKK0EgbGlzdCBvZiBldmVudCBcZkJ0eXBlXGZSXCYncyBjYW4gYmUgZm91bmQgaW4gdGhlIFxmSVxmQlNETF9FdmVudFxmUlxmUiBzZWN0aW9uXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfRXZlbnRcZlJcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRXhwb3NlRXZlbnQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0V4cG9zZUV2ZW50LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhYTVjMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0V4cG9zZUV2ZW50LjMKQEAgLTAsMCArMSwyNCBAQAorLlRIICJTRExfRXhwb3NlRXZlbnQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9FeHBvc2VFdmVudCBcLSBRdWl0IHJlcXVlc3RlZCBldmVudAorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBVaW50OCB0eXBlCit9IFNETF9FeHBvc2VFdmVudDtcZlIKKy5maQorLlBQCisuU0ggIlNUUlVDVFVSRSBEQVRBIgorLlRQIDIwCitcZkJ0eXBlXGZSCitcZkJTRExfVklERU9FWFBPU0VcZlAKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9FeHBvc2VFdmVudFxmUiBpcyBhIG1lbWJlciBvZiB0aGUgXGZJXGZCU0RMX0V2ZW50XGZSXGZSIHVuaW9uIGFuZCBpcyB1c2VkIHdoYW4gYW4gZXZlbnQgb2YgdHlwZSBcZkJTRExfVklERU9FWFBPU0VcZlAgaXMgcmVwb3J0ZWRcJi4KKy5QUAorQSBWSURFT0VYUE9TRSBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgc2NyZWVuIGhhcyBiZWVuIG1vZGlmaWVkIG91dHNpZGUgb2YgdGhlIGFwcGxpY2F0aW9uLCB1c3VhbGx5IGJ5IHRoZSB3aW5kb3cgbWFuYWdlciBhbmQgbmVlZHMgdG8gYmUgcmVkcmF3blwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0V2ZW50XGZSXGZSLCBcZklcZkJTRExfU2V0RXZlbnRGaWx0ZXJcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRmlsbFJlY3QuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0ZpbGxSZWN0LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiODNhYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0ZpbGxSZWN0LjMKQEAgLTAsMCArMSwyMiBAQAorLlRIICJTRExfRmlsbFJlY3QiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9GaWxsUmVjdCBcLSBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZmFzdCBmaWxsIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUgd2l0aCBzb21lIGNvbG9yCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9GaWxsUmVjdFxmUFxmUihcZkJTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCwgVWludDMyIGNvbG9yXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBmYXN0IGZpbGwgb2YgdGhlIGdpdmVuIHJlY3RhbmdsZSB3aXRoIFxmQmNvbG9yXGZSXCYuIElmIFxmQmRzdHJlY3RcZlIgaXMgXGZCTlVMTFxmUCwgdGhlIHdob2xlIHN1cmZhY2Ugd2lsbCBiZSBmaWxsZWQgd2l0aCBcZkJjb2xvclxmUlwmLgorLlBQCitUaGUgY29sb3Igc2hvdWxkIGJlIGEgcGl4ZWwgb2YgdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBzdXJmYWNlLCBhbmQgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgXGZJU0RMX01hcFJHQlxmUiBvciBcZklTRExfTWFwUkdCQVxmUiBmdW5jdGlvbnNcJi4gSWYgdGhlIGNvbG9yIHZhbHVlIGNvbnRhaW5zIGFuIGFscGhhIHZhbHVlIHRoZW4gdGhlIGRlc3RpbmF0aW9uIGlzIHNpbXBseSAiZmlsbGVkIiB3aXRoIHRoYXQgYWxwaGEgaW5mb3JtYXRpb24sIG5vIGJsZW5kaW5nIHRha2VzIHBsYWNlXCYuCisuUFAKK0lmIHRoZXJlIGlzIGEgY2xpcCByZWN0YW5nbGUgc2V0IG9uIHRoZSBkZXN0aW5hdGlvbiAoc2V0IHZpYSBcZklTRExfU2V0Q2xpcFJlY3RcZlIpIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNsaXAgYmFzZWQgb24gdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgY2xpcCByZWN0YW5nbGUgYW5kIHRoZSBcZkJkc3RyZWN0XGZSIHJlY3RhbmdsZSBhbmQgdGhlIGRzdHJlY3QgcmVjdGFuZ2xlIHdpbGwgYmUgbW9kaWZpZWQgdG8gcmVwcmVzZW50IHRoZSBhcmVhIGFjdHVhbGx5IGZpbGxlZFwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyBcZkIwXGZSIG9uIHN1Y2Nlc3MsIG9yIFxmQi0xXGZSIG9uIGVycm9yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfTWFwUkdCXGZQXGZSLCBcZklcZkJTRExfTWFwUkdCQVxmUFxmUiwgXGZJXGZCU0RMX0JsaXRTdXJmYWNlXGZQXGZSLCBcZklcZkJTRExfUmVjdFxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9GbGlwLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9GbGlwLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiMmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0ZsaXAuMwpAQCAtMCwwICsxLDIwIEBACisuVEggIlNETF9GbGlwIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfRmxpcCBcLSBTd2FwcyBzY3JlZW4gYnVmZmVycworLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfRmxpcFxmUFxmUihcZkJTRExfU3VyZmFjZSAqc2NyZWVuXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK09uIGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgZG91YmxlLWJ1ZmZlcmluZywgdGhpcyBmdW5jdGlvbiBzZXRzIHVwIGEgZmxpcCBhbmQgcmV0dXJuc1wmLiBUaGUgaGFyZHdhcmUgd2lsbCB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlLCBhbmQgdGhlbiBzd2FwIHZpZGVvIGJ1ZmZlcnMgYmVmb3JlIHRoZSBuZXh0IHZpZGVvIHN1cmZhY2UgYmxpdCBvciBsb2NrIHdpbGwgcmV0dXJuXCYuIE9uIGhhcmR3YXJlIHRoYXQgZG9lc25cJid0IHN1cHBvcnQgZG91YmxlLWJ1ZmZlcmluZywgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgXGZJU0RMX1VwZGF0ZVJlY3RcZlJcZkIoc2NyZWVuLCAwLCAwLCAwLCAwKVxmUgorLlBQCitUaGUgXGZCU0RMX0RPVUJMRUJVRlxmUCBmbGFnIG11c3QgaGF2ZSBiZWVuIHBhc3NlZCB0byBcZklTRExfU2V0VmlkZW9Nb2RlXGZSLCB3aGVuIHNldHRpbmcgdGhlIHZpZGVvIG1vZGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcGVyZm9ybSBoYXJkd2FyZSBmbGlwcGluZ1wmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyBcZkIwXGZSIGlmIHN1Y2Nlc3NmdWwsIG9yIFxmQi0xXGZSIGlmIHRoZXJlIHdhcyBhbiBlcnJvclwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1NldFZpZGVvTW9kZVxmUFxmUiwgXGZJXGZCU0RMX1VwZGF0ZVJlY3RcZlBcZlIsIFxmSVxmQlNETF9TdXJmYWNlXGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0ZyZWVDdXJzb3IuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0ZyZWVDdXJzb3IuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI3N2VhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRnJlZUN1cnNvci4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX0ZyZWVDdXJzb3IiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9GcmVlQ3Vyc29yIFwtIEZyZWVzIGEgY3Vyc29yIGNyZWF0ZWQgd2l0aCBTRExfQ3JlYXRlQ3Vyc29yXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfRnJlZUN1cnNvclxmUFxmUihcZkJTRExfQ3Vyc29yICpjdXJzb3JcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorRnJlZXMgYSBcZkJTRExfQ3Vyc29yXGZSIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgXGZJU0RMX0NyZWF0ZUN1cnNvclxmUlwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJU0RMX0NyZWF0ZUN1cnNvclxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9GcmVlU3VyZmFjZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRnJlZVN1cmZhY2UuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODQ5MTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRnJlZVN1cmZhY2UuMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9GcmVlU3VyZmFjZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0ZyZWVTdXJmYWNlIFwtIEZyZWVzIChkZWxldGVzKSBhIFNETF9TdXJmYWNlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfRnJlZVN1cmZhY2VcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnN1cmZhY2VcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorRnJlZXMgdGhlIHJlc291cmNlcyB1c2VkIGJ5IGEgcHJldmlvdXNseSBjcmVhdGVkIFxmQlNETF9TdXJmYWNlXGZSXCYuIElmIHRoZSBzdXJmYWNlIHdhcyBjcmVhdGVkIHVzaW5nIFxmSVNETF9DcmVhdGVSR0JTdXJmYWNlRnJvbVxmUiB0aGVuIHRoZSBwaXhlbCBkYXRhIGlzIG5vdCBmcmVlZFwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NyZWF0ZVJHQlN1cmZhY2VcZlBcZlIgXGZJXGZCU0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0ZyZWVXQVYuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0ZyZWVXQVYuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NkMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfRnJlZVdBVi4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX0ZyZWVXQVYiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9GcmVlV0FWIFwtIEZyZWVzIHByZXZpb3VzbHkgb3BlbmVkIFdBViBkYXRhCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfRnJlZVdBVlxmUFxmUihcZkJVaW50OCAqYXVkaW9fYnVmXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0FmdGVyIGEgV0FWRSBmaWxlIGhhcyBiZWVuIG9wZW5lZCB3aXRoIFxmSVxmQlNETF9Mb2FkV0FWXGZQXGZSIGl0cyBkYXRhIGNhbiBldmVudHVhbGx5IGJlIGZyZWVkIHdpdGggXGZCU0RMX0ZyZWVXQVZcZlBcJi4gXGZCYXVkaW9fYnVmXGZSIGlzIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIGNyZWF0ZWQgYnkgXGZCU0RMX0xvYWRXQVZcZlBcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9Mb2FkV0FWXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0ZyZWVZVVZPdmVybGF5LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9GcmVlWVVWT3ZlcmxheS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzFhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9GcmVlWVVWT3ZlcmxheS4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX0ZyZWVZVVZPdmVybGF5IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfRnJlZVlVVk92ZXJsYXkgXC0gRnJlZSBhIFlVViB2aWRlbyBvdmVybGF5CisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfRnJlZVlVVk92ZXJsYXlcZlBcZlIoXGZCU0RMX092ZXJsYXkgKm92ZXJsYXlcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorRnJlZXMgYW5kIFxmSVxmQm92ZXJsYXlcZlJcZlIgY3JlYXRlZCBieSBcZklcZkJTRExfQ3JlYXRlWVVWT3ZlcmxheVxmUFxmUlwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX092ZXJsYXlcZlJcZlIsIFxmSVxmQlNETF9EaXNwbGF5WVVWT3ZlcmxheVxmUFxmUiwgXGZJXGZCU0RMX0ZyZWVZVVZPdmVybGF5XGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dMX0dldEF0dHJpYnV0ZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR0xfR2V0QXR0cmlidXRlLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzNWRhMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dMX0dldEF0dHJpYnV0ZS4zCkBAIC0wLDAgKzEsMTggQEAKKy5USCAiU0RMX0dMX0dldEF0dHJpYnV0ZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dMX0dldEF0dHJpYnV0ZSBcLSBHZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lhbCBTREwvT3BlbkdMIGF0dHJpYnV0ZQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfR0xfR2V0QXR0cmlidXRlXGZQXGZSKFxmQlNETEdMYXR0ciBhdHRyLCBpbnQgKnZhbHVlXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1BsYWNlcyB0aGUgdmFsdWUgb2YgdGhlIFNETC9PcGVuR0wgXGZJYXR0cmlidXRlXGZSIFxmQmF0dHJcZlIgaW50byBcZkJ2YWx1ZVxmUlwmLiBUaGlzIGlzIHVzZWZ1bCBhZnRlciBhIGNhbGwgdG8gXGZJXGZCU0RMX1NldFZpZGVvTW9kZVxmUFxmUiB0byBjaGVjayB3aGV0aGVyIHlvdXIgYXR0cmlidXRlcyBoYXZlIGJlZW4gXGZJc2V0XGZSIGFzIHlvdSBleHBlY3RlZFwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgXGZCMFxmUiBvbiBzdWNjZXNzLCBvciBcZkItMVxmUiBvbiBhbiBlcnJvclwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0dMX1NldEF0dHJpYnV0ZVxmUFxmUiwgXGZJR0wgQXR0cmlidXRlc1xmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HTF9HZXRQcm9jQWRkcmVzcy4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR0xfR2V0UHJvY0FkZHJlc3MuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmNjN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR0xfR2V0UHJvY0FkZHJlc3MuMwpAQCAtMCwwICsxLDQ4IEBACisuVEggIlNETF9HTF9HZXRQcm9jQWRkcmVzcyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dMX0dldFByb2NBZGRyZXNzIFwtIEdldCB0aGUgYWRkcmVzcyBvZiBhIEdMIGZ1bmN0aW9uCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCAqXGZCU0RMX0dMX0dldFByb2NBZGRyZXNzXGZQXGZSKFxmQmNvbnN0IGNoYXIqIHByb2NcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgR0wgZnVuY3Rpb24gXGZCcHJvY1xmUiwgb3IgXGZCTlVMTFxmUiBpZiB0aGUgZnVuY3Rpb24gaXMgbm90IGZvdW5kXCYuIElmIHRoZSBHTCBsaWJyYXJ5IGlzIGxvYWRlZCBhdCBydW50aW1lLCB3aXRoIFxmSVxmQlNETF9HTF9Mb2FkTGlicmFyeVxmUFxmUiwgdGhlbiBcZklhbGxcZlAgR0wgZnVuY3Rpb25zIG11c3QgYmUgcmV0cmlldmVkIHRoaXMgd2F5XCYuIFVzdWFsbHkgdGhpcyBpcyB1c2VkIHRvIHJldHJpZXZlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIE9wZW5HTCBleHRlbnNpb25zXCYuCisuU0ggIkVYQU1QTEUiCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIHZvaWQgKCpHTF9BY3RpdmVUZXh0dXJlQVJCX0Z1bmMpKHVuc2lnbmVkIGludCk7CitHTF9BY3RpdmVUZXh0dXJlQVJCX0Z1bmMgZ2xBY3RpdmVUZXh0dXJlQVJCX3B0ciA9IDA7CitpbnQgaGFzX211bHRpdGV4dHVyZT0xOworXCYuCitcJi4KK1wmLgorLyogR2V0IGZ1bmN0aW9uIHBvaW50ZXIgKi8KK2dsQWN0aXZlVGV4dHVyZUFSQl9wdHI9KEdMX0FjdGl2ZVRleHR1cmVBUkJfRnVuYykgU0RMX0dMX0dldFByb2NBZGRyZXNzKCJnbEFjdGl2ZVRleHR1cmVBUkIiKTsKKworLyogQ2hlY2sgZm9yIGEgdmFsaWQgZnVuY3Rpb24gcHRyICovCitpZighZ2xBY3RpdmVUZXh0dXJlQVJCX3B0cil7CisgIGZwcmludGYoc3RkZXJyLCAiTXVsdGl0ZXh0dXJlIEV4dGVuc2lvbnMgbm90IHByZXNlbnRcJi4KKyIpOworICBoYXNfbXVsdGl0ZXh0dXJlPTA7Cit9CitcJi4KK1wmLgorXCYuCitcJi4KK2lmKGhhc19tdWx0aXRleHR1cmUpeworICBnbEFjdGl2ZVRleHR1cmVBUkJfcHRyKEdMX1RFWFRVUkUwX0FSQik7CisgIFwmLgorICBcJi4KK30KK2Vsc2V7CisgIFwmLgorICBcJi4KK31cZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfR0xfTG9hZExpYnJhcnlcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR0xfTG9hZExpYnJhcnkuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dMX0xvYWRMaWJyYXJ5LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1NDRjOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dMX0xvYWRMaWJyYXJ5LjMKQEAgLTAsMCArMSwxNSBAQAorLlRIICJTRExfR0xfTG9hZExpYnJhcnkiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9HTF9Mb2FkTGlicmFyeSBcLSBTcGVjaWZ5IGFuIE9wZW5HTCBsaWJyYXJ5CisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9HTF9Mb2FkTGlicmFyeVxmUFxmUihcZkJjb25zdCBjaGFyICpwYXRoXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0lmIHlvdSB3aXNoLCB5b3UgbWF5IGxvYWQgdGhlIE9wZW5HTCBsaWJyYXJ5IGF0IHJ1bnRpbWUsIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBcZklcZkJTRExfU2V0VmlkZW9Nb2RlXGZQXGZSIGlzIGNhbGxlZFwmLiBUaGUgXGZCcGF0aFxmUiBvZiB0aGUgR0wgbGlicmFyeSBpcyBwYXNzZWQgdG8gXGZCU0RMX0dMX0xvYWRMaWJyYXJ5XGZQIGFuZCBpdCByZXR1cm5zIFxmQjBcZlIgb24gc3VjY2Vzcywgb3IgXGZCLTFcZlIgb24gYW4gZXJyb3JcJi4gWW91IG11c3QgdGhlbiB1c2UgXGZJXGZCU0RMX0dMX0dldFByb2NBZGRyZXNzXGZQXGZSIHRvIHJldHJpZXZlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIEdMIGZ1bmN0aW9uc1wmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0dMX0dldFByb2NBZGRyZXNzXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dMX1NldEF0dHJpYnV0ZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR0xfU2V0QXR0cmlidXRlLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViMzhlNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dMX1NldEF0dHJpYnV0ZS4zCkBAIC0wLDAgKzEsNDAgQEAKKy5USCAiU0RMX0dMX1NldEF0dHJpYnV0ZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dMX1NldEF0dHJpYnV0ZSBcLSBTZXQgYSBzcGVjaWFsIFNETC9PcGVuR0wgYXR0cmlidXRlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9HTF9TZXRBdHRyaWJ1dGVcZlBcZlIoXGZCU0RMX0dMYXR0ciBhdHRyLCBpbnQgdmFsdWVcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorU2V0cyB0aGUgT3BlbkdMIFxmSWF0dHJpYnV0ZVxmUiBcZkJhdHRyXGZSIHRvIFxmQnZhbHVlXGZSXCYuIFRoZSBhdHRyaWJ1dGVzIHlvdSBzZXQgZG9uXCYndCB0YWtlIGVmZmVjdCB1bnRpbCBhZnRlciBhIGNhbGwgdG8gXGZJXGZCU0RMX1NldFZpZGVvTW9kZVxmUFxmUlwmLiBZb3Ugc2hvdWxkIHVzZSBcZklcZkJTRExfR0xfR2V0QXR0cmlidXRlXGZQXGZSIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgYSBcZkJTRExfU2V0VmlkZW9Nb2RlXGZQIGNhbGxcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIFxmQjBcZlIgb24gc3VjY2Vzcywgb3IgXGZCLTFcZlIgb24gZXJyb3JcJi4KKy5TSCAiRVhBTVBMRSIKKy5QUAorLm5mCitcZihDV1NETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9SRURfU0laRSwgNSApOworU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX0dSRUVOX1NJWkUsIDUgKTsKK1NETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9CTFVFX1NJWkUsIDUgKTsKK1NETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9ERVBUSF9TSVpFLCAxNiApOworU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX0RPVUJMRUJVRkZFUiwgMSApOworaWYgKCAoc2NyZWVuPVNETF9TZXRWaWRlb01vZGUoIDY0MCwgNDgwLCAxNiwgU0RMX09QRU5HTCApKSA9PSBOVUxMICkgeworICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkblwmJ3Qgc2V0IEdMIG1vZGU6ICVzCisiLCBTRExfR2V0RXJyb3IoKSk7CisgIFNETF9RdWl0KCk7CisgIHJldHVybjsKK31cZlIKKy5maQorLlBQCisuUFAKKy5SUworXGZCTm90ZTogIAorLlBQCitUaGUgXGZCU0RMX0RPVUJMRUJVRlxmUCBmbGFnIGlzIG5vdCByZXF1aXJlZCB0byBlbmFibGUgZG91YmxlIGJ1ZmZlcmluZyB3aGVuIHNldHRpbmcgYW4gT3BlbkdMIHZpZGVvIG1vZGVcJi4gRG91YmxlIGJ1ZmZlcmluZyBpcyBlbmFibGVkIG9yIGRpc2FibGVkIHVzaW5nIHRoZSBTRExfR0xfRE9VQkxFQlVGRkVSIGF0dHJpYnV0ZVwmLgorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfR0xfR2V0QXR0cmlidXRlXGZQXGZSLCBcZklHTCBBdHRyaWJ1dGVzXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dMX1N3YXBCdWZmZXJzLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HTF9Td2FwQnVmZmVycy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDMxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HTF9Td2FwQnVmZmVycy4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX0dMX1N3YXBCdWZmZXJzIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfR0xfU3dhcEJ1ZmZlcnMgXC0gU3dhcCBPcGVuR0wgZnJhbWVidWZmZXJzL1VwZGF0ZSBEaXNwbGF5CisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfR0xfU3dhcEJ1ZmZlcnNcZlBcZlIoXGZCdm9pZCBcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorU3dhcCB0aGUgT3BlbkdMIGJ1ZmZlcnMsIGlmIGRvdWJsZS1idWZmZXJpbmcgaXMgc3VwcG9ydGVkXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfU2V0VmlkZW9Nb2RlXGZQXGZSLCBcZklcZkJTRExfR0xfU2V0QXR0cmlidXRlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dMYXR0ci4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR0xhdHRyLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkMzcyNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dMYXR0ci4zCkBAIC0wLDAgKzEsNDcgQEAKKy5USCAiU0RMX0dMYXR0ciIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dMYXR0ciBcLSBTREwgR0wgQXR0cmlidXRlcworLlNIICJBVFRSSUJVVEVTIgorLlRQIDIwCitcZkJTRExfR0xfUkVEX1NJWkVcZlAKK1NpemUgb2YgdGhlIGZyYW1lYnVmZmVyIHJlZCBjb21wb25lbnQsIGluIGJpdHMKKy5UUCAyMAorXGZCU0RMX0dMX0dSRUVOX1NJWkVcZlAKK1NpemUgb2YgdGhlIGZyYW1lYnVmZmVyIGdyZWVuIGNvbXBvbmVudCwgaW4gYml0cworLlRQIDIwCitcZkJTRExfR0xfQkxVRV9TSVpFXGZQCitTaXplIG9mIHRoZSBmcmFtZWJ1ZmZlciBibHVlIGNvbXBvbmVudCwgaW4gYml0cworLlRQIDIwCitcZkJTRExfR0xfQUxQSEFfU0laRVxmUAorU2l6ZSBvZiB0aGUgZnJhbWVidWZmZXIgYWxwaGEgY29tcG9uZW50LCBpbiBiaXRzCisuVFAgMjAKK1xmQlNETF9HTF9ET1VCTEVCVUZGRVJcZlAKKzAgb3IgMSwgZW5hYmxlIG9yIGRpc2FibGUgZG91YmxlIGJ1ZmZlcmluZworLlRQIDIwCitcZkJTRExfR0xfQlVGRkVSX1NJWkVcZlAKK1NpemUgb2YgdGhlIGZyYW1lYnVmZmVyLCBpbiBiaXRzCisuVFAgMjAKK1xmQlNETF9HTF9ERVBUSF9TSVpFXGZQCitTaXplIG9mIHRoZSBkZXB0aCBidWZmZXIsIGluIGJpdHMKKy5UUCAyMAorXGZCU0RMX0dMX1NURU5DSUxfU0laRVxmUAorU2l6ZSBvZiB0aGUgc3RlbmNpbCBidWZmZXIsIGluIGJpdHMKKy5UUCAyMAorXGZCU0RMX0dMX0FDQ1VNX1JFRF9TSVpFXGZQCitTaXplIG9mIHRoZSBhY2N1bXVsYXRpb24gYnVmZmVyIHJlZCBjb21wb25lbnQsIGluIGJpdHMKKy5UUCAyMAorXGZCU0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkVcZlAKK1NpemUgb2YgdGhlIGFjY3VtdWxhdGlvbiBidWZmZXIgZ3JlZW4gY29tcG9uZW50LCBpbiBiaXRzCisuVFAgMjAKK1xmQlNETF9HTF9BQ0NVTV9CTFVFX1NJWkVcZlAKK1NpemUgb2YgdGhlIGFjY3VtdWxhdGlvbiBidWZmZXIgYmx1ZSBjb21wb25lbnQsIGluIGJpdHMKKy5UUCAyMAorXGZCU0RMX0dMX0FDQ1VNX0FMUEhBX1NJWkVcZlAKK1NpemUgb2YgdGhlIGFjY3VtdWxhdGlvbiBidWZmZXIgYWxwaGEgY29tcG9uZW50LCBpbiBiaXRzCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitXaGlsZSB5b3UgY2FuIHNldCBtb3N0IE9wZW5HTCBhdHRyaWJ1dGVzIG5vcm1hbGx5LCB0aGUgYXR0cmlidXRlcyBsaXN0IGFib3ZlIG11c3QgYmUga25vd24gXGZJYmVmb3JlXGZQIFNETCBzZXRzIHRoZSB2aWRlbyBtb2RlXCYuIFRoZXNlIGF0dHJpYnV0ZXMgYSBzZXQgYW5kIHJlYWQgd2l0aCBcZklcZkJTRExfR0xfU2V0QXR0cmlidXRlXGZQXGZSIGFuZCBcZklcZkJTRExfR0xfR2V0QXR0cmlidXRlXGZQXGZSXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfR0xfU2V0QXR0cmlidXRlXGZQXGZSLCBcZklcZkJTRExfR0xfR2V0QXR0cmlidXRlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEFwcFN0YXRlLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRBcHBTdGF0ZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjQ0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRBcHBTdGF0ZS4zCkBAIC0wLDAgKzEsMjQgQEAKKy5USCAiU0RMX0dldEFwcFN0YXRlIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitcZkJTRExfR2V0QXBwU3RhdGVcZlAgXC0gR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYXBwbGljYXRpb24KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJVaW50OCBcZkJTRExfR2V0QXBwU3RhdGVcZlBcZlIoXGZCdm9pZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uXCYuIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIGJpdHdpc2UgY29tYmluYXRpb24gb2Y6CisuVFAgMjAKK1xmQlNETF9BUFBNT1VTRUZPQ1VTXGZQCitUaGUgYXBwbGljYXRpb24gaGFzIG1vdXNlIGZvY3VzXCYuCisuVFAgMjAKK1xmQlNETF9BUFBJTlBVVEZPQ1VTXGZQCitUaGUgYXBwbGljYXRpb24gaGFzIGtleWJvYXJkIGZvY3VzCisuVFAgMjAKK1xmQlNETF9BUFBBQ1RJVkVcZlAKK1RoZSBhcHBsaWNhdGlvbiBpcyB2aXNpYmxlCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQWN0aXZlRXZlbnRcZlJcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0QXVkaW9TdGF0dXMuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEF1ZGlvU3RhdHVzLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5NWM5NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEF1ZGlvU3RhdHVzLjMKQEAgLTAsMCArMSwyNCBAQAorLlRIICJTRExfR2V0QXVkaW9TdGF0dXMiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9HZXRBdWRpb1N0YXR1cyBcLSBHZXQgdGhlIGN1cnJlbnQgYXVkaW8gc3RhdGUKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJTRExfYXVkaW9zdGF0dXNcZkJTRExfR2V0QXVkaW9TdGF0dXNcZlBcZlIoXGZCdm9pZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCisubmYKK1xmKENXdHlwZWRlZiBlbnVteworICBTRExfQVVESU9fU1RPUFBFRCwKKyAgU0RMX0FVRElPX1BBVVNFRCwKKyAgU0RMX0FVRElPX1BMQVlJTkcKK30gU0RMX2F1ZGlvc3RhdHVzO1xmUgorLmZpCisuUFAKKy5QUAorUmV0dXJucyBlaXRoZXIgXGZCU0RMX0FVRElPX1NUT1BQRURcZlAsIFxmQlNETF9BVURJT19QQVVTRURcZlAgb3IgXGZCU0RMX0FVRElPX1BMQVlJTkdcZlAgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGF1ZGlvIHN0YXRlXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfUGF1c2VBdWRpb1xmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU4CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRDbGlwUmVjdC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0Q2xpcFJlY3QuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTExZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0Q2xpcFJlY3QuMwpAQCAtMCwwICsxLDE3IEBACisuVEggIlNETF9HZXRDbGlwUmVjdCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dldENsaXBSZWN0IFwtIEdldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBmb3IgYSBzdXJmYWNlXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfR2V0Q2xpcFJlY3RcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFNETF9SZWN0ICpyZWN0XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0dldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBmb3IgYSBzdXJmYWNlXCYuIFdoZW4gdGhpcyBzdXJmYWNlIGlzIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGJsaXQsIG9ubHkgdGhlIGFyZWEgd2l0aGluIHRoZSBjbGlwIHJlY3RhbmdsZSBpcyBkcmF3biBpbnRvXCYuCisuUFAKK1RoZSByZWN0YW5nbGUgcG9pbnRlZCB0byBieSBcZkJyZWN0XGZSIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBvZiB0aGUgc3VyZmFjZVwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1NldENsaXBSZWN0XGZQXGZSLCBcZklcZkJTRExfQmxpdFN1cmZhY2VcZlBcZlIsIFxmSVxmQlNETF9TdXJmYWNlXGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEN1cnNvci4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0Q3Vyc29yLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1YmE3MgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEN1cnNvci4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX0dldEN1cnNvciIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dldEN1cnNvciBcLSBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgbW91c2UgY3Vyc29yXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCU0RMX0N1cnNvciAqXGZCU0RMX0dldEN1cnNvclxmUFxmUihcZkJ2b2lkXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1JldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgbW91c2UgY3Vyc29yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfU2V0Q3Vyc29yXGZQXGZSLCBcZklcZkJTRExfQ3JlYXRlQ3Vyc29yXGZQXGZSLCBcZklcZkJTRExfU2hvd0N1cnNvclxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRFcnJvci4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0RXJyb3IuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2RiOThjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0RXJyb3IuMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9HZXRFcnJvciIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dldEVycm9yIFwtIEdldCBTREwgZXJyb3Igc3RyaW5nCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RML1NETFwmLmgiCisuc3AKK1xmQmNoYXIgKlxmQlNETF9HZXRFcnJvclxmUFxmUihcZkJ2b2lkXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9HZXRFcnJvclxmUCByZXR1cm5zIGEgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IGludGVybmFsIFNETCBlcnJvclwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1xmQlNETF9HZXRFcnJvclxmUCByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxhc3QgZXJyb3JcJi4KKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0RXZlbnRGaWx0ZXIuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEV2ZW50RmlsdGVyLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiZjMzNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEV2ZW50RmlsdGVyLjMKQEAgLTAsMCArMSwyMyBAQAorLlRIICJTRExfR2V0RXZlbnRGaWx0ZXIiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9HZXRFdmVudEZpbHRlciBcLSBSZXRyaWV2ZXMgYSBwb2ludGVyIHRvIGhlIGV2ZW50IGZpbHRlcgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQlNETF9FdmVudEZpbHRlciBcZkJTRExfR2V0RXZlbnRGaWx0ZXJcZlBcZlIoXGZCdm9pZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGlzIGZ1bmN0aW9uIHJldHJpZWNlcyBhIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGZpbHRlciB0aGF0IHdhcyBwcmV2aW91c2x5IHNldCB1c2luZyBcZklcZkJTRExfU2V0RXZlbnRGaWx0ZXJcZlBcZlJcJi4gQW4gU0RMX0V2ZW50RmlsdGVyIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXM6IAorLlBQCisubmYKK1xmKENXdHlwZWRlZiBpbnQgKCpTRExfRXZlbnRGaWx0ZXIpKGNvbnN0IFNETF9FdmVudCAqZXZlbnQpO1xmUgorLmZpCisuUFAKKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZXZlbnQgZmlsdGVyIG9yIFxmQk5VTExcZlAgaWYgbm8gZmlsdGVyIGhhcyBiZWVuIHNldFwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0V2ZW50XGZSXGZSLCBcZklcZkJTRExfU2V0RXZlbnRGaWx0ZXJcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0R2FtbWEuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEdhbW1hLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0OTNhYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEdhbW1hLjMKQEAgLTAsMCArMSwyMSBAQAorLlRIICJTRExfR2V0R2FtbWEiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9HZXRHYW1tYSBcLSBHZXRzIHRoZSBnYW1tYSBvZiB0aGUgZGlzcGxheQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfR2V0R2FtbWFcZlBcZlIoXGZCZmxvYXQgKnJlZCwgZmxvYXQgKmdyZWVuLCBmbG9hdCAqYmx1ZVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitHZXRzIHRoZSBjb2xvciBnYW1tYSBvZiB0aGUgZGlzcGxheVwmLiBUaGUgZ2FtbWEgdmFsdWUgZm9yIGVhY2ggY29sb3IgY29tcG9uZW50IHdpbGwgYmUgcGxhY2UgaW4gdGhlIHBhcmFtZXRlcnMgXGZCcmVkXGZSLCBcZkJncmVlblxmUiBhbmQgXGZCYmx1ZVxmUlwmLiBUaGUgdmFsdWVzIGNhbiByYW5nZSBmcm9tIDBcJi4xIHRvIDEwXCYuCisuUFAKKy5SUworXGZCTm90ZTogIAorLlBQCitUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBvbmx5IHdvcmtzIG9uIFhGcmVlZSA0XCYuMCBhbmQgdXBcJi4KKy5SRQorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1NldEdhbW1hXGZQXGZSLCBcZklcZkJTRExfU2V0VmlkZW9Nb2RlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEdhbW1hUmFtcC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0R2FtbWFSYW1wLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExMTZkNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEdhbW1hUmFtcC4zCkBAIC0wLDAgKzEsMjAgQEAKKy5USCAiU0RMX0dldEdhbW1hUmFtcCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dldEdhbW1hUmFtcCBcLSBHZXRzIHRoZSBjb2xvciBnYW1tYSBsb29rdXAgdGFibGVzIGZvciB0aGUgZGlzcGxheQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfR2V0R2FtbWFSYW1wXGZQXGZSKFxmQlVpbnQxNiAqcmVkdGFibGUsIFVpbnQxNiAqZ3JlZW50YWJsZSwgVWludDE2ICpibHVldGFibGVcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorR2V0cyB0aGUgZ2FtbWEgdHJhbnNsYXRpb24gbG9va3VwIHRhYmxlcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgZGlzcGxheVwmLiBFYWNoIHRhYmxlIGlzIGFuIGFycmF5IG9mIDI1NiBVaW50MTYgdmFsdWVzXCYuCisuUFAKK05vdCBhbGwgZGlzcGxheSBoYXJkd2FyZSBpcyBhYmxlIHRvIGNoYW5nZSBnYW1tYVwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgLTEgb24gZXJyb3JcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVNETF9TZXRHYW1tYVxmUiBcZklTRExfU2V0R2FtbWFSYW1wXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEtleU5hbWUuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldEtleU5hbWUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc2Y2E4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0S2V5TmFtZS4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX0dldEtleU5hbWUiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9HZXRLZXlOYW1lIFwtIEdldCB0aGUgbmFtZSBvZiBhbiBTREwgdmlydHVhbCBrZXlzeW0KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJjaGFyICpcZkJTRExfR2V0S2V5TmFtZVxmUFxmUihcZkJTRExLZXkga2V5XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1JldHVybnMgdGhlIFNETC1kZWZpbmVkIG5hbWUgb2YgdGhlIFxmSVxmQlNETEtleVxmUlxmUiBcZkJrZXlcZlJcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETEtleVxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRLZXlTdGF0ZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0S2V5U3RhdGUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjc5YzgxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0S2V5U3RhdGUuMwpAQCAtMCwwICsxLDMwIEBACisuVEggIlNETF9HZXRLZXlTdGF0ZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU5IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dldEtleVN0YXRlIFwtIEdldCBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGtleWJvYXJkIHN0YXRlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCVWludDggKlxmQlNETF9HZXRLZXlTdGF0ZVxmUFxmUihcZkJpbnQgKm51bWtleXNcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorR2V0cyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGtleWJvYXJkIHN0YXRlXCYuIFRoZSBjdXJyZW50IHN0YXRlIGlzIHJldHVybiBhcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXksIHRoZSBzaXplIG9mIHRoaXMgYXJyYXkgaXMgc3RvcmVkIGluIFxmQm51bWtleXNcZlJcJi4gVGhlIGFycmF5IGlzIGluZGV4ZWQgYnkgdGhlIFxmSVxmQlNETEtfKlxmUFxmUiBzeW1ib2xzXCYuIEEgdmFsdWUgb2YgMSBtZWFucyB0aGUga2V5IGlzIHByZXNzZWQgYW5kIGEgdmFsdWUgb2YgMCBtZWFucyBpdHMgbm90XCYuIFRoZSBwb2ludGVyIHJldHVybmVkIGlzIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbCBTREwgYXJyYXkgYW5kIHNob3VsZCBub3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlclwmLgorLlBQCisuUlMKK1xmQk5vdGU6ICAKKy5QUAorVXNlIFxmSVxmQlNETF9QdW1wRXZlbnRzXGZQXGZSIHRvIHVwZGF0ZSB0aGUgc3RhdGUgYXJyYXlcJi4KKy5SRQorLlNIICJFWEFNUExFIgorLlBQCisuUFAKKy5uZgorXGYoQ1dVaW50OCAqa2V5c3RhdGUgPSBTRExfR2V0S2V5U3RhdGUoTlVMTCk7CitpZiAoIGtleXN0YXRlW1NETEtfUkVUVVJOXSApIHByaW50ZigiUmV0dXJuIEtleSBQcmVzc2VkXCYuCisiKTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTREwgS2V5IFN5bWJvbHNcZlBcZlIsIFxmSVxmQlNETF9QdW1wRXZlbnRzXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldE1vZFN0YXRlLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRNb2RTdGF0ZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZmYzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRNb2RTdGF0ZS4zCkBAIC0wLDAgKzEsNTQgQEAKKy5USCAiU0RMX0dldE1vZFN0YXRlIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfR2V0TW9kU3RhdGUgXC0gR2V0IHRoZSBzdGF0ZSBvZiBtb2RpZmllciBrZXlzXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCU0RMTW9kIFxmQlNETF9HZXRNb2RTdGF0ZVxmUFxmUihcZkJ2b2lkXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1JldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vZGlmaWVyIGtleXMgKENUUkwsIEFMVCwgZXRjXCYuKVwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1RoZSByZXR1cm4gdmFsdWUgY2FuIGJlIGFuIE9SXCYnZCBjb21iaW5hdGlvbiBvZiB0aGUgU0RMTW9kIGVudW1cJi4KKy5QUAorLlBQCisuUlMKK1xmQlNETE1vZFxmUgorLlBQCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIGVudW0geworICBLTU9EX05PTkUgID0gMHgwMDAwLAorICBLTU9EX0xTSElGVD0gMHgwMDAxLAorICBLTU9EX1JTSElGVD0gMHgwMDAyLAorICBLTU9EX0xDVFJMID0gMHgwMDQwLAorICBLTU9EX1JDVFJMID0gMHgwMDgwLAorICBLTU9EX0xBTFQgID0gMHgwMTAwLAorICBLTU9EX1JBTFQgID0gMHgwMjAwLAorICBLTU9EX0xNRVRBID0gMHgwNDAwLAorICBLTU9EX1JNRVRBID0gMHgwODAwLAorICBLTU9EX05VTSAgID0gMHgxMDAwLAorICBLTU9EX0NBUFMgID0gMHgyMDAwLAorICBLTU9EX01PREUgID0gMHg0MDAwLAorfSBTRExNb2Q7XGZSCisuZmkKKy5QUAorLlJFCisgU0RMIGFsc28gZGVmaW5lcyB0aGUgZm9sbG93aW5nIHN5bWJvbHMgZm9yIGNvbnZlbmllbmNlOiAKKy5QUAorLlJTCisuUFAKKy5uZgorXGYoQ1cjZGVmaW5lIEtNT0RfQ1RSTCAoS01PRF9MQ1RSTHxLTU9EX1JDVFJMKQorI2RlZmluZSBLTU9EX1NISUZUICAoS01PRF9MU0hJRlR8S01PRF9SU0hJRlQpCisjZGVmaW5lIEtNT0RfQUxUICAoS01PRF9MQUxUfEtNT0RfUkFMVCkKKyNkZWZpbmUgS01PRF9NRVRBIChLTU9EX0xNRVRBfEtNT0RfUk1FVEEpXGZSCisuZmkKKy5QUAorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfR2V0S2V5U3RhdGVcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0TW91c2VTdGF0ZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0TW91c2VTdGF0ZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MmFhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRNb3VzZVN0YXRlLjMKQEAgLTAsMCArMSwyNCBAQAorLlRIICJTRExfR2V0TW91c2VTdGF0ZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU5IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dldE1vdXNlU3RhdGUgXC0gUmV0cmlldmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdXNlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCVWludDggXGZCU0RMX0dldE1vdXNlU3RhdGVcZlBcZlIoXGZCaW50ICp4LCBpbnQgKnlcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhlIGN1cnJlbnQgYnV0dG9uIHN0YXRlIGlzIHJldHVybmVkIGFzIGEgYnV0dG9uIGJpdG1hc2ssIHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgdGhlIFxmQlNETF9CVVRUT04oWClcZlAgbWFjcm9zLCBhbmQgXGZCeFxmUiBhbmQgXGZCeVxmUiBhcmUgc2V0IHRvIHRoZSBjdXJyZW50IG1vdXNlIGN1cnNvciBwb3NpdGlvblwmLiBZb3UgY2FuIHBhc3MgXGZCTlVMTFxmUCBmb3IgZWl0aGVyIFxmQnhcZlIgb3IgXGZCeVxmUlwmLgorLlNIICJFWEFNUExFIgorLlBQCisubmYKK1xmKENXU0RMX1B1bXBFdmVudHMoKTsKK2lmKFNETF9HZXRNb3VzZVN0YXRlKE5VTEwsIE5VTEwpJlNETF9CVVRUT04oMSkpCisgIHByaW50ZigiTW91c2UgQnV0dG9uIDEobGVmdCkgaXMgcHJlc3NlZFwmLgorIik7XGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZVxmUFxmUiwgXGZJXGZCU0RMX1B1bXBFdmVudHNcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0UkdCLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRSR0IuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjFhMTYyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0UkdCLjMKQEAgLTAsMCArMSwxNyBAQAorLlRIICJTRExfR2V0UkdCIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfR2V0UkdCIFwtIEdldCBSR0IgdmFsdWVzIGZyb20gYSBwaXhlbCBpbiB0aGUgc3BlY2lmaWVkIHBpeGVsIGZvcm1hdFwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQnZvaWQgXGZCU0RMX0dldFJHQlxmUFxmUihcZkJVaW50MzIgcGl4ZWwsIFNETF9QaXhlbEZvcm1hdCAqZm10LCBVaW50OCAqciwgVWludDggKmcsIFVpbnQ4ICpiXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0dldCBSR0IgY29tcG9uZW50IHZhbHVlcyBmcm9tIGEgcGl4ZWwgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgcGl4ZWwgZm9ybWF0XCYuCisuUFAKK1RoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZW50aXJlIDgtYml0IFswXCYuXCYuMjU1XSByYW5nZSB3aGVuIGNvbnZlcnRpbmcgY29sb3IgY29tcG9uZW50cyBmcm9tIHBpeGVsIGZvcm1hdHMgd2l0aCBsZXNzIHRoYW4gOC1iaXRzIHBlciBSR0IgY29tcG9uZW50IChlXCYuZ1wmLiwgYSBjb21wbGV0ZWx5IHdoaXRlIHBpeGVsIGluIDE2LWJpdCBSR0I1NjUgZm9ybWF0IHdvdWxkIHJldHVybiBbMHhmZiwgMHhmZiwgMHhmZl0gbm90IFsweGY4LCAweGZjLCAweGY4XSlcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9HZXRSR0JBXGZQXGZSLCBcZklcZkJTRExfTWFwUkdCXGZQXGZSLCBcZklcZkJTRExfTWFwUkdCQVxmUFxmUiwgXGZJXGZCU0RMX1BpeGVsRm9ybWF0XGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldFJHQkEuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldFJHQkEuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmE5ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0UkdCQS4zCkBAIC0wLDAgKzEsMTkgQEAKKy5USCAiU0RMX0dldFJHQkEiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9HZXRSR0JBIFwtIEdldCBSR0JBIHZhbHVlcyBmcm9tIGEgcGl4ZWwgaW4gdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXRcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9HZXRSR0JBXGZQXGZSKFxmQlVpbnQzMiBwaXhlbCwgU0RMX1BpeGVsRm9ybWF0ICpmbXQsIFVpbnQ4ICpyLCBVaW50OCAqZywgVWludDggKmIsIFVpbnQ4ICphXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0dldCBSR0JBIGNvbXBvbmVudCB2YWx1ZXMgZnJvbSBhIHBpeGVsIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIHBpeGVsIGZvcm1hdFwmLgorLlBQCitUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGVudGlyZSA4LWJpdCBbMFwmLlwmLjI1NV0gcmFuZ2Ugd2hlbiBjb252ZXJ0aW5nIGNvbG9yIGNvbXBvbmVudHMgZnJvbSBwaXhlbCBmb3JtYXRzIHdpdGggbGVzcyB0aGFuIDgtYml0cyBwZXIgUkdCIGNvbXBvbmVudCAoZVwmLmdcJi4sIGEgY29tcGxldGVseSB3aGl0ZSBwaXhlbCBpbiAxNi1iaXQgUkdCNTY1IGZvcm1hdCB3b3VsZCByZXR1cm4gWzB4ZmYsIDB4ZmYsIDB4ZmZdIG5vdCBbMHhmOCwgMHhmYywgMHhmOF0pXCYuCisuUFAKK0lmIHRoZSBzdXJmYWNlIGhhcyBubyBhbHBoYSBjb21wb25lbnQsIHRoZSBhbHBoYSB3aWxsIGJlIHJldHVybmVkIGFzIDB4ZmYgKDEwMCUgb3BhcXVlKVwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJU0RMX0dldFJHQlxmUiwgXGZJU0RMX01hcFJHQlxmUiwgXGZJU0RMX01hcFJHQkFcZlIsIFxmSVNETF9QaXhlbEZvcm1hdFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRSZWxhdGl2ZU1vdXNlU3RhdGUuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWY0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRSZWxhdGl2ZU1vdXNlU3RhdGUuMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9HZXRSZWxhdGl2ZU1vdXNlU3RhdGUiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9HZXRSZWxhdGl2ZU1vdXNlU3RhdGUgXC0gUmV0cmlldmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdXNlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCVWludDggXGZCU0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZVxmUFxmUihcZkJpbnQgKngsIGludCAqeVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGUgY3VycmVudCBidXR0b24gc3RhdGUgaXMgcmV0dXJuZWQgYXMgYSBidXR0b24gYml0bWFzaywgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyB0aGUgXGZCU0RMX0JVVFRPTihYKVxmUCBtYWNyb3MsIGFuZCBcZkJ4XGZSIGFuZCBcZkJ5XGZSIGFyZSBzZXQgdG8gdGhlIGNoYW5nZSBpbiB0aGUgbW91c2UgcG9zaXRpb24gc2luY2UgdGhlIGxhc3QgY2FsbCB0byBcZkJTRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlXGZQIG9yIHNpbmNlIGV2ZW50IGluaXRpYWxpemF0aW9uXCYuIFlvdSBjYW4gcGFzcyBcZkJOVUxMXGZQIGZvciBlaXRoZXIgXGZCeFxmUiBvciBcZkJ5XGZSXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfR2V0TW91c2VTdGF0ZVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRUaHJlYWRJRC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0VGhyZWFkSUQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg1YWViCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0VGhyZWFkSUQuMwpAQCAtMCwwICsxLDE2IEBACisuVEggIlNETF9HZXRUaHJlYWRJRCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0dldFRocmVhZElEIFwtIEdldCB0aGUgU0RMIHRocmVhZCBJRCBvZiBhIFNETF9UaHJlYWQKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorI2luY2x1ZGUgIlNETF90aHJlYWRcJi5oIgorLnNwCitcZkJVaW50MzIgXGZCU0RMX0dldFRocmVhZElEXGZQXGZSKFxmQlNETF9UaHJlYWQgKnRocmVhZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitSZXR1cm5zIHRoZSBJRCBvZiBhIFxmQlNETF9UaHJlYWRcZlIgY3JlYXRlZCBieSBcZklTRExfQ3JlYXRlVGhyZWFkXGZSXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklTRExfQ3JlYXRlVGhyZWFkXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldFRpY2tzLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRUaWNrcy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTU3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRUaWNrcy4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX0dldFRpY2tzIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfR2V0VGlja3MgXC0gR2V0IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBTREwgbGlicmFyeSBpbml0aWFsaXphdGlvblwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQlVpbnQzMiBcZkJTRExfR2V0VGlja3NcZlBcZlIoXGZCdm9pZFxmUikKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0dldCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgU0RMIGxpYnJhcnkgaW5pdGlhbGl6YXRpb25cJi4gTm90ZSB0aGF0IHRoaXMgdmFsdWUgd3JhcHMgaWYgdGhlIHByb2dyYW0gcnVucyBmb3IgbW9yZSB0aGFuIH40OSBkYXlzXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfRGVsYXlcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0VmlkZW9JbmZvLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRWaWRlb0luZm8uMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODJiMjhlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfR2V0VmlkZW9JbmZvLjMKQEAgLTAsMCArMSwxNSBAQAorLlRIICJTRExfR2V0VmlkZW9JbmZvIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfR2V0VmlkZW9JbmZvIFwtIHJldHVybnMgYSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyBoYXJkd2FyZQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQlNETF9WaWRlb0luZm8gKlxmQlNETF9HZXRWaWRlb0luZm9cZlBcZlIoXGZCdm9pZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSByZWFkLW9ubHkgcG9pbnRlciB0byBcZklpbmZvcm1hdGlvblxmUiBhYm91dCB0aGUgdmlkZW8gaGFyZHdhcmVcJi4gSWYgdGhpcyBpcyBjYWxsZWQgYmVmb3JlIFxmSVNETF9TZXRWaWRlb01vZGVcZlIsIHRoZSBcZkJ2Zm10XGZSIG1lbWJlciBvZiB0aGUgcmV0dXJuZWQgc3RydWN0dXJlIHdpbGwgY29udGFpbiB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSAiYmVzdCIgdmlkZW8gbW9kZVwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1NldFZpZGVvTW9kZVxmUFxmUiwgXGZJXGZCU0RMX1ZpZGVvSW5mb1xmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRWaWRlb1N1cmZhY2UuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0dldFZpZGVvU3VyZmFjZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNWQ3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9HZXRWaWRlb1N1cmZhY2UuMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9HZXRWaWRlb1N1cmZhY2UiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9HZXRWaWRlb1N1cmZhY2UgXC0gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGlzcGxheSBzdXJmYWNlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCU0RMX1N1cmZhY2UgKlxmQlNETF9HZXRWaWRlb1N1cmZhY2VcZlBcZlIoXGZCdm9pZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRpc3BsYXkgc3VyZmFjZVwmLiBJZiBTREwgaXMgZG9pbmcgZm9ybWF0IGNvbnZlcnNpb24gb24gdGhlIGRpc3BsYXkgc3VyZmFjZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwdWJsaWNseSB2aXNpYmxlIHN1cmZhY2UsIG5vdCB0aGUgcmVhbCB2aWRlbyBzdXJmYWNlXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfU3VyZmFjZVxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Jbml0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Jbml0LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1MDA1NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0luaXQuMwpAQCAtMCwwICsxLDQxIEBACisuVEggIlNETF9Jbml0IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfSW5pdCBcLSBJbml0aWFsaXplcyBTREwKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX0luaXRcZlBcZlIoXGZCVWludDMyIGZsYWdzXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0luaXRpYWxpemVzIFNETFwmLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFsbCBvdGhlciBTREwgZnVuY3Rpb25zXCYuIFRoZSBcZkJmbGFnc1xmUiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoYXQgcGFydChzKSBvZiBTREwgdG8gaW5pdGlhbGl6ZVwmLgorLlRQIDIwCitcZkJTRExfSU5JVF9USU1FUlxmUAorSW5pdGlhbGl6ZXMgdGhlIFxmSXRpbWVyXGZSIHN1YnN5c3RlbVwmLgorLlRQIDIwCitcZkJTRExfSU5JVF9BVURJT1xmUAorSW5pdGlhbGl6ZXMgdGhlIFxmSWF1ZGlvXGZSIHN1YnN5c3RlbVwmLgorLlRQIDIwCitcZkJTRExfSU5JVF9WSURFT1xmUAorSW5pdGlhbGl6ZXMgdGhlIFxmSXZpZGVvXGZSIHN1YnN5c3RlbVwmLgorLlRQIDIwCitcZkJTRExfSU5JVF9DRFJPTVxmUAorSW5pdGlhbGl6ZXMgdGhlIFxmSWNkcm9tXGZSIHN1YnN5c3RlbVwmLgorLlRQIDIwCitcZkJTRExfSU5JVF9KT1lTVElDS1xmUAorSW5pdGlhbGl6ZXMgdGhlIFxmSWpveXN0aWNrXGZSIHN1YnN5c3RlbVwmLgorLlRQIDIwCitcZkJTRExfSU5JVF9FVkVSWVRISU5HXGZQCitJbml0aWFsaXplIGFsbCBvZiB0aGUgYWJvdmVcJi4KKy5UUCAyMAorXGZCU0RMX0lOSVRfTk9QQVJBQ0hVVEVcZlAKK1ByZXZlbnRzIFNETCBmcm9tIGNhdGNoaW5nIGZhdGFsIHNpZ25hbHNcJi4KKy5UUCAyMAorXGZCU0RMX0lOSVRfRVZFTlRUSFJFQURcZlAKKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIFxmQi0xXGZSIG9uIGFuIGVycm9yIG9yIFxmQjBcZlIgb24gc3VjY2Vzc1wmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1F1aXRcZlBcZlIsIFxmSVxmQlNETF9Jbml0U3ViU3lzdGVtXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0luaXRTdWJTeXN0ZW0uMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0luaXRTdWJTeXN0ZW0uMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE4MmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSW5pdFN1YlN5c3RlbS4zCkBAIC0wLDAgKzEsNDEgQEAKKy5USCAiU0RMX0luaXRTdWJTeXN0ZW0iICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Jbml0U3ViU3lzdGVtIFwtIEluaXRpYWxpemUgc3Vic3lzdGVtcworLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfSW5pdFN1YlN5c3RlbVxmUFxmUihcZkJVaW50MzIgZmxhZ3NcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorQWZ0ZXIgU0RMIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggXGZJXGZCU0RMX0luaXRcZlBcZlIgeW91IG1heSBpbml0aWFsaXplIHVuaW5pdGlhbGl6ZWQgc3Vic3lzdGVtcyB3aXRoIFxmQlNETF9Jbml0U3ViU3lzdGVtXGZQXCYuIFRoZSBcZkJmbGFnc1xmUiBwYXJhbWV0ZXIgaXMgdGhlIHNhbWUgYXMgdGhhdCB1c2VkIGluIFxmSVxmQlNETF9Jbml0XGZQXGZSXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisubmYKK1xmKENXLyogU2VwZXJhdGluZyBKb3lzdGljayBhbmQgVmlkZW8gaW5pdGlhbGl6YXRpb25cJi4gKi8KK1NETF9Jbml0KFNETF9JTklUX1ZJREVPKTsKK1wmLgorXCYuCitTRExfU2V0VmlkZW9Nb2RlKDY0MCwgNDgwLCAxNiwgU0RMX0RPVUJMRUJVRnxTRExfRlVMTFNDUkVFTik7CitcJi4KKy8qIERvIFNvbWUgVmlkZW8gc3R1ZmYgKi8KK1wmLgorXCYuCisvKiBJbml0aWFsaXplIHRoZSBqb3lzdGljayBzdWJzeXN0ZW0gKi8KK1NETF9Jbml0U3ViU3lzdGVtKFNETF9JTklUX0pPWVNUSUNLKTsKKworLyogRG8gc29tZSBzdHVmZiB3aXRoIHZpZGVvIGFuZCBqb3lzdGljayAqLworXCYuCitcJi4KK1wmLgorLyogU2h1dCB0aGVtIGJvdGggZG93biAqLworU0RMX1F1aXQoKTtcZlIKKy5maQorLlBQCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyBcZkItMVxmUiBvbiBhbiBlcnJvciBvciBcZkIwXGZSIG9uIHN1Y2Nlc3NcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9Jbml0XGZQXGZSLCBcZklcZkJTRExfUXVpdFxmUFxmUiwgXGZJXGZCU0RMX1F1aXRTdWJTeXN0ZW1cZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95QXhpc0V2ZW50LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lBeGlzRXZlbnQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODMwMWZkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95QXhpc0V2ZW50LjMKQEAgLTAsMCArMSwzNiBAQAorLlRIICJTRExfSm95QXhpc0V2ZW50IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfSm95QXhpc0V2ZW50IFwtIEpveXN0aWNrIGF4aXMgbW90aW9uIGV2ZW50IHN0cnVjdHVyZQorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBVaW50OCB0eXBlOworICBVaW50OCB3aGljaDsKKyAgVWludDggYXhpczsKKyAgU2ludDE2IHZhbHVlOworfSBTRExfSm95QXhpc0V2ZW50O1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQnR5cGVcZlIKK1xmQlNETF9KT1lBWElTTU9USU9OXGZQCisuVFAgMjAKK1xmQndoaWNoXGZSCitKb3lzdGljayBkZXZpY2UgaW5kZXgKKy5UUCAyMAorXGZCYXhpc1xmUgorSm95c3RpY2sgYXhpcyBpbmRleAorLlRQIDIwCitcZkJ2YWx1ZVxmUgorQXhpcyB2YWx1ZSAocmFuZ2U6IC0zMjc2OCB0byAzMjc2NykKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9Kb3lBeGlzRXZlbnRcZlIgaXMgYSBtZW1iZXIgb2YgdGhlIFxmSVxmQlNETF9FdmVudFxmUlxmUiB1bmlvbiBhbmQgaXMgdXNlZCB3aGVuIGFuIGV2ZW50IG9mIHR5cGUgXGZCU0RMX0pPWUFYSVNNT1RJT05cZlAgaXMgcmVwb3J0ZWRcJi4KKy5QUAorQSBcZkJTRExfSk9ZQVhJU01PVElPTlxmUCBldmVudCBvY2N1cnMgd2hlbiBldmVyIGEgdXNlciBtb3ZlcyBhbiBheGlzIG9uIHRoZSBqb3lzdGlja1wmLiBUaGUgZmllbGQgXGZCd2hpY2hcZlIgaXMgdGhlIGluZGV4IG9mIHRoZSBqb3lzdGljayB0aGF0IHJlcG9ydGVkIHRoZSBldmVudCBhbmQgXGZCYXhpc1xmUiBpcyB0aGUgaW5kZXggb2YgdGhlIGF4aXMgKGZvciBhIG1vcmUgZGV0YWlsZWQgZXhwbGFpbmF0aW9uIHNlZSB0aGUgXGZJSm95c3RpY2sgc2VjdGlvblxmUilcJi4gXGZCdmFsdWVcZlIgaXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGF4aXNcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9FdmVudFxmUlxmUiwgXGZJSm95c3RpY2sgRnVuY3Rpb25zXGZSLCBcZklcZkJTRExfSm95c3RpY2tFdmVudFN0YXRlXGZQXGZSLCBcZklcZkJTRExfSm95c3RpY2tHZXRBeGlzXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveUJhbGxFdmVudC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95QmFsbEV2ZW50LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0MmY3YgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveUJhbGxFdmVudC4zCkBAIC0wLDAgKzEsMzYgQEAKKy5USCAiU0RMX0pveUJhbGxFdmVudCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU5IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0pveUJhbGxFdmVudCBcLSBKb3lzdGljayB0cmFja2JhbGwgbW90aW9uIGV2ZW50IHN0cnVjdHVyZQorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBVaW50OCB0eXBlOworICBVaW50OCB3aGljaDsKKyAgVWludDggYmFsbDsKKyAgU2ludDE2IHhyZWwsIHlyZWw7Cit9IFNETF9Kb3lCYWxsRXZlbnQ7XGZSCisuZmkKKy5QUAorLlNIICJTVFJVQ1RVUkUgREFUQSIKKy5UUCAyMAorXGZCdHlwZVxmUgorXGZCU0RMX0pPWUJBTExNT1RJT05cZlAKKy5UUCAyMAorXGZCd2hpY2hcZlIKK0pveXN0aWNrIGRldmljZSBpbmRleAorLlRQIDIwCitcZkJiYWxsXGZSCitKb3lzdGljayB0cmFja2JhbGwgaW5kZXgKKy5UUCAyMAorXGZCeHJlbFxmUiwgXGZCeXJlbFxmUgorVGhlIHJlbGF0aXZlIG1vdGlvbiBpbiB0aGUgWC9ZIGRpcmVjdGlvbgorLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX0pveUJhbGxFdmVudFxmUiBpcyBhIG1lbWJlciBvZiB0aGUgXGZJXGZCU0RMX0V2ZW50XGZSXGZSIHVuaW9uIGFuZCBpcyB1c2VkIHdoZW4gYW4gZXZlbnQgb2YgdHlwZSBcZkJTRExfSk9ZQkFMTE1PVElPTlxmUCBpcyByZXBvcnRlZFwmLgorLlBQCitBIFxmQlNETF9KT1lCQUxMTU9USU9OXGZQIGV2ZW50IG9jY3VycyB3aGVuIGEgdXNlciBtb3ZlcyBhIHRyYWNrYmFsbCBvbiB0aGUgam95c3RpY2tcJi4gVGhlIGZpZWxkIFxmQndoaWNoXGZSIGlzIHRoZSBpbmRleCBvZiB0aGUgam95c3RpY2sgdGhhdCByZXBvcnRlZCB0aGUgZXZlbnQgYW5kIFxmQmJhbGxcZlIgaXMgdGhlIGluZGV4IG9mIHRoZSB0cmFja2JhbGwgKGZvciBhIG1vcmUgZGV0YWlsZWQgZXhwbGFpbmF0aW9uIHNlZSB0aGUgXGZJSm95c3RpY2sgc2VjdGlvblxmUilcJi4gVHJhY2tiYWxscyBvbmx5IHJldHVybiByZWxhdGl2ZSBtb3Rpb24sIHRoaXMgaXMgdGhlIGNoYW5nZSBpbiBwb3NpdGlvbiBvbiB0aGUgYmFsbCBzaW5jZSBpdCB3YXMgbGFzdCBwb2xsZWQgKGxhc3QgY3ljbGUgb2YgdGhlIGV2ZW50IGxvb3ApIGFuZCBpdCBpcyBzdG9yZWQgaW4gXGZCeHJlbFxmUiBhbmQgXGZCeXJlbFxmUlwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0V2ZW50XGZSXGZSLCBcZklKb3lzdGljayBGdW5jdGlvbnNcZlIsIFxmSVxmQlNETF9Kb3lzdGlja0V2ZW50U3RhdGVcZlBcZlIsIFxmSVxmQlNETF9Kb3lzdGlja0dldEJhbGxcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95QnV0dG9uRXZlbnQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveUJ1dHRvbkV2ZW50LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkMDc5MwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveUJ1dHRvbkV2ZW50LjMKQEAgLTAsMCArMSwzNiBAQAorLlRIICJTRExfSm95QnV0dG9uRXZlbnQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Kb3lCdXR0b25FdmVudCBcLSBKb3lzdGljayBidXR0b24gZXZlbnQgc3RydWN0dXJlCisuU0ggIlNUUlVDVFVSRSBERUZJTklUSU9OIgorLlBQCisubmYKK1xmKENXdHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGU7CisgIFVpbnQ4IHdoaWNoOworICBVaW50OCBidXR0b247CisgIFVpbnQ4IHN0YXRlOworfSBTRExfSm95QnV0dG9uRXZlbnQ7XGZSCisuZmkKKy5QUAorLlNIICJTVFJVQ1RVUkUgREFUQSIKKy5UUCAyMAorXGZCdHlwZVxmUgorXGZCU0RMX0pPWUJVVFRPTkRPV05cZlAgb3IgXGZCU0RMX0pPWUJVVFRPTlVQXGZQCisuVFAgMjAKK1xmQndoaWNoXGZSCitKb3lzdGljayBkZXZpY2UgaW5kZXgKKy5UUCAyMAorXGZCYnV0dG9uXGZSCitKb3lzdGljayBidXR0b24gaW5kZXgKKy5UUCAyMAorXGZCc3RhdGVcZlIKK1xmQlNETF9QUkVTU0VEXGZQIG9yIFxmQlNETF9SRUxFQVNFRFxmUAorLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX0pveUJ1dHRvbkV2ZW50XGZSIGlzIGEgbWVtYmVyIG9mIHRoZSBcZklcZkJTRExfRXZlbnRcZlJcZlIgdW5pb24gYW5kIGlzIHVzZWQgd2hlbiBhbiBldmVudCBvZiB0eXBlIFxmQlNETF9KT1lCVVRUT05ET1dOXGZQIG9yIFxmQlNETF9KT1lCVVRUT05VUFxmUCBpcyByZXBvcnRlZFwmLgorLlBQCitBIFxmQlNETF9KT1lCVVRUT05ET1dOXGZQIG9yIFxmQlNETF9KT1lCVVRUT05VUFxmUCBldmVudCBvY2N1cnMgd2hlbiBldmVyIGEgdXNlciBwcmVzc2VzIG9yIHJlbGVhc2VzIGEgYnV0dG9uIG9uIGEgam95c3RpY2tcJi4gVGhlIGZpZWxkIFxmQndoaWNoXGZSIGlzIHRoZSBpbmRleCBvZiB0aGUgam95c3RpY2sgdGhhdCByZXBvcnRlZCB0aGUgZXZlbnQgYW5kIFxmQmJ1dHRvblxmUiBpcyB0aGUgaW5kZXggb2YgdGhlIGJ1dHRvbiAoZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYWluYXRpb24gc2VlIHRoZSBcZklKb3lzdGljayBzZWN0aW9uXGZSKVwmLiBcZkJzdGF0ZVxmUiBpcyB0aGUgY3VycmVudCBzdGF0ZSBvciB0aGUgYnV0dG9uIHdoaWNoIGlzIGVpdGhlciBcZkJTRExfUFJFU1NFRFxmUCBvciBcZkJTRExfUkVMRUFTRURcZlBcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9FdmVudFxmUlxmUiwgXGZJSm95c3RpY2sgRnVuY3Rpb25zXGZSLCBcZklcZkJTRExfSm95c3RpY2tFdmVudFN0YXRlXGZQXGZSLCBcZklcZkJTRExfSm95c3RpY2tHZXRCdXR0b25cZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95SGF0RXZlbnQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveUhhdEV2ZW50LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxN2FkNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveUhhdEV2ZW50LjMKQEAgLTAsMCArMSw1NiBAQAorLlRIICJTRExfSm95SGF0RXZlbnQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Kb3lIYXRFdmVudCBcLSBKb3lzdGljayBoYXQgcG9zaXRpb24gY2hhbmdlIGV2ZW50IHN0cnVjdHVyZQorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBVaW50OCB0eXBlOworICBVaW50OCB3aGljaDsKKyAgVWludDggaGF0OworICBVaW50OCB2YWx1ZTsKK30gU0RMX0pveUhhdEV2ZW50O1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQnR5cGVcZlIKK1xmQlNETF9KT1lcZlAKKy5UUCAyMAorXGZCd2hpY2hcZlIKK0pveXN0aWNrIGRldmljZSBpbmRleAorLlRQIDIwCitcZkJoYXRcZlIKK0pveXN0aWNrIGhhdCBpbmRleAorLlRQIDIwCitcZkJ2YWx1ZVxmUgorSGF0IHBvc2l0aW9uCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJTRExfSm95SGF0RXZlbnRcZlIgaXMgYSBtZW1iZXIgb2YgdGhlIFxmSVxmQlNETF9FdmVudFxmUlxmUiB1bmlvbiBhbmQgaXMgdXNlZCB3aGVuIGFuIGV2ZW50IG9mIHR5cGUgXGZCU0RMX0pPWUhBVE1PVElPTlxmUCBpcyByZXBvcnRlZFwmLgorLlBQCitBIFxmQlNETF9KT1lIQVRNT1RJT05cZlAgZXZlbnQgb2NjdXJzIHdoZW4gZXZlciBhIHVzZXIgbW92ZXMgYSBoYXQgb24gdGhlIGpveXN0aWNrXCYuIFRoZSBmaWVsZCBcZkJ3aGljaFxmUiBpcyB0aGUgaW5kZXggb2YgdGhlIGpveXN0aWNrIHRoYXQgcmVwb3J0ZWQgdGhlIGV2ZW50IGFuZCBcZkJoYXRcZlIgaXMgdGhlIGluZGV4IG9mIHRoZSBoYXQgKGZvciBhIG1vcmUgZGV0YWlsZWQgZXhsYWluYXRpb24gc2VlIHRoZSBcZklKb3lzdGljayBzZWN0aW9uXGZSKVwmLiBcZkJ2YWx1ZVxmUiBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgaGF0XCYuIEl0IGlzIGEgbG9naWNhbGx5IE9SXCYnZCBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyAod2hvc2UgbWVhbmluZ3Mgc2hvdWxkIGJlIHByZXR0eSBvYnZpb3VzOikgOgorLklQICIiIDEwCitcZkJTRExfSEFUX0NFTlRFUkVEXGZQCisuSVAgIiIgMTAKK1xmQlNETF9IQVRfVVBcZlAKKy5JUCAiIiAxMAorXGZCU0RMX0hBVF9SSUdIVFxmUAorLklQICIiIDEwCitcZkJTRExfSEFUX0RPV05cZlAKKy5JUCAiIiAxMAorXGZCU0RMX0hBVF9MRUZUXGZQCisuUFAKK1RoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgYWxzbyBwcm92aWRlZDoKKy5JUCAiIiAxMAorXGZCU0RMX0hBVF9SSUdIVFVQXGZQCisuSVAgIiIgMTAKK1xmQlNETF9IQVRfUklHSFRET1dOXGZQCisuSVAgIiIgMTAKK1xmQlNETF9IQVRfTEVGVFVQXGZQCisuSVAgIiIgMTAKK1xmQlNETF9IQVRfTEVGVERPV05cZlAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9FdmVudFxmUlxmUiwgXGZJSm95c3RpY2sgRnVuY3Rpb25zXGZSLCBcZklcZkJTRExfSm95c3RpY2tFdmVudFN0YXRlXGZQXGZSLCBcZklcZkJTRExfSm95c3RpY2tHZXRIYXRcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tDbG9zZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tDbG9zZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MTcwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja0Nsb3NlLjMKQEAgLTAsMCArMSwxNSBAQAorLlRIICJTRExfSm95c3RpY2tDbG9zZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0pveXN0aWNrQ2xvc2UgXC0gQ2xvc2VzIGEgcHJldmlvdXNseSBvcGVuZWQgam95c3RpY2sKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9Kb3lzdGlja0Nsb3NlXGZQXGZSKFxmQlNETF9Kb3lzdGljayAqam95c3RpY2tcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorQ2xvc2UgYSBcZkJqb3lzdGlja1xmUiB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIFxmSVxmQlNETF9Kb3lzdGlja09wZW5cZlBcZlJcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9Kb3lzdGlja09wZW5cZlBcZlIsIFxmSVxmQlNETF9Kb3lzdGlja09wZW5lZFxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja0V2ZW50U3RhdGUuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrRXZlbnRTdGF0ZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDEwZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja0V2ZW50U3RhdGUuMwpAQCAtMCwwICsxLDI0IEBACisuVEggIlNETF9Kb3lzdGlja0V2ZW50U3RhdGUiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Kb3lzdGlja0V2ZW50U3RhdGUgXC0gRW5hYmxlL2Rpc2FibGUgam95c3RpY2sgZXZlbnQgcG9sbGluZworLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfSm95c3RpY2tFdmVudFN0YXRlXGZQXGZSKFxmQmludCBzdGF0ZVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgam95c3RpY2sgZXZlbnQgcHJvY2Vzc2luZ1wmLiBXaXRoIGpveXN0aWNrIGV2ZW50IHByb2Nlc3NpbmcgZGlzYWJsZWQgeW91IHdpbGwgaGF2ZSB0byB1cGRhdGUgam95c3RpY2sgc3RhdGVzIHdpdGggXGZJXGZCU0RMX0pveXN0aWNrVXBkYXRlXGZQXGZSIGFuZCByZWFkIHRoZSBqb3lzdGljayBpbmZvcm1hdGlvbiBtYW51YWxseVwmLiBcZkJzdGF0ZVxmUiBpcyBlaXRoZXIgXGZCU0RMX1FVRVJZXGZQLCBcZkJTRExfRU5BQkxFXGZQIG9yIFxmQlNETF9JR05PUkVcZlBcJi4KKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK0pveXN0aWNrIGV2ZW50IGhhbmRsaW5nIGlzIHByZWZlcmVkCisuUkUKKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitJZiBcZkJzdGF0ZVxmUiBpcyBcZkJTRExfUVVFUllcZlAgdGhlbiB0aGUgY3VycmVudCBzdGF0ZSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSBuZXcgcHJvY2Vzc2luZyBcZkJzdGF0ZVxmUiBpcyByZXR1cm5lZFwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJU0RMIEpveXN0aWNrIEZ1bmN0aW9uc1xmUiwgXGZJXGZCU0RMX0pveXN0aWNrVXBkYXRlXGZQXGZSLCBcZklcZkJTRExfSm95QXhpc0V2ZW50XGZSXGZSLCBcZklcZkJTRExfSm95QmFsbEV2ZW50XGZSXGZSLCBcZklcZkJTRExfSm95QnV0dG9uRXZlbnRcZlJcZlIsIFxmSVxmQlNETF9Kb3lIYXRFdmVudFxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja0dldEF4aXMuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrR2V0QXhpcy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhODBiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja0dldEF4aXMuMwpAQCAtMCwwICsxLDMyIEBACisuVEggIlNETF9Kb3lzdGlja0dldEF4aXMiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Kb3lzdGlja0dldEF4aXMgXC0gR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIGF4aXMKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJTaW50MTYgXGZCU0RMX0pveXN0aWNrR2V0QXhpc1xmUFxmUihcZkJTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYXhpc1xmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJTRExfSm95c3RpY2tHZXRBeGlzXGZQIHJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGdpdmVuIFxmQmF4aXNcZlIgb24gdGhlIGdpdmVuIFxmQmpveXN0aWNrXGZSXCYuCisuUFAKK09uIG1vc3QgbW9kZXJuIGpveXN0aWNrcyB0aGUgWCBheGlzIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgXGZCYXhpc1xmUiAwIGFuZCB0aGUgWSBheGlzIGJ5IFxmQmF4aXNcZlIgMVwmLiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgXGZCU0RMX0pveXN0aWNrR2V0QXhpc1xmUCBpcyBhIHNpZ25lZCBpbnRlZ2VyICgtMzI3NjggdG8gMzI3NjgpIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgXGZCYXhpc1xmUiwgaXQgbWF5YmUgbmVjZXNzYXJ5IHRvIGltcG9zZSBjZXJ0YWluIHRvbGVyYW5jZXMgb24gdGhlc2UgdmFsdWVzIHRvIGFjY291bnQgZm9yIGppdHRlclwmLiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBzb21lIGpveXN0aWNrcyB1c2UgYXhlcyAyIGFuZCAzIGZvciBleHRyYSBidXR0b25zXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyBhIDE2LWJpdCBzaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIFxmQmF4aXNcZlJcJi4KKy5TSCAiRVhBTVBMRVMiCisuUFAKKy5QUAorLm5mCitcZihDV1NpbnQxNiB4X21vdmUsIHlfbW92ZTsKK1NETF9Kb3lzdGljayAqam95MTsKK1wmLgorXCYuCit4X21vdmU9U0RMX0pveXN0aWNrR2V0QXhpcyhqb3kxLCAwKTsKK3lfbW92ZT1TRExfSm95c3RpY2tHZXRBeGlzKGpveTEsIDEpO1xmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9Kb3lzdGlja051bUF4ZXNcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tHZXRCYWxsLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja0dldEJhbGwuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjRjOTEwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tHZXRCYWxsLjMKQEAgLTAsMCArMSwzNyBAQAorLlRIICJTRExfSm95c3RpY2tHZXRCYWxsIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfSm95c3RpY2tHZXRCYWxsIFwtIEdldCByZWxhdGl2ZSB0cmFja2JhbGwgbW90aW9uCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9Kb3lzdGlja0dldEJhbGxcZlBcZlIoXGZCU0RMX0pveXN0aWNrICpqb3lzdGljaywgaW50IGJhbGwsIGludCAqZHgsIGludCAqZHlcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorR2V0IHRoZSBcZkJiYWxsXGZSIGF4aXMgY2hhbmdlXCYuCisuUFAKK1RyYWNrYmFsbHMgY2FuIG9ubHkgcmV0dXJuIHJlbGF0aXZlIG1vdGlvbiBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIFxmQlNETF9Kb3lzdGlja0dldEJhbGxcZlAsIHRoZXNlIG1vdGlvbiBkZWx0YXMgYSBwbGFjZWQgaW50byBcZkJkeFxmUiBhbmQgXGZCZHlcZlJcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIFxmQjBcZlIgb24gc3VjY2VzcyBvciBcZkItMVxmUiBvbiBmYWlsdXJlCisuU0ggIkVYQU1QTEVTIgorLlBQCisuUFAKKy5uZgorXGYoQ1dpbnQgZGVsdGFfeCwgZGVsdGFfeTsKK1NETF9Kb3lzdGljayAqam95OworXCYuCitcJi4KK1wmLgorU0RMX0pveXN0aWNrVXBkYXRlKCk7CitpZihTRExfSm95c3RpY2tHZXRCYWxsKGpveSwgMCwgJmRlbHRhX3gsICZkZWx0YV95KT09LTEpCisgIHByaW50ZigiVHJhY2tCYWxsIFJlYWQgRXJyb3IhCisiKTsKK3ByaW50ZigiVHJhY2tiYWxsIERlbHRhLSBYOiVkLCBZOiVkCisiLCBkZWx0YV94LCBkZWx0YV95KTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfSm95c3RpY2tOdW1CYWxsc1xmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja0dldEJ1dHRvbi4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tHZXRCdXR0b24uMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2IzMzZiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tHZXRCdXR0b24uMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9Kb3lzdGlja0dldEJ1dHRvbiIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0pveXN0aWNrR2V0QnV0dG9uIFwtIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGdpdmVuIGJ1dHRvbiBvbiBhIGdpdmVuIGpveXN0aWNrCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCVWludDggXGZCU0RMX0pveXN0aWNrR2V0QnV0dG9uXGZQXGZSKFxmQlNETF9Kb3lzdGljayAqam95c3RpY2ssIGludCBidXR0b25cZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorU0RMX0pveXN0aWNrR2V0QnV0dG9uIHJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGdpdmVuIFxmQmJ1dHRvblxmUiBvbiB0aGUgZ2l2ZW4gXGZCam95c3RpY2tcZlJcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitcZkIxXGZSIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZFwmLiBPdGhlcndpc2UsIFxmQjBcZlJcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9Kb3lzdGlja051bUJ1dHRvbnNcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tHZXRIYXQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrR2V0SGF0LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiZDkxMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrR2V0SGF0LjMKQEAgLTAsMCArMSwzNiBAQAorLlRIICJTRExfSm95c3RpY2tHZXRIYXQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Kb3lzdGlja0dldEhhdCBcLSBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBqb3lzdGljayBoYXQKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJVaW50OCBcZkJTRExfSm95c3RpY2tHZXRIYXRcZlBcZlIoXGZCU0RMX0pveXN0aWNrICpqb3lzdGljaywgaW50IGhhdFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitTRExfSm95c3RpY2tHZXRIYXQgcmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gXGZCaGF0XGZSIG9uIHRoZSBnaXZlbiBcZkJqb3lzdGlja1xmUlwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1RoZSBjdXJyZW50IHN0YXRlIGlzIHJldHVybmVkIGFzIGEgVWludDggd2hpY2ggaXMgZGVmaW5lZCBhcyBhbiBPUlwmJ2QgY29tYmluYXRpb24gb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZworLklQICIiIDEwCitcZkJTRExfSEFUX0NFTlRFUkVEXGZQCisuSVAgIiIgMTAKK1xmQlNETF9IQVRfVVBcZlAKKy5JUCAiIiAxMAorXGZCU0RMX0hBVF9SSUdIVFxmUAorLklQICIiIDEwCitcZkJTRExfSEFUX0RPV05cZlAKKy5JUCAiIiAxMAorXGZCU0RMX0hBVF9MRUZUXGZQCisuSVAgIiIgMTAKK1xmQlNETF9IQVRfUklHSFRVUFxmUAorLklQICIiIDEwCitcZkJTRExfSEFUX1JJR0hURE9XTlxmUAorLklQICIiIDEwCitcZkJTRExfSEFUX0xFRlRVUFxmUAorLklQICIiIDEwCitcZkJTRExfSEFUX0xFRlRET1dOXGZQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfSm95c3RpY2tOdW1IYXRzXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrSW5kZXguMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrSW5kZXguMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTFlNGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tJbmRleC4zCkBAIC0wLDAgKzEsMTggQEAKKy5USCAiU0RMX0pveXN0aWNrSW5kZXgiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Kb3lzdGlja0luZGV4IFwtIEdldCB0aGUgaW5kZXggb2YgYW4gU0RMX0pveXN0aWNrXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9Kb3lzdGlja0luZGV4XGZQXGZSKFxmQlNETF9Kb3lzdGljayAqam95c3RpY2tcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorUmV0dXJucyB0aGUgaW5kZXggb2YgYSBnaXZlbiBcZkJTRExfSm95c3RpY2tcZlIgc3RydWN0dXJlXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorSW5kZXggbnVtYmVyIG9mIHRoZSBqb3lzdGlja1wmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0pveXN0aWNrT3BlblxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja05hbWUuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrTmFtZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDI5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja05hbWUuMwpAQCAtMCwwICsxLDMyIEBACisuVEggIlNETF9Kb3lzdGlja05hbWUiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Kb3lzdGlja05hbWUgXC0gR2V0IGpveXN0aWNrIG5hbWVcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJjb25zdCBjaGFyICpcZkJTRExfSm95c3RpY2tOYW1lXGZQXGZSKFxmQmludCBpbmRleFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitHZXQgdGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBuYW1lIG9mIGpveXN0aWNrXCYuIFRoZSBcZkJpbmRleFxmUiBwYXJhbWV0ZXIgcmVmZXJzIHRvIHRoZSBOXCYndGggam95c3RpY2sgb24gdGhlIHN5c3RlbVwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgYSBjaGFyIHBvaW50ZXIgdG8gdGhlIGpveXN0aWNrIG5hbWVcJi4KKy5TSCAiRVhBTVBMRVMiCisuUFAKKy5QUAorLm5mCitcZihDVy8qIFByaW50IHRoZSBuYW1lcyBvZiBhbGwgYXR0YWNoZWQgam95c3RpY2tzICovCitpbnQgbnVtX2pveSwgaTsKK251bV9qb3k9U0RMX051bUpveXN0aWNrcygpOworcHJpbnRmKCIlZCBqb3lzdGlja3MgZm91bmQKKyIsIG51bV9qb3kpOworZm9yKGk9MDtpPG51bV9qb3k7aSsrKQorICBwcmludGYoIiVzCisiLCBTRExfSm95c3RpY2tOYW1lKGkpKTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfSm95c3RpY2tPcGVuXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrTnVtQXhlcy4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tOdW1BeGVzLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5YzM2YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrTnVtQXhlcy4zCkBAIC0wLDAgKzEsMTggQEAKKy5USCAiU0RMX0pveXN0aWNrTnVtQXhlcyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0pveXN0aWNrTnVtQXhlcyBcLSBHZXQgdGhlIG51bWJlciBvZiBqb3lzdGljayBheGVzCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9Kb3lzdGlja051bUF4ZXNcZlBcZlIoXGZCU0RMX0pveXN0aWNrICpqb3lzdGlja1xmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitSZXR1cm4gdGhlIG51bWJlciBvZiBheGVzIGF2YWlsYWJsZSBmcm9tIGEgcHJldmlvdXNseSBvcGVuZWQgXGZCU0RMX0pveXN0aWNrXGZSXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorTnVtYmVyIG9mIGF4ZXNcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9Kb3lzdGlja0dldEF4aXNcZlBcZlIsIFxmSVxmQlNETF9Kb3lzdGlja09wZW5cZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tOdW1CYWxscy4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tOdW1CYWxscy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZGNhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja051bUJhbGxzLjMKQEAgLTAsMCArMSwxOCBAQAorLlRIICJTRExfSm95c3RpY2tOdW1CYWxscyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0pveXN0aWNrTnVtQmFsbHMgXC0gR2V0IHRoZSBudW1iZXIgb2Ygam95c3RpY2sgdHJhY2tiYWxscworLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfSm95c3RpY2tOdW1CYWxsc1xmUFxmUihcZkJTRExfSm95c3RpY2sgKmpveXN0aWNrXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1JldHVybiB0aGUgbnVtYmVyIG9mIHRyYWNrYmFsbHMgYXZhaWxhYmxlIGZyb20gYSBwcmV2aW91c2x5IG9wZW5lZCBcZkJTRExfSm95c3RpY2tcZlJcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitOdW1iZXIgb2YgdHJhY2tiYWxsc1wmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0pveXN0aWNrR2V0QmFsbFxmUFxmUiwgXGZJXGZCU0RMX0pveXN0aWNrT3BlblxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja051bUJ1dHRvbnMuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrTnVtQnV0dG9ucy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MmVhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja051bUJ1dHRvbnMuMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9Kb3lzdGlja051bUJ1dHRvbnMiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Kb3lzdGlja051bUJ1dHRvbnMgXC0gR2V0IHRoZSBudW1iZXIgb2Ygam95c2l0Y2sgYnV0dG9ucworLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfSm95c3RpY2tOdW1CdXR0b25zXGZQXGZSKFxmQlNETF9Kb3lzdGljayAqam95c3RpY2tcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorUmV0dXJuIHRoZSBudW1iZXIgb2YgYnV0dG9ucyBhdmFpbGFibGUgZnJvbSBhIHByZXZpb3VzbHkgb3BlbmVkIFxmQlNETF9Kb3lzdGlja1xmUlwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK051bWJlciBvZiBidXR0b25zXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfSm95c3RpY2tHZXRCdXR0b25cZlBcZlIsIFxmSVxmQlNETF9Kb3lzdGlja09wZW5cZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tOdW1IYXRzLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja051bUhhdHMuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTRjYTdmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tOdW1IYXRzLjMKQEAgLTAsMCArMSwxOCBAQAorLlRIICJTRExfSm95c3RpY2tOdW1IYXRzIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfSm95c3RpY2tOdW1IYXRzIFwtIEdldCB0aGUgbnVtYmVyIG9mIGpveXN0aWNrIGhhdHMKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX0pveXN0aWNrTnVtSGF0c1xmUFxmUihcZkJTRExfSm95c3RpY2sgKmpveXN0aWNrXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1JldHVybiB0aGUgbnVtYmVyIG9mIGhhdHMgYXZhaWxhYmxlIGZyb20gYSBwcmV2aW91c2x5IG9wZW5lZCBcZkJTRExfSm95c3RpY2tcZlJcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitOdW1iZXIgb2YgaGF0c1wmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0pveXN0aWNrR2V0SGF0XGZQXGZSLCBcZklcZkJTRExfSm95c3RpY2tPcGVuXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrT3Blbi4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tPcGVuLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxZDZhNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrT3Blbi4zCkBAIC0wLDAgKzEsNTEgQEAKKy5USCAiU0RMX0pveXN0aWNrT3BlbiIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0pveXN0aWNrT3BlbiBcLSBPcGVucyBhIGpveXN0aWNrIGZvciB1c2VcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJTRExfSm95c3RpY2sgKlxmQlNETF9Kb3lzdGlja09wZW5cZlBcZlIoXGZCaW50IGluZGV4XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK09wZW5zIGEgam95c3RpY2sgZm9yIHVzZSB3aXRoaW4gU0RMXCYuIFRoZSBcZkJpbmRleFxmUiByZWZlcnMgdG8gdGhlIE5cJid0aCBqb3lzdGljayBpbiB0aGUgc3lzdGVtXCYuIEEgam95c3RpY2sgbXVzdCBiZSBvcGVuZWQgYmVmb3JlIGl0IGdhbWUgYmUgdXNlZFwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgYSBcZkJTRExfSm95c3RpY2tcZlIgc3RydWN0dXJlIG9uIHN1Y2Nlc3NcJi4gXGZCTlVMTFxmUiBvbiBmYWlsdXJlXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisuUFAKKy5uZgorXGYoQ1dTRExfSm95c3RpY2sgKmpveTsKKy8vIENoZWNrIGZvciBqb3lzdGljaworaWYoU0RMX051bUpveXN0aWNrcygpPjApeworICAvLyBPcGVuIGpveXN0aWNrCisgIGpveT1TRExfSm95c3RpY2tPcGVuKDApOworICAKKyAgaWYoam95KQorICB7CisgICAgcHJpbnRmKCJPcGVuZWQgSm95c3RpY2sgMAorIik7CisgICAgcHJpbnRmKCJOYW1lOiAlcworIiwgU0RMX0pveXN0aWNrTmFtZSgwKSk7CisgICAgcHJpbnRmKCJOdW1iZXIgb2YgQXhlczogJWQKKyIsIFNETF9Kb3lzdGlja051bUF4ZXMoam95KSk7CisgICAgcHJpbnRmKCJOdW1iZXIgb2YgQnV0dG9uczogJWQKKyIsIFNETF9Kb3lzdGlja051bUJ1dHRvbnMoam95KSk7CisgICAgcHJpbnRmKCJOdW1iZXIgb2YgQmFsbHM6ICVkCisiLCBTRExfSm95c3RpY2tOdW1CYWxscyhqb3kpKTsKKyAgfQorICBlbHNlCisgICAgcHJpbnRmKCJDb3VsZG5cJid0IG9wZW4gSm95c3RpY2sgMAorIik7CisgIAorICAvLyBDbG9zZSBpZiBvcGVuZWQKKyAgaWYoU0RMX0pveXN0aWNrT3BlbmVkKDApKQorICAgIFNETF9Kb3lzdGlja0Nsb3NlKGpveSk7Cit9XGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0pveXN0aWNrQ2xvc2VcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tPcGVuZWQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrT3BlbmVkLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4MmUwOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0pveXN0aWNrT3BlbmVkLjMKQEAgLTAsMCArMSwxOCBAQAorLlRIICJTRExfSm95c3RpY2tPcGVuZWQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Kb3lzdGlja09wZW5lZCBcLSBEZXRlcm1pbmUgaWYgYSBqb3lzdGljayBoYXMgYmVlbiBvcGVuZWQKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX0pveXN0aWNrT3BlbmVkXGZQXGZSKFxmQmludCBpbmRleFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitEZXRlcm1pbmVzIHdoZXRoZXIgYSBqb3lzdGljayBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uXCYuIFxmQmluZGV4XGZSIHJlZmVycyB0byB0aGUgTlwmJ3RoIGpveXN0aWNrIG9uIHRoZSBzeXN0ZW1cJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIFxmQjFcZlIgaWYgdGhlIGpveXN0aWNrIGhhcyBiZWVuIG9wZW5lZCwgb3IgXGZCMFxmUiBpZiBpdCBoYXMgbm90XCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfSm95c3RpY2tPcGVuXGZQXGZSLCBcZklcZkJTRExfSm95c3RpY2tDbG9zZVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Kb3lzdGlja1VwZGF0ZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tVcGRhdGUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDEwMzViCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfSm95c3RpY2tVcGRhdGUuMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9Kb3lzdGlja1VwZGF0ZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0pveXN0aWNrVXBkYXRlIFwtIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIGFsbCBqb3lzdGlja3MKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9Kb3lzdGlja1VwZGF0ZVxmUFxmUihcZkJ2b2lkXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1VwZGF0ZXMgdGhlIHN0YXRlKHBvc2l0aW9uLCBidXR0b25zLCBldGNcJi4pIG9mIGFsbCBvcGVuIGpveXN0aWNrc1wmLiBJZiBqb3lzdGljayBldmVudHMgaGF2ZSBiZWVuIGVuYWJsZWQgd2l0aCBcZklcZkJTRExfSm95c3RpY2tFdmVudFN0YXRlXGZQXGZSIHRoZW4gdGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBpbiB0aGUgZXZlbnQgbG9vcFwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0pveXN0aWNrRXZlbnRTdGF0ZVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9LZXlib2FyZEV2ZW50LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9LZXlib2FyZEV2ZW50LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlZWE3OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0tleWJvYXJkRXZlbnQuMwpAQCAtMCwwICsxLDM4IEBACisuVEggIlNETF9LZXlib2FyZEV2ZW50IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfS2V5Ym9hcmRFdmVudCBcLSBLZXlib2FyZCBldmVudCBzdHJ1Y3R1cmUKKy5TSCAiU1RSVUNUVVJFIERFRklOSVRJT04iCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIHN0cnVjdHsKKyAgVWludDggdHlwZTsKKyAgVWludDggc3RhdGU7CisgIFNETF9rZXlzeW0ga2V5c3ltOworfSBTRExfS2V5Ym9hcmRFdmVudDtcZlIKKy5maQorLlBQCisuU0ggIlNUUlVDVFVSRSBEQVRBIgorLlRQIDIwCitcZkJ0eXBlXGZSCitcZkJTRExfS0VZRE9XTlxmUCBvciBcZkJTRExfS0VZVVBcZlAKKy5UUCAyMAorXGZCc3RhdGVcZlIKK1xmQlNETF9QUkVTU0VEXGZQIG9yIFxmQlNETF9SRUxFQVNFRFxmUAorLlRQIDIwCitcZkJrZXlzeW1cZlIKK0NvbnRhaW5zIGtleSBwcmVzcyBpbmZvcm1hdGlvbgorLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX0tleWJvYXJkRXZlbnRcZlIgaXMgYSBtZW1iZXIgb2YgdGhlIFxmSVxmQlNETF9FdmVudFxmUlxmUiB1bmlvbiBhbmQgaXMgdXNlZCB3aGVuIGFuIGV2ZW50IG9mIHR5cGUgXGZCU0RMX0tFWURPV05cZlAgb3IgXGZCU0RMX0tFWVVQXGZQIGlzIHJlcG9ydGVkXCYuCisuUFAKK1RoZSBcZkJ0eXBlXGZSIGFuZCBcZkJzdGF0ZVxmUiBhY3R1YWxseSByZXBvcnQgdGhlIHNhbWUgaW5mb3JtYXRpb24sIHRoZXkganVzdCB1c2UgZGlmZmVyZW50IHZhbHVlcyB0byBkbyBpdCEgQSBrZXlib2FyZCBldmVudCBvY2N1cnMgd2hlbiBhIGtleSBpcyByZWxlYXNlZCAoXGZCdHlwZVxmUj1cZkJTREtfS0VZVVBcZlAgb3IgXGZCc3RhdGVcZlI9XGZCU0RMX1JFTEVBU0VEXGZQKSBhbmQgd2hlbiBhIGtleSBpcyBwcmVzc2VkIChcZkJ0eXBlXGZSPVxmQlNETF9LRVlET1dOXGZQIG9yIFxmQnN0YXRlXGZSPVxmQlNETF9QUkVTU0VEXGZQKVwmLiBUaGUgaW5mb3JtYXRpb24gb24gd2hhdCBrZXkgd2FzIHByZXNzZWQgb3IgcmVsZWFzZWQgaXMgaW4gdGhlIFxmSVxmQmtleXN5bVxmUlxmUiBzdHJ1Y3R1cmVcJi4KKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK1JlcGVhdGluZyBcZkJTRExfS0VZRE9XTlxmUCBldmVudHMgd2lsbCBvY2N1ciBpZiBrZXkgcmVwZWF0IGlzIGVuYWJsZWQgKHNlZSBcZklcZkJTRExfRW5hYmxlS2V5UmVwZWF0XGZQXGZSKVwmLgorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfRXZlbnRcZlJcZlIsIFxmSVxmQlNETF9rZXlzeW1cZlJcZlIsIFxmSVxmQlNETF9FbmFibGVLZXlSZXBlYXRcZlBcZlIsIFxmSVxmQlNETF9FbmFibGVVTklDT0RFXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0tpbGxUaHJlYWQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0tpbGxUaHJlYWQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTM0ZjExCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfS2lsbFRocmVhZC4zCkBAIC0wLDAgKzEsMTYgQEAKKy5USCAiU0RMX0tpbGxUaHJlYWQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9LaWxsVGhyZWFkIFwtIEdyYWNlbGVzc2x5IHRlcm1pbmF0ZXMgdGhlIHRocmVhZFwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQnZvaWQgXGZCU0RMX0tpbGxUaHJlYWRcZlBcZlIoXGZCU0RMX1RocmVhZCAqdGhyZWFkXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9LaWxsVGhyZWFkXGZQIGdyYWNlbGVzc2x5IHRlcm1pbmF0ZXMgdGhlIHRocmVhZCBhc3NvY2lhdGVkIHdpdGggXGZCdGhyZWFkXGZSXCYuIElmIHBvc3NpYmxlLCB5b3Ugc2hvdWxkIHVzZSBzb21lIG90aGVyIGZvcm0gb2YgSVBDIHRvIHNpZ25hbCB0aGUgdGhyZWFkIHRvIHF1aXRcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVUaHJlYWRcZlBcZlIsIFxmSVxmQlNETF9XYWl0VGhyZWFkXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0xpc3RNb2Rlcy4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfTGlzdE1vZGVzLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjOTM3NgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0xpc3RNb2Rlcy4zCkBAIC0wLDAgKzEsNTMgQEAKKy5USCAiU0RMX0xpc3RNb2RlcyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0xpc3RNb2RlcyBcLSBSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdmFpbGFibGUgc2NyZWVuIGRpbWVuc2lvbnMgZm9yIHRoZSBnaXZlbiBmb3JtYXQgYW5kIHZpZGVvIGZsYWdzCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCU0RMX1JlY3QgKipcZkJTRExfTGlzdE1vZGVzXGZQXGZSKFxmQlNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3NcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorUmV0dXJuIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdmFpbGFibGUgc2NyZWVuIGRpbWVuc2lvbnMgZm9yIHRoZSBnaXZlbiBmb3JtYXQgYW5kIHZpZGVvIGZsYWdzLCBzb3J0ZWQgbGFyZ2VzdCB0byBzbWFsbGVzdFwmLiBSZXR1cm5zIFxmQk5VTExcZlAgaWYgdGhlcmUgYXJlIG5vIGRpbWVuc2lvbnMgYXZhaWxhYmxlIGZvciBhIHBhcnRpY3VsYXIgZm9ybWF0LCBvciBcZkItMVxmUiBpZiBhbnkgZGltZW5zaW9uIGlzIG9rYXkgZm9yIHRoZSBnaXZlbiBmb3JtYXRcJi4KKy5QUAorSWYgXGZCZm9ybWF0XGZSIGlzIFxmQk5VTExcZlAsIHRoZSBtb2RlIGxpc3Qgd2lsbCBiZSBmb3IgdGhlIGZvcm1hdCByZXR1cm5lZCBieSBcZklTRExfR2V0VmlkZW9JbmZvKClcZlItPlxmQnZmbXRcZlJcJi4gVGhlIFxmQmZsYWdcZlIgcGFyYW1ldGVyIGlzIGFuIE9SXCYnZCBjb21iaW5hdGlvbiBvZiBcZklzdXJmYWNlXGZSIGZsYWdzXCYuIFRoZSBmbGFncyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgdXNlZCBcZklcZkJTRExfU2V0VmlkZW9Nb2RlXGZQXGZSIGFuZCB0aGV5IHBsYXkgYSBzdHJvbmcgcm9sZSBpbiBkZWNpZGluZyB3aGF0IG1vZGVzIGFyZSB2YWxpZFwmLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBwYXNzIFxmQlNETF9IV1NVUkZBQ0VcZlAgYXMgYSBmbGFnIG9ubHkgbW9kZXMgdGhhdCBzdXBwb3J0IGhhcmR3YXJlIHZpZGVvIHN1cmZhY2VzIHdpbGwgYmUgcmV0dXJuZWRcJi4KKy5TSCAiRVhBTVBMRSIKKy5QUAorLm5mCitcZihDV1NETF9SZWN0ICoqbW9kZXM7CitpbnQgaTsKK1wmLgorXCYuCitcJi4KKworLyogR2V0IGF2YWlsYWJsZSBmdWxsc2NyZWVuL2hhcmR3YXJlIG1vZGVzICovCittb2Rlcz1TRExfTGlzdE1vZGVzKE5VTEwsIFNETF9GVUxMU0NSRUVOfFNETF9IV1NVUkZBQ0UpOworCisvKiBDaGVjayBpcyB0aGVyZSBhcmUgYW55IG1vZGVzIGF2YWlsYWJsZSAqLworaWYobW9kZXMgPT0gKFNETF9SZWN0ICoqKTApeworICBwcmludGYoIk5vIG1vZGVzIGF2YWlsYWJsZSEKKyIpOworICBleGl0KC0xKTsKK30KKworLyogQ2hlY2sgaWYgb3IgcmVzb2x1dGlvbiBpcyByZXN0cmljdGVkICovCitpZihtb2RlcyA9PSAoU0RMX1JlY3QgKiopLTEpeworICBwcmludGYoIkFsbCByZXNvbHV0aW9ucyBhdmFpbGFibGVcJi4KKyIpOworfQorZWxzZXsKKyAgLyogUHJpbnQgdmFsaWQgbW9kZXMgKi8KKyAgcHJpbnRmKCJBdmFpbGFibGUgTW9kZXMKKyIpOworICBmb3IoaT0wO21vZGVzW2ldOysraSkKKyAgICBwcmludGYoIiAgJWQgeCAlZAorIiwgbW9kZXNbaV0tPncsIG1vZGVzW2ldLT5oKTsKK30KK1wmLgorXCYuXGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1NldFZpZGVvTW9kZVxmUFxmUiwgXGZJXGZCU0RMX0dldFZpZGVvSW5mb1xmUFxmUiwgXGZJXGZCU0RMX1JlY3RcZlJcZlIsIFxmSVxmQlNETF9QaXhlbEZvcm1hdFxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Mb2FkQk1QLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Mb2FkQk1QLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYjRhZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0xvYWRCTVAuMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9Mb2FkQk1QIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfTG9hZEJNUCBcLSBMb2FkIGEgV2luZG93cyBCTVAgZmlsZSBpbnRvIGFuIFNETF9TdXJmYWNlXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCU0RMX1N1cmZhY2UgKlxmQlNETF9Mb2FkQk1QXGZQXGZSKFxmQmNvbnN0IGNoYXIgKmZpbGVcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorTG9hZHMgYSBzdXJmYWNlIGZyb20gYSBuYW1lZCBXaW5kb3dzIEJNUCBmaWxlXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyB0aGUgbmV3IHN1cmZhY2UsIG9yIFxmQk5VTExcZlAgaWYgdGhlcmUgd2FzIGFuIGVycm9yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfU2F2ZUJNUFxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Mb2FkV0FWLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Mb2FkV0FWLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwZmY2NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0xvYWRXQVYuMwpAQCAtMCwwICsxLDQyIEBACisuVEggIlNETF9Mb2FkV0FWIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfTG9hZFdBViBcLSBMb2FkIGEgV0FWRSBmaWxlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCU0RMX0F1ZGlvU3BlYyAqXGZCU0RMX0xvYWRXQVZcZlBcZlIoXGZCY29uc3QgY2hhciAqZmlsZSwgU0RMX0F1ZGlvU3BlYyAqc3BlYywgVWludDggKiphdWRpb19idWYsIFVpbnQzMiAqYXVkaW9fbGVuXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9Mb2FkV0FWXGZQIFRoaXMgZnVuY3Rpb24gbG9hZHMgYSBXQVZFIFxmQmZpbGVcZlIgaW50byBtZW1vcnlcJi4KKy5QUAorSWYgdGhpcyBmdW5jdGlvbiBzdWNjZWVkcywgaXQgcmV0dXJucyB0aGUgZ2l2ZW4gXGZJXGZCU0RMX0F1ZGlvU3BlY1xmUFxmUiwgZmlsbGVkIHdpdGggdGhlIGF1ZGlvIGRhdGEgZm9ybWF0IG9mIHRoZSB3YXZlIGRhdGEsIGFuZCBzZXRzIFxmQmF1ZGlvX2J1ZlxmUiB0byBhIFxmQm1hbGxvY1xmUFwmJ2QgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGF1ZGlvIGRhdGEsIGFuZCBzZXRzIFxmQmF1ZGlvX2xlblxmUiB0byB0aGUgbGVuZ3RoIG9mIHRoYXQgYXVkaW8gYnVmZmVyLCBpbiBieXRlc1wmLiBZb3UgbmVlZCB0byBmcmVlIHRoZSBhdWRpbyBidWZmZXIgd2l0aCBcZklcZkJTRExfRnJlZVdBVlxmUFxmUiB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIGl0XCYuCisuUFAKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyBcZkJOVUxMXGZQIGFuZCBzZXRzIHRoZSBTREwgZXJyb3IgbWVzc2FnZSBpZiB0aGUgd2F2ZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsIHVzZXMgYW4gdW5rbm93biBkYXRhIGZvcm1hdCwgb3IgaXMgY29ycnVwdFwmLiBDdXJyZW50bHkgcmF3LCBNUy1BRFBDTSBhbmQgSU1BLUFEUENNIFdBVkUgZmlsZXMgYXJlIHN1cHBvcnRlZFwmLgorLlNIICJFWEFNUExFIgorLlBQCisubmYKK1xmKENXU0RMX0F1ZGlvU3BlYyB3YXZfc3BlYzsKK1VpbnQzMiB3YXZfbGVuZ3RoOworVWludDggKndhdl9idWZmZXI7CisKKy8qIExvYWQgdGhlIFdBViAqLworaWYoIFNETF9Mb2FkV0FWKCJ0ZXN0XCYud2F2IiwgJndhdl9zcGVjLCAmd2F2X2J1ZmZlciwgJndhdl9sZW5ndGgpID09IE5VTEwgKXsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiB0ZXN0XCYud2F2OiAlcworIiwgU0RMX0dldEVycm9yKCkpOworICBleGl0KC0xKTsKK30KK1wmLgorXCYuCitcJi4KKy8qIERvIHN0dWZmIHdpdGggdGhlIFdBViAqLworXCYuCitcJi4KKy8qIEZyZWUgSXQgKi8KK1NETF9GcmVlV0FWKHdhdl9idWZmZXIpO1xmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9BdWRpb1NwZWNcZlJcZlIsIFxmSVxmQlNETF9PcGVuQXVkaW9cZlBcZlIsIFxmSVxmQlNETF9GcmVlV0FWXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0xvY2tBdWRpby4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfTG9ja0F1ZGlvLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxNDFmZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0xvY2tBdWRpby4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX0xvY2tBdWRpbyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU4IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0xvY2tBdWRpbyBcLSBMb2NrIG91dCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9Mb2NrQXVkaW9cZlBcZlIoXGZCdm9pZFxmUikKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoZSBsb2NrIG1hbmlwdWxhdGVkIGJ5IHRoZXNlIGZ1bmN0aW9ucyBwcm90ZWN0cyB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cJi4gRHVyaW5nIGEgTG9ja0F1ZGlvIHBlcmlvZCwgeW91IGNhbiBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIG5vdCBydW5uaW5nXCYuIERvIG5vdCBjYWxsIHRoZXNlIGZyb20gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIHlvdSB3aWxsIGNhdXNlIGRlYWRsb2NrXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfT3BlbkF1ZGlvXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX0xvY2tTdXJmYWNlLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Mb2NrU3VyZmFjZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjNhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Mb2NrU3VyZmFjZS4zCkBAIC0wLDAgKzEsNDggQEAKKy5USCAiU0RMX0xvY2tTdXJmYWNlIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfTG9ja1N1cmZhY2UgXC0gTG9jayBhIHN1cmZhY2UgZm9yIGRpcmVjdGx5IGFjY2Vzc1wmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfTG9ja1N1cmZhY2VcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnN1cmZhY2VcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX0xvY2tTdXJmYWNlXGZQIHNldHMgdXAgYSBzdXJmYWNlIGZvciBkaXJlY3RseSBhY2Nlc3NpbmcgdGhlIHBpeGVsc1wmLiBCZXR3ZWVuIGNhbGxzIHRvIFxmQlNETF9Mb2NrU3VyZmFjZVxmUCBhbmQgXGZCU0RMX1VubG9ja1N1cmZhY2VcZlAsIHlvdSBjYW4gd3JpdGUgdG8gYW5kIHJlYWQgZnJvbSBcZkJzdXJmYWNlLT5cZkJwaXhlbHNcZlJcZlIsIHVzaW5nIHRoZSBwaXhlbCBmb3JtYXQgc3RvcmVkIGluIFxmQnN1cmZhY2UtPlxmQmZvcm1hdFxmUlxmUlwmLiBPbmNlIHlvdSBhcmUgZG9uZSBhY2Nlc3NpbmcgdGhlIHN1cmZhY2UsIHlvdSBzaG91bGQgdXNlIFxmQlNETF9VbmxvY2tTdXJmYWNlXGZQIHRvIHJlbGVhc2UgaXRcJi4KKy5QUAorTm90IGFsbCBzdXJmYWNlcyByZXF1aXJlIGxvY2tpbmdcJi4gSWYgXGZCU0RMX01VU1RMT0NLXGZQKFxmQnN1cmZhY2VcZlIpIGV2YWx1YXRlcyB0byBcZkIwXGZSLCB0aGVuIHlvdSBjYW4gcmVhZCBhbmQgd3JpdGUgdG8gdGhlIHN1cmZhY2UgYXQgYW55IHRpbWUsIGFuZCB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSBzdXJmYWNlIHdpbGwgbm90IGNoYW5nZVwmLiAKKy5QUAorTm8gb3BlcmF0aW5nIHN5c3RlbSBvciBsaWJyYXJ5IGNhbGxzIHNob3VsZCBiZSBtYWRlIGJldHdlZW4gbG9jay91bmxvY2sgcGFpcnMsIGFzIGNyaXRpY2FsIHN5c3RlbSBsb2NrcyBtYXkgYmUgaGVsZCBkdXJpbmcgdGhpcyB0aW1lXCYuCisuUFAKK0l0IHNob3VsZCBiZSBub3RlZCwgdGhhdCBzaW5jZSBTREwgMVwmLjFcJi44IHN1cmZhY2UgbG9ja3MgYXJlIHJlY3Vyc2l2ZVwmLiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBsb2NrIGEgc3VyZmFjZSBtdWx0aXBsZSB0aW1lcywgYnV0IGVhY2ggbG9jayBtdXN0IGhhdmUgYSBtYXRjaCB1bmxvY2tcJi4gCisuUFAKKy5uZgorXGYoQ1cgICAgXCYuCisgICAgXCYuCisgICAgU0RMX0xvY2tTdXJmYWNlKCBzdXJmYWNlICk7CisgICAgXCYuCisgICAgLyogU3VyZmFjZSBpcyBsb2NrZWQgKi8KKyAgICAvKiBEaXJlY3QgcGl4ZWwgYWNjZXNzIG9uIHN1cmZhY2UgaGVyZSAqLworICAgIFwmLgorICAgIFNETF9Mb2NrU3VyZmFjZSggc3VyZmFjZSApOworICAgIFwmLgorICAgIC8qIE1vcmUgZGlyZWN0IHBpeGVsIGFjY2VzcyBvbiBzdXJmYWNlICovCisgICAgXCYuCisgICAgU0RMX1VubG9ja1N1cmZhY2UoIHN1cmZhY2UgKTsKKyAgICAvKiBTdXJmYWNlIGlzIHN0aWxsIGxvY2tlZCAqLworICAgIC8qIE5vdGU6IElzIHZlcnNpb25zIDwgMVwmLjFcJi44LCB0aGUgc3VyZmFjZSB3b3VsZCBoYXZlIGJlZW4gKi8KKyAgICAvKiBubyBsb25nZXIgbG9ja2VkIGF0IHRoaXMgc3RhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBcJi4KKyAgICBTRExfVW5sb2NrU3VyZmFjZSggc3VyZmFjZSApOworICAgIC8qIFN1cmZhY2UgaXMgbm93IHVubG9ja2VkICovCisgICAgXCYuCisgICAgXCYuXGZSCisuZmkKKy5QUAorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1xmQlNETF9Mb2NrU3VyZmFjZVxmUCByZXR1cm5zIFxmQjBcZlIsIG9yIFxmQi0xXGZSIGlmIHRoZSBzdXJmYWNlIGNvdWxkblwmJ3QgYmUgbG9ja2VkXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfVW5sb2NrU3VyZmFjZVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Mb2NrWVVWT3ZlcmxheS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfTG9ja1lVVk92ZXJsYXkuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODZkOTZmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfTG9ja1lVVk92ZXJsYXkuMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9Mb2NrWVVWT3ZlcmxheSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0xvY2tZVVZPdmVybGF5IFwtIExvY2sgYW4gb3ZlcmxheQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfTG9ja1lVVk92ZXJsYXlcZlBcZlIoXGZCU0RMX092ZXJsYXkgKm92ZXJsYXlcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorTXVjaCB0aGUgc2FtZSBhcyBcZklcZkJTRExfTG9ja1N1cmZhY2VcZlBcZlIsIFxmQlNETF9Mb2NrWVVWT3ZlcmxheVxmUCBsb2NrcyB0aGUgXGZJXGZCb3ZlcmxheVxmUlxmUiBmb3IgZGlyZWN0IGFjY2VzcyB0byBwaXhlbCBkYXRhXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyBcZkIwXGZSIG9uIHN1Y2Nlc3MsIG9yIFxmQi0xXGZSIG9uIGFuIGVycm9yXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfVW5sb2NrWVVWT3ZlcmxheVxmUFxmUiwgXGZJXGZCU0RMX0NyZWF0ZVlVVk92ZXJsYXlcZlBcZlIsIFxmSVxmQlNETF9PdmVybGF5XGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX01hcFJHQi4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfTWFwUkdCLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0Yzk2MwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX01hcFJHQi4zCkBAIC0wLDAgKzEsMjIgQEAKKy5USCAiU0RMX01hcFJHQiIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX01hcFJHQiBcLSBNYXAgYSBSR0IgY29sb3IgdmFsdWUgdG8gYSBwaXhlbCBmb3JtYXRcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJVaW50MzIgXGZCU0RMX01hcFJHQlxmUFxmUihcZkJTRExfUGl4ZWxGb3JtYXQgKmZtdCwgVWludDggciwgVWludDggZywgVWludDggYlxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitNYXBzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQgYW5kIHJldHVybnMgdGhlIHBpeGVsIHZhbHVlIGFzIGEgMzItYml0IGludFwmLgorLlBQCitJZiB0aGUgZm9ybWF0IGhhcyBhIHBhbGV0dGUgKDgtYml0KSB0aGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgY29sb3IgaW4gdGhlIHBhbGV0dGUgd2lsbCBiZSByZXR1cm5lZFwmLgorLlBQCitJZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGZvcm1hdCBoYXMgYW4gYWxwaGEgY29tcG9uZW50IGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYWxsIDEgYml0cyAoZnVsbHkgb3BhcXVlKVwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK0EgcGl4ZWwgdmFsdWUgYmVzdCBhcHByb3hpbWF0aW5nIHRoZSBnaXZlbiBSR0IgY29sb3IgdmFsdWUgZm9yIGEgZ2l2ZW4gcGl4ZWwgZm9ybWF0XCYuIElmIHRoZSBwaXhlbCBmb3JtYXQgYnBwIChjb2xvciBkZXB0aCkgaXMgbGVzcyB0aGFuIDMyLWJwcCB0aGVuIHRoZSB1bnVzZWQgdXBwZXIgYml0cyBvZiB0aGUgcmV0dXJuIHZhbHVlIGNhbiBzYWZlbHkgYmUgaWdub3JlZCAoZVwmLmdcJi4sIHdpdGggYSAxNi1icHAgZm9ybWF0IHRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIGFzc2lnbmVkIHRvIGEgXGZCVWludDE2XGZQLCBhbmQgc2ltaWxhcmx5IGEgXGZCVWludDhcZlAgZm9yIGFuIDgtYnBwIGZvcm1hdClcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9HZXRSR0JcZlBcZlIsIFxmSVxmQlNETF9HZXRSR0JBXGZQXGZSLCBcZklcZkJTRExfTWFwUkdCQVxmUFxmUiwgXGZJXGZCU0RMX1BpeGVsRm9ybWF0XGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX01hcFJHQkEuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX01hcFJHQkEuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Q3OGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfTWFwUkdCQS4zCkBAIC0wLDAgKzEsMjIgQEAKKy5USCAiU0RMX01hcFJHQkEiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9NYXBSR0JBIFwtIE1hcCBhIFJHQkEgY29sb3IgdmFsdWUgdG8gYSBwaXhlbCBmb3JtYXRcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJVaW50MzIgXGZCU0RMX01hcFJHQkFcZlBcZlIoXGZCU0RMX1BpeGVsRm9ybWF0ICpmbXQsIFVpbnQ4IHIsIFVpbnQ4IGcsIFVpbnQ4IGIsIFVpbnQ4IGFcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorTWFwcyB0aGUgUkdCQSBjb2xvciB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHBpeGVsIGZvcm1hdCBhbmQgcmV0dXJucyB0aGUgcGl4ZWwgdmFsdWUgYXMgYSAzMi1iaXQgaW50XCYuCisuUFAKK0lmIHRoZSBmb3JtYXQgaGFzIGEgcGFsZXR0ZSAoOC1iaXQpIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBtYXRjaGluZyBjb2xvciBpbiB0aGUgcGFsZXR0ZSB3aWxsIGJlIHJldHVybmVkXCYuCisuUFAKK0lmIHRoZSBzcGVjaWZpZWQgcGl4ZWwgZm9ybWF0IGhhcyBubyBhbHBoYSBjb21wb25lbnQgdGhlIGFscGhhIHZhbHVlIHdpbGwgYmUgaWdub3JlZCAoYXMgaXQgd2lsbCBiZSBpbiBmb3JtYXRzIHdpdGggYSBwYWxldHRlKVwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK0EgcGl4ZWwgdmFsdWUgYmVzdCBhcHByb3hpbWF0aW5nIHRoZSBnaXZlbiBSR0JBIGNvbG9yIHZhbHVlIGZvciBhIGdpdmVuIHBpeGVsIGZvcm1hdFwmLiBJZiB0aGUgcGl4ZWwgZm9ybWF0IGJwcCAoY29sb3IgZGVwdGgpIGlzIGxlc3MgdGhhbiAzMi1icHAgdGhlbiB0aGUgdW51c2VkIHVwcGVyIGJpdHMgb2YgdGhlIHJldHVybiB2YWx1ZSBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgKGVcJi5nXCYuLCB3aXRoIGEgMTYtYnBwIGZvcm1hdCB0aGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBhc3NpZ25lZCB0byBhIFxmQlVpbnQxNlxmUCwgYW5kIHNpbWlsYXJseSBhIFxmQlVpbnQ4XGZQIGZvciBhbiA4LWJwcCBmb3JtYXQpXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklTRExfR2V0UkdCXGZSLCBcZklTRExfR2V0UkdCQVxmUiwgXGZJU0RMX01hcFJHQlxmUiwgXGZJU0RMX1BpeGVsRm9ybWF0XGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX01peEF1ZGlvLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9NaXhBdWRpby4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ODY2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9NaXhBdWRpby4zCkBAIC0wLDAgKzEsMjEgQEAKKy5USCAiU0RMX01peEF1ZGlvIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfTWl4QXVkaW8gXC0gTWl4IGF1ZGlvIGRhdGEKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9NaXhBdWRpb1xmUFxmUihcZkJVaW50OCAqZHN0LCBVaW50OCAqc3JjLCBVaW50MzIgbGVuLCBpbnQgdm9sdW1lXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoaXMgZnVuY3Rpb24gdGFrZXMgdHdvIGF1ZGlvIGJ1ZmZlcnMgb2YgXGZCbGVuXGZSIGJ5dGVzIGVhY2ggb2YgdGhlIHBsYXlpbmcgYXVkaW8gZm9ybWF0IGFuZCBtaXhlcyB0aGVtLCBwZXJmb3JtaW5nIGFkZGl0aW9uLCB2b2x1bWUgYWRqdXN0bWVudCwgYW5kIG92ZXJmbG93IGNsaXBwaW5nXCYuIFRoZSBcZkJ2b2x1bWVcZlIgcmFuZ2VzIGZyb20gMCB0byBcZkJTRExfTUlYX01BWFZPTFVNRVxmUCBhbmQgc2hvdWxkIGJlIHNldCB0byB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgZnVsbCBhdWRpbyB2b2x1bWVcJi4gTm90ZSB0aGlzIGRvZXMgbm90IGNoYW5nZSBoYXJkd2FyZSB2b2x1bWVcJi4gVGhpcyBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2UgLS0geW91IGNhbiBtaXggeW91ciBvd24gYXVkaW8gZGF0YVwmLgorLlBQCisuUlMKK1xmQk5vdGU6ICAKKy5QUAorRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBtaXhpbmcgdG9nZXRoZXIgbW9yZSB0aGFuIHR3byBzdHJlYW1zIG9mIHNhbXBsZSBkYXRhXCYuIFRoZSBvdXRwdXQgZnJvbSByZXBlYXRlZCBhcHBsaWNhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBkaXN0b3J0ZWQgYnkgY2xpcHBpbmcsIGJlY2F1c2UgdGhlcmUgaXMgbm8gYWNjdW11bGF0b3Igd2l0aCBncmVhdGVyIHJhbmdlIHRoYW4gdGhlIGlucHV0IChub3QgdG8gbWVudGlvbiB0aGlzIGJlaW5nIGFuIGluZWZmaWNpZW50IHdheSBvZiBkb2luZyBpdClcJi4gVXNlIG1peGluZyBmdW5jdGlvbnMgZnJvbSBTRExfbWl4ZXIsIE9wZW5BTCwgb3Igd3JpdGUgeW91ciBvd24gbWl4ZXIgaW5zdGVhZFwmLgorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfT3BlbkF1ZGlvXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX01vdXNlQnV0dG9uRXZlbnQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX01vdXNlQnV0dG9uRXZlbnQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQzNGEwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfTW91c2VCdXR0b25FdmVudC4zCkBAIC0wLDAgKzEsMzYgQEAKKy5USCAiU0RMX01vdXNlQnV0dG9uRXZlbnQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Nb3VzZUJ1dHRvbkV2ZW50IFwtIE1vdXNlIGJ1dHRvbiBldmVudCBzdHJ1Y3R1cmUKKy5TSCAiU1RSVUNUVVJFIERFRklOSVRJT04iCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIHN0cnVjdHsKKyAgVWludDggdHlwZTsKKyAgVWludDggYnV0dG9uOworICBVaW50OCBzdGF0ZTsKKyAgVWludDE2IHgsIHk7Cit9IFNETF9Nb3VzZUJ1dHRvbkV2ZW50O1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQnR5cGVcZlIKK1xmQlNETF9NT1VTRUJVVFRPTkRPV05cZlAgb3IgXGZCU0RMX01PVVNFQlVUVE9OVVBcZlAKKy5UUCAyMAorXGZCYnV0dG9uXGZSCitUaGUgbW91c2UgYnV0dG9uIGluZGV4IChTRExfQlVUVE9OX0xFRlQsIFNETF9CVVRUT05fTUlERExFLCBTRExfQlVUVE9OX1JJR0hUKQorLlRQIDIwCitcZkJzdGF0ZVxmUgorXGZCU0RMX1BSRVNTRURcZlAgb3IgXGZCU0RMX1JFTEVBU0VEXGZQCisuVFAgMjAKK1xmQnhcZlIsIFxmQnlcZlIKK1RoZSBYL1kgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlIGF0IHByZXNzL3JlbGVhc2UgdGltZQorLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX01vdXNlQnV0dG9uRXZlbnRcZlIgaXMgYSBtZW1iZXIgb2YgdGhlIFxmSVxmQlNETF9FdmVudFxmUlxmUiB1bmlvbiBhbmQgaXMgdXNlZCB3aGVuIGFuIGV2ZW50IG9mIHR5cGUgXGZCU0RMX01PVVNFQlVUVE9ORE9XTlxmUCBvciBcZkJTRExfTU9VU0VCVVRUT05VUFxmUCBpcyByZXBvcnRlZFwmLgorLlBQCitXaGVuIGEgbW91c2UgYnV0dG9uIHByZXNzIG9yIHJlbGVhc2UgaXMgZGV0ZWN0ZWQgdGhlbiBudW1iZXIgb2YgdGhlIGJ1dHRvbiBwcmVzc2VkIChmcm9tIDEgdG8gMjU1LCB3aXRoIDEgdXN1YWxseSBiZWluZyB0aGUgbGVmdCBidXR0b24gYW5kIDIgdGhlIHJpZ2h0KSBpcyBwbGFjZWQgaW50byBcZkJidXR0b25cZlIsIHRoZSBwb3NpdGlvbiBvZiB0aGUgbW91c2Ugd2hlbiB0aGlzIGV2ZW50IG9jY3VyZWQgaXMgc3RvcmVkIGluIHRoZSBcZkJ4XGZSIGFuZCB0aGUgXGZCeVxmUiBmaWVsZHNcJi4gTGlrZSBcZklcZkJTRExfS2V5Ym9hcmRFdmVudFxmUlxmUiwgaW5mb3JtYXRpb24gb24gd2hldGhlciB0aGUgZXZlbnQgd2FzIGEgcHJlc3Mgb3IgYSByZWxlYXNlIGV2ZW50IGlzIHN0b3JlZCBpbiBib3RoIHRoZSBcZkJ0eXBlXGZSIGFuZCBcZkJzdGF0ZVxmUiBmaWVsZHMsIGJ1dCB0aGlzIHNob3VsZCBiZSBvYnZpb3VzXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfRXZlbnRcZlJcZlIsIFxmSVxmQlNETF9Nb3VzZU1vdGlvbkV2ZW50XGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX01vdXNlTW90aW9uRXZlbnQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX01vdXNlTW90aW9uRXZlbnQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWIwMzZkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfTW91c2VNb3Rpb25FdmVudC4zCkBAIC0wLDAgKzEsMzggQEAKKy5USCAiU0RMX01vdXNlTW90aW9uRXZlbnQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9Nb3VzZU1vdGlvbkV2ZW50IFwtIE1vdXNlIG1vdGlvbiBldmVudCBzdHJ1Y3R1cmUKKy5TSCAiU1RSVUNUVVJFIERFRklOSVRJT04iCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIHN0cnVjdHsKKyAgVWludDggdHlwZTsKKyAgVWludDggc3RhdGU7CisgIFVpbnQxNiB4LCB5OworICBTaW50MTYgeHJlbCwgeXJlbDsKK30gU0RMX01vdXNlTW90aW9uRXZlbnQ7XGZSCisuZmkKKy5QUAorLlNIICJTVFJVQ1RVUkUgREFUQSIKKy5UUCAyMAorXGZCdHlwZVxmUgorXGZCU0RMX01PVVNFTU9USU9OXGZQCisuVFAgMjAKK1xmQnN0YXRlXGZSCitUaGUgY3VycmVudCBidXR0b24gc3RhdGUKKy5UUCAyMAorXGZCeFxmUiwgXGZCeVxmUgorVGhlIFgvWSBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UKKy5UUCAyMAorXGZCeHJlbFxmUiwgXGZCeXJlbFxmUgorUmVsYXRpdmUgbW90aW9uIGluIHRoZSBYL1kgZGlyZWN0aW9uCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJTRExfTW91c2VNb3Rpb25FdmVudFxmUiBpcyBhIG1lbWJlciBvZiB0aGUgXGZJXGZCU0RMX0V2ZW50XGZSXGZSIHVuaW9uIGFuZCBpcyB1c2VkIHdoZW4gYW4gZXZlbnQgb2YgdHlwZSBcZkJTRExfTU9VU0VNT1RJT05cZlAgaXMgcmVwb3J0ZWRcJi4KKy5QUAorU2ltcGx5IHB1dCwgYSBcZkJTRExfTU9VU0VNT1RJT05cZlAgdHlwZSBldmVudCBvY2N1cnMgd2hlbiBhIHVzZXIgbW92ZXMgdGhlIG1vdXNlIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gd2luZG93IG9yIHdoZW4gXGZJXGZCU0RMX1dhcnBNb3VzZVxmUFxmUiBpcyBjYWxsZWRcJi4gQm90aCB0aGUgYWJzb2x1dGUgKFxmQnhcZlIgYW5kIFxmQnlcZlIpIGFuZCByZWxhdGl2ZSAoXGZCeHJlbFxmUiBhbmQgXGZCeXJlbFxmUikgY29vcmRpbmF0ZXMgYXJlIHJlcG9ydGVkIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgYnV0dG9uIHN0YXRlcyAoXGZCc3RhdGVcZlIpXCYuIFRoZSBidXR0b24gc3RhdGUgY2FuIGJlIGludGVycHJldGVkIHVzaW5nIHRoZSBcZkJTRExfQlVUVE9OXGZQIG1hY3JvIChzZWUgXGZJXGZCU0RMX0dldE1vdXNlU3RhdGVcZlBcZlIpXCYuCisuUFAKK0lmIHRoZSBjdXJzb3IgaXMgaGlkZGVuIChcZklcZkJTRExfU2hvd0N1cnNvclxmUCgwKVxmUikgYW5kIHRoZSBpbnB1dCBpcyBncmFiYmVkIChcZklcZkJTRExfV01fR3JhYklucHV0XGZQKFNETF9HUkFCX09OKVxmUiksIHRoZW4gdGhlIG1vdXNlIHdpbGwgZ2l2ZSByZWxhdGl2ZSBtb3Rpb24gZXZlbnRzIGV2ZW4gd2hlbiB0aGUgY3Vyc29yIHJlYWNoZXMgdGhlIGVkZ2UgZm8gdGhlIHNjcmVlblwmLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4L1VuaXgtYS1saWtlc1wmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0V2ZW50XGZSXGZSLCBcZklcZkJTRExfTW91c2VCdXR0b25FdmVudFxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9OdW1Kb3lzdGlja3MuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX051bUpveXN0aWNrcy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzdhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9OdW1Kb3lzdGlja3MuMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9OdW1Kb3lzdGlja3MiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9OdW1Kb3lzdGlja3MgXC0gQ291bnQgYXZhaWxhYmxlIGpveXN0aWNrc1wmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfTnVtSm95c3RpY2tzXGZQXGZSKFxmQnZvaWRcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorQ291bnRzIHRoZSBudW1iZXIgb2Ygam95c3RpY2tzIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW1cJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXR0YWNoZWQgam95c3RpY2tzCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfSm95c3RpY2tOYW1lXGZQXGZSLCBcZklcZkJTRExfSm95c3RpY2tPcGVuXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX09wZW5BdWRpby4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfT3BlbkF1ZGlvLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhMjMyYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX09wZW5BdWRpby4zCkBAIC0wLDAgKzEsOTcgQEAKKy5USCAiU0RMX09wZW5BdWRpbyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU4IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX09wZW5BdWRpbyBcLSBPcGVucyB0aGUgYXVkaW8gZGV2aWNlIHdpdGggdGhlIGRlc2lyZWQgcGFyYW1ldGVyc1wmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfT3BlbkF1ZGlvXGZQXGZSKFxmQlNETF9BdWRpb1NwZWMgKmRlc2lyZWQsIFNETF9BdWRpb1NwZWMgKm9idGFpbmVkXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGF1ZGlvIGRldmljZSB3aXRoIHRoZSBcZkJkZXNpcmVkXGZSIHBhcmFtZXRlcnMsIGFuZCByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgcGxhY2luZyB0aGUgYWN0dWFsIGhhcmR3YXJlIHBhcmFtZXRlcnMgaW4gdGhlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IFxmQm9idGFpbmVkXGZSXCYuIElmIFxmQm9idGFpbmVkXGZSIGlzIE5VTEwsIHRoZSBhdWRpbyBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBndWFyYW50ZWVkIHRvIGJlIGluIHRoZSByZXF1ZXN0ZWQgZm9ybWF0LCBhbmQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byB0aGUgaGFyZHdhcmUgYXVkaW8gZm9ybWF0IGlmIG5lY2Vzc2FyeVwmLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgLTEgaWYgaXQgZmFpbGVkIHRvIG9wZW4gdGhlIGF1ZGlvIGRldmljZSwgb3IgY291bGRuXCYndCBzZXQgdXAgdGhlIGF1ZGlvIHRocmVhZFwmLgorLlBQCitUbyBvcGVuIHRoZSBhdWRpbyBkZXZpY2UgYSBcZkJkZXNpcmVkXGZSIFxmSVxmQlNETF9BdWRpb1NwZWNcZlJcZlIgbXVzdCBiZSBjcmVhdGVkXCYuIAorLlBQCisubmYKK1xmKENXU0RMX0F1ZGlvU3BlYyAqZGVzaXJlZDsKK1wmLgorXCYuCitkZXNpcmVkPShTRExfQXVkaW9TcGVjICopbWFsbG9jKHNpemVvZihTRExfQXVkaW9TcGVjKSk7XGZSCisuZmkKKy5QUAorIFlvdSBtdXN0IHRoZW4gZmlsbCB0aGlzIHN0cnVjdHVyZSB3aXRoIHlvdXIgZGVzaXJlZCBhdWRpbyBzcGVjaWZpY2F0aW9uc1wmLgorLklQICJcZkJkZXNpcmVkXGZSLT5cZkJmcmVxXGZSIiAxMFRoZSBkZXNpcmVkIGF1ZGlvIGZyZXF1ZW5jeSBpbiBzYW1wbGVzLXBlci1zZWNvbmRcJi4KKy5JUCAiXGZCZGVzaXJlZFxmUi0+XGZCZm9ybWF0XGZSIiAxMFRoZSBkZXNpcmVkIGF1ZGlvIGZvcm1hdCAoc2VlIFxmSVxmQlNETF9BdWRpb1NwZWNcZlJcZlIpCisuSVAgIlxmQmRlc2lyZWRcZlItPlxmQnNhbXBsZXNcZlIiIDEwVGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgYXVkaW8gYnVmZmVyIGluIHNhbXBsZXNcJi4gVGhpcyBudW1iZXIgc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvLCBhbmQgbWF5IGJlIGFkanVzdGVkIGJ5IHRoZSBhdWRpbyBkcml2ZXIgdG8gYSB2YWx1ZSBtb3JlIHN1aXRhYmxlIGZvciB0aGUgaGFyZHdhcmVcJi4gR29vZCB2YWx1ZXMgc2VlbSB0byByYW5nZSBiZXR3ZWVuIDUxMiBhbmQgODE5MiBpbmNsdXNpdmUsIGRlcGVuZGluZyBvbiB0aGUgYXBwbGljYXRpb24gYW5kIENQVSBzcGVlZFwmLiBTbWFsbGVyIHZhbHVlcyB5aWVsZCBmYXN0ZXIgcmVzcG9uc2UgdGltZSwgYnV0IGNhbiBsZWFkIHRvIHVuZGVyZmxvdyBpZiB0aGUgYXBwbGljYXRpb24gaXMgZG9pbmcgaGVhdnkgcHJvY2Vzc2luZyBhbmQgY2Fubm90IGZpbGwgdGhlIGF1ZGlvIGJ1ZmZlciBpbiB0aW1lXCYuIEEgc3RlcmVvIHNhbXBsZSBjb25zaXN0cyBvZiBib3RoIHJpZ2h0IGFuZCBsZWZ0IGNoYW5uZWxzIGluIExSIG9yZGVyaW5nXCYuIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgZGlyZWN0bHkgcmVsYXRlZCB0byB0aW1lIGJ5IHRoZSBmb2xsb3dpbmcgZm9ybXVsYTogbXMgPSAoc2FtcGxlcyoxMDAwKS9mcmVxCisuSVAgIlxmQmRlc2lyZWRcZlItPlxmQmNhbGxiYWNrXGZSIiAxMFRoaXMgc2hvdWxkIGJlIHNldCB0byBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIGlzIHJlYWR5IGZvciBtb3JlIGRhdGFcJi4gSXQgaXMgcGFzc2VkIGEgcG9pbnRlciB0byB0aGUgYXVkaW8gYnVmZmVyLCBhbmQgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXVkaW8gYnVmZmVyXCYuIFRoaXMgZnVuY3Rpb24gdXN1YWxseSBydW5zIGluIGEgc2VwYXJhdGUgdGhyZWFkLCBhbmQgc28geW91IHNob3VsZCBwcm90ZWN0IGRhdGEgc3RydWN0dXJlcyB0aGF0IGl0IGFjY2Vzc2VzIGJ5IGNhbGxpbmcgXGZJXGZCU0RMX0xvY2tBdWRpb1xmUFxmUiBhbmQgXGZJXGZCU0RMX1VubG9ja0F1ZGlvXGZQXGZSIGluIHlvdXIgY29kZVwmLiBUaGUgY2FsbGJhY2sgcHJvdG90eXBlIGlzOiAKKy5QUAorLm5mCitcZihDV3ZvaWQgY2FsbGJhY2sodm9pZCAqdXNlcmRhdGEsIFVpbnQ4ICpzdHJlYW0sIGludCBsZW4pO1xmUgorLmZpCisuUFAKKyBcZkJ1c2VyZGF0YVxmUiBpcyB0aGUgcG9pbnRlciBzdG9yZWQgaW4gXGZCdXNlcmRhdGFcZlIgZmllbGQgb2YgdGhlIFxmQlNETF9BdWRpb1NwZWNcZlJcJi4gXGZCc3RyZWFtXGZSIGlzIGEgcG9pbnRlciB0byB0aGUgYXVkaW8gYnVmZmVyIHlvdSB3YW50IHRvIGZpbGwgd2l0aCBpbmZvcm1hdGlvbiBhbmQgXGZCbGVuXGZSIGlzIHRoZSBsZW5ndGggb2YgdGhlIGF1ZGlvIGJ1ZmZlciBpbiBieXRlc1wmLgorLklQICJcZkJkZXNpcmVkXGZSLT5cZkJ1c2VyZGF0YVxmUiIgMTBUaGlzIHBvaW50ZXIgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gdGhlIFxmQmNhbGxiYWNrXGZQIGZ1bmN0aW9uXCYuCisuUFAKK1xmQlNETF9PcGVuQXVkaW9cZlAgcmVhZHMgdGhlc2UgZmllbGRzIGZyb20gdGhlIFxmQmRlc2lyZWRcZlIgXGZCU0RMX0F1ZGlvU3BlY1xmUiBzdHJ1Y3R1cmUgcGFzcyB0byB0aGUgZnVuY3Rpb24gYW5kIGF0dGVtcHRzIHRvIGZpbmQgYW4gYXVkaW8gY29uZmlndXJhdGlvbiBtYXRjaGluZyB5b3VyIFxmQmRlc2lyZWRcZlJcJi4gQXMgbWVudGlvbmVkIGFib3ZlLCBpZiB0aGUgXGZCb2J0YWluZWRcZlIgcGFyYW1ldGVyIGlzIFxmQk5VTExcZlAgdGhlbiBTREwgd2l0aCBjb252ZXJ0IGZyb20geW91ciBcZkJkZXNpcmVkXGZSIGF1ZGlvIHNldHRpbmdzIHRvIHRoZSBoYXJkd2FyZSBzZXR0aW5ncyBhcyBpdCBwbGF5c1wmLgorLlBQCitJZiBcZkJvYnRhaW5lZFxmUiBpcyBcZkJOVUxMXGZQIHRoZW4gdGhlIFxmQmRlc2lyZWRcZlIgXGZCU0RMX0F1ZGlvU3BlY1xmUiBpcyB5b3VyIHdvcmtpbmcgc3BlY2lmaWNhdGlvbiwgb3RoZXJ3aXNlIHRoZSBcZkJvYnRhaW5lZFxmUiBcZkJTRExfQXVkaW9TcGVjXGZSIGJlY29tZXMgdGhlIHdvcmtpbmcgc3BlY2lmaWNhdGlvbiBhbmQgdGhlIFxmQmRlc2lyZWNcZlIgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZGVsZXRlZFwmLiBUaGUgZGF0YSBpbiB0aGUgd29ya2luZyBzcGVjaWZpY2F0aW9uIGlzIHVzZWQgd2hlbiBidWlsZGluZyBcZkJTRExfQXVkaW9DVlRcZlJcJidzIGZvciBjb252ZXJ0aW5nIGxvYWRlZCBkYXRhIHRvIHRoZSBoYXJkd2FyZSBmb3JtYXRcJi4KKy5QUAorXGZCU0RMX09wZW5BdWRpb1xmUCBjYWxjdWxhdGVzIHRoZSBcZkJzaXplXGZSIGFuZCBcZkJzaWxlbmNlXGZSIGZpZWxkcyBmb3IgYm90aCB0aGUgXGZCZGVzaXJlZFxmUiBhbmQgXGZCb2J0YWluZWRcZlIgc3BlY2lmaWNhdGlvbnNcJi4gVGhlIFxmQnNpemVcZlIgZmllbGQgc3RvcmVzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBhdWRpbyBidWZmZXIgaW4gYnl0ZXMsIHdoaWxlIHRoZSBcZkJzaWxlbmNlXGZSIHN0b3JlcyB0aGUgdmFsdWUgdXNlZCB0byByZXByZXNlbnQgc2lsZW5jZSBpbiB0aGUgYXVkaW8gYnVmZmVyCisuUFAKK1RoZSBhdWRpbyBkZXZpY2Ugc3RhcnRzIG91dCBwbGF5aW5nIFxmQnNpbGVuY2VcZlIgd2hlbiBpdFwmJ3Mgb3BlbmVkLCBhbmQgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHBsYXlpbmcgYnkgY2FsbGluZyBcZklcZkJTRExfUGF1c2VBdWRpb1xmUChcZkIwXGZSKVxmUiB3aGVuIHlvdSBhcmUgcmVhZHkgZm9yIHlvdXIgYXVkaW8gXGZCY2FsbGJhY2tcZlIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXCYuIFNpbmNlIHRoZSBhdWRpbyBkcml2ZXIgbWF5IG1vZGlmeSB0aGUgcmVxdWVzdGVkIFxmQnNpemVcZlIgb2YgdGhlIGF1ZGlvIGJ1ZmZlciwgeW91IHNob3VsZCBhbGxvY2F0ZSBhbnkgbG9jYWwgbWl4aW5nIGJ1ZmZlcnMgYWZ0ZXIgeW91IG9wZW4gdGhlIGF1ZGlvIGRldmljZVwmLgorLlNIICJFWEFNUExFUyIKKy5QUAorLm5mCitcZihDVy8qIFByb3RvdHlwZSBvZiBvdXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3ZvaWQgbXlfYXVkaW9fY2FsbGJhY2sodm9pZCAqdXNlcmRhdGEsIFVpbnQ4ICpzdHJlYW0sIGludCBsZW4pOworCisvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KK1NETF9BdWRpb1NwZWMgKmRlc2lyZWQsICpvYnRhaW5lZDsKK1NETF9BdWRpb1NwZWMgKmhhcmR3YXJlX3NwZWM7CisKKy8qIEFsbG9jYXRlIGEgZGVzaXJlZCBTRExfQXVkaW9TcGVjICovCitkZXNpcmVkPShTRExfQXVkaW9TcGVjICopbWFsbG9jKHNpemVvZihTRExfQXVkaW9TcGVjKSk7CisKKy8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgb2J0YWluZWQgU0RMX0F1ZGlvU3BlYyAqLworb2J0YWluZWQ9KFNETF9BdWRpb1NwZWMgKiltYWxsb2Moc2l6ZW9mKFNETF9BdWRpb1NwZWMpKTsKKworLyogMjIwNTBIeiAtIEZNIFJhZGlvIHF1YWxpdHkgKi8KK2Rlc2lyZWQtPmZyZXE9MjIwNTA7CisKKy8qIDE2LWJpdCBzaWduZWQgYXVkaW8gKi8KK2Rlc2lyZWQtPmZvcm1hdD1BVURJT19TMTZMU0I7CisKKy8qIE1vbm8gKi8KK2Rlc2lyZWQtPmNoYW5uZWxzPTA7CisKKy8qIExhcmdlIGF1ZGlvIGJ1ZmZlciByZWR1Y2VzIHJpc2sgb2YgZHJvcG91dHMgYnV0IGluY3JlYXNlcyByZXNwb25zZSB0aW1lICovCitkZXNpcmVkLT5zYW1wbGVzPTgxOTI7CisKKy8qIE91ciBjYWxsYmFjayBmdW5jdGlvbiAqLworZGVzaXJlZC0+Y2FsbGJhY2s9bXlfYXVkaW9fY2FsbGJhY2s7CisKK2Rlc2lyZWQtPnVzZXJkYXRhPU5VTEw7CisKKy8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLworaWYgKCBTRExfT3BlbkF1ZGlvKGRlc2lyZWQsIG9idGFpbmVkKSA8IDAgKXsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZG5cJid0IG9wZW4gYXVkaW86ICVzCisiLCBTRExfR2V0RXJyb3IoKSk7CisgIGV4aXQoLTEpOworfQorLyogZGVzaXJlZCBzcGVjIGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KK2ZyZWUoZGVzaXJlZCk7CitoYXJkd2FyZV9zcGVjPW9idGFpbmVkOworXCYuCitcJi4KKy8qIFByZXBhcmUgY2FsbGJhY2sgZm9yIHBsYXlpbmcgKi8KK1wmLgorXCYuCitcJi4KKy8qIFN0YXJ0IHBsYXlpbmcgKi8KK1NETF9QYXVzZUF1ZGlvKDApO1xmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9BdWRpb1NwZWNcZlBcZlIsIFxmSVxmQlNETF9Mb2NrQXVkaW9cZlBcZlIsIFxmSVxmQlNETF9VbmxvY2tBdWRpb1xmUFxmUiwgXGZJXGZCU0RMX1BhdXNlQXVkaW9cZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfT3ZlcmxheS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfT3ZlcmxheS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTJlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9PdmVybGF5LjMKQEAgLTAsMCArMSw1MiBAQAorLlRIICJTRExfT3ZlcmxheSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX092ZXJsYXkgXC0gWVVWIHZpZGVvIG92ZXJsYXkKKy5TSCAiU1RSVUNUVVJFIERFRklOSVRJT04iCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIHN0cnVjdHsKKyAgVWludDMyIGZvcm1hdDsKKyAgaW50IHcsIGg7CisgIGludCBwbGFuZXM7CisgIFVpbnQxNiAqcGl0Y2hlczsKKyAgVWludDggKipwaXhlbHM7CisgIFVpbnQzMiBod19vdmVybGF5OjE7Cit9IFNETF9PdmVybGF5O1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQmZvcm1hdFxmUgorT3ZlcmxheSBmb3JtYXQgKHNlZSBiZWxvdykKKy5UUCAyMAorXGZCdywgaFxmUgorV2lkdGggYW5kIGhlaWdodCBvZiBvdmVybGF5CisuVFAgMjAKK1xmQnBsYW5lc1xmUgorTnVtYmVyIG9mIHBsYW5lcyBpbiB0aGUgb3ZlcmxheVwmLiBVc3VhbGx5IGVpdGhlciAxIG9yIDMKKy5UUCAyMAorXGZCcGl0Y2hlc1xmUgorQW4gYXJyYXkgb2YgcGl0Y2hlcywgb25lIGZvciBlYWNoIHBsYW5lXCYuIFBpdGNoIGlzIHRoZSBsZW5ndGggb2YgYSByb3cgaW4gYnl0ZXNcJi4KKy5UUCAyMAorXGZCcGl4ZWxzXGZSCitBbiBhcnJheSBvZiBwb2ludGVycyB0byB0ZWggZGF0YSBvZiBlYWNoIHBsYW5lXCYuIFRoZSBvdmVybGF5IHNob3VsZCBiZSBsb2NrZWQgYmVmb3JlIHRoZXNlIHBvaW50ZXJzIGFyZSB1c2VkXCYuCisuVFAgMjAKK1xmQmh3X292ZXJsYXlcZlIKK1RoaXMgd2lsbCBiZSBzZXQgdG8gMSBpZiB0aGUgb3ZlcmxheSBpcyBoYXJkd2FyZSBhY2NlbGVyYXRlZFwmLgorLlNIICJERVNDUklQVElPTiIKKy5QUAorQSBcZkJTRExfT3ZlcmxheVxmUiBpcyBzaW1pbGFyIHRvIGEgXGZJXGZCU0RMX1N1cmZhY2VcZlJcZlIgZXhjZXB0IGl0IHN0b3JlcyBhIFlVViBvdmVybGF5XCYuIEFsbCB0aGUgZmllbGRzIGFyZSByZWFkIG9ubHksIGV4Y2VwdCBmb3IgXGZCcGl4ZWxzXGZSIHdoaWNoIHNob3VsZCBiZSBcZklsb2NrZWRcZlIgYmVmb3JlIHVzZVwmLiBUaGUgXGZCZm9ybWF0XGZSIGZpZWxkIHN0b3JlcyB0aGUgZm9ybWF0IG9mIHRoZSBvdmVybGF5IHdoaWNoIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAKKy5QUAorLm5mCitcZihDVyNkZWZpbmUgU0RMX1lWMTJfT1ZFUkxBWSAgMHgzMjMxNTY1OSAgLyogUGxhbmFyIG1vZGU6IFkgKyBWICsgVSAqLworI2RlZmluZSBTRExfSVlVVl9PVkVSTEFZICAweDU2NTU1OTQ5ICAvKiBQbGFuYXIgbW9kZTogWSArIFUgKyBWICovCisjZGVmaW5lIFNETF9ZVVkyX09WRVJMQVkgIDB4MzI1OTU1NTkgIC8qIFBhY2tlZCBtb2RlOiBZMCtVMCtZMStWMCAqLworI2RlZmluZSBTRExfVVlWWV9PVkVSTEFZICAweDU5NTY1OTU1ICAvKiBQYWNrZWQgbW9kZTogVTArWTArVjArWTEgKi8KKyNkZWZpbmUgU0RMX1lWWVVfT1ZFUkxBWSAgMHg1NTU5NTY1OSAgLyogUGFja2VkIG1vZGU6IFkwK1YwK1kxK1UwICovXGZSCisuZmkKKy5QUAorIE1vcmUgaW5mb3JtYXRpb24gb24gWVVWIGZvcm1hdHMgY2FuIGJlIGZvdW5kIGF0IFxmSWh0dHA6Ly93d3dcJi53ZWJhcnR6XCYuY29tL2ZvdXJjYy9pbmRleHl1dlwmLmh0bSAobGluayB0byBVUkwgaHR0cDovL3d3dy53ZWJhcnR6LmNvbS9mb3VyY2MvaW5kZXh5dXYuaHRtKSBcZlJcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVZVVZPdmVybGF5XGZQXGZSLCBcZklcZkJTRExfTG9ja1lVVk92ZXJsYXlcZlBcZlIsIFxmSVxmQlNETF9VbmxvY2tZVVZPdmVybGF5XGZQXGZSLCBcZklcZkJTRExfRnJlZVlVVk92ZXJsYXlcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUGFsZXR0ZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUGFsZXR0ZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWU0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9QYWxldHRlLjMKQEAgLTAsMCArMSwyNiBAQAorLlRIICJTRExfUGFsZXR0ZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1BhbGV0dGUgXC0gQ29sb3IgcGFsZXR0ZSBmb3IgOC1iaXQgcGl4ZWwgZm9ybWF0cworLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBpbnQgbmNvbG9yczsKKyAgU0RMX0NvbG9yICpjb2xvcnM7Cit9IFNETF9QYWxldHRlO1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQm5jb2xvcnNcZlIKK051bWJlciBvZiBjb2xvcnMgdXNlZCBpbiB0aGlzIHBhbGV0dGUKKy5UUCAyMAorXGZCY29sb3JzXGZSCitQb2ludGVyIHRvIFxmSVxmQlNETF9Db2xvclxmUlxmUiBzdHJ1Y3R1cmVzIHRoYXQgbWFrZSB1cCB0aGUgcGFsZXR0ZVwmLgorLlNIICJERVNDUklQVElPTiIKKy5QUAorRWFjaCBwaXhlbCBpbiBhbiA4LWJpdCBzdXJmYWNlIGlzIGFuIGluZGV4IGludG8gdGhlIFxmQmNvbG9yc1xmUiBmaWVsZCBvZiB0aGUgXGZCU0RMX1BhbGV0dGVcZlIgc3RydWN0dXJlIHN0b3JlIGluIFxmSVxmQlNETF9QaXhlbEZvcm1hdFxmUlxmUlwmLiBBIFxmQlNETF9QYWxldHRlXGZSIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIGNyZWF0ZWQgbWFudWFsbHlcJi4gSXQgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHdoZW4gU0RMIGFsbG9jYXRlcyBhIFxmQlNETF9QaXhlbEZvcm1hdFxmUiBmb3IgYSBzdXJmYWNlXCYuIFRoZSBjb2xvcnMgdmFsdWVzIG9mIGEgXGZJXGZCU0RMX1N1cmZhY2VcZlJcZlJzIHBhbGV0dGUgY2FuIGJlIHNldCB3aXRoIHRoZSBcZklcZkJTRExfU2V0Q29sb3JzXGZQXGZSXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ29sb3JcZlJcZlIsIFxmSVxmQlNETF9TdXJmYWNlXGZSXGZSLCBcZklcZkJTRExfU2V0Q29sb3JzXGZQXGZSIFxmSVxmQlNETF9TZXRQYWxldHRlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1BhdXNlQXVkaW8uMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1BhdXNlQXVkaW8uMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E5NzlhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUGF1c2VBdWRpby4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX1BhdXNlQXVkaW8iICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9QYXVzZUF1ZGlvIFwtIFBhdXNlcyBhbmQgdW5wYXVzZXMgdGhlIGF1ZGlvIGNhbGxiYWNrIHByb2Nlc3NpbmcKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9QYXVzZUF1ZGlvXGZQXGZSKFxmQmludCBwYXVzZV9vblxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGlzIGZ1bmN0aW9uIHBhdXNlcyBhbmQgdW5wYXVzZXMgdGhlIGF1ZGlvIGNhbGxiYWNrIHByb2Nlc3NpbmdcJi4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIFxmQnBhdXNlX29uXGZSPTAgYWZ0ZXIgb3BlbmluZyB0aGUgYXVkaW8gZGV2aWNlIHRvIHN0YXJ0IHBsYXlpbmcgc291bmRcJi4gVGhpcyBpcyBzbyB5b3UgY2FuIHNhZmVseSBpbml0aWFsaXplIGRhdGEgZm9yIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24gYWZ0ZXIgb3BlbmluZyB0aGUgYXVkaW8gZGV2aWNlXCYuIFNpbGVuY2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBhdWRpbyBkZXZpY2UgZHVyaW5nIHRoZSBwYXVzZVwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0dldEF1ZGlvU3RhdHVzXGZQXGZSLCBcZklcZkJTRExfT3BlbkF1ZGlvXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1BlZXBFdmVudHMuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1BlZXBFdmVudHMuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTY1NDJkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUGVlcEV2ZW50cy4zCkBAIC0wLDAgKzEsMjYgQEAKKy5USCAiU0RMX1BlZXBFdmVudHMiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9QZWVwRXZlbnRzIFwtIENoZWNrcyB0aGUgZXZlbnQgcXVldWUgZm9yIG1lc3NhZ2VzIGFuZCBvcHRpb25hbGx5IHJldHVybnMgdGhlbVwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfUGVlcEV2ZW50c1xmUFxmUihcZkJTRExfRXZlbnQgKmV2ZW50cywgaW50IG51bWV2ZW50cywgU0RMX2V2ZW50YWN0aW9uIGFjdGlvbiwgVWludDMyIG1hc2tcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorQ2hlY2tzIHRoZSBldmVudCBxdWV1ZSBmb3IgbWVzc2FnZXMgYW5kIG9wdGlvbmFsbHkgcmV0dXJucyB0aGVtXCYuCisuUFAKK0lmIFxmQmFjdGlvblxmUiBpcyBcZkJTRExfQURERVZFTlRcZlAsIHVwIHRvIFxmQm51bWV2ZW50c1xmUiBldmVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmFjayBvZiB0aGUgZXZlbnQgcXVldWVcJi4KKy5QUAorSWYgXGZCYWN0aW9uXGZSIGlzIFxmQlNETF9QRUVLRVZFTlRcZlAsIHVwIHRvIFxmQm51bWV2ZW50c1xmUiBldmVudHMgYXQgdGhlIGZyb250IG9mIHRoZSBldmVudCBxdWV1ZSwgbWF0Y2hpbmcgXGZJXGZCbWFza1xmUlxmUiwgd2lsbCBiZSByZXR1cm5lZCBhbmQgd2lsbCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVwmLgorLlBQCitJZiBcZkJhY3Rpb25cZlIgaXMgXGZCU0RMX0dFVEVWRU5UXGZQLCB1cCB0byBcZkJudW1ldmVudHNcZlIgZXZlbnRzIGF0IHRoZSBmcm9udCBvZiB0aGUgZXZlbnQgcXVldWUsIG1hdGNoaW5nIFxmSVxmQm1hc2tcZlJcZlIsIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVwmLgorLlBQCitUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgZXZlbnRzIGFjdHVhbGx5IHN0b3JlZCwgb3IgXGZCLTFcZlIgaWYgdGhlcmUgd2FzIGFuIGVycm9yXCYuIAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0V2ZW50XGZSXGZSLCBcZklcZkJTRExfUG9sbEV2ZW50XGZQXGZSLCBcZklcZkJTRExfUHVzaEV2ZW50XGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1BpeGVsRm9ybWF0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9QaXhlbEZvcm1hdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTU5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9QaXhlbEZvcm1hdC4zCkBAIC0wLDAgKzEsMTQwIEBACisuVEggIlNETF9QaXhlbEZvcm1hdCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1BpeGVsRm9ybWF0IFwtIFN0b3JlcyBzdXJmYWNlIGZvcm1hdCBpbmZvcm1hdGlvbgorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0IFNETF9QaXhlbEZvcm1hdCB7CisgIFNETF9QYWxldHRlICpwYWxldHRlOworICBVaW50OCAgQml0c1BlclBpeGVsOworICBVaW50OCAgQnl0ZXNQZXJQaXhlbDsKKyAgVWludDggIFJsb3NzLCBHbG9zcywgQmxvc3MsIEFsb3NzOworICBVaW50OCAgUnNoaWZ0LCBHc2hpZnQsIEJzaGlmdCwgQXNoaWZ0OworICBVaW50MzIgUm1hc2ssIEdtYXNrLCBCbWFzaywgQW1hc2s7CisgIFVpbnQzMiBjb2xvcmtleTsKKyAgVWludDggIGFscGhhOworfSBTRExfUGl4ZWxGb3JtYXQ7XGZSCisuZmkKKy5QUAorLlNIICJTVFJVQ1RVUkUgREFUQSIKKy5UUCAyMAorXGZCcGFsZXR0ZVxmUgorUG9pbnRlciB0byB0aGUgXGZJcGFsZXR0ZVxmUiwgb3IgXGZCTlVMTFxmUCBpZiB0aGUgXGZCQml0c1BlclBpeGVsXGZSPjgKKy5UUCAyMAorXGZCQml0c1BlclBpeGVsXGZSCitUaGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgZWFjaCBwaXhlbCBpbiBhIHN1cmZhY2VcJi4gVXN1YWxseSA4LCAxNiwgMjQgb3IgMzJcJi4KKy5UUCAyMAorXGZCQnl0ZXNQZXJQaXhlbFxmUgorVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIHJlcHJlc2VudCBlYWNoIHBpeGVsIGluIGEgc3VyZmFjZVwmLiBVc3VhbGx5IG9uZSB0byBmb3VyXCYuCisuVFAgMjAKK1xmQltSR0JBXW1hc2tcZlIKK0JpbmFyeSBtYXNrIHVzZWQgdG8gcmV0cmlldmUgaW5kaXZpZHVhbCBjb2xvciB2YWx1ZXMKKy5UUCAyMAorXGZCW1JHQkFdbG9zc1xmUgorUHJlY2lzaW9uIGxvc3Mgb2YgZWFjaCBjb2xvciBjb21wb25lbnQgKDJeW1JHQkFdbG9zcykKKy5UUCAyMAorXGZCW1JHQkFdc2hpZnRcZlIKK0JpbmFyeSBsZWZ0IHNoaWZ0IG9mIGVhY2ggY29sb3IgY29tcG9uZW50IGluIHRoZSBwaXhlbCB2YWx1ZQorLlRQIDIwCitcZkJjb2xvcmtleVxmUgorUGl4ZWwgdmFsdWUgb2YgdHJhbnNwYXJlbnQgcGl4ZWxzCisuVFAgMjAKK1xmQmFscGhhXGZSCitPdmVyYWxsIHN1cmZhY2UgYWxwaGEgdmFsdWUKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0EgXGZCU0RMX1BpeGVsRm9ybWF0XGZSIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBwaXhlbCBkYXRhIHN0b3JlZCBhdCB0aGUgXGZCcGl4ZWxzXGZSIGZpZWxkIG9mIGEgXGZJXGZCU0RMX1N1cmZhY2VcZlJcZlJcJi4gRXZlcnkgc3VyZmFjZSBzdG9yZXMgYSBcZkJTRExfUGl4ZWxGb3JtYXRcZlIgaW4gdGhlIFxmQmZvcm1hdFxmUiBmaWVsZFwmLgorLlBQCitJZiB5b3Ugd2lzaCB0byBkbyBwaXhlbCBsZXZlbCBtb2RpZmljYXRpb25zIG9uIGEgc3VyZmFjZSwgdGhlbiB1bmRlcnN0YW5kaW5nIGhvdyBTREwgc3RvcmVzIGl0cyBjb2xvciBpbmZvcm1hdGlvbiBpcyBlc3NlbnRpYWxcJi4KKy5QUAorOC1iaXQgcGl4ZWwgZm9ybWF0cyBhcmUgdGhlIGVhc2llc3QgdG8gdW5kZXJzdGFuZFwmLiBTaW5jZSBpdHMgYW4gOC1iaXQgZm9ybWF0LCB3ZSBoYXZlIDggXGZCQml0c1BlclBpeGVsXGZSIGFuZCAxIFxmQkJ5dGVzUGVyUGl4ZWxcZlJcJi4gU2luY2UgXGZCQnl0ZXNQZXJQaXhlbFxmUiBpcyAxLCBhbGwgcGl4ZWxzIGFyZSByZXByZXNlbnRlZCBieSBhIFVpbnQ4IHdoaWNoIGNvbnRhaW5zIGFuIGluZGV4IGludG8gXGZCcGFsZXR0ZVxmUi0+XGZCY29sb3JzXGZSXCYuIFNvLCB0byBkZXRlcm1pbmUgdGhlIGNvbG9yIG9mIGEgcGl4ZWwgaW4gYSA4LWJpdCBzdXJmYWNlOiB3ZSByZWFkIHRoZSBjb2xvciBpbmRleCBmcm9tIFxmQnN1cmZhY2VcZlItPlxmQnBpeGVsc1xmUiBhbmQgd2UgdXNlIHRoYXQgaW5kZXggdG8gcmVhZCB0aGUgXGZJXGZCU0RMX0NvbG9yXGZSXGZSIHN0cnVjdHVyZSBmcm9tIFxmQnN1cmZhY2VcZlItPlxmQmZvcm1hdFxmUi0+XGZCcGFsZXR0ZVxmUi0+XGZCY29sb3JzXGZSXCYuIExpa2Ugc286IAorLlBQCisubmYKK1xmKENXU0RMX1N1cmZhY2UgKnN1cmZhY2U7CitTRExfUGl4ZWxGb3JtYXQgKmZtdDsKK1NETF9Db2xvciAqY29sb3I7CitVaW50OCBpbmRleDsKKworXCYuCitcJi4KKworLyogQ3JlYXRlIHN1cmZhY2UgKi8KK1wmLgorXCYuCitmbXQ9c3VyZmFjZS0+Zm9ybWF0OworCisvKiBDaGVjayB0aGUgYml0ZGVwdGggb2YgdGhlIHN1cmZhY2UgKi8KK2lmKGZtdC0+Qml0c1BlclBpeGVsIT04KXsKKyAgZnByaW50ZihzdGRlcnIsICJOb3QgYW4gOC1iaXQgc3VyZmFjZVwmLgorIik7CisgIHJldHVybigtMSk7Cit9CisKKy8qIExvY2sgdGhlIHN1cmZhY2UgKi8KK1NETF9Mb2NrU3VyZmFjZShzdXJmYWNlKTsKKworLyogR2V0IHRoZSB0b3BsZWZ0IHBpeGVsICovCitpbmRleD0qKFVpbnQ4ICopc3VyZmFjZS0+cGl4ZWxzOworY29sb3I9Zm10LT5wYWxldHRlLT5jb2xvcnNbaW5kZXhdOworCisvKiBVbmxvY2sgdGhlIHN1cmZhY2UgKi8KK1NETF9VbmxvY2tTdXJmYWNlKHN1cmZhY2UpOworcHJpbnRmKCJQaXhlbCBDb2xvci0+IFJlZDogJWQsIEdyZWVuOiAlZCwgQmx1ZTogJWRcJi4gSW5kZXg6ICVkCisiLAorICAgICAgICAgIGNvbG9yLT5yLCBjb2xvci0+ZywgY29sb3ItPmIsIGluZGV4KTsKK1wmLgorXCYuXGZSCisuZmkKKy5QUAorLlBQCitQaXhlbCBmb3JtYXRzIGFib3ZlIDgtYml0IGFyZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQgZXhwZXJpZW5jZVwmLiBUaGV5IGFyZSBjb25zaWRlcmVkIHRvIGJlICJUcnVlQ29sb3IiIGZvcm1hdHMgYW5kIHRoZSBjb2xvciBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHBpeGVscyB0aGVtc2VsdmVzLCBub3QgaW4gYSBwYWxldHRlXCYuIFRoZSBtYXNrLCBzaGlmdCBhbmQgbG9zcyBmaWVsZHMgdGVsbCB1cyBob3cgdGhlIGNvbG9yIGluZm9ybWF0aW9uIGlzIGVuY29kZWRcJi4gVGhlIG1hc2sgZmllbGRzIGFsbG93IHVzIHRvIGlzb2xhdGUgZWFjaCBjb2xvciBjb21wb25lbnQsIHRoZSBzaGlmdCBmaWVsZHMgdGVsbCB1cyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIGVhY2ggY29tcG9uZW50IGluIHRoZSBwaXhlbCB2YWx1ZSBhbmQgdGhlIGxvc3MgZmllbGRzIHRlbGwgdXMgdGhlIG51bWJlciBvZiBiaXRzIGxvc3QgZnJvbSBlYWNoIGNvbXBvbmVudCB3aGVuIHBhY2tpbmcgOC1iaXQgY29sb3IgY29tcG9uZW50IGluIGEgcGl4ZWxcJi4gCisuUFAKKy5uZgorXGYoQ1cvKiBFeHRyYWN0aW5nIGNvbG9yIGNvbXBvbmVudHMgZnJvbSBhIDMyLWJpdCBjb2xvciB2YWx1ZSAqLworU0RMX1BpeGVsRm9ybWF0ICpmbXQ7CitTRExfU3VyZmFjZSAqc3VyZmFjZTsKK1VpbnQzMiB0ZW1wLCBwaXhlbDsKK1VpbnQ4IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOworXCYuCitcJi4KK1wmLgorZm10PXN1cmZhY2UtPmZvcm1hdDsKK1NETF9Mb2NrU3VyZmFjZShzdXJmYWNlKTsKK3BpeGVsPSooKFVpbnQzMiopc3VyZmFjZS0+cGl4ZWxzKTsKK1NETF9VbmxvY2tTdXJmYWNlKHN1cmZhY2UpOworCisvKiBHZXQgUmVkIGNvbXBvbmVudCAqLwordGVtcD1waXhlbCZmbXQtPlJtYXNrOyAvKiBJc29sYXRlIHJlZCBjb21wb25lbnQgKi8KK3RlbXA9dGVtcD4+Zm10LT5Sc2hpZnQ7LyogU2hpZnQgaXQgZG93biB0byA4LWJpdCAqLwordGVtcD10ZW1wPDxmbXQtPlJsb3NzOyAvKiBFeHBhbmQgdG8gYSBmdWxsIDgtYml0IG51bWJlciAqLworcmVkPShVaW50OCl0ZW1wOworCisvKiBHZXQgR3JlZW4gY29tcG9uZW50ICovCit0ZW1wPXBpeGVsJmZtdC0+R21hc2s7IC8qIElzb2xhdGUgZ3JlZW4gY29tcG9uZW50ICovCit0ZW1wPXRlbXA+PmZtdC0+R3NoaWZ0Oy8qIFNoaWZ0IGl0IGRvd24gdG8gOC1iaXQgKi8KK3RlbXA9dGVtcDw8Zm10LT5HbG9zczsgLyogRXhwYW5kIHRvIGEgZnVsbCA4LWJpdCBudW1iZXIgKi8KK2dyZWVuPShVaW50OCl0ZW1wOworCisvKiBHZXQgQmx1ZSBjb21wb25lbnQgKi8KK3RlbXA9cGl4ZWwmZm10LT5CbWFzazsgLyogSXNvbGF0ZSBibHVlIGNvbXBvbmVudCAqLwordGVtcD10ZW1wPj5mbXQtPkJzaGlmdDsvKiBTaGlmdCBpdCBkb3duIHRvIDgtYml0ICovCit0ZW1wPXRlbXA8PGZtdC0+Qmxvc3M7IC8qIEV4cGFuZCB0byBhIGZ1bGwgOC1iaXQgbnVtYmVyICovCitibHVlPShVaW50OCl0ZW1wOworCisvKiBHZXQgQWxwaGEgY29tcG9uZW50ICovCit0ZW1wPXBpeGVsJmZtdC0+QW1hc2s7IC8qIElzb2xhdGUgYWxwaGEgY29tcG9uZW50ICovCit0ZW1wPXRlbXA+PmZtdC0+QXNoaWZ0Oy8qIFNoaWZ0IGl0IGRvd24gdG8gOC1iaXQgKi8KK3RlbXA9dGVtcDw8Zm10LT5BbG9zczsgLyogRXhwYW5kIHRvIGEgZnVsbCA4LWJpdCBudW1iZXIgKi8KK2FscGhhPShVaW50OCl0ZW1wOworCitwcmludGYoIlBpeGVsIENvbG9yIC0+IFI6ICVkLCAgRzogJWQsICBCOiAlZCwgIEE6ICVkCisiLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CitcJi4KK1wmLgorXCYuXGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1N1cmZhY2VcZlJcZlIsIFxmSVxmQlNETF9NYXBSR0JcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUG9sbEV2ZW50LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9Qb2xsRXZlbnQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk3ZjdlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUG9sbEV2ZW50LjMKQEAgLTAsMCArMSw0NCBAQAorLlRIICJTRExfUG9sbEV2ZW50IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfUG9sbEV2ZW50IFwtIFBvbGxzIGZvciBjdXJyZW50bHkgcGVuZGluZyBldmVudHNcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX1BvbGxFdmVudFxmUFxmUihcZkJTRExfRXZlbnQgKmV2ZW50XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1BvbGxzIGZvciBjdXJyZW50bHkgcGVuZGluZyBldmVudHMsIGFuZCByZXR1cm5zIFxmQjFcZlIgaWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIGV2ZW50cywgb3IgXGZCMFxmUiBpZiB0aGVyZSBhcmUgbm9uZSBhdmFpbGFibGVcJi4gCisuUFAKK0lmIFxmQmV2ZW50XGZSIGlzIG5vdCBcZkJOVUxMXGZQLCB0aGUgbmV4dCBldmVudCBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGFuZCBzdG9yZWQgaW4gdGhhdCBhcmVhXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisuUFAKKy5uZgorXGYoQ1dTRExfRXZlbnQgZXZlbnQ7IC8qIEV2ZW50IHN0cnVjdHVyZSAqLworCitcJi4KK1wmLgorXCYuCisvKiBDaGVjayBmb3IgZXZlbnRzICovCit3aGlsZShTRExfUG9sbEV2ZW50KCZldmVudCkpeyAgLyogTG9vcCB1bnRpbCB0aGVyZSBhcmUgbm8gZXZlbnRzIGxlZnQgb24gdGhlIHF1ZXVlICovCisgIHN3aXRjaChldmVudFwmLnR5cGUpeyAgLyogUHJvY2VzcyB0aGUgYXBwcm9waWF0ZSBldmVudCB0eXBlICovCisgICAgY2FzZSBTRExfS0VZRE9XTjogIC8qIEhhbmRsZSBhIEtFWURPV04gZXZlbnQgKi8gICAgICAgICAKKyAgICAgIHByaW50ZigiT2ghIEtleSBwcmVzcworIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNETF9NT1VTRU1PVElPTjoKKyAgICAgIFwmLgorICAgICAgXCYuCisgICAgICBcJi4KKyAgICBkZWZhdWx0OiAvKiBSZXBvcnQgYW4gdW5oYW5kbGVkIGV2ZW50ICovCisgICAgICBwcmludGYoIkkgZG9uXCYndCBrbm93IHdoYXQgdGhpcyBldmVudCBpcyEKKyIpOworICB9Cit9XGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0V2ZW50XGZSXGZSLCBcZklcZkJTRExfV2FpdEV2ZW50XGZQXGZSLCBcZklcZkJTRExfUGVlcEV2ZW50c1xmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9QdW1wRXZlbnRzLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9QdW1wRXZlbnRzLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjYzEzZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1B1bXBFdmVudHMuMwpAQCAtMCwwICsxLDIzIEBACisuVEggIlNETF9QdW1wRXZlbnRzIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfUHVtcEV2ZW50cyBcLSBQdW1wcyB0aGUgZXZlbnQgbG9vcCwgZ2F0aGVyaW5nIGV2ZW50cyBmcm9tIHRoZSBpbnB1dCBkZXZpY2VzXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfUHVtcEV2ZW50c1xmUFxmUihcZkJ2b2lkXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1B1bXBzIHRoZSBldmVudCBsb29wLCBnYXRoZXJpbmcgZXZlbnRzIGZyb20gdGhlIGlucHV0IGRldmljZXNcJi4KKy5QUAorXGZCU0RMX1B1bXBFdmVudHNcZlAgZ2F0aGVycyBhbGwgdGhlIHBlbmRpbmcgaW5wdXQgaW5mb3JtYXRpb24gZnJvbSBkZXZpY2VzIGFuZCBwbGFjZXMgaXQgb24gdGhlIGV2ZW50IHF1ZXVlXCYuIFdpdGhvdXQgY2FsbHMgdG8gXGZCU0RMX1B1bXBFdmVudHNcZlAgbm8gZXZlbnRzIHdvdWxkIGV2ZXIgYmUgcGxhY2VkIG9uIHRoZSBxdWV1ZVwmLiBPZnRlbiBjYWxscyB0aGUgbmVlZCBmb3IgXGZCU0RMX1B1bXBFdmVudHNcZlAgaXMgaGlkZGVuIGZyb20gdGhlIHVzZXIgc2luY2UgXGZJXGZCU0RMX1BvbGxFdmVudFxmUFxmUiBhbmQgXGZJXGZCU0RMX1dhaXRFdmVudFxmUFxmUiBpbXBsaWNpdGx5IGNhbGwgXGZCU0RMX1B1bXBFdmVudHNcZlBcJi4gSG93ZXZlciwgaWYgeW91IGFyZSBub3QgcG9sbGluZyBvciB3YWl0aW5nIGZvciBldmVudHMgKGVcJi5nXCYuIHlvdXIgZmlsdGVyaW5nIHRoZW0pLCB0aGVuIHlvdSBtdXN0IGNhbGwgXGZCU0RMX1B1bXBFdmVudHNcZlAgdG8gZm9yY2UgYW4gZXZlbnQgcXVldWUgdXBkYXRlXCYuCisuUFAKKy5SUworXGZCTm90ZTogIAorLlBQCitZb3UgY2FuIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIGluIHRoZSB0aHJlYWQgdGhhdCBzZXQgdGhlIHZpZGVvIG1vZGVcJi4KKy5SRQorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1BvbGxFdmVudFxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9QdXNoRXZlbnQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1B1c2hFdmVudC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTE4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9QdXNoRXZlbnQuMwpAQCAtMCwwICsxLDI3IEBACisuVEggIlNETF9QdXNoRXZlbnQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9QdXNoRXZlbnQgXC0gUHVzaGVzIGFuIGV2ZW50IG9udG8gdGhlIGV2ZW50IHF1ZXVlCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9QdXNoRXZlbnRcZlBcZlIoXGZCU0RMX0V2ZW50ICpldmVudFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGUgZXZlbnQgcXVldWUgY2FuIGFjdHVhbGx5IGJlIHVzZWQgYXMgYSB0d28gd2F5IGNvbW11bmljYXRpb24gY2hhbm5lbFwmLiBOb3Qgb25seSBjYW4gZXZlbnRzIGJlIHJlYWQgZnJvbSB0aGUgcXVldWUsIGJ1dCB0aGUgdXNlciBjYW4gYWxzbyBwdXNoIHRoZWlyIG93biBldmVudHMgb250byBpdFwmLiBcZkJldmVudFxmUiBpcyBhIHBvaW50ZXIgdG8gdGhlIGV2ZW50IHN0cnVjdHVyZSB5b3Ugd2lzaCB0byBwdXNoIG9udG8gdGhlIHF1ZXVlXCYuCisuUFAKKy5SUworXGZCTm90ZTogIAorLlBQCitQdXNoaW5nIGRldmljZSBpbnB1dCBldmVudHMgb250byB0aGUgcXVldWUgZG9lc25cJid0IG1vZGlmeSB0aGUgc3RhdGUgb2YgdGhlIGRldmljZSB3aXRoaW4gU0RMXCYuCisuUkUKKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIFxmQjBcZlIgb24gc3VjY2VzcyBvciBcZkItMVxmUiBpZiB0aGUgZXZlbnQgY291bGRuXCYndCBiZSBwdXNoZWRcJi4KKy5TSCAiRVhBTVBMRVMiCisuUFAKK1NlZSBcZklcZkJTRExfRXZlbnRcZlJcZlJcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9Qb2xsRXZlbnRcZlBcZlIsIFxmSVxmQlNETF9QZWVwRXZlbnRzXGZQXGZSLCBcZklcZkJTRExfRXZlbnRcZlJcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUXVpdC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUXVpdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZmU4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9RdWl0LjMKQEAgLTAsMCArMSwyOSBAQAorLlRIICJTRExfUXVpdCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1F1aXQgXC0gU2h1dCBkb3duIFNETAorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQnZvaWQgXGZCU0RMX1F1aXRcZlBcZlIoXGZCdm9pZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJTRExfUXVpdFxmUCBzaHV0cyBkb3duIGFsbCBTREwgc3Vic3lzdGVtcyBhbmQgZnJlZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhlbVwmLiBUaGlzIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSB5b3UgZXhpdFwmLiBGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSB5b3UgY2FuIHNldCBcZkJTRExfUXVpdFxmUCBhcyB5b3VyIFxmQmF0ZXhpdFxmUCBjYWxsLCBsaWtlOiAKKy5QUAorLm5mCitcZihDV1NETF9Jbml0KFNETF9JTklUX1ZJREVPfFNETF9JTklUX0FVRElPKTsKK2F0ZXhpdChTRExfUXVpdCk7CitcJi4KK1wmLlxmUgorLmZpCisuUFAKKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK1doaWxlIHVzaW5nIFxmQmF0ZXhpdFxmUCBtYXliZSBiZSBmaW5lIGZvciBzbWFsbCBwcm9ncmFtcywgbW9yZSBhZHZhbmNlZCB1c2VycyBzaG91bGQgc2h1dCBkb3duIFNETCBpbiB0aGVpciBvd24gY2xlYW51cCBjb2RlXCYuIFBsdXMsIHVzaW5nIFxmQmF0ZXhpdFxmUCBpbiBhIGxpYnJhcnkgaXMgYSBzdXJlIHdheSB0byBjcmFzaCBkeW5hbWljYWxseSBsb2FkZWQgY29kZQorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfUXVpdFN1YnN5c3RlbVxmUFxmUiwgXGZJXGZCU0RMX0luaXRcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUXVpdEV2ZW50LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9RdWl0RXZlbnQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU3ZTJhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUXVpdEV2ZW50LjMKQEAgLTAsMCArMSwzMCBAQAorLlRIICJTRExfUXVpdEV2ZW50IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfUXVpdEV2ZW50IFwtIFF1aXQgcmVxdWVzdGVkIGV2ZW50CisuU0ggIlNUUlVDVFVSRSBERUZJTklUSU9OIgorLlBQCisubmYKK1xmKENXdHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGUKK30gU0RMX1F1aXRFdmVudDtcZlIKKy5maQorLlBQCisuU0ggIlNUUlVDVFVSRSBEQVRBIgorLlRQIDIwCitcZkJ0eXBlXGZSCitcZkJTRExfUVVJVFxmUAorLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX1F1aXRFdmVudFxmUiBpcyBhIG1lbWJlciBvZiB0aGUgXGZJXGZCU0RMX0V2ZW50XGZSXGZSIHVuaW9uIGFuZCBpcyB1c2VkIHdoYW4gYW4gZXZlbnQgb2YgdHlwZSBcZkJTRExfUVVJVFxmUCBpcyByZXBvcnRlZFwmLgorLlBQCitBcyBjYW4gYmUgc2VlbiwgdGhlIFNETF9RdWl0RXZlbnQgc3RydWN0dXJlIHNlcnZlcyBubyB1c2VmdWwgcHVycG9zZVwmLiBUaGUgZXZlbnQgaXRzZWxmLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgdmVyeSBpbXBvcnRhbnRcJi4gSWYgeW91IGZpbHRlciBvdXQgb3IgaWdub3JlIGEgcXVpdCBldmVudCB0aGVuIGl0IGlzIGltcG9zc2libGUgZm9yIHRoZSB1c2VyIHRvIGNsb3NlIHRoZSB3aW5kb3dcJi4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBkbyBhY2NlcHQgYSBxdWl0IGV2ZW50IHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdpbmRvdyB3aWxsIGJlIGNsb3NlZCwgYW5kIHNjcmVlbiB1cGRhdGVzIHdpbGwgc3RpbGwgcmVwb3J0IHN1Y2Nlc3MgZXZlbnQgdGhvdWdoIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5vIGxvbmdlciBiZSB2aXNpYmxlXCYuCisuUFAKKy5SUworXGZCTm90ZTogIAorLlBQCitUaGUgbWFjcm8gXGZCU0RMX1F1aXRSZXF1ZXN0ZWRcZlAgd2lsbCByZXR1cm4gbm9uLXplcm8gaWYgYSBxdWl0IGV2ZW50IGlzIHBlbmRpbmcKKy5SRQorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0V2ZW50XGZSXGZSLCBcZklcZkJTRExfU2V0RXZlbnRGaWx0ZXJcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMjo1OQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUXVpdFN1YlN5c3RlbS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUXVpdFN1YlN5c3RlbS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZTNjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9RdWl0U3ViU3lzdGVtLjMKQEAgLTAsMCArMSwxNSBAQAorLlRIICJTRExfUXVpdFN1YlN5c3RlbSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1F1aXRTdWJTeXN0ZW0gXC0gU2h1dCBkb3duIGEgc3Vic3lzdGVtCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfUXVpdFN1YlN5c3RlbVxmUFxmUihcZkJVaW50MzIgZmxhZ3NcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX1F1aXRTdWJTeXN0ZW1cZlAgYWxsb3dzIHlvdSB0byBzaHV0IGRvd24gYSBzdWJzeXN0ZW0gdGhhdCBoYXMgYmVlbiBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5IFxmSVxmQlNETF9Jbml0XGZQXGZSIG9yIFxmSVxmQlNETF9Jbml0U3ViU3lzdGVtXGZQXGZSXCYuIFRoZSBcZkJmbGFnc1xmUiB0ZWxscyBcZkJTRExfUXVpdFN1YlN5c3RlbVxmUCB3aGljaCBzdWJzeXN0ZW1zIHRvIHNodXQgZG93biwgaXQgdXNlcyB0aGUgc2FtZSB2YWx1ZXMgdGhhdCBhcmUgcGFzc2VkIHRvIFxmSVxmQlNETF9Jbml0XGZQXGZSXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfUXVpdFxmUFxmUiwgXGZJXGZCU0RMX0luaXRcZlBcZlIsIFxmSVxmQlNETF9Jbml0U3ViU3lzdGVtXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1JXRnJvbUZpbGUuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1JXRnJvbUZpbGUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWE2OGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUldGcm9tRmlsZS4zCkBAIC0wLDAgKzEsMTggQEAKKy5USCAiU0RMX0Z1bmN0aW9uTmFtZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX0Z1bmN0aW9uTmFtZSBcLSBTaG9ydCBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQnJldHVybiB0eXBlXGZCU0RMX0Z1bmN0aW9uTmFtZVxmUFxmUihcZkJwYXJhbWV0ZXJcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorRnVsbCBkZXNjcmlwdGlvbgorLlNIICJFWEFNUExFUyIKKy5QUAorZXhhbXBsZXMgaGVyZQorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJU0RMX0Fub3RoZXJGdW5jdGlvblxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9SZWN0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9SZWN0LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiMjI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1JlY3QuMwpAQCAtMCwwICsxLDI2IEBACisuVEggIlNETF9SZWN0IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfUmVjdCBcLSBEZWZpbmVzIGEgcmVjdGFuZ3VsYXIgYXJlYQorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBTaW50MTYgeCwgeTsKKyAgVWludDE2IHcsIGg7Cit9IFNETF9SZWN0O1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQngsIHlcZlIKK1Bvc2l0aW9uIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisuVFAgMjAKK1xmQncsIGhcZlIKK1RoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0EgXGZCU0RMX1JlY3RcZlIgZGVmaW5lcyBhIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzXCYuIEl0IGlzIHVzZWQgYnkgXGZJXGZCU0RMX0JsaXRTdXJmYWNlXGZQXGZSIHRvIGRlZmluZSBibGl0dGluZyByZWdpb25zIGFuZCBieSBzZXZlcmFsIG90aGVyIHZpZGVvIGZ1bmN0aW9uc1wmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0JsaXRTdXJmYWNlXGZQXGZSLCBcZklcZkJTRExfVXBkYXRlUmVjdFxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9SZW1vdmVUaW1lci4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUmVtb3ZlVGltZXIuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjAzYzZmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUmVtb3ZlVGltZXIuMwpAQCAtMCwwICsxLDI1IEBACisuVEggIlNETF9SZW1vdmVUaW1lciIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1JlbW92ZVRpbWVyIFwtIFJlbW92ZSBhIHRpbWVyIHdoaWNoIHdhcyBhZGRlZCB3aXRoIFxmSVNETF9BZGRUaW1lclxmUlwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQlNETF9ib29sIFxmQlNETF9SZW1vdmVUaW1lclxmUFxmUihcZkJTRExfVGltZXJJRCBpZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitSZW1vdmVzIGEgdGltZXIgY2FsbGJhY2sgcHJldmlvdXNseSBhZGRlZCB3aXRoIFxmSVNETF9BZGRUaW1lclxmUlwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgc3VjY2Vzc1wmLgorLlNIICJFWEFNUExFUyIKKy5QUAorLlBQCisubmYKK1xmKENXU0RMX1JlbW92ZVRpbWVyKG15X3RpbWVyX2lkKTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQWRkVGltZXJcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfUmVzaXplRXZlbnQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1Jlc2l6ZUV2ZW50LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYTVlMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1Jlc2l6ZUV2ZW50LjMKQEAgLTAsMCArMSwyOCBAQAorLlRIICJTRExfUmVzaXplRXZlbnQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9SZXNpemVFdmVudCBcLSBXaW5kb3cgcmVzaXplIGV2ZW50IHN0cnVjdHVyZQorLlNIICJTVFJVQ1RVUkUgREVGSU5JVElPTiIKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgc3RydWN0eworICBVaW50OCB0eXBlOworICBpbnQgdywgaDsKK30gU0RMX1Jlc2l6ZUV2ZW50O1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQnR5cGVcZlIKK1xmQlNETF9WSURFT1JFU0laRVxmUAorLlRQIDIwCitcZkJ3XGZSLCBcZkJoXGZSCitOZXcgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgd2luZG93CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJTRExfUmVzaXplRXZlbnRcZlIgaXMgYSBtZW1iZXIgb2YgdGhlIFxmSVxmQlNETF9FdmVudFxmUlxmUiB1bmlvbiBhbmQgaXMgdXNlZCB3aGVuIGFuIGV2ZW50IG9mIHR5cGUgXGZCU0RMX1ZJREVPUkVTSVpFXGZQIGlzIHJlcG9ydGVkXCYuCisuUFAKK1doZW4gXGZCU0RMX1JFU0laQUJMRVxmUCBpcyBwYXNzZWQgYXMgYSBcZkJmbGFnXGZSIHRvIFxmSVxmQlNETF9TZXRWaWRlb01vZGVcZlBcZlIgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byByZXNpemUgdGhlIGFwcGxpY2F0aW9ucyB3aW5kb3dcJi4gV2hlbiB0aGUgd2luZG93IGlzIHJlc2l6ZWQgYW4gXGZCU0RMX1ZJREVPUkVTSVpFXGZQIGlzIHJlcG9ydCwgd2l0aCB0aGUgbmV3IHdpbmRvdyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyBzdG9yZWQgaW4gXGZCd1xmUiBhbmQgXGZCaFxmUiwgcmVzcGVjdGl2ZWx5XCYuIFdoZW4gYW4gXGZCU0RMX1ZJREVPUkVTSVpFXGZQIGlzIHJlY2VpdmVkIHRoZSB3aW5kb3cgc2hvdWxkIGJlIHJlc2l6ZWQgdG8gdGhlIG5ldyBkaW1lbnNpb25zIHVzaW5nIFxmSVxmQlNETF9TZXRWaWRlb01vZGVcZlBcZlJcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9FdmVudFxmUlxmUiwgXGZJXGZCU0RMX1NldFZpZGVvTW9kZVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU5CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TYXZlQk1QLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TYXZlQk1QLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlMDBkZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NhdmVCTVAuMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9TYXZlQk1QIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfU2F2ZUJNUCBcLSBTYXZlIGFuIFNETF9TdXJmYWNlIGFzIGEgV2luZG93cyBCTVAgZmlsZVwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfU2F2ZUJNUFxmUFxmUihcZkJTRExfU3VyZmFjZSAqc3VyZmFjZSwgY29uc3QgY2hhciAqZmlsZVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitTYXZlcyB0aGUgXGZCU0RMX1N1cmZhY2VcZlIgXGZCc3VyZmFjZVxmUiBhcyBhIFdpbmRvd3MgQk1QIGZpbGUgbmFtZWQgXGZCZmlsZVxmUlwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgXGZCMFxmUiBpZiBzdWNjZXNzZnVsIG9yIFxmQi0xXGZSIGlmIHRoZXJlIHdhcyBhbiBlcnJvclwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0xvYWRCTVBcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2VtUG9zdC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2VtUG9zdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODdkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZW1Qb3N0LjMKQEAgLTAsMCArMSwyOCBAQAorLlRIICJTRExfU2VtUG9zdCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1NlbVBvc3QgXC0gVW5sb2NrIGEgc2VtYXBob3JlXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9TZW1Qb3N0XGZQXGZSKFxmQlNETF9zZW0gKnNlbVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJTRExfU2VtUG9zdFxmUCB1bmxvY2tzIHRoZSBzZW1hcGhvcmUgcG9pbnRlZCB0byBieSBcZkJzZW1cZlIgYW5kIGF0b21pY2FsbHkgaW5jcmVtZW50cyB0aGUgc2VtYXBob3JlcyB2YWx1ZVwmLiBUaHJlYWRzIHRoYXQgd2VyZSBibG9ja2luZyBvbiB0aGUgc2VtYXBob3JlIG1heSBiZSBzY2hlZHVsZWQgYWZ0ZXIgdGhpcyBjYWxsIHN1Y2NlZWRzXCYuCisuUFAKK1xmQlNETF9TZW1Qb3N0XGZQIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYSBzZW1hcGhvcmUgaXMgbG9ja2VkIGJ5IGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIFxmSVNETF9TZW1XYWl0XGZSLCBcZklTRExfU2VtVHJ5V2FpdFxmUiBvciBcZklTRExfU2VtV2FpdFRpbWVvdXRcZlJcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIFxmQjBcZlIgaWYgc3VjY2Vzc2Z1bCBvciBcZkItMVxmUiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgKGxlYXZpbmcgdGhlIHNlbWFwaG9yZSB1bmNoYW5nZWQpXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisuUFAKKy5uZgorXGYoQ1dTRExfU2VtUG9zdChteV9zZW0pO1xmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVTZW1hcGhvcmVcZlBcZlIsIFxmSVxmQlNETF9EZXN0cm95U2VtYXBob3JlXGZQXGZSLCBcZklcZkJTRExfU2VtV2FpdFxmUFxmUiwgXGZJXGZCU0RMX1NlbVRyeVdhaXRcZlBcZlIsIFxmSVxmQlNETF9TZW1XYWl0VGltZW91dFxmUFxmUiwgXGZJXGZCU0RMX1NlbVZhbHVlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NlbVRyeVdhaXQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NlbVRyeVdhaXQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU5YWZmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2VtVHJ5V2FpdC4zCkBAIC0wLDAgKzEsNDEgQEAKKy5USCAiU0RMX1NlbVRyeVdhaXQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9TZW1UcnlXYWl0IFwtIEF0dGVtcHQgdG8gbG9jayBhIHNlbWFwaG9yZSBidXQgZG9uXCYndCBzdXNwZW5kIHRoZSB0aHJlYWRcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorI2luY2x1ZGUgIlNETF90aHJlYWRcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX1NlbVRyeVdhaXRcZlBcZlIoXGZCU0RMX3NlbSAqc2VtXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9TZW1UcnlXYWl0XGZQIGlzIGEgbm9uLWJsb2NraW5nIHZhcmllbnQgb2YgXGZJXGZCU0RMX1NlbVdhaXRcZlBcZlJcJi4gSWYgdGhlIHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUgcG9pbnRlZCB0byBieSBcZkJzZW1cZlIgaXMgcG9zaXRpdmUgaXQgd2lsbCBhdG9taWNhbGx5IGRlY3JlbWVudCB0aGUgc2VtYXBob3JlIHZhbHVlIGFuZCByZXR1cm4gMCwgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIFxmQlNETF9NVVRFWF9USU1FT1VUXGZSIGluc3RlYWQgb2Ygc3VzcGVuZGluZyB0aGUgdGhyZWFkXCYuCisuUFAKK0FmdGVyIFxmQlNETF9TZW1UcnlXYWl0XGZQIGlzIHN1Y2Nlc3NmdWwsIHRoZSBzZW1hcGhvcmUgY2FuIGJlIHJlbGVhc2VkIGFuZCBpdHMgY291bnQgYXRvbWljYWxseSBpbmNyZW1lbnRlZCBieSBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBcZklTRExfU2VtUG9zdFxmUlwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgXGZCMFxmUiBpZiB0aGUgc2VtYXBob3JlIHdhcyBzdWNjZXNzZnVsbHkgbG9ja2VkIG9yIGVpdGhlciBcZkJTRExfTVVURVhfVElNRU9VVFxmUiBvciBcZkItMVxmUiBpZiB0aGUgdGhyZWFkIHdvdWxkIGhhdmUgc3VzcGVuZGVkIG9yIHRoZXJlIHdhcyBhbiBlcnJvciwgcmVzcGVjdGl2bHlcJi4KKy5QUAorSWYgdGhlIHNlbWFwaG9yZSB3YXMgbm90IHN1Y2Nlc3NmdWxseSBsb2NrZWQsIHRoZSBzZW1hcGhvcmUgd2lsbCBiZSB1bmNoYW5nZWRcJi4KKy5TSCAiRVhBTVBMRVMiCisuUFAKKy5QUAorLm5mCitcZihDV3JlcyA9IFNETF9TZW1UcnlXYWl0KG15X3NlbSk7CisKK2lmIChyZXMgPT0gU0RMX01VVEVYX1RJTUVPVVQpIHsKKyAgICAgICAgcmV0dXJuIFRSWV9BR0FJTjsKK30KK2lmIChyZXMgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIFdBSVRfRVJST1I7Cit9CisKK1wmLlwmLlwmLgorCitTRExfU2VtUG9zdChteV9zZW0pO1xmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVTZW1hcGhvcmVcZlBcZlIsIFxmSVxmQlNETF9EZXN0cm95U2VtYXBob3JlXGZQXGZSLCBcZklcZkJTRExfU2VtV2FpdFxmUFxmUiwgXGZJXGZCU0RMX1NlbVdhaXRUaW1lb3V0XGZQXGZSLCBcZklcZkJTRExfU2VtUG9zdFxmUFxmUiwgXGZJXGZCU0RMX1NlbVZhbHVlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NlbVZhbHVlLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZW1WYWx1ZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDMxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZW1WYWx1ZS4zCkBAIC0wLDAgKzEsMjYgQEAKKy5USCAiU0RMX1NlbVZhbHVlIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfU2VtVmFsdWUgXC0gUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgc2VtYXBob3JlXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKyNpbmNsdWRlICJTREwvU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQlVpbnQzMiBcZkJTRExfU2VtVmFsdWVcZlBcZlIoXGZCU0RMX3NlbSAqc2VtXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9TZW1WYWx1ZSgpXGZQIHJldHVybnMgdGhlIGN1cnJlbnQgc2VtYXBob3JlIHZhbHVlIGZyb20gdGhlIHNlbWFwaG9yZSBwb2ludGVkIHRvIGJ5IFxmQnNlbVxmUlwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VtYXBob3JlXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisuUFAKKy5uZgorXGYoQ1cgIHNlbV92YWx1ZSA9IFNETF9TZW1WYWx1ZShteV9zZW0pO1xmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVTZW1hcGhvcmVcZlBcZlIsIFxmSVxmQlNETF9EZXN0cm95U2VtYXBob3JlXGZQXGZSLCBcZklcZkJTRExfU2VtV2FpdFxmUFxmUiwgXGZJXGZCU0RMX1NlbVRyeVdhaXRcZlBcZlIsIFxmSVxmQlNETF9TZW1XYWl0VGltZW91dFxmUFxmUiwgXGZJXGZCU0RMX1NlbVBvc3RcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2VtV2FpdC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2VtV2FpdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YmJhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZW1XYWl0LjMKQEAgLTAsMCArMSwzNCBAQAorLlRIICJTRExfU2VtV2FpdCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1NlbVdhaXQgXC0gTG9jayBhIHNlbWFwaG9yZSBhbmQgc3VzcGVuZCB0aGUgdGhyZWFkIGlmIHRoZSBzZW1hcGhvcmUgdmFsdWUgaXMgemVyb1wmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfU2VtV2FpdFxmUFxmUihcZkJTRExfc2VtICpzZW1cZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX1NlbVdhaXQoKVxmUCBzdXNwZW5kcyB0aGUgY2FsbGluZyB0aHJlYWQgdW50aWwgZWl0aGVyIHRoZSBzZW1hcGhvcmUgcG9pbnRlZCB0byBieSBcZkJzZW1cZlIgaGFzIGEgcG9zaXRpdmUgdmFsdWUsIHRoZSBjYWxsIGlzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIG9yIGVycm9yXCYuIElmIHRoZSBjYWxsIGlzIHN1Y2Nlc3NmdWwgaXQgd2lsbCBhdG9taWNhbGx5IGRlY3JlbWVudCB0aGUgc2VtYXBob3JlIHZhbHVlXCYuCisuUFAKK0FmdGVyIFxmQlNETF9TZW1XYWl0KClcZlAgaXMgc3VjY2Vzc2Z1bCwgdGhlIHNlbWFwaG9yZSBjYW4gYmUgcmVsZWFzZWQgYW5kIGl0cyBjb3VudCBhdG9taWNhbGx5IGluY3JlbWVudGVkIGJ5IGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIFxmSVNETF9TZW1Qb3N0XGZSXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyBcZkIwXGZSIGlmIHN1Y2Nlc3NmdWwgb3IgXGZCLTFcZlIgaWYgdGhlcmUgd2FzIGFuIGVycm9yIChsZWF2aW5nIHRoZSBzZW1hcGhvcmUgdW5jaGFuZ2VkKVwmLgorLlNIICJFWEFNUExFUyIKKy5QUAorLlBQCisubmYKK1xmKENXaWYgKFNETF9TZW1XYWl0KG15X3NlbSkgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIFdBSVRfRkFJTEVEOworfQorCitcJi5cJi5cJi4KKworU0RMX1NlbVBvc3QobXlfc2VtKTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQ3JlYXRlU2VtYXBob3JlXGZQXGZSLCBcZklcZkJTRExfRGVzdHJveVNlbWFwaG9yZVxmUFxmUiwgXGZJXGZCU0RMX1NlbVRyeVdhaXRcZlBcZlIsIFxmSVxmQlNETF9TZW1XYWl0VGltZW91dFxmUFxmUiwgXGZJXGZCU0RMX1NlbVBvc3RcZlBcZlIsIFxmSVxmQlNETF9TZW1WYWx1ZVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZW1XYWl0VGltZW91dC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2VtV2FpdFRpbWVvdXQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWZkMWNiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2VtV2FpdFRpbWVvdXQuMwpAQCAtMCwwICsxLDQxIEBACisuVEggIlNETF9TZW1XYWl0VGltZW91dCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1NlbVdhaXRUaW1lb3V0IFwtIExvY2sgYSBzZW1hcGhvcmUsIGJ1dCBvbmx5IHdhaXQgdXAgdG8gYSBzcGVjaWZpZWQgbWF4aW11bSB0aW1lXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9TZW1XYWl0VGltZW91dFxmUFxmUihcZkJTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1xmQlNETF9TZW1XYWl0VGltZW91dCgpXGZQIGlzIGEgdmFyaWVudCBvZiBcZklTRExfU2VtV2FpdFxmUiB3aXRoIGEgbWF4aW11bSB0aW1lb3V0IHZhbHVlXCYuIElmIHRoZSB2YWx1ZSBvZiB0aGUgc2VtYXBob3JlIHBvaW50ZWQgdG8gYnkgXGZCc2VtXGZSIGlzIHBvc2l0aXZlIChncmVhdGVyIHRoYW4gemVybykgaXQgd2lsbCBhdG9taWNhbGx5IGRlY3JlbWVudCB0aGUgc2VtYXBob3JlIHZhbHVlIGFuZCByZXR1cm4gMCwgb3RoZXJ3aXNlIGl0IHdpbGwgd2FpdCB1cCB0byBcZkJ0aW1lb3V0XGZSIG1pbGxpc2Vjb25kcyB0cnlpbmcgdG8gbG9jayB0aGUgc2VtYXBob3JlXCYuIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgYXZvaWRlZCBpZiBwb3NzaWJsZSBzaW5jZSBvbiBzb21lIHBsYXRmb3JtcyBpdCBpcyBpbXBsZW1lbnRlZCBieSBwb2xsaW5nIHRoZSBzZW1hcGhvcmUgZXZlcnkgbWlsbGlzZWNvbmQgaW4gYSBidXN5IGxvb3BcJi4KKy5QUAorQWZ0ZXIgXGZCU0RMX1NlbVdhaXRUaW1lb3V0KClcZlAgaXMgc3VjY2Vzc2Z1bCwgdGhlIHNlbWFwaG9yZSBjYW4gYmUgcmVsZWFzZWQgYW5kIGl0cyBjb3VudCBhdG9taWNhbGx5IGluY3JlbWVudGVkIGJ5IGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIFxmSVNETF9TZW1Qb3N0XGZSXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorUmV0dXJucyBcZkIwXGZSIGlmIHRoZSBzZW1hcGhvcmUgd2FzIHN1Y2Nlc3NmdWxseSBsb2NrZWQgb3IgZWl0aGVyIFxmQlNETF9NVVRFWF9USU1FT1VUXGZSIG9yIFxmQi0xXGZSIGlmIHRoZSB0aW1lb3V0IHBlcmlvZCB3YXMgZXhjZWVkZWQgb3IgdGhlcmUgd2FzIGFuIGVycm9yLCByZXNwZWN0aXZseVwmLgorLlBQCitJZiB0aGUgc2VtYXBob3JlIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGxvY2tlZCwgdGhlIHNlbWFwaG9yZSB3aWxsIGJlIHVuY2hhbmdlZFwmLgorLlNIICJFWEFNUExFUyIKKy5QUAorLlBQCisubmYKK1xmKENXcmVzID0gU0RMX1NlbVdhaXRUaW1lb3V0KG15X3NlbSwgV0FJVF9USU1FT1VUX01JTExJU0VDKTsKKworaWYgKHJlcyA9PSBTRExfTVVURVhfVElNRU9VVCkgeworICAgICAgICByZXR1cm4gVFJZX0FHQUlOOworfQoraWYgKHJlcyA9PSAtMSkgeworICAgICAgICByZXR1cm4gV0FJVF9FUlJPUjsKK30KKworXCYuXCYuXCYuCisKK1NETF9TZW1Qb3N0KG15X3NlbSk7XGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NyZWF0ZVNlbWFwaG9yZVxmUFxmUiwgXGZJXGZCU0RMX0Rlc3Ryb3lTZW1hcGhvcmVcZlBcZlIsIFxmSVxmQlNETF9TZW1XYWl0XGZQXGZSLCBcZklcZkJTRExfU2VtVHJ5V2FpdFxmUFxmUiwgXGZJXGZCU0RMX1NlbVBvc3RcZlBcZlIsIFxmSVxmQlNETF9TZW1WYWx1ZVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRBbHBoYS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0QWxwaGEuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODJlY2RlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0QWxwaGEuMwpAQCAtMCwwICsxLDY2IEBACisuVEggIlNETF9TZXRBbHBoYSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1NldEFscGhhIFwtIEFkanVzdCB0aGUgYWxwaGEgcHJvcGVydGllcyBvZiBhIHN1cmZhY2UKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX1NldEFscGhhXGZQXGZSKFxmQlNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIgZmxhZywgVWludDggYWxwaGFcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK1RoaXMgZnVuY3Rpb24gYW5kIHRoZSBzZW1hbnRpY3Mgb2YgU0RMIGFscGhhIGJsZW5kaW5nIGhhdmUgY2hhbmdlZCBzaW5jZSB2ZXJzaW9uIDFcJi4xXCYuNFwmLiBVcCB1bnRpbCB2ZXJzaW9uIDFcJi4xXCYuNSwgYW4gYWxwaGEgdmFsdWUgb2YgMCB3YXMgY29uc2lkZXJlZCBvcGFxdWUgYW5kIGEgdmFsdWUgb2YgMjU1IHdhcyBjb25zaWRlcmVkIHRyYW5zcGFyZW50XCYuIFRoaXMgaGFzIG5vdyBiZWVuIGludmVydGVkOiAwIChcZkJTRExfQUxQSEFfVFJBTlNQQVJFTlRcZlApIGlzIG5vdyBjb25zaWRlcmVkIHRyYW5zcGFyZW50IGFuZCAyNTUgKFxmQlNETF9BTFBIQV9PUEFRVUVcZlApIGlzIG5vdyBjb25zaWRlcmVkIG9wYXF1ZVwmLgorLlJFCisuUFAKK1xmQlNETF9TZXRBbHBoYVxmUCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBwZXItc3VyZmFjZSBhbHBoYSB2YWx1ZSBhbmQvb3IgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBhbHBoYSBibGVuZGluZ1wmLgorLlBQCitUaGVcZkJzdXJmYWNlXGZSIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hpY2ggc3VyZmFjZSB3aG9zZSBhbHBoYSBhdHRyaWJ1dGVzIHlvdSB3aXNoIHRvIGFkanVzdFwmLiBcZkJmbGFnc1xmUiBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhbHBoYSBibGVuZGluZyBzaG91bGQgYmUgdXNlZCAoXGZCU0RMX1NSQ0FMUEhBXGZQKSBhbmQgd2hldGhlciB0aGUgc3VyZmFjZSBzaG91bGQgdXNlIFJMRSBhY2NlbGVyYXRpb24gZm9yIGJsaXR0aW5nIChcZkJTRExfUkxFQUNDRUxcZlApXCYuIFxmQmZsYWdzXGZSIGNhbiBiZSBhbiBPUlwmJ2QgY29tYmluYXRpb24gb2YgdGhlc2UgdHdvIG9wdGlvbnMsIG9uZSBvZiB0aGVzZSBvcHRpb25zIG9yIDBcJi4gSWYgXGZCU0RMX1NSQ0FMUEhBXGZQIGlzIG5vdCBwYXNzZWQgYXMgYSBmbGFnIHRoZW4gYWxsIGFscGhhIGluZm9ybWF0aW9uIGlzIGlnbm9yZWQgd2hlbiBibGl0dGluZyB0aGUgc3VyZmFjZVwmLiBUaGUgXGZCYWxwaGFcZlIgcGFyYW1ldGVyIGlzIHRoZSBwZXItc3VyZmFjZSBhbHBoYSB2YWx1ZTsgYSBzdXJmYWNlIG5lZWQgbm90IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCB0byB1c2UgcGVyLXN1cmZhY2UgYWxwaGEgYW5kIGJsaXR0aW5nIGNhbiBzdGlsbCBiZSBhY2NlbGVyYXRlZCB3aXRoIFxmQlNETF9STEVBQ0NFTFxmUFwmLgorLlBQCisuUlMKK1xmQk5vdGU6ICAKKy5QUAorVGhlIHBlci1zdXJmYWNlIGFscGhhIHZhbHVlIG9mIDEyOCBpcyBjb25zaWRlcmVkIGEgc3BlY2lhbCBjYXNlIGFuZCBpcyBvcHRpbWlzZWQsIHNvIGl0XCYncyBtdWNoIGZhc3RlciB0aGFuIG90aGVyIHBlci1zdXJmYWNlIHZhbHVlc1wmLgorLlJFCisuUFAKK0FscGhhIGVmZmVjdHMgc3VyZmFjZSBibGl0dGluZyBpbiB0aGUgZm9sbG93aW5nIHdheXM6CisuVFAgMjAKK1JHQkEtPlJHQiB3aXRoIFxmQlNETF9TUkNBTFBIQVxmUAorVGhlIHNvdXJjZSBpcyBhbHBoYS1ibGVuZGVkIHdpdGggdGhlIGRlc3RpbmF0aW9uLCB1c2luZyB0aGUgYWxwaGEgY2hhbm5lbFwmLiBcZkJTRExfU1JDQ09MT1JLRVlcZlAgYW5kIHRoZSBwZXItc3VyZmFjZSBhbHBoYSBhcmUgaWdub3JlZFwmLgorLlRQIDIwCitSR0JBLT5SR0Igd2l0aG91dCBcZkJTRExfU1JDQUxQSEFcZlAKK1RoZSBSR0IgZGF0YSBpcyBjb3BpZWQgZnJvbSB0aGUgc291cmNlXCYuIFRoZSBzb3VyY2UgYWxwaGEgY2hhbm5lbCBhbmQgdGhlIHBlci1zdXJmYWNlIGFscGhhIHZhbHVlIGFyZSBpZ25vcmVkXCYuCisuVFAgMjAKK1JHQi0+UkdCQSB3aXRoIFxmQlNETF9TUkNBTFBIQVxmUAorVGhlIHNvdXJjZSBpcyBhbHBoYS1ibGVuZGVkIHdpdGggdGhlIGRlc3RpbmF0aW9uIHVzaW5nIHRoZSBwZXItc3VyZmFjZSBhbHBoYSB2YWx1ZVwmLiBJZiBcZkJTRExfU1JDQ09MT1JLRVlcZlAgaXMgc2V0LCBvbmx5IHRoZSBwaXhlbHMgbm90IG1hdGNoaW5nIHRoZSBjb2xvcmtleSB2YWx1ZSBhcmUgY29waWVkXCYuIFRoZSBhbHBoYSBjaGFubmVsIG9mIHRoZSBjb3BpZWQgcGl4ZWxzIGlzIHNldCB0byBvcGFxdWVcJi4KKy5UUCAyMAorUkdCLT5SR0JBIHdpdGhvdXQgXGZCU0RMX1NSQ0FMUEhBXGZQCitUaGUgUkdCIGRhdGEgaXMgY29waWVkIGZyb20gdGhlIHNvdXJjZSBhbmQgdGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb3BpZWQgcGl4ZWxzIGlzIHNldCB0byBvcGFxdWVcJi4gSWYgXGZCU0RMX1NSQ0NPTE9SS0VZXGZQIGlzIHNldCwgb25seSB0aGUgcGl4ZWxzIG5vdCBtYXRjaGluZyB0aGUgY29sb3JrZXkgdmFsdWUgYXJlIGNvcGllZFwmLiAKKy5UUCAyMAorUkdCQS0+UkdCQSB3aXRoIFxmQlNETF9TUkNBTFBIQVxmUAorVGhlIHNvdXJjZSBpcyBhbHBoYS1ibGVuZGVkIHdpdGggdGhlIGRlc3RpbmF0aW9uIHVzaW5nIHRoZSBzb3VyY2UgYWxwaGEgY2hhbm5lbFwmLiBUaGUgYWxwaGEgY2hhbm5lbCBpbiB0aGUgZGVzdGluYXRpb24gc3VyZmFjZSBpcyBsZWZ0IHVudG91Y2hlZFwmLiBcZkJTRExfU1JDQ09MT1JLRVlcZlAgaXMgaWdub3JlZFwmLgorLlRQIDIwCitSR0JBLT5SR0JBIHdpdGhvdXQgXGZCU0RMX1NSQ0FMUEhBXGZQCitUaGUgUkdCQSBkYXRhIGlzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gc3VyZmFjZVwmLiBJZiBcZkJTRExfU1JDQ09MT1JLRVlcZlAgaXMgc2V0LCBvbmx5IHRoZSBwaXhlbHMgbm90IG1hdGNoaW5nIHRoZSBjb2xvcmtleSB2YWx1ZSBhcmUgY29waWVkXCYuCisuVFAgMjAKK1JHQi0+UkdCIHdpdGggXGZCU0RMX1NSQ0FMUEhBXGZQCitUaGUgc291cmNlIGlzIGFscGhhLWJsZW5kZWQgd2l0aCB0aGUgZGVzdGluYXRpb24gdXNpbmcgdGhlIHBlci1zdXJmYWNlIGFscGhhIHZhbHVlXCYuIElmIFxmQlNETF9TUkNDT0xPUktFWVxmUCBpcyBzZXQsIG9ubHkgdGhlIHBpeGVscyBub3QgbWF0Y2hpbmcgdGhlIGNvbG9ya2V5IHZhbHVlIGFyZSBjb3BpZWRcJi4KKy5UUCAyMAorUkdCLT5SR0Igd2l0aG91dCBcZkJTRExfU1JDQUxQSEFcZlAKK1RoZSBSR0IgZGF0YSBpcyBjb3BpZWQgZnJvbSB0aGUgc291cmNlXCYuIElmIFxmQlNETF9TUkNDT0xPUktFWVxmUCBpcyBzZXQsIG9ubHkgdGhlIHBpeGVscyBub3QgbWF0Y2hpbmcgdGhlIGNvbG9ya2V5IHZhbHVlIGFyZSBjb3BpZWRcJi4KKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKKyBOb3RlIHRoYXQgUkdCQS0+UkdCQSBibGl0cyAod2l0aCBTRExfU1JDQUxQSEEgc2V0KSBrZWVwIHRoZSBhbHBoYSBvZiB0aGUgZGVzdGluYXRpb24gc3VyZmFjZVwmLiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbm5vdCBjb21wb3NlIHR3byBhcmJpdHJhcnkgUkdCQSBzdXJmYWNlcyB0aGlzIHdheSBhbmQgZ2V0IHRoZSByZXN1bHQgeW91IHdvdWxkIGV4cGVjdCBmcm9tICJvdmVybGF5aW5nIiB0aGVtOyB0aGUgZGVzdGluYXRpb24gYWxwaGEgd2lsbCB3b3JrIGFzIGEgbWFza1wmLgorLlBQCitBbHNvIG5vdGUgdGhhdCBwZXItcGl4ZWwgYW5kIHBlci1zdXJmYWNlIGFscGhhIGNhbm5vdCBiZSBjb21iaW5lZDsgdGhlIHBlci1waXhlbCBhbHBoYSBpcyBhbHdheXMgdXNlZCBpZiBhdmFpbGFibGUKKy5SRQorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyBcZkIwXGZSLCBvciBcZkItMVxmUiBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9NYXBSR0JBXGZQXGZSLCBcZklcZkJTRExfR2V0UkdCQVxmUFxmUiwgXGZJXGZCU0RMX0Rpc3BsYXlGb3JtYXRBbHBoYVxmUFxmUiwgXGZJXGZCU0RMX0JsaXRTdXJmYWNlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NldENsaXBSZWN0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRDbGlwUmVjdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYmRlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRDbGlwUmVjdC4zCkBAIC0wLDAgKzEsMTkgQEAKKy5USCAiU0RMX1NldENsaXBSZWN0IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfU2V0Q2xpcFJlY3QgXC0gU2V0cyB0aGUgY2xpcHBpbmcgcmVjdGFuZ2xlIGZvciBhIHN1cmZhY2VcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9TZXRDbGlwUmVjdFxmUFxmUihcZkJTRExfU3VyZmFjZSAqc3VyZmFjZSwgU0RMX1JlY3QgKnJlY3RcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorU2V0cyB0aGUgY2xpcHBpbmcgcmVjdGFuZ2xlIGZvciBhIHN1cmZhY2VcJi4gV2hlbiB0aGlzIHN1cmZhY2UgaXMgdGhlIGRlc3RpbmF0aW9uIG9mIGEgYmxpdCwgb25seSB0aGUgYXJlYSB3aXRoaW4gdGhlIGNsaXAgcmVjdGFuZ2xlIHdpbGwgYmUgZHJhd24gaW50b1wmLgorLlBQCitUaGUgcmVjdGFuZ2xlIHBvaW50ZWQgdG8gYnkgXGZCcmVjdFxmUiB3aWxsIGJlIGNsaXBwZWQgdG8gdGhlIGVkZ2VzIG9mIHRoZSBzdXJmYWNlIHNvIHRoYXQgdGhlIGNsaXAgcmVjdGFuZ2xlIGZvciBhIHN1cmZhY2UgY2FuIG5ldmVyIGZhbGwgb3V0c2lkZSB0aGUgZWRnZXMgb2YgdGhlIHN1cmZhY2VcJi4KKy5QUAorSWYgXGZCcmVjdFxmUiBpcyBcZkJOVUxMXGZQIHRoZSBjbGlwcGluZyByZWN0YW5nbGUgd2lsbCBiZSBzZXQgdG8gdGhlIGZ1bGwgc2l6ZSBvZiB0aGUgc3VyZmFjZVwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0dldENsaXBSZWN0XGZQXGZSLCBcZklcZkJTRExfQmxpdFN1cmZhY2VcZlBcZlIsIFxmSVxmQlNETF9TdXJmYWNlXGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NldENvbG9yS2V5LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRDb2xvcktleS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Zjg4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRDb2xvcktleS4zCkBAIC0wLDAgKzEsMjYgQEAKKy5USCAiU0RMX1NldENvbG9yS2V5IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfU2V0Q29sb3JLZXkgXC0gU2V0cyB0aGUgY29sb3Iga2V5ICh0cmFuc3BhcmVudCBwaXhlbCkgaW4gYSBibGl0dGFibGUgc3VyZmFjZSBhbmQgUkxFIGFjY2VsZXJhdGlvblwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfU2V0Q29sb3JLZXlcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBmbGFnLCBVaW50MzIga2V5XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKKyBTZXRzIHRoZSBjb2xvciBrZXkgKHRyYW5zcGFyZW50IHBpeGVsKSBpbiBhIGJsaXR0YWJsZSBzdXJmYWNlIGFuZCBlbmFibGVzIG9yIGRpc2FibGVzIFJMRSBibGl0IGFjY2VsZXJhdGlvblwmLgorLlBQCitSTEUgYWNjZWxlcmF0aW9uIGNhbiBzdWJzdGFudGlhbGx5IHNwZWVkIHVwIGJsaXR0aW5nIG9mIGltYWdlcyB3aXRoIGxhcmdlIGhvcml6b250YWwgcnVucyBvZiB0cmFuc3BhcmVudCBwaXhlbHMgKGlcJi5lXCYuLCBwaXhlbHMgdGhhdCBtYXRjaCB0aGUgXGZCa2V5XGZSIHZhbHVlKVwmLiBUaGUgXGZCa2V5XGZSIG11c3QgYmUgb2YgdGhlIHNhbWUgcGl4ZWwgZm9ybWF0IGFzIHRoZSBcZkJzdXJmYWNlXGZSLCBcZklcZkJTRExfTWFwUkdCXGZQXGZSIGlzIG9mdGVuIHVzZWZ1bCBmb3Igb2J0YWluaW5nIGFuIGFjY2VwdGFibGUgdmFsdWVcJi4KKy5QUAorSWYgXGZCZmxhZ1xmUiBpcyBcZkJTRExfU1JDQ09MT1JLRVlcZlAgdGhlbiBcZkJrZXlcZlIgaXMgdGhlIHRyYW5zcGFyZW50IHBpeGVsIHZhbHVlIGluIHRoZSBzb3VyY2UgaW1hZ2Ugb2YgYSBibGl0XCYuCisuUFAKK0lmIFxmQmZsYWdcZlIgaXMgT1JcJidkIHdpdGggXGZCU0RMX1JMRUFDQ0VMXGZQIHRoZW4gdGhlIHN1cmZhY2Ugd2lsbCBiZSBkcmF3IHVzaW5nIFJMRSBhY2NlbGVyYXRpb24gd2hlbiBkcmF3biB3aXRoIFxmSVNETF9CbGl0U3VyZmFjZVxmUlwmLiBUaGUgc3VyZmFjZSB3aWxsIGFjdHVhbGx5IGJlIGVuY29kZWQgZm9yIFJMRSBhY2NlbGVyYXRpb24gdGhlIGZpcnN0IHRpbWUgXGZJU0RMX0JsaXRTdXJmYWNlXGZSIG9yIFxmSVNETF9EaXNwbGF5Rm9ybWF0XGZSIGlzIGNhbGxlZCBvbiB0aGUgc3VyZmFjZVwmLgorLlBQCitJZiBcZkJmbGFnXGZSIGlzIDAsIHRoaXMgZnVuY3Rpb24gY2xlYXJzIGFueSBjdXJyZW50IGNvbG9yIGtleVwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyBcZkIwXGZSLCBvciBcZkItMVxmUiBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9CbGl0U3VyZmFjZVxmUFxmUiwgXGZJXGZCU0RMX0Rpc3BsYXlGb3JtYXRcZlBcZlIsIFxmSVxmQlNETF9NYXBSR0JcZlBcZlIsIFxmSVxmQlNETF9TZXRBbHBoYVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRDb2xvcnMuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NldENvbG9ycy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzdhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRDb2xvcnMuMwpAQCAtMCwwICsxLDU3IEBACisuVEggIlNETF9TZXRDb2xvcnMiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9TZXRDb2xvcnMgXC0gU2V0cyBhIHBvcnRpb24gb2YgdGhlIGNvbG9ybWFwIGZvciB0aGUgZ2l2ZW4gOC1iaXQgc3VyZmFjZVwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfU2V0Q29sb3JzXGZQXGZSKFxmQlNETF9TdXJmYWNlICpzdXJmYWNlLCBTRExfQ29sb3IgKmNvbG9ycywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1NldHMgYSBwb3J0aW9uIG9mIHRoZSBjb2xvcm1hcCBmb3IgdGhlIGdpdmVuIDgtYml0IHN1cmZhY2VcJi4KKy5QUAorV2hlbiBcZkJzdXJmYWNlXGZSIGlzIHRoZSBzdXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBkaXNwbGF5LCB0aGUgZGlzcGxheSBjb2xvcm1hcCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIGNvbG9yc1wmLiBJZiBcZkJTRExfSFdQQUxFVFRFXGZQIHdhcyBzZXQgaW4gXGZJU0RMX1NldFZpZGVvTW9kZVxmUiBmbGFncywgXGZCU0RMX1NldENvbG9yc1xmUCB3aWxsIGFsd2F5cyByZXR1cm4gXGZCMVxmUiwgYW5kIHRoZSBwYWxldHRlIGlzIGd1YXJhbnRlZWQgdG8gYmUgc2V0IHRoZSB3YXkgeW91IGRlc2lyZSwgZXZlbiBpZiB0aGUgd2luZG93IGNvbG9ybWFwIGhhcyB0byBiZSB3YXJwZWQgb3IgcnVuIHVuZGVyIGVtdWxhdGlvblwmLgorLlBQCitUaGUgY29sb3IgY29tcG9uZW50cyBvZiBhIFxmSVxmQlNETF9Db2xvclxmUlxmUiBzdHJ1Y3R1cmUgYXJlIDgtYml0cyBpbiBzaXplLCBnaXZpbmcgeW91IGEgdG90YWwgb2YgMjU2XjMgPTE2Nzc3MjE2IGNvbG9yc1wmLgorLlBQCitQYWxldHRpemVkICg4LWJpdCkgc2NyZWVuIHN1cmZhY2VzIHdpdGggdGhlIFxmQlNETF9IV1BBTEVUVEVcZlAgZmxhZyBoYXZlIHR3byBwYWxldHRlcywgYSBsb2dpY2FsIHBhbGV0dGUgdGhhdCBpcyB1c2VkIGZvciBtYXBwaW5nIGJsaXRzIHRvL2Zyb20gdGhlIHN1cmZhY2UgYW5kIGEgcGh5c2ljYWwgcGFsZXR0ZSAodGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgaGFyZHdhcmUgd2lsbCBtYXAgdGhlIGNvbG9ycyB0byB0aGUgZGlzcGxheSlcJi4gXGZCU0RMX1NldENvbG9yc1xmUCBtb2RpZmllcyBib3RoIHBhbGV0dGVzIChpZiBwcmVzZW50KSwgYW5kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBcZklTRExfU2V0UGFsZXR0ZVxmUiB3aXRoIHRoZSBcZkJmbGFnc1xmUiBzZXQgdG8gXGZCKFNETF9MT0dQQUwgfCBTRExfUEhZU1BBTClcZlBcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitJZiBcZkJzdXJmYWNlXGZSIGlzIG5vdCBhIHBhbGV0dGl6ZWQgc3VyZmFjZSwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIHJldHVybmluZyBcZkIwXGZSXCYuIElmIGFsbCBvZiB0aGUgY29sb3JzIHdlcmUgc2V0IGFzIHBhc3NlZCB0byBcZkJTRExfU2V0Q29sb3JzXGZQLCBpdCB3aWxsIHJldHVybiBcZkIxXGZSXCYuIElmIG5vdCBhbGwgdGhlIGNvbG9yIGVudHJpZXMgd2VyZSBzZXQgZXhhY3RseSBhcyBnaXZlbiwgaXQgd2lsbCByZXR1cm4gXGZCMFxmUiwgYW5kIHlvdSBzaG91bGQgbG9vayBhdCB0aGUgc3VyZmFjZSBwYWxldHRlIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIGNvbG9yIHBhbGV0dGVcJi4KKy5TSCAiRVhBTVBMRSIKKy5QUAorLm5mCitcZihDVy8qIENyZWF0ZSBhIGRpc3BsYXkgc3VyZmFjZSB3aXRoIGEgZ3JheXNjYWxlIHBhbGV0dGUgKi8KK1NETF9TdXJmYWNlICpzY3JlZW47CitTRExfQ29sb3IgY29sb3JzWzI1Nl07CitpbnQgaTsKK1wmLgorXCYuCitcJi4KKy8qIEZpbGwgY29sb3JzIHdpdGggY29sb3IgaW5mb3JtYXRpb24gKi8KK2ZvcihpPTA7aTwyNTY7aSsrKXsKKyAgY29sb3JzW2ldXCYucj1pOworICBjb2xvcnNbaV1cJi5nPWk7CisgIGNvbG9yc1tpXVwmLmI9aTsKK30KKworLyogQ3JlYXRlIGRpc3BsYXkgKi8KK3NjcmVlbj1TRExfU2V0VmlkZW9Nb2RlKDY0MCwgNDgwLCA4LCBTRExfSFdQQUxFVFRFKTsKK2lmKCFzY3JlZW4peworICBwcmludGYoIkNvdWxkblwmJ3Qgc2V0IHZpZGVvIG1vZGU6ICVzCisiLCBTRExfR2V0RXJyb3IoKSk7CisgIGV4aXQoLTEpOworfQorCisvKiBTZXQgcGFsZXR0ZSAqLworU0RMX1NldENvbG9ycyhzY3JlZW4sIGNvbG9ycywgMCwgMjU2KTsKK1wmLgorXCYuCitcJi4KK1wmLlxmUgorLmZpCisuUFAKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9Db2xvclxmUlxmUiBcZklcZkJTRExfU3VyZmFjZVxmUlxmUiwgXGZJXGZCU0RMX1NldFBhbGV0dGVcZlBcZlIsIFxmSVxmQlNETF9TZXRWaWRlb01vZGVcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0Q3Vyc29yLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRDdXJzb3IuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGM0Y2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0Q3Vyc29yLjMKQEAgLTAsMCArMSwxNSBAQAorLlRIICJTRExfU2V0Q3Vyc29yIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfU2V0Q3Vyc29yIFwtIFNldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBtb3VzZSBjdXJzb3JcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9TZXRDdXJzb3JcZlBcZlIoXGZCU0RMX0N1cnNvciAqY3Vyc29yXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1NldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY3Vyc29yIHRvIHRoZSBzcGVjaWZpZWQgb25lXCYuIElmIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IHZpc2libGUsIHRoZSBjaGFuZ2Ugd2lsbCBiZSBpbW1lZGlhdGVseSByZXByZXNlbnRlZCBvbiB0aGUgZGlzcGxheVwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0dldEN1cnNvclxmUFxmUiwgXGZJXGZCU0RMX0NyZWF0ZUN1cnNvclxmUFxmUiwgXGZJXGZCU0RMX1Nob3dDdXJzb3JcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0RXZlbnRGaWx0ZXIuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NldEV2ZW50RmlsdGVyLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzZWQwMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NldEV2ZW50RmlsdGVyLjMKQEAgLTAsMCArMSwzNSBAQAorLlRIICJTRExfU2V0RXZlbnRGaWx0ZXIiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMjo1OSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9TZXRFdmVudEZpbHRlciBcLSBTZXRzIHVwIGEgZmlsdGVyIHRvIHByb2Nlc3MgYWxsIGV2ZW50cyBiZWZvcmUgdGhleSBhcmUgcG9zdGVkIHRvIHRoZSBldmVudCBxdWV1ZVwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQnZvaWQgXGZCU0RMX1NldEV2ZW50RmlsdGVyXGZQXGZSKFxmQlNETF9FdmVudEZpbHRlciBmaWx0ZXJcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGEgZmlsdGVyIHRvIHByb2Nlc3MgYWxsIGV2ZW50cyBiZWZvcmUgdGhleSBhcmUgcG9zdGVkIHRvIHRoZSBldmVudCBxdWV1ZVwmLiBUaGlzIGlzIGEgdmVyeSBwb3dlcmZ1bCBhbmQgZmxleGlibGUgZmVhdHVyZVwmLiBUaGUgZmlsdGVyIGlzIHByb3RvdHlwZWQgYXM6IAorLlBQCisubmYKK1xmKENXdHlwZWRlZiBpbnQgKCpTRExfRXZlbnRGaWx0ZXIpKGNvbnN0IFNETF9FdmVudCAqZXZlbnQpO1xmUgorLmZpCisuUFAKKyBJZiB0aGUgZmlsdGVyIHJldHVybnMgXGZCMVxmUiwgdGhlbiB0aGUgZXZlbnQgd2lsbCBiZSBhZGRlZCB0byB0aGUgaW50ZXJuYWwgcXVldWVcJi4gSWYgaXQgcmV0dXJucyBcZkIwXGZSLCB0aGVuIHRoZSBldmVudCB3aWxsIGJlIGRyb3BwZWQgZnJvbSB0aGUgcXVldWVcJi4gVGhpcyBhbGxvd3Mgc2VsZWN0aXZlIGZpbHRlcmluZyBvZiBkeW5hbWljYWxseVwmLgorLlBQCitUaGVyZSBpcyBvbmUgY2F2ZWF0IHdoZW4gZGVhbGluZyB3aXRoIHRoZSBcZkJTRExfUVVJVEVWRU5UXGZQIGV2ZW50IHR5cGVcJi4gVGhlIGV2ZW50IGZpbHRlciBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSB3aW5kb3cgbWFuYWdlciBkZXNpcmVzIHRvIGNsb3NlIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3dcJi4gSWYgdGhlIGV2ZW50IGZpbHRlciByZXR1cm5zIDEsIHRoZW4gdGhlIHdpbmRvdyB3aWxsIGJlIGNsb3NlZCwgb3RoZXJ3aXNlIHRoZSB3aW5kb3cgd2lsbCByZW1haW4gb3BlbiBpZiBwb3NzaWJsZVwmLiBJZiB0aGUgcXVpdCBldmVudCBpcyBnZW5lcmF0ZWQgYnkgYW4gaW50ZXJydXB0IHNpZ25hbCwgaXQgd2lsbCBieXBhc3MgdGhlIGludGVybmFsIHF1ZXVlIGFuZCBiZSBkZWxpdmVyZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGF0IHRoZSBuZXh0IGV2ZW50IHBvbGxcJi4KKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK0V2ZW50cyBwdXNoZWQgb250byB0aGUgcXVldWUgd2l0aCBcZklcZkJTRExfUHVzaEV2ZW50XGZQXGZSIG9yIFxmSVxmQlNETF9QZWVwRXZlbnRzXGZQXGZSIGRvIG5vdCBnZXQgcGFzc2VkIHRocm91Z2ggdGhlIGV2ZW50IGZpbHRlclwmLgorLlJFCisuUFAKKy5SUworXGZCTm90ZTogIAorLlBQCitcZklCZSBDYXJlZnVsIVxmUCBUaGUgZXZlbnQgZmlsdGVyIGZ1bmN0aW9uIG1heSBydW4gaW4gYSBkaWZmZXJlbnQgdGhyZWFkIHNvIGJlIGNhcmVmdWwgd2hhdCB5b3UgZG8gd2l0aGluIGl0XCYuCisuUkUKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9FdmVudFxmUlxmUiwgXGZJXGZCU0RMX0dldEV2ZW50RmlsdGVyXGZQXGZSLCBcZklcZkJTRExfUHVzaEV2ZW50XGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjI6NTkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NldEdhbW1hLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRHYW1tYS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OTcyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRHYW1tYS4zCkBAIC0wLDAgKzEsMjIgQEAKKy5USCAiU0RMX1NldEdhbW1hIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfU2V0R2FtbWEgXC0gU2V0cyB0aGUgY29sb3IgZ2FtbWEgZnVuY3Rpb24gZm9yIHRoZSBkaXNwbGF5CisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCaW50IFxmQlNETF9TZXRHYW1tYVxmUFxmUihcZkJmbG9hdCByZWRnYW1tYSwgZmxvYXQgZ3JlZW5nYW1tYSwgZmxvYXQgYmx1ZWdhbW1hXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1NldHMgdGhlICJnYW1tYSBmdW5jdGlvbiIgZm9yIHRoZSBkaXNwbGF5IG9mIGVhY2ggY29sb3IgY29tcG9uZW50XCYuIEdhbW1hIGNvbnRyb2xzIHRoZSBicmlnaHRuZXNzL2NvbnRyYXN0IG9mIGNvbG9ycyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlblwmLiBBIGdhbW1hIHZhbHVlIG9mIDFcJi4wIGlzIGlkZW50aXR5IChpXCYuZVwmLiwgbm8gYWRqdXN0bWVudCBpcyBtYWRlKVwmLgorLlBQCitUaGlzIGZ1bmN0aW9uIGFkanVzdHMgdGhlIGdhbW1hIGJhc2VkIG9uIHRoZSAiZ2FtbWEgZnVuY3Rpb24iIHBhcmFtZXRlciwgeW91IGNhbiBkaXJlY3RseSBzcGVjaWZ5IGxvb2t1cCB0YWJsZXMgZm9yIGdhbW1hIGFkanVzdG1lbnQgd2l0aCBcZklTRExfU2V0R2FtbWFSYW1wXGZSXCYuCisuUFAKK05vdCBhbGwgZGlzcGxheSBoYXJkd2FyZSBpcyBhYmxlIHRvIGNoYW5nZSBnYW1tYVwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgLTEgb24gZXJyb3IgKG9yIGlmIGdhbW1hIGFkanVzdG1lbnQgaXMgbm90IHN1cHBvcnRlZClcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVNETF9HZXRHYW1tYVJhbXBcZlIgXGZJU0RMX1NldEdhbW1hUmFtcFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRHYW1tYVJhbXAuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1NldEdhbW1hUmFtcC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYmY5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRHYW1tYVJhbXAuMwpAQCAtMCwwICsxLDIyIEBACisuVEggIlNETF9TZXRHYW1tYVJhbXAiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9TZXRHYW1tYVJhbXAgXC0gU2V0cyB0aGUgY29sb3IgZ2FtbWEgbG9va3VwIHRhYmxlcyBmb3IgdGhlIGRpc3BsYXkKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX1NldEdhbW1hUmFtcFxmUFxmUihcZkJVaW50MTYgKnJlZHRhYmxlLCBVaW50MTYgKmdyZWVudGFibGUsIFVpbnQxNiAqYmx1ZXRhYmxlXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1NldHMgdGhlIGdhbW1hIGxvb2t1cCB0YWJsZXMgZm9yIHRoZSBkaXNwbGF5IGZvciBlYWNoIGNvbG9yIGNvbXBvbmVudFwmLiBFYWNoIHRhYmxlIGlzIGFuIGFycmF5IG9mIDI1NiBVaW50MTYgdmFsdWVzLCByZXByZXNlbnRpbmcgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGlucHV0IGFuZCBvdXRwdXQgZm9yIHRoYXQgY2hhbm5lbFwmLiBUaGUgaW5wdXQgaXMgdGhlIGluZGV4IGludG8gdGhlIGFycmF5LCBhbmQgdGhlIG91dHB1dCBpcyB0aGUgMTYtYml0IGdhbW1hIHZhbHVlIGF0IHRoYXQgaW5kZXgsIHNjYWxlZCB0byB0aGUgb3V0cHV0IGNvbG9yIHByZWNpc2lvblwmLiBZb3UgbWF5IHBhc3MgTlVMTCB0byBhbnkgb2YgdGhlIGNoYW5uZWxzIHRvIGxlYXZlIHRoZW0gdW5jaGFuZ2VkXCYuCisuUFAKK1RoaXMgZnVuY3Rpb24gYWRqdXN0cyB0aGUgZ2FtbWEgYmFzZWQgb24gbG9va3VwIHRhYmxlcywgeW91IGNhbiBhbHNvIGhhdmUgdGhlIGdhbW1hIGNhbGN1bGF0ZWQgYmFzZWQgb24gYSAiZ2FtbWEgZnVuY3Rpb24iIHBhcmFtZXRlciB3aXRoIFxmSVNETF9TZXRHYW1tYVxmUlwmLgorLlBQCitOb3QgYWxsIGRpc3BsYXkgaGFyZHdhcmUgaXMgYWJsZSB0byBjaGFuZ2UgZ2FtbWFcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIC0xIG9uIGVycm9yIChvciBpZiBnYW1tYSBhZGp1c3RtZW50IGlzIG5vdCBzdXBwb3J0ZWQpXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklTRExfU2V0R2FtbWFcZlIgXGZJU0RMX0dldEdhbW1hUmFtcFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRNb2RTdGF0ZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0TW9kU3RhdGUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzU2Y2ExCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0TW9kU3RhdGUuMwpAQCAtMCwwICsxLDM1IEBACisuVEggIlNETF9TZXRNb2RTdGF0ZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1NldE1vZFN0YXRlIFwtIFNldCB0aGUgY3VycmVudCBrZXkgbW9kaWZpZXIgc3RhdGUKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9TZXRNb2RTdGF0ZVxmUFxmUihcZkJTRExNb2QgbW9kc3RhdGVcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhlIGludmVyc2Ugb2YgXGZJXGZCU0RMX0dldE1vZFN0YXRlXGZQXGZSLCBcZkJTRExfU2V0TW9kU3RhdGVcZlAgYWxsb3dzIHlvdSB0byBpbXBvc2UgbW9kaWZpZXIga2V5IHN0YXRlcyBvbiB5b3VyIGFwcGxpY2F0aW9uXCYuCisuUFAKK1NpbXBseSBwYXNzIHlvdXIgZGVzaXJlZCBtb2RpZmllciBzdGF0ZXMgaW50byBcZkJtb2RzdGF0ZVxmUlwmLiBUaGlzIHZhbHVlIG15IGJlIGEgbG9naWNhbCBPUlwmJ2QgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZzoKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgZW51bSB7CisgIEtNT0RfTk9ORSAgPSAweDAwMDAsCisgIEtNT0RfTFNISUZUPSAweDAwMDEsCisgIEtNT0RfUlNISUZUPSAweDAwMDIsCisgIEtNT0RfTENUUkwgPSAweDAwNDAsCisgIEtNT0RfUkNUUkwgPSAweDAwODAsCisgIEtNT0RfTEFMVCAgPSAweDAxMDAsCisgIEtNT0RfUkFMVCAgPSAweDAyMDAsCisgIEtNT0RfTE1FVEEgPSAweDA0MDAsCisgIEtNT0RfUk1FVEEgPSAweDA4MDAsCisgIEtNT0RfTlVNICAgPSAweDEwMDAsCisgIEtNT0RfQ0FQUyAgPSAweDIwMDAsCisgIEtNT0RfTU9ERSAgPSAweDQwMDAsCit9IFNETE1vZDtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfR2V0TW9kU3RhdGVcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0UGFsZXR0ZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0UGFsZXR0ZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2EzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRQYWxldHRlLjMKQEAgLTAsMCArMSw1OSBAQAorLlRIICJTRExfU2V0UGFsZXR0ZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1NldFBhbGV0dGUgXC0gU2V0cyB0aGUgY29sb3JzIGluIHRoZSBwYWxldHRlIG9mIGFuIDgtYml0IHN1cmZhY2VcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX1NldFBhbGV0dGVcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCBmbGFncywgU0RMX0NvbG9yICpjb2xvcnMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9yc1xmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitTZXRzIGEgcG9ydGlvbiBvZiB0aGUgcGFsZXR0ZSBmb3IgdGhlIGdpdmVuIDgtYml0IHN1cmZhY2VcJi4KKy5QUAorUGFsZXR0aXplZCAoOC1iaXQpIHNjcmVlbiBzdXJmYWNlcyB3aXRoIHRoZSBcZkJTRExfSFdQQUxFVFRFXGZQIGZsYWcgaGF2ZSB0d28gcGFsZXR0ZXMsIGEgbG9naWNhbCBwYWxldHRlIHRoYXQgaXMgdXNlZCBmb3IgbWFwcGluZyBibGl0cyB0by9mcm9tIHRoZSBzdXJmYWNlIGFuZCBhIHBoeXNpY2FsIHBhbGV0dGUgKHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIGhhcmR3YXJlIHdpbGwgbWFwIHRoZSBjb2xvcnMgdG8gdGhlIGRpc3BsYXkpXCYuIFxmSVNETF9CbGl0U3VyZmFjZVxmUiBhbHdheXMgdXNlcyB0aGUgbG9naWNhbCBwYWxldHRlIHdoZW4gYmxpdHRpbmcgc3VyZmFjZXMgKGlmIGl0IGhhcyB0byBjb252ZXJ0IGJldHdlZW4gc3VyZmFjZSBwaXhlbCBmb3JtYXRzKVwmLiBCZWNhdXNlIG9mIHRoaXMsIGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBtb2RpZnkgb25seSBvbmUgb3IgdGhlIG90aGVyIHBhbGV0dGUgdG8gYWNoaWV2ZSB2YXJpb3VzIHNwZWNpYWwgY29sb3IgZWZmZWN0cyAoZVwmLmdcJi4sIHNjcmVlbiBmYWRpbmcsIGNvbG9yIGZsYXNoZXMsIHNjcmVlbiBkaW1taW5nKVwmLgorLlBQCitUaGlzIGZ1bmN0aW9uIGNhbiBtb2RpZnkgZWl0aGVyIHRoZSBsb2dpY2FsIG9yIHBoeXNpY2FsIHBhbGV0dGUgYnkgc3BlY2lmaW5nIFxmQlNETF9MT0dQQUxcZlAgb3IgXGZCU0RMX1BIWVNQQUxcZlB0aGUgaW4gdGhlIFxmQmZsYWdzXGZSIHBhcmFtZXRlclwmLgorLlBQCitXaGVuIFxmQnN1cmZhY2VcZlIgaXMgdGhlIHN1cmZhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGRpc3BsYXksIHRoZSBkaXNwbGF5IGNvbG9ybWFwIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgY29sb3JzXCYuIElmIFxmQlNETF9IV1BBTEVUVEVcZlAgd2FzIHNldCBpbiBcZklTRExfU2V0VmlkZW9Nb2RlXGZSIGZsYWdzLCBcZkJTRExfU2V0UGFsZXR0ZVxmUCB3aWxsIGFsd2F5cyByZXR1cm4gXGZCMVxmUiwgYW5kIHRoZSBwYWxldHRlIGlzIGd1YXJhbnRlZWQgdG8gYmUgc2V0IHRoZSB3YXkgeW91IGRlc2lyZSwgZXZlbiBpZiB0aGUgd2luZG93IGNvbG9ybWFwIGhhcyB0byBiZSB3YXJwZWQgb3IgcnVuIHVuZGVyIGVtdWxhdGlvblwmLgorLlBQCitUaGUgY29sb3IgY29tcG9uZW50cyBvZiBhIFxmSVxmQlNETF9Db2xvclxmUlxmUiBzdHJ1Y3R1cmUgYXJlIDgtYml0cyBpbiBzaXplLCBnaXZpbmcgeW91IGEgdG90YWwgb2YgMjU2XjM9MTY3NzcyMTYgY29sb3JzXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorSWYgXGZCc3VyZmFjZVxmUiBpcyBub3QgYSBwYWxldHRpemVkIHN1cmZhY2UsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLCByZXR1cm5pbmcgXGZCMFxmUlwmLiBJZiBhbGwgb2YgdGhlIGNvbG9ycyB3ZXJlIHNldCBhcyBwYXNzZWQgdG8gXGZCU0RMX1NldFBhbGV0dGVcZlAsIGl0IHdpbGwgcmV0dXJuIFxmQjFcZlJcJi4gSWYgbm90IGFsbCB0aGUgY29sb3IgZW50cmllcyB3ZXJlIHNldCBleGFjdGx5IGFzIGdpdmVuLCBpdCB3aWxsIHJldHVybiBcZkIwXGZSLCBhbmQgeW91IHNob3VsZCBsb29rIGF0IHRoZSBzdXJmYWNlIHBhbGV0dGUgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY29sb3IgcGFsZXR0ZVwmLgorLlNIICJFWEFNUExFIgorLlBQCisubmYKK1xmKENXICAgICAgICAvKiBDcmVhdGUgYSBkaXNwbGF5IHN1cmZhY2Ugd2l0aCBhIGdyYXlzY2FsZSBwYWxldHRlICovCisgICAgICAgIFNETF9TdXJmYWNlICpzY3JlZW47CisgICAgICAgIFNETF9Db2xvciBjb2xvcnNbMjU2XTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIFwmLgorICAgICAgICBcJi4KKyAgICAgICAgXCYuCisgICAgICAgIC8qIEZpbGwgY29sb3JzIHdpdGggY29sb3IgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgZm9yKGk9MDtpPDI1NjtpKyspeworICAgICAgICAgIGNvbG9yc1tpXVwmLnI9aTsKKyAgICAgICAgICBjb2xvcnNbaV1cJi5nPWk7CisgICAgICAgICAgY29sb3JzW2ldXCYuYj1pOworICAgICAgICB9CisKKyAgICAgICAgLyogQ3JlYXRlIGRpc3BsYXkgKi8KKyAgICAgICAgc2NyZWVuPVNETF9TZXRWaWRlb01vZGUoNjQwLCA0ODAsIDgsIFNETF9IV1BBTEVUVEUpOworICAgICAgICBpZighc2NyZWVuKXsKKyAgICAgICAgICBwcmludGYoIkNvdWxkblwmJ3Qgc2V0IHZpZGVvIG1vZGU6ICVzCisiLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgcGFsZXR0ZSAqLworICAgICAgICBTRExfU2V0UGFsZXR0ZShzY3JlZW4sIFNETF9MT0dQQUx8U0RMX1BIWVNQQUwsIGNvbG9ycywgMCwgMjU2KTsKKyAgICAgICAgXCYuCisgICAgICAgIFwmLgorICAgICAgICBcJi4KKyAgICAgICAgXCYuXGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJU0RMX1NldENvbG9yc1xmUiwgXGZJU0RMX1NldFZpZGVvTW9kZVxmUiwgXGZJU0RMX1N1cmZhY2VcZlIsIFxmSVNETF9Db2xvclxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRUaW1lci4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0VGltZXIuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MThhYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0VGltZXIuMwpAQCAtMCwwICsxLDM5IEBACisuVEggIlNETF9TZXRUaW1lciIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1NldFRpbWVyIFwtIFNldCBhIGNhbGxiYWNrIHRvIHJ1biBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGFzIGVsYXBzZWRcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX1NldFRpbWVyXGZQXGZSKFxmQlVpbnQzMiBpbnRlcnZhbCwgU0RMX1RpbWVyQ2FsbGJhY2sgY2FsbGJhY2tcZlIpOworLlNIICJDQUxMQkFDSyIKKy5QUAorLyogRnVuY3Rpb24gcHJvdG90eXBlIGZvciB0aGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8gdHlwZWRlZiBVaW50MzIgKCpTRExfVGltZXJDYWxsYmFjaykoVWludDMyIGludGVydmFsKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1NldCBhIGNhbGxiYWNrIHRvIHJ1biBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGFzIGVsYXBzZWRcJi4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgY3VycmVudCB0aW1lciBpbnRlcnZhbCBhbmQgcmV0dXJucyB0aGUgbmV4dCB0aW1lciBpbnRlcnZhbFwmLiBJZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBwYXNzZWQgaW4sIHRoZSBwZXJpb2RpYyBhbGFybSBjb250aW51ZXMsIG90aGVyd2lzZSBhIG5ldyBhbGFybSBpcyBzY2hlZHVsZWRcJi4KKy5QUAorVG8gY2FuY2VsIGEgY3VycmVudGx5IHJ1bm5pbmcgdGltZXIsIGNhbGwgXGZCU0RMX1NldFRpbWVyKDAsIE5VTEwpO1xmUAorLlBQCitUaGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gbWF5IHJ1biBpbiBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB5b3VyIG1haW4gY29uc3RhbnQsIGFuZCBzbyBzaG91bGRuXCYndCBjYWxsIGFueSBmdW5jdGlvbnMgZnJvbSB3aXRoaW4gaXRzZWxmXCYuCisuUFAKK1RoZSBtYXhpbXVtIHJlc29sdXRpb24gb2YgdGhpcyB0aW1lciBpcyAxMCBtcywgd2hpY2ggbWVhbnMgdGhhdCBpZiB5b3UgcmVxdWVzdCBhIDE2IG1zIHRpbWVyLCB5b3VyIGNhbGxiYWNrIHdpbGwgcnVuIGFwcHJveGltYXRlbHkgMjAgbXMgbGF0ZXIgb24gYW4gdW5sb2FkZWQgc3lzdGVtXCYuIElmIHlvdSB3YW50ZWQgdG8gc2V0IGEgZmxhZyBzaWduYWxpbmcgYSBmcmFtZSB1cGRhdGUgYXQgMzAgZnJhbWVzIHBlciBzZWNvbmQgKGV2ZXJ5IDMzIG1zKSwgeW91IG1pZ2h0IHNldCBhIHRpbWVyIGZvciAzMCBtcyAoc2VlIGV4YW1wbGUgYmVsb3cpXCYuCisuUFAKK0lmIHlvdSB1c2UgdGhpcyBmdW5jdGlvbiwgeW91IG5lZWQgdG8gcGFzcyBcZkJTRExfSU5JVF9USU1FUlxmUCB0byBcZkJTRExfSW5pdCgpXGZQXCYuCisuUFAKKy5SUworXGZCTm90ZTogIAorLlBQCitUaGlzIGZ1bmN0aW9uIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgYnV0IGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgdGhlIG5ldyB0aW1lciBmdW5jdGlvbnMgXGZJU0RMX0FkZFRpbWVyXGZSIGFuZCBcZklTRExfUmVtb3ZlVGltZXJcZlIgd2hpY2ggc3VwcG9ydCBtdWx0aXBsZSB0aW1lcnNcJi4KKy5SRQorLlNIICJFWEFNUExFUyIKKy5QUAorLlBQCisubmYKK1xmKENXU0RMX1NldFRpbWVyKCgzMy8xMCkqMTAsIG15X2NhbGxiYWNrKTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfQWRkVGltZXJcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0VmlkZW9Nb2RlLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TZXRWaWRlb01vZGUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWRlZmIxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2V0VmlkZW9Nb2RlLjMKQEAgLTAsMCArMSw2NyBAQAorLlRIICJTRExfU2V0VmlkZW9Nb2RlIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfU2V0VmlkZW9Nb2RlIFwtIFNldCB1cCBhIHZpZGVvIG1vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQgYW5kIGJpdHMtcGVyLXBpeGVsXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCU0RMX1N1cmZhY2UgKlxmQlNETF9TZXRWaWRlb01vZGVcZlBcZlIoXGZCaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3NcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorU2V0IHVwIGEgdmlkZW8gbW9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCBhbmQgYml0cy1wZXItcGl4ZWxcJi4KKy5QUAorSWYgXGZCYnBwXGZSIGlzIDAsIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIGN1cnJlbnQgZGlzcGxheSBiaXRzIHBlciBwaXhlbFwmLgorLlBQCitUaGUgXGZCZmxhZ3NcZlIgcGFyYW1ldGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBcZkJmbGFnc1xmUiBmaWVsZCBvZiB0aGUgXGZJXGZCU0RMX1N1cmZhY2VcZlJcZlIgc3RydWN0dXJlXCYuIE9SXCYnZCBjb21iaW5hdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHZhbGlkXCYuCisuVFAgMjAKK1xmQlNETF9TV1NVUkZBQ0VcZlAKK0NyZWF0ZSB0aGUgdmlkZW8gc3VyZmFjZSBpbiBzeXN0ZW0gbWVtb3J5CisuVFAgMjAKK1xmQlNETF9IV1NVUkZBQ0VcZlAKK0NyZWF0ZSB0aGUgdmlkZW8gc3VyZmFjZSBpbiB2aWRlbyBtZW1vcnkKKy5UUCAyMAorXGZCU0RMX0FTWU5DQkxJVFxmUAorRW5hYmxlcyB0aGUgdXNlIG9mIGFzeW5jaHJvbm91cyB1cGRhdGVzIG9mIHRoZSBkaXNwbGF5IHN1cmZhY2VcJi4gVGhpcyB3aWxsIHVzdWFsbHkgc2xvdyBkb3duIGJsaXR0aW5nIG9uIHNpbmdsZSBDUFUgbWFjaGluZXMsIGJ1dCBtYXkgcHJvdmlkZSBhIHNwZWVkIGluY3JlYXNlIG9uIFNNUCBzeXN0ZW1zXCYuCisuVFAgMjAKK1xmQlNETF9BTllGT1JNQVRcZlAKK05vcm1hbGx5LCBpZiBhIHZpZGVvIHN1cmZhY2Ugb2YgdGhlIHJlcXVlc3RlZCBiaXRzLXBlci1waXhlbCAoXGZCYnBwXGZSKSBpcyBub3QgYXZhaWxhYmxlLCBTREwgd2lsbCBlbXVsYXRlIG9uZSB3aXRoIGEgc2hhZG93IHN1cmZhY2VcJi4gUGFzc2luZyBcZkJTRExfQU5ZRk9STUFUXGZQIHByZXZlbnRzIHRoaXMgYW5kIGNhdXNlcyBTREwgdG8gdXNlIHRoZSB2aWRlbyBzdXJmYWNlLCByZWdhcmRsZXNzIG9mIGl0cyBwaXhlbCBkZXB0aFwmLgorLlRQIDIwCitcZkJTRExfSFdQQUxFVFRFXGZQCitHaXZlIFNETCBleGNsdXNpdmUgcGFsZXR0ZSBhY2Nlc3NcJi4gV2l0aG91dCB0aGlzIGZsYWcgeW91IG1heSBub3QgYWx3YXlzIGdldCB0aGUgdGhlIGNvbG9ycyB5b3UgcmVxdWVzdCB3aXRoIFxmSVxmQlNETF9TZXRDb2xvcnNcZlBcZlIgb3IgXGZJXGZCU0RMX1NldFBhbGV0dGVcZlBcZlJcJi4KKy5UUCAyMAorXGZCU0RMX0RPVUJMRUJVRlxmUAorRW5hYmxlIGhhcmR3YXJlIGRvdWJsZSBidWZmZXJpbmc7IG9ubHkgdmFsaWQgd2l0aCBTRExfSFdTVVJGQUNFXCYuIENhbGxpbmcgXGZJXGZCU0RMX0ZsaXBcZlBcZlIgd2lsbCBmbGlwIHRoZSBidWZmZXJzIGFuZCB1cGRhdGUgdGhlIHNjcmVlblwmLiBBbGwgZHJhd2luZyB3aWxsIHRha2UgcGxhY2Ugb24gdGhlIHN1cmZhY2UgdGhhdCBpcyBub3QgZGlzcGxheWVkIGF0IHRoZSBtb21lbnRcJi4gSWYgZG91YmxlIGJ1ZmZlcmluZyBjb3VsZCBub3QgYmUgZW5hYmxlZCB0aGVuIFxmQlNETF9GbGlwXGZQIHdpbGwganVzdCBwZXJmb3JtIGEgXGZJXGZCU0RMX1VwZGF0ZVJlY3RcZlBcZlIgb24gdGhlIGVudGlyZSBzY3JlZW5cJi4KKy5UUCAyMAorXGZCU0RMX0ZVTExTQ1JFRU5cZlAKK1NETCB3aWxsIGF0dGVtcHQgdG8gdXNlIGEgZnVsbHNjcmVlbiBtb2RlXCYuIElmIGEgaGFyZHdhcmUgcmVzb2x1dGlvbiBjaGFuZ2UgaXMgbm90IHBvc3NpYmxlIChmb3Igd2hhdGV2ZXIgcmVhc29uKSwgdGhlIG5leHQgaGlnaGVyIHJlc29sdXRpb24gd2lsbCBiZSB1c2VkIGFuZCB0aGUgZGlzcGxheSB3aW5kb3cgY2VudGVyZWQgb24gYSBibGFjayBiYWNrZ3JvdW5kXCYuCisuVFAgMjAKK1xmQlNETF9PUEVOR0xcZlAKK0NyZWF0ZSBhbiBPcGVuR0wgcmVuZGVyaW5nIGNvbnRleHRcJi4gWW91IHNob3VsZCBoYXZlIHByZXZpb3VzbHkgc2V0IE9wZW5HTCB2aWRlbyBhdHRyaWJ1dGVzIHdpdGggXGZJXGZCU0RMX0dMX1NldEF0dHJpYnV0ZVxmUFxmUlwmLgorLlRQIDIwCitcZkJTRExfT1BFTkdMQkxJVFxmUAorQ3JlYXRlIGFuIE9wZW5HTCByZW5kZXJpbmcgY29udGV4dCwgbGlrZSBhYm92ZSwgYnV0IGFsbG93IG5vcm1hbCBibGl0dGluZyBvcGVyYXRpb25zXCYuIFRoZSBzY3JlZW4gKDJEKSBzdXJmYWNlIG1heSBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIGFuZCBcZklcZkJTRExfVXBkYXRlUmVjdHNcZlBcZlIgbXVzdCBiZSB1c2VkIGZvciB1cGRhdGluZyBjaGFuZ2VzIHRvIHRoZSBzY3JlZW4gc3VyZmFjZVwmLgorLlRQIDIwCitcZkJTRExfUkVTSVpBQkxFXGZQCitDcmVhdGUgYSByZXNpemFibGUgd2luZG93XCYuIFdoZW4gdGhlIHdpbmRvdyBpcyByZXNpemVkIGJ5IHRoZSB1c2VyIGEgXGZJXGZCU0RMX1ZJREVPUkVTSVpFXGZQXGZSIGV2ZW50IGlzIGdlbmVyYXRlZCBhbmQgXGZCU0RMX1NldFZpZGVvTW9kZVxmUCBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggdGhlIG5ldyBzaXplXCYuCisuVFAgMjAKK1xmQlNETF9OT0ZSQU1FXGZQCitJZiBwb3NzaWJsZSwgXGZCU0RMX05PRlJBTUVcZlAgY2F1c2VzIFNETCB0byBjcmVhdGUgYSB3aW5kb3cgd2l0aCBubyB0aXRsZSBiYXIgb3IgZnJhbWUgZGVjb3JhdGlvblwmLiBGdWxsc2NyZWVuIG1vZGVzIGF1dG9tYXRpY2FsbHkgaGF2ZSB0aGlzIGZsYWcgc2V0XCYuCisuUFAKKy5SUworXGZCTm90ZTogIAorLlBQCitXaGF0ZXZlciBcZkJmbGFnc1xmUiBcZkJTRExfU2V0VmlkZW9Nb2RlXGZQIGNvdWxkIHNhdGlzZnkgYXJlIHNldCBpbiB0aGUgXGZCZmxhZ3NcZlIgbWVtYmVyIG9mIHRoZSByZXR1cm5lZCBzdXJmYWNlXCYuCisuUkUKKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK1RoZSBcZkJicHBcZlIgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwsIHNvIGEgXGZCYnBwXGZSIG9mIDI0IHVzZXMgdGhlIHBhY2tlZCByZXByZXNlbnRhdGlvbiBvZiAzIGJ5dGVzL3BpeGVsXCYuIEZvciB0aGUgbW9yZSBjb21tb24gNCBieXRlcy9waXhlbCBtb2RlLCB1c2UgYSBcZkJicHBcZlIgb2YgMzJcJi4gU29tZXdoYXQgb2RkbHksIGJvdGggMTUgYW5kIDE2IHdpbGwgcmVxdWVzdCBhIDIgYnl0ZXMvcGl4ZWwgbW9kZSwgYnV0IGRpZmZlcmVudCBwaXhlbCBmb3JtYXRzXCYuCisuUkUKKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitUaGUgZnJhbWVidWZmZXIgc3VyZmFjZSwgb3IgXGZCTlVMTFxmUiBpZiBpdCBmYWlsc1wmLiBUaGUgc3VyZmFjZSByZXR1cm5lZCBpcyBmcmVlZCBieSBTRExfUXVpdCgpIGFuZCBzaG91bGQgbnQgYmUgZnJlZWQgYnkgdGhlIGNhbGxlclwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0xvY2tTdXJmYWNlXGZQXGZSLCBcZklcZkJTRExfU2V0Q29sb3JzXGZQXGZSLCBcZklcZkJTRExfRmxpcFxmUFxmUiwgXGZJXGZCU0RMX1N1cmZhY2VcZlJcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2hvd0N1cnNvci4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU2hvd0N1cnNvci4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNzY0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TaG93Q3Vyc29yLjMKQEAgLTAsMCArMSwyMCBAQAorLlRIICJTRExfU2hvd0N1cnNvciIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1Nob3dDdXJzb3IgXC0gVG9nZ2xlIHdoZXRoZXIgb3Igbm90IHRoZSBjdXJzb3IgaXMgc2hvd24gb24gdGhlIHNjcmVlblwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfU2hvd0N1cnNvclxmUFxmUihcZkJpbnQgdG9nZ2xlXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RvZ2dsZSB3aGV0aGVyIG9yIG5vdCB0aGUgY3Vyc29yIGlzIHNob3duIG9uIHRoZSBzY3JlZW5cJi4gUGFzc2luZyBcZkJTRExfRU5BQkxFXGZQIGRpc3BsYXlzIHRoZSBjdXJzb3IgYW5kIHBhc3NpbmcgXGZCU0RMX0RJU0FCTEVcZlAgaGlkZXMgaXRcJi4gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdXNlIGN1cnNvciBjYW4gYmUgcXVlcmllZCBieSBwYXNzaW5nIFxmQlNETF9RVUVSWVxmUCwgZWl0aGVyIFxmQlNETF9ESVNBQkxFXGZQIG9yIFxmQlNETF9FTkFCTEVcZlAgd2lsbCBiZSByZXR1cm5lZFwmLgorLlBQCitUaGUgY3Vyc29yIHN0YXJ0cyBvZmYgZGlzcGxheWVkLCBidXQgY2FuIGJlIHR1cm5lZCBvZmZcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjdXJzb3JcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVDdXJzb3JcZlBcZlIsIFxmSVxmQlNETF9TZXRDdXJzb3JcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU3VyZmFjZS4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU3VyZmFjZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDZmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TdXJmYWNlLjMKQEAgLTAsMCArMSw5NiBAQAorLlRIICJTRExfU3VyZmFjZSIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAxIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1N1cmZhY2UgXC0gR3JhcGhpY2FsIFN1cmZhY2UgU3RydWN0dXJlCisuU0ggIlNUUlVDVFVSRSBERUZJTklUSU9OIgorLlBQCisubmYKK1xmKENXdHlwZWRlZiBzdHJ1Y3QgU0RMX1N1cmZhY2UgeworICAgICAgICBVaW50MzIgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZC1vbmx5ICovCisgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0OyAgICAgICAgICAgICAgICAvKiBSZWFkLW9ubHkgKi8KKyAgICAgICAgaW50IHcsIGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQtb25seSAqLworICAgICAgICBVaW50MTYgcGl0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZC1vbmx5ICovCisgICAgICAgIHZvaWQgKnBpeGVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkLXdyaXRlICovCisKKyAgICAgICAgLyogY2xpcHBpbmcgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgU0RMX1JlY3QgY2xpcF9yZWN0OyAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQtb25seSAqLworCisgICAgICAgIC8qIFJlZmVyZW5jZSBjb3VudCAtLSB1c2VkIHdoZW4gZnJlZWluZyBzdXJmYWNlICovCisgICAgICAgIGludCByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkLW1vc3RseSAqLworCisJLyogVGhpcyBzdHJ1Y3R1cmUgYWxzbyBjb250YWlucyBwcml2YXRlIGZpZWxkcyBub3Qgc2hvd24gaGVyZSAqLworfSBTRExfU3VyZmFjZTtcZlIKKy5maQorLlBQCisuU0ggIlNUUlVDVFVSRSBEQVRBIgorLlRQIDIwCitcZkJmbGFnc1xmUgorU3VyZmFjZSBmbGFncworLlRQIDIwCitcZkJmb3JtYXRcZlIKK1BpeGVsIFxmSWZvcm1hdFxmUgorLlRQIDIwCitcZkJ3LCBoXGZSCitXaWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzdXJmYWNlCisuVFAgMjAKK1xmQnBpdGNoXGZSCitMZW5ndGggb2YgYSBzdXJmYWNlIHNjYW5saW5lIGluIGJ5dGVzCisuVFAgMjAKK1xmQnBpeGVsc1xmUgorUG9pbnRlciB0byB0aGUgYWN0dWFsIHBpeGVsIGRhdGEKKy5UUCAyMAorXGZCY2xpcF9yZWN0XGZSCitzdXJmYWNlIGNsaXAgXGZJcmVjdGFuZ2xlXGZSCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJTRExfU3VyZmFjZVxmUlwmJ3MgcmVwcmVzZW50IGFyZWFzIG9mICJncmFwaGljYWwiIG1lbW9yeSwgbWVtb3J5IHRoYXQgY2FuIGJlIGRyYXduIHRvXCYuIFRoZSB2aWRlbyBmcmFtZWJ1ZmZlciBpcyByZXR1cm5lZCBhcyBhIFxmQlNETF9TdXJmYWNlXGZSIGJ5IFxmSVxmQlNETF9TZXRWaWRlb01vZGVcZlBcZlIgYW5kIFxmSVxmQlNETF9HZXRWaWRlb1N1cmZhY2VcZlBcZlJcJi4gTW9zdCBvZiB0aGUgZmllbGRzIHNob3VsZCBiZSBwcmV0dHkgb2J2aW91c1wmLiBcZkJ3XGZSIGFuZCBcZkJoXGZSIGFyZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3VyZmFjZSBpbiBwaXhlbHNcJi4gXGZCcGl4ZWxzXGZSIGlzIGEgcG9pbnRlciB0byB0aGUgYWN0dWFsIHBpeGVsIGRhdGEsIHRoZSBzdXJmYWNlIHNob3VsZCBiZSBcZklsb2NrZWRcZlIgYmVmb3JlIGFjY2Vzc2luZyB0aGlzIGZpZWxkXCYuIFRoZSBcZkJjbGlwX3JlY3RcZlIgZmllbGQgaXMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBhcyBzZXQgYnkgXGZJXGZCU0RMX1NldENsaXBSZWN0XGZQXGZSXCYuCisuUFAKK1RoZSBmb2xsb3dpbmcgYXJlIHN1cHBvcnRlZCBpbiB0aGUgXGZCZmxhZ3NcZlIgZmllbGRcJi4KKy5UUCAyMAorXGZCU0RMX1NXU1VSRkFDRVxmUAorU3VyZmFjZSBpcyBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeQorLlRQIDIwCitcZkJTRExfSFdTVVJGQUNFXGZQCitTdXJmYWNlIGlzIHN0b3JlZCBpbiB2aWRlbyBtZW1vcnkKKy5UUCAyMAorXGZCU0RMX0FTWU5DQkxJVFxmUAorU3VyZmFjZSB1c2VzIGFzeW5jaHJvbm91cyBibGl0cyBpZiBwb3NzaWJsZQorLlRQIDIwCitcZkJTRExfQU5ZRk9STUFUXGZQCitBbGxvd3MgYW55IHBpeGVsLWZvcm1hdCAoRGlzcGxheSBzdXJmYWNlKQorLlRQIDIwCitcZkJTRExfSFdQQUxFVFRFXGZQCitTdXJmYWNlIGhhcyBleGNsdXNpdmUgcGFsZXR0ZQorLlRQIDIwCitcZkJTRExfRE9VQkxFQlVGXGZQCitTdXJmYWNlIGlzIGRvdWJsZSBidWZmZXJlZCAoRGlzcGxheSBzdXJmYWNlKQorLlRQIDIwCitcZkJTRExfRlVMTFNDUkVFTlxmUAorU3VyZmFjZSBpcyBmdWxsIHNjcmVlbiAoRGlzcGxheSBTdXJmYWNlKQorLlRQIDIwCitcZkJTRExfT1BFTkdMXGZQCitTdXJmYWNlIGhhcyBhbiBPcGVuR0wgY29udGV4dCAoRGlzcGxheSBTdXJmYWNlKQorLlRQIDIwCitcZkJTRExfT1BFTkdMQkxJVFxmUAorU3VyZmFjZSBzdXBwb3J0cyBPcGVuR0wgYmxpdHRpbmcgKERpc3BsYXkgU3VyZmFjZSkKKy5UUCAyMAorXGZCU0RMX1JFU0laQUJMRVxmUAorU3VyZmFjZSBpcyByZXNpemFibGUgKERpc3BsYXkgU3VyZmFjZSkKKy5UUCAyMAorXGZCU0RMX0hXQUNDRUxcZlAKK1N1cmZhY2UgYmxpdCB1c2VzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgorLlRQIDIwCitcZkJTRExfU1JDQ09MT1JLRVlcZlAKK1N1cmZhY2UgdXNlIGNvbG9ya2V5IGJsaXR0aW5nCisuVFAgMjAKK1xmQlNETF9STEVBQ0NFTFxmUAorQ29sb3JrZXkgYmxpdHRpbmcgaXMgYWNjZWxlcmF0ZWQgd2l0aCBSTEUKKy5UUCAyMAorXGZCU0RMX1NSQ0FMUEhBXGZQCitTdXJmYWNlIGJsaXQgdXNlcyBhbHBoYSBibGVuZGluZworLlRQIDIwCitcZkJTRExfUFJFQUxMT0NcZlAKK1N1cmZhY2UgdXNlcyBwcmVhbGxvY2F0ZWQgbWVtb3J5CisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfUGl4ZWxGb3JtYXRcZlJcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU3lzV01FdmVudC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfU3lzV01FdmVudC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWI3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9TeXNXTUV2ZW50LjMKQEAgLTAsMCArMSwyMSBAQAorLlRIICJTRExfU3lzV01FdmVudCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1N5c1dNRXZlbnQgXC0gUGxhdGZvcm0tZGVwZW5kZW50IHdpbmRvdyBtYW5hZ2VyIGV2ZW50XCYuCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGUgc3lzdGVtIHdpbmRvdyBtYW5hZ2VyIGV2ZW50IGNvbnRhaW5zIGEgcG9pbnRlciB0byBzeXN0ZW0tc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdW5rbm93biB3aW5kb3cgbWFuYWdlciBldmVudHNcJi4gSWYgeW91IGVuYWJsZSB0aGlzIGV2ZW50IHVzaW5nIFxmSVxmQlNETF9FdmVudFN0YXRlKClcZlBcZlIsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW5ldmVyIHVuaGFuZGxlZCBldmVudHMgYXJlIHJlY2VpdmVkIGZyb20gdGhlIHdpbmRvdyBtYW5hZ2VyXCYuIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBpbXBsZW1lbnQgY3V0LWFuZC1wYXN0ZSBpbiB5b3VyIGFwcGxpY2F0aW9uXCYuIAorLlBQCisubmYKK1xmKENXdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAgVWludDggdHlwZTsgICAvKiBBbHdheXMgU0RMX1N5c1dNICovCisgfSBTRExfU3lzV01FdmVudDtcZlIKKy5maQorLlBQCisgSWYgeW91IHdhbnQgdG8gb2J0YWluIHN5c3RlbS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd2luZG93IG1hbmFnZXIsIHlvdSBjYW4gZmlsbCB0aGUgdmVyc2lvbiBtZW1iZXIgb2YgYSBcZkJTRExfU3lzV01pbmZvXGZSIHN0cnVjdHVyZSAoZGV0YWlscyBjYW4gYmUgZm91bmQgaW4gXGZCU0RMX3N5c3dtXCYuaFxmUCwgd2hpY2ggbXVzdCBiZSBpbmNsdWRlZCkgdXNpbmcgdGhlIFxmQlNETF9WRVJTSU9OKClcZlAgbWFjcm8gZm91bmQgaW4gXGZCU0RMX3ZlcnNpb25cJi5oXGZQLCBhbmQgcGFzcyBpdCB0byB0aGUgZnVuY3Rpb246IAorLlBQCisuc3AKK1xmQmludCBcZkJTRExfR2V0V01JbmZvXGZQXGZSKFxmQlNETF9TeXNXTWluZm8gKmluZm9cZlIpOworLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0V2ZW50U3RhdGVcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfVGhyZWFkSUQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1RocmVhZElELjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlMmNmOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1RocmVhZElELjMKQEAgLTAsMCArMSwxMyBAQAorLlRIICJTRExfVGhyZWFkSUQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9UaHJlYWRJRCBcLSBHZXQgdGhlIDMyLWJpdCB0aHJlYWQgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkXCYuaCIKKy5zcAorXGZCVWludDMyIFxmQlNETF9UaHJlYWRJRFxmUFxmUihcZkJ2b2lkXGZSKQorLlNIICJERVNDUklQVElPTiIKKy5QUAorR2V0IHRoZSAzMi1iaXQgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZFwmLgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAwCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9VbmxvY2tBdWRpby4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfVW5sb2NrQXVkaW8uMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA2MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfVW5sb2NrQXVkaW8uMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9VbmxvY2tBdWRpbyIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIyOjU4IiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1VubG9ja0F1ZGlvIFwtIFVubG9jayB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9VbmxvY2tBdWRpb1xmUFxmUihcZkJ2b2lkXGZSKQorLlNIICJERVNDUklQVElPTiIKKy5QUAorVW5sb2NrcyBhIHByZXZpb3VzIFxmSVxmQlNETF9Mb2NrQXVkaW9cZlBcZlIgY2FsbFwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX09wZW5BdWRpb1xmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIyOjU4CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9VbmxvY2tTdXJmYWNlLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9VbmxvY2tTdXJmYWNlLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmZTVjOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1VubG9ja1N1cmZhY2UuMwpAQCAtMCwwICsxLDE3IEBACisuVEggIlNETF9VbmxvY2tTdXJmYWNlIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfVW5sb2NrU3VyZmFjZSBcLSBVbmxvY2tzIGEgcHJldmlvdXNseSBsb2NrZWQgc3VyZmFjZVwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQnZvaWQgXGZCU0RMX1VubG9ja1N1cmZhY2VcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnN1cmZhY2VcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorU3VyZmFjZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbG9ja2VkIHVzaW5nIFxmQlNETF9Mb2NrU3VyZmFjZVxmUCBtdXN0IGJlIHVubG9ja2VkIHdpdGggXGZCU0RMX1VubG9ja1N1cmZhY2VcZlBcJi4gU3VyZmFjZXMgc2hvdWxkIGJlIHVubG9ja2VkIGFzIHNvb24gYXMgcG9zc2libGVcJi4KKy5QUAorSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgc2luY2UgMVwmLjFcJi44LCBzdXJmYWNlIGxvY2tzIGFyZSByZWN1cnNpdmVcJi4gU2VlIFxmSVxmQlNETF9Mb2NrU3VyZmFjZVxmUFxmUlwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0xvY2tTdXJmYWNlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1VubG9ja1lVVk92ZXJsYXkuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1VubG9ja1lVVk92ZXJsYXkuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZiNzIxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfVW5sb2NrWVVWT3ZlcmxheS4zCkBAIC0wLDAgKzEsMTUgQEAKKy5USCAiU0RMX1VubG9ja1lVVk92ZXJsYXkiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9VbmxvY2tZVVZPdmVybGF5IFwtIFVubG9jayBhbiBvdmVybGF5CisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfVW5sb2NrWVVWT3ZlcmxheVxmUFxmUihcZkJTRExfT3ZlcmxheSAqb3ZlcmxheVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGUgb3Bwb3NpdGUgdG8gXGZJXGZCU0RMX0xvY2tZVVZPdmVybGF5XGZQXGZSXCYuIFVubG9ja3MgYSBwcmV2aW91c2x5IGxvY2tlZCBvdmVybGF5XCYuIEFuIG92ZXJsYXkgbXVzdCBiZSB1bmxvY2tlZCBiZWZvcmUgaXQgY2FuIGJlIGRpc3BsYXllZFwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1VubG9ja1lVVk92ZXJsYXlcZlBcZlIsIFxmSVxmQlNETF9DcmVhdGVZVVZPdmVybGF5XGZQXGZSLCBcZklcZkJTRExfT3ZlcmxheVxmUlxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9VcGRhdGVSZWN0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9VcGRhdGVSZWN0LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwMWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1VwZGF0ZVJlY3QuMwpAQCAtMCwwICsxLDE5IEBACisuVEggIlNETF9VcGRhdGVSZWN0IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfVXBkYXRlUmVjdCBcLSBNYWtlcyBzdXJlIHRoZSBnaXZlbiBhcmVhIGlzIHVwZGF0ZWQgb24gdGhlIGdpdmVuIHNjcmVlblwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQnZvaWQgXGZCU0RMX1VwZGF0ZVJlY3RcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnNjcmVlbiwgU2ludDMyIHgsIFNpbnQzMiB5LCBTaW50MzIgdywgU2ludDMyIGhcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorTWFrZXMgc3VyZSB0aGUgZ2l2ZW4gYXJlYSBpcyB1cGRhdGVkIG9uIHRoZSBnaXZlbiBzY3JlZW5cJi4gVGhlIHJlY3RhbmdsZSBtdXN0IGJlIGNvbmZpbmVkIHdpdGhpbiB0aGUgc2NyZWVuIGJvdW5kYXJpZXMgKG5vIGNsaXBwaW5nIGlzIGRvbmUpXCYuCisuUFAKK0lmIFwmJ1xmQnhcZlJcJicsIFwmJ1xmQnlcZlJcJicsIFwmJ1xmQndcZlJcJicgYW5kIFwmJ1xmQmhcZlJcJicgYXJlIGFsbCAwLCBcZkJTRExfVXBkYXRlUmVjdFxmUCB3aWxsIHVwZGF0ZSB0aGUgZW50aXJlIHNjcmVlblwmLgorLlBQCitUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoaWxlIFwmJ1xmQnNjcmVlblxmUlwmJyBpcyBcZklsb2NrZWRcZlJcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9VcGRhdGVSZWN0c1xmUFxmUiwgXGZJXGZCU0RMX1JlY3RcZlJcZlIsIFxmSVxmQlNETF9TdXJmYWNlXGZSXGZSLCBcZklcZkJTRExfTG9ja1N1cmZhY2VcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfVXBkYXRlUmVjdHMuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1VwZGF0ZVJlY3RzLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmZGIwOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1VwZGF0ZVJlY3RzLjMKQEAgLTAsMCArMSwyNSBAQAorLlRIICJTRExfVXBkYXRlUmVjdHMiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9VcGRhdGVSZWN0cyBcLSBNYWtlcyBzdXJlIHRoZSBnaXZlbiBsaXN0IG9mIHJlY3RhbmdsZXMgaXMgdXBkYXRlZCBvbiB0aGUgZ2l2ZW4gc2NyZWVuXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfVXBkYXRlUmVjdHNcZlBcZlIoXGZCU0RMX1N1cmZhY2UgKnNjcmVlbiwgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHNcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorTWFrZXMgc3VyZSB0aGUgZ2l2ZW4gbGlzdCBvZiByZWN0YW5nbGVzIGlzIHVwZGF0ZWQgb24gdGhlIGdpdmVuIHNjcmVlblwmLiBUaGUgcmVjdGFuZ2xlcyBtdXN0IGFsbCBiZSBjb25maW5lZCB3aXRoaW4gdGhlIHNjcmVlbiBib3VuZGFyaWVzIChubyBjbGlwcGluZyBpcyBkb25lKVwmLgorLlBQCitUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoaWxlIFxmQnNjcmVlblxmUiBpcyBcZklsb2NrZWRcZlJcJi4KKy5QUAorLlJTCitcZkJOb3RlOiAgCisuUFAKK0l0IGlzIGFkdmljZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG9ubHkgb25jZSBwZXIgZnJhbWUsIHNpbmNlIGVhY2ggY2FsbCBoYXMgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkXCYuIFRoaXMgaXMgbm8gcmVzdHJpY3Rpb24gc2luY2UgeW91IGNhbiBwYXNzIGFueSBudW1iZXIgb2YgcmVjdGFuZ2xlcyBlYWNoIHRpbWVcJi4KKy5QUAorVGhlIHJlY3RhbmdsZXMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IG1lcmdlZCBvciBjaGVja2VkIGZvciBvdmVybGFwXCYuIEluIGdlbmVyYWwsIHRoZSBwcm9ncmFtbWVyIGNhbiB1c2UgaGlzIGtub3dsZWRnZSBhYm91dCBoaXMgcGFydGljdWxhciByZWN0YW5nbGVzIHRvIG1lcmdlIHRoZW0gaW4gYW4gZWZmaWNpZW50IHdheSwgdG8gYXZvaWQgb3ZlcmRyYXdcJi4KKy5SRQorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1VwZGF0ZVJlY3RcZlBcZlIsIFxmSVxmQlNETF9SZWN0XGZSXGZSLCBcZklcZkJTRExfU3VyZmFjZVxmUlxmUiwgXGZJXGZCU0RMX0xvY2tTdXJmYWNlXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1VzZXJFdmVudC4zIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfVXNlckV2ZW50LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyZWM1MwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1VzZXJFdmVudC4zCkBAIC0wLDAgKzEsNDcgQEAKKy5USCAiU0RMX1VzZXJFdmVudCIgIjMiICJUdWUgMTEgU2VwIDIwMDEsIDIzOjAwIiAiU0RMIiAiU0RMIEFQSSBSZWZlcmVuY2UiIAorLlNIICJOQU1FIgorU0RMX1VzZXJFdmVudCBcLSBBIHVzZXItZGVmaW5lZCBldmVudCB0eXBlCisuU0ggIlNUUlVDVFVSRSBERUZJTklUSU9OIgorLlBQCisubmYKK1xmKENXdHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQ4IHR5cGU7CisgIGludCBjb2RlOworICB2b2lkICpkYXRhMTsKKyAgdm9pZCAqZGF0YTI7Cit9IFNETF9Vc2VyRXZlbnQ7XGZSCisuZmkKKy5QUAorLlNIICJTVFJVQ1RVUkUgREFUQSIKKy5UUCAyMAorXGZCdHlwZVxmUgorXGZCU0RMX1VTRVJFVkVOVFxmUCB0aHJvdWdoIHRvIFxmQlNETF9OVU1FVkVOVFMtMVxmUAorLlRQIDIwCitcZkJjb2RlXGZSCitVc2VyIGRlZmluZWQgZXZlbnQgY29kZQorLlRQIDIwCitcZkJkYXRhMVxmUgorVXNlciBkZWZpbmVkIGRhdGEgcG9pbnRlcgorLlRQIDIwCitcZkJkYXRhMlxmUgorVXNlciBkZWZpbmVkIGRhdGEgcG9pbnRlcgorLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX1VzZXJFdmVudFxmUiBpcyBpbiB0aGUgXGZCdXNlclxmUiBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBcZklcZkJTRExfRXZlbnRcZlJcZlJcJi4gVGhpcyBldmVudCBpcyB1bmlxdWUsIGl0IGlzIG5ldmVyIGNyZWF0ZWQgYnkgU0RMIGJ1dCBvbmx5IGJ5IHRoZSB1c2VyXCYuIFRoZSBldmVudCBjYW4gYmUgcHVzaGVkIG9udG8gdGhlIGV2ZW50IHF1ZXVlIHVzaW5nIFxmSVxmQlNETF9QdXNoRXZlbnRcZlBcZlJcJi4gVGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBvciBjb21wbGV0ZWx5IHVwIHRvIHRoZSBwcm9ncmFtbWVyLCB0aGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IFxmQnR5cGVcZlIgaXMgYSB2YWx1ZSBmcm9tIFxmQlNETF9VU0VSRVZFTlRcZlAgdG8gXGZCU0RMX05VTUVWRU5UUy0xXGZQIChpbmNsdXNpdmUpXCYuCisuU0ggIkVYQU1QTEVTIgorLlBQCisuUFAKKy5uZgorXGYoQ1dTRExfRXZlbnQgZXZlbnQ7CisKK2V2ZW50XCYudHlwZSA9IFNETF9VU0VSRVZFTlQ7CitldmVudFwmLnVzZXJcJi5jb2RlID0gbXlfZXZlbnRfY29kZTsKK2V2ZW50XCYudXNlclwmLmRhdGExID0gc2lnbmlmaWNhbnRfZGF0YTsKK2V2ZW50XCYudXNlclwmLmRhdGEyID0gMDsKK1NETF9QdXNoRXZlbnQoJmV2ZW50KTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfRXZlbnRcZlJcZlIsIFxmSVxmQlNETF9QdXNoRXZlbnRcZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfVmlkZW9Ecml2ZXJOYW1lLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9WaWRlb0RyaXZlck5hbWUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODU2M2I2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfVmlkZW9Ecml2ZXJOYW1lLjMKQEAgLTAsMCArMSwxOCBAQAorLlRIICJTRExfVmlkZW9Ecml2ZXJOYW1lIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfVmlkZW9Ecml2ZXJOYW1lIFwtIE9idGFpbiB0aGUgbmFtZSBvZiB0aGUgdmlkZW8gZHJpdmVyCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCY2hhciAqXGZCU0RMX1ZpZGVvRHJpdmVyTmFtZVxmUFxmUihcZkJjaGFyICpuYW1lYnVmLCBpbnQgbWF4bGVuXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoZSBidWZmZXIgcG9pbnRlZCB0byBieSBcZkJuYW1lYnVmXGZSIGlzIGZpbGxlZCB1cCB0byBhIG1heGltdW0gb2YgXGZCbWF4bGVuXGZSIGNoYXJhY3RlcnMgKGluY2x1ZGUgdGhlIE5VTEwgdGVybWluYXRvcikgd2l0aCB0aGUgbmFtZSBvZiB0aGUgaW5pdGlhbGlzZWQgdmlkZW8gZHJpdmVyXCYuIFRoZSBkcml2ZXIgbmFtZSBpcyBhIHNpbXBsZSBvbmUgd29yZCBpZGVudGlmaWVyIGxpa2UgIngxMSIgb3IgIndpbmRpYiJcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIFxmQk5VTExcZlAgaWYgdmlkZW8gaGFzIG5vdCBiZWVuIGluaXRpYWxpc2VkIHdpdGggXGZCU0RMX0luaXRcZlAgb3IgYSBwb2ludGVyIHRvIFxmQm5hbWVidWZcZlIgb3RoZXJ3aXNlXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfSW5pdFxmUFxmUiBcZklcZkJTRExfSW5pdFN1YlN5c3RlbVxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9WaWRlb0luZm8uMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1ZpZGVvSW5mby4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MmUxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9WaWRlb0luZm8uMwpAQCAtMCwwICsxLDYyIEBACisuVEggIlNETF9WaWRlb0luZm8iICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9WaWRlb0luZm8gXC0gVmlkZW8gVGFyZ2V0IGluZm9ybWF0aW9uCisuU0ggIlNUUlVDVFVSRSBERUZJTklUSU9OIgorLlBQCisubmYKK1xmKENXdHlwZWRlZiBzdHJ1Y3R7CisgIFVpbnQzMiBod19hdmFpbGFibGU6MTsKKyAgVWludDMyIHdtX2F2YWlsYWJsZToxOworICBVaW50MzIgYmxpdF9odzoxOworICBVaW50MzIgYmxpdF9od19DQzoxOworICBVaW50MzIgYmxpdF9od19BOjE7CisgIFVpbnQzMiBibGl0X3N3OjE7CisgIFVpbnQzMiBibGl0X3N3X0NDOjE7CisgIFVpbnQzMiBibGl0X3N3X0E6MTsKKyAgVWludDMyIGJsaXRfZmlsbDsKKyAgVWludDMyIHZpZGVvX21lbTsKKyAgU0RMX1BpeGVsRm9ybWF0ICp2Zm10OworfSBTRExfVmlkZW9JbmZvO1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQmh3X2F2YWlsYWJsZVxmUgorSXMgaXQgcG9zc2libGUgdG8gY3JlYXRlIGhhcmR3YXJlIHN1cmZhY2VzPworLlRQIDIwCitcZkJ3bV9hdmFpbGFibGVcZlIKK0lzIHRoZXJlIGEgd2luZG93IG1hbmFnZXIgYXZhaWxhYmxlCisuVFAgMjAKK1xmQmJsaXRfaHdcZlIKK0FyZSBoYXJkd2FyZSB0byBoYXJkd2FyZSBibGl0cyBhY2NlbGVyYXRlZD8KKy5UUCAyMAorXGZCYmxpdF9od19DQ1xmUgorQXJlIGhhcmR3YXJlIHRvIGhhcmR3YXJlIGNvbG9ya2V5IGJsaXRzIGFjY2VsZXJhdGVkPworLlRQIDIwCitcZkJibGl0X2h3X0FcZlIKK0FyZSBoYXJkd2FyZSB0byBoYXJkd2FyZSBhbHBoYSBibGl0cyBhY2NlbGVyYXRlZD8KKy5UUCAyMAorXGZCYmxpdF9zd1xmUgorQXJlIHNvZnR3YXJlIHRvIGhhcmR3YXJlIGJsaXRzIGFjY2VsZXJhdGVkPworLlRQIDIwCitcZkJibGl0X3N3X0NDXGZSCitBcmUgc29mdHdhcmUgdG8gaGFyZHdhcmUgY29sb3JrZXkgYmxpdHMgYWNjZWxlcmF0ZWQ/CisuVFAgMjAKK1xmQmJsaXRfc3dfQVxmUgorQXJlIHNvZnR3YXJlIHRvIGhhcmR3YXJlIGFscGhhIGJsaXRzIGFjY2VsZXJhdGVkPworLlRQIDIwCitcZkJibGl0X2ZpbGxcZlIKK0FyZSBjb2xvciBmaWxscyBhY2NlbGVyYXRlZD8KKy5UUCAyMAorXGZCdmlkZW9fbWVtXGZSCitUb3RhbCBhbW91bnQgb2YgdmlkZW8gbWVtb3J5IGluIEtpbG9ieXRlcworLlRQIDIwCitcZkJ2Zm10XGZSCitcZklQaXhlbCBmb3JtYXRcZlIgb2YgdGhlIHZpZGVvIGRldmljZQorLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhpcyAocmVhZC1vbmx5KSBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQgYnkgXGZJXGZCU0RMX0dldFZpZGVvSW5mb1xmUFxmUlwmLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBlaXRoZXIgdGhlIFwmJ2Jlc3RcJicgYXZhaWxhYmxlIG1vZGUgKGlmIGNhbGxlZCBiZWZvcmUgXGZJXGZCU0RMX1NldFZpZGVvTW9kZVxmUFxmUikgb3IgdGhlIGN1cnJlbnQgdmlkZW8gbW9kZVwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1BpeGVsRm9ybWF0XGZSXGZSLCBcZklcZkJTRExfR2V0VmlkZW9JbmZvXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1ZpZGVvTW9kZU9LLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9WaWRlb01vZGVPSy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzlhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9WaWRlb01vZGVPSy4zCkBAIC0wLDAgKzEsNDQgQEAKKy5USCAiU0RMX1ZpZGVvTW9kZU9LIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfVmlkZW9Nb2RlT0sgXC0gQ2hlY2sgdG8gc2VlIGlmIGEgcGFydGljdWxhciB2aWRlbyBtb2RlIGlzIHN1cHBvcnRlZFwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfVmlkZW9Nb2RlT0tcZlBcZlIoXGZCaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3NcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCU0RMX1ZpZGVvTW9kZU9LXGZQIHJldHVybnMgXGZCMFxmUiBpZiB0aGUgcmVxdWVzdGVkIG1vZGUgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgYml0IGRlcHRoLCBvciByZXR1cm5zIHRoZSBiaXRzLXBlci1waXhlbCBvZiB0aGUgY2xvc2VzdCBhdmFpbGFibGUgbW9kZSB3aXRoIHRoZSBnaXZlbiB3aWR0aCwgaGVpZ2h0IGFuZCByZXF1ZXN0ZWQgXGZJc3VyZmFjZVxmUiBmbGFncyAoc2VlIFxmSVxmQlNETF9TZXRWaWRlb01vZGVcZlBcZlIpXCYuCisuUFAKK1RoZSBiaXRzLXBlci1waXhlbCB2YWx1ZSByZXR1cm5lZCBpcyBvbmx5IGEgc3VnZ2VzdGVkIG1vZGVcJi4gWW91IGNhbiB1c3VhbGx5IHJlcXVlc3QgYW5kIGJwcCB5b3Ugd2FudCB3aGVuIFxmSXNldHRpbmdcZlIgdGhlIHZpZGVvIG1vZGUgYW5kIFNETCB3aWxsIGVtdWxhdGUgdGhhdCBjb2xvciBkZXB0aCB3aXRoIGEgc2hhZG93IHZpZGVvIHN1cmZhY2VcJi4KKy5QUAorVGhlIGFyZ3VtZW50cyB0byBcZkJTRExfVmlkZW9Nb2RlT0tcZlAgYXJlIHRoZSBzYW1lIG9uZXMgeW91IHdvdWxkIHBhc3MgdG8gXGZJU0RMX1NldFZpZGVvTW9kZVxmUgorLlNIICJFWEFNUExFIgorLlBQCisubmYKK1xmKENXU0RMX1N1cmZhY2UgKnNjcmVlbjsKK1VpbnQzMiBicHA7CitcJi4KK1wmLgorXCYuCitwcmludGYoIkNoZWNraW5nIG1vZGUgNjQweDQ4MEAxNmJwcFwmLgorIik7CiticHA9U0RMX1ZpZGVvTW9kZU9LKDY0MCwgNDgwLCAxNiwgU0RMX0hXU1VSRkFDRSk7CisKK2lmKCFicHApeworICBwcmludGYoIk1vZGUgbm90IGF2YWlsYWJsZVwmLgorIik7CisgIGV4aXQoLTEpOworfQorCitwcmludGYoIlNETCBSZWNvbW1lbmRzIDY0MHg0ODBAJWRicHBcJi4KKyIsIGJwcCk7CitzY3JlZW49U0RMX1NldFZpZGVvTW9kZSg2NDAsIDQ4MCwgYnBwLCBTRExfSFdTVVJGQUNFKTsKK1wmLgorXCYuXGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX1NldFZpZGVvTW9kZVxmUFxmUiwgXGZJXGZCU0RMX0dldFZpZGVvSW5mb1xmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9HZXRDYXB0aW9uLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9HZXRDYXB0aW9uLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlZDhiMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dNX0dldENhcHRpb24uMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9XTV9HZXRDYXB0aW9uIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfV01fR2V0Q2FwdGlvbiBcLSBHZXRzIHRoZSB3aW5kb3cgdGl0bGUgYW5kIGljb24gbmFtZVwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQnZvaWQgXGZCU0RMX1dNX0dldENhcHRpb25cZlBcZlIoXGZCY2hhciAqKnRpdGxlLCBjaGFyICoqaWNvblxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitTZXQgcG9pbnRlcnMgdG8gdGhlIHdpbmRvdyBcZkJ0aXRsZVxmUiBhbmQgXGZCaWNvblxmUiBuYW1lXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfV01fU2V0Q2FwdGlvblxmUFxmUiwgXGZJXGZCU0RMX1dNX1NldEljb25cZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfV01fR3JhYklucHV0LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9HcmFiSW5wdXQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTY2ODFlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfV01fR3JhYklucHV0LjMKQEAgLTAsMCArMSwyOCBAQAorLlRIICJTRExfV01fR3JhYklucHV0IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfV01fR3JhYklucHV0IFwtIEdyYWJzIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dFwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQlNETF9HcmFiTW9kZSBcZkJTRExfV01fR3JhYklucHV0XGZQXGZSKFxmQlNETF9HcmFiTW9kZSBtb2RlXGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK0dyYWJiaW5nIG1lYW5zIHRoYXQgdGhlIG1vdXNlIGlzIGNvbmZpbmVkIHRvIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3csIGFuZCBuZWFybHkgYWxsIGtleWJvYXJkIGlucHV0IGlzIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgYXBwbGljYXRpb24sIGFuZCBub3QgaW50ZXJwcmV0ZWQgYnkgYSB3aW5kb3cgbWFuYWdlciwgaWYgYW55XCYuCisuUFAKK1doZW4gXGZCbW9kZVxmUiBpcyBcZkJTRExfR1JBQl9RVUVSWVxmUCB0aGUgZ3JhYiBtb2RlIGlzIG5vdCBjaGFuZ2VkLCBidXQgdGhlIGN1cnJlbnQgZ3JhYiBtb2RlIGlzIHJldHVybmVkXCYuCisuUFAKKy5QUAorLm5mCitcZihDV3R5cGVkZWYgZW51bSB7CisgIFNETF9HUkFCX1FVRVJZLAorICBTRExfR1JBQl9PRkYsCisgIFNETF9HUkFCX09OCit9IFNETF9HcmFiTW9kZTtcZlIKKy5maQorLlBQCisgCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorVGhlIGN1cnJlbnQvbmV3IFxmQlNETF9HcmFiTW9kZVxmUlwmLgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9JY29uaWZ5V2luZG93LjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9JY29uaWZ5V2luZG93LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyZGY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dNX0ljb25pZnlXaW5kb3cuMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9XTV9JY29uaWZ5V2luZG93IiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDIiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfV01fSWNvbmlmeVdpbmRvdyBcLSBJY29uaWZ5L01pbmltaXNlIHRoZSB3aW5kb3cKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX1dNX0ljb25pZnlXaW5kb3dcZlBcZlIoXGZCdm9pZFxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitJZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBpbiBhIHdpbmRvdyBtYW5hZ2VkIGVudmlyb25tZW50IFNETCBhdHRlbXB0cyB0byBpY29uaWZ5L21pbmltaXNlIGl0XCYuIElmIFxmQlNETF9XTV9JY29uaWZ5V2luZG93XGZQIGlzIHN1Y2Nlc3NmdWwsIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlY2VpdmUgYSBcZklcZkJTRExfQVBQQUNUSVZFXGZQXGZSIGxvc3MgZXZlbnRcJi4KKy5TSCAiUkVUVVJOIFZBTFVFIgorLlBQCitSZXR1cm5zIG5vbi16ZXJvIG9uIHN1Y2Nlc3Mgb3IgXGZCMFxmUiBpZiBpY29uaWZpY2F0aW9uIGlzIG5vdCBzdXBwb3J0IG9yIHdhcyByZWZ1c2VkIGJ5IHRoZSB3aW5kb3cgbWFuYWdlclwmLgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9TZXRDYXB0aW9uLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9TZXRDYXB0aW9uLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3ZmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dNX1NldENhcHRpb24uMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9XTV9TZXRDYXB0aW9uIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDIiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfV01fU2V0Q2FwdGlvbiBcLSBTZXRzIHRoZSB3aW5kb3cgdGlsZSBhbmQgaWNvbiBuYW1lXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfV01fU2V0Q2FwdGlvblxmUFxmUihcZkJjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvblxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitTZXRzIHRoZSB0aXRsZS1iYXIgYW5kIGljb24gbmFtZSBvZiB0aGUgZGlzcGxheSB3aW5kb3dcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9XTV9HZXRDYXB0aW9uXGZQXGZSLCBcZklcZkJTRExfV01fU2V0SWNvblxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9TZXRJY29uLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9TZXRJY29uLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzYTUxOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dNX1NldEljb24uMwpAQCAtMCwwICsxLDI3IEBACisuVEggIlNETF9XTV9TZXRJY29uIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDIiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfV01fU2V0SWNvbiBcLSBTZXRzIHRoZSBpY29uIGZvciB0aGUgZGlzcGxheSB3aW5kb3dcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJ2b2lkIFxmQlNETF9XTV9TZXRJY29uXGZQXGZSKFxmQlNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFza1xmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitTZXRzIHRoZSBpY29uIGZvciB0aGUgZGlzcGxheSB3aW5kb3dcJi4gV2luMzIgaWNvbnMgbXVzdCBiZSAzMngzMlwmLgorLlBQCitUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBcZklTRExfU2V0VmlkZW9Nb2RlXGZSXCYuCisuUFAKK0l0IHRha2VzIGFuIFxmQmljb25cZlIgc3VyZmFjZSwgYW5kIGEgXGZCbWFza1xmUiBpbiBNU0IgZm9ybWF0XCYuCisuUFAKK0lmIFxmQm1hc2tcZlIgaXMgXGZCTlVMTFxmUCwgdGhlIGVudGlyZSBpY29uIHN1cmZhY2Ugd2lsbCBiZSB1c2VkIGFzIHRoZSBpY29uXCYuCisuU0ggIkVYQU1QTEUiCisuUFAKKy5uZgorXGYoQ1dTRExfV01fU2V0SWNvbihTRExfTG9hZEJNUCgiaWNvblwmLmJtcCIpLCBOVUxMKTtcZlIKKy5maQorLlBQCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExfU2V0VmlkZW9Nb2RlXGZQXGZSLCBcZklcZkJTRExfV01fU2V0Q2FwdGlvblxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9Ub2dnbGVGdWxsU2NyZWVuLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XTV9Ub2dnbGVGdWxsU2NyZWVuLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjZjhkZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dNX1RvZ2dsZUZ1bGxTY3JlZW4uMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9XTV9Ub2dnbGVGdWxsU2NyZWVuIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDIiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfV01fVG9nZ2xlRnVsbFNjcmVlbiBcLSBUb2dnbGVzIGZ1bGxzY3JlZW4gbW9kZQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfV01fVG9nZ2xlRnVsbFNjcmVlblxmUFxmUihcZkJTRExfU3VyZmFjZSAqc3VyZmFjZVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUb2dnbGVzIHRoZSBhcHBsaWNhdGlvbiBiZXR3ZWVuIHdpbmRvd2VkIGFuZCBmdWxsc2NyZWVuIG1vZGUsIGlmIHN1cHBvcnRlZFwmLiAoWDExIGlzIHRoZSBvbmx5IHRhcmdldCBjdXJyZW50bHkgc3VwcG9ydGVkLCBCZU9TIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsKVwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1JldHVybnMgXGZCMFxmUiBvbiBmYWlsdXJlIG9yIFxmQjFcZlIgb24gc3VjY2Vzc1wmLgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XYWl0RXZlbnQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dhaXRFdmVudC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYWRiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XYWl0RXZlbnQuMwpAQCAtMCwwICsxLDE3IEBACisuVEggIlNETF9XYWl0RXZlbnQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9XYWl0RXZlbnQgXC0gV2FpdHMgaW5kZWZpbml0ZWx5IGZvciB0aGUgbmV4dCBhdmFpbGFibGUgZXZlbnRcJi4KKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX1dhaXRFdmVudFxmUFxmUihcZkJTRExfRXZlbnQgKmV2ZW50XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1dhaXRzIGluZGVmaW5pdGVseSBmb3IgdGhlIG5leHQgYXZhaWxhYmxlIGV2ZW50LCByZXR1cm5pbmcgXGZCMVxmUiwgb3IgXGZCMFxmUiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgZXZlbnRzXCYuIAorLlBQCitJZiBcZkJldmVudFxmUiBpcyBub3QgXGZCTlVMTFxmUCwgdGhlIG5leHQgZXZlbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBhbmQgc3RvcmVkIGluIHRoYXQgYXJlYVwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0V2ZW50XGZSXGZSLCBcZklcZkJTRExfUG9sbEV2ZW50XGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dhaXRUaHJlYWQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dhaXRUaHJlYWQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTY3OWZjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfV2FpdFRocmVhZC4zCkBAIC0wLDAgKzEsMTkgQEAKKy5USCAiU0RMX1dhaXRUaHJlYWQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9XYWl0VGhyZWFkIFwtIFdhaXQgZm9yIGEgdGhyZWFkIHRvIGZpbmlzaFwmLgorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQnZvaWQgXGZCU0RMX1dhaXRUaHJlYWRcZlBcZlIoXGZCU0RMX1RocmVhZCAqdGhyZWFkLCBpbnQgKnN0YXR1c1xmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitXYWl0IGZvciBhIHRocmVhZCB0byBmaW5pc2ggKHRpbWVvdXRzIGFyZSBub3Qgc3VwcG9ydGVkKVwmLgorLlNIICJSRVRVUk4gVkFMVUUiCisuUFAKK1RoZSByZXR1cm4gY29kZSBmb3IgdGhlIHRocmVhZCBmdW5jdGlvbiBpcyBwbGFjZWQgaW4gdGhlIGFyZWEgcG9pbnRlZCB0byBieSBcZkJzdGF0dXNcZlIsIGlmIFxmQnN0YXR1c1xmUiBpcyBub3QgXGZCTlVMTFxmUlwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NyZWF0ZVRocmVhZFxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XYXJwTW91c2UuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dhcnBNb3VzZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYWIzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9XYXJwTW91c2UuMwpAQCAtMCwwICsxLDE1IEBACisuVEggIlNETF9XYXJwTW91c2UiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9XYXJwTW91c2UgXC0gU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbW91c2UgY3Vyc29yXCYuCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCdm9pZCBcZkJTRExfV2FycE1vdXNlXGZQXGZSKFxmQlVpbnQxNiB4LCBVaW50MTYgeVxmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3IgKGdlbmVyYXRlcyBhIG1vdXNlIG1vdGlvbiBldmVudClcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9Nb3VzZU1vdGlvbkV2ZW50XGZSXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dhc0luaXQuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX1dhc0luaXQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmM3NWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfV2FzSW5pdC4zCkBAIC0wLDAgKzEsNjMgQEAKKy5USCAiU0RMX1dhc0luaXQiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMCIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9XYXNJbml0IFwtIENoZWNrIHdoaWNoIHN1YnN5c3RlbXMgYXJlIGluaXRpYWxpemVkCisuU0ggIlNZTk9QU0lTIgorLlBQCitcZkIjaW5jbHVkZSAiU0RMXCYuaCIKKy5zcAorXGZCVWludDMyIFxmQlNETF9XYXNJbml0XGZQXGZSKFxmQlVpbnQzMiBmbGFnc1xmUik7CisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitcZkJTRExfV2FzSW5pdFxmUCBhbGxvd3MgeW91IHRvIHNlZSB3aGljaCBTREwgc3Vic3l0ZW1zIGhhdmUgYmVlbiBcZklpbml0aWFsaXplZFxmUlwmLiBcZkJmbGFnc1xmUiBpcyBhIGJpdHdpc2UgT1JcJidkIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWJzeXN0ZW1zIHlvdSB3aXNoIHRvIGNoZWNrIChzZWUgXGZJXGZCU0RMX0luaXRcZlBcZlIgZm9yIGEgbGlzdCBvZiBzdWJzeXN0ZW0gZmxhZ3MpXCYuCisuU0ggIlJFVFVSTiBWQUxVRSIKKy5QUAorXGZCU0RMX1dhc0luaXRcZlAgcmV0dXJucyBhIGJpdHdpc2VkIE9SXCYnZCBjb21iaW5hdGlvbiBvZiB0aGUgaW5pdGlhbGl6ZWQgc3Vic3lzdGVtc1wmLgorLlNIICJFWEFNUExFUyIKKy5QUAorLm5mCitcZihDVworLyogSGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHlvdSBjYW4gdXNlIFNETF9XYXNJbml0KCkgKi8KKworLyogR2V0IGluaXQgZGF0YSBvbiBhbGwgdGhlIHN1YnN5c3RlbXMgKi8KK1VpbnQzMiBzdWJzeXN0ZW1faW5pdDsKKworc3Vic3lzdGVtX2luaXQ9U0RMX1dhc0luaXQoU0RMX0lOSVRfRVZFUllUSElORyk7CisKK2lmKHN1YnN5c3RlbV9pbml0JlNETF9JTklUX1ZJREVPKQorICBwcmludGYoIlZpZGVvIGlzIGluaXRpYWxpemVkXCYuCisiKTsKK2Vsc2UKKyAgcHJpbnRmKCJWaWRlbyBpcyBub3QgaW5pdGlhbGl6ZWRcJi4KKyIpOworCisKKworLyogSnVzdCBjaGVjayBmb3Igb25lIHNwZWNmaWMgc3Vic3lzdGVtICovCisKK2lmKFNETF9XYXNJbml0KFNETF9JTklUX1ZJREVPKSE9MCkKKyAgcHJpbnRmKCJWaWRlbyBpcyBpbml0aWFsaXplZFwmLgorIik7CitlbHNlCisgIHByaW50ZigiVmlkZW8gaXMgbm90IGluaXRpYWxpemVkXCYuCisiKTsKKworCisKKworLyogQ2hlY2sgZm9yIHR3byBzdWJzeXN0ZW1zICovCisKK1VpbnQzMiBzdWJzeXN0ZW1fbWFzaz1TRExfSU5JVF9WSURFT3xTRExfSU5JVF9BVURJTzsKKworaWYoU0RMX1dhc0luaXQoc3Vic3lzdGVtX21hc2spPT1zdWJzeXN0ZW1fbWFzaykKKyAgcHJpbnRmKCJWaWRlbyBhbmQgQXVkaW8gaW5pdGlhbGl6ZWRcJi4KKyIpOworZWxzZQorICBwcmludGYoIlZpZGVvIGFuZCBBdWRpbyBub3QgaW5pdGlhbGl6ZWRcJi4KKyIpOworXGZSCisuZmkKKy5QUAorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0luaXRcZlBcZlIsIFxmSVxmQlNETF9TdWJzeXN0ZW1cZlBcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfa2V5c3ltLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9rZXlzeW0uMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjA2NWMxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfa2V5c3ltLjMKQEAgLTAsMCArMSw2OSBAQAorLlRIICJTRExfa2V5c3ltIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDAiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfa2V5c3ltIFwtIEtleXN5bSBzdHJ1Y3R1cmUKKy5TSCAiU1RSVUNUVVJFIERFRklOSVRJT04iCisuUFAKKy5uZgorXGYoQ1d0eXBlZGVmIHN0cnVjdHsKKyAgVWludDggc2NhbmNvZGU7CisgIFNETEtleSBzeW07CisgIFNETE1vZCBtb2Q7CisgIFVpbnQxNiB1bmljb2RlOworfSBTRExfa2V5c3ltO1xmUgorLmZpCisuUFAKKy5TSCAiU1RSVUNUVVJFIERBVEEiCisuVFAgMjAKK1xmQnNjYW5jb2RlXGZSCitIYXJkd2FyZSBzcGVjaWZpYyBzY2FuY29kZQorLlRQIDIwCitcZkJzeW1cZlIKK1NETCB2aXJ0dWFsIGtleXN5bQorLlRQIDIwCitcZkJtb2RcZlIKK0N1cnJlbnQga2V5IG1vZGlmaWVycworLlRQIDIwCitcZkJ1bmljb2RlXGZSCitUcmFuc2xhdGVkIGNoYXJhY3RlcgorLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhlIFxmQlNETF9rZXlzeW1cZlIgc3RydWN0dXJlIGlzIHVzZWQgYnkgcmVwb3J0aW5nIGtleSBwcmVzc2VzIGFuZCByZWxlYXNlcyBzaW5jZSBpdCBpcyBhIHBhcnQgb2YgdGhlIFxmSVxmQlNETF9LZXlib2FyZEV2ZW50XGZSXGZSXCYuCisuUFAKK1RoZSBcZkJzY2FuY29kZVxmUiBmaWVsZCBzaG91bGQgZ2VuZXJhbGx5IGJlIGxlZnQgYWxvbmUsIGl0IGlzIHRoZSBoYXJkd2FyZSBkZXBlbmRlbnQgc2NhbmNvZGUgcmV0dXJuZWQgYnkgdGhlIGtleWJvYXJkXCYuIFRoZSBcZkJzeW1cZlIgZmllbGQgaXMgZXh0cmVtZWx5IHVzZWZ1bFwmLiBJdCBpcyB0aGUgU0RMLWRlZmluZWQgdmFsdWUgb2YgdGhlIGtleSAoc2VlIFxmSVNETCBLZXkgU3ltc1xmUlwmLiBUaGlzIGZpZWxkIGlzIHZlcnkgdXNlZnVsIHdoZW4geW91IGFyZSBjaGVja2luZyBmb3IgY2VydGFpbiBrZXkgcHJlc3NlcywgbGlrZSBzbzogCisuUFAKKy5uZgorXGYoQ1dcJi4KK1wmLgord2hpbGUoU0RMX1BvbGxFdmVudCgmZXZlbnQpKXsKKyAgc3dpdGNoKGV2ZW50XCYudHlwZSl7CisgICAgY2FzZSBTRExfS0VZRE9XTjoKKyAgICAgIGlmKGV2ZW50XCYua2V5XCYua2V5c3ltXCYuc3ltPT1TRExLX0xFRlQpCisgICAgICAgIG1vdmVfbGVmdCgpOworICAgICAgYnJlYWs7CisgICAgXCYuCisgICAgXCYuCisgICAgXCYuCisgIH0KK30KK1wmLgorXCYuXGZSCisuZmkKKy5QUAorIFxmQm1vZFxmUiBzdG9yZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGtleWJvYXJkIG1vZGlmaWVycyBhcyBleHBsYWluZWQgaW4gXGZJXGZCU0RMX0dldE1vZFN0YXRlXGZQXGZSXCYuIFRoZSBcZkJ1bmljb2RlXGZSIGlzIG9ubHkgdXNlZCB3aGVuIFVOSUNPREUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCB3aXRoIFxmSVxmQlNETF9FbmFibGVVTklDT0RFXGZQXGZSXCYuIElmIFxmQnVuaWNvZGVcZlIgaXMgbm9uLXplcm8gdGhlbiB0aGlzIGEgdGhlIFVOSUNPREUgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleXByZXNzXCYuIElmIHRoZSBoaWdoIDkgYml0cyBvZiB0aGUgY2hhcmFjdGVyIGFyZSAwLCB0aGVuIHRoaXMgbWFwcyB0byB0aGUgZXF1aXZhbGVudCBBU0NJSSBjaGFyYWN0ZXI6IAorLlBQCisubmYKK1xmKENXY2hhciBjaDsKK2lmICggKGtleXN5bVwmLnVuaWNvZGUgJiAweEZGODApID09IDAgKSB7CisgIGNoID0ga2V5c3ltXCYudW5pY29kZSAmIDB4N0Y7Cit9CitlbHNlIHsKKyAgcHJpbnRmKCJBbiBJbnRlcm5hdGlvbmFsIENoYXJhY3RlclwmLgorIik7Cit9XGZSCisuZmkKKy5QUAorIFVOSUNPREUgdHJhbnNsYXRpb24gZG9lcyBoYXZlIGEgc2xpZ2h0IG92ZXJoZWFkIHNvIGRvblwmJ3QgZW5hYmxlIGl0IHVubGVzcyBpdHMgbmVlZGVkXCYuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZklcZkJTRExLZXlcZlJcZlIKKy5cIiBjcmVhdGVkIGJ5IGluc3RhbnQgLyBkb2Nib29rLXRvLW1hbiwgVHVlIDExIFNlcCAyMDAxLCAyMzowMApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfbXV0ZXhQLjMgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9tdXRleFAuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjIxNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2RvY3MvbWFuMy9TRExfbXV0ZXhQLjMKQEAgLTAsMCArMSwxOCBAQAorLlRIICJTRExfbXV0ZXhQIiAiMyIgIlR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEiICJTREwiICJTREwgQVBJIFJlZmVyZW5jZSIgCisuU0ggIk5BTUUiCitTRExfbXV0ZXhQIFwtIExvY2sgYSBtdXRleAorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCI2luY2x1ZGUgIlNETFwmLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZFwmLmgiCisuc3AKK1xmQmludCBcZkJTRExfbXV0ZXhQXGZQXGZSKFxmQlNETF9tdXRleCAqbXV0ZXhcZlIpOworLlNIICJERVNDUklQVElPTiIKKy5QUAorTG9ja3MgdGhlIFxmQm11dGV4XGZSLCB3aGljaCB3YXMgcHJldmlvdXNseSBjcmVhdGVkIHdpdGggXGZJXGZCU0RMX0NyZWF0ZU11dGV4XGZQXGZSXCYuIElmIHRoZSBtdXRleCBpcyBhbHJlYWR5IGxvY2tlZCB0aGVuIFxmQlNETF9tdXRleFBcZlAgd2lsbCBub3QgcmV0dXJuIHVudGlsIGl0IGlzIFxmSXVubG9ja2VkXGZSXCYuIFJldHVybnMgXGZCMFxmUiBvbiBzdWNjZXNzLCBvciBcZkItMVxmUiBvbiBhbiBlcnJvclwmLgorLlBQCitTREwgYWxzbyBkZWZpbmVzIGEgbWFjcm8gXGZCI2RlZmluZSBTRExfTG9ja011dGV4KG0pIFNETF9tdXRleFAobSlcZlBcJi4KKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmSVxmQlNETF9DcmVhdGVNdXRleFxmUFxmUiwgXGZJXGZCU0RMX211dGV4VlxmUFxmUgorLlwiIGNyZWF0ZWQgYnkgaW5zdGFudCAvIGRvY2Jvb2stdG8tbWFuLCBUdWUgMTEgU2VwIDIwMDEsIDIzOjAxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9tdXRleFYuMyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9kb2NzL21hbjMvU0RMX211dGV4Vi4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTRhYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvZG9jcy9tYW4zL1NETF9tdXRleFYuMwpAQCAtMCwwICsxLDE4IEBACisuVEggIlNETF9tdXRleFYiICIzIiAiVHVlIDExIFNlcCAyMDAxLCAyMzowMSIgIlNETCIgIlNETCBBUEkgUmVmZXJlbmNlIiAKKy5TSCAiTkFNRSIKK1NETF9tdXRleFYgXC0gVW5sb2NrIGEgbXV0ZXgKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQiNpbmNsdWRlICJTRExcJi5oIgorI2luY2x1ZGUgIlNETF90aHJlYWRcJi5oIgorLnNwCitcZkJpbnQgXGZCU0RMX211dGV4VlxmUFxmUihcZkJTRExfbXV0ZXggKm11dGV4XGZSKTsKKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1VubG9ja3MgdGhlIFxmQm11dGV4XGZSLCB3aGljaCB3YXMgcHJldmlvdXNseSBjcmVhdGVkIHdpdGggXGZJXGZCU0RMX0NyZWF0ZU11dGV4XGZQXGZSXCYuIFJldHVybnMgXGZCMFxmUiBvbiBzdWNjZXNzLCBvciBcZkItMVxmUiBvbiBhbiBlcnJvclwmLgorLlBQCitTREwgYWxzbyBkZWZpbmVzIGEgbWFjcm8gXGZCI2RlZmluZSBTRExfVW5sb2NrTXV0ZXgobSkgU0RMX211dGV4VihtKVxmUFwmLgorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZJXGZCU0RMX0NyZWF0ZU11dGV4XGZQXGZSLCBcZklcZkJTRExfbXV0ZXhQXGZQXGZSCisuXCIgY3JlYXRlZCBieSBpbnN0YW50IC8gZG9jYm9vay10by1tYW4sIFR1ZSAxMSBTZXAgMjAwMSwgMjM6MDEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4N2I3YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKiogQGZpbGUgU0RMLmgKKyAqICBNYWluIGluY2x1ZGUgaGVhZGVyIGZvciB0aGUgU0RMIGxpYnJhcnkKKyAqLworCisjaWZuZGVmIF9TRExfSAorI2RlZmluZSBfU0RMX0gKKworI2luY2x1ZGUgIlNETF9tYWluLmgiCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIlNETF9jZHJvbS5oIgorI2luY2x1ZGUgIlNETF9jcHVpbmZvLmgiCisjaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfbG9hZHNvLmgiCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisjaW5jbHVkZSAiU0RMX3J3b3BzLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF92ZXJzaW9uLmgiCisKKyNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCisvKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEBmaWxlIFNETC5oCisgKiAgQG5vdGUgQXMgb2YgdmVyc2lvbiAwLjUsIFNETCBpcyBsb2FkZWQgZHluYW1pY2FsbHkgaW50byB0aGUgYXBwbGljYXRpb24KKyAqLworCisvKiogQG5hbWUgU0RMX0lOSVQgRmxhZ3MKKyAqICBUaGVzZSBhcmUgdGhlIGZsYWdzIHdoaWNoIG1heSBiZSBwYXNzZWQgdG8gU0RMX0luaXQoKSAtLSB5b3Ugc2hvdWxkCisgKiAgc3BlY2lmeSB0aGUgc3Vic3lzdGVtcyB3aGljaCB5b3Ugd2lsbCBiZSB1c2luZyBpbiB5b3VyIGFwcGxpY2F0aW9uLgorICovCisvKkB7Ki8KKyNkZWZpbmUJU0RMX0lOSVRfVElNRVIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU0RMX0lOSVRfQVVESU8JCTB4MDAwMDAwMTAKKyNkZWZpbmUgU0RMX0lOSVRfVklERU8JCTB4MDAwMDAwMjAKKyNkZWZpbmUgU0RMX0lOSVRfQ0RST00JCTB4MDAwMDAxMDAKKyNkZWZpbmUgU0RMX0lOSVRfSk9ZU1RJQ0sJMHgwMDAwMDIwMAorI2RlZmluZSBTRExfSU5JVF9OT1BBUkFDSFVURQkweDAwMTAwMDAwCS8qKjwgRG9uJ3QgY2F0Y2ggZmF0YWwgc2lnbmFscyAqLworI2RlZmluZSBTRExfSU5JVF9FVkVOVFRIUkVBRAkweDAxMDAwMDAwCS8qKjwgTm90IHN1cHBvcnRlZCBvbiBhbGwgT1MncyAqLworI2RlZmluZSBTRExfSU5JVF9FVkVSWVRISU5HCTB4MDAwMEZGRkYKKy8qQH0qLworCisvKiogVGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUgU0RMIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJ5IGFuZCBpbml0aWFsaXplcyAKKyAqICB0aGUgc3Vic3lzdGVtcyBzcGVjaWZpZWQgYnkgJ2ZsYWdzJyAoYW5kIHRob3NlIHNhdGlzZnlpbmcgZGVwZW5kZW5jaWVzKQorICogIFVubGVzcyB0aGUgU0RMX0lOSVRfTk9QQVJBQ0hVVEUgZmxhZyBpcyBzZXQsIGl0IHdpbGwgaW5zdGFsbCBjbGVhbnVwCisgKiAgc2lnbmFsIGhhbmRsZXJzIGZvciBzb21lIGNvbW1vbmx5IGlnbm9yZWQgZmF0YWwgc2lnbmFscyAobGlrZSBTSUdTRUdWKQorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0luaXQoVWludDMyIGZsYWdzKTsKKworLyoqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgc3BlY2lmaWMgU0RMIHN1YnN5c3RlbXMgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfSW5pdFN1YlN5c3RlbShVaW50MzIgZmxhZ3MpOworCisvKiogVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgc3BlY2lmaWMgU0RMIHN1YnN5c3RlbXMgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1F1aXRTdWJTeXN0ZW0oVWludDMyIGZsYWdzKTsKKworLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBtYXNrIG9mIHRoZSBzcGVjaWZpZWQgc3Vic3lzdGVtcyB3aGljaCBoYXZlCisgKiAgYmVlbiBpbml0aWFsaXplZC4KKyAqICBJZiAnZmxhZ3MnIGlzIDAsIGl0IHJldHVybnMgYSBtYXNrIG9mIGFsbCBpbml0aWFsaXplZCBzdWJzeXN0ZW1zLgorICovCitleHRlcm4gREVDTFNQRUMgVWludDMyIFNETENBTEwgU0RMX1dhc0luaXQoVWludDMyIGZsYWdzKTsKKworLyoqIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGFsbCBpbml0aWFsaXplZCBzdWJzeXN0ZW1zIGFuZCB1bmxvYWRzIHRoZQorICogIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJ5LiAgWW91IHNob3VsZCBjYWxsIGl0IHVwb24gYWxsIGV4aXQgY29uZGl0aW9ucy4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfUXVpdCh2b2lkKTsKKworLyogRW5kcyBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKKworI2VuZGlmIC8qIF9TRExfSCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2FjdGl2ZS5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2FjdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkODU0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfYWN0aXZlLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqCisgKiAgQGZpbGUgU0RMX2FjdGl2ZS5oCisgKiAgSW5jbHVkZSBmaWxlIGZvciBTREwgYXBwbGljYXRpb24gZm9jdXMgZXZlbnQgaGFuZGxpbmcgCisgKi8KKworI2lmbmRlZiBfU0RMX2FjdGl2ZV9oCisjZGVmaW5lIF9TRExfYWN0aXZlX2gKKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKyNpbmNsdWRlICJTRExfZXJyb3IuaCIKKworI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKKy8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogQG5hbWUgVGhlIGF2YWlsYWJsZSBhcHBsaWNhdGlvbiBzdGF0ZXMgKi8KKy8qQHsqLworI2RlZmluZSBTRExfQVBQTU9VU0VGT0NVUwkweDAxCQkvKio8IFRoZSBhcHAgaGFzIG1vdXNlIGNvdmVyYWdlICovCisjZGVmaW5lIFNETF9BUFBJTlBVVEZPQ1VTCTB4MDIJCS8qKjwgVGhlIGFwcCBoYXMgaW5wdXQgZm9jdXMgKi8KKyNkZWZpbmUgU0RMX0FQUEFDVElWRQkJMHgwNAkJLyoqPCBUaGUgYXBwbGljYXRpb24gaXMgYWN0aXZlICovCisvKkB9Ki8KKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworLyoqIAorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2ggaXMgYQorICogYml0d2lzZSBjb21iaW5hdGlvbiBvZiBTRExfQVBQTU9VU0VGT0NVUywgU0RMX0FQUElOUFVURk9DVVMsIGFuZAorICogU0RMX0FQUEFDVElWRS4gIElmIFNETF9BUFBBQ1RJVkUgaXMgc2V0LCB0aGVuIHRoZSB1c2VyIGlzIGFibGUgdG8KKyAqIHNlZSB5b3VyIGFwcGxpY2F0aW9uLCBvdGhlcndpc2UgaXQgaGFzIGJlZW4gaWNvbmlmaWVkIG9yIGRpc2FibGVkLgorICovCitleHRlcm4gREVDTFNQRUMgVWludDggU0RMQ0FMTCBTRExfR2V0QXBwU3RhdGUodm9pZCk7CisKKworLyogRW5kcyBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKKworI2VuZGlmIC8qIF9TRExfYWN0aXZlX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9hdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3OWM5OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9hdWRpby5oCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKioKKyAqICBAZmlsZSBTRExfYXVkaW8uaAorICogIEFjY2VzcyB0byB0aGUgcmF3IGF1ZGlvIG1peGluZyBidWZmZXIgZm9yIHRoZSBTREwgbGlicmFyeQorICovCisKKyNpZm5kZWYgX1NETF9hdWRpb19oCisjZGVmaW5lIF9TRExfYXVkaW9faAorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKKyNpbmNsdWRlICJTRExfbXV0ZXguaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3J3b3BzLmgiCisKKyNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCisvKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBXaGVuIGZpbGxpbmcgaW4gdGhlIGRlc2lyZWQgYXVkaW8gc3BlYyBzdHJ1Y3R1cmUsCisgKiAtICdkZXNpcmVkLT5mcmVxJyBzaG91bGQgYmUgdGhlIGRlc2lyZWQgYXVkaW8gZnJlcXVlbmN5IGluIHNhbXBsZXMtcGVyLXNlY29uZC4KKyAqIC0gJ2Rlc2lyZWQtPmZvcm1hdCcgc2hvdWxkIGJlIHRoZSBkZXNpcmVkIGF1ZGlvIGZvcm1hdC4KKyAqIC0gJ2Rlc2lyZWQtPnNhbXBsZXMnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIGF1ZGlvIGJ1ZmZlciwgaW4gc2FtcGxlcy4KKyAqICAgICBUaGlzIG51bWJlciBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28sIGFuZCBtYXkgYmUgYWRqdXN0ZWQgYnkgdGhlIGF1ZGlvCisgKiAgICAgZHJpdmVyIHRvIGEgdmFsdWUgbW9yZSBzdWl0YWJsZSBmb3IgdGhlIGhhcmR3YXJlLiAgR29vZCB2YWx1ZXMgc2VlbSB0bworICogICAgIHJhbmdlIGJldHdlZW4gNTEyIGFuZCA4MDk2IGluY2x1c2l2ZSwgZGVwZW5kaW5nIG9uIHRoZSBhcHBsaWNhdGlvbiBhbmQKKyAqICAgICBDUFUgc3BlZWQuICBTbWFsbGVyIHZhbHVlcyB5aWVsZCBmYXN0ZXIgcmVzcG9uc2UgdGltZSwgYnV0IGNhbiBsZWFkCisgKiAgICAgdG8gdW5kZXJmbG93IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBkb2luZyBoZWF2eSBwcm9jZXNzaW5nIGFuZCBjYW5ub3QKKyAqICAgICBmaWxsIHRoZSBhdWRpbyBidWZmZXIgaW4gdGltZS4gIEEgc3RlcmVvIHNhbXBsZSBjb25zaXN0cyBvZiBib3RoIHJpZ2h0CisgKiAgICAgYW5kIGxlZnQgY2hhbm5lbHMgaW4gTFIgb3JkZXJpbmcuCisgKiAgICAgTm90ZSB0aGF0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRpbWUgYnkgdGhlCisgKiAgICAgZm9sbG93aW5nIGZvcm11bGE6ICBtcyA9IChzYW1wbGVzKjEwMDApL2ZyZXEKKyAqIC0gJ2Rlc2lyZWQtPnNpemUnIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBhdWRpbyBidWZmZXIsIGFuZCBpcworICogICAgIGNhbGN1bGF0ZWQgYnkgU0RMX09wZW5BdWRpbygpLgorICogLSAnZGVzaXJlZC0+c2lsZW5jZScgaXMgdGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBidWZmZXIgdG8gc2lsZW5jZSwKKyAqICAgICBhbmQgaXMgY2FsY3VsYXRlZCBieSBTRExfT3BlbkF1ZGlvKCkuCisgKiAtICdkZXNpcmVkLT5jYWxsYmFjaycgc2hvdWxkIGJlIHNldCB0byBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQKKyAqICAgICB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgaXMgcmVhZHkgZm9yIG1vcmUgZGF0YS4gIEl0IGlzIHBhc3NlZCBhIHBvaW50ZXIKKyAqICAgICB0byB0aGUgYXVkaW8gYnVmZmVyLCBhbmQgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXVkaW8gYnVmZmVyLgorICogICAgIFRoaXMgZnVuY3Rpb24gdXN1YWxseSBydW5zIGluIGEgc2VwYXJhdGUgdGhyZWFkLCBhbmQgc28geW91IHNob3VsZAorICogICAgIHByb3RlY3QgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaXQgYWNjZXNzZXMgYnkgY2FsbGluZyBTRExfTG9ja0F1ZGlvKCkKKyAqICAgICBhbmQgU0RMX1VubG9ja0F1ZGlvKCkgaW4geW91ciBjb2RlLgorICogLSAnZGVzaXJlZC0+dXNlcmRhdGEnIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIHlvdXIgY2FsbGJhY2sKKyAqICAgICBmdW5jdGlvbi4KKyAqCisgKiBAbm90ZSBUaGUgY2FsY3VsYXRlZCB2YWx1ZXMgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIGNhbGN1bGF0ZWQgYnkgU0RMX09wZW5BdWRpbygpCisgKgorICovCit0eXBlZGVmIHN0cnVjdCBTRExfQXVkaW9TcGVjIHsKKwlpbnQgZnJlcTsJCS8qKjwgRFNQIGZyZXF1ZW5jeSAtLSBzYW1wbGVzIHBlciBzZWNvbmQgKi8KKwlVaW50MTYgZm9ybWF0OwkJLyoqPCBBdWRpbyBkYXRhIGZvcm1hdCAqLworCVVpbnQ4ICBjaGFubmVsczsJLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHM6IDEgbW9ubywgMiBzdGVyZW8gKi8KKwlVaW50OCAgc2lsZW5jZTsJCS8qKjwgQXVkaW8gYnVmZmVyIHNpbGVuY2UgdmFsdWUgKGNhbGN1bGF0ZWQpICovCisJVWludDE2IHNhbXBsZXM7CQkvKio8IEF1ZGlvIGJ1ZmZlciBzaXplIGluIHNhbXBsZXMgKHBvd2VyIG9mIDIpICovCisJVWludDE2IHBhZGRpbmc7CQkvKio8IE5lY2Vzc2FyeSBmb3Igc29tZSBjb21waWxlIGVudmlyb25tZW50cyAqLworCVVpbnQzMiBzaXplOwkJLyoqPCBBdWRpbyBidWZmZXIgc2l6ZSBpbiBieXRlcyAoY2FsY3VsYXRlZCkgKi8KKwkvKioKKwkgKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIG5lZWRzIG1vcmUgZGF0YS4KKwkgKgorCSAqICBAcGFyYW1bb3V0XSBzdHJlYW0JQSBwb2ludGVyIHRvIHRoZSBhdWRpbyBkYXRhIGJ1ZmZlcgorCSAqICBAcGFyYW1baW5dICBsZW4JVGhlIGxlbmd0aCBvZiB0aGUgYXVkaW8gYnVmZmVyIGluIGJ5dGVzLgorCSAqCisJICogIE9uY2UgdGhlIGNhbGxiYWNrIHJldHVybnMsIHRoZSBidWZmZXIgd2lsbCBubyBsb25nZXIgYmUgdmFsaWQuCisJICogIFN0ZXJlbyBzYW1wbGVzIGFyZSBzdG9yZWQgaW4gYSBMUkxSTFIgb3JkZXJpbmcuCisJICovCisJdm9pZCAoU0RMQ0FMTCAqY2FsbGJhY2spKHZvaWQgKnVzZXJkYXRhLCBVaW50OCAqc3RyZWFtLCBpbnQgbGVuKTsKKwl2b2lkICAqdXNlcmRhdGE7Cit9IFNETF9BdWRpb1NwZWM7CisKKy8qKgorICogIEBuYW1lIEF1ZGlvIGZvcm1hdCBmbGFncworICogIGRlZmF1bHRzIHRvIExTQiBieXRlIG9yZGVyCisgKi8KKy8qQHsqLworI2RlZmluZSBBVURJT19VOAkweDAwMDgJLyoqPCBVbnNpZ25lZCA4LWJpdCBzYW1wbGVzICovCisjZGVmaW5lIEFVRElPX1M4CTB4ODAwOAkvKio8IFNpZ25lZCA4LWJpdCBzYW1wbGVzICovCisjZGVmaW5lIEFVRElPX1UxNkxTQgkweDAwMTAJLyoqPCBVbnNpZ25lZCAxNi1iaXQgc2FtcGxlcyAqLworI2RlZmluZSBBVURJT19TMTZMU0IJMHg4MDEwCS8qKjwgU2lnbmVkIDE2LWJpdCBzYW1wbGVzICovCisjZGVmaW5lIEFVRElPX1UxNk1TQgkweDEwMTAJLyoqPCBBcyBhYm92ZSwgYnV0IGJpZy1lbmRpYW4gYnl0ZSBvcmRlciAqLworI2RlZmluZSBBVURJT19TMTZNU0IJMHg5MDEwCS8qKjwgQXMgYWJvdmUsIGJ1dCBiaWctZW5kaWFuIGJ5dGUgb3JkZXIgKi8KKyNkZWZpbmUgQVVESU9fVTE2CUFVRElPX1UxNkxTQgorI2RlZmluZSBBVURJT19TMTYJQVVESU9fUzE2TFNCCisKKy8qKgorICogIEBuYW1lIE5hdGl2ZSBhdWRpbyBieXRlIG9yZGVyaW5nCisgKi8KKy8qQHsqLworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KKyNkZWZpbmUgQVVESU9fVTE2U1lTCUFVRElPX1UxNkxTQgorI2RlZmluZSBBVURJT19TMTZTWVMJQVVESU9fUzE2TFNCCisjZWxzZQorI2RlZmluZSBBVURJT19VMTZTWVMJQVVESU9fVTE2TVNCCisjZGVmaW5lIEFVRElPX1MxNlNZUwlBVURJT19TMTZNU0IKKyNlbmRpZgorLypAfSovCisKKy8qQH0qLworCisKKy8qKiBBIHN0cnVjdHVyZSB0byBob2xkIGEgc2V0IG9mIGF1ZGlvIGNvbnZlcnNpb24gZmlsdGVycyBhbmQgYnVmZmVycyAqLwordHlwZWRlZiBzdHJ1Y3QgU0RMX0F1ZGlvQ1ZUIHsKKwlpbnQgbmVlZGVkOwkJCS8qKjwgU2V0IHRvIDEgaWYgY29udmVyc2lvbiBwb3NzaWJsZSAqLworCVVpbnQxNiBzcmNfZm9ybWF0OwkJLyoqPCBTb3VyY2UgYXVkaW8gZm9ybWF0ICovCisJVWludDE2IGRzdF9mb3JtYXQ7CQkvKio8IFRhcmdldCBhdWRpbyBmb3JtYXQgKi8KKwlkb3VibGUgcmF0ZV9pbmNyOwkJLyoqPCBSYXRlIGNvbnZlcnNpb24gaW5jcmVtZW50ICovCisJVWludDggKmJ1ZjsJCQkvKio8IEJ1ZmZlciB0byBob2xkIGVudGlyZSBhdWRpbyBkYXRhICovCisJaW50ICAgIGxlbjsJCQkvKio8IExlbmd0aCBvZiBvcmlnaW5hbCBhdWRpbyBidWZmZXIgKi8KKwlpbnQgICAgbGVuX2N2dDsJCQkvKio8IExlbmd0aCBvZiBjb252ZXJ0ZWQgYXVkaW8gYnVmZmVyICovCisJaW50ICAgIGxlbl9tdWx0OwkJLyoqPCBidWZmZXIgbXVzdCBiZSBsZW4qbGVuX211bHQgYmlnICovCisJZG91YmxlIGxlbl9yYXRpbzsgCS8qKjwgR2l2ZW4gbGVuLCBmaW5hbCBzaXplIGlzIGxlbipsZW5fcmF0aW8gKi8KKwl2b2lkIChTRExDQUxMICpmaWx0ZXJzWzEwXSkoc3RydWN0IFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KTsKKwlpbnQgZmlsdGVyX2luZGV4OwkJLyoqPCBDdXJyZW50IGF1ZGlvIGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KK30gU0RMX0F1ZGlvQ1ZUOworCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworLyoqCisgKiBAbmFtZSBBdWRpbyBJbml0IGFuZCBRdWl0CisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgaW50ZXJuYWxseSwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgeW91CisgKiBoYXZlIGEgc3BlY2lmaWMgbmVlZCB0byBzcGVjaWZ5IHRoZSBhdWRpbyBkcml2ZXIgeW91IHdhbnQgdG8gdXNlLgorICogWW91IHNob3VsZCBub3JtYWxseSB1c2UgU0RMX0luaXQoKSBvciBTRExfSW5pdFN1YlN5c3RlbSgpLgorICovCisvKkB7Ki8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfQXVkaW9Jbml0KGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lKTsKK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0F1ZGlvUXVpdCh2b2lkKTsKKy8qQH0qLworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgdGhlIGdpdmVuIGNoYXJhY3RlciBidWZmZXIgd2l0aCB0aGUgbmFtZSBvZiB0aGUKKyAqIGN1cnJlbnQgYXVkaW8gZHJpdmVyLCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQgaWYgdGhlIGF1ZGlvIGRyaXZlciBoYXMKKyAqIGJlZW4gaW5pdGlhbGl6ZWQuICBJdCByZXR1cm5zIE5VTEwgaWYgbm8gZHJpdmVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICovCitleHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX0F1ZGlvRHJpdmVyTmFtZShjaGFyICpuYW1lYnVmLCBpbnQgbWF4bGVuKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBhdWRpbyBkZXZpY2Ugd2l0aCB0aGUgZGVzaXJlZCBwYXJhbWV0ZXJzLCBhbmQKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBwbGFjaW5nIHRoZSBhY3R1YWwgaGFyZHdhcmUgcGFyYW1ldGVycyBpbiB0aGUKKyAqIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5ICdvYnRhaW5lZCcuICBJZiAnb2J0YWluZWQnIGlzIE5VTEwsIHRoZSBhdWRpbworICogZGF0YSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSBpbiB0aGUKKyAqIHJlcXVlc3RlZCBmb3JtYXQsIGFuZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIHRoZSBoYXJkd2FyZQorICogYXVkaW8gZm9ybWF0IGlmIG5lY2Vzc2FyeS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMSBpZiBpdCBmYWlsZWQgCisgKiB0byBvcGVuIHRoZSBhdWRpbyBkZXZpY2UsIG9yIGNvdWxkbid0IHNldCB1cCB0aGUgYXVkaW8gdGhyZWFkLgorICoKKyAqIFRoZSBhdWRpbyBkZXZpY2Ugc3RhcnRzIG91dCBwbGF5aW5nIHNpbGVuY2Ugd2hlbiBpdCdzIG9wZW5lZCwgYW5kIHNob3VsZAorICogYmUgZW5hYmxlZCBmb3IgcGxheWluZyBieSBjYWxsaW5nIFNETF9QYXVzZUF1ZGlvKDApIHdoZW4geW91IGFyZSByZWFkeQorICogZm9yIHlvdXIgYXVkaW8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiAgU2luY2UgdGhlIGF1ZGlvIGRyaXZlcgorICogbWF5IG1vZGlmeSB0aGUgcmVxdWVzdGVkIHNpemUgb2YgdGhlIGF1ZGlvIGJ1ZmZlciwgeW91IHNob3VsZCBhbGxvY2F0ZQorICogYW55IGxvY2FsIG1peGluZyBidWZmZXJzIGFmdGVyIHlvdSBvcGVuIHRoZSBhdWRpbyBkZXZpY2UuCisgKgorICogQHNhIFNETF9BdWRpb1NwZWMKKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9PcGVuQXVkaW8oU0RMX0F1ZGlvU3BlYyAqZGVzaXJlZCwgU0RMX0F1ZGlvU3BlYyAqb2J0YWluZWQpOworCit0eXBlZGVmIGVudW0geworCVNETF9BVURJT19TVE9QUEVEID0gMCwKKwlTRExfQVVESU9fUExBWUlORywKKwlTRExfQVVESU9fUEFVU0VECit9IFNETF9hdWRpb3N0YXR1czsKKworLyoqIEdldCB0aGUgY3VycmVudCBhdWRpbyBzdGF0ZSAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9hdWRpb3N0YXR1cyBTRExDQUxMIFNETF9HZXRBdWRpb1N0YXR1cyh2b2lkKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHBhdXNlcyBhbmQgdW5wYXVzZXMgdGhlIGF1ZGlvIGNhbGxiYWNrIHByb2Nlc3NpbmcuCisgKiBJdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBwYXJhbWV0ZXIgb2YgMCBhZnRlciBvcGVuaW5nIHRoZSBhdWRpbworICogZGV2aWNlIHRvIHN0YXJ0IHBsYXlpbmcgc291bmQuICBUaGlzIGlzIHNvIHlvdSBjYW4gc2FmZWx5IGluaXRpYWxpemUKKyAqIGRhdGEgZm9yIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24gYWZ0ZXIgb3BlbmluZyB0aGUgYXVkaW8gZGV2aWNlLgorICogU2lsZW5jZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGF1ZGlvIGRldmljZSBkdXJpbmcgdGhlIHBhdXNlLgorICovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9QYXVzZUF1ZGlvKGludCBwYXVzZV9vbik7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBsb2FkcyBhIFdBVkUgZnJvbSB0aGUgZGF0YSBzb3VyY2UsIGF1dG9tYXRpY2FsbHkgZnJlZWluZworICogdGhhdCBzb3VyY2UgaWYgJ2ZyZWVzcmMnIGlzIG5vbi16ZXJvLiAgRm9yIGV4YW1wbGUsIHRvIGxvYWQgYSBXQVZFIGZpbGUsCisgKiB5b3UgY291bGQgZG86CisgKglAY29kZSBTRExfTG9hZFdBVl9SVyhTRExfUldGcm9tRmlsZSgic2FtcGxlLndhdiIsICJyYiIpLCAxLCAuLi4pOyBAZW5kY29kZQorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMsIGl0IHJldHVybnMgdGhlIGdpdmVuIFNETF9BdWRpb1NwZWMsCisgKiBmaWxsZWQgd2l0aCB0aGUgYXVkaW8gZGF0YSBmb3JtYXQgb2YgdGhlIHdhdmUgZGF0YSwgYW5kIHNldHMKKyAqICdhdWRpb19idWYnIHRvIGEgbWFsbG9jKCknZCBidWZmZXIgY29udGFpbmluZyB0aGUgYXVkaW8gZGF0YSwKKyAqIGFuZCBzZXRzICdhdWRpb19sZW4nIHRvIHRoZSBsZW5ndGggb2YgdGhhdCBhdWRpbyBidWZmZXIsIGluIGJ5dGVzLgorICogWW91IG5lZWQgdG8gZnJlZSB0aGUgYXVkaW8gYnVmZmVyIHdpdGggU0RMX0ZyZWVXQVYoKSB3aGVuIHlvdSBhcmUgCisgKiBkb25lIHdpdGggaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIE5VTEwgYW5kIHNldHMgdGhlIFNETCBlcnJvciBtZXNzYWdlIGlmIHRoZSAKKyAqIHdhdmUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLCB1c2VzIGFuIHVua25vd24gZGF0YSBmb3JtYXQsIG9yIGlzIAorICogY29ycnVwdC4gIEN1cnJlbnRseSByYXcgYW5kIE1TLUFEUENNIFdBVkUgZmlsZXMgYXJlIHN1cHBvcnRlZC4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9BdWRpb1NwZWMgKiBTRExDQUxMIFNETF9Mb2FkV0FWX1JXKFNETF9SV29wcyAqc3JjLCBpbnQgZnJlZXNyYywgU0RMX0F1ZGlvU3BlYyAqc3BlYywgVWludDggKiphdWRpb19idWYsIFVpbnQzMiAqYXVkaW9fbGVuKTsKKworLyoqIENvbXBhdGliaWxpdHkgY29udmVuaWVuY2UgZnVuY3Rpb24gLS0gbG9hZHMgYSBXQVYgZnJvbSBhIGZpbGUgKi8KKyNkZWZpbmUgU0RMX0xvYWRXQVYoZmlsZSwgc3BlYywgYXVkaW9fYnVmLCBhdWRpb19sZW4pIFwKKwlTRExfTG9hZFdBVl9SVyhTRExfUldGcm9tRmlsZShmaWxlLCAicmIiKSwxLCBzcGVjLGF1ZGlvX2J1ZixhdWRpb19sZW4pCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBkYXRhIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggU0RMX0xvYWRXQVZfUlcoKQorICovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9GcmVlV0FWKFVpbnQ4ICphdWRpb19idWYpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzb3VyY2UgZm9ybWF0IGFuZCByYXRlIGFuZCBhIGRlc3RpbmF0aW9uIGZvcm1hdAorICogYW5kIHJhdGUsIGFuZCBpbml0aWFsaXplcyB0aGUgJ2N2dCcgc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gbmVlZGVkCisgKiBieSBTRExfQ29udmVydEF1ZGlvKCkgdG8gY29udmVydCBhIGJ1ZmZlciBvZiBhdWRpbyBkYXRhIGZyb20gb25lIGZvcm1hdAorICogdG8gdGhlIG90aGVyLgorICoKKyAqIEByZXR1cm4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9CdWlsZEF1ZGlvQ1ZUKFNETF9BdWRpb0NWVCAqY3Z0LAorCQlVaW50MTYgc3JjX2Zvcm1hdCwgVWludDggc3JjX2NoYW5uZWxzLCBpbnQgc3JjX3JhdGUsCisJCVVpbnQxNiBkc3RfZm9ybWF0LCBVaW50OCBkc3RfY2hhbm5lbHMsIGludCBkc3RfcmF0ZSk7CisKKy8qKgorICogT25jZSB5b3UgaGF2ZSBpbml0aWFsaXplZCB0aGUgJ2N2dCcgc3RydWN0dXJlIHVzaW5nIFNETF9CdWlsZEF1ZGlvQ1ZUKCksCisgKiBjcmVhdGVkIGFuIGF1ZGlvIGJ1ZmZlciBjdnQtPmJ1ZiwgYW5kIGZpbGxlZCBpdCB3aXRoIGN2dC0+bGVuIGJ5dGVzIG9mCisgKiBhdWRpbyBkYXRhIGluIHRoZSBzb3VyY2UgZm9ybWF0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBpdCBpbi1wbGFjZQorICogdG8gdGhlIGRlc2lyZWQgZm9ybWF0LgorICogVGhlIGRhdGEgY29udmVyc2lvbiBtYXkgZXhwYW5kIHRoZSBzaXplIG9mIHRoZSBhdWRpbyBkYXRhLCBzbyB0aGUgYnVmZmVyCisgKiBjdnQtPmJ1ZiBzaG91bGQgYmUgYWxsb2NhdGVkIGFmdGVyIHRoZSBjdnQgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIGJ5CisgKiBTRExfQnVpbGRBdWRpb0NWVCgpLCBhbmQgc2hvdWxkIGJlIGN2dC0+bGVuKmN2dC0+bGVuX211bHQgYnl0ZXMgbG9uZy4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Db252ZXJ0QXVkaW8oU0RMX0F1ZGlvQ1ZUICpjdnQpOworCisKKyNkZWZpbmUgU0RMX01JWF9NQVhWT0xVTUUgMTI4CisvKioKKyAqIFRoaXMgdGFrZXMgdHdvIGF1ZGlvIGJ1ZmZlcnMgb2YgdGhlIHBsYXlpbmcgYXVkaW8gZm9ybWF0IGFuZCBtaXhlcworICogdGhlbSwgcGVyZm9ybWluZyBhZGRpdGlvbiwgdm9sdW1lIGFkanVzdG1lbnQsIGFuZCBvdmVyZmxvdyBjbGlwcGluZy4KKyAqIFRoZSB2b2x1bWUgcmFuZ2VzIGZyb20gMCAtIDEyOCwgYW5kIHNob3VsZCBiZSBzZXQgdG8gU0RMX01JWF9NQVhWT0xVTUUKKyAqIGZvciBmdWxsIGF1ZGlvIHZvbHVtZS4gIE5vdGUgdGhpcyBkb2VzIG5vdCBjaGFuZ2UgaGFyZHdhcmUgdm9sdW1lLgorICogVGhpcyBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2UgLS0geW91IGNhbiBtaXggeW91ciBvd24gYXVkaW8gZGF0YS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfTWl4QXVkaW8oVWludDggKmRzdCwgY29uc3QgVWludDggKnNyYywgVWludDMyIGxlbiwgaW50IHZvbHVtZSk7CisKKy8qKgorICogQG5hbWUgQXVkaW8gTG9ja3MKKyAqIFRoZSBsb2NrIG1hbmlwdWxhdGVkIGJ5IHRoZXNlIGZ1bmN0aW9ucyBwcm90ZWN0cyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisgKiBEdXJpbmcgYSBMb2NrQXVkaW8vVW5sb2NrQXVkaW8gcGFpciwgeW91IGNhbiBiZSBndWFyYW50ZWVkIHRoYXQgdGhlCisgKiBjYWxsYmFjayBmdW5jdGlvbiBpcyBub3QgcnVubmluZy4gIERvIG5vdCBjYWxsIHRoZXNlIGZyb20gdGhlIGNhbGxiYWNrCisgKiBmdW5jdGlvbiBvciB5b3Ugd2lsbCBjYXVzZSBkZWFkbG9jay4KKyAqLworLypAeyovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9Mb2NrQXVkaW8odm9pZCk7CitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9VbmxvY2tBdWRpbyh2b2lkKTsKKy8qQH0qLworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc2h1dHMgZG93biBhdWRpbyBwcm9jZXNzaW5nIGFuZCBjbG9zZXMgdGhlIGF1ZGlvIGRldmljZS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfQ2xvc2VBdWRpbyh2b2lkKTsKKworCisvKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjaW5jbHVkZSAiY2xvc2VfY29kZS5oIgorCisjZW5kaWYgLyogX1NETF9hdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfYnl0ZW9yZGVyLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMzJjMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9ieXRlb3JkZXIuaApAQCAtMCwwICsxLDI5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKioKKyAqICBAZmlsZSBTRExfYnl0ZW9yZGVyLmgKKyAqICBAZGVwcmVjYXRlZCBVc2UgU0RMX2VuZGlhbi5oIGluc3RlYWQKKyAqLworCisvKiBERVBSRUNBVEVEICovCisjaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2Nkcm9tLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY2Ryb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWJiMTlkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2Nkcm9tLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qKgorICogIEBmaWxlIFNETF9jZHJvbS5oCisgKiAgVGhpcyBpcyB0aGUgQ0QtYXVkaW8gY29udHJvbCBBUEkgZm9yIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICovCisKKyNpZm5kZWYgX1NETF9jZHJvbV9oCisjZGVmaW5lIF9TRExfY2Ryb21faAorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorCisjaW5jbHVkZSAiYmVnaW5fY29kZS5oIgorLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIEBmaWxlIFNETF9jZHJvbS5oCisgKiAgSW4gb3JkZXIgdG8gdXNlIHRoZXNlIGZ1bmN0aW9ucywgU0RMX0luaXQoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQKKyAqICB3aXRoIHRoZSBTRExfSU5JVF9DRFJPTSBmbGFnLiAgVGhpcyBjYXVzZXMgU0RMIHRvIHNjYW4gdGhlIHN5c3RlbQorICogIGZvciBDRC1ST00gZHJpdmVzLCBhbmQgbG9hZCBhcHByb3ByaWF0ZSBkcml2ZXJzLgorICovCisKKy8qKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQ0QtUk9NIHRyYWNrcyBvbiBhIGRpc2sgKi8KKyNkZWZpbmUgU0RMX01BWF9UUkFDS1MJOTkKKworLyoqIEBuYW1lIFRyYWNrIFR5cGVzCisgKiAgVGhlIHR5cGVzIG9mIENELVJPTSB0cmFjayBwb3NzaWJsZQorICovCisvKkB7Ki8KKyNkZWZpbmUgU0RMX0FVRElPX1RSQUNLCTB4MDAKKyNkZWZpbmUgU0RMX0RBVEFfVFJBQ0sJMHgwNAorLypAfSovCisKKy8qKiBUaGUgcG9zc2libGUgc3RhdGVzIHdoaWNoIGEgQ0QtUk9NIGRyaXZlIGNhbiBiZSBpbi4gKi8KK3R5cGVkZWYgZW51bSB7CisJQ0RfVFJBWUVNUFRZLAorCUNEX1NUT1BQRUQsCisJQ0RfUExBWUlORywKKwlDRF9QQVVTRUQsCisJQ0RfRVJST1IgPSAtMQorfSBDRHN0YXR1czsKKworLyoqIEdpdmVuIGEgc3RhdHVzLCByZXR1cm5zIHRydWUgaWYgdGhlcmUncyBhIGRpc2sgaW4gdGhlIGRyaXZlICovCisjZGVmaW5lIENEX0lORFJJVkUoc3RhdHVzKQkoKGludCkoc3RhdHVzKSA+IDApCisKK3R5cGVkZWYgc3RydWN0IFNETF9DRHRyYWNrIHsKKwlVaW50OCBpZDsJCS8qKjwgVHJhY2sgbnVtYmVyICovCisJVWludDggdHlwZTsJCS8qKjwgRGF0YSBvciBhdWRpbyB0cmFjayAqLworCVVpbnQxNiB1bnVzZWQ7CisJVWludDMyIGxlbmd0aDsJCS8qKjwgTGVuZ3RoLCBpbiBmcmFtZXMsIG9mIHRoaXMgdHJhY2sgKi8KKwlVaW50MzIgb2Zmc2V0OwkJLyoqPCBPZmZzZXQsIGluIGZyYW1lcywgZnJvbSBzdGFydCBvZiBkaXNrICovCit9IFNETF9DRHRyYWNrOworCisvKiogVGhpcyBzdHJ1Y3R1cmUgaXMgb25seSBjdXJyZW50IGFzIG9mIHRoZSBsYXN0IGNhbGwgdG8gU0RMX0NEU3RhdHVzKCkgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9DRCB7CisJaW50IGlkOwkJCS8qKjwgUHJpdmF0ZSBkcml2ZSBpZGVudGlmaWVyICovCisJQ0RzdGF0dXMgc3RhdHVzOwkvKio8IEN1cnJlbnQgZHJpdmUgc3RhdHVzICovCisKKwkvKiogVGhlIHJlc3Qgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgb25seSB2YWxpZCBpZiB0aGVyZSdzIGEgQ0QgaW4gZHJpdmUgKi8KKyAgICAgICAgLypAeyovCisJaW50IG51bXRyYWNrczsJCS8qKjwgTnVtYmVyIG9mIHRyYWNrcyBvbiBkaXNrICovCisJaW50IGN1cl90cmFjazsJCS8qKjwgQ3VycmVudCB0cmFjayBwb3NpdGlvbiAqLworCWludCBjdXJfZnJhbWU7CQkvKio8IEN1cnJlbnQgZnJhbWUgb2Zmc2V0IHdpdGhpbiBjdXJyZW50IHRyYWNrICovCisJU0RMX0NEdHJhY2sgdHJhY2tbU0RMX01BWF9UUkFDS1MrMV07CisgICAgICAgIC8qQH0qLworfSBTRExfQ0Q7CisKKy8qKiBAbmFtZSBGcmFtZXMgLyBNU0YgQ29udmVyc2lvbiBGdW5jdGlvbnMKKyAqICBDb252ZXJzaW9uIGZ1bmN0aW9ucyBmcm9tIGZyYW1lcyB0byBNaW51dGUvU2Vjb25kL0ZyYW1lcyBhbmQgdmljZSB2ZXJzYQorICovCisvKkB7Ki8KKyNkZWZpbmUgQ0RfRlBTCTc1CisjZGVmaW5lIEZSQU1FU19UT19NU0YoZiwgTSxTLEYpCXsJCQkJCVwKKwlpbnQgdmFsdWUgPSBmOwkJCQkJCQlcCisJKihGKSA9IHZhbHVlJUNEX0ZQUzsJCQkJCQlcCisJdmFsdWUgLz0gQ0RfRlBTOwkJCQkJCVwKKwkqKFMpID0gdmFsdWUlNjA7CQkJCQkJXAorCXZhbHVlIC89IDYwOwkJCQkJCQlcCisJKihNKSA9IHZhbHVlOwkJCQkJCQlcCit9CisjZGVmaW5lIE1TRl9UT19GUkFNRVMoTSwgUywgRikJKChNKSo2MCpDRF9GUFMrKFMpKkNEX0ZQUysoRikpCisvKkB9Ki8KKworLyogQ0QtYXVkaW8gQVBJIGZ1bmN0aW9uczogKi8KKworLyoqCisgKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgb24gdGhlIHN5c3RlbSwgb3IgLTEgaWYKKyAqICBTRExfSW5pdCgpIGhhcyBub3QgYmVlbiBjYWxsZWQgd2l0aCB0aGUgU0RMX0lOSVRfQ0RST00gZmxhZy4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9DRE51bURyaXZlcyh2b2lkKTsKKworLyoqCisgKiAgUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlLCBzeXN0ZW0tZGVwZW5kZW50IGlkZW50aWZpZXIgZm9yIHRoZSBDRC1ST00uCisgKiAgRXhhbXBsZToKKyAqICAgLSAiL2Rldi9jZHJvbSIKKyAqICAgLSAiRToiCisgKiAgIC0gIi9kZXYvZGlzay9pZGUvMS9tYXN0ZXIiCisgKi8KK2V4dGVybiBERUNMU1BFQyBjb25zdCBjaGFyICogU0RMQ0FMTCBTRExfQ0ROYW1lKGludCBkcml2ZSk7CisKKy8qKgorICogIE9wZW5zIGEgQ0QtUk9NIGRyaXZlIGZvciBhY2Nlc3MuICBJdCByZXR1cm5zIGEgZHJpdmUgaGFuZGxlIG9uIHN1Y2Nlc3MsCisgKiAgb3IgTlVMTCBpZiB0aGUgZHJpdmUgd2FzIGludmFsaWQgb3IgYnVzeS4gIFRoaXMgbmV3bHkgb3BlbmVkIENELVJPTQorICogIGJlY29tZXMgdGhlIGRlZmF1bHQgQ0QgdXNlZCB3aGVuIG90aGVyIENEIGZ1bmN0aW9ucyBhcmUgcGFzc2VkIGEgTlVMTAorICogIENELVJPTSBoYW5kbGUuCisgKiAgRHJpdmVzIGFyZSBudW1iZXJlZCBzdGFydGluZyB3aXRoIDAuICBEcml2ZSAwIGlzIHRoZSBzeXN0ZW0gZGVmYXVsdCBDRC1ST00uCisgKi8KK2V4dGVybiBERUNMU1BFQyBTRExfQ0QgKiBTRExDQUxMIFNETF9DRE9wZW4oaW50IGRyaXZlKTsKKworLyoqCisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZ2l2ZW4gZHJpdmUuCisgKiAgSWYgdGhlIGRyaXZlIGhhcyBhIENEIGluIGl0LCB0aGUgdGFibGUgb2YgY29udGVudHMgb2YgdGhlIENEIGFuZCBjdXJyZW50CisgKiAgcGxheSBwb3NpdGlvbiBvZiB0aGUgQ0Qgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIFNETF9DRCBzdHJ1Y3R1cmUuCisgKi8KK2V4dGVybiBERUNMU1BFQyBDRHN0YXR1cyBTRExDQUxMIFNETF9DRFN0YXR1cyhTRExfQ0QgKmNkcm9tKTsKKworLyoqCisgKiAgUGxheSB0aGUgZ2l2ZW4gQ0Qgc3RhcnRpbmcgYXQgJ3N0YXJ0X3RyYWNrJyBhbmQgJ3N0YXJ0X2ZyYW1lJyBmb3IgJ250cmFja3MnCisgKiAgdHJhY2tzIGFuZCAnbmZyYW1lcycgZnJhbWVzLiAgSWYgYm90aCAnbnRyYWNrJyBhbmQgJ25mcmFtZScgYXJlIDAsIHBsYXkgCisgKiAgdW50aWwgdGhlIGVuZCBvZiB0aGUgQ0QuICBUaGlzIGZ1bmN0aW9uIHdpbGwgc2tpcCBkYXRhIHRyYWNrcy4KKyAqICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIFNETF9DRFN0YXR1cygpIHRvIAorICogIGdldCB0cmFjayBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQ0QuCisgKiAgRm9yIGV4YW1wbGU6CisgKiAgICAgIEBjb2RlCisgKgkvLyBQbGF5IGVudGlyZSBDRDoKKyAqCWlmICggQ0RfSU5EUklWRShTRExfQ0RTdGF0dXMoY2Ryb20pKSApCisgKgkJU0RMX0NEUGxheVRyYWNrcyhjZHJvbSwgMCwgMCwgMCwgMCk7CisgKgkvLyBQbGF5IGxhc3QgdHJhY2s6CisgKglpZiAoIENEX0lORFJJVkUoU0RMX0NEU3RhdHVzKGNkcm9tKSkgKSB7CisgKgkJU0RMX0NEUGxheVRyYWNrcyhjZHJvbSwgY2Ryb20tPm51bXRyYWNrcy0xLCAwLCAwLCAwKTsKKyAqCX0KKyAqCS8vIFBsYXkgZmlyc3QgYW5kIHNlY29uZCB0cmFjayBhbmQgMTAgc2Vjb25kcyBvZiB0aGlyZCB0cmFjazoKKyAqCWlmICggQ0RfSU5EUklWRShTRExfQ0RTdGF0dXMoY2Ryb20pKSApCisgKgkJU0RMX0NEUGxheVRyYWNrcyhjZHJvbSwgMCwgMCwgMiwgMTApOworICogICAgICBAZW5kY29kZQorICoKKyAqICBAcmV0dXJuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLCBvciAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfQ0RQbGF5VHJhY2tzKFNETF9DRCAqY2Ryb20sCisJCWludCBzdGFydF90cmFjaywgaW50IHN0YXJ0X2ZyYW1lLCBpbnQgbnRyYWNrcywgaW50IG5mcmFtZXMpOworCisvKioKKyAqICBQbGF5IHRoZSBnaXZlbiBDRCBzdGFydGluZyBhdCAnc3RhcnQnIGZyYW1lIGZvciAnbGVuZ3RoJyBmcmFtZXMuCisgKiAgQHJldHVybiBJdCByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKKworLyoqIFBhdXNlIHBsYXkKKyAqICBAcmV0dXJuIHJldHVybnMgMCwgb3IgLTEgb24gZXJyb3IKKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9DRFBhdXNlKFNETF9DRCAqY2Ryb20pOworCisvKiogUmVzdW1lIHBsYXkKKyAqICBAcmV0dXJuIHJldHVybnMgMCwgb3IgLTEgb24gZXJyb3IKKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKKworLyoqIFN0b3AgcGxheQorICogIEByZXR1cm4gcmV0dXJucyAwLCBvciAtMSBvbiBlcnJvcgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NEU3RvcChTRExfQ0QgKmNkcm9tKTsKKworLyoqIEVqZWN0IENELVJPTQorICogIEByZXR1cm4gcmV0dXJucyAwLCBvciAtMSBvbiBlcnJvcgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NERWplY3QoU0RMX0NEICpjZHJvbSk7CisKKy8qKiBDbG9zZXMgdGhlIGhhbmRsZSBmb3IgdGhlIENELVJPTSBkcml2ZSAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKKworCisvKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjaW5jbHVkZSAiY2xvc2VfY29kZS5oIgorCisjZW5kaWYgLyogX1NETF92aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnLmguZGVmYXVsdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9jb25maWcuaC5kZWZhdWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YmEzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnLmguZGVmYXVsdApAQCAtMCwwICsxLDQ1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisjaWZuZGVmIF9TRExfY29uZmlnX2gKKyNkZWZpbmUgX1NETF9jb25maWdfaAorCisjaW5jbHVkZSAiU0RMX3BsYXRmb3JtLmgiCisKKy8qIEFkZCBhbnkgcGxhdGZvcm0gdGhhdCBkb2Vzbid0IGJ1aWxkIHVzaW5nIHRoZSBjb25maWd1cmUgc3lzdGVtICovCisjaWYgZGVmaW5lZChfX0RSRUFNQ0FTVF9fKQorI2luY2x1ZGUgIlNETF9jb25maWdfZHJlYW1jYXN0LmgiCisjZWxpZiBkZWZpbmVkKF9fTUFDT1NfXykKKyNpbmNsdWRlICJTRExfY29uZmlnX21hY29zLmgiCisjZWxpZiBkZWZpbmVkKF9fTUFDT1NYX18pCisjaW5jbHVkZSAiU0RMX2NvbmZpZ19tYWNvc3guaCIKKyNlbGlmIGRlZmluZWQoX19TWU1CSUFOMzJfXykKKyNpbmNsdWRlICJTRExfY29uZmlnX3N5bWJpYW4uaCIgIC8qIG11c3QgYmUgYmVmb3JlIHdpbjMyISAqLworI2VsaWYgZGVmaW5lZChfX1dJTjMyX18pCisjaW5jbHVkZSAiU0RMX2NvbmZpZ193aW4zMi5oIgorI2VsaWYgZGVmaW5lZChfX09TMl9fKQorI2luY2x1ZGUgIlNETF9jb25maWdfb3MyLmgiCisjZWxzZQorI2luY2x1ZGUgIlNETF9jb25maWdfbWluaW1hbC5oIgorI2VuZGlmIC8qIHBsYXRmb3JtIGNvbmZpZyAqLworCisjZW5kaWYgLyogX1NETF9jb25maWdfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZy5oLmluIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjE3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnLmguaW4KQEAgLTAsMCArMSwzMTIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKyNpZm5kZWYgX1NETF9jb25maWdfaAorI2RlZmluZSBfU0RMX2NvbmZpZ19oCisKKy8qIFRoaXMgaXMgYSBzZXQgb2YgZGVmaW5lcyB0byBjb25maWd1cmUgdGhlIFNETCBmZWF0dXJlcyAqLworCisvKiBHZW5lcmFsIHBsYXRmb3JtIHNwZWNpZmljIGlkZW50aWZpZXJzICovCisjaW5jbHVkZSAiU0RMX3BsYXRmb3JtLmgiCisKKy8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXNuJ3QgaW5jbHVkZWQgYnkgVmlzdWFsIEMrKyAqLworI2lmZGVmIF9NU0NfVkVSCisjZXJyb3IgWW91IHNob3VsZCBjb3B5IGluY2x1ZGUvU0RMX2NvbmZpZy5oLmRlZmF1bHQgdG8gaW5jbHVkZS9TRExfY29uZmlnLmgKKyNlbmRpZgorCisvKiBDIGxhbmd1YWdlIGZlYXR1cmVzICovCisjdW5kZWYgY29uc3QKKyN1bmRlZiBpbmxpbmUKKyN1bmRlZiB2b2xhdGlsZQorCisvKiBDIGRhdGF0eXBlcyAqLworI3VuZGVmIHNpemVfdAorI3VuZGVmIGludDhfdAorI3VuZGVmIHVpbnQ4X3QKKyN1bmRlZiBpbnQxNl90CisjdW5kZWYgdWludDE2X3QKKyN1bmRlZiBpbnQzMl90CisjdW5kZWYgdWludDMyX3QKKyN1bmRlZiBpbnQ2NF90CisjdW5kZWYgdWludDY0X3QKKyN1bmRlZiB1aW50cHRyX3QKKyN1bmRlZiBTRExfSEFTXzY0QklUX1RZUEUKKworLyogRW5kaWFubmVzcyAqLworI3VuZGVmIFNETF9CWVRFT1JERVIKKworLyogQ29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGhvdXQgYW55IEMgbGlicmFyeSByZXF1aXJlbWVudHMgKi8KKyN1bmRlZiBIQVZFX0xJQkMKKyNpZiBIQVZFX0xJQkMKKworLyogVXNlZnVsIGhlYWRlcnMgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisjdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAorI3VuZGVmIEhBVkVfU1RESU9fSAorI3VuZGVmIFNURENfSEVBREVSUworI3VuZGVmIEhBVkVfU1RETElCX0gKKyN1bmRlZiBIQVZFX1NUREFSR19ICisjdW5kZWYgSEFWRV9NQUxMT0NfSAorI3VuZGVmIEhBVkVfTUVNT1JZX0gKKyN1bmRlZiBIQVZFX1NUUklOR19ICisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKyN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKKyN1bmRlZiBIQVZFX1NURElOVF9ICisjdW5kZWYgSEFWRV9DVFlQRV9ICisjdW5kZWYgSEFWRV9NQVRIX0gKKyN1bmRlZiBIQVZFX0lDT05WX0gKKyN1bmRlZiBIQVZFX1NJR05BTF9ICisjdW5kZWYgSEFWRV9BTFRJVkVDX0gKKworLyogQyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLworI3VuZGVmIEhBVkVfTUFMTE9DCisjdW5kZWYgSEFWRV9DQUxMT0MKKyN1bmRlZiBIQVZFX1JFQUxMT0MKKyN1bmRlZiBIQVZFX0ZSRUUKKyN1bmRlZiBIQVZFX0FMTE9DQQorI2lmbmRlZiBfV0lOMzIgLyogRG9uJ3QgdXNlIEMgcnVudGltZSB2ZXJzaW9ucyBvZiB0aGVzZSBvbiBXaW5kb3dzICovCisjdW5kZWYgSEFWRV9HRVRFTlYKKyN1bmRlZiBIQVZFX1BVVEVOVgorI3VuZGVmIEhBVkVfVU5TRVRFTlYKKyNlbmRpZgorI3VuZGVmIEhBVkVfUVNPUlQKKyN1bmRlZiBIQVZFX0FCUworI3VuZGVmIEhBVkVfQkNPUFkKKyN1bmRlZiBIQVZFX01FTVNFVAorI3VuZGVmIEhBVkVfTUVNQ1BZCisjdW5kZWYgSEFWRV9NRU1NT1ZFCisjdW5kZWYgSEFWRV9NRU1DTVAKKyN1bmRlZiBIQVZFX1NUUkxFTgorI3VuZGVmIEhBVkVfU1RSTENQWQorI3VuZGVmIEhBVkVfU1RSTENBVAorI3VuZGVmIEhBVkVfU1RSRFVQCisjdW5kZWYgSEFWRV9fU1RSUkVWCisjdW5kZWYgSEFWRV9fU1RSVVBSCisjdW5kZWYgSEFWRV9fU1RSTFdSCisjdW5kZWYgSEFWRV9JTkRFWAorI3VuZGVmIEhBVkVfUklOREVYCisjdW5kZWYgSEFWRV9TVFJDSFIKKyN1bmRlZiBIQVZFX1NUUlJDSFIKKyN1bmRlZiBIQVZFX1NUUlNUUgorI3VuZGVmIEhBVkVfSVRPQQorI3VuZGVmIEhBVkVfX0xUT0EKKyN1bmRlZiBIQVZFX19VSVRPQQorI3VuZGVmIEhBVkVfX1VMVE9BCisjdW5kZWYgSEFWRV9TVFJUT0wKKyN1bmRlZiBIQVZFX1NUUlRPVUwKKyN1bmRlZiBIQVZFX19JNjRUT0EKKyN1bmRlZiBIQVZFX19VSTY0VE9BCisjdW5kZWYgSEFWRV9TVFJUT0xMCisjdW5kZWYgSEFWRV9TVFJUT1VMTAorI3VuZGVmIEhBVkVfU1RSVE9ECisjdW5kZWYgSEFWRV9BVE9JCisjdW5kZWYgSEFWRV9BVE9GCisjdW5kZWYgSEFWRV9TVFJDTVAKKyN1bmRlZiBIQVZFX1NUUk5DTVAKKyN1bmRlZiBIQVZFX19TVFJJQ01QCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisjdW5kZWYgSEFWRV9fU1RSTklDTVAKKyN1bmRlZiBIQVZFX1NUUk5DQVNFQ01QCisjdW5kZWYgSEFWRV9TU0NBTkYKKyN1bmRlZiBIQVZFX1NOUFJJTlRGCisjdW5kZWYgSEFWRV9WU05QUklOVEYKKyN1bmRlZiBIQVZFX0lDT05WCisjdW5kZWYgSEFWRV9TSUdBQ1RJT04KKyN1bmRlZiBIQVZFX1NBX1NJR0FDVElPTgorI3VuZGVmIEhBVkVfU0VUSk1QCisjdW5kZWYgSEFWRV9OQU5PU0xFRVAKKyN1bmRlZiBIQVZFX0NMT0NLX0dFVFRJTUUKKyN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCisjdW5kZWYgSEFWRV9NUFJPVEVDVAorI3VuZGVmIEhBVkVfU0VNX1RJTUVEV0FJVAorCisjZWxzZQorLyogV2UgbWF5IG5lZWQgc29tZSByZXBsYWNlbWVudCBmb3Igc3RkYXJnLmggaGVyZSAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2VuZGlmIC8qIEhBVkVfTElCQyAqLworCisvKiBBbGxvdyBkaXNhYmxpbmcgb2YgY29yZSBzdWJzeXN0ZW1zICovCisjdW5kZWYgU0RMX0FVRElPX0RJU0FCTEVECisjdW5kZWYgU0RMX0NEUk9NX0RJU0FCTEVECisjdW5kZWYgU0RMX0NQVUlORk9fRElTQUJMRUQKKyN1bmRlZiBTRExfRVZFTlRTX0RJU0FCTEVECisjdW5kZWYgU0RMX0ZJTEVfRElTQUJMRUQKKyN1bmRlZiBTRExfSk9ZU1RJQ0tfRElTQUJMRUQKKyN1bmRlZiBTRExfTE9BRFNPX0RJU0FCTEVECisjdW5kZWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKKyN1bmRlZiBTRExfVElNRVJTX0RJU0FCTEVECisjdW5kZWYgU0RMX1ZJREVPX0RJU0FCTEVECisKKy8qIEVuYWJsZSB2YXJpb3VzIGF1ZGlvIGRyaXZlcnMgKi8KKyN1bmRlZiBTRExfQVVESU9fRFJJVkVSX0FMU0EKKyN1bmRlZiBTRExfQVVESU9fRFJJVkVSX0FMU0FfRFlOQU1JQworI3VuZGVmIFNETF9BVURJT19EUklWRVJfQVJUUworI3VuZGVmIFNETF9BVURJT19EUklWRVJfQVJUU19EWU5BTUlDCisjdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9CQVVESU8KKyN1bmRlZiBTRExfQVVESU9fRFJJVkVSX0JTRAorI3VuZGVmIFNETF9BVURJT19EUklWRVJfQ09SRUFVRElPCisjdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9EQVJUCisjdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9EQworI3VuZGVmIFNETF9BVURJT19EUklWRVJfRElTSworI3VuZGVmIFNETF9BVURJT19EUklWRVJfRFVNTVkKKyN1bmRlZiBTRExfQVVESU9fRFJJVkVSX0RNRURJQQorI3VuZGVmIFNETF9BVURJT19EUklWRVJfRFNPVU5ECisjdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9QVUxTRQorI3VuZGVmIFNETF9BVURJT19EUklWRVJfUFVMU0VfRFlOQU1JQworI3VuZGVmIFNETF9BVURJT19EUklWRVJfRVNECisjdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9FU0RfRFlOQU1JQworI3VuZGVmIFNETF9BVURJT19EUklWRVJfTUlOVAorI3VuZGVmIFNETF9BVURJT19EUklWRVJfTU1FQVVESU8KKyN1bmRlZiBTRExfQVVESU9fRFJJVkVSX05BUworI3VuZGVmIFNETF9BVURJT19EUklWRVJfTkFTX0RZTkFNSUMKKyN1bmRlZiBTRExfQVVESU9fRFJJVkVSX09TUworI3VuZGVmIFNETF9BVURJT19EUklWRVJfT1NTX1NPVU5EQ0FSRF9ICisjdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9QQVVECisjdW5kZWYgU0RMX0FVRElPX0RSSVZFUl9RTlhOVE8KKyN1bmRlZiBTRExfQVVESU9fRFJJVkVSX1NORE1HUgorI3VuZGVmIFNETF9BVURJT19EUklWRVJfU1VOQVVESU8KKyN1bmRlZiBTRExfQVVESU9fRFJJVkVSX1dBVkVPVVQKKworLyogRW5hYmxlIHZhcmlvdXMgY2Ryb20gZHJpdmVycyAqLworI3VuZGVmIFNETF9DRFJPTV9BSVgKKyN1bmRlZiBTRExfQ0RST01fQkVPUworI3VuZGVmIFNETF9DRFJPTV9CU0RJCisjdW5kZWYgU0RMX0NEUk9NX0RDCisjdW5kZWYgU0RMX0NEUk9NX0RVTU1ZCisjdW5kZWYgU0RMX0NEUk9NX0ZSRUVCU0QKKyN1bmRlZiBTRExfQ0RST01fTElOVVgKKyN1bmRlZiBTRExfQ0RST01fTUFDT1MKKyN1bmRlZiBTRExfQ0RST01fTUFDT1NYCisjdW5kZWYgU0RMX0NEUk9NX01JTlQKKyN1bmRlZiBTRExfQ0RST01fT1BFTkJTRAorI3VuZGVmIFNETF9DRFJPTV9PUzIKKyN1bmRlZiBTRExfQ0RST01fT1NGCisjdW5kZWYgU0RMX0NEUk9NX1FOWAorI3VuZGVmIFNETF9DRFJPTV9XSU4zMgorCisvKiBFbmFibGUgdmFyaW91cyBpbnB1dCBkcml2ZXJzICovCisjdW5kZWYgU0RMX0lOUFVUX0xJTlVYRVYKKyN1bmRlZiBTRExfSU5QVVRfVFNMSUIKKyN1bmRlZiBTRExfSk9ZU1RJQ0tfQkVPUworI3VuZGVmIFNETF9KT1lTVElDS19EQworI3VuZGVmIFNETF9KT1lTVElDS19EVU1NWQorI3VuZGVmIFNETF9KT1lTVElDS19JT0tJVAorI3VuZGVmIFNETF9KT1lTVElDS19MSU5VWAorI3VuZGVmIFNETF9KT1lTVElDS19NQUNPUworI3VuZGVmIFNETF9KT1lTVElDS19NSU5UCisjdW5kZWYgU0RMX0pPWVNUSUNLX09TMgorI3VuZGVmIFNETF9KT1lTVElDS19SSVNDT1MKKyN1bmRlZiBTRExfSk9ZU1RJQ0tfV0lOTU0KKyN1bmRlZiBTRExfSk9ZU1RJQ0tfVVNCSElECisjdW5kZWYgU0RMX0pPWVNUSUNLX1VTQkhJRF9NQUNISU5FX0pPWVNUSUNLX0gKKworLyogRW5hYmxlIHZhcmlvdXMgc2hhcmVkIG9iamVjdCBsb2FkaW5nIHN5c3RlbXMgKi8KKyN1bmRlZiBTRExfTE9BRFNPX0JFT1MKKyN1bmRlZiBTRExfTE9BRFNPX0RMQ09NUEFUCisjdW5kZWYgU0RMX0xPQURTT19ETE9QRU4KKyN1bmRlZiBTRExfTE9BRFNPX0RVTU1ZCisjdW5kZWYgU0RMX0xPQURTT19MREcKKyN1bmRlZiBTRExfTE9BRFNPX01BQ09TCisjdW5kZWYgU0RMX0xPQURTT19PUzIKKyN1bmRlZiBTRExfTE9BRFNPX1dJTjMyCisKKy8qIEVuYWJsZSB2YXJpb3VzIHRocmVhZGluZyBzeXN0ZW1zICovCisjdW5kZWYgU0RMX1RIUkVBRF9CRU9TCisjdW5kZWYgU0RMX1RIUkVBRF9EQworI3VuZGVmIFNETF9USFJFQURfT1MyCisjdW5kZWYgU0RMX1RIUkVBRF9QVEgKKyN1bmRlZiBTRExfVEhSRUFEX1BUSFJFQUQKKyN1bmRlZiBTRExfVEhSRUFEX1BUSFJFQURfUkVDVVJTSVZFX01VVEVYCisjdW5kZWYgU0RMX1RIUkVBRF9QVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9OUAorI3VuZGVmIFNETF9USFJFQURfU1BST0MKKyN1bmRlZiBTRExfVEhSRUFEX1dJTjMyCisKKy8qIEVuYWJsZSB2YXJpb3VzIHRpbWVyIHN5c3RlbXMgKi8KKyN1bmRlZiBTRExfVElNRVJfQkVPUworI3VuZGVmIFNETF9USU1FUl9EQworI3VuZGVmIFNETF9USU1FUl9EVU1NWQorI3VuZGVmIFNETF9USU1FUl9NQUNPUworI3VuZGVmIFNETF9USU1FUl9NSU5UCisjdW5kZWYgU0RMX1RJTUVSX09TMgorI3VuZGVmIFNETF9USU1FUl9SSVNDT1MKKyN1bmRlZiBTRExfVElNRVJfVU5JWAorI3VuZGVmIFNETF9USU1FUl9XSU4zMgorI3VuZGVmIFNETF9USU1FUl9XSU5DRQorCisvKiBFbmFibGUgdmFyaW91cyB2aWRlbyBkcml2ZXJzICovCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9BQUxJQgorI3VuZGVmIFNETF9WSURFT19EUklWRVJfQldJTkRPVworI3VuZGVmIFNETF9WSURFT19EUklWRVJfQ0FDQQorI3VuZGVmIFNETF9WSURFT19EUklWRVJfREMKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX0REUkFXCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9ER0EKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX0RJUkVDVEZCCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9EUkFXU1BST0NLRVQKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX0RVTU1ZCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9GQkNPTgorI3VuZGVmIFNETF9WSURFT19EUklWRVJfR0FQSQorI3VuZGVmIFNETF9WSURFT19EUklWRVJfR0VNCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9HR0kKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX0lQT0QKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX05BTk9YCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9PUzJGUworI3VuZGVmIFNETF9WSURFT19EUklWRVJfUEhPVE9OCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9QSUNPR1VJCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9QUzJHUworI3VuZGVmIFNETF9WSURFT19EUklWRVJfUFMzCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9RVE9QSUEKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX1FVQVJUWgorI3VuZGVmIFNETF9WSURFT19EUklWRVJfUklTQ09TCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9TVkdBTElCCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9UT09MQk9YCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9WR0wKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX1dJTkRJQgorI3VuZGVmIFNETF9WSURFT19EUklWRVJfV1NDT05TCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTEKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9ER0FNT1VTRQorI3VuZGVmIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUMKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hFWFQKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSQU5EUgorI3VuZGVmIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWFJFTkRFUgorI3VuZGVmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKKyN1bmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQorI3VuZGVmIFNETF9WSURFT19EUklWRVJfWDExX1hNRQorI3VuZGVmIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUgorI3VuZGVmIFNETF9WSURFT19EUklWRVJfWDExX1hWCisjdW5kZWYgU0RMX1ZJREVPX0RSSVZFUl9YQklPUworCisvKiBFbmFibGUgT3BlbkdMIHN1cHBvcnQgKi8KKyN1bmRlZiBTRExfVklERU9fT1BFTkdMCisjdW5kZWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKKyN1bmRlZiBTRExfVklERU9fT1BFTkdMX1dHTAorI3VuZGVmIFNETF9WSURFT19PUEVOR0xfT1NNRVNBCisjdW5kZWYgU0RMX1ZJREVPX09QRU5HTF9PU01FU0FfRFlOQU1JQworCisvKiBEaXNhYmxlIHNjcmVlbnNhdmVyICovCisjdW5kZWYgU0RMX1ZJREVPX0RJU0FCTEVfU0NSRUVOU0FWRVIKKworLyogRW5hYmxlIGFzc2VtYmx5IHJvdXRpbmVzICovCisjdW5kZWYgU0RMX0FTU0VNQkxZX1JPVVRJTkVTCisjdW5kZWYgU0RMX0hFUk1FU19CTElUVEVSUworI3VuZGVmIFNETF9BTFRJVkVDX0JMSVRURVJTCisKKyNlbmRpZiAvKiBfU0RMX2NvbmZpZ19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnX2RyZWFtY2FzdC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZ19kcmVhbWNhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjAzMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZ19kcmVhbWNhc3QuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworI2lmbmRlZiBfU0RMX2NvbmZpZ19kcmVhbWNhc3RfaAorI2RlZmluZSBfU0RMX2NvbmZpZ19kcmVhbWNhc3RfaAorCisjaW5jbHVkZSAiU0RMX3BsYXRmb3JtLmgiCisKKy8qIFRoaXMgaXMgYSBzZXQgb2YgZGVmaW5lcyB0byBjb25maWd1cmUgdGhlIFNETCBmZWF0dXJlcyAqLworCit0eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50cHRyX3Q7CisjZGVmaW5lIFNETF9IQVNfNjRCSVRfVFlQRQkxCisKKy8qIFVzZWZ1bCBoZWFkZXJzICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0gJMQorI2RlZmluZSBIQVZFX1NURElPX0gJMQorI2RlZmluZSBTVERDX0hFQURFUlMJMQorI2RlZmluZSBIQVZFX1NUUklOR19ICTEKKyNkZWZpbmUgSEFWRV9DVFlQRV9ICTEKKworLyogQyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLworI2RlZmluZSBIQVZFX01BTExPQwkxCisjZGVmaW5lIEhBVkVfQ0FMTE9DCTEKKyNkZWZpbmUgSEFWRV9SRUFMTE9DCTEKKyNkZWZpbmUgSEFWRV9GUkVFCTEKKyNkZWZpbmUgSEFWRV9BTExPQ0EJMQorI2RlZmluZSBIQVZFX0dFVEVOVgkxCisjZGVmaW5lIEhBVkVfUFVURU5WCTEKKyNkZWZpbmUgSEFWRV9RU09SVAkxCisjZGVmaW5lIEhBVkVfQUJTCTEKKyNkZWZpbmUgSEFWRV9CQ09QWQkxCisjZGVmaW5lIEhBVkVfTUVNU0VUCTEKKyNkZWZpbmUgSEFWRV9NRU1DUFkJMQorI2RlZmluZSBIQVZFX01FTU1PVkUJMQorI2RlZmluZSBIQVZFX01FTUNNUAkxCisjZGVmaW5lIEhBVkVfU1RSTEVOCTEKKyNkZWZpbmUgSEFWRV9TVFJEVVAJMQorI2RlZmluZSBIQVZFX0lOREVYCTEKKyNkZWZpbmUgSEFWRV9SSU5ERVgJMQorI2RlZmluZSBIQVZFX1NUUkNIUgkxCisjZGVmaW5lIEhBVkVfU1RSUkNIUgkxCisjZGVmaW5lIEhBVkVfU1RSU1RSCTEKKyNkZWZpbmUgSEFWRV9TVFJUT0wJMQorI2RlZmluZSBIQVZFX1NUUlRPRAkxCisjZGVmaW5lIEhBVkVfQVRPSQkxCisjZGVmaW5lIEhBVkVfQVRPRgkxCisjZGVmaW5lIEhBVkVfU1RSQ01QCTEKKyNkZWZpbmUgSEFWRV9TVFJOQ01QCTEKKyNkZWZpbmUgSEFWRV9TVFJJQ01QCTEKKyNkZWZpbmUgSEFWRV9TVFJDQVNFQ01QCTEKKyNkZWZpbmUgSEFWRV9TU0NBTkYJMQorI2RlZmluZSBIQVZFX1NOUFJJTlRGCTEKKyNkZWZpbmUgSEFWRV9WU05QUklOVEYJMQorCisvKiBFbmFibGUgdmFyaW91cyBhdWRpbyBkcml2ZXJzICovCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfREMJMQorI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX0RJU0sJMQorI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX0RVTU1ZCTEKKworLyogRW5hYmxlIHZhcmlvdXMgY2Ryb20gZHJpdmVycyAqLworI2RlZmluZSBTRExfQ0RST01fREMJMQorCisvKiBFbmFibGUgdmFyaW91cyBpbnB1dCBkcml2ZXJzICovCisjZGVmaW5lIFNETF9KT1lTVElDS19EQwkxCisKKy8qIEVuYWJsZSB2YXJpb3VzIHNoYXJlZCBvYmplY3QgbG9hZGluZyBzeXN0ZW1zICovCisjZGVmaW5lIFNETF9MT0FEU09fRFVNTVkJMQorCisvKiBFbmFibGUgdmFyaW91cyB0aHJlYWRpbmcgc3lzdGVtcyAqLworI2RlZmluZSBTRExfVEhSRUFEX0RDCTEKKworLyogRW5hYmxlIHZhcmlvdXMgdGltZXIgc3lzdGVtcyAqLworI2RlZmluZSBTRExfVElNRVJfREMJMQorCisvKiBFbmFibGUgdmFyaW91cyB2aWRlbyBkcml2ZXJzICovCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfREMJMQorI2RlZmluZSBTRExfVklERU9fRFJJVkVSX0RVTU1ZCTEKKworI2VuZGlmIC8qIF9TRExfY29uZmlnX2RyZWFtY2FzdF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnX21hY29zLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnX21hY29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMTcxNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9jb25maWdfbWFjb3MuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworI2lmbmRlZiBfU0RMX2NvbmZpZ19tYWNvc19oCisjZGVmaW5lIF9TRExfY29uZmlnX21hY29zX2gKKworI2luY2x1ZGUgIlNETF9wbGF0Zm9ybS5oIgorCisvKiBUaGlzIGlzIGEgc2V0IG9mIGRlZmluZXMgdG8gY29uZmlndXJlIHRoZSBTREwgZmVhdHVyZXMgKi8KKworI2luY2x1ZGUgPE1hY1R5cGVzLmg+CisKK3R5cGVkZWYgU0ludDgJaW50OF90OwordHlwZWRlZiBVSW50OAl1aW50OF90OwordHlwZWRlZiBTSW50MTYJaW50MTZfdDsKK3R5cGVkZWYgVUludDE2CXVpbnQxNl90OwordHlwZWRlZiBTSW50MzIJaW50MzJfdDsKK3R5cGVkZWYgVUludDMyCXVpbnQzMl90OwordHlwZWRlZiBTSW50NjQJaW50NjRfdDsKK3R5cGVkZWYgVUludDY0CXVpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCXVpbnRwdHJfdDsKKworI2RlZmluZSBTRExfSEFTXzY0QklUX1RZUEUJMQorCisvKiBVc2VmdWwgaGVhZGVycyAqLworI2RlZmluZSBIQVZFX1NURElPX0gJMQorI2RlZmluZSBTVERDX0hFQURFUlMJMQorI2RlZmluZSBIQVZFX1NUUklOR19ICTEKKyNkZWZpbmUgSEFWRV9DVFlQRV9ICTEKKyNkZWZpbmUgSEFWRV9NQVRIX0gJMQorI2RlZmluZSBIQVZFX1NJR05BTF9ICTEKKworLyogQyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLworI2RlZmluZSBIQVZFX01BTExPQwkxCisjZGVmaW5lIEhBVkVfQ0FMTE9DCTEKKyNkZWZpbmUgSEFWRV9SRUFMTE9DCTEKKyNkZWZpbmUgSEFWRV9GUkVFCTEKKyNkZWZpbmUgSEFWRV9BTExPQ0EJMQorI2RlZmluZSBIQVZFX0FCUwkxCisjZGVmaW5lIEhBVkVfTUVNU0VUCTEKKyNkZWZpbmUgSEFWRV9NRU1DUFkJMQorI2RlZmluZSBIQVZFX01FTU1PVkUJMQorI2RlZmluZSBIQVZFX01FTUNNUAkxCisjZGVmaW5lIEhBVkVfU1RSTEVOCTEKKyNkZWZpbmUgSEFWRV9TVFJDSFIJMQorI2RlZmluZSBIQVZFX1NUUlJDSFIJMQorI2RlZmluZSBIQVZFX1NUUlNUUgkxCisjZGVmaW5lIEhBVkVfSVRPQQkxCisjZGVmaW5lIEhBVkVfU1RSVE9MCTEKKyNkZWZpbmUgSEFWRV9TVFJUT0QJMQorI2RlZmluZSBIQVZFX0FUT0kJMQorI2RlZmluZSBIQVZFX0FUT0YJMQorI2RlZmluZSBIQVZFX1NUUkNNUAkxCisjZGVmaW5lIEhBVkVfU1RSTkNNUAkxCisjZGVmaW5lIEhBVkVfU1NDQU5GCTEKKworLyogRW5hYmxlIHZhcmlvdXMgYXVkaW8gZHJpdmVycyAqLworI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX1NORE1HUgkxCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfRElTSwkxCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfRFVNTVkJMQorCisvKiBFbmFibGUgdmFyaW91cyBjZHJvbSBkcml2ZXJzICovCisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisjZGVmaW5lIFNETF9DRFJPTV9EVU1NWQkJMQorI2Vsc2UKKyNkZWZpbmUgU0RMX0NEUk9NX01BQ09TCQkxCisjZW5kaWYKKworLyogRW5hYmxlIHZhcmlvdXMgaW5wdXQgZHJpdmVycyAqLworI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgorI2RlZmluZSBTRExfSk9ZU1RJQ0tfRFVNTVkJMQorI2Vsc2UKKyNkZWZpbmUgU0RMX0pPWVNUSUNLX01BQ09TCTEKKyNlbmRpZgorCisvKiBFbmFibGUgdmFyaW91cyBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgc3lzdGVtcyAqLworI2RlZmluZSBTRExfTE9BRFNPX01BQ09TCTEKKworLyogRW5hYmxlIHZhcmlvdXMgdGhyZWFkaW5nIHN5c3RlbXMgKi8KKyNkZWZpbmUgU0RMX1RIUkVBRFNfRElTQUJMRUQJMQorCisvKiBFbmFibGUgdmFyaW91cyB0aW1lciBzeXN0ZW1zICovCisjZGVmaW5lIFNETF9USU1FUl9NQUNPUwkxCisKKy8qIEVuYWJsZSB2YXJpb3VzIHZpZGVvIGRyaXZlcnMgKi8KKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9EVU1NWQkxCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfRFJBV1NQUk9DS0VUCTEKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9UT09MQk9YCTEKKworLyogRW5hYmxlIE9wZW5HTCBzdXBwb3J0ICovCisjZGVmaW5lIFNETF9WSURFT19PUEVOR0wJMQorCisjZW5kaWYgLyogX1NETF9jb25maWdfbWFjb3NfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZ19tYWNvc3guaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9jb25maWdfbWFjb3N4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiZTYxNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9jb25maWdfbWFjb3N4LmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKyNpZm5kZWYgX1NETF9jb25maWdfbWFjb3N4X2gKKyNkZWZpbmUgX1NETF9jb25maWdfbWFjb3N4X2gKKworI2luY2x1ZGUgIlNETF9wbGF0Zm9ybS5oIgorCisvKiBUaGlzIGdldHMgdXMgTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQuLi4gKi8KKyNpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KKworLyogVGhpcyBpcyBhIHNldCBvZiBkZWZpbmVzIHRvIGNvbmZpZ3VyZSB0aGUgU0RMIGZlYXR1cmVzICovCisKKyNkZWZpbmUgU0RMX0hBU182NEJJVF9UWVBFCTEKKworLyogVXNlZnVsIGhlYWRlcnMgKi8KKy8qIElmIHdlIHNwZWNpZmllZCBhbiBTREsgb3IgaGF2ZSBhIHBvc3QtUG93ZXJQQyBjaGlwLCB0aGVuIGFsbG9jYS5oIGV4aXN0cy4gKi8KKyNpZiAoIChNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSAxMDMwKSB8fCAoIWRlZmluZWQoX19QT1dFUlBDX18pKSApCisjZGVmaW5lIEhBVkVfQUxMT0NBX0gJCTEKKyNlbmRpZgorI2RlZmluZSBIQVZFX1NZU19UWVBFU19ICTEKKyNkZWZpbmUgSEFWRV9TVERJT19ICTEKKyNkZWZpbmUgU1REQ19IRUFERVJTCTEKKyNkZWZpbmUgSEFWRV9TVFJJTkdfSAkxCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSAkxCisjZGVmaW5lIEhBVkVfU1RESU5UX0gJMQorI2RlZmluZSBIQVZFX0NUWVBFX0gJMQorI2RlZmluZSBIQVZFX01BVEhfSAkxCisjZGVmaW5lIEhBVkVfU0lHTkFMX0gJMQorCisvKiBDIGxpYnJhcnkgZnVuY3Rpb25zICovCisjZGVmaW5lIEhBVkVfTUFMTE9DCTEKKyNkZWZpbmUgSEFWRV9DQUxMT0MJMQorI2RlZmluZSBIQVZFX1JFQUxMT0MJMQorI2RlZmluZSBIQVZFX0ZSRUUJMQorI2RlZmluZSBIQVZFX0FMTE9DQQkxCisjZGVmaW5lIEhBVkVfR0VURU5WCTEKKyNkZWZpbmUgSEFWRV9QVVRFTlYJMQorI2RlZmluZSBIQVZFX1VOU0VURU5WCTEKKyNkZWZpbmUgSEFWRV9RU09SVAkxCisjZGVmaW5lIEhBVkVfQUJTCTEKKyNkZWZpbmUgSEFWRV9CQ09QWQkxCisjZGVmaW5lIEhBVkVfTUVNU0VUCTEKKyNkZWZpbmUgSEFWRV9NRU1DUFkJMQorI2RlZmluZSBIQVZFX01FTU1PVkUJMQorI2RlZmluZSBIQVZFX01FTUNNUAkxCisjZGVmaW5lIEhBVkVfU1RSTEVOCTEKKyNkZWZpbmUgSEFWRV9TVFJMQ1BZCTEKKyNkZWZpbmUgSEFWRV9TVFJMQ0FUCTEKKyNkZWZpbmUgSEFWRV9TVFJEVVAJMQorI2RlZmluZSBIQVZFX1NUUkNIUgkxCisjZGVmaW5lIEhBVkVfU1RSUkNIUgkxCisjZGVmaW5lIEhBVkVfU1RSU1RSCTEKKyNkZWZpbmUgSEFWRV9TVFJUT0wJMQorI2RlZmluZSBIQVZFX1NUUlRPVUwJMQorI2RlZmluZSBIQVZFX1NUUlRPTEwJMQorI2RlZmluZSBIQVZFX1NUUlRPVUxMCTEKKyNkZWZpbmUgSEFWRV9TVFJUT0QJMQorI2RlZmluZSBIQVZFX0FUT0kJMQorI2RlZmluZSBIQVZFX0FUT0YJMQorI2RlZmluZSBIQVZFX1NUUkNNUAkxCisjZGVmaW5lIEhBVkVfU1RSTkNNUAkxCisjZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUAkxCisjZGVmaW5lIEhBVkVfU1RSTkNBU0VDTVAgMQorI2RlZmluZSBIQVZFX1NTQ0FORgkxCisjZGVmaW5lIEhBVkVfU05QUklOVEYJMQorI2RlZmluZSBIQVZFX1ZTTlBSSU5URgkxCisjZGVmaW5lIEhBVkVfU0lHQUNUSU9OCTEKKyNkZWZpbmUgSEFWRV9TRVRKTVAJMQorI2RlZmluZSBIQVZFX05BTk9TTEVFUAkxCisKKy8qIEVuYWJsZSB2YXJpb3VzIGF1ZGlvIGRyaXZlcnMgKi8KKyNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9DT1JFQVVESU8JMQorI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX0RJU0sJMQorI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX0RVTU1ZCTEKKworLyogRW5hYmxlIHZhcmlvdXMgY2Ryb20gZHJpdmVycyAqLworI2RlZmluZSBTRExfQ0RST01fTUFDT1NYCTEKKworLyogRW5hYmxlIHZhcmlvdXMgaW5wdXQgZHJpdmVycyAqLworI2RlZmluZSBTRExfSk9ZU1RJQ0tfSU9LSVQJMQorCisvKiBFbmFibGUgdmFyaW91cyBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgc3lzdGVtcyAqLworI2lmZGVmIF9fcHBjX18KKy8qIEZvciBNYWMgT1MgWCAxMC4yIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgU0RMX0xPQURTT19ETENPTVBBVAkxCisjZWxzZQorI2RlZmluZSBTRExfTE9BRFNPX0RMT1BFTgkxCisjZW5kaWYKKworLyogRW5hYmxlIHZhcmlvdXMgdGhyZWFkaW5nIHN5c3RlbXMgKi8KKyNkZWZpbmUgU0RMX1RIUkVBRF9QVEhSRUFECTEKKyNkZWZpbmUgU0RMX1RIUkVBRF9QVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWAkxCisKKy8qIEVuYWJsZSB2YXJpb3VzIHRpbWVyIHN5c3RlbXMgKi8KKyNkZWZpbmUgU0RMX1RJTUVSX1VOSVgJMQorCisvKiBFbmFibGUgdmFyaW91cyB2aWRlbyBkcml2ZXJzICovCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfRFVNTVkJMQorI2lmICgoZGVmaW5lZCBUQVJHRVRfQVBJX01BQ19DQVJCT04pICYmIChUQVJHRVRfQVBJX01BQ19DQVJCT04pKQorI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1RPT0xCT1gJMQorI2Vsc2UKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9RVUFSVFoJMQorI2VuZGlmCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfREdBIDEKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTEgMQorI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1gxMV9ER0FNT1VTRSAxCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUMgIi91c3IvWDExUjYvbGliL2xpYlgxMS42LmR5bGliIgorI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hFWFQgIi91c3IvWDExUjYvbGliL2xpYlhleHQuNi5keWxpYiIKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YUkFORFIgIi91c3IvWDExUjYvbGliL2xpYlhyYW5kci4yLmR5bGliIgorI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSRU5ERVIgIi91c3IvWDExUjYvbGliL2xpYlhyZW5kZXIuMS5keWxpYiIKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERSAxCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BIDEKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FIDEKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFJBTkRSIDEKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFYgMQorCisvKiBFbmFibGUgT3BlbkdMIHN1cHBvcnQgKi8KKyNkZWZpbmUgU0RMX1ZJREVPX09QRU5HTAkxCisjZGVmaW5lIFNETF9WSURFT19PUEVOR0xfR0xYIDEKKworLyogRGlzYWJsZSBzY3JlZW5zYXZlciAqLworI2RlZmluZSBTRExfVklERU9fRElTQUJMRV9TQ1JFRU5TQVZFUgkxCisKKy8qIEVuYWJsZSBhc3NlbWJseSByb3V0aW5lcyAqLworI2RlZmluZSBTRExfQVNTRU1CTFlfUk9VVElORVMJMQorI2lmZGVmIF9fcHBjX18KKyNkZWZpbmUgU0RMX0FMVElWRUNfQkxJVFRFUlMJMQorI2VuZGlmCisKKyNlbmRpZiAvKiBfU0RMX2NvbmZpZ19tYWNvc3hfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZ19taW5pbWFsLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnX21pbmltYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTBkYjdjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZ19taW5pbWFsLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworI2lmbmRlZiBfU0RMX2NvbmZpZ19taW5pbWFsX2gKKyNkZWZpbmUgX1NETF9jb25maWdfbWluaW1hbF9oCisKKyNpbmNsdWRlICJTRExfcGxhdGZvcm0uaCIKKworLyogVGhpcyBpcyB0aGUgbWluaW1hbCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgU0RMICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKwordHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNl90OwordHlwZWRlZiBzaWduZWQgaW50IGludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50cHRyX3Q7CisKKy8qIEVuYWJsZSB0aGUgZHVtbXkgYXVkaW8gZHJpdmVyIChzcmMvYXVkaW8vZHVtbXkvXCouYykgKi8KKyNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9EVU1NWQkxCisKKy8qIEVuYWJsZSB0aGUgc3R1YiBjZHJvbSBkcml2ZXIgKHNyYy9jZHJvbS9kdW1teS9cKi5jKSAqLworI2RlZmluZSBTRExfQ0RST01fRElTQUJMRUQJMQorCisvKiBFbmFibGUgdGhlIHN0dWIgam95c3RpY2sgZHJpdmVyIChzcmMvam95c3RpY2svZHVtbXkvXCouYykgKi8KKyNkZWZpbmUgU0RMX0pPWVNUSUNLX0RJU0FCTEVECTEKKworLyogRW5hYmxlIHRoZSBzdHViIHNoYXJlZCBvYmplY3QgbG9hZGVyIChzcmMvbG9hZHNvL2R1bW15L1wqLmMpICovCisjZGVmaW5lIFNETF9MT0FEU09fRElTQUJMRUQJMQorCisvKiBFbmFibGUgdGhlIHN0dWIgdGhyZWFkIHN1cHBvcnQgKHNyYy90aHJlYWQvZ2VuZXJpYy9cKi5jKSAqLworI2RlZmluZSBTRExfVEhSRUFEU19ESVNBQkxFRAkxCisKKy8qIEVuYWJsZSB0aGUgc3R1YiB0aW1lciBzdXBwb3J0IChzcmMvdGltZXIvZHVtbXkvXCouYykgKi8KKyNkZWZpbmUgU0RMX1RJTUVSU19ESVNBQkxFRAkxCisKKy8qIEVuYWJsZSB0aGUgZHVtbXkgdmlkZW8gZHJpdmVyIChzcmMvdmlkZW8vZHVtbXkvXCouYykgKi8KKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9EVU1NWQkxCisKKyNlbmRpZiAvKiBfU0RMX2NvbmZpZ19taW5pbWFsX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9jb25maWdfbmRzLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnX25kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNGQ2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnX25kcy5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisjaWZuZGVmIF9TRExfY29uZmlnX25kc19oCisjZGVmaW5lIF9TRExfY29uZmlnX25kc19oCisKKyNpbmNsdWRlICJTRExfcGxhdGZvcm0uaCIKKworLyogVGhpcyBpcyBhIHNldCBvZiBkZWZpbmVzIHRvIGNvbmZpZ3VyZSB0aGUgU0RMIGZlYXR1cmVzICovCisKKy8qIEdlbmVyYWwgcGxhdGZvcm0gc3BlY2lmaWMgaWRlbnRpZmllcnMgKi8KKyNpbmNsdWRlICJTRExfcGxhdGZvcm0uaCIKKworLyogQyBkYXRhdHlwZXMgKi8KKyNkZWZpbmUgU0RMX0hBU182NEJJVF9UWVBFIDEKKworLyogRW5kaWFubmVzcyAqLworI2RlZmluZSBTRExfQllURU9SREVSIDEyMzQKKworLyogVXNlZnVsIGhlYWRlcnMgKi8KKyNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorI2RlZmluZSBIQVZFX1NURElPX0ggMQorI2RlZmluZSBTVERDX0hFQURFUlMgMQorI2RlZmluZSBIQVZFX1NURExJQl9IIDEKKyNkZWZpbmUgSEFWRV9TVERBUkdfSCAxCisjZGVmaW5lIEhBVkVfTUFMTE9DX0ggMQorI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKyNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZGVmaW5lIEhBVkVfQ1RZUEVfSCAxCisjZGVmaW5lIEhBVkVfTUFUSF9IIDEKKyNkZWZpbmUgSEFWRV9JQ09OVl9IIDEKKyNkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCisKKy8qIEMgbGlicmFyeSBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgSEFWRV9NQUxMT0MgMQorI2RlZmluZSBIQVZFX0NBTExPQyAxCisjZGVmaW5lIEhBVkVfUkVBTExPQyAxCisjZGVmaW5lIEhBVkVfRlJFRSAxCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKKyNkZWZpbmUgSEFWRV9HRVRFTlYgMQorI2RlZmluZSBIQVZFX1BVVEVOViAxCisjZGVmaW5lIEhBVkVfVU5TRVRFTlYgMQorI2RlZmluZSBIQVZFX1FTT1JUIDEKKyNkZWZpbmUgSEFWRV9BQlMgMQorI2RlZmluZSBIQVZFX0JDT1BZIDEKKyNkZWZpbmUgSEFWRV9NRU1TRVQgMQorI2RlZmluZSBIQVZFX01FTUNQWSAxCisjZGVmaW5lIEhBVkVfTUVNTU9WRSAxCisjZGVmaW5lIEhBVkVfU1RSTEVOIDEKKyNkZWZpbmUgSEFWRV9TVFJMQ1BZIDEKKyNkZWZpbmUgSEFWRV9TVFJMQ0FUIDEKKyNkZWZpbmUgSEFWRV9TVFJEVVAgMQorI2RlZmluZSBIQVZFX1NUUkNIUiAxCisjZGVmaW5lIEhBVkVfU1RSUkNIUiAxCisjZGVmaW5lIEhBVkVfU1RSU1RSIDEKKyNkZWZpbmUgSEFWRV9TVFJUT0wgMQorI2RlZmluZSBIQVZFX1NUUlRPVUwgMQorI2RlZmluZSBIQVZFX1NUUlRPTEwgMQorI2RlZmluZSBIQVZFX1NUUlRPVUxMIDEKKyNkZWZpbmUgSEFWRV9BVE9JIDEKKyNkZWZpbmUgSEFWRV9BVE9GIDEKKyNkZWZpbmUgSEFWRV9TVFJDTVAgMQorI2RlZmluZSBIQVZFX1NUUk5DTVAgMQorI2RlZmluZSBIQVZFX1NUUkNBU0VDTVAgMQorI2RlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKKyNkZWZpbmUgSEFWRV9TU0NBTkYgMQorI2RlZmluZSBIQVZFX1NOUFJJTlRGIDEKKyNkZWZpbmUgSEFWRV9WU05QUklOVEYgMQorI2RlZmluZSBIQVZFX1NFVEpNUCAxCisKKy8qIEVuYWJsZSB2YXJpb3VzIGF1ZGlvIGRyaXZlcnMgKi8KKyNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9ORFMJMQorI2RlZmluZSBTRExfQVVESU9fRFJJVkVSX0RVTU1ZCTEKKworLyogRW5hYmxlIHRoZSBzdHViIGNkcm9tIGRyaXZlciAoc3JjL2Nkcm9tL2R1bW15L1wqLmMpICovCisjZGVmaW5lIFNETF9DRFJPTV9ESVNBQkxFRAkxCisKKy8qIEVuYWJsZSB2YXJpb3VzIGlucHV0IGRyaXZlcnMgKi8KKyNkZWZpbmUgU0RMX0pPWVNUSUNLX05EUwkxCisKKy8qIEVuYWJsZSB0aGUgc3R1YiBzaGFyZWQgb2JqZWN0IGxvYWRlciAoc3JjL2xvYWRzby9kdW1teS9cKi5jKSAqLworI2RlZmluZSBTRExfTE9BRFNPX0RJU0FCTEVECTEKKworLyogRW5hYmxlIHRoZSBzdHViIHRocmVhZCBzdXBwb3J0IChzcmMvdGhyZWFkL2dlbmVyaWMvXCouYykgKi8KKyNkZWZpbmUgU0RMX1RIUkVBRFNfRElTQUJMRUQJMQorCisvKiBFbmFibGUgdmFyaW91cyB0aW1lciBzeXN0ZW1zICovCisjZGVmaW5lIFNETF9USU1FUl9ORFMJMQorCisvKiBFbmFibGUgdmFyaW91cyB2aWRlbyBkcml2ZXJzICovCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfTkRTCTEKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9EVU1NWQkxCisKKyNlbmRpZiAvKiBfU0RMX2NvbmZpZ19uZHNfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZ19vczIuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9jb25maWdfb3MyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlZGQyMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9jb25maWdfb3MyLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKyNpZm5kZWYgX1NETF9jb25maWdfb3MyX2gKKyNkZWZpbmUgX1NETF9jb25maWdfb3MyX2gKKworI2luY2x1ZGUgIlNETF9wbGF0Zm9ybS5oIgorCisvKiBUaGlzIGlzIGEgc2V0IG9mIGRlZmluZXMgdG8gY29uZmlndXJlIHRoZSBTREwgZmVhdHVyZXMgKi8KKwordHlwZWRlZiBzaWduZWQgY2hhciAgICAgICAgIGludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1aW50OF90OwordHlwZWRlZiBzaWduZWQgc2hvcnQgICAgICAgIGludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdWludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgICAgICAgICAgaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICB1aW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICBzaXplX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgdWludHB0cl90OwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nICAgIGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgdWludDY0X3Q7CisKKyNkZWZpbmUgU0RMX0hBU182NEJJVF9UWVBFCTEKKworLyogVXNlIFdhdGNvbSdzIExJQkMgKi8KKyNkZWZpbmUgSEFWRV9MSUJDIDEKKworLyogVXNlZnVsIGhlYWRlcnMgKi8KKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisjZGVmaW5lIEhBVkVfU1RESU9fSCAxCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorI2RlZmluZSBIQVZFX1NUREFSR19IIDEKKyNkZWZpbmUgSEFWRV9NQUxMT0NfSCAxCisjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKyNkZWZpbmUgSEFWRV9DVFlQRV9IIDEKKyNkZWZpbmUgSEFWRV9NQVRIX0ggMQorI2RlZmluZSBIQVZFX1NJR05BTF9IIDEKKworLyogQyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLworI2RlZmluZSBIQVZFX01BTExPQyAxCisjZGVmaW5lIEhBVkVfQ0FMTE9DIDEKKyNkZWZpbmUgSEFWRV9SRUFMTE9DIDEKKyNkZWZpbmUgSEFWRV9GUkVFIDEKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorI2RlZmluZSBIQVZFX0dFVEVOViAxCisjZGVmaW5lIEhBVkVfUFVURU5WIDEKKyNkZWZpbmUgSEFWRV9VTlNFVEVOViAxCisjZGVmaW5lIEhBVkVfUVNPUlQgMQorI2RlZmluZSBIQVZFX0FCUyAxCisjZGVmaW5lIEhBVkVfQkNPUFkgMQorI2RlZmluZSBIQVZFX01FTVNFVCAxCisjZGVmaW5lIEhBVkVfTUVNQ1BZIDEKKyNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKKyNkZWZpbmUgSEFWRV9NRU1DTVAgMQorI2RlZmluZSBIQVZFX1NUUkxFTiAxCisjZGVmaW5lIEhBVkVfU1RSTENQWSAxCisjZGVmaW5lIEhBVkVfU1RSTENBVCAxCisjZGVmaW5lIEhBVkVfU1RSRFVQIDEKKyNkZWZpbmUgSEFWRV9fU1RSUkVWIDEKKyNkZWZpbmUgSEFWRV9fU1RSVVBSIDEKKyNkZWZpbmUgSEFWRV9fU1RSTFdSIDEKKyNkZWZpbmUgSEFWRV9JTkRFWCAxCisjZGVmaW5lIEhBVkVfUklOREVYIDEKKyNkZWZpbmUgSEFWRV9TVFJDSFIgMQorI2RlZmluZSBIQVZFX1NUUlJDSFIgMQorI2RlZmluZSBIQVZFX1NUUlNUUiAxCisjZGVmaW5lIEhBVkVfSVRPQSAxCisjZGVmaW5lIEhBVkVfX0xUT0EgMQorI2RlZmluZSBIQVZFX19VSVRPQSAxCisjZGVmaW5lIEhBVkVfX1VMVE9BIDEKKyNkZWZpbmUgSEFWRV9TVFJUT0wgMQorI2RlZmluZSBIQVZFX19JNjRUT0EgMQorI2RlZmluZSBIQVZFX19VSTY0VE9BIDEKKyNkZWZpbmUgSEFWRV9TVFJUT0xMIDEKKyNkZWZpbmUgSEFWRV9TVFJUT0QgMQorI2RlZmluZSBIQVZFX0FUT0kgMQorI2RlZmluZSBIQVZFX0FUT0YgMQorI2RlZmluZSBIQVZFX1NUUkNNUCAxCisjZGVmaW5lIEhBVkVfU1RSTkNNUCAxCisjZGVmaW5lIEhBVkVfU1RSSUNNUCAxCisjZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUCAxCisjZGVmaW5lIEhBVkVfU1NDQU5GIDEKKyNkZWZpbmUgSEFWRV9TTlBSSU5URiAxCisjZGVmaW5lIEhBVkVfVlNOUFJJTlRGIDEKKyNkZWZpbmUgSEFWRV9TRVRKTVAgMQorI2RlZmluZSBIQVZFX0NMT0NLX0dFVFRJTUUgMQorCisvKiBFbmFibGUgdmFyaW91cyBhdWRpbyBkcml2ZXJzICovCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfREFSVAkxCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfRElTSwkxCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfRFVNTVkJMQorCisvKiBFbmFibGUgdmFyaW91cyBjZHJvbSBkcml2ZXJzICovCisjZGVmaW5lIFNETF9DRFJPTV9PUzIJMQorCisvKiBFbmFibGUgdmFyaW91cyBpbnB1dCBkcml2ZXJzICovCisjZGVmaW5lIFNETF9KT1lTVElDS19PUzIJMQorCisvKiBFbmFibGUgdmFyaW91cyBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgc3lzdGVtcyAqLworI2RlZmluZSBTRExfTE9BRFNPX09TMgkxCisKKy8qIEVuYWJsZSB2YXJpb3VzIHRocmVhZGluZyBzeXN0ZW1zICovCisjZGVmaW5lIFNETF9USFJFQURfT1MyCTEKKworLyogRW5hYmxlIHZhcmlvdXMgdGltZXIgc3lzdGVtcyAqLworI2RlZmluZSBTRExfVElNRVJfT1MyCTEKKworLyogRW5hYmxlIHZhcmlvdXMgdmlkZW8gZHJpdmVycyAqLworI2RlZmluZSBTRExfVklERU9fRFJJVkVSX0RVTU1ZCTEKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9PUzJGUwkxCisKKy8qIEVuYWJsZSBPcGVuR0wgc3VwcG9ydCAqLworLyogTm90aGluZyBoZXJlIHlldCBmb3IgT1MvMi4uLiA6KCAqLworCisvKiBFbmFibGUgYXNzZW1ibHkgcm91dGluZXMgd2hlcmUgYXZhaWxhYmxlICovCisjZGVmaW5lIFNETF9BU1NFTUJMWV9ST1VUSU5FUwkxCisKKyNlbmRpZiAvKiBfU0RMX2NvbmZpZ19vczJfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZ19zeW1iaWFuLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnX3N5bWJpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTE3YWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvbmZpZ19zeW1iaWFuLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qCisKK1N5bWJpYW4gdmVyc2lvbiBNYXJrdXMgTWVydGFtYQorCisqLworCisKKyNpZm5kZWYgX1NETF9DT05GSUdfU1lNQklBTl9ICisjZGVmaW5lIF9TRExfQ09ORklHX1NZTUJJQU5fSAorCisjaW5jbHVkZSAiU0RMX3BsYXRmb3JtLmgiCisKKy8qIFRoaXMgaXMgdGhlIG1pbmltYWwgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIFNETCAqLworCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworCisjaWZkZWYgX19HQ0NFX18KKyNkZWZpbmUgU1lNQklBTjMyX0dDQ0UKKyNlbmRpZgorCisjaWZuZGVmIF9TSVpFX1RfREVGSU5FRAordHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgX0lOVFBUUl9UX0RFQ0xBUkVECit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50cHRyX3Q7CisjZW5kaWYgCisKKyNpZm5kZWYgX0lOVDhfVF9ERUNMQVJFRAordHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7CisjZW5kaWYgCisKKyNpZm5kZWYgX1VJTlQ4X1RfREVDTEFSRUQKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OworI2VuZGlmCisKKyNpZm5kZWYgX0lOVDE2X1RfREVDTEFSRUQKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2X3Q7CisjZW5kaWYKKworI2lmbmRlZiBfVUlOVDE2X1RfREVDTEFSRUQKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CisjZW5kaWYKKworI2lmbmRlZiBfSU5UMzJfVF9ERUNMQVJFRAordHlwZWRlZiBzaWduZWQgaW50IGludDMyX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfVUlOVDMyX1RfREVDTEFSRUQKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OworI2VuZGlmCisKKyNpZm5kZWYgX0lOVDY0X1RfREVDTEFSRUQKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBpbnQ2NF90OworI2VuZGlmCisKKyNpZm5kZWYgX1VJTlQ2NF9UX0RFQ0xBUkVECit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKyNlbmRpZgorCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfRVBPQ0FVRElPCTEKKworCisvKiBFbmFibGUgdGhlIHN0dWIgY2Ryb20gZHJpdmVyIChzcmMvY2Ryb20vZHVtbXkvXCouYykgKi8KKyNkZWZpbmUgU0RMX0NEUk9NX0RJU0FCTEVECTEKKworLyogRW5hYmxlIHRoZSBzdHViIGpveXN0aWNrIGRyaXZlciAoc3JjL2pveXN0aWNrL2R1bW15L1wqLmMpICovCisjZGVmaW5lIFNETF9KT1lTVElDS19ESVNBQkxFRAkxCisKKy8qIEVuYWJsZSB0aGUgc3R1YiBzaGFyZWQgb2JqZWN0IGxvYWRlciAoc3JjL2xvYWRzby9kdW1teS9cKi5jKSAqLworI2RlZmluZSBTRExfTE9BRFNPX0RJU0FCTEVECTEKKworI2RlZmluZSBTRExfVEhSRUFEX1NZTUJJQU4gMQorCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfRVBPQyAgICAxCisKKyNkZWZpbmUgU0RMX1ZJREVPX09QRU5HTCAwCisKKyNkZWZpbmUgU0RMX0hBU182NEJJVF9UWVBFCTEKKworI2RlZmluZSBIQVZFX0xJQkMJMQorI2RlZmluZSBIQVZFX1NURElPX0ggMQorI2RlZmluZSBTVERDX0hFQURFUlMgMQorI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKyNkZWZpbmUgSEFWRV9DVFlQRV9IIDEKKyNkZWZpbmUgSEFWRV9NQVRIX0ggMQorCisjZGVmaW5lIEhBVkVfTUFMTE9DIDEKKyNkZWZpbmUgSEFWRV9DQUxMT0MgMQorI2RlZmluZSBIQVZFX1JFQUxMT0MgMQorI2RlZmluZSBIQVZFX0ZSRUUgMQorLyojZGVmaW5lIEhBVkVfQUxMT0NBIDEqLworI2RlZmluZSBIQVZFX1FTT1JUIDEKKyNkZWZpbmUgSEFWRV9BQlMgMQorI2RlZmluZSBIQVZFX01FTVNFVCAxCisjZGVmaW5lIEhBVkVfTUVNQ1BZIDEKKyNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKKyNkZWZpbmUgSEFWRV9NRU1DTVAgMQorI2RlZmluZSBIQVZFX1NUUkxFTiAxCisjZGVmaW5lIEhBVkVfX1NUUlVQUiAxCisjZGVmaW5lIEhBVkVfU1RSQ0hSIDEKKyNkZWZpbmUgSEFWRV9TVFJSQ0hSIDEKKyNkZWZpbmUgSEFWRV9TVFJTVFIgMQorI2RlZmluZSBIQVZFX0lUT0EgMQorI2RlZmluZSBIQVZFX1NUUlRPTCAxCisjZGVmaW5lIEhBVkVfU1RSVE9VTCAxCisjZGVmaW5lIEhBVkVfU1RSVE9MTCAxCisjZGVmaW5lIEhBVkVfU1RSVE9EIDEKKyNkZWZpbmUgSEFWRV9BVE9JIDEKKyNkZWZpbmUgSEFWRV9BVE9GIDEKKyNkZWZpbmUgSEFWRV9TVFJDTVAgMQorI2RlZmluZSBIQVZFX1NUUk5DTVAgMQorLyojZGVmaW5lIEhBVkVfX1NUUklDTVAgMSovCisjZGVmaW5lIEhBVkVfX1NUUk5JQ01QIDEKKyNkZWZpbmUgSEFWRV9TU0NBTkYgMQorI2RlZmluZSBIQVZFX1NUREFSR19ICTEKKyNkZWZpbmUgSEFWRV9TVERERUZfSAkxCisKKworCisjZW5kaWYgLyogX1NETF9DT05GSUdfU1lNQklBTl9IICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnX3dpbjMyLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29uZmlnX3dpbjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyYzE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9jb25maWdfd2luMzIuaApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworI2lmbmRlZiBfU0RMX2NvbmZpZ193aW4zMl9oCisjZGVmaW5lIF9TRExfY29uZmlnX3dpbjMyX2gKKworI2luY2x1ZGUgIlNETF9wbGF0Zm9ybS5oIgorCisvKiBUaGlzIGlzIGEgc2V0IG9mIGRlZmluZXMgdG8gY29uZmlndXJlIHRoZSBTREwgZmVhdHVyZXMgKi8KKworI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19ETUNfXykKKyNkZWZpbmUgSEFWRV9TVERJTlRfSAkxCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQordHlwZWRlZiBzaWduZWQgX19pbnQ4CQlpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50OAkJdWludDhfdDsKK3R5cGVkZWYgc2lnbmVkIF9faW50MTYJCWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYJdWludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDMyCQlpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyCXVpbnQzMl90OwordHlwZWRlZiBzaWduZWQgX19pbnQ2NAkJaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NAl1aW50NjRfdDsKKyNpZm5kZWYgX1VJTlRQVFJfVF9ERUZJTkVECisjaWZkZWYgIF9XSU42NAordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgIHVpbnRwdHJfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVpbnRwdHJfdDsKKyNlbmRpZgorI2RlZmluZSBfVUlOVFBUUl9UX0RFRklORUQKKyNlbmRpZgorLyogT2xkZXIgVmlzdWFsIEMrKyBoZWFkZXJzIGRvbid0IGhhdmUgdGhlIFdpbjY0LWNvbXBhdGlibGUgdHlwZWRlZnMuLi4gKi8KKyNpZiAoKF9NU0NfVkVSIDw9IDEyMDApICYmICghZGVmaW5lZChEV09SRF9QVFIpKSkKKyNkZWZpbmUgRFdPUkRfUFRSIERXT1JECisjZW5kaWYKKyNpZiAoKF9NU0NfVkVSIDw9IDEyMDApICYmICghZGVmaW5lZChMT05HX1BUUikpKQorI2RlZmluZSBMT05HX1BUUiBMT05HCisjZW5kaWYKKyNlbHNlCS8qICFfX0dOVUNfXyAmJiAhX01TQ19WRVIgKi8KK3R5cGVkZWYgc2lnbmVkIGNoYXIgaW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkIGludCBpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Cit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OworI2lmbmRlZiBfU0laRV9UX0RFRklORURfCisjZGVmaW5lIF9TSVpFX1RfREVGSU5FRF8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludHB0cl90OworI2VuZGlmIC8qIF9fR05VQ19fIHx8IF9NU0NfVkVSICovCisjZGVmaW5lIFNETF9IQVNfNjRCSVRfVFlQRQkxCisKKy8qIEVuYWJsZWQgZm9yIFNETCAxLjIgKGJpbmFyeSBjb21wYXRpYmlsaXR5KSAqLworI2RlZmluZSBIQVZFX0xJQkMJMQorI2lmZGVmIEhBVkVfTElCQworLyogVXNlZnVsIGhlYWRlcnMgKi8KKyNkZWZpbmUgSEFWRV9TVERJT19IIDEKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisjZGVmaW5lIEhBVkVfQ1RZUEVfSCAxCisjZGVmaW5lIEhBVkVfTUFUSF9IIDEKKyNpZm5kZWYgX1dJTjMyX1dDRQorI2RlZmluZSBIQVZFX1NJR05BTF9IIDEKKyNlbmRpZgorCisvKiBDIGxpYnJhcnkgZnVuY3Rpb25zICovCisjZGVmaW5lIEhBVkVfTUFMTE9DIDEKKyNkZWZpbmUgSEFWRV9DQUxMT0MgMQorI2RlZmluZSBIQVZFX1JFQUxMT0MgMQorI2RlZmluZSBIQVZFX0ZSRUUgMQorI2RlZmluZSBIQVZFX0FMTE9DQSAxCisjZGVmaW5lIEhBVkVfUVNPUlQgMQorI2RlZmluZSBIQVZFX0FCUyAxCisjZGVmaW5lIEhBVkVfTUVNU0VUIDEKKyNkZWZpbmUgSEFWRV9NRU1DUFkgMQorI2RlZmluZSBIQVZFX01FTU1PVkUgMQorI2RlZmluZSBIQVZFX01FTUNNUCAxCisjZGVmaW5lIEhBVkVfU1RSTEVOIDEKKyNkZWZpbmUgSEFWRV9fU1RSUkVWIDEKKyNkZWZpbmUgSEFWRV9fU1RSVVBSIDEKKyNkZWZpbmUgSEFWRV9fU1RSTFdSIDEKKyNkZWZpbmUgSEFWRV9TVFJDSFIgMQorI2RlZmluZSBIQVZFX1NUUlJDSFIgMQorI2RlZmluZSBIQVZFX1NUUlNUUiAxCisjZGVmaW5lIEhBVkVfSVRPQSAxCisjZGVmaW5lIEhBVkVfX0xUT0EgMQorI2RlZmluZSBIQVZFX19VTFRPQSAxCisjZGVmaW5lIEhBVkVfU1RSVE9MIDEKKyNkZWZpbmUgSEFWRV9TVFJUT1VMIDEKKyNkZWZpbmUgSEFWRV9TVFJUT0xMIDEKKyNkZWZpbmUgSEFWRV9TVFJUT0QgMQorI2RlZmluZSBIQVZFX0FUT0kgMQorI2RlZmluZSBIQVZFX0FUT0YgMQorI2RlZmluZSBIQVZFX1NUUkNNUCAxCisjZGVmaW5lIEhBVkVfU1RSTkNNUCAxCisjZGVmaW5lIEhBVkVfX1NUUklDTVAgMQorI2RlZmluZSBIQVZFX19TVFJOSUNNUCAxCisjZGVmaW5lIEhBVkVfU1NDQU5GIDEKKyNlbHNlCisjZGVmaW5lIEhBVkVfU1REQVJHX0gJMQorI2RlZmluZSBIQVZFX1NURERFRl9ICTEKKyNlbmRpZgorCisvKiBFbmFibGUgdmFyaW91cyBhdWRpbyBkcml2ZXJzICovCisjaWZuZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgU0RMX0FVRElPX0RSSVZFUl9EU09VTkQJMQorI2VuZGlmCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfV0FWRU9VVAkxCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfRElTSwkxCisjZGVmaW5lIFNETF9BVURJT19EUklWRVJfRFVNTVkJMQorCisvKiBFbmFibGUgdmFyaW91cyBjZHJvbSBkcml2ZXJzICovCisjaWZkZWYgX1dJTjMyX1dDRQorI2RlZmluZSBTRExfQ0RST01fRElTQUJMRUQgICAgICAxCisjZWxzZQorI2RlZmluZSBTRExfQ0RST01fV0lOMzIJCTEKKyNlbmRpZgorCisvKiBFbmFibGUgdmFyaW91cyBpbnB1dCBkcml2ZXJzICovCisjaWZkZWYgX1dJTjMyX1dDRQorI2RlZmluZSBTRExfSk9ZU1RJQ0tfRElTQUJMRUQgICAxCisjZWxzZQorI2RlZmluZSBTRExfSk9ZU1RJQ0tfV0lOTU0JMQorI2VuZGlmCisKKy8qIEVuYWJsZSB2YXJpb3VzIHNoYXJlZCBvYmplY3QgbG9hZGluZyBzeXN0ZW1zICovCisjZGVmaW5lIFNETF9MT0FEU09fV0lOMzIJMQorCisvKiBFbmFibGUgdmFyaW91cyB0aHJlYWRpbmcgc3lzdGVtcyAqLworI2RlZmluZSBTRExfVEhSRUFEX1dJTjMyCTEKKworLyogRW5hYmxlIHZhcmlvdXMgdGltZXIgc3lzdGVtcyAqLworI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgU0RMX1RJTUVSX1dJTkNFCTEKKyNlbHNlCisjZGVmaW5lIFNETF9USU1FUl9XSU4zMgkxCisjZW5kaWYKKworLyogRW5hYmxlIHZhcmlvdXMgdmlkZW8gZHJpdmVycyAqLworI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9HQVBJCTEKKyNlbmRpZgorI2lmbmRlZiBfV0lOMzJfV0NFCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfRERSQVcJMQorI2VuZGlmCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfRFVNTVkJMQorI2RlZmluZSBTRExfVklERU9fRFJJVkVSX1dJTkRJQgkxCisKKy8qIEVuYWJsZSBPcGVuR0wgc3VwcG9ydCAqLworI2lmbmRlZiBfV0lOMzJfV0NFCisjZGVmaW5lIFNETF9WSURFT19PUEVOR0wJMQorI2RlZmluZSBTRExfVklERU9fT1BFTkdMX1dHTAkxCisjZW5kaWYKKworLyogRGlzYWJsZSBzY3JlZW5zYXZlciAqLworI2RlZmluZSBTRExfVklERU9fRElTQUJMRV9TQ1JFRU5TQVZFUgkxCisKKy8qIEVuYWJsZSBhc3NlbWJseSByb3V0aW5lcyAoV2luNjQgZG9lc24ndCBoYXZlIGlubGluZSBhc20pICovCisjaWZuZGVmIF9XSU42NAorI2RlZmluZSBTRExfQVNTRU1CTFlfUk9VVElORVMJMQorI2VuZGlmCisKKyNlbmRpZiAvKiBfU0RMX2NvbmZpZ193aW4zMl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY29weWluZy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvcHlpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI2NGYyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NvcHlpbmcuaApAQCAtMCwwICsxLDIyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfY3B1aW5mby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NwdWluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjAwZDZkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2NwdWluZm8uaApAQCAtMCwwICsxLDY5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKioKKyAqICBAZmlsZSBTRExfY3B1aW5mby5oCisgKiAgQ1BVIGZlYXR1cmUgZGV0ZWN0aW9uIGZvciBTREwKKyAqLworCisjaWZuZGVmIF9TRExfY3B1aW5mb19oCisjZGVmaW5lIF9TRExfY3B1aW5mb19oCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisKKyNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCisvKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBDUFUgaGFzIHRoZSBSRFRTQyBpbnN0cnVjdGlvbiAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9ib29sIFNETENBTEwgU0RMX0hhc1JEVFNDKHZvaWQpOworCisvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIENQVSBoYXMgTU1YIGZlYXR1cmVzICovCitleHRlcm4gREVDTFNQRUMgU0RMX2Jvb2wgU0RMQ0FMTCBTRExfSGFzTU1YKHZvaWQpOworCisvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIENQVSBoYXMgTU1YIEV4dC4gZmVhdHVyZXMgKi8KK2V4dGVybiBERUNMU1BFQyBTRExfYm9vbCBTRExDQUxMIFNETF9IYXNNTVhFeHQodm9pZCk7CisKKy8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgQ1BVIGhhcyAzRE5vdyBmZWF0dXJlcyAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9ib29sIFNETENBTEwgU0RMX0hhczNETm93KHZvaWQpOworCisvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIENQVSBoYXMgM0ROb3chIEV4dC4gZmVhdHVyZXMgKi8KK2V4dGVybiBERUNMU1BFQyBTRExfYm9vbCBTRExDQUxMIFNETF9IYXMzRE5vd0V4dCh2b2lkKTsKKworLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBDUFUgaGFzIFNTRSBmZWF0dXJlcyAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9ib29sIFNETENBTEwgU0RMX0hhc1NTRSh2b2lkKTsKKworLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBDUFUgaGFzIFNTRTIgZmVhdHVyZXMgKi8KK2V4dGVybiBERUNMU1BFQyBTRExfYm9vbCBTRExDQUxMIFNETF9IYXNTU0UyKHZvaWQpOworCisvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIENQVSBoYXMgQWx0aVZlYyBmZWF0dXJlcyAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9ib29sIFNETENBTEwgU0RMX0hhc0FsdGlWZWModm9pZCk7CisKKy8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCisKKyNlbmRpZiAvKiBfU0RMX2NwdWluZm9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2VuZGlhbi5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OGRhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfZW5kaWFuLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qKgorICogIEBmaWxlIFNETF9lbmRpYW4uaAorICogIEZ1bmN0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBlbmRpYW4tc3BlY2lmaWMgdmFsdWVzCisgKi8KKworI2lmbmRlZiBfU0RMX2VuZGlhbl9oCisjZGVmaW5lIF9TRExfZW5kaWFuX2gKKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKworLyoqIEBuYW1lIFNETF9FTkRJQU5zCisgKiAgVGhlIHR3byB0eXBlcyBvZiBlbmRpYW5uZXNzIAorICovCisvKkB7Ki8KKyNkZWZpbmUgU0RMX0xJTF9FTkRJQU4JMTIzNAorI2RlZmluZSBTRExfQklHX0VORElBTgk0MzIxCisvKkB9Ki8KKworI2lmbmRlZiBTRExfQllURU9SREVSCS8qIE5vdCBkZWZpbmVkIGluIFNETF9jb25maWcuaD8gKi8KKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNkZWZpbmUgU0RMX0JZVEVPUkRFUiAgX19CWVRFX09SREVSCisjZWxzZSAvKiBfX2xpbnV4IF9fICovCisjaWYgZGVmaW5lZChfX2hwcGFfXykgfHwgXAorICAgIGRlZmluZWQoX19tNjhrX18pIHx8IGRlZmluZWQobWM2ODAwMCkgfHwgZGVmaW5lZChfTV9NNjhLKSB8fCBcCisgICAgKGRlZmluZWQoX19NSVBTX18pICYmIGRlZmluZWQoX19NSVNQRUJfXykpIHx8IFwKKyAgICBkZWZpbmVkKF9fcHBjX18pIHx8IGRlZmluZWQoX19QT1dFUlBDX18pIHx8IGRlZmluZWQoX01fUFBDKSB8fCBcCisgICAgZGVmaW5lZChfX3NwYXJjX18pCisjZGVmaW5lIFNETF9CWVRFT1JERVIJU0RMX0JJR19FTkRJQU4KKyNlbHNlCisjZGVmaW5lIFNETF9CWVRFT1JERVIJU0RMX0xJTF9FTkRJQU4KKyNlbmRpZgorI2VuZGlmIC8qIF9fbGludXggX18gKi8KKyNlbmRpZiAvKiAhU0RMX0JZVEVPUkRFUiAqLworCisKKyNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCisvKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgQG5hbWUgU0RMX1N3YXAgRnVuY3Rpb25zCisgKiAgVXNlIGlubGluZSBmdW5jdGlvbnMgZm9yIGNvbXBpbGVycyB0aGF0IHN1cHBvcnQgdGhlbSwgYW5kIHN0YXRpYworICogIGZ1bmN0aW9ucyBmb3IgdGhvc2UgdGhhdCBkbyBub3QuICBCZWNhdXNlIHRoZXNlIGZ1bmN0aW9ucyBiZWNvbWUKKyAqICBzdGF0aWMgZm9yIGNvbXBpbGVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGlubGluZSBmdW5jdGlvbnMsIHRoaXMKKyAqICBoZWFkZXIgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgaW4gZmlsZXMgdGhhdCBhY3R1YWxseSB1c2UgdGhlbS4KKyAqLworLypAeyovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgXAorICAgIShfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDw9IDk1IC8qIGJyb2tlbiBnY2MgdmVyc2lvbiAqLykKK3N0YXRpYyBfX2lubGluZV9fIFVpbnQxNiBTRExfU3dhcDE2KFVpbnQxNiB4KQoreworCV9fYXNtX18oInhjaGdiICViMCwlaDAiIDogIj1xIiAoeCkgOiAgIjAiICh4KSk7CisJcmV0dXJuIHg7Cit9CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9feDg2XzY0X18pCitzdGF0aWMgX19pbmxpbmVfXyBVaW50MTYgU0RMX1N3YXAxNihVaW50MTYgeCkKK3sKKwlfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwIiA6ICI9USIgKHgpIDogICIwIiAoeCkpOworCXJldHVybiB4OworfQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19wcGNfXykpCitzdGF0aWMgX19pbmxpbmVfXyBVaW50MTYgU0RMX1N3YXAxNihVaW50MTYgeCkKK3sKKwlpbnQgcmVzdWx0OworCisJX19hc21fXygicmx3aW1pICUwLCUyLDgsMTYsMjMiIDogIj0mciIgKHJlc3VsdCkgOiAiMCIgKHggPj4gOCksICJyIiAoeCkpOworCXJldHVybiAoVWludDE2KXJlc3VsdDsKK30KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9fbTY4a19fKSAmJiAhZGVmaW5lZChfX21jb2xkZmlyZV9fKSkKK3N0YXRpYyBfX2lubGluZV9fIFVpbnQxNiBTRExfU3dhcDE2KFVpbnQxNiB4KQoreworCV9fYXNtX18oInJvcncgIzgsJTAiIDogIj1kIiAoeCkgOiAgIjAiICh4KSA6ICJjYyIpOworCXJldHVybiB4OworfQorI2Vsc2UKK3N0YXRpYyBfX2lubGluZV9fIFVpbnQxNiBTRExfU3dhcDE2KFVpbnQxNiB4KSB7CisJcmV0dXJuIFNETF9zdGF0aWNfY2FzdChVaW50MTYsICgoeDw8OCl8KHg+PjgpKSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICYmIFwKKyAgICEoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8PSA5NSAvKiBicm9rZW4gZ2NjIHZlcnNpb24gKi8pCitzdGF0aWMgX19pbmxpbmVfXyBVaW50MzIgU0RMX1N3YXAzMihVaW50MzIgeCkKK3sKKwlfX2FzbV9fKCJic3dhcCAlMCIgOiAiPXIiICh4KSA6ICIwIiAoeCkpOworCXJldHVybiB4OworfQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX3g4Nl82NF9fKQorc3RhdGljIF9faW5saW5lX18gVWludDMyIFNETF9Td2FwMzIoVWludDMyIHgpCit7CisJX19hc21fXygiYnN3YXBsICUwIiA6ICI9ciIgKHgpIDogIjAiICh4KSk7CisJcmV0dXJuIHg7Cit9CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3BwY19fKSkKK3N0YXRpYyBfX2lubGluZV9fIFVpbnQzMiBTRExfU3dhcDMyKFVpbnQzMiB4KQoreworCVVpbnQzMiByZXN1bHQ7CisKKwlfX2FzbV9fKCJybHdpbWkgJTAsJTIsMjQsMTYsMjMiIDogIj0mciIgKHJlc3VsdCkgOiAiMCIgKHg+PjI0KSwgInIiICh4KSk7CisJX19hc21fXygicmx3aW1pICUwLCUyLDgsOCwxNSIgICA6ICI9JnIiIChyZXN1bHQpIDogIjAiIChyZXN1bHQpLCAgICAiciIgKHgpKTsKKwlfX2FzbV9fKCJybHdpbWkgJTAsJTIsMjQsMCw3IiAgIDogIj0mciIgKHJlc3VsdCkgOiAiMCIgKHJlc3VsdCksICAgICJyIiAoeCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX202OGtfXykgJiYgIWRlZmluZWQoX19tY29sZGZpcmVfXykpCitzdGF0aWMgX19pbmxpbmVfXyBVaW50MzIgU0RMX1N3YXAzMihVaW50MzIgeCkKK3sKKwlfX2FzbV9fKCJyb3J3ICM4LCUwXG5cdHN3YXAgJTBcblx0cm9ydyAjOCwlMCIgOiAiPWQiICh4KSA6ICAiMCIgKHgpIDogImNjIik7CisJcmV0dXJuIHg7Cit9CisjZWxzZQorc3RhdGljIF9faW5saW5lX18gVWludDMyIFNETF9Td2FwMzIoVWludDMyIHgpIHsKKwlyZXR1cm4gU0RMX3N0YXRpY19jYXN0KFVpbnQzMiwgKCh4PDwyNCl8KCh4PDw4KSYweDAwRkYwMDAwKXwoKHg+PjgpJjB4MDAwMEZGMDApfCh4Pj4yNCkpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgXAorICAgIShfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDw9IDk1IC8qIGJyb2tlbiBnY2MgdmVyc2lvbiAqLykKK3N0YXRpYyBfX2lubGluZV9fIFVpbnQ2NCBTRExfU3dhcDY0KFVpbnQ2NCB4KQoreworCXVuaW9uIHsgCisJCXN0cnVjdCB7IFVpbnQzMiBhLGI7IH0gczsKKwkJVWludDY0IHU7CisJfSB2OworCXYudSA9IHg7CisJX19hc21fXygiYnN3YXBsICUwIDsgYnN3YXBsICUxIDsgeGNoZ2wgJTAsJTEiIAorCSAgICAgICAgOiAiPXIiICh2LnMuYSksICI9ciIgKHYucy5iKSAKKwkgICAgICAgIDogIjAiICh2LnMuYSksICIxIiAodi5zLmIpKTsgCisJcmV0dXJuIHYudTsKK30KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyBfX2lubGluZV9fIFVpbnQ2NCBTRExfU3dhcDY0KFVpbnQ2NCB4KQoreworCV9fYXNtX18oImJzd2FwcSAlMCIgOiAiPXIiICh4KSA6ICIwIiAoeCkpOworCXJldHVybiB4OworfQorI2Vsc2UKK3N0YXRpYyBfX2lubGluZV9fIFVpbnQ2NCBTRExfU3dhcDY0KFVpbnQ2NCB4KQoreworCVVpbnQzMiBoaSwgbG87CisKKwkvKiBTZXBhcmF0ZSBpbnRvIGhpZ2ggYW5kIGxvdyAzMi1iaXQgdmFsdWVzIGFuZCBzd2FwIHRoZW0gKi8KKwlsbyA9IFNETF9zdGF0aWNfY2FzdChVaW50MzIsIHggJiAweEZGRkZGRkZGKTsKKwl4ID4+PSAzMjsKKwloaSA9IFNETF9zdGF0aWNfY2FzdChVaW50MzIsIHggJiAweEZGRkZGRkZGKTsKKwl4ID0gU0RMX1N3YXAzMihsbyk7CisJeCA8PD0gMzI7CisJeCB8PSBTRExfU3dhcDMyKGhpKTsKKwlyZXR1cm4gKHgpOworfQorI2VuZGlmCisjZWxzZQorLyogVGhpcyBpcyBtYWlubHkgdG8ga2VlcCBjb21waWxlcnMgZnJvbSBjb21wbGFpbmluZyBpbiBTREwgY29kZS4KKyAqIElmIHRoZXJlIGlzIG5vIHJlYWwgNjQtYml0IGRhdGF0eXBlLCB0aGVuIGNvbXBpbGVycyB3aWxsIGNvbXBsYWluIGFib3V0CisgKiB0aGUgZmFrZSA2NC1iaXQgZGF0YXR5cGUgdGhhdCBTREwgcHJvdmlkZXMgd2hlbiBpdCBjb21waWxlcyB1c2VyIGNvZGUuCisgKi8KKyNkZWZpbmUgU0RMX1N3YXA2NChYKQkoWCkKKyNlbmRpZiAvKiBTRExfSEFTXzY0QklUX1RZUEUgKi8KKy8qQH0qLworCisvKioKKyAqICBAbmFtZSBTRExfU3dhcExFIGFuZCBTRExfU3dhcEJFIEZ1bmN0aW9ucworICogIEJ5dGVzd2FwIGl0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkIGVuZGlhbm5lc3MgdG8gdGhlIG5hdGl2ZSBlbmRpYW5uZXNzCisgKi8KKy8qQHsqLworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KKyNkZWZpbmUgU0RMX1N3YXBMRTE2KFgpCShYKQorI2RlZmluZSBTRExfU3dhcExFMzIoWCkJKFgpCisjZGVmaW5lIFNETF9Td2FwTEU2NChYKQkoWCkKKyNkZWZpbmUgU0RMX1N3YXBCRTE2KFgpCVNETF9Td2FwMTYoWCkKKyNkZWZpbmUgU0RMX1N3YXBCRTMyKFgpCVNETF9Td2FwMzIoWCkKKyNkZWZpbmUgU0RMX1N3YXBCRTY0KFgpCVNETF9Td2FwNjQoWCkKKyNlbHNlCisjZGVmaW5lIFNETF9Td2FwTEUxNihYKQlTRExfU3dhcDE2KFgpCisjZGVmaW5lIFNETF9Td2FwTEUzMihYKQlTRExfU3dhcDMyKFgpCisjZGVmaW5lIFNETF9Td2FwTEU2NChYKQlTRExfU3dhcDY0KFgpCisjZGVmaW5lIFNETF9Td2FwQkUxNihYKQkoWCkKKyNkZWZpbmUgU0RMX1N3YXBCRTMyKFgpCShYKQorI2RlZmluZSBTRExfU3dhcEJFNjQoWCkJKFgpCisjZW5kaWYKKy8qQH0qLworCisvKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjaW5jbHVkZSAiY2xvc2VfY29kZS5oIgorCisjZW5kaWYgLyogX1NETF9lbmRpYW5faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2Vycm9yLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFjY2UzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2Vycm9yLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqCisgKiAgQGZpbGUgU0RMX2Vycm9yLmgKKyAqICBTaW1wbGUgZXJyb3IgbWVzc2FnZSByb3V0aW5lcyBmb3IgU0RMCisgKi8KKworI2lmbmRlZiBfU0RMX2Vycm9yX2gKKyNkZWZpbmUgX1NETF9lcnJvcl9oCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisKKyNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCisvKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIAorICogIEBuYW1lIFB1YmxpYyBmdW5jdGlvbnMKKyAqLworLypAeyovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9TZXRFcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX0dldEVycm9yKHZvaWQpOworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfQ2xlYXJFcnJvcih2b2lkKTsKKy8qQH0qLworCisvKioKKyAqICBAbmFtZSBQcml2YXRlIGZ1bmN0aW9ucworICogIEBpbnRlcm5hbCBQcml2YXRlIGVycm9yIG1lc3NhZ2UgZnVuY3Rpb24gLSB1c2VkIGludGVybmFsbHkKKyAqLworLypAeyovCisjZGVmaW5lIFNETF9PdXRPZk1lbW9yeSgpCVNETF9FcnJvcihTRExfRU5PTUVNKQorI2RlZmluZSBTRExfVW5zdXBwb3J0ZWQoKQlTRExfRXJyb3IoU0RMX1VOU1VQUE9SVEVEKQordHlwZWRlZiBlbnVtIHsKKwlTRExfRU5PTUVNLAorCVNETF9FRlJFQUQsCisJU0RMX0VGV1JJVEUsCisJU0RMX0VGU0VFSywKKwlTRExfVU5TVVBQT1JURUQsCisJU0RMX0xBU1RFUlJPUgorfSBTRExfZXJyb3Jjb2RlOworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRXJyb3IoU0RMX2Vycm9yY29kZSBjb2RlKTsKKy8qQH0qLworCisvKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjaW5jbHVkZSAiY2xvc2VfY29kZS5oIgorCisjZW5kaWYgLyogX1NETF9lcnJvcl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfZXZlbnRzLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfZXZlbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiNDIwMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9ldmVudHMuaApAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqCisgKiAgQGZpbGUgU0RMX2V2ZW50cy5oCisgKiAgSW5jbHVkZSBmaWxlIGZvciBTREwgZXZlbnQgaGFuZGxpbmcKKyAqLworCisjaWZuZGVmIF9TRExfZXZlbnRzX2gKKyNkZWZpbmUgX1NETF9ldmVudHNfaAorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF9hY3RpdmUuaCIKKyNpbmNsdWRlICJTRExfa2V5Ym9hcmQuaCIKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICJTRExfam95c3RpY2suaCIKKyNpbmNsdWRlICJTRExfcXVpdC5oIgorCisjaW5jbHVkZSAiYmVnaW5fY29kZS5oIgorLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBAbmFtZSBHZW5lcmFsIGtleWJvYXJkL21vdXNlIHN0YXRlIGRlZmluaXRpb25zICovCisvKkB7Ki8KKyNkZWZpbmUgU0RMX1JFTEVBU0VECTAKKyNkZWZpbmUgU0RMX1BSRVNTRUQJMQorLypAfSovCisKKy8qKiBFdmVudCBlbnVtZXJhdGlvbnMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgICAgU0RMX05PRVZFTlQgPSAwLAkJCS8qKjwgVW51c2VkIChkbyBub3QgcmVtb3ZlKSAqLworICAgICAgIFNETF9BQ1RJVkVFVkVOVCwJCQkvKio8IEFwcGxpY2F0aW9uIGxvc2VzL2dhaW5zIHZpc2liaWxpdHkgKi8KKyAgICAgICBTRExfS0VZRE9XTiwJCQkvKio8IEtleXMgcHJlc3NlZCAqLworICAgICAgIFNETF9LRVlVUCwJCQkvKio8IEtleXMgcmVsZWFzZWQgKi8KKyAgICAgICBTRExfTU9VU0VNT1RJT04sCQkJLyoqPCBNb3VzZSBtb3ZlZCAqLworICAgICAgIFNETF9NT1VTRUJVVFRPTkRPV04sCQkvKio8IE1vdXNlIGJ1dHRvbiBwcmVzc2VkICovCisgICAgICAgU0RMX01PVVNFQlVUVE9OVVAsCQkvKio8IE1vdXNlIGJ1dHRvbiByZWxlYXNlZCAqLworICAgICAgIFNETF9KT1lBWElTTU9USU9OLAkJLyoqPCBKb3lzdGljayBheGlzIG1vdGlvbiAqLworICAgICAgIFNETF9KT1lCQUxMTU9USU9OLAkJLyoqPCBKb3lzdGljayB0cmFja2JhbGwgbW90aW9uICovCisgICAgICAgU0RMX0pPWUhBVE1PVElPTiwJCS8qKjwgSm95c3RpY2sgaGF0IHBvc2l0aW9uIGNoYW5nZSAqLworICAgICAgIFNETF9KT1lCVVRUT05ET1dOLAkJLyoqPCBKb3lzdGljayBidXR0b24gcHJlc3NlZCAqLworICAgICAgIFNETF9KT1lCVVRUT05VUCwJCQkvKio8IEpveXN0aWNrIGJ1dHRvbiByZWxlYXNlZCAqLworICAgICAgIFNETF9RVUlULAkJCS8qKjwgVXNlci1yZXF1ZXN0ZWQgcXVpdCAqLworICAgICAgIFNETF9TWVNXTUVWRU5ULAkJCS8qKjwgU3lzdGVtIHNwZWNpZmljIGV2ZW50ICovCisgICAgICAgU0RMX0VWRU5UX1JFU0VSVkVEQSwJCS8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuLiAqLworICAgICAgIFNETF9FVkVOVF9SRVNFUlZFREIsCQkvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLi4gKi8KKyAgICAgICBTRExfVklERU9SRVNJWkUsCQkJLyoqPCBVc2VyIHJlc2l6ZWQgdmlkZW8gbW9kZSAqLworICAgICAgIFNETF9WSURFT0VYUE9TRSwJCQkvKio8IFNjcmVlbiBuZWVkcyB0byBiZSByZWRyYXduICovCisgICAgICAgU0RMX0VWRU5UX1JFU0VSVkVEMiwJCS8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuLiAqLworICAgICAgIFNETF9FVkVOVF9SRVNFUlZFRDMsCQkvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLi4gKi8KKyAgICAgICBTRExfRVZFTlRfUkVTRVJWRUQ0LAkJLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4uICovCisgICAgICAgU0RMX0VWRU5UX1JFU0VSVkVENSwJCS8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuLiAqLworICAgICAgIFNETF9FVkVOVF9SRVNFUlZFRDYsCQkvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLi4gKi8KKyAgICAgICBTRExfRVZFTlRfUkVTRVJWRUQ3LAkJLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4uICovCisgICAgICAgLyoqIEV2ZW50cyBTRExfVVNFUkVWRU5UIHRocm91Z2ggU0RMX01BWEVWRU5UUy0xIGFyZSBmb3IgeW91ciB1c2UgKi8KKyAgICAgICBTRExfVVNFUkVWRU5UID0gMjQsCisgICAgICAgLyoqIFRoaXMgbGFzdCBldmVudCBpcyBvbmx5IGZvciBib3VuZGluZyBpbnRlcm5hbCBhcnJheXMKKwkqICBJdCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGV2ZW50IG1hc2sgZGF0YXR5cGUgLS0gVWludDMyCisgICAgICAgICovCisgICAgICAgU0RMX05VTUVWRU5UUyA9IDMyCit9IFNETF9FdmVudFR5cGU7CisKKy8qKiBAbmFtZSBQcmVkZWZpbmVkIGV2ZW50IG1hc2tzICovCisvKkB7Ki8KKyNkZWZpbmUgU0RMX0VWRU5UTUFTSyhYKQkoMTw8KFgpKQordHlwZWRlZiBlbnVtIHsKKwlTRExfQUNUSVZFRVZFTlRNQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfQUNUSVZFRVZFTlQpLAorCVNETF9LRVlET1dOTUFTSwkJPSBTRExfRVZFTlRNQVNLKFNETF9LRVlET1dOKSwKKwlTRExfS0VZVVBNQVNLCQk9IFNETF9FVkVOVE1BU0soU0RMX0tFWVVQKSwKKwlTRExfS0VZRVZFTlRNQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfS0VZRE9XTil8CisJICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfRVZFTlRNQVNLKFNETF9LRVlVUCksCisJU0RMX01PVVNFTU9USU9OTUFTSwk9IFNETF9FVkVOVE1BU0soU0RMX01PVVNFTU9USU9OKSwKKwlTRExfTU9VU0VCVVRUT05ET1dOTUFTSwk9IFNETF9FVkVOVE1BU0soU0RMX01PVVNFQlVUVE9ORE9XTiksCisJU0RMX01PVVNFQlVUVE9OVVBNQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfTU9VU0VCVVRUT05VUCksCisJU0RMX01PVVNFRVZFTlRNQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfTU9VU0VNT1RJT04pfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0VWRU5UTUFTSyhTRExfTU9VU0VCVVRUT05ET1dOKXwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9FVkVOVE1BU0soU0RMX01PVVNFQlVUVE9OVVApLAorCVNETF9KT1lBWElTTU9USU9OTUFTSwk9IFNETF9FVkVOVE1BU0soU0RMX0pPWUFYSVNNT1RJT04pLAorCVNETF9KT1lCQUxMTU9USU9OTUFTSwk9IFNETF9FVkVOVE1BU0soU0RMX0pPWUJBTExNT1RJT04pLAorCVNETF9KT1lIQVRNT1RJT05NQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfSk9ZSEFUTU9USU9OKSwKKwlTRExfSk9ZQlVUVE9ORE9XTk1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9KT1lCVVRUT05ET1dOKSwKKwlTRExfSk9ZQlVUVE9OVVBNQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfSk9ZQlVUVE9OVVApLAorCVNETF9KT1lFVkVOVE1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9KT1lBWElTTU9USU9OKXwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9FVkVOVE1BU0soU0RMX0pPWUJBTExNT1RJT04pfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0VWRU5UTUFTSyhTRExfSk9ZSEFUTU9USU9OKXwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9FVkVOVE1BU0soU0RMX0pPWUJVVFRPTkRPV04pfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0VWRU5UTUFTSyhTRExfSk9ZQlVUVE9OVVApLAorCVNETF9WSURFT1JFU0laRU1BU0sJPSBTRExfRVZFTlRNQVNLKFNETF9WSURFT1JFU0laRSksCisJU0RMX1ZJREVPRVhQT1NFTUFTSwk9IFNETF9FVkVOVE1BU0soU0RMX1ZJREVPRVhQT1NFKSwKKwlTRExfUVVJVE1BU0sJCT0gU0RMX0VWRU5UTUFTSyhTRExfUVVJVCksCisJU0RMX1NZU1dNRVZFTlRNQVNLCT0gU0RMX0VWRU5UTUFTSyhTRExfU1lTV01FVkVOVCkKK30gU0RMX0V2ZW50TWFzayA7CisjZGVmaW5lIFNETF9BTExFVkVOVFMJCTB4RkZGRkZGRkYKKy8qQH0qLworCisvKiogQXBwbGljYXRpb24gdmlzaWJpbGl0eSBldmVudCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9BY3RpdmVFdmVudCB7CisJVWludDggdHlwZTsJLyoqPCBTRExfQUNUSVZFRVZFTlQgKi8KKwlVaW50OCBnYWluOwkvKio8IFdoZXRoZXIgZ2l2ZW4gc3RhdGVzIHdlcmUgZ2FpbmVkIG9yIGxvc3QgKDEvMCkgKi8KKwlVaW50OCBzdGF0ZTsJLyoqPCBBIG1hc2sgb2YgdGhlIGZvY3VzIHN0YXRlcyAqLworfSBTRExfQWN0aXZlRXZlbnQ7CisKKy8qKiBLZXlib2FyZCBldmVudCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9LZXlib2FyZEV2ZW50IHsKKwlVaW50OCB0eXBlOwkvKio8IFNETF9LRVlET1dOIG9yIFNETF9LRVlVUCAqLworCVVpbnQ4IHdoaWNoOwkvKio8IFRoZSBrZXlib2FyZCBkZXZpY2UgaW5kZXggKi8KKwlVaW50OCBzdGF0ZTsJLyoqPCBTRExfUFJFU1NFRCBvciBTRExfUkVMRUFTRUQgKi8KKwlTRExfa2V5c3ltIGtleXN5bTsKK30gU0RMX0tleWJvYXJkRXZlbnQ7CisKKy8qKiBNb3VzZSBtb3Rpb24gZXZlbnQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBTRExfTW91c2VNb3Rpb25FdmVudCB7CisJVWludDggdHlwZTsJLyoqPCBTRExfTU9VU0VNT1RJT04gKi8KKwlVaW50OCB3aGljaDsJLyoqPCBUaGUgbW91c2UgZGV2aWNlIGluZGV4ICovCisJVWludDggc3RhdGU7CS8qKjwgVGhlIGN1cnJlbnQgYnV0dG9uIHN0YXRlICovCisJVWludDE2IHgsIHk7CS8qKjwgVGhlIFgvWSBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgKi8KKwlTaW50MTYgeHJlbDsJLyoqPCBUaGUgcmVsYXRpdmUgbW90aW9uIGluIHRoZSBYIGRpcmVjdGlvbiAqLworCVNpbnQxNiB5cmVsOwkvKio8IFRoZSByZWxhdGl2ZSBtb3Rpb24gaW4gdGhlIFkgZGlyZWN0aW9uICovCit9IFNETF9Nb3VzZU1vdGlvbkV2ZW50OworCisvKiogTW91c2UgYnV0dG9uIGV2ZW50IHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgU0RMX01vdXNlQnV0dG9uRXZlbnQgeworCVVpbnQ4IHR5cGU7CS8qKjwgU0RMX01PVVNFQlVUVE9ORE9XTiBvciBTRExfTU9VU0VCVVRUT05VUCAqLworCVVpbnQ4IHdoaWNoOwkvKio8IFRoZSBtb3VzZSBkZXZpY2UgaW5kZXggKi8KKwlVaW50OCBidXR0b247CS8qKjwgVGhlIG1vdXNlIGJ1dHRvbiBpbmRleCAqLworCVVpbnQ4IHN0YXRlOwkvKio8IFNETF9QUkVTU0VEIG9yIFNETF9SRUxFQVNFRCAqLworCVVpbnQxNiB4LCB5OwkvKio8IFRoZSBYL1kgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlIGF0IHByZXNzIHRpbWUgKi8KK30gU0RMX01vdXNlQnV0dG9uRXZlbnQ7CisKKy8qKiBKb3lzdGljayBheGlzIG1vdGlvbiBldmVudCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9Kb3lBeGlzRXZlbnQgeworCVVpbnQ4IHR5cGU7CS8qKjwgU0RMX0pPWUFYSVNNT1RJT04gKi8KKwlVaW50OCB3aGljaDsJLyoqPCBUaGUgam95c3RpY2sgZGV2aWNlIGluZGV4ICovCisJVWludDggYXhpczsJLyoqPCBUaGUgam95c3RpY2sgYXhpcyBpbmRleCAqLworCVNpbnQxNiB2YWx1ZTsJLyoqPCBUaGUgYXhpcyB2YWx1ZSAocmFuZ2U6IC0zMjc2OCB0byAzMjc2NykgKi8KK30gU0RMX0pveUF4aXNFdmVudDsKKworLyoqIEpveXN0aWNrIHRyYWNrYmFsbCBtb3Rpb24gZXZlbnQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBTRExfSm95QmFsbEV2ZW50IHsKKwlVaW50OCB0eXBlOwkvKio8IFNETF9KT1lCQUxMTU9USU9OICovCisJVWludDggd2hpY2g7CS8qKjwgVGhlIGpveXN0aWNrIGRldmljZSBpbmRleCAqLworCVVpbnQ4IGJhbGw7CS8qKjwgVGhlIGpveXN0aWNrIHRyYWNrYmFsbCBpbmRleCAqLworCVNpbnQxNiB4cmVsOwkvKio8IFRoZSByZWxhdGl2ZSBtb3Rpb24gaW4gdGhlIFggZGlyZWN0aW9uICovCisJU2ludDE2IHlyZWw7CS8qKjwgVGhlIHJlbGF0aXZlIG1vdGlvbiBpbiB0aGUgWSBkaXJlY3Rpb24gKi8KK30gU0RMX0pveUJhbGxFdmVudDsKKworLyoqIEpveXN0aWNrIGhhdCBwb3NpdGlvbiBjaGFuZ2UgZXZlbnQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBTRExfSm95SGF0RXZlbnQgeworCVVpbnQ4IHR5cGU7CS8qKjwgU0RMX0pPWUhBVE1PVElPTiAqLworCVVpbnQ4IHdoaWNoOwkvKio8IFRoZSBqb3lzdGljayBkZXZpY2UgaW5kZXggKi8KKwlVaW50OCBoYXQ7CS8qKjwgVGhlIGpveXN0aWNrIGhhdCBpbmRleCAqLworCVVpbnQ4IHZhbHVlOwkvKio8IFRoZSBoYXQgcG9zaXRpb24gdmFsdWU6CisJCQkgKiAgIFNETF9IQVRfTEVGVFVQICAgU0RMX0hBVF9VUCAgICAgICBTRExfSEFUX1JJR0hUVVAKKwkJCSAqICAgU0RMX0hBVF9MRUZUICAgICBTRExfSEFUX0NFTlRFUkVEIFNETF9IQVRfUklHSFQKKwkJCSAqICAgU0RMX0hBVF9MRUZURE9XTiBTRExfSEFUX0RPV04gICAgIFNETF9IQVRfUklHSFRET1dOCisJCQkgKiAgTm90ZSB0aGF0IHplcm8gbWVhbnMgdGhlIFBPViBpcyBjZW50ZXJlZC4KKwkJCSAqLworfSBTRExfSm95SGF0RXZlbnQ7CisKKy8qKiBKb3lzdGljayBidXR0b24gZXZlbnQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBTRExfSm95QnV0dG9uRXZlbnQgeworCVVpbnQ4IHR5cGU7CS8qKjwgU0RMX0pPWUJVVFRPTkRPV04gb3IgU0RMX0pPWUJVVFRPTlVQICovCisJVWludDggd2hpY2g7CS8qKjwgVGhlIGpveXN0aWNrIGRldmljZSBpbmRleCAqLworCVVpbnQ4IGJ1dHRvbjsJLyoqPCBUaGUgam95c3RpY2sgYnV0dG9uIGluZGV4ICovCisJVWludDggc3RhdGU7CS8qKjwgU0RMX1BSRVNTRUQgb3IgU0RMX1JFTEVBU0VEICovCit9IFNETF9Kb3lCdXR0b25FdmVudDsKKworLyoqIFRoZSAid2luZG93IHJlc2l6ZWQiIGV2ZW50CisgKiAgV2hlbiB5b3UgZ2V0IHRoaXMgZXZlbnQsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgYSBuZXcgdmlkZW8KKyAqICBtb2RlIHdpdGggdGhlIG5ldyB3aWR0aCBhbmQgaGVpZ2h0LgorICovCit0eXBlZGVmIHN0cnVjdCBTRExfUmVzaXplRXZlbnQgeworCVVpbnQ4IHR5cGU7CS8qKjwgU0RMX1ZJREVPUkVTSVpFICovCisJaW50IHc7CQkvKio8IE5ldyB3aWR0aCAqLworCWludCBoOwkJLyoqPCBOZXcgaGVpZ2h0ICovCit9IFNETF9SZXNpemVFdmVudDsKKworLyoqIFRoZSAic2NyZWVuIHJlZHJhdyIgZXZlbnQgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9FeHBvc2VFdmVudCB7CisJVWludDggdHlwZTsJLyoqPCBTRExfVklERU9FWFBPU0UgKi8KK30gU0RMX0V4cG9zZUV2ZW50OworCisvKiogVGhlICJxdWl0IHJlcXVlc3RlZCIgZXZlbnQgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9RdWl0RXZlbnQgeworCVVpbnQ4IHR5cGU7CS8qKjwgU0RMX1FVSVQgKi8KK30gU0RMX1F1aXRFdmVudDsKKworLyoqIEEgdXNlci1kZWZpbmVkIGV2ZW50IHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9Vc2VyRXZlbnQgeworCVVpbnQ4IHR5cGU7CS8qKjwgU0RMX1VTRVJFVkVOVCB0aHJvdWdoIFNETF9OVU1FVkVOVFMtMSAqLworCWludCBjb2RlOwkvKio8IFVzZXIgZGVmaW5lZCBldmVudCBjb2RlICovCisJdm9pZCAqZGF0YTE7CS8qKjwgVXNlciBkZWZpbmVkIGRhdGEgcG9pbnRlciAqLworCXZvaWQgKmRhdGEyOwkvKio8IFVzZXIgZGVmaW5lZCBkYXRhIHBvaW50ZXIgKi8KK30gU0RMX1VzZXJFdmVudDsKKworLyoqIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGV2ZW50LCB5b3Ugc2hvdWxkIGluY2x1ZGUgU0RMX3N5c3dtLmggKi8KK3N0cnVjdCBTRExfU3lzV01tc2c7Cit0eXBlZGVmIHN0cnVjdCBTRExfU3lzV01tc2cgU0RMX1N5c1dNbXNnOwordHlwZWRlZiBzdHJ1Y3QgU0RMX1N5c1dNRXZlbnQgeworCVVpbnQ4IHR5cGU7CisJU0RMX1N5c1dNbXNnICptc2c7Cit9IFNETF9TeXNXTUV2ZW50OworCisvKiogR2VuZXJhbCBldmVudCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgdW5pb24gU0RMX0V2ZW50IHsKKwlVaW50OCB0eXBlOworCVNETF9BY3RpdmVFdmVudCBhY3RpdmU7CisJU0RMX0tleWJvYXJkRXZlbnQga2V5OworCVNETF9Nb3VzZU1vdGlvbkV2ZW50IG1vdGlvbjsKKwlTRExfTW91c2VCdXR0b25FdmVudCBidXR0b247CisJU0RMX0pveUF4aXNFdmVudCBqYXhpczsKKwlTRExfSm95QmFsbEV2ZW50IGpiYWxsOworCVNETF9Kb3lIYXRFdmVudCBqaGF0OworCVNETF9Kb3lCdXR0b25FdmVudCBqYnV0dG9uOworCVNETF9SZXNpemVFdmVudCByZXNpemU7CisJU0RMX0V4cG9zZUV2ZW50IGV4cG9zZTsKKwlTRExfUXVpdEV2ZW50IHF1aXQ7CisJU0RMX1VzZXJFdmVudCB1c2VyOworCVNETF9TeXNXTUV2ZW50IHN5c3dtOworfSBTRExfRXZlbnQ7CisKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworCisvKiogUHVtcHMgdGhlIGV2ZW50IGxvb3AsIGdhdGhlcmluZyBldmVudHMgZnJvbSB0aGUgaW5wdXQgZGV2aWNlcy4KKyAqICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGV2ZW50IHF1ZXVlIGFuZCBpbnRlcm5hbCBpbnB1dCBkZXZpY2Ugc3RhdGUuCisgKiAgVGhpcyBzaG91bGQgb25seSBiZSBydW4gaW4gdGhlIHRocmVhZCB0aGF0IHNldHMgdGhlIHZpZGVvIG1vZGUuCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1B1bXBFdmVudHModm9pZCk7CisKK3R5cGVkZWYgZW51bSB7CisJU0RMX0FEREVWRU5ULAorCVNETF9QRUVLRVZFTlQsCisJU0RMX0dFVEVWRU5UCit9IFNETF9ldmVudGFjdGlvbjsKKworLyoqCisgKiAgQ2hlY2tzIHRoZSBldmVudCBxdWV1ZSBmb3IgbWVzc2FnZXMgYW5kIG9wdGlvbmFsbHkgcmV0dXJucyB0aGVtLgorICoKKyAqICBJZiAnYWN0aW9uJyBpcyBTRExfQURERVZFTlQsIHVwIHRvICdudW1ldmVudHMnIGV2ZW50cyB3aWxsIGJlIGFkZGVkIHRvCisgKiAgdGhlIGJhY2sgb2YgdGhlIGV2ZW50IHF1ZXVlLgorICogIElmICdhY3Rpb24nIGlzIFNETF9QRUVLRVZFTlQsIHVwIHRvICdudW1ldmVudHMnIGV2ZW50cyBhdCB0aGUgZnJvbnQKKyAqICBvZiB0aGUgZXZlbnQgcXVldWUsIG1hdGNoaW5nICdtYXNrJywgd2lsbCBiZSByZXR1cm5lZCBhbmQgd2lsbCBub3QKKyAqICBiZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlLgorICogIElmICdhY3Rpb24nIGlzIFNETF9HRVRFVkVOVCwgdXAgdG8gJ251bWV2ZW50cycgZXZlbnRzIGF0IHRoZSBmcm9udCAKKyAqICBvZiB0aGUgZXZlbnQgcXVldWUsIG1hdGNoaW5nICdtYXNrJywgd2lsbCBiZSByZXR1cm5lZCBhbmQgd2lsbCBiZQorICogIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUuCisgKgorICogIEByZXR1cm4KKyAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBldmVudHMgYWN0dWFsbHkgc3RvcmVkLCBvciAtMQorICogIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9QZWVwRXZlbnRzKFNETF9FdmVudCAqZXZlbnRzLCBpbnQgbnVtZXZlbnRzLAorCQkJCVNETF9ldmVudGFjdGlvbiBhY3Rpb24sIFVpbnQzMiBtYXNrKTsKKworLyoqIFBvbGxzIGZvciBjdXJyZW50bHkgcGVuZGluZyBldmVudHMsIGFuZCByZXR1cm5zIDEgaWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nCisgKiAgZXZlbnRzLCBvciAwIGlmIHRoZXJlIGFyZSBub25lIGF2YWlsYWJsZS4gIElmICdldmVudCcgaXMgbm90IE5VTEwsIHRoZSBuZXh0CisgKiAgZXZlbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBhbmQgc3RvcmVkIGluIHRoYXQgYXJlYS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Qb2xsRXZlbnQoU0RMX0V2ZW50ICpldmVudCk7CisKKy8qKiBXYWl0cyBpbmRlZmluaXRlbHkgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSBldmVudCwgcmV0dXJuaW5nIDEsIG9yIDAgaWYgdGhlcmUKKyAqICB3YXMgYW4gZXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgZXZlbnRzLiAgSWYgJ2V2ZW50JyBpcyBub3QgTlVMTCwgdGhlIG5leHQKKyAqICBldmVudCBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGFuZCBzdG9yZWQgaW4gdGhhdCBhcmVhLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1dhaXRFdmVudChTRExfRXZlbnQgKmV2ZW50KTsKKworLyoqIEFkZCBhbiBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuCisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEgaWYgdGhlIGV2ZW50IHF1ZXVlIHdhcyBmdWxsCisgKiAgb3IgdGhlcmUgd2FzIHNvbWUgb3RoZXIgZXJyb3IuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfUHVzaEV2ZW50KFNETF9FdmVudCAqZXZlbnQpOworCisvKiogQG5hbWUgRXZlbnQgRmlsdGVyaW5nICovCisvKkB7Ki8KK3R5cGVkZWYgaW50IChTRExDQUxMICpTRExfRXZlbnRGaWx0ZXIpKGNvbnN0IFNETF9FdmVudCAqZXZlbnQpOworLyoqCisgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGEgZmlsdGVyIHRvIHByb2Nlc3MgYWxsIGV2ZW50cyBiZWZvcmUgdGhleQorICogIGNoYW5nZSBpbnRlcm5hbCBzdGF0ZSBhbmQgYXJlIHBvc3RlZCB0byB0aGUgaW50ZXJuYWwgZXZlbnQgcXVldWUuCisgKgorICogIFRoZSBmaWx0ZXIgaXMgcHJvdHlwdGVkIGFzOgorICogICAgICBAY29kZSB0eXBlZGVmIGludCAoU0RMQ0FMTCAqU0RMX0V2ZW50RmlsdGVyKShjb25zdCBTRExfRXZlbnQgKmV2ZW50KTsgQGVuZGNvZGUKKyAqCisgKiBJZiB0aGUgZmlsdGVyIHJldHVybnMgMSwgdGhlbiB0aGUgZXZlbnQgd2lsbCBiZSBhZGRlZCB0byB0aGUgaW50ZXJuYWwgcXVldWUuCisgKiBJZiBpdCByZXR1cm5zIDAsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmUgZHJvcHBlZCBmcm9tIHRoZSBxdWV1ZSwgYnV0IHRoZSAKKyAqIGludGVybmFsIHN0YXRlIHdpbGwgc3RpbGwgYmUgdXBkYXRlZC4gIFRoaXMgYWxsb3dzIHNlbGVjdGl2ZSBmaWx0ZXJpbmcgb2YKKyAqIGR5bmFtaWNhbGx5IGFycml2aW5nIGV2ZW50cy4KKyAqCisgKiBAd2FybmluZyAgQmUgdmVyeSBjYXJlZnVsIG9mIHdoYXQgeW91IGRvIGluIHRoZSBldmVudCBmaWx0ZXIgZnVuY3Rpb24sIGFzIAorICogICAgICAgICAgIGl0IG1heSBydW4gaW4gYSBkaWZmZXJlbnQgdGhyZWFkIQorICoKKyAqIFRoZXJlIGlzIG9uZSBjYXZlYXQgd2hlbiBkZWFsaW5nIHdpdGggdGhlIFNETF9RVUlURVZFTlQgZXZlbnQgdHlwZS4gIFRoZQorICogZXZlbnQgZmlsdGVyIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHdpbmRvdyBtYW5hZ2VyIGRlc2lyZXMgdG8gY2xvc2UgdGhlCisgKiBhcHBsaWNhdGlvbiB3aW5kb3cuICBJZiB0aGUgZXZlbnQgZmlsdGVyIHJldHVybnMgMSwgdGhlbiB0aGUgd2luZG93IHdpbGwKKyAqIGJlIGNsb3NlZCwgb3RoZXJ3aXNlIHRoZSB3aW5kb3cgd2lsbCByZW1haW4gb3BlbiBpZiBwb3NzaWJsZS4KKyAqIElmIHRoZSBxdWl0IGV2ZW50IGlzIGdlbmVyYXRlZCBieSBhbiBpbnRlcnJ1cHQgc2lnbmFsLCBpdCB3aWxsIGJ5cGFzcyB0aGUKKyAqIGludGVybmFsIHF1ZXVlIGFuZCBiZSBkZWxpdmVyZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGF0IHRoZSBuZXh0IGV2ZW50IHBvbGwuCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1NldEV2ZW50RmlsdGVyKFNETF9FdmVudEZpbHRlciBmaWx0ZXIpOworCisvKioKKyAqICBSZXR1cm4gdGhlIGN1cnJlbnQgZXZlbnQgZmlsdGVyIC0gY2FuIGJlIHVzZWQgdG8gImNoYWluIiBmaWx0ZXJzLgorICogIElmIHRoZXJlIGlzIG5vIGV2ZW50IGZpbHRlciBzZXQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMLgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX0V2ZW50RmlsdGVyIFNETENBTEwgU0RMX0dldEV2ZW50RmlsdGVyKHZvaWQpOworLypAfSovCisKKy8qKiBAbmFtZSBFdmVudCBTdGF0ZSAqLworLypAeyovCisjZGVmaW5lIFNETF9RVUVSWQktMQorI2RlZmluZSBTRExfSUdOT1JFCSAwCisjZGVmaW5lIFNETF9ESVNBQkxFCSAwCisjZGVmaW5lIFNETF9FTkFCTEUJIDEKKy8qQH0qLworCisvKioKKyogVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgc3RhdGUgb2YgcHJvY2Vzc2luZyBjZXJ0YWluIGV2ZW50cy4KKyogSWYgJ3N0YXRlJyBpcyBzZXQgdG8gU0RMX0lHTk9SRSwgdGhhdCBldmVudCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZHJvcHBlZAorKiBmcm9tIHRoZSBldmVudCBxdWV1ZSBhbmQgd2lsbCBub3QgZXZlbnQgYmUgZmlsdGVyZWQuCisqIElmICdzdGF0ZScgaXMgc2V0IHRvIFNETF9FTkFCTEUsIHRoYXQgZXZlbnQgd2lsbCBiZSBwcm9jZXNzZWQgbm9ybWFsbHkuCisqIElmICdzdGF0ZScgaXMgc2V0IHRvIFNETF9RVUVSWSwgU0RMX0V2ZW50U3RhdGUoKSB3aWxsIHJldHVybiB0aGUgCisqIGN1cnJlbnQgcHJvY2Vzc2luZyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LgorKi8KK2V4dGVybiBERUNMU1BFQyBVaW50OCBTRExDQUxMIFNETF9FdmVudFN0YXRlKFVpbnQ4IHR5cGUsIGludCBzdGF0ZSk7CisKKy8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCisKKyNlbmRpZiAvKiBfU0RMX2V2ZW50c19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfZ2V0ZW52LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfZ2V0ZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhNjMwMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9nZXRlbnYuaApAQCAtMCwwICsxLDI4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKiogQGZpbGUgU0RMX2dldGVudi5oCisgKiAgQGRlcHJlY2F0ZWQgVXNlIFNETF9zdGRpbmMuaCBpbnN0ZWFkCisgKi8KKworLyogREVQUkVDQVRFRCAqLworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9qb3lzdGljay5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2pveXN0aWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4ZDFhOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9qb3lzdGljay5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKiogQGZpbGUgU0RMX2pveXN0aWNrLmgKKyAqICBJbmNsdWRlIGZpbGUgZm9yIFNETCBqb3lzdGljayBldmVudCBoYW5kbGluZworICovCisKKyNpZm5kZWYgX1NETF9qb3lzdGlja19oCisjZGVmaW5lIF9TRExfam95c3RpY2tfaAorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorCisjaW5jbHVkZSAiYmVnaW5fY29kZS5oIgorLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBAZmlsZSBTRExfam95c3RpY2suaAorICogIEBub3RlIEluIG9yZGVyIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMsIFNETF9Jbml0KCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkCisgKiAgICAgICAgd2l0aCB0aGUgU0RMX0lOSVRfSk9ZU1RJQ0sgZmxhZy4gIFRoaXMgY2F1c2VzIFNETCB0byBzY2FuIHRoZSBzeXN0ZW0KKyAqICAgICAgICBmb3Igam95c3RpY2tzLCBhbmQgbG9hZCBhcHByb3ByaWF0ZSBkcml2ZXJzLgorICovCisKKy8qKiBUaGUgam95c3RpY2sgc3RydWN0dXJlIHVzZWQgdG8gaWRlbnRpZnkgYW4gU0RMIGpveXN0aWNrICovCitzdHJ1Y3QgX1NETF9Kb3lzdGljazsKK3R5cGVkZWYgc3RydWN0IF9TRExfSm95c3RpY2sgU0RMX0pveXN0aWNrOworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCisvKioKKyAqIENvdW50IHRoZSBudW1iZXIgb2Ygam95c3RpY2tzIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW0KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9OdW1Kb3lzdGlja3Modm9pZCk7CisKKy8qKgorICogR2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgbmFtZSBvZiBhIGpveXN0aWNrLgorICoKKyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBiZWZvcmUgYW55IGpveXN0aWNrcyBhcmUgb3BlbmVkLgorICogSWYgbm8gbmFtZSBjYW4gYmUgZm91bmQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMLgorICovCitleHRlcm4gREVDTFNQRUMgY29uc3QgY2hhciAqIFNETENBTEwgU0RMX0pveXN0aWNrTmFtZShpbnQgZGV2aWNlX2luZGV4KTsKKworLyoqCisgKiBPcGVuIGEgam95c3RpY2sgZm9yIHVzZS4KKyAqCisgKiBAcGFyYW1baW5dIGRldmljZV9pbmRleAorICogVGhlIGluZGV4IHBhc3NlZCBhcyBhbiBhcmd1bWVudCByZWZlcnMgdG8KKyAqIHRoZSBOJ3RoIGpveXN0aWNrIG9uIHRoZSBzeXN0ZW0uICBUaGlzIGluZGV4IGlzIHRoZSB2YWx1ZSB3aGljaCB3aWxsCisgKiBpZGVudGlmeSB0aGlzIGpveXN0aWNrIGluIGZ1dHVyZSBqb3lzdGljayBldmVudHMuCisgKgorICogQHJldHVybiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBqb3lzdGljayBpZGVudGlmaWVyLCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX0pveXN0aWNrICogU0RMQ0FMTCBTRExfSm95c3RpY2tPcGVuKGludCBkZXZpY2VfaW5kZXgpOworCisvKioKKyAqIFJldHVybnMgMSBpZiB0aGUgam95c3RpY2sgaGFzIGJlZW4gb3BlbmVkLCBvciAwIGlmIGl0IGhhcyBub3QuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfSm95c3RpY2tPcGVuZWQoaW50IGRldmljZV9pbmRleCk7CisKKy8qKgorICogR2V0IHRoZSBkZXZpY2UgaW5kZXggb2YgYW4gb3BlbmVkIGpveXN0aWNrLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0pveXN0aWNrSW5kZXgoU0RMX0pveXN0aWNrICpqb3lzdGljayk7CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgZ2VuZXJhbCBheGlzIGNvbnRyb2xzIG9uIGEgam95c3RpY2sKKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Kb3lzdGlja051bUF4ZXMoU0RMX0pveXN0aWNrICpqb3lzdGljayk7CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgdHJhY2tiYWxscyBvbiBhIGpveXN0aWNrCisgKgorICogSm95c3RpY2sgdHJhY2tiYWxscyBoYXZlIG9ubHkgcmVsYXRpdmUgbW90aW9uIGV2ZW50cyBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZW0gYW5kIHRoZWlyIHN0YXRlIGNhbm5vdCBiZSBwb2xsZWQuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfSm95c3RpY2tOdW1CYWxscyhTRExfSm95c3RpY2sgKmpveXN0aWNrKTsKKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBQT1YgaGF0cyBvbiBhIGpveXN0aWNrCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfSm95c3RpY2tOdW1IYXRzKFNETF9Kb3lzdGljayAqam95c3RpY2spOworCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMgb24gYSBqb3lzdGljaworICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0pveXN0aWNrTnVtQnV0dG9ucyhTRExfSm95c3RpY2sgKmpveXN0aWNrKTsKKworLyoqCisgKiBVcGRhdGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9wZW4gam95c3RpY2tzLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGV2ZW50IGxvb3AgaWYgYW55IGpveXN0aWNrCisgKiBldmVudHMgYXJlIGVuYWJsZWQuCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0pveXN0aWNrVXBkYXRlKHZvaWQpOworCisvKioKKyAqIEVuYWJsZS9kaXNhYmxlIGpveXN0aWNrIGV2ZW50IHBvbGxpbmcuCisgKgorICogSWYgam95c3RpY2sgZXZlbnRzIGFyZSBkaXNhYmxlZCwgeW91IG11c3QgY2FsbCBTRExfSm95c3RpY2tVcGRhdGUoKQorICogeW91cnNlbGYgYW5kIGNoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgam95c3RpY2sgd2hlbiB5b3Ugd2FudCBqb3lzdGljaworICogaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtW2luXSBzdGF0ZSBUaGUgc3RhdGUgY2FuIGJlIG9uZSBvZiBTRExfUVVFUlksIFNETF9FTkFCTEUgb3IgU0RMX0lHTk9SRS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Kb3lzdGlja0V2ZW50U3RhdGUoaW50IHN0YXRlKTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gYXhpcyBjb250cm9sIG9uIGEgam95c3RpY2sKKyAqCisgKiBAcGFyYW1baW5dIGF4aXMgVGhlIGF4aXMgaW5kaWNlcyBzdGFydCBhdCBpbmRleCAwLgorICoKKyAqIEByZXR1cm4gVGhlIHN0YXRlIGlzIGEgdmFsdWUgcmFuZ2luZyBmcm9tIC0zMjc2OCB0byAzMjc2Ny4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIFNpbnQxNiBTRExDQUxMIFNETF9Kb3lzdGlja0dldEF4aXMoU0RMX0pveXN0aWNrICpqb3lzdGljaywgaW50IGF4aXMpOworCisvKioKKyAqICBAbmFtZSBIYXQgUG9zaXRpb25zCisgKiAgVGhlIHJldHVybiB2YWx1ZSBvZiBTRExfSm95c3RpY2tHZXRIYXQoKSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb3NpdGlvbnM6CisgKi8KKy8qQHsqLworI2RlZmluZSBTRExfSEFUX0NFTlRFUkVECTB4MDAKKyNkZWZpbmUgU0RMX0hBVF9VUAkJMHgwMQorI2RlZmluZSBTRExfSEFUX1JJR0hUCQkweDAyCisjZGVmaW5lIFNETF9IQVRfRE9XTgkJMHgwNAorI2RlZmluZSBTRExfSEFUX0xFRlQJCTB4MDgKKyNkZWZpbmUgU0RMX0hBVF9SSUdIVFVQCQkoU0RMX0hBVF9SSUdIVHxTRExfSEFUX1VQKQorI2RlZmluZSBTRExfSEFUX1JJR0hURE9XTgkoU0RMX0hBVF9SSUdIVHxTRExfSEFUX0RPV04pCisjZGVmaW5lIFNETF9IQVRfTEVGVFVQCQkoU0RMX0hBVF9MRUZUfFNETF9IQVRfVVApCisjZGVmaW5lIFNETF9IQVRfTEVGVERPV04JKFNETF9IQVRfTEVGVHxTRExfSEFUX0RPV04pCisvKkB9Ki8KKworLyoqIAorICogIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIFBPViBoYXQgb24gYSBqb3lzdGljaworICoKKyAqICBAcGFyYW1baW5dIGhhdCBUaGUgaGF0IGluZGljZXMgc3RhcnQgYXQgaW5kZXggMC4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIFVpbnQ4IFNETENBTEwgU0RMX0pveXN0aWNrR2V0SGF0KFNETF9Kb3lzdGljayAqam95c3RpY2ssIGludCBoYXQpOworCisvKioKKyAqIEdldCB0aGUgYmFsbCBheGlzIGNoYW5nZSBzaW5jZSB0aGUgbGFzdCBwb2xsCisgKgorICogQHBhcmFtW2luXSBiYWxsIFRoZSBiYWxsIGluZGljZXMgc3RhcnQgYXQgaW5kZXggMC4KKyAqCisgKiBAcmV0dXJuIFRoaXMgcmV0dXJucyAwLCBvciAtMSBpZiB5b3UgcGFzc2VkIGl0IGludmFsaWQgcGFyYW1ldGVycy4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Kb3lzdGlja0dldEJhbGwoU0RMX0pveXN0aWNrICpqb3lzdGljaywgaW50IGJhbGwsIGludCAqZHgsIGludCAqZHkpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGJ1dHRvbiBvbiBhIGpveXN0aWNrCisgKgorICogQHBhcmFtW2luXSBidXR0b24gVGhlIGJ1dHRvbiBpbmRpY2VzIHN0YXJ0IGF0IGluZGV4IDAuCisgKi8KK2V4dGVybiBERUNMU1BFQyBVaW50OCBTRExDQUxMIFNETF9Kb3lzdGlja0dldEJ1dHRvbihTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYnV0dG9uKTsKKworLyoqCisgKiBDbG9zZSBhIGpveXN0aWNrIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggU0RMX0pveXN0aWNrT3BlbigpCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljayk7CisKKworLyogRW5kcyBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKKworI2VuZGlmIC8qIF9TRExfam95c3RpY2tfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2tleWJvYXJkLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfa2V5Ym9hcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDcxMjljCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2tleWJvYXJkLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qKiBAZmlsZSBTRExfa2V5Ym9hcmQuaAorICogIEluY2x1ZGUgZmlsZSBmb3IgU0RMIGtleWJvYXJkIGV2ZW50IGhhbmRsaW5nCisgKi8KKworI2lmbmRlZiBfU0RMX2tleWJvYXJkX2gKKyNkZWZpbmUgX1NETF9rZXlib2FyZF9oCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisjaW5jbHVkZSAiU0RMX2tleXN5bS5oIgorCisjaW5jbHVkZSAiYmVnaW5fY29kZS5oIgorLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBLZXlzeW0gc3RydWN0dXJlCisgKgorICogIC0gVGhlIHNjYW5jb2RlIGlzIGhhcmR3YXJlIGRlcGVuZGVudCwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBnZW5lcmFsCisgKiAgICBhcHBsaWNhdGlvbnMuICBJZiBubyBoYXJkd2FyZSBzY2FuY29kZSBpcyBhdmFpbGFibGUsIGl0IHdpbGwgYmUgMC4KKyAqCisgKiAgLSBUaGUgJ3VuaWNvZGUnIHRyYW5zbGF0ZWQgY2hhcmFjdGVyIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gY2hhcmFjdGVyCisgKiAgICB0cmFuc2xhdGlvbiBpcyBlbmFibGVkIGJ5IHRoZSBTRExfRW5hYmxlVU5JQ09ERSgpIEFQSS4gIElmIG5vbi16ZXJvLAorICogICAgdGhpcyBpcyBhIFVOSUNPREUgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleXByZXNzLiAgSWYgdGhlCisgKiAgICBoaWdoIDkgYml0cyBvZiB0aGUgY2hhcmFjdGVyIGFyZSAwLCB0aGVuIHRoaXMgbWFwcyB0byB0aGUgZXF1aXZhbGVudAorICogICAgQVNDSUkgY2hhcmFjdGVyOgorICogICAgICBAY29kZQorICoJY2hhciBjaDsKKyAqCWlmICggKGtleXN5bS51bmljb2RlICYgMHhGRjgwKSA9PSAwICkgeworICoJCWNoID0ga2V5c3ltLnVuaWNvZGUgJiAweDdGOworICoJfSBlbHNlIHsKKyAqCQlBbiBpbnRlcm5hdGlvbmFsIGNoYXJhY3Rlci4uCisgKgl9CisgKiAgICAgIEBlbmRjb2RlCisgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9rZXlzeW0geworCVVpbnQ4IHNjYW5jb2RlOwkJCS8qKjwgaGFyZHdhcmUgc3BlY2lmaWMgc2NhbmNvZGUgKi8KKwlTRExLZXkgc3ltOwkJCS8qKjwgU0RMIHZpcnR1YWwga2V5c3ltICovCisJU0RMTW9kIG1vZDsJCQkvKio8IGN1cnJlbnQga2V5IG1vZGlmaWVycyAqLworCVVpbnQxNiB1bmljb2RlOwkJCS8qKjwgdHJhbnNsYXRlZCBjaGFyYWN0ZXIgKi8KK30gU0RMX2tleXN5bTsKKworLyoqIFRoaXMgaXMgdGhlIG1hc2sgd2hpY2ggcmVmZXJzIHRvIGFsbCBob3RrZXkgYmluZGluZ3MgKi8KKyNkZWZpbmUgU0RMX0FMTF9IT1RLRVlTCQkweEZGRkZGRkZGCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKy8qKgorICogRW5hYmxlL0Rpc2FibGUgVU5JQ09ERSB0cmFuc2xhdGlvbiBvZiBrZXlib2FyZCBpbnB1dC4KKyAqCisgKiBUaGlzIHRyYW5zbGF0aW9uIGhhcyBzb21lIG92ZXJoZWFkLCBzbyB0cmFuc2xhdGlvbiBkZWZhdWx0cyBvZmYuCisgKgorICogQHBhcmFtW2luXSBlbmFibGUKKyAqIElmICdlbmFibGUnIGlzIDEsIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQuCisgKiBJZiAnZW5hYmxlJyBpcyAwLCB0cmFuc2xhdGlvbiBpcyBkaXNhYmxlZC4KKyAqIElmICdlbmFibGUnIGlzIC0xLCB0aGUgdHJhbnNsYXRpb24gc3RhdGUgaXMgbm90IGNoYW5nZWQuCisgKgorICogQHJldHVybiBJdCByZXR1cm5zIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiBrZXlib2FyZCB0cmFuc2xhdGlvbi4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9FbmFibGVVTklDT0RFKGludCBlbmFibGUpOworCisjZGVmaW5lIFNETF9ERUZBVUxUX1JFUEVBVF9ERUxBWQk1MDAKKyNkZWZpbmUgU0RMX0RFRkFVTFRfUkVQRUFUX0lOVEVSVkFMCTMwCisvKioKKyAqIEVuYWJsZS9EaXNhYmxlIGtleWJvYXJkIHJlcGVhdC4gIEtleWJvYXJkIHJlcGVhdCBkZWZhdWx0cyB0byBvZmYuCisgKgorICogIEBwYXJhbVtpbl0gZGVsYXkKKyAqICAnZGVsYXknIGlzIHRoZSBpbml0aWFsIGRlbGF5IGluIG1zIGJldHdlZW4gdGhlIHRpbWUgd2hlbiBhIGtleSBpcworICogIHByZXNzZWQsIGFuZCBrZXlib2FyZCByZXBlYXQgYmVnaW5zLgorICoKKyAqICBAcGFyYW1baW5dIGludGVydmFsCisgKiAgJ2ludGVydmFsJyBpcyB0aGUgdGltZSBpbiBtcyBiZXR3ZWVuIGtleWJvYXJkIHJlcGVhdCBldmVudHMuCisgKgorICogIElmICdkZWxheScgaXMgc2V0IHRvIDAsIGtleWJvYXJkIHJlcGVhdCBpcyBkaXNhYmxlZC4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9FbmFibGVLZXlSZXBlYXQoaW50IGRlbGF5LCBpbnQgaW50ZXJ2YWwpOworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfR2V0S2V5UmVwZWF0KGludCAqZGVsYXksIGludCAqaW50ZXJ2YWwpOworCisvKioKKyAqIEdldCBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KKyAqIFJldHVybnMgYW4gYXJyYXkgb2Yga2V5c3RhdGVzLCBpbmRleGVkIGJ5IHRoZSBTRExLXyogc3ltcy4KKyAqIFVzYWdlOgorICoJQGNvZGUKKyAqIAlVaW50OCAqa2V5c3RhdGUgPSBTRExfR2V0S2V5U3RhdGUoTlVMTCk7CisgKglpZiAoIGtleXN0YXRlW1NETEtfUkVUVVJOXSApIC8vLi4uIFw8UkVUVVJOPiBpcyBwcmVzc2VkLgorICoJQGVuZGNvZGUKKyAqLworZXh0ZXJuIERFQ0xTUEVDIFVpbnQ4ICogU0RMQ0FMTCBTRExfR2V0S2V5U3RhdGUoaW50ICpudW1rZXlzKTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQga2V5IG1vZGlmaWVyIHN0YXRlCisgKi8KK2V4dGVybiBERUNMU1BFQyBTRExNb2QgU0RMQ0FMTCBTRExfR2V0TW9kU3RhdGUodm9pZCk7CisKKy8qKgorICogU2V0IHRoZSBjdXJyZW50IGtleSBtb2RpZmllciBzdGF0ZS4KKyAqIFRoaXMgZG9lcyBub3QgY2hhbmdlIHRoZSBrZXlib2FyZCBzdGF0ZSwgb25seSB0aGUga2V5IG1vZGlmaWVyIGZsYWdzLgorICovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9TZXRNb2RTdGF0ZShTRExNb2QgbW9kc3RhdGUpOworCisvKioKKyAqIEdldCB0aGUgbmFtZSBvZiBhbiBTREwgdmlydHVhbCBrZXlzeW0KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9HZXRLZXlOYW1lKFNETEtleSBrZXkpOworCisKKy8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCisKKyNlbmRpZiAvKiBfU0RMX2tleWJvYXJkX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9rZXlzeW0uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9rZXlzeW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmFkMTJiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX2tleXN5bS5oCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisjaWZuZGVmIF9TRExfa2V5c3ltX2gKKyNkZWZpbmUgX1NETF9rZXlzeW1faAorCisvKiogV2hhdCB3ZSByZWFsbHkgd2FudCBpcyBhIG1hcHBpbmcgb2YgZXZlcnkgcmF3IGtleSBvbiB0aGUga2V5Ym9hcmQuCisgKiAgVG8gc3VwcG9ydCBpbnRlcm5hdGlvbmFsIGtleWJvYXJkcywgd2UgdXNlIHRoZSByYW5nZSAweEExIC0gMHhGRgorICogIGFzIGludGVybmF0aW9uYWwgdmlydHVhbCBrZXljb2Rlcy4gIFdlJ2xsIGZvbGxvdyBpbiB0aGUgZm9vdHN0ZXBzIG9mIFgxMS4uLgorICogIEBicmllZiBUaGUgbmFtZXMgb2YgdGhlIGtleXMKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICAgICAgLyoqIEBuYW1lIEFTQ0lJIG1hcHBlZCBrZXlzeW1zCisgICAgICAgICAqICBUaGUga2V5Ym9hcmQgc3ltcyBoYXZlIGJlZW4gY2xldmVybHkgY2hvc2VuIHRvIG1hcCB0byBBU0NJSQorICAgICAgICAgKi8KKyAgICAgICAgLypAeyovCisJU0RMS19VTktOT1dOCQk9IDAsCisJU0RMS19GSVJTVAkJPSAwLAorCVNETEtfQkFDS1NQQUNFCQk9IDgsCisJU0RMS19UQUIJCT0gOSwKKwlTRExLX0NMRUFSCQk9IDEyLAorCVNETEtfUkVUVVJOCQk9IDEzLAorCVNETEtfUEFVU0UJCT0gMTksCisJU0RMS19FU0NBUEUJCT0gMjcsCisJU0RMS19TUEFDRQkJPSAzMiwKKwlTRExLX0VYQ0xBSU0JCT0gMzMsCisJU0RMS19RVU9URURCTAkJPSAzNCwKKwlTRExLX0hBU0gJCT0gMzUsCisJU0RMS19ET0xMQVIJCT0gMzYsCisJU0RMS19BTVBFUlNBTkQJCT0gMzgsCisJU0RMS19RVU9URQkJPSAzOSwKKwlTRExLX0xFRlRQQVJFTgkJPSA0MCwKKwlTRExLX1JJR0hUUEFSRU4JCT0gNDEsCisJU0RMS19BU1RFUklTSwkJPSA0MiwKKwlTRExLX1BMVVMJCT0gNDMsCisJU0RMS19DT01NQQkJPSA0NCwKKwlTRExLX01JTlVTCQk9IDQ1LAorCVNETEtfUEVSSU9ECQk9IDQ2LAorCVNETEtfU0xBU0gJCT0gNDcsCisJU0RMS18wCQkJPSA0OCwKKwlTRExLXzEJCQk9IDQ5LAorCVNETEtfMgkJCT0gNTAsCisJU0RMS18zCQkJPSA1MSwKKwlTRExLXzQJCQk9IDUyLAorCVNETEtfNQkJCT0gNTMsCisJU0RMS182CQkJPSA1NCwKKwlTRExLXzcJCQk9IDU1LAorCVNETEtfOAkJCT0gNTYsCisJU0RMS185CQkJPSA1NywKKwlTRExLX0NPTE9OCQk9IDU4LAorCVNETEtfU0VNSUNPTE9OCQk9IDU5LAorCVNETEtfTEVTUwkJPSA2MCwKKwlTRExLX0VRVUFMUwkJPSA2MSwKKwlTRExLX0dSRUFURVIJCT0gNjIsCisJU0RMS19RVUVTVElPTgkJPSA2MywKKwlTRExLX0FUCQkJPSA2NCwKKwkvKiAKKwkgICBTa2lwIHVwcGVyY2FzZSBsZXR0ZXJzCisJICovCisJU0RMS19MRUZUQlJBQ0tFVAk9IDkxLAorCVNETEtfQkFDS1NMQVNICQk9IDkyLAorCVNETEtfUklHSFRCUkFDS0VUCT0gOTMsCisJU0RMS19DQVJFVAkJPSA5NCwKKwlTRExLX1VOREVSU0NPUkUJCT0gOTUsCisJU0RMS19CQUNLUVVPVEUJCT0gOTYsCisJU0RMS19hCQkJPSA5NywKKwlTRExLX2IJCQk9IDk4LAorCVNETEtfYwkJCT0gOTksCisJU0RMS19kCQkJPSAxMDAsCisJU0RMS19lCQkJPSAxMDEsCisJU0RMS19mCQkJPSAxMDIsCisJU0RMS19nCQkJPSAxMDMsCisJU0RMS19oCQkJPSAxMDQsCisJU0RMS19pCQkJPSAxMDUsCisJU0RMS19qCQkJPSAxMDYsCisJU0RMS19rCQkJPSAxMDcsCisJU0RMS19sCQkJPSAxMDgsCisJU0RMS19tCQkJPSAxMDksCisJU0RMS19uCQkJPSAxMTAsCisJU0RMS19vCQkJPSAxMTEsCisJU0RMS19wCQkJPSAxMTIsCisJU0RMS19xCQkJPSAxMTMsCisJU0RMS19yCQkJPSAxMTQsCisJU0RMS19zCQkJPSAxMTUsCisJU0RMS190CQkJPSAxMTYsCisJU0RMS191CQkJPSAxMTcsCisJU0RMS192CQkJPSAxMTgsCisJU0RMS193CQkJPSAxMTksCisJU0RMS194CQkJPSAxMjAsCisJU0RMS195CQkJPSAxMjEsCisJU0RMS196CQkJPSAxMjIsCisJU0RMS19ERUxFVEUJCT0gMTI3LAorCS8qIEVuZCBvZiBBU0NJSSBtYXBwZWQga2V5c3ltcyAqLworICAgICAgICAvKkB9Ki8KKworCS8qKiBAbmFtZSBJbnRlcm5hdGlvbmFsIGtleWJvYXJkIHN5bXMgKi8KKyAgICAgICAgLypAeyovCisJU0RMS19XT1JMRF8wCQk9IDE2MCwJCS8qIDB4QTAgKi8KKwlTRExLX1dPUkxEXzEJCT0gMTYxLAorCVNETEtfV09STERfMgkJPSAxNjIsCisJU0RMS19XT1JMRF8zCQk9IDE2MywKKwlTRExLX1dPUkxEXzQJCT0gMTY0LAorCVNETEtfV09STERfNQkJPSAxNjUsCisJU0RMS19XT1JMRF82CQk9IDE2NiwKKwlTRExLX1dPUkxEXzcJCT0gMTY3LAorCVNETEtfV09STERfOAkJPSAxNjgsCisJU0RMS19XT1JMRF85CQk9IDE2OSwKKwlTRExLX1dPUkxEXzEwCQk9IDE3MCwKKwlTRExLX1dPUkxEXzExCQk9IDE3MSwKKwlTRExLX1dPUkxEXzEyCQk9IDE3MiwKKwlTRExLX1dPUkxEXzEzCQk9IDE3MywKKwlTRExLX1dPUkxEXzE0CQk9IDE3NCwKKwlTRExLX1dPUkxEXzE1CQk9IDE3NSwKKwlTRExLX1dPUkxEXzE2CQk9IDE3NiwKKwlTRExLX1dPUkxEXzE3CQk9IDE3NywKKwlTRExLX1dPUkxEXzE4CQk9IDE3OCwKKwlTRExLX1dPUkxEXzE5CQk9IDE3OSwKKwlTRExLX1dPUkxEXzIwCQk9IDE4MCwKKwlTRExLX1dPUkxEXzIxCQk9IDE4MSwKKwlTRExLX1dPUkxEXzIyCQk9IDE4MiwKKwlTRExLX1dPUkxEXzIzCQk9IDE4MywKKwlTRExLX1dPUkxEXzI0CQk9IDE4NCwKKwlTRExLX1dPUkxEXzI1CQk9IDE4NSwKKwlTRExLX1dPUkxEXzI2CQk9IDE4NiwKKwlTRExLX1dPUkxEXzI3CQk9IDE4NywKKwlTRExLX1dPUkxEXzI4CQk9IDE4OCwKKwlTRExLX1dPUkxEXzI5CQk9IDE4OSwKKwlTRExLX1dPUkxEXzMwCQk9IDE5MCwKKwlTRExLX1dPUkxEXzMxCQk9IDE5MSwKKwlTRExLX1dPUkxEXzMyCQk9IDE5MiwKKwlTRExLX1dPUkxEXzMzCQk9IDE5MywKKwlTRExLX1dPUkxEXzM0CQk9IDE5NCwKKwlTRExLX1dPUkxEXzM1CQk9IDE5NSwKKwlTRExLX1dPUkxEXzM2CQk9IDE5NiwKKwlTRExLX1dPUkxEXzM3CQk9IDE5NywKKwlTRExLX1dPUkxEXzM4CQk9IDE5OCwKKwlTRExLX1dPUkxEXzM5CQk9IDE5OSwKKwlTRExLX1dPUkxEXzQwCQk9IDIwMCwKKwlTRExLX1dPUkxEXzQxCQk9IDIwMSwKKwlTRExLX1dPUkxEXzQyCQk9IDIwMiwKKwlTRExLX1dPUkxEXzQzCQk9IDIwMywKKwlTRExLX1dPUkxEXzQ0CQk9IDIwNCwKKwlTRExLX1dPUkxEXzQ1CQk9IDIwNSwKKwlTRExLX1dPUkxEXzQ2CQk9IDIwNiwKKwlTRExLX1dPUkxEXzQ3CQk9IDIwNywKKwlTRExLX1dPUkxEXzQ4CQk9IDIwOCwKKwlTRExLX1dPUkxEXzQ5CQk9IDIwOSwKKwlTRExLX1dPUkxEXzUwCQk9IDIxMCwKKwlTRExLX1dPUkxEXzUxCQk9IDIxMSwKKwlTRExLX1dPUkxEXzUyCQk9IDIxMiwKKwlTRExLX1dPUkxEXzUzCQk9IDIxMywKKwlTRExLX1dPUkxEXzU0CQk9IDIxNCwKKwlTRExLX1dPUkxEXzU1CQk9IDIxNSwKKwlTRExLX1dPUkxEXzU2CQk9IDIxNiwKKwlTRExLX1dPUkxEXzU3CQk9IDIxNywKKwlTRExLX1dPUkxEXzU4CQk9IDIxOCwKKwlTRExLX1dPUkxEXzU5CQk9IDIxOSwKKwlTRExLX1dPUkxEXzYwCQk9IDIyMCwKKwlTRExLX1dPUkxEXzYxCQk9IDIyMSwKKwlTRExLX1dPUkxEXzYyCQk9IDIyMiwKKwlTRExLX1dPUkxEXzYzCQk9IDIyMywKKwlTRExLX1dPUkxEXzY0CQk9IDIyNCwKKwlTRExLX1dPUkxEXzY1CQk9IDIyNSwKKwlTRExLX1dPUkxEXzY2CQk9IDIyNiwKKwlTRExLX1dPUkxEXzY3CQk9IDIyNywKKwlTRExLX1dPUkxEXzY4CQk9IDIyOCwKKwlTRExLX1dPUkxEXzY5CQk9IDIyOSwKKwlTRExLX1dPUkxEXzcwCQk9IDIzMCwKKwlTRExLX1dPUkxEXzcxCQk9IDIzMSwKKwlTRExLX1dPUkxEXzcyCQk9IDIzMiwKKwlTRExLX1dPUkxEXzczCQk9IDIzMywKKwlTRExLX1dPUkxEXzc0CQk9IDIzNCwKKwlTRExLX1dPUkxEXzc1CQk9IDIzNSwKKwlTRExLX1dPUkxEXzc2CQk9IDIzNiwKKwlTRExLX1dPUkxEXzc3CQk9IDIzNywKKwlTRExLX1dPUkxEXzc4CQk9IDIzOCwKKwlTRExLX1dPUkxEXzc5CQk9IDIzOSwKKwlTRExLX1dPUkxEXzgwCQk9IDI0MCwKKwlTRExLX1dPUkxEXzgxCQk9IDI0MSwKKwlTRExLX1dPUkxEXzgyCQk9IDI0MiwKKwlTRExLX1dPUkxEXzgzCQk9IDI0MywKKwlTRExLX1dPUkxEXzg0CQk9IDI0NCwKKwlTRExLX1dPUkxEXzg1CQk9IDI0NSwKKwlTRExLX1dPUkxEXzg2CQk9IDI0NiwKKwlTRExLX1dPUkxEXzg3CQk9IDI0NywKKwlTRExLX1dPUkxEXzg4CQk9IDI0OCwKKwlTRExLX1dPUkxEXzg5CQk9IDI0OSwKKwlTRExLX1dPUkxEXzkwCQk9IDI1MCwKKwlTRExLX1dPUkxEXzkxCQk9IDI1MSwKKwlTRExLX1dPUkxEXzkyCQk9IDI1MiwKKwlTRExLX1dPUkxEXzkzCQk9IDI1MywKKwlTRExLX1dPUkxEXzk0CQk9IDI1NCwKKwlTRExLX1dPUkxEXzk1CQk9IDI1NSwJCS8qIDB4RkYgKi8KKyAgICAgICAgLypAfSovCisKKwkvKiogQG5hbWUgTnVtZXJpYyBrZXlwYWQgKi8KKyAgICAgICAgLypAeyovCisJU0RMS19LUDAJCT0gMjU2LAorCVNETEtfS1AxCQk9IDI1NywKKwlTRExLX0tQMgkJPSAyNTgsCisJU0RMS19LUDMJCT0gMjU5LAorCVNETEtfS1A0CQk9IDI2MCwKKwlTRExLX0tQNQkJPSAyNjEsCisJU0RMS19LUDYJCT0gMjYyLAorCVNETEtfS1A3CQk9IDI2MywKKwlTRExLX0tQOAkJPSAyNjQsCisJU0RMS19LUDkJCT0gMjY1LAorCVNETEtfS1BfUEVSSU9ECQk9IDI2NiwKKwlTRExLX0tQX0RJVklERQkJPSAyNjcsCisJU0RMS19LUF9NVUxUSVBMWQk9IDI2OCwKKwlTRExLX0tQX01JTlVTCQk9IDI2OSwKKwlTRExLX0tQX1BMVVMJCT0gMjcwLAorCVNETEtfS1BfRU5URVIJCT0gMjcxLAorCVNETEtfS1BfRVFVQUxTCQk9IDI3MiwKKyAgICAgICAgLypAfSovCisKKwkvKiogQG5hbWUgQXJyb3dzICsgSG9tZS9FbmQgcGFkICovCisgICAgICAgIC8qQHsqLworCVNETEtfVVAJCQk9IDI3MywKKwlTRExLX0RPV04JCT0gMjc0LAorCVNETEtfUklHSFQJCT0gMjc1LAorCVNETEtfTEVGVAkJPSAyNzYsCisJU0RMS19JTlNFUlQJCT0gMjc3LAorCVNETEtfSE9NRQkJPSAyNzgsCisJU0RMS19FTkQJCT0gMjc5LAorCVNETEtfUEFHRVVQCQk9IDI4MCwKKwlTRExLX1BBR0VET1dOCQk9IDI4MSwKKyAgICAgICAgLypAfSovCisKKwkvKiogQG5hbWUgRnVuY3Rpb24ga2V5cyAqLworICAgICAgICAvKkB7Ki8KKwlTRExLX0YxCQkJPSAyODIsCisJU0RMS19GMgkJCT0gMjgzLAorCVNETEtfRjMJCQk9IDI4NCwKKwlTRExLX0Y0CQkJPSAyODUsCisJU0RMS19GNQkJCT0gMjg2LAorCVNETEtfRjYJCQk9IDI4NywKKwlTRExLX0Y3CQkJPSAyODgsCisJU0RMS19GOAkJCT0gMjg5LAorCVNETEtfRjkJCQk9IDI5MCwKKwlTRExLX0YxMAkJPSAyOTEsCisJU0RMS19GMTEJCT0gMjkyLAorCVNETEtfRjEyCQk9IDI5MywKKwlTRExLX0YxMwkJPSAyOTQsCisJU0RMS19GMTQJCT0gMjk1LAorCVNETEtfRjE1CQk9IDI5NiwKKyAgICAgICAgLypAfSovCisKKwkvKiogQG5hbWUgS2V5IHN0YXRlIG1vZGlmaWVyIGtleXMgKi8KKyAgICAgICAgLypAeyovCisJU0RMS19OVU1MT0NLCQk9IDMwMCwKKwlTRExLX0NBUFNMT0NLCQk9IDMwMSwKKwlTRExLX1NDUk9MTE9DSwkJPSAzMDIsCisJU0RMS19SU0hJRlQJCT0gMzAzLAorCVNETEtfTFNISUZUCQk9IDMwNCwKKwlTRExLX1JDVFJMCQk9IDMwNSwKKwlTRExLX0xDVFJMCQk9IDMwNiwKKwlTRExLX1JBTFQJCT0gMzA3LAorCVNETEtfTEFMVAkJPSAzMDgsCisJU0RMS19STUVUQQkJPSAzMDksCisJU0RMS19MTUVUQQkJPSAzMTAsCisJU0RMS19MU1VQRVIJCT0gMzExLAkJLyoqPCBMZWZ0ICJXaW5kb3dzIiBrZXkgKi8KKwlTRExLX1JTVVBFUgkJPSAzMTIsCQkvKio8IFJpZ2h0ICJXaW5kb3dzIiBrZXkgKi8KKwlTRExLX01PREUJCT0gMzEzLAkJLyoqPCAiQWx0IEdyIiBrZXkgKi8KKwlTRExLX0NPTVBPU0UJCT0gMzE0LAkJLyoqPCBNdWx0aS1rZXkgY29tcG9zZSBrZXkgKi8KKyAgICAgICAgLypAfSovCisKKwkvKiogQG5hbWUgTWlzY2VsbGFuZW91cyBmdW5jdGlvbiBrZXlzICovCisgICAgICAgIC8qQHsqLworCVNETEtfSEVMUAkJPSAzMTUsCisJU0RMS19QUklOVAkJPSAzMTYsCisJU0RMS19TWVNSRVEJCT0gMzE3LAorCVNETEtfQlJFQUsJCT0gMzE4LAorCVNETEtfTUVOVQkJPSAzMTksCisJU0RMS19QT1dFUgkJPSAzMjAsCQkvKio8IFBvd2VyIE1hY2ludG9zaCBwb3dlciBrZXkgKi8KKwlTRExLX0VVUk8JCT0gMzIxLAkJLyoqPCBTb21lIGV1cm9wZWFuIGtleWJvYXJkcyAqLworCVNETEtfVU5ETwkJPSAzMjIsCQkvKio8IEF0YXJpIGtleWJvYXJkIGhhcyBVbmRvICovCisgICAgICAgIC8qQH0qLworCisJLyogQWRkIGFueSBvdGhlciBrZXlzIGhlcmUgKi8KKworCVNETEtfTEFTVAorfSBTRExLZXk7CisKKy8qKiBFbnVtZXJhdGlvbiBvZiB2YWxpZCBrZXkgbW9kcyAocG9zc2libHkgT1InZCB0b2dldGhlcikgKi8KK3R5cGVkZWYgZW51bSB7CisJS01PRF9OT05FICA9IDB4MDAwMCwKKwlLTU9EX0xTSElGVD0gMHgwMDAxLAorCUtNT0RfUlNISUZUPSAweDAwMDIsCisJS01PRF9MQ1RSTCA9IDB4MDA0MCwKKwlLTU9EX1JDVFJMID0gMHgwMDgwLAorCUtNT0RfTEFMVCAgPSAweDAxMDAsCisJS01PRF9SQUxUICA9IDB4MDIwMCwKKwlLTU9EX0xNRVRBID0gMHgwNDAwLAorCUtNT0RfUk1FVEEgPSAweDA4MDAsCisJS01PRF9OVU0gICA9IDB4MTAwMCwKKwlLTU9EX0NBUFMgID0gMHgyMDAwLAorCUtNT0RfTU9ERSAgPSAweDQwMDAsCisJS01PRF9SRVNFUlZFRCA9IDB4ODAwMAorfSBTRExNb2Q7CisKKyNkZWZpbmUgS01PRF9DVFJMCShLTU9EX0xDVFJMfEtNT0RfUkNUUkwpCisjZGVmaW5lIEtNT0RfU0hJRlQJKEtNT0RfTFNISUZUfEtNT0RfUlNISUZUKQorI2RlZmluZSBLTU9EX0FMVAkoS01PRF9MQUxUfEtNT0RfUkFMVCkKKyNkZWZpbmUgS01PRF9NRVRBCShLTU9EX0xNRVRBfEtNT0RfUk1FVEEpCisKKyNlbmRpZiAvKiBfU0RMX2tleXN5bV9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfbG9hZHNvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfbG9hZHNvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1ZTUzNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9sb2Fkc28uaApAQCAtMCwwICsxLDc4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKiogQGZpbGUgU0RMX2xvYWRzby5oCisgKiAgU3lzdGVtIGRlcGVuZGVudCBsaWJyYXJ5IGxvYWRpbmcgcm91dGluZXMKKyAqLworCisvKiogQGZpbGUgU0RMX2xvYWRzby5oCisgKiAgU29tZSB0aGluZ3MgdG8ga2VlcCBpbiBtaW5kOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAtIFRoZXNlIGZ1bmN0aW9ucyBvbmx5IHdvcmsgb24gQyBmdW5jdGlvbiBuYW1lcy4gIE90aGVyIGxhbmd1YWdlcyBtYXkKKyAqICAgIGhhdmUgbmFtZSBtYW5nbGluZyBhbmQgaW50cmluc2ljIGxhbmd1YWdlIHN1cHBvcnQgdGhhdCB2YXJpZXMgZnJvbQorICogICAgY29tcGlsZXIgdG8gY29tcGlsZXIuCisgKiAgLSBNYWtlIHN1cmUgeW91IGRlY2xhcmUgeW91ciBmdW5jdGlvbiBwb2ludGVycyB3aXRoIHRoZSBzYW1lIGNhbGxpbmcKKyAqICAgIGNvbnZlbnRpb24gYXMgdGhlIGFjdHVhbCBsaWJyYXJ5IGZ1bmN0aW9uLiAgWW91ciBjb2RlIHdpbGwgY3Jhc2gKKyAqICAgIG15c3RlcmlvdXNseSBpZiB5b3UgZG8gbm90IGRvIHRoaXMuCisgKiAgLSBBdm9pZCBuYW1lc3BhY2UgY29sbGlzaW9ucy4gIElmIHlvdSBsb2FkIGEgc3ltYm9sIGZyb20gdGhlIGxpYnJhcnksCisgKiAgICBpdCBpcyBub3QgZGVmaW5lZCB3aGV0aGVyIG9yIG5vdCBpdCBnb2VzIGludG8gdGhlIGdsb2JhbCBzeW1ib2wKKyAqICAgIG5hbWVzcGFjZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgSWYgaXQgZG9lcyBhbmQgaXQgY29uZmxpY3RzIHdpdGgKKyAqICAgIHN5bWJvbHMgaW4geW91ciBjb2RlIG9yIG90aGVyIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSB3aWxsIG5vdCBnZXQKKyAqICAgIHRoZSByZXN1bHRzIHlvdSBleHBlY3QuIDopCisgKi8KKworCisjaWZuZGVmIF9TRExfbG9hZHNvX2gKKyNkZWZpbmUgX1NETF9sb2Fkc29faAorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorCisjaW5jbHVkZSAiYmVnaW5fY29kZS5oIgorLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBkeW5hbWljYWxseSBsb2FkcyBhIHNoYXJlZCBvYmplY3QgYW5kIHJldHVybnMgYSBwb2ludGVyCisgKiB0byB0aGUgb2JqZWN0IGhhbmRsZSAob3IgTlVMTCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IpLgorICogVGhlICdzb2ZpbGUnIHBhcmFtZXRlciBpcyBhIHN5c3RlbSBkZXBlbmRlbnQgbmFtZSBvZiB0aGUgb2JqZWN0IGZpbGUuCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkICogU0RMQ0FMTCBTRExfTG9hZE9iamVjdChjb25zdCBjaGFyICpzb2ZpbGUpOworCisvKioKKyAqIEdpdmVuIGFuIG9iamVjdCBoYW5kbGUsIHRoaXMgZnVuY3Rpb24gbG9va3MgdXAgdGhlIGFkZHJlc3Mgb2YgdGhlCisgKiBuYW1lZCBmdW5jdGlvbiBpbiB0aGUgc2hhcmVkIG9iamVjdCBhbmQgcmV0dXJucyBpdC4gIFRoaXMgYWRkcmVzcworICogaXMgbm8gbG9uZ2VyIHZhbGlkIGFmdGVyIGNhbGxpbmcgU0RMX1VubG9hZE9iamVjdCgpLgorICovCitleHRlcm4gREVDTFNQRUMgdm9pZCAqIFNETENBTEwgU0RMX0xvYWRGdW5jdGlvbih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiogVW5sb2FkIGEgc2hhcmVkIG9iamVjdCBmcm9tIG1lbW9yeSAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfVW5sb2FkT2JqZWN0KHZvaWQgKmhhbmRsZSk7CisKKy8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCisKKyNlbmRpZiAvKiBfU0RMX2xvYWRzb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfbWFpbi5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjUwZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX21haW4uaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworI2lmbmRlZiBfU0RMX21haW5faAorI2RlZmluZSBfU0RMX21haW5faAorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorCisvKiogQGZpbGUgU0RMX21haW4uaAorICogIFJlZGVmaW5lIG1haW4oKSBvbiBXaW4zMiBhbmQgTWFjT1Mgc28gdGhhdCBpdCBpcyBjYWxsZWQgYnkgd2lubWFpbi5jCisgKi8KKworI2lmIGRlZmluZWQoX19XSU4zMl9fKSB8fCBcCisgICAgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgIWRlZmluZWQoX19CRU9TX18pKSB8fCBcCisgICAgZGVmaW5lZChfX01BQ09TX18pIHx8IGRlZmluZWQoX19NQUNPU1hfXykgfHwgXAorICAgIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgZGVmaW5lZChRV1MpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBDX0xJTktBR0UJIkMiCisjZWxzZQorI2RlZmluZSBDX0xJTktBR0UKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiogVGhlIGFwcGxpY2F0aW9uJ3MgbWFpbigpIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggQyBsaW5rYWdlLAorICogIGFuZCBzaG91bGQgYmUgZGVjbGFyZWQgbGlrZSB0aGlzOgorICogICAgICBAY29kZQorICogICAgICAjaWZkZWYgX19jcGx1c3BsdXMKKyAqICAgICAgZXh0ZXJuICJDIgorICogICAgICAjZW5kaWYKKyAqCWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisgKgl7CisgKgl9CisgKiAgICAgIEBlbmRjb2RlCisgKi8KKyNkZWZpbmUgbWFpbglTRExfbWFpbgorCisvKiogVGhlIHByb3RvdHlwZSBmb3IgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbigpIGZ1bmN0aW9uICovCitleHRlcm4gQ19MSU5LQUdFIGludCBTRExfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKworCisvKiogQG5hbWUgRnJvbSB0aGUgU0RMIGxpYnJhcnkgY29kZSAtLSBuZWVkZWQgZm9yIHJlZ2lzdGVyaW5nIHRoZSBhcHAgb24gV2luMzIgKi8KKy8qQHsqLworI2lmZGVmIF9fV0lOMzJfXworCisjaW5jbHVkZSAiYmVnaW5fY29kZS5oIgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20geW91ciBXaW5NYWluKCkgZnVuY3Rpb24sIGlmIGFueSAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfU2V0TW9kdWxlSGFuZGxlKHZvaWQgKmhJbnN0KTsKKy8qKiBUaGlzIGNhbiBhbHNvIGJlIGNhbGxlZCwgYnV0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfUmVnaXN0ZXJBcHAoY2hhciAqbmFtZSwgVWludDMyIHN0eWxlLCB2b2lkICpoSW5zdCk7CisvKiogVGhpcyBjYW4gYWxzbyBiZSBjYWxsZWQsIGJ1dCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IChTRExfUXVpdCBjYWxscyBpdCkgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1VucmVnaXN0ZXJBcHAodm9pZCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKKyNlbmRpZgorLypAfSovCisKKy8qKiBAbmFtZSBGcm9tIHRoZSBTREwgbGlicmFyeSBjb2RlIC0tIG5lZWRlZCBmb3IgcmVnaXN0ZXJpbmcgUXVpY2tEcmF3IG9uIE1hY09TICovCisvKkB7Ki8KKyNpZiBkZWZpbmVkKF9fTUFDT1NfXykKKworI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEZvcndhcmQgZGVjbGFyYXRpb24gc28gd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIFF1aWNrRHJhdy5oICovCitzdHJ1Y3QgUURHbG9iYWxzOworCisvKiogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20geW91ciBtYWluKCkgZnVuY3Rpb24sIGlmIGFueSAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfSW5pdFF1aWNrRHJhdyhzdHJ1Y3QgUURHbG9iYWxzICp0aGVfcWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKKyNlbmRpZgorLypAfSovCisKKyNlbmRpZiAvKiBOZWVkIHRvIHJlZGVmaW5lIG1haW4oKT8gKi8KKworI2VuZGlmIC8qIF9TRExfbWFpbl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfbW91c2UuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9tb3VzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTYzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfbW91c2UuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqIEBmaWxlIFNETF9tb3VzZS5oCisgKiAgSW5jbHVkZSBmaWxlIGZvciBTREwgbW91c2UgZXZlbnQgaGFuZGxpbmcKKyAqLworCisjaWZuZGVmIF9TRExfbW91c2VfaAorI2RlZmluZSBfU0RMX21vdXNlX2gKKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKyNpbmNsdWRlICJTRExfZXJyb3IuaCIKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKworI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKKy8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBXTWN1cnNvciBXTWN1cnNvcjsJLyoqPCBJbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9DdXJzb3IgeworCVNETF9SZWN0IGFyZWE7CQkJLyoqPCBUaGUgYXJlYSBvZiB0aGUgbW91c2UgY3Vyc29yICovCisJU2ludDE2IGhvdF94LCBob3RfeTsJCS8qKjwgVGhlICJ0aXAiIG9mIHRoZSBjdXJzb3IgKi8KKwlVaW50OCAqZGF0YTsJCQkvKio8IEIvVyBjdXJzb3IgZGF0YSAqLworCVVpbnQ4ICptYXNrOwkJCS8qKjwgQi9XIGN1cnNvciBtYXNrICovCisJVWludDggKnNhdmVbMl07CQkJLyoqPCBQbGFjZSB0byBzYXZlIGN1cnNvciBhcmVhICovCisJV01jdXJzb3IgKndtX2N1cnNvcjsJCS8qKjwgV2luZG93LW1hbmFnZXIgY3Vyc29yICovCit9IFNETF9DdXJzb3I7CisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKy8qKgorICogUmV0cmlldmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdXNlLgorICogVGhlIGN1cnJlbnQgYnV0dG9uIHN0YXRlIGlzIHJldHVybmVkIGFzIGEgYnV0dG9uIGJpdG1hc2ssIHdoaWNoIGNhbgorICogYmUgdGVzdGVkIHVzaW5nIHRoZSBTRExfQlVUVE9OKFgpIG1hY3JvcywgYW5kIHggYW5kIHkgYXJlIHNldCB0byB0aGUKKyAqIGN1cnJlbnQgbW91c2UgY3Vyc29yIHBvc2l0aW9uLiAgWW91IGNhbiBwYXNzIE5VTEwgZm9yIGVpdGhlciB4IG9yIHkuCisgKi8KK2V4dGVybiBERUNMU1BFQyBVaW50OCBTRExDQUxMIFNETF9HZXRNb3VzZVN0YXRlKGludCAqeCwgaW50ICp5KTsKKworLyoqCisgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW91c2UuCisgKiBUaGUgY3VycmVudCBidXR0b24gc3RhdGUgaXMgcmV0dXJuZWQgYXMgYSBidXR0b24gYml0bWFzaywgd2hpY2ggY2FuCisgKiBiZSB0ZXN0ZWQgdXNpbmcgdGhlIFNETF9CVVRUT04oWCkgbWFjcm9zLCBhbmQgeCBhbmQgeSBhcmUgc2V0IHRvIHRoZQorICogbW91c2UgZGVsdGFzIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gU0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZSgpLgorICovCitleHRlcm4gREVDTFNQRUMgVWludDggU0RMQ0FMTCBTRExfR2V0UmVsYXRpdmVNb3VzZVN0YXRlKGludCAqeCwgaW50ICp5KTsKKworLyoqCisgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3IgKGdlbmVyYXRlcyBhIG1vdXNlIG1vdGlvbiBldmVudCkKKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfV2FycE1vdXNlKFVpbnQxNiB4LCBVaW50MTYgeSk7CisKKy8qKgorICogQ3JlYXRlIGEgY3Vyc29yIHVzaW5nIHRoZSBzcGVjaWZpZWQgZGF0YSBhbmQgbWFzayAoaW4gTVNCIGZvcm1hdCkuCisgKiBUaGUgY3Vyc29yIHdpZHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGJpdHMuCisgKgorICogVGhlIGN1cnNvciBpcyBjcmVhdGVkIGluIGJsYWNrIGFuZCB3aGl0ZSBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZzoKKyAqIGRhdGEgIG1hc2sgICAgcmVzdWx0aW5nIHBpeGVsIG9uIHNjcmVlbgorICogIDAgICAgIDEgICAgICAgV2hpdGUKKyAqICAxICAgICAxICAgICAgIEJsYWNrCisgKiAgMCAgICAgMCAgICAgICBUcmFuc3BhcmVudAorICogIDEgICAgIDAgICAgICAgSW52ZXJ0ZWQgY29sb3IgaWYgcG9zc2libGUsIGJsYWNrIGlmIG5vdC4KKyAqCisgKiBDdXJzb3JzIGNyZWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgZnJlZWQgd2l0aCBTRExfRnJlZUN1cnNvcigpLgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX0N1cnNvciAqIFNETENBTEwgU0RMX0NyZWF0ZUN1cnNvcgorCQkoVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKKworLyoqCisgKiBTZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY3Vyc29yIHRvIHRoZSBzcGVjaWZpZWQgb25lLgorICogSWYgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgdmlzaWJsZSwgdGhlIGNoYW5nZSB3aWxsIGJlIGltbWVkaWF0ZWx5IAorICogcmVwcmVzZW50ZWQgb24gdGhlIGRpc3BsYXkuCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1NldEN1cnNvcihTRExfQ3Vyc29yICpjdXJzb3IpOworCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY3Vyc29yLgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX0N1cnNvciAqIFNETENBTEwgU0RMX0dldEN1cnNvcih2b2lkKTsKKworLyoqCisgKiBEZWFsbG9jYXRlcyBhIGN1cnNvciBjcmVhdGVkIHdpdGggU0RMX0NyZWF0ZUN1cnNvcigpLgorICovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9GcmVlQ3Vyc29yKFNETF9DdXJzb3IgKmN1cnNvcik7CisKKy8qKgorICogVG9nZ2xlIHdoZXRoZXIgb3Igbm90IHRoZSBjdXJzb3IgaXMgc2hvd24gb24gdGhlIHNjcmVlbi4KKyAqIFRoZSBjdXJzb3Igc3RhcnQgb2ZmIGRpc3BsYXllZCwgYnV0IGNhbiBiZSB0dXJuZWQgb2ZmLgorICogU0RMX1Nob3dDdXJzb3IoKSByZXR1cm5zIDEgaWYgdGhlIGN1cnNvciB3YXMgYmVpbmcgZGlzcGxheWVkCisgKiBiZWZvcmUgdGhlIGNhbGwsIG9yIDAgaWYgaXQgd2FzIG5vdC4gIFlvdSBjYW4gcXVlcnkgdGhlIGN1cnJlbnQKKyAqIHN0YXRlIGJ5IHBhc3NpbmcgYSAndG9nZ2xlJyB2YWx1ZSBvZiAtMS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TaG93Q3Vyc29yKGludCB0b2dnbGUpOworCisvKkB7Ki8KKy8qKiBVc2VkIGFzIGEgbWFzayB3aGVuIHRlc3RpbmcgYnV0dG9ucyBpbiBidXR0b25zdGF0ZQorICogIEJ1dHRvbiAxOglMZWZ0IG1vdXNlIGJ1dHRvbgorICogIEJ1dHRvbiAyOglNaWRkbGUgbW91c2UgYnV0dG9uCisgKiAgQnV0dG9uIDM6CVJpZ2h0IG1vdXNlIGJ1dHRvbgorICogIEJ1dHRvbiA0OglNb3VzZSB3aGVlbCB1cAkgKG1heSBhbHNvIGJlIGEgcmVhbCBidXR0b24pCisgKiAgQnV0dG9uIDU6CU1vdXNlIHdoZWVsIGRvd24gKG1heSBhbHNvIGJlIGEgcmVhbCBidXR0b24pCisgKi8KKyNkZWZpbmUgU0RMX0JVVFRPTihYKQkJKDEgPDwgKChYKS0xKSkKKyNkZWZpbmUgU0RMX0JVVFRPTl9MRUZUCQkxCisjZGVmaW5lIFNETF9CVVRUT05fTUlERExFCTIKKyNkZWZpbmUgU0RMX0JVVFRPTl9SSUdIVAkzCisjZGVmaW5lIFNETF9CVVRUT05fV0hFRUxVUAk0CisjZGVmaW5lIFNETF9CVVRUT05fV0hFRUxET1dOCTUKKyNkZWZpbmUgU0RMX0JVVFRPTl9YMQkJNgorI2RlZmluZSBTRExfQlVUVE9OX1gyCQk3CisjZGVmaW5lIFNETF9CVVRUT05fTE1BU0sJU0RMX0JVVFRPTihTRExfQlVUVE9OX0xFRlQpCisjZGVmaW5lIFNETF9CVVRUT05fTU1BU0sJU0RMX0JVVFRPTihTRExfQlVUVE9OX01JRERMRSkKKyNkZWZpbmUgU0RMX0JVVFRPTl9STUFTSwlTRExfQlVUVE9OKFNETF9CVVRUT05fUklHSFQpCisjZGVmaW5lIFNETF9CVVRUT05fWDFNQVNLCVNETF9CVVRUT04oU0RMX0JVVFRPTl9YMSkKKyNkZWZpbmUgU0RMX0JVVFRPTl9YMk1BU0sJU0RMX0JVVFRPTihTRExfQlVUVE9OX1gyKQorLypAfSovCisKKy8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCisKKyNlbmRpZiAvKiBfU0RMX21vdXNlX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9tdXRleC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX211dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkYTliMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9tdXRleC5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisjaWZuZGVmIF9TRExfbXV0ZXhfaAorI2RlZmluZSBfU0RMX211dGV4X2gKKworLyoqIEBmaWxlIFNETF9tdXRleC5oCisgKiAgRnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzCisgKgorICogIEBub3RlIFRoZXNlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgb3RoZXIgU0RMIHJvdXRpbmVzLgorICovCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisKKyNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCisvKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFN5bmNocm9uaXphdGlvbiBmdW5jdGlvbnMgd2hpY2ggY2FuIHRpbWUgb3V0IHJldHVybiB0aGlzIHZhbHVlCisgKiAgaWYgdGhleSB0aW1lIG91dC4KKyAqLworI2RlZmluZSBTRExfTVVURVhfVElNRURPVVQJMQorCisvKiogVGhpcyBpcyB0aGUgdGltZW91dCB2YWx1ZSB3aGljaCBjb3JyZXNwb25kcyB0byBuZXZlciB0aW1lIG91dCAqLworI2RlZmluZSBTRExfTVVURVhfTUFYV0FJVAkofihVaW50MzIpMCkKKworCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisvKiogQG5hbWUgTXV0ZXggZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIC8qQHsqLworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLworCisvKiogVGhlIFNETCBtdXRleCBzdHJ1Y3R1cmUsIGRlZmluZWQgaW4gU0RMX211dGV4LmMgKi8KK3N0cnVjdCBTRExfbXV0ZXg7Cit0eXBlZGVmIHN0cnVjdCBTRExfbXV0ZXggU0RMX211dGV4OworCisvKiogQ3JlYXRlIGEgbXV0ZXgsIGluaXRpYWxpemVkIHVubG9ja2VkICovCitleHRlcm4gREVDTFNQRUMgU0RMX211dGV4ICogU0RMQ0FMTCBTRExfQ3JlYXRlTXV0ZXgodm9pZCk7CisKKyNkZWZpbmUgU0RMX0xvY2tNdXRleChtKQlTRExfbXV0ZXhQKG0pCisvKiogTG9jayB0aGUgbXV0ZXgKKyAqICBAcmV0dXJuIDAsIG9yIC0xIG9uIGVycm9yCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfbXV0ZXhQKFNETF9tdXRleCAqbXV0ZXgpOworCisjZGVmaW5lIFNETF9VbmxvY2tNdXRleChtKQlTRExfbXV0ZXhWKG0pCisvKiogVW5sb2NrIHRoZSBtdXRleAorICogIEByZXR1cm4gMCwgb3IgLTEgb24gZXJyb3IKKyAqCisgKiAgSXQgaXMgYW4gZXJyb3IgdG8gdW5sb2NrIGEgbXV0ZXggdGhhdCBoYXMgbm90IGJlZW4gbG9ja2VkIGJ5CisgKiAgdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQgZG9pbmcgc28gcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfbXV0ZXhWKFNETF9tdXRleCAqbXV0ZXgpOworCisvKiogRGVzdHJveSBhIG11dGV4ICovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9EZXN0cm95TXV0ZXgoU0RMX211dGV4ICptdXRleCk7CisKKy8qQH0qLworCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisvKiogQG5hbWUgU2VtYXBob3JlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIC8qQHsqLworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLworCisvKiogVGhlIFNETCBzZW1hcGhvcmUgc3RydWN0dXJlLCBkZWZpbmVkIGluIFNETF9zZW0uYyAqLworc3RydWN0IFNETF9zZW1hcGhvcmU7Cit0eXBlZGVmIHN0cnVjdCBTRExfc2VtYXBob3JlIFNETF9zZW07CisKKy8qKiBDcmVhdGUgYSBzZW1hcGhvcmUsIGluaXRpYWxpemVkIHdpdGggdmFsdWUsIHJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9zZW0gKiBTRExDQUxMIFNETF9DcmVhdGVTZW1hcGhvcmUoVWludDMyIGluaXRpYWxfdmFsdWUpOworCisvKiogRGVzdHJveSBhIHNlbWFwaG9yZSAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc3VzcGVuZHMgdGhlIGNhbGxpbmcgdGhyZWFkIHVudGlsIHRoZSBzZW1hcGhvcmUgcG9pbnRlZCAKKyAqIHRvIGJ5IHNlbSBoYXMgYSBwb3NpdGl2ZSBjb3VudC4gSXQgdGhlbiBhdG9taWNhbGx5IGRlY3JlYXNlcyB0aGUgc2VtYXBob3JlCisgKiBjb3VudC4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZW1XYWl0KFNETF9zZW0gKnNlbSk7CisKKy8qKiBOb24tYmxvY2tpbmcgdmFyaWFudCBvZiBTRExfU2VtV2FpdCgpLgorICogIEByZXR1cm4gMCBpZiB0aGUgd2FpdCBzdWNjZWVkcywKKyAqICBTRExfTVVURVhfVElNRURPVVQgaWYgdGhlIHdhaXQgd291bGQgYmxvY2ssIGFuZCAtMSBvbiBlcnJvci4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSk7CisKKy8qKiBWYXJpYW50IG9mIFNETF9TZW1XYWl0KCkgd2l0aCBhIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCByZXR1cm5zIDAgaWYKKyAqICB0aGUgd2FpdCBzdWNjZWVkcywgU0RMX01VVEVYX1RJTUVET1VUIGlmIHRoZSB3YWl0IGRvZXMgbm90IHN1Y2NlZWQgaW4KKyAqICB0aGUgYWxsb3R0ZWQgdGltZSwgYW5kIC0xIG9uIGVycm9yLgorICoKKyAqICBPbiBzb21lIHBsYXRmb3JtcyB0aGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGJ5IGxvb3Bpbmcgd2l0aCBhIGRlbGF5CisgKiAgb2YgMSBtcywgYW5kIHNvIHNob3VsZCBiZSBhdm9pZGVkIGlmIHBvc3NpYmxlLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIG1zKTsKKworLyoqIEF0b21pY2FsbHkgaW5jcmVhc2VzIHRoZSBzZW1hcGhvcmUncyBjb3VudCAobm90IGJsb2NraW5nKS4KKyAqICBAcmV0dXJuIDAsIG9yIC0xIG9uIGVycm9yLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NlbVBvc3QoU0RMX3NlbSAqc2VtKTsKKworLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgb2YgdGhlIHNlbWFwaG9yZSAqLworZXh0ZXJuIERFQ0xTUEVDIFVpbnQzMiBTRExDQUxMIFNETF9TZW1WYWx1ZShTRExfc2VtICpzZW0pOworCisvKkB9Ki8KKworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLworLyoqIEBuYW1lIENvbmRpdGlvbl92YXJpYWJsZV9mdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAvKkB7Ki8KKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKworLypAeyovCisvKiogVGhlIFNETCBjb25kaXRpb24gdmFyaWFibGUgc3RydWN0dXJlLCBkZWZpbmVkIGluIFNETF9jb25kLmMgKi8KK3N0cnVjdCBTRExfY29uZDsKK3R5cGVkZWYgc3RydWN0IFNETF9jb25kIFNETF9jb25kOworLypAfSovCisKKy8qKiBDcmVhdGUgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KK2V4dGVybiBERUNMU1BFQyBTRExfY29uZCAqIFNETENBTEwgU0RMX0NyZWF0ZUNvbmQodm9pZCk7CisKKy8qKiBEZXN0cm95IGEgY29uZGl0aW9uIHZhcmlhYmxlICovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9EZXN0cm95Q29uZChTRExfY29uZCAqY29uZCk7CisKKy8qKiBSZXN0YXJ0IG9uZSBvZiB0aGUgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUsCisgKiAgQHJldHVybiAwIG9yIC0xIG9uIGVycm9yLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NvbmRTaWduYWwoU0RMX2NvbmQgKmNvbmQpOworCisvKiogUmVzdGFydCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUsCisgKiAgQHJldHVybiAwIG9yIC0xIG9uIGVycm9yLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NvbmRCcm9hZGNhc3QoU0RMX2NvbmQgKmNvbmQpOworCisvKiogV2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLCB1bmxvY2tpbmcgdGhlIHByb3ZpZGVkIG11dGV4LgorICogIFRoZSBtdXRleCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbiEKKyAqICBUaGUgbXV0ZXggaXMgcmUtbG9ja2VkIG9uY2UgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBpcyBzaWduYWxlZC4KKyAqICBAcmV0dXJuIDAgd2hlbiBpdCBpcyBzaWduYWxlZCwgb3IgLTEgb24gZXJyb3IuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfQ29uZFdhaXQoU0RMX2NvbmQgKmNvbmQsIFNETF9tdXRleCAqbXV0KTsKKworLyoqIFdhaXRzIGZvciBhdCBtb3N0ICdtcycgbWlsbGlzZWNvbmRzLCBhbmQgcmV0dXJucyAwIGlmIHRoZSBjb25kaXRpb24KKyAqICB2YXJpYWJsZSBpcyBzaWduYWxlZCwgU0RMX01VVEVYX1RJTUVET1VUIGlmIHRoZSBjb25kaXRpb24gaXMgbm90CisgKiAgc2lnbmFsZWQgaW4gdGhlIGFsbG90dGVkIHRpbWUsIGFuZCAtMSBvbiBlcnJvci4KKyAqICBPbiBzb21lIHBsYXRmb3JtcyB0aGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGJ5IGxvb3Bpbmcgd2l0aCBhIGRlbGF5CisgKiAgb2YgMSBtcywgYW5kIHNvIHNob3VsZCBiZSBhdm9pZGVkIGlmIHBvc3NpYmxlLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NvbmRXYWl0VGltZW91dChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCwgVWludDMyIG1zKTsKKworLypAfSovCisKKy8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCisKKyNlbmRpZiAvKiBfU0RMX211dGV4X2ggKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL2luY2x1ZGUvU0RMX25hbWUuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9uYW1lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9pbmNsdWRlL1NETF9uYW1lLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9uYW1lLmgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9vcGVuZ2wuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9vcGVuZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDc5MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX29wZW5nbC5oCkBAIC0wLDAgKzEsNjU3MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqIEBmaWxlIFNETF9vcGVuZ2wuaAorICogIFRoaXMgaXMgYSBzaW1wbGUgZmlsZSB0byBlbmNhcHN1bGF0ZSB0aGUgT3BlbkdMIEFQSSBoZWFkZXJzCisgKi8KKworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIF9fV0lOMzJfXworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaWZuZGVmIE5PTUlOTUFYCisjZGVmaW5lIE5PTUlOTUFYCS8qIERvbid0IGRlZmluZWQgbWluKCkgYW5kIG1heCgpICovCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKyNpZm5kZWYgTk9fU0RMX0dMRVhUCisjZGVmaW5lIF9fZ2xleHRfaF8gIC8qIERvbid0IGxldCBnbC5oIGluY2x1ZGUgZ2xleHQuaCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChfX01BQ09TWF9fKQorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgkvKiBIZWFkZXIgRmlsZSBGb3IgVGhlIE9wZW5HTCBMaWJyYXJ5ICovCisjaW5jbHVkZSA8T3BlbkdML2dsdS5oPgkvKiBIZWFkZXIgRmlsZSBGb3IgVGhlIEdMVSBMaWJyYXJ5ICovCisjZWxpZiBkZWZpbmVkKF9fTUFDT1NfXykKKyNpbmNsdWRlIDxnbC5oPgkJLyogSGVhZGVyIEZpbGUgRm9yIFRoZSBPcGVuR0wgTGlicmFyeSAqLworI2luY2x1ZGUgPGdsdS5oPgkvKiBIZWFkZXIgRmlsZSBGb3IgVGhlIEdMVSBMaWJyYXJ5ICovCisjZWxzZQorI2luY2x1ZGUgPEdML2dsLmg+CS8qIEhlYWRlciBGaWxlIEZvciBUaGUgT3BlbkdMIExpYnJhcnkgKi8KKyNpbmNsdWRlIDxHTC9nbHUuaD4JLyogSGVhZGVyIEZpbGUgRm9yIFRoZSBHTFUgTGlicmFyeSAqLworI2VuZGlmCisjaWZuZGVmIE5PX1NETF9HTEVYVAorI3VuZGVmIF9fZ2xleHRfaF8KKyNlbmRpZgorCisvKiogQG5hbWUgR0xleHQuaAorICogIFRoaXMgZmlsZSB0YWtlbiBmcm9tICJHTGV4dC5oIiBmcm9tIHRoZSBKZWZmIE1vbG9mZWUgT3BlbkdMIHR1dG9yaWFscy4KKyAqICBJdCBpcyBpbmNsdWRlZCBoZXJlIGJlY2F1c2UgZ2xleHQuaCBpcyBub3QgYXZhaWxhYmxlIG9uIHNvbWUgc3lzdGVtcy4KKyAqICBJZiB5b3UgZG9uJ3Qgd2FudCB0aGlzIHZlcnNpb24gaW5jbHVkZWQsIHNpbXBseSBkZWZpbmUgIk5PX1NETF9HTEVYVCIKKyAqLworLypAeyovCisjaWZuZGVmIE5PX1NETF9HTEVYVAorI2lmICFkZWZpbmVkKF9fZ2xleHRfaF8pICYmICFkZWZpbmVkKEdMX0dMRVhUX0xFR0FDWSkKKyNkZWZpbmUgX19nbGV4dF9oXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKiBMaWNlbnNlIEFwcGxpY2FiaWxpdHkuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUKKyoqIG1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWUKKyoqIFNvZnR3YXJlIExpY2Vuc2UgQiwgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpLCB0aGUgY29udGVudHMgb2YgdGhpcworKiogZmlsZSBhcmUgc3ViamVjdCBvbmx5IHRvIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UKKyoqIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyoqIG9mIHRoZSBMaWNlbnNlIGF0IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGF0dG46IExlZ2FsIFNlcnZpY2VzLCAxNjAwCisqKiBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMtMTM1MSwgb3IgYXQ6CisqKiAKKyoqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQgorKiogCisqKiBOb3RlIHRoYXQsIGFzIHByb3ZpZGVkIGluIHRoZSBMaWNlbnNlLCB0aGUgU29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyoqICJBUyBJUyIgYmFzaXMsIHdpdGggQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUyBBTkQgQ09ORElUSU9OUworKiogRElTQ0xBSU1FRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgQU5ECisqKiBDT05ESVRJT05TIE9GIE1FUkNIQU5UQUJJTElUWSwgU0FUSVNGQUNUT1JZIFFVQUxJVFksIEZJVE5FU1MgRk9SIEEKKyoqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisqKiAKKyoqIE9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLAorKiogVmVyc2lvbiAxLjIuMSwgcmVsZWFzZWQgSmFudWFyeSAyNiwgMjAwMCwgZGV2ZWxvcGVkIGJ5IFNpbGljb24gR3JhcGhpY3MsCisqKiBJbmMuIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5MS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyoqIENvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZAorKiogZWxzZXdoZXJlIGhlcmVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqIAorKiogQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhpcyBzb2Z0d2FyZSB3YXMgY3JlYXRlZCB1c2luZyB0aGUKKyoqIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiBwdWJsaXNoZWQgYnkgU0dJLCBidXQgaGFzCisqKiBub3QgYmVlbiBpbmRlcGVuZGVudGx5IHZlcmlmaWVkIGFzIGJlaW5nIGNvbXBsaWFudCB3aXRoIHRoZSBPcGVuR0woUikKKyoqIHZlcnNpb24gMS4yLjEgU3BlY2lmaWNhdGlvbi4KKyovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoQVBJRU5UUlkpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIEFQSUVOVFJZCisjZGVmaW5lIEFQSUVOVFJZCisjZW5kaWYKKyNpZm5kZWYgQVBJRU5UUllQCisjZGVmaW5lIEFQSUVOVFJZUCBBUElFTlRSWSAqCisjZW5kaWYKKyNpZm5kZWYgR0xBUEkKKyNkZWZpbmUgR0xBUEkgZXh0ZXJuCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhlYWRlciBmaWxlIHZlcnNpb24gbnVtYmVyLCByZXF1aXJlZCBieSBPcGVuR0wgQUJJIGZvciBMaW51eCAqLworLyogZ2xleHQuaCBsYXN0IHVwZGF0ZWQgMjAwNS8wNi8yMCAqLworLyogQ3VycmVudCB2ZXJzaW9uIGF0IGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9vZ2wtc2FtcGxlL3JlZ2lzdHJ5LyAqLworI2RlZmluZSBHTF9HTEVYVF9WRVJTSU9OIDI5CisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzIKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURV8zXzNfMiAgICAgICAgICAgIDB4ODAzMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgMHg4MDMzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAweDgwMzQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzhfOF84XzggICAgICAgICAgIDB4ODAzNQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMiAgICAgICAgMHg4MDM2CisjZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAweDgwM0EKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzNEICAgICAgICAgICAgIDB4ODA2QQorI2RlZmluZSBHTF9QQUNLX1NLSVBfSU1BR0VTICAgICAgICAgICAgICAgMHg4MDZCCisjZGVmaW5lIEdMX1BBQ0tfSU1BR0VfSEVJR0hUICAgICAgICAgICAgICAweDgwNkMKKyNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfSU1BR0VTICAgICAgICAgICAgIDB4ODA2RAorI2RlZmluZSBHTF9VTlBBQ0tfSU1BR0VfSEVJR0hUICAgICAgICAgICAgMHg4MDZFCisjZGVmaW5lIEdMX1RFWFRVUkVfM0QgICAgICAgICAgICAgICAgICAgICAweDgwNkYKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8zRCAgICAgICAgICAgICAgIDB4ODA3MAorI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIICAgICAgICAgICAgICAgICAgMHg4MDcxCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9SICAgICAgICAgICAgICAgICAweDgwNzIKKyNkZWZpbmUgR0xfTUFYXzNEX1RFWFRVUkVfU0laRSAgICAgICAgICAgIDB4ODA3MworI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFXzJfM18zX1JFViAgICAgICAgMHg4MzYyCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAweDgzNjMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzVfUkVWICAgICAgIDB4ODM2NAorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFViAgICAgMHg4MzY1CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWICAgICAweDgzNjYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWICAgICAgIDB4ODM2NworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVYgICAgMHg4MzY4CisjZGVmaW5lIEdMX0JHUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTAKKyNkZWZpbmUgR0xfQkdSQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgMHg4MEU4CisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTICAgICAgICAgICAweDgwRTkKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgIDB4ODEyRgorI2RlZmluZSBHTF9URVhUVVJFX01JTl9MT0QgICAgICAgICAgICAgICAgMHg4MTNBCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0xPRCAgICAgICAgICAgICAgICAweDgxM0IKKyNkZWZpbmUgR0xfVEVYVFVSRV9CQVNFX0xFVkVMICAgICAgICAgICAgIDB4ODEzQworI2RlZmluZSBHTF9URVhUVVJFX01BWF9MRVZFTCAgICAgICAgICAgICAgMHg4MTNECisjZGVmaW5lIEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wgICAgICAweDgxRjgKKyNkZWZpbmUgR0xfU0lOR0xFX0NPTE9SICAgICAgICAgICAgICAgICAgIDB4ODFGOQorI2RlZmluZSBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUiAgICAgICAgMHg4MUZBCisjZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAweDBCMTIKKyNkZWZpbmUgR0xfU01PT1RIX1BPSU5UX1NJWkVfR1JBTlVMQVJJVFkgIDB4MEIxMworI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgMHgwQjIyCisjZGVmaW5lIEdMX1NNT09USF9MSU5FX1dJRFRIX0dSQU5VTEFSSVRZICAweDBCMjMKKyNkZWZpbmUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgIDB4ODQ2RAorI2RlZmluZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgMHg4NDZFCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaW1hZ2luZworI2RlZmluZSBHTF9DT05TVEFOVF9DT0xPUiAgICAgICAgICAgICAgICAgMHg4MDAxCisjZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiAgICAgICAweDgwMDIKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEgICAgICAgMHg4MDA0CisjZGVmaW5lIEdMX0JMRU5EX0NPTE9SICAgICAgICAgICAgICAgICAgICAweDgwMDUKKyNkZWZpbmUgR0xfRlVOQ19BREQgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNgorI2RlZmluZSBHTF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA3CisjZGVmaW5lIEdMX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDgKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgIDB4ODAwOQorI2RlZmluZSBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgMHg4MDBBCisjZGVmaW5lIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCAgICAgICAgICAweDgwMEIKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMUQgICAgICAgICAgICAgICAgIDB4ODAxMAorI2RlZmluZSBHTF9DT05WT0xVVElPTl8yRCAgICAgICAgICAgICAgICAgMHg4MDExCisjZGVmaW5lIEdMX1NFUEFSQUJMRV8yRCAgICAgICAgICAgICAgICAgICAweDgwMTIKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREUgICAgICAgIDB4ODAxMworI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfU0NBTEUgICAgICAgMHg4MDE0CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9CSUFTICAgICAgICAweDgwMTUKKyNkZWZpbmUgR0xfUkVEVUNFICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxNgorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GT1JNQVQgICAgICAgICAgICAgMHg4MDE3CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX1dJRFRIICAgICAgICAgICAgICAweDgwMTgKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fSEVJR0hUICAgICAgICAgICAgIDB4ODAxOQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fV0lEVEggICAgICAgICAgMHg4MDFBCisjZGVmaW5lIEdMX01BWF9DT05WT0xVVElPTl9IRUlHSFQgICAgICAgICAweDgwMUIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfU0NBTEUgICAgIDB4ODAxQworI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX1NDQUxFICAgMHg4MDFECisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9TQ0FMRSAgICAweDgwMUUKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9TQ0FMRSAgIDB4ODAxRgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX1JFRF9CSUFTICAgICAgMHg4MDIwCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fQklBUyAgICAweDgwMjEKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVMgICAgIDB4ODAyMgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX0JJQVMgICAgMHg4MDIzCisjZGVmaW5lIEdMX0hJU1RPR1JBTSAgICAgICAgICAgICAgICAgICAgICAweDgwMjQKKyNkZWZpbmUgR0xfUFJPWFlfSElTVE9HUkFNICAgICAgICAgICAgICAgIDB4ODAyNQorI2RlZmluZSBHTF9ISVNUT0dSQU1fV0lEVEggICAgICAgICAgICAgICAgMHg4MDI2CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9GT1JNQVQgICAgICAgICAgICAgICAweDgwMjcKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1JFRF9TSVpFICAgICAgICAgICAgIDB4ODAyOAorI2RlZmluZSBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRSAgICAgICAgICAgMHg4MDI5CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9CTFVFX1NJWkUgICAgICAgICAgICAweDgwMkEKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0FMUEhBX1NJWkUgICAgICAgICAgIDB4ODAyQgorI2RlZmluZSBHTF9ISVNUT0dSQU1fTFVNSU5BTkNFX1NJWkUgICAgICAgMHg4MDJDCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9TSU5LICAgICAgICAgICAgICAgICAweDgwMkQKKyNkZWZpbmUgR0xfTUlOTUFYICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAyRQorI2RlZmluZSBHTF9NSU5NQVhfRk9STUFUICAgICAgICAgICAgICAgICAgMHg4MDJGCisjZGVmaW5lIEdMX01JTk1BWF9TSU5LICAgICAgICAgICAgICAgICAgICAweDgwMzAKKyNkZWZpbmUgR0xfVEFCTEVfVE9PX0xBUkdFICAgICAgICAgICAgICAgIDB4ODAzMQorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVggICAgICAgICAgICAgICAgICAgMHg4MEIxCisjZGVmaW5lIEdMX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSCAgICAgICAweDgwQjIKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSCAgIDB4ODBCMworI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfU0NBTEUgICAgMHg4MEI0CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX1NDQUxFICAweDgwQjUKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9TQ0FMRSAgIDB4ODBCNgorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9TQ0FMRSAgMHg4MEI3CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9CSUFTICAgICAweDgwQjgKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fQklBUyAgIDB4ODBCOQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9CTFVFX0JJQVMgICAgMHg4MEJBCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX0JJQVMgICAweDgwQkIKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEUgICAgICAgICAgICAgICAgICAgIDB4ODBEMAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFICAgMHg4MEQxCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFICAweDgwRDIKKyNkZWZpbmUgR0xfUFJPWFlfQ09MT1JfVEFCTEUgICAgICAgICAgICAgIDB4ODBEMworI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFIDB4ODBENAorI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRSAweDgwRDUKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfU0NBTEUgICAgICAgICAgICAgIDB4ODBENgorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9CSUFTICAgICAgICAgICAgICAgMHg4MEQ3CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0ZPUk1BVCAgICAgICAgICAgICAweDgwRDgKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfV0lEVEggICAgICAgICAgICAgIDB4ODBEOQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9SRURfU0laRSAgICAgICAgICAgMHg4MERBCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkUgICAgICAgICAweDgwREIKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQkxVRV9TSVpFICAgICAgICAgIDB4ODBEQworI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9BTFBIQV9TSVpFICAgICAgICAgMHg4MERECisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0xVTUlOQU5DRV9TSVpFICAgICAweDgwREUKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfSU5URU5TSVRZX1NJWkUgICAgIDB4ODBERgorI2RlZmluZSBHTF9DT05TVEFOVF9CT1JERVIgICAgICAgICAgICAgICAgMHg4MTUxCisjZGVmaW5lIEdMX1JFUExJQ0FURV9CT1JERVIgICAgICAgICAgICAgICAweDgxNTMKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fQk9SREVSX0NPTE9SICAgICAgIDB4ODE1NAorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzMKKyNkZWZpbmUgR0xfVEVYVFVSRTAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTMgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTYgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTkgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxICAgICAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwICAgICAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgMHg4NERGCisjZGVmaW5lIEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAweDg0RTAKKyNkZWZpbmUgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFICAgICAgICAgIDB4ODRFMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgMHg4NEUyCisjZGVmaW5lIEdMX1RSQU5TUE9TRV9NT0RFTFZJRVdfTUFUUklYICAgICAweDg0RTMKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX1BST0pFQ1RJT05fTUFUUklYICAgIDB4ODRFNAorI2RlZmluZSBHTF9UUkFOU1BPU0VfVEVYVFVSRV9NQVRSSVggICAgICAgMHg4NEU1CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9DT0xPUl9NQVRSSVggICAgICAgICAweDg0RTYKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgIDB4ODA5RAorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAweDgwOUYKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgIDB4ODBBMAorI2RlZmluZSBHTF9TQU1QTEVfQlVGRkVSUyAgICAgICAgICAgICAgICAgMHg4MEE4CisjZGVmaW5lIEdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAweDgwQTkKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgIDB4ODBBQQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUICAgICAgICAgMHg4MEFCCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JJVCAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEdMX05PUk1BTF9NQVAgICAgICAgICAgICAgICAgICAgICAweDg1MTEKKyNkZWZpbmUgR0xfUkVGTEVDVElPTl9NQVAgICAgICAgICAgICAgICAgIDB4ODUxMgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgICAgICAgMHg4NTEzCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUCAgICAgICAweDg1MTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICAgIDB4ODUxNQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ggICAgMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAgICAweDg1MTcKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgIDB4ODUxOAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogICAgMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAgICAweDg1MUEKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9DVUJFX01BUCAgICAgICAgIDB4ODUxQgorI2RlZmluZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICAgICAgMHg4NTFDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfQUxQSEEgICAgICAgICAgICAgICAweDg0RTkKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0UgICAgICAgICAgIDB4ODRFQQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQSAgICAgMHg4NEVCCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfSU5URU5TSVRZICAgICAgICAgICAweDg0RUMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0IgICAgICAgICAgICAgICAgIDB4ODRFRAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkEgICAgICAgICAgICAgICAgMHg4NEVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NJT05fSElOVCAgICAgICAweDg0RUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkUgIDB4ODZBMAorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTRUQgICAgICAgICAgICAgMHg4NkExCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAweDg2QTIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgIDB4ODZBMworI2RlZmluZSBHTF9DTEFNUF9UT19CT1JERVIgICAgICAgICAgICAgICAgMHg4MTJECisjZGVmaW5lIEdMX0NPTUJJTkUgICAgICAgICAgICAgICAgICAgICAgICAweDg1NzAKKyNkZWZpbmUgR0xfQ09NQklORV9SR0IgICAgICAgICAgICAgICAgICAgIDB4ODU3MQorI2RlZmluZSBHTF9DT01CSU5FX0FMUEhBICAgICAgICAgICAgICAgICAgMHg4NTcyCisjZGVmaW5lIEdMX1NPVVJDRTBfUkdCICAgICAgICAgICAgICAgICAgICAweDg1ODAKKyNkZWZpbmUgR0xfU09VUkNFMV9SR0IgICAgICAgICAgICAgICAgICAgIDB4ODU4MQorI2RlZmluZSBHTF9TT1VSQ0UyX1JHQiAgICAgICAgICAgICAgICAgICAgMHg4NTgyCisjZGVmaW5lIEdMX1NPVVJDRTBfQUxQSEEgICAgICAgICAgICAgICAgICAweDg1ODgKKyNkZWZpbmUgR0xfU09VUkNFMV9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU4OQorI2RlZmluZSBHTF9TT1VSQ0UyX0FMUEhBICAgICAgICAgICAgICAgICAgMHg4NThBCisjZGVmaW5lIEdMX09QRVJBTkQwX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTAKKyNkZWZpbmUgR0xfT1BFUkFORDFfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MQorI2RlZmluZSBHTF9PUEVSQU5EMl9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkyCisjZGVmaW5lIEdMX09QRVJBTkQwX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTgKKyNkZWZpbmUgR0xfT1BFUkFORDFfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5OQorI2RlZmluZSBHTF9PUEVSQU5EMl9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTlBCisjZGVmaW5lIEdMX1JHQl9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAweDg1NzMKKyNkZWZpbmUgR0xfQUREX1NJR05FRCAgICAgICAgICAgICAgICAgICAgIDB4ODU3NAorI2RlZmluZSBHTF9JTlRFUlBPTEFURSAgICAgICAgICAgICAgICAgICAgMHg4NTc1CisjZGVmaW5lIEdMX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAweDg0RTcKKyNkZWZpbmUgR0xfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAgICAgIDB4ODU3NgorI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SICAgICAgICAgICAgICAgICAgMHg4NTc3CisjZGVmaW5lIEdMX1BSRVZJT1VTICAgICAgICAgICAgICAgICAgICAgICAweDg1NzgKKyNkZWZpbmUgR0xfRE9UM19SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRQorI2RlZmluZSBHTF9ET1QzX1JHQkEgICAgICAgICAgICAgICAgICAgICAgMHg4NkFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfNAorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCICAgICAgICAgICAgICAgICAgMHg4MEM4CisjZGVmaW5lIEdMX0JMRU5EX1NSQ19SR0IgICAgICAgICAgICAgICAgICAweDgwQzkKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX0FMUEhBICAgICAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgMHg4MENCCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUlOICAgICAgICAgICAgICAgICAweDgxMjYKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9NQVggICAgICAgICAgICAgICAgIDB4ODEyNworI2RlZmluZSBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgMHg4MTI4CisjZGVmaW5lIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OICAgICAweDgxMjkKKyNkZWZpbmUgR0xfR0VORVJBVEVfTUlQTUFQICAgICAgICAgICAgICAgIDB4ODE5MQorI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAgICAgICAgICAgMHg4MTkyCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2ICAgICAgICAgICAgICAweDgxQTUKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjQgICAgICAgICAgICAgIDB4ODFBNgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMiAgICAgICAgICAgICAgMHg4MUE3CisjZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVCAgICAgICAgICAgICAgICAweDgzNzAKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFICAgICAgICAgIDB4ODQ1MAorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURSAgICAgICAgICAgICAgICAgMHg4NDUxCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0RFUFRIICAgICAgICAgICAgICAgICAweDg0NTIKKyNkZWZpbmUgR0xfQ1VSUkVOVF9GT0dfQ09PUkRJTkFURSAgICAgICAgIDB4ODQ1MworI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9UWVBFICAgICAgMHg4NDU0CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1NUUklERSAgICAweDg0NTUKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfUE9JTlRFUiAgIDB4ODQ1NgorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWSAgICAgICAgICAgMHg4NDU3CisjZGVmaW5lIEdMX0NPTE9SX1NVTSAgICAgICAgICAgICAgICAgICAgICAweDg0NTgKKyNkZWZpbmUgR0xfQ1VSUkVOVF9TRUNPTkRBUllfQ09MT1IgICAgICAgIDB4ODQ1OQorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU0laRSAgICAgMHg4NDVBCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9UWVBFICAgICAweDg0NUIKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1NUUklERSAgIDB4ODQ1QworI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfUE9JTlRFUiAgMHg4NDVECisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWSAgICAgICAgICAweDg0NUUKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfTE9EX0JJQVMgICAgICAgICAgIDB4ODRGRAorI2RlZmluZSBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MICAgICAgICAgMHg4NTAwCisjZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVMgICAgICAgICAgICAgICAweDg1MDEKKyNkZWZpbmUgR0xfSU5DUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDB4ODUwNworI2RlZmluZSBHTF9ERUNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgMHg4NTA4CisjZGVmaW5lIEdMX1RFWFRVUkVfREVQVEhfU0laRSAgICAgICAgICAgICAweDg4NEEKKyNkZWZpbmUgR0xfREVQVEhfVEVYVFVSRV9NT0RFICAgICAgICAgICAgIDB4ODg0QgorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERSAgICAgICAgICAgMHg4ODRDCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DICAgICAgICAgICAweDg4NEQKKyNkZWZpbmUgR0xfQ09NUEFSRV9SX1RPX1RFWFRVUkUgICAgICAgICAgIDB4ODg0RQorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzUKKyNkZWZpbmUgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4ODc2NAorI2RlZmluZSBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgMHg4NzY1CisjZGVmaW5lIEdMX1FVRVJZX0NPVU5URVJfQklUUyAgICAgICAgICAgICAweDg4NjQKKyNkZWZpbmUgR0xfQ1VSUkVOVF9RVUVSWSAgICAgICAgICAgICAgICAgIDB4ODg2NQorI2RlZmluZSBHTF9RVUVSWV9SRVNVTFQgICAgICAgICAgICAgICAgICAgMHg4ODY2CisjZGVmaW5lIEdMX1FVRVJZX1JFU1VMVF9BVkFJTEFCTEUgICAgICAgICAweDg4NjcKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4ODg5MgorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgMHg4ODkzCisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAweDg4OTQKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgIDB4ODg5NQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgMHg4ODk2CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAweDg4OTcKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgIDB4ODg5OAorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgMHg4ODk5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlBCisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUIKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HIDB4ODg5QworI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUQKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgIDB4ODg5RQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HIDB4ODg5RgorI2RlZmluZSBHTF9SRUFEX09OTFkgICAgICAgICAgICAgICAgICAgICAgMHg4OEI4CisjZGVmaW5lIEdMX1dSSVRFX09OTFkgICAgICAgICAgICAgICAgICAgICAweDg4QjkKKyNkZWZpbmUgR0xfUkVBRF9XUklURSAgICAgICAgICAgICAgICAgICAgIDB4ODhCQQorI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTICAgICAgICAgICAgICAgICAgMHg4OEJCCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBQRUQgICAgICAgICAgICAgICAgICAweDg4QkMKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9QT0lOVEVSICAgICAgICAgICAgIDB4ODhCRAorI2RlZmluZSBHTF9TVFJFQU1fRFJBVyAgICAgICAgICAgICAgICAgICAgMHg4OEUwCisjZGVmaW5lIEdMX1NUUkVBTV9SRUFEICAgICAgICAgICAgICAgICAgICAweDg4RTEKKyNkZWZpbmUgR0xfU1RSRUFNX0NPUFkgICAgICAgICAgICAgICAgICAgIDB4ODhFMgorI2RlZmluZSBHTF9TVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgMHg4OEU0CisjZGVmaW5lIEdMX1NUQVRJQ19SRUFEICAgICAgICAgICAgICAgICAgICAweDg4RTUKKyNkZWZpbmUgR0xfU1RBVElDX0NPUFkgICAgICAgICAgICAgICAgICAgIDB4ODhFNgorI2RlZmluZSBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgMHg4OEU4CisjZGVmaW5lIEdMX0RZTkFNSUNfUkVBRCAgICAgICAgICAgICAgICAgICAweDg4RTkKKyNkZWZpbmUgR0xfRFlOQU1JQ19DT1BZICAgICAgICAgICAgICAgICAgIDB4ODhFQQorI2RlZmluZSBHTF9TQU1QTEVTX1BBU1NFRCAgICAgICAgICAgICAgICAgMHg4OTE0CisjZGVmaW5lIEdMX0ZPR19DT09SRF9TUkMgICAgICAgICAgICAgICAgICBHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0UKKyNkZWZpbmUgR0xfRk9HX0NPT1JEICAgICAgICAgICAgICAgICAgICAgIEdMX0ZPR19DT09SRElOQVRFCisjZGVmaW5lIEdMX0NVUlJFTlRfRk9HX0NPT1JEICAgICAgICAgICAgICBHTF9DVVJSRU5UX0ZPR19DT09SRElOQVRFCisjZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWV9UWVBFICAgICAgICAgICBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9UWVBFCisjZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWV9TVFJJREUgICAgICAgICBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9TVFJJREUKKyNkZWZpbmUgR0xfRk9HX0NPT1JEX0FSUkFZX1BPSU5URVIgICAgICAgIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1BPSU5URVIKKyNkZWZpbmUgR0xfRk9HX0NPT1JEX0FSUkFZICAgICAgICAgICAgICAgIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZCisjZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9CVUZGRVJfQklORElORworI2RlZmluZSBHTF9TUkMwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgR0xfU09VUkNFMF9SR0IKKyNkZWZpbmUgR0xfU1JDMV9SR0IgICAgICAgICAgICAgICAgICAgICAgIEdMX1NPVVJDRTFfUkdCCisjZGVmaW5lIEdMX1NSQzJfUkdCICAgICAgICAgICAgICAgICAgICAgICBHTF9TT1VSQ0UyX1JHQgorI2RlZmluZSBHTF9TUkMwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgR0xfU09VUkNFMF9BTFBIQQorI2RlZmluZSBHTF9TUkMxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgR0xfU09VUkNFMV9BTFBIQQorI2RlZmluZSBHTF9TUkMyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgR0xfU09VUkNFMl9BTFBIQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCICAgICAgICAgICAgIEdMX0JMRU5EX0VRVUFUSU9OCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCAgICAweDg2MjIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFICAgICAgIDB4ODYyMworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERSAgICAgMHg4NjI0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSAgICAgICAweDg2MjUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCICAgICAgICAgIDB4ODYyNgorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9QT0lOVF9TSVpFICAgICAgMHg4NjQyCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1RXT19TSURFICAgICAgICAweDg2NDMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSICAgIDB4ODY0NQorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRlVOQyAgICAgICAgICAgICAgMHg4ODAwCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GQUlMICAgICAgICAgICAgICAweDg4MDEKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTCAgIDB4ODgwMgorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTICAgMHg4ODAzCisjZGVmaW5lIEdMX01BWF9EUkFXX0JVRkZFUlMgICAgICAgICAgICAgICAweDg4MjQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIwICAgICAgICAgICAgICAgICAgIDB4ODgyNQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEgICAgICAgICAgICAgICAgICAgMHg4ODI2CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMiAgICAgICAgICAgICAgICAgICAweDg4MjcKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIzICAgICAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjQgICAgICAgICAgICAgICAgICAgMHg4ODI5CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNSAgICAgICAgICAgICAgICAgICAweDg4MkEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI2ICAgICAgICAgICAgICAgICAgIDB4ODgyQgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjcgICAgICAgICAgICAgICAgICAgMHg4ODJDCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOCAgICAgICAgICAgICAgICAgICAweDg4MkQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI5ICAgICAgICAgICAgICAgICAgIDB4ODgyRQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEwICAgICAgICAgICAgICAgICAgMHg4ODJGCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTEgICAgICAgICAgICAgICAgICAweDg4MzAKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMiAgICAgICAgICAgICAgICAgIDB4ODgzMQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEzICAgICAgICAgICAgICAgICAgMHg4ODMyCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTQgICAgICAgICAgICAgICAgICAweDg4MzMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNSAgICAgICAgICAgICAgICAgIDB4ODgzNAorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgMHg4ODNECisjZGVmaW5lIEdMX1BPSU5UX1NQUklURSAgICAgICAgICAgICAgICAgICAweDg4NjEKKyNkZWZpbmUgR0xfQ09PUkRfUkVQTEFDRSAgICAgICAgICAgICAgICAgIDB4ODg2MgorI2RlZmluZSBHTF9NQVhfVkVSVEVYX0FUVFJJQlMgICAgICAgICAgICAgMHg4ODY5CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCAweDg4NkEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfQ09PUkRTICAgICAgICAgICAgIDB4ODg3MQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyAgICAgICAgMHg4ODcyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUiAgICAgICAgICAgICAgICAweDhCMzAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUiAgICAgICAgICAgICAgICAgIDB4OEIzMQorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTIDB4OEI0OQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUyAgMHg4QjRBCisjZGVmaW5lIEdMX01BWF9WQVJZSU5HX0ZMT0FUUyAgICAgICAgICAgICAweDhCNEIKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEI0QworI2RlZmluZSBHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyAweDhCNEQKKyNkZWZpbmUgR0xfU0hBREVSX1RZUEUgICAgICAgICAgICAgICAgICAgIDB4OEI0RgorI2RlZmluZSBHTF9GTE9BVF9WRUMyICAgICAgICAgICAgICAgICAgICAgMHg4QjUwCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzMgICAgICAgICAgICAgICAgICAgICAweDhCNTEKKyNkZWZpbmUgR0xfRkxPQVRfVkVDNCAgICAgICAgICAgICAgICAgICAgIDB4OEI1MgorI2RlZmluZSBHTF9JTlRfVkVDMiAgICAgICAgICAgICAgICAgICAgICAgMHg4QjUzCisjZGVmaW5lIEdMX0lOVF9WRUMzICAgICAgICAgICAgICAgICAgICAgICAweDhCNTQKKyNkZWZpbmUgR0xfSU5UX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NQorI2RlZmluZSBHTF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU2CisjZGVmaW5lIEdMX0JPT0xfVkVDMiAgICAgICAgICAgICAgICAgICAgICAweDhCNTcKKyNkZWZpbmUgR0xfQk9PTF9WRUMzICAgICAgICAgICAgICAgICAgICAgIDB4OEI1OAorI2RlZmluZSBHTF9CT09MX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgMHg4QjU5CisjZGVmaW5lIEdMX0ZMT0FUX01BVDIgICAgICAgICAgICAgICAgICAgICAweDhCNUEKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMyAgICAgICAgICAgICAgICAgICAgIDB4OEI1QgorI2RlZmluZSBHTF9GTE9BVF9NQVQ0ICAgICAgICAgICAgICAgICAgICAgMHg4QjVDCisjZGVmaW5lIEdMX1NBTVBMRVJfMUQgICAgICAgICAgICAgICAgICAgICAweDhCNUQKKyNkZWZpbmUgR0xfU0FNUExFUl8yRCAgICAgICAgICAgICAgICAgICAgIDB4OEI1RQorI2RlZmluZSBHTF9TQU1QTEVSXzNEICAgICAgICAgICAgICAgICAgICAgMHg4QjVGCisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRSAgICAgICAgICAgICAgICAgICAweDhCNjAKKyNkZWZpbmUgR0xfU0FNUExFUl8xRF9TSEFET1cgICAgICAgICAgICAgIDB4OEI2MQorI2RlZmluZSBHTF9TQU1QTEVSXzJEX1NIQURPVyAgICAgICAgICAgICAgMHg4QjYyCisjZGVmaW5lIEdMX0RFTEVURV9TVEFUVVMgICAgICAgICAgICAgICAgICAweDhCODAKKyNkZWZpbmUgR0xfQ09NUElMRV9TVEFUVVMgICAgICAgICAgICAgICAgIDB4OEI4MQorI2RlZmluZSBHTF9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg4QjgyCisjZGVmaW5lIEdMX1ZBTElEQVRFX1NUQVRVUyAgICAgICAgICAgICAgICAweDhCODMKKyNkZWZpbmUgR0xfSU5GT19MT0dfTEVOR1RIICAgICAgICAgICAgICAgIDB4OEI4NAorI2RlZmluZSBHTF9BVFRBQ0hFRF9TSEFERVJTICAgICAgICAgICAgICAgMHg4Qjg1CisjZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNUyAgICAgICAgICAgICAgICAweDhCODYKKyNkZWZpbmUgR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCAgICAgIDB4OEI4NworI2RlZmluZSBHTF9TSEFERVJfU09VUkNFX0xFTkdUSCAgICAgICAgICAgMHg4Qjg4CisjZGVmaW5lIEdMX0FDVElWRV9BVFRSSUJVVEVTICAgICAgICAgICAgICAweDhCODkKKyNkZWZpbmUgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIICAgIDB4OEI4QQorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UIDB4OEI4QgorI2RlZmluZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04gICAgICAgMHg4QjhDCisjZGVmaW5lIEdMX0NVUlJFTlRfUFJPR1JBTSAgICAgICAgICAgICAgICAweDhCOEQKKyNkZWZpbmUgR0xfUE9JTlRfU1BSSVRFX0NPT1JEX09SSUdJTiAgICAgIDB4OENBMAorI2RlZmluZSBHTF9MT1dFUl9MRUZUICAgICAgICAgICAgICAgICAgICAgMHg4Q0ExCisjZGVmaW5lIEdMX1VQUEVSX0xFRlQgICAgICAgICAgICAgICAgICAgICAweDhDQTIKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1JFRiAgICAgICAgICAgICAgIDB4OENBMworI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAgICAgICAgMHg4Q0E0CisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19XUklURU1BU0sgICAgICAgICAweDhDQTUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tdWx0aXRleHR1cmUKKyNkZWZpbmUgR0xfVEVYVFVSRTBfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMV9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyX0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTNfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNF9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTZfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFN19BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTlfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTBfQVJCICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMV9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTNfQVJCICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNF9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1X0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTZfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxN19BUkIgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTlfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMF9BUkIgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjJfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyM19BUkIgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjVfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNl9BUkIgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjhfQVJCICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOV9BUkIgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzFfQVJCICAgICAgICAgICAgICAgICAgMHg4NERGCisjZGVmaW5lIEdMX0FDVElWRV9URVhUVVJFX0FSQiAgICAgICAgICAgICAweDg0RTAKKyNkZWZpbmUgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFX0FSQiAgICAgIDB4ODRFMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUU19BUkIgICAgICAgICAgMHg4NEUyCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdHJhbnNwb3NlX21hdHJpeAorI2RlZmluZSBHTF9UUkFOU1BPU0VfTU9ERUxWSUVXX01BVFJJWF9BUkIgMHg4NEUzCisjZGVmaW5lIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWF9BUkIgMHg4NEU0CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9URVhUVVJFX01BVFJJWF9BUkIgICAweDg0RTUKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWF9BUkIgICAgIDB4ODRFNgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0FSQiAgICAgICAgICAgICAgICAweDgwOUQKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFX0FSQiAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FX0FSQiAgICAgICAgMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9BUkIgICAgICAgICAgICAweDgwQTAKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfQVJCICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRV9BUkIgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVF9BUkIgICAgIDB4ODBBQgorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVRfQVJCICAgICAgICAgICAgMHgyMDAwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2FkZAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAKKyNkZWZpbmUgR0xfTk9STUFMX01BUF9BUkIgICAgICAgICAgICAgICAgIDB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUF9BUkIgICAgICAgICAgICAgMHg4NTEyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCICAgICAgICAgICAweDg1MTMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX0FSQiAgIDB4ODUxNAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfQVJCIDB4ODUxNQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfQVJCIDB4ODUxNgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfQVJCIDB4ODUxNworI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfQVJCIDB4ODUxOAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfQVJCIDB4ODUxOQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfQVJCIDB4ODUxQQorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQX0FSQiAgICAgMHg4NTFCCisjZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfQVJCICAweDg1MUMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfQUxQSEFfQVJCICAgICAgICAgICAweDg0RTkKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQVJCICAgICAgIDB4ODRFQQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQV9BUkIgMHg4NEVCCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfSU5URU5TSVRZX0FSQiAgICAgICAweDg0RUMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfQVJCICAgICAgICAgICAgIDB4ODRFRAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVJCICAgICAgICAgICAgMHg4NEVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NJT05fSElOVF9BUkIgICAweDg0RUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkVfQVJCIDB4ODZBMAorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTRURfQVJCICAgICAgICAgMHg4NkExCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUU19BUkIgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTX0FSQiAweDg2QTMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcAorI2RlZmluZSBHTF9DTEFNUF9UT19CT1JERVJfQVJCICAgICAgICAgICAgMHg4MTJECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTl9BUkIgICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYX0FSQiAgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRV9BUkIgIDB4ODEyOAorI2RlZmluZSBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIgMHg4MTI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2JsZW5kCisjZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JVFNfQVJCICAgICAgICAgICAweDg2QTQKKyNkZWZpbmUgR0xfQUNUSVZFX1ZFUlRFWF9VTklUU19BUkIgICAgICAgIDB4ODZBNQorI2RlZmluZSBHTF9XRUlHSFRfU1VNX1VOSVRZX0FSQiAgICAgICAgICAgMHg4NkE2CisjZGVmaW5lIEdMX1ZFUlRFWF9CTEVORF9BUkIgICAgICAgICAgICAgICAweDg2QTcKKyNkZWZpbmUgR0xfQ1VSUkVOVF9XRUlHSFRfQVJCICAgICAgICAgICAgIDB4ODZBOAorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfVFlQRV9BUkIgICAgICAgICAgMHg4NkE5CisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfQVJCICAgICAgICAweDg2QUEKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1NJWkVfQVJCICAgICAgICAgIDB4ODZBQgorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9BUkIgICAgICAgMHg4NkFDCisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9BUkIgICAgICAgICAgICAgICAweDg2QUQKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMF9BUkIgICAgICAgICAgICAgICAgIDB4MTcwMAorI2RlZmluZSBHTF9NT0RFTFZJRVcxX0FSQiAgICAgICAgICAgICAgICAgMHg4NTBBCisjZGVmaW5lIEdMX01PREVMVklFVzJfQVJCICAgICAgICAgICAgICAgICAweDg3MjIKKyNkZWZpbmUgR0xfTU9ERUxWSUVXM19BUkIgICAgICAgICAgICAgICAgIDB4ODcyMworI2RlZmluZSBHTF9NT0RFTFZJRVc0X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI0CisjZGVmaW5lIEdMX01PREVMVklFVzVfQVJCICAgICAgICAgICAgICAgICAweDg3MjUKKyNkZWZpbmUgR0xfTU9ERUxWSUVXNl9BUkIgICAgICAgICAgICAgICAgIDB4ODcyNgorI2RlZmluZSBHTF9NT0RFTFZJRVc3X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI3CisjZGVmaW5lIEdMX01PREVMVklFVzhfQVJCICAgICAgICAgICAgICAgICAweDg3MjgKKyNkZWZpbmUgR0xfTU9ERUxWSUVXOV9BUkIgICAgICAgICAgICAgICAgIDB4ODcyOQorI2RlZmluZSBHTF9NT0RFTFZJRVcxMF9BUkIgICAgICAgICAgICAgICAgMHg4NzJBCisjZGVmaW5lIEdMX01PREVMVklFVzExX0FSQiAgICAgICAgICAgICAgICAweDg3MkIKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTJfQVJCICAgICAgICAgICAgICAgIDB4ODcyQworI2RlZmluZSBHTF9NT0RFTFZJRVcxM19BUkIgICAgICAgICAgICAgICAgMHg4NzJECisjZGVmaW5lIEdMX01PREVMVklFVzE0X0FSQiAgICAgICAgICAgICAgICAweDg3MkUKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTVfQVJCICAgICAgICAgICAgICAgIDB4ODcyRgorI2RlZmluZSBHTF9NT0RFTFZJRVcxNl9BUkIgICAgICAgICAgICAgICAgMHg4NzMwCisjZGVmaW5lIEdMX01PREVMVklFVzE3X0FSQiAgICAgICAgICAgICAgICAweDg3MzEKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMThfQVJCICAgICAgICAgICAgICAgIDB4ODczMgorI2RlZmluZSBHTF9NT0RFTFZJRVcxOV9BUkIgICAgICAgICAgICAgICAgMHg4NzMzCisjZGVmaW5lIEdMX01PREVMVklFVzIwX0FSQiAgICAgICAgICAgICAgICAweDg3MzQKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjFfQVJCICAgICAgICAgICAgICAgIDB4ODczNQorI2RlZmluZSBHTF9NT0RFTFZJRVcyMl9BUkIgICAgICAgICAgICAgICAgMHg4NzM2CisjZGVmaW5lIEdMX01PREVMVklFVzIzX0FSQiAgICAgICAgICAgICAgICAweDg3MzcKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjRfQVJCICAgICAgICAgICAgICAgIDB4ODczOAorI2RlZmluZSBHTF9NT0RFTFZJRVcyNV9BUkIgICAgICAgICAgICAgICAgMHg4NzM5CisjZGVmaW5lIEdMX01PREVMVklFVzI2X0FSQiAgICAgICAgICAgICAgICAweDg3M0EKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjdfQVJCICAgICAgICAgICAgICAgIDB4ODczQgorI2RlZmluZSBHTF9NT0RFTFZJRVcyOF9BUkIgICAgICAgICAgICAgICAgMHg4NzNDCisjZGVmaW5lIEdMX01PREVMVklFVzI5X0FSQiAgICAgICAgICAgICAgICAweDg3M0QKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMzBfQVJCICAgICAgICAgICAgICAgIDB4ODczRQorI2RlZmluZSBHTF9NT0RFTFZJRVczMV9BUkIgICAgICAgICAgICAgICAgMHg4NzNGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbWF0cml4X3BhbGV0dGUKKyNkZWZpbmUgR0xfTUFUUklYX1BBTEVUVEVfQVJCICAgICAgICAgICAgIDB4ODg0MAorI2RlZmluZSBHTF9NQVhfTUFUUklYX1BBTEVUVEVfU1RBQ0tfREVQVEhfQVJCIDB4ODg0MQorI2RlZmluZSBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19BUkIgICAgICAgMHg4ODQyCisjZGVmaW5lIEdMX0NVUlJFTlRfUEFMRVRURV9NQVRSSVhfQVJCICAgICAweDg4NDMKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX0FSQiAgICAgICAgIDB4ODg0NAorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9JTkRFWF9BUkIgICAgICAgMHg4ODQ1CisjZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX0FSQiAgICAweDg4NDYKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfQVJCICAgIDB4ODg0NworI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX0FSQiAgMHg4ODQ4CisjZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX0FSQiAweDg4NDkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9jb21iaW5lCisjZGVmaW5lIEdMX0NPTUJJTkVfQVJCICAgICAgICAgICAgICAgICAgICAweDg1NzAKKyNkZWZpbmUgR0xfQ09NQklORV9SR0JfQVJCICAgICAgICAgICAgICAgIDB4ODU3MQorI2RlZmluZSBHTF9DT01CSU5FX0FMUEhBX0FSQiAgICAgICAgICAgICAgMHg4NTcyCisjZGVmaW5lIEdMX1NPVVJDRTBfUkdCX0FSQiAgICAgICAgICAgICAgICAweDg1ODAKKyNkZWZpbmUgR0xfU09VUkNFMV9SR0JfQVJCICAgICAgICAgICAgICAgIDB4ODU4MQorI2RlZmluZSBHTF9TT1VSQ0UyX1JHQl9BUkIgICAgICAgICAgICAgICAgMHg4NTgyCisjZGVmaW5lIEdMX1NPVVJDRTBfQUxQSEFfQVJCICAgICAgICAgICAgICAweDg1ODgKKyNkZWZpbmUgR0xfU09VUkNFMV9BTFBIQV9BUkIgICAgICAgICAgICAgIDB4ODU4OQorI2RlZmluZSBHTF9TT1VSQ0UyX0FMUEhBX0FSQiAgICAgICAgICAgICAgMHg4NThBCisjZGVmaW5lIEdMX09QRVJBTkQwX1JHQl9BUkIgICAgICAgICAgICAgICAweDg1OTAKKyNkZWZpbmUgR0xfT1BFUkFORDFfUkdCX0FSQiAgICAgICAgICAgICAgIDB4ODU5MQorI2RlZmluZSBHTF9PUEVSQU5EMl9SR0JfQVJCICAgICAgICAgICAgICAgMHg4NTkyCisjZGVmaW5lIEdMX09QRVJBTkQwX0FMUEhBX0FSQiAgICAgICAgICAgICAweDg1OTgKKyNkZWZpbmUgR0xfT1BFUkFORDFfQUxQSEFfQVJCICAgICAgICAgICAgIDB4ODU5OQorI2RlZmluZSBHTF9PUEVSQU5EMl9BTFBIQV9BUkIgICAgICAgICAgICAgMHg4NTlBCisjZGVmaW5lIEdMX1JHQl9TQ0FMRV9BUkIgICAgICAgICAgICAgICAgICAweDg1NzMKKyNkZWZpbmUgR0xfQUREX1NJR05FRF9BUkIgICAgICAgICAgICAgICAgIDB4ODU3NAorI2RlZmluZSBHTF9JTlRFUlBPTEFURV9BUkIgICAgICAgICAgICAgICAgMHg4NTc1CisjZGVmaW5lIEdMX1NVQlRSQUNUX0FSQiAgICAgICAgICAgICAgICAgICAweDg0RTcKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQVJCICAgICAgICAgICAgICAgICAgIDB4ODU3NgorI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SX0FSQiAgICAgICAgICAgICAgMHg4NTc3CisjZGVmaW5lIEdMX1BSRVZJT1VTX0FSQiAgICAgICAgICAgICAgICAgICAweDg1NzgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9jcm9zc2JhcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2RvdDMKKyNkZWZpbmUgR0xfRE9UM19SR0JfQVJCICAgICAgICAgICAgICAgICAgIDB4ODZBRQorI2RlZmluZSBHTF9ET1QzX1JHQkFfQVJCICAgICAgICAgICAgICAgICAgMHg4NkFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQKKyNkZWZpbmUgR0xfTUlSUk9SRURfUkVQRUFUX0FSQiAgICAgICAgICAgIDB4ODM3MAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RlcHRoX3RleHR1cmUKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMTZfQVJCICAgICAgICAgIDB4ODFBNQorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQyNF9BUkIgICAgICAgICAgMHg4MUE2CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDMyX0FSQiAgICAgICAgICAweDgxQTcKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9TSVpFX0FSQiAgICAgICAgIDB4ODg0QQorI2RlZmluZSBHTF9ERVBUSF9URVhUVVJFX01PREVfQVJCICAgICAgICAgMHg4ODRCCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZG93CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFX0FSQiAgICAgICAweDg4NEMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkNfQVJCICAgICAgIDB4ODg0RAorI2RlZmluZSBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRV9BUkIgICAgICAgMHg4ODRFCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZG93X2FtYmllbnQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX0ZBSUxfVkFMVUVfQVJCIDB4ODBCRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3dpbmRvd19wb3MKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfcHJvZ3JhbQorI2RlZmluZSBHTF9DT0xPUl9TVU1fQVJCICAgICAgICAgICAgICAgICAgMHg4NDU4CisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiAgICAgICAgICAgICAweDg2MjAKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEX0FSQiAweDg2MjIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFX0FSQiAgIDB4ODYyMworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERV9BUkIgMHg4NjI0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRV9BUkIgICAweDg2MjUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCX0FSQiAgICAgIDB4ODYyNgorI2RlZmluZSBHTF9QUk9HUkFNX0xFTkdUSF9BUkIgICAgICAgICAgICAgMHg4NjI3CisjZGVmaW5lIEdMX1BST0dSQU1fU1RSSU5HX0FSQiAgICAgICAgICAgICAweDg2MjgKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTUFUUklYX1NUQUNLX0RFUFRIX0FSQiAweDg2MkUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTUFUUklDRVNfQVJCICAgICAgIDB4ODYyRgorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9TVEFDS19ERVBUSF9BUkIgMHg4NjQwCisjZGVmaW5lIEdMX0NVUlJFTlRfTUFUUklYX0FSQiAgICAgICAgICAgICAweDg2NDEKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRV9BUkIgIDB4ODY0MgorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERV9BUkIgICAgMHg4NjQzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUl9BUkIgMHg4NjQ1CisjZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfUE9TSVRJT05fQVJCICAgICAweDg2NEIKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5ESU5HX0FSQiAgICAgICAgICAgIDB4ODY3NworI2RlZmluZSBHTF9NQVhfVkVSVEVYX0FUVFJJQlNfQVJCICAgICAgICAgMHg4ODY5CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRF9BUkIgMHg4ODZBCisjZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfU1RSSU5HX0FSQiAgICAgICAweDg4NzQKKyNkZWZpbmUgR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCICAgICAgIDB4ODg3NQorI2RlZmluZSBHTF9QUk9HUkFNX0ZPUk1BVF9BUkIgICAgICAgICAgICAgMHg4ODc2CisjZGVmaW5lIEdMX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAgICAgICAweDg4QTAKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAgIDB4ODhBMQorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9JTlNUUlVDVElPTlNfQVJCIDB4ODhBMgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfSU5TVFJVQ1RJT05TX0FSQiAweDg4QTMKKyNkZWZpbmUgR0xfUFJPR1JBTV9URU1QT1JBUklFU19BUkIgICAgICAgIDB4ODhBNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URU1QT1JBUklFU19BUkIgICAgMHg4OEE1CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAweDg4QTYKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAweDg4QTcKKyNkZWZpbmUgR0xfUFJPR1JBTV9QQVJBTUVURVJTX0FSQiAgICAgICAgIDB4ODhBOAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9QQVJBTUVURVJTX0FSQiAgICAgMHg4OEE5CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCICAweDg4QUEKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCIDB4ODhBQgorI2RlZmluZSBHTF9QUk9HUkFNX0FUVFJJQlNfQVJCICAgICAgICAgICAgMHg4OEFDCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0FUVFJJQlNfQVJCICAgICAgICAweDg4QUQKKyNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfQVRUUklCU19BUkIgICAgIDB4ODhBRQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQVRUUklCU19BUkIgMHg4OEFGCisjZGVmaW5lIEdMX1BST0dSQU1fQUREUkVTU19SRUdJU1RFUlNfQVJCICAweDg4QjAKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fQUREUkVTU19SRUdJU1RFUlNfQVJCIDB4ODhCMQorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgMHg4OEIyCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgMHg4OEIzCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0xPQ0FMX1BBUkFNRVRFUlNfQVJCIDB4ODhCNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIgMHg4OEI1CisjZGVmaW5lIEdMX1BST0dSQU1fVU5ERVJfTkFUSVZFX0xJTUlUU19BUkIgMHg4OEI2CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9DVVJSRU5UX01BVFJJWF9BUkIgICAweDg4QjcKKyNkZWZpbmUgR0xfTUFUUklYMF9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDMAorI2RlZmluZSBHTF9NQVRSSVgxX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEMxCisjZGVmaW5lIEdMX01BVFJJWDJfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzIKKyNkZWZpbmUgR0xfTUFUUklYM19BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDMworI2RlZmluZSBHTF9NQVRSSVg0X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM0CisjZGVmaW5lIEdMX01BVFJJWDVfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzUKKyNkZWZpbmUgR0xfTUFUUklYNl9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDNgorI2RlZmluZSBHTF9NQVRSSVg3X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM3CisjZGVmaW5lIEdMX01BVFJJWDhfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzgKKyNkZWZpbmUgR0xfTUFUUklYOV9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDOQorI2RlZmluZSBHTF9NQVRSSVgxMF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OENBCisjZGVmaW5lIEdMX01BVFJJWDExX0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0IKKyNkZWZpbmUgR0xfTUFUUklYMTJfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDQworI2RlZmluZSBHTF9NQVRSSVgxM19BUkIgICAgICAgICAgICAgICAgICAgMHg4OENECisjZGVmaW5lIEdMX01BVFJJWDE0X0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0UKKyNkZWZpbmUgR0xfTUFUUklYMTVfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDRgorI2RlZmluZSBHTF9NQVRSSVgxNl9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQwCisjZGVmaW5lIEdMX01BVFJJWDE3X0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDEKKyNkZWZpbmUgR0xfTUFUUklYMThfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEMgorI2RlZmluZSBHTF9NQVRSSVgxOV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQzCisjZGVmaW5lIEdMX01BVFJJWDIwX0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDQKKyNkZWZpbmUgR0xfTUFUUklYMjFfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhENQorI2RlZmluZSBHTF9NQVRSSVgyMl9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ2CisjZGVmaW5lIEdMX01BVFJJWDIzX0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDcKKyNkZWZpbmUgR0xfTUFUUklYMjRfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEOAorI2RlZmluZSBHTF9NQVRSSVgyNV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ5CisjZGVmaW5lIEdMX01BVFJJWDI2X0FSQiAgICAgICAgICAgICAgICAgICAweDg4REEKKyNkZWZpbmUgR0xfTUFUUklYMjdfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEQgorI2RlZmluZSBHTF9NQVRSSVgyOF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERDCisjZGVmaW5lIEdMX01BVFJJWDI5X0FSQiAgICAgICAgICAgICAgICAgICAweDg4REQKKyNkZWZpbmUgR0xfTUFUUklYMzBfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhERQorI2RlZmluZSBHTF9NQVRSSVgzMV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbQorI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiAgICAgICAgICAgMHg4ODA0CisjZGVmaW5lIEdMX1BST0dSQU1fQUxVX0lOU1RSVUNUSU9OU19BUkIgICAweDg4MDUKKyNkZWZpbmUgR0xfUFJPR1JBTV9URVhfSU5TVFJVQ1RJT05TX0FSQiAgIDB4ODgwNgorI2RlZmluZSBHTF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCICAgMHg4ODA3CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX0FMVV9JTlNUUlVDVElPTlNfQVJCIDB4ODgwOAorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9URVhfSU5TVFJVQ1RJT05TX0FSQiAweDg4MDkKKyNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkIgMHg4ODBBCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCIDB4ODgwQgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URVhfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEMKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYX0lORElSRUNUSU9OU19BUkIgMHg4ODBECisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFWF9JTlNUUlVDVElPTlNfQVJCIDB4ODgwRgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkIgMHg4ODEwCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0NPT1JEU19BUkIgICAgICAgICAweDg4NzEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICAgIDB4ODg3MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0JVRkZFUl9TSVpFX0FSQiAgICAgICAgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFX0FSQiAgICAgICAgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9BUlJBWV9CVUZGRVJfQVJCICAgICAgICAgICAgICAgMHg4ODkyCisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0FSQiAgICAgICAweDg4OTMKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICAgICAgIDB4ODg5NAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTUKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTYKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTcKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5OAorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODk5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5QQorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5QgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5QworI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODlECisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODlFCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5RgorI2RlZmluZSBHTF9SRUFEX09OTFlfQVJCICAgICAgICAgICAgICAgICAgMHg4OEI4CisjZGVmaW5lIEdMX1dSSVRFX09OTFlfQVJCICAgICAgICAgICAgICAgICAweDg4QjkKKyNkZWZpbmUgR0xfUkVBRF9XUklURV9BUkIgICAgICAgICAgICAgICAgIDB4ODhCQQorI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTX0FSQiAgICAgICAgICAgICAgMHg4OEJCCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBQRURfQVJCICAgICAgICAgICAgICAweDg4QkMKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9QT0lOVEVSX0FSQiAgICAgICAgIDB4ODhCRAorI2RlZmluZSBHTF9TVFJFQU1fRFJBV19BUkIgICAgICAgICAgICAgICAgMHg4OEUwCisjZGVmaW5lIEdMX1NUUkVBTV9SRUFEX0FSQiAgICAgICAgICAgICAgICAweDg4RTEKKyNkZWZpbmUgR0xfU1RSRUFNX0NPUFlfQVJCICAgICAgICAgICAgICAgIDB4ODhFMgorI2RlZmluZSBHTF9TVEFUSUNfRFJBV19BUkIgICAgICAgICAgICAgICAgMHg4OEU0CisjZGVmaW5lIEdMX1NUQVRJQ19SRUFEX0FSQiAgICAgICAgICAgICAgICAweDg4RTUKKyNkZWZpbmUgR0xfU1RBVElDX0NPUFlfQVJCICAgICAgICAgICAgICAgIDB4ODhFNgorI2RlZmluZSBHTF9EWU5BTUlDX0RSQVdfQVJCICAgICAgICAgICAgICAgMHg4OEU4CisjZGVmaW5lIEdMX0RZTkFNSUNfUkVBRF9BUkIgICAgICAgICAgICAgICAweDg4RTkKKyNkZWZpbmUgR0xfRFlOQU1JQ19DT1BZX0FSQiAgICAgICAgICAgICAgIDB4ODhFQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX29jY2x1c2lvbl9xdWVyeQorI2RlZmluZSBHTF9RVUVSWV9DT1VOVEVSX0JJVFNfQVJCICAgICAgICAgMHg4ODY0CisjZGVmaW5lIEdMX0NVUlJFTlRfUVVFUllfQVJCICAgICAgICAgICAgICAweDg4NjUKKyNkZWZpbmUgR0xfUVVFUllfUkVTVUxUX0FSQiAgICAgICAgICAgICAgIDB4ODg2NgorI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0FSQiAgICAgMHg4ODY3CisjZGVmaW5lIEdMX1NBTVBMRVNfUEFTU0VEX0FSQiAgICAgICAgICAgICAweDg5MTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworI2RlZmluZSBHTF9QUk9HUkFNX09CSkVDVF9BUkIgICAgICAgICAgICAgMHg4QjQwCisjZGVmaW5lIEdMX1NIQURFUl9PQkpFQ1RfQVJCICAgICAgICAgICAgICAweDhCNDgKKyNkZWZpbmUgR0xfT0JKRUNUX1RZUEVfQVJCICAgICAgICAgICAgICAgIDB4OEI0RQorI2RlZmluZSBHTF9PQkpFQ1RfU1VCVFlQRV9BUkIgICAgICAgICAgICAgMHg4QjRGCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzJfQVJCICAgICAgICAgICAgICAgICAweDhCNTAKKyNkZWZpbmUgR0xfRkxPQVRfVkVDM19BUkIgICAgICAgICAgICAgICAgIDB4OEI1MQorI2RlZmluZSBHTF9GTE9BVF9WRUM0X0FSQiAgICAgICAgICAgICAgICAgMHg4QjUyCisjZGVmaW5lIEdMX0lOVF9WRUMyX0FSQiAgICAgICAgICAgICAgICAgICAweDhCNTMKKyNkZWZpbmUgR0xfSU5UX1ZFQzNfQVJCICAgICAgICAgICAgICAgICAgIDB4OEI1NAorI2RlZmluZSBHTF9JTlRfVkVDNF9BUkIgICAgICAgICAgICAgICAgICAgMHg4QjU1CisjZGVmaW5lIEdMX0JPT0xfQVJCICAgICAgICAgICAgICAgICAgICAgICAweDhCNTYKKyNkZWZpbmUgR0xfQk9PTF9WRUMyX0FSQiAgICAgICAgICAgICAgICAgIDB4OEI1NworI2RlZmluZSBHTF9CT09MX1ZFQzNfQVJCICAgICAgICAgICAgICAgICAgMHg4QjU4CisjZGVmaW5lIEdMX0JPT0xfVkVDNF9BUkIgICAgICAgICAgICAgICAgICAweDhCNTkKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMl9BUkIgICAgICAgICAgICAgICAgIDB4OEI1QQorI2RlZmluZSBHTF9GTE9BVF9NQVQzX0FSQiAgICAgICAgICAgICAgICAgMHg4QjVCCisjZGVmaW5lIEdMX0ZMT0FUX01BVDRfQVJCICAgICAgICAgICAgICAgICAweDhCNUMKKyNkZWZpbmUgR0xfU0FNUExFUl8xRF9BUkIgICAgICAgICAgICAgICAgIDB4OEI1RAorI2RlZmluZSBHTF9TQU1QTEVSXzJEX0FSQiAgICAgICAgICAgICAgICAgMHg4QjVFCisjZGVmaW5lIEdMX1NBTVBMRVJfM0RfQVJCICAgICAgICAgICAgICAgICAweDhCNUYKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX0FSQiAgICAgICAgICAgICAgIDB4OEI2MAorI2RlZmluZSBHTF9TQU1QTEVSXzFEX1NIQURPV19BUkIgICAgICAgICAgMHg4QjYxCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfU0hBRE9XX0FSQiAgICAgICAgICAweDhCNjIKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9SRUNUX0FSQiAgICAgICAgICAgIDB4OEI2MworI2RlZmluZSBHTF9TQU1QTEVSXzJEX1JFQ1RfU0hBRE9XX0FSQiAgICAgMHg4QjY0CisjZGVmaW5lIEdMX09CSkVDVF9ERUxFVEVfU1RBVFVTX0FSQiAgICAgICAweDhCODAKKyNkZWZpbmUgR0xfT0JKRUNUX0NPTVBJTEVfU1RBVFVTX0FSQiAgICAgIDB4OEI4MQorI2RlZmluZSBHTF9PQkpFQ1RfTElOS19TVEFUVVNfQVJCICAgICAgICAgMHg4QjgyCisjZGVmaW5lIEdMX09CSkVDVF9WQUxJREFURV9TVEFUVVNfQVJCICAgICAweDhCODMKKyNkZWZpbmUgR0xfT0JKRUNUX0lORk9fTE9HX0xFTkdUSF9BUkIgICAgIDB4OEI4NAorI2RlZmluZSBHTF9PQkpFQ1RfQVRUQUNIRURfT0JKRUNUU19BUkIgICAgMHg4Qjg1CisjZGVmaW5lIEdMX09CSkVDVF9BQ1RJVkVfVU5JRk9STVNfQVJCICAgICAweDhCODYKKyNkZWZpbmUgR0xfT0JKRUNUX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEhfQVJCIDB4OEI4NworI2RlZmluZSBHTF9PQkpFQ1RfU0hBREVSX1NPVVJDRV9MRU5HVEhfQVJCIDB4OEI4OAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9zaGFkZXIKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9BUkIgICAgICAgICAgICAgIDB4OEIzMQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UU19BUkIgMHg4QjRBCisjZGVmaW5lIEdMX01BWF9WQVJZSU5HX0ZMT0FUU19BUkIgICAgICAgICAweDhCNEIKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAweDhCNEMKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCIDB4OEI0RAorI2RlZmluZSBHTF9PQkpFQ1RfQUNUSVZFX0FUVFJJQlVURVNfQVJCICAgMHg4Qjg5CisjZGVmaW5lIEdMX09CSkVDVF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEhfQVJCIDB4OEI4QQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfQVJCICAgICAgICAgICAgMHg4QjMwCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFNfQVJCIDB4OEI0OQorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UX0FSQiAweDhCOEIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzEwMAorI2RlZmluZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT05fQVJCICAgMHg4QjhDCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcG9pbnRfc3ByaXRlCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURV9BUkIgICAgICAgICAgICAgICAweDg4NjEKKyNkZWZpbmUgR0xfQ09PUkRfUkVQTEFDRV9BUkIgICAgICAgICAgICAgIDB4ODg2MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW1fc2hhZG93CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZHJhd19idWZmZXJzCisjZGVmaW5lIEdMX01BWF9EUkFXX0JVRkZFUlNfQVJCICAgICAgICAgICAweDg4MjQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIwX0FSQiAgICAgICAgICAgICAgIDB4ODgyNQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjFfQVJCICAgICAgICAgICAgICAgMHg4ODI2CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMl9BUkIgICAgICAgICAgICAgICAweDg4MjcKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIzX0FSQiAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjRfQVJCICAgICAgICAgICAgICAgMHg4ODI5CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNV9BUkIgICAgICAgICAgICAgICAweDg4MkEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI2X0FSQiAgICAgICAgICAgICAgIDB4ODgyQgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjdfQVJCICAgICAgICAgICAgICAgMHg4ODJDCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOF9BUkIgICAgICAgICAgICAgICAweDg4MkQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI5X0FSQiAgICAgICAgICAgICAgIDB4ODgyRQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEwX0FSQiAgICAgICAgICAgICAgMHg4ODJGCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTFfQVJCICAgICAgICAgICAgICAweDg4MzAKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMl9BUkIgICAgICAgICAgICAgIDB4ODgzMQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEzX0FSQiAgICAgICAgICAgICAgMHg4ODMyCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTRfQVJCICAgICAgICAgICAgICAweDg4MzMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNV9BUkIgICAgICAgICAgICAgIDB4ODgzNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfcmVjdGFuZ2xlCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQiAgICAgICAgICAweDg0RjUKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX1JFQ1RBTkdMRV9BUkIgIDB4ODRGNgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX1JFQ1RBTkdMRV9BUkIgICAgMHg4NEY3CisjZGVmaW5lIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFX0FSQiAweDg0RjgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb2xvcl9idWZmZXJfZmxvYXQKKyNkZWZpbmUgR0xfUkdCQV9GTE9BVF9NT0RFX0FSQiAgICAgICAgICAgIDB4ODgyMAorI2RlZmluZSBHTF9DTEFNUF9WRVJURVhfQ09MT1JfQVJCICAgICAgICAgMHg4OTFBCisjZGVmaW5lIEdMX0NMQU1QX0ZSQUdNRU5UX0NPTE9SX0FSQiAgICAgICAweDg5MUIKKyNkZWZpbmUgR0xfQ0xBTVBfUkVBRF9DT0xPUl9BUkIgICAgICAgICAgIDB4ODkxQworI2RlZmluZSBHTF9GSVhFRF9PTkxZX0FSQiAgICAgICAgICAgICAgICAgMHg4OTFECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaGFsZl9mbG9hdF9waXhlbAorI2RlZmluZSBHTF9IQUxGX0ZMT0FUX0FSQiAgICAgICAgICAgICAgICAgMHgxNDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9mbG9hdAorI2RlZmluZSBHTF9URVhUVVJFX1JFRF9UWVBFX0FSQiAgICAgICAgICAgMHg4QzEwCisjZGVmaW5lIEdMX1RFWFRVUkVfR1JFRU5fVFlQRV9BUkIgICAgICAgICAweDhDMTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9CTFVFX1RZUEVfQVJCICAgICAgICAgIDB4OEMxMgorI2RlZmluZSBHTF9URVhUVVJFX0FMUEhBX1RZUEVfQVJCICAgICAgICAgMHg4QzEzCisjZGVmaW5lIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1RZUEVfQVJCICAgICAweDhDMTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTlRFTlNJVFlfVFlQRV9BUkIgICAgIDB4OEMxNQorI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1RZUEVfQVJCICAgICAgICAgMHg4QzE2CisjZGVmaW5lIEdMX1VOU0lHTkVEX05PUk1BTElaRURfQVJCICAgICAgICAweDhDMTcKKyNkZWZpbmUgR0xfUkdCQTMyRl9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODgxNAorI2RlZmluZSBHTF9SR0IzMkZfQVJCICAgICAgICAgICAgICAgICAgICAgMHg4ODE1CisjZGVmaW5lIEdMX0FMUEhBMzJGX0FSQiAgICAgICAgICAgICAgICAgICAweDg4MTYKKyNkZWZpbmUgR0xfSU5URU5TSVRZMzJGX0FSQiAgICAgICAgICAgICAgIDB4ODgxNworI2RlZmluZSBHTF9MVU1JTkFOQ0UzMkZfQVJCICAgICAgICAgICAgICAgMHg4ODE4CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTMyRl9BUkIgICAgICAgICAweDg4MTkKKyNkZWZpbmUgR0xfUkdCQTE2Rl9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODgxQQorI2RlZmluZSBHTF9SR0IxNkZfQVJCICAgICAgICAgICAgICAgICAgICAgMHg4ODFCCisjZGVmaW5lIEdMX0FMUEhBMTZGX0FSQiAgICAgICAgICAgICAgICAgICAweDg4MUMKKyNkZWZpbmUgR0xfSU5URU5TSVRZMTZGX0FSQiAgICAgICAgICAgICAgIDB4ODgxRAorI2RlZmluZSBHTF9MVU1JTkFOQ0UxNkZfQVJCICAgICAgICAgICAgICAgMHg4ODFFCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTE2Rl9BUkIgICAgICAgICAweDg4MUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9waXhlbF9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0FSQiAgICAgICAgICAweDg4RUIKKyNkZWZpbmUgR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9BUkIgICAgICAgIDB4ODhFQworI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9CSU5ESU5HX0FSQiAgMHg4OEVECisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElOR19BUkIgMHg4OEVGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYWJncgorI2RlZmluZSBHTF9BQkdSX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfY29sb3IKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1JfRVhUICAgICAgICAgICAgIDB4ODAwMQorI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1JfRVhUICAgMHg4MDAyCisjZGVmaW5lIEdMX0NPTlNUQU5UX0FMUEhBX0VYVCAgICAgICAgICAgICAweDgwMDMKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBX0VYVCAgIDB4ODAwNAorI2RlZmluZSBHTF9CTEVORF9DT0xPUl9FWFQgICAgICAgICAgICAgICAgMHg4MDA1CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcG9seWdvbl9vZmZzZXQKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRVhUICAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1JfRVhUICAgICAgMHg4MDM4CisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0JJQVNfRVhUICAgICAgICAweDgwMzkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlCisjZGVmaW5lIEdMX0FMUEhBNF9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwM0IKKyNkZWZpbmUgR0xfQUxQSEE4X0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODAzQworI2RlZmluZSBHTF9BTFBIQTEyX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MDNECisjZGVmaW5lIEdMX0FMUEhBMTZfRVhUICAgICAgICAgICAgICAgICAgICAweDgwM0UKKyNkZWZpbmUgR0xfTFVNSU5BTkNFNF9FWFQgICAgICAgICAgICAgICAgIDB4ODAzRgorI2RlZmluZSBHTF9MVU1JTkFOQ0U4X0VYVCAgICAgICAgICAgICAgICAgMHg4MDQwCisjZGVmaW5lIEdMX0xVTUlOQU5DRTEyX0VYVCAgICAgICAgICAgICAgICAweDgwNDEKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZfRVhUICAgICAgICAgICAgICAgIDB4ODA0MgorI2RlZmluZSBHTF9MVU1JTkFOQ0U0X0FMUEhBNF9FWFQgICAgICAgICAgMHg4MDQzCisjZGVmaW5lIEdMX0xVTUlOQU5DRTZfQUxQSEEyX0VYVCAgICAgICAgICAweDgwNDQKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOF9BTFBIQThfRVhUICAgICAgICAgIDB4ODA0NQorI2RlZmluZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTRfRVhUICAgICAgICAgMHg4MDQ2CisjZGVmaW5lIEdMX0xVTUlOQU5DRTEyX0FMUEhBMTJfRVhUICAgICAgICAweDgwNDcKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZfQUxQSEExNl9FWFQgICAgICAgIDB4ODA0OAorI2RlZmluZSBHTF9JTlRFTlNJVFlfRVhUICAgICAgICAgICAgICAgICAgMHg4MDQ5CisjZGVmaW5lIEdMX0lOVEVOU0lUWTRfRVhUICAgICAgICAgICAgICAgICAweDgwNEEKKyNkZWZpbmUgR0xfSU5URU5TSVRZOF9FWFQgICAgICAgICAgICAgICAgIDB4ODA0QgorI2RlZmluZSBHTF9JTlRFTlNJVFkxMl9FWFQgICAgICAgICAgICAgICAgMHg4MDRDCisjZGVmaW5lIEdMX0lOVEVOU0lUWTE2X0VYVCAgICAgICAgICAgICAgICAweDgwNEQKKyNkZWZpbmUgR0xfUkdCMl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0RQorI2RlZmluZSBHTF9SR0I0X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDRGCisjZGVmaW5lIEdMX1JHQjVfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwNTAKKyNkZWZpbmUgR0xfUkdCOF9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MQorI2RlZmluZSBHTF9SR0IxMF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDUyCisjZGVmaW5lIEdMX1JHQjEyX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwNTMKKyNkZWZpbmUgR0xfUkdCMTZfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NAorI2RlZmluZSBHTF9SR0JBMl9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDU1CisjZGVmaW5lIEdMX1JHQkE0X0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwNTYKKyNkZWZpbmUgR0xfUkdCNV9BMV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODA1NworI2RlZmluZSBHTF9SR0JBOF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDU4CisjZGVmaW5lIEdMX1JHQjEwX0EyX0VYVCAgICAgICAgICAgICAgICAgICAweDgwNTkKKyNkZWZpbmUgR0xfUkdCQTEyX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODA1QQorI2RlZmluZSBHTF9SR0JBMTZfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4MDVCCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVEX1NJWkVfRVhUICAgICAgICAgICAweDgwNUMKKyNkZWZpbmUgR0xfVEVYVFVSRV9HUkVFTl9TSVpFX0VYVCAgICAgICAgIDB4ODA1RAorI2RlZmluZSBHTF9URVhUVVJFX0JMVUVfU0laRV9FWFQgICAgICAgICAgMHg4MDVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQUxQSEFfU0laRV9FWFQgICAgICAgICAweDgwNUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRV9FWFQgICAgIDB4ODA2MAorI2RlZmluZSBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFX0VYVCAgICAgMHg4MDYxCisjZGVmaW5lIEdMX1JFUExBQ0VfRVhUICAgICAgICAgICAgICAgICAgICAweDgwNjIKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8xRF9FWFQgICAgICAgICAgIDB4ODA2MworI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzJEX0VYVCAgICAgICAgICAgMHg4MDY0CisjZGVmaW5lIEdMX1RFWFRVUkVfVE9PX0xBUkdFX0VYVCAgICAgICAgICAweDgwNjUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlM0QKKyNkZWZpbmUgR0xfUEFDS19TS0lQX0lNQUdFU19FWFQgICAgICAgICAgIDB4ODA2QgorI2RlZmluZSBHTF9QQUNLX0lNQUdFX0hFSUdIVF9FWFQgICAgICAgICAgMHg4MDZDCisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX0lNQUdFU19FWFQgICAgICAgICAweDgwNkQKKyNkZWZpbmUgR0xfVU5QQUNLX0lNQUdFX0hFSUdIVF9FWFQgICAgICAgIDB4ODA2RQorI2RlZmluZSBHTF9URVhUVVJFXzNEX0VYVCAgICAgICAgICAgICAgICAgMHg4MDZGCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfM0RfRVhUICAgICAgICAgICAweDgwNzAKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9FWFQgICAgICAgICAgICAgIDB4ODA3MQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUl9FWFQgICAgICAgICAgICAgMHg4MDcyCisjZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkVfRVhUICAgICAgICAweDgwNzMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9maWx0ZXI0CisjZGVmaW5lIEdMX0ZJTFRFUjRfU0dJUyAgICAgICAgICAgICAgICAgICAweDgxNDYKKyNkZWZpbmUgR0xfVEVYVFVSRV9GSUxURVI0X1NJWkVfU0dJUyAgICAgIDB4ODE0NworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3N1YnRleHR1cmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb3B5X3RleHR1cmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9oaXN0b2dyYW0KKyNkZWZpbmUgR0xfSElTVE9HUkFNX0VYVCAgICAgICAgICAgICAgICAgIDB4ODAyNAorI2RlZmluZSBHTF9QUk9YWV9ISVNUT0dSQU1fRVhUICAgICAgICAgICAgMHg4MDI1CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9XSURUSF9FWFQgICAgICAgICAgICAweDgwMjYKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0ZPUk1BVF9FWFQgICAgICAgICAgIDB4ODAyNworI2RlZmluZSBHTF9ISVNUT0dSQU1fUkVEX1NJWkVfRVhUICAgICAgICAgMHg4MDI4CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9HUkVFTl9TSVpFX0VYVCAgICAgICAweDgwMjkKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0JMVUVfU0laRV9FWFQgICAgICAgIDB4ODAyQQorI2RlZmluZSBHTF9ISVNUT0dSQU1fQUxQSEFfU0laRV9FWFQgICAgICAgMHg4MDJCCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9MVU1JTkFOQ0VfU0laRV9FWFQgICAweDgwMkMKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1NJTktfRVhUICAgICAgICAgICAgIDB4ODAyRAorI2RlZmluZSBHTF9NSU5NQVhfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4MDJFCisjZGVmaW5lIEdMX01JTk1BWF9GT1JNQVRfRVhUICAgICAgICAgICAgICAweDgwMkYKKyNkZWZpbmUgR0xfTUlOTUFYX1NJTktfRVhUICAgICAgICAgICAgICAgIDB4ODAzMAorI2RlZmluZSBHTF9UQUJMRV9UT09fTEFSR0VfRVhUICAgICAgICAgICAgMHg4MDMxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29udm9sdXRpb24KKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMURfRVhUICAgICAgICAgICAgIDB4ODAxMAorI2RlZmluZSBHTF9DT05WT0xVVElPTl8yRF9FWFQgICAgICAgICAgICAgMHg4MDExCisjZGVmaW5lIEdMX1NFUEFSQUJMRV8yRF9FWFQgICAgICAgICAgICAgICAweDgwMTIKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREVfRVhUICAgIDB4ODAxMworI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfU0NBTEVfRVhUICAgMHg4MDE0CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9CSUFTX0VYVCAgICAweDgwMTUKKyNkZWZpbmUgR0xfUkVEVUNFX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODAxNgorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GT1JNQVRfRVhUICAgICAgICAgMHg4MDE3CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX1dJRFRIX0VYVCAgICAgICAgICAweDgwMTgKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fSEVJR0hUX0VYVCAgICAgICAgIDB4ODAxOQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fV0lEVEhfRVhUICAgICAgMHg4MDFBCisjZGVmaW5lIEdMX01BWF9DT05WT0xVVElPTl9IRUlHSFRfRVhUICAgICAweDgwMUIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfU0NBTEVfRVhUIDB4ODAxQworI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX1NDQUxFX0VYVCAweDgwMUQKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX1NDQUxFX0VYVCAweDgwMUUKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9TQ0FMRV9FWFQgMHg4MDFGCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX0JJQVNfRVhUICAweDgwMjAKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9CSUFTX0VYVCAweDgwMjEKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVNfRVhUIDB4ODAyMgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX0JJQVNfRVhUIDB4ODAyMworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJX2NvbG9yX21hdHJpeAorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVhfU0dJICAgICAgICAgICAgICAgMHg4MEIxCisjZGVmaW5lIEdMX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSF9TR0kgICAweDgwQjIKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSF9TR0kgMHg4MEIzCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9TQ0FMRV9TR0kgMHg4MEI0CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX1NDQUxFX1NHSSAweDgwQjUKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9TQ0FMRV9TR0kgMHg4MEI2CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX1NDQUxFX1NHSSAweDgwQjcKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX0JJQVNfU0dJIDB4ODBCOAorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9CSUFTX1NHSSAweDgwQjkKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9CSUFTX1NHSSAweDgwQkEKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfQklBU19TR0kgMHg4MEJCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lfY29sb3JfdGFibGUKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfU0dJICAgICAgICAgICAgICAgIDB4ODBEMAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFX1NHSSAweDgwRDEKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEVfU0dJIDB4ODBEMgorI2RlZmluZSBHTF9QUk9YWV9DT0xPUl9UQUJMRV9TR0kgICAgICAgICAgMHg4MEQzCisjZGVmaW5lIEdMX1BST1hZX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEVfU0dJIDB4ODBENAorI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRV9TR0kgMHg4MEQ1CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1NDQUxFX1NHSSAgICAgICAgICAweDgwRDYKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQklBU19TR0kgICAgICAgICAgIDB4ODBENworI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9GT1JNQVRfU0dJICAgICAgICAgMHg4MEQ4CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1dJRFRIX1NHSSAgICAgICAgICAweDgwRDkKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkVfU0dJICAgICAgIDB4ODBEQQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9HUkVFTl9TSVpFX1NHSSAgICAgMHg4MERCCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRV9TR0kgICAgICAweDgwREMKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRV9TR0kgICAgIDB4ODBERAorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRV9TR0kgMHg4MERFCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFX1NHSSAweDgwREYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcGl4ZWxfdGV4dHVyZQorI2RlZmluZSBHTF9QSVhFTF9URVhUVVJFX1NHSVMgICAgICAgICAgICAgMHg4MzUzCisjZGVmaW5lIEdMX1BJWEVMX0ZSQUdNRU5UX1JHQl9TT1VSQ0VfU0dJUyAweDgzNTQKKyNkZWZpbmUgR0xfUElYRUxfRlJBR01FTlRfQUxQSEFfU09VUkNFX1NHSVMgMHg4MzU1CisjZGVmaW5lIEdMX1BJWEVMX0dST1VQX0NPTE9SX1NHSVMgICAgICAgICAweDgzNTYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGV4dHVyZQorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX1NHSVggICAgICAgICAgICAgMHg4MTM5CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fTU9ERV9TR0lYICAgICAgICAweDgzMkIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZTRECisjZGVmaW5lIEdMX1BBQ0tfU0tJUF9WT0xVTUVTX1NHSVMgICAgICAgICAweDgxMzAKKyNkZWZpbmUgR0xfUEFDS19JTUFHRV9ERVBUSF9TR0lTICAgICAgICAgIDB4ODEzMQorI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9WT0xVTUVTX1NHSVMgICAgICAgMHg4MTMyCisjZGVmaW5lIEdMX1VOUEFDS19JTUFHRV9ERVBUSF9TR0lTICAgICAgICAweDgxMzMKKyNkZWZpbmUgR0xfVEVYVFVSRV80RF9TR0lTICAgICAgICAgICAgICAgIDB4ODEzNAorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzREX1NHSVMgICAgICAgICAgMHg4MTM1CisjZGVmaW5lIEdMX1RFWFRVUkVfNERTSVpFX1NHSVMgICAgICAgICAgICAweDgxMzYKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1FfU0dJUyAgICAgICAgICAgIDB4ODEzNworI2RlZmluZSBHTF9NQVhfNERfVEVYVFVSRV9TSVpFX1NHSVMgICAgICAgMHg4MTM4CisjZGVmaW5lIEdMX1RFWFRVUkVfNERfQklORElOR19TR0lTICAgICAgICAweDgxNEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV90ZXh0dXJlX2NvbG9yX3RhYmxlCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09MT1JfVEFCTEVfU0dJICAgICAgICAweDgwQkMKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9DT0xPUl9UQUJMRV9TR0kgIDB4ODBCRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NteWthCisjZGVmaW5lIEdMX0NNWUtfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwMEMKKyNkZWZpbmUgR0xfQ01ZS0FfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODAwRAorI2RlZmluZSBHTF9QQUNLX0NNWUtfSElOVF9FWFQgICAgICAgICAgICAgMHg4MDBFCisjZGVmaW5lIEdMX1VOUEFDS19DTVlLX0hJTlRfRVhUICAgICAgICAgICAweDgwMEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX29iamVjdAorI2RlZmluZSBHTF9URVhUVVJFX1BSSU9SSVRZX0VYVCAgICAgICAgICAgMHg4MDY2CisjZGVmaW5lIEdMX1RFWFRVUkVfUkVTSURFTlRfRVhUICAgICAgICAgICAweDgwNjcKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9CSU5ESU5HX0VYVCAgICAgICAgIDB4ODA2OAorI2RlZmluZSBHTF9URVhUVVJFXzJEX0JJTkRJTkdfRVhUICAgICAgICAgMHg4MDY5CisjZGVmaW5lIEdMX1RFWFRVUkVfM0RfQklORElOR19FWFQgICAgICAgICAweDgwNkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZGV0YWlsX3RleHR1cmUKKyNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfMkRfU0dJUyAgICAgICAgIDB4ODA5NQorI2RlZmluZSBHTF9ERVRBSUxfVEVYVFVSRV8yRF9CSU5ESU5HX1NHSVMgMHg4MDk2CisjZGVmaW5lIEdMX0xJTkVBUl9ERVRBSUxfU0dJUyAgICAgICAgICAgICAweDgwOTcKKyNkZWZpbmUgR0xfTElORUFSX0RFVEFJTF9BTFBIQV9TR0lTICAgICAgIDB4ODA5OAorI2RlZmluZSBHTF9MSU5FQVJfREVUQUlMX0NPTE9SX1NHSVMgICAgICAgMHg4MDk5CisjZGVmaW5lIEdMX0RFVEFJTF9URVhUVVJFX0xFVkVMX1NHSVMgICAgICAweDgwOUEKKyNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfTU9ERV9TR0lTICAgICAgIDB4ODA5QgorI2RlZmluZSBHTF9ERVRBSUxfVEVYVFVSRV9GVU5DX1BPSU5UU19TR0lTIDB4ODA5QworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19zaGFycGVuX3RleHR1cmUKKyNkZWZpbmUgR0xfTElORUFSX1NIQVJQRU5fU0dJUyAgICAgICAgICAgIDB4ODBBRAorI2RlZmluZSBHTF9MSU5FQVJfU0hBUlBFTl9BTFBIQV9TR0lTICAgICAgMHg4MEFFCisjZGVmaW5lIEdMX0xJTkVBUl9TSEFSUEVOX0NPTE9SX1NHSVMgICAgICAweDgwQUYKKyNkZWZpbmUgR0xfU0hBUlBFTl9URVhUVVJFX0ZVTkNfUE9JTlRTX1NHSVMgMHg4MEIwCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFja2VkX3BpeGVscworI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFXzNfM18yX0VYVCAgICAgICAgMHg4MDMyCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfRVhUICAgICAweDgwMzMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMV9FWFQgICAgIDB4ODAzNAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9FWFQgICAgICAgMHg4MDM1CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yX0VYVCAgICAweDgwMzYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9sb2QKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fTE9EX1NHSVMgICAgICAgICAgIDB4ODEzQQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9MT0RfU0dJUyAgICAgICAgICAgMHg4MTNCCisjZGVmaW5lIEdMX1RFWFRVUkVfQkFTRV9MRVZFTF9TR0lTICAgICAgICAweDgxM0MKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTEVWRUxfU0dJUyAgICAgICAgIDB4ODEzRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9TR0lTICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19NQVNLX1NHSVMgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORV9TR0lTICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19TR0lTICAgICAgICAgICAgICAgMHg4MEEwCisjZGVmaW5lIEdMXzFQQVNTX1NHSVMgICAgICAgICAgICAgICAgICAgICAweDgwQTEKKyNkZWZpbmUgR0xfMlBBU1NfMF9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBMgorI2RlZmluZSBHTF8yUEFTU18xX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEEzCisjZGVmaW5lIEdMXzRQQVNTXzBfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTQKKyNkZWZpbmUgR0xfNFBBU1NfMV9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBNQorI2RlZmluZSBHTF80UEFTU18yX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE2CisjZGVmaW5lIEdMXzRQQVNTXzNfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTcKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfU0dJUyAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLX1ZBTFVFX1NHSVMgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfSU5WRVJUX1NHSVMgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9TQU1QTEVfUEFUVEVSTl9TR0lTICAgICAgICAgICAgMHg4MEFDCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcmVzY2FsZV9ub3JtYWwKKyNkZWZpbmUgR0xfUkVTQ0FMRV9OT1JNQUxfRVhUICAgICAgICAgICAgIDB4ODAzQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9hcnJheQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfRVhUICAgICAgICAgICAgICAgMHg4MDc0CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9FWFQgICAgICAgICAgICAgICAweDgwNzUKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfRVhUICAgICAgICAgICAgICAgIDB4ODA3NgorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9FWFQgICAgICAgICAgICAgICAgMHg4MDc3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfRVhUICAgICAgICAweDgwNzgKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0VYVCAgICAgICAgICAgIDB4ODA3OQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU0laRV9FWFQgICAgICAgICAgMHg4MDdBCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9UWVBFX0VYVCAgICAgICAgICAweDgwN0IKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NUUklERV9FWFQgICAgICAgIDB4ODA3QworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQ09VTlRfRVhUICAgICAgICAgMHg4MDdECisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9UWVBFX0VYVCAgICAgICAgICAweDgwN0UKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1NUUklERV9FWFQgICAgICAgIDB4ODA3RgorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfQ09VTlRfRVhUICAgICAgICAgMHg4MDgwCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1NJWkVfRVhUICAgICAgICAgICAweDgwODEKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgIDB4ODA4MgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TVFJJREVfRVhUICAgICAgICAgMHg4MDgzCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgICAweDgwODQKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgIDB4ODA4NQorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9TVFJJREVfRVhUICAgICAgICAgMHg4MDg2CisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgICAweDgwODcKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFX0VYVCAgIDB4ODA4OAorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEVfRVhUICAgMHg4MDg5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFX0VYVCAweDgwOEEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9DT1VOVF9FWFQgIDB4ODA4QgorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFX0VYVCAgICAgMHg4MDhDCisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9DT1VOVF9FWFQgICAgICAweDgwOEQKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVJfRVhUICAgICAgIDB4ODA4RQorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAgMHg4MDhGCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1BPSU5URVJfRVhUICAgICAgICAweDgwOTAKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAgIDB4ODA5MQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVJfRVhUIDB4ODA5MgorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUl9FWFQgICAgMHg4MDkzCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbWlzY19hdHRyaWJ1dGUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwCisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9TR0lTICAgICAgICAgICAweDgxOTEKKyNkZWZpbmUgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlRfU0dJUyAgICAgIDB4ODE5MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jbGlwbWFwCisjZGVmaW5lIEdMX0xJTkVBUl9DTElQTUFQX0xJTkVBUl9TR0lYICAgICAweDgxNzAKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0NFTlRFUl9TR0lYICAgIDB4ODE3MQorI2RlZmluZSBHTF9URVhUVVJFX0NMSVBNQVBfRlJBTUVfU0dJWCAgICAgMHg4MTcyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9PRkZTRVRfU0dJWCAgICAweDgxNzMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAweDgxNzQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0xPRF9PRkZTRVRfU0dJWCAweDgxNzUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0RFUFRIX1NHSVggICAgIDB4ODE3NgorI2RlZmluZSBHTF9NQVhfQ0xJUE1BUF9ERVBUSF9TR0lYICAgICAgICAgMHg4MTc3CisjZGVmaW5lIEdMX01BWF9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAweDgxNzgKKyNkZWZpbmUgR0xfTkVBUkVTVF9DTElQTUFQX05FQVJFU1RfU0dJWCAgIDB4ODQ0RAorI2RlZmluZSBHTF9ORUFSRVNUX0NMSVBNQVBfTElORUFSX1NHSVggICAgMHg4NDRFCisjZGVmaW5lIEdMX0xJTkVBUl9DTElQTUFQX05FQVJFU1RfU0dJWCAgICAweDg0NEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc2hhZG93CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYICAgICAgICAgICAweDgxOUEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX09QRVJBVE9SX1NHSVggIDB4ODE5QgorI2RlZmluZSBHTF9URVhUVVJFX0xFUVVBTF9SX1NHSVggICAgICAgICAgMHg4MTlDCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VRVUFMX1JfU0dJWCAgICAgICAgICAweDgxOUQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9lZGdlX2NsYW1wCisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0VfU0dJUyAgICAgICAgICAgICAweDgxMkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9ib3JkZXJfY2xhbXAKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fQk9SREVSX1NHSVMgICAgICAgICAgIDB4ODEyRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX21pbm1heAorI2RlZmluZSBHTF9GVU5DX0FERF9FWFQgICAgICAgICAgICAgICAgICAgMHg4MDA2CisjZGVmaW5lIEdMX01JTl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgR0xfTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOAorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9FWFQgICAgICAgICAgICAgMHg4MDA5CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfc3VidHJhY3QKKyNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVF9FWFQgICAgICAgICAgICAgIDB4ODAwQQorI2RlZmluZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1RfRVhUICAgICAgMHg4MDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfbG9naWNfb3AKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW50ZXJsYWNlCisjZGVmaW5lIEdMX0lOVEVSTEFDRV9TR0lYICAgICAgICAgICAgICAgICAweDgwOTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGlsZXMKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9CRVNUX0FMSUdOTUVOVF9TR0lYIDB4ODEzRQorI2RlZmluZSBHTF9QSVhFTF9USUxFX0NBQ0hFX0lOQ1JFTUVOVF9TR0lYIDB4ODEzRgorI2RlZmluZSBHTF9QSVhFTF9USUxFX1dJRFRIX1NHSVggICAgICAgICAgMHg4MTQwCisjZGVmaW5lIEdMX1BJWEVMX1RJTEVfSEVJR0hUX1NHSVggICAgICAgICAweDgxNDEKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9HUklEX1dJRFRIX1NHSVggICAgIDB4ODE0MgorI2RlZmluZSBHTF9QSVhFTF9USUxFX0dSSURfSEVJR0hUX1NHSVggICAgMHg4MTQzCisjZGVmaW5lIEdMX1BJWEVMX1RJTEVfR1JJRF9ERVBUSF9TR0lYICAgICAweDgxNDQKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9DQUNIRV9TSVpFX1NHSVggICAgIDB4ODE0NQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX3NlbGVjdAorI2RlZmluZSBHTF9EVUFMX0FMUEhBNF9TR0lTICAgICAgICAgICAgICAgMHg4MTEwCisjZGVmaW5lIEdMX0RVQUxfQUxQSEE4X1NHSVMgICAgICAgICAgICAgICAweDgxMTEKKyNkZWZpbmUgR0xfRFVBTF9BTFBIQTEyX1NHSVMgICAgICAgICAgICAgIDB4ODExMgorI2RlZmluZSBHTF9EVUFMX0FMUEhBMTZfU0dJUyAgICAgICAgICAgICAgMHg4MTEzCisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFNF9TR0lTICAgICAgICAgICAweDgxMTQKKyNkZWZpbmUgR0xfRFVBTF9MVU1JTkFOQ0U4X1NHSVMgICAgICAgICAgIDB4ODExNQorI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRTEyX1NHSVMgICAgICAgICAgMHg4MTE2CisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFMTZfU0dJUyAgICAgICAgICAweDgxMTcKKyNkZWZpbmUgR0xfRFVBTF9JTlRFTlNJVFk0X1NHSVMgICAgICAgICAgIDB4ODExOAorI2RlZmluZSBHTF9EVUFMX0lOVEVOU0lUWThfU0dJUyAgICAgICAgICAgMHg4MTE5CisjZGVmaW5lIEdMX0RVQUxfSU5URU5TSVRZMTJfU0dJUyAgICAgICAgICAweDgxMUEKKyNkZWZpbmUgR0xfRFVBTF9JTlRFTlNJVFkxNl9TR0lTICAgICAgICAgIDB4ODExQgorI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRV9BTFBIQTRfU0dJUyAgICAgMHg4MTFDCisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFX0FMUEhBOF9TR0lTICAgICAweDgxMUQKKyNkZWZpbmUgR0xfUVVBRF9BTFBIQTRfU0dJUyAgICAgICAgICAgICAgIDB4ODExRQorI2RlZmluZSBHTF9RVUFEX0FMUEhBOF9TR0lTICAgICAgICAgICAgICAgMHg4MTFGCisjZGVmaW5lIEdMX1FVQURfTFVNSU5BTkNFNF9TR0lTICAgICAgICAgICAweDgxMjAKKyNkZWZpbmUgR0xfUVVBRF9MVU1JTkFOQ0U4X1NHSVMgICAgICAgICAgIDB4ODEyMQorI2RlZmluZSBHTF9RVUFEX0lOVEVOU0lUWTRfU0dJUyAgICAgICAgICAgMHg4MTIyCisjZGVmaW5lIEdMX1FVQURfSU5URU5TSVRZOF9TR0lTICAgICAgICAgICAweDgxMjMKKyNkZWZpbmUgR0xfRFVBTF9URVhUVVJFX1NFTEVDVF9TR0lTICAgICAgIDB4ODEyNAorI2RlZmluZSBHTF9RVUFEX1RFWFRVUkVfU0VMRUNUX1NHSVMgICAgICAgMHg4MTI1CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3Nwcml0ZQorI2RlZmluZSBHTF9TUFJJVEVfU0dJWCAgICAgICAgICAgICAgICAgICAgMHg4MTQ4CisjZGVmaW5lIEdMX1NQUklURV9NT0RFX1NHSVggICAgICAgICAgICAgICAweDgxNDkKKyNkZWZpbmUgR0xfU1BSSVRFX0FYSVNfU0dJWCAgICAgICAgICAgICAgIDB4ODE0QQorI2RlZmluZSBHTF9TUFJJVEVfVFJBTlNMQVRJT05fU0dJWCAgICAgICAgMHg4MTRCCisjZGVmaW5lIEdMX1NQUklURV9BWElBTF9TR0lYICAgICAgICAgICAgICAweDgxNEMKKyNkZWZpbmUgR0xfU1BSSVRFX09CSkVDVF9BTElHTkVEX1NHSVggICAgIDB4ODE0RAorI2RlZmluZSBHTF9TUFJJVEVfRVlFX0FMSUdORURfU0dJWCAgICAgICAgMHg4MTRFCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfbXVsdGlfYnVmZmVyCisjZGVmaW5lIEdMX1RFWFRVUkVfTVVMVElfQlVGRkVSX0hJTlRfU0dJWCAweDgxMkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUlOX0VYVCAgICAgICAgICAgICAweDgxMjYKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9NQVhfRVhUICAgICAgICAgICAgIDB4ODEyNworI2RlZmluZSBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFX0VYVCAgMHg4MTI4CisjZGVmaW5lIEdMX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0VYVCAgICAgICAweDgxMjkKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTl9TR0lTICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYX1NHSVMgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRV9TR0lTIDB4ODEyOAorI2RlZmluZSBHTF9ESVNUQU5DRV9BVFRFTlVBVElPTl9TR0lTICAgICAgMHg4MTI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2luc3RydW1lbnRzCisjZGVmaW5lIEdMX0lOU1RSVU1FTlRfQlVGRkVSX1BPSU5URVJfU0dJWCAweDgxODAKKyNkZWZpbmUgR0xfSU5TVFJVTUVOVF9NRUFTVVJFTUVOVFNfU0dJWCAgIDB4ODE4MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX3NjYWxlX2JpYXMKKyNkZWZpbmUgR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9CSUFTX1NHSVggIDB4ODE3OQorI2RlZmluZSBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1NHSVggMHg4MTdBCisjZGVmaW5lIEdMX1BPU1RfVEVYVFVSRV9GSUxURVJfQklBU19SQU5HRV9TR0lYIDB4ODE3QgorI2RlZmluZSBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1JBTkdFX1NHSVggMHg4MTdDCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZyYW1lem9vbQorI2RlZmluZSBHTF9GUkFNRVpPT01fU0dJWCAgICAgICAgICAgICAgICAgMHg4MThCCisjZGVmaW5lIEdMX0ZSQU1FWk9PTV9GQUNUT1JfU0dJWCAgICAgICAgICAweDgxOEMKKyNkZWZpbmUgR0xfTUFYX0ZSQU1FWk9PTV9GQUNUT1JfU0dJWCAgICAgIDB4ODE4RAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90YWdfc2FtcGxlX2J1ZmZlcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRmZkTWFza1NHSVgKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERUZPUk1BVElPTl9CSVRfU0dJWCAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfR0VPTUVUUllfREVGT1JNQVRJT05fQklUX1NHSVggIDB4MDAwMDAwMDIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcG9seW5vbWlhbF9mZmQKKyNkZWZpbmUgR0xfR0VPTUVUUllfREVGT1JNQVRJT05fU0dJWCAgICAgIDB4ODE5NAorI2RlZmluZSBHTF9URVhUVVJFX0RFRk9STUFUSU9OX1NHSVggICAgICAgMHg4MTk1CisjZGVmaW5lIEdMX0RFRk9STUFUSU9OU19NQVNLX1NHSVggICAgICAgICAweDgxOTYKKyNkZWZpbmUgR0xfTUFYX0RFRk9STUFUSU9OX09SREVSX1NHSVggICAgIDB4ODE5NworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9yZWZlcmVuY2VfcGxhbmUKKyNkZWZpbmUgR0xfUkVGRVJFTkNFX1BMQU5FX1NHSVggICAgICAgICAgIDB4ODE3RAorI2RlZmluZSBHTF9SRUZFUkVOQ0VfUExBTkVfRVFVQVRJT05fU0dJWCAgMHg4MTdFCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZsdXNoX3Jhc3RlcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9kZXB0aF90ZXh0dXJlCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2X1NHSVggICAgICAgICAweDgxQTUKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjRfU0dJWCAgICAgICAgIDB4ODFBNgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMl9TR0lYICAgICAgICAgMHg4MUE3CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX2ZvZ19mdW5jdGlvbgorI2RlZmluZSBHTF9GT0dfRlVOQ19TR0lTICAgICAgICAgICAgICAgICAgMHg4MTJBCisjZGVmaW5lIEdMX0ZPR19GVU5DX1BPSU5UU19TR0lTICAgICAgICAgICAweDgxMkIKKyNkZWZpbmUgR0xfTUFYX0ZPR19GVU5DX1BPSU5UU19TR0lTICAgICAgIDB4ODEyQworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mb2dfb2Zmc2V0CisjZGVmaW5lIEdMX0ZPR19PRkZTRVRfU0dJWCAgICAgICAgICAgICAgICAweDgxOTgKKyNkZWZpbmUgR0xfRk9HX09GRlNFVF9WQUxVRV9TR0lYICAgICAgICAgIDB4ODE5OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfaW1hZ2VfdHJhbnNmb3JtCisjZGVmaW5lIEdMX0lNQUdFX1NDQUxFX1hfSFAgICAgICAgICAgICAgICAweDgxNTUKKyNkZWZpbmUgR0xfSU1BR0VfU0NBTEVfWV9IUCAgICAgICAgICAgICAgIDB4ODE1NgorI2RlZmluZSBHTF9JTUFHRV9UUkFOU0xBVEVfWF9IUCAgICAgICAgICAgMHg4MTU3CisjZGVmaW5lIEdMX0lNQUdFX1RSQU5TTEFURV9ZX0hQICAgICAgICAgICAweDgxNTgKKyNkZWZpbmUgR0xfSU1BR0VfUk9UQVRFX0FOR0xFX0hQICAgICAgICAgIDB4ODE1OQorI2RlZmluZSBHTF9JTUFHRV9ST1RBVEVfT1JJR0lOX1hfSFAgICAgICAgMHg4MTVBCisjZGVmaW5lIEdMX0lNQUdFX1JPVEFURV9PUklHSU5fWV9IUCAgICAgICAweDgxNUIKKyNkZWZpbmUgR0xfSU1BR0VfTUFHX0ZJTFRFUl9IUCAgICAgICAgICAgIDB4ODE1QworI2RlZmluZSBHTF9JTUFHRV9NSU5fRklMVEVSX0hQICAgICAgICAgICAgMHg4MTVECisjZGVmaW5lIEdMX0lNQUdFX0NVQklDX1dFSUdIVF9IUCAgICAgICAgICAweDgxNUUKKyNkZWZpbmUgR0xfQ1VCSUNfSFAgICAgICAgICAgICAgICAgICAgICAgIDB4ODE1RgorI2RlZmluZSBHTF9BVkVSQUdFX0hQICAgICAgICAgICAgICAgICAgICAgMHg4MTYwCisjZGVmaW5lIEdMX0lNQUdFX1RSQU5TRk9STV8yRF9IUCAgICAgICAgICAweDgxNjEKKyNkZWZpbmUgR0xfUE9TVF9JTUFHRV9UUkFOU0ZPUk1fQ09MT1JfVEFCTEVfSFAgMHg4MTYyCisjZGVmaW5lIEdMX1BST1hZX1BPU1RfSU1BR0VfVFJBTlNGT1JNX0NPTE9SX1RBQkxFX0hQIDB4ODE2MworI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfY29udm9sdXRpb25fYm9yZGVyX21vZGVzCisjZGVmaW5lIEdMX0lHTk9SRV9CT1JERVJfSFAgICAgICAgICAgICAgICAweDgxNTAKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQk9SREVSX0hQICAgICAgICAgICAgIDB4ODE1MQorI2RlZmluZSBHTF9SRVBMSUNBVEVfQk9SREVSX0hQICAgICAgICAgICAgMHg4MTUzCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUl9IUCAgICAweDgxNTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOR1JfcGFsZXR0ZV9idWZmZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9hZGRfZW52CisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0JJQVNfU0dJWCAgICAgICAgICAweDgwQkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb2xvcl9zdWJ0YWJsZQorI2VuZGlmCisKKyNpZm5kZWYgR0xfUEdJX3ZlcnRleF9oaW50cworI2RlZmluZSBHTF9WRVJURVhfREFUQV9ISU5UX1BHSSAgICAgICAgICAgMHgxQTIyQQorI2RlZmluZSBHTF9WRVJURVhfQ09OU0lTVEVOVF9ISU5UX1BHSSAgICAgMHgxQTIyQgorI2RlZmluZSBHTF9NQVRFUklBTF9TSURFX0hJTlRfUEdJICAgICAgICAgMHgxQTIyQworI2RlZmluZSBHTF9NQVhfVkVSVEVYX0hJTlRfUEdJICAgICAgICAgICAgMHgxQTIyRAorI2RlZmluZSBHTF9DT0xPUjNfQklUX1BHSSAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBHTF9DT0xPUjRfQklUX1BHSSAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBHTF9FREdFRkxBR19CSVRfUEdJICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBHTF9JTkRFWF9CSVRfUEdJICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBHTF9NQVRfQU1CSUVOVF9CSVRfUEdJICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBHTF9NQVRfQU1CSUVOVF9BTkRfRElGRlVTRV9CSVRfUEdJIDB4MDAyMDAwMDAKKyNkZWZpbmUgR0xfTUFUX0RJRkZVU0VfQklUX1BHSSAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgR0xfTUFUX0VNSVNTSU9OX0JJVF9QR0kgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgR0xfTUFUX0NPTE9SX0lOREVYRVNfQklUX1BHSSAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgR0xfTUFUX1NISU5JTkVTU19CSVRfUEdJICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgR0xfTUFUX1NQRUNVTEFSX0JJVF9QR0kgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgR0xfTk9STUFMX0JJVF9QR0kgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQxX0JJVF9QR0kgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQyX0JJVF9QR0kgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQzX0JJVF9QR0kgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQ0X0JJVF9QR0kgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgR0xfVkVSVEVYMjNfQklUX1BHSSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfVkVSVEVYNF9CSVRfUEdJICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorCisjaWZuZGVmIEdMX1BHSV9taXNjX2hpbnRzCisjZGVmaW5lIEdMX1BSRUZFUl9ET1VCTEVCVUZGRVJfSElOVF9QR0kgICAweDFBMUY4CisjZGVmaW5lIEdMX0NPTlNFUlZFX01FTU9SWV9ISU5UX1BHSSAgICAgICAweDFBMUZECisjZGVmaW5lIEdMX1JFQ0xBSU1fTUVNT1JZX0hJTlRfUEdJICAgICAgICAweDFBMUZFCisjZGVmaW5lIEdMX05BVElWRV9HUkFQSElDU19IQU5ETEVfUEdJICAgICAweDFBMjAyCisjZGVmaW5lIEdMX05BVElWRV9HUkFQSElDU19CRUdJTl9ISU5UX1BHSSAweDFBMjAzCisjZGVmaW5lIEdMX05BVElWRV9HUkFQSElDU19FTkRfSElOVF9QR0kgICAweDFBMjA0CisjZGVmaW5lIEdMX0FMV0FZU19GQVNUX0hJTlRfUEdJICAgICAgICAgICAweDFBMjBDCisjZGVmaW5lIEdMX0FMV0FZU19TT0ZUX0hJTlRfUEdJICAgICAgICAgICAweDFBMjBECisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfT0JKX0hJTlRfUEdJICAgICAgICAweDFBMjBFCisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfV0lOX0hJTlRfUEdJICAgICAgICAweDFBMjBGCisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfRlJHX0hJTlRfUEdJICAgICAgICAweDFBMjEwCisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfTUVNX0hJTlRfUEdJICAgICAgICAweDFBMjExCisjZGVmaW5lIEdMX1NUUklDVF9ERVBUSEZVTkNfSElOVF9QR0kgICAgICAweDFBMjE2CisjZGVmaW5lIEdMX1NUUklDVF9MSUdIVElOR19ISU5UX1BHSSAgICAgICAweDFBMjE3CisjZGVmaW5lIEdMX1NUUklDVF9TQ0lTU09SX0hJTlRfUEdJICAgICAgICAweDFBMjE4CisjZGVmaW5lIEdMX0ZVTExfU1RJUFBMRV9ISU5UX1BHSSAgICAgICAgICAweDFBMjE5CisjZGVmaW5lIEdMX0NMSVBfTkVBUl9ISU5UX1BHSSAgICAgICAgICAgICAweDFBMjIwCisjZGVmaW5lIEdMX0NMSVBfRkFSX0hJTlRfUEdJICAgICAgICAgICAgICAweDFBMjIxCisjZGVmaW5lIEdMX1dJREVfTElORV9ISU5UX1BHSSAgICAgICAgICAgICAweDFBMjIyCisjZGVmaW5lIEdMX0JBQ0tfTk9STUFMU19ISU5UX1BHSSAgICAgICAgICAweDFBMjIzCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9DT0xPUl9JTkRFWDFfRVhUICAgICAgICAgICAgICAgMHg4MEUyCisjZGVmaW5lIEdMX0NPTE9SX0lOREVYMl9FWFQgICAgICAgICAgICAgICAweDgwRTMKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVg0X0VYVCAgICAgICAgICAgICAgIDB4ODBFNAorI2RlZmluZSBHTF9DT0xPUl9JTkRFWDhfRVhUICAgICAgICAgICAgICAgMHg4MEU1CisjZGVmaW5lIEdMX0NPTE9SX0lOREVYMTJfRVhUICAgICAgICAgICAgICAweDgwRTYKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVgxNl9FWFQgICAgICAgICAgICAgIDB4ODBFNworI2RlZmluZSBHTF9URVhUVVJFX0lOREVYX1NJWkVfRVhUICAgICAgICAgMHg4MEVECisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY2xpcF92b2x1bWVfaGludAorI2RlZmluZSBHTF9DTElQX1ZPTFVNRV9DTElQUElOR19ISU5UX0VYVCAgMHg4MEYwCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2xpc3RfcHJpb3JpdHkKKyNkZWZpbmUgR0xfTElTVF9QUklPUklUWV9TR0lYICAgICAgICAgICAgIDB4ODE4MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9pcl9pbnN0cnVtZW50MQorI2RlZmluZSBHTF9JUl9JTlNUUlVNRU5UMV9TR0lYICAgICAgICAgICAgMHg4MTdGCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2NhbGxpZ3JhcGhpY19mcmFnbWVudAorI2RlZmluZSBHTF9DQUxMSUdSQVBISUNfRlJBR01FTlRfU0dJWCAgICAgMHg4MTgzCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfbG9kX2JpYXMKKyNkZWZpbmUgR0xfVEVYVFVSRV9MT0RfQklBU19TX1NHSVggICAgICAgIDB4ODE4RQorI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTX1RfU0dJWCAgICAgICAgMHg4MThGCisjZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVNfUl9TR0lYICAgICAgICAweDgxOTAKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc2hhZG93X2FtYmllbnQKKyNkZWZpbmUgR0xfU0hBRE9XX0FNQklFTlRfU0dJWCAgICAgICAgICAgIDB4ODBCRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X3RleHR1cmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9tYXRlcmlhbAorI2RlZmluZSBHTF9JTkRFWF9NQVRFUklBTF9FWFQgICAgICAgICAgICAgMHg4MUI4CisjZGVmaW5lIEdMX0lOREVYX01BVEVSSUFMX1BBUkFNRVRFUl9FWFQgICAweDgxQjkKKyNkZWZpbmUgR0xfSU5ERVhfTUFURVJJQUxfRkFDRV9FWFQgICAgICAgIDB4ODFCQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X2Z1bmMKKyNkZWZpbmUgR0xfSU5ERVhfVEVTVF9FWFQgICAgICAgICAgICAgICAgIDB4ODFCNQorI2RlZmluZSBHTF9JTkRFWF9URVNUX0ZVTkNfRVhUICAgICAgICAgICAgMHg4MUI2CisjZGVmaW5lIEdMX0lOREVYX1RFU1RfUkVGX0VYVCAgICAgICAgICAgICAweDgxQjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9hcnJheV9mb3JtYXRzCisjZGVmaW5lIEdMX0lVSV9WMkZfRVhUICAgICAgICAgICAgICAgICAgICAweDgxQUQKKyNkZWZpbmUgR0xfSVVJX1YzRl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODFBRQorI2RlZmluZSBHTF9JVUlfTjNGX1YyRl9FWFQgICAgICAgICAgICAgICAgMHg4MUFGCisjZGVmaW5lIEdMX0lVSV9OM0ZfVjNGX0VYVCAgICAgICAgICAgICAgICAweDgxQjAKKyNkZWZpbmUgR0xfVDJGX0lVSV9WMkZfRVhUICAgICAgICAgICAgICAgIDB4ODFCMQorI2RlZmluZSBHTF9UMkZfSVVJX1YzRl9FWFQgICAgICAgICAgICAgICAgMHg4MUIyCisjZGVmaW5lIEdMX1QyRl9JVUlfTjNGX1YyRl9FWFQgICAgICAgICAgICAweDgxQjMKKyNkZWZpbmUgR0xfVDJGX0lVSV9OM0ZfVjNGX0VYVCAgICAgICAgICAgIDB4ODFCNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvbXBpbGVkX3ZlcnRleF9hcnJheQorI2RlZmluZSBHTF9BUlJBWV9FTEVNRU5UX0xPQ0tfRklSU1RfRVhUICAgMHg4MUE4CisjZGVmaW5lIEdMX0FSUkFZX0VMRU1FTlRfTE9DS19DT1VOVF9FWFQgICAweDgxQTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jdWxsX3ZlcnRleAorI2RlZmluZSBHTF9DVUxMX1ZFUlRFWF9FWFQgICAgICAgICAgICAgICAgMHg4MUFBCisjZGVmaW5lIEdMX0NVTExfVkVSVEVYX0VZRV9QT1NJVElPTl9FWFQgICAweDgxQUIKKyNkZWZpbmUgR0xfQ1VMTF9WRVJURVhfT0JKRUNUX1BPU0lUSU9OX0VYVCAweDgxQUMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2IKKyNkZWZpbmUgR0xfWUNSQ0JfNDIyX1NHSVggICAgICAgICAgICAgICAgIDB4ODFCQgorI2RlZmluZSBHTF9ZQ1JDQl80NDRfU0dJWCAgICAgICAgICAgICAgICAgMHg4MUJDCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZyYWdtZW50X2xpZ2h0aW5nCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUSU5HX1NHSVggICAgICAgICAweDg0MDAKKyNkZWZpbmUgR0xfRlJBR01FTlRfQ09MT1JfTUFURVJJQUxfU0dJWCAgIDB4ODQwMQorI2RlZmluZSBHTF9GUkFHTUVOVF9DT0xPUl9NQVRFUklBTF9GQUNFX1NHSVggMHg4NDAyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0NPTE9SX01BVEVSSUFMX1BBUkFNRVRFUl9TR0lYIDB4ODQwMworI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfTElHSFRTX1NHSVggICAgICAgMHg4NDA0CisjZGVmaW5lIEdMX01BWF9BQ1RJVkVfTElHSFRTX1NHSVggICAgICAgICAweDg0MDUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9SQVNURVJfTk9STUFMX1NHSVggICAgIDB4ODQwNgorI2RlZmluZSBHTF9MSUdIVF9FTlZfTU9ERV9TR0lYICAgICAgICAgICAgMHg4NDA3CisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUl9TR0lYIDB4ODQwOAorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9UV09fU0lERV9TR0lYIDB4ODQwOQorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9BTUJJRU5UX1NHSVggMHg4NDBBCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUX01PREVMX05PUk1BTF9JTlRFUlBPTEFUSU9OX1NHSVggMHg4NDBCCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUMF9TR0lYICAgICAgICAgICAweDg0MEMKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQxX1NHSVggICAgICAgICAgIDB4ODQwRAorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDJfU0dJWCAgICAgICAgICAgMHg4NDBFCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUM19TR0lYICAgICAgICAgICAweDg0MEYKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQ0X1NHSVggICAgICAgICAgIDB4ODQxMAorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDVfU0dJWCAgICAgICAgICAgMHg4NDExCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUNl9TR0lYICAgICAgICAgICAweDg0MTIKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQ3X1NHSVggICAgICAgICAgIDB4ODQxMworI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX3Jhc3RlcnBvc19jbGlwCisjZGVmaW5lIEdMX1JBU1RFUl9QT1NJVElPTl9VTkNMSVBQRURfSUJNICAweDE5MjYyCisjZW5kaWYKKworI2lmbmRlZiBHTF9IUF90ZXh0dXJlX2xpZ2h0aW5nCisjZGVmaW5lIEdMX1RFWFRVUkVfTElHSFRJTkdfTU9ERV9IUCAgICAgICAweDgxNjcKKyNkZWZpbmUgR0xfVEVYVFVSRV9QT1NUX1NQRUNVTEFSX0hQICAgICAgIDB4ODE2OAorI2RlZmluZSBHTF9URVhUVVJFX1BSRV9TUEVDVUxBUl9IUCAgICAgICAgMHg4MTY5CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19yYW5nZV9lbGVtZW50cworI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVNfRVhUICAgICAgMHg4MEU4CisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTX0VYVCAgICAgICAweDgwRTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX1dJTl9waG9uZ19zaGFkaW5nCisjZGVmaW5lIEdMX1BIT05HX1dJTiAgICAgICAgICAgICAgICAgICAgICAweDgwRUEKKyNkZWZpbmUgR0xfUEhPTkdfSElOVF9XSU4gICAgICAgICAgICAgICAgIDB4ODBFQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfV0lOX3NwZWN1bGFyX2ZvZworI2RlZmluZSBHTF9GT0dfU1BFQ1VMQVJfVEVYVFVSRV9XSU4gICAgICAgMHg4MEVDCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbGlnaHRfdGV4dHVyZQorI2RlZmluZSBHTF9GUkFHTUVOVF9NQVRFUklBTF9FWFQgICAgICAgICAgMHg4MzQ5CisjZGVmaW5lIEdMX0ZSQUdNRU5UX05PUk1BTF9FWFQgICAgICAgICAgICAweDgzNEEKKyNkZWZpbmUgR0xfRlJBR01FTlRfQ09MT1JfRVhUICAgICAgICAgICAgIDB4ODM0QworI2RlZmluZSBHTF9BVFRFTlVBVElPTl9FWFQgICAgICAgICAgICAgICAgMHg4MzRECisjZGVmaW5lIEdMX1NIQURPV19BVFRFTlVBVElPTl9FWFQgICAgICAgICAweDgzNEUKKyNkZWZpbmUgR0xfVEVYVFVSRV9BUFBMSUNBVElPTl9NT0RFX0VYVCAgIDB4ODM0RgorI2RlZmluZSBHTF9URVhUVVJFX0xJR0hUX0VYVCAgICAgICAgICAgICAgMHg4MzUwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFURVJJQUxfRkFDRV9FWFQgICAgICAweDgzNTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVRFUklBTF9QQVJBTUVURVJfRVhUIDB4ODM1MgorLyogcmV1c2UgR0xfRlJBR01FTlRfREVQVEhfRVhUICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2JsZW5kX2FscGhhX21pbm1heAorI2RlZmluZSBHTF9BTFBIQV9NSU5fU0dJWCAgICAgICAgICAgICAgICAgMHg4MzIwCisjZGVmaW5lIEdMX0FMUEhBX01BWF9TR0lYICAgICAgICAgICAgICAgICAweDgzMjEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW1wYWN0X3BpeGVsX3RleHR1cmUKKyNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9RX0NFSUxJTkdfU0dJWCAgIDB4ODE4NAorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX1FfUk9VTkRfU0dJWCAgICAgMHg4MTg1CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fUV9GTE9PUl9TR0lYICAgICAweDgxODYKKyNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9BTFBIQV9SRVBMQUNFX1NHSVggMHg4MTg3CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fQUxQSEFfTk9fUkVQTEFDRV9TR0lYIDB4ODE4OAorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX0FMUEhBX0xTX1NHSVggICAgMHg4MTg5CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fQUxQSEFfTVNfU0dJWCAgICAweDgxOEEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9iZ3JhCisjZGVmaW5lIEdMX0JHUl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTAKKyNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9hc3luYworI2RlZmluZSBHTF9BU1lOQ19NQVJLRVJfU0dJWCAgICAgICAgICAgICAgMHg4MzI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2FzeW5jX3BpeGVsCisjZGVmaW5lIEdMX0FTWU5DX1RFWF9JTUFHRV9TR0lYICAgICAgICAgICAweDgzNUMKKyNkZWZpbmUgR0xfQVNZTkNfRFJBV19QSVhFTFNfU0dJWCAgICAgICAgIDB4ODM1RAorI2RlZmluZSBHTF9BU1lOQ19SRUFEX1BJWEVMU19TR0lYICAgICAgICAgMHg4MzVFCisjZGVmaW5lIEdMX01BWF9BU1lOQ19URVhfSU1BR0VfU0dJWCAgICAgICAweDgzNUYKKyNkZWZpbmUgR0xfTUFYX0FTWU5DX0RSQVdfUElYRUxTX1NHSVggICAgIDB4ODM2MAorI2RlZmluZSBHTF9NQVhfQVNZTkNfUkVBRF9QSVhFTFNfU0dJWCAgICAgMHg4MzYxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2FzeW5jX2hpc3RvZ3JhbQorI2RlZmluZSBHTF9BU1lOQ19ISVNUT0dSQU1fU0dJWCAgICAgICAgICAgMHg4MzJDCisjZGVmaW5lIEdMX01BWF9BU1lOQ19ISVNUT0dSQU1fU0dJWCAgICAgICAweDgzMkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOVEVMX3RleHR1cmVfc2Npc3NvcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5URUxfcGFyYWxsZWxfYXJyYXlzCisjZGVmaW5lIEdMX1BBUkFMTEVMX0FSUkFZU19JTlRFTCAgICAgICAgICAweDgzRjQKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGNQorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfUEFSQUxMRUxfUE9JTlRFUlNfSU5URUwgMHg4M0Y2CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGNworI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfb2NjbHVzaW9uX3Rlc3QKKyNkZWZpbmUgR0xfT0NDTFVTSU9OX1RFU1RfSFAgICAgICAgICAgICAgIDB4ODE2NQorI2RlZmluZSBHTF9PQ0NMVVNJT05fVEVTVF9SRVNVTFRfSFAgICAgICAgMHg4MTY2CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtCisjZGVmaW5lIEdMX1BJWEVMX1RSQU5TRk9STV8yRF9FWFQgICAgICAgICAweDgzMzAKKyNkZWZpbmUgR0xfUElYRUxfTUFHX0ZJTFRFUl9FWFQgICAgICAgICAgIDB4ODMzMQorI2RlZmluZSBHTF9QSVhFTF9NSU5fRklMVEVSX0VYVCAgICAgICAgICAgMHg4MzMyCisjZGVmaW5lIEdMX1BJWEVMX0NVQklDX1dFSUdIVF9FWFQgICAgICAgICAweDgzMzMKKyNkZWZpbmUgR0xfQ1VCSUNfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODMzNAorI2RlZmluZSBHTF9BVkVSQUdFX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MzM1CisjZGVmaW5lIEdMX1BJWEVMX1RSQU5TRk9STV8yRF9TVEFDS19ERVBUSF9FWFQgMHg4MzM2CisjZGVmaW5lIEdMX01BWF9QSVhFTF9UUkFOU0ZPUk1fMkRfU1RBQ0tfREVQVEhfRVhUIDB4ODMzNworI2RlZmluZSBHTF9QSVhFTF9UUkFOU0ZPUk1fMkRfTUFUUklYX0VYVCAgMHg4MzM4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtX2NvbG9yX3RhYmxlCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2hhcmVkX3RleHR1cmVfcGFsZXR0ZQorI2RlZmluZSBHTF9TSEFSRURfVEVYVFVSRV9QQUxFVFRFX0VYVCAgICAgMHg4MUZCCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2VwYXJhdGVfc3BlY3VsYXJfY29sb3IKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTF9FWFQgIDB4ODFGOAorI2RlZmluZSBHTF9TSU5HTEVfQ09MT1JfRVhUICAgICAgICAgICAgICAgMHg4MUY5CisjZGVmaW5lIEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SX0VYVCAgICAweDgxRkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zZWNvbmRhcnlfY29sb3IKKyNkZWZpbmUgR0xfQ09MT1JfU1VNX0VYVCAgICAgICAgICAgICAgICAgIDB4ODQ1OAorI2RlZmluZSBHTF9DVVJSRU5UX1NFQ09OREFSWV9DT0xPUl9FWFQgICAgMHg4NDU5CisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9TSVpFX0VYVCAweDg0NUEKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1RZUEVfRVhUIDB4ODQ1QgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU1RSSURFX0VYVCAweDg0NUMKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1BPSU5URVJfRVhUIDB4ODQ1RAorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfRVhUICAgICAgMHg4NDVFCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9wZXJ0dXJiX25vcm1hbAorI2RlZmluZSBHTF9QRVJUVVJCX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4NUFFCisjZGVmaW5lIEdMX1RFWFRVUkVfTk9STUFMX0VYVCAgICAgICAgICAgICAweDg1QUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZvZ19jb29yZAorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhUICAgICAgMHg4NDUwCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0VYVCAgICAgICAgICAgICAweDg0NTEKKyNkZWZpbmUgR0xfRlJBR01FTlRfREVQVEhfRVhUICAgICAgICAgICAgIDB4ODQ1MgorI2RlZmluZSBHTF9DVVJSRU5UX0ZPR19DT09SRElOQVRFX0VYVCAgICAgMHg4NDUzCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1RZUEVfRVhUICAweDg0NTQKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfU1RSSURFX0VYVCAweDg0NTUKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfUE9JTlRFUl9FWFQgMHg4NDU2CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0VYVCAgICAgICAweDg0NTcKKyNlbmRpZgorCisjaWZuZGVmIEdMX1JFTkRfc2NyZWVuX2Nvb3JkaW5hdGVzCisjZGVmaW5lIEdMX1NDUkVFTl9DT09SRElOQVRFU19SRU5EICAgICAgICAweDg0OTAKKyNkZWZpbmUgR0xfSU5WRVJURURfU0NSRUVOX1dfUkVORCAgICAgICAgIDB4ODQ5MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2Nvb3JkaW5hdGVfZnJhbWUKKyNkZWZpbmUgR0xfVEFOR0VOVF9BUlJBWV9FWFQgICAgICAgICAgICAgIDB4ODQzOQorI2RlZmluZSBHTF9CSU5PUk1BTF9BUlJBWV9FWFQgICAgICAgICAgICAgMHg4NDNBCisjZGVmaW5lIEdMX0NVUlJFTlRfVEFOR0VOVF9FWFQgICAgICAgICAgICAweDg0M0IKKyNkZWZpbmUgR0xfQ1VSUkVOVF9CSU5PUk1BTF9FWFQgICAgICAgICAgIDB4ODQzQworI2RlZmluZSBHTF9UQU5HRU5UX0FSUkFZX1RZUEVfRVhUICAgICAgICAgMHg4NDNFCisjZGVmaW5lIEdMX1RBTkdFTlRfQVJSQVlfU1RSSURFX0VYVCAgICAgICAweDg0M0YKKyNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfVFlQRV9FWFQgICAgICAgIDB4ODQ0MAorI2RlZmluZSBHTF9CSU5PUk1BTF9BUlJBWV9TVFJJREVfRVhUICAgICAgMHg4NDQxCisjZGVmaW5lIEdMX1RBTkdFTlRfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAweDg0NDIKKyNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgICAgIDB4ODQ0MworI2RlZmluZSBHTF9NQVAxX1RBTkdFTlRfRVhUICAgICAgICAgICAgICAgMHg4NDQ0CisjZGVmaW5lIEdMX01BUDJfVEFOR0VOVF9FWFQgICAgICAgICAgICAgICAweDg0NDUKKyNkZWZpbmUgR0xfTUFQMV9CSU5PUk1BTF9FWFQgICAgICAgICAgICAgIDB4ODQ0NgorI2RlZmluZSBHTF9NQVAyX0JJTk9STUFMX0VYVCAgICAgICAgICAgICAgMHg4NDQ3CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZQorI2RlZmluZSBHTF9DT01CSU5FX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCX0VYVCAgICAgICAgICAgICAgICAweDg1NzEKKyNkZWZpbmUgR0xfQ09NQklORV9BTFBIQV9FWFQgICAgICAgICAgICAgIDB4ODU3MgorI2RlZmluZSBHTF9SR0JfU0NBTEVfRVhUICAgICAgICAgICAgICAgICAgMHg4NTczCisjZGVmaW5lIEdMX0FERF9TSUdORURfRVhUICAgICAgICAgICAgICAgICAweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEVfRVhUICAgICAgICAgICAgICAgIDB4ODU3NQorI2RlZmluZSBHTF9DT05TVEFOVF9FWFQgICAgICAgICAgICAgICAgICAgMHg4NTc2CisjZGVmaW5lIEdMX1BSSU1BUllfQ09MT1JfRVhUICAgICAgICAgICAgICAweDg1NzcKKyNkZWZpbmUgR0xfUFJFVklPVVNfRVhUICAgICAgICAgICAgICAgICAgIDB4ODU3OAorI2RlZmluZSBHTF9TT1VSQ0UwX1JHQl9FWFQgICAgICAgICAgICAgICAgMHg4NTgwCisjZGVmaW5lIEdMX1NPVVJDRTFfUkdCX0VYVCAgICAgICAgICAgICAgICAweDg1ODEKKyNkZWZpbmUgR0xfU09VUkNFMl9SR0JfRVhUICAgICAgICAgICAgICAgIDB4ODU4MgorI2RlZmluZSBHTF9TT1VSQ0UwX0FMUEhBX0VYVCAgICAgICAgICAgICAgMHg4NTg4CisjZGVmaW5lIEdMX1NPVVJDRTFfQUxQSEFfRVhUICAgICAgICAgICAgICAweDg1ODkKKyNkZWZpbmUgR0xfU09VUkNFMl9BTFBIQV9FWFQgICAgICAgICAgICAgIDB4ODU4QQorI2RlZmluZSBHTF9PUEVSQU5EMF9SR0JfRVhUICAgICAgICAgICAgICAgMHg4NTkwCisjZGVmaW5lIEdMX09QRVJBTkQxX1JHQl9FWFQgICAgICAgICAgICAgICAweDg1OTEKKyNkZWZpbmUgR0xfT1BFUkFORDJfUkdCX0VYVCAgICAgICAgICAgICAgIDB4ODU5MgorI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQV9FWFQgICAgICAgICAgICAgMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBX0VYVCAgICAgICAgICAgICAweDg1OTkKKyNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEFfRVhUICAgICAgICAgICAgIDB4ODU5QQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfc3BlY3VsYXJfdmVjdG9yCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX1NQRUNVTEFSX1ZFQ1RPUl9BUFBMRSAweDg1QjAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3RyYW5zZm9ybV9oaW50CisjZGVmaW5lIEdMX1RSQU5TRk9STV9ISU5UX0FQUExFICAgICAgICAgICAweDg1QjEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZm9nX3NjYWxlCisjZGVmaW5lIEdMX0ZPR19TQ0FMRV9TR0lYICAgICAgICAgICAgICAgICAweDgxRkMKKyNkZWZpbmUgR0xfRk9HX1NDQUxFX1ZBTFVFX1NHSVggICAgICAgICAgIDB4ODFGRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOWF9jb25zdGFudF9kYXRhCisjZGVmaW5lIEdMX1VOUEFDS19DT05TVEFOVF9EQVRBX1NVTlggICAgICAweDgxRDUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT05TVEFOVF9EQVRBX1NVTlggICAgIDB4ODFENgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2dsb2JhbF9hbHBoYQorI2RlZmluZSBHTF9HTE9CQUxfQUxQSEFfU1VOICAgICAgICAgICAgICAgMHg4MUQ5CisjZGVmaW5lIEdMX0dMT0JBTF9BTFBIQV9GQUNUT1JfU1VOICAgICAgICAweDgxREEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl90cmlhbmdsZV9saXN0CisjZGVmaW5lIEdMX1JFU1RBUlRfU1VOICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgR0xfUkVQTEFDRV9NSURETEVfU1VOICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBHTF9SRVBMQUNFX09MREVTVF9TVU4gICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEdMX1RSSUFOR0xFX0xJU1RfU1VOICAgICAgICAgICAgICAweDgxRDcKKyNkZWZpbmUgR0xfUkVQTEFDRU1FTlRfQ09ERV9TVU4gICAgICAgICAgIDB4ODFEOAorI2RlZmluZSBHTF9SRVBMQUNFTUVOVF9DT0RFX0FSUkFZX1NVTiAgICAgMHg4NUMwCisjZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfQVJSQVlfVFlQRV9TVU4gMHg4NUMxCisjZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfQVJSQVlfU1RSSURFX1NVTiAweDg1QzIKKyNkZWZpbmUgR0xfUkVQTEFDRU1FTlRfQ09ERV9BUlJBWV9QT0lOVEVSX1NVTiAweDg1QzMKKyNkZWZpbmUgR0xfUjFVSV9WM0ZfU1VOICAgICAgICAgICAgICAgICAgIDB4ODVDNAorI2RlZmluZSBHTF9SMVVJX0M0VUJfVjNGX1NVTiAgICAgICAgICAgICAgMHg4NUM1CisjZGVmaW5lIEdMX1IxVUlfQzNGX1YzRl9TVU4gICAgICAgICAgICAgICAweDg1QzYKKyNkZWZpbmUgR0xfUjFVSV9OM0ZfVjNGX1NVTiAgICAgICAgICAgICAgIDB4ODVDNworI2RlZmluZSBHTF9SMVVJX0M0Rl9OM0ZfVjNGX1NVTiAgICAgICAgICAgMHg4NUM4CisjZGVmaW5lIEdMX1IxVUlfVDJGX1YzRl9TVU4gICAgICAgICAgICAgICAweDg1QzkKKyNkZWZpbmUgR0xfUjFVSV9UMkZfTjNGX1YzRl9TVU4gICAgICAgICAgIDB4ODVDQQorI2RlZmluZSBHTF9SMVVJX1QyRl9DNEZfTjNGX1YzRl9TVU4gICAgICAgMHg4NUNCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fdmVydGV4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCX0VYVCAgICAgICAgICAgICAgMHg4MEM4CisjZGVmaW5lIEdMX0JMRU5EX1NSQ19SR0JfRVhUICAgICAgICAgICAgICAweDgwQzkKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX0FMUEhBX0VYVCAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEFfRVhUICAgICAgICAgICAgMHg4MENCCisjZW5kaWYKKworI2lmbmRlZiBHTF9JTkdSX2NvbG9yX2NsYW1wCisjZGVmaW5lIEdMX1JFRF9NSU5fQ0xBTVBfSU5HUiAgICAgICAgICAgICAweDg1NjAKKyNkZWZpbmUgR0xfR1JFRU5fTUlOX0NMQU1QX0lOR1IgICAgICAgICAgIDB4ODU2MQorI2RlZmluZSBHTF9CTFVFX01JTl9DTEFNUF9JTkdSICAgICAgICAgICAgMHg4NTYyCisjZGVmaW5lIEdMX0FMUEhBX01JTl9DTEFNUF9JTkdSICAgICAgICAgICAweDg1NjMKKyNkZWZpbmUgR0xfUkVEX01BWF9DTEFNUF9JTkdSICAgICAgICAgICAgIDB4ODU2NAorI2RlZmluZSBHTF9HUkVFTl9NQVhfQ0xBTVBfSU5HUiAgICAgICAgICAgMHg4NTY1CisjZGVmaW5lIEdMX0JMVUVfTUFYX0NMQU1QX0lOR1IgICAgICAgICAgICAweDg1NjYKKyNkZWZpbmUgR0xfQUxQSEFfTUFYX0NMQU1QX0lOR1IgICAgICAgICAgIDB4ODU2NworI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5HUl9pbnRlcmxhY2VfcmVhZAorI2RlZmluZSBHTF9JTlRFUkxBQ0VfUkVBRF9JTkdSICAgICAgICAgICAgMHg4NTY4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF93cmFwCisjZGVmaW5lIEdMX0lOQ1JfV1JBUF9FWFQgICAgICAgICAgICAgICAgICAweDg1MDcKKyNkZWZpbmUgR0xfREVDUl9XUkFQX0VYVCAgICAgICAgICAgICAgICAgIDB4ODUwOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUXzQyMl9waXhlbHMKKyNkZWZpbmUgR0xfNDIyX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDQworI2RlZmluZSBHTF80MjJfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MENECisjZGVmaW5lIEdMXzQyMl9BVkVSQUdFX0VYVCAgICAgICAgICAgICAgICAweDgwQ0UKKyNkZWZpbmUgR0xfNDIyX1JFVl9BVkVSQUdFX0VYVCAgICAgICAgICAgIDB4ODBDRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4Z2VuX3JlZmxlY3Rpb24KKyNkZWZpbmUgR0xfTk9STUFMX01BUF9OViAgICAgICAgICAgICAgICAgIDB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUF9OViAgICAgICAgICAgICAgMHg4NTEyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jdWJlX21hcAorI2RlZmluZSBHTF9OT1JNQUxfTUFQX0VYVCAgICAgICAgICAgICAgICAgMHg4NTExCisjZGVmaW5lIEdMX1JFRkxFQ1RJT05fTUFQX0VYVCAgICAgICAgICAgICAweDg1MTIKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9FWFQgICAgICAgICAgIDB4ODUxMworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVBfRVhUICAgMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9FWFQgMHg4NTE1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9FWFQgMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV9FWFQgMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9FWFQgMHg4NTE4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9FWFQgMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl9FWFQgMHg4NTFBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVBfRVhUICAgICAweDg1MUIKKyNkZWZpbmUgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRV9FWFQgIDB4ODUxQworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcworI2RlZmluZSBHTF9XUkFQX0JPUkRFUl9TVU4gICAgICAgICAgICAgICAgMHg4MUQ0CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfYWRkCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcworI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9MT0RfQklBU19FWFQgICAgICAgMHg4NEZECisjZGVmaW5lIEdMX1RFWFRVUkVfRklMVEVSX0NPTlRST0xfRVhUICAgICAweDg1MDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9MT0RfQklBU19FWFQgICAgICAgICAgIDB4ODUwMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICAgICAweDg0RkUKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUIDB4ODRGRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF93ZWlnaHRpbmcKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMF9TVEFDS19ERVBUSF9FWFQgICAgIEdMX01PREVMVklFV19TVEFDS19ERVBUSAorI2RlZmluZSBHTF9NT0RFTFZJRVcxX1NUQUNLX0RFUFRIX0VYVCAgICAgMHg4NTAyCisjZGVmaW5lIEdMX01PREVMVklFVzBfTUFUUklYX0VYVCAgICAgICAgICBHTF9NT0RFTFZJRVdfTUFUUklYCisjZGVmaW5lIEdMX01PREVMVklFVzFfTUFUUklYX0VYVCAgICAgICAgICAweDg1MDYKKyNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVElOR19FWFQgICAgICAgICAgIDB4ODUwOQorI2RlZmluZSBHTF9NT0RFTFZJRVcwX0VYVCAgICAgICAgICAgICAgICAgR0xfTU9ERUxWSUVXCisjZGVmaW5lIEdMX01PREVMVklFVzFfRVhUICAgICAgICAgICAgICAgICAweDg1MEEKKyNkZWZpbmUgR0xfQ1VSUkVOVF9WRVJURVhfV0VJR0hUX0VYVCAgICAgIDB4ODUwQgorI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX0VYVCAgICAgICAgMHg4NTBDCisjZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfU0laRV9FWFQgICAweDg1MEQKKyNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVF9BUlJBWV9UWVBFX0VYVCAgIDB4ODUwRQorI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX1NUUklERV9FWFQgMHg4NTBGCisjZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9FWFQgMHg4NTEwCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9saWdodF9tYXhfZXhwb25lbnQKKyNkZWZpbmUgR0xfTUFYX1NISU5JTkVTU19OViAgICAgICAgICAgICAgIDB4ODUwNAorI2RlZmluZSBHTF9NQVhfU1BPVF9FWFBPTkVOVF9OViAgICAgICAgICAgMHg4NTA1CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX05WICAgICAgICAgIDB4ODUxRAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfTEVOR1RIX05WICAgMHg4NTFFCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9SQU5HRV9WQUxJRF9OViAgICAweDg1MUYKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BUlJBWV9SQU5HRV9FTEVNRU5UX05WIDB4ODUyMAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfUE9JTlRFUl9OViAgMHg4NTIxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMKKyNkZWZpbmUgR0xfUkVHSVNURVJfQ09NQklORVJTX05WICAgICAgICAgIDB4ODUyMgorI2RlZmluZSBHTF9WQVJJQUJMRV9BX05WICAgICAgICAgICAgICAgICAgMHg4NTIzCisjZGVmaW5lIEdMX1ZBUklBQkxFX0JfTlYgICAgICAgICAgICAgICAgICAweDg1MjQKKyNkZWZpbmUgR0xfVkFSSUFCTEVfQ19OViAgICAgICAgICAgICAgICAgIDB4ODUyNQorI2RlZmluZSBHTF9WQVJJQUJMRV9EX05WICAgICAgICAgICAgICAgICAgMHg4NTI2CisjZGVmaW5lIEdMX1ZBUklBQkxFX0VfTlYgICAgICAgICAgICAgICAgICAweDg1MjcKKyNkZWZpbmUgR0xfVkFSSUFCTEVfRl9OViAgICAgICAgICAgICAgICAgIDB4ODUyOAorI2RlZmluZSBHTF9WQVJJQUJMRV9HX05WICAgICAgICAgICAgICAgICAgMHg4NTI5CisjZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SMF9OViAgICAgICAgICAgICAweDg1MkEKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1IxX05WICAgICAgICAgICAgIDB4ODUyQgorI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SX05WICAgICAgICAgICAgICAgMHg4NTJDCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9OViAgICAgICAgICAgICAweDg1MkQKKyNkZWZpbmUgR0xfU1BBUkUwX05WICAgICAgICAgICAgICAgICAgICAgIDB4ODUyRQorI2RlZmluZSBHTF9TUEFSRTFfTlYgICAgICAgICAgICAgICAgICAgICAgMHg4NTJGCisjZGVmaW5lIEdMX0RJU0NBUkRfTlYgICAgICAgICAgICAgICAgICAgICAweDg1MzAKKyNkZWZpbmUgR0xfRV9USU1FU19GX05WICAgICAgICAgICAgICAgICAgIDB4ODUzMQorI2RlZmluZSBHTF9TUEFSRTBfUExVU19TRUNPTkRBUllfQ09MT1JfTlYgMHg4NTMyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lERU5USVRZX05WICAgICAgICAgICAweDg1MzYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5WRVJUX05WICAgICAgICAgICAgIDB4ODUzNworI2RlZmluZSBHTF9FWFBBTkRfTk9STUFMX05WICAgICAgICAgICAgICAgMHg4NTM4CisjZGVmaW5lIEdMX0VYUEFORF9ORUdBVEVfTlYgICAgICAgICAgICAgICAweDg1MzkKKyNkZWZpbmUgR0xfSEFMRl9CSUFTX05PUk1BTF9OViAgICAgICAgICAgIDB4ODUzQQorI2RlZmluZSBHTF9IQUxGX0JJQVNfTkVHQVRFX05WICAgICAgICAgICAgMHg4NTNCCisjZGVmaW5lIEdMX1NJR05FRF9JREVOVElUWV9OViAgICAgICAgICAgICAweDg1M0MKKyNkZWZpbmUgR0xfU0lHTkVEX05FR0FURV9OViAgICAgICAgICAgICAgIDB4ODUzRAorI2RlZmluZSBHTF9TQ0FMRV9CWV9UV09fTlYgICAgICAgICAgICAgICAgMHg4NTNFCisjZGVmaW5lIEdMX1NDQUxFX0JZX0ZPVVJfTlYgICAgICAgICAgICAgICAweDg1M0YKKyNkZWZpbmUgR0xfU0NBTEVfQllfT05FX0hBTEZfTlYgICAgICAgICAgIDB4ODU0MAorI2RlZmluZSBHTF9CSUFTX0JZX05FR0FUSVZFX09ORV9IQUxGX05WICAgMHg4NTQxCisjZGVmaW5lIEdMX0NPTUJJTkVSX0lOUFVUX05WICAgICAgICAgICAgICAweDg1NDIKKyNkZWZpbmUgR0xfQ09NQklORVJfTUFQUElOR19OViAgICAgICAgICAgIDB4ODU0MworI2RlZmluZSBHTF9DT01CSU5FUl9DT01QT05FTlRfVVNBR0VfTlYgICAgMHg4NTQ0CisjZGVmaW5lIEdMX0NPTUJJTkVSX0FCX0RPVF9QUk9EVUNUX05WICAgICAweDg1NDUKKyNkZWZpbmUgR0xfQ09NQklORVJfQ0RfRE9UX1BST0RVQ1RfTlYgICAgIDB4ODU0NgorI2RlZmluZSBHTF9DT01CSU5FUl9NVVhfU1VNX05WICAgICAgICAgICAgMHg4NTQ3CisjZGVmaW5lIEdMX0NPTUJJTkVSX1NDQUxFX05WICAgICAgICAgICAgICAweDg1NDgKKyNkZWZpbmUgR0xfQ09NQklORVJfQklBU19OViAgICAgICAgICAgICAgIDB4ODU0OQorI2RlZmluZSBHTF9DT01CSU5FUl9BQl9PVVRQVVRfTlYgICAgICAgICAgMHg4NTRBCisjZGVmaW5lIEdMX0NPTUJJTkVSX0NEX09VVFBVVF9OViAgICAgICAgICAweDg1NEIKKyNkZWZpbmUgR0xfQ09NQklORVJfU1VNX09VVFBVVF9OViAgICAgICAgIDB4ODU0QworI2RlZmluZSBHTF9NQVhfR0VORVJBTF9DT01CSU5FUlNfTlYgICAgICAgMHg4NTRECisjZGVmaW5lIEdMX05VTV9HRU5FUkFMX0NPTUJJTkVSU19OViAgICAgICAweDg1NEUKKyNkZWZpbmUgR0xfQ09MT1JfU1VNX0NMQU1QX05WICAgICAgICAgICAgIDB4ODU0RgorI2RlZmluZSBHTF9DT01CSU5FUjBfTlYgICAgICAgICAgICAgICAgICAgMHg4NTUwCisjZGVmaW5lIEdMX0NPTUJJTkVSMV9OViAgICAgICAgICAgICAgICAgICAweDg1NTEKKyNkZWZpbmUgR0xfQ09NQklORVIyX05WICAgICAgICAgICAgICAgICAgIDB4ODU1MgorI2RlZmluZSBHTF9DT01CSU5FUjNfTlYgICAgICAgICAgICAgICAgICAgMHg4NTUzCisjZGVmaW5lIEdMX0NPTUJJTkVSNF9OViAgICAgICAgICAgICAgICAgICAweDg1NTQKKyNkZWZpbmUgR0xfQ09NQklORVI1X05WICAgICAgICAgICAgICAgICAgIDB4ODU1NQorI2RlZmluZSBHTF9DT01CSU5FUjZfTlYgICAgICAgICAgICAgICAgICAgMHg4NTU2CisjZGVmaW5lIEdMX0NPTUJJTkVSN19OViAgICAgICAgICAgICAgICAgICAweDg1NTcKKy8qIHJldXNlIEdMX1RFWFRVUkUwX0FSQiAqLworLyogcmV1c2UgR0xfVEVYVFVSRTFfQVJCICovCisvKiByZXVzZSBHTF9aRVJPICovCisvKiByZXVzZSBHTF9OT05FICovCisvKiByZXVzZSBHTF9GT0cgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZvZ19kaXN0YW5jZQorI2RlZmluZSBHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViAgICAgICAgICAgMHg4NTVBCisjZGVmaW5lIEdMX0VZRV9SQURJQUxfTlYgICAgICAgICAgICAgICAgICAweDg1NUIKKyNkZWZpbmUgR0xfRVlFX1BMQU5FX0FCU09MVVRFX05WICAgICAgICAgIDB4ODU1QworLyogcmV1c2UgR0xfRVlFX1BMQU5FICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXhnZW5fZW1ib3NzCisjZGVmaW5lIEdMX0VNQk9TU19MSUdIVF9OViAgICAgICAgICAgICAgICAweDg1NUQKKyNkZWZpbmUgR0xfRU1CT1NTX0NPTlNUQU5UX05WICAgICAgICAgICAgIDB4ODU1RQorI2RlZmluZSBHTF9FTUJPU1NfTUFQX05WICAgICAgICAgICAgICAgICAgMHg4NTVGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ibGVuZF9zcXVhcmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfZW52X2NvbWJpbmU0CisjZGVmaW5lIEdMX0NPTUJJTkU0X05WICAgICAgICAgICAgICAgICAgICAweDg1MDMKKyNkZWZpbmUgR0xfU09VUkNFM19SR0JfTlYgICAgICAgICAgICAgICAgIDB4ODU4MworI2RlZmluZSBHTF9TT1VSQ0UzX0FMUEhBX05WICAgICAgICAgICAgICAgMHg4NThCCisjZGVmaW5lIEdMX09QRVJBTkQzX1JHQl9OViAgICAgICAgICAgICAgICAweDg1OTMKKyNkZWZpbmUgR0xfT1BFUkFORDNfQUxQSEFfTlYgICAgICAgICAgICAgIDB4ODU5QgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV9yZXNpemVfYnVmZmVycworI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV93aW5kb3dfcG9zCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgICAweDgzRjAKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgIDB4ODNGMQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCAgMHg4M0YyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUICAweDgzRjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV9jdWxsX3ZlcnRleAorI2RlZmluZSBHTF9DVUxMX1ZFUlRFWF9JQk0gICAgICAgICAgICAgICAgMTAzMDUwCisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fbXVsdGltb2RlX2RyYXdfYXJyYXlzCisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fdmVydGV4X2FycmF5X2xpc3RzCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAxMDMwNzAKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0xJU1RfSUJNICAgICAgICAgIDEwMzA3MQorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAgMTAzMDcyCisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX0xJU1RfSUJNICAgICAgICAgICAxMDMwNzMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9MSVNUX0lCTSAgIDEwMzA3NAorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfTElTVF9JQk0gICAgICAgMTAzMDc1CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0xJU1RfSUJNICAxMDMwNzYKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0xJU1RfSUJNIDEwMzA3NworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgMTAzMDgwCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9MSVNUX1NUUklERV9JQk0gICAxMDMwODEKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgIDEwMzA4MgorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9MSVNUX1NUUklERV9JQk0gICAgMTAzMDgzCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NAorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NQorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9MSVNUX1NUUklERV9JQk0gMTAzMDg2CisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9MSVNUX1NUUklERV9JQk0gMTAzMDg3CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3N1YnNhbXBsZQorI2RlZmluZSBHTF9QQUNLX1NVQlNBTVBMRV9SQVRFX1NHSVggICAgICAgMHg4NUEwCisjZGVmaW5lIEdMX1VOUEFDS19TVUJTQU1QTEVfUkFURV9TR0lYICAgICAweDg1QTEKKyNkZWZpbmUgR0xfUElYRUxfU1VCU0FNUExFXzQ0NDRfU0dJWCAgICAgIDB4ODVBMgorI2RlZmluZSBHTF9QSVhFTF9TVUJTQU1QTEVfMjQyNF9TR0lYICAgICAgMHg4NUEzCisjZGVmaW5lIEdMX1BJWEVMX1NVQlNBTVBMRV80MjQyX1NHSVggICAgICAweDg1QTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2Jfc3Vic2FtcGxlCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ljcmNiYQorI2RlZmluZSBHTF9ZQ1JDQl9TR0lYICAgICAgICAgICAgICAgICAgICAgMHg4MzE4CisjZGVmaW5lIEdMX1lDUkNCQV9TR0lYICAgICAgICAgICAgICAgICAgICAweDgzMTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV9kZXB0aF9wYXNzX2luc3RydW1lbnQKKyNkZWZpbmUgR0xfREVQVEhfUEFTU19JTlNUUlVNRU5UX1NHSVggICAgIDB4ODMxMAorI2RlZmluZSBHTF9ERVBUSF9QQVNTX0lOU1RSVU1FTlRfQ09VTlRFUlNfU0dJWCAweDgzMTEKKyNkZWZpbmUgR0xfREVQVEhfUEFTU19JTlNUUlVNRU5UX01BWF9TR0lYIDB4ODMxMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfM0RGWF90ZXh0dXJlX2NvbXByZXNzaW9uX0ZYVDEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfRlhUMV8zREZYICAgICAgIDB4ODZCMAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfRlhUMV8zREZYICAgICAgMHg4NkIxCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX01VTFRJU0FNUExFXzNERlggICAgICAgICAgICAgICAweDg2QjIKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfM0RGWCAgICAgICAgICAgIDB4ODZCMworI2RlZmluZSBHTF9TQU1QTEVTXzNERlggICAgICAgICAgICAgICAgICAgMHg4NkI0CisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JJVF8zREZYICAgICAgICAgICAweDIwMDAwMDAwCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX3RidWZmZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9FWFQgICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19NQVNLX0VYVCAgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORV9FWFQgICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19FWFQgICAgICAgICAgICAgICAgMHg4MEEwCisjZGVmaW5lIEdMXzFQQVNTX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwQTEKKyNkZWZpbmUgR0xfMlBBU1NfMF9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBMgorI2RlZmluZSBHTF8yUEFTU18xX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEEzCisjZGVmaW5lIEdMXzRQQVNTXzBfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTQKKyNkZWZpbmUgR0xfNFBBU1NfMV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBNQorI2RlZmluZSBHTF80UEFTU18yX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE2CisjZGVmaW5lIEdMXzRQQVNTXzNfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTcKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfRVhUICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLX1ZBTFVFX0VYVCAgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfSU5WRVJUX0VYVCAgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9TQU1QTEVfUEFUVEVSTl9FWFQgICAgICAgICAgICAgMHg4MEFDCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JJVF9FWFQgICAgICAgICAgICAweDIwMDAwMDAwCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ZlcnRleF9wcmVjbGlwCisjZGVmaW5lIEdMX1ZFUlRFWF9QUkVDTElQX1NHSVggICAgICAgICAgICAweDgzRUUKKyNkZWZpbmUgR0xfVkVSVEVYX1BSRUNMSVBfSElOVF9TR0lYICAgICAgIDB4ODNFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jb252b2x1dGlvbl9hY2N1cmFjeQorI2RlZmluZSBHTF9DT05WT0xVVElPTl9ISU5UX1NHSVggICAgICAgICAgMHg4MzE2CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3Jlc2FtcGxlCisjZGVmaW5lIEdMX1BBQ0tfUkVTQU1QTEVfU0dJWCAgICAgICAgICAgICAweDg0MkMKKyNkZWZpbmUgR0xfVU5QQUNLX1JFU0FNUExFX1NHSVggICAgICAgICAgIDB4ODQyRAorI2RlZmluZSBHTF9SRVNBTVBMRV9SRVBMSUNBVEVfU0dJWCAgICAgICAgMHg4NDJFCisjZGVmaW5lIEdMX1JFU0FNUExFX1pFUk9fRklMTF9TR0lYICAgICAgICAweDg0MkYKKyNkZWZpbmUgR0xfUkVTQU1QTEVfREVDSU1BVEVfU0dJWCAgICAgICAgIDB4ODQzMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19wb2ludF9saW5lX3RleGdlbgorI2RlZmluZSBHTF9FWUVfRElTVEFOQ0VfVE9fUE9JTlRfU0dJUyAgICAgMHg4MUYwCisjZGVmaW5lIEdMX09CSkVDVF9ESVNUQU5DRV9UT19QT0lOVF9TR0lTICAweDgxRjEKKyNkZWZpbmUgR0xfRVlFX0RJU1RBTkNFX1RPX0xJTkVfU0dJUyAgICAgIDB4ODFGMgorI2RlZmluZSBHTF9PQkpFQ1RfRElTVEFOQ0VfVE9fTElORV9TR0lTICAgMHg4MUYzCisjZGVmaW5lIEdMX0VZRV9QT0lOVF9TR0lTICAgICAgICAgICAgICAgICAweDgxRjQKKyNkZWZpbmUgR0xfT0JKRUNUX1BPSU5UX1NHSVMgICAgICAgICAgICAgIDB4ODFGNQorI2RlZmluZSBHTF9FWUVfTElORV9TR0lTICAgICAgICAgICAgICAgICAgMHg4MUY2CisjZGVmaW5lIEdMX09CSkVDVF9MSU5FX1NHSVMgICAgICAgICAgICAgICAweDgxRjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9jb2xvcl9tYXNrCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09MT1JfV1JJVEVNQVNLX1NHSVMgICAweDgxRUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9kb3QzCisjZGVmaW5lIEdMX0RPVDNfUkdCX0VYVCAgICAgICAgICAgICAgICAgICAweDg3NDAKKyNkZWZpbmUgR0xfRE9UM19SR0JBX0VYVCAgICAgICAgICAgICAgICAgIDB4ODc0MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfbWlycm9yX29uY2UKKyNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX0FUSSAgICAgICAgICAgICAgIDB4ODc0MgorI2RlZmluZSBHTF9NSVJST1JfQ0xBTVBfVE9fRURHRV9BVEkgICAgICAgMHg4NzQzCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mZW5jZQorI2RlZmluZSBHTF9BTExfQ09NUExFVEVEX05WICAgICAgICAgICAgICAgMHg4NEYyCisjZGVmaW5lIEdMX0ZFTkNFX1NUQVRVU19OViAgICAgICAgICAgICAgICAweDg0RjMKKyNkZWZpbmUgR0xfRkVOQ0VfQ09ORElUSU9OX05WICAgICAgICAgICAgIDB4ODRGNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0CisjZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVF9JQk0gICAgICAgICAgICAweDgzNzAKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2V2YWx1YXRvcnMKKyNkZWZpbmUgR0xfRVZBTF8yRF9OViAgICAgICAgICAgICAgICAgICAgIDB4ODZDMAorI2RlZmluZSBHTF9FVkFMX1RSSUFOR1VMQVJfMkRfTlYgICAgICAgICAgMHg4NkMxCisjZGVmaW5lIEdMX01BUF9URVNTRUxMQVRJT05fTlYgICAgICAgICAgICAweDg2QzIKKyNkZWZpbmUgR0xfTUFQX0FUVFJJQl9VX09SREVSX05WICAgICAgICAgIDB4ODZDMworI2RlZmluZSBHTF9NQVBfQVRUUklCX1ZfT1JERVJfTlYgICAgICAgICAgMHg4NkM0CisjZGVmaW5lIEdMX0VWQUxfRlJBQ1RJT05BTF9URVNTRUxMQVRJT05fTlYgMHg4NkM1CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjBfTlYgICAgICAgICAweDg2QzYKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMV9OViAgICAgICAgIDB4ODZDNworI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIyX05WICAgICAgICAgMHg4NkM4CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjNfTlYgICAgICAgICAweDg2QzkKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCNF9OViAgICAgICAgIDB4ODZDQQorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI1X05WICAgICAgICAgMHg4NkNCCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjZfTlYgICAgICAgICAweDg2Q0MKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCN19OViAgICAgICAgIDB4ODZDRAorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI4X05WICAgICAgICAgMHg4NkNFCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjlfTlYgICAgICAgICAweDg2Q0YKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTBfTlYgICAgICAgIDB4ODZEMAorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxMV9OViAgICAgICAgMHg4NkQxCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjEyX05WICAgICAgICAweDg2RDIKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTNfTlYgICAgICAgIDB4ODZEMworI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxNF9OViAgICAgICAgMHg4NkQ0CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjE1X05WICAgICAgICAweDg2RDUKKyNkZWZpbmUgR0xfTUFYX01BUF9URVNTRUxMQVRJT05fTlYgICAgICAgIDB4ODZENgorI2RlZmluZSBHTF9NQVhfUkFUSU9OQUxfRVZBTF9PUkRFUl9OViAgICAgMHg4NkQ3CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wYWNrZWRfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX05WICAgICAgICAgICAgICAgMHg4NEY5CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8yNF84X05WICAgICAgICAgICAweDg0RkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3JlZ2lzdGVyX2NvbWJpbmVyczIKKyNkZWZpbmUgR0xfUEVSX1NUQUdFX0NPTlNUQU5UU19OViAgICAgICAgIDB4ODUzNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfcmVjdGFuZ2xlCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVDVEFOR0xFX05WICAgICAgICAgICAweDg0RjUKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX1JFQ1RBTkdMRV9OViAgIDB4ODRGNgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX1JFQ1RBTkdMRV9OViAgICAgMHg4NEY3CisjZGVmaW5lIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFX05WICAweDg0RjgKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX1JFQ1RBTkdMRV9OViAgICAweDg2NEMKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfUkVDVEFOR0xFX1NDQUxFX05WIDB4ODY0RAorI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9URVhUVVJFX1JFQ1RBTkdMRV9OViAweDg2NEUKKyNkZWZpbmUgR0xfUkdCQV9VTlNJR05FRF9ET1RfUFJPRFVDVF9NQVBQSU5HX05WIDB4ODZEOQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfUzhfUzhfOF84X05WICAgICAgMHg4NkRBCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfUzhfUzhfUkVWX05WICAweDg2REIKKyNkZWZpbmUgR0xfRFNEVF9NQUdfSU5URU5TSVRZX05WICAgICAgICAgIDB4ODZEQworI2RlZmluZSBHTF9TSEFERVJfQ09OU0lTVEVOVF9OViAgICAgICAgICAgMHg4NkRECisjZGVmaW5lIEdMX1RFWFRVUkVfU0hBREVSX05WICAgICAgICAgICAgICAweDg2REUKKyNkZWZpbmUgR0xfU0hBREVSX09QRVJBVElPTl9OViAgICAgICAgICAgIDB4ODZERgorI2RlZmluZSBHTF9DVUxMX01PREVTX05WICAgICAgICAgICAgICAgICAgMHg4NkUwCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX01BVFJJWF9OViAgICAgICAweDg2RTEKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfU0NBTEVfTlYgICAgICAgIDB4ODZFMgorI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV9CSUFTX05WICAgICAgICAgMHg4NkUzCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX01BVFJJWF9OViAgICBHTF9PRkZTRVRfVEVYVFVSRV9NQVRSSVhfTlYKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfMkRfU0NBTEVfTlYgICAgIEdMX09GRlNFVF9URVhUVVJFX1NDQUxFX05WCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX0JJQVNfTlYgICAgICBHTF9PRkZTRVRfVEVYVFVSRV9CSUFTX05WCisjZGVmaW5lIEdMX1BSRVZJT1VTX1RFWFRVUkVfSU5QVVRfTlYgICAgICAweDg2RTQKKyNkZWZpbmUgR0xfQ09OU1RfRVlFX05WICAgICAgICAgICAgICAgICAgIDB4ODZFNQorI2RlZmluZSBHTF9QQVNTX1RIUk9VR0hfTlYgICAgICAgICAgICAgICAgMHg4NkU2CisjZGVmaW5lIEdMX0NVTExfRlJBR01FTlRfTlYgICAgICAgICAgICAgICAweDg2RTcKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfMkRfTlYgICAgICAgICAgIDB4ODZFOAorI2RlZmluZSBHTF9ERVBFTkRFTlRfQVJfVEVYVFVSRV8yRF9OViAgICAgMHg4NkU5CisjZGVmaW5lIEdMX0RFUEVOREVOVF9HQl9URVhUVVJFXzJEX05WICAgICAweDg2RUEKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfTlYgICAgICAgICAgICAgICAgIDB4ODZFQworI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9ERVBUSF9SRVBMQUNFX05WICAgMHg4NkVECisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1RFWFRVUkVfMkRfTlYgICAgICAweDg2RUUKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV9DVUJFX01BUF9OViAweDg2RjAKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfRElGRlVTRV9DVUJFX01BUF9OViAweDg2RjEKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfUkVGTEVDVF9DVUJFX01BUF9OViAweDg2RjIKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfQ09OU1RfRVlFX1JFRkxFQ1RfQ1VCRV9NQVBfTlYgMHg4NkYzCisjZGVmaW5lIEdMX0hJTE9fTlYgICAgICAgICAgICAgICAgICAgICAgICAweDg2RjQKKyNkZWZpbmUgR0xfRFNEVF9OViAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZGNQorI2RlZmluZSBHTF9EU0RUX01BR19OViAgICAgICAgICAgICAgICAgICAgMHg4NkY2CisjZGVmaW5lIEdMX0RTRFRfTUFHX1ZJQl9OViAgICAgICAgICAgICAgICAweDg2RjcKKyNkZWZpbmUgR0xfSElMTzE2X05WICAgICAgICAgICAgICAgICAgICAgIDB4ODZGOAorI2RlZmluZSBHTF9TSUdORURfSElMT19OViAgICAgICAgICAgICAgICAgMHg4NkY5CisjZGVmaW5lIEdMX1NJR05FRF9ISUxPMTZfTlYgICAgICAgICAgICAgICAweDg2RkEKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQkFfTlYgICAgICAgICAgICAgICAgIDB4ODZGQgorI2RlZmluZSBHTF9TSUdORURfUkdCQThfTlYgICAgICAgICAgICAgICAgMHg4NkZDCisjZGVmaW5lIEdMX1NJR05FRF9SR0JfTlYgICAgICAgICAgICAgICAgICAweDg2RkUKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQjhfTlYgICAgICAgICAgICAgICAgIDB4ODZGRgorI2RlZmluZSBHTF9TSUdORURfTFVNSU5BTkNFX05WICAgICAgICAgICAgMHg4NzAxCisjZGVmaW5lIEdMX1NJR05FRF9MVU1JTkFOQ0U4X05WICAgICAgICAgICAweDg3MDIKKyNkZWZpbmUgR0xfU0lHTkVEX0xVTUlOQU5DRV9BTFBIQV9OViAgICAgIDB4ODcwMworI2RlZmluZSBHTF9TSUdORURfTFVNSU5BTkNFOF9BTFBIQThfTlYgICAgMHg4NzA0CisjZGVmaW5lIEdMX1NJR05FRF9BTFBIQV9OViAgICAgICAgICAgICAgICAweDg3MDUKKyNkZWZpbmUgR0xfU0lHTkVEX0FMUEhBOF9OViAgICAgICAgICAgICAgIDB4ODcwNgorI2RlZmluZSBHTF9TSUdORURfSU5URU5TSVRZX05WICAgICAgICAgICAgMHg4NzA3CisjZGVmaW5lIEdMX1NJR05FRF9JTlRFTlNJVFk4X05WICAgICAgICAgICAweDg3MDgKKyNkZWZpbmUgR0xfRFNEVDhfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4ODcwOQorI2RlZmluZSBHTF9EU0RUOF9NQUc4X05WICAgICAgICAgICAgICAgICAgMHg4NzBBCisjZGVmaW5lIEdMX0RTRFQ4X01BRzhfSU5URU5TSVRZOF9OViAgICAgICAweDg3MEIKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQl9VTlNJR05FRF9BTFBIQV9OViAgIDB4ODcwQworI2RlZmluZSBHTF9TSUdORURfUkdCOF9VTlNJR05FRF9BTFBIQThfTlYgMHg4NzBECisjZGVmaW5lIEdMX0hJX1NDQUxFX05WICAgICAgICAgICAgICAgICAgICAweDg3MEUKKyNkZWZpbmUgR0xfTE9fU0NBTEVfTlYgICAgICAgICAgICAgICAgICAgIDB4ODcwRgorI2RlZmluZSBHTF9EU19TQ0FMRV9OViAgICAgICAgICAgICAgICAgICAgMHg4NzEwCisjZGVmaW5lIEdMX0RUX1NDQUxFX05WICAgICAgICAgICAgICAgICAgICAweDg3MTEKKyNkZWZpbmUgR0xfTUFHTklUVURFX1NDQUxFX05WICAgICAgICAgICAgIDB4ODcxMgorI2RlZmluZSBHTF9WSUJSQU5DRV9TQ0FMRV9OViAgICAgICAgICAgICAgMHg4NzEzCisjZGVmaW5lIEdMX0hJX0JJQVNfTlYgICAgICAgICAgICAgICAgICAgICAweDg3MTQKKyNkZWZpbmUgR0xfTE9fQklBU19OViAgICAgICAgICAgICAgICAgICAgIDB4ODcxNQorI2RlZmluZSBHTF9EU19CSUFTX05WICAgICAgICAgICAgICAgICAgICAgMHg4NzE2CisjZGVmaW5lIEdMX0RUX0JJQVNfTlYgICAgICAgICAgICAgICAgICAgICAweDg3MTcKKyNkZWZpbmUgR0xfTUFHTklUVURFX0JJQVNfTlYgICAgICAgICAgICAgIDB4ODcxOAorI2RlZmluZSBHTF9WSUJSQU5DRV9CSUFTX05WICAgICAgICAgICAgICAgMHg4NzE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQk9SREVSX1ZBTFVFU19OViAgICAgICAweDg3MUEKKyNkZWZpbmUgR0xfVEVYVFVSRV9ISV9TSVpFX05WICAgICAgICAgICAgIDB4ODcxQgorI2RlZmluZSBHTF9URVhUVVJFX0xPX1NJWkVfTlYgICAgICAgICAgICAgMHg4NzFDCisjZGVmaW5lIEdMX1RFWFRVUkVfRFNfU0laRV9OViAgICAgICAgICAgICAweDg3MUQKKyNkZWZpbmUgR0xfVEVYVFVSRV9EVF9TSVpFX05WICAgICAgICAgICAgIDB4ODcxRQorI2RlZmluZSBHTF9URVhUVVJFX01BR19TSVpFX05WICAgICAgICAgICAgMHg4NzFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3NoYWRlcjIKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV8zRF9OViAgICAgIDB4ODZFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlMgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfV0lUSE9VVF9GTFVTSF9OViAweDg1MzMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX05WICAgICAgICAgICAgICAweDg2MjAKKyNkZWZpbmUgR0xfVkVSVEVYX1NUQVRFX1BST0dSQU1fTlYgICAgICAgIDB4ODYyMQorI2RlZmluZSBHTF9BVFRSSUJfQVJSQVlfU0laRV9OViAgICAgICAgICAgMHg4NjIzCisjZGVmaW5lIEdMX0FUVFJJQl9BUlJBWV9TVFJJREVfTlYgICAgICAgICAweDg2MjQKKyNkZWZpbmUgR0xfQVRUUklCX0FSUkFZX1RZUEVfTlYgICAgICAgICAgIDB4ODYyNQorI2RlZmluZSBHTF9DVVJSRU5UX0FUVFJJQl9OViAgICAgICAgICAgICAgMHg4NjI2CisjZGVmaW5lIEdMX1BST0dSQU1fTEVOR1RIX05WICAgICAgICAgICAgICAweDg2MjcKKyNkZWZpbmUgR0xfUFJPR1JBTV9TVFJJTkdfTlYgICAgICAgICAgICAgIDB4ODYyOAorI2RlZmluZSBHTF9NT0RFTFZJRVdfUFJPSkVDVElPTl9OViAgICAgICAgMHg4NjI5CisjZGVmaW5lIEdMX0lERU5USVRZX05WICAgICAgICAgICAgICAgICAgICAweDg2MkEKKyNkZWZpbmUgR0xfSU5WRVJTRV9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYyQgorI2RlZmluZSBHTF9UUkFOU1BPU0VfTlYgICAgICAgICAgICAgICAgICAgMHg4NjJDCisjZGVmaW5lIEdMX0lOVkVSU0VfVFJBTlNQT1NFX05WICAgICAgICAgICAweDg2MkQKKyNkZWZpbmUgR0xfTUFYX1RSQUNLX01BVFJJWF9TVEFDS19ERVBUSF9OViAweDg2MkUKKyNkZWZpbmUgR0xfTUFYX1RSQUNLX01BVFJJQ0VTX05WICAgICAgICAgIDB4ODYyRgorI2RlZmluZSBHTF9NQVRSSVgwX05WICAgICAgICAgICAgICAgICAgICAgMHg4NjMwCisjZGVmaW5lIEdMX01BVFJJWDFfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzEKKyNkZWZpbmUgR0xfTUFUUklYMl9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzMgorI2RlZmluZSBHTF9NQVRSSVgzX05WICAgICAgICAgICAgICAgICAgICAgMHg4NjMzCisjZGVmaW5lIEdMX01BVFJJWDRfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzQKKyNkZWZpbmUgR0xfTUFUUklYNV9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzNQorI2RlZmluZSBHTF9NQVRSSVg2X05WICAgICAgICAgICAgICAgICAgICAgMHg4NjM2CisjZGVmaW5lIEdMX01BVFJJWDdfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzcKKyNkZWZpbmUgR0xfQ1VSUkVOVF9NQVRSSVhfU1RBQ0tfREVQVEhfTlYgIDB4ODY0MAorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9OViAgICAgICAgICAgICAgMHg4NjQxCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkVfTlYgICAweDg2NDIKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREVfTlYgICAgIDB4ODY0MworI2RlZmluZSBHTF9QUk9HUkFNX1BBUkFNRVRFUl9OViAgICAgICAgICAgMHg4NjQ0CisjZGVmaW5lIEdMX0FUVFJJQl9BUlJBWV9QT0lOVEVSX05WICAgICAgICAweDg2NDUKKyNkZWZpbmUgR0xfUFJPR1JBTV9UQVJHRVRfTlYgICAgICAgICAgICAgIDB4ODY0NgorI2RlZmluZSBHTF9QUk9HUkFNX1JFU0lERU5UX05WICAgICAgICAgICAgMHg4NjQ3CisjZGVmaW5lIEdMX1RSQUNLX01BVFJJWF9OViAgICAgICAgICAgICAgICAweDg2NDgKKyNkZWZpbmUgR0xfVFJBQ0tfTUFUUklYX1RSQU5TRk9STV9OViAgICAgIDB4ODY0OQorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9CSU5ESU5HX05WICAgICAgMHg4NjRBCisjZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfUE9TSVRJT05fTlYgICAgICAweDg2NEIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTBfTlYgICAgICAgIDB4ODY1MAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMV9OViAgICAgICAgMHg4NjUxCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkyX05WICAgICAgICAweDg2NTIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTNfTlYgICAgICAgIDB4ODY1MworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZNF9OViAgICAgICAgMHg4NjU0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk1X05WICAgICAgICAweDg2NTUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTZfTlYgICAgICAgIDB4ODY1NgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZN19OViAgICAgICAgMHg4NjU3CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk4X05WICAgICAgICAweDg2NTgKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTlfTlYgICAgICAgIDB4ODY1OQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTBfTlYgICAgICAgMHg4NjVBCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMV9OViAgICAgICAweDg2NUIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTEyX05WICAgICAgIDB4ODY1QworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTNfTlYgICAgICAgMHg4NjVECisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxNF9OViAgICAgICAweDg2NUUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTE1X05WICAgICAgIDB4ODY1RgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIwXzRfTlYgICAgICAgMHg4NjYwCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjFfNF9OViAgICAgICAweDg2NjEKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMl80X05WICAgICAgIDB4ODY2MgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIzXzRfTlYgICAgICAgMHg4NjYzCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjRfNF9OViAgICAgICAweDg2NjQKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCNV80X05WICAgICAgIDB4ODY2NQorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI2XzRfTlYgICAgICAgMHg4NjY2CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjdfNF9OViAgICAgICAweDg2NjcKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCOF80X05WICAgICAgIDB4ODY2OAorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI5XzRfTlYgICAgICAgMHg4NjY5CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEwXzRfTlYgICAgICAweDg2NkEKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTFfNF9OViAgICAgIDB4ODY2QgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMl80X05WICAgICAgMHg4NjZDCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEzXzRfTlYgICAgICAweDg2NkQKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTRfNF9OViAgICAgIDB4ODY2RQorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxNV80X05WICAgICAgMHg4NjZGCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjBfNF9OViAgICAgICAweDg2NzAKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMV80X05WICAgICAgIDB4ODY3MQorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIyXzRfTlYgICAgICAgMHg4NjcyCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjNfNF9OViAgICAgICAweDg2NzMKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCNF80X05WICAgICAgIDB4ODY3NAorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI1XzRfTlYgICAgICAgMHg4Njc1CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjZfNF9OViAgICAgICAweDg2NzYKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCN180X05WICAgICAgIDB4ODY3NworI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI4XzRfTlYgICAgICAgMHg4Njc4CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjlfNF9OViAgICAgICAweDg2NzkKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTBfNF9OViAgICAgIDB4ODY3QQorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMV80X05WICAgICAgMHg4NjdCCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjEyXzRfTlYgICAgICAweDg2N0MKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTNfNF9OViAgICAgIDB4ODY3RAorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNF80X05WICAgICAgMHg4NjdFCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjE1XzRfTlYgICAgICAweDg2N0YKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9jb29yZGluYXRlX2NsYW1wCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1NfU0dJWCAgICAgICAweDgzNjkKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfQ0xBTVBfVF9TR0lYICAgICAgIDB4ODM2QQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9DTEFNUF9SX1NHSVggICAgICAgMHg4MzZCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3NjYWxlYmlhc19oaW50CisjZGVmaW5lIEdMX1NDQUxFQklBU19ISU5UX1NHSVggICAgICAgICAgICAweDgzMjIKKyNlbmRpZgorCisjaWZuZGVmIEdMX09NTF9pbnRlcmxhY2UKKyNkZWZpbmUgR0xfSU5URVJMQUNFX09NTCAgICAgICAgICAgICAgICAgIDB4ODk4MAorI2RlZmluZSBHTF9JTlRFUkxBQ0VfUkVBRF9PTUwgICAgICAgICAgICAgMHg4OTgxCisjZW5kaWYKKworI2lmbmRlZiBHTF9PTUxfc3Vic2FtcGxlCisjZGVmaW5lIEdMX0ZPUk1BVF9TVUJTQU1QTEVfMjRfMjRfT01MICAgICAweDg5ODIKKyNkZWZpbmUgR0xfRk9STUFUX1NVQlNBTVBMRV8yNDRfMjQ0X09NTCAgIDB4ODk4MworI2VuZGlmCisKKyNpZm5kZWYgR0xfT01MX3Jlc2FtcGxlCisjZGVmaW5lIEdMX1BBQ0tfUkVTQU1QTEVfT01MICAgICAgICAgICAgICAweDg5ODQKKyNkZWZpbmUgR0xfVU5QQUNLX1JFU0FNUExFX09NTCAgICAgICAgICAgIDB4ODk4NQorI2RlZmluZSBHTF9SRVNBTVBMRV9SRVBMSUNBVEVfT01MICAgICAgICAgMHg4OTg2CisjZGVmaW5lIEdMX1JFU0FNUExFX1pFUk9fRklMTF9PTUwgICAgICAgICAweDg5ODcKKyNkZWZpbmUgR0xfUkVTQU1QTEVfQVZFUkFHRV9PTUwgICAgICAgICAgIDB4ODk4OAorI2RlZmluZSBHTF9SRVNBTVBMRV9ERUNJTUFURV9PTUwgICAgICAgICAgMHg4OTg5CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9jb3B5X2RlcHRoX3RvX2NvbG9yCisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfVE9fUkdCQV9OViAgICAgICAweDg4NkUKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9UT19CR1JBX05WICAgICAgIDB4ODg2RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2Vudm1hcF9idW1wbWFwCisjZGVmaW5lIEdMX0JVTVBfUk9UX01BVFJJWF9BVEkgICAgICAgICAgICAweDg3NzUKKyNkZWZpbmUgR0xfQlVNUF9ST1RfTUFUUklYX1NJWkVfQVRJICAgICAgIDB4ODc3NgorI2RlZmluZSBHTF9CVU1QX05VTV9URVhfVU5JVFNfQVRJICAgICAgICAgMHg4Nzc3CisjZGVmaW5lIEdMX0JVTVBfVEVYX1VOSVRTX0FUSSAgICAgICAgICAgICAweDg3NzgKKyNkZWZpbmUgR0xfRFVEVl9BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODc3OQorI2RlZmluZSBHTF9EVThEVjhfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4NzdBCisjZGVmaW5lIEdMX0JVTVBfRU5WTUFQX0FUSSAgICAgICAgICAgICAgICAweDg3N0IKKyNkZWZpbmUgR0xfQlVNUF9UQVJHRVRfQVRJICAgICAgICAgICAgICAgIDB4ODc3QworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfQVRJICAgICAgICAgICAgMHg4OTIwCisjZGVmaW5lIEdMX1JFR18wX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjEKKyNkZWZpbmUgR0xfUkVHXzFfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyMgorI2RlZmluZSBHTF9SRUdfMl9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTIzCisjZGVmaW5lIEdMX1JFR18zX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjQKKyNkZWZpbmUgR0xfUkVHXzRfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyNQorI2RlZmluZSBHTF9SRUdfNV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI2CisjZGVmaW5lIEdMX1JFR182X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjcKKyNkZWZpbmUgR0xfUkVHXzdfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyOAorI2RlZmluZSBHTF9SRUdfOF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI5CisjZGVmaW5lIEdMX1JFR185X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MkEKKyNkZWZpbmUgR0xfUkVHXzEwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyQgorI2RlZmluZSBHTF9SRUdfMTFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTJDCisjZGVmaW5lIEdMX1JFR18xMl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MkQKKyNkZWZpbmUgR0xfUkVHXzEzX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyRQorI2RlZmluZSBHTF9SRUdfMTRfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTJGCisjZGVmaW5lIEdMX1JFR18xNV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzAKKyNkZWZpbmUgR0xfUkVHXzE2X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzMQorI2RlZmluZSBHTF9SRUdfMTdfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTMyCisjZGVmaW5lIEdMX1JFR18xOF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzMKKyNkZWZpbmUgR0xfUkVHXzE5X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzNAorI2RlZmluZSBHTF9SRUdfMjBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM1CisjZGVmaW5lIEdMX1JFR18yMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzYKKyNkZWZpbmUgR0xfUkVHXzIyX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzNworI2RlZmluZSBHTF9SRUdfMjNfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM4CisjZGVmaW5lIEdMX1JFR18yNF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzkKKyNkZWZpbmUgR0xfUkVHXzI1X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzQQorI2RlZmluZSBHTF9SRUdfMjZfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNCCisjZGVmaW5lIEdMX1JFR18yN19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0MKKyNkZWZpbmUgR0xfUkVHXzI4X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzRAorI2RlZmluZSBHTF9SRUdfMjlfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNFCisjZGVmaW5lIEdMX1JFR18zMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0YKKyNkZWZpbmUgR0xfUkVHXzMxX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0MAorI2RlZmluZSBHTF9DT05fMF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQxCisjZGVmaW5lIEdMX0NPTl8xX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDIKKyNkZWZpbmUgR0xfQ09OXzJfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0MworI2RlZmluZSBHTF9DT05fM19BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ0CisjZGVmaW5lIEdMX0NPTl80X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDUKKyNkZWZpbmUgR0xfQ09OXzVfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0NgorI2RlZmluZSBHTF9DT05fNl9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ3CisjZGVmaW5lIEdMX0NPTl83X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDgKKyNkZWZpbmUgR0xfQ09OXzhfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0OQorI2RlZmluZSBHTF9DT05fOV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTRBCisjZGVmaW5lIEdMX0NPTl8xMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEIKKyNkZWZpbmUgR0xfQ09OXzExX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0QworI2RlZmluZSBHTF9DT05fMTJfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTRECisjZGVmaW5lIEdMX0NPTl8xM19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEUKKyNkZWZpbmUgR0xfQ09OXzE0X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0RgorI2RlZmluZSBHTF9DT05fMTVfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTUwCisjZGVmaW5lIEdMX0NPTl8xNl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTEKKyNkZWZpbmUgR0xfQ09OXzE3X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1MgorI2RlZmluZSBHTF9DT05fMThfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTUzCisjZGVmaW5lIEdMX0NPTl8xOV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTQKKyNkZWZpbmUgR0xfQ09OXzIwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1NQorI2RlZmluZSBHTF9DT05fMjFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU2CisjZGVmaW5lIEdMX0NPTl8yMl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTcKKyNkZWZpbmUgR0xfQ09OXzIzX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1OAorI2RlZmluZSBHTF9DT05fMjRfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU5CisjZGVmaW5lIEdMX0NPTl8yNV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUEKKyNkZWZpbmUgR0xfQ09OXzI2X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1QgorI2RlZmluZSBHTF9DT05fMjdfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVDCisjZGVmaW5lIEdMX0NPTl8yOF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUQKKyNkZWZpbmUgR0xfQ09OXzI5X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1RQorI2RlZmluZSBHTF9DT05fMzBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVGCisjZGVmaW5lIEdMX0NPTl8zMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NjAKKyNkZWZpbmUgR0xfTU9WX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2MQorI2RlZmluZSBHTF9BRERfQVRJICAgICAgICAgICAgICAgICAgICAgICAgMHg4OTYzCisjZGVmaW5lIEdMX01VTF9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NjQKKyNkZWZpbmUgR0xfU1VCX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2NQorI2RlZmluZSBHTF9ET1QzX0FUSSAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY2CisjZGVmaW5lIEdMX0RPVDRfQVRJICAgICAgICAgICAgICAgICAgICAgICAweDg5NjcKKyNkZWZpbmUgR0xfTUFEX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2OAorI2RlZmluZSBHTF9MRVJQX0FUSSAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY5CisjZGVmaW5lIEdMX0NORF9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NkEKKyNkZWZpbmUgR0xfQ05EMF9BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2QgorI2RlZmluZSBHTF9ET1QyX0FERF9BVEkgICAgICAgICAgICAgICAgICAgMHg4OTZDCisjZGVmaW5lIEdMX1NFQ09OREFSWV9JTlRFUlBPTEFUT1JfQVRJICAgICAweDg5NkQKKyNkZWZpbmUgR0xfTlVNX0ZSQUdNRU5UX1JFR0lTVEVSU19BVEkgICAgIDB4ODk2RQorI2RlZmluZSBHTF9OVU1fRlJBR01FTlRfQ09OU1RBTlRTX0FUSSAgICAgMHg4OTZGCisjZGVmaW5lIEdMX05VTV9QQVNTRVNfQVRJICAgICAgICAgICAgICAgICAweDg5NzAKKyNkZWZpbmUgR0xfTlVNX0lOU1RSVUNUSU9OU19QRVJfUEFTU19BVEkgIDB4ODk3MQorI2RlZmluZSBHTF9OVU1fSU5TVFJVQ1RJT05TX1RPVEFMX0FUSSAgICAgMHg4OTcyCisjZGVmaW5lIEdMX05VTV9JTlBVVF9JTlRFUlBPTEFUT1JfQ09NUE9ORU5UU19BVEkgMHg4OTczCisjZGVmaW5lIEdMX05VTV9MT09QQkFDS19DT01QT05FTlRTX0FUSSAgICAweDg5NzQKKyNkZWZpbmUgR0xfQ09MT1JfQUxQSEFfUEFJUklOR19BVEkgICAgICAgIDB4ODk3NQorI2RlZmluZSBHTF9TV0laWkxFX1NUUl9BVEkgICAgICAgICAgICAgICAgMHg4OTc2CisjZGVmaW5lIEdMX1NXSVpaTEVfU1RRX0FUSSAgICAgICAgICAgICAgICAweDg5NzcKKyNkZWZpbmUgR0xfU1dJWlpMRV9TVFJfRFJfQVRJICAgICAgICAgICAgIDB4ODk3OAorI2RlZmluZSBHTF9TV0laWkxFX1NUUV9EUV9BVEkgICAgICAgICAgICAgMHg4OTc5CisjZGVmaW5lIEdMX1NXSVpaTEVfU1RSUV9BVEkgICAgICAgICAgICAgICAweDg5N0EKKyNkZWZpbmUgR0xfU1dJWlpMRV9TVFJRX0RRX0FUSSAgICAgICAgICAgIDB4ODk3QgorI2RlZmluZSBHTF9SRURfQklUX0FUSSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9HUkVFTl9CSVRfQVRJICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9CTFVFX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF8yWF9CSVRfQVRJICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF80WF9CSVRfQVRJICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF84WF9CSVRfQVRJICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9IQUxGX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTF9RVUFSVEVSX0JJVF9BVEkgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBHTF9FSUdIVEhfQklUX0FUSSAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBHTF9TQVRVUkFURV9CSVRfQVRJICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBHTF9DT01QX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9ORUdBVEVfQklUX0FUSSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9CSUFTX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3BuX3RyaWFuZ2xlcworI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfQVRJICAgICAgICAgICAgICAgMHg4N0YwCisjZGVmaW5lIEdMX01BWF9QTl9UUklBTkdMRVNfVEVTU0VMQVRJT05fTEVWRUxfQVRJIDB4ODdGMQorI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfUE9JTlRfTU9ERV9BVEkgICAgMHg4N0YyCisjZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19OT1JNQUxfTU9ERV9BVEkgICAweDg3RjMKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1RFU1NFTEFUSU9OX0xFVkVMX0FUSSAweDg3RjQKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1BPSU5UX01PREVfTElORUFSX0FUSSAweDg3RjUKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1BPSU5UX01PREVfQ1VCSUNfQVRJIDB4ODdGNgorI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfTk9STUFMX01PREVfTElORUFSX0FUSSAweDg3RjcKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX05PUk1BTF9NT0RFX1FVQURSQVRJQ19BVEkgMHg4N0Y4CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9TVEFUSUNfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4NzYwCisjZGVmaW5lIEdMX0RZTkFNSUNfQVRJICAgICAgICAgICAgICAgICAgICAweDg3NjEKKyNkZWZpbmUgR0xfUFJFU0VSVkVfQVRJICAgICAgICAgICAgICAgICAgIDB4ODc2MgorI2RlZmluZSBHTF9ESVNDQVJEX0FUSSAgICAgICAgICAgICAgICAgICAgMHg4NzYzCisjZGVmaW5lIEdMX09CSkVDVF9CVUZGRVJfU0laRV9BVEkgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfT0JKRUNUX0JVRkZFUl9VU0FHRV9BVEkgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9BUlJBWV9PQkpFQ1RfQlVGRkVSX0FUSSAgICAgICAgMHg4NzY2CisjZGVmaW5lIEdMX0FSUkFZX09CSkVDVF9PRkZTRVRfQVRJICAgICAgICAweDg3NjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfc2hhZGVyCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfRVhUICAgICAgICAgICAgICAweDg3ODAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9CSU5ESU5HX0VYVCAgICAgIDB4ODc4MQorI2RlZmluZSBHTF9PUF9JTkRFWF9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzgyCisjZGVmaW5lIEdMX09QX05FR0FURV9FWFQgICAgICAgICAgICAgICAgICAweDg3ODMKKyNkZWZpbmUgR0xfT1BfRE9UM19FWFQgICAgICAgICAgICAgICAgICAgIDB4ODc4NAorI2RlZmluZSBHTF9PUF9ET1Q0X0VYVCAgICAgICAgICAgICAgICAgICAgMHg4Nzg1CisjZGVmaW5lIEdMX09QX01VTF9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3ODYKKyNkZWZpbmUgR0xfT1BfQUREX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc4NworI2RlZmluZSBHTF9PUF9NQUREX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4Nzg4CisjZGVmaW5lIEdMX09QX0ZSQUNfRVhUICAgICAgICAgICAgICAgICAgICAweDg3ODkKKyNkZWZpbmUgR0xfT1BfTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc4QQorI2RlZmluZSBHTF9PUF9NSU5fRVhUICAgICAgICAgICAgICAgICAgICAgMHg4NzhCCisjZGVmaW5lIEdMX09QX1NFVF9HRV9FWFQgICAgICAgICAgICAgICAgICAweDg3OEMKKyNkZWZpbmUgR0xfT1BfU0VUX0xUX0VYVCAgICAgICAgICAgICAgICAgIDB4ODc4RAorI2RlZmluZSBHTF9PUF9DTEFNUF9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzhFCisjZGVmaW5lIEdMX09QX0ZMT09SX0VYVCAgICAgICAgICAgICAgICAgICAweDg3OEYKKyNkZWZpbmUgR0xfT1BfUk9VTkRfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc5MAorI2RlZmluZSBHTF9PUF9FWFBfQkFTRV8yX0VYVCAgICAgICAgICAgICAgMHg4NzkxCisjZGVmaW5lIEdMX09QX0xPR19CQVNFXzJfRVhUICAgICAgICAgICAgICAweDg3OTIKKyNkZWZpbmUgR0xfT1BfUE9XRVJfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc5MworI2RlZmluZSBHTF9PUF9SRUNJUF9FWFQgICAgICAgICAgICAgICAgICAgMHg4Nzk0CisjZGVmaW5lIEdMX09QX1JFQ0lQX1NRUlRfRVhUICAgICAgICAgICAgICAweDg3OTUKKyNkZWZpbmUgR0xfT1BfU1VCX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc5NgorI2RlZmluZSBHTF9PUF9DUk9TU19QUk9EVUNUX0VYVCAgICAgICAgICAgMHg4Nzk3CisjZGVmaW5lIEdMX09QX01VTFRJUExZX01BVFJJWF9FWFQgICAgICAgICAweDg3OTgKKyNkZWZpbmUgR0xfT1BfTU9WX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc5OQorI2RlZmluZSBHTF9PVVRQVVRfVkVSVEVYX0VYVCAgICAgICAgICAgICAgMHg4NzlBCisjZGVmaW5lIEdMX09VVFBVVF9DT0xPUjBfRVhUICAgICAgICAgICAgICAweDg3OUIKKyNkZWZpbmUgR0xfT1VUUFVUX0NPTE9SMV9FWFQgICAgICAgICAgICAgIDB4ODc5QworI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDBfRVhUICAgICAgMHg4NzlECisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMV9FWFQgICAgICAweDg3OUUKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyX0VYVCAgICAgIDB4ODc5RgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDNfRVhUICAgICAgMHg4N0EwCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JENF9FWFQgICAgICAweDg3QTEKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ1X0VYVCAgICAgIDB4ODdBMgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDZfRVhUICAgICAgMHg4N0EzCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEN19FWFQgICAgICAweDg3QTQKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ4X0VYVCAgICAgIDB4ODdBNQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDlfRVhUICAgICAgMHg4N0E2CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTBfRVhUICAgICAweDg3QTcKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxMV9FWFQgICAgIDB4ODdBOAorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDEyX0VYVCAgICAgMHg4N0E5CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTNfRVhUICAgICAweDg3QUEKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxNF9FWFQgICAgIDB4ODdBQgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE1X0VYVCAgICAgMHg4N0FDCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTZfRVhUICAgICAweDg3QUQKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxN19FWFQgICAgIDB4ODdBRQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE4X0VYVCAgICAgMHg4N0FGCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTlfRVhUICAgICAweDg3QjAKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyMF9FWFQgICAgIDB4ODdCMQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDIxX0VYVCAgICAgMHg4N0IyCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjJfRVhUICAgICAweDg3QjMKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyM19FWFQgICAgIDB4ODdCNAorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI0X0VYVCAgICAgMHg4N0I1CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjVfRVhUICAgICAweDg3QjYKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyNl9FWFQgICAgIDB4ODdCNworI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI3X0VYVCAgICAgMHg4N0I4CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjhfRVhUICAgICAweDg3QjkKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyOV9FWFQgICAgIDB4ODdCQQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDMwX0VYVCAgICAgMHg4N0JCCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMzFfRVhUICAgICAweDg3QkMKKyNkZWZpbmUgR0xfT1VUUFVUX0ZPR19FWFQgICAgICAgICAgICAgICAgIDB4ODdCRAorI2RlZmluZSBHTF9TQ0FMQVJfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4N0JFCisjZGVmaW5lIEdMX1ZFQ1RPUl9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3QkYKKyNkZWZpbmUgR0xfTUFUUklYX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODdDMAorI2RlZmluZSBHTF9WQVJJQU5UX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4N0MxCisjZGVmaW5lIEdMX0lOVkFSSUFOVF9FWFQgICAgICAgICAgICAgICAgICAweDg3QzIKKyNkZWZpbmUgR0xfTE9DQUxfQ09OU1RBTlRfRVhUICAgICAgICAgICAgIDB4ODdDMworI2RlZmluZSBHTF9MT0NBTF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4N0M0CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0lOU1RSVUNUSU9OU19FWFQgMHg4N0M1CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX1ZBUklBTlRTX0VYVCAweDg3QzYKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9TSEFERVJfSU5WQVJJQU5UU19FWFQgMHg4N0M3CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0xPQ0FMX0NPTlNUQU5UU19FWFQgMHg4N0M4CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0xPQ0FMU19FWFQgICAweDg3QzkKKyNkZWZpbmUgR0xfTUFYX09QVElNSVpFRF9WRVJURVhfU0hBREVSX0lOU1RSVUNUSU9OU19FWFQgMHg4N0NBCisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9WQVJJQU5UU19FWFQgMHg4N0NCCisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9MT0NBTF9DT05TVEFOVFNfRVhUIDB4ODdDQworI2RlZmluZSBHTF9NQVhfT1BUSU1JWkVEX1ZFUlRFWF9TSEFERVJfSU5WQVJJQU5UU19FWFQgMHg4N0NECisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9MT0NBTFNfRVhUIDB4ODdDRQorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0lOU1RSVUNUSU9OU19FWFQgMHg4N0NGCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfVkFSSUFOVFNfRVhUICAgICAweDg3RDAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9JTlZBUklBTlRTX0VYVCAgIDB4ODdEMQorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0xPQ0FMX0NPTlNUQU5UU19FWFQgMHg4N0QyCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfTE9DQUxTX0VYVCAgICAgICAweDg3RDMKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9PUFRJTUlaRURfRVhUICAgIDB4ODdENAorI2RlZmluZSBHTF9YX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Q1CisjZGVmaW5lIEdMX1lfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RDYKKyNkZWZpbmUgR0xfWl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdENworI2RlZmluZSBHTF9XX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Q4CisjZGVmaW5lIEdMX05FR0FUSVZFX1hfRVhUICAgICAgICAgICAgICAgICAweDg3RDkKKyNkZWZpbmUgR0xfTkVHQVRJVkVfWV9FWFQgICAgICAgICAgICAgICAgIDB4ODdEQQorI2RlZmluZSBHTF9ORUdBVElWRV9aX0VYVCAgICAgICAgICAgICAgICAgMHg4N0RCCisjZGVmaW5lIEdMX05FR0FUSVZFX1dfRVhUICAgICAgICAgICAgICAgICAweDg3REMKKyNkZWZpbmUgR0xfWkVST19FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODdERAorI2RlZmluZSBHTF9PTkVfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0RFCisjZGVmaW5lIEdMX05FR0FUSVZFX09ORV9FWFQgICAgICAgICAgICAgICAweDg3REYKKyNkZWZpbmUgR0xfTk9STUFMSVpFRF9SQU5HRV9FWFQgICAgICAgICAgIDB4ODdFMAorI2RlZmluZSBHTF9GVUxMX1JBTkdFX0VYVCAgICAgICAgICAgICAgICAgMHg4N0UxCisjZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0VYVCAgICAgICAgICAgICAweDg3RTIKKyNkZWZpbmUgR0xfTVZQX01BVFJJWF9FWFQgICAgICAgICAgICAgICAgIDB4ODdFMworI2RlZmluZSBHTF9WQVJJQU5UX1ZBTFVFX0VYVCAgICAgICAgICAgICAgMHg4N0U0CisjZGVmaW5lIEdMX1ZBUklBTlRfREFUQVRZUEVfRVhUICAgICAgICAgICAweDg3RTUKKyNkZWZpbmUgR0xfVkFSSUFOVF9BUlJBWV9TVFJJREVfRVhUICAgICAgIDB4ODdFNgorI2RlZmluZSBHTF9WQVJJQU5UX0FSUkFZX1RZUEVfRVhUICAgICAgICAgMHg4N0U3CisjZGVmaW5lIEdMX1ZBUklBTlRfQVJSQVlfRVhUICAgICAgICAgICAgICAweDg3RTgKKyNkZWZpbmUgR0xfVkFSSUFOVF9BUlJBWV9QT0lOVEVSX0VYVCAgICAgIDB4ODdFOQorI2RlZmluZSBHTF9JTlZBUklBTlRfVkFMVUVfRVhUICAgICAgICAgICAgMHg4N0VBCisjZGVmaW5lIEdMX0lOVkFSSUFOVF9EQVRBVFlQRV9FWFQgICAgICAgICAweDg3RUIKKyNkZWZpbmUgR0xfTE9DQUxfQ09OU1RBTlRfVkFMVUVfRVhUICAgICAgIDB4ODdFQworI2RlZmluZSBHTF9MT0NBTF9DT05TVEFOVF9EQVRBVFlQRV9FWFQgICAgMHg4N0VECisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X3N0cmVhbXMKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9TVFJFQU1TX0FUSSAgICAgICAgIDB4ODc2QgorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNMF9BVEkgICAgICAgICAgICAgMHg4NzZDCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU0xX0FUSSAgICAgICAgICAgICAweDg3NkQKKyNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTJfQVRJICAgICAgICAgICAgIDB4ODc2RQorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNM19BVEkgICAgICAgICAgICAgMHg4NzZGCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU00X0FUSSAgICAgICAgICAgICAweDg3NzAKKyNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTVfQVRJICAgICAgICAgICAgIDB4ODc3MQorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNNl9BVEkgICAgICAgICAgICAgMHg4NzcyCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU03X0FUSSAgICAgICAgICAgICAweDg3NzMKKyNkZWZpbmUgR0xfVkVSVEVYX1NPVVJDRV9BVEkgICAgICAgICAgICAgIDB4ODc3NAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9BVEkgICAgICAgICAgICAgIDB4ODc2OAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1RZUEVfQVRJICAgICAgICAgMHg4NzY5CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfUE9JTlRFUl9BVEkgICAgICAweDg3NkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9tZXNoX2FycmF5CisjZGVmaW5lIEdMX1FVQURfTUVTSF9TVU4gICAgICAgICAgICAgICAgICAweDg2MTQKKyNkZWZpbmUgR0xfVFJJQU5HTEVfTUVTSF9TVU4gICAgICAgICAgICAgIDB4ODYxNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX3NsaWNlX2FjY3VtCisjZGVmaW5lIEdMX1NMSUNFX0FDQ1VNX1NVTiAgICAgICAgICAgICAgICAweDg1Q0MKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX211bHRpc2FtcGxlX2ZpbHRlcl9oaW50CisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0ZJTFRFUl9ISU5UX05WICAgICAweDg1MzQKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2RlcHRoX2NsYW1wCisjZGVmaW5lIEdMX0RFUFRIX0NMQU1QX05WICAgICAgICAgICAgICAgICAweDg2NEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX29jY2x1c2lvbl9xdWVyeQorI2RlZmluZSBHTF9QSVhFTF9DT1VOVEVSX0JJVFNfTlYgICAgICAgICAgMHg4ODY0CisjZGVmaW5lIEdMX0NVUlJFTlRfT0NDTFVTSU9OX1FVRVJZX0lEX05WICAweDg4NjUKKyNkZWZpbmUgR0xfUElYRUxfQ09VTlRfTlYgICAgICAgICAgICAgICAgIDB4ODg2NgorI2RlZmluZSBHTF9QSVhFTF9DT1VOVF9BVkFJTEFCTEVfTlYgICAgICAgMHg4ODY3CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wb2ludF9zcHJpdGUKKyNkZWZpbmUgR0xfUE9JTlRfU1BSSVRFX05WICAgICAgICAgICAgICAgIDB4ODg2MQorI2RlZmluZSBHTF9DT09SRF9SRVBMQUNFX05WICAgICAgICAgICAgICAgMHg4ODYyCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURV9SX01PREVfTlYgICAgICAgICAweDg4NjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyMworI2RlZmluZSBHTF9PRkZTRVRfUFJPSkVDVElWRV9URVhUVVJFXzJEX05WIDB4ODg1MAorI2RlZmluZSBHTF9PRkZTRVRfUFJPSkVDVElWRV9URVhUVVJFXzJEX1NDQUxFX05WIDB4ODg1MQorI2RlZmluZSBHTF9PRkZTRVRfUFJPSkVDVElWRV9URVhUVVJFX1JFQ1RBTkdMRV9OViAweDg4NTIKKyNkZWZpbmUgR0xfT0ZGU0VUX1BST0pFQ1RJVkVfVEVYVFVSRV9SRUNUQU5HTEVfU0NBTEVfTlYgMHg4ODUzCisjZGVmaW5lIEdMX09GRlNFVF9ISUxPX1RFWFRVUkVfMkRfTlYgICAgICAweDg4NTQKKyNkZWZpbmUgR0xfT0ZGU0VUX0hJTE9fVEVYVFVSRV9SRUNUQU5HTEVfTlYgMHg4ODU1CisjZGVmaW5lIEdMX09GRlNFVF9ISUxPX1BST0pFQ1RJVkVfVEVYVFVSRV8yRF9OViAweDg4NTYKKyNkZWZpbmUgR0xfT0ZGU0VUX0hJTE9fUFJPSkVDVElWRV9URVhUVVJFX1JFQ1RBTkdMRV9OViAweDg4NTcKKyNkZWZpbmUgR0xfREVQRU5ERU5UX0hJTE9fVEVYVFVSRV8yRF9OViAgIDB4ODg1OAorI2RlZmluZSBHTF9ERVBFTkRFTlRfUkdCX1RFWFRVUkVfM0RfTlYgICAgMHg4ODU5CisjZGVmaW5lIEdMX0RFUEVOREVOVF9SR0JfVEVYVFVSRV9DVUJFX01BUF9OViAweDg4NUEKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfUEFTU19USFJPVUdIX05WICAgIDB4ODg1QgorI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9URVhUVVJFXzFEX05WICAgICAgMHg4ODVDCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX0FGRklORV9ERVBUSF9SRVBMQUNFX05WIDB4ODg1RAorI2RlZmluZSBHTF9ISUxPOF9OViAgICAgICAgICAgICAgICAgICAgICAgMHg4ODVFCisjZGVmaW5lIEdMX1NJR05FRF9ISUxPOF9OViAgICAgICAgICAgICAgICAweDg4NUYKKyNkZWZpbmUgR0xfRk9SQ0VfQkxVRV9UT19PTkVfTlYgICAgICAgICAgIDB4ODg2MAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zaGFkb3dfZnVuY3MKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX3R3b19zaWRlCisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVF9UV09fU0lERV9FWFQgICAgICAweDg5MTAKKyNkZWZpbmUgR0xfQUNUSVZFX1NURU5DSUxfRkFDRV9FWFQgICAgICAgIDB4ODkxMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHRfZnJhZ21lbnRfc2hhZGVyCisjZGVmaW5lIEdMX1RFWFRfRlJBR01FTlRfU0hBREVSX0FUSSAgICAgICAweDgyMDAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlCisjZGVmaW5lIEdMX1VOUEFDS19DTElFTlRfU1RPUkFHRV9BUFBMRSAgICAweDg1QjIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9BUFBMRSAgICAgICAgICAgIDB4ODc2OAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1RZUEVfQVBQTEUgICAgICAgMHg4NzY5CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfUE9JTlRFUl9BUFBMRSAgICAweDg3NkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2ZlbmNlCisjZGVmaW5lIEdMX0RSQVdfUElYRUxTX0FQUExFICAgICAgICAgICAgICAweDhBMEEKKyNkZWZpbmUgR0xfRkVOQ0VfQVBQTEUgICAgICAgICAgICAgICAgICAgIDB4OEEwQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQklORElOR19BUFBMRSAgICAgMHg4NUI1CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfcmFuZ2UKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX0FQUExFICAgICAgIDB4ODUxRAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfTEVOR1RIX0FQUExFIDB4ODUxRQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU1RPUkFHRV9ISU5UX0FQUExFIDB4ODUxRgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfUE9JTlRFUl9BUFBMRSAweDg1MjEKKyNkZWZpbmUgR0xfU1RPUkFHRV9DQUNIRURfQVBQTEUgICAgICAgICAgIDB4ODVCRQorI2RlZmluZSBHTF9TVE9SQUdFX1NIQVJFRF9BUFBMRSAgICAgICAgICAgMHg4NUJGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV95Y2Jjcl80MjIKKyNkZWZpbmUgR0xfWUNCQ1JfNDIyX0FQUExFICAgICAgICAgICAgICAgIDB4ODVCOQorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUgICAgICAgMHg4NUJBCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfQVBQTEUgICAweDg1QkIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1MzX3MzdGMKKyNkZWZpbmUgR0xfUkdCX1MzVEMgICAgICAgICAgICAgICAgICAgICAgIDB4ODNBMAorI2RlZmluZSBHTF9SR0I0X1MzVEMgICAgICAgICAgICAgICAgICAgICAgMHg4M0ExCisjZGVmaW5lIEdMX1JHQkFfUzNUQyAgICAgICAgICAgICAgICAgICAgICAweDgzQTIKKyNkZWZpbmUgR0xfUkdCQTRfUzNUQyAgICAgICAgICAgICAgICAgICAgIDB4ODNBMworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2RyYXdfYnVmZmVycworI2RlZmluZSBHTF9NQVhfRFJBV19CVUZGRVJTX0FUSSAgICAgICAgICAgMHg4ODI0CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMF9BVEkgICAgICAgICAgICAgICAweDg4MjUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxX0FUSSAgICAgICAgICAgICAgIDB4ODgyNgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjJfQVRJICAgICAgICAgICAgICAgMHg4ODI3CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSM19BVEkgICAgICAgICAgICAgICAweDg4MjgKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI0X0FUSSAgICAgICAgICAgICAgIDB4ODgyOQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjVfQVRJICAgICAgICAgICAgICAgMHg4ODJBCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNl9BVEkgICAgICAgICAgICAgICAweDg4MkIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI3X0FUSSAgICAgICAgICAgICAgIDB4ODgyQworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjhfQVRJICAgICAgICAgICAgICAgMHg4ODJECisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOV9BVEkgICAgICAgICAgICAgICAweDg4MkUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMF9BVEkgICAgICAgICAgICAgIDB4ODgyRgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjExX0FUSSAgICAgICAgICAgICAgMHg4ODMwCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTJfQVRJICAgICAgICAgICAgICAweDg4MzEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxM19BVEkgICAgICAgICAgICAgIDB4ODgzMgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE0X0FUSSAgICAgICAgICAgICAgMHg4ODMzCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTVfQVRJICAgICAgICAgICAgICAweDg4MzQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQKKyNkZWZpbmUgR0xfVFlQRV9SR0JBX0ZMT0FUX0FUSSAgICAgICAgICAgIDB4ODgyMAorI2RlZmluZSBHTF9DT0xPUl9DTEVBUl9VTkNMQU1QRURfVkFMVUVfQVRJIDB4ODgzNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfZW52X2NvbWJpbmUzCisjZGVmaW5lIEdMX01PRFVMQVRFX0FERF9BVEkgICAgICAgICAgICAgICAweDg3NDQKKyNkZWZpbmUgR0xfTU9EVUxBVEVfU0lHTkVEX0FERF9BVEkgICAgICAgIDB4ODc0NQorI2RlZmluZSBHTF9NT0RVTEFURV9TVUJUUkFDVF9BVEkgICAgICAgICAgMHg4NzQ2CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dHVyZV9mbG9hdAorI2RlZmluZSBHTF9SR0JBX0ZMT0FUMzJfQVRJICAgICAgICAgICAgICAgMHg4ODE0CisjZGVmaW5lIEdMX1JHQl9GTE9BVDMyX0FUSSAgICAgICAgICAgICAgICAweDg4MTUKKyNkZWZpbmUgR0xfQUxQSEFfRkxPQVQzMl9BVEkgICAgICAgICAgICAgIDB4ODgxNgorI2RlZmluZSBHTF9JTlRFTlNJVFlfRkxPQVQzMl9BVEkgICAgICAgICAgMHg4ODE3CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9GTE9BVDMyX0FUSSAgICAgICAgICAweDg4MTgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX0ZMT0FUMzJfQVRJICAgIDB4ODgxOQorI2RlZmluZSBHTF9SR0JBX0ZMT0FUMTZfQVRJICAgICAgICAgICAgICAgMHg4ODFBCisjZGVmaW5lIEdMX1JHQl9GTE9BVDE2X0FUSSAgICAgICAgICAgICAgICAweDg4MUIKKyNkZWZpbmUgR0xfQUxQSEFfRkxPQVQxNl9BVEkgICAgICAgICAgICAgIDB4ODgxQworI2RlZmluZSBHTF9JTlRFTlNJVFlfRkxPQVQxNl9BVEkgICAgICAgICAgMHg4ODFECisjZGVmaW5lIEdMX0xVTUlOQU5DRV9GTE9BVDE2X0FUSSAgICAgICAgICAweDg4MUUKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX0ZMT0FUMTZfQVRJICAgIDB4ODgxRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZmxvYXRfYnVmZmVyCisjZGVmaW5lIEdMX0ZMT0FUX1JfTlYgICAgICAgICAgICAgICAgICAgICAweDg4ODAKKyNkZWZpbmUgR0xfRkxPQVRfUkdfTlYgICAgICAgICAgICAgICAgICAgIDB4ODg4MQorI2RlZmluZSBHTF9GTE9BVF9SR0JfTlYgICAgICAgICAgICAgICAgICAgMHg4ODgyCisjZGVmaW5lIEdMX0ZMT0FUX1JHQkFfTlYgICAgICAgICAgICAgICAgICAweDg4ODMKKyNkZWZpbmUgR0xfRkxPQVRfUjE2X05WICAgICAgICAgICAgICAgICAgIDB4ODg4NAorI2RlZmluZSBHTF9GTE9BVF9SMzJfTlYgICAgICAgICAgICAgICAgICAgMHg4ODg1CisjZGVmaW5lIEdMX0ZMT0FUX1JHMTZfTlYgICAgICAgICAgICAgICAgICAweDg4ODYKKyNkZWZpbmUgR0xfRkxPQVRfUkczMl9OViAgICAgICAgICAgICAgICAgIDB4ODg4NworI2RlZmluZSBHTF9GTE9BVF9SR0IxNl9OViAgICAgICAgICAgICAgICAgMHg4ODg4CisjZGVmaW5lIEdMX0ZMT0FUX1JHQjMyX05WICAgICAgICAgICAgICAgICAweDg4ODkKKyNkZWZpbmUgR0xfRkxPQVRfUkdCQTE2X05WICAgICAgICAgICAgICAgIDB4ODg4QQorI2RlZmluZSBHTF9GTE9BVF9SR0JBMzJfTlYgICAgICAgICAgICAgICAgMHg4ODhCCisjZGVmaW5lIEdMX1RFWFRVUkVfRkxPQVRfQ09NUE9ORU5UU19OViAgICAweDg4OEMKKyNkZWZpbmUgR0xfRkxPQVRfQ0xFQVJfQ09MT1JfVkFMVUVfTlYgICAgIDB4ODg4RAorI2RlZmluZSBHTF9GTE9BVF9SR0JBX01PREVfTlYgICAgICAgICAgICAgMHg4ODhFCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9QUk9HUkFNX0xPQ0FMX1BBUkFNRVRFUlNfTlYgMHg4ODY4CisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fTlYgICAgICAgICAgICAweDg4NzAKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfQ09PUkRTX05WICAgICAgICAgIDB4ODg3MQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUU19OViAgICAgMHg4ODcyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fQklORElOR19OViAgICAweDg4NzMKKyNkZWZpbmUgR0xfUFJPR1JBTV9FUlJPUl9TVFJJTkdfTlYgICAgICAgIDB4ODg3NAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfaGFsZl9mbG9hdAorI2RlZmluZSBHTF9IQUxGX0ZMT0FUX05WICAgICAgICAgICAgICAgICAgMHgxNDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9waXhlbF9kYXRhX3JhbmdlCisjZGVmaW5lIEdMX1dSSVRFX1BJWEVMX0RBVEFfUkFOR0VfTlYgICAgICAweDg4NzgKKyNkZWZpbmUgR0xfUkVBRF9QSVhFTF9EQVRBX1JBTkdFX05WICAgICAgIDB4ODg3OQorI2RlZmluZSBHTF9XUklURV9QSVhFTF9EQVRBX1JBTkdFX0xFTkdUSF9OViAweDg4N0EKKyNkZWZpbmUgR0xfUkVBRF9QSVhFTF9EQVRBX1JBTkdFX0xFTkdUSF9OViAweDg4N0IKKyNkZWZpbmUgR0xfV1JJVEVfUElYRUxfREFUQV9SQU5HRV9QT0lOVEVSX05WIDB4ODg3QworI2RlZmluZSBHTF9SRUFEX1BJWEVMX0RBVEFfUkFOR0VfUE9JTlRFUl9OViAweDg4N0QKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ByaW1pdGl2ZV9yZXN0YXJ0CisjZGVmaW5lIEdMX1BSSU1JVElWRV9SRVNUQVJUX05WICAgICAgICAgICAweDg1NTgKKyNkZWZpbmUgR0xfUFJJTUlUSVZFX1JFU1RBUlRfSU5ERVhfTlYgICAgIDB4ODU1OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9leHBhbmRfbm9ybWFsCisjZGVmaW5lIEdMX1RFWFRVUkVfVU5TSUdORURfUkVNQVBfTU9ERV9OViAweDg4OEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX21hcF9vYmplY3RfYnVmZmVyCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfc2VwYXJhdGVfc3RlbmNpbAorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRlVOQ19BVEkgICAgICAgICAgMHg4ODAwCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GQUlMX0FUSSAgICAgICAgICAweDg4MDEKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTF9BVEkgMHg4ODAyCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1NfQVRJIDB4ODgwMworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3ZlcnRleF9hdHRyaWJfYXJyYXlfb2JqZWN0CisjZW5kaWYKKworI2lmbmRlZiBHTF9PRVNfcmVhZF9mb3JtYXQKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAweDhCOUEKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTIDB4OEI5QgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RlcHRoX2JvdW5kc190ZXN0CisjZGVmaW5lIEdMX0RFUFRIX0JPVU5EU19URVNUX0VYVCAgICAgICAgICAweDg4OTAKKyNkZWZpbmUgR0xfREVQVEhfQk9VTkRTX0VYVCAgICAgICAgICAgICAgIDB4ODg5MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbWlycm9yX2NsYW1wCisjZGVmaW5lIEdMX01JUlJPUl9DTEFNUF9FWFQgICAgICAgICAgICAgICAweDg3NDIKKyNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfRVhUICAgICAgIDB4ODc0MworI2RlZmluZSBHTF9NSVJST1JfQ0xBTVBfVE9fQk9SREVSX0VYVCAgICAgMHg4OTEyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCX0VYVCAgICAgICAgIEdMX0JMRU5EX0VRVUFUSU9OCisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBX0VYVCAgICAgICAweDg4M0QKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FfcGFja19pbnZlcnQKKyNkZWZpbmUgR0xfUEFDS19JTlZFUlRfTUVTQSAgICAgICAgICAgICAgIDB4ODc1OAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV95Y2Jjcl90ZXh0dXJlCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9NRVNBICAgICAgICAweDg1QkEKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9NRVNBICAgIDB4ODVCQgorI2RlZmluZSBHTF9ZQ0JDUl9NRVNBICAgICAgICAgICAgICAgICAgICAgMHg4NzU3CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9FWFQgICAgICAgICAgMHg4OEVCCisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfRVhUICAgICAgICAweDg4RUMKKyNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElOR19FWFQgIDB4ODhFRAorI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkdfRVhUIDB4ODhFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZyYWdtZW50X3Byb2dyYW0yCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0VYRUNfSU5TVFJVQ1RJT05TX05WIDB4ODhGNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9DQUxMX0RFUFRIX05WICAgICAgMHg4OEY1CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0lGX0RFUFRIX05WICAgICAgICAweDg4RjYKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTE9PUF9ERVBUSF9OViAgICAgIDB4ODhGNworI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9MT09QX0NPVU5UX05WICAgICAgMHg4OEY4CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTJfb3B0aW9uCisvKiByZXVzZSBHTF9NQVhfUFJPR1JBTV9FWEVDX0lOU1RSVUNUSU9OU19OViAqLworLyogcmV1c2UgR0xfTUFYX1BST0dSQU1fQ0FMTF9ERVBUSF9OViAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0zCisvKiByZXVzZSBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX0VYVCAweDA1MDYKKyNkZWZpbmUgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX0VYVCAgICAgIDB4ODRFOAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAgICAgICAgMHg4Q0E2CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX0VYVCAgICAgICAweDhDQTcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV9FWFQgMHg4Q0QwCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfRVhUIDB4OENEMQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfRVhUIDB4OENEMgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9FWFQgMHg4Q0QzCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV8zRF9aT0ZGU0VUX0VYVCAweDhDRDQKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUICAgICAgIDB4OENENQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfRVhUIDB4OENENgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9FWFQgMHg4Q0Q3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFVQTElDQVRFX0FUVEFDSE1FTlRfRVhUIDB4OENEOAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfRVhUIDB4OENEOQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfRVhUIDB4OENEQQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RSQVdfQlVGRkVSX0VYVCAweDhDREIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9SRUFEX0JVRkZFUl9FWFQgMHg4Q0RDCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEX0VYVCAgICAweDhDREQKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX0FUVEFDSE1FTlRTX0VYVCAgICAgIDB4OENERgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQgICAgICAgICAgMHg4Q0UwCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxX0VYVCAgICAgICAgICAweDhDRTEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDJfRVhUICAgICAgICAgIDB4OENFMgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UM19FWFQgICAgICAgICAgMHg4Q0UzCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ0X0VYVCAgICAgICAgICAweDhDRTQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDVfRVhUICAgICAgICAgIDB4OENFNQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNl9FWFQgICAgICAgICAgMHg4Q0U2CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ3X0VYVCAgICAgICAgICAweDhDRTcKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDhfRVhUICAgICAgICAgIDB4OENFOAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOV9FWFQgICAgICAgICAgMHg4Q0U5CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMF9FWFQgICAgICAgICAweDhDRUEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDExX0VYVCAgICAgICAgIDB4OENFQgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTJfRVhUICAgICAgICAgMHg4Q0VDCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxM19FWFQgICAgICAgICAweDhDRUQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDE0X0VYVCAgICAgICAgIDB4OENFRQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTVfRVhUICAgICAgICAgMHg4Q0VGCisjZGVmaW5lIEdMX0RFUFRIX0FUVEFDSE1FTlRfRVhUICAgICAgICAgICAweDhEMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX0VYVCAgICAgICAgIDB4OEQyMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9FWFQgICAgICAgICAgICAgICAgMHg4RDQwCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9FWFQgICAgICAgICAgICAgICAweDhENDEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1dJRFRIX0VYVCAgICAgICAgIDB4OEQ0MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX0VYVCAgICAgICAgMHg4RDQzCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRfRVhUIDB4OEQ0NAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYMV9FWFQgICAgICAgICAgICAgMHg4RDQ2CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg0X0VYVCAgICAgICAgICAgICAweDhENDcKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDhfRVhUICAgICAgICAgICAgIDB4OEQ0OAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYMTZfRVhUICAgICAgICAgICAgMHg4RDQ5CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRV9FWFQgICAgICAweDhENTAKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVfRVhUICAgIDB4OEQ1MQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX0VYVCAgICAgMHg4RDUyCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFX0VYVCAgICAweDhENTMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkVfRVhUICAgIDB4OEQ1NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX0VYVCAgMHg4RDU1CisjZW5kaWYKKworI2lmbmRlZiBHTF9HUkVNRURZX3N0cmluZ19tYXJrZXIKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWZuZGVmIEdMX1ZFUlNJT05fMl8wCisvKiBHTCB0eXBlIGZvciBwcm9ncmFtL3NoYWRlciB0ZXh0ICovCit0eXBlZGVmIGNoYXIgR0xjaGFyOwkJCS8qIG5hdGl2ZSBjaGFyYWN0ZXIgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV81CisvKiBHTCB0eXBlcyBmb3IgaGFuZGxpbmcgbGFyZ2UgdmVydGV4IGJ1ZmZlciBvYmplY3RzICovCisjaWZkZWYgX19BUFBMRV9fCit0eXBlZGVmIGxvbmcgR0xpbnRwdHI7Cit0eXBlZGVmIGxvbmcgR0xzaXplaXB0cjsKKyNlbHNlCit0eXBlZGVmIHB0cmRpZmZfdCBHTGludHB0cjsKK3R5cGVkZWYgcHRyZGlmZl90IEdMc2l6ZWlwdHI7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdAorLyogR0wgdHlwZXMgZm9yIGhhbmRsaW5nIGxhcmdlIHZlcnRleCBidWZmZXIgb2JqZWN0cyAqLworI2lmZGVmIF9fQVBQTEVfXwordHlwZWRlZiBsb25nIEdMaW50cHRyQVJCOwordHlwZWRlZiBsb25nIEdMc2l6ZWlwdHJBUkI7CisjZWxzZQordHlwZWRlZiBwdHJkaWZmX3QgR0xpbnRwdHJBUkI7Cit0eXBlZGVmIHB0cmRpZmZfdCBHTHNpemVpcHRyQVJCOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX29iamVjdHMKKy8qIEdMIHR5cGVzIGZvciBoYW5kbGluZyBzaGFkZXIgb2JqZWN0IGhhbmRsZXMgYW5kIHByb2dyYW0vc2hhZGVyIHRleHQgKi8KK3R5cGVkZWYgY2hhciBHTGNoYXJBUkI7CQkvKiBuYXRpdmUgY2hhcmFjdGVyICovCisjaWYgZGVmaW5lZChfX0FQUExFX18pCit0eXBlZGVmIHZvaWQgKkdMaGFuZGxlQVJCOwkvKiBzaGFkZXIgb2JqZWN0IGhhbmRsZSAqLworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMaGFuZGxlQVJCOwkvKiBzaGFkZXIgb2JqZWN0IGhhbmRsZSAqLworI2VuZGlmCisjZW5kaWYKKworLyogR0wgdHlwZXMgZm9yICJoYWxmIiBwcmVjaXNpb24gKHMxMGU1KSBmbG9hdCBkYXRhIGluIGhvc3QgbWVtb3J5ICovCisjaWZuZGVmIEdMX0FSQl9oYWxmX2Zsb2F0X3BpeGVsCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEdMaGFsZkFSQjsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2hhbGZfZmxvYXQKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgR0xoYWxmTlY7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfMgorI2RlZmluZSBHTF9WRVJTSU9OXzFfMiAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kQ29sb3IgKEdMY2xhbXBmLCBHTGNsYW1wZiwgR0xjbGFtcGYsIEdMY2xhbXBmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRzIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyZnYgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVQYXJhbWV0ZXJpdiAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlDb2xvclRhYmxlIChHTGVudW0sIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2IChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclN1YlRhYmxlIChHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbG9yU3ViVGFibGUgKEdMZW51bSwgR0xzaXplaSwgR0xpbnQsIEdMaW50LCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjFEIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjJEIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmZ2IChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmkgKEdMZW51bSwgR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpdiAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlDb252b2x1dGlvbkZpbHRlcjFEIChHTGVudW0sIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIyRCAoR0xlbnVtLCBHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25GaWx0ZXIgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2IChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcml2IChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2VwYXJhYmxlRmlsdGVyIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKiwgR0x2b2lkICosIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZXBhcmFibGVGaWx0ZXIyRCAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKiwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbSAoR0xlbnVtLCBHTGJvb2xlYW4sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyZnYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2IChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4IChHTGVudW0sIEdMYm9vbGVhbiwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJmdiAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4UGFyYW1ldGVyaXYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaXN0b2dyYW0gKEdMZW51bSwgR0xzaXplaSwgR0xlbnVtLCBHTGJvb2xlYW4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1pbm1heCAoR0xlbnVtLCBHTGVudW0sIEdMYm9vbGVhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVzZXRIaXN0b2dyYW0gKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVzZXRNaW5tYXggKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UzRCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50LCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlM0QgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlM0QgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVORENPTE9SUFJPQykgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlBST0MpIChHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRTUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SVEFCTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlNVQlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09MT1JTVUJUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05GSUxURVIxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05GSUxURVIyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSRlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTlZPTFVUSU9ORklMVEVSMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTlZPTFVUSU9ORklMVEVSMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9ORklMVEVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05QQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9OUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0VQQVJBQkxFRklMVEVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnJvdywgR0x2b2lkICpjb2x1bW4sIEdMdm9pZCAqc3Bhbik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFUEFSQUJMRUZJTFRFUjJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnJvdywgY29uc3QgR0x2b2lkICpjb2x1bW4pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTVBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSElTVE9HUkFNUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNSU5NQVhQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU0VUSElTVE9HUkFNUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNFVE1JTk1BWFBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzMKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmUgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFkIChHTGVudW0sIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWR2IChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZiAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWZ2IChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFpIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWl2IChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxcyAoR0xlbnVtLCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXN2IChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkdiAoR0xlbnVtLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmYgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmdiAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaSAoR0xlbnVtLCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaXYgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc3YgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2QgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkdiAoR0xlbnVtLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2YgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNmdiAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaSAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2l2IChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzcyAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3N2IChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRkIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGR2IChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZiAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGZ2IChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRpIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGl2IChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0cyAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHN2IChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGQgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhmIChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkIChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSAoR0xjbGFtcGYsIEdMYm9vbGVhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlM0QgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTFEIChHTGVudW0sIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0QgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTFEIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tcHJlc3NlZFRleEltYWdlIChHTGVudW0sIEdMaW50LCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVURVhUVVJFUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UQUNUSVZFVEVYVFVSRVBST0MpIChHTGVudW0gdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUlQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM1NQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU1ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByLCBHTGRvdWJsZSBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENElQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciwgR0xzaG9ydCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWEZQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURUUkFOU1BPU0VNQVRSSVhEUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWEZQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRUUkFOU1BPU0VNQVRSSVhEUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFQ09WRVJBR0VQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NUFJFU1NFRFRFWElNQUdFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTHZvaWQgKmltZyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfNAorI2RlZmluZSBHTF9WRVJTSU9OXzFfNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkZiAoR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRmdiAoY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGQgKEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGR2IChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZFBvaW50ZXIgKEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0FycmF5cyAoR0xlbnVtLCBHTGludCAqLCBHTHNpemVpICosIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzIChHTGVudW0sIGNvbnN0IEdMc2l6ZWkgKiwgR0xlbnVtLCBjb25zdCBHTHZvaWQqICosIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZiAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZ2IChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJpIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcml2IChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2IgKEdMYnl0ZSwgR0xieXRlLCBHTGJ5dGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2J2IChjb25zdCBHTGJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZCAoR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZHYgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2YgKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2Z2IChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2kgKEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2l2IChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNzIChHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNzdiAoY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1YiAoR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWJ2IChjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VpIChHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1aXYgKGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1cyAoR0x1c2hvcnQsIEdMdXNob3J0LCBHTHVzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdXN2IChjb25zdCBHTHVzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvclBvaW50ZXIgKEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZCAoR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZHYgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmIChHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZnYgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmkgKEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMml2IChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MycyAoR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMnN2IChjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZHYgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZnYgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2kgKEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpdiAoY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3MgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzdiAoY29uc3QgR0xzaG9ydCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFUFJPQykgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERlBST0MpIChHTGZsb2F0IGNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGVlBST0MpIChjb25zdCBHTGZsb2F0ICpjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERFBST0MpIChHTGRvdWJsZSBjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERFZQUk9DKSAoY29uc3QgR0xkb3VibGUgKmNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRQT0lOVEVSUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXQVJSQVlTUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRTUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUklQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQlBST0MpIChHTGJ5dGUgcmVkLCBHTGJ5dGUgZ3JlZW4sIEdMYnl0ZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQlZQUk9DKSAoY29uc3QgR0xieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRFBST0MpIChHTGRvdWJsZSByZWQsIEdMZG91YmxlIGdyZWVuLCBHTGRvdWJsZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRFZQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGUFJPQykgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGVlBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSVBST0MpIChHTGludCByZWQsIEdMaW50IGdyZWVuLCBHTGludCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSVZQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTUFJPQykgKEdMc2hvcnQgcmVkLCBHTHNob3J0IGdyZWVuLCBHTHNob3J0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTVlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUJQUk9DKSAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VCVlBST0MpIChjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUlQUk9DKSAoR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLCBHTHVpbnQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VJVlBST0MpIChjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVU1BST0MpIChHTHVzaG9ydCByZWQsIEdMdXNob3J0IGdyZWVuLCBHTHVzaG9ydCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVVNWUFJPQykgKGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQT0lOVEVSUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJEVlBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MySVBST0MpIChHTGludCB4LCBHTGludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklWUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMlNQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyU1ZQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNEUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRFZQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRlBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSVBST0MpIChHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lWUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNTVlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV81CisjZGVmaW5lIEdMX1ZFUlNJT05fMV81IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUXVlcmllcyAoR0xzaXplaSwgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVF1ZXJpZXMgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUXVlcnkgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5RdWVyeSAoR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFF1ZXJ5IChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5aXYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdGl2IChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3R1aXYgKEdMdWludCwgR0xlbnVtLCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlciAoR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5CdWZmZXJzIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0J1ZmZlciAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJEYXRhIChHTGVudW0sIEdMc2l6ZWlwdHIsIGNvbnN0IEdMdm9pZCAqLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJ1ZmZlclN1YkRhdGEgKEdMZW51bSwgR0xpbnRwdHIsIEdMc2l6ZWlwdHIsIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJTdWJEYXRhIChHTGVudW0sIEdMaW50cHRyLCBHTHNpemVpcHRyLCBHTHZvaWQgKik7CitHTEFQSSBHTHZvaWQqIEFQSUVOVFJZIGdsTWFwQnVmZmVyIChHTGVudW0sIEdMZW51bSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlciAoR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2IChHTGVudW0sIEdMZW51bSwgR0x2b2lkKiAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlFVRVJJRVNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVFVRVJJRVNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNRVUVSWVBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlFVRVJZUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVORFFVRVJZUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWUlWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUSVZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVFVJVlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVCVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOQlVGRkVSU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNCVUZGRVJQUk9DKSAoR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUkRBVEFQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUlNVQkRBVEFQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlNVQkRBVEFQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIEdMdm9pZCogKEFQSUVOVFJZUCBQRk5HTE1BUEJVRkZFUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xVTk1BUEJVRkZFUlBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUE9JTlRFUlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgR0xfVkVSU0lPTl8yXzAgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKEdMZW51bSwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QnVmZmVycyAoR0xzaXplaSwgY29uc3QgR0xlbnVtICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxPcFNlcGFyYXRlIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUgKEdMZW51bSwgR0xlbnVtLCBHTGludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsTWFza1NlcGFyYXRlIChHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQXR0YWNoU2hhZGVyIChHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEF0dHJpYkxvY2F0aW9uIChHTHVpbnQsIEdMdWludCwgY29uc3QgR0xjaGFyICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXBpbGVTaGFkZXIgKEdMdWludCk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xDcmVhdGVQcm9ncmFtICh2b2lkKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbENyZWF0ZVNoYWRlciAoR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVNoYWRlciAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXRhY2hTaGFkZXIgKEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlQXR0cmliIChHTHVpbnQsIEdMdWludCwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGludCAqLCBHTGVudW0gKiwgR0xjaGFyICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm0gKEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMaW50ICosIEdMZW51bSAqLCBHTGNoYXIgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXR0YWNoZWRTaGFkZXJzIChHTHVpbnQsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0x1aW50ICopOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRBdHRyaWJMb2NhdGlvbiAoR0x1aW50LCBjb25zdCBHTGNoYXIgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbWl2IChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUluZm9Mb2cgKEdMdWludCwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGNoYXIgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhZGVyaXYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTaGFkZXJJbmZvTG9nIChHTHVpbnQsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0xjaGFyICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNoYWRlclNvdXJjZSAoR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMY2hhciAqKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0VW5pZm9ybUxvY2F0aW9uIChHTHVpbnQsIGNvbnN0IEdMY2hhciAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtZnYgKEdMdWludCwgR0xpbnQsIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybWl2IChHTHVpbnQsIEdMaW50LCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJkdiAoR0x1aW50LCBHTGVudW0sIEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmZ2IChHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2IChHTHVpbnQsIEdMZW51bSwgR0x2b2lkKiAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUHJvZ3JhbSAoR0x1aW50KTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzU2hhZGVyIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpbmtQcm9ncmFtIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlclNvdXJjZSAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGNoYXIqICosIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVzZVByb2dyYW0gKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmIChHTGludCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmIChHTGludCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNmIChHTGludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmIChHTGludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpIChHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaSAoR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpIChHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpIChHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xZnYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yZnYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zZnYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00ZnYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xaXYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMml2IChHTGludCwgR0xzaXplaSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpdiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00aXYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MmZ2IChHTGludCwgR0xzaXplaSwgR0xib29sZWFuLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzZnYgKEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDRmdiAoR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYWxpZGF0ZVByb2dyYW0gKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWQgKEdMdWludCwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFkdiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZiAoR0x1aW50LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZnYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxcyAoR0x1aW50LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc3YgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZCAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkdiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIycyAoR0x1aW50LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc3YgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZCAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZHYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2YgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2IChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3MgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3N2IChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5idiAoR0x1aW50LCBjb25zdCBHTGJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5pdiAoR0x1aW50LCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnN2IChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51YiAoR0x1aW50LCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVidiAoR0x1aW50LCBjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWl2IChHTHVpbnQsIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVzdiAoR0x1aW50LCBjb25zdCBHTHVzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0YnYgKEdMdWludCwgY29uc3QgR0xieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZHYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGYgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZ2IChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGl2IChHTHVpbnQsIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzdiAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1YnYgKEdMdWludCwgY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWl2IChHTHVpbnQsIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dXN2IChHTHVpbnQsIGNvbnN0IEdMdXNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXIgKEdMdWludCwgR0xpbnQsIEdMZW51bSwgR0xib29sZWFuLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OU0VQQVJBVEVQUk9DKSAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQlVGRkVSU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxPUFNFUEFSQVRFUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSBkcGZhaWwsIEdMZW51bSBkcHBhc3MpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVEVOQ0lMRlVOQ1NFUEFSQVRFUFJPQykgKEdMZW51bSBmcm9udGZ1bmMsIEdMZW51bSBiYWNrZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxNQVNLU0VQQVJBVEVQUk9DKSAoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVRUQUNIU0hBREVSUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREFUVFJJQkxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBJTEVTSEFERVJQUk9DKSAoR0x1aW50IHNoYWRlcik7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFUFJPR1JBTVBST0MpICh2b2lkKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xDUkVBVEVTSEFERVJQUk9DKSAoR0xlbnVtIHR5cGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFU0hBREVSUFJPQykgKEdMdWludCBzaGFkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVRBQ0hTSEFERVJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xESVNBQkxFVkVSVEVYQVRUUklCQVJSQVlQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5BQkxFVkVSVEVYQVRUUklCQVJSQVlQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQUNUSVZFQVRUUklCUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVVTklGT1JNUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBVFRBQ0hFRFNIQURFUlNQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Q291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTHVpbnQgKm9iaik7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRBVFRSSUJMT0NBVElPTlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNSU5GT0xPR1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUklWUFJPQykgKEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUklORk9MT0dQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUlNPVVJDRVBST0MpIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpzb3VyY2UpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNRlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRFZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJGVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCSVZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJQT0lOVEVSVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcG9pbnRlcik7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1NIQURFUlBST0MpIChHTHVpbnQgc2hhZGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElOS1BST0dSQU1QUk9DKSAoR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJTT1VSQ0VQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqc3RyaW5nLCBjb25zdCBHTGludCAqbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVVNFUFJPR1JBTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xRlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yRlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zRlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00RlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xmbG9hdCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xSVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMklQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zSVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00SVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNEZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xSVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0ySVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zSVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00SVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgyRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDNGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNEZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBTElEQVRFUFJPR1JBTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMVNQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkZWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTUFJPQykgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROQlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TklWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVieXRlIHgsIEdMdWJ5dGUgeSwgR0x1Ynl0ZSB6LCBHTHVieXRlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVCVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVJVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVVNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0QlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRGUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRJVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFNQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVCVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUlWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVTVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUE9JTlRFUlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbXVsdGl0ZXh0dXJlCisjZGVmaW5lIEdMX0FSQl9tdWx0aXRleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlQVJCIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmVBUkIgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFkQVJCIChHTGVudW0sIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWR2QVJCIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZkFSQiAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWZ2QVJCIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFpQVJCIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWl2QVJCIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxc0FSQiAoR0xlbnVtLCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXN2QVJCIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkQVJCIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkdkFSQiAoR0xlbnVtLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmZBUkIgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmdkFSQiAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaUFSQiAoR0xlbnVtLCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaXZBUkIgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzQVJCIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc3ZBUkIgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2RBUkIgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkdkFSQiAoR0xlbnVtLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2ZBUkIgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNmdkFSQiAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaUFSQiAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2l2QVJCIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc0FSQiAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3N2QVJCIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRkQVJCIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGR2QVJCIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZkFSQiAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGZ2QVJCIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRpQVJCIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGl2QVJCIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0c0FSQiAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHN2QVJCIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVURVhUVVJFQVJCUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UQUNUSVZFVEVYVFVSRUFSQlBST0MpIChHTGVudW0gdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUlBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJJQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0lBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM1NBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU1ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0REFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByLCBHTGRvdWJsZSBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENElBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciwgR0xzaG9ydCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90cmFuc3Bvc2VfbWF0cml4CisjZGVmaW5lIEdMX0FSQl90cmFuc3Bvc2VfbWF0cml4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGZBUkIgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGRBUkIgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhmQVJCIChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkQVJCIChjb25zdCBHTGRvdWJsZSAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURUUkFOU1BPU0VNQVRSSVhGQVJCUFJPQykgKGNvbnN0IEdMZmxvYXQgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMT0FEVFJBTlNQT1NFTUFUUklYREFSQlBST0MpIChjb25zdCBHTGRvdWJsZSAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRUUkFOU1BPU0VNQVRSSVhGQVJCUFJPQykgKGNvbnN0IEdMZmxvYXQgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUVFJBTlNQT1NFTUFUUklYREFSQlBST0MpIChjb25zdCBHTGRvdWJsZSAqbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfQVJCX211bHRpc2FtcGxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2VBUkIgKEdMY2xhbXBmLCBHTGJvb2xlYW4pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFQ09WRVJBR0VBUkJQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2FkZAorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9lbnZfYWRkIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlM0RBUkIgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyREFSQiAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTFEQVJCIChHTGVudW0sIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RBUkIgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEQVJCIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTFEQVJCIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tcHJlc3NlZFRleEltYWdlQVJCIChHTGVudW0sIEdMaW50LCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UzREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMkRBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTFEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTNEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTJEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTFEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NUFJFU1NFRFRFWElNQUdFQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTHZvaWQgKmltZyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9ib3JkZXJfY2xhbXAKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfYm9yZGVyX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9wb2ludF9wYXJhbWV0ZXJzCisjZGVmaW5lIEdMX0FSQl9wb2ludF9wYXJhbWV0ZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmQVJCIChHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnZBUkIgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRkFSQlBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZWQVJCUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYmxlbmQKKyNkZWZpbmUgR0xfQVJCX3ZlcnRleF9ibGVuZCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodGJ2QVJCIChHTGludCwgY29uc3QgR0xieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodHN2QVJCIChHTGludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHRpdkFSQiAoR0xpbnQsIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodGZ2QVJCIChHTGludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHRkdkFSQiAoR0xpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodHVidkFSQiAoR0xpbnQsIGNvbnN0IEdMdWJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0dXN2QVJCIChHTGludCwgY29uc3QgR0x1c2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0dWl2QVJCIChHTGludCwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodFBvaW50ZXJBUkIgKEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhCbGVuZEFSQiAoR0xpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hUQlZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0xieXRlICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hUU1ZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0xzaG9ydCAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVElWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMaW50ICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hURlZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0xmbG9hdCAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVERWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMZG91YmxlICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hUVUJWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdWJ5dGUgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRVU1ZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1c2hvcnQgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRVSVZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1aW50ICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hUUE9JTlRFUkFSQlBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEJMRU5EQVJCUFJPQykgKEdMaW50IGNvdW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tYXRyaXhfcGFsZXR0ZQorI2RlZmluZSBHTF9BUkJfbWF0cml4X3BhbGV0dGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeEFSQiAoR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeEluZGV4dWJ2QVJCIChHTGludCwgY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhJbmRleHVzdkFSQiAoR0xpbnQsIGNvbnN0IEdMdXNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeEluZGV4dWl2QVJCIChHTGludCwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeEluZGV4UG9pbnRlckFSQiAoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ1VSUkVOVFBBTEVUVEVNQVRSSVhBUkJQUk9DKSAoR0xpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhJTkRFWFVCVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVieXRlICppbmRpY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYSU5ERVhVU1ZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1c2hvcnQgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhJTkRFWFVJVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVpbnQgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhJTkRFWFBPSU5URVJBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2NvbWJpbmUKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfZW52X2NvbWJpbmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2Nyb3NzYmFyCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Vudl9jcm9zc2JhciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfZG90MworI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9lbnZfZG90MyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kZXB0aF90ZXh0dXJlCisjZGVmaW5lIEdMX0FSQl9kZXB0aF90ZXh0dXJlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkb3cKKyNkZWZpbmUgR0xfQVJCX3NoYWRvdyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZG93X2FtYmllbnQKKyNkZWZpbmUgR0xfQVJCX3NoYWRvd19hbWJpZW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl93aW5kb3dfcG9zCisjZGVmaW5lIEdMX0FSQl93aW5kb3dfcG9zIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmRBUkIgKEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmR2QVJCIChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZkFSQiAoR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmZ2QVJCIChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpQVJCIChHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpdkFSQiAoY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMnNBUkIgKEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzdkFSQiAoY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZEFSQiAoR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2R2QVJCIChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZkFSQiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2Z2QVJCIChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpQVJCIChHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzaXZBUkIgKGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzQVJCIChHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Mzc3ZBUkIgKGNvbnN0IEdMc2hvcnQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyREFSQlBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRWQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkZBUkJQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRlZBUkJQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJQVJCUFJPQykgKEdMaW50IHgsIEdMaW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MySVZBUkJQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyU0FSQlBST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTVkFSQlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RBUkJQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNEVkFSQlBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGQVJCUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRlZBUkJQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNJQVJCUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSVZBUkJQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU0FSQlBST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NWQVJCUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9wcm9ncmFtCisjZGVmaW5lIEdMX0FSQl92ZXJ0ZXhfcHJvZ3JhbSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFkQVJCIChHTHVpbnQsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZHZBUkIgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWZBUkIgKEdMdWludCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWZ2QVJCIChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMXNBUkIgKEdMdWludCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMXN2QVJCIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmRBUkIgKEdMdWludCwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZHZBUkIgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmZBUkIgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmZ2QVJCIChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnNBUkIgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnN2QVJCIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2RBUkIgKEdMdWludCwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2R2QVJCIChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmQVJCIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmdkFSQiAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzQVJCIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzdkFSQiAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROYnZBUkIgKEdMdWludCwgY29uc3QgR0xieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROaXZBUkIgKEdMdWludCwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5zdkFSQiAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWJBUkIgKEdMdWludCwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51YnZBUkIgKEdMdWludCwgY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVpdkFSQiAoR0x1aW50LCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51c3ZBUkIgKEdMdWludCwgY29uc3QgR0x1c2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGJ2QVJCIChHTHVpbnQsIGNvbnN0IEdMYnl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZEFSQiAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGR2QVJCIChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmQVJCIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmdkFSQiAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRpdkFSQiAoR0x1aW50LCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0c0FSQiAoR0x1aW50LCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0c3ZBUkIgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWJ2QVJCIChHTHVpbnQsIGNvbnN0IEdMdWJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHVpdkFSQiAoR0x1aW50LCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHVzdkFSQiAoR0x1aW50LCBjb25zdCBHTHVzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyQVJCIChHTHVpbnQsIEdMaW50LCBHTGVudW0sIEdMYm9vbGVhbiwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5QVJCIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheUFSQiAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtU3RyaW5nQVJCIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRQcm9ncmFtQVJCIChHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbXNBUkIgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5Qcm9ncmFtc0FSQiAoR0xzaXplaSwgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZEFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGR2QVJCIChHTGVudW0sIEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUVudlBhcmFtZXRlcjRmQVJCIChHTGVudW0sIEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUVudlBhcmFtZXRlcjRmdkFSQiAoR0xlbnVtLCBHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGRBUkIgKEdMZW51bSwgR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGR2QVJCIChHTGVudW0sIEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZBUkIgKEdMZW51bSwgR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZnZBUkIgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1FbnZQYXJhbWV0ZXJkdkFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1FbnZQYXJhbWV0ZXJmdkFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVyZHZBUkIgKEdMZW51bSwgR0x1aW50LCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJmdkFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbWl2QVJCIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVN0cmluZ0FSQiAoR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJkdkFSQiAoR0x1aW50LCBHTGVudW0sIEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmZ2QVJCIChHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdkFSQiAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2QVJCIChHTHVpbnQsIEdMZW51bSwgR0x2b2lkKiAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUHJvZ3JhbUFSQiAoR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMVNBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkZWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROQlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TklWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlNWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUJBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVieXRlIHgsIEdMdWJ5dGUgeSwgR0x1Ynl0ZSB6LCBHTHVieXRlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVCVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVJVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVVNWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0QlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0REFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RFZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRGQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRJVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFNBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVCVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUlWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUE9JTlRFUkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVOQUJMRVZFUlRFWEFUVFJJQkFSUkFZQVJCUFJPQykgKEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERJU0FCTEVWRVJURVhBVFRSSUJBUlJBWUFSQlBST0MpIChHTHVpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNU1RSSU5HQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHZvaWQgKnN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRQUk9HUkFNQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFUFJPR1JBTVNBUkJQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnByb2dyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOUFJPR1JBTVNBUkJQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKnByb2dyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUjREQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVI0RFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUjRGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUjRGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUjREQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUjREVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVI0RkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUjRGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1FTlZQQVJBTUVURVJEVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNRU5WUEFSQU1FVEVSRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNTE9DQUxQQVJBTUVURVJEVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNTE9DQUxQQVJBTUVURVJGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1JVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNU1RSSU5HQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpzdHJpbmcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJEVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkZWQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQlBPSU5URVJWQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwb2ludGVyKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1BST0dSQU1BUkJQUk9DKSAoR0x1aW50IHByb2dyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW0KKyNkZWZpbmUgR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW0gMQorLyogQWxsIEFSQl9mcmFnbWVudF9wcm9ncmFtIGVudHJ5IHBvaW50cyBhcmUgc2hhcmVkIHdpdGggQVJCX3ZlcnRleF9wcm9ncmFtLiAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJBUkIgKEdMZW51bSwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVCdWZmZXJzQVJCIChHTHNpemVpLCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuQnVmZmVyc0FSQiAoR0xzaXplaSwgR0x1aW50ICopOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNCdWZmZXJBUkIgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQnVmZmVyRGF0YUFSQiAoR0xlbnVtLCBHTHNpemVpcHRyQVJCLCBjb25zdCBHTHZvaWQgKiwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJTdWJEYXRhQVJCIChHTGVudW0sIEdMaW50cHRyQVJCLCBHTHNpemVpcHRyQVJCLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QnVmZmVyU3ViRGF0YUFSQiAoR0xlbnVtLCBHTGludHB0ckFSQiwgR0xzaXplaXB0ckFSQiwgR0x2b2lkICopOworR0xBUEkgR0x2b2lkKiBBUElFTlRSWSBnbE1hcEJ1ZmZlckFSQiAoR0xlbnVtLCBHTGVudW0pOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsVW5tYXBCdWZmZXJBUkIgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXZBUkIgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJQb2ludGVydkFSQiAoR0xlbnVtLCBHTGVudW0sIEdMdm9pZCogKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVCVUZGRVJTQVJCUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOQlVGRkVSU0FSQlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNCVUZGRVJBUkJQUk9DKSAoR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUkRBVEFBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ckFSQiBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUlNVQkRBVEFBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHJBUkIgb2Zmc2V0LCBHTHNpemVpcHRyQVJCIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlNVQkRBVEFBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHJBUkIgb2Zmc2V0LCBHTHNpemVpcHRyQVJCIHNpemUsIEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIEdMdm9pZCogKEFQSUVOVFJZUCBQRk5HTE1BUEJVRkZFUkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xVTk1BUEJVRkZFUkFSQlBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUEFSQU1FVEVSSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUE9JTlRFUlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX29jY2x1c2lvbl9xdWVyeQorI2RlZmluZSBHTF9BUkJfb2NjbHVzaW9uX3F1ZXJ5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUXVlcmllc0FSQiAoR0xzaXplaSwgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVF1ZXJpZXNBUkIgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUXVlcnlBUkIgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5RdWVyeUFSQiAoR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFF1ZXJ5QVJCIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5aXZBUkIgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdGl2QVJCIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3R1aXZBUkIgKEdMdWludCwgR0xlbnVtLCBHTHVpbnQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5RVUVSSUVTQVJCUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVRVUVSSUVTQVJCUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTUVVFUllBUkJQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkVHSU5RVUVSWUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRRVUVSWUFSQlBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVElWQVJCUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RVSVZBUkJQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworI2RlZmluZSBHTF9BUkJfc2hhZGVyX29iamVjdHMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVPYmplY3RBUkIgKEdMaGFuZGxlQVJCKTsKK0dMQVBJIEdMaGFuZGxlQVJCIEFQSUVOVFJZIGdsR2V0SGFuZGxlQVJCIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERldGFjaE9iamVjdEFSQiAoR0xoYW5kbGVBUkIsIEdMaGFuZGxlQVJCKTsKK0dMQVBJIEdMaGFuZGxlQVJCIEFQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyT2JqZWN0QVJCIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlclNvdXJjZUFSQiAoR0xoYW5kbGVBUkIsIEdMc2l6ZWksIGNvbnN0IEdMY2hhckFSQiogKiwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcGlsZVNoYWRlckFSQiAoR0xoYW5kbGVBUkIpOworR0xBUEkgR0xoYW5kbGVBUkIgQVBJRU5UUlkgZ2xDcmVhdGVQcm9ncmFtT2JqZWN0QVJCICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBdHRhY2hPYmplY3RBUkIgKEdMaGFuZGxlQVJCLCBHTGhhbmRsZUFSQik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlua1Byb2dyYW1BUkIgKEdMaGFuZGxlQVJCKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVc2VQcm9ncmFtT2JqZWN0QVJCIChHTGhhbmRsZUFSQik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFsaWRhdGVQcm9ncmFtQVJCIChHTGhhbmRsZUFSQik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmQVJCIChHTGludCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmQVJCIChHTGludCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNmQVJCIChHTGludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmQVJCIChHTGludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpQVJCIChHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaUFSQiAoR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpQVJCIChHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpQVJCIChHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xZnZBUkIgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yZnZBUkIgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zZnZBUkIgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00ZnZBUkIgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xaXZBUkIgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMml2QVJCIChHTGludCwgR0xzaXplaSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00aXZBUkIgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MmZ2QVJCIChHTGludCwgR0xzaXplaSwgR0xib29sZWFuLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzZnZBUkIgKEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDRmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPYmplY3RQYXJhbWV0ZXJmdkFSQiAoR0xoYW5kbGVBUkIsIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPYmplY3RQYXJhbWV0ZXJpdkFSQiAoR0xoYW5kbGVBUkIsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW5mb0xvZ0FSQiAoR0xoYW5kbGVBUkIsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0xjaGFyQVJCICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEF0dGFjaGVkT2JqZWN0c0FSQiAoR0xoYW5kbGVBUkIsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0xoYW5kbGVBUkIgKik7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldFVuaWZvcm1Mb2NhdGlvbkFSQiAoR0xoYW5kbGVBUkIsIGNvbnN0IEdMY2hhckFSQiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVVbmlmb3JtQVJCIChHTGhhbmRsZUFSQiwgR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMaW50ICosIEdMZW51bSAqLCBHTGNoYXJBUkIgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybWZ2QVJCIChHTGhhbmRsZUFSQiwgR0xpbnQsIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybWl2QVJCIChHTGhhbmRsZUFSQiwgR0xpbnQsIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNoYWRlclNvdXJjZUFSQiAoR0xoYW5kbGVBUkIsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0xjaGFyQVJCICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFT0JKRUNUQVJCUFJPQykgKEdMaGFuZGxlQVJCIG9iaik7Cit0eXBlZGVmIEdMaGFuZGxlQVJCIChBUElFTlRSWVAgUEZOR0xHRVRIQU5ETEVBUkJQUk9DKSAoR0xlbnVtIHBuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVUQUNIT0JKRUNUQVJCUFJPQykgKEdMaGFuZGxlQVJCIGNvbnRhaW5lck9iaiwgR0xoYW5kbGVBUkIgYXR0YWNoZWRPYmopOwordHlwZWRlZiBHTGhhbmRsZUFSQiAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFU0hBREVST0JKRUNUQVJCUFJPQykgKEdMZW51bSBzaGFkZXJUeXBlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBREVSU09VUkNFQVJCUFJPQykgKEdMaGFuZGxlQVJCIHNoYWRlck9iaiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyQVJCKiAqc3RyaW5nLCBjb25zdCBHTGludCAqbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUElMRVNIQURFUkFSQlBST0MpIChHTGhhbmRsZUFSQiBzaGFkZXJPYmopOwordHlwZWRlZiBHTGhhbmRsZUFSQiAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFUFJPR1JBTU9CSkVDVEFSQlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVRUQUNIT0JKRUNUQVJCUFJPQykgKEdMaGFuZGxlQVJCIGNvbnRhaW5lck9iaiwgR0xoYW5kbGVBUkIgb2JqKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElOS1BST0dSQU1BUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVTRVBST0dSQU1PQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBTElEQVRFUFJPR1JBTUFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFGQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJGQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNGQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRGQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0ySUFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNJQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xRlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0ZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00RlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJJVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNJVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDJGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYM0ZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVg0RlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUUEFSQU1FVEVSRlZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE9CSkVDVFBBUkFNRVRFUklWQVJCUFJPQykgKEdMaGFuZGxlQVJCIG9iaiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5GT0xPR0FSQlBST0MpIChHTGhhbmRsZUFSQiBvYmosIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhckFSQiAqaW5mb0xvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFUVEFDSEVET0JKRUNUU0FSQlBST0MpIChHTGhhbmRsZUFSQiBjb250YWluZXJPYmosIEdMc2l6ZWkgbWF4Q291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTGhhbmRsZUFSQiAqb2JqKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1MT0NBVElPTkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBjb25zdCBHTGNoYXJBUkIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVVTklGT1JNQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMdWludCBpbmRleCwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyQVJCICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUZWQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNSVZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTSEFERVJTT1VSQ0VBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqLCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXJBUkIgKnNvdXJjZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X3NoYWRlcgorI2RlZmluZSBHTF9BUkJfdmVydGV4X3NoYWRlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRBdHRyaWJMb2NhdGlvbkFSQiAoR0xoYW5kbGVBUkIsIEdMdWludCwgY29uc3QgR0xjaGFyQVJCICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZUF0dHJpYkFSQiAoR0xoYW5kbGVBUkIsIEdMdWludCwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGludCAqLCBHTGVudW0gKiwgR0xjaGFyQVJCICopOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRBdHRyaWJMb2NhdGlvbkFSQiAoR0xoYW5kbGVBUkIsIGNvbnN0IEdMY2hhckFSQiAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRBVFRSSUJMT0NBVElPTkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhckFSQiAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRUFUVFJJQkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhckFSQiAqbmFtZSk7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRBVFRSSUJMT0NBVElPTkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBjb25zdCBHTGNoYXJBUkIgKm5hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9BUkJfZnJhZ21lbnRfc2hhZGVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzEwMAorI2RlZmluZSBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV8xMDAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3bworI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9wb2ludF9zcHJpdGUKKyNkZWZpbmUgR0xfQVJCX3BvaW50X3Nwcml0ZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbV9zaGFkb3cKKyNkZWZpbmUgR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW1fc2hhZG93IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kcmF3X2J1ZmZlcnMKKyNkZWZpbmUgR0xfQVJCX2RyYXdfYnVmZmVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdCdWZmZXJzQVJCIChHTHNpemVpLCBjb25zdCBHTGVudW0gKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQlVGRkVSU0FSQlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9yZWN0YW5nbGUKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfcmVjdGFuZ2xlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb2xvcl9idWZmZXJfZmxvYXQKKyNkZWZpbmUgR0xfQVJCX2NvbG9yX2J1ZmZlcl9mbG9hdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsYW1wQ29sb3JBUkIgKEdMZW51bSwgR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMQU1QQ09MT1JBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGNsYW1wKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9oYWxmX2Zsb2F0X3BpeGVsCisjZGVmaW5lIEdMX0FSQl9oYWxmX2Zsb2F0X3BpeGVsIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Zsb2F0CisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Zsb2F0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9waXhlbF9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0FSQl9waXhlbF9idWZmZXJfb2JqZWN0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9hYmdyCisjZGVmaW5lIEdMX0VYVF9hYmdyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9jb2xvcgorI2RlZmluZSBHTF9FWFRfYmxlbmRfY29sb3IgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZENvbG9yRVhUIChHTGNsYW1wZiwgR0xjbGFtcGYsIEdMY2xhbXBmLCBHTGNsYW1wZik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVORENPTE9SRVhUUFJPQykgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wb2x5Z29uX29mZnNldAorI2RlZmluZSBHTF9FWFRfcG9seWdvbl9vZmZzZXQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0RVhUIChHTGZsb2F0LCBHTGZsb2F0KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPTFlHT05PRkZTRVRFWFRQUk9DKSAoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgYmlhcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZQorI2RlZmluZSBHTF9FWFRfdGV4dHVyZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZTNECisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlM0QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhJbWFnZTNERVhUIChHTGVudW0sIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50LCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlM0RFWFQgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFM0RFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX2ZpbHRlcjQKKyNkZWZpbmUgR0xfU0dJU190ZXh0dXJlX2ZpbHRlcjQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXhGaWx0ZXJGdW5jU0dJUyAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RmlsdGVyRnVuY1NHSVMgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYRklMVEVSRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZpbHRlciwgR0xmbG9hdCAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEZJTFRFUkZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmaWx0ZXIsIEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqd2VpZ2h0cyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3VidGV4dHVyZQorI2RlZmluZSBHTF9FWFRfc3VidGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlMURFWFQgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlMkRFWFQgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvcHlfdGV4dHVyZQorI2RlZmluZSBHTF9FWFRfY29weV90ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleEltYWdlMURFWFQgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleEltYWdlMkRFWFQgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMURFWFQgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJERVhUIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlM0RFWFQgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYSU1BR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWVRFWFNVQklNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UzREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2hpc3RvZ3JhbQorI2RlZmluZSBHTF9FWFRfaGlzdG9ncmFtIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtRVhUIChHTGVudW0sIEdMYm9vbGVhbiwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyaXZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNaW5tYXhFWFQgKEdMZW51bSwgR0xib29sZWFuLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heFBhcmFtZXRlcmZ2RVhUIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJpdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEhpc3RvZ3JhbUVYVCAoR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIEdMYm9vbGVhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWlubWF4RVhUIChHTGVudW0sIEdMZW51bSwgR0xib29sZWFuKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNldEhpc3RvZ3JhbUVYVCAoR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNldE1pbm1heEVYVCAoR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTVBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhQQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xISVNUT0dSQU1FWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1JTk1BWEVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVTRVRISVNUT0dSQU1FWFRQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU0VUTUlOTUFYRVhUUFJPQykgKEdMZW51bSB0YXJnZXQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvbnZvbHV0aW9uCisjZGVmaW5lIEdMX0VYVF9jb252b2x1dGlvbiAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uRmlsdGVyMURFWFQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uRmlsdGVyMkRFWFQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaUVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcml2RVhUIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMURFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlDb252b2x1dGlvbkZpbHRlcjJERVhUIChHTGVudW0sIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvbkZpbHRlckVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyaXZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTZXBhcmFibGVGaWx0ZXJFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqLCBHTHZvaWQgKiwgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlcGFyYWJsZUZpbHRlcjJERVhUIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTkZJTFRFUjFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTkZJTFRFUjJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJGRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJJRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09OVk9MVVRJT05GSUxURVIxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09OVk9MVVRJT05GSUxURVIyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05GSUxURVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqaW1hZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTlBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05QQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTRVBBUkFCTEVGSUxURVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcm93LCBHTHZvaWQgKmNvbHVtbiwgR0x2b2lkICpzcGFuKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VQQVJBQkxFRklMVEVSMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcm93LCBjb25zdCBHTHZvaWQgKmNvbHVtbik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29sb3JfbWF0cml4CisjZGVmaW5lIEdMX0VYVF9jb2xvcl9tYXRyaXggMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJX2NvbG9yX3RhYmxlCisjZGVmaW5lIEdMX1NHSV9jb2xvcl90YWJsZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVTR0kgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVQYXJhbWV0ZXJmdlNHSSAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JUYWJsZVBhcmFtZXRlcml2U0dJIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbG9yVGFibGVTR0kgKEdMZW51bSwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVTR0kgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnZTR0kgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdlNHSSAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JUQUJMRVNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnRhYmxlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JUQUJMRVBBUkFNRVRFUkZWU0dJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JUQUJMRVBBUkFNRVRFUklWU0dJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT0xPUlRBQkxFU0dJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGFibGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFUEFSQU1FVEVSRlZTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFUEFSQU1FVEVSSVZTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGV4dHVyZQorI2RlZmluZSBHTF9TR0lYX3BpeGVsX3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRleEdlblNHSVggKEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlNHSVhQUk9DKSAoR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19waXhlbF90ZXh0dXJlCisjZGVmaW5lIEdMX1NHSVNfcGl4ZWxfdGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuUGFyYW1ldGVyaVNHSVMgKEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuUGFyYW1ldGVyaXZTR0lTIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuUGFyYW1ldGVyZlNHSVMgKEdMZW51bSwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJmdlNHSVMgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQaXhlbFRleEdlblBhcmFtZXRlcml2U0dJUyAoR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQaXhlbFRleEdlblBhcmFtZXRlcmZ2U0dJUyAoR0xlbnVtLCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxURVhHRU5QQVJBTUVURVJJU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxURVhHRU5QQVJBTUVURVJJVlNHSVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxURVhHRU5QQVJBTUVURVJGU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlBBUkFNRVRFUkZWU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBJWEVMVEVYR0VOUEFSQU1FVEVSSVZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBJWEVMVEVYR0VOUEFSQU1FVEVSRlZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZTRECisjZGVmaW5lIEdMX1NHSVNfdGV4dHVyZTREIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2U0RFNHSVMgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xpbnQsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2U0RFNHSVMgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpLCBHTHNpemVpLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0U0RFNHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMc2l6ZWkgc2l6ZTRkLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFNERTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB3b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xzaXplaSBzaXplNGQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lfdGV4dHVyZV9jb2xvcl90YWJsZQorI2RlZmluZSBHTF9TR0lfdGV4dHVyZV9jb2xvcl90YWJsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY215a2EKKyNkZWZpbmUgR0xfRVhUX2NteWthIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX29iamVjdAorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbEFyZVRleHR1cmVzUmVzaWRlbnRFWFQgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqLCBHTGJvb2xlYW4gKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFRleHR1cmVFWFQgKEdMZW51bSwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVUZXh0dXJlc0VYVCAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblRleHR1cmVzRVhUIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1RleHR1cmVFWFQgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJpb3JpdGl6ZVRleHR1cmVzRVhUIChHTHNpemVpLCBjb25zdCBHTHVpbnQgKiwgY29uc3QgR0xjbGFtcGYgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTEFSRVRFWFRVUkVTUkVTSURFTlRFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzLCBHTGJvb2xlYW4gKnJlc2lkZW5jZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EVEVYVFVSRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVRFWFRVUkVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlRFWFRVUkVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNURVhUVVJFRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJJT1JJVElaRVRFWFRVUkVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcywgY29uc3QgR0xjbGFtcGYgKnByaW9yaXRpZXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19kZXRhaWxfdGV4dHVyZQorI2RlZmluZSBHTF9TR0lTX2RldGFpbF90ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGV0YWlsVGV4RnVuY1NHSVMgKEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXREZXRhaWxUZXhGdW5jU0dJUyAoR0xlbnVtLCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVUQUlMVEVYRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBuLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRERVRBSUxURVhGVU5DU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0ICpwb2ludHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19zaGFycGVuX3RleHR1cmUKKyNkZWZpbmUgR0xfU0dJU19zaGFycGVuX3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFycGVuVGV4RnVuY1NHSVMgKEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTaGFycGVuVGV4RnVuY1NHSVMgKEdMZW51bSwgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQVJQRU5URVhGVU5DU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG4sIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQVJQRU5URVhGVU5DU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0ICpwb2ludHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BhY2tlZF9waXhlbHMKKyNkZWZpbmUgR0xfRVhUX3BhY2tlZF9waXhlbHMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX2xvZAorI2RlZmluZSBHTF9TR0lTX3RleHR1cmVfbG9kIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfU0dJU19tdWx0aXNhbXBsZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZU1hc2tTR0lTIChHTGNsYW1wZiwgR0xib29sZWFuKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVQYXR0ZXJuU0dJUyAoR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRU1BU0tTR0lTUFJPQykgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFUEFUVEVSTlNHSVNQUk9DKSAoR0xlbnVtIHBhdHRlcm4pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3Jlc2NhbGVfbm9ybWFsCisjZGVmaW5lIEdMX0VYVF9yZXNjYWxlX25vcm1hbCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdmVydGV4X2FycmF5CisjZGVmaW5lIEdMX0VYVF92ZXJ0ZXhfYXJyYXkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBcnJheUVsZW1lbnRFWFQgKEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXJFWFQgKEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QXJyYXlzRVhUIChHTGVudW0sIEdMaW50LCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFZGdlRmxhZ1BvaW50ZXJFWFQgKEdMc2l6ZWksIEdMc2l6ZWksIGNvbnN0IEdMYm9vbGVhbiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQb2ludGVydkVYVCAoR0xlbnVtLCBHTHZvaWQqICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluZGV4UG9pbnRlckVYVCAoR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlckVYVCAoR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyRVhUIChHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlckVYVCAoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVJSQVlFTEVNRU5URVhUUFJPQykgKEdMaW50IGkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlBPSU5URVJFWFRQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQVJSQVlTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVER0VGTEFHUE9JTlRFUkVYVFBST0MpIChHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xib29sZWFuICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUE9JTlRFUlZFWFRQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWFBPSU5URVJFWFRQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQT0lOVEVSRVhUUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUE9JTlRFUkVYVFBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbWlzY19hdHRyaWJ1dGUKKyNkZWZpbmUgR0xfRVhUX21pc2NfYXR0cmlidXRlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwCisjZGVmaW5lIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfY2xpcG1hcAorI2RlZmluZSBHTF9TR0lYX2NsaXBtYXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zaGFkb3cKKyNkZWZpbmUgR0xfU0dJWF9zaGFkb3cgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX2VkZ2VfY2xhbXAKKyNkZWZpbmUgR0xfU0dJU190ZXh0dXJlX2VkZ2VfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX2JvcmRlcl9jbGFtcAorI2RlZmluZSBHTF9TR0lTX3RleHR1cmVfYm9yZGVyX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9taW5tYXgKKyNkZWZpbmUgR0xfRVhUX2JsZW5kX21pbm1heCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb25FWFQgKEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9ORVhUUFJPQykgKEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9zdWJ0cmFjdAorI2RlZmluZSBHTF9FWFRfYmxlbmRfc3VidHJhY3QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX2xvZ2ljX29wCisjZGVmaW5lIEdMX0VYVF9ibGVuZF9sb2dpY19vcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ludGVybGFjZQorI2RlZmluZSBHTF9TR0lYX2ludGVybGFjZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3BpeGVsX3RpbGVzCisjZGVmaW5lIEdMX1NHSVhfcGl4ZWxfdGlsZXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX3NlbGVjdAorI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfc2VsZWN0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc3ByaXRlCisjZGVmaW5lIEdMX1NHSVhfc3ByaXRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3ByaXRlUGFyYW1ldGVyZlNHSVggKEdMZW51bSwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3ByaXRlUGFyYW1ldGVyZnZTR0lYIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3ByaXRlUGFyYW1ldGVyaVNHSVggKEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNwcml0ZVBhcmFtZXRlcml2U0dJWCAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNQUklURVBBUkFNRVRFUkZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNQUklURVBBUkFNRVRFUkZWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNQUklURVBBUkFNRVRFUklTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTUFJJVEVQQVJBTUVURVJJVlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9tdWx0aV9idWZmZXIKKyNkZWZpbmUgR0xfU0dJWF90ZXh0dXJlX211bHRpX2J1ZmZlciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9FWFRfcG9pbnRfcGFyYW1ldGVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZkVYVCAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZ2RVhUIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZFWFRQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3BvaW50X3BhcmFtZXRlcnMKKyNkZWZpbmUgR0xfU0dJU19wb2ludF9wYXJhbWV0ZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmU0dJUyAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZ2U0dJUyAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZWU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2luc3RydW1lbnRzCisjZGVmaW5lIEdMX1NHSVhfaW5zdHJ1bWVudHMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0SW5zdHJ1bWVudHNTR0lYICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbnN0cnVtZW50c0J1ZmZlclNHSVggKEdMc2l6ZWksIEdMaW50ICopOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xQb2xsSW5zdHJ1bWVudHNTR0lYIChHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWFkSW5zdHJ1bWVudHNTR0lYIChHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RhcnRJbnN0cnVtZW50c1NHSVggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0b3BJbnN0cnVtZW50c1NHSVggKEdMaW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRJTlNUUlVNRU5UU1NHSVhQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElOU1RSVU1FTlRTQlVGRkVSU0dJWFBST0MpIChHTHNpemVpIHNpemUsIEdMaW50ICpidWZmZXIpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMUE9MTElOU1RSVU1FTlRTU0dJWFBST0MpIChHTGludCAqbWFya2VyX3ApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRUFESU5TVFJVTUVOVFNTR0lYUFJPQykgKEdMaW50IG1hcmtlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNUQVJUSU5TVFJVTUVOVFNTR0lYUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVE9QSU5TVFJVTUVOVFNTR0lYUFJPQykgKEdMaW50IG1hcmtlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfc2NhbGVfYmlhcworI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfc2NhbGVfYmlhcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZyYW1lem9vbQorI2RlZmluZSBHTF9TR0lYX2ZyYW1lem9vbSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lWm9vbVNHSVggKEdMaW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FWk9PTVNHSVhQUk9DKSAoR0xpbnQgZmFjdG9yKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGFnX3NhbXBsZV9idWZmZXIKKyNkZWZpbmUgR0xfU0dJWF90YWdfc2FtcGxlX2J1ZmZlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhZ1NhbXBsZUJ1ZmZlclNHSVggKHZvaWQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFHU0FNUExFQlVGRkVSU0dJWFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcG9seW5vbWlhbF9mZmQKKyNkZWZpbmUgR0xfU0dJWF9wb2x5bm9taWFsX2ZmZCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlZm9ybWF0aW9uTWFwM2RTR0lYIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xpbnQsIEdMaW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMaW50LCBHTGludCwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGludCwgR0xpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlZm9ybWF0aW9uTWFwM2ZTR0lYIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMaW50LCBHTGludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xpbnQsIEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGludCwgR0xpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVmb3JtU0dJWCAoR0xiaXRmaWVsZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZElkZW50aXR5RGVmb3JtYXRpb25NYXBTR0lYIChHTGJpdGZpZWxkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFRk9STUFUSU9OTUFQM0RTR0lYUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHUxLCBHTGRvdWJsZSB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLCBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIsIEdMaW50IHZzdHJpZGUsIEdMaW50IHZvcmRlciwgR0xkb3VibGUgdzEsIEdMZG91YmxlIHcyLCBHTGludCB3c3RyaWRlLCBHTGludCB3b3JkZXIsIGNvbnN0IEdMZG91YmxlICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUZPUk1BVElPTk1BUDNGU0dJWFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHUxLCBHTGZsb2F0IHUyLCBHTGludCB1c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMaW50IHZzdHJpZGUsIEdMaW50IHZvcmRlciwgR0xmbG9hdCB3MSwgR0xmbG9hdCB3MiwgR0xpbnQgd3N0cmlkZSwgR0xpbnQgd29yZGVyLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUZPUk1TR0lYUFJPQykgKEdMYml0ZmllbGQgbWFzayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURJREVOVElUWURFRk9STUFUSU9OTUFQU0dJWFBST0MpIChHTGJpdGZpZWxkIG1hc2spOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9yZWZlcmVuY2VfcGxhbmUKKyNkZWZpbmUgR0xfU0dJWF9yZWZlcmVuY2VfcGxhbmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWZlcmVuY2VQbGFuZVNHSVggKGNvbnN0IEdMZG91YmxlICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVGRVJFTkNFUExBTkVTR0lYUFJPQykgKGNvbnN0IEdMZG91YmxlICplcXVhdGlvbik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZsdXNoX3Jhc3RlcgorI2RlZmluZSBHTF9TR0lYX2ZsdXNoX3Jhc3RlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoUmFzdGVyU0dJWCAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSFJBU1RFUlNHSVhQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2RlcHRoX3RleHR1cmUKKyNkZWZpbmUgR0xfU0dJWF9kZXB0aF90ZXh0dXJlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZm9nX2Z1bmN0aW9uCisjZGVmaW5lIEdMX1NHSVNfZm9nX2Z1bmN0aW9uIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nRnVuY1NHSVMgKEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Rm9nRnVuY1NHSVMgKEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dGVU5DU0dJU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZPR0ZVTkNTR0lTUFJPQykgKEdMZmxvYXQgKnBvaW50cyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZvZ19vZmZzZXQKKyNkZWZpbmUgR0xfU0dJWF9mb2dfb2Zmc2V0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX2ltYWdlX3RyYW5zZm9ybQorI2RlZmluZSBHTF9IUF9pbWFnZV90cmFuc2Zvcm0gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmlIUCAoR0xlbnVtLCBHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZIUCAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaXZIUCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZnZIUCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJpdkhQIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmdkhQIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSSUhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTUFHRVRSQU5TRk9STVBBUkFNRVRFUkZIUFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTUFHRVRSQU5TRk9STVBBUkFNRVRFUklWSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJGVkhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJJVkhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSRlZIUFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9IUF9jb252b2x1dGlvbl9ib3JkZXJfbW9kZXMKKyNkZWZpbmUgR0xfSFBfY29udm9sdXRpb25fYm9yZGVyX21vZGVzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9hZGRfZW52CisjZGVmaW5lIEdMX1NHSVhfdGV4dHVyZV9hZGRfZW52IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb2xvcl9zdWJ0YWJsZQorI2RlZmluZSBHTF9FWFRfY29sb3Jfc3VidGFibGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclN1YlRhYmxlRVhUIChHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbG9yU3ViVGFibGVFWFQgKEdMZW51bSwgR0xzaXplaSwgR0xpbnQsIEdMaW50LCBHTHNpemVpKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SU1VCVEFCTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT0xPUlNVQlRBQkxFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfUEdJX3ZlcnRleF9oaW50cworI2RlZmluZSBHTF9QR0lfdmVydGV4X2hpbnRzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1BHSV9taXNjX2hpbnRzCisjZGVmaW5lIEdMX1BHSV9taXNjX2hpbnRzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSGludFBHSSAoR0xlbnVtLCBHTGludCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xISU5UUEdJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUKKyNkZWZpbmUgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlRVhUIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlRVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2RVhUIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2RVhUIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsRm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NsaXBfdm9sdW1lX2hpbnQKKyNkZWZpbmUgR0xfRVhUX2NsaXBfdm9sdW1lX2hpbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9saXN0X3ByaW9yaXR5CisjZGVmaW5lIEdMX1NHSVhfbGlzdF9wcmlvcml0eSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExpc3RQYXJhbWV0ZXJmdlNHSVggKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExpc3RQYXJhbWV0ZXJpdlNHSVggKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaXN0UGFyYW1ldGVyZlNHSVggKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaXN0UGFyYW1ldGVyZnZTR0lYIChHTHVpbnQsIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaXN0UGFyYW1ldGVyaVNHSVggKEdMdWludCwgR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlzdFBhcmFtZXRlcml2U0dJWCAoR0x1aW50LCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTElTVFBBUkFNRVRFUkZWU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMSVNUUEFSQU1FVEVSSVZTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSVNUUEFSQU1FVEVSRlNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExJU1RQQVJBTUVURVJGVlNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElTVFBBUkFNRVRFUklTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElTVFBBUkFNRVRFUklWU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaXJfaW5zdHJ1bWVudDEKKyNkZWZpbmUgR0xfU0dJWF9pcl9pbnN0cnVtZW50MSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2NhbGxpZ3JhcGhpY19mcmFnbWVudAorI2RlZmluZSBHTF9TR0lYX2NhbGxpZ3JhcGhpY19mcmFnbWVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfbG9kX2JpYXMKKyNkZWZpbmUgR0xfU0dJWF90ZXh0dXJlX2xvZF9iaWFzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc2hhZG93X2FtYmllbnQKKyNkZWZpbmUgR0xfU0dJWF9zaGFkb3dfYW1iaWVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfdGV4dHVyZQorI2RlZmluZSBHTF9FWFRfaW5kZXhfdGV4dHVyZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfbWF0ZXJpYWwKKyNkZWZpbmUgR0xfRVhUX2luZGV4X21hdGVyaWFsIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5kZXhNYXRlcmlhbEVYVCAoR0xlbnVtLCBHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5ERVhNQVRFUklBTEVYVFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X2Z1bmMKKyNkZWZpbmUgR0xfRVhUX2luZGV4X2Z1bmMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbmRleEZ1bmNFWFQgKEdMZW51bSwgR0xjbGFtcGYpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5ERVhGVU5DRVhUUFJPQykgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X2FycmF5X2Zvcm1hdHMKKyNkZWZpbmUgR0xfRVhUX2luZGV4X2FycmF5X2Zvcm1hdHMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvbXBpbGVkX3ZlcnRleF9hcnJheQorI2RlZmluZSBHTF9FWFRfY29tcGlsZWRfdmVydGV4X2FycmF5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9ja0FycmF5c0VYVCAoR0xpbnQsIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVubG9ja0FycmF5c0VYVCAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMT0NLQVJSQVlTRVhUUFJPQykgKEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5MT0NLQVJSQVlTRVhUUFJPQykgKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2N1bGxfdmVydGV4CisjZGVmaW5lIEdMX0VYVF9jdWxsX3ZlcnRleCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1bGxQYXJhbWV0ZXJkdkVYVCAoR0xlbnVtLCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDdWxsUGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENVTExQQVJBTUVURVJEVkVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDVUxMUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF95Y3JjYgorI2RlZmluZSBHTF9TR0lYX3ljcmNiIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZnJhZ21lbnRfbGlnaHRpbmcKKyNkZWZpbmUgR0xfU0dJWF9mcmFnbWVudF9saWdodGluZyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50Q29sb3JNYXRlcmlhbFNHSVggKEdMZW51bSwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0ZlNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0ZnZTR0lYIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0aVNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodGl2U0dJWCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRNb2RlbGZTR0lYIChHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRNb2RlbGZ2U0dJWCAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRNb2RlbGlTR0lYIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0TW9kZWxpdlNHSVggKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRNYXRlcmlhbGZTR0lYIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRNYXRlcmlhbGZ2U0dJWCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRNYXRlcmlhbGlTR0lYIChHTGVudW0sIEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TWF0ZXJpYWxpdlNHSVggKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFnbWVudExpZ2h0ZnZTR0lYIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFnbWVudExpZ2h0aXZTR0lYIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RnJhZ21lbnRNYXRlcmlhbGZ2U0dJWCAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RnJhZ21lbnRNYXRlcmlhbGl2U0dJWCAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0RW52aVNHSVggKEdMZW51bSwgR0xpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRDT0xPUk1BVEVSSUFMU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hURlNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hURlZTR0lYUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hUSVNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVElWU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRNT0RFTEZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRNT0RFTEZWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRNT0RFTElTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hUTU9ERUxJVlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRNQVRFUklBTEZTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVE1BVEVSSUFMRlZTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTUFURVJJQUxJU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTUFURVJJQUxJVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdNRU5UTElHSFRGVlNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdNRU5UTElHSFRJVlNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGUkFHTUVOVE1BVEVSSUFMRlZTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdNRU5UTUFURVJJQUxJVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExJR0hURU5WSVNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fcmFzdGVycG9zX2NsaXAKKyNkZWZpbmUgR0xfSUJNX3Jhc3RlcnBvc19jbGlwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX3RleHR1cmVfbGlnaHRpbmcKKyNkZWZpbmUgR0xfSFBfdGV4dHVyZV9saWdodGluZyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19yYW5nZV9lbGVtZW50cworI2RlZmluZSBHTF9FWFRfZHJhd19yYW5nZV9lbGVtZW50cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRzRVhUIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfV0lOX3Bob25nX3NoYWRpbmcKKyNkZWZpbmUgR0xfV0lOX3Bob25nX3NoYWRpbmcgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfV0lOX3NwZWN1bGFyX2ZvZworI2RlZmluZSBHTF9XSU5fc3BlY3VsYXJfZm9nIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9saWdodF90ZXh0dXJlCisjZGVmaW5lIEdMX0VYVF9saWdodF90ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQXBwbHlUZXh0dXJlRVhUIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVMaWdodEVYVCAoR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlTWF0ZXJpYWxFWFQgKEdMZW51bSwgR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFQUExZVEVYVFVSRUVYVFBST0MpIChHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVMSUdIVEVYVFBST0MpIChHTGVudW0gcG5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFTUFURVJJQUxFWFRQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfYmxlbmRfYWxwaGFfbWlubWF4CisjZGVmaW5lIEdMX1NHSVhfYmxlbmRfYWxwaGFfbWlubWF4IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9iZ3JhCisjZGVmaW5lIEdMX0VYVF9iZ3JhIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfYXN5bmMKKyNkZWZpbmUgR0xfU0dJWF9hc3luYyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFzeW5jTWFya2VyU0dJWCAoR0x1aW50KTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsRmluaXNoQXN5bmNTR0lYIChHTHVpbnQgKik7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbFBvbGxBc3luY1NHSVggKEdMdWludCAqKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdlbkFzeW5jTWFya2Vyc1NHSVggKEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUFzeW5jTWFya2Vyc1NHSVggKEdMdWludCwgR0xzaXplaSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0FzeW5jTWFya2VyU0dJWCAoR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFTWU5DTUFSS0VSU0dJWFBST0MpIChHTHVpbnQgbWFya2VyKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEZJTklTSEFTWU5DU0dJWFBST0MpIChHTHVpbnQgKm1hcmtlcnApOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMUE9MTEFTWU5DU0dJWFBST0MpIChHTHVpbnQgKm1hcmtlcnApOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEdFTkFTWU5DTUFSS0VSU1NHSVhQUk9DKSAoR0xzaXplaSByYW5nZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUFTWU5DTUFSS0VSU1NHSVhQUk9DKSAoR0x1aW50IG1hcmtlciwgR0xzaXplaSByYW5nZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNBU1lOQ01BUktFUlNHSVhQUk9DKSAoR0x1aW50IG1hcmtlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2FzeW5jX3BpeGVsCisjZGVmaW5lIEdMX1NHSVhfYXN5bmNfcGl4ZWwgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9hc3luY19oaXN0b2dyYW0KKyNkZWZpbmUgR0xfU0dJWF9hc3luY19oaXN0b2dyYW0gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5URUxfcGFyYWxsZWxfYXJyYXlzCisjZGVmaW5lIEdMX0lOVEVMX3BhcmFsbGVsX2FycmF5cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFBvaW50ZXJ2SU5URUwgKEdMaW50LCBHTGVudW0sIGNvbnN0IEdMdm9pZCogKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlcnZJTlRFTCAoR0xlbnVtLCBjb25zdCBHTHZvaWQqICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlcnZJTlRFTCAoR0xpbnQsIEdMZW51bSwgY29uc3QgR0x2b2lkKiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXJ2SU5URUwgKEdMaW50LCBHTGVudW0sIGNvbnN0IEdMdm9pZCogKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhQT0lOVEVSVklOVEVMUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMUE9JTlRFUlZJTlRFTFBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUE9JTlRFUlZJTlRFTFBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEUE9JTlRFUlZJTlRFTFBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9IUF9vY2NsdXNpb25fdGVzdAorI2RlZmluZSBHTF9IUF9vY2NsdXNpb25fdGVzdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtCisjZGVmaW5lIEdMX0VYVF9waXhlbF90cmFuc2Zvcm0gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcmlFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmRVhUIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJpdkVYVCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxUUkFOU0ZPUk1QQVJBTUVURVJJRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUkZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxUUkFOU0ZPUk1QQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9waXhlbF90cmFuc2Zvcm1fY29sb3JfdGFibGUKKyNkZWZpbmUgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybV9jb2xvcl90YWJsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2hhcmVkX3RleHR1cmVfcGFsZXR0ZQorI2RlZmluZSBHTF9FWFRfc2hhcmVkX3RleHR1cmVfcGFsZXR0ZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2VwYXJhdGVfc3BlY3VsYXJfY29sb3IKKyNkZWZpbmUgR0xfRVhUX3NlcGFyYXRlX3NwZWN1bGFyX2NvbG9yIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zZWNvbmRhcnlfY29sb3IKKyNkZWZpbmUgR0xfRVhUX3NlY29uZGFyeV9jb2xvciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2JFWFQgKEdMYnl0ZSwgR0xieXRlLCBHTGJ5dGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2J2RVhUIChjb25zdCBHTGJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZEVYVCAoR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZHZFWFQgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2ZFWFQgKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2Z2RVhUIChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2lFWFQgKEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2l2RVhUIChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNzRVhUIChHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNzdkVYVCAoY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1YkVYVCAoR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWJ2RVhUIChjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VpRVhUIChHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1aXZFWFQgKGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1c0VYVCAoR0x1c2hvcnQsIEdMdXNob3J0LCBHTHVzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdXN2RVhUIChjb25zdCBHTHVzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvclBvaW50ZXJFWFQgKEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0JFWFRQUk9DKSAoR0xieXRlIHJlZCwgR0xieXRlIGdyZWVuLCBHTGJ5dGUgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0JWRVhUUFJPQykgKGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0RFWFRQUk9DKSAoR0xkb3VibGUgcmVkLCBHTGRvdWJsZSBncmVlbiwgR0xkb3VibGUgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0RWRVhUUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRkVYVFBST0MpIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRlZFWFRQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0lFWFRQUk9DKSAoR0xpbnQgcmVkLCBHTGludCBncmVlbiwgR0xpbnQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0lWRVhUUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzU0VYVFBST0MpIChHTHNob3J0IHJlZCwgR0xzaG9ydCBncmVlbiwgR0xzaG9ydCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzU1ZFWFRQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VCRVhUUFJPQykgKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVQlZFWFRQUk9DKSAoY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VJRVhUUFJPQykgKEdMdWludCByZWQsIEdMdWludCBncmVlbiwgR0x1aW50IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVSVZFWFRQUk9DKSAoY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVVNFWFRQUk9DKSAoR0x1c2hvcnQgcmVkLCBHTHVzaG9ydCBncmVlbiwgR0x1c2hvcnQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VTVkVYVFBST0MpIChjb25zdCBHTHVzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SUE9JTlRFUkVYVFBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9wZXJ0dXJiX25vcm1hbAorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9wZXJ0dXJiX25vcm1hbCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVOb3JtYWxFWFQgKEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFTk9STUFMRVhUUFJPQykgKEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cworI2RlZmluZSBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdBcnJheXNFWFQgKEdMZW51bSwgR0xpbnQgKiwgR0xzaXplaSAqLCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdFbGVtZW50c0VYVCAoR0xlbnVtLCBjb25zdCBHTHNpemVpICosIEdMZW51bSwgY29uc3QgR0x2b2lkKiAqLCBHTHNpemVpKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0FSUkFZU0VYVFBST0MpIChHTGVudW0gbW9kZSwgR0xpbnQgKmZpcnN0LCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdFTEVNRU5UU0VYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZm9nX2Nvb3JkCisjZGVmaW5lIEdMX0VYVF9mb2dfY29vcmQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGZFWFQgKEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkZnZFWFQgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRkRVhUIChHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRkdkVYVCAoY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRQb2ludGVyRVhUIChHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERkVYVFBST0MpIChHTGZsb2F0IGNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICpjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JEREVYVFBST0MpIChHTGRvdWJsZSBjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERFZFWFRQUk9DKSAoY29uc3QgR0xkb3VibGUgKmNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1JFTkRfc2NyZWVuX2Nvb3JkaW5hdGVzCisjZGVmaW5lIEdMX1JFTkRfc2NyZWVuX2Nvb3JkaW5hdGVzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb29yZGluYXRlX2ZyYW1lCisjZGVmaW5lIEdMX0VYVF9jb29yZGluYXRlX2ZyYW1lIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNiRVhUIChHTGJ5dGUsIEdMYnl0ZSwgR0xieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2J2RVhUIChjb25zdCBHTGJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNkRVhUIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2R2RVhUIChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2ZFWFQgKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzZnZFWFQgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNpRVhUIChHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2l2RVhUIChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M3NFWFQgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzc3ZFWFQgKGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzYkVYVCAoR0xieXRlLCBHTGJ5dGUsIEdMYnl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzYnZFWFQgKGNvbnN0IEdMYnl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNkRVhUIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNkdkVYVCAoY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzZkVYVCAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzZnZFWFQgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzaUVYVCAoR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzaXZFWFQgKGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM3NFWFQgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM3N2RVhUIChjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnRQb2ludGVyRVhUIChHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbFBvaW50ZXJFWFQgKEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNCRVhUUFJPQykgKEdMYnl0ZSB0eCwgR0xieXRlIHR5LCBHTGJ5dGUgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0JWRVhUUFJPQykgKGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzREVYVFBST0MpIChHTGRvdWJsZSB0eCwgR0xkb3VibGUgdHksIEdMZG91YmxlIHR6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNEVkVYVFBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzRkVYVFBST0MpIChHTGZsb2F0IHR4LCBHTGZsb2F0IHR5LCBHTGZsb2F0IHR6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNJRVhUUFJPQykgKEdMaW50IHR4LCBHTGludCB0eSwgR0xpbnQgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0lWRVhUUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNTRVhUUFJPQykgKEdMc2hvcnQgdHgsIEdMc2hvcnQgdHksIEdMc2hvcnQgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM1NWRVhUUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNCRVhUUFJPQykgKEdMYnl0ZSBieCwgR0xieXRlIGJ5LCBHTGJ5dGUgYnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNCVkVYVFBST0MpIChjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNERVhUUFJPQykgKEdMZG91YmxlIGJ4LCBHTGRvdWJsZSBieSwgR0xkb3VibGUgYnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNEVkVYVFBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0ZFWFRQUk9DKSAoR0xmbG9hdCBieCwgR0xmbG9hdCBieSwgR0xmbG9hdCBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0ZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNJRVhUUFJPQykgKEdMaW50IGJ4LCBHTGludCBieSwgR0xpbnQgYnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNJVkVYVFBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM1NFWFRQUk9DKSAoR0xzaG9ydCBieCwgR0xzaG9ydCBieSwgR0xzaG9ydCBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM1NWRVhUUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UUE9JTlRFUkVYVFBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMUE9JTlRFUkVYVFBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZQorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9zcGVjdWxhcl92ZWN0b3IKKyNkZWZpbmUgR0xfQVBQTEVfc3BlY3VsYXJfdmVjdG9yIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3RyYW5zZm9ybV9oaW50CisjZGVmaW5lIEdMX0FQUExFX3RyYW5zZm9ybV9oaW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZm9nX3NjYWxlCisjZGVmaW5lIEdMX1NHSVhfZm9nX3NjYWxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTlhfY29uc3RhbnRfZGF0YQorI2RlZmluZSBHTF9TVU5YX2NvbnN0YW50X2RhdGEgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2hUZXh0dXJlU1VOWCAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGSU5JU0hURVhUVVJFU1VOWFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9nbG9iYWxfYWxwaGEKKyNkZWZpbmUgR0xfU1VOX2dsb2JhbF9hbHBoYSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9yYlNVTiAoR0xieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcnNTVU4gKEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9yaVNVTiAoR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9yZlNVTiAoR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JkU1VOIChHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3J1YlNVTiAoR0x1Ynl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3J1c1NVTiAoR0x1c2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9ydWlTVU4gKEdMdWludCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUkJTVU5QUk9DKSAoR0xieXRlIGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SU1NVTlBST0MpIChHTHNob3J0IGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SSVNVTlBST0MpIChHTGludCBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUkZTVU5QUk9DKSAoR0xmbG9hdCBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUkRTVU5QUk9DKSAoR0xkb3VibGUgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JVQlNVTlBST0MpIChHTHVieXRlIGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SVVNTVU5QUk9DKSAoR0x1c2hvcnQgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JVSVNVTlBST0MpIChHTHVpbnQgZmFjdG9yKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl90cmlhbmdsZV9saXN0CisjZGVmaW5lIEdMX1NVTl90cmlhbmdsZV9saXN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlTVU4gKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldXNTVU4gKEdMdXNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1YlNVTiAoR0x1Ynl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWl2U1VOIChjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldXN2U1VOIChjb25zdCBHTHVzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1YnZTVU4gKGNvbnN0IEdMdWJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RlUG9pbnRlclNVTiAoR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQqICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlTVU5QUk9DKSAoR0x1aW50IGNvZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVU1NVTlBST0MpIChHTHVzaG9ydCBjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUJTVU5QUk9DKSAoR0x1Ynl0ZSBjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqY29kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVTVlNVTlBST0MpIChjb25zdCBHTHVzaG9ydCAqY29kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVCVlNVTlBST0MpIChjb25zdCBHTHVieXRlICpjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFUE9JTlRFUlNVTlBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX3ZlcnRleAorI2RlZmluZSBHTF9TVU5fdmVydGV4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0dWJWZXJ0ZXgyZlNVTiAoR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0dWJWZXJ0ZXgyZnZTVU4gKGNvbnN0IEdMdWJ5dGUgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR1YlZlcnRleDNmU1VOIChHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR1YlZlcnRleDNmdlNVTiAoY29uc3QgR0x1Ynl0ZSAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3IzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZlZlcnRleDNmU1VOIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZlZlcnRleDRmU1VOIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRmVmVydGV4NGZ2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yNHViVmVydGV4M2ZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZDb2xvcjR1YlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTHVieXRlICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmU1VOIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRmQ29sb3I0Zk5vcm1hbDNmVmVydGV4NGZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXg0ZnZTVU4gKGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlWZXJ0ZXgzZlNVTiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjR1YlZlcnRleDNmU1VOIChHTHVpbnQsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0dWJWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqLCBjb25zdCBHTHVieXRlICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjNmVmVydGV4M2ZTVU4gKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjNmVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aU5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZWZXJ0ZXgzZlNVTiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRVQlZFUlRFWDJGU1VOUFJPQykgKEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRVQlZFUlRFWDJGVlNVTlBST0MpIChjb25zdCBHTHVieXRlICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0VUJWRVJURVgzRlNVTlBST0MpIChHTHVieXRlIHIsIEdMdWJ5dGUgZywgR0x1Ynl0ZSBiLCBHTHVieXRlIGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRVQlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVieXRlICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1IzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0RlZFUlRFWDRGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHAsIEdMZmxvYXQgcSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0RlZFUlRFWDRGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjRVQlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTHVieXRlIHIsIEdMdWJ5dGUgZywgR0x1Ynl0ZSBiLCBHTHVieXRlIGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1I0VUJWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1IzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SNEZOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEZDT0xPUjRGTk9STUFMM0ZWRVJURVg0RlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCBwLCBHTGZsb2F0IHEsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0RkNPTE9SNEZOT1JNQUwzRlZFUlRFWDRGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1I0VUJWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1I0VUJWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0x1Ynl0ZSAqYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1IzRlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1IzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSUNPTE9SNEZOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVEVYQ09PUkQyRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVEVYQ09PUkQyRk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVEVYQ09PUkQyRk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9mdW5jX3NlcGFyYXRlCisjZGVmaW5lIEdMX0VYVF9ibGVuZF9mdW5jX3NlcGFyYXRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGVFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNTRVBBUkFURUVYVFBST0MpIChHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsIEdMZW51bSBzZmFjdG9yQWxwaGEsIEdMZW51bSBkZmFjdG9yQWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5HUl9ibGVuZF9mdW5jX3NlcGFyYXRlCisjZGVmaW5lIEdMX0lOR1JfYmxlbmRfZnVuY19zZXBhcmF0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlSU5HUiAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFSU5HUlBST0MpIChHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsIEdMZW51bSBzZmFjdG9yQWxwaGEsIEdMZW51bSBkZmFjdG9yQWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5HUl9jb2xvcl9jbGFtcAorI2RlZmluZSBHTF9JTkdSX2NvbG9yX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOR1JfaW50ZXJsYWNlX3JlYWQKKyNkZWZpbmUgR0xfSU5HUl9pbnRlcmxhY2VfcmVhZCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF93cmFwCisjZGVmaW5lIEdMX0VYVF9zdGVuY2lsX3dyYXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUXzQyMl9waXhlbHMKKyNkZWZpbmUgR0xfRVhUXzQyMl9waXhlbHMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4Z2VuX3JlZmxlY3Rpb24KKyNkZWZpbmUgR0xfTlZfdGV4Z2VuX3JlZmxlY3Rpb24gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcworI2RlZmluZSBHTF9TVU5fY29udm9sdXRpb25fYm9yZGVyX21vZGVzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9hZGQKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZW52X2FkZCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcworI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfd2VpZ2h0aW5nCisjZGVmaW5lIEdMX0VYVF92ZXJ0ZXhfd2VpZ2h0aW5nIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4V2VpZ2h0ZkVYVCAoR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4V2VpZ2h0ZnZFWFQgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4V2VpZ2h0UG9pbnRlckVYVCAoR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRGRVhUUFJPQykgKEdMZmxvYXQgd2VpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYV0VJR0hURlZFWFRQUk9DKSAoY29uc3QgR0xmbG9hdCAqd2VpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYV0VJR0hUUE9JTlRFUkVYVFBST0MpIChHTHNpemVpIHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2xpZ2h0X21heF9leHBvbmVudAorI2RlZmluZSBHTF9OVl9saWdodF9tYXhfZXhwb25lbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlCisjZGVmaW5lIEdMX05WX3ZlcnRleF9hcnJheV9yYW5nZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoVmVydGV4QXJyYXlSYW5nZU5WICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBcnJheVJhbmdlTlYgKEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNIVkVSVEVYQVJSQVlSQU5HRU5WUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBUlJBWVJBTkdFTlZQUk9DKSAoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMKKyNkZWZpbmUgR0xfTlZfcmVnaXN0ZXJfY29tYmluZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJQYXJhbWV0ZXJmdk5WIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJQYXJhbWV0ZXJmTlYgKEdMZW51bSwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJQYXJhbWV0ZXJpdk5WIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbWJpbmVyUGFyYW1ldGVyaU5WIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lcklucHV0TlYgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbWJpbmVyT3V0cHV0TlYgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xib29sZWFuLCBHTGJvb2xlYW4sIEdMYm9vbGVhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluYWxDb21iaW5lcklucHV0TlYgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tYmluZXJJbnB1dFBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21iaW5lcklucHV0UGFyYW1ldGVyaXZOViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21iaW5lck91dHB1dFBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tYmluZXJPdXRwdXRQYXJhbWV0ZXJpdk5WIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGaW5hbENvbWJpbmVySW5wdXRQYXJhbWV0ZXJmdk5WIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGaW5hbENvbWJpbmVySW5wdXRQYXJhbWV0ZXJpdk5WIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01CSU5FUlBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01CSU5FUlBBUkFNRVRFUkZOVlBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01CSU5FUlBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJQQVJBTUVURVJJTlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSSU5QVVROVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gdmFyaWFibGUsIEdMZW51bSBpbnB1dCwgR0xlbnVtIG1hcHBpbmcsIEdMZW51bSBjb21wb25lbnRVc2FnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVST1VUUFVUTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIGFiT3V0cHV0LCBHTGVudW0gY2RPdXRwdXQsIEdMZW51bSBzdW1PdXRwdXQsIEdMZW51bSBzY2FsZSwgR0xlbnVtIGJpYXMsIEdMYm9vbGVhbiBhYkRvdFByb2R1Y3QsIEdMYm9vbGVhbiBjZERvdFByb2R1Y3QsIEdMYm9vbGVhbiBtdXhTdW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGSU5BTENPTUJJTkVSSU5QVVROVlBST0MpIChHTGVudW0gdmFyaWFibGUsIEdMZW51bSBpbnB1dCwgR0xlbnVtIG1hcHBpbmcsIEdMZW51bSBjb21wb25lbnRVc2FnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTUJJTkVSSU5QVVRQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01CSU5FUklOUFVUUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gdmFyaWFibGUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTUJJTkVST1VUUFVUUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTUJJTkVST1VUUFVUUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGSU5BTENPTUJJTkVSSU5QVVRQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGSU5BTENPTUJJTkVSSU5QVVRQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZvZ19kaXN0YW5jZQorI2RlZmluZSBHTF9OVl9mb2dfZGlzdGFuY2UgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4Z2VuX2VtYm9zcworI2RlZmluZSBHTF9OVl90ZXhnZW5fZW1ib3NzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2JsZW5kX3NxdWFyZQorI2RlZmluZSBHTF9OVl9ibGVuZF9zcXVhcmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9lbnZfY29tYmluZTQKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9lbnZfY29tYmluZTQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV9yZXNpemVfYnVmZmVycworI2RlZmluZSBHTF9NRVNBX3Jlc2l6ZV9idWZmZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVzaXplQnVmZmVyc01FU0EgKHZvaWQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVTSVpFQlVGRkVSU01FU0FQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9NRVNBX3dpbmRvd19wb3MKKyNkZWZpbmUgR0xfTUVTQV93aW5kb3dfcG9zIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmRNRVNBIChHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJkdk1FU0EgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmTUVTQSAoR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmZ2TUVTQSAoY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyaU1FU0EgKEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMml2TUVTQSAoY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMnNNRVNBIChHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Myc3ZNRVNBIChjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkTUVTQSAoR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2R2TUVTQSAoY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2ZNRVNBIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZnZNRVNBIChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpTUVTQSAoR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2l2TUVTQSAoY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3NNRVNBIChHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Mzc3ZNRVNBIChjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRkTUVTQSAoR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRkdk1FU0EgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRmTUVTQSAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGZ2TUVTQSAoY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0aU1FU0EgKEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0aXZNRVNBIChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0c01FU0EgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRzdk1FU0EgKGNvbnN0IEdMc2hvcnQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRE1FU0FQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJEVk1FU0FQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRk1FU0FQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRlZNRVNBUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MySU1FU0FQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJVk1FU0FQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyU01FU0FQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyU1ZNRVNBUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRE1FU0FQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNEVk1FU0FQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRk1FU0FQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGVk1FU0FQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNJTUVTQVBST0MpIChHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lWTUVTQVBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNTTUVTQVBST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NWTUVTQVBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNERNRVNBUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0RFZNRVNBUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNEZNRVNBUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzRGVk1FU0FQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzRJTUVTQVBST0MpIChHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNElWTUVTQVBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzRTTUVTQVBST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0U1ZNRVNBUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX2N1bGxfdmVydGV4CisjZGVmaW5lIEdMX0lCTV9jdWxsX3ZlcnRleCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fbXVsdGltb2RlX2RyYXdfYXJyYXlzCisjZGVmaW5lIEdMX0lCTV9tdWx0aW1vZGVfZHJhd19hcnJheXMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aU1vZGVEcmF3QXJyYXlzSUJNIChjb25zdCBHTGVudW0gKiwgY29uc3QgR0xpbnQgKiwgY29uc3QgR0xzaXplaSAqLCBHTHNpemVpLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlNb2RlRHJhd0VsZW1lbnRzSUJNIChjb25zdCBHTGVudW0gKiwgY29uc3QgR0xzaXplaSAqLCBHTGVudW0sIGNvbnN0IEdMdm9pZCogY29uc3QgKiwgR0xzaXplaSwgR0xpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElNT0RFRFJBV0FSUkFZU0lCTVBST0MpIChjb25zdCBHTGVudW0gKm1vZGUsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTGludCBtb2Rlc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElNT0RFRFJBV0VMRU1FTlRTSUJNUFJPQykgKGNvbnN0IEdMZW51bSAqbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGNvbnN0ICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCwgR0xpbnQgbW9kZXN0cmlkZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fdmVydGV4X2FycmF5X2xpc3RzCisjZGVmaW5lIEdMX0lCTV92ZXJ0ZXhfYXJyYXlfbGlzdHMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXJMaXN0SUJNIChHTGludCwgR0xlbnVtLCBHTGludCwgY29uc3QgR0x2b2lkKiAqLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyTGlzdElCTSAoR0xpbnQsIEdMZW51bSwgR0xpbnQsIGNvbnN0IEdMdm9pZCogKiwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVkZ2VGbGFnUG9pbnRlckxpc3RJQk0gKEdMaW50LCBjb25zdCBHTGJvb2xlYW4qICosIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZFBvaW50ZXJMaXN0SUJNIChHTGVudW0sIEdMaW50LCBjb25zdCBHTHZvaWQqICosIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbmRleFBvaW50ZXJMaXN0SUJNIChHTGVudW0sIEdMaW50LCBjb25zdCBHTHZvaWQqICosIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyTGlzdElCTSAoR0xlbnVtLCBHTGludCwgY29uc3QgR0x2b2lkKiAqLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyTGlzdElCTSAoR0xpbnQsIEdMZW51bSwgR0xpbnQsIGNvbnN0IEdMdm9pZCogKiwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFBvaW50ZXJMaXN0SUJNIChHTGludCwgR0xlbnVtLCBHTGludCwgY29uc3QgR0x2b2lkKiAqLCBHTGludCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlBPSU5URVJMSVNUSUJNUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRURHRUZMQUdQT0lOVEVSTElTVElCTVBST0MpIChHTGludCBzdHJpZGUsIGNvbnN0IEdMYm9vbGVhbiogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JEUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5ERVhQT0lOVEVSTElTVElCTVBST0MpIChHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxQT0lOVEVSTElTVElCTVBST0MpIChHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFBPSU5URVJMSVNUSUJNUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFBPSU5URVJMSVNUSUJNUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3N1YnNhbXBsZQorI2RlZmluZSBHTF9TR0lYX3N1YnNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ljcmNiYQorI2RlZmluZSBHTF9TR0lYX3ljcmNiYSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ljcmNiX3N1YnNhbXBsZQorI2RlZmluZSBHTF9TR0lYX3ljcmNiX3N1YnNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2RlcHRoX3Bhc3NfaW5zdHJ1bWVudAorI2RlZmluZSBHTF9TR0lYX2RlcHRoX3Bhc3NfaW5zdHJ1bWVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX3RleHR1cmVfY29tcHJlc3Npb25fRlhUMQorI2RlZmluZSBHTF8zREZYX3RleHR1cmVfY29tcHJlc3Npb25fRlhUMSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX211bHRpc2FtcGxlCisjZGVmaW5lIEdMXzNERlhfbXVsdGlzYW1wbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfM0RGWF90YnVmZmVyCisjZGVmaW5lIEdMXzNERlhfdGJ1ZmZlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRidWZmZXJNYXNrM0RGWCAoR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRCVUZGRVJNQVNLM0RGWFBST0MpIChHTHVpbnQgbWFzayk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfRVhUX211bHRpc2FtcGxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlTWFza0VYVCAoR0xjbGFtcGYsIEdMYm9vbGVhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlUGF0dGVybkVYVCAoR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRU1BU0tFWFRQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVQQVRURVJORVhUUFJPQykgKEdMZW51bSBwYXR0ZXJuKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdmVydGV4X3ByZWNsaXAKKyNkZWZpbmUgR0xfU0dJWF92ZXJ0ZXhfcHJlY2xpcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2NvbnZvbHV0aW9uX2FjY3VyYWN5CisjZGVmaW5lIEdMX1NHSVhfY29udm9sdXRpb25fYWNjdXJhY3kgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9yZXNhbXBsZQorI2RlZmluZSBHTF9TR0lYX3Jlc2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcG9pbnRfbGluZV90ZXhnZW4KKyNkZWZpbmUgR0xfU0dJU19wb2ludF9saW5lX3RleGdlbiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfY29sb3JfbWFzaworI2RlZmluZSBHTF9TR0lTX3RleHR1cmVfY29sb3JfbWFzayAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVDb2xvck1hc2tTR0lTIChHTGJvb2xlYW4sIEdMYm9vbGVhbiwgR0xib29sZWFuLCBHTGJvb2xlYW4pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUNPTE9STUFTS1NHSVNQUk9DKSAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaWdsb29faW50ZXJmYWNlCisjZGVmaW5lIEdMX1NHSVhfaWdsb29faW50ZXJmYWNlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSWdsb29JbnRlcmZhY2VTR0lYIChHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElHTE9PSU5URVJGQUNFU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMdm9pZCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9kb3QzCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2Vudl9kb3QzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV90ZXh0dXJlX21pcnJvcl9vbmNlCisjZGVmaW5lIEdMX0FUSV90ZXh0dXJlX21pcnJvcl9vbmNlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZlbmNlCisjZGVmaW5lIEdMX05WX2ZlbmNlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlRmVuY2VzTlYgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5GZW5jZXNOViAoR0xzaXplaSwgR0x1aW50ICopOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNGZW5jZU5WIChHTHVpbnQpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsVGVzdEZlbmNlTlYgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RmVuY2Vpdk5WIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluaXNoRmVuY2VOViAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZXRGZW5jZU5WIChHTHVpbnQsIEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVGRU5DRVNOVlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORkVOQ0VTTlZQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMVEVTVEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURkVOQ0VJVk5WUFJPQykgKEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRklOSVNIRkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ldmFsdWF0b3JzCisjZGVmaW5lIEdMX05WX2V2YWx1YXRvcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXBDb250cm9sUG9pbnRzTlYgKEdMZW51bSwgR0x1aW50LCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50LCBHTGludCwgR0xib29sZWFuLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFwUGFyYW1ldGVyaXZOViAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hcFBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1hcENvbnRyb2xQb2ludHNOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xib29sZWFuLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwUGFyYW1ldGVyaXZOViAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1hcFBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1hcEF0dHJpYlBhcmFtZXRlcml2TlYgKEdMZW51bSwgR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1hcEF0dHJpYlBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRXZhbE1hcHNOViAoR0xlbnVtLCBHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFQQ09OVFJPTFBPSU5UU05WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgdXN0cmlkZSwgR0xzaXplaSB2c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMaW50IHZvcmRlciwgR0xib29sZWFuIHBhY2tlZCwgY29uc3QgR0x2b2lkICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVBQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BUFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBDT05UUk9MUE9JTlRTTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xzaXplaSB1c3RyaWRlLCBHTHNpemVpIHZzdHJpZGUsIEdMYm9vbGVhbiBwYWNrZWQsIEdMdm9pZCAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUFQUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUFQQVRUUklCUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1BUEFUVFJJQlBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVWQUxNQVBTTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfTlZfcGFja2VkX2RlcHRoX3N0ZW5jaWwgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcmVnaXN0ZXJfY29tYmluZXJzMgorI2RlZmluZSBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJTdGFnZVBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbWJpbmVyU3RhZ2VQYXJhbWV0ZXJmdk5WIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSU1RBR0VQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01CSU5FUlNUQUdFUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfY29tcHJlc3Npb25fdnRjCisjZGVmaW5lIEdMX05WX3RleHR1cmVfY29tcHJlc3Npb25fdnRjIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfcmVjdGFuZ2xlCisjZGVmaW5lIEdMX05WX3RleHR1cmVfcmVjdGFuZ2xlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyCisjZGVmaW5lIEdMX05WX3RleHR1cmVfc2hhZGVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyMgorI2RlZmluZSBHTF9OVl90ZXh0dXJlX3NoYWRlcjIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlMgorI2RlZmluZSBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtCisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xBcmVQcm9ncmFtc1Jlc2lkZW50TlYgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqLCBHTGJvb2xlYW4gKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFByb2dyYW1OViAoR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVByb2dyYW1zTlYgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFeGVjdXRlUHJvZ3JhbU5WIChHTGVudW0sIEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5Qcm9ncmFtc05WIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVBhcmFtZXRlcmR2TlYgKEdMZW51bSwgR0x1aW50LCBHTGVudW0sIEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1QYXJhbWV0ZXJmdk5WIChHTGVudW0sIEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1pdk5WIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVN0cmluZ05WIChHTHVpbnQsIEdMZW51bSwgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUcmFja01hdHJpeGl2TlYgKEdMZW51bSwgR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmR2TlYgKEdMdWludCwgR0xlbnVtLCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJmdk5WIChHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdk5WIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnZOViAoR0x1aW50LCBHTGVudW0sIEdMdm9pZCogKik7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1Byb2dyYW1OViAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkUHJvZ3JhbU5WIChHTGVudW0sIEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyNGROViAoR0xlbnVtLCBHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyNGR2TlYgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyNGZOViAoR0xlbnVtLCBHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXI0ZnZOViAoR0xlbnVtLCBHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcnM0ZHZOViAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcnM0ZnZOViAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXF1ZXN0UmVzaWRlbnRQcm9ncmFtc05WIChHTHNpemVpLCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhY2tNYXRyaXhOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyTlYgKEdMdWludCwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFkTlYgKEdMdWludCwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFkdk5WIChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmTlYgKEdMdWludCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWZ2TlYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc05WIChHTHVpbnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzdk5WIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmROViAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkdk5WIChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmTlYgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmZ2TlYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc05WIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJzdk5WIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2ROViAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZHZOViAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZk5WIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmdk5WIChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3NOViAoR0x1aW50LCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzc3ZOViAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkTlYgKEdMdWludCwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkdk5WIChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmTlYgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZ2TlYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0c05WIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzdk5WIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHViTlYgKEdMdWludCwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHVidk5WIChHTHVpbnQsIGNvbnN0IEdMdWJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczFkdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMxZnZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMxc3ZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMyZHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMmZ2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMnN2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzM2R2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczNmdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczNzdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczRkdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnM0ZnZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnM0c3ZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnM0dWJ2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1Ynl0ZSAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMQVJFUFJPR1JBTVNSRVNJREVOVE5WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcywgR0xib29sZWFuICpyZXNpZGVuY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFBST0dSQU1OVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVQUk9HUkFNU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVYRUNVVEVQUk9HUkFNTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5QUk9HUkFNU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpwcm9ncmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1QQVJBTUVURVJEVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1JVk5WUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVNUUklOR05WUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVieXRlICpwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVFJBQ0tNQVRSSVhJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBhZGRyZXNzLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJEVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCSVZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQlBPSU5URVJWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBvaW50ZXIpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTUFJPR1JBTU5WUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURQUk9HUkFNTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVI0RE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVI0RFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUjRGTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSNEZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUlM0RFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSUzRGVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVRVUVTVFJFU0lERU5UUFJPR1JBTVNOVlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcHJvZ3JhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUUkFDS01BVFJJWE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBhZGRyZXNzLCBHTGVudW0gbWF0cml4LCBHTGVudW0gdHJhbnNmb3JtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUE9JTlRFUk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgZnNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFGVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJEVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyU05WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNEVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNTTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRGVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUJOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWJ5dGUgeCwgR0x1Ynl0ZSB5LCBHTHVieXRlIHosIEdMdWJ5dGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVQlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMURWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMxRlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMVNWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzJEVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMkZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzJTVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMzRFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzNGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMzU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNERWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlM0RlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNFNWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzRVQlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWJ5dGUgKnYpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX2Nvb3JkaW5hdGVfY2xhbXAKKyNkZWZpbmUgR0xfU0dJWF90ZXh0dXJlX2Nvb3JkaW5hdGVfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zY2FsZWJpYXNfaGludAorI2RlZmluZSBHTF9TR0lYX3NjYWxlYmlhc19oaW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX09NTF9pbnRlcmxhY2UKKyNkZWZpbmUgR0xfT01MX2ludGVybGFjZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9PTUxfc3Vic2FtcGxlCisjZGVmaW5lIEdMX09NTF9zdWJzYW1wbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfT01MX3Jlc2FtcGxlCisjZGVmaW5lIEdMX09NTF9yZXNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9jb3B5X2RlcHRoX3RvX2NvbG9yCisjZGVmaW5lIEdMX05WX2NvcHlfZGVwdGhfdG9fY29sb3IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2Vudm1hcF9idW1wbWFwCisjZGVmaW5lIEdMX0FUSV9lbnZtYXBfYnVtcG1hcCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEJ1bXBQYXJhbWV0ZXJpdkFUSSAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhCdW1wUGFyYW1ldGVyZnZBVEkgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXhCdW1wUGFyYW1ldGVyaXZBVEkgKEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4QnVtcFBhcmFtZXRlcmZ2QVRJIChHTGVudW0sIEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhCVU1QUEFSQU1FVEVSSVZBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhCVU1QUEFSQU1FVEVSRlZBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWEJVTVBQQVJBTUVURVJJVkFUSVBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWEJVTVBQQVJBTUVURVJGVkFUSVBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9mcmFnbWVudF9zaGFkZXIKKyNkZWZpbmUgR0xfQVRJX2ZyYWdtZW50X3NoYWRlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuRnJhZ21lbnRTaGFkZXJzQVRJIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRGcmFnbWVudFNoYWRlckFUSSAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVGcmFnbWVudFNoYWRlckFUSSAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpbkZyYWdtZW50U2hhZGVyQVRJICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmRGcmFnbWVudFNoYWRlckFUSSAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGFzc1RleENvb3JkQVRJIChHTHVpbnQsIEdMdWludCwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVNYXBBVEkgKEdMdWludCwgR0x1aW50LCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yRnJhZ21lbnRPcDFBVEkgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JGcmFnbWVudE9wMkFUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvckZyYWdtZW50T3AzQVRJIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnJhZ21lbnRPcDFBVEkgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnJhZ21lbnRPcDJBVEkgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnJhZ21lbnRPcDNBVEkgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldEZyYWdtZW50U2hhZGVyQ29uc3RhbnRBVEkgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMR0VORlJBR01FTlRTSEFERVJTQVRJUFJPQykgKEdMdWludCByYW5nZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRGUkFHTUVOVFNIQURFUkFUSVBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVGUkFHTUVOVFNIQURFUkFUSVBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTkZSQUdNRU5UU0hBREVSQVRJUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRGUkFHTUVOVFNIQURFUkFUSVBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUEFTU1RFWENPT1JEQVRJUFJPQykgKEdMdWludCBkc3QsIEdMdWludCBjb29yZCwgR0xlbnVtIHN3aXp6bGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVNQVBBVElQUk9DKSAoR0x1aW50IGRzdCwgR0x1aW50IGludGVycCwgR0xlbnVtIHN3aXp6bGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUkZSQUdNRU5UT1AxQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1hc2ssIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUkZSQUdNRU5UT1AyQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1hc2ssIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUkZSQUdNRU5UT1AzQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1hc2ssIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QsIEdMdWludCBhcmczLCBHTHVpbnQgYXJnM1JlcCwgR0x1aW50IGFyZzNNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBTFBIQUZSQUdNRU5UT1AxQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFMUEhBRlJBR01FTlRPUDJBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TW9kLCBHTHVpbnQgYXJnMSwgR0x1aW50IGFyZzFSZXAsIEdMdWludCBhcmcxTW9kLCBHTHVpbnQgYXJnMiwgR0x1aW50IGFyZzJSZXAsIEdMdWludCBhcmcyTW9kKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUxQSEFGUkFHTUVOVE9QM0FUSVBST0MpIChHTGVudW0gb3AsIEdMdWludCBkc3QsIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QsIEdMdWludCBhcmczLCBHTHVpbnQgYXJnM1JlcCwgR0x1aW50IGFyZzNNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRGUkFHTUVOVFNIQURFUkNPTlNUQU5UQVRJUFJPQykgKEdMdWludCBkc3QsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9wbl90cmlhbmdsZXMKKyNkZWZpbmUgR0xfQVRJX3BuX3RyaWFuZ2xlcyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBOVHJpYW5nbGVzaUFUSSAoR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUE5UcmlhbmdsZXNmQVRJIChHTGVudW0sIEdMZmxvYXQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE5UUklBTkdMRVNJQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQTlRSSUFOR0xFU0ZBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV92ZXJ0ZXhfYXJyYXlfb2JqZWN0CisjZGVmaW5lIEdMX0FUSV92ZXJ0ZXhfYXJyYXlfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xOZXdPYmplY3RCdWZmZXJBVEkgKEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqLCBHTGVudW0pOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNPYmplY3RCdWZmZXJBVEkgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVXBkYXRlT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQsIEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x2b2lkICosIEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2JqZWN0QnVmZmVyZnZBVEkgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE9iamVjdEJ1ZmZlcml2QVRJIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJlZU9iamVjdEJ1ZmZlckFUSSAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBcnJheU9iamVjdEFUSSAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXJyYXlPYmplY3RmdkFUSSAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXJyYXlPYmplY3RpdkFUSSAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRBcnJheU9iamVjdEFUSSAoR0x1aW50LCBHTGVudW0sIEdMc2l6ZWksIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50QXJyYXlPYmplY3RmdkFUSSAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudEFycmF5T2JqZWN0aXZBVEkgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMTkVXT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMc2l6ZWkgc2l6ZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTGVudW0gdXNhZ2UpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVUERBVEVPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0x1aW50IG9mZnNldCwgR0xzaXplaSBzaXplLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMZW51bSBwcmVzZXJ2ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE9CSkVDVEJVRkZFUkZWQVRJUFJPQykgKEdMdWludCBidWZmZXIsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUQlVGRkVSSVZBVElQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJFRU9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVJSQVlPQkpFQ1RBVElQUk9DKSAoR0xlbnVtIGFycmF5LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBUlJBWU9CSkVDVEZWQVRJUFJPQykgKEdMZW51bSBhcnJheSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBUlJBWU9CSkVDVElWQVRJUFJPQykgKEdMZW51bSBhcnJheSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVEFSUkFZT0JKRUNUQVRJUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVEFSUkFZT0JKRUNURlZBVElQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZBUklBTlRBUlJBWU9CSkVDVElWQVRJUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfc2hhZGVyCisjZGVmaW5lIEdMX0VYVF92ZXJ0ZXhfc2hhZGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5WZXJ0ZXhTaGFkZXJFWFQgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFZlcnRleFNoYWRlckVYVCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFZlcnRleFNoYWRlckVYVCAoR0x1aW50KTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdlblZlcnRleFNoYWRlcnNFWFQgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVmVydGV4U2hhZGVyRVhUIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlck9wMUVYVCAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyT3AyRVhUIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlck9wM0VYVCAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN3aXp6bGVFWFQgKEdMdWludCwgR0x1aW50LCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdyaXRlTWFza0VYVCAoR0x1aW50LCBHTHVpbnQsIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5zZXJ0Q29tcG9uZW50RVhUIChHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFeHRyYWN0Q29tcG9uZW50RVhUIChHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdlblN5bWJvbHNFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2V0SW52YXJpYW50RVhUIChHTHVpbnQsIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldExvY2FsQ29uc3RhbnRFWFQgKEdMdWludCwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudGJ2RVhUIChHTHVpbnQsIGNvbnN0IEdMYnl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50c3ZFWFQgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50aXZFWFQgKEdMdWludCwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudGZ2RVhUIChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudGR2RVhUIChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnR1YnZFWFQgKEdMdWludCwgY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50dXN2RVhUIChHTHVpbnQsIGNvbnN0IEdMdXNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnR1aXZFWFQgKEdMdWludCwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRQb2ludGVyRVhUIChHTHVpbnQsIEdMZW51bSwgR0x1aW50LCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlVmFyaWFudENsaWVudFN0YXRlRVhUIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVWYXJpYW50Q2xpZW50U3RhdGVFWFQgKEdMdWludCk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xCaW5kTGlnaHRQYXJhbWV0ZXJFWFQgKEdMZW51bSwgR0xlbnVtKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEJpbmRNYXRlcmlhbFBhcmFtZXRlckVYVCAoR0xlbnVtLCBHTGVudW0pOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQmluZFRleEdlblBhcmFtZXRlckVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZVVuaXRQYXJhbWV0ZXJFWFQgKEdMZW51bSwgR0xlbnVtKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEJpbmRQYXJhbWV0ZXJFWFQgKEdMZW51bSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1ZhcmlhbnRFbmFibGVkRVhUIChHTHVpbnQsIEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudEJvb2xlYW52RVhUIChHTHVpbnQsIEdMZW51bSwgR0xib29sZWFuICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZhcmlhbnRJbnRlZ2VydkVYVCAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZhcmlhbnRGbG9hdHZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZhcmlhbnRQb2ludGVydkVYVCAoR0x1aW50LCBHTGVudW0sIEdMdm9pZCogKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW52YXJpYW50Qm9vbGVhbnZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGJvb2xlYW4gKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW52YXJpYW50SW50ZWdlcnZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnZhcmlhbnRGbG9hdHZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExvY2FsQ29uc3RhbnRCb29sZWFudkVYVCAoR0x1aW50LCBHTGVudW0sIEdMYm9vbGVhbiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRMb2NhbENvbnN0YW50SW50ZWdlcnZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRMb2NhbENvbnN0YW50RmxvYXR2RVhUIChHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOVkVSVEVYU0hBREVSRVhUUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRWRVJURVhTSEFERVJFWFRQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRWRVJURVhTSEFERVJFWFRQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRU5WRVJURVhTSEFERVJTRVhUUFJPQykgKEdMdWludCByYW5nZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVZFUlRFWFNIQURFUkVYVFBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJPUDFFWFRQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgcmVzLCBHTHVpbnQgYXJnMSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQURFUk9QMkVYVFBST0MpIChHTGVudW0gb3AsIEdMdWludCByZXMsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQURFUk9QM0VYVFBST0MpIChHTGVudW0gb3AsIEdMdWludCByZXMsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMiwgR0x1aW50IGFyZzMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTV0laWkxFRVhUUFJPQykgKEdMdWludCByZXMsIEdMdWludCBpbiwgR0xlbnVtIG91dFgsIEdMZW51bSBvdXRZLCBHTGVudW0gb3V0WiwgR0xlbnVtIG91dFcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXUklURU1BU0tFWFRQUk9DKSAoR0x1aW50IHJlcywgR0x1aW50IGluLCBHTGVudW0gb3V0WCwgR0xlbnVtIG91dFksIEdMZW51bSBvdXRaLCBHTGVudW0gb3V0Vyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElOU0VSVENPTVBPTkVOVEVYVFBST0MpIChHTHVpbnQgcmVzLCBHTHVpbnQgc3JjLCBHTHVpbnQgbnVtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRVhUUkFDVENPTVBPTkVOVEVYVFBST0MpIChHTHVpbnQgcmVzLCBHTHVpbnQgc3JjLCBHTHVpbnQgbnVtKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRU5TWU1CT0xTRVhUUFJPQykgKEdMZW51bSBkYXRhdHlwZSwgR0xlbnVtIHN0b3JhZ2V0eXBlLCBHTGVudW0gcmFuZ2UsIEdMdWludCBjb21wb25lbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VUSU5WQVJJQU5URVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVExPQ0FMQ09OU1RBTlRFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVEJWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xieXRlICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVFNWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xzaG9ydCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRJVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMaW50ICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVEZWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xmbG9hdCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlREVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMZG91YmxlICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVFVCVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMdWJ5dGUgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UVVNWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0x1c2hvcnQgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UVUlWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0x1aW50ICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVFBPSU5URVJFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgR0x1aW50IHN0cmlkZSwgY29uc3QgR0x2b2lkICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5BQkxFVkFSSUFOVENMSUVOVFNUQVRFRVhUUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERJU0FCTEVWQVJJQU5UQ0xJRU5UU1RBVEVFWFRQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xCSU5ETElHSFRQQVJBTUVURVJFWFRQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gdmFsdWUpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEJJTkRNQVRFUklBTFBBUkFNRVRFUkVYVFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHZhbHVlKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xCSU5EVEVYR0VOUEFSQU1FVEVSRVhUUFJPQykgKEdMZW51bSB1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSB2YWx1ZSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQklORFRFWFRVUkVVTklUUEFSQU1FVEVSRVhUUFJPQykgKEdMZW51bSB1bml0LCBHTGVudW0gdmFsdWUpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEJJTkRQQVJBTUVURVJFWFRQUk9DKSAoR0xlbnVtIHZhbHVlKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1ZBUklBTlRFTkFCTEVERVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIGNhcCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZBUklBTlRCT09MRUFOVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xib29sZWFuICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVElOVEVHRVJWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGludCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZBUklBTlRGTE9BVFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMZmxvYXQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWQVJJQU5UUE9JTlRFUlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMdm9pZCogKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlZBUklBTlRCT09MRUFOVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xib29sZWFuICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5WQVJJQU5USU5URUdFUlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMaW50ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5WQVJJQU5URkxPQVRWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGZsb2F0ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTE9DQUxDT05TVEFOVEJPT0xFQU5WRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4gKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMT0NBTENPTlNUQU5USU5URUdFUlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMaW50ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTE9DQUxDT05TVEFOVEZMT0FUVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xmbG9hdCAqZGF0YSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X3N0cmVhbXMKKyNkZWZpbmUgR0xfQVRJX3ZlcnRleF9zdHJlYW1zIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMXNBVEkgKEdMZW51bSwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMXN2QVRJIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMWlBVEkgKEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFpdkFUSSAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xZkFUSSAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xZnZBVEkgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xZEFUSSAoR0xlbnVtLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMWR2QVRJIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJzQVRJIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJzdkFUSSAoR0xlbnVtLCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJpQVRJIChHTGVudW0sIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMml2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJmQVRJIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJkQVRJIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmR2QVRJIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNzQVRJIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNzdkFUSSAoR0xlbnVtLCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNpQVRJIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNpdkFUSSAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zZkFUSSAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zZnZBVEkgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zZEFUSSAoR0xlbnVtLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zZHZBVEkgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNHNBVEkgKEdMZW51bSwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNHN2QVRJIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNGlBVEkgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRpdkFUSSAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00ZkFUSSAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00ZnZBVEkgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00ZEFUSSAoR0xlbnVtLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNGR2QVRJIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNiQVRJIChHTGVudW0sIEdMYnl0ZSwgR0xieXRlLCBHTGJ5dGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNidkFUSSAoR0xlbnVtLCBjb25zdCBHTGJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM3NBVEkgKEdMZW51bSwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM3N2QVRJIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2lBVEkgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2l2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNmQVRJIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNkQVRJIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNkdkFUSSAoR0xlbnVtLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVWZXJ0ZXhTdHJlYW1BVEkgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QmxlbmRFbnZpQVRJIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhCbGVuZEVudmZBVEkgKEdMZW51bSwgR0xmbG9hdCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xU0FUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xU1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMUlBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMUZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMUZWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFEQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xRFZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMlNWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJJQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMaW50IHgsIEdMaW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0ySVZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJGQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMkZWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJEQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0yRFZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zU1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0lBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNGVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGZsb2F0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zREFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0RWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZG91YmxlICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00U0FUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00U1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNElBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTRJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNEZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNEZWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTREQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00RFZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNCQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMYnl0ZSBueCwgR0xieXRlIG55LCBHTGJ5dGUgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zQlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xieXRlICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zU0FUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IG54LCBHTHNob3J0IG55LCBHTHNob3J0IG56KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM1NWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNJQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMaW50IG54LCBHTGludCBueSwgR0xpbnQgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zSVZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNGQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zRlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0RBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgbngsIEdMZG91YmxlIG55LCBHTGRvdWJsZSBueik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNEVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UQUNUSVZFVkVSVEVYU1RSRUFNQVRJUFJPQykgKEdMZW51bSBzdHJlYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhCTEVOREVOVklBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEJMRU5ERU5WRkFUSVBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfQVRJX2VsZW1lbnRfYXJyYXkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbGVtZW50UG9pbnRlckFUSSAoR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRBcnJheUFUSSAoR0xlbnVtLCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3UmFuZ2VFbGVtZW50QXJyYXlBVEkgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMc2l6ZWkpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRUxFTUVOVFBPSU5URVJBVElQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdFTEVNRU5UQVJSQVlBVElQUk9DKSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXUkFOR0VFTEVNRU5UQVJSQVlBVElQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fbWVzaF9hcnJheQorI2RlZmluZSBHTF9TVU5fbWVzaF9hcnJheSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdNZXNoQXJyYXlzU1VOIChHTGVudW0sIEdMaW50LCBHTHNpemVpLCBHTHNpemVpKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdNRVNIQVJSQVlTU1VOUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSB3aWR0aCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fc2xpY2VfYWNjdW0KKyNkZWZpbmUgR0xfU1VOX3NsaWNlX2FjY3VtIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX211bHRpc2FtcGxlX2ZpbHRlcl9oaW50CisjZGVmaW5lIEdMX05WX211bHRpc2FtcGxlX2ZpbHRlcl9oaW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2RlcHRoX2NsYW1wCisjZGVmaW5lIEdMX05WX2RlcHRoX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX29jY2x1c2lvbl9xdWVyeQorI2RlZmluZSBHTF9OVl9vY2NsdXNpb25fcXVlcnkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5PY2NsdXNpb25RdWVyaWVzTlYgKEdMc2l6ZWksIEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVPY2NsdXNpb25RdWVyaWVzTlYgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzT2NjbHVzaW9uUXVlcnlOViAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpbk9jY2x1c2lvblF1ZXJ5TlYgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kT2NjbHVzaW9uUXVlcnlOViAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2NjbHVzaW9uUXVlcnlpdk5WIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2NjbHVzaW9uUXVlcnl1aXZOViAoR0x1aW50LCBHTGVudW0sIEdMdWludCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTk9DQ0xVU0lPTlFVRVJJRVNOVlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFT0NDTFVTSU9OUVVFUklFU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTT0NDTFVTSU9OUVVFUllOVlBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTk9DQ0xVU0lPTlFVRVJZTlZQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5ET0NDTFVTSU9OUVVFUllOVlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0NDTFVTSU9OUVVFUllJVk5WUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0NDTFVTSU9OUVVFUllVSVZOVlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcG9pbnRfc3ByaXRlCisjZGVmaW5lIEdMX05WX3BvaW50X3Nwcml0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyaU5WIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcml2TlYgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUklOVlBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3NoYWRlcjMKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9zaGFkZXIzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMV8xCisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMV8xIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zaGFkb3dfZnVuY3MKKyNkZWZpbmUgR0xfRVhUX3NoYWRvd19mdW5jcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF90d29fc2lkZQorI2RlZmluZSBHTF9FWFRfc3RlbmNpbF90d29fc2lkZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVN0ZW5jaWxGYWNlRVhUIChHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUNUSVZFU1RFTkNJTEZBQ0VFWFRQUk9DKSAoR0xlbnVtIGZhY2UpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHRfZnJhZ21lbnRfc2hhZGVyCisjZGVmaW5lIEdMX0FUSV90ZXh0X2ZyYWdtZW50X3NoYWRlciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9jbGllbnRfc3RvcmFnZQorI2RlZmluZSBHTF9BUFBMRV9jbGllbnRfc3RvcmFnZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9lbGVtZW50X2FycmF5CisjZGVmaW5lIEdMX0FQUExFX2VsZW1lbnRfYXJyYXkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbGVtZW50UG9pbnRlckFQUExFIChHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudEFycmF5QVBQTEUgKEdMZW51bSwgR0xpbnQsIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRBcnJheUFQUExFIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTGludCwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3RWxlbWVudEFycmF5QVBQTEUgKEdMZW51bSwgY29uc3QgR0xpbnQgKiwgY29uc3QgR0xzaXplaSAqLCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdSYW5nZUVsZW1lbnRBcnJheUFQUExFIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBjb25zdCBHTGludCAqLCBjb25zdCBHTHNpemVpICosIEdMc2l6ZWkpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRUxFTUVOVFBPSU5URVJBUFBMRVBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRBUlJBWUFQUExFUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRBUlJBWUFQUExFUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVEFSUkFZQVBQTEVQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXUkFOR0VFTEVNRU5UQVJSQVlBUFBMRVBST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9mZW5jZQorI2RlZmluZSBHTF9BUFBMRV9mZW5jZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbkZlbmNlc0FQUExFIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlRmVuY2VzQVBQTEUgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZXRGZW5jZUFQUExFIChHTHVpbnQpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNGZW5jZUFQUExFIChHTHVpbnQpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsVGVzdEZlbmNlQVBQTEUgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluaXNoRmVuY2VBUFBMRSAoR0x1aW50KTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbFRlc3RPYmplY3RBUFBMRSAoR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmlzaE9iamVjdEFQUExFIChHTGVudW0sIEdMaW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkZFTkNFU0FQUExFUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVGRU5DRVNBUFBMRVBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VURkVOQ0VBUFBMRVBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTRkVOQ0VBUFBMRVBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFRFU1RGRU5DRUFQUExFUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTklTSEZFTkNFQVBQTEVQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xURVNUT0JKRUNUQVBQTEVQUk9DKSAoR0xlbnVtIG9iamVjdCwgR0x1aW50IG5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGSU5JU0hPQkpFQ1RBUFBMRVBST0MpIChHTGVudW0gb2JqZWN0LCBHTGludCBuYW1lKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3ZlcnRleF9hcnJheV9vYmplY3QKKyNkZWZpbmUgR0xfQVBQTEVfdmVydGV4X2FycmF5X29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRWZXJ0ZXhBcnJheUFQUExFIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVZlcnRleEFycmF5c0FQUExFIChHTHNpemVpLCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVmVydGV4QXJyYXlzQVBQTEUgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVmVydGV4QXJyYXlBUFBMRSAoR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRWRVJURVhBUlJBWUFQUExFUFJPQykgKEdMdWludCBhcnJheSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVZFUlRFWEFSUkFZU0FQUExFUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5WRVJURVhBUlJBWVNBUFBMRVBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1ZFUlRFWEFSUkFZQVBQTEVQUk9DKSAoR0x1aW50IGFycmF5KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3ZlcnRleF9hcnJheV9yYW5nZQorI2RlZmluZSBHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfcmFuZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBcnJheVJhbmdlQVBQTEUgKEdMc2l6ZWksIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaFZlcnRleEFycmF5UmFuZ2VBUFBMRSAoR0xzaXplaSwgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEFycmF5UGFyYW1ldGVyaUFQUExFIChHTGVudW0sIEdMaW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFSUkFZUkFOR0VBUFBMRVBST0MpIChHTHNpemVpIGxlbmd0aCwgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRkxVU0hWRVJURVhBUlJBWVJBTkdFQVBQTEVQUk9DKSAoR0xzaXplaSBsZW5ndGgsIEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFSUkFZUEFSQU1FVEVSSUFQUExFUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfeWNiY3JfNDIyCisjZGVmaW5lIEdMX0FQUExFX3ljYmNyXzQyMiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TM19zM3RjCisjZGVmaW5lIEdMX1MzX3MzdGMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2RyYXdfYnVmZmVycworI2RlZmluZSBHTF9BVElfZHJhd19idWZmZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0J1ZmZlcnNBVEkgKEdMc2l6ZWksIGNvbnN0IEdMZW51bSAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdCVUZGRVJTQVRJUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQKKyNkZWZpbmUgR0xfQVRJX3BpeGVsX2Zvcm1hdF9mbG9hdCAxCisvKiBUaGlzIGlzIHJlYWxseSBhIFdHTCBleHRlbnNpb24sIGJ1dCBkZWZpbmVzIHNvbWUgYXNzb2NpYXRlZCBHTCBlbnVtcy4KKyAqIEFUSSBkb2VzIG5vdCBleHBvcnQgIkdMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQiIGluIHRoZSBHTF9FWFRFTlNJT05TIHN0cmluZy4KKyAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfZW52X2NvbWJpbmUzCisjZGVmaW5lIEdMX0FUSV90ZXh0dXJlX2Vudl9jb21iaW5lMyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dHVyZV9mbG9hdAorI2RlZmluZSBHTF9BVElfdGV4dHVyZV9mbG9hdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mbG9hdF9idWZmZXIKKyNkZWZpbmUgR0xfTlZfZmxvYXRfYnVmZmVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZyYWdtZW50X3Byb2dyYW0KKyNkZWZpbmUgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbSAxCisvKiBTb21lIE5WX2ZyYWdtZW50X3Byb2dyYW0gZW50cnkgcG9pbnRzIGFyZSBzaGFyZWQgd2l0aCBBUkJfdmVydGV4X3Byb2dyYW0uICovCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRmTlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1Ynl0ZSAqLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZE5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdWJ5dGUgKiwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRmdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdWJ5dGUgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICosIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1OYW1lZFBhcmFtZXRlcmZ2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1Ynl0ZSAqLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1OYW1lZFBhcmFtZXRlcmR2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1Ynl0ZSAqLCBHTGRvdWJsZSAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1OQU1FRFBBUkFNRVRFUjRGTlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTU5BTUVEUEFSQU1FVEVSNEROVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTU5BTUVEUEFSQU1FVEVSNEZWTlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1OQU1FRFBBUkFNRVRFUjREVk5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTU5BTUVEUEFSQU1FVEVSRlZOVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNTkFNRURQQVJBTUVURVJEVk5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZG91YmxlICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfaGFsZl9mbG9hdAorI2RlZmluZSBHTF9OVl9oYWxmX2Zsb2F0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4MmhOViAoR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXgyaHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4M2hOViAoR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4M2h2TlYgKGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleDRoTlYgKEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXg0aHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2hOViAoR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2h2TlYgKGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yM2hOViAoR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3IzaHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0aE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0aHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQxaE5WIChHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQxaHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyaE5WIChHTGhhbGZOViwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmh2TlYgKGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkM2hOViAoR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQzaHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0aE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0aHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFoTlYgKEdMZW51bSwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaHZOViAoR0xlbnVtLCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmhOViAoR0xlbnVtLCBHTGhhbGZOViwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaHZOViAoR0xlbnVtLCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2hOViAoR0xlbnVtLCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2h2TlYgKEdMZW51bSwgY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRoTlYgKEdMZW51bSwgR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aHZOViAoR0xlbnVtLCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGhOViAoR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkaHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRoTlYgKEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxaE5WIChHTHVpbnQsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxaHZOViAoR0x1aW50LCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyaE5WIChHTHVpbnQsIEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmh2TlYgKEdMdWludCwgY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2hOViAoR0x1aW50LCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzaHZOViAoR0x1aW50LCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0aE5WIChHTHVpbnQsIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0aHZOViAoR0x1aW50LCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMWh2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczJodk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMzaHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzNGh2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xoYWxmTlYgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVgySE5WUFJPQykgKEdMaGFsZk5WIHgsIEdMaGFsZk5WIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVgySFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDNITlZQUk9DKSAoR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDNIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYNEhOVlBST0MpIChHTGhhbGZOViB4LCBHTGhhbGZOViB5LCBHTGhhbGZOViB6LCBHTGhhbGZOViB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYNEhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUwzSE5WUFJPQykgKEdMaGFsZk5WIG54LCBHTGhhbGZOViBueSwgR0xoYWxmTlYgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUwzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SM0hOVlBST0MpIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1IzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNEhOVlBST0MpIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlLCBHTGhhbGZOViBhbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNEhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDFITlZQUk9DKSAoR0xoYWxmTlYgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMUhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJITlZQUk9DKSAoR0xoYWxmTlYgcywgR0xoYWxmTlYgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDNITlZQUk9DKSAoR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEM0hWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDRITlZQUk9DKSAoR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgciwgR0xoYWxmTlYgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUhOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFIVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJITlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xoYWxmTlYgcywgR0xoYWxmTlYgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQySFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMsIEdMaGFsZk5WIHQsIEdMaGFsZk5WIHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0hWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEhOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByLCBHTGhhbGZOViBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRIVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRITlZQUk9DKSAoR0xoYWxmTlYgZm9nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICpmb2cpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNITlZQUk9DKSAoR0xoYWxmTlYgcmVkLCBHTGhhbGZOViBncmVlbiwgR0xoYWxmTlYgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0hWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRITlZQUk9DKSAoR0xoYWxmTlYgd2VpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYV0VJR0hUSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqd2VpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUhOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxSFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkhOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgsIEdMaGFsZk5WIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIySFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0hOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzSFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEhOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHosIEdMaGFsZk5WIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0SFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzFIVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMySFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbiwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTM0hWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzRIVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9waXhlbF9kYXRhX3JhbmdlCisjZGVmaW5lIEdMX05WX3BpeGVsX2RhdGFfcmFuZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbERhdGFSYW5nZU5WIChHTGVudW0sIEdMc2l6ZWksIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaFBpeGVsRGF0YVJhbmdlTlYgKEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTERBVEFSQU5HRU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGVuZ3RoLCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSFBJWEVMREFUQVJBTkdFTlZQUk9DKSAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wcmltaXRpdmVfcmVzdGFydAorI2RlZmluZSBHTF9OVl9wcmltaXRpdmVfcmVzdGFydCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByaW1pdGl2ZVJlc3RhcnROViAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJpbWl0aXZlUmVzdGFydEluZGV4TlYgKEdMdWludCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUklNSVRJVkVSRVNUQVJUTlZQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBSSU1JVElWRVJFU1RBUlRJTkRFWE5WUFJPQykgKEdMdWludCBpbmRleCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2V4cGFuZF9ub3JtYWwKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9leHBhbmRfbm9ybWFsIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMgorI2RlZmluZSBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX21hcF9vYmplY3RfYnVmZmVyCisjZGVmaW5lIEdMX0FUSV9tYXBfb2JqZWN0X2J1ZmZlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgR0x2b2lkKiBBUElFTlRSWSBnbE1hcE9iamVjdEJ1ZmZlckFUSSAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbm1hcE9iamVjdEJ1ZmZlckFUSSAoR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMdm9pZCogKEFQSUVOVFJZUCBQRk5HTE1BUE9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5NQVBPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0x1aW50IGJ1ZmZlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfc2VwYXJhdGVfc3RlbmNpbAorI2RlZmluZSBHTF9BVElfc2VwYXJhdGVfc3RlbmNpbCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxPcFNlcGFyYXRlQVRJIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGVBVEkgKEdMZW51bSwgR0xlbnVtLCBHTGludCwgR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxPUFNFUEFSQVRFQVRJUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSBkcGZhaWwsIEdMZW51bSBkcHBhc3MpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVEVOQ0lMRlVOQ1NFUEFSQVRFQVRJUFJPQykgKEdMZW51bSBmcm9udGZ1bmMsIEdMZW51bSBiYWNrZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X2F0dHJpYl9hcnJheV9vYmplY3QKKyNkZWZpbmUgR0xfQVRJX3ZlcnRleF9hdHRyaWJfYXJyYXlfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliQXJyYXlPYmplY3RBVEkgKEdMdWludCwgR0xpbnQsIEdMZW51bSwgR0xib29sZWFuLCBHTHNpemVpLCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliQXJyYXlPYmplY3RmdkFUSSAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliQXJyYXlPYmplY3RpdkFUSSAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCQVJSQVlPQkpFQ1RBVElQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCQVJSQVlPQkpFQ1RGVkFUSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCQVJSQVlPQkpFQ1RJVkFUSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9PRVNfcmVhZF9mb3JtYXQKKyNkZWZpbmUgR0xfT0VTX3JlYWRfZm9ybWF0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9kZXB0aF9ib3VuZHNfdGVzdAorI2RlZmluZSBHTF9FWFRfZGVwdGhfYm91bmRzX3Rlc3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aEJvdW5kc0VYVCAoR0xjbGFtcGQsIEdMY2xhbXBkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFUFRIQk9VTkRTRVhUUFJPQykgKEdMY2xhbXBkIHptaW4sIEdMY2xhbXBkIHptYXgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbWlycm9yX2NsYW1wCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX21pcnJvcl9jbGFtcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKyNkZWZpbmUgR0xfRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlRVhUIChHTGVudW0sIEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OU0VQQVJBVEVFWFRQUk9DKSAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV9wYWNrX2ludmVydAorI2RlZmluZSBHTF9NRVNBX3BhY2tfaW52ZXJ0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FfeWNiY3JfdGV4dHVyZQorI2RlZmluZSBHTF9NRVNBX3ljYmNyX3RleHR1cmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BpeGVsX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfRVhUX3BpeGVsX2J1ZmZlcl9vYmplY3QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24KKyNkZWZpbmUgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbTIKKyNkZWZpbmUgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbTIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0yX29wdGlvbgorI2RlZmluZSBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTJfb3B0aW9uIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMworI2RlZmluZSBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1JlbmRlcmJ1ZmZlckVYVCAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kUmVuZGVyYnVmZmVyRVhUIChHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblJlbmRlcmJ1ZmZlcnNFWFQgKEdMc2l6ZWksIEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlRVhUIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzRnJhbWVidWZmZXJFWFQgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEZyYW1lYnVmZmVyRVhUIChHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhUIChHTHNpemVpLCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuRnJhbWVidWZmZXJzRVhUIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSBHTGVudW0gQVBJRU5UUlkgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTFERVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHVpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x1aW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlM0RFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdWludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuZXJhdGVNaXBtYXBFWFQgKEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTUkVOREVSQlVGRkVSRVhUUFJPQykgKEdMdWludCByZW5kZXJidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EUkVOREVSQlVGRkVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVSRU5ERVJCVUZGRVJTRVhUUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpyZW5kZXJidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOUkVOREVSQlVGRkVSU0VYVFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqcmVuZGVyYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFJFTkRFUkJVRkZFUlBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNGUkFNRUJVRkZFUkVYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5ERlJBTUVCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFRlJBTUVCVUZGRVJTRVhUUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5GUkFNRUJVRkZFUlNFWFRQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7Cit0eXBlZGVmIEdMZW51bSAoQVBJRU5UUllQIFBGTkdMQ0hFQ0tGUkFNRUJVRkZFUlNUQVRVU0VYVFBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUzREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCB6b2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGUkFNRUJVRkZFUkFUVEFDSE1FTlRQQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORVJBVEVNSVBNQVBFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9HUkVNRURZX3N0cmluZ19tYXJrZXIKKyNkZWZpbmUgR0xfR1JFTUVEWV9zdHJpbmdfbWFya2VyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RyaW5nTWFya2VyR1JFTUVEWSAoR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RSSU5HTUFSS0VSR1JFTUVEWVBST0MpIChHTHNpemVpIGxlbiwgY29uc3QgR0x2b2lkICpzdHJpbmcpOworI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisjZW5kaWYgLyogTk9fU0RMX0dMRVhUICovCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9wbGF0Zm9ybS5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1NDBhOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKiogQGZpbGUgU0RMX3BsYXRmb3JtLmgKKyAqICBUcnkgdG8gZ2V0IGEgc3RhbmRhcmQgc2V0IG9mIHBsYXRmb3JtIGRlZmluZXMKKyAqLworCisjaWZuZGVmIF9TRExfcGxhdGZvcm1faAorI2RlZmluZSBfU0RMX3BsYXRmb3JtX2gKKworI2lmIGRlZmluZWQoX0FJWCkKKyN1bmRlZiBfX0FJWF9fCisjZGVmaW5lIF9fQUlYX18JCTEKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CRU9TX18pCisjdW5kZWYgX19CRU9TX18KKyNkZWZpbmUgX19CRU9TX18JMQorI2VuZGlmCisjaWYgZGVmaW5lZChfX0hBSUtVX18pCisjdW5kZWYgX19IQUlLVV9fCisjZGVmaW5lIF9fSEFJS1VfXyAxCisjZW5kaWYKKyNpZiBkZWZpbmVkKGJzZGkpIHx8IGRlZmluZWQoX19ic2RpKSB8fCBkZWZpbmVkKF9fYnNkaV9fKQorI3VuZGVmIF9fQlNESV9fCisjZGVmaW5lIF9fQlNESV9fCTEKKyNlbmRpZgorI2lmIGRlZmluZWQoX2FyY2hfZHJlYW1jYXN0KQorI3VuZGVmIF9fRFJFQU1DQVNUX18KKyNkZWZpbmUgX19EUkVBTUNBU1RfXwkxCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKQorI3VuZGVmIF9fRlJFRUJTRF9fCisjZGVmaW5lIF9fRlJFRUJTRF9fCTEKKyNlbmRpZgorI2lmIGRlZmluZWQoX19IQUlLVV9fKQorI3VuZGVmIF9fSEFJS1VfXworI2RlZmluZSBfX0hBSUtVX18JMQorI2VuZGlmCisjaWYgZGVmaW5lZChocHV4KSB8fCBkZWZpbmVkKF9faHB1eCkgfHwgZGVmaW5lZChfX2hwdXhfXykKKyN1bmRlZiBfX0hQVVhfXworI2RlZmluZSBfX0hQVVhfXwkxCisjZW5kaWYKKyNpZiBkZWZpbmVkKHNnaSkgfHwgZGVmaW5lZChfX3NnaSkgfHwgZGVmaW5lZChfX3NnaV9fKSB8fCBkZWZpbmVkKF9TR0lfU09VUkNFKQorI3VuZGVmIF9fSVJJWF9fCisjZGVmaW5lIF9fSVJJWF9fCTEKKyNlbmRpZgorI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChfX2xpbnV4X18pCisjdW5kZWYgX19MSU5VWF9fCisjZGVmaW5lIF9fTElOVVhfXwkxCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyN1bmRlZiBfX01BQ09TWF9fCisjZGVmaW5lIF9fTUFDT1NYX18JMQorI2VsaWYgZGVmaW5lZChtYWNpbnRvc2gpCisjdW5kZWYgX19NQUNPU19fCisjZGVmaW5lIF9fTUFDT1NfXwkxCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pCisjdW5kZWYgX19ORVRCU0RfXworI2RlZmluZSBfX05FVEJTRF9fCTEKKyNlbmRpZgorI2lmIGRlZmluZWQoX19PcGVuQlNEX18pCisjdW5kZWYgX19PUEVOQlNEX18KKyNkZWZpbmUgX19PUEVOQlNEX18JMQorI2VuZGlmCisjaWYgZGVmaW5lZChfX09TMl9fKQorI3VuZGVmIF9fT1MyX18KKyNkZWZpbmUgX19PUzJfXwkJMQorI2VuZGlmCisjaWYgZGVmaW5lZChvc2YpIHx8IGRlZmluZWQoX19vc2YpIHx8IGRlZmluZWQoX19vc2ZfXykgfHwgZGVmaW5lZChfT1NGX1NPVVJDRSkKKyN1bmRlZiBfX09TRl9fCisjZGVmaW5lIF9fT1NGX18JCTEKKyNlbmRpZgorI2lmIGRlZmluZWQoX19RTlhOVE9fXykKKyN1bmRlZiBfX1FOWE5UT19fCisjZGVmaW5lIF9fUU5YTlRPX18JMQorI2VuZGlmCisjaWYgZGVmaW5lZChyaXNjb3MpIHx8IGRlZmluZWQoX19yaXNjb3MpIHx8IGRlZmluZWQoX19yaXNjb3NfXykKKyN1bmRlZiBfX1JJU0NPU19fCisjZGVmaW5lIF9fUklTQ09TX18JMQorI2VuZGlmCisjaWYgZGVmaW5lZChfX1NWUjQpCisjdW5kZWYgX19TT0xBUklTX18KKyNkZWZpbmUgX19TT0xBUklTX18JMQorI2VuZGlmCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisjdW5kZWYgX19XSU4zMl9fCisjZGVmaW5lIF9fV0lOMzJfXwkxCisjZW5kaWYKKworI2VuZGlmIC8qIF9TRExfcGxhdGZvcm1faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX3F1aXQuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9xdWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkMmVjNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9xdWl0LmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqIEBmaWxlIFNETF9xdWl0LmgKKyAqICBJbmNsdWRlIGZpbGUgZm9yIFNETCBxdWl0IGV2ZW50IGhhbmRsaW5nCisgKi8KKworI2lmbmRlZiBfU0RMX3F1aXRfaAorI2RlZmluZSBfU0RMX3F1aXRfaAorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorCisvKiogQGZpbGUgU0RMX3F1aXQuaAorICogIEFuIFNETF9RVUlURVZFTlQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uCisgKiAgd2luZG93LiAgSWYgaXQgaXMgaWdub3JlZCBvciBmaWx0ZXJlZCBvdXQsIHRoZSB3aW5kb3cgd2lsbCByZW1haW4gb3Blbi4KKyAqICBJZiBpdCBpcyBub3QgaWdub3JlZCBvciBmaWx0ZXJlZCwgaXQgaXMgcXVldWVkIG5vcm1hbGx5IGFuZCB0aGUgd2luZG93CisgKiAgaXMgYWxsb3dlZCB0byBjbG9zZS4gIFdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zZWQsIHNjcmVlbiB1cGRhdGVzIHdpbGwgCisgKiAgY29tcGxldGUsIGJ1dCBoYXZlIG5vIGVmZmVjdC4KKyAqCisgKiAgU0RMX0luaXQoKSBpbnN0YWxscyBzaWduYWwgaGFuZGxlcnMgZm9yIFNJR0lOVCAoa2V5Ym9hcmQgaW50ZXJydXB0KQorICogIGFuZCBTSUdURVJNIChzeXN0ZW0gdGVybWluYXRpb24gcmVxdWVzdCksIGlmIGhhbmRsZXJzIGRvIG5vdCBhbHJlYWR5CisgKiAgZXhpc3QsIHRoYXQgZ2VuZXJhdGUgU0RMX1FVSVRFVkVOVCBldmVudHMgYXMgd2VsbC4gIFRoZXJlIGlzIG5vIHdheQorICogIHRvIGRldGVybWluZSB0aGUgY2F1c2Ugb2YgYW4gU0RMX1FVSVRFVkVOVCwgYnV0IHNldHRpbmcgYSBzaWduYWwKKyAqICBoYW5kbGVyIGluIHlvdXIgYXBwbGljYXRpb24gd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBnZW5lcmF0aW9uIG9mCisgKiAgcXVpdCBldmVudHMgZm9yIHRoYXQgc2lnbmFsLgorICovCisKKy8qKiBAZmlsZSBTRExfcXVpdC5oCisgKiAgVGhlcmUgYXJlIG5vIGZ1bmN0aW9ucyBkaXJlY3RseSBhZmZlY3RpbmcgdGhlIHF1aXQgZXZlbnQgCisgKi8KKworI2RlZmluZSBTRExfUXVpdFJlcXVlc3RlZCgpIFwKKyAgICAgICAgKFNETF9QdW1wRXZlbnRzKCksIFNETF9QZWVwRXZlbnRzKE5VTEwsMCxTRExfUEVFS0VWRU5ULFNETF9RVUlUTUFTSykpCisKKyNlbmRpZiAvKiBfU0RMX3F1aXRfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX3J3b3BzLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfcndvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODM2MWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX3J3b3BzLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qKiBAZmlsZSBTRExfcndvcHMuaAorICogIFRoaXMgZmlsZSBwcm92aWRlcyBhIGdlbmVyYWwgaW50ZXJmYWNlIGZvciBTREwgdG8gcmVhZCBhbmQgd3JpdGUKKyAqICBkYXRhIHNvdXJjZXMuICBJdCBjYW4gZWFzaWx5IGJlIGV4dGVuZGVkIHRvIGZpbGVzLCBtZW1vcnksIGV0Yy4KKyAqLworCisjaWZuZGVmIF9TRExfcndvcHNfaAorI2RlZmluZSBfU0RMX3J3b3BzX2gKKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKyNpbmNsdWRlICJTRExfZXJyb3IuaCIKKworI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKKy8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogVGhpcyBpcyB0aGUgcmVhZC93cml0ZSBvcGVyYXRpb24gc3RydWN0dXJlIC0tIHZlcnkgYmFzaWMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgU0RMX1JXb3BzIHsKKwkvKiogU2VlayB0byAnb2Zmc2V0JyByZWxhdGl2ZSB0byB3aGVuY2UsIG9uZSBvZiBzdGRpbydzIHdoZW5jZSB2YWx1ZXM6CisJICoJU0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORAorCSAqICBSZXR1cm5zIHRoZSBmaW5hbCBvZmZzZXQgaW4gdGhlIGRhdGEgc291cmNlLgorCSAqLworCWludCAoU0RMQ0FMTCAqc2Vlaykoc3RydWN0IFNETF9SV29wcyAqY29udGV4dCwgaW50IG9mZnNldCwgaW50IHdoZW5jZSk7CisKKwkvKiogUmVhZCB1cCB0byAnbWF4bnVtJyBvYmplY3RzIGVhY2ggb2Ygc2l6ZSAnc2l6ZScgZnJvbSB0aGUgZGF0YQorCSAqICBzb3VyY2UgdG8gdGhlIGFyZWEgcG9pbnRlZCBhdCBieSAncHRyJy4KKwkgKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgcmVhZCwgb3IgLTEgaWYgdGhlIHJlYWQgZmFpbGVkLgorCSAqLworCWludCAoU0RMQ0FMTCAqcmVhZCkoc3RydWN0IFNETF9SV29wcyAqY29udGV4dCwgdm9pZCAqcHRyLCBpbnQgc2l6ZSwgaW50IG1heG51bSk7CisKKwkvKiogV3JpdGUgZXhhY3RseSAnbnVtJyBvYmplY3RzIGVhY2ggb2Ygc2l6ZSAnb2Jqc2l6ZScgZnJvbSB0aGUgYXJlYQorCSAqICBwb2ludGVkIGF0IGJ5ICdwdHInIHRvIGRhdGEgc291cmNlLgorCSAqICBSZXR1cm5zICdudW0nLCBvciAtMSBpZiB0aGUgd3JpdGUgZmFpbGVkLgorCSAqLworCWludCAoU0RMQ0FMTCAqd3JpdGUpKHN0cnVjdCBTRExfUldvcHMgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnB0ciwgaW50IHNpemUsIGludCBudW0pOworCisJLyoqIENsb3NlIGFuZCBmcmVlIGFuIGFsbG9jYXRlZCBTRExfRlNvcHMgc3RydWN0dXJlICovCisJaW50IChTRExDQUxMICpjbG9zZSkoc3RydWN0IFNETF9SV29wcyAqY29udGV4dCk7CisKKwlVaW50MzIgdHlwZTsKKwl1bmlvbiB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKF9fU1lNQklBTjMyX18pCisJICAgIHN0cnVjdCB7CisJCWludCAgIGFwcGVuZDsKKwkJdm9pZCAqaDsKKwkJc3RydWN0IHsKKwkJICAgIHZvaWQgKmRhdGE7CisJCSAgICBpbnQgc2l6ZTsKKwkJICAgIGludCBsZWZ0OworCQl9IGJ1ZmZlcjsKKwkgICAgfSB3aW4zMmlvOworI2VuZGlmCisjaWZkZWYgSEFWRV9TVERJT19IIAorCSAgICBzdHJ1Y3QgeworCQlpbnQgYXV0b2Nsb3NlOworCSAJRklMRSAqZnA7CisJICAgIH0gc3RkaW87CisjZW5kaWYKKwkgICAgc3RydWN0IHsKKwkJVWludDggKmJhc2U7CisJIAlVaW50OCAqaGVyZTsKKwkJVWludDggKnN0b3A7CisJICAgIH0gbWVtOworCSAgICBzdHJ1Y3QgeworCQl2b2lkICpkYXRhMTsKKwkgICAgfSB1bmtub3duOworCX0gaGlkZGVuOworCit9IFNETF9SV29wczsKKworCisvKiogQG5hbWUgRnVuY3Rpb25zIHRvIGNyZWF0ZSBTRExfUldvcHMgc3RydWN0dXJlcyBmcm9tIHZhcmlvdXMgZGF0YSBzb3VyY2VzICovCisvKkB7Ki8KKworZXh0ZXJuIERFQ0xTUEVDIFNETF9SV29wcyAqIFNETENBTEwgU0RMX1JXRnJvbUZpbGUoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbW9kZSk7CisKKyNpZmRlZiBIQVZFX1NURElPX0gKK2V4dGVybiBERUNMU1BFQyBTRExfUldvcHMgKiBTRExDQUxMIFNETF9SV0Zyb21GUChGSUxFICpmcCwgaW50IGF1dG9jbG9zZSk7CisjZW5kaWYKKworZXh0ZXJuIERFQ0xTUEVDIFNETF9SV29wcyAqIFNETENBTEwgU0RMX1JXRnJvbU1lbSh2b2lkICptZW0sIGludCBzaXplKTsKK2V4dGVybiBERUNMU1BFQyBTRExfUldvcHMgKiBTRExDQUxMIFNETF9SV0Zyb21Db25zdE1lbShjb25zdCB2b2lkICptZW0sIGludCBzaXplKTsKKworZXh0ZXJuIERFQ0xTUEVDIFNETF9SV29wcyAqIFNETENBTEwgU0RMX0FsbG9jUlcodm9pZCk7CitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9GcmVlUlcoU0RMX1JXb3BzICphcmVhKTsKKworLypAfSovCisKKy8qKiBAbmFtZSBTZWVrIFJlZmVyZW5jZSBQb2ludHMgKi8KKy8qQHsqLworI2RlZmluZSBSV19TRUVLX1NFVAkwCS8qKjwgU2VlayBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZGF0YSAqLworI2RlZmluZSBSV19TRUVLX0NVUgkxCS8qKjwgU2VlayByZWxhdGl2ZSB0byBjdXJyZW50IHJlYWQgcG9pbnQgKi8KKyNkZWZpbmUgUldfU0VFS19FTkQJMgkvKio8IFNlZWsgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiBkYXRhICovCisvKkB9Ki8KKworLyoqIEBuYW1lIE1hY3JvcyB0byBlYXNpbHkgcmVhZCBhbmQgd3JpdGUgZnJvbSBhbiBTRExfUldvcHMgc3RydWN0dXJlICovCisvKkB7Ki8KKyNkZWZpbmUgU0RMX1JXc2VlayhjdHgsIG9mZnNldCwgd2hlbmNlKQkoY3R4KS0+c2VlayhjdHgsIG9mZnNldCwgd2hlbmNlKQorI2RlZmluZSBTRExfUld0ZWxsKGN0eCkJCQkoY3R4KS0+c2VlayhjdHgsIDAsIFJXX1NFRUtfQ1VSKQorI2RlZmluZSBTRExfUldyZWFkKGN0eCwgcHRyLCBzaXplLCBuKQkoY3R4KS0+cmVhZChjdHgsIHB0ciwgc2l6ZSwgbikKKyNkZWZpbmUgU0RMX1JXd3JpdGUoY3R4LCBwdHIsIHNpemUsIG4pCShjdHgpLT53cml0ZShjdHgsIHB0ciwgc2l6ZSwgbikKKyNkZWZpbmUgU0RMX1JXY2xvc2UoY3R4KQkJKGN0eCktPmNsb3NlKGN0eCkKKy8qQH0qLworCisvKiogQG5hbWUgUmVhZCBhbiBpdGVtIG9mIHRoZSBzcGVjaWZpZWQgZW5kaWFubmVzcyBhbmQgcmV0dXJuIGluIG5hdGl2ZSBmb3JtYXQgKi8KKy8qQHsqLworZXh0ZXJuIERFQ0xTUEVDIFVpbnQxNiBTRExDQUxMIFNETF9SZWFkTEUxNihTRExfUldvcHMgKnNyYyk7CitleHRlcm4gREVDTFNQRUMgVWludDE2IFNETENBTEwgU0RMX1JlYWRCRTE2KFNETF9SV29wcyAqc3JjKTsKK2V4dGVybiBERUNMU1BFQyBVaW50MzIgU0RMQ0FMTCBTRExfUmVhZExFMzIoU0RMX1JXb3BzICpzcmMpOworZXh0ZXJuIERFQ0xTUEVDIFVpbnQzMiBTRExDQUxMIFNETF9SZWFkQkUzMihTRExfUldvcHMgKnNyYyk7CitleHRlcm4gREVDTFNQRUMgVWludDY0IFNETENBTEwgU0RMX1JlYWRMRTY0KFNETF9SV29wcyAqc3JjKTsKK2V4dGVybiBERUNMU1BFQyBVaW50NjQgU0RMQ0FMTCBTRExfUmVhZEJFNjQoU0RMX1JXb3BzICpzcmMpOworLypAfSovCisKKy8qKiBAbmFtZSBXcml0ZSBhbiBpdGVtIG9mIG5hdGl2ZSBmb3JtYXQgdG8gdGhlIHNwZWNpZmllZCBlbmRpYW5uZXNzICovCisvKkB7Ki8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfV3JpdGVMRTE2KFNETF9SV29wcyAqZHN0LCBVaW50MTYgdmFsdWUpOworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Xcml0ZUJFMTYoU0RMX1JXb3BzICpkc3QsIFVpbnQxNiB2YWx1ZSk7CitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1dyaXRlTEUzMihTRExfUldvcHMgKmRzdCwgVWludDMyIHZhbHVlKTsKK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfV3JpdGVCRTMyKFNETF9SV29wcyAqZHN0LCBVaW50MzIgdmFsdWUpOworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Xcml0ZUxFNjQoU0RMX1JXb3BzICpkc3QsIFVpbnQ2NCB2YWx1ZSk7CitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1dyaXRlQkU2NChTRExfUldvcHMgKmRzdCwgVWludDY0IHZhbHVlKTsKKy8qQH0qLworCisvKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjaW5jbHVkZSAiY2xvc2VfY29kZS5oIgorCisjZW5kaWYgLyogX1NETF9yd29wc19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfc3RkaW5jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfc3RkaW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhNGZkZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9zdGRpbmMuaApAQCAtMCwwICsxLDYyMCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqIEBmaWxlIFNETF9zdGRpbmMuaAorICogIFRoaXMgaXMgYSBnZW5lcmFsIGhlYWRlciB0aGF0IGluY2x1ZGVzIEMgbGFuZ3VhZ2Ugc3VwcG9ydAorICovCisKKyNpZm5kZWYgX1NETF9zdGRpbmNfaAorI2RlZmluZSBfU0RMX3N0ZGluY19oCisKKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKworI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RESU9fSAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNURENfSEVBREVSUykKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorIyBpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjIGlmIGRlZmluZWQoSEFWRV9TVERMSUJfSCkKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbGlmIGRlZmluZWQoSEFWRV9NQUxMT0NfSCkKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKEhBVkVfU1REREVGX0gpCisjICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChIQVZFX1NUREFSR19IKQorIyAgaW5jbHVkZSA8c3RkYXJnLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjIGlmICFkZWZpbmVkKFNURENfSEVBREVSUykgJiYgZGVmaW5lZChIQVZFX01FTU9SWV9IKQorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0lOVFRZUEVTX0gpCisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBkZWZpbmVkKEhBVkVfU1RESU5UX0gpCisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9DVFlQRV9ICisjIGluY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfSUNPTlYpICYmIGRlZmluZWQoSEFWRV9JQ09OVl9IKQorIyBpbmNsdWRlIDxpY29udi5oPgorI2VuZGlmCisKKy8qKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5ICovCisjZGVmaW5lIFNETF9hcnJheXNpemUoYXJyYXkpCShzaXplb2YoYXJyYXkpL3NpemVvZihhcnJheVswXSkpCisjZGVmaW5lIFNETF9UQUJMRVNJWkUodGFibGUpCVNETF9hcnJheXNpemUodGFibGUpCisKKy8qIFVzZSBwcm9wZXIgQysrIGNhc3RzIHdoZW4gY29tcGlsZWQgYXMgQysrIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uCisgLVdvbGQtc3R5bGUtY2FzdCBvZiBHQ0MgKGFuZCAtV2Vycm9yPW9sZC1zdHlsZS1jYXN0IGluIEdDQyA0LjIgYW5kIGFib3ZlLiAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIFNETF9yZWludGVycHJldF9jYXN0KHR5cGUsIGV4cHJlc3Npb24pIHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZT4oZXhwcmVzc2lvbikKKyNkZWZpbmUgU0RMX3N0YXRpY19jYXN0KHR5cGUsIGV4cHJlc3Npb24pIHN0YXRpY19jYXN0PHR5cGU+KGV4cHJlc3Npb24pCisjZWxzZQorI2RlZmluZSBTRExfcmVpbnRlcnByZXRfY2FzdCh0eXBlLCBleHByZXNzaW9uKSAoKHR5cGUpKGV4cHJlc3Npb24pKQorI2RlZmluZSBTRExfc3RhdGljX2Nhc3QodHlwZSwgZXhwcmVzc2lvbikgKCh0eXBlKShleHByZXNzaW9uKSkKKyNlbmRpZgorCisvKiogQG5hbWUgQmFzaWMgZGF0YSB0eXBlcyAqLworLypAeyovCit0eXBlZGVmIGVudW0geworCVNETF9GQUxTRSA9IDAsCisJU0RMX1RSVUUgID0gMQorfSBTRExfYm9vbDsKKwordHlwZWRlZiBpbnQ4X3QJCVNpbnQ4OwordHlwZWRlZiB1aW50OF90CQlVaW50ODsKK3R5cGVkZWYgaW50MTZfdAkJU2ludDE2OwordHlwZWRlZiB1aW50MTZfdAlVaW50MTY7Cit0eXBlZGVmIGludDMyX3QJCVNpbnQzMjsKK3R5cGVkZWYgdWludDMyX3QJVWludDMyOworCisjaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCit0eXBlZGVmIGludDY0X3QJCVNpbnQ2NDsKKyNpZm5kZWYgU1lNQklBTjMyX0dDQ0UKK3R5cGVkZWYgdWludDY0X3QJVWludDY0OworI2VuZGlmCisjZWxzZQorLyogVGhpcyBpcyByZWFsbHkganVzdCBhIGhhY2sgdG8gcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBjb21wbGFpbmluZyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVVpbnQzMiBoaTsKKwlVaW50MzIgbG87Cit9IFVpbnQ2NCwgU2ludDY0OworI2VuZGlmCisKKy8qQH0qLworCisvKiogQG5hbWUgTWFrZSBzdXJlIHRoZSB0eXBlcyByZWFsbHkgaGF2ZSB0aGUgcmlnaHQgc2l6ZXMgKi8KKy8qQHsqLworI2RlZmluZSBTRExfQ09NUElMRV9USU1FX0FTU0VSVChuYW1lLCB4KSAgICAgICAgICAgICAgIFwKKyAgICAgICB0eXBlZGVmIGludCBTRExfZHVtbXlfICMjIG5hbWVbKHgpICogMiAtIDFdCisKK1NETF9DT01QSUxFX1RJTUVfQVNTRVJUKHVpbnQ4LCBzaXplb2YoVWludDgpID09IDEpOworU0RMX0NPTVBJTEVfVElNRV9BU1NFUlQoc2ludDgsIHNpemVvZihTaW50OCkgPT0gMSk7CitTRExfQ09NUElMRV9USU1FX0FTU0VSVCh1aW50MTYsIHNpemVvZihVaW50MTYpID09IDIpOworU0RMX0NPTVBJTEVfVElNRV9BU1NFUlQoc2ludDE2LCBzaXplb2YoU2ludDE2KSA9PSAyKTsKK1NETF9DT01QSUxFX1RJTUVfQVNTRVJUKHVpbnQzMiwgc2l6ZW9mKFVpbnQzMikgPT0gNCk7CitTRExfQ09NUElMRV9USU1FX0FTU0VSVChzaW50MzIsIHNpemVvZihTaW50MzIpID09IDQpOworU0RMX0NPTVBJTEVfVElNRV9BU1NFUlQodWludDY0LCBzaXplb2YoVWludDY0KSA9PSA4KTsKK1NETF9DT01QSUxFX1RJTUVfQVNTRVJUKHNpbnQ2NCwgc2l6ZW9mKFNpbnQ2NCkgPT0gOCk7CisvKkB9Ki8KKworLyoqIEBuYW1lIEVudW0gU2l6ZSBDaGVjaworICogIENoZWNrIHRvIG1ha2Ugc3VyZSBlbnVtcyBhcmUgdGhlIHNpemUgb2YgaW50cywgZm9yIHN0cnVjdHVyZSBwYWNraW5nLgorICogIEZvciBib3RoIFdhdGNvbSBDL0MrKyBhbmQgQm9ybGFuZCBDL0MrKyB0aGUgY29tcGlsZXIgb3B0aW9uIHRoYXQgbWFrZXMKKyAqICBlbnVtcyBoYXZpbmcgdGhlIHNpemUgb2YgYW4gaW50IG11c3QgYmUgZW5hYmxlZC4KKyAqICBUaGlzIGlzICItYiIgZm9yIEJvcmxhbmQgQy9DKysgYW5kICItZWkiIGZvciBXYXRjb20gQy9DKysgKHYxMSkuCisgKi8KKy8qIEVuYWJsZSBlbnVtcyBhbHdheXMgaW50IGluIENvZGVXYXJyaW9yIChmb3IgTVBXIHVzZSAiLWVudW0gaW50IikgKi8KKyNpZmRlZiBfX01XRVJLU19fCisjcHJhZ21hIGVudW1zYWx3YXlzaW50IG9uCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKwlEVU1NWV9FTlVNX1ZBTFVFCit9IFNETF9EVU1NWV9FTlVNOworCisjaWZuZGVmIF9fTkRTX18KK1NETF9DT01QSUxFX1RJTUVfQVNTRVJUKGVudW0sIHNpemVvZihTRExfRFVNTVlfRU5VTSkgPT0gc2l6ZW9mKGludCkpOworI2VuZGlmCisvKkB9Ki8KKworI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKKy8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9NQUxMT0MKKyNkZWZpbmUgU0RMX21hbGxvYwltYWxsb2MKKyNlbHNlCitleHRlcm4gREVDTFNQRUMgdm9pZCAqIFNETENBTEwgU0RMX21hbGxvYyhzaXplX3Qgc2l6ZSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ0FMTE9DCisjZGVmaW5lIFNETF9jYWxsb2MJY2FsbG9jCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIHZvaWQgKiBTRExDQUxMIFNETF9jYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfUkVBTExPQworI2RlZmluZSBTRExfcmVhbGxvYwlyZWFsbG9jCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIHZvaWQgKiBTRExDQUxMIFNETF9yZWFsbG9jKHZvaWQgKm1lbSwgc2l6ZV90IHNpemUpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0ZSRUUKKyNkZWZpbmUgU0RMX2ZyZWUJZnJlZQorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX2ZyZWUodm9pZCAqbWVtKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX0FMTE9DQSkgJiYgIWRlZmluZWQoYWxsb2NhKQorIyBpZiBkZWZpbmVkKEhBVkVfQUxMT0NBX0gpCisjICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyBlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKQorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjIGVsaWYgZGVmaW5lZChfX0RNQ19fKQorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVsaWYgZGVmaW5lZChfX0FJWF9fKQorICAjcHJhZ21hIGFsbG9jYQorIyBlbGlmIGRlZmluZWQoX19NUkNfXykKKyAgIHZvaWQgKmFsbG9jYSAodW5zaWduZWQpOworIyBlbHNlCisgICBjaGFyICphbGxvY2EgKCk7CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX0FMTE9DQQorI2RlZmluZSBTRExfc3RhY2tfYWxsb2ModHlwZSwgY291bnQpICAgICh0eXBlKilhbGxvY2Eoc2l6ZW9mKHR5cGUpKihjb3VudCkpCisjZGVmaW5lIFNETF9zdGFja19mcmVlKGRhdGEpCisjZWxzZQorI2RlZmluZSBTRExfc3RhY2tfYWxsb2ModHlwZSwgY291bnQpICAgICh0eXBlKilTRExfbWFsbG9jKHNpemVvZih0eXBlKSooY291bnQpKQorI2RlZmluZSBTRExfc3RhY2tfZnJlZShkYXRhKSAgICAgICAgICAgIFNETF9mcmVlKGRhdGEpCisjZW5kaWYKKworI2lmZGVmIEhBVkVfR0VURU5WCisjZGVmaW5lIFNETF9nZXRlbnYJZ2V0ZW52CisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9nZXRlbnYoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfUFVURU5WCisjZGVmaW5lIFNETF9wdXRlbnYJcHV0ZW52CisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9wdXRlbnYoY29uc3QgY2hhciAqdmFyaWFibGUpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1FTT1JUCisjZGVmaW5lIFNETF9xc29ydAlxc29ydAorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX3Fzb3J0KHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCisgICAgICAgICAgIGludCAoKmNvbXBhcmUpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQUJTCisjZGVmaW5lIFNETF9hYnMJCWFicworI2Vsc2UKKyNkZWZpbmUgU0RMX2FicyhYKQkoKFgpIDwgMCA/IC0oWCkgOiAoWCkpCisjZW5kaWYKKworI2RlZmluZSBTRExfbWluKHgsIHkpCSgoKHgpIDwgKHkpKSA/ICh4KSA6ICh5KSkKKyNkZWZpbmUgU0RMX21heCh4LCB5KQkoKCh4KSA+ICh5KSkgPyAoeCkgOiAoeSkpCisKKyNpZmRlZiBIQVZFX0NUWVBFX0gKKyNkZWZpbmUgU0RMX2lzZGlnaXQoWCkgIGlzZGlnaXQoWCkKKyNkZWZpbmUgU0RMX2lzc3BhY2UoWCkgIGlzc3BhY2UoWCkKKyNkZWZpbmUgU0RMX3RvdXBwZXIoWCkgIHRvdXBwZXIoWCkKKyNkZWZpbmUgU0RMX3RvbG93ZXIoWCkgIHRvbG93ZXIoWCkKKyNlbHNlCisjZGVmaW5lIFNETF9pc2RpZ2l0KFgpICAoKChYKSA+PSAnMCcpICYmICgoWCkgPD0gJzknKSkKKyNkZWZpbmUgU0RMX2lzc3BhY2UoWCkgICgoKFgpID09ICcgJykgfHwgKChYKSA9PSAnXHQnKSB8fCAoKFgpID09ICdccicpIHx8ICgoWCkgPT0gJ1xuJykpCisjZGVmaW5lIFNETF90b3VwcGVyKFgpICAoKChYKSA+PSAnYScpICYmICgoWCkgPD0gJ3onKSA/ICgnQScrKChYKS0nYScpKSA6IChYKSkKKyNkZWZpbmUgU0RMX3RvbG93ZXIoWCkgICgoKFgpID49ICdBJykgJiYgKChYKSA8PSAnWicpID8gKCdhJysoKFgpLSdBJykpIDogKFgpKQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX01FTVNFVAorI2RlZmluZSBTRExfbWVtc2V0ICAgICAgbWVtc2V0CisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIHZvaWQgKiBTRExDQUxMIFNETF9tZW1zZXQodm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IGxlbik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoaTM4NikKKyNkZWZpbmUgU0RMX21lbXNldDQoZHN0LCB2YWwsIGxlbikJCQkJXAorZG8gewkJCQkJCQkJXAorCWludCB1MCwgdTEsIHUyOwkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQlcCisJCSJjbGRcblx0IgkJCQkJXAorCQkicmVwIDsgc3Rvc2xcblx0IgkJCQlcCisJCTogIj0mRCIgKHUwKSwgIj0mYSIgKHUxKSwgIj0mYyIgKHUyKQkJXAorCQk6ICIwIiAoZHN0KSwgIjEiICh2YWwpLCAiMiIgKFNETF9zdGF0aWNfY2FzdChVaW50MzIsIGxlbikpCVwKKwkJOiAibWVtb3J5IiApOwkJCQkJXAorfSB3aGlsZSgwKQorI2VuZGlmCisjaWZuZGVmIFNETF9tZW1zZXQ0CisjZGVmaW5lIFNETF9tZW1zZXQ0KGRzdCwgdmFsLCBsZW4pCQlcCitkbyB7CQkJCQkJXAorCXVuc2lnbmVkIF9jb3VudCA9IChsZW4pOwkJXAorCXVuc2lnbmVkIF9uID0gKF9jb3VudCArIDMpIC8gNDsJCVwKKwlVaW50MzIgKl9wID0gU0RMX3N0YXRpY19jYXN0KFVpbnQzMiAqLCBkc3QpOwlcCisJVWludDMyIF92YWwgPSAodmFsKTsJCQlcCisJaWYgKGxlbiA9PSAwKSBicmVhazsJCQlcCisgICAgICAgIHN3aXRjaCAoX2NvdW50ICUgNCkgewkJCVwKKyAgICAgICAgY2FzZSAwOiBkbyB7ICAgICpfcCsrID0gX3ZhbDsJCVwKKyAgICAgICAgY2FzZSAzOiAgICAgICAgICpfcCsrID0gX3ZhbDsJCVwKKyAgICAgICAgY2FzZSAyOiAgICAgICAgICpfcCsrID0gX3ZhbDsJCVwKKyAgICAgICAgY2FzZSAxOiAgICAgICAgICpfcCsrID0gX3ZhbDsJCVwKKwkJfSB3aGlsZSAoIC0tX24gKTsJCVwKKwl9CQkJCQlcCit9IHdoaWxlKDApCisjZW5kaWYKKworLyogV2UgY2FuIGNvdW50IG9uIG1lbWNweSBleGlzdGluZyBvbiBNYWMgT1MgWCBhbmQgYmVpbmcgd2VsbC10dW5lZC4gKi8KKyNpZiBkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykKKyNkZWZpbmUgU0RMX21lbWNweShkc3QsIHNyYywgbGVuKSBtZW1jcHkoZHN0LCBzcmMsIGxlbikKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoaTM4NikKKyNkZWZpbmUgU0RMX21lbWNweShkc3QsIHNyYywgbGVuKQkJCQkJICBcCitkbyB7CQkJCQkJCQkJICBcCisJaW50IHUwLCB1MSwgdTI7CQkJCQkJICAJICBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJCSAgXAorCQkiY2xkXG5cdCIJCQkJCQkgIFwKKwkJInJlcCA7IG1vdnNsXG5cdCIJCQkJCSAgXAorCQkidGVzdGIgJDIsJWI0XG5cdCIJCQkJCSAgXAorCQkiamUgMWZcblx0IgkJCQkJCSAgXAorCQkibW92c3dcbiIJCQkJCQkgIFwKKwkJIjE6XHR0ZXN0YiAkMSwlYjRcblx0IgkJCQkJICBcCisJCSJqZSAyZlxuXHQiCQkJCQkJICBcCisJCSJtb3ZzYlxuIgkJCQkJCSAgXAorCQkiMjoiCQkJCQkJCSAgXAorCQk6ICI9JmMiICh1MCksICI9JkQiICh1MSksICI9JlMiICh1MikJCQkgIFwKKwkJOiAiMCIgKFNETF9zdGF0aWNfY2FzdCh1bnNpZ25lZCwgbGVuKS80KSwgInEiIChsZW4pLCAiMSIgKGRzdCksIjIiIChzcmMpIFwKKwkJOiAibWVtb3J5IiApOwkJCQkJCSAgXAorfSB3aGlsZSgwKQorI2VuZGlmCisjaWZuZGVmIFNETF9tZW1jcHkKKyNpZmRlZiBIQVZFX01FTUNQWQorI2RlZmluZSBTRExfbWVtY3B5ICAgICAgbWVtY3B5CisjZWxpZiBkZWZpbmVkKEhBVkVfQkNPUFkpCisjZGVmaW5lIFNETF9tZW1jcHkoZCwgcywgbikJYmNvcHkoKHMpLCAoZCksIChuKSkKKyNlbHNlCitleHRlcm4gREVDTFNQRUMgdm9pZCAqIFNETENBTEwgU0RMX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbik7CisjZW5kaWYKKyNlbmRpZgorCisvKiBXZSBjYW4gY291bnQgb24gbWVtY3B5IGV4aXN0aW5nIG9uIE1hYyBPUyBYIGFuZCBiZWluZyB3ZWxsLXR1bmVkLiAqLworI2lmIGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKQorI2RlZmluZSBTRExfbWVtY3B5NChkc3QsIHNyYywgbGVuKSBtZW1jcHkoZHN0LCBzcmMsIChsZW4pKjQpCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKGkzODYpCisjZGVmaW5lIFNETF9tZW1jcHk0KGRzdCwgc3JjLCBsZW4pCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpbnQgZWN4LCBlZGksIGVzaTsJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQlcCisJCSJjbGRcblx0IgkJCQkJXAorCQkicmVwIDsgbW92c2wiCQkJCQlcCisJCTogIj0mYyIgKGVjeCksICI9JkQiIChlZGkpLCAiPSZTIiAoZXNpKQkJXAorCQk6ICIwIiAoU0RMX3N0YXRpY19jYXN0KHVuc2lnbmVkLCBsZW4pKSwgIjEiIChkc3QpLCAiMiIgKHNyYykJXAorCQk6ICJtZW1vcnkiICk7CQkJCQlcCit9IHdoaWxlKDApCisjZW5kaWYKKyNpZm5kZWYgU0RMX21lbWNweTQKKyNkZWZpbmUgU0RMX21lbWNweTQoZHN0LCBzcmMsIGxlbikJU0RMX21lbWNweShkc3QsIHNyYywgKGxlbikgPDwgMikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChpMzg2KQorI2RlZmluZSBTRExfcmV2Y3B5KGRzdCwgc3JjLCBsZW4pCQkJXAorZG8gewkJCQkJCQlcCisJaW50IHUwLCB1MSwgdTI7CQkJCQlcCisJY2hhciAqZHN0cCA9IFNETF9zdGF0aWNfY2FzdChjaGFyICosIGRzdCk7CVwKKwljaGFyICpzcmNwID0gU0RMX3N0YXRpY19jYXN0KGNoYXIgKiwgc3JjKTsJXAorCWludCBuID0gKGxlbik7CQkJCQlcCisJaWYgKCBuID49IDQgKSB7CQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQlcCisJCSJzdGRcblx0IgkJCQlcCisJCSJyZXAgOyBtb3ZzbFxuXHQiCQkJXAorCQkiY2xkXG5cdCIJCQkJXAorCQk6ICI9JmMiICh1MCksICI9JkQiICh1MSksICI9JlMiICh1MikJXAorCQk6ICIwIiAobiA+PiAyKSwJCQkJXAorCQkgICIxIiAoZHN0cCsobi00KSksICIyIiAoc3JjcCsobi00KSkJXAorCQk6ICJtZW1vcnkiICk7CQkJCVwKKwl9CQkJCQkJXAorCXN3aXRjaCAobiAmIDMpIHsJCQkJXAorCQljYXNlIDM6IGRzdHBbMl0gPSBzcmNwWzJdOwkJXAorCQljYXNlIDI6IGRzdHBbMV0gPSBzcmNwWzFdOwkJXAorCQljYXNlIDE6IGRzdHBbMF0gPSBzcmNwWzBdOwkJXAorCQkJYnJlYWs7CQkJCVwKKwkJZGVmYXVsdDoJCQkJXAorCQkJYnJlYWs7CQkJCVwKKwl9CQkJCQkJXAorfSB3aGlsZSgwKQorI2VuZGlmCisjaWZuZGVmIFNETF9yZXZjcHkKK2V4dGVybiBERUNMU1BFQyB2b2lkICogU0RMQ0FMTCBTRExfcmV2Y3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9NRU1NT1ZFCisjZGVmaW5lIFNETF9tZW1tb3ZlICAgICBtZW1tb3ZlCisjZWxpZiBkZWZpbmVkKEhBVkVfQkNPUFkpCisjZGVmaW5lIFNETF9tZW1tb3ZlKGQsIHMsIG4pCWJjb3B5KChzKSwgKGQpLCAobikpCisjZWxzZQorI2RlZmluZSBTRExfbWVtbW92ZShkc3QsIHNyYywgbGVuKQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICggZHN0IDwgc3JjICkgewkJCQlcCisJCVNETF9tZW1jcHkoZHN0LCBzcmMsIGxlbik7CQlcCisJfSBlbHNlIHsJCQkJCVwKKwkJU0RMX3JldmNweShkc3QsIHNyYywgbGVuKTsJCVwKKwl9CQkJCQkJXAorfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX01FTUNNUAorI2RlZmluZSBTRExfbWVtY21wICAgICAgbWVtY21wCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9tZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3QgbGVuKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJMRU4KKyNkZWZpbmUgU0RMX3N0cmxlbiAgICAgIHN0cmxlbgorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyBzaXplX3QgU0RMQ0FMTCBTRExfc3RybGVuKGNvbnN0IGNoYXIgKnN0cmluZyk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSTENQWQorI2RlZmluZSBTRExfc3RybGNweSAgICAgc3RybGNweQorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyBzaXplX3QgU0RMQ0FMTCBTRExfc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG1heGxlbik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSTENBVAorI2RlZmluZSBTRExfc3RybGNhdCAgICBzdHJsY2F0CisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIHNpemVfdCBTRExDQUxMIFNETF9zdHJsY2F0KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbWF4bGVuKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJEVVAKKyNkZWZpbmUgU0RMX3N0cmR1cCAgICAgc3RyZHVwCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9zdHJkdXAoY29uc3QgY2hhciAqc3RyaW5nKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9fU1RSUkVWCisjZGVmaW5lIFNETF9zdHJyZXYgICAgICBfc3RycmV2CisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9zdHJyZXYoY2hhciAqc3RyaW5nKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9fU1RSVVBSCisjZGVmaW5lIFNETF9zdHJ1cHIgICAgICBfc3RydXByCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9zdHJ1cHIoY2hhciAqc3RyaW5nKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9fU1RSTFdSCisjZGVmaW5lIFNETF9zdHJsd3IgICAgICBfc3RybHdyCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9zdHJsd3IoY2hhciAqc3RyaW5nKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJDSFIKKyNkZWZpbmUgU0RMX3N0cmNociAgICAgIHN0cmNocgorI2VsaWYgZGVmaW5lZChIQVZFX0lOREVYKQorI2RlZmluZSBTRExfc3RyY2hyICAgICAgaW5kZXgKKyNlbHNlCitleHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX3N0cmNocihjb25zdCBjaGFyICpzdHJpbmcsIGludCBjKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJSQ0hSCisjZGVmaW5lIFNETF9zdHJyY2hyICAgICBzdHJyY2hyCisjZWxpZiBkZWZpbmVkKEhBVkVfUklOREVYKQorI2RlZmluZSBTRExfc3RycmNociAgICAgcmluZGV4CisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9zdHJyY2hyKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGMpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUlNUUgorI2RlZmluZSBTRExfc3Ryc3RyICAgICAgc3Ryc3RyCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF9zdHJzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfSVRPQQorI2RlZmluZSBTRExfaXRvYSAgICAgICAgaXRvYQorI2Vsc2UKKyNkZWZpbmUgU0RMX2l0b2EodmFsdWUsIHN0cmluZywgcmFkaXgpCVNETF9sdG9hKChsb25nKXZhbHVlLCBzdHJpbmcsIHJhZGl4KQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX19MVE9BCisjZGVmaW5lIFNETF9sdG9hICAgICAgICBfbHRvYQorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyBjaGFyICogU0RMQ0FMTCBTRExfbHRvYShsb25nIHZhbHVlLCBjaGFyICpzdHJpbmcsIGludCByYWRpeCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfX1VJVE9BCisjZGVmaW5lIFNETF91aXRvYSAgICAgICBfdWl0b2EKKyNlbHNlCisjZGVmaW5lIFNETF91aXRvYSh2YWx1ZSwgc3RyaW5nLCByYWRpeCkJU0RMX3VsdG9hKChsb25nKXZhbHVlLCBzdHJpbmcsIHJhZGl4KQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX19VTFRPQQorI2RlZmluZSBTRExfdWx0b2EgICAgICAgX3VsdG9hCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGNoYXIgKiBTRExDQUxMIFNETF91bHRvYSh1bnNpZ25lZCBsb25nIHZhbHVlLCBjaGFyICpzdHJpbmcsIGludCByYWRpeCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9MCisjZGVmaW5lIFNETF9zdHJ0b2wgICAgICBzdHJ0b2wKKyNlbHNlCitleHRlcm4gREVDTFNQRUMgbG9uZyBTRExDQUxMIFNETF9zdHJ0b2woY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUlRPVUwKKyNkZWZpbmUgU0RMX3N0cnRvdWwgICAgICBzdHJ0b3VsCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgU0RMQ0FMTCBTRExfc3RydG91bChjb25zdCBjaGFyICpzdHJpbmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSk7CisjZW5kaWYKKworI2lmZGVmIFNETF9IQVNfNjRCSVRfVFlQRQorCisjaWZkZWYgSEFWRV9fSTY0VE9BCisjZGVmaW5lIFNETF9sbHRvYSAgICAgICBfaTY0dG9hCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGNoYXIqIFNETENBTEwgU0RMX2xsdG9hKFNpbnQ2NCB2YWx1ZSwgY2hhciAqc3RyaW5nLCBpbnQgcmFkaXgpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX19VSTY0VE9BCisjZGVmaW5lIFNETF91bGx0b2EgICAgICBfdWk2NHRvYQorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyBjaGFyKiBTRExDQUxMIFNETF91bGx0b2EoVWludDY0IHZhbHVlLCBjaGFyICpzdHJpbmcsIGludCByYWRpeCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9MTAorI2RlZmluZSBTRExfc3RydG9sbCAgICAgc3RydG9sbAorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyBTaW50NjQgU0RMQ0FMTCBTRExfc3RydG9sbChjb25zdCBjaGFyICpzdHJpbmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9VTEwKKyNkZWZpbmUgU0RMX3N0cnRvdWxsICAgICBzdHJ0b3VsbAorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyBVaW50NjQgU0RMQ0FMTCBTRExfc3RydG91bGwoY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpOworI2VuZGlmCisKKyNlbmRpZiAvKiBTRExfSEFTXzY0QklUX1RZUEUgKi8KKworI2lmZGVmIEhBVkVfU1RSVE9ECisjZGVmaW5lIFNETF9zdHJ0b2QgICAgICBzdHJ0b2QKKyNlbHNlCitleHRlcm4gREVDTFNQRUMgZG91YmxlIFNETENBTEwgU0RMX3N0cnRvZChjb25zdCBjaGFyICpzdHJpbmcsIGNoYXIgKiplbmRwKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9BVE9JCisjZGVmaW5lIFNETF9hdG9pICAgICAgICBhdG9pCisjZWxzZQorI2RlZmluZSBTRExfYXRvaShYKSAgICAgU0RMX3N0cnRvbChYLCBOVUxMLCAwKQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0FUT0YKKyNkZWZpbmUgU0RMX2F0b2YgICAgICAgIGF0b2YKKyNlbHNlCisjZGVmaW5lIFNETF9hdG9mKFgpICAgICBTRExfc3RydG9kKFgsIE5VTEwpCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSQ01QCisjZGVmaW5lIFNETF9zdHJjbXAgICAgICBzdHJjbXAKKyNlbHNlCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX3N0cmNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJOQ01QCisjZGVmaW5lIFNETF9zdHJuY21wICAgICBzdHJuY21wCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9zdHJuY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIsIHNpemVfdCBtYXhsZW4pOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUkNBU0VDTVAKKyNkZWZpbmUgU0RMX3N0cmNhc2VjbXAgIHN0cmNhc2VjbXAKKyNlbGlmIGRlZmluZWQoSEFWRV9fU1RSSUNNUCkKKyNkZWZpbmUgU0RMX3N0cmNhc2VjbXAgIF9zdHJpY21wCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9zdHJjYXNlY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUk5DQVNFQ01QCisjZGVmaW5lIFNETF9zdHJuY2FzZWNtcCBzdHJuY2FzZWNtcAorI2VsaWYgZGVmaW5lZChIQVZFX19TVFJOSUNNUCkKKyNkZWZpbmUgU0RMX3N0cm5jYXNlY21wIF9zdHJuaWNtcAorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfc3RybmNhc2VjbXAoY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiwgc2l6ZV90IG1heGxlbik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1NDQU5GCisjZGVmaW5lIFNETF9zc2NhbmYgICAgICBzc2NhbmYKKyNlbHNlCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX3NzY2FuZihjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU05QUklOVEYKKyNkZWZpbmUgU0RMX3NucHJpbnRmICAgIHNucHJpbnRmCisjZWxzZQorZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9zbnByaW50ZihjaGFyICp0ZXh0LCBzaXplX3QgbWF4bGVuLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlNOUFJJTlRGCisjZGVmaW5lIFNETF92c25wcmludGYgICB2c25wcmludGYKKyNlbHNlCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX3ZzbnByaW50ZihjaGFyICp0ZXh0LCBzaXplX3QgbWF4bGVuLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOworI2VuZGlmCisKKy8qKiBAbmFtZSBTRExfSUNPTlYgRXJyb3IgQ29kZXMKKyAqICBUaGUgU0RMIGltcGxlbWVudGF0aW9uIG9mIGljb252KCkgcmV0dXJucyB0aGVzZSBlcnJvciBjb2RlcyAKKyAqLworLypAeyovCisjZGVmaW5lIFNETF9JQ09OVl9FUlJPUgkJKHNpemVfdCktMQorI2RlZmluZSBTRExfSUNPTlZfRTJCSUcJCShzaXplX3QpLTIKKyNkZWZpbmUgU0RMX0lDT05WX0VJTFNFUQkoc2l6ZV90KS0zCisjZGVmaW5lIFNETF9JQ09OVl9FSU5WQUwJKHNpemVfdCktNAorLypAfSovCisKKyNpZiBkZWZpbmVkKEhBVkVfSUNPTlYpICYmIGRlZmluZWQoSEFWRV9JQ09OVl9IKQorI2RlZmluZSBTRExfaWNvbnZfdCAgICAgaWNvbnZfdAorI2RlZmluZSBTRExfaWNvbnZfb3BlbiAgaWNvbnZfb3BlbgorI2RlZmluZSBTRExfaWNvbnZfY2xvc2UgaWNvbnZfY2xvc2UKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBfU0RMX2ljb252X3QgKlNETF9pY29udl90OworZXh0ZXJuIERFQ0xTUEVDIFNETF9pY29udl90IFNETENBTEwgU0RMX2ljb252X29wZW4oY29uc3QgY2hhciAqdG9jb2RlLCBjb25zdCBjaGFyICpmcm9tY29kZSk7CitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX2ljb252X2Nsb3NlKFNETF9pY29udl90IGNkKTsKKyNlbmRpZgorZXh0ZXJuIERFQ0xTUEVDIHNpemVfdCBTRExDQUxMIFNETF9pY29udihTRExfaWNvbnZfdCBjZCwgY29uc3QgY2hhciAqKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LCBjaGFyICoqb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdCk7CisvKiogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHN0cmluZyBiZXR3ZWVuIGVuY29kaW5ncyBpbiBvbmUgcGFzcywgcmV0dXJuaW5nIGEKKyAqICBzdHJpbmcgdGhhdCBtdXN0IGJlIGZyZWVkIHdpdGggU0RMX2ZyZWUoKSBvciBOVUxMIG9uIGVycm9yLgorICovCitleHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX2ljb252X3N0cmluZyhjb25zdCBjaGFyICp0b2NvZGUsIGNvbnN0IGNoYXIgKmZyb21jb2RlLCBjb25zdCBjaGFyICppbmJ1Ziwgc2l6ZV90IGluYnl0ZXNsZWZ0KTsKKyNkZWZpbmUgU0RMX2ljb252X3V0ZjhfbG9jYWxlKFMpCVNETF9pY29udl9zdHJpbmcoIiIsICJVVEYtOCIsIFMsIFNETF9zdHJsZW4oUykrMSkKKyNkZWZpbmUgU0RMX2ljb252X3V0ZjhfdWNzMihTKQkJKFVpbnQxNiAqKVNETF9pY29udl9zdHJpbmcoIlVDUy0yIiwgIlVURi04IiwgUywgU0RMX3N0cmxlbihTKSsxKQorI2RlZmluZSBTRExfaWNvbnZfdXRmOF91Y3M0KFMpCQkoVWludDMyICopU0RMX2ljb252X3N0cmluZygiVUNTLTQiLCAiVVRGLTgiLCBTLCBTRExfc3RybGVuKFMpKzEpCisKKy8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCisKKyNlbmRpZiAvKiBfU0RMX3N0ZGluY19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfc3lzd20uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF9zeXN3bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MWQ2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfc3lzd20uaApAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqIEBmaWxlIFNETF9zeXN3bS5oCisgKiAgSW5jbHVkZSBmaWxlIGZvciBTREwgY3VzdG9tIHN5c3RlbSB3aW5kb3cgbWFuYWdlciBob29rcworICovCisKKyNpZm5kZWYgX1NETF9zeXN3bV9oCisjZGVmaW5lIF9TRExfc3lzd21faAorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF92ZXJzaW9uLmgiCisKKyNpbmNsdWRlICJiZWdpbl9jb2RlLmgiCisvKiBTZXQgdXAgZm9yIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV2ZW4gd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEBmaWxlIFNETF9zeXN3bS5oCisgKiAgWW91ciBhcHBsaWNhdGlvbiBoYXMgYWNjZXNzIHRvIGEgc3BlY2lhbCB0eXBlIG9mIGV2ZW50ICdTRExfU1lTV01FVkVOVCcsCisgKiAgd2hpY2ggY29udGFpbnMgd2luZG93LW1hbmFnZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24gYW5kIGFycml2ZXMgd2hlbmV2ZXIKKyAqICBhbiB1bmhhbmRsZWQgd2luZG93IGV2ZW50IG9jY3Vycy4gIFRoaXMgZXZlbnQgaXMgaWdub3JlZCBieSBkZWZhdWx0LCBidXQKKyAqICB5b3UgY2FuIGVuYWJsZSBpdCB3aXRoIFNETF9FdmVudFN0YXRlKCkKKyAqLworI2lmZGVmIFNETF9QUk9UT1RZUEVTX09OTFkKK3N0cnVjdCBTRExfU3lzV01pbmZvOwordHlwZWRlZiBzdHJ1Y3QgU0RMX1N5c1dNaW5mbyBTRExfU3lzV01pbmZvOworI2Vsc2UKKworLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGZvciBjdXN0b20gd2luZG93IG1hbmFnZXIgZXZlbnRzICovCisjaWYgZGVmaW5lZChTRExfVklERU9fRFJJVkVSX1gxMSkKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKKy8qIGNvbmZsaWN0cyB3aXRoIFF1aWNrZHJhdy5oICovCisjZGVmaW5lIEN1cnNvciBYMTFDdXJzb3IKKyNlbmRpZgorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWGF0b20uaD4KKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQorLyogbWF0Y2hlcyB0aGUgcmUtZGVmaW5lIGFib3ZlICovCisjdW5kZWYgQ3Vyc29yCisjZW5kaWYKKworLyoqIFRoZXNlIGFyZSB0aGUgdmFyaW91cyBzdXBwb3J0ZWQgc3Vic3lzdGVtcyB1bmRlciBVTklYICovCit0eXBlZGVmIGVudW0geworCVNETF9TWVNXTV9YMTEKK30gU0RMX1NZU1dNX1RZUEU7CisKKy8qKiBUaGUgVU5JWCBjdXN0b20gZXZlbnQgc3RydWN0dXJlICovCitzdHJ1Y3QgU0RMX1N5c1dNbXNnIHsKKwlTRExfdmVyc2lvbiB2ZXJzaW9uOworCVNETF9TWVNXTV9UWVBFIHN1YnN5c3RlbTsKKwl1bmlvbiB7CisJICAgIFhFdmVudCB4ZXZlbnQ7CisJfSBldmVudDsKK307CisKKy8qKiBUaGUgVU5JWCBjdXN0b20gd2luZG93IG1hbmFnZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICogIFdoZW4gdGhpcyBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQsIGl0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoCisgKiAgbG93IGxldmVsIHN5c3RlbSBpdCBpcyB1c2luZywgYW5kIHdpbGwgYmUgb25lIG9mIFNETF9TWVNXTV9UWVBFLgorICovCit0eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIHsKKwlTRExfdmVyc2lvbiB2ZXJzaW9uOworCVNETF9TWVNXTV9UWVBFIHN1YnN5c3RlbTsKKwl1bmlvbiB7CisJICAgIHN0cnVjdCB7CisJICAgIAlEaXNwbGF5ICpkaXNwbGF5OwkvKio8IFRoZSBYMTEgZGlzcGxheSAqLworCSAgICAJV2luZG93IHdpbmRvdzsJCS8qKjwgVGhlIFgxMSBkaXNwbGF5IHdpbmRvdyAqLworCQkvKiogVGhlc2UgbG9ja2luZyBmdW5jdGlvbnMgc2hvdWxkIGJlIGNhbGxlZCBhcm91bmQKKyAgICAgICAgICAgICAgICAgKiAgYW55IFgxMSBmdW5jdGlvbnMgdXNpbmcgdGhlIGRpc3BsYXkgdmFyaWFibGUsIAorICAgICAgICAgICAgICAgICAqICBidXQgbm90IHRoZSBnZnhkaXNwbGF5IHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAqICBUaGV5IGxvY2sgdGhlIGV2ZW50IHRocmVhZCwgc28gc2hvdWxkIG5vdCBiZQorCQkgKiAgY2FsbGVkIGFyb3VuZCBldmVudCBmdW5jdGlvbnMgb3IgZnJvbSBldmVudCBmaWx0ZXJzLgorCQkgKi8KKyAgICAgICAgICAgICAgICAvKkB7Ki8KKwkJdm9pZCAoKmxvY2tfZnVuYykodm9pZCk7CisJCXZvaWQgKCp1bmxvY2tfZnVuYykodm9pZCk7CisgICAgICAgICAgICAgICAgLypAfSovCisKKwkJLyoqIEBuYW1lIEludHJvZHVjZWQgaW4gU0RMIDEuMC4yICovCisgICAgICAgICAgICAgICAgLypAeyovCisJICAgIAlXaW5kb3cgZnN3aW5kb3c7CS8qKjwgVGhlIFgxMSBmdWxsc2NyZWVuIHdpbmRvdyAqLworCSAgICAJV2luZG93IHdtd2luZG93OwkvKio8IFRoZSBYMTEgbWFuYWdlZCBpbnB1dCB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAvKkB9Ki8KKworCQkvKiogQG5hbWUgSW50cm9kdWNlZCBpbiBTREwgMS4yLjEyICovCisgICAgICAgICAgICAgICAgLypAeyovCisJCURpc3BsYXkgKmdmeGRpc3BsYXk7CS8qKjwgVGhlIFgxMSBkaXNwbGF5IHRvIHdoaWNoIHJlbmRlcmluZyBpcyBkb25lICovCisgICAgICAgICAgICAgICAgLypAfSovCisJICAgIH0geDExOworCX0gaW5mbzsKK30gU0RMX1N5c1dNaW5mbzsKKworI2VsaWYgZGVmaW5lZChTRExfVklERU9fRFJJVkVSX05BTk9YKQorI2luY2x1ZGUgPG1pY3Jvd2luL25hbm8tWC5oPgorCisvKiogVGhlIGdlbmVyaWMgY3VzdG9tIGV2ZW50IHN0cnVjdHVyZSAqLworc3RydWN0IFNETF9TeXNXTW1zZyB7CisJU0RMX3ZlcnNpb24gdmVyc2lvbjsKKwlpbnQgZGF0YTsKK307CisKKy8qKiBUaGUgd2luZG93cyBjdXN0b20gd2luZG93IG1hbmFnZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIHsKKwlTRExfdmVyc2lvbiB2ZXJzaW9uIDsKKwlHUl9XSU5ET1dfSUQgd2luZG93IDsJLyogVGhlIGRpc3BsYXkgd2luZG93ICovCit9IFNETF9TeXNXTWluZm87CisKKyNlbGlmIGRlZmluZWQoU0RMX1ZJREVPX0RSSVZFUl9XSU5ESUIpIHx8IGRlZmluZWQoU0RMX1ZJREVPX0RSSVZFUl9ERFJBVykgfHwgZGVmaW5lZChTRExfVklERU9fRFJJVkVSX0dBUEkpCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8qKiBUaGUgd2luZG93cyBjdXN0b20gZXZlbnQgc3RydWN0dXJlICovCitzdHJ1Y3QgU0RMX1N5c1dNbXNnIHsKKwlTRExfdmVyc2lvbiB2ZXJzaW9uOworCUhXTkQgaHduZDsJCQkvKio8IFRoZSB3aW5kb3cgZm9yIHRoZSBtZXNzYWdlICovCisJVUlOVCBtc2c7CQkJLyoqPCBUaGUgdHlwZSBvZiBtZXNzYWdlICovCisJV1BBUkFNIHdQYXJhbTsJCQkvKio8IFdPUkQgbWVzc2FnZSBwYXJhbWV0ZXIgKi8KKwlMUEFSQU0gbFBhcmFtOwkJCS8qKjwgTE9ORyBtZXNzYWdlIHBhcmFtZXRlciAqLworfTsKKworLyoqIFRoZSB3aW5kb3dzIGN1c3RvbSB3aW5kb3cgbWFuYWdlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9TeXNXTWluZm8geworCVNETF92ZXJzaW9uIHZlcnNpb247CisJSFdORCB3aW5kb3c7CQkJLyoqPCBUaGUgV2luMzIgZGlzcGxheSB3aW5kb3cgKi8KKwlIR0xSQyBoZ2xyYzsJCQkvKio8IFRoZSBPcGVuR0wgY29udGV4dCwgaWYgYW55ICovCit9IFNETF9TeXNXTWluZm87CisKKyNlbGlmIGRlZmluZWQoU0RMX1ZJREVPX0RSSVZFUl9SSVNDT1MpCisKKy8qKiBSSVNDIE9TIGN1c3RvbSBldmVudCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBTRExfU3lzV01tc2cgeworCVNETF92ZXJzaW9uIHZlcnNpb247CisJaW50IGV2ZW50Q29kZTsJCS8qKjwgVGhlIHdpbmRvdyBmb3IgdGhlIG1lc3NhZ2UgKi8KKwlpbnQgcG9sbEJsb2NrWzY0XTsKK307CisKKy8qKiBUaGUgUklTQyBPUyBjdXN0b20gd2luZG93IG1hbmFnZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIHsKKwlTRExfdmVyc2lvbiB2ZXJzaW9uOworCWludCB3aW1wVmVyc2lvbjsgICAgLyoqPCBXaW1wIHZlcnNpb24gcnVubmluZyB1bmRlciAqLworCWludCB0YXNrSGFuZGxlOyAgICAgLyoqPCBUaGUgUklTQyBPUyB0YXNrIGhhbmRsZSAqLworCWludCB3aW5kb3c7CQkvKio8IFRoZSBSSVNDIE9TIGRpc3BsYXkgd2luZG93ICovCit9IFNETF9TeXNXTWluZm87CisKKyNlbGlmIGRlZmluZWQoU0RMX1ZJREVPX0RSSVZFUl9QSE9UT04pCisjaW5jbHVkZSA8c3lzL25ldXRyaW5vLmg+CisjaW5jbHVkZSA8UGguaD4KKworLyoqIFRoZSBRTlggY3VzdG9tIGV2ZW50IHN0cnVjdHVyZSAqLworc3RydWN0IFNETF9TeXNXTW1zZyB7CisJU0RMX3ZlcnNpb24gdmVyc2lvbjsKKwlpbnQgZGF0YTsKK307CisKKy8qKiBUaGUgUU5YIGN1c3RvbSB3aW5kb3cgbWFuYWdlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9TeXNXTWluZm8geworCVNETF92ZXJzaW9uIHZlcnNpb247CisJaW50IGRhdGE7Cit9IFNETF9TeXNXTWluZm87CisKKyNlbGlmIGRlZmluZWQoU0RMX1ZJREVPX0RSSVZFUl9RVUFSVFopCisKK3N0cnVjdCBTRExfU3lzV01tc2cgeworCVNETF92ZXJzaW9uIHZlcnNpb247CisJaW50IGRhdGE7Cit9OworCit0eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIHsKKwlTRExfdmVyc2lvbiB2ZXJzaW9uOworCXZvaWQqIG5zV2luZG93UHRyOworfSBTRExfU3lzV01pbmZvOworCisjZWxzZQorCisvKiogVGhlIGdlbmVyaWMgY3VzdG9tIGV2ZW50IHN0cnVjdHVyZSAqLworc3RydWN0IFNETF9TeXNXTW1zZyB7CisJU0RMX3ZlcnNpb24gdmVyc2lvbjsKKwlpbnQgZGF0YTsKK307CisKKy8qKiBUaGUgZ2VuZXJpYyBjdXN0b20gd2luZG93IG1hbmFnZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBTRExfU3lzV01pbmZvIHsKKwlTRExfdmVyc2lvbiB2ZXJzaW9uOworCWludCBkYXRhOworfSBTRExfU3lzV01pbmZvOworCisjZW5kaWYgLyogdmlkZW8gZHJpdmVyIHR5cGUgKi8KKworI2VuZGlmIC8qIFNETF9QUk9UT1RZUEVTX09OTFkgKi8KKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGdpdmVzIHlvdSBjdXN0b20gaG9va3MgaW50byB0aGUgd2luZG93IG1hbmFnZXIgaW5mb3JtYXRpb24uCisgKiBJdCBmaWxscyB0aGUgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgJ2luZm8nIHdpdGggY3VzdG9tIGluZm9ybWF0aW9uIGFuZAorICogcmV0dXJucyAwIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQsIDEgaWYgdGhlIGZ1bmN0aW9uIGlzIAorICogaW1wbGVtZW50ZWQgYW5kIG5vIGVycm9yIG9jY3VycmVkLCBhbmQgLTEgaWYgdGhlIHZlcnNpb24gbWVtYmVyIG9mCisgKiB0aGUgJ2luZm8nIHN0cnVjdHVyZSBpcyBub3QgZmlsbGVkIGluIG9yIG5vdCBzdXBwb3J0ZWQuCisgKgorICogWW91IHR5cGljYWxseSB1c2UgdGhpcyBmdW5jdGlvbiBsaWtlIHRoaXM6CisgKiBAY29kZQorICogU0RMX1N5c1dNaW5mbyBpbmZvOworICogU0RMX1ZFUlNJT04oJmluZm8udmVyc2lvbik7CisgKiBpZiAoIFNETF9HZXRXTUluZm8oJmluZm8pICkgeyAuLi4gfQorICogQGVuZGNvZGUKKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9HZXRXTUluZm8oU0RMX1N5c1dNaW5mbyAqaW5mbyk7CisKKworLyogRW5kcyBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKKworI2VuZGlmIC8qIF9TRExfc3lzd21faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX3RocmVhZC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvU0RMX3RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYmUwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfdGhyZWFkLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKyNpZm5kZWYgX1NETF90aHJlYWRfaAorI2RlZmluZSBfU0RMX3RocmVhZF9oCisKKy8qKiBAZmlsZSBTRExfdGhyZWFkLmgKKyAqICBIZWFkZXIgZm9yIHRoZSBTREwgdGhyZWFkIG1hbmFnZW1lbnQgcm91dGluZXMgCisgKgorICogIEBub3RlIFRoZXNlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgb3RoZXIgU0RMIHJvdXRpbmVzLgorICovCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisKKy8qIFRocmVhZCBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyAqLworI2luY2x1ZGUgIlNETF9tdXRleC5oIgorCisjaW5jbHVkZSAiYmVnaW5fY29kZS5oIgorLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBUaGUgU0RMIHRocmVhZCBzdHJ1Y3R1cmUsIGRlZmluZWQgaW4gU0RMX3RocmVhZC5jICovCitzdHJ1Y3QgU0RMX1RocmVhZDsKK3R5cGVkZWYgc3RydWN0IFNETF9UaHJlYWQgU0RMX1RocmVhZDsKKworLyoqIENyZWF0ZSBhIHRocmVhZCAqLworI2lmICgoZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKEhBVkVfTElCQykpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICAhZGVmaW5lZChfX1NZTUJJQU4zMl9fKQorLyoqCisgKiAgV2UgY29tcGlsZSBTREwgaW50byBhIERMTCBvbiBPUy8yLiBUaGlzIG1lYW5zLCB0aGF0IGl0J3MgdGhlIERMTCB3aGljaAorICogIGNyZWF0ZXMgYSBuZXcgdGhyZWFkIGZvciB0aGUgY2FsbGluZyBwcm9jZXNzIHdpdGggdGhlIFNETF9DcmVhdGVUaHJlYWQoKQorICogIEFQSS4gVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhpcywgdGhhdCBvbmx5IHRoZSBSVEwgb2YgdGhlIFNETC5ETEwgd2lsbAorICogIGJlIGluaXRpYWxpemVkIGZvciB0aG9zZSB0aHJlYWRzLCBhbmQgbm90IHRoZSBSVEwgb2YgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24hCisgKiAgVG8gc29sdmUgdGhpcywgd2UgbWFrZSBhIGxpdHRsZSBoYWNrIGhlcmUuCisgKiAgV2UnbGwgYWx3YXlzIHVzZSB0aGUgY2FsbGVyJ3MgX2JlZ2ludGhyZWFkKCkgYW5kIF9lbmR0aHJlYWQoKSBBUElzIHRvCisgKiAgc3RhcnQgYSBuZXcgdGhyZWFkLiBUaGlzIHdheSwgaWYgaXQncyB0aGUgU0RMLkRMTCB3aGljaCB1c2VzIHRoaXMgQVBJLAorICogIHRoZW4gdGhlIFJUTCBvZiBTREwuRExMIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG5ldyB0aHJlYWQsIGFuZCBpZiBpdCdzCisgKiAgdGhlIGFwcGxpY2F0aW9uLCB0aGVuIHRoZSBSVEwgb2YgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgdXNlZC4KKyAqICBTbywgaW4gc2hvcnQ6CisgKiAgQWx3YXlzIHVzZSB0aGUgX2JlZ2ludGhyZWFkKCkgYW5kIF9lbmR0aHJlYWQoKSBvZiB0aGUgY2FsbGluZyBydW50aW1lIGxpYnJhcnkhCisgKi8KKyNkZWZpbmUgU0RMX1BBU1NFRF9CRUdJTlRIUkVBRF9FTkRUSFJFQUQKKyNpZm5kZWYgX1dJTjMyX1dDRQorI2luY2x1ZGUgPHByb2Nlc3MuaD4gLyogVGhpcyBoYXMgX2JlZ2ludGhyZWFkKCkgYW5kIF9lbmR0aHJlYWQoKSBkZWZpbmVkISAqLworI2VuZGlmCisKKyNpZmRlZiBfX09TMl9fCit0eXBlZGVmIGludCAoKnBmblNETF9DdXJyZW50QmVnaW5UaHJlYWQpKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICosIHVuc2lnbmVkLCB2b2lkICphcmcpOyAKK3R5cGVkZWYgdm9pZCAoKnBmblNETF9DdXJyZW50RW5kVGhyZWFkKSh2b2lkKTsKKyNlbHNlCit0eXBlZGVmIHVpbnRwdHJfdCAoX19jZGVjbCAqcGZuU0RMX0N1cnJlbnRCZWdpblRocmVhZCkgKHZvaWQgKiwgdW5zaWduZWQsCisgICAgICAgIHVuc2lnbmVkIChfX3N0ZGNhbGwgKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZywgCisgICAgICAgIHVuc2lnbmVkLCB1bnNpZ25lZCAqdGhyZWFkSUQpOwordHlwZWRlZiB2b2lkIChfX2NkZWNsICpwZm5TRExfQ3VycmVudEVuZFRocmVhZCkodW5zaWduZWQgY29kZSk7CisjZW5kaWYKKworZXh0ZXJuIERFQ0xTUEVDIFNETF9UaHJlYWQgKiBTRExDQUxMIFNETF9DcmVhdGVUaHJlYWQoaW50IChTRExDQUxMICpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSwgcGZuU0RMX0N1cnJlbnRCZWdpblRocmVhZCBwZm5CZWdpblRocmVhZCwgcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuRW5kVGhyZWFkKTsKKworI2lmZGVmIF9fT1MyX18KKyNkZWZpbmUgU0RMX0NyZWF0ZVRocmVhZChmbiwgZGF0YSkgU0RMX0NyZWF0ZVRocmVhZChmbiwgZGF0YSwgX2JlZ2ludGhyZWFkLCBfZW5kdGhyZWFkKQorI2VsaWYgZGVmaW5lZChfV0lOMzJfV0NFKQorI2RlZmluZSBTRExfQ3JlYXRlVGhyZWFkKGZuLCBkYXRhKSBTRExfQ3JlYXRlVGhyZWFkKGZuLCBkYXRhLCBOVUxMLCBOVUxMKQorI2Vsc2UKKyNkZWZpbmUgU0RMX0NyZWF0ZVRocmVhZChmbiwgZGF0YSkgU0RMX0NyZWF0ZVRocmVhZChmbiwgZGF0YSwgX2JlZ2ludGhyZWFkZXgsIF9lbmR0aHJlYWRleCkKKyNlbmRpZgorI2Vsc2UKK2V4dGVybiBERUNMU1BFQyBTRExfVGhyZWFkICogU0RMQ0FMTCBTRExfQ3JlYXRlVGhyZWFkKGludCAoU0RMQ0FMTCAqZm4pKHZvaWQgKiksIHZvaWQgKmRhdGEpOworI2VuZGlmCisKKy8qKiBHZXQgdGhlIDMyLWJpdCB0aHJlYWQgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkICovCitleHRlcm4gREVDTFNQRUMgVWludDMyIFNETENBTEwgU0RMX1RocmVhZElEKHZvaWQpOworCisvKiogR2V0IHRoZSAzMi1iaXQgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRoZSBzcGVjaWZpZWQgdGhyZWFkLAorICogIGVxdWl2YWxlbnQgdG8gU0RMX1RocmVhZElEKCkgaWYgdGhlIHNwZWNpZmllZCB0aHJlYWQgaXMgTlVMTC4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIFVpbnQzMiBTRExDQUxMIFNETF9HZXRUaHJlYWRJRChTRExfVGhyZWFkICp0aHJlYWQpOworCisvKiogV2FpdCBmb3IgYSB0aHJlYWQgdG8gZmluaXNoLgorICogIFRoZSByZXR1cm4gY29kZSBmb3IgdGhlIHRocmVhZCBmdW5jdGlvbiBpcyBwbGFjZWQgaW4gdGhlIGFyZWEKKyAqICBwb2ludGVkIHRvIGJ5ICdzdGF0dXMnLCBpZiAnc3RhdHVzJyBpcyBub3QgTlVMTC4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfV2FpdFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQsIGludCAqc3RhdHVzKTsKKworLyoqIEZvcmNlZnVsbHkga2lsbCBhIHRocmVhZCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGl0cyBzdGF0ZSAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpOworCisKKy8qIEVuZHMgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNpbmNsdWRlICJjbG9zZV9jb2RlLmgiCisKKyNlbmRpZiAvKiBfU0RMX3RocmVhZF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfdGltZXIuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NjRkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfdGltZXIuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworI2lmbmRlZiBfU0RMX3RpbWVyX2gKKyNkZWZpbmUgX1NETF90aW1lcl9oCisKKy8qKiBAZmlsZSBTRExfdGltZXIuaAorICogIEhlYWRlciBmb3IgdGhlIFNETCB0aW1lIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqLworCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorCisjaW5jbHVkZSAiYmVnaW5fY29kZS5oIgorLyogU2V0IHVwIGZvciBDIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBldmVuIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBUaGlzIGlzIHRoZSBPUyBzY2hlZHVsZXIgdGltZXNsaWNlLCBpbiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgU0RMX1RJTUVTTElDRQkJMTAKKworLyoqIFRoaXMgaXMgdGhlIG1heGltdW0gcmVzb2x1dGlvbiBvZiB0aGUgU0RMIHRpbWVyIG9uIGFsbCBwbGF0Zm9ybXMgKi8KKyNkZWZpbmUgVElNRVJfUkVTT0xVVElPTgkxMAkvKio8IEV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQgKi8KKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIFNETCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLgorICogTm90ZSB0aGF0IHRoaXMgdmFsdWUgd3JhcHMgaWYgdGhlIHByb2dyYW0gcnVucyBmb3IgbW9yZSB0aGFuIH40OSBkYXlzLgorICovIAorZXh0ZXJuIERFQ0xTUEVDIFVpbnQzMiBTRExDQUxMIFNETF9HZXRUaWNrcyh2b2lkKTsKKworLyoqIFdhaXQgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmV0dXJuaW5nICovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9EZWxheShVaW50MzIgbXMpOworCisvKiogRnVuY3Rpb24gcHJvdG90eXBlIGZvciB0aGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgVWludDMyIChTRExDQUxMICpTRExfVGltZXJDYWxsYmFjaykoVWludDMyIGludGVydmFsKTsKKworLyoqCisgKiBTZXQgYSBjYWxsYmFjayB0byBydW4gYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGhhcworICogZWxhcHNlZC4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgY3VycmVudCB0aW1lciBpbnRlcnZhbAorICogYW5kIHJldHVybnMgdGhlIG5leHQgdGltZXIgaW50ZXJ2YWwuICBJZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIAorICogc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBpbiwgdGhlIHBlcmlvZGljIGFsYXJtIGNvbnRpbnVlcywgb3RoZXJ3aXNlIGEKKyAqIG5ldyBhbGFybSBpcyBzY2hlZHVsZWQuICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyAwLCB0aGUgcGVyaW9kaWMgYWxhcm0KKyAqIGlzIGNhbmNlbGxlZC4KKyAqCisgKiBUbyBjYW5jZWwgYSBjdXJyZW50bHkgcnVubmluZyB0aW1lciwgY2FsbCBTRExfU2V0VGltZXIoMCwgTlVMTCk7CisgKgorICogVGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIG1heSBydW4gaW4gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4geW91cgorICogbWFpbiBjb2RlLCBhbmQgc28gc2hvdWxkbid0IGNhbGwgYW55IGZ1bmN0aW9ucyBmcm9tIHdpdGhpbiBpdHNlbGYuCisgKgorICogVGhlIG1heGltdW0gcmVzb2x1dGlvbiBvZiB0aGlzIHRpbWVyIGlzIDEwIG1zLCB3aGljaCBtZWFucyB0aGF0IGlmCisgKiB5b3UgcmVxdWVzdCBhIDE2IG1zIHRpbWVyLCB5b3VyIGNhbGxiYWNrIHdpbGwgcnVuIGFwcHJveGltYXRlbHkgMjAgbXMKKyAqIGxhdGVyIG9uIGFuIHVubG9hZGVkIHN5c3RlbS4gIElmIHlvdSB3YW50ZWQgdG8gc2V0IGEgZmxhZyBzaWduYWxpbmcKKyAqIGEgZnJhbWUgdXBkYXRlIGF0IDMwIGZyYW1lcyBwZXIgc2Vjb25kIChldmVyeSAzMyBtcyksIHlvdSBtaWdodCBzZXQgYSAKKyAqIHRpbWVyIGZvciAzMCBtczoKKyAqICAgQGNvZGUgU0RMX1NldFRpbWVyKCgzMy8xMCkqMTAsIGZsYWdfdXBkYXRlKTsgQGVuZGNvZGUKKyAqCisgKiBJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24sIHlvdSBuZWVkIHRvIHBhc3MgU0RMX0lOSVRfVElNRVIgdG8gU0RMX0luaXQoKS4KKyAqCisgKiBVbmRlciBVTklYLCB5b3Ugc2hvdWxkIG5vdCB1c2UgcmFpc2Ugb3IgdXNlIFNJR0FMUk0gYW5kIHRoaXMgZnVuY3Rpb24KKyAqIGluIHRoZSBzYW1lIHByb2dyYW0sIGFzIGl0IGlzIGltcGxlbWVudGVkIHVzaW5nIHNldGl0aW1lcigpLiAgWW91IGFsc28KKyAqIHNob3VsZCBub3QgdXNlIHRoaXMgZnVuY3Rpb24gaW4gbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIGFzIHNpZ25hbHMKKyAqIHRvIG11bHRpLXRocmVhZGVkIGFwcHMgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgaW4gc29tZSBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgLTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NldFRpbWVyKFVpbnQzMiBpbnRlcnZhbCwgU0RMX1RpbWVyQ2FsbGJhY2sgY2FsbGJhY2spOworCisvKiogQG5hbWUgTmV3IHRpbWVyIEFQSQorICogTmV3IHRpbWVyIEFQSSwgc3VwcG9ydHMgbXVsdGlwbGUgdGltZXJzCisgKiBXcml0dGVuIGJ5IFN0ZXBoYW5lIFBldGVyIDxtZWdhc3RlcEBsb2tpZ2FtZXMuY29tPgorICovCisvKkB7Ki8KKworLyoqCisgKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIHRoZSBuZXcgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBjdXJyZW50IHRpbWVyIGludGVydmFsIGFuZCByZXR1cm5zCisgKiB0aGUgbmV4dCB0aW1lciBpbnRlcnZhbC4gIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lCisgKiBwYXNzZWQgaW4sIHRoZSBwZXJpb2RpYyBhbGFybSBjb250aW51ZXMsIG90aGVyd2lzZSBhIG5ldyBhbGFybSBpcworICogc2NoZWR1bGVkLiAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgMCwgdGhlIHBlcmlvZGljIGFsYXJtIGlzIGNhbmNlbGxlZC4KKyAqLwordHlwZWRlZiBVaW50MzIgKFNETENBTEwgKlNETF9OZXdUaW1lckNhbGxiYWNrKShVaW50MzIgaW50ZXJ2YWwsIHZvaWQgKnBhcmFtKTsKKworLyoqIERlZmluaXRpb24gb2YgdGhlIHRpbWVyIElEIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IF9TRExfVGltZXJJRCAqU0RMX1RpbWVySUQ7CisKKy8qKiBBZGQgYSBuZXcgdGltZXIgdG8gdGhlIHBvb2wgb2YgdGltZXJzIGFscmVhZHkgcnVubmluZy4KKyAqICBSZXR1cm5zIGEgdGltZXIgSUQsIG9yIE5VTEwgd2hlbiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK2V4dGVybiBERUNMU1BFQyBTRExfVGltZXJJRCBTRExDQUxMIFNETF9BZGRUaW1lcihVaW50MzIgaW50ZXJ2YWwsIFNETF9OZXdUaW1lckNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwYXJhbSk7CisKKy8qKgorICogUmVtb3ZlIG9uZSBvZiB0aGUgbXVsdGlwbGUgdGltZXJzIGtub3dpbmcgaXRzIElELgorICogUmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBzdWNjZXNzLgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX2Jvb2wgU0RMQ0FMTCBTRExfUmVtb3ZlVGltZXIoU0RMX1RpbWVySUQgdCk7CisKKy8qQH0qLworCisvKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjaW5jbHVkZSAiY2xvc2VfY29kZS5oIgorCisjZW5kaWYgLyogX1NETF90aW1lcl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfdHlwZXMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDhiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfdHlwZXMuaApAQCAtMCwwICsxLDI4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKiogQGZpbGUgU0RMX3R5cGVzLmgKKyAqICBAZGVwcmVjYXRlZCBVc2UgU0RMX3N0ZGluYy5oIGluc3RlYWQuCisgKi8KKworLyogREVQUkVDQVRFRCAqLworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF92ZXJzaW9uLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzE3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfdmVyc2lvbi5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qKiBAZmlsZSBTRExfdmVyc2lvbi5oCisgKiAgVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgY3VycmVudCBTREwgdmVyc2lvbgorICovCisKKyNpZm5kZWYgX1NETF92ZXJzaW9uX2gKKyNkZWZpbmUgX1NETF92ZXJzaW9uX2gKKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKworI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKKy8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogQG5hbWUgVmVyc2lvbiBOdW1iZXIKKyAqICBQcmludGFibGUgZm9ybWF0OiAiJWQuJWQuJWQiLCBNQUpPUiwgTUlOT1IsIFBBVENITEVWRUwKKyAqLworLypAeyovCisjZGVmaW5lIFNETF9NQUpPUl9WRVJTSU9OCTEKKyNkZWZpbmUgU0RMX01JTk9SX1ZFUlNJT04JMgorI2RlZmluZSBTRExfUEFUQ0hMRVZFTAkJMTUKKy8qQH0qLworCit0eXBlZGVmIHN0cnVjdCBTRExfdmVyc2lvbiB7CisJVWludDggbWFqb3I7CisJVWludDggbWlub3I7CisJVWludDggcGF0Y2g7Cit9IFNETF92ZXJzaW9uOworCisvKioKKyAqIFRoaXMgbWFjcm8gY2FuIGJlIHVzZWQgdG8gZmlsbCBhIHZlcnNpb24gc3RydWN0dXJlIHdpdGggdGhlIGNvbXBpbGUtdGltZQorICogdmVyc2lvbiBvZiB0aGUgU0RMIGxpYnJhcnkuCisgKi8KKyNkZWZpbmUgU0RMX1ZFUlNJT04oWCkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwkoWCktPm1ham9yID0gU0RMX01BSk9SX1ZFUlNJT047CQkJCQlcCisJKFgpLT5taW5vciA9IFNETF9NSU5PUl9WRVJTSU9OOwkJCQkJXAorCShYKS0+cGF0Y2ggPSBTRExfUEFUQ0hMRVZFTDsJCQkJCVwKK30KKworLyoqIFRoaXMgbWFjcm8gdHVybnMgdGhlIHZlcnNpb24gbnVtYmVycyBpbnRvIGEgbnVtZXJpYyB2YWx1ZToKKyAqICAoMSwyLDMpIC0+ICgxMjAzKQorICogIFRoaXMgYXNzdW1lcyB0aGF0IHRoZXJlIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIDEwMCBwYXRjaGxldmVscworICovCisjZGVmaW5lIFNETF9WRVJTSU9OTlVNKFgsIFksIFopCQkJCQkJXAorCSgoWCkqMTAwMCArIChZKSoxMDAgKyAoWikpCisKKy8qKiBUaGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBtYWNybyBmb3IgdGhlIGN1cnJlbnQgU0RMIHZlcnNpb24gKi8KKyNkZWZpbmUgU0RMX0NPTVBJTEVEVkVSU0lPTiBcCisJU0RMX1ZFUlNJT05OVU0oU0RMX01BSk9SX1ZFUlNJT04sIFNETF9NSU5PUl9WRVJTSU9OLCBTRExfUEFUQ0hMRVZFTCkKKworLyoqIFRoaXMgbWFjcm8gd2lsbCBldmFsdWF0ZSB0byB0cnVlIGlmIGNvbXBpbGVkIHdpdGggU0RMIGF0IGxlYXN0IFguWS5aICovCisjZGVmaW5lIFNETF9WRVJTSU9OX0FUTEVBU1QoWCwgWSwgWikgXAorCShTRExfQ09NUElMRURWRVJTSU9OID49IFNETF9WRVJTSU9OTlVNKFgsIFksIFopKQorCisvKiogVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBkeW5hbWljYWxseSBsaW5rZWQgU0RMIGxpYnJhcnkuCisgKiAgaXQgc2hvdWxkIE5PVCBiZSB1c2VkIHRvIGZpbGwgYSB2ZXJzaW9uIHN0cnVjdHVyZSwgaW5zdGVhZCB5b3Ugc2hvdWxkCisgKiAgdXNlIHRoZSBTRExfVmVyc2lvbigpIG1hY3JvLgorICovCitleHRlcm4gREVDTFNQRUMgY29uc3QgU0RMX3ZlcnNpb24gKiBTRExDQUxMIFNETF9MaW5rZWRfVmVyc2lvbih2b2lkKTsKKworLyogRW5kcyBDIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoZW4gdXNpbmcgQysrICovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2luY2x1ZGUgImNsb3NlX2NvZGUuaCIKKworI2VuZGlmIC8qIF9TRExfdmVyc2lvbl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL1NETF92aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMmRmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9TRExfdmlkZW8uaApAQCAtMCwwICsxLDk4MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqIEBmaWxlIFNETF92aWRlby5oCisgKiAgSGVhZGVyIGZpbGUgZm9yIGFjY2VzcyB0byB0aGUgU0RMIHJhdyBmcmFtZWJ1ZmZlciB3aW5kb3cKKyAqLworCisjaWZuZGVmIF9TRExfdmlkZW9faAorI2RlZmluZSBfU0RMX3ZpZGVvX2gKKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKyNpbmNsdWRlICJTRExfZXJyb3IuaCIKKyNpbmNsdWRlICJTRExfcndvcHMuaCIKKworI2luY2x1ZGUgImJlZ2luX2NvZGUuaCIKKy8qIFNldCB1cCBmb3IgQyBmdW5jdGlvbiBkZWZpbml0aW9ucywgZXZlbiB3aGVuIHVzaW5nIEMrKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogQG5hbWUgVHJhbnNwYXJlbmN5IGRlZmluaXRpb25zCisgKiAgVGhlc2UgZGVmaW5lIGFscGhhIGFzIHRoZSBvcGFjaXR5IG9mIGEgc3VyZmFjZQorICovCisvKkB7Ki8KKyNkZWZpbmUgU0RMX0FMUEhBX09QQVFVRSAyNTUKKyNkZWZpbmUgU0RMX0FMUEhBX1RSQU5TUEFSRU5UIDAKKy8qQH0qLworCisvKiogQG5hbWUgVXNlZnVsIGRhdGEgdHlwZXMgKi8KKy8qQHsqLwordHlwZWRlZiBzdHJ1Y3QgU0RMX1JlY3QgeworCVNpbnQxNiB4LCB5OworCVVpbnQxNiB3LCBoOworfSBTRExfUmVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgU0RMX0NvbG9yIHsKKwlVaW50OCByOworCVVpbnQ4IGc7CisJVWludDggYjsKKwlVaW50OCB1bnVzZWQ7Cit9IFNETF9Db2xvcjsKKyNkZWZpbmUgU0RMX0NvbG91ciBTRExfQ29sb3IKKwordHlwZWRlZiBzdHJ1Y3QgU0RMX1BhbGV0dGUgeworCWludCAgICAgICBuY29sb3JzOworCVNETF9Db2xvciAqY29sb3JzOworfSBTRExfUGFsZXR0ZTsKKy8qQH0qLworCisvKiogRXZlcnl0aGluZyBpbiB0aGUgcGl4ZWwgZm9ybWF0IHN0cnVjdHVyZSBpcyByZWFkLW9ubHkgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9QaXhlbEZvcm1hdCB7CisJU0RMX1BhbGV0dGUgKnBhbGV0dGU7CisJVWludDggIEJpdHNQZXJQaXhlbDsKKwlVaW50OCAgQnl0ZXNQZXJQaXhlbDsKKwlVaW50OCAgUmxvc3M7CisJVWludDggIEdsb3NzOworCVVpbnQ4ICBCbG9zczsKKwlVaW50OCAgQWxvc3M7CisJVWludDggIFJzaGlmdDsKKwlVaW50OCAgR3NoaWZ0OworCVVpbnQ4ICBCc2hpZnQ7CisJVWludDggIEFzaGlmdDsKKwlVaW50MzIgUm1hc2s7CisJVWludDMyIEdtYXNrOworCVVpbnQzMiBCbWFzazsKKwlVaW50MzIgQW1hc2s7CisKKwkvKiogUkdCIGNvbG9yIGtleSBpbmZvcm1hdGlvbiAqLworCVVpbnQzMiBjb2xvcmtleTsKKwkvKiogQWxwaGEgdmFsdWUgaW5mb3JtYXRpb24gKHBlci1zdXJmYWNlIGFscGhhKSAqLworCVVpbnQ4ICBhbHBoYTsKK30gU0RMX1BpeGVsRm9ybWF0OworCisvKiogVGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcmVhZC1vbmx5LCBleGNlcHQgZm9yICdwaXhlbHMnLAorICogIHdoaWNoLCBpZiBub3QgTlVMTCwgY29udGFpbnMgdGhlIHJhdyBwaXhlbCBkYXRhIGZvciB0aGUgc3VyZmFjZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgU0RMX1N1cmZhY2UgeworCVVpbnQzMiBmbGFnczsJCQkJLyoqPCBSZWFkLW9ubHkgKi8KKwlTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdDsJCS8qKjwgUmVhZC1vbmx5ICovCisJaW50IHcsIGg7CQkJCS8qKjwgUmVhZC1vbmx5ICovCisJVWludDE2IHBpdGNoOwkJCQkvKio8IFJlYWQtb25seSAqLworCXZvaWQgKnBpeGVsczsJCQkJLyoqPCBSZWFkLXdyaXRlICovCisJaW50IG9mZnNldDsJCQkJLyoqPCBQcml2YXRlICovCisKKwkvKiogSGFyZHdhcmUtc3BlY2lmaWMgc3VyZmFjZSBpbmZvICovCisJc3RydWN0IHByaXZhdGVfaHdkYXRhICpod2RhdGE7CisKKwkvKiogY2xpcHBpbmcgaW5mb3JtYXRpb24gKi8KKwlTRExfUmVjdCBjbGlwX3JlY3Q7CQkJLyoqPCBSZWFkLW9ubHkgKi8KKwlVaW50MzIgdW51c2VkMTsJCQkJLyoqPCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KKworCS8qKiBBbGxvdyByZWN1cnNpdmUgbG9ja3MgKi8KKwlVaW50MzIgbG9ja2VkOwkJCQkvKio8IFByaXZhdGUgKi8KKworCS8qKiBpbmZvIGZvciBmYXN0IGJsaXQgbWFwcGluZyB0byBvdGhlciBzdXJmYWNlcyAqLworCXN0cnVjdCBTRExfQmxpdE1hcCAqbWFwOwkJLyoqPCBQcml2YXRlICovCisKKwkvKiogZm9ybWF0IHZlcnNpb24sIGJ1bXBlZCBhdCBldmVyeSBjaGFuZ2UgdG8gaW52YWxpZGF0ZSBibGl0IG1hcHMgKi8KKwl1bnNpZ25lZCBpbnQgZm9ybWF0X3ZlcnNpb247CQkvKio8IFByaXZhdGUgKi8KKworCS8qKiBSZWZlcmVuY2UgY291bnQgLS0gdXNlZCB3aGVuIGZyZWVpbmcgc3VyZmFjZSAqLworCWludCByZWZjb3VudDsJCQkJLyoqPCBSZWFkLW1vc3RseSAqLworfSBTRExfU3VyZmFjZTsKKworLyoqIEBuYW1lIFNETF9TdXJmYWNlIEZsYWdzCisgKiAgVGhlc2UgYXJlIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGZsYWdzIGZvciB0aGUgU0RMX3N1cmZhY2UKKyAqLworLypAeyovCisKKy8qKiBBdmFpbGFibGUgZm9yIFNETF9DcmVhdGVSR0JTdXJmYWNlKCkgb3IgU0RMX1NldFZpZGVvTW9kZSgpICovCisvKkB7Ki8KKyNkZWZpbmUgU0RMX1NXU1VSRkFDRQkweDAwMDAwMDAwCS8qKjwgU3VyZmFjZSBpcyBpbiBzeXN0ZW0gbWVtb3J5ICovCisjZGVmaW5lIFNETF9IV1NVUkZBQ0UJMHgwMDAwMDAwMQkvKio8IFN1cmZhY2UgaXMgaW4gdmlkZW8gbWVtb3J5ICovCisjZGVmaW5lIFNETF9BU1lOQ0JMSVQJMHgwMDAwMDAwNAkvKio8IFVzZSBhc3luY2hyb25vdXMgYmxpdHMgaWYgcG9zc2libGUgKi8KKy8qQH0qLworCisvKiogQXZhaWxhYmxlIGZvciBTRExfU2V0VmlkZW9Nb2RlKCkgKi8KKy8qQHsqLworI2RlZmluZSBTRExfQU5ZRk9STUFUCTB4MTAwMDAwMDAJLyoqPCBBbGxvdyBhbnkgdmlkZW8gZGVwdGgvcGl4ZWwtZm9ybWF0ICovCisjZGVmaW5lIFNETF9IV1BBTEVUVEUJMHgyMDAwMDAwMAkvKio8IFN1cmZhY2UgaGFzIGV4Y2x1c2l2ZSBwYWxldHRlICovCisjZGVmaW5lIFNETF9ET1VCTEVCVUYJMHg0MDAwMDAwMAkvKio8IFNldCB1cCBkb3VibGUtYnVmZmVyZWQgdmlkZW8gbW9kZSAqLworI2RlZmluZSBTRExfRlVMTFNDUkVFTgkweDgwMDAwMDAwCS8qKjwgU3VyZmFjZSBpcyBhIGZ1bGwgc2NyZWVuIGRpc3BsYXkgKi8KKyNkZWZpbmUgU0RMX09QRU5HTCAgICAgIDB4MDAwMDAwMDIgICAgICAvKio8IENyZWF0ZSBhbiBPcGVuR0wgcmVuZGVyaW5nIGNvbnRleHQgKi8KKyNkZWZpbmUgU0RMX09QRU5HTEJMSVQJMHgwMDAwMDAwQQkvKio8IENyZWF0ZSBhbiBPcGVuR0wgcmVuZGVyaW5nIGNvbnRleHQgYW5kIHVzZSBpdCBmb3IgYmxpdHRpbmcgKi8KKyNkZWZpbmUgU0RMX1JFU0laQUJMRQkweDAwMDAwMDEwCS8qKjwgVGhpcyB2aWRlbyBtb2RlIG1heSBiZSByZXNpemVkICovCisjZGVmaW5lIFNETF9OT0ZSQU1FCTB4MDAwMDAwMjAJLyoqPCBObyB3aW5kb3cgY2FwdGlvbiBvciBlZGdlIGZyYW1lICovCisvKkB9Ki8KKworLyoqIFVzZWQgaW50ZXJuYWxseSAocmVhZC1vbmx5KSAqLworLypAeyovCisjZGVmaW5lIFNETF9IV0FDQ0VMCTB4MDAwMDAxMDAJLyoqPCBCbGl0IHVzZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uICovCisjZGVmaW5lIFNETF9TUkNDT0xPUktFWQkweDAwMDAxMDAwCS8qKjwgQmxpdCB1c2VzIGEgc291cmNlIGNvbG9yIGtleSAqLworI2RlZmluZSBTRExfUkxFQUNDRUxPSwkweDAwMDAyMDAwCS8qKjwgUHJpdmF0ZSBmbGFnICovCisjZGVmaW5lIFNETF9STEVBQ0NFTAkweDAwMDA0MDAwCS8qKjwgU3VyZmFjZSBpcyBSTEUgZW5jb2RlZCAqLworI2RlZmluZSBTRExfU1JDQUxQSEEJMHgwMDAxMDAwMAkvKio8IEJsaXQgdXNlcyBzb3VyY2UgYWxwaGEgYmxlbmRpbmcgKi8KKyNkZWZpbmUgU0RMX1BSRUFMTE9DCTB4MDEwMDAwMDAJLyoqPCBTdXJmYWNlIHVzZXMgcHJlYWxsb2NhdGVkIG1lbW9yeSAqLworLypAfSovCisKKy8qQH0qLworCisvKiogRXZhbHVhdGVzIHRvIHRydWUgaWYgdGhlIHN1cmZhY2UgbmVlZHMgdG8gYmUgbG9ja2VkIGJlZm9yZSBhY2Nlc3MgKi8KKyNkZWZpbmUgU0RMX01VU1RMT0NLKHN1cmZhY2UpCVwKKyAgKHN1cmZhY2UtPm9mZnNldCB8fAkJXAorICAoKHN1cmZhY2UtPmZsYWdzICYgKFNETF9IV1NVUkZBQ0V8U0RMX0FTWU5DQkxJVHxTRExfUkxFQUNDRUwpKSAhPSAwKSkKKworLyoqIHR5cGVkZWYgZm9yIHByaXZhdGUgc3VyZmFjZSBibGl0dGluZyBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgaW50ICgqU0RMX2JsaXQpKHN0cnVjdCBTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKwkJCXN0cnVjdCBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCk7CisKKworLyoqIFVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHZpZGVvIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAqLwordHlwZWRlZiBzdHJ1Y3QgU0RMX1ZpZGVvSW5mbyB7CisJVWludDMyIGh3X2F2YWlsYWJsZSA6MTsJLyoqPCBGbGFnOiBDYW4geW91IGNyZWF0ZSBoYXJkd2FyZSBzdXJmYWNlcz8gKi8KKwlVaW50MzIgd21fYXZhaWxhYmxlIDoxOwkvKio8IEZsYWc6IENhbiB5b3UgdGFsayB0byBhIHdpbmRvdyBtYW5hZ2VyPyAqLworCVVpbnQzMiBVbnVzZWRCaXRzMSAgOjY7CisJVWludDMyIFVudXNlZEJpdHMyICA6MTsKKwlVaW50MzIgYmxpdF9odyAgICAgIDoxOwkvKio8IEZsYWc6IEFjY2VsZXJhdGVkIGJsaXRzIEhXIC0tPiBIVyAqLworCVVpbnQzMiBibGl0X2h3X0NDICAgOjE7CS8qKjwgRmxhZzogQWNjZWxlcmF0ZWQgYmxpdHMgd2l0aCBDb2xvcmtleSAqLworCVVpbnQzMiBibGl0X2h3X0EgICAgOjE7CS8qKjwgRmxhZzogQWNjZWxlcmF0ZWQgYmxpdHMgd2l0aCBBbHBoYSAqLworCVVpbnQzMiBibGl0X3N3ICAgICAgOjE7CS8qKjwgRmxhZzogQWNjZWxlcmF0ZWQgYmxpdHMgU1cgLS0+IEhXICovCisJVWludDMyIGJsaXRfc3dfQ0MgICA6MTsJLyoqPCBGbGFnOiBBY2NlbGVyYXRlZCBibGl0cyB3aXRoIENvbG9ya2V5ICovCisJVWludDMyIGJsaXRfc3dfQSAgICA6MTsJLyoqPCBGbGFnOiBBY2NlbGVyYXRlZCBibGl0cyB3aXRoIEFscGhhICovCisJVWludDMyIGJsaXRfZmlsbCAgICA6MTsJLyoqPCBGbGFnOiBBY2NlbGVyYXRlZCBjb2xvciBmaWxsICovCisJVWludDMyIFVudXNlZEJpdHMzICA6MTY7CisJVWludDMyIHZpZGVvX21lbTsJLyoqPCBUaGUgdG90YWwgYW1vdW50IG9mIHZpZGVvIG1lbW9yeSAoaW4gSykgKi8KKwlTRExfUGl4ZWxGb3JtYXQgKnZmbXQ7CS8qKjwgVmFsdWU6IFRoZSBmb3JtYXQgb2YgdGhlIHZpZGVvIHN1cmZhY2UgKi8KKwlpbnQgICAgY3VycmVudF93OwkvKio8IFZhbHVlOiBUaGUgY3VycmVudCB2aWRlbyBtb2RlIHdpZHRoICovCisJaW50ICAgIGN1cnJlbnRfaDsJLyoqPCBWYWx1ZTogVGhlIGN1cnJlbnQgdmlkZW8gbW9kZSBoZWlnaHQgKi8KK30gU0RMX1ZpZGVvSW5mbzsKKworCisvKiogQG5hbWUgT3ZlcmxheSBGb3JtYXRzCisgKiAgVGhlIG1vc3QgY29tbW9uIHZpZGVvIG92ZXJsYXkgZm9ybWF0cy4KKyAqICBGb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlc2UgcGl4ZWwgZm9ybWF0cywgc2VlOgorICoJaHR0cDovL3d3dy53ZWJhcnR6LmNvbS9mb3VyY2MvaW5kZXh5dXYuaHRtCisgKgorICogIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY29sb3Igc3BhY2VzLCBzZWU6CisgKiAgaHR0cDovL3d3dy5uZXVyby5zZmMua2Vpby5hYy5qcC9+YWx5L3BvbHlnb24vaW5mby9jb2xvci1zcGFjZS1mYXEuaHRtbAorICovCisvKkB7Ki8KKyNkZWZpbmUgU0RMX1lWMTJfT1ZFUkxBWSAgMHgzMjMxNTY1OQkvKio8IFBsYW5hciBtb2RlOiBZICsgViArIFUgICgzIHBsYW5lcykgKi8KKyNkZWZpbmUgU0RMX0lZVVZfT1ZFUkxBWSAgMHg1NjU1NTk0OQkvKio8IFBsYW5hciBtb2RlOiBZICsgVSArIFYgICgzIHBsYW5lcykgKi8KKyNkZWZpbmUgU0RMX1lVWTJfT1ZFUkxBWSAgMHgzMjU5NTU1OQkvKio8IFBhY2tlZCBtb2RlOiBZMCtVMCtZMStWMCAoMSBwbGFuZSkgKi8KKyNkZWZpbmUgU0RMX1VZVllfT1ZFUkxBWSAgMHg1OTU2NTk1NQkvKio8IFBhY2tlZCBtb2RlOiBVMCtZMCtWMCtZMSAoMSBwbGFuZSkgKi8KKyNkZWZpbmUgU0RMX1lWWVVfT1ZFUkxBWSAgMHg1NTU5NTY1OQkvKio8IFBhY2tlZCBtb2RlOiBZMCtWMCtZMStVMCAoMSBwbGFuZSkgKi8KKy8qQH0qLworCisvKiogVGhlIFlVViBoYXJkd2FyZSB2aWRlbyBvdmVybGF5ICovCit0eXBlZGVmIHN0cnVjdCBTRExfT3ZlcmxheSB7CisJVWludDMyIGZvcm1hdDsJCQkJLyoqPCBSZWFkLW9ubHkgKi8KKwlpbnQgdywgaDsJCQkJLyoqPCBSZWFkLW9ubHkgKi8KKwlpbnQgcGxhbmVzOwkJCQkvKio8IFJlYWQtb25seSAqLworCVVpbnQxNiAqcGl0Y2hlczsJCQkvKio8IFJlYWQtb25seSAqLworCVVpbnQ4ICoqcGl4ZWxzOwkJCQkvKio8IFJlYWQtd3JpdGUgKi8KKworCS8qKiBAbmFtZSBIYXJkd2FyZS1zcGVjaWZpYyBzdXJmYWNlIGluZm8gKi8KKyAgICAgICAgLypAeyovCisJc3RydWN0IHByaXZhdGVfeXV2aHdmdW5jcyAqaHdmdW5jczsKKwlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKKyAgICAgICAgLypAeyovCisKKwkvKiogQG5hbWUgU3BlY2lhbCBmbGFncyAqLworICAgICAgICAvKkB7Ki8KKwlVaW50MzIgaHdfb3ZlcmxheSA6MTsJLyoqPCBGbGFnOiBUaGlzIG92ZXJsYXkgaGFyZHdhcmUgYWNjZWxlcmF0ZWQ/ICovCisJVWludDMyIFVudXNlZEJpdHMgOjMxOworICAgICAgICAvKkB9Ki8KK30gU0RMX092ZXJsYXk7CisKKworLyoqIFB1YmxpYyBlbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgT3BlbkdMIHdpbmRvdyBhdHRyaWJ1dGVzLiAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBTRExfR0xfUkVEX1NJWkUsCisgICAgU0RMX0dMX0dSRUVOX1NJWkUsCisgICAgU0RMX0dMX0JMVUVfU0laRSwKKyAgICBTRExfR0xfQUxQSEFfU0laRSwKKyAgICBTRExfR0xfQlVGRkVSX1NJWkUsCisgICAgU0RMX0dMX0RPVUJMRUJVRkZFUiwKKyAgICBTRExfR0xfREVQVEhfU0laRSwKKyAgICBTRExfR0xfU1RFTkNJTF9TSVpFLAorICAgIFNETF9HTF9BQ0NVTV9SRURfU0laRSwKKyAgICBTRExfR0xfQUNDVU1fR1JFRU5fU0laRSwKKyAgICBTRExfR0xfQUNDVU1fQkxVRV9TSVpFLAorICAgIFNETF9HTF9BQ0NVTV9BTFBIQV9TSVpFLAorICAgIFNETF9HTF9TVEVSRU8sCisgICAgU0RMX0dMX01VTFRJU0FNUExFQlVGRkVSUywKKyAgICBTRExfR0xfTVVMVElTQU1QTEVTQU1QTEVTLAorICAgIFNETF9HTF9BQ0NFTEVSQVRFRF9WSVNVQUwsCisgICAgU0RMX0dMX1NXQVBfQ09OVFJPTAorfSBTRExfR0xhdHRyOworCisvKiogQG5hbWUgZmxhZ3MgZm9yIFNETF9TZXRQYWxldHRlKCkgKi8KKy8qQHsqLworI2RlZmluZSBTRExfTE9HUEFMIDB4MDEKKyNkZWZpbmUgU0RMX1BIWVNQQUwgMHgwMgorLypAfSovCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworLyoqCisgKiBAbmFtZSBWaWRlbyBJbml0IGFuZCBRdWl0CisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgaW50ZXJuYWxseSwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgeW91CisgKiBoYXZlIGEgc3BlY2lmaWMgbmVlZCB0byBzcGVjaWZ5IHRoZSB2aWRlbyBkcml2ZXIgeW91IHdhbnQgdG8gdXNlLgorICogWW91IHNob3VsZCBub3JtYWxseSB1c2UgU0RMX0luaXQoKSBvciBTRExfSW5pdFN1YlN5c3RlbSgpLgorICovCisvKkB7Ki8KKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIHZpZGVvIHN1YnN5c3RlbS4gU2V0cyB1cCBhIGNvbm5lY3Rpb24KKyAqIHRvIHRoZSB3aW5kb3cgbWFuYWdlciwgZXRjLCBhbmQgZGV0ZXJtaW5lcyB0aGUgY3VycmVudCB2aWRlbyBtb2RlIGFuZAorICogcGl4ZWwgZm9ybWF0LCBidXQgZG9lcyBub3QgaW5pdGlhbGl6ZSBhIHdpbmRvdyBvciBncmFwaGljcyBtb2RlLgorICogTm90ZSB0aGF0IGV2ZW50IGhhbmRsaW5nIGlzIGFjdGl2YXRlZCBieSB0aGlzIHJvdXRpbmUuCisgKgorICogSWYgeW91IHVzZSBib3RoIHNvdW5kIGFuZCB2aWRlbyBpbiB5b3VyIGFwcGxpY2F0aW9uLCB5b3UgbmVlZCB0byBjYWxsCisgKiBTRExfSW5pdCgpIGJlZm9yZSBvcGVuaW5nIHRoZSBzb3VuZCBkZXZpY2UsIG90aGVyd2lzZSB1bmRlciBXaW4zMiBEaXJlY3RYLAorICogeW91IHdvbid0IGJlIGFibGUgdG8gc2V0IGZ1bGwtc2NyZWVuIGRpc3BsYXkgbW9kZXMuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfVmlkZW9Jbml0KGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lLCBVaW50MzIgZmxhZ3MpOworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfVmlkZW9RdWl0KHZvaWQpOworLypAfSovCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGJ1ZmZlciB3aXRoIHRoZSBuYW1lIG9mIHRoZQorICogdmlkZW8gZHJpdmVyLCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQgaWYgdGhlIHZpZGVvIGRyaXZlciBoYXMKKyAqIGJlZW4gaW5pdGlhbGl6ZWQuICBJdCByZXR1cm5zIE5VTEwgaWYgbm8gZHJpdmVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICovCitleHRlcm4gREVDTFNQRUMgY2hhciAqIFNETENBTEwgU0RMX1ZpZGVvRHJpdmVyTmFtZShjaGFyICpuYW1lYnVmLCBpbnQgbWF4bGVuKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRpc3BsYXkgc3VyZmFjZS4KKyAqIElmIFNETCBpcyBkb2luZyBmb3JtYXQgY29udmVyc2lvbiBvbiB0aGUgZGlzcGxheSBzdXJmYWNlLCB0aGlzCisgKiBmdW5jdGlvbiByZXR1cm5zIHRoZSBwdWJsaWNseSB2aXNpYmxlIHN1cmZhY2UsIG5vdCB0aGUgcmVhbCB2aWRlbworICogc3VyZmFjZS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9TdXJmYWNlICogU0RMQ0FMTCBTRExfR2V0VmlkZW9TdXJmYWNlKHZvaWQpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlYWQtb25seSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogdmlkZW8gaGFyZHdhcmUuICBJZiB0aGlzIGlzIGNhbGxlZCBiZWZvcmUgU0RMX1NldFZpZGVvTW9kZSgpLCB0aGUgJ3ZmbXQnCisgKiBtZW1iZXIgb2YgdGhlIHJldHVybmVkIHN0cnVjdHVyZSB3aWxsIGNvbnRhaW4gdGhlIHBpeGVsIGZvcm1hdCBvZiB0aGUKKyAqICJiZXN0IiB2aWRlbyBtb2RlLgorICovCitleHRlcm4gREVDTFNQRUMgY29uc3QgU0RMX1ZpZGVvSW5mbyAqIFNETENBTEwgU0RMX0dldFZpZGVvSW5mbyh2b2lkKTsKKworLyoqCisgKiBDaGVjayB0byBzZWUgaWYgYSBwYXJ0aWN1bGFyIHZpZGVvIG1vZGUgaXMgc3VwcG9ydGVkLgorICogSXQgcmV0dXJucyAwIGlmIHRoZSByZXF1ZXN0ZWQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBiaXQgZGVwdGgsCisgKiBvciByZXR1cm5zIHRoZSBiaXRzLXBlci1waXhlbCBvZiB0aGUgY2xvc2VzdCBhdmFpbGFibGUgbW9kZSB3aXRoIHRoZQorICogZ2l2ZW4gd2lkdGggYW5kIGhlaWdodC4gIElmIHRoaXMgYml0cy1wZXItcGl4ZWwgaXMgZGlmZmVyZW50IGZyb20gdGhlCisgKiBvbmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIHZpZGVvIG1vZGUsIFNETF9TZXRWaWRlb01vZGUoKSB3aWxsIHN1Y2NlZWQsCisgKiBidXQgd2lsbCBlbXVsYXRlIHRoZSByZXF1ZXN0ZWQgYml0cy1wZXItcGl4ZWwgd2l0aCBhIHNoYWRvdyBzdXJmYWNlLgorICoKKyAqIFRoZSBhcmd1bWVudHMgdG8gU0RMX1ZpZGVvTW9kZU9LKCkgYXJlIHRoZSBzYW1lIG9uZXMgeW91IHdvdWxkIHBhc3MgdG8KKyAqIFNETF9TZXRWaWRlb01vZGUoKQorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1ZpZGVvTW9kZU9LKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKKworLyoqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGF2YWlsYWJsZSBzY3JlZW4gZGltZW5zaW9ucyBmb3IgdGhlCisgKiBnaXZlbiBmb3JtYXQgYW5kIHZpZGVvIGZsYWdzLCBzb3J0ZWQgbGFyZ2VzdCB0byBzbWFsbGVzdC4gIFJldHVybnMgCisgKiBOVUxMIGlmIHRoZXJlIGFyZSBubyBkaW1lbnNpb25zIGF2YWlsYWJsZSBmb3IgYSBwYXJ0aWN1bGFyIGZvcm1hdCwgCisgKiBvciAoU0RMX1JlY3QgKiopLTEgaWYgYW55IGRpbWVuc2lvbiBpcyBva2F5IGZvciB0aGUgZ2l2ZW4gZm9ybWF0LgorICoKKyAqIElmICdmb3JtYXQnIGlzIE5VTEwsIHRoZSBtb2RlIGxpc3Qgd2lsbCBiZSBmb3IgdGhlIGZvcm1hdCBnaXZlbiAKKyAqIGJ5IFNETF9HZXRWaWRlb0luZm8oKS0+dmZtdAorICovCitleHRlcm4gREVDTFNQRUMgU0RMX1JlY3QgKiogU0RMQ0FMTCBTRExfTGlzdE1vZGVzKFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworCisvKioKKyAqIFNldCB1cCBhIHZpZGVvIG1vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQgYW5kIGJpdHMtcGVyLXBpeGVsLgorICoKKyAqIElmICdicHAnIGlzIDAsIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIGN1cnJlbnQgZGlzcGxheSBiaXRzIHBlciBwaXhlbC4KKyAqCisgKiBJZiBTRExfQU5ZRk9STUFUIGlzIHNldCBpbiAnZmxhZ3MnLCB0aGUgU0RMIGxpYnJhcnkgd2lsbCB0cnkgdG8gc2V0IHRoZQorICogcmVxdWVzdGVkIGJpdHMtcGVyLXBpeGVsLCBidXQgd2lsbCByZXR1cm4gd2hhdGV2ZXIgdmlkZW8gcGl4ZWwgZm9ybWF0IGlzCisgKiBhdmFpbGFibGUuICBUaGUgZGVmYXVsdCBpcyB0byBlbXVsYXRlIHRoZSByZXF1ZXN0ZWQgcGl4ZWwgZm9ybWF0IGlmIGl0CisgKiBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlLgorICoKKyAqIElmIFNETF9IV1NVUkZBQ0UgaXMgc2V0IGluICdmbGFncycsIHRoZSB2aWRlbyBzdXJmYWNlIHdpbGwgYmUgcGxhY2VkIGluCisgKiB2aWRlbyBtZW1vcnksIGlmIHBvc3NpYmxlLCBhbmQgeW91IG1heSBoYXZlIHRvIGNhbGwgU0RMX0xvY2tTdXJmYWNlKCkKKyAqIGluIG9yZGVyIHRvIGFjY2VzcyB0aGUgcmF3IGZyYW1lYnVmZmVyLiAgT3RoZXJ3aXNlLCB0aGUgdmlkZW8gc3VyZmFjZQorICogd2lsbCBiZSBjcmVhdGVkIGluIHN5c3RlbSBtZW1vcnkuCisgKgorICogSWYgU0RMX0FTWU5DQkxJVCBpcyBzZXQgaW4gJ2ZsYWdzJywgU0RMIHdpbGwgdHJ5IHRvIHBlcmZvcm0gcmVjdGFuZ2xlCisgKiB1cGRhdGVzIGFzeW5jaHJvbm91c2x5LCBidXQgeW91IG11c3QgYWx3YXlzIGxvY2sgYmVmb3JlIGFjY2Vzc2luZyBwaXhlbHMuCisgKiBTREwgd2lsbCB3YWl0IGZvciB1cGRhdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgbG9jay4KKyAqCisgKiBJZiBTRExfSFdQQUxFVFRFIGlzIHNldCBpbiAnZmxhZ3MnLCB0aGUgU0RMIGxpYnJhcnkgd2lsbCBndWFyYW50ZWUKKyAqIHRoYXQgdGhlIGNvbG9ycyBzZXQgYnkgU0RMX1NldENvbG9ycygpIHdpbGwgYmUgdGhlIGNvbG9ycyB5b3UgZ2V0LgorICogT3RoZXJ3aXNlLCBpbiA4LWJpdCBtb2RlLCBTRExfU2V0Q29sb3JzKCkgbWF5IG5vdCBiZSBhYmxlIHRvIHNldCBhbGwKKyAqIG9mIHRoZSBjb2xvcnMgZXhhY3RseSB0aGUgd2F5IHRoZXkgYXJlIHJlcXVlc3RlZCwgYW5kIHlvdSBzaG91bGQgbG9vaworICogYXQgdGhlIHZpZGVvIHN1cmZhY2Ugc3RydWN0dXJlIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIHBhbGV0dGUuCisgKiBJZiBTREwgY2Fubm90IGd1YXJhbnRlZSB0aGF0IHRoZSBjb2xvcnMgeW91IHJlcXVlc3QgY2FuIGJlIHNldCwgCisgKiBpLmUuIGlmIHRoZSBjb2xvcm1hcCBpcyBzaGFyZWQsIHRoZW4gdGhlIHZpZGVvIHN1cmZhY2UgbWF5IGJlIGNyZWF0ZWQKKyAqIHVuZGVyIGVtdWxhdGlvbiBpbiBzeXN0ZW0gbWVtb3J5LCBvdmVycmlkaW5nIHRoZSBTRExfSFdTVVJGQUNFIGZsYWcuCisgKgorICogSWYgU0RMX0ZVTExTQ1JFRU4gaXMgc2V0IGluICdmbGFncycsIHRoZSBTREwgbGlicmFyeSB3aWxsIHRyeSB0byBzZXQKKyAqIGEgZnVsbHNjcmVlbiB2aWRlbyBtb2RlLiAgVGhlIGRlZmF1bHQgaXMgdG8gY3JlYXRlIGEgd2luZG93ZWQgbW9kZQorICogaWYgdGhlIGN1cnJlbnQgZ3JhcGhpY3Mgc3lzdGVtIGhhcyBhIHdpbmRvdyBtYW5hZ2VyLgorICogSWYgdGhlIFNETCBsaWJyYXJ5IGlzIGFibGUgdG8gc2V0IGEgZnVsbHNjcmVlbiB2aWRlbyBtb2RlLCB0aGlzIGZsYWcgCisgKiB3aWxsIGJlIHNldCBpbiB0aGUgc3VyZmFjZSB0aGF0IGlzIHJldHVybmVkLgorICoKKyAqIElmIFNETF9ET1VCTEVCVUYgaXMgc2V0IGluICdmbGFncycsIHRoZSBTREwgbGlicmFyeSB3aWxsIHRyeSB0byBzZXQgdXAKKyAqIHR3byBzdXJmYWNlcyBpbiB2aWRlbyBtZW1vcnkgYW5kIHN3YXAgYmV0d2VlbiB0aGVtIHdoZW4geW91IGNhbGwgCisgKiBTRExfRmxpcCgpLiAgVGhpcyBpcyB1c3VhbGx5IHNsb3dlciB0aGFuIHRoZSBub3JtYWwgc2luZ2xlLWJ1ZmZlcmluZworICogc2NoZW1lLCBidXQgcHJldmVudHMgInRlYXJpbmciIGFydGlmYWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHZpZGVvIAorICogbWVtb3J5IHdoaWxlIHRoZSBtb25pdG9yIGlzIHJlZnJlc2hpbmcuICBJdCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IAorICogYXBwbGljYXRpb25zIHRoYXQgcmVkcmF3IHRoZSBlbnRpcmUgc2NyZWVuIG9uIGV2ZXJ5IHVwZGF0ZS4KKyAqCisgKiBJZiBTRExfUkVTSVpBQkxFIGlzIHNldCBpbiAnZmxhZ3MnLCB0aGUgU0RMIGxpYnJhcnkgd2lsbCBhbGxvdyB0aGUKKyAqIHdpbmRvdyBtYW5hZ2VyLCBpZiBhbnksIHRvIHJlc2l6ZSB0aGUgd2luZG93IGF0IHJ1bnRpbWUuICBXaGVuIHRoaXMKKyAqIG9jY3VycywgU0RMIHdpbGwgc2VuZCBhIFNETF9WSURFT1JFU0laRSBldmVudCB0byB5b3UgYXBwbGljYXRpb24sCisgKiBhbmQgeW91IG11c3QgcmVzcG9uZCB0byB0aGUgZXZlbnQgYnkgcmUtY2FsbGluZyBTRExfU2V0VmlkZW9Nb2RlKCkKKyAqIHdpdGggdGhlIHJlcXVlc3RlZCBzaXplIChvciBhbm90aGVyIHNpemUgdGhhdCBzdWl0cyB0aGUgYXBwbGljYXRpb24pLgorICoKKyAqIElmIFNETF9OT0ZSQU1FIGlzIHNldCBpbiAnZmxhZ3MnLCB0aGUgU0RMIGxpYnJhcnkgd2lsbCBjcmVhdGUgYSB3aW5kb3cKKyAqIHdpdGhvdXQgYW55IHRpdGxlIGJhciBvciBmcmFtZSBkZWNvcmF0aW9uLiAgRnVsbHNjcmVlbiB2aWRlbyBtb2RlcyBoYXZlCisgKiB0aGlzIGZsYWcgc2V0IGF1dG9tYXRpY2FsbHkuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2aWRlbyBmcmFtZWJ1ZmZlciBzdXJmYWNlLCBvciBOVUxMIGlmIGl0IGZhaWxzLgorICoKKyAqIElmIHlvdSByZWx5IG9uIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgY2VydGFpbiB2aWRlbyBmbGFncywgY2hlY2sgdGhlCisgKiBmbGFncyBvZiB0aGUgcmV0dXJuZWQgc3VyZmFjZSB0byBtYWtlIHN1cmUgdGhhdCBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZS4KKyAqIFNETCB3aWxsIGZhbGwgYmFjayB0byByZWR1Y2VkIGZ1bmN0aW9uYWxpdHkgaWYgdGhlIGV4YWN0IGZsYWdzIHlvdSB3YW50ZWQKKyAqIGFyZSBub3QgYXZhaWxhYmxlLgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX1N1cmZhY2UgKiBTRExDQUxMIFNETF9TZXRWaWRlb01vZGUKKwkJCShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CisKKy8qKiBAbmFtZSBTRExfVXBkYXRlIEZ1bmN0aW9ucworICogVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoaWxlICdzY3JlZW4nIGlzIGxvY2tlZC4KKyAqLworLypAeyovCisvKioKKyAqIE1ha2VzIHN1cmUgdGhlIGdpdmVuIGxpc3Qgb2YgcmVjdGFuZ2xlcyBpcyB1cGRhdGVkIG9uIHRoZSBnaXZlbiBzY3JlZW4uCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1VwZGF0ZVJlY3RzCisJCShTRExfU3VyZmFjZSAqc2NyZWVuLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisvKioKKyAqIElmICd4JywgJ3knLCAndycgYW5kICdoJyBhcmUgYWxsIDAsIFNETF9VcGRhdGVSZWN0IHdpbGwgdXBkYXRlIHRoZSBlbnRpcmUKKyAqIHNjcmVlbi4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfVXBkYXRlUmVjdAorCQkoU0RMX1N1cmZhY2UgKnNjcmVlbiwgU2ludDMyIHgsIFNpbnQzMiB5LCBVaW50MzIgdywgVWludDMyIGgpOworLypAfSovCisKKy8qKgorICogT24gaGFyZHdhcmUgdGhhdCBzdXBwb3J0cyBkb3VibGUtYnVmZmVyaW5nLCB0aGlzIGZ1bmN0aW9uIHNldHMgdXAgYSBmbGlwCisgKiBhbmQgcmV0dXJucy4gIFRoZSBoYXJkd2FyZSB3aWxsIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UsIGFuZCB0aGVuIHN3YXAKKyAqIHZpZGVvIGJ1ZmZlcnMgYmVmb3JlIHRoZSBuZXh0IHZpZGVvIHN1cmZhY2UgYmxpdCBvciBsb2NrIHdpbGwgcmV0dXJuLgorICogT24gaGFyZHdhcmUgdGhhdCBkb2VzbiBub3Qgc3VwcG9ydCBkb3VibGUtYnVmZmVyaW5nLCB0aGlzIGlzIGVxdWl2YWxlbnQKKyAqIHRvIGNhbGxpbmcgU0RMX1VwZGF0ZVJlY3Qoc2NyZWVuLCAwLCAwLCAwLCAwKTsKKyAqIFRoZSBTRExfRE9VQkxFQlVGIGZsYWcgbXVzdCBoYXZlIGJlZW4gcGFzc2VkIHRvIFNETF9TZXRWaWRlb01vZGUoKSB3aGVuCisgKiBzZXR0aW5nIHRoZSB2aWRlbyBtb2RlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIHBlcmZvcm0gaGFyZHdhcmUgZmxpcHBpbmcuCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfRmxpcChTRExfU3VyZmFjZSAqc2NyZWVuKTsKKworLyoqCisgKiBTZXQgdGhlIGdhbW1hIGNvcnJlY3Rpb24gZm9yIGVhY2ggb2YgdGhlIGNvbG9yIGNoYW5uZWxzLgorICogVGhlIGdhbW1hIHZhbHVlcyByYW5nZSAoYXBwcm94aW1hdGVseSkgYmV0d2VlbiAwLjEgYW5kIDEwLjAKKyAqIAorICogSWYgdGhpcyBmdW5jdGlvbiBpc24ndCBzdXBwb3J0ZWQgZGlyZWN0bHkgYnkgdGhlIGhhcmR3YXJlLCBpdCB3aWxsCisgKiBiZSBlbXVsYXRlZCB1c2luZyBnYW1tYSByYW1wcywgaWYgYXZhaWxhYmxlLiAgSWYgc3VjY2Vzc2Z1bCwgdGhpcworICogZnVuY3Rpb24gcmV0dXJucyAwLCBvdGhlcndpc2UgaXQgcmV0dXJucyAtMS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZXRHYW1tYShmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlKTsKKworLyoqCisgKiBTZXQgdGhlIGdhbW1hIHRyYW5zbGF0aW9uIHRhYmxlIGZvciB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMKKyAqIG9mIHRoZSB2aWRlbyBoYXJkd2FyZS4gIEVhY2ggdGFibGUgaXMgYW4gYXJyYXkgb2YgMjU2IDE2LWJpdCBxdWFudGl0aWVzLAorICogcmVwcmVzZW50aW5nIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZvciB0aGF0IGNoYW5uZWwuCisgKiBUaGUgaW5wdXQgaXMgdGhlIGluZGV4IGludG8gdGhlIGFycmF5LCBhbmQgdGhlIG91dHB1dCBpcyB0aGUgMTYtYml0CisgKiBnYW1tYSB2YWx1ZSBhdCB0aGF0IGluZGV4LCBzY2FsZWQgdG8gdGhlIG91dHB1dCBjb2xvciBwcmVjaXNpb24uCisgKiAKKyAqIFlvdSBtYXkgcGFzcyBOVUxMIGZvciBhbnkgb2YgdGhlIGNoYW5uZWxzIHRvIGxlYXZlIGl0IHVuY2hhbmdlZC4KKyAqIElmIHRoZSBjYWxsIHN1Y2NlZWRzLCBpdCB3aWxsIHJldHVybiAwLiAgSWYgdGhlIGRpc3BsYXkgZHJpdmVyIG9yCisgKiBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGdhbW1hIHRyYW5zbGF0aW9uLCBvciBvdGhlcndpc2UgZmFpbHMsCisgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIC0xLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NldEdhbW1hUmFtcChjb25zdCBVaW50MTYgKnJlZCwgY29uc3QgVWludDE2ICpncmVlbiwgY29uc3QgVWludDE2ICpibHVlKTsKKworLyoqCisgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGdhbW1hIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIAorICogWW91IG11c3QgcGFzcyBpbiB2YWxpZCBwb2ludGVycyB0byBhcnJheXMgb2YgMjU2IDE2LWJpdCBxdWFudGl0aWVzLgorICogQW55IG9mIHRoZSBwb2ludGVycyBtYXkgYmUgTlVMTCB0byBpZ25vcmUgdGhhdCBjaGFubmVsLgorICogSWYgdGhlIGNhbGwgc3VjY2VlZHMsIGl0IHdpbGwgcmV0dXJuIDAuICBJZiB0aGUgZGlzcGxheSBkcml2ZXIgb3IKKyAqIGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZ2FtbWEgdHJhbnNsYXRpb24sIG9yIG90aGVyd2lzZSBmYWlscywKKyAqIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfR2V0R2FtbWFSYW1wKFVpbnQxNiAqcmVkLCBVaW50MTYgKmdyZWVuLCBVaW50MTYgKmJsdWUpOworCisvKioKKyAqIFNldHMgYSBwb3J0aW9uIG9mIHRoZSBjb2xvcm1hcCBmb3IgdGhlIGdpdmVuIDgtYml0IHN1cmZhY2UuICBJZiAnc3VyZmFjZScKKyAqIGlzIG5vdCBhIHBhbGV0dGl6ZWQgc3VyZmFjZSwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIHJldHVybmluZyAwLgorICogSWYgYWxsIG9mIHRoZSBjb2xvcnMgd2VyZSBzZXQgYXMgcGFzc2VkIHRvIFNETF9TZXRDb2xvcnMoKSwgaXQgd2lsbAorICogcmV0dXJuIDEuICBJZiBub3QgYWxsIHRoZSBjb2xvciBlbnRyaWVzIHdlcmUgc2V0IGV4YWN0bHkgYXMgZ2l2ZW4sCisgKiBpdCB3aWxsIHJldHVybiAwLCBhbmQgeW91IHNob3VsZCBsb29rIGF0IHRoZSBzdXJmYWNlIHBhbGV0dGUgdG8KKyAqIGRldGVybWluZSB0aGUgYWN0dWFsIGNvbG9yIHBhbGV0dGUuCisgKgorICogV2hlbiAnc3VyZmFjZScgaXMgdGhlIHN1cmZhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGRpc3BsYXksIHRoZQorICogZGlzcGxheSBjb2xvcm1hcCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIGNvbG9ycy4gIElmIAorICogU0RMX0hXUEFMRVRURSB3YXMgc2V0IGluIFNETF9TZXRWaWRlb01vZGUoKSBmbGFncywgU0RMX1NldENvbG9ycygpCisgKiB3aWxsIGFsd2F5cyByZXR1cm4gMSwgYW5kIHRoZSBwYWxldHRlIGlzIGd1YXJhbnRlZWQgdG8gYmUgc2V0IHRoZSB3YXkKKyAqIHlvdSBkZXNpcmUsIGV2ZW4gaWYgdGhlIHdpbmRvdyBjb2xvcm1hcCBoYXMgdG8gYmUgd2FycGVkIG9yIHJ1biB1bmRlcgorICogZW11bGF0aW9uLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NldENvbG9ycyhTRExfU3VyZmFjZSAqc3VyZmFjZSwgCisJCQlTRExfQ29sb3IgKmNvbG9ycywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzKTsKKworLyoqCisgKiBTZXRzIGEgcG9ydGlvbiBvZiB0aGUgY29sb3JtYXAgZm9yIGEgZ2l2ZW4gOC1iaXQgc3VyZmFjZS4KKyAqICdmbGFncycgaXMgb25lIG9yIGJvdGggb2Y6CisgKiBTRExfTE9HUEFMICAtLSBzZXQgbG9naWNhbCBwYWxldHRlLCB3aGljaCBjb250cm9scyBob3cgYmxpdHMgYXJlIG1hcHBlZAorICogICAgICAgICAgICAgICAgdG8vZnJvbSB0aGUgc3VyZmFjZSwKKyAqIFNETF9QSFlTUEFMIC0tIHNldCBwaHlzaWNhbCBwYWxldHRlLCB3aGljaCBjb250cm9scyBob3cgcGl4ZWxzIGxvb2sgb24KKyAqICAgICAgICAgICAgICAgIHRoZSBzY3JlZW4KKyAqIE9ubHkgc2NyZWVucyBoYXZlIHBoeXNpY2FsIHBhbGV0dGVzLiBTZXBhcmF0ZSBjaGFuZ2Ugb2YgcGh5c2ljYWwvbG9naWNhbAorICogcGFsZXR0ZXMgaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgc2NyZWVuIGhhcyBTRExfSFdQQUxFVFRFIHNldC4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIDEgaWYgYWxsIGNvbG91cnMgY291bGQgYmUgc2V0IGFzIHJlcXVlc3RlZCwgYW5kIDAKKyAqIG90aGVyd2lzZS4KKyAqCisgKiBTRExfU2V0Q29sb3JzKCkgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aAorICogICAgIGZsYWdzID0gKFNETF9MT0dQQUx8U0RMX1BIWVNQQUwpLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NldFBhbGV0dGUoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCBmbGFncywKKwkJCQkgICBTRExfQ29sb3IgKmNvbG9ycywgaW50IGZpcnN0Y29sb3IsCisJCQkJICAgaW50IG5jb2xvcnMpOworCisvKioKKyAqIE1hcHMgYW4gUkdCIHRyaXBsZSB0byBhbiBvcGFxdWUgcGl4ZWwgdmFsdWUgZm9yIGEgZ2l2ZW4gcGl4ZWwgZm9ybWF0CisgKi8KK2V4dGVybiBERUNMU1BFQyBVaW50MzIgU0RMQ0FMTCBTRExfTWFwUkdCCisoY29uc3QgU0RMX1BpeGVsRm9ybWF0ICogY29uc3QgZm9ybWF0LAorIGNvbnN0IFVpbnQ4IHIsIGNvbnN0IFVpbnQ4IGcsIGNvbnN0IFVpbnQ4IGIpOworCisvKioKKyAqIE1hcHMgYW4gUkdCQSBxdWFkcnVwbGUgdG8gYSBwaXhlbCB2YWx1ZSBmb3IgYSBnaXZlbiBwaXhlbCBmb3JtYXQKKyAqLworZXh0ZXJuIERFQ0xTUEVDIFVpbnQzMiBTRExDQUxMIFNETF9NYXBSR0JBCisoY29uc3QgU0RMX1BpeGVsRm9ybWF0ICogY29uc3QgZm9ybWF0LAorIGNvbnN0IFVpbnQ4IHIsIGNvbnN0IFVpbnQ4IGcsIGNvbnN0IFVpbnQ4IGIsIGNvbnN0IFVpbnQ4IGEpOworCisvKioKKyAqIE1hcHMgYSBwaXhlbCB2YWx1ZSBpbnRvIHRoZSBSR0IgY29tcG9uZW50cyBmb3IgYSBnaXZlbiBwaXhlbCBmb3JtYXQKKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfR2V0UkdCKFVpbnQzMiBwaXhlbCwKKwkJCQljb25zdCBTRExfUGl4ZWxGb3JtYXQgKiBjb25zdCBmbXQsCisJCQkJVWludDggKnIsIFVpbnQ4ICpnLCBVaW50OCAqYik7CisKKy8qKgorICogTWFwcyBhIHBpeGVsIHZhbHVlIGludG8gdGhlIFJHQkEgY29tcG9uZW50cyBmb3IgYSBnaXZlbiBwaXhlbCBmb3JtYXQKKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfR2V0UkdCQShVaW50MzIgcGl4ZWwsCisJCQkJY29uc3QgU0RMX1BpeGVsRm9ybWF0ICogY29uc3QgZm10LAorCQkJCVVpbnQ4ICpyLCBVaW50OCAqZywgVWludDggKmIsIFVpbnQ4ICphKTsKKworLyoqIEBzYSBTRExfQ3JlYXRlUkdCU3VyZmFjZSAqLworI2RlZmluZSBTRExfQWxsb2NTdXJmYWNlICAgIFNETF9DcmVhdGVSR0JTdXJmYWNlCisvKioKKyAqIEFsbG9jYXRlIGFuZCBmcmVlIGFuIFJHQiBzdXJmYWNlIChtdXN0IGJlIGNhbGxlZCBhZnRlciBTRExfU2V0VmlkZW9Nb2RlKQorICogSWYgdGhlIGRlcHRoIGlzIDQgb3IgOCBiaXRzLCBhbiBlbXB0eSBwYWxldHRlIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHN1cmZhY2UuCisgKiBJZiB0aGUgZGVwdGggaXMgZ3JlYXRlciB0aGFuIDggYml0cywgdGhlIHBpeGVsIGZvcm1hdCBpcyBzZXQgdXNpbmcgdGhlCisgKiBmbGFncyAnW1JHQl1tYXNrJy4KKyAqIElmIHRoZSBmdW5jdGlvbiBydW5zIG91dCBvZiBtZW1vcnksIGl0IHdpbGwgcmV0dXJuIE5VTEwuCisgKgorICogVGhlICdmbGFncycgdGVsbCB3aGF0IGtpbmQgb2Ygc3VyZmFjZSB0byBjcmVhdGUuCisgKiBTRExfU1dTVVJGQUNFIG1lYW5zIHRoYXQgdGhlIHN1cmZhY2Ugc2hvdWxkIGJlIGNyZWF0ZWQgaW4gc3lzdGVtIG1lbW9yeS4KKyAqIFNETF9IV1NVUkZBQ0UgbWVhbnMgdGhhdCB0aGUgc3VyZmFjZSBzaG91bGQgYmUgY3JlYXRlZCBpbiB2aWRlbyBtZW1vcnksCisgKiB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgZGlzcGxheSBzdXJmYWNlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHN1cmZhY2VzCisgKiB0aGF0IHdpbGwgbm90IGNoYW5nZSBtdWNoLCB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXJkd2FyZSBhY2NlbGVyYXRpb24KKyAqIHdoZW4gYmVpbmcgYmxpdHRlZCB0byB0aGUgZGlzcGxheSBzdXJmYWNlLgorICogU0RMX0FTWU5DQkxJVCBtZWFucyB0aGF0IFNETCB3aWxsIHRyeSB0byBwZXJmb3JtIGFzeW5jaHJvbm91cyBibGl0cyB3aXRoCisgKiB0aGlzIHN1cmZhY2UsIGJ1dCB5b3UgbXVzdCBhbHdheXMgbG9jayBpdCBiZWZvcmUgYWNjZXNzaW5nIHRoZSBwaXhlbHMuCisgKiBTREwgd2lsbCB3YWl0IGZvciBjdXJyZW50IGJsaXRzIHRvIGZpbmlzaCBiZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIGxvY2suCisgKiBTRExfU1JDQ09MT1JLRVkgaW5kaWNhdGVzIHRoYXQgdGhlIHN1cmZhY2Ugd2lsbCBiZSB1c2VkIGZvciBjb2xvcmtleSBibGl0cy4KKyAqIElmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBhY2NlbGVyYXRpb24gb2YgY29sb3JrZXkgYmxpdHMgYmV0d2VlbgorICogdHdvIHN1cmZhY2VzIGluIHZpZGVvIG1lbW9yeSwgU0RMIHdpbGwgdHJ5IHRvIHBsYWNlIHRoZSBzdXJmYWNlIGluCisgKiB2aWRlbyBtZW1vcnkuIElmIHRoaXMgaXNuJ3QgcG9zc2libGUgb3IgaWYgdGhlcmUgaXMgbm8gaGFyZHdhcmUKKyAqIGFjY2VsZXJhdGlvbiBhdmFpbGFibGUsIHRoZSBzdXJmYWNlIHdpbGwgYmUgcGxhY2VkIGluIHN5c3RlbSBtZW1vcnkuCisgKiBTRExfU1JDQUxQSEEgbWVhbnMgdGhhdCB0aGUgc3VyZmFjZSB3aWxsIGJlIHVzZWQgZm9yIGFscGhhIGJsaXRzIGFuZCAKKyAqIGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gb2YgYWxwaGEgYmxpdHMgYmV0d2VlbgorICogdHdvIHN1cmZhY2VzIGluIHZpZGVvIG1lbW9yeSwgdG8gcGxhY2UgdGhlIHN1cmZhY2UgaW4gdmlkZW8gbWVtb3J5CisgKiBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgcGxhY2VkIGluIHN5c3RlbSBtZW1vcnkuCisgKiBJZiB0aGUgc3VyZmFjZSBpcyBjcmVhdGVkIGluIHZpZGVvIG1lbW9yeSwgYmxpdHMgd2lsbCBiZSBfbXVjaF8gZmFzdGVyLAorICogYnV0IHRoZSBzdXJmYWNlIGZvcm1hdCBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgdmlkZW8gc3VyZmFjZSBmb3JtYXQsCisgKiBhbmQgdGhlIG9ubHkgd2F5IHRvIGFjY2VzcyB0aGUgcGl4ZWxzIG1lbWJlciBvZiB0aGUgc3VyZmFjZSBpcyB0byB1c2UKKyAqIHRoZSBTRExfTG9ja1N1cmZhY2UoKSBhbmQgU0RMX1VubG9ja1N1cmZhY2UoKSBjYWxscy4KKyAqIElmIHRoZSByZXF1ZXN0ZWQgc3VyZmFjZSBhY3R1YWxseSByZXNpZGVzIGluIHZpZGVvIG1lbW9yeSwgU0RMX0hXU1VSRkFDRQorICogd2lsbCBiZSBzZXQgaW4gdGhlIGZsYWdzIG1lbWJlciBvZiB0aGUgcmV0dXJuZWQgc3VyZmFjZS4gIElmIGZvciBzb21lCisgKiByZWFzb24gdGhlIHN1cmZhY2UgY291bGQgbm90IGJlIHBsYWNlZCBpbiB2aWRlbyBtZW1vcnksIGl0IHdpbGwgbm90IGhhdmUKKyAqIHRoZSBTRExfSFdTVVJGQUNFIGZsYWcgc2V0LCBhbmQgd2lsbCBiZSBjcmVhdGVkIGluIHN5c3RlbSBtZW1vcnkgaW5zdGVhZC4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9TdXJmYWNlICogU0RMQ0FMTCBTRExfQ3JlYXRlUkdCU3VyZmFjZQorCQkJKFVpbnQzMiBmbGFncywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIAorCQkJVWludDMyIFJtYXNrLCBVaW50MzIgR21hc2ssIFVpbnQzMiBCbWFzaywgVWludDMyIEFtYXNrKTsKKy8qKiBAc2EgU0RMX0NyZWF0ZVJHQlN1cmZhY2UgKi8KK2V4dGVybiBERUNMU1BFQyBTRExfU3VyZmFjZSAqIFNETENBTEwgU0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tKHZvaWQgKnBpeGVscywKKwkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGl0Y2gsCisJCQlVaW50MzIgUm1hc2ssIFVpbnQzMiBHbWFzaywgVWludDMyIEJtYXNrLCBVaW50MzIgQW1hc2spOworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRnJlZVN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKioKKyAqIFNETF9Mb2NrU3VyZmFjZSgpIHNldHMgdXAgYSBzdXJmYWNlIGZvciBkaXJlY3RseSBhY2Nlc3NpbmcgdGhlIHBpeGVscy4KKyAqIEJldHdlZW4gY2FsbHMgdG8gU0RMX0xvY2tTdXJmYWNlKCkvU0RMX1VubG9ja1N1cmZhY2UoKSwgeW91IGNhbiB3cml0ZQorICogdG8gYW5kIHJlYWQgZnJvbSAnc3VyZmFjZS0+cGl4ZWxzJywgdXNpbmcgdGhlIHBpeGVsIGZvcm1hdCBzdG9yZWQgaW4gCisgKiAnc3VyZmFjZS0+Zm9ybWF0Jy4gIE9uY2UgeW91IGFyZSBkb25lIGFjY2Vzc2luZyB0aGUgc3VyZmFjZSwgeW91IHNob3VsZCAKKyAqIHVzZSBTRExfVW5sb2NrU3VyZmFjZSgpIHRvIHJlbGVhc2UgaXQuCisgKgorICogTm90IGFsbCBzdXJmYWNlcyByZXF1aXJlIGxvY2tpbmcuICBJZiBTRExfTVVTVExPQ0soc3VyZmFjZSkgZXZhbHVhdGVzCisgKiB0byAwLCB0aGVuIHlvdSBjYW4gcmVhZCBhbmQgd3JpdGUgdG8gdGhlIHN1cmZhY2UgYXQgYW55IHRpbWUsIGFuZCB0aGUKKyAqIHBpeGVsIGZvcm1hdCBvZiB0aGUgc3VyZmFjZSB3aWxsIG5vdCBjaGFuZ2UuICBJbiBwYXJ0aWN1bGFyLCBpZiB0aGUKKyAqIFNETF9IV1NVUkZBQ0UgZmxhZyBpcyBub3QgZ2l2ZW4gd2hlbiBjYWxsaW5nIFNETF9TZXRWaWRlb01vZGUoKSwgeW91CisgKiB3aWxsIG5vdCBuZWVkIHRvIGxvY2sgdGhlIGRpc3BsYXkgc3VyZmFjZSBiZWZvcmUgYWNjZXNzaW5nIGl0LgorICogCisgKiBObyBvcGVyYXRpbmcgc3lzdGVtIG9yIGxpYnJhcnkgY2FsbHMgc2hvdWxkIGJlIG1hZGUgYmV0d2VlbiBsb2NrL3VubG9jaworICogcGFpcnMsIGFzIGNyaXRpY2FsIHN5c3RlbSBsb2NrcyBtYXkgYmUgaGVsZCBkdXJpbmcgdGhpcyB0aW1lLgorICoKKyAqIFNETF9Mb2NrU3VyZmFjZSgpIHJldHVybnMgMCwgb3IgLTEgaWYgdGhlIHN1cmZhY2UgY291bGRuJ3QgYmUgbG9ja2VkLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0xvY2tTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX1VubG9ja1N1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKioKKyAqIExvYWQgYSBzdXJmYWNlIGZyb20gYSBzZWVrYWJsZSBTREwgZGF0YSBzb3VyY2UgKG1lbW9yeSBvciBmaWxlLikKKyAqIElmICdmcmVlc3JjJyBpcyBub24temVybywgdGhlIHNvdXJjZSB3aWxsIGJlIGNsb3NlZCBhZnRlciBiZWluZyByZWFkLgorICogUmV0dXJucyB0aGUgbmV3IHN1cmZhY2UsIG9yIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorICogVGhlIG5ldyBzdXJmYWNlIHNob3VsZCBiZSBmcmVlZCB3aXRoIFNETF9GcmVlU3VyZmFjZSgpLgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX1N1cmZhY2UgKiBTRExDQUxMIFNETF9Mb2FkQk1QX1JXKFNETF9SV29wcyAqc3JjLCBpbnQgZnJlZXNyYyk7CisKKy8qKiBDb252ZW5pZW5jZSBtYWNybyAtLSBsb2FkIGEgc3VyZmFjZSBmcm9tIGEgZmlsZSAqLworI2RlZmluZSBTRExfTG9hZEJNUChmaWxlKQlTRExfTG9hZEJNUF9SVyhTRExfUldGcm9tRmlsZShmaWxlLCAicmIiKSwgMSkKKworLyoqCisgKiBTYXZlIGEgc3VyZmFjZSB0byBhIHNlZWthYmxlIFNETCBkYXRhIHNvdXJjZSAobWVtb3J5IG9yIGZpbGUuKQorICogSWYgJ2ZyZWVkc3QnIGlzIG5vbi16ZXJvLCB0aGUgc291cmNlIHdpbGwgYmUgY2xvc2VkIGFmdGVyIGJlaW5nIHdyaXR0ZW4uCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCBvciAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCisgKi8KK2V4dGVybiBERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfU2F2ZUJNUF9SVworCQkoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFNETF9SV29wcyAqZHN0LCBpbnQgZnJlZWRzdCk7CisKKy8qKiBDb252ZW5pZW5jZSBtYWNybyAtLSBzYXZlIGEgc3VyZmFjZSB0byBhIGZpbGUgKi8KKyNkZWZpbmUgU0RMX1NhdmVCTVAoc3VyZmFjZSwgZmlsZSkgXAorCQlTRExfU2F2ZUJNUF9SVyhzdXJmYWNlLCBTRExfUldGcm9tRmlsZShmaWxlLCAid2IiKSwgMSkKKworLyoqCisgKiBTZXRzIHRoZSBjb2xvciBrZXkgKHRyYW5zcGFyZW50IHBpeGVsKSBpbiBhIGJsaXR0YWJsZSBzdXJmYWNlLgorICogSWYgJ2ZsYWcnIGlzIFNETF9TUkNDT0xPUktFWSAob3B0aW9uYWxseSBPUidkIHdpdGggU0RMX1JMRUFDQ0VMKSwgCisgKiAna2V5JyB3aWxsIGJlIHRoZSB0cmFuc3BhcmVudCBwaXhlbCBpbiB0aGUgc291cmNlIGltYWdlIG9mIGEgYmxpdC4KKyAqIFNETF9STEVBQ0NFTCByZXF1ZXN0cyBSTEUgYWNjZWxlcmF0aW9uIGZvciB0aGUgc3VyZmFjZSBpZiBwcmVzZW50LAorICogYW5kIHJlbW92ZXMgUkxFIGFjY2VsZXJhdGlvbiBpZiBhYnNlbnQuCisgKiBJZiAnZmxhZycgaXMgMCwgdGhpcyBmdW5jdGlvbiBjbGVhcnMgYW55IGN1cnJlbnQgY29sb3Iga2V5LgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZXRDb2xvcktleQorCQkJKFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIgZmxhZywgVWludDMyIGtleSk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBhbHBoYSB2YWx1ZSBmb3IgdGhlIGVudGlyZSBzdXJmYWNlLCBhcyBvcHBvc2VkIHRvCisgKiB1c2luZyB0aGUgYWxwaGEgY29tcG9uZW50IG9mIGVhY2ggcGl4ZWwuIFRoaXMgdmFsdWUgbWVhc3VyZXMgdGhlIHJhbmdlCisgKiBvZiB0cmFuc3BhcmVuY3kgb2YgdGhlIHN1cmZhY2UsIDAgYmVpbmcgY29tcGxldGVseSB0cmFuc3BhcmVudCB0byAyNTUKKyAqIGJlaW5nIGNvbXBsZXRlbHkgb3BhcXVlLiBBbiAnYWxwaGEnIHZhbHVlIG9mIDI1NSBjYXVzZXMgYmxpdHMgdG8gYmUKKyAqIG9wYXF1ZSwgdGhlIHNvdXJjZSBwaXhlbHMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiAodGhlIGRlZmF1bHQpLiBOb3RlCisgKiB0aGF0IHBlci1zdXJmYWNlIGFscGhhIGNhbiBiZSBjb21iaW5lZCB3aXRoIGNvbG9ya2V5IHRyYW5zcGFyZW5jeS4KKyAqCisgKiBJZiAnZmxhZycgaXMgMCwgYWxwaGEgYmxlbmRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBzdXJmYWNlLgorICogSWYgJ2ZsYWcnIGlzIFNETF9TUkNBTFBIQSwgYWxwaGEgYmxlbmRpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIHN1cmZhY2UuCisgKiBPUjppbmcgdGhlIGZsYWcgd2l0aCBTRExfUkxFQUNDRUwgcmVxdWVzdHMgUkxFIGFjY2VsZXJhdGlvbiBmb3IgdGhlCisgKiBzdXJmYWNlOyBpZiBTRExfUkxFQUNDRUwgaXMgbm90IHNwZWNpZmllZCwgdGhlIFJMRSBhY2NlbCB3aWxsIGJlIHJlbW92ZWQuCisgKgorICogVGhlICdhbHBoYScgcGFyYW1ldGVyIGlzIGlnbm9yZWQgZm9yIHN1cmZhY2VzIHRoYXQgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1NldEFscGhhKFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIgZmxhZywgVWludDggYWxwaGEpOworCisvKioKKyAqIFNldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBmb3IgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UgaW4gYSBibGl0LgorICoKKyAqIElmIHRoZSBjbGlwIHJlY3RhbmdsZSBpcyBOVUxMLCBjbGlwcGluZyB3aWxsIGJlIGRpc2FibGVkLgorICogSWYgdGhlIGNsaXAgcmVjdGFuZ2xlIGRvZXNuJ3QgaW50ZXJzZWN0IHRoZSBzdXJmYWNlLCB0aGUgZnVuY3Rpb24gd2lsbAorICogcmV0dXJuIFNETF9GQUxTRSBhbmQgYmxpdHMgd2lsbCBiZSBjb21wbGV0ZWx5IGNsaXBwZWQuICBPdGhlcndpc2UgdGhlCisgKiBmdW5jdGlvbiByZXR1cm5zIFNETF9UUlVFIGFuZCBibGl0cyB0byB0aGUgc3VyZmFjZSB3aWxsIGJlIGNsaXBwZWQgdG8KKyAqIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHN1cmZhY2UgYXJlYSBhbmQgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZS4KKyAqCisgKiBOb3RlIHRoYXQgYmxpdHMgYXJlIGF1dG9tYXRpY2FsbHkgY2xpcHBlZCB0byB0aGUgZWRnZXMgb2YgdGhlIHNvdXJjZQorICogYW5kIGRlc3RpbmF0aW9uIHN1cmZhY2VzLgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX2Jvb2wgU0RMQ0FMTCBTRExfU2V0Q2xpcFJlY3QoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGNvbnN0IFNETF9SZWN0ICpyZWN0KTsKKworLyoqCisgKiBHZXRzIHRoZSBjbGlwcGluZyByZWN0YW5nbGUgZm9yIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlIGluIGEgYmxpdC4KKyAqICdyZWN0JyBtdXN0IGJlIGEgcG9pbnRlciB0byBhIHZhbGlkIHJlY3RhbmdsZSB3aGljaCB3aWxsIGJlIGZpbGxlZAorICogd2l0aCB0aGUgY29ycmVjdCB2YWx1ZXMuCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0dldENsaXBSZWN0KFNETF9TdXJmYWNlICpzdXJmYWNlLCBTRExfUmVjdCAqcmVjdCk7CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBzdXJmYWNlIG9mIHRoZSBzcGVjaWZpZWQgZm9ybWF0LCBhbmQgdGhlbiBjb3BpZXMgYW5kIG1hcHMgCisgKiB0aGUgZ2l2ZW4gc3VyZmFjZSB0byBpdCBzbyB0aGUgYmxpdCBvZiB0aGUgY29udmVydGVkIHN1cmZhY2Ugd2lsbCBiZSBhcyAKKyAqIGZhc3QgYXMgcG9zc2libGUuICBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCBpdCByZXR1cm5zIE5VTEwuCisgKgorICogVGhlICdmbGFncycgcGFyYW1ldGVyIGlzIHBhc3NlZCB0byBTRExfQ3JlYXRlUkdCU3VyZmFjZSgpIGFuZCBoYXMgdGhvc2UgCisgKiBzZW1hbnRpY3MuICBZb3UgY2FuIGFsc28gcGFzcyBTRExfUkxFQUNDRUwgaW4gdGhlIGZsYWdzIHBhcmFtZXRlciBhbmQKKyAqIFNETCB3aWxsIHRyeSB0byBSTEUgYWNjZWxlcmF0ZSBjb2xvcmtleSBhbmQgYWxwaGEgYmxpdHMgaW4gdGhlIHJlc3VsdGluZworICogc3VyZmFjZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWxseSBieSBTRExfRGlzcGxheUZvcm1hdCgpLgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX1N1cmZhY2UgKiBTRExDQUxMIFNETF9Db252ZXJ0U3VyZmFjZQorCQkJKFNETF9TdXJmYWNlICpzcmMsIFNETF9QaXhlbEZvcm1hdCAqZm10LCBVaW50MzIgZmxhZ3MpOworCisvKioKKyAqIFRoaXMgcGVyZm9ybXMgYSBmYXN0IGJsaXQgZnJvbSB0aGUgc291cmNlIHN1cmZhY2UgdG8gdGhlIGRlc3RpbmF0aW9uCisgKiBzdXJmYWNlLiAgSXQgYXNzdW1lcyB0aGF0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlY3RhbmdsZXMgYXJlCisgKiB0aGUgc2FtZSBzaXplLiAgSWYgZWl0aGVyICdzcmNyZWN0JyBvciAnZHN0cmVjdCcgYXJlIE5VTEwsIHRoZSBlbnRpcmUKKyAqIHN1cmZhY2UgKHNyYyBvciBkc3QpIGlzIGNvcGllZC4gIFRoZSBmaW5hbCBibGl0IHJlY3RhbmdsZXMgYXJlIHNhdmVkCisgKiBpbiAnc3JjcmVjdCcgYW5kICdkc3RyZWN0JyBhZnRlciBhbGwgY2xpcHBpbmcgaXMgcGVyZm9ybWVkLgorICogSWYgdGhlIGJsaXQgaXMgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyAwLCBvdGhlcndpc2UgaXQgcmV0dXJucyAtMS4KKyAqCisgKiBUaGUgYmxpdCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBhIGxvY2tlZCBzdXJmYWNlLgorICoKKyAqIFRoZSBibGl0IHNlbWFudGljcyBmb3Igc3VyZmFjZXMgd2l0aCBhbmQgd2l0aG91dCBhbHBoYSBhbmQgY29sb3JrZXkKKyAqIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKgorICogUkdCQS0+UkdCOgorICogICAgIFNETF9TUkNBTFBIQSBzZXQ6CisgKiAJYWxwaGEtYmxlbmQgKHVzaW5nIGFscGhhLWNoYW5uZWwpLgorICogCVNETF9TUkNDT0xPUktFWSBpZ25vcmVkLgorICogICAgIFNETF9TUkNBTFBIQSBub3Qgc2V0OgorICogCWNvcHkgUkdCLgorICogCWlmIFNETF9TUkNDT0xPUktFWSBzZXQsIG9ubHkgY29weSB0aGUgcGl4ZWxzIG1hdGNoaW5nIHRoZQorICogCVJHQiB2YWx1ZXMgb2YgdGhlIHNvdXJjZSBjb2xvdXIga2V5LCBpZ25vcmluZyBhbHBoYSBpbiB0aGUKKyAqIAljb21wYXJpc29uLgorICogCisgKiBSR0ItPlJHQkE6CisgKiAgICAgU0RMX1NSQ0FMUEhBIHNldDoKKyAqIAlhbHBoYS1ibGVuZCAodXNpbmcgdGhlIHNvdXJjZSBwZXItc3VyZmFjZSBhbHBoYSB2YWx1ZSk7CisgKiAJc2V0IGRlc3RpbmF0aW9uIGFscGhhIHRvIG9wYXF1ZS4KKyAqICAgICBTRExfU1JDQUxQSEEgbm90IHNldDoKKyAqIAljb3B5IFJHQiwgc2V0IGRlc3RpbmF0aW9uIGFscGhhIHRvIHNvdXJjZSBwZXItc3VyZmFjZSBhbHBoYSB2YWx1ZS4KKyAqICAgICBib3RoOgorICogCWlmIFNETF9TUkNDT0xPUktFWSBzZXQsIG9ubHkgY29weSB0aGUgcGl4ZWxzIG1hdGNoaW5nIHRoZQorICogCXNvdXJjZSBjb2xvdXIga2V5LgorICogCisgKiBSR0JBLT5SR0JBOgorICogICAgIFNETF9TUkNBTFBIQSBzZXQ6CisgKiAJYWxwaGEtYmxlbmQgKHVzaW5nIHRoZSBzb3VyY2UgYWxwaGEgY2hhbm5lbCkgdGhlIFJHQiB2YWx1ZXM7CisgKiAJbGVhdmUgZGVzdGluYXRpb24gYWxwaGEgdW50b3VjaGVkLiBbTm90ZTogaXMgdGhpcyBjb3JyZWN0P10KKyAqIAlTRExfU1JDQ09MT1JLRVkgaWdub3JlZC4KKyAqICAgICBTRExfU1JDQUxQSEEgbm90IHNldDoKKyAqIAljb3B5IGFsbCBvZiBSR0JBIHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAqIAlpZiBTRExfU1JDQ09MT1JLRVkgc2V0LCBvbmx5IGNvcHkgdGhlIHBpeGVscyBtYXRjaGluZyB0aGUKKyAqIAlSR0IgdmFsdWVzIG9mIHRoZSBzb3VyY2UgY29sb3VyIGtleSwgaWdub3JpbmcgYWxwaGEgaW4gdGhlCisgKiAJY29tcGFyaXNvbi4KKyAqIAorICogUkdCLT5SR0I6IAorICogICAgIFNETF9TUkNBTFBIQSBzZXQ6CisgKiAJYWxwaGEtYmxlbmQgKHVzaW5nIHRoZSBzb3VyY2UgcGVyLXN1cmZhY2UgYWxwaGEgdmFsdWUpLgorICogICAgIFNETF9TUkNBTFBIQSBub3Qgc2V0OgorICogCWNvcHkgUkdCLgorICogICAgIGJvdGg6CisgKiAJaWYgU0RMX1NSQ0NPTE9SS0VZIHNldCwgb25seSBjb3B5IHRoZSBwaXhlbHMgbWF0Y2hpbmcgdGhlCisgKiAJc291cmNlIGNvbG91ciBrZXkuCisgKgorICogSWYgZWl0aGVyIG9mIHRoZSBzdXJmYWNlcyB3ZXJlIGluIHZpZGVvIG1lbW9yeSwgYW5kIHRoZSBibGl0IHJldHVybnMgLTIsCisgKiB0aGUgdmlkZW8gbWVtb3J5IHdhcyBsb3N0LCBzbyBpdCBzaG91bGQgYmUgcmVsb2FkZWQgd2l0aCBhcnR3b3JrIGFuZCAKKyAqIHJlLWJsaXR0ZWQ6CisgKiBAY29kZQorICoJd2hpbGUgKCBTRExfQmxpdFN1cmZhY2UoaW1hZ2UsIGltZ3JlY3QsIHNjcmVlbiwgZHN0cmVjdCkgPT0gLTIgKSB7CisgKgkJd2hpbGUgKCBTRExfTG9ja1N1cmZhY2UoaW1hZ2UpIDwgMCApCisgKgkJCVNsZWVwKDEwKTsKKyAqCQktLSBXcml0ZSBpbWFnZSBwaXhlbHMgdG8gaW1hZ2UtPnBpeGVscyAtLQorICoJCVNETF9VbmxvY2tTdXJmYWNlKGltYWdlKTsKKyAqCX0KKyAqIEBlbmRjb2RlCisgKgorICogVGhpcyBoYXBwZW5zIHVuZGVyIERpcmVjdFggNS4wIHdoZW4gdGhlIHN5c3RlbSBzd2l0Y2hlcyBhd2F5IGZyb20geW91cgorICogZnVsbHNjcmVlbiBhcHBsaWNhdGlvbi4gIFRoZSBsb2NrIHdpbGwgYWxzbyBmYWlsIHVudGlsIHlvdSBoYXZlIGFjY2VzcworICogdG8gdGhlIHZpZGVvIG1lbW9yeSBhZ2Fpbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGNhbGwgU0RMX0JsaXRTdXJmYWNlKCkgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkgaG93IFNETAorICogYmxpdHRpbmcgd29ya3MgaW50ZXJuYWxseSBhbmQgaG93IHRvIHVzZSB0aGUgb3RoZXIgYmxpdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgU0RMX0JsaXRTdXJmYWNlIFNETF9VcHBlckJsaXQKKworLyoqIFRoaXMgaXMgdGhlIHB1YmxpYyBibGl0IGZ1bmN0aW9uLCBTRExfQmxpdFN1cmZhY2UoKSwgYW5kIGl0IHBlcmZvcm1zCisgKiAgcmVjdGFuZ2xlIHZhbGlkYXRpb24gYW5kIGNsaXBwaW5nIGJlZm9yZSBwYXNzaW5nIGl0IHRvIFNETF9Mb3dlckJsaXQoKQorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1VwcGVyQmxpdAorCQkJKFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAorCQkJIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KTsKKy8qKiBUaGlzIGlzIGEgc2VtaS1wcml2YXRlIGJsaXQgZnVuY3Rpb24gYW5kIGl0IHBlcmZvcm1zIGxvdy1sZXZlbCBzdXJmYWNlCisgKiAgYmxpdHRpbmcgb25seS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Mb3dlckJsaXQKKwkJCShTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKwkJCSBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGZhc3QgZmlsbCBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIHdpdGggJ2NvbG9yJworICogVGhlIGdpdmVuIHJlY3RhbmdsZSBpcyBjbGlwcGVkIHRvIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlIGNsaXAgYXJlYQorICogYW5kIHRoZSBmaW5hbCBmaWxsIHJlY3RhbmdsZSBpcyBzYXZlZCBpbiB0aGUgcGFzc2VkIGluIHBvaW50ZXIuCisgKiBJZiAnZHN0cmVjdCcgaXMgTlVMTCwgdGhlIHdob2xlIHN1cmZhY2Ugd2lsbCBiZSBmaWxsZWQgd2l0aCAnY29sb3InCisgKiBUaGUgY29sb3Igc2hvdWxkIGJlIGEgcGl4ZWwgb2YgdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBzdXJmYWNlLCBhbmQgCisgKiBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBTRExfTWFwUkdCKCkgZnVuY3Rpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBlcnJvci4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9GaWxsUmVjdAorCQkoU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QsIFVpbnQzMiBjb2xvcik7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHN1cmZhY2UgYW5kIGNvcGllcyBpdCB0byBhIG5ldyBzdXJmYWNlIG9mIHRoZQorICogcGl4ZWwgZm9ybWF0IGFuZCBjb2xvcnMgb2YgdGhlIHZpZGVvIGZyYW1lYnVmZmVyLCBzdWl0YWJsZSBmb3IgZmFzdAorICogYmxpdHRpbmcgb250byB0aGUgZGlzcGxheSBzdXJmYWNlLiAgSXQgY2FsbHMgU0RMX0NvbnZlcnRTdXJmYWNlKCkKKyAqCisgKiBJZiB5b3Ugd2FudCB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXJkd2FyZSBjb2xvcmtleSBvciBhbHBoYSBibGl0CisgKiBhY2NlbGVyYXRpb24sIHlvdSBzaG91bGQgc2V0IHRoZSBjb2xvcmtleSBhbmQgYWxwaGEgdmFsdWUgYmVmb3JlCisgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMgb3IgcnVucyBvdXQgb2YgbWVtb3J5LCBpdCByZXR1cm5zIE5VTEwKKyAqLworZXh0ZXJuIERFQ0xTUEVDIFNETF9TdXJmYWNlICogU0RMQ0FMTCBTRExfRGlzcGxheUZvcm1hdChTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHN1cmZhY2UgYW5kIGNvcGllcyBpdCB0byBhIG5ldyBzdXJmYWNlIG9mIHRoZQorICogcGl4ZWwgZm9ybWF0IGFuZCBjb2xvcnMgb2YgdGhlIHZpZGVvIGZyYW1lYnVmZmVyIChpZiBwb3NzaWJsZSksCisgKiBzdWl0YWJsZSBmb3IgZmFzdCBhbHBoYSBibGl0dGluZyBvbnRvIHRoZSBkaXNwbGF5IHN1cmZhY2UuCisgKiBUaGUgbmV3IHN1cmZhY2Ugd2lsbCBhbHdheXMgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLgorICoKKyAqIElmIHlvdSB3YW50IHRvIHRha2UgYWR2YW50YWdlIG9mIGhhcmR3YXJlIGNvbG9ya2V5IG9yIGFscGhhIGJsaXQKKyAqIGFjY2VsZXJhdGlvbiwgeW91IHNob3VsZCBzZXQgdGhlIGNvbG9ya2V5IGFuZCBhbHBoYSB2YWx1ZSBiZWZvcmUKKyAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBJZiB0aGUgY29udmVyc2lvbiBmYWlscyBvciBydW5zIG91dCBvZiBtZW1vcnksIGl0IHJldHVybnMgTlVMTAorICovCitleHRlcm4gREVDTFNQRUMgU0RMX1N1cmZhY2UgKiBTRExDQUxMIFNETF9EaXNwbGF5Rm9ybWF0QWxwaGEoU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKy8qKiBAbmFtZSBZVVYgdmlkZW8gc3VyZmFjZSBvdmVybGF5IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gLypAeyovCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisKKy8qKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSB2aWRlbyBvdXRwdXQgb3ZlcmxheQorICogIENhbGxpbmcgdGhlIHJldHVybmVkIHN1cmZhY2UgYW4gb3ZlcmxheSBpcyBzb21ldGhpbmcgb2YgYSBtaXNub21lciBiZWNhdXNlCisgKiAgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXNwbGF5IHN1cmZhY2UgdW5kZXJuZWF0aCB0aGUgYXJlYSB3aGVyZSB0aGUgb3ZlcmxheQorICogIGlzIHNob3duIGlzIHVuZGVmaW5lZCAtIGl0IG1heSBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBjb252ZXJ0ZWQgWVVWIGRhdGEuCisgKi8KK2V4dGVybiBERUNMU1BFQyBTRExfT3ZlcmxheSAqIFNETENBTEwgU0RMX0NyZWF0ZVlVVk92ZXJsYXkoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCVVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KTsKKworLyoqIExvY2sgYW4gb3ZlcmxheSBmb3IgZGlyZWN0IGFjY2VzcywgYW5kIHVubG9jayBpdCB3aGVuIHlvdSBhcmUgZG9uZSAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Mb2NrWVVWT3ZlcmxheShTRExfT3ZlcmxheSAqb3ZlcmxheSk7CitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9VbmxvY2tZVVZPdmVybGF5KFNETF9PdmVybGF5ICpvdmVybGF5KTsKKworLyoqIEJsaXQgYSB2aWRlbyBvdmVybGF5IHRvIHRoZSBkaXNwbGF5IHN1cmZhY2UuCisgKiAgVGhlIGNvbnRlbnRzIG9mIHRoZSB2aWRlbyBzdXJmYWNlIHVuZGVybmVhdGggdGhlIGJsaXQgZGVzdGluYXRpb24gYXJlCisgKiAgbm90IGRlZmluZWQuICAKKyAqICBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIG1heSBiZSBkaWZmZXJlbnQgZnJvbQorICogIHRoYXQgb2YgdGhlIG92ZXJsYXksIGJ1dCBjdXJyZW50bHkgb25seSAyeCBzY2FsaW5nIGlzIHN1cHBvcnRlZC4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9EaXNwbGF5WVVWT3ZlcmxheShTRExfT3ZlcmxheSAqb3ZlcmxheSwgU0RMX1JlY3QgKmRzdHJlY3QpOworCisvKiogRnJlZSBhIHZpZGVvIG92ZXJsYXkgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0ZyZWVZVVZPdmVybGF5KFNETF9PdmVybGF5ICpvdmVybGF5KTsKKworLypAfSovCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKy8qKiBAbmFtZSBPcGVuR0wgc3VwcG9ydCBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gLypAeyovCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisKKy8qKgorICogRHluYW1pY2FsbHkgbG9hZCBhbiBPcGVuR0wgbGlicmFyeSwgb3IgdGhlIGRlZmF1bHQgb25lIGlmIHBhdGggaXMgTlVMTAorICoKKyAqIElmIHlvdSBkbyB0aGlzLCB5b3UgbmVlZCB0byByZXRyaWV2ZSBhbGwgb2YgdGhlIEdMIGZ1bmN0aW9ucyB1c2VkIGluCisgKiB5b3VyIHByb2dyYW0gZnJvbSB0aGUgZHluYW1pYyBsaWJyYXJ5IHVzaW5nIFNETF9HTF9HZXRQcm9jQWRkcmVzcygpLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0dMX0xvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpOworCisvKioKKyAqIEdldCB0aGUgYWRkcmVzcyBvZiBhIEdMIGZ1bmN0aW9uCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkICogU0RMQ0FMTCBTRExfR0xfR2V0UHJvY0FkZHJlc3MoY29uc3QgY2hhciogcHJvYyk7CisKKy8qKgorICogU2V0IGFuIGF0dHJpYnV0ZSBvZiB0aGUgT3BlbkdMIHN1YnN5c3RlbSBiZWZvcmUgaW50aWFsaXphdGlvbi4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9HTF9TZXRBdHRyaWJ1dGUoU0RMX0dMYXR0ciBhdHRyLCBpbnQgdmFsdWUpOworCisvKioKKyAqIEdldCBhbiBhdHRyaWJ1dGUgb2YgdGhlIE9wZW5HTCBzdWJzeXN0ZW0gZnJvbSB0aGUgd2luZG93aW5nCisgKiBpbnRlcmZhY2UsIHN1Y2ggYXMgZ2xYLiBUaGlzIGlzIG9mIGNvdXJzZSBkaWZmZXJlbnQgZnJvbSBnZXR0aW5nCisgKiB0aGUgdmFsdWVzIGZyb20gU0RMJ3MgaW50ZXJuYWwgT3BlbkdMIHN1YnN5c3RlbSwgd2hpY2ggb25seQorICogc3RvcmVzIHRoZSB2YWx1ZXMgeW91IHJlcXVlc3QgYmVmb3JlIGluaXRpYWxpemF0aW9uLgorICoKKyAqIERldmVsb3BlcnMgc2hvdWxkIHRyYWNrIHRoZSB2YWx1ZXMgdGhleSBwYXNzIGludG8gU0RMX0dMX1NldEF0dHJpYnV0ZQorICogdGhlbXNlbHZlcyBpZiB0aGV5IHdhbnQgdG8gcmV0cmlldmUgdGhlc2UgdmFsdWVzLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0dMX0dldEF0dHJpYnV0ZShTRExfR0xhdHRyIGF0dHIsIGludCogdmFsdWUpOworCisvKioKKyAqIFN3YXAgdGhlIE9wZW5HTCBidWZmZXJzLCBpZiBkb3VibGUtYnVmZmVyaW5nIGlzIHN1cHBvcnRlZC4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfR0xfU3dhcEJ1ZmZlcnModm9pZCk7CisKKy8qKiBAbmFtZSBPcGVuR0wgSW50ZXJuYWwgRnVuY3Rpb25zCisgKiBJbnRlcm5hbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIGNhbGxlZCB1bmxlc3MgeW91IGhhdmUgcmVhZAorICogYW5kIHVuZGVyc3Rvb2QgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGVzZSBmdW5jdGlvbnMuCisgKi8KKy8qQHsqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfR0xfVXBkYXRlUmVjdHMoaW50IG51bXJlY3RzLCBTRExfUmVjdCogcmVjdHMpOworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfR0xfTG9jayh2b2lkKTsKK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETENBTEwgU0RMX0dMX1VubG9jayh2b2lkKTsKKy8qQH0qLworCisvKkB9Ki8KKworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLworLyoqIEBuYW1lIFdpbmRvdyBNYW5hZ2VyIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBpbnRlcmFjdGlvbiB3aXRoIHRoZSB3aW5kb3cgbWFuYWdlciwgaWYgYW55LiAgICAgICAqLyAvKkB7Ki8KKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKworLyoqCisgKiBTZXRzIHRoZSB0aXRsZSBhbmQgaWNvbiB0ZXh0IG9mIHRoZSBkaXNwbGF5IHdpbmRvdyAoVVRGLTggZW5jb2RlZCkKKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfV01fU2V0Q2FwdGlvbihjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7CisvKioKKyAqIEdldHMgdGhlIHRpdGxlIGFuZCBpY29uIHRleHQgb2YgdGhlIGRpc3BsYXkgd2luZG93IChVVEYtOCBlbmNvZGVkKQorICovCitleHRlcm4gREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9XTV9HZXRDYXB0aW9uKGNoYXIgKip0aXRsZSwgY2hhciAqKmljb24pOworCisvKioKKyAqIFNldHMgdGhlIGljb24gZm9yIHRoZSBkaXNwbGF5IHdpbmRvdy4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIFNETF9TZXRWaWRlb01vZGUoKS4KKyAqIEl0IHRha2VzIGFuIGljb24gc3VyZmFjZSwgYW5kIGEgbWFzayBpbiBNU0IgZm9ybWF0LgorICogSWYgJ21hc2snIGlzIE5VTEwsIHRoZSBlbnRpcmUgaWNvbiBzdXJmYWNlIHdpbGwgYmUgdXNlZCBhcyB0aGUgaWNvbi4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfV01fU2V0SWNvbihTRExfU3VyZmFjZSAqaWNvbiwgVWludDggKm1hc2spOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaWNvbmlmaWVzIHRoZSB3aW5kb3csIGFuZCByZXR1cm5zIDEgaWYgaXQgc3VjY2VlZGVkLgorICogSWYgdGhlIGZ1bmN0aW9uIHN1Y2NlZWRzLCBpdCBnZW5lcmF0ZXMgYW4gU0RMX0FQUEFDVElWRSBsb3NzIGV2ZW50LgorICogVGhpcyBmdW5jdGlvbiBpcyBhIG5vb3AgYW5kIHJldHVybnMgMCBpbiBub24td2luZG93ZWQgZW52aXJvbm1lbnRzLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1dNX0ljb25pZnlXaW5kb3codm9pZCk7CisKKy8qKgorICogVG9nZ2xlIGZ1bGxzY3JlZW4gbW9kZSB3aXRob3V0IGNoYW5naW5nIHRoZSBjb250ZW50cyBvZiB0aGUgc2NyZWVuLgorICogSWYgdGhlIGRpc3BsYXkgc3VyZmFjZSBkb2VzIG5vdCByZXF1aXJlIGxvY2tpbmcgYmVmb3JlIGFjY2Vzc2luZworICogdGhlIHBpeGVsIGluZm9ybWF0aW9uLCB0aGVuIHRoZSBtZW1vcnkgcG9pbnRlcnMgd2lsbCBub3QgY2hhbmdlLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gd2FzIGFibGUgdG8gdG9nZ2xlIGZ1bGxzY3JlZW4gbW9kZSAoY2hhbmdlIGZyb20gCisgKiBydW5uaW5nIGluIGEgd2luZG93IHRvIGZ1bGxzY3JlZW4sIG9yIHZpY2UtdmVyc2EpLCBpdCB3aWxsIHJldHVybiAxLgorICogSWYgaXQgaXMgbm90IGltcGxlbWVudGVkLCBvciBmYWlscywgaXQgcmV0dXJucyAwLgorICoKKyAqIFRoZSBuZXh0IGNhbGwgdG8gU0RMX1NldFZpZGVvTW9kZSgpIHdpbGwgc2V0IHRoZSBtb2RlIGZ1bGxzY3JlZW4KKyAqIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgZmxhZ3MgcGFyYW1ldGVyIC0gaWYgU0RMX0ZVTExTQ1JFRU4gaXMgbm90CisgKiBzZXQsIHRoZW4gdGhlIGRpc3BsYXkgd2lsbCBiZSB3aW5kb3dlZCBieSBkZWZhdWx0IHdoZXJlIHN1cHBvcnRlZC4KKyAqCisgKiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIGluIHRoZSBYMTEgdmlkZW8gZHJpdmVyLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETENBTEwgU0RMX1dNX1RvZ2dsZUZ1bGxTY3JlZW4oU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCit0eXBlZGVmIGVudW0geworCVNETF9HUkFCX1FVRVJZID0gLTEsCisJU0RMX0dSQUJfT0ZGID0gMCwKKwlTRExfR1JBQl9PTiA9IDEsCisJU0RMX0dSQUJfRlVMTFNDUkVFTgkvKio8IFVzZWQgaW50ZXJuYWxseSAqLworfSBTRExfR3JhYk1vZGU7CisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYW5kIHF1ZXJ5IHRoZSBpbnB1dCBncmFiIHN0YXRlIG9mCisgKiB0aGUgYXBwbGljYXRpb24uICBJdCByZXR1cm5zIHRoZSBuZXcgaW5wdXQgZ3JhYiBzdGF0ZS4KKyAqCisgKiBHcmFiYmluZyBtZWFucyB0aGF0IHRoZSBtb3VzZSBpcyBjb25maW5lZCB0byB0aGUgYXBwbGljYXRpb24gd2luZG93LAorICogYW5kIG5lYXJseSBhbGwga2V5Ym9hcmQgaW5wdXQgaXMgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBhcHBsaWNhdGlvbiwKKyAqIGFuZCBub3QgaW50ZXJwcmV0ZWQgYnkgYSB3aW5kb3cgbWFuYWdlciwgaWYgYW55LgorICovCitleHRlcm4gREVDTFNQRUMgU0RMX0dyYWJNb2RlIFNETENBTEwgU0RMX1dNX0dyYWJJbnB1dChTRExfR3JhYk1vZGUgbW9kZSk7CisKKy8qCisgKiBNb3ZlIHRoZSBTREwgV2luZG93IHRvIGEgc3BlY2lmaWMgcG9zaXRpb24uIERvZXMgbm90aGluZyBpbiBmdWxsc2NyZWVuIG1vZGUuCisgKi8KK2V4dGVybiBERUNMU1BFQyB2b2lkIFNETF9XTV9TZXRQb3MoaW50IHgsIGludCB5KTsKKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBTREwgd2luZG93IHBvc2l0aW9uLiBSZXR1cm5zICgwLDApIGluIGZ1bGxzY3JlZW4gbW9kZS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMX1dNX0dldFBvcyhpbnQgKnB4LCBpbnQgKnB5KTsKKworLyoKKyAqIElmIHRoZSB3aW5kb3cgaXMgZnVsbHkgdmlzaWJsZSwgcmV0dXJuIFRSVUU7IG90aGVyd2lzZSwgcmVjZW50ZXIgdGhlIHdpbmRvdworICogaWYgdGhlICdyZWNlbnRlcicgcGFyYW1ldGVyIGlzIG5vbi0wLCBhbmQgcmV0dXJuIEZBTFNFLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETF9XTV9Jc0Z1bGx5VmlzaWJsZShpbnQgcmVjZW50ZXIpOworCisvKgorICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBtYWluIG1vbml0b3IgaW4gRFBJcywgaWYgYXZhaWxhYmxlLgorICogUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgLTEgaWYgdGhlIGRhdGEgaXMgbm90IGF2YWlsYWJsZS4KKyAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExfV01fR2V0TW9uaXRvckRQSShpbnQgKnhEUEksIGludCAqeURQSSk7CisKKy8qCisgKiBHZXQgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBtb25pdG9yIGluIHZpcnR1YWwgZGVza3RvcCBzcGFjZS4KKyAqIEluIHRoZSBjYXNlIG9mIG11bHRpLW1vbml0b3Igc3lzdGVtcywgcmV0dXJucyB0aGUgcmVjdGFuZ2xlIG9mCisgKiB0aGUgJ25lYXJlc3QnIG1vbml0b3IgcmVsYXRpdmUgdG8gdGhlIG1haW4gU0RMX3dpbmRvdy4gUmV0dXJucworICogMCBvbiBzdWNjZXNzLCBvciAtMSBpZiB0aGUgZGF0YSBpcyBub3QgYXZhaWxhYmxlLgorICovCitleHRlcm4gREVDTFNQRUMgaW50IFNETF9XTV9HZXRNb25pdG9yUmVjdChTRExfUmVjdCAqcmVjdCk7CisKKy8qQH0qLworCisvKiogQGludGVybmFsIE5vdCBpbiBwdWJsaWMgQVBJIGF0IHRoZSBtb21lbnQgLSBkbyBub3QgdXNlISAqLworZXh0ZXJuIERFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Tb2Z0U3RyZXRjaChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgCisvKiBFbmRzIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2hlbiB1c2luZyBDKysgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjaW5jbHVkZSAiY2xvc2VfY29kZS5oIgorCisjZW5kaWYgLyogX1NETF92aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9iZWdpbl9jb2RlLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9iZWdpbl9jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlMmY3YgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL2JlZ2luX2NvZGUuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoqIAorICogIEBmaWxlIGJlZ2luX2NvZGUuaAorICogIFRoaXMgZmlsZSBzZXRzIHRoaW5ncyB1cCBmb3IgQyBkeW5hbWljIGxpYnJhcnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMsCisgKiAgc3RhdGljIGlubGluZWQgZnVuY3Rpb25zLCBhbmQgc3RydWN0dXJlcyBhbGlnbmVkIGF0IDQtYnl0ZSBhbGlnbm1lbnQuCisgKiAgSWYgeW91IGRvbid0IGxpa2UgdWdseSBDIHByZXByb2Nlc3NvciBjb2RlLCBkb24ndCBsb29rIGF0IHRoaXMgZmlsZS4gOikKKyAqLworCisvKiogCisgKiAgQGZpbGUgYmVnaW5fY29kZS5oCisgKiAgVGhpcyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tIGluY2x1ZGVkIGl0IGFyb3VuZCBjb2RlIG9ubHkuCisgKi8KKyNpZmRlZiBfYmVnaW5fY29kZV9oCisjZXJyb3IgTmVzdGVkIGluY2x1c2lvbiBvZiBiZWdpbl9jb2RlLmgKKyNlbmRpZgorI2RlZmluZSBfYmVnaW5fY29kZV9oCisKKy8qKiAKKyAqICBAZGVmIERFQ0xTUEVDCisgKiAgU29tZSBjb21waWxlcnMgdXNlIGEgc3BlY2lhbCBleHBvcnQga2V5d29yZAorICovCisjaWZuZGVmIERFQ0xTUEVDCisjIGlmIGRlZmluZWQoX19CRU9TX18pIHx8IGRlZmluZWQoX19IQUlLVV9fKQorIyAgaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgICBkZWZpbmUgREVDTFNQRUMKKyMgIGVsc2UKKyMgICBkZWZpbmUgREVDTFNQRUMJX19kZWNsc3BlYyhleHBvcnQpCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQoX19XSU4zMl9fKQorIyAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgaWZkZWYgQlVJTERfU0RMCisjICAgIGRlZmluZSBERUNMU1BFQyAKKyMgICBlbHNlCisjICAgIGRlZmluZSBERUNMU1BFQwlfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICBlbmRpZgorIyAgZWxzZQorIyAgIGRlZmluZSBERUNMU1BFQwlfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVuZGlmCisjIGVsaWYgZGVmaW5lZChfX09TMl9fKQorIyAgaWZkZWYgX19XQVRDT01DX18KKyMgICBpZmRlZiBCVUlMRF9TREwKKyMgICAgZGVmaW5lIERFQ0xTUEVDCV9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIERFQ0xTUEVDCisjICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIF9fR05VQ19fIDwgNAorIyAgIC8qIEFkZGVkIHN1cHBvcnQgZm9yIEdDQy1FTVggPHY0LnggKi8KKyMgICAvKiB0aGlzIGlzIG5lZWRlZCBmb3IgWEZyZWU4Ni9PUzIgZGV2ZWxvcGVtZW50ICovCisjICAgLyogRi4gQW1iYWNoZXIoYW5ha29yQHNuYWZ1LmRlKSAwNS4yMDA4ICovCisjICAgaWZkZWYgQlVJTERfU0RMCisjICAgIGRlZmluZSBERUNMU1BFQyAgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICBlbHNlCisjICAgIGRlZmluZSBERUNMU1BFQworIyAgIGVuZGlmCisjICBlbHNlCisjICAgZGVmaW5lIERFQ0xTUEVDCisjICBlbmRpZgorIyBlbHNlCisjICBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjICAgZGVmaW5lIERFQ0xTUEVDCV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyAgZWxzZQorIyAgIGRlZmluZSBERUNMU1BFQworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiogCisgKiAgQGRlZiBTRExDQUxMCisgKiAgQnkgZGVmYXVsdCBTREwgdXNlcyB0aGUgQyBjYWxsaW5nIGNvbnZlbnRpb24KKyAqLworI2lmbmRlZiBTRExDQUxMCisjIGlmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX0dOVUNfXykKKyMgIGRlZmluZSBTRExDQUxMIF9fY2RlY2wKKyMgZWxpZiBkZWZpbmVkKF9fT1MyX18pCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgX19HTlVDX18gPCA0CisjICAgLyogQWRkZWQgc3VwcG9ydCBmb3IgR0NDLUVNWCA8djQueCAqLworIyAgIC8qIHRoaXMgaXMgbmVlZGVkIGZvciBYRnJlZTg2L09TMiBkZXZlbG9wZW1lbnQgKi8KKyMgICAvKiBGLiBBbWJhY2hlcihhbmFrb3JAc25hZnUuZGUpIDA1LjIwMDggKi8KKyMgICBkZWZpbmUgU0RMQ0FMTCBfY2RlY2wKKyMgIGVsc2UKKyMgICAvKiBPbiBvdGhlciBjb21waWxlcnMgb24gT1MvMiwgd2UgdXNlIHRoZSBfU3lzdGVtIGNhbGxpbmcgY29udmVudGlvbiAqLworIyAgIC8qIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBldmVyeSBjb21waWxlciAqLworIyAgIGRlZmluZSBTRExDQUxMIF9TeXN0ZW0KKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBTRExDQUxMCisjIGVuZGlmCisjZW5kaWYgLyogU0RMQ0FMTCAqLworCisjaWZkZWYgX19TWU1CSUFOMzJfXyAKKyNpZm5kZWYgRUtBMiAKKyN1bmRlZiBERUNMU1BFQworI2RlZmluZSBERUNMU1BFQworI2VsaWYgIWRlZmluZWQoX19XSU5TX18pCisjdW5kZWYgREVDTFNQRUMKKyNkZWZpbmUgREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZW5kaWYgLyogIUVLQTIgKi8KKyNlbmRpZiAvKiBfX1NZTUJJQU4zMl9fICovCisKKy8qKgorICogIEBmaWxlIGJlZ2luX2NvZGUuaAorICogIEZvcmNlIHN0cnVjdHVyZSBwYWNraW5nIGF0IDQgYnl0ZSBhbGlnbm1lbnQuCisgKiAgVGhpcyBpcyBuZWNlc3NhcnkgaWYgdGhlIGhlYWRlciBpcyBpbmNsdWRlZCBpbiBjb2RlIHdoaWNoIGhhcyBzdHJ1Y3R1cmUKKyAqICBwYWNraW5nIHNldCB0byBhbiBhbHRlcm5hdGUgdmFsdWUsIHNheSBmb3IgbG9hZGluZyBzdHJ1Y3R1cmVzIGZyb20gZGlzay4KKyAqICBUaGUgcGFja2luZyBpcyByZXNldCB0byB0aGUgcHJldmlvdXMgdmFsdWUgaW4gY2xvc2VfY29kZS5oIAorICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01XRVJLU19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQxMDMpCisjZW5kaWYKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyNwcmFnbWEgbm9wYWNrd2FybmluZworI2VuZGlmCisjaWZkZWYgX01fWDY0CisvKiBVc2UgOC1ieXRlIGFsaWdubWVudCBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcywgc28gcG9pbnRlcnMgYXJlIGFsaWduZWQgKi8KKyNwcmFnbWEgcGFjayhwdXNoLDgpCisjZWxzZQorI3ByYWdtYSBwYWNrKHB1c2gsNCkKKyNlbmRpZgorI2VsaWYgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgZGVmaW5lZChfX01BQ09TX18pKQorI3ByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4azRieXRlCisjcHJhZ21hIGVudW1zYWx3YXlzaW50IG9uCisjZW5kaWYgLyogQ29tcGlsZXIgbmVlZHMgc3RydWN0dXJlIHBhY2tpbmcgc2V0ICovCisKKy8qKgorICogIEBkZWYgU0RMX0lOTElORV9PS0FZCisgKiAgU2V0IHVwIGNvbXBpbGVyLXNwZWNpZmljIG9wdGlvbnMgZm9yIGlubGluaW5nIGZ1bmN0aW9ucworICovCisjaWZuZGVmIFNETF9JTkxJTkVfT0tBWQorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFNETF9JTkxJTkVfT0tBWQorI2Vsc2UKKy8qIEFkZCBhbnkgc3BlY2lhbCBjb21waWxlci1zcGVjaWZpYyBjYXNlcyBoZXJlICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fRE1DX18pIHx8IGRlZmluZWQoX19TQ19fKSB8fCBcCisgICAgZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChfX0xDQ19fKSB8fCBcCisgICAgZGVmaW5lZChfX0RFQ0MpIHx8IGRlZmluZWQoX19FQUJJX18pCisjaWZuZGVmIF9faW5saW5lX18KKyNkZWZpbmUgX19pbmxpbmVfXwlfX2lubGluZQorI2VuZGlmCisjZGVmaW5lIFNETF9JTkxJTkVfT0tBWQorI2Vsc2UKKyNpZiAhZGVmaW5lZChfX01SQ19fKSAmJiAhZGVmaW5lZChfU0dJX1NPVVJDRSkKKyNpZm5kZWYgX19pbmxpbmVfXworI2RlZmluZSBfX2lubGluZV9fIGlubGluZQorI2VuZGlmCisjZGVmaW5lIFNETF9JTkxJTkVfT0tBWQorI2VuZGlmIC8qIE5vdCBhIGZ1bmt5IGNvbXBpbGVyICovCisjZW5kaWYgLyogVmlzdWFsIEMrKyAqLworI2VuZGlmIC8qIEdOVSBDICovCisjZW5kaWYgLyogU0RMX0lOTElORV9PS0FZICovCisKKy8qKgorICogIEBkZWYgX19pbmxpbmVfXworICogIElmIGlubGluaW5nIGlzbid0IHN1cHBvcnRlZCwgcmVtb3ZlICJfX2lubGluZV9fIiwgdHVybmluZyBzdGF0aWMKKyAqICBpbmxpbmVkIGZ1bmN0aW9ucyBpbnRvIHN0YXRpYyBmdW5jdGlvbnMgKHJlc3VsdGluZyBpbiBjb2RlIGJsb2F0CisgKiAgaW4gYWxsIGZpbGVzIHdoaWNoIGluY2x1ZGUgdGhlIG9mZmVuZGluZyBoZWFkZXIgZmlsZXMpCisgKi8KKyNpZm5kZWYgU0RMX0lOTElORV9PS0FZCisjZGVmaW5lIF9faW5saW5lX18KKyNlbmRpZgorCisvKioKKyAqICBAZGVmIE5VTEwKKyAqICBBcHBhcmVudGx5IHRoaXMgaXMgbmVlZGVkIGJ5IHNldmVyYWwgV2luZG93cyBjb21waWxlcnMKKyAqLworI2lmICFkZWZpbmVkKF9fTUFDSF9fKQorI2lmbmRlZiBOVUxMCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgTlVMTCAwCisjZWxzZQorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYKKyNlbmRpZiAvKiBOVUxMICovCisjZW5kaWYgLyogISBNYWMgT1MgWCAtIGJyZWFrcyBwcmVjb21waWxlZCBoZWFkZXJzICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9jbG9zZV9jb2RlLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9jbG9zZV9jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhMDAyNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9pbmNsdWRlL2Nsb3NlX2NvZGUuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKioKKyAqICBAZmlsZSBjbG9zZV9jb2RlLmgKKyAqICBUaGlzIGZpbGUgcmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2YgYmVnaW5fY29kZS5oIGFuZCBzaG91bGQgYmUgaW5jbHVkZWQKKyAqICBhZnRlciB5b3UgZmluaXNoIGFueSBmdW5jdGlvbiBhbmQgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyBpbiB5b3VyIGhlYWRlcnMKKyAqLworCisjdW5kZWYgX2JlZ2luX2NvZGVfaAorCisvKioKKyAqICBAZmlsZSBjbG9zZV9jb2RlLmgKKyAqICBSZXNldCBzdHJ1Y3R1cmUgcGFja2luZyBhdCBwcmV2aW91cyBieXRlIGFsaWdubWVudAorICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01XRVJLU19fKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSAgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIG5vcGFja3dhcm5pbmcKKyNlbmRpZgorI2lmIChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoX19NQUNPU19fKSkKKyNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorI3ByYWdtYSBlbnVtc2Fsd2F5c2ludCByZXNldAorI2Vsc2UKKyNwcmFnbWEgcGFjayhwb3ApCisjZW5kaWYKKyNlbmRpZiAvKiBDb21waWxlciBuZWVkcyBzdHJ1Y3R1cmUgcGFja2luZyBzZXQgKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvZG94eWZpbGUgYi9kaXN0cmliL3NkbC0xLjIuMTUvaW5jbHVkZS9kb3h5ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWRjZjViCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L2luY2x1ZGUvZG94eWZpbGUKQEAgLTAsMCArMSw5NDYgQEAKKyMgRG94eWZpbGUgMS4yLjE2CisKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0CisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZAorIyBUaGUgZm9ybWF0IGlzOgorIyAgICAgICBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyAgICAgICBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKCIgIikKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBHZW5lcmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZAorIyBieSBxdW90ZXMpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZSBwcm9qZWN0LgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gU0RMCisKKyMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLgorIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gMS4yLjE1CisKKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKQorIyBiYXNlIHBhdGggd2hlcmUgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KKyMgd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jcworCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzCisjIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGFsbCBjb25zdGFudCBvdXRwdXQgaW4gdGhlIHByb3BlciBsYW5ndWFnZS4KKyMgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCwgb3RoZXIgc3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6CisjIEJyYXppbGlhbiwgQ2hpbmVzZSwgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLAorIyBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEtvcmVhbiwKKyMgTm9yd2VnaWFuLCBQb2xpc2gsIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLCBTbG92YWssIFNsb3ZlbmUsCisjIFNwYW5pc2gsIFN3ZWRpc2ggYW5kIFVrcmFpbmlhbi4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuCisjIFByaXZhdGUgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MKKyMgdGhlIEVYVFJBQ1RfUFJJVkFURSBhbmQgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUworCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcworIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZQorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTIGNsYXNzZXMgKGFuZCBzdHJ1Y3RzKQorIyBkZWZpbmVkIGxvY2FsbHkgaW4gc291cmNlIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIElmIHNldCB0byBOTyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgb2YgZG9jdW1lbnRlZCBjbGFzc2VzLCBmaWxlcyBvciBuYW1lc3BhY2VzLgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisjIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGlzIGdlbmVyYXRlZC4KKyMgVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzCisjIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbgorIyB0aGUgZmlsZSBhbmQgY2xhc3MgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhRG9jKS4KKyMgU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgcHJlcGVuZAorIyB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4KKyMgTm90ZTogaWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisKK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTworCisjIElmIHRoZSBJTkxJTkVfSU5IRVJJVEVEX01FTUIgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBzaG93IGFsbCBpbmhlcml0ZWQKKyMgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UgbWVtYmVycyB3ZXJlCisjIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzIG9mCisjIHRoZSBiYXNlIGNsYXNzZXMgd2lsbCBub3QgYmUgc2hvd24uCisKK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBOTworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbAorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldAorIyB0byBOTyB0aGUgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZC4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBTVFJJUF9GUk9NX1BBVEggdGFnCisjIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlciBkZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguIFN0cmlwcGluZyBpcworIyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQgcGFydCBvZgorIyB0aGUgcGF0aC4gSXQgaXMgYWxsb3dlZCB0byB1c2UgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGFyZ3VtZW50IGxpc3QuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQorCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24KKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldAorIyB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBleGNsdWRlZC4KKyMgU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIGluc3RydWN0CisjIGRveHlnZW4gdG8gaGlkZSBhbnkgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZQorIyBmcmFnbWVudHMuIE5vcm1hbCBDIGFuZCBDKysgY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuCisKK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKKworIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUKKyMgZmlsZSBuYW1lcyBpbiBsb3dlciBjYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXIgY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIHVzZXJzIGFyZSBhZHZpY2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlcgorIyAoYnV0IGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpcyB5b3VyIGZpbGUgc3lzdGVtcworIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBzaG93IG1lbWJlcnMgd2l0aCB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvcgorIyB3aGljaCBhbiBpbmNsdWRlIGlzIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBwdXQgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uCisjIG9mIHRoYXQgZmlsZS4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4KKyMgd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YURvYy1zdHlsZQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YURvYworIyBjb21tZW50cyAgd2lsbCBiZWhhdmUganVzdCBsaWtlIHRoZSBRdC1zdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcgYW4KKyMgZXhwbGljdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4KKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PCisKKyMgSWYgdGhlIERFVEFJTFNfQVRfVE9QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbgorIyB3aWxsIG91dHB1dCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gbmVhciB0aGUgdG9wLCBsaWtlIEphdmFEb2MuCisjIElmIHNldCB0byBOTywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGFwcGVhcnMgYWZ0ZXIgdGhlIG1lbWJlcgorIyBkb2N1bWVudGF0aW9uLgorCitERVRBSUxTX0FUX1RPUCAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhbiB1bmRvY3VtZW50ZWQKKyMgbWVtYmVyIGluaGVyaXRzIHRoZSBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQKKyMgcmVpbXBsZW1lbnRzLgorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXQorIyBpcyBpbnNlcnRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCisKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gZG94eWdlbgorIyB3aWxsIHNvcnQgdGhlIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzCisjIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4KKyMgZGVjbGFyYXRpb24gb3JkZXIuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLgorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgYnVnIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZworIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMKKyMgYXMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoCisjIHdpbGwgcmVzdWx0IGluIGEgdXNlciBkZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcgIlNpZGUgRWZmZWN0czoiLgorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9CisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbAorIyBkb2N1bWVudGF0aW9uIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIHNlY3Rpb25uYW1lIC4uLiBcZW5kaWYuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPQorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzCisjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgZGVmaW5lIGNvbnNpc3Qgb2YgZm9yIGl0IHRvIGFwcGVhciBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQKKyMgaGVyZSBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LgorIyBUaGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIGRlZmluZXMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyCisjIGNvbW1hbmQgaW4gdGhlIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMgc291cmNlcworIyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLgorIyBGb3IgaW5zdGFuY2Ugc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3QKKyMgb2YgYWxsIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisKK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBZRVMKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgc291cmNlcworIyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBKYXZhLgorIyBGb3IgaW5zdGFuY2UgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywgcXVhbGlmaWVkIHNjb3BlcworIyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisKK09QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTworCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZAorIyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlCisjIGxpc3Qgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKworU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFFVSUVUIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgZ2VuZXJhdGVkCisjIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsKKyMgTk8gaXMgdXNlZC4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIFdBUk5fSUZfVU5ET0NVTUVOVEVEIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzCisjIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZyB3aWxsCisjIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCisKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0CisjIGRveHlnZW4gY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0CisjIHRhZ3MsIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlCisjIHdhcm5pbmcgb3JpZ2luYXRlZCBhbmQgdGhlIHdhcm5pbmcgdGV4dC4KKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZworIyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuCisjIHRvIHN0ZGVyci4KKworV0FSTl9MT0dGSUxFICAgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSAibXlmaWxlLmNwcCIgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHdpdGggc3BhY2VzLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gaW5jbHVkZQorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQKKyMgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOgorIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmphdmEgKi5paSAqLml4eCAqLmlwcCAqLmkrKyAqLmlubCAqLmggKi5oaCAqLmh4eCAqLmhwcAorIyAqLmgrKyAqLmlkbCAqLm9kbAorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5oCisKKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzCisjIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLgorIyBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZAorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKworRVhDTFVERSAgICAgICAgICAgICAgICA9CisKKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvciBkaXJlY3RvcmllcworIyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGVzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGlucHV0LgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPQorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZQorIyB0aGUgXGluY2x1ZGUgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPQorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0CisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPQorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW1hZ2UgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0KKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPgorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4KKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzCisjIHRvIHN0YW5kYXJkIG91dHB1dC4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9CisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIpIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzIHdoZW4gcHJvZHVjaW5nIHNvdXJjZQorIyBmaWxlcyB0byBicm93c2UuCisKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbAorIyBiZSBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkKKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZAorIyBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcworIyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleAorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdAorIyBjb250YWlucyBhIGxvdCBvZiBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IE5PCisKKyMgSWYgdGhlIGFscGhhYmV0aWNhbCBpbmRleCBpcyBlbmFibGVkIChzZWUgQUxQSEFCRVRJQ0FMX0lOREVYKSB0aGVuCisjIHRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucworIyBpbiB3aGljaCB0aGlzIGxpc3Qgd2lsbCBiZSBzcGxpdCAoY2FuIGJlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMS4uMjBdKQorCitDT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQorCisjIEluIGNhc2UgYWxsIGNsYXNzZXMgaW4gYSBwcm9qZWN0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4LCBhbGwKKyMgY2xhc3NlcyB3aWxsIGJlIHB1dCB1bmRlciB0aGUgc2FtZSBoZWFkZXIgaW4gdGhlIGFscGhhYmV0aWNhbCBpbmRleC4KKyMgVGhlIElHTk9SRV9QUkVGSVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgcHJlZml4ZXMgdGhhdAorIyBzaG91bGQgYmUgaWdub3JlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbmRleCBoZWFkZXJzLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBodG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuaworIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgZmlsZXMgd2l0aCAuaHRtbCBleHRlbnNpb24uCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgaGVhZGVyIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0KKworIyBUaGUgSFRNTF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGZvb3RlciBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGZvb3Rlci4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9CisKKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXIgZGVmaW5lZCBjYXNjYWRpbmcKKyMgc3R5bGUgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0bworIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldAorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0KKworIyBJZiB0aGUgSFRNTF9BTElHTl9NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBjbGFzc2VzLAorIyBmaWxlcyBvciBuYW1lc3BhY2VzIHdpbGwgYmUgYWxpZ25lZCBpbiBIVE1MIHVzaW5nIHRhYmxlcy4gSWYgc2V0IHRvCisjIE5PIGEgYnVsbGV0IGxpc3Qgd2lsbCBiZSB1c2VkLgorCitIVE1MX0FMSUdOX01FTUJFUlMgICAgID0gWUVTCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRvb2xzIGxpa2UgdGhlCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21wcmVzc2VkIEhUTUwgaGVscCBmaWxlICguY2htKQorIyBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgR0VORVJBVEVfQ0hJIGZsYWcKKyMgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIHRoYXQKKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZworIyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZCAoWUVTKSBvciBhCisjIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuCisKK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzCisjIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSHRtbCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4IGF0CisjIHRvcCBvZiBlYWNoIEhUTUwgcGFnZS4gVGhlIHZhbHVlIE5PICh0aGUgZGVmYXVsdCkgZW5hYmxlcyB0aGUgaW5kZXggYW5kCisjIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMgaXQuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIChyYW5nZSBbMS4uMjBdKQorIyB0aGF0IGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKKworIyBJZiB0aGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlCisjIGdlbmVyYXRlZCBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdAorIyBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMKKyMgSmF2YVNjcmlwdCBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkIChmb3IgaW5zdGFuY2UgTW96aWxsYSwgTmV0c2NhcGUgNC4wKywKKyMgb3IgSW50ZXJuZXQgZXhwbG9yZXIgNC4wKykuIE5vdGUgdGhhdCBmb3IgbGFyZ2UgcHJvamVjdHMgdGhlIHRyZWUgZ2VuZXJhdGlvbgorIyBjYW4gdGFrZSBhIHZlcnkgbG9uZyB0aW1lLiBJbiBzdWNoIGNhc2VzIGl0IGlzIGJldHRlciB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyMgV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUgSFRNTCBoZWxwIGZlYXR1cmUuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTworCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlCisjIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZQorIyBpcyBzaG93bi4KKworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgTGF0ZXggb3V0cHV0LgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlIGludm9rZWQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8KKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUKKyMgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisKK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKKworIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QKKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bworIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQKKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBhNHdpZGUsIGxldHRlciwgbGVnYWwgYW5kCisjIGV4ZWN1dGl2ZS4gSWYgbGVmdCBibGFuayBhNHdpZGUgd2lsbCBiZSB1c2VkLgorCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlCisKKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBuYW1lcyBvZiBMYVRlWAorIyBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0KKworIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvcgorIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwKKyMgdGhlIGZpcnN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKworTEFURVhfSEVBREVSICAgICAgICAgICA9CisKKyMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQKKyMgaXMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gcGRmICh1c2luZyBwczJwZGYpLiBUaGUgcGRmIGZpbGUgd2lsbAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcworIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIHBkZiB2aWV3ZXIuCisKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIElmIHRoZSBVU0VfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIHBkZmxhdGV4IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mCisjIHBsYWluIGxhdGV4IGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gZ2V0IGEKKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCisKK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLgorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwCisjIHJ1bm5pbmcgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4KKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pc2VkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aAorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gWUVTCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBydGYnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdAorIyBSVEYgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bworIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkCisjIHdpbGwgY29udGFpbiBoeXBlcmxpbmsgZmllbGRzLiBUaGUgUlRGIGZpbGUgd2lsbAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4KKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgV09SRCBvciBvdGhlcgorIyBwcm9ncmFtcyB3aGljaCBzdXBwb3J0IHRob3NlIGZpZWxkcy4KKyMgTm90ZTogd29yZHBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncworIyBjb25maWcgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ21lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUKKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9CisKKyMgU2V0IG9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIGFuIHJ0ZiBkb2N1bWVudC4KKyMgU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBtYW4gcGFnZXMKKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IFlFUworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LAorIyB0aGVuIGl0IHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5CisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMKKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kCisjIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuIFRoZSBkZWZhdWx0IGlzIE5PLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YKKyMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcworIyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUKKyMgbW9tZW50LgorCitHRU5FUkFURV9YTUwgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZXZhbHVhdGUgYWxsIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUKKyMgZmlsZXMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvCisjIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBjb25kaXRpb25hbAorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZAorIyB3YXkgYnkgc2V0dGluZyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUworIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZQorIyBQUkVERUZJTkVEIGFuZCBFWFBBTkRfQVNfUFJFREVGSU5FRCB0YWdzLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZSBpbmNsdWRlcyBmaWxlcworIyBpbiB0aGUgSU5DTFVERV9QQVRIIChzZWUgYmVsb3cpIHdpbGwgYmUgc2VhcmNoIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieQorIyB0aGUgcHJlcHJvY2Vzc29yLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0KKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwKKyMgYmUgdXNlZC4KKworSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9CisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdAorIyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YKKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZQorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUKKyMgb21pdHRlZCA9MSBpcyBhc3N1bWVkLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gRE9YWUdFTl9TSE9VTERfSUdOT1JFX1RISVM9MSBTRExDQUxMPSBTTkRERUNMU1BFQz0KKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfUFJFREVGX09OTFkgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCisjIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLgorIyBUaGUgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4KKyMgVXNlIHRoZSBQUkVERUZJTkVEIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbi4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9CisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbgorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCBmdW5jdGlvbi1saWtlIG1hY3JvcyB0aGF0IGFyZSBhbG9uZQorIyBvbiBhIGxpbmUgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MgYXJlIHR5cGljYWxseQorIyB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdCByZW1vdmVkLgorCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZ2ZpbGVzLgorCitUQUdGSUxFUyAgICAgICAgICAgICAgID0KKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPQorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMKKyMgd2lsbCBiZSBsaXN0ZWQuCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbAorIyBiZSBsaXN0ZWQuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiBgd2hpY2ggcGVybCcpLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEh0bWwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSBvcgorIyBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8gTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMKKyMgb3B0aW9uIGlzIHN1cGVyY2VkZWQgYnkgdGhlIEhBVkVfRE9UIG9wdGlvbiBiZWxvdy4gVGhpcyBpcyBvbmx5IGEgZmFsbGJhY2suIEl0IGlzCisjIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlIHBvd2VyZnVsIGdyYXBocy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IE5PCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUKKyMgaW5oZXJpdGFuY2UgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZAorIyBvciBpcyBub3QgYSBjbGFzcy4KKworSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUworCisjIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcworIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbgorIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uCisjIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDTEFTU19HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZAorIyBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlCisjIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kCisjIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQKKyMgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZSBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4KKworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IE5PCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIgaW5zdGFuY2VzLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERV9HUkFQSCwgYW5kIEhBVkVfRE9UCisjIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoCisjIG90aGVyIGRvY3VtZW50ZWQgZmlsZXMuCisKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBOTworCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFRF9CWV9HUkFQSCwgYW5kCisjIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaAorIyBkb2N1bWVudGVkIGhlYWRlciBmaWxlIHNob3dpbmcgdGhlIGRvY3VtZW50ZWQgZmlsZXMgdGhhdCBkaXJlY3RseSBvcgorIyBpbmRpcmVjdGx5IGluY2x1ZGUgdGhpcyBmaWxlLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ3JhcGhpY2FsIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgYnkgZG90LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHBuZywganBnLCBvciBnaWYKKyMgSWYgbGVmdCBibGFuayBwbmcgd2lsbCBiZSB1c2VkLgorCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCisKKyMgVGhlIHRhZyBET1RfUEFUSCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBvbiB0aGUgcGF0aC4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9CisKKyMgVGhlIERPVEZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlCisjIFxkb3RmaWxlIGNvbW1hbmQpLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0KKworIyBUaGUgTUFYX0RPVF9HUkFQSF9XSURUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgd2lkdGgKKyMgKGluIHBpeGVscykgb2YgdGhlIGdyYXBocyBnZW5lcmF0ZWQgYnkgZG90LiBJZiBhIGdyYXBoIGJlY29tZXMgbGFyZ2VyIHRoYW4KKyMgdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRyeSB0byB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHNvIHRoYXQgaXQgZml0cyB3aXRoaW4KKyMgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50LiBCZXdhcmUgdGhhdCBtb3N0IGJyb3dzZXJzIGNhbm5vdCBjb3BlIHdpdGggdmVyeQorIyBsYXJnZSBpbWFnZXMuCisKK01BWF9ET1RfR1JBUEhfV0lEVEggICAgPSAxMDI0CisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfSEVJR0hUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gYWxsb3dzIGhlaWdodAorIyAoaW4gcGl4ZWxzKSBvZiB0aGUgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIElmIGEgZ3JhcGggYmVjb21lcyBsYXJnZXIgdGhhbgorIyB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHRydW5jYXRlIHRoZSBncmFwaCwgc28gdGhhdCBpdCBmaXRzIHdpdGhpbgorIyB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQuIEJld2FyZSB0aGF0IG1vc3QgYnJvd3NlcnMgY2Fubm90IGNvcGUgd2l0aCB2ZXJ5CisjIGxhcmdlIGltYWdlcy4KKworTUFYX0RPVF9HUkFQSF9IRUlHSFQgICA9IDEwMjQKKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQKKyMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4KKworR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworCisjIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyByZW1vdmUgdGhlIGludGVybWVkYXRlIGRvdCBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlCisjIHRoZSB2YXJpb3VzIGdyYXBocy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZHRpb25zIHJlbGF0ZWQgdG8gdGhlIHNlYXJjaCBlbmdpbmUKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgU0VBUkNIRU5HSU5FIHRhZyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgYSBzZWFyY2ggZW5naW5lIHNob3VsZCBiZQorIyB1c2VkLiBJZiBzZXQgdG8gTk8gdGhlIHZhbHVlcyBvZiBhbGwgdGFncyBiZWxvdyB0aGlzIG9uZSB3aWxsIGJlIGlnbm9yZWQuCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBOTworCisjIFRoZSBDR0lfTkFNRSB0YWcgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBDR0kgc2NyaXB0IHRoYXQKKyMgc3RhcnRzIHRoZSBzZWFyY2ggZW5naW5lIChkb3h5c2VhcmNoKSB3aXRoIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMuCisjIEEgc2NyaXB0IHdpdGggdGhpcyBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IGRveHlnZW4uCisKK0NHSV9OQU1FICAgICAgICAgICAgICAgPSBzZWFyY2guY2dpCisKKyMgVGhlIENHSV9VUkwgdGFnIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgVVJMIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlCisjIGNnaSBiaW5hcmllcyBhcmUgbG9jYXRlZC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgaHR0cCBkYWVtb24gZm9yCisjIGRldGFpbHMuCisKK0NHSV9VUkwgICAgICAgICAgICAgICAgPQorCisjIFRoZSBET0NfVVJMIHRhZyBzaG91bGQgYmUgdGhlIGFic29sdXRlIFVSTCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZQorIyBkb2N1bWVudGF0aW9uIGlzIGxvY2F0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlCisjIGRvY3VtZW50YXRpb24sIHdpdGggZmlsZTovLyBwcmVwZW5kZWQgdG8gaXQsIHdpbGwgYmUgdXNlZC4KKworRE9DX1VSTCAgICAgICAgICAgICAgICA9CisKKyMgVGhlIERPQ19BQlNQQVRIIHRhZyBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBpcyBsb2NhdGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3Rvcnkgb24gdGhlIGxvY2FsIG1hY2hpbmUKKyMgd2lsbCBiZSB1c2VkLgorCitET0NfQUJTUEFUSCAgICAgICAgICAgID0KKworIyBUaGUgQklOX0FCU1BBVEggdGFnIG11c3QgcG9pbnQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZG94eXNlYXJjaCBiaW5hcnkKKyMgaXMgaW5zdGFsbGVkLgorCitCSU5fQUJTUEFUSCAgICAgICAgICAgID0gL3Vzci9sb2NhbC9iaW4vCisKKyMgVGhlIEVYVF9ET0NfUEFUSFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgcGF0aHMgdG8KKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgZm9yIG90aGVyIHByb2plY3RzLiBUaGlzIGFsbG93cyBkb3h5c2VhcmNoIHRvIHNlYXJjaAorIyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlc2UgcHJvamVjdHMgYXMgd2VsbC4KKworRVhUX0RPQ19QQVRIUyAgICAgICAgICA9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc2RsLWNvbmZpZy5pbiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zZGwtY29uZmlnLmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc2RsLWNvbmZpZy5pbgpyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NkbC1jb25maWcuaW4KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zZGwubTQgYi9kaXN0cmliL3NkbC0xLjIuMTUvc2RsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOWViODUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc2RsLm00CkBAIC0wLDAgKzEsMTg1IEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgU0RMCisjIFNhbSBMYW50aW5nYSA5LzIxLzk5CisjIHN0b2xlbiBmcm9tIE1hbmlzaCBTaW5naAorIyBzdG9sZW4gYmFjayBmcm9tIEZyYW5rIEJlbGV3CisjIHN0b2xlbiBmcm9tIE1hbmlzaCBTaW5naAorIyBTaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBPd2VuIFRheWxvcgorCisjIHNlcmlhbCAxCisKK2RubCBBTV9QQVRIX1NETChbTUlOSU1VTS1WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXV0pCitkbmwgVGVzdCBmb3IgU0RMLCBhbmQgZGVmaW5lIFNETF9DRkxBR1MgYW5kIFNETF9MSUJTCitkbmwKK0FDX0RFRlVOKFtBTV9QQVRIX1NETF0sCitbZG5sIAorZG5sIEdldCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMgZnJvbSB0aGUgc2RsLWNvbmZpZyBzY3JpcHQKK2RubAorQUNfQVJHX1dJVEgoc2RsLXByZWZpeCxbICAtLXdpdGgtc2RsLXByZWZpeD1QRlggICBQcmVmaXggd2hlcmUgU0RMIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKyAgICAgICAgICAgIHNkbF9wcmVmaXg9IiR3aXRodmFsIiwgc2RsX3ByZWZpeD0iIikKK0FDX0FSR19XSVRIKHNkbC1leGVjLXByZWZpeCxbICAtLXdpdGgtc2RsLWV4ZWMtcHJlZml4PVBGWCBFeGVjIHByZWZpeCB3aGVyZSBTREwgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLAorICAgICAgICAgICAgc2RsX2V4ZWNfcHJlZml4PSIkd2l0aHZhbCIsIHNkbF9leGVjX3ByZWZpeD0iIikKK0FDX0FSR19FTkFCTEUoc2RsdGVzdCwgWyAgLS1kaXNhYmxlLXNkbHRlc3QgICAgICAgRG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IFNETCBwcm9ncmFtXSwKKwkJICAgICwgZW5hYmxlX3NkbHRlc3Q9eWVzKQorCisgIGlmIHRlc3QgeCRzZGxfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICBzZGxfY29uZmlnX2FyZ3M9IiRzZGxfY29uZmlnX2FyZ3MgLS1leGVjLXByZWZpeD0kc2RsX2V4ZWNfcHJlZml4IgorICAgIGlmIHRlc3QgeCR7U0RMX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICBTRExfQ09ORklHPSRzZGxfZXhlY19wcmVmaXgvYmluL3NkbC1jb25maWcKKyAgICBmaQorICBmaQorICBpZiB0ZXN0IHgkc2RsX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgIHNkbF9jb25maWdfYXJncz0iJHNkbF9jb25maWdfYXJncyAtLXByZWZpeD0kc2RsX3ByZWZpeCIKKyAgICBpZiB0ZXN0IHgke1NETF9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgU0RMX0NPTkZJRz0kc2RsX3ByZWZpeC9iaW4vc2RsLWNvbmZpZworICAgIGZpCisgIGZpCisKKyAgYXNfc2F2ZV9QQVRIPSIkUEFUSCIKKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgUEFUSD0iJHByZWZpeC9iaW46JHByZWZpeC91c3IvYmluOiRQQVRIIgorICBmaQorICBBQ19QQVRIX1BST0coU0RMX0NPTkZJRywgc2RsLWNvbmZpZywgbm8sIFskUEFUSF0pCisgIFBBVEg9IiRhc19zYXZlX1BBVEgiCisgIG1pbl9zZGxfdmVyc2lvbj1pZmVsc2UoWyQxXSwgLDAuMTEuMCwkMSkKKyAgQUNfTVNHX0NIRUNLSU5HKGZvciBTREwgLSB2ZXJzaW9uID49ICRtaW5fc2RsX3ZlcnNpb24pCisgIG5vX3NkbD0iIgorICBpZiB0ZXN0ICIkU0RMX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgIG5vX3NkbD15ZXMKKyAgZWxzZQorICAgIFNETF9DRkxBR1M9YCRTRExfQ09ORklHICRzZGxfY29uZmlnX2FyZ3MgLS1jZmxhZ3NgCisgICAgU0RMX0xJQlM9YCRTRExfQ09ORklHICRzZGxfY29uZmlnX2FyZ3MgLS1saWJzYAorCisgICAgc2RsX21ham9yX3ZlcnNpb249YCRTRExfQ09ORklHICRzZGxfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBzZGxfbWlub3JfdmVyc2lvbj1gJFNETF9DT05GSUcgJHNkbF9jb25maWdfYXJncyAtLXZlcnNpb24gfCBcCisgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS9cMi8nYAorICAgIHNkbF9taWNyb192ZXJzaW9uPWAkU0RMX0NPTkZJRyAkc2RsX2NvbmZpZ19hcmdzIC0tdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCisgICAgaWYgdGVzdCAieCRlbmFibGVfc2RsdGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKyAgICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgICBDRkxBR1M9IiRDRkxBR1MgJFNETF9DRkxBR1MiCisgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRTRExfQ0ZMQUdTIgorICAgICAgTElCUz0iJExJQlMgJFNETF9MSUJTIgorZG5sCitkbmwgTm93IGNoZWNrIGlmIHRoZSBpbnN0YWxsZWQgU0RMIGlzIHN1ZmZpY2llbnRseSBuZXcuIChBbHNvIHNhbml0eQorZG5sIGNoZWNrcyB0aGUgcmVzdWx0cyBvZiBzZGwtY29uZmlnIHRvIHNvbWUgZXh0ZW50CitkbmwKKyAgICAgIHJtIC1mIGNvbmYuc2RsdGVzdAorICAgICAgQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJTREwuaCIKKworY2hhcioKK215X3N0cmR1cCAoY2hhciAqc3RyKQoreworICBjaGFyICpuZXdfc3RyOworICAKKyAgaWYgKHN0cikKKyAgICB7CisgICAgICBuZXdfc3RyID0gKGNoYXIgKiltYWxsb2MgKChzdHJsZW4gKHN0cikgKyAxKSAqIHNpemVvZihjaGFyKSk7CisgICAgICBzdHJjcHkgKG5ld19zdHIsIHN0cik7CisgICAgfQorICBlbHNlCisgICAgbmV3X3N0ciA9IE5VTEw7CisgIAorICByZXR1cm4gbmV3X3N0cjsKK30KKworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCBtYWpvciwgbWlub3IsIG1pY3JvOworICBjaGFyICp0bXBfdmVyc2lvbjsKKworICAvKiBUaGlzIGhhbmdzIG9uIHNvbWUgc3lzdGVtcyAoPykKKyAgc3lzdGVtICgidG91Y2ggY29uZi5zZGx0ZXN0Iik7CisgICovCisgIHsgRklMRSAqZnAgPSBmb3BlbigiY29uZi5zZGx0ZXN0IiwgImEiKTsgaWYgKCBmcCApIGZjbG9zZShmcCk7IH0KKworICAvKiBIUC9VWCA5ICglQCMhKSB3cml0ZXMgdG8gc3NjYW5mIHN0cmluZ3MgKi8KKyAgdG1wX3ZlcnNpb24gPSBteV9zdHJkdXAoIiRtaW5fc2RsX3ZlcnNpb24iKTsKKyAgaWYgKHNzY2FuZih0bXBfdmVyc2lvbiwgIiVkLiVkLiVkIiwgJm1ham9yLCAmbWlub3IsICZtaWNybykgIT0gMykgeworICAgICBwcmludGYoIiVzLCBiYWQgdmVyc2lvbiBzdHJpbmdcbiIsICIkbWluX3NkbF92ZXJzaW9uIik7CisgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIGlmICgoJHNkbF9tYWpvcl92ZXJzaW9uID4gbWFqb3IpIHx8CisgICAgICAoKCRzZGxfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKCRzZGxfbWlub3JfdmVyc2lvbiA+IG1pbm9yKSkgfHwKKyAgICAgICgoJHNkbF9tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAoJHNkbF9taW5vcl92ZXJzaW9uID09IG1pbm9yKSAmJiAoJHNkbF9taWNyb192ZXJzaW9uID49IG1pY3JvKSkpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmKCJcbioqKiAnc2RsLWNvbmZpZyAtLXZlcnNpb24nIHJldHVybmVkICVkLiVkLiVkLCBidXQgdGhlIG1pbmltdW0gdmVyc2lvblxuIiwgJHNkbF9tYWpvcl92ZXJzaW9uLCAkc2RsX21pbm9yX3ZlcnNpb24sICRzZGxfbWljcm9fdmVyc2lvbik7CisgICAgICBwcmludGYoIioqKiBvZiBTREwgcmVxdWlyZWQgaXMgJWQuJWQuJWQuIElmIHNkbC1jb25maWcgaXMgY29ycmVjdCwgdGhlbiBpdCBpc1xuIiwgbWFqb3IsIG1pbm9yLCBtaWNybyk7CisgICAgICBwcmludGYoIioqKiBiZXN0IHRvIHVwZ3JhZGUgdG8gdGhlIHJlcXVpcmVkIHZlcnNpb24uXG4iKTsKKyAgICAgIHByaW50ZigiKioqIElmIHNkbC1jb25maWcgd2FzIHdyb25nLCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFNETF9DT05GSUdcbiIpOworICAgICAgcHJpbnRmKCIqKiogdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgY29weSBvZiBzZGwtY29uZmlnLCBhbmQgcmVtb3ZlIHRoZSBmaWxlXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGNvbmZpZy5jYWNoZSBiZWZvcmUgcmUtcnVubmluZyBjb25maWd1cmVcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitdLCwgbm9fc2RsPXllcyxbZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIl0pCisgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fc2RsIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJFNETF9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICAgICBlY2hvICIqKiogVGhlIHNkbC1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBTREwgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBTREwgd2FzIGluc3RhbGxlZCBpbiBQUkVGSVgsIG1ha2Ugc3VyZSBQUkVGSVgvYmluIGlzIGluIgorICAgICAgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgU0RMX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgICAgZWNobyAiKioqIGZ1bGwgcGF0aCB0byBzZGwtY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5zZGx0ZXN0IDsgdGhlbgorICAgICAgICA6CisgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIFNETCB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFNETF9DRkxBR1MiCisgICAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkU0RMX0NGTEFHUyIKKyAgICAgICAgICBMSUJTPSIkTElCUyAkU0RMX0xJQlMiCisgICAgICAgICAgQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiU0RMLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7IHJldHVybiAwOyB9CisjdW5kZWYgIG1haW4KKyNkZWZpbmUgbWFpbiBLX2FuZF9SX0NfbWFpbgorXSwgICAgICBbIHJldHVybiAwOyBdLAorICAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGNvbXBpbGVkLCBidXQgZGlkIG5vdCBydW4uIFRoaXMgdXN1YWxseSBtZWFucyIKKyAgICAgICAgICBlY2hvICIqKiogdGhhdCB0aGUgcnVuLXRpbWUgbGlua2VyIGlzIG5vdCBmaW5kaW5nIFNETCBvciBmaW5kaW5nIHRoZSB3cm9uZyIKKyAgICAgICAgICBlY2hvICIqKiogdmVyc2lvbiBvZiBTREwuIElmIGl0IGlzIG5vdCBmaW5kaW5nIFNETCwgeW91J2xsIG5lZWQgdG8gc2V0IHlvdXIiCisgICAgICAgICAgZWNobyAiKioqIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgZWRpdCAvZXRjL2xkLnNvLmNvbmYgdG8gcG9pbnQiCisgICAgICAgICAgZWNobyAiKioqIHRvIHRoZSBpbnN0YWxsZWQgbG9jYXRpb24gIEFsc28sIG1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gbGRjb25maWcgaWYgdGhhdCIKKyAgICAgICAgICBlY2hvICIqKiogaXMgcmVxdWlyZWQgb24geW91ciBzeXN0ZW0iCisJICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqIElmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIGluc3RhbGxlZCwgaXQgaXMgYmVzdCB0byByZW1vdmUgaXQsIGFsdGhvdWdoIgorICAgICAgICAgIGVjaG8gIioqKiB5b3UgbWF5IGFsc28gYmUgYWJsZSB0byBnZXQgdGhpbmdzIHRvIHdvcmsgYnkgbW9kaWZ5aW5nIExEX0xJQlJBUllfUEFUSCJdLAorICAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGZhaWxlZCB0byBjb21waWxlIG9yIGxpbmsuIFNlZSB0aGUgZmlsZSBjb25maWcubG9nIGZvciB0aGUiCisgICAgICAgICAgZWNobyAiKioqIGV4YWN0IGVycm9yIHRoYXQgb2NjdXJlZC4gVGhpcyB1c3VhbGx5IG1lYW5zIFNETCB3YXMgaW5jb3JyZWN0bHkgaW5zdGFsbGVkIgorICAgICAgICAgIGVjaG8gIioqKiBvciB0aGF0IHlvdSBoYXZlIG1vdmVkIFNETCBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHlvdSIKKyAgICAgICAgICBlY2hvICIqKiogbWF5IHdhbnQgdG8gZWRpdCB0aGUgc2RsLWNvbmZpZyBzY3JpcHQ6ICRTRExfQ09ORklHIiBdKQorICAgICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKKyAgICAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICAgIGZpCisgICAgIGZpCisgICAgIFNETF9DRkxBR1M9IiIKKyAgICAgU0RMX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKyAgQUNfU1VCU1QoU0RMX0NGTEFHUykKKyAgQUNfU1VCU1QoU0RMX0xJQlMpCisgIHJtIC1mIGNvbmYuc2RsdGVzdAorXSkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zZGwucGMuaW4gYi9kaXN0cmliL3NkbC0xLjIuMTUvc2RsLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNDNhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc2RsLnBjLmluCkBAIC0wLDAgKzEsMTUgQEAKKyMgc2RsIHBrZy1jb25maWcgc291cmNlIGZpbGUKKworcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IHNkbAorRGVzY3JpcHRpb246IFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllciBpcyBhIGNyb3NzLXBsYXRmb3JtIG11bHRpbWVkaWEgbGlicmFyeSBkZXNpZ25lZCB0byBwcm92aWRlIGxvdyBsZXZlbCBhY2Nlc3MgdG8gYXVkaW8sIGtleWJvYXJkLCBtb3VzZSwgam95c3RpY2ssIDNEIGhhcmR3YXJlIHZpYSBPcGVuR0wsIGFuZCAyRCB2aWRlbyBmcmFtZWJ1ZmZlci4KK1ZlcnNpb246IEBTRExfVkVSU0lPTkAKK1JlcXVpcmVzOgorQ29uZmxpY3RzOgorTGliczogLUwke2xpYmRpcn0gQFNETF9STERfRkxBR1NAIEBTRExfTElCU0AKK0xpYnMucHJpdmF0ZTogQFNETF9TVEFUSUNfTElCU0AKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9L1NETCBAU0RMX0NGTEFHU0AKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zb3VyY2VzLm1ha2UgYi9kaXN0cmliL3NkbC0xLjIuMTUvc291cmNlcy5tYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTc1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc291cmNlcy5tYWtlCkBAIC0wLDAgKzEsMjQzIEBACisjIFRoaXMgaXMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBBbmRyb2lkIGVtdWxhdG9yIGJ1aWxkIHNjcmlwdAorIyB0byBkZWNsYXJlIHRoZSBTREwtcmVsYXRlZCBzb3VyY2VzLCBjb21waWxlciBmbGFncyBhbmQgbGlicmFyaWVzCisjCisKK1NETF9DRkxBR1MgOj0KK1NETF9MRExJQlMgOj0KK1NETF9TVEFUSUNfTElCUkFSSUVTIDo9CisKK1NETF9TT1VSQ0VTIDo9CisKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCisgICAgU0RMX0NPTkZJR19MT0FEU09fRExPUEVOIDo9IHllcworICAgIFNETF9DT05GSUdfVEhSRUFEX1BUSFJFQUQgOj0geWVzCisgICAgU0RMX0NPTkZJR19USFJFQURfUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfTlAgOj0geWVzCisgICAgU0RMX0NPTkZJR19USU1FUl9VTklYIDo9IHllcworICAgIFNETF9DT05GSUdfVklERU9fWDExIDo9IHllcworICAgIFNETF9DT05GSUdfVklERU9fWDExX0RQTVMgOj0geWVzCisgICAgU0RMX0NPTkZJR19WSURFT19YMTFfWElORVJBTUEgOj0geWVzCisgICAgU0RMX0NPTkZJR19WSURFT19YMTFfWE1FIDo9IHllcworICAgIFNETF9DT05GSUdfTUFJTl9EVU1NWSA6PSB5ZXMKKworICAgIFNETF9DRkxBR1MgKz0gLURfR05VX1NPVVJDRT0xIC1EX1JFRU5UUkFOVAorICAgIFNETF9MRExJQlMgKz0gLWxtIC1sZGwgLWxwdGhyZWFkIC1scnQKK2VuZGlmCisKK2lmZXEgKCQoSE9TVF9PUyksZnJlZWJzZCkKKyAgICBTRExfQ09ORklHX0xPQURTT19ETE9QRU4gOj0geWVzCisgICAgU0RMX0NPTkZJR19USFJFQURfUFRIUkVBRCA6PSB5ZXMKKyAgICBTRExfQ09ORklHX1RIUkVBRF9QVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWCA6PSB5ZXMKKyAgICBTRExfQ09ORklHX1RJTUVSX1VOSVggOj0geWVzCisgICAgU0RMX0NPTkZJR19WSURFT19YMTEgOj0geWVzCisgICAgU0RMX0NPTkZJR19WSURFT19YMTFfRFBNUyA6PSB5ZXMKKyAgICBTRExfQ09ORklHX1ZJREVPX1gxMV9YSU5FUkFNQSA6PSB5ZXMKKyAgICBTRExfQ09ORklHX1ZJREVPX1gxMV9YTUUgOj0geWVzCisgICAgU0RMX0NPTkZJR19NQUlOX0RVTU1ZIDo9IHllcworCisgICAgU0RMX0NGTEFHUyArPSAtRF9HTlVfU09VUkNFPTEgLURfUkVFTlRSQU5UCisgICAgU0RMX0xETElCUyArPSAtbG0gLWxkbCAtbHB0aHJlYWQKK2VuZGlmCisKK2lmZXEgKCQoSE9TVF9PUyksZGFyd2luKQorICAgIFNETF9DT05GSUdfTE9BRFNPX0RMQ09NUEFUIDo9IHllcworICAgIFNETF9DT05GSUdfVEhSRUFEX1BUSFJFQUQgOj0geWVzCisgICAgU0RMX0NPTkZJR19USFJFQURfUFRIUkVBRF9SRUNVUlNJVkVfTVVURVggOj0geWVzCisgICAgU0RMX0NPTkZJR19USU1FUl9VTklYIDo9IHllcworICAgIFNETF9DT05GSUdfVklERU9fUVVBUlRaIDo9IHllcworICAgIFNETF9DT05GSUdfTUFJTl9NQUNPU1ggOj0geWVzCisKKyAgICBTRExfQ0ZMQUdTICs9IC1EX0dOVV9TT1VSQ0U9MSAtRFRIUkVBRF9TQUZFCisgICAgRlJBTUVXT1JLUyA6PSBPcGVuR0wgQ29jb2EgUXVpY2tUaW1lIEFwcGxpY2F0aW9uU2VydmljZXMgQ2FyYm9uIElPS2l0CisgICAgU0RMX0xETElCUyArPSAkKEZSQU1FV09SS1M6JT0tV2wsLWZyYW1ld29yaywlKQorZW5kaWYKKworaWZlcSAoJChIT1NUX09TKSx3aW5kb3dzKQorICAgIFNETF9DT05GSUdfTE9BRFNPX1dJTjMyIDo9IHllcworICAgIFNETF9DT05GSUdfVEhSRUFEX1dJTjMyIDo9IHllcworICAgIFNETF9DT05GSUdfVElNRVJfV0lOMzIgOj0geWVzCisgICAgU0RMX0NPTkZJR19WSURFT19XSU5ESUIgOj0geWVzCisgICAgU0RMX0NPTkZJR19NQUlOX1dJTjMyIDo9IHllcworCisgICAgU0RMX0NGTEFHUyArPSAtRF9HTlVfU09VUkNFPTEgLURtYWluPVNETF9tYWluIC1ETk9fU1RESU9fUkVESVJFQ1Q9MQorICAgIFNETF9MRExJQlMgKz0gLWx1c2VyMzIgLWxnZGkzMiAtbHdpbm1tCitlbmRpZgorCisKKyMgdGhlIG1haW4gc3JjLyBzb3VyY2VzCisjCitTUkNTIDo9IFNETC5jIFwKKyAgICAgICAgU0RMX2Vycm9yLmMgXAorICAgICAgICBTRExfZmF0YWwuYyBcCisKK1NSQ1MgKz0gZXZlbnRzL1NETF9hY3RpdmUuYyBcCisJZXZlbnRzL1NETF9ldmVudHMuYyBcCisJZXZlbnRzL1NETF9leHBvc2UuYyBcCisJZXZlbnRzL1NETF9rZXlib2FyZC5jIFwKKwlldmVudHMvU0RMX21vdXNlLmMgXAorCWV2ZW50cy9TRExfcXVpdC5jIFwKKwlldmVudHMvU0RMX3Jlc2l6ZS5jIFwKKworU1JDUyArPSBmaWxlL1NETF9yd29wcy5jCisKK1NSQ1MgKz0gc3RkbGliL1NETF9nZXRlbnYuYyBcCisgICAgICAgIHN0ZGxpYi9TRExfaWNvbnYuYyBcCisgICAgICAgIHN0ZGxpYi9TRExfbWFsbG9jLmMgXAorICAgICAgICBzdGRsaWIvU0RMX3Fzb3J0LmMgXAorICAgICAgICBzdGRsaWIvU0RMX3N0ZGxpYi5jIFwKKyAgICAgICAgc3RkbGliL1NETF9zdHJpbmcuYworCitTUkNTICs9IGNwdWluZm8vU0RMX2NwdWluZm8uYworCitTRExfU09VUkNFUyArPSAkKFNSQ1M6JT0kKFNETF9ESVIpL3NyYy8lKQorCisjIHRoZSBMb2FkU08gc291cmNlcworIworCitTUkNTIDo9CisKK2lmZXEgKCQoU0RMX0NPTkZJR19MT0FEU09fRExPUEVOKSx5ZXMpCisgIFNSQ1MgKz0gZGxvcGVuL1NETF9zeXNsb2Fkc28uYworICBTRExfTERMSUJTICs9IC1sZGwKK2VuZGlmCisKK2lmZXEgKCQoU0RMX0NPTkZJR19MT0FEU09fRExDT01QQVQpLHllcykKKyAgU1JDUyArPSBtYWNvc3gvU0RMX2RsY29tcGF0LmMKK2VuZGlmCisKK2lmZXEgKCQoU0RMX0NPTkZJR19MT0FEU09fV0lOMzIpLHllcykKKyAgU1JDUyArPSB3aW4zMi9TRExfc3lzbG9hZHNvLmMKK2VuZGlmCisKK1NETF9TT1VSQ0VTICs9ICQoU1JDUzolPSQoU0RMX0RJUikvc3JjL2xvYWRzby8lKQorCisjIHRoZSBUaHJlYWQgc291cmNlcworIworCitTUkNTIDo9IFNETF90aHJlYWQuYworCitpZmVxICgkKFNETF9DT05GSUdfVEhSRUFEX1BUSFJFQUQpLHllcykKKyAgU1JDUyArPSBwdGhyZWFkL1NETF9zeXNjb25kLmMgXAorICAgICAgICAgIHB0aHJlYWQvU0RMX3N5c211dGV4LmMgXAorICAgICAgICAgIHB0aHJlYWQvU0RMX3N5c3NlbS5jIFwKKyAgICAgICAgICBwdGhyZWFkL1NETF9zeXN0aHJlYWQuYworZW5kaWYKKworaWZlcSAoJChTRExfQ09ORklHX1RIUkVBRF9XSU4zMikseWVzKQorICBTUkNTICs9IHdpbjMyL1NETF9zeXNtdXRleC5jIFwKKyAgICAgICAgICB3aW4zMi9TRExfc3lzc2VtLmMgXAorICAgICAgICAgIHdpbjMyL1NETF9zeXN0aHJlYWQuYworZW5kaWYKKworU0RMX1NPVVJDRVMgKz0gJChTUkNTOiU9JChTRExfRElSKS9zcmMvdGhyZWFkLyUpCisKKyMgdGhlIFRpbWVyIHNvdXJjZXMKKyMKKworU1JDUyA6PSBTRExfdGltZXIuYworCitpZmVxICgkKFNETF9DT05GSUdfVElNRVJfVU5JWCkseWVzKQorICBTUkNTICs9IHVuaXgvU0RMX3N5c3RpbWVyLmMKK2VuZGlmCisKK2lmZXEgKCQoU0RMX0NPTkZJR19USU1FUl9XSU4zMikseWVzKQorICBTUkNTICs9IHdpbjMyL1NETF9zeXN0aW1lci5jCitlbmRpZgorCitTRExfU09VUkNFUyArPSAkKFNSQ1M6JT0kKFNETF9ESVIpL3NyYy90aW1lci8lKQorCisjIHRoZSBWaWRlbyBzb3VyY2VzCisjCisKK1NSQ1MgOj0gU0RMX1JMRWFjY2VsLmMgXAorCVNETF9ibGl0LmMgXAorCVNETF9ibGl0XzAuYyBcCisJU0RMX2JsaXRfMS5jIFwKKwlTRExfYmxpdF9BLmMgXAorCVNETF9ibGl0X04uYyBcCisJU0RMX2JtcC5jIFwKKwlTRExfY3Vyc29yLmMgXAorCVNETF9nYW1tYS5jIFwKKwlTRExfcGl4ZWxzLmMgXAorCVNETF9zdHJldGNoLmMgXAorCVNETF9zdXJmYWNlLmMgXAorCVNETF92aWRlby5jIFwKKwlTRExfeXV2LmMgXAorCVNETF95dXZfbW14LmMgXAorCVNETF95dXZfc3cuYyBcCisKK1NSQ1MgKz0gZHVtbXkvU0RMX251bGxldmVudHMuYyBcCisgICAgICAgIGR1bW15L1NETF9udWxsbW91c2UuYyBcCisgICAgICAgIGR1bW15L1NETF9udWxsdmlkZW8uYworCitpZmVxICgkKFNETF9DT05GSUdfVklERU9fV0lORElCKSx5ZXMpCisgIFNSQ1MgKz0gd2luZGliL1NETF9kaWJldmVudHMuYyBcCisgICAgICAgICAgd2luZGliL1NETF9kaWJ2aWRlby5jIFwKKyAgICAgICAgICB3aW5jb21tb24vU0RMX3N5c2V2ZW50cy5jIFwKKyAgICAgICAgICB3aW5jb21tb24vU0RMX3N5c21vdXNlLmMgXAorICAgICAgICAgIHdpbmNvbW1vbi9TRExfc3lzd20uYyBcCisgICAgICAgICAgd2luY29tbW9uL1NETF93aW5nbC5jCitlbmRpZgorCitpZmVxICgkKFNETF9DT05GSUdfVklERU9fUVVBUlRaKSx5ZXMpCisgIFNSQ1MgKz0gcXVhcnR6L1NETF9RdWFydHpHTC5tIFwKKyAgICAgICAgICBxdWFydHovU0RMX1F1YXJ0elZpZGVvLm0gXAorICAgICAgICAgIHF1YXJ0ei9TRExfUXVhcnR6V00ubSBcCisgICAgICAgICAgcXVhcnR6L1NETF9RdWFydHpXaW5kb3cubSBcCisgICAgICAgICAgcXVhcnR6L1NETF9RdWFydHpFdmVudHMubSBcCisgICAgICAgICAgbWFjY29tbW9uL1NETF9tYWNldmVudHMuYyBcCisgICAgICAgICAgbWFjY29tbW9uL1NETF9tYWNnbC5jIFwKKyAgICAgICAgICBtYWNjb21tb24vU0RMX21hY21vdXNlLmMgXAorICAgICAgICAgIG1hY2NvbW1vbi9TRExfbWFjd20uYworCitlbmRpZgorCitpZmVxICgkKFNETF9DT05GSUdfVklERU9fWDExKSx5ZXMpCisgIFNSQ1MgKz0geDExL1NETF94MTFkeW4uYyBcCisgICAgICAgICAgeDExL1NETF94MTFkZ2EuYyBcCisgICAgICAgICAgeDExL1NETF94MTFldmVudHMuYyBcCisgICAgICAgICAgeDExL1NETF94MTFnYW1tYS5jIFwKKyAgICAgICAgICB4MTEvU0RMX3gxMWdsLmMgXAorICAgICAgICAgIHgxMS9TRExfeDExaW1hZ2UuYyBcCisgICAgICAgICAgeDExL1NETF94MTFtb2Rlcy5jIFwKKyAgICAgICAgICB4MTEvU0RMX3gxMW1vdXNlLmMgXAorICAgICAgICAgIHgxMS9TRExfeDExdmlkZW8uYyBcCisgICAgICAgICAgeDExL1NETF94MTF3bS5jIFwKKyAgICAgICAgICB4MTEvU0RMX3gxMXl1di5jCitlbmRpZgorCitpZmVxICgkKFNETF9DT05GSUdfVklERU9fWDExX0RHQU1PVVNFKSx5ZXMpCisgIFNSQ1MgKz0geDExL1NETF94MTFkZ2EuYworZW5kaWYKKworaWZlcSAoJChTRExfQ09ORklHX1ZJREVPX1gxMV9YTUUpLHllcykKKyAgU1JDUyArPSBYZXh0L1hNRS94bWUuYworZW5kaWYKKworaWZlcSAoJChTRExfQ09ORklHX1ZJREVPX1gxMV9YSU5FUkFNQSkseWVzKQorICBTUkNTICs9IFhleHQvWGluZXJhbWEvWGluZXJhbWEuYworZW5kaWYKKworaWZlcSAoJChTRExfQ09ORklHX1ZJREVPX1gxMV9YVikseWVzKQorICBTUkNTICs9IFhleHQvWHYvWHYuYworZW5kaWYKKworU0RMX1NPVVJDRVMgKz0gJChTUkNTOiU9JChTRExfRElSKS9zcmMvdmlkZW8vJSkKKworIyMgQnVpbGQgbGliU0RMbWFpbgorIyMKKworU1JDUyA6PQorCitpZmVxICgkKFNETF9DT05GSUdfTUFJTl9EVU1NWSkseWVzKQorICBTUkNTICs9IGR1bW15L1NETF9kdW1teV9tYWluLmMKK2VuZGlmCisKK2lmZXEgKCQoU0RMX0NPTkZJR19NQUlOX01BQ09TWCkseWVzKQorICBTUkNTICs9IG1hY29zeC9TRExNYWluLm0KK2VuZGlmCisKK2lmZXEgKCQoU0RMX0NPTkZJR19NQUlOX1dJTjMyKSx5ZXMpCisgIFNSQ1MgKz0gd2luMzIvU0RMX3dpbjMyX21haW4uYworZW5kaWYKKworU0RMTUFJTl9TT1VSQ0VTIDo9ICQoU1JDUzolPSQoU0RMX0RJUikvc3JjL21haW4vJSkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvU0RMLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL1NETC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZjFiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL1NETC5jCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgU0RMICovCisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfZmF0YWwuaCIKKyNpZiAhU0RMX1ZJREVPX0RJU0FCTEVECisjaW5jbHVkZSAidmlkZW8vU0RMX2xlYWtzLmgiCisjZW5kaWYKKworI2lmIFNETF9USFJFQURfUFRICisjaW5jbHVkZSA8cHRoLmg+CisjZW5kaWYKKworLyogSW5pdGlhbGl6YXRpb24vQ2xlYW51cCByb3V0aW5lcyAqLworI2lmICFTRExfSk9ZU1RJQ0tfRElTQUJMRUQKK2V4dGVybiBpbnQgIFNETF9Kb3lzdGlja0luaXQodm9pZCk7CitleHRlcm4gdm9pZCBTRExfSm95c3RpY2tRdWl0KHZvaWQpOworI2VuZGlmCisjaWYgIVNETF9DRFJPTV9ESVNBQkxFRAorZXh0ZXJuIGludCAgU0RMX0NEUk9NSW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIFNETF9DRFJPTVF1aXQodm9pZCk7CisjZW5kaWYKKyNpZiAhU0RMX1RJTUVSU19ESVNBQkxFRAorZXh0ZXJuIHZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCk7CitleHRlcm4gaW50ICBTRExfVGltZXJJbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgU0RMX1RpbWVyUXVpdCh2b2lkKTsKKyNlbmRpZgorCisvKiBUaGUgY3VycmVudCBTREwgdmVyc2lvbiAqLworc3RhdGljIFNETF92ZXJzaW9uIHZlcnNpb24gPSAKKwl7IFNETF9NQUpPUl9WRVJTSU9OLCBTRExfTUlOT1JfVkVSU0lPTiwgU0RMX1BBVENITEVWRUwgfTsKKworLyogVGhlIGluaXRpYWxpemVkIHN1YnN5c3RlbXMgKi8KK3N0YXRpYyBVaW50MzIgU0RMX2luaXRpYWxpemVkID0gMDsKKyNpZiAhU0RMX1RJTUVSU19ESVNBQkxFRAorc3RhdGljIFVpbnQzMiB0aWNrc19zdGFydGVkID0gMDsKKyNlbmRpZgorCisjaWZkZWYgQ0hFQ0tfTEVBS1MKK2ludCBzdXJmYWNlc19hbGxvY2F0ZWQgPSAwOworI2VuZGlmCisKK2ludCBTRExfSW5pdFN1YlN5c3RlbShVaW50MzIgZmxhZ3MpCit7CisjaWYgIVNETF9USU1FUlNfRElTQUJMRUQKKwkvKiBJbml0aWFsaXplIHRoZSB0aW1lciBzdWJzeXN0ZW0gKi8KKwlpZiAoICEgdGlja3Nfc3RhcnRlZCApIHsKKwkJU0RMX1N0YXJ0VGlja3MoKTsKKwkJdGlja3Nfc3RhcnRlZCA9IDE7CisJfQorCWlmICggKGZsYWdzICYgU0RMX0lOSVRfVElNRVIpICYmICEoU0RMX2luaXRpYWxpemVkICYgU0RMX0lOSVRfVElNRVIpICkgeworCQlpZiAoIFNETF9UaW1lckluaXQoKSA8IDAgKSB7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCVNETF9pbml0aWFsaXplZCB8PSBTRExfSU5JVF9USU1FUjsKKwl9CisjZWxzZQorCWlmICggZmxhZ3MgJiBTRExfSU5JVF9USU1FUiApIHsKKwkJU0RMX1NldEVycm9yKCJTREwgbm90IGJ1aWx0IHdpdGggdGltZXIgc3VwcG9ydCIpOworCQlyZXR1cm4oLTEpOworCX0KKyNlbmRpZgorCisjaWYgIVNETF9WSURFT19ESVNBQkxFRAorCS8qIEluaXRpYWxpemUgdGhlIHZpZGVvL2V2ZW50IHN1YnN5c3RlbSAqLworCWlmICggKGZsYWdzICYgU0RMX0lOSVRfVklERU8pICYmICEoU0RMX2luaXRpYWxpemVkICYgU0RMX0lOSVRfVklERU8pICkgeworCQlpZiAoIFNETF9WaWRlb0luaXQoU0RMX2dldGVudigiU0RMX1ZJREVPRFJJVkVSIiksCisJCSAgICAgICAgICAgICAgICAgICAoZmxhZ3MmU0RMX0lOSVRfRVZFTlRUSFJFQUQpKSA8IDAgKSB7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCVNETF9pbml0aWFsaXplZCB8PSBTRExfSU5JVF9WSURFTzsKKwl9CisjZWxzZQorCWlmICggZmxhZ3MgJiBTRExfSU5JVF9WSURFTyApIHsKKwkJU0RMX1NldEVycm9yKCJTREwgbm90IGJ1aWx0IHdpdGggdmlkZW8gc3VwcG9ydCIpOworCQlyZXR1cm4oLTEpOworCX0KKyNlbmRpZgorCisjaWYgIVNETF9BVURJT19ESVNBQkxFRAorCS8qIEluaXRpYWxpemUgdGhlIGF1ZGlvIHN1YnN5c3RlbSAqLworCWlmICggKGZsYWdzICYgU0RMX0lOSVRfQVVESU8pICYmICEoU0RMX2luaXRpYWxpemVkICYgU0RMX0lOSVRfQVVESU8pICkgeworCQlpZiAoIFNETF9BdWRpb0luaXQoU0RMX2dldGVudigiU0RMX0FVRElPRFJJVkVSIikpIDwgMCApIHsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJU0RMX2luaXRpYWxpemVkIHw9IFNETF9JTklUX0FVRElPOworCX0KKyNlbHNlCisJaWYgKCBmbGFncyAmIFNETF9JTklUX0FVRElPICkgeworCQlTRExfU2V0RXJyb3IoIlNETCBub3QgYnVpbHQgd2l0aCBhdWRpbyBzdXBwb3J0Iik7CisJCXJldHVybigtMSk7CisJfQorI2VuZGlmCisKKyNpZiAhU0RMX0pPWVNUSUNLX0RJU0FCTEVECisJLyogSW5pdGlhbGl6ZSB0aGUgam95c3RpY2sgc3Vic3lzdGVtICovCisJaWYgKCAoZmxhZ3MgJiBTRExfSU5JVF9KT1lTVElDSykgJiYKKwkgICAgICEoU0RMX2luaXRpYWxpemVkICYgU0RMX0lOSVRfSk9ZU1RJQ0spICkgeworCQlpZiAoIFNETF9Kb3lzdGlja0luaXQoKSA8IDAgKSB7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCVNETF9pbml0aWFsaXplZCB8PSBTRExfSU5JVF9KT1lTVElDSzsKKwl9CisjZWxzZQorCWlmICggZmxhZ3MgJiBTRExfSU5JVF9KT1lTVElDSyApIHsKKwkJU0RMX1NldEVycm9yKCJTREwgbm90IGJ1aWx0IHdpdGggam95c3RpY2sgc3VwcG9ydCIpOworCQlyZXR1cm4oLTEpOworCX0KKyNlbmRpZgorCisjaWYgIVNETF9DRFJPTV9ESVNBQkxFRAorCS8qIEluaXRpYWxpemUgdGhlIENELVJPTSBzdWJzeXN0ZW0gKi8KKwlpZiAoIChmbGFncyAmIFNETF9JTklUX0NEUk9NKSAmJiAhKFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX0NEUk9NKSApIHsKKwkJaWYgKCBTRExfQ0RST01Jbml0KCkgPCAwICkgeworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlTRExfaW5pdGlhbGl6ZWQgfD0gU0RMX0lOSVRfQ0RST007CisJfQorI2Vsc2UKKwlpZiAoIGZsYWdzICYgU0RMX0lOSVRfQ0RST00gKSB7CisJCVNETF9TZXRFcnJvcigiU0RMIG5vdCBidWlsdCB3aXRoIGNkcm9tIHN1cHBvcnQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBTRExfSW5pdChVaW50MzIgZmxhZ3MpCit7CisjaWYgIVNETF9USFJFQURTX0RJU0FCTEVEICYmIFNETF9USFJFQURfUFRICisJaWYgKCFwdGhfaW5pdCgpKSB7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworCS8qIENsZWFyIHRoZSBlcnJvciBtZXNzYWdlICovCisJU0RMX0NsZWFyRXJyb3IoKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRlc2lyZWQgc3Vic3lzdGVtcyAqLworCWlmICggU0RMX0luaXRTdWJTeXN0ZW0oZmxhZ3MpIDwgMCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBFdmVyeXRoaW5nIGlzIGluaXRpYWxpemVkICovCisJaWYgKCAhKGZsYWdzICYgU0RMX0lOSVRfTk9QQVJBQ0hVVEUpICkgeworCQlTRExfSW5zdGFsbFBhcmFjaHV0ZSgpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgU0RMX1F1aXRTdWJTeXN0ZW0oVWludDMyIGZsYWdzKQoreworCS8qIFNodXQgZG93biByZXF1ZXN0ZWQgaW5pdGlhbGl6ZWQgc3Vic3lzdGVtcyAqLworI2lmICFTRExfQ0RST01fRElTQUJMRUQKKwlpZiAoIChmbGFncyAmIFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX0NEUk9NKSApIHsKKwkJU0RMX0NEUk9NUXVpdCgpOworCQlTRExfaW5pdGlhbGl6ZWQgJj0gflNETF9JTklUX0NEUk9NOworCX0KKyNlbmRpZgorI2lmICFTRExfSk9ZU1RJQ0tfRElTQUJMRUQKKwlpZiAoIChmbGFncyAmIFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX0pPWVNUSUNLKSApIHsKKwkJU0RMX0pveXN0aWNrUXVpdCgpOworCQlTRExfaW5pdGlhbGl6ZWQgJj0gflNETF9JTklUX0pPWVNUSUNLOworCX0KKyNlbmRpZgorI2lmICFTRExfQVVESU9fRElTQUJMRUQKKwlpZiAoIChmbGFncyAmIFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX0FVRElPKSApIHsKKwkJU0RMX0F1ZGlvUXVpdCgpOworCQlTRExfaW5pdGlhbGl6ZWQgJj0gflNETF9JTklUX0FVRElPOworCX0KKyNlbmRpZgorI2lmICFTRExfVklERU9fRElTQUJMRUQKKwlpZiAoIChmbGFncyAmIFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX1ZJREVPKSApIHsKKwkJU0RMX1ZpZGVvUXVpdCgpOworCQlTRExfaW5pdGlhbGl6ZWQgJj0gflNETF9JTklUX1ZJREVPOworCX0KKyNlbmRpZgorI2lmICFTRExfVElNRVJTX0RJU0FCTEVECisJaWYgKCAoZmxhZ3MgJiBTRExfaW5pdGlhbGl6ZWQgJiBTRExfSU5JVF9USU1FUikgKSB7CisJCVNETF9UaW1lclF1aXQoKTsKKwkJU0RMX2luaXRpYWxpemVkICY9IH5TRExfSU5JVF9USU1FUjsKKwl9CisjZW5kaWYKK30KKworVWludDMyIFNETF9XYXNJbml0KFVpbnQzMiBmbGFncykKK3sKKwlpZiAoICEgZmxhZ3MgKSB7CisJCWZsYWdzID0gU0RMX0lOSVRfRVZFUllUSElORzsKKwl9CisJcmV0dXJuIChTRExfaW5pdGlhbGl6ZWQmZmxhZ3MpOworfQorCit2b2lkIFNETF9RdWl0KHZvaWQpCit7CisJLyogUXVpdCBhbGwgc3Vic3lzdGVtcyAqLworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW1NETF9RdWl0XSA6IEVudGVyISBDYWxsaW5nIFF1aXRTdWJTeXN0ZW0oKVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisJU0RMX1F1aXRTdWJTeXN0ZW0oU0RMX0lOSVRfRVZFUllUSElORyk7CisKKyNpZmRlZiBDSEVDS19MRUFLUworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW1NETF9RdWl0XSA6IENIRUNLX0xFQUtTXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworCS8qIFByaW50IHRoZSBudW1iZXIgb2Ygc3VyZmFjZXMgbm90IGZyZWVkICovCisJaWYgKCBzdXJmYWNlc19hbGxvY2F0ZWQgIT0gMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJTREwgV2FybmluZzogJWQgU0RMIHN1cmZhY2VzIGV4dGFudFxuIiwgCisJCQkJCQkJc3VyZmFjZXNfYWxsb2NhdGVkKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBERUJVR19CVUlMRAorICBwcmludGYoIltTRExfUXVpdF0gOiBTRExfVW5pbnN0YWxsUGFyYWNodXRlKClcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisJLyogVW5pbnN0YWxsIGFueSBwYXJhY2h1dGUgc2lnbmFsIGhhbmRsZXJzICovCisJU0RMX1VuaW5zdGFsbFBhcmFjaHV0ZSgpOworCisjaWYgIVNETF9USFJFQURTX0RJU0FCTEVEICYmIFNETF9USFJFQURfUFRICisJcHRoX2tpbGwoKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW1NETF9RdWl0XSA6IFJldHVybmluZyFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCit9CisKKy8qIFJldHVybiB0aGUgbGlicmFyeSB2ZXJzaW9uIG51bWJlciAqLworY29uc3QgU0RMX3ZlcnNpb24gKiBTRExfTGlua2VkX1ZlcnNpb24odm9pZCkKK3sKKwlyZXR1cm4oJnZlcnNpb24pOworfQorCisjaWYgZGVmaW5lZChfX09TMl9fKQorLyogQnVpbGRpbmcgZm9yIE9TLzIgKi8KKyNpZmRlZiBfX1dBVENPTUNfXworCisjZGVmaW5lIElOQ0xfRE9TRVJST1JTCisjZGVmaW5lIElOQ0xfRE9TRVhDRVBUSU9OUworI2luY2x1ZGUgPG9zMi5oPgorCisvKiBFeGNlcHRpb24gaGFuZGxlciB0byBwcmV2ZW50IHRoZSBBdWRpbyB0aHJlYWQgaGFuZ2luZywgbWFraW5nIGEgem9tYmllIHByb2Nlc3MhICovCitVTE9ORyBfU3lzdGVtIFNETF9NYWluX0V4Y2VwdGlvbkhhbmRsZXIoUEVYQ0VQVElPTlJFUE9SVFJFQ09SRCBwRVJlcFJlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRVhDRVBUSU9OUkVHSVNUUkFUSU9OUkVDT1JEIHBFUmVnUmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDT05URVhUUkVDT1JEIHBDdHhSZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZPSUQgcCkKK3sKKyAgaWYgKHBFUmVwUmVjLT5mSGFuZGxlckZsYWdzICYgRUhfRVhJVF9VTldJTkQpCisgICAgcmV0dXJuIFhDUFRfQ09OVElOVUVfU0VBUkNIOworICBpZiAocEVSZXBSZWMtPmZIYW5kbGVyRmxhZ3MgJiBFSF9VTldJTkRJTkcpCisgICAgcmV0dXJuIFhDUFRfQ09OVElOVUVfU0VBUkNIOworICBpZiAocEVSZXBSZWMtPmZIYW5kbGVyRmxhZ3MgJiBFSF9ORVNURURfQ0FMTCkKKyAgICByZXR1cm4gWENQVF9DT05USU5VRV9TRUFSQ0g7CisKKyAgLyogRG8gY2xlYW51cCBhdCBldmVyeSBmYXRhbCBleGNlcHRpb24hICovCisgIGlmICgoKHBFUmVwUmVjLT5FeGNlcHRpb25OdW0gJiBYQ1BUX1NFVkVSSVRZX0NPREUpID09IFhDUFRfRkFUQUxfRVhDRVBUSU9OKSAmJgorICAgICAgKHBFUmVwUmVjLT5FeGNlcHRpb25OdW0gIT0gWENQVF9CUkVBS1BPSU5UKSAmJgorICAgICAgKHBFUmVwUmVjLT5FeGNlcHRpb25OdW0gIT0gWENQVF9TSU5HTEVfU1RFUCkKKyAgICAgKQorICB7CisgICAgaWYgKFNETF9pbml0aWFsaXplZCAmIFNETF9JTklUX0FVRElPKQorICAgIHsKKyAgICAgIC8qIFRoaXMgcmVtb3ZlcyB0aGUgem9tYmllIGF1ZGlvIHRocmVhZCBpbiBjYXNlIG9mIGVtZXJnZW5jeS4gKi8KKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgcHJpbnRmKCJbU0RMX01haW5fRXhjZXB0aW9uSGFuZGxlcl0gOiBDYWxsaW5nIFNETF9DbG9zZUF1ZGlvKCkhXG4iKTsKKyNlbmRpZgorICAgICAgU0RMX0Nsb3NlQXVkaW8oKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChYQ1BUX0NPTlRJTlVFX1NFQVJDSCk7Cit9CisKKworRVhDRVBUSU9OUkVHSVNUUkFUSU9OUkVDT1JEIFNETF9NYWluX3hjcHRoYW5kID0gezAsIFNETF9NYWluX0V4Y2VwdGlvbkhhbmRsZXJ9OworCisvKiBUaGUgbWFpbiBETEwgZW50cnkgZm9yIERMTCBJbml0aWFsaXphdGlvbiBhbmQgVW5pbml0aWFsaXphdGlvbjogKi8KK3Vuc2lnbmVkIF9TeXN0ZW0gTGliTWFpbih1bnNpZ25lZCBobW9kLCB1bnNpZ25lZCB0ZXJtaW5hdGlvbikKK3sKKyAgaWYgKHRlcm1pbmF0aW9uKQorICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKy8qICAgIHByaW50ZigiW1NETCBETEwgVW5pbnRpYWxpemF0aW9uXSA6IFJlbW92aW5nIGV4Y2VwdGlvbiBoYW5kbGVyXG4iKTsgKi8KKyNlbmRpZgorICAgIERvc1Vuc2V0RXhjZXB0aW9uSGFuZGxlcigmU0RMX01haW5feGNwdGhhbmQpOworICAgIHJldHVybiAxOworICB9IGVsc2UKKyAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgLyogTWFrZSBzdGRvdXQgYW5kIHN0ZGVyciB1bmJ1ZmZlcmVkISAqLworICAgIHNldGJ1ZihzdGRvdXQsIE5VTEwpOworICAgIHNldGJ1ZihzdGRlcnIsIE5VTEwpOworI2VuZGlmCisgICAgLyogRmlyZSB1cCBleGNlcHRpb24gaGFuZGxlciAqLworI2lmZGVmIERFQlVHX0JVSUxECisvKiAgICBwcmludGYoIltTREwgRExMIEluaXRpYWxpemF0aW9uXSA6IFNldHRpbmcgZXhjZXB0aW9uIGhhbmRsZXJcbiIpOyAqLworI2VuZGlmCisgICAgLyogU2V0IGV4Y2VwdGlvbiBoYW5kbGVyICovCisgICAgRG9zU2V0RXhjZXB0aW9uSGFuZGxlcigmU0RMX01haW5feGNwdGhhbmQpOworCisgICAgcmV0dXJuIDE7CisgIH0KK30KKyNlbmRpZiAvKiBfX1dBVENPTUNfXyAqLworCisjZWxpZiBkZWZpbmVkKF9fV0lOMzJfXykgICYmICFkZWZpbmVkKF9fU1lNQklBTjMyX18pCisKKyNpZiAhZGVmaW5lZChIQVZFX0xJQkMpIHx8IChkZWZpbmVkKF9fV0FUQ09NQ19fKSAmJiBkZWZpbmVkKEJVSUxEX0RMTCkpCisvKiBOZWVkIHRvIGluY2x1ZGUgRGxsTWFpbigpIG9uIFdhdGNvbSBDIGZvciBzb21lIHJlYXNvbi4uICovCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK0JPT0wgQVBJRU5UUlkgX0RsbE1haW5DUlRTdGFydHVwKCBIQU5ETEUgaE1vZHVsZSwgCisgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICB1bF9yZWFzb25fZm9yX2NhbGwsIAorICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBSZXNlcnZlZCApCit7CisJc3dpdGNoICh1bF9yZWFzb25fZm9yX2NhbGwpIHsKKwkJY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisJCWNhc2UgRExMX1RIUkVBRF9BVFRBQ0g6CisJCWNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6CisJCWNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorCQkJYnJlYWs7CisJfQorCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIGJ1aWxkaW5nIERMTCB3aXRoIFdhdGNvbSBDICovCisKKyNlbmRpZiAvKiBPUy8yIGVsaWYgX19XSU4zMl9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL1NETF9lcnJvci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9TRExfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjA2YmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9TRExfZXJyb3IuYwpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFNpbXBsZSBlcnJvciBoYW5kbGluZyBpbiBTREwgKi8KKworI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF9lcnJvcl9jLmgiCisKKy8qIFJvdXRpbmUgdG8gZ2V0IHRoZSB0aHJlYWQtc3BlY2lmaWMgZXJyb3IgdmFyaWFibGUgKi8KKyNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAorLyogVGhlICBTRExfYXJyYXlzaXplKFRoZSApLGRlZmF1bHQgKG5vbi10aHJlYWQtc2FmZSkgZ2xvYmFsIGVycm9yIHZhcmlhYmxlICovCitzdGF0aWMgU0RMX2Vycm9yIFNETF9nbG9iYWxfZXJyb3I7CisjZGVmaW5lIFNETF9HZXRFcnJCdWYoKQkoJlNETF9nbG9iYWxfZXJyb3IpCisjZWxzZQorZXh0ZXJuIFNETF9lcnJvciAqU0RMX0dldEVyckJ1Zih2b2lkKTsKKyNlbmRpZiAvKiBTRExfVEhSRUFEU19ESVNBQkxFRCAqLworCisjZGVmaW5lIFNETF9FUlJCVUZJWkUJMTAyNAorCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX0xvb2t1cFN0cmluZyhjb25zdCBjaGFyICprZXkpCit7CisJLyogRklYTUU6IEFkZCBjb2RlIHRvIGxvb2t1cCBrZXkgaW4gbGFuZ3VhZ2Ugc3RyaW5nIGhhc2gtdGFibGUgKi8KKwlyZXR1cm4ga2V5OworfQorCisvKiBQdWJsaWMgZnVuY3Rpb25zICovCisKK3ZvaWQgU0RMX1NldEVycm9yIChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCVNETF9lcnJvciAqZXJyb3I7CisKKwkvKiBDb3B5IGluIHRoZSBrZXksIG1hcmsgZXJyb3IgYXMgdmFsaWQgKi8KKwllcnJvciA9IFNETF9HZXRFcnJCdWYoKTsKKwllcnJvci0+ZXJyb3IgPSAxOworCVNETF9zdHJsY3B5KChjaGFyICopZXJyb3ItPmtleSwgZm10LCBzaXplb2YoZXJyb3ItPmtleSkpOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJZXJyb3ItPmFyZ2MgPSAwOworCXdoaWxlICggKmZtdCApIHsKKwkJaWYgKCAqZm10KysgPT0gJyUnICkgeworCQkJd2hpbGUgKCAqZm10ID09ICcuJyB8fCAoKmZtdCA+PSAnMCcgJiYgKmZtdCA8PSAnOScpICkgeworCQkJCSsrZm10OworCQkJfQorCQkJc3dpdGNoICgqZm10KyspIHsKKwkJCSAgICBjYXNlIDA6ICAvKiBNYWxmb3JtZWQgZm9ybWF0IHN0cmluZy4uICovCisJCQkJLS1mbXQ7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSAnYyc6CisJCQkgICAgY2FzZSAnaSc6CisJCQkgICAgY2FzZSAnZCc6CisJCQkgICAgY2FzZSAndSc6CisJCQkgICAgY2FzZSAnbyc6CisJCQkgICAgY2FzZSAneCc6CisJCQkgICAgY2FzZSAnWCc6CisJCQkJZXJyb3ItPmFyZ3NbZXJyb3ItPmFyZ2MrK10udmFsdWVfaSA9CisJCQkJCQkJdmFfYXJnKGFwLCBpbnQpOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgJ2YnOgorCQkJCWVycm9yLT5hcmdzW2Vycm9yLT5hcmdjKytdLnZhbHVlX2YgPQorCQkJCQkJCXZhX2FyZyhhcCwgZG91YmxlKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlICdwJzoKKwkJCQllcnJvci0+YXJnc1tlcnJvci0+YXJnYysrXS52YWx1ZV9wdHIgPQorCQkJCQkJCXZhX2FyZyhhcCwgdm9pZCAqKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlICdzJzoKKwkJCQl7CisJCQkJICBpbnQgaSA9IGVycm9yLT5hcmdjOworCQkJCSAgY29uc3QgY2hhciAqc3RyID0gdmFfYXJnKGFwLCBjb25zdCBjaGFyICopOworCQkJCSAgaWYgKHN0ciA9PSBOVUxMKQorCQkJCSAgICAgIHN0ciA9ICIobnVsbCkiOworCQkJCSAgU0RMX3N0cmxjcHkoKGNoYXIgKillcnJvci0+YXJnc1tpXS5idWYsIHN0ciwgRVJSX01BWF9TVFJMRU4pOworCQkJCSAgZXJyb3ItPmFyZ2MrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgICAgZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICggZXJyb3ItPmFyZ2MgPj0gRVJSX01BWF9BUkdTICkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXZhX2VuZChhcCk7CisKKwkvKiBJZiB3ZSBhcmUgaW4gZGVidWcgbW9kZSwgcHJpbnQgb3V0IGFuIGVycm9yIG1lc3NhZ2UgKi8KKyNpZmRlZiBERUJVR19FUlJPUgorCWZwcmludGYoc3RkZXJyLCAiU0RMX1NldEVycm9yOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworI2VuZGlmCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaGFzIGEgYml0IG1vcmUgb3ZlcmhlYWQgdGhhbiBtb3N0IGVycm9yIGZ1bmN0aW9ucworICAgc28gdGhhdCBpdCBzdXBwb3J0cyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgdGhyZWFkLXNhZmUgZXJyb3JzLgorKi8KK2NoYXIgKlNETF9HZXRFcnJvck1zZyhjaGFyICplcnJzdHIsIHVuc2lnbmVkIGludCBtYXhsZW4pCit7CisJU0RMX2Vycm9yICplcnJvcjsKKworCS8qIENsZWFyIHRoZSBlcnJvciBzdHJpbmcgKi8KKwkqZXJyc3RyID0gJ1wwJzsgLS1tYXhsZW47CisKKwkvKiBHZXQgdGhlIHRocmVhZC1zYWZlIGVycm9yLCBhbmQgcHJpbnQgaXQgb3V0ICovCisJZXJyb3IgPSBTRExfR2V0RXJyQnVmKCk7CisJaWYgKCBlcnJvci0+ZXJyb3IgKSB7CisJCWNvbnN0IGNoYXIgKmZtdDsKKwkJY2hhciAqbXNnID0gZXJyc3RyOworCQlpbnQgbGVuOworCQlpbnQgYXJnaTsKKworCQlmbXQgPSBTRExfTG9va3VwU3RyaW5nKGVycm9yLT5rZXkpOworCQlhcmdpID0gMDsKKwkJd2hpbGUgKCAqZm10ICYmIChtYXhsZW4gPiAwKSApIHsKKwkJCWlmICggKmZtdCA9PSAnJScgKSB7CisJCQkJY2hhciB0bXBbMzJdLCAqc3BvdCA9IHRtcDsKKwkJCQkqc3BvdCsrID0gKmZtdCsrOworCQkJCXdoaWxlICggKCpmbXQgPT0gJy4nIHx8ICgqZm10ID49ICcwJyAmJiAqZm10IDw9ICc5JykpICYmIHNwb3QgPCAodG1wK1NETF9hcnJheXNpemUodG1wKS0yKSApIHsKKwkJCQkJKnNwb3QrKyA9ICpmbXQrKzsKKwkJCQl9CisJCQkJKnNwb3QrKyA9ICpmbXQrKzsKKwkJCQkqc3BvdCsrID0gJ1wwJzsKKwkJCQlzd2l0Y2ggKHNwb3RbLTJdKSB7CisJCQkJICAgIGNhc2UgJyUnOgorCQkJCQkqbXNnKysgPSAnJSc7CisJCQkJCW1heGxlbiAtPSAxOworCQkJCQlicmVhazsKKwkJCQkgICAgY2FzZSAnYyc6CisJCQkJICAgIGNhc2UgJ2knOgorCQkJICAgICAgICAgICAgY2FzZSAnZCc6CisJCQkgICAgICAgICAgICBjYXNlICd1JzoKKwkJCSAgICAgICAgICAgIGNhc2UgJ28nOgorCQkJCSAgICBjYXNlICd4JzoKKwkJCQkgICAgY2FzZSAnWCc6CisJCQkJCWxlbiA9IFNETF9zbnByaW50Zihtc2csIG1heGxlbiwgdG1wLCBlcnJvci0+YXJnc1thcmdpKytdLnZhbHVlX2kpOworCQkJCQltc2cgKz0gbGVuOworCQkJCQltYXhsZW4gLT0gbGVuOworCQkJCQlicmVhazsKKwkJCQkgICAgY2FzZSAnZic6CisJCQkJCWxlbiA9IFNETF9zbnByaW50Zihtc2csIG1heGxlbiwgdG1wLCBlcnJvci0+YXJnc1thcmdpKytdLnZhbHVlX2YpOworCQkJCQltc2cgKz0gbGVuOworCQkJCQltYXhsZW4gLT0gbGVuOworCQkJCQlicmVhazsKKwkJCQkgICAgY2FzZSAncCc6CisJCQkJCWxlbiA9IFNETF9zbnByaW50Zihtc2csIG1heGxlbiwgdG1wLCBlcnJvci0+YXJnc1thcmdpKytdLnZhbHVlX3B0cik7CisJCQkJCW1zZyArPSBsZW47CisJCQkJCW1heGxlbiAtPSBsZW47CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlICdzJzoKKwkJCQkJbGVuID0gU0RMX3NucHJpbnRmKG1zZywgbWF4bGVuLCB0bXAsIFNETF9Mb29rdXBTdHJpbmcoZXJyb3ItPmFyZ3NbYXJnaSsrXS5idWYpKTsKKwkJCQkJbXNnICs9IGxlbjsKKwkJCQkJbWF4bGVuIC09IGxlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkqbXNnKysgPSAqZm10Kys7CisJCQkJbWF4bGVuIC09IDE7CisJCQl9CisJCX0KKwkJKm1zZyA9IDA7CS8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwl9CisJcmV0dXJuKGVycnN0cik7Cit9CisKKy8qIEF2YWlsYWJsZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KK2NoYXIgKlNETF9HZXRFcnJvciAodm9pZCkKK3sKKwlzdGF0aWMgY2hhciBlcnJtc2dbU0RMX0VSUkJVRklaRV07CisKKwlyZXR1cm4oKGNoYXIgKilTRExfR2V0RXJyb3JNc2coZXJybXNnLCBTRExfRVJSQlVGSVpFKSk7Cit9CisKK3ZvaWQgU0RMX0NsZWFyRXJyb3Iodm9pZCkKK3sKKwlTRExfZXJyb3IgKmVycm9yOworCisJZXJyb3IgPSBTRExfR2V0RXJyQnVmKCk7CisJZXJyb3ItPmVycm9yID0gMDsKK30KKworLyogVmVyeSBjb21tb24gZXJyb3JzIGdvIGhlcmUgKi8KK3ZvaWQgU0RMX0Vycm9yKFNETF9lcnJvcmNvZGUgY29kZSkKK3sKKwlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSBTRExfRU5PTUVNOgorCQkJU0RMX1NldEVycm9yKCJPdXQgb2YgbWVtb3J5Iik7CisJCQlicmVhazsKKwkJY2FzZSBTRExfRUZSRUFEOgorCQkJU0RMX1NldEVycm9yKCJFcnJvciByZWFkaW5nIGZyb20gZGF0YXN0cmVhbSIpOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX0VGV1JJVEU6CisJCQlTRExfU2V0RXJyb3IoIkVycm9yIHdyaXRpbmcgdG8gZGF0YXN0cmVhbSIpOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX0VGU0VFSzoKKwkJCVNETF9TZXRFcnJvcigiRXJyb3Igc2Vla2luZyBpbiBkYXRhc3RyZWFtIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNETF9TZXRFcnJvcigiVW5rbm93biBTREwgZXJyb3IiKTsKKwkJCWJyZWFrOworCX0KK30KKworI2lmZGVmIFRFU1RfRVJST1IKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciBidWZmZXJbQlVGU0laKzFdOworCisJU0RMX1NldEVycm9yKCJIaSB0aGVyZSEiKTsKKwlwcmludGYoIkVycm9yIDE6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJU0RMX0NsZWFyRXJyb3IoKTsKKwlTRExfbWVtc2V0KGJ1ZmZlciwgJzEnLCBCVUZTSVopOworCWJ1ZmZlcltCVUZTSVpdID0gMDsKKwlTRExfU2V0RXJyb3IoIlRoaXMgaXMgdGhlIGVycm9yOiAlcyAoJWYpIiwgYnVmZmVyLCAxLjApOworCXByaW50ZigiRXJyb3IgMjogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwlleGl0KDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL1NETF9lcnJvcl9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL1NETF9lcnJvcl9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1NGU0MgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvU0RMX2Vycm9yX2MuaApAQCAtMCwwICsxLDU4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBmaWxlIGRlZmluZXMgYSBzdHJ1Y3R1cmUgdGhhdCBjYXJyaWVzIGxhbmd1YWdlLWluZGVwZW5kZW50CisgICBlcnJvciBtZXNzYWdlcworKi8KKworI2lmbmRlZiBfU0RMX2Vycm9yX2NfaAorI2RlZmluZSBfU0RMX2Vycm9yX2NfaAorCisjZGVmaW5lIEVSUl9NQVhfU1RSTEVOCTEyOAorI2RlZmluZSBFUlJfTUFYX0FSR1MJNQorCit0eXBlZGVmIHN0cnVjdCBTRExfZXJyb3IgeworCS8qIFRoaXMgaXMgYSBudW1lcmljIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgZXJyb3IgKi8KKwlpbnQgZXJyb3I7CisKKwkvKiBUaGlzIGlzIGEga2V5IHVzZWQgdG8gaW5kZXggaW50byBhIGxhbmd1YWdlIGhhc2h0YWJsZSBjb250YWluaW5nCisJICAgaW50ZXJuYXRpb25hbGl6ZWQgdmVyc2lvbnMgb2YgdGhlIFNETCBlcnJvciBtZXNzYWdlcy4gIElmIHRoZSBrZXkKKwkgICBpcyBub3QgaW4gdGhlIGhhc2h0YWJsZSwgb3Igbm8gaGFzaHRhYmxlIGlzIGF2YWlsYWJsZSwgdGhlIGtleSBpcworCSAgIHVzZWQgZGlyZWN0bHkgYXMgYW4gZXJyb3IgbWVzc2FnZSBmb3JtYXQgc3RyaW5nLgorCSovCisJY2hhciBrZXlbRVJSX01BWF9TVFJMRU5dOworCisJLyogVGhlc2UgYXJlIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBlcnJvciBmdW5jdGlvbnMgKi8KKwlpbnQgYXJnYzsKKwl1bmlvbiB7CisJCXZvaWQgKnZhbHVlX3B0cjsKKyNpZiAwCS8qIFdoYXQgaXMgYSBjaGFyYWN0ZXIgYW55d2F5PyAgKFVOSUNPREUgaXNzdWVzKSAqLworCQl1bnNpZ25lZCBjaGFyIHZhbHVlX2M7CisjZW5kaWYKKwkJaW50IHZhbHVlX2k7CisJCWRvdWJsZSB2YWx1ZV9mOworCQljaGFyIGJ1ZltFUlJfTUFYX1NUUkxFTl07CisJfSBhcmdzW0VSUl9NQVhfQVJHU107Cit9IFNETF9lcnJvcjsKKworI2VuZGlmIC8qIF9TRExfZXJyb3JfY19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL1NETF9mYXRhbC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9TRExfZmF0YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDIyYTAxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9TRExfZmF0YWwuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEdlbmVyYWwgZmF0YWwgc2lnbmFsIGhhbmRsaW5nIGNvZGUgZm9yIFNETCAqLworCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfZmF0YWwuaCIKKworLyogVGhpcyBpbnN0YWxscyBzb21lIHNpZ25hbCBoYW5kbGVycyBmb3IgdGhlIG1vcmUgY29tbW9uIGZhdGFsIHNpZ25hbHMsCisgICBzbyB0aGF0IGlmIHRoZSBwcm9ncmFtbWVyIGlzIGxhenksIHRoZSBhcHAgZG9lc24ndCBkaWUgc28gaG9ycmlibHkgaWYKKyAgIHRoZSBwcm9ncmFtIGNyYXNoZXMuCisqLworCitzdGF0aWMgdm9pZCBTRExfUGFyYWNodXRlKGludCBzaWcpCit7CisJc2lnbmFsKHNpZywgU0lHX0RGTCk7CisJU0RMX1F1aXQoKTsKKwlyYWlzZShzaWcpOworfQorCitzdGF0aWMgaW50IFNETF9mYXRhbF9zaWduYWxzW10gPSB7CisJU0lHU0VHViwKKyNpZmRlZiBTSUdCVVMKKwlTSUdCVVMsCisjZW5kaWYKKyNpZmRlZiBTSUdGUEUKKwlTSUdGUEUsCisjZW5kaWYKKyNpZmRlZiBTSUdRVUlUCisJU0lHUVVJVCwKKyNlbmRpZgorCTAKK307CisKK3ZvaWQgU0RMX0luc3RhbGxQYXJhY2h1dGUodm9pZCkKK3sKKwkvKiBTZXQgYSBoYW5kbGVyIGZvciBhbnkgZmF0YWwgc2lnbmFsIG5vdCBhbHJlYWR5IGhhbmRsZWQgKi8KKwlpbnQgaTsKKyNpZmRlZiBIQVZFX1NJR0FDVElPTgorCXN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOworCisJZm9yICggaT0wOyBTRExfZmF0YWxfc2lnbmFsc1tpXTsgKytpICkgeworCQlzaWdhY3Rpb24oU0RMX2ZhdGFsX3NpZ25hbHNbaV0sIE5VTEwsICZhY3Rpb24pOworCQlpZiAoIGFjdGlvbi5zYV9oYW5kbGVyID09IFNJR19ERkwgKSB7CisJCQlhY3Rpb24uc2FfaGFuZGxlciA9IFNETF9QYXJhY2h1dGU7CisJCQlzaWdhY3Rpb24oU0RMX2ZhdGFsX3NpZ25hbHNbaV0sICZhY3Rpb24sIE5VTEwpOworCQl9CisJfQorI2lmZGVmIFNJR0FMUk0KKwkvKiBTZXQgU0lHQUxSTSB0byBiZSBpZ25vcmVkIC0tIG5lY2Vzc2FyeSBvbiBTb2xhcmlzICovCisJc2lnYWN0aW9uKFNJR0FMUk0sIE5VTEwsICZhY3Rpb24pOworCWlmICggYWN0aW9uLnNhX2hhbmRsZXIgPT0gU0lHX0RGTCApIHsKKwkJYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworCQlzaWdhY3Rpb24oU0lHQUxSTSwgJmFjdGlvbiwgTlVMTCk7CisJfQorI2VuZGlmCisjZWxzZQorCXZvaWQgKCpvaGFuZGxlcikoaW50KTsKKworCWZvciAoIGk9MDsgU0RMX2ZhdGFsX3NpZ25hbHNbaV07ICsraSApIHsKKwkJb2hhbmRsZXIgPSBzaWduYWwoU0RMX2ZhdGFsX3NpZ25hbHNbaV0sIFNETF9QYXJhY2h1dGUpOworCQlpZiAoIG9oYW5kbGVyICE9IFNJR19ERkwgKSB7CisJCQlzaWduYWwoU0RMX2ZhdGFsX3NpZ25hbHNbaV0sIG9oYW5kbGVyKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBIQVZFX1NJR0FDVElPTiAqLworCXJldHVybjsKK30KKwordm9pZCBTRExfVW5pbnN0YWxsUGFyYWNodXRlKHZvaWQpCit7CisJLyogUmVtb3ZlIGEgaGFuZGxlciBmb3IgYW55IGZhdGFsIHNpZ25hbCBoYW5kbGVkICovCisJaW50IGk7CisjaWZkZWYgSEFWRV9TSUdBQ1RJT04KKwlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdGlvbjsKKworCWZvciAoIGk9MDsgU0RMX2ZhdGFsX3NpZ25hbHNbaV07ICsraSApIHsKKwkJc2lnYWN0aW9uKFNETF9mYXRhbF9zaWduYWxzW2ldLCBOVUxMLCAmYWN0aW9uKTsKKwkJaWYgKCBhY3Rpb24uc2FfaGFuZGxlciA9PSBTRExfUGFyYWNodXRlICkgeworCQkJYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfREZMOworCQkJc2lnYWN0aW9uKFNETF9mYXRhbF9zaWduYWxzW2ldLCAmYWN0aW9uLCBOVUxMKTsKKwkJfQorCX0KKyNlbHNlCisJdm9pZCAoKm9oYW5kbGVyKShpbnQpOworCisJZm9yICggaT0wOyBTRExfZmF0YWxfc2lnbmFsc1tpXTsgKytpICkgeworCQlvaGFuZGxlciA9IHNpZ25hbChTRExfZmF0YWxfc2lnbmFsc1tpXSwgU0lHX0RGTCk7CisJCWlmICggb2hhbmRsZXIgIT0gU0RMX1BhcmFjaHV0ZSApIHsKKwkJCXNpZ25hbChTRExfZmF0YWxfc2lnbmFsc1tpXSwgb2hhbmRsZXIpOworCQl9CisJfQorI2VuZGlmIC8qIEhBVkVfU0lHQUNUSU9OICovCit9CisKKyNlbHNlCisKKy8qIE5vIHNpZ25hbHMgb24gdGhpcyBwbGF0Zm9ybSwgbm90aGluZyB0byBkby4uICovCisKK3ZvaWQgU0RMX0luc3RhbGxQYXJhY2h1dGUodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgU0RMX1VuaW5zdGFsbFBhcmFjaHV0ZSh2b2lkKQoreworCXJldHVybjsKK30KKworI2VuZGlmIC8qIEhBVkVfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvU0RMX2ZhdGFsLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL1NETF9mYXRhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ODk3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL1NETF9mYXRhbC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBHZW5lcmFsIGZhdGFsIHNpZ25hbCBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KKworZXh0ZXJuIHZvaWQgU0RMX0luc3RhbGxQYXJhY2h1dGUodm9pZCk7CitleHRlcm4gdm9pZCBTRExfVW5pbnN0YWxsUGFyYWNodXRlKHZvaWQpOworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9hdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWIyNmUwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfYXVkaW8uYwpAQCAtMCwwICsxLDcwMyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIlNETF9hdWRpb21lbS5oIgorI2luY2x1ZGUgIlNETF9zeXNhdWRpby5oIgorCisjaWZkZWYgX19PUzJfXworLyogV2UnbGwgbmVlZCB0aGUgRG9zU2V0UHJpb3JpdHkoKSBBUEkhICovCisjZGVmaW5lIElOQ0xfRE9TUFJPQ0VTUworI2luY2x1ZGUgPG9zMi5oPgorI2VuZGlmCisKKy8qIEF2YWlsYWJsZSBhdWRpbyBkcml2ZXJzICovCitzdGF0aWMgQXVkaW9Cb290U3RyYXAgKmJvb3RzdHJhcFtdID0geworI2lmIFNETF9BVURJT19EUklWRVJfUFVMU0UKKwkmUFVMU0VfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9BTFNBCisJJkFMU0FfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9CU0QKKwkmQlNEX0FVRElPX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfT1NTCisJJkRTUF9ib290c3RyYXAsCisJJkRNQV9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX1FOWE5UTworCSZRTlhOVE9BVURJT19ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX1NVTkFVRElPCisJJlNVTkFVRElPX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfRE1FRElBCisJJkRNRURJQV9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX0FSVFMKKwkmQVJUU19ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX0VTRAorCSZFU0RfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9OQVMKKwkmTkFTX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfRFNPVU5ECisJJkRTT1VORF9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX1dBVkVPVVQKKwkmV0FWRU9VVF9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX1BBVUQKKwkmUGF1ZF9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX0JBVURJTworCSZCQVVESU9fYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9DT1JFQVVESU8KKwkmQ09SRUFVRElPX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfU05ETUdSCisJJlNORE1HUl9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX01JTlQKKwkmTUlOVEFVRElPX0dTWEJfYm9vdHN0cmFwLAorCSZNSU5UQVVESU9fTUNTTl9ib290c3RyYXAsCisJJk1JTlRBVURJT19TVEZBX2Jvb3RzdHJhcCwKKwkmTUlOVEFVRElPX1hCSU9TX2Jvb3RzdHJhcCwKKwkmTUlOVEFVRElPX0RNQThfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9ESVNLCisJJkRJU0tBVURfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9EVU1NWQorCSZEVU1NWUFVRF9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX0RDCisJJkRDQVVEX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfTkRTCisJJk5EU0FVRF9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX01NRUFVRElPCisJJk1NRUFVRElPX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfREFSVAorCSZEQVJUX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfRVBPQ0FVRElPCisJJkVQT0NBdWRpb19ib290c3RyYXAsCisjZW5kaWYKKwlOVUxMCit9OworU0RMX0F1ZGlvRGV2aWNlICpjdXJyZW50X2F1ZGlvID0gTlVMTDsKKworLyogVmFyaW91cyBsb2NhbCBmdW5jdGlvbnMgKi8KK2ludCBTRExfQXVkaW9Jbml0KGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lKTsKK3ZvaWQgU0RMX0F1ZGlvUXVpdCh2b2lkKTsKKworLyogVGhlIGdlbmVyYWwgbWl4aW5nIHRocmVhZCBmdW5jdGlvbiAqLworaW50IFNETENBTEwgU0RMX1J1bkF1ZGlvKHZvaWQgKmF1ZGlvcCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKmF1ZGlvID0gKFNETF9BdWRpb0RldmljZSAqKWF1ZGlvcDsKKwlVaW50OCAqc3RyZWFtOworCWludCAgICBzdHJlYW1fbGVuOworCXZvaWQgICp1ZGF0YTsKKwl2b2lkIChTRExDQUxMICpmaWxsKSh2b2lkICp1c2VyZGF0YSxVaW50OCAqc3RyZWFtLCBpbnQgbGVuKTsKKwlpbnQgICAgc2lsZW5jZTsKKworCS8qIFBlcmZvcm0gYW55IHRocmVhZCBzZXR1cCAqLworCWlmICggYXVkaW8tPlRocmVhZEluaXQgKSB7CisJCWF1ZGlvLT5UaHJlYWRJbml0KGF1ZGlvKTsKKwl9CisJYXVkaW8tPnRocmVhZGlkID0gU0RMX1RocmVhZElEKCk7CisKKwkvKiBTZXQgdXAgdGhlIG1peGluZyBmdW5jdGlvbiAqLworCWZpbGwgID0gYXVkaW8tPnNwZWMuY2FsbGJhY2s7CisJdWRhdGEgPSBhdWRpby0+c3BlYy51c2VyZGF0YTsKKworCWlmICggYXVkaW8tPmNvbnZlcnQubmVlZGVkICkgeworCQlpZiAoIGF1ZGlvLT5jb252ZXJ0LnNyY19mb3JtYXQgPT0gQVVESU9fVTggKSB7CisJCQlzaWxlbmNlID0gMHg4MDsKKwkJfSBlbHNlIHsKKwkJCXNpbGVuY2UgPSAwOworCQl9CisJCXN0cmVhbV9sZW4gPSBhdWRpby0+Y29udmVydC5sZW47CisJfSBlbHNlIHsKKwkJc2lsZW5jZSA9IGF1ZGlvLT5zcGVjLnNpbGVuY2U7CisJCXN0cmVhbV9sZW4gPSBhdWRpby0+c3BlYy5zaXplOworCX0KKworI2lmZGVmIF9fT1MyX18KKyAgICAgICAgLyogSW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGhyZWFkIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICAgIHRoZSBhdWRpbyB3aWxsIGJlIGNvbnRpbnVvdXMgYWxsIHRoZSB0aW1lISAqLworI2lmZGVmIFVTRV9ET1NTRVRQUklPUklUWQorICAgICAgICBpZiAoU0RMX2dldGVudigiU0RMX1VTRV9USU1FQ1JJVElDQUxfQVVESU8iKSkKKyAgICAgICAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgICAgICAgcHJpbnRmKCJbU0RMX1J1bkF1ZGlvXSA6IFNldHRpbmcgcHJpb3JpdHkgdG8gVGltZUNyaXRpY2FsKzAhIChUSUQlZClcbiIsIFNETF9UaHJlYWRJRCgpKTsKKyNlbmRpZgorICAgICAgICAgIERvc1NldFByaW9yaXR5KFBSVFlTX1RIUkVBRCwgUFJUWUNfVElNRUNSSVRJQ0FMLCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgICAgIHByaW50ZigiW1NETF9SdW5BdWRpb10gOiBTZXR0aW5nIHByaW9yaXR5IHRvIEZvcmVncm91bmRTZXJ2ZXIrMCEgKFRJRCVkKVxuIiwgU0RMX1RocmVhZElEKCkpOworI2VuZGlmCisgICAgICAgICAgRG9zU2V0UHJpb3JpdHkoUFJUWVNfVEhSRUFELCBQUlRZQ19GT1JFR1JPVU5EU0VSVkVSLCAwLCAwKTsKKyAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKworCS8qIExvb3AsIGZpbGxpbmcgdGhlIGF1ZGlvIGJ1ZmZlcnMgKi8KKwl3aGlsZSAoIGF1ZGlvLT5lbmFibGVkICkgeworCisJCS8qIEZpbGwgdGhlIGN1cnJlbnQgYnVmZmVyIHdpdGggc291bmQgKi8KKwkJaWYgKCBhdWRpby0+Y29udmVydC5uZWVkZWQgKSB7CisJCQlpZiAoIGF1ZGlvLT5jb252ZXJ0LmJ1ZiApIHsKKwkJCQlzdHJlYW0gPSBhdWRpby0+Y29udmVydC5idWY7CisJCQl9IGVsc2UgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RyZWFtID0gYXVkaW8tPkdldEF1ZGlvQnVmKGF1ZGlvKTsKKwkJCWlmICggc3RyZWFtID09IE5VTEwgKSB7CisJCQkJc3RyZWFtID0gYXVkaW8tPmZha2Vfc3RyZWFtOworCQkJfQorCQl9CisKKwkJU0RMX21lbXNldChzdHJlYW0sIHNpbGVuY2UsIHN0cmVhbV9sZW4pOworCisJCWlmICggISBhdWRpby0+cGF1c2VkICkgeworCQkJU0RMX211dGV4UChhdWRpby0+bWl4ZXJfbG9jayk7CisJCQkoKmZpbGwpKHVkYXRhLCBzdHJlYW0sIHN0cmVhbV9sZW4pOworCQkJU0RMX211dGV4VihhdWRpby0+bWl4ZXJfbG9jayk7CisJCX0KKworCQkvKiBDb252ZXJ0IHRoZSBhdWRpbyBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKCBhdWRpby0+Y29udmVydC5uZWVkZWQgKSB7CisJCQlTRExfQ29udmVydEF1ZGlvKCZhdWRpby0+Y29udmVydCk7CisJCQlzdHJlYW0gPSBhdWRpby0+R2V0QXVkaW9CdWYoYXVkaW8pOworCQkJaWYgKCBzdHJlYW0gPT0gTlVMTCApIHsKKwkJCQlzdHJlYW0gPSBhdWRpby0+ZmFrZV9zdHJlYW07CisJCQl9CisJCQlTRExfbWVtY3B5KHN0cmVhbSwgYXVkaW8tPmNvbnZlcnQuYnVmLAorCQkJICAgICAgICAgICAgICAgYXVkaW8tPmNvbnZlcnQubGVuX2N2dCk7CisJCX0KKworCQkvKiBSZWFkeSBjdXJyZW50IGJ1ZmZlciBmb3IgcGxheSBhbmQgY2hhbmdlIGN1cnJlbnQgYnVmZmVyICovCisJCWlmICggc3RyZWFtICE9IGF1ZGlvLT5mYWtlX3N0cmVhbSApIHsKKwkJCWF1ZGlvLT5QbGF5QXVkaW8oYXVkaW8pOworCQl9CisKKwkJLyogV2FpdCBmb3IgYW4gYXVkaW8gYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKwkJaWYgKCBzdHJlYW0gPT0gYXVkaW8tPmZha2Vfc3RyZWFtICkgeworCQkJU0RMX0RlbGF5KChhdWRpby0+c3BlYy5zYW1wbGVzKjEwMDApL2F1ZGlvLT5zcGVjLmZyZXEpOworCQl9IGVsc2UgeworCQkJYXVkaW8tPldhaXRBdWRpbyhhdWRpbyk7CisJCX0KKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgYXVkaW8gdG8gZHJhaW4uLiAqLworCWlmICggYXVkaW8tPldhaXREb25lICkgeworCQlhdWRpby0+V2FpdERvbmUoYXVkaW8pOworCX0KKworI2lmZGVmIF9fT1MyX18KKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgICBwcmludGYoIltTRExfUnVuQXVkaW9dIDogVGFzayBleGl0aW5nLiAoVElEJWQpXG4iLCBTRExfVGhyZWFkSUQoKSk7CisjZW5kaWYKKyNlbmRpZgorCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgU0RMX0xvY2tBdWRpb19EZWZhdWx0KFNETF9BdWRpb0RldmljZSAqYXVkaW8pCit7CisJaWYgKCBhdWRpby0+dGhyZWFkICYmIChTRExfVGhyZWFkSUQoKSA9PSBhdWRpby0+dGhyZWFkaWQpICkgeworCQlyZXR1cm47CisJfQorCVNETF9tdXRleFAoYXVkaW8tPm1peGVyX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBTRExfVW5sb2NrQXVkaW9fRGVmYXVsdChTRExfQXVkaW9EZXZpY2UgKmF1ZGlvKQoreworCWlmICggYXVkaW8tPnRocmVhZCAmJiAoU0RMX1RocmVhZElEKCkgPT0gYXVkaW8tPnRocmVhZGlkKSApIHsKKwkJcmV0dXJuOworCX0KKwlTRExfbXV0ZXhWKGF1ZGlvLT5taXhlcl9sb2NrKTsKK30KKworc3RhdGljIFVpbnQxNiBTRExfUGFyc2VBdWRpb0Zvcm1hdChjb25zdCBjaGFyICpzdHJpbmcpCit7CisJVWludDE2IGZvcm1hdCA9IDA7CisKKwlzd2l0Y2ggKCpzdHJpbmcpIHsKKwkgICAgY2FzZSAnVSc6CisJCSsrc3RyaW5nOworCQlmb3JtYXQgfD0gMHgwMDAwOworCQlicmVhazsKKwkgICAgY2FzZSAnUyc6CisJCSsrc3RyaW5nOworCQlmb3JtYXQgfD0gMHg4MDAwOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXN3aXRjaCAoU0RMX2F0b2koc3RyaW5nKSkgeworCSAgICBjYXNlIDg6CisJCXN0cmluZyArPSAxOworCQlmb3JtYXQgfD0gODsKKwkJYnJlYWs7CisJICAgIGNhc2UgMTY6CisJCXN0cmluZyArPSAyOworCQlmb3JtYXQgfD0gMTY7CisJCWlmICggU0RMX3N0cmNtcChzdHJpbmcsICJMU0IiKSA9PSAwCisjaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgorCQkgICAgIHx8IFNETF9zdHJjbXAoc3RyaW5nLCAiU1lTIikgPT0gMAorI2VuZGlmCisJCSAgICApIHsKKwkJCWZvcm1hdCB8PSAweDAwMDA7CisJCX0KKwkJaWYgKCBTRExfc3RyY21wKHN0cmluZywgIk1TQiIpID09IDAKKyNpZiBTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOCisJCSAgICAgfHwgU0RMX3N0cmNtcChzdHJpbmcsICJTWVMiKSA9PSAwCisjZW5kaWYKKwkJICAgICkgeworCQkJZm9ybWF0IHw9IDB4MTAwMDsKKwkJfQorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBmb3JtYXQ7Cit9CisKK2ludCBTRExfQXVkaW9Jbml0KGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lKQoreworCVNETF9BdWRpb0RldmljZSAqYXVkaW87CisJaW50IGkgPSAwLCBpZHg7CisKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlICdjdXJyZW50X2F1ZGlvJyAqLworCWlmICggY3VycmVudF9hdWRpbyAhPSBOVUxMICkgeworCQlTRExfQXVkaW9RdWl0KCk7CisJfQorCisJLyogU2VsZWN0IHRoZSBwcm9wZXIgYXVkaW8gZHJpdmVyICovCisJYXVkaW8gPSBOVUxMOworCWlkeCA9IDA7CisjaWYgU0RMX0FVRElPX0RSSVZFUl9FU0QKKwlpZiAoIChkcml2ZXJfbmFtZSA9PSBOVUxMKSAmJiAoU0RMX2dldGVudigiRVNQRUFLRVIiKSAhPSBOVUxMKSApIHsKKwkJLyogQWhlbSwgd2Uga25vdyB0aGF0IGlmIEVTUEVBS0VSIGlzIHNldCwgdXNlciBwcm9iYWJseSB3YW50cworCQkgICB0byB1c2UgRVNELCBidXQgZG9uJ3Qgc3RhcnQgaXQgaWYgaXQncyBub3QgYWxyZWFkeSBydW5uaW5nLgorCQkgICBUaGlzIHByb2JhYmx5IGlzbid0IHRoZSBwbGFjZSB0byBkbyB0aGlzLCBidXQuLi4gU2hoISA6KQorCQkgKi8KKwkJZm9yICggaT0wOyBib290c3RyYXBbaV07ICsraSApIHsKKwkJCWlmICggU0RMX3N0cmNhc2VjbXAoYm9vdHN0cmFwW2ldLT5uYW1lLCAiZXNkIikgPT0gMCApIHsKKyNpZmRlZiBIQVZFX1BVVEVOVgorCQkJCWNvbnN0IGNoYXIgKmVzZF9ub19zcGF3bjsKKworCQkJCS8qIERvbid0IHN0YXJ0IEVTRCBpZiBpdCdzIG5vdCBydW5uaW5nICovCisJCQkJZXNkX25vX3NwYXduID0gZ2V0ZW52KCJFU0RfTk9fU1BBV04iKTsKKwkJCQlpZiAoIGVzZF9ub19zcGF3biA9PSBOVUxMICkgeworCQkJCQlwdXRlbnYoIkVTRF9OT19TUEFXTj0xIik7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKCBib290c3RyYXBbaV0tPmF2YWlsYWJsZSgpICkgeworCQkJCQlhdWRpbyA9IGJvb3RzdHJhcFtpXS0+Y3JlYXRlKDApOworCQkJCQlicmVhazsKKwkJCQl9CisjaWZkZWYgSEFWRV9VTlNFVEVOVgorCQkJCWlmICggZXNkX25vX3NwYXduID09IE5VTEwgKSB7CisJCQkJCXVuc2V0ZW52KCJFU0RfTk9fU1BBV04iKTsKKwkJCQl9CisjZW5kaWYKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBTRExfQVVESU9fRFJJVkVSX0VTRCAqLworCWlmICggYXVkaW8gPT0gTlVMTCApIHsKKwkJaWYgKCBkcml2ZXJfbmFtZSAhPSBOVUxMICkgeworI2lmIDAJLyogVGhpcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBiZXR0ZXIgZHJpdmVyIHNlbGVjdGlvbiBBUEkgKi8KKwkJCWlmICggU0RMX3N0cnJjaHIoZHJpdmVyX25hbWUsICc6JykgIT0gTlVMTCApIHsKKwkJCQlpZHggPSBhdG9pKFNETF9zdHJyY2hyKGRyaXZlcl9uYW1lLCAnOicpKzEpOworCQkJfQorI2VuZGlmCisJCQlmb3IgKCBpPTA7IGJvb3RzdHJhcFtpXTsgKytpICkgeworCQkJCWlmIChTRExfc3RyY2FzZWNtcChib290c3RyYXBbaV0tPm5hbWUsIGRyaXZlcl9uYW1lKSA9PSAwKSB7CisJCQkJCWlmICggYm9vdHN0cmFwW2ldLT5hdmFpbGFibGUoKSApIHsKKwkJCQkJCWF1ZGlvPWJvb3RzdHJhcFtpXS0+Y3JlYXRlKGlkeCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoIGk9MDsgYm9vdHN0cmFwW2ldOyArK2kgKSB7CisJCQkJaWYgKCBib290c3RyYXBbaV0tPmF2YWlsYWJsZSgpICkgeworCQkJCQlhdWRpbyA9IGJvb3RzdHJhcFtpXS0+Y3JlYXRlKGlkeCk7CisJCQkJCWlmICggYXVkaW8gIT0gTlVMTCApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmICggYXVkaW8gPT0gTlVMTCApIHsKKwkJCVNETF9TZXRFcnJvcigiTm8gYXZhaWxhYmxlIGF1ZGlvIGRldmljZSIpOworI2lmIDAgLyogRG9uJ3QgZmFpbCBTRExfSW5pdCgpIGlmIGF1ZGlvIGlzbid0IGF2YWlsYWJsZS4KKyAgICAgICAgIFNETF9PcGVuQXVkaW8oKSB3aWxsIGhhbmRsZSBpdCBhdCB0aGF0IHBvaW50LiAgKnNpZ2gqCisgICAgICAgKi8KKwkJCXJldHVybigtMSk7CisjZW5kaWYKKwkJfQorCX0KKwljdXJyZW50X2F1ZGlvID0gYXVkaW87CisJaWYgKCBjdXJyZW50X2F1ZGlvICkgeworCQljdXJyZW50X2F1ZGlvLT5uYW1lID0gYm9vdHN0cmFwW2ldLT5uYW1lOworCQlpZiAoICFjdXJyZW50X2F1ZGlvLT5Mb2NrQXVkaW8gJiYgIWN1cnJlbnRfYXVkaW8tPlVubG9ja0F1ZGlvICkgeworCQkJY3VycmVudF9hdWRpby0+TG9ja0F1ZGlvID0gU0RMX0xvY2tBdWRpb19EZWZhdWx0OworCQkJY3VycmVudF9hdWRpby0+VW5sb2NrQXVkaW8gPSBTRExfVW5sb2NrQXVkaW9fRGVmYXVsdDsKKwkJfQorCX0KKwlyZXR1cm4oMCk7Cit9CisKK2NoYXIgKlNETF9BdWRpb0RyaXZlck5hbWUoY2hhciAqbmFtZWJ1ZiwgaW50IG1heGxlbikKK3sKKwlpZiAoIGN1cnJlbnRfYXVkaW8gIT0gTlVMTCApIHsKKwkJU0RMX3N0cmxjcHkobmFtZWJ1ZiwgY3VycmVudF9hdWRpby0+bmFtZSwgbWF4bGVuKTsKKwkJcmV0dXJuKG5hbWVidWYpOworCX0KKwlyZXR1cm4oTlVMTCk7Cit9CisKK2ludCBTRExfT3BlbkF1ZGlvKFNETF9BdWRpb1NwZWMgKmRlc2lyZWQsIFNETF9BdWRpb1NwZWMgKm9idGFpbmVkKQoreworCVNETF9BdWRpb0RldmljZSAqYXVkaW87CisJY29uc3QgY2hhciAqZW52OworCisJLyogU3RhcnQgdXAgdGhlIGF1ZGlvIGRyaXZlciwgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCAhIGN1cnJlbnRfYXVkaW8gKSB7CisJCWlmICggKFNETF9Jbml0U3ViU3lzdGVtKFNETF9JTklUX0FVRElPKSA8IDApIHx8CisJCSAgICAgKGN1cnJlbnRfYXVkaW8gPT0gTlVMTCkgKSB7CisJCQlyZXR1cm4oLTEpOworCQl9CisJfQorCWF1ZGlvID0gY3VycmVudF9hdWRpbzsKKworCWlmIChhdWRpby0+b3BlbmVkKSB7CisJCVNETF9TZXRFcnJvcigiQXVkaW8gZGV2aWNlIGlzIGFscmVhZHkgb3BlbmVkIik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogVmVyaWZ5IHNvbWUgcGFyYW1ldGVycyAqLworCWlmICggZGVzaXJlZC0+ZnJlcSA9PSAwICkgeworCQllbnYgPSBTRExfZ2V0ZW52KCJTRExfQVVESU9fRlJFUVVFTkNZIik7CisJCWlmICggZW52ICkgeworCQkJZGVzaXJlZC0+ZnJlcSA9IFNETF9hdG9pKGVudik7CisJCX0KKwl9CisJaWYgKCBkZXNpcmVkLT5mcmVxID09IDAgKSB7CisJCS8qIFBpY2sgc29tZSBkZWZhdWx0IGF1ZGlvIGZyZXF1ZW5jeSAqLworCQlkZXNpcmVkLT5mcmVxID0gMjIwNTA7CisJfQorCWlmICggZGVzaXJlZC0+Zm9ybWF0ID09IDAgKSB7CisJCWVudiA9IFNETF9nZXRlbnYoIlNETF9BVURJT19GT1JNQVQiKTsKKwkJaWYgKCBlbnYgKSB7CisJCQlkZXNpcmVkLT5mb3JtYXQgPSBTRExfUGFyc2VBdWRpb0Zvcm1hdChlbnYpOworCQl9CisJfQorCWlmICggZGVzaXJlZC0+Zm9ybWF0ID09IDAgKSB7CisJCS8qIFBpY2sgc29tZSBkZWZhdWx0IGF1ZGlvIGZvcm1hdCAqLworCQlkZXNpcmVkLT5mb3JtYXQgPSBBVURJT19TMTY7CisJfQorCWlmICggZGVzaXJlZC0+Y2hhbm5lbHMgPT0gMCApIHsKKwkJZW52ID0gU0RMX2dldGVudigiU0RMX0FVRElPX0NIQU5ORUxTIik7CisJCWlmICggZW52ICkgeworCQkJZGVzaXJlZC0+Y2hhbm5lbHMgPSAoVWludDgpU0RMX2F0b2koZW52KTsKKwkJfQorCX0KKwlpZiAoIGRlc2lyZWQtPmNoYW5uZWxzID09IDAgKSB7CisJCS8qIFBpY2sgYSBkZWZhdWx0IG51bWJlciBvZiBjaGFubmVscyAqLworCQlkZXNpcmVkLT5jaGFubmVscyA9IDI7CisJfQorCXN3aXRjaCAoIGRlc2lyZWQtPmNoYW5uZWxzICkgeworCSAgICBjYXNlIDE6CS8qIE1vbm8gKi8KKwkgICAgY2FzZSAyOgkvKiBTdGVyZW8gKi8KKwkgICAgY2FzZSA0OgkvKiBzdXJyb3VuZCAqLworCSAgICBjYXNlIDY6CS8qIHN1cnJvdW5kIHdpdGggY2VudGVyIGFuZCBsZmUgKi8KKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCVNETF9TZXRFcnJvcigiMSAobW9ubykgYW5kIDIgKHN0ZXJlbykgY2hhbm5lbHMgc3VwcG9ydGVkIik7CisJCXJldHVybigtMSk7CisJfQorCWlmICggZGVzaXJlZC0+c2FtcGxlcyA9PSAwICkgeworCQllbnYgPSBTRExfZ2V0ZW52KCJTRExfQVVESU9fU0FNUExFUyIpOworCQlpZiAoIGVudiApIHsKKwkJCWRlc2lyZWQtPnNhbXBsZXMgPSAoVWludDE2KVNETF9hdG9pKGVudik7CisJCX0KKwl9CisJaWYgKCBkZXNpcmVkLT5zYW1wbGVzID09IDAgKSB7CisJCS8qIFBpY2sgYSBkZWZhdWx0IG9mIH40NiBtcyBhdCBkZXNpcmVkIGZyZXF1ZW5jeSAqLworCQlpbnQgc2FtcGxlcyA9IChkZXNpcmVkLT5mcmVxIC8gMTAwMCkgKiA0NjsKKwkJaW50IHBvd2VyMiA9IDE7CisJCXdoaWxlICggcG93ZXIyIDwgc2FtcGxlcyApIHsKKwkJCXBvd2VyMiAqPSAyOworCQl9CisJCWRlc2lyZWQtPnNhbXBsZXMgPSBwb3dlcjI7CisJfQorCWlmICggZGVzaXJlZC0+Y2FsbGJhY2sgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJTRExfT3BlbkF1ZGlvKCkgcGFzc2VkIGEgTlVMTCBjYWxsYmFjayIpOworCQlyZXR1cm4oLTEpOworCX0KKworI2lmIFNETF9USFJFQURTX0RJU0FCTEVECisJLyogVXNlcyBpbnRlcnJ1cHQgZHJpdmVuIGF1ZGlvLCB3aXRob3V0IHRocmVhZCAqLworI2Vsc2UKKwkvKiBDcmVhdGUgYSBzZW1hcGhvcmUgZm9yIGxvY2tpbmcgdGhlIHNvdW5kIGJ1ZmZlcnMgKi8KKwlhdWRpby0+bWl4ZXJfbG9jayA9IFNETF9DcmVhdGVNdXRleCgpOworCWlmICggYXVkaW8tPm1peGVyX2xvY2sgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgbWl4ZXIgbG9jayIpOworCQlTRExfQ2xvc2VBdWRpbygpOworCQlyZXR1cm4oLTEpOworCX0KKyNlbmRpZiAvKiBTRExfVEhSRUFEU19ESVNBQkxFRCAqLworCisJLyogQ2FsY3VsYXRlIHRoZSBzaWxlbmNlIGFuZCBzaXplIG9mIHRoZSBhdWRpbyBzcGVjaWZpY2F0aW9uICovCisJU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhkZXNpcmVkKTsKKworCS8qIE9wZW4gdGhlIGF1ZGlvIHN1YnN5c3RlbSAqLworCVNETF9tZW1jcHkoJmF1ZGlvLT5zcGVjLCBkZXNpcmVkLCBzaXplb2YoYXVkaW8tPnNwZWMpKTsKKwlhdWRpby0+Y29udmVydC5uZWVkZWQgPSAwOworCWF1ZGlvLT5lbmFibGVkID0gMTsKKwlhdWRpby0+cGF1c2VkICA9IDE7CisKKwlhdWRpby0+b3BlbmVkID0gYXVkaW8tPk9wZW5BdWRpbyhhdWRpbywgJmF1ZGlvLT5zcGVjKSsxOworCisJaWYgKCAhIGF1ZGlvLT5vcGVuZWQgKSB7CisJCVNETF9DbG9zZUF1ZGlvKCk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogSWYgdGhlIGF1ZGlvIGRyaXZlciBjaGFuZ2VzIHRoZSBidWZmZXIgc2l6ZSwgYWNjZXB0IGl0ICovCisJaWYgKCBhdWRpby0+c3BlYy5zYW1wbGVzICE9IGRlc2lyZWQtPnNhbXBsZXMgKSB7CisJCWRlc2lyZWQtPnNhbXBsZXMgPSBhdWRpby0+c3BlYy5zYW1wbGVzOworCQlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKGRlc2lyZWQpOworCX0KKworCS8qIEFsbG9jYXRlIGEgZmFrZSBhdWRpbyBtZW1vcnkgYnVmZmVyICovCisJYXVkaW8tPmZha2Vfc3RyZWFtID0gU0RMX0FsbG9jQXVkaW9NZW0oYXVkaW8tPnNwZWMuc2l6ZSk7CisJaWYgKCBhdWRpby0+ZmFrZV9zdHJlYW0gPT0gTlVMTCApIHsKKwkJU0RMX0Nsb3NlQXVkaW8oKTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogU2VlIGlmIHdlIG5lZWQgdG8gZG8gYW55IGNvbnZlcnNpb24gKi8KKwlpZiAoIG9idGFpbmVkICE9IE5VTEwgKSB7CisJCVNETF9tZW1jcHkob2J0YWluZWQsICZhdWRpby0+c3BlYywgc2l6ZW9mKGF1ZGlvLT5zcGVjKSk7CisJfSBlbHNlIGlmICggZGVzaXJlZC0+ZnJlcSAhPSBhdWRpby0+c3BlYy5mcmVxIHx8CisgICAgICAgICAgICAgICAgICAgIGRlc2lyZWQtPmZvcm1hdCAhPSBhdWRpby0+c3BlYy5mb3JtYXQgfHwKKwkgICAgICAgICAgICBkZXNpcmVkLT5jaGFubmVscyAhPSBhdWRpby0+c3BlYy5jaGFubmVscyApIHsKKwkJLyogQnVpbGQgYW4gYXVkaW8gY29udmVyc2lvbiBibG9jayAqLworCQlpZiAoIFNETF9CdWlsZEF1ZGlvQ1ZUKCZhdWRpby0+Y29udmVydCwKKwkJCWRlc2lyZWQtPmZvcm1hdCwgZGVzaXJlZC0+Y2hhbm5lbHMsCisJCQkJCWRlc2lyZWQtPmZyZXEsCisJCQlhdWRpby0+c3BlYy5mb3JtYXQsIGF1ZGlvLT5zcGVjLmNoYW5uZWxzLAorCQkJCQlhdWRpby0+c3BlYy5mcmVxKSA8IDAgKSB7CisJCQlTRExfQ2xvc2VBdWRpbygpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlpZiAoIGF1ZGlvLT5jb252ZXJ0Lm5lZWRlZCApIHsKKwkJCWF1ZGlvLT5jb252ZXJ0LmxlbiA9IChpbnQpICggKChkb3VibGUpIGF1ZGlvLT5zcGVjLnNpemUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLT5jb252ZXJ0Lmxlbl9yYXRpbyApOworCQkJYXVkaW8tPmNvbnZlcnQuYnVmID0oVWludDggKilTRExfQWxsb2NBdWRpb01lbSgKKwkJCSAgIGF1ZGlvLT5jb252ZXJ0LmxlbiphdWRpby0+Y29udmVydC5sZW5fbXVsdCk7CisJCQlpZiAoIGF1ZGlvLT5jb252ZXJ0LmJ1ZiA9PSBOVUxMICkgeworCQkJCVNETF9DbG9zZUF1ZGlvKCk7CisJCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFN0YXJ0IHRoZSBhdWRpbyB0aHJlYWQgaWYgbmVjZXNzYXJ5ICovCisJc3dpdGNoIChhdWRpby0+b3BlbmVkKSB7CisJCWNhc2UgIDE6CisJCQkvKiBTdGFydCB0aGUgYXVkaW8gdGhyZWFkICovCisjaWYgKGRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKSkgJiYgIWRlZmluZWQoSEFWRV9MSUJDKSAmJiAhZGVmaW5lZChfX1NZTUJJQU4zMl9fKQorI3VuZGVmIFNETF9DcmVhdGVUaHJlYWQKKwkJCWF1ZGlvLT50aHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkKFNETF9SdW5BdWRpbywgYXVkaW8sIE5VTEwsIE5VTEwpOworI2Vsc2UKKwkJCWF1ZGlvLT50aHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkKFNETF9SdW5BdWRpbywgYXVkaW8pOworI2VuZGlmCisJCQlpZiAoIGF1ZGlvLT50aHJlYWQgPT0gTlVMTCApIHsKKwkJCQlTRExfQ2xvc2VBdWRpbygpOworCQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIGF1ZGlvIHRocmVhZCIpOworCQkJCXJldHVybigtMSk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogVGhlIGF1ZGlvIGlzIG5vdyBwbGF5aW5nICovCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKK1NETF9hdWRpb3N0YXR1cyBTRExfR2V0QXVkaW9TdGF0dXModm9pZCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKmF1ZGlvID0gY3VycmVudF9hdWRpbzsKKwlTRExfYXVkaW9zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gU0RMX0FVRElPX1NUT1BQRUQ7CisJaWYgKCBhdWRpbyAmJiBhdWRpby0+ZW5hYmxlZCApIHsKKwkJaWYgKCBhdWRpby0+cGF1c2VkICkgeworCQkJc3RhdHVzID0gU0RMX0FVRElPX1BBVVNFRDsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IFNETF9BVURJT19QTEFZSU5HOworCQl9CisJfQorCXJldHVybihzdGF0dXMpOworfQorCit2b2lkIFNETF9QYXVzZUF1ZGlvIChpbnQgcGF1c2Vfb24pCit7CisJU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IGN1cnJlbnRfYXVkaW87CisKKwlpZiAoIGF1ZGlvICkgeworCQlhdWRpby0+cGF1c2VkID0gcGF1c2Vfb247CisJfQorfQorCit2b2lkIFNETF9Mb2NrQXVkaW8gKHZvaWQpCit7CisJU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IGN1cnJlbnRfYXVkaW87CisKKwkvKiBPYnRhaW4gYSBsb2NrIG9uIHRoZSBtaXhpbmcgYnVmZmVycyAqLworCWlmICggYXVkaW8gJiYgYXVkaW8tPkxvY2tBdWRpbyApIHsKKwkJYXVkaW8tPkxvY2tBdWRpbyhhdWRpbyk7CisJfQorfQorCit2b2lkIFNETF9VbmxvY2tBdWRpbyAodm9pZCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKmF1ZGlvID0gY3VycmVudF9hdWRpbzsKKworCS8qIFJlbGVhc2UgbG9jayBvbiB0aGUgbWl4aW5nIGJ1ZmZlcnMgKi8KKwlpZiAoIGF1ZGlvICYmIGF1ZGlvLT5VbmxvY2tBdWRpbyApIHsKKwkJYXVkaW8tPlVubG9ja0F1ZGlvKGF1ZGlvKTsKKwl9Cit9CisKK3ZvaWQgU0RMX0Nsb3NlQXVkaW8gKHZvaWQpCit7CisJU0RMX1F1aXRTdWJTeXN0ZW0oU0RMX0lOSVRfQVVESU8pOworfQorCit2b2lkIFNETF9BdWRpb1F1aXQodm9pZCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKmF1ZGlvID0gY3VycmVudF9hdWRpbzsKKworCWlmICggYXVkaW8gKSB7CisJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJaWYgKCBhdWRpby0+dGhyZWFkICE9IE5VTEwgKSB7CisJCQlTRExfV2FpdFRocmVhZChhdWRpby0+dGhyZWFkLCBOVUxMKTsKKwkJfQorCQlpZiAoIGF1ZGlvLT5taXhlcl9sb2NrICE9IE5VTEwgKSB7CisJCQlTRExfRGVzdHJveU11dGV4KGF1ZGlvLT5taXhlcl9sb2NrKTsKKwkJfQorCQlpZiAoIGF1ZGlvLT5mYWtlX3N0cmVhbSAhPSBOVUxMICkgeworCQkJU0RMX0ZyZWVBdWRpb01lbShhdWRpby0+ZmFrZV9zdHJlYW0pOworCQl9CisJCWlmICggYXVkaW8tPmNvbnZlcnQubmVlZGVkICkgeworCQkJU0RMX0ZyZWVBdWRpb01lbShhdWRpby0+Y29udmVydC5idWYpOworCisJCX0KKwkJaWYgKCBhdWRpby0+b3BlbmVkICkgeworCQkJYXVkaW8tPkNsb3NlQXVkaW8oYXVkaW8pOworCQkJYXVkaW8tPm9wZW5lZCA9IDA7CisJCX0KKwkJLyogRnJlZSB0aGUgZHJpdmVyIGRhdGEgKi8KKwkJYXVkaW8tPmZyZWUoYXVkaW8pOworCQljdXJyZW50X2F1ZGlvID0gTlVMTDsKKwl9Cit9CisKKyNkZWZpbmUgTlVNX0ZPUk1BVFMJNgorc3RhdGljIGludCBmb3JtYXRfaWR4Oworc3RhdGljIGludCBmb3JtYXRfaWR4X3N1YjsKK3N0YXRpYyBVaW50MTYgZm9ybWF0X2xpc3RbTlVNX0ZPUk1BVFNdW05VTV9GT1JNQVRTXSA9IHsKKyB7IEFVRElPX1U4LCBBVURJT19TOCwgQVVESU9fUzE2TFNCLCBBVURJT19TMTZNU0IsIEFVRElPX1UxNkxTQiwgQVVESU9fVTE2TVNCIH0sCisgeyBBVURJT19TOCwgQVVESU9fVTgsIEFVRElPX1MxNkxTQiwgQVVESU9fUzE2TVNCLCBBVURJT19VMTZMU0IsIEFVRElPX1UxNk1TQiB9LAorIHsgQVVESU9fUzE2TFNCLCBBVURJT19TMTZNU0IsIEFVRElPX1UxNkxTQiwgQVVESU9fVTE2TVNCLCBBVURJT19VOCwgQVVESU9fUzggfSwKKyB7IEFVRElPX1MxNk1TQiwgQVVESU9fUzE2TFNCLCBBVURJT19VMTZNU0IsIEFVRElPX1UxNkxTQiwgQVVESU9fVTgsIEFVRElPX1M4IH0sCisgeyBBVURJT19VMTZMU0IsIEFVRElPX1UxNk1TQiwgQVVESU9fUzE2TFNCLCBBVURJT19TMTZNU0IsIEFVRElPX1U4LCBBVURJT19TOCB9LAorIHsgQVVESU9fVTE2TVNCLCBBVURJT19VMTZMU0IsIEFVRElPX1MxNk1TQiwgQVVESU9fUzE2TFNCLCBBVURJT19VOCwgQVVESU9fUzggfSwKK307CisKK1VpbnQxNiBTRExfRmlyc3RBdWRpb0Zvcm1hdChVaW50MTYgZm9ybWF0KQoreworCWZvciAoIGZvcm1hdF9pZHg9MDsgZm9ybWF0X2lkeCA8IE5VTV9GT1JNQVRTOyArK2Zvcm1hdF9pZHggKSB7CisJCWlmICggZm9ybWF0X2xpc3RbZm9ybWF0X2lkeF1bMF0gPT0gZm9ybWF0ICkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9ybWF0X2lkeF9zdWIgPSAwOworCXJldHVybihTRExfTmV4dEF1ZGlvRm9ybWF0KCkpOworfQorCitVaW50MTYgU0RMX05leHRBdWRpb0Zvcm1hdCh2b2lkKQoreworCWlmICggKGZvcm1hdF9pZHggPT0gTlVNX0ZPUk1BVFMpIHx8IChmb3JtYXRfaWR4X3N1YiA9PSBOVU1fRk9STUFUUykgKSB7CisJCXJldHVybigwKTsKKwl9CisJcmV0dXJuKGZvcm1hdF9saXN0W2Zvcm1hdF9pZHhdW2Zvcm1hdF9pZHhfc3ViKytdKTsKK30KKwordm9pZCBTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJc3dpdGNoIChzcGVjLT5mb3JtYXQpIHsKKwkJY2FzZSBBVURJT19VODoKKwkJCXNwZWMtPnNpbGVuY2UgPSAweDgwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcGVjLT5zaWxlbmNlID0gMHgwMDsKKwkJCWJyZWFrOworCX0KKwlzcGVjLT5zaXplID0gKHNwZWMtPmZvcm1hdCYweEZGKS84OworCXNwZWMtPnNpemUgKj0gc3BlYy0+Y2hhbm5lbHM7CisJc3BlYy0+c2l6ZSAqPSBzcGVjLT5zYW1wbGVzOworfQorCit2b2lkIFNETF9BdWRpb19TZXRDYXB0aW9uKGNvbnN0IGNoYXIgKmNhcHRpb24pCit7CisJaWYgKChjdXJyZW50X2F1ZGlvKSAmJiAoY3VycmVudF9hdWRpby0+U2V0Q2FwdGlvbikpIHsKKwkJY3VycmVudF9hdWRpby0+U2V0Q2FwdGlvbihjdXJyZW50X2F1ZGlvLCBjYXB0aW9uKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX2F1ZGlvX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX2F1ZGlvX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmNmMjAyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfYXVkaW9fYy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBGdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBleHBvcnRlZCBmcm9tIFNETF9hdWRpby5jIGZvciBTRExfc3lzYXVkaW8uYyAqLworCisvKiBGdW5jdGlvbnMgdG8gZ2V0IGEgbGlzdCBvZiAiY2xvc2UiIGF1ZGlvIGZvcm1hdHMgKi8KK2V4dGVybiBVaW50MTYgU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoVWludDE2IGZvcm1hdCk7CitleHRlcm4gVWludDE2IFNETF9OZXh0QXVkaW9Gb3JtYXQodm9pZCk7CisKKy8qIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBhbmQgc2lsZW5jZSBmb3IgYSBTRExfQXVkaW9TcGVjICovCitleHRlcm4gdm9pZCBTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKFNETF9BdWRpb1NwZWMgKnNwZWMpOworCisvKiBUaGUgYWN0dWFsIG1peGluZyB0aHJlYWQgZnVuY3Rpb24gKi8KK2V4dGVybiBpbnQgU0RMQ0FMTCBTRExfUnVuQXVkaW8odm9pZCAqYXVkaW9wKTsKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfYXVkaW9jdnQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX2F1ZGlvY3Z0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4ZmJjZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX2F1ZGlvY3Z0LmMKQEAgLTAsMCArMSwxNTEwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogRnVuY3Rpb25zIGZvciBhdWRpbyBkcml2ZXJzIHRvIHBlcmZvcm0gcnVudGltZSBjb252ZXJzaW9uIG9mIGF1ZGlvIGZvcm1hdCAqLworCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisKKworLyogRWZmZWN0aXZlbHkgbWl4IHJpZ2h0IGFuZCBsZWZ0IGNoYW5uZWxzIGludG8gYSBzaW5nbGUgY2hhbm5lbCAqLwordm9pZCBTRExDQUxMIFNETF9Db252ZXJ0TW9ubyhTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKK3sKKwlpbnQgaTsKKwlTaW50MzIgc2FtcGxlOworCisjaWZkZWYgREVCVUdfQ09OVkVSVAorCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyB0byBtb25vXG4iKTsKKyNlbmRpZgorCXN3aXRjaCAoZm9ybWF0JjB4ODAxOCkgeworCisJCWNhc2UgQVVESU9fVTg6IHsKKwkJCVVpbnQ4ICpzcmMsICpkc3Q7CisKKwkJCXNyYyA9IGN2dC0+YnVmOworCQkJZHN0ID0gY3Z0LT5idWY7CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8yOyBpOyAtLWkgKSB7CisJCQkJc2FtcGxlID0gc3JjWzBdICsgc3JjWzFdOworCQkJCSpkc3QgPSAoVWludDgpKHNhbXBsZSAvIDIpOworCQkJCXNyYyArPSAyOworCQkJCWRzdCArPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgQVVESU9fUzg6IHsKKwkJCVNpbnQ4ICpzcmMsICpkc3Q7CisKKwkJCXNyYyA9IChTaW50OCAqKWN2dC0+YnVmOworCQkJZHN0ID0gKFNpbnQ4ICopY3Z0LT5idWY7CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8yOyBpOyAtLWkgKSB7CisJCQkJc2FtcGxlID0gc3JjWzBdICsgc3JjWzFdOworCQkJCSpkc3QgPSAoU2ludDgpKHNhbXBsZSAvIDIpOworCQkJCXNyYyArPSAyOworCQkJCWRzdCArPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgQVVESU9fVTE2OiB7CisJCQlVaW50OCAqc3JjLCAqZHN0OworCisJCQlzcmMgPSBjdnQtPmJ1ZjsKKwkJCWRzdCA9IGN2dC0+YnVmOworCQkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSA9PSAweDEwMDAgKSB7CisJCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgeworCQkJCQlzYW1wbGUgPSAoVWludDE2KSgoc3JjWzBdPDw4KXxzcmNbMV0pKworCQkJCQkgICAgICAgICAoVWludDE2KSgoc3JjWzJdPDw4KXxzcmNbM10pOworCQkJCQlzYW1wbGUgLz0gMjsKKwkJCQkJZHN0WzFdID0gKHNhbXBsZSYweEZGKTsKKwkJCQkJc2FtcGxlID4+PSA4OworCQkJCQlkc3RbMF0gPSAoc2FtcGxlJjB4RkYpOworCQkJCQlzcmMgKz0gNDsKKwkJCQkJZHN0ICs9IDI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7CisJCQkJCXNhbXBsZSA9IChVaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSkrCisJCQkJCSAgICAgICAgIChVaW50MTYpKChzcmNbM108PDgpfHNyY1syXSk7CisJCQkJCXNhbXBsZSAvPSAyOworCQkJCQlkc3RbMF0gPSAoc2FtcGxlJjB4RkYpOworCQkJCQlzYW1wbGUgPj49IDg7CisJCQkJCWRzdFsxXSA9IChzYW1wbGUmMHhGRik7CisJCQkJCXNyYyArPSA0OworCQkJCQlkc3QgKz0gMjsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBVURJT19TMTY6IHsKKwkJCVVpbnQ4ICpzcmMsICpkc3Q7CisKKwkJCXNyYyA9IGN2dC0+YnVmOworCQkJZHN0ID0gY3Z0LT5idWY7CisJCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7CisJCQkJCXNhbXBsZSA9IChTaW50MTYpKChzcmNbMF08PDgpfHNyY1sxXSkrCisJCQkJCSAgICAgICAgIChTaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7CisJCQkJCXNhbXBsZSAvPSAyOworCQkJCQlkc3RbMV0gPSAoc2FtcGxlJjB4RkYpOworCQkJCQlzYW1wbGUgPj49IDg7CisJCQkJCWRzdFswXSA9IChzYW1wbGUmMHhGRik7CisJCQkJCXNyYyArPSA0OworCQkJCQlkc3QgKz0gMjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKKwkJCQkJc2FtcGxlID0gKFNpbnQxNikoKHNyY1sxXTw8OCl8c3JjWzBdKSsKKwkJCQkJICAgICAgICAgKFNpbnQxNikoKHNyY1szXTw8OCl8c3JjWzJdKTsKKwkJCQkJc2FtcGxlIC89IDI7CisJCQkJCWRzdFswXSA9IChzYW1wbGUmMHhGRik7CisJCQkJCXNhbXBsZSA+Pj0gODsKKwkJCQkJZHN0WzFdID0gKHNhbXBsZSYweEZGKTsKKwkJCQkJc3JjICs9IDQ7CisJCQkJCWRzdCArPSAyOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJY3Z0LT5sZW5fY3Z0IC89IDI7CisJaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOworCX0KK30KKworLyogRGlzY2FyZCB0b3AgNCBjaGFubmVscyAqLwordm9pZCBTRExDQUxMIFNETF9Db252ZXJ0U3RyaXAoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCit7CisJaW50IGk7CisJU2ludDMyIGxzYW1wbGUsIHJzYW1wbGU7CisKKyNpZmRlZiBERUJVR19DT05WRVJUCisJZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGRvd24gdG8gc3RlcmVvXG4iKTsKKyNlbmRpZgorCXN3aXRjaCAoZm9ybWF0JjB4ODAxOCkgeworCisJCWNhc2UgQVVESU9fVTg6IHsKKwkJCVVpbnQ4ICpzcmMsICpkc3Q7CisKKwkJCXNyYyA9IGN2dC0+YnVmOworCQkJZHN0ID0gY3Z0LT5idWY7CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC82OyBpOyAtLWkgKSB7CisJCQkJZHN0WzBdID0gc3JjWzBdOworCQkJCWRzdFsxXSA9IHNyY1sxXTsKKwkJCQlzcmMgKz0gNjsKKwkJCQlkc3QgKz0gMjsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEFVRElPX1M4OiB7CisJCQlTaW50OCAqc3JjLCAqZHN0OworCisJCQlzcmMgPSAoU2ludDggKiljdnQtPmJ1ZjsKKwkJCWRzdCA9IChTaW50OCAqKWN2dC0+YnVmOworCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNjsgaTsgLS1pICkgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJc3JjICs9IDY7CisJCQkJZHN0ICs9IDI7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBVURJT19VMTY6IHsKKwkJCVVpbnQ4ICpzcmMsICpkc3Q7CisKKwkJCXNyYyA9IGN2dC0+YnVmOworCQkJZHN0ID0gY3Z0LT5idWY7CisJCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8xMjsgaTsgLS1pICkgeworCQkJCQlsc2FtcGxlID0gKFVpbnQxNikoKHNyY1swXTw8OCl8c3JjWzFdKTsKKwkJCQkJcnNhbXBsZSA9IChVaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7CisJCQkJCQlkc3RbMV0gPSAobHNhbXBsZSYweEZGKTsKKwkJCQkJCWxzYW1wbGUgPj49IDg7CisJCQkJCQlkc3RbMF0gPSAobHNhbXBsZSYweEZGKTsKKwkJCQkJCWRzdFszXSA9IChyc2FtcGxlJjB4RkYpOworCQkJCQkJcnNhbXBsZSA+Pj0gODsKKwkJCQkJCWRzdFsyXSA9IChyc2FtcGxlJjB4RkYpOworCQkJCQlzcmMgKz0gMTI7CisJCQkJCWRzdCArPSA0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvMTI7IGk7IC0taSApIHsKKwkJCQkJbHNhbXBsZSA9IChVaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7CisJCQkJCXJzYW1wbGUgPSAoVWludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOworCQkJCQkJZHN0WzBdID0gKGxzYW1wbGUmMHhGRik7CisJCQkJCQlsc2FtcGxlID4+PSA4OworCQkJCQkJZHN0WzFdID0gKGxzYW1wbGUmMHhGRik7CisJCQkJCQlkc3RbMl0gPSAocnNhbXBsZSYweEZGKTsKKwkJCQkJCXJzYW1wbGUgPj49IDg7CisJCQkJCQlkc3RbM10gPSAocnNhbXBsZSYweEZGKTsKKwkJCQkJc3JjICs9IDEyOworCQkJCQlkc3QgKz0gNDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBVURJT19TMTY6IHsKKwkJCVVpbnQ4ICpzcmMsICpkc3Q7CisKKwkJCXNyYyA9IGN2dC0+YnVmOworCQkJZHN0ID0gY3Z0LT5idWY7CisJCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8xMjsgaTsgLS1pICkgeworCQkJCQlsc2FtcGxlID0gKFNpbnQxNikoKHNyY1swXTw8OCl8c3JjWzFdKTsKKwkJCQkJcnNhbXBsZSA9IChTaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7CisJCQkJCQlkc3RbMV0gPSAobHNhbXBsZSYweEZGKTsKKwkJCQkJCWxzYW1wbGUgPj49IDg7CisJCQkJCQlkc3RbMF0gPSAobHNhbXBsZSYweEZGKTsKKwkJCQkJCWRzdFszXSA9IChyc2FtcGxlJjB4RkYpOworCQkJCQkJcnNhbXBsZSA+Pj0gODsKKwkJCQkJCWRzdFsyXSA9IChyc2FtcGxlJjB4RkYpOworCQkJCQlzcmMgKz0gMTI7CisJCQkJCWRzdCArPSA0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvMTI7IGk7IC0taSApIHsKKwkJCQkJbHNhbXBsZSA9IChTaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7CisJCQkJCXJzYW1wbGUgPSAoU2ludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOworCQkJCQkJZHN0WzBdID0gKGxzYW1wbGUmMHhGRik7CisJCQkJCQlsc2FtcGxlID4+PSA4OworCQkJCQkJZHN0WzFdID0gKGxzYW1wbGUmMHhGRik7CisJCQkJCQlkc3RbMl0gPSAocnNhbXBsZSYweEZGKTsKKwkJCQkJCXJzYW1wbGUgPj49IDg7CisJCQkJCQlkc3RbM10gPSAocnNhbXBsZSYweEZGKTsKKwkJCQkJc3JjICs9IDEyOworCQkJCQlkc3QgKz0gNDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCWN2dC0+bGVuX2N2dCAvPSAzOworCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgeworCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKKwl9Cit9CisKKworLyogRGlzY2FyZCB0b3AgMiBjaGFubmVscyBvZiA2ICovCit2b2lkIFNETENBTEwgU0RMX0NvbnZlcnRTdHJpcF8yKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQoreworCWludCBpOworCVNpbnQzMiBsc2FtcGxlLCByc2FtcGxlOworCisjaWZkZWYgREVCVUdfQ09OVkVSVAorCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyA2IGRvd24gdG8gcXVhZFxuIik7CisjZW5kaWYKKwlzd2l0Y2ggKGZvcm1hdCYweDgwMTgpIHsKKworCQljYXNlIEFVRElPX1U4OiB7CisJCQlVaW50OCAqc3JjLCAqZHN0OworCisJCQlzcmMgPSBjdnQtPmJ1ZjsKKwkJCWRzdCA9IGN2dC0+YnVmOworCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJc3JjICs9IDQ7CisJCQkJZHN0ICs9IDI7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBVURJT19TODogeworCQkJU2ludDggKnNyYywgKmRzdDsKKworCQkJc3JjID0gKFNpbnQ4ICopY3Z0LT5idWY7CisJCQlkc3QgPSAoU2ludDggKiljdnQtPmJ1ZjsKKwkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKKwkJCQlkc3RbMF0gPSBzcmNbMF07CisJCQkJZHN0WzFdID0gc3JjWzFdOworCQkJCXNyYyArPSA0OworCQkJCWRzdCArPSAyOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgQVVESU9fVTE2OiB7CisJCQlVaW50OCAqc3JjLCAqZHN0OworCisJCQlzcmMgPSBjdnQtPmJ1ZjsKKwkJCWRzdCA9IGN2dC0+YnVmOworCQkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSA9PSAweDEwMDAgKSB7CisJCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvODsgaTsgLS1pICkgeworCQkJCQlsc2FtcGxlID0gKFVpbnQxNikoKHNyY1swXTw8OCl8c3JjWzFdKTsKKwkJCQkJcnNhbXBsZSA9IChVaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7CisJCQkJCQlkc3RbMV0gPSAobHNhbXBsZSYweEZGKTsKKwkJCQkJCWxzYW1wbGUgPj49IDg7CisJCQkJCQlkc3RbMF0gPSAobHNhbXBsZSYweEZGKTsKKwkJCQkJCWRzdFszXSA9IChyc2FtcGxlJjB4RkYpOworCQkJCQkJcnNhbXBsZSA+Pj0gODsKKwkJCQkJCWRzdFsyXSA9IChyc2FtcGxlJjB4RkYpOworCQkJCQlzcmMgKz0gODsKKwkJCQkJZHN0ICs9IDQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC84OyBpOyAtLWkgKSB7CisJCQkJCWxzYW1wbGUgPSAoVWludDE2KSgoc3JjWzFdPDw4KXxzcmNbMF0pOworCQkJCQlyc2FtcGxlID0gKFVpbnQxNikoKHNyY1szXTw8OCl8c3JjWzJdKTsKKwkJCQkJCWRzdFswXSA9IChsc2FtcGxlJjB4RkYpOworCQkJCQkJbHNhbXBsZSA+Pj0gODsKKwkJCQkJCWRzdFsxXSA9IChsc2FtcGxlJjB4RkYpOworCQkJCQkJZHN0WzJdID0gKHJzYW1wbGUmMHhGRik7CisJCQkJCQlyc2FtcGxlID4+PSA4OworCQkJCQkJZHN0WzNdID0gKHJzYW1wbGUmMHhGRik7CisJCQkJCXNyYyArPSA4OworCQkJCQlkc3QgKz0gNDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBVURJT19TMTY6IHsKKwkJCVVpbnQ4ICpzcmMsICpkc3Q7CisKKwkJCXNyYyA9IGN2dC0+YnVmOworCQkJZHN0ID0gY3Z0LT5idWY7CisJCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC84OyBpOyAtLWkgKSB7CisJCQkJCWxzYW1wbGUgPSAoU2ludDE2KSgoc3JjWzBdPDw4KXxzcmNbMV0pOworCQkJCQlyc2FtcGxlID0gKFNpbnQxNikoKHNyY1syXTw8OCl8c3JjWzNdKTsKKwkJCQkJCWRzdFsxXSA9IChsc2FtcGxlJjB4RkYpOworCQkJCQkJbHNhbXBsZSA+Pj0gODsKKwkJCQkJCWRzdFswXSA9IChsc2FtcGxlJjB4RkYpOworCQkJCQkJZHN0WzNdID0gKHJzYW1wbGUmMHhGRik7CisJCQkJCQlyc2FtcGxlID4+PSA4OworCQkJCQkJZHN0WzJdID0gKHJzYW1wbGUmMHhGRik7CisJCQkJCXNyYyArPSA4OworCQkJCQlkc3QgKz0gNDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0Lzg7IGk7IC0taSApIHsKKwkJCQkJbHNhbXBsZSA9IChTaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7CisJCQkJCXJzYW1wbGUgPSAoU2ludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOworCQkJCQkJZHN0WzBdID0gKGxzYW1wbGUmMHhGRik7CisJCQkJCQlsc2FtcGxlID4+PSA4OworCQkJCQkJZHN0WzFdID0gKGxzYW1wbGUmMHhGRik7CisJCQkJCQlkc3RbMl0gPSAocnNhbXBsZSYweEZGKTsKKwkJCQkJCXJzYW1wbGUgPj49IDg7CisJCQkJCQlkc3RbM10gPSAocnNhbXBsZSYweEZGKTsKKwkJCQkJc3JjICs9IDg7CisJCQkJCWRzdCArPSA0OworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJY3Z0LT5sZW5fY3Z0IC89IDI7CisJaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOworCX0KK30KKworLyogRHVwbGljYXRlIGEgbW9ubyBjaGFubmVsIHRvIGJvdGggc3RlcmVvIGNoYW5uZWxzICovCit2b2lkIFNETENBTEwgU0RMX0NvbnZlcnRTdGVyZW8oU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCit7CisJaW50IGk7CisKKyNpZmRlZiBERUJVR19DT05WRVJUCisJZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIHRvIHN0ZXJlb1xuIik7CisjZW5kaWYKKwlpZiAoIChmb3JtYXQgJiAweEZGKSA9PSAxNiApIHsKKwkJVWludDE2ICpzcmMsICpkc3Q7CisKKwkJc3JjID0gKFVpbnQxNiAqKShjdnQtPmJ1ZitjdnQtPmxlbl9jdnQpOworCQlkc3QgPSAoVWludDE2ICopKGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyKTsKKwkJZm9yICggaT1jdnQtPmxlbl9jdnQvMjsgaTsgLS1pICkgeworCQkJZHN0IC09IDI7CisJCQlzcmMgLT0gMTsKKwkJCWRzdFswXSA9IHNyY1swXTsKKwkJCWRzdFsxXSA9IHNyY1swXTsKKwkJfQorCX0gZWxzZSB7CisJCVVpbnQ4ICpzcmMsICpkc3Q7CisKKwkJc3JjID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0OworCQlkc3QgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQqMjsKKwkJZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKKwkJCWRzdCAtPSAyOworCQkJc3JjIC09IDE7CisJCQlkc3RbMF0gPSBzcmNbMF07CisJCQlkc3RbMV0gPSBzcmNbMF07CisJCX0KKwl9CisJY3Z0LT5sZW5fY3Z0ICo9IDI7CisJaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOworCX0KK30KKworCisvKiBEdXBsaWNhdGUgYSBzdGVyZW8gY2hhbm5lbCB0byBhIHBzZXVkby01LjEgc3RyZWFtICovCit2b2lkIFNETENBTEwgU0RMX0NvbnZlcnRTdXJyb3VuZChTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKK3sKKwlpbnQgaTsKKworI2lmZGVmIERFQlVHX0NPTlZFUlQKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgc3RlcmVvIHRvIHN1cnJvdW5kXG4iKTsKKyNlbmRpZgorCXN3aXRjaCAoZm9ybWF0JjB4ODAxOCkgeworCisJCWNhc2UgQVVESU9fVTg6IHsKKwkJCVVpbnQ4ICpzcmMsICpkc3QsIGxmLCByZiwgY2U7CisKKwkJCXNyYyA9IChVaW50OCAqKShjdnQtPmJ1ZitjdnQtPmxlbl9jdnQpOworCQkJZHN0ID0gKFVpbnQ4ICopKGN2dC0+YnVmK2N2dC0+bGVuX2N2dCozKTsKKwkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0OyBpOyAtLWkgKSB7CisJCQkJZHN0IC09IDY7CisJCQkJc3JjIC09IDI7CisJCQkJbGYgPSBzcmNbMF07CisJCQkJcmYgPSBzcmNbMV07CisJCQkJY2UgPSAobGYvMikgKyAocmYvMik7CisJCQkJZHN0WzBdID0gbGY7CisJCQkJZHN0WzFdID0gcmY7CisJCQkJZHN0WzJdID0gbGYgLSBjZTsKKwkJCQlkc3RbM10gPSByZiAtIGNlOworCQkJCWRzdFs0XSA9IGNlOworCQkJCWRzdFs1XSA9IGNlOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCWNhc2UgQVVESU9fUzg6IHsKKwkJCVNpbnQ4ICpzcmMsICpkc3QsIGxmLCByZiwgY2U7CisKKwkJCXNyYyA9IChTaW50OCAqKWN2dC0+YnVmK2N2dC0+bGVuX2N2dDsKKwkJCWRzdCA9IChTaW50OCAqKWN2dC0+YnVmK2N2dC0+bGVuX2N2dCozOworCQkJZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKKwkJCQlkc3QgLT0gNjsKKwkJCQlzcmMgLT0gMjsKKwkJCQlsZiA9IHNyY1swXTsKKwkJCQlyZiA9IHNyY1sxXTsKKwkJCQljZSA9IChsZi8yKSArIChyZi8yKTsKKwkJCQlkc3RbMF0gPSBsZjsKKwkJCQlkc3RbMV0gPSByZjsKKwkJCQlkc3RbMl0gPSBsZiAtIGNlOworCQkJCWRzdFszXSA9IHJmIC0gY2U7CisJCQkJZHN0WzRdID0gY2U7CisJCQkJZHN0WzVdID0gY2U7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBVURJT19VMTY6IHsKKwkJCVVpbnQ4ICpzcmMsICpkc3Q7CisJCQlVaW50MTYgbGYsIHJmLCBjZSwgbHIsIHJyOworCisJCQlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7CisJCQlkc3QgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQqMzsKKworCQkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSA9PSAweDEwMDAgKSB7CisJCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgeworCQkJCQlkc3QgLT0gMTI7CisJCQkJCXNyYyAtPSA0OworCQkJCQlsZiA9IChVaW50MTYpKChzcmNbMF08PDgpfHNyY1sxXSk7CisJCQkJCXJmID0gKFVpbnQxNikoKHNyY1syXTw8OCl8c3JjWzNdKTsKKwkJCQkJY2UgPSAobGYvMikgKyAocmYvMik7CisJCQkJCXJyID0gbGYgLSBjZTsKKwkJCQkJbHIgPSByZiAtIGNlOworCQkJCQkJZHN0WzFdID0gKGxmJjB4RkYpOworCQkJCQkJZHN0WzBdID0gKChsZj4+OCkmMHhGRik7CisJCQkJCQlkc3RbM10gPSAocmYmMHhGRik7CisJCQkJCQlkc3RbMl0gPSAoKHJmPj44KSYweEZGKTsKKworCQkJCQkJZHN0WzErNF0gPSAobHImMHhGRik7CisJCQkJCQlkc3RbMCs0XSA9ICgobHI+PjgpJjB4RkYpOworCQkJCQkJZHN0WzMrNF0gPSAocnImMHhGRik7CisJCQkJCQlkc3RbMis0XSA9ICgocnI+PjgpJjB4RkYpOworCisJCQkJCQlkc3RbMSs4XSA9IChjZSYweEZGKTsKKwkJCQkJCWRzdFswKzhdID0gKChjZT4+OCkmMHhGRik7CisJCQkJCQlkc3RbMys4XSA9IChjZSYweEZGKTsKKwkJCQkJCWRzdFsyKzhdID0gKChjZT4+OCkmMHhGRik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7CisJCQkJCWRzdCAtPSAxMjsKKwkJCQkJc3JjIC09IDQ7CisJCQkJCWxmID0gKFVpbnQxNikoKHNyY1sxXTw8OCl8c3JjWzBdKTsKKwkJCQkJcmYgPSAoVWludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOworCQkJCQljZSA9IChsZi8yKSArIChyZi8yKTsKKwkJCQkJcnIgPSBsZiAtIGNlOworCQkJCQlsciA9IHJmIC0gY2U7CisJCQkJCQlkc3RbMF0gPSAobGYmMHhGRik7CisJCQkJCQlkc3RbMV0gPSAoKGxmPj44KSYweEZGKTsKKwkJCQkJCWRzdFsyXSA9IChyZiYweEZGKTsKKwkJCQkJCWRzdFszXSA9ICgocmY+PjgpJjB4RkYpOworCisJCQkJCQlkc3RbMCs0XSA9IChsciYweEZGKTsKKwkJCQkJCWRzdFsxKzRdID0gKChscj4+OCkmMHhGRik7CisJCQkJCQlkc3RbMis0XSA9IChyciYweEZGKTsKKwkJCQkJCWRzdFszKzRdID0gKChycj4+OCkmMHhGRik7CisKKwkJCQkJCWRzdFswKzhdID0gKGNlJjB4RkYpOworCQkJCQkJZHN0WzErOF0gPSAoKGNlPj44KSYweEZGKTsKKwkJCQkJCWRzdFsyKzhdID0gKGNlJjB4RkYpOworCQkJCQkJZHN0WzMrOF0gPSAoKGNlPj44KSYweEZGKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBVURJT19TMTY6IHsKKwkJCVVpbnQ4ICpzcmMsICpkc3Q7CisJCQlTaW50MTYgbGYsIHJmLCBjZSwgbHIsIHJyOworCisJCQlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7CisJCQlkc3QgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQqMzsKKworCQkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSA9PSAweDEwMDAgKSB7CisJCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgeworCQkJCQlkc3QgLT0gMTI7CisJCQkJCXNyYyAtPSA0OworCQkJCQlsZiA9IChTaW50MTYpKChzcmNbMF08PDgpfHNyY1sxXSk7CisJCQkJCXJmID0gKFNpbnQxNikoKHNyY1syXTw8OCl8c3JjWzNdKTsKKwkJCQkJY2UgPSAobGYvMikgKyAocmYvMik7CisJCQkJCXJyID0gbGYgLSBjZTsKKwkJCQkJbHIgPSByZiAtIGNlOworCQkJCQkJZHN0WzFdID0gKGxmJjB4RkYpOworCQkJCQkJZHN0WzBdID0gKChsZj4+OCkmMHhGRik7CisJCQkJCQlkc3RbM10gPSAocmYmMHhGRik7CisJCQkJCQlkc3RbMl0gPSAoKHJmPj44KSYweEZGKTsKKworCQkJCQkJZHN0WzErNF0gPSAobHImMHhGRik7CisJCQkJCQlkc3RbMCs0XSA9ICgobHI+PjgpJjB4RkYpOworCQkJCQkJZHN0WzMrNF0gPSAocnImMHhGRik7CisJCQkJCQlkc3RbMis0XSA9ICgocnI+PjgpJjB4RkYpOworCisJCQkJCQlkc3RbMSs4XSA9IChjZSYweEZGKTsKKwkJCQkJCWRzdFswKzhdID0gKChjZT4+OCkmMHhGRik7CisJCQkJCQlkc3RbMys4XSA9IChjZSYweEZGKTsKKwkJCQkJCWRzdFsyKzhdID0gKChjZT4+OCkmMHhGRik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7CisJCQkJCWRzdCAtPSAxMjsKKwkJCQkJc3JjIC09IDQ7CisJCQkJCWxmID0gKFNpbnQxNikoKHNyY1sxXTw8OCl8c3JjWzBdKTsKKwkJCQkJcmYgPSAoU2ludDE2KSgoc3JjWzNdPDw4KXxzcmNbMl0pOworCQkJCQljZSA9IChsZi8yKSArIChyZi8yKTsKKwkJCQkJcnIgPSBsZiAtIGNlOworCQkJCQlsciA9IHJmIC0gY2U7CisJCQkJCQlkc3RbMF0gPSAobGYmMHhGRik7CisJCQkJCQlkc3RbMV0gPSAoKGxmPj44KSYweEZGKTsKKwkJCQkJCWRzdFsyXSA9IChyZiYweEZGKTsKKwkJCQkJCWRzdFszXSA9ICgocmY+PjgpJjB4RkYpOworCisJCQkJCQlkc3RbMCs0XSA9IChsciYweEZGKTsKKwkJCQkJCWRzdFsxKzRdID0gKChscj4+OCkmMHhGRik7CisJCQkJCQlkc3RbMis0XSA9IChyciYweEZGKTsKKwkJCQkJCWRzdFszKzRdID0gKChycj4+OCkmMHhGRik7CisKKwkJCQkJCWRzdFswKzhdID0gKGNlJjB4RkYpOworCQkJCQkJZHN0WzErOF0gPSAoKGNlPj44KSYweEZGKTsKKwkJCQkJCWRzdFsyKzhdID0gKGNlJjB4RkYpOworCQkJCQkJZHN0WzMrOF0gPSAoKGNlPj44KSYweEZGKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCWN2dC0+bGVuX2N2dCAqPSAzOworCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgeworCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKKwl9Cit9CisKKworLyogRHVwbGljYXRlIGEgc3RlcmVvIGNoYW5uZWwgdG8gYSBwc2V1ZG8tNC4wIHN0cmVhbSAqLwordm9pZCBTRExDQUxMIFNETF9Db252ZXJ0U3Vycm91bmRfNChTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKK3sKKwlpbnQgaTsKKworI2lmZGVmIERFQlVHX0NPTlZFUlQKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgc3RlcmVvIHRvIHF1YWRcbiIpOworI2VuZGlmCisJc3dpdGNoIChmb3JtYXQmMHg4MDE4KSB7CisKKwkJY2FzZSBBVURJT19VODogeworCQkJVWludDggKnNyYywgKmRzdCwgbGYsIHJmLCBjZTsKKworCQkJc3JjID0gKFVpbnQ4ICopKGN2dC0+YnVmK2N2dC0+bGVuX2N2dCk7CisJCQlkc3QgPSAoVWludDggKikoY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjIpOworCQkJZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKKwkJCQlkc3QgLT0gNDsKKwkJCQlzcmMgLT0gMjsKKwkJCQlsZiA9IHNyY1swXTsKKwkJCQlyZiA9IHNyY1sxXTsKKwkJCQljZSA9IChsZi8yKSArIChyZi8yKTsKKwkJCQlkc3RbMF0gPSBsZjsKKwkJCQlkc3RbMV0gPSByZjsKKwkJCQlkc3RbMl0gPSBsZiAtIGNlOworCQkJCWRzdFszXSA9IHJmIC0gY2U7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBVURJT19TODogeworCQkJU2ludDggKnNyYywgKmRzdCwgbGYsIHJmLCBjZTsKKworCQkJc3JjID0gKFNpbnQ4ICopY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0OworCQkJZHN0ID0gKFNpbnQ4ICopY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjI7CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dDsgaTsgLS1pICkgeworCQkJCWRzdCAtPSA0OworCQkJCXNyYyAtPSAyOworCQkJCWxmID0gc3JjWzBdOworCQkJCXJmID0gc3JjWzFdOworCQkJCWNlID0gKGxmLzIpICsgKHJmLzIpOworCQkJCWRzdFswXSA9IGxmOworCQkJCWRzdFsxXSA9IHJmOworCQkJCWRzdFsyXSA9IGxmIC0gY2U7CisJCQkJZHN0WzNdID0gcmYgLSBjZTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEFVRElPX1UxNjogeworCQkJVWludDggKnNyYywgKmRzdDsKKwkJCVVpbnQxNiBsZiwgcmYsIGNlLCBsciwgcnI7CisKKwkJCXNyYyA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dDsKKwkJCWRzdCA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyOworCisJCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7CisJCQkJCWRzdCAtPSA4OworCQkJCQlzcmMgLT0gNDsKKwkJCQkJbGYgPSAoVWludDE2KSgoc3JjWzBdPDw4KXxzcmNbMV0pOworCQkJCQlyZiA9IChVaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7CisJCQkJCWNlID0gKGxmLzIpICsgKHJmLzIpOworCQkJCQlyciA9IGxmIC0gY2U7CisJCQkJCWxyID0gcmYgLSBjZTsKKwkJCQkJCWRzdFsxXSA9IChsZiYweEZGKTsKKwkJCQkJCWRzdFswXSA9ICgobGY+PjgpJjB4RkYpOworCQkJCQkJZHN0WzNdID0gKHJmJjB4RkYpOworCQkJCQkJZHN0WzJdID0gKChyZj4+OCkmMHhGRik7CisKKwkJCQkJCWRzdFsxKzRdID0gKGxyJjB4RkYpOworCQkJCQkJZHN0WzArNF0gPSAoKGxyPj44KSYweEZGKTsKKwkJCQkJCWRzdFszKzRdID0gKHJyJjB4RkYpOworCQkJCQkJZHN0WzIrNF0gPSAoKHJyPj44KSYweEZGKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKKwkJCQkJZHN0IC09IDg7CisJCQkJCXNyYyAtPSA0OworCQkJCQlsZiA9IChVaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7CisJCQkJCXJmID0gKFVpbnQxNikoKHNyY1szXTw8OCl8c3JjWzJdKTsKKwkJCQkJY2UgPSAobGYvMikgKyAocmYvMik7CisJCQkJCXJyID0gbGYgLSBjZTsKKwkJCQkJbHIgPSByZiAtIGNlOworCQkJCQkJZHN0WzBdID0gKGxmJjB4RkYpOworCQkJCQkJZHN0WzFdID0gKChsZj4+OCkmMHhGRik7CisJCQkJCQlkc3RbMl0gPSAocmYmMHhGRik7CisJCQkJCQlkc3RbM10gPSAoKHJmPj44KSYweEZGKTsKKworCQkJCQkJZHN0WzArNF0gPSAobHImMHhGRik7CisJCQkJCQlkc3RbMSs0XSA9ICgobHI+PjgpJjB4RkYpOworCQkJCQkJZHN0WzIrNF0gPSAocnImMHhGRik7CisJCQkJCQlkc3RbMys0XSA9ICgocnI+PjgpJjB4RkYpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCQljYXNlIEFVRElPX1MxNjogeworCQkJVWludDggKnNyYywgKmRzdDsKKwkJCVNpbnQxNiBsZiwgcmYsIGNlLCBsciwgcnI7CisKKwkJCXNyYyA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dDsKKwkJCWRzdCA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyOworCisJCQlpZiAoIChmb3JtYXQgJiAweDEwMDApID09IDB4MTAwMCApIHsKKwkJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7CisJCQkJCWRzdCAtPSA4OworCQkJCQlzcmMgLT0gNDsKKwkJCQkJbGYgPSAoU2ludDE2KSgoc3JjWzBdPDw4KXxzcmNbMV0pOworCQkJCQlyZiA9IChTaW50MTYpKChzcmNbMl08PDgpfHNyY1szXSk7CisJCQkJCWNlID0gKGxmLzIpICsgKHJmLzIpOworCQkJCQlyciA9IGxmIC0gY2U7CisJCQkJCWxyID0gcmYgLSBjZTsKKwkJCQkJCWRzdFsxXSA9IChsZiYweEZGKTsKKwkJCQkJCWRzdFswXSA9ICgobGY+PjgpJjB4RkYpOworCQkJCQkJZHN0WzNdID0gKHJmJjB4RkYpOworCQkJCQkJZHN0WzJdID0gKChyZj4+OCkmMHhGRik7CisKKwkJCQkJCWRzdFsxKzRdID0gKGxyJjB4RkYpOworCQkJCQkJZHN0WzArNF0gPSAoKGxyPj44KSYweEZGKTsKKwkJCQkJCWRzdFszKzRdID0gKHJyJjB4RkYpOworCQkJCQkJZHN0WzIrNF0gPSAoKHJyPj44KSYweEZGKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKKwkJCQkJZHN0IC09IDg7CisJCQkJCXNyYyAtPSA0OworCQkJCQlsZiA9IChTaW50MTYpKChzcmNbMV08PDgpfHNyY1swXSk7CisJCQkJCXJmID0gKFNpbnQxNikoKHNyY1szXTw8OCl8c3JjWzJdKTsKKwkJCQkJY2UgPSAobGYvMikgKyAocmYvMik7CisJCQkJCXJyID0gbGYgLSBjZTsKKwkJCQkJbHIgPSByZiAtIGNlOworCQkJCQkJZHN0WzBdID0gKGxmJjB4RkYpOworCQkJCQkJZHN0WzFdID0gKChsZj4+OCkmMHhGRik7CisJCQkJCQlkc3RbMl0gPSAocmYmMHhGRik7CisJCQkJCQlkc3RbM10gPSAoKHJmPj44KSYweEZGKTsKKworCQkJCQkJZHN0WzArNF0gPSAobHImMHhGRik7CisJCQkJCQlkc3RbMSs0XSA9ICgobHI+PjgpJjB4RkYpOworCQkJCQkJZHN0WzIrNF0gPSAocnImMHhGRik7CisJCQkJCQlkc3RbMys0XSA9ICgocnI+PjgpJjB4RkYpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJY3Z0LT5sZW5fY3Z0ICo9IDI7CisJaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOworCX0KK30KKworCisvKiBDb252ZXJ0IDgtYml0IHRvIDE2LWJpdCAtIExTQiAqLwordm9pZCBTRExDQUxMIFNETF9Db252ZXJ0MTZMU0IoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCit7CisJaW50IGk7CisJVWludDggKnNyYywgKmRzdDsKKworI2lmZGVmIERFQlVHX0NPTlZFUlQKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgdG8gMTYtYml0IExTQlxuIik7CisjZW5kaWYKKwlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7CisJZHN0ID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjI7CisJZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKKwkJc3JjIC09IDE7CisJCWRzdCAtPSAyOworCQlkc3RbMV0gPSAqc3JjOworCQlkc3RbMF0gPSAwOworCX0KKwlmb3JtYXQgPSAoKGZvcm1hdCAmIH4weDAwMDgpIHwgQVVESU9fVTE2TFNCKTsKKwljdnQtPmxlbl9jdnQgKj0gMjsKKwlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKKwkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7CisJfQorfQorLyogQ29udmVydCA4LWJpdCB0byAxNi1iaXQgLSBNU0IgKi8KK3ZvaWQgU0RMQ0FMTCBTRExfQ29udmVydDE2TVNCKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQoreworCWludCBpOworCVVpbnQ4ICpzcmMsICpkc3Q7CisKKyNpZmRlZiBERUJVR19DT05WRVJUCisJZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIHRvIDE2LWJpdCBNU0JcbiIpOworI2VuZGlmCisJc3JjID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0OworCWRzdCA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyOworCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0OyBpOyAtLWkgKSB7CisJCXNyYyAtPSAxOworCQlkc3QgLT0gMjsKKwkJZHN0WzBdID0gKnNyYzsKKwkJZHN0WzFdID0gMDsKKwl9CisJZm9ybWF0ID0gKChmb3JtYXQgJiB+MHgwMDA4KSB8IEFVRElPX1UxNk1TQik7CisJY3Z0LT5sZW5fY3Z0ICo9IDI7CisJaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOworCX0KK30KKworLyogQ29udmVydCAxNi1iaXQgdG8gOC1iaXQgKi8KK3ZvaWQgU0RMQ0FMTCBTRExfQ29udmVydDgoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCit7CisJaW50IGk7CisJVWludDggKnNyYywgKmRzdDsKKworI2lmZGVmIERFQlVHX0NPTlZFUlQKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgdG8gOC1iaXRcbiIpOworI2VuZGlmCisJc3JjID0gY3Z0LT5idWY7CisJZHN0ID0gY3Z0LT5idWY7CisJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSAhPSAweDEwMDAgKSB7IC8qIExpdHRsZSBlbmRpYW4gKi8KKwkJKytzcmM7CisJfQorCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzI7IGk7IC0taSApIHsKKwkJKmRzdCA9ICpzcmM7CisJCXNyYyArPSAyOworCQlkc3QgKz0gMTsKKwl9CisJZm9ybWF0ID0gKChmb3JtYXQgJiB+MHg5MDEwKSB8IEFVRElPX1U4KTsKKwljdnQtPmxlbl9jdnQgLz0gMjsKKwlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKKwkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7CisJfQorfQorCisvKiBUb2dnbGUgc2lnbmVkL3Vuc2lnbmVkICovCit2b2lkIFNETENBTEwgU0RMX0NvbnZlcnRTaWduKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQoreworCWludCBpOworCVVpbnQ4ICpkYXRhOworCisjaWZkZWYgREVCVUdfQ09OVkVSVAorCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyBhdWRpbyBzaWduZWRuZXNzXG4iKTsKKyNlbmRpZgorCWRhdGEgPSBjdnQtPmJ1ZjsKKwlpZiAoIChmb3JtYXQgJiAweEZGKSA9PSAxNiApIHsKKwkJaWYgKCAoZm9ybWF0ICYgMHgxMDAwKSAhPSAweDEwMDAgKSB7IC8qIExpdHRsZSBlbmRpYW4gKi8KKwkJCSsrZGF0YTsKKwkJfQorCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8yOyBpOyAtLWkgKSB7CisJCQkqZGF0YSBePSAweDgwOworCQkJZGF0YSArPSAyOworCQl9CisJfSBlbHNlIHsKKwkJZm9yICggaT1jdnQtPmxlbl9jdnQ7IGk7IC0taSApIHsKKwkJCSpkYXRhKysgXj0gMHg4MDsKKwkJfQorCX0KKwlmb3JtYXQgPSAoZm9ybWF0IF4gMHg4MDAwKTsKKwlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKKwkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7CisJfQorfQorCisvKiBUb2dnbGUgZW5kaWFubmVzcyAqLwordm9pZCBTRExDQUxMIFNETF9Db252ZXJ0RW5kaWFuKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQoreworCWludCBpOworCVVpbnQ4ICpkYXRhLCB0bXA7CisKKyNpZmRlZiBERUJVR19DT05WRVJUCisJZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGF1ZGlvIGVuZGlhbm5lc3NcbiIpOworI2VuZGlmCisJZGF0YSA9IGN2dC0+YnVmOworCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzI7IGk7IC0taSApIHsKKwkJdG1wID0gZGF0YVswXTsKKwkJZGF0YVswXSA9IGRhdGFbMV07CisJCWRhdGFbMV0gPSB0bXA7CisJCWRhdGEgKz0gMjsKKwl9CisJZm9ybWF0ID0gKGZvcm1hdCBeIDB4MTAwMCk7CisJaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOworCX0KK30KKworLyogQ29udmVydCByYXRlIHVwIGJ5IG11bHRpcGxlIG9mIDIgKi8KK3ZvaWQgU0RMQ0FMTCBTRExfUmF0ZU1VTDIoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCit7CisJaW50IGk7CisJVWludDggKnNyYywgKmRzdDsKKworI2lmZGVmIERFQlVHX0NPTlZFUlQKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgYXVkaW8gcmF0ZSAqIDJcbiIpOworI2VuZGlmCisJc3JjID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0OworCWRzdCA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dCoyOworCXN3aXRjaCAoZm9ybWF0ICYgMHhGRikgeworCQljYXNlIDg6CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dDsgaTsgLS1pICkgeworCQkJCXNyYyAtPSAxOworCQkJCWRzdCAtPSAyOworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMF07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzI7IGk7IC0taSApIHsKKwkJCQlzcmMgLT0gMjsKKwkJCQlkc3QgLT0gNDsKKwkJCQlkc3RbMF0gPSBzcmNbMF07CisJCQkJZHN0WzFdID0gc3JjWzFdOworCQkJCWRzdFsyXSA9IHNyY1swXTsKKwkJCQlkc3RbM10gPSBzcmNbMV07CisJCQl9CisJCQlicmVhazsKKwl9CisJY3Z0LT5sZW5fY3Z0ICo9IDI7CisJaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOworCX0KK30KKworCisvKiBDb252ZXJ0IHJhdGUgdXAgYnkgbXVsdGlwbGUgb2YgMiwgZm9yIHN0ZXJlbyAqLwordm9pZCBTRExDQUxMIFNETF9SYXRlTVVMMl9jMihTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKK3sKKwlpbnQgaTsKKwlVaW50OCAqc3JjLCAqZHN0OworCisjaWZkZWYgREVCVUdfQ09OVkVSVAorCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyBhdWRpbyByYXRlICogMlxuIik7CisjZW5kaWYKKwlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7CisJZHN0ID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjI7CisJc3dpdGNoIChmb3JtYXQgJiAweEZGKSB7CisJCWNhc2UgODoKKwkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzI7IGk7IC0taSApIHsKKwkJCQlzcmMgLT0gMjsKKwkJCQlkc3QgLT0gNDsKKwkJCQlkc3RbMF0gPSBzcmNbMF07CisJCQkJZHN0WzFdID0gc3JjWzFdOworCQkJCWRzdFsyXSA9IHNyY1swXTsKKwkJCQlkc3RbM10gPSBzcmNbMV07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKKwkJCQlzcmMgLT0gNDsKKwkJCQlkc3QgLT0gODsKKwkJCQlkc3RbMF0gPSBzcmNbMF07CisJCQkJZHN0WzFdID0gc3JjWzFdOworCQkJCWRzdFsyXSA9IHNyY1syXTsKKwkJCQlkc3RbM10gPSBzcmNbM107CisJCQkJZHN0WzRdID0gc3JjWzBdOworCQkJCWRzdFs1XSA9IHNyY1sxXTsKKwkJCQlkc3RbNl0gPSBzcmNbMl07CisJCQkJZHN0WzddID0gc3JjWzNdOworCQkJfQorCQkJYnJlYWs7CisJfQorCWN2dC0+bGVuX2N2dCAqPSAyOworCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgeworCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKKwl9Cit9CisKKy8qIENvbnZlcnQgcmF0ZSB1cCBieSBtdWx0aXBsZSBvZiAyLCBmb3IgcXVhZCAqLwordm9pZCBTRExDQUxMIFNETF9SYXRlTVVMMl9jNChTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKK3sKKwlpbnQgaTsKKwlVaW50OCAqc3JjLCAqZHN0OworCisjaWZkZWYgREVCVUdfQ09OVkVSVAorCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyBhdWRpbyByYXRlICogMlxuIik7CisjZW5kaWYKKwlzcmMgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQ7CisJZHN0ID0gY3Z0LT5idWYrY3Z0LT5sZW5fY3Z0KjI7CisJc3dpdGNoIChmb3JtYXQgJiAweEZGKSB7CisJCWNhc2UgODoKKwkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzQ7IGk7IC0taSApIHsKKwkJCQlzcmMgLT0gNDsKKwkJCQlkc3QgLT0gODsKKwkJCQlkc3RbMF0gPSBzcmNbMF07CisJCQkJZHN0WzFdID0gc3JjWzFdOworCQkJCWRzdFsyXSA9IHNyY1syXTsKKwkJCQlkc3RbM10gPSBzcmNbM107CisJCQkJZHN0WzRdID0gc3JjWzBdOworCQkJCWRzdFs1XSA9IHNyY1sxXTsKKwkJCQlkc3RbNl0gPSBzcmNbMl07CisJCQkJZHN0WzddID0gc3JjWzNdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC84OyBpOyAtLWkgKSB7CisJCQkJc3JjIC09IDg7CisJCQkJZHN0IC09IDE2OworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJZHN0WzJdID0gc3JjWzJdOworCQkJCWRzdFszXSA9IHNyY1szXTsKKwkJCQlkc3RbNF0gPSBzcmNbNF07CisJCQkJZHN0WzVdID0gc3JjWzVdOworCQkJCWRzdFs2XSA9IHNyY1s2XTsKKwkJCQlkc3RbN10gPSBzcmNbN107CisJCQkJZHN0WzhdID0gc3JjWzBdOworCQkJCWRzdFs5XSA9IHNyY1sxXTsKKwkJCQlkc3RbMTBdID0gc3JjWzJdOworCQkJCWRzdFsxMV0gPSBzcmNbM107CisJCQkJZHN0WzEyXSA9IHNyY1s0XTsKKwkJCQlkc3RbMTNdID0gc3JjWzVdOworCQkJCWRzdFsxNF0gPSBzcmNbNl07CisJCQkJZHN0WzE1XSA9IHNyY1s3XTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwljdnQtPmxlbl9jdnQgKj0gMjsKKwlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKKwkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7CisJfQorfQorCisKKy8qIENvbnZlcnQgcmF0ZSB1cCBieSBtdWx0aXBsZSBvZiAyLCBmb3IgNS4xICovCit2b2lkIFNETENBTEwgU0RMX1JhdGVNVUwyX2M2KFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQoreworCWludCBpOworCVVpbnQ4ICpzcmMsICpkc3Q7CisKKyNpZmRlZiBERUJVR19DT05WRVJUCisJZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGF1ZGlvIHJhdGUgKiAyXG4iKTsKKyNlbmRpZgorCXNyYyA9IGN2dC0+YnVmK2N2dC0+bGVuX2N2dDsKKwlkc3QgPSBjdnQtPmJ1ZitjdnQtPmxlbl9jdnQqMjsKKwlzd2l0Y2ggKGZvcm1hdCAmIDB4RkYpIHsKKwkJY2FzZSA4OgorCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNjsgaTsgLS1pICkgeworCQkJCXNyYyAtPSA2OworCQkJCWRzdCAtPSAxMjsKKwkJCQlkc3RbMF0gPSBzcmNbMF07CisJCQkJZHN0WzFdID0gc3JjWzFdOworCQkJCWRzdFsyXSA9IHNyY1syXTsKKwkJCQlkc3RbM10gPSBzcmNbM107CisJCQkJZHN0WzRdID0gc3JjWzRdOworCQkJCWRzdFs1XSA9IHNyY1s1XTsKKwkJCQlkc3RbNl0gPSBzcmNbMF07CisJCQkJZHN0WzddID0gc3JjWzFdOworCQkJCWRzdFs4XSA9IHNyY1syXTsKKwkJCQlkc3RbOV0gPSBzcmNbM107CisJCQkJZHN0WzEwXSA9IHNyY1s0XTsKKwkJCQlkc3RbMTFdID0gc3JjWzVdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8xMjsgaTsgLS1pICkgeworCQkJCXNyYyAtPSAxMjsKKwkJCQlkc3QgLT0gMjQ7CisJCQkJZHN0WzBdID0gc3JjWzBdOworCQkJCWRzdFsxXSA9IHNyY1sxXTsKKwkJCQlkc3RbMl0gPSBzcmNbMl07CisJCQkJZHN0WzNdID0gc3JjWzNdOworCQkJCWRzdFs0XSA9IHNyY1s0XTsKKwkJCQlkc3RbNV0gPSBzcmNbNV07CisJCQkJZHN0WzZdID0gc3JjWzZdOworCQkJCWRzdFs3XSA9IHNyY1s3XTsKKwkJCQlkc3RbOF0gPSBzcmNbOF07CisJCQkJZHN0WzldID0gc3JjWzldOworCQkJCWRzdFsxMF0gPSBzcmNbMTBdOworCQkJCWRzdFsxMV0gPSBzcmNbMTFdOworCQkJCWRzdFsxMl0gPSBzcmNbMF07CisJCQkJZHN0WzEzXSA9IHNyY1sxXTsKKwkJCQlkc3RbMTRdID0gc3JjWzJdOworCQkJCWRzdFsxNV0gPSBzcmNbM107CisJCQkJZHN0WzE2XSA9IHNyY1s0XTsKKwkJCQlkc3RbMTddID0gc3JjWzVdOworCQkJCWRzdFsxOF0gPSBzcmNbNl07CisJCQkJZHN0WzE5XSA9IHNyY1s3XTsKKwkJCQlkc3RbMjBdID0gc3JjWzhdOworCQkJCWRzdFsyMV0gPSBzcmNbOV07CisJCQkJZHN0WzIyXSA9IHNyY1sxMF07CisJCQkJZHN0WzIzXSA9IHNyY1sxMV07CisJCQl9CisJCQlicmVhazsKKwl9CisJY3Z0LT5sZW5fY3Z0ICo9IDI7CisJaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOworCX0KK30KKworLyogQ29udmVydCByYXRlIGRvd24gYnkgbXVsdGlwbGUgb2YgMiAqLwordm9pZCBTRExDQUxMIFNETF9SYXRlRElWMihTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKK3sKKwlpbnQgaTsKKwlVaW50OCAqc3JjLCAqZHN0OworCisjaWZkZWYgREVCVUdfQ09OVkVSVAorCWZwcmludGYoc3RkZXJyLCAiQ29udmVydGluZyBhdWRpbyByYXRlIC8gMlxuIik7CisjZW5kaWYKKwlzcmMgPSBjdnQtPmJ1ZjsKKwlkc3QgPSBjdnQtPmJ1ZjsKKwlzd2l0Y2ggKGZvcm1hdCAmIDB4RkYpIHsKKwkJY2FzZSA4OgorCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvMjsgaTsgLS1pICkgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlzcmMgKz0gMjsKKwkJCQlkc3QgKz0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvNDsgaTsgLS1pICkgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJc3JjICs9IDQ7CisJCQkJZHN0ICs9IDI7CisJCQl9CisJCQlicmVhazsKKwl9CisJY3Z0LT5sZW5fY3Z0IC89IDI7CisJaWYgKCBjdnQtPmZpbHRlcnNbKytjdnQtPmZpbHRlcl9pbmRleF0gKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleF0oY3Z0LCBmb3JtYXQpOworCX0KK30KKworCisvKiBDb252ZXJ0IHJhdGUgZG93biBieSBtdWx0aXBsZSBvZiAyLCBmb3Igc3RlcmVvICovCit2b2lkIFNETENBTEwgU0RMX1JhdGVESVYyX2MyKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQoreworCWludCBpOworCVVpbnQ4ICpzcmMsICpkc3Q7CisKKyNpZmRlZiBERUJVR19DT05WRVJUCisJZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGF1ZGlvIHJhdGUgLyAyXG4iKTsKKyNlbmRpZgorCXNyYyA9IGN2dC0+YnVmOworCWRzdCA9IGN2dC0+YnVmOworCXN3aXRjaCAoZm9ybWF0ICYgMHhGRikgeworCQljYXNlIDg6CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC80OyBpOyAtLWkgKSB7CisJCQkJZHN0WzBdID0gc3JjWzBdOworCQkJCWRzdFsxXSA9IHNyY1sxXTsKKwkJCQlzcmMgKz0gNDsKKwkJCQlkc3QgKz0gMjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJZm9yICggaT1jdnQtPmxlbl9jdnQvODsgaTsgLS1pICkgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJZHN0WzJdID0gc3JjWzJdOworCQkJCWRzdFszXSA9IHNyY1szXTsKKwkJCQlzcmMgKz0gODsKKwkJCQlkc3QgKz0gNDsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwljdnQtPmxlbl9jdnQgLz0gMjsKKwlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKKwkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7CisJfQorfQorCisKKy8qIENvbnZlcnQgcmF0ZSBkb3duIGJ5IG11bHRpcGxlIG9mIDIsIGZvciBxdWFkICovCit2b2lkIFNETENBTEwgU0RMX1JhdGVESVYyX2M0KFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KQoreworCWludCBpOworCVVpbnQ4ICpzcmMsICpkc3Q7CisKKyNpZmRlZiBERUJVR19DT05WRVJUCisJZnByaW50ZihzdGRlcnIsICJDb252ZXJ0aW5nIGF1ZGlvIHJhdGUgLyAyXG4iKTsKKyNlbmRpZgorCXNyYyA9IGN2dC0+YnVmOworCWRzdCA9IGN2dC0+YnVmOworCXN3aXRjaCAoZm9ybWF0ICYgMHhGRikgeworCQljYXNlIDg6CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC84OyBpOyAtLWkgKSB7CisJCQkJZHN0WzBdID0gc3JjWzBdOworCQkJCWRzdFsxXSA9IHNyY1sxXTsKKwkJCQlkc3RbMl0gPSBzcmNbMl07CisJCQkJZHN0WzNdID0gc3JjWzNdOworCQkJCXNyYyArPSA4OworCQkJCWRzdCArPSA0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8xNjsgaTsgLS1pICkgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJZHN0WzJdID0gc3JjWzJdOworCQkJCWRzdFszXSA9IHNyY1szXTsKKwkJCQlkc3RbNF0gPSBzcmNbNF07CisJCQkJZHN0WzVdID0gc3JjWzVdOworCQkJCWRzdFs2XSA9IHNyY1s2XTsKKwkJCQlkc3RbN10gPSBzcmNbN107CisJCQkJc3JjICs9IDE2OworCQkJCWRzdCArPSA4OworCQkJfQorCQkJYnJlYWs7CisJfQorCWN2dC0+bGVuX2N2dCAvPSAyOworCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgeworCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKKwl9Cit9CisKKy8qIENvbnZlcnQgcmF0ZSBkb3duIGJ5IG11bHRpcGxlIG9mIDIsIGZvciA1LjEgKi8KK3ZvaWQgU0RMQ0FMTCBTRExfUmF0ZURJVjJfYzYoU0RMX0F1ZGlvQ1ZUICpjdnQsIFVpbnQxNiBmb3JtYXQpCit7CisJaW50IGk7CisJVWludDggKnNyYywgKmRzdDsKKworI2lmZGVmIERFQlVHX0NPTlZFUlQKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgYXVkaW8gcmF0ZSAvIDJcbiIpOworI2VuZGlmCisJc3JjID0gY3Z0LT5idWY7CisJZHN0ID0gY3Z0LT5idWY7CisJc3dpdGNoIChmb3JtYXQgJiAweEZGKSB7CisJCWNhc2UgODoKKwkJCWZvciAoIGk9Y3Z0LT5sZW5fY3Z0LzEyOyBpOyAtLWkgKSB7CisJCQkJZHN0WzBdID0gc3JjWzBdOworCQkJCWRzdFsxXSA9IHNyY1sxXTsKKwkJCQlkc3RbMl0gPSBzcmNbMl07CisJCQkJZHN0WzNdID0gc3JjWzNdOworCQkJCWRzdFs0XSA9IHNyY1s0XTsKKwkJCQlkc3RbNV0gPSBzcmNbNV07CisJCQkJc3JjICs9IDEyOworCQkJCWRzdCArPSA2OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlmb3IgKCBpPWN2dC0+bGVuX2N2dC8yNDsgaTsgLS1pICkgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJZHN0WzJdID0gc3JjWzJdOworCQkJCWRzdFszXSA9IHNyY1szXTsKKwkJCQlkc3RbNF0gPSBzcmNbNF07CisJCQkJZHN0WzVdID0gc3JjWzVdOworCQkJCWRzdFs2XSA9IHNyY1s2XTsKKwkJCQlkc3RbN10gPSBzcmNbN107CisJCQkJZHN0WzhdID0gc3JjWzhdOworCQkJCWRzdFs5XSA9IHNyY1s5XTsKKwkJCQlkc3RbMTBdID0gc3JjWzEwXTsKKwkJCQlkc3RbMTFdID0gc3JjWzExXTsKKwkJCQlzcmMgKz0gMjQ7CisJCQkJZHN0ICs9IDEyOworCQkJfQorCQkJYnJlYWs7CisJfQorCWN2dC0+bGVuX2N2dCAvPSAyOworCWlmICggY3Z0LT5maWx0ZXJzWysrY3Z0LT5maWx0ZXJfaW5kZXhdICkgeworCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXhdKGN2dCwgZm9ybWF0KTsKKwl9Cit9CisKKy8qIFZlcnkgc2xvdyByYXRlIGNvbnZlcnNpb24gcm91dGluZSAqLwordm9pZCBTRExDQUxMIFNETF9SYXRlU0xPVyhTRExfQXVkaW9DVlQgKmN2dCwgVWludDE2IGZvcm1hdCkKK3sKKwlkb3VibGUgaXBvczsKKwlpbnQgaSwgY2xlbjsKKworI2lmZGVmIERFQlVHX0NPTlZFUlQKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgYXVkaW8gcmF0ZSAqICU0LjRmXG4iLCAxLjAvY3Z0LT5yYXRlX2luY3IpOworI2VuZGlmCisJY2xlbiA9IChpbnQpKChkb3VibGUpY3Z0LT5sZW5fY3Z0IC8gY3Z0LT5yYXRlX2luY3IpOworCWlmICggY3Z0LT5yYXRlX2luY3IgPiAxLjAgKSB7CisJCXN3aXRjaCAoZm9ybWF0ICYgMHhGRikgeworCQkJY2FzZSA4OiB7CisJCQkJVWludDggKm91dHB1dDsKKworCQkJCW91dHB1dCA9IGN2dC0+YnVmOworCQkJCWlwb3MgPSAwLjA7CisJCQkJZm9yICggaT1jbGVuOyBpOyAtLWkgKSB7CisJCQkJCSpvdXRwdXQgPSBjdnQtPmJ1ZlsoaW50KWlwb3NdOworCQkJCQlpcG9zICs9IGN2dC0+cmF0ZV9pbmNyOworCQkJCQlvdXRwdXQgKz0gMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQkJY2FzZSAxNjogeworCQkJCVVpbnQxNiAqb3V0cHV0OworCisJCQkJY2xlbiAmPSB+MTsKKwkJCQlvdXRwdXQgPSAoVWludDE2ICopY3Z0LT5idWY7CisJCQkJaXBvcyA9IDAuMDsKKwkJCQlmb3IgKCBpPWNsZW4vMjsgaTsgLS1pICkgeworCQkJCQkqb3V0cHV0PSgoVWludDE2ICopY3Z0LT5idWYpWyhpbnQpaXBvc107CisJCQkJCWlwb3MgKz0gY3Z0LT5yYXRlX2luY3I7CisJCQkJCW91dHB1dCArPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChmb3JtYXQgJiAweEZGKSB7CisJCQljYXNlIDg6IHsKKwkJCQlVaW50OCAqb3V0cHV0OworCisJCQkJb3V0cHV0ID0gY3Z0LT5idWYrY2xlbjsKKwkJCQlpcG9zID0gKGRvdWJsZSljdnQtPmxlbl9jdnQ7CisJCQkJZm9yICggaT1jbGVuOyBpOyAtLWkgKSB7CisJCQkJCWlwb3MgLT0gY3Z0LT5yYXRlX2luY3I7CisJCQkJCW91dHB1dCAtPSAxOworCQkJCQkqb3V0cHV0ID0gY3Z0LT5idWZbKGludClpcG9zXTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQkJY2FzZSAxNjogeworCQkJCVVpbnQxNiAqb3V0cHV0OworCisJCQkJY2xlbiAmPSB+MTsKKwkJCQlvdXRwdXQgPSAoVWludDE2ICopKGN2dC0+YnVmK2NsZW4pOworCQkJCWlwb3MgPSAoZG91YmxlKWN2dC0+bGVuX2N2dC8yOworCQkJCWZvciAoIGk9Y2xlbi8yOyBpOyAtLWkgKSB7CisJCQkJCWlwb3MgLT0gY3Z0LT5yYXRlX2luY3I7CisJCQkJCW91dHB1dCAtPSAxOworCQkJCQkqb3V0cHV0PSgoVWludDE2ICopY3Z0LT5idWYpWyhpbnQpaXBvc107CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJY3Z0LT5sZW5fY3Z0ID0gY2xlbjsKKwlpZiAoIGN2dC0+ZmlsdGVyc1srK2N2dC0+ZmlsdGVyX2luZGV4XSApIHsKKwkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XShjdnQsIGZvcm1hdCk7CisJfQorfQorCitpbnQgU0RMX0NvbnZlcnRBdWRpbyhTRExfQXVkaW9DVlQgKmN2dCkKK3sKKwkvKiBNYWtlIHN1cmUgdGhlcmUncyBkYXRhIHRvIGNvbnZlcnQgKi8KKwlpZiAoIGN2dC0+YnVmID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiTm8gYnVmZmVyIGFsbG9jYXRlZCBmb3IgY29udmVyc2lvbiIpOworCQlyZXR1cm4oLTEpOworCX0KKwkvKiBSZXR1cm4gb2theSBpZiBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSAqLworCWN2dC0+bGVuX2N2dCA9IGN2dC0+bGVuOworCWlmICggY3Z0LT5maWx0ZXJzWzBdID09IE5VTEwgKSB7CisJCXJldHVybigwKTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIGNvbnZlcnNpb24gYW5kIGdvISAqLworCWN2dC0+ZmlsdGVyX2luZGV4ID0gMDsKKwljdnQtPmZpbHRlcnNbMF0oY3Z0LCBjdnQtPnNyY19mb3JtYXQpOworCXJldHVybigwKTsKK30KKworLyogQ3JlYXRlcyBhIHNldCBvZiBhdWRpbyBmaWx0ZXJzIHRvIGNvbnZlcnQgZnJvbSBvbmUgZm9ybWF0IHRvIGFub3RoZXIuIAorICAgUmV0dXJucyAtMSBpZiB0aGUgZm9ybWF0IGNvbnZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCwgb3IgMSBpZiB0aGUKKyAgIGF1ZGlvIGZpbHRlciBpcyBzZXQgdXAuCisqLworICAKK2ludCBTRExfQnVpbGRBdWRpb0NWVChTRExfQXVkaW9DVlQgKmN2dCwKKwlVaW50MTYgc3JjX2Zvcm1hdCwgVWludDggc3JjX2NoYW5uZWxzLCBpbnQgc3JjX3JhdGUsCisJVWludDE2IGRzdF9mb3JtYXQsIFVpbnQ4IGRzdF9jaGFubmVscywgaW50IGRzdF9yYXRlKQoreworLypwcmludGYoIkJ1aWxkIGZvcm1hdCAlMDR4LT4lMDR4LCBjaGFubmVscyAldS0+JXUsIHJhdGUgJWQtPiVkXG4iLAorCQlzcmNfZm9ybWF0LCBkc3RfZm9ybWF0LCBzcmNfY2hhbm5lbHMsIGRzdF9jaGFubmVscywgc3JjX3JhdGUsIGRzdF9yYXRlKTsqLworCS8qIFN0YXJ0IG9mZiB3aXRoIG5vIGNvbnZlcnNpb24gbmVjZXNzYXJ5ICovCisJY3Z0LT5uZWVkZWQgPSAwOworCWN2dC0+ZmlsdGVyX2luZGV4ID0gMDsKKwljdnQtPmZpbHRlcnNbMF0gPSBOVUxMOworCWN2dC0+bGVuX211bHQgPSAxOworCWN2dC0+bGVuX3JhdGlvID0gMS4wOworCisJLyogRmlyc3QgZmlsdGVyOiAgRW5kaWFuIGNvbnZlcnNpb24gZnJvbSBzcmMgdG8gZHN0ICovCisJaWYgKCAoc3JjX2Zvcm1hdCAmIDB4MTAwMCkgIT0gKGRzdF9mb3JtYXQgJiAweDEwMDApCisJICAgICAmJiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxNikgJiYgKChkc3RfZm9ybWF0ICYgMHhmZikgPT0gMTYpKSB7CisJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleCsrXSA9IFNETF9Db252ZXJ0RW5kaWFuOworCX0KKwkKKwkvKiBTZWNvbmQgZmlsdGVyOiBTaWduIGNvbnZlcnNpb24gLS0gc2lnbmVkL3Vuc2lnbmVkICovCisJaWYgKCAoc3JjX2Zvcm1hdCAmIDB4ODAwMCkgIT0gKGRzdF9mb3JtYXQgJiAweDgwMDApICkgeworCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXgrK10gPSBTRExfQ29udmVydFNpZ247CisJfQorCisJLyogTmV4dCBmaWx0ZXI6ICBDb252ZXJ0IDE2IGJpdCA8LS0+IDggYml0IFBDTSAqLworCWlmICggKHNyY19mb3JtYXQgJiAweEZGKSAhPSAoZHN0X2Zvcm1hdCAmIDB4RkYpICkgeworCQlzd2l0Y2ggKGRzdF9mb3JtYXQmMHgxMEZGKSB7CisJCQljYXNlIEFVRElPX1U4OgorCQkJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleCsrXSA9CisJCQkJCQkJIFNETF9Db252ZXJ0ODsKKwkJCQljdnQtPmxlbl9yYXRpbyAvPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSBBVURJT19VMTZMU0I6CisJCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0KKwkJCQkJCQlTRExfQ29udmVydDE2TFNCOworCQkJCWN2dC0+bGVuX211bHQgKj0gMjsKKwkJCQljdnQtPmxlbl9yYXRpbyAqPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSBBVURJT19VMTZNU0I6CisJCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0KKwkJCQkJCQlTRExfQ29udmVydDE2TVNCOworCQkJCWN2dC0+bGVuX211bHQgKj0gMjsKKwkJCQljdnQtPmxlbl9yYXRpbyAqPSAyOworCQkJCWJyZWFrOworCQl9CisJfQorCisJLyogTGFzdCBmaWx0ZXI6ICBNb25vL1N0ZXJlbyBjb252ZXJzaW9uICovCisJaWYgKCBzcmNfY2hhbm5lbHMgIT0gZHN0X2NoYW5uZWxzICkgeworCQlpZiAoIChzcmNfY2hhbm5lbHMgPT0gMSkgJiYgKGRzdF9jaGFubmVscyA+IDEpICkgeworCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0gCisJCQkJCQlTRExfQ29udmVydFN0ZXJlbzsKKwkJCWN2dC0+bGVuX211bHQgKj0gMjsKKwkJCXNyY19jaGFubmVscyA9IDI7CisJCQljdnQtPmxlbl9yYXRpbyAqPSAyOworCQl9CisJCWlmICggKHNyY19jaGFubmVscyA9PSAyKSAmJgorCQkJCShkc3RfY2hhbm5lbHMgPT0gNikgKSB7CisJCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXgrK10gPQorCQkJCQkJIFNETF9Db252ZXJ0U3Vycm91bmQ7CisJCQlzcmNfY2hhbm5lbHMgPSA2OworCQkJY3Z0LT5sZW5fbXVsdCAqPSAzOworCQkJY3Z0LT5sZW5fcmF0aW8gKj0gMzsKKwkJfQorCQlpZiAoIChzcmNfY2hhbm5lbHMgPT0gMikgJiYKKwkJCQkoZHN0X2NoYW5uZWxzID09IDQpICkgeworCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0KKwkJCQkJCSBTRExfQ29udmVydFN1cnJvdW5kXzQ7CisJCQlzcmNfY2hhbm5lbHMgPSA0OworCQkJY3Z0LT5sZW5fbXVsdCAqPSAyOworCQkJY3Z0LT5sZW5fcmF0aW8gKj0gMjsKKwkJfQorCQl3aGlsZSAoIChzcmNfY2hhbm5lbHMqMikgPD0gZHN0X2NoYW5uZWxzICkgeworCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0gCisJCQkJCQlTRExfQ29udmVydFN0ZXJlbzsKKwkJCWN2dC0+bGVuX211bHQgKj0gMjsKKwkJCXNyY19jaGFubmVscyAqPSAyOworCQkJY3Z0LT5sZW5fcmF0aW8gKj0gMjsKKwkJfQorCQlpZiAoIChzcmNfY2hhbm5lbHMgPT0gNikgJiYKKwkJCQkoZHN0X2NoYW5uZWxzIDw9IDIpICkgeworCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0KKwkJCQkJCSBTRExfQ29udmVydFN0cmlwOworCQkJc3JjX2NoYW5uZWxzID0gMjsKKwkJCWN2dC0+bGVuX3JhdGlvIC89IDM7CisJCX0KKwkJaWYgKCAoc3JjX2NoYW5uZWxzID09IDYpICYmCisJCQkJKGRzdF9jaGFubmVscyA9PSA0KSApIHsKKwkJCWN2dC0+ZmlsdGVyc1tjdnQtPmZpbHRlcl9pbmRleCsrXSA9CisJCQkJCQkgU0RMX0NvbnZlcnRTdHJpcF8yOworCQkJc3JjX2NoYW5uZWxzID0gNDsKKwkJCWN2dC0+bGVuX3JhdGlvIC89IDI7CisJCX0KKwkJLyogVGhpcyBhc3N1bWVzIHRoYXQgNCBjaGFubmVsIGF1ZGlvIGlzIGluIHRoZSBmb3JtYXQ6CisJCSAgICAgTGVmdCB7ZnJvbnQvYmFja30gKyBSaWdodCB7ZnJvbnQvYmFja30KKwkJICAgc28gY29udmVydGluZyB0byBML1Igc3RlcmVvIHdvcmtzIHByb3Blcmx5LgorCQkgKi8KKwkJd2hpbGUgKCAoKHNyY19jaGFubmVscyUyKSA9PSAwKSAmJgorCQkJCSgoc3JjX2NoYW5uZWxzLzIpID49IGRzdF9jaGFubmVscykgKSB7CisJCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXgrK10gPQorCQkJCQkJIFNETF9Db252ZXJ0TW9ubzsKKwkJCXNyY19jaGFubmVscyAvPSAyOworCQkJY3Z0LT5sZW5fcmF0aW8gLz0gMjsKKwkJfQorCQlpZiAoIHNyY19jaGFubmVscyAhPSBkc3RfY2hhbm5lbHMgKSB7CisJCQkvKiBVaCBvaC4uICovOworCQl9CisJfQorCisJLyogRG8gcmF0ZSBjb252ZXJzaW9uICovCisJY3Z0LT5yYXRlX2luY3IgPSAwLjA7CisJaWYgKCAoc3JjX3JhdGUvMTAwKSAhPSAoZHN0X3JhdGUvMTAwKSApIHsKKwkJVWludDMyIGhpX3JhdGUsIGxvX3JhdGU7CisJCWludCBsZW5fbXVsdDsKKwkJZG91YmxlIGxlbl9yYXRpbzsKKwkJdm9pZCAoU0RMQ0FMTCAqcmF0ZV9jdnQpKFNETF9BdWRpb0NWVCAqY3Z0LCBVaW50MTYgZm9ybWF0KTsKKworCQlpZiAoIHNyY19yYXRlID4gZHN0X3JhdGUgKSB7CisJCQloaV9yYXRlID0gc3JjX3JhdGU7CisJCQlsb19yYXRlID0gZHN0X3JhdGU7CisJCQlzd2l0Y2ggKHNyY19jaGFubmVscykgeworCQkJCWNhc2UgMTogcmF0ZV9jdnQgPSBTRExfUmF0ZURJVjI7IGJyZWFrOworCQkJCWNhc2UgMjogcmF0ZV9jdnQgPSBTRExfUmF0ZURJVjJfYzI7IGJyZWFrOworCQkJCWNhc2UgNDogcmF0ZV9jdnQgPSBTRExfUmF0ZURJVjJfYzQ7IGJyZWFrOworCQkJCWNhc2UgNjogcmF0ZV9jdnQgPSBTRExfUmF0ZURJVjJfYzY7IGJyZWFrOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJCWxlbl9tdWx0ID0gMTsKKwkJCWxlbl9yYXRpbyA9IDAuNTsKKwkJfSBlbHNlIHsKKwkJCWhpX3JhdGUgPSBkc3RfcmF0ZTsKKwkJCWxvX3JhdGUgPSBzcmNfcmF0ZTsKKwkJCXN3aXRjaCAoc3JjX2NoYW5uZWxzKSB7CisJCQkJY2FzZSAxOiByYXRlX2N2dCA9IFNETF9SYXRlTVVMMjsgYnJlYWs7CisJCQkJY2FzZSAyOiByYXRlX2N2dCA9IFNETF9SYXRlTVVMMl9jMjsgYnJlYWs7CisJCQkJY2FzZSA0OiByYXRlX2N2dCA9IFNETF9SYXRlTVVMMl9jNDsgYnJlYWs7CisJCQkJY2FzZSA2OiByYXRlX2N2dCA9IFNETF9SYXRlTVVMMl9jNjsgYnJlYWs7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQkJbGVuX211bHQgPSAyOworCQkJbGVuX3JhdGlvID0gMi4wOworCQl9CisJCS8qIElmIGhpX3JhdGUgPSBsb19yYXRlKjJeeCB0aGVuIGNvbnZlcnNpb24gaXMgZWFzeSAqLworCQl3aGlsZSAoICgobG9fcmF0ZSoyKS8xMDApIDw9IChoaV9yYXRlLzEwMCkgKSB7CisJCQljdnQtPmZpbHRlcnNbY3Z0LT5maWx0ZXJfaW5kZXgrK10gPSByYXRlX2N2dDsKKwkJCWN2dC0+bGVuX211bHQgKj0gbGVuX211bHQ7CisJCQlsb19yYXRlICo9IDI7CisJCQljdnQtPmxlbl9yYXRpbyAqPSBsZW5fcmF0aW87CisJCX0KKwkJLyogV2UgbWF5IG5lZWQgYSBzbG93IGNvbnZlcnNpb24gaGVyZSB0byBmaW5pc2ggdXAgKi8KKwkJaWYgKCAobG9fcmF0ZS8xMDApICE9IChoaV9yYXRlLzEwMCkgKSB7CisjaWYgMQorCQkJLyogVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgaWYgdGhlIGlucHV0IGJ1ZmZlciBpcworCQkJICAgc2F5IDFLLCBhbmQgdGhlIGNvbnZlcnNpb24gcmF0ZSBpcyBzYXkgMS4xLCB0aGVuIHRoZQorCQkJICAgb3V0cHV0IGJ1ZmZlciBpcyAxLjFLLCB3aGljaCBtYXkgbm90IGJlIGFuIGFjY2VwdGFibGUKKwkJCSAgIGJ1ZmZlciBzaXplIGZvciB0aGUgYXVkaW8gZHJpdmVyIChub3QgYSBwb3dlciBvZiAyKQorCQkJKi8KKwkJCS8qIEZvciBub3csIHB1bnQgYW5kIGhvcGUgdGhlIHJhdGUgZGlzdG9ydGlvbiBpc24ndCBncmVhdC4KKwkJCSovCisjZWxzZQorCQkJaWYgKCBzcmNfcmF0ZSA8IGRzdF9yYXRlICkgeworCQkJCWN2dC0+cmF0ZV9pbmNyID0gKGRvdWJsZSlsb19yYXRlL2hpX3JhdGU7CisJCQkJY3Z0LT5sZW5fbXVsdCAqPSAyOworCQkJCWN2dC0+bGVuX3JhdGlvIC89IGN2dC0+cmF0ZV9pbmNyOworCQkJfSBlbHNlIHsKKwkJCQljdnQtPnJhdGVfaW5jciA9IChkb3VibGUpaGlfcmF0ZS9sb19yYXRlOworCQkJCWN2dC0+bGVuX3JhdGlvICo9IGN2dC0+cmF0ZV9pbmNyOworCQkJfQorCQkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4KytdID0gU0RMX1JhdGVTTE9XOworI2VuZGlmCisJCX0KKwl9CisKKwkvKiBTZXQgdXAgdGhlIGZpbHRlciBpbmZvcm1hdGlvbiAqLworCWlmICggY3Z0LT5maWx0ZXJfaW5kZXggIT0gMCApIHsKKwkJY3Z0LT5uZWVkZWQgPSAxOworCQljdnQtPnNyY19mb3JtYXQgPSBzcmNfZm9ybWF0OworCQljdnQtPmRzdF9mb3JtYXQgPSBkc3RfZm9ybWF0OworCQljdnQtPmxlbiA9IDA7CisJCWN2dC0+YnVmID0gTlVMTDsKKwkJY3Z0LT5maWx0ZXJzW2N2dC0+ZmlsdGVyX2luZGV4XSA9IE5VTEw7CisJfQorCXJldHVybihjdnQtPm5lZWRlZCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9hdWRpb2Rldi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfYXVkaW9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTYxNTZjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfYXVkaW9kZXYuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEdldCB0aGUgbmFtZSBvZiB0aGUgYXVkaW8gZGV2aWNlIHdlIHVzZSBmb3Igb3V0cHV0ICovCisKKyNpZiBTRExfQVVESU9fRFJJVkVSX0JTRCB8fCBTRExfQVVESU9fRFJJVkVSX09TUyB8fCBTRExfQVVESU9fRFJJVkVSX1NVTkFVRElPCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisjaW5jbHVkZSAiU0RMX2F1ZGlvZGV2X2MuaCIKKworI2lmbmRlZiBfUEFUSF9ERVZfRFNQCisjaWYgZGVmaW5lZChfX05FVEJTRF9fKSB8fCBkZWZpbmVkKF9fT1BFTkJTRF9fKQorI2RlZmluZSBfUEFUSF9ERVZfRFNQICAiL2Rldi9hdWRpbyIKKyNlbHNlCisjZGVmaW5lIF9QQVRIX0RFVl9EU1AgICIvZGV2L2RzcCIKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIF9QQVRIX0RFVl9EU1AyNAorI2RlZmluZSBfUEFUSF9ERVZfRFNQMjQJIi9kZXYvc291bmQvZHNwIgorI2VuZGlmCisjaWZuZGVmIF9QQVRIX0RFVl9BVURJTworI2RlZmluZSBfUEFUSF9ERVZfQVVESU8JIi9kZXYvYXVkaW8iCisjZW5kaWYKKworCitpbnQgU0RMX09wZW5BdWRpb1BhdGgoY2hhciAqcGF0aCwgaW50IG1heGxlbiwgaW50IGZsYWdzLCBpbnQgY2xhc3NpYykKK3sKKwljb25zdCBjaGFyICphdWRpb2RldjsKKwlpbnQgYXVkaW9fZmQ7CisJY2hhciBhdWRpb3BhdGhbMTAyNF07CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgb3VyIGF1ZGlvIGRldmljZSBpcyAqLworCWlmICggKChhdWRpb2Rldj1TRExfZ2V0ZW52KCJTRExfUEFUSF9EU1AiKSkgPT0gTlVMTCkgJiYKKwkgICAgICgoYXVkaW9kZXY9U0RMX2dldGVudigiQVVESU9ERVYiKSkgPT0gTlVMTCkgKSB7CisJCWlmICggY2xhc3NpYyApIHsKKwkJCWF1ZGlvZGV2ID0gX1BBVEhfREVWX0FVRElPOworCQl9IGVsc2UgeworCQkJc3RydWN0IHN0YXQgc2I7CisKKwkJCS8qIEFkZGVkIHN1cHBvcnQgZm9yIC9kZXYvc291bmQvXCogaW4gTGludXggMi40ICovCisJCQlpZiAoICgoc3RhdCgiL2Rldi9zb3VuZCIsICZzYikgPT0gMCkgJiYgU19JU0RJUihzYi5zdF9tb2RlKSkgJiYKKwkJCQkgKChzdGF0KF9QQVRIX0RFVl9EU1AyNCwgJnNiKSA9PSAwKSAmJiBTX0lTQ0hSKHNiLnN0X21vZGUpKSApIHsKKwkJCQlhdWRpb2RldiA9IF9QQVRIX0RFVl9EU1AyNDsKKwkJCX0gZWxzZSB7CisJCQkJYXVkaW9kZXYgPSBfUEFUSF9ERVZfRFNQOworCQkJfQorCQl9CisJfQorCWF1ZGlvX2ZkID0gb3BlbihhdWRpb2RldiwgZmxhZ3MsIDApOworCisJLyogSWYgdGhlIGZpcnN0IG9wZW4gZmFpbHMsIGxvb2sgZm9yIG90aGVyIGRldmljZXMgKi8KKwlpZiAoIChhdWRpb19mZCA8IDApICYmIChTRExfc3RybGVuKGF1ZGlvZGV2KSA8IChzaXplb2YoYXVkaW9wYXRoKS0zKSkgKSB7CisJCWludCBleGlzdHMsIGluc3RhbmNlOworCQlzdHJ1Y3Qgc3RhdCBzYjsKKworCQlpbnN0YW5jZSA9IDE7CisJCWRvIHsgLyogRG9uJ3QgdXNlIGVycm5vIEVOT0VOVCAtIGl0IG1heSBub3QgYmUgdGhyZWFkLXNhZmUgKi8KKwkJCVNETF9zbnByaW50ZihhdWRpb3BhdGgsIFNETF9hcnJheXNpemUoYXVkaW9wYXRoKSwKKwkJCSAgICAgICAgICAgICAiJXMlZCIsIGF1ZGlvZGV2LCBpbnN0YW5jZSsrKTsKKwkJCWV4aXN0cyA9IDA7CisJCQlpZiAoIHN0YXQoYXVkaW9wYXRoLCAmc2IpID09IDAgKSB7CisJCQkJZXhpc3RzID0gMTsKKwkJCQlhdWRpb19mZCA9IG9wZW4oYXVkaW9wYXRoLCBmbGFncywgMCk7IAorCQkJfQorCQl9IHdoaWxlICggZXhpc3RzICYmIChhdWRpb19mZCA8IDApICk7CisJCWF1ZGlvZGV2ID0gYXVkaW9wYXRoOworCX0KKwlpZiAoIHBhdGggIT0gTlVMTCApIHsKKwkJU0RMX3N0cmxjcHkocGF0aCwgYXVkaW9kZXYsIG1heGxlbik7CisJCXBhdGhbbWF4bGVuLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuKGF1ZGlvX2ZkKTsKK30KKworI2VsaWYgU0RMX0FVRElPX0RSSVZFUl9QQVVECisKKy8qIEdldCB0aGUgbmFtZSBvZiB0aGUgYXVkaW8gZGV2aWNlIHdlIHVzZSBmb3Igb3V0cHV0ICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9hdWRpb2Rldl9jLmgiCisKKyNpZm5kZWYgX1BBVEhfREVWX0RTUAorI2RlZmluZSBfUEFUSF9ERVZfRFNQCSIvZGV2LyVjYXVkJWMvJWMiCisjZW5kaWYKKworY2hhciBkZXZzZXR0aW5nc1tdWzNdID0KK3sKKyAgICB7ICdwJywgJzAnLCAnMScgfSwgeyAncCcsICcwJywgJzInIH0sIHsgJ3AnLCAnMCcsICczJyB9LCB7ICdwJywgJzAnLCAnNCcgfSwKKyAgICB7ICdwJywgJzEnLCAnMScgfSwgeyAncCcsICcxJywgJzInIH0sIHsgJ3AnLCAnMScsICczJyB9LCB7ICdwJywgJzEnLCAnNCcgfSwKKyAgICB7ICdwJywgJzInLCAnMScgfSwgeyAncCcsICcyJywgJzInIH0sIHsgJ3AnLCAnMicsICczJyB9LCB7ICdwJywgJzInLCAnNCcgfSwKKyAgICB7ICdwJywgJzMnLCAnMScgfSwgeyAncCcsICczJywgJzInIH0sIHsgJ3AnLCAnMycsICczJyB9LCB7ICdwJywgJzMnLCAnNCcgfSwKKyAgICB7ICdiJywgJzAnLCAnMScgfSwgeyAnYicsICcwJywgJzInIH0sIHsgJ2InLCAnMCcsICczJyB9LCB7ICdiJywgJzAnLCAnNCcgfSwKKyAgICB7ICdiJywgJzEnLCAnMScgfSwgeyAnYicsICcxJywgJzInIH0sIHsgJ2InLCAnMScsICczJyB9LCB7ICdiJywgJzEnLCAnNCcgfSwKKyAgICB7ICdiJywgJzInLCAnMScgfSwgeyAnYicsICcyJywgJzInIH0sIHsgJ2InLCAnMicsICczJyB9LCB7ICdiJywgJzInLCAnNCcgfSwKKyAgICB7ICdiJywgJzMnLCAnMScgfSwgeyAnYicsICczJywgJzInIH0sIHsgJ2InLCAnMycsICczJyB9LCB7ICdiJywgJzMnLCAnNCcgfSwKKyAgICB7ICdcMCcsICdcMCcsICdcMCcgfQorfTsKKworc3RhdGljIGludCBPcGVuVXNlckRlZmluZWREZXZpY2UoY2hhciAqcGF0aCwgaW50IG1heGxlbiwgaW50IGZsYWdzKQoreworCWNvbnN0IGNoYXIgKmF1ZGlvZGV2OworCWludCAgYXVkaW9fZmQ7CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgb3VyIGF1ZGlvIGRldmljZSBpcyAqLworCWlmICgoYXVkaW9kZXY9U0RMX2dldGVudigiU0RMX1BBVEhfRFNQIikpID09IE5VTEwpIHsKKwkgICAgYXVkaW9kZXY9U0RMX2dldGVudigiQVVESU9ERVYiKTsKKwl9CisJaWYgKCBhdWRpb2RldiA9PSBOVUxMICkgeworCSAgICByZXR1cm4gLTE7CisJfQorCWF1ZGlvX2ZkID0gb3BlbihhdWRpb2RldiwgZmxhZ3MsIDApOworCWlmICggcGF0aCAhPSBOVUxMICkgeworCQlTRExfc3RybGNweShwYXRoLCBhdWRpb2RldiwgbWF4bGVuKTsKKwkJcGF0aFttYXhsZW4tMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gYXVkaW9fZmQ7Cit9CisKK2ludCBTRExfT3BlbkF1ZGlvUGF0aChjaGFyICpwYXRoLCBpbnQgbWF4bGVuLCBpbnQgZmxhZ3MsIGludCBjbGFzc2ljKQoreworICAgIHN0cnVjdCBzdGF0IHNiOworICAgIGludCAgICAgICAgIGF1ZGlvX2ZkOworICAgIGNoYXIgICAgICAgIGF1ZGlvcGF0aFsxMDI0XTsKKyAgICBpbnQgICAgICAgICBjeWNsZTsKKworICAgIGF1ZGlvX2ZkID0gT3BlblVzZXJEZWZpbmVkRGV2aWNlKHBhdGgsbWF4bGVuLGZsYWdzKTsKKyAgICBpZiAoIGF1ZGlvX2ZkICE9IC0xICkgeworICAgICAgICByZXR1cm4gYXVkaW9fZmQ7CisgICAgfQorCisgICAgY3ljbGUgICAgPSAwOworICAgIHdoaWxlKCBkZXZzZXR0aW5nc1tjeWNsZV1bMF0gIT0gJ1wwJyApIHsKKyAgICAgICAgU0RMX3NucHJpbnRmKCBhdWRpb3BhdGgsIFNETF9hcnJheXNpemUoYXVkaW9wYXRoKSwKKyAgICAgICAgICAgICAgICAgX1BBVEhfREVWX0RTUCwKKyAgICAgICAgICAgICAgICAgZGV2c2V0dGluZ3NbY3ljbGVdWzBdLAorICAgICAgICAgICAgICAgICBkZXZzZXR0aW5nc1tjeWNsZV1bMV0sCisgICAgICAgICAgICAgICAgIGRldnNldHRpbmdzW2N5Y2xlXVsyXSk7CisKKwlpZiAoIHN0YXQoYXVkaW9wYXRoLCAmc2IpID09IDAgKSB7CisJICAgIGF1ZGlvX2ZkID0gb3BlbihhdWRpb3BhdGgsIGZsYWdzLCAwKTsKKwkgICAgaWYgKCBhdWRpb19mZCA+IDAgKSB7CisJCWlmICggcGF0aCAhPSBOVUxMICkgeworCQkgICAgU0RMX3N0cmxjcHkoIHBhdGgsIGF1ZGlvcGF0aCwgbWF4bGVuICk7CisJCX0KKwkgICAgICAgIHJldHVybiBhdWRpb19mZDsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogQXVkaW8gZHJpdmVyIHNlbGVjdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfYXVkaW9kZXZfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfYXVkaW9kZXZfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWQwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9hdWRpb2Rldl9jLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSwgc3RvcmluZyB0aGUgcGF0aG5hbWUgaW4gJ3BhdGgnICAqLworZXh0ZXJuIGludCBTRExfT3BlbkF1ZGlvUGF0aChjaGFyICpwYXRoLCBpbnQgbWF4bGVuLCBpbnQgZmxhZ3MsIGludCBjbGFzc2ljKTsKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfYXVkaW9tZW0uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX2F1ZGlvbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3M2E1ZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX2F1ZGlvbWVtLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNkZWZpbmUgU0RMX0FsbG9jQXVkaW9NZW0JU0RMX21hbGxvYworI2RlZmluZSBTRExfRnJlZUF1ZGlvTWVtCVNETF9mcmVlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9taXhlci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfbWl4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQ0ZDhiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfbWl4ZXIuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgcHJvdmlkZXMgdGhlIGRlZmF1bHQgbWl4aW5nIGNhbGxiYWNrIGZvciB0aGUgU0RMIGF1ZGlvIHJvdXRpbmVzICovCisKKyNpbmNsdWRlICJTRExfY3B1aW5mby5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIlNETF9zeXNhdWRpby5oIgorI2luY2x1ZGUgIlNETF9taXhlcl9NTVguaCIKKyNpbmNsdWRlICJTRExfbWl4ZXJfTU1YX1ZDLmgiCisjaW5jbHVkZSAiU0RMX21peGVyX202OGsuaCIKKworLyogVGhpcyB0YWJsZSBpcyB1c2VkIHRvIGFkZCB0d28gc291bmQgdmFsdWVzIHRvZ2V0aGVyIGFuZCBwaW4KKyAqIHRoZSB2YWx1ZSB0byBhdm9pZCBvdmVyZmxvdy4gICh1c2VkIHdpdGggcGVybWlzc2lvbiBmcm9tIEFSREkpCisgKiBDaGFuZ2VkIHRvIHVzZSAweEZFIGluc3RlYWQgb2YgMHhGRiBmb3IgYmV0dGVyIHNvdW5kIHF1YWxpdHkuCisgKi8KK3N0YXRpYyBjb25zdCBVaW50OCBtaXg4W10gPQoreworICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLAorICAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLAorICAweDBGLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LAorICAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDFGLCAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LAorICAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDJCLCAweDJDLCAweDJELCAweDJFLCAweDJGLAorICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLAorICAweDNCLCAweDNDLCAweDNELCAweDNFLCAweDNGLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LAorICAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRBLCAweDRCLCAweDRDLCAweDRELCAweDRFLCAweDRGLCAweDUwLAorICAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVBLCAweDVCLAorICAweDVDLCAweDVELCAweDVFLCAweDVGLCAweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LAorICAweDY3LCAweDY4LCAweDY5LCAweDZBLCAweDZCLCAweDZDLCAweDZELCAweDZFLCAweDZGLCAweDcwLCAweDcxLAorICAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdBLCAweDdCLCAweDdDLAorICAweDdELCAweDdFLCAweDdGLCAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAweDg4LCAweDg5LCAweDhBLCAweDhCLCAweDhDLCAweDhELCAweDhFLCAweDhGLCAweDkwLCAweDkxLCAweDkyLAorICAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlBLCAweDlCLCAweDlDLCAweDlELAorICAweDlFLCAweDlGLCAweEEwLCAweEExLCAweEEyLCAweEEzLCAweEE0LCAweEE1LCAweEE2LCAweEE3LCAweEE4LAorICAweEE5LCAweEFBLCAweEFCLCAweEFDLCAweEFELCAweEFFLCAweEFGLCAweEIwLCAweEIxLCAweEIyLCAweEIzLAorICAweEI0LCAweEI1LCAweEI2LCAweEI3LCAweEI4LCAweEI5LCAweEJBLCAweEJCLCAweEJDLCAweEJELCAweEJFLAorICAweEJGLCAweEMwLCAweEMxLCAweEMyLCAweEMzLCAweEM0LCAweEM1LCAweEM2LCAweEM3LCAweEM4LCAweEM5LAorICAweENBLCAweENCLCAweENDLCAweENELCAweENFLCAweENGLCAweEQwLCAweEQxLCAweEQyLCAweEQzLCAweEQ0LAorICAweEQ1LCAweEQ2LCAweEQ3LCAweEQ4LCAweEQ5LCAweERBLCAweERCLCAweERDLCAweERELCAweERFLCAweERGLAorICAweEUwLCAweEUxLCAweEUyLCAweEUzLCAweEU0LCAweEU1LCAweEU2LCAweEU3LCAweEU4LCAweEU5LCAweEVBLAorICAweEVCLCAweEVDLCAweEVELCAweEVFLCAweEVGLCAweEYwLCAweEYxLCAweEYyLCAweEYzLCAweEY0LCAweEY1LAorICAweEY2LCAweEY3LCAweEY4LCAweEY5LCAweEZBLCAweEZCLCAweEZDLCAweEZELCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFCit9OworCisvKiBUaGUgdm9sdW1lIHJhbmdlcyBmcm9tIDAgLSAxMjggKi8KKyNkZWZpbmUgQURKVVNUX1ZPTFVNRShzLCB2KQkocyA9IChzKnYpL1NETF9NSVhfTUFYVk9MVU1FKQorI2RlZmluZSBBREpVU1RfVk9MVU1FX1U4KHMsIHYpCShzID0gKCgocy0xMjgpKnYpL1NETF9NSVhfTUFYVk9MVU1FKSsxMjgpCisKK3ZvaWQgU0RMX01peEF1ZGlvIChVaW50OCAqZHN0LCBjb25zdCBVaW50OCAqc3JjLCBVaW50MzIgbGVuLCBpbnQgdm9sdW1lKQoreworCVVpbnQxNiBmb3JtYXQ7CisKKwlpZiAoIHZvbHVtZSA9PSAwICkgeworCQlyZXR1cm47CisJfQorCS8qIE1peCB0aGUgdXNlci1sZXZlbCBhdWRpbyBmb3JtYXQgKi8KKwlpZiAoIGN1cnJlbnRfYXVkaW8gKSB7CisJCWlmICggY3VycmVudF9hdWRpby0+Y29udmVydC5uZWVkZWQgKSB7CisJCQlmb3JtYXQgPSBjdXJyZW50X2F1ZGlvLT5jb252ZXJ0LnNyY19mb3JtYXQ7CisJCX0gZWxzZSB7CisJCQlmb3JtYXQgPSBjdXJyZW50X2F1ZGlvLT5zcGVjLmZvcm1hdDsKKwkJfQorCX0gZWxzZSB7CisgIAkJLyogSEFDSyBIQUNLIEhBQ0sgKi8KKwkJZm9ybWF0ID0gQVVESU9fUzE2OworCX0KKwlzd2l0Y2ggKGZvcm1hdCkgeworCisJCWNhc2UgQVVESU9fVTg6IHsKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX202OGtfXykgJiYgIWRlZmluZWQoX19tY29sZGZpcmVfXykpICYmIGRlZmluZWQoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQorCQkJU0RMX01peEF1ZGlvX202OGtfVTgoKGNoYXIqKWRzdCwoY2hhciopc3JjLCh1bnNpZ25lZCBsb25nKWxlbiwobG9uZyl2b2x1bWUsKGNoYXIgKiltaXg4KTsKKyNlbHNlCisJCQlVaW50OCBzcmNfc2FtcGxlOworCisJCQl3aGlsZSAoIGxlbi0tICkgeworCQkJCXNyY19zYW1wbGUgPSAqc3JjOworCQkJCUFESlVTVF9WT0xVTUVfVTgoc3JjX3NhbXBsZSwgdm9sdW1lKTsKKwkJCQkqZHN0ID0gbWl4OFsqZHN0K3NyY19zYW1wbGVdOworCQkJCSsrZHN0OworCQkJCSsrc3JjOworCQkJfQorI2VuZGlmCisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBVURJT19TODogeworI2lmIGRlZmluZWQoU0RMX0JVR0dZX01NWF9NSVhFUlMpIC8qIGJ1Z2d5LCBzbyB3ZSdyZSBkaXNhYmxpbmcgdGhlbS4gLS1yeWFuLiAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQorCQkJaWYgKFNETF9IYXNNTVgoKSkKKwkJCXsKKwkJCQlTRExfTWl4QXVkaW9fTU1YX1M4KChjaGFyKilkc3QsKGNoYXIqKXNyYywodW5zaWduZWQgaW50KWxlbiwoaW50KXZvbHVtZSk7CisJCQl9CisJCQllbHNlCisjZWxpZiAoKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikpIHx8IGRlZmluZWQoX19XQVRDT01DX18pKSAmJiBkZWZpbmVkKFNETF9BU1NFTUJMWV9ST1VUSU5FUykKKwkJCWlmIChTRExfSGFzTU1YKCkpCisJCQl7CisJCQkJU0RMX01peEF1ZGlvX01NWF9TOF9WQygoY2hhciopZHN0LChjaGFyKilzcmMsKHVuc2lnbmVkIGludClsZW4sKGludCl2b2x1bWUpOworCQkJfQorCQkJZWxzZQorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9fbTY4a19fKSAmJiAhZGVmaW5lZChfX21jb2xkZmlyZV9fKSkgJiYgZGVmaW5lZChTRExfQVNTRU1CTFlfUk9VVElORVMpCisJCQlTRExfTWl4QXVkaW9fbTY4a19TOCgoY2hhciopZHN0LChjaGFyKilzcmMsKHVuc2lnbmVkIGxvbmcpbGVuLChsb25nKXZvbHVtZSk7CisjZWxzZQorCQkJeworCQkJU2ludDggKmRzdDgsICpzcmM4OworCQkJU2ludDggc3JjX3NhbXBsZTsKKwkJCWludCBkc3Rfc2FtcGxlOworCQkJY29uc3QgaW50IG1heF9hdWRpb3ZhbCA9ICgoMTw8KDgtMSkpLTEpOworCQkJY29uc3QgaW50IG1pbl9hdWRpb3ZhbCA9IC0oMTw8KDgtMSkpOworCisJCQlzcmM4ID0gKFNpbnQ4ICopc3JjOworCQkJZHN0OCA9IChTaW50OCAqKWRzdDsKKwkJCXdoaWxlICggbGVuLS0gKSB7CisJCQkJc3JjX3NhbXBsZSA9ICpzcmM4OworCQkJCUFESlVTVF9WT0xVTUUoc3JjX3NhbXBsZSwgdm9sdW1lKTsKKwkJCQlkc3Rfc2FtcGxlID0gKmRzdDggKyBzcmNfc2FtcGxlOworCQkJCWlmICggZHN0X3NhbXBsZSA+IG1heF9hdWRpb3ZhbCApIHsKKwkJCQkJKmRzdDggPSBtYXhfYXVkaW92YWw7CisJCQkJfSBlbHNlCisJCQkJaWYgKCBkc3Rfc2FtcGxlIDwgbWluX2F1ZGlvdmFsICkgeworCQkJCQkqZHN0OCA9IG1pbl9hdWRpb3ZhbDsKKwkJCQl9IGVsc2UgeworCQkJCQkqZHN0OCA9IGRzdF9zYW1wbGU7CisJCQkJfQorCQkJCSsrZHN0ODsKKwkJCQkrK3NyYzg7CisJCQl9CisJCQl9CisjZW5kaWYKKwkJfQorCQlicmVhazsKKworCQljYXNlIEFVRElPX1MxNkxTQjogeworI2lmIGRlZmluZWQoU0RMX0JVR0dZX01NWF9NSVhFUlMpIC8qIGJ1Z2d5LCBzbyB3ZSdyZSBkaXNhYmxpbmcgdGhlbS4gLS1yeWFuLiAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQorCQkJaWYgKFNETF9IYXNNTVgoKSkKKwkJCXsKKwkJCQlTRExfTWl4QXVkaW9fTU1YX1MxNigoY2hhciopZHN0LChjaGFyKilzcmMsKHVuc2lnbmVkIGludClsZW4sKGludCl2b2x1bWUpOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VsaWYgKChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSkgJiYgZGVmaW5lZChTRExfQVNTRU1CTFlfUk9VVElORVMpCisJCQlpZiAoU0RMX0hhc01NWCgpKQorCQkJeworCQkJCVNETF9NaXhBdWRpb19NTVhfUzE2X1ZDKChjaGFyKilkc3QsKGNoYXIqKXNyYywodW5zaWduZWQgaW50KWxlbiwoaW50KXZvbHVtZSk7CisJCQl9CisJCQllbHNlCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19tNjhrX18pICYmICFkZWZpbmVkKF9fbWNvbGRmaXJlX18pKSAmJiBkZWZpbmVkKFNETF9BU1NFTUJMWV9ST1VUSU5FUykKKwkJCVNETF9NaXhBdWRpb19tNjhrX1MxNkxTQigoc2hvcnQqKWRzdCwoc2hvcnQqKXNyYywodW5zaWduZWQgbG9uZylsZW4sKGxvbmcpdm9sdW1lKTsKKyNlbHNlCisJCQl7CisJCQlTaW50MTYgc3JjMSwgc3JjMjsKKwkJCWludCBkc3Rfc2FtcGxlOworCQkJY29uc3QgaW50IG1heF9hdWRpb3ZhbCA9ICgoMTw8KDE2LTEpKS0xKTsKKwkJCWNvbnN0IGludCBtaW5fYXVkaW92YWwgPSAtKDE8PCgxNi0xKSk7CisKKwkJCWxlbiAvPSAyOworCQkJd2hpbGUgKCBsZW4tLSApIHsKKwkJCQlzcmMxID0gKChzcmNbMV0pPDw4fHNyY1swXSk7CisJCQkJQURKVVNUX1ZPTFVNRShzcmMxLCB2b2x1bWUpOworCQkJCXNyYzIgPSAoKGRzdFsxXSk8PDh8ZHN0WzBdKTsKKwkJCQlzcmMgKz0gMjsKKwkJCQlkc3Rfc2FtcGxlID0gc3JjMStzcmMyOworCQkJCWlmICggZHN0X3NhbXBsZSA+IG1heF9hdWRpb3ZhbCApIHsKKwkJCQkJZHN0X3NhbXBsZSA9IG1heF9hdWRpb3ZhbDsKKwkJCQl9IGVsc2UKKwkJCQlpZiAoIGRzdF9zYW1wbGUgPCBtaW5fYXVkaW92YWwgKSB7CisJCQkJCWRzdF9zYW1wbGUgPSBtaW5fYXVkaW92YWw7CisJCQkJfQorCQkJCWRzdFswXSA9IGRzdF9zYW1wbGUmMHhGRjsKKwkJCQlkc3Rfc2FtcGxlID4+PSA4OworCQkJCWRzdFsxXSA9IGRzdF9zYW1wbGUmMHhGRjsKKwkJCQlkc3QgKz0gMjsKKwkJCX0KKwkJCX0KKyNlbmRpZgorCQl9CisJCWJyZWFrOworCisJCWNhc2UgQVVESU9fUzE2TVNCOiB7CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19tNjhrX18pICYmICFkZWZpbmVkKF9fbWNvbGRmaXJlX18pKSAmJiBkZWZpbmVkKFNETF9BU1NFTUJMWV9ST1VUSU5FUykKKwkJCVNETF9NaXhBdWRpb19tNjhrX1MxNk1TQigoc2hvcnQqKWRzdCwoc2hvcnQqKXNyYywodW5zaWduZWQgbG9uZylsZW4sKGxvbmcpdm9sdW1lKTsKKyNlbHNlCisJCQlTaW50MTYgc3JjMSwgc3JjMjsKKwkJCWludCBkc3Rfc2FtcGxlOworCQkJY29uc3QgaW50IG1heF9hdWRpb3ZhbCA9ICgoMTw8KDE2LTEpKS0xKTsKKwkJCWNvbnN0IGludCBtaW5fYXVkaW92YWwgPSAtKDE8PCgxNi0xKSk7CisKKwkJCWxlbiAvPSAyOworCQkJd2hpbGUgKCBsZW4tLSApIHsKKwkJCQlzcmMxID0gKChzcmNbMF0pPDw4fHNyY1sxXSk7CisJCQkJQURKVVNUX1ZPTFVNRShzcmMxLCB2b2x1bWUpOworCQkJCXNyYzIgPSAoKGRzdFswXSk8PDh8ZHN0WzFdKTsKKwkJCQlzcmMgKz0gMjsKKwkJCQlkc3Rfc2FtcGxlID0gc3JjMStzcmMyOworCQkJCWlmICggZHN0X3NhbXBsZSA+IG1heF9hdWRpb3ZhbCApIHsKKwkJCQkJZHN0X3NhbXBsZSA9IG1heF9hdWRpb3ZhbDsKKwkJCQl9IGVsc2UKKwkJCQlpZiAoIGRzdF9zYW1wbGUgPCBtaW5fYXVkaW92YWwgKSB7CisJCQkJCWRzdF9zYW1wbGUgPSBtaW5fYXVkaW92YWw7CisJCQkJfQorCQkJCWRzdFsxXSA9IGRzdF9zYW1wbGUmMHhGRjsKKwkJCQlkc3Rfc2FtcGxlID4+PSA4OworCQkJCWRzdFswXSA9IGRzdF9zYW1wbGUmMHhGRjsKKwkJCQlkc3QgKz0gMjsKKwkJCX0KKyNlbmRpZgorCQl9CisJCWJyZWFrOworCisJCWRlZmF1bHQ6IC8qIElmIHRoaXMgaGFwcGVucy4uLiBGSVhNRSEgKi8KKwkJCVNETF9TZXRFcnJvcigiU0RMX01peEF1ZGlvKCk6IHVua25vd24gYXVkaW8gZm9ybWF0Iik7CisJCQlyZXR1cm47CisJfQorfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9taXhlcl9NTVguYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX21peGVyX01NWC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjFkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9taXhlcl9NTVguYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgICAgTU1YIGFzc2VtYmxlciB2ZXJzaW9uIG9mIFNETF9NaXhBdWRpbyBmb3Igc2lnbmVkIGxpdHRsZSBlbmRpYW4gMTYgYml0IHNhbXBsZXMgYW5kIHNpZ25lZCA4IGJpdCBzYW1wbGVzCisgICAgQ29weXJpZ2h0IDIwMDIgU3RlcGhhbmUgTWFyY2hlc2luIChzdGVwaGFuZS5tYXJjaGVzaW5Ad2FuYWRvby5mcikKKyAgICBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIExHUEwgKHNlZSBDT1BZSU5HIGZvciBkZXRhaWxzKQorIAorICAgIEFzc3VtZXMgYnVmZmVyIHNpemUgaW4gYnl0ZXMgaXMgYSBtdWx0aXBsZSBvZiAxNgorICAgIEFzc3VtZXMgU0RMX01JWF9NQVhWT0xVTUUgPSAxMjgKKyovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgTWl4aW5nIGZvciAxNiBiaXQgc2lnbmVkIGJ1ZmZlcnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChTRExfQlVHR1lfTU1YX01JWEVSUykgLyogYnVnZ3ksIHNvIHdlJ3JlIGRpc2FibGluZyB0aGVtLiAtLXJ5YW4uICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChTRExfQVNTRU1CTFlfUk9VVElORVMpCit2b2lkIFNETF9NaXhBdWRpb19NTVhfUzE2KGNoYXIqIGRzdCxjaGFyKiBzcmMsdW5zaWduZWQgaW50IHNpemUsaW50IHZvbHVtZSkKK3sKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisKKyIJbW92bCAlMywlJWVheFxuIgkvKiBlYXggPSB2b2x1bWUgKi8KKworIgltb3ZsICUyLCUlZWR4XG4iCS8qIGVkeCA9IHNpemUgKi8KKworIglzaHJsICQ0LCUlZWR4XG4iCS8qIHByb2Nlc3MgMTYgYnl0ZXMgcGVyIGl0ZXJhdGlvbiA9IDggc2FtcGxlcyAqLworCisiCWp6IC5lbmRTMTZcbiIKKworIglweG9yICUlbW0wLCUlbW0wXG4iCisKKyIJbW92ZCAlJWVheCwlJW1tMFxuIgorIgltb3ZxICUlbW0wLCUlbW0xXG4iCisiCXBzbGxxICQxNiwlJW1tMFxuIgorIglwb3IgJSVtbTEsJSVtbTBcbiIKKyIJcHNsbHEgJDE2LCUlbW0wXG4iCisiCXBvciAlJW1tMSwlJW1tMFxuIgorIglwc2xscSAkMTYsJSVtbTBcbiIKKyIJcG9yICUlbW0xLCUlbW0wXG4iCQkvKiBtbTAgPSB2b2x8dm9sfHZvbHx2b2wgKi8KKworIi5hbGlnbiA4XG4iCisiCS5taXhsb29wUzE2OlxuIgorCisiCW1vdnEgKCUxKSwlJW1tMVxuIiAvKiBtbTEgPSBhfGJ8Y3xkICovCisKKyIJbW92cSAlJW1tMSwlJW1tMlxuIiAvKiBtbTIgPSBhfGJ8Y3xkICovCisKKyIJbW92cSA4KCUxKSwlJW1tNFxuIiAvKiBtbTQgPSBlfGZ8Z3xoICovCisKKwkvKiBwcukgY2hhcmdlciBsZSBidWZmZXIgZHN0IGRhbnMgbW03ICovCisiCW1vdnEgKCUwKSwlJW1tN1xuIiAvKiBtbTcgPSBkc3RbMF0gKi8KKworCS8qIG11bHRpcGxpZXIgcGFyIGxlIHZvbHVtZSAqLworIglwbXVsbHcgJSVtbTAsJSVtbTFcbiIgLyogbW0xID0gbChhKnYpfGwoYip2KXxsKGMqdil8bChkKnYpICovCisKKyIJcG11bGh3ICUlbW0wLCUlbW0yXG4iIC8qIG1tMiA9IGgoYSp2KXxoKGIqdil8aChjKnYpfGgoZCp2KSAqLworIgltb3ZxICUlbW00LCUlbW01XG4iIC8qIG1tNSA9IGV8ZnxnfGggKi8KKworIglwbXVsbHcgJSVtbTAsJSVtbTRcbiIgLyogbW00ID0gbChlKnYpfGwoZip2KXxsKGcqdil8bChoKnYpICovCisKKyIJcG11bGh3ICUlbW0wLCUlbW01XG4iIC8qIG1tNSA9IGgoZSp2KXxoKGYqdil8aChnKnYpfGgoaCp2KSAqLworIgltb3ZxICUlbW0xLCUlbW0zXG4iIC8qIG1tMyA9IGwoYSp2KXxsKGIqdil8bChjKnYpfGwoZCp2KSAqLworCisiCXB1bnBja2h3ZCAlJW1tMiwlJW1tMVxuIiAvKiBtbTEgPSBhKnZ8Yip2ICovCisKKyIJbW92cSAlJW1tNCwlJW1tNlxuIiAvKiBtbTYgPSBsKGUqdil8bChmKnYpfGwoZyp2KXxsKGgqdikgKi8KKyIJcHVucGNrbHdkICUlbW0yLCUlbW0zXG4iIC8qIG1tMyA9IGMqdnxkKnYgKi8KKworIglwdW5wY2tod2QgJSVtbTUsJSVtbTRcbiIgLyogbW00ID0gZSpmfGYqdiAqLworCisiCXB1bnBja2x3ZCAlJW1tNSwlJW1tNlxuIiAvKiBtbTYgPSBnKnZ8aCp2ICovCisKKwkvKiBwcukgY2hhcmdlciBsZSBidWZmZXIgZHN0IGRhbnMgbW01ICovCisiCW1vdnEgOCglMCksJSVtbTVcbiIgLyogbW01ID0gZHN0WzFdICovCisKKwkvKiBkaXZpc2VyIHBhciAxMjggKi8KKyIJcHNyYWQgJDcsJSVtbTFcbiIgLyogbW0xID0gYSp2LzEyOHxiKnYvMTI4ICwgMTI4ID0gU0RMX01JWF9NQVhWT0xVTUUgKi8KKyIJYWRkICQxNiwlMVxuIgorCisiCXBzcmFkICQ3LCUlbW0zXG4iIC8qIG1tMyA9IGMqdi8xMjh8ZCp2LzEyOCAqLworCisiCXBzcmFkICQ3LCUlbW00XG4iIC8qIG1tNCA9IGUqdi8xMjh8Zip2LzEyOCAqLworCisJLyogbW0xID0gbGUgc2FtcGxlIGF2ZWMgbGUgdm9sdW1lIG1vZGlmaekgKi8KKyIJcGFja3NzZHcgJSVtbTEsJSVtbTNcbiIgLyogbW0zID0gcyhhKnZ8Yip2fGMqdnxkKnYpICovCisKKyIJcHNyYWQgJDcsJSVtbTZcbiIgLyogbW02PSBnKnYvMTI4fGgqdi8xMjggKi8KKyIJcGFkZHN3ICUlbW03LCUlbW0zXG4iIC8qIG1tMyA9IGFkanVzdF92b2x1bWUoc3JjKStkc3QgKi8KKworCS8qIG1tNCA9IGxlIHNhbXBsZSBhdmVjIGxlIHZvbHVtZSBtb2RpZmnpICovCisiCXBhY2tzc2R3ICUlbW00LCUlbW02XG4iIC8qIG1tNiA9IHMoZSp2fGYqdnxnKnZ8aCp2KSAqLworIgltb3ZxICUlbW0zLCglMClcbiIKKworIglwYWRkc3cgJSVtbTUsJSVtbTZcbiIgLyogbW02ID0gYWRqdXN0X3ZvbHVtZShzcmMpK2RzdCAqLworCisiCW1vdnEgJSVtbTYsOCglMClcbiIKKworIglhZGQgJDE2LCUwXG4iCisKKyIJZGVjICUlZWR4XG4iCisKKyIJam56IC5taXhsb29wUzE2XG4iCisKKyIJZW1tc1xuIgorCisiLmVuZFMxNjpcbiIKKwkgOgorCSA6ICJyIiAoZHN0KSwgInIiKHNyYyksIm0iKHNpemUpLAorCSAibSIodm9sdW1lKQorCSA6ICJlYXgiLCJlZHgiLCJtZW1vcnkiCisJICk7Cit9CisKKworCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIE1peGluZyBmb3IgOCBiaXQgc2lnbmVkIGJ1ZmZlcnMgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCit2b2lkIFNETF9NaXhBdWRpb19NTVhfUzgoY2hhciogZHN0LGNoYXIqIHNyYyx1bnNpZ25lZCBpbnQgc2l6ZSxpbnQgdm9sdW1lKQoreworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKworIgltb3ZsICUzLCUlZWF4XG4iCS8qIGVheCA9IHZvbHVtZSAqLworCisiCW1vdmQgJSVlYXgsJSVtbTBcbiIKKyIJbW92cSAlJW1tMCwlJW1tMVxuIgorIglwc2xscSAkMTYsJSVtbTBcbiIKKyIJcG9yICUlbW0xLCUlbW0wXG4iCisiCXBzbGxxICQxNiwlJW1tMFxuIgorIglwb3IgJSVtbTEsJSVtbTBcbiIKKyIJcHNsbHEgJDE2LCUlbW0wXG4iCisiCXBvciAlJW1tMSwlJW1tMFxuIgorCisiCW1vdmwgJTIsJSVlZHhcbiIJLyogZWR4ID0gc2l6ZSAqLworIglzaHIgJDMsJSVlZHhcbiIJLyogcHJvY2VzcyA4IGJ5dGVzIHBlciBpdGVyYXRpb24gPSA4IHNhbXBsZXMgKi8KKworIgljbXAgJDAsJSVlZHhcbiIKKyIJamUgLmVuZFM4XG4iCisKKyIuYWxpZ24gOFxuIgorIgkubWl4bG9vcFM4OlxuIgorCisiCXB4b3IgJSVtbTIsJSVtbTJcbiIJCS8qIG1tMiA9IDAgKi8KKyIJbW92cSAoJTEpLCUlbW0xXG4iCS8qIG1tMSA9IGF8YnxjfGR8ZXxmfGd8aCAqLworCisiCW1vdnEgJSVtbTEsJSVtbTNcbiIgCS8qIG1tMyA9IGF8YnxjfGR8ZXxmfGd8aCAqLworCisJLyogb24gdmEgZmFpcmUgbGUgInNpZ24gZXh0ZW5zaW9uIiBlbiBmYWlzYW50IHVuIGNtcCBhdmVjIDAgcXVpIHJldG91cm5lIDEgc2kgPDAsIDAgc2kgPjAgKi8KKyIJcGNtcGd0YiAlJW1tMSwlJW1tMlxuIgkvKiBtbTIgPSAxMTExMTExMXwwMDAwMDAwMHwwMDAwMDAwMC4uLi4gKi8KKworIglwdW5wY2toYncgJSVtbTIsJSVtbTFcbiIJLyogbW0xID0gMHxhfDB8YnwwfGN8MHxkICovCisKKyIJcHVucGNrbGJ3ICUlbW0yLCUlbW0zXG4iCS8qIG1tMyA9IDB8ZXwwfGZ8MHxnfDB8aCAqLworIgltb3ZxICglMCksJSVtbTJcbiIJLyogbW0yID0gZGVzdGluYXRpb24gKi8KKworIglwbXVsbHcgJSVtbTAsJSVtbTFcbiIJLyogbW0xID0gdiphfHYqYnx2KmN8dipkICovCisiCWFkZCAkOCwlMVxuIgorCisiCXBtdWxsdyAlJW1tMCwlJW1tM1xuIgkvKiBtbTMgPSB2KmV8dipmfHYqZ3x2KmggKi8KKyIJcHNyYXcgJDcsJSVtbTFcbiIJCS8qIG1tMSA9IHYqYS8xMjh8dipiLzEyOHx2KmMvMTI4fHYqZC8xMjggICovCisKKyIJcHNyYXcgJDcsJSVtbTNcbiIJCS8qIG1tMyA9IHYqZS8xMjh8dipmLzEyOHx2KmcvMTI4fHYqaC8xMjggKi8KKworIglwYWNrc3N3YiAlJW1tMSwlJW1tM1xuIgkvKiBtbTEgPSB2KmEvMTI4fHYqYi8xMjh8dipjLzEyOHx2KmQvMTI4fHYqZS8xMjh8dipmLzEyOHx2KmcvMTI4fHYqaC8xMjggKi8KKworIglwYWRkc2IgJSVtbTIsJSVtbTNcbiIJLyogYWRkIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLworCisiCW1vdnEgJSVtbTMsKCUwKVxuIgkvKiBzdG9yZSBiYWNrIHRvIHJhbSAqLworIglhZGQgJDgsJTBcbiIKKworIglkZWMgJSVlZHhcbiIKKworIglqbnogLm1peGxvb3BTOFxuIgorCisiLmVuZFM4OlxuIgorIgllbW1zXG4iCisJIDoKKwkgOiAiciIgKGRzdCksICJyIihzcmMpLCJtIihzaXplKSwKKwkgIm0iKHZvbHVtZSkKKwkgOiAiZWF4IiwiZWR4IiwibWVtb3J5IgorCSApOworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX21peGVyX01NWC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2YjI1OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX21peGVyX01NWC5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgICAgaGVhZGVycyBmb3IgTU1YIGFzc2VtYmxlciB2ZXJzaW9uIG9mIFNETF9NaXhBdWRpbworICAgIENvcHlyaWdodCAyMDAyIFN0ZXBoYW5lIE1hcmNoZXNpbiAoc3RlcGhhbmUubWFyY2hlc2luQHdhbmFkb28uZnIpCisgICAgVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBMR1BMIChzZWUgQ09QWUlORyBmb3IgZGV0YWlscykKKworICAgIEFzc3VtZXMgYnVmZmVyIHNpemUgaW4gYnl0ZXMgaXMgYSBtdWx0aXBsZSBvZiAxNgorICAgIEFzc3VtZXMgU0RMX01JWF9NQVhWT0xVTUUgPSAxMjgKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChTRExfQlVHR1lfTU1YX01JWEVSUykgLyogYnVnZ3ksIHNvIHdlJ3JlIGRpc2FibGluZyB0aGVtLiAtLXJ5YW4uICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChTRExfQVNTRU1CTFlfUk9VVElORVMpCit2b2lkIFNETF9NaXhBdWRpb19NTVhfUzE2KGNoYXIqICxjaGFyKiAsdW5zaWduZWQgaW50ICxpbnQgKTsKK3ZvaWQgU0RMX01peEF1ZGlvX01NWF9TOChjaGFyKiAsY2hhciogLHVuc2lnbmVkIGludCAsaW50ICk7CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9taXhlcl9NTVhfVkMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX21peGVyX01NWF9WQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMGFhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9taXhlcl9NTVhfVkMuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbWl4ZXJfTU1YX1ZDLmgiCisKKyNpZiBkZWZpbmVkKFNETF9CVUdHWV9NTVhfTUlYRVJTKSAvKiBidWdneSwgc28gd2UncmUgZGlzYWJsaW5nIHRoZW0uIC0tcnlhbi4gKi8KKyNpZiAoKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikpIHx8IGRlZmluZWQoX19XQVRDT01DX18pKSAmJiBkZWZpbmVkKFNETF9BU1NFTUJMWV9ST1VUSU5FUykKKy8vIE1NWCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBTRExfTWl4QXVkaW8gZm9yIHNpZ25lZCBsaXR0bGUgZW5kaWFuIDE2IGJpdCBzYW1wbGVzIGFuZCBzaWduZWQgOCBiaXQgc2FtcGxlcworLy8gQ29weXJpZ2h0IDIwMDIgU3RlcGhhbmUgTWFyY2hlc2luIChzdGVwaGFuZS5tYXJjaGVzaW5Ad2FuYWRvby5mcikKKy8vIENvbnZlcnRlZCB0byBJbnRlbCBBU00gbm90YXRpb24gYnkgQ3RoCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIExHUEwgKHNlZSBDT1BZSU5HIGZvciBkZXRhaWxzKQorLy8gCisvLyBBc3N1bWVzIGJ1ZmZlciBzaXplIGluIGJ5dGVzIGlzIGEgbXVsdGlwbGUgb2YgMTYKKy8vIEFzc3VtZXMgU0RMX01JWF9NQVhWT0xVTUUgPSAxMjgKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1peGluZyBmb3IgMTYgYml0IHNpZ25lZCBidWZmZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBTRExfTWl4QXVkaW9fTU1YX1MxNl9WQyhjaGFyKiBkc3QsY2hhciogc3JjLHVuc2lnbmVkIGludCBuU2l6ZSxpbnQgdm9sdW1lKQoreworCV9fYXNtCisJeworCisJCXB1c2gJZWRpCisJCXB1c2gJZXNpCisJCXB1c2gJZWJ4CisJCQorCQltb3YJCWVkaSwgZHN0CQkvLyBlZGkgPSBkc3QKKwkJbW92CQllc2ksIHNyYwkJLy8gZXNpID0gc3JjCisJCW1vdgkJZWF4LCB2b2x1bWUJCS8vIGVheCA9IHZvbHVtZQorCQltb3YJCWVieCwgblNpemUJCS8vIGVieCA9IHNpemUKKwkJc2hyCQllYngsIDQJCQkvLyBwcm9jZXNzIDE2IGJ5dGVzIHBlciBpdGVyYXRpb24gPSA4IHNhbXBsZXMKKwkJanoJCWVuZFMxNgorCQkKKwkJcHhvcgltbTAsIG1tMAorCQltb3ZkCW1tMCwgZWF4CQkvLyUlZWF4LCUlbW0wCisJCW1vdnEJbW0xLCBtbTAJCS8vJSVtbTAsJSVtbTEKKwkJcHNsbHEJbW0wLCAxNgkJCS8vJDE2LCUlbW0wCisJCXBvcgkJbW0wLCBtbTEJCS8vJSVtbTEsJSVtbTAKKwkJcHNsbHEJbW0wLCAxNgkJCS8vJDE2LCUlbW0wCisJCXBvcgkJbW0wLCBtbTEJCS8vJSVtbTEsJSVtbTAKKwkJcHNsbHEJbW0wLCAxNgkJCS8vJDE2LCUlbW0wCisJCXBvcgkJbW0wLCBtbTEJCS8vJSVtbTEsJSVtbTAJCQkvLyBtbTAgPSB2b2x8dm9sfHZvbHx2b2wKKworCQkjaWZuZGVmIF9fV0FUQ09NQ19fCisJCWFsaWduCTE2CisJCSNlbmRpZgorbWl4bG9vcFMxNjoKKwkJbW92cQltbTEsIFtlc2ldCQkvLyglJWVzaSksJSVtbTFcbiIgLy8gbW0xID0gYXxifGN8ZAorCQltb3ZxCW1tMiwgbW0xCQkvLyUlbW0xLCUlbW0yXG4iIC8vIG1tMiA9IGF8YnxjfGQKKwkJbW92cQltbTQsIFtlc2kgKyA4XQkvLzgoJSVlc2kpLCUlbW00XG4iIC8vIG1tNCA9IGV8ZnxnfGgKKwkJLy8gcHJlIGNoYXJnZXIgbGUgYnVmZmVyIGRzdCBkYW5zIG1tNworCQltb3ZxCW1tNywgW2VkaV0JCS8vKCUlZWRpKSwlJW1tN1xuIiAvLyBtbTcgPSBkc3RbMF0iCisJCS8vIG11bHRpcGxpZXIgcGFyIGxlIHZvbHVtZQorCQlwbXVsbHcJbW0xLCBtbTAJCS8vJSVtbTAsJSVtbTFcbiIgLy8gbW0xID0gbChhKnYpfGwoYip2KXxsKGMqdil8bChkKnYpCisJCXBtdWxodwltbTIsIG1tMAkJLy8lJW1tMCwlJW1tMlxuIiAvLyBtbTIgPSBoKGEqdil8aChiKnYpfGgoYyp2KXxoKGQqdikKKwkJbW92cQltbTUsIG1tNAkJLy8lJW1tNCwlJW1tNVxuIiAvLyBtbTUgPSBlfGZ8Z3xoCisJCXBtdWxsdwltbTQsIG1tMAkJLy8lJW1tMCwlJW1tNFxuIiAvLyBtbTQgPSBsKGUqdil8bChmKnYpfGwoZyp2KXxsKGgqdikKKwkJcG11bGh3CW1tNSwgbW0wCQkvLyUlbW0wLCUlbW01XG4iIC8vIG1tNSA9IGgoZSp2KXxoKGYqdil8aChnKnYpfGgoaCp2KQorCQltb3ZxCW1tMywgbW0xCQkvLyUlbW0xLCUlbW0zXG4iIC8vIG1tMyA9IGwoYSp2KXxsKGIqdil8bChjKnYpfGwoZCp2KQorCQlwdW5wY2tod2QJbW0xLCBtbTIJLy8lJW1tMiwlJW1tMVxuIiAvLyBtbTEgPSBhKnZ8Yip2CisJCW1vdnEJCW1tNiwgbW00CS8vJSVtbTQsJSVtbTZcbiIgLy8gbW02ID0gbChlKnYpfGwoZip2KXxsKGcqdil8bChoKnYpCisJCXB1bnBja2x3ZAltbTMsIG1tMgkvLyUlbW0yLCUlbW0zXG4iIC8vIG1tMyA9IGMqdnxkKnYKKwkJcHVucGNraHdkCW1tNCwgbW01CS8vJSVtbTUsJSVtbTRcbiIgLy8gbW00ID0gZSpmfGYqdgorCQlwdW5wY2tsd2QJbW02LCBtbTUJLy8lJW1tNSwlJW1tNlxuIiAvLyBtbTYgPSBnKnZ8aCp2CisJCS8vIHByZSBjaGFyZ2VyIGxlIGJ1ZmZlciBkc3QgZGFucyBtbTUKKwkJbW92cQltbTUsIFtlZGkgKyA4XQkvLzgoJSVlZGkpLCUlbW01XG4iIC8vIG1tNSA9IGRzdFsxXQorCQkvLyBkaXZpc2VyIHBhciAxMjgKKwkJcHNyYWQJbW0xLCA3CQkJLy8kNywlJW1tMVxuIiAvLyBtbTEgPSBhKnYvMTI4fGIqdi8xMjggLCAxMjggPSBTRExfTUlYX01BWFZPTFVNRQorCQlhZGQJCWVzaSwgMTYJCQkvLyQxNiwlJWVzaVxuIgorCQlwc3JhZAltbTMsIDcJCQkvLyQ3LCUlbW0zXG4iIC8vIG1tMyA9IGMqdi8xMjh8ZCp2LzEyOAorCQlwc3JhZAltbTQsIDcJCQkvLyQ3LCUlbW00XG4iIC8vIG1tNCA9IGUqdi8xMjh8Zip2LzEyOAorCQkvLyBtbTEgPSBsZSBzYW1wbGUgYXZlYyBsZSB2b2x1bWUgbW9kaWZpZQorCQlwYWNrc3NkdwltbTMsIG1tMQkvLyUlbW0xLCUlbW0zXG4iIC8vIG1tMyA9IHMoYSp2fGIqdnxjKnZ8ZCp2KQorCQlwc3JhZAltbTYsIDcJCQkvLyQ3LCUlbW02XG4iIC8vIG1tNj0gZyp2LzEyOHxoKnYvMTI4CisJCXBhZGRzdwltbTMsIG1tNwkJLy8lJW1tNywlJW1tM1xuIiAvLyBtbTMgPSBhZGp1c3Rfdm9sdW1lKHNyYykrZHN0CisJCS8vIG1tNCA9IGxlIHNhbXBsZSBhdmVjIGxlIHZvbHVtZSBtb2RpZmllCisJCXBhY2tzc2R3CW1tNiwgbW00CS8vJSVtbTQsJSVtbTZcbiIgLy8gbW02ID0gcyhlKnZ8Zip2fGcqdnxoKnYpCisJCW1vdnEJW2VkaV0sIG1tMwkJLy8lJW1tMywoJSVlZGkpXG4iCisJCXBhZGRzdwltbTYsIG1tNQkJLy8lJW1tNSwlJW1tNlxuIiAvLyBtbTYgPSBhZGp1c3Rfdm9sdW1lKHNyYykrZHN0CisJCW1vdnEJW2VkaSArIDhdLCBtbTYJLy8lJW1tNiw4KCUlZWRpKVxuIgorCQlhZGQJCWVkaSwgMTYJCQkvLyQxNiwlJWVkaVxuIgorCQlkZWMJCWVieAkJCQkvLyUlZWJ4XG4iCisJCWpueiBtaXhsb29wUzE2CisKK2VuZFMxNjoKKwkJZW1tcworCQkKKwkJcG9wCQllYngKKwkJcG9wCQllc2kKKwkJcG9wCQllZGkKKwl9CisKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNaXhpbmcgZm9yIDggYml0IHNpZ25lZCBidWZmZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBTRExfTWl4QXVkaW9fTU1YX1M4X1ZDKGNoYXIqIGRzdCxjaGFyKiBzcmMsdW5zaWduZWQgaW50IG5TaXplLGludCB2b2x1bWUpCit7CisJX2FzbQorCXsKKworCQlwdXNoCWVkaQorCQlwdXNoCWVzaQorCQlwdXNoCWVieAorCQkKKwkJbW92CQllZGksIGRzdAkvL21vdmwJJTAsJSVlZGkJLy8gZWRpID0gZHN0CisJCW1vdgkJZXNpLCBzcmMJLy8lMSwlJWVzaQkvLyBlc2kgPSBzcmMKKwkJbW92CQllYXgsIHZvbHVtZQkvLyUzLCUlZWF4CS8vIGVheCA9IHZvbHVtZQorCisJCW1vdmQJbW0wLCBlYXgJLy8lJWVheCwlJW1tMAorCQltb3ZxCW1tMSwgbW0wCS8vJSVtbTAsJSVtbTEKKwkJcHNsbHEJbW0wLCAxNgkJLy8kMTYsJSVtbTAKKwkJcG9yCQltbTAsIG1tMQkvLyUlbW0xLCUlbW0wCisJCXBzbGxxCW1tMCwgMTYJCS8vJDE2LCUlbW0wCisJCXBvcgkJbW0wLCBtbTEJLy8lJW1tMSwlJW1tMAorCQlwc2xscQltbTAsIDE2CQkvLyQxNiwlJW1tMAorCQlwb3IJCW1tMCwgbW0xCS8vJSVtbTEsJSVtbTAKKwkJCisJCW1vdgkJZWJ4LCBuU2l6ZQkvLyUyLCUlZWJ4CS8vIGVieCA9IHNpemUKKwkJc2hyCQllYngsIDMJCS8vJDMsJSVlYngJLy8gcHJvY2VzcyA4IGJ5dGVzIHBlciBpdGVyYXRpb24gPSA4IHNhbXBsZXMKKwkJY21wCQllYngsIDAJCS8vJDAsJSVlYngKKwkJamUJCWVuZFM4CisKKwkJI2lmbmRlZiBfX1dBVENPTUNfXworCQlhbGlnbiAxNgorCQkjZW5kaWYKK21peGxvb3BTODoKKwkJcHhvcgltbTIsIG1tMgkvLyUlbW0yLCUlbW0yCQkvLyBtbTIgPSAwCisJCW1vdnEJbW0xLCBbZXNpXQkvLyglJWVzaSksJSVtbTEJLy8gbW0xID0gYXxifGN8ZHxlfGZ8Z3xoCisJCW1vdnEJbW0zLCBtbTEJLy8lJW1tMSwlJW1tMyAJLy8gbW0zID0gYXxifGN8ZHxlfGZ8Z3xoCisJCS8vIG9uIHZhIGZhaXJlIGxlICJzaWduIGV4dGVuc2lvbiIgZW4gZmFpc2FudCB1biBjbXAgYXZlYyAwIHF1aSByZXRvdXJuZSAxIHNpIDwwLCAwIHNpID4wCisJCXBjbXBndGIJCW1tMiwgbW0xCS8vJSVtbTEsJSVtbTIJLy8gbW0yID0gMTExMTExMTF8MDAwMDAwMDB8MDAwMDAwMDAuLi4uCisJCXB1bnBja2hidwltbTEsIG1tMgkvLyUlbW0yLCUlbW0xCS8vIG1tMSA9IDB8YXwwfGJ8MHxjfDB8ZAorCQlwdW5wY2tsYncJbW0zLCBtbTIJLy8lJW1tMiwlJW1tMwkvLyBtbTMgPSAwfGV8MHxmfDB8Z3wwfGgKKwkJbW92cQltbTIsIFtlZGldCS8vKCUlZWRpKSwlJW1tMgkvLyBtbTIgPSBkZXN0aW5hdGlvbgorCQlwbXVsbHcJbW0xLCBtbTAJLy8lJW1tMCwlJW1tMQkvLyBtbTEgPSB2KmF8dipifHYqY3x2KmQKKwkJYWRkCQllc2ksIDgJCS8vJDgsJSVlc2kKKwkJcG11bGx3CW1tMywgbW0wCS8vJSVtbTAsJSVtbTMJLy8gbW0zID0gdiplfHYqZnx2Kmd8dipoCisJCXBzcmF3CW1tMSwgNwkJLy8kNywlJW1tMQkJLy8gbW0xID0gdiphLzEyOHx2KmIvMTI4fHYqYy8xMjh8dipkLzEyOCAKKwkJcHNyYXcJbW0zLCA3CQkvLyQ3LCUlbW0zCQkvLyBtbTMgPSB2KmUvMTI4fHYqZi8xMjh8dipnLzEyOHx2KmgvMTI4CisJCXBhY2tzc3diIG1tMywgbW0xCS8vJSVtbTEsJSVtbTMJLy8gbW0xID0gdiphLzEyOHx2KmIvMTI4fHYqYy8xMjh8dipkLzEyOHx2KmUvMTI4fHYqZi8xMjh8dipnLzEyOHx2KmgvMTI4CisJCXBhZGRzYgltbTMsIG1tMgkvLyUlbW0yLCUlbW0zCS8vIGFkZCB0byBkZXN0aW5hdGlvbiBidWZmZXIKKwkJbW92cQlbZWRpXSwgbW0zCS8vJSVtbTMsKCUlZWRpKQkvLyBzdG9yZSBiYWNrIHRvIHJhbQorCQlhZGQJCWVkaSwgOAkJLy8kOCwlJWVkaQorCQlkZWMJCWVieAkJCS8vJSVlYngKKwkJam56CQltaXhsb29wUzgKKwkJCitlbmRTODoKKwkJZW1tcworCQkKKwkJcG9wCQllYngKKwkJcG9wCQllc2kKKwkJcG9wCQllZGkKKwl9Cit9CisKKyNlbmRpZiAvKiBTRExfQVNTRU1CTFlfUk9VVElORVMgKi8KKyNlbmRpZiAvKiBTRExfQlVHR1lfTU1YX01JWEVSUyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YX1ZDLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9taXhlcl9NTVhfVkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmQwZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfbWl4ZXJfTU1YX1ZDLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKworI2lmIGRlZmluZWQoU0RMX0JVR0dZX01NWF9NSVhFUlMpIC8qIGJ1Z2d5LCBzbyB3ZSdyZSBkaXNhYmxpbmcgdGhlbS4gLS1yeWFuLiAqLworI2lmICgoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KSkgfHwgZGVmaW5lZChfX1dBVENPTUNfXykpICYmIGRlZmluZWQoU0RMX0FTU0VNQkxZX1JPVVRJTkVTKQorLyogaGVhZGVycyBmb3IgTU1YIGFzc2VtYmxlciB2ZXJzaW9uIG9mIFNETF9NaXhBdWRpbworICAgQ29weXJpZ2h0IDIwMDIgU3RlcGhhbmUgTWFyY2hlc2luIChzdGVwaGFuZS5tYXJjaGVzaW5Ad2FuYWRvby5mcikKKyAgIENvbnZlcnRlZCB0byBJbnRlbCBBU00gbm90YXRpb24gYnkgQ3RoCisgICBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIExHUEwgKHNlZSBDT1BZSU5HIGZvciBkZXRhaWxzKQorICAgCisgICBBc3N1bWVzIGJ1ZmZlciBzaXplIGluIGJ5dGVzIGlzIGEgbXVsdGlwbGUgb2YgMTYKKyAgIEFzc3VtZXMgU0RMX01JWF9NQVhWT0xVTUUgPSAxMjgKKyovCit2b2lkIFNETF9NaXhBdWRpb19NTVhfUzE2X1ZDKGNoYXIqICxjaGFyKiAsdW5zaWduZWQgaW50ICxpbnQgKTsKK3ZvaWQgU0RMX01peEF1ZGlvX01NWF9TOF9WQyhjaGFyKiAsY2hhciogLHVuc2lnbmVkIGludCAsaW50ICk7CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfbWl4ZXJfbTY4ay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfbWl4ZXJfbTY4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYmIxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9taXhlcl9tNjhrLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCW02OGsgYXNzZW1ibHkgbWl4IHJvdXRpbmVzCisKKwlQYXRyaWNlIE1hbmRpbgorKi8KKworI2lmIChkZWZpbmVkKF9fbTY4a19fKSAmJiAhZGVmaW5lZChfX21jb2xkZmlyZV9fKSkgJiYgZGVmaW5lZChfX0dOVUNfXykKK3ZvaWQgU0RMX01peEF1ZGlvX202OGtfVTgoY2hhciogZHN0LCBjaGFyKiBzcmMsIGxvbmcgbGVuLCBsb25nIHZvbHVtZSwgY2hhciogbWl4OCkKK3sKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisKKwkidHN0bAklMlxuIgorIgliZXFzCXN0b3Bsb29wX3U4XG4iCisibWl4bG9vcF91ODpcbiIKKworCS8qIE1peCBhIHNhbXBsZSAqLworCisiCW1vdmVxCSMwLCUlZDBcbiIKKyIJbW92ZXEJIzAsJSVkMVxuIgorCisiCW1vdmViCSUxQCssJSVkMFxuIgkvKiBkMCA9ICpzcmMrKyAqLworIglzdWIJIzEyOCwlJWQwXG4iCS8qIGQwIC09IDEyOCAqLworIgltdWxzCSUzLCUlZDBcbiIJLyogZDAgKj0gdm9sdW1lICgwPD12b2x1bWU8PTEyOCkgKi8KKyIJbW92ZWIJJTBALCUlZDFcbiIJLyogZDEgPSAqZHN0ICovCisiCWFzcgkjNywlJWQwXG4iCS8qIGQwIC89IDEyOCAoU0RMX01JWF9NQVhWT0xVTUUpICovCisiCWFkZAkjMTI4LCUlZDBcbiIJLyogZDAgKz0gMTI4ICovCisKKyIJYWRkCSUlZDEsJSVkMFxuIgorCisiCW1vdmViCSU0QCglJWQwOncpLCUwQCtcbiIKKworCS8qIExvb3AgdGlsbCBkb25lICovCisKKyIJc3VicWwJIzEsJTJcbiIKKyIJYmhpcwltaXhsb29wX3U4XG4iCisic3RvcGxvb3BfdTg6XG4iCisKKwkgOiAvKiBubyByZXR1cm4gdmFsdWUgKi8KKwkgOiAvKiBpbnB1dCAqLworCSAJImEiKGRzdCksICJhIihzcmMpLCAiZCIobGVuKSwgImQiKHZvbHVtZSksICJhIihtaXg4KQkKKwkgOiAvKiBjbG9iYmVyZWQgcmVnaXN0ZXJzICovCisJIAkiZDAiLCAiZDEiLCAiY2MiLCAibWVtb3J5IiAKKwkgKTsKK30KKwordm9pZCBTRExfTWl4QXVkaW9fbTY4a19TOChjaGFyKiBkc3QsIGNoYXIqIHNyYywgbG9uZyBsZW4sIGxvbmcgdm9sdW1lKQoreworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKworCSJ0c3RsCSUyXG4iCisiCWJlcXMJc3RvcGxvb3BfczhcbiIKKyIJbW92ZXEJIy0xMjgsJSVkMlxuIgorIgltb3ZlcQkjMTI3LCUlZDNcbiIKKyJtaXhsb29wX3M4OlxuIgorCisJLyogTWl4IGEgc2FtcGxlICovCisKKyIJbW92ZXEJIzAsJSVkMFxuIgorIgltb3ZlcQkjMCwlJWQxXG4iCisKKyIJbW92ZWIJJTFAKywlJWQwXG4iCS8qIGQwID0gKnNyYysrICovCisiCW11bHMJJTMsJSVkMFxuIgkvKiBkMCAqPSB2b2x1bWUgKDA8PXZvbHVtZTw9MTI4KSAqLworIgltb3ZlYgklMEAsJSVkMVxuIgkvKiBkMSA9ICpkc3QgKi8KKyIJYXNyCSM3LCUlZDBcbiIJLyogZDAgLz0gMTI4IChTRExfTUlYX01BWFZPTFVNRSkgKi8KKworIglhZGQJJSVkMSwlJWQwXG4iCisKKyIJY21wCSUlZDIsJSVkMFxuIgorIgliZ2VzCWxvd2VyX2xpbWl0X3M4XG4iCisiCW1vdmUJJSVkMiwlJWQwXG4iCisibG93ZXJfbGltaXRfczg6XG4iCisKKyIJY21wCSUlZDMsJSVkMFxuIgorIglibGVzCXVwcGVyX2xpbWl0X3M4XG4iCisiCW1vdmUJJSVkMywlJWQwXG4iCisidXBwZXJfbGltaXRfczg6XG4iCisiCW1vdmViCSUlZDAsJTBAK1xuIgorCisJLyogTG9vcCB0aWxsIGRvbmUgKi8KKworIglzdWJxbAkjMSwlMlxuIgorIgliaGlzCW1peGxvb3BfczhcbiIKKyJzdG9wbG9vcF9zODpcbiIKKworCSA6IC8qIG5vIHJldHVybiB2YWx1ZSAqLworCSA6IC8qIGlucHV0ICovCisJIAkiYSIoZHN0KSwgImEiKHNyYyksICJkIihsZW4pLCAiZCIodm9sdW1lKQkKKwkgOiAvKiBjbG9iYmVyZWQgcmVnaXN0ZXJzICovCisJIAkiZDAiLCAiZDEiLCAiZDIiLCAiZDMiLCAiY2MiLCAibWVtb3J5IiAKKwkgKTsKK30KKwordm9pZCBTRExfTWl4QXVkaW9fbTY4a19TMTZNU0Ioc2hvcnQqIGRzdCwgc2hvcnQqIHNyYywgbG9uZyBsZW4sIGxvbmcgdm9sdW1lKQoreworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKworCSJ0c3RsCSUyXG4iCisiCWJlcXMJc3RvcGxvb3BfczE2bXNiXG4iCisiCW1vdmVsCSMtMzI3NjgsJSVkMlxuIgorIgltb3ZlbAkjMzI3NjcsJSVkM1xuIgorIglsc3JsCSMxLCUyXG4iCisibWl4bG9vcF9zMTZtc2I6XG4iCisKKwkvKiBNaXggYSBzYW1wbGUgKi8KKworIgltb3ZlCSUxQCssJSVkMFxuIgkvKiBkMCA9ICpzcmMrKyAqLworIgltdWxzCSUzLCUlZDBcbiIJLyogZDAgKj0gdm9sdW1lICgwPD12b2x1bWU8PTEyOCkgKi8KKyIJbW92ZQklMEAsJSVkMVxuIgkvKiBkMSA9ICpkc3QgKi8KKyIJZXh0bAklJWQxXG4iCQkvKiBleHRlbmQgZDEgdG8gMzIgYml0cyAqLworIglhc3JsCSM3LCUlZDBcbiIJLyogZDAgLz0gMTI4IChTRExfTUlYX01BWFZPTFVNRSkgKi8KKworIglhZGRsCSUlZDEsJSVkMFxuIgorCisiCWNtcGwJJSVkMiwlJWQwXG4iCisiCWJnZXMJbG93ZXJfbGltaXRfczE2bXNiXG4iCisiCW1vdmUJJSVkMiwlJWQwXG4iCisibG93ZXJfbGltaXRfczE2bXNiOlxuIgorCisiCWNtcGwJJSVkMywlJWQwXG4iCisiCWJsZXMJdXBwZXJfbGltaXRfczE2bXNiXG4iCisiCW1vdmUJJSVkMywlJWQwXG4iCisidXBwZXJfbGltaXRfczE2bXNiOlxuIgorIgltb3ZlCSUlZDAsJTBAK1xuIgorCisJLyogTG9vcCB0aWxsIGRvbmUgKi8KKworIglzdWJxbAkjMSwlMlxuIgorIgliaGlzCW1peGxvb3BfczE2bXNiXG4iCisic3RvcGxvb3BfczE2bXNiOlxuIgorCisJIDogLyogbm8gcmV0dXJuIHZhbHVlICovCisJIDogLyogaW5wdXQgKi8KKwkgCSJhIihkc3QpLCAiYSIoc3JjKSwgImQiKGxlbiksICJkIih2b2x1bWUpCQorCSA6IC8qIGNsb2JiZXJlZCByZWdpc3RlcnMgKi8KKwkgCSJkMCIsICJkMSIsICJkMiIsICJkMyIsICJjYyIsICJtZW1vcnkiIAorCSApOworfQorCit2b2lkIFNETF9NaXhBdWRpb19tNjhrX1MxNkxTQihzaG9ydCogZHN0LCBzaG9ydCogc3JjLCBsb25nIGxlbiwgbG9uZyB2b2x1bWUpCit7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCisJInRzdGwJJTJcbiIKKyIJYmVxcwlzdG9wbG9vcF9zMTZsc2JcbiIKKyIJbW92ZWwJIy0zMjc2OCwlJWQyXG4iCisiCW1vdmVsCSMzMjc2NywlJWQzXG4iCisiCWxzcmwJIzEsJTJcbiIKKyJtaXhsb29wX3MxNmxzYjpcbiIKKworCS8qIE1peCBhIHNhbXBsZSAqLworCisiCW1vdmUJJTFAKywlJWQwXG4iCS8qIGQwID0gKnNyYysrICovCisiCXJvcncJIzgsJSVkMFxuIgorIgltdWxzCSUzLCUlZDBcbiIJLyogZDAgKj0gdm9sdW1lICgwPD12b2x1bWU8PTEyOCkgKi8KKyIJbW92ZQklMEAsJSVkMVxuIgkvKiBkMSA9ICpkc3QgKi8KKyIJcm9ydwkjOCwlJWQxXG4iCisiCWV4dGwJJSVkMVxuIgkJLyogZXh0ZW5kIGQxIHRvIDMyIGJpdHMgKi8KKyIJYXNybAkjNywlJWQwXG4iCS8qIGQwIC89IDEyOCAoU0RMX01JWF9NQVhWT0xVTUUpICovCisKKyIJYWRkbAklJWQxLCUlZDBcbiIKKworIgljbXBsCSUlZDIsJSVkMFxuIgorIgliZ2VzCWxvd2VyX2xpbWl0X3MxNmxzYlxuIgorIgltb3ZlCSUlZDIsJSVkMFxuIgorImxvd2VyX2xpbWl0X3MxNmxzYjpcbiIKKworIgljbXBsCSUlZDMsJSVkMFxuIgorIglibGVzCXVwcGVyX2xpbWl0X3MxNmxzYlxuIgorIgltb3ZlCSUlZDMsJSVkMFxuIgorInVwcGVyX2xpbWl0X3MxNmxzYjpcbiIKKyIJcm9ydwkjOCwlJWQwXG4iCisiCW1vdmUJJSVkMCwlMEArXG4iCisKKwkvKiBMb29wIHRpbGwgZG9uZSAqLworCisiCXN1YnFsCSMxLCUyXG4iCisiCWJoaXMJbWl4bG9vcF9zMTZsc2JcbiIKKyJzdG9wbG9vcF9zMTZsc2I6XG4iCisKKwkgOiAvKiBubyByZXR1cm4gdmFsdWUgKi8KKwkgOiAvKiBpbnB1dCAqLworCSAJImEiKGRzdCksICJhIihzcmMpLCAiZCIobGVuKSwgImQiKHZvbHVtZSkJCisJIDogLyogY2xvYmJlcmVkIHJlZ2lzdGVycyAqLworCSAJImQwIiwgImQxIiwgImQyIiwgImQzIiwgImNjIiwgIm1lbW9yeSIgCisJICk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX21peGVyX202OGsuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX21peGVyX202OGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzNkZjAwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfbWl4ZXJfbTY4ay5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCW02OGsgYXNzZW1ibHkgbWl4IHJvdXRpbmVzCisKKwlQYXRyaWNlIE1hbmRpbgorKi8KKworI2lmIChkZWZpbmVkKF9fbTY4a19fKSAmJiAhZGVmaW5lZChfX21jb2xkZmlyZV9fKSkgJiYgZGVmaW5lZChfX0dOVUNfXykKK3ZvaWQgU0RMX01peEF1ZGlvX202OGtfVTgoY2hhciogZHN0LGNoYXIqIHNyYywgbG9uZyBsZW4sIGxvbmcgdm9sdW1lLCBjaGFyKiBtaXg4KTsKK3ZvaWQgU0RMX01peEF1ZGlvX202OGtfUzgoY2hhciogZHN0LGNoYXIqIHNyYywgbG9uZyBsZW4sIGxvbmcgdm9sdW1lKTsKKwordm9pZCBTRExfTWl4QXVkaW9fbTY4a19TMTZNU0Ioc2hvcnQqIGRzdCxzaG9ydCogc3JjLCBsb25nIGxlbiwgbG9uZyB2b2x1bWUpOwordm9pZCBTRExfTWl4QXVkaW9fbTY4a19TMTZMU0Ioc2hvcnQqIGRzdCxzaG9ydCogc3JjLCBsb25nIGxlbiwgbG9uZyB2b2x1bWUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF9zeXNhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfc3lzYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGFjMjFkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfc3lzYXVkaW8uaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBTRExfZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfc3lzYXVkaW9faAorI2RlZmluZSBfU0RMX3N5c2F1ZGlvX2gKKworI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKworLyogVGhlIFNETCBhdWRpbyBkcml2ZXIgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9BdWRpb0RldmljZSBTRExfQXVkaW9EZXZpY2U7CisKKy8qIERlZmluZSB0aGUgU0RMIGF1ZGlvIGRyaXZlciBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICpfdGhpcworI2lmbmRlZiBfU1RBVFVTCisjZGVmaW5lIF9TVEFUVVMJU0RMX3N0YXR1cyAqc3RhdHVzCisjZW5kaWYKK3N0cnVjdCBTRExfQXVkaW9EZXZpY2UgeworCS8qICogKiAqLworCS8qIFRoZSBuYW1lIG9mIHRoaXMgYXVkaW8gZHJpdmVyICovCisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qICogKiAqLworCS8qIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGF1ZGlvIGRyaXZlciAqLworCWNvbnN0IGNoYXIgKmRlc2M7CisKKwkvKiAqICogKi8KKwkvKiBQdWJsaWMgZHJpdmVyIGZ1bmN0aW9ucyAqLworCWludCAgKCpPcGVuQXVkaW8pKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKKwl2b2lkICgqVGhyZWFkSW5pdCkoX1RISVMpOwkvKiBDYWxsZWQgYnkgYXVkaW8gdGhyZWFkIGF0IHN0YXJ0ICovCisJdm9pZCAoKldhaXRBdWRpbykoX1RISVMpOworCXZvaWQgKCpQbGF5QXVkaW8pKF9USElTKTsKKwlVaW50OCAqKCpHZXRBdWRpb0J1ZikoX1RISVMpOworCXZvaWQgKCpXYWl0RG9uZSkoX1RISVMpOworCXZvaWQgKCpDbG9zZUF1ZGlvKShfVEhJUyk7CisKKwkvKiAqICogKi8KKwkvKiBMb2NrIC8gVW5sb2NrIGZ1bmN0aW9ucyBhZGRlZCBmb3IgdGhlIE1hYyBwb3J0ICovCisJdm9pZCAoKkxvY2tBdWRpbykoX1RISVMpOworCXZvaWQgKCpVbmxvY2tBdWRpbykoX1RISVMpOworCisJdm9pZCAoKlNldENhcHRpb24pKF9USElTLCBjb25zdCBjaGFyICpjYXB0aW9uKTsKKworCS8qICogKiAqLworCS8qIERhdGEgY29tbW9uIHRvIGFsbCBkZXZpY2VzICovCisKKwkvKiBUaGUgY3VycmVudCBhdWRpbyBzcGVjaWZpY2F0aW9uIChzaGFyZWQgd2l0aCBhdWRpbyB0aHJlYWQpICovCisJU0RMX0F1ZGlvU3BlYyBzcGVjOworCisJLyogQW4gYXVkaW8gY29udmVyc2lvbiBibG9jayBmb3IgYXVkaW8gZm9ybWF0IGVtdWxhdGlvbiAqLworCVNETF9BdWRpb0NWVCBjb252ZXJ0OworCisJLyogQ3VycmVudCBzdGF0ZSBmbGFncyAqLworCWludCBlbmFibGVkOworCWludCBwYXVzZWQ7CisJaW50IG9wZW5lZDsKKworCS8qIEZha2UgYXVkaW8gYnVmZmVyIGZvciB3aGVuIHRoZSBhdWRpbyBoYXJkd2FyZSBpcyBidXN5ICovCisJVWludDggKmZha2Vfc3RyZWFtOworCisJLyogQSBzZW1hcGhvcmUgZm9yIGxvY2tpbmcgdGhlIG1peGluZyBidWZmZXJzICovCisJU0RMX211dGV4ICptaXhlcl9sb2NrOworCisJLyogQSB0aHJlYWQgdG8gZmVlZCB0aGUgYXVkaW8gZGV2aWNlICovCisJU0RMX1RocmVhZCAqdGhyZWFkOworCVVpbnQzMiB0aHJlYWRpZDsKKworCS8qICogKiAqLworCS8qIERhdGEgcHJpdmF0ZSB0byB0aGlzIGRyaXZlciAqLworCXN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqaGlkZGVuOworCisJLyogKiAqICovCisJLyogVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZSAqLworCXZvaWQgKCpmcmVlKShfVEhJUyk7Cit9OworI3VuZGVmIF9USElTCisKK3R5cGVkZWYgc3RydWN0IEF1ZGlvQm9vdFN0cmFwIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmRlc2M7CisJaW50ICgqYXZhaWxhYmxlKSh2b2lkKTsKKwlTRExfQXVkaW9EZXZpY2UgKigqY3JlYXRlKShpbnQgZGV2aW5kZXgpOworfSBBdWRpb0Jvb3RTdHJhcDsKKworI2lmIFNETF9BVURJT19EUklWRVJfQlNECitleHRlcm4gQXVkaW9Cb290U3RyYXAgQlNEX0FVRElPX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfUFVMU0UKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBQVUxTRV9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX0FMU0EKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBBTFNBX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfT1NTCitleHRlcm4gQXVkaW9Cb290U3RyYXAgRFNQX2Jvb3RzdHJhcDsKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBETUFfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9RTlhOVE8KK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBRTlhOVE9BVURJT19ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX1NVTkFVRElPCitleHRlcm4gQXVkaW9Cb290U3RyYXAgU1VOQVVESU9fYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9ETUVESUEKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBETUVESUFfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9BUlRTCitleHRlcm4gQXVkaW9Cb290U3RyYXAgQVJUU19ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX0VTRAorZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIEVTRF9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX05BUworZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIE5BU19ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX0RTT1VORAorZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIERTT1VORF9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX1dBVkVPVVQKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBXQVZFT1VUX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfUEFVRAorZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIFBhdWRfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9CQVVESU8KK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBCQVVESU9fYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9DT1JFQVVESU8KK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBDT1JFQVVESU9fYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9TTkRNR1IKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBTTkRNR1JfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9NSU5UCitleHRlcm4gQXVkaW9Cb290U3RyYXAgTUlOVEFVRElPX0dTWEJfYm9vdHN0cmFwOworZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIE1JTlRBVURJT19NQ1NOX2Jvb3RzdHJhcDsKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBNSU5UQVVESU9fU1RGQV9ib290c3RyYXA7CitleHRlcm4gQXVkaW9Cb290U3RyYXAgTUlOVEFVRElPX1hCSU9TX2Jvb3RzdHJhcDsKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBNSU5UQVVESU9fRE1BOF9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX0RJU0sKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBESVNLQVVEX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfRFVNTVkKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBEVU1NWUFVRF9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfQVVESU9fRFJJVkVSX0RDCitleHRlcm4gQXVkaW9Cb290U3RyYXAgRENBVURfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9ORFMKK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBORFNBVURfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9NTUVBVURJTworZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIE1NRUFVRElPX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9BVURJT19EUklWRVJfREFSVAorZXh0ZXJuIEF1ZGlvQm9vdFN0cmFwIERBUlRfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX0FVRElPX0RSSVZFUl9FUE9DQVVESU8KK2V4dGVybiBBdWRpb0Jvb3RTdHJhcCBFUE9DQXVkaW9fYm9vdHN0cmFwOyAKKyNlbmRpZgorCisvKiBUaGlzIGlzIHRoZSBjdXJyZW50IGF1ZGlvIGRldmljZSAqLworZXh0ZXJuIFNETF9BdWRpb0RldmljZSAqY3VycmVudF9hdWRpbzsKKworI2VuZGlmIC8qIF9TRExfc3lzYXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfd2F2ZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfd2F2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWQ2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL1NETF93YXZlLmMKQEAgLTAsMCArMSw1OTYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBNaWNyb3NvZnQgV0FWRSBmaWxlIGxvYWRpbmcgcm91dGluZXMgKi8KKworI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIlNETF93YXZlLmgiCisKKworc3RhdGljIGludCBSZWFkQ2h1bmsoU0RMX1JXb3BzICpzcmMsIENodW5rICpjaHVuayk7CisKK3N0cnVjdCBNU19BRFBDTV9kZWNvZGVzdGF0ZSB7CisJVWludDggaFByZWRpY3RvcjsKKwlVaW50MTYgaURlbHRhOworCVNpbnQxNiBpU2FtcDE7CisJU2ludDE2IGlTYW1wMjsKK307CitzdGF0aWMgc3RydWN0IE1TX0FEUENNX2RlY29kZXIgeworCVdhdmVGTVQgd2F2ZWZtdDsKKwlVaW50MTYgd1NhbXBsZXNQZXJCbG9jazsKKwlVaW50MTYgd051bUNvZWY7CisJU2ludDE2IGFDb2VmZls3XVsyXTsKKwkvKiAqICogKi8KKwlzdHJ1Y3QgTVNfQURQQ01fZGVjb2Rlc3RhdGUgc3RhdGVbMl07Cit9IE1TX0FEUENNX3N0YXRlOworCitzdGF0aWMgaW50IEluaXRNU19BRFBDTShXYXZlRk1UICpmb3JtYXQpCit7CisJVWludDggKnJvZ3VlX2ZlZWw7CisJaW50IGk7CisKKwkvKiBTZXQgdGhlIHJvZ3VlIHBvaW50ZXIgdG8gdGhlIE1TX0FEUENNIHNwZWNpZmljIGRhdGEgKi8KKwlNU19BRFBDTV9zdGF0ZS53YXZlZm10LmVuY29kaW5nID0gU0RMX1N3YXBMRTE2KGZvcm1hdC0+ZW5jb2RpbmcpOworCU1TX0FEUENNX3N0YXRlLndhdmVmbXQuY2hhbm5lbHMgPSBTRExfU3dhcExFMTYoZm9ybWF0LT5jaGFubmVscyk7CisJTVNfQURQQ01fc3RhdGUud2F2ZWZtdC5mcmVxdWVuY3kgPSBTRExfU3dhcExFMzIoZm9ybWF0LT5mcmVxdWVuY3kpOworCU1TX0FEUENNX3N0YXRlLndhdmVmbXQuYnl0ZXJhdGUgPSBTRExfU3dhcExFMzIoZm9ybWF0LT5ieXRlcmF0ZSk7CisJTVNfQURQQ01fc3RhdGUud2F2ZWZtdC5ibG9ja2FsaWduID0gU0RMX1N3YXBMRTE2KGZvcm1hdC0+YmxvY2thbGlnbik7CisJTVNfQURQQ01fc3RhdGUud2F2ZWZtdC5iaXRzcGVyc2FtcGxlID0KKwkJCQkJIFNETF9Td2FwTEUxNihmb3JtYXQtPmJpdHNwZXJzYW1wbGUpOworCXJvZ3VlX2ZlZWwgPSAoVWludDggKilmb3JtYXQrc2l6ZW9mKCpmb3JtYXQpOworCWlmICggc2l6ZW9mKCpmb3JtYXQpID09IDE2ICkgeworCQlyb2d1ZV9mZWVsICs9IHNpemVvZihVaW50MTYpOworCX0KKwlNU19BRFBDTV9zdGF0ZS53U2FtcGxlc1BlckJsb2NrID0gKChyb2d1ZV9mZWVsWzFdPDw4KXxyb2d1ZV9mZWVsWzBdKTsKKwlyb2d1ZV9mZWVsICs9IHNpemVvZihVaW50MTYpOworCU1TX0FEUENNX3N0YXRlLndOdW1Db2VmID0gKChyb2d1ZV9mZWVsWzFdPDw4KXxyb2d1ZV9mZWVsWzBdKTsKKwlyb2d1ZV9mZWVsICs9IHNpemVvZihVaW50MTYpOworCWlmICggTVNfQURQQ01fc3RhdGUud051bUNvZWYgIT0gNyApIHsKKwkJU0RMX1NldEVycm9yKCJVbmtub3duIHNldCBvZiBNU19BRFBDTSBjb2VmZmljaWVudHMiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJZm9yICggaT0wOyBpPE1TX0FEUENNX3N0YXRlLndOdW1Db2VmOyArK2kgKSB7CisJCU1TX0FEUENNX3N0YXRlLmFDb2VmZltpXVswXSA9ICgocm9ndWVfZmVlbFsxXTw8OCl8cm9ndWVfZmVlbFswXSk7CisJCXJvZ3VlX2ZlZWwgKz0gc2l6ZW9mKFVpbnQxNik7CisJCU1TX0FEUENNX3N0YXRlLmFDb2VmZltpXVsxXSA9ICgocm9ndWVfZmVlbFsxXTw8OCl8cm9ndWVfZmVlbFswXSk7CisJCXJvZ3VlX2ZlZWwgKz0gc2l6ZW9mKFVpbnQxNik7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIFNpbnQzMiBNU19BRFBDTV9uaWJibGUoc3RydWN0IE1TX0FEUENNX2RlY29kZXN0YXRlICpzdGF0ZSwKKwkJCQkJVWludDggbnliYmxlLCBTaW50MTYgKmNvZWZmKQoreworCWNvbnN0IFNpbnQzMiBtYXhfYXVkaW92YWwgPSAoKDE8PCgxNi0xKSktMSk7CisJY29uc3QgU2ludDMyIG1pbl9hdWRpb3ZhbCA9IC0oMTw8KDE2LTEpKTsKKwljb25zdCBTaW50MzIgYWRhcHRpdmVbXSA9IHsKKwkJMjMwLCAyMzAsIDIzMCwgMjMwLCAzMDcsIDQwOSwgNTEyLCA2MTQsCisJCTc2OCwgNjE0LCA1MTIsIDQwOSwgMzA3LCAyMzAsIDIzMCwgMjMwCisJfTsKKwlTaW50MzIgbmV3X3NhbXBsZSwgZGVsdGE7CisKKwluZXdfc2FtcGxlID0gKChzdGF0ZS0+aVNhbXAxICogY29lZmZbMF0pICsKKwkJICAgICAgKHN0YXRlLT5pU2FtcDIgKiBjb2VmZlsxXSkpLzI1NjsKKwlpZiAoIG55YmJsZSAmIDB4MDggKSB7CisJCW5ld19zYW1wbGUgKz0gc3RhdGUtPmlEZWx0YSAqIChueWJibGUtMHgxMCk7CisJfSBlbHNlIHsKKwkJbmV3X3NhbXBsZSArPSBzdGF0ZS0+aURlbHRhICogbnliYmxlOworCX0KKwlpZiAoIG5ld19zYW1wbGUgPCBtaW5fYXVkaW92YWwgKSB7CisJCW5ld19zYW1wbGUgPSBtaW5fYXVkaW92YWw7CisJfSBlbHNlCisJaWYgKCBuZXdfc2FtcGxlID4gbWF4X2F1ZGlvdmFsICkgeworCQluZXdfc2FtcGxlID0gbWF4X2F1ZGlvdmFsOworCX0KKwlkZWx0YSA9ICgoU2ludDMyKXN0YXRlLT5pRGVsdGEgKiBhZGFwdGl2ZVtueWJibGVdKS8yNTY7CisJaWYgKCBkZWx0YSA8IDE2ICkgeworCQlkZWx0YSA9IDE2OworCX0KKwlzdGF0ZS0+aURlbHRhID0gKFVpbnQxNilkZWx0YTsKKwlzdGF0ZS0+aVNhbXAyID0gc3RhdGUtPmlTYW1wMTsKKwlzdGF0ZS0+aVNhbXAxID0gKFNpbnQxNiluZXdfc2FtcGxlOworCXJldHVybihuZXdfc2FtcGxlKTsKK30KKworc3RhdGljIGludCBNU19BRFBDTV9kZWNvZGUoVWludDggKiphdWRpb19idWYsIFVpbnQzMiAqYXVkaW9fbGVuKQoreworCXN0cnVjdCBNU19BRFBDTV9kZWNvZGVzdGF0ZSAqc3RhdGVbMl07CisJVWludDggKmZyZWVhYmxlLCAqZW5jb2RlZCwgKmRlY29kZWQ7CisJU2ludDMyIGVuY29kZWRfbGVuLCBzYW1wbGVzbGVmdDsKKwlTaW50OCBueWJibGUsIHN0ZXJlbzsKKwlTaW50MTYgKmNvZWZmWzJdOworCVNpbnQzMiBuZXdfc2FtcGxlOworCisJLyogQWxsb2NhdGUgdGhlIHByb3BlciBzaXplZCBvdXRwdXQgYnVmZmVyICovCisJZW5jb2RlZF9sZW4gPSAqYXVkaW9fbGVuOworCWVuY29kZWQgPSAqYXVkaW9fYnVmOworCWZyZWVhYmxlID0gKmF1ZGlvX2J1ZjsKKwkqYXVkaW9fbGVuID0gKGVuY29kZWRfbGVuL01TX0FEUENNX3N0YXRlLndhdmVmbXQuYmxvY2thbGlnbikgKiAKKwkJCQlNU19BRFBDTV9zdGF0ZS53U2FtcGxlc1BlckJsb2NrKgorCQkJCU1TX0FEUENNX3N0YXRlLndhdmVmbXQuY2hhbm5lbHMqc2l6ZW9mKFNpbnQxNik7CisJKmF1ZGlvX2J1ZiA9IChVaW50OCAqKVNETF9tYWxsb2MoKmF1ZGlvX2xlbik7CisJaWYgKCAqYXVkaW9fYnVmID09IE5VTEwgKSB7CisJCVNETF9FcnJvcihTRExfRU5PTUVNKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJZGVjb2RlZCA9ICphdWRpb19idWY7CisKKwkvKiBHZXQgcmVhZHkuLi4gR28hICovCisJc3RlcmVvID0gKE1TX0FEUENNX3N0YXRlLndhdmVmbXQuY2hhbm5lbHMgPT0gMik7CisJc3RhdGVbMF0gPSAmTVNfQURQQ01fc3RhdGUuc3RhdGVbMF07CisJc3RhdGVbMV0gPSAmTVNfQURQQ01fc3RhdGUuc3RhdGVbc3RlcmVvXTsKKwl3aGlsZSAoIGVuY29kZWRfbGVuID49IE1TX0FEUENNX3N0YXRlLndhdmVmbXQuYmxvY2thbGlnbiApIHsKKwkJLyogR3JhYiB0aGUgaW5pdGlhbCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBibG9jayAqLworCQlzdGF0ZVswXS0+aFByZWRpY3RvciA9ICplbmNvZGVkKys7CisJCWlmICggc3RlcmVvICkgeworCQkJc3RhdGVbMV0tPmhQcmVkaWN0b3IgPSAqZW5jb2RlZCsrOworCQl9CisJCXN0YXRlWzBdLT5pRGVsdGEgPSAoKGVuY29kZWRbMV08PDgpfGVuY29kZWRbMF0pOworCQllbmNvZGVkICs9IHNpemVvZihTaW50MTYpOworCQlpZiAoIHN0ZXJlbyApIHsKKwkJCXN0YXRlWzFdLT5pRGVsdGEgPSAoKGVuY29kZWRbMV08PDgpfGVuY29kZWRbMF0pOworCQkJZW5jb2RlZCArPSBzaXplb2YoU2ludDE2KTsKKwkJfQorCQlzdGF0ZVswXS0+aVNhbXAxID0gKChlbmNvZGVkWzFdPDw4KXxlbmNvZGVkWzBdKTsKKwkJZW5jb2RlZCArPSBzaXplb2YoU2ludDE2KTsKKwkJaWYgKCBzdGVyZW8gKSB7CisJCQlzdGF0ZVsxXS0+aVNhbXAxID0gKChlbmNvZGVkWzFdPDw4KXxlbmNvZGVkWzBdKTsKKwkJCWVuY29kZWQgKz0gc2l6ZW9mKFNpbnQxNik7CisJCX0KKwkJc3RhdGVbMF0tPmlTYW1wMiA9ICgoZW5jb2RlZFsxXTw8OCl8ZW5jb2RlZFswXSk7CisJCWVuY29kZWQgKz0gc2l6ZW9mKFNpbnQxNik7CisJCWlmICggc3RlcmVvICkgeworCQkJc3RhdGVbMV0tPmlTYW1wMiA9ICgoZW5jb2RlZFsxXTw8OCl8ZW5jb2RlZFswXSk7CisJCQllbmNvZGVkICs9IHNpemVvZihTaW50MTYpOworCQl9CisJCWNvZWZmWzBdID0gTVNfQURQQ01fc3RhdGUuYUNvZWZmW3N0YXRlWzBdLT5oUHJlZGljdG9yXTsKKwkJY29lZmZbMV0gPSBNU19BRFBDTV9zdGF0ZS5hQ29lZmZbc3RhdGVbMV0tPmhQcmVkaWN0b3JdOworCisJCS8qIFN0b3JlIHRoZSB0d28gaW5pdGlhbCBzYW1wbGVzIHdlIHN0YXJ0IHdpdGggKi8KKwkJZGVjb2RlZFswXSA9IHN0YXRlWzBdLT5pU2FtcDImMHhGRjsKKwkJZGVjb2RlZFsxXSA9IHN0YXRlWzBdLT5pU2FtcDI+Pjg7CisJCWRlY29kZWQgKz0gMjsKKwkJaWYgKCBzdGVyZW8gKSB7CisJCQlkZWNvZGVkWzBdID0gc3RhdGVbMV0tPmlTYW1wMiYweEZGOworCQkJZGVjb2RlZFsxXSA9IHN0YXRlWzFdLT5pU2FtcDI+Pjg7CisJCQlkZWNvZGVkICs9IDI7CisJCX0KKwkJZGVjb2RlZFswXSA9IHN0YXRlWzBdLT5pU2FtcDEmMHhGRjsKKwkJZGVjb2RlZFsxXSA9IHN0YXRlWzBdLT5pU2FtcDE+Pjg7CisJCWRlY29kZWQgKz0gMjsKKwkJaWYgKCBzdGVyZW8gKSB7CisJCQlkZWNvZGVkWzBdID0gc3RhdGVbMV0tPmlTYW1wMSYweEZGOworCQkJZGVjb2RlZFsxXSA9IHN0YXRlWzFdLT5pU2FtcDE+Pjg7CisJCQlkZWNvZGVkICs9IDI7CisJCX0KKworCQkvKiBEZWNvZGUgYW5kIHN0b3JlIHRoZSBvdGhlciBzYW1wbGVzIGluIHRoaXMgYmxvY2sgKi8KKwkJc2FtcGxlc2xlZnQgPSAoTVNfQURQQ01fc3RhdGUud1NhbXBsZXNQZXJCbG9jay0yKSoKKwkJCQkJTVNfQURQQ01fc3RhdGUud2F2ZWZtdC5jaGFubmVsczsKKwkJd2hpbGUgKCBzYW1wbGVzbGVmdCA+IDAgKSB7CisJCQlueWJibGUgPSAoKmVuY29kZWQpPj40OworCQkJbmV3X3NhbXBsZSA9IE1TX0FEUENNX25pYmJsZShzdGF0ZVswXSxueWJibGUsY29lZmZbMF0pOworCQkJZGVjb2RlZFswXSA9IG5ld19zYW1wbGUmMHhGRjsKKwkJCW5ld19zYW1wbGUgPj49IDg7CisJCQlkZWNvZGVkWzFdID0gbmV3X3NhbXBsZSYweEZGOworCQkJZGVjb2RlZCArPSAyOworCisJCQlueWJibGUgPSAoKmVuY29kZWQpJjB4MEY7CisJCQluZXdfc2FtcGxlID0gTVNfQURQQ01fbmliYmxlKHN0YXRlWzFdLG55YmJsZSxjb2VmZlsxXSk7CisJCQlkZWNvZGVkWzBdID0gbmV3X3NhbXBsZSYweEZGOworCQkJbmV3X3NhbXBsZSA+Pj0gODsKKwkJCWRlY29kZWRbMV0gPSBuZXdfc2FtcGxlJjB4RkY7CisJCQlkZWNvZGVkICs9IDI7CisKKwkJCSsrZW5jb2RlZDsKKwkJCXNhbXBsZXNsZWZ0IC09IDI7CisJCX0KKwkJZW5jb2RlZF9sZW4gLT0gTVNfQURQQ01fc3RhdGUud2F2ZWZtdC5ibG9ja2FsaWduOworCX0KKwlTRExfZnJlZShmcmVlYWJsZSk7CisJcmV0dXJuKDApOworfQorCitzdHJ1Y3QgSU1BX0FEUENNX2RlY29kZXN0YXRlIHsKKwlTaW50MzIgc2FtcGxlOworCVNpbnQ4IGluZGV4OworfTsKK3N0YXRpYyBzdHJ1Y3QgSU1BX0FEUENNX2RlY29kZXIgeworCVdhdmVGTVQgd2F2ZWZtdDsKKwlVaW50MTYgd1NhbXBsZXNQZXJCbG9jazsKKwkvKiAqICogKi8KKwlzdHJ1Y3QgSU1BX0FEUENNX2RlY29kZXN0YXRlIHN0YXRlWzJdOworfSBJTUFfQURQQ01fc3RhdGU7CisKK3N0YXRpYyBpbnQgSW5pdElNQV9BRFBDTShXYXZlRk1UICpmb3JtYXQpCit7CisJVWludDggKnJvZ3VlX2ZlZWw7CisKKwkvKiBTZXQgdGhlIHJvZ3VlIHBvaW50ZXIgdG8gdGhlIElNQV9BRFBDTSBzcGVjaWZpYyBkYXRhICovCisJSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuZW5jb2RpbmcgPSBTRExfU3dhcExFMTYoZm9ybWF0LT5lbmNvZGluZyk7CisJSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuY2hhbm5lbHMgPSBTRExfU3dhcExFMTYoZm9ybWF0LT5jaGFubmVscyk7CisJSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuZnJlcXVlbmN5ID0gU0RMX1N3YXBMRTMyKGZvcm1hdC0+ZnJlcXVlbmN5KTsKKwlJTUFfQURQQ01fc3RhdGUud2F2ZWZtdC5ieXRlcmF0ZSA9IFNETF9Td2FwTEUzMihmb3JtYXQtPmJ5dGVyYXRlKTsKKwlJTUFfQURQQ01fc3RhdGUud2F2ZWZtdC5ibG9ja2FsaWduID0gU0RMX1N3YXBMRTE2KGZvcm1hdC0+YmxvY2thbGlnbik7CisJSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuYml0c3BlcnNhbXBsZSA9CisJCQkJCSBTRExfU3dhcExFMTYoZm9ybWF0LT5iaXRzcGVyc2FtcGxlKTsKKwlyb2d1ZV9mZWVsID0gKFVpbnQ4ICopZm9ybWF0K3NpemVvZigqZm9ybWF0KTsKKwlpZiAoIHNpemVvZigqZm9ybWF0KSA9PSAxNiApIHsKKwkJcm9ndWVfZmVlbCArPSBzaXplb2YoVWludDE2KTsKKwl9CisJSU1BX0FEUENNX3N0YXRlLndTYW1wbGVzUGVyQmxvY2sgPSAoKHJvZ3VlX2ZlZWxbMV08PDgpfHJvZ3VlX2ZlZWxbMF0pOworCXJldHVybigwKTsKK30KKworc3RhdGljIFNpbnQzMiBJTUFfQURQQ01fbmliYmxlKHN0cnVjdCBJTUFfQURQQ01fZGVjb2Rlc3RhdGUgKnN0YXRlLFVpbnQ4IG55YmJsZSkKK3sKKwljb25zdCBTaW50MzIgbWF4X2F1ZGlvdmFsID0gKCgxPDwoMTYtMSkpLTEpOworCWNvbnN0IFNpbnQzMiBtaW5fYXVkaW92YWwgPSAtKDE8PCgxNi0xKSk7CisJY29uc3QgaW50IGluZGV4X3RhYmxlWzE2XSA9IHsKKwkJLTEsIC0xLCAtMSwgLTEsCisJCSAyLCAgNCwgIDYsICA4LAorCQktMSwgLTEsIC0xLCAtMSwKKwkJIDIsICA0LCAgNiwgIDgKKwl9OworCWNvbnN0IFNpbnQzMiBzdGVwX3RhYmxlWzg5XSA9IHsKKwkJNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsCisJCTM0LCAzNywgNDEsIDQ1LCA1MCwgNTUsIDYwLCA2NiwgNzMsIDgwLCA4OCwgOTcsIDEwNywgMTE4LCAxMzAsCisJCTE0MywgMTU3LCAxNzMsIDE5MCwgMjA5LCAyMzAsIDI1MywgMjc5LCAzMDcsIDMzNywgMzcxLCA0MDgsCisJCTQ0OSwgNDk0LCA1NDQsIDU5OCwgNjU4LCA3MjQsIDc5NiwgODc2LCA5NjMsIDEwNjAsIDExNjYsIDEyODIsCisJCTE0MTEsIDE1NTIsIDE3MDcsIDE4NzgsIDIwNjYsIDIyNzIsIDI0OTksIDI3NDksIDMwMjQsIDMzMjcsCisJCTM2NjAsIDQwMjYsIDQ0MjgsIDQ4NzEsIDUzNTgsIDU4OTQsIDY0ODQsIDcxMzIsIDc4NDUsIDg2MzAsCisJCTk0OTMsIDEwNDQyLCAxMTQ4NywgMTI2MzUsIDEzODk5LCAxNTI4OSwgMTY4MTgsIDE4NTAwLCAyMDM1MCwKKwkJMjIzODUsIDI0NjIzLCAyNzA4NiwgMjk3OTQsIDMyNzY3CisJfTsKKwlTaW50MzIgZGVsdGEsIHN0ZXA7CisKKwkvKiBDb21wdXRlIGRpZmZlcmVuY2UgYW5kIG5ldyBzYW1wbGUgdmFsdWUgKi8KKwlzdGVwID0gc3RlcF90YWJsZVtzdGF0ZS0+aW5kZXhdOworCWRlbHRhID0gc3RlcCA+PiAzOworCWlmICggbnliYmxlICYgMHgwNCApIGRlbHRhICs9IHN0ZXA7CisJaWYgKCBueWJibGUgJiAweDAyICkgZGVsdGEgKz0gKHN0ZXAgPj4gMSk7CisJaWYgKCBueWJibGUgJiAweDAxICkgZGVsdGEgKz0gKHN0ZXAgPj4gMik7CisJaWYgKCBueWJibGUgJiAweDA4ICkgZGVsdGEgPSAtZGVsdGE7CisJc3RhdGUtPnNhbXBsZSArPSBkZWx0YTsKKworCS8qIFVwZGF0ZSBpbmRleCB2YWx1ZSAqLworCXN0YXRlLT5pbmRleCArPSBpbmRleF90YWJsZVtueWJibGVdOworCWlmICggc3RhdGUtPmluZGV4ID4gODggKSB7CisJCXN0YXRlLT5pbmRleCA9IDg4OworCX0gZWxzZQorCWlmICggc3RhdGUtPmluZGV4IDwgMCApIHsKKwkJc3RhdGUtPmluZGV4ID0gMDsKKwl9CisKKwkvKiBDbGFtcCBvdXRwdXQgc2FtcGxlICovCisJaWYgKCBzdGF0ZS0+c2FtcGxlID4gbWF4X2F1ZGlvdmFsICkgeworCQlzdGF0ZS0+c2FtcGxlID0gbWF4X2F1ZGlvdmFsOworCX0gZWxzZQorCWlmICggc3RhdGUtPnNhbXBsZSA8IG1pbl9hdWRpb3ZhbCApIHsKKwkJc3RhdGUtPnNhbXBsZSA9IG1pbl9hdWRpb3ZhbDsKKwl9CisJcmV0dXJuKHN0YXRlLT5zYW1wbGUpOworfQorCisvKiBGaWxsIHRoZSBkZWNvZGUgYnVmZmVyIHdpdGggYSBjaGFubmVsIGJsb2NrIG9mIGRhdGEgKDggc2FtcGxlcykgKi8KK3N0YXRpYyB2b2lkIEZpbGxfSU1BX0FEUENNX2Jsb2NrKFVpbnQ4ICpkZWNvZGVkLCBVaW50OCAqZW5jb2RlZCwKKwlpbnQgY2hhbm5lbCwgaW50IG51bWNoYW5uZWxzLCBzdHJ1Y3QgSU1BX0FEUENNX2RlY29kZXN0YXRlICpzdGF0ZSkKK3sKKwlpbnQgaTsKKwlTaW50OCBueWJibGU7CisJU2ludDMyIG5ld19zYW1wbGU7CisKKwlkZWNvZGVkICs9IChjaGFubmVsICogMik7CisJZm9yICggaT0wOyBpPDQ7ICsraSApIHsKKwkJbnliYmxlID0gKCplbmNvZGVkKSYweDBGOworCQluZXdfc2FtcGxlID0gSU1BX0FEUENNX25pYmJsZShzdGF0ZSwgbnliYmxlKTsKKwkJZGVjb2RlZFswXSA9IG5ld19zYW1wbGUmMHhGRjsKKwkJbmV3X3NhbXBsZSA+Pj0gODsKKwkJZGVjb2RlZFsxXSA9IG5ld19zYW1wbGUmMHhGRjsKKwkJZGVjb2RlZCArPSAyICogbnVtY2hhbm5lbHM7CisKKwkJbnliYmxlID0gKCplbmNvZGVkKT4+NDsKKwkJbmV3X3NhbXBsZSA9IElNQV9BRFBDTV9uaWJibGUoc3RhdGUsIG55YmJsZSk7CisJCWRlY29kZWRbMF0gPSBuZXdfc2FtcGxlJjB4RkY7CisJCW5ld19zYW1wbGUgPj49IDg7CisJCWRlY29kZWRbMV0gPSBuZXdfc2FtcGxlJjB4RkY7CisJCWRlY29kZWQgKz0gMiAqIG51bWNoYW5uZWxzOworCisJCSsrZW5jb2RlZDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgSU1BX0FEUENNX2RlY29kZShVaW50OCAqKmF1ZGlvX2J1ZiwgVWludDMyICphdWRpb19sZW4pCit7CisJc3RydWN0IElNQV9BRFBDTV9kZWNvZGVzdGF0ZSAqc3RhdGU7CisJVWludDggKmZyZWVhYmxlLCAqZW5jb2RlZCwgKmRlY29kZWQ7CisJU2ludDMyIGVuY29kZWRfbGVuLCBzYW1wbGVzbGVmdDsKKwl1bnNpZ25lZCBpbnQgYywgY2hhbm5lbHM7CisKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggdmFyaWFibGVzIGluIHRoZSBzdGF0ZSBhcnJheSAqLworCWNoYW5uZWxzID0gSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuY2hhbm5lbHM7CisJaWYgKCBjaGFubmVscyA+IFNETF9hcnJheXNpemUoSU1BX0FEUENNX3N0YXRlLnN0YXRlKSApIHsKKwkJU0RMX1NldEVycm9yKCJJTUEgQURQQ00gZGVjb2RlciBjYW4gb25seSBoYW5kbGUgJWQgY2hhbm5lbHMiLAorCQkJCQlTRExfYXJyYXlzaXplKElNQV9BRFBDTV9zdGF0ZS5zdGF0ZSkpOworCQlyZXR1cm4oLTEpOworCX0KKwlzdGF0ZSA9IElNQV9BRFBDTV9zdGF0ZS5zdGF0ZTsKKworCS8qIEFsbG9jYXRlIHRoZSBwcm9wZXIgc2l6ZWQgb3V0cHV0IGJ1ZmZlciAqLworCWVuY29kZWRfbGVuID0gKmF1ZGlvX2xlbjsKKwllbmNvZGVkID0gKmF1ZGlvX2J1ZjsKKwlmcmVlYWJsZSA9ICphdWRpb19idWY7CisJKmF1ZGlvX2xlbiA9IChlbmNvZGVkX2xlbi9JTUFfQURQQ01fc3RhdGUud2F2ZWZtdC5ibG9ja2FsaWduKSAqIAorCQkJCUlNQV9BRFBDTV9zdGF0ZS53U2FtcGxlc1BlckJsb2NrKgorCQkJCUlNQV9BRFBDTV9zdGF0ZS53YXZlZm10LmNoYW5uZWxzKnNpemVvZihTaW50MTYpOworCSphdWRpb19idWYgPSAoVWludDggKilTRExfbWFsbG9jKCphdWRpb19sZW4pOworCWlmICggKmF1ZGlvX2J1ZiA9PSBOVUxMICkgeworCQlTRExfRXJyb3IoU0RMX0VOT01FTSk7CisJCXJldHVybigtMSk7CisJfQorCWRlY29kZWQgPSAqYXVkaW9fYnVmOworCisJLyogR2V0IHJlYWR5Li4uIEdvISAqLworCXdoaWxlICggZW5jb2RlZF9sZW4gPj0gSU1BX0FEUENNX3N0YXRlLndhdmVmbXQuYmxvY2thbGlnbiApIHsKKwkJLyogR3JhYiB0aGUgaW5pdGlhbCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBibG9jayAqLworCQlmb3IgKCBjPTA7IGM8Y2hhbm5lbHM7ICsrYyApIHsKKwkJCS8qIEZpbGwgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGlzIGJsb2NrICovCisJCQlzdGF0ZVtjXS5zYW1wbGUgPSAoKGVuY29kZWRbMV08PDgpfGVuY29kZWRbMF0pOworCQkJZW5jb2RlZCArPSAyOworCQkJaWYgKCBzdGF0ZVtjXS5zYW1wbGUgJiAweDgwMDAgKSB7CisJCQkJc3RhdGVbY10uc2FtcGxlIC09IDB4MTAwMDA7CisJCQl9CisJCQlzdGF0ZVtjXS5pbmRleCA9ICplbmNvZGVkKys7CisJCQkvKiBSZXNlcnZlZCBieXRlIGluIGJ1ZmZlciBoZWFkZXIsIHNob3VsZCBiZSAwICovCisJCQlpZiAoICplbmNvZGVkKysgIT0gMCApIHsKKwkJCQkvKiBVaCBvaCwgY29ycnVwdCBkYXRhPyAgQnVnZ3kgY29kZT8gKi87CisJCQl9CisKKwkJCS8qIFN0b3JlIHRoZSBpbml0aWFsIHNhbXBsZSB3ZSBzdGFydCB3aXRoICovCisJCQlkZWNvZGVkWzBdID0gKFVpbnQ4KShzdGF0ZVtjXS5zYW1wbGUmMHhGRik7CisJCQlkZWNvZGVkWzFdID0gKFVpbnQ4KShzdGF0ZVtjXS5zYW1wbGU+PjgpOworCQkJZGVjb2RlZCArPSAyOworCQl9CisKKwkJLyogRGVjb2RlIGFuZCBzdG9yZSB0aGUgb3RoZXIgc2FtcGxlcyBpbiB0aGlzIGJsb2NrICovCisJCXNhbXBsZXNsZWZ0ID0gKElNQV9BRFBDTV9zdGF0ZS53U2FtcGxlc1BlckJsb2NrLTEpKmNoYW5uZWxzOworCQl3aGlsZSAoIHNhbXBsZXNsZWZ0ID4gMCApIHsKKwkJCWZvciAoIGM9MDsgYzxjaGFubmVsczsgKytjICkgeworCQkJCUZpbGxfSU1BX0FEUENNX2Jsb2NrKGRlY29kZWQsIGVuY29kZWQsCisJCQkJCQljLCBjaGFubmVscywgJnN0YXRlW2NdKTsKKwkJCQllbmNvZGVkICs9IDQ7CisJCQkJc2FtcGxlc2xlZnQgLT0gODsKKwkJCX0KKwkJCWRlY29kZWQgKz0gKGNoYW5uZWxzICogOCAqIDIpOworCQl9CisJCWVuY29kZWRfbGVuIC09IElNQV9BRFBDTV9zdGF0ZS53YXZlZm10LmJsb2NrYWxpZ247CisJfQorCVNETF9mcmVlKGZyZWVhYmxlKTsKKwlyZXR1cm4oMCk7Cit9CisKK1NETF9BdWRpb1NwZWMgKiBTRExfTG9hZFdBVl9SVyAoU0RMX1JXb3BzICpzcmMsIGludCBmcmVlc3JjLAorCQlTRExfQXVkaW9TcGVjICpzcGVjLCBVaW50OCAqKmF1ZGlvX2J1ZiwgVWludDMyICphdWRpb19sZW4pCit7CisJaW50IHdhc19lcnJvcjsKKwlDaHVuayBjaHVuazsKKwlpbnQgbGVucmVhZDsKKwlpbnQgTVNfQURQQ01fZW5jb2RlZCwgSU1BX0FEUENNX2VuY29kZWQ7CisJaW50IHNhbXBsZXNpemU7CisKKwkvKiBXQVYgbWFnaWMgaGVhZGVyICovCisJVWludDMyIFJJRkZjaHVuazsKKwlVaW50MzIgd2F2ZWxlbiA9IDA7CisJVWludDMyIFdBVkVtYWdpYzsKKwlVaW50MzIgaGVhZGVyRGlmZiA9IDA7CisKKwkvKiBGTVQgY2h1bmsgKi8KKwlXYXZlRk1UICpmb3JtYXQgPSBOVUxMOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBwYXNzZWQgYSB2YWxpZCBkYXRhIHNvdXJjZSAqLworCXdhc19lcnJvciA9IDA7CisJaWYgKCBzcmMgPT0gTlVMTCApIHsKKwkJd2FzX2Vycm9yID0gMTsKKwkJZ290byBkb25lOworCX0KKwkJCisJLyogQ2hlY2sgdGhlIG1hZ2ljIGhlYWRlciAqLworCVJJRkZjaHVuawk9IFNETF9SZWFkTEUzMihzcmMpOworCXdhdmVsZW4JCT0gU0RMX1JlYWRMRTMyKHNyYyk7CisJaWYgKCB3YXZlbGVuID09IFdBVkUgKSB7IC8qIFRoZSBSSUZGY2h1bmsgaGFzIGFscmVhZHkgYmVlbiByZWFkICovCisJCVdBVkVtYWdpYyA9IHdhdmVsZW47CisJCXdhdmVsZW4gICA9IFJJRkZjaHVuazsKKwkJUklGRmNodW5rID0gUklGRjsKKwl9IGVsc2UgeworCQlXQVZFbWFnaWMgPSBTRExfUmVhZExFMzIoc3JjKTsKKwl9CisJaWYgKCAoUklGRmNodW5rICE9IFJJRkYpIHx8IChXQVZFbWFnaWMgIT0gV0FWRSkgKSB7CisJCVNETF9TZXRFcnJvcigiVW5yZWNvZ25pemVkIGZpbGUgdHlwZSAobm90IFdBVkUpIik7CisJCXdhc19lcnJvciA9IDE7CisJCWdvdG8gZG9uZTsKKwl9CisJaGVhZGVyRGlmZiArPSBzaXplb2YoVWludDMyKTsgLyogZm9yIFdBVkUgKi8KKworCS8qIFJlYWQgdGhlIGF1ZGlvIGRhdGEgZm9ybWF0IGNodW5rICovCisJY2h1bmsuZGF0YSA9IE5VTEw7CisJZG8geworCQlpZiAoIGNodW5rLmRhdGEgIT0gTlVMTCApIHsKKwkJCVNETF9mcmVlKGNodW5rLmRhdGEpOworCQkJY2h1bmsuZGF0YSA9IE5VTEw7CisJCX0KKwkJbGVucmVhZCA9IFJlYWRDaHVuayhzcmMsICZjaHVuayk7CisJCWlmICggbGVucmVhZCA8IDAgKSB7CisJCQl3YXNfZXJyb3IgPSAxOworCQkJZ290byBkb25lOworCQl9CisJCS8qIDIgVWludDMyJ3MgZm9yIGNodW5rIGhlYWRlcitsZW4sIHBsdXMgdGhlIGxlbnJlYWQgKi8KKwkJaGVhZGVyRGlmZiArPSBsZW5yZWFkICsgMiAqIHNpemVvZihVaW50MzIpOworCX0gd2hpbGUgKCAoY2h1bmsubWFnaWMgPT0gRkFDVCkgfHwgKGNodW5rLm1hZ2ljID09IExJU1QpICk7CisKKwkvKiBEZWNvZGUgdGhlIGF1ZGlvIGRhdGEgZm9ybWF0ICovCisJZm9ybWF0ID0gKFdhdmVGTVQgKiljaHVuay5kYXRhOworCWlmICggY2h1bmsubWFnaWMgIT0gRk1UICkgeworCQlTRExfU2V0RXJyb3IoIkNvbXBsZXggV0FWRSBmaWxlcyBub3Qgc3VwcG9ydGVkIik7CisJCXdhc19lcnJvciA9IDE7CisJCWdvdG8gZG9uZTsKKwl9CisJTVNfQURQQ01fZW5jb2RlZCA9IElNQV9BRFBDTV9lbmNvZGVkID0gMDsKKwlzd2l0Y2ggKFNETF9Td2FwTEUxNihmb3JtYXQtPmVuY29kaW5nKSkgeworCQljYXNlIFBDTV9DT0RFOgorCQkJLyogV2UgY2FuIHVuZGVyc3RhbmQgdGhpcyAqLworCQkJYnJlYWs7CisJCWNhc2UgTVNfQURQQ01fQ09ERToKKwkJCS8qIFRyeSB0byB1bmRlcnN0YW5kIHRoaXMgKi8KKwkJCWlmICggSW5pdE1TX0FEUENNKGZvcm1hdCkgPCAwICkgeworCQkJCXdhc19lcnJvciA9IDE7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJTVNfQURQQ01fZW5jb2RlZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBJTUFfQURQQ01fQ09ERToKKwkJCS8qIFRyeSB0byB1bmRlcnN0YW5kIHRoaXMgKi8KKwkJCWlmICggSW5pdElNQV9BRFBDTShmb3JtYXQpIDwgMCApIHsKKwkJCQl3YXNfZXJyb3IgPSAxOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCUlNQV9BRFBDTV9lbmNvZGVkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE1QM19DT0RFOgorCQkJU0RMX1NldEVycm9yKCJNUEVHIExheWVyIDMgZGF0YSBub3Qgc3VwcG9ydGVkIiwKKwkJCQkJU0RMX1N3YXBMRTE2KGZvcm1hdC0+ZW5jb2RpbmcpKTsKKwkJCXdhc19lcnJvciA9IDE7CisJCQlnb3RvIGRvbmU7CisJCWRlZmF1bHQ6CisJCQlTRExfU2V0RXJyb3IoIlVua25vd24gV0FWRSBkYXRhIGZvcm1hdDogMHglLjR4IiwKKwkJCQkJU0RMX1N3YXBMRTE2KGZvcm1hdC0+ZW5jb2RpbmcpKTsKKwkJCXdhc19lcnJvciA9IDE7CisJCQlnb3RvIGRvbmU7CisJfQorCVNETF9tZW1zZXQoc3BlYywgMCwgKHNpemVvZiAqc3BlYykpOworCXNwZWMtPmZyZXEgPSBTRExfU3dhcExFMzIoZm9ybWF0LT5mcmVxdWVuY3kpOworCXN3aXRjaCAoU0RMX1N3YXBMRTE2KGZvcm1hdC0+Yml0c3BlcnNhbXBsZSkpIHsKKwkJY2FzZSA0OgorCQkJaWYgKCBNU19BRFBDTV9lbmNvZGVkIHx8IElNQV9BRFBDTV9lbmNvZGVkICkgeworCQkJCXNwZWMtPmZvcm1hdCA9IEFVRElPX1MxNjsKKwkJCX0gZWxzZSB7CisJCQkJd2FzX2Vycm9yID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlzcGVjLT5mb3JtYXQgPSBBVURJT19VODsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJc3BlYy0+Zm9ybWF0ID0gQVVESU9fUzE2OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl3YXNfZXJyb3IgPSAxOworCQkJYnJlYWs7CisJfQorCWlmICggd2FzX2Vycm9yICkgeworCQlTRExfU2V0RXJyb3IoIlVua25vd24gJWQtYml0IFBDTSBkYXRhIGZvcm1hdCIsCisJCQlTRExfU3dhcExFMTYoZm9ybWF0LT5iaXRzcGVyc2FtcGxlKSk7CisJCWdvdG8gZG9uZTsKKwl9CisJc3BlYy0+Y2hhbm5lbHMgPSAoVWludDgpU0RMX1N3YXBMRTE2KGZvcm1hdC0+Y2hhbm5lbHMpOworCXNwZWMtPnNhbXBsZXMgPSA0MDk2OwkJLyogR29vZCBkZWZhdWx0IGJ1ZmZlciBzaXplICovCisKKwkvKiBSZWFkIHRoZSBhdWRpbyBkYXRhIGNodW5rICovCisJKmF1ZGlvX2J1ZiA9IE5VTEw7CisJZG8geworCQlpZiAoICphdWRpb19idWYgIT0gTlVMTCApIHsKKwkJCVNETF9mcmVlKCphdWRpb19idWYpOworCQkJKmF1ZGlvX2J1ZiA9IE5VTEw7CisJCX0KKwkJbGVucmVhZCA9IFJlYWRDaHVuayhzcmMsICZjaHVuayk7CisJCWlmICggbGVucmVhZCA8IDAgKSB7CisJCQl3YXNfZXJyb3IgPSAxOworCQkJZ290byBkb25lOworCQl9CisJCSphdWRpb19sZW4gPSBsZW5yZWFkOworCQkqYXVkaW9fYnVmID0gY2h1bmsuZGF0YTsKKwkJaWYoY2h1bmsubWFnaWMgIT0gREFUQSkgaGVhZGVyRGlmZiArPSBsZW5yZWFkICsgMiAqIHNpemVvZihVaW50MzIpOworCX0gd2hpbGUgKCBjaHVuay5tYWdpYyAhPSBEQVRBICk7CisJaGVhZGVyRGlmZiArPSAyICogc2l6ZW9mKFVpbnQzMik7IC8qIGZvciB0aGUgZGF0YSBjaHVuayBhbmQgbGVuICovCisKKwlpZiAoIE1TX0FEUENNX2VuY29kZWQgKSB7CisJCWlmICggTVNfQURQQ01fZGVjb2RlKGF1ZGlvX2J1ZiwgYXVkaW9fbGVuKSA8IDAgKSB7CisJCQl3YXNfZXJyb3IgPSAxOworCQkJZ290byBkb25lOworCQl9CisJfQorCWlmICggSU1BX0FEUENNX2VuY29kZWQgKSB7CisJCWlmICggSU1BX0FEUENNX2RlY29kZShhdWRpb19idWYsIGF1ZGlvX2xlbikgPCAwICkgeworCQkJd2FzX2Vycm9yID0gMTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCS8qIERvbid0IHJldHVybiBhIGJ1ZmZlciB0aGF0IGlzbid0IGEgbXVsdGlwbGUgb2Ygc2FtcGxlc2l6ZSAqLworCXNhbXBsZXNpemUgPSAoKHNwZWMtPmZvcm1hdCAmIDB4RkYpLzgpKnNwZWMtPmNoYW5uZWxzOworCSphdWRpb19sZW4gJj0gfihzYW1wbGVzaXplLTEpOworCitkb25lOgorCWlmICggZm9ybWF0ICE9IE5VTEwgKSB7CisJCVNETF9mcmVlKGZvcm1hdCk7CisJfQorCWlmICggc3JjICkgeworCQlpZiAoIGZyZWVzcmMgKSB7CisJCQlTRExfUldjbG9zZShzcmMpOworCQl9IGVsc2UgeworCQkJLyogc2VlayB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIChnaXZlbiBieSB0aGUgUklGRiBjaHVuaykgKi8KKwkJCVNETF9SV3NlZWsoc3JjLCB3YXZlbGVuIC0gY2h1bmsubGVuZ3RoIC0gaGVhZGVyRGlmZiwgUldfU0VFS19DVVIpOworCQl9CisJfQorCWlmICggd2FzX2Vycm9yICkgeworCQlzcGVjID0gTlVMTDsKKwl9CisJcmV0dXJuKHNwZWMpOworfQorCisvKiBTaW5jZSB0aGUgV0FWIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBpdCBtdXN0IGFsc28KKyAgIGJlIGZyZWVkIGhlcmUuICAoTmVjZXNzYXJ5IHVuZGVyIFdpbjMyLCBWQysrKQorICovCit2b2lkIFNETF9GcmVlV0FWKFVpbnQ4ICphdWRpb19idWYpCit7CisJaWYgKCBhdWRpb19idWYgIT0gTlVMTCApIHsKKwkJU0RMX2ZyZWUoYXVkaW9fYnVmKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgUmVhZENodW5rKFNETF9SV29wcyAqc3JjLCBDaHVuayAqY2h1bmspCit7CisJY2h1bmstPm1hZ2ljCT0gU0RMX1JlYWRMRTMyKHNyYyk7CisJY2h1bmstPmxlbmd0aAk9IFNETF9SZWFkTEUzMihzcmMpOworCWNodW5rLT5kYXRhID0gKFVpbnQ4ICopU0RMX21hbGxvYyhjaHVuay0+bGVuZ3RoKTsKKwlpZiAoIGNodW5rLT5kYXRhID09IE5VTEwgKSB7CisJCVNETF9FcnJvcihTRExfRU5PTUVNKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJaWYgKCBTRExfUldyZWFkKHNyYywgY2h1bmstPmRhdGEsIGNodW5rLT5sZW5ndGgsIDEpICE9IDEgKSB7CisJCVNETF9FcnJvcihTRExfRUZSRUFEKTsKKwkJU0RMX2ZyZWUoY2h1bmstPmRhdGEpOworCQljaHVuay0+ZGF0YSA9IE5VTEw7CisJCXJldHVybigtMSk7CisJfQorCXJldHVybihjaHVuay0+bGVuZ3RoKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX3dhdmUuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vU0RMX3dhdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IxMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9TRExfd2F2ZS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgU0RMX2ZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogV0FWRSBmaWxlcyBhcmUgbGl0dGxlLWVuZGlhbiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlZmluZSB2YWx1ZXMgZm9yIE1pY3Jvc29mdCBXQVZFIGZvcm1hdCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJJRkYJCTB4NDY0NjQ5NTIJCS8qICJSSUZGIiAqLworI2RlZmluZSBXQVZFCQkweDQ1NTY0MTU3CQkvKiAiV0FWRSIgKi8KKyNkZWZpbmUgRkFDVAkJMHg3NDYzNjE2NgkJLyogImZhY3QiICovCisjZGVmaW5lIExJU1QJCTB4NTQ1MzQ5NGMJCS8qICJMSVNUIiAqLworI2RlZmluZSBGTVQJCTB4MjA3NDZENjYJCS8qICJmbXQgIiAqLworI2RlZmluZSBEQVRBCQkweDYxNzQ2MTY0CQkvKiAiZGF0YSIgKi8KKyNkZWZpbmUgUENNX0NPREUJMHgwMDAxCisjZGVmaW5lIE1TX0FEUENNX0NPREUJMHgwMDAyCisjZGVmaW5lIElNQV9BRFBDTV9DT0RFCTB4MDAxMQorI2RlZmluZSBNUDNfQ09ERQkweDAwNTUKKyNkZWZpbmUgV0FWRV9NT05PCTEKKyNkZWZpbmUgV0FWRV9TVEVSRU8JMgorCisvKiBOb3JtYWxseSwgdGhlc2UgdGhyZWUgY2h1bmtzIGNvbWUgY29uc2VjdXRpdmVseSBpbiBhIFdBVkUgZmlsZSAqLwordHlwZWRlZiBzdHJ1Y3QgV2F2ZUZNVCB7CisvKiBOb3Qgc2F2ZWQgaW4gdGhlIGNodW5rIHdlIHJlYWQ6CisJVWludDMyCUZNVGNodW5rOworCVVpbnQzMglmbXRsZW47CisqLworCVVpbnQxNgllbmNvZGluZzsJCisJVWludDE2CWNoYW5uZWxzOwkJLyogMSA9IG1vbm8sIDIgPSBzdGVyZW8gKi8KKwlVaW50MzIJZnJlcXVlbmN5OwkJLyogT25lIG9mIDExMDI1LCAyMjA1MCwgb3IgNDQxMDAgSHogKi8KKwlVaW50MzIJYnl0ZXJhdGU7CQkvKiBBdmVyYWdlIGJ5dGVzIHBlciBzZWNvbmQgKi8KKwlVaW50MTYJYmxvY2thbGlnbjsJCS8qIEJ5dGVzIHBlciBzYW1wbGUgYmxvY2sgKi8KKwlVaW50MTYJYml0c3BlcnNhbXBsZTsJCS8qIE9uZSBvZiA4LCAxMiwgMTYsIG9yIDQgZm9yIEFEUENNICovCit9IFdhdmVGTVQ7CisKKy8qIFRoZSBnZW5lcmFsIGNodW5rIGZvdW5kIGluIHRoZSBXQVZFIGZpbGUgKi8KK3R5cGVkZWYgc3RydWN0IENodW5rIHsKKwlVaW50MzIgbWFnaWM7CisJVWludDMyIGxlbmd0aDsKKwlVaW50OCAqZGF0YTsKK30gQ2h1bms7CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vYWxzYS9TRExfYWxzYV9hdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9hbHNhL1NETF9hbHNhX2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwNzMzZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vYWxzYS9TRExfYWxzYV9hdWRpby5jCkBAIC0wLDAgKzEsNjE5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQWxsb3cgYWNjZXNzIHRvIGEgcmF3IG1peGluZyBidWZmZXIgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgkvKiBGb3Iga2lsbCgpICovCisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIlNETF9hbHNhX2F1ZGlvLmgiCisKKyNpZmRlZiBTRExfQVVESU9fRFJJVkVSX0FMU0FfRFlOQU1JQworI2luY2x1ZGUgIlNETF9uYW1lLmgiCisjaW5jbHVkZSAiU0RMX2xvYWRzby5oIgorI2Vsc2UKKyNkZWZpbmUgU0RMX05BTUUoWCkJWAorI2VuZGlmCisKKworLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgQUxTQSBhdWRpbyAqLworI2RlZmluZSBEUklWRVJfTkFNRSAgICAgICAgICJhbHNhIgorCisvKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IEFMU0FfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIEFMU0FfV2FpdEF1ZGlvKF9USElTKTsKK3N0YXRpYyB2b2lkIEFMU0FfUGxheUF1ZGlvKF9USElTKTsKK3N0YXRpYyBVaW50OCAqQUxTQV9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBBTFNBX0Nsb3NlQXVkaW8oX1RISVMpOworCisjaWZkZWYgU0RMX0FVRElPX0RSSVZFUl9BTFNBX0RZTkFNSUMKKworc3RhdGljIGNvbnN0IGNoYXIgKmFsc2FfbGlicmFyeSA9IFNETF9BVURJT19EUklWRVJfQUxTQV9EWU5BTUlDOworc3RhdGljIHZvaWQgKmFsc2FfaGFuZGxlID0gTlVMTDsKK3N0YXRpYyBpbnQgYWxzYV9sb2FkZWQgPSAwOworCitzdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9vcGVuKSkoc25kX3BjbV90ICoqcGNtLCBjb25zdCBjaGFyICpuYW1lLCBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21fY2xvc2UpKShzbmRfcGNtX3QgKnBjbSk7CitzdGF0aWMgc25kX3BjbV9zZnJhbWVzX3QgKCpTRExfTkFNRShzbmRfcGNtX3dyaXRlaSkpKHNuZF9wY21fdCAqcGNtLCBjb25zdCB2b2lkICpidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21fcmVjb3ZlcikpKHNuZF9wY21fdCAqcGNtLCBpbnQgZXJyLCBpbnQgc2lsZW50KTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX3ByZXBhcmUpKShzbmRfcGNtX3QgKnBjbSk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9kcmFpbikpKHNuZF9wY21fdCAqcGNtKTsKK3N0YXRpYyBjb25zdCBjaGFyICooKlNETF9OQU1FKHNuZF9zdHJlcnJvcikpKGludCBlcnJudW0pOworc3RhdGljIHNpemVfdCAoKlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NpemVvZikpKHZvaWQpOworc3RhdGljIHNpemVfdCAoKlNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX3NpemVvZikpKHZvaWQpOworc3RhdGljIHZvaWQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19jb3B5KSkoc25kX3BjbV9od19wYXJhbXNfdCAqZHN0LCBjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpzcmMpOworc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2FueSkpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MpKShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc190IGFjY2Vzcyk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdCkpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHMpKShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHMpKShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyKSkoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhcikpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwsIGludCAqZGlyKTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemUpKShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICpmcmFtZXMsIGludCAqZGlyKTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19uZWFyKSkoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kcykpKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbmVhcikpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZSkpKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXMpKShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKKy8qCisqLworc3RhdGljIGludCAoKlNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX3NldF9hdmFpbF9taW4pKShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqc3dwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXNfY3VycmVudCkpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpzd3BhcmFtcyk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZCkpKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXMpKShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShzbmRfcGNtX25vbmJsb2NrKSkoc25kX3BjbV90ICpwY20sIGludCBub25ibG9jayk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoc25kX3BjbV93YWl0KSkoc25kX3BjbV90ICpwY20sIGludCB0aW1lb3V0KTsKKyNkZWZpbmUgc25kX3BjbV9od19wYXJhbXNfc2l6ZW9mIFNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NpemVvZikKKyNkZWZpbmUgc25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mIFNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX3NpemVvZikKKworLyogY2FzdCBmdW5jcyB0byBjaGFyKiBmaXJzdCwgdG8gcGxlYXNlIEdDQydzIHN0cmljdCBhbGlhc2luZyBydWxlcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAqKmZ1bmM7Cit9IGFsc2FfZnVuY3Rpb25zW10gPSB7CisJeyAic25kX3BjbV9vcGVuIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21fb3BlbikJCX0sCisJeyAic25kX3BjbV9jbG9zZSIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX2Nsb3NlKQl9LAorCXsgInNuZF9wY21fd3JpdGVpIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21fd3JpdGVpKQl9LAorCXsgInNuZF9wY21fcmVjb3ZlciIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX3JlY292ZXIpCX0sCisJeyAic25kX3BjbV9wcmVwYXJlIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21fcHJlcGFyZSkJfSwKKwl7ICJzbmRfcGNtX2RyYWluIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21fZHJhaW4pCX0sCisJeyAic25kX3N0cmVycm9yIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9zdHJlcnJvcikJCX0sCisJeyAic25kX3BjbV9od19wYXJhbXNfc2l6ZW9mIiwJCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zaXplb2YpCQl9LAorCXsgInNuZF9wY21fc3dfcGFyYW1zX3NpemVvZiIsCQkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mKQkJfSwKKwl7ICJzbmRfcGNtX2h3X3BhcmFtc19jb3B5IiwJCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19jb3B5KQkJfSwKKwl7ICJzbmRfcGNtX2h3X3BhcmFtc19hbnkiLAkJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2FueSkJCX0sCisJeyAic25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2VzcyIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzKQkJfSwKKwl7ICJzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0IiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXQpCQl9LAorCXsgInNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVscyIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHMpCX0sCisJeyAic25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVscykJfSwKKwl7ICJzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX25lYXIpCX0sCisJeyAic25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIpCX0sCisJeyAic25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZSkJfSwKKwl7ICJzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19uZWFyIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX25lYXIpCX0sCisJeyAic25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHMiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHMpCX0sCisJeyAic25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIpIH0sCisJeyAic25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZSkgfSwKKwl7ICJzbmRfcGNtX2h3X3BhcmFtcyIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtcykJfSwKKwl7ICJzbmRfcGNtX3N3X3BhcmFtc19zZXRfYXZhaWxfbWluIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX3NldF9hdmFpbF9taW4pIH0sCisJeyAic25kX3BjbV9zd19wYXJhbXNfY3VycmVudCIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX3N3X3BhcmFtc19jdXJyZW50KQl9LAorCXsgInNuZF9wY21fc3dfcGFyYW1zX3NldF9zdGFydF90aHJlc2hvbGQiLAkodm9pZCoqKShjaGFyKikmU0RMX05BTUUoc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZCkJfSwKKwl7ICJzbmRfcGNtX3N3X3BhcmFtcyIsCSh2b2lkKiopKGNoYXIqKSZTRExfTkFNRShzbmRfcGNtX3N3X3BhcmFtcykJfSwKKwl7ICJzbmRfcGNtX25vbmJsb2NrIiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21fbm9uYmxvY2spCX0sCisJeyAic25kX3BjbV93YWl0IiwJKHZvaWQqKikoY2hhciopJlNETF9OQU1FKHNuZF9wY21fd2FpdCkJfSwKK307CisKK3N0YXRpYyB2b2lkIFVubG9hZEFMU0FMaWJyYXJ5KHZvaWQpIHsKKwlpZiAoYWxzYV9sb2FkZWQpIHsKKwkJU0RMX1VubG9hZE9iamVjdChhbHNhX2hhbmRsZSk7CisJCWFsc2FfaGFuZGxlID0gTlVMTDsKKwkJYWxzYV9sb2FkZWQgPSAwOworCX0KK30KKworc3RhdGljIGludCBMb2FkQUxTQUxpYnJhcnkodm9pZCkgeworCWludCBpLCByZXR2YWwgPSAtMTsKKworCWFsc2FfaGFuZGxlID0gU0RMX0xvYWRPYmplY3QoYWxzYV9saWJyYXJ5KTsKKwlpZiAoYWxzYV9oYW5kbGUpIHsKKwkJYWxzYV9sb2FkZWQgPSAxOworCQlyZXR2YWwgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgU0RMX2FycmF5c2l6ZShhbHNhX2Z1bmN0aW9ucyk7IGkrKykgeworCQkJKmFsc2FfZnVuY3Rpb25zW2ldLmZ1bmMgPSBTRExfTG9hZEZ1bmN0aW9uKGFsc2FfaGFuZGxlLGFsc2FfZnVuY3Rpb25zW2ldLm5hbWUpOworCQkJaWYgKCEqYWxzYV9mdW5jdGlvbnNbaV0uZnVuYykgeworCQkJCXJldHZhbCA9IC0xOworCQkJCVVubG9hZEFMU0FMaWJyYXJ5KCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgVW5sb2FkQUxTQUxpYnJhcnkodm9pZCkgeworCXJldHVybjsKK30KKworc3RhdGljIGludCBMb2FkQUxTQUxpYnJhcnkodm9pZCkgeworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogU0RMX0FVRElPX0RSSVZFUl9BTFNBX0RZTkFNSUMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9hdWRpb19kZXZpY2UoaW50IGNoYW5uZWxzKQoreworCWNvbnN0IGNoYXIgKmRldmljZTsKKwkKKwlkZXZpY2UgPSBTRExfZ2V0ZW52KCJBVURJT0RFViIpOwkvKiBJcyB0aGVyZSBhIHN0YW5kYXJkIHZhcmlhYmxlIG5hbWU/ICovCisJaWYgKCBkZXZpY2UgPT0gTlVMTCApIHsKKwkJc3dpdGNoIChjaGFubmVscykgeworCQljYXNlIDY6CisJCQlkZXZpY2UgPSAicGx1ZzpzdXJyb3VuZDUxIjsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlkZXZpY2UgPSAicGx1ZzpzdXJyb3VuZDQwIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2aWNlID0gImRlZmF1bHQiOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGRldmljZTsKK30KKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKwlpbnQgYXZhaWxhYmxlOworCWludCBzdGF0dXM7CisJc25kX3BjbV90ICpoYW5kbGU7CisKKwlhdmFpbGFibGUgPSAwOworCWlmIChMb2FkQUxTQUxpYnJhcnkoKSA8IDApIHsKKwkJcmV0dXJuIGF2YWlsYWJsZTsKKwl9CisJc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9vcGVuKSgmaGFuZGxlLCBnZXRfYXVkaW9fZGV2aWNlKDIpLCBTTkRfUENNX1NUUkVBTV9QTEFZQkFDSywgU05EX1BDTV9OT05CTE9DSyk7CisJaWYgKCBzdGF0dXMgPj0gMCApIHsKKwkJYXZhaWxhYmxlID0gMTsKKyAgICAgICAgCVNETF9OQU1FKHNuZF9wY21fY2xvc2UpKGhhbmRsZSk7CisJfQorCVVubG9hZEFMU0FMaWJyYXJ5KCk7CisJcmV0dXJuKGF2YWlsYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKKwlVbmxvYWRBTFNBTGlicmFyeSgpOworfQorCitzdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9BdWRpb0RldmljZSAqdGhpczsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJTG9hZEFMU0FMaWJyYXJ5KCk7CisJdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKKwlpZiAoIHRoaXMgKSB7CisJCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOworCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCisJCQkJU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCB0aGlzICkgeworCQkJU0RMX2ZyZWUodGhpcyk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJdGhpcy0+T3BlbkF1ZGlvID0gQUxTQV9PcGVuQXVkaW87CisJdGhpcy0+V2FpdEF1ZGlvID0gQUxTQV9XYWl0QXVkaW87CisJdGhpcy0+UGxheUF1ZGlvID0gQUxTQV9QbGF5QXVkaW87CisJdGhpcy0+R2V0QXVkaW9CdWYgPSBBTFNBX0dldEF1ZGlvQnVmOworCXRoaXMtPkNsb3NlQXVkaW8gPSBBTFNBX0Nsb3NlQXVkaW87CisKKwl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIEFMU0FfYm9vdHN0cmFwID0geworCURSSVZFUl9OQU1FLCAiQUxTQSBQQ00gYXVkaW8iLAorCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIEFMU0FfV2FpdEF1ZGlvKF9USElTKQoreworCS8qIFdlJ3JlIGluIGJsb2NraW5nIG1vZGUsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBkbyBoZXJlICovCit9CisKKworLyoKKyAqIGh0dHA6Ly9idWd6aWxsYS5saWJzZGwub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTAKKyAqICJGb3IgTGludXggQUxTQSwgdGhpcyBpcyBGTC1GUi1STC1SUi1DLUxGRQorICogIGFuZCBmb3IgV2luZG93cyBEaXJlY3RYIFthbmQgQ29yZUF1ZGlvXSwgdGhpcyBpcyBGTC1GUi1DLUxGRS1STC1SUiIKKyAqLworI2RlZmluZSBTV0laNihUKSBcCisgICAgVCAqcHRyID0gKFQgKikgbWl4YnVmOyBcCisgICAgVWludDMyIGk7IFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy0+c3BlYy5zYW1wbGVzOyBpKyssIHB0ciArPSA2KSB7IFwKKyAgICAgICAgVCB0bXA7IFwKKyAgICAgICAgdG1wID0gcHRyWzJdOyBwdHJbMl0gPSBwdHJbNF07IHB0cls0XSA9IHRtcDsgXAorICAgICAgICB0bXAgPSBwdHJbM107IHB0clszXSA9IHB0cls1XTsgcHRyWzVdID0gdG1wOyBcCisgICAgfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN3aXp6bGVfYWxzYV9jaGFubmVsc182XzY0Yml0KF9USElTKSB7IFNXSVo2KFVpbnQ2NCk7IH0KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc3dpenpsZV9hbHNhX2NoYW5uZWxzXzZfMzJiaXQoX1RISVMpIHsgU1dJWjYoVWludDMyKTsgfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBzd2l6emxlX2Fsc2FfY2hhbm5lbHNfNl8xNmJpdChfVEhJUykgeyBTV0laNihVaW50MTYpOyB9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN3aXp6bGVfYWxzYV9jaGFubmVsc182XzhiaXQoX1RISVMpIHsgU1dJWjYoVWludDgpOyB9CisKKyN1bmRlZiBTV0laNgorCisKKy8qCisgKiBDYWxsZWQgcmlnaHQgYmVmb3JlIGZlZWRpbmcgdGhpcy0+bWl4YnVmIHRvIHRoZSBoYXJkd2FyZS4gU3dpenpsZSBjaGFubmVscworICogIGZyb20gV2luZG93cy9NYWMgb3JkZXIgdG8gdGhlIGZvcm1hdCBhbHNhbGliIHdpbGwgd2FudC4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBzd2l6emxlX2Fsc2FfY2hhbm5lbHMoX1RISVMpCit7CisgICAgaWYgKHRoaXMtPnNwZWMuY2hhbm5lbHMgPT0gNikgeworICAgICAgICBjb25zdCBVaW50MTYgZm10c2l6ZSA9ICh0aGlzLT5zcGVjLmZvcm1hdCAmIDB4RkYpOyAvKiBiaXRzL2NoYW5uZWwuICovCisgICAgICAgIGlmIChmbXRzaXplID09IDE2KQorICAgICAgICAgICAgc3dpenpsZV9hbHNhX2NoYW5uZWxzXzZfMTZiaXQodGhpcyk7CisgICAgICAgIGVsc2UgaWYgKGZtdHNpemUgPT0gOCkKKyAgICAgICAgICAgIHN3aXp6bGVfYWxzYV9jaGFubmVsc182XzhiaXQodGhpcyk7CisgICAgICAgIGVsc2UgaWYgKGZtdHNpemUgPT0gMzIpCisgICAgICAgICAgICBzd2l6emxlX2Fsc2FfY2hhbm5lbHNfNl8zMmJpdCh0aGlzKTsKKyAgICAgICAgZWxzZSBpZiAoZm10c2l6ZSA9PSA2NCkKKyAgICAgICAgICAgIHN3aXp6bGVfYWxzYV9jaGFubmVsc182XzY0Yml0KHRoaXMpOworICAgIH0KKworICAgIC8qICEhISBGSVhNRTogdXBkYXRlIHRoaXMgZm9yIDcuMSBpZiBuZWVkZWQsIGxhdGVyLiAqLworfQorCisKK3N0YXRpYyB2b2lkIEFMU0FfUGxheUF1ZGlvKF9USElTKQoreworCWludCBzdGF0dXM7CisJc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzX2xlZnQ7CisJY29uc3QgVWludDggKnNhbXBsZV9idWYgPSAoY29uc3QgVWludDggKikgbWl4YnVmOworCWNvbnN0IGludCBmcmFtZV9zaXplID0gKCgoaW50KSAodGhpcy0+c3BlYy5mb3JtYXQgJiAweEZGKSkgLyA4KSAqIHRoaXMtPnNwZWMuY2hhbm5lbHM7CisKKwlzd2l6emxlX2Fsc2FfY2hhbm5lbHModGhpcyk7CisKKwlmcmFtZXNfbGVmdCA9ICgoc25kX3BjbV91ZnJhbWVzX3QpIHRoaXMtPnNwZWMuc2FtcGxlcyk7CisKKwl3aGlsZSAoIGZyYW1lc19sZWZ0ID4gMCAmJiB0aGlzLT5lbmFibGVkICkgeworCQkvKiBUaGlzIHdvcmtzLCBidXQgbmVlZHMgbW9yZSB0ZXN0aW5nIGJlZm9yZSBnb2luZyBsaXZlICovCisJCS8qU0RMX05BTUUoc25kX3BjbV93YWl0KShwY21faGFuZGxlLCAtMSk7Ki8KKworCQlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX3dyaXRlaSkocGNtX2hhbmRsZSwgc2FtcGxlX2J1ZiwgZnJhbWVzX2xlZnQpOworCQlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCQlpZiAoIHN0YXR1cyA9PSAtRUFHQUlOICkgeworCQkJCS8qIEFwcGFyZW50bHkgc25kX3BjbV9yZWNvdmVyKCkgZG9lc24ndCBoYW5kbGUgdGhpcyBjYXNlIC0gZG9lcyBpdCBhc3N1bWUgc25kX3BjbV93YWl0KCkgYWJvdmU/ICovCisJCQkJU0RMX0RlbGF5KDEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9yZWNvdmVyKShwY21faGFuZGxlLCBzdGF0dXMsIDApOworCQkJaWYgKCBzdGF0dXMgPCAwICkgeworCQkJCS8qIEhtbSwgbm90IG11Y2ggd2UgY2FuIGRvIC0gYWJvcnQgKi8KKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkFMU0Egd3JpdGUgZmFpbGVkICh1bnJlY292ZXJhYmxlKTogJXNcbiIsIFNETF9OQU1FKHNuZF9zdHJlcnJvcikoc3RhdHVzKSk7CisJCQkJdGhpcy0+ZW5hYmxlZCA9IDA7CisJCQkJcmV0dXJuOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJc2FtcGxlX2J1ZiArPSBzdGF0dXMgKiBmcmFtZV9zaXplOworCQlmcmFtZXNfbGVmdCAtPSBzdGF0dXM7CisJfQorfQorCitzdGF0aWMgVWludDggKkFMU0FfR2V0QXVkaW9CdWYoX1RISVMpCit7CisJcmV0dXJuKG1peGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIEFMU0FfQ2xvc2VBdWRpbyhfVEhJUykKK3sKKwlpZiAoIG1peGJ1ZiAhPSBOVUxMICkgeworCQlTRExfRnJlZUF1ZGlvTWVtKG1peGJ1Zik7CisJCW1peGJ1ZiA9IE5VTEw7CisJfQorCWlmICggcGNtX2hhbmRsZSApIHsKKwkJU0RMX05BTUUoc25kX3BjbV9kcmFpbikocGNtX2hhbmRsZSk7CisJCVNETF9OQU1FKHNuZF9wY21fY2xvc2UpKHBjbV9oYW5kbGUpOworCQlwY21faGFuZGxlID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgQUxTQV9maW5hbGl6ZV9oYXJkd2FyZShfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYywgc25kX3BjbV9od19wYXJhbXNfdCAqaHdwYXJhbXMsIGludCBvdmVycmlkZSkKK3sKKwlpbnQgc3RhdHVzOworCXNuZF9wY21fdWZyYW1lc190IGJ1ZnNpemU7CisKKwkvKiAic2V0IiB0aGUgaGFyZHdhcmUgd2l0aCB0aGUgZGVzaXJlZCBwYXJhbWV0ZXJzICovCisJc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXMpKHBjbV9oYW5kbGUsIGh3cGFyYW1zKTsKKwlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCXJldHVybigtMSk7CisJfQorCisJLyogR2V0IHNhbXBsZXMgZm9yIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUgKi8KKwlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemUpKGh3cGFyYW1zLCAmYnVmc2l6ZSk7CisJaWYgKCBzdGF0dXMgPCAwICkgeworCQlyZXR1cm4oLTEpOworCX0KKwlpZiAoICFvdmVycmlkZSAmJiBidWZzaXplICE9IHNwZWMtPnNhbXBsZXMgKiAyICkgeworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIEZJWE1FOiBJcyB0aGlzIHNhZmUgdG8gZG8/ICovCisJc3BlYy0+c2FtcGxlcyA9IGJ1ZnNpemUgLyAyOworCisJLyogVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyAqLworCWlmICggZ2V0ZW52KCJTRExfQVVESU9fQUxTQV9ERUJVRyIpICkgeworCQlzbmRfcGNtX3VmcmFtZXNfdCBwZXJzaXplID0gMDsKKwkJdW5zaWduZWQgaW50IHBlcmlvZHMgPSAwOworCisJCVNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZSkoaHdwYXJhbXMsICZwZXJzaXplLCBOVUxMKTsKKwkJU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHMpKGh3cGFyYW1zLCAmcGVyaW9kcywgTlVMTCk7CisKKwkJZnByaW50ZihzdGRlcnIsICJBTFNBOiBwZXJpb2Qgc2l6ZSA9ICVsZCwgcGVyaW9kcyA9ICV1LCBidWZmZXIgc2l6ZSA9ICVsdVxuIiwgcGVyc2l6ZSwgcGVyaW9kcywgYnVmc2l6ZSk7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBBTFNBX3NldF9wZXJpb2Rfc2l6ZShfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYywgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgb3ZlcnJpZGUpCit7CisJY29uc3QgY2hhciAqZW52OworCWludCBzdGF0dXM7CisJc25kX3BjbV9od19wYXJhbXNfdCAqaHdwYXJhbXM7CisJc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzOworCXVuc2lnbmVkIGludCBwZXJpb2RzOworCisJLyogQ29weSB0aGUgaGFyZHdhcmUgcGFyYW1ldGVycyBmb3IgdGhpcyBzZXR1cCAqLworCXNuZF9wY21faHdfcGFyYW1zX2FsbG9jYSgmaHdwYXJhbXMpOworCVNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2NvcHkpKGh3cGFyYW1zLCBwYXJhbXMpOworCisJaWYgKCAhb3ZlcnJpZGUgKSB7CisJCWVudiA9IGdldGVudigiU0RMX0FVRElPX0FMU0FfU0VUX1BFUklPRF9TSVpFIik7CisJCWlmICggZW52ICkgeworCQkJb3ZlcnJpZGUgPSBTRExfYXRvaShlbnYpOworCQkJaWYgKCBvdmVycmlkZSA9PSAwICkgeworCQkJCXJldHVybigtMSk7CisJCQl9CisJCX0KKwl9CisKKwlmcmFtZXMgPSBzcGVjLT5zYW1wbGVzOworCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyKShwY21faGFuZGxlLCBod3BhcmFtcywgJmZyYW1lcywgTlVMTCk7CisJaWYgKCBzdGF0dXMgPCAwICkgeworCQlyZXR1cm4oLTEpOworCX0KKworCXBlcmlvZHMgPSAyOworCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX25lYXIpKHBjbV9oYW5kbGUsIGh3cGFyYW1zLCAmcGVyaW9kcywgTlVMTCk7CisJaWYgKCBzdGF0dXMgPCAwICkgeworCQlyZXR1cm4oLTEpOworCX0KKworCXJldHVybiBBTFNBX2ZpbmFsaXplX2hhcmR3YXJlKHRoaXMsIHNwZWMsIGh3cGFyYW1zLCBvdmVycmlkZSk7Cit9CisKK3N0YXRpYyBpbnQgQUxTQV9zZXRfYnVmZmVyX3NpemUoX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMsIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50IG92ZXJyaWRlKQoreworCWNvbnN0IGNoYXIgKmVudjsKKwlpbnQgc3RhdHVzOworCXNuZF9wY21faHdfcGFyYW1zX3QgKmh3cGFyYW1zOworCXNuZF9wY21fdWZyYW1lc190IGZyYW1lczsKKworCS8qIENvcHkgdGhlIGhhcmR3YXJlIHBhcmFtZXRlcnMgZm9yIHRoaXMgc2V0dXAgKi8KKwlzbmRfcGNtX2h3X3BhcmFtc19hbGxvY2EoJmh3cGFyYW1zKTsKKwlTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19jb3B5KShod3BhcmFtcywgcGFyYW1zKTsKKworCWlmICggIW92ZXJyaWRlICkgeworCQllbnYgPSBnZXRlbnYoIlNETF9BVURJT19BTFNBX1NFVF9CVUZGRVJfU0laRSIpOworCQlpZiAoIGVudiApIHsKKwkJCW92ZXJyaWRlID0gU0RMX2F0b2koZW52KTsKKwkJCWlmICggb3ZlcnJpZGUgPT0gMCApIHsKKwkJCQlyZXR1cm4oLTEpOworCQkJfQorCQl9CisJfQorCisJZnJhbWVzID0gc3BlYy0+c2FtcGxlcyAqIDI7CisJc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIpKHBjbV9oYW5kbGUsIGh3cGFyYW1zLCAmZnJhbWVzKTsKKwlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCXJldHVybigtMSk7CisJfQorCisJcmV0dXJuIEFMU0FfZmluYWxpemVfaGFyZHdhcmUodGhpcywgc3BlYywgaHdwYXJhbXMsIG92ZXJyaWRlKTsKK30KKworc3RhdGljIGludCBBTFNBX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwlpbnQgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc25kX3BjbV9od19wYXJhbXNfdCAqaHdwYXJhbXM7CisJc25kX3BjbV9zd19wYXJhbXNfdCAqc3dwYXJhbXM7CisJc25kX3BjbV9mb3JtYXRfdCAgICAgZm9ybWF0OworCXVuc2lnbmVkIGludCAgICAgICAgIHJhdGU7CisJdW5zaWduZWQgaW50IAkgICAgIGNoYW5uZWxzOworCVVpbnQxNiAgICAgICAgICAgICAgIHRlc3RfZm9ybWF0OworCisJLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlICovCisJLyogTmFtZSBvZiBkZXZpY2Ugc2hvdWxkIGRlcGVuZCBvbiAjIGNoYW5uZWxzIGluIHNwZWMgKi8KKwlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX29wZW4pKCZwY21faGFuZGxlLCBnZXRfYXVkaW9fZGV2aWNlKHNwZWMtPmNoYW5uZWxzKSwgU05EX1BDTV9TVFJFQU1fUExBWUJBQ0ssIFNORF9QQ01fTk9OQkxPQ0spOworCisJaWYgKCBzdGF0dXMgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gYXVkaW8gZGV2aWNlOiAlcyIsIFNETF9OQU1FKHNuZF9zdHJlcnJvcikoc3RhdHVzKSk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogRmlndXJlIG91dCB3aGF0IHRoZSBoYXJkd2FyZSBpcyBjYXBhYmxlIG9mICovCisJc25kX3BjbV9od19wYXJhbXNfYWxsb2NhKCZod3BhcmFtcyk7CisJc3RhdHVzID0gU0RMX05BTUUoc25kX3BjbV9od19wYXJhbXNfYW55KShwY21faGFuZGxlLCBod3BhcmFtcyk7CisJaWYgKCBzdGF0dXMgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBoYXJkd2FyZSBjb25maWc6ICVzIiwgU0RMX05BTUUoc25kX3N0cmVycm9yKShzdGF0dXMpKTsKKwkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFNETCBvbmx5IHVzZXMgaW50ZXJsZWF2ZWQgc2FtcGxlIG91dHB1dCAqLworCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MpKHBjbV9oYW5kbGUsIGh3cGFyYW1zLCBTTkRfUENNX0FDQ0VTU19SV19JTlRFUkxFQVZFRCk7CisJaWYgKCBzdGF0dXMgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBpbnRlcmxlYXZlZCBhY2Nlc3M6ICVzIiwgU0RMX05BTUUoc25kX3N0cmVycm9yKShzdGF0dXMpKTsKKwkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFRyeSBmb3IgYSBjbG9zZXN0IG1hdGNoIG9uIGF1ZGlvIGZvcm1hdCAqLworCXN0YXR1cyA9IC0xOworCWZvciAoIHRlc3RfZm9ybWF0ID0gU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoc3BlYy0+Zm9ybWF0KTsKKwkgICAgICB0ZXN0X2Zvcm1hdCAmJiAoc3RhdHVzIDwgMCk7ICkgeworCQlzd2l0Y2ggKCB0ZXN0X2Zvcm1hdCApIHsKKwkJCWNhc2UgQVVESU9fVTg6CisJCQkJZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfVTg7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX1M4OgorCQkJCWZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1M4OworCQkJCWJyZWFrOworCQkJY2FzZSBBVURJT19TMTZMU0I6CisJCQkJZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfUzE2X0xFOworCQkJCWJyZWFrOworCQkJY2FzZSBBVURJT19TMTZNU0I6CisJCQkJZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfUzE2X0JFOworCQkJCWJyZWFrOworCQkJY2FzZSBBVURJT19VMTZMU0I6CisJCQkJZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfVTE2X0xFOworCQkJCWJyZWFrOworCQkJY2FzZSBBVURJT19VMTZNU0I6CisJCQkJZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfVTE2X0JFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmb3JtYXQgPSAwOworCQkJCWJyZWFrOworCQl9CisJCWlmICggZm9ybWF0ICE9IDAgKSB7CisJCQlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0KShwY21faGFuZGxlLCBod3BhcmFtcywgZm9ybWF0KTsKKwkJfQorCQlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKKwkJfQorCX0KKwlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCBhbnkgaGFyZHdhcmUgYXVkaW8gZm9ybWF0cyIpOworCQlBTFNBX0Nsb3NlQXVkaW8odGhpcyk7CisJCXJldHVybigtMSk7CisJfQorCXNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OworCisJLyogU2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHMpKHBjbV9oYW5kbGUsIGh3cGFyYW1zLCBzcGVjLT5jaGFubmVscyk7CisJY2hhbm5lbHMgPSBzcGVjLT5jaGFubmVsczsKKwlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVscykoaHdwYXJhbXMsICZjaGFubmVscyk7CisJCWlmICggc3RhdHVzIDwgMCApIHsKKwkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGNoYW5uZWxzIik7CisJCQlBTFNBX0Nsb3NlQXVkaW8odGhpcyk7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCXNwZWMtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisJfQorCisJLyogU2V0IHRoZSBhdWRpbyByYXRlICovCisJcmF0ZSA9IHNwZWMtPmZyZXE7CisKKwlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyKShwY21faGFuZGxlLCBod3BhcmFtcywgJnJhdGUsIE5VTEwpOworCWlmICggc3RhdHVzIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgYXVkaW8gZnJlcXVlbmN5OiAlcyIsIFNETF9OQU1FKHNuZF9zdHJlcnJvcikoc3RhdHVzKSk7CisJCUFMU0FfQ2xvc2VBdWRpbyh0aGlzKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJc3BlYy0+ZnJlcSA9IHJhdGU7CisKKwkvKiBTZXQgdGhlIGJ1ZmZlciBzaXplLCBpbiBzYW1wbGVzICovCisJaWYgKCBBTFNBX3NldF9wZXJpb2Rfc2l6ZSh0aGlzLCBzcGVjLCBod3BhcmFtcywgMCkgPCAwICYmCisJICAgICBBTFNBX3NldF9idWZmZXJfc2l6ZSh0aGlzLCBzcGVjLCBod3BhcmFtcywgMCkgPCAwICkgeworCQkvKiBGYWlsZWQgdG8gc2V0IGRlc2lyZWQgYnVmZmVyIHNpemUsIGRvIHRoZSBiZXN0IHlvdSBjYW4uLi4gKi8KKwkJaWYgKCBBTFNBX3NldF9wZXJpb2Rfc2l6ZSh0aGlzLCBzcGVjLCBod3BhcmFtcywgMSkgPCAwICkgeworCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgaGFyZHdhcmUgYXVkaW8gcGFyYW1ldGVyczogJXMiLCBTRExfTkFNRShzbmRfc3RyZXJyb3IpKHN0YXR1cykpOworCQkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCX0KKworCS8qIFNldCB0aGUgc29mdHdhcmUgcGFyYW1ldGVycyAqLworCXNuZF9wY21fc3dfcGFyYW1zX2FsbG9jYSgmc3dwYXJhbXMpOworCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX2N1cnJlbnQpKHBjbV9oYW5kbGUsIHN3cGFyYW1zKTsKKwlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IHNvZnR3YXJlIGNvbmZpZzogJXMiLCBTRExfTkFNRShzbmRfc3RyZXJyb3IpKHN0YXR1cykpOworCQlBTFNBX0Nsb3NlQXVkaW8odGhpcyk7CisJCXJldHVybigtMSk7CisJfQorCXN0YXR1cyA9IFNETF9OQU1FKHNuZF9wY21fc3dfcGFyYW1zX3NldF9hdmFpbF9taW4pKHBjbV9oYW5kbGUsIHN3cGFyYW1zLCBzcGVjLT5zYW1wbGVzKTsKKwlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IG1pbmltdW0gYXZhaWxhYmxlIHNhbXBsZXM6ICVzIiwgU0RMX05BTUUoc25kX3N0cmVycm9yKShzdGF0dXMpKTsKKwkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKwlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfdGhyZXNob2xkKShwY21faGFuZGxlLCBzd3BhcmFtcywgMSk7CisJaWYgKCBzdGF0dXMgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBzdGFydCB0aHJlc2hvbGQ6ICVzIiwgU0RMX05BTUUoc25kX3N0cmVycm9yKShzdGF0dXMpKTsKKwkJQUxTQV9DbG9zZUF1ZGlvKHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKwlzdGF0dXMgPSBTRExfTkFNRShzbmRfcGNtX3N3X3BhcmFtcykocGNtX2hhbmRsZSwgc3dwYXJhbXMpOworCWlmICggc3RhdHVzIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgc29mdHdhcmUgYXVkaW8gcGFyYW1ldGVyczogJXMiLCBTRExfTkFNRShzbmRfc3RyZXJyb3IpKHN0YXR1cykpOworCQlBTFNBX0Nsb3NlQXVkaW8odGhpcyk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGF1ZGlvIHNwZWNpZmljYXRpb24gKi8KKwlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOworCisJLyogQWxsb2NhdGUgbWl4aW5nIGJ1ZmZlciAqLworCW1peGxlbiA9IHNwZWMtPnNpemU7CisJbWl4YnVmID0gKFVpbnQ4ICopU0RMX0FsbG9jQXVkaW9NZW0obWl4bGVuKTsKKwlpZiAoIG1peGJ1ZiA9PSBOVUxMICkgeworCQlBTFNBX0Nsb3NlQXVkaW8odGhpcyk7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tZW1zZXQobWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKKworCS8qIFN3aXRjaCB0byBibG9ja2luZyBtb2RlIGZvciBwbGF5YmFjayAqLworCVNETF9OQU1FKHNuZF9wY21fbm9uYmxvY2spKHBjbV9oYW5kbGUsIDApOworCisJLyogV2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9hbHNhL1NETF9hbHNhX2F1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2Fsc2EvU0RMX2Fsc2FfYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWFlODdiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9hbHNhL1NETF9hbHNhX2F1ZGlvLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX0FMU0FfUENNX2F1ZGlvX2gKKyNkZWZpbmUgX0FMU0FfUENNX2F1ZGlvX2gKKworI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcworCitzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgeworCS8qIFRoZSBhdWRpbyBkZXZpY2UgaGFuZGxlICovCisJc25kX3BjbV90ICpwY21faGFuZGxlOworCisJLyogUmF3IG1peGluZyBidWZmZXIgKi8KKwlVaW50OCAqbWl4YnVmOworCWludCAgICBtaXhsZW47Cit9OworCisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgcGNtX2hhbmRsZQkJKHRoaXMtPmhpZGRlbi0+cGNtX2hhbmRsZSkKKyNkZWZpbmUgbWl4YnVmCQkJKHRoaXMtPmhpZGRlbi0+bWl4YnVmKQorI2RlZmluZSBtaXhsZW4JCQkodGhpcy0+aGlkZGVuLT5taXhsZW4pCisKKyNlbmRpZiAvKiBfQUxTQV9QQ01fYXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9hcnRzL1NETF9hcnRzYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vYXJ0cy9TRExfYXJ0c2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczZjhjMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vYXJ0cy9TRExfYXJ0c2F1ZGlvLmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLworCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCisjaW5jbHVkZSAiU0RMX2FydHNhdWRpby5oIgorCisjaWZkZWYgU0RMX0FVRElPX0RSSVZFUl9BUlRTX0RZTkFNSUMKKyNpbmNsdWRlICJTRExfbmFtZS5oIgorI2luY2x1ZGUgIlNETF9sb2Fkc28uaCIKKyNlbHNlCisjZGVmaW5lIFNETF9OQU1FKFgpCVgKKyNlbmRpZgorCisvKiBUaGUgdGFnIG5hbWUgdXNlZCBieSBhcnRzYyBhdWRpbyAqLworI2RlZmluZSBBUlRTX0RSSVZFUl9OQU1FICAgICAgICAgImFydHMiCisKKy8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgQVJUU19PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworc3RhdGljIHZvaWQgQVJUU19XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgQVJUU19QbGF5QXVkaW8oX1RISVMpOworc3RhdGljIFVpbnQ4ICpBUlRTX0dldEF1ZGlvQnVmKF9USElTKTsKK3N0YXRpYyB2b2lkIEFSVFNfQ2xvc2VBdWRpbyhfVEhJUyk7CisKKyNpZmRlZiBTRExfQVVESU9fRFJJVkVSX0FSVFNfRFlOQU1JQworCitzdGF0aWMgY29uc3QgY2hhciAqYXJ0c19saWJyYXJ5ID0gU0RMX0FVRElPX0RSSVZFUl9BUlRTX0RZTkFNSUM7CitzdGF0aWMgdm9pZCAqYXJ0c19oYW5kbGUgPSBOVUxMOworc3RhdGljIGludCBhcnRzX2xvYWRlZCA9IDA7CisKK3N0YXRpYyBpbnQgKCpTRExfTkFNRShhcnRzX2luaXQpKSh2b2lkKTsKK3N0YXRpYyB2b2lkICgqU0RMX05BTUUoYXJ0c19mcmVlKSkodm9pZCk7CitzdGF0aWMgYXJ0c19zdHJlYW1fdCAoKlNETF9OQU1FKGFydHNfcGxheV9zdHJlYW0pKShpbnQgcmF0ZSwgaW50IGJpdHMsIGludCBjaGFubmVscywgY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoYXJ0c19zdHJlYW1fc2V0KSkoYXJ0c19zdHJlYW1fdCBzLCBhcnRzX3BhcmFtZXRlcl90IHBhcmFtLCBpbnQgdmFsdWUpOworc3RhdGljIGludCAoKlNETF9OQU1FKGFydHNfc3RyZWFtX2dldCkpKGFydHNfc3RyZWFtX3QgcywgYXJ0c19wYXJhbWV0ZXJfdCBwYXJhbSk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoYXJ0c193cml0ZSkpKGFydHNfc3RyZWFtX3QgcywgY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgKCpTRExfTkFNRShhcnRzX2Nsb3NlX3N0cmVhbSkpKGFydHNfc3RyZWFtX3Qgcyk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoYXJ0c19zdXNwZW5kKSkodm9pZCk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoYXJ0c19zdXNwZW5kZWQpKSh2b2lkKTsKK3N0YXRpYyBjb25zdCBjaGFyICooKlNETF9OQU1FKGFydHNfZXJyb3JfdGV4dCkpKGludCBlcnJvcmNvZGUpOworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKipmdW5jOworfSBhcnRzX2Z1bmN0aW9uc1tdID0geworCXsgImFydHNfaW5pdCIsCQkodm9pZCAqKikmU0RMX05BTUUoYXJ0c19pbml0KQkJfSwKKwl7ICJhcnRzX2ZyZWUiLAkJKHZvaWQgKiopJlNETF9OQU1FKGFydHNfZnJlZSkJCX0sCisJeyAiYXJ0c19wbGF5X3N0cmVhbSIsCSh2b2lkICoqKSZTRExfTkFNRShhcnRzX3BsYXlfc3RyZWFtKQl9LAorCXsgImFydHNfc3RyZWFtX3NldCIsCSh2b2lkICoqKSZTRExfTkFNRShhcnRzX3N0cmVhbV9zZXQpCX0sCisJeyAiYXJ0c19zdHJlYW1fZ2V0IiwJKHZvaWQgKiopJlNETF9OQU1FKGFydHNfc3RyZWFtX2dldCkJfSwKKwl7ICJhcnRzX3dyaXRlIiwJCSh2b2lkICoqKSZTRExfTkFNRShhcnRzX3dyaXRlKQkJfSwKKwl7ICJhcnRzX2Nsb3NlX3N0cmVhbSIsCSh2b2lkICoqKSZTRExfTkFNRShhcnRzX2Nsb3NlX3N0cmVhbSkJfSwKKwl7ICJhcnRzX3N1c3BlbmQiLAkodm9pZCAqKikmU0RMX05BTUUoYXJ0c19zdXNwZW5kKQl9LAorCXsgImFydHNfc3VzcGVuZGVkIiwJKHZvaWQgKiopJlNETF9OQU1FKGFydHNfc3VzcGVuZGVkKQl9LAorCXsgImFydHNfZXJyb3JfdGV4dCIsCSh2b2lkICoqKSZTRExfTkFNRShhcnRzX2Vycm9yX3RleHQpCX0sCit9OworCitzdGF0aWMgdm9pZCBVbmxvYWRBUlRTTGlicmFyeSgpCit7CisJaWYgKCBhcnRzX2xvYWRlZCApIHsKKwkJU0RMX1VubG9hZE9iamVjdChhcnRzX2hhbmRsZSk7CisJCWFydHNfaGFuZGxlID0gTlVMTDsKKwkJYXJ0c19sb2FkZWQgPSAwOworCX0KK30KKworc3RhdGljIGludCBMb2FkQVJUU0xpYnJhcnkodm9pZCkKK3sKKwlpbnQgaSwgcmV0dmFsID0gLTE7CisKKwlhcnRzX2hhbmRsZSA9IFNETF9Mb2FkT2JqZWN0KGFydHNfbGlicmFyeSk7CisJaWYgKCBhcnRzX2hhbmRsZSApIHsKKwkJYXJ0c19sb2FkZWQgPSAxOworCQlyZXR2YWwgPSAwOworCQlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShhcnRzX2Z1bmN0aW9ucyk7ICsraSApIHsKKwkJCSphcnRzX2Z1bmN0aW9uc1tpXS5mdW5jID0gU0RMX0xvYWRGdW5jdGlvbihhcnRzX2hhbmRsZSwgYXJ0c19mdW5jdGlvbnNbaV0ubmFtZSk7CisJCQlpZiAoICEqYXJ0c19mdW5jdGlvbnNbaV0uZnVuYyApIHsKKwkJCQlyZXR2YWwgPSAtMTsKKwkJCQlVbmxvYWRBUlRTTGlicmFyeSgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIFVubG9hZEFSVFNMaWJyYXJ5KCkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgTG9hZEFSVFNMaWJyYXJ5KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBTRExfQVVESU9fRFJJVkVSX0FSVFNfRFlOQU1JQyAqLworCisvKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IEFSVFNfU3VzcGVuZCh2b2lkKQoreworCWNvbnN0IFVpbnQzMiBhYm9ydG1zID0gU0RMX0dldFRpY2tzKCkgKyAzMDAwOyAvKiBnaXZlIHVwIGFmdGVyIDMgc2VjcyAqLworCXdoaWxlICggKCFTRExfTkFNRShhcnRzX3N1c3BlbmRlZCkoKSkgJiYgKFNETF9HZXRUaWNrcygpIDwgYWJvcnRtcykgKSB7CisJCWlmICggU0RMX05BTUUoYXJ0c19zdXNwZW5kKSgpICkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gU0RMX05BTUUoYXJ0c19zdXNwZW5kZWQpKCk7Cit9CisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisJaW50IGF2YWlsYWJsZSA9IDA7CisKKwlpZiAoIExvYWRBUlRTTGlicmFyeSgpIDwgMCApIHsKKwkJcmV0dXJuIGF2YWlsYWJsZTsKKwl9CisJaWYgKCBTRExfTkFNRShhcnRzX2luaXQpKCkgPT0gMCApIHsKKwkJaWYgKCBBUlRTX1N1c3BlbmQoKSApIHsKKwkJCS8qIFBsYXkgYSBzdHJlYW0gc28gYVJ0cyBkb2Vzbid0IGNyYXNoICovCisJCQlhcnRzX3N0cmVhbV90IHN0cmVhbTI7CisJCQlzdHJlYW0yPVNETF9OQU1FKGFydHNfcGxheV9zdHJlYW0pKDQ0MTAwLCAxNiwgMiwgIlNETCIpOworCQkJU0RMX05BTUUoYXJ0c193cml0ZSkoc3RyZWFtMiwgIiIsIDApOworCQkJU0RMX05BTUUoYXJ0c19jbG9zZV9zdHJlYW0pKHN0cmVhbTIpOworCQkJYXZhaWxhYmxlID0gMTsKKwkJfQorCQlTRExfTkFNRShhcnRzX2ZyZWUpKCk7CisJfQorCVVubG9hZEFSVFNMaWJyYXJ5KCk7CisKKwlyZXR1cm4gYXZhaWxhYmxlOworfQorCitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCVNETF9mcmVlKGRldmljZSk7CisJVW5sb2FkQVJUU0xpYnJhcnkoKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCUxvYWRBUlRTTGlicmFyeSgpOworCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisJaWYgKCB0aGlzICkgeworCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJfQorCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggdGhpcyApIHsKKwkJCVNETF9mcmVlKHRoaXMpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCXN0cmVhbSA9IDA7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJdGhpcy0+T3BlbkF1ZGlvID0gQVJUU19PcGVuQXVkaW87CisJdGhpcy0+V2FpdEF1ZGlvID0gQVJUU19XYWl0QXVkaW87CisJdGhpcy0+UGxheUF1ZGlvID0gQVJUU19QbGF5QXVkaW87CisJdGhpcy0+R2V0QXVkaW9CdWYgPSBBUlRTX0dldEF1ZGlvQnVmOworCXRoaXMtPkNsb3NlQXVkaW8gPSBBUlRTX0Nsb3NlQXVkaW87CisKKwl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIEFSVFNfYm9vdHN0cmFwID0geworCUFSVFNfRFJJVkVSX05BTUUsICJBbmFsb2cgUmVhbHRpbWUgU3ludGhlc2l6ZXIiLAorCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIEFSVFNfV2FpdEF1ZGlvKF9USElTKQoreworCVNpbnQzMiB0aWNrczsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdGhyZWFkLXBhcmVudCBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlICovCisJeyBzdGF0aWMgaW50IGNudCA9IDA7CisJCS8qIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2l0aCB0aHJlYWQgaW1wbGVtZW50YXRpb25zIAorCQkgICB0aGF0IHVzZSBhIGRpZmZlcmVudCBwcm9jZXNzIGlkIGZvciBlYWNoIHRocmVhZC4KKwkJKi8KKwkJaWYgKHBhcmVudCAmJiAoKCgrK2NudCklMTApID09IDApKSB7IC8qIENoZWNrIGV2ZXJ5IDEwIGxvb3BzICovCisJCQlpZiAoIGtpbGwocGFyZW50LCAwKSA8IDAgKSB7CisJCQkJdGhpcy0+ZW5hYmxlZCA9IDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBVc2UgdGltZXIgZm9yIGdlbmVyYWwgYXVkaW8gc3luY2hyb25pemF0aW9uICovCisJdGlja3MgPSAoKFNpbnQzMikobmV4dF9mcmFtZSAtIFNETF9HZXRUaWNrcygpKSktRlVER0VfVElDS1M7CisJaWYgKCB0aWNrcyA+IDAgKSB7CisJCVNETF9EZWxheSh0aWNrcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBBUlRTX1BsYXlBdWRpbyhfVEhJUykKK3sKKwlpbnQgd3JpdHRlbjsKKworCS8qIFdyaXRlIHRoZSBhdWRpbyBkYXRhICovCisJd3JpdHRlbiA9IFNETF9OQU1FKGFydHNfd3JpdGUpKHN0cmVhbSwgbWl4YnVmLCBtaXhsZW4pOworCQorCS8qIElmIHRpbWVyIHN5bmNocm9uaXphdGlvbiBpcyBlbmFibGVkLCBzZXQgdGhlIG5leHQgd3JpdGUgZnJhbWUgKi8KKwlpZiAoIGZyYW1lX3RpY2tzICkgeworCQluZXh0X2ZyYW1lICs9IGZyYW1lX3RpY2tzOworCX0KKworCS8qIElmIHdlIGNvdWxkbid0IHdyaXRlLCBhc3N1bWUgZmF0YWwgZXJyb3IgZm9yIG5vdyAqLworCWlmICggd3JpdHRlbiA8IDAgKSB7CisJCXRoaXMtPmVuYWJsZWQgPSAwOworCX0KKyNpZmRlZiBERUJVR19BVURJTworCWZwcmludGYoc3RkZXJyLCAiV3JvdGUgJWQgYnl0ZXMgb2YgYXVkaW8gZGF0YVxuIiwgd3JpdHRlbik7CisjZW5kaWYKK30KKworc3RhdGljIFVpbnQ4ICpBUlRTX0dldEF1ZGlvQnVmKF9USElTKQoreworCXJldHVybihtaXhidWYpOworfQorCitzdGF0aWMgdm9pZCBBUlRTX0Nsb3NlQXVkaW8oX1RISVMpCit7CisJaWYgKCBtaXhidWYgIT0gTlVMTCApIHsKKwkJU0RMX0ZyZWVBdWRpb01lbShtaXhidWYpOworCQltaXhidWYgPSBOVUxMOworCX0KKwlpZiAoIHN0cmVhbSApIHsKKwkJU0RMX05BTUUoYXJ0c19jbG9zZV9zdHJlYW0pKHN0cmVhbSk7CisJCXN0cmVhbSA9IDA7CisJfQorCVNETF9OQU1FKGFydHNfZnJlZSkoKTsKK30KKworc3RhdGljIGludCBBUlRTX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwlpbnQgYml0cywgZnJhZ19zcGVjOworCVVpbnQxNiB0ZXN0X2Zvcm1hdCwgZm9ybWF0OworCWludCBlcnJvcl9jb2RlOworCisJLyogUmVzZXQgdGhlIHRpbWVyIHN5bmNocm9uaXphdGlvbiBmbGFnICovCisJZnJhbWVfdGlja3MgPSAwLjA7CisKKwltaXhidWYgPSBOVUxMOworCisJLyogVHJ5IGZvciBhIGNsb3Nlc3QgbWF0Y2ggb24gYXVkaW8gZm9ybWF0ICovCisJZm9ybWF0ID0gMDsKKwliaXRzID0gMDsKKwlmb3IgKCB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7CisJCQkJCQkhIGZvcm1hdCAmJiB0ZXN0X2Zvcm1hdDsgKSB7CisjaWZkZWYgREVCVUdfQVVESU8KKwkJZnByaW50ZihzdGRlcnIsICJUcnlpbmcgZm9ybWF0IDB4JTQuNHhcbiIsIHRlc3RfZm9ybWF0KTsKKyNlbmRpZgorCQlzd2l0Y2ggKCB0ZXN0X2Zvcm1hdCApIHsKKwkJCWNhc2UgQVVESU9fVTg6CisJCQkJYml0cyA9IDg7CisJCQkJZm9ybWF0ID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVESU9fUzE2TFNCOgorCQkJCWJpdHMgPSAxNjsKKwkJCQlmb3JtYXQgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmb3JtYXQgPSAwOworCQkJCWJyZWFrOworCQl9CisJCWlmICggISBmb3JtYXQgKSB7CisJCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKKwkJfQorCX0KKwlpZiAoIGZvcm1hdCA9PSAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHMiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7CisKKwllcnJvcl9jb2RlID0gU0RMX05BTUUoYXJ0c19pbml0KSgpOworCWlmICggZXJyb3JfY29kZSAhPSAwICkgeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBpbml0aWFsaXplIEFSVFM6ICVzIiwgU0RMX05BTUUoYXJ0c19lcnJvcl90ZXh0KShlcnJvcl9jb2RlKSk7CisJCXJldHVybigtMSk7CisJfQorCWlmICggISBBUlRTX1N1c3BlbmQoKSApIHsKKwkJU0RMX1NldEVycm9yKCJBUlRTIGNhbiBub3Qgb3BlbiBhdWRpbyBkZXZpY2UiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJc3RyZWFtID0gU0RMX05BTUUoYXJ0c19wbGF5X3N0cmVhbSkoc3BlYy0+ZnJlcSwgYml0cywgc3BlYy0+Y2hhbm5lbHMsICJTREwiKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgZmluYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBhdWRpbyBzcGVjaWZpY2F0aW9uICovCisJU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKworCS8qIERldGVybWluZSB0aGUgcG93ZXIgb2YgdHdvIG9mIHRoZSBmcmFnbWVudCBzaXplICovCisJZm9yICggZnJhZ19zcGVjID0gMDsgKDB4MDE8PGZyYWdfc3BlYykgPCBzcGVjLT5zaXplOyArK2ZyYWdfc3BlYyApOworCWlmICggKDB4MDE8PGZyYWdfc3BlYykgIT0gc3BlYy0+c2l6ZSApIHsKKwkJU0RMX1NldEVycm9yKCJGcmFnbWVudCBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28iKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJZnJhZ19zcGVjIHw9IDB4MDAwMjAwMDA7CS8qIHR3byBmcmFnbWVudHMsIGZvciBsb3cgbGF0ZW5jeSAqLworCisjaWZkZWYgQVJUU19QX1BBQ0tFVF9TRVRUSU5HUworCVNETF9OQU1FKGFydHNfc3RyZWFtX3NldCkoc3RyZWFtLCBBUlRTX1BfUEFDS0VUX1NFVFRJTkdTLCBmcmFnX3NwZWMpOworI2Vsc2UKKwlTRExfTkFNRShhcnRzX3N0cmVhbV9zZXQpKHN0cmVhbSwgQVJUU19QX1BBQ0tFVF9TSVpFLCBmcmFnX3NwZWMmMHhmZmZmKTsKKwlTRExfTkFNRShhcnRzX3N0cmVhbV9zZXQpKHN0cmVhbSwgQVJUU19QX1BBQ0tFVF9DT1VOVCwgZnJhZ19zcGVjPj4xNik7CisjZW5kaWYKKwlzcGVjLT5zaXplID0gU0RMX05BTUUoYXJ0c19zdHJlYW1fZ2V0KShzdHJlYW0sIEFSVFNfUF9QQUNLRVRfU0laRSk7CisKKwkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCisJbWl4bGVuID0gc3BlYy0+c2l6ZTsKKwltaXhidWYgPSAoVWludDggKilTRExfQWxsb2NBdWRpb01lbShtaXhsZW4pOworCWlmICggbWl4YnVmID09IE5VTEwgKSB7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tZW1zZXQobWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKKworCS8qIEdldCB0aGUgcGFyZW50IHByb2Nlc3MgaWQgKHdlJ3JlIHRoZSBwYXJlbnQgb2YgdGhlIGF1ZGlvIHRocmVhZCkgKi8KKwlwYXJlbnQgPSBnZXRwaWQoKTsKKworCS8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vYXJ0cy9TRExfYXJ0c2F1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2FydHMvU0RMX2FydHNhdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlM2IyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2FydHMvU0RMX2FydHNhdWRpby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfYXJ0c2NhdWRpb19oCisjZGVmaW5lIF9TRExfYXJ0c2NhdWRpb19oCisKKyNpbmNsdWRlIDxhcnRzYy5oPgorCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwkvKiBUaGUgc3RyZWFtIGRlc2NyaXB0b3IgZm9yIHRoZSBhdWRpbyBkZXZpY2UgKi8KKwlhcnRzX3N0cmVhbV90IHN0cmVhbTsKKworCS8qIFRoZSBwYXJlbnQgcHJvY2VzcyBpZCwgdG8gZGV0ZWN0IHdoZW4gYXBwbGljYXRpb24gcXVpdHMgKi8KKwlwaWRfdCBwYXJlbnQ7CisKKwkvKiBSYXcgbWl4aW5nIGJ1ZmZlciAqLworCVVpbnQ4ICptaXhidWY7CisJaW50ICAgIG1peGxlbjsKKworCS8qIFN1cHBvcnQgZm9yIGF1ZGlvIHRpbWluZyB1c2luZyBhIHRpbWVyLCBpbiBhZGRpdGlvbiB0byBzZWxlY3QoKSAqLworCWZsb2F0IGZyYW1lX3RpY2tzOworCWZsb2F0IG5leHRfZnJhbWU7Cit9OworI2RlZmluZSBGVURHRV9USUNLUwkxMAkvKiBUaGUgc2NoZWR1bGVyIG92ZXJoZWFkIHRpY2tzIHBlciBmcmFtZSAqLworCisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgc3RyZWFtCQkJKHRoaXMtPmhpZGRlbi0+c3RyZWFtKQorI2RlZmluZSBwYXJlbnQJCQkodGhpcy0+aGlkZGVuLT5wYXJlbnQpCisjZGVmaW5lIG1peGJ1ZgkJCSh0aGlzLT5oaWRkZW4tPm1peGJ1ZikKKyNkZWZpbmUgbWl4bGVuCQkJKHRoaXMtPmhpZGRlbi0+bWl4bGVuKQorI2RlZmluZSBmcmFtZV90aWNrcwkJKHRoaXMtPmhpZGRlbi0+ZnJhbWVfdGlja3MpCisjZGVmaW5lIG5leHRfZnJhbWUJCSh0aGlzLT5oaWRkZW4tPm5leHRfZnJhbWUpCisKKyNlbmRpZiAvKiBfU0RMX2FydHNjYXVkaW9faCAqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2JhdWRpby9TRExfYmVhdWRpby5jYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vYmF1ZGlvL1NETF9iZWF1ZGlvLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjM1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2JhdWRpby9TRExfYmVhdWRpby5jYwpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFsbG93IGFjY2VzcyB0byB0aGUgYXVkaW8gc3RyZWFtIG9uIEJlT1MgKi8KKworI2luY2x1ZGUgPFNvdW5kUGxheWVyLmg+CisKKyNpbmNsdWRlICIuLi8uLi9tYWluL2Jlb3MvU0RMX0JlQXBwLmgiCisKK2V4dGVybiAiQyIgeworCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKyNpbmNsdWRlICIuLi8uLi90aHJlYWQvYmVvcy9TRExfc3lzdGhyZWFkX2MuaCIKKyNpbmNsdWRlICJTRExfYmVhdWRpby5oIgorCisKKy8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgQkVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIEJFX1dhaXRBdWRpbyhfVEhJUyk7CitzdGF0aWMgdm9pZCBCRV9QbGF5QXVkaW8oX1RISVMpOworc3RhdGljIFVpbnQ4ICpCRV9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBCRV9DbG9zZUF1ZGlvKF9USElTKTsKKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKmRldmljZTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggZGV2aWNlICkgeworCQkJU0RMX2ZyZWUoZGV2aWNlKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5PcGVuQXVkaW8gPSBCRV9PcGVuQXVkaW87CisJZGV2aWNlLT5XYWl0QXVkaW8gPSBCRV9XYWl0QXVkaW87CisJZGV2aWNlLT5QbGF5QXVkaW8gPSBCRV9QbGF5QXVkaW87CisJZGV2aWNlLT5HZXRBdWRpb0J1ZiA9IEJFX0dldEF1ZGlvQnVmOworCWRldmljZS0+Q2xvc2VBdWRpbyA9IEJFX0Nsb3NlQXVkaW87CisKKwlkZXZpY2UtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitBdWRpb0Jvb3RTdHJhcCBCQVVESU9fYm9vdHN0cmFwID0geworCSJiYXVkaW8iLCAiQmVPUyBCU291bmRQbGF5ZXIiLAorCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCit9OworCisvKiBUaGUgQmVPUyBjYWxsYmFjayBmb3IgaGFuZGxpbmcgdGhlIGF1ZGlvIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgRmlsbFNvdW5kKHZvaWQgKmRldmljZSwgdm9pZCAqc3RyZWFtLCBzaXplX3QgbGVuLCAKKwkJCQkJY29uc3QgbWVkaWFfcmF3X2F1ZGlvX2Zvcm1hdCAmZm9ybWF0KQoreworCVNETF9BdWRpb0RldmljZSAqYXVkaW8gPSAoU0RMX0F1ZGlvRGV2aWNlICopZGV2aWNlOworCisJLyogU2lsZW5jZSB0aGUgYnVmZmVyLCBzaW5jZSBpdCdzIG91cnMgKi8KKwlTRExfbWVtc2V0KHN0cmVhbSwgYXVkaW8tPnNwZWMuc2lsZW5jZSwgbGVuKTsKKworCS8qIE9ubHkgZG8gc29lbXRoaW5nIGlmIGF1ZGlvIGlzIGVuYWJsZWQgKi8KKwlpZiAoICEgYXVkaW8tPmVuYWJsZWQgKQorCQlyZXR1cm47CisKKwlpZiAoICEgYXVkaW8tPnBhdXNlZCApIHsKKwkJaWYgKCBhdWRpby0+Y29udmVydC5uZWVkZWQgKSB7CisJCQlTRExfbXV0ZXhQKGF1ZGlvLT5taXhlcl9sb2NrKTsKKwkJCSgqYXVkaW8tPnNwZWMuY2FsbGJhY2spKGF1ZGlvLT5zcGVjLnVzZXJkYXRhLAorCQkJCShVaW50OCAqKWF1ZGlvLT5jb252ZXJ0LmJ1ZixhdWRpby0+Y29udmVydC5sZW4pOworCQkJU0RMX211dGV4VihhdWRpby0+bWl4ZXJfbG9jayk7CisJCQlTRExfQ29udmVydEF1ZGlvKCZhdWRpby0+Y29udmVydCk7CisJCQlTRExfbWVtY3B5KHN0cmVhbSxhdWRpby0+Y29udmVydC5idWYsYXVkaW8tPmNvbnZlcnQubGVuX2N2dCk7CisJCX0gZWxzZSB7CisJCQlTRExfbXV0ZXhQKGF1ZGlvLT5taXhlcl9sb2NrKTsKKwkJCSgqYXVkaW8tPnNwZWMuY2FsbGJhY2spKGF1ZGlvLT5zcGVjLnVzZXJkYXRhLAorCQkJCQkJKFVpbnQ4ICopc3RyZWFtLCBsZW4pOworCQkJU0RMX211dGV4VihhdWRpby0+bWl4ZXJfbG9jayk7CisJCX0KKwl9CisJcmV0dXJuOworfQorCisvKiBEdW1teSBmdW5jdGlvbnMgLS0gd2UgZG9uJ3QgdXNlIHRocmVhZC1iYXNlZCBhdWRpbyAqLwordm9pZCBCRV9XYWl0QXVkaW8oX1RISVMpCit7CisJcmV0dXJuOworfQordm9pZCBCRV9QbGF5QXVkaW8oX1RISVMpCit7CisJcmV0dXJuOworfQorVWludDggKkJFX0dldEF1ZGlvQnVmKF9USElTKQoreworCXJldHVybihOVUxMKTsKK30KKwordm9pZCBCRV9DbG9zZUF1ZGlvKF9USElTKQoreworCWlmICggYXVkaW9fb2JqICkgeworCQlhdWRpb19vYmotPlN0b3AoKTsKKwkJZGVsZXRlIGF1ZGlvX29iajsKKwkJYXVkaW9fb2JqID0gTlVMTDsKKwl9CisKKwkvKiBRdWl0IHRoZSBCZSBBcHBsaWNhdGlvbiwgaWYgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gKi8KKwlTRExfUXVpdEJlQXBwKCk7Cit9CisKK2ludCBCRV9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisgICAgaW50IHZhbGlkX2RhdGF0eXBlID0gMDsKKyAgICBtZWRpYV9yYXdfYXVkaW9fZm9ybWF0IGZvcm1hdDsKKyAgICBVaW50MTYgdGVzdF9mb3JtYXQgPSBTRExfRmlyc3RBdWRpb0Zvcm1hdChzcGVjLT5mb3JtYXQpOworCisgICAgLyogUGFyc2UgdGhlIGF1ZGlvIGZvcm1hdCBhbmQgZmlsbCB0aGUgQmUgcmF3IGF1ZGlvIGZvcm1hdCAqLworICAgIG1lbXNldCgmZm9ybWF0LCAnXDAnLCBzaXplb2YgKG1lZGlhX3Jhd19hdWRpb19mb3JtYXQpKTsKKyAgICBmb3JtYXQuYnl0ZV9vcmRlciA9IEJfTUVESUFfTElUVExFX0VORElBTjsKKyAgICBmb3JtYXQuZnJhbWVfcmF0ZSA9IChmbG9hdCkgc3BlYy0+ZnJlcTsKKyAgICBmb3JtYXQuY2hhbm5lbF9jb3VudCA9IHNwZWMtPmNoYW5uZWxzOyAgLyogISEhIEZJWE1FOiBzdXBwb3J0ID4gMj8gKi8KKyAgICB3aGlsZSAoKCF2YWxpZF9kYXRhdHlwZSkgJiYgKHRlc3RfZm9ybWF0KSkgeworICAgICAgICB2YWxpZF9kYXRhdHlwZSA9IDE7CisgICAgICAgIHNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OworICAgICAgICBzd2l0Y2ggKHRlc3RfZm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIEFVRElPX1M4OgorICAgICAgICAgICAgICAgIGZvcm1hdC5mb3JtYXQgPSBtZWRpYV9yYXdfYXVkaW9fZm9ybWF0OjpCX0FVRElPX0NIQVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQVVESU9fVTg6CisgICAgICAgICAgICAgICAgZm9ybWF0LmZvcm1hdCA9IG1lZGlhX3Jhd19hdWRpb19mb3JtYXQ6OkJfQVVESU9fVUNIQVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQVVESU9fUzE2TFNCOgorICAgICAgICAgICAgICAgIGZvcm1hdC5mb3JtYXQgPSBtZWRpYV9yYXdfYXVkaW9fZm9ybWF0OjpCX0FVRElPX1NIT1JUOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFVRElPX1MxNk1TQjoKKyAgICAgICAgICAgICAgICBmb3JtYXQuZm9ybWF0ID0gbWVkaWFfcmF3X2F1ZGlvX2Zvcm1hdDo6Ql9BVURJT19TSE9SVDsKKyAgICAgICAgICAgICAgICBmb3JtYXQuYnl0ZV9vcmRlciA9IEJfTUVESUFfQklHX0VORElBTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB2YWxpZF9kYXRhdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgdGVzdF9mb3JtYXQgPSBTRExfTmV4dEF1ZGlvRm9ybWF0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXZhbGlkX2RhdGF0eXBlKSB7IC8qIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBqdXN0IGluIGNhc2UuLi4gKi8KKyAgICAgICAgU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgQmUgQXBwbGljYXRpb24sIGlmIGl0J3Mgbm90IGFscmVhZHkgc3RhcnRlZCAqLworICAgIGlmIChTRExfSW5pdEJlQXBwKCkgPCAwKSB7CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIGZvcm1hdC5idWZmZXJfc2l6ZSA9IHNwZWMtPnNhbXBsZXM7CisKKwkvKiBDYWxjdWxhdGUgdGhlIGZpbmFsIHBhcmFtZXRlcnMgZm9yIHRoaXMgYXVkaW8gc3BlY2lmaWNhdGlvbiAqLworCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisKKwkvKiBTdWJzY3JpYmUgdG8gdGhlIGF1ZGlvIHN0cmVhbSAoY3JlYXRlcyBhIG5ldyB0aHJlYWQpICovCisJeyBzaWdzZXRfdCBvbWFzazsKKwkJU0RMX01hc2tTaWduYWxzKCZvbWFzayk7CisJCWF1ZGlvX29iaiA9IG5ldyBCU291bmRQbGF5ZXIoJmZvcm1hdCwgIlNETCBBdWRpbyIsIEZpbGxTb3VuZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIF90aGlzKTsKKwkJU0RMX1VubWFza1NpZ25hbHMoJm9tYXNrKTsKKwl9CisJaWYgKCBhdWRpb19vYmotPlN0YXJ0KCkgPT0gQl9OT19FUlJPUiApIHsKKwkJYXVkaW9fb2JqLT5TZXRIYXNEYXRhKHRydWUpOworCX0gZWxzZSB7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIHN0YXJ0IEJlIGF1ZGlvIik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogV2UncmUgcnVubmluZyEgKi8KKwlyZXR1cm4oMSk7Cit9CisKK307CS8qIEV4dGVybiBDICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2JhdWRpby9TRExfYmVhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9iYXVkaW8vU0RMX2JlYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGFmMWRlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9iYXVkaW8vU0RMX2JlYXVkaW8uaApAQCAtMCwwICsxLDM5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2xvd2F1ZGlvX2gKKyNkZWZpbmUgX1NETF9sb3dhdWRpb19oCisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqX3RoaXMKKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwlCU291bmRQbGF5ZXIgKmF1ZGlvX29iajsKK307CisKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBhdWRpb19vYmoJKF90aGlzLT5oaWRkZW4tPmF1ZGlvX29iaikKKworI2VuZGlmIC8qIF9TRExfbG93YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9ic2QvU0RMX2JzZGF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2JzZC9TRExfYnNkYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWUwZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9ic2QvU0RMX2JzZGF1ZGlvLmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICogRHJpdmVyIGZvciBuYXRpdmUgT3BlbkJTRC9OZXRCU0QgYXVkaW8oNCkuCisgKiB2ZWRnZUB2ZWRnZS5jb20uYXIuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2F1ZGlvaW8uaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb21lbS5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvZGV2X2MuaCIKKyNpbmNsdWRlICJTRExfYnNkYXVkaW8uaCIKKworLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgTmV0QlNEL09wZW5CU0QgYXVkaW8gKi8KKyNpZmRlZiBfX05ldEJTRF9fCisjZGVmaW5lIEJTRF9BVURJT19EUklWRVJfTkFNRSAgICAgICAgICJuZXRic2QiCisjZGVmaW5lIEJTRF9BVURJT19EUklWRVJfREVTQyAgICAgICAgICJOYXRpdmUgTmV0QlNEIGF1ZGlvIgorI2Vsc2UKKyNkZWZpbmUgQlNEX0FVRElPX0RSSVZFUl9OQU1FICAgICAgICAgIm9wZW5ic2QiCisjZGVmaW5lIEJTRF9BVURJT19EUklWRVJfREVTQyAgICAgICAgICJOYXRpdmUgT3BlbkJTRCBhdWRpbyIKKyNlbmRpZgorCisvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLCBhbmQgZG9uJ3QgYmxvY2sgaWYgYnVzeSAqLworLyogI2RlZmluZSBVU0VfQkxPQ0tJTkdfV1JJVEVTICovCisKKy8qIFVzZSB0aW1lciBmb3Igc3luY2hyb25pemF0aW9uICovCisvKiAjZGVmaW5lIFVTRV9USU1FUl9TWU5DICovCisKKy8qICNkZWZpbmUgREVCVUdfQVVESU8gKi8KKy8qICNkZWZpbmUgREVCVUdfQVVESU9fU1RSRUFNICovCisKKyNpZmRlZiBVU0VfQkxPQ0tJTkdfV1JJVEVTCisjZGVmaW5lIE9QRU5fRkxBR1MJT19XUk9OTFkKKyNlbHNlCisjZGVmaW5lIE9QRU5fRkxBR1MJKE9fV1JPTkxZfE9fTk9OQkxPQ0spCisjZW5kaWYKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgT0JTRF9XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIGludCBPQlNEX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7CitzdGF0aWMgdm9pZCBPQlNEX1BsYXlBdWRpbyhfVEhJUyk7CitzdGF0aWMgVWludDggKk9CU0RfR2V0QXVkaW9CdWYoX1RISVMpOworc3RhdGljIHZvaWQgT0JTRF9DbG9zZUF1ZGlvKF9USElTKTsKKworI2lmZGVmIERFQlVHX0FVRElPCitzdGF0aWMgdm9pZCBPQlNEX1N0YXR1cyhfVEhJUyk7CisjZW5kaWYKKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludAorQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisgICAgaW50IGZkOworICAgIGludCBhdmFpbGFibGU7CisKKyAgICBhdmFpbGFibGUgPSAwOworICAgIGZkID0gU0RMX09wZW5BdWRpb1BhdGgoTlVMTCwgMCwgT1BFTl9GTEFHUywgMCk7CisgICAgaWYoZmQgPj0gMCkgeworCWF2YWlsYWJsZSA9IDE7CisJY2xvc2UoZmQpOworICAgIH0KKyAgICByZXR1cm4oYXZhaWxhYmxlKTsKK30KKworc3RhdGljIHZvaWQKK0F1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKyAgICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisgICAgU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZQorKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisgICAgU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKyAgICB0aGlzID0gKFNETF9BdWRpb0RldmljZSopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisgICAgaWYodGhpcykgeworCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOworCXRoaXMtPmhpZGRlbiA9CisJICAgIChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEqKVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisgICAgfQorICAgIGlmKCh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkpIHsKKwlTRExfT3V0T2ZNZW1vcnkoKTsKKwlpZih0aGlzKSBTRExfZnJlZSh0aGlzKTsKKwlyZXR1cm4oMCk7CisgICAgfQorICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKyAgICBhdWRpb19mZCA9IC0xOworCisgICAgLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIHRoaXMtPk9wZW5BdWRpbyA9IE9CU0RfT3BlbkF1ZGlvOworICAgIHRoaXMtPldhaXRBdWRpbyA9IE9CU0RfV2FpdEF1ZGlvOworICAgIHRoaXMtPlBsYXlBdWRpbyA9IE9CU0RfUGxheUF1ZGlvOworICAgIHRoaXMtPkdldEF1ZGlvQnVmID0gT0JTRF9HZXRBdWRpb0J1ZjsKKyAgICB0aGlzLT5DbG9zZUF1ZGlvID0gT0JTRF9DbG9zZUF1ZGlvOworCisgICAgdGhpcy0+ZnJlZSA9IEF1ZGlvX0RlbGV0ZURldmljZTsKKyAgICAKKyAgICByZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgQlNEX0FVRElPX2Jvb3RzdHJhcCA9IHsKKwlCU0RfQVVESU9fRFJJVkVSX05BTUUsIEJTRF9BVURJT19EUklWRVJfREVTQywKKwlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCitzdGF0aWMgdm9pZAorT0JTRF9XYWl0QXVkaW8oX1RISVMpCit7CisjaWZuZGVmIFVTRV9CTE9DS0lOR19XUklURVMgLyogTm90IG5lY2Vzc2FyeSB3aGVuIHVzaW5nIGJsb2NraW5nIHdyaXRlcyAqLworCS8qIFNlZSBpZiB3ZSBuZWVkIHRvIHVzZSB0aW1lZCBhdWRpbyBzeW5jaHJvbml6YXRpb24gKi8KKwlpZiAoIGZyYW1lX3RpY2tzICkgeworCQkvKiBVc2UgdGltZXIgZm9yIGdlbmVyYWwgYXVkaW8gc3luY2hyb25pemF0aW9uICovCisJCVNpbnQzMiB0aWNrczsKKworCQl0aWNrcyA9ICgoU2ludDMyKShuZXh0X2ZyYW1lIC0gU0RMX0dldFRpY2tzKCkpKS1GVURHRV9USUNLUzsKKwkJaWYgKCB0aWNrcyA+IDAgKSB7CisJCQlTRExfRGVsYXkodGlja3MpOworCQl9CisJfSBlbHNlIHsKKwkJLyogVXNlIHNlbGVjdCgpIGZvciBhdWRpbyBzeW5jaHJvbml6YXRpb24gKi8KKwkJZmRfc2V0IGZkc2V0OworCQlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworCisJCUZEX1pFUk8oJmZkc2V0KTsKKwkJRkRfU0VUKGF1ZGlvX2ZkLCAmZmRzZXQpOworCQl0aW1lb3V0LnR2X3NlYyA9IDEwOworCQl0aW1lb3V0LnR2X3VzZWMgPSAwOworI2lmZGVmIERFQlVHX0FVRElPCisJCWZwcmludGYoc3RkZXJyLCAiV2FpdGluZyBmb3IgYXVkaW8gdG8gZ2V0IHJlYWR5XG4iKTsKKyNlbmRpZgorCQlpZiAoIHNlbGVjdChhdWRpb19mZCsxLCBOVUxMLCAmZmRzZXQsIE5VTEwsICZ0aW1lb3V0KSA8PSAwICkgeworCQkJY29uc3QgY2hhciAqbWVzc2FnZSA9CisJCQkiQXVkaW8gdGltZW91dCAtIGJ1Z2d5IGF1ZGlvIGRyaXZlcj8gKGRpc2FibGVkKSI7CisJCQkvKiBJbiBnZW5lcmFsIHdlIHNob3VsZCBuZXZlciBwcmludCB0byB0aGUgc2NyZWVuLAorCQkJICAgYnV0IGluIHRoaXMgY2FzZSB3ZSBoYXZlIG5vIG90aGVyIHdheSBvZiBsZXR0aW5nCisJCQkgICB0aGUgdXNlciBrbm93IHdoYXQgaGFwcGVuZWQuCisJCQkqLworCQkJZnByaW50ZihzdGRlcnIsICJTREw6ICVzXG4iLCBtZXNzYWdlKTsKKwkJCXRoaXMtPmVuYWJsZWQgPSAwOworCQkJLyogRG9uJ3QgdHJ5IHRvIGNsb3NlIC0gbWF5IGhhbmcgKi8KKwkJCWF1ZGlvX2ZkID0gLTE7CisjaWZkZWYgREVCVUdfQVVESU8KKwkJCWZwcmludGYoc3RkZXJyLCAiRG9uZSBkaXNhYmxpbmcgYXVkaW9cbiIpOworI2VuZGlmCisJCX0KKyNpZmRlZiBERUJVR19BVURJTworCQlmcHJpbnRmKHN0ZGVyciwgIlJlYWR5IVxuIik7CisjZW5kaWYKKwl9CisjZW5kaWYgLyogIVVTRV9CTE9DS0lOR19XUklURVMgKi8KK30KKworc3RhdGljIHZvaWQKK09CU0RfUGxheUF1ZGlvKF9USElTKQoreworCWludCB3cml0dGVuLCBwPTA7CisKKwkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSwgY2hlY2tpbmcgZm9yIEVBR0FJTiBvbiBicm9rZW4gYXVkaW8gZHJpdmVycyAqLworCWRvIHsKKwkJd3JpdHRlbiA9IHdyaXRlKGF1ZGlvX2ZkLCAmbWl4YnVmW3BdLCBtaXhsZW4tcCk7CisJCWlmICh3cml0dGVuPjApCisJCSAgIHAgKz0gd3JpdHRlbjsKKwkJaWYgKHdyaXR0ZW4gPT0gLTEgJiYgZXJybm8gIT0gMCAmJiBlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRUlOVFIpCisJCXsKKwkJICAgLyogTm9uIHJlY292ZXJhYmxlIGVycm9yIGhhcyBvY2N1cnJlZC4gSXQgc2hvdWxkIGJlIHJlcG9ydGVkISEhICovCisJCSAgIHBlcnJvcigiYXVkaW8iKTsKKwkJICAgYnJlYWs7CisJCX0KKworCQlpZiAoIHAgPCB3cml0dGVuIHx8ICgod3JpdHRlbiA8IDApICYmICgoZXJybm8gPT0gMCkgfHwgKGVycm5vID09IEVBR0FJTikpKSApIHsKKwkJCVNETF9EZWxheSgxKTsJLyogTGV0IGEgbGl0dGxlIENQVSB0aW1lIGdvIGJ5ICovCisJCX0KKwl9IHdoaWxlICggcCA8IHdyaXR0ZW4gKTsKKworCS8qIElmIHRpbWVyIHN5bmNocm9uaXphdGlvbiBpcyBlbmFibGVkLCBzZXQgdGhlIG5leHQgd3JpdGUgZnJhbWUgKi8KKwlpZiAoIGZyYW1lX3RpY2tzICkgeworCQluZXh0X2ZyYW1lICs9IGZyYW1lX3RpY2tzOworCX0KKworCS8qIElmIHdlIGNvdWxkbid0IHdyaXRlLCBhc3N1bWUgZmF0YWwgZXJyb3IgZm9yIG5vdyAqLworCWlmICggd3JpdHRlbiA8IDAgKSB7CisJCXRoaXMtPmVuYWJsZWQgPSAwOworCX0KKyNpZmRlZiBERUJVR19BVURJTworCWZwcmludGYoc3RkZXJyLCAiV3JvdGUgJWQgYnl0ZXMgb2YgYXVkaW8gZGF0YVxuIiwgd3JpdHRlbik7CisjZW5kaWYKK30KKworc3RhdGljIFVpbnQ4CisqT0JTRF9HZXRBdWRpb0J1ZihfVEhJUykKK3sKKyAgICByZXR1cm4obWl4YnVmKTsKK30KKworc3RhdGljIHZvaWQKK09CU0RfQ2xvc2VBdWRpbyhfVEhJUykKK3sKKyAgICBpZihtaXhidWYgIT0gTlVMTCkgeworCVNETF9GcmVlQXVkaW9NZW0obWl4YnVmKTsKKwltaXhidWYgPSBOVUxMOworICAgIH0KKyAgICBpZihhdWRpb19mZCA+PSAwKSB7CisJY2xvc2UoYXVkaW9fZmQpOworCWF1ZGlvX2ZkID0gLTE7CisgICAgfQorfQorCisjaWZkZWYgREVCVUdfQVVESU8KK3ZvaWQKK09CU0RfU3RhdHVzKF9USElTKQoreworICAgIGF1ZGlvX2luZm9fdCBpbmZvOworCisgICAgaWYoaW9jdGwoYXVkaW9fZmQsIEFVRElPX0dFVElORk8sICZpbmZvKSA8IDApIHsKKwlmcHJpbnRmKHN0ZGVyciwiQVVESU9fR0VUSU5GTyBmYWlsZWQuXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgZnByaW50ZihzdGRlcnIsIlxuIgorIltwbGF5L3JlY29yZCBpbmZvXVxuIgorImJ1ZmZlciBzaXplCTogICAlZCBieXRlc1xuIgorInNhbXBsZSByYXRlCTogICAlaSBIelxuIgorImNoYW5uZWxzCTogICAlaVxuIgorInByZWNpc2lvbgk6ICAgJWktYml0XG4iCisiZW5jb2RpbmcJOiAgIDB4JXhcbiIKKyJzZWVrCQk6ICAgJWlcbiIKKyJzYW1wbGUgY291bnQJOiAgICVpXG4iCisiRU9GIGNvdW50CTogICAlaVxuIgorInBhdXNlZAkJOiAgICVzXG4iCisiZXJyb3Igb2NjdXJlZAk6ICAgJXNcbiIKKyJ3YWl0aW5nCQk6ICAgJXNcbiIKKyJhY3RpdmUJCTogICAlc1xuIgorIiIsCisgICAgaW5mby5wbGF5LmJ1ZmZlcl9zaXplLAorICAgIGluZm8ucGxheS5zYW1wbGVfcmF0ZSwKKyAgICBpbmZvLnBsYXkuY2hhbm5lbHMsCisgICAgaW5mby5wbGF5LnByZWNpc2lvbiwKKyAgICBpbmZvLnBsYXkuZW5jb2RpbmcsCisgICAgaW5mby5wbGF5LnNlZWssCisgICAgaW5mby5wbGF5LnNhbXBsZXMsCisgICAgaW5mby5wbGF5LmVvZiwKKyAgICBpbmZvLnBsYXkucGF1c2UgPyAieWVzIiA6ICJubyIsCisgICAgaW5mby5wbGF5LmVycm9yID8gInllcyIgOiAibm8iLAorICAgIGluZm8ucGxheS53YWl0aW5nID8gInllcyIgOiAibm8iLAorICAgIGluZm8ucGxheS5hY3RpdmUgPyAieWVzIjogIm5vIik7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4iCisiW2F1ZGlvIGluZm9dXG4iCisibW9uaXRvcl9nYWluCTogICAlaVxuIgorImh3IGJsb2NrIHNpemUJOiAgICVkIGJ5dGVzXG4iCisiaGkgd2F0ZXJtYXJrCTogICAlaVxuIgorImxvIHdhdGVybWFyawk6ICAgJWlcbiIKKyJhdWRpbyBtb2RlCTogICAlc1xuIgorIiIsICAKKyAgICBpbmZvLm1vbml0b3JfZ2FpbiwKKyAgICBpbmZvLmJsb2Nrc2l6ZSwKKyAgICBpbmZvLmhpd2F0LCBpbmZvLmxvd2F0LAorICAgIChpbmZvLm1vZGUgPT0gQVVNT0RFX1BMQVkpID8gIlBMQVkiCisgICAgOiAoaW5mby5tb2RlID0gQVVNT0RFX1JFQ09SRCkgPyAiUkVDT1JEIgorICAgIDogKGluZm8ubW9kZSA9PSBBVU1PREVfUExBWV9BTEwgPyAiUExBWV9BTEwiCisgICAgOiAiPyIpKTsKK30KKyNlbmRpZiAvKiBERUJVR19BVURJTyAqLworCitzdGF0aWMgaW50CitPQlNEX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKyAgICBjaGFyIGF1ZGlvZGV2WzY0XTsKKyAgICBVaW50MTYgZm9ybWF0OworICAgIGF1ZGlvX2luZm9fdCBpbmZvOworCisgICAgQVVESU9fSU5JVElORk8oJmluZm8pOworICAgIAorICAgIC8qIENhbGN1bGF0ZSB0aGUgZmluYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBhdWRpbyBzcGVjaWZpY2F0aW9uICovCisgICAgU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKworI2lmZGVmIFVTRV9USU1FUl9TWU5DCisgICAgZnJhbWVfdGlja3MgPSAwLjA7CisjZW5kaWYKKworICAgIC8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLworICAgIGF1ZGlvX2ZkID0gU0RMX09wZW5BdWRpb1BhdGgoYXVkaW9kZXYsIHNpemVvZihhdWRpb2RldiksIE9QRU5fRkxBR1MsIDApOworICAgIGlmKGF1ZGlvX2ZkIDwgMCkgeworCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiAlczogJXMiLCBhdWRpb2Rldiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICAKKyAgICAvKiBTZXQgdG8gcGxheSBtb2RlICovCisgICAgaW5mby5tb2RlID0gQVVNT0RFX1BMQVk7CisgICAgaWYoaW9jdGwoYXVkaW9fZmQsIEFVRElPX1NFVElORk8sICZpbmZvKSA8IDApIHsKKwlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHB1dCBkZXZpY2UgaW50byBwbGF5IG1vZGUiKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICAKKyAgICBtaXhidWYgPSBOVUxMOworICAgIEFVRElPX0lOSVRJTkZPKCZpbmZvKTsKKyAgICBmb3IgKGZvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7IAorICAgIAlmb3JtYXQ7IGZvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKSkKKyAgICB7CisJc3dpdGNoKGZvcm1hdCkgeworCWNhc2UgQVVESU9fVTg6CisJICAgIGluZm8ucGxheS5lbmNvZGluZyA9IEFVRElPX0VOQ09ESU5HX1VMSU5FQVI7CisJICAgIGluZm8ucGxheS5wcmVjaXNpb24gPSA4OworCSAgICBicmVhazsKKwljYXNlIEFVRElPX1M4OgorCSAgICBpbmZvLnBsYXkuZW5jb2RpbmcgPSBBVURJT19FTkNPRElOR19TTElORUFSOworCSAgICBpbmZvLnBsYXkucHJlY2lzaW9uID0gODsKKwkgICAgYnJlYWs7CisJY2FzZSBBVURJT19TMTZMU0I6CisJICAgIGluZm8ucGxheS5lbmNvZGluZyA9IEFVRElPX0VOQ09ESU5HX1NMSU5FQVJfTEU7CisJICAgIGluZm8ucGxheS5wcmVjaXNpb24gPSAxNjsKKwkgICAgYnJlYWs7CisJY2FzZSBBVURJT19TMTZNU0I6CisJICAgIGluZm8ucGxheS5lbmNvZGluZyA9IEFVRElPX0VOQ09ESU5HX1NMSU5FQVJfQkU7CisJICAgIGluZm8ucGxheS5wcmVjaXNpb24gPSAxNjsKKwkgICAgYnJlYWs7CisJY2FzZSBBVURJT19VMTZMU0I6CisJICAgIGluZm8ucGxheS5lbmNvZGluZyA9IEFVRElPX0VOQ09ESU5HX1VMSU5FQVJfTEU7CisJICAgIGluZm8ucGxheS5wcmVjaXNpb24gPSAxNjsKKwkgICAgYnJlYWs7CisJY2FzZSBBVURJT19VMTZNU0I6CisJICAgIGluZm8ucGxheS5lbmNvZGluZyA9IEFVRElPX0VOQ09ESU5HX1VMSU5FQVJfQkU7CisJICAgIGluZm8ucGxheS5wcmVjaXNpb24gPSAxNjsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgY29udGludWU7CisJfQorCWlmIChpb2N0bChhdWRpb19mZCwgQVVESU9fU0VUSU5GTywgJmluZm8pID09IDApCisJICAgIGJyZWFrOworICAgIH0KKworICAgIGlmKCFmb3JtYXQpIHsKKwlTRExfU2V0RXJyb3IoIk5vIHN1cHBvcnRlZCBlbmNvZGluZyBmb3IgMHgleCIsIHNwZWMtPmZvcm1hdCk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBzcGVjLT5mb3JtYXQgPSBmb3JtYXQ7CisKKyAgICBBVURJT19JTklUSU5GTygmaW5mbyk7CisgICAgaW5mby5wbGF5LmNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7CisgICAgaWYgKGlvY3RsKGF1ZGlvX2ZkLCBBVURJT19TRVRJTkZPLCAmaW5mbykgPT0gLTEpCisgICAgCXNwZWMtPmNoYW5uZWxzID0gMTsKKyAgICBBVURJT19JTklUSU5GTygmaW5mbyk7CisgICAgaW5mby5wbGF5LnNhbXBsZV9yYXRlID0gc3BlYy0+ZnJlcTsKKyAgICBpbmZvLmJsb2Nrc2l6ZSA9IHNwZWMtPnNpemU7CisgICAgaW5mby5oaXdhdCA9IDU7CisgICAgaW5mby5sb3dhdCA9IDM7CisgICAgKHZvaWQpaW9jdGwoYXVkaW9fZmQsIEFVRElPX1NFVElORk8sICZpbmZvKTsKKyAgICAodm9pZClpb2N0bChhdWRpb19mZCwgQVVESU9fR0VUSU5GTywgJmluZm8pOworICAgIHNwZWMtPmZyZXEgID0gaW5mby5wbGF5LnNhbXBsZV9yYXRlOworICAgIC8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KKyAgICBtaXhsZW4gPSBzcGVjLT5zaXplOworICAgIG1peGJ1ZiA9IChVaW50OCopU0RMX0FsbG9jQXVkaW9NZW0obWl4bGVuKTsKKyAgICBpZihtaXhidWYgPT0gTlVMTCkgeworCXJldHVybigtMSk7CisgICAgfQorICAgIFNETF9tZW1zZXQobWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKKyAgICAKKyAgICAvKiBHZXQgdGhlIHBhcmVudCBwcm9jZXNzIGlkICh3ZSdyZSB0aGUgcGFyZW50IG9mIHRoZSBhdWRpbyB0aHJlYWQpICovCisgICAgcGFyZW50ID0gZ2V0cGlkKCk7CisKKyNpZmRlZiBERUJVR19BVURJTworICAgIE9CU0RfU3RhdHVzKHRoaXMpOworI2VuZGlmCisKKyAgICAvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KKyAgICByZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2JzZC9TRExfYnNkYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vYnNkL1NETF9ic2RhdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZjY5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2JzZC9TRExfYnNkYXVkaW8uaApAQCAtMCwwICsxLDU4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX29wZW5ic2RhdWRpb19oCisjZGVmaW5lIF9TRExfb3BlbmJzZGF1ZGlvX2gKKworI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgorCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcworCitzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEKK3sKKyAgICAvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCisgICAgaW50IGF1ZGlvX2ZkOworCisgICAgLyogVGhlIHBhcmVudCBwcm9jZXNzIGlkLCB0byBkZXRlY3Qgd2hlbiBhcHBsaWNhdGlvbiBxdWl0cyAqLworICAgIHBpZF90IHBhcmVudDsKKworICAgIC8qIFJhdyBtaXhpbmcgYnVmZmVyICovCisgICAgVWludDggKm1peGJ1ZjsKKyAgICBpbnQgICAgbWl4bGVuOworCisgICAgLyogU3VwcG9ydCBmb3IgYXVkaW8gdGltaW5nIHVzaW5nIGEgdGltZXIsIGluIGFkZGl0aW9uIHRvIHNlbGVjdCgpICovCisgICAgZmxvYXQgZnJhbWVfdGlja3M7CisgICAgZmxvYXQgbmV4dF9mcmFtZTsKK307CisKKyNkZWZpbmUgRlVER0VfVElDS1MJMTAJLyogVGhlIHNjaGVkdWxlciBvdmVyaGVhZCB0aWNrcyBwZXIgZnJhbWUgKi8KKworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIGF1ZGlvX2ZkCQkodGhpcy0+aGlkZGVuLT5hdWRpb19mZCkKKyNkZWZpbmUgcGFyZW50CQkJKHRoaXMtPmhpZGRlbi0+cGFyZW50KQorI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCisjZGVmaW5lIG1peGxlbgkJCSh0aGlzLT5oaWRkZW4tPm1peGxlbikKKyNkZWZpbmUgZnJhbWVfdGlja3MJCSh0aGlzLT5oaWRkZW4tPmZyYW1lX3RpY2tzKQorI2RlZmluZSBuZXh0X2ZyYW1lCQkodGhpcy0+aGlkZGVuLT5uZXh0X2ZyYW1lKQorCisjZW5kaWYgLyogX1NETF9vcGVuYnNkYXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kYXJ0L1NETF9kYXJ0LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2RhcnQvU0RMX2RhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U1MzBkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kYXJ0L1NETF9kYXJ0LmMKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLworCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICJTRExfZGFydC5oIgorCisvLyBCdWZmZXIgc3RhdGVzOgorI2RlZmluZSBCVUZGRVJfRU1QVFkgICAgICAgMAorI2RlZmluZSBCVUZGRVJfVVNFRCAgICAgICAgMQorCit0eXBlZGVmIHN0cnVjdCBfdE1peEJ1ZmZlckRlc2MgeworICBpbnQgICAgICAgICAgICAgIGlCdWZmZXJVc2FnZTsgICAgICAvLyBCVUZGRVJfRU1QVFkgb3IgQlVGRkVSX1VTRUQKKyAgU0RMX0F1ZGlvRGV2aWNlICpwU0RMQXVkaW9EZXZpY2U7Cit9IHRNaXhCdWZmZXJEZXNjLCAqcE1peEJ1ZmZlckRlc2M7CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERBUlRFdmVudEZ1bmMKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBEQVJULCB3aGVuIGFuIGV2ZW50IG9jY3VyZXMsIGxpa2UgZW5kIG9mIAorLy8gcGxheWJhY2sgb2YgYSBidWZmZXIsIGV0Yy4uLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xPTkcgQVBJRU5UUlkgREFSVEV2ZW50RnVuYyhVTE9ORyB1bFN0YXR1cywKKwkJCSAgICBQTUNJX01JWF9CVUZGRVIgcEJ1ZmZlciwKKwkJCSAgICBVTE9ORyB1bEZsYWdzKQoreworICBpZiAodWxGbGFncyAmJiBNSVhfV1JJVEVfQ09NUExFVEUpCisgIHsgLy8gUGxheWJhY2sgb2YgYnVmZmVyIGNvbXBsZXRlZCEKKworICAgIC8vIEdldCBwb2ludGVyIHRvIGJ1ZmZlciBkZXNjcmlwdGlvbgorICAgIHBNaXhCdWZmZXJEZXNjIHBCdWZEZXNjOworCisgICAgaWYgKHBCdWZmZXIpCisgICAgeworICAgICAgcEJ1ZkRlc2MgPSAocE1peEJ1ZmZlckRlc2MpICgqcEJ1ZmZlcikudWxVc2VyUGFybTsKKworICAgICAgaWYgKHBCdWZEZXNjKQorICAgICAgeworICAgICAgICBTRExfQXVkaW9EZXZpY2UgKnBTRExBdWRpb0RldmljZSA9IHBCdWZEZXNjLT5wU0RMQXVkaW9EZXZpY2U7CisgICAgICAgIC8vIFNldCB0aGUgYnVmZmVyIHRvIGJlIGVtcHR5CisgICAgICAgIHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgPSBCVUZGRVJfRU1QVFk7CisgICAgICAgIC8vIEFuZCBub3RpZnkgREFSVCBmZWVkZXIgdGhyZWFkIHRoYXQgaXQgd2lsbCBoYXZlIHRvIHdvcmsgYSBiaXQuCisgICAgICAgIGlmIChwU0RMQXVkaW9EZXZpY2UpCisgICAgICAgIERvc1Bvc3RFdmVudFNlbShwU0RMQXVkaW9EZXZpY2UtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitpbnQgREFSVF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisgIFVpbnQxNiB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7CisgIGludCB2YWxpZF9kYXRhdHlwZSA9IDA7CisgIE1DSV9BTVBfT1BFTl9QQVJNUyBBbXBPcGVuUGFybXM7CisgIE1DSV9HRU5FUklDX1BBUk1TIEdlbmVyaWNQYXJtczsKKyAgaW50IGlEZXZpY2VPcmQgPSAwOyAvLyBEZWZhdWx0IGRldmljZSB0byBiZSB1c2VkCisgIGludCBiT3BlblNoYXJlZCA9IDE7IC8vIFRyeSBvcGVuaW5nIGl0IHNoYXJlZAorICBpbnQgaUJpdHMgPSAxNjsgLy8gRGVmYXVsdCBpcyAxNiBiaXRzIHNpZ25lZAorICBpbnQgaUZyZXEgPSA0NDEwMDsgLy8gRGVmYXVsdCBpcyA0NEtIegorICBpbnQgaUNoYW5uZWxzID0gMjsgLy8gRGVmYXVsdCBpcyAyIGNoYW5uZWxzIChTdGVyZW8pCisgIGludCBpTnVtQnVmcyA9IDI7ICAvLyBOdW1iZXIgb2YgYXVkaW8gYnVmZmVyczogMgorICBpbnQgaUJ1ZlNpemU7CisgIGludCBpT3Blbk1vZGU7CisgIGludCBpU2lsZW5jZTsKKyAgaW50IHJjOworCisgIC8vIEZpcnN0IHRoaW5nIGlzIHRvIHRyeSB0byBvcGVuIGEgZ2l2ZW4gREFSVCBkZXZpY2UhCisgIFNETF9tZW1zZXQoJkFtcE9wZW5QYXJtcywgMCwgc2l6ZW9mKE1DSV9BTVBfT1BFTl9QQVJNUykpOworICAvLyBwc3pEZXZpY2VUeXBlIHNob3VsZCBjb250YWluIHRoZSBkZXZpY2UgdHlwZSBpbiBsb3cgd29yZCwgYW5kIGRldmljZSBvcmRpbmFsIGluIGhpZ2ggd29yZCEKKyAgQW1wT3BlblBhcm1zLnBzekRldmljZVR5cGUgPSAoUFNaKSAoTUNJX0RFVlRZUEVfQVVESU9fQU1QTUlYIHwgKGlEZXZpY2VPcmQgPDwgMTYpKTsKKworICBpT3Blbk1vZGUgPSBNQ0lfV0FJVCB8IE1DSV9PUEVOX1RZUEVfSUQ7CisgIGlmIChiT3BlblNoYXJlZCkgaU9wZW5Nb2RlIHw9IE1DSV9PUEVOX1NIQVJFQUJMRTsKKworICByYyA9IG1jaVNlbmRDb21tYW5kKCAwLCBNQ0lfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgaU9wZW5Nb2RlLAorCQkgICAgICAgKFBWT0lEKSAmQW1wT3BlblBhcm1zLCAwKTsKKyAgaWYgKHJjIT1NQ0lFUlJfU1VDQ0VTUykgLy8gTm8gYXVkaW8gYXZhaWxhYmxlPz8KKyAgICByZXR1cm4gKC0xKTsKKyAgLy8gU2F2ZSB0aGUgZGV2aWNlIElEIHdlIGdvdCBmcm9tIERBUlQhCisgIC8vIFdlIHdpbGwgdXNlIHRoaXMgaW4gdGhlIG5leHQgY2FsbHMhCisgIGlEZXZpY2VPcmQgPSBBbXBPcGVuUGFybXMudXNEZXZpY2VJRDsKKworICAvLyBEZXRlcm1pbmUgdGhlIGF1ZGlvIHBhcmFtZXRlcnMgZnJvbSB0aGUgQXVkaW9TcGVjCisgIGlmIChzcGVjLT5jaGFubmVscyA+IDIpCisgICAgc3BlYy0+Y2hhbm5lbHMgPSAyOyAgLy8gISEhIEZJWE1FOiBtb3JlIHRoYW4gc3RlcmVvIHN1cHBvcnQgaW4gT1MvMj8KKworICB3aGlsZSAoKCF2YWxpZF9kYXRhdHlwZSkgJiYgKHRlc3RfZm9ybWF0KSkgeworICAgIHNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OworICAgIHZhbGlkX2RhdGF0eXBlID0gMTsKKyAgICBzd2l0Y2ggKHRlc3RfZm9ybWF0KSB7CisgICAgICBjYXNlIEFVRElPX1U4OgorICAgICAgICAvLyBVbnNpZ25lZCA4IGJpdCBhdWRpbyBkYXRhCisgICAgICAgIGlTaWxlbmNlID0gMHg4MDsKKyAgICAgICAgaUJpdHMgPSA4OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBBVURJT19TMTZMU0I6CisgICAgICAgIC8vIFNpZ25lZCAxNiBiaXQgYXVkaW8gZGF0YQorICAgICAgICBpU2lsZW5jZSA9IDB4MDA7CisgICAgICAgIGlCaXRzID0gMTY7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB2YWxpZF9kYXRhdHlwZSA9IDA7CisgICAgICAgIHRlc3RfZm9ybWF0ID0gU0RMX05leHRBdWRpb0Zvcm1hdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIXZhbGlkX2RhdGF0eXBlKSB7IC8vIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBqdXN0IGluIGNhc2UuLi4KKyAgICAvLyBDbG9zZSBEQVJULCBhbmQgZXhpdCB3aXRoIGVycm9yIGNvZGUhCisgICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7CisgICAgU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKKyAgICByZXR1cm4gKC0xKTsKKyAgfQorCisgIGlGcmVxID0gc3BlYy0+ZnJlcTsKKyAgaUNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7CisgIC8qIFVwZGF0ZSB0aGUgZnJhZ21lbnQgc2l6ZSBhcyBzaXplIGluIGJ5dGVzICovCisgIFNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisgIGlCdWZTaXplID0gc3BlYy0+c2l6ZTsKKworICAvLyBOb3cgcXVlcnkgdGhpcyBkZXZpY2UgaWYgaXQgc3VwcG9ydHMgdGhlIGdpdmVuIGZyZXEvYml0cy9jaGFubmVscyEKKyAgU0RMX21lbXNldCgmKF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMpLCAwLCBzaXplb2YoTUNJX01JWFNFVFVQX1BBUk1TKSk7CisgIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMudWxCaXRzUGVyU2FtcGxlID0gaUJpdHM7CisgIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMudWxGb3JtYXRUYWcgPSBNQ0lfV0FWRV9GT1JNQVRfUENNOworICBfdGhpcy0+aGlkZGVuLT5NaXhTZXR1cFBhcm1zLnVsU2FtcGxlc1BlclNlYyA9IGlGcmVxOworICBfdGhpcy0+aGlkZGVuLT5NaXhTZXR1cFBhcm1zLnVsQ2hhbm5lbHMgPSBpQ2hhbm5lbHM7CisgIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMudWxGb3JtYXRNb2RlID0gTUNJX1BMQVk7CisgIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMudWxEZXZpY2VUeXBlID0gTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU87CisgIF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMucG1peEV2ZW50ID0gREFSVEV2ZW50RnVuYzsKKyAgcmMgPSBtY2lTZW5kQ29tbWFuZCAoaURldmljZU9yZCwgTUNJX01JWFNFVFVQLAorICAgICAgICAgICAgICAgICAgICAgICBNQ0lfV0FJVCB8IE1DSV9NSVhTRVRVUF9RVUVSWU1PREUsCisgICAgICAgICAgICAgICAgICAgICAgICYoX3RoaXMtPmhpZGRlbi0+TWl4U2V0dXBQYXJtcyksIDApOworICBpZiAocmMhPU1DSUVSUl9TVUNDRVNTKQorICB7IC8vIFRoZSBkZXZpY2UgY2Fubm90IGhhbmRsZSB0aGlzIGZvcm1hdCEKKyAgICAvLyBDbG9zZSBEQVJULCBhbmQgZXhpdCB3aXRoIGVycm9yIGNvZGUhCisgICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7CisgICAgU0RMX1NldEVycm9yKCJBdWRpbyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHJlcXVlc3RlZCBhdWRpbyBmb3JtYXQiKTsKKyAgICByZXR1cm4oLTEpOworICB9CisgIC8vIFRoZSBkZXZpY2UgY2FuIGhhbmRsZSB0aGlzIGZvcm1hdCwgc28gaW5pdGlhbGl6ZSEKKyAgcmMgPSBtY2lTZW5kQ29tbWFuZChpRGV2aWNlT3JkLCBNQ0lfTUlYU0VUVVAsCisgICAgICAgICAgICAgICAgICAgICAgTUNJX1dBSVQgfCBNQ0lfTUlYU0VUVVBfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAmKF90aGlzLT5oaWRkZW4tPk1peFNldHVwUGFybXMpLCAwKTsKKyAgaWYgKHJjIT1NQ0lFUlJfU1VDQ0VTUykKKyAgeyAvLyBUaGUgZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQhCisgICAgLy8gQ2xvc2UgREFSVCwgYW5kIGV4aXQgd2l0aCBlcnJvciBjb2RlIQorICAgIG1jaVNlbmRDb21tYW5kKGlEZXZpY2VPcmQsIE1DSV9DTE9TRSwgTUNJX1dBSVQsICZHZW5lcmljUGFybXMsIDApOworICAgIFNETF9TZXRFcnJvcigiQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBzZXQgdXAiKTsKKyAgICByZXR1cm4oLTEpOworICB9CisgIC8vIE9rLCB0aGUgZGV2aWNlIGlzIGluaXRpYWxpemVkLgorICAvLyBOb3cgd2Ugc2hvdWxkIGFsbG9jYXRlIGJ1ZmZlcnMuIEZvciB0aGlzLCB3ZSBuZWVkIGEgcGxhY2Ugd2hlcmUKKyAgLy8gdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyB3aWxsIGJlOgorICBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycyA9IChNQ0lfTUlYX0JVRkZFUiAqKSBTRExfbWFsbG9jKHNpemVvZihNQ0lfTUlYX0JVRkZFUikqaU51bUJ1ZnMpOworICBpZiAoIShfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycykpCisgIHsgLy8gTm90IGVub3VnaCBtZW1vcnkhCisgICAgLy8gQ2xvc2UgREFSVCwgYW5kIGV4aXQgd2l0aCBlcnJvciBjb2RlIQorICAgIG1jaVNlbmRDb21tYW5kKGlEZXZpY2VPcmQsIE1DSV9DTE9TRSwgTUNJX1dBSVQsICZHZW5lcmljUGFybXMsIDApOworICAgIFNETF9TZXRFcnJvcigiTm90IGVub3VnaCBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlciBkZXNjcmlwdG9ycyIpOworICAgIHJldHVybigtMSk7CisgIH0KKyAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgcGxhY2UgZm9yIGJ1ZmZlciBsaXN0LCB3ZSBjYW4gYXNrIERBUlQgZm9yIHRoZQorICAvLyBidWZmZXJzIQorICBfdGhpcy0+aGlkZGVuLT5CdWZmZXJQYXJtcy51bE51bUJ1ZmZlcnMgPSBpTnVtQnVmczsgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnVmZmVycworICBfdGhpcy0+aGlkZGVuLT5CdWZmZXJQYXJtcy51bEJ1ZmZlclNpemUgPSBpQnVmU2l6ZTsgICAgICAgICAgICAgICAvLyBlYWNoIHdpdGggdGhpcyBzaXplCisgIF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zLnBCdWZMaXN0ID0gX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnM7IC8vIGdldHRpbmcgZGVzY3JpcHRvcnRzIGludG8gdGhpcyBsaXN0CisgIC8vIEFsbG9jYXRlIGJ1ZmZlcnMhCisgIHJjID0gbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICBNQ0lfV0FJVCB8IE1DSV9BTExPQ0FURV9NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgJihfdGhpcy0+aGlkZGVuLT5CdWZmZXJQYXJtcyksIDApOworICBpZiAoKHJjIT1NQ0lFUlJfU1VDQ0VTUykgfHwgKGlOdW1CdWZzICE9IF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zLnVsTnVtQnVmZmVycykgfHwgKF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zLnVsQnVmZmVyU2l6ZT09MCkpCisgIHsgLy8gQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSEKKyAgICAvLyBDbG9zZSBEQVJULCBhbmQgZXhpdCB3aXRoIGVycm9yIGNvZGUhCisgICAgU0RMX2ZyZWUoX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnMpOyBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycyA9IE5VTEw7CisgICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7CisgICAgU0RMX1NldEVycm9yKCJEQVJUIGNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXJzIik7CisgICAgcmV0dXJuKC0xKTsKKyAgfQorICAvLyBPaywgd2UgaGF2ZSBhbGwgdGhlIGJ1ZmZlcnMgYWxsb2NhdGVkLCBsZXQncyBtYXJrIHRoZW0hCisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgaTxpTnVtQnVmczsgaSsrKQorICAgIHsKKyAgICAgIHBNaXhCdWZmZXJEZXNjIHBCdWZmZXJEZXNjID0gKHBNaXhCdWZmZXJEZXNjKSBTRExfbWFsbG9jKHNpemVvZih0TWl4QnVmZmVyRGVzYykpOzsKKyAgICAgIC8vIENoZWNrIGlmIHRoaXMgYnVmZmVyIHdhcyByZWFsbHkgYWxsb2NhdGVkIGJ5IERBUlQKKyAgICAgIGlmICgoIShfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVyc1tpXS5wQnVmZmVyKSkgfHwgKCFwQnVmZmVyRGVzYykpCisgICAgICB7IC8vIFdyb25nIGJ1ZmZlciEKKyAgICAgICAgLy8gQ2xvc2UgREFSVCwgYW5kIGV4aXQgd2l0aCBlcnJvciBjb2RlIQorICAgICAgICAvLyBGcmVlIGJ1ZmZlciBkZXNjcmlwdGlvbnMKKyAgICAgICAgeyBpbnQgajsKKyAgICAgICAgICBmb3IgKGo9MDsgajxpOyBqKyspIFNETF9mcmVlKCh2b2lkICopKF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2pdLnVsVXNlclBhcm0pKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhbmQgY2xlYW51cAorICAgICAgICBtY2lTZW5kQ29tbWFuZChpRGV2aWNlT3JkLCBNQ0lfQlVGRkVSLCBNQ0lfV0FJVCB8IE1DSV9ERUFMTE9DQVRFX01FTU9SWSwgJihfdGhpcy0+aGlkZGVuLT5CdWZmZXJQYXJtcyksIDApOworICAgICAgICBTRExfZnJlZShfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycyk7IF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzID0gTlVMTDsKKyAgICAgICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7CisgICAgICAgIFNETF9TZXRFcnJvcigiRXJyb3IgYXQgaW50ZXJuYWwgYnVmZmVyIGNoZWNrIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgICB9CisgICAgICBwQnVmZmVyRGVzYy0+aUJ1ZmZlclVzYWdlID0gQlVGRkVSX0VNUFRZOworICAgICAgcEJ1ZmZlckRlc2MtPnBTRExBdWRpb0RldmljZSA9IF90aGlzOworCisgICAgICBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVyc1tpXS51bEJ1ZmZlckxlbmd0aCA9IF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zLnVsQnVmZmVyU2l6ZTsKKyAgICAgIF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2ldLnVsVXNlclBhcm0gPSAoVUxPTkcpIHBCdWZmZXJEZXNjOyAvLyBVc2VyIHBhcmFtZXRlcjogRGVzY3JpcHRpb24gb2YgYnVmZmVyCisgICAgICBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVyc1tpXS51bEZsYWdzID0gMDsgLy8gU29tZSBzdHVmZiBzaG91bGQgYmUgZmxhZ2dlZCBoZXJlIGZvciBEQVJULCBsaWtlIGVuZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyBkYXRhLCBidXQgYXMgd2Ugd2lsbCBjb250aW5vdXNseSBzZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIGRhdGEsIHRoZXJlIHdpbGwgYmUgbm8gZW5kLjopCisgICAgICBTRExfbWVtc2V0KF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2ldLnBCdWZmZXIsIGlTaWxlbmNlLCBpQnVmU2l6ZSk7CisgICAgfQorICB9CisgIF90aGlzLT5oaWRkZW4tPmlOZXh0RnJlZUJ1ZmZlciA9IDA7CisgIF90aGlzLT5oaWRkZW4tPmlMYXN0UGxheWVkQnVmID0gLTE7CisgIC8vIENyZWF0ZSBldmVudCBzZW1hcGhvcmUKKyAgaWYgKERvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICYoX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQpLCAwLCBGQUxTRSkhPU5PX0VSUk9SKQorICB7CisgICAgLy8gQ291bGQgbm90IGNyZWF0ZSBldmVudCBzZW1hcGhvcmUhCisgICAgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGk9MDsgaTxpTnVtQnVmczsgaSsrKSBTRExfZnJlZSgodm9pZCAqKShfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVyc1tpXS51bFVzZXJQYXJtKSk7CisgICAgfQorICAgIG1jaVNlbmRDb21tYW5kKGlEZXZpY2VPcmQsIE1DSV9CVUZGRVIsIE1DSV9XQUlUIHwgTUNJX0RFQUxMT0NBVEVfTUVNT1JZLCAmKF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zKSwgMCk7CisgICAgU0RMX2ZyZWUoX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnMpOyBfdGhpcy0+aGlkZGVuLT5wTWl4QnVmZmVycyA9IE5VTEw7CisgICAgbWNpU2VuZENvbW1hbmQoaURldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJkdlbmVyaWNQYXJtcywgMCk7CisgICAgU0RMX1NldEVycm9yKCJDb3VsZCBub3QgY3JlYXRlIGV2ZW50IHNlbWFwaG9yZSIpOworICAgIHJldHVybigtMSk7CisgIH0KKworICAvLyBTdG9yZSB0aGUgbmV3IHNldHRpbmdzIGluIGdsb2JhbCB2YXJpYWJsZXMKKyAgX3RoaXMtPmhpZGRlbi0+aUN1cnJEZXZpY2VPcmQgPSBpRGV2aWNlT3JkOworICBfdGhpcy0+aGlkZGVuLT5pQ3VyckZyZXEgPSBpRnJlcTsKKyAgX3RoaXMtPmhpZGRlbi0+aUN1cnJCaXRzID0gaUJpdHM7CisgIF90aGlzLT5oaWRkZW4tPmlDdXJyQ2hhbm5lbHMgPSBpQ2hhbm5lbHM7CisgIF90aGlzLT5oaWRkZW4tPmlDdXJyTnVtQnVmcyA9IGlOdW1CdWZzOworICBfdGhpcy0+aGlkZGVuLT5pQ3VyckJ1ZlNpemUgPSBpQnVmU2l6ZTsKKworICByZXR1cm4gKDApOworfQorCisKKwordm9pZCBEQVJUX1RocmVhZEluaXQoX1RISVMpCit7CisgIHJldHVybjsKK30KKworLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCit2b2lkIERBUlRfV2FpdEF1ZGlvKF9USElTKQoreworICBpbnQgaTsKKyAgcE1peEJ1ZmZlckRlc2MgcEJ1ZkRlc2M7CisgIFVMT05HIHVsUG9zdENvdW50OworCisgIERvc1Jlc2V0RXZlbnRTZW0oX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQsICZ1bFBvc3RDb3VudCk7CisgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gZW1wdHkgYnVmZmVyLCB0aGVuIHJldHVybiBub3chCisgIGZvciAoaT0wOyBpPF90aGlzLT5oaWRkZW4tPmlDdXJyTnVtQnVmczsgaSsrKQorICB7CisgICAgcEJ1ZkRlc2MgPSAocE1peEJ1ZmZlckRlc2MpIF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2ldLnVsVXNlclBhcm07CisgICAgaWYgKHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgPT0gQlVGRkVSX0VNUFRZKQorICAgICAgcmV0dXJuOworICB9CisgIC8vIElmIHRoZXJlIGlzIG5vIGVtcHR5IGJ1ZmZlciwgd2FpdCBmb3Igb25lIHRvIGJlIGVtcHR5IQorICBEb3NXYWl0RXZlbnRTZW0oX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQsIDEwMDApOyAvLyBXYWl0IG1heCAxIHNlYyEhISBJbXBvcnRhbnQhCisgIHJldHVybjsKK30KKwordm9pZCBEQVJUX1BsYXlBdWRpbyhfVEhJUykKK3sKKyAgaW50IGlGcmVlQnVmID0gX3RoaXMtPmhpZGRlbi0+aU5leHRGcmVlQnVmZmVyOworICBwTWl4QnVmZmVyRGVzYyBwQnVmRGVzYzsKKworICBwQnVmRGVzYyA9IChwTWl4QnVmZmVyRGVzYykgX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnNbaUZyZWVCdWZdLnVsVXNlclBhcm07CisgIHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgPSBCVUZGRVJfVVNFRDsKKyAgLy8gU2VuZCBpdCB0byBEQVJUIHRvIGJlIHF1ZXVlZAorICBfdGhpcy0+aGlkZGVuLT5NaXhTZXR1cFBhcm1zLnBtaXhXcml0ZShfdGhpcy0+aGlkZGVuLT5NaXhTZXR1cFBhcm1zLnVsTWl4SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnNbaUZyZWVCdWZdKSwgMSk7CisKKyAgX3RoaXMtPmhpZGRlbi0+aUxhc3RQbGF5ZWRCdWYgPSBpRnJlZUJ1ZjsKKyAgaUZyZWVCdWYgPSAoaUZyZWVCdWYrMSkgJSBfdGhpcy0+aGlkZGVuLT5pQ3Vyck51bUJ1ZnM7CisgIF90aGlzLT5oaWRkZW4tPmlOZXh0RnJlZUJ1ZmZlciA9IGlGcmVlQnVmOworfQorCitVaW50OCAqREFSVF9HZXRBdWRpb0J1ZihfVEhJUykKK3sKKyAgaW50IGlGcmVlQnVmOworICBVaW50OCAqcFJlc3VsdDsKKyAgcE1peEJ1ZmZlckRlc2MgcEJ1ZkRlc2M7CisKKyAgaWYgKF90aGlzKQorICB7CisgICAgaWYgKF90aGlzLT5oaWRkZW4pCisgICAgeworICAgICAgaUZyZWVCdWYgPSBfdGhpcy0+aGlkZGVuLT5pTmV4dEZyZWVCdWZmZXI7CisgICAgICBwQnVmRGVzYyA9IChwTWl4QnVmZmVyRGVzYykgX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnNbaUZyZWVCdWZdLnVsVXNlclBhcm07CisgICAgICAKKyAgICAgIGlmIChwQnVmRGVzYykKKyAgICAgIHsKKyAgICAgICAgaWYgKHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgPT0gQlVGRkVSX0VNUFRZKQorICAgICAgICB7CisgICAgICAgICAgcFJlc3VsdCA9IF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW2lGcmVlQnVmXS5wQnVmZmVyOworICAgICAgICAgIHJldHVybiBwUmVzdWx0OyAKKyAgICAgICAgfQorICAgICAgfSBlbHNlCisgICAgICAgIHByaW50ZigiW0RBUlRfR2V0QXVkaW9CdWZdIDogRVJST1IhIHBCdWZEZXNjID0gJXBcbiIsIHBCdWZEZXNjKTsKKyAgICB9IGVsc2UKKyAgICAgIHByaW50ZigiW0RBUlRfR2V0QXVkaW9CdWZdIDogRVJST1IhIF90aGlzLT5oaWRkZW4gPSAlcFxuIiwgX3RoaXMtPmhpZGRlbik7CisgIH0gZWxzZQorICAgIHByaW50ZigiW0RBUlRfR2V0QXVkaW9CdWZdIDogRVJST1IhIF90aGlzID0gJXBcbiIsIF90aGlzKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgREFSVF9XYWl0RG9uZShfVEhJUykKK3sKKyAgcE1peEJ1ZmZlckRlc2MgcEJ1ZkRlc2M7CisgIFVMT05HIHVsUG9zdENvdW50OworICBBUElSRVQgcmM7CisKKyAgcEJ1ZkRlc2MgPSAocE1peEJ1ZmZlckRlc2MpIF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzW190aGlzLT5oaWRkZW4tPmlMYXN0UGxheWVkQnVmXS51bFVzZXJQYXJtOworICByYyA9IE5PX0VSUk9SOworICB3aGlsZSAoKHBCdWZEZXNjLT5pQnVmZmVyVXNhZ2UgIT0gQlVGRkVSX0VNUFRZKSAmJiAocmM9PU5PX0VSUk9SKSkKKyAgeworICAgIERvc1Jlc2V0RXZlbnRTZW0oX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQsICZ1bFBvc3RDb3VudCk7CisgICAgcmMgPSBEb3NXYWl0RXZlbnRTZW0oX3RoaXMtPmhpZGRlbi0+aGV2QXVkaW9CdWZmZXJQbGF5ZWQsIDEwMDApOyAvLyAxIHNlYyB0aW1lb3V0ISBJbXBvcnRhbnQhCisgIH0KK30KKwordm9pZCBEQVJUX0Nsb3NlQXVkaW8oX1RISVMpCit7CisgIE1DSV9HRU5FUklDX1BBUk1TIEdlbmVyaWNQYXJtczsKKyAgaW50IHJjOworCisgIC8vIFN0b3AgREFSVCBwbGF5YmFjaworICByYyA9IG1jaVNlbmRDb21tYW5kKF90aGlzLT5oaWRkZW4tPmlDdXJyRGV2aWNlT3JkLCBNQ0lfU1RPUCwgTUNJX1dBSVQsICZHZW5lcmljUGFybXMsIDApOworICBpZiAocmMhPU1DSUVSUl9TVUNDRVNTKQorICB7CisjaWZkZWYgU0ZYX0RFQlVHX0JVSUxECisgICAgcHJpbnRmKCJDb3VsZCBub3Qgc3RvcCBEQVJUIHBsYXliYWNrIVxuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgfQorCisgIC8vIENsb3NlIGV2ZW50IHNlbWFwaG9yZQorICBEb3NDbG9zZUV2ZW50U2VtKF90aGlzLT5oaWRkZW4tPmhldkF1ZGlvQnVmZmVyUGxheWVkKTsKKworICAvLyBGcmVlIG1lbW9yeSBvZiBidWZmZXIgZGVzY3JpcHRpb25zCisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgaTxfdGhpcy0+aGlkZGVuLT5pQ3Vyck51bUJ1ZnM7IGkrKykgU0RMX2ZyZWUoKHZvaWQgKikoX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnNbaV0udWxVc2VyUGFybSkpOworICB9CisKKyAgLy8gRGVhbGxvY2F0ZSBidWZmZXJzCisgIHJjID0gbWNpU2VuZENvbW1hbmQoX3RoaXMtPmhpZGRlbi0+aUN1cnJEZXZpY2VPcmQsIE1DSV9CVUZGRVIsIE1DSV9XQUlUIHwgTUNJX0RFQUxMT0NBVEVfTUVNT1JZLCAmKF90aGlzLT5oaWRkZW4tPkJ1ZmZlclBhcm1zKSwgMCk7CisKKyAgLy8gRnJlZSBidWZmZXJsaXN0CisgIFNETF9mcmVlKF90aGlzLT5oaWRkZW4tPnBNaXhCdWZmZXJzKTsgX3RoaXMtPmhpZGRlbi0+cE1peEJ1ZmZlcnMgPSBOVUxMOworCisgIC8vIENsb3NlIGRhcnQKKyAgcmMgPSBtY2lTZW5kQ29tbWFuZChfdGhpcy0+aGlkZGVuLT5pQ3VyckRldmljZU9yZCwgTUNJX0NMT1NFLCBNQ0lfV0FJVCwgJihHZW5lcmljUGFybXMpLCAwKTsKK30KKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQoreworICByZXR1cm4oMSk7Cit9CisKK3ZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQoreworICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisgIFNETF9mcmVlKGRldmljZSk7Cit9CisKK1NETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKyAgU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisgIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisgIHRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisgIGlmICggdGhpcyApCisgIHsKKyAgICBTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKyAgICB0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCisgICAgICBTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworICB9CisgIGlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApCisgIHsKKyAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICBpZiAoIHRoaXMgKQorICAgICAgU0RMX2ZyZWUodGhpcyk7CisgICAgcmV0dXJuKDApOworICB9CisgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKworICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgIHRoaXMtPk9wZW5BdWRpbyA9IERBUlRfT3BlbkF1ZGlvOworICB0aGlzLT5UaHJlYWRJbml0ID0gREFSVF9UaHJlYWRJbml0OworICB0aGlzLT5XYWl0QXVkaW8gPSBEQVJUX1dhaXRBdWRpbzsKKyAgdGhpcy0+UGxheUF1ZGlvID0gREFSVF9QbGF5QXVkaW87CisgIHRoaXMtPkdldEF1ZGlvQnVmID0gREFSVF9HZXRBdWRpb0J1ZjsKKyAgdGhpcy0+V2FpdERvbmUgPSBEQVJUX1dhaXREb25lOworICB0aGlzLT5DbG9zZUF1ZGlvID0gREFSVF9DbG9zZUF1ZGlvOworCisgIHRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7CisKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIERBUlRfYm9vdHN0cmFwID0geworCSJkYXJ0IiwgIk9TLzIgRGlyZWN0IEF1ZGlvIFJvdVRpbmVzIChEQVJUKSIsCisJQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKK307CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZGFydC9TRExfZGFydC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kYXJ0L1NETF9kYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjMjdiZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZGFydC9TRExfZGFydC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfbG93YXVkaW9faAorI2RlZmluZSBfU0RMX2xvd2F1ZGlvX2gKKworI2RlZmluZSBJTkNMX1RZUEVTCisjZGVmaW5lIElOQ0xfRE9TU0VNQVBIT1JFUworI2RlZmluZSBJTkNMX0RPU1JFU09VUkNFUworI2RlZmluZSBJTkNMX0RPU01JU0MKKyNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKKworI2RlZmluZSBJTkNMX09TMk1NCisjZGVmaW5lIElOQ0xfTU1JT09TMgorI2RlZmluZSBJTkNMX01DSU9TMgorI2luY2x1ZGUgPG9zMi5oPgorI2luY2x1ZGUgPG9zMm1lLmg+ICAgICAvLyBEQVJUIHN0dWZmIGFuZCBNTUlPIHN0dWZmCisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgYXVkaW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqX3RoaXMKKworLyogVGhlIERpcmVjdFNvdW5kIG9iamVjdHMgKi8KK3N0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YQoreworICBpbnQgaUN1cnJEZXZpY2VPcmQ7CisgIGludCBpQ3VyckZyZXE7CisgIGludCBpQ3VyckJpdHM7CisgIGludCBpQ3VyckNoYW5uZWxzOworICBpbnQgaUN1cnJOdW1CdWZzOworICBpbnQgaUN1cnJCdWZTaXplOworCisgIGludCBpTGFzdFBsYXllZEJ1ZjsKKyAgaW50IGlOZXh0RnJlZUJ1ZmZlcjsKKworICBNQ0lfQlVGRkVSX1BBUk1TIEJ1ZmZlclBhcm1zOyAgICAgLy8gU291bmQgYnVmZmVyIHBhcmFtZXRlcnMKKyAgTUNJX01JWF9CVUZGRVIgKnBNaXhCdWZmZXJzOyAgICAgIC8vIFNvdW5kIGJ1ZmZlcnMKKyAgTUNJX01JWFNFVFVQX1BBUk1TIE1peFNldHVwUGFybXM7IC8vIE1peGVyIHNldHVwIHBhcmFtZXRlcnMKKyAgSEVWIGhldkF1ZGlvQnVmZmVyUGxheWVkOyAgICAgICAgIC8vIEV2ZW50IHNlbWFwaG9yZSB0byBpbmRpY2F0ZSB0aGF0IGFuIGF1ZGlvIGJ1ZmZlciBoYXMgYmVlbiBwbGF5ZWQgYnkgREFSVAorfTsKKworI2VuZGlmIC8qIF9TRExfbG93YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kYy9TRExfZGNhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kYy9TRExfZGNhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZGFhODcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2RjL1NETF9kY2F1ZGlvLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIE91dHB1dCBkcmVhbWNhc3QgYWljYSAqLworCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgorI2luY2x1ZGUgIlNETF9kY2F1ZGlvLmgiCisKKyNpbmNsdWRlICJhaWNhLmgiCisjaW5jbHVkZSA8ZGMvc3B1Lmg+CisKKy8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgRENBVURfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIERDQVVEX1dhaXRBdWRpbyhfVEhJUyk7CitzdGF0aWMgdm9pZCBEQ0FVRF9QbGF5QXVkaW8oX1RISVMpOworc3RhdGljIFVpbnQ4ICpEQ0FVRF9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBEQ0FVRF9DbG9zZUF1ZGlvKF9USElTKTsKKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgRENBVURfQXZhaWxhYmxlKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIERDQVVEX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqRENBVURfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisJaWYgKCB0aGlzICkgeworCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJfQorCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggdGhpcyApIHsKKwkJCVNETF9mcmVlKHRoaXMpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IERDQVVEX09wZW5BdWRpbzsKKwl0aGlzLT5XYWl0QXVkaW8gPSBEQ0FVRF9XYWl0QXVkaW87CisJdGhpcy0+UGxheUF1ZGlvID0gRENBVURfUGxheUF1ZGlvOworCXRoaXMtPkdldEF1ZGlvQnVmID0gRENBVURfR2V0QXVkaW9CdWY7CisJdGhpcy0+Q2xvc2VBdWRpbyA9IERDQVVEX0Nsb3NlQXVkaW87CisKKwl0aGlzLT5mcmVlID0gRENBVURfRGVsZXRlRGV2aWNlOworCisJc3B1X2luaXQoKTsKKworCXJldHVybiB0aGlzOworfQorCitBdWRpb0Jvb3RTdHJhcCBEQ0FVRF9ib290c3RyYXAgPSB7CisJImRjYXVkaW8iLCAiRHJlYW1jYXN0IEFJQ0EgYXVkaW8iLAorCURDQVVEX0F2YWlsYWJsZSwgRENBVURfQ3JlYXRlRGV2aWNlCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIERDQVVEX1dhaXRBdWRpbyhfVEhJUykKK3sKKwlpZiAodGhpcy0+aGlkZGVuLT5wbGF5aW5nKSB7CisJCS8qIHdhaXQgKi8KKwkJd2hpbGUoYWljYV9nZXRfcG9zKDApL3RoaXMtPnNwZWMuc2FtcGxlcyA9PSB0aGlzLT5oaWRkZW4tPm5leHRidWYpIHsKKwkJCXRoZF9wYXNzKCk7CisJCX0KKwl9Cit9CisKKyNkZWZpbmUJU1BVX1JBTV9CQVNFCTB4YTA4MDAwMDAKKworc3RhdGljIHZvaWQgc3B1X21lbWxvYWRfc3RlcmVvOChpbnQgbGVmdHBvcyxpbnQgcmlnaHRwb3Msdm9pZCAqc3JjMCxzaXplX3Qgc2l6ZSkKK3sKKwl1aW50OCAqc3JjID0gc3JjMDsKKwl1aW50MzIgKmxlZnQgID0gKHVpbnQzMiopKGxlZnRwb3MgK1NQVV9SQU1fQkFTRSk7CisJdWludDMyICpyaWdodCA9ICh1aW50MzIqKShyaWdodHBvcytTUFVfUkFNX0JBU0UpOworCXNpemUgPSAoc2l6ZSs3KS84OworCXdoaWxlKHNpemUtLSkgeworCQl1bnNpZ25lZCBsdmFsLHJ2YWw7CisJCWx2YWwgPSAqc3JjKys7CisJCXJ2YWwgPSAqc3JjKys7CisJCWx2YWx8PSAoKnNyYysrKTw8ODsKKwkJcnZhbHw9ICgqc3JjKyspPDw4OworCQlsdmFsfD0gKCpzcmMrKyk8PDE2OworCQlydmFsfD0gKCpzcmMrKyk8PDE2OworCQlsdmFsfD0gKCpzcmMrKyk8PDI0OworCQlydmFsfD0gKCpzcmMrKyk8PDI0OworCQlnMl93cml0ZV8zMihsZWZ0KyssbHZhbCk7CisJCWcyX3dyaXRlXzMyKHJpZ2h0KysscnZhbCk7CisJCWcyX2ZpZm9fd2FpdCgpOworCX0KK30KKworc3RhdGljIHZvaWQgc3B1X21lbWxvYWRfc3RlcmVvMTYoaW50IGxlZnRwb3MsaW50IHJpZ2h0cG9zLHZvaWQgKnNyYzAsc2l6ZV90IHNpemUpCit7CisJdWludDE2ICpzcmMgPSBzcmMwOworCXVpbnQzMiAqbGVmdCAgPSAodWludDMyKikobGVmdHBvcyArU1BVX1JBTV9CQVNFKTsKKwl1aW50MzIgKnJpZ2h0ID0gKHVpbnQzMiopKHJpZ2h0cG9zK1NQVV9SQU1fQkFTRSk7CisJc2l6ZSA9IChzaXplKzcpLzg7CisJd2hpbGUoc2l6ZS0tKSB7CisJCXVuc2lnbmVkIGx2YWwscnZhbDsKKwkJbHZhbCA9ICpzcmMrKzsKKwkJcnZhbCA9ICpzcmMrKzsKKwkJbHZhbHw9ICgqc3JjKyspPDwxNjsKKwkJcnZhbHw9ICgqc3JjKyspPDwxNjsKKwkJZzJfd3JpdGVfMzIobGVmdCsrLGx2YWwpOworCQlnMl93cml0ZV8zMihyaWdodCsrLHJ2YWwpOworCQlnMl9maWZvX3dhaXQoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIERDQVVEX1BsYXlBdWRpbyhfVEhJUykKK3sKKwlTRExfQXVkaW9TcGVjICpzcGVjID0gJnRoaXMtPnNwZWM7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCWlmICh0aGlzLT5oaWRkZW4tPnBsYXlpbmcpIHsKKwkJLyogd2FpdCAqLworCQl3aGlsZShhaWNhX2dldF9wb3MoMCkvc3BlYy0+c2FtcGxlcyA9PSB0aGlzLT5oaWRkZW4tPm5leHRidWYpIHsKKwkJCXRoZF9wYXNzKCk7CisJCX0KKwl9CisKKwlvZmZzZXQgPSB0aGlzLT5oaWRkZW4tPm5leHRidWYqc3BlYy0+c2l6ZTsKKwl0aGlzLT5oaWRkZW4tPm5leHRidWZePTE7CisJLyogV3JpdGUgdGhlIGF1ZGlvIGRhdGEsIGNoZWNraW5nIGZvciBFQUdBSU4gb24gYnJva2VuIGF1ZGlvIGRyaXZlcnMgKi8KKwlpZiAoc3BlYy0+Y2hhbm5lbHM9PTEpIHsKKwkJc3B1X21lbWxvYWQodGhpcy0+aGlkZGVuLT5sZWZ0cG9zK29mZnNldCx0aGlzLT5oaWRkZW4tPm1peGJ1Zix0aGlzLT5oaWRkZW4tPm1peGxlbik7CisJfSBlbHNlIHsKKwkJb2Zmc2V0Lz0yOworCQlpZiAoKHRoaXMtPnNwZWMuZm9ybWF0JjI1NSk9PTgpIHsKKwkJCXNwdV9tZW1sb2FkX3N0ZXJlbzgodGhpcy0+aGlkZGVuLT5sZWZ0cG9zK29mZnNldCx0aGlzLT5oaWRkZW4tPnJpZ2h0cG9zK29mZnNldCx0aGlzLT5oaWRkZW4tPm1peGJ1Zix0aGlzLT5oaWRkZW4tPm1peGxlbik7CisJCX0gZWxzZSB7CisJCQlzcHVfbWVtbG9hZF9zdGVyZW8xNih0aGlzLT5oaWRkZW4tPmxlZnRwb3Mrb2Zmc2V0LHRoaXMtPmhpZGRlbi0+cmlnaHRwb3Mrb2Zmc2V0LHRoaXMtPmhpZGRlbi0+bWl4YnVmLHRoaXMtPmhpZGRlbi0+bWl4bGVuKTsKKwkJfQorCX0KKworCWlmICghdGhpcy0+aGlkZGVuLT5wbGF5aW5nKSB7CisJCWludCBtb2RlOworCQl0aGlzLT5oaWRkZW4tPnBsYXlpbmcgPSAxOworCQltb2RlID0gKHNwZWMtPmZvcm1hdD09QVVESU9fUzgpP1NNXzhCSVQ6U01fMTZCSVQ7CisJCWlmIChzcGVjLT5jaGFubmVscz09MSkgeworCQkJYWljYV9wbGF5KDAsbW9kZSx0aGlzLT5oaWRkZW4tPmxlZnRwb3MsMCxzcGVjLT5zYW1wbGVzKjIsc3BlYy0+ZnJlcSwyNTUsMTI4LDEpOworCQl9IGVsc2UgeworCQkJYWljYV9wbGF5KDAsbW9kZSx0aGlzLT5oaWRkZW4tPmxlZnRwb3MgLDAsc3BlYy0+c2FtcGxlcyoyLHNwZWMtPmZyZXEsMjU1LDAsMSk7CisJCQlhaWNhX3BsYXkoMSxtb2RlLHRoaXMtPmhpZGRlbi0+cmlnaHRwb3MsMCxzcGVjLT5zYW1wbGVzKjIsc3BlYy0+ZnJlcSwyNTUsMjU1LDEpOworCQl9CisJfQorfQorCitzdGF0aWMgVWludDggKkRDQVVEX0dldEF1ZGlvQnVmKF9USElTKQoreworCXJldHVybih0aGlzLT5oaWRkZW4tPm1peGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIERDQVVEX0Nsb3NlQXVkaW8oX1RISVMpCit7CisJYWljYV9zdG9wKDApOworCWlmICh0aGlzLT5zcGVjLmNoYW5uZWxzPT0yKSBhaWNhX3N0b3AoMSk7CisJaWYgKCB0aGlzLT5oaWRkZW4tPm1peGJ1ZiAhPSBOVUxMICkgeworCQlTRExfRnJlZUF1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4YnVmKTsKKwkJdGhpcy0+aGlkZGVuLT5taXhidWYgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBEQ0FVRF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisgICAgVWludDE2IHRlc3RfZm9ybWF0ID0gU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoc3BlYy0+Zm9ybWF0KTsKKyAgICBpbnQgdmFsaWRfZGF0YXR5cGUgPSAwOworICAgIHdoaWxlICgoIXZhbGlkX2RhdGF0eXBlKSAmJiAodGVzdF9mb3JtYXQpKSB7CisgICAgICAgIHNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OworICAgICAgICBzd2l0Y2ggKHRlc3RfZm9ybWF0KSB7CisgICAgICAgICAgICAvKiBvbmx5IGZvcm1hdHMgRHJlYW1jYXN0IGFjY2VwdHMuLi4gKi8KKyAgICAgICAgICAgIGNhc2UgQVVESU9fUzg6CisgICAgICAgICAgICBjYXNlIEFVRElPX1MxNkxTQjoKKyAgICAgICAgICAgICAgICB2YWxpZF9kYXRhdHlwZSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGVzdF9mb3JtYXQgPSBTRExfTmV4dEF1ZGlvRm9ybWF0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXZhbGlkX2RhdGF0eXBlKSB7ICAvKiBzaG91bGRuJ3QgaGFwcGVuLCBidXQganVzdCBpbiBjYXNlLi4uICovCisgICAgICAgIFNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0Iik7CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIGlmIChzcGVjLT5jaGFubmVscyA+IDIpCisgICAgICAgIHNwZWMtPmNoYW5uZWxzID0gMjsgIC8qIG5vIG1vcmUgdGhhbiBzdGVyZW8gb24gdGhlIERyZWFtY2FzdC4gKi8KKworCS8qIFVwZGF0ZSB0aGUgZnJhZ21lbnQgc2l6ZSBhcyBzaXplIGluIGJ5dGVzICovCisJU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKworCS8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KKwl0aGlzLT5oaWRkZW4tPm1peGxlbiA9IHNwZWMtPnNpemU7CisJdGhpcy0+aGlkZGVuLT5taXhidWYgPSAoVWludDggKikgU0RMX0FsbG9jQXVkaW9NZW0odGhpcy0+aGlkZGVuLT5taXhsZW4pOworCWlmICggdGhpcy0+aGlkZGVuLT5taXhidWYgPT0gTlVMTCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4tPm1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7CisJdGhpcy0+aGlkZGVuLT5sZWZ0cG9zID0gMHgxMTAwMDsKKwl0aGlzLT5oaWRkZW4tPnJpZ2h0cG9zID0gMHgxMTAwMCtzcGVjLT5zaXplOworCXRoaXMtPmhpZGRlbi0+cGxheWluZyA9IDA7CisJdGhpcy0+aGlkZGVuLT5uZXh0YnVmID0gMDsKKworCS8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZGMvU0RMX2RjYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZGMvU0RMX2RjYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmE5NWIzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kYy9TRExfZGNhdWRpby5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfZGNhdWRpb19oCisjZGVmaW5lIF9TRExfZGNhdWRpb19oCisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcworCitzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgeworCS8qIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBhdWRpbyBkZXZpY2UgKi8KKwlVaW50OCAqbWl4YnVmOworCVVpbnQzMiBtaXhsZW47CisJaW50IHBsYXlpbmc7CisJaW50IGxlZnRwb3MscmlnaHRwb3M7CisJaW50IG5leHRidWY7Cit9OworCisjZW5kaWYgLyogX1NETF9kY2F1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGMvYWljYS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kYy9haWNhLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvYXVkaW8vZGMvYWljYS5jCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2RjL2FpY2EuYwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kYy9haWNhLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2RjL2FpY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzIxZTQyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kYy9haWNhLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX0FJQ0FfSF8KKyNkZWZpbmUgX0FJQ0FfSF8KKworI2RlZmluZQlBSUNBX01FTQkweGEwODAwMDAwCisKKyNkZWZpbmUgU01fOEJJVAkJMQorI2RlZmluZSBTTV8xNkJJVAkwCisjZGVmaW5lIFNNX0FEUENNCTIKKwordm9pZCBhaWNhX3BsYXkoaW50IGNoLGludCBtb2RlLHVuc2lnbmVkIGxvbmcgc21wcHRyLGludCBsb29wdHN0LGludCBsb29wZW5kLGludCBmcmVxLGludCB2b2wsaW50IHBhbixpbnQgbG9vcGZsYWcpOwordm9pZCBhaWNhX3N0b3AoaW50IGNoKTsKK3ZvaWQgYWljYV92b2woaW50IGNoLGludCB2b2wpOwordm9pZCBhaWNhX3BhbihpbnQgY2gsaW50IHBhbik7Cit2b2lkIGFpY2FfZnJlcShpbnQgY2gsaW50IGZyZXEpOworaW50IGFpY2FfZ2V0X3BvcyhpbnQgY2gpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZGlzay9TRExfZGlza2F1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2Rpc2svU0RMX2Rpc2thdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzEwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2Rpc2svU0RMX2Rpc2thdWRpby5jCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisKKyAgICBUaGlzIGZpbGUgd3JpdHRlbiBieSBSeWFuIEMuIEdvcmRvbiAoaWNjdWx1c0BpY2N1bHVzLm9yZykKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBPdXRwdXQgcmF3IGF1ZGlvIGRhdGEgdG8gYSBmaWxlLiAqLworCisjaWYgSEFWRV9TVERJT19ICisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiU0RMX3J3b3BzLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgorI2luY2x1ZGUgIlNETF9kaXNrYXVkaW8uaCIKKworLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgRElTSyBhdWRpbyAqLworI2RlZmluZSBESVNLQVVEX0RSSVZFUl9OQU1FICAgICAgICAgImRpc2siCisKKy8qIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgZGVmYXVsdHMuICovCisjZGVmaW5lIERJU0tFTlZSX09VVEZJTEUgICAgICAgICAiU0RMX0RJU0tBVURJT0ZJTEUiCisjZGVmaW5lIERJU0tERUZBVUxUX09VVEZJTEUgICAgICAic2RsYXVkaW8ucmF3IgorI2RlZmluZSBESVNLRU5WUl9XUklURURFTEFZICAgICAgIlNETF9ESVNLQVVESU9ERUxBWSIKKyNkZWZpbmUgRElTS0RFRkFVTFRfV1JJVEVERUxBWSAgIDE1MAorCisvKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERJU0tBVURfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIERJU0tBVURfV2FpdEF1ZGlvKF9USElTKTsKK3N0YXRpYyB2b2lkIERJU0tBVURfUGxheUF1ZGlvKF9USElTKTsKK3N0YXRpYyBVaW50OCAqRElTS0FVRF9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBESVNLQVVEX0Nsb3NlQXVkaW8oX1RISVMpOworCitzdGF0aWMgY29uc3QgY2hhciAqRElTS0FVRF9HZXRPdXRwdXRGaWxlbmFtZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKmVudnIgPSBTRExfZ2V0ZW52KERJU0tFTlZSX09VVEZJTEUpOworCXJldHVybigoZW52ciAhPSBOVUxMKSA/IGVudnIgOiBESVNLREVGQVVMVF9PVVRGSUxFKTsKK30KKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgRElTS0FVRF9BdmFpbGFibGUodm9pZCkKK3sKKwljb25zdCBjaGFyICplbnZyID0gU0RMX2dldGVudigiU0RMX0FVRElPRFJJVkVSIik7CisJaWYgKGVudnIgJiYgKFNETF9zdHJjbXAoZW52ciwgRElTS0FVRF9EUklWRVJfTkFNRSkgPT0gMCkpIHsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIERJU0tBVURfRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQoreworCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKwlTRExfZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpESVNLQVVEX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCWNvbnN0IGNoYXIgKmVudnI7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisJaWYgKCB0aGlzICkgeworCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJfQorCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggdGhpcyApIHsKKwkJCVNETF9mcmVlKHRoaXMpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCisJZW52ciA9IFNETF9nZXRlbnYoRElTS0VOVlJfV1JJVEVERUxBWSk7CisJdGhpcy0+aGlkZGVuLT53cml0ZV9kZWxheSA9IChlbnZyKSA/IFNETF9hdG9pKGVudnIpIDogRElTS0RFRkFVTFRfV1JJVEVERUxBWTsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwl0aGlzLT5PcGVuQXVkaW8gPSBESVNLQVVEX09wZW5BdWRpbzsKKwl0aGlzLT5XYWl0QXVkaW8gPSBESVNLQVVEX1dhaXRBdWRpbzsKKwl0aGlzLT5QbGF5QXVkaW8gPSBESVNLQVVEX1BsYXlBdWRpbzsKKwl0aGlzLT5HZXRBdWRpb0J1ZiA9IERJU0tBVURfR2V0QXVkaW9CdWY7CisJdGhpcy0+Q2xvc2VBdWRpbyA9IERJU0tBVURfQ2xvc2VBdWRpbzsKKworCXRoaXMtPmZyZWUgPSBESVNLQVVEX0RlbGV0ZURldmljZTsKKworCXJldHVybiB0aGlzOworfQorCitBdWRpb0Jvb3RTdHJhcCBESVNLQVVEX2Jvb3RzdHJhcCA9IHsKKwlESVNLQVVEX0RSSVZFUl9OQU1FLCAiZGlyZWN0LXRvLWRpc2sgYXVkaW8iLAorCURJU0tBVURfQXZhaWxhYmxlLCBESVNLQVVEX0NyZWF0ZURldmljZQorfTsKKworLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCitzdGF0aWMgdm9pZCBESVNLQVVEX1dhaXRBdWRpbyhfVEhJUykKK3sKKwlTRExfRGVsYXkodGhpcy0+aGlkZGVuLT53cml0ZV9kZWxheSk7Cit9CisKK3N0YXRpYyB2b2lkIERJU0tBVURfUGxheUF1ZGlvKF9USElTKQoreworCWludCB3cml0dGVuOworCisJLyogV3JpdGUgdGhlIGF1ZGlvIGRhdGEgKi8KKwl3cml0dGVuID0gU0RMX1JXd3JpdGUodGhpcy0+aGlkZGVuLT5vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5oaWRkZW4tPm1peGJ1ZiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+bWl4bGVuKTsKKworCS8qIElmIHdlIGNvdWxkbid0IHdyaXRlLCBhc3N1bWUgZmF0YWwgZXJyb3IgZm9yIG5vdyAqLworCWlmICggKFVpbnQzMil3cml0dGVuICE9IHRoaXMtPmhpZGRlbi0+bWl4bGVuICkgeworCQl0aGlzLT5lbmFibGVkID0gMDsKKwl9CisjaWZkZWYgREVCVUdfQVVESU8KKwlmcHJpbnRmKHN0ZGVyciwgIldyb3RlICVkIGJ5dGVzIG9mIGF1ZGlvIGRhdGFcbiIsIHdyaXR0ZW4pOworI2VuZGlmCit9CisKK3N0YXRpYyBVaW50OCAqRElTS0FVRF9HZXRBdWRpb0J1ZihfVEhJUykKK3sKKwlyZXR1cm4odGhpcy0+aGlkZGVuLT5taXhidWYpOworfQorCitzdGF0aWMgdm9pZCBESVNLQVVEX0Nsb3NlQXVkaW8oX1RISVMpCit7CisJaWYgKCB0aGlzLT5oaWRkZW4tPm1peGJ1ZiAhPSBOVUxMICkgeworCQlTRExfRnJlZUF1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4YnVmKTsKKwkJdGhpcy0+aGlkZGVuLT5taXhidWYgPSBOVUxMOworCX0KKwlpZiAoIHRoaXMtPmhpZGRlbi0+b3V0cHV0ICE9IE5VTEwgKSB7CisJCVNETF9SV2Nsb3NlKHRoaXMtPmhpZGRlbi0+b3V0cHV0KTsKKwkJdGhpcy0+aGlkZGVuLT5vdXRwdXQgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBESVNLQVVEX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwljb25zdCBjaGFyICpmbmFtZSA9IERJU0tBVURfR2V0T3V0cHV0RmlsZW5hbWUoKTsKKworCS8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLworCXRoaXMtPmhpZGRlbi0+b3V0cHV0ID0gU0RMX1JXRnJvbUZpbGUoZm5hbWUsICJ3YiIpOworCWlmICggdGhpcy0+aGlkZGVuLT5vdXRwdXQgPT0gTlVMTCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKyNpZiBIQVZFX1NURElPX0gKKwlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IFlvdSBhcmUgdXNpbmcgdGhlIFNETCBkaXNrIHdyaXRlciIKKyAgICAgICAgICAgICAgICAgICAgIiBhdWRpbyBkcml2ZXIhXG4gV3JpdGluZyB0byBmaWxlIFslc10uXG4iLCBmbmFtZSk7CisjZW5kaWYKKworCS8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KKwl0aGlzLT5oaWRkZW4tPm1peGxlbiA9IHNwZWMtPnNpemU7CisJdGhpcy0+aGlkZGVuLT5taXhidWYgPSAoVWludDggKikgU0RMX0FsbG9jQXVkaW9NZW0odGhpcy0+aGlkZGVuLT5taXhsZW4pOworCWlmICggdGhpcy0+aGlkZGVuLT5taXhidWYgPT0gTlVMTCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4tPm1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7CisKKwkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KKwlyZXR1cm4oMCk7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZGlzay9TRExfZGlza2F1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2Rpc2svU0RMX2Rpc2thdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDdjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2Rpc2svU0RMX2Rpc2thdWRpby5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfZGlza2F1ZGlvX2gKKyNkZWZpbmUgX1NETF9kaXNrYXVkaW9faAorCisjaW5jbHVkZSAiU0RMX3J3b3BzLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwkvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCisJU0RMX1JXb3BzICpvdXRwdXQ7CisJVWludDggKm1peGJ1ZjsKKwlVaW50MzIgbWl4bGVuOworCVVpbnQzMiB3cml0ZV9kZWxheTsKK307CisKKyNlbmRpZiAvKiBfU0RMX2Rpc2thdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2RtYS9TRExfZG1hYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZG1hL1NETF9kbWFhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjgxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2RtYS9TRExfZG1hYXVkaW8uYwpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgkvKiBGb3Igc3RyZXJyb3IoKSAqLworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2lmIFNETF9BVURJT19EUklWRVJfT1NTX1NPVU5EQ0FSRF9ICisvKiBUaGlzIGlzIGluc3RhbGxlZCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxzb3VuZGNhcmQuaD4KKyNlbHNlCisvKiBUaGlzIGlzIHJlY29tbWVuZGVkIGJ5IE9TUyAqLworI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbmRpZgorCisjaWZuZGVmIE1BUF9GQUlMRUQKKyNkZWZpbmUgTUFQX0ZBSUxFRAkoKFVpbnQ4ICopLTEpCisjZW5kaWYKKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvZGV2X2MuaCIKKyNpbmNsdWRlICJTRExfZG1hYXVkaW8uaCIKKworLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgRE1BIGF1ZGlvICovCisjZGVmaW5lIERNQV9EUklWRVJfTkFNRSAgICAgICAgICJkbWEiCisKKy8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2ssIGFuZCBkb24ndCBibG9jayBpZiBidXN5ICovCisjZGVmaW5lIE9QRU5fRkxBR1MJKE9fUkRXUnxPX05PTkJMT0NLKQorCisvKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERNQV9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworc3RhdGljIHZvaWQgRE1BX1dhaXRBdWRpbyhfVEhJUyk7CitzdGF0aWMgdm9pZCBETUFfUGxheUF1ZGlvKF9USElTKTsKK3N0YXRpYyBVaW50OCAqRE1BX0dldEF1ZGlvQnVmKF9USElTKTsKK3N0YXRpYyB2b2lkIERNQV9DbG9zZUF1ZGlvKF9USElTKTsKKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKwlpbnQgYXZhaWxhYmxlOworCWludCBmZDsKKworCWF2YWlsYWJsZSA9IDA7CisKKwlmZCA9IFNETF9PcGVuQXVkaW9QYXRoKE5VTEwsIDAsIE9QRU5fRkxBR1MsIDApOworCWlmICggZmQgPj0gMCApIHsKKwkJaW50IGNhcHM7CisJCXN0cnVjdCBhdWRpb19idWZfaW5mbyBpbmZvOworCisJCWlmICggKGlvY3RsKGZkLCBTTkRDVExfRFNQX0dFVENBUFMsICZjYXBzKSA9PSAwKSAmJgorCSAgICAgICAgICAgICAoY2FwcyAmIERTUF9DQVBfVFJJR0dFUikgJiYgKGNhcHMgJiBEU1BfQ0FQX01NQVApICYmCisJCSAgICAgKGlvY3RsKGZkLCBTTkRDVExfRFNQX0dFVE9TUEFDRSwgJmluZm8pID09IDApICkgeworCQkJYXZhaWxhYmxlID0gMTsKKwkJfQorCQljbG9zZShmZCk7CisJfQorCXJldHVybihhdmFpbGFibGUpOworfQorCitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCVNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworCWlmICggdGhpcyApIHsKKwkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisJCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKKwkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCX0KKwlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIHRoaXMgKSB7CisJCQlTRExfZnJlZSh0aGlzKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKwlhdWRpb19mZCA9IC0xOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IERNQV9PcGVuQXVkaW87CisJdGhpcy0+V2FpdEF1ZGlvID0gRE1BX1dhaXRBdWRpbzsKKwl0aGlzLT5QbGF5QXVkaW8gPSBETUFfUGxheUF1ZGlvOworCXRoaXMtPkdldEF1ZGlvQnVmID0gRE1BX0dldEF1ZGlvQnVmOworCXRoaXMtPkNsb3NlQXVkaW8gPSBETUFfQ2xvc2VBdWRpbzsKKworCXRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgRE1BX2Jvb3RzdHJhcCA9IHsKKwlETUFfRFJJVkVSX05BTUUsICJPU1MgL2Rldi9kc3AgRE1BIGF1ZGlvIiwKKwlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCitzdGF0aWMgdm9pZCBETUFfV2FpdEF1ZGlvKF9USElTKQoreworCWZkX3NldCBmZHNldDsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdGhyZWFkLXBhcmVudCBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlICovCisJeyBzdGF0aWMgaW50IGNudCA9IDA7CisJCS8qIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2l0aCB0aHJlYWQgaW1wbGVtZW50YXRpb25zIAorCQkgICB0aGF0IHVzZSBhIGRpZmZlcmVudCBwcm9jZXNzIGlkIGZvciBlYWNoIHRocmVhZC4KKwkJKi8KKwkJaWYgKHBhcmVudCAmJiAoKCgrK2NudCklMTApID09IDApKSB7IC8qIENoZWNrIGV2ZXJ5IDEwIGxvb3BzICovCisJCQlpZiAoIGtpbGwocGFyZW50LCAwKSA8IDAgKSB7CisJCQkJdGhpcy0+ZW5hYmxlZCA9IDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTZWUgaWYgd2UgbmVlZCB0byB1c2UgdGltZWQgYXVkaW8gc3luY2hyb25pemF0aW9uICovCisJaWYgKCBmcmFtZV90aWNrcyApIHsKKwkJLyogVXNlIHRpbWVyIGZvciBnZW5lcmFsIGF1ZGlvIHN5bmNocm9uaXphdGlvbiAqLworCQlTaW50MzIgdGlja3M7CisKKwkJdGlja3MgPSAoKFNpbnQzMikobmV4dF9mcmFtZSAtIFNETF9HZXRUaWNrcygpKSktRlVER0VfVElDS1M7CisJCWlmICggdGlja3MgPiAwICkgeworCQkJU0RMX0RlbGF5KHRpY2tzKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFVzZSBzZWxlY3QoKSBmb3IgYXVkaW8gc3luY2hyb25pemF0aW9uICovCisJCXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisJCUZEX1pFUk8oJmZkc2V0KTsKKwkJRkRfU0VUKGF1ZGlvX2ZkLCAmZmRzZXQpOworCQl0aW1lb3V0LnR2X3NlYyA9IDEwOworCQl0aW1lb3V0LnR2X3VzZWMgPSAwOworI2lmZGVmIERFQlVHX0FVRElPCisJCWZwcmludGYoc3RkZXJyLCAiV2FpdGluZyBmb3IgYXVkaW8gdG8gZ2V0IHJlYWR5XG4iKTsKKyNlbmRpZgorCQlpZiAoIHNlbGVjdChhdWRpb19mZCsxLCBOVUxMLCAmZmRzZXQsIE5VTEwsICZ0aW1lb3V0KSA8PSAwICkgeworCQkJY29uc3QgY2hhciAqbWVzc2FnZSA9CisjaWZkZWYgQVVESU9fT1NQQUNFX0hBQ0sKKwkJCSJBdWRpbyB0aW1lb3V0IC0gYnVnZ3kgYXVkaW8gZHJpdmVyPyAodHJ5aW5nIG9zcGFjZSkiOworI2Vsc2UKKwkJCSJBdWRpbyB0aW1lb3V0IC0gYnVnZ3kgYXVkaW8gZHJpdmVyPyAoZGlzYWJsZWQpIjsKKyNlbmRpZgorCQkJLyogSW4gZ2VuZXJhbCB3ZSBzaG91bGQgbmV2ZXIgcHJpbnQgdG8gdGhlIHNjcmVlbiwKKwkJCSAgIGJ1dCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSBubyBvdGhlciB3YXkgb2YgbGV0dGluZworCQkJICAgdGhlIHVzZXIga25vdyB3aGF0IGhhcHBlbmVkLgorCQkJKi8KKwkJCWZwcmludGYoc3RkZXJyLCAiU0RMOiAlc1xuIiwgbWVzc2FnZSk7CisjaWZkZWYgQVVESU9fT1NQQUNFX0hBQ0sKKwkJCS8qIFdlIG1heSBiZSBhYmxlIHRvIHVzZSBHRVRfT1NQQUNFIHRyaWNrICovCisJCQlmcmFtZV90aWNrcyA9IChmbG9hdCkodGhpcy0+c3BlYy0+c2FtcGxlcyoxMDAwKSAvCisJCQkgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c3BlYy0+ZnJlcTsKKwkJCW5leHRfZnJhbWUgPSBTRExfR2V0VGlja3MoKStmcmFtZV90aWNrczsKKyNlbHNlCisJCQl0aGlzLT5lbmFibGVkID0gMDsKKwkJCS8qIERvbid0IHRyeSB0byBjbG9zZSAtIG1heSBoYW5nICovCisJCQlhdWRpb19mZCA9IC0xOworI2lmZGVmIERFQlVHX0FVRElPCisJCQlmcHJpbnRmKHN0ZGVyciwgIkRvbmUgZGlzYWJsaW5nIGF1ZGlvXG4iKTsKKyNlbmRpZgorI2VuZGlmIC8qIEFVRElPX09TUEFDRV9IQUNLICovCisJCX0KKyNpZmRlZiBERUJVR19BVURJTworCQlmcHJpbnRmKHN0ZGVyciwgIlJlYWR5IVxuIik7CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkIERNQV9QbGF5QXVkaW8oX1RISVMpCit7CisJLyogSWYgdGltZXIgc3luY2hyb25pemF0aW9uIGlzIGVuYWJsZWQsIHNldCB0aGUgbmV4dCB3cml0ZSBmcmFtZSAqLworCWlmICggZnJhbWVfdGlja3MgKSB7CisJCW5leHRfZnJhbWUgKz0gZnJhbWVfdGlja3M7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIFVpbnQ4ICpETUFfR2V0QXVkaW9CdWYoX1RISVMpCit7CisJY291bnRfaW5mbyBpbmZvOworCWludCBwbGF5aW5nOworCWludCBmaWxsaW5nOworCisJLyogR2V0IG51bWJlciBvZiBibG9ja3MsIGxvb3BpbmcgaWYgd2UncmUgbm90IHVzaW5nIHNlbGVjdCgpICovCisJZG8geworCQlpZiAoIGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX0dFVE9QVFIsICZpbmZvKSA8IDAgKSB7CisJCQkvKiBVaCBvaC4uLiAqLworCQkJdGhpcy0+ZW5hYmxlZCA9IDA7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKwl9IHdoaWxlICggZnJhbWVfdGlja3MgJiYgKGluZm8uYmxvY2tzIDwgMSkgKTsKKyNpZmRlZiBERUJVR19BVURJTworCWlmICggaW5mby5ibG9ja3MgPiAxICkgeworCQlwcmludGYoIldhcm5pbmc6IGF1ZGlvIHVuZGVyZmxvdyAoJWQgZnJhZ3MpXG4iLCBpbmZvLmJsb2Nrcy0xKTsKKwl9CisjZW5kaWYKKwlwbGF5aW5nID0gaW5mby5wdHIgLyB0aGlzLT5zcGVjLnNpemU7CisJZmlsbGluZyA9IChwbGF5aW5nICsgMSklbnVtX2J1ZmZlcnM7CisJcmV0dXJuIChkbWFfYnVmICsgKGZpbGxpbmcgKiB0aGlzLT5zcGVjLnNpemUpKTsKK30KKworc3RhdGljIHZvaWQgRE1BX0Nsb3NlQXVkaW8oX1RISVMpCit7CisJaWYgKCBkbWFfYnVmICE9IE5VTEwgKSB7CisJCW11bm1hcChkbWFfYnVmLCBkbWFfbGVuKTsKKwkJZG1hX2J1ZiA9IE5VTEw7CisJfQorCWlmICggYXVkaW9fZmQgPj0gMCApIHsKKwkJY2xvc2UoYXVkaW9fZmQpOworCQlhdWRpb19mZCA9IC0xOworCX0KK30KKworc3RhdGljIGludCBETUFfUmVvcGVuQXVkaW8oX1RISVMsIGNvbnN0IGNoYXIgKmF1ZGlvZGV2LCBpbnQgZm9ybWF0LCBpbnQgc3RlcmVvLAorCQkJCQkJCVNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJaW50IGZyYWdfc3BlYzsKKwlpbnQgdmFsdWU7CisKKwkvKiBDbG9zZSBhbmQgdGhlbiByZW9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLworCWNsb3NlKGF1ZGlvX2ZkKTsKKwlhdWRpb19mZCA9IG9wZW4oYXVkaW9kZXYsIE9fUkRXUiwgMCk7CisJaWYgKCBhdWRpb19mZCA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiAlczogJXMiLCBhdWRpb2Rldiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIGZpbmFsIHBhcmFtZXRlcnMgZm9yIHRoaXMgYXVkaW8gc3BlY2lmaWNhdGlvbiAqLworCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIHBvd2VyIG9mIHR3byBvZiB0aGUgZnJhZ21lbnQgc2l6ZSAqLworCWZvciAoIGZyYWdfc3BlYyA9IDA7ICgweDAxPDxmcmFnX3NwZWMpIDwgc3BlYy0+c2l6ZTsgKytmcmFnX3NwZWMgKTsKKwlpZiAoICgweDAxPDxmcmFnX3NwZWMpICE9IHNwZWMtPnNpemUgKSB7CisJCVNETF9TZXRFcnJvcigiRnJhZ21lbnQgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogU2V0IHRoZSBhdWRpbyBidWZmZXJpbmcgcGFyYW1ldGVycyAqLworCWlmICggaW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfU0VURlJBR01FTlQsICZmcmFnX3NwZWMpIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgYXVkaW8gZnJhZ21lbnQgc3BlYyIpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFNldCB0aGUgYXVkaW8gZm9ybWF0ICovCisJdmFsdWUgPSBmb3JtYXQ7CisJaWYgKCAoaW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfU0VURk1ULCAmdmFsdWUpIDwgMCkgfHwKKwkJCQkJCSh2YWx1ZSAhPSBmb3JtYXQpICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmb3JtYXQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBTZXQgbW9ubyBvciBzdGVyZW8gYXVkaW8gKi8KKwl2YWx1ZSA9IChzcGVjLT5jaGFubmVscyA+IDEpOworCWlmICggKGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX1NURVJFTywgJnN0ZXJlbykgPCAwKSB8fAorCQkJCQkJKHZhbHVlICE9IHN0ZXJlbykgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGNoYW5uZWxzIik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogU2V0IHRoZSBEU1AgZnJlcXVlbmN5ICovCisJdmFsdWUgPSBzcGVjLT5mcmVxOworCWlmICggaW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfU1BFRUQsICZ2YWx1ZSkgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmcmVxdWVuY3kiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJc3BlYy0+ZnJlcSA9IHZhbHVlOworCisJLyogV2Ugc3VjY2Vzc2Z1bGx5IHJlLW9wZW5lZCB0aGUgYXVkaW8gKi8KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgRE1BX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwljaGFyIGF1ZGlvZGV2WzEwMjRdOworCWludCBmb3JtYXQ7CisJaW50IHN0ZXJlbzsKKwlpbnQgdmFsdWU7CisJVWludDE2IHRlc3RfZm9ybWF0OworCXN0cnVjdCBhdWRpb19idWZfaW5mbyBpbmZvOworCisJLyogUmVzZXQgdGhlIHRpbWVyIHN5bmNocm9uaXphdGlvbiBmbGFnICovCisJZnJhbWVfdGlja3MgPSAwLjA7CisKKwkvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KKwlhdWRpb19mZCA9IFNETF9PcGVuQXVkaW9QYXRoKGF1ZGlvZGV2LCBzaXplb2YoYXVkaW9kZXYpLCBPUEVOX0ZMQUdTLCAwKTsKKwlpZiAoIGF1ZGlvX2ZkIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuICVzOiAlcyIsIGF1ZGlvZGV2LCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4oLTEpOworCX0KKwlkbWFfYnVmID0gTlVMTDsKKwlpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9SRVNFVCwgMCk7CisKKwkvKiBHZXQgYSBsaXN0IG9mIHN1cHBvcnRlZCBoYXJkd2FyZSBmb3JtYXRzICovCisJaWYgKCBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9HRVRGTVRTLCAmdmFsdWUpIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBnZXQgYXVkaW8gZm9ybWF0IGxpc3QiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBUcnkgZm9yIGEgY2xvc2VzdCBtYXRjaCBvbiBhdWRpbyBmb3JtYXQgKi8KKwlmb3JtYXQgPSAwOworCWZvciAoIHRlc3RfZm9ybWF0ID0gU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoc3BlYy0+Zm9ybWF0KTsKKwkJCQkJCSEgZm9ybWF0ICYmIHRlc3RfZm9ybWF0OyApIHsKKyNpZmRlZiBERUJVR19BVURJTworCQlmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyBmb3JtYXQgMHglNC40eFxuIiwgdGVzdF9mb3JtYXQpOworI2VuZGlmCisJCXN3aXRjaCAoIHRlc3RfZm9ybWF0ICkgeworCQkJY2FzZSBBVURJT19VODoKKwkJCQlpZiAoIHZhbHVlICYgQUZNVF9VOCApIHsKKwkJCQkJZm9ybWF0ID0gQUZNVF9VODsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX1M4OgorCQkJCWlmICggdmFsdWUgJiBBRk1UX1M4ICkgeworCQkJCQlmb3JtYXQgPSBBRk1UX1M4OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQVVESU9fUzE2TFNCOgorCQkJCWlmICggdmFsdWUgJiBBRk1UX1MxNl9MRSApIHsKKwkJCQkJZm9ybWF0ID0gQUZNVF9TMTZfTEU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBBVURJT19TMTZNU0I6CisJCQkJaWYgKCB2YWx1ZSAmIEFGTVRfUzE2X0JFICkgeworCQkJCQlmb3JtYXQgPSBBRk1UX1MxNl9CRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX1UxNkxTQjoKKwkJCQlpZiAoIHZhbHVlICYgQUZNVF9VMTZfTEUgKSB7CisJCQkJCWZvcm1hdCA9IEFGTVRfVTE2X0xFOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQVVESU9fVTE2TVNCOgorCQkJCWlmICggdmFsdWUgJiBBRk1UX1UxNl9CRSApIHsKKwkJCQkJZm9ybWF0ID0gQUZNVF9VMTZfQkU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmb3JtYXQgPSAwOworCQkJCWJyZWFrOworCQl9CisJCWlmICggISBmb3JtYXQgKSB7CisJCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKKwkJfQorCX0KKwlpZiAoIGZvcm1hdCA9PSAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHMiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7CisKKwkvKiBTZXQgdGhlIGF1ZGlvIGZvcm1hdCAqLworCXZhbHVlID0gZm9ybWF0OworCWlmICggKGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX1NFVEZNVCwgJnZhbHVlKSA8IDApIHx8CisJCQkJCQkodmFsdWUgIT0gZm9ybWF0KSApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgYXVkaW8gZm9ybWF0Iik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogU2V0IG1vbm8gb3Igc3RlcmVvIGF1ZGlvIChjdXJyZW50bHkgb25seSB0d28gY2hhbm5lbHMgc3VwcG9ydGVkKSAqLworCXN0ZXJlbyA9IChzcGVjLT5jaGFubmVscyA+IDEpOworCWlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX1NURVJFTywgJnN0ZXJlbyk7CisJaWYgKCBzdGVyZW8gKSB7CisJCXNwZWMtPmNoYW5uZWxzID0gMjsKKwl9IGVsc2UgeworCQlzcGVjLT5jaGFubmVscyA9IDE7CisJfQorCisJLyogQmVjYXVzZSBzb21lIGRyaXZlcnMgZG9uJ3QgYWxsb3cgc2V0dGluZyB0aGUgYnVmZmVyIHNpemUKKwkgICBhZnRlciBzZXR0aW5nIHRoZSBmb3JtYXQsIHdlIG11c3QgcmUtb3BlbiB0aGUgYXVkaW8gZGV2aWNlCisJICAgb25jZSB3ZSBrbm93IHdoYXQgZm9ybWF0IGFuZCBjaGFubmVscyBhcmUgc3VwcG9ydGVkCisJICovCisJaWYgKCBETUFfUmVvcGVuQXVkaW8odGhpcywgYXVkaW9kZXYsIGZvcm1hdCwgc3RlcmVvLCBzcGVjKSA8IDAgKSB7CisJCS8qIEVycm9yIGlzIHNldCBieSBETUFfUmVvcGVuQXVkaW8oKSAqLworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIE1lbW9yeSBtYXAgdGhlIGF1ZGlvIGJ1ZmZlciAqLworCWlmICggaW9jdGwoYXVkaW9fZmQsIFNORENUTF9EU1BfR0VUT1NQQUNFLCAmaW5mbykgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBPU1BBQ0UgcGFyYW1ldGVycyIpOworCQlyZXR1cm4oLTEpOworCX0KKwlzcGVjLT5zaXplID0gaW5mby5mcmFnc2l6ZTsKKwlzcGVjLT5zYW1wbGVzID0gc3BlYy0+c2l6ZSAvICgoc3BlYy0+Zm9ybWF0ICYgMHhGRikgLyA4KTsKKwlzcGVjLT5zYW1wbGVzIC89IHNwZWMtPmNoYW5uZWxzOworCW51bV9idWZmZXJzID0gaW5mby5mcmFnc3RvdGFsOworCWRtYV9sZW4gPSBudW1fYnVmZmVycypzcGVjLT5zaXplOworCWRtYV9idWYgPSAoVWludDggKiltbWFwKE5VTEwsIGRtYV9sZW4sIFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCisJCQkJCQkJYXVkaW9fZmQsIDApOworCWlmICggZG1hX2J1ZiA9PSBNQVBfRkFJTEVEICkgeworCQlTRExfU2V0RXJyb3IoIkRNQSBtZW1vcnkgbWFwIGZhaWxlZCIpOworCQlkbWFfYnVmID0gTlVMTDsKKwkJcmV0dXJuKC0xKTsKKwl9CisJU0RMX21lbXNldChkbWFfYnVmLCBzcGVjLT5zaWxlbmNlLCBkbWFfbGVuKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHVzZSBzZWxlY3QoKSB3b3JrYXJvdW5kICovCisJeyBjaGFyICp3b3JrYXJvdW5kOworCQl3b3JrYXJvdW5kID0gU0RMX2dldGVudigiU0RMX0RTUF9OT1NFTEVDVCIpOworCQlpZiAoIHdvcmthcm91bmQgKSB7CisJCQlmcmFtZV90aWNrcyA9IChmbG9hdCkoc3BlYy0+c2FtcGxlcyoxMDAwKS9zcGVjLT5mcmVxOworCQkJbmV4dF9mcmFtZSA9IFNETF9HZXRUaWNrcygpK2ZyYW1lX3RpY2tzOworCQl9CisJfQorCisJLyogVHJpZ2dlciBhdWRpbyBwbGF5YmFjayAqLworCXZhbHVlID0gMDsKKwlpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9TRVRUUklHR0VSLCAmdmFsdWUpOworCXZhbHVlID0gUENNX0VOQUJMRV9PVVRQVVQ7CisJaWYgKCBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9TRVRUUklHR0VSLCAmdmFsdWUpIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCB0cmlnZ2VyIGF1ZGlvIG91dHB1dCIpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIEdldCB0aGUgcGFyZW50IHByb2Nlc3MgaWQgKHdlJ3JlIHRoZSBwYXJlbnQgb2YgdGhlIGF1ZGlvIHRocmVhZCkgKi8KKwlwYXJlbnQgPSBnZXRwaWQoKTsKKworCS8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZG1hL1NETF9kbWFhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kbWEvU0RMX2RtYWF1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0NWY3MwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZG1hL1NETF9kbWFhdWRpby5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfZHNwYXVkaW9faAorI2RlZmluZSBfU0RMX2RzcGF1ZGlvX2gKKworI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCisKK3N0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7CisJLyogVGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGF1ZGlvIGRldmljZSAqLworCWludCBhdWRpb19mZDsKKworCS8qIFRoZSBwYXJlbnQgcHJvY2VzcyBpZCwgdG8gZGV0ZWN0IHdoZW4gYXBwbGljYXRpb24gcXVpdHMgKi8KKwlwaWRfdCBwYXJlbnQ7CisKKwkvKiBSYXcgbWl4aW5nIGJ1ZmZlciAqLworCVVpbnQ4ICpkbWFfYnVmOworCWludCAgICBkbWFfbGVuOworCWludCBudW1fYnVmZmVyczsKKworCS8qIFN1cHBvcnQgZm9yIGF1ZGlvIHRpbWluZyB1c2luZyBhIHRpbWVyLCBpbiBhZGRpdGlvbiB0byBzZWxlY3QoKSAqLworCWZsb2F0IGZyYW1lX3RpY2tzOworCWZsb2F0IG5leHRfZnJhbWU7Cit9OworI2RlZmluZSBGVURHRV9USUNLUwkxMAkvKiBUaGUgc2NoZWR1bGVyIG92ZXJoZWFkIHRpY2tzIHBlciBmcmFtZSAqLworCisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgYXVkaW9fZmQJCSh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkKQorI2RlZmluZSBwYXJlbnQJCQkodGhpcy0+aGlkZGVuLT5wYXJlbnQpCisjZGVmaW5lIGRtYV9idWYJCQkodGhpcy0+aGlkZGVuLT5kbWFfYnVmKQorI2RlZmluZSBkbWFfbGVuCQkJKHRoaXMtPmhpZGRlbi0+ZG1hX2xlbikKKyNkZWZpbmUgbnVtX2J1ZmZlcnMJCSh0aGlzLT5oaWRkZW4tPm51bV9idWZmZXJzKQorI2RlZmluZSBmcmFtZV90aWNrcwkJKHRoaXMtPmhpZGRlbi0+ZnJhbWVfdGlja3MpCisjZGVmaW5lIG5leHRfZnJhbWUJCSh0aGlzLT5oaWRkZW4tPm5leHRfZnJhbWUpCisKKyNlbmRpZiAvKiBfU0RMX2RzcGF1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZG1lZGlhL1NETF9pcml4YXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZG1lZGlhL1NETF9pcml4YXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGNkMjQyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kbWVkaWEvU0RMX2lyaXhhdWRpby5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQWxsb3cgYWNjZXNzIHRvIGEgcmF3IG1peGluZyBidWZmZXIgKEZvciBJUklYIDYuNSBhbmQgaGlnaGVyKSAqLworLyogcGF0Y2ggZm9yIElSSVggNSBieSBHZW9yZyBTY2h3YXJ6IDE4LzA3LzIwMDQgKi8KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb21lbS5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiU0RMX2lyaXhhdWRpby5oIgorCisKKyNpZm5kZWYgQUxfUkVTT1VSQ0UgLyogYXMgYSB0ZXN0IHdoZXRoZXIgd2UgdXNlIHRoZSBvbGQgSVJJWCBhdWRpbyBsaWJyYXJpZXMgKi8KKyNkZWZpbmUgT0xEX0lSSVhfQVVESU8KKyNkZWZpbmUgYWxDbG9zZVBvcnQoeCkgQUxjbG9zZXBvcnQoeCkKKyNkZWZpbmUgYWxGcmVlQ29uZmlnKHgpIEFMZnJlZWNvbmZpZyh4KQorI2RlZmluZSBhbEdldEZpbGxhYmxlKHgpIEFMZ2V0ZmlsbGFibGUoeCkKKyNkZWZpbmUgYWxOZXdDb25maWcoKSBBTG5ld2NvbmZpZygpCisjZGVmaW5lIGFsT3BlblBvcnQoeCx5LHopIEFMb3BlbnBvcnQoeCx5LHopCisjZGVmaW5lIGFsU2V0Q2hhbm5lbHMoeCx5KSBBTHNldGNoYW5uZWxzKHgseSkKKyNkZWZpbmUgYWxTZXRRdWV1ZVNpemUoeCx5KSBBTHNldHF1ZXVlc2l6ZSh4LHkpCisjZGVmaW5lIGFsU2V0U2FtcEZtdCh4LHkpIEFMc2V0c2FtcGZtdCh4LHkpCisjZGVmaW5lIGFsU2V0V2lkdGgoeCx5KSBBTHNldHdpZHRoKHgseSkKKyNlbmRpZgorCisvKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IEFMX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7CitzdGF0aWMgdm9pZCBBTF9XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgQUxfUGxheUF1ZGlvKF9USElTKTsKK3N0YXRpYyBVaW50OCAqQUxfR2V0QXVkaW9CdWYoX1RISVMpOworc3RhdGljIHZvaWQgQUxfQ2xvc2VBdWRpbyhfVEhJUyk7CisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisJaWYgKCB0aGlzICkgeworCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJfQorCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggdGhpcyApIHsKKwkJCVNETF9mcmVlKHRoaXMpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IEFMX09wZW5BdWRpbzsKKwl0aGlzLT5XYWl0QXVkaW8gPSBBTF9XYWl0QXVkaW87CisJdGhpcy0+UGxheUF1ZGlvID0gQUxfUGxheUF1ZGlvOworCXRoaXMtPkdldEF1ZGlvQnVmID0gQUxfR2V0QXVkaW9CdWY7CisJdGhpcy0+Q2xvc2VBdWRpbyA9IEFMX0Nsb3NlQXVkaW87CisKKwl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIERNRURJQV9ib290c3RyYXAgPSB7CisJIkFMIiwgIklSSVggRE1lZGlhIGF1ZGlvIiwKKwlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworCit2b2lkIHN0YXRpYyBBTF9XYWl0QXVkaW8oX1RISVMpCit7CisJU2ludDMyIHRpbWVsZWZ0OworCisJdGltZWxlZnQgPSB0aGlzLT5zcGVjLnNhbXBsZXMgLSBhbEdldEZpbGxhYmxlKGF1ZGlvX3BvcnQpOworCWlmICggdGltZWxlZnQgPiAwICkgeworCQl0aW1lbGVmdCAvPSAodGhpcy0+c3BlYy5mcmVxLzEwMDApOworCQlTRExfRGVsYXkoKFVpbnQzMil0aW1lbGVmdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBBTF9QbGF5QXVkaW8oX1RISVMpCit7CisJLyogV3JpdGUgdGhlIGF1ZGlvIGRhdGEgb3V0ICovCisJaWYgKCBhbFdyaXRlRnJhbWVzKGF1ZGlvX3BvcnQsIG1peGJ1ZiwgdGhpcy0+c3BlYy5zYW1wbGVzKSA8IDAgKSB7CisJCS8qIEFzc3VtZSBmYXRhbCBlcnJvciwgZm9yIG5vdyAqLworCQl0aGlzLT5lbmFibGVkID0gMDsKKwl9Cit9CisKK3N0YXRpYyBVaW50OCAqQUxfR2V0QXVkaW9CdWYoX1RISVMpCit7CisJcmV0dXJuKG1peGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIEFMX0Nsb3NlQXVkaW8oX1RISVMpCit7CisJaWYgKCBtaXhidWYgIT0gTlVMTCApIHsKKwkJU0RMX0ZyZWVBdWRpb01lbShtaXhidWYpOworCQltaXhidWYgPSBOVUxMOworCX0KKwlpZiAoIGF1ZGlvX3BvcnQgIT0gTlVMTCApIHsKKwkJYWxDbG9zZVBvcnQoYXVkaW9fcG9ydCk7CisJCWF1ZGlvX3BvcnQgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBBTF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKiBzcGVjKQoreworCVVpbnQxNiB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7CisJbG9uZyB3aWR0aCA9IDA7CisJbG9uZyBmbXQgPSAwOworCWludCB2YWxpZCA9IDA7CisKKyNpZmRlZiBPTERfSVJJWF9BVURJTworCXsKKwkJbG9uZyBhdWRpb19wYXJhbVsyXTsKKwkJYXVkaW9fcGFyYW1bMF0gPSBBTF9PVVRQVVRfUkFURTsKKwkJYXVkaW9fcGFyYW1bMV0gPSBzcGVjLT5mcmVxOworCQl2YWxpZCA9IChBTHNldHBhcmFtcyhBTF9ERUZBVUxUX0RFVklDRSwgYXVkaW9fcGFyYW0sIDIpIDwgMCk7CisJfQorI2Vsc2UKKwl7CisJCUFMcHYgYXVkaW9fcGFyYW07CisJCWF1ZGlvX3BhcmFtLnBhcmFtID0gQUxfUkFURTsKKwkJYXVkaW9fcGFyYW0udmFsdWUuaSA9IHNwZWMtPmZyZXE7CisJCXZhbGlkID0gKGFsU2V0UGFyYW1zKEFMX0RFRkFVTFRfT1VUUFVULCAmYXVkaW9fcGFyYW0sIDEpIDwgMCk7CisJfQorI2VuZGlmCisKKwl3aGlsZSAoKCF2YWxpZCkgJiYgKHRlc3RfZm9ybWF0KSkgeworCQl2YWxpZCA9IDE7CisJCXNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OworCisJCXN3aXRjaCAodGVzdF9mb3JtYXQpIHsKKwkJCWNhc2UgQVVESU9fUzg6CisJCQkJd2lkdGggPSBBTF9TQU1QTEVfODsKKwkJCQlmbXQgPSBBTF9TQU1QRk1UX1RXT1NDT01QOworCQkJCWJyZWFrOworCisJCQljYXNlIEFVRElPX1MxNlNZUzoKKwkJCQl3aWR0aCA9IEFMX1NBTVBMRV8xNjsKKwkJCQlmbXQgPSBBTF9TQU1QRk1UX1RXT1NDT01QOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXZhbGlkID0gMDsKKwkJCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh2YWxpZCkgeworCQkJQUxjb25maWcgYXVkaW9fY29uZmlnID0gYWxOZXdDb25maWcoKTsKKwkJCXZhbGlkID0gMDsKKwkJCWlmIChhdWRpb19jb25maWcpIHsKKwkJCQlpZiAoYWxTZXRDaGFubmVscyhhdWRpb19jb25maWcsIHNwZWMtPmNoYW5uZWxzKSA8IDApIHsKKwkJCQkJaWYgKHNwZWMtPmNoYW5uZWxzID4gMikgeyAgLyogY2FuJ3QgaGFuZGxlID4gc3RlcmVvPyAqLworCQkJCQkJc3BlYy0+Y2hhbm5lbHMgPSAyOyAgLyogdHJ5IGFnYWluIGJlbG93LiAqLworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKChhbFNldFNhbXBGbXQoYXVkaW9fY29uZmlnLCBmbXQpID49IDApICYmCisJCQkJICAgICgoIXdpZHRoKSB8fCAoYWxTZXRXaWR0aChhdWRpb19jb25maWcsIHdpZHRoKSA+PSAwKSkgJiYKKwkJCQkgICAgKGFsU2V0UXVldWVTaXplKGF1ZGlvX2NvbmZpZywgc3BlYy0+c2FtcGxlcyAqIDIpID49IDApICYmCisJCQkJICAgIChhbFNldENoYW5uZWxzKGF1ZGlvX2NvbmZpZywgc3BlYy0+Y2hhbm5lbHMpID49IDApKSB7CisKKwkJCQkJYXVkaW9fcG9ydCA9IGFsT3BlblBvcnQoIlNETCBhdWRpbyIsICJ3IiwgYXVkaW9fY29uZmlnKTsKKwkJCQkJaWYgKGF1ZGlvX3BvcnQgPT0gTlVMTCkgeworCQkJCQkJLyogZG9jcyBzYXkgQUxfQkFEX0NIQU5ORUxTIGhhcHBlbnMgaGVyZSwgdG9vLiAqLworCQkJCQkJaW50IGVyciA9IG9zZXJyb3IoKTsKKwkJCQkJCWlmIChlcnIgPT0gQUxfQkFEX0NIQU5ORUxTKSB7CisJCQkJCQkJc3BlYy0+Y2hhbm5lbHMgPSAyOworCQkJCQkJCWFsU2V0Q2hhbm5lbHMoYXVkaW9fY29uZmlnLCBzcGVjLT5jaGFubmVscyk7CisJCQkJCQkJYXVkaW9fcG9ydCA9IGFsT3BlblBvcnQoIlNETCBhdWRpbyIsICJ3IiwKKwkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWcpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGF1ZGlvX3BvcnQgIT0gTlVMTCkgeworCQkJCQkJdmFsaWQgPSAxOworCQkJCQl9CisJCQkJfQorCisJCQkJYWxGcmVlQ29uZmlnKGF1ZGlvX2NvbmZpZyk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXZhbGlkKSB7CisJCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0Iik7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qIFVwZGF0ZSB0aGUgZnJhZ21lbnQgc2l6ZSBhcyBzaXplIGluIGJ5dGVzICovCisJU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKworCS8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KKwltaXhidWYgPSAoVWludDggKikgU0RMX0FsbG9jQXVkaW9NZW0oc3BlYy0+c2l6ZSk7CisJaWYgKG1peGJ1ZiA9PSBOVUxMKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJU0RMX21lbXNldChtaXhidWYsIHNwZWMtPnNpbGVuY2UsIHNwZWMtPnNpemUpOworCisJLyogV2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCisJcmV0dXJuICgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kbWVkaWEvU0RMX2lyaXhhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kbWVkaWEvU0RMX2lyaXhhdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNGY0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2RtZWRpYS9TRExfaXJpeGF1ZGlvLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9sb3dhdWRpb19oCisjZGVmaW5lIF9TRExfbG93YXVkaW9faAorCisjaW5jbHVkZSA8ZG1lZGlhL2F1ZGlvLmg+CisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgYXVkaW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcworCitzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgeworCS8qIFRoZSBoYW5kbGUgZm9yIHRoZSBhdWRpbyBkZXZpY2UgKi8KKwlBTHBvcnQgYXVkaW9fcG9ydDsKKworCVVpbnQ4ICptaXhidWY7ICAgICAgICAgICAvKiBUaGUgYXBwIG1peGluZyBidWZmZXIgKi8KK307CisKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBhdWRpb19wb3J0CQkodGhpcy0+aGlkZGVuLT5hdWRpb19wb3J0KQorI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCisKKyNlbmRpZiAvKiBfU0RMX2xvd2F1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZHNwL1NETF9kc3BhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kc3AvU0RMX2RzcGF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2YzU0NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZHNwL1NETF9kc3BhdWRpby5jCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisKKyAgICBNb2RpZmllZCBpbiBPY3QgMjAwNCBieSBIYW5udSBTYXZvbGFpbmVuIAorICAgIGhhbm51QG9wZW5zb3VuZC5jb20KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4JLyogRm9yIHBlcnJvcigpICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CS8qIEZvciBzdHJlcnJvcigpICovCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmIFNETF9BVURJT19EUklWRVJfT1NTX1NPVU5EQ0FSRF9ICisvKiBUaGlzIGlzIGluc3RhbGxlZCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxzb3VuZGNhcmQuaD4KKyNlbHNlCisvKiBUaGlzIGlzIHJlY29tbWVuZGVkIGJ5IE9TUyAqLworI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgorI2luY2x1ZGUgIlNETF9kc3BhdWRpby5oIgorCisvKiBUaGUgdGFnIG5hbWUgdXNlZCBieSBEU1AgYXVkaW8gKi8KKyNkZWZpbmUgRFNQX0RSSVZFUl9OQU1FICAgICAgICAgImRzcCIKKworLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjaywgYW5kIGRvbid0IGJsb2NrIGlmIGJ1c3kgKi8KKyNkZWZpbmUgT1BFTl9GTEFHUwkoT19XUk9OTFl8T19OT05CTE9DSykKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBEU1BfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIERTUF9XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgRFNQX1BsYXlBdWRpbyhfVEhJUyk7CitzdGF0aWMgVWludDggKkRTUF9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBEU1BfQ2xvc2VBdWRpbyhfVEhJUyk7CisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisJaW50IGZkOworCWludCBhdmFpbGFibGU7CisKKwlhdmFpbGFibGUgPSAwOworCWZkID0gU0RMX09wZW5BdWRpb1BhdGgoTlVMTCwgMCwgT1BFTl9GTEFHUywgMCk7CisJaWYgKCBmZCA+PSAwICkgeworCQlhdmFpbGFibGUgPSAxOworCQljbG9zZShmZCk7CisJfQorCXJldHVybihhdmFpbGFibGUpOworfQorCitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCVNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworCWlmICggdGhpcyApIHsKKwkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisJCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKKwkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCX0KKwlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIHRoaXMgKSB7CisJCQlTRExfZnJlZSh0aGlzKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKwlhdWRpb19mZCA9IC0xOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IERTUF9PcGVuQXVkaW87CisJdGhpcy0+V2FpdEF1ZGlvID0gRFNQX1dhaXRBdWRpbzsKKwl0aGlzLT5QbGF5QXVkaW8gPSBEU1BfUGxheUF1ZGlvOworCXRoaXMtPkdldEF1ZGlvQnVmID0gRFNQX0dldEF1ZGlvQnVmOworCXRoaXMtPkNsb3NlQXVkaW8gPSBEU1BfQ2xvc2VBdWRpbzsKKworCXRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgRFNQX2Jvb3RzdHJhcCA9IHsKKwlEU1BfRFJJVkVSX05BTUUsICJPU1MgL2Rldi9kc3Agc3RhbmRhcmQgYXVkaW8iLAorCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIERTUF9XYWl0QXVkaW8oX1RISVMpCit7CisJLyogTm90IG5lZWRlZCBhdCBhbGwgc2luY2UgT1NTIGhhbmRsZXMgd2FpdGluZyBhdXRvbWFnaWNhbGx5ICovCit9CisKK3N0YXRpYyB2b2lkIERTUF9QbGF5QXVkaW8oX1RISVMpCit7CisJaWYgKHdyaXRlKGF1ZGlvX2ZkLCBtaXhidWYsIG1peGxlbik9PS0xKQorCXsKKwkJcGVycm9yKCJBdWRpbyB3cml0ZSIpOworCQl0aGlzLT5lbmFibGVkID0gMDsKKwl9CisKKyNpZmRlZiBERUJVR19BVURJTworCWZwcmludGYoc3RkZXJyLCAiV3JvdGUgJWQgYnl0ZXMgb2YgYXVkaW8gZGF0YVxuIiwgbWl4bGVuKTsKKyNlbmRpZgorfQorCitzdGF0aWMgVWludDggKkRTUF9HZXRBdWRpb0J1ZihfVEhJUykKK3sKKwlyZXR1cm4obWl4YnVmKTsKK30KKworc3RhdGljIHZvaWQgRFNQX0Nsb3NlQXVkaW8oX1RISVMpCit7CisJaWYgKCBtaXhidWYgIT0gTlVMTCApIHsKKwkJU0RMX0ZyZWVBdWRpb01lbShtaXhidWYpOworCQltaXhidWYgPSBOVUxMOworCX0KKwlpZiAoIGF1ZGlvX2ZkID49IDAgKSB7CisJCWNsb3NlKGF1ZGlvX2ZkKTsKKwkJYXVkaW9fZmQgPSAtMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgRFNQX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwljaGFyIGF1ZGlvZGV2WzEwMjRdOworCWludCBmb3JtYXQ7CisJaW50IHZhbHVlOworCWludCBmcmFnX3NwZWM7CisJVWludDE2IHRlc3RfZm9ybWF0OworCisgICAgLyogTWFrZSBzdXJlIGZyYWdtZW50IHNpemUgc3RheXMgYSBwb3dlciBvZiAyLCBvciBPU1MgZmFpbHMuICovCisgICAgLyogSSBkb24ndCBrbm93IHdoaWNoIG9mIHRoZXNlIGFyZSBhY3R1YWxseSBsZWdhbCB2YWx1ZXMsIHRob3VnaC4uLiAqLworICAgIGlmIChzcGVjLT5jaGFubmVscyA+IDgpCisgICAgICAgIHNwZWMtPmNoYW5uZWxzID0gODsKKyAgICBlbHNlIGlmIChzcGVjLT5jaGFubmVscyA+IDQpCisgICAgICAgIHNwZWMtPmNoYW5uZWxzID0gNDsKKyAgICBlbHNlIGlmIChzcGVjLT5jaGFubmVscyA+IDIpCisgICAgICAgIHNwZWMtPmNoYW5uZWxzID0gMjsKKworCS8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLworCWF1ZGlvX2ZkID0gU0RMX09wZW5BdWRpb1BhdGgoYXVkaW9kZXYsIHNpemVvZihhdWRpb2RldiksIE9QRU5fRkxBR1MsIDApOworCWlmICggYXVkaW9fZmQgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gJXM6ICVzIiwgYXVkaW9kZXYsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybigtMSk7CisJfQorCW1peGJ1ZiA9IE5VTEw7CisKKwkvKiBNYWtlIHRoZSBmaWxlIGRlc2NyaXB0b3IgdXNlIGJsb2NraW5nIHdyaXRlcyB3aXRoIGZjbnRsKCkgKi8KKwl7IGxvbmcgZmxhZ3M7CisJCWZsYWdzID0gZmNudGwoYXVkaW9fZmQsIEZfR0VURkwpOworCQlmbGFncyAmPSB+T19OT05CTE9DSzsKKwkJaWYgKCBmY250bChhdWRpb19mZCwgRl9TRVRGTCwgZmxhZ3MpIDwgMCApIHsKKwkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGJsb2NraW5nIG1vZGUiKTsKKwkJCURTUF9DbG9zZUF1ZGlvKHRoaXMpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCX0KKworCS8qIEdldCBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGhhcmR3YXJlIGZvcm1hdHMgKi8KKwlpZiAoIGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX0dFVEZNVFMsICZ2YWx1ZSkgPCAwICkgeworCQlwZXJyb3IoIlNORENUTF9EU1BfR0VURk1UUyIpOworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBhdWRpbyBmb3JtYXQgbGlzdCIpOworCQlEU1BfQ2xvc2VBdWRpbyh0aGlzKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBUcnkgZm9yIGEgY2xvc2VzdCBtYXRjaCBvbiBhdWRpbyBmb3JtYXQgKi8KKwlmb3JtYXQgPSAwOworCWZvciAoIHRlc3RfZm9ybWF0ID0gU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoc3BlYy0+Zm9ybWF0KTsKKwkJCQkJCSEgZm9ybWF0ICYmIHRlc3RfZm9ybWF0OyApIHsKKyNpZmRlZiBERUJVR19BVURJTworCQlmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyBmb3JtYXQgMHglNC40eFxuIiwgdGVzdF9mb3JtYXQpOworI2VuZGlmCisJCXN3aXRjaCAoIHRlc3RfZm9ybWF0ICkgeworCQkJY2FzZSBBVURJT19VODoKKwkJCQlpZiAoIHZhbHVlICYgQUZNVF9VOCApIHsKKwkJCQkJZm9ybWF0ID0gQUZNVF9VODsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX1MxNkxTQjoKKwkJCQlpZiAoIHZhbHVlICYgQUZNVF9TMTZfTEUgKSB7CisJCQkJCWZvcm1hdCA9IEFGTVRfUzE2X0xFOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQVVESU9fUzE2TVNCOgorCQkJCWlmICggdmFsdWUgJiBBRk1UX1MxNl9CRSApIHsKKwkJCQkJZm9ybWF0ID0gQUZNVF9TMTZfQkU7CisJCQkJfQorCQkJCWJyZWFrOworI2lmIDAKKy8qCisgKiBUaGVzZSBmb3JtYXRzIGFyZSBub3QgdXNlZCBieSBhbnkgcmVhbCBsaWZlIHN5c3RlbXMgc28gdGhleSBhcmUgbm90IAorICogbmVlZGVkIGhlcmUuCisgKi8KKwkJCWNhc2UgQVVESU9fUzg6CisJCQkJaWYgKCB2YWx1ZSAmIEFGTVRfUzggKSB7CisJCQkJCWZvcm1hdCA9IEFGTVRfUzg7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBBVURJT19VMTZMU0I6CisJCQkJaWYgKCB2YWx1ZSAmIEFGTVRfVTE2X0xFICkgeworCQkJCQlmb3JtYXQgPSBBRk1UX1UxNl9MRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX1UxNk1TQjoKKwkJCQlpZiAoIHZhbHVlICYgQUZNVF9VMTZfQkUgKSB7CisJCQkJCWZvcm1hdCA9IEFGTVRfVTE2X0JFOworCQkJCX0KKwkJCQlicmVhazsKKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQlmb3JtYXQgPSAwOworCQkJCWJyZWFrOworCQl9CisJCWlmICggISBmb3JtYXQgKSB7CisJCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKKwkJfQorCX0KKwlpZiAoIGZvcm1hdCA9PSAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHMiKTsKKwkJRFNQX0Nsb3NlQXVkaW8odGhpcyk7CisJCXJldHVybigtMSk7CisJfQorCXNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OworCisJLyogU2V0IHRoZSBhdWRpbyBmb3JtYXQgKi8KKwl2YWx1ZSA9IGZvcm1hdDsKKwlpZiAoIChpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9TRVRGTVQsICZ2YWx1ZSkgPCAwKSB8fAorCQkJCQkJKHZhbHVlICE9IGZvcm1hdCkgKSB7CisJCXBlcnJvcigiU05EQ1RMX0RTUF9TRVRGTVQiKTsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgYXVkaW8gZm9ybWF0Iik7CisJCURTUF9DbG9zZUF1ZGlvKHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFNldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIG91dHB1dCAqLworCXZhbHVlID0gc3BlYy0+Y2hhbm5lbHM7CisJaWYgKCBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9DSEFOTkVMUywgJnZhbHVlKSA8IDAgKSB7CisJCXBlcnJvcigiU05EQ1RMX0RTUF9DSEFOTkVMUyIpOworCQlTRExfU2V0RXJyb3IoIkNhbm5vdCBzZXQgdGhlIG51bWJlciBvZiBjaGFubmVscyIpOworCQlEU1BfQ2xvc2VBdWRpbyh0aGlzKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJc3BlYy0+Y2hhbm5lbHMgPSB2YWx1ZTsKKworCS8qIFNldCB0aGUgRFNQIGZyZXF1ZW5jeSAqLworCXZhbHVlID0gc3BlYy0+ZnJlcTsKKwlpZiAoIGlvY3RsKGF1ZGlvX2ZkLCBTTkRDVExfRFNQX1NQRUVELCAmdmFsdWUpIDwgMCApIHsKKwkJcGVycm9yKCJTTkRDVExfRFNQX1NQRUVEIik7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZyZXF1ZW5jeSIpOworCQlEU1BfQ2xvc2VBdWRpbyh0aGlzKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJc3BlYy0+ZnJlcSA9IHZhbHVlOworCisJLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGF1ZGlvIHNwZWNpZmljYXRpb24gKi8KKwlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOworCisJLyogRGV0ZXJtaW5lIHRoZSBwb3dlciBvZiB0d28gb2YgdGhlIGZyYWdtZW50IHNpemUgKi8KKwlmb3IgKCBmcmFnX3NwZWMgPSAwOyAoMHgwMVU8PGZyYWdfc3BlYykgPCBzcGVjLT5zaXplOyArK2ZyYWdfc3BlYyApOworCWlmICggKDB4MDFVPDxmcmFnX3NwZWMpICE9IHNwZWMtPnNpemUgKSB7CisJCVNETF9TZXRFcnJvcigiRnJhZ21lbnQgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIik7CisJCURTUF9DbG9zZUF1ZGlvKHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKwlmcmFnX3NwZWMgfD0gMHgwMDAyMDAwMDsJLyogdHdvIGZyYWdtZW50cywgZm9yIGxvdyBsYXRlbmN5ICovCisKKwkvKiBTZXQgdGhlIGF1ZGlvIGJ1ZmZlcmluZyBwYXJhbWV0ZXJzICovCisjaWZkZWYgREVCVUdfQVVESU8KKwlmcHJpbnRmKHN0ZGVyciwgIlJlcXVlc3RpbmcgJWQgZnJhZ21lbnRzIG9mIHNpemUgJWRcbiIsCisJCShmcmFnX3NwZWMgPj4gMTYpLCAxPDwoZnJhZ19zcGVjJjB4RkZGRikpOworI2VuZGlmCisJaWYgKCBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwgJmZyYWdfc3BlYykgPCAwICkgeworCQlwZXJyb3IoIlNORENUTF9EU1BfU0VURlJBR01FTlQiKTsKKwl9CisjaWZkZWYgREVCVUdfQVVESU8KKwl7IGF1ZGlvX2J1Zl9pbmZvIGluZm87CisJICBpb2N0bChhdWRpb19mZCwgU05EQ1RMX0RTUF9HRVRPU1BBQ0UsICZpbmZvKTsKKwkgIGZwcmludGYoc3RkZXJyLCAiZnJhZ21lbnRzID0gJWRcbiIsIGluZm8uZnJhZ21lbnRzKTsKKwkgIGZwcmludGYoc3RkZXJyLCAiZnJhZ3N0b3RhbCA9ICVkXG4iLCBpbmZvLmZyYWdzdG90YWwpOworCSAgZnByaW50ZihzdGRlcnIsICJmcmFnc2l6ZSA9ICVkXG4iLCBpbmZvLmZyYWdzaXplKTsKKwkgIGZwcmludGYoc3RkZXJyLCAiYnl0ZXMgPSAlZFxuIiwgaW5mby5ieXRlcyk7CisJfQorI2VuZGlmCisKKwkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCisJbWl4bGVuID0gc3BlYy0+c2l6ZTsKKwltaXhidWYgPSAoVWludDggKilTRExfQWxsb2NBdWRpb01lbShtaXhsZW4pOworCWlmICggbWl4YnVmID09IE5VTEwgKSB7CisJCURTUF9DbG9zZUF1ZGlvKHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKwlTRExfbWVtc2V0KG1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7CisKKwkvKiBHZXQgdGhlIHBhcmVudCBwcm9jZXNzIGlkICh3ZSdyZSB0aGUgcGFyZW50IG9mIHRoZSBhdWRpbyB0aHJlYWQpICovCisJcGFyZW50ID0gZ2V0cGlkKCk7CisKKwkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2RzcC9TRExfZHNwYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZHNwL1NETF9kc3BhdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjU0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2RzcC9TRExfZHNwYXVkaW8uaApAQCAtMCwwICsxLDUzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2RzcGF1ZGlvX2gKKyNkZWZpbmUgX1NETF9kc3BhdWRpb19oCisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcworCitzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgeworCS8qIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBhdWRpbyBkZXZpY2UgKi8KKwlpbnQgYXVkaW9fZmQ7CisKKwkvKiBUaGUgcGFyZW50IHByb2Nlc3MgaWQsIHRvIGRldGVjdCB3aGVuIGFwcGxpY2F0aW9uIHF1aXRzICovCisJcGlkX3QgcGFyZW50OworCisJLyogUmF3IG1peGluZyBidWZmZXIgKi8KKwlVaW50OCAqbWl4YnVmOworCWludCAgICBtaXhsZW47Cit9OworI2RlZmluZSBGVURHRV9USUNLUwkxMAkvKiBUaGUgc2NoZWR1bGVyIG92ZXJoZWFkIHRpY2tzIHBlciBmcmFtZSAqLworCisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgYXVkaW9fZmQJCSh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkKQorI2RlZmluZSBwYXJlbnQJCQkodGhpcy0+aGlkZGVuLT5wYXJlbnQpCisjZGVmaW5lIG1peGJ1ZgkJCSh0aGlzLT5oaWRkZW4tPm1peGJ1ZikKKyNkZWZpbmUgbWl4bGVuCQkJKHRoaXMtPmhpZGRlbi0+bWl4bGVuKQorI2RlZmluZSBmcmFtZV90aWNrcwkJKHRoaXMtPmhpZGRlbi0+ZnJhbWVfdGlja3MpCisjZGVmaW5lIG5leHRfZnJhbWUJCSh0aGlzLT5oaWRkZW4tPm5leHRfZnJhbWUpCisKKyNlbmRpZiAvKiBfU0RMX2RzcGF1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZHVtbXkvU0RMX2R1bW15YXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZHVtbXkvU0RMX2R1bW15YXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODRiNTBkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9kdW1teS9TRExfZHVtbXlhdWRpby5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisKKyAgICBUaGlzIGZpbGUgd3JpdHRlbiBieSBSeWFuIEMuIEdvcmRvbiAoaWNjdWx1c0BpY2N1bHVzLm9yZykKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBPdXRwdXQgYXVkaW8gdG8gbm93aGVyZS4uLiAqLworCisjaW5jbHVkZSAiU0RMX3J3b3BzLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgorI2luY2x1ZGUgIlNETF9kdW1teWF1ZGlvLmgiCisKKy8qIFRoZSB0YWcgbmFtZSB1c2VkIGJ5IERVTU1ZIGF1ZGlvICovCisjZGVmaW5lIERVTU1ZQVVEX0RSSVZFUl9OQU1FICAgICAgICAgImR1bW15IgorCisvKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERVTU1ZQVVEX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7CitzdGF0aWMgdm9pZCBEVU1NWUFVRF9XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgRFVNTVlBVURfUGxheUF1ZGlvKF9USElTKTsKK3N0YXRpYyBVaW50OCAqRFVNTVlBVURfR2V0QXVkaW9CdWYoX1RISVMpOworc3RhdGljIHZvaWQgRFVNTVlBVURfQ2xvc2VBdWRpbyhfVEhJUyk7CisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERVTU1ZQVVEX0F2YWlsYWJsZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKmVudnIgPSBTRExfZ2V0ZW52KCJTRExfQVVESU9EUklWRVIiKTsKKwlpZiAoZW52ciAmJiAoU0RMX3N0cmNtcChlbnZyLCBEVU1NWUFVRF9EUklWRVJfTkFNRSkgPT0gMCkpIHsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIERVTU1ZQVVEX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqRFVNTVlBVURfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisJaWYgKCB0aGlzICkgeworCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJfQorCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggdGhpcyApIHsKKwkJCVNETF9mcmVlKHRoaXMpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IERVTU1ZQVVEX09wZW5BdWRpbzsKKwl0aGlzLT5XYWl0QXVkaW8gPSBEVU1NWUFVRF9XYWl0QXVkaW87CisJdGhpcy0+UGxheUF1ZGlvID0gRFVNTVlBVURfUGxheUF1ZGlvOworCXRoaXMtPkdldEF1ZGlvQnVmID0gRFVNTVlBVURfR2V0QXVkaW9CdWY7CisJdGhpcy0+Q2xvc2VBdWRpbyA9IERVTU1ZQVVEX0Nsb3NlQXVkaW87CisKKwl0aGlzLT5mcmVlID0gRFVNTVlBVURfRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIERVTU1ZQVVEX2Jvb3RzdHJhcCA9IHsKKwlEVU1NWUFVRF9EUklWRVJfTkFNRSwgIlNETCBkdW1teSBhdWRpbyBkcml2ZXIiLAorCURVTU1ZQVVEX0F2YWlsYWJsZSwgRFVNTVlBVURfQ3JlYXRlRGV2aWNlCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIERVTU1ZQVVEX1dhaXRBdWRpbyhfVEhJUykKK3sKKwkvKiBEb24ndCBibG9jayBvbiBmaXJzdCBjYWxscyB0byBzaW11bGF0ZSBpbml0aWFsIGZyYWdtZW50IGZpbGxpbmcuICovCisJaWYgKHRoaXMtPmhpZGRlbi0+aW5pdGlhbF9jYWxscykKKwkJdGhpcy0+aGlkZGVuLT5pbml0aWFsX2NhbGxzLS07CisJZWxzZQorCQlTRExfRGVsYXkodGhpcy0+aGlkZGVuLT53cml0ZV9kZWxheSk7Cit9CisKK3N0YXRpYyB2b2lkIERVTU1ZQVVEX1BsYXlBdWRpbyhfVEhJUykKK3sKKwkvKiBuby1vcC4uLnRoaXMgaXMgYSBudWxsIGRyaXZlci4gKi8KK30KKworc3RhdGljIFVpbnQ4ICpEVU1NWUFVRF9HZXRBdWRpb0J1ZihfVEhJUykKK3sKKwlyZXR1cm4odGhpcy0+aGlkZGVuLT5taXhidWYpOworfQorCitzdGF0aWMgdm9pZCBEVU1NWUFVRF9DbG9zZUF1ZGlvKF9USElTKQoreworCWlmICggdGhpcy0+aGlkZGVuLT5taXhidWYgIT0gTlVMTCApIHsKKwkJU0RMX0ZyZWVBdWRpb01lbSh0aGlzLT5oaWRkZW4tPm1peGJ1Zik7CisJCXRoaXMtPmhpZGRlbi0+bWl4YnVmID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgRFVNTVlBVURfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCWZsb2F0IGJ5dGVzX3Blcl9zZWMgPSAwLjBmOworCisJLyogQWxsb2NhdGUgbWl4aW5nIGJ1ZmZlciAqLworCXRoaXMtPmhpZGRlbi0+bWl4bGVuID0gc3BlYy0+c2l6ZTsKKwl0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IChVaW50OCAqKSBTRExfQWxsb2NBdWRpb01lbSh0aGlzLT5oaWRkZW4tPm1peGxlbik7CisJaWYgKCB0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9PSBOVUxMICkgeworCQlyZXR1cm4oLTEpOworCX0KKwlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbi0+bWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKKworCWJ5dGVzX3Blcl9zZWMgPSAoZmxvYXQpICgoKHNwZWMtPmZvcm1hdCAmIDB4RkYpIC8gOCkgKgorCSAgICAgICAgICAgICAgICAgICBzcGVjLT5jaGFubmVscyAqIHNwZWMtPmZyZXEpOworCisJLyoKKwkgKiBXZSB0cnkgdG8gbWFrZSB0aGlzIHJlcXVlc3QgbW9yZSBhdWRpbyBhdCB0aGUgY29ycmVjdCByYXRlIGZvcgorCSAqICBhIGdpdmVuIGF1ZGlvIHNwZWMsIHNvIHRpbWluZyBzdGF5cyBmYWlybHkgZmFpdGhmdWwuCisJICogQWxzbywgd2UgaGF2ZSBpdCBub3QgYmxvY2sgYXQgYWxsIGZvciB0aGUgZmlyc3QgdHdvIGNhbGxzLCBzbworCSAqICBpdCBzZWVtcyBsaWtlIHdlJ3JlIGZpbGxpbmcgdHdvIGF1ZGlvIGZyYWdtZW50cyByaWdodCBvdXQgb2YgdGhlCisJICogIGdhdGUsIGxpa2Ugb3RoZXIgU0RMIGRyaXZlcnMgdGVuZCB0byBkby4KKwkgKi8KKwl0aGlzLT5oaWRkZW4tPmluaXRpYWxfY2FsbHMgPSAyOworCXRoaXMtPmhpZGRlbi0+d3JpdGVfZGVsYXkgPQorCSAgICAgICAgICAgICAgIChVaW50MzIpICgoKChmbG9hdCkgc3BlYy0+c2l6ZSkgLyBieXRlc19wZXJfc2VjKSAqIDEwMDAuMGYpOworCisJLyogV2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCisJcmV0dXJuKDApOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2R1bW15L1NETF9kdW1teWF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2R1bW15L1NETF9kdW1teWF1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhNjljYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZHVtbXkvU0RMX2R1bW15YXVkaW8uaApAQCAtMCwwICsxLDQwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2R1bW15YXVkaW9faAorI2RlZmluZSBfU0RMX2R1bW15YXVkaW9faAorCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwkvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCisJVWludDggKm1peGJ1ZjsKKwlVaW50MzIgbWl4bGVuOworCVVpbnQzMiB3cml0ZV9kZWxheTsKKwlVaW50MzIgaW5pdGlhbF9jYWxsczsKK307CisKKyNlbmRpZiAvKiBfU0RMX2R1bW15YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9lc2QvU0RMX2VzZGF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL2VzZC9TRExfZXNkYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRiMGVhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9lc2QvU0RMX2VzZGF1ZGlvLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbGxvdyBhY2Nlc3MgdG8gYW4gRVNEIG5ldHdvcmsgc3RyZWFtIG1peGluZyBidWZmZXIgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZXNkLmg+CisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCisjaW5jbHVkZSAiU0RMX2VzZGF1ZGlvLmgiCisKKyNpZmRlZiBTRExfQVVESU9fRFJJVkVSX0VTRF9EWU5BTUlDCisjaW5jbHVkZSAiU0RMX25hbWUuaCIKKyNpbmNsdWRlICJTRExfbG9hZHNvLmgiCisjZWxzZQorI2RlZmluZSBTRExfTkFNRShYKQlYCisjZW5kaWYKKworLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgRVNEIGF1ZGlvICovCisjZGVmaW5lIEVTRF9EUklWRVJfTkFNRQkJImVzZCIKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBFU0RfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIEVTRF9XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgRVNEX1BsYXlBdWRpbyhfVEhJUyk7CitzdGF0aWMgVWludDggKkVTRF9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBFU0RfQ2xvc2VBdWRpbyhfVEhJUyk7CisKKyNpZmRlZiBTRExfQVVESU9fRFJJVkVSX0VTRF9EWU5BTUlDCisKK3N0YXRpYyBjb25zdCBjaGFyICplc2RfbGlicmFyeSA9IFNETF9BVURJT19EUklWRVJfRVNEX0RZTkFNSUM7CitzdGF0aWMgdm9pZCAqZXNkX2hhbmRsZSA9IE5VTEw7CitzdGF0aWMgaW50IGVzZF9sb2FkZWQgPSAwOworCitzdGF0aWMgaW50ICgqU0RMX05BTUUoZXNkX29wZW5fc291bmQpKSggY29uc3QgY2hhciAqaG9zdCApOworc3RhdGljIGludCAoKlNETF9OQU1FKGVzZF9jbG9zZSkpKCBpbnQgZXNkICk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUoZXNkX3BsYXlfc3RyZWFtKSkoIGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpuYW1lICk7CitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKipmdW5jOworfSBlc2RfZnVuY3Rpb25zW10gPSB7CisJeyAiZXNkX29wZW5fc291bmQiLAkodm9pZCAqKikmU0RMX05BTUUoZXNkX29wZW5fc291bmQpCX0sCisJeyAiZXNkX2Nsb3NlIiwJCSh2b2lkICoqKSZTRExfTkFNRShlc2RfY2xvc2UpCQl9LAorCXsgImVzZF9wbGF5X3N0cmVhbSIsCSh2b2lkICoqKSZTRExfTkFNRShlc2RfcGxheV9zdHJlYW0pCX0sCit9OworCitzdGF0aWMgdm9pZCBVbmxvYWRFU0RMaWJyYXJ5KCkKK3sKKwlpZiAoIGVzZF9sb2FkZWQgKSB7CisJCVNETF9VbmxvYWRPYmplY3QoZXNkX2hhbmRsZSk7CisJCWVzZF9oYW5kbGUgPSBOVUxMOworCQllc2RfbG9hZGVkID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgTG9hZEVTRExpYnJhcnkodm9pZCkKK3sKKwlpbnQgaSwgcmV0dmFsID0gLTE7CisKKwllc2RfaGFuZGxlID0gU0RMX0xvYWRPYmplY3QoZXNkX2xpYnJhcnkpOworCWlmICggZXNkX2hhbmRsZSApIHsKKwkJZXNkX2xvYWRlZCA9IDE7CisJCXJldHZhbCA9IDA7CisJCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKGVzZF9mdW5jdGlvbnMpOyArK2kgKSB7CisJCQkqZXNkX2Z1bmN0aW9uc1tpXS5mdW5jID0gU0RMX0xvYWRGdW5jdGlvbihlc2RfaGFuZGxlLCBlc2RfZnVuY3Rpb25zW2ldLm5hbWUpOworCQkJaWYgKCAhKmVzZF9mdW5jdGlvbnNbaV0uZnVuYyApIHsKKwkJCQlyZXR2YWwgPSAtMTsKKwkJCQlVbmxvYWRFU0RMaWJyYXJ5KCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgVW5sb2FkRVNETGlicmFyeSgpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IExvYWRFU0RMaWJyYXJ5KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBTRExfQVVESU9fRFJJVkVSX0VTRF9EWU5BTUlDICovCisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisJaW50IGNvbm5lY3Rpb247CisJaW50IGF2YWlsYWJsZTsKKworCWF2YWlsYWJsZSA9IDA7CisJaWYgKCBMb2FkRVNETGlicmFyeSgpIDwgMCApIHsKKwkJcmV0dXJuIGF2YWlsYWJsZTsKKwl9CisJY29ubmVjdGlvbiA9IFNETF9OQU1FKGVzZF9vcGVuX3NvdW5kKShOVUxMKTsKKwlpZiAoIGNvbm5lY3Rpb24gPj0gMCApIHsKKwkJYXZhaWxhYmxlID0gMTsKKwkJU0RMX05BTUUoZXNkX2Nsb3NlKShjb25uZWN0aW9uKTsKKwl9CisJVW5sb2FkRVNETGlicmFyeSgpOworCXJldHVybihhdmFpbGFibGUpOworfQorCitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCVNETF9mcmVlKGRldmljZSk7CisJVW5sb2FkRVNETGlicmFyeSgpOworfQorCitzdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9BdWRpb0RldmljZSAqdGhpczsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJTG9hZEVTRExpYnJhcnkoKTsKKwl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworCWlmICggdGhpcyApIHsKKwkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisJCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKKwkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCX0KKwlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIHRoaXMgKSB7CisJCQlTRExfZnJlZSh0aGlzKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKwlhdWRpb19mZCA9IC0xOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IEVTRF9PcGVuQXVkaW87CisJdGhpcy0+V2FpdEF1ZGlvID0gRVNEX1dhaXRBdWRpbzsKKwl0aGlzLT5QbGF5QXVkaW8gPSBFU0RfUGxheUF1ZGlvOworCXRoaXMtPkdldEF1ZGlvQnVmID0gRVNEX0dldEF1ZGlvQnVmOworCXRoaXMtPkNsb3NlQXVkaW8gPSBFU0RfQ2xvc2VBdWRpbzsKKworCXRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgRVNEX2Jvb3RzdHJhcCA9IHsKKwlFU0RfRFJJVkVSX05BTUUsICJFbmxpZ2h0ZW5lZCBTb3VuZCBEYWVtb24iLAorCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgZnVsbCBzb3VuZCBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIEVTRF9XYWl0QXVkaW8oX1RISVMpCit7CisJU2ludDMyIHRpY2tzOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0aHJlYWQtcGFyZW50IHByb2Nlc3MgaXMgc3RpbGwgYWxpdmUgKi8KKwl7IHN0YXRpYyBpbnQgY250ID0gMDsKKwkJLyogTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyB3aXRoIHRocmVhZCBpbXBsZW1lbnRhdGlvbnMgCisJCSAgIHRoYXQgdXNlIGEgZGlmZmVyZW50IHByb2Nlc3MgaWQgZm9yIGVhY2ggdGhyZWFkLgorCQkqLworCQlpZiAocGFyZW50ICYmICgoKCsrY250KSUxMCkgPT0gMCkpIHsgLyogQ2hlY2sgZXZlcnkgMTAgbG9vcHMgKi8KKwkJCWlmICgga2lsbChwYXJlbnQsIDApIDwgMCApIHsKKwkJCQl0aGlzLT5lbmFibGVkID0gMDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFVzZSB0aW1lciBmb3IgZ2VuZXJhbCBhdWRpbyBzeW5jaHJvbml6YXRpb24gKi8KKwl0aWNrcyA9ICgoU2ludDMyKShuZXh0X2ZyYW1lIC0gU0RMX0dldFRpY2tzKCkpKS1GVURHRV9USUNLUzsKKwlpZiAoIHRpY2tzID4gMCApIHsKKwkJU0RMX0RlbGF5KHRpY2tzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEVTRF9QbGF5QXVkaW8oX1RISVMpCit7CisJaW50IHdyaXR0ZW47CisKKwkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSwgY2hlY2tpbmcgZm9yIEVBR0FJTiBvbiBicm9rZW4gYXVkaW8gZHJpdmVycyAqLworCWRvIHsKKwkJd3JpdHRlbiA9IHdyaXRlKGF1ZGlvX2ZkLCBtaXhidWYsIG1peGxlbik7CisJCWlmICggKHdyaXR0ZW4gPCAwKSAmJiAoKGVycm5vID09IDApIHx8IChlcnJubyA9PSBFQUdBSU4pKSApIHsKKwkJCVNETF9EZWxheSgxKTsJLyogTGV0IGEgbGl0dGxlIENQVSB0aW1lIGdvIGJ5ICovCisJCX0KKwl9IHdoaWxlICggKHdyaXR0ZW4gPCAwKSAmJiAKKwkgICAgICAgICAgKChlcnJubyA9PSAwKSB8fCAoZXJybm8gPT0gRUFHQUlOKSB8fCAoZXJybm8gPT0gRUlOVFIpKSApOworCisJLyogU2V0IHRoZSBuZXh0IHdyaXRlIGZyYW1lICovCisJbmV4dF9mcmFtZSArPSBmcmFtZV90aWNrczsKKworCS8qIElmIHdlIGNvdWxkbid0IHdyaXRlLCBhc3N1bWUgZmF0YWwgZXJyb3IgZm9yIG5vdyAqLworCWlmICggd3JpdHRlbiA8IDAgKSB7CisJCXRoaXMtPmVuYWJsZWQgPSAwOworCX0KK30KKworc3RhdGljIFVpbnQ4ICpFU0RfR2V0QXVkaW9CdWYoX1RISVMpCit7CisJcmV0dXJuKG1peGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIEVTRF9DbG9zZUF1ZGlvKF9USElTKQoreworCWlmICggbWl4YnVmICE9IE5VTEwgKSB7CisJCVNETF9GcmVlQXVkaW9NZW0obWl4YnVmKTsKKwkJbWl4YnVmID0gTlVMTDsKKwl9CisJaWYgKCBhdWRpb19mZCA+PSAwICkgeworCQlTRExfTkFNRShlc2RfY2xvc2UpKGF1ZGlvX2ZkKTsKKwkJYXVkaW9fZmQgPSAtMTsKKwl9Cit9CisKKy8qIFRyeSB0byBnZXQgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gKi8KK3N0YXRpYyBjaGFyICpnZXRfcHJvZ25hbWUodm9pZCkKK3sKKwljaGFyICpwcm9nbmFtZSA9IE5VTEw7CisjaWZkZWYgX19MSU5VWF9fCisJRklMRSAqZnA7CisJc3RhdGljIGNoYXIgdGVtcFtCVUZTSVpdOworCisJU0RMX3NucHJpbnRmKHRlbXAsIFNETF9hcnJheXNpemUodGVtcCksICIvcHJvYy8lZC9jbWRsaW5lIiwgZ2V0cGlkKCkpOworCWZwID0gZm9wZW4odGVtcCwgInIiKTsKKwlpZiAoIGZwICE9IE5VTEwgKSB7CisJCWlmICggZmdldHModGVtcCwgc2l6ZW9mKHRlbXApLTEsIGZwKSApIHsKKwkJCXByb2duYW1lID0gU0RMX3N0cnJjaHIodGVtcCwgJy8nKTsKKwkJCWlmICggcHJvZ25hbWUgPT0gTlVMTCApIHsKKwkJCQlwcm9nbmFtZSA9IHRlbXA7CisJCQl9IGVsc2UgeworCQkJCXByb2duYW1lID0gcHJvZ25hbWUrMTsKKwkJCX0KKwkJfQorCQlmY2xvc2UoZnApOworCX0KKyNlbmRpZgorCXJldHVybihwcm9nbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgRVNEX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwllc2RfZm9ybWF0X3QgZm9ybWF0OworCisJLyogQ29udmVydCBhdWRpbyBzcGVjIHRvIHRoZSBFU0QgYXVkaW8gZm9ybWF0ICovCisJZm9ybWF0ID0gKEVTRF9TVFJFQU0gfCBFU0RfUExBWSk7CisJc3dpdGNoICggc3BlYy0+Zm9ybWF0ICYgMHhGRiApIHsKKwkJY2FzZSA4OgorCQkJZm9ybWF0IHw9IEVTRF9CSVRTODsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJZm9ybWF0IHw9IEVTRF9CSVRTMTY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgRVNEIGF1ZGlvIGZvcm1hdCIpOworCQkJcmV0dXJuKC0xKTsKKwl9CisJaWYgKCBzcGVjLT5jaGFubmVscyA9PSAxICkgeworCQlmb3JtYXQgfD0gRVNEX01PTk87CisJfSBlbHNlIHsKKwkJZm9ybWF0IHw9IEVTRF9TVEVSRU87CisJfQorI2lmIDAKKwlzcGVjLT5zYW1wbGVzID0gRVNEX0JVRl9TSVpFOwkvKiBEYXJuLCBubyB3YXkgdG8gY2hhbmdlIHRoaXMgeWV0ICovCisjZW5kaWYKKworCS8qIE9wZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBFU0QgYXVkaW8gc2VydmVyICovCisJYXVkaW9fZmQgPSBTRExfTkFNRShlc2RfcGxheV9zdHJlYW0pKGZvcm1hdCwgc3BlYy0+ZnJlcSwgTlVMTCwgZ2V0X3Byb2duYW1lKCkpOworCWlmICggYXVkaW9fZmQgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gRVNEIGNvbm5lY3Rpb24iKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIGZpbmFsIHBhcmFtZXRlcnMgZm9yIHRoaXMgYXVkaW8gc3BlY2lmaWNhdGlvbiAqLworCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisJZnJhbWVfdGlja3MgPSAoZmxvYXQpKHNwZWMtPnNhbXBsZXMqMTAwMCkvc3BlYy0+ZnJlcTsKKwluZXh0X2ZyYW1lID0gU0RMX0dldFRpY2tzKCkrZnJhbWVfdGlja3M7CisKKwkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCisJbWl4bGVuID0gc3BlYy0+c2l6ZTsKKwltaXhidWYgPSAoVWludDggKilTRExfQWxsb2NBdWRpb01lbShtaXhsZW4pOworCWlmICggbWl4YnVmID09IE5VTEwgKSB7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tZW1zZXQobWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKKworCS8qIEdldCB0aGUgcGFyZW50IHByb2Nlc3MgaWQgKHdlJ3JlIHRoZSBwYXJlbnQgb2YgdGhlIGF1ZGlvIHRocmVhZCkgKi8KKwlwYXJlbnQgPSBnZXRwaWQoKTsKKworCS8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZXNkL1NETF9lc2RhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9lc2QvU0RMX2VzZGF1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0YWU2YQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vZXNkL1NETF9lc2RhdWRpby5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfZXNkYXVkaW9faAorI2RlZmluZSBfU0RMX2VzZGF1ZGlvX2gKKworI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCisKK3N0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7CisJLyogVGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGF1ZGlvIGRldmljZSAqLworCWludCBhdWRpb19mZDsKKworCS8qIFRoZSBwYXJlbnQgcHJvY2VzcyBpZCwgdG8gZGV0ZWN0IHdoZW4gYXBwbGljYXRpb24gcXVpdHMgKi8KKwlwaWRfdCBwYXJlbnQ7CisKKwkvKiBSYXcgbWl4aW5nIGJ1ZmZlciAqLworCVVpbnQ4ICptaXhidWY7CisJaW50ICAgIG1peGxlbjsKKworCS8qIFN1cHBvcnQgZm9yIGF1ZGlvIHRpbWluZyB1c2luZyBhIHRpbWVyICovCisJZmxvYXQgZnJhbWVfdGlja3M7CisJZmxvYXQgbmV4dF9mcmFtZTsKK307CisjZGVmaW5lIEZVREdFX1RJQ0tTCTEwCS8qIFRoZSBzY2hlZHVsZXIgb3ZlcmhlYWQgdGlja3MgcGVyIGZyYW1lICovCisKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBhdWRpb19mZAkJKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQpCisjZGVmaW5lIHBhcmVudAkJCSh0aGlzLT5oaWRkZW4tPnBhcmVudCkKKyNkZWZpbmUgbWl4YnVmCQkJKHRoaXMtPmhpZGRlbi0+bWl4YnVmKQorI2RlZmluZSBtaXhsZW4JCQkodGhpcy0+aGlkZGVuLT5taXhsZW4pCisjZGVmaW5lIGZyYW1lX3RpY2tzCQkodGhpcy0+aGlkZGVuLT5mcmFtZV90aWNrcykKKyNkZWZpbmUgbmV4dF9mcmFtZQkJKHRoaXMtPmhpZGRlbi0+bmV4dF9mcmFtZSkKKworI2VuZGlmIC8qIF9TRExfZXNkYXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9tYWNvc3gvU0RMX2NvcmVhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9tYWNvc3gvU0RMX2NvcmVhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzE2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21hY29zeC9TRExfY29yZWF1ZGlvLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8Q29yZUF1ZGlvL0NvcmVBdWRpby5oPgorI2luY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KKyNpbmNsdWRlIDxBdWRpb1VuaXQvQXVkaW9Vbml0Lmg+CisjaWYgTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8PSAxMDUwCisjaW5jbHVkZSA8QXVkaW9Vbml0L0FVTlRDb21wb25lbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKyNpbmNsdWRlICJTRExfY29yZWF1ZGlvLmgiCisKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IENvcmVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIENvcmVfV2FpdEF1ZGlvKF9USElTKTsKK3N0YXRpYyB2b2lkIENvcmVfUGxheUF1ZGlvKF9USElTKTsKK3N0YXRpYyBVaW50OCAqQ29yZV9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBDb3JlX0Nsb3NlQXVkaW8oX1RISVMpOworCisvKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQoreworICAgIHJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQoreworICAgIFNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKyAgICBTRExfZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworICAgIFNETF9BdWRpb0RldmljZSAqdGhpczsKKworICAgIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisgICAgdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKKyAgICBpZiAoIHRoaXMgKSB7CisgICAgICAgIFNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOworICAgICAgICB0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCisgICAgICAgICAgICAgICAgU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKyAgICB9CisgICAgaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgeworICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgaWYgKCB0aGlzICkgeworICAgICAgICAgICAgU0RMX2ZyZWUodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisKKyAgICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgdGhpcy0+T3BlbkF1ZGlvID0gQ29yZV9PcGVuQXVkaW87CisgICAgdGhpcy0+V2FpdEF1ZGlvID0gQ29yZV9XYWl0QXVkaW87CisgICAgdGhpcy0+UGxheUF1ZGlvID0gQ29yZV9QbGF5QXVkaW87CisgICAgdGhpcy0+R2V0QXVkaW9CdWYgPSBDb3JlX0dldEF1ZGlvQnVmOworICAgIHRoaXMtPkNsb3NlQXVkaW8gPSBDb3JlX0Nsb3NlQXVkaW87CisKKyAgICB0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisgICAgcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIENPUkVBVURJT19ib290c3RyYXAgPSB7CisgICAgImNvcmVhdWRpbyIsICJNYWMgT1MgWCBDb3JlQXVkaW8iLAorICAgIEF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCit9OworCisvKiBUaGUgQ29yZUF1ZGlvIGNhbGxiYWNrICovCitzdGF0aWMgT1NTdGF0dXMgICAgIGF1ZGlvQ2FsbGJhY2sgKHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyAgICAgICppb0FjdGlvbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAgICAgICAgICAgICppblRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1c051bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bWJlckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJMaXN0ICAgICAgICAgICAgICAgICAqaW9EYXRhKQoreworICAgIFNETF9BdWRpb0RldmljZSAqdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilpblJlZkNvbjsKKyAgICBVSW50MzIgcmVtYWluaW5nLCBsZW47CisgICAgQXVkaW9CdWZmZXIgKmFidWY7CisgICAgdm9pZCAqcHRyOworICAgIFVJbnQzMiBpOworCisgICAgLyogT25seSBkbyBhbnl0aGluZyBpZiBhdWRpbyBpcyBlbmFibGVkIGFuZCBub3QgcGF1c2VkICovCisgICAgaWYgKCAhIHRoaXMtPmVuYWJsZWQgfHwgdGhpcy0+cGF1c2VkICkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW9EYXRhLT5tTnVtYmVyQnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICBhYnVmID0gJmlvRGF0YS0+bUJ1ZmZlcnNbaV07CisgICAgICAgICAgICBTRExfbWVtc2V0KGFidWYtPm1EYXRhLCB0aGlzLT5zcGVjLnNpbGVuY2UsIGFidWYtPm1EYXRhQnl0ZVNpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICAvKiBObyBTREwgY29udmVyc2lvbiBzaG91bGQgYmUgbmVlZGVkIGhlcmUsIGV2ZXIsIHNpbmNlIHdlIGFjY2VwdAorICAgICAgIGFueSBpbnB1dCBmb3JtYXQgaW4gT3BlbkF1ZGlvLCBhbmQgbGVhdmUgdGhlIGNvbnZlcnNpb24gdG8gQ29yZUF1ZGlvLgorICAgICAqLworICAgIC8qCisgICAgYXNzZXJ0KCF0aGlzLT5jb252ZXJ0Lm5lZWRlZCk7CisgICAgYXNzZXJ0KHRoaXMtPnNwZWMuY2hhbm5lbHMgPT0gaW9EYXRhLT5tTnVtYmVyQ2hhbm5lbHMpOworICAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IGlvRGF0YS0+bU51bWJlckJ1ZmZlcnM7IGkrKykgeworICAgICAgICBhYnVmID0gJmlvRGF0YS0+bUJ1ZmZlcnNbaV07CisgICAgICAgIHJlbWFpbmluZyA9IGFidWYtPm1EYXRhQnl0ZVNpemU7CisgICAgICAgIHB0ciA9IGFidWYtPm1EYXRhOworICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlck9mZnNldCA+PSBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgLyogR2VuZXJhdGUgdGhlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICBTRExfbWVtc2V0KGJ1ZmZlciwgdGhpcy0+c3BlYy5zaWxlbmNlLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBTRExfbXV0ZXhQKHRoaXMtPm1peGVyX2xvY2spOworICAgICAgICAgICAgICAgICgqdGhpcy0+c3BlYy5jYWxsYmFjaykodGhpcy0+c3BlYy51c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIFNETF9tdXRleFYodGhpcy0+bWl4ZXJfbG9jayk7CisgICAgICAgICAgICAgICAgYnVmZmVyT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBsZW4gPSBidWZmZXJTaXplIC0gYnVmZmVyT2Zmc2V0OworICAgICAgICAgICAgaWYgKGxlbiA+IHJlbWFpbmluZykKKyAgICAgICAgICAgICAgICBsZW4gPSByZW1haW5pbmc7CisgICAgICAgICAgICBTRExfbWVtY3B5KHB0ciwgKGNoYXIgKilidWZmZXIgKyBidWZmZXJPZmZzZXQsIGxlbik7CisgICAgICAgICAgICBwdHIgPSAoY2hhciAqKXB0ciArIGxlbjsKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsZW47CisgICAgICAgICAgICBidWZmZXJPZmZzZXQgKz0gbGVuOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIER1bW15IGZ1bmN0aW9ucyAtLSB3ZSBkb24ndCB1c2UgdGhyZWFkLWJhc2VkIGF1ZGlvICovCit2b2lkIENvcmVfV2FpdEF1ZGlvKF9USElTKQoreworICAgIHJldHVybjsKK30KKwordm9pZCBDb3JlX1BsYXlBdWRpbyhfVEhJUykKK3sKKyAgICByZXR1cm47Cit9CisKK1VpbnQ4ICpDb3JlX0dldEF1ZGlvQnVmKF9USElTKQoreworICAgIHJldHVybihOVUxMKTsKK30KKwordm9pZCBDb3JlX0Nsb3NlQXVkaW8oX1RISVMpCit7CisgICAgT1NTdGF0dXMgcmVzdWx0OworICAgIHN0cnVjdCBBVVJlbmRlckNhbGxiYWNrU3RydWN0IGNhbGxiYWNrOworCisgICAgLyogc3RvcCBwcm9jZXNzaW5nIHRoZSBhdWRpbyB1bml0ICovCisgICAgcmVzdWx0ID0gQXVkaW9PdXRwdXRVbml0U3RvcCAob3V0cHV0QXVkaW9Vbml0KTsKKyAgICBpZiAocmVzdWx0ICE9IG5vRXJyKSB7CisgICAgICAgIFNETF9TZXRFcnJvcigiQ29yZV9DbG9zZUF1ZGlvOiBBdWRpb091dHB1dFVuaXRTdG9wIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBSZW1vdmUgdGhlIGlucHV0IGNhbGxiYWNrICovCisgICAgY2FsbGJhY2suaW5wdXRQcm9jID0gMDsKKyAgICBjYWxsYmFjay5pbnB1dFByb2NSZWZDb24gPSAwOworICAgIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5IChvdXRwdXRBdWRpb1VuaXQsIAorICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1NldFJlbmRlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFNjb3BlX0lucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbGxiYWNrKSk7CisgICAgaWYgKHJlc3VsdCAhPSBub0VycikgeworICAgICAgICBTRExfU2V0RXJyb3IoIkNvcmVfQ2xvc2VBdWRpbzogQXVkaW9Vbml0U2V0UHJvcGVydHkgKGtBdWRpb1VuaXRQcm9wZXJ0eV9TZXRJbnB1dENhbGxiYWNrKSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVzdWx0ID0gQ2xvc2VDb21wb25lbnQob3V0cHV0QXVkaW9Vbml0KTsKKyAgICBpZiAocmVzdWx0ICE9IG5vRXJyKSB7CisgICAgICAgIFNETF9TZXRFcnJvcigiQ29yZV9DbG9zZUF1ZGlvOiBDbG9zZUNvbXBvbmVudCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIFNETF9mcmVlKGJ1ZmZlcik7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfUkVTVUxUKG1zZykgXAorICAgIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsgXAorICAgICAgICBTRExfU2V0RXJyb3IoIkZhaWxlZCB0byBzdGFydCBDb3JlQXVkaW86ICIgbXNnKTsgXAorICAgICAgICByZXR1cm4gLTE7IFwKKyAgICB9CisKKworaW50IENvcmVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworICAgIE9TU3RhdHVzIHJlc3VsdCA9IG5vRXJyOworICAgIENvbXBvbmVudCBjb21wOworICAgIENvbXBvbmVudERlc2NyaXB0aW9uIGRlc2M7CisgICAgc3RydWN0IEFVUmVuZGVyQ2FsbGJhY2tTdHJ1Y3QgY2FsbGJhY2s7CisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIHJlcXVlc3RlZERlc2M7CisKKyAgICAvKiBTZXR1cCBhIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiB3aXRoIHRoZSByZXF1ZXN0ZWQgZm9ybWF0ICovCisgICAgcmVxdWVzdGVkRGVzYy5tRm9ybWF0SUQgPSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ007CisgICAgcmVxdWVzdGVkRGVzYy5tRm9ybWF0RmxhZ3MgPSBrTGluZWFyUENNRm9ybWF0RmxhZ0lzUGFja2VkOworICAgIHJlcXVlc3RlZERlc2MubUNoYW5uZWxzUGVyRnJhbWUgPSBzcGVjLT5jaGFubmVsczsKKyAgICByZXF1ZXN0ZWREZXNjLm1TYW1wbGVSYXRlID0gc3BlYy0+ZnJlcTsKKyAgICAKKyAgICByZXF1ZXN0ZWREZXNjLm1CaXRzUGVyQ2hhbm5lbCA9IHNwZWMtPmZvcm1hdCAmIDB4RkY7CisgICAgaWYgKHNwZWMtPmZvcm1hdCAmIDB4ODAwMCkKKyAgICAgICAgcmVxdWVzdGVkRGVzYy5tRm9ybWF0RmxhZ3MgfD0ga0xpbmVhclBDTUZvcm1hdEZsYWdJc1NpZ25lZEludGVnZXI7CisgICAgaWYgKHNwZWMtPmZvcm1hdCAmIDB4MTAwMCkKKyAgICAgICAgcmVxdWVzdGVkRGVzYy5tRm9ybWF0RmxhZ3MgfD0ga0xpbmVhclBDTUZvcm1hdEZsYWdJc0JpZ0VuZGlhbjsKKworICAgIHJlcXVlc3RlZERlc2MubUZyYW1lc1BlclBhY2tldCA9IDE7CisgICAgcmVxdWVzdGVkRGVzYy5tQnl0ZXNQZXJGcmFtZSA9IHJlcXVlc3RlZERlc2MubUJpdHNQZXJDaGFubmVsICogcmVxdWVzdGVkRGVzYy5tQ2hhbm5lbHNQZXJGcmFtZSAvIDg7CisgICAgcmVxdWVzdGVkRGVzYy5tQnl0ZXNQZXJQYWNrZXQgPSByZXF1ZXN0ZWREZXNjLm1CeXRlc1BlckZyYW1lICogcmVxdWVzdGVkRGVzYy5tRnJhbWVzUGVyUGFja2V0OworCisKKyAgICAvKiBMb2NhdGUgdGhlIGRlZmF1bHQgb3V0cHV0IGF1ZGlvIHVuaXQgKi8KKyAgICBkZXNjLmNvbXBvbmVudFR5cGUgPSBrQXVkaW9Vbml0VHlwZV9PdXRwdXQ7CisgICAgZGVzYy5jb21wb25lbnRTdWJUeXBlID0ga0F1ZGlvVW5pdFN1YlR5cGVfRGVmYXVsdE91dHB1dDsKKyAgICBkZXNjLmNvbXBvbmVudE1hbnVmYWN0dXJlciA9IGtBdWRpb1VuaXRNYW51ZmFjdHVyZXJfQXBwbGU7CisgICAgZGVzYy5jb21wb25lbnRGbGFncyA9IDA7CisgICAgZGVzYy5jb21wb25lbnRGbGFnc01hc2sgPSAwOworICAgIAorICAgIGNvbXAgPSBGaW5kTmV4dENvbXBvbmVudCAoTlVMTCwgJmRlc2MpOworICAgIGlmIChjb21wID09IE5VTEwpIHsKKyAgICAgICAgU0RMX1NldEVycm9yICgiRmFpbGVkIHRvIHN0YXJ0IENvcmVBdWRpbzogRmluZE5leHRDb21wb25lbnQgcmV0dXJuZWQgTlVMTCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIC8qIE9wZW4gJiBpbml0aWFsaXplIHRoZSBkZWZhdWx0IG91dHB1dCBhdWRpbyB1bml0ICovCisgICAgcmVzdWx0ID0gT3BlbkFDb21wb25lbnQgKGNvbXAsICZvdXRwdXRBdWRpb1VuaXQpOworICAgIENIRUNLX1JFU1VMVCgiT3BlbkFDb21wb25lbnQiKQorCisgICAgcmVzdWx0ID0gQXVkaW9Vbml0SW5pdGlhbGl6ZSAob3V0cHV0QXVkaW9Vbml0KTsKKyAgICBDSEVDS19SRVNVTFQoIkF1ZGlvVW5pdEluaXRpYWxpemUiKQorICAgICAgICAgICAgICAgIAorICAgIC8qIFNldCB0aGUgaW5wdXQgZm9ybWF0IG9mIHRoZSBhdWRpbyB1bml0LiAqLworICAgIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5IChvdXRwdXRBdWRpb1VuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0U2NvcGVfSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdGVkRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHJlcXVlc3RlZERlc2MpKTsKKyAgICBDSEVDS19SRVNVTFQoIkF1ZGlvVW5pdFNldFByb3BlcnR5IChrQXVkaW9Vbml0UHJvcGVydHlfU3RyZWFtRm9ybWF0KSIpCisKKyAgICAvKiBTZXQgdGhlIGF1ZGlvIGNhbGxiYWNrICovCisgICAgY2FsbGJhY2suaW5wdXRQcm9jID0gYXVkaW9DYWxsYmFjazsKKyAgICBjYWxsYmFjay5pbnB1dFByb2NSZWZDb24gPSB0aGlzOworICAgIHJlc3VsdCA9IEF1ZGlvVW5pdFNldFByb3BlcnR5IChvdXRwdXRBdWRpb1VuaXQsIAorICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1NldFJlbmRlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFNjb3BlX0lucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbGxiYWNrKSk7CisgICAgQ0hFQ0tfUkVTVUxUKCJBdWRpb1VuaXRTZXRQcm9wZXJ0eSAoa0F1ZGlvVW5pdFByb3BlcnR5X1NldElucHV0Q2FsbGJhY2spIikKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgZmluYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBhdWRpbyBzcGVjaWZpY2F0aW9uICovCisgICAgU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKyAgICAKKyAgICAvKiBBbGxvY2F0ZSBhIHNhbXBsZSBidWZmZXIgKi8KKyAgICBidWZmZXJPZmZzZXQgPSBidWZmZXJTaXplID0gdGhpcy0+c3BlYy5zaXplOworICAgIGJ1ZmZlciA9IFNETF9tYWxsb2MoYnVmZmVyU2l6ZSk7CisKKyAgICAvKiBGaW5hbGx5LCBzdGFydCBwcm9jZXNzaW5nIG9mIHRoZSBhdWRpbyB1bml0ICovCisgICAgcmVzdWx0ID0gQXVkaW9PdXRwdXRVbml0U3RhcnQgKG91dHB1dEF1ZGlvVW5pdCk7CisgICAgQ0hFQ0tfUkVTVUxUKCJBdWRpb091dHB1dFVuaXRTdGFydCIpICAgIAorICAgIAorCisgICAgLyogV2UncmUgcnVubmluZyEgKi8KKyAgICByZXR1cm4oMSk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21hY29zeC9TRExfY29yZWF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21hY29zeC9TRExfY29yZWF1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwZTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbWFjb3N4L1NETF9jb3JlYXVkaW8uaApAQCAtMCwwICsxLDQ2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2NvcmVhdWRpb19oCisjZGVmaW5lIF9TRExfY29yZWF1ZGlvX2gKKworI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgorI2luY2x1ZGUgPEF1ZGlvVW5pdC9BVU5UQ29tcG9uZW50Lmg+CisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwlBdWRpb1VuaXQgb3V0cHV0QXVkaW9Vbml0OworCXZvaWQgKmJ1ZmZlcjsKKwlVSW50MzIgYnVmZmVyT2Zmc2V0OworCVVJbnQzMiBidWZmZXJTaXplOworfTsKKworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIG91dHB1dEF1ZGlvVW5pdAkJKHRoaXMtPmhpZGRlbi0+b3V0cHV0QXVkaW9Vbml0KQorI2RlZmluZSBidWZmZXIJCSh0aGlzLT5oaWRkZW4tPmJ1ZmZlcikKKyNkZWZpbmUgYnVmZmVyT2Zmc2V0CQkodGhpcy0+aGlkZGVuLT5idWZmZXJPZmZzZXQpCisjZGVmaW5lIGJ1ZmZlclNpemUJCSh0aGlzLT5oaWRkZW4tPmJ1ZmZlclNpemUpCisKKyNlbmRpZiAvKiBfU0RMX2NvcmVhdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21hY3JvbS9TRExfcm9tYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbWFjcm9tL1NETF9yb21hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2Q0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21hY3JvbS9TRExfcm9tYXVkaW8uYwpAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKKyMgIGluY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKyNlbGlmIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAmJiAoVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+IDB4MDMzNSkKKyMgIGluY2x1ZGUgPENhcmJvbi5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPFNvdW5kLmg+IC8qIFNvdW5kTWFuYWdlciBpbnRlcmZhY2UgKi8KKyMgIGluY2x1ZGUgPEdlc3RhbHQuaD4KKyMgIGluY2x1ZGUgPERyaXZlclNlcnZpY2VzLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKE5ld1NuZENhbGxCYWNrVVBQKSAmJiAoVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA8IDB4MDMzNSkKKyNpZiAhZGVmaW5lZChOZXdTbmRDYWxsQmFja1Byb2MpIC8qIGF2b2lkIGNpcmN1bGFyIHJlZGVmaW5pdGlvbi4uLiAqLworI2RlZmluZSBOZXdTbmRDYWxsQmFja1VQUCBOZXdTbmRDYWxsQmFja1Byb2MKKyNlbmRpZgorI2lmICFkZWZpbmVkKE5ld1NuZENhbGxCYWNrVVBQKQorI2RlZmluZSBOZXdTbmRDYWxsQmFja1VQUCBOZXdTbmRDYWxsQmFja1Byb2MKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgorI2luY2x1ZGUgIlNETF9yb21hdWRpby5oIgorCisvKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIE1hY19DbG9zZUF1ZGlvKF9USElTKTsKK3N0YXRpYyBpbnQgTWFjX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7CitzdGF0aWMgdm9pZCBNYWNfTG9ja0F1ZGlvKF9USElTKTsKK3N0YXRpYyB2b2lkIE1hY19VbmxvY2tBdWRpbyhfVEhJUyk7CisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKKworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKyAgICByZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKyAgICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisgICAgU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKyAgICBTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKyAgICAvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworICAgIHRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisgICAgaWYgKCB0aGlzICkgeworICAgICAgICBTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKyAgICAgICAgdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorICAgICAgICAgICAgICAgIFNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisgICAgfQorICAgIGlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKyAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICAgIGlmICggdGhpcyApIHsKKyAgICAgICAgICAgIFNETF9mcmVlKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCisgICAgLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIHRoaXMtPk9wZW5BdWRpbyAgID0gTWFjX09wZW5BdWRpbzsKKyAgICB0aGlzLT5DbG9zZUF1ZGlvICA9IE1hY19DbG9zZUF1ZGlvOworICAgIHRoaXMtPkxvY2tBdWRpbyAgID0gTWFjX0xvY2tBdWRpbzsKKyAgICB0aGlzLT5VbmxvY2tBdWRpbyA9IE1hY19VbmxvY2tBdWRpbzsKKyAgICB0aGlzLT5mcmVlICAgICAgICA9IEF1ZGlvX0RlbGV0ZURldmljZTsKKworI2lmZGVmIF9fTUFDT1NYX18JLyogTWFjIE9TIFggdXNlcyB0aHJlYWRlZCBhdWRpbywgc28gbm9ybWFsIHRocmVhZCBjb2RlIGlzIG9rYXkgKi8KKyAgICB0aGlzLT5Mb2NrQXVkaW8gICA9IE5VTEw7CisgICAgdGhpcy0+VW5sb2NrQXVkaW8gPSBOVUxMOworI2VuZGlmCisgICAgcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIFNORE1HUl9ib290c3RyYXAgPSB7CisJInNuZG1nciIsICJNYWNPUyBTb3VuZE1hbmFnZXIgMy4wIiwKKwlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworI2lmIGRlZmluZWQoVEFSR0VUX0FQSV9NQUNfQ0FSQk9OKSB8fCBkZWZpbmVkKFVTRV9SWUFOU19TT1VORENPREUpCisvKiBUaGlzIHdvcmtzIGNvcnJlY3RseSBvbiBNYWMgT1MgWCAqLworCisjcHJhZ21hIG9wdGlvbnMgYWxpZ249cG93ZXIKKworc3RhdGljIHZvbGF0aWxlIFNJbnQzMiBhdWRpb19pc19sb2NrZWQgPSAwOworc3RhdGljIHZvbGF0aWxlIFNJbnQzMiBuZWVkX3RvX21peCA9IDA7CisKK3N0YXRpYyBVSW50OCAgKmJ1ZmZlclsyXTsKK3N0YXRpYyB2b2xhdGlsZSBVSW50MzIgcnVubmluZyA9IDA7CitzdGF0aWMgQ21wU291bmRIZWFkZXIgaGVhZGVyOworc3RhdGljIHZvbGF0aWxlIFVpbnQzMiBmaWxsX21lID0gMDsKKworc3RhdGljIHZvaWQgbWl4X2J1ZmZlcihTRExfQXVkaW9EZXZpY2UgKmF1ZGlvLCBVSW50OCAqYnVmZmVyKQoreworICAgaWYgKCAhIGF1ZGlvLT5wYXVzZWQgKSB7CisjaWZkZWYgX19NQUNPU1hfXworICAgICAgICBTRExfbXV0ZXhQKGF1ZGlvLT5taXhlcl9sb2NrKTsKKyNlbmRpZgorICAgICAgICBpZiAoIGF1ZGlvLT5jb252ZXJ0Lm5lZWRlZCApIHsKKyAgICAgICAgICAgIGF1ZGlvLT5zcGVjLmNhbGxiYWNrKGF1ZGlvLT5zcGVjLnVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAoVWludDggKilhdWRpby0+Y29udmVydC5idWYsYXVkaW8tPmNvbnZlcnQubGVuKTsKKyAgICAgICAgICAgIFNETF9Db252ZXJ0QXVkaW8oJmF1ZGlvLT5jb252ZXJ0KTsKKyAgICAgICAgICAgIGlmICggYXVkaW8tPmNvbnZlcnQubGVuX2N2dCAhPSBhdWRpby0+c3BlYy5zaXplICkgeworICAgICAgICAgICAgICAgIC8qIFVoIG9oLi4uIHByb2JhYmx5IGNyYXNoZXMgaGVyZSAqLzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNETF9tZW1jcHkoYnVmZmVyLCBhdWRpby0+Y29udmVydC5idWYsIGF1ZGlvLT5jb252ZXJ0Lmxlbl9jdnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXVkaW8tPnNwZWMuY2FsbGJhY2soYXVkaW8tPnNwZWMudXNlcmRhdGEsIGJ1ZmZlciwgYXVkaW8tPnNwZWMuc2l6ZSk7CisgICAgICAgIH0KKyNpZmRlZiBfX01BQ09TWF9fCisgICAgICAgIFNETF9tdXRleFYoYXVkaW8tPm1peGVyX2xvY2spOworI2VuZGlmCisgICAgfQorCisgICAgRGVjcmVtZW50QXRvbWljKChTSW50MzIgKikgJm5lZWRfdG9fbWl4KTsKK30KKworc3RhdGljIHZvaWQgTWFjX0xvY2tBdWRpbyhfVEhJUykKK3sKKyAgICBJbmNyZW1lbnRBdG9taWMoKFNJbnQzMiAqKSAmYXVkaW9faXNfbG9ja2VkKTsKK30KKworc3RhdGljIHZvaWQgTWFjX1VubG9ja0F1ZGlvKF9USElTKQoreworICAgIFNJbnQzMiBvbGR2YWw7CisgICAgICAgICAKKyAgICBvbGR2YWwgPSBEZWNyZW1lbnRBdG9taWMoKFNJbnQzMiAqKSAmYXVkaW9faXNfbG9ja2VkKTsKKyAgICBpZiAoIG9sZHZhbCAhPSAxICkgIC8qICE9IDEgbWVhbnMgYXVkaW8gaXMgc3RpbGwgbG9ja2VkLiAqLworICAgICAgICByZXR1cm47CisKKyAgICAvKiBEaWQgd2UgbWlzcyB0aGUgY2hhbmNlIHRvIG1peCBpbiBhbiBpbnRlcnJ1cHQ/IERvIGl0IG5vdy4gKi8KKyAgICBpZiAoIEJpdEFuZEF0b21pYyAoMHhGRkZGRkZGRiwgKFVJbnQzMiAqKSAmbmVlZF90b19taXgpICkgeworICAgICAgICAvKgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0gaWYgeW91IG1pc3NlZCBhbiBpbnRlcnJ1cHQKKyAgICAgICAgICogIHdoaWxlIHRoZSBhdWRpbyB3YXMgbG9ja2VkLCBhbmQgZ2V0IHByZWVtcHRlZCBieSBhIHNlY29uZAorICAgICAgICAgKiAgaW50ZXJydXB0IGhlcmUsIGJ1dCB0aGF0IG1lYW5zIHlvdSBsb2NrZWQgZm9yIHdheSB0b28gbG9uZyBhbnlob3cuCisgICAgICAgICAqLworICAgICAgICBtaXhfYnVmZmVyICh0aGlzLCBidWZmZXJbZmlsbF9tZV0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2FsbEJhY2tQcm9jIChTbmRDaGFubmVsICpjaGFuLCBTbmRDb21tYW5kICpjbWRfcGFzc2VkICkgeworICAgVUludDMyIHBsYXlfbWU7CisgICBTbmRDb21tYW5kIGNtZDsgCisgICBTRExfQXVkaW9EZXZpY2UgKmF1ZGlvID0gKFNETF9BdWRpb0RldmljZSAqKWNoYW4tPnVzZXJJbmZvOworCisgICBJbmNyZW1lbnRBdG9taWMoKFNJbnQzMiAqKSAmbmVlZF90b19taXgpOworCisgICBmaWxsX21lID0gY21kX3Bhc3NlZC0+cGFyYW0yOyAgLyogYnVmZmVyIHRoYXQgaGFzIGp1c3QgZmluaXNoZWQgcGxheWluZywgc28gZmlsbCBpdCAqLyAgICAgIAorICAgcGxheV9tZSA9ICEgZmlsbF9tZTsgICAgICAgICAgIC8qIGZpbGxlZCBidWZmZXIgdG8gcGxheSBfbm93XyAqLworCisgICBpZiAoICEgYXVkaW8tPmVuYWJsZWQgKSB7CisgICAgICByZXR1cm47CisgICB9CisgICAKKyAgIC8qIHF1ZXVlIHByZXZpb3VzbHkgbWl4ZWQgYnVmZmVyIGZvciBwbGF5YmFjay4gKi8KKyAgIGhlYWRlci5zYW1wbGVQdHIgPSAoUHRyKWJ1ZmZlcltwbGF5X21lXTsKKyAgIGNtZC5jbWQgPSBidWZmZXJDbWQ7CisgICBjbWQucGFyYW0xID0gMDsgCisgICBjbWQucGFyYW0yID0gKGxvbmcpJmhlYWRlcjsKKyAgIFNuZERvQ29tbWFuZCAoY2hhbiwgJmNtZCwgMCk7CisKKyAgIG1lbXNldCAoYnVmZmVyW2ZpbGxfbWVdLCAwLCBhdWRpby0+c3BlYy5zaXplKTsKKworICAgLyoKKyAgICAqIGlmIGF1ZGlvIGRldmljZSBpc24ndCBsb2NrZWQsIG1peCB0aGUgbmV4dCBidWZmZXIgdG8gYmUgcXVldWVkIGluCisgICAgKiAgdGhlIG1lbW9yeSBibG9jayB0aGF0IGp1c3QgZmluaXNoZWQgcGxheWluZy4KKyAgICAqLworICAgaWYgKCAhIEJpdEFuZEF0b21pYygweEZGRkZGRkZGLCAoVUludDMyICopICZhdWRpb19pc19sb2NrZWQpICkgeworICAgICAgbWl4X2J1ZmZlciAoYXVkaW8sIGJ1ZmZlcltmaWxsX21lXSk7CisgICB9IAorCisgICAvKiBzZXQgdGhpcyBjYWxsYmFjayB0byBydW4gYWdhaW4gd2hlbiBjdXJyZW50IGJ1ZmZlciBkcmFpbnMuICovCisgICBpZiAoIHJ1bm5pbmcgKSB7CisgICAgICBjbWQuY21kID0gY2FsbEJhY2tDbWQ7CisgICAgICBjbWQucGFyYW0xID0gMDsKKyAgICAgIGNtZC5wYXJhbTIgPSBwbGF5X21lOworICAgCisgICAgICBTbmREb0NvbW1hbmQgKGNoYW4sICZjbWQsIDApOworICAgfQorfQorCitzdGF0aWMgaW50IE1hY19PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpIHsKKworICAgU25kQ2FsbEJhY2tVUFAgY2FsbGJhY2s7CisgICBpbnQgc2FtcGxlX2JpdHM7CisgICBpbnQgaTsKKyAgIGxvbmcgaW5pdE9wdGlvbnM7CisgICAgICAKKyAgIC8qIFZlcnkgZmV3IGNvbnZlcnNpb25zIGFyZSByZXF1aXJlZCwgYnV0Li4uICovCisgICAgc3dpdGNoIChzcGVjLT5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19TODoKKyAgICAgICAgc3BlYy0+Zm9ybWF0ID0gQVVESU9fVTg7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1UxNkxTQjoKKyAgICAgICAgc3BlYy0+Zm9ybWF0ID0gQVVESU9fUzE2TFNCOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19VMTZNU0I6CisgICAgICAgIHNwZWMtPmZvcm1hdCA9IEFVRElPX1MxNk1TQjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisgICAgCisgICAgLyogaW5pdGlhbGl6ZSBidWZmZXJDbWQgaGVhZGVyICovCisgICAgbWVtc2V0ICgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisgICAgY2FsbGJhY2sgPSAoU25kQ2FsbEJhY2tVUFApIE5ld1NuZENhbGxCYWNrVVBQIChjYWxsQmFja1Byb2MpOworICAgIHNhbXBsZV9iaXRzID0gc3BlYy0+c2l6ZSAvIHNwZWMtPnNhbXBsZXMgLyBzcGVjLT5jaGFubmVscyAqIDg7CisKKyNpZmRlZiBERUJVR19BVURJTworICAgIGZwcmludGYoc3RkZXJyLAorCSJBdWRpbyBmb3JtYXQgMHgleCwgY2hhbm5lbHMgPSAlZCwgc2FtcGxlX2JpdHMgPSAlZCwgZnJlcXVlbmN5ID0gJWRcbiIsCisJc3BlYy0+Zm9ybWF0LCBzcGVjLT5jaGFubmVscywgc2FtcGxlX2JpdHMsIHNwZWMtPmZyZXEpOworI2VuZGlmIC8qIERFQlVHX0FVRElPICovCisgICAgCisgICAgaGVhZGVyLm51bUNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7CisgICAgaGVhZGVyLnNhbXBsZVNpemUgID0gc2FtcGxlX2JpdHM7CisgICAgaGVhZGVyLnNhbXBsZVJhdGUgID0gc3BlYy0+ZnJlcSA8PCAxNjsKKyAgICBoZWFkZXIubnVtRnJhbWVzICAgPSBzcGVjLT5zYW1wbGVzOworICAgIGhlYWRlci5lbmNvZGUgICAgICA9IGNtcFNIOworICAgIAorICAgIC8qIE5vdGUgdGhhdCB3ZSBpbnN0YWxsIHRoZSAxNmJpdExpdHRsZUVuZGlhbiBDb252ZXJ0ZXIgaWYgbmVlZGVkLiAqLworICAgIGlmICggc3BlYy0+Zm9ybWF0ID09IDB4ODAxMCApIHsKKyAgICAgICAgaGVhZGVyLmNvbXByZXNzaW9uSUQgPSBmaXhlZENvbXByZXNzaW9uOworICAgICAgICBoZWFkZXIuZm9ybWF0ID0gazE2Qml0TGl0dGxlRW5kaWFuRm9ybWF0OworICAgIH0KKyAgICAKKyAgICAvKiBhbGxvY2F0ZSAyIGJ1ZmZlcnMgKi8KKyAgICBmb3IgKGk9MDsgaTwyOyBpKyspIHsKKyAgICAgICBidWZmZXJbaV0gPSAoVUludDgqKW1hbGxvYyAoc2l6ZW9mKFVJbnQ4KSAqIHNwZWMtPnNpemUpOworICAgICAgaWYgKGJ1ZmZlcltpXSA9PSBOVUxMKSB7CisgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgfQorICAgICBtZW1zZXQgKGJ1ZmZlcltpXSwgMCwgc3BlYy0+c2l6ZSk7CisgICB9CisgICAKKyAgIC8qIENyZWF0ZSB0aGUgc291bmQgbWFuYWdlciBjaGFubmVsICovCisgICAgY2hhbm5lbCA9IChTbmRDaGFubmVsUHRyKVNETF9tYWxsb2Moc2l6ZW9mKCpjaGFubmVsKSk7CisgICAgaWYgKCBjaGFubmVsID09IE5VTEwgKSB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBpZiAoIHNwZWMtPmNoYW5uZWxzID49IDIgKSB7CisgICAgICAgIGluaXRPcHRpb25zID0gaW5pdFN0ZXJlbzsKKyAgICB9IGVsc2UgeworICAgICAgICBpbml0T3B0aW9ucyA9IGluaXRNb25vOworICAgIH0KKyAgICBjaGFubmVsLT51c2VySW5mbyA9IChsb25nKXRoaXM7CisgICAgY2hhbm5lbC0+cUxlbmd0aCA9IDEyODsKKyAgICBpZiAoIFNuZE5ld0NoYW5uZWwoJmNoYW5uZWwsIHNhbXBsZWRTeW50aCwgaW5pdE9wdGlvbnMsIGNhbGxiYWNrKSAhPSBub0VyciApIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIGNoYW5uZWwiKTsKKyAgICAgICAgU0RMX2ZyZWUoY2hhbm5lbCk7CisgICAgICAgIGNoYW5uZWwgPSBOVUxMOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgIAorICAgLyogc3RhcnQgcGxheWJhY2sgKi8KKyAgIHsKKyAgICAgIFNuZENvbW1hbmQgY21kOworICAgICAgY21kLmNtZCA9IGNhbGxCYWNrQ21kOworICAgICAgY21kLnBhcmFtMiA9IDA7CisgICAgICBydW5uaW5nID0gMTsKKyAgICAgIFNuZERvQ29tbWFuZCAoY2hhbm5lbCwgJmNtZCwgMCk7CisgICB9CisgICAKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBNYWNfQ2xvc2VBdWRpbyhfVEhJUykgeworICAgCisgICBpbnQgaTsKKyAgIAorICAgcnVubmluZyA9IDA7CisgICAKKyAgIGlmIChjaGFubmVsKSB7CisgICAgICBTbmREaXNwb3NlQ2hhbm5lbCAoY2hhbm5lbCwgdHJ1ZSk7CisgICAgICBjaGFubmVsID0gTlVMTDsKKyAgIH0KKyAgIAorICAgIGZvciAoIGk9MDsgaTwyOyArK2kgKSB7CisgICAgICAgIGlmICggYnVmZmVyW2ldICkgeworICAgICAgICAgICAgU0RMX2ZyZWUoYnVmZmVyW2ldKTsKKyAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNlbHNlIC8qICFUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgIVVTRV9SWUFOU19TT1VORENPREUgKi8KKworc3RhdGljIHZvaWQgTWFjX0xvY2tBdWRpbyhfVEhJUykKK3sKKyAgICAvKiBuby1vcC4gKi8KK30KKworc3RhdGljIHZvaWQgTWFjX1VubG9ja0F1ZGlvKF9USElTKQoreworICAgIC8qIG5vLW9wLiAqLworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFNvdW5kIE1hbmFnZXIgd2hlbiBpdCBoYXMgZXhoYXVzdGVkIG9uZSBvZgorICAgdGhlIGJ1ZmZlcnMsIHNvIHdlJ2xsIHplcm8gaXQgdG8gc2lsZW5jZSBhbmQgZmlsbCBpdCB3aXRoIGF1ZGlvIGlmCisgICB3ZSdyZSBub3QgcGF1c2VkLgorKi8KK3N0YXRpYyBwYXNjYWwKK3ZvaWQgc25kRG91YmxlQmFja1Byb2MgKFNuZENoYW5uZWxQdHIgY2hhbiwgU25kRG91YmxlQnVmZmVyUHRyIG5ld2J1ZikKK3sKKyAgICBTRExfQXVkaW9EZXZpY2UgKmF1ZGlvID0gKFNETF9BdWRpb0RldmljZSAqKW5ld2J1Zi0+ZGJVc2VySW5mb1swXTsKKworICAgIC8qIElmIGF1ZGlvIGlzIHF1aXR0aW5nLCBkb24ndCBkbyBhbnl0aGluZyAqLworICAgIGlmICggISBhdWRpby0+ZW5hYmxlZCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1zZXQgKG5ld2J1Zi0+ZGJTb3VuZERhdGEsIDAsIGF1ZGlvLT5zcGVjLnNpemUpOworICAgIG5ld2J1Zi0+ZGJOdW1GcmFtZXMgPSBhdWRpby0+c3BlYy5zYW1wbGVzOworICAgIGlmICggISBhdWRpby0+cGF1c2VkICkgeworICAgICAgICBpZiAoIGF1ZGlvLT5jb252ZXJ0Lm5lZWRlZCApIHsKKyAgICAgICAgICAgIGF1ZGlvLT5zcGVjLmNhbGxiYWNrKGF1ZGlvLT5zcGVjLnVzZXJkYXRhLAorICAgICAgICAgICAgICAgIChVaW50OCAqKWF1ZGlvLT5jb252ZXJ0LmJ1ZixhdWRpby0+Y29udmVydC5sZW4pOworICAgICAgICAgICAgU0RMX0NvbnZlcnRBdWRpbygmYXVkaW8tPmNvbnZlcnQpOworI2lmIDAKKyAgICAgICAgICAgIGlmICggYXVkaW8tPmNvbnZlcnQubGVuX2N2dCAhPSBhdWRpby0+c3BlYy5zaXplICkgeworICAgICAgICAgICAgICAgIC8qIFVoIG9oLi4uIHByb2JhYmx5IGNyYXNoZXMgaGVyZSAqLzsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgU0RMX21lbWNweShuZXdidWYtPmRiU291bmREYXRhLCBhdWRpby0+Y29udmVydC5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8tPmNvbnZlcnQubGVuX2N2dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdWRpby0+c3BlYy5jYWxsYmFjayhhdWRpby0+c3BlYy51c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAoVWludDggKiluZXdidWYtPmRiU291bmREYXRhLCBhdWRpby0+c3BlYy5zaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuZXdidWYtPmRiRmxhZ3MgICAgfD0gZGJCdWZmZXJSZWFkeTsKK30KKworc3RhdGljIGludCBEb3VibGVCdWZmZXJBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKyAgICBpbnQgYXZhaWxhYmxlOworICAgIE51bVZlcnNpb24gc25kdmVyc2lvbjsKKyAgICBsb25nIHJlc3BvbnNlOworCisgICAgYXZhaWxhYmxlID0gMDsKKyAgICBzbmR2ZXJzaW9uID0gU25kU291bmRNYW5hZ2VyVmVyc2lvbigpOworICAgIGlmICggc25kdmVyc2lvbi5tYWpvclJldiA+PSAzICkgeworICAgICAgICBpZiAoIEdlc3RhbHQoZ2VzdGFsdFNvdW5kQXR0ciwgJnJlc3BvbnNlKSA9PSBub0VyciApIHsKKyAgICAgICAgICAgIGlmICggKHJlc3BvbnNlICYgKDEgPDwgZ2VzdGFsdFNuZFBsYXlEb3VibGVCdWZmZXIpKSApIHsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBHZXN0YWx0KGdlc3RhbHRTb3VuZEF0dHIsICZyZXNwb25zZSkgPT0gbm9FcnIgKSB7CisgICAgICAgICAgICBpZiAoIChyZXNwb25zZSAmICgxIDw8IGdlc3RhbHRIYXNBU0MpKSApIHsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybihhdmFpbGFibGUpOworfQorCitzdGF0aWMgdm9pZCBNYWNfQ2xvc2VBdWRpbyhfVEhJUykKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICggY2hhbm5lbCAhPSBOVUxMICkgeworICAgICAgICAvKiBDbGVhbiB1cCB0aGUgYXVkaW8gY2hhbm5lbCAqLworICAgICAgICBTbmREaXNwb3NlQ2hhbm5lbChjaGFubmVsLCB0cnVlKTsKKyAgICAgICAgY2hhbm5lbCA9IE5VTEw7CisgICAgfQorICAgIGZvciAoIGk9MDsgaTwyOyArK2kgKSB7CisgICAgICAgIGlmICggYXVkaW9fYnVmW2ldICkgeworICAgICAgICAgICAgU0RMX2ZyZWUoYXVkaW9fYnVmW2ldKTsKKyAgICAgICAgICAgIGF1ZGlvX2J1ZltpXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgTWFjX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKyAgICBTbmREb3VibGVCdWZmZXJIZWFkZXIyIGF1ZGlvX2RiaDsKKyAgICBpbnQgaTsKKyAgICBsb25nIGluaXRPcHRpb25zOworICAgIGludCBzYW1wbGVfYml0czsKKyAgICBTbmREb3VibGVCYWNrVVBQIGRvdWJsZUJhY2tQcm9jOworCisgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGRvdWJsZS1idWZmZXJlZCBhdWRpbyBpcyBhdmFpbGFibGUgKi8KKyAgICBpZiAoICEgRG91YmxlQnVmZmVyQXVkaW9fQXZhaWxhYmxlKCkgKSB7CisgICAgICAgIFNETF9TZXRFcnJvcigiU291bmQgbWFuYWdlciBkb2Vzbid0IHN1cHBvcnQgZG91YmxlLWJ1ZmZlcmluZyIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIFZlcnkgZmV3IGNvbnZlcnNpb25zIGFyZSByZXF1aXJlZCwgYnV0Li4uICovCisgICAgc3dpdGNoIChzcGVjLT5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19TODoKKyAgICAgICAgc3BlYy0+Zm9ybWF0ID0gQVVESU9fVTg7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1UxNkxTQjoKKyAgICAgICAgc3BlYy0+Zm9ybWF0ID0gQVVESU9fUzE2TFNCOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19VMTZNU0I6CisgICAgICAgIHNwZWMtPmZvcm1hdCA9IEFVRElPX1MxNk1TQjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBkb3VibGUtYmFjayBoZWFkZXIgKi8KKyAgICBTRExfbWVtc2V0KCZhdWRpb19kYmgsIDAsIHNpemVvZihhdWRpb19kYmgpKTsKKyAgICBkb3VibGVCYWNrUHJvYyA9IE5ld1NuZERvdWJsZUJhY2tQcm9jIChzbmREb3VibGVCYWNrUHJvYyk7CisgICAgc2FtcGxlX2JpdHMgPSBzcGVjLT5zaXplIC8gc3BlYy0+c2FtcGxlcyAvIHNwZWMtPmNoYW5uZWxzICogODsKKyAgICAKKyAgICBhdWRpb19kYmguZGJoTnVtQ2hhbm5lbHMgPSBzcGVjLT5jaGFubmVsczsKKyAgICBhdWRpb19kYmguZGJoU2FtcGxlU2l6ZSAgICA9IHNhbXBsZV9iaXRzOworICAgIGF1ZGlvX2RiaC5kYmhDb21wcmVzc2lvbklEID0gMDsKKyAgICBhdWRpb19kYmguZGJoUGFja2V0U2l6ZSAgICA9IDA7CisgICAgYXVkaW9fZGJoLmRiaFNhbXBsZVJhdGUgICAgPSBzcGVjLT5mcmVxIDw8IDE2OworICAgIGF1ZGlvX2RiaC5kYmhEb3VibGVCYWNrICAgID0gZG91YmxlQmFja1Byb2M7CisgICAgYXVkaW9fZGJoLmRiaEZvcm1hdCAgICA9IDA7CisKKyAgICAvKiBOb3RlIHRoYXQgd2UgaW5zdGFsbCB0aGUgMTZiaXRMaXR0bGVFbmRpYW4gQ29udmVydGVyIGlmIG5lZWRlZC4gKi8KKyAgICBpZiAoIHNwZWMtPmZvcm1hdCA9PSAweDgwMTAgKSB7CisgICAgICAgIGF1ZGlvX2RiaC5kYmhDb21wcmVzc2lvbklEID0gZml4ZWRDb21wcmVzc2lvbjsKKyAgICAgICAgYXVkaW9fZGJoLmRiaEZvcm1hdCA9IGsxNkJpdExpdHRsZUVuZGlhbkZvcm1hdDsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSB0aGUgMiBkb3VibGUtYmFjayBidWZmZXJzICovCisgICAgZm9yICggaT0wOyBpPDI7ICsraSApIHsKKyAgICAgICAgYXVkaW9fYnVmW2ldID0gU0RMX2NhbGxvYygxLCBzaXplb2YoU25kRG91YmxlQnVmZmVyKStzcGVjLT5zaXplKTsKKyAgICAgICAgaWYgKCBhdWRpb19idWZbaV0gPT0gTlVMTCApIHsKKyAgICAgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb19idWZbaV0tPmRiTnVtRnJhbWVzID0gc3BlYy0+c2FtcGxlczsKKyAgICAgICAgYXVkaW9fYnVmW2ldLT5kYkZsYWdzID0gZGJCdWZmZXJSZWFkeTsKKyAgICAgICAgYXVkaW9fYnVmW2ldLT5kYlVzZXJJbmZvWzBdID0gKGxvbmcpdGhpczsKKyAgICAgICAgYXVkaW9fZGJoLmRiaEJ1ZmZlclB0cltpXSA9IGF1ZGlvX2J1ZltpXTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgdGhlIHNvdW5kIG1hbmFnZXIgY2hhbm5lbCAqLworICAgIGNoYW5uZWwgPSAoU25kQ2hhbm5lbFB0cilTRExfbWFsbG9jKHNpemVvZigqY2hhbm5lbCkpOworICAgIGlmICggY2hhbm5lbCA9PSBOVUxMICkgeworICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgaWYgKCBzcGVjLT5jaGFubmVscyA+PSAyICkgeworICAgICAgICBpbml0T3B0aW9ucyA9IGluaXRTdGVyZW87CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5pdE9wdGlvbnMgPSBpbml0TW9ubzsKKyAgICB9CisgICAgY2hhbm5lbC0+dXNlckluZm8gPSAwOworICAgIGNoYW5uZWwtPnFMZW5ndGggPSAxMjg7CisgICAgaWYgKCBTbmROZXdDaGFubmVsKCZjaGFubmVsLCBzYW1wbGVkU3ludGgsIGluaXRPcHRpb25zLCAwTCkgIT0gbm9FcnIgKSB7CisgICAgICAgIFNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyBjaGFubmVsIik7CisgICAgICAgIFNETF9mcmVlKGNoYW5uZWwpOworICAgICAgICBjaGFubmVsID0gTlVMTDsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgCisgICAgLyogU3RhcnQgcGxheWJhY2sgKi8KKyAgICBpZiAoIFNuZFBsYXlEb3VibGVCdWZmZXIoY2hhbm5lbCwgKFNuZERvdWJsZUJ1ZmZlckhlYWRlclB0cikmYXVkaW9fZGJoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBub0VyciApIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJVbmFibGUgdG8gcGxheSBkb3VibGUgYnVmZmVyZWQgYXVkaW8iKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBUQVJHRVRfQVBJX01BQ19DQVJCT04gfHwgVVNFX1JZQU5TX1NPVU5EQ09ERSAqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21hY3JvbS9TRExfcm9tYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbWFjcm9tL1NETF9yb21hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZTE5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21hY3JvbS9TRExfcm9tYXVkaW8uaApAQCAtMCwwICsxLDUwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX3JvbWF1ZGlvX2gKKyNkZWZpbmUgX1NETF9yb21hdWRpb19oCisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogVGhpcyBpcyBSeWFuJ3MgaW1wcm92ZWQgTWFjT1Mgc291bmQgY29kZSwgd2l0aCBsb2NraW5nIHN1cHBvcnQgKi8KKyNkZWZpbmUgVVNFX1JZQU5TX1NPVU5EQ09ERQorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCisKK3N0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7CisJLyogU291bmQgbWFuYWdlciBhdWRpbyBjaGFubmVsICovCisJU25kQ2hhbm5lbFB0ciBjaGFubmVsOworI2lmIGRlZmluZWQoVEFSR0VUX0FQSV9NQUNfQ0FSQk9OKSB8fCBkZWZpbmVkKFVTRV9SWUFOU19TT1VORENPREUpCisJLyogRklYTUU6IEFkZCBSeWFuJ3Mgc3RhdGljIGRhdGEgaGVyZSAqLworI2Vsc2UKKwkvKiBEb3VibGUgYnVmZmVyaW5nIHZhcmlhYmxlcyAqLworCVNuZERvdWJsZUJ1ZmZlclB0ciBhdWRpb19idWZbMl07CisjZW5kaWYKK307CisKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBjaGFubmVsCQkodGhpcy0+aGlkZGVuLT5jaGFubmVsKQorI2RlZmluZSBhdWRpb19idWYJKHRoaXMtPmhpZGRlbi0+YXVkaW9fYnVmKQorCisjZW5kaWYgLyogX1NETF9yb21hdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmJhNjkwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW8uYwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJQXVkaW8gaW50ZXJydXB0IHZhcmlhYmxlcyBhbmQgY2FsbGJhY2sgZnVuY3Rpb24KKworCVBhdHJpY2UgTWFuZGluCisqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxtaW50L29zYmluZC5oPgorI2luY2x1ZGUgPG1pbnQvZmFsY29uLmg+CisjaW5jbHVkZSA8bWludC9taW50YmluZC5oPgorI2luY2x1ZGUgPG1pbnQvY29va2llLmg+CisKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICJTRExfbWludGF1ZGlvLmgiCisjaW5jbHVkZSAiU0RMX21pbnRhdWRpb19zdGZhLmgiCisKKy8qIFRoZSBhdWRpbyBkZXZpY2UgKi8KKworU0RMX0F1ZGlvRGV2aWNlICpTRExfTWludEF1ZGlvX2RldmljZTsKK1VpbnQ4ICpTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzJdOwkvKiBQb2ludGVycyB0byBidWZmZXJzICovCit1bnNpZ25lZCBsb25nIFNETF9NaW50QXVkaW9fYXVkaW9zaXplOwkJLyogTGVuZ3RoIG9mIGF1ZGlvIGJ1ZmZlcj1zcGVjLT5zaXplICovCit2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBTRExfTWludEF1ZGlvX251bWJ1ZjsJCS8qIEJ1ZmZlciB0byBwbGF5ICovCit2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBTRExfTWludEF1ZGlvX211dGV4Owordm9sYXRpbGUgdW5zaWduZWQgbG9uZyBTRExfTWludEF1ZGlvX2Nsb2NrdGljczsKK2Nvb2tpZV9zdGZhX3QJKlNETF9NaW50QXVkaW9fc3RmYTsKK3Vuc2lnbmVkIHNob3J0IFNETF9NaW50QXVkaW9faGFzZnB1OworCisvKiBNaU5UIHRocmVhZCB2YXJpYWJsZXMgKi8KK1NETF9ib29sIFNETF9NaW50QXVkaW9fbWludF9wcmVzZW50OworU0RMX2Jvb2wgU0RMX01pbnRBdWRpb19xdWl0X3RocmVhZDsKK1NETF9ib29sIFNETF9NaW50QXVkaW9fdGhyZWFkX2ZpbmlzaGVkOworbG9uZyBTRExfTWludEF1ZGlvX3RocmVhZF9waWQ7CisKKy8qIFRoZSBjYWxsYmFjayBmdW5jdGlvbiwgY2FsbGVkIGJ5IGVhY2ggZHJpdmVyIHdoZW5ldmVyIG5lZWRlZCAqLworCit2b2lkIFNETF9NaW50QXVkaW9fQ2FsbGJhY2sodm9pZCkKK3sKKwlVaW50OCAqYnVmZmVyOworCVNETF9BdWRpb0RldmljZSAqYXVkaW8gPSBTRExfTWludEF1ZGlvX2RldmljZTsKKworIAlidWZmZXIgPSBTRExfTWludEF1ZGlvX2F1ZGlvYnVmW1NETF9NaW50QXVkaW9fbnVtYnVmXTsKKwlTRExfbWVtc2V0KGJ1ZmZlciwgYXVkaW8tPnNwZWMuc2lsZW5jZSwgYXVkaW8tPnNwZWMuc2l6ZSk7CisKKwlpZiAoYXVkaW8tPnBhdXNlZCkKKwkJcmV0dXJuOworCisJaWYgKGF1ZGlvLT5jb252ZXJ0Lm5lZWRlZCkgeworCQlpbnQgc2lsZW5jZTsKKworCQlpZiAoIGF1ZGlvLT5jb252ZXJ0LnNyY19mb3JtYXQgPT0gQVVESU9fVTggKSB7CisJCQlzaWxlbmNlID0gMHg4MDsKKwkJfSBlbHNlIHsKKwkJCXNpbGVuY2UgPSAwOworCQl9CisJCVNETF9tZW1zZXQoYXVkaW8tPmNvbnZlcnQuYnVmLCBzaWxlbmNlLCBhdWRpby0+Y29udmVydC5sZW4pOworCQlhdWRpby0+c3BlYy5jYWxsYmFjayhhdWRpby0+c3BlYy51c2VyZGF0YSwKKwkJCShVaW50OCAqKWF1ZGlvLT5jb252ZXJ0LmJ1ZixhdWRpby0+Y29udmVydC5sZW4pOworCQlTRExfQ29udmVydEF1ZGlvKCZhdWRpby0+Y29udmVydCk7CisJCVNETF9tZW1jcHkoYnVmZmVyLCBhdWRpby0+Y29udmVydC5idWYsIGF1ZGlvLT5jb252ZXJ0Lmxlbl9jdnQpOworCX0gZWxzZSB7CisJCWF1ZGlvLT5zcGVjLmNhbGxiYWNrKGF1ZGlvLT5zcGVjLnVzZXJkYXRhLCBidWZmZXIsIGF1ZGlvLT5zcGVjLnNpemUpOworCX0KK30KKworLyogQWRkIGEgbmV3IGZyZXF1ZW5jeS9jbG9jay9wcmVkaXZpc29yIHRvIHRoZSBjdXJyZW50IGxpc3QgKi8KK3ZvaWQgU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3koX1RISVMsIFVpbnQzMiBmcmVxdWVuY3ksIFVpbnQzMiBjbG9jaywKKwlVaW50MzIgcHJlZGl2LCBpbnQgZ3Bpb19iaXRzKQoreworCWludCBpLCBwOworCisJaWYgKE1JTlRBVURJT19mcmVxY291bnQ9PU1JTlRBVURJT19tYXhmcmVxcykgeworCQlyZXR1cm47CisJfQorCisJLyogU2VhcmNoIHdoZXJlIHRvIGluc2VydCB0aGUgZnJlcXVlbmN5IChoaWdoZXN0IGZpcnN0KSAqLworCWZvciAocD0wOyBwPE1JTlRBVURJT19mcmVxY291bnQ7IHArKykgeworCQlpZiAoZnJlcXVlbmN5ID4gTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW3BdLmZyZXF1ZW5jeSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBQdXQgYWxsIGZvbGxvd2luZyBvbmVzIGZhcmVyICovCisJaWYgKE1JTlRBVURJT19mcmVxY291bnQ+MCkgeworCQlmb3IgKGk9TUlOVEFVRElPX2ZyZXFjb3VudDsgaT5wOyBpLS0pIHsKKwkJCVNETF9tZW1jcHkoJk1JTlRBVURJT19mcmVxdWVuY2llc1tpXSwgJk1JTlRBVURJT19mcmVxdWVuY2llc1tpLTFdLCBzaXplb2YobWludF9mcmVxdWVuY3lfdCkpOworCQl9CisJfQorCisJLyogQW5kIGluc2VydCBuZXcgb25lICovCisJTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW3BdLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKwlNSU5UQVVESU9fZnJlcXVlbmNpZXNbcF0ubWFzdGVyY2xvY2sgPSBjbG9jazsKKwlNSU5UQVVESU9fZnJlcXVlbmNpZXNbcF0ucHJlZGl2aXNvciA9IHByZWRpdjsKKwlNSU5UQVVESU9fZnJlcXVlbmNpZXNbcF0uZ3Bpb19iaXRzID0gZ3Bpb19iaXRzOworCisJTUlOVEFVRElPX2ZyZXFjb3VudCsrOworfQorCisvKiBTZWFyY2ggZm9yIHRoZSBuZWFyZXN0IGZyZXF1ZW5jeSAqLworaW50IFNETF9NaW50QXVkaW9fU2VhcmNoRnJlcXVlbmN5KF9USElTLCBpbnQgZGVzaXJlZF9mcmVxKQoreworCWludCBpOworCisJLyogT25seSAxIGZyZXEgPyAqLworCWlmIChNSU5UQVVESU9fZnJlcWNvdW50PT0xKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIHRoZSBhcnJheSAqLworCWZvciAoaT0wOyBpPE1JTlRBVURJT19mcmVxY291bnQ7IGkrKykgeworCQlpZiAoZGVzaXJlZF9mcmVxID49ICgoTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW2ldLmZyZXF1ZW5jeSsKKwkJCU1JTlRBVURJT19mcmVxdWVuY2llc1tpKzFdLmZyZXF1ZW5jeSk+PjEpKSB7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKworCS8qIE5vdCBpbiB0aGUgYXJyYXksIGdpdmUgdGhlIGxhdGVzdCAqLworCXJldHVybiBNSU5UQVVESU9fZnJlcWNvdW50LTE7Cit9CisKKy8qIENoZWNrIGlmIEZQVSBpcyBwcmVzZW50ICovCit2b2lkIFNETF9NaW50QXVkaW9fQ2hlY2tGcHUodm9pZCkKK3sKKwlsb25nIGNvb2tpZV9mcHU7CisKKwlTRExfTWludEF1ZGlvX2hhc2ZwdSA9IDA7CisJaWYgKEdldGNvb2tpZShDX19GUFUsICZjb29raWVfZnB1KSAhPSBDX0ZPVU5EKSB7CisJCXJldHVybjsKKwl9CisJc3dpdGNoICgoY29va2llX2ZwdT4+MTYpJjB4ZmZmZSkgeworCQljYXNlIDI6CisJCWNhc2UgNDoKKwkJY2FzZSA2OgorCQljYXNlIDg6CisJCWNhc2UgMTY6CisJCQlTRExfTWludEF1ZGlvX2hhc2ZwdSA9IDE7CisJCQlicmVhazsKKwl9Cit9CisKKy8qIFRoZSB0aHJlYWQgZnVuY3Rpb24sIHVzZWQgdW5kZXIgTWlOVCB3aXRoIHhiaW9zICovCitpbnQgU0RMX01pbnRBdWRpb19UaHJlYWQobG9uZyBwYXJhbSkKK3sKKwlTbmRCdWZQdHIJcG9pbnRlcnM7CisJU0RMX2Jvb2wJYnVmZmVyc19maWxsZWRbMl0gPSB7U0RMX0ZBTFNFLCBTRExfRkFMU0V9OworCisJU0RMX01pbnRBdWRpb190aHJlYWRfZmluaXNoZWQgPSBTRExfRkFMU0U7CisJd2hpbGUgKCFTRExfTWludEF1ZGlvX3F1aXRfdGhyZWFkKSB7CisJCWlmIChCdWZmcHRyKCZwb2ludGVycykhPTApCisJCQljb250aW51ZTsKKworCQlpZiAoKCAodW5zaWduZWQgbG9uZylwb2ludGVycy5wbGF5Pj0odW5zaWduZWQgbG9uZylTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKQorCQkJJiYgKCAodW5zaWduZWQgbG9uZylwb2ludGVycy5wbGF5PD0odW5zaWduZWQgbG9uZylTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdKSkgCisJCXsKKwkJCS8qIERNQSBpcyByZWFkaW5nIGJ1ZmZlciAjMCwgc2V0dXAgYnVmZmVyICMxIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKwkJCWlmICghYnVmZmVyc19maWxsZWRbMV0pIHsKKwkJCQlTRExfTWludEF1ZGlvX251bWJ1ZiA9IDE7CisJCQkJU0RMX01pbnRBdWRpb19DYWxsYmFjaygpOworCQkJCVNldGJ1ZmZlcigwLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdICsgU0RMX01pbnRBdWRpb19hdWRpb3NpemUpOworCQkJCWJ1ZmZlcnNfZmlsbGVkWzFdPVNETF9UUlVFOworCQkJCWJ1ZmZlcnNfZmlsbGVkWzBdPVNETF9GQUxTRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIERNQSBpcyByZWFkaW5nIGJ1ZmZlciAjMSwgc2V0dXAgYnVmZmVyICMwIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKwkJCWlmICghYnVmZmVyc19maWxsZWRbMF0pIHsKKwkJCQlTRExfTWludEF1ZGlvX251bWJ1ZiA9IDA7CisJCQkJU0RMX01pbnRBdWRpb19DYWxsYmFjaygpOworCQkJCVNldGJ1ZmZlcigwLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdICsgU0RMX01pbnRBdWRpb19hdWRpb3NpemUpOworCQkJCWJ1ZmZlcnNfZmlsbGVkWzBdPVNETF9UUlVFOworCQkJCWJ1ZmZlcnNfZmlsbGVkWzFdPVNETF9GQUxTRTsKKwkJCX0KKwkJfQorCisJCXVzbGVlcCgxMDApOworCX0KKwlTRExfTWludEF1ZGlvX3RocmVhZF9maW5pc2hlZCA9IFNETF9UUlVFOworCXJldHVybiAwOworfQorCit2b2lkIFNETF9NaW50QXVkaW9fV2FpdFRocmVhZCh2b2lkKQoreworCWlmICghU0RMX01pbnRBdWRpb19taW50X3ByZXNlbnQpCisJCXJldHVybjsKKworCWlmIChTRExfTWludEF1ZGlvX3RocmVhZF9maW5pc2hlZCkKKwkJcmV0dXJuOworCisJU0RMX01pbnRBdWRpb19xdWl0X3RocmVhZCA9IFNETF9UUlVFOworCXdoaWxlICghU0RMX01pbnRBdWRpb190aHJlYWRfZmluaXNoZWQpIHsKKwkJU3lpZWxkKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2MDU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCU1pTlQgYXVkaW8gZHJpdmVyCisKKwlQYXRyaWNlIE1hbmRpbgorKi8KKworI2lmbmRlZiBfU0RMX21pbnRhdWRpb19oCisjZGVmaW5lIF9TRExfbWludGF1ZGlvX2gKKworI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgorI2luY2x1ZGUgIlNETF9taW50YXVkaW9fc3RmYS5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSBhdWRpbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX0F1ZGlvRGV2aWNlICp0aGlzCisKKy8qIDE2IHByZWRpdmlzb3JzIHdpdGggMyBjbG9ja3MgbWF4LiAqLworI2RlZmluZSBNSU5UQVVESU9fbWF4ZnJlcXMJCSgxNiozKQkJCisKK3R5cGVkZWYgc3RydWN0IHsKKwlVaW50MzIJZnJlcXVlbmN5OworCVVpbnQzMgltYXN0ZXJjbG9jazsKKwlVaW50MzIJcHJlZGl2aXNvcjsKKwlpbnQJZ3Bpb19iaXRzOwkvKiBpbiBjYXNlIG9mIGV4dGVybmFsIGNsb2NrICovCit9IG1pbnRfZnJlcXVlbmN5X3Q7CisKK3N0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7CisJbWludF9mcmVxdWVuY3lfdAlmcmVxdWVuY2llc1tNSU5UQVVESU9fbWF4ZnJlcXNdOworCWludCAJZnJlcV9jb3VudDsJCS8qIE51bWJlciBvZiBmcmVxdWVuY2llcyBpbiB0aGUgYXJyYXkgKi8KKwlpbnQJCW51bWZyZXE7CQkvKiBOdW1iZXIgb2Ygc2VsZWN0ZWQgZnJlcXVlbmN5ICovCit9OworCisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKworI2RlZmluZSBNSU5UQVVESU9fZnJlcXVlbmNpZXMJKHRoaXMtPmhpZGRlbi0+ZnJlcXVlbmNpZXMpCisjZGVmaW5lIE1JTlRBVURJT19mcmVxY291bnQJCSh0aGlzLT5oaWRkZW4tPmZyZXFfY291bnQpCisjZGVmaW5lIE1JTlRBVURJT19udW1mcmVxCQkodGhpcy0+aGlkZGVuLT5udW1mcmVxKQorCisvKiBfTUNIIGNvb2tpZSAodmFsdWVzPj4xNikgKi8KK2VudW0geworCU1DSF9TVD0wLAorCU1DSF9TVEUsCisJTUNIX1RULAorCU1DSF9GMzAsCisJTUNIX0NMT05FLAorCU1DSF9BUkFOWU0KK307CisKKy8qIE1hc3RlciBjbG9ja3MgZm9yIHJlcGxheSBmcmVxdWVuY2llcyAqLworI2RlZmluZSBNQVNURVJDTE9DS19TVEUJCTgwMTA2NjYJCS8qIE5vdCBzdXJlIG9mIHRoaXMgb25lICovCisjZGVmaW5lIE1BU1RFUkNMT0NLX1RUCQkxNjEwNzk1MwkvKiBOb3Qgc3VyZSBvZiB0aGlzIG9uZSAqLworI2RlZmluZSBNQVNURVJDTE9DS19GQUxDT04xCTI1MTc1MDAwCisjZGVmaW5lIE1BU1RFUkNMT0NLX0ZBTENPTjIJMzIwMDAwMDAJLyogT25seSB1c2FibGUgZm9yIERTUDU2SyAqLworI2RlZmluZSBNQVNURVJDTE9DS19GQUxDT05FWFQJLTEJCS8qIENsb2NrIG9uIERTUDU2SyBwb3J0LCB1bmtub3duICovCisjZGVmaW5lIE1BU1RFUkNMT0NLXzQ0SwkJMjI1NzkyMDAJLyogU3RhbmRhcmQgY2xvY2sgZm9yIDQ0LjEgS2h6ICovCisjZGVmaW5lIE1BU1RFUkNMT0NLXzQ4SwkJMjQ1NzYwMDAJLyogU3RhbmRhcmQgY2xvY2sgZm9yIDQ4IEtoeiAqLworCisvKiBNYXN0ZXIgY2xvY2sgcHJlZGl2aXNvcnMgKi8KKyNkZWZpbmUgTUFTVEVSUFJFRElWX1NURQkxNjAKKyNkZWZpbmUgTUFTVEVSUFJFRElWX1RUCQkzMjAKKyNkZWZpbmUgTUFTVEVSUFJFRElWX0ZBTENPTgkyNTYKKyNkZWZpbmUgTUFTVEVSUFJFRElWX01JTEFOCTI1NgorCisvKiBWYXJpYWJsZXMgKi8KK2V4dGVybiBTRExfQXVkaW9EZXZpY2UgKlNETF9NaW50QXVkaW9fZGV2aWNlOworZXh0ZXJuIFVpbnQ4ICpTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzJdOwkvKiBQb2ludGVycyB0byBidWZmZXJzICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBTRExfTWludEF1ZGlvX2F1ZGlvc2l6ZTsJCS8qIExlbmd0aCBvZiBhdWRpbyBidWZmZXI9c3BlYy0+c2l6ZSAqLworZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IFNETF9NaW50QXVkaW9fbnVtYnVmOwkJLyogQnVmZmVyIHRvIHBsYXkgKi8KK2V4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBTRExfTWludEF1ZGlvX211dGV4OworZXh0ZXJuIGNvb2tpZV9zdGZhX3QgKlNETF9NaW50QXVkaW9fc3RmYTsKK2V4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIFNETF9NaW50QXVkaW9fY2xvY2t0aWNzOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IFNETF9NaW50QXVkaW9faGFzZnB1OwkvKiBUbyBwcmVzZXJ2ZSBmcHUgcmVnaXN0ZXJzIGlmIG5lZWRlZCAqLworCisvKiBNaU5UIHRocmVhZCB2YXJpYWJsZXMgKi8KK2V4dGVybiBTRExfYm9vbAlTRExfTWludEF1ZGlvX21pbnRfcHJlc2VudDsKK2V4dGVybiBTRExfYm9vbCBTRExfTWludEF1ZGlvX3F1aXRfdGhyZWFkOworZXh0ZXJuIFNETF9ib29sIFNETF9NaW50QXVkaW9fdGhyZWFkX2ZpbmlzaGVkOworZXh0ZXJuIGxvbmcgU0RMX01pbnRBdWRpb190aHJlYWRfcGlkOworCisvKiBGdW5jdGlvbnMgKi8KK3ZvaWQgU0RMX01pbnRBdWRpb19DYWxsYmFjayh2b2lkKTsKK3ZvaWQgU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3koX1RISVMsIFVpbnQzMiBmcmVxdWVuY3ksIFVpbnQzMiBjbG9jaywKKwlVaW50MzIgcHJlZGl2LCBpbnQgZ3Bpb19iaXRzKTsKK2ludCBTRExfTWludEF1ZGlvX1NlYXJjaEZyZXF1ZW5jeShfVEhJUywgaW50IGRlc2lyZWRfZnJlcSk7Cit2b2lkIFNETF9NaW50QXVkaW9fQ2hlY2tGcHUodm9pZCk7CisKKy8qIE1pTlQgdGhyZWFkIGZ1bmN0aW9ucyAqLworaW50IFNETF9NaW50QXVkaW9fVGhyZWFkKGxvbmcgcGFyYW0pOwordm9pZCBTRExfTWludEF1ZGlvX1dhaXRUaHJlYWQodm9pZCk7CisKKy8qIEFTTSBpbnRlcnJ1cHQgZnVuY3Rpb25zICovCit2b2lkIFNETF9NaW50QXVkaW9fR3N4YkludGVycnVwdCh2b2lkKTsKK3ZvaWQgU0RMX01pbnRBdWRpb19FbXB0eUdzeGJJbnRlcnJ1cHQodm9pZCk7Cit2b2lkIFNETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHRNZWFzdXJlQ2xvY2sodm9pZCk7Cit2b2lkIFNETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHQodm9pZCk7Cit2b2lkIFNETF9NaW50QXVkaW9fRG1hOEludGVycnVwdCh2b2lkKTsKK3ZvaWQgU0RMX01pbnRBdWRpb19TdGZhSW50ZXJydXB0KHZvaWQpOworCisjZW5kaWYgLyogX1NETF9taW50YXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fZG1hOC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fZG1hOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZmViYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19kbWE4LmMKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCU1pTlQgYXVkaW8gZHJpdmVyCisJdXNpbmcgRE1BIDhiaXRzIChoYXJkd2FyZSBhY2Nlc3MpCisKKwlQYXRyaWNlIE1hbmRpbgorKi8KKworLyogTWludCBpbmNsdWRlcyAqLworI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+CisjaW5jbHVkZSA8bWludC9mYWxjb24uaD4KKyNpbmNsdWRlIDxtaW50L2Nvb2tpZS5oPgorCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworI2luY2x1ZGUgIi4uLy4uL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaW14YWxsb2NfYy5oIgorCisjaW5jbHVkZSAiU0RMX21pbnRhdWRpby5oIgorI2luY2x1ZGUgIlNETF9taW50YXVkaW9fZG1hOC5oIgorCisvKi0tLSBEZWZpbmVzIC0tLSovCisKKyNkZWZpbmUgTUlOVF9BVURJT19EUklWRVJfTkFNRSAibWludF9kbWE4IgorCisvKiBEZWJ1ZyBwcmludCBpbmZvICovCisjZGVmaW5lIERFQlVHX05BTUUgImF1ZGlvOmRtYTg6ICIKKyNpZiAwCisjZGVmaW5lIERFQlVHX1BSSU5UKHdoYXQpIFwKKwl7IFwKKwkJcHJpbnRmIHdoYXQ7IFwKKwl9CisjZWxzZQorI2RlZmluZSBERUJVR19QUklOVCh3aGF0KQorI2VuZGlmCisKKy8qLS0tIFN0YXRpYyB2YXJpYWJsZXMgLS0tKi8KKworc3RhdGljIGxvbmcgY29va2llX3NuZCwgY29va2llX21jaDsKKworLyotLS0gQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAtLS0qLworCitzdGF0aWMgdm9pZCBNaW50X0Nsb3NlQXVkaW8oX1RISVMpOworc3RhdGljIGludCBNaW50X09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7CitzdGF0aWMgdm9pZCBNaW50X0xvY2tBdWRpbyhfVEhJUyk7CitzdGF0aWMgdm9pZCBNaW50X1VubG9ja0F1ZGlvKF9USElTKTsKKworLyogVG8gY2hlY2svaW5pdCBoYXJkd2FyZSBhdWRpbyAqLworc3RhdGljIGludCBNaW50X0NoZWNrQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworCisvKiBGdW5jdGlvbnMgY2FsbGVkIGluIHN1cGVydmlzb3IgbW9kZSAqLworc3RhdGljIHZvaWQgTWludF9Jbml0RG1hKHZvaWQpOworc3RhdGljIHZvaWQgTWludF9TdG9wUmVwbGF5KHZvaWQpOworc3RhdGljIHZvaWQgTWludF9TdGFydFJlcGxheSh2b2lkKTsKKworLyotLS0gQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgLS0tKi8KKworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKwljb25zdCBjaGFyICplbnZyID0gU0RMX2dldGVudigiU0RMX0FVRElPRFJJVkVSIik7CisKKwkvKiBDaGVjayBpZiB1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlciAqLworCWlmICgoZW52cikgJiYgKFNETF9zdHJjbXAoZW52ciwgTUlOVF9BVURJT19EUklWRVJfTkFNRSkhPTApKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJ1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlclxuIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDb29raWUgX01DSCBwcmVzZW50ID8gaWYgbm90LCBhc3N1bWUgU1QgbWFjaGluZSAqLworCWlmIChHZXRjb29raWUoQ19fTUNILCAmY29va2llX21jaCkgPT0gQ19OT1RGT1VORCkgeworCQljb29raWVfbWNoID0gTUNIX1NUOworCX0KKworCS8qIENvb2tpZSBfU05EIHByZXNlbnQgPyBpZiBub3QsIGFzc3VtZSBTVCBtYWNoaW5lICovCisJaWYgKEdldGNvb2tpZShDX19TTkQsICZjb29raWVfc25kKSA9PSBDX05PVEZPVU5EKSB7CisJCWNvb2tpZV9zbmQgPSBTTkRfUFNHOworCX0KKworCS8qIENoZWNrIGlmIHdlIGhhdmUgOCBiaXRzIGF1ZGlvICovCisJaWYgKChjb29raWVfc25kICYgU05EXzhCSVQpPT0wKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyA4IGJpdHMgc291bmRcbiIpKTsKKwkgICAgcmV0dXJuKDApOworCX0KKworCS8qIENoZWNrIGlmIGF1ZGlvIGlzIGxvY2thYmxlICovCisJaWYgKGNvb2tpZV9zbmQgJiBTTkRfMTZCSVQpIHsKKwkJaWYgKExvY2tzbmQoKSE9MSkgeworCQkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImF1ZGlvIGxvY2tlZCBieSBvdGhlciBhcHBsaWNhdGlvblxuIikpOworCQkJcmV0dXJuKDApOworCQl9CisKKwkJVW5sb2Nrc25kKCk7CisJfQorCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIjggYml0cyBhdWRpbyBhdmFpbGFibGUhXG4iKSk7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworICAgIFNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworICAgIGlmICggdGhpcyApIHsKKyAgICAgICAgU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisgICAgICAgIHRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKKyAgICAgICAgICAgICAgICBTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworICAgIH0KKyAgICBpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICBpZiAoIHRoaXMgKSB7CisgICAgICAgICAgICBTRExfZnJlZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKworICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICB0aGlzLT5PcGVuQXVkaW8gICA9IE1pbnRfT3BlbkF1ZGlvOworICAgIHRoaXMtPkNsb3NlQXVkaW8gID0gTWludF9DbG9zZUF1ZGlvOworICAgIHRoaXMtPkxvY2tBdWRpbyAgID0gTWludF9Mb2NrQXVkaW87CisgICAgdGhpcy0+VW5sb2NrQXVkaW8gPSBNaW50X1VubG9ja0F1ZGlvOworICAgIHRoaXMtPmZyZWUgICAgICAgID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisgICAgcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIE1JTlRBVURJT19ETUE4X2Jvb3RzdHJhcCA9IHsKKwlNSU5UX0FVRElPX0RSSVZFUl9OQU1FLCAiTWlOVCBETUEgOCBiaXRzIGF1ZGlvIGRyaXZlciIsCisJQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKK307CisKK3N0YXRpYyB2b2lkIE1pbnRfTG9ja0F1ZGlvKF9USElTKQoreworCVN1cGV4ZWMoTWludF9TdG9wUmVwbGF5KTsKK30KKworc3RhdGljIHZvaWQgTWludF9VbmxvY2tBdWRpbyhfVEhJUykKK3sKKwlTdXBleGVjKE1pbnRfU3RhcnRSZXBsYXkpOworfQorCitzdGF0aWMgdm9pZCBNaW50X0Nsb3NlQXVkaW8oX1RISVMpCit7CisJU3VwZXhlYyhNaW50X1N0b3BSZXBsYXkpOworCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImNsb3NlYXVkaW86IHJlcGxheSBzdG9wcGVkXG4iKSk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdCAqLworCUpkaXNpbnQoTUZQX0RNQVNPVU5EKTsKKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJjbG9zZWF1ZGlvOiBpbnRlcnJ1cHQgZGlzYWJsZWRcbiIpKTsKKworCS8qIFdhaXQgaWYgY3VycmVudGx5IHBsYXlpbmcgc291bmQgKi8KKwl3aGlsZSAoU0RMX01pbnRBdWRpb19tdXRleCAhPSAwKSB7CisJfQorCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImNsb3NlYXVkaW86IG5vIG1vcmUgaW50ZXJydXB0IHJ1bm5pbmdcbiIpKTsKKworCS8qIENsZWFyIGJ1ZmZlcnMgKi8KKwlpZiAoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSkgeworCQlNZnJlZShTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKTsKKwkJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0gPSBOVUxMOworCX0KKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJjbG9zZWF1ZGlvOiBidWZmZXJzIGZyZWVkXG4iKSk7Cit9CisKK3N0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCWludCBpLCBtYXN0ZXJwcmVkaXYsIHNmcmVxOworCXVuc2lnbmVkIGxvbmcgbWFzdGVyY2xvY2s7CisKKwlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYXNrZWQ6ICVkIGJpdHMsICIsc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKSk7CisJREVCVUdfUFJJTlQoKCJzaWduZWQ9JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHg4MDAwKSE9MCkpKTsKKwlERUJVR19QUklOVCgoImJpZyBlbmRpYW49JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHgxMDAwKSE9MCkpKTsKKwlERUJVR19QUklOVCgoImNoYW5uZWxzPSVkLCAiLCBzcGVjLT5jaGFubmVscykpOworCURFQlVHX1BSSU5UKCgiZnJlcT0lZFxuIiwgc3BlYy0+ZnJlcSkpOworCisJaWYgKHNwZWMtPmNoYW5uZWxzID4gMikKKwkJc3BlYy0+Y2hhbm5lbHMgPSAyOworCisJLyogQ2hlY2sgZm9ybWF0cyBhdmFpbGFibGUgKi8KKwlzcGVjLT5mb3JtYXQgPSBBVURJT19TODsKKwkKKwkvKiBDYWxjdWxhdGUgYW5kIHNlbGVjdCB0aGUgY2xvc2VzdCBmcmVxdWVuY3kgKi8KKwlzZnJlcT0wOworCW1hc3RlcmNsb2NrPU1BU1RFUkNMT0NLX1NURTsKKwltYXN0ZXJwcmVkaXY9TUFTVEVSUFJFRElWX1NURTsKKwlzd2l0Y2goY29va2llX21jaD4+MTYpIHsKKy8qCisJCWNhc2UgTUNIX1NURToKKwkJCW1hc3RlcmNsb2NrPU1BU1RFUkNMT0NLX1NURTsKKwkJCW1hc3RlcnByZWRpdj1NQVNURVJQUkVESVZfU1RFOworCQkJYnJlYWs7CisqLworCQljYXNlIE1DSF9UVDoKKwkJCW1hc3RlcmNsb2NrPU1BU1RFUkNMT0NLX1RUOworCQkJbWFzdGVycHJlZGl2PU1BU1RFUlBSRURJVl9UVDsKKwkJCWJyZWFrOworCQljYXNlIE1DSF9GMzA6CisJCWNhc2UgTUNIX0FSQU5ZTToKKwkJCW1hc3RlcmNsb2NrPU1BU1RFUkNMT0NLX0ZBTENPTjE7CisJCQltYXN0ZXJwcmVkaXY9TUFTVEVSUFJFRElWX0ZBTENPTjsKKwkJCXNmcmVxPTE7CisJCQlicmVhazsKKwl9CisJCisJTUlOVEFVRElPX2ZyZXFjb3VudD0wOworCWZvciAoaT1zZnJlcTtpPDQ7aSsrKSB7CisJCVNETF9NaW50QXVkaW9fQWRkRnJlcXVlbmN5KHRoaXMsIG1hc3RlcmNsb2NrLyhtYXN0ZXJwcmVkaXYqKDE8PGkpKSwKKwkJCW1hc3RlcmNsb2NrLCBpLXNmcmVxLCAtMSk7CisJfQorCisjaWYgMQorCWZvciAoaT0wOyBpPE1JTlRBVURJT19mcmVxY291bnQ7IGkrKykgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiZnJlcSAlZDogJWx1IEh6LCBjbG9jayAlbHUsIHByZWRpdiAlZFxuIiwKKwkJCWksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5mcmVxdWVuY3ksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5tYXN0ZXJjbG9jaywKKwkJCU1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5wcmVkaXZpc29yCisJCSkpOworCX0KKyNlbmRpZgorCisJTUlOVEFVRElPX251bWZyZXE9U0RMX01pbnRBdWRpb19TZWFyY2hGcmVxdWVuY3kodGhpcywgc3BlYy0+ZnJlcSk7CisJc3BlYy0+ZnJlcT1NSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLmZyZXF1ZW5jeTsKKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJvYnRhaW5lZDogJWQgYml0cywgIixzcGVjLT5mb3JtYXQgJiAweDAwZmYpKTsKKwlERUJVR19QUklOVCgoInNpZ25lZD0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiYmlnIGVuZGlhbj0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiY2hhbm5lbHM9JWQsICIsIHNwZWMtPmNoYW5uZWxzKSk7CisJREVCVUdfUFJJTlQoKCJmcmVxPSVkXG4iLCBzcGVjLT5mcmVxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBNaW50X09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwlTRExfTWludEF1ZGlvX2RldmljZSA9IHRoaXM7CisKKwkvKiBDaGVjayBhdWRpbyBjYXBhYmlsaXRpZXMgKi8KKwlpZiAoTWludF9DaGVja0F1ZGlvKHRoaXMsIHNwZWMpPT0tMSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gYnVmZmVycyBpbiBETUEtYWJsZSBSQU0gKi8KKwlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYnVmZmVyIHNpemU9JWRcbiIsIHNwZWMtPnNpemUpKTsKKworCVNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gPSBBdGFyaV9TeXNNYWxsb2Moc3BlYy0+c2l6ZSAqMiwgTVhfU1RSQU0pOworCWlmIChTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdPT1OVUxMKSB7CisJCVNETF9TZXRFcnJvcigiTUlOVF9PcGVuQXVkaW86IE5vdCBlbm91Z2ggbWVtb3J5IGZvciBhdWRpbyBidWZmZXIiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCVNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0gPSBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdICsgc3BlYy0+c2l6ZSA7CisJU0RMX01pbnRBdWRpb19udW1idWY9MDsKKwlTRExfbWVtc2V0KFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0sIHNwZWMtPnNpbGVuY2UsIHNwZWMtPnNpemUgKjIpOworCVNETF9NaW50QXVkaW9fYXVkaW9zaXplID0gc3BlYy0+c2l6ZTsKKwlTRExfTWludEF1ZGlvX211dGV4ID0gMDsKKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgMCBhdCAweCUwOHhcbiIsIFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pKTsKKwlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYnVmZmVyIDEgYXQgMHglMDh4XG4iLCBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdKSk7CisKKwlTRExfTWludEF1ZGlvX0NoZWNrRnB1KCk7CisKKwkvKiBTZXQgcmVwbGF5IHRyYWNrcyAqLworCWlmIChjb29raWVfc25kICYgU05EXzE2QklUKSB7CisJCVNldHRyYWNrcygwLDApOworCQlTZXRtb250cmFja3MoMCk7CisJfQorCisJU3VwZXhlYyhNaW50X0luaXREbWEpOworCisJLyogU2V0IGludGVycnVwdCAqLworCUpkaXNpbnQoTUZQX0RNQVNPVU5EKTsKKwlYYnRpbWVyKFhCX1RJTUVSQSwgOCwgMSwgU0RMX01pbnRBdWRpb19EbWE4SW50ZXJydXB0KTsKKwlKZW5hYmludChNRlBfRE1BU09VTkQpOworCisJaWYgKGNvb2tpZV9zbmQgJiBTTkRfMTZCSVQpIHsKKwkJaWYgKFNldGludGVycnVwdChTSV9USU1FUkEsIFNJX1BMQVkpPDApIHsKKwkJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTZXRpbnRlcnJ1cHQoKSBmYWlsZWRcbiIpKTsKKwkJfQorCX0KKworCVN1cGV4ZWMoTWludF9TdGFydFJlcGxheSk7CisKKyAgICByZXR1cm4oMSk7CS8qIFdlIGRvbid0IHVzZSB0aHJlYWRlZCBhdWRpbyAqLworfQorCisvKiBGdW5jdGlvbnMgY2FsbGVkIGluIHN1cGVydmlzb3IgbW9kZSAqLworCitzdGF0aWMgdm9pZCBNaW50X0luaXREbWEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyIG1vZGU7CisJU0RMX0F1ZGlvRGV2aWNlICp0aGlzID0gU0RMX01pbnRBdWRpb19kZXZpY2U7CisKKwlNaW50X1N0b3BSZXBsYXkoKTsKKworCS8qIFNldCBidWZmZXIgKi8KKwlidWZmZXIgPSAodW5zaWduZWQgbG9uZykgU0RMX01pbnRBdWRpb19hdWRpb2J1ZltTRExfTWludEF1ZGlvX251bWJ1Zl07CisJRE1BQVVESU9fSU8uc3RhcnRfaGlnaCA9IChidWZmZXI+PjE2KSAmIDI1NTsKKwlETUFBVURJT19JTy5zdGFydF9taWQgPSAoYnVmZmVyPj44KSAmIDI1NTsKKwlETUFBVURJT19JTy5zdGFydF9sb3cgPSBidWZmZXIgJiAyNTU7CisKKwlidWZmZXIgKz0gU0RMX01pbnRBdWRpb19hdWRpb3NpemU7CisJRE1BQVVESU9fSU8uZW5kX2hpZ2ggPSAoYnVmZmVyPj4xNikgJiAyNTU7CisJRE1BQVVESU9fSU8uZW5kX21pZCA9IChidWZmZXI+PjgpICYgMjU1OworCURNQUFVRElPX0lPLmVuZF9sb3cgPSBidWZmZXIgJiAyNTU7CisKKwltb2RlID0gMy1NSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLnByZWRpdmlzb3I7CisJaWYgKHRoaXMtPnNwZWMuY2hhbm5lbHM9PTEpIHsKKwkJbW9kZSB8PSAxPDw3OworCX0KKwlETUFBVURJT19JTy5zb3VuZF9jdHJsID0gbW9kZTsJCit9CisKK3N0YXRpYyB2b2lkIE1pbnRfU3RvcFJlcGxheSh2b2lkKQoreworCS8qIFN0b3AgcmVwbGF5ICovCisJRE1BQVVESU9fSU8uY29udHJvbD0wOworfQorCitzdGF0aWMgdm9pZCBNaW50X1N0YXJ0UmVwbGF5KHZvaWQpCit7CisJLyogU3RhcnQgcmVwbGF5ICovCisJRE1BQVVESU9fSU8uY29udHJvbD0zOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fZG1hOC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fZG1hOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MmU1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19kbWE4LmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJRE1BIDhiaXRzIGFuZCBGYWxjb24gQ29kZWMgYXVkaW8gZGVmaW5pdGlvbnMKKworCVBhdHJpY2UgTWFuZGluLCBEaWRpZXIgTelxdWlnbm9uCisqLworCisjaWZuZGVmIF9TRExfbWludGF1ZGlvX2RtYThfaAorI2RlZmluZSBfU0RMX21pbnRhdWRpb19kbWE4X2gKKworI2RlZmluZSBETUFBVURJT19JT19CQVNFICgweGZmZmY4OTAwKQorc3RydWN0IERNQUFVRElPX0lPX1MgeworCXVuc2lnbmVkIGNoYXIgaW50X2N0cmw7CisJdW5zaWduZWQgY2hhciBjb250cm9sOworCisJdW5zaWduZWQgY2hhciBkdW1teTE7CisJdW5zaWduZWQgY2hhciBzdGFydF9oaWdoOworCXVuc2lnbmVkIGNoYXIgZHVtbXkyOworCXVuc2lnbmVkIGNoYXIgc3RhcnRfbWlkOworCXVuc2lnbmVkIGNoYXIgZHVtbXkzOworCXVuc2lnbmVkIGNoYXIgc3RhcnRfbG93OworCisJdW5zaWduZWQgY2hhciBkdW1teTQ7CisJdW5zaWduZWQgY2hhciBjdXJfaGlnaDsKKwl1bnNpZ25lZCBjaGFyIGR1bW15NTsKKwl1bnNpZ25lZCBjaGFyIGN1cl9taWQ7CisJdW5zaWduZWQgY2hhciBkdW1teTY7CisJdW5zaWduZWQgY2hhciBjdXJfbG93OworCisJdW5zaWduZWQgY2hhciBkdW1teTc7CisJdW5zaWduZWQgY2hhciBlbmRfaGlnaDsKKwl1bnNpZ25lZCBjaGFyIGR1bW15ODsKKwl1bnNpZ25lZCBjaGFyIGVuZF9taWQ7CisJdW5zaWduZWQgY2hhciBkdW1teTk7CisJdW5zaWduZWQgY2hhciBlbmRfbG93OworCisJdW5zaWduZWQgY2hhciBkdW1teTEwWzEyXTsKKworCXVuc2lnbmVkIGNoYXIgdHJhY2tfY3RybDsgLyogQ09ERUMgb25seSAqLworCXVuc2lnbmVkIGNoYXIgc291bmRfY3RybDsKKwl1bnNpZ25lZCBzaG9ydCBzb3VuZF9kYXRhOworCXVuc2lnbmVkIHNob3J0IHNvdW5kX21hc2s7CisKKwl1bnNpZ25lZCBjaGFyIGR1bW15MTFbMTBdOworCQorCXVuc2lnbmVkIHNob3J0IGRldl9jdHJsOworCXVuc2lnbmVkIHNob3J0IGRlc3RfY3RybDsKKwl1bnNpZ25lZCBzaG9ydCBzeW5jX2RpdjsKKwl1bnNpZ25lZCBjaGFyIHRyYWNrX3JlYzsKKwl1bnNpZ25lZCBjaGFyIGFkZGVyaW5faW5wdXQ7CisJdW5zaWduZWQgY2hhciBjaGFubmVsX2lucHV0OworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbF9hbXBsaWZpY2F0aW9uOworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbF9yZWR1Y3Rpb247CisJCisJdW5zaWduZWQgY2hhciBkdW1teTEyWzZdOworCisJdW5zaWduZWQgY2hhciBkYXRhX2RpcmVjdGlvbjsKKwl1bnNpZ25lZCBjaGFyIGR1bW15MTM7CisJdW5zaWduZWQgY2hhciBkZXZfZGF0YTsKK307CisjZGVmaW5lIERNQUFVRElPX0lPICgoKih2b2xhdGlsZSBzdHJ1Y3QgRE1BQVVESU9fSU9fUyAqKURNQUFVRElPX0lPX0JBU0UpKQorCisjZW5kaWYgLyogX1NETF9taW50YXVkaW9fZG1hOF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19nc3hiLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19nc3hiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3NzE2YQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX2dzeGIuYwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJTWlOVCBhdWRpbyBkcml2ZXIKKwl1c2luZyBYQklPUyBmdW5jdGlvbnMgKEdTWEIgY29tcGF0aWJsZSBkcml2ZXIpCisKKwlQYXRyaWNlIE1hbmRpbgorKi8KKworLyogTWludCBpbmNsdWRlcyAqLworI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+CisjaW5jbHVkZSA8bWludC9mYWxjb24uaD4KKyNpbmNsdWRlIDxtaW50L2Nvb2tpZS5oPgorCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworI2luY2x1ZGUgIi4uLy4uL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaW14YWxsb2NfYy5oIgorCisjaW5jbHVkZSAiU0RMX21pbnRhdWRpby5oIgorI2luY2x1ZGUgIlNETF9taW50YXVkaW9fZ3N4Yi5oIgorCisvKi0tLSBEZWZpbmVzIC0tLSovCisKKyNkZWZpbmUgTUlOVF9BVURJT19EUklWRVJfTkFNRSAibWludF9nc3hiIgorCisvKiBEZWJ1ZyBwcmludCBpbmZvICovCisjZGVmaW5lIERFQlVHX05BTUUgImF1ZGlvOmdzeGI6ICIKKyNpZiAwCisjZGVmaW5lIERFQlVHX1BSSU5UKHdoYXQpIFwKKwl7IFwKKwkJcHJpbnRmIHdoYXQ7IFwKKwl9CisjZWxzZQorI2RlZmluZSBERUJVR19QUklOVCh3aGF0KQorI2VuZGlmCisKKy8qLS0tIFN0YXRpYyB2YXJpYWJsZXMgLS0tKi8KKworc3RhdGljIGxvbmcgY29va2llX3NuZCwgY29va2llX2dzeGI7CisKKy8qLS0tIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgLS0tKi8KKworc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKTsKK3N0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworc3RhdGljIHZvaWQgTWludF9Mb2NrQXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgTWludF9VbmxvY2tBdWRpbyhfVEhJUyk7CisKKy8qIFRvIGNoZWNrL2luaXQgaGFyZHdhcmUgYXVkaW8gKi8KK3N0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIE1pbnRfSW5pdEF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKKworLyogR1NYQiBjYWxsYmFja3MgKi8KK3N0YXRpYyB2b2lkIE1pbnRfR3N4YkludGVycnVwdCh2b2lkKTsKK3N0YXRpYyB2b2lkIE1pbnRfR3N4Yk51bGxJbnRlcnJ1cHQodm9pZCk7CisKKy8qLS0tIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zIC0tLSovCisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisJY29uc3QgY2hhciAqZW52ciA9IFNETF9nZXRlbnYoIlNETF9BVURJT0RSSVZFUiIpOworCisJLyogQ2hlY2sgaWYgdXNlciBhc2tlZCBhIGRpZmZlcmVudCBhdWRpbyBkcml2ZXIgKi8KKwlpZiAoKGVudnIpICYmIChTRExfc3RyY21wKGVudnIsIE1JTlRfQVVESU9fRFJJVkVSX05BTUUpIT0wKSkgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAidXNlciBhc2tlZCBhIGRpZmZlcmVudCBhdWRpbyBkcml2ZXJcbiIpKTsKKwkJcmV0dXJuKDApOworCX0KKworCS8qIENvb2tpZSBfU05EIHByZXNlbnQgPyBpZiBub3QsIGFzc3VtZSBTVCBtYWNoaW5lICovCisJaWYgKEdldGNvb2tpZShDX19TTkQsICZjb29raWVfc25kKSA9PSBDX05PVEZPVU5EKSB7CisJCWNvb2tpZV9zbmQgPSBTTkRfUFNHOworCX0KKworCS8qIENoZWNrIGlmIHdlIGhhdmUgMTYgYml0cyBhdWRpbyAqLworCWlmICgoY29va2llX3NuZCAmIFNORF8xNkJJVCk9PTApIHsKKwkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIm5vIDE2IGJpdHMgc291bmRcbiIpKTsKKwkgICAgcmV0dXJuKDApOworCX0KKworCS8qIENvb2tpZSBHU1hCIHByZXNlbnQgPyAqLworCWNvb2tpZV9nc3hiID0gKEdldGNvb2tpZShDX0dTWEIsICZjb29raWVfZ3N4YikgPT0gQ19GT1VORCk7CisKKwkvKiBJcyBpdCBHU1hCID8gKi8KKwlpZiAoKChjb29raWVfc25kICYgU05EX0dTWEIpPT0wKSB8fCAoY29va2llX2dzeGI9PTApKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyBHU1hCIGF1ZGlvXG4iKSk7CisJCXJldHVybigwKTsKKwl9CisKKwkvKiBDaGVjayBpZiBhdWRpbyBpcyBsb2NrYWJsZSAqLworCWlmIChMb2Nrc25kKCkhPTEpIHsKKwkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImF1ZGlvIGxvY2tlZCBieSBvdGhlciBhcHBsaWNhdGlvblxuIikpOworCQlyZXR1cm4oMCk7CisJfQorCisJVW5sb2Nrc25kKCk7CisKKwlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiR1NYQiBhdWRpbyBhdmFpbGFibGUhXG4iKSk7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworICAgIFNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworICAgIGlmICggdGhpcyApIHsKKyAgICAgICAgU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisgICAgICAgIHRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKKyAgICAgICAgICAgICAgICBTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworICAgIH0KKyAgICBpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICBpZiAoIHRoaXMgKSB7CisgICAgICAgICAgICBTRExfZnJlZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKworICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICB0aGlzLT5PcGVuQXVkaW8gICA9IE1pbnRfT3BlbkF1ZGlvOworICAgIHRoaXMtPkNsb3NlQXVkaW8gID0gTWludF9DbG9zZUF1ZGlvOworICAgIHRoaXMtPkxvY2tBdWRpbyAgID0gTWludF9Mb2NrQXVkaW87CisgICAgdGhpcy0+VW5sb2NrQXVkaW8gPSBNaW50X1VubG9ja0F1ZGlvOworICAgIHRoaXMtPmZyZWUgICAgICAgID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisgICAgcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIE1JTlRBVURJT19HU1hCX2Jvb3RzdHJhcCA9IHsKKwlNSU5UX0FVRElPX0RSSVZFUl9OQU1FLCAiTWlOVCBHU1hCIGF1ZGlvIGRyaXZlciIsCisJQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKK307CisKK3N0YXRpYyB2b2lkIE1pbnRfTG9ja0F1ZGlvKF9USElTKQoreworCS8qIFN0b3AgcmVwbGF5ICovCisJQnVmZm9wZXIoMCk7Cit9CisKK3N0YXRpYyB2b2lkIE1pbnRfVW5sb2NrQXVkaW8oX1RISVMpCit7CisJLyogUmVzdGFydCByZXBsYXkgKi8KKwlCdWZmb3BlcihTQl9QTEFfRU5BfFNCX1BMQV9SUFQpOworfQorCitzdGF0aWMgdm9pZCBNaW50X0Nsb3NlQXVkaW8oX1RISVMpCit7CisJLyogU3RvcCByZXBsYXkgKi8KKwlCdWZmb3BlcigwKTsKKworCS8qIFVuaW5zdGFsbCBpbnRlcnJ1cHQgKi8KKwlpZiAoTlNldGludGVycnVwdCgyLCBTSV9OT05FLCBNaW50X0dzeGJOdWxsSW50ZXJydXB0KTwwKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJOU2V0aW50ZXJydXB0KCkgZmFpbGVkIGluIGNsb3NlXG4iKSk7CisJfQorCisJLyogV2FpdCBpZiBjdXJyZW50bHkgcGxheWluZyBzb3VuZCAqLworCXdoaWxlIChTRExfTWludEF1ZGlvX211dGV4ICE9IDApIHsKKwl9CisKKwkvKiBDbGVhciBidWZmZXJzICovCisJaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pIHsKKwkJTWZyZWUoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSk7CisJCVNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gPSBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdID0gTlVMTDsKKwl9CisKKwkvKiBVbmxvY2sgc291bmQgc3lzdGVtICovCisJVW5sb2Nrc25kKCk7Cit9CisKK3N0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCWxvbmcgc25kX2Zvcm1hdCA9IDA7CisJaW50IGksIHJlc29sdXRpb24sIGZvcm1hdF9zaWduZWQsIGZvcm1hdF9iaWdlbmRpYW47CisgICAgVWludDE2IHRlc3RfZm9ybWF0ID0gU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoc3BlYy0+Zm9ybWF0KTsKKyAgICBpbnQgdmFsaWRfZGF0YXR5cGUgPSAwOworCisJcmVzb2x1dGlvbiA9IHNwZWMtPmZvcm1hdCAmIDB4MDBmZjsKKwlmb3JtYXRfc2lnbmVkID0gKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKTsKKwlmb3JtYXRfYmlnZW5kaWFuID0gKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKTsKKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJhc2tlZDogJWQgYml0cywgIixzcGVjLT5mb3JtYXQgJiAweDAwZmYpKTsKKwlERUJVR19QUklOVCgoInNpZ25lZD0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiYmlnIGVuZGlhbj0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiY2hhbm5lbHM9JWQsICIsIHNwZWMtPmNoYW5uZWxzKSk7CisJREVCVUdfUFJJTlQoKCJmcmVxPSVkXG4iLCBzcGVjLT5mcmVxKSk7CisKKyAgICBpZiAoc3BlYy0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIHNwZWMtPmNoYW5uZWxzID0gMjsgIC8qIG5vIG1vcmUgdGhhbiBzdGVyZW8hICovCisgICAgfQorCisgICAgd2hpbGUgKCghdmFsaWRfZGF0YXR5cGUpICYmICh0ZXN0X2Zvcm1hdCkpIHsKKyAgICAgICAgLyogQ2hlY2sgZm9ybWF0cyBhdmFpbGFibGUgKi8KKyAgICAgICAgc25kX2Zvcm1hdCA9IFNuZHN0YXR1cyhTTkRfUVVFUllGT1JNQVRTKTsKKyAgICAgICAgc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7CisgICAgICAgIHJlc29sdXRpb24gPSBzcGVjLT5mb3JtYXQgJiAweGZmOworICAgICAgICBmb3JtYXRfc2lnbmVkID0gKHNwZWMtPmZvcm1hdCAmICgxPDwxNSkpOworICAgICAgICBmb3JtYXRfYmlnZW5kaWFuID0gKHNwZWMtPmZvcm1hdCAmICgxPDwxMikpOworICAgICAgICBzd2l0Y2ggKHRlc3RfZm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIEFVRElPX1U4OgorICAgICAgICAgICAgY2FzZSBBVURJT19TODoKKyAgICAgICAgICAgICAgICBpZiAoc25kX2Zvcm1hdCAmIFNORF9GT1JNQVQ4KSB7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkX2RhdGF0eXBlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgc25kX2Zvcm1hdCA9IFNuZHN0YXR1cyhTTkRfUVVFUlk4QklUKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQVVESU9fVTE2TFNCOgorICAgICAgICAgICAgY2FzZSBBVURJT19TMTZMU0I6CisgICAgICAgICAgICBjYXNlIEFVRElPX1UxNk1TQjoKKyAgICAgICAgICAgIGNhc2UgQVVESU9fUzE2TVNCOgorICAgICAgICAgICAgICAgIGlmIChzbmRfZm9ybWF0ICYgU05EX0ZPUk1BVDE2KSB7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkX2RhdGF0eXBlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgc25kX2Zvcm1hdCA9IFNuZHN0YXR1cyhTTkRfUVVFUlkxNkJJVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRlc3RfZm9ybWF0ID0gU0RMX05leHRBdWRpb0Zvcm1hdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF2YWxpZF9kYXRhdHlwZSkgeworICAgICAgICBTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKwkvKiBDaGVjayBzaWduZWQvdW5zaWduZWQgZm9ybWF0ICovCisJaWYgKGZvcm1hdF9zaWduZWQpIHsKKwkJaWYgKHNuZF9mb3JtYXQgJiBTTkRfRk9STUFUU0lHTkVEKSB7CisJCQkvKiBPayAqLworCQl9IGVsc2UgaWYgKHNuZF9mb3JtYXQgJiBTTkRfRk9STUFUVU5TSUdORUQpIHsKKwkJCS8qIEdpdmUgdW5zaWduZWQgZm9ybWF0ICovCisJCQlzcGVjLT5mb3JtYXQgPSBzcGVjLT5mb3JtYXQgJiAofjB4ODAwMCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoc25kX2Zvcm1hdCAmIFNORF9GT1JNQVRVTlNJR05FRCkgeworCQkJLyogT2sgKi8KKwkJfSBlbHNlIGlmIChzbmRfZm9ybWF0ICYgU05EX0ZPUk1BVFNJR05FRCkgeworCQkJLyogR2l2ZSBzaWduZWQgZm9ybWF0ICovCisJCQlzcGVjLT5mb3JtYXQgfD0gMHg4MDAwOworCQl9CisJfQorCisJaWYgKGZvcm1hdF9iaWdlbmRpYW4pIHsKKwkJaWYgKHNuZF9mb3JtYXQgJiBTTkRfRk9STUFUQklHRU5ESUFOKSB7CisJCQkvKiBPayAqLworCQl9IGVsc2UgaWYgKHNuZF9mb3JtYXQgJiBTTkRfRk9STUFUTElUVExFRU5ESUFOKSB7CisJCQkvKiBHaXZlIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCisJCQlzcGVjLT5mb3JtYXQgPSBzcGVjLT5mb3JtYXQgJiAofjB4MTAwMCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoc25kX2Zvcm1hdCAmIFNORF9GT1JNQVRMSVRUTEVFTkRJQU4pIHsKKwkJCS8qIE9rICovCisJCX0gZWxzZSBpZiAoc25kX2Zvcm1hdCAmIFNORF9GT1JNQVRCSUdFTkRJQU4pIHsKKwkJCS8qIEdpdmUgYmlnIGVuZGlhbiBmb3JtYXQgKi8KKwkJCXNwZWMtPmZvcm1hdCB8PSAweDEwMDA7CisJCX0KKwl9CisJCisJLyogQ2FsY3VsYXRlIGFuZCBzZWxlY3QgdGhlIGNsb3Nlc3QgZnJlcXVlbmN5ICovCisJTUlOVEFVRElPX2ZyZXFjb3VudD0wOworCWZvciAoaT0xO2k8NDtpKyspIHsKKwkJU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3kodGhpcywKKwkJCU1BU1RFUkNMT0NLXzQ0Sy8oTUFTVEVSUFJFRElWX01JTEFOKigxPDxpKSksIE1BU1RFUkNMT0NLXzQ0SywKKwkJCSgxPDxpKS0xLCAtMSk7CisJfQorCisjaWYgMQorCWZvciAoaT0wOyBpPE1JTlRBVURJT19mcmVxY291bnQ7IGkrKykgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiZnJlcSAlZDogJWx1IEh6LCBjbG9jayAlbHUsIHByZWRpdiAlZFxuIiwKKwkJCWksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5mcmVxdWVuY3ksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5tYXN0ZXJjbG9jaywKKwkJCU1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5wcmVkaXZpc29yCisJCSkpOworCX0KKyNlbmRpZgorCisJTUlOVEFVRElPX251bWZyZXE9U0RMX01pbnRBdWRpb19TZWFyY2hGcmVxdWVuY3kodGhpcywgc3BlYy0+ZnJlcSk7CisJc3BlYy0+ZnJlcT1NSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLmZyZXF1ZW5jeTsKKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJvYnRhaW5lZDogJWQgYml0cywgIixzcGVjLT5mb3JtYXQgJiAweDAwZmYpKTsKKwlERUJVR19QUklOVCgoInNpZ25lZD0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiYmlnIGVuZGlhbj0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiY2hhbm5lbHM9JWQsICIsIHNwZWMtPmNoYW5uZWxzKSk7CisJREVCVUdfUFJJTlQoKCJmcmVxPSVkXG4iLCBzcGVjLT5mcmVxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgTWludF9Jbml0QXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJaW50IGNoYW5uZWxzX21vZGUsIHByZWRpdjsKKwl2b2lkICpidWZmZXI7CisKKwkvKiBTdG9wIGN1cnJlbnRseSBwbGF5aW5nIHNvdW5kICovCisJQnVmZm9wZXIoMCk7CisKKwkvKiBTZXQgcmVwbGF5IHRyYWNrcyAqLworCVNldHRyYWNrcygwLDApOworCVNldG1vbnRyYWNrcygwKTsKKworCS8qIFNlbGVjdCByZXBsYXkgZm9ybWF0ICovCisJc3dpdGNoIChzcGVjLT5mb3JtYXQgJiAweGZmKSB7CisJCWNhc2UgODoKKwkJCWlmIChzcGVjLT5jaGFubmVscz09MikgeworCQkJCWNoYW5uZWxzX21vZGU9U1RFUkVPODsKKwkJCX0gZWxzZSB7CisJCQkJY2hhbm5lbHNfbW9kZT1NT05PODsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJaWYgKHNwZWMtPmNoYW5uZWxzPT0yKSB7CisJCQkJY2hhbm5lbHNfbW9kZT1TVEVSRU8xNjsKKwkJCX0gZWxzZSB7CisJCQkJY2hhbm5lbHNfbW9kZT1NT05PMTY7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNoYW5uZWxzX21vZGU9U1RFUkVPMTY7CisJCQlicmVhazsKKwl9CisJaWYgKFNldG1vZGUoY2hhbm5lbHNfbW9kZSk8MCkgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiU2V0bW9kZSgpIGZhaWxlZFxuIikpOworCX0KKworCXByZWRpdiA9IE1JTlRBVURJT19mcmVxdWVuY2llc1tNSU5UQVVESU9fbnVtZnJlcV0ucHJlZGl2aXNvcjsKKwlEZXZjb25uZWN0KERNQVBMQVksIERBQywgQ0xLRVhULCBwcmVkaXYsIDEpOworCisJLyogU2V0IGJ1ZmZlciAqLworCWJ1ZmZlciA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbU0RMX01pbnRBdWRpb19udW1idWZdOworCWlmIChTZXRidWZmZXIoMCwgYnVmZmVyLCBidWZmZXIgKyBzcGVjLT5zaXplKTwwKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTZXRidWZmZXIoKSBmYWlsZWRcbiIpKTsKKwl9CisJCisJLyogSW5zdGFsbCBpbnRlcnJ1cHQgKi8KKwlpZiAoTlNldGludGVycnVwdCgyLCBTSV9QTEFZLCBNaW50X0dzeGJJbnRlcnJ1cHQpPDApIHsKKwkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIk5TZXRpbnRlcnJ1cHQoKSBmYWlsZWRcbiIpKTsKKwl9CisKKwkvKiBHbyAqLworCUJ1ZmZvcGVyKFNCX1BMQV9FTkF8U0JfUExBX1JQVCk7CisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImhhcmR3YXJlIGluaXRpYWxpemVkXG4iKSk7Cit9CisKK3N0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJLyogTG9jayBzb3VuZCBzeXN0ZW0gKi8KKwlpZiAoTG9ja3NuZCgpIT0xKSB7CisgICAJICAgIFNETF9TZXRFcnJvcigiTWludF9PcGVuQXVkaW86IEF1ZGlvIHN5c3RlbSBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICByZXR1cm4oLTEpOworCX0KKworCVNETF9NaW50QXVkaW9fZGV2aWNlID0gdGhpczsKKworCS8qIENoZWNrIGF1ZGlvIGNhcGFiaWxpdGllcyAqLworCWlmIChNaW50X0NoZWNrQXVkaW8odGhpcywgc3BlYyk9PS0xKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBidWZmZXJzIGluIERNQS1hYmxlIFJBTSAqLworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgc2l6ZT0lZFxuIiwgc3BlYy0+c2l6ZSkpOworCisJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSA9IEF0YXJpX1N5c01hbGxvYyhzcGVjLT5zaXplICoyLCBNWF9TVFJBTSk7CisJaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF09PU5VTEwpIHsKKwkJU0RMX1NldEVycm9yKCJNSU5UX09wZW5BdWRpbzogTm90IGVub3VnaCBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlciIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gKyBzcGVjLT5zaXplIDsKKwlTRExfTWludEF1ZGlvX251bWJ1Zj0wOworCVNETF9tZW1zZXQoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSAqMik7CisJU0RMX01pbnRBdWRpb19hdWRpb3NpemUgPSBzcGVjLT5zaXplOworCVNETF9NaW50QXVkaW9fbXV0ZXggPSAwOworCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciAwIGF0IDB4JTA4eFxuIiwgU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSkpOworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgMSBhdCAweCUwOHhcbiIsIFNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0pKTsKKworCVNETF9NaW50QXVkaW9fQ2hlY2tGcHUoKTsKKworCS8qIFNldHVwIGF1ZGlvIGhhcmR3YXJlICovCisJTWludF9Jbml0QXVkaW8odGhpcywgc3BlYyk7CisKKyAgICByZXR1cm4oMSk7CS8qIFdlIGRvbid0IHVzZSB0aHJlYWRlZCBhdWRpbyAqLworfQorCitzdGF0aWMgdm9pZCBNaW50X0dzeGJJbnRlcnJ1cHQodm9pZCkKK3sKKwlVaW50OCAqbmV3YnVmOworCisJaWYgKFNETF9NaW50QXVkaW9fbXV0ZXgpCisJCXJldHVybjsKKworCVNETF9NaW50QXVkaW9fbXV0ZXg9MTsKKworCVNETF9NaW50QXVkaW9fbnVtYnVmIF49IDE7CisJU0RMX01pbnRBdWRpb19DYWxsYmFjaygpOworCW5ld2J1ZiA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbU0RMX01pbnRBdWRpb19udW1idWZdOworCVNldGJ1ZmZlcigwLCBuZXdidWYsIG5ld2J1ZiArIFNETF9NaW50QXVkaW9fYXVkaW9zaXplKTsKKworCVNETF9NaW50QXVkaW9fbXV0ZXg9MDsKK30KKworc3RhdGljIHZvaWQgTWludF9Hc3hiTnVsbEludGVycnVwdCh2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fZ3N4Yi5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fZ3N4Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTI2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19nc3hiLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICogR1NYQiBhdWRpbyBkZWZpbml0aW9ucworICogCisgKiBQYXRyaWNlIE1hbmRpbgorICovCisKKyNpZm5kZWYgX1NETF9taW50YXVkaW9fZ3N4Yl9oCisjZGVmaW5lIF9TRExfbWludGF1ZGlvX2dzeGJfaAorCisjaW5jbHVkZSA8bWludC9mYWxjb24uaD4JLyogZm9yIHRyYXBfMTRfeHh4IG1hY3JvcyAqLworCisvKiBCaXQgNSBpbiBjb29raWUgX1NORCAqLworCisjZGVmaW5lIFNORF9HU1hCCSgxPDw1KQorCisvKiBOU291bmRjbWQgbW9kZXMgKi8KKworI2RlZmluZSBTRVRSQVRFCQkJNwkvKiBTZXQgc2FtcGxlIHJhdGUgKi8KKyNkZWZpbmUgU0VUOEJJVEZPUk1BVAk4CS8qIDggYml0cyBmb3JtYXQgKi8KKyNkZWZpbmUgU0VUMTZCSVRGT1JNQVQJOQkvKiAxNiBiaXRzIGZvcm1hdCAqLworI2RlZmluZSBTRVQyNEJJVEZPUk1BVAkxMAkvKiAyNCBiaXRzIGZvcm1hdCAqLworI2RlZmluZSBTRVQzMkJJVEZPUk1BVAkxMQkvKiAzMiBiaXRzIGZvcm1hdCAqLworI2RlZmluZSBMVEFUVEVOX01BU1RFUgkxMgkvKiBBdHRlbnVhdGlvbiAqLworI2RlZmluZSBSVEFUVEVOX01BU1RFUgkxMworI2RlZmluZSBMVEFUVEVOX01JQ0lOCTE0CisjZGVmaW5lIFJUQVRURU5fTUlDSU4JMTUKKyNkZWZpbmUgTFRBVFRFTl9GTUdFTgkxNgorI2RlZmluZSBSVEFUVEVOX0ZNR0VOCTE3CisjZGVmaW5lIExUQVRURU5fTElORUlOCTE4CisjZGVmaW5lIFJUQVRURU5fTElORUlOCTE5CisjZGVmaW5lIExUQVRURU5fQ0RJTgkyMAorI2RlZmluZSBSVEFUVEVOX0NESU4JMjEKKyNkZWZpbmUgTFRBVFRFTl9WSURJTgkyMgorI2RlZmluZSBSVEFUVEVOX1ZJRElOCTIzCisjZGVmaW5lIExUQVRURU5fQVVYSU4JMjQKKyNkZWZpbmUgUlRBVFRFTl9BVVhJTgkyNQorCisvKiBTZXRtb2RlIG1vZGVzICovCisKKyNkZWZpbmUgTU9OTzE2CQkzCisjZGVmaW5lIFNURVJFTzI0CTQKKyNkZWZpbmUgU1RFUkVPMzIJNQorI2RlZmluZSBNT05PMjQJCTYKKyNkZWZpbmUgTU9OTzMyCQk3CisKKy8qIFNuZHN0YXR1cyBtb2RlcyAqLworCisjZGVmaW5lIFNORF9RVUVSWUZPUk1BVFMJMgorI2RlZmluZSBTTkRfUVVFUllNSVhFUlMJCTMKKyNkZWZpbmUgU05EX1FVRVJZU09VUkNFUwk0CisjZGVmaW5lIFNORF9RVUVSWURVUExFWAkJNQorI2RlZmluZSBTTkRfUVVFUlk4QklUCQk4CisjZGVmaW5lIFNORF9RVUVSWTE2QklUCQk5CisjZGVmaW5lIFNORF9RVUVSWTI0QklUCQkxMAorI2RlZmluZSBTTkRfUVVFUlkzMkJJVAkJMTEKKworI2RlZmluZSBTTkRfRk9STUFUOAkJKDE8PDApCisjZGVmaW5lIFNORF9GT1JNQVQxNgkoMTw8MSkKKyNkZWZpbmUgU05EX0ZPUk1BVDI0CSgxPDwyKQorI2RlZmluZSBTTkRfRk9STUFUMzIJKDE8PDMpCisKKyNkZWZpbmUgU05EX0ZPUk1BVFNJR05FRAkJKDE8PDApCisjZGVmaW5lIFNORF9GT1JNQVRVTlNJR05FRAkJKDE8PDEpCisjZGVmaW5lIFNORF9GT1JNQVRCSUdFTkRJQU4JCSgxPDwyKQorI2RlZmluZSBTTkRfRk9STUFUTElUVExFRU5ESUFOCSgxPDwzKQorCisvKiBEZXZjb25uZWN0IHByZXNjYWxlcnMgKi8KKworI2RlZmluZSBDTEtfNDRLCQkxCisjZGVmaW5lIENMS18yMksJCTMKKyNkZWZpbmUgQ0xLXzExSwkJNworCisvKiBFeHRyYSB4YmlvcyBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBOU291bmRjbWQobW9kZSxkYXRhLGRhdGEyKQlcCisJKGxvbmcpdHJhcF8xNF93d2woKHNob3J0KTEzMCwoc2hvcnQpKG1vZGUpLChzaG9ydCkoZGF0YSksKGxvbmcpKGRhdGEyKSkKKyNkZWZpbmUgTlNldGludGVycnVwdChzcmNfaW50ZXIsY2F1c2UsaW50aF9hZGRyKQlcCisJKGxvbmcpdHJhcF8xNF93d3dsKChzaG9ydCkxMzUsKHNob3J0KShzcmNfaW50ZXIpLChzaG9ydCkoY2F1c2UpLAlcCisJCShsb25nKShpbnRoX2FkZHIpKQorCisjZW5kaWYgLyogX1NETF9taW50YXVkaW9fZ3N4Yl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19pdC5TIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9faXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmVjYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9faXQuUwpAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoKKwlBdWRpbyBpbnRlcnJ1cHRzCisKKwlQYXRyaWNlIE1hbmRpbiwgRGlkaWVyIE3pcXVpZ25vbgorICovCisKKwkudGV4dAorCisJLmdsb2JsCV9TRExfTWludEF1ZGlvX0NhbGxiYWNrCisKKwkuZ2xvYmwJX1NETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHQKKwkuZ2xvYmwJX1NETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHRNZWFzdXJlQ2xvY2sKKwkuZ2xvYmwJX1NETF9NaW50QXVkaW9fRG1hOEludGVycnVwdAorCS5nbG9ibAlfU0RMX01pbnRBdWRpb19TdGZhSW50ZXJydXB0CisKKwkuZ2xvYmwJX1NETF9NaW50QXVkaW9fbXV0ZXgKKwkuZ2xvYmwJX1NETF9NaW50QXVkaW9fYXVkaW9idWYKKwkuZ2xvYmwJX1NETF9NaW50QXVkaW9fbnVtYnVmCisJLmdsb2JsCV9TRExfTWludEF1ZGlvX2F1ZGlvc2l6ZQorCS5nbG9ibAlfU0RMX01pbnRBdWRpb19jbG9ja3RpY3MKKwkuZ2xvYmwJX1NETF9NaW50QXVkaW9faGFzZnB1CisKKwkuZ2xvYmwJX1NETF9NaW50QXVkaW9fc3RmYQorCisvKgorCUhvdyBpdCB3b3JrczoKKwktIEF1ZGlvIGlzIHBsYXlpbmcgYnVmZmVyICMwIChyZXNwLiAjMSkKKwktIFdlIG11c3QgY2FsY3VsYXRlIGEgc2FtcGxlIGluIGJ1ZmZlciAjMSAocmVzcC4gIzApCisJICBzbyB3ZSBmaXJzdCBjYWxsIHRoZSBjYWxsYmFjayB0byBkbyBpdAorCS0gVGhlbiB3ZSBzd2FwIHRoZSBidWZmZXJzCisqLworCisjZGVmaW5lCXNhdnB0cgkweDRhMgorI2RlZmluZQlzYXZhbXQJMHg0NgorCisvKi0tLSBTYXZlL3Jlc3RvcmUgRlBVIGNvbnRleHQgLS0tKi8KKworI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKworI2RlZmluZSBTQVZFX0ZQVV9DT05URVhUIFwKKwlsZWEJCXNwQCgtMjE2KSxzcDsJXAorCWZzYXZlCQlzcEA7CVwKKwlmbW92ZWwJCWZwaWFyLHNwQC07CVwKKwlsZWEJCXNwQCgtNjQpLHNwOwlcCisJZm1vdmVtZAlmcDAtZnA3LHNwQAorCisjZGVmaW5lIFJFU1RPUkVfRlBVX0NPTlRFWFQJXAorCWZtb3ZlbWQJCXNwQCxmcDAtZnA3OwlcCisJbGVhCQlzcEAoNjQpLHNwOwlcCisJZm1vdmVsCQlzcEArLGZwaWFyOwlcCisJZnJlc3RvcmUJc3BAOwlcCisJbGVhCQlzcEAoMjE2KSxzcAorCisjZWxzZQorCisjZGVmaW5lIFNBVkVfRlBVX0NPTlRFWFQJXAorCS5jaGlwCTY4ay82ODg4MTsJXAorCWZzYXZlCXNwQC07CVwKKwlmbW92ZW1sIGZwY3IvZnBzci9mcGlhcixzcEAtOwlcCisJZm1vdmVteAlmcDAtZnA3LHNwQC07CVwKKwkuY2hpcAk2OGsKKworI2RlZmluZSBSRVNUT1JFX0ZQVV9DT05URVhUCVwKKwkuY2hpcAk2OGsvNjg4ODE7CVwKKwlmbW92ZW14CXNwQCssZnAwLWZwNzsJXAorCWZtb3ZlbWwJc3BAKyxmcGNyL2Zwc3IvZnBpYXI7CVwKKwlmcmVzdG9yZQlzcEArOwlcCisJLmNoaXAJNjhrCisKKyNlbmRpZgorCisvKi0tLSBYYmlvcyBpbnRlcnJ1cHQgdmVjdG9yIHRvIG1lYXN1cmUgRmFsY29uIGV4dGVybmFsIGNsb2NrIC0tLSovCisKK19TRExfTWludEF1ZGlvX1hiaW9zSW50ZXJydXB0TWVhc3VyZUNsb2NrOiAgICAgICAgICAvKiAxIG1TICovCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCW1vdmVsCWQwLHNwQC0KKwkKKwltb3ZlcWwJIzAsZDAKKwlidHN0CWQwLDB4RkZGRjg5MDE6dwkvKiBzdGF0ZSBETUEgc291bmQgKi8KKyNlbHNlCisJYnRzdAkjMCwweEZGRkY4OTAxOncJLyogc3RhdGUgRE1BIHNvdW5kICovCisjZW5kaWYKKwliZXFzCVNETF9NaW50QXVkaW9fRW5kSW50TWVhc3VyZQorCWFkZHFsCSMxLF9TRExfTWludEF1ZGlvX2Nsb2NrdGljcworU0RMX01pbnRBdWRpb19FbmRJbnRNZWFzdXJlOgorI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlcWwJIzUsZDAKKwliY2xyCWQwLDB4RkZGRkZBMEY6dwkvKiBDbGVhciBzZXJ2aWNlIGJpdCAqLworCisJbW92ZWwJc3BAKyxkMAorI2Vsc2UKKwliY2xyCSM1LDB4RkZGRkZBMEY6dwkvKiBDbGVhciBzZXJ2aWNlIGJpdCAqLworI2VuZGlmCisJcnRlCisKKy8qLS0tIFhiaW9zIGludGVycnVwdCB2ZWN0b3IgLS0tKi8KKworX1NETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHQ6CisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCWxlYQlzcEAoLTYwKSxzcAorCW1vdmVtbAlkMC1kNy9hMC1hNixzcEAKKyNlbHNlCisJbW92ZW1sCWQwLWQ3L2EwLWE2LHNwQC0KKyNlbmRpZgorCisJLyogUmVlbmFibGUgaW50ZXJydXB0cywgc28gb3RoZXIgaW50ZXJydXB0cyBjYW4gd29yayAqLworCW1vdmV3CSMweDIzMDAsc3IKKworCS8qIENsZWFyIHNlcnZpY2UgYml0LCBzbyBvdGhlciBNRlAgaW50ZXJydXB0cyBjYW4gd29yayAqLworI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlcWwJIzUsZDAKKwliY2xyCWQwLDB4ZmZmZmZhMGY6dworI2Vsc2UKKwliY2xyCSM1LDB4ZmZmZmZhMGY6dworI2VuZGlmCisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgbm90IGFscmVhZHkgcnVubmluZyAqLworCXRzdHcJX1NETF9NaW50QXVkaW9fbXV0ZXgKKwlibmUJU0RMX01pbnRBdWRpb19YYmlvc0VuZAorCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCW1vdmV3CV9TRExfTWludEF1ZGlvX211dGV4LGQwCisJbm90bAlkMAorCW1vdmV3CWQwLF9TRExfTWludEF1ZGlvX211dGV4CisKKwltb3ZldwlfU0RMX01pbnRBdWRpb19udW1idWYsZDEKKwllb3JsCSMxLGQxCisJbW92ZXcJZDEsX1NETF9NaW50QXVkaW9fbnVtYnVmCisjZWxzZQorCW5vdHcJX1NETF9NaW50QXVkaW9fbXV0ZXgKKworCS8qIFN3YXAgYnVmZmVycyAqLworCWVvcncJIzEsX1NETF9NaW50QXVkaW9fbnVtYnVmCisjZW5kaWYKKwkKKwkvKiBTYXZlIEZQVSBpZiBuZWVkZWQgKi8KKwl0c3R3CV9TRExfTWludEF1ZGlvX2hhc2ZwdQorCWJlcXMJU0RMX01pbnRBdWRpb19YYmlvc19ub2ZwdTEKKwlTQVZFX0ZQVV9DT05URVhUCitTRExfTWludEF1ZGlvX1hiaW9zX25vZnB1MToKKworCS8qIENhbGxiYWNrICovCisJanNyCV9TRExfTWludEF1ZGlvX0NhbGxiYWNrCisKKwkvKiBSZXN0b3JlIEZQVSBpZiBuZWVkZWQgKi8KKwl0c3R3CV9TRExfTWludEF1ZGlvX2hhc2ZwdQorCWJlcXMJU0RMX01pbnRBdWRpb19YYmlvc19ub2ZwdTIKKwlSRVNUT1JFX0ZQVV9DT05URVhUCitTRExfTWludEF1ZGlvX1hiaW9zX25vZnB1MjoKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIHJlZ2lzdGVycyAqLworI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlbAkjc2F2YW10LGQwCisJc3VibAlkMCxzYXZwdHIKKyNlbHNlCisJc3VibAkjc2F2YW10LHNhdnB0cgorI2VuZGlmCisKKwkvKiBTZXQgbmV3IGJ1ZmZlciAqLworCisJbW92ZXEJIzAsZDAKKwltb3ZlbAlfU0RMX01pbnRBdWRpb19hdWRpb3NpemUsZDEKKworCW1vdmV3CV9TRExfTWludEF1ZGlvX251bWJ1ZixkMAorCWxzbGwJIzIsZDAKKwlsZWEJX1NETF9NaW50QXVkaW9fYXVkaW9idWYsYTAKKwltb3ZlbAlhMEAoZDA6bCksYTEKKworCWxlYQlhMUAoZDE6bCksYTIKKworCW1vdmVsCWEyLHNwQC0KKwltb3ZlbAlhMSxzcEAtCisJY2xydwlzcEAtCisJbW92ZXcJIzEzMSxzcEAtCisJdHJhcAkjMTQKKwlsZWEJc3BAKDEyKSxzcAorCisJLyogUmVzdG9yZSByZWdpc3RlcnMgc3BhY2UgKi8KKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZWwJI3NhdmFtdCxkMAorCWFkZGwJZDAsc2F2cHRyCisjZWxzZQorCWFkZGwJI3NhdmFtdCxzYXZwdHIKKyNlbmRpZgorCisJY2xydwlfU0RMX01pbnRBdWRpb19tdXRleAorU0RMX01pbnRBdWRpb19YYmlvc0VuZDoKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZW1sCXNwQCxkMC1kNy9hMC1hNgorCWxlYQlzcEAoNjApLHNwCisjZWxzZQorCW1vdmVtbAlzcEArLGQwLWQ3L2EwLWE2CisjZW5kaWYKKwlydGUKKworLyotLS0gRE1BIDggYml0cyBpbnRlcnJ1cHQgdmVjdG9yIC0tLSovCisKK19TRExfTWludEF1ZGlvX0RtYThJbnRlcnJ1cHQ6CisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCWxlYQlzcEAoLTE2KSxzcAorCW1vdmVtbAlkMC1kMS9hMC1hMSxzcEAKKyNlbHNlCisJbW92ZW1sCWQwLWQxL2EwLWExLHNwQC0KKyNlbmRpZgorCisJLyogUmVlbmFibGUgaW50ZXJydXB0cywgc28gb3RoZXIgaW50ZXJydXB0cyBjYW4gd29yayAqLworCW1vdmV3CSMweDIzMDAsc3IKKworCS8qIENsZWFyIHNlcnZpY2UgYml0LCBzbyBvdGhlciBNRlAgaW50ZXJydXB0cyBjYW4gd29yayAqLworI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlcWwJIzUsZDAKKwliY2xyCWQwLDB4ZmZmZmZhMGY6dworI2Vsc2UKKwliY2xyCSM1LDB4ZmZmZmZhMGY6dworI2VuZGlmCisJLyogQ2hlY2sgaWYgd2UgYXJlIG5vdCBhbHJlYWR5IHJ1bm5pbmcgKi8KKwl0c3R3CV9TRExfTWludEF1ZGlvX211dGV4CisJYm5lCVNETF9NaW50QXVkaW9fRG1hOEVuZAorCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCW1vdmV3CV9TRExfTWludEF1ZGlvX211dGV4LGQwCisJbm90bAlkMAorCW1vdmV3CWQwLF9TRExfTWludEF1ZGlvX211dGV4CisKKwltb3ZldwlfU0RMX01pbnRBdWRpb19udW1idWYsZDEKKwllb3JsCSMxLGQxCisJbW92ZXcJZDEsX1NETF9NaW50QXVkaW9fbnVtYnVmCisjZWxzZQorCW5vdHcJX1NETF9NaW50QXVkaW9fbXV0ZXgKKworCS8qIFN3YXAgYnVmZmVycyAqLworCWVvcncJIzEsX1NETF9NaW50QXVkaW9fbnVtYnVmCisjZW5kaWYKKworCS8qIFNhdmUgRlBVIGlmIG5lZWRlZCAqLworCXRzdHcJX1NETF9NaW50QXVkaW9faGFzZnB1CisJYmVxcwlTRExfTWludEF1ZGlvX0RtYThfbm9mcHUxCisJU0FWRV9GUFVfQ09OVEVYVAorU0RMX01pbnRBdWRpb19EbWE4X25vZnB1MToKKworCS8qIENhbGxiYWNrICovCisJanNyCV9TRExfTWludEF1ZGlvX0NhbGxiYWNrCisKKwkvKiBSZXN0b3JlIEZQVSBpZiBuZWVkZWQgKi8KKwl0c3R3CV9TRExfTWludEF1ZGlvX2hhc2ZwdQorCWJlcXMJU0RMX01pbnRBdWRpb19EbWE4X25vZnB1MgorCVJFU1RPUkVfRlBVX0NPTlRFWFQKK1NETF9NaW50QXVkaW9fRG1hOF9ub2ZwdTI6CisKKwkvKiBTZXQgbmV3IGJ1ZmZlciAqLworCisJbW92ZXEJIzAsZDAKKworCW1vdmV3CV9TRExfTWludEF1ZGlvX251bWJ1ZixkMAorCWxzbGwJIzIsZDAKKwlsZWEJX1NETF9NaW50QXVkaW9fYXVkaW9idWYsYTAKKwltb3ZlbAlhMEAoZDA6bCksZDEKKworCS8qIE1vZGlmeSBETUEgYWRkcmVzc2VzICovCisJbGVhCTB4ZmZmZjg5MDA6dyxhMAorCisJbW92ZWwJZDEsZDAKKworCW1vdmViCWQwLGEwQCgweDA3KQkvKiBTdGFydCBhZGRyZXNzICovCisJbHNybAkjOCxkMAorCW1vdmViCWQwLGEwQCgweDA1KQorCWxzcmwJIzgsZDAKKwltb3ZlYglkMCxhMEAoMHgwMykKKworCWFkZGwJX1NETF9NaW50QXVkaW9fYXVkaW9zaXplLGQxCisKKwltb3ZlbAlkMSxkMAorCisJbW92ZWIJZDAsYTBAKDB4MTMpCS8qIEVuZCBhZGRyZXNzICovCisJbHNybAkjOCxkMAorCW1vdmViCWQwLGEwQCgweDExKQorCWxzcmwJIzgsZDAKKwltb3ZlYglkMCxhMEAoMHgwZikKKworCWNscncJX1NETF9NaW50QXVkaW9fbXV0ZXgKK1NETF9NaW50QXVkaW9fRG1hOEVuZDoKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZW1sCXNwQCxkMC1kMS9hMC1hMQorCWxlYQlzcEAoMTYpLHNwCisjZWxzZQorCW1vdmVtbAlzcEArLGQwLWQxL2EwLWExCisjZW5kaWYKKwlydGUKKworLyotLS0gU1RGQSBpbnRlcnJ1cHQgdmVjdG9yIC0tLSovCisKK1NURkFfU09VTkRfU1RBUlQJPQk2CitTVEZBX1NPVU5EX0VORAkJPQlTVEZBX1NPVU5EX1NUQVJUKzgKKworX1NETF9NaW50QXVkaW9fU3RmYUludGVycnVwdDoKKwkvKiBSZWVuYWJsZSBpbnRlcnJ1cHRzLCBzbyBvdGhlciBpbnRlcnJ1cHRzIGNhbiB3b3JrICovCisJbW92ZXcJIzB4MjMwMCxzcgorCisJLyogQ2hlY2sgaWYgd2UgYXJlIG5vdCBhbHJlYWR5IHJ1bm5pbmcgKi8KKwl0c3R3CV9TRExfTWludEF1ZGlvX211dGV4CisKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJYm5lCVNETF9NaW50QXVkaW9fU3RmYUVuZAorCisJbGVhCXNwQCgtNjApLHNwCisJbW92ZW1sCWQwLWQ3L2EwLWE2LHNwQAorCisJbW92ZXcJX1NETF9NaW50QXVkaW9fbXV0ZXgsZDAKKwlub3RsCWQwCisJbW92ZXcJZDAsX1NETF9NaW50QXVkaW9fbXV0ZXgKKworCW1vdmV3CV9TRExfTWludEF1ZGlvX251bWJ1ZixkMQorCWVvcmwJIzEsZDEKKwltb3ZldwlkMSxfU0RMX01pbnRBdWRpb19udW1idWYKKyNlbHNlCisJYm5lcwlTRExfTWludEF1ZGlvX1N0ZmFFbmQKKworCW1vdmVtbAlkMC1kNy9hMC1hNixzcEAtCisKKwlub3R3CV9TRExfTWludEF1ZGlvX211dGV4CisKKwkvKiBTd2FwIGJ1ZmZlcnMgKi8KKwllb3J3CSMxLF9TRExfTWludEF1ZGlvX251bWJ1ZgorI2VuZGlmCisJCisJLyogU2F2ZSBGUFUgaWYgbmVlZGVkICovCisJdHN0dwlfU0RMX01pbnRBdWRpb19oYXNmcHUKKwliZXFzCVNETF9NaW50QXVkaW9fU3RmYV9ub2ZwdTEKKwlTQVZFX0ZQVV9DT05URVhUCitTRExfTWludEF1ZGlvX1N0ZmFfbm9mcHUxOgorCisJLyogQ2FsbGJhY2sgKi8KKwlqc3IJX1NETF9NaW50QXVkaW9fQ2FsbGJhY2sKKworCS8qIFJlc3RvcmUgRlBVIGlmIG5lZWRlZCAqLworCXRzdHcJX1NETF9NaW50QXVkaW9faGFzZnB1CisJYmVxcwlTRExfTWludEF1ZGlvX1N0ZmFfbm9mcHUyCisJUkVTVE9SRV9GUFVfQ09OVEVYVAorU0RMX01pbnRBdWRpb19TdGZhX25vZnB1MjoKKworCS8qIFNldCBuZXcgYnVmZmVyICovCisKKwltb3ZlcQkjMCxkMAorCW1vdmVsCV9TRExfTWludEF1ZGlvX3N0ZmEsYTEKKworCW1vdmV3CV9TRExfTWludEF1ZGlvX251bWJ1ZixkMAorCWxzbGwJIzIsZDAKKwlsZWEJX1NETF9NaW50QXVkaW9fYXVkaW9idWYsYTAKKwltb3ZlbAlhMEAoZDA6bCksZDEKKworCS8qIE1vZGlmeSBTVEZBIHJlcGxheSBidWZmZXJzICovCisJbW92ZWwJZDEsYTFAKFNURkFfU09VTkRfU1RBUlQpCisJYWRkbAlfU0RMX01pbnRBdWRpb19hdWRpb3NpemUsZDEKKwltb3ZlbAlkMSxhMUAoU1RGQV9TT1VORF9FTkQpCisKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZW1sCXNwQCxkMC1kNy9hMC1hNgorCWxlYQlzcEAoNjApLHNwCisjZWxzZQorCW1vdmVtbAlzcEArLGQwLWQ3L2EwLWE2CisjZW5kaWYKKwljbHJ3CV9TRExfTWludEF1ZGlvX211dGV4CitTRExfTWludEF1ZGlvX1N0ZmFFbmQ6CisJcnRlCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19tY3NuLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19tY3NuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3NjA5YgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX21jc24uYwpAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJTWlOVCBhdWRpbyBkcml2ZXIKKwl1c2luZyBYQklPUyBmdW5jdGlvbnMgKE1hY1NvdW5kIGNvbXBhdGlibGUgZHJpdmVyKQorCisJUGF0cmljZSBNYW5kaW4KKyovCisKKyNpbmNsdWRlIDxzdXBwb3J0Lmg+CisKKy8qIE1pbnQgaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxtaW50L29zYmluZC5oPgorI2luY2x1ZGUgPG1pbnQvZmFsY29uLmg+CisjaW5jbHVkZSA8bWludC9jb29raWUuaD4KKworI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKyNpbmNsdWRlICIuLi8uLi92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlteGFsbG9jX2MuaCIKKworI2luY2x1ZGUgIlNETF9taW50YXVkaW8uaCIKKyNpbmNsdWRlICJTRExfbWludGF1ZGlvX21jc24uaCIKKworLyotLS0gRGVmaW5lcyAtLS0qLworCisjZGVmaW5lIE1JTlRfQVVESU9fRFJJVkVSX05BTUUgIm1pbnRfbWNzbiIKKworLyogRGVidWcgcHJpbnQgaW5mbyAqLworI2RlZmluZSBERUJVR19OQU1FICJhdWRpbzptY3NuOiAiCisjaWYgMAorI2RlZmluZSBERUJVR19QUklOVCh3aGF0KSBcCisJeyBcCisJCXByaW50ZiB3aGF0OyBcCisJfQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfUFJJTlQod2hhdCkKKyNlbmRpZgorCisvKi0tLSBTdGF0aWMgdmFyaWFibGVzIC0tLSovCisKK3N0YXRpYyBsb25nIGNvb2tpZV9zbmQsIGNvb2tpZV9tY2g7CitzdGF0aWMgY29va2llX21jc25fdCAqY29va2llX21jc247CisKKy8qLS0tIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgLS0tKi8KKworc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKTsKK3N0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworc3RhdGljIHZvaWQgTWludF9Mb2NrQXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgTWludF9VbmxvY2tBdWRpbyhfVEhJUyk7CisKKy8qIFRvIGNoZWNrL2luaXQgaGFyZHdhcmUgYXVkaW8gKi8KK3N0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIE1pbnRfSW5pdEF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKKworLyotLS0gQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgLS0tKi8KKworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKwlsb25nIGR1bW15OworCWNvbnN0IGNoYXIgKmVudnIgPSBTRExfZ2V0ZW52KCJTRExfQVVESU9EUklWRVIiKTsKKworCVNETF9NaW50QXVkaW9fbWludF9wcmVzZW50ID0gKEdldGNvb2tpZShDX01pTlQsICZkdW1teSkgPT0gQ19GT1VORCk7CisKKwkvKiBXZSBjYW4ndCB1c2UgWEJJT1MgaW4gaW50ZXJydXB0IHdpdGggTWFnaWMsIGRvbid0IGtub3cgYWJvdXQgdGhyZWFkICovCisJaWYgKEdldGNvb2tpZShDX01hZ1gsICZkdW1teSkgPT0gQ19GT1VORCkgeworCQlyZXR1cm4oMCk7CisJfQorCisJLyogQ2hlY2sgaWYgdXNlciBhc2tlZCBhIGRpZmZlcmVudCBhdWRpbyBkcml2ZXIgKi8KKwlpZiAoKGVudnIpICYmIChTRExfc3RyY21wKGVudnIsIE1JTlRfQVVESU9fRFJJVkVSX05BTUUpIT0wKSkgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAidXNlciBhc2tlZCBhIGRpZmZlcmVudCBhdWRpbyBkcml2ZXJcbiIpKTsKKwkJcmV0dXJuKDApOworCX0KKworCS8qIENvb2tpZSBfTUNIIHByZXNlbnQgPyBpZiBub3QsIGFzc3VtZSBTVCBtYWNoaW5lICovCisJaWYgKEdldGNvb2tpZShDX19NQ0gsICZjb29raWVfbWNoKSA9PSBDX05PVEZPVU5EKSB7CisJCWNvb2tpZV9tY2ggPSBNQ0hfU1Q7CisJfQorCisJLyogQ29va2llIF9TTkQgcHJlc2VudCA/IGlmIG5vdCwgYXNzdW1lIFNUIG1hY2hpbmUgKi8KKwlpZiAoR2V0Y29va2llKENfX1NORCwgJmNvb2tpZV9zbmQpID09IENfTk9URk9VTkQpIHsKKwkJY29va2llX3NuZCA9IFNORF9QU0c7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSAxNiBiaXRzIGF1ZGlvICovCisJaWYgKChjb29raWVfc25kICYgU05EXzE2QklUKT09MCkgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAibm8gMTYgYml0cyBzb3VuZFxuIikpOworCSAgICByZXR1cm4oMCk7CisJfQorCisJLyogQ29va2llIE1DU04gcHJlc2VudCA/ICovCisJaWYgKEdldGNvb2tpZShDX01jU24sICZkdW1teSkgIT0gQ19GT1VORCkgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAibm8gTUNTTiBhdWRpb1xuIikpOworCQlyZXR1cm4oMCk7CisJfQorCWNvb2tpZV9tY3NuID0gKGNvb2tpZV9tY3NuX3QgKikgZHVtbXk7CisKKwkvKiBDaGVjayBpZiBpbnRlcnJ1cHQgYXQgZW5kIG9mIHJlcGxheSAqLworCWlmIChjb29raWVfbWNzbi0+cGludCA9PSAwKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJubyBpbnRlcnJ1cHQgYXQgZW5kIG9mIHJlcGxheVxuIikpOworCQlyZXR1cm4oMCk7CisJfQorCisJLyogQ2hlY2sgaWYgYXVkaW8gaXMgbG9ja2FibGUgKi8KKwlpZiAoTG9ja3NuZCgpIT0xKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJhdWRpbyBsb2NrZWQgYnkgb3RoZXIgYXBwbGljYXRpb25cbiIpKTsKKwkJcmV0dXJuKDApOworCX0KKworCVVubG9ja3NuZCgpOworCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIk1DU04gYXVkaW8gYXZhaWxhYmxlIVxuIikpOworCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQoreworICAgIFNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKyAgICBTRExfZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9BdWRpb0RldmljZSAqdGhpczsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKKyAgICBpZiAoIHRoaXMgKSB7CisgICAgICAgIFNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOworICAgICAgICB0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCisgICAgICAgICAgICAgICAgU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKyAgICB9CisgICAgaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgeworICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgaWYgKCB0aGlzICkgeworICAgICAgICAgICAgU0RMX2ZyZWUodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisKKyAgICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgdGhpcy0+T3BlbkF1ZGlvICAgPSBNaW50X09wZW5BdWRpbzsKKyAgICB0aGlzLT5DbG9zZUF1ZGlvICA9IE1pbnRfQ2xvc2VBdWRpbzsKKyAgICB0aGlzLT5Mb2NrQXVkaW8gICA9IE1pbnRfTG9ja0F1ZGlvOworICAgIHRoaXMtPlVubG9ja0F1ZGlvID0gTWludF9VbmxvY2tBdWRpbzsKKyAgICB0aGlzLT5mcmVlICAgICAgICA9IEF1ZGlvX0RlbGV0ZURldmljZTsKKworICAgIHJldHVybiB0aGlzOworfQorCitBdWRpb0Jvb3RTdHJhcCBNSU5UQVVESU9fTUNTTl9ib290c3RyYXAgPSB7CisJTUlOVF9BVURJT19EUklWRVJfTkFNRSwgIk1pTlQgTUNTTiBhdWRpbyBkcml2ZXIiLAorCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCit9OworCitzdGF0aWMgdm9pZCBNaW50X0xvY2tBdWRpbyhfVEhJUykKK3sKKwkvKiBTdG9wIHJlcGxheSAqLworCUJ1ZmZvcGVyKDApOworfQorCitzdGF0aWMgdm9pZCBNaW50X1VubG9ja0F1ZGlvKF9USElTKQoreworCS8qIFJlc3RhcnQgcmVwbGF5ICovCisJQnVmZm9wZXIoU0JfUExBX0VOQXxTQl9QTEFfUlBUKTsKK30KKworc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKQoreworCS8qIFN0b3AgcmVwbGF5ICovCisJU0RMX01pbnRBdWRpb19XYWl0VGhyZWFkKCk7CisJQnVmZm9wZXIoMCk7CisKKwlpZiAoIVNETF9NaW50QXVkaW9fbWludF9wcmVzZW50KSB7CisJCS8qIFVuaW5zdGFsbCBpbnRlcnJ1cHQgKi8KKwkJSmRpc2ludChNRlBfRE1BU09VTkQpOworCX0KKworCS8qIFdhaXQgaWYgY3VycmVudGx5IHBsYXlpbmcgc291bmQgKi8KKwl3aGlsZSAoU0RMX01pbnRBdWRpb19tdXRleCAhPSAwKSB7CisJfQorCisJLyogQ2xlYXIgYnVmZmVycyAqLworCWlmIChTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKSB7CisJCU1mcmVlKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pOworCQlTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IE5VTEw7CisJfQorCisJLyogVW5sb2NrIHNvdW5kIHN5c3RlbSAqLworCVVubG9ja3NuZCgpOworfQorCitzdGF0aWMgaW50IE1pbnRfQ2hlY2tBdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG1hc3RlcmNsb2NrLCBtYXN0ZXJwcmVkaXY7CisKKwlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiYXNrZWQ6ICVkIGJpdHMsICIsc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKSk7CisJREVCVUdfUFJJTlQoKCJzaWduZWQ9JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHg4MDAwKSE9MCkpKTsKKwlERUJVR19QUklOVCgoImJpZyBlbmRpYW49JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHgxMDAwKSE9MCkpKTsKKwlERUJVR19QUklOVCgoImNoYW5uZWxzPSVkLCAiLCBzcGVjLT5jaGFubmVscykpOworCURFQlVHX1BSSU5UKCgiZnJlcT0lZFxuIiwgc3BlYy0+ZnJlcSkpOworCisgICAgaWYgKHNwZWMtPmNoYW5uZWxzID4gMikgeworICAgICAgICBzcGVjLT5jaGFubmVscyA9IDI7ICAvKiBubyBtb3JlIHRoYW4gc3RlcmVvISAqLworICAgIH0KKworCS8qIENoZWNrIGZvcm1hdHMgYXZhaWxhYmxlICovCisJTUlOVEFVRElPX2ZyZXFjb3VudD0wOworCXN3aXRjaChjb29raWVfbWNzbi0+cGxheSkgeworCQljYXNlIE1DU05fU1Q6CisJCQlzcGVjLT5jaGFubmVscz0xOworCQkJc3BlYy0+Zm9ybWF0PTg7IC8qIEZJWE1FOiBpcyBpdCBzaWduZWQgb3IgdW5zaWduZWQgPyAqLworCQkJU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3kodGhpcywgMTI1MDAsIDAsIDAsIC0xKTsKKwkJCWJyZWFrOworCQljYXNlIE1DU05fVFQ6CS8qIEFsc28gU1RFLCBNZWdhIFNURSAqLworCQkJc3BlYy0+Zm9ybWF0PUFVRElPX1M4OworCQkJbWFzdGVyY2xvY2s9TUFTVEVSQ0xPQ0tfU1RFOworCQkJbWFzdGVycHJlZGl2PU1BU1RFUlBSRURJVl9TVEU7CisJCQlpZiAoKGNvb2tpZV9tY2g+PjE2KT09TUNIX1RUKSB7CisJCQkJbWFzdGVyY2xvY2s9TUFTVEVSQ0xPQ0tfVFQ7CisJCQkJbWFzdGVycHJlZGl2PU1BU1RFUlBSRURJVl9UVDsKKwkJCX0KKwkJCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQkJCVNETF9NaW50QXVkaW9fQWRkRnJlcXVlbmN5KHRoaXMsIG1hc3RlcmNsb2NrLyhtYXN0ZXJwcmVkaXYqKDE8PGkpKSwKKwkJCQkJbWFzdGVyY2xvY2ssIDMtaSwgLTEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTUNTTl9GQUxDT046CS8qIEFsc28gTWFjICovCisJCQlmb3IgKGk9MTsgaTwxMjsgaSsrKSB7CisJCQkJLyogUmVtb3ZlIHVudXNhYmxlIEZhbGNvbiBjb2RlYyBwcmVkaXZpc29ycyAqLworCQkJCWlmICgoaT09NikgfHwgKGk9PTgpIHx8IChpPT0xMCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCVNETF9NaW50QXVkaW9fQWRkRnJlcXVlbmN5KHRoaXMsIE1BU1RFUkNMT0NLX0ZBTENPTjEvKE1BU1RFUlBSRURJVl9GQUxDT04qKGkrMSkpLAorCQkJCQlDTEsyNU0sIGkrMSwgLTEpOworCQkJfQorCQkJaWYgKGNvb2tpZV9tY3NuLT5yZXMxICE9IDApIHsKKwkJCQlmb3IgKGk9MTsgaTw0OyBpKyspIHsKKwkJCQkJU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3kodGhpcywgKGNvb2tpZV9tY3NuLT5yZXMxKS8oTUFTVEVSUFJFRElWX0ZBTENPTiooMTw8aSkpLAorCQkJCQkJQ0xLRVhULCAoMTw8aSktMSwgLTEpOworCQkJCX0KKwkJCX0KKwkJCXNwZWMtPmZvcm1hdCB8PSAweDgwMDA7CS8qIEF1ZGlvIGlzIGFsd2F5cyBzaWduZWQgKi8KKwkJCWlmICgoc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKT09MTYpIHsKKwkJCQlzcGVjLT5mb3JtYXQgfD0gMHgxMDAwOwkvKiBBdWRpbyBpcyBhbHdheXMgYmlnIGVuZGlhbiAqLworCQkJCXNwZWMtPmNoYW5uZWxzPTI7CS8qIDE2IGJpdHMgYWx3YXlzIHN0ZXJlbyAqLworCQkJfQorCQkJYnJlYWs7CisJfQorCisjaWYgMAorCWZvciAoaT0wOyBpPE1JTlRBVURJT19mcmVxY291bnQ7IGkrKykgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiZnJlcSAlZDogJWx1IEh6LCBjbG9jayAlbHUsIHByZWRpdiAlZFxuIiwKKwkJCWksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5mcmVxdWVuY3ksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5tYXN0ZXJjbG9jaywKKwkJCU1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5wcmVkaXZpc29yCisJCSkpOworCX0KKyNlbmRpZgorCisJTUlOVEFVRElPX251bWZyZXE9U0RMX01pbnRBdWRpb19TZWFyY2hGcmVxdWVuY3kodGhpcywgc3BlYy0+ZnJlcSk7CisJc3BlYy0+ZnJlcT1NSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLmZyZXF1ZW5jeTsKKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJvYnRhaW5lZDogJWQgYml0cywgIixzcGVjLT5mb3JtYXQgJiAweDAwZmYpKTsKKwlERUJVR19QUklOVCgoInNpZ25lZD0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiYmlnIGVuZGlhbj0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiY2hhbm5lbHM9JWQsICIsIHNwZWMtPmNoYW5uZWxzKSk7CisJREVCVUdfUFJJTlQoKCJmcmVxPSVkXG4iLCBzcGVjLT5mcmVxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgTWludF9Jbml0QXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJaW50IGNoYW5uZWxzX21vZGUsIHByZWRpdiwgZG1hY2xvY2s7CisJdm9pZCAqYnVmZmVyOworCisJLyogU3RvcCBjdXJyZW50bHkgcGxheWluZyBzb3VuZCAqLworCVNETF9NaW50QXVkaW9fcXVpdF90aHJlYWQgPSBTRExfRkFMU0U7CisJU0RMX01pbnRBdWRpb190aHJlYWRfZmluaXNoZWQgPSBTRExfVFJVRTsKKwlTRExfTWludEF1ZGlvX1dhaXRUaHJlYWQoKTsKKwlCdWZmb3BlcigwKTsKKworCS8qIFNldCByZXBsYXkgdHJhY2tzICovCisJU2V0dHJhY2tzKDAsMCk7CisJU2V0bW9udHJhY2tzKDApOworCisJLyogU2VsZWN0IHJlcGxheSBmb3JtYXQgKi8KKwljaGFubmVsc19tb2RlPVNURVJFTzE2OworCXN3aXRjaCAoc3BlYy0+Zm9ybWF0ICYgMHhmZikgeworCQljYXNlIDg6CisJCQlpZiAoc3BlYy0+Y2hhbm5lbHM9PTIpIHsKKwkJCQljaGFubmVsc19tb2RlPVNURVJFTzg7CisJCQl9IGVsc2UgeworCQkJCWNoYW5uZWxzX21vZGU9TU9OTzg7CisJCQl9CisJCQlicmVhazsKKwl9CisJaWYgKFNldG1vZGUoY2hhbm5lbHNfbW9kZSk8MCkgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiU2V0bW9kZSgpIGZhaWxlZFxuIikpOworCX0KKworCWRtYWNsb2NrID0gTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5tYXN0ZXJjbG9jazsKKwlwcmVkaXYgPSBNSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLnByZWRpdmlzb3I7CisJc3dpdGNoKGNvb2tpZV9tY3NuLT5wbGF5KSB7CisJCWNhc2UgTUNTTl9UVDoKKwkJCURldmNvbm5lY3QoRE1BUExBWSwgREFDLCBDTEsyNU0sIENMS09MRCwgMSk7CisJCQlTb3VuZGNtZChTRVRQUkVTQ0FMRSwgcHJlZGl2KTsKKwkJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTVEUvVFQgcHJlc2NhbGVyIHNlbGVjdGVkXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBNQ1NOX0ZBTENPTjoKKwkJCURldmNvbm5lY3QoRE1BUExBWSwgREFDLCBkbWFjbG9jaywgcHJlZGl2LCAxKTsKKwkJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJGYWxjb24gcHJlc2NhbGVyIHNlbGVjdGVkXG4iKSk7CisJCQlicmVhazsKKwl9CisKKwkvKiBTZXQgYnVmZmVyICovCisJYnVmZmVyID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZltTRExfTWludEF1ZGlvX251bWJ1Zl07CisJaWYgKFNldGJ1ZmZlcigwLCBidWZmZXIsIGJ1ZmZlciArIHNwZWMtPnNpemUpPDApIHsKKwkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIlNldGJ1ZmZlcigpIGZhaWxlZFxuIikpOworCX0KKwkKKwlpZiAoU0RMX01pbnRBdWRpb19taW50X3ByZXNlbnQpIHsKKwkJU0RMX01pbnRBdWRpb190aHJlYWRfcGlkID0gdGZvcmsoU0RMX01pbnRBdWRpb19UaHJlYWQsIDApOworCX0gZWxzZSB7CisJCS8qIEluc3RhbGwgaW50ZXJydXB0ICovCisJCUpkaXNpbnQoTUZQX0RNQVNPVU5EKTsKKwkJWGJ0aW1lcihYQl9USU1FUkEsIDgsIDEsIFNETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHQpOworCQlKZW5hYmludChNRlBfRE1BU09VTkQpOworCisJCWlmIChTZXRpbnRlcnJ1cHQoU0lfVElNRVJBLCBTSV9QTEFZKTwwKSB7CisJCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiU2V0aW50ZXJydXB0KCkgZmFpbGVkXG4iKSk7CisJCX0KKwl9CisKKwkvKiBHbyAqLworCUJ1ZmZvcGVyKFNCX1BMQV9FTkF8U0JfUExBX1JQVCk7CisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImhhcmR3YXJlIGluaXRpYWxpemVkXG4iKSk7Cit9CisKK3N0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJLyogTG9jayBzb3VuZCBzeXN0ZW0gKi8KKwlpZiAoTG9ja3NuZCgpIT0xKSB7CisgICAJICAgIFNETF9TZXRFcnJvcigiTWludF9PcGVuQXVkaW86IEF1ZGlvIHN5c3RlbSBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICByZXR1cm4oLTEpOworCX0KKworCVNETF9NaW50QXVkaW9fZGV2aWNlID0gdGhpczsKKworCS8qIENoZWNrIGF1ZGlvIGNhcGFiaWxpdGllcyAqLworCWlmIChNaW50X0NoZWNrQXVkaW8odGhpcywgc3BlYyk9PS0xKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBidWZmZXJzIGluIERNQS1hYmxlIFJBTSAqLworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgc2l6ZT0lZFxuIiwgc3BlYy0+c2l6ZSkpOworCisJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSA9IEF0YXJpX1N5c01hbGxvYyhzcGVjLT5zaXplICoyLCBNWF9TVFJBTSk7CisJaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF09PU5VTEwpIHsKKwkJU0RMX1NldEVycm9yKCJNSU5UX09wZW5BdWRpbzogTm90IGVub3VnaCBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlciIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gKyBzcGVjLT5zaXplIDsKKwlTRExfTWludEF1ZGlvX251bWJ1Zj0wOworCVNETF9tZW1zZXQoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSAqMik7CisJU0RMX01pbnRBdWRpb19hdWRpb3NpemUgPSBzcGVjLT5zaXplOworCVNETF9NaW50QXVkaW9fbXV0ZXggPSAwOworCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciAwIGF0IDB4JTA4eFxuIiwgU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSkpOworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgMSBhdCAweCUwOHhcbiIsIFNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0pKTsKKworCVNETF9NaW50QXVkaW9fQ2hlY2tGcHUoKTsKKworCS8qIFNldHVwIGF1ZGlvIGhhcmR3YXJlICovCisJTWludF9Jbml0QXVkaW8odGhpcywgc3BlYyk7CisKKyAgICByZXR1cm4oMSk7CS8qIFdlIGRvbid0IHVzZSBTREwgdGhyZWFkZWQgYXVkaW8gKi8KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX21jc24uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbWludC9TRExfbWludGF1ZGlvX21jc24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzcyZmRhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fbWNzbi5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCU1DU04gY29udHJvbCBzdHJ1Y3R1cmUKKworCVBhdHJpY2UgTWFuZGluCisqLworCisjaWZuZGVmIF9TRExfbWludGF1ZGlvX21jc2hfaAorI2RlZmluZSBfU0RMX21pbnRhdWRpb19tY3NoX2gKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IHZlcnNpb247CS8qIFZlcnNpb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBzaXplOwkvKiBTaXplIG9mIHN0cnVjdHVyZSAqLworCisJdW5zaWduZWQgc2hvcnQgcGxheTsJLyogUmVwbGF5IGNhcGFiaWxpdHkgKi8KKwl1bnNpZ25lZCBzaG9ydCByZWNvcmQ7CS8qIFJlY29yZCBjYXBhYmlsaXR5ICovCisJdW5zaWduZWQgc2hvcnQgZHNwOwkJLyogRFNQNTZLIHByZXNlbnQgKi8KKwl1bnNpZ25lZCBzaG9ydCBwaW50OwkvKiBJbnRlcnJ1cHQgYXQgZW5kIG9mIHJlcGxheSAqLworCXVuc2lnbmVkIHNob3J0IHJpbnQ7CS8qIEludGVycnVwdCBhdCBlbmQgb2YgcmVjb3JkICovCisKKwl1bnNpZ25lZCBsb25nIHJlczE7CQkvKiBGcmVxdWVuY3kgb2YgZXh0ZXJuYWwgY2xvY2sgKi8KKwl1bnNpZ25lZCBsb25nIHJlczI7CisJdW5zaWduZWQgbG9uZyByZXMzOworCXVuc2lnbmVkIGxvbmcgcmVzNDsKK30gY29va2llX21jc25fdDsKKworZW51bSB7CisJTUNTTl9TVD0wLAorCU1DU05fVFQsCisJTUNTTl9TVEU9TUNTTl9UVCwKKwlNQ1NOX0ZBTENPTiwKKwlNQ1NOX01BQz1NQ1NOX0ZBTENPTgorfTsKKworI2RlZmluZSBTRVRTTVBGUkVRCTcJLyogU2V0IHNhbXBsZSBmcmVxdWVuY3kgKi8KKworI2VuZGlmIC8qIF9TRExfbWludGF1ZGlvX21jc2hfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fc3RmYS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fc3RmYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTgxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19zdGZhLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCU1pTlQgYXVkaW8gZHJpdmVyCisJdXNpbmcgWEJJT1MgZnVuY3Rpb25zIChTVEZBIGRyaXZlcikKKworCVBhdHJpY2UgTWFuZGluCisqLworCisvKiBNaW50IGluY2x1ZGVzICovCisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKyNpbmNsdWRlIDxtaW50L2ZhbGNvbi5oPgorI2luY2x1ZGUgPG1pbnQvY29va2llLmg+CisKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgorCisjaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvY19jLmgiCisjaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpc3VwZXIuaCIKKworI2luY2x1ZGUgIlNETF9taW50YXVkaW8uaCIKKyNpbmNsdWRlICJTRExfbWludGF1ZGlvX3N0ZmEuaCIKKworLyotLS0gRGVmaW5lcyAtLS0qLworCisjZGVmaW5lIE1JTlRfQVVESU9fRFJJVkVSX05BTUUgIm1pbnRfc3RmYSIKKworLyogRGVidWcgcHJpbnQgaW5mbyAqLworI2RlZmluZSBERUJVR19OQU1FICJhdWRpbzpzdGZhOiAiCisjaWYgMAorI2RlZmluZSBERUJVR19QUklOVCh3aGF0KSBcCisJeyBcCisJCXByaW50ZiB3aGF0OyBcCisJfQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfUFJJTlQod2hhdCkKKyNlbmRpZgorCisvKi0tLSBTdGF0aWMgdmFyaWFibGVzIC0tLSovCisKK3N0YXRpYyBsb25nIGNvb2tpZV9zbmQsIGNvb2tpZV9tY2g7CitzdGF0aWMgY29va2llX3N0ZmFfdCAqY29va2llX3N0ZmE7CisKK3N0YXRpYyBjb25zdCBpbnQgZnJlcXNbMTZdPXsKKwk0OTk1LAk2MjY5LAk3NDkzLAk4MTkyLAorCTk4MzAsCTEwOTcxLAkxMjUzOCwJMTQ5ODUsCisJMTYzODQsCTE5ODE5LAkyMTk0MywJMjQ1NzYsCisJMzA3MjAsCTMyMzM2LAk0Mzg4NSwJNDkxNTIKK307CisKKy8qLS0tIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgLS0tKi8KKworc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKTsKK3N0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworc3RhdGljIHZvaWQgTWludF9Mb2NrQXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgTWludF9VbmxvY2tBdWRpbyhfVEhJUyk7CisKKy8qIFRvIGNoZWNrL2luaXQgaGFyZHdhcmUgYXVkaW8gKi8KK3N0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIE1pbnRfSW5pdEF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKKworLyotLS0gQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgLS0tKi8KKworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKwlsb25nIGR1bW15OworCWNvbnN0IGNoYXIgKmVudnIgPSBTRExfZ2V0ZW52KCJTRExfQVVESU9EUklWRVIiKTsKKworCS8qIENoZWNrIGlmIHVzZXIgYXNrZWQgYSBkaWZmZXJlbnQgYXVkaW8gZHJpdmVyICovCisJaWYgKChlbnZyKSAmJiAoU0RMX3N0cmNtcChlbnZyLCBNSU5UX0FVRElPX0RSSVZFUl9OQU1FKSE9MCkpIHsKKwkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgInVzZXIgYXNrZWQgYSBkaWZmZXJlbnQgYXVkaW8gZHJpdmVyXG4iKSk7CisJCXJldHVybigwKTsKKwl9CisKKwkvKiBDb29raWUgX01DSCBwcmVzZW50ID8gaWYgbm90LCBhc3N1bWUgU1QgbWFjaGluZSAqLworCWlmIChHZXRjb29raWUoQ19fTUNILCAmY29va2llX21jaCkgPT0gQ19OT1RGT1VORCkgeworCQljb29raWVfbWNoID0gTUNIX1NUOworCX0KKworCS8qIENvb2tpZSBfU05EIHByZXNlbnQgPyBpZiBub3QsIGFzc3VtZSBTVCBtYWNoaW5lICovCisJaWYgKEdldGNvb2tpZShDX19TTkQsICZjb29raWVfc25kKSA9PSBDX05PVEZPVU5EKSB7CisJCWNvb2tpZV9zbmQgPSBTTkRfUFNHOworCX0KKworCS8qIENvb2tpZSBTVEZBIHByZXNlbnQgPyAqLworCWlmIChHZXRjb29raWUoQ19TVEZBLCAmZHVtbXkpICE9IENfRk9VTkQpIHsKKwkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIm5vIFNURkEgYXVkaW9cbiIpKTsKKwkJcmV0dXJuKDApOworCX0KKwljb29raWVfc3RmYSA9IChjb29raWVfc3RmYV90ICopIGR1bW15OworCisJU0RMX01pbnRBdWRpb19zdGZhID0gY29va2llX3N0ZmE7CisKKwlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiU1RGQSBhdWRpbyBhdmFpbGFibGUhXG4iKSk7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworICAgIFNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworICAgIGlmICggdGhpcyApIHsKKyAgICAgICAgU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisgICAgICAgIHRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKKyAgICAgICAgICAgICAgICBTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworICAgIH0KKyAgICBpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICBpZiAoIHRoaXMgKSB7CisgICAgICAgICAgICBTRExfZnJlZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKworICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICB0aGlzLT5PcGVuQXVkaW8gICA9IE1pbnRfT3BlbkF1ZGlvOworICAgIHRoaXMtPkNsb3NlQXVkaW8gID0gTWludF9DbG9zZUF1ZGlvOworICAgIHRoaXMtPkxvY2tBdWRpbyAgID0gTWludF9Mb2NrQXVkaW87CisgICAgdGhpcy0+VW5sb2NrQXVkaW8gPSBNaW50X1VubG9ja0F1ZGlvOworICAgIHRoaXMtPmZyZWUgICAgICAgID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisgICAgcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIE1JTlRBVURJT19TVEZBX2Jvb3RzdHJhcCA9IHsKKwlNSU5UX0FVRElPX0RSSVZFUl9OQU1FLCAiTWlOVCBTVEZBIGF1ZGlvIGRyaXZlciIsCisJQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKK307CisKK3N0YXRpYyB2b2lkIE1pbnRfTG9ja0F1ZGlvKF9USElTKQoreworCXZvaWQgKm9sZHBpbGU7CisKKwkvKiBTdG9wIHJlcGxheSAqLworCW9sZHBpbGU9KHZvaWQgKilTdXBlcigwKTsKKwljb29raWVfc3RmYS0+c291bmRfZW5hYmxlPVNURkFfUExBWV9ESVNBQkxFOworCVN1cGVyVG9Vc2VyKG9sZHBpbGUpOworfQorCitzdGF0aWMgdm9pZCBNaW50X1VubG9ja0F1ZGlvKF9USElTKQoreworCXZvaWQgKm9sZHBpbGU7CisKKwkvKiBSZXN0YXJ0IHJlcGxheSAqLworCW9sZHBpbGU9KHZvaWQgKilTdXBlcigwKTsKKwljb29raWVfc3RmYS0+c291bmRfZW5hYmxlPVNURkFfUExBWV9FTkFCTEV8U1RGQV9QTEFZX1JFUEVBVDsKKwlTdXBlclRvVXNlcihvbGRwaWxlKTsKK30KKworc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKQoreworCXZvaWQgKm9sZHBpbGU7CisKKwkvKiBTdG9wIHJlcGxheSAqLworCW9sZHBpbGU9KHZvaWQgKilTdXBlcigwKTsKKwljb29raWVfc3RmYS0+c291bmRfZW5hYmxlPVNURkFfUExBWV9ESVNBQkxFOworCVN1cGVyVG9Vc2VyKG9sZHBpbGUpOworCisJLyogV2FpdCBpZiBjdXJyZW50bHkgcGxheWluZyBzb3VuZCAqLworCXdoaWxlIChTRExfTWludEF1ZGlvX211dGV4ICE9IDApIHsKKwl9CisKKwkvKiBDbGVhciBidWZmZXJzICovCisJaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pIHsKKwkJTWZyZWUoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSk7CisJCVNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gPSBTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzFdID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgTWludF9DaGVja0F1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCWludCBpOworCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImFza2VkOiAlZCBiaXRzLCAiLHNwZWMtPmZvcm1hdCAmIDB4MDBmZikpOworCURFQlVHX1BSSU5UKCgic2lnbmVkPSVkLCAiLCAoKHNwZWMtPmZvcm1hdCAmIDB4ODAwMCkhPTApKSk7CisJREVCVUdfUFJJTlQoKCJiaWcgZW5kaWFuPSVkLCAiLCAoKHNwZWMtPmZvcm1hdCAmIDB4MTAwMCkhPTApKSk7CisJREVCVUdfUFJJTlQoKCJjaGFubmVscz0lZCwgIiwgc3BlYy0+Y2hhbm5lbHMpKTsKKwlERUJVR19QUklOVCgoImZyZXE9JWRcbiIsIHNwZWMtPmZyZXEpKTsKKworICAgIGlmIChzcGVjLT5jaGFubmVscyA+IDIpIHsKKyAgICAgICAgc3BlYy0+Y2hhbm5lbHMgPSAyOyAgLyogbm8gbW9yZSB0aGFuIHN0ZXJlbyEgKi8KKyAgICB9CisKKwkvKiBDaGVjayBmb3JtYXRzIGF2YWlsYWJsZSAqLworCU1JTlRBVURJT19mcmVxY291bnQ9MDsKKwlmb3IgKGk9MDtpPDE2O2krKykgeworCQlTRExfTWludEF1ZGlvX0FkZEZyZXF1ZW5jeSh0aGlzLCBmcmVxc1tpXSwgMCwgaSwgLTEpOworCX0KKworI2lmIDEKKwlmb3IgKGk9MDsgaTxNSU5UQVVESU9fZnJlcWNvdW50OyBpKyspIHsKKwkJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImZyZXEgJWQ6ICVsdSBIeiwgY2xvY2sgJWx1LCBwcmVkaXYgJWRcbiIsCisJCQlpLCBNSU5UQVVESU9fZnJlcXVlbmNpZXNbaV0uZnJlcXVlbmN5LCBNSU5UQVVESU9fZnJlcXVlbmNpZXNbaV0ubWFzdGVyY2xvY2ssCisJCQlNSU5UQVVESU9fZnJlcXVlbmNpZXNbaV0ucHJlZGl2aXNvcgorCQkpKTsKKwl9CisjZW5kaWYKKworCU1JTlRBVURJT19udW1mcmVxPVNETF9NaW50QXVkaW9fU2VhcmNoRnJlcXVlbmN5KHRoaXMsIHNwZWMtPmZyZXEpOworCXNwZWMtPmZyZXE9TUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5mcmVxdWVuY3k7CisKKwlERUJVR19QUklOVCgoREVCVUdfTkFNRSAib2J0YWluZWQ6ICVkIGJpdHMsICIsc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKSk7CisJREVCVUdfUFJJTlQoKCJzaWduZWQ9JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHg4MDAwKSE9MCkpKTsKKwlERUJVR19QUklOVCgoImJpZyBlbmRpYW49JWQsICIsICgoc3BlYy0+Zm9ybWF0ICYgMHgxMDAwKSE9MCkpKTsKKwlERUJVR19QUklOVCgoImNoYW5uZWxzPSVkLCAiLCBzcGVjLT5jaGFubmVscykpOworCURFQlVHX1BSSU5UKCgiZnJlcT0lZFxuIiwgc3BlYy0+ZnJlcSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIE1pbnRfSW5pdEF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCXZvaWQgKmJ1ZmZlcjsKKwl2b2lkICpvbGRwaWxlOworCisJYnVmZmVyID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZltTRExfTWludEF1ZGlvX251bWJ1Zl07CisKKwlvbGRwaWxlPSh2b2lkICopU3VwZXIoMCk7CisKKwkvKiBTdG9wIHJlcGxheSAqLworCWNvb2tpZV9zdGZhLT5zb3VuZF9lbmFibGU9U1RGQV9QTEFZX0RJU0FCTEU7CisKKwkvKiBTZWxlY3QgcmVwbGF5IGZvcm1hdCAqLworCWNvb2tpZV9zdGZhLT5zb3VuZF9jb250cm9sID0gTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5wcmVkaXZpc29yOworCWlmICgoc3BlYy0+Zm9ybWF0ICYgMHhmZik9PTgpIHsKKwkJY29va2llX3N0ZmEtPnNvdW5kX2NvbnRyb2wgfD0gU1RGQV9GT1JNQVRfOEJJVDsKKwl9IGVsc2UgeworCQljb29raWVfc3RmYS0+c291bmRfY29udHJvbCB8PSBTVEZBX0ZPUk1BVF8xNkJJVDsKKwl9CisJaWYgKHNwZWMtPmNoYW5uZWxzPT0yKSB7CisJCWNvb2tpZV9zdGZhLT5zb3VuZF9jb250cm9sIHw9IFNURkFfRk9STUFUX1NURVJFTzsKKwl9IGVsc2UgeworCQljb29raWVfc3RmYS0+c291bmRfY29udHJvbCB8PSBTVEZBX0ZPUk1BVF9NT05POworCX0KKwlpZiAoKHNwZWMtPmZvcm1hdCAmIDB4ODAwMCkhPTApIHsKKwkJY29va2llX3N0ZmEtPnNvdW5kX2NvbnRyb2wgfD0gU1RGQV9GT1JNQVRfU0lHTkVEOworCX0gZWxzZSB7CisJCWNvb2tpZV9zdGZhLT5zb3VuZF9jb250cm9sIHw9IFNURkFfRk9STUFUX1VOU0lHTkVEOworCX0KKwlpZiAoKHNwZWMtPmZvcm1hdCAmIDB4MTAwMCkhPTApIHsKKwkJY29va2llX3N0ZmEtPnNvdW5kX2NvbnRyb2wgfD0gU1RGQV9GT1JNQVRfQklHRU5ESUFOOworCX0gZWxzZSB7CisJCWNvb2tpZV9zdGZhLT5zb3VuZF9jb250cm9sIHw9IFNURkFfRk9STUFUX0xJVEVORElBTjsKKwl9CisKKwkvKiBTZXQgYnVmZmVyICovCisJY29va2llX3N0ZmEtPnNvdW5kX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGJ1ZmZlcjsKKwljb29raWVfc3RmYS0+c291bmRfZW5kID0gKHVuc2lnbmVkIGxvbmcpIChidWZmZXIgKyBzcGVjLT5zaXplKTsKKworCS8qIFNldCBpbnRlcnJ1cHQgKi8KKwljb29raWVfc3RmYS0+c3RmYV9pdCA9IFNETF9NaW50QXVkaW9fU3RmYUludGVycnVwdDsKKworCS8qIFJlc3RhcnQgcmVwbGF5ICovCisJY29va2llX3N0ZmEtPnNvdW5kX2VuYWJsZT1TVEZBX1BMQVlfRU5BQkxFfFNURkFfUExBWV9SRVBFQVQ7CisKKwlTdXBlclRvVXNlcihvbGRwaWxlKTsKKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJoYXJkd2FyZSBpbml0aWFsaXplZFxuIikpOworfQorCitzdGF0aWMgaW50IE1pbnRfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCVNETF9NaW50QXVkaW9fZGV2aWNlID0gdGhpczsKKworCS8qIENoZWNrIGF1ZGlvIGNhcGFiaWxpdGllcyAqLworCWlmIChNaW50X0NoZWNrQXVkaW8odGhpcywgc3BlYyk9PS0xKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBidWZmZXJzIGluIERNQS1hYmxlIFJBTSAqLworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgc2l6ZT0lZFxuIiwgc3BlYy0+c2l6ZSkpOworCisJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSA9IEF0YXJpX1N5c01hbGxvYyhzcGVjLT5zaXplICoyLCBNWF9TVFJBTSk7CisJaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF09PU5VTEwpIHsKKwkJU0RMX1NldEVycm9yKCJNSU5UX09wZW5BdWRpbzogTm90IGVub3VnaCBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlciIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gKyBzcGVjLT5zaXplIDsKKwlTRExfTWludEF1ZGlvX251bWJ1Zj0wOworCVNETF9tZW1zZXQoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSAqMik7CisJU0RMX01pbnRBdWRpb19hdWRpb3NpemUgPSBzcGVjLT5zaXplOworCVNETF9NaW50QXVkaW9fbXV0ZXggPSAwOworCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciAwIGF0IDB4JTA4eFxuIiwgU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSkpOworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgMSBhdCAweCUwOHhcbiIsIFNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0pKTsKKworCVNETF9NaW50QXVkaW9fQ2hlY2tGcHUoKTsKKworCS8qIFNldHVwIGF1ZGlvIGhhcmR3YXJlICovCisJTWludF9Jbml0QXVkaW8odGhpcywgc3BlYyk7CisKKyAgICByZXR1cm4oMSk7CS8qIFdlIGRvbid0IHVzZSB0aHJlYWRlZCBhdWRpbyAqLworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fc3RmYS5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9fc3RmYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODliNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb19zdGZhLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJU1RGQSBjb250cm9sIHN0cnVjdHVyZQorCisJUGF0cmljZSBNYW5kaW4KKyovCisKKyNpZm5kZWYgX1NETF9taW50YXVkaW9fc3RmYV9oCisjZGVmaW5lIF9TRExfbWludGF1ZGlvX3N0ZmFfaAorCisvKi0tLSBEZWZpbmVzIC0tLSovCisKKyNkZWZpbmUgU1RGQV9QTEFZX0VOQUJMRQkoMTw8MCkKKyNkZWZpbmUgU1RGQV9QTEFZX0RJU0FCTEUJKDA8PDApCisjZGVmaW5lIFNURkFfUExBWV9SRVBFQVQJKDE8PDEpCisjZGVmaW5lIFNURkFfUExBWV9TSU5HTEUJKDA8PDEpCisKKyNkZWZpbmUgU1RGQV9GT1JNQVRfU0lHTkVECQkoMTw8MTUpCisjZGVmaW5lIFNURkFfRk9STUFUX1VOU0lHTkVECSgwPDwxNSkKKyNkZWZpbmUgU1RGQV9GT1JNQVRfU1RFUkVPCQkoMTw8MTQpCisjZGVmaW5lIFNURkFfRk9STUFUX01PTk8JCSgwPDwxNCkKKyNkZWZpbmUgU1RGQV9GT1JNQVRfMTZCSVQJCSgxPDwxMykKKyNkZWZpbmUgU1RGQV9GT1JNQVRfOEJJVAkJKDA8PDEzKQorI2RlZmluZSBTVEZBX0ZPUk1BVF9MSVRFTkRJQU4JKDE8PDkpCisjZGVmaW5lIFNURkFfRk9STUFUX0JJR0VORElBTgkoMDw8OSkKKyNkZWZpbmUgU1RGQV9GT1JNQVRfRlJFUV9NQVNLCTB4MGYKK2VudW0geworCVNURkFfRk9STUFUX0Y0OTk1PTAsCisJU1RGQV9GT1JNQVRfRjYyNjksCisJU1RGQV9GT1JNQVRfRjc0OTMsCisJU1RGQV9GT1JNQVRfRjgxOTIsCisKKwlTVEZBX0ZPUk1BVF9GOTgzMCwKKwlTVEZBX0ZPUk1BVF9GMTA5NzEsCisJU1RGQV9GT1JNQVRfRjEyNTM4LAorCVNURkFfRk9STUFUX0YxNDk4NSwKKworCVNURkFfRk9STUFUX0YxNjM4NCwKKwlTVEZBX0ZPUk1BVF9GMTk4MTksCisJU1RGQV9GT1JNQVRfRjIxOTQzLAorCVNURkFfRk9STUFUX0YyNDU3NiwKKworCVNURkFfRk9STUFUX0YzMDcyMCwKKwlTVEZBX0ZPUk1BVF9GMzIzMzYsCisJU1RGQV9GT1JNQVRfRjQzODg1LAorCVNURkFfRk9STUFUX0Y0OTE1MgorfTsKKworLyotLS0gVHlwZXMgLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IHNvdW5kX2VuYWJsZTsKKwl1bnNpZ25lZCBzaG9ydCBzb3VuZF9jb250cm9sOworCXVuc2lnbmVkIHNob3J0IHNvdW5kX291dHB1dDsKKwl1bnNpZ25lZCBsb25nIHNvdW5kX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc291bmRfY3VycmVudDsKKwl1bnNpZ25lZCBsb25nIHNvdW5kX2VuZDsKKwl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOworCXZvaWQgKm9sZF92Ymw7CisJdm9pZCAqb2xkX3RpbWVyYTsKKwl1bnNpZ25lZCBsb25nIG9sZF9tZnBfc3RhdHVzOworCXZvaWQgKm5ld192Ymw7CisJdm9pZCAqZHJpdmVyc19saXN0OworCXZvaWQgKnBsYXlfc3RvcDsKKwl1bnNpZ25lZCBzaG9ydCBmcmVxdWVuY3k7CisJdm9pZCAqc2V0X2ZyZXF1ZW5jeTsKKwl1bnNpZ25lZCBzaG9ydCBmcmVxdWVuY3lfdGhyZXNob2xkOworCXVuc2lnbmVkIHNob3J0ICpjdXN0b21fZnJlcV90YWJsZTsKKwl1bnNpZ25lZCBzaG9ydCBzdGZhX29uX29mZjsKKwl2b2lkICpuZXdfZHJpdmVyc19saXN0OworCXVuc2lnbmVkIGxvbmcgb2xkX2JpdF8yX29mX2Nvb2tpZV9zbmQ7CisJdm9pZCAoKnN0ZmFfaXQpKHZvaWQpOworfSBjb29raWVfc3RmYV90OworCisjZW5kaWYgLyogX1NETF9taW50YXVkaW9fc3RmYV9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21pbnQvU0RMX21pbnRhdWRpb194Ymlvcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9feGJpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmEwZDRhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9taW50L1NETF9taW50YXVkaW9feGJpb3MuYwpAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJTWlOVCBhdWRpbyBkcml2ZXIKKwl1c2luZyBYQklPUyBmdW5jdGlvbnMgKEZhbGNvbikKKworCVBhdHJpY2UgTWFuZGluLCBEaWRpZXIgTelxdWlnbm9uCisqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3VwcG9ydC5oPgorCisvKiBNaW50IGluY2x1ZGVzICovCisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKyNpbmNsdWRlIDxtaW50L2ZhbGNvbi5oPgorI2luY2x1ZGUgPG1pbnQvY29va2llLmg+CisKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNhdWRpby5oIgorCisjaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvY19jLmgiCisjaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpc3VwZXIuaCIKKworI2luY2x1ZGUgIlNETF9taW50YXVkaW8uaCIKKyNpbmNsdWRlICJTRExfbWludGF1ZGlvX2RtYTguaCIKKworLyotLS0gRGVmaW5lcyAtLS0qLworCisjZGVmaW5lIE1JTlRfQVVESU9fRFJJVkVSX05BTUUgIm1pbnRfeGJpb3MiCisKKy8qIERlYnVnIHByaW50IGluZm8gKi8KKyNkZWZpbmUgREVCVUdfTkFNRSAiYXVkaW86eGJpb3M6ICIKKyNpZiAwCisjZGVmaW5lIERFQlVHX1BSSU5UKHdoYXQpIFwKKwl7IFwKKwkJcHJpbnRmIHdoYXQ7IFwKKwl9CisjZWxzZQorI2RlZmluZSBERUJVR19QUklOVCh3aGF0KQorI2VuZGlmCisKKy8qLS0tIFN0YXRpYyB2YXJpYWJsZXMgLS0tKi8KKworc3RhdGljIGxvbmcgY29va2llX3NuZDsKKworLyotLS0gQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAtLS0qLworCitzdGF0aWMgdm9pZCBNaW50X0Nsb3NlQXVkaW8oX1RISVMpOworc3RhdGljIGludCBNaW50X09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7CitzdGF0aWMgdm9pZCBNaW50X0xvY2tBdWRpbyhfVEhJUyk7CitzdGF0aWMgdm9pZCBNaW50X1VubG9ja0F1ZGlvKF9USElTKTsKKworLyogVG8gY2hlY2svaW5pdCBoYXJkd2FyZSBhdWRpbyAqLworc3RhdGljIGludCBNaW50X0NoZWNrQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworc3RhdGljIHZvaWQgTWludF9Jbml0QXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworCisvKi0tLSBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAtLS0qLworCitzdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQoreworLyoJdW5zaWduZWQgbG9uZyBkdW1teTsqLworCWNvbnN0IGNoYXIgKmVudnIgPSBTRExfZ2V0ZW52KCJTRExfQVVESU9EUklWRVIiKTsKKworCS8qU0RMX01pbnRBdWRpb19taW50X3ByZXNlbnQgPSAoR2V0Y29va2llKENfTWlOVCwgJmR1bW15KSA9PSBDX0ZPVU5EKTsqLworCVNETF9NaW50QXVkaW9fbWludF9wcmVzZW50ID0gU0RMX0ZBTFNFOworCisJLyogV2UgY2FuJ3QgdXNlIFhCSU9TIGluIGludGVycnVwdCB3aXRoIE1hZ2ljLCBkb24ndCBrbm93IGFib3V0IHRocmVhZCAqLworCS8qaWYgKEdldGNvb2tpZShDX01hZ1gsICZkdW1teSkgPT0gQ19GT1VORCkgeworCQlyZXR1cm4oMCk7CisJfSovCisKKwkvKiBDaGVjayBpZiB1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlciAqLworCWlmICgoZW52cikgJiYgKFNETF9zdHJjbXAoZW52ciwgTUlOVF9BVURJT19EUklWRVJfTkFNRSkhPTApKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJ1c2VyIGFza2VkIGEgZGlmZmVyZW50IGF1ZGlvIGRyaXZlclxuIikpOworCQlyZXR1cm4oMCk7CisJfQorCisJLyogQ29va2llIF9TTkQgcHJlc2VudCA/IGlmIG5vdCwgYXNzdW1lIFNUIG1hY2hpbmUgKi8KKwlpZiAoR2V0Y29va2llKENfX1NORCwgJmNvb2tpZV9zbmQpID09IENfTk9URk9VTkQpIHsKKwkJY29va2llX3NuZCA9IFNORF9QU0c7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSAxNiBiaXRzIGF1ZGlvICovCisJaWYgKChjb29raWVfc25kICYgU05EXzE2QklUKT09MCkgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAibm8gMTYgYml0cyBzb3VuZFxuIikpOworCQlyZXR1cm4oMCk7CisJfQorCisJLyogQ2hlY2sgaWYgYXVkaW8gaXMgbG9ja2FibGUgKi8KKwlpZiAoTG9ja3NuZCgpIT0xKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJhdWRpbyBsb2NrZWQgYnkgb3RoZXIgYXBwbGljYXRpb25cbiIpKTsKKwkJcmV0dXJuKDApOworCX0KKworCVVubG9ja3NuZCgpOworCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgIlhCSU9TIGF1ZGlvIGF2YWlsYWJsZSFcbiIpKTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKyAgICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisgICAgU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisgICAgaWYgKCB0aGlzICkgeworICAgICAgICBTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKyAgICAgICAgdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorICAgICAgICAgICAgICAgIFNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisgICAgfQorICAgIGlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKyAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICAgIGlmICggdGhpcyApIHsKKyAgICAgICAgICAgIFNETF9mcmVlKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCisgICAgLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIHRoaXMtPk9wZW5BdWRpbyAgID0gTWludF9PcGVuQXVkaW87CisgICAgdGhpcy0+Q2xvc2VBdWRpbyAgPSBNaW50X0Nsb3NlQXVkaW87CisgICAgdGhpcy0+TG9ja0F1ZGlvICAgPSBNaW50X0xvY2tBdWRpbzsKKyAgICB0aGlzLT5VbmxvY2tBdWRpbyA9IE1pbnRfVW5sb2NrQXVkaW87CisgICAgdGhpcy0+ZnJlZSAgICAgICAgPSBBdWRpb19EZWxldGVEZXZpY2U7CisKKyAgICByZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgTUlOVEFVRElPX1hCSU9TX2Jvb3RzdHJhcCA9IHsKKwlNSU5UX0FVRElPX0RSSVZFUl9OQU1FLCAiTWlOVCBYQklPUyBhdWRpbyBkcml2ZXIiLAorCUF1ZGlvX0F2YWlsYWJsZSwgQXVkaW9fQ3JlYXRlRGV2aWNlCit9OworCitzdGF0aWMgdm9pZCBNaW50X0xvY2tBdWRpbyhfVEhJUykKK3sKKwkvKiBTdG9wIHJlcGxheSAqLworCUJ1ZmZvcGVyKDApOworfQorCitzdGF0aWMgdm9pZCBNaW50X1VubG9ja0F1ZGlvKF9USElTKQoreworCS8qIFJlc3RhcnQgcmVwbGF5ICovCisJQnVmZm9wZXIoU0JfUExBX0VOQXxTQl9QTEFfUlBUKTsKK30KKworc3RhdGljIHZvaWQgTWludF9DbG9zZUF1ZGlvKF9USElTKQoreworCS8qIFN0b3AgcmVwbGF5ICovCisJU0RMX01pbnRBdWRpb19XYWl0VGhyZWFkKCk7CisJQnVmZm9wZXIoMCk7CisKKwlpZiAoIVNETF9NaW50QXVkaW9fbWludF9wcmVzZW50KSB7CisJCS8qIFVuaW5zdGFsbCBpbnRlcnJ1cHQgKi8KKwkJSmRpc2ludChNRlBfRE1BU09VTkQpOworCX0KKworCS8qIFdhaXQgaWYgY3VycmVudGx5IHBsYXlpbmcgc291bmQgKi8KKwl3aGlsZSAoU0RMX01pbnRBdWRpb19tdXRleCAhPSAwKSB7CisJfQorCisJLyogQ2xlYXIgYnVmZmVycyAqLworCWlmIChTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdKSB7CisJCU1mcmVlKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0pOworCQlTRExfTWludEF1ZGlvX2F1ZGlvYnVmWzBdID0gU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IE5VTEw7CisJfQorCisJLyogVW5sb2NrIHNvdW5kIHN5c3RlbSAqLworCVVubG9ja3NuZCgpOworfQorCisvKiBGYWxjb24gWEJJT1MgaW1wbGVtZW50YXRpb24gb2YgRGV2Y29ubmVjdCgpIGlzIGJ1Z2d5IHdpdGggZXh0ZXJuYWwgY2xvY2sgKi8KK3N0YXRpYyB2b2lkIERldmNvbm5lY3QyKGludCBzcmMsIGludCBkc3QsIGludCBzY2xrLCBpbnQgcHJlKQorewkJCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1BU0sxWzNdID0geyAwLCAweDYwMDAsIDAgfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTUFTSzJbNF0gPSB7IDB4RkZGMCwgMHhGRjhGLCAweEYwRkYsIDB4MEZGRiB9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBJTkRFWDFbNF0gPSB7ICAxLCAzLCA1LCA3IH07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IElOREVYMls0XSA9IHsgIDAsIDIsIDQsIDYgfTsKKwl1bnNpZ25lZCBzaG9ydCBzeW5jX2RpdixkZXZfY3RybCxkZXN0X2N0cmw7CisJdm9pZCAqb2xkc3RhY2s7CisKKwlpZiAoZHN0PT0wKSB7CisJCXJldHVybjsKKwl9CisKKwlvbGRzdGFjaz0odm9pZCAqKVN1cGVyKDApOworCisJZGV2X2N0cmwgPSBETUFBVURJT19JTy5kZXZfY3RybDsKKwlkZXN0X2N0cmwgPSBETUFBVURJT19JTy5kZXN0X2N0cmw7CisJZGV2X2N0cmwgJj0gTUFTSzJbc3JjXTsKKworCWlmIChzcmM9PUFEQykgeworCQlkZXZfY3RybCB8PSBNQVNLMVtzY2xrXTsKKwl9IGVsc2UgeworCQlkZXZfY3RybCB8PSAoSU5ERVgxW3NjbGtdIDw8IChzcmM8PDQpKTsKKwl9CisKKwlpZiAoZHN0ICYgRE1BUkVDKSB7CQkKKwkJZGVzdF9jdHJsICY9IDB4RkZGMDsKKwkJZGVzdF9jdHJsIHw9IElOREVYMVtzcmNdOworCX0KKworCWlmIChkc3QgJiBEU1BSRUNWKSB7CQkKKwkJZGVzdF9jdHJsICY9IDB4RkY4RjsKKwkJZGVzdF9jdHJsIHw9IChJTkRFWDFbc3JjXTw8NCk7IAorCX0KKworCWlmIChkc3QgJiBFWFRPVVQpIHsJCQorCQlkZXN0X2N0cmwgJj0gMHhGMEZGOworCQlkZXN0X2N0cmwgfD0gKElOREVYMVtzcmNdPDw4KTsgCisJfQorCisJaWYgKGRzdCAmIERBQykgewkJCisJCWRldl9jdHJsICY9IDB4MEZGRjsKKwkJZGV2X2N0cmwgfD0gTUFTSzFbc2Nsa107IAorCQlkZXN0X2N0cmwgJj0gIDB4MEZGRjsKKwkJZGVzdF9jdHJsIHw9IChJTkRFWDJbc3JjXTw8MTIpOyAKKwl9CisKKwlzeW5jX2RpdiA9IERNQUFVRElPX0lPLnN5bmNfZGl2OworCWlmIChzY2xrPT1DTEtFWFQpIHsKKwkJcHJlPDw9ODsKKwkJc3luY19kaXYgJj0gMHhGMEZGOworCX0gZWxzZSB7CisJCXN5bmNfZGl2ICY9IDB4RkZGMDsKKwl9CisJc3luY19kaXYgfD0gcHJlOworCisJRE1BQVVESU9fSU8uZGV2X2N0cmwgPSBkZXZfY3RybDsKKwlETUFBVURJT19JTy5kZXN0X2N0cmwgPSBkZXN0X2N0cmw7CisJRE1BQVVESU9fSU8uc3luY19kaXYgPSBzeW5jX2RpdjsKKworCVN1cGVyVG9Vc2VyKG9sZHN0YWNrKTsKK30KKworc3RhdGljIHZvaWQgTWludF9DaGVja0V4dGVybmFsQ2xvY2soX1RISVMpCit7CisjZGVmaW5lIFNJWkVfQlVGX0NMT0NLX01FQVNVUkUgKDQ0MTAwLzEwKQorCisJY2hhciAqYnVmZmVyOworCWludCBpLCBqOworCisJLyogRFNQIHByZXNlbnQgd2l0aCBpdHMgR1BJTyBwb3J0ID8gKi8KKwlpZiAoKGNvb2tpZV9zbmQgJiBTTkRfRFNQKT09MCkgeworCQlyZXR1cm47CisJfQorCisJYnVmZmVyID0gQXRhcmlfU3lzTWFsbG9jKFNJWkVfQlVGX0NMT0NLX01FQVNVUkUsIE1YX1NUUkFNKTsKKwlpZiAoYnVmZmVyPT1OVUxMKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG1lYXN1cmVcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlTRExfbWVtc2V0KGJ1ZmZlciwgMCwgU0laRV9CVUZfQ0xPQ0tfTUVBU1VSRSk7CisKKwlCdWZmb3BlcigwKTsKKwlTZXR0cmFja3MoMCwwKTsKKwlTZXRtb250cmFja3MoMCk7CisJU2V0bW9kZShNT05POCk7CisJSmRpc2ludChNRlBfVElNRVJBKTsKKworCWZvciAoaT0wOyBpPDI7IGkrKykgeworCQlHcGlvKEdQSU9fU0VULDcpOyAgICAgIC8qIERTUCBwb3J0IGdwaW8gb3V0cHV0cyAqLworCQlHcGlvKEdQSU9fV1JJVEUsMitpKTsgIC8qIDIyLjU3OTIvMjQuNTc2IE1IeiBmb3IgNDQuMS80OEtIeiAqLworCQlEZXZjb25uZWN0MihETUFQTEFZLCBEQUMsIENMS0VYVCwgQ0xLNTBLKTsgIC8qIE1hdHJpeCBhbmQgY2xvY2sgc291cmNlICovCisJCVNldGJ1ZmZlcigwLCBidWZmZXIsIGJ1ZmZlciArIFNJWkVfQlVGX0NMT0NLX01FQVNVUkUpOwkJICAgICAgICAgICAvKiBTZXQgYnVmZmVyICovCisJCVhidGltZXIoWEJfVElNRVJBLCA1LCAzOCwgU0RMX01pbnRBdWRpb19YYmlvc0ludGVycnVwdE1lYXN1cmVDbG9jayk7IC8qIGRlbGF5IG1vZGUgdGltZXIgQSwgcHJlZGl2IC82NCwgMUtIeiAqLworCQlKZW5hYmludChNRlBfVElNRVJBKTsKKwkJU0RMX01pbnRBdWRpb19jbG9ja3RpY3MgPSAwOworCQlCdWZmb3BlcihTQl9QTEFfRU5BKTsKKwkJdXNsZWVwKDExMDAwMCk7CisKKwkJaWYoKEJ1ZmZvcGVyKC0xKSAmIDEpPT0wKSB7CisJCQlpZiAoU0RMX01pbnRBdWRpb19jbG9ja3RpY3MpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGtoejsKKworCQkJCWtoeiA9ICgoU0laRV9CVUZfQ0xPQ0tfTUVBU1VSRS9TRExfTWludEF1ZGlvX2Nsb2NrdGljcykgKzEpICYgMHhGRkZGRkZGRTsKKwkJCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAibWVhc3VyZSAlZDogZnJlcT0lbHUgS0h6XG4iLCBpKzEsIGtoeikpOworCisJCQkJaWYoa2h6PT00NCkgeworCQkJCQlmb3IgKGo9MTsgajw0OyBqKyspIHsKKwkJCQkJCVNETF9NaW50QXVkaW9fQWRkRnJlcXVlbmN5KHRoaXMsIE1BU1RFUkNMT0NLXzQ0Sy8oTUFTVEVSUFJFRElWX0ZBTENPTiooMTw8aikpLCBNQVNURVJDTE9DS180NEssICgxPDxqKS0xLCAyK2kpOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChraHo9PTQ4KSB7CisJCQkJCWZvciAoaj0xOyBqPDQ7IGorKykgeworCQkJCQkJU0RMX01pbnRBdWRpb19BZGRGcmVxdWVuY3kodGhpcywgTUFTVEVSQ0xPQ0tfNDhLLyhNQVNURVJQUkVESVZfRkFMQ09OKigxPDxqKSksIE1BU1RFUkNMT0NLXzQ4SywgKDE8PGopLTEsIDIraSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJObyBtZWFzdXJlXG4iKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiTm8gU0RNQSBjbG9ja1xuIikpOworCQl9CisKKwkJQnVmZm9wZXIoMCk7ICAgICAgICAgICAgIC8qIHN0b3AgKi8KKwkJSmRpc2ludChNRlBfVElNRVJBKTsgICAgIC8qIFVuaW5zdGFsbCBpbnRlcnJ1cHQgKi8KKwl9CisKKwlNZnJlZShidWZmZXIpOworfQorCitzdGF0aWMgaW50IE1pbnRfQ2hlY2tBdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwlpbnQgaTsKKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJhc2tlZDogJWQgYml0cywgIixzcGVjLT5mb3JtYXQgJiAweDAwZmYpKTsKKwlERUJVR19QUklOVCgoInNpZ25lZD0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiYmlnIGVuZGlhbj0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiY2hhbm5lbHM9JWQsICIsIHNwZWMtPmNoYW5uZWxzKSk7CisJREVCVUdfUFJJTlQoKCJmcmVxPSVkXG4iLCBzcGVjLT5mcmVxKSk7CisKKyAgICBpZiAoc3BlYy0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIHNwZWMtPmNoYW5uZWxzID0gMjsgIC8qIG5vIG1vcmUgdGhhbiBzdGVyZW8hICovCisgICAgfQorCisJc3BlYy0+Zm9ybWF0IHw9IDB4ODAwMDsJLyogQXVkaW8gaXMgYWx3YXlzIHNpZ25lZCAqLworCWlmICgoc3BlYy0+Zm9ybWF0ICYgMHgwMGZmKT09MTYpIHsKKwkJc3BlYy0+Zm9ybWF0IHw9IDB4MTAwMDsJLyogQXVkaW8gaXMgYWx3YXlzIGJpZyBlbmRpYW4gKi8KKwkJc3BlYy0+Y2hhbm5lbHM9MjsJLyogMTYgYml0cyBhbHdheXMgc3RlcmVvICovCisJfQorCisJTUlOVEFVRElPX2ZyZXFjb3VudD0wOworCisJLyogQWRkIGV4dGVybmFsIGNsb2NrcyBpZiBwcmVzZW50ICovCisJTWludF9DaGVja0V4dGVybmFsQ2xvY2sodGhpcyk7CisKKwkvKiBTdGFuZGFyZCBjbG9ja3MgKi8KKwlmb3IgKGk9MTtpPDEyO2krKykgeworCQkvKiBSZW1vdmUgdW51c2FibGUgRmFsY29uIGNvZGVjIHByZWRpdmlzb3JzICovCisJCWlmICgoaT09NikgfHwgKGk9PTgpIHx8IChpPT0xMCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCVNETF9NaW50QXVkaW9fQWRkRnJlcXVlbmN5KHRoaXMsIE1BU1RFUkNMT0NLX0ZBTENPTjEvKE1BU1RFUlBSRURJVl9GQUxDT04qKGkrMSkpLCBNQVNURVJDTE9DS19GQUxDT04xLCBpLCAtMSk7CisJfQorCisjaWYgMQorCWZvciAoaT0wOyBpPE1JTlRBVURJT19mcmVxY291bnQ7IGkrKykgeworCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiZnJlcSAlZDogJWx1IEh6LCBjbG9jayAlbHUsIHByZWRpdiAlZFxuIiwKKwkJCWksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5mcmVxdWVuY3ksIE1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5tYXN0ZXJjbG9jaywKKwkJCU1JTlRBVURJT19mcmVxdWVuY2llc1tpXS5wcmVkaXZpc29yCisJCSkpOworCX0KKyNlbmRpZgorCisJTUlOVEFVRElPX251bWZyZXE9U0RMX01pbnRBdWRpb19TZWFyY2hGcmVxdWVuY3kodGhpcywgc3BlYy0+ZnJlcSk7CisJc3BlYy0+ZnJlcT1NSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLmZyZXF1ZW5jeTsKKworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJvYnRhaW5lZDogJWQgYml0cywgIixzcGVjLT5mb3JtYXQgJiAweDAwZmYpKTsKKwlERUJVR19QUklOVCgoInNpZ25lZD0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDgwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiYmlnIGVuZGlhbj0lZCwgIiwgKChzcGVjLT5mb3JtYXQgJiAweDEwMDApIT0wKSkpOworCURFQlVHX1BSSU5UKCgiY2hhbm5lbHM9JWQsICIsIHNwZWMtPmNoYW5uZWxzKSk7CisJREVCVUdfUFJJTlQoKCJmcmVxPSVkXG4iLCBzcGVjLT5mcmVxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgTWludF9Jbml0QXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJaW50IGNoYW5uZWxzX21vZGUsIHByZWRpdjsKKwl2b2lkICpidWZmZXI7CisKKwkvKiBTdG9wIGN1cnJlbnRseSBwbGF5aW5nIHNvdW5kICovCisJU0RMX01pbnRBdWRpb19xdWl0X3RocmVhZCA9IFNETF9GQUxTRTsKKwlTRExfTWludEF1ZGlvX3RocmVhZF9maW5pc2hlZCA9IFNETF9UUlVFOworCVNETF9NaW50QXVkaW9fV2FpdFRocmVhZCgpOworCUJ1ZmZvcGVyKDApOworCisJLyogU2V0IHJlcGxheSB0cmFja3MgKi8KKwlTZXR0cmFja3MoMCwwKTsKKwlTZXRtb250cmFja3MoMCk7CisKKwkvKiBTZWxlY3QgcmVwbGF5IGZvcm1hdCAqLworCWNoYW5uZWxzX21vZGU9U1RFUkVPMTY7CisJc3dpdGNoIChzcGVjLT5mb3JtYXQgJiAweGZmKSB7CisJCWNhc2UgODoKKwkJCWlmIChzcGVjLT5jaGFubmVscz09MikgeworCQkJCWNoYW5uZWxzX21vZGU9U1RFUkVPODsKKwkJCX0gZWxzZSB7CisJCQkJY2hhbm5lbHNfbW9kZT1NT05PODsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwlpZiAoU2V0bW9kZShjaGFubmVsc19tb2RlKTwwKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTZXRtb2RlKCkgZmFpbGVkXG4iKSk7CisJfQorCisJcHJlZGl2ID0gTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5wcmVkaXZpc29yOworCWlmIChNSU5UQVVESU9fZnJlcXVlbmNpZXNbTUlOVEFVRElPX251bWZyZXFdLmdwaW9fYml0cyAhPSAtMSkgeworCQlHcGlvKEdQSU9fU0VULDcpOwkJLyogRFNQIHBvcnQgZ3BpbyBvdXRwdXRzICovCisJCUdwaW8oR1BJT19XUklURSwgTUlOVEFVRElPX2ZyZXF1ZW5jaWVzW01JTlRBVURJT19udW1mcmVxXS5ncGlvX2JpdHMpOworCQlEZXZjb25uZWN0MihETUFQTEFZLCBEQUN8RVhUT1VULCBDTEtFWFQsIHByZWRpdik7CisJfSBlbHNlIHsKKwkJRGV2Y29ubmVjdDIoRE1BUExBWSwgREFDLCBDTEsyNU0sIHByZWRpdik7CisJfQorCisJLyogU2V0IGJ1ZmZlciAqLworCWJ1ZmZlciA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbU0RMX01pbnRBdWRpb19udW1idWZdOworCWlmIChTZXRidWZmZXIoMCwgYnVmZmVyLCBidWZmZXIgKyBzcGVjLT5zaXplKTwwKSB7CisJCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJTZXRidWZmZXIoKSBmYWlsZWRcbiIpKTsKKwl9CisJCisJaWYgKFNETF9NaW50QXVkaW9fbWludF9wcmVzZW50KSB7CisJCVNETF9NaW50QXVkaW9fdGhyZWFkX3BpZCA9IHRmb3JrKFNETF9NaW50QXVkaW9fVGhyZWFkLCAwKTsKKwl9IGVsc2UgeworCQkvKiBJbnN0YWxsIGludGVycnVwdCAqLworCQlKZGlzaW50KE1GUF9ETUFTT1VORCk7CisJCS8qWGJ0aW1lcihYQl9USU1FUkEsIDgsIDEsIFNETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHQpOyovCisJCVhidGltZXIoWEJfVElNRVJBLCA4LCAxLCBTRExfTWludEF1ZGlvX0RtYThJbnRlcnJ1cHQpOworCQlKZW5hYmludChNRlBfRE1BU09VTkQpOworCisJCWlmIChTZXRpbnRlcnJ1cHQoU0lfVElNRVJBLCBTSV9QTEFZKTwwKSB7CisJCQlERUJVR19QUklOVCgoREVCVUdfTkFNRSAiU2V0aW50ZXJydXB0KCkgZmFpbGVkXG4iKSk7CisJCX0KKwl9CisKKwkvKiBHbyAqLworCUJ1ZmZvcGVyKFNCX1BMQV9FTkF8U0JfUExBX1JQVCk7CisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImhhcmR3YXJlIGluaXRpYWxpemVkXG4iKSk7Cit9CisKK3N0YXRpYyBpbnQgTWludF9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJLyogTG9jayBzb3VuZCBzeXN0ZW0gKi8KKwlpZiAoTG9ja3NuZCgpIT0xKSB7CisgICAJICAgIFNETF9TZXRFcnJvcigiTWludF9PcGVuQXVkaW86IEF1ZGlvIHN5c3RlbSBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICByZXR1cm4oLTEpOworCX0KKworCVNETF9NaW50QXVkaW9fZGV2aWNlID0gdGhpczsKKworCS8qIENoZWNrIGF1ZGlvIGNhcGFiaWxpdGllcyAqLworCWlmIChNaW50X0NoZWNrQXVkaW8odGhpcywgc3BlYyk9PS0xKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKHNwZWMpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBidWZmZXJzIGluIERNQS1hYmxlIFJBTSAqLworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgc2l6ZT0lZFxuIiwgc3BlYy0+c2l6ZSkpOworCisJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSA9IEF0YXJpX1N5c01hbGxvYyhzcGVjLT5zaXplICoyLCBNWF9TVFJBTSk7CisJaWYgKFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF09PU5VTEwpIHsKKwkJU0RMX1NldEVycm9yKCJNSU5UX09wZW5BdWRpbzogTm90IGVub3VnaCBtZW1vcnkgZm9yIGF1ZGlvIGJ1ZmZlciIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJU0RMX01pbnRBdWRpb19hdWRpb2J1ZlsxXSA9IFNETF9NaW50QXVkaW9fYXVkaW9idWZbMF0gKyBzcGVjLT5zaXplIDsKKwlTRExfTWludEF1ZGlvX251bWJ1Zj0wOworCVNETF9tZW1zZXQoU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSAqMik7CisJU0RMX01pbnRBdWRpb19hdWRpb3NpemUgPSBzcGVjLT5zaXplOworCVNETF9NaW50QXVkaW9fbXV0ZXggPSAwOworCisJREVCVUdfUFJJTlQoKERFQlVHX05BTUUgImJ1ZmZlciAwIGF0IDB4JTA4eFxuIiwgU0RMX01pbnRBdWRpb19hdWRpb2J1ZlswXSkpOworCURFQlVHX1BSSU5UKChERUJVR19OQU1FICJidWZmZXIgMSBhdCAweCUwOHhcbiIsIFNETF9NaW50QXVkaW9fYXVkaW9idWZbMV0pKTsKKworCVNETF9NaW50QXVkaW9fQ2hlY2tGcHUoKTsKKworCS8qIFNldHVwIGF1ZGlvIGhhcmR3YXJlICovCisJTWludF9Jbml0QXVkaW8odGhpcywgc3BlYyk7CisKKyAgICByZXR1cm4oMSk7CS8qIFdlIGRvbid0IHVzZSBTREwgdGhyZWFkZWQgYXVkaW8gKi8KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbW1lL1NETF9tbWVhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9tbWUvU0RMX21tZWF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhMGVjYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbW1lL1NETF9tbWVhdWRpby5jCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVHJ1NjQgVU5JWCBNTUUgc3VwcG9ydCAqLworI2luY2x1ZGUgPG1tZV9hcGkuaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiU0RMX21tZWF1ZGlvLmgiCisKK3N0YXRpYyBCT09MIGluVXNlW05VTV9CVUZGRVJTXTsKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBNTUVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIE1NRV9XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIFVpbnQ4ICpNTUVfR2V0QXVkaW9CdWYoX1RISVMpOworc3RhdGljIHZvaWQgTU1FX1BsYXlBdWRpbyhfVEhJUyk7CitzdGF0aWMgdm9pZCBNTUVfV2FpdERvbmUoX1RISVMpOworc3RhdGljIHZvaWQgTU1FX0Nsb3NlQXVkaW8oX1RISVMpOworCisvKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKyAgICByZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKyAgICBpZiAoIGRldmljZSApIHsKKwlpZiAoIGRldmljZS0+aGlkZGVuICkgeworCSAgICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJICAgIGRldmljZS0+aGlkZGVuID0gTlVMTDsKKwl9CisJU0RMX2ZyZWUoZGV2aWNlKTsKKwlkZXZpY2UgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKyAgICBTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKy8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisgICAgdGhpcyA9IFNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworICAgIGlmICggdGhpcyApIHsKKwlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwl0aGlzLT5oaWRkZW4gPSBTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworICAgIH0KKyAgICBpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJU0RMX091dE9mTWVtb3J5KCk7CisJaWYgKCB0aGlzICkgeworCSAgICBTRExfZnJlZSh0aGlzKTsKKwl9CisJcmV0dXJuKDApOworICAgIH0KKyAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisgICAgLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIHRoaXMtPk9wZW5BdWRpbyAgICAgICA9ICAgICAgIE1NRV9PcGVuQXVkaW87CisgICAgdGhpcy0+V2FpdEF1ZGlvICAgICAgID0gICAgICAgTU1FX1dhaXRBdWRpbzsKKyAgICB0aGlzLT5QbGF5QXVkaW8gICAgICAgPSAgICAgICBNTUVfUGxheUF1ZGlvOworICAgIHRoaXMtPkdldEF1ZGlvQnVmICAgICA9ICAgICBNTUVfR2V0QXVkaW9CdWY7CisgICAgdGhpcy0+V2FpdERvbmUgICAgICAgID0gICAgICAgIE1NRV9XYWl0RG9uZTsKKyAgICB0aGlzLT5DbG9zZUF1ZGlvICAgICAgPSAgICAgIE1NRV9DbG9zZUF1ZGlvOworICAgIHRoaXMtPmZyZWUgICAgICAgICAgICA9ICBBdWRpb19EZWxldGVEZXZpY2U7CisKKyAgICByZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgTU1FQVVESU9fYm9vdHN0cmFwID0geworICAgICJ3YXZlb3V0IiwgIlRydTY0IE1NRSBXYXZlT3V0IiwKKyAgICBBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworc3RhdGljIHZvaWQgU2V0TU1lcnJvcihjaGFyICpmdW5jdGlvbiwgTU1SRVNVTFQgY29kZSkKK3sKKyAgICBpbnQgbGVuOworICAgIGNoYXIgZXJyYnVmW01BWEVSUk9STEVOR1RIXTsKKworICAgIFNETF9zbnByaW50ZihlcnJidWYsIFNETF9hcnJheXNpemUoZXJyYnVmKSwgIiVzOiAiLCBmdW5jdGlvbik7CisgICAgbGVuID0gU0RMX3N0cmxlbihlcnJidWYpOworICAgIHdhdmVPdXRHZXRFcnJvclRleHQoY29kZSwgZXJyYnVmK2xlbiwgTUFYRVJST1JMRU5HVEgtbGVuKTsKKyAgICBTRExfU2V0RXJyb3IoIiVzIixlcnJidWYpOworfQorCitzdGF0aWMgdm9pZCBDQUxMQkFDSyBNTUVfQ0FMTEJBQ0soSFdBVkVPVVQgaHdvLAorCQkJCSAgVUlOVCB1TXNnLAorCQkJCSAgRFdPUkQgZHdJbnN0YW5jZSwKKwkJCQkgIExQQVJBTSBkd1BhcmFtMSwKKwkJCQkgIExQQVJBTSBkd1BhcmFtMikKK3sKKyAgICBXQVZFSERSICp3cCA9IChXQVZFSERSICopIGR3UGFyYW0xOworCisgICAgaWYgKCB1TXNnID09IFdPTV9ET05FICkKKwlpblVzZVt3cC0+ZHdVc2VyXSA9IEZBTFNFOworfQorCitzdGF0aWMgaW50IE1NRV9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisgICAgTU1SRVNVTFQgcmVzdWx0OworICAgIGludCBpOworCisgICAgbWl4YnVmID0gTlVMTDsKKworICAgIC8qIFNldCBiYXNpYyBXQVZFIGZvcm1hdCBwYXJhbWV0ZXJzICovCisgICAgc2htID0gbW1lQWxsb2NNZW0oc2l6ZW9mKCpzaG0pKTsKKyAgICBpZiAoIHNobSA9PSBOVUxMICkgeworCVNETF9TZXRFcnJvcigiT3V0IG9mIG1lbW9yeTogc2htIik7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgc2htLT5zb3VuZCA9IDA7CisgICAgc2htLT53Rm10LndmLndGb3JtYXRUYWcgPSBXQVZFX0ZPUk1BVF9QQ007CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGF1ZGlvIHBhcmFtZXRlcnMgZnJvbSB0aGUgQXVkaW9TcGVjICovCisgICAgc3dpdGNoICggc3BlYy0+Zm9ybWF0ICYgMHhGRiApIHsKKwljYXNlIDg6CisJICAgIC8qIFVuc2lnbmVkIDggYml0IGF1ZGlvIGRhdGEgKi8KKwkgICAgc3BlYy0+Zm9ybWF0ID0gQVVESU9fVTg7CisJICAgIHNobS0+d0ZtdC53Qml0c1BlclNhbXBsZSA9IDg7CisJICAgIGJyZWFrOworCWNhc2UgMTY6CisJICAgIC8qIFNpZ25lZCAxNiBiaXQgYXVkaW8gZGF0YSAqLworCSAgICBzcGVjLT5mb3JtYXQgPSBBVURJT19TMTY7CisJICAgIHNobS0+d0ZtdC53Qml0c1BlclNhbXBsZSA9IDE2OworCSAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKKwkgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBzaG0tPndGbXQud2YubkNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7CisgICAgc2htLT53Rm10LndmLm5TYW1wbGVzUGVyU2VjID0gc3BlYy0+ZnJlcTsKKyAgICBzaG0tPndGbXQud2YubkJsb2NrQWxpZ24gPQorCXNobS0+d0ZtdC53Zi5uQ2hhbm5lbHMgKiBzaG0tPndGbXQud0JpdHNQZXJTYW1wbGUgLyA4OworICAgIHNobS0+d0ZtdC53Zi5uQXZnQnl0ZXNQZXJTZWMgPQorCXNobS0+d0ZtdC53Zi5uU2FtcGxlc1BlclNlYyAqIHNobS0+d0ZtdC53Zi5uQmxvY2tBbGlnbjsKKworICAgIC8qIENoZWNrIHRoZSBidWZmZXIgc2l6ZSAtLSBtaW5pbXVtIG9mIDEvNCBzZWNvbmQgKHdvcmQgYWxpZ25lZCkgKi8KKyAgICBpZiAoIHNwZWMtPnNhbXBsZXMgPCAoc3BlYy0+ZnJlcS80KSApCisJc3BlYy0+c2FtcGxlcyA9ICgoc3BlYy0+ZnJlcS80KSszKSZ+MzsKKworICAgIC8qIFVwZGF0ZSB0aGUgZnJhZ21lbnQgc2l6ZSBhcyBzaXplIGluIGJ5dGVzICovCisgICAgU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKworICAgIC8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSAqLworICAgIHJlc3VsdCA9IHdhdmVPdXRPcGVuKCYoc2htLT5zb3VuZCksCisJCQkgV0FWRV9NQVBQRVIsCisJCQkgJihzaG0tPndGbXQud2YpLAorCQkJIE1NRV9DQUxMQkFDSywKKwkJCSBOVUxMLAorCQkJIChDQUxMQkFDS19GVU5DVElPTnxXQVZFX09QRU5fU0hBUkVBQkxFKSk7CisgICAgaWYgKCByZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUiApIHsKKwkgICAgU2V0TU1lcnJvcigid2F2ZU91dE9wZW4oKSIsIHJlc3VsdCk7CisJICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRoZSBzb3VuZCBidWZmZXJzICovCisgICAgbWl4YnVmID0gKFVpbnQ4ICopbW1lQWxsb2NCdWZmZXIoTlVNX0JVRkZFUlMgKiAoc3BlYy0+c2l6ZSkpOworICAgIGlmICggbWl4YnVmID09IE5VTEwgKSB7CisJU0RMX1NldEVycm9yKCJPdXQgb2YgbWVtb3J5OiBtaXhidWYiKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fQlVGRkVSUzsgaSsrKSB7CisJc2htLT53SGRyW2ldLmxwRGF0YSAgICAgICAgID0gJm1peGJ1ZltpICogKHNwZWMtPnNpemUpXTsKKwlzaG0tPndIZHJbaV0uZHdCdWZmZXJMZW5ndGggPSBzcGVjLT5zaXplOworCXNobS0+d0hkcltpXS5kd0ZsYWdzICAgICAgICA9IDA7CisJc2htLT53SGRyW2ldLmR3VXNlciAgICAgICAgID0gaTsKKwlzaG0tPndIZHJbaV0uZHdMb29wcyAgICAgICAgPSAwOyAgICAgICAvKiBsb29wIGNvbnRyb2wgY291bnRlciAqLworCXNobS0+d0hkcltpXS5scE5leHQgICAgICAgICA9IE5VTEw7ICAgIC8qIHJlc2VydmVkIGZvciBkcml2ZXIgKi8KKwlzaG0tPndIZHJbaV0ucmVzZXJ2ZWQgICAgICAgPSAwOworCWluVXNlW2ldID0gRkFMU0U7CisgICAgfQorICAgIG5leHRfYnVmZmVyID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgTU1FX1dhaXRBdWRpbyhfVEhJUykKK3sKKyAgICB3aGlsZSAoIGluVXNlW25leHRfYnVmZmVyXSApIHsKKwltbWVXYWl0Rm9yQ2FsbGJhY2tzKCk7CisJbW1lUHJvY2Vzc0NhbGxiYWNrcygpOworICAgIH0KK30KKworc3RhdGljIFVpbnQ4ICpNTUVfR2V0QXVkaW9CdWYoX1RISVMpCit7CisgICAgVWludDggKnJldHZhbDsKKworICAgIGluVXNlW25leHRfYnVmZmVyXSA9IFRSVUU7CisgICAgcmV0dmFsID0gKFVpbnQ4ICopKHNobS0+d0hkcltuZXh0X2J1ZmZlcl0ubHBEYXRhKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBNTUVfUGxheUF1ZGlvKF9USElTKQoreworICAgIC8qIFF1ZXVlIGl0IHVwICovCisgICAgd2F2ZU91dFdyaXRlKHNobS0+c291bmQsICYoc2htLT53SGRyW25leHRfYnVmZmVyXSksIHNpemVvZihXQVZFSERSKSk7CisgICAgbmV4dF9idWZmZXIgPSAobmV4dF9idWZmZXIrMSklTlVNX0JVRkZFUlM7Cit9CisKK3N0YXRpYyB2b2lkIE1NRV9XYWl0RG9uZShfVEhJUykKK3sKKyAgICBNTVJFU1VMVCByZXN1bHQ7CisgICAgaW50IGk7CisKKyAgICBpZiAoIHNobS0+c291bmQgKSB7CisJZm9yIChpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyBpKyspCisJICAgIHdoaWxlICggaW5Vc2VbaV0gKSB7CisJCW1tZVdhaXRGb3JDYWxsYmFja3MoKTsKKwkJbW1lUHJvY2Vzc0NhbGxiYWNrcygpOworCSAgICB9CisJcmVzdWx0ID0gd2F2ZU91dFJlc2V0KHNobS0+c291bmQpOworCWlmICggcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IgKQorCSAgICBTZXRNTWVycm9yKCJ3YXZlT3V0UmVzZXQoKSIsIHJlc3VsdCk7CisJbW1lUHJvY2Vzc0NhbGxiYWNrcygpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgTU1FX0Nsb3NlQXVkaW8oX1RISVMpCit7CisgICAgTU1SRVNVTFQgcmVzdWx0OworCisgICAgaWYgKCBtaXhidWYgKSB7CisJcmVzdWx0ID0gbW1lRnJlZUJ1ZmZlcihtaXhidWYpOworCWlmIChyZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUiApCisJICAgIFNldE1NZXJyb3IoIm1tZUZyZWVCdWZmZXIiLCByZXN1bHQpOworCW1peGJ1ZiA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKCBzaG0gKSB7CisJaWYgKCBzaG0tPnNvdW5kICkgeworCSAgICByZXN1bHQgPSB3YXZlT3V0Q2xvc2Uoc2htLT5zb3VuZCk7CisJICAgIGlmIChyZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUiApCisJCVNldE1NZXJyb3IoIndhdmVPdXRDbG9zZSgpIiwgcmVzdWx0KTsKKwkgICAgbW1lUHJvY2Vzc0NhbGxiYWNrcygpOworCX0KKwlyZXN1bHQgPSBtbWVGcmVlTWVtKHNobSk7CisJaWYgKHJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SICkKKwkgICAgU2V0TU1lcnJvcigibW1lRnJlZU1lbSgpIiwgcmVzdWx0KTsKKwlzaG0gPSBOVUxMOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9tbWUvU0RMX21tZWF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL21tZS9TRExfbW1lYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmZhZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9tbWUvU0RMX21tZWF1ZGlvLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCisKKyNpZm5kZWYgX1NETF9sb3dhdWRpb19oCisjZGVmaW5lIF9TRExfbG93YXVkaW9faAorCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKyNkZWZpbmUgTlVNX0JVRkZFUlMgMgorCitzdHJ1Y3QgU2hhcmVkTWVtIHsKKyAgICBIV0FWRU9VVCBzb3VuZDsKKyAgICBXQVZFSERSIHdIZHJbTlVNX0JVRkZFUlNdOworICAgIFBDTVdBVkVGT1JNQVQgd0ZtdDsKK307CisKK3N0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7CisgICAgVWludDggKm1peGJ1ZjsgICAgICAgICAgLyogVGhlIHJhdyBhbGxvY2F0ZWQgbWl4aW5nIGJ1ZmZlciAqLworICAgIHN0cnVjdCBTaGFyZWRNZW0gKnNobTsKKyAgICBpbnQgbmV4dF9idWZmZXI7Cit9OworCisjZGVmaW5lIHNobQkJCSh0aGlzLT5oaWRkZW4tPnNobSkKKyNkZWZpbmUgbWl4YnVmCQkJKHRoaXMtPmhpZGRlbi0+bWl4YnVmKQorI2RlZmluZSBuZXh0X2J1ZmZlcgkJKHRoaXMtPmhpZGRlbi0+bmV4dF9idWZmZXIpCisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNlbmRpZiAvKiBfU0RMX2xvd2F1ZGlvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbmFzL1NETF9uYXNhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9uYXMvU0RMX25hc2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2MWU2MgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbmFzL1NETF9uYXNhdWRpby5jCkBAIC0wLDAgKzEsNDIzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisKKyAgICBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiBieToKKyAgICBFcmlrIEluZ2UgQm9sc/gKKyAgICBrbmFuQG1vLmhpbW9sZGUubm8KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCisjaW5jbHVkZSAiU0RMX25hc2F1ZGlvLmgiCisKKyNpZmRlZiBTRExfQVVESU9fRFJJVkVSX05BU19EWU5BTUlDCisjaW5jbHVkZSAiU0RMX2xvYWRzby5oIgorI2VuZGlmCisKKy8qIFRoZSB0YWcgbmFtZSB1c2VkIGJ5IGFydHNjIGF1ZGlvICovCisjZGVmaW5lIE5BU19EUklWRVJfTkFNRSAgICAgICAgICJuYXMiCisKK3N0YXRpYyBzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKnRoaXMyID0gTlVMTDsKKworc3RhdGljIHZvaWQgKCpOQVNfQXVDbG9zZVNlcnZlcikgKEF1U2VydmVyICopOworc3RhdGljIHZvaWQgKCpOQVNfQXVOZXh0RXZlbnQpIChBdVNlcnZlciAqLCBBdUJvb2wsIEF1RXZlbnQgKik7CitzdGF0aWMgQXVCb29sKCpOQVNfQXVEaXNwYXRjaEV2ZW50KSAoQXVTZXJ2ZXIgKiwgQXVFdmVudCAqKTsKK3N0YXRpYyBBdUZsb3dJRCgqTkFTX0F1Q3JlYXRlRmxvdykgKEF1U2VydmVyICosIEF1U3RhdHVzICopOworc3RhdGljIHZvaWQgKCpOQVNfQXVTdGFydEZsb3cpIChBdVNlcnZlciAqLCBBdUZsb3dJRCwgQXVTdGF0dXMgKik7CitzdGF0aWMgdm9pZCAoKk5BU19BdVNldEVsZW1lbnRzKQorICAoQXVTZXJ2ZXIgKiwgQXVGbG93SUQsIEF1Qm9vbCwgaW50LCBBdUVsZW1lbnQgKiwgQXVTdGF0dXMgKik7CitzdGF0aWMgdm9pZCAoKk5BU19BdVdyaXRlRWxlbWVudCkKKyAgKEF1U2VydmVyICosIEF1Rmxvd0lELCBpbnQsIEF1VWludDMyLCBBdVBvaW50ZXIsIEF1Qm9vbCwgQXVTdGF0dXMgKik7CitzdGF0aWMgQXVTZXJ2ZXIgKigqTkFTX0F1T3BlblNlcnZlcikKKyAgKF9BdUNvbnN0IGNoYXIgKiwgaW50LCBfQXVDb25zdCBjaGFyICosIGludCwgX0F1Q29uc3QgY2hhciAqLCBjaGFyICoqKTsKK3N0YXRpYyBBdUV2ZW50SGFuZGxlclJlYyAqKCpOQVNfQXVSZWdpc3RlckV2ZW50SGFuZGxlcikKKyAgKEF1U2VydmVyICosIEF1TWFzaywgaW50LCBBdUlELCBBdUV2ZW50SGFuZGxlckNhbGxiYWNrLCBBdVBvaW50ZXIpOworCisKKyNpZmRlZiBTRExfQVVESU9fRFJJVkVSX05BU19EWU5BTUlDCisKK3N0YXRpYyBjb25zdCBjaGFyICpuYXNfbGlicmFyeSA9IFNETF9BVURJT19EUklWRVJfTkFTX0RZTkFNSUM7CitzdGF0aWMgdm9pZCAqbmFzX2hhbmRsZSA9IE5VTEw7CisKK3N0YXRpYyBpbnQKK2xvYWRfbmFzX3N5bShjb25zdCBjaGFyICpmbiwgdm9pZCAqKmFkZHIpCit7CisgICAgKmFkZHIgPSBTRExfTG9hZEZ1bmN0aW9uKG5hc19oYW5kbGUsIGZuKTsKKyAgICBpZiAoKmFkZHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIGNhc3QgZnVuY3MgdG8gY2hhciogZmlyc3QsIHRvIHBsZWFzZSBHQ0MncyBzdHJpY3QgYWxpYXNpbmcgcnVsZXMuICovCisjZGVmaW5lIFNETF9OQVNfU1lNKHgpIFwKKyAgICBpZiAoIWxvYWRfbmFzX3N5bSgjeCwgKHZvaWQgKiopIChjaGFyICopICZOQVNfIyN4KSkgcmV0dXJuIC0xCisjZWxzZQorI2RlZmluZSBTRExfTkFTX1NZTSh4KSBOQVNfIyN4ID0geAorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2xvYWRfbmFzX3N5bXModm9pZCkKK3sKKyAgICBTRExfTkFTX1NZTShBdUNsb3NlU2VydmVyKTsKKyAgICBTRExfTkFTX1NZTShBdU5leHRFdmVudCk7CisgICAgU0RMX05BU19TWU0oQXVEaXNwYXRjaEV2ZW50KTsKKyAgICBTRExfTkFTX1NZTShBdUNyZWF0ZUZsb3cpOworICAgIFNETF9OQVNfU1lNKEF1U3RhcnRGbG93KTsKKyAgICBTRExfTkFTX1NZTShBdVNldEVsZW1lbnRzKTsKKyAgICBTRExfTkFTX1NZTShBdVdyaXRlRWxlbWVudCk7CisgICAgU0RMX05BU19TWU0oQXVPcGVuU2VydmVyKTsKKyAgICBTRExfTkFTX1NZTShBdVJlZ2lzdGVyRXZlbnRIYW5kbGVyKTsKKyAgICByZXR1cm4gMDsKK30KKworI3VuZGVmIFNETF9OQVNfU1lNCisKKyNpZmRlZiBTRExfQVVESU9fRFJJVkVSX05BU19EWU5BTUlDCisKK3N0YXRpYyB2b2lkCitVbmxvYWROQVNMaWJyYXJ5KHZvaWQpCit7CisgICAgaWYgKG5hc19oYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBTRExfVW5sb2FkT2JqZWN0KG5hc19oYW5kbGUpOworICAgICAgICBuYXNfaGFuZGxlID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK0xvYWROQVNMaWJyYXJ5KHZvaWQpCit7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgaWYgKG5hc19oYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBuYXNfaGFuZGxlID0gU0RMX0xvYWRPYmplY3QobmFzX2xpYnJhcnkpOworICAgICAgICBpZiAobmFzX2hhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBDb3B5IGVycm9yIHN0cmluZyBzbyB3ZSBjYW4gdXNlIGl0IGluIGEgbmV3IFNETF9TZXRFcnJvcigpLiAqLworICAgICAgICAgICAgY2hhciAqb3JpZ2VyciA9IFNETF9HZXRFcnJvcigpOworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IFNETF9zdHJsZW4ob3JpZ2VycikgKyAxOworICAgICAgICAgICAgY2hhciAqZXJyID0gKGNoYXIgKikgYWxsb2NhKGxlbik7CisgICAgICAgICAgICBTRExfc3RybGNweShlcnIsIG9yaWdlcnIsIGxlbik7CisgICAgICAgICAgICByZXR2YWwgPSAtMTsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigiTkFTOiBTRExfTG9hZE9iamVjdCgnJXMnKSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hc19saWJyYXJ5LCBlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dmFsID0gbG9hZF9uYXNfc3ltcygpOworICAgICAgICAgICAgaWYgKHJldHZhbCA8IDApIHsKKyAgICAgICAgICAgICAgICBVbmxvYWROQVNMaWJyYXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQKK1VubG9hZE5BU0xpYnJhcnkodm9pZCkKK3sKK30KKworc3RhdGljIGludAorTG9hZE5BU0xpYnJhcnkodm9pZCkKK3sKKyAgICBsb2FkX25hc19zeW1zKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBTRExfQVVESU9fRFJJVkVSX05BU19EWU5BTUlDICovCisKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBOQVNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIE5BU19XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgTkFTX1BsYXlBdWRpbyhfVEhJUyk7CitzdGF0aWMgVWludDggKk5BU19HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBOQVNfQ2xvc2VBdWRpbyhfVEhJUyk7CisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisJaWYgKExvYWROQVNMaWJyYXJ5KCkgPT0gMCkgeworCQlBdVNlcnZlciAqYXVkID0gTkFTX0F1T3BlblNlcnZlcigiIiwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisJCWlmICghYXVkKSB7CisJCQlVbmxvYWROQVNMaWJyYXJ5KCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlOQVNfQXVDbG9zZVNlcnZlcihhdWQpOworCQlVbmxvYWROQVNMaWJyYXJ5KCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQoreworCVVubG9hZE5BU0xpYnJhcnkoKTsKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKwlpZiAoTG9hZE5BU0xpYnJhcnkoKSA8IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworCWlmICggdGhpcyApIHsKKwkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisJCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKKwkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCX0KKwlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIHRoaXMgKSB7CisJCQlTRExfZnJlZSh0aGlzKTsKKwkJfQorCQlyZXR1cm4gTlVMTDsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IE5BU19PcGVuQXVkaW87CisJdGhpcy0+V2FpdEF1ZGlvID0gTkFTX1dhaXRBdWRpbzsKKwl0aGlzLT5QbGF5QXVkaW8gPSBOQVNfUGxheUF1ZGlvOworCXRoaXMtPkdldEF1ZGlvQnVmID0gTkFTX0dldEF1ZGlvQnVmOworCXRoaXMtPkNsb3NlQXVkaW8gPSBOQVNfQ2xvc2VBdWRpbzsKKworCXRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgTkFTX2Jvb3RzdHJhcCA9IHsKKwlOQVNfRFJJVkVSX05BTUUsICJOZXR3b3JrIEF1ZGlvIFN5c3RlbSIsCisJQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gd2FpdHMgdW50aWwgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgYSBmdWxsIHNvdW5kIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgTkFTX1dhaXRBdWRpbyhfVEhJUykKK3sKKwl3aGlsZSAoIHRoaXMtPmhpZGRlbi0+YnVmX2ZyZWUgPCB0aGlzLT5oaWRkZW4tPm1peGxlbiApIHsKKwkJQXVFdmVudCBldjsKKwkJTkFTX0F1TmV4dEV2ZW50KHRoaXMtPmhpZGRlbi0+YXVkLCBBdVRydWUsICZldik7CisJCU5BU19BdURpc3BhdGNoRXZlbnQodGhpcy0+aGlkZGVuLT5hdWQsICZldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBOQVNfUGxheUF1ZGlvKF9USElTKQoreworCXdoaWxlICh0aGlzLT5oaWRkZW4tPm1peGxlbiA+IHRoaXMtPmhpZGRlbi0+YnVmX2ZyZWUpIHsgLyogV2UgdGhpbmsgdGhlIGJ1ZmZlciBpcyBmdWxsPyBZaWtlcyEgQXNrIHRoZSBzZXJ2ZXIgZm9yIGV2ZW50cywKKwkJCQkgICAgaW4gdGhlIGhvcGUgdGhhdCBzb21lIG9mIHRoZW0gaXMgTG93V2F0ZXIgZXZlbnRzIHRlbGxpbmcgdXMgbW9yZQorCQkJCSAgICBvZiB0aGUgYnVmZmVyIGlzIGZyZWUgbm93IHRoYW4gd2hhdCB3ZSB0aGluay4gKi8KKwkJQXVFdmVudCBldjsKKwkJTkFTX0F1TmV4dEV2ZW50KHRoaXMtPmhpZGRlbi0+YXVkLCBBdVRydWUsICZldik7CisJCU5BU19BdURpc3BhdGNoRXZlbnQodGhpcy0+aGlkZGVuLT5hdWQsICZldik7CisJfQorCXRoaXMtPmhpZGRlbi0+YnVmX2ZyZWUgLT0gdGhpcy0+aGlkZGVuLT5taXhsZW47CisKKwkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSAqLworCU5BU19BdVdyaXRlRWxlbWVudCh0aGlzLT5oaWRkZW4tPmF1ZCwgdGhpcy0+aGlkZGVuLT5mbG93LCAwLCB0aGlzLT5oaWRkZW4tPm1peGxlbiwgdGhpcy0+aGlkZGVuLT5taXhidWYsIEF1RmFsc2UsIE5VTEwpOworCisJdGhpcy0+aGlkZGVuLT53cml0dGVuICs9IHRoaXMtPmhpZGRlbi0+bWl4bGVuOworCQorI2lmZGVmIERFQlVHX0FVRElPCisJZnByaW50ZihzdGRlcnIsICJXcm90ZSAlZCBieXRlcyBvZiBhdWRpbyBkYXRhXG4iLCB0aGlzLT5oaWRkZW4tPm1peGxlbik7CisjZW5kaWYKK30KKworc3RhdGljIFVpbnQ4ICpOQVNfR2V0QXVkaW9CdWYoX1RISVMpCit7CisJcmV0dXJuKHRoaXMtPmhpZGRlbi0+bWl4YnVmKTsKK30KKworc3RhdGljIHZvaWQgTkFTX0Nsb3NlQXVkaW8oX1RISVMpCit7CisJaWYgKCB0aGlzLT5oaWRkZW4tPm1peGJ1ZiAhPSBOVUxMICkgeworCQlTRExfRnJlZUF1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4YnVmKTsKKwkJdGhpcy0+aGlkZGVuLT5taXhidWYgPSBOVUxMOworCX0KKwlpZiAoIHRoaXMtPmhpZGRlbi0+YXVkICkgeworCQlOQVNfQXVDbG9zZVNlcnZlcih0aGlzLT5oaWRkZW4tPmF1ZCk7CisJCXRoaXMtPmhpZGRlbi0+YXVkID0gMDsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNkbGZvcm1hdF90b19hdWZvcm1hdCh1bnNpZ25lZCBpbnQgZm10KQoreworICBzd2l0Y2ggKGZtdCkKKyAgICB7CisgICAgY2FzZSBBVURJT19VODoKKyAgICAgIHJldHVybiBBdUZvcm1hdExpbmVhclVuc2lnbmVkODsKKyAgICBjYXNlIEFVRElPX1M4OgorICAgICAgcmV0dXJuIEF1Rm9ybWF0TGluZWFyU2lnbmVkODsKKyAgICBjYXNlIEFVRElPX1UxNkxTQjoKKyAgICAgIHJldHVybiBBdUZvcm1hdExpbmVhclVuc2lnbmVkMTZMU0I7CisgICAgY2FzZSBBVURJT19VMTZNU0I6CisgICAgICByZXR1cm4gQXVGb3JtYXRMaW5lYXJVbnNpZ25lZDE2TVNCOworICAgIGNhc2UgQVVESU9fUzE2TFNCOgorICAgICAgcmV0dXJuIEF1Rm9ybWF0TGluZWFyU2lnbmVkMTZMU0I7CisgICAgY2FzZSBBVURJT19TMTZNU0I6CisgICAgICByZXR1cm4gQXVGb3JtYXRMaW5lYXJTaWduZWQxNk1TQjsKKyAgICB9CisgIHJldHVybiBBdU5vbmU7Cit9CisKK3N0YXRpYyBBdUJvb2wKK2V2ZW50X2hhbmRsZXIoQXVTZXJ2ZXIqIGF1ZCwgQXVFdmVudCogZXYsIEF1RXZlbnRIYW5kbGVyUmVjKiBobmQpCit7CisJc3dpdGNoIChldi0+dHlwZSkgeworCWNhc2UgQXVFdmVudFR5cGVFbGVtZW50Tm90aWZ5OiB7CisJCUF1RWxlbWVudE5vdGlmeUV2ZW50KiBldmVudCA9IChBdUVsZW1lbnROb3RpZnlFdmVudCAqKWV2OworCisJCXN3aXRjaCAoZXZlbnQtPmtpbmQpIHsKKwkJY2FzZSBBdUVsZW1lbnROb3RpZnlLaW5kTG93V2F0ZXI6CisJCQlpZiAodGhpczItPmJ1Zl9mcmVlID49IDApIHsKKwkJCQl0aGlzMi0+cmVhbGx5ICs9IGV2ZW50LT5udW1fYnl0ZXM7CisJCQkJZ2V0dGltZW9mZGF5KCZ0aGlzMi0+bGFzdF90diwgMCk7CisJCQkJdGhpczItPmJ1Zl9mcmVlICs9IGV2ZW50LT5udW1fYnl0ZXM7CisJCQl9IGVsc2UgeworCQkJCXRoaXMyLT5idWZfZnJlZSA9IGV2ZW50LT5udW1fYnl0ZXM7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBBdUVsZW1lbnROb3RpZnlLaW5kU3RhdGU6CisJCQlzd2l0Y2ggKGV2ZW50LT5jdXJfc3RhdGUpIHsKKwkJCWNhc2UgQXVTdGF0ZVBhdXNlOgorCQkJCWlmIChldmVudC0+cmVhc29uICE9IEF1UmVhc29uVXNlcikgeworCQkJCQlpZiAodGhpczItPmJ1Zl9mcmVlID49IDApIHsKKwkJCQkJCXRoaXMyLT5yZWFsbHkgKz0gZXZlbnQtPm51bV9ieXRlczsKKwkJCQkJCWdldHRpbWVvZmRheSgmdGhpczItPmxhc3RfdHYsIDApOworCQkJCQkJdGhpczItPmJ1Zl9mcmVlICs9IGV2ZW50LT5udW1fYnl0ZXM7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGlzMi0+YnVmX2ZyZWUgPSBldmVudC0+bnVtX2J5dGVzOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCX0KKwlyZXR1cm4gQXVUcnVlOworfQorCitzdGF0aWMgQXVEZXZpY2VJRAorZmluZF9kZXZpY2UoX1RISVMsIGludCBuY2gpCit7CisgICAgLyogVGhlc2UgIkF1IiB0aGluZ3MgYXJlIGFsbCBtYWNyb3MsIG5vdCBmdW5jdGlvbnMuLi4gKi8KKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQXVTZXJ2ZXJOdW1EZXZpY2VzKHRoaXMtPmhpZGRlbi0+YXVkKTsgaSsrKSB7CisJCWlmICgoQXVEZXZpY2VLaW5kKEF1U2VydmVyRGV2aWNlKHRoaXMtPmhpZGRlbi0+YXVkLCBpKSkgPT0KKwkJCQlBdUNvbXBvbmVudEtpbmRQaHlzaWNhbE91dHB1dCkgJiYKKwkJCUF1RGV2aWNlTnVtVHJhY2tzKEF1U2VydmVyRGV2aWNlKHRoaXMtPmhpZGRlbi0+YXVkLCBpKSkgPT0gbmNoKSB7CisJCQlyZXR1cm4gQXVEZXZpY2VJZGVudGlmaWVyKEF1U2VydmVyRGV2aWNlKHRoaXMtPmhpZGRlbi0+YXVkLCBpKSk7CisJCX0KKwl9CisJcmV0dXJuIEF1Tm9uZTsKK30KKworc3RhdGljIGludCBOQVNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCUF1RWxlbWVudCBlbG1zWzNdOworCWludCBidWZmZXJfc2l6ZTsKKwlVaW50MTYgdGVzdF9mb3JtYXQsIGZvcm1hdDsKKworCXRoaXMtPmhpZGRlbi0+bWl4YnVmID0gTlVMTDsKKworCS8qIFRyeSBmb3IgYSBjbG9zZXN0IG1hdGNoIG9uIGF1ZGlvIGZvcm1hdCAqLworCWZvcm1hdCA9IDA7CisJZm9yICggdGVzdF9mb3JtYXQgPSBTRExfRmlyc3RBdWRpb0Zvcm1hdChzcGVjLT5mb3JtYXQpOworCQkJCQkJISBmb3JtYXQgJiYgdGVzdF9mb3JtYXQ7ICkgeworCQlmb3JtYXQgPSBzZGxmb3JtYXRfdG9fYXVmb3JtYXQodGVzdF9mb3JtYXQpOworCisJCWlmIChmb3JtYXQgPT0gQXVOb25lKSB7CisJCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKKwkJfQorCX0KKwlpZiAoIGZvcm1hdCA9PSAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHMiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7CisKKwl0aGlzLT5oaWRkZW4tPmF1ZCA9IE5BU19BdU9wZW5TZXJ2ZXIoIiIsIDAsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCWlmICh0aGlzLT5oaWRkZW4tPmF1ZCA9PSAwKQorCXsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuIGNvbm5lY3Rpb24gdG8gTkFTIHNlcnZlciIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJCisJdGhpcy0+aGlkZGVuLT5kZXYgPSBmaW5kX2RldmljZSh0aGlzLCBzcGVjLT5jaGFubmVscyk7CisJaWYgKCh0aGlzLT5oaWRkZW4tPmRldiA9PSBBdU5vbmUpIHx8ICghKHRoaXMtPmhpZGRlbi0+ZmxvdyA9IE5BU19BdUNyZWF0ZUZsb3codGhpcy0+aGlkZGVuLT5hdWQsIE5VTEwpKSkpIHsKKwkJTkFTX0F1Q2xvc2VTZXJ2ZXIodGhpcy0+aGlkZGVuLT5hdWQpOworCQl0aGlzLT5oaWRkZW4tPmF1ZCA9IDA7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCBhIGZpdHRpbmcgcGxheWJhY2sgZGV2aWNlIG9uIE5BUyBzZXJ2ZXIiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCQorCWJ1ZmZlcl9zaXplID0gc3BlYy0+ZnJlcTsKKwlpZiAoYnVmZmVyX3NpemUgPCA0MDk2KQorCQlidWZmZXJfc2l6ZSA9IDQwOTY7IAorCisJaWYgKGJ1ZmZlcl9zaXplID4gMzI3NjgpCisJCWJ1ZmZlcl9zaXplID0gMzI3Njg7IC8qIFNvIHRoYXQgdGhlIGJ1ZmZlciB3b24ndCBnZXQgdW5tYW5hZ2VhYmx5IGJpZy4gKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgZmluYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBhdWRpbyBzcGVjaWZpY2F0aW9uICovCisJU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKworCXRoaXMyID0gdGhpcy0+aGlkZGVuOworCisgICAgLyogVGhlc2UgIkF1IiB0aGluZ3Mgd2l0aG91dCBhIE5BU18gcHJlZml4IGFyZSBtYWNyb3MsIG5vdCBmdW5jdGlvbnMuLi4gKi8KKwlBdU1ha2VFbGVtZW50SW1wb3J0Q2xpZW50KGVsbXMsIHNwZWMtPmZyZXEsIGZvcm1hdCwgc3BlYy0+Y2hhbm5lbHMsIEF1VHJ1ZSwKKwkJCQlidWZmZXJfc2l6ZSwgYnVmZmVyX3NpemUgLyA0LCAwLCBOVUxMKTsKKwlBdU1ha2VFbGVtZW50RXhwb3J0RGV2aWNlKGVsbXMrMSwgMCwgdGhpcy0+aGlkZGVuLT5kZXYsIHNwZWMtPmZyZXEsCisJCQkJQXVVbmxpbWl0ZWRTYW1wbGVzLCAwLCBOVUxMKTsKKwlOQVNfQXVTZXRFbGVtZW50cyh0aGlzLT5oaWRkZW4tPmF1ZCwgdGhpcy0+aGlkZGVuLT5mbG93LCBBdVRydWUsIDIsIGVsbXMsIE5VTEwpOworCU5BU19BdVJlZ2lzdGVyRXZlbnRIYW5kbGVyKHRoaXMtPmhpZGRlbi0+YXVkLCBBdUV2ZW50SGFuZGxlcklETWFzaywgMCwgdGhpcy0+aGlkZGVuLT5mbG93LAorCQkJCWV2ZW50X2hhbmRsZXIsIChBdVBvaW50ZXIpIE5VTEwpOworCisJTkFTX0F1U3RhcnRGbG93KHRoaXMtPmhpZGRlbi0+YXVkLCB0aGlzLT5oaWRkZW4tPmZsb3csIE5VTEwpOworCisJLyogQWxsb2NhdGUgbWl4aW5nIGJ1ZmZlciAqLworCXRoaXMtPmhpZGRlbi0+bWl4bGVuID0gc3BlYy0+c2l6ZTsKKwl0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IChVaW50OCAqKVNETF9BbGxvY0F1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4bGVuKTsKKwlpZiAoIHRoaXMtPmhpZGRlbi0+bWl4YnVmID09IE5VTEwgKSB7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLT5taXhidWYsIHNwZWMtPnNpbGVuY2UsIHNwZWMtPnNpemUpOworCisJLyogR2V0IHRoZSBwYXJlbnQgcHJvY2VzcyBpZCAod2UncmUgdGhlIHBhcmVudCBvZiB0aGUgYXVkaW8gdGhyZWFkKSAqLworCXRoaXMtPmhpZGRlbi0+cGFyZW50ID0gZ2V0cGlkKCk7CisKKwkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL25hcy9TRExfbmFzYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbmFzL1NETF9uYXNhdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDk2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL25hcy9TRExfbmFzYXVkaW8uaApAQCAtMCwwICsxLDYyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisKKyAgICBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiBieToKKyAgICBFcmlrIEluZ2UgQm9sc/gKKyAgICBrbmFuQG1vLmhpbW9sZGUubm8KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfbmFzYXVkaW9faAorI2RlZmluZSBfU0RMX25hc2F1ZGlvX2gKKworI2lmZGVmIF9fc2dpCisjaW5jbHVkZSA8bmFzL2F1ZGlvbGliLmg+CisjZWxzZQorI2luY2x1ZGUgPGF1ZGlvL2F1ZGlvbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwlBdVNlcnZlciogIGF1ZDsKKwlBdUZsb3dJRCAgIGZsb3c7CisJQXVEZXZpY2VJRCBkZXY7CisJCisJLyogVGhlIHBhcmVudCBwcm9jZXNzIGlkLCB0byBkZXRlY3Qgd2hlbiBhcHBsaWNhdGlvbiBxdWl0cyAqLworCXBpZF90IHBhcmVudDsKKworCS8qIFJhdyBtaXhpbmcgYnVmZmVyICovCisJVWludDggKm1peGJ1ZjsKKwlpbnQgICAgbWl4bGVuOworCisJaW50IHdyaXR0ZW47CisJaW50IHJlYWxseTsKKwlpbnQgYnBzOworCXN0cnVjdCB0aW1ldmFsIGxhc3RfdHY7CisJaW50IGJ1Zl9mcmVlOworfTsKKyNlbmRpZiAvKiBfU0RMX25hc2F1ZGlvX2ggKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9uZHMvU0RMX25kc2F1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL25kcy9TRExfbmRzYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUxNDFhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9uZHMvU0RMX25kc2F1ZGlvLmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLworI2luY2x1ZGUgPG5kcy5oPgorI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIlNETF9uZHNhdWRpby5oIgorI2luY2x1ZGUgInNvdW5kY29tbW9uLmgiCisKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBORFNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIE5EU19XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgTkRTX1BsYXlBdWRpbyhfVEhJUyk7CitzdGF0aWMgVWludDggKk5EU19HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBORFNfQ2xvc2VBdWRpbyhfVEhJUyk7CisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3UzMiBmcmFtZWNvdW50ZXIgPSAwLHNvdW5kb2Zmc2V0ID0gMDsKK3N0YXRpYyBTRExfQXVkaW9EZXZpY2UgKnNkbF9uZHNfYXVkaW9kZXZpY2U7IAorCisvL3ZvaWQgU291bmRNaXhDYWxsYmFjayh2b2lkICpzdHJlYW0sdTMyIHNpemUpCisvL3sKKy8vCS8vcHJpbnRmKCJTb3VuZE1peENhbGxiYWNrXG4iKTsKKy8vCQorLy8JVWludDggKmJ1ZmZlcjsKKy8vCSAKKy8vIAlidWZmZXIgPSBzZGxfbmRzX2F1ZGlvZGV2aWNlLT5oaWRkZW4tPm1peGJ1ZjsKKy8vCW1lbXNldChidWZmZXIsIHNkbF9uZHNfYXVkaW9kZXZpY2UtPnNwZWMuc2lsZW5jZSwgc2l6ZSk7CisvLwkKKy8vCWlmICghc2RsX25kc19hdWRpb2RldmljZS0+cGF1c2VkKXsgCisvLwkJIAorLy8KKy8vCS8vaWYgKHNkbF9uZHNfYXVkaW9kZXZpY2UtPmNvbnZlcnQubmVlZGVkKSB7CisvLwkvLwlpbnQgc2lsZW5jZTsKKy8vCisvLwkvLwlpZiAoc2RsX25kc19hdWRpb2RldmljZS0+Y29udmVydC5zcmNfZm9ybWF0ID09IEFVRElPX1U4ICkgeyAKKy8vCS8vCQlzaWxlbmNlID0gMHg4MDsKKy8vCS8vCX0gZWxzZSB7CisvLwkvLwkJc2lsZW5jZSA9ICAwOyAKKy8vCS8vCX0KKy8vCS8vCW1lbXNldChzZGxfbmRzX2F1ZGlvZGV2aWNlLT5jb252ZXJ0LmJ1Ziwgc2lsZW5jZSwgc2RsX25kc19hdWRpb2RldmljZS0+Y29udmVydC5sZW4pOworLy8JLy8Jc2RsX25kc19hdWRpb2RldmljZS0+c3BlYy5jYWxsYmFjayhzZGxfbmRzX2F1ZGlvZGV2aWNlLT5zcGVjLnVzZXJkYXRhLAorLy8JLy8JCShVaW50OCAqKXNkbF9uZHNfYXVkaW9kZXZpY2UtPmNvbnZlcnQuYnVmLHNkbF9uZHNfYXVkaW9kZXZpY2UtPmNvbnZlcnQubGVuKTsKKy8vCS8vCVNETF9Db252ZXJ0QXVkaW8oJnNkbF9uZHNfYXVkaW9kZXZpY2UtPmNvbnZlcnQpOworLy8JLy8JbWVtY3B5KGJ1ZmZlciwgc2RsX25kc19hdWRpb2RldmljZS0+Y29udmVydC5idWYsIHNkbF9uZHNfYXVkaW9kZXZpY2UtPmNvbnZlcnQubGVuX2N2dCk7CisvLwkvL30gZWxzZSAKKy8vCXsKKy8vCQlzZGxfbmRzX2F1ZGlvZGV2aWNlLT5zcGVjLmNhbGxiYWNrKHNkbF9uZHNfYXVkaW9kZXZpY2UtPnNwZWMudXNlcmRhdGEsIGJ1ZmZlciwgc2l6ZSk7CisvLwkJLy9tZW1jcHkoKFNpbnQxNiAqKXN0cmVhbSxidWZmZXIsIHNpemUpOworLy8JfQorLy8KKy8vCX0KKy8vCisvLwlpZihzb3VuZHN5c3RlbS0+Zm9ybWF0ID09IDgpCisvLwl7CisvLwkJaW50IGk7CisvLwkJczMyICpidWZmZXIzMiA9IChzMzIgKilidWZmZXI7IAorLy8JCXMzMiAqc3RyZWFtMzIgPSAoczMyICopc3RyZWFtOworLy8JCWZvcihpPTA7aTxzaXplLzQ7aSsrKXsgKnN0cmVhbTMyKysgPSBidWZmZXIzMltpXSBeIDB4ODA4MDgwODA7fQorLy8JCS8vZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorLy8JCS8vCSgoczgqKXN0cmVhbSlbaV09KGJ1ZmZlcltpXV4weDgwKTsKKy8vCX0KKy8vCWVsc2UKKy8vCXsKKy8vCQlpbnQgaTsKKy8vCQlmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspeworLy8JCQkvLygoc2hvcnQqKXN0cmVhbSlbaV0gPShzaG9ydClidWZmZXJbaV0gPDwgODsJCQkJLy8gc291bmQgOGJpdCAtLS0+IGJ1ZmZlciAxNmJpdAorLy8JCQkvL2lmIChidWZmZXJbaV0gJjB4ODApCisvLwkJCQkvLygoU2ludDE2KilzdHJlYW0pW2ldID0gMHhmZjAwIHwgYnVmZmVyW2ldOworLy8JCQkoKFNpbnQxNiopc3RyZWFtKVtpXSA9IChidWZmZXJbaV0gLSAxMjgpIDw8IDg7CisvLworLy8JCQkvL2Vsc2UKKy8vCQkJLy8JKChTaW50MTYqKXN0cmVhbSlbaV0gPSBidWZmZXJbaV07CisvLwkJfQorLy8JCS8vcmVnaXN0ZXIgc2lnbmVkIGNoYXIgKnBTcmMgPWJ1ZmZlcjsKKy8vCQkvL3JlZ2lzdGVyIHNob3J0ICpwRGVzdCA9c3RyZWFtOworLy8JCS8vaW50IHg7CisvLwkJLy8JCQlmb3IgKHg9c2l6ZTsgeD4wOyB4LS0pCisvLwkJLy8JCQl7CisvLwkJLy8JCQkJcmVnaXN0ZXIgc2hvcnQgdGVtcCA9ICgoKHNob3J0KSpwU3JjKS0xMjgpPDw4OworLy8JCS8vCQkJCXBTcmMrKzsKKy8vCQkvLwkJCQkqcERlc3QrKyA9IHRlbXA7CisvLwkJLy8JCQl9CisvLworLy8JCS8vbWVtY3B5KChTaW50MTYgKilzdHJlYW0sYnVmZmVyLCBzaXplKTsKKy8vCX0KKy8vfQorCit2b2lkIFNvdW5kTWl4Q2FsbGJhY2sodm9pZCAqc3RyZWFtLHUzMiBsZW4pCit7CisJU0RMX0F1ZGlvRGV2aWNlICphdWRpbyA9IChTRExfQXVkaW9EZXZpY2UgKilzZGxfbmRzX2F1ZGlvZGV2aWNlOworCisJLyogU2lsZW5jZSB0aGUgYnVmZmVyLCBzaW5jZSBpdCdzIG91cnMgKi8KKwlTRExfbWVtc2V0KHN0cmVhbSwgYXVkaW8tPnNwZWMuc2lsZW5jZSwgbGVuKTsKKworCS8qIE9ubHkgZG8gc29lbXRoaW5nIGlmIGF1ZGlvIGlzIGVuYWJsZWQgKi8KKwlpZiAoICEgYXVkaW8tPmVuYWJsZWQgKQorCQlyZXR1cm47CisKKwlpZiAoICEgYXVkaW8tPnBhdXNlZCApIHsKKwkJaWYgKCBhdWRpby0+Y29udmVydC5uZWVkZWQgKSB7CisJCQkvL2ZwcmludGYoc3RkZXJyLCJjb252ZXJ0aW5nIGF1ZGlvXG4iKTsKKwkJCVNETF9tdXRleFAoYXVkaW8tPm1peGVyX2xvY2spOworCQkJKCphdWRpby0+c3BlYy5jYWxsYmFjaykoYXVkaW8tPnNwZWMudXNlcmRhdGEsCisJCQkJKFVpbnQ4ICopYXVkaW8tPmNvbnZlcnQuYnVmLGF1ZGlvLT5jb252ZXJ0Lmxlbik7CisJCQlTRExfbXV0ZXhWKGF1ZGlvLT5taXhlcl9sb2NrKTsKKwkJCVNETF9Db252ZXJ0QXVkaW8oJmF1ZGlvLT5jb252ZXJ0KTsKKwkJCVNETF9tZW1jcHkoc3RyZWFtLGF1ZGlvLT5jb252ZXJ0LmJ1ZixhdWRpby0+Y29udmVydC5sZW5fY3Z0KTsKKwkJfSBlbHNlIHsKKwkJCVNETF9tdXRleFAoYXVkaW8tPm1peGVyX2xvY2spOworCQkJKCphdWRpby0+c3BlYy5jYWxsYmFjaykoYXVkaW8tPnNwZWMudXNlcmRhdGEsCisJCQkJCQkoVWludDggKilzdHJlYW0sIGxlbik7CisJCQlTRExfbXV0ZXhWKGF1ZGlvLT5taXhlcl9sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm47Cit9Cit2b2lkIE1peFNvdW5kKHZvaWQpCit7CisJaW50IHJlbWFpbjsKKworCWlmKHNvdW5kc3lzdGVtLT5mb3JtYXQgPT0gOCkKKwl7CisJCWlmKChzb3VuZHN5c3RlbS0+c291bmRjdXJzb3IgKyBzb3VuZHN5c3RlbS0+bnVtc2FtcGxlcykgPiBzb3VuZHN5c3RlbS0+YnVmZmVyc2l6ZSkKKwkJeworCQkJU291bmRNaXhDYWxsYmFjaygmc291bmRzeXN0ZW0tPm1peGJ1ZmZlcltzb3VuZHN5c3RlbS0+c291bmRjdXJzb3JdLHNvdW5kc3lzdGVtLT5idWZmZXJzaXplIC0gc291bmRzeXN0ZW0tPnNvdW5kY3Vyc29yKTsKKwkJCXJlbWFpbiA9IHNvdW5kc3lzdGVtLT5udW1zYW1wbGVzIC0gKHNvdW5kc3lzdGVtLT5idWZmZXJzaXplIC0gc291bmRzeXN0ZW0tPnNvdW5kY3Vyc29yKTsKKwkJCVNvdW5kTWl4Q2FsbGJhY2soc291bmRzeXN0ZW0tPm1peGJ1ZmZlcixyZW1haW4pOworCQl9CisJCWVsc2UKKwkJeworCQkJU291bmRNaXhDYWxsYmFjaygmc291bmRzeXN0ZW0tPm1peGJ1ZmZlcltzb3VuZHN5c3RlbS0+c291bmRjdXJzb3JdLHNvdW5kc3lzdGVtLT5udW1zYW1wbGVzKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZigoc291bmRzeXN0ZW0tPnNvdW5kY3Vyc29yICsgc291bmRzeXN0ZW0tPm51bXNhbXBsZXMpID4gKHNvdW5kc3lzdGVtLT5idWZmZXJzaXplID4+IDEpKQorCQl7CisJCQlTb3VuZE1peENhbGxiYWNrKCZzb3VuZHN5c3RlbS0+bWl4YnVmZmVyW3NvdW5kc3lzdGVtLT5zb3VuZGN1cnNvciA8PCAxXSwoc291bmRzeXN0ZW0tPmJ1ZmZlcnNpemUgPj4gMSkgLSBzb3VuZHN5c3RlbS0+c291bmRjdXJzb3IpOworCQkJcmVtYWluID0gc291bmRzeXN0ZW0tPm51bXNhbXBsZXMgLSAoKHNvdW5kc3lzdGVtLT5idWZmZXJzaXplID4+IDEpIC0gc291bmRzeXN0ZW0tPnNvdW5kY3Vyc29yKTsKKwkJCVNvdW5kTWl4Q2FsbGJhY2soc291bmRzeXN0ZW0tPm1peGJ1ZmZlcixyZW1haW4pOworCQl9CisJCWVsc2UKKwkJeworCQkJU291bmRNaXhDYWxsYmFjaygmc291bmRzeXN0ZW0tPm1peGJ1ZmZlcltzb3VuZHN5c3RlbS0+c291bmRjdXJzb3IgPDwgMV0sc291bmRzeXN0ZW0tPm51bXNhbXBsZXMpOworCQl9CisJfQorfQorCit2b2lkIEludGVycnVwdEhhbmRsZXIodm9pZCkKK3sKKwlmcmFtZWNvdW50ZXIrKzsKK30KK3ZvaWQgRmlGb0hhbmRsZXIodm9pZCkKK3sKKwl1MzIgY29tbWFuZDsKKwl3aGlsZSAoICEoUkVHX0lQQ19GSUZPX0NSICYgKElQQ19GSUZPX1JFQ1ZfRU1QVFkpKSApIAorCXsKKwkJY29tbWFuZCA9IFJFR19JUENfRklGT19SWDsKKworCQlzd2l0Y2goY29tbWFuZCkKKwkJeworCQljYXNlIEZJRk9fTk9ORToKKwkJCWJyZWFrOworCQljYXNlIFVQREFURU9OX0FSTTk6CisJCQlSRUdfSU1FID0gMDsKKwkJCU1peFNvdW5kKCk7CisJCQlSRUdfSU1FID0gMTsKKwkJCVNlbmRDb21tYW5kVG9Bcm03KE1JWENPTVBMRVRFX09OQVJNOSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisKKworCitzdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQoreworCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQoreworfQorCitzdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCQorCVNETF9BdWRpb0RldmljZSAqdGhpczsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKiltYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworCWlmICggdGhpcyApIHsKKwkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisJCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKKwkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCX0KKwlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIHRoaXMgKSB7CisJCQlTRExfZnJlZSh0aGlzKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwl0aGlzLT5PcGVuQXVkaW8gPSBORFNfT3BlbkF1ZGlvOworCXRoaXMtPldhaXRBdWRpbyA9IE5EU19XYWl0QXVkaW87CisJdGhpcy0+UGxheUF1ZGlvID0gTkRTX1BsYXlBdWRpbzsKKwl0aGlzLT5HZXRBdWRpb0J1ZiA9IE5EU19HZXRBdWRpb0J1ZjsKKwl0aGlzLT5DbG9zZUF1ZGlvID0gTkRTX0Nsb3NlQXVkaW87CisKKwl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOworLy9mcHJpbnRmKHN0ZGVyciwiQXVkaW9fQ3JlYXRlRGV2aWNlXG4iKTsKKwlyZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgTkRTQVVEX2Jvb3RzdHJhcCA9IHsKKwkibmRzIiwgIk5EUyBhdWRpbyIsCisJQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKK307CisKKwordm9pZCBzdGF0aWMgTkRTX1dhaXRBdWRpbyhfVEhJUykKK3sKKwkvL3ByaW50ZigiTkRTX1dhaXRBdWRpb1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIE5EU19QbGF5QXVkaW8oX1RISVMpCit7CisJLy9wcmludGYoInBsYXlpbmcgYXVkaW9cbiIpOworCWlmICh0aGlzLT5wYXVzZWQpCisJCXJldHVybjsKKwkKK30KKworc3RhdGljIFVpbnQ4ICpORFNfR2V0QXVkaW9CdWYoX1RISVMpCit7CisJcmV0dXJuIE5VTEw7Ly8odGhpcy0+aGlkZGVuLT5taXhidWYpOyAKK30KKworc3RhdGljIHZvaWQgTkRTX0Nsb3NlQXVkaW8oX1RISVMpCit7CisvKglpZiAoIHRoaXMtPmhpZGRlbi0+bWl4YnVmICE9IE5VTEwgKSB7CisJCVNETF9GcmVlQXVkaW9NZW0odGhpcy0+aGlkZGVuLT5taXhidWYpOworCQl0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IE5VTEw7CisJfSovIAorfQorCitzdGF0aWMgaW50IE5EU19PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJLy9wcmludGYoIk5EU19PcGVuQXVkaW9cbiIpOworCWludCBmb3JtYXQgPSAwOworCS8vc3dpdGNoKHNwZWMtPmZvcm1hdCYweGZmKSB7CisJLy9jYXNlICA4OiBzcGVjLT5mb3JtYXQgPSBBVURJT19TODtmb3JtYXQ9ODsgYnJlYWs7CisJLy9jYXNlIDE2OiBzcGVjLT5mb3JtYXQgPSBBVURJT19TMTZMU0I7Zm9ybWF0PTE2OyBicmVhazsKKwkvL2RlZmF1bHQ6CisJLy8JU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKKwkvLwlyZXR1cm4oLTEpOworCS8vfQorCXN3aXRjaCAoc3BlYy0+Zm9ybWF0Jn4weDEwMDApIHsKKwkJY2FzZSBBVURJT19TODoKKwkJCS8qIFNpZ25lZCA4LWJpdCBhdWRpbyBzdXBwb3J0ZWQgKi8KKwkJCWZvcm1hdD04OworCQkJYnJlYWs7CisJCWNhc2UgQVVESU9fVTg6CisJCQlzcGVjLT5mb3JtYXQgXj0gMHg4MDtmb3JtYXQ9ODsKKwkJCWJyZWFrOworCQljYXNlIEFVRElPX1UxNjoKKwkJCS8qIFVuc2lnbmVkIDE2LWJpdCBhdWRpbyB1bnN1cHBvcnRlZCwgY29udmVydCB0byBTMTYgKi8KKwkJCXNwZWMtPmZvcm1hdCBePTB4ODAwMDtmb3JtYXQ9MTY7CisJCWNhc2UgQVVESU9fUzE2OgorCQkJLyogU2lnbmVkIDE2LWJpdCBhdWRpbyBzdXBwb3J0ZWQgKi8KKwkJCWZvcm1hdD0xNjsKKwkJCWJyZWFrOworCX0KKwkvKiBVcGRhdGUgdGhlIGZyYWdtZW50IHNpemUgYXMgc2l6ZSBpbiBieXRlcyAqLworCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisKKwkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCisJLy90aGlzLT5oaWRkZW4tPm1peGxlbiA9IHNwZWMtPnNpemU7CisJLy90aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IChVaW50OCAqKSBTRExfQWxsb2NBdWRpb01lbSh0aGlzLT5oaWRkZW4tPm1peGxlbik7CisJLy9pZiAoIHRoaXMtPmhpZGRlbi0+bWl4YnVmID09IE5VTEwgKSB7CisJLy8JU0RMX1NldEVycm9yKCJPdXQgb2YgTWVtb3J5Iik7CisJLy8JcmV0dXJuKC0xKTsKKwkvL30gCisKKwlTRExfTkRTQXVkaW9fbXV0ZXggPSAwOyAKKwlzZGxfbmRzX2F1ZGlvZGV2aWNlPXRoaXM7CisJCisJaXJxSW5pdCgpOworCWlycVNldChJUlFfVkJMQU5LLCZJbnRlcnJ1cHRIYW5kbGVyKTsKKwlpcnFTZXQoSVJRX0ZJRk9fTk9UX0VNUFRZLCZGaUZvSGFuZGxlcik7CisJaXJxRW5hYmxlKElSUV9GSUZPX05PVF9FTVBUWSk7CisJCisJUkVHX0lQQ19GSUZPX0NSID0gSVBDX0ZJRk9fRU5BQkxFIHwgSVBDX0ZJRk9fU0VORF9DTEVBUiB8IElQQ19GSUZPX1JFQ1ZfSVJROworCisKKworCVNvdW5kU3lzdGVtSW5pdChzcGVjLT5mcmVxLHNwZWMtPnNpemUsMCxmb3JtYXQpOworCVNvdW5kU3RhcnRNaXhlcigpOworCisJCisJcmV0dXJuKDEpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9uZHMvU0RMX25kc2F1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL25kcy9TRExfbmRzYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjZkMWVhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9uZHMvU0RMX25kc2F1ZGlvLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9sb3dhdWRpb19oCisjZGVmaW5lIF9TRExfbG93YXVkaW9faAorCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIGF1ZGlvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwkvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCisJLy9VaW50OCAqbWl4YnVmOworCS8vVWludDMyIG1peGxlbjsKK307IAordW5zaWduZWQgc2hvcnQgU0RMX05EU0F1ZGlvX211dGV4PTA7IAorIAorCisjZW5kaWYgLyogX1NETF9sb3dhdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL25kcy9zb3VuZDkuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbmRzL3NvdW5kOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzFjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL25kcy9zb3VuZDkuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisKKyNpbmNsdWRlICJzb3VuZGNvbW1vbi5oIgorCit2b2lkIFNvdW5kU3lzdGVtSW5pdCh1MzIgcmF0ZSx1MzIgYnVmZmVyc2l6ZSx1OCBjaGFubmVsLHU4IGZvcm1hdCkKK3sKKwlzb3VuZHN5c3RlbS0+cmF0ZSA9IHJhdGU7CisJCisJaWYoZm9ybWF0ID09IDgpIAorCQlzb3VuZHN5c3RlbS0+YnVmZmVyc2l6ZSA9IGJ1ZmZlcnNpemU7CisJZWxzZSBpZihmb3JtYXQgPT0gMTYpCisJCXNvdW5kc3lzdGVtLT5idWZmZXJzaXplID0gYnVmZmVyc2l6ZSAqIHNpemVvZihzaG9ydCk7CisKKwlzb3VuZHN5c3RlbS0+bWl4YnVmZmVyID0gKHM4KilTRExfbWFsbG9jKHNvdW5kc3lzdGVtLT5idWZmZXJzaXplKTsKKwkvL3NvdW5kc3lzdGVtLT5zb3VuZGJ1ZmZlciA9IHNvdW5kc3lzdGVtLT5taXhidWZmZXI7CisJc291bmRzeXN0ZW0tPmZvcm1hdCA9IGZvcm1hdDsKKwlzb3VuZHN5c3RlbS0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJc291bmRzeXN0ZW0tPnByZXZ0aW1lciA9IDA7CisJc291bmRzeXN0ZW0tPnNvdW5kY3Vyc29yID0gMDsKKwlzb3VuZHN5c3RlbS0+bnVtc2FtcGxlcyA9IDA7CisJc291bmRzeXN0ZW0tPnBlcmlvZCA9IDB4MTAwMDAwMCAvIHJhdGU7CisJc291bmRzeXN0ZW0tPmNtZCA9IElOSVQ7Cit9CisKK3ZvaWQgU291bmRTdGFydE1peGVyKHZvaWQpCit7CisJc291bmRzeXN0ZW0tPmNtZCB8PSBNSVg7Cit9CisKK3ZvaWQgU2VuZENvbW1hbmRUb0FybTcodTMyIGNvbW1hbmQpCit7CisgICAgd2hpbGUgKFJFR19JUENfRklGT19DUiAmIElQQ19GSUZPX1NFTkRfRlVMTCk7CisgICAgaWYgKFJFR19JUENfRklGT19DUiAmIElQQ19GSUZPX0VSUk9SKQorICAgIHsKKyAgICAgICAgUkVHX0lQQ19GSUZPX0NSIHw9IElQQ19GSUZPX1NFTkRfQ0xFQVI7CisgICAgfSAKKyAgICAKKyAgICBSRUdfSVBDX0ZJRk9fVFggPSBjb21tYW5kOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9uZHMvc291bmRjb21tb24uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbmRzL3NvdW5kY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4ZTM3YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbmRzL3NvdW5kY29tbW9uLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX19TT1VORENPTU1PTl9ICisjZGVmaW5lIF9fU09VTkRDT01NT05fSAorCisjaW5jbHVkZSA8bmRzLmg+CisKKyNkZWZpbmUgQ0xPQ0sgKDEgPDwgMjUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtCit7CisJTk9ORSA9IDAsCisJSU5JVCA9IDEsCisJTUlYID0gMiwKKwlNSVhJTkcgPSA0LAorCVNUT1AgPSA4Cit9Q29tbWFuZFR5cGU7CisKK3R5cGVkZWYgZW51bQoreworCUZJRk9fTk9ORSA9IDAsCisJVVBEQVRFT05fQVJNOSA9IDEsCisJTUlYQ09NUExFVEVfT05BUk05ID0gMiwKK31GaWZvVHlwZTsgCisKK3R5cGVkZWYgc3RydWN0Cit7CisJczggKm1peGJ1ZmZlcjsvLywqc291bmRidWZmZXI7CisJdTMyIHJhdGU7CisJdTMyIGJ1ZmZlcnNpemU7CisJdTMyIGNtZDsKKwl1OCBjaGFubmVsLGZvcm1hdDsKKwl1MzIgc291bmRjdXJzb3IsbnVtc2FtcGxlczsKKwlzMzIgcHJldnRpbWVyOworCXMxNiBwZXJpb2Q7Cit9U19Tb3VuZFN5c3RlbTsKKworI2RlZmluZSBzb3VuZHN5c3RlbSAoKFNfU291bmRTeXN0ZW0qKSgodTMyKShJUEMpK3NpemVvZihUcmFuc2ZlclJlZ2lvbikpKQorCisjaWZkZWYgQVJNOQorZXh0ZXJuIHZvaWQgU291bmRTeXN0ZW1Jbml0KHUzMiByYXRlLHUzMiBidWZmZXJzaXplLHU4IGNoYW5uZWwsdTggZm9ybWF0KTsKK2V4dGVybiB2b2lkIFNvdW5kU3RhcnRNaXhlcih2b2lkKTsKK2V4dGVybiB2b2lkIFNlbmRDb21tYW5kVG9Bcm03KHUzMiBjb21tYW5kKTsKKyNlbHNlCitleHRlcm4gdm9pZCBTb3VuZFZCbGFua0lycSh2b2lkKTsKK2V4dGVybiB2b2lkIFNvdW5kU3dhcEFuZE1peCh2b2lkKTsKK2V4dGVybiB2b2lkIFNvdW5kU2V0VGltZXIoaW50IHBlcmlvZCk7CitleHRlcm4gdm9pZCBTb3VuZEZpZm9IYW5kbGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgU2VuZENvbW1hbmRUb0FybTkodTMyIGNvbW1hbmQpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbnRvL1NETF9udG9fYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vbnRvL1NETF9udG9fYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTUxODI1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9udG8vU0RMX250b19hdWRpby5jCkBAIC0wLDAgKzEsNTA3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHN5cy9uZXV0cmluby5oPgorI2luY2x1ZGUgPHN5cy9hc291bmRsaWIuaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb21lbS5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiU0RMX250b19hdWRpby5oIgorCisvKiBUaGUgdGFnIG5hbWUgdXNlZCBieSBOVE8gYXVkaW8gKi8KKyNkZWZpbmUgRFJJVkVSX05BTUUgInFzYS1udG8iCisKKy8qIGRlZmF1bHQgY2hhbm5lbCBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgREVGQVVMVF9DUEFSQU1TX1JBVEUgMjIwNTAKKyNkZWZpbmUgREVGQVVMVF9DUEFSQU1TX1ZPSUNFUyAxCisvKiBGSVhNRTogbmVlZCB0byBhZGQgaW4gdGhlIG5lYXIgZnV0dXJlIGZsZXhpYmxlIGxvZ2ljIHdpdGggZnJhZ19zaXplIGFuZCBmcmFncyBjb3VudCAqLworI2RlZmluZSBERUZBVUxUX0NQQVJBTVNfRlJBR19TSVpFIDQwOTYKKyNkZWZpbmUgREVGQVVMVF9DUEFSQU1TX0ZSQUdTX01JTiAxCisjZGVmaW5lIERFRkFVTFRfQ1BBUkFNU19GUkFHU19NQVggMQorCisvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLCBhbmQgZG9uJ3QgYmxvY2sgaWYgYnVzeSAqLworI2RlZmluZSBPUEVOX0ZMQUdTIFNORF9QQ01fT1BFTl9QTEFZQkFDSworCisjZGVmaW5lIFFTQV9OT19XT1JLQVJPVU5EUyAgMHgwMDAwMDAwMAorI2RlZmluZSBRU0FfTU1BUF9XT1JLQVJPVU5EIDB4MDAwMDAwMDEKKworc3RydWN0IEJ1Z2d5Q2FyZHMKK3sKKyAgIGNoYXIqIGNhcmRuYW1lOworICAgdW5zaWduZWQgbG9uZyBidWd0eXBlOworfTsKKworI2RlZmluZSBRU0FfV0FfQ0FSRFMgMworCitzdHJ1Y3QgQnVnZ3lDYXJkcyBidWdneWNhcmRzW1FTQV9XQV9DQVJEU109Cit7CisgICB7IlNvdW5kIEJsYXN0ZXIgTGl2ZSEiLCBRU0FfTU1BUF9XT1JLQVJPVU5EfSwKKyAgIHsiVm9ydGV4IDg4MjAiLCAgICAgICAgIFFTQV9NTUFQX1dPUktBUk9VTkR9LAorICAgeyJWb3J0ZXggODgzMCIsICAgICAgICAgUVNBX01NQVBfV09SS0FST1VORH0sCit9OworCisvKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBOVE9fVGhyZWFkSW5pdChfVEhJUyk7CitzdGF0aWMgaW50IE5UT19PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMqIHNwZWMpOworc3RhdGljIHZvaWQgTlRPX1dhaXRBdWRpbyhfVEhJUyk7CitzdGF0aWMgdm9pZCBOVE9fUGxheUF1ZGlvKF9USElTKTsKK3N0YXRpYyBVaW50OCogTlRPX0dldEF1ZGlvQnVmKF9USElTKTsKK3N0YXRpYyB2b2lkIE5UT19DbG9zZUF1ZGlvKF9USElTKTsKKworLyogY2FyZCBuYW1lcyBjaGVjayB0byBhcHBseSB0aGUgd29ya2Fyb3VuZHMgKi8KK3N0YXRpYyBpbnQgTlRPX0NoZWNrQnVnZ3lDYXJkcyhfVEhJUywgdW5zaWduZWQgbG9uZyBjaGVja2ZvcikKK3sKKyAgICBjaGFyIHNjYXJkbmFtZVszM107CisgICAgaW50IGl0OworICAgIAorICAgIGlmIChzbmRfY2FyZF9nZXRfbmFtZShjYXJkbm8sIHNjYXJkbmFtZSwgMzIpPDApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGl0PTA7IGl0PFFTQV9XQV9DQVJEUzsgaXQrKykKKyAgICB7CisgICAgICAgaWYgKFNETF9zdHJjbXAoYnVnZ3ljYXJkc1tpdF0uY2FyZG5hbWUsIHNjYXJkbmFtZSk9PTApCisgICAgICAgeworICAgICAgICAgIGlmIChidWdneWNhcmRzW2l0XS5idWd0eXBlPT1jaGVja2ZvcikKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIE5UT19UaHJlYWRJbml0KF9USElTKQoreworICAgaW50IHN0YXR1czsKKyAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKworICAgLyogaW5jcmVhc2luZyBkZWZhdWx0IDEwIHByaW9yaXR5IHRvIDI1IHRvIGF2b2lkIGplcmt5IHNvdW5kICovCisgICBzdGF0dXM9U2NoZWRHZXQoMCwgMCwgJnBhcmFtKTsKKyAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5PXBhcmFtLnNjaGVkX2N1cnByaW9yaXR5KzE1OworICAgc3RhdHVzPVNjaGVkU2V0KDAsIDAsIFNDSEVEX05PQ0hBTkdFLCAmcGFyYW0pOworfQorCisvKiBQQ00gdHJhbnNmZXIgY2hhbm5lbCBwYXJhbWV0ZXJzIGluaXRpYWxpemUgZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkIE5UT19Jbml0QXVkaW9QYXJhbXMoc25kX3BjbV9jaGFubmVsX3BhcmFtc190KiBjcGFycykKK3sKKyAgICBTRExfbWVtc2V0KGNwYXJzLCAwLCBzaXplb2Yoc25kX3BjbV9jaGFubmVsX3BhcmFtc190KSk7CisKKyAgICBjcGFycy0+Y2hhbm5lbCA9IFNORF9QQ01fQ0hBTk5FTF9QTEFZQkFDSzsKKyAgICBjcGFycy0+bW9kZSA9IFNORF9QQ01fTU9ERV9CTE9DSzsKKyAgICBjcGFycy0+c3RhcnRfbW9kZSA9IFNORF9QQ01fU1RBUlRfREFUQTsKKyAgICBjcGFycy0+c3RvcF9tb2RlICA9IFNORF9QQ01fU1RPUF9TVE9QOworICAgIGNwYXJzLT5mb3JtYXQuZm9ybWF0ID0gU05EX1BDTV9TRk1UX1MxNl9MRTsKKyAgICBjcGFycy0+Zm9ybWF0LmludGVybGVhdmUgPSAxOworICAgIGNwYXJzLT5mb3JtYXQucmF0ZSA9IERFRkFVTFRfQ1BBUkFNU19SQVRFOworICAgIGNwYXJzLT5mb3JtYXQudm9pY2VzID0gREVGQVVMVF9DUEFSQU1TX1ZPSUNFUzsKKyAgICBjcGFycy0+YnVmLmJsb2NrLmZyYWdfc2l6ZSA9IERFRkFVTFRfQ1BBUkFNU19GUkFHX1NJWkU7CisgICAgY3BhcnMtPmJ1Zi5ibG9jay5mcmFnc19taW4gPSBERUZBVUxUX0NQQVJBTVNfRlJBR1NfTUlOOworICAgIGNwYXJzLT5idWYuYmxvY2suZnJhZ3NfbWF4ID0gREVGQVVMVF9DUEFSQU1TX0ZSQUdTX01BWDsKK30KKworc3RhdGljIGludCBOVE9fQXVkaW9BdmFpbGFibGUodm9pZCkKK3sKKyAgICAvKiAgU2VlIGlmIHdlIGNhbiBvcGVuIGEgbm9uYmxvY2tpbmcgY2hhbm5lbC4KKyAgICAgICAgUmV0dXJuIHZhbHVlICcxJyBtZWFucyB3ZSBjYW4uCisgICAgICAgIFJldHVybiB2YWx1ZSAnMCcgbWVhbnMgd2UgY2Fubm90LiAqLworCisgICAgaW50IGF2YWlsYWJsZTsKKyAgICBpbnQgcnZhbDsKKyAgICBzbmRfcGNtX3QqIGhhbmRsZTsKKworICAgIGF2YWlsYWJsZSA9IDA7CisgICAgaGFuZGxlID0gTlVMTDsKKworICAgIHJ2YWwgPSBzbmRfcGNtX29wZW5fcHJlZmVycmVkKCZoYW5kbGUsIE5VTEwsIE5VTEwsIE9QRU5fRkxBR1MpOworCisgICAgaWYgKHJ2YWwgPj0gMCkKKyAgICB7CisgICAgICAgIGF2YWlsYWJsZSA9IDE7CisKKyAgICAgICAgaWYgKChydmFsID0gc25kX3BjbV9jbG9zZShoYW5kbGUpKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigiTlRPX0F1ZGlvQXZhaWxhYmxlKCk6IHNuZF9wY21fY2xvc2UgZmFpbGVkOiAlc1xuIiwgc25kX3N0cmVycm9yKHJ2YWwpKTsKKyAgICAgICAgICAgIGF2YWlsYWJsZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJOVE9fQXVkaW9BdmFpbGFibGUoKTogdGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBhdWRpbyBkZXZpY2VzLlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIChhdmFpbGFibGUpOworfQorCitzdGF0aWMgdm9pZCBOVE9fRGVsZXRlQXVkaW9EZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisgICAgaWYgKChkZXZpY2UpJiYoZGV2aWNlLT5oaWRkZW4pKQorICAgIHsKKyAgICAgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworICAgIH0KKyAgICBpZiAoZGV2aWNlKQorICAgIHsKKyAgICAgICAgU0RMX2ZyZWUoZGV2aWNlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBTRExfQXVkaW9EZXZpY2UqIE5UT19DcmVhdGVBdWRpb0RldmljZShpbnQgZGV2aW5kZXgpCit7CisgICAgU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKyAgICB0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworICAgIGlmICh0aGlzKQorICAgIHsKKyAgICAgICAgU0RMX21lbXNldCh0aGlzLCAwLCBzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisgICAgICAgIHRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKilTRExfbWFsbG9jKHNpemVvZihzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEpKTsKKyAgICB9CisgICAgaWYgKCh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkpCisgICAgeworICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgaWYgKHRoaXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9mcmVlKHRoaXMpOworCX0KKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIHNpemVvZihzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEpKTsKKyAgICBhdWRpb19oYW5kbGUgPSBOVUxMOworCisgICAgLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIHRoaXMtPlRocmVhZEluaXQgPSBOVE9fVGhyZWFkSW5pdDsKKyAgICB0aGlzLT5PcGVuQXVkaW8gPSBOVE9fT3BlbkF1ZGlvOworICAgIHRoaXMtPldhaXRBdWRpbyA9IE5UT19XYWl0QXVkaW87CisgICAgdGhpcy0+UGxheUF1ZGlvID0gTlRPX1BsYXlBdWRpbzsKKyAgICB0aGlzLT5HZXRBdWRpb0J1ZiA9IE5UT19HZXRBdWRpb0J1ZjsKKyAgICB0aGlzLT5DbG9zZUF1ZGlvID0gTlRPX0Nsb3NlQXVkaW87CisKKyAgICB0aGlzLT5mcmVlID0gTlRPX0RlbGV0ZUF1ZGlvRGV2aWNlOworCisgICAgcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIFFOWE5UT0FVRElPX2Jvb3RzdHJhcCA9Cit7CisgICAgRFJJVkVSX05BTUUsICJRTlg2IFFTQS1OVE8gQXVkaW8iLAorICAgIE5UT19BdWRpb0F2YWlsYWJsZSwKKyAgICBOVE9fQ3JlYXRlQXVkaW9EZXZpY2UKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gd2FpdHMgdW50aWwgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgYSBmdWxsIHNvdW5kIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgTlRPX1dhaXRBdWRpbyhfVEhJUykKK3sKKyAgICBmZF9zZXQgd2ZkczsKKyAgICBpbnQgc2VsZWN0cmV0OworCisgICAgRkRfWkVSTygmd2Zkcyk7CisgICAgRkRfU0VUKGF1ZGlvX2ZkLCAmd2Zkcyk7CisKKyAgICBkbyB7CisgICAgICAgIHNlbGVjdHJldD1zZWxlY3QoYXVkaW9fZmQgKyAxLCBOVUxMLCAmd2ZkcywgTlVMTCwgTlVMTCk7CisgICAgICAgIHN3aXRjaCAoc2VsZWN0cmV0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgY2FzZSAgMDogU0RMX1NldEVycm9yKCJOVE9fV2FpdEF1ZGlvKCk6IHNlbGVjdCgpIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBkZWZhdWx0OiBpZiAoRkRfSVNTRVQoYXVkaW9fZmQsICZ3ZmRzKSkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUoMSk7Cit9CisKK3N0YXRpYyB2b2lkIE5UT19QbGF5QXVkaW8oX1RISVMpCit7CisgICAgaW50IHdyaXR0ZW4sIHJ2YWw7CisgICAgaW50IHRvd3JpdGU7CisgICAgdm9pZCogcGNtYnVmZmVyOworCisgICAgaWYgKCF0aGlzLT5lbmFibGVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICB0b3dyaXRlID0gdGhpcy0+c3BlYy5zaXplOworICAgIHBjbWJ1ZmZlciA9IHBjbV9idWY7CisKKyAgICAvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSwgY2hlY2tpbmcgZm9yIEVBR0FJTiAoYnVmZmVyIGZ1bGwpIGFuZCB1bmRlcnJ1biAqLworICAgIGRvIHsKKyAgICAgICAgd3JpdHRlbiA9IHNuZF9wY21fcGx1Z2luX3dyaXRlKGF1ZGlvX2hhbmRsZSwgcGNtX2J1ZiwgdG93cml0ZSk7CisgICAgICAgIGlmICh3cml0dGVuICE9IHRvd3JpdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZXJybm8gPT0gRUFHQUlOKSB8fCAoZXJybm8gPT0gRVdPVUxEQkxPQ0spKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExldCBhIGxpdHRsZSBDUFUgdGltZSBnbyBieSBhbmQgdHJ5IHRvIHdyaXRlIGFnYWluICovCisgICAgICAgICAgICAgICAgU0RMX0RlbGF5KDEpOworICAgICAgICAgICAgICAgIC8qIGlmIHdlIHdyb3RlIHNvbWUgZGF0YSAqLworICAgICAgICAgICAgICAgIHRvd3JpdGUgLT0gd3JpdHRlbjsKKyAgICAgICAgICAgICAgICBwY21idWZmZXIgKz0gd3JpdHRlbiAqIHRoaXMtPnNwZWMuY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CQkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGVycm5vID09IEVJTlZBTCkgfHwgKGVycm5vID09IEVJTykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTRExfbWVtc2V0KCZjc3RhdHVzLCAwLCBzaXplb2YoY3N0YXR1cykpOworICAgICAgICAgICAgICAgICAgICBjc3RhdHVzLmNoYW5uZWwgPSBTTkRfUENNX0NIQU5ORUxfUExBWUJBQ0s7CisgICAgICAgICAgICAgICAgICAgIGlmICgocnZhbCA9IHNuZF9wY21fcGx1Z2luX3N0YXR1cyhhdWRpb19oYW5kbGUsICZjc3RhdHVzKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIk5UT19QbGF5QXVkaW8oKTogc25kX3BjbV9wbHVnaW5fc3RhdHVzIGZhaWxlZDogJXNcbiIsIHNuZF9zdHJlcnJvcihydmFsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0JCisgICAgICAgICAgICAgICAgICAgIGlmICgoY3N0YXR1cy5zdGF0dXMgPT0gU05EX1BDTV9TVEFUVVNfVU5ERVJSVU4pIHx8IChjc3RhdHVzLnN0YXR1cyA9PSBTTkRfUENNX1NUQVRVU19SRUFEWSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocnZhbCA9IHNuZF9wY21fcGx1Z2luX3ByZXBhcmUoYXVkaW9faGFuZGxlLCBTTkRfUENNX0NIQU5ORUxfUExBWUJBQ0spKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJOVE9fUGxheUF1ZGlvKCk6IHNuZF9wY21fcGx1Z2luX3ByZXBhcmUgZmFpbGVkOiAlc1xuIiwgc25kX3N0cmVycm9yKHJ2YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0JCSAgICAgICAgCQkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSB3cm90ZSBhbGwgcmVtYWluaW5nIGRhdGEgKi8KKyAgICAgICAgICAgIHRvd3JpdGUgLT0gd3JpdHRlbjsKKyAgICAgICAgICAgIHBjbWJ1ZmZlciArPSB3cml0dGVuICogdGhpcy0+c3BlYy5jaGFubmVsczsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCh0b3dyaXRlID4gMCkgICYmICh0aGlzLT5lbmFibGVkKSk7CisKKyAgICAvKiBJZiB3ZSBjb3VsZG4ndCB3cml0ZSwgYXNzdW1lIGZhdGFsIGVycm9yIGZvciBub3cgKi8KKyAgICBpZiAodG93cml0ZSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5hYmxlZCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgVWludDgqIE5UT19HZXRBdWRpb0J1ZihfVEhJUykKK3sKKyAgICByZXR1cm4gcGNtX2J1ZjsKK30KKworc3RhdGljIHZvaWQgTlRPX0Nsb3NlQXVkaW8oX1RISVMpCit7CisgICAgaW50IHJ2YWw7CisKKyAgICB0aGlzLT5lbmFibGVkID0gMDsKKworICAgIGlmIChhdWRpb19oYW5kbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmICgocnZhbCA9IHNuZF9wY21fcGx1Z2luX2ZsdXNoKGF1ZGlvX2hhbmRsZSwgU05EX1BDTV9DSEFOTkVMX1BMQVlCQUNLKSkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBTRExfU2V0RXJyb3IoIk5UT19DbG9zZUF1ZGlvKCk6IHNuZF9wY21fcGx1Z2luX2ZsdXNoIGZhaWxlZDogJXNcbiIsIHNuZF9zdHJlcnJvcihydmFsKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKChydmFsID0gc25kX3BjbV9jbG9zZShhdWRpb19oYW5kbGUpKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigiTlRPX0Nsb3NlQXVkaW8oKTogc25kX3BjbV9jbG9zZSBmYWlsZWQ6ICVzXG4iLHNuZF9zdHJlcnJvcihydmFsKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9faGFuZGxlID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgTlRPX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyogc3BlYykKK3sKKyAgICBpbnQgcnZhbDsKKyAgICBpbnQgZm9ybWF0OworICAgIFVpbnQxNiB0ZXN0X2Zvcm1hdDsKKyAgICBpbnQgZm91bmQ7CisKKyAgICBhdWRpb19oYW5kbGUgPSBOVUxMOworICAgIHRoaXMtPmVuYWJsZWQgPSAwOworCisgICAgaWYgKHBjbV9idWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNETF9GcmVlQXVkaW9NZW0ocGNtX2J1Zik7IAorICAgICAgICBwY21fYnVmID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIGNoYW5uZWwgdHJhbnNmZXIgcGFyYW1ldGVycyB0byBkZWZhdWx0ICovCisgICAgTlRPX0luaXRBdWRpb1BhcmFtcygmY3BhcmFtcyk7CisKKyAgICAvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KKyAgICBydmFsID0gc25kX3BjbV9vcGVuX3ByZWZlcnJlZCgmYXVkaW9faGFuZGxlLCAmY2FyZG5vLCAmZGV2aWNlbm8sIE9QRU5fRkxBR1MpOworICAgIGlmIChydmFsIDwgMCkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigiTlRPX09wZW5BdWRpbygpOiBzbmRfcGNtX29wZW4gZmFpbGVkOiAlc1xuIiwgc25kX3N0cmVycm9yKHJ2YWwpKTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgaWYgKCFOVE9fQ2hlY2tCdWdneUNhcmRzKHRoaXMsIFFTQV9NTUFQX1dPUktBUk9VTkQpKQorICAgIHsKKyAgICAgICAgLyogZW5hYmxlIGNvdW50IHN0YXR1cyBwYXJhbWV0ZXIgKi8KKyAgICAgICAgaWYgKChydmFsID0gc25kX3BjbV9wbHVnaW5fc2V0X2Rpc2FibGUoYXVkaW9faGFuZGxlLCBQTFVHSU5fRElTQUJMRV9NTUFQKSkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBTRExfU2V0RXJyb3IoInNuZF9wY21fcGx1Z2luX3NldF9kaXNhYmxlIGZhaWxlZDogJXNcbiIsIHNuZF9zdHJlcnJvcihydmFsKSk7CisgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRyeSBmb3IgYSBjbG9zZXN0IG1hdGNoIG9uIGF1ZGlvIGZvcm1hdCAqLworICAgIGZvcm1hdCA9IDA7CisgICAgLyogY2FuJ3QgdXNlIGZvcm1hdCBhcyBTTkRfUENNX1NGTVRfVTggPSAwIGluIG50byAqLworICAgIGZvdW5kID0gMDsKKworICAgIGZvciAodGVzdF9mb3JtYXQ9U0RMX0ZpcnN0QXVkaW9Gb3JtYXQoc3BlYy0+Zm9ybWF0KTsgIWZvdW5kIDspCisgICAgeworICAgICAgICAvKiBpZiBtYXRjaCBmb3VuZCBzZXQgZm9ybWF0IHRvIGVxdWl2YWxlbnQgQUxTQSBmb3JtYXQgKi8KKyAgICAgICAgc3dpdGNoICh0ZXN0X2Zvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBBVURJT19VODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IFNORF9QQ01fU0ZNVF9VODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVURJT19TODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IFNORF9QQ01fU0ZNVF9TODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVURJT19TMTZMU0I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBTTkRfUENNX1NGTVRfUzE2X0xFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFVRElPX1MxNk1TQjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IFNORF9QQ01fU0ZNVF9TMTZfQkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fVTE2TFNCOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gU05EX1BDTV9TRk1UX1UxNl9MRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVURJT19VMTZNU0I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBTTkRfUENNX1NGTVRfVTE2X0JFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGFzc3VtZXMgdGVzdF9mb3JtYXQgbm90IDAgb24gc3VjY2VzcyAqLworICAgIGlmICh0ZXN0X2Zvcm1hdCA9PSAwKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJOVE9fT3BlbkF1ZGlvKCk6IENvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHMiKTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7CisKKyAgICAvKiBTZXQgdGhlIGF1ZGlvIGZvcm1hdCAqLworICAgIGNwYXJhbXMuZm9ybWF0LmZvcm1hdCA9IGZvcm1hdDsKKworICAgIC8qIFNldCBtb25vIG9yIHN0ZXJlbyBhdWRpbyAoY3VycmVudGx5IG9ubHkgdHdvIGNoYW5uZWxzIHN1cHBvcnRlZCkgKi8KKyAgICBjcGFyYW1zLmZvcm1hdC52b2ljZXMgPSBzcGVjLT5jaGFubmVsczsKKwkKKyAgICAvKiBTZXQgcmF0ZSAqLworICAgIGNwYXJhbXMuZm9ybWF0LnJhdGUgPSBzcGVjLT5mcmVxOworCisgICAgLyogU2V0dXAgdGhlIHRyYW5zZmVyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIGNwYXJhbXMgKi8KKyAgICBydmFsID0gc25kX3BjbV9wbHVnaW5fcGFyYW1zKGF1ZGlvX2hhbmRsZSwgJmNwYXJhbXMpOworICAgIGlmIChydmFsIDwgMCkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigiTlRPX09wZW5BdWRpbygpOiBzbmRfcGNtX2NoYW5uZWxfcGFyYW1zIGZhaWxlZDogJXNcbiIsIHNuZF9zdHJlcnJvcihydmFsKSk7CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSBjaGFubmVsIGlzIHNldHVwIHJpZ2h0IG9uZSBsYXN0IHRpbWUgKi8KKyAgICBTRExfbWVtc2V0KCZjc2V0dXAsIDB4MDAsIHNpemVvZihjc2V0dXApKTsKKyAgICBjc2V0dXAuY2hhbm5lbCA9IFNORF9QQ01fQ0hBTk5FTF9QTEFZQkFDSzsKKyAgICBpZiAoc25kX3BjbV9wbHVnaW5fc2V0dXAoYXVkaW9faGFuZGxlLCAmY3NldHVwKSA8IDApCisgICAgeworICAgICAgICBTRExfU2V0RXJyb3IoIk5UT19PcGVuQXVkaW8oKTogVW5hYmxlIHRvIHNldHVwIHBsYXliYWNrIGNoYW5uZWxcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGZpbmFsIHBhcmFtZXRlcnMgZm9yIHRoaXMgYXVkaW8gc3BlY2lmaWNhdGlvbiAqLworICAgIFNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisKKyAgICBwY21fbGVuID0gc3BlYy0+c2l6ZTsKKworICAgIGlmIChwY21fbGVuPT0wKQorICAgIHsKKyAgICAgICAgcGNtX2xlbiA9IGNzZXR1cC5idWYuYmxvY2suZnJhZ19zaXplICogc3BlYy0+Y2hhbm5lbHMgKiAoc25kX3BjbV9mb3JtYXRfd2lkdGgoZm9ybWF0KS84KTsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gdGhlIGF1ZGlvIGJ1ZmZlciBhbmQgaW5pdGlhbGl6ZSB3aXRoIHNpbGVuY2UgKE5vdGUgdGhhdAorICAgICAgIGJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBmcmFnbWVudCBzaXplLCBzbyBmaW5kIGNsb3Nlc3QgbXVsdGlwbGUpCisgICAgKi8KKyAgICBwY21fYnVmID0gKFVpbnQ4KilTRExfQWxsb2NBdWRpb01lbShwY21fbGVuKTsKKyAgICBpZiAocGNtX2J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJOVE9fT3BlbkF1ZGlvKCk6IHBjbSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisgICAgU0RMX21lbXNldChwY21fYnVmLCBzcGVjLT5zaWxlbmNlLCBwY21fbGVuKTsKKworICAgIC8qIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yICovCisgICAgaWYgKChhdWRpb19mZCA9IHNuZF9wY21fZmlsZV9kZXNjcmlwdG9yKGF1ZGlvX2hhbmRsZSwgU05EX1BDTV9DSEFOTkVMX1BMQVlCQUNLKSkgPCAwKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJOVE9fT3BlbkF1ZGlvKCk6IHNuZF9wY21fZmlsZV9kZXNjcmlwdG9yIGZhaWxlZCB3aXRoIGVycm9yIGNvZGU6ICVzXG4iLCBzbmRfc3RyZXJyb3IocnZhbCkpOworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKyAgICAvKiBUcmlnZ2VyIGF1ZGlvIHBsYXliYWNrICovCisgICAgcnZhbCA9IHNuZF9wY21fcGx1Z2luX3ByZXBhcmUoYXVkaW9faGFuZGxlLCBTTkRfUENNX0NIQU5ORUxfUExBWUJBQ0spOworICAgIGlmIChydmFsIDwgMCkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigic25kX3BjbV9wbHVnaW5fcHJlcGFyZSBmYWlsZWQ6ICVzXG4iLCBzbmRfc3RyZXJyb3IocnZhbCkpOworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKyAgICB0aGlzLT5lbmFibGVkID0gMTsKKworICAgIC8qIEdldCB0aGUgcGFyZW50IHByb2Nlc3MgaWQgKHdlJ3JlIHRoZSBwYXJlbnQgb2YgdGhlIGF1ZGlvIHRocmVhZCkgKi8KKyAgICBwYXJlbnQgPSBnZXRwaWQoKTsKKworICAgIC8qIFdlJ3JlIHJlYWxseSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KKyAgICByZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9udG8vU0RMX250b19hdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9udG8vU0RMX250b19hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDU5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL250by9TRExfbnRvX2F1ZGlvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX19TRExfTlRPX0FVRElPX0hfXworI2RlZmluZSBfX1NETF9OVE9fQVVESU9fSF9fCisKKyNpbmNsdWRlIDxzeXMvYXNvdW5kbGliLmg+CisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgYXVkaW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcworCitzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEKK3sKKyAgICAvKiBUaGUgYXVkaW8gZGV2aWNlIGhhbmRsZSAqLworICAgIGludCBjYXJkbm87CisgICAgaW50IGRldmljZW5vOworICAgIHNuZF9wY21fdCogYXVkaW9faGFuZGxlOworCisgICAgLyogVGhlIGF1ZGlvIGZpbGUgZGVzY3JpcHRvciAqLworICAgIGludCBhdWRpb19mZDsKKworICAgIC8qIFRoZSBwYXJlbnQgcHJvY2VzcyBpZCwgdG8gZGV0ZWN0IHdoZW4gYXBwbGljYXRpb24gcXVpdHMgKi8KKyAgICBwaWRfdCBwYXJlbnQ7CisKKyAgICAvKiBSYXcgbWl4aW5nIGJ1ZmZlciAqLworICAgIFVpbnQ4KiBwY21fYnVmOworICAgIFVpbnQzMiBwY21fbGVuOworCisgICAgLyogUVNBIHBhcmFtZXRlcnMgKi8KKyAgICBzbmRfcGNtX2NoYW5uZWxfc3RhdHVzX3QgY3N0YXR1czsKKyAgICBzbmRfcGNtX2NoYW5uZWxfcGFyYW1zX3QgY3BhcmFtczsKKyAgICBzbmRfcGNtX2NoYW5uZWxfc2V0dXBfdCAgY3NldHVwOworfTsKKworI2RlZmluZSBjYXJkbm8gICAgICAgICAgKHRoaXMtPmhpZGRlbi0+Y2FyZG5vKQorI2RlZmluZSBkZXZpY2VubyAgICAgICAgKHRoaXMtPmhpZGRlbi0+ZGV2aWNlbm8pCisjZGVmaW5lIGF1ZGlvX2hhbmRsZSAgICAodGhpcy0+aGlkZGVuLT5hdWRpb19oYW5kbGUpCisjZGVmaW5lIGF1ZGlvX2ZkICAgICAgICAodGhpcy0+aGlkZGVuLT5hdWRpb19mZCkKKyNkZWZpbmUgcGFyZW50ICAgICAgICAgICh0aGlzLT5oaWRkZW4tPnBhcmVudCkKKyNkZWZpbmUgcGNtX2J1ZiAgICAgICAgICh0aGlzLT5oaWRkZW4tPnBjbV9idWYpCisjZGVmaW5lIHBjbV9sZW4gICAgICAgICAodGhpcy0+aGlkZGVuLT5wY21fbGVuKQorI2RlZmluZSBjc3RhdHVzICAgICAgICAgKHRoaXMtPmhpZGRlbi0+Y3N0YXR1cykKKyNkZWZpbmUgY3BhcmFtcyAgICAgICAgICh0aGlzLT5oaWRkZW4tPmNwYXJhbXMpCisjZGVmaW5lIGNzZXR1cCAgICAgICAgICAodGhpcy0+aGlkZGVuLT5jc2V0dXApCisKKyNlbmRpZiAvKiBfX1NETF9OVE9fQVVESU9fSF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3BhdWRpby9TRExfcGF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3BhdWRpby9TRExfcGF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3MGQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vcGF1ZGlvL1NETF9wYXVkaW8uYwpAQCAtMCwwICsxLDUxMSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIENhcnN0ZW4gR3Jpd29kegorICAgIGdyaWZmQGtvbS50dS1kYXJtc3RhZHQuZGUKKworICAgIGJhc2VkIG9uIGxpbnV4L1NETF9kc3BhdWRpby5jIGJ5IFNhbSBMYW50aW5nYQorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvbWVtLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgorI2luY2x1ZGUgIlNETF9wYXVkaW8uaCIKKworI2RlZmluZSBERUJVR19BVURJTyAxCisKKy8qIEEgY29uZmxpY3Qgd2l0aGluIEFJWCA0LjMuMyA8c3lzLz4gaGVhZGVycyBhbmQgcHJvYmFibHkgb3RoZXJzIGFzIHdlbGwuCisgKiBJIGd1ZXNzIG5vYm9keSBldmVyIHVzZXMgYXVkaW8uLi4gU2hhbWUgb3ZlciBBSVggaGVhZGVyIGZpbGVzLiAgKi8KKyNpbmNsdWRlIDxzeXMvbWFjaGluZS5oPgorI3VuZGVmIEJJR19FTkRJQU4KKyNpbmNsdWRlIDxzeXMvYXVkaW8uaD4KKworLyogVGhlIHRhZyBuYW1lIHVzZWQgYnkgcGF1ZCBhdWRpbyAqLworI2RlZmluZSBQYXVkX0RSSVZFUl9OQU1FICAgICAgICAgInBhdWQiCisKKy8qIE9wZW4gdGhlIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2ssIGFuZCBkb24ndCBibG9jayBpZiBidXN5ICovCisvKiAjZGVmaW5lIE9QRU5fRkxBR1MJKE9fV1JPTkxZfE9fTk9OQkxPQ0spICovCisjZGVmaW5lIE9QRU5fRkxBR1MJT19XUk9OTFkKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBQYXVkX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7CitzdGF0aWMgdm9pZCBQYXVkX1dhaXRBdWRpbyhfVEhJUyk7CitzdGF0aWMgdm9pZCBQYXVkX1BsYXlBdWRpbyhfVEhJUyk7CitzdGF0aWMgVWludDggKlBhdWRfR2V0QXVkaW9CdWYoX1RISVMpOworc3RhdGljIHZvaWQgUGF1ZF9DbG9zZUF1ZGlvKF9USElTKTsKKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKwlpbnQgZmQ7CisJaW50IGF2YWlsYWJsZTsKKworCWF2YWlsYWJsZSA9IDA7CisJZmQgPSBTRExfT3BlbkF1ZGlvUGF0aChOVUxMLCAwLCBPUEVOX0ZMQUdTLCAwKTsKKwlpZiAoIGZkID49IDAgKSB7CisJCWF2YWlsYWJsZSA9IDE7CisJCWNsb3NlKGZkKTsKKwl9CisJcmV0dXJuKGF2YWlsYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisJaWYgKCB0aGlzICkgeworCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJfQorCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggdGhpcyApIHsKKwkJCVNETF9mcmVlKHRoaXMpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCWF1ZGlvX2ZkID0gLTE7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJdGhpcy0+T3BlbkF1ZGlvID0gUGF1ZF9PcGVuQXVkaW87CisJdGhpcy0+V2FpdEF1ZGlvID0gUGF1ZF9XYWl0QXVkaW87CisJdGhpcy0+UGxheUF1ZGlvID0gUGF1ZF9QbGF5QXVkaW87CisJdGhpcy0+R2V0QXVkaW9CdWYgPSBQYXVkX0dldEF1ZGlvQnVmOworCXRoaXMtPkNsb3NlQXVkaW8gPSBQYXVkX0Nsb3NlQXVkaW87CisKKwl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIFBhdWRfYm9vdHN0cmFwID0geworCVBhdWRfRFJJVkVSX05BTUUsICJBSVggUGF1ZGlvIiwKKwlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCitzdGF0aWMgdm9pZCBQYXVkX1dhaXRBdWRpbyhfVEhJUykKK3sKKyAgICBmZF9zZXQgZmRzZXQ7CisKKyAgICAvKiBTZWUgaWYgd2UgbmVlZCB0byB1c2UgdGltZWQgYXVkaW8gc3luY2hyb25pemF0aW9uICovCisgICAgaWYgKCBmcmFtZV90aWNrcyApIHsKKyAgICAgICAgLyogVXNlIHRpbWVyIGZvciBnZW5lcmFsIGF1ZGlvIHN5bmNocm9uaXphdGlvbiAqLworICAgICAgICBTaW50MzIgdGlja3M7CisKKyAgICAgICAgdGlja3MgPSAoKFNpbnQzMikobmV4dF9mcmFtZSAtIFNETF9HZXRUaWNrcygpKSktRlVER0VfVElDS1M7CisgICAgICAgIGlmICggdGlja3MgPiAwICkgeworCSAgICBTRExfRGVsYXkodGlja3MpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXVkaW9fYnVmZmVyICBwYXVkX2J1ZmluZm87CisKKyAgICAgICAgLyogVXNlIHNlbGVjdCgpIGZvciBhdWRpbyBzeW5jaHJvbml6YXRpb24gKi8KKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgRkRfWkVSTygmZmRzZXQpOworICAgICAgICBGRF9TRVQoYXVkaW9fZmQsICZmZHNldCk7CisKKyAgICAgICAgaWYgKCBpb2N0bChhdWRpb19mZCwgQVVESU9fQlVGRkVSLCAmcGF1ZF9idWZpbmZvKSA8IDAgKSB7CisjaWZkZWYgREVCVUdfQVVESU8KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgZ2V0IGF1ZGlvIGJ1ZmZlciBpbmZvcm1hdGlvblxuIik7CisjZW5kaWYKKyAgICAgICAgICAgIHRpbWVvdXQudHZfc2VjICA9IDEwOworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgbG9uZyBtc19pbl9idWYgPSBwYXVkX2J1ZmluZm8ud3JpdGVfYnVmX3RpbWU7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3NlYyAgPSBtc19pbl9idWYvMTAwMDsKKwkgICAgbXNfaW5fYnVmICAgICAgID0gbXNfaW5fYnVmIC0gdGltZW91dC50dl9zZWMqMTAwMDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IG1zX2luX2J1ZioxMDAwOworI2lmZGVmIERFQlVHX0FVRElPCisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsCisJCSAgICAgIldhaXRpbmcgZm9yIHdyaXRlX2J1Zl90aW1lPSVsZCwlbGRcbiIsCisJCSAgICAgdGltZW91dC50dl9zZWMsCisJCSAgICAgdGltZW91dC50dl91c2VjICk7CisjZW5kaWYKKwl9CisKKyNpZmRlZiBERUJVR19BVURJTworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhaXRpbmcgZm9yIGF1ZGlvIHRvIGdldCByZWFkeVxuIik7CisjZW5kaWYKKyAgICAgICAgaWYgKCBzZWxlY3QoYXVkaW9fZmQrMSwgTlVMTCwgJmZkc2V0LCBOVUxMLCAmdGltZW91dCkgPD0gMCApIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UgPSAiQXVkaW8gdGltZW91dCAtIGJ1Z2d5IGF1ZGlvIGRyaXZlcj8gKGRpc2FibGVkKSI7CisgICAgICAgICAgICAvKgorCSAgICAgKiBJbiBnZW5lcmFsIHdlIHNob3VsZCBuZXZlciBwcmludCB0byB0aGUgc2NyZWVuLAorICAgICAgICAgICAgICogYnV0IGluIHRoaXMgY2FzZSB3ZSBoYXZlIG5vIG90aGVyIHdheSBvZiBsZXR0aW5nCisgICAgICAgICAgICAgKiB0aGUgdXNlciBrbm93IHdoYXQgaGFwcGVuZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU0RMOiAlcyAtICVzXG4iLCBzdHJlcnJvcihlcnJubyksIG1lc3NhZ2UpOworICAgICAgICAgICAgdGhpcy0+ZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAvKiBEb24ndCB0cnkgdG8gY2xvc2UgLSBtYXkgaGFuZyAqLworICAgICAgICAgICAgYXVkaW9fZmQgPSAtMTsKKyNpZmRlZiBERUJVR19BVURJTworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEb25lIGRpc2FibGluZyBhdWRpb1xuIik7CisjZW5kaWYKKyAgICAgICAgfQorI2lmZGVmIERFQlVHX0FVRElPCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVhZHkhXG4iKTsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdGljIHZvaWQgUGF1ZF9QbGF5QXVkaW8oX1RISVMpCit7CisJaW50IHdyaXR0ZW47CisKKwkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSwgY2hlY2tpbmcgZm9yIEVBR0FJTiBvbiBicm9rZW4gYXVkaW8gZHJpdmVycyAqLworCWRvIHsKKwkJd3JpdHRlbiA9IHdyaXRlKGF1ZGlvX2ZkLCBtaXhidWYsIG1peGxlbik7CisJCWlmICggKHdyaXR0ZW4gPCAwKSAmJiAoKGVycm5vID09IDApIHx8IChlcnJubyA9PSBFQUdBSU4pKSApIHsKKwkJCVNETF9EZWxheSgxKTsJLyogTGV0IGEgbGl0dGxlIENQVSB0aW1lIGdvIGJ5ICovCisJCX0KKwl9IHdoaWxlICggKHdyaXR0ZW4gPCAwKSAmJiAKKwkgICAgICAgICAgKChlcnJubyA9PSAwKSB8fCAoZXJybm8gPT0gRUFHQUlOKSB8fCAoZXJybm8gPT0gRUlOVFIpKSApOworCisJLyogSWYgdGltZXIgc3luY2hyb25pemF0aW9uIGlzIGVuYWJsZWQsIHNldCB0aGUgbmV4dCB3cml0ZSBmcmFtZSAqLworCWlmICggZnJhbWVfdGlja3MgKSB7CisJCW5leHRfZnJhbWUgKz0gZnJhbWVfdGlja3M7CisJfQorCisJLyogSWYgd2UgY291bGRuJ3Qgd3JpdGUsIGFzc3VtZSBmYXRhbCBlcnJvciBmb3Igbm93ICovCisJaWYgKCB3cml0dGVuIDwgMCApIHsKKwkJdGhpcy0+ZW5hYmxlZCA9IDA7CisJfQorI2lmZGVmIERFQlVHX0FVRElPCisJZnByaW50ZihzdGRlcnIsICJXcm90ZSAlZCBieXRlcyBvZiBhdWRpbyBkYXRhXG4iLCB3cml0dGVuKTsKKyNlbmRpZgorfQorCitzdGF0aWMgVWludDggKlBhdWRfR2V0QXVkaW9CdWYoX1RISVMpCit7CisJcmV0dXJuIG1peGJ1ZjsKK30KKworc3RhdGljIHZvaWQgUGF1ZF9DbG9zZUF1ZGlvKF9USElTKQoreworCWlmICggbWl4YnVmICE9IE5VTEwgKSB7CisJCVNETF9GcmVlQXVkaW9NZW0obWl4YnVmKTsKKwkJbWl4YnVmID0gTlVMTDsKKwl9CisJaWYgKCBhdWRpb19mZCA+PSAwICkgeworCQljbG9zZShhdWRpb19mZCk7CisJCWF1ZGlvX2ZkID0gLTE7CisJfQorfQorCitzdGF0aWMgaW50IFBhdWRfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCWNoYXIgICAgICAgICAgYXVkaW9kZXZbMTAyNF07CisJaW50ICAgICAgICAgICBmb3JtYXQ7CisJaW50ICAgICAgICAgICBieXRlc19wZXJfc2FtcGxlOworCVVpbnQxNiAgICAgICAgdGVzdF9mb3JtYXQ7CisJYXVkaW9faW5pdCAgICBwYXVkX2luaXQ7CisJYXVkaW9fYnVmZmVyICBwYXVkX2J1ZmluZm87CisJYXVkaW9fc3RhdHVzICBwYXVkX3N0YXR1czsKKwlhdWRpb19jb250cm9sIHBhdWRfY29udHJvbDsKKwlhdWRpb19jaGFuZ2UgIHBhdWRfY2hhbmdlOworCisJLyogUmVzZXQgdGhlIHRpbWVyIHN5bmNocm9uaXphdGlvbiBmbGFnICovCisJZnJhbWVfdGlja3MgPSAwLjA7CisKKwkvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KKwlhdWRpb19mZCA9IFNETF9PcGVuQXVkaW9QYXRoKGF1ZGlvZGV2LCBzaXplb2YoYXVkaW9kZXYpLCBPUEVOX0ZMQUdTLCAwKTsKKwlpZiAoIGF1ZGlvX2ZkIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuICVzOiAlcyIsIGF1ZGlvZGV2LCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBXZSBjYW4ndCBzZXQgdGhlIGJ1ZmZlciBzaXplIC0ganVzdCBhc2sgdGhlIGRldmljZSBmb3IgdGhlIG1heGltdW0KKwkgKiB0aGF0IHdlIGNhbiBoYXZlLgorCSAqLworCWlmICggaW9jdGwoYXVkaW9fZmQsIEFVRElPX0JVRkZFUiwgJnBhdWRfYnVmaW5mbykgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBhdWRpbyBidWZmZXIgaW5mb3JtYXRpb24iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1peGJ1ZiA9IE5VTEw7CisKKwlpZiAoIHNwZWMtPmNoYW5uZWxzID4gMSApCisJICAgIHNwZWMtPmNoYW5uZWxzID0gMjsKKwllbHNlCisJICAgIHNwZWMtPmNoYW5uZWxzID0gMTsKKworCS8qCisJICogRmllbGRzIGluIHRoZSBhdWRpb19pbml0IHN0cnVjdHVyZToKKwkgKgorCSAqIElnbm9yZWQgYnkgdXM6CisJICoKKwkgKiBwYXVkLmxvYWRwYXRoW0xPQURfUEFUSF07ICogRFNQIGNvZGUgdG8gbG9hZCwgTVdhdmUgY2hpcCBvbmx5PworCSAqIHBhdWQuc2xvdF9udW1iZXI7ICAgICAgICAgKiBzbG90IG51bWJlciBvZiB0aGUgYWRhcHRlcgorCSAqIHBhdWQuZGV2aWNlX2lkOyAgICAgICAgICAgKiBhZGFwdGVyIGlkZW50aWZpY2F0aW9uIG51bWJlcgorCSAqCisJICogSW5wdXQ6CisJICoKKwkgKiBwYXVkLnNyYXRlOyAgICAgICAgICAgKiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIegorCSAqIHBhdWQuYml0c19wZXJfc2FtcGxlOyAqIDgsIDE2LCAzMiwgLi4uCisJICogcGF1ZC5ic2l6ZTsgICAgICAgICAgICogYmxvY2sgc2l6ZSBmb3IgdGhpcyByYXRlCisJICogcGF1ZC5tb2RlOyAgICAgICAgICAgICogQURQQ00sIFBDTSwgTVVfTEFXLCBBX0xBVywgU09VUkNFX01JWAorCSAqIHBhdWQuY2hhbm5lbHM7ICAgICAgICAqIDE9bW9ubywgMj1zdGVyZW8KKwkgKiBwYXVkLmZsYWdzOyAgICAgICAgICAgKiBGSVhFRCAtIGZpeGVkIGxlbmd0aCBkYXRhCisJICogICAgICAgICAgICAgICAgICAgICAgICogTEVGVF9BTElHTkVELCBSSUdIVF9BTElHTkVEICh2YXIgbGVuIG9ubHkpCisJICogICAgICAgICAgICAgICAgICAgICAgICogVFdPU19DT01QTEVNRU5UIC0gMidzIGNvbXBsZW1lbnQgZGF0YQorCSAqICAgICAgICAgICAgICAgICAgICAgICAqIFNJR05FRCAtIHNpZ25lZD8gY29tbWVudCBzZWVtcyB3cm9uZyBpbiBzeXMvYXVkaW8uaAorCSAqICAgICAgICAgICAgICAgICAgICAgICAqIEJJR19FTkRJQU4KKwkgKiBwYXVkLm9wZXJhdGlvbjsgICAgICAgKiBQTEFZLCBSRUNPUkQKKwkgKgorCSAqIE91dHB1dDoKKwkgKgorCSAqIHBhdWQuZmxhZ3M7ICAgICAgICAgICAqIFBJVENIICAgICAgICAgICAgLSBwaXRjaCBpcyBzdXBwb3J0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBJTlBVVCAgICAgICAgICAgIC0gaW5wdXQgaXMgc3VwcG9ydGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICogT1VUUFVUICAgICAgICAgICAtIG91dHB1dCBpcyBzdXBwb3J0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBNT05JVE9SICAgICAgICAgIC0gbW9uaXRvciBpcyBzdXBwb3J0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBWT0xVTUUgICAgICAgICAgIC0gdm9sdW1lIGlzIHN1cHBvcnRlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAqIFZPTFVNRV9ERUxBWSAgICAgLSB2b2x1bWUgZGVsYXkgaXMgc3VwcG9ydGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICogQkFMQU5DRSAgICAgICAgICAtIGJhbGFuY2UgaXMgc3VwcG9ydGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICogQkFMQU5DRV9ERUxBWSAgICAtIGJhbGFuY2UgZGVsYXkgaXMgc3VwcG9ydGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICogVFJFQkxFICAgICAgICAgICAtIHRyZWJsZSBjb250cm9sIGlzIHN1cHBvcnRlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAqIEJBU1MgICAgICAgICAgICAgLSBiYXNzIGNvbnRyb2wgaXMgc3VwcG9ydGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICogQkVTVEZJVF9QUk9WSURFRCAtIGJlc3QgZml0IHJldHVybmVkCisJICogICAgICAgICAgICAgICAgICAgICAgICogTE9BRF9DT0RFICAgICAgICAtIERTUCBsb2FkIG5lZWRlZAorCSAqIHBhdWQucmM7ICAgICAgICAgICAgICAqIE5PX1BMQVkgICAgICAgICAtIERTUCBjb2RlIGNhbid0IGRvIHBsYXkgcmVxdWVzdHMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBOT19SRUNPUkQgICAgICAgLSBEU1AgY29kZSBjYW4ndCBkbyByZWNvcmQgcmVxdWVzdHMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBJTlZBTElEX1JFUVVFU1QgLSByZXF1ZXN0IHdhcyBpbnZhbGlkCisJICogICAgICAgICAgICAgICAgICAgICAgICogQ09ORkxJQ1QgICAgICAgIC0gY29uZmxpY3Qgd2l0aCBvcGVuJ3MgZmxhZ3MKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgKiBPVkVSTE9BREVEICAgICAgLSBvdXQgb2YgRFNQIE1JUFMgb3IgbWVtb3J5CisJICogcGF1ZC5wb3NpdGlvbl9yZXNvbHV0aW9uOyAqIHNtYWxsZXN0IGluY3JlbWVudCBmb3IgcG9zaXRpb24KKwkgKi8KKworICAgICAgICBwYXVkX2luaXQuc3JhdGUgPSBzcGVjLT5mcmVxOworCXBhdWRfaW5pdC5tb2RlID0gUENNOworCXBhdWRfaW5pdC5vcGVyYXRpb24gPSBQTEFZOworCXBhdWRfaW5pdC5jaGFubmVscyA9IHNwZWMtPmNoYW5uZWxzOworCisJLyogVHJ5IGZvciBhIGNsb3Nlc3QgbWF0Y2ggb24gYXVkaW8gZm9ybWF0ICovCisJZm9ybWF0ID0gMDsKKwlmb3IgKCB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7CisJCQkJCQkhIGZvcm1hdCAmJiB0ZXN0X2Zvcm1hdDsgKSB7CisjaWZkZWYgREVCVUdfQVVESU8KKwkJZnByaW50ZihzdGRlcnIsICJUcnlpbmcgZm9ybWF0IDB4JTQuNHhcbiIsIHRlc3RfZm9ybWF0KTsKKyNlbmRpZgorCQlzd2l0Y2ggKCB0ZXN0X2Zvcm1hdCApIHsKKwkJCWNhc2UgQVVESU9fVTg6CisJCQkgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDE7CisJCQkgICAgcGF1ZF9pbml0LmJpdHNfcGVyX3NhbXBsZSA9IDg7CisJCQkgICAgcGF1ZF9pbml0LmZsYWdzID0gVFdPU19DT01QTEVNRU5UIHwgRklYRUQ7CisJCQkgICAgZm9ybWF0ID0gMTsKKwkJCSAgICBicmVhazsKKwkJCWNhc2UgQVVESU9fUzg6CisJCQkgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDE7CisJCQkgICAgcGF1ZF9pbml0LmJpdHNfcGVyX3NhbXBsZSA9IDg7CisJCQkgICAgcGF1ZF9pbml0LmZsYWdzID0gU0lHTkVEIHwKKwkJCQkJICAgICAgVFdPU19DT01QTEVNRU5UIHwgRklYRUQ7CisJCQkgICAgZm9ybWF0ID0gMTsKKwkJCSAgICBicmVhazsKKwkJCWNhc2UgQVVESU9fUzE2TFNCOgorCQkJICAgIGJ5dGVzX3Blcl9zYW1wbGUgPSAyOworCQkJICAgIHBhdWRfaW5pdC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKKwkJCSAgICBwYXVkX2luaXQuZmxhZ3MgPSBTSUdORUQgfAorCQkJCQkgICAgICBUV09TX0NPTVBMRU1FTlQgfCBGSVhFRDsKKwkJCSAgICBmb3JtYXQgPSAxOworCQkJICAgIGJyZWFrOworCQkJY2FzZSBBVURJT19TMTZNU0I6CisJCQkgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDI7CisJCQkgICAgcGF1ZF9pbml0LmJpdHNfcGVyX3NhbXBsZSA9IDE2OworCQkJICAgIHBhdWRfaW5pdC5mbGFncyA9IEJJR19FTkRJQU4gfAorCQkJCQkgICAgICBTSUdORUQgfAorCQkJCQkgICAgICBUV09TX0NPTVBMRU1FTlQgfCBGSVhFRDsKKwkJCSAgICBmb3JtYXQgPSAxOworCQkJICAgIGJyZWFrOworCQkJY2FzZSBBVURJT19VMTZMU0I6CisJCQkgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDI7CisJCQkgICAgcGF1ZF9pbml0LmJpdHNfcGVyX3NhbXBsZSA9IDE2OworCQkJICAgIHBhdWRfaW5pdC5mbGFncyA9IFRXT1NfQ09NUExFTUVOVCB8IEZJWEVEOworCQkJICAgIGZvcm1hdCA9IDE7CisJCQkgICAgYnJlYWs7CisJCQljYXNlIEFVRElPX1UxNk1TQjoKKwkJCSAgICBieXRlc19wZXJfc2FtcGxlID0gMjsKKwkJCSAgICBwYXVkX2luaXQuYml0c19wZXJfc2FtcGxlID0gMTY7CisJCQkgICAgcGF1ZF9pbml0LmZsYWdzID0gQklHX0VORElBTiB8CisJCQkJCSAgICAgIFRXT1NfQ09NUExFTUVOVCB8IEZJWEVEOworCQkJICAgIGZvcm1hdCA9IDE7CisJCQkgICAgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWlmICggISBmb3JtYXQgKSB7CisJCQl0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKKwkJfQorCX0KKwlpZiAoIGZvcm1hdCA9PSAwICkgeworI2lmZGVmIERFQlVHX0FVRElPCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGZpbmQgYW55IGhhcmR3YXJlIGF1ZGlvIGZvcm1hdHNcbiIpOworI2VuZGlmCisJICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCBhbnkgaGFyZHdhcmUgYXVkaW8gZm9ybWF0cyIpOworCSAgICByZXR1cm4gLTE7CisJfQorCXNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OworCisJLyoKKwkgKiBXZSBrbm93IHRoZSBidWZmZXIgc2l6ZSBhbmQgdGhlIG1heCBudW1iZXIgb2Ygc3Vic2VxdWVudCB3cml0ZXMKKwkgKiB0aGF0IGNhbiBiZSBwZW5kaW5nLiBJZiBtb3JlIHRoYW4gb25lIGNhbiBwZW5kLCBhbGxvdyB0aGUgYXBwbGljYXRpb24KKwkgKiB0byBkbyBzb21ldGhpbmcgbGlrZSBkb3VibGUgYnVmZmVyaW5nIGJldHdlZW4gb3VyIHdyaXRlIGJ1ZmZlciBhbmQKKwkgKiB0aGUgZGV2aWNlJ3Mgb3duIGJ1ZmZlciB0aGF0IHdlIGFyZSBmaWxsaW5nIHdpdGggd3JpdGUoKSBhbnl3YXkuCisJICoKKwkgKiBXZSBjYWxjdWxhdGUgc3BlYy0+c2FtcGxlcyBsaWtlIHRoaXMgYmVjYXVzZSBTRExfQ2FsY3VsYXRlQXVkaW9TcGVjKCkKKwkgKiB3aWxsIGdpdmUgcHV0IHBhdWRfYnVmaW5mby53cml0ZV9idWZfY2FwIChvciBwYXVkX2J1ZmluZm8ud3JpdGVfYnVmX2NhcC8yKQorCSAqIGludG8gc3BlYy0+c2l6ZSBpbiByZXR1cm4uCisJICovCisJaWYgKCBwYXVkX2J1ZmluZm8ucmVxdWVzdF9idWZfY2FwID09IDEgKQorCXsKKwkgICAgc3BlYy0+c2FtcGxlcyA9IHBhdWRfYnVmaW5mby53cml0ZV9idWZfY2FwCisJCQkgIC8gYnl0ZXNfcGVyX3NhbXBsZQorCQkJICAvIHNwZWMtPmNoYW5uZWxzOworCX0KKwllbHNlCisJeworCSAgICBzcGVjLT5zYW1wbGVzID0gcGF1ZF9idWZpbmZvLndyaXRlX2J1Zl9jYXAKKwkJCSAgLyBieXRlc19wZXJfc2FtcGxlCisJCQkgIC8gc3BlYy0+Y2hhbm5lbHMKKwkJCSAgLyAyOworCX0KKyAgICAgICAgcGF1ZF9pbml0LmJzaXplID0gYnl0ZXNfcGVyX3NhbXBsZSAqIHNwZWMtPmNoYW5uZWxzOworCisJU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKworCS8qCisJICogVGhlIEFJWCBwYXVkIGRldmljZSBpbml0IGNhbid0IG1vZGlmeSB0aGUgdmFsdWVzIG9mIHRoZSBhdWRpb19pbml0CisJICogc3RydWN0dXJlIHRoYXQgd2UgcGFzcyB0byBpdC4gU28gd2UgZG9uJ3QgbmVlZCBhbnkgcmVjYWxjdWxhdGlvbgorCSAqIG9mIHRoaXMgc3R1ZmYgYW5kIG5vIHJlaW5pdCBjYWxsIGFzIGluIGxpbnV4IGRzcCBhbmQgZG1hIGNvZGUuCisJICoKKwkgKiAvZGV2L3BhdWQgc3VwcG9ydHMgYWxsIG9mIHRoZSBlbmNvZGluZyBmb3JtYXRzLCBzbyB3ZSBkb24ndCBuZWVkCisJICogdG8gZG8gYW55dGhpbmcgbGlrZSByZW9wZW5pbmcgdGhlIGRldmljZSwgZWl0aGVyLgorCSAqLworCWlmICggaW9jdGwoYXVkaW9fZmQsIEFVRElPX0lOSVQsICZwYXVkX2luaXQpIDwgMCApIHsKKwkgICAgc3dpdGNoICggcGF1ZF9pbml0LnJjICkKKwkgICAgeworCSAgICBjYXNlIDEgOgorCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmb3JtYXQ6IERTUCBjYW4ndCBkbyBwbGF5IHJlcXVlc3RzIik7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMiA6CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZvcm1hdDogRFNQIGNhbid0IGRvIHJlY29yZCByZXF1ZXN0cyIpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCSAgICBjYXNlIDQgOgorCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmb3JtYXQ6IHJlcXVlc3Qgd2FzIGludmFsaWQiKTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwkgICAgY2FzZSA1IDoKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBzZXQgYXVkaW8gZm9ybWF0OiBjb25mbGljdCB3aXRoIG9wZW4ncyBmbGFncyIpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCSAgICBjYXNlIDYgOgorCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBhdWRpbyBmb3JtYXQ6IG91dCBvZiBEU1AgTUlQUyBvciBtZW1vcnkiKTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwkgICAgZGVmYXVsdCA6CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZvcm1hdDogbm90IGRvY3VtZW50ZWQgaW4gc3lzL2F1ZGlvLmgiKTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwkgICAgfQorCX0KKworCS8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KKwltaXhsZW4gPSBzcGVjLT5zaXplOworCW1peGJ1ZiA9IChVaW50OCAqKVNETF9BbGxvY0F1ZGlvTWVtKG1peGxlbik7CisJaWYgKCBtaXhidWYgPT0gTlVMTCApIHsKKwkJcmV0dXJuIC0xOworCX0KKwlTRExfbWVtc2V0KG1peGJ1Ziwgc3BlYy0+c2lsZW5jZSwgc3BlYy0+c2l6ZSk7CisKKwkvKgorCSAqIFNldCBzb21lIHBhcmFtdGVyczogZnVsbCB2b2x1bWUsIGZpcnN0IHNwZWFrZXIgdGhhdCB3ZSBjYW4gZmluZC4KKwkgKiBJZ25vcmUgdGhlIG90aGVyIHNldHRpbmdzIGZvciBub3cuCisJICovCisJcGF1ZF9jaGFuZ2UuaW5wdXQgPSBBVURJT19JR05PUkU7ICAgICAgICAgLyogdGhlIG5ldyBpbnB1dCBzb3VyY2UgKi8KKyAgICAgICAgcGF1ZF9jaGFuZ2Uub3V0cHV0ID0gT1VUUFVUXzE7ICAgICAgICAgICAgLyogRVhURVJOQUxfU1BFQUtFUixJTlRFUk5BTF9TUEVBS0VSLE9VVFBVVF8xICovCisgICAgICAgIHBhdWRfY2hhbmdlLm1vbml0b3IgPSBBVURJT19JR05PUkU7ICAgICAgIC8qIHRoZSBuZXcgbW9uaXRvciBzdGF0ZSAqLworICAgICAgICBwYXVkX2NoYW5nZS52b2x1bWUgPSAweDdmZmZmZmZmOyAgICAgICAgICAvKiB2b2x1bWUgbGV2ZWwgWzAtMHg3ZmZmZmZmZl0gKi8KKyAgICAgICAgcGF1ZF9jaGFuZ2Uudm9sdW1lX2RlbGF5ID0gQVVESU9fSUdOT1JFOyAgLyogdGhlIG5ldyB2b2x1bWUgZGVsYXkgKi8KKyAgICAgICAgcGF1ZF9jaGFuZ2UuYmFsYW5jZSA9IDB4M2ZmZmZmZmY7ICAgICAgICAgLyogdGhlIG5ldyBiYWxhbmNlICovCisgICAgICAgIHBhdWRfY2hhbmdlLmJhbGFuY2VfZGVsYXkgPSBBVURJT19JR05PUkU7IC8qIHRoZSBuZXcgYmFsYW5jZSBkZWxheSAqLworICAgICAgICBwYXVkX2NoYW5nZS50cmVibGUgPSBBVURJT19JR05PUkU7ICAgICAgICAvKiB0aGUgbmV3IHRyZWJsZSBzdGF0ZSAqLworICAgICAgICBwYXVkX2NoYW5nZS5iYXNzID0gQVVESU9fSUdOT1JFOyAgICAgICAgICAvKiB0aGUgbmV3IGJhc3Mgc3RhdGUgKi8KKyAgICAgICAgcGF1ZF9jaGFuZ2UucGl0Y2ggPSBBVURJT19JR05PUkU7ICAgICAgICAgLyogdGhlIG5ldyBwaXRjaCBzdGF0ZSAqLworCisJcGF1ZF9jb250cm9sLmlvY3RsX3JlcXVlc3QgPSBBVURJT19DSEFOR0U7CisJcGF1ZF9jb250cm9sLnJlcXVlc3RfaW5mbyA9IChjaGFyKikmcGF1ZF9jaGFuZ2U7CisJaWYgKCBpb2N0bChhdWRpb19mZCwgQVVESU9fQ09OVFJPTCwgJnBhdWRfY29udHJvbCkgPCAwICkgeworI2lmZGVmIERFQlVHX0FVRElPCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGNoYW5nZSBhdWRpbyBkaXNwbGF5IHNldHRpbmdzXG4iICk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIFRlbGwgdGhlIGRldmljZSB0byBleHBlY3QgZGF0YS4gQWN0dWFsIHN0YXJ0IHdpbGwgd2FpdCBmb3IKKwkgKiB0aGUgZmlyc3Qgd3JpdGUoKSBjYWxsLgorCSAqLworCXBhdWRfY29udHJvbC5pb2N0bF9yZXF1ZXN0ID0gQVVESU9fU1RBUlQ7CisJcGF1ZF9jb250cm9sLnBvc2l0aW9uID0gMDsKKwlpZiAoIGlvY3RsKGF1ZGlvX2ZkLCBBVURJT19DT05UUk9MLCAmcGF1ZF9jb250cm9sKSA8IDAgKSB7CisjaWZkZWYgREVCVUdfQVVESU8KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgc3RhcnQgYXVkaW8gcGxheVxuIiApOworI2VuZGlmCisJICAgIFNETF9TZXRFcnJvcigiQ2FuJ3Qgc3RhcnQgYXVkaW8gcGxheSIpOworCSAgICByZXR1cm4gLTE7CisJfQorCisgICAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHVzZSBzZWxlY3QoKSB3b3JrYXJvdW5kICovCisgICAgICAgIHsgY2hhciAqd29ya2Fyb3VuZDsKKyAgICAgICAgICAgICAgICB3b3JrYXJvdW5kID0gU0RMX2dldGVudigiU0RMX0RTUF9OT1NFTEVDVCIpOworICAgICAgICAgICAgICAgIGlmICggd29ya2Fyb3VuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3RpY2tzID0gKGZsb2F0KShzcGVjLT5zYW1wbGVzKjEwMDApL3NwZWMtPmZyZXE7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2ZyYW1lID0gU0RMX0dldFRpY2tzKCkrZnJhbWVfdGlja3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkvKiBHZXQgdGhlIHBhcmVudCBwcm9jZXNzIGlkICh3ZSdyZSB0aGUgcGFyZW50IG9mIHRoZSBhdWRpbyB0aHJlYWQpICovCisJcGFyZW50ID0gZ2V0cGlkKCk7CisKKwkvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9wYXVkaW8vU0RMX3BhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9wYXVkaW8vU0RMX3BhdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWZmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3BhdWRpby9TRExfcGF1ZGlvLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9wYXVkYXVkaW9faAorI2RlZmluZSBfU0RMX3BhdWRhdWRpb19oCisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcworCitzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgeworCS8qIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBhdWRpbyBkZXZpY2UgKi8KKwlpbnQgYXVkaW9fZmQ7CisKKwkvKiBUaGUgcGFyZW50IHByb2Nlc3MgaWQsIHRvIGRldGVjdCB3aGVuIGFwcGxpY2F0aW9uIHF1aXRzICovCisJcGlkX3QgcGFyZW50OworCisJLyogUmF3IG1peGluZyBidWZmZXIgKi8KKwlVaW50OCAqbWl4YnVmOworCWludCAgICBtaXhsZW47CisKKwkvKiBTdXBwb3J0IGZvciBhdWRpbyB0aW1pbmcgdXNpbmcgYSB0aW1lciwgaW4gYWRkaXRpb24gdG8gc2VsZWN0KCkgKi8KKwlmbG9hdCBmcmFtZV90aWNrczsKKwlmbG9hdCBuZXh0X2ZyYW1lOworfTsKKyNkZWZpbmUgRlVER0VfVElDS1MJMTAJLyogVGhlIHNjaGVkdWxlciBvdmVyaGVhZCB0aWNrcyBwZXIgZnJhbWUgKi8KKworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIGF1ZGlvX2ZkCQkodGhpcy0+aGlkZGVuLT5hdWRpb19mZCkKKyNkZWZpbmUgcGFyZW50CQkJKHRoaXMtPmhpZGRlbi0+cGFyZW50KQorI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCisjZGVmaW5lIG1peGxlbgkJCSh0aGlzLT5oaWRkZW4tPm1peGxlbikKKyNkZWZpbmUgZnJhbWVfdGlja3MJCSh0aGlzLT5oaWRkZW4tPmZyYW1lX3RpY2tzKQorI2RlZmluZSBuZXh0X2ZyYW1lCQkodGhpcy0+aGlkZGVuLT5uZXh0X2ZyYW1lKQorCisjZW5kaWYgLyogX1NETF9wYXVkYXVkaW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9wdWxzZS9TRExfcHVsc2VhdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9wdWxzZS9TRExfcHVsc2VhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzczZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3B1bHNlL1NETF9wdWxzZWF1ZGlvLmMKQEAgLTAsMCArMSw1NzAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTdMOpcGhhbiBLb2NoZW4KKyAgICBzdGVwaGFuQGtvY2hlbi5ubAorCisgICAgQmFzZWQgb24gcGFydHMgb2YgdGhlIEFMU0EgYW5kIEVTb3VuRCBvdXRwdXQgZHJpdmVycy4KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbGxvdyBhY2Nlc3MgdG8gYW4gUHVsc2VBdWRpbyBuZXR3b3JrIHN0cmVhbSBtaXhpbmcgYnVmZmVyICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHB1bHNlL3B1bHNlYXVkaW8uaD4KKyNpbmNsdWRlIDxwdWxzZS9zaW1wbGUuaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb21lbS5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvZGV2X2MuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL1NETF92aWRlby5oIiAgLyogZm9yIFNETF9XTV9HZXRDYXB0aW9uKCkuICovCisjaW5jbHVkZSAiU0RMX3B1bHNlYXVkaW8uaCIKKworI2lmZGVmIFNETF9BVURJT19EUklWRVJfUFVMU0VfRFlOQU1JQworI2luY2x1ZGUgIlNETF9uYW1lLmgiCisjaW5jbHVkZSAiU0RMX2xvYWRzby5oIgorI2Vsc2UKKyNkZWZpbmUgU0RMX05BTUUoWCkJWAorI2VuZGlmCisKKy8qIFRoZSB0YWcgbmFtZSB1c2VkIGJ5IHRoZSBkcml2ZXIgKi8KKyNkZWZpbmUgUFVMU0VfRFJJVkVSX05BTUUJInB1bHNlIgorCisvKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IFBVTFNFX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYyk7CitzdGF0aWMgdm9pZCBQVUxTRV9XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgUFVMU0VfUGxheUF1ZGlvKF9USElTKTsKK3N0YXRpYyBVaW50OCAqUFVMU0VfR2V0QXVkaW9CdWYoX1RISVMpOworc3RhdGljIHZvaWQgUFVMU0VfQ2xvc2VBdWRpbyhfVEhJUyk7CitzdGF0aWMgdm9pZCBQVUxTRV9XYWl0RG9uZShfVEhJUyk7CitzdGF0aWMgdm9pZCBQVUxTRV9TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICpzdHIpOworCisjaWZkZWYgU0RMX0FVRElPX0RSSVZFUl9QVUxTRV9EWU5BTUlDCisKK3N0YXRpYyBjb25zdCBjaGFyICpwdWxzZV9saWJyYXJ5ID0gU0RMX0FVRElPX0RSSVZFUl9QVUxTRV9EWU5BTUlDOworc3RhdGljIHZvaWQgKnB1bHNlX2hhbmRsZSA9IE5VTEw7CitzdGF0aWMgaW50IHB1bHNlX2xvYWRlZCA9IDA7CisKK3N0YXRpYyBwYV9zaW1wbGUqICgqU0RMX05BTUUocGFfc2ltcGxlX25ldykpKAorCWNvbnN0IGNoYXIgKnNlcnZlciwKKwljb25zdCBjaGFyICpuYW1lLAorCXBhX3N0cmVhbV9kaXJlY3Rpb25fdCBkaXIsCisJY29uc3QgY2hhciAqZGV2LAorCWNvbnN0IGNoYXIgKnN0cmVhbV9uYW1lLAorCWNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcywKKwljb25zdCBwYV9jaGFubmVsX21hcCAqbWFwLAorCWNvbnN0IHBhX2J1ZmZlcl9hdHRyICphdHRyLAorCWludCAqZXJyb3IKKyk7CitzdGF0aWMgdm9pZCAoKlNETF9OQU1FKHBhX3NpbXBsZV9mcmVlKSkocGFfc2ltcGxlICpzKTsKKworc3RhdGljIHBhX2NoYW5uZWxfbWFwKiAoKlNETF9OQU1FKHBhX2NoYW5uZWxfbWFwX2luaXRfYXV0bykpKAorCXBhX2NoYW5uZWxfbWFwICptLAorCXVuc2lnbmVkIGNoYW5uZWxzLAorCXBhX2NoYW5uZWxfbWFwX2RlZl90IGRlZgorKTsKKworc3RhdGljIHBhX21haW5sb29wICogKCpTRExfTkFNRShwYV9tYWlubG9vcF9uZXcpKSh2b2lkKTsKK3N0YXRpYyBwYV9tYWlubG9vcF9hcGkgKiAoKlNETF9OQU1FKHBhX21haW5sb29wX2dldF9hcGkpKShwYV9tYWlubG9vcCAqbSk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUocGFfbWFpbmxvb3BfaXRlcmF0ZSkpKHBhX21haW5sb29wICptLCBpbnQgYmxvY2ssIGludCAqcmV0dmFsKTsKK3N0YXRpYyB2b2lkICgqU0RMX05BTUUocGFfbWFpbmxvb3BfZnJlZSkpKHBhX21haW5sb29wICptKTsKKworc3RhdGljIHBhX29wZXJhdGlvbl9zdGF0ZV90ICgqU0RMX05BTUUocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSkpKHBhX29wZXJhdGlvbiAqbyk7CitzdGF0aWMgdm9pZCAoKlNETF9OQU1FKHBhX29wZXJhdGlvbl9jYW5jZWwpKShwYV9vcGVyYXRpb24gKm8pOworc3RhdGljIHZvaWQgKCpTRExfTkFNRShwYV9vcGVyYXRpb25fdW5yZWYpKShwYV9vcGVyYXRpb24gKm8pOworCitzdGF0aWMgcGFfY29udGV4dCAqICgqU0RMX05BTUUocGFfY29udGV4dF9uZXcpKSgKKwlwYV9tYWlubG9vcF9hcGkgKm0sIGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIGludCAoKlNETF9OQU1FKHBhX2NvbnRleHRfY29ubmVjdCkpKAorCXBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKnNlcnZlciwKKwlwYV9jb250ZXh0X2ZsYWdzX3QgZmxhZ3MsIGNvbnN0IHBhX3NwYXduX2FwaSAqYXBpKTsKK3N0YXRpYyBwYV9jb250ZXh0X3N0YXRlX3QgKCpTRExfTkFNRShwYV9jb250ZXh0X2dldF9zdGF0ZSkpKHBhX2NvbnRleHQgKmMpOworc3RhdGljIHZvaWQgKCpTRExfTkFNRShwYV9jb250ZXh0X2Rpc2Nvbm5lY3QpKShwYV9jb250ZXh0ICpjKTsKK3N0YXRpYyB2b2lkICgqU0RMX05BTUUocGFfY29udGV4dF91bnJlZikpKHBhX2NvbnRleHQgKmMpOworCitzdGF0aWMgcGFfc3RyZWFtICogKCpTRExfTkFNRShwYV9zdHJlYW1fbmV3KSkocGFfY29udGV4dCAqYywKKwljb25zdCBjaGFyICpuYW1lLCBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3MsIGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXApOworc3RhdGljIGludCAoKlNETF9OQU1FKHBhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrKSkocGFfc3RyZWFtICpzLCBjb25zdCBjaGFyICpkZXYsCisJY29uc3QgcGFfYnVmZmVyX2F0dHIgKmF0dHIsIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzLAorCXBhX2N2b2x1bWUgKnZvbHVtZSwgcGFfc3RyZWFtICpzeW5jX3N0cmVhbSk7CitzdGF0aWMgcGFfc3RyZWFtX3N0YXRlX3QgKCpTRExfTkFNRShwYV9zdHJlYW1fZ2V0X3N0YXRlKSkocGFfc3RyZWFtICpzKTsKK3N0YXRpYyBzaXplX3QgKCpTRExfTkFNRShwYV9zdHJlYW1fd3JpdGFibGVfc2l6ZSkpKHBhX3N0cmVhbSAqcyk7CitzdGF0aWMgaW50ICgqU0RMX05BTUUocGFfc3RyZWFtX3dyaXRlKSkocGFfc3RyZWFtICpzLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbmJ5dGVzLAorCXBhX2ZyZWVfY2JfdCBmcmVlX2NiLCBpbnQ2NF90IG9mZnNldCwgcGFfc2Vla19tb2RlX3Qgc2Vlayk7CitzdGF0aWMgcGFfb3BlcmF0aW9uICogKCpTRExfTkFNRShwYV9zdHJlYW1fZHJhaW4pKShwYV9zdHJlYW0gKnMsCisJcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworc3RhdGljIGludCAoKlNETF9OQU1FKHBhX3N0cmVhbV9kaXNjb25uZWN0KSkocGFfc3RyZWFtICpzKTsKK3N0YXRpYyB2b2lkICgqU0RMX05BTUUocGFfc3RyZWFtX3VucmVmKSkocGFfc3RyZWFtICpzKTsKK3N0YXRpYyBwYV9vcGVyYXRpb24qICgqU0RMX05BTUUocGFfY29udGV4dF9zZXRfbmFtZSkpKHBhX2NvbnRleHQgKmMsCisJY29uc3QgY2hhciAqbmFtZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICoqZnVuYzsKK30gcHVsc2VfZnVuY3Rpb25zW10gPSB7CisJeyAicGFfc2ltcGxlX25ldyIsCisJCSh2b2lkICoqKSZTRExfTkFNRShwYV9zaW1wbGVfbmV3KQkJfSwKKwl7ICJwYV9zaW1wbGVfZnJlZSIsCisJCSh2b2lkICoqKSZTRExfTkFNRShwYV9zaW1wbGVfZnJlZSkJCX0sCisJeyAicGFfY2hhbm5lbF9tYXBfaW5pdF9hdXRvIiwKKwkJKHZvaWQgKiopJlNETF9OQU1FKHBhX2NoYW5uZWxfbWFwX2luaXRfYXV0bykJfSwKKwl7ICJwYV9tYWlubG9vcF9uZXciLAorCQkodm9pZCAqKikmU0RMX05BTUUocGFfbWFpbmxvb3BfbmV3KQkJfSwKKwl7ICJwYV9tYWlubG9vcF9nZXRfYXBpIiwKKwkJKHZvaWQgKiopJlNETF9OQU1FKHBhX21haW5sb29wX2dldF9hcGkpCQl9LAorCXsgInBhX21haW5sb29wX2l0ZXJhdGUiLAorCQkodm9pZCAqKikmU0RMX05BTUUocGFfbWFpbmxvb3BfaXRlcmF0ZSkJCX0sCisJeyAicGFfbWFpbmxvb3BfZnJlZSIsCisJCSh2b2lkICoqKSZTRExfTkFNRShwYV9tYWlubG9vcF9mcmVlKQkJfSwKKwl7ICJwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIiwKKwkJKHZvaWQgKiopJlNETF9OQU1FKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUpCX0sCisJeyAicGFfb3BlcmF0aW9uX2NhbmNlbCIsCisJCSh2b2lkICoqKSZTRExfTkFNRShwYV9vcGVyYXRpb25fY2FuY2VsKQkJfSwKKwl7ICJwYV9vcGVyYXRpb25fdW5yZWYiLAorCQkodm9pZCAqKikmU0RMX05BTUUocGFfb3BlcmF0aW9uX3VucmVmKQkJfSwKKwl7ICJwYV9jb250ZXh0X25ldyIsCisJCSh2b2lkICoqKSZTRExfTkFNRShwYV9jb250ZXh0X25ldykJCX0sCisJeyAicGFfY29udGV4dF9jb25uZWN0IiwKKwkJKHZvaWQgKiopJlNETF9OQU1FKHBhX2NvbnRleHRfY29ubmVjdCkJCX0sCisJeyAicGFfY29udGV4dF9nZXRfc3RhdGUiLAorCQkodm9pZCAqKikmU0RMX05BTUUocGFfY29udGV4dF9nZXRfc3RhdGUpCX0sCisJeyAicGFfY29udGV4dF9kaXNjb25uZWN0IiwKKwkJKHZvaWQgKiopJlNETF9OQU1FKHBhX2NvbnRleHRfZGlzY29ubmVjdCkJfSwKKwl7ICJwYV9jb250ZXh0X3VucmVmIiwKKwkJKHZvaWQgKiopJlNETF9OQU1FKHBhX2NvbnRleHRfdW5yZWYpCQl9LAorCXsgInBhX3N0cmVhbV9uZXciLAorCQkodm9pZCAqKikmU0RMX05BTUUocGFfc3RyZWFtX25ldykJCX0sCisJeyAicGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2siLAorCQkodm9pZCAqKikmU0RMX05BTUUocGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2spCX0sCisJeyAicGFfc3RyZWFtX2dldF9zdGF0ZSIsCisJCSh2b2lkICoqKSZTRExfTkFNRShwYV9zdHJlYW1fZ2V0X3N0YXRlKQkJfSwKKwl7ICJwYV9zdHJlYW1fd3JpdGFibGVfc2l6ZSIsCisJCSh2b2lkICoqKSZTRExfTkFNRShwYV9zdHJlYW1fd3JpdGFibGVfc2l6ZSkJfSwKKwl7ICJwYV9zdHJlYW1fd3JpdGUiLAorCQkodm9pZCAqKikmU0RMX05BTUUocGFfc3RyZWFtX3dyaXRlKQkJfSwKKwl7ICJwYV9zdHJlYW1fZHJhaW4iLAorCQkodm9pZCAqKikmU0RMX05BTUUocGFfc3RyZWFtX2RyYWluKQkJfSwKKwl7ICJwYV9zdHJlYW1fZGlzY29ubmVjdCIsCisJCSh2b2lkICoqKSZTRExfTkFNRShwYV9zdHJlYW1fZGlzY29ubmVjdCkJfSwKKwl7ICJwYV9zdHJlYW1fdW5yZWYiLAorCQkodm9pZCAqKikmU0RMX05BTUUocGFfc3RyZWFtX3VucmVmKQkJfSwKKwl7ICJwYV9jb250ZXh0X3NldF9uYW1lIiwKKwkJKHZvaWQgKiopJlNETF9OQU1FKHBhX2NvbnRleHRfc2V0X25hbWUpCQl9LAorfTsKKworc3RhdGljIHZvaWQgVW5sb2FkUHVsc2VMaWJyYXJ5KCkKK3sKKwlpZiAoIHB1bHNlX2xvYWRlZCApIHsKKwkJU0RMX1VubG9hZE9iamVjdChwdWxzZV9oYW5kbGUpOworCQlwdWxzZV9oYW5kbGUgPSBOVUxMOworCQlwdWxzZV9sb2FkZWQgPSAwOworCX0KK30KKworc3RhdGljIGludCBMb2FkUHVsc2VMaWJyYXJ5KHZvaWQpCit7CisJaW50IGksIHJldHZhbCA9IC0xOworCisJcHVsc2VfaGFuZGxlID0gU0RMX0xvYWRPYmplY3QocHVsc2VfbGlicmFyeSk7CisJaWYgKCBwdWxzZV9oYW5kbGUgKSB7CisJCXB1bHNlX2xvYWRlZCA9IDE7CisJCXJldHZhbCA9IDA7CisJCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKHB1bHNlX2Z1bmN0aW9ucyk7ICsraSApIHsKKwkJCSpwdWxzZV9mdW5jdGlvbnNbaV0uZnVuYyA9IFNETF9Mb2FkRnVuY3Rpb24ocHVsc2VfaGFuZGxlLCBwdWxzZV9mdW5jdGlvbnNbaV0ubmFtZSk7CisJCQlpZiAoICEqcHVsc2VfZnVuY3Rpb25zW2ldLmZ1bmMgKSB7CisJCQkJcmV0dmFsID0gLTE7CisJCQkJVW5sb2FkUHVsc2VMaWJyYXJ5KCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgVW5sb2FkUHVsc2VMaWJyYXJ5KCkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgTG9hZFB1bHNlTGlicmFyeSh2b2lkKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogU0RMX0FVRElPX0RSSVZFUl9QVUxTRV9EWU5BTUlDICovCisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisJcGFfc2FtcGxlX3NwZWMgcGFzcGVjOworCXBhX3NpbXBsZSAqY29ubmVjdGlvbjsKKwlpbnQgYXZhaWxhYmxlOworCisJYXZhaWxhYmxlID0gMDsKKwlpZiAoIExvYWRQdWxzZUxpYnJhcnkoKSA8IDAgKSB7CisJCXJldHVybiBhdmFpbGFibGU7CisJfQorCisJLyogQ29ubmVjdCB3aXRoIGEgZHVtbXkgZm9ybWF0LiAqLworCXBhc3BlYy5mb3JtYXQgPSBQQV9TQU1QTEVfVTg7CisJcGFzcGVjLnJhdGUgPSAxMTAyNTsKKwlwYXNwZWMuY2hhbm5lbHMgPSAxOworCWNvbm5lY3Rpb24gPSBTRExfTkFNRShwYV9zaW1wbGVfbmV3KSgKKwkJTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJ2ZXIgKi8KKwkJIlRlc3Qgc3RyZWFtIiwgICAgICAgICAgICAgICAvKiBhcHBsaWNhdGlvbiBuYW1lICovCisJCVBBX1NUUkVBTV9QTEFZQkFDSywgICAgICAgICAgLyogcGxheWJhY2sgbW9kZSAqLworCQlOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldmljZSBvbiB0aGUgc2VydmVyICovCisJCSJTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIiLCAgLyogc3RyZWFtIGRlc2NyaXB0aW9uICovCisJCSZwYXNwZWMsICAgICAgICAgICAgICAgICAgICAgLyogc2FtcGxlIGZvcm1hdCBzcGVjICovCisJCU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hhbm5lbCBtYXAgKi8KKwkJTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWZmZXJpbmcgYXR0cmlidXRlcyAqLworCQlOVUxMICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yIGNvZGUgKi8KKwkpOworCWlmICggY29ubmVjdGlvbiAhPSBOVUxMICkgeworCQlhdmFpbGFibGUgPSAxOworCQlTRExfTkFNRShwYV9zaW1wbGVfZnJlZSkoY29ubmVjdGlvbik7CisJfQorCisJVW5sb2FkUHVsc2VMaWJyYXJ5KCk7CisJcmV0dXJuKGF2YWlsYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbi0+Y2FwdGlvbik7CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCVNETF9mcmVlKGRldmljZSk7CisJVW5sb2FkUHVsc2VMaWJyYXJ5KCk7Cit9CisKK3N0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlMb2FkUHVsc2VMaWJyYXJ5KCk7CisJdGhpcyA9IChTRExfQXVkaW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKKwlpZiAoIHRoaXMgKSB7CisJCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOworCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCisJCQkJU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCB0aGlzICkgeworCQkJU0RMX2ZyZWUodGhpcyk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJdGhpcy0+T3BlbkF1ZGlvID0gUFVMU0VfT3BlbkF1ZGlvOworCXRoaXMtPldhaXRBdWRpbyA9IFBVTFNFX1dhaXRBdWRpbzsKKwl0aGlzLT5QbGF5QXVkaW8gPSBQVUxTRV9QbGF5QXVkaW87CisJdGhpcy0+R2V0QXVkaW9CdWYgPSBQVUxTRV9HZXRBdWRpb0J1ZjsKKwl0aGlzLT5DbG9zZUF1ZGlvID0gUFVMU0VfQ2xvc2VBdWRpbzsKKwl0aGlzLT5XYWl0RG9uZSA9IFBVTFNFX1dhaXREb25lOworCXRoaXMtPlNldENhcHRpb24gPSBQVUxTRV9TZXRDYXB0aW9uOworCisJdGhpcy0+ZnJlZSA9IEF1ZGlvX0RlbGV0ZURldmljZTsKKworCXJldHVybiB0aGlzOworfQorCitBdWRpb0Jvb3RTdHJhcCBQVUxTRV9ib290c3RyYXAgPSB7CisJUFVMU0VfRFJJVkVSX05BTUUsICJQdWxzZUF1ZGlvIiwKKwlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCitzdGF0aWMgdm9pZCBQVUxTRV9XYWl0QXVkaW8oX1RISVMpCit7CisJaW50IHNpemU7CisJd2hpbGUoMSkgeworCQlpZiAoU0RMX05BTUUocGFfY29udGV4dF9nZXRfc3RhdGUpKGNvbnRleHQpICE9IFBBX0NPTlRFWFRfUkVBRFkgfHwKKwkJICAgIFNETF9OQU1FKHBhX3N0cmVhbV9nZXRfc3RhdGUpKHN0cmVhbSkgIT0gUEFfU1RSRUFNX1JFQURZIHx8CisJCSAgICBTRExfTkFNRShwYV9tYWlubG9vcF9pdGVyYXRlKShtYWlubG9vcCwgMSwgTlVMTCkgPCAwKSB7CisJCQl0aGlzLT5lbmFibGVkID0gMDsKKwkJCXJldHVybjsKKwkJfQorCQlzaXplID0gU0RMX05BTUUocGFfc3RyZWFtX3dyaXRhYmxlX3NpemUpKHN0cmVhbSk7CisJCWlmIChzaXplID49IG1peGxlbikKKwkJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFBVTFNFX1BsYXlBdWRpbyhfVEhJUykKK3sKKwkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSAqLworCWlmIChTRExfTkFNRShwYV9zdHJlYW1fd3JpdGUpKHN0cmVhbSwgbWl4YnVmLCBtaXhsZW4sIE5VTEwsIDBMTCwgUEFfU0VFS19SRUxBVElWRSkgPCAwKQorCQl0aGlzLT5lbmFibGVkID0gMDsKK30KKworc3RhdGljIFVpbnQ4ICpQVUxTRV9HZXRBdWRpb0J1ZihfVEhJUykKK3sKKwlyZXR1cm4obWl4YnVmKTsKK30KKworc3RhdGljIHZvaWQgUFVMU0VfQ2xvc2VBdWRpbyhfVEhJUykKK3sKKwlpZiAoIG1peGJ1ZiAhPSBOVUxMICkgeworCQlTRExfRnJlZUF1ZGlvTWVtKG1peGJ1Zik7CisJCW1peGJ1ZiA9IE5VTEw7CisJfQorCWlmICggc3RyZWFtICE9IE5VTEwgKSB7CisJCVNETF9OQU1FKHBhX3N0cmVhbV9kaXNjb25uZWN0KShzdHJlYW0pOworCQlTRExfTkFNRShwYV9zdHJlYW1fdW5yZWYpKHN0cmVhbSk7CisJCXN0cmVhbSA9IE5VTEw7CisJfQorCWlmIChjb250ZXh0ICE9IE5VTEwpIHsKKwkJU0RMX05BTUUocGFfY29udGV4dF9kaXNjb25uZWN0KShjb250ZXh0KTsKKwkJU0RMX05BTUUocGFfY29udGV4dF91bnJlZikoY29udGV4dCk7CisJCWNvbnRleHQgPSBOVUxMOworCX0KKwlpZiAobWFpbmxvb3AgIT0gTlVMTCkgeworCQlTRExfTkFNRShwYV9tYWlubG9vcF9mcmVlKShtYWlubG9vcCk7CisJCW1haW5sb29wID0gTlVMTDsKKwl9Cit9CisKKy8qIFRyeSB0byBnZXQgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gKi8KK3N0YXRpYyBjaGFyICpnZXRfcHJvZ25hbWUodm9pZCkKK3sKKyNpZmRlZiBfX0xJTlVYX18KKwljaGFyICpwcm9nbmFtZSA9IE5VTEw7CisJRklMRSAqZnA7CisJc3RhdGljIGNoYXIgdGVtcFtCVUZTSVpdOworCisJU0RMX3NucHJpbnRmKHRlbXAsIFNETF9hcnJheXNpemUodGVtcCksICIvcHJvYy8lZC9jbWRsaW5lIiwgZ2V0cGlkKCkpOworCWZwID0gZm9wZW4odGVtcCwgInIiKTsKKwlpZiAoIGZwICE9IE5VTEwgKSB7CisJCWlmICggZmdldHModGVtcCwgc2l6ZW9mKHRlbXApLTEsIGZwKSApIHsKKwkJCXByb2duYW1lID0gU0RMX3N0cnJjaHIodGVtcCwgJy8nKTsKKwkJCWlmICggcHJvZ25hbWUgPT0gTlVMTCApIHsKKwkJCQlwcm9nbmFtZSA9IHRlbXA7CisJCQl9IGVsc2UgeworCQkJCXByb2duYW1lID0gcHJvZ25hbWUrMTsKKwkJCX0KKwkJfQorCQlmY2xvc2UoZnApOworCX0KKwlyZXR1cm4ocHJvZ25hbWUpOworI2VsaWYgZGVmaW5lZChfX05ldEJTRF9fKQorCXJldHVybiBnZXRwcm9nbmFtZSgpOworI2Vsc2UKKwlyZXR1cm4oInVua25vd24iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBjYXB0aW9uX3NldF9jb21wbGV0ZShwYV9jb250ZXh0ICpjLCBpbnQgc3VjY2Vzcywgdm9pZCAqdXNlcmRhdGEpCit7CisJLyogbm8tb3AuICovCit9CisKK3N0YXRpYyB2b2lkIFBVTFNFX1NldENhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlTRExfZnJlZSh0aGlzLT5oaWRkZW4tPmNhcHRpb24pOworCWlmICgoc3RyID09IE5VTEwpIHx8ICgqc3RyID09ICdcMCcpKSB7CisJCXN0ciA9IGdldF9wcm9nbmFtZSgpOyAgLyogc2V0IGEgZGVmYXVsdCBzbyBTT01FVEhJTkcgc2hvd3MgdXAuICovCisJfQorCXRoaXMtPmhpZGRlbi0+Y2FwdGlvbiA9IFNETF9zdHJkdXAoc3RyKTsKKwlpZiAoY29udGV4dCAhPSBOVUxMKSB7CisJCVNETF9OQU1FKHBhX2NvbnRleHRfc2V0X25hbWUpKGNvbnRleHQsIHRoaXMtPmhpZGRlbi0+Y2FwdGlvbiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbl9zZXRfY29tcGxldGUsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgc3RyZWFtX2RyYWluX2NvbXBsZXRlKHBhX3N0cmVhbSAqcywgaW50IHN1Y2Nlc3MsIHZvaWQgKnVzZXJkYXRhKQoreworCS8qIG5vLW9wLiAqLworfQorCitzdGF0aWMgdm9pZCBQVUxTRV9XYWl0RG9uZShfVEhJUykKK3sKKwlwYV9vcGVyYXRpb24gKm87CisKKwlvID0gU0RMX05BTUUocGFfc3RyZWFtX2RyYWluKShzdHJlYW0sIHN0cmVhbV9kcmFpbl9jb21wbGV0ZSwgTlVMTCk7CisJaWYgKCFvKQorCQlyZXR1cm47CisKKwl3aGlsZSAoU0RMX05BTUUocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSkobykgIT0gUEFfT1BFUkFUSU9OX0RPTkUpIHsKKwkJaWYgKFNETF9OQU1FKHBhX2NvbnRleHRfZ2V0X3N0YXRlKShjb250ZXh0KSAhPSBQQV9DT05URVhUX1JFQURZIHx8CisJCSAgICBTRExfTkFNRShwYV9zdHJlYW1fZ2V0X3N0YXRlKShzdHJlYW0pICE9IFBBX1NUUkVBTV9SRUFEWSB8fAorCQkgICAgU0RMX05BTUUocGFfbWFpbmxvb3BfaXRlcmF0ZSkobWFpbmxvb3AsIDEsIE5VTEwpIDwgMCkgeworCQkJU0RMX05BTUUocGFfb3BlcmF0aW9uX2NhbmNlbCkobyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlTRExfTkFNRShwYV9vcGVyYXRpb25fdW5yZWYpKG8pOworfQorCitzdGF0aWMgaW50IFBVTFNFX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwlpbnQgICAgICAgICAgICAgc3RhdGU7CisJVWludDE2ICAgICAgICAgIHRlc3RfZm9ybWF0OworCXBhX3NhbXBsZV9zcGVjICBwYXNwZWM7CisJcGFfYnVmZmVyX2F0dHIgIHBhYXR0cjsKKwlwYV9jaGFubmVsX21hcCAgcGFjbWFwOworCXBhX3N0cmVhbV9mbGFnc190IGZsYWdzID0gMDsKKworCXBhc3BlYy5mb3JtYXQgPSBQQV9TQU1QTEVfSU5WQUxJRDsKKwlmb3IgKCB0ZXN0X2Zvcm1hdCA9IFNETF9GaXJzdEF1ZGlvRm9ybWF0KHNwZWMtPmZvcm1hdCk7IHRlc3RfZm9ybWF0OyApIHsKKwkJc3dpdGNoICggdGVzdF9mb3JtYXQgKSB7CisJCQljYXNlIEFVRElPX1U4OgorCQkJCXBhc3BlYy5mb3JtYXQgPSBQQV9TQU1QTEVfVTg7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX1MxNkxTQjoKKwkJCQlwYXNwZWMuZm9ybWF0ID0gUEFfU0FNUExFX1MxNkxFOworCQkJCWJyZWFrOworCQkJY2FzZSBBVURJT19TMTZNU0I6CisJCQkJcGFzcGVjLmZvcm1hdCA9IFBBX1NBTVBMRV9TMTZCRTsKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIHBhc3BlYy5mb3JtYXQgIT0gUEFfU0FNUExFX0lOVkFMSUQgKQorCQkJYnJlYWs7CisJCXRlc3RfZm9ybWF0ID0gU0RMX05leHRBdWRpb0Zvcm1hdCgpOworCX0KKwlpZiAocGFzcGVjLmZvcm1hdCA9PSBQQV9TQU1QTEVfSU5WQUxJRCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBmaW5kIGFueSBzdWl0YWJsZSBhdWRpbyBmb3JtYXRzIik7CisJCXJldHVybigtMSk7CisJfQorCXNwZWMtPmZvcm1hdCA9IHRlc3RfZm9ybWF0OworCisJcGFzcGVjLmNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7CisJcGFzcGVjLnJhdGUgPSBzcGVjLT5mcmVxOworCisJLyogQ2FsY3VsYXRlIHRoZSBmaW5hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGF1ZGlvIHNwZWNpZmljYXRpb24gKi8KKyNpZmRlZiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kKKwlzcGVjLT5zYW1wbGVzIC89IDI7IC8qIE1peCBpbiBzbWFsbGVyIGNodW5jayB0byBhdm9pZCB1bmRlcnJ1bnMgKi8KKyNlbmRpZgorCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisKKwkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCisJbWl4bGVuID0gc3BlYy0+c2l6ZTsKKwltaXhidWYgPSAoVWludDggKilTRExfQWxsb2NBdWRpb01lbShtaXhsZW4pOworCWlmICggbWl4YnVmID09IE5VTEwgKSB7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tZW1zZXQobWl4YnVmLCBzcGVjLT5zaWxlbmNlLCBzcGVjLT5zaXplKTsKKworCS8qIFJlZHVjZWQgcHJlYnVmZmVyaW5nIGNvbXBhcmVkIHRvIHRoZSBkZWZhdWx0cy4gKi8KKyNpZmRlZiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kKKwlwYWF0dHIudGxlbmd0aCA9IG1peGxlbiAqIDQ7IC8qIDJ4IG9yaWdpbmFsIHJlcXVlc3RlZCBidWZzaXplICovCisJcGFhdHRyLnByZWJ1ZiA9IC0xOworCXBhYXR0ci5tYXhsZW5ndGggPSAtMTsKKwlwYWF0dHIubWlucmVxID0gbWl4bGVuOyAvKiAtMSBjYW4gbGVhZCB0byBwYV9zdHJlYW1fd3JpdGFibGVfc2l6ZSgpCisJCQkJICAgPj0gbWl4bGVuIG5ldmVyIGJlY29taW5nIHRydWUgKi8KKwlmbGFncyA9IFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWTsKKyNlbHNlCisJcGFhdHRyLnRsZW5ndGggPSBtaXhsZW4qMjsKKwlwYWF0dHIucHJlYnVmID0gbWl4bGVuKjI7CisJcGFhdHRyLm1heGxlbmd0aCA9IG1peGxlbioyOworCXBhYXR0ci5taW5yZXEgPSBtaXhsZW47CisjZW5kaWYKKworCS8qIFRoZSBTREwgQUxTQSBvdXRwdXQgaGludHMgdXMgdGhhdCB3ZSB1c2UgV2luZG93cycgY2hhbm5lbCBtYXBwaW5nICovCisJLyogaHR0cDovL2J1Z3ppbGxhLmxpYnNkbC5vcmcvc2hvd19idWcuY2dpP2lkPTExMCAqLworCVNETF9OQU1FKHBhX2NoYW5uZWxfbWFwX2luaXRfYXV0bykoCisJCSZwYWNtYXAsIHNwZWMtPmNoYW5uZWxzLCBQQV9DSEFOTkVMX01BUF9XQVZFRVgpOworCisJLyogU2V0IHVwIGEgbmV3IG1haW4gbG9vcCAqLworCWlmICghKG1haW5sb29wID0gU0RMX05BTUUocGFfbWFpbmxvb3BfbmV3KSgpKSkgeworCQlQVUxTRV9DbG9zZUF1ZGlvKHRoaXMpOworCQlTRExfU2V0RXJyb3IoInBhX21haW5sb29wX25ldygpIGZhaWxlZCIpOworCQlyZXR1cm4oLTEpOworCX0KKworCWlmICh0aGlzLT5oaWRkZW4tPmNhcHRpb24gPT0gTlVMTCkgeworCQljaGFyICp0aXRsZSA9IE5VTEw7CisJCVNETF9XTV9HZXRDYXB0aW9uKCZ0aXRsZSwgTlVMTCk7CisJCVBVTFNFX1NldENhcHRpb24odGhpcywgdGl0bGUpOworCX0KKworCW1haW5sb29wX2FwaSA9IFNETF9OQU1FKHBhX21haW5sb29wX2dldF9hcGkpKG1haW5sb29wKTsKKwlpZiAoIShjb250ZXh0ID0gU0RMX05BTUUocGFfY29udGV4dF9uZXcpKG1haW5sb29wX2FwaSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+Y2FwdGlvbikpKSB7CisJCVBVTFNFX0Nsb3NlQXVkaW8odGhpcyk7CisJCVNETF9TZXRFcnJvcigicGFfY29udGV4dF9uZXcoKSBmYWlsZWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBDb25uZWN0IHRvIHRoZSBQdWxzZUF1ZGlvIHNlcnZlciAqLworCWlmIChTRExfTkFNRShwYV9jb250ZXh0X2Nvbm5lY3QpKGNvbnRleHQsIE5VTEwsIDAsIE5VTEwpIDwgMCkgeworCQlQVUxTRV9DbG9zZUF1ZGlvKHRoaXMpOworCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCBzZXR1cCBjb25uZWN0aW9uIHRvIFB1bHNlQXVkaW8iKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwlkbyB7CisJCWlmIChTRExfTkFNRShwYV9tYWlubG9vcF9pdGVyYXRlKShtYWlubG9vcCwgMSwgTlVMTCkgPCAwKSB7CisJCQlQVUxTRV9DbG9zZUF1ZGlvKHRoaXMpOworCQkJU0RMX1NldEVycm9yKCJwYV9tYWlubG9vcF9pdGVyYXRlKCkgZmFpbGVkIik7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCXN0YXRlID0gU0RMX05BTUUocGFfY29udGV4dF9nZXRfc3RhdGUpKGNvbnRleHQpOworCQlpZiAoIVBBX0NPTlRFWFRfSVNfR09PRChzdGF0ZSkpIHsKKwkJCVBVTFNFX0Nsb3NlQXVkaW8odGhpcyk7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCBjb25uZWN0IHRvIFB1bHNlQXVkaW8iKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9IHdoaWxlIChzdGF0ZSAhPSBQQV9DT05URVhUX1JFQURZKTsKKworCXN0cmVhbSA9IFNETF9OQU1FKHBhX3N0cmVhbV9uZXcpKAorCQljb250ZXh0LAorCQkiU2ltcGxlIERpcmVjdE1lZGlhIExheWVyIiwgIC8qIHN0cmVhbSBkZXNjcmlwdGlvbiAqLworCQkmcGFzcGVjLCAgICAgICAgICAgICAgICAgICAgIC8qIHNhbXBsZSBmb3JtYXQgc3BlYyAqLworCQkmcGFjbWFwICAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgbWFwICovCisJKTsKKwlpZiAoIHN0cmVhbSA9PSBOVUxMICkgeworCQlQVUxTRV9DbG9zZUF1ZGlvKHRoaXMpOworCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCBzZXR1cCBQdWxzZUF1ZGlvIHN0cmVhbSIpOworCQlyZXR1cm4oLTEpOworCX0KKworCWlmIChTRExfTkFNRShwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaykoc3RyZWFtLCBOVUxMLCAmcGFhdHRyLCBmbGFncywKKwkJCU5VTEwsIE5VTEwpIDwgMCkgeworCQlQVUxTRV9DbG9zZUF1ZGlvKHRoaXMpOworCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCBjb25uZWN0IFB1bHNlQXVkaW8gc3RyZWFtIik7CisJCXJldHVybigtMSk7CisJfQorCisJZG8geworCQlpZiAoU0RMX05BTUUocGFfbWFpbmxvb3BfaXRlcmF0ZSkobWFpbmxvb3AsIDEsIE5VTEwpIDwgMCkgeworCQkJUFVMU0VfQ2xvc2VBdWRpbyh0aGlzKTsKKwkJCVNETF9TZXRFcnJvcigicGFfbWFpbmxvb3BfaXRlcmF0ZSgpIGZhaWxlZCIpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlzdGF0ZSA9IFNETF9OQU1FKHBhX3N0cmVhbV9nZXRfc3RhdGUpKHN0cmVhbSk7CisJCWlmICghUEFfU1RSRUFNX0lTX0dPT0Qoc3RhdGUpKSB7CisJCQlQVUxTRV9DbG9zZUF1ZGlvKHRoaXMpOworCQkJU0RMX1NldEVycm9yKCJDb3VsZCBub3QgY3JlYXRlIHRvIFB1bHNlQXVkaW8gc3RyZWFtIik7CisJCQlyZXR1cm4oLTEpOworCQl9CisJfSB3aGlsZSAoc3RhdGUgIT0gUEFfU1RSRUFNX1JFQURZKTsKKworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vcHVsc2UvU0RMX3B1bHNlYXVkaW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vcHVsc2UvU0RMX3B1bHNlYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2VlNzUxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9wdWxzZS9TRExfcHVsc2VhdWRpby5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTdMOpcGhhbiBLb2NoZW4KKyAgICBzdGVwaGFuQGtvY2hlbi5ubAorICAgIAorICAgIEJhc2VkIG9uIHBhcnRzIG9mIHRoZSBBTFNBIGFuZCBFU291bkQgb3V0cHV0IGRyaXZlcnMuCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX3B1bHNlYXVkaW9faAorI2RlZmluZSBfU0RMX3B1bHNlYXVkaW9faAorCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwlwYV9tYWlubG9vcCAqbWFpbmxvb3A7CisJcGFfbWFpbmxvb3BfYXBpICptYWlubG9vcF9hcGk7CisJcGFfY29udGV4dCAqY29udGV4dDsKKwlwYV9zdHJlYW0gKnN0cmVhbTsKKworCWNoYXIgKmNhcHRpb247CisKKwkvKiBSYXcgbWl4aW5nIGJ1ZmZlciAqLworCVVpbnQ4ICptaXhidWY7CisJaW50ICAgIG1peGxlbjsKK307CisKKyNpZiAoUEFfQVBJX1ZFUlNJT04gPCAxMikKKy8qKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHBhc3NlZCBzdGF0ZSBpcyBvbmUgb2YgdGhlIGNvbm5lY3RlZCBzdGF0ZXMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFBBX0NPTlRFWFRfSVNfR09PRChwYV9jb250ZXh0X3N0YXRlX3QgeCkgeworICAgIHJldHVybgorICAgICAgICB4ID09IFBBX0NPTlRFWFRfQ09OTkVDVElORyB8fAorICAgICAgICB4ID09IFBBX0NPTlRFWFRfQVVUSE9SSVpJTkcgfHwKKyAgICAgICAgeCA9PSBQQV9DT05URVhUX1NFVFRJTkdfTkFNRSB8fAorICAgICAgICB4ID09IFBBX0NPTlRFWFRfUkVBRFk7Cit9CisvKiogUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBwYXNzZWQgc3RhdGUgaXMgb25lIG9mIHRoZSBjb25uZWN0ZWQgc3RhdGVzICovCitzdGF0aWMgaW5saW5lIGludCBQQV9TVFJFQU1fSVNfR09PRChwYV9zdHJlYW1fc3RhdGVfdCB4KSB7CisgICAgcmV0dXJuCisgICAgICAgIHggPT0gUEFfU1RSRUFNX0NSRUFUSU5HIHx8CisgICAgICAgIHggPT0gUEFfU1RSRUFNX1JFQURZOworfQorI2VuZGlmCS8qIHB1bHNlYXVkaW8gPD0gMC45LjEwICovCisKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBtYWlubG9vcAkJKHRoaXMtPmhpZGRlbi0+bWFpbmxvb3ApCisjZGVmaW5lIG1haW5sb29wX2FwaQkJKHRoaXMtPmhpZGRlbi0+bWFpbmxvb3BfYXBpKQorI2RlZmluZSBjb250ZXh0CQkJKHRoaXMtPmhpZGRlbi0+Y29udGV4dCkKKyNkZWZpbmUgc3RyZWFtCQkJKHRoaXMtPmhpZGRlbi0+c3RyZWFtKQorI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCisjZGVmaW5lIG1peGxlbgkJCSh0aGlzLT5oaWRkZW4tPm1peGxlbikKKworI2VuZGlmIC8qIF9TRExfcHVsc2VhdWRpb19oICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vc3VuL1NETF9zdW5hdWRpby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9zdW4vU0RMX3N1bmF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzOWU3MQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vc3VuL1NETF9zdW5hdWRpby5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQWxsb3cgYWNjZXNzIHRvIGEgcmF3IG1peGluZyBidWZmZXIgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBfX05FVEJTRF9fCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL2F1ZGlvaW8uaD4KKyNlbmRpZgorI2lmZGVmIF9fU1ZSNAorI2luY2x1ZGUgPHN5cy9hdWRpb2lvLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb21lbS5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiLi4vU0RMX2F1ZGlvZGV2X2MuaCIKKyNpbmNsdWRlICJTRExfc3VuYXVkaW8uaCIKKworLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjaywgYW5kIGRvbid0IGJsb2NrIGlmIGJ1c3kgKi8KKyNkZWZpbmUgT1BFTl9GTEFHUwkoT19XUk9OTFl8T19OT05CTE9DSykKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBEU1BfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIERTUF9XYWl0QXVkaW8oX1RISVMpOworc3RhdGljIHZvaWQgRFNQX1BsYXlBdWRpbyhfVEhJUyk7CitzdGF0aWMgVWludDggKkRTUF9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBEU1BfQ2xvc2VBdWRpbyhfVEhJUyk7CisKK3N0YXRpYyBVaW50OCBzbmQyYXUoaW50IHNhbXBsZSk7CisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisJaW50IGZkOworCWludCBhdmFpbGFibGU7CisKKwlhdmFpbGFibGUgPSAwOworCWZkID0gU0RMX09wZW5BdWRpb1BhdGgoTlVMTCwgMCwgT1BFTl9GTEFHUywgMSk7CisJaWYgKCBmZCA+PSAwICkgeworCQlhdmFpbGFibGUgPSAxOworCQljbG9zZShmZCk7CisJfQorCXJldHVybihhdmFpbGFibGUpOworfQorCitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCVNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfQXVkaW9EZXZpY2UgKkF1ZGlvX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX0F1ZGlvRGV2aWNlICp0aGlzOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwl0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworCWlmICggdGhpcyApIHsKKwkJU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisJCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKikKKwkJCQlTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCX0KKwlpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIHRoaXMgKSB7CisJCQlTRExfZnJlZSh0aGlzKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKwlhdWRpb19mZCA9IC0xOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IERTUF9PcGVuQXVkaW87CisJdGhpcy0+V2FpdEF1ZGlvID0gRFNQX1dhaXRBdWRpbzsKKwl0aGlzLT5QbGF5QXVkaW8gPSBEU1BfUGxheUF1ZGlvOworCXRoaXMtPkdldEF1ZGlvQnVmID0gRFNQX0dldEF1ZGlvQnVmOworCXRoaXMtPkNsb3NlQXVkaW8gPSBEU1BfQ2xvc2VBdWRpbzsKKworCXRoaXMtPmZyZWUgPSBBdWRpb19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgU1VOQVVESU9fYm9vdHN0cmFwID0geworCSJhdWRpbyIsICJVTklYIC9kZXYvYXVkaW8gaW50ZXJmYWNlIiwKKwlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworI2lmZGVmIERFQlVHX0FVRElPCit2b2lkIENoZWNrVW5kZXJmbG93KF9USElTKQoreworI2lmZGVmIEFVRElPX0dFVElORk8KKwlhdWRpb19pbmZvX3QgaW5mbzsKKwlpbnQgbGVmdDsKKworCWlvY3RsKGF1ZGlvX2ZkLCBBVURJT19HRVRJTkZPLCAmaW5mbyk7CisJbGVmdCA9ICh3cml0dGVuIC0gaW5mby5wbGF5LnNhbXBsZXMpOworCWlmICggd3JpdHRlbiAmJiAobGVmdCA9PSAwKSApIHsKKwkJZnByaW50ZihzdGRlcnIsICJhdWRpbyB1bmRlcmZsb3chXG4iKTsKKwl9CisjZW5kaWYKK30KKyNlbmRpZgorCit2b2lkIERTUF9XYWl0QXVkaW8oX1RISVMpCit7CisjaWZkZWYgQVVESU9fR0VUSU5GTworI2RlZmluZSBTTEVFUF9GVURHRQkxMAkJLyogMTAgbXMgc2NoZWR1bGluZyBmdWRnZSBmYWN0b3IgKi8KKwlhdWRpb19pbmZvX3QgaW5mbzsKKwlTaW50MzIgbGVmdDsKKworCWlvY3RsKGF1ZGlvX2ZkLCBBVURJT19HRVRJTkZPLCAmaW5mbyk7CisJbGVmdCA9ICh3cml0dGVuIC0gaW5mby5wbGF5LnNhbXBsZXMpOworCWlmICggbGVmdCA+IGZyYWdzaXplICkgeworCQlTaW50MzIgc2xlZXB5OworCisJCXNsZWVweSA9ICgobGVmdCAtIGZyYWdzaXplKS9mcmVxdWVuY3kpOworCQlzbGVlcHkgLT0gU0xFRVBfRlVER0U7CisJCWlmICggc2xlZXB5ID4gMCApIHsKKwkJCVNETF9EZWxheShzbGVlcHkpOworCQl9CisJfQorI2Vsc2UKKwlmZF9zZXQgZmRzZXQ7CisKKwlGRF9aRVJPKCZmZHNldCk7CisJRkRfU0VUKGF1ZGlvX2ZkLCAmZmRzZXQpOworCXNlbGVjdChhdWRpb19mZCsxLCBOVUxMLCAmZmRzZXQsIE5VTEwsIE5VTEwpOworI2VuZGlmCit9CisKK3ZvaWQgRFNQX1BsYXlBdWRpbyhfVEhJUykKK3sKKwkvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSAqLworCWlmICggdWxhd19vbmx5ICkgeworCQkvKiBBc3N1bWluZyB0aGF0IHRoaXMtPnNwZWMuZnJlcSA+PSA4MDAwIEh6ICovCisJCWludCBhY2N1bSwgaW5jciwgcG9zOworCQlVaW50OCAqYXVidWY7CisKKwkJYWNjdW0gPSAwOworCQlpbmNyICA9IHRoaXMtPnNwZWMuZnJlcS84OworCQlhdWJ1ZiA9IHVsYXdfYnVmOworCQlzd2l0Y2ggKGF1ZGlvX2ZtdCAmIDB4RkYpIHsKKwkJCWNhc2UgODogeworCQkJCVVpbnQ4ICpzbmRidWY7CisKKwkJCQlzbmRidWYgPSBtaXhidWY7CisJCQkJZm9yICggcG9zPTA7IHBvcyA8IGZyYWdzaXplOyArK3BvcyApIHsKKwkJCQkJKmF1YnVmID0gc25kMmF1KCgweDgwLSpzbmRidWYpKjY0KTsKKwkJCQkJYWNjdW0gKz0gaW5jcjsKKwkJCQkJd2hpbGUgKCBhY2N1bSA+IDAgKSB7CisJCQkJCQlhY2N1bSAtPSAxMDAwOworCQkJCQkJc25kYnVmICs9IDE7CisJCQkJCX0KKwkJCQkJYXVidWYgKz0gMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgMTY6IHsKKwkJCQlTaW50MTYgKnNuZGJ1ZjsKKworCQkJCXNuZGJ1ZiA9IChTaW50MTYgKiltaXhidWY7CisJCQkJZm9yICggcG9zPTA7IHBvcyA8IGZyYWdzaXplOyArK3BvcyApIHsKKwkJCQkJKmF1YnVmID0gc25kMmF1KCpzbmRidWYvNCk7CisJCQkJCWFjY3VtICs9IGluY3I7CisJCQkJCXdoaWxlICggYWNjdW0gPiAwICkgeworCQkJCQkJYWNjdW0gLT0gMTAwMDsKKwkJCQkJCXNuZGJ1ZiArPSAxOworCQkJCQl9CisJCQkJCWF1YnVmICs9IDE7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBERUJVR19BVURJTworCQlDaGVja1VuZGVyZmxvdyh0aGlzKTsKKyNlbmRpZgorCQlpZiAoIHdyaXRlKGF1ZGlvX2ZkLCB1bGF3X2J1ZiwgZnJhZ3NpemUpIDwgMCApIHsKKwkJCS8qIEFzc3VtZSBmYXRhbCBlcnJvciwgZm9yIG5vdyAqLworCQkJdGhpcy0+ZW5hYmxlZCA9IDA7CisJCX0KKwkJd3JpdHRlbiArPSBmcmFnc2l6ZTsKKwl9IGVsc2UgeworI2lmZGVmIERFQlVHX0FVRElPCisJCUNoZWNrVW5kZXJmbG93KHRoaXMpOworI2VuZGlmCisJCWlmICggd3JpdGUoYXVkaW9fZmQsIG1peGJ1ZiwgdGhpcy0+c3BlYy5zaXplKSA8IDAgKSB7CisJCQkvKiBBc3N1bWUgZmF0YWwgZXJyb3IsIGZvciBub3cgKi8KKwkJCXRoaXMtPmVuYWJsZWQgPSAwOworCQl9CisJCXdyaXR0ZW4gKz0gZnJhZ3NpemU7CisJfQorfQorCitVaW50OCAqRFNQX0dldEF1ZGlvQnVmKF9USElTKQoreworCXJldHVybihtaXhidWYpOworfQorCit2b2lkIERTUF9DbG9zZUF1ZGlvKF9USElTKQoreworCWlmICggbWl4YnVmICE9IE5VTEwgKSB7CisJCVNETF9GcmVlQXVkaW9NZW0obWl4YnVmKTsKKwkJbWl4YnVmID0gTlVMTDsKKwl9CisJaWYgKCB1bGF3X2J1ZiAhPSBOVUxMICkgeworCQlTRExfZnJlZSh1bGF3X2J1Zik7CisJCXVsYXdfYnVmID0gTlVMTDsKKwl9CisJY2xvc2UoYXVkaW9fZmQpOworfQorCitpbnQgRFNQX09wZW5BdWRpbyhfVEhJUywgU0RMX0F1ZGlvU3BlYyAqc3BlYykKK3sKKwljaGFyIGF1ZGlvZGV2WzEwMjRdOworI2lmZGVmIEFVRElPX1NFVElORk8KKwlpbnQgZW5jOworI2VuZGlmCisJaW50IGRlc2lyZWRfZnJlcSA9IHNwZWMtPmZyZXE7CisKKwkvKiBJbml0aWFsaXplIG91ciBmcmVlYWJsZSB2YXJpYWJsZXMsIGluIGNhc2Ugd2UgZmFpbCovCisJYXVkaW9fZmQgPSAtMTsKKwltaXhidWYgPSBOVUxMOworCXVsYXdfYnVmID0gTlVMTDsKKworCS8qIERldGVybWluZSB0aGUgYXVkaW8gcGFyYW1ldGVycyBmcm9tIHRoZSBBdWRpb1NwZWMgKi8KKwlzd2l0Y2ggKCBzcGVjLT5mb3JtYXQgJiAweEZGICkgeworCisJCWNhc2UgODogeyAvKiBVbnNpZ25lZCA4IGJpdCBhdWRpbyBkYXRhICovCisJCQlzcGVjLT5mb3JtYXQgPSBBVURJT19VODsKKyNpZmRlZiBBVURJT19TRVRJTkZPCisJCQllbmMgPSBBVURJT19FTkNPRElOR19MSU5FQVI4OworI2VuZGlmCisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSAxNjogeyAvKiBTaWduZWQgMTYgYml0IGF1ZGlvIGRhdGEgKi8KKwkJICAgICAgICBzcGVjLT5mb3JtYXQgPSBBVURJT19TMTZTWVM7CisjaWZkZWYgQVVESU9fU0VUSU5GTworCQkJZW5jID0gQVVESU9fRU5DT0RJTkdfTElORUFSOworI2VuZGlmCisJCX0KKwkJYnJlYWs7CisKKwkJZGVmYXVsdDogeworCQkJU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisJYXVkaW9fZm10ID0gc3BlYy0+Zm9ybWF0OworCisJLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlICovCisJYXVkaW9fZmQgPSBTRExfT3BlbkF1ZGlvUGF0aChhdWRpb2Rldiwgc2l6ZW9mKGF1ZGlvZGV2KSwgT1BFTl9GTEFHUywgMSk7CisJaWYgKCBhdWRpb19mZCA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiAlczogJXMiLCBhdWRpb2RldiwKKwkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwl1bGF3X29ubHkgPSAwOwkJLyogbW9kZXJuIFN1bnMgZG8gc3VwcG9ydCBsaW5lYXIgYXVkaW8gKi8KKyNpZmRlZiBBVURJT19TRVRJTkZPCisJZm9yKDs7KSB7CisJICAgIGF1ZGlvX2luZm9fdCBpbmZvOworCSAgICBBVURJT19JTklUSU5GTygmaW5mbyk7IC8qIGluaXQgYWxsIGZpZWxkcyB0byAibm8gY2hhbmdlIiAqLworCisJICAgIC8qIFRyeSB0byBzZXQgdGhlIHJlcXVlc3RlZCBzZXR0aW5ncyAqLworCSAgICBpbmZvLnBsYXkuc2FtcGxlX3JhdGUgPSBzcGVjLT5mcmVxOworCSAgICBpbmZvLnBsYXkuY2hhbm5lbHMgPSBzcGVjLT5jaGFubmVsczsKKwkgICAgaW5mby5wbGF5LnByZWNpc2lvbiA9IChlbmMgPT0gQVVESU9fRU5DT0RJTkdfVUxBVykKKwkJICAgICAgICAgICAgICAgICAgPyA4IDogc3BlYy0+Zm9ybWF0ICYgMHhmZjsKKwkgICAgaW5mby5wbGF5LmVuY29kaW5nID0gZW5jOworCSAgICBpZiggaW9jdGwoYXVkaW9fZmQsIEFVRElPX1NFVElORk8sICZpbmZvKSA9PSAwICkgeworCisJCS8qIENoZWNrIHRvIGJlIHN1cmUgd2UgZ290IHdoYXQgd2Ugd2FudGVkICovCisJCWlmKGlvY3RsKGF1ZGlvX2ZkLCBBVURJT19HRVRJTkZPLCAmaW5mbykgPCAwKSB7CisJCSAgICBTRExfU2V0RXJyb3IoIkVycm9yIGdldHRpbmcgYXVkaW8gcGFyYW1ldGVyczogJXMiLAorCQkJCSBzdHJlcnJvcihlcnJubykpOworCQkgICAgcmV0dXJuIC0xOworCQl9CisJCWlmKGluZm8ucGxheS5lbmNvZGluZyA9PSBlbmMKKwkJICAgJiYgaW5mby5wbGF5LnByZWNpc2lvbiA9PSAoc3BlYy0+Zm9ybWF0ICYgMHhmZikKKwkJICAgJiYgaW5mby5wbGF5LmNoYW5uZWxzID09IHNwZWMtPmNoYW5uZWxzKSB7CisJCSAgICAvKiBZb3chIEFsbCBzZWVtcyB0byBiZSB3ZWxsISAqLworCQkgICAgc3BlYy0+ZnJlcSA9IGluZm8ucGxheS5zYW1wbGVfcmF0ZTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgICBzd2l0Y2goZW5jKSB7CisJICAgIGNhc2UgQVVESU9fRU5DT0RJTkdfTElORUFSODoKKwkJLyogdW5zaWduZWQgOGJpdCBhcHBhcmVudGx5IG5vdCBzdXBwb3J0ZWQgaGVyZSAqLworCQllbmMgPSBBVURJT19FTkNPRElOR19MSU5FQVI7CisJCXNwZWMtPmZvcm1hdCA9IEFVRElPX1MxNlNZUzsKKwkJYnJlYWs7CS8qIHRyeSBhZ2FpbiAqLworCisJICAgIGNhc2UgQVVESU9fRU5DT0RJTkdfTElORUFSOgorCQkvKiBsaW5lYXIgMTZiaXQgZGlkbid0IHdvcmsgZWl0aGVyLCByZXNvcnQgdG8gtS1sYXcgKi8KKwkJZW5jID0gQVVESU9fRU5DT0RJTkdfVUxBVzsKKwkJc3BlYy0+Y2hhbm5lbHMgPSAxOworCQlzcGVjLT5mcmVxID0gODAwMDsKKwkJc3BlYy0+Zm9ybWF0ID0gQVVESU9fVTg7CisJCXVsYXdfb25seSA9IDE7CisJCWJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJCS8qIG9oIHdlbGwuLi4gKi8KKwkJU0RMX1NldEVycm9yKCJFcnJvciBzZXR0aW5nIGF1ZGlvIHBhcmFtZXRlcnM6ICVzIiwKKwkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJfQorI2VuZGlmIC8qIEFVRElPX1NFVElORk8gKi8KKwl3cml0dGVuID0gMDsKKworCS8qIFdlIGNhbiBhY3R1YWxseSBjb252ZXJ0IG9uLXRoZS1mbHkgdG8gVS1MYXcgKi8KKwlpZiAoIHVsYXdfb25seSApIHsKKwkgICAgICAgIHNwZWMtPmZyZXEgPSBkZXNpcmVkX2ZyZXE7CisJCWZyYWdzaXplID0gKHNwZWMtPnNhbXBsZXMqMTAwMCkvKHNwZWMtPmZyZXEvOCk7CisJCWZyZXF1ZW5jeSA9IDg7CisJCXVsYXdfYnVmID0gKFVpbnQ4ICopU0RMX21hbGxvYyhmcmFnc2l6ZSk7CisJCWlmICggdWxhd19idWYgPT0gTlVMTCApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlzcGVjLT5jaGFubmVscyA9IDE7CisJfSBlbHNlIHsKKwkJZnJhZ3NpemUgPSBzcGVjLT5zYW1wbGVzOworCQlmcmVxdWVuY3kgPSBzcGVjLT5mcmVxLzEwMDA7CisJfQorI2lmZGVmIERFQlVHX0FVRElPCisJZnByaW50ZihzdGRlcnIsICJBdWRpbyBkZXZpY2UgJXMgVS1MYXcgb25seVxuIiwgCisJCQkJdWxhd19vbmx5ID8gImlzIiA6ICJpcyBub3QiKTsKKwlmcHJpbnRmKHN0ZGVyciwgImZvcm1hdD0weCV4IGNoYW49JWQgZnJlcT0lZFxuIiwKKwkJc3BlYy0+Zm9ybWF0LCBzcGVjLT5jaGFubmVscywgc3BlYy0+ZnJlcSk7CisjZW5kaWYKKworCS8qIFVwZGF0ZSB0aGUgZnJhZ21lbnQgc2l6ZSBhcyBzaXplIGluIGJ5dGVzICovCisJU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYyhzcGVjKTsKKworCS8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KKwltaXhidWYgPSAoVWludDggKilTRExfQWxsb2NBdWRpb01lbShzcGVjLT5zaXplKTsKKwlpZiAoIG1peGJ1ZiA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJU0RMX21lbXNldChtaXhidWYsIHNwZWMtPnNpbGVuY2UsIHNwZWMtPnNpemUpOworCisJLyogV2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyBmdW5jdGlvbiAoc25kMmF1KCkpIGNvcHlyaWdodGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIENvcHlyaWdodCAxOTg5IGJ5IFJpY2ggR29wc3RlaW4gYW5kIEhhcnJpcyBDb3Jwb3JhdGlvbiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSAgICovCisvKiAgICAgIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzICAgICAgICAqLworLyogICAgICBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSAgICAgICAgKi8KKy8qICAgICAgYXBwZWFycyBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCAgICovCisvKiAgICAgIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kICAqLworLyogICAgICB0aGF0IHRoZSBuYW1lIG9mIFJpY2ggR29wc3RlaW4gYW5kIEhhcnJpcyBDb3Jwb3JhdGlvbiBub3QgYmUgICAgKi8KKy8qICAgICAgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gICAgICovCisvKiAgICAgIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAgICAqLworLyogICAgICBSaWNoIEdvcHN0ZWluIGFuZCBIYXJyaXMgQ29ycG9yYXRpb24gbWFrZSBubyByZXByZXNlbnRhdGlvbnMgICAgKi8KKy8qICAgICAgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgICAgICovCisvKiAgICAgIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFVpbnQ4IHNuZDJhdShpbnQgc2FtcGxlKQoreworCisJaW50IG1hc2s7CisKKwlpZiAoc2FtcGxlIDwgMCkgeworCQlzYW1wbGUgPSAtc2FtcGxlOworCQltYXNrID0gMHg3ZjsKKwl9IGVsc2UgeworCQltYXNrID0gMHhmZjsKKwl9CisKKwlpZiAoc2FtcGxlIDwgMzIpIHsKKwkJc2FtcGxlID0gMHhGMCB8ICgxNSAtIHNhbXBsZSAvIDIpOworCX0gZWxzZSBpZiAoc2FtcGxlIDwgOTYpIHsKKwkJc2FtcGxlID0gMHhFMCB8ICgxNSAtIChzYW1wbGUgLSAzMikgLyA0KTsKKwl9IGVsc2UgaWYgKHNhbXBsZSA8IDIyNCkgeworCQlzYW1wbGUgPSAweEQwIHwgKDE1IC0gKHNhbXBsZSAtIDk2KSAvIDgpOworCX0gZWxzZSBpZiAoc2FtcGxlIDwgNDgwKSB7CisJCXNhbXBsZSA9IDB4QzAgfCAoMTUgLSAoc2FtcGxlIC0gMjI0KSAvIDE2KTsKKwl9IGVsc2UgaWYgKHNhbXBsZSA8IDk5MikgeworCQlzYW1wbGUgPSAweEIwIHwgKDE1IC0gKHNhbXBsZSAtIDQ4MCkgLyAzMik7CisJfSBlbHNlIGlmIChzYW1wbGUgPCAyMDE2KSB7CisJCXNhbXBsZSA9IDB4QTAgfCAoMTUgLSAoc2FtcGxlIC0gOTkyKSAvIDY0KTsKKwl9IGVsc2UgaWYgKHNhbXBsZSA8IDQwNjQpIHsKKwkJc2FtcGxlID0gMHg5MCB8ICgxNSAtIChzYW1wbGUgLSAyMDE2KSAvIDEyOCk7CisJfSBlbHNlIGlmIChzYW1wbGUgPCA4MTYwKSB7CisJCXNhbXBsZSA9IDB4ODAgfCAoMTUgLSAoc2FtcGxlIC0gNDA2NCkgLyAgMjU2KTsKKwl9IGVsc2UgeworCQlzYW1wbGUgPSAweDgwOworCX0KKwlyZXR1cm4gKG1hc2sgJiBzYW1wbGUpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9zdW4vU0RMX3N1bmF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3N1bi9TRExfc3VuYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJlNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9zdW4vU0RMX3N1bmF1ZGlvLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9sb3dhdWRpb19oCisjZGVmaW5lIF9TRExfbG93YXVkaW9faAorCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwkvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXVkaW8gZGV2aWNlICovCisJaW50IGF1ZGlvX2ZkOworCisJVWludDE2IGF1ZGlvX2ZtdDsgICAgICAgIC8qIFRoZSBhcHAgYXVkaW8gZm9ybWF0ICovCisJVWludDggKm1peGJ1ZjsgICAgICAgICAgIC8qIFRoZSBhcHAgbWl4aW5nIGJ1ZmZlciAqLworCWludCB1bGF3X29ubHk7ICAgICAgICAgICAvKiBGbGFnIC0tIGRvZXMgaGFyZHdhcmUgb25seSBvdXRwdXQgVS1sYXc/ICovCisJVWludDggKnVsYXdfYnVmOyAgICAgICAgIC8qIFRoZSBVLWxhdyBtaXhpbmcgYnVmZmVyICovCisJU2ludDMyIHdyaXR0ZW47ICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB3cml0dGVuICovCisJaW50IGZyYWdzaXplOyAgICAgICAgICAgIC8qIFRoZSBhdWRpbyBmcmFnbWVudCBzaXplIGluIHNhbXBsZXMgKi8KKwlpbnQgZnJlcXVlbmN5OyAgICAgICAgICAgLyogVGhlIGF1ZGlvIGZyZXF1ZW5jeSBpbiBLSHogKi8KK307CisKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBhdWRpb19mZAkJKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQpCisjZGVmaW5lIGF1ZGlvX2ZtdAkJKHRoaXMtPmhpZGRlbi0+YXVkaW9fZm10KQorI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCisjZGVmaW5lIHVsYXdfb25seQkJKHRoaXMtPmhpZGRlbi0+dWxhd19vbmx5KQorI2RlZmluZSB1bGF3X2J1ZgkJKHRoaXMtPmhpZGRlbi0+dWxhd19idWYpCisjZGVmaW5lIHdyaXR0ZW4JCQkodGhpcy0+aGlkZGVuLT53cml0dGVuKQorI2RlZmluZSBmcmFnc2l6ZQkJKHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemUpCisjZGVmaW5lIGZyZXF1ZW5jeQkJKHRoaXMtPmhpZGRlbi0+ZnJlcXVlbmN5KQorCisjZW5kaWYgLyogX1NETF9sb3dhdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3N5bWJpYW4vU0RMX2Vwb2NhdWRpby5jcHAgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3N5bWJpYW4vU0RMX2Vwb2NhdWRpby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhNGVhZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vc3ltYmlhbi9TRExfZXBvY2F1ZGlvLmNwcApAQCAtMCwwICsxLDYxNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AZGV2b2x1dGlvbi5jb20KKyovCisKKy8qCisgICAgU0RMX2Vwb2NhdWRpby5jcHAKKyAgICBFcG9jIGJhc2VkIFNETCBhdWRpbyBkcml2ZXIgaW1wbGVtZW50YXRpb24KKyAgICAKKyAgICBNYXJrdXMgTWVydGFtYQorKi8KKworI2lmZGVmIFNBVkVfUkNTSUQKK3N0YXRpYyBjaGFyIHJjc2lkID0KKyAiQCgjKSAkSWQ6IFNETF9lcG9jYXVkaW8uYyx2IDAuMC4wLjAgMjAwMS8wNi8xOSAxNzoxOTo1NiBoZXJjdWxlcyBFeHAgJCI7CisjZW5kaWYKKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAiZXBvY19zZGwuaCIKKworI2luY2x1ZGUgPGUzMmhhbC5oPgorCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF9hdWRpb21lbS5oIgorI2luY2x1ZGUgIlNETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2F1ZGlvZGV2X2MuaCIKK30KKworI2luY2x1ZGUgIlNETF9lcG9jYXVkaW8uaCIKKworI2luY2x1ZGUgInN0cmVhbXBsYXllci5oIgorCisKKy8vI2RlZmluZSBERUJVR19BVURJTworCisKKy8qIEF1ZGlvIGRyaXZlciBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBFUE9DX09wZW5BdWRpbyhTRExfQXVkaW9EZXZpY2UgKnRoaXNkZXZpY2UsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworc3RhdGljIHZvaWQgRVBPQ19XYWl0QXVkaW8oU0RMX0F1ZGlvRGV2aWNlICp0aGlzZGV2aWNlKTsKK3N0YXRpYyB2b2lkIEVQT0NfUGxheUF1ZGlvKFNETF9BdWRpb0RldmljZSAqdGhpc2RldmljZSk7CitzdGF0aWMgVWludDggKkVQT0NfR2V0QXVkaW9CdWYoU0RMX0F1ZGlvRGV2aWNlICp0aGlzZGV2aWNlKTsKK3N0YXRpYyB2b2lkIEVQT0NfQ2xvc2VBdWRpbyhTRExfQXVkaW9EZXZpY2UgKnRoaXNkZXZpY2UpOworc3RhdGljIHZvaWQgRVBPQ19UaHJlYWRJbml0KFNETF9BdWRpb0RldmljZSAqdGhpc2RldmljZSk7CisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpOworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCk7CitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpOworCisKKy8vdm9pZCBzb3NfYWR1bXAoU0RMX0F1ZGlvRGV2aWNlKiB0aGlzZGV2aWNlLCB2b2lkKiBkYXRhLCBpbnQgbGVuKTsKKworI2lmZGVmIF9fV0lOU19fCisjZGVmaW5lIERPRFVNUAorI2VuZGlmCisKKyNpZmRlZiBET0RVTVAKK05PTlNIQVJBQkxFX0NMQVNTKFREdW1wKQorCXsKKwlwdWJsaWM6CisJVEludCBPcGVuKCk7CisJdm9pZCBDbG9zZSgpOworCXZvaWQgRHVtcChjb25zdCBURGVzQzgmIGFEZXMpOworCXByaXZhdGU6CisJCVJGaWxlIGlGaWxlOworICAgIAlSRnMgaUZzOyAKKwl9OworCQorVEludCBURHVtcDo6T3BlbigpCisJeworCVRJbnQgZXJyID0gaUZzLkNvbm5lY3QoKTsKKwlpZihlcnIgPT0gS0Vyck5vbmUpCisJCXsKKyNpZmRlZiBfX1dJTlNfXworX0xJVCh0YXJnZXQsICJDOlxcc2RsYXUucmF3Iik7CisjZWxzZQorX0xJVCh0YXJnZXQsICJFOlxcc2RsYXUucmF3Iik7CisjZW5kaWYgCisJCWVyciA9IGlGaWxlLlJlcGxhY2UoaUZzLCB0YXJnZXQsIEVGaWxlV3JpdGUpOworCQl9CisJcmV0dXJuIGVycjsKKwl9Cit2b2lkIFREdW1wOjpDbG9zZSgpCisJeworCWlGaWxlLkNsb3NlKCk7CisJaUZzLkNsb3NlKCk7CisJfQordm9pZCBURHVtcDo6RHVtcChjb25zdCBURGVzQzgmIGFEZXMpCisJeworCWlGaWxlLldyaXRlKGFEZXMpOworCX0KKyNlbmRpZgorCisKK05PTlNIQVJBQkxFX0NMQVNTKENTaW1wbGVXYWl0KSA6IHB1YmxpYyBDVGltZXIKKwl7CisJcHVibGljOgorCQl2b2lkIFdhaXQoVFRpbWVJbnRlcnZhbE1pY3JvU2Vjb25kczMyIGFXYWl0KTsKKwkJc3RhdGljIENTaW1wbGVXYWl0KiBOZXdMKCk7CisJcHJpdmF0ZToKKwkJQ1NpbXBsZVdhaXQoKTsKKwkJdm9pZCBSdW5MKCk7CisJfTsKKworCitDU2ltcGxlV2FpdCogQ1NpbXBsZVdhaXQ6Ok5ld0woKQorCXsKKwlDU2ltcGxlV2FpdCogd2FpdCA9IG5ldyAoRUxlYXZlKSBDU2ltcGxlV2FpdCgpOworCUNsZWFudXBTdGFjazo6UHVzaEwod2FpdCk7CisJd2FpdC0+Q29uc3RydWN0TCgpOworCUNsZWFudXBTdGFjazo6UG9wKCk7CisJcmV0dXJuIHdhaXQ7CisJfQorCit2b2lkIENTaW1wbGVXYWl0OjpXYWl0KFRUaW1lSW50ZXJ2YWxNaWNyb1NlY29uZHMzMiBhV2FpdCkKKwl7CisJQWZ0ZXIoYVdhaXQpOworCUNBY3RpdmVTY2hlZHVsZXI6OlN0YXJ0KCk7CisJfQorCQorQ1NpbXBsZVdhaXQ6OkNTaW1wbGVXYWl0KCkgOiBDVGltZXIoQ0FjdGl2ZTo6RVByaW9yaXR5U3RhbmRhcmQpCQorCXsKKwlDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisJfQorCit2b2lkIENTaW1wbGVXYWl0OjpSdW5MKCkKKwl7CisJQ0FjdGl2ZVNjaGVkdWxlcjo6U3RvcCgpOworCX0KKworY29uc3QgVEludCBLQXVkaW9CdWZmZXJzKDIpOworCQorCitOT05TSEFSQUJMRV9DTEFTUyhDRXBvY0F1ZGlvKSA6IHB1YmxpYyBDQmFzZSwgcHVibGljIE1TdHJlYW1PYnMsIHB1YmxpYyBNU3RyZWFtUHJvdmlkZXIKKyAgICB7CisgICAgcHVibGljOgorICAgIAlzdGF0aWMgdm9pZCogTmV3TChUSW50IEJ1ZmZlclNpemUsIFRJbnQgYUZpbGwpOworICAgIAlpbmxpbmUgc3RhdGljIENFcG9jQXVkaW8mIEN1cnJlbnQoU0RMX0F1ZGlvRGV2aWNlKiB0aGlzZGV2aWNlKTsKKyAgICAJCisgICAgCXN0YXRpYyB2b2lkIEZyZWUoU0RMX0F1ZGlvRGV2aWNlKiB0aGlzZGV2aWNlKTsKKyAJCQorICAgIAl2b2lkIFdhaXQoKTsKKyAgICAJdm9pZCBQbGF5KCk7CisgICAgLy8Jdm9pZCBTZXRCdWZmZXIoY29uc3QgVERlc0M4JiBhQnVmZmVyKTsKKyAgICAJdm9pZCBUaHJlYWRJbml0TChUQW55KiBhRGV2aWNlKTsKKyAgICAJdm9pZCBPcGVuKFRJbnQgaVJhdGUsIFRJbnQgaUNoYW5uZWxzLCBUVWludDMyIGFUeXBlLCBUSW50IGFCeXRlcyk7CisgICAgCX5DRXBvY0F1ZGlvKCk7CisgICAgCVRVaW50OCogQnVmZmVyKCk7CisgICAgCVRCb29sIFNldFBhdXNlKFRCb29sIGFQYXVzZSk7CisgICAgI2lmZGVmIERPRFVNUAorICAgIAl2b2lkIER1bXAoY29uc3QgVERlc0M4JiBhQnVmKSB7aUR1bXAuRHVtcChhQnVmKTt9CisgICAgI2VuZGlmCisgICAgcHJpdmF0ZToKKyAgICAJQ0Vwb2NBdWRpbyhUSW50IGFCdWZmZXJTaXplKTsKKyAgICAJdm9pZCBDb21wbGV0ZShUSW50IGFTdGF0ZSwgVEludCBhRXJyb3IpOworICAgIAlUUHRyQzggRGF0YSgpOworICAgIAl2b2lkIENvbnN0cnVjdEwoVEludCBhRmlsbCk7CisgICAgcHJpdmF0ZToKKyAgICAJVEludCBpQnVmZmVyU2l6ZTsKKyAgICAJQ1N0cmVhbVBsYXllciogaVBsYXllcjsKKyAgICAJVEludCBpQnVmZmVyUmF0ZTsKKyAgICAJVEludCBpUmF0ZTsKKyAgICAJVEludCBpQ2hhbm5lbHM7CisgICAgCVRVaW50MzIgaVR5cGU7CisgICAgCVRJbnQgaVBvc2l0aW9uOworICAgIAlUVGhyZWFkSWQgaVRpZDsKKyAgICAJVFVpbnQ4KiBpQXVkaW9QdHI7CisgICAgCVRVaW50OCogaUJ1ZmZlcjsKKyAgICAvLwlUVGltZUludGVydmFsTWljcm9TZWNvbmRzIGlTdGFydDsKKyAgICAJVFRpbWUgaVN0YXJ0OworICAgIAlUSW50IGlUdW5lOworICAgIAlDU2ltcGxlV2FpdCogaVdhaXQ7CisgICAgI2lmZGVmIERPRFVNUAorICAgIAlURHVtcCBpRHVtcDsKKyAgICAjZW5kaWYKKyAgICB9OworCitpbmxpbmUgQ0Vwb2NBdWRpbyYgQ0Vwb2NBdWRpbzo6Q3VycmVudChTRExfQXVkaW9EZXZpY2UqIHRoaXNkZXZpY2UpCisJeworCXJldHVybiAqc3RhdGljX2Nhc3Q8Q0Vwb2NBdWRpbyo+KCh2b2lkKil0aGlzZGV2aWNlLT5oaWRkZW4pOworCX0KKwkKKy8qCisKK1RCb29sIEVuZFNjKFRBbnkqKQorCXsJCisJQ0FjdGl2ZVNjaGVkdWxlcjo6U3RvcCgpOworCX0KKwkKK0xPQ0FMX0Mgdm9pZCBDbGVhblNjTCgpCisJeworCUNJZGxlKiBkID0gQ0lkbGU6Ok5ld0xDKENBY3RpdmU6OjpFUHJpb3JpdHlJZGxlKTsKKwlkLT5TdGFydChUQ2FsbEJhY2soRW5kU2MpKTsKKwlDQWN0aXZlU2NoZWR1bGVyOjpTdGFydCgpOworCQorCX0KKyovCisJCit2b2lkIENFcG9jQXVkaW86OkZyZWUoU0RMX0F1ZGlvRGV2aWNlKiB0aGlzZGV2aWNlKQorCXsKKyAgICBDRXBvY0F1ZGlvKiBlYSA9IHN0YXRpY19jYXN0PENFcG9jQXVkaW8qPigodm9pZCopdGhpc2RldmljZS0+aGlkZGVuKTsKKyAgICBpZihlYSkKKyAgICAJeworCQlBU1NFUlQoZWEtPmlUaWQgPT0gUlRocmVhZCgpLklkKCkpOworICAgIAlkZWxldGUgZWE7CisgICAgCXRoaXNkZXZpY2UtPmhpZGRlbiA9IE5VTEw7CQorICAgCisgICAgCUNBY3RpdmVTY2hlZHVsZXIqIGFzID0gIENBY3RpdmVTY2hlZHVsZXI6OkN1cnJlbnQoKTsKKyAgICAJQVNTRVJUKGFzLT5TdGFja0RlcHRoKCkgPT0gMCk7ICAgIAkKKyAgICAJZGVsZXRlIGFzOworICAgIAlDQWN0aXZlU2NoZWR1bGVyOjpJbnN0YWxsKE5VTEwpOworICAgIAl9CisgICAgQVNTRVJUKHRoaXNkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKTsKKwl9CisJCitDRXBvY0F1ZGlvOjpDRXBvY0F1ZGlvKFRJbnQgYUJ1ZmZlclNpemUpIDogaUJ1ZmZlclNpemUoYUJ1ZmZlclNpemUpLCBpUG9zaXRpb24oLTEpIAorCXsKKwl9CisKK3ZvaWQqIENFcG9jQXVkaW86Ok5ld0woVEludCBhQnVmZmVyU2l6ZSwgVEludCBhRmlsbCkKKwl7CisJQ0Vwb2NBdWRpbyogZUF1ZGlvTGliID0gbmV3IChFTGVhdmUpIENFcG9jQXVkaW8oYUJ1ZmZlclNpemUpOworCUNsZWFudXBTdGFjazo6UHVzaEwoZUF1ZGlvTGliKTsKKwllQXVkaW9MaWItPkNvbnN0cnVjdEwoYUZpbGwpOworCUNsZWFudXBTdGFjazo6UG9wKCk7CisJcmV0dXJuIGVBdWRpb0xpYjsKKwl9CisJCit2b2lkIENFcG9jQXVkaW86OkNvbnN0cnVjdEwoVEludCBhRmlsbCkKKwl7CisJaUJ1ZmZlciA9IChUVWludDgqKSBVc2VyOjpBbGxvY0woS0F1ZGlvQnVmZmVycyAqIGlCdWZmZXJTaXplKTsKKwltZW1zZXQoaUJ1ZmZlciwgYUZpbGwsIEtBdWRpb0J1ZmZlcnMgKiBpQnVmZmVyU2l6ZSk7CisJaUF1ZGlvUHRyID0gaUJ1ZmZlcjsKKwl9CisKKworVEJvb2wgQ0Vwb2NBdWRpbzo6U2V0UGF1c2UoVEJvb2wgYVBhdXNlKQorCXsKKwlpZihhUGF1c2UgJiYgaVBvc2l0aW9uID49IDApCisJCXsKKwkJaVBvc2l0aW9uID0gLTE7CisJCWlmKGlQbGF5ZXIgIT0gTlVMTCkKKwkJCWlQbGF5ZXItPlN0b3AoKTsKKwkJfQorCWlmKCFhUGF1c2UgJiYgaVBvc2l0aW9uIDwgMCkKKwkJeworCQlpUG9zaXRpb24gPSAwOworCQlpZihpUGxheWVyICE9IE5VTEwpCisJCQlpUGxheWVyLT5TdGFydCgpOworCQl9CisJcmV0dXJuIGlQb3NpdGlvbiA8IDA7CisJfQorCQordm9pZCBDRXBvY0F1ZGlvOjpUaHJlYWRJbml0TChUQW55KiBhRGV2aWNlKQorCXsKKwlpVGlkID0gUlRocmVhZCgpLklkKCk7IAorCUNBY3RpdmVTY2hlZHVsZXIqIGFzID0gIG5ldyAoRUxlYXZlKSBDQWN0aXZlU2NoZWR1bGVyKCk7CisgICAgQ0FjdGl2ZVNjaGVkdWxlcjo6SW5zdGFsbChhcyk7CisgICAgCisgICAgRXBvY1NkbEVudjo6QXBwZW5kQ2xlYW51cEl0ZW0oVFNkbENsZWFudXBJdGVtKChUU2RsQ2xlYW51cE9wZXJhdGlvbilFUE9DX0Nsb3NlQXVkaW8sIGFEZXZpY2UpKTsKKyAgIAorICAgIGlXYWl0ID0gQ1NpbXBsZVdhaXQ6Ok5ld0woKTsKKyAgIAorICAgIGlQbGF5ZXIgPSBuZXcgKEVMZWF2ZSkgQ1N0cmVhbVBsYXllcigqdGhpcywgKnRoaXMpOworICAgIGlQbGF5ZXItPkNvbnN0cnVjdEwoKTsJCisgICAgaVBsYXllci0+T3BlblN0cmVhbShpUmF0ZSwgaUNoYW5uZWxzLCBpVHlwZSk7CisgICAgCisgICAgI2lmZGVmIERPRFVNUAorICAgIFVzZXI6OkxlYXZlSWZFcnJvcihpRHVtcC5PcGVuKCkpOworICAgICNlbmRpZgorCX0KKwkKKwkKKwkKK1RVaW50OCogQ0Vwb2NBdWRpbzo6QnVmZmVyKCkKKwl7CisJaVN0YXJ0LlVuaXZlcnNhbFRpbWUoKTsKKy8vCWlTdGFydCA9IGlQbGF5ZXItPlBvc2l0aW9uKCk7CQkKKwlyZXR1cm4gaUF1ZGlvUHRyOworCisJfQorCQorQ0Vwb2NBdWRpbzo6fkNFcG9jQXVkaW8oKQorCXsKKwlpZihpV2FpdCAhPSBOVUxMKQorCQlpV2FpdC0+Q2FuY2VsKCk7CisJZGVsZXRlIGlXYWl0OyAKKwlpZihpUGxheWVyICE9IE5VTEwpCisJCWlQbGF5ZXItPkNsb3NlKCk7CisJZGVsZXRlIGlQbGF5ZXI7CisJZGVsZXRlIGlCdWZmZXI7CisJfQorCQordm9pZCBDRXBvY0F1ZGlvOjpDb21wbGV0ZShUSW50IGFTdGF0ZSwgVEludCBhRXJyb3IpCisJeworCWlmKGFTdGF0ZSA9PSBNU3RyZWFtT2JzOjpFQ2xvc2UpCisJCXsKKwkJfQorCWlmKGlQbGF5ZXItPkNsb3NlZCgpKQorCQlyZXR1cm47CisJc3dpdGNoKGFFcnJvcikKKwkJeworCQljYXNlIEtFcnJVbmRlcmZsb3c6CisJCWNhc2UgS0VyckluVXNlOgorCQkJaVBsYXllci0+U3RhcnQoKTsKKwkJCWJyZWFrOworCQljYXNlIEtFcnJBYm9ydDoKKwkJCWlQbGF5ZXItPk9wZW4oKTsKKwkJfQorCX0KKwkKKwordm9pZCBzb3NfYWR1bXAoU0RMX0F1ZGlvRGV2aWNlKiB0aGlzZGV2aWNlLCB2b2lkKiBkYXRhLCBpbnQgbGVuKQorCXsKKyNpZmRlZiBET0RVTVAKKwljb25zdCBUUHRyQzggYnVmKChUVWludDgqKWRhdGEsIGxlbik7CisJQ0Vwb2NBdWRpbzo6Q3VycmVudCh0aGlzZGV2aWNlKS5EdW1wKGJ1Zik7CisjZW5kaWYKKwl9CisKK2NvbnN0IFRJbnQgS0NsaXAoMjU2KTsKKwkKK1RQdHJDOCBDRXBvY0F1ZGlvOjpEYXRhKCkKKwl7CisJaWYoaVBvc2l0aW9uIDwgMCkKKwkJcmV0dXJuIEtOdWxsRGVzQzgoKTsKKwkKKwlUUHRyQzggZGF0YShpQXVkaW9QdHIgKyBpUG9zaXRpb24sIEtDbGlwKTsKKwkKKyNpZmRlZiBET0RVTVAKKwlpRHVtcC5EdW1wKGRhdGEpOworI2VuZGlmCisJCisJaVBvc2l0aW9uICs9IEtDbGlwOworCWlmKGlQb3NpdGlvbiA+PSBpQnVmZmVyU2l6ZSkgCisJCXsKKwkJCisvKgkJaWYoaUF1ZGlvUHRyID09IGlCdWZmZXIpCisJCQlpQXVkaW9QdHIgPSBpQnVmZmVyICsgaUJ1ZmZlclNpemU7CisJCWVsc2UKKwkJCWlBdWRpb1B0ciA9IGlCdWZmZXI7CisqLwkJCisJCWlBdWRpb1B0ciArPSBpQnVmZmVyU2l6ZTsKKwkJCisJCWlmKChpQXVkaW9QdHIgLSBpQnVmZmVyKSA+PSBLQXVkaW9CdWZmZXJzICogaUJ1ZmZlclNpemUpCisJCQlpQXVkaW9QdHIgPSBpQnVmZmVyOworCQkKKwkJaVBvc2l0aW9uID0gLTE7CisJCWlmKGlXYWl0LT5Jc0FjdGl2ZSgpKQorCQkJeworCQkJaVdhaXQtPkNhbmNlbCgpOworCQkJQ0FjdGl2ZVNjaGVkdWxlcjo6U3RvcCgpOworCQkJfQorCQl9CisJcmV0dXJuIGRhdGE7CisJfQorCQkKKworCisJCit2b2lkIENFcG9jQXVkaW86OlBsYXkoKQorCXsKKwlpUG9zaXRpb24gPSAwOworCX0KKwordm9pZCBDRXBvY0F1ZGlvOjpXYWl0KCkKKwl7CisJaWYoaVBvc2l0aW9uID49IDAgLyomJiBpUGxheWVyLT5QbGF5aW5nKCkqLykKKwkJeworCQljb25zdCBUSW50NjQgYnVmTXMgPSBUSW50NjQoaUJ1ZmZlclNpemUgLSBLQ2xpcCkgKiBUSW50NjQoMTAwMDAwMCk7CisJCWNvbnN0IFRJbnQ2NCBzcGVjVGltZSA9ICBidWZNcyAvIFRJbnQ2NChpUmF0ZSAqIGlDaGFubmVscyAqIDIpOworCQlpV2FpdC0+QWZ0ZXIoc3BlY1RpbWUpOworCQkKKwkJQ0FjdGl2ZVNjaGVkdWxlcjo6U3RhcnQoKTsKKwkJVFRpbWUgZW5kOworCQllbmQuVW5pdmVyc2FsVGltZSgpOworCQljb25zdCBUVGltZUludGVydmFsTWljcm9TZWNvbmRzIGRlbHRhID0gZW5kLk1pY3JvU2Vjb25kc0Zyb20oaVN0YXJ0KTsKKwkKKwkKKy8vCQljb25zdCBUVGltZUludGVydmFsTWljcm9TZWNvbmRzIGVuZCA9IGlQbGF5ZXItPlBvc2l0aW9uKCk7CisJCQorCQkKKwkKKwkJCisJCWNvbnN0IFRJbnQgZGlmZiA9IHNwZWNUaW1lIC0gZGVsdGEuSW50NjQoKTsKKwkJCisJCWlmKGRpZmYgPiAwICYmIGRpZmYgPCAyMDAwMDApCisJCQl7CisJCQlVc2VyOjpBZnRlcihkaWZmKTsKKwkJCX0KKwkJCisJCX0KKwllbHNlCisJCXsKKwlVc2VyOjpBZnRlcigxMDAwMCk7IAorLy8JaVdhaXQtPldhaXQoMTAwMDApOyAvL2p1c3QgZ2l2ZSBzb21lIHRpbWUuLi4JCisJCX0JCisJfQorCQordm9pZCBDRXBvY0F1ZGlvOjpPcGVuKFRJbnQgYVJhdGUsIFRJbnQgYUNoYW5uZWxzLCBUVWludDMyIGFUeXBlLCBUSW50IGFCeXRlcykJCisJeworCWlSYXRlID0gYVJhdGU7CisJaUNoYW5uZWxzID0gYUNoYW5uZWxzOworCWlUeXBlID0gYVR5cGU7CisgICAgaUJ1ZmZlclJhdGUgPSBpUmF0ZSAqIGlDaGFubmVscyAqIGFCeXRlczsgLy8xL3gKKwl9CisJCisKKy8qIEF1ZGlvIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK0F1ZGlvQm9vdFN0cmFwIEVQT0NBdWRpb19ib290c3RyYXAgPSB7CisJImVwb2NcMFwwXDAiLAorCSJFUE9DIHN0cmVhbWluZyBhdWRpb1wwXDBcMCIsCisJQXVkaW9fQXZhaWxhYmxlLAorCUF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworCitzdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IC8qZGV2aW5kZXgqLykKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXNkZXZpY2U7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXNkZXZpY2UgPSAoU0RMX0F1ZGlvRGV2aWNlICopbWFsbG9jKHNpemVvZihTRExfQXVkaW9EZXZpY2UpKTsKKwlpZiAoIHRoaXNkZXZpY2UgKSB7CisJCW1lbXNldCh0aGlzZGV2aWNlLCAwLCAoc2l6ZW9mICp0aGlzZGV2aWNlKSk7CisJCXRoaXNkZXZpY2UtPmhpZGRlbiA9IE5VTEw7IC8qKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJIG1hbGxvYygoc2l6ZW9mIHRoaXNkZXZpY2UtPmhpZGRlbikpOyAqLworCX0KKwlpZiAoICh0aGlzZGV2aWNlID09IE5VTEwpIC8qfHwgKHRoaXNkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSAqLykgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCB0aGlzZGV2aWNlICkgeworCQkJZnJlZSh0aGlzZGV2aWNlKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorLy8JbWVtc2V0KHRoaXNkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpc2RldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJdGhpc2RldmljZS0+T3BlbkF1ZGlvID0gRVBPQ19PcGVuQXVkaW87CisJdGhpc2RldmljZS0+V2FpdEF1ZGlvID0gRVBPQ19XYWl0QXVkaW87CisJdGhpc2RldmljZS0+UGxheUF1ZGlvID0gRVBPQ19QbGF5QXVkaW87CisJdGhpc2RldmljZS0+R2V0QXVkaW9CdWYgPSBFUE9DX0dldEF1ZGlvQnVmOworCXRoaXNkZXZpY2UtPkNsb3NlQXVkaW8gPSBFUE9DX0Nsb3NlQXVkaW87CisgICAgdGhpc2RldmljZS0+VGhyZWFkSW5pdCA9IEVQT0NfVGhyZWFkSW5pdDsKKwl0aGlzZGV2aWNlLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIHRoaXNkZXZpY2U7Cit9CisKKworc3RhdGljIHZvaWQgQXVkaW9fRGVsZXRlRGV2aWNlKFNETF9BdWRpb0RldmljZSAqZGV2aWNlKQorICAgIHsKKwkvL2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCWZyZWUoZGV2aWNlKTsKKyAgICB9CisKK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisJcmV0dXJuKDEpOyAvLyBBdWRpbyBzdHJlYW0gbW9kdWxlcyBzaG91bGQgYmUgYWx3YXlzIHRoZXJlIQorfQorCisKK3N0YXRpYyBpbnQgRVBPQ19PcGVuQXVkaW8oU0RMX0F1ZGlvRGV2aWNlICp0aGlzZGV2aWNlLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCVNETF9UUkFDRSgiU0RMOkVQT0NfT3BlbkF1ZGlvIik7CisKKwkKKwlUVWludDMyIHR5cGUgPSBLTU1GRm91ckNDQ29kZVBDTTE2OworCVRJbnQgYnl0ZXMgPSAyOworCQorCXN3aXRjaChzcGVjLT5mb3JtYXQpCisJCXsKKwkJY2FzZSBBVURJT19VMTZMU0I6IAorCQkJdHlwZSA9IEtNTUZGb3VyQ0NDb2RlUENNVTE2OyAKKwkJCWJyZWFrOworCQljYXNlIEFVRElPX1MxNkxTQjogCisJCQl0eXBlID0gS01NRkZvdXJDQ0NvZGVQQ00xNjsgCisJCQlicmVhazsKKwkJY2FzZSBBVURJT19VMTZNU0I6IAorCQkJdHlwZSA9IEtNTUZGb3VyQ0NDb2RlUENNVTE2QjsgCisJCQlicmVhazsKKwkJY2FzZSBBVURJT19TMTZNU0I6IAorCQkJdHlwZSA9IEtNTUZGb3VyQ0NDb2RlUENNMTZCOyAKKwkJCWJyZWFrOyAKKwkJCS8vOCBiaXQgbm90IHN1cHBvcnRlZCEKKwkJY2FzZSBBVURJT19VODogCisJCWNhc2UgQVVESU9fUzg6CisJCWRlZmF1bHQ6CisJCQlzcGVjLT5mb3JtYXQgPSBBVURJT19TMTZMU0I7CisJCX07CisJCisKKwkKKwlpZihzcGVjLT5jaGFubmVscyA+IDIpCisJCXNwZWMtPmNoYW5uZWxzID0gMjsKKwkKKwlzcGVjLT5mcmVxID0gQ1N0cmVhbVBsYXllcjo6Q2xvc2VzdFN1cHBvcnRlZFJhdGUoc3BlYy0+ZnJlcSk7CisJCisKKwkvKiBBbGxvY2F0ZSBtaXhpbmcgYnVmZmVyICovCisJY29uc3QgVEludCBidWZsZW4gPSBzcGVjLT5zaXplOy8vICogYnl0ZXMgKiBzcGVjLT5jaGFubmVsczsKKy8vCWF1ZGlvYnVmID0gTlVMTDsKKyAgICAKKyAgICBUUkFQRChlcnIsIHRoaXNkZXZpY2UtPmhpZGRlbiA9IHN0YXRpY19jYXN0PFNETF9Qcml2YXRlQXVkaW9EYXRhKj4oQ0Vwb2NBdWRpbzo6TmV3TChidWZsZW4sIHNwZWMtPnNpbGVuY2UpKSk7CisgICAgaWYoZXJyICE9IEtFcnJOb25lKQorICAgICAgICByZXR1cm4gLTE7CisKKwlDRXBvY0F1ZGlvOjpDdXJyZW50KHRoaXNkZXZpY2UpLk9wZW4oc3BlYy0+ZnJlcSwgc3BlYy0+Y2hhbm5lbHMsIHR5cGUsIGJ5dGVzKTsKKwkKKwlDRXBvY0F1ZGlvOjpDdXJyZW50KHRoaXNkZXZpY2UpLlNldFBhdXNlKEVUcnVlKTsKKwkKKyAgIC8vIGlzU0RMQXVkaW9QYXVzZWQgPSAxOworCisgICAgdGhpc2RldmljZS0+ZW5hYmxlZCA9IDA7IC8qIGVuYWJsZSBvbmx5IGFmdGVyIGF1ZGlvIGVuZ2luZSBoYXMgYmVlbiBpbml0aWFsaXplZCEqLworCisJLyogV2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCisJcmV0dXJuKDApOworfQorCisKK3N0YXRpYyB2b2lkIEVQT0NfQ2xvc2VBdWRpbyhTRExfQXVkaW9EZXZpY2UqIHRoaXNkZXZpY2UpCisgICAgeworI2lmZGVmIERFQlVHX0FVRElPCisgICAgU0RMX1RSQUNFKCJDbG9zZSBhdWRpb1xuIik7CisjZW5kaWYKKworCUNFcG9jQXVkaW86OkZyZWUodGhpc2RldmljZSk7CisJfQorCisKK3N0YXRpYyB2b2lkIEVQT0NfVGhyZWFkSW5pdChTRExfQXVkaW9EZXZpY2UgKnRoaXNkZXZpY2UpCisgICAgeworCVNETF9UUkFDRSgiU0RMOkVQT0NfVGhyZWFkSW5pdCIpOworICAgIENFcG9jQXVkaW86OkN1cnJlbnQodGhpc2RldmljZSkuVGhyZWFkSW5pdEwodGhpc2RldmljZSk7CisgICAgUlRocmVhZCgpLlNldFByaW9yaXR5KEVQcmlvcml0eU1vcmUpOworICAgIHRoaXNkZXZpY2UtPmVuYWJsZWQgPSAxOworICAgIH0KKworLyogVGhpcyBmdW5jdGlvbiB3YWl0cyB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBhIGZ1bGwgc291bmQgYnVmZmVyICovCitzdGF0aWMgdm9pZCBFUE9DX1dhaXRBdWRpbyhTRExfQXVkaW9EZXZpY2UqIHRoaXNkZXZpY2UpCit7CisjaWZkZWYgREVCVUdfQVVESU8KKyAgICBTRExfVFJBQ0UxKCJ3YWl0ICVkIGF1ZGlvXG4iLCBDRXBvY0F1ZGlvOjpBdWRpb0xpYigpLlN0cmVhbVBsYXllcihLU2Z4Q2hhbm5lbCkuU3luY1RpbWUoKSk7CisgICAgVEludCB0aWNzID0gVXNlcjo6VGlja0NvdW50KCk7CisjZW5kaWYKKworCUNFcG9jQXVkaW86OkN1cnJlbnQodGhpc2RldmljZSkuV2FpdCgpOworCisjaWZkZWYgREVCVUdfQVVESU8KKyAgICBUSW50IG50aWNzID0gIFVzZXI6OlRpY2tDb3VudCgpIC0gdGljczsKKyAgICBTRExfVFJBQ0UxKCJhdWRpbyB3YWl0ZWQgJWRcbiIsIG50aWNzKTsKKyAgICBTRExfVFJBQ0UxKCJhdWRpbyBhdCAlZFxuIiwgdGljcyk7CisjZW5kaWYKK30KKworCisgCitzdGF0aWMgdm9pZCBFUE9DX1BsYXlBdWRpbyhTRExfQXVkaW9EZXZpY2UqIHRoaXNkZXZpY2UpCisJeworIAlpZihDRXBvY0F1ZGlvOjpDdXJyZW50KHRoaXNkZXZpY2UpLlNldFBhdXNlKFNETF9HZXRBdWRpb1N0YXR1cygpID09IFNETF9BVURJT19QQVVTRUQpKQorIAkJU0RMX0RlbGF5KDUwMCk7IC8vaG9sZCBvbiB0aGUgYnVzeSBsb29wCisgCWVsc2UKKyAJCUNFcG9jQXVkaW86OkN1cnJlbnQodGhpc2RldmljZSkuUGxheSgpOworCisjaWZkZWYgREVCVUdfQVVESU8KKyAgICBTRExfVFJBQ0UoImJ1ZmZlciBoYXMgYXVkaW8gZGF0YVxuIik7CisjZW5kaWYKKworCQorI2lmZGVmIERFQlVHX0FVRElPCisJU0RMX1RSQUNFMSgiV3JvdGUgJWQgYnl0ZXMgb2YgYXVkaW8gZGF0YVxuIiwgYnVmbGVuKTsKKyNlbmRpZgorfQorCitzdGF0aWMgVWludDggKkVQT0NfR2V0QXVkaW9CdWYoU0RMX0F1ZGlvRGV2aWNlKiB0aGlzZGV2aWNlKQorCXsKKwlyZXR1cm4gQ0Vwb2NBdWRpbzo6Q3VycmVudCh0aGlzZGV2aWNlKS5CdWZmZXIoKTsKKwl9CisKKworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3N5bWJpYW4vU0RMX2Vwb2NhdWRpby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9zeW1iaWFuL1NETF9lcG9jYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzk1Yzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9zeW1iaWFuL1NETF9lcG9jYXVkaW8uaApAQCAtMCwwICsxLDM3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBkZXZvbHV0aW9uLmNvbQorKi8KKworCisjaWZkZWYgU0FWRV9SQ1NJRAorc3RhdGljIGNoYXIgcmNzaWQgPQorICJAKCMpICRJZDogU0RMX2Vwb2NhdWRpby5oLHYgMS4xLjIuMiAyMDAxLzAyLzEwIDA3OjIwOjAzIGhlcmN1bGVzIEV4cCAkIjsKKyNlbmRpZgorCisjaWZuZGVmIF9TRExfRVBPQ0FVRElPX0gKKyNkZWZpbmUgX1NETF9FUE9DQVVESU9fSAorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJTRExfc3lzYXVkaW8uaCIKK30KKworCisjZW5kaWYgLyogX1NETF9FUE9DQVVESU9fSCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9zeW1iaWFuL3N0cmVhbXBsYXllci5jcHAgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3N5bWJpYW4vc3RyZWFtcGxheWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDczM2ExCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9zeW1iaWFuL3N0cmVhbXBsYXllci5jcHAKQEAgLTAsMCArMSwyNzkgQEAKKyNpbmNsdWRlICJzdHJlYW1wbGF5ZXIuaCIKKyNpbmNsdWRlPG1kYS9jb21tb24vYXVkaW8uaD4KKworCisKK2NvbnN0IFRJbnQgS01heFZvbHVtZSgyNTYpOworCitMT0NBTF9DIFRJbnQgR2V0U2FtcGxlUmF0ZShUSW50IGFSYXRlKQorICAgIHsKKyAgICBzd2l0Y2goYVJhdGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSA4MDAwOiByZXR1cm4gVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFU2FtcGxlUmF0ZTgwMDBIejsKKyAgICAgICAgY2FzZSAxMTAyNTogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RVNhbXBsZVJhdGUxMTAyNUh6OworICAgICAgICBjYXNlIDEyMDAwOiByZXR1cm4gVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFU2FtcGxlUmF0ZTEyMDAwSHo7CisgICAgICAgIGNhc2UgMTYwMDA6IHJldHVybiBUTWRhQXVkaW9EYXRhU2V0dGluZ3M6OkVTYW1wbGVSYXRlMTYwMDBIejsKKyAgICAgICAgY2FzZSAyMjA1MDogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RVNhbXBsZVJhdGUyMjA1MEh6OworICAgICAgICBjYXNlIDI0MDAwOiByZXR1cm4gVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFU2FtcGxlUmF0ZTI0MDAwSHo7CisgICAgICAgIGNhc2UgMzIwMDA6IHJldHVybiBUTWRhQXVkaW9EYXRhU2V0dGluZ3M6OkVTYW1wbGVSYXRlMzIwMDBIejsKKyAgICAgICAgY2FzZSA0NDEwMDogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RVNhbXBsZVJhdGU0NDEwMEh6OworICAgICAgICBjYXNlIDQ4MDAwOiByZXR1cm4gVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFU2FtcGxlUmF0ZTQ4MDAwSHo7CisgICAgICAgIGNhc2UgOTYwMDA6IHJldHVybiBUTWRhQXVkaW9EYXRhU2V0dGluZ3M6OkVTYW1wbGVSYXRlOTYwMDBIejsKKyAgICAgICAgY2FzZSA2NDAwMDogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RVNhbXBsZVJhdGU2NDAwMEh6OworICAgICAgICB9CisgICAgcmV0dXJuIEtFcnJOb3RGb3VuZDsKKyAgICB9CisKK0xPQ0FMX0MgVEludCBHZXRDaGFubmVscyhUSW50IGFDaGFubmVscykKKyAgICB7CisgICAgc3dpdGNoKGFDaGFubmVscykKKyAgICAgICAgeworICAgICAgICBjYXNlIDE6IHJldHVybiBUTWRhQXVkaW9EYXRhU2V0dGluZ3M6OkVDaGFubmVsc01vbm87CisgICAgICAgIGNhc2UgMjogcmV0dXJuIFRNZGFBdWRpb0RhdGFTZXR0aW5nczo6RUNoYW5uZWxzU3RlcmVvOworICAgICAgICB9CisgICAgcmV0dXJuIEtFcnJOb3RGb3VuZDsKKyAgICB9CisgICAgCitUSW50IENTdHJlYW1QbGF5ZXI6OkNsb3Nlc3RTdXBwb3J0ZWRSYXRlKFRJbnQgYVJhdGUpCisJeworCWlmKGFSYXRlID4gOTYwMDApCisJCXJldHVybiA5NjAwMDsKKwlUSW50IHJhdGUgPSBhUmF0ZTsKKwl3aGlsZShHZXRTYW1wbGVSYXRlKHJhdGUpID09IEtFcnJOb3RGb3VuZCkKKwkJeworCQkrK3JhdGU7CisJCX0KKwlyZXR1cm4gcmF0ZTsKKwl9CisKK0NTdHJlYW1QbGF5ZXI6OkNTdHJlYW1QbGF5ZXIoTVN0cmVhbVByb3ZpZGVyJiBhUHJvdmlkZXIsICBNU3RyZWFtT2JzJiBhT2JzKSA6CisgaVByb3ZpZGVyKGFQcm92aWRlciksIGlPYnMoYU9icyksIGlWb2x1bWUoS01heFZvbHVtZSkKKwl7CQorCX0KKwkJCitDU3RyZWFtUGxheWVyOjp+Q1N0cmVhbVBsYXllcigpCisJeworCWlTdGF0ZSB8PSBFRGllZDsKKwlpZihpU3RhdGUgJiBFSW5pdGVkKQorCQlDbG9zZSgpOworCVVzZXI6OkFmdGVyKDEwMDAwMCk7IC8vd2FpdCBidWZmZXIgdG8gYmUgZmx1c2hlZAorCUFTU0VSVChpUHRyLkxlbmd0aCgpID09IDApOworCWRlbGV0ZSBpU3RyZWFtOworCX0KKwkJCisJCQordm9pZCBDU3RyZWFtUGxheWVyOjpDb25zdHJ1Y3RMKCkKKwl7CisJaVN0cmVhbSA9IENNZGFBdWRpb091dHB1dFN0cmVhbTo6TmV3TCgqdGhpcywgRU1kYVByaW9yaXR5TWF4KTsKKwlpU2lsZW5jZS5TZXRNYXgoKTsKKwlpU2lsZW5jZS5GaWxsWigpOworCX0KKwkJCisKK1RJbnQgQ1N0cmVhbVBsYXllcjo6T3BlblN0cmVhbShUSW50IGFSYXRlLCBUSW50IGFDaGFubmVscywgVFVpbnQzMiBhVHlwZSkKKwl7CisJQ2xvc2UoKTsKKwkKKwlpVHlwZSA9IGFUeXBlOworCQorCWlSYXRlID0gR2V0U2FtcGxlUmF0ZShhUmF0ZSk7CisJaWYoaVJhdGUgPT0gS0Vyck5vdEZvdW5kKQorCQlyZXR1cm4gS0Vyck5vdFN1cHBvcnRlZDsKKwkKKwlpQ2hhbm5lbHMgPSBHZXRDaGFubmVscyhhQ2hhbm5lbHMpOworCWlmKGlDaGFubmVscyA9PSBLRXJyTm90Rm91bmQpCisJCXJldHVybiBLRXJyTm90U3VwcG9ydGVkOworCQorCU9wZW4oKTsKKyAgICAKKyAgICByZXR1cm4gS0Vyck5vbmU7CisJfQorCisKK1RJbnQgQ1N0cmVhbVBsYXllcjo6TWF4Vm9sdW1lKCkgY29uc3QKKwl7CisJcmV0dXJuIEtNYXhWb2x1bWU7CisJfQorCit2b2lkIENTdHJlYW1QbGF5ZXI6OlNldFZvbHVtZShUSW50IGFOZXcpCisgICAgeworICAgIAorICAgIGNvbnN0IFRJbnQgbWF4aSA9IE1heFZvbHVtZSgpOworICAgIGlmKGFOZXcgPiBtYXhpKQorCQlyZXR1cm47CisgICAgaWYoYU5ldyA8IDApCisgICAgCXJldHVybjsKKyAgICAKKyAgICBpVm9sdW1lID0gYU5ldzsKKyAgICAKKyAgICBpU3RhdGUgfD0gRVZvbHVtZUNoYW5nZTsKKyAgICB9CisgICAgCisgVEludCBDU3RyZWFtUGxheWVyOjpWb2x1bWUoKSBjb25zdAorICAgIHsKKwlyZXR1cm4gaVZvbHVtZTsKKyAgICB9CisKK3ZvaWQgQ1N0cmVhbVBsYXllcjo6T3BlbigpCisJeworCVRNZGFBdWRpb0RhdGFTZXR0aW5ncyBhdWRpb1NldHRpbmdzOworCWF1ZGlvU2V0dGluZ3MuUXVlcnkoKTsKKyAgICBhdWRpb1NldHRpbmdzLmlDYXBzID0gVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFUmVhbFRpbWUgfAorICAgICAJVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFU2FtcGxlUmF0ZUZpeGVkOyAKKyAgICBhdWRpb1NldHRpbmdzLmlTYW1wbGVSYXRlID0gaVJhdGU7IAorICAgIGF1ZGlvU2V0dGluZ3MuaUNoYW5uZWxzID0gaUNoYW5uZWxzOworCWF1ZGlvU2V0dGluZ3MuaUZsYWdzID0gVE1kYUF1ZGlvRGF0YVNldHRpbmdzOjpFTm9OZXR3b3JrUm91dGluZzsKKwlhdWRpb1NldHRpbmdzLmlWb2x1bWUgPSAwOworCQorCWlTdGF0ZSAmPSB+RVN0b3BwZWQ7CisgICAgaVN0cmVhbS0+T3BlbigmYXVkaW9TZXR0aW5ncyk7ICAgIAorCX0KKwkKK3ZvaWQgQ1N0cmVhbVBsYXllcjo6U3RvcCgpCisJeworCWlmKGlTdGF0ZSAmIChFU3RhcnRlZCB8IEVJbml0ZWQpKQorCQl7CisJCUNsb3NlKCk7CisJCWlTdGF0ZSB8PSBFU3RvcHBlZDsKKwkJfQorCX0KKwkKK3ZvaWQgQ1N0cmVhbVBsYXllcjo6U3RhcnQoKQorCXsKKwlpZihpUHRyLkxlbmd0aCgpID09IDApCisJCXsKKwkJaVN0YXRlIHw9IEVTdGFydGVkOworCQlpZihpU3RhdGUgJiBFSW5pdGVkKQorCQkJeworCQkJUmVxdWVzdCgpOworCQkJfQorCQllbHNlIGlmKGlTdGF0ZSAmIEVTdG9wcGVkKQorCQkJeworCQkJT3BlbigpOworCQkJfQorCQl9CisJfQorCit2b2lkIENTdHJlYW1QbGF5ZXI6OkNsb3NlKCkKKwl7CisJaVN0YXRlICY9IH5FSW5pdGVkOworCWlTdHJlYW0tPlN0b3AoKTsKKwlpU3RhdGUgJj0gfkVTdGFydGVkOworCX0KKwkKK3ZvaWQgQ1N0cmVhbVBsYXllcjo6UmVxdWVzdCgpCisJeworCWlmKGlTdGF0ZSAmIEVJbml0ZWQpCisJCXsKKwkJaVB0ci5TZXQoS051bGxEZXNDOCk7CisJCQorCQlpZihpU3RhdGUgJiBFVm9sdW1lQ2hhbmdlKQorCQkJeworICAgICAgIAkJY29uc3QgVFJlYWwgbmV3Vm9sID0gaVZvbHVtZTsKKyAgICAgICAJCWNvbnN0IFRSZWFsIG5ld01heCA9IE1heFZvbHVtZSgpOworICAgICAgIAkJY29uc3QgVEludCBtYXhWb2wgPSBpU3RyZWFtLT5NYXhWb2x1bWUoKTsKKyAgICAgICAJCWNvbnN0IFRSZWFsIG1heCA9IHN0YXRpY19jYXN0PFRSZWFsPihtYXhWb2wpOworICAgICAgIAkJY29uc3QgVFJlYWwgbmV3dm9sdW1lID0gKG5ld1ZvbCAqIG1heCkgLyBuZXdNYXg7CisgICAgICAgCQljb25zdCBUSW50IHZvbCA9IHN0YXRpY19jYXN0PFRSZWFsPihuZXd2b2x1bWUpOworICAgICAgIAkJaVN0cmVhbS0+U2V0Vm9sdW1lKHZvbCk7CisJCQlpU3RhdGUgJj0gfkVWb2x1bWVDaGFuZ2U7CisJCQl9CisJCQkKKwkJaWYoaVN0YXRlICYgRVN0YXJ0ZWQpCisJCQl7CisJIAkJaVB0ci5TZXQoaVByb3ZpZGVyLkRhdGEoKSk7CisJCQl9CisJCWlmKGlQdHIuTGVuZ3RoKCkgPT0gMCkKKwkJCXsKKwkJCWlQdHIuU2V0KGlTaWxlbmNlKTsKKwkJCX0KKwkJVFJBUEQoZXJyLCBpU3RyZWFtLT5Xcml0ZUwoaVB0cikpOworCQlpZihlcnIgIT0gS0Vyck5vbmUpCisJCQl7CisJCQlpT2JzLkNvbXBsZXRlKE1TdHJlYW1PYnM6OkVXcml0ZSwgZXJyKTsJCisJCQl9CisJLyoJZWxzZQorCQkJeworCQkJaVByb3ZpZGVyLldyaXR0ZW4oaVB0ci5MZW5ndGgoKSk7CisJCQl9Ki8KKwkJfQorCX0KKwkKKwordm9pZCBDU3RyZWFtUGxheWVyOjpTZXRDYXBzTCgpCisJeworCWlTdHJlYW0tPlNldERhdGFUeXBlTChpVHlwZSk7CisJaVN0cmVhbS0+U2V0QXVkaW9Qcm9wZXJ0aWVzTChpUmF0ZSwgaUNoYW5uZWxzKTsKKwl9CisKK3ZvaWQgQ1N0cmVhbVBsYXllcjo6TWFvc2NPcGVuQ29tcGxldGUoVEludCBhRXJyb3IpIAorCXsKKwlpZihhRXJyb3IgPT0gS0Vyck5vbmUpCisJCXsKKwkJVFJBUEQoZXJyLCBTZXRDYXBzTCgpKTsKKyAgICAJaWYoZXJyID09IEtFcnJOb25lKQorICAgIAkJeworICAgIAkJaVN0cmVhbS0+U2V0UHJpb3JpdHkoRVByaW9yaXR5Tm9ybWFsLCBFTWRhUHJpb3JpdHlQcmVmZXJlbmNlVGltZSk7CisgICAgCQlpU3RhdGUgfD0gRUluaXRlZDsKKyAgICAJCQorICAgIAkJCisgICAgICAgIAlTZXRWb2x1bWUoVm9sdW1lKCkpOwkKKyAgICAJCQorICAgIAkJaWYoaVN0YXRlICYgRVN0YXJ0ZWQpCisgICAgCQkJeworICAgIAkJCVJlcXVlc3QoKTsKKyAgICAJCQl9CisgICAgCQkJCisJCQl9CisJCWFFcnJvciA9IGVycjsKKwkJfQorCWlmKCEoaVN0YXRlICYgRURpZWQpKQorCQlpT2JzLkNvbXBsZXRlKE1TdHJlYW1PYnM6OkVJbml0LCBhRXJyb3IpOworCX0KKwkKK3ZvaWQgQ1N0cmVhbVBsYXllcjo6TWFvc2NCdWZmZXJDb3BpZWQoVEludCBhRXJyb3IsIGNvbnN0IFREZXNDOCYgLyphQnVmZmVyKi8pCisJeworCWlQdHIuU2V0KEtOdWxsRGVzQzgpOworCWlmKGFFcnJvciA9PSBLRXJyTm9uZSkKKwkJeworCQlpZihpU3RhdGUgJiBFSW5pdGVkKQorCQkJUmVxdWVzdCgpOworCQllbHNlCisJCQlpU3RyZWFtLT5TdG9wKCk7CisJCX0KKwllbHNlIGlmKCEoaVN0YXRlICYgRURpZWQpKQorCQlpT2JzLkNvbXBsZXRlKE1TdHJlYW1PYnM6OkVQbGF5LCBhRXJyb3IpOworCX0KKwkKK3ZvaWQgQ1N0cmVhbVBsYXllcjo6TWFvc2NQbGF5Q29tcGxldGUoVEludCBhRXJyb3IpCisJewkKKwlpUHRyLlNldChLTnVsbERlc0M4KTsKKwlpU3RhdGUgJj0gfkVTdGFydGVkOworCWlmKCEoaVN0YXRlICYgRURpZWQpKQorCQlpT2JzLkNvbXBsZXRlKE1TdHJlYW1PYnM6OkVDbG9zZSwgYUVycm9yKTsKKwl9CisJCitUQm9vbCBDU3RyZWFtUGxheWVyOjpQbGF5aW5nKCkgY29uc3QKKwl7CisJcmV0dXJuIChpU3RhdGUgJiBFSW5pdGVkKSAmJiAoaVN0YXRlICYgRVN0YXJ0ZWQpOworCX0KKworVEJvb2wgQ1N0cmVhbVBsYXllcjo6Q2xvc2VkKCkgY29uc3QKKwl7CisJcmV0dXJuICEoaVN0YXRlICYgRUluaXRlZCkgJiYgIShpU3RhdGUgJiBFRGllZCk7CisJfQorCQorCS8qCit2b2lkIENTdHJlYW1QbGF5ZXI6OlJlcXVlc3QoKQorCXsKKwlTZXRBY3RpdmUoKTsKKwlUUmVxdWVzdFN0YXR1cyogcyA9ICZpU3RhdHVzOworCVVzZXI6OlJlcXVlc3RDb21wbGV0ZShzLCBLRXJyTm9uZSk7CisJfQorCS8vCQlpVGltZXIuQWZ0ZXIoMCk7CisJKi8KKwkKKworCisKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9zeW1iaWFuL3N0cmVhbXBsYXllci5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby9zeW1iaWFuL3N0cmVhbXBsYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNmU3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3N5bWJpYW4vc3RyZWFtcGxheWVyLmgKQEAgLTAsMCArMSw4OSBAQAorI2lmbmRlZiBTVFJFQU1QTEFZRVJfSAorI2RlZmluZSBTVFJFQU1QTEFZRVJfSAorCisjaW5jbHVkZTxNZGFBdWRpb091dHB1dFN0cmVhbS5oPgorCitjb25zdCBUSW50IEtTaWxlbmNlQnVmZmVyID0gMjU2OworCitjbGFzcyBNU3RyZWFtT2JzCisgICAgeworICAgIHB1YmxpYzoKKyAgICAJZW51bSAKKyAgICAJeworICAgIAlFSW5pdCwgCisgICAgCUVQbGF5LAorICAgIAlFV3JpdGUsCisgICAgCUVDbG9zZSwJCisgICAgCX07CisgICAgICAgIHZpcnR1YWwgdm9pZCBDb21wbGV0ZShUSW50IGFTdGF0ZSwgVEludCBhRXJyb3IpID0gMDsKKyAgICB9OworCitjbGFzcyBNU3RyZWFtUHJvdmlkZXIKKwl7CisJcHVibGljOgorCQl2aXJ0dWFsIFRQdHJDOCBEYXRhKCkgPSAwOwkKKwl9OworCitOT05TSEFSQUJMRV9DTEFTUyhDU3RyZWFtUGxheWVyKSA6IHB1YmxpYyBDQmFzZSwgcHVibGljIE1NZGFBdWRpb091dHB1dFN0cmVhbUNhbGxiYWNrCisJeworCXB1YmxpYzoKKwkJQ1N0cmVhbVBsYXllcihNU3RyZWFtUHJvdmlkZXImIGFQcm92aWRlciwgTVN0cmVhbU9icyYgYU9icyk7CisJCX5DU3RyZWFtUGxheWVyKCk7CisJCXZvaWQgQ29uc3RydWN0TCgpOworCQkKKwkJc3RhdGljIFRJbnQgQ2xvc2VzdFN1cHBvcnRlZFJhdGUoVEludCBhUmF0ZSk7CisJCQorCQlUSW50IE9wZW5TdHJlYW0oVEludCBhUmF0ZSwgVEludCBhQ2hhbm5lbHMsIFRVaW50MzIgYVR5cGUgPSBLTU1GRm91ckNDQ29kZVBDTTE2KTsKKwkJCisJCXZvaWQgU2V0Vm9sdW1lKFRJbnQgYU5ldyk7CisJCVRJbnQgVm9sdW1lKCkgY29uc3Q7CisJCVRJbnQgTWF4Vm9sdW1lKCkgY29uc3Q7CisJCQorCQl2b2lkIFN0b3AoKTsKKwkJdm9pZCBTdGFydCgpOworCQl2b2lkIE9wZW4oKTsKKwkJdm9pZCBDbG9zZSgpOworCQkKKwkJVEJvb2wgUGxheWluZygpIGNvbnN0OworCQlUQm9vbCBDbG9zZWQoKSBjb25zdDsKKwkJCisJcHJpdmF0ZToKKworCQl2b2lkIE1hb3NjT3BlbkNvbXBsZXRlKFRJbnQgYUVycm9yKSA7CisJCXZvaWQgTWFvc2NCdWZmZXJDb3BpZWQoVEludCBhRXJyb3IsIGNvbnN0IFREZXNDOCYgYUJ1ZmZlcik7CisJCXZvaWQgTWFvc2NQbGF5Q29tcGxldGUoVEludCBhRXJyb3IpOworCQorCXByaXZhdGU6CisJCXZvaWQgUmVxdWVzdCgpOworCQl2b2lkIFNldENhcHNMKCk7CisKKwlwcml2YXRlOgorCQlNU3RyZWFtUHJvdmlkZXImIGlQcm92aWRlcjsKKwkJTVN0cmVhbU9icyYgaU9iczsJCisJCVRJbnQgaVZvbHVtZTsKKwkKKwkJQ01kYUF1ZGlvT3V0cHV0U3RyZWFtKiBpU3RyZWFtOworCQorCQlUSW50IGlSYXRlOworCQlUSW50IGlDaGFubmVsczsKKwkJVFVpbnQzMiBpVHlwZTsKKwkJCisJCWVudW0gCisJCQl7CisJCQkJRU5vbmUgPSAwLAorCQkJCUVJbml0ZWQgPSAweDEsCisJCQkJRVN0YXJ0ZWQgPSAweDIsCisJCQkJRVN0b3BwZWQgPSAweDQsCisJCQkJRVZvbHVtZUNoYW5nZSA9IDB4OCwKKwkJCQlFRGllZAkJICA9IDB4MTAKKwkJCX07CisJCQorCQlUSW50IGlTdGF0ZTsKKwkJVEJ1Zjg8S1NpbGVuY2VCdWZmZXI+IGlTaWxlbmNlOworCQlUUHRyQzggaVB0cjsKKwkKKwl9OworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3Vtcy9TRExfdW1zYXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vdW1zL1NETF91bXNhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ODg5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3Vtcy9TRExfdW1zYXVkaW8uYwpAQCAtMCwwICsxLDU0NyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIENhcnN0ZW4gR3Jpd29kegorICAgIGdyaWZmQGtvbS50dS1kYXJtc3RhZHQuZGUKKworICAgIGJhc2VkIG9uIGxpbnV4L1NETF9kc3BhdWRpby5jIGJ5IFNhbSBMYW50aW5nYQorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb2Rldl9jLmgiCisjaW5jbHVkZSAiU0RMX3Vtc2F1ZGlvLmgiCisKKy8qIFRoZSB0YWcgbmFtZSB1c2VkIGJ5IFVNUyBhdWRpbyAqLworI2RlZmluZSBVTVNfRFJJVkVSX05BTUUgICAgICAgICAidW1zIgorCisjZGVmaW5lIERFQlVHX0FVRElPIDEKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBVTVNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIFVNU19QbGF5QXVkaW8oX1RISVMpOworc3RhdGljIFVpbnQ4ICpVTVNfR2V0QXVkaW9CdWYoX1RISVMpOworc3RhdGljIHZvaWQgVU1TX0Nsb3NlQXVkaW8oX1RISVMpOworCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURPcGVuKF9USElTLCAgc3RyaW5nIGRldmljZSwgc3RyaW5nIG1vZGUsIGxvbmcgZmxhZ3MpOworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEQ2xvc2UoX1RISVMpOworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFER2V0Qml0c1BlclNhbXBsZShfVEhJUywgbG9uZyogYml0cyk7CitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRCaXRzUGVyU2FtcGxlKF9USElTLCBsb25nIGJpdHMpOworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0U2FtcGxlUmF0ZShfVEhJUywgbG9uZyByYXRlLCBsb25nKiBzZXRfcmF0ZSk7CitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRCeXRlT3JkZXIoX1RISVMsIHN0cmluZyBieXRlX29yZGVyKTsKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldEF1ZGlvRm9ybWF0VHlwZShfVEhJUywgc3RyaW5nIGZtdCk7CitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXROdW1iZXJGb3JtYXQoX1RISVMsIHN0cmluZyBmbXQpOworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFESW5pdGlhbGl6ZShfVEhJUyk7CitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTdGFydChfVEhJUyk7CitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTdG9wKF9USElTKTsKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldFRpbWVGb3JtYXQoX1RISVMsICBVTVNBdWRpb1R5cGVzX1RpbWVGb3JtYXQgZm10ICk7CitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZUJ1ZmZTaXplKF9USElTLCAgbG9uZyogYnVmZl9zaXplICk7CitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZUJ1ZmZSZW1haW4oX1RISVMsICBsb25nKiBidWZmX3NpemUgKTsKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFdyaXRlQnVmZlVzZWQoX1RISVMsICBsb25nKiBidWZmX3NpemUgKTsKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldERNQUJ1ZmZlclNpemUoX1RISVMsICBsb25nIGJ5dGVzLCBsb25nKiBieXRlc19yZXQgKTsKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldFZvbHVtZShfVEhJUywgIGxvbmcgdm9sdW1lICk7CitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRCYWxhbmNlKF9USElTLCAgbG9uZyBiYWxhbmNlICk7CitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRDaGFubmVscyhfVEhJUywgIGxvbmcgY2hhbm5lbHMgKTsKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFBsYXlSZW1haW5pbmdEYXRhKF9USElTLCAgYm9vbGVhbiBibG9jayApOworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFERW5hYmxlT3V0cHV0KF9USElTLCAgc3RyaW5nIG91dHB1dCwgbG9uZyogbGVmdF9nYWluLCBsb25nKiByaWdodF9nYWluKTsKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFdyaXRlKF9USElTLCAgVU1TQXVkaW9UeXBlc19CdWZmZXIqIGJ1ZmYsIGxvbmcgc2FtcGxlcywgbG9uZyogc2FtcGxlc193cml0dGVuKTsKKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgQXVkaW9fQXZhaWxhYmxlKHZvaWQpCit7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShfVEhJUykKK3sKKyAgICBpZih0aGlzLT5oaWRkZW4tPnBsYXlidWYuX2J1ZmZlcikgU0RMX2ZyZWUodGhpcy0+aGlkZGVuLT5wbGF5YnVmLl9idWZmZXIpOworICAgIGlmKHRoaXMtPmhpZGRlbi0+ZmlsbGJ1Zi5fYnVmZmVyKSBTRExfZnJlZSh0aGlzLT5oaWRkZW4tPmZpbGxidWYuX2J1ZmZlcik7CisgICAgX3NvbUZyZWUoIHRoaXMtPmhpZGRlbi0+dW1zZGV2ICk7CisgICAgU0RMX2ZyZWUodGhpcy0+aGlkZGVuKTsKKyAgICBTRExfZnJlZSh0aGlzKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKyAgICBTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKyAgICAvKgorICAgICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG1hbmFnZW1lbnQgc3RvcmFnZSBhbmQgcHJpdmF0ZSBtYW5hZ2VtZW50CisgICAgICogc3RvcmFnZSBmb3IgdGhpcyBTREwtdXNpbmcgbGlicmFyeS4KKyAgICAgKi8KKyAgICB0aGlzID0gKFNETF9BdWRpb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9BdWRpb0RldmljZSkpOworICAgIGlmICggdGhpcyApIHsKKyAgICAgICAgU0RMX21lbXNldCh0aGlzLCAwLCAoc2l6ZW9mICp0aGlzKSk7CisgICAgICAgIHRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEgKilTRExfbWFsbG9jKChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworICAgIH0KKyAgICBpZiAoICh0aGlzID09IE5VTEwpIHx8ICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICBpZiAoIHRoaXMgKSB7CisgICAgICAgICAgICBTRExfZnJlZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKyNpZmRlZiBERUJVR19BVURJTworICAgIGZwcmludGYoc3RkZXJyLCAiQ3JlYXRpbmcgVU1TIEF1ZGlvIGRldmljZVxuIik7CisjZW5kaWYKKworICAgIC8qCisgICAgICogQ2FsbHMgZm9yIFVNUyBlbnYgaW5pdGlhbGl6YXRpb24gYW5kIGF1ZGlvIG9iamVjdCBjb25zdHJ1Y3Rpb24uCisgICAgICovCisgICAgdGhpcy0+aGlkZGVuLT5ldiAgICAgPSBzb21HZXRHbG9iYWxFbnZpcm9ubWVudCgpOworICAgIHRoaXMtPmhpZGRlbi0+dW1zZGV2ID0gVU1TQXVkaW9EZXZpY2VOZXcoKTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycy4KKyAgICAgKi8KKyAgICB0aGlzLT5PcGVuQXVkaW8gICA9IFVNU19PcGVuQXVkaW87CisgICAgdGhpcy0+V2FpdEF1ZGlvICAgPSBOVUxMOyAgICAgICAgICAgLyogd2UgZG8gYmxvY2tpbmcgb3V0cHV0ICovCisgICAgdGhpcy0+UGxheUF1ZGlvICAgPSBVTVNfUGxheUF1ZGlvOworICAgIHRoaXMtPkdldEF1ZGlvQnVmID0gVU1TX0dldEF1ZGlvQnVmOworICAgIHRoaXMtPkNsb3NlQXVkaW8gID0gVU1TX0Nsb3NlQXVkaW87CisgICAgdGhpcy0+ZnJlZSAgICAgICAgPSBBdWRpb19EZWxldGVEZXZpY2U7CisKKyNpZmRlZiBERUJVR19BVURJTworICAgIGZwcmludGYoc3RkZXJyLCAiZG9uZVxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gdGhpczsKK30KKworQXVkaW9Cb290U3RyYXAgVU1TX2Jvb3RzdHJhcCA9IHsKKwlVTVNfRFJJVkVSX05BTUUsICJBSVggVU1TIGF1ZGlvIiwKKwlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworc3RhdGljIFVpbnQ4ICpVTVNfR2V0QXVkaW9CdWYoX1RISVMpCit7CisjaWZkZWYgREVCVUdfQVVESU8KKyAgICBmcHJpbnRmKHN0ZGVyciwgImVudGVyIFVNU19HZXRBdWRpb0J1ZlxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gdGhpcy0+aGlkZGVuLT5maWxsYnVmLl9idWZmZXI7CisvKgorICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZTsKKyAgICBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIHJjOworCisgICAgcmMgPSBVQURTZXRUaW1lRm9ybWF0KHRoaXMsIFVNU0F1ZGlvVHlwZXNfQnl0ZXMgKTsKKyAgICByYyA9IFVBRFdyaXRlQnVmZlNpemUodGhpcywgIGJ1ZlNpemUgKTsKKyovCit9CisKK3N0YXRpYyB2b2lkIFVNU19DbG9zZUF1ZGlvKF9USElTKQoreworICAgIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgcmM7CisKKyNpZmRlZiBERUJVR19BVURJTworICAgIGZwcmludGYoc3RkZXJyLCAiZW50ZXIgVU1TX0Nsb3NlQXVkaW9cbiIpOworI2VuZGlmCisgICAgcmMgPSBVQURQbGF5UmVtYWluaW5nRGF0YSh0aGlzLCBUUlVFKTsKKyAgICByYyA9IFVBRFN0b3AodGhpcyk7CisgICAgcmMgPSBVQURDbG9zZSh0aGlzKTsKK30KKworc3RhdGljIHZvaWQgVU1TX1BsYXlBdWRpbyhfVEhJUykKK3sKKyAgICBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIHJjOworICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1RvV3JpdGU7CisgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzV3JpdHRlbjsKKyAgICBVTVNBdWRpb1R5cGVzX0J1ZmZlciAgICAgIHN3cGJ1ZjsKKworI2lmZGVmIERFQlVHX0FVRElPCisgICAgZnByaW50ZihzdGRlcnIsICJlbnRlciBVTVNfUGxheUF1ZGlvXG4iKTsKKyNlbmRpZgorICAgIHNhbXBsZXNUb1dyaXRlID0gdGhpcy0+aGlkZGVuLT5wbGF5YnVmLl9sZW5ndGgvdGhpcy0+aGlkZGVuLT5ieXRlc1BlclNhbXBsZTsKKyAgICBkbworICAgIHsKKyAgICAgICAgcmMgPSBVQURXcml0ZSh0aGlzLCAgJnRoaXMtPmhpZGRlbi0+cGxheWJ1ZiwKKwkJICAgICAgIHNhbXBsZXNUb1dyaXRlLAorCSAgICAgICAgICAgICAgICZzYW1wbGVzV3JpdHRlbiApOworCXNhbXBsZXNUb1dyaXRlIC09IHNhbXBsZXNXcml0dGVuOworCisJLyogcmMgdmFsdWVzOiBVTVNBdWRpb0RldmljZV9TdWNjZXNzCisJICogICAgICAgICAgICBVTVNBdWRpb0RldmljZV9GYWlsdXJlCisJICogICAgICAgICAgICBVTVNBdWRpb0RldmljZV9QcmVlbXB0ZWQKKwkgKiAgICAgICAgICAgIFVNU0F1ZGlvRGV2aWNlX0ludGVycnVwdGVkCisJICogICAgICAgICAgICBVTVNBdWRpb0RldmljZV9EZXZpY2VFcnJvcgorCSAqLworCWlmICggcmMgPT0gVU1TQXVkaW9EZXZpY2VfRGV2aWNlRXJyb3IgKSB7CisjaWZkZWYgREVCVUdfQVVESU8KKwkgICAgZnByaW50ZihzdGRlcnIsICJSZXR1cm5pbmcgZnJvbSBQbGF5QXVkaW8gd2l0aCBkZXZpY2VzIGVycm9yXG4iKTsKKyNlbmRpZgorCSAgICByZXR1cm47CisJfQorICAgIH0KKyAgICB3aGlsZShzYW1wbGVzVG9Xcml0ZT4wKTsKKworICAgIFNETF9Mb2NrQXVkaW8oKTsKKyAgICBTRExfbWVtY3B5KCAmc3dwYnVmLCAgICAgICAgICAgICAgICAmdGhpcy0+aGlkZGVuLT5wbGF5YnVmLCBzaXplb2YoVU1TQXVkaW9UeXBlc19CdWZmZXIpICk7CisgICAgU0RMX21lbWNweSggJnRoaXMtPmhpZGRlbi0+cGxheWJ1ZiwgJnRoaXMtPmhpZGRlbi0+ZmlsbGJ1Ziwgc2l6ZW9mKFVNU0F1ZGlvVHlwZXNfQnVmZmVyKSApOworICAgIFNETF9tZW1jcHkoICZ0aGlzLT5oaWRkZW4tPmZpbGxidWYsICZzd3BidWYsICAgICAgICAgICAgICAgIHNpemVvZihVTVNBdWRpb1R5cGVzX0J1ZmZlcikgKTsKKyAgICBTRExfVW5sb2NrQXVkaW8oKTsKKworI2lmZGVmIERFQlVHX0FVRElPCisgICAgZnByaW50ZihzdGRlcnIsICJXcm90ZSBhdWRpbyBkYXRhIGFuZCBzd2FwcGVkIGJ1ZmZlclxuIik7CisjZW5kaWYKK30KKworI2lmIDAKKy8vIAkvKiBTZXQgdGhlIERTUCBmcmVxdWVuY3kgKi8KKy8vIAl2YWx1ZSA9IHNwZWMtPmZyZXE7CisvLyAJaWYgKCBpb2N0bCh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCBTT1VORF9QQ01fV1JJVEVfUkFURSwgJnZhbHVlKSA8IDAgKSB7CisvLyAJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGF1ZGlvIGZyZXF1ZW5jeSIpOworLy8gCQlyZXR1cm4oLTEpOworLy8gCX0KKy8vIAlzcGVjLT5mcmVxID0gdmFsdWU7CisjZW5kaWYKKworc3RhdGljIGludCBVTVNfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworICAgIGNoYXIqICBhdWRpb2RldiA9ICIvZGV2L3BhdWQwIjsKKyAgICBsb25nICAgbGdhaW47CisgICAgbG9uZyAgIHJnYWluOworICAgIGxvbmcgICBvdXRSYXRlOworICAgIGxvbmcgICBvdXRCdWZTaXplOworICAgIGxvbmcgICBiaXRzUGVyU2FtcGxlOworICAgIGxvbmcgICBzYW1wbGVzUGVyU2VjOworICAgIGxvbmcgICBzdWNjZXNzOworICAgIFVpbnQxNiB0ZXN0X2Zvcm1hdDsKKyAgICBpbnQgICAgZnJhZ19zcGVjOworICAgIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgcmM7CisKKyNpZmRlZiBERUJVR19BVURJTworICAgIGZwcmludGYoc3RkZXJyLCAiZW50ZXIgVU1TX09wZW5BdWRpb1xuIik7CisjZW5kaWYKKyAgICByYyA9IFVBRE9wZW4odGhpcywgYXVkaW9kZXYsIlBMQVkiLCBVTVNBdWRpb0RldmljZV9CbG9ja2luZ0lPKTsKKyAgICBpZiAoIHJjICE9IFVNU0F1ZGlvRGV2aWNlX1N1Y2Nlc3MgKSB7CisJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuICVzOiAlcyIsIGF1ZGlvZGV2LCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAtMTsKKyAgICB9CisgCisgICAgcmMgPSBVQURTZXRBdWRpb0Zvcm1hdFR5cGUodGhpcywgIlBDTSIpOyAKKworICAgIHN1Y2Nlc3MgPSAwOworICAgIHRlc3RfZm9ybWF0ID0gU0RMX0ZpcnN0QXVkaW9Gb3JtYXQoc3BlYy0+Zm9ybWF0KTsKKyAgICBkbworICAgIHsKKyNpZmRlZiBERUJVR19BVURJTworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyBmb3JtYXQgMHglNC40eFxuIiwgdGVzdF9mb3JtYXQpOworI2VuZGlmCisgICAgICAgIHN3aXRjaCAoIHRlc3RfZm9ybWF0ICkKKyAgICAgICAgeworICAgICAgICBjYXNlIEFVRElPX1U4OgorLyogZnJvbSB0aGUgbWFjIGNvZGU6IGJldHRlciA/ICovCisvKiBzYW1wbGVfYml0cyA9IHNwZWMtPnNpemUgLyBzcGVjLT5zYW1wbGVzIC8gc3BlYy0+Y2hhbm5lbHMgKiA4OyAqLworCSAgICBzdWNjZXNzICAgICAgID0gMTsKKyAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUgPSA4OworICAgICAgICAgICAgcmMgPSBVQURTZXRTYW1wbGVSYXRlKHRoaXMsICBzcGVjLT5mcmVxIDw8IDE2LCAmb3V0UmF0ZSApOworICAgICAgICAgICAgcmMgPSBVQURTZXRCeXRlT3JkZXIodGhpcywgIk1TQiIpOyAgICAgICAvKiBpcnJlbGV2YW50ICovCisgICAgICAgICAgICByYyA9IFVBRFNldE51bWJlckZvcm1hdCh0aGlzLCAiVU5TSUdORUQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1M4OgorCSAgICBzdWNjZXNzICAgICAgID0gMTsKKyAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUgPSA4OworICAgICAgICAgICAgcmMgPSBVQURTZXRTYW1wbGVSYXRlKHRoaXMsICBzcGVjLT5mcmVxIDw8IDE2LCAmb3V0UmF0ZSApOworICAgICAgICAgICAgcmMgPSBVQURTZXRCeXRlT3JkZXIodGhpcywgIk1TQiIpOyAgICAgICAvKiBpcnJlbGV2YW50ICovCisgICAgICAgICAgICByYyA9IFVBRFNldE51bWJlckZvcm1hdCh0aGlzLCAiU0lHTkVEIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TMTZMU0I6CisJICAgIHN1Y2Nlc3MgICAgICAgPSAxOworICAgICAgICAgICAgYml0c1BlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcmMgPSBVQURTZXRTYW1wbGVSYXRlKHRoaXMsICBzcGVjLT5mcmVxIDw8IDE2LCAmb3V0UmF0ZSApOworICAgICAgICAgICAgcmMgPSBVQURTZXRCeXRlT3JkZXIodGhpcywgIkxTQiIpOworICAgICAgICAgICAgcmMgPSBVQURTZXROdW1iZXJGb3JtYXQodGhpcywgIlNJR05FRCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUzE2TVNCOgorCSAgICBzdWNjZXNzICAgICAgID0gMTsKKyAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHJjID0gVUFEU2V0U2FtcGxlUmF0ZSh0aGlzLCAgc3BlYy0+ZnJlcSA8PCAxNiwgJm91dFJhdGUgKTsKKyAgICAgICAgICAgIHJjID0gVUFEU2V0Qnl0ZU9yZGVyKHRoaXMsICJNU0IiKTsKKyAgICAgICAgICAgIHJjID0gVUFEU2V0TnVtYmVyRm9ybWF0KHRoaXMsICJTSUdORUQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1UxNkxTQjoKKwkgICAgc3VjY2VzcyAgICAgICA9IDE7CisgICAgICAgICAgICBiaXRzUGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICByYyA9IFVBRFNldFNhbXBsZVJhdGUodGhpcywgIHNwZWMtPmZyZXEgPDwgMTYsICZvdXRSYXRlICk7CisgICAgICAgICAgICByYyA9IFVBRFNldEJ5dGVPcmRlcih0aGlzLCAiTFNCIik7CisgICAgICAgICAgICByYyA9IFVBRFNldE51bWJlckZvcm1hdCh0aGlzLCAiVU5TSUdORUQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1UxNk1TQjoKKwkgICAgc3VjY2VzcyAgICAgICA9IDE7CisgICAgICAgICAgICBiaXRzUGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICByYyA9IFVBRFNldFNhbXBsZVJhdGUodGhpcywgIHNwZWMtPmZyZXEgPDwgMTYsICZvdXRSYXRlICk7CisgICAgICAgICAgICByYyA9IFVBRFNldEJ5dGVPcmRlcih0aGlzLCAiTVNCIik7CisgICAgICAgICAgICByYyA9IFVBRFNldE51bWJlckZvcm1hdCh0aGlzLCAiVU5TSUdORUQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIHN1Y2Nlc3MgKSB7CisgICAgICAgICAgICB0ZXN0X2Zvcm1hdCA9IFNETF9OZXh0QXVkaW9Gb3JtYXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoICEgc3VjY2VzcyAmJiB0ZXN0X2Zvcm1hdCApOworCisgICAgaWYgKCBzdWNjZXNzID09IDAgKSB7CisgICAgICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCBhbnkgaGFyZHdhcmUgYXVkaW8gZm9ybWF0cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3BlYy0+Zm9ybWF0ID0gdGVzdF9mb3JtYXQ7CisKKyAgICBmb3IgKCBmcmFnX3NwZWMgPSAwOyAoMHgwMTw8ZnJhZ19zcGVjKSA8IHNwZWMtPnNpemU7ICsrZnJhZ19zcGVjICk7CisgICAgaWYgKCAoMHgwMTw8ZnJhZ19zcGVjKSAhPSBzcGVjLT5zaXplICkgeworICAgICAgICBTRExfU2V0RXJyb3IoIkZyYWdtZW50IHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICggZnJhZ19zcGVjID4gMjA0OCApIGZyYWdfc3BlYyA9IDIwNDg7CisKKyAgICB0aGlzLT5oaWRkZW4tPmJ5dGVzUGVyU2FtcGxlICAgPSAoYml0c1BlclNhbXBsZSAvIDgpICogc3BlYy0+Y2hhbm5lbHM7CisgICAgc2FtcGxlc1BlclNlYyAgICAgICAgICAgICAgICAgID0gdGhpcy0+aGlkZGVuLT5ieXRlc1BlclNhbXBsZSAqIG91dFJhdGU7CisKKyAgICB0aGlzLT5oaWRkZW4tPnBsYXlidWYuX2xlbmd0aCAgPSAwOworICAgIHRoaXMtPmhpZGRlbi0+cGxheWJ1Zi5fbWF4aW11bSA9IHNwZWMtPnNpemU7CisgICAgdGhpcy0+aGlkZGVuLT5wbGF5YnVmLl9idWZmZXIgID0gKHVuc2lnbmVkIGNoYXIqKVNETF9tYWxsb2Moc3BlYy0+c2l6ZSk7CisgICAgdGhpcy0+aGlkZGVuLT5maWxsYnVmLl9sZW5ndGggID0gMDsKKyAgICB0aGlzLT5oaWRkZW4tPmZpbGxidWYuX21heGltdW0gPSBzcGVjLT5zaXplOworICAgIHRoaXMtPmhpZGRlbi0+ZmlsbGJ1Zi5fYnVmZmVyICA9ICh1bnNpZ25lZCBjaGFyKilTRExfbWFsbG9jKHNwZWMtPnNpemUpOworCisgICAgcmMgPSBVQURTZXRCaXRzUGVyU2FtcGxlKHRoaXMsICBiaXRzUGVyU2FtcGxlICk7CisgICAgcmMgPSBVQURTZXRETUFCdWZmZXJTaXplKHRoaXMsICBmcmFnX3NwZWMsICZvdXRCdWZTaXplICk7CisgICAgcmMgPSBVQURTZXRDaGFubmVscyh0aGlzLCBzcGVjLT5jaGFubmVscyk7ICAgICAgLyogZnVuY3Rpb25zIHJlZHVjZXMgdG8gbW9ubyBvciBzdGVyZW8gKi8KKworICAgIGxnYWluID0gMTAwOyAvKm1heGltdW0gbGVmdCBpbnB1dCBnYWluKi8KKyAgICByZ2FpbiA9IDEwMDsgLyptYWltdW0gcmlnaHQgaW5wdXQgZ2FpbiovCisgICAgcmMgPSBVQURFbmFibGVPdXRwdXQodGhpcywgIkxJTkVfT1VUIiwmbGdhaW4sJnJnYWluKTsKKyAgICByYyA9IFVBREluaXRpYWxpemUodGhpcyk7CisgICAgcmMgPSBVQURTdGFydCh0aGlzKTsKKyAgICByYyA9IFVBRFNldFZvbHVtZSh0aGlzLCAxMDApOworICAgIHJjID0gVUFEU2V0QmFsYW5jZSh0aGlzLCAwKTsKKworICAgIC8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLworICAgIHJldHVybiAwOworfQorCisMCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURHZXRCaXRzUGVyU2FtcGxlKF9USElTLCBsb25nKiBiaXRzKQoreworICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9nZXRfYml0c19wZXJfc2FtcGxlKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKKwkJCQkJICAgICAgIHRoaXMtPmhpZGRlbi0+ZXYsCisJCQkJCSAgICAgICBiaXRzICk7Cit9CisKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldEJpdHNQZXJTYW1wbGUoX1RISVMsIGxvbmcgYml0cykKK3sKKyAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfc2V0X2JpdHNfcGVyX3NhbXBsZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCisJCQkJCSAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAorCQkJCQkgICAgICAgYml0cyApOworfQorCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRTYW1wbGVSYXRlKF9USElTLCBsb25nIHJhdGUsIGxvbmcqIHNldF9yYXRlKQoreworICAgIC8qIGZyb20gdGhlIG1hYyBjb2RlOiBzYW1wbGUgcmF0ZSA9IHNwZWMtPmZyZXEgPDwgMTY7ICovCisgICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3NldF9zYW1wbGVfcmF0ZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCisJCQkJCSAgIHRoaXMtPmhpZGRlbi0+ZXYsCisJCQkJCSAgIHJhdGUsCisJCQkJCSAgIHNldF9yYXRlICk7Cit9CisKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldEJ5dGVPcmRlcihfVEhJUywgc3RyaW5nIGJ5dGVfb3JkZXIpCit7CisgICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3NldF9ieXRlX29yZGVyKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKKwkJCQkJICB0aGlzLT5oaWRkZW4tPmV2LAorCQkJCQkgIGJ5dGVfb3JkZXIgKTsKK30KKworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0QXVkaW9Gb3JtYXRUeXBlKF9USElTLCBzdHJpbmcgZm10KQoreworICAgIC8qIHBvc3NpYmxlIFBDTSwgQV9MQVcgb3IgTVVfTEFXICovCisgICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3NldF9hdWRpb19mb3JtYXRfdHlwZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCisJCQkJCQkgdGhpcy0+aGlkZGVuLT5ldiwKKwkJCQkJCSBmbXQgKTsKK30KKworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0TnVtYmVyRm9ybWF0KF9USElTLCBzdHJpbmcgZm10KQoreworICAgIC8qIHBvc3NpYmxlIFNJR05FRCwgVU5TSUdORUQsIG9yIFRXT1NfQ09NUExFTUVOVCAqLworICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9zZXRfbnVtYmVyX2Zvcm1hdCggdGhpcy0+aGlkZGVuLT51bXNkZXYsCisJCQkJCSAgICAgdGhpcy0+aGlkZGVuLT5ldiwKKwkJCQkJICAgICBmbXQgKTsKK30KKworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFESW5pdGlhbGl6ZShfVEhJUykKK3sKKyAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2VfaW5pdGlhbGl6ZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCisJCQkJICAgICAgdGhpcy0+aGlkZGVuLT5ldiApOworfQorCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTdGFydChfVEhJUykKK3sKKyAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfc3RhcnQoIHRoaXMtPmhpZGRlbi0+dW1zZGV2LAorCQkJCSB0aGlzLT5oaWRkZW4tPmV2ICk7Cit9CisKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFNldFRpbWVGb3JtYXQoX1RISVMsICBVTVNBdWRpb1R5cGVzX1RpbWVGb3JtYXQgZm10ICkKK3sKKyAgICAvKgorICAgICAqIFN3aXRjaGVzIHRoZSB0aW1lIGZvcm1hdCB0byB0aGUgbmV3IGZvcm1hdCwgaW1tZWRpYXRlbHkuCisgICAgICogcG9zc2libGUgVU1TQXVkaW9UeXBlc19Nc2VjcywgVU1TQXVkaW9UeXBlc19CeXRlcyBvciBVTVNBdWRpb1R5cGVzX1NhbXBsZXMKKyAgICAgKi8KKyAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfc2V0X3RpbWVfZm9ybWF0KCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKKwkJCQkJICAgdGhpcy0+aGlkZGVuLT5ldiwKKwkJCQkJICAgZm10ICk7Cit9CisKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFdyaXRlQnVmZlNpemUoX1RISVMsICBsb25nKiBidWZmX3NpemUgKQoreworICAgIC8qCisgICAgICogcmV0dXJucyB3cml0ZSBidWZmZXIgc2l6ZSBpbiB0aGUgY3VycmVudCB0aW1lIGZvcm1hdAorICAgICAqLworICAgIHJldHVybiBVTVNBdWRpb0RldmljZV93cml0ZV9idWZmX3NpemUoIHRoaXMtPmhpZGRlbi0+dW1zZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+ZXYsCisJCQkJCSAgIGJ1ZmZfc2l6ZSApOworfQorCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZUJ1ZmZSZW1haW4oX1RISVMsICBsb25nKiBidWZmX3NpemUgKQoreworICAgIC8qCisgICAgICogcmV0dXJucyBhbW91bnQgb2YgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSB3cml0ZSBidWZmZXIKKyAgICAgKiBpbiB0aGUgY3VycmVudCB0aW1lIGZvcm1hdAorICAgICAqLworICAgIHJldHVybiBVTVNBdWRpb0RldmljZV93cml0ZV9idWZmX3JlbWFpbiggdGhpcy0+aGlkZGVuLT51bXNkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAorCQkJCQkgICAgIGJ1ZmZfc2l6ZSApOworfQorCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZUJ1ZmZVc2VkKF9USElTLCAgbG9uZyogYnVmZl9zaXplICkKK3sKKyAgICAvKgorICAgICAqIHJldHVybnMgYW1vdW50IG9mIGZpbGxlZCBzcGFjZSBpbiB0aGUgd3JpdGUgYnVmZmVyCisgICAgICogaW4gdGhlIGN1cnJlbnQgdGltZSBmb3JtYXQKKyAgICAgKi8KKyAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfd3JpdGVfYnVmZl91c2VkKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAorCQkJCQkgICBidWZmX3NpemUgKTsKK30KKworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0RE1BQnVmZmVyU2l6ZShfVEhJUywgIGxvbmcgYnl0ZXMsIGxvbmcqIGJ5dGVzX3JldCApCit7CisgICAgLyoKKyAgICAgKiBSZXF1ZXN0IGEgbmV3IERNQSBidWZmZXIgc2l6ZSwgbWF4aW11bSByZXF1ZXN0ZWQgc2l6ZSAyMDQ4LgorICAgICAqIFRha2VzIGVmZmVjdCB3aXRoIG5leHQgaW5pdGlhbGl6ZSgpIGNhbGwuCisgICAgICogRGV2aWNlcyBtYXkgb3IgbWF5IG5vdCBzdXBwb3J0IERNQS4KKyAgICAgKi8KKyAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfc2V0X0RNQV9idWZmZXJfc2l6ZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCisJCQkJCSAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAorCQkJCQkgICAgICAgYnl0ZXMsCisJCQkJCSAgICAgICBieXRlc19yZXQgKTsKK30KKworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEU2V0Vm9sdW1lKF9USElTLCAgbG9uZyB2b2x1bWUgKQoreworICAgIC8qCisgICAgICogU2V0IHRoZSB2b2x1bWUuCisgICAgICogVGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5LgorICAgICAqLworICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9zZXRfdm9sdW1lKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKKwkJCQkgICAgICB0aGlzLT5oaWRkZW4tPmV2LAorCQkJCSAgICAgIHZvbHVtZSApOworfQorCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRCYWxhbmNlKF9USElTLCAgbG9uZyBiYWxhbmNlICkKK3sKKyAgICAvKgorICAgICAqIFNldCB0aGUgYmFsYW5jZS4KKyAgICAgKiBUYWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuCisgICAgICovCisgICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3NldF9iYWxhbmNlKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKKwkJCQkgICAgICAgdGhpcy0+aGlkZGVuLT5ldiwKKwkJCQkgICAgICAgYmFsYW5jZSApOworfQorCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURTZXRDaGFubmVscyhfVEhJUywgIGxvbmcgY2hhbm5lbHMgKQoreworICAgIC8qCisgICAgICogU2V0IG1vbm8gb3Igc3RlcmVvLgorICAgICAqIFRha2VzIGVmZmVjdCB3aXRoIG5leHQgaW5pdGlhbGl6ZSgpIGNhbGwuCisgICAgICovCisgICAgaWYgKCBjaGFubmVscyAhPSAxICkgY2hhbm5lbHMgPSAyOworICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9zZXRfbnVtYmVyX29mX2NoYW5uZWxzKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKKwkJCQkgICAgICAgICAgICAgICAgICB0aGlzLT5oaWRkZW4tPmV2LAorCQkJCSAgICAgICAgICAgICAgICAgIGNoYW5uZWxzICk7Cit9CisKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRE9wZW4oX1RISVMsICBzdHJpbmcgZGV2aWNlLCBzdHJpbmcgbW9kZSwgbG9uZyBmbGFncykKK3sKKyAgICByZXR1cm4gVU1TQXVkaW9EZXZpY2Vfb3BlbiggdGhpcy0+aGlkZGVuLT51bXNkZXYsCisJCQkJdGhpcy0+aGlkZGVuLT5ldiwKKwkJCQlkZXZpY2UsCisJCQkJbW9kZSwKKwkJCQlmbGFncyApOworfQorCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURXcml0ZShfVEhJUywgIFVNU0F1ZGlvVHlwZXNfQnVmZmVyKiBidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc2FtcGxlcywKKwkJCQkJICAgbG9uZyogc2FtcGxlc193cml0dGVuKQoreworICAgIHJldHVybiBVTVNBdWRpb0RldmljZV93cml0ZSggdGhpcy0+aGlkZGVuLT51bXNkZXYsCisJCQkJIHRoaXMtPmhpZGRlbi0+ZXYsCisJCQkJIGJ1ZmYsCisJCQkJIHNhbXBsZXMsCisJCQkJIHNhbXBsZXNfd3JpdHRlbiApOworfQorCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURQbGF5UmVtYWluaW5nRGF0YShfVEhJUywgIGJvb2xlYW4gYmxvY2sgKQoreworICAgIHJldHVybiBVTVNBdWRpb0RldmljZV9wbGF5X3JlbWFpbmluZ19kYXRhKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKKwkJCQkJICAgICAgIHRoaXMtPmhpZGRlbi0+ZXYsCisJCQkJCSAgICAgICBibG9jayk7Cit9CisKK3N0YXRpYyBVTVNBdWRpb0RldmljZV9SZXR1cm5Db2RlIFVBRFN0b3AoX1RISVMpCit7CisgICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX3N0b3AoIHRoaXMtPmhpZGRlbi0+dW1zZGV2LAorCQkJCXRoaXMtPmhpZGRlbi0+ZXYgKTsKK30KKworc3RhdGljIFVNU0F1ZGlvRGV2aWNlX1JldHVybkNvZGUgVUFEQ2xvc2UoX1RISVMpCit7CisgICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX2Nsb3NlKCB0aGlzLT5oaWRkZW4tPnVtc2RldiwKKwkJCQkgdGhpcy0+aGlkZGVuLT5ldiApOworfQorCitzdGF0aWMgVU1TQXVkaW9EZXZpY2VfUmV0dXJuQ29kZSBVQURFbmFibGVPdXRwdXQoX1RISVMsICBzdHJpbmcgb3V0cHV0LCBsb25nKiBsZWZ0X2dhaW4sIGxvbmcqIHJpZ2h0X2dhaW4pCit7CisgICAgcmV0dXJuIFVNU0F1ZGlvRGV2aWNlX2VuYWJsZV9vdXRwdXQoIHRoaXMtPmhpZGRlbi0+dW1zZGV2LAorCQkJCQkgdGhpcy0+aGlkZGVuLT5ldiwKKwkJCQkJIG91dHB1dCwKKwkJCQkJIGxlZnRfZ2FpbiwKKwkJCQkJIHJpZ2h0X2dhaW4gKTsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby91bXMvU0RMX3Vtc2F1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3Vtcy9TRExfdW1zYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdmZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby91bXMvU0RMX3Vtc2F1ZGlvLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIENhcnN0ZW4gR3Jpd29kegorICAgIGdyaWZmQGtvbS50dS1kYXJtc3RhZHQuZGUKKworICAgIGJhc2VkIG9uIGxpbnV4L1NETF9kc3BhdWRpby5oIGJ5IFNhbSBMYW50aW5nYQorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9VTVNhdWRpb19oCisjZGVmaW5lIF9TRExfVU1TYXVkaW9faAorCisjaW5jbHVkZSA8VU1TL1VNU0F1ZGlvRGV2aWNlLmg+CisKKyNpbmNsdWRlICIuLi9TRExfc3lzYXVkaW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9BdWRpb0RldmljZSAqdGhpcworCitzdHJ1Y3QgU0RMX1ByaXZhdGVBdWRpb0RhdGEKK3sKKyAgICAvKiBQb2ludGVyIHRvIHRoZSAob3BlbikgVU1TIGF1ZGlvIGRldmljZSAqLworICAgIEVudmlyb25tZW50KiAgIGV2OworICAgIFVNU0F1ZGlvRGV2aWNlIHVtc2RldjsKKworICAgIC8qIFJhdyBtaXhpbmcgYnVmZmVyICovCisgICAgVU1TQXVkaW9UeXBlc19CdWZmZXIgcGxheWJ1ZjsKKyAgICBVTVNBdWRpb1R5cGVzX0J1ZmZlciBmaWxsYnVmOworCisgICAgbG9uZyBieXRlc1BlclNhbXBsZTsKK307CisKKyNlbmRpZiAvKiBfU0RMX1VNU2F1ZGlvX2ggKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby93aW5kaWIvU0RMX2RpYmF1ZGlvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3dpbmRpYi9TRExfZGliYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjE4ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby93aW5kaWIvU0RMX2RpYmF1ZGlvLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbGxvdyBhY2Nlc3MgdG8gYSByYXcgbWl4aW5nIGJ1ZmZlciAqLworCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCisjaW5jbHVkZSAiU0RMX2RpYmF1ZGlvLmgiCisjaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAoX1dJTjMyX1dDRSA8IDMwMCkKKyNpbmNsdWRlICJ3aW5fY2Vfc2VtYXBob3JlLmgiCisjZW5kaWYKKworCisvKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERJQl9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpOworc3RhdGljIHZvaWQgRElCX1RocmVhZEluaXQoX1RISVMpOworc3RhdGljIHZvaWQgRElCX1dhaXRBdWRpbyhfVEhJUyk7CitzdGF0aWMgVWludDggKkRJQl9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBESUJfUGxheUF1ZGlvKF9USElTKTsKK3N0YXRpYyB2b2lkIERJQl9XYWl0RG9uZShfVEhJUyk7CitzdGF0aWMgdm9pZCBESUJfQ2xvc2VBdWRpbyhfVEhJUyk7CisKK2ludCB2b2xhdGlsZSBkaWJhdWRpb190aHJlYWRfZGVidWcgPSAwOworaW50IHZvbGF0aWxlIGRpYmF1ZGlvX2NiX2RlYnVnICAgICA9IDA7CitpbnQgdm9sYXRpbGUgZGliYXVkaW9fbWFpbl9kZWJ1ZyAgID0gMDsKKworLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBBdWRpb19BdmFpbGFibGUodm9pZCkKK3sKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkIEF1ZGlvX0RlbGV0ZURldmljZShTRExfQXVkaW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9BdWRpb0RldmljZSAqQXVkaW9fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXM7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisJaWYgKCB0aGlzICkgeworCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJfQorCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggdGhpcyApIHsKKwkJCVNETF9mcmVlKHRoaXMpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IERJQl9PcGVuQXVkaW87CisJdGhpcy0+VGhyZWFkSW5pdCA9IERJQl9UaHJlYWRJbml0OworCXRoaXMtPldhaXRBdWRpbyA9IERJQl9XYWl0QXVkaW87CisJdGhpcy0+UGxheUF1ZGlvID0gRElCX1BsYXlBdWRpbzsKKwl0aGlzLT5HZXRBdWRpb0J1ZiA9IERJQl9HZXRBdWRpb0J1ZjsKKwl0aGlzLT5XYWl0RG9uZSA9IERJQl9XYWl0RG9uZTsKKwl0aGlzLT5DbG9zZUF1ZGlvID0gRElCX0Nsb3NlQXVkaW87CisKKwl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIFdBVkVPVVRfYm9vdHN0cmFwID0geworCSJ3YXZlb3V0IiwgIldpbjk1Lzk4L05ULzIwMDAgV2F2ZU91dCIsCisJQXVkaW9fQXZhaWxhYmxlLCBBdWRpb19DcmVhdGVEZXZpY2UKK307CisKKworLyogVGhlIFdpbjMyIGNhbGxiYWNrIGZvciBmaWxsaW5nIHRoZSBXQVZFIGRldmljZSAqLworc3RhdGljIHZvaWQgQ0FMTEJBQ0sgRmlsbFNvdW5kKEhXQVZFT1VUIGh3bywgVUlOVCB1TXNnLCBEV09SRF9QVFIgZHdJbnN0YW5jZSwKKwkJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKK3sKKwlTRExfQXVkaW9EZXZpY2UgKnRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopZHdJbnN0YW5jZTsKKworCS8qIE9ubHkgc2VydmljZSAiYnVmZmVyIGRvbmUgcGxheWluZyIgbWVzc2FnZXMgKi8KKwlpZiAoIHVNc2cgIT0gV09NX0RPTkUgKQorCQlyZXR1cm47CisKKwkvKiBTaWduYWwgdGhhdCB3ZSBhcmUgZG9uZSBwbGF5aW5nIGEgYnVmZmVyICovCisJZGliYXVkaW9fY2JfZGVidWcgPSAxOworCUVudGVyQ3JpdGljYWxTZWN0aW9uKCZhdWRpb19jcyk7CisJZGliYXVkaW9fY2JfZGVidWcgPSAyOworCVNldEV2ZW50KGF1ZGlvX2V2ZW50KTsKKwlkaWJhdWRpb19jYl9kZWJ1ZyA9IDM7CisJTGVhdmVDcml0aWNhbFNlY3Rpb24oJmF1ZGlvX2NzKTsKKwlkaWJhdWRpb19jYl9kZWJ1ZyA9IDQ7Cit9CisKK3N0YXRpYyB2b2lkIFNldE1NZXJyb3IoY2hhciAqZnVuY3Rpb24sIE1NUkVTVUxUIGNvZGUpCit7CisJc2l6ZV90IGxlbjsKKwljaGFyIGVycmJ1ZltNQVhFUlJPUkxFTkdUSF07CisjaWZkZWYgX1dJTjMyX1dDRQorCXdjaGFyX3Qgd2VycmJ1ZltNQVhFUlJPUkxFTkdUSF07CisjZW5kaWYKKworCVNETF9zbnByaW50ZihlcnJidWYsIFNETF9hcnJheXNpemUoZXJyYnVmKSwgIiVzOiAiLCBmdW5jdGlvbik7CisJbGVuID0gU0RMX3N0cmxlbihlcnJidWYpOworCisjaWZkZWYgX1dJTjMyX1dDRQorCS8qIFVOSUNPREUgdmVyc2lvbiAqLworCXdhdmVPdXRHZXRFcnJvclRleHQoY29kZSwgd2VycmJ1ZiwgTUFYRVJST1JMRU5HVEgtbGVuKTsKKwlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwwLHdlcnJidWYsLTEsZXJyYnVmK2xlbixNQVhFUlJPUkxFTkdUSC1sZW4sTlVMTCxOVUxMKTsKKyNlbHNlCisJd2F2ZU91dEdldEVycm9yVGV4dChjb2RlLCBlcnJidWYrbGVuLCAoVUlOVCkoTUFYRVJST1JMRU5HVEgtbGVuKSk7CisjZW5kaWYKKworCVNETF9TZXRFcnJvcigiJXMiLGVycmJ1Zik7Cit9CisKKy8qIFNldCBoaWdoIHByaW9yaXR5IGZvciB0aGUgYXVkaW8gdGhyZWFkICovCitzdGF0aWMgdm9pZCBESUJfVGhyZWFkSW5pdChfVEhJUykKK3sKKwlTZXRUaHJlYWRQcmlvcml0eShHZXRDdXJyZW50VGhyZWFkKCksIFRIUkVBRF9QUklPUklUWV9ISUdIRVNUKTsKK30KKwordm9pZCBESUJfV2FpdEF1ZGlvKF9USElTKQoreworCS8qIFdhaXQgZm9yIGFuIGF1ZGlvIGNodW5rIHRvIGZpbmlzaCAqLworCWRpYmF1ZGlvX3RocmVhZF9kZWJ1ZyA9IDE7CisJV2FpdEZvclNpbmdsZU9iamVjdChhdWRpb19ldmVudCwgSU5GSU5JVEUpOworCWRpYmF1ZGlvX3RocmVhZF9kZWJ1ZyA9IDI7CisJUmVzZXRFdmVudChhdWRpb19ldmVudCk7CisJZGliYXVkaW9fdGhyZWFkX2RlYnVnID0gMzsKK30KKworVWludDggKkRJQl9HZXRBdWRpb0J1ZihfVEhJUykKK3sKKyAgICAgICAgVWludDggKnJldHZhbDsKKworICAgIGRpYmF1ZGlvX3RocmVhZF9kZWJ1ZyA9IDQ7CisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmF1ZGlvX2NzKTsKKyAgICBkaWJhdWRpb190aHJlYWRfZGVidWcgPSA1OworCXJldHZhbCA9IChVaW50OCAqKSh3YXZlYnVmW25leHRfYnVmZmVyXS5scERhdGEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgRElCX1BsYXlBdWRpbyhfVEhJUykKK3sKKwkvKiBRdWV1ZSBpdCB1cCAqLworCWRpYmF1ZGlvX3RocmVhZF9kZWJ1ZyA9IDY7CisJd2F2ZU91dFdyaXRlKHNvdW5kLCAmd2F2ZWJ1ZltuZXh0X2J1ZmZlcl0sIHNpemVvZih3YXZlYnVmWzBdKSk7CisJZGliYXVkaW9fdGhyZWFkX2RlYnVnID0gNzsKKwluZXh0X2J1ZmZlciA9IChuZXh0X2J1ZmZlcisxKSVOVU1fQlVGRkVSUzsKKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbigmYXVkaW9fY3MpOworCWRpYmF1ZGlvX3RocmVhZF9kZWJ1ZyA9IDg7Cit9CisKK3ZvaWQgRElCX1dhaXREb25lKF9USElTKQoreworCWludCBpLCBsZWZ0LCB0cmllcyA9IDU7CisKKwlkaWJhdWRpb190aHJlYWRfZGVidWcgPSA5OworCisJLyogZ2l2ZSBzb21lIHRpbWUgZm9yIHRoZSB3YXZlIG91dHB1dCB0byBzZW5kIHRoZSBsYXN0IGJ1ZmZlciwKKwkgICBidXQgZG9uJ3QgaGFuZyBpZiBvbmUgd2FzIGNhbmNlbGxlZAorCSAgKi8KKwlkbyB7CisJCWxlZnQgPSBOVU1fQlVGRkVSUzsKKwkJZm9yICggaT0wOyBpPE5VTV9CVUZGRVJTOyArK2kgKSB7CisJCQlpZiAoIHdhdmVidWZbaV0uZHdGbGFncyAmIFdIRFJfRE9ORSApIHsKKwkJCQktLWxlZnQ7CisJCQl9CisJCX0KKwkJaWYgKCBsZWZ0ID09IDAgKQorCQkJYnJlYWs7CisKKwkJU0RMX0RlbGF5KDEwMCk7CisJfSB3aGlsZSAoIC0tdHJpZXMgPiAwICk7CisKKwlkaWJhdWRpb190aHJlYWRfZGVidWcgPSAxMDsKK30KKwordm9pZCBESUJfQ2xvc2VBdWRpbyhfVEhJUykKK3sKKwlpbnQgaTsKKworCS8qIENsb3NlIHVwIGF1ZGlvICovCisJaWYgKGF1ZGlvX2V2ZW50ICE9IElOVkFMSURfSEFORExFX1ZBTFVFICkgeworI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgKF9XSU4zMl9XQ0UgPCAzMDApCisJCUNsb3NlU3luY2hIYW5kbGUoYXVkaW9fZXZlbnQpOworI2Vsc2UKKwkJQ2xvc2VIYW5kbGUoYXVkaW9fZXZlbnQpOworI2VuZGlmCisJfQorCWlmICggc291bmQgKSB7CisJCXdhdmVPdXRSZXNldChzb3VuZCk7CisJfQorCisJLyogQ2xlYW4gdXAgbWl4aW5nIGJ1ZmZlcnMgKi8KKwlmb3IgKCBpPTA7IGk8TlVNX0JVRkZFUlM7ICsraSApIHsKKwkJaWYgKCB3YXZlYnVmW2ldLmR3VXNlciAhPSAweEZGRkYgKSB7CisJCQl3YXZlT3V0VW5wcmVwYXJlSGVhZGVyKHNvdW5kLCAmd2F2ZWJ1ZltpXSwKKwkJCQkJCXNpemVvZih3YXZlYnVmW2ldKSk7CisJCQl3YXZlYnVmW2ldLmR3VXNlciA9IDB4RkZGRjsKKwkJfQorCX0KKwkvKiBGcmVlIHJhdyBtaXhpbmcgYnVmZmVyICovCisJaWYgKCBtaXhidWYgIT0gTlVMTCApIHsKKwkJU0RMX2ZyZWUobWl4YnVmKTsKKwkJbWl4YnVmID0gTlVMTDsKKwl9CisKKwlpZiAoIHNvdW5kICkKKwkJd2F2ZU91dENsb3NlKHNvdW5kKTsKK30KKworaW50IERJQl9PcGVuQXVkaW8oX1RISVMsIFNETF9BdWRpb1NwZWMgKnNwZWMpCit7CisJTU1SRVNVTFQgcmVzdWx0OworCWludCBpOworCVdBVkVGT1JNQVRFWCB3YXZlZm9ybWF0OworCisJLyogSW5pdGlhbGl6ZSB0aGUgd2F2ZWJ1ZiBzdHJ1Y3R1cmVzIGZvciBjbG9zaW5nICovCisJc291bmQgPSBOVUxMOworCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmF1ZGlvX2NzKTsKKwlhdWRpb19ldmVudCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCWZvciAoIGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7ICsraSApCisJCXdhdmVidWZbaV0uZHdVc2VyID0gMHhGRkZGOworCW1peGJ1ZiA9IE5VTEw7CisKKwkvKiBTZXQgYmFzaWMgV0FWRSBmb3JtYXQgcGFyYW1ldGVycyAqLworCVNETF9tZW1zZXQoJndhdmVmb3JtYXQsIDAsIHNpemVvZih3YXZlZm9ybWF0KSk7CisJd2F2ZWZvcm1hdC53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOworCisJLyogRGV0ZXJtaW5lIHRoZSBhdWRpbyBwYXJhbWV0ZXJzIGZyb20gdGhlIEF1ZGlvU3BlYyAqLworCXN3aXRjaCAoIHNwZWMtPmZvcm1hdCAmIDB4RkYgKSB7CisJCWNhc2UgODoKKwkJCS8qIFVuc2lnbmVkIDggYml0IGF1ZGlvIGRhdGEgKi8KKwkJCXNwZWMtPmZvcm1hdCA9IEFVRElPX1U4OworCQkJd2F2ZWZvcm1hdC53Qml0c1BlclNhbXBsZSA9IDg7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCS8qIFNpZ25lZCAxNiBiaXQgYXVkaW8gZGF0YSAqLworCQkJc3BlYy0+Zm9ybWF0ID0gQVVESU9fUzE2OworCQkJd2F2ZWZvcm1hdC53Qml0c1BlclNhbXBsZSA9IDE2OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOworCQkJcmV0dXJuKC0xKTsKKwl9CisJd2F2ZWZvcm1hdC5uQ2hhbm5lbHMgPSBzcGVjLT5jaGFubmVsczsKKwl3YXZlZm9ybWF0Lm5TYW1wbGVzUGVyU2VjID0gc3BlYy0+ZnJlcTsKKwl3YXZlZm9ybWF0Lm5CbG9ja0FsaWduID0KKwkJd2F2ZWZvcm1hdC5uQ2hhbm5lbHMgKiAod2F2ZWZvcm1hdC53Qml0c1BlclNhbXBsZS84KTsKKwl3YXZlZm9ybWF0Lm5BdmdCeXRlc1BlclNlYyA9IAorCQl3YXZlZm9ybWF0Lm5TYW1wbGVzUGVyU2VjICogd2F2ZWZvcm1hdC5uQmxvY2tBbGlnbjsKKworCS8qIENoZWNrIHRoZSBidWZmZXIgc2l6ZSAtLSBtaW5pbXVtIG9mIDEvNCBzZWNvbmQgKHdvcmQgYWxpZ25lZCkgKi8KKwlpZiAoIHNwZWMtPnNhbXBsZXMgPCAoc3BlYy0+ZnJlcS80KSApCisJCXNwZWMtPnNhbXBsZXMgPSAoKHNwZWMtPmZyZXEvNCkrMykmfjM7CisKKwkvKiBVcGRhdGUgdGhlIGZyYWdtZW50IHNpemUgYXMgc2l6ZSBpbiBieXRlcyAqLworCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisKKwkvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KKwlyZXN1bHQgPSB3YXZlT3V0T3Blbigmc291bmQsIFdBVkVfTUFQUEVSLCAmd2F2ZWZvcm1hdCwKKwkJCShEV09SRF9QVFIpRmlsbFNvdW5kLCAoRFdPUkRfUFRSKXRoaXMsIENBTExCQUNLX0ZVTkNUSU9OKTsKKwlpZiAoIHJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SICkgeworCQlTZXRNTWVycm9yKCJ3YXZlT3V0T3BlbigpIiwgcmVzdWx0KTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKyNpZmRlZiBTT1VORF9ERUJVRworCS8qIENoZWNrIHRoZSBzb3VuZCBkZXZpY2Ugd2UgcmV0cmlldmVkICovCisJeworCQlXQVZFT1VUQ0FQUyBjYXBzOworCisJCXJlc3VsdCA9IHdhdmVPdXRHZXREZXZDYXBzKChVSU5UKXNvdW5kLCAmY2Fwcywgc2l6ZW9mKGNhcHMpKTsKKwkJaWYgKCByZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUiApIHsKKwkJCVNldE1NZXJyb3IoIndhdmVPdXRHZXREZXZDYXBzKCkiLCByZXN1bHQpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlwcmludGYoIkF1ZGlvIGRldmljZTogJXNcbiIsIGNhcHMuc3pQbmFtZSk7CisJfQorI2VuZGlmCisKKwkvKiBDcmVhdGUgdGhlIGF1ZGlvIGJ1ZmZlciBzZW1hcGhvcmUgKi8KKwlhdWRpb19ldmVudCA9IENyZWF0ZUV2ZW50KCBOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCApOworCWlmIChhdWRpb19ldmVudCA9PSBOVUxMKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNlbWFwaG9yZSIpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIENyZWF0ZSB0aGUgc291bmQgYnVmZmVycyAqLworCW1peGJ1ZiA9IChVaW50OCAqKVNETF9tYWxsb2MoTlVNX0JVRkZFUlMqc3BlYy0+c2l6ZSk7CisJaWYgKCBtaXhidWYgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybigtMSk7CisJfQorCWZvciAoIGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7ICsraSApIHsKKwkJU0RMX21lbXNldCgmd2F2ZWJ1ZltpXSwgMCwgc2l6ZW9mKHdhdmVidWZbaV0pKTsKKwkJd2F2ZWJ1ZltpXS5scERhdGEgPSAoTFBTVFIpICZtaXhidWZbaSpzcGVjLT5zaXplXTsKKwkJd2F2ZWJ1ZltpXS5kd0J1ZmZlckxlbmd0aCA9IHNwZWMtPnNpemU7CisJCXdhdmVidWZbaV0uZHdGbGFncyA9IFdIRFJfRE9ORTsKKwkJcmVzdWx0ID0gd2F2ZU91dFByZXBhcmVIZWFkZXIoc291bmQsICZ3YXZlYnVmW2ldLAorCQkJCQkJCXNpemVvZih3YXZlYnVmW2ldKSk7CisJCWlmICggcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IgKSB7CisJCQlTZXRNTWVycm9yKCJ3YXZlT3V0UHJlcGFyZUhlYWRlcigpIiwgcmVzdWx0KTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisKKwkvKiBSZWFkeSB0byBnbyEgKi8KKwluZXh0X2J1ZmZlciA9IDA7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby93aW5kaWIvU0RMX2RpYmF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3dpbmRpYi9TRExfZGliYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZkMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby93aW5kaWIvU0RMX2RpYmF1ZGlvLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9sb3dhdWRpb19oCisjZGVmaW5lIF9TRExfbG93YXVkaW9faAorCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworI2RlZmluZSBOVU1fQlVGRkVSUyAyCQkJLyogLS0gRG9uJ3QgbG93ZXIgdGhpcyEgKi8KKworc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhIHsKKwlIV0FWRU9VVCBzb3VuZDsKKyAgICBDUklUSUNBTF9TRUNUSU9OIGF1ZGlvX2NzOworICAgIEhBTkRMRSAgICAgICAgICAgYXVkaW9fZXZlbnQ7CisJVWludDgqICAgICAgICAgICBtaXhidWY7CQkvKiBUaGUgcmF3IGFsbG9jYXRlZCBtaXhpbmcgYnVmZmVyICovCisJV0FWRUhEUiB3YXZlYnVmW05VTV9CVUZGRVJTXTsJLyogV2F2ZSBhdWRpbyBmcmFnbWVudHMgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGN1cl9idWZmZXI7CisJaW50IG5leHRfYnVmZmVyOworfTsKKworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIHNvdW5kCQkJKHRoaXMtPmhpZGRlbi0+c291bmQpCisjZGVmaW5lIGF1ZGlvX2V2ZW50ICAgICAodGhpcy0+aGlkZGVuLT5hdWRpb19ldmVudCkKKyNkZWZpbmUgYXVkaW9fY3MgICAgICAgICh0aGlzLT5oaWRkZW4tPmF1ZGlvX2NzKQorI2RlZmluZSBtaXhidWYJCQkodGhpcy0+aGlkZGVuLT5taXhidWYpCisjZGVmaW5lIHdhdmVidWYJCQkodGhpcy0+aGlkZGVuLT53YXZlYnVmKQorI2RlZmluZSBjdXJfYnVmZmVyICAgICAgKHRoaXMtPmhpZGRlbi0+Y3VyX2J1ZmZlcikKKyNkZWZpbmUgbmV4dF9idWZmZXIJCSh0aGlzLT5oaWRkZW4tPm5leHRfYnVmZmVyKQorCisjZW5kaWYgLyogX1NETF9sb3dhdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3dpbmR4NS9TRExfZHg1YXVkaW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vd2luZHg1L1NETF9keDVhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDQyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3dpbmR4NS9TRExfZHg1YXVkaW8uYwpAQCAtMCwwICsxLDcwNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfYXVkaW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgorI2luY2x1ZGUgIlNETF9keDVhdWRpby5oIgorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byB1c2UgRGlyZWN0WCA2IERpcmVjdFNvdW5kTm90aWZ5IGludGVyZmFjZSAqLworLy8jZGVmaW5lIFVTRV9QT1NJVElPTl9OT1RJRlkKKworLyogRGlyZWN0WCBmdW5jdGlvbiBwb2ludGVycyBmb3IgYXVkaW8gKi8KK0hSRVNVTFQgKFdJTkFQSSAqRFNvdW5kQ3JlYXRlKShMUEdVSUQsIExQRElSRUNUU09VTkQgKiwgTFBVTktOT1dOKTsKKworLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBEWDVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKTsKK3N0YXRpYyB2b2lkIERYNV9UaHJlYWRJbml0KF9USElTKTsKK3N0YXRpYyB2b2lkIERYNV9XYWl0QXVkaW9fQnVzeVdhaXQoX1RISVMpOworI2lmZGVmIFVTRV9QT1NJVElPTl9OT1RJRlkKK3N0YXRpYyB2b2lkIERYNl9XYWl0QXVkaW9fRXZlbnRXYWl0KF9USElTKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgRFg1X1BsYXlBdWRpbyhfVEhJUyk7CitzdGF0aWMgVWludDggKkRYNV9HZXRBdWRpb0J1ZihfVEhJUyk7CitzdGF0aWMgdm9pZCBEWDVfV2FpdERvbmUoX1RISVMpOworc3RhdGljIHZvaWQgRFg1X0Nsb3NlQXVkaW8oX1RISVMpOworCisvKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IEF1ZGlvX0F2YWlsYWJsZSh2b2lkKQoreworCUhJTlNUQU5DRSBEU291bmRETEw7CisJaW50IGRzb3VuZF9vazsKKworCS8qIFZlcnNpb24gY2hlY2sgRFNPVU5ELkRMTCAoSXMgRGlyZWN0WCBva2F5PykgKi8KKwlkc291bmRfb2sgPSAwOworCURTb3VuZERMTCA9IExvYWRMaWJyYXJ5KFRFWFQoIkRTT1VORC5ETEwiKSk7CisJaWYgKCBEU291bmRETEwgIT0gTlVMTCApIHsKKwkJLyogV2UganVzdCB1c2UgYmFzaWMgRGlyZWN0U291bmQsIHdlJ3JlIG9rYXkgKi8KKwkJLyogWWF5ISAqLworCQkvKiBVbmZvcnR1bmF0ZWx5LCB0aGUgc291bmQgZHJpdmVycyBvbiBOVCBoYXZlCisJCSAgIGhpZ2hlciBsYXRlbmNpZXMgdGhhbiB0aGUgYXVkaW8gYnVmZmVycyB1c2VkCisJCSAgIGJ5IG1hbnkgU0RMIGFwcGxpY2F0aW9ucywgc28gdGhlcmUgYXJlIGdhcHMKKwkJICAgaW4gdGhlIGF1ZGlvIC0gaXQgc291bmRzIHRlcnJpYmxlLiAgUHVudCBmb3Igbm93LgorCQkgKi8KKwkJT1NWRVJTSU9OSU5GTyB2ZXI7CisJCXZlci5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mIChPU1ZFUlNJT05JTkZPKTsKKwkJR2V0VmVyc2lvbkV4KCZ2ZXIpOworCQlzd2l0Y2ggKHZlci5kd1BsYXRmb3JtSWQpIHsKKwkJCWNhc2UgVkVSX1BMQVRGT1JNX1dJTjMyX05UOgorCQkJCWlmICggdmVyLmR3TWFqb3JWZXJzaW9uID4gNCApIHsKKwkJCQkJLyogV2luMksgKi8KKwkJCQkJZHNvdW5kX29rID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBXaW5OVCAqLworCQkJCQlkc291bmRfb2sgPSAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogV2luOTUgb3IgV2luOTggKi8KKwkJCQlkc291bmRfb2sgPSAxOworCQkJCWJyZWFrOworCQl9CisJCS8qIE5vdyBjaGVjayBmb3IgRGlyZWN0WCA1IG9yIGJldHRlciAtIG90aGVyd2lzZQorCQkgKiB3ZSB3aWxsIGZhaWwgbGF0ZXIgaW4gRFg1X09wZW5BdWRpbyB3aXRob3V0IGEgY2hhbmNlCisJCSAqIHRvIGZhbGwgYmFjayB0byB0aGUgRElCIGRyaXZlci4gKi8KKwkJaWYgKGRzb3VuZF9vaykgeworCQkJLyogRGlyZWN0U291bmRDYXB0dXJlQ3JlYXRlIHdhcyBhZGRlZCBpbiBEWDUgKi8KKwkJCWlmICghR2V0UHJvY0FkZHJlc3MoRFNvdW5kRExMLCBURVhUKCJEaXJlY3RTb3VuZENhcHR1cmVDcmVhdGUiKSkpCisJCQkJZHNvdW5kX29rID0gMDsKKworCQl9CisJCS8qIENsZWFuIHVwLi4gKi8KKwkJRnJlZUxpYnJhcnkoRFNvdW5kRExMKTsKKwl9CisJcmV0dXJuKGRzb3VuZF9vayk7Cit9CisKKy8qIEZ1bmN0aW9ucyBmb3IgbG9hZGluZyB0aGUgRGlyZWN0WCBmdW5jdGlvbnMgZHluYW1pY2FsbHkgKi8KK3N0YXRpYyBISU5TVEFOQ0UgRFNvdW5kRExMID0gTlVMTDsKKworc3RhdGljIHZvaWQgRFg1X1VubG9hZCh2b2lkKQoreworCWlmICggRFNvdW5kRExMICE9IE5VTEwgKSB7CisJCUZyZWVMaWJyYXJ5KERTb3VuZERMTCk7CisJCURTb3VuZENyZWF0ZSA9IE5VTEw7CisJCURTb3VuZERMTCA9IE5VTEw7CisJfQorfQorc3RhdGljIGludCBEWDVfTG9hZCh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlEWDVfVW5sb2FkKCk7CisJRFNvdW5kRExMID0gTG9hZExpYnJhcnkoVEVYVCgiRFNPVU5ELkRMTCIpKTsKKwlpZiAoIERTb3VuZERMTCAhPSBOVUxMICkgeworCQlEU291bmRDcmVhdGUgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKERTb3VuZERMTCwKKwkJCQkJVEVYVCgiRGlyZWN0U291bmRDcmVhdGUiKSk7CisJfQorCWlmICggRFNvdW5kRExMICYmIERTb3VuZENyZWF0ZSApIHsKKwkJc3RhdHVzID0gMDsKKwl9IGVsc2UgeworCQlEWDVfVW5sb2FkKCk7CisJCXN0YXR1cyA9IC0xOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBBdWRpb19EZWxldGVEZXZpY2UoU0RMX0F1ZGlvRGV2aWNlICpkZXZpY2UpCit7CisJRFg1X1VubG9hZCgpOworCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKwlTRExfZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgU0RMX0F1ZGlvRGV2aWNlICpBdWRpb19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9BdWRpb0RldmljZSAqdGhpczsKKworCS8qIExvYWQgRGlyZWN0WCAqLworCWlmICggRFg1X0xvYWQoKSA8IDAgKSB7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXMgPSAoU0RMX0F1ZGlvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX0F1ZGlvRGV2aWNlKSk7CisJaWYgKCB0aGlzICkgeworCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJfQorCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggdGhpcyApIHsKKwkJCVNETF9mcmVlKHRoaXMpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCXRoaXMtPk9wZW5BdWRpbyA9IERYNV9PcGVuQXVkaW87CisJdGhpcy0+VGhyZWFkSW5pdCA9IERYNV9UaHJlYWRJbml0OworCXRoaXMtPldhaXRBdWRpbyA9IERYNV9XYWl0QXVkaW9fQnVzeVdhaXQ7CisJdGhpcy0+UGxheUF1ZGlvID0gRFg1X1BsYXlBdWRpbzsKKwl0aGlzLT5HZXRBdWRpb0J1ZiA9IERYNV9HZXRBdWRpb0J1ZjsKKwl0aGlzLT5XYWl0RG9uZSA9IERYNV9XYWl0RG9uZTsKKwl0aGlzLT5DbG9zZUF1ZGlvID0gRFg1X0Nsb3NlQXVkaW87CisKKwl0aGlzLT5mcmVlID0gQXVkaW9fRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIHRoaXM7Cit9CisKK0F1ZGlvQm9vdFN0cmFwIERTT1VORF9ib290c3RyYXAgPSB7CisJImRzb3VuZCIsICJXaW45NS85OC8yMDAwIERpcmVjdFNvdW5kIiwKKwlBdWRpb19BdmFpbGFibGUsIEF1ZGlvX0NyZWF0ZURldmljZQorfTsKKworc3RhdGljIHZvaWQgU2V0RFNlcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGNvZGUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmVycm9yOworCXN0YXRpYyBjaGFyICBlcnJidWZbMTAyNF07CisKKwllcnJidWZbMF0gPSAwOworCXN3aXRjaCAoY29kZSkgeworCQljYXNlIEVfTk9JTlRFUkZBQ0U6CisJCQllcnJvciA9IAorCQkiVW5zdXBwb3J0ZWQgaW50ZXJmYWNlXG4tLSBJcyBEaXJlY3RYIDUuMCBvciBsYXRlciBpbnN0YWxsZWQ/IjsKKwkJCWJyZWFrOworCQljYXNlIERTRVJSX0FMTE9DQVRFRDoKKwkJCWVycm9yID0gIkF1ZGlvIGRldmljZSBpbiB1c2UiOworCQkJYnJlYWs7CisJCWNhc2UgRFNFUlJfQkFERk9STUFUOgorCQkJZXJyb3IgPSAiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0IjsKKwkJCWJyZWFrOworCQljYXNlIERTRVJSX0JVRkZFUkxPU1Q6CisJCQllcnJvciA9ICJNaXhpbmcgYnVmZmVyIHdhcyBsb3N0IjsKKwkJCWJyZWFrOworCQljYXNlIERTRVJSX0NPTlRST0xVTkFWQUlMOgorCQkJZXJyb3IgPSAiQ29udHJvbCByZXF1ZXN0ZWQgaXMgbm90IGF2YWlsYWJsZSI7CisJCQlicmVhazsKKwkJY2FzZSBEU0VSUl9JTlZBTElEQ0FMTDoKKwkJCWVycm9yID0gIkludmFsaWQgY2FsbCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUiOworCQkJYnJlYWs7CisJCWNhc2UgRFNFUlJfSU5WQUxJRFBBUkFNOgorCQkJZXJyb3IgPSAiSW52YWxpZCBwYXJhbWV0ZXIiOworCQkJYnJlYWs7CisJCWNhc2UgRFNFUlJfTk9EUklWRVI6CisJCQllcnJvciA9ICJObyBhdWRpbyBkZXZpY2UgZm91bmQiOworCQkJYnJlYWs7CisJCWNhc2UgRFNFUlJfT1VUT0ZNRU1PUlk6CisJCQllcnJvciA9ICJPdXQgb2YgbWVtb3J5IjsKKwkJCWJyZWFrOworCQljYXNlIERTRVJSX1BSSU9MRVZFTE5FRURFRDoKKwkJCWVycm9yID0gIkNhbGxlciBkb2Vzbid0IGhhdmUgcHJpb3JpdHkiOworCQkJYnJlYWs7CisJCWNhc2UgRFNFUlJfVU5TVVBQT1JURUQ6CisJCQllcnJvciA9ICJGdW5jdGlvbiBub3Qgc3VwcG9ydGVkIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0RMX3NucHJpbnRmKGVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLAorCQkJICAgICAgICAgIiVzOiBVbmtub3duIERpcmVjdFNvdW5kIGVycm9yOiAweCV4IiwKKwkJCQkJCQkJZnVuY3Rpb24sIGNvZGUpOworCQkJYnJlYWs7CisJfQorCWlmICggISBlcnJidWZbMF0gKSB7CisJCVNETF9zbnByaW50ZihlcnJidWYsIFNETF9hcnJheXNpemUoZXJyYnVmKSwgIiVzOiAlcyIsIGZ1bmN0aW9uLCBlcnJvcik7CisJfQorCVNETF9TZXRFcnJvcigiJXMiLCBlcnJidWYpOworCXJldHVybjsKK30KKworLyogRGlyZWN0U291bmQgbmVlZHMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgd2luZG93ICovCitzdGF0aWMgSFdORCBtYWlud2luID0gTlVMTDsKKy8qICovCit2b2lkIERYNV9Tb3VuZEZvY3VzKEhXTkQgaHduZCkKK3sKKwltYWlud2luID0gaHduZDsKK30KKworc3RhdGljIHZvaWQgRFg1X1RocmVhZEluaXQoX1RISVMpCit7CisJU2V0VGhyZWFkUHJpb3JpdHkoR2V0Q3VycmVudFRocmVhZCgpLCBUSFJFQURfUFJJT1JJVFlfSElHSEVTVCk7Cit9CisKK3N0YXRpYyB2b2lkIERYNV9XYWl0QXVkaW9fQnVzeVdhaXQoX1RISVMpCit7CisJRFdPUkQgc3RhdHVzOworCURXT1JEIGN1cnNvciwganVuazsKKwlIUkVTVUxUIHJlc3VsdDsKKworCS8qIFNlbWktYnVzeSB3YWl0LCBzaW5jZSB3ZSBoYXZlIG5vIHdheSBvZiBnZXR0aW5nIHBsYXkgbm90aWZpY2F0aW9uCisJICAgb24gYSBwcmltYXJ5IG1peGluZyBidWZmZXIgbG9jYXRlZCBpbiBoYXJkd2FyZSAoRGlyZWN0WCA1LjApCisJKi8KKwlyZXN1bHQgPSBJRGlyZWN0U291bmRCdWZmZXJfR2V0Q3VycmVudFBvc2l0aW9uKG1peGJ1ZiwgJmp1bmssICZjdXJzb3IpOworCWlmICggcmVzdWx0ICE9IERTX09LICkgeworCQlpZiAoIHJlc3VsdCA9PSBEU0VSUl9CVUZGRVJMT1NUICkgeworCQkJSURpcmVjdFNvdW5kQnVmZmVyX1Jlc3RvcmUobWl4YnVmKTsKKwkJfQorI2lmZGVmIERFQlVHX1NPVU5ECisJCVNldERTZXJyb3IoIkRpcmVjdFNvdW5kIEdldEN1cnJlbnRQb3NpdGlvbiIsIHJlc3VsdCk7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCXdoaWxlICggKGN1cnNvci9taXhsZW4pID09IGxhc3RjaHVuayApIHsKKwkJLyogRklYTUU6IGZpbmQgb3V0IGhvdyBtdWNoIHRpbWUgaXMgbGVmdCBhbmQgc2xlZXAgdGhhdCBsb25nICovCisJCVNETF9EZWxheSgxKTsKKworCQkvKiBUcnkgdG8gcmVzdG9yZSBhIGxvc3Qgc291bmQgYnVmZmVyICovCisJCUlEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRTdGF0dXMobWl4YnVmLCAmc3RhdHVzKTsKKwkJaWYgKCAoc3RhdHVzJkRTQlNUQVRVU19CVUZGRVJMT1NUKSApIHsKKwkJCUlEaXJlY3RTb3VuZEJ1ZmZlcl9SZXN0b3JlKG1peGJ1Zik7CisJCQlJRGlyZWN0U291bmRCdWZmZXJfR2V0U3RhdHVzKG1peGJ1ZiwgJnN0YXR1cyk7CisJCQlpZiAoIChzdGF0dXMmRFNCU1RBVFVTX0JVRkZFUkxPU1QpICkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICggISAoc3RhdHVzJkRTQlNUQVRVU19QTEFZSU5HKSApIHsKKwkJCXJlc3VsdCA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9QbGF5KG1peGJ1ZiwgMCwgMCwgRFNCUExBWV9MT09QSU5HKTsKKwkJCWlmICggcmVzdWx0ID09IERTX09LICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorI2lmZGVmIERFQlVHX1NPVU5ECisJCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBQbGF5IiwgcmVzdWx0KTsKKyNlbmRpZgorCQkJcmV0dXJuOworCQl9CisKKwkJLyogRmluZCBvdXQgd2hlcmUgd2UgYXJlIHBsYXlpbmcgKi8KKwkJcmVzdWx0ID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbihtaXhidWYsCisJCQkJCQkJCSZqdW5rLCAmY3Vyc29yKTsKKwkJaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7CisJCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBHZXRDdXJyZW50UG9zaXRpb24iLCByZXN1bHQpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisjaWZkZWYgVVNFX1BPU0lUSU9OX05PVElGWQorc3RhdGljIHZvaWQgRFg2X1dhaXRBdWRpb19FdmVudFdhaXQoX1RISVMpCit7CisJRFdPUkQgc3RhdHVzOworCUhSRVNVTFQgcmVzdWx0OworCisJLyogVHJ5IHRvIHJlc3RvcmUgYSBsb3N0IHNvdW5kIGJ1ZmZlciAqLworCUlEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRTdGF0dXMobWl4YnVmLCAmc3RhdHVzKTsKKwlpZiAoIChzdGF0dXMmRFNCU1RBVFVTX0JVRkZFUkxPU1QpICkgeworCQlJRGlyZWN0U291bmRCdWZmZXJfUmVzdG9yZShtaXhidWYpOworCQlJRGlyZWN0U291bmRCdWZmZXJfR2V0U3RhdHVzKG1peGJ1ZiwgJnN0YXR1cyk7CisJCWlmICggKHN0YXR1cyZEU0JTVEFUVVNfQlVGRkVSTE9TVCkgKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKCAhIChzdGF0dXMmRFNCU1RBVFVTX1BMQVlJTkcpICkgeworCQlyZXN1bHQgPSBJRGlyZWN0U291bmRCdWZmZXJfUGxheShtaXhidWYsIDAsIDAsIERTQlBMQVlfTE9PUElORyk7CisJCWlmICggcmVzdWx0ICE9IERTX09LICkgeworI2lmZGVmIERFQlVHX1NPVU5ECisJCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBQbGF5IiwgcmVzdWx0KTsKKyNlbmRpZgorCQkJcmV0dXJuOworCQl9CisJfQorCVdhaXRGb3JTaW5nbGVPYmplY3QoYXVkaW9fZXZlbnQsIElORklOSVRFKTsKK30KKyNlbmRpZiAvKiBVU0VfUE9TSVRJT05fTk9USUZZICovCisKK3N0YXRpYyB2b2lkIERYNV9QbGF5QXVkaW8oX1RISVMpCit7CisJLyogVW5sb2NrIHRoZSBidWZmZXIsIGFsbG93aW5nIGl0IHRvIHBsYXkgKi8KKwlpZiAoIGxvY2tlZF9idWYgKSB7CisJCUlEaXJlY3RTb3VuZEJ1ZmZlcl9VbmxvY2sobWl4YnVmLCBsb2NrZWRfYnVmLCBtaXhsZW4sIE5VTEwsIDApOworCX0KKworfQorCitzdGF0aWMgVWludDggKkRYNV9HZXRBdWRpb0J1ZihfVEhJUykKK3sKKwlEV09SRCAgIGN1cnNvciwganVuazsKKwlIUkVTVUxUIHJlc3VsdDsKKwlEV09SRCAgIHJhd2xlbjsKKworCS8qIEZpZ3VyZSBvdXQgd2hpY2ggYmxvY2tzIHRvIGZpbGwgbmV4dCAqLworCWxvY2tlZF9idWYgPSBOVUxMOworCXJlc3VsdCA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRDdXJyZW50UG9zaXRpb24obWl4YnVmLCAmanVuaywgJmN1cnNvcik7CisJaWYgKCByZXN1bHQgPT0gRFNFUlJfQlVGRkVSTE9TVCApIHsKKwkJSURpcmVjdFNvdW5kQnVmZmVyX1Jlc3RvcmUobWl4YnVmKTsKKwkJcmVzdWx0ID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbihtaXhidWYsCisJCQkJCQkJCSZqdW5rLCAmY3Vyc29yKTsKKwl9CisJaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7CisJCVNldERTZXJyb3IoIkRpcmVjdFNvdW5kIEdldEN1cnJlbnRQb3NpdGlvbiIsIHJlc3VsdCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJY3Vyc29yIC89IG1peGxlbjsKKyNpZmRlZiBERUJVR19TT1VORAorCS8qIERldGVjdCBhdWRpbyBkcm9wb3V0cyAqLworCXsgRFdPUkQgc3BvdCA9IGN1cnNvcjsKKwkgIGlmICggc3BvdCA8IGxhc3RjaHVuayApIHsKKwkgICAgc3BvdCArPSBOVU1fQlVGRkVSUzsKKwkgIH0KKwkgIGlmICggc3BvdCA+IGxhc3RjaHVuaysxICkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIkF1ZGlvIGRyb3BvdXQsIG1pc3NlZCAlZCBmcmFnbWVudHNcbiIsCisJICAgICAgICAgICAgKHNwb3QgLSAobGFzdGNodW5rKzEpKSk7CisJICB9CisJfQorI2VuZGlmCisJbGFzdGNodW5rID0gY3Vyc29yOworCWN1cnNvciA9IChjdXJzb3IrMSklTlVNX0JVRkZFUlM7CisJY3Vyc29yICo9IG1peGxlbjsKKworCS8qIExvY2sgdGhlIGF1ZGlvIGJ1ZmZlciAqLworCXJlc3VsdCA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9Mb2NrKG1peGJ1ZiwgY3Vyc29yLCBtaXhsZW4sCisJCQkJKExQVk9JRCAqKSZsb2NrZWRfYnVmLCAmcmF3bGVuLCBOVUxMLCAmanVuaywgMCk7CisJaWYgKCByZXN1bHQgPT0gRFNFUlJfQlVGRkVSTE9TVCApIHsKKwkJSURpcmVjdFNvdW5kQnVmZmVyX1Jlc3RvcmUobWl4YnVmKTsKKwkJcmVzdWx0ID0gSURpcmVjdFNvdW5kQnVmZmVyX0xvY2sobWl4YnVmLCBjdXJzb3IsIG1peGxlbiwKKwkJCQkoTFBWT0lEICopJmxvY2tlZF9idWYsICZyYXdsZW4sIE5VTEwsICZqdW5rLCAwKTsKKwl9CisJaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7CisJCVNldERTZXJyb3IoIkRpcmVjdFNvdW5kIExvY2siLCByZXN1bHQpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCXJldHVybihsb2NrZWRfYnVmKTsKK30KKworc3RhdGljIHZvaWQgRFg1X1dhaXREb25lKF9USElTKQoreworCVVpbnQ4ICpzdHJlYW07CisKKwkvKiBXYWl0IGZvciB0aGUgcGxheWluZyBjaHVuayB0byBmaW5pc2ggKi8KKwlzdHJlYW0gPSB0aGlzLT5HZXRBdWRpb0J1Zih0aGlzKTsKKwlpZiAoIHN0cmVhbSAhPSBOVUxMICkgeworCQlTRExfbWVtc2V0KHN0cmVhbSwgc2lsZW5jZSwgbWl4bGVuKTsKKwkJdGhpcy0+UGxheUF1ZGlvKHRoaXMpOworCX0KKwl0aGlzLT5XYWl0QXVkaW8odGhpcyk7CisKKwkvKiBTdG9wIHRoZSBsb29waW5nIHNvdW5kIGJ1ZmZlciAqLworCUlEaXJlY3RTb3VuZEJ1ZmZlcl9TdG9wKG1peGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIERYNV9DbG9zZUF1ZGlvKF9USElTKQoreworCWlmICggc291bmQgIT0gTlVMTCApIHsKKwkJaWYgKCBtaXhidWYgIT0gTlVMTCApIHsKKwkJCS8qIENsZWFuIHVwIHRoZSBhdWRpbyBidWZmZXIgKi8KKwkJCUlEaXJlY3RTb3VuZEJ1ZmZlcl9SZWxlYXNlKG1peGJ1Zik7CisJCQltaXhidWYgPSBOVUxMOworCQl9CisJCWlmICggYXVkaW9fZXZlbnQgIT0gTlVMTCApIHsKKwkJCUNsb3NlSGFuZGxlKGF1ZGlvX2V2ZW50KTsKKwkJCWF1ZGlvX2V2ZW50ID0gTlVMTDsKKwkJfQorCQlJRGlyZWN0U291bmRfUmVsZWFzZShzb3VuZCk7CisJCXNvdW5kID0gTlVMTDsKKwl9Cit9CisKKyNpZmRlZiBVU0VfUFJJTUFSWV9CVUZGRVIKKy8qIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gY3JlYXRlIGEgcHJpbWFyeSBhdWRpbyBidWZmZXIsIGFuZCByZXR1cm5zIHRoZQorICAgbnVtYmVyIG9mIGF1ZGlvIGNodW5rcyBhdmFpbGFibGUgaW4gdGhlIGNyZWF0ZWQgYnVmZmVyLgorKi8KK3N0YXRpYyBpbnQgQ3JlYXRlUHJpbWFyeShMUERJUkVDVFNPVU5EIHNuZE9iaiwgSFdORCBmb2N1cywgCisJTFBESVJFQ1RTT1VOREJVRkZFUiAqc25kYnVmLCBXQVZFRk9STUFURVggKndhdmVmbXQsIFVpbnQzMiBjaHVua3NpemUpCit7CisJSFJFU1VMVCByZXN1bHQ7CisJRFNCVUZGRVJERVNDIGZvcm1hdDsKKwlEU0JDQVBTIGNhcHM7CisJaW50IG51bWNodW5rczsKKworCS8qIFRyeSB0byBzZXQgcHJpbWFyeSBtaXhpbmcgcHJpdmlsZWdlcyAqLworCXJlc3VsdCA9IElEaXJlY3RTb3VuZF9TZXRDb29wZXJhdGl2ZUxldmVsKHNuZE9iaiwgZm9jdXMsCisJCQkJCQkJRFNTQ0xfV1JJVEVQUklNQVJZKTsKKwlpZiAoIHJlc3VsdCAhPSBEU19PSyApIHsKKyNpZmRlZiBERUJVR19TT1VORAorCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBTZXRDb29wZXJhdGl2ZUxldmVsIiwgcmVzdWx0KTsKKyNlbmRpZgorCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFRyeSB0byBjcmVhdGUgdGhlIHByaW1hcnkgYnVmZmVyICovCisJU0RMX21lbXNldCgmZm9ybWF0LCAwLCBzaXplb2YoZm9ybWF0KSk7CisJZm9ybWF0LmR3U2l6ZSA9IHNpemVvZihmb3JtYXQpOworCWZvcm1hdC5kd0ZsYWdzPShEU0JDQVBTX1BSSU1BUllCVUZGRVJ8RFNCQ0FQU19HRVRDVVJSRU5UUE9TSVRJT04yKTsKKwlmb3JtYXQuZHdGbGFncyB8PSBEU0JDQVBTX1NUSUNLWUZPQ1VTOworI2lmZGVmIFVTRV9QT1NJVElPTl9OT1RJRlkKKwlmb3JtYXQuZHdGbGFncyB8PSBEU0JDQVBTX0NUUkxQT1NJVElPTk5PVElGWTsKKyNlbmRpZgorCXJlc3VsdCA9IElEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlcihzbmRPYmosICZmb3JtYXQsIHNuZGJ1ZiwgTlVMTCk7CisJaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7CisjaWZkZWYgREVCVUdfU09VTkQKKwkJU2V0RFNlcnJvcigiRGlyZWN0U291bmQgQ3JlYXRlU291bmRCdWZmZXIiLCByZXN1bHQpOworI2VuZGlmCisJCXJldHVybigtMSk7CisJfQorCisJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGZyYWdtZW50IGJ1ZmZlciAqLworCVNETF9tZW1zZXQoJmNhcHMsIDAsIHNpemVvZihjYXBzKSk7CisJY2Fwcy5kd1NpemUgPSBzaXplb2YoY2Fwcyk7CisJcmVzdWx0ID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldENhcHMoKnNuZGJ1ZiwgJmNhcHMpOworCWlmICggcmVzdWx0ICE9IERTX09LICkgeworI2lmZGVmIERFQlVHX1NPVU5ECisJCVNldERTZXJyb3IoIkRpcmVjdFNvdW5kIEdldENhcHMiLCByZXN1bHQpOworI2VuZGlmCisJCUlEaXJlY3RTb3VuZEJ1ZmZlcl9SZWxlYXNlKCpzbmRidWYpOworCQlyZXR1cm4oLTEpOworCX0KKwlpZiAoIChjaHVua3NpemUgPiBjYXBzLmR3QnVmZmVyQnl0ZXMpIHx8CisJCQkJKChjYXBzLmR3QnVmZmVyQnl0ZXMlY2h1bmtzaXplKSAhPSAwKSApIHsKKwkJLyogVGhlIHByaW1hcnkgYnVmZmVyIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgJ2NodW5rc2l6ZScKKwkJICAgLS0gdGhpcyBob3BlZnVsbHkgZG9lc24ndCBoYXBwZW4gd2hlbiAnY2h1bmtzaXplJyBpcyBhIAorCQkgICAgICBwb3dlciBvZiAyLgorCQkqLworCQlJRGlyZWN0U291bmRCdWZmZXJfUmVsZWFzZSgqc25kYnVmKTsKKwkJU0RMX1NldEVycm9yKAorIlByaW1hcnkgYnVmZmVyIHNpemUgaXM6ICVkLCBjYW5ub3QgYnJlYWsgaXQgaW50byBjaHVua3Mgb2YgJWQgYnl0ZXNcbiIsCisJCQkJCWNhcHMuZHdCdWZmZXJCeXRlcywgY2h1bmtzaXplKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJbnVtY2h1bmtzID0gKGNhcHMuZHdCdWZmZXJCeXRlcy9jaHVua3NpemUpOworCisJLyogU2V0IHRoZSBwcmltYXJ5IGF1ZGlvIGZvcm1hdCAqLworCXJlc3VsdCA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9TZXRGb3JtYXQoKnNuZGJ1Ziwgd2F2ZWZtdCk7CisJaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7CisjaWZkZWYgREVCVUdfU09VTkQKKwkJU2V0RFNlcnJvcigiRGlyZWN0U291bmQgU2V0Rm9ybWF0IiwgcmVzdWx0KTsKKyNlbmRpZgorCQlJRGlyZWN0U291bmRCdWZmZXJfUmVsZWFzZSgqc25kYnVmKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKG51bWNodW5rcyk7Cit9CisjZW5kaWYgLyogVVNFX1BSSU1BUllfQlVGRkVSICovCisKKy8qIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gY3JlYXRlIGEgc2Vjb25kYXJ5IGF1ZGlvIGJ1ZmZlciwgYW5kIHJldHVybnMgdGhlCisgICBudW1iZXIgb2YgYXVkaW8gY2h1bmtzIGF2YWlsYWJsZSBpbiB0aGUgY3JlYXRlZCBidWZmZXIuCisqLworc3RhdGljIGludCBDcmVhdGVTZWNvbmRhcnkoTFBESVJFQ1RTT1VORCBzbmRPYmosIEhXTkQgZm9jdXMsCisJTFBESVJFQ1RTT1VOREJVRkZFUiAqc25kYnVmLCBXQVZFRk9STUFURVggKndhdmVmbXQsIFVpbnQzMiBjaHVua3NpemUpCit7CisJY29uc3QgaW50IG51bWNodW5rcyA9IDg7CisJSFJFU1VMVCByZXN1bHQ7CisJRFNCVUZGRVJERVNDIGZvcm1hdDsKKwlMUFZPSUQgcHZBdWRpb1B0cjEsIHB2QXVkaW9QdHIyOworCURXT1JEICBkd0F1ZGlvQnl0ZXMxLCBkd0F1ZGlvQnl0ZXMyOworCisJLyogVHJ5IHRvIHNldCBwcmltYXJ5IG1peGluZyBwcml2aWxlZ2VzICovCisJaWYgKCBmb2N1cyApIHsKKwkJcmVzdWx0ID0gSURpcmVjdFNvdW5kX1NldENvb3BlcmF0aXZlTGV2ZWwoc25kT2JqLAorCQkJCQlmb2N1cywgRFNTQ0xfUFJJT1JJVFkpOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IElEaXJlY3RTb3VuZF9TZXRDb29wZXJhdGl2ZUxldmVsKHNuZE9iaiwKKwkJCQkJR2V0RGVza3RvcFdpbmRvdygpLCBEU1NDTF9OT1JNQUwpOworCX0KKwlpZiAoIHJlc3VsdCAhPSBEU19PSyApIHsKKyNpZmRlZiBERUJVR19TT1VORAorCQlTZXREU2Vycm9yKCJEaXJlY3RTb3VuZCBTZXRDb29wZXJhdGl2ZUxldmVsIiwgcmVzdWx0KTsKKyNlbmRpZgorCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFRyeSB0byBjcmVhdGUgdGhlIHNlY29uZGFyeSBidWZmZXIgKi8KKwlTRExfbWVtc2V0KCZmb3JtYXQsIDAsIHNpemVvZihmb3JtYXQpKTsKKwlmb3JtYXQuZHdTaXplID0gc2l6ZW9mKGZvcm1hdCk7CisJZm9ybWF0LmR3RmxhZ3MgPSBEU0JDQVBTX0dFVENVUlJFTlRQT1NJVElPTjI7CisjaWZkZWYgVVNFX1BPU0lUSU9OX05PVElGWQorCWZvcm1hdC5kd0ZsYWdzIHw9IERTQkNBUFNfQ1RSTFBPU0lUSU9OTk9USUZZOworI2VuZGlmCisJaWYgKCAhIGZvY3VzICkgeworCQlmb3JtYXQuZHdGbGFncyB8PSBEU0JDQVBTX0dMT0JBTEZPQ1VTOworCX0gZWxzZSB7CisJCWZvcm1hdC5kd0ZsYWdzIHw9IERTQkNBUFNfU1RJQ0tZRk9DVVM7CisJfQorCWZvcm1hdC5kd0J1ZmZlckJ5dGVzID0gbnVtY2h1bmtzKmNodW5rc2l6ZTsKKwlpZiAoIChmb3JtYXQuZHdCdWZmZXJCeXRlcyA8IERTQlNJWkVfTUlOKSB8fAorCSAgICAgKGZvcm1hdC5kd0J1ZmZlckJ5dGVzID4gRFNCU0laRV9NQVgpICkgeworCQlTRExfU2V0RXJyb3IoIlNvdW5kIGJ1ZmZlciBzaXplIG11c3QgYmUgYmV0d2VlbiAlZCBhbmQgJWQiLAorCQkJCURTQlNJWkVfTUlOL251bWNodW5rcywgRFNCU0laRV9NQVgvbnVtY2h1bmtzKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJZm9ybWF0LmR3UmVzZXJ2ZWQgPSAwOworCWZvcm1hdC5scHdmeEZvcm1hdCA9IHdhdmVmbXQ7CisJcmVzdWx0ID0gSURpcmVjdFNvdW5kX0NyZWF0ZVNvdW5kQnVmZmVyKHNuZE9iaiwgJmZvcm1hdCwgc25kYnVmLCBOVUxMKTsKKwlpZiAoIHJlc3VsdCAhPSBEU19PSyApIHsKKwkJU2V0RFNlcnJvcigiRGlyZWN0U291bmQgQ3JlYXRlU291bmRCdWZmZXIiLCByZXN1bHQpOworCQlyZXR1cm4oLTEpOworCX0KKwlJRGlyZWN0U291bmRCdWZmZXJfU2V0Rm9ybWF0KCpzbmRidWYsIHdhdmVmbXQpOworCisJLyogU2lsZW5jZSB0aGUgaW5pdGlhbCBhdWRpbyBidWZmZXIgKi8KKwlyZXN1bHQgPSBJRGlyZWN0U291bmRCdWZmZXJfTG9jaygqc25kYnVmLCAwLCBmb3JtYXQuZHdCdWZmZXJCeXRlcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEICopJnB2QXVkaW9QdHIxLCAmZHdBdWRpb0J5dGVzMSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEICopJnB2QXVkaW9QdHIyLCAmZHdBdWRpb0J5dGVzMiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0JMT0NLX0VOVElSRUJVRkZFUik7CisJaWYgKCByZXN1bHQgPT0gRFNfT0sgKSB7CisJCWlmICggd2F2ZWZtdC0+d0JpdHNQZXJTYW1wbGUgPT0gOCApIHsKKwkJCVNETF9tZW1zZXQocHZBdWRpb1B0cjEsIDB4ODAsIGR3QXVkaW9CeXRlczEpOworCQl9IGVsc2UgeworCQkJU0RMX21lbXNldChwdkF1ZGlvUHRyMSwgMHgwMCwgZHdBdWRpb0J5dGVzMSk7CisJCX0KKwkJSURpcmVjdFNvdW5kQnVmZmVyX1VubG9jaygqc25kYnVmLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpcHZBdWRpb1B0cjEsIGR3QXVkaW9CeXRlczEsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRClwdkF1ZGlvUHRyMiwgZHdBdWRpb0J5dGVzMik7CisJfQorCisJLyogV2UncmUgcmVhZHkgdG8gZ28gKi8KKwlyZXR1cm4obnVtY2h1bmtzKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBzZXQgcG9zaXRpb24gbm90aWZ5IGV2ZW50cyBvbiB0aGUgbWl4aW5nIGJ1ZmZlciAqLworI2lmZGVmIFVTRV9QT1NJVElPTl9OT1RJRlkKK3N0YXRpYyBpbnQgQ3JlYXRlQXVkaW9FdmVudChfVEhJUykKK3sKKwlMUERJUkVDVFNPVU5ETk9USUZZIG5vdGlmeTsKKwlEU0JQT1NJVElPTk5PVElGWSAqbm90aWZ5X3Bvc2l0aW9uczsKKwlpbnQgaSwgcmV0dmFsOworCUhSRVNVTFQgcmVzdWx0OworCisJLyogRGVmYXVsdCB0byBmYWlsIG9uIGV4aXQgKi8KKwlyZXR2YWwgPSAtMTsKKwlub3RpZnkgPSBOVUxMOworCisJLyogUXVlcnkgZm9yIHRoZSBpbnRlcmZhY2UgKi8KKwlyZXN1bHQgPSBJRGlyZWN0U291bmRCdWZmZXJfUXVlcnlJbnRlcmZhY2UobWl4YnVmLAorCQkJJklJRF9JRGlyZWN0U291bmROb3RpZnksICh2b2lkICopJm5vdGlmeSk7CisJaWYgKCByZXN1bHQgIT0gRFNfT0sgKSB7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgbm90aWZ5IHN0cnVjdHVyZXMgKi8KKwlub3RpZnlfcG9zaXRpb25zID0gKERTQlBPU0lUSU9OTk9USUZZICopU0RMX21hbGxvYyhOVU1fQlVGRkVSUyoKKwkJCQkJc2l6ZW9mKCpub3RpZnlfcG9zaXRpb25zKSk7CisJaWYgKCBub3RpZnlfcG9zaXRpb25zID09IE5VTEwgKSB7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIG5vdGlmeSBldmVudCAqLworCWF1ZGlvX2V2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKwlpZiAoIGF1ZGlvX2V2ZW50ID09IE5VTEwgKSB7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIG5vdGlmeSBzdHJ1Y3R1cmVzICovCisJZm9yICggaT0wOyBpPE5VTV9CVUZGRVJTOyArK2kgKSB7CisJCW5vdGlmeV9wb3NpdGlvbnNbaV0uZHdPZmZzZXQgPSBpKm1peGxlbjsKKwkJbm90aWZ5X3Bvc2l0aW9uc1tpXS5oRXZlbnROb3RpZnkgPSBhdWRpb19ldmVudDsKKwl9CisJcmVzdWx0ID0gSURpcmVjdFNvdW5kTm90aWZ5X1NldE5vdGlmaWNhdGlvblBvc2l0aW9ucyhub3RpZnksCisJCQkJCU5VTV9CVUZGRVJTLCBub3RpZnlfcG9zaXRpb25zKTsKKwlpZiAoIHJlc3VsdCA9PSBEU19PSyApIHsKKwkJcmV0dmFsID0gMDsKKwl9Citkb25lOgorCWlmICggbm90aWZ5ICE9IE5VTEwgKSB7CisJCUlEaXJlY3RTb3VuZE5vdGlmeV9SZWxlYXNlKG5vdGlmeSk7CisJfQorCXJldHVybihyZXR2YWwpOworfQorI2VuZGlmIC8qIFVTRV9QT1NJVElPTl9OT1RJRlkgKi8KKworc3RhdGljIGludCBEWDVfT3BlbkF1ZGlvKF9USElTLCBTRExfQXVkaW9TcGVjICpzcGVjKQoreworCUhSRVNVTFQgICAgICByZXN1bHQ7CisJV0FWRUZPUk1BVEVYIHdhdmVmb3JtYXQ7CisKKwkvKiBTZXQgYmFzaWMgV0FWRSBmb3JtYXQgcGFyYW1ldGVycyAqLworCVNETF9tZW1zZXQoJndhdmVmb3JtYXQsIDAsIHNpemVvZih3YXZlZm9ybWF0KSk7CisJd2F2ZWZvcm1hdC53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOworCisJLyogRGV0ZXJtaW5lIHRoZSBhdWRpbyBwYXJhbWV0ZXJzIGZyb20gdGhlIEF1ZGlvU3BlYyAqLworCXN3aXRjaCAoIHNwZWMtPmZvcm1hdCAmIDB4RkYgKSB7CisJCWNhc2UgODoKKwkJCS8qIFVuc2lnbmVkIDggYml0IGF1ZGlvIGRhdGEgKi8KKwkJCXNwZWMtPmZvcm1hdCA9IEFVRElPX1U4OworCQkJc2lsZW5jZSA9IDB4ODA7CisJCQl3YXZlZm9ybWF0LndCaXRzUGVyU2FtcGxlID0gODsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJLyogU2lnbmVkIDE2IGJpdCBhdWRpbyBkYXRhICovCisJCQlzcGVjLT5mb3JtYXQgPSBBVURJT19TMTY7CisJCQlzaWxlbmNlID0gMHgwMDsKKwkJCXdhdmVmb3JtYXQud0JpdHNQZXJTYW1wbGUgPSAxNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKKwkJCXJldHVybigtMSk7CisJfQorCXdhdmVmb3JtYXQubkNoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbHM7CisJd2F2ZWZvcm1hdC5uU2FtcGxlc1BlclNlYyA9IHNwZWMtPmZyZXE7CisJd2F2ZWZvcm1hdC5uQmxvY2tBbGlnbiA9CisJCXdhdmVmb3JtYXQubkNoYW5uZWxzICogKHdhdmVmb3JtYXQud0JpdHNQZXJTYW1wbGUvOCk7CisJd2F2ZWZvcm1hdC5uQXZnQnl0ZXNQZXJTZWMgPSAKKwkJd2F2ZWZvcm1hdC5uU2FtcGxlc1BlclNlYyAqIHdhdmVmb3JtYXQubkJsb2NrQWxpZ247CisKKwkvKiBVcGRhdGUgdGhlIGZyYWdtZW50IHNpemUgYXMgc2l6ZSBpbiBieXRlcyAqLworCVNETF9DYWxjdWxhdGVBdWRpb1NwZWMoc3BlYyk7CisKKwkvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KKwlyZXN1bHQgPSBEU291bmRDcmVhdGUoTlVMTCwgJnNvdW5kLCBOVUxMKTsKKwlpZiAoIHJlc3VsdCAhPSBEU19PSyApIHsKKwkJU2V0RFNlcnJvcigiRGlyZWN0U291bmRDcmVhdGUiLCByZXN1bHQpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIENyZWF0ZSB0aGUgYXVkaW8gYnVmZmVyIHRvIHdoaWNoIHdlIHdyaXRlICovCisJTlVNX0JVRkZFUlMgPSAtMTsKKyNpZmRlZiBVU0VfUFJJTUFSWV9CVUZGRVIKKwlpZiAoIG1haW53aW4gKSB7CisJCU5VTV9CVUZGRVJTID0gQ3JlYXRlUHJpbWFyeShzb3VuZCwgbWFpbndpbiwgJm1peGJ1ZiwKKwkJCQkJCSZ3YXZlZm9ybWF0LCBzcGVjLT5zaXplKTsKKwl9CisjZW5kaWYgLyogVVNFX1BSSU1BUllfQlVGRkVSICovCisJaWYgKCBOVU1fQlVGRkVSUyA8IDAgKSB7CisJCU5VTV9CVUZGRVJTID0gQ3JlYXRlU2Vjb25kYXJ5KHNvdW5kLCBtYWlud2luLCAmbWl4YnVmLAorCQkJCQkJJndhdmVmb3JtYXQsIHNwZWMtPnNpemUpOworCQlpZiAoIE5VTV9CVUZGRVJTIDwgMCApIHsKKwkJCXJldHVybigtMSk7CisJCX0KKyNpZmRlZiBERUJVR19TT1VORAorCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIHNlY29uZGFyeSBhdWRpbyBidWZmZXJcbiIpOworI2VuZGlmCisJfQorI2lmZGVmIERFQlVHX1NPVU5ECisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIHByaW1hcnkgYXVkaW8gYnVmZmVyXG4iKTsKKyNlbmRpZgorCisJLyogVGhlIGJ1ZmZlciB3aWxsIGF1dG8tc3RhcnQgcGxheWluZyBpbiBEWDVfV2FpdEF1ZGlvKCkgKi8KKwlsYXN0Y2h1bmsgPSAwOworCW1peGxlbiA9IHNwZWMtPnNpemU7CisKKyNpZmRlZiBVU0VfUE9TSVRJT05fTk9USUZZCisJLyogU2VlIGlmIHdlIGNhbiB1c2UgRGlyZWN0WCA2IGV2ZW50IG5vdGlmaWNhdGlvbiAqLworCWlmICggQ3JlYXRlQXVkaW9FdmVudCh0aGlzKSA9PSAwICkgeworCQl0aGlzLT5XYWl0QXVkaW8gPSBEWDZfV2FpdEF1ZGlvX0V2ZW50V2FpdDsKKwl9IGVsc2UgeworCQl0aGlzLT5XYWl0QXVkaW8gPSBEWDVfV2FpdEF1ZGlvX0J1c3lXYWl0OworCX0KKyNlbmRpZgorCXJldHVybigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby93aW5keDUvU0RMX2R4NWF1ZGlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3dpbmR4NS9TRExfZHg1YXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQwMjJmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9hdWRpby93aW5keDUvU0RMX2R4NWF1ZGlvLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9sb3dhdWRpb19oCisjZGVmaW5lIF9TRExfbG93YXVkaW9faAorCisjaW5jbHVkZSAiZGlyZWN0eC5oIgorCisjaW5jbHVkZSAiLi4vU0RMX3N5c2F1ZGlvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfQXVkaW9EZXZpY2UgKnRoaXMKKworLyogVGhlIERpcmVjdFNvdW5kIG9iamVjdHMgKi8KK3N0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSB7CisJTFBESVJFQ1RTT1VORCBzb3VuZDsKKwlMUERJUkVDVFNPVU5EQlVGRkVSIG1peGJ1ZjsKKwlpbnQgTlVNX0JVRkZFUlM7CisJaW50IG1peGxlbiwgc2lsZW5jZTsKKwlEV09SRCBsYXN0Y2h1bms7CisJVWludDggKmxvY2tlZF9idWY7CisJSEFORExFIGF1ZGlvX2V2ZW50OworfTsKKworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIHNvdW5kCQkJKHRoaXMtPmhpZGRlbi0+c291bmQpCisjZGVmaW5lIG1peGJ1ZgkJCSh0aGlzLT5oaWRkZW4tPm1peGJ1ZikKKyNkZWZpbmUgTlVNX0JVRkZFUlMJCSh0aGlzLT5oaWRkZW4tPk5VTV9CVUZGRVJTKQorI2RlZmluZSBtaXhsZW4JCQkodGhpcy0+aGlkZGVuLT5taXhsZW4pCisjZGVmaW5lIHNpbGVuY2UJCQkodGhpcy0+aGlkZGVuLT5zaWxlbmNlKQorI2RlZmluZSBsYXN0Y2h1bmsJCSh0aGlzLT5oaWRkZW4tPmxhc3RjaHVuaykKKyNkZWZpbmUgbG9ja2VkX2J1ZgkJKHRoaXMtPmhpZGRlbi0+bG9ja2VkX2J1ZikKKyNkZWZpbmUgYXVkaW9fZXZlbnQJCSh0aGlzLT5oaWRkZW4tPmF1ZGlvX2V2ZW50KQorCisjZW5kaWYgLyogX1NETF9sb3dhdWRpb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3dpbmR4NS9kaXJlY3R4LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2F1ZGlvL3dpbmR4NS9kaXJlY3R4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMzlmMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvYXVkaW8vd2luZHg1L2RpcmVjdHguaApAQCAtMCwwICsxLDgxIEBACisKKyNpZm5kZWYgX2RpcmVjdHhfaAorI2RlZmluZSBfZGlyZWN0eF9oCisKKy8qIEluY2x1ZGUgYWxsIG9mIHRoZSBEaXJlY3RYIDUuMCBoZWFkZXJzIGFuZCBhZGRzIGFueSBuZWNlc3NhcnkgdHdlYWtzICovCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtbXN5c3RlbS5oPgorI2lmbmRlZiBXSU4zMgorI2RlZmluZSBXSU4zMgorI2VuZGlmCisjdW5kZWYgIFdJTk5UCisKKy8qIEZhciBwb2ludGVycyBkb24ndCBleGlzdCBpbiAzMi1iaXQgY29kZSAqLworI2lmbmRlZiBGQVIKKyNkZWZpbmUgRkFSCisjZW5kaWYKKworLyogRXJyb3IgY29kZXMgbm90IHlldCBpbmNsdWRlZCBpbiBXaW4zMiBBUEkgaGVhZGVyIGZpbGVzICovCisjaWZuZGVmIE1BS0VfSFJFU1VMVAorI2RlZmluZSBNQUtFX0hSRVNVTFQoc2V2LGZhYyxjb2RlKSBcCisJKChIUkVTVUxUKSgoKHVuc2lnbmVkIGxvbmcpKHNldik8PDMxKSB8ICgodW5zaWduZWQgbG9uZykoZmFjKTw8MTYpIHwgKCh1bnNpZ25lZCBsb25nKShjb2RlKSkpKQorI2VuZGlmCisKKyNpZm5kZWYgU19PSworI2RlZmluZSBTX09LCQkoSFJFU1VMVCkweDAwMDAwMDAwTAorI2VuZGlmCisKKyNpZm5kZWYgU1VDQ0VFREVECisjZGVmaW5lIFNVQ0NFRURFRCh4KQkoKEhSRVNVTFQpKHgpID49IDApCisjZW5kaWYKKyNpZm5kZWYgRkFJTEVECisjZGVmaW5lIEZBSUxFRCh4KQkoKEhSRVNVTFQpKHgpPDApCisjZW5kaWYKKworI2lmbmRlZiBFX0ZBSUwKKyNkZWZpbmUgRV9GQUlMCQkoSFJFU1VMVCkweDgwMDAwMDA4TAorI2VuZGlmCisjaWZuZGVmIEVfTk9JTlRFUkZBQ0UKKyNkZWZpbmUgRV9OT0lOVEVSRkFDRQkoSFJFU1VMVCkweDgwMDA0MDAyTAorI2VuZGlmCisjaWZuZGVmIEVfT1VUT0ZNRU1PUlkKKyNkZWZpbmUgRV9PVVRPRk1FTU9SWQkoSFJFU1VMVCkweDgwMDcwMDBFTAorI2VuZGlmCisjaWZuZGVmIEVfSU5WQUxJREFSRworI2RlZmluZSBFX0lOVkFMSURBUkcJKEhSRVNVTFQpMHg4MDA3MDA1N0wKKyNlbmRpZgorI2lmbmRlZiBFX05PVElNUEwKKyNkZWZpbmUgRV9OT1RJTVBMCShIUkVTVUxUKTB4ODAwMDQwMDFMCisjZW5kaWYKKyNpZm5kZWYgUkVHREJfRV9DTEFTU05PVFJFRworI2RlZmluZSBSRUdEQl9FX0NMQVNTTk9UUkVHCShIUkVTVUxUKTB4ODAwNDAxNTRMCisjZW5kaWYKKworLyogU2V2ZXJpdHkgY29kZXMgKi8KKyNpZm5kZWYgU0VWRVJJVFlfRVJST1IKKyNkZWZpbmUgU0VWRVJJVFlfRVJST1IJMQorI2VuZGlmCisKKy8qIEVycm9yIGZhY2lsaXR5IGNvZGVzICovCisjaWZuZGVmIEZBQ0lMSVRZX1dJTjMyCisjZGVmaW5lIEZBQ0lMSVRZX1dJTjMyCTcKKyNlbmRpZgorCisjaWZuZGVmIEZJRUxEX09GRlNFVAorI2RlZmluZSBGSUVMRF9PRkZTRVQodHlwZSwgZmllbGQpICAgICgoTE9ORykmKCgodHlwZSAqKTApLT5maWVsZCkpCisjZW5kaWYKKworLyogRGlyZWN0WCBoZWFkZXJzIChpZiBpdCBpc24ndCBpbmNsdWRlZCwgSSBoYXZlbid0IHRlc3RlZCBpdCB5ZXQpCisgKi8KKy8qIFdlIG5lZWQgdGhlc2UgZGVmaW5lcyB0byBtYXJrIHdoYXQgdmVyc2lvbiBvZiBEaXJlY3RYIEFQSSB3ZSB1c2UgKi8KKyNkZWZpbmUgRElSRUNURFJBV19WRVJTSU9OICAweDA3MDAKKyNkZWZpbmUgRElSRUNUU09VTkRfVkVSU0lPTiAweDA1MDAKKyNkZWZpbmUgRElSRUNUSU5QVVRfVkVSU0lPTiAweDA1MDAKKworI2luY2x1ZGUgPGRkcmF3Lmg+CisjaW5jbHVkZSA8ZHNvdW5kLmg+CisjaW5jbHVkZSA8ZGlucHV0Lmg+CisKKyNlbmRpZiAvKiBfZGlyZWN0eF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL1NETF9jZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9TRExfY2Ryb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjkxYmIxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9TRExfY2Ryb20uYwpAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgaXMgdGhlIENELWF1ZGlvIGNvbnRyb2wgQVBJIGZvciBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgKi8KKworI2luY2x1ZGUgIlNETF9jZHJvbS5oIgorI2luY2x1ZGUgIlNETF9zeXNjZHJvbS5oIgorCisjaWYgIWRlZmluZWQoX19NQUNPU19fKQorI2RlZmluZSBDTElQX0ZSQU1FUwkxMAkvKiBTb21lIENELVJPTXMgd29uJ3QgZ28gYWxsIHRoZSB3YXkgKi8KKyNlbmRpZgorCitzdGF0aWMgaW50IFNETF9jZGluaXR0ZWQgPSAwOworc3RhdGljIFNETF9DRCAqZGVmYXVsdF9jZHJvbTsKKworLyogVGhlIHN5c3RlbSBsZXZlbCBDRC1ST00gY29udHJvbCBmdW5jdGlvbnMgKi8KK3N0cnVjdCBDRGNhcHMgU0RMX0NEY2FwcyA9IHsKKwlOVUxMLAkJCQkJLyogTmFtZSAqLworCU5VTEwsCQkJCQkvKiBPcGVuICovCisJTlVMTCwJCQkJCS8qIEdldFRPQyAqLworCU5VTEwsCQkJCQkvKiBTdGF0dXMgKi8KKwlOVUxMLAkJCQkJLyogUGxheSAqLworCU5VTEwsCQkJCQkvKiBQYXVzZSAqLworCU5VTEwsCQkJCQkvKiBSZXN1bWUgKi8KKwlOVUxMLAkJCQkJLyogU3RvcCAqLworCU5VTEwsCQkJCQkvKiBFamVjdCAqLworCU5VTEwsCQkJCQkvKiBDbG9zZSAqLworfTsKK2ludCBTRExfbnVtY2RzOworCitpbnQgU0RMX0NEUk9NSW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlTRExfbnVtY2RzID0gMDsKKwlyZXR2YWwgPSBTRExfU1lTX0NESW5pdCgpOworCWlmICggcmV0dmFsID09IDAgKSB7CisJCVNETF9jZGluaXR0ZWQgPSAxOworCX0KKwlkZWZhdWx0X2Nkcm9tID0gTlVMTDsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBDRC1ST00gc3Vic3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkICovCitzdGF0aWMgaW50IENoZWNrSW5pdChpbnQgY2hlY2tfY2Ryb20sIFNETF9DRCAqKmNkcm9tKQoreworCWludCBva2F5OworCisJb2theSA9IFNETF9jZGluaXR0ZWQ7CisJaWYgKCBjaGVja19jZHJvbSAmJiAoKmNkcm9tID09IE5VTEwpICkgeworCQkqY2Ryb20gPSBkZWZhdWx0X2Nkcm9tOworCQlpZiAoICpjZHJvbSA9PSBOVUxMICkgeworCQkJU0RMX1NldEVycm9yKCJDRC1ST00gbm90IG9wZW5lZCIpOworCQkJb2theSA9IDA7CisJCX0KKwl9CisJaWYgKCAhIFNETF9jZGluaXR0ZWQgKSB7CisJCVNETF9TZXRFcnJvcigiQ0QtUk9NIHN1YnN5c3RlbSBub3QgaW5pdGlhbGl6ZWQiKTsKKwl9CisJcmV0dXJuKG9rYXkpOworfQorCitpbnQgU0RMX0NETnVtRHJpdmVzKHZvaWQpCit7CisJaWYgKCAhIENoZWNrSW5pdCgwLCBOVUxMKSApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKFNETF9udW1jZHMpOworfQorCitjb25zdCBjaGFyICpTRExfQ0ROYW1lKGludCBkcml2ZSkKK3sKKwlpZiAoICEgQ2hlY2tJbml0KDAsIE5VTEwpICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorCWlmICggZHJpdmUgPj0gU0RMX251bWNkcyApIHsKKwkJU0RMX1NldEVycm9yKCJJbnZhbGlkIENELVJPTSBkcml2ZSBpbmRleCIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWlmICggU0RMX0NEY2Fwcy5OYW1lICkgeworCQlyZXR1cm4oU0RMX0NEY2Fwcy5OYW1lKGRyaXZlKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuKCIiKTsKKwl9Cit9CisKK1NETF9DRCAqU0RMX0NET3BlbihpbnQgZHJpdmUpCit7CisJc3RydWN0IFNETF9DRCAqY2Ryb207CisKKwlpZiAoICEgQ2hlY2tJbml0KDAsIE5VTEwpICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorCWlmICggZHJpdmUgPj0gU0RMX251bWNkcyApIHsKKwkJU0RMX1NldEVycm9yKCJJbnZhbGlkIENELVJPTSBkcml2ZSBpbmRleCIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWNkcm9tID0gKFNETF9DRCAqKVNETF9tYWxsb2Moc2l6ZW9mKCpjZHJvbSkpOworCWlmICggY2Ryb20gPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJU0RMX21lbXNldChjZHJvbSwgMCwgc2l6ZW9mKCpjZHJvbSkpOworCWNkcm9tLT5pZCA9IFNETF9DRGNhcHMuT3Blbihkcml2ZSk7CisJaWYgKCBjZHJvbS0+aWQgPCAwICkgeworCQlTRExfZnJlZShjZHJvbSk7CisJCXJldHVybihOVUxMKTsKKwl9CisJZGVmYXVsdF9jZHJvbSA9IGNkcm9tOworCXJldHVybihjZHJvbSk7Cit9CisKK0NEc3RhdHVzIFNETF9DRFN0YXR1cyhTRExfQ0QgKmNkcm9tKQoreworCUNEc3RhdHVzIHN0YXR1czsKKwlpbnQgaTsKKwlVaW50MzIgcG9zaXRpb247CisKKwkvKiBDaGVjayBpZiB0aGUgQ0QtUk9NIHN1YnN5c3RlbSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworCWlmICggISBDaGVja0luaXQoMSwgJmNkcm9tKSApIHsKKwkJcmV0dXJuKENEX0VSUk9SKTsKKwl9CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBkcml2ZSAqLworCWNkcm9tLT5udW10cmFja3MgPSAwOworCWNkcm9tLT5jdXJfdHJhY2sgPSAwOworCWNkcm9tLT5jdXJfZnJhbWUgPSAwOworCXN0YXR1cyA9IFNETF9DRGNhcHMuU3RhdHVzKGNkcm9tLCAmaSk7CisJcG9zaXRpb24gPSAoVWludDMyKWk7CisJY2Ryb20tPnN0YXR1cyA9IHN0YXR1czsKKworCS8qIEdldCB0aGUgdGFibGUgb2YgY29udGVudHMsIGlmIHRoZXJlJ3MgYSBDRCBhdmFpbGFibGUgKi8KKwlpZiAoIENEX0lORFJJVkUoc3RhdHVzKSApIHsKKwkJaWYgKCBTRExfQ0RjYXBzLkdldFRPQyhjZHJvbSkgPCAwICkgeworCQkJc3RhdHVzID0gQ0RfRVJST1I7CisJCX0KKwkJLyogSWYgdGhlIGRyaXZlIGlzIHBsYXlpbmcsIGdldCBjdXJyZW50IHBsYXkgcG9zaXRpb24gKi8KKwkJaWYgKCAoc3RhdHVzID09IENEX1BMQVlJTkcpIHx8IChzdGF0dXMgPT0gQ0RfUEFVU0VEKSApIHsKKwkJCWZvciAoIGk9MTsgY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA8PSBwb3NpdGlvbjsgKytpICkgeworCQkJCS8qIEtlZXAgbG9va2luZyAqLzsKKwkJCX0KKyNpZmRlZiBERUJVR19DRFJPTQorICBmcHJpbnRmKHN0ZGVyciwgIkN1cnJlbnQgcG9zaXRpb246ICVkLCB0cmFjayA9ICVkIChvZmZzZXQgaXMgJWQpXG4iLAorCQkJCXBvc2l0aW9uLCBpLTEsIGNkcm9tLT50cmFja1tpLTFdLm9mZnNldCk7CisjZW5kaWYKKwkJCWNkcm9tLT5jdXJfdHJhY2sgPSBpLTE7CisJCQlwb3NpdGlvbiAtPSBjZHJvbS0+dHJhY2tbY2Ryb20tPmN1cl90cmFja10ub2Zmc2V0OworCQkJY2Ryb20tPmN1cl9mcmFtZSA9IHBvc2l0aW9uOworCQl9CisJfQorCXJldHVybihzdGF0dXMpOworfQorCitpbnQgU0RMX0NEUGxheVRyYWNrcyhTRExfQ0QgKmNkcm9tLAorCQkJaW50IHN0cmFjaywgaW50IHNmcmFtZSwgaW50IG50cmFja3MsIGludCBuZnJhbWVzKQoreworCWludCBldHJhY2ssIGVmcmFtZTsKKwlpbnQgc3RhcnQsIGxlbmd0aDsKKworCS8qIENoZWNrIGlmIHRoZSBDRC1ST00gc3Vic3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisJaWYgKCAhIENoZWNrSW5pdCgxLCAmY2Ryb20pICkgeworCQlyZXR1cm4oQ0RfRVJST1IpOworCX0KKworCS8qIERldGVybWluZSB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyB0cmFja3MgKi8KKwlpZiAoIChzdHJhY2sgPCAwKSB8fCAoc3RyYWNrID49IGNkcm9tLT5udW10cmFja3MpICkgeworCQlTRExfU2V0RXJyb3IoIkludmFsaWQgc3RhcnRpbmcgdHJhY2siKTsKKwkJcmV0dXJuKENEX0VSUk9SKTsKKwl9CisJaWYgKCAhIG50cmFja3MgJiYgISBuZnJhbWVzICkgeworCQlldHJhY2sgPSBjZHJvbS0+bnVtdHJhY2tzOworCQllZnJhbWUgPSAwOworCX0gZWxzZSB7CisJCWV0cmFjayA9IHN0cmFjaytudHJhY2tzOworCQlpZiAoIGV0cmFjayA9PSBzdHJhY2sgKSB7CisJCQllZnJhbWUgPSBzZnJhbWUgKyBuZnJhbWVzOworCQl9IGVsc2UgeworCQkJZWZyYW1lID0gbmZyYW1lczsKKwkJfQorCX0KKwlpZiAoIGV0cmFjayA+IGNkcm9tLT5udW10cmFja3MgKSB7CisJCVNETF9TZXRFcnJvcigiSW52YWxpZCBwbGF5IGxlbmd0aCIpOworCQlyZXR1cm4oQ0RfRVJST1IpOworCX0KKworCS8qIFNraXAgZGF0YSB0cmFja3MgYW5kIHZlcmlmeSBmcmFtZSBvZmZzZXRzICovCisJd2hpbGUgKCAoc3RyYWNrIDw9IGV0cmFjaykgJiYKKwkJCShjZHJvbS0+dHJhY2tbc3RyYWNrXS50eXBlID09IFNETF9EQVRBX1RSQUNLKSApIHsKKwkJKytzdHJhY2s7CisJfQorCWlmICggc2ZyYW1lID49IChpbnQpY2Ryb20tPnRyYWNrW3N0cmFja10ubGVuZ3RoICkgeworCQlTRExfU2V0RXJyb3IoIkludmFsaWQgc3RhcnRpbmcgZnJhbWUgZm9yIHRyYWNrICVkIiwgc3RyYWNrKTsKKwkJcmV0dXJuKENEX0VSUk9SKTsKKwl9CisJd2hpbGUgKCAoZXRyYWNrID4gc3RyYWNrKSAmJgorCQkJKGNkcm9tLT50cmFja1tldHJhY2stMV0udHlwZSA9PSBTRExfREFUQV9UUkFDSykgKSB7CisJCS0tZXRyYWNrOworCX0KKwlpZiAoIGVmcmFtZSA+IChpbnQpY2Ryb20tPnRyYWNrW2V0cmFja10ubGVuZ3RoICkgeworCQlTRExfU2V0RXJyb3IoIkludmFsaWQgZW5kaW5nIGZyYW1lIGZvciB0cmFjayAlZCIsIGV0cmFjayk7CisJCXJldHVybihDRF9FUlJPUik7CisJfQorCisJLyogRGV0ZXJtaW5lIHN0YXJ0IGZyYW1lIGFuZCBwbGF5IGxlbmd0aCAqLworCXN0YXJ0ID0gKGNkcm9tLT50cmFja1tzdHJhY2tdLm9mZnNldCtzZnJhbWUpOworCWxlbmd0aCA9IChjZHJvbS0+dHJhY2tbZXRyYWNrXS5vZmZzZXQrZWZyYW1lKS1zdGFydDsKKyNpZmRlZiBDTElQX0ZSQU1FUworCS8qIEkndmUgbmV2ZXIgc2VlbiB0aGlzIG5lY2Vzc2FyeSwgYnV0IHhtY2QgZG9lcyBpdC4uICovCisJbGVuZ3RoIC09IENMSVBfRlJBTUVTOwkvKiBDTElQX0ZSQU1FUyA9PSAxMCAqLworI2VuZGlmCisJaWYgKCBsZW5ndGggPCAwICkgeworCQlyZXR1cm4oMCk7CisJfQorCisJLyogUGxheSEgKi8KKyNpZmRlZiBERUJVR19DRFJPTQorICBmcHJpbnRmKHN0ZGVyciwgIlBsYXlpbmcgJWQgZnJhbWVzIGF0IG9mZnNldCAlZFxuIiwgbGVuZ3RoLCBzdGFydCk7CisjZW5kaWYKKwlyZXR1cm4oU0RMX0NEY2Fwcy5QbGF5KGNkcm9tLCBzdGFydCwgbGVuZ3RoKSk7Cit9CisKK2ludCBTRExfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzZnJhbWUsIGludCBsZW5ndGgpCit7CisJLyogQ2hlY2sgaWYgdGhlIENELVJPTSBzdWJzeXN0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKwlpZiAoICEgQ2hlY2tJbml0KDEsICZjZHJvbSkgKSB7CisJCXJldHVybihDRF9FUlJPUik7CisJfQorCisJcmV0dXJuKFNETF9DRGNhcHMuUGxheShjZHJvbSwgc2ZyYW1lLCBsZW5ndGgpKTsKK30KKworaW50IFNETF9DRFBhdXNlKFNETF9DRCAqY2Ryb20pCit7CisJQ0RzdGF0dXMgc3RhdHVzOworCWludCByZXR2YWw7CisKKwkvKiBDaGVjayBpZiB0aGUgQ0QtUk9NIHN1YnN5c3RlbSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworCWlmICggISBDaGVja0luaXQoMSwgJmNkcm9tKSApIHsKKwkJcmV0dXJuKENEX0VSUk9SKTsKKwl9CisKKwlzdGF0dXMgPSBTRExfQ0RjYXBzLlN0YXR1cyhjZHJvbSwgTlVMTCk7CisJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBDRF9QTEFZSU5HOgorCQkJcmV0dmFsID0gU0RMX0NEY2Fwcy5QYXVzZShjZHJvbSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHZhbCA9IDA7CisJCQlicmVhazsKKwl9CisJcmV0dXJuKHJldHZhbCk7Cit9CisKK2ludCBTRExfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKK3sKKwlDRHN0YXR1cyBzdGF0dXM7CisJaW50IHJldHZhbDsKKworCS8qIENoZWNrIGlmIHRoZSBDRC1ST00gc3Vic3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisJaWYgKCAhIENoZWNrSW5pdCgxLCAmY2Ryb20pICkgeworCQlyZXR1cm4oQ0RfRVJST1IpOworCX0KKworCXN0YXR1cyA9IFNETF9DRGNhcHMuU3RhdHVzKGNkcm9tLCBOVUxMKTsKKwlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIENEX1BBVVNFRDoKKwkJCXJldHZhbCA9IFNETF9DRGNhcHMuUmVzdW1lKGNkcm9tKTsKKwkJZGVmYXVsdDoKKwkJCXJldHZhbCA9IDA7CisJCQlicmVhazsKKwl9CisJcmV0dXJuKHJldHZhbCk7Cit9CisKK2ludCBTRExfQ0RTdG9wKFNETF9DRCAqY2Ryb20pCit7CisJQ0RzdGF0dXMgc3RhdHVzOworCWludCByZXR2YWw7CisKKwkvKiBDaGVjayBpZiB0aGUgQ0QtUk9NIHN1YnN5c3RlbSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworCWlmICggISBDaGVja0luaXQoMSwgJmNkcm9tKSApIHsKKwkJcmV0dXJuKENEX0VSUk9SKTsKKwl9CisKKwlzdGF0dXMgPSBTRExfQ0RjYXBzLlN0YXR1cyhjZHJvbSwgTlVMTCk7CisJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBDRF9QTEFZSU5HOgorCQljYXNlIENEX1BBVVNFRDoKKwkJCXJldHZhbCA9IFNETF9DRGNhcHMuU3RvcChjZHJvbSk7CisJCWRlZmF1bHQ6CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJfQorCXJldHVybihyZXR2YWwpOworfQorCitpbnQgU0RMX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKKwkvKiBDaGVjayBpZiB0aGUgQ0QtUk9NIHN1YnN5c3RlbSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworCWlmICggISBDaGVja0luaXQoMSwgJmNkcm9tKSApIHsKKwkJcmV0dXJuKENEX0VSUk9SKTsKKwl9CisJcmV0dXJuKFNETF9DRGNhcHMuRWplY3QoY2Ryb20pKTsKK30KKwordm9pZCBTRExfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKQoreworCS8qIENoZWNrIGlmIHRoZSBDRC1ST00gc3Vic3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisJaWYgKCAhIENoZWNrSW5pdCgxLCAmY2Ryb20pICkgeworCQlyZXR1cm47CisJfQorCVNETF9DRGNhcHMuQ2xvc2UoY2Ryb20pOworCVNETF9mcmVlKGNkcm9tKTsKKwlkZWZhdWx0X2Nkcm9tID0gTlVMTDsKK30KKwordm9pZCBTRExfQ0RST01RdWl0KHZvaWQpCit7CisJU0RMX1NZU19DRFF1aXQoKTsKKwlTRExfY2Rpbml0dGVkID0gMDsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vU0RMX3N5c2Nkcm9tLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL1NETF9zeXNjZHJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZWVlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL1NETF9zeXNjZHJvbS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgU0RMX2ZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBpcyB0aGUgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmb3IgdGhlIFNETCBDRC1ST00gQVBJICovCisKKy8qIFN0cnVjdHVyZSBvZiBDRCBhdWRpbyBjb250cm9sIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHN0cnVjdCBDRGNhcHMgeworCS8qIEdldCB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGRyaXZlICovCisJY29uc3QgY2hhciAqKCpOYW1lKShpbnQgZHJpdmUpOworCisJLyogT3BlbiB0aGUgc3BlY2lmaWVkIGRyaXZlLCByZXR1cm5pbmcgYSBkcml2ZSBpZCwgb3IgLTEgb24gZXJyb3IgKi8KKwlpbnQgKCpPcGVuKShpbnQgZHJpdmUpOworCisJLyogR2V0IHRhYmxlLW9mLWNvbnRlbnRzIChudW1iZXIgb2YgdHJhY2tzICsgdHJhY2sgaW5mbykgZm9yIGRpc2suCisJICAgVGhlIFRPQyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBjZHJvbSBzdHJ1Y3R1cmUuCisJICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZXJyb3IuCisJICovCisJaW50ICgqR2V0VE9DKShTRExfQ0QgKmNkcm9tKTsKKworCS8qIFJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgYW5kIHBsYXkgcG9zaXRpb24sIGluIGZyYW1lcywgb2YgdGhlCisJICAgZHJpdmUuICAncG9zaXRpb24nIG1heSBiZSBOVUxMLCBhbmQgaWYgc28sIHNob3VsZCBiZSBpZ25vcmVkLgorCSAqLworCUNEc3RhdHVzICgqU3RhdHVzKShTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKTsKKworCS8qIFBsYXkgZnJvbSBmcmFtZSAnc3RhcnQnIHRvICdzdGFydCtsZW4nICovCisJaW50ICgqUGxheSkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuKTsgCisKKwkvKiBQYXVzZSBwbGF5ICovCisJaW50ICgqUGF1c2UpKFNETF9DRCAqY2Ryb20pOworCisJLyogUmVzdW1lIHBsYXkgKi8KKwlpbnQgKCpSZXN1bWUpKFNETF9DRCAqY2Ryb20pOworCisJLyogU3RvcCBwbGF5ICovCisJaW50ICgqU3RvcCkoU0RMX0NEICpjZHJvbSk7CisKKwkvKiBFamVjdCB0aGUgY3VycmVudCBkaXNrICovCisJaW50ICgqRWplY3QpKFNETF9DRCAqY2Ryb20pOworCisJLyogQ2xvc2UgdGhlIHNwZWNpZmllZCBkcml2ZSAqLworCXZvaWQgKCpDbG9zZSkoU0RMX0NEICpjZHJvbSk7Cit9IFNETF9DRGNhcHM7CisKKy8qIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIENELVJPTSBkcml2ZXMgb24gdGhlIHN5c3RlbSAqLworZXh0ZXJuIGludCBTRExfbnVtY2RzOworCisvKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIENELVJPTSBkcml2ZXMgYW5kIGZpbGwgU0RMX0NEY2Fwcy4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHNldCBTRExfbnVtY2RzIHRvIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIENECisgKiBkcml2ZXMuICBEcml2ZSAwIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgQ0QtUk9NLgorICogSXQgc2hvdWxkIHJldHVybiAwLCBvciAtMSBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgorKi8KK2V4dGVybiBpbnQgIFNETF9TWVNfQ0RJbml0KHZvaWQpOworCisvKiBGdW5jdGlvbiB0byBwZXJmb3JtIGFueSBzeXN0ZW0tc3BlY2lmaWMgQ0QtUk9NIHJlbGF0ZWQgY2xlYW51cCAqLworZXh0ZXJuIHZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCk7CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vYWl4L1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9haXgvU0RMX3N5c2Nkcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlMDU1OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vYWl4L1NETF9zeXNjZHJvbS5jCkBAIC0wLDAgKzEsNjYwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgQ2Fyc3RlbiBHcml3b2R6CisgICAgZ3JpZmZAa29tLnR1LWRhcm1zdGFkdC5kZQorCisgICAgYmFzZWQgb24gbGludXgvU0RMX3N5c2Nkcm9tLmMgYnkgU2FtIExhbnRpbmdhCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9DRFJPTV9BSVgKKworLyogRnVuY3Rpb25zIGZvciBzeXN0ZW0tbGV2ZWwgQ0QtUk9NIGF1ZGlvIGNvbnRyb2wgKi8KKworLyojZGVmaW5lIERFQlVHX0NEUk9NIDEqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvZGV2aW5mby5oPgorI2luY2x1ZGUgPHN5cy9tbnRjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisjaW5jbHVkZSA8c3lzL3Ztb3VudC5oPgorI2luY2x1ZGUgPGZzdGFiLmg+CisjaW5jbHVkZSA8c3lzL3NjZGlzay5oPgorCisjaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c2Nkcm9tLmgiCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIHdlJ2xsIGRldGVjdCAqLworI2RlZmluZSBNQVhfRFJJVkVTCTE2CQorCisvKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIENELVJPTSBkcml2ZXMgKi8KK3N0YXRpYyBjaGFyICpTRExfY2RsaXN0W01BWF9EUklWRVNdOworc3RhdGljIGRldl90IFNETF9jZG1vZGVbTUFYX0RSSVZFU107CisKKy8qIFRoZSBzeXN0ZW0tZGVwZW5kZW50IENEIGNvbnRyb2wgZnVuY3Rpb25zICovCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgICAgICAgICBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOworc3RhdGljIGludCAgICAgICAgIFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgQ0RzdGF0dXMgICAgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKTsKK3N0YXRpYyBpbnQgICAgICAgICBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOworc3RhdGljIGludCAgICAgICAgIFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgICAgICAgICBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCAgICAgICAgIFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCAgICAgICAgIFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyB2b2lkICAgICAgICBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRGlvY3RsKGludCBpZCwgaW50IGNvbW1hbmQsIHZvaWQgKmFyZyk7CisKKy8qIENoZWNrIGEgZHJpdmUgdG8gc2VlIGlmIGl0IGlzIGEgQ0QtUk9NICovCitzdGF0aWMgaW50IENoZWNrRHJpdmUoY2hhciAqZHJpdmUsIHN0cnVjdCBzdGF0ICpzdGJ1ZikKK3sKKyAgICBpbnQgaXNfY2Q7CisgICAgaW50IGNkZmQ7CisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgZGV2aW5mbyBpbmZvOworCisgICAgLyogSWYgaXQgZG9lc24ndCBleGlzdCwgcmV0dXJuIC0xICovCisgICAgaWYgKCBzdGF0KGRyaXZlLCBzdGJ1ZikgPCAwICkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogSWYgaXQgZG9lcyBleGlzdCwgdmVyaWZ5IHRoYXQgaXQncyBhbiBhdmFpbGFibGUgQ0QtUk9NICovCisgICAgaXNfY2QgPSAwOworICAgIGlmICggU19JU0NIUihzdGJ1Zi0+c3RfbW9kZSkgfHwgU19JU0JMSyhzdGJ1Zi0+c3RfbW9kZSkgKSB7CisgICAgICAgIGNkZmQgPSBvcGVuKGRyaXZlLCAoT19SRE9OTFl8T19FWENMfE9fTk9OQkxPQ0spLCAwKTsKKyAgICAgICAgaWYgKCBjZGZkID49IDAgKSB7CisgICAgICAgICAgICByZXQgPSBTRExfU1lTX0NEaW9jdGwoIGNkZmQsIElPQ0lORk8sICZpbmZvICk7CisJICAgIGlmICggcmV0IDwgMCApIHsKKwkJLyogU29tZSBraW5kIG9mIGVycm9yICovCisJCWlzX2NkID0gMDsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKCBpbmZvLmRldnR5cGUgPT0gRERfQ0RST00gKSB7CisJCSAgICBpc19jZCA9IDE7CisJCX0gZWxzZSB7CisJCSAgICBpc19jZCA9IDA7CisJCX0KKwkgICAgfQorICAgICAgICAgICAgY2xvc2UoY2RmZCk7CisJfQorI2lmZGVmIERFQlVHX0NEUk9NCisJZWxzZQorCXsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gZHJpdmUgJXMgKCVzKVxuIiwgZHJpdmUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorI2VuZGlmCisgICAgfQorICAgIHJldHVybiBpc19jZDsKK30KKworLyogQWRkIGEgQ0QtUk9NIGRyaXZlIHRvIG91ciBsaXN0IG9mIHZhbGlkIGRyaXZlcyAqLworc3RhdGljIHZvaWQgQWRkRHJpdmUoY2hhciAqZHJpdmUsIHN0cnVjdCBzdGF0ICpzdGJ1ZikKK3sKKwlpbnQgaTsKKworCWlmICggU0RMX251bWNkcyA8IE1BWF9EUklWRVMgKSB7CisJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbHJlYWR5IGluIG91ciBsaXN0LgorCSAJICAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2Ugc2VlIGEgZHJpdmUgdmlhIHN5bWJvbGljIGxpbmsuCisJCSAqLworCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgeworCQkJaWYgKCBzdGJ1Zi0+c3RfcmRldiA9PSBTRExfY2Rtb2RlW2ldICkgeworI2lmZGVmIERFQlVHX0NEUk9NCisgIGZwcmludGYoc3RkZXJyLCAiRHVwbGljYXRlIGRyaXZlIGRldGVjdGVkOiAlcyA9PSAlc1xuIiwgZHJpdmUsIFNETF9jZGxpc3RbaV0pOworI2VuZGlmCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJLyogQWRkIHRoaXMgZHJpdmUgdG8gb3VyIGxpc3QgKi8KKwkJaSA9IFNETF9udW1jZHM7CisJCVNETF9jZGxpc3RbaV0gPSBTRExfc3RyZHVwKGRyaXZlKTsKKwkJaWYgKCBTRExfY2RsaXN0W2ldID09IE5VTEwgKSB7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCXJldHVybjsKKwkJfQorCQlTRExfY2Rtb2RlW2ldID0gc3RidWYtPnN0X3JkZXY7CisJCSsrU0RMX251bWNkczsKKyNpZmRlZiBERUJVR19DRFJPTQorICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIENELVJPTSBkcml2ZTogJXNcbiIsIGRyaXZlKTsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQgQ2hlY2tNb3VudHMoKQoreworICAgIGNoYXIqICAgICAgICAgIGJ1ZmZlcjsKKyAgICBpbnQgICAgICAgICAgICBidWZzejsKKyAgICBzdHJ1Y3Qgdm1vdW50KiBwdHI7CisgICAgaW50ICAgICAgICAgICAgcmV0OworCisgICAgYnVmZmVyID0gKGNoYXIqKVNETF9tYWxsb2MoMTApOworICAgIGJ1ZnN6ICA9IDEwOworICAgIGlmICggYnVmZmVyPT1OVUxMICkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIDEwIGJ5dGVzIGluIGFpeC9TRExfc3lzY2Ryb20uYzpDaGVja01vdW50c1xuIiApOworCWV4aXQgKCAtMTAgKTsKKyAgICB9CisKKyAgICBkbworICAgIHsKKwkvKiBtbnRjdHJsKCkgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgbW91bnRlZCBmaWxlc3lzdGVtcyAqLworICAgICAgICByZXQgPSBtbnRjdGwgKCBNQ1RMX1FVRVJZLCBidWZzeiwgYnVmZmVyICk7CisgICAgICAgIGlmICggcmV0ID09IDAgKQorICAgICAgICB7CisJCQkJICAgLyogQnVmZmVyIHdhcyB0b28gc21hbGwsIHJlYWxsb2MuICAgICovCisgICAgICAgICAgICBidWZzeiA9ICooaW50KilidWZmZXI7IC8qIFJlcXVpcmVkIHNpemUgaXMgaW4gZmlyc3Qgd29yZC4gICAqLworCQkJCSAgIC8qICh3aGF0ZXZlciBhIHdvcmQgaXMgaW4gQUlYIDQuMy4zKSAqLworCQkJCSAgIC8qIGludCBzZWVtcyB0byBiZSBPSyBpbiAzMmJpdCBtb2RlLiAqLworICAgICAgICAgICAgU0RMX2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IChjaGFyKilTRExfbWFsbG9jKGJ1ZnN6KTsKKyAgICAgICAgICAgIGlmICggYnVmZmVyPT1OVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKwkJCSJDb3VsZCBub3QgYWxsb2NhdGUgJWQgYnl0ZXMgaW4gYWl4L1NETF9zeXNjZHJvbS5jOkNoZWNrTW91bnRzXG4iLAorCQkJYnVmc3ogKTsKKwkgICAgICAgIGV4aXQgKCAtMTAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWVsc2UgaWYgKCByZXQgPCAwICkKKwl7CisjaWZkZWYgREVCVUdfQ0RST00KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyB2bW91bnQgc3RydWN0dXJlc1xuIik7CisjZW5kaWYKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisgICAgd2hpbGUgKCByZXQgPT0gMCApOworCisjaWZkZWYgREVCVUdfQ0RST00KKyAgICBmcHJpbnRmICggc3RkZXJyLCAiUmVhZCAlZCB2bW91bnQgc3RydWN0dXJlc1xuIixyZXQgKTsKKyNlbmRpZgorICAgIHB0ciA9IChzdHJ1Y3Qgdm1vdW50KilidWZmZXI7CisgICAgZG8KKyAgICB7CisgICAgICAgICAgICBzd2l0Y2gocHRyLT52bXRfZ2ZzdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTU5UX0NEUk9NIDoKKyAgICAgICAgICAgICAgICB7CisJCSAgICBzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKwkJICAgIGNoYXIqICAgICAgIHRleHQ7CisKKwkJICAgIHRleHQgPSAoY2hhciopcHRyICsgcHRyLT52bXRfZGF0YVtWTVRfT0JKRUNUXS52bXRfb2ZmOworI2lmZGVmIERFQlVHX0NEUk9NCisgIGZwcmludGYoc3RkZXJyLCAiQ2hlY2tpbmcgbW91bnQgcGF0aDogJXMgbW91bnRlZCBvbiAlc1xuIiwKKwl0ZXh0LCAoY2hhciopcHRyICsgcHRyLT52bXRfZGF0YVtWTVRfU1RVQl0udm10X29mZiApOworI2VuZGlmCisJCSAgICBpZiAoIENoZWNrRHJpdmUoIHRleHQsICZzdGJ1ZikgPiAwKQorCQkgICAgeworCQkgICAgICAgIEFkZERyaXZlKCB0ZXh0LCAmc3RidWYpOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRyID0gKHN0cnVjdCB2bW91bnQqKSgoY2hhciopcHRyICsgcHRyLT52bXRfbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldC0tOworICAgIH0KKyAgICB3aGlsZSAoIHJldCA+IDAgKTsKKworICAgIGZyZWUgKCBidWZmZXIgKTsKK30KKworc3RhdGljIGludCBDaGVja05vbm1vdW50cygpCit7CisjaWZkZWYgX1RIUkVBRF9TQUZFCisgICAgQUZJTEVfdCAgICAgIGZzRmlsZSA9IE5VTEw7CisgICAgaW50ICAgICAgICAgIHBhc3NObyA9IDA7CisgICAgaW50ICAgICAgICAgIHJldDsKKyAgICBzdHJ1Y3QgZnN0YWIgZW50cnk7CisgICAgc3RydWN0IHN0YXQgIHN0YnVmOworCisgICAgcmV0ID0gc2V0ZnNlbnRfciggJmZzRmlsZSwgJnBhc3NObyApOworICAgIGlmICggcmV0ICE9IDAgKSByZXR1cm4gLTE7CisgICAgZG8KKyAgICB7CisgICAgICAgIHJldCA9IGdldGZzZW50X3IgKCAmZW50cnksICZmc0ZpbGUsICZwYXNzTm8gKTsKKyAgICAgICAgaWYgKCByZXQgPT0gMCApIHsKKyAgICAgICAgICAgIGNoYXIqIGwgPSBTRExfc3RycmNocihlbnRyeS5mc19zcGVjLCcvJyk7CisgICAgICAgICAgICBpZiAoIGwgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBpZiAoICFTRExfc3RybmNtcCgiY2QiLCsrbCwyKSApIHsKKyNpZmRlZiBERUJVR19DRFJPTQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKwkJCSAgICAiRm91bmQgdW5tb3VudGVkIENEIFJPTSBkcml2ZSB3aXRoIGRldmljZSBuYW1lICVzXG4iLAorCQkJICAgIGVudHJ5LmZzX3NwZWMpOworI2VuZGlmCisJCSAgICBpZiAoIENoZWNrRHJpdmUoIGVudHJ5LmZzX3NwZWMsICZzdGJ1ZikgPiAwKQorCQkgICAgeworCQkgICAgICAgIEFkZERyaXZlKCBlbnRyeS5mc19zcGVjLCAmc3RidWYpOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoIHJldCA9PSAwICk7CisgICAgcmV0ID0gZW5kZnNlbnRfciAoICZmc0ZpbGUgKTsKKyAgICBpZiAoIHJldCAhPSAwICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworI2Vsc2UKKyAgICBzdHJ1Y3QgZnN0YWIqIGVudHJ5OworICAgIHN0cnVjdCBzdGF0ICBzdGJ1ZjsKKworICAgIHNldGZzZW50KCk7CisgICAgZG8KKyAgICB7CisgICAgICAgIGVudHJ5ID0gZ2V0ZnNlbnQoKTsKKyAgICAgICAgaWYgKCBlbnRyeSAhPSBOVUxMICkgeworICAgICAgICAgICAgY2hhciogbCA9IFNETF9zdHJyY2hyKGVudHJ5LT5mc19zcGVjLCcvJyk7CisgICAgICAgICAgICBpZiAoIGwgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBpZiAoICFTRExfc3RybmNtcCgiY2QiLCsrbCwyKSApIHsKKyNpZmRlZiBERUJVR19DRFJPTQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRm91bmQgdW5tb3VudGVkIENEIFJPTSBkcml2ZSB3aXRoIGRldmljZSBuYW1lICVzIiwgZW50cnktPmZzX3NwZWMpOworI2VuZGlmCisJCSAgICBpZiAoIENoZWNrRHJpdmUoIGVudHJ5LT5mc19zcGVjLCAmc3RidWYpID4gMCkKKwkJICAgIHsKKwkJICAgICAgICBBZGREcml2ZSggZW50cnktPmZzX3NwZWMsICZzdGJ1Zik7CisJCSAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHdoaWxlICggZW50cnkgIT0gTlVMTCApOworICAgIGVuZGZzZW50KCk7CisjZW5kaWYKK30KKworaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQoreworCWNoYXIgKlNETGNkcm9tOworCXN0cnVjdCBzdGF0IHN0YnVmOworCisJLyogRmlsbCBpbiBvdXIgZHJpdmVyIGNhcGFiaWxpdGllcyAqLworCVNETF9DRGNhcHMuTmFtZSA9IFNETF9TWVNfQ0ROYW1lOworCVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOworCVNETF9DRGNhcHMuR2V0VE9DID0gU0RMX1NZU19DREdldFRPQzsKKwlTRExfQ0RjYXBzLlN0YXR1cyA9IFNETF9TWVNfQ0RTdGF0dXM7CisJU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7CisJU0RMX0NEY2Fwcy5QYXVzZSA9IFNETF9TWVNfQ0RQYXVzZTsKKwlTRExfQ0RjYXBzLlJlc3VtZSA9IFNETF9TWVNfQ0RSZXN1bWU7CisJU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7CisJU0RMX0NEY2Fwcy5FamVjdCA9IFNETF9TWVNfQ0RFamVjdDsKKwlTRExfQ0RjYXBzLkNsb3NlID0gU0RMX1NZU19DRENsb3NlOworCisJLyogTG9vayBpbiB0aGUgZW52aXJvbm1lbnQgZm9yIG91ciBDRC1ST00gZHJpdmUgbGlzdCAqLworCVNETGNkcm9tID0gU0RMX2dldGVudigiU0RMX0NEUk9NIik7CS8qICc6JyBzZXBhcmF0ZWQgbGlzdCBvZiBkZXZpY2VzICovCisJaWYgKCBTRExjZHJvbSAhPSBOVUxMICkgeworCQljaGFyICpjZHBhdGgsICpkZWxpbTsKKwkJc2l6ZV90IGxlbiA9IFNETF9zdHJsZW4oU0RMY2Ryb20pKzE7CisJCWNkcGF0aCA9IFNETF9zdGFja19hbGxvYyhjaGFyLCBsZW4pOworCQlpZiAoIGNkcGF0aCAhPSBOVUxMICkgeworCQkJU0RMX3N0cmxjcHkoY2RwYXRoLCBTRExjZHJvbSwgbGVuKTsKKwkJCVNETGNkcm9tID0gY2RwYXRoOworCQkJZG8geworCQkJCWRlbGltID0gU0RMX3N0cmNocihTRExjZHJvbSwgJzonKTsKKwkJCQlpZiAoIGRlbGltICkgeworCQkJCQkqZGVsaW0rKyA9ICdcMCc7CisJCQkJfQorI2lmZGVmIERFQlVHX0NEUk9NCisgIGZwcmludGYoc3RkZXJyLCAiQ2hlY2tpbmcgQ0QtUk9NIGRyaXZlIGZyb20gU0RMX0NEUk9NOiAlc1xuIiwgU0RMY2Ryb20pOworI2VuZGlmCisJCQkJaWYgKCBDaGVja0RyaXZlKFNETGNkcm9tLCAmc3RidWYpID4gMCApIHsKKwkJCQkJQWRkRHJpdmUoU0RMY2Ryb20sICZzdGJ1Zik7CisJCQkJfQorCQkJCWlmICggZGVsaW0gKSB7CisJCQkJCVNETGNkcm9tID0gZGVsaW07CisJCQkJfSBlbHNlIHsKKwkJCQkJU0RMY2Ryb20gPSBOVUxMOworCQkJCX0KKwkJCX0gd2hpbGUgKCBTRExjZHJvbSApOworCQkJU0RMX3N0YWNrX2ZyZWUoY2RwYXRoKTsKKwkJfQorCisJCS8qIElmIHdlIGZvdW5kIG91ciBkcml2ZXMsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCisJCWlmICggU0RMX251bWNkcyA+IDAgKSB7CisJCQlyZXR1cm4oMCk7CisJCX0KKwl9CisKKwlDaGVja01vdW50cygpOworCUNoZWNrTm9ubW91bnRzKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJhbCBpb2N0bCgpIENELVJPTSBjb21tYW5kIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0Rpb2N0bChpbnQgaWQsIGludCBjb21tYW5kLCB2b2lkICphcmcpCit7CisgICAgaW50IHJldHZhbDsKKworICAgIHJldHZhbCA9IGlvY3RsKGlkLCBjb21tYW5kLCBhcmcpOworICAgIGlmICggcmV0dmFsIDwgMCApIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJpb2N0bCgpIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpCit7CisJcmV0dXJuKFNETF9jZGxpc3RbZHJpdmVdKTsKK30KKworc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpCit7CisgICAgaW50ICAgZmQ7CisgICAgY2hhciogbGFzdHNsOworICAgIGNoYXIqIGNkcm9tbmFtZTsKKyAgICBzaXplX3QgbGVuOworCisgICAgLyoKKyAgICAgKiBXZSBmb3VuZCAvZGV2L2NkPyBkcml2ZXMgYW5kIHRoYXQgaXMgaW4gb3VyIGxpc3QuIEJ1dCB3ZSBjYW4KKyAgICAgKiBvcGVuIG9ubHkgdGhlIC9kZXYvcmNkPyB2ZXJzaW9ucyBvZiB0aG9zZSBkZXZpY2VzIGZvciBBdWRpbyBDRC4KKyAgICAgKi8KKyAgICBsZW4gPSBTRExfc3RybGVuKFNETF9jZGxpc3RbZHJpdmVdKSsyOworICAgIGNkcm9tbmFtZSA9IChjaGFyKilTRExfbWFsbG9jKGxlbik7CisgICAgU0RMX3N0cmxjcHkoY2Ryb21uYW1lLFNETF9jZGxpc3RbZHJpdmVdLGxlbik7CisgICAgbGFzdHNsID0gU0RMX3N0cnJjaHIoY2Ryb21uYW1lLCcvJyk7CisgICAgaWYgKGxhc3RzbCkgeworCSpsYXN0c2wgPSAwOworCVNETF9zdHJsY2F0KGNkcm9tbmFtZSwiL3IiLGxlbik7CisJbGFzdHNsID0gU0RMX3N0cnJjaHIoU0RMX2NkbGlzdFtkcml2ZV0sJy8nKTsKKwlpZiAobGFzdHNsKSB7CisJICAgIGxhc3RzbCsrOworCSAgICBTRExfc3RybGNhdChjZHJvbW5hbWUsbGFzdHNsLGxlbik7CisJfQorICAgIH0KKworI2lmZGVmIERFQlVHX0NEUk9NCisgICAgZnByaW50ZihzdGRlcnIsICJTaG91bGQgb3BlbiBkcml2ZSAlcywgb3BlbmluZyAlc1xuIiwgU0RMX2NkbGlzdFtkcml2ZV0sIGNkcm9tbmFtZSk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogVXNlIGV4Y2x1c2l2ZSBhY2Nlc3MuIERvbid0IHVzZSBTQ19ESUFHTk9TVElDUyBhcyB4bWNkIGRvZXMgYmVjYXVzZSB0aGV5CisgICAgICogcmVxdWlyZSByb290IHByaXZpbGVkZ2VzLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGF0LiBTQ19TSU5HTEUgcHJvdmlkZXMKKyAgICAgKiBleGNsdXNpdmUgYWNjZXNzIHdpdGggbGVzcyB0cm91YmxlLgorICAgICAqLworICAgIGZkID0gb3BlbngoY2Ryb21uYW1lLCBPX1JET05MWSwgTlVMTCwgU0NfU0lOR0xFKTsKKyAgICBpZiAoIGZkIDwgMCApCisgICAgeworI2lmZGVmIERFQlVHX0NEUk9NCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGRyaXZlICVzICglcylcbiIsIGNkcm9tbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworCXN0cnVjdCBtb2RlX2Zvcm1fb3AgY2RNb2RlOworCWludCAgICAgICAgICAgICAgICAgcmV0OworI2lmZGVmIERFQlVHX0NEUk9NCisJY2RNb2RlLmFjdGlvbiA9IENEX0dFVF9NT0RFOworCXJldCA9IFNETF9TWVNfQ0Rpb2N0bChmZCwgREtfQ0RfTU9ERSwgJmNkTW9kZSk7CisJaWYgKCByZXQgPCAwICkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisJICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgZHJpdmUgbW9kZSBmb3IgJXMgKCVzKVxuIiwKKwkJICAgIGNkcm9tbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9IGVsc2UgeworCSAgICBzd2l0Y2goY2RNb2RlLmNkX21vZGVfZm9ybSkgeworCQljYXNlIENEX01PREUxIDoKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisJICAgICAgICAgICAgICAgICJEcml2ZSBtb2RlIGZvciAlcyBpcyAlc1xuIiwKKwkJICAgICAgICBjZHJvbW5hbWUsICJDRC1ST00gRGF0YSBNb2RlIDEiKTsKKwkJICAgIGJyZWFrOworCQljYXNlIENEX01PREUyX0ZPUk0xIDoKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisJICAgICAgICAgICAgICAgICJEcml2ZSBtb2RlIGZvciAlcyBpcyAlc1xuIiwKKwkJICAgICAgICBjZHJvbW5hbWUsICJDRC1ST00gWEEgRGF0YSBNb2RlIDIgRm9ybSAxIik7CisJCSAgICBicmVhazsKKwkJY2FzZSBDRF9NT0RFMl9GT1JNMiA6CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorCSAgICAgICAgICAgICAgICAiRHJpdmUgbW9kZSBmb3IgJXMgaXMgJXNcbiIsCisJCSAgICAgICAgY2Ryb21uYW1lLCAiQ0QtUk9NIFhBIERhdGEgTW9kZSAyIEZvcm0gMiIpOworCQkgICAgYnJlYWs7CisJCWNhc2UgQ0RfREEgOgorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKwkgICAgICAgICAgICAgICAgIkRyaXZlIG1vZGUgZm9yICVzIGlzICVzXG4iLAorCQkgICAgICAgIGNkcm9tbmFtZSwgIkNELURBIik7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorCSAgICAgICAgICAgICAgICAiRHJpdmUgbW9kZSBmb3IgJXMgaXMgJXNcbiIsCisJCSAgICAgICAgY2Ryb21uYW1lLCAidW5rbm93biIpOworCQkgICAgYnJlYWs7CisJICAgIH0KKwl9CisjZW5kaWYKKworCWNkTW9kZS5hY3Rpb24gICAgICAgPSBDRF9DSEdfTU9ERTsKKwljZE1vZGUuY2RfbW9kZV9mb3JtID0gQ0RfREE7CisJcmV0ID0gU0RMX1NZU19DRGlvY3RsKGZkLCBES19DRF9NT0RFLCAmY2RNb2RlKTsKKwlpZiAoIHJldCA8IDAgKSB7CisjaWZkZWYgREVCVUdfQ0RST00KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorCSAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IGRyaXZlIG1vZGUgZm9yICVzICglcylcbiIsCisJCSAgICBjZHJvbW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisjZW5kaWYKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigiaW9jdGwoKSBlcnJvcjogQ291bGQgbm90IHNldCBDRCBkcml2ZSBtb2RlLCAlcyIsCisJICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworCX0gZWxzZSB7CisjaWZkZWYgREVCVUdfQ0RST00KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorCSAgICAgICAgICAgICJEcml2ZSBtb2RlIGZvciAlcyBzZXQgdG8gQ0RfREFcbiIsCisJCSAgICBjZHJvbW5hbWUpOworI2VuZGlmCisJfQorICAgIH0KKyAgICBTRExfZnJlZShjZHJvbW5hbWUpOworICAgIHJldHVybiBmZDsKK30KKworc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pCit7CisgICAgc3RydWN0IGNkX2F1ZGlvX2NtZCBjbWQ7CisgICAgc3RydWN0IGNkX2F1ZGlvX2NtZCBlbnRyeTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgaW50ICAgICAgICAgICAgICAgICBva2F5OworCisgICAgY21kLmF1ZGlvX2NtZHMgPSBDRF9UUktfSU5GT19BVURJTzsKKyAgICBjbWQubXNmX2ZsYWcgICA9IEZBTFNFOworICAgIGlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgREtBVURJTywgJmNtZCkgPCAwICkgeworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBva2F5ID0gMDsKKyAgICBjZHJvbS0+bnVtdHJhY2tzID0gY21kLmluZGV4aW5nLnRyYWNrX2luZGV4Lmxhc3RfdHJhY2sKKwkJICAgICAtIGNtZC5pbmRleGluZy50cmFja19pbmRleC5maXJzdF90cmFjaysxOworICAgIGlmICggY2Ryb20tPm51bXRyYWNrcyA+IFNETF9NQVhfVFJBQ0tTICkgeworICAgICAgICBjZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7CisgICAgfQorCisgICAgLyogUmVhZCBhbGwgdGhlIHRyYWNrIFRPQyBlbnRyaWVzICovCisgICAgZm9yICggaT0wOyBpPD1jZHJvbS0+bnVtdHJhY2tzOyArK2kgKSB7CisgICAgICAgIGlmICggaSA9PSBjZHJvbS0+bnVtdHJhY2tzICkgeworICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ldLmlkID0gMHhBQTs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjZHJvbS0+dHJhY2tbaV0uaWQgPSBjbWQuaW5kZXhpbmcudHJhY2tfaW5kZXguZmlyc3RfdHJhY2sraTsKKyAgICAgICAgfQorICAgICAgICBlbnRyeS5hdWRpb19jbWRzICAgICAgICAgPSBDRF9HRVRfVFJLX01TRjsKKwllbnRyeS5pbmRleGluZy50cmFja19tc2YudHJhY2sgPSBjZHJvbS0+dHJhY2tbaV0uaWQ7CisJaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBES0FVRElPLCAmZW50cnkpIDwgMCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ldLnR5cGUgPSAwOyAgICAvKiBkb24ndCBrbm93IGhvdyB0byBkZXRlY3QgMHgwNCBkYXRhIHRyYWNrICovCisgICAgICAgICAgICBjZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gTVNGX1RPX0ZSQU1FUygKKyAgICAgICAgICAgICAgICBlbnRyeS5pbmRleGluZy50cmFja19tc2YubWlucywKKyAgICAgICAgICAgICAgICBlbnRyeS5pbmRleGluZy50cmFja19tc2Yuc2VjcywKKyAgICAgICAgICAgICAgICBlbnRyeS5pbmRleGluZy50cmFja19tc2YuZnJhbWVzKTsKKyAgICAgICAgICAgIGNkcm9tLT50cmFja1tpXS5sZW5ndGggPSAwOworICAgICAgICAgICAgaWYgKCBpID4gMCApIHsKKyAgICAgICAgICAgICAgICBjZHJvbS0+dHJhY2tbaS0xXS5sZW5ndGggPSBjZHJvbS0+dHJhY2tbaV0ub2Zmc2V0CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAtIGNkcm9tLT50cmFja1tpLTFdLm9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIGkgPT0gKGNkcm9tLT5udW10cmFja3MrMSkgKSB7CisgICAgICAgIG9rYXkgPSAxOworICAgIH0KKyAgICByZXR1cm4ob2theSA/IDAgOiAtMSk7Cit9CisKKy8qIEdldCBDRC1ST00gc3RhdHVzICovCitzdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKQoreworICAgIENEc3RhdHVzICAgICAgICAgICAgc3RhdHVzOworICAgIHN0cnVjdCBjZF9hdWRpb19jbWQgY21kOworICAgIGNtZC5hdWRpb19jbWRzID0gQ0RfSU5GT19BVURJTzsKKworICAgIGlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgREtBVURJTywgJmNtZCkgPCAwICkgeworI2lmZGVmIERFQlVHX0NEUk9NCisgICAgZnByaW50ZihzdGRlcnIsICJpb2N0bCBmYWlsZWQgaW4gU0RMX1NZU19DRFN0YXR1cyAoJXMpXG4iLCBTRExfR2V0RXJyb3IoKSk7CisjZW5kaWYKKyAgICAgICAgc3RhdHVzID0gQ0RfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChjbWQuc3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIENEX05PX0FVRElPOgorICAgICAgICAgICAgY2FzZSBDRF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQ0RfU1RPUFBFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0RfUExBWV9BVURJTzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBDRF9QTEFZSU5HOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDRF9QQVVTRV9BVURJTzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBDRF9QQVVTRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENEX05PVF9WQUxJRDoKKyNpZmRlZiBERUJVR19DRFJPTQorICAgIGZwcmludGYoc3RkZXJyLCAiY2RTdGF0dXMgZmFpbGVkIHdpdGggQ0RfTk9UX1ZBTElEXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX0VSUk9SOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDRF9TVEFUVVNfRVJST1I6CisjaWZkZWYgREVCVUdfQ0RST00KKyAgICBmcHJpbnRmKHN0ZGVyciwgImNkU3RhdHVzIGZhaWxlZCB3aXRoIENEX1NUQVRVU19FUlJPUlxuIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBDRF9FUlJPUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisjaWZkZWYgREVCVUdfQ0RST00KKyAgICBmcHJpbnRmKHN0ZGVyciwgImNkU3RhdHVzIGZhaWxlZCB3aXRoIHVua25vd24gZXJyb3JcbiIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQ0RfRVJST1I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBwb3NpdGlvbiApIHsKKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gQ0RfUExBWUlORyB8fCAoc3RhdHVzID09IENEX1BBVVNFRCkgKSB7CisgICAgICAgICAgICAqcG9zaXRpb24gPSBNU0ZfVE9fRlJBTUVTKCBjbWQuaW5kZXhpbmcuaW5mb19hdWRpby5jdXJyZW50X21pbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQuaW5kZXhpbmcuaW5mb19hdWRpby5jdXJyZW50X3NlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQuaW5kZXhpbmcuaW5mb19hdWRpby5jdXJyZW50X2ZyYW1lcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcG9zaXRpb24gPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIFN0YXJ0IHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQoreworICAgIHN0cnVjdCBjZF9hdWRpb19jbWQgY21kOworCisgICAgLyoKKyAgICAgKiBNeSBDRCBSb20gaXMgbXV0ZWQgYnkgZGVmYXVsdC4gSSB0aGluayBJIHJlYWQgdGhhdCB0aGlzIGlzIG5ldyB3aXRoCisgICAgICogQUlYIDQuMy4gU0RMIGRvZXMgbm90IGNoYW5nZSB0aGUgdm9sdW1lLCBzbyBJIG5lZWQgYSBrbHVkZ2UuIE1heWJlCisgICAgICogaXRzIGJldHRlciB0byBkbyB0aGlzIGVsc2V3aGVyZT8KKyAgICAgKi8KKyAgICBjbWQuYXVkaW9fY21kcyA9IENEX1BMQVlfQVVESU8gfCBDRF9TRVRfVk9MVU1FOworICAgIGNtZC5tc2ZfZmxhZyAgID0gVFJVRTsKKyAgICBGUkFNRVNfVE9fTVNGKHN0YXJ0LAorICAgICAgICAgICAgICAgICAgJmNtZC5pbmRleGluZy5tc2YuZmlyc3RfbWlucywKKyAgICAgICAgICAgICAgICAgICZjbWQuaW5kZXhpbmcubXNmLmZpcnN0X3NlY3MsCisgICAgICAgICAgICAgICAgICAmY21kLmluZGV4aW5nLm1zZi5maXJzdF9mcmFtZXMpOworICAgIEZSQU1FU19UT19NU0Yoc3RhcnQrbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgJmNtZC5pbmRleGluZy5tc2YubGFzdF9taW5zLAorICAgICAgICAgICAgICAgICAgJmNtZC5pbmRleGluZy5tc2YubGFzdF9zZWNzLAorICAgICAgICAgICAgICAgICAgJmNtZC5pbmRleGluZy5tc2YubGFzdF9mcmFtZXMpOworICAgIGNtZC52b2x1bWVfdHlwZSAgICAgPSBDRF9WT0xVTUVfQUxMOworICAgIGNtZC5hbGxfY2hhbm5lbF92b2wgPSAyNTU7ICAgLyogVGhpcyBpcyBhIHVjaGFyLiBXaGF0IGlzIGEgZ29vZCB2YWx1ZT8gTm8gZG9jdSEgKi8KKyAgICBjbWQub3V0X3BvcnRfMF9zZWwgID0gQ0RfQVVESU9fQ0hOTF8wOworICAgIGNtZC5vdXRfcG9ydF8xX3NlbCAgPSBDRF9BVURJT19DSE5MXzE7CisgICAgY21kLm91dF9wb3J0XzJfc2VsICA9IENEX0FVRElPX0NITkxfMjsKKyAgICBjbWQub3V0X3BvcnRfM19zZWwgID0gQ0RfQVVESU9fQ0hOTF8zOworCisjaWZkZWYgREVCVUdfQ0RST00KKyAgZnByaW50ZihzdGRlcnIsICJUcnlpbmcgdG8gcGxheSBmcm9tICVkOiVkOiVkIHRvICVkOiVkOiVkXG4iLAorCWNtZC5pbmRleGluZy5tc2YuZmlyc3RfbWlucywKKwljbWQuaW5kZXhpbmcubXNmLmZpcnN0X3NlY3MsCisJY21kLmluZGV4aW5nLm1zZi5maXJzdF9mcmFtZXMsCisJY21kLmluZGV4aW5nLm1zZi5sYXN0X21pbnMsCisJY21kLmluZGV4aW5nLm1zZi5sYXN0X3NlY3MsCisJY21kLmluZGV4aW5nLm1zZi5sYXN0X2ZyYW1lcyk7CisjZW5kaWYKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgREtBVURJTywgJmNtZCkpOworfQorCisvKiBQYXVzZSBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKQoreworICAgIHN0cnVjdCBjZF9hdWRpb19jbWQgY21kOworICAgIGNtZC5hdWRpb19jbWRzID0gQ0RfUEFVU0VfQVVESU87CisgICAgcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIERLQVVESU8sICZjbWQpKTsKK30KKworLyogUmVzdW1lIHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKQoreworICAgIHN0cnVjdCBjZF9hdWRpb19jbWQgY21kOworICAgIGNtZC5hdWRpb19jbWRzID0gQ0RfUkVTVU1FX0FVRElPOworICAgIHJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBES0FVRElPLCAmY21kKSk7Cit9CisKKy8qIFN0b3AgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQoreworICAgIHN0cnVjdCBjZF9hdWRpb19jbWQgY21kOworICAgIGNtZC5hdWRpb19jbWRzID0gQ0RfU1RPUF9BVURJTzsKKyAgICByZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgREtBVURJTywgJmNtZCkpOworfQorCisvKiBFamVjdCB0aGUgQ0QtUk9NICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKQoreworICAgIHJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBES0VKRUNULCAwKSk7Cit9CisKKy8qIENsb3NlIHRoZSBDRC1ST00gaGFuZGxlICovCitzdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBjbG9zZShjZHJvbS0+aWQpOworfQorCit2b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoIFNETF9udW1jZHMgPiAwICkgeworCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgeworCQkJU0RMX2ZyZWUoU0RMX2NkbGlzdFtpXSk7CisJCX0KKwkJU0RMX251bWNkcyA9IDA7CisJfQorfQorCisjZW5kaWYgLyogU0RMX0NEUk9NX0FJWCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9iZW9zL1NETF9zeXNjZHJvbS5jYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vYmVvcy9TRExfc3lzY2Ryb20uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2MmMzOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vYmVvcy9TRExfc3lzY2Ryb20uY2MKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0NEUk9NX0JFT1MKKworLyogRnVuY3Rpb25zIGZvciBzeXN0ZW0tbGV2ZWwgQ0QtUk9NIGF1ZGlvIGNvbnRyb2wgb24gQmVPUworICAgKG5vdCBjb21wbGV0ZWx5IGltcGxlbWVudGVkIHlldCkKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHNjc2kuaD4KKyNpbmNsdWRlIDxEaXJlY3RvcnkuaD4KKyNpbmNsdWRlIDxFbnRyeS5oPgorI2luY2x1ZGUgPFBhdGguaD4KKworI2luY2x1ZGUgIlNETF9jZHJvbS5oIgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiLi4vU0RMX3N5c2Nkcm9tLmgiCit9CisKKy8qIENvbnN0YW50cyB0byBoZWxwIHVzIGdldCBhdCB0aGUgU0NTSSB0YWJsZS1vZi1jb250ZW50cyBpbmZvICovCisjZGVmaW5lIENEX05VTVRSQUNLUyh0b2MpCXRvYy50b2NfZGF0YVszXQorI2RlZmluZSBDRF9UUkFDSyh0b2MsIHRyYWNrKQkoJnRvYy50b2NfZGF0YVs2Kyh0cmFjaykqOF0pCisjZGVmaW5lIENEX1RSQUNLX04odG9jLCB0cmFjaykJQ0RfVFJBQ0sodG9jLCB0cmFjaylbMF0KKyNkZWZpbmUgQ0RfVFJBQ0tfTSh0b2MsIHRyYWNrKQlDRF9UUkFDSyh0b2MsIHRyYWNrKVszXQorI2RlZmluZSBDRF9UUkFDS19TKHRvYywgdHJhY2spCUNEX1RSQUNLKHRvYywgdHJhY2spWzRdCisjZGVmaW5lIENEX1RSQUNLX0YodG9jLCB0cmFjaykJQ0RfVFJBQ0sodG9jLCB0cmFjaylbNV0KKworLyogQ29uc3RhbnRzIHRvIGhlbHAgdXMgZ2V0IGF0IHRoZSBTQ1NJIHBvc2l0aW9uIGluZm8gKi8KKyNkZWZpbmUgUE9TX1RSQUNLKHBvcykJcG9zLnBvc2l0aW9uWzZdCisjZGVmaW5lIFBPU19BQlNfTShwb3MpCXBvcy5wb3NpdGlvbls5XQorI2RlZmluZSBQT1NfQUJTX1MocG9zKQlwb3MucG9zaXRpb25bMTBdCisjZGVmaW5lIFBPU19BQlNfRihwb3MpCXBvcy5wb3NpdGlvblsxMV0KKyNkZWZpbmUgUE9TX1JFTF9NKHBvcykJcG9zLnBvc2l0aW9uWzEzXQorI2RlZmluZSBQT1NfUkVMX1MocG9zKQlwb3MucG9zaXRpb25bMTRdCisjZGVmaW5lIFBPU19SRUxfRihwb3MpCXBvcy5wb3NpdGlvblsxNV0KKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgd2UnbGwgZGV0ZWN0ICovCisjZGVmaW5lIE1BWF9EUklWRVMJMTYJCisKKy8qIEEgbGlzdCBvZiBhdmFpbGFibGUgQ0QtUk9NIGRyaXZlcyAqLworc3RhdGljIGNoYXIgKlNETF9jZGxpc3RbTUFYX0RSSVZFU107CisKKy8qIFRoZSBzeXN0ZW0tZGVwZW5kZW50IENEIGNvbnRyb2wgZnVuY3Rpb25zICovCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOworc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSk7CitpbnQgdHJ5X2Rpcihjb25zdCBjaGFyICpkaXJlY3RvcnkpOworCisKKy8qIENoZWNrIGEgZHJpdmUgdG8gc2VlIGlmIGl0IGlzIGEgQ0QtUk9NICovCitzdGF0aWMgaW50IENoZWNrRHJpdmUoY2hhciAqZHJpdmUpCit7CisJc3RydWN0IHN0YXQgc3RidWY7CisJaW50IGlzX2NkLCBjZGZkOworCWRldmljZV9nZW9tZXRyeSBpbmZvOworCisJLyogSWYgaXQgZG9lc24ndCBleGlzdCwgcmV0dXJuIC0xICovCisJaWYgKCBzdGF0KGRyaXZlLCAmc3RidWYpIDwgMCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBJZiBpdCBkb2VzIGV4aXN0LCB2ZXJpZnkgdGhhdCBpdCdzIGFuIGF2YWlsYWJsZSBDRC1ST00gKi8KKwlpc19jZCA9IDA7CisJY2RmZCA9IG9wZW4oZHJpdmUsIDApOworCWlmICggY2RmZCA+PSAwICkgeworCQlpZiAoIGlvY3RsKGNkZmQsIEJfR0VUX0dFT01FVFJZLCAmaW5mbykgPT0gQl9OT19FUlJPUiApIHsKKwkJCWlmICggaW5mby5kZXZpY2VfdHlwZSA9PSBCX0NEICkgeworCQkJCWlzX2NkID0gMTsKKwkJCX0KKwkJfQorCQljbG9zZShjZGZkKTsKKwl9IGVsc2UgeworCQkvKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgZHJpdmUgaXMgb3BlbiAuLiAoPykgKi87CisJCWlzX2NkID0gMTsKKwl9CisJcmV0dXJuKGlzX2NkKTsKK30KKworLyogQWRkIGEgQ0QtUk9NIGRyaXZlIHRvIG91ciBsaXN0IG9mIHZhbGlkIGRyaXZlcyAqLworc3RhdGljIHZvaWQgQWRkRHJpdmUoY2hhciAqZHJpdmUpCit7CisJaW50IGk7CisJc2l6ZV90IGxlbjsKKworCWlmICggU0RMX251bWNkcyA8IE1BWF9EUklWRVMgKSB7CisJCS8qIEFkZCB0aGlzIGRyaXZlIHRvIG91ciBsaXN0ICovCisJCWkgPSBTRExfbnVtY2RzOworCQlsZW4gPSBTRExfc3RybGVuKGRyaXZlKSsxOworCQlTRExfY2RsaXN0W2ldID0gKGNoYXIgKilTRExfbWFsbG9jKGxlbik7CisJCWlmICggU0RMX2NkbGlzdFtpXSA9PSBOVUxMICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm47CisJCX0KKwkJU0RMX3N0cmxjcHkoU0RMX2NkbGlzdFtpXSwgZHJpdmUsIGxlbik7CisJCSsrU0RMX251bWNkczsKKyNpZmRlZiBDRFJPTV9ERUJVRworICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIENELVJPTSBkcml2ZTogJXNcbiIsIGRyaXZlKTsKKyNlbmRpZgorCX0KK30KKworLyogSURFIGJ1cyBzY2FubmluZyBtYWdpYyAqLworZW51bSB7CisJSURFX0dFVF9ERVZJQ0VTX0lORk8gPSBCX0RFVklDRV9PUF9DT0RFU19FTkQgKyA1MCwKK307CitzdHJ1Y3QgaWRlX2N0cmxfaW5mbyB7CisJYm9vbAlpZGVfMF9wcmVzZW50OworCWJvb2wJaWRlXzBfbWFzdGVyX3ByZXNlbnQ7CisJYm9vbAlpZGVfMF9zbGF2ZV9wcmVzZW50OworCWludAlpZGVfMF9tYXN0ZXJfdHlwZTsKKwlpbnQJaWRlXzBfc2xhdmVfdHlwZTsKKwlib29sCWlkZV8xX3ByZXNlbnQ7CisJYm9vbAlpZGVfMV9tYXN0ZXJfcHJlc2VudDsKKwlib29sCWlkZV8xX3NsYXZlX3ByZXNlbnQ7CisJaW50CWlkZV8xX21hc3Rlcl90eXBlOworCWludAlpZGVfMV9zbGF2ZV90eXBlOworfTsKKworaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQoreworCWNoYXIgKlNETGNkcm9tOworCisJLyogRmlsbCBpbiBvdXIgZHJpdmVyIGNhcGFiaWxpdGllcyAqLworCVNETF9DRGNhcHMuTmFtZSA9IFNETF9TWVNfQ0ROYW1lOworCVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOworCVNETF9DRGNhcHMuR2V0VE9DID0gU0RMX1NZU19DREdldFRPQzsKKwlTRExfQ0RjYXBzLlN0YXR1cyA9IFNETF9TWVNfQ0RTdGF0dXM7CisJU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7CisJU0RMX0NEY2Fwcy5QYXVzZSA9IFNETF9TWVNfQ0RQYXVzZTsKKwlTRExfQ0RjYXBzLlJlc3VtZSA9IFNETF9TWVNfQ0RSZXN1bWU7CisJU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7CisJU0RMX0NEY2Fwcy5FamVjdCA9IFNETF9TWVNfQ0RFamVjdDsKKwlTRExfQ0RjYXBzLkNsb3NlID0gU0RMX1NZU19DRENsb3NlOworCisJLyogTG9vayBpbiB0aGUgZW52aXJvbm1lbnQgZm9yIG91ciBDRC1ST00gZHJpdmUgbGlzdCAqLworCVNETGNkcm9tID0gU0RMX2dldGVudigiU0RMX0NEUk9NIik7CS8qICc6JyBzZXBhcmF0ZWQgbGlzdCBvZiBkZXZpY2VzICovCisJaWYgKCBTRExjZHJvbSAhPSBOVUxMICkgeworCQljaGFyICpjZHBhdGgsICpkZWxpbTsKKwkJc2l6ZV90IGxlbiA9IFNETF9zdHJsZW4oU0RMY2Ryb20pKzE7CisJCWNkcGF0aCA9IFNETF9zdGFja19hbGxvYyhjaGFyLCBsZW4pOworCQlpZiAoIGNkcGF0aCAhPSBOVUxMICkgeworCQkJU0RMX3N0cmxjcHkoY2RwYXRoLCBTRExjZHJvbSwgbGVuKTsKKwkJCVNETGNkcm9tID0gY2RwYXRoOworCQkJZG8geworCQkJCWRlbGltID0gU0RMX3N0cmNocihTRExjZHJvbSwgJzonKTsKKwkJCQlpZiAoIGRlbGltICkgeworCQkJCQkqZGVsaW0rKyA9ICdcMCc7CisJCQkJfQorCQkJCWlmICggQ2hlY2tEcml2ZShTRExjZHJvbSkgPiAwICkgeworCQkJCQlBZGREcml2ZShTRExjZHJvbSk7CisJCQkJfQorCQkJCWlmICggZGVsaW0gKSB7CisJCQkJCVNETGNkcm9tID0gZGVsaW07CisJCQkJfSBlbHNlIHsKKwkJCQkJU0RMY2Ryb20gPSBOVUxMOworCQkJCX0KKwkJCX0gd2hpbGUgKCBTRExjZHJvbSApOworCQkJU0RMX3N0YWNrX2ZyZWUoY2RwYXRoKTsKKwkJfQorCisJCS8qIElmIHdlIGZvdW5kIG91ciBkcml2ZXMsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCisJCWlmICggU0RMX251bWNkcyA+IDAgKSB7CisJCQlyZXR1cm4oMCk7CisJCX0KKwl9CisJCisJLyogU2NhbiB0aGUgc3lzdGVtIGZvciBDRC1ST00gZHJpdmVzICovCisJdHJ5X2RpcigiL2Rldi9kaXNrIik7CisJcmV0dXJuIDA7Cit9CisKKworaW50IHRyeV9kaXIoY29uc3QgY2hhciAqZGlyZWN0b3J5KQoreyAKKwlCRGlyZWN0b3J5IGRpcjsgCisJZGlyLlNldFRvKGRpcmVjdG9yeSk7IAorCWlmKGRpci5Jbml0Q2hlY2soKSAhPSBCX05PX0VSUk9SKSB7IAorCQlyZXR1cm4gZmFsc2U7IAorCX0gCisJZGlyLlJld2luZCgpOyAKKwlCRW50cnkgZW50cnk7IAorCXdoaWxlKGRpci5HZXROZXh0RW50cnkoJmVudHJ5KSA+PSAwKSB7IAorCQlCUGF0aCBwYXRoOyAKKwkJY29uc3QgY2hhciAqbmFtZTsgCisJCWVudHJ5X3JlZiBlOyAKKwkJCisJCWlmKGVudHJ5LkdldFBhdGgoJnBhdGgpICE9IEJfTk9fRVJST1IpIAorCQkJY29udGludWU7IAorCQluYW1lID0gcGF0aC5QYXRoKCk7IAorCQkKKwkJaWYoZW50cnkuR2V0UmVmKCZlKSAhPSBCX05PX0VSUk9SKSAKKwkJCWNvbnRpbnVlOyAKKworCQlpZihlbnRyeS5Jc0RpcmVjdG9yeSgpKSB7IAorCQkJaWYoU0RMX3N0cmNtcChlLm5hbWUsICJmbG9wcHkiKSA9PSAwKSAKKwkJCQljb250aW51ZTsgLyogaWdub3JlIGZsb3BweSAoaXQgaXMgbm90IHNpbGVudCkgICovCisJCQlpbnQgZGV2ZmQgPSB0cnlfZGlyKG5hbWUpOworCQkJaWYoZGV2ZmQgPj0gMCkKKwkJCQlyZXR1cm4gZGV2ZmQ7CisJCX0gCisJCWVsc2UgeyAKKwkJCWludCBkZXZmZDsgCisJCQlkZXZpY2VfZ2VvbWV0cnkgZzsgCisKKwkJCWlmKFNETF9zdHJjbXAoZS5uYW1lLCAicmF3IikgIT0gMCkgCisJCQkJY29udGludWU7IC8qIGlnbm9yZSBwYXJ0aXRpb25zICovCisKKwkJCWRldmZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7IAorCQkJaWYoZGV2ZmQgPCAwKSAKKwkJCQljb250aW51ZTsgCisKKwkJCWlmKGlvY3RsKGRldmZkLCBCX0dFVF9HRU9NRVRSWSwgJmcsIHNpemVvZihnKSkgPj0gMCkgeworCQkJCWlmKGcuZGV2aWNlX3R5cGUgPT0gQl9DRCkKKwkJCQl7CisJCQkJQWRkRHJpdmUoc3RyZHVwKG5hbWUpKTsKKwkJCQl9CisJCQl9CisJCQljbG9zZShkZXZmZCk7CisJCX0gCisJfQorCXJldHVybiBCX0VSUk9SOworfQorCisKKy8qIEdlbmVyYWwgaW9jdGwoKSBDRC1ST00gY29tbWFuZCBmdW5jdGlvbiAqLworc3RhdGljIGludCBTRExfU1lTX0NEaW9jdGwoaW50IGluZGV4LCBpbnQgY29tbWFuZCwgdm9pZCAqYXJnKQoreworCWludCBva2F5OworCWludCBmZDsKKworCW9rYXkgPSAwOworCWZkID0gb3BlbihTRExfY2RsaXN0W2luZGV4XSwgMCk7CisJaWYgKCBmZCA+PSAwICkgeworCQlpZiAoIGlvY3RsKGZkLCBjb21tYW5kLCBhcmcpID09IEJfTk9fRVJST1IgKSB7CisJCQlva2F5ID0gMTsKKwkJfQorCQljbG9zZShmZCk7CisJfQorCXJldHVybihva2F5ID8gMCA6IC0xKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKK3sKKwlyZXR1cm4oU0RMX2NkbGlzdFtkcml2ZV0pOworfSAKKworc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpCit7CisJcmV0dXJuKGRyaXZlKTsKK30KKworc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pCit7CisJaW50IGk7CisJc2NzaV90b2MgdG9jOworCisJaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBCX1NDU0lfR0VUX1RPQywgJnRvYykgPT0gMCApIHsKKwkJY2Ryb20tPm51bXRyYWNrcyA9IENEX05VTVRSQUNLUyh0b2MpOworCQlpZiAoIGNkcm9tLT5udW10cmFja3MgPiBTRExfTUFYX1RSQUNLUyApIHsKKwkJCWNkcm9tLT5udW10cmFja3MgPSBTRExfTUFYX1RSQUNLUzsKKwkJfQorCQlmb3IgKCBpPTA7IGk8PWNkcm9tLT5udW10cmFja3M7ICsraSApIHsKKwkJCWNkcm9tLT50cmFja1tpXS5pZCA9IENEX1RSQUNLX04odG9jLCBpKTsKKwkJCS8qIEZJWE1FOiAgSG93IGRvIHdlIHRlbGwgb24gQmVPUz8gKi8KKwkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOworCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IE1TRl9UT19GUkFNRVMoCisJCQkJCQkJQ0RfVFJBQ0tfTSh0b2MsIGkpLAorCQkJCQkJCUNEX1RSQUNLX1ModG9jLCBpKSwKKwkJCQkJCQlDRF9UUkFDS19GKHRvYywgaSkpOworCQkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IDA7CisJCQlpZiAoIGkgPiAwICkgeworCQkJCWNkcm9tLT50cmFja1tpLTFdLmxlbmd0aCA9CisJCQkJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0LQorCQkJCQkJY2Ryb20tPnRyYWNrW2ktMV0ub2Zmc2V0OworCQkJfQorCQl9CisJCXJldHVybigwKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oLTEpOworCX0KK30KKworLyogR2V0IENELVJPTSBzdGF0dXMgKi8KK3N0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pCit7CisJQ0RzdGF0dXMgc3RhdHVzOworCWludCBmZDsKKwlpbnQgY3VyX2ZyYW1lOworCXNjc2lfcG9zaXRpb24gcG9zOworCisJZmQgPSBvcGVuKFNETF9jZGxpc3RbY2Ryb20tPmlkXSwgMCk7CisJY3VyX2ZyYW1lID0gMDsKKwlpZiAoIGZkID49IDAgKSB7CisJCWlmICggaW9jdGwoZmQsIEJfU0NTSV9HRVRfUE9TSVRJT04sICZwb3MpID09IEJfTk9fRVJST1IgKSB7CisJCQljdXJfZnJhbWUgPSBNU0ZfVE9fRlJBTUVTKAorCQkJCVBPU19BQlNfTShwb3MpLCBQT1NfQUJTX1MocG9zKSwgUE9TX0FCU19GKHBvcykpOworCQl9CisJCWlmICggISBwb3MucG9zaXRpb25bMV0gfHwgKHBvcy5wb3NpdGlvblsxXSA+PSAweDEzKSB8fAorCQkJKChwb3MucG9zaXRpb25bMV0gPT0gMHgxMikgJiYgKCFwb3MucG9zaXRpb25bNl0pKSApIHsKKwkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7CisJCX0gZWxzZQorCQlpZiAoIHBvcy5wb3NpdGlvblsxXSA9PSAweDExICkgeworCQkJc3RhdHVzID0gQ0RfUExBWUlORzsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENEX1BBVVNFRDsKKwkJfQorCQljbG9zZShmZCk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOworCX0KKwlpZiAoIHBvc2l0aW9uICkgeworCQkqcG9zaXRpb24gPSBjdXJfZnJhbWU7CisJfQorCXJldHVybihzdGF0dXMpOworfQorCisvKiBTdGFydCBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgb2theTsKKwlpbnQgZmQ7CisJc2NzaV9wbGF5X3Bvc2l0aW9uIHBvczsKKworCW9rYXkgPSAwOworCWZkID0gb3BlbihTRExfY2RsaXN0W2Nkcm9tLT5pZF0sIDApOworCWlmICggZmQgPj0gMCApIHsKKwkJRlJBTUVTX1RPX01TRihzdGFydCwgJnBvcy5zdGFydF9tLCAmcG9zLnN0YXJ0X3MsICZwb3Muc3RhcnRfZik7CisJCUZSQU1FU19UT19NU0Yoc3RhcnQrbGVuZ3RoLCAmcG9zLmVuZF9tLCAmcG9zLmVuZF9zLCAmcG9zLmVuZF9mKTsKKwkJaWYgKCBpb2N0bChmZCwgQl9TQ1NJX1BMQVlfUE9TSVRJT04sICZwb3MpID09IEJfTk9fRVJST1IgKSB7CisJCQlva2F5ID0gMTsKKwkJfQorCQljbG9zZShmZCk7CisJfQorCXJldHVybihva2F5ID8gMCA6IC0xKTsKK30KKworLyogUGF1c2UgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQl9TQ1NJX1BBVVNFX0FVRElPLCAwKSk7Cit9CisKKy8qIFJlc3VtZSBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQl9TQ1NJX1JFU1VNRV9BVURJTywgMCkpOworfQorCisvKiBTdG9wIHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQl9TQ1NJX1NUT1BfQVVESU8sIDApKTsKK30KKworLyogRWplY3QgdGhlIENELVJPTSAqLworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQl9TQ1NJX0VKRUNULCAwKSk7Cit9CisKKy8qIENsb3NlIHRoZSBDRC1ST00gaGFuZGxlICovCitzdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSkKK3sKKwljbG9zZShjZHJvbS0+aWQpOworfQorCit2b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoIFNETF9udW1jZHMgPiAwICkgeworCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgeworCQkJU0RMX2ZyZWUoU0RMX2NkbGlzdFtpXSk7CisJCX0KKwkJU0RMX251bWNkcyA9IDA7CisJfQorfQorCisjZW5kaWYgLyogU0RMX0NEUk9NX0JFT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vYnNkaS9TRExfc3lzY2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vYnNkaS9TRExfc3lzY2Ryb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWVkYjgxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9ic2RpL1NETF9zeXNjZHJvbS5jCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9DRFJPTV9CU0RJCisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCBmb3IgQlNEL09TIDQueAorICogVGhpcyBzdGFydGVkIGxpZmUgb3V0IGFzIGEgY29weSBvZiB0aGUgZnJlZWJzZC9TRExfY2Ryb20uYyBmaWxlIGJ1dCB3YXMKKyAqIGhlYXZpbHkgbW9kaWZpZWQuICAgV29ya3MgZm9yIHN0YW5kYXJkIChNTUMpIFNDU0kgYW5kIEFUQVBJIENEcm9tIGRyaXZlcy4KKyAqCisgKiBTdGV2ZW4gU2NodWx0eiAtIHNtc0B0by5nZC1lcy5jb20KKyovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJyLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8L3N5cy9kZXYvc2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8L3N5cy9kZXYvc2NzaS9zY3NpX2lvY3RsLmg+CisKKyNpbmNsdWRlICJTRExfY2Ryb20uaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKKworLyoKKyAqIFRoZSBtc2ZfdG9fZnJhbWUgYW5kIGZyYW1lX3RvX21zZiB3ZXJlIHlhbmtlZCBmcm9tIGxpYmNkcm9tIGFuZCBpbmxpbmVkCisgKiBoZXJlIHNvIHRoYXQgLWxjZHJvbSBkb2Vzbid0IGhhdmUgdG8gYmUgZHJhZ2dlZCBpbiBmb3Igc29tZXRoaW5nIHNvIHNpbXBsZS4KKyovCisKKyNkZWZpbmUJRlJBTUVTX1BFUl9TRUNPTkQJNzUKKyNkZWZpbmUJRlJBTUVTX1BFUl9NSU5VVEUJKEZSQU1FU19QRVJfU0VDT05EICogNjApCisKK2ludAorbXNmX3RvX2ZyYW1lKGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCBmcmFtZSkKKwl7CisJcmV0dXJuKG1pbnV0ZSAqIEZSQU1FU19QRVJfTUlOVVRFICsgc2Vjb25kICogRlJBTUVTX1BFUl9TRUNPTkQgKyBmcmFtZSk7CisJfQorCit2b2lkCitmcmFtZV90b19tc2YoaW50IGZyYW1lLCBpbnQgKm1pbnAsIGludCAqc2VjcCwgaW50ICpmcmFtZXApCisJeworCSptaW5wID0gZnJhbWUgLyBGUkFNRVNfUEVSX01JTlVURTsKKwkqc2VjcCA9IChmcmFtZSAlIEZSQU1FU19QRVJfTUlOVVRFKSAvIEZSQU1FU19QRVJfU0VDT05EOworCSpmcmFtZXAgPSBmcmFtZSAlIEZSQU1FU19QRVJfU0VDT05EOworCX0KKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgd2UnbGwgZGV0ZWN0ICovCisjZGVmaW5lIE1BWF9EUklWRVMJMTYJCisKKy8qIEEgbGlzdCBvZiBhdmFpbGFibGUgQ0QtUk9NIGRyaXZlcyAqLworc3RhdGljIGNoYXIgKlNETF9jZGxpc3RbTUFYX0RSSVZFU107CitzdGF0aWMgZGV2X3QgU0RMX2NkbW9kZVtNQVhfRFJJVkVTXTsKKworLyogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQ0QgY29udHJvbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOworc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOworc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOworc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKKwordHlwZWRlZglzdHJ1Y3QJc2NzaV9jZGIgY2RiX3Q7CisKK3N0YXRpYyBpbnQgc2NzaV9jbWQoaW50IGZkLAorCQlzdHJ1Y3Qgc2NzaV9jZGIgKmNkYiwKKwkJaW50IGNkYmxlbiwgCisJCWludCBydywKKwkJY2FkZHJfdCBkYXRhLAorCQlpbnQgZGF0YWxlbiwKKwkJc3RydWN0IHNjc2lfdXNlcl9jZGIgKnN1cykKKwl7CisJaW50CXNjc2lzdGF0dXM7CisJdW5zaWduZWQgY2hhcgkqY3A7CisJc3RydWN0CXNjc2lfdXNlcl9jZGIgc3VjOworCisgICAgLyogc2FmZXR5IGNoZWNrcyAqLworCWlmCSghY2RiKSByZXR1cm4oLTEpOworCWlmCShydyAhPSBTVUNfUkVBRCAmJiBydyAhPSBTVUNfV1JJVEUpIHJldHVybigtMSk7CisKKwlzdWMuc3VjX2ZsYWdzID0gcnc7CisJc3VjLnN1Y19jZGJsZW4gPSBjZGJsZW47CisJYmNvcHkoY2RiLCBzdWMuc3VjX2NkYiwgY2RibGVuKTsKKwlzdWMuc3VjX2RhdGFsZW4gPSBkYXRhbGVuOworCXN1Yy5zdWNfZGF0YSA9IGRhdGE7CisJc3VjLnN1Y190aW1lb3V0ID0gMTA7CQkvKiAxMCBzZWNzIG1heCBmb3IgVFVSIG9yIFNFTlNFICovCisJaWYJKGlvY3RsKGZkLCBTQ1NJUkFXQ0RCLCAmc3VjKSA9PSAtMSkKKwkJcmV0dXJuKC0xMSk7CisJc2NzaXN0YXR1cyA9IHN1Yy5zdWNfc3VzLnN1c19zdGF0dXM7CisJY3AgPSBzdWMuc3VjX3N1cy5zdXNfc2Vuc2U7CisKKy8qCisgKiBJZiBhIHBsYWNlIHRvIGNvcHkgdGhlIHNlbnNlIGRhdGEgYmFjayB0byBoYXMgYmVlbiBwcm92aWRlZCB0aGVuIHRoZQorICogY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyB0aGUgZXJyb3JzIGFuZCBwcmludGluZyBhbnkgaW5mb3JtYXRpb24KKyAqIG91dCBpZiB0aGUgc3RhdHVzIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KKyovCisJaWYJKHNjc2lzdGF0dXMgIT0gMCAmJiAhc3VzKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCJzY3Npc3RhdHVzID0gJXggY21kID0gJXhcbiIsCisJCQlzY3Npc3RhdHVzLCBjZGJbMF0pOworCQlmcHJpbnRmKHN0ZGVyciwgInNlbnNlICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCAKKwkJCWNwWzBdLCBjcFsxXSwgY3BbMl0sIGNwWzNdLCBjcFs0XSwgY3BbNV0sCisJCQljcFs2XSwgY3BbN10sIGNwWzhdLCBjcFs5XSwgY3BbMTBdLCBjcFsxMV0sCisJCQljcFsxMl0sIGNwWzEzXSwgY3BbMTRdLCBjcFsxNV0pOworCQlyZXR1cm4oMSk7CisJCX0KKwlpZgkoc3VzKQorCQliY29weSgmc3VjLCBzdXMsIHNpemVvZiAoc3RydWN0IHNjc2lfdXNlcl9jZGIpKTsKKwlpZgkoc2NzaXN0YXR1cykKKwkJcmV0dXJuKDEpOwkvKiBSZXR1cm4gbm9uLXplcm8gZm9yIHVuc3VjY2Vzc2Z1bCBzdGF0dXMgKi8KKwlyZXR1cm4oMCk7CisJfQorCisvKiByZXF1ZXN0IHZlbmRvciBicmFuZCBhbmQgbW9kZWwgKi8KK3Vuc2lnbmVkIGNoYXIgKklucXVpcnkoaW50IGZkKQorCXsKKwlzdGF0aWMgc3RydWN0IHNjc2lfY2RiNiBjZGIgPSAKKwkJeworCQkweDEyLCAKKwkJMCwgMCwgMCwKKwkJNTYsCisJCTAKKwkJfTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBJbnFidWZmZXJbNTZdOworCisJaWYJKHNjc2lfY21kKGZkLCAoY2RiX3QgKikmY2RiLCA2LCBTVUNfUkVBRCwgSW5xYnVmZmVyLCAKKwkJCXNpemVvZihJbnFidWZmZXIpLCAwKSkKKwkJcmV0dXJuKCJcMzc3Iik7CisJcmV0dXJuKElucWJ1ZmZlcik7CisJfQorCisjZGVmaW5lIEFERF9TRU5TRUNPREUgMTIKKyNkZWZpbmUgQUREX1NDX1FVQUxJRklFUiAxMworCitpbnQgVGVzdEZvck1lZGl1bShpbnQgZmQpCisJeworCWludAlzdHMsIGFzYywgYXNjcTsKKwlzdHJ1Y3QJc2NzaV91c2VyX2NkYiBzdXM7CisJc3RhdGljIHN0cnVjdCBzY3NpX2NkYjYgY2RiID0KKwkJeworCQlDTURfVEVTVF9VTklUX1JFQURZLCAvKiBjb21tYW5kICovCisJCTAsCS8qIHJlc2VydmVkICovCisJCTAsCS8qIHJlc2VydmVkICovCisJCTAsCS8qIHJlc2VydmVkICovCisJCTAsCS8qIHJlc2VydmVkICovCisJCTAJLyogcmVzZXJ2ZWQgKi8KKwkJfTsKKworYWdhaW46CXN0cyA9IHNjc2lfY21kKGZkLCAoY2RiX3QgKikmY2RiLCA2LCBTVUNfUkVBRCwgMCwgMCwgJnN1cyk7CisJYXNjID0gc3VzLnN1Y19zdXMuc3VzX3NlbnNlW0FERF9TRU5TRUNPREVdOworCWFzY3EgPSBzdXMuc3VjX3N1cy5zdXNfc2Vuc2VbQUREX1NDX1FVQUxJRklFUl07CisJaWYJKGFzYyA9PSAweDNhICYmIGFzY3EgPT0gMHgwKQkvKiBubyBtZWRpdW0gKi8KKwkJcmV0dXJuKDApOworCWlmCShhc2MgPT0gMHgyOCAmJiBhc2NxID09IDB4MCkJLyogbWVkaXVtIGNoYW5nZWQgKi8KKwkJZ290byBhZ2FpbjsKKwlpZgkoYXNjID09IDB4NCAmJiBhc2NxID09IDB4MSApCS8qIGNvbWluZyByZWFkeSAqLworCQl7CisJCXNsZWVwKDIpOworCQlnb3RvIGFnYWluOworCQl9CisJcmV0dXJuKDEpOworCX0KKworLyogQ2hlY2sgYSBkcml2ZSB0byBzZWUgaWYgaXQgaXMgYSBDRC1ST00gKi8KK3N0YXRpYyBpbnQgQ2hlY2tEcml2ZShjaGFyICpkcml2ZSwgc3RydWN0IHN0YXQgKnN0YnVmKQoreworCWludCBpc19jZCA9IDAsIGNkZmQ7CisJY2hhciAqcDsKKworCS8qIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHJldHVybiAtMSAqLworCWlmICggc3RhdChkcml2ZSwgc3RidWYpIDwgMCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBJZiBpdCBkb2VzIGV4aXN0LCB2ZXJpZnkgdGhhdCBpdCdzIGFuIGF2YWlsYWJsZSBDRC1ST00gKi8KKwljZGZkID0gb3Blbihkcml2ZSwgKE9fUkRPTkxZfE9fRVhDTHxPX05PTkJMT0NLKSwgMCk7CisJaWYgKCBjZGZkID49IDAgKSB7CisJCXAgPSBJbnF1aXJ5KGNkZmQpOworCQlpZiAoKnAgPT0gVFlQRV9ST00pCisJCQlpc19jZCA9IDE7CisJCWNsb3NlKGNkZmQpOworCX0KKwlyZXR1cm4oaXNfY2QpOworfQorCisvKiBBZGQgYSBDRC1ST00gZHJpdmUgdG8gb3VyIGxpc3Qgb2YgdmFsaWQgZHJpdmVzICovCitzdGF0aWMgdm9pZCBBZGREcml2ZShjaGFyICpkcml2ZSwgc3RydWN0IHN0YXQgKnN0YnVmKQoreworCWludCBpOworCisJaWYgKCBTRExfbnVtY2RzIDwgTUFYX0RSSVZFUyApIHsKKwkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGl0J3Mgbm90IGFscmVhZHkgaW4gb3VyIGxpc3QuCisJIAkgICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBzZWUgYSBkcml2ZSB2aWEgc3ltYm9saWMgbGluay4KKwkJICovCisJCWZvciAoIGk9MDsgaTxTRExfbnVtY2RzOyArK2kgKSB7CisJCQlpZiAoIHN0YnVmLT5zdF9yZGV2ID09IFNETF9jZG1vZGVbaV0gKSB7CisjaWZkZWYgREVCVUdfQ0RST00KKyAgZnByaW50ZihzdGRlcnIsICJEdXBsaWNhdGUgZHJpdmUgZGV0ZWN0ZWQ6ICVzID09ICVzXG4iLCBkcml2ZSwgU0RMX2NkbGlzdFtpXSk7CisjZW5kaWYKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvKiBBZGQgdGhpcyBkcml2ZSB0byBvdXIgbGlzdCAqLworCQlpID0gU0RMX251bWNkczsKKwkJU0RMX2NkbGlzdFtpXSA9IFNETF9zdHJkdXAoZHJpdmUpOworCQlpZiAoIFNETF9jZGxpc3RbaV0gPT0gTlVMTCApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuOworCQl9CisJCVNETF9jZG1vZGVbaV0gPSBzdGJ1Zi0+c3RfcmRldjsKKwkJKytTRExfbnVtY2RzOworI2lmZGVmIERFQlVHX0NEUk9NCisgIGZwcmludGYoc3RkZXJyLCAiQWRkZWQgQ0QtUk9NIGRyaXZlOiAlc1xuIiwgZHJpdmUpOworI2VuZGlmCisJfQorfQorCitpbnQgIFNETF9TWVNfQ0RJbml0KHZvaWQpCit7CisJLyogY2hlY2tsaXN0OiAvZGV2L3Jzcj9jICovCisJc3RhdGljIGNoYXIgKmNoZWNrbGlzdFtdID0geworCSI/MCByc3I/IiwgTlVMTAorCX07CisJY2hhciAqU0RMY2Ryb207CisJaW50IGksIGosIGV4aXN0czsKKwljaGFyIGRyaXZlWzMyXTsKKwlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKworCS8qIEZpbGwgaW4gb3VyIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KKwlTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKKwlTRExfQ0RjYXBzLk9wZW4gPSBTRExfU1lTX0NET3BlbjsKKwlTRExfQ0RjYXBzLkdldFRPQyA9IFNETF9TWVNfQ0RHZXRUT0M7CisJU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOworCVNETF9DRGNhcHMuUGxheSA9IFNETF9TWVNfQ0RQbGF5OworCVNETF9DRGNhcHMuUGF1c2UgPSBTRExfU1lTX0NEUGF1c2U7CisJU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOworCVNETF9DRGNhcHMuU3RvcCA9IFNETF9TWVNfQ0RTdG9wOworCVNETF9DRGNhcHMuRWplY3QgPSBTRExfU1lTX0NERWplY3Q7CisJU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKKworCS8qIExvb2sgaW4gdGhlIGVudmlyb25tZW50IGZvciBvdXIgQ0QtUk9NIGRyaXZlIGxpc3QgKi8KKwlTRExjZHJvbSA9IFNETF9nZXRlbnYoIlNETF9DRFJPTSIpOwkvKiAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZGV2aWNlcyAqLworCWlmICggU0RMY2Ryb20gIT0gTlVMTCApIHsKKwkJY2hhciAqY2RwYXRoLCAqZGVsaW07CisJCXNpemVfdCBsZW4gPSBTRExfc3RybGVuKFNETGNkcm9tKSsxOworCQljZHBhdGggPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbGVuKTsKKwkJaWYgKCBjZHBhdGggIT0gTlVMTCApIHsKKwkJCVNETF9zdHJsY3B5KGNkcGF0aCwgU0RMY2Ryb20sIGxlbik7CisJCQlTRExjZHJvbSA9IGNkcGF0aDsKKwkJCWRvIHsKKwkJCQlkZWxpbSA9IFNETF9zdHJjaHIoU0RMY2Ryb20sICc6Jyk7CisJCQkJaWYgKCBkZWxpbSApIHsKKwkJCQkJKmRlbGltKysgPSAnXDAnOworCQkJCX0KKwkJCQlpZiAoIENoZWNrRHJpdmUoU0RMY2Ryb20sICZzdGJ1ZikgPiAwICkgeworCQkJCQlBZGREcml2ZShTRExjZHJvbSwgJnN0YnVmKTsKKwkJCQl9CisJCQkJaWYgKCBkZWxpbSApIHsKKwkJCQkJU0RMY2Ryb20gPSBkZWxpbTsKKwkJCQl9IGVsc2UgeworCQkJCQlTRExjZHJvbSA9IE5VTEw7CisJCQkJfQorCQkJfSB3aGlsZSAoIFNETGNkcm9tICk7CisJCQlTRExfc3RhY2tfZnJlZShjZHBhdGgpOworCQl9CisKKwkJLyogSWYgd2UgZm91bmQgb3VyIGRyaXZlcywgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gKi8KKwkJaWYgKCBTRExfbnVtY2RzID4gMCApIHsKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKworCS8qIFNjYW4gdGhlIHN5c3RlbSBmb3IgQ0QtUk9NIGRyaXZlcyAqLworCWZvciAoIGk9MDsgY2hlY2tsaXN0W2ldOyArK2kgKSB7CisJCWlmICggY2hlY2tsaXN0W2ldWzBdID09ICc/JyApIHsKKwkJCWNoYXIgKmluc2VydDsKKwkJCWV4aXN0cyA9IDE7CisJCQlmb3IgKCBqPWNoZWNrbGlzdFtpXVsxXTsgZXhpc3RzOyArK2ogKSB7CisJCQkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIi9kZXYvJXNjIiwgJmNoZWNrbGlzdFtpXVszXSk7CisJCQkJaW5zZXJ0ID0gU0RMX3N0cmNocihkcml2ZSwgJz8nKTsKKwkJCQlpZiAoIGluc2VydCAhPSBOVUxMICkgeworCQkJCQkqaW5zZXJ0ID0gajsKKwkJCQl9CisJCQkJc3dpdGNoIChDaGVja0RyaXZlKGRyaXZlLCAmc3RidWYpKSB7CisJCQkJCS8qIERyaXZlIGV4aXN0cyBhbmQgaXMgYSBDRC1ST00gKi8KKwkJCQkJY2FzZSAxOgorCQkJCQkJQWRkRHJpdmUoZHJpdmUsICZzdGJ1Zik7CisJCQkJCQlicmVhazsKKwkJCQkJLyogRHJpdmUgZXhpc3RzLCBidXQgaXNuJ3QgYSBDRC1ST00gKi8KKwkJCQkJY2FzZSAwOgorCQkJCQkJYnJlYWs7CisJCQkJCS8qIERyaXZlIGRvZXNuJ3QgZXhpc3QgKi8KKwkJCQkJY2FzZSAtMToKKwkJCQkJCWV4aXN0cyA9IDA7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlTRExfc25wcmludGYoZHJpdmUsIFNETF9hcnJheXNpemUoZHJpdmUpLCAiL2Rldi8lcyIsIGNoZWNrbGlzdFtpXSk7CisJCQlpZiAoIENoZWNrRHJpdmUoZHJpdmUsICZzdGJ1ZikgPiAwICkgeworCQkJCUFkZERyaXZlKGRyaXZlLCAmc3RidWYpOworCQkJfQorCQl9CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKK3sKKwlyZXR1cm4oU0RMX2NkbGlzdFtkcml2ZV0pOworfQorCitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSkKK3sKKwlyZXR1cm4ob3BlbihTRExfY2RsaXN0W2RyaXZlXSwgT19SRE9OTFkgfCBPX05PTkJMT0NLIHwgT19FWENMLCAwKSk7Cit9CisKK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQorCXsKKwl1X2NoYXIgY2RiWzEwXSwgYnVmWzRdLCAqcCwgKnRvYzsKKwlzdHJ1Y3Qgc2NzaV91c2VyX2NkYiBzdXM7CisJaW50IGksIHN0cywgZmlyc3RfdHJhY2ssIGxhc3RfdHJhY2ssIG50cmFja3MsIHRvY19zaXplOworCisJYnplcm8oY2RiLCBzaXplb2YgKGNkYikpOworCWNkYlswXSA9IDB4NDM7CQkvKiBSZWFkIFRPQyAqLworCWNkYlsxXSA9IDB4MjsJCS8qIE1TRiAqLworCWNkYls4XSA9IDQ7CQkvKiBzaXplIFRPQyBoZWFkZXIgKi8KKwlzdHMgPSBzY3NpX2NtZChjZHJvbS0+aWQsIChjZGJfdCAqKWNkYiwgMTAsIFNVQ19SRUFELCBidWYsIDQsICZzdXMpOworCWlmCShzdHMgPCAwKQorCQlyZXR1cm4oLTEpOworCWZpcnN0X3RyYWNrID0gYnVmWzJdOworCWxhc3RfdHJhY2sgPSBidWZbM107CisJbnRyYWNrcyA9IGxhc3RfdHJhY2sgLSBmaXJzdF90cmFjayArIDE7CisJY2Ryb20tPm51bXRyYWNrcyA9IG50cmFja3M7CisJdG9jX3NpemUgPSA0ICsgKG50cmFja3MgKyAxKSAqIDg7CisJdG9jID0gKHVfY2hhciAqKVNETF9tYWxsb2ModG9jX3NpemUpOworCWlmCSh0b2MgPT0gTlVMTCkKKwkJcmV0dXJuKC0xKTsKKwliemVybyhjZGIsIHNpemVvZiAoY2RiKSk7CisJY2RiWzBdID0gMHg0MzsKKwljZGJbMV0gPSAweDI7CisJY2RiWzZdID0gZmlyc3RfdHJhY2s7CisJY2RiWzddID0gdG9jX3NpemUgPj4gODsKKwljZGJbOF0gPSB0b2Nfc2l6ZSAmIDB4ZmY7CisJc3RzID0gc2NzaV9jbWQoY2Ryb20tPmlkLCAoY2RiX3QgKiljZGIsIDEwLCBTVUNfUkVBRCwgdG9jLCB0b2Nfc2l6ZSwgCisJCQkmc3VzKTsKKwlpZgkoc3RzIDwgMCkKKwkJeworCQlTRExfZnJlZSh0b2MpOworCQlyZXR1cm4oLTEpOworCQl9CisKKwlmb3IJKGkgPSAwLCBwID0gdG9jKzQ7IGkgPD0gbnRyYWNrczsgaSsrLCBwKz0gOCkKKwkJeworCQlpZgkoaSA9PSBudHJhY2tzKQorCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gMHhBQTsJLyogTGVhZG91dCAqLworCQllbHNlCisJCQljZHJvbS0+dHJhY2tbaV0uaWQgPSBmaXJzdF90cmFjayArIGk7CisJCWlmCShwWzFdICYgMHgyMCkKKwkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0RBVEFfVFJBQ0s7CisJCWVsc2UKKwkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOworCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gbXNmX3RvX2ZyYW1lKHBbNV0sIHBbNl0sIHBbN10pOworCQljZHJvbS0+dHJhY2tbaV0ubGVuZ3RoID0gMDsKKwkJaWYJKGkgPiAwKQorCQkJY2Ryb20tPnRyYWNrW2ktMV0ubGVuZ3RoID0gY2Ryb20tPnRyYWNrW2ldLm9mZnNldCAtCisJCQkJCQkgICBjZHJvbS0+dHJhY2tbaS0xXS5vZmZzZXQ7CisJCX0KKwlTRExfZnJlZSh0b2MpOworCXJldHVybigwKTsKKwl9CisKKy8qIEdldCBDRC1ST00gc3RhdHVzICovCitzdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKQorCXsKKwlDRHN0YXR1cyBzdGF0dXM7CisJdV9jaGFyCWNkYlsxMF0sIGJ1ZlsxNl07CisJaW50CXN0czsKKwlzdHJ1Y3QJc2NzaV91c2VyX2NkYiBzdXM7CisKKwliemVybyhjZGIsIHNpemVvZiAoY2RiKSk7CisJY2RiWzBdID0gMHg0MjsJCS8qIHJlYWQgc3VicSAqLworCWNkYlsxXSA9IDB4MjsJCS8qIE1TRiAqLworCWNkYlsyXSA9IDB4NDA7CQkvKiBxIGNoYW5uZWwgKi8KKwljZGJbM10gPSAxOwkJLyogY3VycmVudCBwb3MgKi8KKwljZGJbN10gPSBzaXplb2YgKGJ1ZikgPj4gODsKKwljZGJbOF0gPSBzaXplb2YgKGJ1ZikgJiAweGZmOworCXN0cyA9IHNjc2lfY21kKGNkcm9tLT5pZCwgKGNkYl90ICopY2RiLCAxMCwgU1VDX1JFQUQsIGJ1Ziwgc2l6ZW9mIChidWYpLAorCQkJJnN1cyk7CisJaWYJKHN0cyA8IDApCisJCXJldHVybigtMSk7CisJaWYJKHN0cykKKwkJeworCQlpZgkoVGVzdEZvck1lZGl1bShjZHJvbS0+aWQpID09IDApCisJCQlzdGF0dXMgPSBDRF9UUkFZRU1QVFk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IENEX0VSUk9SOworCQl9CisJZWxzZQorCQl7CisJCXN3aXRjaAkoYnVmWzFdKQorCQkJeworCQkJY2FzZQkweDExOgorCQkJCXN0YXR1cyA9IENEX1BMQVlJTkc7CisJCQkJYnJlYWs7CisJCQljYXNlCTB4MTI6CisJCQkJc3RhdHVzID0gQ0RfUEFVU0VEOworCQkJCWJyZWFrOworCQkJY2FzZQkweDEzOgorCQkJY2FzZQkweDE0OgorCQkJY2FzZQkweDE1OgorCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXN0YXR1cyA9IENEX0VSUk9SOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJaWYJKHBvc2l0aW9uKQorCQl7CisJCWlmCSggc3RhdHVzID09IENEX1BMQVlJTkcgfHwgKHN0YXR1cyA9PSBDRF9QQVVTRUQpICkKKwkJCSpwb3NpdGlvbiA9IG1zZl90b19mcmFtZShidWZbOV0sIGJ1ZlsxMF0sIGJ1ZlsxMV0pOworCQllbHNlCisJCQkqcG9zaXRpb24gPSAwOworCQl9CisJcmV0dXJuKHN0YXR1cyk7CisJfQorCisvKiBTdGFydCBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKKwl7CisJdV9jaGFyCWNkYlsxMF07CisJaW50CXN0cywgbWludXRlLCBzZWNvbmQsIGZyYW1lLCBlbWludXRlLCBlc2Vjb25kLCBlZnJhbWU7CisJc3RydWN0CXNjc2lfdXNlcl9jZGIgc3VzOworCisJYnplcm8oY2RiLCBzaXplb2YoY2RiKSk7CisJY2RiWzBdID0gMHg0NzsJCS8qIFBsYXkgKi8KKwlmcmFtZV90b19tc2Yoc3RhcnQsICZtaW51dGUsICZzZWNvbmQsICZmcmFtZSk7CisJZnJhbWVfdG9fbXNmKHN0YXJ0ICsgbGVuZ3RoLCAmZW1pbnV0ZSwgJmVzZWNvbmQsICZlZnJhbWUpOworCWNkYlszXSA9IG1pbnV0ZTsKKwljZGJbNF0gPSBzZWNvbmQ7CisJY2RiWzVdID0gZnJhbWU7CisJY2RiWzZdID0gZW1pbnV0ZTsKKwljZGJbN10gPSBlc2Vjb25kOworCWNkYls4XSA9IGVmcmFtZTsKKwlzdHMgPSBzY3NpX2NtZChjZHJvbS0+aWQsIChjZGJfdCAqKWNkYiwgMTAsIFNVQ19SRUFELCAwLCAwLCAmc3VzKTsKKwlyZXR1cm4oc3RzKTsKKwl9CisKK3N0YXRpYwlpbnQKK3BhdXNlcmVzdW1lKFNETF9DRCAqY2Ryb20sIGludCBmbGFnKQorCXsKKwl1X2NoYXIJY2RiWzEwXTsKKwlzdHJ1Y3QJc2NzaV91c2VyX2NkYiBzdXM7CisKKwliemVybyhjZGIsIHNpemVvZiAoY2RiKSk7CisJY2RiWzBdID0gMHg0YjsKKwljZGJbOF0gPSBmbGFnICYgMHgxOworCXJldHVybihzY3NpX2NtZChjZHJvbS0+aWQsIChjZGJfdCAqKWNkYiwgMTAsIFNVQ19SRUFELCAwLCAwLCAmc3VzKSk7CisJfQorCisvKiBQYXVzZSBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKQoreworCXJldHVybihwYXVzZXJlc3VtZShjZHJvbSwgMCkpOworfQorCisvKiBSZXN1bWUgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pCit7CisJcmV0dXJuKHBhdXNlcmVzdW1lKGNkcm9tLCAxKSk7Cit9CisKKy8qIFN0b3AgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQoreworCXVfY2hhciBjZGJbNl07CisJc3RydWN0CXNjc2lfdXNlcl9jZGIgc3VzOworCisJYnplcm8oY2RiLCBzaXplb2YgKGNkYikpOworCWNkYlswXSA9IDB4MWI7CQkvKiBzdG9wICovCisJY2RiWzFdID0gMTsJCS8qIGltbWVkaWF0ZSAqLworCXJldHVybihzY3NpX2NtZChjZHJvbS0+aWQsIChjZGJfdCAqKWNkYiwgNiwgU1VDX1JFQUQsIDAsIDAsICZzdXMpKTsKK30KKworLyogRWplY3QgdGhlIENELVJPTSAqLworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKKwl1X2NoYXIgY2RiWzZdOworCXN0cnVjdAlzY3NpX3VzZXJfY2RiIHN1czsKKworCWJ6ZXJvKGNkYiwgc2l6ZW9mIChjZGIpKTsKKwljZGJbMF0gPSAweDFiOwkJLyogc3RvcCAqLworCWNkYlsxXSA9IDE7CQkvKiBpbW1lZGlhdGUgKi8KKwljZGJbNF0gPSAyOwkJLyogZWplY3QgKi8KKwlyZXR1cm4oc2NzaV9jbWQoY2Ryb20tPmlkLCAoY2RiX3QgKiljZGIsIDYsIFNVQ19SRUFELCAwLCAwLCAmc3VzKSk7Cit9CisKKy8qIENsb3NlIHRoZSBDRC1ST00gaGFuZGxlICovCitzdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSkKKwl7CisJY2xvc2UoY2Ryb20tPmlkKTsKKwl9CisKK3ZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICggU0RMX251bWNkcyA+IDAgKSB7CisJCWZvciAoIGk9MDsgaTxTRExfbnVtY2RzOyArK2kgKSB7CisJCQlTRExfZnJlZShTRExfY2RsaXN0W2ldKTsKKwkJCX0KKwkJfQorCVNETF9udW1jZHMgPSAwOworfQorCisjZW5kaWYgLyogU0RMX0NEUk9NX0JTREkgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vZGMvU0RMX3N5c2Nkcm9tLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL2RjL1NETF9zeXNjZHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NWFkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL2RjL1NETF9zeXNjZHJvbS5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9DRFJPTV9EQworCisvKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCAqLworCisjaW5jbHVkZSA8ZGMvY2Ryb20uaD4KKyNpbmNsdWRlIDxkYy9zcHUuaD4KKworI2luY2x1ZGUgIlNETF9jZHJvbS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgorCisvKiBUaGUgc3lzdGVtLWRlcGVuZGVudCBDRCBjb250cm9sIGZ1bmN0aW9ucyAqLworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pOworc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pOworCisKK2ludCAgU0RMX1NZU19DREluaXQodm9pZCkKK3sKKwkvKiBGaWxsIGluIG91ciBkcml2ZXIgY2FwYWJpbGl0aWVzICovCisJU0RMX0NEY2Fwcy5OYW1lID0gU0RMX1NZU19DRE5hbWU7CisJU0RMX0NEY2Fwcy5PcGVuID0gU0RMX1NZU19DRE9wZW47CisJU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOworCVNETF9DRGNhcHMuU3RhdHVzID0gU0RMX1NZU19DRFN0YXR1czsKKwlTRExfQ0RjYXBzLlBsYXkgPSBTRExfU1lTX0NEUGxheTsKKwlTRExfQ0RjYXBzLlBhdXNlID0gU0RMX1NZU19DRFBhdXNlOworCVNETF9DRGNhcHMuUmVzdW1lID0gU0RMX1NZU19DRFJlc3VtZTsKKwlTRExfQ0RjYXBzLlN0b3AgPSBTRExfU1lTX0NEU3RvcDsKKwlTRExfQ0RjYXBzLkVqZWN0ID0gU0RMX1NZU19DREVqZWN0OworCVNETF9DRGNhcHMuQ2xvc2UgPSBTRExfU1lTX0NEQ2xvc2U7CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpCit7CisJcmV0dXJuICIvY2QiOworfQorCitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSkKK3sKKwlyZXR1cm4oZHJpdmUpOworfQorCisjZGVmaW5lCVRSQUNLX0NEREEJMAorc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pCit7CisJQ0RST01fVE9DIHRvYzsKKwlpbnQgcmV0LGk7CisKKwlyZXQgPSBjZHJvbV9yZWFkX3RvYygmdG9jLDApOworCWlmIChyZXQhPUVSUl9PSykgeworCQlyZXR1cm4gLTE7CisJfQorCisJY2Ryb20tPm51bXRyYWNrcyA9IFRPQ19UUkFDSyh0b2MubGFzdCktVE9DX1RSQUNLKHRvYy5maXJzdCkrMTsKKwlmb3IoaT0wO2k8Y2Ryb20tPm51bXRyYWNrcztpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBlbnRyeSA9IHRvYy5lbnRyeVtpXTsKKwkJY2Ryb20tPnRyYWNrW2ldLmlkID0gaSsxOworCQljZHJvbS0+dHJhY2tbaV0udHlwZSA9IChUT0NfQ1RSTCh0b2MuZW50cnlbaV0pPT1UUkFDS19DRERBKT9TRExfQVVESU9fVFJBQ0s6U0RMX0RBVEFfVFJBQ0s7CisJCWNkcm9tLT50cmFja1tpXS5vZmZzZXQgPSBUT0NfTEJBKGVudHJ5KS0xNTA7CisJCWNkcm9tLT50cmFja1tpXS5sZW5ndGggPSBUT0NfTEJBKChpKzE8dG9jLmxhc3QpP3RvYy5lbnRyeVtpKzFdOnRvYy5sZWFkb3V0X3NlY3RvciktVE9DX0xCQShlbnRyeSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCBDRC1ST00gc3RhdHVzICovCitzdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKQoreworCWludCByZXQsZGNfc3RhdHVzLGRpc2NfdHlwZTsKKworCXJldCA9IGNkcm9tX2dldF9zdGF0dXMoJmRjX3N0YXR1cywmZGlzY190eXBlKTsKKwlpZiAocmV0IT1FUlJfT0spIHJldHVybiBDRF9FUlJPUjsKKworCXN3aXRjaChkY19zdGF0dXMpIHsKKy8vCWNhc2UgQ0RfU1RBVFVTX0JVU1k6CisJY2FzZSBDRF9TVEFUVVNfUEFVU0VEOgorCQlyZXR1cm4gQ0RfUEFVU0VEOworCWNhc2UgQ0RfU1RBVFVTX1NUQU5EQlk6CisJCXJldHVybiBDRF9TVE9QUEVEOworCWNhc2UgQ0RfU1RBVFVTX1BMQVlJTkc6CisJCXJldHVybiBDRF9QTEFZSU5HOworLy8JY2FzZSBDRF9TVEFUVVNfU0VFS0lORzoKKy8vCWNhc2UgQ0RfU1RBVFVTX1NDQU5JTkc6CisJY2FzZSBDRF9TVEFUVVNfT1BFTjoKKwljYXNlIENEX1NUQVRVU19OT19ESVNDOgorCQlyZXR1cm4gQ0RfVFJBWUVNUFRZOworCWRlZmF1bHQ6CisJCXJldHVybglDRF9FUlJPUjsKKwl9Cit9CisKKy8qIFN0YXJ0IHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQoreworCWludCByZXQgPSBjZHJvbV9jZGRhX3BsYXkoc3RhcnQtMTUwLHN0YXJ0LTE1MCtsZW5ndGgsMSxDRERBX1NFQ1RPUlMpOworCXJldHVybiByZXQ9PUVSUl9PSz8wOi0xOworfQorCisvKiBQYXVzZSBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKQoreworCWludCByZXQ9Y2Ryb21fY2RkYV9wYXVzZSgpOworCXJldHVybiByZXQ9PUVSUl9PSz8wOi0xOworfQorCisvKiBSZXN1bWUgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pCit7CisJaW50IHJldD1jZHJvbV9jZGRhX3Jlc3VtZSgpOworCXJldHVybiByZXQ9PUVSUl9PSz8wOi0xOworfQorCisvKiBTdG9wIHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKK3sKKwlpbnQgcmV0PWNkcm9tX3NwaW5fZG93bigpOworCXJldHVybiByZXQ9PUVSUl9PSz8wOi0xOworfQorCisvKiBFamVjdCB0aGUgQ0QtUk9NICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKQoreworCXJldHVybiAtMTsKK30KKworLyogQ2xvc2UgdGhlIENELVJPTSBoYW5kbGUgKi8KK3N0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKQoreworfQorCit2b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCit7CisKK30KKworI2VuZGlmIC8qIFNETF9DRFJPTV9EQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9kdW1teS9TRExfc3lzY2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vZHVtbXkvU0RMX3N5c2Nkcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyMWU5NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vZHVtbXkvU0RMX3N5c2Nkcm9tLmMKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFNETF9DRFJPTV9EVU1NWSkgfHwgZGVmaW5lZChTRExfQ0RST01fRElTQUJMRUQpCisKKy8qIFN0dWIgZnVuY3Rpb25zIGZvciBzeXN0ZW0tbGV2ZWwgQ0QtUk9NIGF1ZGlvIGNvbnRyb2wgKi8KKworI2luY2x1ZGUgIlNETF9jZHJvbS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgorCitpbnQgIFNETF9TWVNfQ0RJbml0KHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCit7CisJcmV0dXJuOworfQorCisjZW5kaWYgLyogU0RMX0NEUk9NX0RVTU1ZIHx8IFNETF9DRFJPTV9ESVNBQkxFRCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9mcmVlYnNkL1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9mcmVlYnNkL1NETF9zeXNjZHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjBjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL2ZyZWVic2QvU0RMX3N5c2Nkcm9tLmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0NEUk9NX0ZSRUVCU0QKKworLyogRnVuY3Rpb25zIGZvciBzeXN0ZW0tbGV2ZWwgQ0QtUk9NIGF1ZGlvIGNvbnRyb2wgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9jZGlvLmg+CisKKyNpbmNsdWRlICJTRExfY2Ryb20uaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKKworCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQ0QtUk9NIGRyaXZlcyB3ZSdsbCBkZXRlY3QgKi8KKyNkZWZpbmUgTUFYX0RSSVZFUwkxNgkKKworLyogQSBsaXN0IG9mIGF2YWlsYWJsZSBDRC1ST00gZHJpdmVzICovCitzdGF0aWMgY2hhciAqU0RMX2NkbGlzdFtNQVhfRFJJVkVTXTsKK3N0YXRpYyBkZXZfdCBTRExfY2Rtb2RlW01BWF9EUklWRVNdOworCisvKiBUaGUgc3lzdGVtLWRlcGVuZGVudCBDRCBjb250cm9sIGZ1bmN0aW9ucyAqLworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pOworc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pOworCisvKiBTb21lIGlvY3RsKCkgZXJybm8gdmFsdWVzIHdoaWNoIG9jY3VyIHdoZW4gdGhlIHRyYXkgaXMgZW1wdHkgKi8KKyNkZWZpbmUgRVJSTk9fVFJBWUVNUFRZKGVycm5vKQlcCisJKChlcnJubyA9PSBFSU8pIHx8IChlcnJubyA9PSBFTk9FTlQpIHx8IChlcnJubyA9PSBFSU5WQUwpKQorCisvKiBDaGVjayBhIGRyaXZlIHRvIHNlZSBpZiBpdCBpcyBhIENELVJPTSAqLworc3RhdGljIGludCBDaGVja0RyaXZlKGNoYXIgKmRyaXZlLCBzdHJ1Y3Qgc3RhdCAqc3RidWYpCit7CisJaW50IGlzX2NkLCBjZGZkOworCXN0cnVjdCBpb2NfcmVhZF9zdWJjaGFubmVsIGluZm87CisKKwkvKiBJZiBpdCBkb2Vzbid0IGV4aXN0LCByZXR1cm4gLTEgKi8KKwlpZiAoIHN0YXQoZHJpdmUsIHN0YnVmKSA8IDAgKSB7CisJCXJldHVybigtMSk7CisJfQorCisJLyogSWYgaXQgZG9lcyBleGlzdCwgdmVyaWZ5IHRoYXQgaXQncyBhbiBhdmFpbGFibGUgQ0QtUk9NICovCisJaXNfY2QgPSAwOworCWlmICggU19JU0NIUihzdGJ1Zi0+c3RfbW9kZSkgfHwgU19JU0JMSyhzdGJ1Zi0+c3RfbW9kZSkgKSB7CisJCWNkZmQgPSBvcGVuKGRyaXZlLCAoT19SRE9OTFl8T19FWENMfE9fTk9OQkxPQ0spLCAwKTsKKwkJaWYgKCBjZGZkID49IDAgKSB7CisJCQlpbmZvLmFkZHJlc3NfZm9ybWF0ID0gQ0RfTVNGX0ZPUk1BVDsKKwkJCWluZm8uZGF0YV9mb3JtYXQgPSBDRF9DVVJSRU5UX1BPU0lUSU9OOworCQkJaW5mby5kYXRhX2xlbiA9IDA7CisJCQlpbmZvLmRhdGEgPSBOVUxMOworCQkJLyogVW5kZXIgTGludXgsIEVJTyBvY2N1cnMgd2hlbiBhIGRpc2sgaXMgbm90IHByZXNlbnQuCisJCQkgICBUaGlzIGlzbid0IDEwMCUgcmVsaWFibGUsIHNvIHdlIHVzZSB0aGUgVVNFX01OVEVOVAorCQkJICAgY29kZSBhYm92ZSBpbnN0ZWFkLgorCQkJICovCisJCQlpZiAoIChpb2N0bChjZGZkLCBDRElPQ1JFQURTVUJDSEFOTkVMLCAmaW5mbykgPT0gMCkgfHwKKwkJCQkJCUVSUk5PX1RSQVlFTVBUWShlcnJubykgKSB7CisJCQkJaXNfY2QgPSAxOworCQkJfQorCQkJY2xvc2UoY2RmZCk7CisJCX0KKwl9CisJcmV0dXJuKGlzX2NkKTsKK30KKworLyogQWRkIGEgQ0QtUk9NIGRyaXZlIHRvIG91ciBsaXN0IG9mIHZhbGlkIGRyaXZlcyAqLworc3RhdGljIHZvaWQgQWRkRHJpdmUoY2hhciAqZHJpdmUsIHN0cnVjdCBzdGF0ICpzdGJ1ZikKK3sKKwlpbnQgaTsKKworCWlmICggU0RMX251bWNkcyA8IE1BWF9EUklWRVMgKSB7CisJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbHJlYWR5IGluIG91ciBsaXN0LgorCSAJICAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2Ugc2VlIGEgZHJpdmUgdmlhIHN5bWJvbGljIGxpbmsuCisJCSAqLworCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgeworCQkJaWYgKCBzdGJ1Zi0+c3RfcmRldiA9PSBTRExfY2Rtb2RlW2ldICkgeworI2lmZGVmIERFQlVHX0NEUk9NCisgIGZwcmludGYoc3RkZXJyLCAiRHVwbGljYXRlIGRyaXZlIGRldGVjdGVkOiAlcyA9PSAlc1xuIiwgZHJpdmUsIFNETF9jZGxpc3RbaV0pOworI2VuZGlmCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJLyogQWRkIHRoaXMgZHJpdmUgdG8gb3VyIGxpc3QgKi8KKwkJaSA9IFNETF9udW1jZHM7CisJCVNETF9jZGxpc3RbaV0gPSBTRExfc3RyZHVwKGRyaXZlKTsKKwkJaWYgKCBTRExfY2RsaXN0W2ldID09IE5VTEwgKSB7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCXJldHVybjsKKwkJfQorCQlTRExfY2Rtb2RlW2ldID0gc3RidWYtPnN0X3JkZXY7CisJCSsrU0RMX251bWNkczsKKyNpZmRlZiBERUJVR19DRFJPTQorICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIENELVJPTSBkcml2ZTogJXNcbiIsIGRyaXZlKTsKKyNlbmRpZgorCX0KK30KKworaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQoreworCS8qIGNoZWNrbGlzdDogL2Rldi9jZHJvbSwvZGV2L2NkP2MgL2Rldi9hY2Q/YworCQkJL2Rldi9tYXRjZD9jIC9kZXYvbWNkP2MgL2Rldi9zY2Q/YyAqLworCXN0YXRpYyBjaGFyICpjaGVja2xpc3RbXSA9IHsKKwkiY2Ryb20iLCAiPzAgY2Q/IiwgIj8wIGFjZD8iLCAiPzAgbWF0Y2Q/IiwgIj8wIG1jZD8iLCAiPzAgc2NkPyIsTlVMTAorCX07CisJY2hhciAqU0RMY2Ryb207CisJaW50IGksIGosIGV4aXN0czsKKwljaGFyIGRyaXZlWzMyXTsKKwlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKworCS8qIEZpbGwgaW4gb3VyIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KKwlTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKKwlTRExfQ0RjYXBzLk9wZW4gPSBTRExfU1lTX0NET3BlbjsKKwlTRExfQ0RjYXBzLkdldFRPQyA9IFNETF9TWVNfQ0RHZXRUT0M7CisJU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOworCVNETF9DRGNhcHMuUGxheSA9IFNETF9TWVNfQ0RQbGF5OworCVNETF9DRGNhcHMuUGF1c2UgPSBTRExfU1lTX0NEUGF1c2U7CisJU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOworCVNETF9DRGNhcHMuU3RvcCA9IFNETF9TWVNfQ0RTdG9wOworCVNETF9DRGNhcHMuRWplY3QgPSBTRExfU1lTX0NERWplY3Q7CisJU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKKworCS8qIExvb2sgaW4gdGhlIGVudmlyb25tZW50IGZvciBvdXIgQ0QtUk9NIGRyaXZlIGxpc3QgKi8KKwlTRExjZHJvbSA9IFNETF9nZXRlbnYoIlNETF9DRFJPTSIpOwkvKiAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZGV2aWNlcyAqLworCWlmICggU0RMY2Ryb20gIT0gTlVMTCApIHsKKwkJY2hhciAqY2RwYXRoLCAqZGVsaW07CisJCXNpemVfdCBsZW4gPSBTRExfc3RybGVuKFNETGNkcm9tKSsxOworCQljZHBhdGggPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbGVuKTsKKwkJaWYgKCBjZHBhdGggIT0gTlVMTCApIHsKKwkJCVNETF9zdHJsY3B5KGNkcGF0aCwgU0RMY2Ryb20sIGxlbik7CisJCQlTRExjZHJvbSA9IGNkcGF0aDsKKwkJCWRvIHsKKwkJCQlkZWxpbSA9IFNETF9zdHJjaHIoU0RMY2Ryb20sICc6Jyk7CisJCQkJaWYgKCBkZWxpbSApIHsKKwkJCQkJKmRlbGltKysgPSAnXDAnOworCQkJCX0KKwkJCQlpZiAoIENoZWNrRHJpdmUoU0RMY2Ryb20sICZzdGJ1ZikgPiAwICkgeworCQkJCQlBZGREcml2ZShTRExjZHJvbSwgJnN0YnVmKTsKKwkJCQl9CisJCQkJaWYgKCBkZWxpbSApIHsKKwkJCQkJU0RMY2Ryb20gPSBkZWxpbTsKKwkJCQl9IGVsc2UgeworCQkJCQlTRExjZHJvbSA9IE5VTEw7CisJCQkJfQorCQkJfSB3aGlsZSAoIFNETGNkcm9tICk7CisJCQlTRExfc3RhY2tfZnJlZShjZHBhdGgpOworCQl9CisKKwkJLyogSWYgd2UgZm91bmQgb3VyIGRyaXZlcywgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gKi8KKwkJaWYgKCBTRExfbnVtY2RzID4gMCApIHsKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKworCS8qIFNjYW4gdGhlIHN5c3RlbSBmb3IgQ0QtUk9NIGRyaXZlcyAqLworCWZvciAoIGk9MDsgY2hlY2tsaXN0W2ldOyArK2kgKSB7CisJCWlmICggY2hlY2tsaXN0W2ldWzBdID09ICc/JyApIHsKKwkJCWNoYXIgKmluc2VydDsKKwkJCWV4aXN0cyA9IDE7CisJCQlmb3IgKCBqPWNoZWNrbGlzdFtpXVsxXTsgZXhpc3RzOyArK2ogKSB7CisJCQkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIi9kZXYvJXNjIiwgJmNoZWNrbGlzdFtpXVszXSk7CisJCQkJaW5zZXJ0ID0gU0RMX3N0cmNocihkcml2ZSwgJz8nKTsKKwkJCQlpZiAoIGluc2VydCAhPSBOVUxMICkgeworCQkJCQkqaW5zZXJ0ID0gajsKKwkJCQl9CisJCQkJc3dpdGNoIChDaGVja0RyaXZlKGRyaXZlLCAmc3RidWYpKSB7CisJCQkJCS8qIERyaXZlIGV4aXN0cyBhbmQgaXMgYSBDRC1ST00gKi8KKwkJCQkJY2FzZSAxOgorCQkJCQkJQWRkRHJpdmUoZHJpdmUsICZzdGJ1Zik7CisJCQkJCQlicmVhazsKKwkJCQkJLyogRHJpdmUgZXhpc3RzLCBidXQgaXNuJ3QgYSBDRC1ST00gKi8KKwkJCQkJY2FzZSAwOgorCQkJCQkJYnJlYWs7CisJCQkJCS8qIERyaXZlIGRvZXNuJ3QgZXhpc3QgKi8KKwkJCQkJY2FzZSAtMToKKwkJCQkJCWV4aXN0cyA9IDA7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlTRExfc25wcmludGYoZHJpdmUsIFNETF9hcnJheXNpemUoZHJpdmUpLCAiL2Rldi8lcyIsIGNoZWNrbGlzdFtpXSk7CisJCQlpZiAoIENoZWNrRHJpdmUoZHJpdmUsICZzdGJ1ZikgPiAwICkgeworCQkJCUFkZERyaXZlKGRyaXZlLCAmc3RidWYpOworCQkJfQorCQl9CisJfQorCXJldHVybigwKTsKK30KKworLyogR2VuZXJhbCBpb2N0bCgpIENELVJPTSBjb21tYW5kIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0Rpb2N0bChpbnQgaWQsIGludCBjb21tYW5kLCB2b2lkICphcmcpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGlvY3RsKGlkLCBjb21tYW5kLCBhcmcpOworCWlmICggcmV0dmFsIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJpb2N0bCgpIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCXJldHVybihyZXR2YWwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKQoreworCXJldHVybihTRExfY2RsaXN0W2RyaXZlXSk7Cit9CisKK3N0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKQoreworCXJldHVybihvcGVuKFNETF9jZGxpc3RbZHJpdmVdLCAoT19SRE9OTFl8T19FWENMfE9fTk9OQkxPQ0spLCAwKSk7Cit9CisKK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQoreworCXN0cnVjdCBpb2NfdG9jX2hlYWRlciB0b2M7CisJaW50IGksIG9rYXk7CisJc3RydWN0IGlvY19yZWFkX3RvY19lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgY2RfdG9jX2VudHJ5IGRhdGE7CisKKwlva2F5ID0gMDsKKwlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9SRUFEVE9DSEVBREVSLCAmdG9jKSA9PSAwICkgeworCQljZHJvbS0+bnVtdHJhY2tzID0gdG9jLmVuZGluZ190cmFjay10b2Muc3RhcnRpbmdfdHJhY2srMTsKKwkJaWYgKCBjZHJvbS0+bnVtdHJhY2tzID4gU0RMX01BWF9UUkFDS1MgKSB7CisJCQljZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7CisJCX0KKwkJLyogUmVhZCBhbGwgdGhlIHRyYWNrIFRPQyBlbnRyaWVzICovCisJCWZvciAoIGk9MDsgaTw9Y2Ryb20tPm51bXRyYWNrczsgKytpICkgeworCQkJaWYgKCBpID09IGNkcm9tLT5udW10cmFja3MgKSB7CisJCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gMHhBQTsgLyogQ0RST01fTEVBRE9VVCAqLworCQkJfSBlbHNlIHsKKwkJCQljZHJvbS0+dHJhY2tbaV0uaWQgPSB0b2Muc3RhcnRpbmdfdHJhY2sraTsKKwkJCX0KKwkJCWVudHJ5LnN0YXJ0aW5nX3RyYWNrID0gY2Ryb20tPnRyYWNrW2ldLmlkOworCQkJZW50cnkuYWRkcmVzc19mb3JtYXQgPSBDRF9NU0ZfRk9STUFUOworCQkJZW50cnkuZGF0YV9sZW4gPSBzaXplb2YoZGF0YSk7CisJCQllbnRyeS5kYXRhID0gJmRhdGE7CisJCQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9SRUFEVE9DRU5UUllTLAorCQkJCQkJCQkmZW50cnkpIDwgMCApIHsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJY2Ryb20tPnRyYWNrW2ldLnR5cGUgPSBkYXRhLmNvbnRyb2w7CisJCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IE1TRl9UT19GUkFNRVMoCisJCQkJCQlkYXRhLmFkZHIubXNmLm1pbnV0ZSwKKwkJCQkJCWRhdGEuYWRkci5tc2Yuc2Vjb25kLAorCQkJCQkJZGF0YS5hZGRyLm1zZi5mcmFtZSk7CisJCQkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IDA7CisJCQkJaWYgKCBpID4gMCApIHsKKwkJCQkJY2Ryb20tPnRyYWNrW2ktMV0ubGVuZ3RoID0KKwkJCQkJCWNkcm9tLT50cmFja1tpXS5vZmZzZXQtCisJCQkJCQljZHJvbS0+dHJhY2tbaS0xXS5vZmZzZXQ7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICggaSA9PSAoY2Ryb20tPm51bXRyYWNrcysxKSApIHsKKwkJCW9rYXkgPSAxOworCQl9CisJfQorCXJldHVybihva2F5ID8gMCA6IC0xKTsKK30KKworLyogR2V0IENELVJPTSBzdGF0dXMgKi8KK3N0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pCit7CisJQ0RzdGF0dXMgc3RhdHVzOworCXN0cnVjdCBpb2NfdG9jX2hlYWRlciB0b2M7CisJc3RydWN0IGlvY19yZWFkX3N1YmNoYW5uZWwgaW5mbzsKKwlzdHJ1Y3QgY2Rfc3ViX2NoYW5uZWxfaW5mbyBkYXRhOworCisJaW5mby5hZGRyZXNzX2Zvcm1hdCA9IENEX01TRl9GT1JNQVQ7CisJaW5mby5kYXRhX2Zvcm1hdCA9IENEX0NVUlJFTlRfUE9TSVRJT047CisJaW5mby50cmFjayA9IDA7CisJaW5mby5kYXRhX2xlbiA9IHNpemVvZihkYXRhKTsKKwlpbmZvLmRhdGEgPSAmZGF0YTsKKwlpZiAoIGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NSRUFEU1VCQ0hBTk5FTCwgJmluZm8pIDwgMCApIHsKKwkJaWYgKCBFUlJOT19UUkFZRU1QVFkoZXJybm8pICkgeworCQkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RfRVJST1I7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGRhdGEuaGVhZGVyLmF1ZGlvX3N0YXR1cykgeworCQkJY2FzZSBDRF9BU19BVURJT19JTlZBTElEOgorCQkJY2FzZSBDRF9BU19OT19TVEFUVVM6CisJCQkJLyogVHJ5IHRvIGRldGVybWluZSBpZiB0aGVyZSdzIGEgQ0QgYXZhaWxhYmxlICovCisJCQkJaWYgKGlvY3RsKGNkcm9tLT5pZCxDRElPUkVBRFRPQ0hFQURFUiwmdG9jKT09MCkKKwkJCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKKwkJCQllbHNlCisJCQkJCXN0YXR1cyA9IENEX1RSQVlFTVBUWTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0RfQVNfUExBWV9DT01QTEVURUQ6CisJCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0RfQVNfUExBWV9JTl9QUk9HUkVTUzoKKwkJCQlzdGF0dXMgPSBDRF9QTEFZSU5HOworCQkJCWJyZWFrOworCQkJY2FzZSBDRF9BU19QTEFZX1BBVVNFRDoKKwkJCQlzdGF0dXMgPSBDRF9QQVVTRUQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXN0YXR1cyA9IENEX0VSUk9SOworCQkJCWJyZWFrOworCQl9CisJfQorCWlmICggcG9zaXRpb24gKSB7CisJCWlmICggc3RhdHVzID09IENEX1BMQVlJTkcgfHwgKHN0YXR1cyA9PSBDRF9QQVVTRUQpICkgeworCQkJKnBvc2l0aW9uID0gTVNGX1RPX0ZSQU1FUygKKwkJCQkJZGF0YS53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLm1pbnV0ZSwKKwkJCQkJZGF0YS53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLnNlY29uZCwKKwkJCQkJZGF0YS53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLmZyYW1lKTsKKwkJfSBlbHNlIHsKKwkJCSpwb3NpdGlvbiA9IDA7CisJCX0KKwl9CisJcmV0dXJuKHN0YXR1cyk7Cit9CisKKy8qIFN0YXJ0IHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBpb2NfcGxheV9tc2YgcGxheXRpbWU7CisKKwlGUkFNRVNfVE9fTVNGKHN0YXJ0LAorCQkmcGxheXRpbWUuc3RhcnRfbSwgJnBsYXl0aW1lLnN0YXJ0X3MsICZwbGF5dGltZS5zdGFydF9mKTsKKwlGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwKKwkJJnBsYXl0aW1lLmVuZF9tLCAmcGxheXRpbWUuZW5kX3MsICZwbGF5dGltZS5lbmRfZik7CisjaWZkZWYgREVCVUdfQ0RST00KKyAgZnByaW50ZihzdGRlcnIsICJUcnlpbmcgdG8gcGxheSBmcm9tICVkOiVkOiVkIHRvICVkOiVkOiVkXG4iLAorCXBsYXl0aW1lLmNkbXNmX21pbjAsIHBsYXl0aW1lLmNkbXNmX3NlYzAsIHBsYXl0aW1lLmNkbXNmX2ZyYW1lMCwKKwlwbGF5dGltZS5jZG1zZl9taW4xLCBwbGF5dGltZS5jZG1zZl9zZWMxLCBwbGF5dGltZS5jZG1zZl9mcmFtZTEpOworI2VuZGlmCisJaW9jdGwoY2Ryb20tPmlkLCBDRElPQ1NUQVJULCAwKTsKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NQTEFZTVNGLCAmcGxheXRpbWUpKTsKK30KKworLyogUGF1c2UgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NQQVVTRSwgMCkpOworfQorCisvKiBSZXN1bWUgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pCit7CisJcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9DUkVTVU1FLCAwKSk7Cit9CisKKy8qIFN0b3AgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQoreworCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRElPQ1NUT1AsIDApKTsKK30KKworLyogRWplY3QgdGhlIENELVJPTSAqLworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NFSkVDVCwgMCkpOworfQorCisvKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLworc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCit7CisJY2xvc2UoY2Ryb20tPmlkKTsKK30KKwordm9pZCBTRExfU1lTX0NEUXVpdCh2b2lkKQoreworCWludCBpOworCisJaWYgKCBTRExfbnVtY2RzID4gMCApIHsKKwkJZm9yICggaT0wOyBpPFNETF9udW1jZHM7ICsraSApIHsKKwkJCVNETF9mcmVlKFNETF9jZGxpc3RbaV0pOworCQl9CisJCVNETF9udW1jZHMgPSAwOworCX0KK30KKworI2VuZGlmIC8qIFNETF9DRFJPTV9GUkVFQlNEICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL2xpbnV4L1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9saW51eC9TRExfc3lzY2Ryb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODA0MDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9saW51eC9TRExfc3lzY2Ryb20uYwpAQCAtMCwwICsxLDU2NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfQ0RST01fTElOVVgKKworLyogRnVuY3Rpb25zIGZvciBzeXN0ZW0tbGV2ZWwgQ0QtUk9NIGF1ZGlvIGNvbnRyb2wgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgkvKiBGb3Igc3RyZXJyb3IoKSAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIF9fTElOVVhfXworI2lmZGVmIEhBVkVfTElOVVhfVkVSU0lPTl9ICisvKiBsaW51eCAyLjYuOSB3b3JrYXJvdW5kICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA9PSBLRVJORUxfVkVSU0lPTigyLDYsOSkKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNkZWZpbmUgX19sZTY0IF9fdTY0CisjZGVmaW5lIF9fbGUzMiBfX3UzMgorI2RlZmluZSBfX2xlMTYgX191MTYKKyNkZWZpbmUgX19iZTY0IF9fdTY0CisjZGVmaW5lIF9fYmUzMiBfX3UzMgorI2RlZmluZSBfX2JlMTYgX191MTYKKyNlbmRpZiAvKiBsaW51eCAyLjYuOSB3b3JrYXJvdW5kICovCisjZW5kaWYgLyogSEFWRV9MSU5VWF9WRVJTSU9OX0ggKi8KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2VuZGlmCisjaWZkZWYgX19TVlI0CisjaW5jbHVkZSA8c3lzL2NkaW8uaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgdGhpcyB0byB1c2UgdGhlIGFsdGVybmF0aXZlIGdldG1udGVudCgpIGNvZGUgKi8KKyNpZm5kZWYgX19TVlI0CisjZGVmaW5lIFVTRV9NTlRFTlQKKyNlbmRpZgorCisjaWZkZWYgVVNFX01OVEVOVAorI2lmIGRlZmluZWQoX19VU0xDX18pCisjaW5jbHVkZSA8c3lzL21udGVudC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9QQVRIX01OVFRBQgorI2lmZGVmIE1OVFRBQgorI2RlZmluZSBfUEFUSF9NTlRUQUIJTU5UVEFCCisjZWxzZQorI2RlZmluZSBfUEFUSF9NTlRUQUIJIi9ldGMvZnN0YWIiCisjZW5kaWYKKyNlbmRpZiAvKiAhX1BBVEhfTU5UVEFCICovCisKKyNpZm5kZWYgX1BBVEhfTU9VTlRFRAorI2RlZmluZSBfUEFUSF9NT1VOVEVECSIvZXRjL210YWIiCisjZW5kaWYgLyogIV9QQVRIX01PVU5URUQgKi8KKworI2lmbmRlZiBNTlRUWVBFX0NEUk9NCisjZGVmaW5lIE1OVFRZUEVfQ0RST00JImlzbzk2NjAiCisjZW5kaWYKKyNpZm5kZWYgTU5UVFlQRV9TVVBFUgorI2RlZmluZSBNTlRUWVBFX1NVUEVSCSJzdXBlcm1vdW50IgorI2VuZGlmCisjZW5kaWYgLyogVVNFX01OVEVOVCAqLworCisjaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c2Nkcm9tLmgiCisKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgd2UnbGwgZGV0ZWN0ICovCisjZGVmaW5lIE1BWF9EUklWRVMJMTYJCisKKy8qIEEgbGlzdCBvZiBhdmFpbGFibGUgQ0QtUk9NIGRyaXZlcyAqLworc3RhdGljIGNoYXIgKlNETF9jZGxpc3RbTUFYX0RSSVZFU107CitzdGF0aWMgZGV2X3QgU0RMX2NkbW9kZVtNQVhfRFJJVkVTXTsKKworLyogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQ0QgY29udHJvbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOworc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOworc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOworc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKKworLyogU29tZSBpb2N0bCgpIGVycm5vIHZhbHVlcyB3aGljaCBvY2N1ciB3aGVuIHRoZSB0cmF5IGlzIGVtcHR5ICovCisjaWZuZGVmIEVOT01FRElVTQorI2RlZmluZSBFTk9NRURJVU0gRU5PRU5UCisjZW5kaWYKKyNkZWZpbmUgRVJSTk9fVFJBWUVNUFRZKGVycm5vKQlcCisJKChlcnJubyA9PSBFSU8pICAgIHx8IChlcnJubyA9PSBFTk9FTlQpIHx8IFwKKwkgKGVycm5vID09IEVJTlZBTCkgfHwgKGVycm5vID09IEVOT01FRElVTSkpCisKKy8qIENoZWNrIGEgZHJpdmUgdG8gc2VlIGlmIGl0IGlzIGEgQ0QtUk9NICovCitzdGF0aWMgaW50IENoZWNrRHJpdmUoY2hhciAqZHJpdmUsIGNoYXIgKm1udHR5cGUsIHN0cnVjdCBzdGF0ICpzdGJ1ZikKK3sKKwlpbnQgaXNfY2QsIGNkZmQ7CisJc3RydWN0IGNkcm9tX3N1YmNobmwgaW5mbzsKKworCS8qIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHJldHVybiAtMSAqLworCWlmICggc3RhdChkcml2ZSwgc3RidWYpIDwgMCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBJZiBpdCBkb2VzIGV4aXN0LCB2ZXJpZnkgdGhhdCBpdCdzIGFuIGF2YWlsYWJsZSBDRC1ST00gKi8KKwlpc19jZCA9IDA7CisJaWYgKCBTX0lTQ0hSKHN0YnVmLT5zdF9tb2RlKSB8fCBTX0lTQkxLKHN0YnVmLT5zdF9tb2RlKSApIHsKKwkJY2RmZCA9IG9wZW4oZHJpdmUsIChPX1JET05MWXxPX05PTkJMT0NLKSwgMCk7CisJCWlmICggY2RmZCA+PSAwICkgeworCQkJaW5mby5jZHNjX2Zvcm1hdCA9IENEUk9NX01TRjsKKwkJCS8qIFVuZGVyIExpbnV4LCBFSU8gb2NjdXJzIHdoZW4gYSBkaXNrIGlzIG5vdCBwcmVzZW50LgorCQkJICovCisJCQlpZiAoIChpb2N0bChjZGZkLCBDRFJPTVNVQkNITkwsICZpbmZvKSA9PSAwKSB8fAorCQkJCQkJRVJSTk9fVFJBWUVNUFRZKGVycm5vKSApIHsKKwkJCQlpc19jZCA9IDE7CisJCQl9CisJCQljbG9zZShjZGZkKTsKKwkJfQorI2lmZGVmIFVTRV9NTlRFTlQKKwkJLyogRXZlbiBpZiB3ZSBjYW4ndCByZWFkIGl0LCBpdCBtaWdodCBiZSBtb3VudGVkICovCisJCWVsc2UgaWYgKCBtbnR0eXBlICYmIChTRExfc3RyY21wKG1udHR5cGUsIE1OVFRZUEVfQ0RST00pID09IDApICkgeworCQkJaXNfY2QgPSAxOworCQl9CisjZW5kaWYKKwl9CisJcmV0dXJuKGlzX2NkKTsKK30KKworLyogQWRkIGEgQ0QtUk9NIGRyaXZlIHRvIG91ciBsaXN0IG9mIHZhbGlkIGRyaXZlcyAqLworc3RhdGljIHZvaWQgQWRkRHJpdmUoY2hhciAqZHJpdmUsIHN0cnVjdCBzdGF0ICpzdGJ1ZikKK3sKKwlpbnQgaTsKKworCWlmICggU0RMX251bWNkcyA8IE1BWF9EUklWRVMgKSB7CisJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbHJlYWR5IGluIG91ciBsaXN0LgorCSAJICAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2Ugc2VlIGEgZHJpdmUgdmlhIHN5bWJvbGljIGxpbmsuCisJCSAqLworCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgeworCQkJaWYgKCBzdGJ1Zi0+c3RfcmRldiA9PSBTRExfY2Rtb2RlW2ldICkgeworI2lmZGVmIERFQlVHX0NEUk9NCisgIGZwcmludGYoc3RkZXJyLCAiRHVwbGljYXRlIGRyaXZlIGRldGVjdGVkOiAlcyA9PSAlc1xuIiwgZHJpdmUsIFNETF9jZGxpc3RbaV0pOworI2VuZGlmCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJLyogQWRkIHRoaXMgZHJpdmUgdG8gb3VyIGxpc3QgKi8KKwkJaSA9IFNETF9udW1jZHM7CisJCVNETF9jZGxpc3RbaV0gPSBTRExfc3RyZHVwKGRyaXZlKTsKKwkJaWYgKCBTRExfY2RsaXN0W2ldID09IE5VTEwgKSB7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCXJldHVybjsKKwkJfQorCQlTRExfY2Rtb2RlW2ldID0gc3RidWYtPnN0X3JkZXY7CisJCSsrU0RMX251bWNkczsKKyNpZmRlZiBERUJVR19DRFJPTQorICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIENELVJPTSBkcml2ZTogJXNcbiIsIGRyaXZlKTsKKyNlbmRpZgorCX0KK30KKworI2lmZGVmIFVTRV9NTlRFTlQKK3N0YXRpYyB2b2lkIENoZWNrTW91bnRzKGNvbnN0IGNoYXIgKm10YWIpCit7CisJRklMRSAqbW50ZnA7CisJc3RydWN0IG1udGVudCAqbW50ZW50OworCXN0cnVjdCBzdGF0IHN0YnVmOworCisJbW50ZnAgPSBzZXRtbnRlbnQobXRhYiwgInIiKTsKKwlpZiAoIG1udGZwICE9IE5VTEwgKSB7CisJCWNoYXIgKnRtcDsKKwkJY2hhciAqbW50X3R5cGU7CisJCXNpemVfdCBtbnRfdHlwZV9sZW47CisJCWNoYXIgKm1udF9kZXY7CisJCXNpemVfdCBtbnRfZGV2X2xlbjsKKworCQl3aGlsZSAoIChtbnRlbnQ9Z2V0bW50ZW50KG1udGZwKSkgIT0gTlVMTCApIHsKKwkJCW1udF90eXBlX2xlbiA9IFNETF9zdHJsZW4obW50ZW50LT5tbnRfdHlwZSkgKyAxOworCQkJbW50X3R5cGUgPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbW50X3R5cGVfbGVuKTsKKwkJCWlmIChtbnRfdHlwZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOyAgLyogbWF5YmUgeW91J2xsIGdldCBsdWNreSBuZXh0IHRpbWUuICovCisKKwkJCW1udF9kZXZfbGVuID0gU0RMX3N0cmxlbihtbnRlbnQtPm1udF9mc25hbWUpICsgMTsKKwkJCW1udF9kZXYgPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbW50X2Rldl9sZW4pOworCQkJaWYgKG1udF9kZXYgPT0gTlVMTCkgeworCQkJCVNETF9zdGFja19mcmVlKG1udF90eXBlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJU0RMX3N0cmxjcHkobW50X3R5cGUsIG1udGVudC0+bW50X3R5cGUsIG1udF90eXBlX2xlbik7CisJCQlTRExfc3RybGNweShtbnRfZGV2LCBtbnRlbnQtPm1udF9mc25hbWUsIG1udF9kZXZfbGVuKTsKKworCQkJLyogSGFuZGxlICJzdXBlcm1vdW50IiBmaWxlc3lzdGVtIG1vdW50cyAqLworCQkJaWYgKCBTRExfc3RyY21wKG1udF90eXBlLCBNTlRUWVBFX1NVUEVSKSA9PSAwICkgeworCQkJCXRtcCA9IFNETF9zdHJzdHIobW50ZW50LT5tbnRfb3B0cywgImZzPSIpOworCQkJCWlmICggdG1wICkgeworCQkJCQlTRExfc3RhY2tfZnJlZShtbnRfdHlwZSk7CisJCQkJCW1udF90eXBlID0gU0RMX3N0cmR1cCh0bXAgKyBTRExfc3RybGVuKCJmcz0iKSk7CisJCQkJCWlmICggbW50X3R5cGUgKSB7CisJCQkJCQl0bXAgPSBTRExfc3RyY2hyKG1udF90eXBlLCAnLCcpOworCQkJCQkJaWYgKCB0bXAgKSB7CisJCQkJCQkJKnRtcCA9ICdcMCc7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJdG1wID0gU0RMX3N0cnN0cihtbnRlbnQtPm1udF9vcHRzLCAiZGV2PSIpOworCQkJCWlmICggdG1wICkgeworCQkJCQlTRExfc3RhY2tfZnJlZShtbnRfZGV2KTsKKwkJCQkJbW50X2RldiA9IFNETF9zdHJkdXAodG1wICsgU0RMX3N0cmxlbigiZGV2PSIpKTsKKwkJCQkJaWYgKCBtbnRfZGV2ICkgeworCQkJCQkJdG1wID0gU0RMX3N0cmNocihtbnRfZGV2LCAnLCcpOworCQkJCQkJaWYgKCB0bXAgKSB7CisJCQkJCQkJKnRtcCA9ICdcMCc7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIFNETF9zdHJjbXAobW50X3R5cGUsIE1OVFRZUEVfQ0RST00pID09IDAgKSB7CisjaWZkZWYgREVCVUdfQ0RST00KKyAgZnByaW50ZihzdGRlcnIsICJDaGVja2luZyBtb3VudCBwYXRoIGZyb20gJXM6ICVzIG1vdW50ZWQgb24gJXMgb2YgJXNcbiIsCisJbXRhYiwgbW50X2RldiwgbW50ZW50LT5tbnRfZGlyLCBtbnRfdHlwZSk7CisjZW5kaWYKKwkJCQlpZiAoQ2hlY2tEcml2ZShtbnRfZGV2LCBtbnRfdHlwZSwgJnN0YnVmKSA+IDApIHsKKwkJCQkJQWRkRHJpdmUobW50X2RldiwgJnN0YnVmKTsKKwkJCQl9CisJCQl9CisJCQlTRExfc3RhY2tfZnJlZShtbnRfZGV2KTsKKwkJCVNETF9zdGFja19mcmVlKG1udF90eXBlKTsKKwkJfQorCQllbmRtbnRlbnQobW50ZnApOworCX0KK30KKyNlbmRpZiAvKiBVU0VfTU5URU5UICovCisKK2ludCAgU0RMX1NZU19DREluaXQodm9pZCkKK3sKKwkvKiBjaGVja2xpc3Q6IC9kZXYvY2Ryb20sIC9kZXYvaGQ/LCAvZGV2L3NjZD8gL2Rldi9zcj8gKi8KKwlzdGF0aWMgY2hhciAqY2hlY2tsaXN0W10gPSB7CisJCSJjZHJvbSIsICI/YSBoZD8iLCAiPzAgc2NkPyIsICI/MCBzcj8iLCBOVUxMCisJfTsKKwljaGFyICpTRExjZHJvbTsKKwlpbnQgaSwgaiwgZXhpc3RzOworCWNoYXIgZHJpdmVbMzJdOworCXN0cnVjdCBzdGF0IHN0YnVmOworCisJLyogRmlsbCBpbiBvdXIgZHJpdmVyIGNhcGFiaWxpdGllcyAqLworCVNETF9DRGNhcHMuTmFtZSA9IFNETF9TWVNfQ0ROYW1lOworCVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOworCVNETF9DRGNhcHMuR2V0VE9DID0gU0RMX1NZU19DREdldFRPQzsKKwlTRExfQ0RjYXBzLlN0YXR1cyA9IFNETF9TWVNfQ0RTdGF0dXM7CisJU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7CisJU0RMX0NEY2Fwcy5QYXVzZSA9IFNETF9TWVNfQ0RQYXVzZTsKKwlTRExfQ0RjYXBzLlJlc3VtZSA9IFNETF9TWVNfQ0RSZXN1bWU7CisJU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7CisJU0RMX0NEY2Fwcy5FamVjdCA9IFNETF9TWVNfQ0RFamVjdDsKKwlTRExfQ0RjYXBzLkNsb3NlID0gU0RMX1NZU19DRENsb3NlOworCisJLyogTG9vayBpbiB0aGUgZW52aXJvbm1lbnQgZm9yIG91ciBDRC1ST00gZHJpdmUgbGlzdCAqLworCVNETGNkcm9tID0gU0RMX2dldGVudigiU0RMX0NEUk9NIik7CS8qICc6JyBzZXBhcmF0ZWQgbGlzdCBvZiBkZXZpY2VzICovCisJaWYgKCBTRExjZHJvbSAhPSBOVUxMICkgeworCQljaGFyICpjZHBhdGgsICpkZWxpbTsKKwkJc2l6ZV90IGxlbiA9IFNETF9zdHJsZW4oU0RMY2Ryb20pKzE7CisJCWNkcGF0aCA9IFNETF9zdGFja19hbGxvYyhjaGFyLCBsZW4pOworCQlpZiAoIGNkcGF0aCAhPSBOVUxMICkgeworCQkJU0RMX3N0cmxjcHkoY2RwYXRoLCBTRExjZHJvbSwgbGVuKTsKKwkJCVNETGNkcm9tID0gY2RwYXRoOworCQkJZG8geworCQkJCWRlbGltID0gU0RMX3N0cmNocihTRExjZHJvbSwgJzonKTsKKwkJCQlpZiAoIGRlbGltICkgeworCQkJCQkqZGVsaW0rKyA9ICdcMCc7CisJCQkJfQorI2lmZGVmIERFQlVHX0NEUk9NCisgIGZwcmludGYoc3RkZXJyLCAiQ2hlY2tpbmcgQ0QtUk9NIGRyaXZlIGZyb20gU0RMX0NEUk9NOiAlc1xuIiwgU0RMY2Ryb20pOworI2VuZGlmCisJCQkJaWYgKCBDaGVja0RyaXZlKFNETGNkcm9tLCBOVUxMLCAmc3RidWYpID4gMCApIHsKKwkJCQkJQWRkRHJpdmUoU0RMY2Ryb20sICZzdGJ1Zik7CisJCQkJfQorCQkJCWlmICggZGVsaW0gKSB7CisJCQkJCVNETGNkcm9tID0gZGVsaW07CisJCQkJfSBlbHNlIHsKKwkJCQkJU0RMY2Ryb20gPSBOVUxMOworCQkJCX0KKwkJCX0gd2hpbGUgKCBTRExjZHJvbSApOworCQkJU0RMX3N0YWNrX2ZyZWUoY2RwYXRoKTsKKwkJfQorCisJCS8qIElmIHdlIGZvdW5kIG91ciBkcml2ZXMsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCisJCWlmICggU0RMX251bWNkcyA+IDAgKSB7CisJCQlyZXR1cm4oMCk7CisJCX0KKwl9CisKKyNpZmRlZiBVU0VfTU5URU5UCisJLyogQ2hlY2sgL2Rldi9jZHJvbSBmaXJzdCA6LSkgKi8KKwlpZiAoQ2hlY2tEcml2ZSgiL2Rldi9jZHJvbSIsIE5VTEwsICZzdGJ1ZikgPiAwKSB7CisJCUFkZERyaXZlKCIvZGV2L2Nkcm9tIiwgJnN0YnVmKTsKKwl9CisKKwkvKiBOb3cgY2hlY2sgdGhlIGN1cnJlbnRseSBtb3VudGVkIENEIGRyaXZlcyAqLworCUNoZWNrTW91bnRzKF9QQVRIX01PVU5URUQpOworCisJLyogRmluYWxseSBjaGVjayBwb3NzaWJsZSBtb3VudGFibGUgZHJpdmVzIGluIC9ldGMvZnN0YWIgKi8KKwlDaGVja01vdW50cyhfUEFUSF9NTlRUQUIpOworCisJLyogSWYgd2UgZm91bmQgb3VyIGRyaXZlcywgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gKi8KKwlpZiAoIFNETF9udW1jZHMgPiAwICkgeworCQlyZXR1cm4oMCk7CisJfQorI2VuZGlmIC8qIFVTRV9NTlRFTlQgKi8KKworCS8qIFNjYW4gdGhlIHN5c3RlbSBmb3IgQ0QtUk9NIGRyaXZlcy4KKwkgICBOb3QgYWx3YXlzIDEwMCUgcmVsaWFibGUsIHNvIHVzZSB0aGUgVVNFX01OVEVOVCBjb2RlIGFib3ZlIGZpcnN0LgorCSAqLworCWZvciAoIGk9MDsgY2hlY2tsaXN0W2ldOyArK2kgKSB7CisJCWlmICggY2hlY2tsaXN0W2ldWzBdID09ICc/JyApIHsKKwkJCWNoYXIgKmluc2VydDsKKwkJCWV4aXN0cyA9IDE7CisJCQlmb3IgKCBqPWNoZWNrbGlzdFtpXVsxXTsgZXhpc3RzOyArK2ogKSB7CisJCQkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIi9kZXYvJXMiLCAmY2hlY2tsaXN0W2ldWzNdKTsKKwkJCQlpbnNlcnQgPSBTRExfc3RyY2hyKGRyaXZlLCAnPycpOworCQkJCWlmICggaW5zZXJ0ICE9IE5VTEwgKSB7CisJCQkJCSppbnNlcnQgPSBqOworCQkJCX0KKyNpZmRlZiBERUJVR19DRFJPTQorICBmcHJpbnRmKHN0ZGVyciwgIkNoZWNraW5nIHBvc3NpYmxlIENELVJPTSBkcml2ZTogJXNcbiIsIGRyaXZlKTsKKyNlbmRpZgorCQkJCXN3aXRjaCAoQ2hlY2tEcml2ZShkcml2ZSwgTlVMTCwgJnN0YnVmKSkgeworCQkJCQkvKiBEcml2ZSBleGlzdHMgYW5kIGlzIGEgQ0QtUk9NICovCisJCQkJCWNhc2UgMToKKwkJCQkJCUFkZERyaXZlKGRyaXZlLCAmc3RidWYpOworCQkJCQkJYnJlYWs7CisJCQkJCS8qIERyaXZlIGV4aXN0cywgYnV0IGlzbid0IGEgQ0QtUk9NICovCisJCQkJCWNhc2UgMDoKKwkJCQkJCWJyZWFrOworCQkJCQkvKiBEcml2ZSBkb2Vzbid0IGV4aXN0ICovCisJCQkJCWNhc2UgLTE6CisJCQkJCQlleGlzdHMgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIi9kZXYvJXMiLCBjaGVja2xpc3RbaV0pOworI2lmZGVmIERFQlVHX0NEUk9NCisgIGZwcmludGYoc3RkZXJyLCAiQ2hlY2tpbmcgcG9zc2libGUgQ0QtUk9NIGRyaXZlOiAlc1xuIiwgZHJpdmUpOworI2VuZGlmCisJCQlpZiAoIENoZWNrRHJpdmUoZHJpdmUsIE5VTEwsICZzdGJ1ZikgPiAwICkgeworCQkJCUFkZERyaXZlKGRyaXZlLCAmc3RidWYpOworCQkJfQorCQl9CisJfQorCXJldHVybigwKTsKK30KKworLyogR2VuZXJhbCBpb2N0bCgpIENELVJPTSBjb21tYW5kIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0Rpb2N0bChpbnQgaWQsIGludCBjb21tYW5kLCB2b2lkICphcmcpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGlvY3RsKGlkLCBjb21tYW5kLCBhcmcpOworCWlmICggcmV0dmFsIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJpb2N0bCgpIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCXJldHVybihyZXR2YWwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKQoreworCXJldHVybihTRExfY2RsaXN0W2RyaXZlXSk7Cit9CisKK3N0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKQoreworCXJldHVybihvcGVuKFNETF9jZGxpc3RbZHJpdmVdLCAoT19SRE9OTFl8T19OT05CTE9DSyksIDApKTsKK30KKworc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pCit7CisJc3RydWN0IGNkcm9tX3RvY2hkciB0b2M7CisJaW50IGksIG9rYXk7CisJc3RydWN0IGNkcm9tX3RvY2VudHJ5IGVudHJ5OworCisJb2theSA9IDA7CisJaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVJFQURUT0NIRFIsICZ0b2MpID09IDAgKSB7CisJCWNkcm9tLT5udW10cmFja3MgPSB0b2MuY2R0aF90cmsxLXRvYy5jZHRoX3RyazArMTsKKwkJaWYgKCBjZHJvbS0+bnVtdHJhY2tzID4gU0RMX01BWF9UUkFDS1MgKSB7CisJCQljZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7CisJCX0KKwkJLyogUmVhZCBhbGwgdGhlIHRyYWNrIFRPQyBlbnRyaWVzICovCisJCWZvciAoIGk9MDsgaTw9Y2Ryb20tPm51bXRyYWNrczsgKytpICkgeworCQkJaWYgKCBpID09IGNkcm9tLT5udW10cmFja3MgKSB7CisJCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gQ0RST01fTEVBRE9VVDsKKwkJCX0gZWxzZSB7CisJCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gdG9jLmNkdGhfdHJrMCtpOworCQkJfQorCQkJZW50cnkuY2R0ZV90cmFjayA9IGNkcm9tLT50cmFja1tpXS5pZDsKKwkJCWVudHJ5LmNkdGVfZm9ybWF0ID0gQ0RST01fTVNGOworCQkJaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVJFQURUT0NFTlRSWSwKKwkJCQkJCQkJJmVudHJ5KSA8IDAgKSB7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWlmICggZW50cnkuY2R0ZV9jdHJsICYgQ0RST01fREFUQV9UUkFDSyApIHsKKwkJCQkJY2Ryb20tPnRyYWNrW2ldLnR5cGUgPSBTRExfREFUQV9UUkFDSzsKKwkJCQl9IGVsc2UgeworCQkJCQljZHJvbS0+dHJhY2tbaV0udHlwZSA9IFNETF9BVURJT19UUkFDSzsKKwkJCQl9CisJCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IE1TRl9UT19GUkFNRVMoCisJCQkJCQllbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwKKwkJCQkJCWVudHJ5LmNkdGVfYWRkci5tc2Yuc2Vjb25kLAorCQkJCQkJZW50cnkuY2R0ZV9hZGRyLm1zZi5mcmFtZSk7CisJCQkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IDA7CisJCQkJaWYgKCBpID4gMCApIHsKKwkJCQkJY2Ryb20tPnRyYWNrW2ktMV0ubGVuZ3RoID0KKwkJCQkJCWNkcm9tLT50cmFja1tpXS5vZmZzZXQtCisJCQkJCQljZHJvbS0+dHJhY2tbaS0xXS5vZmZzZXQ7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICggaSA9PSAoY2Ryb20tPm51bXRyYWNrcysxKSApIHsKKwkJCW9rYXkgPSAxOworCQl9CisJfQorCXJldHVybihva2F5ID8gMCA6IC0xKTsKK30KKworLyogR2V0IENELVJPTSBzdGF0dXMgKi8KK3N0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pCit7CisJQ0RzdGF0dXMgc3RhdHVzOworCXN0cnVjdCBjZHJvbV90b2NoZHIgdG9jOworCXN0cnVjdCBjZHJvbV9zdWJjaG5sIGluZm87CisKKwlpbmZvLmNkc2NfZm9ybWF0ID0gQ0RST01fTVNGOworCWlmICggaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVNVQkNITkwsICZpbmZvKSA8IDAgKSB7CisJCWlmICggRVJSTk9fVFJBWUVNUFRZKGVycm5vKSApIHsKKwkJCXN0YXR1cyA9IENEX1RSQVlFTVBUWTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IENEX0VSUk9SOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChpbmZvLmNkc2NfYXVkaW9zdGF0dXMpIHsKKwkJCWNhc2UgQ0RST01fQVVESU9fSU5WQUxJRDoKKwkJCWNhc2UgQ0RST01fQVVESU9fTk9fU1RBVFVTOgorCQkJCS8qIFRyeSB0byBkZXRlcm1pbmUgaWYgdGhlcmUncyBhIENEIGF2YWlsYWJsZSAqLworCQkJCWlmIChpb2N0bChjZHJvbS0+aWQsIENEUk9NUkVBRFRPQ0hEUiwgJnRvYyk9PTApCisJCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7CisJCQkJZWxzZQorCQkJCQlzdGF0dXMgPSBDRF9UUkFZRU1QVFk7CisJCQkJYnJlYWs7CisJCQljYXNlIENEUk9NX0FVRElPX0NPTVBMRVRFRDoKKwkJCQlzdGF0dXMgPSBDRF9TVE9QUEVEOworCQkJCWJyZWFrOworCQkJY2FzZSBDRFJPTV9BVURJT19QTEFZOgorCQkJCXN0YXR1cyA9IENEX1BMQVlJTkc7CisJCQkJYnJlYWs7CisJCQljYXNlIENEUk9NX0FVRElPX1BBVVNFRDoKKwkJCQkvKiBXb3JrYXJvdW5kIGJ1Z2d5IENELVJPTSBkcml2ZSAqLworCQkJCWlmICggaW5mby5jZHNjX3RyayA9PSBDRFJPTV9MRUFET1VUICkgeworCQkJCQlzdGF0dXMgPSBDRF9TVE9QUEVEOworCQkJCX0gZWxzZSB7CisJCQkJCXN0YXR1cyA9IENEX1BBVVNFRDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXN0YXR1cyA9IENEX0VSUk9SOworCQkJCWJyZWFrOworCQl9CisJfQorCWlmICggcG9zaXRpb24gKSB7CisJCWlmICggc3RhdHVzID09IENEX1BMQVlJTkcgfHwgKHN0YXR1cyA9PSBDRF9QQVVTRUQpICkgeworCQkJKnBvc2l0aW9uID0gTVNGX1RPX0ZSQU1FUygKKwkJCQkJaW5mby5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSwKKwkJCQkJaW5mby5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCwKKwkJCQkJaW5mby5jZHNjX2Fic2FkZHIubXNmLmZyYW1lKTsKKwkJfSBlbHNlIHsKKwkJCSpwb3NpdGlvbiA9IDA7CisJCX0KKwl9CisJcmV0dXJuKHN0YXR1cyk7Cit9CisKKy8qIFN0YXJ0IHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBjZHJvbV9tc2YgcGxheXRpbWU7CisKKwlGUkFNRVNfVE9fTVNGKHN0YXJ0LAorCSAgICZwbGF5dGltZS5jZG1zZl9taW4wLCAmcGxheXRpbWUuY2Rtc2Zfc2VjMCwgJnBsYXl0aW1lLmNkbXNmX2ZyYW1lMCk7CisJRlJBTUVTX1RPX01TRihzdGFydCtsZW5ndGgsCisJICAgJnBsYXl0aW1lLmNkbXNmX21pbjEsICZwbGF5dGltZS5jZG1zZl9zZWMxLCAmcGxheXRpbWUuY2Rtc2ZfZnJhbWUxKTsKKyNpZmRlZiBERUJVR19DRFJPTQorICBmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyB0byBwbGF5IGZyb20gJWQ6JWQ6JWQgdG8gJWQ6JWQ6JWRcbiIsCisJcGxheXRpbWUuY2Rtc2ZfbWluMCwgcGxheXRpbWUuY2Rtc2Zfc2VjMCwgcGxheXRpbWUuY2Rtc2ZfZnJhbWUwLAorCXBsYXl0aW1lLmNkbXNmX21pbjEsIHBsYXl0aW1lLmNkbXNmX3NlYzEsIHBsYXl0aW1lLmNkbXNmX2ZyYW1lMSk7CisjZW5kaWYKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01QTEFZTVNGLCAmcGxheXRpbWUpKTsKK30KKworLyogUGF1c2UgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01QQVVTRSwgMCkpOworfQorCisvKiBSZXN1bWUgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pCit7CisJcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENEUk9NUkVTVU1FLCAwKSk7Cit9CisKKy8qIFN0b3AgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQoreworCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVNUT1AsIDApKTsKK30KKworLyogRWplY3QgdGhlIENELVJPTSAqLworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01FSkVDVCwgMCkpOworfQorCisvKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLworc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCit7CisJY2xvc2UoY2Ryb20tPmlkKTsKK30KKwordm9pZCBTRExfU1lTX0NEUXVpdCh2b2lkKQoreworCWludCBpOworCisJaWYgKCBTRExfbnVtY2RzID4gMCApIHsKKwkJZm9yICggaT0wOyBpPFNETF9udW1jZHM7ICsraSApIHsKKwkJCVNETF9mcmVlKFNETF9jZGxpc3RbaV0pOworCQl9CisJCVNETF9udW1jZHMgPSAwOworCX0KK30KKworI2VuZGlmIC8qIFNETF9DRFJPTV9MSU5VWCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvcy9TRExfc3lzY2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3MvU0RMX3N5c2Nkcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhMjAyNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3MvU0RMX3N5c2Nkcm9tLmMKQEAgLTAsMCArMSw1MjUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0NEUk9NX01BQ09TCisKKy8qIE1hY09TIGZ1bmN0aW9ucyBmb3Igc3lzdGVtLWxldmVsIENELVJPTSBhdWRpbyBjb250cm9sICovCisKKyNpbmNsdWRlIDxEZXZpY2VzLmg+CisjaW5jbHVkZSA8RmlsZXMuaD4KKyNpbmNsdWRlIDxMb3dNZW0uaD4gLyogVXNlIGVudHJ5IHRhYmxlIG1hY3Jvcywgbm90IGZ1bmN0aW9ucyBpbiBJbnRlcmZhY2VMaWIgICovCisKKyNpbmNsdWRlICJTRExfY2Ryb20uaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKKyNpbmNsdWRlICJTRExfc3lzY2Ryb21fYy5oIgorCisvKiBBZGRlZCBieSBNYXR0IFNsb3QgKi8KKyNpZiAhZGVmaW5lZChMTUdldFVuaXRUYWJsZUVudHJ5Q291bnQpCisgICNkZWZpbmUgTE1HZXRVbml0VGFibGVFbnRyeUNvdW50KCkgICAqKHNob3J0ICopMHgwMUQyCisjZW5kaWYKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgd2UnbGwgZGV0ZWN0ICovCisjZGVmaW5lIE1BWF9EUklWRVMJMjYJCisKKy8qIEEgbGlzdCBvZiBhdmFpbGFibGUgQ0QtUk9NIGRyaXZlcyAqLworc3RhdGljIGxvbmcgU0RMX2NkdmVyc2lvbiA9IDA7CitzdGF0aWMgc3RydWN0IHsKKwlzaG9ydAkJZFJlZk51bTsKKwlzaG9ydAkJZHJpdmVOdW07CisJbG9uZwkJZnJhbWVzOworCWNoYXIJCW5hbWVbMjU2XTsKKwlCb29sZWFuCQloYXNBdWRpbzsKKwl9IFNETF9jZGxpc3RbTUFYX0RSSVZFU107CitzdGF0aWMgU3RyaW5nUHRyIGdEcml2ZXJOYW1lID0gIlxwLkFwcGxlQ0QiOworCisvKiBUaGUgc3lzdGVtLWRlcGVuZGVudCBDRCBjb250cm9sIGZ1bmN0aW9ucyAqLworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pOworc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pOworCitzdGF0aWMgc2hvcnQgU0RMX1NZU19TaG9ydFRvQkNEKHNob3J0IHZhbHVlKQoreworCXJldHVybigodmFsdWUgJSAxMCkgKyAodmFsdWUgLyAxMCkgKiAweDEwKTsgLyogQ29udmVydCB2YWx1ZSB0byBCQ0QgKi8KK30KKworc3RhdGljIHNob3J0IFNETF9TWVNfQkNEVG9TaG9ydChzaG9ydCB2YWx1ZSkKK3sKKwlyZXR1cm4oKHZhbHVlICUgMHgxMCkgKyAodmFsdWUgLyAweDEwKSAqIDEwKTsgLyogQ29udmVydCB2YWx1ZSBmcm9tIEJDRCAqLworfQorCitpbnQgIFNETF9TWVNfQ0RJbml0KHZvaWQpCit7CisJU0ludDE2CQkJZFJlZk51bSA9IDA7CisJU0ludDE2CQkJZmlyc3QsIGxhc3Q7CisKKwlTRExfbnVtY2RzID0gMDsKKworCS8qIENoZWNrIHRoYXQgdGhlIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSAqLworCWlmIChHZXN0YWx0KGtHZXN0YWx0QXVkaW9DRFNlbGVjdG9yLCAmU0RMX2NkdmVyc2lvbikgfHwgCisJCQkhU0RMX2NkdmVyc2lvbikgcmV0dXJuKDApOworCisJLyogRmlsbCBpbiBvdXIgZHJpdmVyIGNhcGFiaWxpdGllcyAqLworCVNETF9DRGNhcHMuTmFtZSA9IFNETF9TWVNfQ0ROYW1lOworCVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOworCVNETF9DRGNhcHMuR2V0VE9DID0gU0RMX1NZU19DREdldFRPQzsKKwlTRExfQ0RjYXBzLlN0YXR1cyA9IFNETF9TWVNfQ0RTdGF0dXM7CisJU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7CisJU0RMX0NEY2Fwcy5QYXVzZSA9IFNETF9TWVNfQ0RQYXVzZTsKKwlTRExfQ0RjYXBzLlJlc3VtZSA9IFNETF9TWVNfQ0RSZXN1bWU7CisJU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7CisJU0RMX0NEY2Fwcy5FamVjdCA9IFNETF9TWVNfQ0RFamVjdDsKKwlTRExfQ0RjYXBzLkNsb3NlID0gU0RMX1NZU19DRENsb3NlOworCisJLyogV2FsayB0aGUgbGlzdCwgY291bnQgZWFjaCBBdWRpb0NEIGRyaXZlciwgYW5kIHNhdmUgdGhlIHJlZm51bXMgKi8KKwlmaXJzdCA9IC0xOworCWxhc3QgPSAwIC0gTE1HZXRVbml0VGFibGVFbnRyeUNvdW50KCk7CisJZm9yKGRSZWZOdW0gPSBmaXJzdDsgZFJlZk51bSA+PSBsYXN0OyBkUmVmTnVtLS0pIHsKKwkJU3RyMjU1CQlkcml2ZXJOYW1lOworCQlTdHJpbmdQdHIJbmFtZVB0cjsKKwkJREN0bEhhbmRsZQlkZXZpY2VFbnRyeTsKKworCQlkZXZpY2VFbnRyeSA9IEdldERDdGxFbnRyeShkUmVmTnVtKTsKKwkJaWYgKCEgZGV2aWNlRW50cnkpIGNvbnRpbnVlOworCQkKKwkJLyogSXMgdGhpcyBhbiAuQXBwbGVDRCA/ICovCisJCW5hbWVQdHIgPSAoKmRldmljZUVudHJ5KS0+ZEN0bEZsYWdzICYgKDFMIDw8IGRSQU1CYXNlZCkgPworCQkJCSgoU3RyaW5nUHRyKSAoKERDdGxQdHIpIGRldmljZUVudHJ5KS0+ZEN0bERyaXZlciArIDE4KSA6CisJCQkJKChTdHJpbmdQdHIpICgqZGV2aWNlRW50cnkpLT5kQ3RsRHJpdmVyICsgMTgpOworCQlCbG9ja01vdmVEYXRhKG5hbWVQdHIsIGRyaXZlck5hbWUsIG5hbWVQdHJbMF0rMSk7CisJCWlmIChkcml2ZXJOYW1lWzBdID4gZ0RyaXZlck5hbWVbMF0pIGRyaXZlck5hbWVbMF0gPSBnRHJpdmVyTmFtZVswXTsKKwkJaWYgKCEgRXF1YWxTdHJpbmcoZHJpdmVyTmFtZSwgZ0RyaXZlck5hbWUsIGZhbHNlLCBmYWxzZSkpIGNvbnRpbnVlOworCisJCS8qIFJlY29yZCB0aGUgYmFzaWMgaW5mbyBmb3IgZWFjaCBkcml2ZSAqLworCQlTRExfY2RsaXN0W1NETF9udW1jZHNdLmRSZWZOdW0gPSBkUmVmTnVtOworCQlCbG9ja01vdmVEYXRhKG5hbWVQdHIgKyAxLCBTRExfY2RsaXN0W1NETF9udW1jZHNdLm5hbWUsIG5hbWVQdHJbMF0pOworCQlTRExfY2RsaXN0W1NETF9udW1jZHNdLm5hbWVbbmFtZVB0clswXV0gPSAwOworCQlTRExfY2RsaXN0W1NETF9udW1jZHNdLmhhc0F1ZGlvID0gZmFsc2U7CisJCVNETF9udW1jZHMrKzsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKQoreworCXJldHVybihTRExfY2RsaXN0W2RyaXZlXS5uYW1lKTsKK30KKworc3RhdGljIGludCBnZXRfZHJpdmVudW0oaW50IGRyaXZlKQoreworCVFIZHIgKmRyaXZlUSA9IEdldERydlFIZHIoKTsKKwlEcnZRRWwgKmRyaXZlRWxlbTsKKworCS8qIFVwZGF0ZSB0aGUgZHJpdmUgbnVtYmVyICovCisJU0RMX2NkbGlzdFtkcml2ZV0uZHJpdmVOdW0gPSAwOworCWlmICggZHJpdmVRLT5xVGFpbCApIHsKKwkJZHJpdmVRLT5xVGFpbC0+cUxpbmsgPSAwOworCX0KKwlmb3IgKCBkcml2ZUVsZW09KERydlFFbCAqKWRyaXZlUS0+cUhlYWQ7IGRyaXZlRWxlbTsKKwkgICAgICBkcml2ZUVsZW0gPSAoRHJ2UUVsICopZHJpdmVFbGVtLT5xTGluayApIHsKKwkJaWYgKCBkcml2ZUVsZW0tPmRRUmVmTnVtID09IFNETF9jZGxpc3RbZHJpdmVdLmRSZWZOdW0gKSB7CisJCQlTRExfY2RsaXN0W2RyaXZlXS5kcml2ZU51bSA9IGRyaXZlRWxlbS0+ZFFEcml2ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybihTRExfY2RsaXN0W2RyaXZlXS5kcml2ZU51bSk7Cit9CisKK3N0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKQoreworCXJldHVybihkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQoreworCUNEQ250cmxQYXJhbQkJY2RwYjsKKwlDRFRyYWNrRGF0YQkJCXRyYWNrc1tTRExfTUFYX1RSQUNLU107CisJbG9uZwkJCQlpLCBsZWFkb3V0OworCisJLyogR2V0IHRoZSBudW1iZXIgb2YgdHJhY2tzIG9uIHRoZSBDRCBieSBleGFtaW5pbmcgdGhlIFRPQyAqLworCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7CisJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CisJY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKKwljZHBiLmNzQ29kZSA9IGtSZWFkVE9DOworCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IGtHZXRUcmFja1JhbmdlOworCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7CisJCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOworCQlyZXR1cm4oLTEpOworCX0KKworCWNkcm9tLT5udW10cmFja3MgPSAKKwkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMV0pIC0gCisJCQlTRExfU1lTX0JDRFRvU2hvcnQoY2RwYi5jc1BhcmFtLmJ5dGVzWzBdKSArIDE7CisJaWYgKCBjZHJvbS0+bnVtdHJhY2tzID4gU0RMX01BWF9UUkFDS1MgKQorCQljZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7CisJY2Ryb20tPnN0YXR1cyA9IENEX1NUT1BQRUQ7CisJY2Ryb20tPmN1cl90cmFjayA9IDA7IC8qIEFwcGFyZW50bHkgdGhlc2UgYXJlIHNldCBlbHNld2hlcmUgKi8KKwljZHJvbS0+Y3VyX2ZyYW1lID0gMDsgLyogQXBwYXJlbnRseSB0aGVzZSBhcmUgc2V0IGVsc2V3aGVyZSAqLworCisKKwkvKiBHZXQgdGhlIGxlYWQgb3V0IGFyZWEgb2YgdGhlIENEIGJ5IGV4YW1pbmluZyB0aGUgVE9DICovCisJU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKKwljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKKwljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOworCWNkcGIuY3NDb2RlID0ga1JlYWRUT0M7CisJY2RwYi5jc1BhcmFtLndvcmRzWzBdID0ga0dldExlYWRPdXRBcmVhOworCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7CisJCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOworCQlyZXR1cm4oLTEpOworCX0KKworCWxlYWRvdXQgPSBNU0ZfVE9fRlJBTUVTKAorCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5ieXRlc1swXSksCisJCQlTRExfU1lTX0JDRFRvU2hvcnQoY2RwYi5jc1BhcmFtLmJ5dGVzWzFdKSwKKwkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMl0pKTsKKworCS8qIEdldCBhbiBhcnJheSBvZiB0cmFjayBsb2NhdGlvbnMgYnkgZXhhbWluaW5nIHRoZSBUT0MgKi8KKwlTRExfbWVtc2V0KHRyYWNrcywgMCwgc2l6ZW9mKHRyYWNrcykpOworCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7CisJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CisJY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKKwljZHBiLmNzQ29kZSA9IGtSZWFkVE9DOworCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IGtHZXRUcmFja0VudHJpZXM7CS8qIFR5cGUgb2YgUXVlcnkgKi8KKwkqICgobG9uZyAqKSAoY2RwYi5jc1BhcmFtLndvcmRzKzEpKSA9IChsb25nKSB0cmFja3M7CQkJCQorCWNkcGIuY3NQYXJhbS53b3Jkc1szXSA9IGNkcm9tLT5udW10cmFja3MgKiBzaXplb2YodHJhY2tzWzBdKTsJCQorCSogKChjaGFyICopIChjZHBiLmNzUGFyYW0ud29yZHMrNCkpID0gMTsJLyogRmlyc3QgdHJhY2sgKi8KKwlpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgeworCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBSZWFkIGFsbCB0aGUgdHJhY2sgVE9DIGVudHJpZXMgKi8KKwlTRExfY2RsaXN0W2Nkcm9tLT5pZF0uaGFzQXVkaW8gPSBmYWxzZTsKKwlmb3IgKCBpPTA7IGk8Y2Ryb20tPm51bXRyYWNrczsgKytpICkgCisJCXsKKwkJY2Ryb20tPnRyYWNrW2ldLmlkID0gaSsxOworCQlpZiAodHJhY2tzW2ldLmVudHJ5LmNvbnRyb2wgJiBrRGF0YVRyYWNrTWFzaykKKwkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0RBVEFfVFJBQ0s7CisJCWVsc2UKKwkJCXsKKwkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOworCQkJU0RMX2NkbGlzdFtTRExfbnVtY2RzXS5oYXNBdWRpbyA9IHRydWU7CisJCQl9CisJCQorCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gTVNGX1RPX0ZSQU1FUygKKwkJCQlTRExfU1lTX0JDRFRvU2hvcnQodHJhY2tzW2ldLmVudHJ5Lm1pbiksCisJCQkJU0RMX1NZU19CQ0RUb1Nob3J0KHRyYWNrc1tpXS5lbnRyeS5taW4pLAorCQkJCVNETF9TWVNfQkNEVG9TaG9ydCh0cmFja3NbaV0uZW50cnkuZnJhbWUpKTsKKwkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IE1TRl9UT19GUkFNRVMoCisJCQkJU0RMX1NZU19CQ0RUb1Nob3J0KHRyYWNrc1tpKzFdLmVudHJ5Lm1pbiksCisJCQkJU0RMX1NZU19CQ0RUb1Nob3J0KHRyYWNrc1tpKzFdLmVudHJ5Lm1pbiksCisJCQkJU0RMX1NZU19CQ0RUb1Nob3J0KHRyYWNrc1tpKzFdLmVudHJ5LmZyYW1lKSkgLQorCQkJCWNkcm9tLT50cmFja1tpXS5vZmZzZXQ7CisJCX0KKwkKKwkvKiBBcHBhcmVudGx5IFNETCB3YW50cyBhIGZha2UgbGFzdCBlbnRyeSAqLworCWNkcm9tLT50cmFja1tpXS5vZmZzZXQgPSBsZWFkb3V0OworCWNkcm9tLT50cmFja1tpXS5sZW5ndGggPSAwOworCisJcmV0dXJuKDApOworfQorCisvKiBHZXQgQ0QtUk9NIHN0YXR1cyAqLworc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKK3sKKwlDRENudHJsUGFyYW0gY2RwYjsKKwlDRHN0YXR1cyBzdGF0dXMgPSBDRF9FUlJPUjsKKwlCb29sZWFuIHNwaW5uaW5nID0gZmFsc2U7CisKKwlpZiAocG9zaXRpb24pICpwb3NpdGlvbiA9IDA7CisKKwkvKiBHZXQgdGhlIG51bWJlciBvZiB0cmFja3Mgb24gdGhlIENEIGJ5IGV4YW1pbmluZyB0aGUgVE9DICovCisJaWYgKCAhIGdldF9kcml2ZW51bShjZHJvbS0+aWQpICkgeworCQlyZXR1cm4oQ0RfVFJBWUVNUFRZKTsKKwl9CisJU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKKwljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKKwljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOworCWNkcGIuY3NDb2RlID0ga1JlYWRUT0M7CisJY2RwYi5jc1BhcmFtLndvcmRzWzBdID0ga0dldFRyYWNrUmFuZ2U7CisJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKKwkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CisJCXJldHVybihDRF9FUlJPUik7CisJfQorCisJY2Ryb20tPm51bXRyYWNrcyA9IAorCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5ieXRlc1sxXSkgLSAKKwkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMF0pICsgMTsKKwlpZiAoIGNkcm9tLT5udW10cmFja3MgPiBTRExfTUFYX1RSQUNLUyApCisJCWNkcm9tLT5udW10cmFja3MgPSBTRExfTUFYX1RSQUNLUzsKKwljZHJvbS0+Y3VyX3RyYWNrID0gMDsgLyogQXBwYXJlbnRseSB0aGVzZSBhcmUgc2V0IGVsc2V3aGVyZSAqLworCWNkcm9tLT5jdXJfZnJhbWUgPSAwOyAvKiBBcHBhcmVudGx5IHRoZXNlIGFyZSBzZXQgZWxzZXdoZXJlICovCisKKworCWlmICgxIHx8IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5oYXNBdWRpbykgeworCQkvKiBHZXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3RhdHVzICovCisJCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7CisJCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOworCQljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOworCQljZHBiLmNzQ29kZSA9IGtBdWRpb1N0YXR1czsKKwkJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKKwkJCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQorCQlzd2l0Y2goY2RwYi5jc1BhcmFtLmNkLnN0YXR1cykgeworCQkJY2FzZSBrU3RhdHVzUGxheWluZzoKKwkJCQlzdGF0dXMgPSBDRF9QTEFZSU5HOworCQkJCXNwaW5uaW5nID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2Uga1N0YXR1c1BhdXNlZDoKKwkJCQlzdGF0dXMgPSBDRF9QQVVTRUQ7CisJCQkJc3Bpbm5pbmcgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSBrU3RhdHVzTXV0ZWQ6CisJCQkJc3RhdHVzID0gQ0RfUExBWUlORzsgLyogV2hhdCBzaG91bGQgSSBkbyBoZXJlPyAqLworCQkJCXNwaW5uaW5nID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2Uga1N0YXR1c0RvbmU6CisJCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKKwkJCQlzcGlubmluZyA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlIGtTdGF0dXNTdG9wcGVkOgorCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7CisJCQkJc3Bpbm5pbmcgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCWNhc2Uga1N0YXR1c0Vycm9yOgorCQkJZGVmYXVsdDoKKwkJCQlzdGF0dXMgPSBDRF9FUlJPUjsKKwkJCQlzcGlubmluZyA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCisJCWlmIChzcGlubmluZyAmJiBwb3NpdGlvbikgKnBvc2l0aW9uID0gTVNGX1RPX0ZSQU1FUygKKwkJCQlTRExfU1lTX0JDRFRvU2hvcnQoY2RwYi5jc1BhcmFtLmNkLm1pbnV0ZSksCisJCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5jZC5zZWNvbmQpLAorCQkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uY2QuZnJhbWUpKTsKKwkJfQorCWVsc2UKKwkJc3RhdHVzID0gQ0RfRVJST1I7IC8qIFdoYXQgc2hvdWxkIEkgZG8gaGVyZT8gKi8KKworCXJldHVybihzdGF0dXMpOworfQorCisvKiBTdGFydCBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKK3sKKwlDRENudHJsUGFyYW0gY2RwYjsKKworCS8qIFBhdXNlIHRoZSBjdXJyZW50IGF1ZGlvIHBsYXliYWNrIHRvIGF2b2lkIGF1ZGlibGUgYXJ0aWZhY3RzICovCisJaWYgKCBTRExfU1lTX0NEUGF1c2UoY2Ryb20pIDwgMCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBTcGVjaWZ5IHRoZSBBdWRpb0NEIHBsYXliYWNrIG1vZGUgKi8KKwlTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOworCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOworCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07CisJY2RwYi5jc0NvZGUgPSBrU2V0UGxheU1vZGU7CisJY2RwYi5jc1BhcmFtLmJ5dGVzWzBdID0gZmFsc2U7CQkJLyogUmVwZWF0PyAqLworCWNkcGIuY3NQYXJhbS5ieXRlc1sxXSA9IGtQbGF5TW9kZVNlcXVlbnRpYWw7CS8qIFBsYXkgbW9kZSAqLworCS8qIKWlpcpUcmVhdCBhcyBzb2Z0IGVycm9yLCBORUMgRHJpdmUgZG9lc250IHN1cHBvcnQgdGhpcyBjYWxsIKWlpSAqLworCVBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpICZjZHBiKTsKKworI2lmIDEKKwkvKiBTcGVjaWZ5IHRoZSBlbmQgb2YgYXVkaW8gcGxheWJhY2sgKi8KKwlTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOworCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOworCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07CisJY2RwYi5jc0NvZGUgPSBrQXVkaW9TdG9wOworCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IGtCbG9ja1Bvc2l0aW9uOwkJLyogUG9zaXRpb24gTW9kZSAqLworCSoobG9uZyAqKSAoY2RwYi5jc1BhcmFtLndvcmRzICsgMSkgPSBzdGFydCtsZW5ndGgtMTsgLyogU2VhcmNoIEFkZHJlc3MgKi8KKwlpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgeworCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBTcGVjaWZ5IHRoZSBzdGFydCBvZiBhdWRpbyBwbGF5YmFjaywgYW5kIHN0YXJ0IGl0ICovCisJU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKKwljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKKwljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOworCWNkcGIuY3NDb2RlID0ga0F1ZGlvUGxheTsKKwljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSBrQmxvY2tQb3NpdGlvbjsJCQkvKiBQb3NpdGlvbiBNb2RlICovCisJKihsb25nICopIChjZHBiLmNzUGFyYW0ud29yZHMgKyAxKSA9IHN0YXJ0KzE7CS8qIFNlYXJjaCBBZGRyZXNzICovCisJY2RwYi5jc1BhcmFtLndvcmRzWzNdID0gZmFsc2U7CQkJCQkvKiBTdG9wIGFkZHJlc3M/ICovCisJY2RwYi5jc1BhcmFtLndvcmRzWzRdID0ga1N0ZXJlb1BsYXlNb2RlOwkJLyogQXVkaW8gUGxheSBNb2RlICovCisJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKKwkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CisJCXJldHVybigtMSk7CisJfQorI2Vsc2UKKwkvKiBTcGVjaWZ5IHRoZSBlbmQgb2YgYXVkaW8gcGxheWJhY2sgKi8KKwlGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwgJm0sICZzLCAmZik7CisJU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKKwljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKKwljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOworCWNkcGIuY3NDb2RlID0ga0F1ZGlvU3RvcDsKKwljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSBrVHJhY2tQb3NpdGlvbjsJCQkvKiBQb3NpdGlvbiBNb2RlICovCisJY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMDsJCQkJCQkvKiBTZWFyY2ggQWRkcmVzcyAoaGl3b3JkKSovCisJY2RwYi5jc1BhcmFtLndvcmRzWzJdID0gCQkJCQkJLyogU2VhcmNoIEFkZHJlc3MgKGxvd29yZCkqLworCQkJU0RMX1NZU19TaG9ydFRvQkNEKGNkcm9tLT5udW10cmFja3MpOwkKKwlpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgeworCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBTcGVjaWZ5IHRoZSBzdGFydCBvZiBhdWRpbyBwbGF5YmFjaywgYW5kIHN0YXJ0IGl0ICovCisJRlJBTUVTX1RPX01TRihzdGFydCwgJm0sICZzLCAmZik7CisJU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKKwljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKKwljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOworCWNkcGIuY3NDb2RlID0ga0F1ZGlvUGxheTsKKwljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSBrVHJhY2tQb3NpdGlvbjsJCQkvKiBQb3NpdGlvbiBNb2RlICovCisJY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMDsJCQkJCQkvKiBTZWFyY2ggQWRkcmVzcyAoaGl3b3JkKSovCisJY2RwYi5jc1BhcmFtLndvcmRzWzJdID0gU0RMX1NZU19TaG9ydFRvQkNEKDEpOwkvKiBTZWFyY2ggQWRkcmVzcyAobG93b3JkKSovCisJY2RwYi5jc1BhcmFtLndvcmRzWzNdID0gZmFsc2U7CQkJCQkvKiBTdG9wIGFkZHJlc3M/ICovCisJY2RwYi5jc1BhcmFtLndvcmRzWzRdID0ga1N0ZXJlb1BsYXlNb2RlOwkJLyogQXVkaW8gUGxheSBNb2RlICovCisJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKKwkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CisJCXJldHVybigtMSk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4oMCk7Cit9CisKKy8qIFBhdXNlIHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pCit7CisJQ0RDbnRybFBhcmFtIGNkcGI7CisKKwlTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOworCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOworCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07CisJY2RwYi5jc0NvZGUgPSBrQXVkaW9QYXVzZTsKKwljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSAwOwkvKiBQYXVzZS9Db250aW51ZSBGbGFnIChoaXdvcmQpICovCisJY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMTsJLyogUGF1c2UvQ29udGludWUgRmxhZyAobG93b3JkKSAqLworCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7CisJCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOworCQlyZXR1cm4oLTEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qIFJlc3VtZSBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKK3sKKwlDRENudHJsUGFyYW0gY2RwYjsKKworCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7CisJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CisJY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKKwljZHBiLmNzQ29kZSA9IGtBdWRpb1BhdXNlOworCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IDA7CS8qIFBhdXNlL0NvbnRpbnVlIEZsYWcgKGhpd29yZCkgKi8KKwljZHBiLmNzUGFyYW0ud29yZHNbMV0gPSAwOwkvKiBQYXVzZS9Db250aW51ZSBGbGFnIChsb3dvcmQpICovCisJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKKwkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CisJCXJldHVybigtMSk7CisJfQorCXJldHVybigwKTsKK30KKworLyogU3RvcCBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pCit7CisJQ0RDbnRybFBhcmFtIGNkcGI7CisKKwlTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOworCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOworCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07CisJY2RwYi5jc0NvZGUgPSBrQXVkaW9TdG9wOworCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IDA7CQkvKiBQb3NpdGlvbiBNb2RlICovCisJY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMDsJCS8qIFNlYXJjaCBBZGRyZXNzIChoaXdvcmQpICovCisJY2RwYi5jc1BhcmFtLndvcmRzWzJdID0gMDsJCS8qIFNlYXJjaCBBZGRyZXNzIChsb3dvcmQpICovCisJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKKwkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CisJCXJldHVybigtMSk7CisJfQorCXJldHVybigwKTsKK30KKworLyogRWplY3QgdGhlIENELVJPTSAqLworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKKwlCb29sZWFuCWRpc2sgPSBmYWxzZTsKKwlRSGRyICpkcml2ZVEgPSBHZXREcnZRSGRyKCk7CisJRHJ2UUVsICpkcml2ZUVsZW07CisJSFBhcmFtQmxvY2tSZWMgaHBiOworCVBhcmFtQmxvY2tSZWMgY3BiOworCisJZm9yICggZHJpdmVFbGVtID0gKERydlFFbCAqKSBkcml2ZVEtPnFIZWFkOyBkcml2ZUVsZW07IGRyaXZlRWxlbSA9IAorCQkJICAoZHJpdmVFbGVtKSA/ICgoRHJ2UUVsICopIGRyaXZlRWxlbS0+cUxpbmspIDogCisJCQkgICgoRHJ2UUVsICopIGRyaXZlUS0+cUhlYWQpICkgeworCQlpZiAoIGRyaXZlUS0+cVRhaWwgKSB7CisJCQlkcml2ZVEtPnFUYWlsLT5xTGluayA9IDA7CisJCX0KKwkJaWYgKCBkcml2ZUVsZW0tPmRRUmVmTnVtICE9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtICkgeworCQkJY29udGludWU7CisJCX0KKwkKKwkJLyogRG9lcyBkcml2ZSBjb250YWluIG1vdW50ZWQgdm9sdW1lPyBJZiBub3QsIHNraXAgKi8KKwkJU0RMX21lbXNldCgmaHBiLCAwLCBzaXplb2YoaHBiKSk7CisJCWhwYi52b2x1bWVQYXJhbS5pb1ZSZWZOdW0gPSBkcml2ZUVsZW0tPmRRRHJpdmU7CisJCWlmICggUEJIR2V0VkluZm9TeW5jKCZocGIpICE9IG5vRXJyICkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCAoVW5tb3VudFZvbCgwLCBkcml2ZUVsZW0tPmRRRHJpdmUpID09IG5vRXJyKSAmJiAKKwkJICAgICAoRWplY3QoMCwgZHJpdmVFbGVtLT5kUURyaXZlKSA9PSBub0VycikgKSB7CisJCQlkcml2ZUVsZW0gPSAwOyAvKiBDbGVhciBwb2ludGVyIHRvIHJlc2V0IG91ciBsb29wICovCisJCQlkaXNrID0gdHJ1ZTsKKwkJfQorCX0KKworCS8qIElmIG5vIGRpc2sgaXMgcHJlc2VudCwganVzdCBlamVjdCB0aGUgdHJheSAqLworCWlmICghIGRpc2spIHsKKwkJU0RMX21lbXNldCgmY3BiLCAwLCBzaXplb2YoY3BiKSk7CisJCWNwYi5jbnRybFBhcmFtLmlvVlJlZk51bSA9IDA7IC8qIE5vIERyaXZlICovCisJCWNwYi5jbnRybFBhcmFtLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOworCQljcGIuY250cmxQYXJhbS5jc0NvZGUgPSBrRWplY3RUaGVEaXNjOworCQlpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNwYikgIT0gbm9FcnIgKSB7CisJCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisJcmV0dXJuKDApOworfQorCisvKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLworc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCit7CisJcmV0dXJuOworfQorCit2b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCit7CisJd2hpbGUoU0RMX251bWNkcy0tKSAKKwkJU0RMX21lbXNldChTRExfY2RsaXN0ICsgU0RMX251bWNkcywgMCwgc2l6ZW9mKFNETF9jZGxpc3RbMF0pKTsKK30KKworI2VuZGlmIC8qIFNETF9DRFJPTV9NQUNPUyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvcy9TRExfc3lzY2Ryb21fYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvcy9TRExfc3lzY2Ryb21fYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTVhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL21hY29zL1NETF9zeXNjZHJvbV9jLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaGlzIGlzIHRoZSBNYWNPUyBzcGVjaWZpYyBoZWFkZXIgZm9yIHRoZSBTREwgQ0QtUk9NIEFQSQorICAgQ29udHJpYnV0ZWQgYnkgTWF0dCBTbG90CisgKi8KKworLyogQXBwbGVDRCBDb250cm9sIGNhbGxzICovCisjZGVmaW5lIGtWZXJpZnlUaGVEaXNjICAgCSAgNQkJLyogUmV0dXJucyBub0VyciBpZiB0aGVyZSBpcyBkaXNjIGluc2VydGVkICovCisjZGVmaW5lIGtFamVjdFRoZURpc2MgICAJICA3CQkvKiBFamVjdCBkaXNjIGZyb20gZHJpdmUgKi8KKyNkZWZpbmUga1VzZXJFamVjdCAgICAJCSA4MAkJLyogRW5hYmxlL2Rpc2FibGUgdGhlIENELVJPTSBlamVjdCBidXR0b24gKi8KKyNkZWZpbmUga1JlYWRUT0MgICAgCQkxMDAJCS8qIEV4dHJhY3QgdmFyaW91cyBUT0MgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGlzYyAqLworI2RlZmluZSBrUmVhZFEgICAJCQkxMDEJCS8qIEV4dHJhY3QgUSBzdWJjb2RlIGluZm8gZm9yIHRoZSBjdXJyZW50IHRyYWNrICovCisjZGVmaW5lIGtBdWRpb1RyYWNrU2VhcmNoICAgMTAzCQkvKiBTdGFydCBwbGF5YmFjayBmcm9tIHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gKi8KKyNkZWZpbmUga0F1ZGlvUGxheSAgICAJCTEwNAkJLyogU3RhcnQgcGxheWJhY2sgZnJvbSB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uICovCisjZGVmaW5lIGtBdWRpb1BhdXNlICAgIAkJMTA1CQkvKiBQYXVzZS9jb250aW51ZSB0aGUgcGxheWJhY2sgKi8KKyNkZWZpbmUga0F1ZGlvU3RvcCAgICAJCTEwNgkJLyogU3RvcCBwbGF5YmFjayBhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uICovCisjZGVmaW5lIGtBdWRpb1N0YXR1cyAgICAJMTA3CQkvKiBSZXR1cm4gYXVkaW8gcGxheSBzdGF0dXMgKi8KKyNkZWZpbmUga0F1ZGlvQ29udHJvbCAgICAJMTA5CQkvKiBTZXQgdGhlIG91dHB1dCB2b2x1bWUgZm9yIHRoZSBhdWRpbyBjaGFubmVscyAqLworI2RlZmluZSBrUmVhZEF1ZGlvVm9sdW1lICAgCTExMgkJLyogR2V0IHRoZSBvdXRwdXQgdm9sdW1lIGZvciB0aGUgYXVkaW8gY2hhbm5lbHMgKi8KKyNkZWZpbmUga1NldFRyYWNrTGlzdCAgIAkxMjIJCS8qIFNldCB0aGUgdHJhY2sgcHJvZ3JhbSBmb3IgdGhlIGF1ZGlvIENEIHRvIHBsYXkgKi8KKyNkZWZpbmUga0dldFRyYWNrTGlzdCAgIAkxMjMJCS8qIEdldCB0aGUgdHJhY2sgcHJvZ3JhbSB0aGUgYXVkaW8gQ0QgaXMgcGxheWluZyAqLworI2RlZmluZSBrR2V0VHJhY2tJbmRleCAgIAkxMjQJCS8qIEdldCB0aGUgdHJhY2sgaW5kZXggdGhlIGF1ZGlvIENEIGlzIHBsYXlpbmcgKi8KKyNkZWZpbmUga1NldFBsYXlNb2RlICAgCQkxMjUJCS8qIFNldCB0aGUgYXVkaW8gdHJhY2tzIHBsYXkgbW9kZSAqLworI2RlZmluZSBrR2V0UGxheU1vZGUgICAJCTEyNgkJLyogR2V0IHRoZSBhdWRpbyB0cmFja3MgcGxheSBtb2RlICovCisKKy8qIEFwcGxlQ0QgU3RhdHVzIGNhbGxzICovCisjZGVmaW5lIGtHZXREcml2ZVR5cGUgICAJIDk2CQkvKiBHZXQgdGhlIHR5cGUgb2YgdGhlIHBoeXNpY2FsIENELVJPTSBkcml2ZSAqLworI2RlZmluZSBrV2hvSXNUaGVyZSAgICAJCSA5NwkJLyogR2V0IGEgYml0bWFwIG9mIFNDU0kgSURzIHRoZSBkcml2ZXIgY29udHJvbHMgKi8KKyNkZWZpbmUga0dldEJsb2NrU2l6ZSAgICAJIDk4CQkvKiBHZXQgY3VycmVudCBibG9jayBzaXplIG9mIHRoZSBDRC1ST00gZHJpdmUgKi8KKwkKKy8qIEFwcGxlQ0Qgb3RoZXIgY29uc3RhbnRzICovCisjZGVmaW5lIGtCbG9ja1Bvc2l0aW9uICAgIAkgIDAJCS8qIFBvc2l0aW9uIGF0IHRoZSBzcGVjaWZpZWQgbG9naWNhbCBibG9jayBudW1iZXIgKi8KKyNkZWZpbmUga0Fic01TRlBvc2l0aW9uICAgIAkgIDEJCS8qIFBvc2l0aW9uIGF0IHRoZSBzcGVjaWZpZWQgTWluL1NlYy9GcmFtZSAoaW4gQkNEKSAqLworI2RlZmluZSBrVHJhY2tQb3NpdGlvbiAgICAJICAyCQkvKiBQb3NpdGlvbiBhdCB0aGUgc3BlY2lmaWVkIHRyYWNrIG51bWJlciAoaW4gQkNEKSAqLworI2RlZmluZSBrSW5kZXhQb3NpdGlvbiAgICAJICAzCQkvKiBQb3NpdGlvbiBhdCB0aGUgbnRoIHRyYWNrIGluIHByb2dyYW0gKGluIEJDRCkgKi8KKworI2RlZmluZSBrTXV0ZWRQbGF5TW9kZSAgIAkgIDAJCS8qIFBsYXkgdGhlIGF1ZGlvIHRyYWNrIHdpdGggbm8gb3V0cHV0ICovCisjZGVmaW5lIGtTdGVyZW9QbGF5TW9kZSAgIAkgIDkJCS8qIFBsYXkgdGhlIGF1ZGlvIHRyYWNrIGluIG5vcm1hbCBzdGVyZW8gKi8KKworI2RlZmluZSBrQ29udHJvbEZpZWxkTWFzayAgCTB4MEQJLyogQml0cyAzLDIsMCBpbiB0aGUgbmliYmxlICovCisjZGVmaW5lIGtEYXRhVHJhY2tNYXNrICAgCTB4MDQJLyogSW5kaWNhdGVzIERhdGEgVHJhY2sgKi8KKworI2RlZmluZSBrR2V0VHJhY2tSYW5nZSAgICAJICAxCQkvKiBRdWVyeSBUT0MgZm9yIHRyYWNrIG51bWJlcnMgKi8KKyNkZWZpbmUga0dldExlYWRPdXRBcmVhICAgIAkgIDIJCS8qIFF1ZXJ5IFRPQyBmb3IgIkxlYWQgT3V0IiBlbmQgb2YgYXVkaW8gZGF0YSAqLworI2RlZmluZSBrR2V0VHJhY2tFbnRyaWVzICAgCSAgMwkJLyogUXVlcnkgVE9DIGZvciB0cmFjayBzdGFydHMgYW5kIGRhdGEgdHlwZXMgKi8KKworI2RlZmluZSBrU3RhdHVzUGxheWluZwkJICAwCQkvKiBBdWRpbyBQbGF5IG9wZXJhdGlvbiBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBrU3RhdHVzUGF1c2VkCQkgIDEJCS8qIENELVJPTSBkZXZpY2UgaW4gSG9sZCBUcmFjayAoIlBhdXNlIikgc3RhdGUgKi8KKyNkZWZpbmUga1N0YXR1c011dGVkCQkgIDIJCS8qIE1VVElORy1PTiBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUga1N0YXR1c0RvbmUJCQkgIDMJCS8qIEF1ZGlvIFBsYXkgY29tcGxldGVkICovCisjZGVmaW5lIGtTdGF0dXNFcnJvcgkJICA0CQkvKiBFcnJvciBvY2N1cnJlZCBkdXJpbmcgYXVkaW8gcGxheSBvcGVyYXRpb24gKi8KKyNkZWZpbmUga1N0YXR1c1N0b3BwZWQJCSAgNQkJLyogQXVkaW8gcGxheSBvcGVyYXRpb24gbm90IHJlcXVlc3RlZCAqLworCisjZGVmaW5lIGtQbGF5TW9kZVNlcXVlbnRpYWwJICAwCQkvKiAgUGxheSB0cmFja3MgaW4gb3JkZXIgKi8KKyNkZWZpbmUga1BsYXlNb2RlU2h1ZmZsZWQJICAxCQkvKiBQbGF5IHRyYWNrcyByYW5kb21seSAqLworI2RlZmluZSBrUGxheU1vZGVQcm9ncmFtbWVkICAgMgkJLyogVXNlIGN1c3RvbSBwbGF5bGlzdCAqLworCisvKiBBcHBsZUNEIEdlc3RhbHQgc2VsZWN0b3JzICovCisjZGVmaW5lIGtHZXN0YWx0QXVkaW9DRFNlbGVjdG9yICAgICdhdWNkJworI2RlZmluZSBrRHJpdmVyVmVyc2lvbjUyICAgCQkweDAwMDAwNTIwCisjZGVmaW5lIGtEcml2ZXJWZXJzaW9uNTEgICAJCTB4MDAwMDA1MTAKKyNkZWZpbmUga0RyaXZlclZlcnNpb241MCAgIAkJMHgwMDAwMDUwMAorCisvKiBEcml2ZSB0eXBlIGNvbnN0YW50cyAqLworI2RlZmluZSBrRHJpdmVBcHBsZUNEX1NDICAgCQkJCSAgMQorI2RlZmluZSBrRHJpdmVBcHBsZUNEX1NDUGx1c19vcl8xNTAgICAJICAyCisjZGVmaW5lIGtEcml2ZUFwcGxlQ0RfMzAwX29yXzMwMFBsdXMgICAJICAzCisKKy8qIE1pc2MgY29uc3RhbnRzICovCisjZGVmaW5lIGtGaXJzdFNDU0lEZXZpY2UgICAJIC0zMworI2RlZmluZSBrTGFzdFNDU0lEZXZpY2UgICAgCSAtNDAKKworI2lmIFBSQUdNQV9TVFJVQ1RfQUxJR04KKwkjcHJhZ21hIG9wdGlvbnMgYWxpZ249bWFjNjhrCisjZW5kaWYKKworLyogQXBwbGVDRCBkcml2ZXIgcGFyYW1ldGVyIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBDRENudHJsUGFyYW0geworCVFFbGVtUHRyCQkJCXFMaW5rOworCXNob3J0CQkJCQlxVHlwZTsKKwlzaG9ydAkJCQkJaW9UcmFwOworCVB0cgkJCQkJCWlvQ21kQWRkcjsKKwlJT0NvbXBsZXRpb25VUFAJCQlpb0NvbXBsZXRpb247CisJT1NFcnIJCQkJCWlvUmVzdWx0OworCVN0cmluZ1B0cgkJCQlpb05hbWVQdHI7CisJc2hvcnQJCQkJCWlvVlJlZk51bTsKKwlzaG9ydAkJCQkJaW9DUmVmTnVtOworCXNob3J0CQkJCQljc0NvZGU7CisJCisJdW5pb24geworCQlsb25nCQkJCWxvbmdzWzZdOworCQlzaG9ydAkJCQl3b3Jkc1sxMV07CisJCXVuc2lnbmVkIGNoYXIJCWJ5dGVzWzIyXTsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGNoYXIJc3RhdHVzOworCQkJdW5zaWduZWQgY2hhcglwbGF5OworCQkJdW5zaWduZWQgY2hhcgljb250cm9sOworCQkJdW5zaWduZWQgY2hhcgltaW51dGU7CisJCQl1bnNpZ25lZCBjaGFyCXNlY29uZDsKKwkJCXVuc2lnbmVkIGNoYXIJZnJhbWU7CisJCQl9IGNkOworCQl9IGNzUGFyYW07CisKKwl9IENEQ250cmxQYXJhbSwgKkNEQ250cmxQYXJhbVB0cjsKKwordHlwZWRlZiB1bmlvbiBDRFRyYWNrRGF0YSB7CisJbG9uZwkJCQl2YWx1ZTsJCQkvKiBUcmVhdCBhcyBhIGxvbmd3b3JkIHZhbHVlICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhcglyZXNlcnZlZCA6IDQ7CS8qIFVudXNlZCBieSBBcHBsZUNEIGRyaXZlciAgKi8KKwkJdW5zaWduZWQgY2hhcgljb250cm9sIDogNDsJLyogVHJhY2sgZmxhZ3MgKGRhdGEgdHJhY2s/KSAqLworCQl1bnNpZ25lZCBjaGFyCW1pbjsJCQkvKiBTdGFydCBvZiB0cmFjayAoQkNEKSAgICAgICovCisJCXVuc2lnbmVkIGNoYXIJc2VjOwkJCS8qIFN0YXJ0IG9mIHRyYWNrIChCQ0QpICAgICAgKi8KKwkJdW5zaWduZWQgY2hhcglmcmFtZTsJCQkvKiBTdGFydCBvZiB0cmFjayAoQkNEKSAgICAgICovCisJCX0gZW50cnk7CQkJCQkJLyogQnJva2VuIGludG8gZmllbGRzICAgICAgICAqLworCX0gQ0RUcmFja0RhdGEsICpDRFRyYWNrUHRyOworCQorI2lmIFBSQUdNQV9TVFJVQ1RfQUxJR04KKwkjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvQXVkaW9GaWxlUGxheWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL21hY29zeC9BdWRpb0ZpbGVQbGF5ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2NiOWIyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvQXVkaW9GaWxlUGxheWVyLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKworICAgIFRoaXMgZmlsZSBiYXNlZCBvbiBBcHBsZSBzYW1wbGUgY29kZS4gV2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBmaWxlIG5hbWUsIAorICAgIHNvIGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBpdCBvbiBhcHBsZS5jb20vZGV2ZWxvcGVyCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKyNpbmNsdWRlICJTRExfZW5kaWFuLmgiCisKKy8qfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgICAgQXVkaW9GaWxlUGxheWVyLmNwcAorKi8KKyNpbmNsdWRlICJBdWRpb0ZpbGVQbGF5ZXIuaCIKKworLyoKK3ZvaWQgVGhyb3dSZXN1bHQgKE9TU3RhdHVzIHJlc3VsdCwgY29uc3QgY2hhciogc3RyKQoreworICAgIFNETF9TZXRFcnJvciAoIkVycm9yOiAlcyAlZCIsIHN0ciwgcmVzdWx0KTsKKyAgICB0aHJvdyByZXN1bHQ7Cit9CisqLworCisjaWYgREVCVUcKK3N0YXRpYyB2b2lkIFByaW50U3RyZWFtRGVzYyAoQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uICppbkRlc2MpCit7CisgICAgaWYgKCFpbkRlc2MpIHsKKyAgICAgICAgcHJpbnRmICgiQ2FuJ3QgcHJpbnQgYSBOVUxMIGRlc2MhXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBwcmludGYgKCItIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC1cbiIpOworICAgIHByaW50ZiAoIiAgU2FtcGxlIFJhdGU6JWZcbiIsIGluRGVzYy0+bVNhbXBsZVJhdGUpOworICAgIHByaW50ZiAoIiAgRm9ybWF0IElEOiVzXG4iLCAoY2hhciopJmluRGVzYy0+bUZvcm1hdElEKTsKKyAgICBwcmludGYgKCIgIEZvcm1hdCBGbGFnczolbFhcbiIsIGluRGVzYy0+bUZvcm1hdEZsYWdzKTsKKyAgICBwcmludGYgKCIgIEJ5dGVzIHBlciBQYWNrZXQ6JWxkXG4iLCBpbkRlc2MtPm1CeXRlc1BlclBhY2tldCk7CisgICAgcHJpbnRmICgiICBGcmFtZXMgcGVyIFBhY2tldDolbGRcbiIsIGluRGVzYy0+bUZyYW1lc1BlclBhY2tldCk7CisgICAgcHJpbnRmICgiICBCeXRlcyBwZXIgRnJhbWU6JWxkXG4iLCBpbkRlc2MtPm1CeXRlc1BlckZyYW1lKTsKKyAgICBwcmludGYgKCIgIENoYW5uZWxzIHBlciBGcmFtZTolbGRcbiIsIGluRGVzYy0+bUNoYW5uZWxzUGVyRnJhbWUpOworICAgIHByaW50ZiAoIiAgQml0cyBwZXIgQ2hhbm5lbDolbGRcbiIsIGluRGVzYy0+bUJpdHNQZXJDaGFubmVsKTsKKyAgICBwcmludGYgKCItIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC1cbiIpOworfQorI2VuZGlmCisKKworc3RhdGljIGludCBBdWRpb0ZpbGVQbGF5ZXJfU2V0RGVzdGluYXRpb24gKEF1ZGlvRmlsZVBsYXllciAqYWZwLCBBdWRpb1VuaXQgICppbkRlc3RVbml0KQoreworICAgIC8qaWYgKGFmcC0+bUNvbm5lY3RlZCkgdGhyb3cgc3RhdGljX2Nhc3Q8T1NTdGF0dXM+KC0xKTsqLyAvKiBjYW4ndCBzZXQgZGVzdCBpZiBhbHJlYWR5IGVuZ2FnZWQgKi8KKyAgICBpZiAoYWZwLT5tQ29ubmVjdGVkKQorICAgICAgICByZXR1cm4gMCA7CisKKyAgICBTRExfbWVtY3B5KCZhZnAtPm1QbGF5VW5pdCwgaW5EZXN0VW5pdCwgc2l6ZW9mIChhZnAtPm1QbGF5VW5pdCkpOworCisgICAgT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7CisgICAgCisKKyAgICAgICAgLyogd2UgY2FuICJkb3duIiBjYXN0IGEgY29tcG9uZW50IGluc3RhbmNlIHRvIGEgY29tcG9uZW50ICovCisgICAgQ29tcG9uZW50RGVzY3JpcHRpb24gZGVzYzsKKyAgICByZXN1bHQgPSBHZXRDb21wb25lbnRJbmZvICgoQ29tcG9uZW50KSppbkRlc3RVbml0LCAmZGVzYywgMCwgMCwgMCk7CisgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJHZXRDb21wb25lbnRJbmZvIikqLworICAgICAgICAKKyAgICAgICAgLyogd2UncmUgZ29pbmcgdG8gdXNlIHRoaXMgdG8ga25vdyB3aGljaCBjb252ZXJ0IHJvdXRpbmUgdG8gY2FsbAorICAgICAgICAgICBhIHYxIGF1ZGlvIHVuaXQgd2lsbCBoYXZlIGEgdHlwZSBvZiAnYXVudCcKKyAgICAgICAgICAgYSB2MiBhdWRpbyB1bml0IHdpbGwgaGF2ZSBvbmUgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgdHlwZXMuICovCisgICAgaWYgKGRlc2MuY29tcG9uZW50VHlwZSAhPSBrQXVkaW9Vbml0VHlwZV9PdXRwdXQpIHsKKyAgICAgICAgcmVzdWx0ID0gYmFkQ29tcG9uZW50SW5zdGFuY2U7CisgICAgICAgIC8qVEhST1dfUkVTVUxUKCJCQUQgQ09NUE9ORU5UIikqLworICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIGlucHV0IGZvcm1hdCBvZiB0aGUgYXVkaW8gdW5pdC4gKi8KKyAgICByZXN1bHQgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSAoKmluRGVzdFVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0U2NvcGVfSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZwLT5tRmlsZURlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoYWZwLT5tRmlsZURlc2NyaXB0aW9uKSk7CisgICAgICAgIC8qVEhST1dfUkVTVUxUKCJBdWRpb1VuaXRTZXRQcm9wZXJ0eSIpKi8KKyAgICBpZiAocmVzdWx0KSByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQXVkaW9GaWxlUGxheWVyX1NldE5vdGlmaWVyKEF1ZGlvRmlsZVBsYXllciAqYWZwLCBBdWRpb0ZpbGVQbGF5Tm90aWZpZXIgaW5Ob3RpZmllciwgdm9pZCAqaW5SZWZDb24pCit7CisgICAgYWZwLT5tTm90aWZpZXIgPSBpbk5vdGlmaWVyOworICAgIGFmcC0+bVJlZkNvbiA9IGluUmVmQ29uOworfQorCitzdGF0aWMgaW50IEF1ZGlvRmlsZVBsYXllcl9Jc0Nvbm5lY3RlZChBdWRpb0ZpbGVQbGF5ZXIgKmFmcCkKK3sKKyAgICByZXR1cm4gYWZwLT5tQ29ubmVjdGVkOworfQorCitzdGF0aWMgQXVkaW9Vbml0IEF1ZGlvRmlsZVBsYXllcl9HZXREZXN0VW5pdChBdWRpb0ZpbGVQbGF5ZXIgKmFmcCkKK3sKKyAgIHJldHVybiBhZnAtPm1QbGF5VW5pdDsKK30KKworc3RhdGljIHZvaWQgQXVkaW9GaWxlUGxheWVyX1ByaW50KEF1ZGlvRmlsZVBsYXllciAqYWZwKQoreworI2lmIERFQlVHICAgIAorICAgIHByaW50ZiAoIklzIENvbm5lY3RlZDolc1xuIiwgKElzQ29ubmVjdGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7CisgICAgcHJpbnRmICgiLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIFxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgICAgQXVkaW9GaWxlUGxheWVyX1NldFN0YXJ0RnJhbWUgKEF1ZGlvRmlsZVBsYXllciAqYWZwLCBpbnQgZnJhbWUpCit7CisgICAgU0ludDY0IHBvc2l0aW9uID0gZnJhbWUgKiAyMzUyOworCisgICAgYWZwLT5tU3RhcnRGcmFtZSA9IGZyYW1lOworICAgIGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXItPlNldFBvc2l0aW9uIChhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyLCBwb3NpdGlvbik7Cit9CisKKyAgICAKK3N0YXRpYyBpbnQgICAgQXVkaW9GaWxlUGxheWVyX0dldEN1cnJlbnRGcmFtZSAoQXVkaW9GaWxlUGxheWVyICphZnApCit7CisgICAgcmV0dXJuIGFmcC0+bVN0YXJ0RnJhbWUgKyAoYWZwLT5tQXVkaW9GaWxlTWFuYWdlci0+R2V0Qnl0ZUNvdW50ZXIoYWZwLT5tQXVkaW9GaWxlTWFuYWdlcikgLyAyMzUyKTsKK30KKyAgICAKK3N0YXRpYyB2b2lkICAgIEF1ZGlvRmlsZVBsYXllcl9TZXRTdG9wRnJhbWUgKEF1ZGlvRmlsZVBsYXllciAqYWZwLCBpbnQgZnJhbWUpCit7CisgICAgU0ludDY0IHBvc2l0aW9uICA9IGZyYW1lICogMjM1MjsKKyAgICAKKyAgICBhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyLT5TZXRFbmRPZkZpbGUgKGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXIsIHBvc2l0aW9uKTsKK30KKyAgICAKK3ZvaWQgZGVsZXRlX0F1ZGlvRmlsZVBsYXllcihBdWRpb0ZpbGVQbGF5ZXIgKmFmcCkKK3sKKyAgICBpZiAoYWZwICE9IE5VTEwpCisgICAgeworICAgICAgICBhZnAtPkRpc2Nvbm5lY3QoYWZwKTsKKyAgICAgICAgCisgICAgICAgIGlmIChhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyKSB7CisgICAgICAgICAgICBkZWxldGVfQXVkaW9GaWxlTWFuYWdlcihhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyKTsKKyAgICAgICAgICAgIGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXIgPSAwOworICAgICAgICB9CisgICAgCisgICAgICAgIGlmIChhZnAtPm1Gb3JrUmVmTnVtKSB7CisgICAgICAgICAgICBGU0Nsb3NlRm9yayAoYWZwLT5tRm9ya1JlZk51bSk7CisgICAgICAgICAgICBhZnAtPm1Gb3JrUmVmTnVtID0gMDsKKyAgICAgICAgfQorICAgICAgICBTRExfZnJlZShhZnApOworICAgIH0KK30KKworc3RhdGljIGludCAgICBBdWRpb0ZpbGVQbGF5ZXJfQ29ubmVjdChBdWRpb0ZpbGVQbGF5ZXIgKmFmcCkKK3sKKyNpZiBERUJVRworICAgIHByaW50ZiAoIkNvbm5lY3Q6JXgsIGVuZ2FnZWQ9JWRcbiIsIChpbnQpYWZwLT5tUGxheVVuaXQsIChhZnAtPm1Db25uZWN0ZWQgPyAxIDogMCkpOworI2VuZGlmCisgICAgaWYgKCFhZnAtPm1Db25uZWN0ZWQpCisgICAgeyAgICAgICAgICAgCisgICAgICAgIGlmICghYWZwLT5tQXVkaW9GaWxlTWFuYWdlci0+RG9Db25uZWN0KGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXIpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyogc2V0IHRoZSByZW5kZXIgY2FsbGJhY2sgZm9yIHRoZSBmaWxlIGRhdGEgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIHNvdW5kIGNvbnZlcnRlciBBVSAqLworICAgICAgICBhZnAtPm1JbnB1dENhbGxiYWNrLmlucHV0UHJvYyA9IGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXItPkZpbGVJbnB1dFByb2M7CisgICAgICAgIGFmcC0+bUlucHV0Q2FsbGJhY2suaW5wdXRQcm9jUmVmQ29uID0gYWZwLT5tQXVkaW9GaWxlTWFuYWdlcjsKKworICAgICAgICBPU1N0YXR1cyByZXN1bHQgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSAoYWZwLT5tUGxheVVuaXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9TZXRSZW5kZXJDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0U2NvcGVfSW5wdXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmcC0+bUlucHV0Q2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhZnAtPm1JbnB1dENhbGxiYWNrKSk7CisgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAgLypUSFJPV19SRVNVTFQoIkF1ZGlvVW5pdFNldFByb3BlcnR5IikqLworICAgICAgICBhZnAtPm1Db25uZWN0ZWQgPSAxOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisvKiB3YXJuaW5nIG5vdGVkLCBub3cgcGxlYXNlIGdvIGF3YXkgOy0pICovCisvKiAjd2FybmluZyBUaGlzIHNob3VsZCByZWRpcmVjdCB0aGUgY2FsbGluZyBvZiBub3RpZmljYXRpb24gY29kZSB0byBzb21lIG90aGVyIHRocmVhZCAqLworc3RhdGljIHZvaWQgICAgQXVkaW9GaWxlUGxheWVyX0RvTm90aWZpY2F0aW9uIChBdWRpb0ZpbGVQbGF5ZXIgKmFmcCwgT1NTdGF0dXMgaW5TdGF0dXMpCit7CisgICAgaWYgKGFmcC0+bU5vdGlmaWVyKSB7CisgICAgICAgICgqYWZwLT5tTm90aWZpZXIpIChhZnAtPm1SZWZDb24sIGluU3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTRExfU2V0RXJyb3IgKCJOb3RpZmljYXRpb24gcG9zdGVkIHdpdGggbm8gbm90aWZpZXIgaW4gcGxhY2UiKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpblN0YXR1cyA9PSBrQXVkaW9GaWxlUGxheV9GaWxlSXNGaW5pc2hlZCkKKyAgICAgICAgICAgIGFmcC0+RGlzY29ubmVjdChhZnApOworICAgICAgICBlbHNlIGlmIChpblN0YXR1cyAhPSBrQXVkaW9GaWxlUGxheUVycl9GaWxlUGxheVVuZGVycnVuKQorICAgICAgICAgICAgYWZwLT5EaXNjb25uZWN0KGFmcCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCAgICBBdWRpb0ZpbGVQbGF5ZXJfRGlzY29ubmVjdCAoQXVkaW9GaWxlUGxheWVyICphZnApCit7CisjaWYgREVCVUcKKyAgICBwcmludGYgKCJEaXNjb25uZWN0OiV4LCVsZCwgZW5nYWdlZD0lZFxuIiwgKGludClhZnAtPm1QbGF5VW5pdCwgMCwgKGFmcC0+bUNvbm5lY3RlZCA/IDEgOiAwKSk7CisjZW5kaWYKKyAgICBpZiAoYWZwLT5tQ29ubmVjdGVkKQorICAgIHsKKyAgICAgICAgYWZwLT5tQ29ubmVjdGVkID0gMDsKKyAgICAgICAgICAgIAorICAgICAgICBhZnAtPm1JbnB1dENhbGxiYWNrLmlucHV0UHJvYyA9IDA7CisgICAgICAgIGFmcC0+bUlucHV0Q2FsbGJhY2suaW5wdXRQcm9jUmVmQ29uID0gMDsKKyAgICAgICAgT1NTdGF0dXMgcmVzdWx0ID0gQXVkaW9Vbml0U2V0UHJvcGVydHkgKGFmcC0+bVBsYXlVbml0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU2V0UmVuZGVyQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvVW5pdFNjb3BlX0lucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZnAtPm1JbnB1dENhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYWZwLT5tSW5wdXRDYWxsYmFjaykpOworICAgICAgICBpZiAocmVzdWx0KSAKKyAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIkF1ZGlvVW5pdFNldFByb3BlcnR5OlJlbW92ZUlucHV0Q2FsbGJhY2s6JWxkIiwgcmVzdWx0KTsKKworICAgICAgICBhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyLT5EaXNjb25uZWN0KGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXIpOworICAgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJbnQzMiBvZmZzZXQ7CisgICAgVUludDMyIGJsb2NrU2l6ZTsKK30gU1NORERhdGE7CisKK3N0YXRpYyBpbnQgICAgQXVkaW9GaWxlUGxheWVyX09wZW5GaWxlIChBdWRpb0ZpbGVQbGF5ZXIgKmFmcCwgY29uc3QgRlNSZWYgKmluUmVmLCBTSW50NjQgKm91dEZpbGVEYXRhU2l6ZSkKK3sKKyAgICBDb250YWluZXJDaHVuayBjaHVua0hlYWRlcjsKKyAgICBDaHVua0hlYWRlciBjaHVuazsKKyAgICBTU05ERGF0YSBzc25kRGF0YTsKKworICAgIE9TRXJyIHJlc3VsdDsKKyAgICBIRlNVbmlTdHIyNTUgZGZOYW1lOworICAgIEJ5dGVDb3VudCBhY3R1YWw7CisgICAgU0ludDY0IG9mZnNldDsKKworICAgIC8qIE9wZW4gdGhlIGRhdGEgZm9yayBvZiB0aGUgaW5wdXQgZmlsZSAqLworICAgIHJlc3VsdCA9IEZTR2V0RGF0YUZvcmtOYW1lKCZkZk5hbWUpOworICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgiQXVkaW9GaWxlUGxheWVyOjpPcGVuRmlsZSgpOiBGU0dldERhdGFGb3JrTmFtZSIpKi8KKworICAgIHJlc3VsdCA9IEZTT3BlbkZvcmsoaW5SZWYsIGRmTmFtZS5sZW5ndGgsIGRmTmFtZS51bmljb2RlLCBmc1JkUGVybSwgJmFmcC0+bUZvcmtSZWZOdW0pOworICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgiQXVkaW9GaWxlUGxheWVyOjpPcGVuRmlsZSgpOiBGU09wZW5Gb3JrIikqLworIAorICAgIC8qIFJlYWQgdGhlIGZpbGUgaGVhZGVyLCBhbmQgY2hlY2sgaWYgaXQncyBpbmRlZWQgYW4gQUlGQyBmaWxlICovCisgICAgcmVzdWx0ID0gRlNSZWFkRm9yayhhZnAtPm1Gb3JrUmVmTnVtLCBmc0F0TWFyaywgMCwgc2l6ZW9mKGNodW5rSGVhZGVyKSwgJmNodW5rSGVhZGVyLCAmYWN0dWFsKTsKKyAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gMDsgLypUSFJPV19SRVNVTFQoIkF1ZGlvRmlsZVBsYXllcjo6T3BlbkZpbGUoKTogRlNSZWFkRm9yayIpKi8KKworICAgIGlmIChTRExfU3dhcEJFMzIoY2h1bmtIZWFkZXIuY2tJRCkgIT0gJ0ZPUk0nKSB7CisgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gMDsgLypUSFJPV19SRVNVTFQoIkF1ZGlvRmlsZVBsYXllcjo6T3BlbkZpbGUoKTogY2h1bmsgaWQgaXMgbm90ICdGT1JNJyIpOyovCisgICAgfQorCisgICAgaWYgKFNETF9Td2FwQkUzMihjaHVua0hlYWRlci5mb3JtVHlwZSkgIT0gJ0FJRkMnKSB7CisgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gMDsgLypUSFJPV19SRVNVTFQoIkF1ZGlvRmlsZVBsYXllcjo6T3BlbkZpbGUoKTogZmlsZSBmb3JtYXQgaXMgbm90ICdBSUZDJyIpOyovCisgICAgfQorCisgICAgLyogU2VhcmNoIGZvciB0aGUgU1NORCBjaHVuay4gV2UgaWdub3JlIGFsbCBjb21wcmVzc2lvbiBldGMuIGluZm9ybWF0aW9uCisgICAgICAgaW4gb3RoZXIgY2h1bmtzLiBPZiBjb3Vyc2UgdGhhdCBpcyBraW5kIG9mIGV2aWwsIGJ1dCBmb3Igbm93IHdlIGFyZSBsYXp5CisgICAgICAgYW5kIHJlbHkgb24gdGhlIGNkZnMgdG8gYWx3YXlzIGdpdmUgdXMgdGhlIHNhbWUgZml4ZWQgZm9ybWF0LgorICAgICAgIFRPRE86IFBhcnNlIHRoZSBDT01NIGNodW5rIHdlIGN1cnJlbnRseSBza2lwIHRvIGZpbGwgaW4gbUZpbGVEZXNjcmlwdGlvbi4KKyAgICAqLworICAgIG9mZnNldCA9IDA7CisgICAgZG8geworICAgICAgICByZXN1bHQgPSBGU1JlYWRGb3JrKGFmcC0+bUZvcmtSZWZOdW0sIGZzRnJvbU1hcmssIG9mZnNldCwgc2l6ZW9mKGNodW5rKSwgJmNodW5rLCAmYWN0dWFsKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJBdWRpb0ZpbGVQbGF5ZXI6Ok9wZW5GaWxlKCk6IEZTUmVhZEZvcmsiKSovCisKKyAgICAgICAgY2h1bmsuY2tJRCA9IFNETF9Td2FwQkUzMihjaHVuay5ja0lEKTsKKyAgICAgICAgY2h1bmsuY2tTaXplID0gU0RMX1N3YXBCRTMyKGNodW5rLmNrU2l6ZSk7CisKKyAgICAgICAgLyogU2tpcCB0aGUgY2h1bmsgZGF0YSAqLworICAgICAgICBvZmZzZXQgPSBjaHVuay5ja1NpemU7CisgICAgfSB3aGlsZSAoY2h1bmsuY2tJRCAhPSAnU1NORCcpOworCisgICAgLyogUmVhZCB0aGUgaGVhZGVyIG9mIHRoZSBTU05EIGNodW5rLiBBZnRlciB0aGlzLCB3ZSBhcmUgcG9zaXRpb25lZCByaWdodAorICAgICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgYXVkaW8gZGF0YS4gKi8KKyAgICByZXN1bHQgPSBGU1JlYWRGb3JrKGFmcC0+bUZvcmtSZWZOdW0sIGZzQXRNYXJrLCAwLCBzaXplb2Yoc3NuZERhdGEpLCAmc3NuZERhdGEsICZhY3R1YWwpOworICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgiQXVkaW9GaWxlUGxheWVyOjpPcGVuRmlsZSgpOiBGU1JlYWRGb3JrIikqLworCisgICAgc3NuZERhdGEub2Zmc2V0ID0gU0RMX1N3YXBCRTMyKHNzbmREYXRhLm9mZnNldCk7CisKKyAgICByZXN1bHQgPSBGU1NldEZvcmtQb3NpdGlvbihhZnAtPm1Gb3JrUmVmTnVtLCBmc0Zyb21NYXJrLCBzc25kRGF0YS5vZmZzZXQpOworICAgIGlmIChyZXN1bHQpIHJldHVybiAwOyAvKlRIUk9XX1JFU1VMVCgiQXVkaW9GaWxlUGxheWVyOjpPcGVuRmlsZSgpOiBGU1NldEZvcmtQb3NpdGlvbiIpKi8KKworICAgIC8qIERhdGEgc2l6ZSAqLworICAgICpvdXRGaWxlRGF0YVNpemUgPSBjaHVuay5ja1NpemUgLSBzc25kRGF0YS5vZmZzZXQgLSA4OworCisgICAgLyogRmlsZSBmb3JtYXQgKi8KKyAgICBhZnAtPm1GaWxlRGVzY3JpcHRpb24ubVNhbXBsZVJhdGUgPSA0NDEwMDsKKyAgICBhZnAtPm1GaWxlRGVzY3JpcHRpb24ubUZvcm1hdElEID0ga0F1ZGlvRm9ybWF0TGluZWFyUENNOworICAgIGFmcC0+bUZpbGVEZXNjcmlwdGlvbi5tRm9ybWF0RmxhZ3MgPSBrTGluZWFyUENNRm9ybWF0RmxhZ0lzUGFja2VkIHwga0xpbmVhclBDTUZvcm1hdEZsYWdJc1NpZ25lZEludGVnZXI7CisgICAgYWZwLT5tRmlsZURlc2NyaXB0aW9uLm1CeXRlc1BlclBhY2tldCA9IDQ7CisgICAgYWZwLT5tRmlsZURlc2NyaXB0aW9uLm1GcmFtZXNQZXJQYWNrZXQgPSAxOworICAgIGFmcC0+bUZpbGVEZXNjcmlwdGlvbi5tQnl0ZXNQZXJGcmFtZSA9IDQ7CisgICAgYWZwLT5tRmlsZURlc2NyaXB0aW9uLm1DaGFubmVsc1BlckZyYW1lID0gMjsKKyAgICBhZnAtPm1GaWxlRGVzY3JpcHRpb24ubUJpdHNQZXJDaGFubmVsID0gMTY7CisKKyAgICByZXR1cm4gMTsKK30KKworQXVkaW9GaWxlUGxheWVyICpuZXdfQXVkaW9GaWxlUGxheWVyIChjb25zdCBGU1JlZiAqaW5GaWxlUmVmKQoreworICAgIFNJbnQ2NCBmaWxlRGF0YVNpemUgID0gMDsKKworICAgIEF1ZGlvRmlsZVBsYXllciAqYWZwID0gKEF1ZGlvRmlsZVBsYXllciAqKSBTRExfbWFsbG9jKHNpemVvZiAoQXVkaW9GaWxlUGxheWVyKSk7CisgICAgaWYgKGFmcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTRExfbWVtc2V0KGFmcCwgJ1wwJywgc2l6ZW9mICgqYWZwKSk7CisKKyAgICAjZGVmaW5lIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9EKG0pIGFmcC0+bSA9IEF1ZGlvRmlsZVBsYXllcl8jI20KKyAgICBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRChTZXREZXN0aW5hdGlvbik7CisgICAgU0VUX0FVRElPRklMRVBMQVlFUl9NRVRIT0QoU2V0Tm90aWZpZXIpOworICAgIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9EKFNldFN0YXJ0RnJhbWUpOworICAgIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9EKEdldEN1cnJlbnRGcmFtZSk7CisgICAgU0VUX0FVRElPRklMRVBMQVlFUl9NRVRIT0QoU2V0U3RvcEZyYW1lKTsKKyAgICBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRChDb25uZWN0KTsKKyAgICBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRChEaXNjb25uZWN0KTsKKyAgICBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRChEb05vdGlmaWNhdGlvbik7CisgICAgU0VUX0FVRElPRklMRVBMQVlFUl9NRVRIT0QoSXNDb25uZWN0ZWQpOworICAgIFNFVF9BVURJT0ZJTEVQTEFZRVJfTUVUSE9EKEdldERlc3RVbml0KTsKKyAgICBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRChQcmludCk7CisgICAgU0VUX0FVRElPRklMRVBMQVlFUl9NRVRIT0QoT3BlbkZpbGUpOworICAgICN1bmRlZiBTRVRfQVVESU9GSUxFUExBWUVSX01FVEhPRAorCisgICAgaWYgKCFhZnAtPk9wZW5GaWxlIChhZnAsIGluRmlsZVJlZiwgJmZpbGVEYXRhU2l6ZSkpCisgICAgeworICAgICAgICBTRExfZnJlZShhZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgICAgIAorICAgIC8qIHdlIHdhbnQgYWJvdXQgNCBzZWNvbmRzIHdvcnRoIG9mIGRhdGEgZm9yIHRoZSBidWZmZXIgKi8KKyAgICBpbnQgYnl0ZXNQZXJTZWNvbmQgPSAoVUludDMyKSAoNCAqIGFmcC0+bUZpbGVEZXNjcmlwdGlvbi5tU2FtcGxlUmF0ZSAqIGFmcC0+bUZpbGVEZXNjcmlwdGlvbi5tQnl0ZXNQZXJGcmFtZSk7CisgICAgCisjaWYgREVCVUcKKyAgICBwcmludGYoIkZpbGUgZm9ybWF0OlxuIik7CisgICAgUHJpbnRTdHJlYW1EZXNjICgmYWZwLT5tRmlsZURlc2NyaXB0aW9uKTsKKyNlbmRpZgorICAgIAorICAgIGFmcC0+bUF1ZGlvRmlsZU1hbmFnZXIgPSBuZXdfQXVkaW9GaWxlTWFuYWdlcihhZnAsIGFmcC0+bUZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVEYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIGlmIChhZnAtPm1BdWRpb0ZpbGVNYW5hZ2VyID09IE5VTEwpCisgICAgeworICAgICAgICBkZWxldGVfQXVkaW9GaWxlUGxheWVyKGFmcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBhZnA7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L0F1ZGlvRmlsZVBsYXllci5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvQXVkaW9GaWxlUGxheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2ZDAxNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L0F1ZGlvRmlsZVBsYXllci5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisKKyAgICBUaGlzIGZpbGUgYmFzZWQgb24gQXBwbGUgc2FtcGxlIGNvZGUuIFdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgZmlsZSBuYW1lLCAKKyAgICBzbyBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgaXQgb24gYXBwbGUuY29tL2RldmVsb3BlcgorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgICAgQXVkaW9GaWxlUGxheWVyLmgKKyovCisjaWZuZGVmIF9fQXVkaW9GaWxlUGxheWVyX0hfXworI2RlZmluZSBfX0F1ZGlvRmlsZVBsYXllcl9IX18KKworI2luY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KKworI2luY2x1ZGUgPEF1ZGlvVW5pdC9BdWRpb1VuaXQuaD4KKyNpZiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDw9IDEwNTAKKyNpbmNsdWRlIDxBdWRpb1VuaXQvQVVOVENvbXBvbmVudC5oPgorI2VuZGlmCisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IDEwNTApCit0eXBlZGVmIFNJbnQxNiBGU0lPUmVmTnVtOworI2VuZGlmCisKKyNpbmNsdWRlICJTRExfZXJyb3IuaCIKKworY29uc3QgY2hhciogQXVkaW9GaWxlUGxheWVyRXJyb3JTdHIgKE9TU3RhdHVzIGVycm9yKTsKKworLyoKK3ZvaWQgVGhyb3dSZXN1bHQgKE9TU3RhdHVzIHJlc3VsdCwgY29uc3QgY2hhciAqc3RyKTsKKworI2RlZmluZSBUSFJPV19SRVNVTFQoc3RyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocmVzdWx0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRocm93UmVzdWx0IChyZXN1bHQsIHN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyovCisKK3R5cGVkZWYgdm9pZCAoKkF1ZGlvRmlsZVBsYXlOb3RpZmllcikodm9pZCAgICAgICAgICAqaW5SZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPU1N0YXR1cyAgICAgICAgaW5TdGF0dXMpOworCitlbnVtIHsKKyAgICBrQXVkaW9GaWxlUGxheUVycl9GaWxlUGxheVVuZGVycnVuID0gLTEwMDAwLAorICAgIGtBdWRpb0ZpbGVQbGF5X0ZpbGVJc0ZpbmlzaGVkID0gLTEwMDAxLAorICAgIGtBdWRpb0ZpbGVQbGF5X1BsYXllcklzVW5pbml0aWFsaXplZCA9IC0xMDAwMgorfTsKKworCitzdHJ1Y3QgU19BdWRpb0ZpbGVNYW5hZ2VyOworCisjcHJhZ21hIG1hcmsgX19fX19fX19fXyBBdWRpb0ZpbGVQbGF5ZXIKK3R5cGVkZWYgc3RydWN0IFNfQXVkaW9GaWxlUGxheWVyCit7CisvKnB1YmxpYzoqLworICAgIGludCAgICAgICAgICAgICAoKlNldERlc3RpbmF0aW9uKShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCwgQXVkaW9Vbml0ICppbkRlc3RVbml0KTsKKyAgICB2b2lkICAgICAgICAgICAgKCpTZXROb3RpZmllcikoc3RydWN0IFNfQXVkaW9GaWxlUGxheWVyICphZnAsIEF1ZGlvRmlsZVBsYXlOb3RpZmllciBpbk5vdGlmaWVyLCB2b2lkICppblJlZkNvbik7CisgICAgdm9pZCAgICAgICAgICAgICgqU2V0U3RhcnRGcmFtZSkoc3RydWN0IFNfQXVkaW9GaWxlUGxheWVyICphZnAsIGludCBmcmFtZSk7IC8qIHNlZWsgaW4gdGhlIGZpbGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgKCpHZXRDdXJyZW50RnJhbWUpKHN0cnVjdCBTX0F1ZGlvRmlsZVBsYXllciAqYWZwKTsgLyogZ2V0IHRoZSBjdXJyZW50IGZyYW1lIHBvc2l0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICgqU2V0U3RvcEZyYW1lKShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCwgaW50IGZyYW1lKTsgICAvKiBzZXQgbGltaXQgaW4gdGhlIGZpbGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgKCpDb25uZWN0KShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCk7CisgICAgdm9pZCAgICAgICAgICAgICgqRGlzY29ubmVjdCkoc3RydWN0IFNfQXVkaW9GaWxlUGxheWVyICphZnApOworICAgIHZvaWQgICAgICAgICAgICAoKkRvTm90aWZpY2F0aW9uKShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCwgT1NTdGF0dXMgaW5FcnJvcik7CisgICAgaW50ICAgICAgICAgICAgICgqSXNDb25uZWN0ZWQpKHN0cnVjdCBTX0F1ZGlvRmlsZVBsYXllciAqYWZwKTsKKyAgICBBdWRpb1VuaXQgICAgICAgKCpHZXREZXN0VW5pdCkoc3RydWN0IFNfQXVkaW9GaWxlUGxheWVyICphZnApOworICAgIHZvaWQgICAgICAgICAgICAoKlByaW50KShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCk7CisKKy8qcHJpdmF0ZToqLworICAgIEF1ZGlvVW5pdCAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlVbml0OworICAgIEZTSU9SZWZOdW0gICAgICAgICAgICAgICAgICAgICAgbUZvcmtSZWZOdW07CisgICAgCisgICAgQVVSZW5kZXJDYWxsYmFja1N0cnVjdCAgICAgICAgICBtSW5wdXRDYWxsYmFjazsKKworICAgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiAgICAgbUZpbGVEZXNjcmlwdGlvbjsKKyAgICAKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQ7CisgICAgCisgICAgc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciogICAgICBtQXVkaW9GaWxlTWFuYWdlcjsKKyAgICAKKyAgICBBdWRpb0ZpbGVQbGF5Tm90aWZpZXIgICAgICAgICAgIG1Ob3RpZmllcjsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWZDb247CisgICAgCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRGcmFtZTsKKyAgICAKKyNwcmFnbWEgbWFyayBfX19fX19fX19fIFByaXZhdGVfTWV0aG9kcworICAgIAorICAgIGludCAgICAgICAgICAoKk9wZW5GaWxlKShzdHJ1Y3QgU19BdWRpb0ZpbGVQbGF5ZXIgKmFmcCwgY29uc3QgRlNSZWYgKmluUmVmLCBTSW50NjQgKm91dEZpbGVTaXplKTsKK30gQXVkaW9GaWxlUGxheWVyOworCisKK0F1ZGlvRmlsZVBsYXllciAqbmV3X0F1ZGlvRmlsZVBsYXllcihjb25zdCBGU1JlZiAgICAqaW5GaWxlUmVmKTsKK3ZvaWQgZGVsZXRlX0F1ZGlvRmlsZVBsYXllcihBdWRpb0ZpbGVQbGF5ZXIgKmFmcCk7CisKKworCisjcHJhZ21hIG1hcmsgX19fX19fX19fXyBBdWRpb0ZpbGVNYW5hZ2VyCit0eXBlZGVmIHN0cnVjdCBTX0F1ZGlvRmlsZU1hbmFnZXIKK3sKKy8qcHVibGljOiovCisgICAgICAgIC8qIHRoaXMgbWV0aG9kIHNob3VsZCBOT1QgYmUgY2FsbGVkIGJ5IGFuIG9iamVjdCBvZiB0aGlzIGNsYXNzCisgICAgICAgICAgIGFzIGl0IGlzIGNhbGxlZCBieSB0aGUgcGFyZW50J3MgRGlzY29ubmVjdCgpIG1ldGhvZCAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgKCpEaXNjb25uZWN0KShzdHJ1Y3QgU19BdWRpb0ZpbGVNYW5hZ2VyICphZm0pOworICAgIGludCAgICAgICAgICAgICAgICAgKCpEb0Nvbm5lY3QpKHN0cnVjdCBTX0F1ZGlvRmlsZU1hbmFnZXIgKmFmbSk7CisgICAgT1NTdGF0dXMgICAgICAgICAgICAoKlJlYWQpKHN0cnVjdCBTX0F1ZGlvRmlsZU1hbmFnZXIgKmFmbSwgY2hhciAqYnVmZmVyLCBCeXRlQ291bnQgKmxlbik7CisgICAgY29uc3QgY2hhciogICAgICAgICAoKkdldEZpbGVCdWZmZXIpKHN0cnVjdCBTX0F1ZGlvRmlsZU1hbmFnZXIgKmFmbSk7CisgICAgY29uc3QgQXVkaW9GaWxlUGxheWVyICooKkdldFBhcmVudCkoc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciAqYWZtKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICgqU2V0UG9zaXRpb24pKHN0cnVjdCBTX0F1ZGlvRmlsZU1hbmFnZXIgKmFmbSwgU0ludDY0IHBvcyk7ICAvKiBzZWVrL3Jld2luZCBpbiB0aGUgZmlsZSAqLworICAgIGludCAgICAgICAgICAgICAgICAgKCpHZXRCeXRlQ291bnRlcikoc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciAqYWZtKTsgIC8qIHJldHVybiBhY3R1YWwgYnl0ZXMgc3RyZWFtZWQgdG8gYXVkaW8gaGFyZHdhcmUgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICgqU2V0RW5kT2ZGaWxlKShzdHJ1Y3QgU19BdWRpb0ZpbGVNYW5hZ2VyICphZm0sIFNJbnQ2NCBwb3MpOyAgLyogc2V0IHRoZSAiRU9GIiAod2lsbCBiZWhhdmUganVzdCBsaWtlIGl0IHJlYWNoZWQgZW9mKSAqLworICAgCisvKnByb3RlY3RlZDoqLworICAgIEF1ZGlvRmlsZVBsYXllciogICAgbVBhcmVudDsKKyAgICBTSW50MTYgICAgICAgICAgICAgIG1Gb3JrUmVmTnVtOworICAgIFNJbnQ2NCAgICAgICAgICAgICAgbUF1ZGlvRGF0YU9mZnNldDsKKyAgICAKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1GaWxlQnVmZmVyOworCisgICAgaW50ICAgICAgICAgICAgICAgICBtQnl0ZUNvdW50ZXI7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgbVJlYWRGcm9tRmlyc3RCdWZmZXI7CisgICAgaW50ICAgICAgICAgICAgICAgIG1Mb2NrVW5zdWNjZXNzZnVsOworICAgIGludCAgICAgICAgICAgICAgICBtSXNFbmdhZ2VkOworICAgIAorICAgIGludCAgICAgICAgICAgICAgICAgbU51bVRpbWVzQXNrZWRTaW5jZUZpbmlzaGVkOworCisKKwl2b2lkKiAgICAgICAgICAgICAgIG1UbXBCdWZmZXI7CisJVUludDMyICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsKKwlVSW50MzIgICAgICAgICAgICAgIG1CdWZmZXJPZmZzZXQ7CisvKnB1YmxpYzoqLworICAgIFVJbnQzMiAgICAgICAgICAgICAgbUNodW5rU2l6ZTsKKyAgICBTSW50NjQgICAgICAgICAgICAgIG1GaWxlTGVuZ3RoOworICAgIFNJbnQ2NCAgICAgICAgICAgICAgbVJlYWRGaWxlUG9zaXRpb247CisgICAgaW50ICAgICAgICAgICAgICAgICBtV3JpdGVUb0ZpcnN0QnVmZmVyOworICAgIGludCAgICAgICAgICAgICAgICAgbUZpbmlzaGVkUmVhZGluZ0RhdGE7CisKKy8qcHJvdGVjdGVkOiovCisgICAgT1NTdGF0dXMgICAgICAgICAgICAoKlJlbmRlcikoc3RydWN0IFNfQXVkaW9GaWxlTWFuYWdlciAqYWZtLCBBdWRpb0J1ZmZlckxpc3QgKmlvRGF0YSk7CisgICAgT1NTdGF0dXMgICAgICAgICAgICAoKkdldEZpbGVEYXRhKShzdHJ1Y3QgU19BdWRpb0ZpbGVNYW5hZ2VyICphZm0sIHZvaWQqKiBpbk91dERhdGEsIFVJbnQzMiAqaW5PdXREYXRhU2l6ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAoKkFmdGVyUmVuZGVyKShzdHJ1Y3QgU19BdWRpb0ZpbGVNYW5hZ2VyICphZm0pOworCisvKnB1YmxpYzoqLworICAgIC8qc3RhdGljKi8KKyAgICBPU1N0YXR1cyAgICAgICAgICAgICgqRmlsZUlucHV0UHJvYykodm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5SZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzICAgICAgKmlvQWN0aW9uRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wICAgICAgICAgICAgKmluVGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVzTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtYmVyRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlckxpc3QgICAgICAgICAgICAgICAgICppb0RhdGEpOworfSBBdWRpb0ZpbGVNYW5hZ2VyOworCisKK0F1ZGlvRmlsZU1hbmFnZXIgKm5ld19BdWRpb0ZpbGVNYW5hZ2VyIChBdWRpb0ZpbGVQbGF5ZXIgKmluUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgIFNJbnQxNiAgICAgICAgICBpbkZvcmtSZWZOdW0sIAorICAgICAgICAgICAgICAgICAgICAgIFNJbnQ2NCAgICAgICAgICBpbkZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgIGluQ2h1bmtTaXplKTsKKyAgICAKK3ZvaWQgZGVsZXRlX0F1ZGlvRmlsZU1hbmFnZXIoQXVkaW9GaWxlTWFuYWdlciAqYWZtKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L0F1ZGlvRmlsZVJlYWRlclRocmVhZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvQXVkaW9GaWxlUmVhZGVyVGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwN2MwNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L0F1ZGlvRmlsZVJlYWRlclRocmVhZC5jCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisKKyAgICBUaGlzIGZpbGUgYmFzZWQgb24gQXBwbGUgc2FtcGxlIGNvZGUuIFdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgZmlsZSBuYW1lLCAKKyAgICBzbyBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgaXQgb24gYXBwbGUuY29tL2RldmVsb3BlcgorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgICBBdWRpb0ZpbGVNYW5hZ2VyLmNwcAorKi8KKyNpbmNsdWRlICJBdWRpb0ZpbGVQbGF5ZXIuaCIKKyNpbmNsdWRlIDxtYWNoL21hY2guaD4gLyogdXNlZCBmb3Igc2V0dGluZyBwb2xpY3kgb2YgdGhyZWFkICovCisjaW5jbHVkZSAiU0RMT1NYQ0FHdWFyZC5oIgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLyojaW5jbHVkZSA8bGlzdD4qLworCisvKnR5cGVkZWYgdm9pZCAqRmlsZURhdGE7Ki8KK3R5cGVkZWYgc3RydWN0IFNfRmlsZURhdGEKK3sKKyAgICBBdWRpb0ZpbGVNYW5hZ2VyICpvYmo7CisgICAgc3RydWN0IFNfRmlsZURhdGEgKm5leHQ7Cit9IEZpbGVEYXRhOworCisKK3R5cGVkZWYgc3RydWN0IFNfRmlsZVJlYWRlclRocmVhZCB7CisvKnB1YmxpYzoqLworICAgIFNETE9TWENBR3VhcmQqICAgICAgICAgICAgICAgICAgICAoKkdldEd1YXJkKShzdHJ1Y3QgU19GaWxlUmVhZGVyVGhyZWFkICpmcnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAoKkFkZFJlYWRlcikoc3RydWN0IFNfRmlsZVJlYWRlclRocmVhZCAqZnJ0KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpSZW1vdmVSZWFkZXIpKHN0cnVjdCBTX0ZpbGVSZWFkZXJUaHJlYWQgKmZydCwgQXVkaW9GaWxlTWFuYWdlciogaW5JdGVtKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgKCpUcnlOZXh0UmVhZCkoc3RydWN0IFNfRmlsZVJlYWRlclRocmVhZCAqZnJ0LCBBdWRpb0ZpbGVNYW5hZ2VyKiBpbkl0ZW0pOworCisgICAgaW50ICAgICBtVGhyZWFkU2hvdWxkRGllOworICAgIAorLypwcml2YXRlOiovCisgICAgLyp0eXBlZGVmIHN0ZDo6bGlzdDxBdWRpb0ZpbGVNYW5hZ2VyKj4gRmlsZURhdGE7Ki8KKworICAgIFNETE9TWENBR3VhcmQgICAgICAgICAgICAgKm1HdWFyZDsKKyAgICBVSW50MzIgICAgICAgICAgICAgIG1UaHJlYWRQcmlvcml0eTsKKyAgICAKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1OdW1SZWFkZXJzOyAgICAKKyAgICBGaWxlRGF0YSAgICAgICAgICAgICptRmlsZURhdGE7CisKKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAoKlJlYWROZXh0Q2h1bmspKHN0cnVjdCBTX0ZpbGVSZWFkZXJUaHJlYWQgKmZydCk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICgqU3RhcnRGaXhlZFByaW9yaXR5VGhyZWFkKShzdHJ1Y3QgU19GaWxlUmVhZGVyVGhyZWFkICpmcnQpOworICAgIC8qc3RhdGljKi8KKyAgICBVSW50MzIgICAgICAgICAgICAgICAoKkdldFRocmVhZEJhc2VQcmlvcml0eSkocHRocmVhZF90IGluVGhyZWFkKTsKKyAgICAvKnN0YXRpYyovCisgICAgdm9pZCogICAgICAgICAgICAgICAgKCpEaXNrUmVhZGVyRW50cnkpKHZvaWQgKmluUmVmQ29uKTsKK30gRmlsZVJlYWRlclRocmVhZDsKKworCitzdGF0aWMgU0RMT1NYQ0FHdWFyZCogRmlsZVJlYWRlclRocmVhZF9HZXRHdWFyZChGaWxlUmVhZGVyVGhyZWFkICpmcnQpCit7CisgICAgcmV0dXJuIGZydC0+bUd1YXJkOworfQorCisvKiByZXR1cm5zIDEgaWYgc3VjY2VlZGVkICovCitzdGF0aWMgaW50IEZpbGVSZWFkZXJUaHJlYWRfVHJ5TmV4dFJlYWQgKEZpbGVSZWFkZXJUaHJlYWQgKmZydCwgQXVkaW9GaWxlTWFuYWdlciogaW5JdGVtKQoreworICAgIGludCBkaWRMb2NrID0gMDsKKyAgICBpbnQgc3VjY2VlZGVkID0gMDsKKyAgICBpZiAoZnJ0LT5tR3VhcmQtPlRyeShmcnQtPm1HdWFyZCwgJmRpZExvY2spKQorICAgIHsKKyAgICAgICAgLypmcnQtPm1GaWxlRGF0YS5wdXNoX2JhY2sgKGluSXRlbSk7Ki8KKyAgICAgICAgLyogISEhIEZJWE1FOiB0aGlzIGNvdWxkIGJlIGZhc3RlciB3aXRoIGEgInRhaWwiIG1lbWJlci4gLS1yeWFuLiAqLworICAgICAgICBGaWxlRGF0YSAqaSA9IGZydC0+bUZpbGVEYXRhOworICAgICAgICBGaWxlRGF0YSAqcHJldiA9IE5VTEw7CisKKyAgICAgICAgRmlsZURhdGEgKm5ld2ZkID0gKEZpbGVEYXRhICopIFNETF9tYWxsb2Moc2l6ZW9mIChGaWxlRGF0YSkpOworICAgICAgICBuZXdmZC0+b2JqID0gaW5JdGVtOworICAgICAgICBuZXdmZC0+bmV4dCA9IE5VTEw7CisKKyAgICAgICAgd2hpbGUgKGkgIT0gTlVMTCkgeyBwcmV2ID0gaTsgaSA9IGktPm5leHQ7IH0KKyAgICAgICAgaWYgKHByZXYgPT0gTlVMTCkKKyAgICAgICAgICAgIGZydC0+bUZpbGVEYXRhID0gbmV3ZmQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByZXYtPm5leHQgPSBuZXdmZDsKKworICAgICAgICBmcnQtPm1HdWFyZC0+Tm90aWZ5KGZydC0+bUd1YXJkKTsKKyAgICAgICAgc3VjY2VlZGVkID0gMTsKKworICAgICAgICBpZiAoZGlkTG9jaykKKyAgICAgICAgICAgIGZydC0+bUd1YXJkLT5VbmxvY2soZnJ0LT5tR3VhcmQpOworICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICByZXR1cm4gc3VjY2VlZGVkOworfQorCitzdGF0aWMgdm9pZCAgICBGaWxlUmVhZGVyVGhyZWFkX0FkZFJlYWRlcihGaWxlUmVhZGVyVGhyZWFkICpmcnQpCit7CisgICAgaWYgKGZydC0+bU51bVJlYWRlcnMgPT0gMCkKKyAgICB7CisgICAgICAgIGZydC0+bVRocmVhZFNob3VsZERpZSA9IDA7CisgICAgICAgIGZydC0+U3RhcnRGaXhlZFByaW9yaXR5VGhyZWFkIChmcnQpOworICAgIH0KKyAgICBmcnQtPm1OdW1SZWFkZXJzKys7Cit9CisKK3N0YXRpYyB2b2lkICAgIEZpbGVSZWFkZXJUaHJlYWRfUmVtb3ZlUmVhZGVyIChGaWxlUmVhZGVyVGhyZWFkICpmcnQsIEF1ZGlvRmlsZU1hbmFnZXIqIGluSXRlbSkKK3sKKyAgICBpZiAoZnJ0LT5tTnVtUmVhZGVycyA+IDApCisgICAgeworICAgICAgICBpbnQgYk5lZWRzUmVsZWFzZSA9IGZydC0+bUd1YXJkLT5Mb2NrKGZydC0+bUd1YXJkKTsKKyAgICAgICAgCisgICAgICAgIC8qZnJ0LT5tRmlsZURhdGEucmVtb3ZlIChpbkl0ZW0pOyovCisgICAgICAgIEZpbGVEYXRhICppID0gZnJ0LT5tRmlsZURhdGE7CisgICAgICAgIEZpbGVEYXRhICpwcmV2ID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKGkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZURhdGEgKm5leHQgPSBpLT5uZXh0OworICAgICAgICAgICAgaWYgKGktPm9iaiAhPSBpbkl0ZW0pCisgICAgICAgICAgICAgICAgcHJldiA9IGk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZnJ0LT5tRmlsZURhdGEgPSBuZXh0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJldi0+bmV4dCA9IG5leHQ7CisgICAgICAgICAgICAgICAgU0RMX2ZyZWUoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgtLWZydC0+bU51bVJlYWRlcnMgPT0gMCkgeworICAgICAgICAgICAgZnJ0LT5tVGhyZWFkU2hvdWxkRGllID0gMTsKKyAgICAgICAgICAgIGZydC0+bUd1YXJkLT5Ob3RpZnkoZnJ0LT5tR3VhcmQpOyAvKiB3YWtlIHVwIHRocmVhZCBzbyBpdCB3aWxsIHF1aXQgKi8KKyAgICAgICAgICAgIGZydC0+bUd1YXJkLT5XYWl0KGZydC0+bUd1YXJkKTsgICAvKiB3YWl0IGZvciB0aHJlYWQgdG8gZGllICovCisgICAgICAgIH0KKworICAgICAgICBpZiAoYk5lZWRzUmVsZWFzZSkgZnJ0LT5tR3VhcmQtPlVubG9jayhmcnQtPm1HdWFyZCk7CisgICAgfSAgIAorfQorCitzdGF0aWMgaW50ICAgIEZpbGVSZWFkZXJUaHJlYWRfU3RhcnRGaXhlZFByaW9yaXR5VGhyZWFkIChGaWxlUmVhZGVyVGhyZWFkICpmcnQpCit7CisgICAgcHRocmVhZF9hdHRyX3QgICAgICB0aGVUaHJlYWRBdHRyczsKKyAgICBwdGhyZWFkX3QgICAgICAgICAgIHBUaHJlYWQ7CisKKyAgICBPU1N0YXR1cyByZXN1bHQgPSBwdGhyZWFkX2F0dHJfaW5pdCgmdGhlVGhyZWFkQXR0cnMpOworICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gMDsgLypUSFJPV19SRVNVTFQoInB0aHJlYWRfYXR0cl9pbml0IC0gVGhyZWFkIGF0dHJpYnV0ZXMgY291bGQgbm90IGJlIGNyZWF0ZWQuIikqLworICAgIAorICAgIHJlc3VsdCA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhlVGhyZWFkQXR0cnMsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUgLSBUaHJlYWQgYXR0cmlidXRlcyBjb3VsZCBub3QgYmUgZGV0YWNoZWQuIikqLworICAgIAorICAgIHJlc3VsdCA9IHB0aHJlYWRfY3JlYXRlICgmcFRocmVhZCwgJnRoZVRocmVhZEF0dHJzLCBmcnQtPkRpc2tSZWFkZXJFbnRyeSwgZnJ0KTsKKyAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJwdGhyZWFkX2NyZWF0ZSAtIENyZWF0ZSBhbmQgc3RhcnQgdGhlIHRocmVhZC4iKSovCisgICAgCisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnRoZVRocmVhZEF0dHJzKTsKKyAgICAKKyAgICAvKiB3ZSd2ZSBub3cgY3JlYXRlZCB0aGUgdGhyZWFkIGFuZCBzdGFydGVkIGl0CisgICAgICAgd2UnbGwgbm93IHNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0byB0aGUgbm9taW5hdGVkIHByaW9yaXR5CisgICAgICAgYW5kIHdlJ2xsIGFsc28gbWFrZSB0aGUgdGhyZWFkIGZpeGVkICovCisgICAgdGhyZWFkX2V4dGVuZGVkX3BvbGljeV9kYXRhX3QgICAgICAgdGhlRml4ZWRQb2xpY3k7CisgICAgdGhyZWFkX3ByZWNlZGVuY2VfcG9saWN5X2RhdGFfdCAgICAgdGhlUHJlY2VkZW5jZVBvbGljeTsKKyAgICBTSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVByaW9yaXR5OworICAgIAorICAgIC8qIG1ha2UgdGhyZWFkIGZpeGVkICovCisgICAgdGhlRml4ZWRQb2xpY3kudGltZXNoYXJlID0gMDsgICAvKiBzZXQgdG8gMSBmb3IgYSBub24tZml4ZWQgdGhyZWFkICovCisgICAgcmVzdWx0ID0gdGhyZWFkX3BvbGljeV9zZXQgKHB0aHJlYWRfbWFjaF90aHJlYWRfbnAocFRocmVhZCksIFRIUkVBRF9FWFRFTkRFRF9QT0xJQ1ksICh0aHJlYWRfcG9saWN5X3QpJnRoZUZpeGVkUG9saWN5LCBUSFJFQURfRVhURU5ERURfUE9MSUNZX0NPVU5UKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJ0aHJlYWRfcG9saWN5IC0gQ291bGRuJ3Qgc2V0IHRocmVhZCBhcyBmaXhlZCBwcmlvcml0eS4iKSovCisgICAgLyogc2V0IHByaW9yaXR5ICovCisgICAgLyogcHJlY2VkZW5jeSBwb2xpY3kncyAiaW1wb3J0YW5jZSIgdmFsdWUgaXMgcmVsYXRpdmUgdG8gc3Bhd25pbmcgdGhyZWFkJ3MgcHJpb3JpdHkgKi8KKyAgICByZWxhdGl2ZVByaW9yaXR5ID0gZnJ0LT5tVGhyZWFkUHJpb3JpdHkgLSBmcnQtPkdldFRocmVhZEJhc2VQcmlvcml0eShwdGhyZWFkX3NlbGYoKSk7CisgICAgICAgIAorICAgIHRoZVByZWNlZGVuY2VQb2xpY3kuaW1wb3J0YW5jZSA9IHJlbGF0aXZlUHJpb3JpdHk7CisgICAgcmVzdWx0ID0gdGhyZWFkX3BvbGljeV9zZXQgKHB0aHJlYWRfbWFjaF90aHJlYWRfbnAocFRocmVhZCksIFRIUkVBRF9QUkVDRURFTkNFX1BPTElDWSwgKHRocmVhZF9wb2xpY3lfdCkmdGhlUHJlY2VkZW5jZVBvbGljeSwgVEhSRUFEX1BSRUNFREVOQ0VfUE9MSUNZX0NPVU5UKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIDA7IC8qVEhST1dfUkVTVUxUKCJ0aHJlYWRfcG9saWN5IC0gQ291bGRuJ3Qgc2V0IHRocmVhZCBwcmlvcml0eS4iKSovCisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIFVJbnQzMiAgRmlsZVJlYWRlclRocmVhZF9HZXRUaHJlYWRCYXNlUHJpb3JpdHkgKHB0aHJlYWRfdCBpblRocmVhZCkKK3sKKyAgICB0aHJlYWRfYmFzaWNfaW5mb19kYXRhX3QgICAgICAgICAgICB0aHJlYWRJbmZvOworICAgIHBvbGljeV9pbmZvX2RhdGFfdCAgICAgICAgICAgICAgICAgIHRoZVBvbGljeUluZm87CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7CisgICAgCisgICAgLyogZ2V0IGJhc2ljIGluZm8gKi8KKyAgICBjb3VudCA9IFRIUkVBRF9CQVNJQ19JTkZPX0NPVU5UOworICAgIHRocmVhZF9pbmZvIChwdGhyZWFkX21hY2hfdGhyZWFkX25wIChpblRocmVhZCksIFRIUkVBRF9CQVNJQ19JTkZPLCAoaW50ZWdlcl90KikmdGhyZWFkSW5mbywgJmNvdW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKHRocmVhZEluZm8ucG9saWN5KSB7CisgICAgICAgIGNhc2UgUE9MSUNZX1RJTUVTSEFSRToKKyAgICAgICAgICAgIGNvdW50ID0gUE9MSUNZX1RJTUVTSEFSRV9JTkZPX0NPVU5UOworICAgICAgICAgICAgdGhyZWFkX2luZm8ocHRocmVhZF9tYWNoX3RocmVhZF9ucCAoaW5UaHJlYWQpLCBUSFJFQURfU0NIRURfVElNRVNIQVJFX0lORk8sIChpbnRlZ2VyX3QqKSYodGhlUG9saWN5SW5mby50cyksICZjb3VudCk7CisgICAgICAgICAgICByZXR1cm4gdGhlUG9saWN5SW5mby50cy5iYXNlX3ByaW9yaXR5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBQT0xJQ1lfRklGTzoKKyAgICAgICAgICAgIGNvdW50ID0gUE9MSUNZX0ZJRk9fSU5GT19DT1VOVDsKKyAgICAgICAgICAgIHRocmVhZF9pbmZvKHB0aHJlYWRfbWFjaF90aHJlYWRfbnAgKGluVGhyZWFkKSwgVEhSRUFEX1NDSEVEX0ZJRk9fSU5GTywgKGludGVnZXJfdCopJih0aGVQb2xpY3lJbmZvLmZpZm8pLCAmY291bnQpOworICAgICAgICAgICAgaWYgKHRoZVBvbGljeUluZm8uZmlmby5kZXByZXNzZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhlUG9saWN5SW5mby5maWZvLmRlcHJlc3NfcHJpb3JpdHk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGVQb2xpY3lJbmZvLmZpZm8uYmFzZV9wcmlvcml0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgUE9MSUNZX1JSOgorICAgICAgICAgICAgY291bnQgPSBQT0xJQ1lfUlJfSU5GT19DT1VOVDsKKyAgICAgICAgICAgIHRocmVhZF9pbmZvKHB0aHJlYWRfbWFjaF90aHJlYWRfbnAgKGluVGhyZWFkKSwgVEhSRUFEX1NDSEVEX1JSX0lORk8sIChpbnRlZ2VyX3QqKSYodGhlUG9saWN5SW5mby5yciksICZjb3VudCk7CisgICAgICAgICAgICBpZiAodGhlUG9saWN5SW5mby5yci5kZXByZXNzZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhlUG9saWN5SW5mby5yci5kZXByZXNzX3ByaW9yaXR5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhlUG9saWN5SW5mby5yci5iYXNlX3ByaW9yaXR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAgICAqRmlsZVJlYWRlclRocmVhZF9EaXNrUmVhZGVyRW50cnkgKHZvaWQgKmluUmVmQ29uKQoreworICAgIEZpbGVSZWFkZXJUaHJlYWQgKmZydCA9IChGaWxlUmVhZGVyVGhyZWFkICopaW5SZWZDb247CisgICAgZnJ0LT5SZWFkTmV4dENodW5rKGZydCk7CisgICAgI2lmIERFQlVHCisgICAgcHJpbnRmICgiZmluaXNoZWQgd2l0aCByZWFkaW5nIGZpbGVcbiIpOworICAgICNlbmRpZgorICAgIAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAgICBGaWxlUmVhZGVyVGhyZWFkX1JlYWROZXh0Q2h1bmsgKEZpbGVSZWFkZXJUaHJlYWQgKmZydCkKK3sKKyAgICBPU1N0YXR1cyByZXN1bHQ7CisgICAgQnl0ZUNvdW50IGRhdGFDaHVua1NpemU7CisgICAgQXVkaW9GaWxlTWFuYWdlciogdGhlSXRlbSA9IDA7CisKKyAgICBmb3IgKDs7KSAKKyAgICB7CisgICAgICAgIHsgLyogdGhpcyBpcyBhIHNjb3BlZCBiYXNlZCBsb2NrICovCisgICAgICAgICAgICBpbnQgYk5lZWRzUmVsZWFzZSA9IGZydC0+bUd1YXJkLT5Mb2NrKGZydC0+bUd1YXJkKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGZydC0+bVRocmVhZFNob3VsZERpZSkgeworICAgICAgICAgICAgICAgIGZydC0+bUd1YXJkLT5Ob3RpZnkoZnJ0LT5tR3VhcmQpOworICAgICAgICAgICAgICAgIGlmIChiTmVlZHNSZWxlYXNlKSBmcnQtPm1HdWFyZC0+VW5sb2NrKGZydC0+bUd1YXJkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qaWYgKGZydC0+bUZpbGVEYXRhLmVtcHR5KCkpKi8KKyAgICAgICAgICAgIGlmIChmcnQtPm1GaWxlRGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZydC0+bUd1YXJkLT5XYWl0KGZydC0+bUd1YXJkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLyoga2lsbCB0aHJlYWQgKi8KKyAgICAgICAgICAgIGlmIChmcnQtPm1UaHJlYWRTaG91bGREaWUpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZydC0+bUd1YXJkLT5Ob3RpZnkoZnJ0LT5tR3VhcmQpOworICAgICAgICAgICAgICAgIGlmIChiTmVlZHNSZWxlYXNlKSBmcnQtPm1HdWFyZC0+VW5sb2NrKGZydC0+bUd1YXJkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qdGhlSXRlbSA9IGZydC0+bUZpbGVEYXRhLmZyb250KCk7Ki8KKyAgICAgICAgICAgIC8qZnJ0LT5tRmlsZURhdGEucG9wX2Zyb250KCk7Ki8KKyAgICAgICAgICAgIHRoZUl0ZW0gPSBOVUxMOworICAgICAgICAgICAgaWYgKGZydC0+bUZpbGVEYXRhICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZURhdGEgKm5leHQgPSBmcnQtPm1GaWxlRGF0YS0+bmV4dDsKKyAgICAgICAgICAgICAgICB0aGVJdGVtID0gZnJ0LT5tRmlsZURhdGEtPm9iajsKKyAgICAgICAgICAgICAgICBTRExfZnJlZShmcnQtPm1GaWxlRGF0YSk7CisgICAgICAgICAgICAgICAgZnJ0LT5tRmlsZURhdGEgPSBuZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYk5lZWRzUmVsZWFzZSkgZnJ0LT5tR3VhcmQtPlVubG9jayhmcnQtPm1HdWFyZCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYgKCh0aGVJdGVtLT5tRmlsZUxlbmd0aCAtIHRoZUl0ZW0tPm1SZWFkRmlsZVBvc2l0aW9uKSA8IHRoZUl0ZW0tPm1DaHVua1NpemUpCisgICAgICAgICAgICBkYXRhQ2h1bmtTaXplID0gdGhlSXRlbS0+bUZpbGVMZW5ndGggLSB0aGVJdGVtLT5tUmVhZEZpbGVQb3NpdGlvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGF0YUNodW5rU2l6ZSA9IHRoZUl0ZW0tPm1DaHVua1NpemU7CisgICAgICAgIAorICAgICAgICAgICAgLyogdGhpcyBpcyB0aGUgZXhpdCBjb25kaXRpb24gZm9yIHRoZSB0aHJlYWQgKi8KKyAgICAgICAgaWYgKGRhdGFDaHVua1NpemUgPD0gMCkgeworICAgICAgICAgICAgdGhlSXRlbS0+bUZpbmlzaGVkUmVhZGluZ0RhdGEgPSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNvbnN0cnVjdCBwb2ludGVyICovCisgICAgICAgIGNoYXIqIHdyaXRlUHRyID0gKGNoYXIgKikgKHRoZUl0ZW0tPkdldEZpbGVCdWZmZXIodGhlSXRlbSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlSXRlbS0+bVdyaXRlVG9GaXJzdEJ1ZmZlciA/IDAgOiB0aGVJdGVtLT5tQ2h1bmtTaXplKSk7CisgICAgCisgICAgICAgICAgICAvKiByZWFkIGRhdGEgKi8KKyAgICAgICAgcmVzdWx0ID0gdGhlSXRlbS0+UmVhZCh0aGVJdGVtLCB3cml0ZVB0ciwgJmRhdGFDaHVua1NpemUpOworICAgICAgICBpZiAocmVzdWx0ICE9IG5vRXJyICYmIHJlc3VsdCAhPSBlb2ZFcnIpIHsKKyAgICAgICAgICAgIEF1ZGlvRmlsZVBsYXllciAqYWZwID0gKEF1ZGlvRmlsZVBsYXllciAqKSB0aGVJdGVtLT5HZXRQYXJlbnQodGhlSXRlbSk7CisgICAgICAgICAgICBhZnAtPkRvTm90aWZpY2F0aW9uKGFmcCwgcmVzdWx0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZGF0YUNodW5rU2l6ZSAhPSB0aGVJdGVtLT5tQ2h1bmtTaXplKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZVB0ciArPSBkYXRhQ2h1bmtTaXplOworCisgICAgICAgICAgICAvKiBjYW4ndCBleGl0IHlldC4uIHdlIHN0aWxsIGhhdmUgdG8gcGFzcyB0aGUgcGFydGlhbCBidWZmZXIgYmFjayAqLworICAgICAgICAgICAgU0RMX21lbXNldCh3cml0ZVB0ciwgMCwgKHRoZUl0ZW0tPm1DaHVua1NpemUgLSBkYXRhQ2h1bmtTaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRoZUl0ZW0tPm1Xcml0ZVRvRmlyc3RCdWZmZXIgPSAhdGhlSXRlbS0+bVdyaXRlVG9GaXJzdEJ1ZmZlcjsgICAvKiBzd2l0Y2ggYnVmZmVycyAqLworICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBlb2ZFcnIpCisgICAgICAgICAgICB0aGVJdGVtLT5tUmVhZEZpbGVQb3NpdGlvbiA9IHRoZUl0ZW0tPm1GaWxlTGVuZ3RoOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGVJdGVtLT5tUmVhZEZpbGVQb3NpdGlvbiArPSBkYXRhQ2h1bmtTaXplOyAgICAgICAgLyogaW5jcmVtZW50IGNvdW50ICovCisgICAgfQorfQorCit2b2lkIGRlbGV0ZV9GaWxlUmVhZGVyVGhyZWFkKEZpbGVSZWFkZXJUaHJlYWQgKmZydCkKK3sKKyAgICBpZiAoZnJ0ICE9IE5VTEwpCisgICAgeworICAgICAgICBkZWxldGVfU0RMT1NYQ0FHdWFyZChmcnQtPm1HdWFyZCk7CisgICAgICAgIFNETF9mcmVlKGZydCk7CisgICAgfQorfQorCitGaWxlUmVhZGVyVGhyZWFkICpuZXdfRmlsZVJlYWRlclRocmVhZCAoKQoreworICAgIEZpbGVSZWFkZXJUaHJlYWQgKmZydCA9IChGaWxlUmVhZGVyVGhyZWFkICopIFNETF9tYWxsb2Moc2l6ZW9mIChGaWxlUmVhZGVyVGhyZWFkKSk7CisgICAgaWYgKGZydCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTRExfbWVtc2V0KGZydCwgJ1wwJywgc2l6ZW9mICgqZnJ0KSk7CisKKyAgICBmcnQtPm1HdWFyZCA9IG5ld19TRExPU1hDQUd1YXJkKCk7CisgICAgaWYgKGZydC0+bUd1YXJkID09IE5VTEwpCisgICAgeworICAgICAgICBTRExfZnJlZShmcnQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAjZGVmaW5lIFNFVF9GSUxFUkVBREVSVEhSRUFEX01FVEhPRChtKSBmcnQtPm0gPSBGaWxlUmVhZGVyVGhyZWFkXyMjbQorICAgIFNFVF9GSUxFUkVBREVSVEhSRUFEX01FVEhPRChHZXRHdWFyZCk7CisgICAgU0VUX0ZJTEVSRUFERVJUSFJFQURfTUVUSE9EKEFkZFJlYWRlcik7CisgICAgU0VUX0ZJTEVSRUFERVJUSFJFQURfTUVUSE9EKFJlbW92ZVJlYWRlcik7CisgICAgU0VUX0ZJTEVSRUFERVJUSFJFQURfTUVUSE9EKFRyeU5leHRSZWFkKTsKKyAgICBTRVRfRklMRVJFQURFUlRIUkVBRF9NRVRIT0QoUmVhZE5leHRDaHVuayk7CisgICAgU0VUX0ZJTEVSRUFERVJUSFJFQURfTUVUSE9EKFN0YXJ0Rml4ZWRQcmlvcml0eVRocmVhZCk7CisgICAgU0VUX0ZJTEVSRUFERVJUSFJFQURfTUVUSE9EKEdldFRocmVhZEJhc2VQcmlvcml0eSk7CisgICAgU0VUX0ZJTEVSRUFERVJUSFJFQURfTUVUSE9EKERpc2tSZWFkZXJFbnRyeSk7CisgICAgI3VuZGVmIFNFVF9GSUxFUkVBREVSVEhSRUFEX01FVEhPRAorCisgICAgZnJ0LT5tVGhyZWFkUHJpb3JpdHkgPSA2MjsKKyAgICByZXR1cm4gZnJ0OworfQorCisKK3N0YXRpYyBGaWxlUmVhZGVyVGhyZWFkICpzUmVhZGVyVGhyZWFkOworCisKK3N0YXRpYyBpbnQgICAgQXVkaW9GaWxlTWFuYWdlcl9Eb0Nvbm5lY3QgKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSkKK3sKKyAgICBpZiAoIWFmbS0+bUlzRW5nYWdlZCkKKyAgICB7CisgICAgICAgIE9TU3RhdHVzIHJlc3VsdDsKKworICAgICAgICAvKmFmbS0+bVJlYWRGaWxlUG9zaXRpb24gPSAwOyovCisgICAgICAgIGFmbS0+bUZpbmlzaGVkUmVhZGluZ0RhdGEgPSAwOworCisgICAgICAgIGFmbS0+bU51bVRpbWVzQXNrZWRTaW5jZUZpbmlzaGVkID0gMDsKKyAgICAgICAgYWZtLT5tTG9ja1Vuc3VjY2Vzc2Z1bCA9IDA7CisgICAgICAgIAorICAgICAgICBCeXRlQ291bnQgZGF0YUNodW5rU2l6ZTsKKyAgICAgICAgCisgICAgICAgIGlmICgoYWZtLT5tRmlsZUxlbmd0aCAtIGFmbS0+bVJlYWRGaWxlUG9zaXRpb24pIDwgYWZtLT5tQ2h1bmtTaXplKQorICAgICAgICAgICAgZGF0YUNodW5rU2l6ZSA9IGFmbS0+bUZpbGVMZW5ndGggLSBhZm0tPm1SZWFkRmlsZVBvc2l0aW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkYXRhQ2h1bmtTaXplID0gYWZtLT5tQ2h1bmtTaXplOworICAgICAgICAKKyAgICAgICAgcmVzdWx0ID0gYWZtLT5SZWFkKGFmbSwgYWZtLT5tRmlsZUJ1ZmZlciwgJmRhdGFDaHVua1NpemUpOworICAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gMDsgLypUSFJPV19SRVNVTFQoIkF1ZGlvRmlsZU1hbmFnZXI6OkRvQ29ubmVjdCgpOiBSZWFkIikqLworCisgICAgICAgIGFmbS0+bVJlYWRGaWxlUG9zaXRpb24gKz0gZGF0YUNodW5rU2l6ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgYWZtLT5tV3JpdGVUb0ZpcnN0QnVmZmVyID0gMDsKKyAgICAgICAgYWZtLT5tUmVhZEZyb21GaXJzdEJ1ZmZlciA9IDE7CisKKyAgICAgICAgc1JlYWRlclRocmVhZC0+QWRkUmVhZGVyKHNSZWFkZXJUaHJlYWQpOworICAgICAgICAKKyAgICAgICAgYWZtLT5tSXNFbmdhZ2VkID0gMTsKKyAgICB9CisgICAgLyoKKyAgICBlbHNlCisgICAgICAgIHRocm93IHN0YXRpY19jYXN0PE9TU3RhdHVzPigtMSk7ICovIC8qIHRocmVhZCBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgKi8KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCAgICBBdWRpb0ZpbGVNYW5hZ2VyX0Rpc2Nvbm5lY3QgKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSkKK3sKKyAgICBpZiAoYWZtLT5tSXNFbmdhZ2VkKQorICAgIHsKKyAgICAgICAgc1JlYWRlclRocmVhZC0+UmVtb3ZlUmVhZGVyIChzUmVhZGVyVGhyZWFkLCBhZm0pOworICAgICAgICBhZm0tPm1Jc0VuZ2FnZWQgPSAwOworICAgIH0KK30KKworc3RhdGljIE9TU3RhdHVzIEF1ZGlvRmlsZU1hbmFnZXJfUmVhZChBdWRpb0ZpbGVNYW5hZ2VyICphZm0sIGNoYXIgKmJ1ZmZlciwgQnl0ZUNvdW50ICpsZW4pCit7CisgICAgcmV0dXJuIEZTUmVhZEZvcmsgKGFmbS0+bUZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgIGZzRnJvbVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBhZm0tPm1SZWFkRmlsZVBvc2l0aW9uICsgYWZtLT5tQXVkaW9EYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAqbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGxlbik7Cit9CisKK3N0YXRpYyBPU1N0YXR1cyBBdWRpb0ZpbGVNYW5hZ2VyX0dldEZpbGVEYXRhIChBdWRpb0ZpbGVNYW5hZ2VyICphZm0sIHZvaWQqKiBpbk91dERhdGEsIFVJbnQzMiAqaW5PdXREYXRhU2l6ZSkKK3sKKyAgICBpZiAoYWZtLT5tRmluaXNoZWRSZWFkaW5nRGF0YSkKKyAgICB7CisgICAgICAgICsrYWZtLT5tTnVtVGltZXNBc2tlZFNpbmNlRmluaXNoZWQ7CisgICAgICAgICppbk91dERhdGFTaXplID0gMDsKKyAgICAgICAgKmluT3V0RGF0YSA9IDA7CisgICAgICAgIHJldHVybiBub0VycjsKKyAgICB9CisgICAgCisgICAgaWYgKGFmbS0+bVJlYWRGcm9tRmlyc3RCdWZmZXIgPT0gYWZtLT5tV3JpdGVUb0ZpcnN0QnVmZmVyKSB7CisgICAgICAgICNpZiBERUJVRworICAgICAgICBwcmludGYgKCIqICogKiAqICogKiAqIENhbid0IGtlZXAgdXAgd2l0aCByZWFkaW5nIGZpbGVcbiIpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgCisgICAgICAgIGFmbS0+bVBhcmVudC0+RG9Ob3RpZmljYXRpb24gKGFmbS0+bVBhcmVudCwga0F1ZGlvRmlsZVBsYXlFcnJfRmlsZVBsYXlVbmRlcnJ1bik7CisgICAgICAgICppbk91dERhdGFTaXplID0gMDsKKyAgICAgICAgKmluT3V0RGF0YSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmluT3V0RGF0YVNpemUgPSBhZm0tPm1DaHVua1NpemU7CisgICAgICAgICppbk91dERhdGEgPSBhZm0tPm1SZWFkRnJvbUZpcnN0QnVmZmVyID8gYWZtLT5tRmlsZUJ1ZmZlciA6IChhZm0tPm1GaWxlQnVmZmVyICsgYWZtLT5tQ2h1bmtTaXplKTsKKyAgICB9CisKKyAgICBhZm0tPm1Mb2NrVW5zdWNjZXNzZnVsID0gIXNSZWFkZXJUaHJlYWQtPlRyeU5leHRSZWFkIChzUmVhZGVyVGhyZWFkLCBhZm0pOworICAgIAorICAgIGFmbS0+bVJlYWRGcm9tRmlyc3RCdWZmZXIgPSAhYWZtLT5tUmVhZEZyb21GaXJzdEJ1ZmZlcjsKKworICAgIHJldHVybiBub0VycjsKK30KKworc3RhdGljIHZvaWQgICAgQXVkaW9GaWxlTWFuYWdlcl9BZnRlclJlbmRlciAoQXVkaW9GaWxlTWFuYWdlciAqYWZtKQoreworICAgIGlmIChhZm0tPm1OdW1UaW1lc0Fza2VkU2luY2VGaW5pc2hlZCA+IDApCisgICAgeworICAgICAgICBpbnQgZGlkTG9jayA9IDA7CisgICAgICAgIFNETE9TWENBR3VhcmQgKmd1YXJkID0gc1JlYWRlclRocmVhZC0+R2V0R3VhcmQoc1JlYWRlclRocmVhZCk7CisgICAgICAgIGlmIChndWFyZC0+VHJ5KGd1YXJkLCAmZGlkTG9jaykpIHsKKyAgICAgICAgICAgIGFmbS0+bVBhcmVudC0+RG9Ob3RpZmljYXRpb24gKGFmbS0+bVBhcmVudCwga0F1ZGlvRmlsZVBsYXlfRmlsZUlzRmluaXNoZWQpOworICAgICAgICAgICAgaWYgKGRpZExvY2spCisgICAgICAgICAgICAgICAgZ3VhcmQtPlVubG9jayhndWFyZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWZtLT5tTG9ja1Vuc3VjY2Vzc2Z1bCkKKyAgICAgICAgYWZtLT5tTG9ja1Vuc3VjY2Vzc2Z1bCA9ICFzUmVhZGVyVGhyZWFkLT5UcnlOZXh0UmVhZCAoc1JlYWRlclRocmVhZCwgYWZtKTsKK30KKworc3RhdGljIHZvaWQgICAgQXVkaW9GaWxlTWFuYWdlcl9TZXRQb3NpdGlvbiAoQXVkaW9GaWxlTWFuYWdlciAqYWZtLCBTSW50NjQgcG9zKQoreworICAgIGlmIChwb3MgPCAwIHx8IHBvcyA+PSBhZm0tPm1GaWxlTGVuZ3RoKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoIkF1ZGlvRmlsZU1hbmFnZXI6OlNldFBvc2l0aW9uIC0gcG9zaXRpb24gaW52YWxpZDogJWQgZmlsZWxlbj0lZFxuIiwgCisgICAgICAgICAgICAodW5zaWduZWQgaW50KXBvcywgKHVuc2lnbmVkIGludClhZm0tPm1GaWxlTGVuZ3RoKTsKKyAgICAgICAgcG9zID0gMDsKKyAgICB9CisgICAgICAgIAorICAgIGFmbS0+bVJlYWRGaWxlUG9zaXRpb24gPSBwb3M7Cit9CisgICAgCitzdGF0aWMgdm9pZCAgICBBdWRpb0ZpbGVNYW5hZ2VyX1NldEVuZE9mRmlsZSAoQXVkaW9GaWxlTWFuYWdlciAqYWZtLCBTSW50NjQgcG9zKQoreworICAgIGlmIChwb3MgPD0gMCB8fCBwb3MgPiBhZm0tPm1GaWxlTGVuZ3RoKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoIkF1ZGlvRmlsZU1hbmFnZXI6OlNldEVuZE9mRmlsZSAtIHBvc2l0aW9uIGJleW9uZCBhY3R1YWwgZW9mXG4iKTsKKyAgICAgICAgcG9zID0gYWZtLT5tRmlsZUxlbmd0aDsKKyAgICB9CisgICAgCisgICAgYWZtLT5tRmlsZUxlbmd0aCA9IHBvczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKkF1ZGlvRmlsZU1hbmFnZXJfR2V0RmlsZUJ1ZmZlcihBdWRpb0ZpbGVNYW5hZ2VyICphZm0pCit7CisgICAgcmV0dXJuIGFmbS0+bUZpbGVCdWZmZXI7Cit9CisKK2NvbnN0IEF1ZGlvRmlsZVBsYXllciAqQXVkaW9GaWxlTWFuYWdlcl9HZXRQYXJlbnQoQXVkaW9GaWxlTWFuYWdlciAqYWZtKQoreworICAgIHJldHVybiBhZm0tPm1QYXJlbnQ7Cit9CisKK3N0YXRpYyBpbnQgQXVkaW9GaWxlTWFuYWdlcl9HZXRCeXRlQ291bnRlcihBdWRpb0ZpbGVNYW5hZ2VyICphZm0pCit7CisgICAgcmV0dXJuIGFmbS0+bUJ5dGVDb3VudGVyOworfQorCitzdGF0aWMgT1NTdGF0dXMgICAgQXVkaW9GaWxlTWFuYWdlcl9GaWxlSW5wdXRQcm9jICh2b2lkICAgICAgICAgICAgICAgICAgKmluUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyAgICAgICppb0FjdGlvbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAgICAgICAgICAgICppblRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1c051bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bWJlckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJMaXN0ICAgICAgICAgICAgICAgICAqaW9EYXRhKQoreworICAgIEF1ZGlvRmlsZU1hbmFnZXIqIGFmbSA9IChBdWRpb0ZpbGVNYW5hZ2VyKilpblJlZkNvbjsKKyAgICByZXR1cm4gYWZtLT5SZW5kZXIoYWZtLCBpb0RhdGEpOworfQorCitzdGF0aWMgT1NTdGF0dXMgICAgQXVkaW9GaWxlTWFuYWdlcl9SZW5kZXIgKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSwgQXVkaW9CdWZmZXJMaXN0ICppb0RhdGEpCit7CisgICAgT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7CisgICAgQXVkaW9CdWZmZXIgKmFidWY7CisgICAgVUludDMyIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW9EYXRhLT5tTnVtYmVyQnVmZmVyczsgaSsrKSB7CisgICAgICAgIGFidWYgPSAmaW9EYXRhLT5tQnVmZmVyc1tpXTsKKyAgICAgICAgaWYgKGFmbS0+bUJ1ZmZlck9mZnNldCA+PSBhZm0tPm1CdWZmZXJTaXplKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhZm0tPkdldEZpbGVEYXRhKGFmbSwgJmFmbS0+bVRtcEJ1ZmZlciwgJmFmbS0+bUJ1ZmZlclNpemUpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIkF1ZGlvQ29udmVydGVyRmlsbEJ1ZmZlcjolbGRcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgYWZtLT5tUGFyZW50LT5Eb05vdGlmaWNhdGlvbihhZm0tPm1QYXJlbnQsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWZtLT5tQnVmZmVyT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhYnVmLT5tRGF0YUJ5dGVTaXplID4gYWZtLT5tQnVmZmVyU2l6ZSAtIGFmbS0+bUJ1ZmZlck9mZnNldCkKKyAgICAgICAgICAgIGFidWYtPm1EYXRhQnl0ZVNpemUgPSBhZm0tPm1CdWZmZXJTaXplIC0gYWZtLT5tQnVmZmVyT2Zmc2V0OworICAgICAgICBhYnVmLT5tRGF0YSA9IChjaGFyICopYWZtLT5tVG1wQnVmZmVyICsgYWZtLT5tQnVmZmVyT2Zmc2V0OworICAgICAgICBhZm0tPm1CdWZmZXJPZmZzZXQgKz0gYWJ1Zi0+bURhdGFCeXRlU2l6ZTsKKyAgICAKKyAgICAgICAgYWZtLT5tQnl0ZUNvdW50ZXIgKz0gYWJ1Zi0+bURhdGFCeXRlU2l6ZTsKKyAgICAgICAgYWZtLT5BZnRlclJlbmRlcihhZm0pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3ZvaWQgZGVsZXRlX0F1ZGlvRmlsZU1hbmFnZXIgKEF1ZGlvRmlsZU1hbmFnZXIgKmFmbSkKK3sKKyAgICBpZiAoYWZtICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGFmbS0+bUZpbGVCdWZmZXIpIHsKKyAgICAgICAgICAgIGZyZWUoYWZtLT5tRmlsZUJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBTRExfZnJlZShhZm0pOworICAgIH0KK30KKworCitBdWRpb0ZpbGVNYW5hZ2VyICpuZXdfQXVkaW9GaWxlTWFuYWdlcihBdWRpb0ZpbGVQbGF5ZXIgKmluUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ludDE2ICAgICAgICAgIGluRm9ya1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJbnQ2NCAgICAgICAgICBpbkZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgaW5DaHVua1NpemUpCit7CisgICAgQXVkaW9GaWxlTWFuYWdlciAqYWZtOworCisgICAgaWYgKHNSZWFkZXJUaHJlYWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNSZWFkZXJUaHJlYWQgPSBuZXdfRmlsZVJlYWRlclRocmVhZCgpOworICAgICAgICBpZiAoc1JlYWRlclRocmVhZCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYWZtID0gKEF1ZGlvRmlsZU1hbmFnZXIgKikgU0RMX21hbGxvYyhzaXplb2YgKEF1ZGlvRmlsZU1hbmFnZXIpKTsKKyAgICBpZiAoYWZtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNETF9tZW1zZXQoYWZtLCAnXDAnLCBzaXplb2YgKCphZm0pKTsKKworICAgICNkZWZpbmUgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKG0pIGFmbS0+bSA9IEF1ZGlvRmlsZU1hbmFnZXJfIyNtCisgICAgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKERpc2Nvbm5lY3QpOworICAgIFNFVF9BVURJT0ZJTEVNQU5BR0VSX01FVEhPRChEb0Nvbm5lY3QpOworICAgIFNFVF9BVURJT0ZJTEVNQU5BR0VSX01FVEhPRChSZWFkKTsKKyAgICBTRVRfQVVESU9GSUxFTUFOQUdFUl9NRVRIT0QoR2V0RmlsZUJ1ZmZlcik7CisgICAgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKEdldFBhcmVudCk7CisgICAgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKFNldFBvc2l0aW9uKTsKKyAgICBTRVRfQVVESU9GSUxFTUFOQUdFUl9NRVRIT0QoR2V0Qnl0ZUNvdW50ZXIpOworICAgIFNFVF9BVURJT0ZJTEVNQU5BR0VSX01FVEhPRChTZXRFbmRPZkZpbGUpOworICAgIFNFVF9BVURJT0ZJTEVNQU5BR0VSX01FVEhPRChSZW5kZXIpOworICAgIFNFVF9BVURJT0ZJTEVNQU5BR0VSX01FVEhPRChHZXRGaWxlRGF0YSk7CisgICAgU0VUX0FVRElPRklMRU1BTkFHRVJfTUVUSE9EKEFmdGVyUmVuZGVyKTsKKyAgICBTRVRfQVVESU9GSUxFTUFOQUdFUl9NRVRIT0QoRmlsZUlucHV0UHJvYyk7CisgICAgI3VuZGVmIFNFVF9BVURJT0ZJTEVNQU5BR0VSX01FVEhPRAorCisgICAgYWZtLT5tUGFyZW50ID0gaW5QYXJlbnQ7CisgICAgYWZtLT5tRm9ya1JlZk51bSA9IGluRm9ya1JlZk51bTsKKyAgICBhZm0tPm1CdWZmZXJTaXplID0gaW5DaHVua1NpemU7CisgICAgYWZtLT5tQnVmZmVyT2Zmc2V0ID0gaW5DaHVua1NpemU7CisgICAgYWZtLT5tQ2h1bmtTaXplID0gaW5DaHVua1NpemU7CisgICAgYWZtLT5tRmlsZUxlbmd0aCA9IGluRmlsZUxlbmd0aDsKKyAgICBhZm0tPm1GaWxlQnVmZmVyID0gKGNoYXIqKSBTRExfbWFsbG9jKGFmbS0+bUNodW5rU2l6ZSAqIDIpOworICAgIEZTR2V0Rm9ya1Bvc2l0aW9uKGFmbS0+bUZvcmtSZWZOdW0sICZhZm0tPm1BdWRpb0RhdGFPZmZzZXQpOworICAgIGFzc2VydCAoYWZtLT5tRmlsZUJ1ZmZlciAhPSBOVUxMKTsKKyAgICByZXR1cm4gYWZtOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL21hY29zeC9DRFBsYXllci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvQ0RQbGF5ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI4N2NkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvQ0RQbGF5ZXIuYwpAQCAtMCwwICsxLDYzNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJDRFBsYXllci5oIgorI2luY2x1ZGUgIkF1ZGlvRmlsZVBsYXllci5oIgorI2luY2x1ZGUgIlNETE9TWENBR3VhcmQuaCIKKworLyogd2UncmUgZXhwb3J0aW5nIHRoZXNlIGZ1bmN0aW9ucyBpbnRvIEMgbGFuZCBmb3IgU0RMX3N5c2Nkcm9tLmMgKi8KKy8qZXh0ZXJuICJDIiB7Ki8KKworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBDb25zdGFudHMKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjZGVmaW5lIGtBdWRpb0NERmlsZXN5c3RlbUlEICAgKFVJbnQxNikoKCdKJyA8PCA4KSB8ICdIJykgLyogJ0pIJzsgdGhpcyBhdm9pZHMgY29tcGlsZXIgd2FybmluZyAqLworCisvKiBYTUwgUExpc3Qga2V5cyAqLworI2RlZmluZSBrUmF3VE9DRGF0YVN0cmluZyAgICAgICAgICAgIkZvcm1hdCAweDAyIFRPQyBEYXRhIgorI2RlZmluZSBrU2Vzc2lvbnNTdHJpbmcgICAgICAgICAgICAgIlNlc3Npb25zIgorI2RlZmluZSBrU2Vzc2lvblR5cGVTdHJpbmcgICAgICAgICAgIlNlc3Npb24gVHlwZSIKKyNkZWZpbmUga1RyYWNrQXJyYXlTdHJpbmcgICAgICAgICAgICJUcmFjayBBcnJheSIKKyNkZWZpbmUga0ZpcnN0VHJhY2tJblNlc3Npb25TdHJpbmcgICAgICAiRmlyc3QgVHJhY2siCisjZGVmaW5lIGtMYXN0VHJhY2tJblNlc3Npb25TdHJpbmcgICAgICAgIkxhc3QgVHJhY2siCisjZGVmaW5lIGtMZWFkb3V0QmxvY2tTdHJpbmcgICAgICAgICAiTGVhZG91dCBCbG9jayIKKyNkZWZpbmUga0RhdGFLZXlTdHJpbmcgICAgICAgICAgICAgICJEYXRhIgorI2RlZmluZSBrUG9pbnRLZXlTdHJpbmcgICAgICAgICAgICAgIlBvaW50IgorI2RlZmluZSBrU2Vzc2lvbk51bWJlcktleVN0cmluZyAgICAgICAgICJTZXNzaW9uIE51bWJlciIKKyNkZWZpbmUga1N0YXJ0QmxvY2tLZXlTdHJpbmcgICAgICAgICAgICAiU3RhcnQgQmxvY2siICAgCisgICAgCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIEdsb2JhbHMKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjcHJhZ21hIG1hcmsgLS0gR2xvYmFscyAtLQorCitzdGF0aWMgaW50ICAgICAgICAgICAgIHBsYXlCYWNrV2FzSW5pdCA9IDA7CitzdGF0aWMgQXVkaW9Vbml0ICAgICAgICB0aGVVbml0Oworc3RhdGljIEF1ZGlvRmlsZVBsYXllciogdGhlUGxheWVyID0gTlVMTDsKK3N0YXRpYyBDRFBsYXllckNvbXBsZXRpb25Qcm9jICAgY29tcGxldGlvblByb2MgPSBOVUxMOworc3RhdGljIFNETF9tdXRleCAgICAgICAqYXBpTXV0ZXggPSBOVUxMOworc3RhdGljIFNETF9zZW0gICAgICAgICAqY2FsbGJhY2tTZW07CitzdGF0aWMgU0RMX0NEKiAgICAgICAgICB0aGVDRFJPTTsKKworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBQcm90b3R5cGVzCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworI3ByYWdtYSBtYXJrIC0tIFByb3RvdHlwZXMgLS0KKworc3RhdGljIE9TU3RhdHVzIENoZWNrSW5pdCAoKTsKKworc3RhdGljIHZvaWQgICAgIEZpbGVQbGF5Tm90aWZpY2F0aW9uSGFuZGxlciAodm9pZCogaW5SZWZDb24sIE9TU3RhdHVzIGluU3RhdHVzKTsKKworc3RhdGljIGludCAgICAgIFJ1bkNhbGxCYWNrVGhyZWFkICh2b2lkKiBpblJlZkNvbik7CisKKworI3ByYWdtYSBtYXJrIC0tIFB1YmxpYyBGdW5jdGlvbnMgLS0KKwordm9pZCAgICAgTG9jayAoKQoreworICAgIGlmICghYXBpTXV0ZXgpIHsKKyAgICAgICAgYXBpTXV0ZXggPSBTRExfQ3JlYXRlTXV0ZXgoKTsKKyAgICB9CisgICAgU0RMX211dGV4UChhcGlNdXRleCk7Cit9CisKK3ZvaWQgICAgIFVubG9jayAoKQoreworICAgIFNETF9tdXRleFYoYXBpTXV0ZXgpOworfQorCitpbnQgRGV0ZWN0QXVkaW9DRFZvbHVtZXMoRlNWb2x1bWVSZWZOdW0gKnZvbHVtZXMsIGludCBudW1Wb2x1bWVzKQoreworICAgIGludCB2b2x1bWVJbmRleDsKKyAgICBpbnQgY2RWb2x1bWVDb3VudCA9IDA7CisgICAgT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7CisgICAgCisgICAgZm9yICh2b2x1bWVJbmRleCA9IDE7IHJlc3VsdCA9PSBub0VyciB8fCByZXN1bHQgIT0gbnN2RXJyOyB2b2x1bWVJbmRleCsrKQorICAgIHsKKyAgICAgICAgRlNWb2x1bWVSZWZOdW0gIGFjdHVhbFZvbHVtZTsKKyAgICAgICAgRlNWb2x1bWVJbmZvICAgIHZvbHVtZUluZm87CisgICAgICAgIAorICAgICAgICBtZW1zZXQgKCZ2b2x1bWVJbmZvLCAwLCBzaXplb2Yodm9sdW1lSW5mbykpOworICAgICAgICAKKyAgICAgICAgcmVzdWx0ID0gRlNHZXRWb2x1bWVJbmZvIChrRlNJbnZhbGlkVm9sdW1lUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZTVm9sSW5mb0ZTSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAKKyAgICAgICAgIAorICAgICAgICBpZiAocmVzdWx0ID09IG5vRXJyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodm9sdW1lSW5mby5maWxlc3lzdGVtSUQgPT0ga0F1ZGlvQ0RGaWxlc3lzdGVtSUQpIC8qIEl0J3MgYW4gYXVkaW8gQ0QgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodm9sdW1lcyAhPSBOVUxMICYmIGNkVm9sdW1lQ291bnQgPCBudW1Wb2x1bWVzKQorICAgICAgICAgICAgICAgICAgICB2b2x1bWVzW2NkVm9sdW1lQ291bnRdID0gYWN0dWFsVm9sdW1lOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2RWb2x1bWVDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEknbSBjb21tZW50aW5nIHRoaXMgb3V0IGJlY2F1c2UgaXQgc2VlbXMgdG8gYmUgaGFybWxlc3MgKi8KKyAgICAgICAgICAgIC8qU0RMX1NldEVycm9yICgiRGV0ZWN0QXVkaW9DRFZvbHVtZXM6IEZTR2V0Vm9sdW1lSW5mbyByZXR1cm5lZCAlZCIsIHJlc3VsdCk7Ki8KKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgcmV0dXJuIGNkVm9sdW1lQ291bnQ7Cit9CisKK2ludCBSZWFkVE9DRGF0YSAoRlNWb2x1bWVSZWZOdW0gdGhlVm9sdW1lLCBTRExfQ0QgKnRoZUNEKQoreworICAgIEhGU1VuaVN0cjI1NSAgICAgIGRhdGFGb3JrTmFtZTsKKyAgICBPU1N0YXR1cyAgICAgICAgICB0aGVFcnI7CisgICAgRlNJT1JlZk51bSAgICAgICAgZm9ya1JlZk51bTsKKyAgICBTSW50NjQgICAgICAgICAgICBmb3JrU2l6ZTsKKyAgICBQdHIgICAgICAgICAgICAgICBmb3JrRGF0YSA9IDA7CisgICAgQnl0ZUNvdW50ICAgICAgICAgYWN0dWFsUmVhZDsKKyAgICBDRkRhdGFSZWYgICAgICAgICBkYXRhUmVmID0gMDsKKyAgICBDRlByb3BlcnR5TGlzdFJlZiBwcm9wZXJ0eUxpc3RSZWYgPSAwOworICAgIEZTUmVmUGFyYW0gICAgICBmc1JlZlBCOworICAgIEZTUmVmICAgICAgICAgICB0b2NQbGlzdEZTUmVmOworICAgIEZTUmVmICAgICAgICAgICByb290UmVmOworICAgIGNvbnN0IGNoYXIqIGVycm9yID0gIlVuc3BlY2lmaWVkIEVycm9yIjsKKyAgICBjb25zdCBVbmlDaGFyIHVuaU5hbWVbXSA9IHsgJy4nLCdUJywnTycsJ0MnLCcuJywncCcsJ2wnLCdpJywncycsJ3QnIH07CisKKyAgICB0aGVFcnIgPSBGU0dldFZvbHVtZUluZm8odGhlVm9sdW1lLCAwLCAwLCBrRlNWb2xJbmZvTm9uZSwgMCwgMCwgJnJvb3RSZWYpOworICAgIGlmKHRoZUVyciAhPSBub0VycikgeworICAgICAgICBlcnJvciA9ICJGU0dldFZvbHVtZUluZm8iOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgU0RMX21lbXNldCgmZnNSZWZQQiwgJ1wwJywgc2l6ZW9mIChmc1JlZlBCKSk7CisKKyAgICAvKiBnZXQgc3R1ZmYgZnJvbSAuVE9DLnBsaXN0ICovCisgICAgZnNSZWZQQi5yZWYgPSAmcm9vdFJlZjsKKyAgICBmc1JlZlBCLm5ld1JlZiA9ICZ0b2NQbGlzdEZTUmVmOworICAgIGZzUmVmUEIubmFtZUxlbmd0aCA9IHNpemVvZiAodW5pTmFtZSkgLyBzaXplb2YgKHVuaU5hbWVbMF0pOworICAgIGZzUmVmUEIubmFtZSA9IHVuaU5hbWU7CisgICAgZnNSZWZQQi50ZXh0RW5jb2RpbmdIaW50ID0ga1RleHRFbmNvZGluZ1Vua25vd247CisKKyAgICB0aGVFcnIgPSBQQk1ha2VGU1JlZlVuaWNvZGVTeW5jICgmZnNSZWZQQik7CisgICAgaWYodGhlRXJyICE9IG5vRXJyKSB7CisgICAgICAgIGVycm9yID0gIlBCTWFrZUZTUmVmVW5pY29kZVN5bmMiOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIAorICAgIC8qIExvYWQgYW5kIHBhcnNlIHRoZSBUT0MgWE1MIGRhdGEgKi8KKworICAgIHRoZUVyciA9IEZTR2V0RGF0YUZvcmtOYW1lICgmZGF0YUZvcmtOYW1lKTsKKyAgICBpZiAodGhlRXJyICE9IG5vRXJyKSB7CisgICAgICAgIGVycm9yID0gIkZTR2V0RGF0YUZvcmtOYW1lIjsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICAKKyAgICB0aGVFcnIgPSBGU09wZW5Gb3JrICgmdG9jUGxpc3RGU1JlZiwgZGF0YUZvcmtOYW1lLmxlbmd0aCwgZGF0YUZvcmtOYW1lLnVuaWNvZGUsIGZzUmRQZXJtLCAmZm9ya1JlZk51bSk7CisgICAgaWYgKHRoZUVyciAhPSBub0VycikgeworICAgICAgICBlcnJvciA9ICJGU09wZW5Gb3JrIjsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICAKKyAgICB0aGVFcnIgPSBGU0dldEZvcmtTaXplIChmb3JrUmVmTnVtLCAmZm9ya1NpemUpOworICAgIGlmICh0aGVFcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgZXJyb3IgPSAiRlNHZXRGb3JrU2l6ZSI7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgCisgICAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgZm9yIHRoZSBYTUwgZGF0YSAqLworICAgIGZvcmtEYXRhID0gTmV3UHRyIChmb3JrU2l6ZSk7CisgICAgaWYoZm9ya0RhdGEgPT0gTlVMTCkgeworICAgICAgICBlcnJvciA9ICJOZXdQdHIiOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIAorICAgIHRoZUVyciA9IEZTUmVhZEZvcmsgKGZvcmtSZWZOdW0sIGZzRnJvbVN0YXJ0LCAwIC8qIG9mZnNldCBsb2NhdGlvbiAqLywgZm9ya1NpemUsIGZvcmtEYXRhLCAmYWN0dWFsUmVhZCk7CisgICAgaWYodGhlRXJyICE9IG5vRXJyKSB7CisgICAgICAgIGVycm9yID0gIkZTUmVhZEZvcmsiOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIAorICAgIGRhdGFSZWYgPSBDRkRhdGFDcmVhdGUgKGtDRkFsbG9jYXRvckRlZmF1bHQsIChVSW50OCAqKWZvcmtEYXRhLCBmb3JrU2l6ZSk7CisgICAgaWYoZGF0YVJlZiA9PSAwKSB7CisgICAgICAgIGVycm9yID0gIkNGRGF0YUNyZWF0ZSI7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBwcm9wZXJ0eUxpc3RSZWYgPSBDRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhIChrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGUHJvcGVydHlMaXN0SW1tdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChwcm9wZXJ0eUxpc3RSZWYgPT0gTlVMTCkgeworICAgICAgICBlcnJvciA9ICJDRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhIjsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIE5vdyB3ZSBnb3QgdGhlIFByb3BlcnR5IExpc3QgaW4gbWVtb3J5LiBQYXJzZSBpdC4gKi8KKyAgICAKKyAgICAvKiBGaXJzdCwgbWFrZSBzdXJlIHRoZSByb290IGl0ZW0gaXMgYSBDRkRpY3Rpb25hcnkuIElmIG5vdCwgcmVsZWFzZSBhbmQgYmFpbC4gKi8KKyAgICBpZihDRkdldFR5cGVJRChwcm9wZXJ0eUxpc3RSZWYpPT0gQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKCkpCisgICAgeworICAgICAgICBDRkRpY3Rpb25hcnlSZWYgZGljdFJlZiA9IChDRkRpY3Rpb25hcnlSZWYpcHJvcGVydHlMaXN0UmVmOworICAgICAgICAKKyAgICAgICAgQ0ZEYXRhUmVmICAgdGhlUmF3VE9DRGF0YVJlZjsKKyAgICAgICAgQ0ZBcnJheVJlZiAgdGhlU2Vzc2lvbkFycmF5UmVmOworICAgICAgICBDRkluZGV4ICAgICBudW1TZXNzaW9uczsKKyAgICAgICAgQ0ZJbmRleCAgICAgaW5kZXg7CisgICAgICAgIAorICAgICAgICAvKiBUaGlzIGlzIGhvdyB3ZSBnZXQgdGhlIFJhdyBUT0MgRGF0YSAqLworICAgICAgICB0aGVSYXdUT0NEYXRhUmVmID0gKENGRGF0YVJlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZSAoZGljdFJlZiwgQ0ZTVFIoa1Jhd1RPQ0RhdGFTdHJpbmcpKTsKKyAgICAgICAgCisgICAgICAgIC8qIEdldCB0aGUgc2Vzc2lvbiBhcnJheSBpbmZvLiAqLworICAgICAgICB0aGVTZXNzaW9uQXJyYXlSZWYgPSAoQ0ZBcnJheVJlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZSAoZGljdFJlZiwgQ0ZTVFIoa1Nlc3Npb25zU3RyaW5nKSk7CisgICAgICAgIAorICAgICAgICAvKiBGaW5kIG91dCBob3cgbWFueSBzZXNzaW9ucyB0aGVyZSBhcmUuICovCisgICAgICAgIG51bVNlc3Npb25zID0gQ0ZBcnJheUdldENvdW50ICh0aGVTZXNzaW9uQXJyYXlSZWYpOworICAgICAgICAKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHRyYWNrcyB0byAwICovCisgICAgICAgIHRoZUNELT5udW10cmFja3MgPSAwOworICAgICAgICAKKyAgICAgICAgLyogSXRlcmF0ZSBvdmVyIGFsbCBzZXNzaW9ucywgY29sbGVjdGluZyB0aGUgdHJhY2sgZGF0YSAqLworICAgICAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IG51bVNlc3Npb25zOyBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWYgdGhlU2Vzc2lvbkRpY3Q7CisgICAgICAgICAgICBDRk51bWJlclJlZiAgICAgbGVhZG91dEJsb2NrOworICAgICAgICAgICAgQ0ZBcnJheVJlZiAgICAgIHRyYWNrQXJyYXk7CisgICAgICAgICAgICBDRkluZGV4ICAgICAgICAgbnVtVHJhY2tzOworICAgICAgICAgICAgQ0ZJbmRleCAgICAgICAgIHRyYWNrSW5kZXg7CisgICAgICAgICAgICBVSW50MzIgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICB0aGVTZXNzaW9uRGljdCAgICAgID0gKENGRGljdGlvbmFyeVJlZikgQ0ZBcnJheUdldFZhbHVlQXRJbmRleCAodGhlU2Vzc2lvbkFycmF5UmVmLCBpbmRleCk7CisgICAgICAgICAgICBsZWFkb3V0QmxvY2sgICAgICAgID0gKENGTnVtYmVyUmVmKSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAodGhlU2Vzc2lvbkRpY3QsIENGU1RSKGtMZWFkb3V0QmxvY2tTdHJpbmcpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJhY2tBcnJheSA9IChDRkFycmF5UmVmKUNGRGljdGlvbmFyeUdldFZhbHVlICh0aGVTZXNzaW9uRGljdCwgQ0ZTVFIoa1RyYWNrQXJyYXlTdHJpbmcpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbnVtVHJhY2tzID0gQ0ZBcnJheUdldENvdW50ICh0cmFja0FycmF5KTsKKworICAgICAgICAgICAgZm9yKHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbnVtVHJhY2tzOyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmIHRoZVRyYWNrRGljdDsKKyAgICAgICAgICAgICAgICBDRk51bWJlclJlZiAgICAgdHJhY2tOdW1iZXI7CisgICAgICAgICAgICAgICAgQ0ZOdW1iZXJSZWYgICAgIHNlc3Npb25OdW1iZXI7CisgICAgICAgICAgICAgICAgQ0ZOdW1iZXJSZWYgICAgIHN0YXJ0QmxvY2s7CisgICAgICAgICAgICAgICAgQ0ZCb29sZWFuUmVmICAgIGlzRGF0YVRyYWNrOworICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICB2YWx1ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0aGVUcmFja0RpY3QgID0gKENGRGljdGlvbmFyeVJlZikgQ0ZBcnJheUdldFZhbHVlQXRJbmRleCAodHJhY2tBcnJheSwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdHJhY2tOdW1iZXIgICA9IChDRk51bWJlclJlZikgIENGRGljdGlvbmFyeUdldFZhbHVlICh0aGVUcmFja0RpY3QsIENGU1RSKGtQb2ludEtleVN0cmluZykpOworICAgICAgICAgICAgICAgIHNlc3Npb25OdW1iZXIgPSAoQ0ZOdW1iZXJSZWYpICBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAodGhlVHJhY2tEaWN0LCBDRlNUUihrU2Vzc2lvbk51bWJlcktleVN0cmluZykpOworICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2sgICAgPSAoQ0ZOdW1iZXJSZWYpICBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAodGhlVHJhY2tEaWN0LCBDRlNUUihrU3RhcnRCbG9ja0tleVN0cmluZykpOworICAgICAgICAgICAgICAgIGlzRGF0YVRyYWNrICAgPSAoQ0ZCb29sZWFuUmVmKSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAodGhlVHJhY2tEaWN0LCBDRlNUUihrRGF0YUtleVN0cmluZykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBGaWxsIGluIHRoZSBTRExfQ0Qgc3RydWN0ICovCisgICAgICAgICAgICAgICAgaW50IGlkeCA9IHRoZUNELT5udW10cmFja3MrKzsKKworICAgICAgICAgICAgICAgIENGTnVtYmVyR2V0VmFsdWUgKHRyYWNrTnVtYmVyLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIHRoZUNELT50cmFja1tpZHhdLmlkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ0ZOdW1iZXJHZXRWYWx1ZSAoc3RhcnRCbG9jaywga0NGTnVtYmVyU0ludDMyVHlwZSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICB0aGVDRC0+dHJhY2tbaWR4XS5vZmZzZXQgPSB2YWx1ZTsKKworICAgICAgICAgICAgICAgIHRoZUNELT50cmFja1tpZHhdLnR5cGUgPSAoaXNEYXRhVHJhY2sgPT0ga0NGQm9vbGVhblRydWUpID8gU0RMX0RBVEFfVFJBQ0sgOiBTRExfQVVESU9fVFJBQ0s7CisKKyAgICAgICAgICAgICAgICAvKiBTaW5jZSB0aGUgdHJhY2sgbGVuZ3RocyBhcmUgbm90IHN0b3JlZCBpbiAuVE9DLnBsaXN0IHdlIGNvbXB1dGUgdGhlbS4gKi8KKyAgICAgICAgICAgICAgICBpZiAodHJhY2tJbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhlQ0QtPnRyYWNrW2lkeC0xXS5sZW5ndGggPSB0aGVDRC0+dHJhY2tbaWR4XS5vZmZzZXQgLSB0aGVDRC0+dHJhY2tbaWR4LTFdLm9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIENvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgbGFzdCB0cmFjayAqLworICAgICAgICAgICAgQ0ZOdW1iZXJHZXRWYWx1ZSAobGVhZG91dEJsb2NrLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmdmFsdWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICB0aGVDRC0+dHJhY2tbdGhlQ0QtPm51bXRyYWNrcy0xXS5sZW5ndGggPSAKKyAgICAgICAgICAgICAgICB2YWx1ZSAtIHRoZUNELT50cmFja1t0aGVDRC0+bnVtdHJhY2tzLTFdLm9mZnNldDsKKworICAgICAgICAgICAgLyogU2V0IG9mZnNldCB0byBsZWFkb3V0IHRyYWNrICovCisgICAgICAgICAgICB0aGVDRC0+dHJhY2tbdGhlQ0QtPm51bXRyYWNrc10ub2Zmc2V0ID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAKKyAgICB9CisKKyAgICB0aGVFcnIgPSAwOworICAgIGdvdG8gY2xlYW51cDsKK2JhaWw6CisgICAgU0RMX1NldEVycm9yICgiUmVhZFRPQ0RhdGE6ICVzIHJldHVybmVkICVkIiwgZXJyb3IsIHRoZUVycik7CisgICAgdGhlRXJyID0gLTE7CitjbGVhbnVwOgorCisgICAgaWYgKHByb3BlcnR5TGlzdFJlZiAhPSBOVUxMKQorICAgICAgICBDRlJlbGVhc2UocHJvcGVydHlMaXN0UmVmKTsKKyAgICBpZiAoZGF0YVJlZiAhPSBOVUxMKQorICAgICAgICBDRlJlbGVhc2UoZGF0YVJlZik7CisgICAgaWYgKGZvcmtEYXRhICE9IE5VTEwpCisgICAgICAgIERpc3Bvc2VQdHIoZm9ya0RhdGEpOworICAgICAgICAKKyAgICBGU0Nsb3NlRm9yayAoZm9ya1JlZk51bSk7CisKKyAgICByZXR1cm4gdGhlRXJyOworfQorCitpbnQgTGlzdFRyYWNrRmlsZXMgKEZTVm9sdW1lUmVmTnVtIHRoZVZvbHVtZSwgRlNSZWYgKnRyYWNrRmlsZXMsIGludCBudW1UcmFja3MpCit7CisgICAgT1NTdGF0dXMgICAgICAgIHJlc3VsdCA9IC0xOworICAgIEZTSXRlcmF0b3IgICAgICBpdGVyYXRvcjsKKyAgICBJdGVtQ291bnQgICAgICAgYWN0dWFsT2JqZWN0czsKKyAgICBGU1JlZiAgICAgICAgICAgcm9vdERpcmVjdG9yeTsKKyAgICBGU1JlZiAgICAgICAgICAgcmVmOworICAgIEhGU1VuaVN0cjI1NSAgICBuYW1lU3RyOworICAgIAorICAgIHJlc3VsdCA9IEZTR2V0Vm9sdW1lSW5mbyAodGhlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRlNWb2xJbmZvRlNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm9vdERpcmVjdG9yeSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKHJlc3VsdCAhPSBub0VycikgeworICAgICAgICBTRExfU2V0RXJyb3IgKCJMaXN0VHJhY2tGaWxlczogRlNHZXRWb2x1bWVJbmZvIHJldHVybmVkICVkIiwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBGU09wZW5JdGVyYXRvciAoJnJvb3REaXJlY3RvcnksIGtGU0l0ZXJhdGVGbGF0LCAmaXRlcmF0b3IpOworICAgIGlmIChyZXN1bHQgPT0gbm9FcnIpIHsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gRlNHZXRDYXRhbG9nSW5mb0J1bGsgKGl0ZXJhdG9yLCAxLCAmYWN0dWFsT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBrRlNDYXRJbmZvTm9uZSwgTlVMTCwgJnJlZiwgTlVMTCwgJm5hbWVTdHIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBub0VycikgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmICBuYW1lOworICAgICAgICAgICAgICAgIG5hbWUgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzIChOVUxMLCBuYW1lU3RyLnVuaWNvZGUsIG5hbWVTdHIubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBMb29rIGZvciAuYWlmZiBleHRlbnNpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoQ0ZTdHJpbmdIYXNTdWZmaXggKG5hbWUsIENGU1RSKCIuYWlmZiIpKSB8fAorICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ0hhc1N1ZmZpeCAobmFtZSwgQ0ZTVFIoIi5jZGRhIikpKSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IHRoZSB0cmFjayBpZCBmcm9tIHRoZSBmaWxlbmFtZSAqLworICAgICAgICAgICAgICAgICAgICBpbnQgdHJhY2tJRCA9IDAsIGkgPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IG5hbWVTdHIubGVuZ3RoICYmICFpc2RpZ2l0KG5hbWVTdHIudW5pY29kZVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IG5hbWVTdHIubGVuZ3RoICYmIGlzZGlnaXQobmFtZVN0ci51bmljb2RlW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJRCA9IDEwICogdHJhY2tJRCArKG5hbWVTdHIudW5pY29kZVtpXSAtICcwJyk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAjaWYgREVCVUdfQ0RST00KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJGb3VuZCBBSUZGIGZvciB0cmFjayAlZDogJyVzJ1xuIiwgdHJhY2tJRCwgCisgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nR2V0Q1N0cmluZ1B0ciAobmFtZSwgQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZygpKSk7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogVHJhY2sgSUQncyBzdGFydCBhdCAxLCBidXQgd2Ugd2FudCB0byBzdGFydCBhdCAwICovCisgICAgICAgICAgICAgICAgICAgIHRyYWNrSUQtLTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCgwIDw9IHRyYWNrSUQgJiYgdHJhY2tJRCA8PSBTRExfTUFYX1RSQUNLUyk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2tJRCA8IG51bVRyYWNrcykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSAoJnRyYWNrRmlsZXNbdHJhY2tJRF0sICZyZWYsIHNpemVvZihGU1JlZikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDRlJlbGVhc2UgKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlKG5vRXJyID09IHJlc3VsdCk7CisgICAgICAgIEZTQ2xvc2VJdGVyYXRvciAoaXRlcmF0b3IpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworaW50IExvYWRGaWxlIChjb25zdCBGU1JlZiAqcmVmLCBpbnQgc3RhcnRGcmFtZSwgaW50IHN0b3BGcmFtZSkKK3sKKyAgICBpbnQgZXJyb3IgPSAtMTsKKyAgICAKKyAgICBpZiAoQ2hlY2tJbml0ICgpIDwgMCkKKyAgICAgICAgZ290byBiYWlsOworICAgIAorICAgIC8qIHJlbGVhc2UgYW55IGN1cnJlbnRseSBwbGF5aW5nIGZpbGUgKi8KKyAgICBpZiAoUmVsZWFzZUZpbGUgKCkgPCAwKQorICAgICAgICBnb3RvIGJhaWw7CisgICAgCisgICAgI2lmIERFQlVHX0NEUk9NCisgICAgcHJpbnRmICgiTG9hZEZpbGU6ICVkICVkXG4iLCBzdGFydEZyYW1lLCBzdG9wRnJhbWUpOworICAgICNlbmRpZgorICAgIAorICAgIC8qdHJ5IHsqLworICAgIAorICAgICAgICAvKiBjcmVhdGUgYSBuZXcgcGxheWVyLCBhbmQgYXR0YWNoIHRvIHRoZSBhdWRpbyB1bml0ICovCisgICAgICAgIAorICAgICAgICB0aGVQbGF5ZXIgPSBuZXdfQXVkaW9GaWxlUGxheWVyKHJlZik7CisgICAgICAgIGlmICh0aGVQbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgU0RMX1NldEVycm9yICgiTG9hZEZpbGU6IENvdWxkIG5vdCBjcmVhdGUgcGxheWVyIik7CisgICAgICAgICAgICByZXR1cm4gLTM7IC8qdGhyb3cgKC0zKTsqLworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKCF0aGVQbGF5ZXItPlNldERlc3RpbmF0aW9uKHRoZVBsYXllciwgJnRoZVVuaXQpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAKKyAgICAgICAgaWYgKHN0YXJ0RnJhbWUgPj0gMCkKKyAgICAgICAgICAgIHRoZVBsYXllci0+U2V0U3RhcnRGcmFtZSAodGhlUGxheWVyLCBzdGFydEZyYW1lKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzdG9wRnJhbWUgPj0gMCAmJiBzdG9wRnJhbWUgPiBzdGFydEZyYW1lKQorICAgICAgICAgICAgdGhlUGxheWVyLT5TZXRTdG9wRnJhbWUgKHRoZVBsYXllciwgc3RvcEZyYW1lKTsKKyAgICAgICAgCisgICAgICAgIC8qIHdlIHNldCB0aGUgbm90aWZpZXIgbGF0ZXIgKi8KKyAgICAgICAgLyp0aGVQbGF5ZXItPlNldE5vdGlmaWVyKHRoZVBsYXllciwgRmlsZVBsYXlOb3RpZmljYXRpb25IYW5kbGVyLCBOVUxMKTsqLworICAgICAgICAgICAgCisgICAgICAgIGlmICghdGhlUGxheWVyLT5Db25uZWN0KHRoZVBsYXllcikpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgCisgICAgICAgICNpZiBERUJVR19DRFJPTQorICAgICAgICB0aGVQbGF5ZXItPlByaW50KHRoZVBsYXllcik7CisgICAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICAgICAgI2VuZGlmCisgICAgLyp9CisgICAgICBjYXRjaCAoLi4uKQorICAgICAgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0qLworICAgICAgICAKKyAgICBlcnJvciA9IDA7CisKKyAgICBiYWlsOgorICAgIHJldHVybiBlcnJvcjsKK30KKworaW50IFJlbGVhc2VGaWxlICgpCit7CisgICAgaW50IGVycm9yID0gLTE7CisgICAgICAgIAorICAgIC8qIChEb24ndCBzZWUgYW55IHdheSB0aGF0IHRoZSBvcmlnaW5hbCBDKysgY29kZSBjb3VsZCB0aHJvdyBoZXJlLikgLS1yeWFuLiAqLworICAgIC8qdHJ5IHsqLworICAgICAgICBpZiAodGhlUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdGhlUGxheWVyLT5EaXNjb25uZWN0KHRoZVBsYXllcik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlbGV0ZV9BdWRpb0ZpbGVQbGF5ZXIodGhlUGxheWVyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdGhlUGxheWVyID0gTlVMTDsKKyAgICAgICAgfQorICAgIC8qfQorICAgICAgY2F0Y2ggKC4uLikKKyAgICAgIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9Ki8KKyAgICAKKyAgICBlcnJvciA9IDA7CisgICAgCisvKiAgYmFpbDogKi8KKyAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludCBQbGF5RmlsZSAoKQoreworICAgIE9TU3RhdHVzIHJlc3VsdCA9IC0xOworICAgIAorICAgIGlmIChDaGVja0luaXQgKCkgPCAwKQorICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIAorICAgIC8qdHJ5IHsqLworICAgIAorICAgICAgICAvLyBzdGFydCBwcm9jZXNzaW5nIG9mIHRoZSBhdWRpbyB1bml0CisgICAgICAgIHJlc3VsdCA9IEF1ZGlvT3V0cHV0VW5pdFN0YXJ0ICh0aGVVbml0KTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIGdvdG8gYmFpbDsgLy9USFJPV19SRVNVTFQoIlBsYXlGaWxlOiBBdWRpb091dHB1dFVuaXRTdGFydCIpCisgICAgICAgIAorICAgIC8qfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgfSovCisgICAgCisgICAgcmVzdWx0ID0gMDsKKyAgICAKK2JhaWw6CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IFBhdXNlRmlsZSAoKQoreworICAgIE9TU3RhdHVzIHJlc3VsdCA9IC0xOworICAgIAorICAgIGlmIChDaGVja0luaXQgKCkgPCAwKQorICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAKKyAgICAvKnRyeSB7Ki8KKyAgICAKKyAgICAgICAgLyogc3RvcCBwcm9jZXNzaW5nIHRoZSBhdWRpbyB1bml0ICovCisgICAgICAgIHJlc3VsdCA9IEF1ZGlvT3V0cHV0VW5pdFN0b3AgKHRoZVVuaXQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgZ290byBiYWlsOyAgLypUSFJPV19SRVNVTFQoIlBhdXNlRmlsZTogQXVkaW9PdXRwdXRVbml0U3RvcCIpKi8KKyAgICAvKn0KKyAgICAgIGNhdGNoICguLi4pCisgICAgICB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgfSovCisgICAgCisgICAgcmVzdWx0ID0gMDsKK2JhaWw6CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTZXRDb21wbGV0aW9uUHJvYyAoQ0RQbGF5ZXJDb21wbGV0aW9uUHJvYyBwcm9jLCBTRExfQ0QgKmNkcm9tKQoreworICAgIGFzc2VydCh0aGVQbGF5ZXIgIT0gTlVMTCk7CisKKyAgICB0aGVDRFJPTSA9IGNkcm9tOworICAgIGNvbXBsZXRpb25Qcm9jID0gcHJvYzsKKyAgICB0aGVQbGF5ZXItPlNldE5vdGlmaWVyICh0aGVQbGF5ZXIsIEZpbGVQbGF5Tm90aWZpY2F0aW9uSGFuZGxlciwgY2Ryb20pOworfQorCitpbnQgR2V0Q3VycmVudEZyYW1lICgpCit7ICAgIAorICAgIGludCBmcmFtZTsKKyAgICAKKyAgICBpZiAodGhlUGxheWVyID09IE5VTEwpCisgICAgICAgIGZyYW1lID0gMDsKKyAgICBlbHNlCisgICAgICAgIGZyYW1lID0gdGhlUGxheWVyLT5HZXRDdXJyZW50RnJhbWUgKHRoZVBsYXllcik7CisgICAgICAgIAorICAgIHJldHVybiBmcmFtZTsgCit9CisKKworI3ByYWdtYSBtYXJrIC0tIFByaXZhdGUgRnVuY3Rpb25zIC0tCisKK3N0YXRpYyBPU1N0YXR1cyBDaGVja0luaXQgKCkKK3sgICAgCisgICAgaWYgKHBsYXlCYWNrV2FzSW5pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7CisgICAgCisgICAgLyogQ3JlYXRlIHRoZSBjYWxsYmFjayBzZW1hcGhvcmUgKi8KKyAgICBjYWxsYmFja1NlbSA9IFNETF9DcmVhdGVTZW1hcGhvcmUoMCk7CisKKyAgICAvKiBTdGFydCBjYWxsYmFjayB0aHJlYWQgKi8KKyAgICBTRExfQ3JlYXRlVGhyZWFkKFJ1bkNhbGxCYWNrVGhyZWFkLCBOVUxMKTsKKworICAgIHsgLyp0cnkgeyovCisgICAgICAgIENvbXBvbmVudERlc2NyaXB0aW9uIGRlc2M7CisgICAgCisgICAgICAgIGRlc2MuY29tcG9uZW50VHlwZSA9IGtBdWRpb1VuaXRUeXBlX091dHB1dDsKKyAgICAgICAgZGVzYy5jb21wb25lbnRTdWJUeXBlID0ga0F1ZGlvVW5pdFN1YlR5cGVfRGVmYXVsdE91dHB1dDsKKyAgICAgICAgZGVzYy5jb21wb25lbnRNYW51ZmFjdHVyZXIgPSBrQXVkaW9Vbml0TWFudWZhY3R1cmVyX0FwcGxlOworICAgICAgICBkZXNjLmNvbXBvbmVudEZsYWdzID0gMDsKKyAgICAgICAgZGVzYy5jb21wb25lbnRGbGFnc01hc2sgPSAwOworICAgICAgICAKKyAgICAgICAgQ29tcG9uZW50IGNvbXAgPSBGaW5kTmV4dENvbXBvbmVudCAoTlVMTCwgJmRlc2MpOworICAgICAgICBpZiAoY29tcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBTRExfU2V0RXJyb3IgKCJDaGVja0luaXQ6IEZpbmROZXh0Q29tcG9uZW50IHJldHVybmVkIE5VTEwiKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAtMTsgLy90aHJvdyhpbnRlcm5hbENvbXBvbmVudEVycik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJlc3VsdCA9IE9wZW5BQ29tcG9uZW50IChjb21wLCAmdGhlVW5pdCk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gLTE7IC8vVEhST1dfUkVTVUxUKCJDaGVja0luaXQ6IE9wZW5BQ29tcG9uZW50IikKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIHlvdSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIG91dHB1dCB1bml0IGJlZm9yZSB5b3Ugc2V0IGl0IGFzIGEgZGVzdGluYXRpb24KKyAgICAgICAgcmVzdWx0ID0gQXVkaW9Vbml0SW5pdGlhbGl6ZSAodGhlVW5pdCk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gLTE7IC8vVEhST1dfUkVTVUxUKCJDaGVja0luaXQ6IEF1ZGlvVW5pdEluaXRpYWxpemUiKQorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHBsYXlCYWNrV2FzSW5pdCA9IHRydWU7CisgICAgfQorICAgIC8qY2F0Y2ggKC4uLikKKyAgICAgIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9Ki8KKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgRmlsZVBsYXlOb3RpZmljYXRpb25IYW5kbGVyKHZvaWQgKiBpblJlZkNvbiwgT1NTdGF0dXMgaW5TdGF0dXMpCit7CisgICAgaWYgKGluU3RhdHVzID09IGtBdWRpb0ZpbGVQbGF5X0ZpbGVJc0ZpbmlzaGVkKSB7CisgICAgCisgICAgICAgIC8qIG5vdGlmeSBub24tQ0EgdGhyZWFkIHRvIHBlcmZvcm0gdGhlIGNhbGxiYWNrICovCisgICAgICAgIFNETF9TZW1Qb3N0KGNhbGxiYWNrU2VtKTsKKyAgICAgICAgCisgICAgfSBlbHNlIGlmIChpblN0YXR1cyA9PSBrQXVkaW9GaWxlUGxheUVycl9GaWxlUGxheVVuZGVycnVuKSB7CisgICAgCisgICAgICAgIFNETF9TZXRFcnJvciAoIkNEUGxheWVyIE5vdGlmaWNhdGlvbjogYnVmZmVyIHVuZGVycnVuIik7CisgICAgfSBlbHNlIGlmIChpblN0YXR1cyA9PSBrQXVkaW9GaWxlUGxheV9QbGF5ZXJJc1VuaW5pdGlhbGl6ZWQpIHsKKyAgICAKKyAgICAgICAgU0RMX1NldEVycm9yICgiQ0RQbGF5ZXIgTm90aWZpY2F0aW9uOiBwbGF5ZXIgaXMgdW5pbml0aWFsaXplZCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIAorICAgICAgICBTRExfU2V0RXJyb3IgKCJDRFBsYXllciBOb3RpZmljYXRpb246IHVua25vd24gZXJyb3IgJWxkIiwgaW5TdGF0dXMpOworICAgIH0KK30KKworc3RhdGljIGludCBSdW5DYWxsQmFja1RocmVhZCAodm9pZCAqcGFyYW0pCit7CisgICAgZm9yICg7OykgeworICAgIAorCVNETF9TZW1XYWl0KGNhbGxiYWNrU2VtKTsKKworICAgICAgICBpZiAoY29tcGxldGlvblByb2MgJiYgdGhlQ0RST00pIHsKKyAgICAgICAgICAgICNpZiBERUJVR19DRFJPTQorICAgICAgICAgICAgcHJpbnRmICgiY2FsbGJhY2shXG4iKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgKCpjb21wbGV0aW9uUHJvYykodGhlQ0RST00pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgI2lmIERFQlVHX0NEUk9NCisgICAgICAgICAgICBwcmludGYgKCJjYWxsYmFjaz9cbiIpOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgI2lmIERFQlVHX0NEUk9NCisgICAgcHJpbnRmICgidGhyZWFkIGR5aW5nIG5vdy4uLlxuIik7CisgICAgI2VuZGlmCisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qfTsgLy8gZXh0ZXJuICJDIiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvQ0RQbGF5ZXIuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L0NEUGxheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxYWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L0NEUGxheWVyLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX19DRFBsYXllcl9fSF9fCisjZGVmaW5lIF9fQ0RQbGF5ZXJfX0hfXyAxCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKyNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2luY2x1ZGUgPEF1ZGlvVW5pdC9BdWRpb1VuaXQuaD4KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICJTRExfbXV0ZXguaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKCpDRFBsYXllckNvbXBsZXRpb25Qcm9jKShTRExfQ0QgKmNkcm9tKSA7CisKK3ZvaWQgICAgIExvY2sgKCk7CisKK3ZvaWQgICAgIFVubG9jaygpOworCitpbnQgICAgICBMb2FkRmlsZSAoY29uc3QgRlNSZWYgKnJlZiwgaW50IHN0YXJ0RnJhbWUsIGludCBlbmRGcmFtZSk7IC8qIHBhc3MgLTEgdG8gZG8gbm90aGluZyAqLworCitpbnQgICAgICBSZWxlYXNlRmlsZSAoKTsKKworaW50ICAgICAgUGxheUZpbGUgICgpOworCitpbnQgICAgICBQYXVzZUZpbGUgKCk7CisKK3ZvaWQgICAgIFNldENvbXBsZXRpb25Qcm9jIChDRFBsYXllckNvbXBsZXRpb25Qcm9jIHByb2MsIFNETF9DRCAqY2Ryb20pOworCitpbnQgICAgICBSZWFkVE9DRGF0YSAoRlNWb2x1bWVSZWZOdW0gdGhlVm9sdW1lLCBTRExfQ0QgKnRoZUNEKTsKKworaW50ICAgICAgTGlzdFRyYWNrRmlsZXMgKEZTVm9sdW1lUmVmTnVtIHRoZVZvbHVtZSwgRlNSZWYgKnRyYWNrRmlsZXMsIGludCBudW1UcmFja3MpOworCitpbnQgICAgICBEZXRlY3RBdWRpb0NEVm9sdW1lcyAoRlNWb2x1bWVSZWZOdW0gKnZvbHVtZXMsIGludCBudW1Wb2x1bWVzKTsKKworaW50ICAgICAgR2V0Q3VycmVudEZyYW1lICgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQ0RfUGxheWVyX19IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L1NETE9TWENBR3VhcmQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L1NETE9TWENBR3VhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGNhZjFiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvU0RMT1NYQ0FHdWFyZC5jCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogIAorICAgIE5vdGU6IFRoaXMgZmlsZSBoYXNuJ3QgYmVlbiBtb2RpZmllZCBzbyB0ZWNobmljYWxseSB3ZSBoYXZlIHRvIGtlZXAgdGhlIGRpc2NsYWltZXIgOi0oCisgICAgCisgICAgQ29weXJpZ2h0OiAgqSBDb3B5cmlnaHQgMjAwMiBBcHBsZSBDb21wdXRlciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgRGlzY2xhaW1lcjogSU1QT1JUQU5UOiAgVGhpcyBBcHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAgICAgICAgICAgICgiQXBwbGUiKSBpbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyCisgICAgICAgICAgICB1c2UsIGluc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgQXBwbGUgc29mdHdhcmUKKyAgICAgICAgICAgIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsCisgICAgICAgICAgICBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZSB0aGlzIEFwcGxlIHNvZnR3YXJlLgorCisgICAgICAgICAgICBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0CisgICAgICAgICAgICB0byB0aGVzZSB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMKKyAgICAgICAgICAgIGNvcHlyaWdodHMgaW4gdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsCisgICAgICAgICAgICByZXByb2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0CisgICAgICAgICAgICBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlCisgICAgICAgICAgICB0aGUgQXBwbGUgU29mdHdhcmUgaW4gaXRzIGVudGlyZXR5IGFuZCB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbgorICAgICAgICAgICAgdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mCisgICAgICAgICAgICB0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG9yIGxvZ29zIG9mCisgICAgICAgICAgICBBcHBsZSBDb21wdXRlciwgSW5jLiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoZQorICAgICAgICAgICAgQXBwbGUgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBBcHBsZS4gIEV4Y2VwdCBhcworICAgICAgICAgICAgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzIG9yIGltcGxpZWQsCisgICAgICAgICAgICBhcmUgZ3JhbnRlZCBieSBBcHBsZSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdAorICAgICAgICAgICAgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUgd29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIEFwcGxlCisgICAgICAgICAgICBTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgorCisgICAgICAgICAgICBUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PCisgICAgICAgICAgICBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQKKyAgICAgICAgICAgIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAgICAgICAgICAgIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOCisgICAgICAgICAgICBDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCisKKyAgICAgICAgICAgIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SCisgICAgICAgICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgICAgICAgICAgICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAgICAgICAgICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTgorICAgICAgICAgICAgT0YgVEhFIEFQUExFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQKKyAgICAgICAgICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IgT1RIRVJXSVNFLCBFVkVOIElGIEFQUExFIEhBUyBCRUVOCisgICAgICAgICAgICBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgQ0FHdWFyZC5jcAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBJbmNsdWRlcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyovCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorCisvKiNkZWZpbmUgTkRFQlVHIDEqLworLyoKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyovCisjZGVmaW5lIGFzc2VydChYKQorCisKKyNpbmNsdWRlICJTRExPU1hDQUd1YXJkLmgiCisKKy8qI3dhcm5pbmcgICAgICBOZWVkIGEgdHJ5LWJhc2VkIExvY2tlciB0b28qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFNETE9TWENBR3VhcmQKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IFNETE9TWENBR3VhcmRfTG9jayhTRExPU1hDQUd1YXJkICpjYWcpCit7CisgICAgaW50IHRoZUFuc3dlciA9IDA7CisgICAgCisgICAgaWYocHRocmVhZF9zZWxmKCkgIT0gY2FnLT5tT3duZXIpCisgICAgeworICAgICAgICBPU1N0YXR1cyB0aGVFcnJvciA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmY2FnLT5tTXV0ZXgpOworICAgICAgICAodm9pZCl0aGVFcnJvcjsKKyAgICAgICAgYXNzZXJ0KHRoZUVycm9yID09IDApOworICAgICAgICBjYWctPm1Pd25lciA9IHB0aHJlYWRfc2VsZigpOworICAgICAgICB0aGVBbnN3ZXIgPSAxOworICAgIH0KKworICAgIHJldHVybiB0aGVBbnN3ZXI7Cit9CisKK3N0YXRpYyB2b2lkICAgIFNETE9TWENBR3VhcmRfVW5sb2NrKFNETE9TWENBR3VhcmQgKmNhZykKK3sKKyAgICBPU1N0YXR1cyB0aGVFcnJvcjsKKyAgICBhc3NlcnQocHRocmVhZF9zZWxmKCkgPT0gY2FnLT5tT3duZXIpOworCisgICAgY2FnLT5tT3duZXIgPSAwOworICAgIHRoZUVycm9yID0gcHRocmVhZF9tdXRleF91bmxvY2soJmNhZy0+bU11dGV4KTsKKyAgICAodm9pZCl0aGVFcnJvcjsKKyAgICBhc3NlcnQodGhlRXJyb3IgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgU0RMT1NYQ0FHdWFyZF9UcnkgKFNETE9TWENBR3VhcmQgKmNhZywgaW50ICpvdXRXYXNMb2NrZWQpCit7CisgICAgaW50IHRoZUFuc3dlciA9IDA7CisgICAgKm91dFdhc0xvY2tlZCA9IDA7CisgICAgCisgICAgaWYgKHB0aHJlYWRfc2VsZigpID09IGNhZy0+bU93bmVyKSB7CisgICAgICAgIHRoZUFuc3dlciA9IDE7CisgICAgICAgICpvdXRXYXNMb2NrZWQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIE9TU3RhdHVzIHRoZUVycm9yID0gcHRocmVhZF9tdXRleF90cnlsb2NrKCZjYWctPm1NdXRleCk7CisgICAgICAgIGlmICh0aGVFcnJvciA9PSAwKSB7CisgICAgICAgICAgICBjYWctPm1Pd25lciA9IHB0aHJlYWRfc2VsZigpOworICAgICAgICAgICAgdGhlQW5zd2VyID0gMTsKKyAgICAgICAgICAgICpvdXRXYXNMb2NrZWQgPSAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiB0aGVBbnN3ZXI7Cit9CisKK3N0YXRpYyB2b2lkICAgIFNETE9TWENBR3VhcmRfV2FpdChTRExPU1hDQUd1YXJkICpjYWcpCit7CisgICAgT1NTdGF0dXMgdGhlRXJyb3I7CisgICAgYXNzZXJ0KHB0aHJlYWRfc2VsZigpID09IGNhZy0+bU93bmVyKTsKKworICAgIGNhZy0+bU93bmVyID0gMDsKKworICAgIHRoZUVycm9yID0gcHRocmVhZF9jb25kX3dhaXQoJmNhZy0+bUNvbmRWYXIsICZjYWctPm1NdXRleCk7CisgICAgKHZvaWQpdGhlRXJyb3I7CisgICAgYXNzZXJ0KHRoZUVycm9yID09IDApOworICAgIGNhZy0+bU93bmVyID0gcHRocmVhZF9zZWxmKCk7Cit9CisKK3N0YXRpYyB2b2lkICAgIFNETE9TWENBR3VhcmRfTm90aWZ5KFNETE9TWENBR3VhcmQgKmNhZykKK3sKKyAgICBPU1N0YXR1cyB0aGVFcnJvciA9IHB0aHJlYWRfY29uZF9zaWduYWwoJmNhZy0+bUNvbmRWYXIpOworICAgICh2b2lkKXRoZUVycm9yOworICAgIGFzc2VydCh0aGVFcnJvciA9PSAwKTsKK30KKworCitTRExPU1hDQUd1YXJkICpuZXdfU0RMT1NYQ0FHdWFyZCh2b2lkKQoreworICAgIE9TU3RhdHVzIHRoZUVycm9yOworICAgIFNETE9TWENBR3VhcmQgKmNhZyA9IChTRExPU1hDQUd1YXJkICopIFNETF9tYWxsb2Moc2l6ZW9mIChTRExPU1hDQUd1YXJkKSk7CisgICAgaWYgKGNhZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTRExfbWVtc2V0KGNhZywgJ1wwJywgc2l6ZW9mICgqY2FnKSk7CisKKyAgICAjZGVmaW5lIFNFVF9TRExPU1hDQUdVQVJEX01FVEhPRChtKSBjYWctPm0gPSBTRExPU1hDQUd1YXJkXyMjbQorICAgIFNFVF9TRExPU1hDQUdVQVJEX01FVEhPRChMb2NrKTsKKyAgICBTRVRfU0RMT1NYQ0FHVUFSRF9NRVRIT0QoVW5sb2NrKTsKKyAgICBTRVRfU0RMT1NYQ0FHVUFSRF9NRVRIT0QoVHJ5KTsKKyAgICBTRVRfU0RMT1NYQ0FHVUFSRF9NRVRIT0QoV2FpdCk7CisgICAgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9EKE5vdGlmeSk7CisgICAgI3VuZGVmIFNFVF9TRExPU1hDQUdVQVJEX01FVEhPRAorCisgICAgdGhlRXJyb3IgPSBwdGhyZWFkX211dGV4X2luaXQoJmNhZy0+bU11dGV4LCBOVUxMKTsKKyAgICAodm9pZCl0aGVFcnJvcjsKKyAgICBhc3NlcnQodGhlRXJyb3IgPT0gMCk7CisgICAgCisgICAgdGhlRXJyb3IgPSBwdGhyZWFkX2NvbmRfaW5pdCgmY2FnLT5tQ29uZFZhciwgTlVMTCk7CisgICAgKHZvaWQpdGhlRXJyb3I7CisgICAgYXNzZXJ0KHRoZUVycm9yID09IDApOworICAgIAorICAgIGNhZy0+bU93bmVyID0gMDsKKyAgICByZXR1cm4gY2FnOworfQorCit2b2lkIGRlbGV0ZV9TRExPU1hDQUd1YXJkKFNETE9TWENBR3VhcmQgKmNhZykKK3sKKyAgICBpZiAoY2FnICE9IE5VTEwpCisgICAgeworICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmNhZy0+bU11dGV4KTsKKyAgICAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmNhZy0+bUNvbmRWYXIpOworICAgICAgICBTRExfZnJlZShjYWcpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvU0RMT1NYQ0FHdWFyZC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvU0RMT1NYQ0FHdWFyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMmM2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL21hY29zeC9TRExPU1hDQUd1YXJkLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiAgCisgICAgTm90ZTogVGhpcyBmaWxlIGhhc24ndCBiZWVuIG1vZGlmaWVkIHNvIHRlY2huaWNhbGx5IHdlIGhhdmUgdG8ga2VlcCB0aGUgZGlzY2xhaW1lciA6LSgKKworCisgICAgQ29weXJpZ2h0OiAgqSBDb3B5cmlnaHQgMjAwMiBBcHBsZSBDb21wdXRlciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgRGlzY2xhaW1lcjogSU1QT1JUQU5UOiAgVGhpcyBBcHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAgICAgICAgICAgICgiQXBwbGUiKSBpbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyCisgICAgICAgICAgICB1c2UsIGluc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgQXBwbGUgc29mdHdhcmUKKyAgICAgICAgICAgIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsCisgICAgICAgICAgICBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZSB0aGlzIEFwcGxlIHNvZnR3YXJlLgorCisgICAgICAgICAgICBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0CisgICAgICAgICAgICB0byB0aGVzZSB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMKKyAgICAgICAgICAgIGNvcHlyaWdodHMgaW4gdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsCisgICAgICAgICAgICByZXByb2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0CisgICAgICAgICAgICBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlCisgICAgICAgICAgICB0aGUgQXBwbGUgU29mdHdhcmUgaW4gaXRzIGVudGlyZXR5IGFuZCB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbgorICAgICAgICAgICAgdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mCisgICAgICAgICAgICB0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG9yIGxvZ29zIG9mCisgICAgICAgICAgICBBcHBsZSBDb21wdXRlciwgSW5jLiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoZQorICAgICAgICAgICAgQXBwbGUgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBBcHBsZS4gIEV4Y2VwdCBhcworICAgICAgICAgICAgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzIG9yIGltcGxpZWQsCisgICAgICAgICAgICBhcmUgZ3JhbnRlZCBieSBBcHBsZSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdAorICAgICAgICAgICAgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUgd29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIEFwcGxlCisgICAgICAgICAgICBTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgorCisgICAgICAgICAgICBUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PCisgICAgICAgICAgICBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQKKyAgICAgICAgICAgIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAgICAgICAgICAgIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOCisgICAgICAgICAgICBDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCisKKyAgICAgICAgICAgIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SCisgICAgICAgICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgICAgICAgICAgICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAgICAgICAgICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTgorICAgICAgICAgICAgT0YgVEhFIEFQUExFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQKKyAgICAgICAgICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IgT1RIRVJXSVNFLCBFVkVOIElGIEFQUExFIEhBUyBCRUVOCisgICAgICAgICAgICBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgQ0FHdWFyZC5oCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZiAhZGVmaW5lZChfX0NBR3VhcmRfaF9fKQorI2RlZmluZSBfX0NBR3VhcmRfaF9fCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBJbmNsdWRlcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxDb3JlQXVkaW8vQ29yZUF1ZGlvVHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIENBR3VhcmQKKyAgCisgICAgVGhpcyBpcyB5b3VyIHR5cGljYWwgbXV0ZXggd2l0aCBzaWduYWxsaW5nIGltcGxlbWVudGVkIHZpYSBwdGhyZWFkcy4KKyAgICBMb2NrKCkgd2lsbCByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ3VhcmQgaXMgbG9ja2VkIG9uIHRoYXQgY2FsbC4KKyAgICBBIHRocmVhZCB0aGF0IGFscmVhZHkgaGFzIHRoZSBndWFyZCB3aWxsIHJlY2VpdmUgJ2ZhbHNlJyBpZiBpdCBsb2NrcyBpdAorICAgIGFnYWluLiBVc2Ugb2YgdGhlIHN0YWNrLWJhc2VkIENBR3VhcmQ6OkxvY2tlciBjbGFzcyBpcyBoaWdobHkgcmVjb21tZW5kZWQKKyAgICB0byBwcm9wZXJseSBtYW5hZ2UgdGhlIHJlY3Vyc2l2ZSBuZXN0aW5nLiBUaGUgV2FpdCBjYWxscyB3aXRoIHRpbWVvdXRzCisgICAgd2lsbCByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdGltZW91dCBwZXJpb2QgZXhwaXJlZC4gVGhleSB3aWxsCisgICAgcmV0dXJuIGZhbHNlIGlmIHRoZXkgcmVjZWl2ZSBub3RpZmljYXRpb24gYW55IG90aGVyIHdheS4KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBTX1NETE9TWENBR3VhcmQKK3sKKworLyogIENvbnN0cnVjdGlvbi9EZXN0cnVjdGlvbiAqLworLypwdWJsaWM6Ki8KKy8qICBBY3Rpb25zICovCisvKnB1YmxpYzoqLworICAgIGludCAgICAgKCpMb2NrKShzdHJ1Y3QgU19TRExPU1hDQUd1YXJkICpjYWcpOworICAgIHZvaWQgICAgKCpVbmxvY2spKHN0cnVjdCBTX1NETE9TWENBR3VhcmQgKmNhZyk7CisgICAgaW50ICAgICAoKlRyeSkoc3RydWN0IFNfU0RMT1NYQ0FHdWFyZCAqY2FnLCBpbnQgKm91dFdhc0xvY2tlZCk7ICAgIC8qIHJldHVybnMgdHJ1ZSBpZiBsb2NrIGlzIGZyZWUsIGZhbHNlIGlmIG5vdCAqLworICAgIHZvaWQgICAgKCpXYWl0KShzdHJ1Y3QgU19TRExPU1hDQUd1YXJkICpjYWcpOworICAgIHZvaWQgICAgKCpOb3RpZnkpKHN0cnVjdCBTX1NETE9TWENBR3VhcmQgKmNhZyk7CisKKy8qICBJbXBsZW1lbnRhdGlvbiAqLworLypwcm90ZWN0ZWQ6Ki8KKyAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OworICAgIHB0aHJlYWRfY29uZF90ICBtQ29uZFZhcjsKKyAgICBwdGhyZWFkX3QgICAgICAgbU93bmVyOworfSBTRExPU1hDQUd1YXJkOworCitTRExPU1hDQUd1YXJkICpuZXdfU0RMT1NYQ0FHdWFyZCh2b2lkKTsKK3ZvaWQgZGVsZXRlX1NETE9TWENBR3VhcmQoU0RMT1NYQ0FHdWFyZCAqY2FnKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvU0RMX3N5c2Nkcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxODc1MAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L1NETF9zeXNjZHJvbS5jCkBAIC0wLDAgKzEsNTE0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9DRFJPTV9NQUNPU1gKKworI2luY2x1ZGUgIlNETF9zeXNjZHJvbV9jLmgiCisKKyNwcmFnbWEgbWFyayAtLSBHbG9iYWxzIC0tCisKK3N0YXRpYyBGU1JlZioqICAgICAgICAgdHJhY2tzOworc3RhdGljIEZTVm9sdW1lUmVmTnVtKiB2b2x1bWVzOworc3RhdGljIENEc3RhdHVzICAgICAgICBzdGF0dXM7CitzdGF0aWMgaW50ICAgICAgICAgICAgIG5leHRUcmFja0ZyYW1lOworc3RhdGljIGludCAgICAgICAgICAgICBuZXh0VHJhY2tGcmFtZXNSZW1haW5pbmc7CitzdGF0aWMgaW50ICAgICAgICAgICAgIGZha2VDRDsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgY3VycmVudFRyYWNrOworc3RhdGljIGludCAgICAgICAgICAgICBkaWRSZWFkVE9DOworc3RhdGljIGludCAgICAgICAgICAgICBjYWNoZVRPQ051bVRyYWNrczsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgY3VycmVudERyaXZlOyAvKiBPbmx5IGFsbG93IDEgZHJpdmUgaW4gdXNlIGF0IGEgdGltZSAqLworCisjcHJhZ21hIG1hcmsgLS0gUHJvdG90eXBlcyAtLQorCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUgICAoaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgICAgICAgICBTRExfU1lTX0NET3BlbiAgIChpbnQgZHJpdmUpOworc3RhdGljIGludCAgICAgICAgIFNETF9TWVNfQ0RHZXRUT0MgKFNETF9DRCAqY2Ryb20pOworc3RhdGljIENEc3RhdHVzICAgIFNETF9TWVNfQ0RTdGF0dXMgKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOworc3RhdGljIGludCAgICAgICAgIFNETF9TWVNfQ0RQbGF5ICAgKFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRFBhdXNlICAoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRFJlc3VtZSAoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DRFN0b3AgICAoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50ICAgICAgICAgU0RMX1NZU19DREVqZWN0ICAoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgdm9pZCAgICAgICAgU0RMX1NZU19DRENsb3NlICAoU0RMX0NEICpjZHJvbSk7CisKKyNwcmFnbWEgbWFyayAtLSBIZWxwZXIgRnVuY3Rpb25zIC0tCisKKy8qIFJlYWQgYSBsaXN0IG9mIHRyYWNrcyBmcm9tIHRoZSB2b2x1bWUgKi8KK3N0YXRpYyBpbnQgTG9hZFRyYWNrcyAoU0RMX0NEICpjZHJvbSkKK3sKKyAgICAvKiBDaGVjayBpZiB0cmFja3MgYXJlIGFscmVhZHkgbG9hZGVkICovCisgICAgaWYgICggdHJhY2tzW2Nkcm9tLT5pZF0gIT0gTlVMTCApCisgICAgICAgIHJldHVybiAwOworICAgICAgICAKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRyYWNrcyAqLworICAgIHRyYWNrc1tjZHJvbS0+aWRdID0gKEZTUmVmKikgU0RMX2NhbGxvYyAoMSwgc2l6ZW9mKCoqdHJhY2tzKSAqIGNkcm9tLT5udW10cmFja3MpOworICAgIGlmICh0cmFja3NbY2Ryb20tPmlkXSA9PSBOVUxMKSB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICAvKiBMb2FkIHRyYWNrcyAqLworICAgIGlmIChMaXN0VHJhY2tGaWxlcyAodm9sdW1lc1tjZHJvbS0+aWRdLCB0cmFja3NbY2Ryb20tPmlkXSwgY2Ryb20tPm51bXRyYWNrcykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogRmluZCBhIGZpbGUgZm9yIGEgZ2l2ZW4gc3RhcnQgZnJhbWUgYW5kIGxlbmd0aCAqLworc3RhdGljIEZTUmVmKiBHZXRGaWxlRm9yT2Zmc2V0IChTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsICBpbnQgKm91dFN0YXJ0RnJhbWUsIGludCAqb3V0U3RvcEZyYW1lKQoreworICAgIGludCBpOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBjZHJvbS0+bnVtdHJhY2tzOyBpKyspIHsKKyAgICAKKyAgICAgICAgaWYgKGNkcm9tLT50cmFja1tpXS5vZmZzZXQgPD0gc3RhcnQgJiYKKyAgICAgICAgICAgIHN0YXJ0IDwgKGNkcm9tLT50cmFja1tpXS5vZmZzZXQgKyBjZHJvbS0+dHJhY2tbaV0ubGVuZ3RoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBpZiAoaSA9PSBjZHJvbS0+bnVtdHJhY2tzKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgCisgICAgY3VycmVudFRyYWNrID0gaTsKKworICAgICpvdXRTdGFydEZyYW1lID0gc3RhcnQgLSBjZHJvbS0+dHJhY2tbaV0ub2Zmc2V0OworICAgIAorICAgIGlmICgoKm91dFN0YXJ0RnJhbWUgKyBsZW5ndGgpIDwgY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCkgeworICAgICAgICAqb3V0U3RvcEZyYW1lID0gKm91dFN0YXJ0RnJhbWUgKyBsZW5ndGg7CisgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgIG5leHRUcmFja0ZyYW1lID0gLTE7CisgICAgICAgIG5leHRUcmFja0ZyYW1lc1JlbWFpbmluZyA9IC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKm91dFN0b3BGcmFtZSA9IC0xOworICAgICAgICBsZW5ndGggLT0gY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCAtICpvdXRTdGFydEZyYW1lOworICAgICAgICBuZXh0VHJhY2tGcmFtZSA9IGNkcm9tLT50cmFja1tpKzFdLm9mZnNldDsKKyAgICAgICAgbmV4dFRyYWNrRnJhbWVzUmVtYWluaW5nID0gbGVuZ3RoOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gJnRyYWNrc1tjZHJvbS0+aWRdW2ldOworfQorCisvKiBTZXR1cCBhbm90aGVyIGZpbGUgZm9yIHBsYXliYWNrLCBvciBzdG9wIHBsYXliYWNrIChjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZCkgKi8KK3N0YXRpYyB2b2lkIENvbXBsZXRpb25Qcm9jIChTRExfQ0QgKmNkcm9tKQoreworICAgIAorICAgIExvY2sgKCk7CisgICAgCisgICAgaWYgKG5leHRUcmFja0ZyYW1lID4gMCAmJiBuZXh0VHJhY2tGcmFtZXNSZW1haW5pbmcgPiAwKSB7CisgICAgCisgICAgICAgIC8qIExvYWQgdGhlIG5leHQgZmlsZSB0byBwbGF5ICovCisgICAgICAgIGludCBzdGFydEZyYW1lLCBzdG9wRnJhbWU7CisgICAgICAgIEZTUmVmICpmaWxlOworICAgICAgICAKKyAgICAgICAgUGF1c2VGaWxlICgpOworICAgICAgICBSZWxlYXNlRmlsZSAoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgZmlsZSA9IEdldEZpbGVGb3JPZmZzZXQgKGNkcm9tLCBuZXh0VHJhY2tGcmFtZSwgCisgICAgICAgICAgICBuZXh0VHJhY2tGcmFtZXNSZW1haW5pbmcsICZzdGFydEZyYW1lLCAmc3RvcEZyYW1lKTsKKyAgICAgICAgCisgICAgICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IENEX1NUT1BQRUQ7CisgICAgICAgICAgICBVbmxvY2sgKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIExvYWRGaWxlIChmaWxlLCBzdGFydEZyYW1lLCBzdG9wRnJhbWUpOworICAgICAgICAKKyAgICAgICAgU2V0Q29tcGxldGlvblByb2MgKENvbXBsZXRpb25Qcm9jLCBjZHJvbSk7CisgICAgICAgIAorICAgICAgICBQbGF5RmlsZSAoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgCisgICAgICAgIC8qIFJlbGVhc2UgdGhlIGN1cnJlbnQgZmlsZSAqLworICAgICAgICBQYXVzZUZpbGUgKCk7CisgICAgICAgIFJlbGVhc2VGaWxlICgpOworICAgICAgICBzdGF0dXMgPSBDRF9TVE9QUEVEOworICAgIH0KKyAgICAKKyAgICBVbmxvY2sgKCk7Cit9CisKKworI3ByYWdtYSBtYXJrIC0tIERyaXZlciBGdW5jdGlvbnMgLS0KKworLyogSW5pdGlhbGl6ZSAqLworaW50IFNETF9TWVNfQ0RJbml0ICh2b2lkKSAKK3sKKyAgICAvKiBJbml0aWFsaXplIGdsb2JhbHMgKi8KKyAgICB2b2x1bWVzID0gTlVMTDsKKyAgICB0cmFja3MgID0gTlVMTDsKKyAgICBzdGF0dXMgID0gQ0RfU1RPUFBFRDsKKyAgICBuZXh0VHJhY2tGcmFtZSA9IC0xOworICAgIG5leHRUcmFja0ZyYW1lc1JlbWFpbmluZyA9IC0xOworICAgIGZha2VDRCAgPSBTRExfRkFMU0U7CisgICAgY3VycmVudFRyYWNrID0gLTE7CisgICAgZGlkUmVhZFRPQyA9IFNETF9GQUxTRTsKKyAgICBjYWNoZVRPQ051bVRyYWNrcyA9IC0xOworICAgIGN1cnJlbnREcml2ZSA9IC0xOworICAgIAorICAgIC8qIEZpbGwgaW4gZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBTRExfQ0RjYXBzLk5hbWUgICA9IFNETF9TWVNfQ0ROYW1lOworICAgIFNETF9DRGNhcHMuT3BlbiAgID0gU0RMX1NZU19DRE9wZW47CisgICAgU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOworICAgIFNETF9DRGNhcHMuU3RhdHVzID0gU0RMX1NZU19DRFN0YXR1czsKKyAgICBTRExfQ0RjYXBzLlBsYXkgICA9IFNETF9TWVNfQ0RQbGF5OworICAgIFNETF9DRGNhcHMuUGF1c2UgID0gU0RMX1NZU19DRFBhdXNlOworICAgIFNETF9DRGNhcHMuUmVzdW1lID0gU0RMX1NZU19DRFJlc3VtZTsKKyAgICBTRExfQ0RjYXBzLlN0b3AgICA9IFNETF9TWVNfQ0RTdG9wOworICAgIFNETF9DRGNhcHMuRWplY3QgID0gU0RMX1NZU19DREVqZWN0OworICAgIFNETF9DRGNhcHMuQ2xvc2UgID0gU0RMX1NZU19DRENsb3NlOworCisgICAgLyogCisgICAgICAgIFJlYWQgdGhlIGxpc3Qgb2YgImRyaXZlcyIKKyAgICAgICAgCisgICAgICAgIFRoaXMgaXMgY3VycmVudGx5IGEgaGFjayB0aGF0IGluZmVycyBkcml2ZXMgZnJvbQorICAgICAgICBtb3VudGVkIGF1ZGlvIENEIHZvbHVtZXMsIHJhdGhlciB0aGFuCisgICAgICAgIGFjdHVhbCBDRC1ST00gZGV2aWNlcyAtIHdoaWNoIG1lYW5zIGl0IG1heSBub3QKKyAgICAgICAgYWN0IGFzIGV4cGVjdGVkIHNvbWV0aW1lcy4KKyAgICAqLworICAgIAorICAgIC8qIEZpbmQgb3V0IGhvdyBtYW55IGNkIHZvbHVtZXMgYXJlIG1vdW50ZWQgKi8KKyAgICBTRExfbnVtY2RzID0gRGV0ZWN0QXVkaW9DRFZvbHVtZXMgKE5VTEwsIDApOworCisgICAgLyoKKyAgICAgICAgSWYgdGhlcmUgYXJlIG5vIHZvbHVtZXMsIGZha2UgYSBjZCBkZXZpY2UKKyAgICAgICAgc28gdHJheSBlbXB0eSBjYW4gYmUgcmVwb3J0ZWQuCisgICAgKi8KKyAgICBpZiAoU0RMX251bWNkcyA9PSAwKSB7CisgICAgCisgICAgICAgIGZha2VDRCA9IFNETF9UUlVFOworICAgICAgICBTRExfbnVtY2RzID0gMTsKKyAgICAgICAgc3RhdHVzID0gQ0RfVFJBWUVNUFRZOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB2b2x1bWVzICovCisgICAgdm9sdW1lcyA9IChGU1ZvbHVtZVJlZk51bSopIFNETF9jYWxsb2MgKDEsIHNpemVvZigqdm9sdW1lcykgKiBTRExfbnVtY2RzKTsKKyAgICBpZiAodm9sdW1lcyA9PSBOVUxMKSB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdHJhY2tzICovCisgICAgdHJhY2tzID0gKEZTUmVmKiopIFNETF9jYWxsb2MgKDEsIHNpemVvZigqdHJhY2tzKSAqIChTRExfbnVtY2RzICsgMSkpOworICAgIGlmICh0cmFja3MgPT0gTlVMTCkgeworICAgICAgICBTRExfT3V0T2ZNZW1vcnkgKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgLyogTWFyayB0aGUgZW5kIG9mIHRoZSB0cmFja3MgYXJyYXkgKi8KKyAgICB0cmFja3NbIFNETF9udW1jZHMgXSA9IChGU1JlZiopLTE7CisgICAgCisgICAgLyogCisgICAgICAgIFJlZGV0ZWN0LCBub3cgc2F2ZSBhbGwgdm9sdW1lcyBmb3IgbGF0ZXIKKyAgICAgICAgVXBkYXRlIFNETF9udW1jZHMganVzdCBpbiBjYXNlIGl0IGNoYW5nZWQKKyAgICAqLworICAgIHsKKyAgICAgICAgaW50IG51bVZvbHVtZXMgPSBTRExfbnVtY2RzOworICAgICAgICAKKyAgICAgICAgU0RMX251bWNkcyA9IERldGVjdEF1ZGlvQ0RWb2x1bWVzICh2b2x1bWVzLCBudW1Wb2x1bWVzKTsKKyAgICAgICAgCisgICAgICAgIC8qIElmIG1vcmUgY2RzIHN1ZGRlbmx5IHNob3cgdXAsIGlnbm9yZSB0aGVtICovCisgICAgICAgIGlmIChTRExfbnVtY2RzID4gbnVtVm9sdW1lcykgeworICAgICAgICAgICAgU0RMX1NldEVycm9yICgiU29tZSBDRCdzIHdlcmUgYWRkZWQgYnV0IHRoZXkgd2lsbCBiZSBpZ25vcmVkIik7CisgICAgICAgICAgICBTRExfbnVtY2RzID0gbnVtVm9sdW1lczsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyogU2h1dGRvd24gYW5kIGNsZWFudXAgKi8KK3ZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCkKK3sKKyAgICBSZWxlYXNlRmlsZSgpOworICAgIAorICAgIGlmICh2b2x1bWVzICE9IE5VTEwpCisgICAgICAgIGZyZWUgKHZvbHVtZXMpOworICAgICAgICAKKyAgICBpZiAodHJhY2tzICE9IE5VTEwpIHsKKyAgICAKKyAgICAgICAgRlNSZWYgKipwdHI7CisgICAgICAgIGZvciAocHRyID0gdHJhY2tzOyAqcHRyICE9IChGU1JlZiopLTE7IHB0cisrKQorICAgICAgICAgICAgaWYgKCpwdHIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmcmVlICgqcHRyKTsKKyAgICAgICAgICAgIAorICAgICAgICBmcmVlICh0cmFja3MpOworICAgIH0KK30KKworLyogR2V0IHRoZSBVbml4IGRpc2sgbmFtZSBvZiB0aGUgdm9sdW1lICovCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUgKGludCBkcml2ZSkKK3sKKyAgICAvKgorICAgICAqICEhISBGSVhNRTogUEJIR2V0Vm9sUGFybXNTeW5jKCkgaXMgZ29uZSBpbiAxMC42LAorICAgICAqICEhISBGSVhNRTogIHJlcGxhY2VkIHdpdGggRlNHZXRWb2x1bWVQYXJtcygpLCB3aGljaAorICAgICAqICEhISBGSVhNRTogIGlzbid0IGF2YWlsYWJsZSBiZWZvcmUgMTAuNS4gIDovCisgICAgICovCisgICAgcmV0dXJuICJNYWMgT1MgWCBDRC1ST00gRGV2aWNlIjsKKworI2lmIDAKKyAgICBPU1N0YXR1cyAgICAgZXJyID0gbm9FcnI7CisgICAgSFBhcmFtQmxvY2tSZWMgIHBiOworICAgIEdldFZvbFBhcm1zSW5mb0J1ZmZlciAgIHZvbFBhcm1zSW5mbzsKKyAgIAorICAgIGlmIChmYWtlQ0QpCisgICAgICAgIHJldHVybiAiRmFrZSBDRC1ST00gRGV2aWNlIjsKKworICAgIHBiLmlvUGFyYW0uaW9OYW1lUHRyID0gTlVMTDsKKyAgICBwYi5pb1BhcmFtLmlvVlJlZk51bSA9IHZvbHVtZXNbZHJpdmVdOworICAgIHBiLmlvUGFyYW0uaW9CdWZmZXIgPSAoUHRyKSZ2b2xQYXJtc0luZm87CisgICAgcGIuaW9QYXJhbS5pb1JlcUNvdW50ID0gKFNJbnQzMilzaXplb2Yodm9sUGFybXNJbmZvKTsKKyAgICBlcnIgPSBQQkhHZXRWb2xQYXJtc1N5bmMoJnBiKTsKKworICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgU0RMX1NldEVycm9yICgiUEJIR2V0Vm9sUGFybXNTeW5jIHJldHVybmVkICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHZvbFBhcm1zSW5mby52TURldmljZUlEOworI2VuZGlmCit9CisKKy8qIE9wZW4gdGhlICJkZXZpY2UiICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuIChpbnQgZHJpdmUpCit7CisgICAgLyogT25seSBhbGxvdyAxIGRldmljZSB0byBiZSBvcGVuICovCisgICAgaWYgKGN1cnJlbnREcml2ZSA+PSAwKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoIk9ubHkgb25lIGNkcm9tIGlzIHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3VycmVudERyaXZlID0gZHJpdmU7CisKKyAgICByZXR1cm4gZHJpdmU7Cit9CisKKy8qIEdldCB0aGUgdGFibGUgb2YgY29udGVudHMgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyAoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBpZiAoZmFrZUNEKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoa0Vycm9yRmFrZURldmljZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgaWYgKGRpZFJlYWRUT0MpIHsKKyAgICAgICAgY2Ryb20tPm51bXRyYWNrcyA9IGNhY2hlVE9DTnVtVHJhY2tzOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgCisgICAgUmVhZFRPQ0RhdGEgKHZvbHVtZXNbY2Ryb20tPmlkXSwgY2Ryb20pOworICAgIGRpZFJlYWRUT0MgPSBTRExfVFJVRTsKKyAgICBjYWNoZVRPQ051bVRyYWNrcyA9IGNkcm9tLT5udW10cmFja3M7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEdldCBDRC1ST00gc3RhdHVzICovCitzdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyAoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKK3sKKyAgICBpZiAocG9zaXRpb24pIHsKKyAgICAgICAgaW50IHRyYWNrRnJhbWU7CisgICAgICAgIAorICAgICAgICBMb2NrICgpOworICAgICAgICB0cmFja0ZyYW1lID0gR2V0Q3VycmVudEZyYW1lICgpOworICAgICAgICBVbmxvY2sgKCk7CisgICAgCisgICAgICAgICpwb3NpdGlvbiA9IGNkcm9tLT50cmFja1tjdXJyZW50VHJhY2tdLm9mZnNldCArIHRyYWNrRnJhbWU7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIFN0YXJ0IHBsYXliYWNrICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgc3RhcnRGcmFtZSwgc3RvcEZyYW1lOworICAgIEZTUmVmICpyZWY7CisgICAgCisgICAgaWYgKGZha2VDRCkgeworICAgICAgICBTRExfU2V0RXJyb3IgKGtFcnJvckZha2VEZXZpY2UpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIExvY2soKTsKKyAgICAKKyAgICBpZiAoTG9hZFRyYWNrcyAoY2Ryb20pIDwgMCkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIAorICAgIGlmIChQYXVzZUZpbGUgKCkgPCAwKQorICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIAorICAgIGlmIChSZWxlYXNlRmlsZSAoKSA8IDApCisgICAgICAgIHJldHVybiAtNDsKKyAgICAKKyAgICByZWYgPSBHZXRGaWxlRm9yT2Zmc2V0IChjZHJvbSwgc3RhcnQsIGxlbmd0aCwgJnN0YXJ0RnJhbWUsICZzdG9wRnJhbWUpOworICAgIGlmIChyZWYgPT0gTlVMTCkgeworICAgICAgICBTRExfU2V0RXJyb3IgKCJTRExfU1lTX0NEUGxheTogTm8gZmlsZSBmb3Igc3RhcnQ9JWQsIGxlbmd0aD0lZCIsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICByZXR1cm4gLTU7CisgICAgfQorICAgIAorICAgIGlmIChMb2FkRmlsZSAocmVmLCBzdGFydEZyYW1lLCBzdG9wRnJhbWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIC02OworICAgIAorICAgIFNldENvbXBsZXRpb25Qcm9jIChDb21wbGV0aW9uUHJvYywgY2Ryb20pOworICAgIAorICAgIGlmIChQbGF5RmlsZSAoKSA8IDApCisgICAgICAgIHJldHVybiAtNzsKKyAgICAKKyAgICBzdGF0dXMgPSBDRF9QTEFZSU5HOworICAgIAorICAgIFVubG9jaygpOworICAgIAorICAgIHJldHVybiAwOworfQorCisvKiBQYXVzZSBwbGF5YmFjayAqLworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBpZiAoZmFrZUNEKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoa0Vycm9yRmFrZURldmljZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgTG9jayAoKTsKKyAgICAKKyAgICBpZiAoUGF1c2VGaWxlICgpIDwgMCkgeworICAgICAgICBVbmxvY2sgKCk7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisgICAgCisgICAgc3RhdHVzID0gQ0RfUEFVU0VEOworICAgIAorICAgIFVubG9jayAoKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyogUmVzdW1lIHBsYXliYWNrICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBpZiAoZmFrZUNEKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoa0Vycm9yRmFrZURldmljZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgTG9jayAoKTsKKyAgICAKKyAgICBpZiAoUGxheUZpbGUgKCkgPCAwKSB7CisgICAgICAgIFVubG9jayAoKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKyAgICAgICAgCisgICAgc3RhdHVzID0gQ0RfUExBWUlORzsKKyAgICAKKyAgICBVbmxvY2sgKCk7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFN0b3AgcGxheWJhY2sgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBpZiAoZmFrZUNEKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoa0Vycm9yRmFrZURldmljZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgTG9jayAoKTsKKyAgICAKKyAgICBpZiAoUGF1c2VGaWxlICgpIDwgMCkgeworICAgICAgICBVbmxvY2sgKCk7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisgICAgICAgIAorICAgIGlmIChSZWxlYXNlRmlsZSAoKSA8IDApIHsKKyAgICAgICAgVW5sb2NrICgpOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorICAgICAgICAKKyAgICBzdGF0dXMgPSBDRF9TVE9QUEVEOworICAgIAorICAgIFVubG9jayAoKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyogRWplY3QgdGhlIENELVJPTSAoVW5tb3VudCB0aGUgdm9sdW1lKSAqLworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgcGlkX3QgZGlzc2VudGVyOworCisgICAgaWYgKGZha2VDRCkgeworICAgICAgICBTRExfU2V0RXJyb3IgKGtFcnJvckZha2VEZXZpY2UpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIExvY2sgKCk7CisgICAgCisgICAgaWYgKFBhdXNlRmlsZSAoKSA8IDApIHsKKyAgICAgICAgVW5sb2NrICgpOworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorICAgICAgICAKKyAgICBpZiAoUmVsZWFzZUZpbGUgKCkgPCAwKSB7CisgICAgICAgIFVubG9jayAoKTsKKyAgICAgICAgcmV0dXJuIC0zOworICAgIH0KKyAgICAKKyAgICBzdGF0dXMgPSBDRF9TVE9QUEVEOworICAgIAorCS8qIEVqZWN0IHRoZSB2b2x1bWUgKi8KKwllcnIgPSBGU0VqZWN0Vm9sdW1lU3luYyh2b2x1bWVzW2Nkcm9tLT5pZF0sIGtOaWxPcHRpb25zLCAmZGlzc2VudGVyKTsKKworCWlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgVW5sb2NrICgpOworCQlTRExfU2V0RXJyb3IgKCJQQlVubW91bnRWb2wgcmV0dXJuZWQgJWQiLCBlcnIpOworCQlyZXR1cm4gLTQ7CisJfQorICAgIAorICAgIHN0YXR1cyA9IENEX1RSQVlFTVBUWTsKKworICAgIC8qIEludmFsaWRhdGUgdm9sdW1lIGFuZCB0cmFjayBpbmZvICovCisgICAgdm9sdW1lc1tjZHJvbS0+aWRdID0gMDsKKyAgICBmcmVlICh0cmFja3NbY2Ryb20tPmlkXSk7CisgICAgdHJhY2tzW2Nkcm9tLT5pZF0gPSBOVUxMOworICAgIAorICAgIFVubG9jayAoKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyogQ2xvc2UgdGhlIENELVJPTSAqLworc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCit7CisgICAgY3VycmVudERyaXZlID0gLTE7CisgICAgcmV0dXJuOworfQorCisjZW5kaWYgLyogU0RMX0NEUk9NX01BQ09TWCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9tYWNvc3gvU0RMX3N5c2Nkcm9tX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L1NETF9zeXNjZHJvbV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5YzU4OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWFjb3N4L1NETF9zeXNjZHJvbV9jLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaGlzIGlzIHRoZSBNYWMgT1MgWCAvIENvcmVBdWRpbyBzcGVjaWZpYyBoZWFkZXIgZm9yIHRoZSBTREwgQ0QtUk9NIEFQSQorICAgQ29udHJpYnV0ZWQgYnkgRGFycmVsbCBXYWxpc3NlciBhbmQgTWF4IEhvcm4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBJbXBsZW1lbnRhdGlvbiBOb3RlcworICoqKioqKioqKioqKioqKioqKioqKgorCisgICAgVGhpcyBjb2RlIGhhcyBzZXZlcmFsIGxpbWl0YXRpb25zIGN1cnJlbnRseSAoYWxsIG9mIHdoaWNoIGFyZSBwcm9hYmFseSBmaXhhYmxlKToKKyAgICAKKyAgICAxLiBBIENELVJPTSBkZXZpY2UgaXMgaW5mZXJyZWQgZnJvbSBhIG1vdW50ZWQgY2RmcyB2b2x1bWUsIHNvIGRldmljZSAwIGlzCisgICAgICAgbm90IG5lY2Vzc2FyaWx5IHRoZSBmaXJzdCBDRC1ST00gZGV2aWNlIG9uIHRoZSBzeXN0ZW0uIChTb21ld2hhdCBlYXN5IHRvIGZpeAorICAgICAgIGJ5IHVzZWluZyB0aGUgZGV2aWNlIG5hbWUgZnJvbSB0aGUgdm9sdW1lIGlkJ3MgdG8gcmVvcmRlciB0aGUgdm9sdW1lcykKKyAgICAgICAKKyAgICAyLiBZb3UgY2FuIG9ubHkgb3BlbiBhbmQgY29udHJvbCAxIENELVJPTSBkZXZpY2UgYXQgYSB0aW1lLiAoQ2hhbGxlbmdpbmcgdG8gZml4LAorICAgICAgIGR1ZSB0byBleHRlbnNpdmUgY29kZSByZXN0cnVjdHVyaW5nKQorICAgIAorICAgIDMuIFRoZSBzdGF0dXMgcmVwb3J0ZWQgYnkgU0RMX0NEU3RhdHVzIG9ubHkgY2hhbmdlcyB0byBmcm9tIENEX1BMQVlJTkcgdG8gQ0RfU1RPUFBFRCBpbgorICAgICAgIDEtc2Vjb25kIGludGVydmFscyAoYmVjYXVzZSB0aGUgYXVkaW8gaXMgYnVmZmVyZWQgaW4gMS1zZWNvbmQgY2h1bmtzKSBJZgorICAgICAgIHRoZSBhdWRpbyBkYXRhIGlzIGxlc3MgdGhhbiAxIHNlY29uZCwgdGhlIHJlbWFpbmRlciBpcyBmaWxsZWQgd2l0aCBzaWxlbmNlLgorICAgICAgIAorICAgICAgIElmIHlvdSBuZWVkIHRvIHBsYXkgc2VxdWVuY2VzIGJhY2stdG8tYmFjayB0aGF0IGFyZSBsZXNzIHRoYXQgMSBzZWNvbmQgbG9uZywKKyAgICAgICB1c2UgdGhlIGZyYW1lIHBvc2l0aW9uIHRvIGRldGVybWluZSB3aGVuIHRvIHBsYXkgdGhlIG5leHQgc2VxdWVuY2UsIGluc3RlYWQKKyAgICAgICBvZiBTRExfQ0RTdGF0dXMuCisgICAgICAgCisgICAgICAgVGhpcyBtYXkgYmUgcG9zc2libGUgdG8gZml4IHdpdGggYSBjbGV2ZXIgdXNhZ2Ugb2YgdGhlIEF1ZGlvVW5pdCBBUEkuCisgICAgICAgCisgICAgNC4gV2hlbiBuZXcgdm9sdW1lcyBhcmUgaW5zZXJ0ZWQsIG91ciB2b2x1bWUgaW5mb3JtYXRpb24gaXMgbm90IHVwZGF0ZWQuIFRoZSBvbmx5IHdheQorICAgICAgIHRvIHJlZnJlc2ggdGhpcyBpbmZvcm1hdGlvbiBpcyB0byByZWluaXQgdGhlIENELVJPTSBzdWJzeXN0ZW0gb2YgU0RMLiBUbyBmaXggdGhpcywKKyAgICAgICBvbmUgd291bGQgcHJvYmFibHkgaGF2ZSB0byBmaXggcG9pbnQgMSBhYm92ZSBmaXJzdCwgdGhlbiBmaWd1cmUgb3V0IGhvdyB0byByZWdpc3RlcgorICAgICAgIGZvciBhIG5vdGlmaWNhdGlvbiB3aGVuIG5ldyBtZWRpYSBpcyBtb3VudGVkIGluIG9yZGVyIHRvIHBlcmZvcm0gYW4gYXV0b21hdGljCisgICAgICAgcmVzY2FuIGZvciBjZGZzIHZvbHVtZXMuCisgICAgCisgICAgCisgICAgCisgICAgU28sIGhlcmUgY29tZXMgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhpcyBhbGwgd29ya3MuCisgICAgCisgICAgICAgIDwgSW5pdGlhbGl6aW5nID4KKyAgICAgICAgCisgICAgICAgIFRvIGdldCB0aGluZ3Mgcm9sbGluZywgd2UgaGF2ZSB0byBsb2NhdGUgbW91bnRlZCB2b2x1bWVzIHRoYXQgY29udGFpbgorICAgICAgICBhdWRpbyAoc2luY2UgbmVhcmx5IGFsbCBNYWNzIGRvbid0IGhhdmUgYW5hbG9nIGF1ZGlvLWluIG9uIHRoZSBzb3VuZCBjYXJkKS4KKyAgICAgICAgVGhhdCdzIGVhc3ksIHNpbmNlIHRoZXNlIHZvbHVtZXMgaGF2ZSBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhpcyBzcGVjaWFsCisgICAgICAgIGZpbGVzeXN0ZW0uIFNlZSBEZXRlY3RBdWRpb0NEVm9sdW1lcygpIGluIENEUGxheWVyLmNwcCBmb3IgdGhpcyBjb2RlLgorICAgICAgICAKKyAgICAgICAgTmV4dCwgd2UgcGFyc2UgdGhlIGludmlzaWJsZSAuVE9DLnBsaXN0IGluIHRoZSByb290IG9mIHRoZSB2b2x1bWUsIHdoaWNoIGdldHMgdXMKKyAgICAgICAgdGhlIHRyYWNrIGluZm9ybWF0aW9uIChudW1iZXIsIG9mZnNldCwgbGVuZ3RoLCBsZWFkb3V0LCBldGMpLiBTZWUgUmVhZFRPQ0RhdGEoKSBpbgorICAgICAgICBDRFBsYXllci5jcHAgZm9yIHRoZSBza2lubnkgb24gdGhpcy4KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA8IFRoZSBQbGF5YmFjayBMb29wID4KKyAgICAgICAgCisgICAgICAgIE5vdyBjb21lIHRoZSB0cmlja3kgcGFydHMuIExldCdzIHN0YXJ0IHdpdGggYmFzaWMgYXVkaW8gcGxheWJhY2suIFdoZW4gYSBmcmFtZQorICAgICAgICByYW5nZSB0byBwbGF5IGlzIHJlcXVlc3RlZCwgd2UgbXVzdCBmaXJzdCBmaW5kIHRoZSAuYWlmZiBmaWxlcyBvbiB0aGUgdm9sdW1lLCAKKyAgICAgICAgaG9wZWZ1bGx5IGluIHRoZSByaWdodCBvcmRlci4gU2luY2UgdGhlc2UgZmlsZXMgYWxsIGJlZ2luIHdpdGggYSBudW1iZXIgIjEgQXVkaW8gVHJhY2siLCAKKyAgICAgICAgZXRjLCB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHRyYWNrIG9yZGVyLgorICAgICAgICAKKyAgICAgICAgT25jZSBhbGwgZmlsZXMgYXJlIGRldGVybWluZWQsIHdlIGhhdmUgdG8gZmluZCB3aGF0IGZpbGUgY29ycmVzcG9uZHMgdG8gdGhlIHN0YXJ0CisgICAgICAgIGFuZCBsZW5ndGggcGFyYW1ldGVyIHRvIFNETF9TWVNfQ0RQbGF5KCkuIEFnYWluLCB0aGlzIGlzIHF1aXRlIHNpbXBsZSBieSB3YWxraW5nIHRoZQorICAgICAgICBjZHJvbSdzIHRyYWNrIGxpc3QuIEF0IHRoaXMgcG9pbnQsIHdlIGFsc28gc2F2ZSB0aGUgb2Zmc2V0IHRvIHRoZSBuZXh0IHRyYWNrIGFuZCBmcmFtZXMKKyAgICAgICAgcmVtYWluaW5nLCBpZiB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIHBsYXkgYW5vdGhlciBmaWxlIGFmdGVyIHRoZSBmaXJzdCBvbmUuIFNlZQorICAgICAgICBHZXRGaWxlRm9yT2Zmc2V0KCkgZm9yIHRoaXMgY29kZS4KKyAgICAgICAgCisgICAgICAgIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbGwgaW5mbyBuZWVkZWQgdG8gc3RhcnQgcGxheWJhY2ssIHNvIHdlIGhhbmQgb2ZmIHRvIHRoZSBMb2FkRmlsZSgpCisgICAgICAgIGZ1bmN0aW9uLCB3aGljaCBwcm9jZWVkcyB0byBkbyBpdHMgbWFnaWMgYW5kIHBsYXlzIGJhY2sgdGhlIGZpbGUuCisgICAgICAgIAorICAgICAgICBXaGVuIHRoZSBmaWxlIGlzIGZpbmlzaGVkIHBsYXlpbmcsIENvbXBsZXRpb25Qcm9jKCkgaXMgaW52b2tlZCwgYXQgd2hpY2ggdGltZSB3ZSBjYW4KKyAgICAgICAgcGxheSB0aGUgbmV4dCBmaWxlIGlmIHRoZSBwcmV2aW91c2x5IHNhdmVkIG5leHQgdHJhY2sgYW5kIGZyYW1lcyByZW1haW5pbmcKKyAgICAgICAgaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkLiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA8IE1hZ2ljID4KKyAgICAgICAgCisgICAgICAgIE9LLCBzbyBpdCdzIG5vdCByZWFsbHkgbWFnaWMsIGJ1dCBzaW5jZSBJIGRvbid0IGZ1bGx5IHVuZGVyc3RhbmQgYWxsIHRoZSBoaWRkZW4gZGV0YWlscyBpdAorICAgICAgICBzZWVtcyBsaWtlIGl0IHRvIG1lIDstKSBUaGUgQVBJJ3MgaW52b2x2ZWQgYXJlIHRoZSBBdWRpb1VuaXQgYW5kIEF1ZGlvRmlsZSBBUEkncy4gVGhlc2UKKyAgICAgICAgYXBwZWFyIHRvIGJlIGFuIGV4dGVuc2lvbiBvZiBDb3JlQXVkaW8gZm9yIGNyZWF0aW5nIG1vZHVsYXIgcGxheWJhY2sgYW5kIGYveCBlbnRpdGllcy4KKyAgICAgICAgVGhlIGltcG9ydGFudCB0aGluZyBpcyB0aGF0IENQVSB1c2FnZSBpcyB2ZXJ5IGxvdyBhbmQgcmVsaWFiaWxpdHkgaXMgdmVyeSBoaWdoLiBZb3UnZAorICAgICAgICBiZSBoYXJkLXByZXNzZWQgdG8gZmluZCBhIHdheSB0byBzdHV0dGVyIHRoZSBwbGF5YmFjayB3aXRoIG90aGVyIENQVS1pbnRlbnNpdmUgdGFza3MuCisgICAgCisgICAgICAgIE9uZSBwYXJ0IG9mIHRoaXMgbWFnaWMgaXMgdGhhdCBpdCB1c2VzIG11bHRpcGxlIHRocmVhZHMsIHdoaWNoIGNhcnJpZXMgdGhlIHVzdWFsIHBvdGVudGlhbAorICAgICAgICBmb3IgZGlzYXN0ZXIgaWYgbm90IGhhbmRsZWQgY2FyZWZ1bGx5LiBQbGF5YmFjayBjdXJyZW50bHkgcmVxdWlyZXMgNCBhZGRpdGlvbmFsIHRocmVhZHM6CisgICAgICAgICAgICAxLiBUaGUgY29yZWF1ZGlvIHJ1bmxvb3AgdGhyZWFkCisgICAgICAgICAgICAyLiBUaGUgY29yZWF1ZGlvIGRldmljZSBpL28gdGhyZWFkCisgICAgICAgICAgICAzLiBUaGUgZmlsZSBzdHJlYW1pbmcgdGhyZWFkCisgICAgICAgICAgICA0LiBUaGUgbm90aWZpY2F0aW9uL2NhbGxiYWNrIHRocmVhZAorICAgICAgICAKKyAgICAgICAgVGhlIGZpcnN0IDIgdGhyZWFkcyBhcmUgbmVjZXNzYXJ5IGV2aWwgLSBDb3JlQXVkaW8gY3JlYXRlcyB0aGlzIG5vIG1hdHRlciB3aGF0IHRoZSBzaXR1YXRpb24KKyAgICAgICAgaXMgKGV2ZW4gdGhlIFNETCBzb3VuZCBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIHRoZXNlcyBzdWNrZXJzKS4gVGhlIGxhc3QgdHdvIGFyZSBhcmUgY3JlYXRlZAorICAgICAgICBieSB1cy4KKyAgICAgICAgCisgICAgICAgIFRoZSBmaWxlIGlzIHN0cmVhbWVkIGZyb20gZGlzayB1c2luZyBhIHRocmVhZGVkIGRvdWJsZS1idWZmZXIgYXBwcm9hY2guIAorICAgICAgICBUaGlzIHdheSwgdGhlIGhpZ2ggbGF0ZW5jeSBvcGVyYXRpb24gb2YgcmVhZGluZyBmcm9tIGRpc2sgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IGludGVycnVwdGluZworICAgICAgICB0aGUgcmVhbC10aW1lIGRldmljZSB0aHJlYWQgKHdoaWNoIGFtb3VudHMgdG8gYXZvaWRpbmcgZHJvcG91dHMpLiBUaGUgZGV2aWNlIHRocmVhZCBncmFicyB0aGUKKyAgICAgICAgYnVmZmVyIHRoYXQgaXNuJ3QgYmVpbmcgcmVhZCBhbmQgc2VuZHMgaXQgdG8gdGhlIENvcmVBdWRpbyBtaXhlciB3aGVyZSBpdCBldmVudHVhbGx5IGdldHMgCisgICAgICAgIHRvIHRoZSBzb3VuZCBjYXJkLgorICAgICAgICAKKyAgICAgICAgVGhlIGRldmljZSB0aHJlYWQgcG9zdHMgYSBub3RpZmljYXRpb24gd2hlbiB0aGUgZmlsZSBzdHJlYW1pbmcgdGhyZWFkIGlzIG91dCBvZiBkYXRhLiBUaGlzCisgICAgICAgIG5vdGlmaWNhdGlvbiBtdXN0IGJlIGhhbmRsZWQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gYXZvaWQgcG90ZW50aWFsIGRlYWRsb2NrIGluIHRoZQorICAgICAgICBkZXZpY2UgdGhyZWFkLiBUaGF0J3Mgd2hlcmUgdGhlIG5vdGlmaWNhdGlvbiB0aHJlYWQgY29tZXMgaW4uIFRoaXMgdGhyZWFkIGlzIHNpZ25hbGVkCisgICAgICAgIHdoZW5ldmVyIGEgbm90aWZpY2F0aW9uIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCwgc28gYW5vdGhlciBmaWxlIGNhbiBiZSBwbGF5ZWQgYmFjayBpZiBuZWVkIGJlLgorICAgICAgICAKKyAgICAgICAgVGhlIEFQSSBpbiBDRFBsYXllci5jcHAgY29udGFpbnMgc3luY2hyb25pemF0aW9uIGJlY2F1c2Ugb3RoZXJ3aXNlIGJvdGggdGhlIG5vdGlmaWNhdGlvbiB0aHJlYWQKKyAgICAgICAgYW5kIG1haW4gdGhyZWFkIChvciBhbm90aGVyIG90aGVyIHRocmVhZCB1c2luZyB0aGUgU0RMIENEIGFwaSkgY2FuIHBvdGVudGlhbGx5IGNhbGwgaXQgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c2Nkcm9tLmgiCisKKyNpbmNsdWRlICJDRFBsYXllci5oIgorCisjZGVmaW5lIGtFcnJvckZha2VEZXZpY2UgIkVycm9yOiBDYW5ub3QgcHJvY2VlZCBzaW5jZSB3ZSdyZSBmYWtpbmcgYSBDRC1ST00gZGV2aWNlLiBSZWluaXQgdGhlIENELVJPTSBzdWJzeXN0ZW0gdG8gc2NhbiBmb3IgbmV3IHZvbHVtZXMuIgorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL21pbnQvU0RMX3N5c2Nkcm9tLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL21pbnQvU0RMX3N5c2Nkcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjMTBlZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vbWludC9TRExfc3lzY2Ryb20uYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfQ0RST01fTUlOVAorCisvKgorCUF0YXJpIE1ldGFET1MgQ0QtUk9NIGZ1bmN0aW9ucworCisJUGF0cmljZSBNYW5kaW4KKyovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8bWludC9jZHJvbWlvLmg+CisjaW5jbHVkZSA8bWludC9tZXRhZG9zLmg+CisKKyNpbmNsdWRlICJTRExfY2Ryb20uaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKKworLyogU29tZSBpb2N0bCgpIGVycm5vIHZhbHVlcyB3aGljaCBvY2N1ciB3aGVuIHRoZSB0cmF5IGlzIGVtcHR5ICovCisjaWZuZGVmIEVOT01FRElVTQorI2RlZmluZSBFTk9NRURJVU0gRU5PRU5UCisjZW5kaWYKKyNkZWZpbmUgRVJSTk9fVFJBWUVNUFRZKGVycm5vKQlcCisJKChlcnJubyA9PSBFSU8pICAgIHx8IChlcnJubyA9PSBFTk9FTlQpIHx8IFwKKwkgKGVycm5vID09IEVJTlZBTCkgfHwgKGVycm5vID09IEVOT01FRElVTSkpCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIHdlJ2xsIGRldGVjdCAqLworI2RlZmluZSBNQVhfRFJJVkVTCTMyCQorCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhcgkJZGV2aWNlWzNdOwkvKiBQaHlzaWNhbCBkZXZpY2UgbGV0dGVyICsgJzonICsgJ1wwJyAqLworCW1ldGFvcGVuX3QJbWV0YW9wZW47CQkvKiBJbmZvcyBvbiBvcGVuZWQgZHJpdmUgKi8KK30gbWV0YWRvc19kcml2ZV90OworCitzdGF0aWMgbWV0YWRvc19kcml2ZV90IG1ldGFkb3NfZHJpdmVzW01BWF9EUklWRVNdOworCisvKiBUaGUgc3lzdGVtLWRlcGVuZGVudCBDRCBjb250cm9sIGZ1bmN0aW9ucyAqLworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSk7CitzdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0Rpb2N0bChpbnQgaWQsIGludCBjb21tYW5kLCB2b2lkICphcmcpOworc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOworc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKKworaW50IFNETF9TWVNfQ0RJbml0KHZvaWQpCit7CisJbWV0YWluaXRfdAltZXRhaW5pdD17MCwwLDAsMH07CisJbWV0YW9wZW5fdAltZXRhb3BlbjsKKwlpbnQgaSwgaGFuZGxlOworCXN0cnVjdCBjZHJvbV9zdWJjaG5sIGluZm87CisKKwlNZXRhaW5pdCgmbWV0YWluaXQpOworCWlmIChtZXRhaW5pdC52ZXJzaW9uID09IE5VTEwpIHsKKyNpZmRlZiBERUJVR19DRFJPTQorCQlmcHJpbnRmKHN0ZGVyciwgIk1ldGFET1Mgbm90IGluc3RhbGxlZFxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtZXRhaW5pdC5kcml2ZXNfbWFwID09IDApIHsKKyNpZmRlZiBERUJVR19DRFJPTQorCQlmcHJpbnRmKHN0ZGVyciwgIk5vIE1ldGFET1MgZGV2aWNlcyBwcmVzZW50XG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJU0RMX251bWNkcyA9IDA7CisJCisJZm9yIChpPSdBJzsgaTw9J1onOyBpKyspIHsKKwkJbWV0YWRvc19kcml2ZXNbU0RMX251bWNkc10uZGV2aWNlWzBdID0gMDsKKwkJbWV0YWRvc19kcml2ZXNbU0RMX251bWNkc10uZGV2aWNlWzFdID0gJzonOworCQltZXRhZG9zX2RyaXZlc1tTRExfbnVtY2RzXS5kZXZpY2VbMl0gPSAwOworCisJCWlmIChtZXRhaW5pdC5kcml2ZXNfbWFwICYgKDE8PChpLSdBJykpKSB7CisJCQloYW5kbGUgPSBNZXRhb3BlbihpLCAmbWV0YW9wZW4pOworCQkJaWYgKGhhbmRsZSA9PSAwKSB7CisKKwkJCQlpbmZvLmNkc2NfZm9ybWF0ID0gQ0RST01fTVNGOworCQkJCWlmICggKE1ldGFpb2N0bChpLCBNRVRBRE9TX0lPQ1RMX01BR0lDLCBDRFJPTVNVQkNITkwsICZpbmZvKSA9PSAwKSB8fCBFUlJOT19UUkFZRU1QVFkoZXJybm8pICkgeworCQkJCQltZXRhZG9zX2RyaXZlc1tTRExfbnVtY2RzXS5kZXZpY2VbMF0gPSBpOworCQkJCQkrK1NETF9udW1jZHM7CisJCQkJfQorCisJCQkJTWV0YWNsb3NlKGkpOworCQkJfQorCQl9CisJfQorCisJLyogRmlsbCBpbiBvdXIgZHJpdmVyIGNhcGFiaWxpdGllcyAqLworCVNETF9DRGNhcHMuTmFtZSA9IFNETF9TWVNfQ0ROYW1lOworCVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOworCVNETF9DRGNhcHMuQ2xvc2UgPSBTRExfU1lTX0NEQ2xvc2U7CisKKwlTRExfQ0RjYXBzLkdldFRPQyA9IFNETF9TWVNfQ0RHZXRUT0M7CisJU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOworCVNETF9DRGNhcHMuUGxheSA9IFNETF9TWVNfQ0RQbGF5OworCVNETF9DRGNhcHMuUGF1c2UgPSBTRExfU1lTX0NEUGF1c2U7CisJU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOworCVNETF9DRGNhcHMuU3RvcCA9IFNETF9TWVNfQ0RTdG9wOworCVNETF9DRGNhcHMuRWplY3QgPSBTRExfU1lTX0NERWplY3Q7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBTRExfU1lTX0NEUXVpdCh2b2lkKQoreworCVNETF9udW1jZHMgPSAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKQoreworCXJldHVybihtZXRhZG9zX2RyaXZlc1tkcml2ZV0uZGV2aWNlKTsKK30KKworc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpCit7CisJaW50IGhhbmRsZTsKKworCWhhbmRsZSA9IE1ldGFvcGVuKG1ldGFkb3NfZHJpdmVzW2RyaXZlXS5kZXZpY2VbMF0sICYobWV0YWRvc19kcml2ZXNbZHJpdmVdLm1ldGFvcGVuKSk7CisJaWYgKGhhbmRsZSA9PSAwKSB7CisJCXJldHVybiBkcml2ZTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKQoreworCU1ldGFjbG9zZShtZXRhZG9zX2RyaXZlc1tjZHJvbS0+aWRdLmRldmljZVswXSk7Cit9CisKK3N0YXRpYyBpbnQgU0RMX1NZU19DRGlvY3RsKGludCBpZCwgaW50IGNvbW1hbmQsIHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gTWV0YWlvY3RsKG1ldGFkb3NfZHJpdmVzW2lkXS5kZXZpY2VbMF0sIE1FVEFET1NfSU9DVExfTUFHSUMsIGNvbW1hbmQsIGFyZyk7CisJaWYgKCByZXR2YWwgPCAwICkgeworCQlTRExfU2V0RXJyb3IoImlvY3RsKCkgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJcmV0dXJuKHJldHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQoreworCWludCBpLG9rYXk7CisJc3RydWN0IGNkcm9tX3RvY2hkciB0b2M7CisJc3RydWN0IGNkcm9tX3RvY2VudHJ5IGVudHJ5OworCisJLyogVXNlIHN0YW5kYXJkIGlvY3RsKCkgKi8JCisJaWYgKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENEUk9NUkVBRFRPQ0hEUiwgJnRvYyk8MCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJY2Ryb20tPm51bXRyYWNrcyA9IHRvYy5jZHRoX3RyazEtdG9jLmNkdGhfdHJrMCsxOworCWlmICggY2Ryb20tPm51bXRyYWNrcyA+IFNETF9NQVhfVFJBQ0tTICkgeworCQljZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7CisJfQorCisJLyogUmVhZCBhbGwgdGhlIHRyYWNrIFRPQyBlbnRyaWVzICovCisJb2theT0xOworCWZvciAoIGk9MDsgaTw9Y2Ryb20tPm51bXRyYWNrczsgKytpICkgeworCQlpZiAoIGkgPT0gY2Ryb20tPm51bXRyYWNrcyApIHsKKwkJCWNkcm9tLT50cmFja1tpXS5pZCA9IENEUk9NX0xFQURPVVQ7CisJCX0gZWxzZSB7CisJCQljZHJvbS0+dHJhY2tbaV0uaWQgPSB0b2MuY2R0aF90cmswK2k7CisJCX0KKwkJZW50cnkuY2R0ZV90cmFjayA9IGNkcm9tLT50cmFja1tpXS5pZDsKKwkJZW50cnkuY2R0ZV9mb3JtYXQgPSBDRFJPTV9NU0Y7CisJCWlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01SRUFEVE9DRU5UUlksICZlbnRyeSkgPCAwICkgeworCQkJb2theT0wOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpZiAoIGVudHJ5LmNkdGVfY3RybCAmIENEUk9NX0RBVEFfVFJBQ0sgKSB7CisJCQkJY2Ryb20tPnRyYWNrW2ldLnR5cGUgPSBTRExfREFUQV9UUkFDSzsKKwkJCX0gZWxzZSB7CisJCQkJY2Ryb20tPnRyYWNrW2ldLnR5cGUgPSBTRExfQVVESU9fVFJBQ0s7CisJCQl9CisJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gTVNGX1RPX0ZSQU1FUygKKwkJCQllbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwKKwkJCQllbnRyeS5jZHRlX2FkZHIubXNmLnNlY29uZCwKKwkJCQllbnRyeS5jZHRlX2FkZHIubXNmLmZyYW1lKTsKKwkJCQljZHJvbS0+dHJhY2tbaV0ubGVuZ3RoID0gMDsKKwkJCWlmICggaSA+IDAgKSB7CisJCQkJY2Ryb20tPnRyYWNrW2ktMV0ubGVuZ3RoID0gY2Ryb20tPnRyYWNrW2ldLm9mZnNldC1jZHJvbS0+dHJhY2tbaS0xXS5vZmZzZXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4ob2theSA/IDAgOiAtMSk7Cit9CisKKy8qIEdldCBDRC1ST00gc3RhdHVzICovCitzdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKQoreworCUNEc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgY2Ryb21fdG9jaGRyIHRvYzsKKwlzdHJ1Y3QgY2Ryb21fc3ViY2hubCBpbmZvOworCisJaW5mby5jZHNjX2Zvcm1hdCA9IENEUk9NX01TRjsKKwlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENEUk9NU1VCQ0hOTCwgJmluZm8pIDwgMCApIHsKKwkJaWYgKCBFUlJOT19UUkFZRU1QVFkoZXJybm8pICkgeworCQkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQ0RfRVJST1I7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGluZm8uY2RzY19hdWRpb3N0YXR1cykgeworCQkJY2FzZSBDRFJPTV9BVURJT19JTlZBTElEOgorCQkJY2FzZSBDRFJPTV9BVURJT19OT19TVEFUVVM6CisJCQkJLyogVHJ5IHRvIGRldGVybWluZSBpZiB0aGVyZSdzIGEgQ0QgYXZhaWxhYmxlICovCisJCQkJaWYgKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENEUk9NUkVBRFRPQ0hEUiwgJnRvYyk9PTApIHsKKwkJCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKKwkJCQl9IGVsc2UgeworCQkJCQlzdGF0dXMgPSBDRF9UUkFZRU1QVFk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBDRFJPTV9BVURJT19DT01QTEVURUQ6CisJCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0RST01fQVVESU9fUExBWToKKwkJCQlzdGF0dXMgPSBDRF9QTEFZSU5HOworCQkJCWJyZWFrOworCQkJY2FzZSBDRFJPTV9BVURJT19QQVVTRUQ6CisJCQkJLyogV29ya2Fyb3VuZCBidWdneSBDRC1ST00gZHJpdmUgKi8KKwkJCQlpZiAoIGluZm8uY2RzY190cmsgPT0gQ0RST01fTEVBRE9VVCApIHsKKwkJCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKKwkJCQl9IGVsc2UgeworCQkJCQlzdGF0dXMgPSBDRF9QQVVTRUQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzdGF0dXMgPSBDRF9FUlJPUjsKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIHBvc2l0aW9uICkgeworCQlpZiAoIHN0YXR1cyA9PSBDRF9QTEFZSU5HIHx8IChzdGF0dXMgPT0gQ0RfUEFVU0VEKSApIHsKKwkJCSpwb3NpdGlvbiA9IE1TRl9UT19GUkFNRVMoCisJCQkJCWluZm8uY2RzY19hYnNhZGRyLm1zZi5taW51dGUsCisJCQkJCWluZm8uY2RzY19hYnNhZGRyLm1zZi5zZWNvbmQsCisJCQkJCWluZm8uY2RzY19hYnNhZGRyLm1zZi5mcmFtZSk7CisJCX0gZWxzZSB7CisJCQkqcG9zaXRpb24gPSAwOworCQl9CisJfQorCXJldHVybihzdGF0dXMpOworfQorCisvKiBTdGFydCBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgY2Ryb21fbXNmIHBsYXl0aW1lOworCisJRlJBTUVTX1RPX01TRihzdGFydCwKKwkgICAmcGxheXRpbWUuY2Rtc2ZfbWluMCwgJnBsYXl0aW1lLmNkbXNmX3NlYzAsICZwbGF5dGltZS5jZG1zZl9mcmFtZTApOworCUZSQU1FU19UT19NU0Yoc3RhcnQrbGVuZ3RoLAorCSAgICZwbGF5dGltZS5jZG1zZl9taW4xLCAmcGxheXRpbWUuY2Rtc2Zfc2VjMSwgJnBsYXl0aW1lLmNkbXNmX2ZyYW1lMSk7CisjaWZkZWYgREVCVUdfQ0RST00KKyAgZnByaW50ZihzdGRlcnIsICJUcnlpbmcgdG8gcGxheSBmcm9tICVkOiVkOiVkIHRvICVkOiVkOiVkXG4iLAorCXBsYXl0aW1lLmNkbXNmX21pbjAsIHBsYXl0aW1lLmNkbXNmX3NlYzAsIHBsYXl0aW1lLmNkbXNmX2ZyYW1lMCwKKwlwbGF5dGltZS5jZG1zZl9taW4xLCBwbGF5dGltZS5jZG1zZl9zZWMxLCBwbGF5dGltZS5jZG1zZl9mcmFtZTEpOworI2VuZGlmCisKKwlyZXR1cm4gU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RST01QTEFZTVNGLCAmcGxheXRpbWUpOworfQorCisvKiBQYXVzZSBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKQoreworCXJldHVybiBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVBBVVNFLCAwKTsKK30KKworLyogUmVzdW1lIHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKQoreworCXJldHVybiBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVJFU1VNRSwgMCk7Cit9CisKKy8qIFN0b3AgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQoreworCXJldHVybiBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTVNUT1AsIDApOworfQorCisvKiBFamVjdCB0aGUgQ0QtUk9NICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKQoreworCXJldHVybiBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRFJPTUVKRUNULCAwKTsKK30KKworI2VuZGlmIC8qIFNETF9DRFJPTV9NSU5UICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL29wZW5ic2QvU0RMX3N5c2Nkcm9tLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL29wZW5ic2QvU0RMX3N5c2Nkcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkMDNhNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vb3BlbmJzZC9TRExfc3lzY2Ryb20uYwpAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfQ0RST01fT1BFTkJTRAorCisvKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL2NkaW8uaD4KKworI2luY2x1ZGUgIlNETF9jZHJvbS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgorCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIHdlJ2xsIGRldGVjdCAqLworI2RlZmluZSBNQVhfRFJJVkVTCTE2CQorCisvKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIENELVJPTSBkcml2ZXMgKi8KK3N0YXRpYyBjaGFyICpTRExfY2RsaXN0W01BWF9EUklWRVNdOworc3RhdGljIGRldl90IFNETF9jZG1vZGVbTUFYX0RSSVZFU107CisKKy8qIFRoZSBzeXN0ZW0tZGVwZW5kZW50IENEIGNvbnRyb2wgZnVuY3Rpb25zICovCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOworc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSk7CisKKy8qIFNvbWUgaW9jdGwoKSBlcnJubyB2YWx1ZXMgd2hpY2ggb2NjdXIgd2hlbiB0aGUgdHJheSBpcyBlbXB0eSAqLworI2RlZmluZSBFUlJOT19UUkFZRU1QVFkoZXJybm8pCVwKKwkoKGVycm5vID09IEVJTykgfHwgKGVycm5vID09IEVOT0VOVCkgfHwgKGVycm5vID09IEVJTlZBTCkgfHwgXAorCSAoZXJybm8gPT0gRU5PREVWKSkKKworLyogQ2hlY2sgYSBkcml2ZSB0byBzZWUgaWYgaXQgaXMgYSBDRC1ST00gKi8KK3N0YXRpYyBpbnQgQ2hlY2tEcml2ZShjaGFyICpkcml2ZSwgc3RydWN0IHN0YXQgKnN0YnVmKQoreworCWludCBpc19jZCwgY2RmZDsKKwlzdHJ1Y3QgaW9jX3JlYWRfc3ViY2hhbm5lbCBpbmZvOworCisJLyogSWYgaXQgZG9lc24ndCBleGlzdCwgcmV0dXJuIC0xICovCisJaWYgKCBzdGF0KGRyaXZlLCBzdGJ1ZikgPCAwICkgeworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIElmIGl0IGRvZXMgZXhpc3QsIHZlcmlmeSB0aGF0IGl0J3MgYW4gYXZhaWxhYmxlIENELVJPTSAqLworCWlzX2NkID0gMDsKKwlpZiAoIFNfSVNDSFIoc3RidWYtPnN0X21vZGUpIHx8IFNfSVNCTEsoc3RidWYtPnN0X21vZGUpICkgeworCQljZGZkID0gb3Blbihkcml2ZSwgKE9fUkRPTkxZfE9fRVhDTHxPX05PTkJMT0NLKSwgMCk7CisJCWlmICggY2RmZCA+PSAwICkgeworCQkJaW5mby5hZGRyZXNzX2Zvcm1hdCA9IENEX01TRl9GT1JNQVQ7CisJCQlpbmZvLmRhdGFfZm9ybWF0ID0gQ0RfQ1VSUkVOVF9QT1NJVElPTjsKKwkJCWluZm8uZGF0YV9sZW4gPSAwOworCQkJaW5mby5kYXRhID0gTlVMTDsKKwkJCS8qIFVuZGVyIExpbnV4LCBFSU8gb2NjdXJzIHdoZW4gYSBkaXNrIGlzIG5vdCBwcmVzZW50LgorCQkJICAgVGhpcyBpc24ndCAxMDAlIHJlbGlhYmxlLCBzbyB3ZSB1c2UgdGhlIFVTRV9NTlRFTlQKKwkJCSAgIGNvZGUgYWJvdmUgaW5zdGVhZC4KKwkJCSAqLworCQkJaWYgKCAoaW9jdGwoY2RmZCwgQ0RJT0NSRUFEU1VCQ0hBTk5FTCwgJmluZm8pID09IDApIHx8CisJCQkJCQlFUlJOT19UUkFZRU1QVFkoZXJybm8pICkgeworCQkJCWlzX2NkID0gMTsKKwkJCX0KKwkJCWNsb3NlKGNkZmQpOworCQl9CisJCWVsc2UgaWYgKEVSUk5PX1RSQVlFTVBUWShlcnJubykpCisJCQlpc19jZCA9IDE7CisJfQorCXJldHVybihpc19jZCk7Cit9CisKKy8qIEFkZCBhIENELVJPTSBkcml2ZSB0byBvdXIgbGlzdCBvZiB2YWxpZCBkcml2ZXMgKi8KK3N0YXRpYyB2b2lkIEFkZERyaXZlKGNoYXIgKmRyaXZlLCBzdHJ1Y3Qgc3RhdCAqc3RidWYpCit7CisJaW50IGk7CisKKwlpZiAoIFNETF9udW1jZHMgPCBNQVhfRFJJVkVTICkgeworCQkvKiBDaGVjayB0byBtYWtlIHN1cmUgaXQncyBub3QgYWxyZWFkeSBpbiBvdXIgbGlzdC4KKwkgCSAgIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIHNlZSBhIGRyaXZlIHZpYSBzeW1ib2xpYyBsaW5rLgorCQkgKi8KKwkJZm9yICggaT0wOyBpPFNETF9udW1jZHM7ICsraSApIHsKKwkJCWlmICggc3RidWYtPnN0X3JkZXYgPT0gU0RMX2NkbW9kZVtpXSApIHsKKyNpZmRlZiBERUJVR19DRFJPTQorICBmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSBkcml2ZSBkZXRlY3RlZDogJXMgPT0gJXNcbiIsIGRyaXZlLCBTRExfY2RsaXN0W2ldKTsKKyNlbmRpZgorCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCS8qIEFkZCB0aGlzIGRyaXZlIHRvIG91ciBsaXN0ICovCisJCWkgPSBTRExfbnVtY2RzOworCQlTRExfY2RsaXN0W2ldID0gU0RMX3N0cmR1cChkcml2ZSk7CisJCWlmICggU0RMX2NkbGlzdFtpXSA9PSBOVUxMICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm47CisJCX0KKwkJU0RMX2NkbW9kZVtpXSA9IHN0YnVmLT5zdF9yZGV2OworCQkrK1NETF9udW1jZHM7CisjaWZkZWYgREVCVUdfQ0RST00KKyAgZnByaW50ZihzdGRlcnIsICJBZGRlZCBDRC1ST00gZHJpdmU6ICVzXG4iLCBkcml2ZSk7CisjZW5kaWYKKwl9Cit9CisKK2ludCAgU0RMX1NZU19DREluaXQodm9pZCkKK3sKKwlzdGF0aWMgY2hhciAqY2hlY2tsaXN0W10gPSB7CisjaWYgZGVmaW5lZChfX09QRU5CU0RfXykKKwkJIj8wIGNkP2MiLCAiY2Ryb20iLCBOVUxMCisjZWxpZiBkZWZpbmVkKF9fTkVUQlNEX18pCisJCSI/MCBjZD9kIiwgIj8wIGNkP2MiLCAiY2Ryb20iLCBOVUxMCisjZWxzZQorCQkiPzAgY2Q/YyIsICI/MCBhY2Q/YyIsICJjZHJvbSIsIE5VTEwKKyNlbmRpZgorCX07CisJY2hhciAqU0RMY2Ryb207CisJaW50IGksIGosIGV4aXN0czsKKwljaGFyIGRyaXZlWzMyXTsKKwlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKworCS8qIEZpbGwgaW4gb3VyIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KKwlTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKKwlTRExfQ0RjYXBzLk9wZW4gPSBTRExfU1lTX0NET3BlbjsKKwlTRExfQ0RjYXBzLkdldFRPQyA9IFNETF9TWVNfQ0RHZXRUT0M7CisJU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOworCVNETF9DRGNhcHMuUGxheSA9IFNETF9TWVNfQ0RQbGF5OworCVNETF9DRGNhcHMuUGF1c2UgPSBTRExfU1lTX0NEUGF1c2U7CisJU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOworCVNETF9DRGNhcHMuU3RvcCA9IFNETF9TWVNfQ0RTdG9wOworCVNETF9DRGNhcHMuRWplY3QgPSBTRExfU1lTX0NERWplY3Q7CisJU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKKworCS8qIExvb2sgaW4gdGhlIGVudmlyb25tZW50IGZvciBvdXIgQ0QtUk9NIGRyaXZlIGxpc3QgKi8KKwlTRExjZHJvbSA9IFNETF9nZXRlbnYoIlNETF9DRFJPTSIpOwkvKiAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZGV2aWNlcyAqLworCWlmICggU0RMY2Ryb20gIT0gTlVMTCApIHsKKwkJY2hhciAqY2RwYXRoLCAqZGVsaW07CisJCXNpemVfdCBsZW4gPSBTRExfc3RybGVuKFNETGNkcm9tKSsxOworCQljZHBhdGggPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbGVuKTsKKwkJaWYgKCBjZHBhdGggIT0gTlVMTCApIHsKKwkJCVNETF9zdHJsY3B5KGNkcGF0aCwgU0RMY2Ryb20sIGxlbik7CisJCQlTRExjZHJvbSA9IGNkcGF0aDsKKwkJCWRvIHsKKwkJCQlkZWxpbSA9IFNETF9zdHJjaHIoU0RMY2Ryb20sICc6Jyk7CisJCQkJaWYgKCBkZWxpbSApIHsKKwkJCQkJKmRlbGltKysgPSAnXDAnOworCQkJCX0KKwkJCQlpZiAoIENoZWNrRHJpdmUoU0RMY2Ryb20sICZzdGJ1ZikgPiAwICkgeworCQkJCQlBZGREcml2ZShTRExjZHJvbSwgJnN0YnVmKTsKKwkJCQl9CisJCQkJaWYgKCBkZWxpbSApIHsKKwkJCQkJU0RMY2Ryb20gPSBkZWxpbTsKKwkJCQl9IGVsc2UgeworCQkJCQlTRExjZHJvbSA9IE5VTEw7CisJCQkJfQorCQkJfSB3aGlsZSAoIFNETGNkcm9tICk7CisJCQlTRExfc3RhY2tfZnJlZShjZHBhdGgpOworCQl9CisKKwkJLyogSWYgd2UgZm91bmQgb3VyIGRyaXZlcywgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gKi8KKwkJaWYgKCBTRExfbnVtY2RzID4gMCApIHsKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKworCS8qIFNjYW4gdGhlIHN5c3RlbSBmb3IgQ0QtUk9NIGRyaXZlcyAqLworCWZvciAoIGk9MDsgY2hlY2tsaXN0W2ldOyArK2kgKSB7CisJCWlmICggY2hlY2tsaXN0W2ldWzBdID09ICc/JyApIHsKKwkJCWNoYXIgKmluc2VydDsKKwkJCWV4aXN0cyA9IDE7CisJCQlmb3IgKCBqPWNoZWNrbGlzdFtpXVsxXTsgZXhpc3RzOyArK2ogKSB7CisJCQkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIi9kZXYvJXMiLCAmY2hlY2tsaXN0W2ldWzNdKTsKKwkJCQlpbnNlcnQgPSBTRExfc3RyY2hyKGRyaXZlLCAnPycpOworCQkJCWlmICggaW5zZXJ0ICE9IE5VTEwgKSB7CisJCQkJCSppbnNlcnQgPSBqOworCQkJCX0KKwkJCQlzd2l0Y2ggKENoZWNrRHJpdmUoZHJpdmUsICZzdGJ1ZikpIHsKKwkJCQkJLyogRHJpdmUgZXhpc3RzIGFuZCBpcyBhIENELVJPTSAqLworCQkJCQljYXNlIDE6CisJCQkJCQlBZGREcml2ZShkcml2ZSwgJnN0YnVmKTsKKwkJCQkJCWJyZWFrOworCQkJCQkvKiBEcml2ZSBleGlzdHMsIGJ1dCBpc24ndCBhIENELVJPTSAqLworCQkJCQljYXNlIDA6CisJCQkJCQlicmVhazsKKwkJCQkJLyogRHJpdmUgZG9lc24ndCBleGlzdCAqLworCQkJCQljYXNlIC0xOgorCQkJCQkJZXhpc3RzID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNETF9zbnByaW50Zihkcml2ZSwgU0RMX2FycmF5c2l6ZShkcml2ZSksICIvZGV2LyVzIiwgY2hlY2tsaXN0W2ldKTsKKwkJCWlmICggQ2hlY2tEcml2ZShkcml2ZSwgJnN0YnVmKSA+IDAgKSB7CisJCQkJQWRkRHJpdmUoZHJpdmUsICZzdGJ1Zik7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuKDApOworfQorCisvKiBHZW5lcmFsIGlvY3RsKCkgQ0QtUk9NIGNvbW1hbmQgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRGlvY3RsKGludCBpZCwgaW50IGNvbW1hbmQsIHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gaW9jdGwoaWQsIGNvbW1hbmQsIGFyZyk7CisJaWYgKCByZXR2YWwgPCAwICkgeworCQlTRExfU2V0RXJyb3IoImlvY3RsKCkgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJcmV0dXJuKHJldHZhbCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpCit7CisJcmV0dXJuKFNETF9jZGxpc3RbZHJpdmVdKTsKK30KKworc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpCit7CisJcmV0dXJuKG9wZW4oU0RMX2NkbGlzdFtkcml2ZV0sIChPX1JET05MWXxPX0VYQ0x8T19OT05CTE9DSyksIDApKTsKK30KKworc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pCit7CisJc3RydWN0IGlvY190b2NfaGVhZGVyIHRvYzsKKwlpbnQgaSwgb2theTsKKwlzdHJ1Y3QgaW9jX3JlYWRfdG9jX2VudHJ5IGVudHJ5OworCXN0cnVjdCBjZF90b2NfZW50cnkgZGF0YTsKKworCW9rYXkgPSAwOworCWlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT1JFQURUT0NIRUFERVIsICZ0b2MpID09IDAgKSB7CisJCWNkcm9tLT5udW10cmFja3MgPSB0b2MuZW5kaW5nX3RyYWNrLXRvYy5zdGFydGluZ190cmFjaysxOworCQlpZiAoIGNkcm9tLT5udW10cmFja3MgPiBTRExfTUFYX1RSQUNLUyApIHsKKwkJCWNkcm9tLT5udW10cmFja3MgPSBTRExfTUFYX1RSQUNLUzsKKwkJfQorCQkvKiBSZWFkIGFsbCB0aGUgdHJhY2sgVE9DIGVudHJpZXMgKi8KKwkJZm9yICggaT0wOyBpPD1jZHJvbS0+bnVtdHJhY2tzOyArK2kgKSB7CisJCQlpZiAoIGkgPT0gY2Ryb20tPm51bXRyYWNrcyApIHsKKwkJCQljZHJvbS0+dHJhY2tbaV0uaWQgPSAweEFBOyAvKiBDRFJPTV9MRUFET1VUICovCisJCQl9IGVsc2UgeworCQkJCWNkcm9tLT50cmFja1tpXS5pZCA9IHRvYy5zdGFydGluZ190cmFjaytpOworCQkJfQorCQkJZW50cnkuc3RhcnRpbmdfdHJhY2sgPSBjZHJvbS0+dHJhY2tbaV0uaWQ7CisJCQllbnRyeS5hZGRyZXNzX2Zvcm1hdCA9IENEX01TRl9GT1JNQVQ7CisJCQllbnRyeS5kYXRhX2xlbiA9IHNpemVvZihkYXRhKTsKKwkJCWVudHJ5LmRhdGEgPSAmZGF0YTsKKwkJCWlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT1JFQURUT0NFTlRSWVMsCisJCQkJCQkJCSZlbnRyeSkgPCAwICkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQljZHJvbS0+dHJhY2tbaV0udHlwZSA9IGRhdGEuY29udHJvbDsKKwkJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gTVNGX1RPX0ZSQU1FUygKKwkJCQkJCWRhdGEuYWRkci5tc2YubWludXRlLAorCQkJCQkJZGF0YS5hZGRyLm1zZi5zZWNvbmQsCisJCQkJCQlkYXRhLmFkZHIubXNmLmZyYW1lKTsKKwkJCQljZHJvbS0+dHJhY2tbaV0ubGVuZ3RoID0gMDsKKwkJCQlpZiAoIGkgPiAwICkgeworCQkJCQljZHJvbS0+dHJhY2tbaS0xXS5sZW5ndGggPQorCQkJCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldC0KKwkJCQkJCWNkcm9tLT50cmFja1tpLTFdLm9mZnNldDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCBpID09IChjZHJvbS0+bnVtdHJhY2tzKzEpICkgeworCQkJb2theSA9IDE7CisJCX0KKwl9CisJcmV0dXJuKG9rYXkgPyAwIDogLTEpOworfQorCisvKiBHZXQgQ0QtUk9NIHN0YXR1cyAqLworc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKK3sKKwlDRHN0YXR1cyBzdGF0dXM7CisJc3RydWN0IGlvY190b2NfaGVhZGVyIHRvYzsKKwlzdHJ1Y3QgaW9jX3JlYWRfc3ViY2hhbm5lbCBpbmZvOworCXN0cnVjdCBjZF9zdWJfY2hhbm5lbF9pbmZvIGRhdGE7CisKKwlpbmZvLmFkZHJlc3NfZm9ybWF0ID0gQ0RfTVNGX0ZPUk1BVDsKKwlpbmZvLmRhdGFfZm9ybWF0ID0gQ0RfQ1VSUkVOVF9QT1NJVElPTjsKKwlpbmZvLnRyYWNrID0gMDsKKwlpbmZvLmRhdGFfbGVuID0gc2l6ZW9mKGRhdGEpOworCWluZm8uZGF0YSA9ICZkYXRhOworCWlmICggaW9jdGwoY2Ryb20tPmlkLCBDRElPQ1JFQURTVUJDSEFOTkVMLCAmaW5mbykgPCAwICkgeworCQlpZiAoIEVSUk5PX1RSQVlFTVBUWShlcnJubykgKSB7CisJCQlzdGF0dXMgPSBDRF9UUkFZRU1QVFk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBDRF9FUlJPUjsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoZGF0YS5oZWFkZXIuYXVkaW9fc3RhdHVzKSB7CisJCQljYXNlIENEX0FTX0FVRElPX0lOVkFMSUQ6CisJCQljYXNlIENEX0FTX05PX1NUQVRVUzoKKwkJCQkvKiBUcnkgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlJ3MgYSBDRCBhdmFpbGFibGUgKi8KKwkJCQlpZiAoaW9jdGwoY2Ryb20tPmlkLENESU9SRUFEVE9DSEVBREVSLCZ0b2MpPT0wKQorCQkJCQlzdGF0dXMgPSBDRF9TVE9QUEVEOworCQkJCWVsc2UKKwkJCQkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOworCQkJCWJyZWFrOworCQkJY2FzZSBDRF9BU19QTEFZX0NPTVBMRVRFRDoKKwkJCQlzdGF0dXMgPSBDRF9TVE9QUEVEOworCQkJCWJyZWFrOworCQkJY2FzZSBDRF9BU19QTEFZX0lOX1BST0dSRVNTOgorCQkJCXN0YXR1cyA9IENEX1BMQVlJTkc7CisJCQkJYnJlYWs7CisJCQljYXNlIENEX0FTX1BMQVlfUEFVU0VEOgorCQkJCXN0YXR1cyA9IENEX1BBVVNFRDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc3RhdHVzID0gQ0RfRVJST1I7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCBwb3NpdGlvbiApIHsKKwkJaWYgKCBzdGF0dXMgPT0gQ0RfUExBWUlORyB8fCAoc3RhdHVzID09IENEX1BBVVNFRCkgKSB7CisJCQkqcG9zaXRpb24gPSBNU0ZfVE9fRlJBTUVTKAorCQkJCQlkYXRhLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2YubWludXRlLAorCQkJCQlkYXRhLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2Yuc2Vjb25kLAorCQkJCQlkYXRhLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2YuZnJhbWUpOworCQl9IGVsc2UgeworCQkJKnBvc2l0aW9uID0gMDsKKwkJfQorCX0KKwlyZXR1cm4oc3RhdHVzKTsKK30KKworLyogU3RhcnQgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGlvY19wbGF5X21zZiBwbGF5dGltZTsKKworCUZSQU1FU19UT19NU0Yoc3RhcnQsCisJCSZwbGF5dGltZS5zdGFydF9tLCAmcGxheXRpbWUuc3RhcnRfcywgJnBsYXl0aW1lLnN0YXJ0X2YpOworCUZSQU1FU19UT19NU0Yoc3RhcnQrbGVuZ3RoLAorCQkmcGxheXRpbWUuZW5kX20sICZwbGF5dGltZS5lbmRfcywgJnBsYXl0aW1lLmVuZF9mKTsKKyNpZmRlZiBERUJVR19DRFJPTQorICBmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyB0byBwbGF5IGZyb20gJWQ6JWQ6JWQgdG8gJWQ6JWQ6JWRcbiIsCisJcGxheXRpbWUuc3RhcnRfbSwgcGxheXRpbWUuc3RhcnRfcywgcGxheXRpbWUuc3RhcnRfZiwKKwlwbGF5dGltZS5lbmRfbSwgcGxheXRpbWUuZW5kX3MsIHBsYXl0aW1lLmVuZF9mKTsKKyNlbmRpZgorCWlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NTVEFSVCwgMCk7CisJcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9DUExBWU1TRiwgJnBsYXl0aW1lKSk7Cit9CisKKy8qIFBhdXNlIHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFBhdXNlKFNETF9DRCAqY2Ryb20pCit7CisJcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9DUEFVU0UsIDApKTsKK30KKworLyogUmVzdW1lIHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKQoreworCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBDRElPQ1JFU1VNRSwgMCkpOworfQorCisvKiBTdG9wIHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NTVE9QLCAwKSk7Cit9CisKKy8qIEVqZWN0IHRoZSBDRC1ST00gKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DREVqZWN0KFNETF9DRCAqY2Ryb20pCit7CisJU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgQ0RJT0NBTExPVywgMCk7CisJcmV0dXJuKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIENESU9DRUpFQ1QsIDApKTsKK30KKworLyogQ2xvc2UgdGhlIENELVJPTSBoYW5kbGUgKi8KK3N0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKQoreworCWNsb3NlKGNkcm9tLT5pZCk7Cit9CisKK3ZvaWQgU0RMX1NZU19DRFF1aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICggU0RMX251bWNkcyA+IDAgKSB7CisJCWZvciAoIGk9MDsgaTxTRExfbnVtY2RzOyArK2kgKSB7CisJCQlTRExfZnJlZShTRExfY2RsaXN0W2ldKTsKKwkJfQorCQlTRExfbnVtY2RzID0gMDsKKwl9Cit9CisKKyNlbmRpZiAvKiBTRExfQ0RST01fT1BFTkJTRCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9vczIvU0RMX3N5c2Nkcm9tLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL29zMi9TRExfc3lzY2Ryb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ5YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9vczIvU0RMX3N5c2Nkcm9tLmMKQEAgLTAsMCArMSwzOTMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0NEUk9NX09TMgorCisvKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCAqLworCisjZGVmaW5lIElOQ0xfTUNJT1MyCisjaW5jbHVkZSA8b3MyLmg+CisjaW5jbHVkZSA8b3MybWUuaD4KKworI2luY2x1ZGUgIlNETF9jZHJvbS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgorCisvKiBTaXplIG9mIE1DSSByZXN1bHQgYnVmZmVyIChpbiBieXRlcykgKi8KKyNkZWZpbmUgTUNJX0NNRFJFVEJVRlNJWkUJMTI4CisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIHdlJ2xsIGRldGVjdCAqLworI2RlZmluZSBNQVhfRFJJVkVTCTE2CQorCisvKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIENELVJPTSBkcml2ZXMgKi8KK3N0YXRpYyBjaGFyICpTRExfY2RsaXN0W01BWF9EUklWRVNdOworLy9zdGF0aWMgZGV2X3QgU0RMX2NkbW9kZVtNQVhfRFJJVkVTXTsKKworLyogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQ0QgY29udHJvbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOworc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpOworc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pOworc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RFamVjdChTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKKworLyogTUNJIFRpbWluZyBGdW5jdGlvbnMgKi8KKyNkZWZpbmUJTUNJX01NVElNRVBFUlNFQ09ORAkJMzAwMAorI2RlZmluZQlGUkFNRVNGUk9NTU0obW10aW1lKQkJKCgobW10aW1lKSpDRF9GUFMpL01DSV9NTVRJTUVQRVJTRUNPTkQpCisKKworLyogUmVhZHkgZm9yIE1DSSBDREF1ZGlvIERldmljZXMgKi8KK2ludCAgU0RMX1NZU19DREluaXQodm9pZCkKK3sKK2ludCBpOyAvKiBnZW5lcmlnIGNvdW50ZXIgKi8KK01DSV9TWVNJTkZPX1BBUk1TCQltc3A7CS8qIFN0cnVjdHVyZSB0byBNQ0kgU3lzSW5mbyBwYXJhbWV0ZXJzICovCitDSEFSIAkJCQkJCVN5c0luZm9SZXRbTUNJX0NNRFJFVEJVRlNJWkVdOwkvKiBCdWZmZXIgZm9yIE1DSSBDb21tYW5kIHJlc3VsdCAqLworCisvKiBGaWxsIGluIG91ciBkcml2ZXIgY2FwYWJpbGl0aWVzICovCitTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKK1NETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOworU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOworU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOworU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7CitTRExfQ0RjYXBzLlBhdXNlID0gU0RMX1NZU19DRFBhdXNlOworU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOworU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7CitTRExfQ0RjYXBzLkVqZWN0ID0gU0RMX1NZU19DREVqZWN0OworU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKKworLyogR2V0IHRoZSBudW1iZXIgb2YgQ0QgUk9NcyBpbiB0aGUgU3lzdGVtICovCisvKiBDbGVhbiBTeXNJbmZvIHN0cnVjdHVyZSAqLworU0RMX21lbXNldCgmbXNwLCAweDAwLCBzaXplb2YoTUNJX1NZU0lORk9fUEFSTVMpKTsKKy8qIFByZXBhcmUgc3RydWN0dXJlIHRvIEFzayBOdW1lciBvZiBBdWRpbyBDRHMgKi8KK21zcC51c0RldmljZVR5cGUgPSBNQ0lfREVWVFlQRV9DRF9BVURJTzsJLyogQ0QgQXVkaW8gVHlwZSAqLworbXNwLnBzelJldHVybiA9IChQU1opJlN5c0luZm9SZXQ7IAkvKiBSZXR1cm4gU3RydWN0dXJlICovCittc3AudWxSZXRTaXplID0gTUNJX0NNRFJFVEJVRlNJWkU7IAkvKiBTaXplIG9mIHJldCBzdHJ1Y3QgKi8KK2lmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZCgwLE1DSV9TWVNJTkZPLCBNQ0lfU1lTSU5GT19RVUFOVElUWSB8IE1DSV9XQUlULCAoUFZPSUQpJm1zcCwgMCkpICE9IE1DSUVSUl9TVUNDRVNTKSByZXR1cm4oQ0RfRVJST1IpOworU0RMX251bWNkcyA9IGF0b2koU3lzSW5mb1JldCk7CitpZiAoU0RMX251bWNkcyA+IE1BWF9EUklWRVMpIFNETF9udW1jZHMgPSBNQVhfRFJJVkVTOyAvKiBMaW1pdCBtYXhpbXVtIENEIG51bWJlciAqLworCisvKiBHZXQgYW5kIEFkZCB0aGVpciBzeXN0ZW0gbmFtZSB0byB0aGUgU0RMX2NkbGlzdCAqLworbXNwLnBzelJldHVybiA9IChQU1opJlN5c0luZm9SZXQ7IAkJCQkvKiBSZXR1cm4gU3RydWN0dXJlICovCittc3AudWxSZXRTaXplID0gTUNJX0NNRFJFVEJVRlNJWkU7IAkJCS8qIFNpemUgb2YgcmV0IHN0cnVjdCAqLworbXNwLnVzRGV2aWNlVHlwZSA9IE1DSV9ERVZUWVBFX0NEX0FVRElPOwkJLyogQ0QgQXVkaW8gVHlwZSAqLworZm9yIChpPTA7IGk8U0RMX251bWNkczsgaSsrKQorCXsKKwltc3AudWxOdW1iZXIgPSBpKzE7CisJbWNpU2VuZENvbW1hbmQoMCxNQ0lfU1lTSU5GTywgTUNJX1NZU0lORk9fTkFNRSB8IE1DSV9XQUlULCZtc3AsIDApOworCVNETF9jZGxpc3RbaV0gPSBTRExfc3RyZHVwKFN5c0luZm9SZXQpOworCWlmICggU0RMX2NkbGlzdFtpXSA9PSBOVUxMICkKKwkJeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCX0KK3JldHVybigwKTsKK30KKworLyogUmV0dXJuIENEQXVkaW8gU3lzdGVtIERlcGVuZGVudCBEZXZpY2UgTmFtZSAtIFJlYWR5IGZvciBNQ0kqLworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKK3sKK3JldHVybihTRExfY2RsaXN0W2RyaXZlXSk7Cit9CisKKy8qIE9wZW4gQ0RBdWRpbyBEZXZpY2UgLSBSZWFkeSBmb3IgTUNJICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSkKK3sKK01DSV9PUEVOX1BBUk1TCW1vcDsKK01DSV9TRVRfUEFSTVMgbXNwOworTUNJX0dFTkVSSUNfUEFSTVMgbWdwOworCisvKiBPcGVuIHRoZSBkZXZpY2UgKi8KK21vcC5od25kQ2FsbGJhY2sgPSAoSFdORClOVUxMOwkJLy8gTm9uZQorbW9wLnVzRGV2aWNlSUQgPSAoVVNIT1JUKU5VTEw7CQkvLyBXaWxsIGJlIHJldHVybmVkLgorbW9wLnBzekRldmljZVR5cGUgPSAoUFNaKVNETF9jZGxpc3RbZHJpdmVdOwkJLy8gQ0RBdWRpbyBEZXZpY2UKK2lmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZCgwLE1DSV9PUEVOLE1DSV9XQUlULCZtb3AsIDApKSAhPSBNQ0lFUlJfU1VDQ0VTUykgcmV0dXJuKENEX0VSUk9SKTsKKy8qIFNldCB0aW1lIGZvcm1hdCAqLworbXNwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7CQkvLyBOb25lCittc3AudWxUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NU0Y7CS8vIE1pbnV0ZSA6IFNlY29uZCA6IEZyYW1lIHN0cnVjdHVyZQorbXNwLnVsU3BlZWRGb3JtYXQgPSAoVUxPTkcpTlVMTDsJCS8vIE5vIGNoYW5nZQorbXNwLnVsQXVkaW8gPSAoVUxPTkcpTlVMTDsJCQkJLy8gTm8gQ2hhbm5lbAorbXNwLnVsTGV2ZWwgPSAoVUxPTkcpTlVMTDsJCQkJLy8gTm8gVm9sdW1lCittc3AudWxPdmVyID0gKFVMT05HKU5VTEw7CQkJCS8vIE5vIERlbGF5Cittc3AudWxJdGVtID0gKFVMT05HKU5VTEw7CQkJCS8vIE5vIGl0ZW0KK21zcC51bFZhbHVlID0gKFVMT05HKU5VTEw7CQkJCS8vIE5vIHZhbHVlIGZvciBpdGVtIGZsYWcKK2lmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZChtb3AudXNEZXZpY2VJRCxNQ0lfU0VULE1DSV9XQUlUIHwgTUNJX1NFVF9USU1FX0ZPUk1BVCwmbXNwLCAwKSkgPT0gTUNJRVJSX1NVQ0NFU1MpIHJldHVybiAobW9wLnVzRGV2aWNlSUQpOworLyogRXJyb3Igc2V0dGluZyB0aW1lIGZvcm1hdD8gLSBDbG9zZSBvcGVuZWQgZGV2aWNlICovCittZ3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKK21jaVNlbmRDb21tYW5kKG1vcC51c0RldmljZUlELE1DSV9DTE9TRSxNQ0lfV0FJVCwmbWdwLCAwKTsKK3JldHVybihDRF9FUlJPUik7Cit9CisKKy8qIEdldCBDRCBUYWJsZSBPZiBDb250ZW50cyAtIFJlYWR5IGZvciBNQ0kgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQoreworTUNJX1RPQ19QQVJNUyBtdHA7CitNQ0lfU1RBVFVTX1BBUk1TIG1zcDsKK01DSV9UT0NfUkVDICogbXRyOworSU5UIGk7CisKKy8qIENvcnJlY3Rpb24gYmVjYXVzZSBNQ0kgY2Fubm90IHJlYWQgVE9DIHdoaWxlIENEIGlzIHBsYXlpbmcgKGl0J2xsIHN0b3AhKSAqLworaWYgKGNkcm9tLT5zdGF0dXMgPT0gQ0RfUExBWUlORyB8fCBjZHJvbS0+c3RhdHVzID09IENEX1BBVVNFRCkgcmV0dXJuIDA7CisKKy8qIEdldCBOdW1iZXIgb2YgVHJhY2tzICovCittc3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsgLyogTm9uZSAqLworbXNwLnVsUmV0dXJuID0gKFVMT05HKU5VTEw7IC8qIFdlIHdhbnQgdGhpcyBpbmZvcm1hdGlvbiAqLworbXNwLnVsSXRlbSA9IE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUzsKK21zcC51bFZhbHVlID0gKFVMT05HKU5VTEw7IC8qIE5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KK2lmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZChjZHJvbS0+aWQsTUNJX1NUQVRVUyxNQ0lfV0FJVCB8IE1DSV9TVEFUVVNfSVRFTSwmbXNwLCAwKSkgIT0gTUNJRVJSX1NVQ0NFU1MpIHJldHVybihDRF9FUlJPUik7CitjZHJvbS0+bnVtdHJhY2tzID0gbXNwLnVsUmV0dXJuOworaWYgKCBjZHJvbS0+bnVtdHJhY2tzID4gU0RMX01BWF9UUkFDS1MgKQorCXsKKwljZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7CisJfQorLyogQWxvY2F0ZSBzcGFjZSBmb3IgVE9DIGRhdGEgKi8KK210ciA9IChNQ0lfVE9DX1JFQyAqKVNETF9tYWxsb2MoY2Ryb20tPm51bXRyYWNrcypzaXplb2YoTUNJX1RPQ19SRUMpKTsKK2lmICggbXRyID09IE5VTEwgKQorCXsKKwlTRExfT3V0T2ZNZW1vcnkoKTsKKwlyZXR1cm4oLTEpOworCX0KKy8qIEdldCBUT0MgZnJvbSBDRCAqLworbXRwLnBCdWYgPSBtdHI7CittdHAudWxCdWZTaXplID0gY2Ryb20tPm51bXRyYWNrcypzaXplb2YoTUNJX1RPQ19SRUMpOworaWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfR0VUVE9DLE1DSV9XQUlULCZtdHAsIDApKSAhPSBNQ0lFUlJfU1VDQ0VTUykKKwl7CisJU0RMX091dE9mTWVtb3J5KCk7CisJU0RMX2ZyZWUobXRyKTsKKwlyZXR1cm4oQ0RfRVJST1IpOworCX0KKy8qIEZpbGwgU0RMIFRyYWNrcyBTdHJ1Y3R1cmUgKi8KK2ZvciAoaT0wOyBpPGNkcm9tLT5udW10cmFja3M7IGkrKykKKwl7CisJLyogU2V0IFRyYWNrIElEICovCisJY2Ryb20tPnRyYWNrW2ldLmlkID0gKG10citpKS0+VHJhY2tOdW07CisJLyogU2V0IFRyYWNrIFR5cGUgKi8KKwltc3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsgLyogTm9uZSAqLworCW1zcC51bFJldHVybiA9IChVTE9ORylOVUxMOyAvKiBXZSB3YW50IHRoaXMgaW5mb3JtYXRpb24gKi8KKwltc3AudWxJdGVtID0gTUNJX0NEX1NUQVRVU19UUkFDS19UWVBFOworCW1zcC51bFZhbHVlID0gKFVMT05HKSgobXRyK2kpLT5UcmFja051bSk7IC8qIFRyYWNrIE51bWJlcj8gKi8KKwlpZiAoTE9VU0hPUlQobWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9TVEFUVVMsTUNJX1dBSVQgfCBNQ0lfVFJBQ0sgfCBNQ0lfU1RBVFVTX0lURU0sJm1zcCwgMCkpICE9IE1DSUVSUl9TVUNDRVNTKQorCQl7CisJCVNETF9mcmVlKG10cik7CisJCXJldHVybiAoQ0RfRVJST1IpOworCQl9CisJaWYgKG1zcC51bFJldHVybj09TUNJX0NEX1RSQUNLX0FVRElPKSBjZHJvbS0+dHJhY2tbaV0udHlwZSA9IFNETF9BVURJT19UUkFDSzsKKwllbHNlIGNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0RBVEFfVFJBQ0s7CisJLyogU2V0IFRyYWNrIExlbmd0aCAtIHZhbHVlcyBmcm9tIE1DSSBhcmUgaW4gTU1USU1FcyAtIDMwMDAgTU1USU1FID0gMSBzZWNvbmQgKi8KKwljZHJvbS0+dHJhY2tbaV0ubGVuZ3RoID0gRlJBTUVTRlJPTU1NKChtdHIraSktPnVsRW5kQWRkciAtIChtdHIraSktPnVsU3RhcnRBZGRyKTsKKwkvKiBTZXQgVHJhY2sgT2Zmc2V0ICovCisJY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IEZSQU1FU0ZST01NTSgobXRyK2kpLT51bFN0YXJ0QWRkcik7CisJfQorU0RMX2ZyZWUobXRyKTsKK3JldHVybigwKTsKK30KKworCisvKiBHZXQgQ0QtUk9NIHN0YXR1cyAtIFJlYWR5IGZvciBNQ0kgKi8KK3N0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pCit7CitDRHN0YXR1cyBzdGF0dXM7CitNQ0lfU1RBVFVTX1BBUk1TIG1zcDsKKworLyogR2V0IFN0YXR1cyBmcm9tIE1DSSAqLworbXNwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7IC8qIE5vbmUgKi8KK21zcC51bFJldHVybiA9IChVTE9ORylOVUxMOyAvKiBXZSB3YW50IHRoaXMgaW5mb3JtYXRpb24gKi8KK21zcC51bEl0ZW0gPSBNQ0lfU1RBVFVTX01PREU7Cittc3AudWxWYWx1ZSA9IChVTE9ORylOVUxMOyAvKiBObyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCitpZiAoTE9VU0hPUlQobWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9TVEFUVVMsTUNJX1dBSVQgfCBNQ0lfU1RBVFVTX0lURU0sJm1zcCwgMCkpICE9IE1DSUVSUl9TVUNDRVNTKSBzdGF0dXMgPSBDRF9FUlJPUjsKK2Vsc2UKKwl7CisJc3dpdGNoKG1zcC51bFJldHVybikKKwkJeworCQljYXNlCU1DSV9NT0RFX05PVF9SRUFEWToKKwkJCXN0YXR1cyA9IENEX1RSQVlFTVBUWTsKKwkJCWJyZWFrOworCQljYXNlCU1DSV9NT0RFX1BBVVNFOgorCQkJc3RhdHVzID0gQ0RfUEFVU0VEOworCQkJYnJlYWs7CisJCWNhc2UJTUNJX01PREVfUExBWToKKwkJCXN0YXR1cyA9IENEX1BMQVlJTkc7CisJCQlicmVhazsKKwkJY2FzZQlNQ0lfTU9ERV9TVE9QOgorCQkJc3RhdHVzID0gQ0RfU1RPUFBFRDsKKwkJCWJyZWFrOworCQkvKiBUaGVzZSBjYXNlcyBzaG91bGQgbm90IG9jY291ciAqLworCQljYXNlCU1DSV9NT0RFX1JFQ09SRDoKKwkJY2FzZQlNQ0lfTU9ERV9TRUVLOgorCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gQ0RfRVJST1I7CisJCQlicmVhazsKKwkJfQorCX0KKworLyogRGV0ZXJtaW5lIHBvc2l0aW9uICovCitpZiAocG9zaXRpb24gIT0gTlVMTCkgLyogVGhlIFNETCAkJiQmJSMgQ0RST00gY2FsbCBzZW5kcyBOVUxMIHBvaW50ZXIgaGVyZSEgKi8KKwl7CisJCWlmICgoc3RhdHVzID09IENEX1BMQVlJTkcpIHx8IChzdGF0dXMgPT0gQ0RfUEFVU0VEKSkKKwkJeworCQkvKiBHZXQgUG9zaXRpb24gKi8KKwkJbXNwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7IC8qIE5vbmUgKi8KKwkJbXNwLnVsUmV0dXJuID0gKFVMT05HKU5VTEw7IC8qIFdlIHdhbnQgdGhpcyBpbmZvcm1hdGlvbiAqLworCQltc3AudWxJdGVtID0gTUNJX1NUQVRVU19QT1NJVElPTjsKKwkJbXNwLnVsVmFsdWUgPSAoVUxPTkcpTlVMTDsgLyogTm8gYWRkaXRpb25hIGluZm8gKi8KKwkJaWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfU1RBVFVTLE1DSV9XQUlUIHwgTUNJX1NUQVRVU19JVEVNLCZtc3AsIDApKSAhPSBNQ0lFUlJfU1VDQ0VTUykgcmV0dXJuIChDRF9FUlJPUik7CisJCS8qIENvbnZlcnQgZnJvbSBNU0YgKGZvcm1hdCBzZWxlY3RlZCBpbiB0aGUgT3BlbiBwcm9jZXNzKSB0byBGcmFtZXMgKGZvcm1hdCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQpICovCisJCSpwb3NpdGlvbiA9IE1TRl9UT19GUkFNRVMoTVNGX01JTlVURShtc3AudWxSZXR1cm4pLE1TRl9TRUNPTkQobXNwLnVsUmV0dXJuKSxNU0ZfRlJBTUUobXNwLnVsUmV0dXJuKSk7CisJCX0KKwllbHNlICpwb3NpdGlvbiA9IDA7CisJfQorcmV0dXJuKHN0YXR1cyk7Cit9CisKKy8qIFN0YXJ0IHBsYXkgLSBSZWFkeSBmb3IgTUNJICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKK3sKK01DSV9HRU5FUklDX1BBUk1TIG1ncDsKK01DSV9TVEFUVVNfUEFSTVMgbXNwOworTUNJX1BMQVlfUEFSTVMJbXBwOworVUxPTkcgbWluLHNlYyxmcm07CisKKy8qIFN0YXJ0IE1TRiAqLworRlJBTUVTX1RPX01TRihzdGFydCwgJm1pbiwgJnNlYywgJmZybSk7CitNU0ZfTUlOVVRFKG1wcC51bEZyb20pID0gbWluOworTVNGX1NFQ09ORChtcHAudWxGcm9tKSA9IHNlYzsKK01TRl9GUkFNRShtcHAudWxGcm9tKSA9IGZybTsKKy8qIEVuZCBNU0YgKi8KK0ZSQU1FU19UT19NU0Yoc3RhcnQrbGVuZ3RoLCAmbWluLCAmc2VjLCAmZnJtKTsKK01TRl9NSU5VVEUobXBwLnVsVG8pID0gbWluOworTVNGX1NFQ09ORChtcHAudWxUbykgPSBzZWM7CitNU0ZfRlJBTUUobXBwLnVsVG8pID0gZnJtOworI2lmZGVmIERFQlVHX0NEUk9NCisJZnByaW50ZihzdGRlcnIsICJUcnlpbmcgdG8gcGxheSBmcm9tICVkOiVkOiVkIHRvICVkOiVkOiVkXG4iLAorCXBsYXl0aW1lLmNkbXNmX21pbjAsIHBsYXl0aW1lLmNkbXNmX3NlYzAsIHBsYXl0aW1lLmNkbXNmX2ZyYW1lMCwKKwlwbGF5dGltZS5jZG1zZl9taW4xLCBwbGF5dGltZS5jZG1zZl9zZWMxLCBwbGF5dGltZS5jZG1zZl9mcmFtZTEpOworI2VuZGlmCisvKiBWZXJpZmllcyBpZiBpdCBpcyBwYXVzZWQgZmlyc3QuLi4gYW5kIGlmIGl0IGlzLCB1bnBhdXNlIGJlZm9yZSBzdG9wcGluZyBpdC4gKi8KK21zcC5od25kQ2FsbGJhY2sgPSAoSFdORClOVUxMOyAvKiBOb25lICovCittc3AudWxSZXR1cm4gPSAoVUxPTkcpTlVMTDsgLyogV2Ugd2FudCB0aGlzIGluZm9ybWF0aW9uICovCittc3AudWxJdGVtID0gTUNJX1NUQVRVU19NT0RFOworbXNwLnVsVmFsdWUgPSAoVUxPTkcpTlVMTDsgLyogTm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLworaWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfU1RBVFVTLE1DSV9XQUlUIHwgTUNJX1NUQVRVU19JVEVNLCZtc3AsIDApKSA9PSBNQ0lFUlJfU1VDQ0VTUykKKwl7CisJaWYgKG1zcC51bFJldHVybiA9PSBNQ0lfTU9ERV9QQVVTRSkKKwkJeworCQltZ3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKKwkJbWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9SRVNVTUUsMCwmbWdwLCAwKTsKKwkJfQorCX0KKy8qIE5vdyBwbGF5IGl0LiAqLworbXBwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7CQkvLyBXZSBkbyBub3Qgd2FudCB0aGUgaW5mby4gdGVtcAoraWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfUExBWSxNQ0lfRlJPTSB8IE1DSV9UTywmbXBwLCAwKSkgPT0gTUNJRVJSX1NVQ0NFU1MpIHJldHVybiAwOworcmV0dXJuIChDRF9FUlJPUik7Cit9CisKKy8qIFBhdXNlIHBsYXkgLSBSZWFkeSBmb3IgTUNJICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKQoreworTUNJX0dFTkVSSUNfUEFSTVMgbWdwOworCittZ3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKK2lmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZChjZHJvbS0+aWQsTUNJX1BBVVNFLE1DSV9XQUlULCZtZ3AsIDApKSA9PSBNQ0lFUlJfU1VDQ0VTUykgcmV0dXJuIDA7CityZXR1cm4oQ0RfRVJST1IpOworfQorCisvKiBSZXN1bWUgcGxheSAtIFJlYWR5IGZvciBNQ0kgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKQoreworTUNJX0dFTkVSSUNfUEFSTVMgbWdwOworCittZ3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKK2lmIChMT1VTSE9SVChtY2lTZW5kQ29tbWFuZChjZHJvbS0+aWQsTUNJX1JFU1VNRSxNQ0lfV0FJVCwmbWdwLCAwKSkgPT0gTUNJRVJSX1NVQ0NFU1MpIHJldHVybiAwOworcmV0dXJuKENEX0VSUk9SKTsKK30KKworLyogU3RvcCBwbGF5IC0gUmVhZHkgZm9yIE1DSSAqLworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQoreworTUNJX0dFTkVSSUNfUEFSTVMgbWdwOworTUNJX1NUQVRVU19QQVJNUyBtc3A7CisKKy8qIFZlcmlmaWVzIGlmIGl0IGlzIHBhdXNlZCBmaXJzdC4uLiBhbmQgaWYgaXQgaXMsIHVucGF1c2UgYmVmb3JlIHN0b3BwaW5nIGl0LiAqLworbXNwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7IC8qIE5vbmUgKi8KK21zcC51bFJldHVybiA9IChVTE9ORylOVUxMOyAvKiBXZSB3YW50IHRoaXMgaW5mb3JtYXRpb24gKi8KK21zcC51bEl0ZW0gPSBNQ0lfU1RBVFVTX01PREU7Cittc3AudWxWYWx1ZSA9IChVTE9ORylOVUxMOyAvKiBObyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCitpZiAoTE9VU0hPUlQobWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9TVEFUVVMsTUNJX1dBSVQgfCBNQ0lfU1RBVFVTX0lURU0sJm1zcCwgMCkpID09IE1DSUVSUl9TVUNDRVNTKQorCXsKKwlpZiAobXNwLnVsUmV0dXJuID09IE1DSV9NT0RFX1BBVVNFKQorCQl7CisJCW1ncC5od25kQ2FsbGJhY2sgPSAoSFdORClOVUxMOwkJLy8gTm9uZQorCQltY2lTZW5kQ29tbWFuZChjZHJvbS0+aWQsTUNJX1JFU1VNRSwwLCZtZ3AsIDApOworCQl9CisJfQorLyogTm93IHN0b3BzIHRoZSBtZWRpYSAqLworbWdwLmh3bmRDYWxsYmFjayA9IChIV05EKU5VTEw7CQkvLyBOb25lCitpZiAoTE9VU0hPUlQobWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9TVE9QLE1DSV9XQUlULCZtZ3AsIDApKSA9PSBNQ0lFUlJfU1VDQ0VTUykgcmV0dXJuIDA7CityZXR1cm4oQ0RfRVJST1IpOworfQorCisvKiBFamVjdCB0aGUgQ0QtUk9NIC0gUmVhZHkgZm9yIE1DSSAqLworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKK01DSV9TRVRfUEFSTVMgbXNwOworCittc3AuaHduZENhbGxiYWNrID0gKEhXTkQpTlVMTDsJCS8vIE5vbmUKK21zcC51bFRpbWVGb3JtYXQgPSAoVUxPTkcpTlVMTDsJCS8vIE5vIGNoYW5nZQorbXNwLnVsU3BlZWRGb3JtYXQgPSAoVUxPTkcpTlVMTDsJCS8vIE5vIGNoYW5nZQorbXNwLnVsQXVkaW8gPSAoVUxPTkcpTlVMTDsJCQkJLy8gTm8gQ2hhbm5lbAorbXNwLnVsTGV2ZWwgPSAoVUxPTkcpTlVMTDsJCQkJLy8gTm8gVm9sdW1lCittc3AudWxPdmVyID0gKFVMT05HKU5VTEw7CQkJCS8vIE5vIERlbGF5Cittc3AudWxJdGVtID0gKFVMT05HKU5VTEw7CQkJCQkvLyBObyBpdGVtCittc3AudWxWYWx1ZSA9IChVTE9ORylOVUxMOwkJCQkJLy8gTm8gdmFsdWUgZm9yIGl0ZW0gZmxhZworaWYgKExPVVNIT1JUKG1jaVNlbmRDb21tYW5kKGNkcm9tLT5pZCxNQ0lfU0VULE1DSV9XQUlUIHwgTUNJX1NFVF9ET09SX09QRU4sJm1zcCwgMCkpID09IE1DSUVSUl9TVUNDRVNTKSByZXR1cm4gMDsKK3JldHVybihDRF9FUlJPUik7Cit9CisKKy8qIENsb3NlIHRoZSBDRC1ST00gaGFuZGxlIC0gUmVhZHkgZm9yIE1DSSAqLworc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCit7CitNQ0lfR0VORVJJQ19QQVJNUyBtZ3A7CisKK21ncC5od25kQ2FsbGJhY2sgPSAoSFdORClOVUxMOwkJLy8gTm9uZQorbWNpU2VuZENvbW1hbmQoY2Ryb20tPmlkLE1DSV9DTE9TRSxNQ0lfV0FJVCwmbWdwLCAwKTsKK30KKworLyogRmluYWxpemUgQ0RST00gU3Vic3lzdGVtIC0gUmVhZHkgZm9yIE1DSSAqLwordm9pZCBTRExfU1lTX0NEUXVpdCh2b2lkKQoreworaW50IGk7CisKK2lmICggU0RMX251bWNkcyA+IDAgKQorCXsKKwlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkKKwkJeworCQlTRExfZnJlZShTRExfY2RsaXN0W2ldKTsKKwkJfQorCVNETF9udW1jZHMgPSAwOworCX0KK30KKworI2VuZGlmIC8qIFNETF9DRFJPTV9PUzIgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vb3NmL1NETF9zeXNjZHJvbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9vc2YvU0RMX3N5c2Nkcm9tLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvY2Ryb20vb3NmL1NETF9zeXNjZHJvbS5jCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL29zZi9TRExfc3lzY2Ryb20uYwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9xbngvU0RMX3N5c2Nkcm9tLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL3FueC9TRExfc3lzY2Ryb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTM4Yjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jZHJvbS9xbngvU0RMX3N5c2Nkcm9tLmMKQEAgLTAsMCArMSw1NTEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0NEUk9NX1FOWAorCisvKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2Nkcm9tLmg+CisjaW5jbHVkZSA8c3lzL2RjbWRfY2FtLmg+CisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfY2Ryb20uaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIENELVJPTSBkcml2ZXMgd2UnbGwgZGV0ZWN0ICovCisjZGVmaW5lIE1BWF9EUklWRVMgMTYKKworI2RlZmluZSBRTlhfQ0RfT1BFTk1PREUgT19SRE9OTFkgfCBPX0VYQ0wKKworLyogQSBsaXN0IG9mIGF2YWlsYWJsZSBDRC1ST00gZHJpdmVzICovCitzdGF0aWMgY2hhciAqU0RMX2NkbGlzdFtNQVhfRFJJVkVTXTsKK3N0YXRpYyBkZXZfdCBTRExfY2Rtb2RlW01BWF9EUklWRVNdOworc3RhdGljIGludCAgIFNETF9jZG9wZW5bTUFYX0RSSVZFU107CisKKy8qIFRoZSBzeXN0ZW0tZGVwZW5kZW50IENEIGNvbnRyb2wgZnVuY3Rpb25zICovCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOworc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSk7CisKKy8qIENoZWNrIGEgZHJpdmUgdG8gc2VlIGlmIGl0IGlzIGEgQ0QtUk9NICovCitzdGF0aWMgaW50IENoZWNrRHJpdmUoY2hhciAqZHJpdmUsIHN0cnVjdCBzdGF0ICpzdGJ1ZikKK3sKKyAgICBpbnQgaXNfY2QsIGNkZmQ7CisgICAgY2FtX2RldmluZm9fdCBkaW5mbzsKKyAgICBpbnQgZGV2Y3RscmV0PTA7CisKKyAgICBpbnQgYXRhcGk7CisgICAgaW50IHJlbW92YWJsZTsKKyAgICBpbnQgY2RiMTA7CisKKyAgICAvKiBJZiBpdCBkb2Vzbid0IGV4aXN0LCByZXR1cm4gLTEgKi8KKyAgICBpZiAoc3RhdChkcml2ZSwgc3RidWYpIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLyogSWYgaXQgZG9lcyBleGlzdCwgdmVyaWZ5IHRoYXQgaXQncyBhbiBhdmFpbGFibGUgQ0QtUk9NICovCisgICAgaXNfY2QgPSAwOworCisgICAgaWYgKFNfSVNDSFIoc3RidWYtPnN0X21vZGUpIHx8IFNfSVNCTEsoc3RidWYtPnN0X21vZGUpKQorICAgIHsKKyAgICAgICAgY2RmZCA9IG9wZW4oZHJpdmUsIFFOWF9DRF9PUEVOTU9ERSk7CisgICAgICAgIGlmICggY2RmZCA+PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZGV2Y3RscmV0PWRldmN0bChjZGZkLCBEQ01EX0NBTV9ERVZJTkZPLCAmZGluZm8sIHNpemVvZihjYW1fZGV2aW5mb190KSwgTlVMTCk7CisKKyAgICAgICAgICAgIGlmIChkZXZjdGxyZXQ9PUVPSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGF0YXBpPWRpbmZvLmZsYWdzICYgREVWX0FUQVBJOworICAgICAgICAgICAgICAgcmVtb3ZhYmxlPWRpbmZvLmZsYWdzICYgREVWX1JFTU9WQUJMRTsKKyAgICAgICAgICAgICAgIGNkYjEwPWRpbmZvLmZsYWdzICYgREVWX0NEQl8xMDsgLyogSSdtIG5vdCBzdXJlIGFib3V0IHRoYXQgZmxhZyAqLworCisgICAgICAgICAgICAgICAvKiBpbiB0aGUgbmVhciBmdXR1cmUgbmVlZCB0byBhZGQgbW9yZSBjaGVja3MgZm9yIHNwbGl0dGluZyBjZHJvbXMgZnJvbSBvdGhlciBkZXZpY2VzICovCisgICAgICAgICAgICAgICBpZiAoKGF0YXBpKSYmKHJlbW92YWJsZSkpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgaXNfY2QgPSAxOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbG9zZShjZGZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oaXNfY2QpOworfQorCisvKiBBZGQgYSBDRC1ST00gZHJpdmUgdG8gb3VyIGxpc3Qgb2YgdmFsaWQgZHJpdmVzICovCitzdGF0aWMgdm9pZCBBZGREcml2ZShjaGFyICpkcml2ZSwgc3RydWN0IHN0YXQgKnN0YnVmKQoreworICAgIGludCBpOworCisgICAgaWYgKFNETF9udW1jZHMgPCBNQVhfRFJJVkVTKQorICAgIHsKKyAgICAgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGl0J3Mgbm90IGFscmVhZHkgaW4gb3VyIGxpc3QuCisgICAgICAgIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIHNlZSBhIGRyaXZlIHZpYSBzeW1ib2xpYyBsaW5rLiAqLworCisgICAgICAgIGZvciAoaT0wOyBpPFNETF9udW1jZHM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0YnVmLT5zdF9yZGV2ID09IFNETF9jZG1vZGVbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWRkIHRoaXMgZHJpdmUgdG8gb3VyIGxpc3QgKi8KKworICAgICAgICBpID0gU0RMX251bWNkczsKKyAgICAgICAgU0RMX2NkbGlzdFtpXSA9IFNETF9zdHJkdXAoZHJpdmUpOworICAgICAgICBpZiAoU0RMX2NkbGlzdFtpXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTRExfY2Rtb2RlW2ldID0gc3RidWYtPnN0X3JkZXY7CisgICAgICAgICsrU0RMX251bWNkczsKKyAgICB9Cit9CisKK2ludCBTRExfU1lTX0NESW5pdCh2b2lkKQoreworICAgIC8qIGNoZWNrbGlzdDogL2Rldi9jZHJvbSwgL2Rldi9jZD8sIC9kZXYvc2NkPyAqLworICAgIHN0YXRpYyBjaGFyICpjaGVja2xpc3RbXT17ImNkcm9tIiwgIj8wIGNkPyIsICI/MSBjZD8iLCAiPzAgc2NkPyIsIE5VTEx9OworCisgICAgY2hhciAqU0RMY2Ryb207CisgICAgaW50IGksIGosIGV4aXN0czsKKyAgICBjaGFyIGRyaXZlWzMyXTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKworICAgIC8qIEZpbGwgaW4gb3VyIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KKyAgICBTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKKyAgICBTRExfQ0RjYXBzLk9wZW4gPSBTRExfU1lTX0NET3BlbjsKKyAgICBTRExfQ0RjYXBzLkdldFRPQyA9IFNETF9TWVNfQ0RHZXRUT0M7CisgICAgU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOworICAgIFNETF9DRGNhcHMuUGxheSA9IFNETF9TWVNfQ0RQbGF5OworICAgIFNETF9DRGNhcHMuUGF1c2UgPSBTRExfU1lTX0NEUGF1c2U7CisgICAgU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOworICAgIFNETF9DRGNhcHMuU3RvcCA9IFNETF9TWVNfQ0RTdG9wOworICAgIFNETF9DRGNhcHMuRWplY3QgPSBTRExfU1lTX0NERWplY3Q7CisgICAgU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKKworICAgIC8qIGNsZWFyaW5nIGRldmljZSBvcGVuIHN0YXR1cyAqLworICAgIGZvciAoaT0wOyBpPE1BWF9EUklWRVM7IGkrKykKKyAgICB7CisgICAgICAgU0RMX2Nkb3BlbltpXT0wOworICAgIH0KKworICAgIC8qIExvb2sgaW4gdGhlIGVudmlyb25tZW50IGZvciBvdXIgQ0QtUk9NIGRyaXZlIGxpc3QgKi8KKyAgICBTRExjZHJvbSA9IFNETF9nZXRlbnYoIlNETF9DRFJPTSIpOwkvKiAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZGV2aWNlcyAqLworICAgIGlmICggU0RMY2Ryb20gIT0gTlVMTCApCisgICAgeworICAgICAgICBjaGFyICpjZHBhdGgsICpkZWxpbTsKKwlzaXplX3QgbGVuID0gU0RMX3N0cmxlbihTRExjZHJvbSkrMTsKKyAgICAgICAgY2RwYXRoID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIGxlbik7CisgICAgICAgIGlmIChjZHBhdGggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgU0RMX3N0cmxjcHkoY2RwYXRoLCBTRExjZHJvbSwgbGVuKTsKKyAgICAgICAgICAgIFNETGNkcm9tID0gY2RwYXRoOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGRlbGltID0gU0RMX3N0cmNocihTRExjZHJvbSwgJzonKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVsaW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqZGVsaW0rKyA9ICdcMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChDaGVja0RyaXZlKFNETGNkcm9tLCAmc3RidWYpID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFkZERyaXZlKFNETGNkcm9tLCAmc3RidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVsaW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTRExjZHJvbSA9IGRlbGltOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTRExjZHJvbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoU0RMY2Ryb20pOworICAgICAgICAgICAgU0RMX3N0YWNrX2ZyZWUoY2RwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHdlIGZvdW5kIG91ciBkcml2ZXMsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCisgICAgICAgIGlmIChTRExfbnVtY2RzID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2NhbiB0aGUgc3lzdGVtIGZvciBDRC1ST00gZHJpdmVzICovCisgICAgZm9yICggaT0wOyBjaGVja2xpc3RbaV07ICsraSApCisgICAgeworICAgICAgICBpZiAoY2hlY2tsaXN0W2ldWzBdID09ICc/JykKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciogaW5zZXJ0OworICAgICAgICAgICAgZXhpc3RzID0gMTsKKworICAgICAgICAgICAgZm9yICggaj1jaGVja2xpc3RbaV1bMV07IGV4aXN0czsgKytqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRExfc25wcmludGYoZHJpdmUsIFNETF9hcnJheXNpemUoZHJpdmUpLCAiL2Rldi8lcyIsICZjaGVja2xpc3RbaV1bM10pOworICAgICAgICAgICAgICAgIGluc2VydCA9IFNETF9zdHJjaHIoZHJpdmUsICc/Jyk7CisgICAgICAgICAgICAgICAgaWYgKGluc2VydCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKmluc2VydCA9IGo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoQ2hlY2tEcml2ZShkcml2ZSwgJnN0YnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIERyaXZlIGV4aXN0cyBhbmQgaXMgYSBDRC1ST00gKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGREcml2ZShkcml2ZSwgJnN0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIERyaXZlIGV4aXN0cywgYnV0IGlzbid0IGEgQ0QtUk9NICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIERyaXZlIGRvZXNuJ3QgZXhpc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIi9kZXYvJXMiLCBjaGVja2xpc3RbaV0pOworICAgICAgICAgICAgaWYgKENoZWNrRHJpdmUoZHJpdmUsICZzdGJ1ZikgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZERyaXZlKGRyaXZlLCAmc3RidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKK3sKKyAgICByZXR1cm4oU0RMX2NkbGlzdFtkcml2ZV0pOworfQorCitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSkKK3sKKyAgICBpbnQgaGFuZGxlOworCisgICAgaGFuZGxlPW9wZW4oU0RMX2NkbGlzdFtkcml2ZV0sIFFOWF9DRF9PUEVOTU9ERSk7CisKKyAgICBpZiAoaGFuZGxlPjApCisgICAgeworICAgICAgICBTRExfY2RvcGVuW2RyaXZlXT1oYW5kbGU7CisgICAgfQorCisgICAgcmV0dXJuIChoYW5kbGUpOworfQorCitzdGF0aWMgaW50IFNETF9TWVNfQ0RHZXRUT0MoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBjZHJvbV9yZWFkX3RvY190IHRvYzsKKyAgICBpbnQgaSwgb2theTsKKworICAgIG9rYXkgPSAwOworICAgIGlmIChkZXZjdGwoY2Ryb20tPmlkLCBEQ01EX0NBTV9DRFJPTVJFQURUT0MsICZ0b2MsIHNpemVvZih0b2MpLCBOVUxMKSA9PSAwKQorICAgIHsKKyAgICAgICAgY2Ryb20tPm51bXRyYWNrcyA9IHRvYy5sYXN0X3RyYWNrIC0gdG9jLmZpcnN0X3RyYWNrICsgMTsKKyAgICAgICAgaWYgKGNkcm9tLT5udW10cmFja3MgPiBTRExfTUFYX1RSQUNLUykKKyAgICAgICAgeworICAgICAgICAgICAgY2Ryb20tPm51bXRyYWNrcyA9IFNETF9NQVhfVFJBQ0tTOworICAgICAgICB9CisgICAgICAgIC8qIFJlYWQgYWxsIHRoZSB0cmFjayBUT0MgZW50cmllcyAqLworICAgICAgICBmb3IgKGk9MDsgaTw9Y2Ryb20tPm51bXRyYWNrczsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA9PSBjZHJvbS0+bnVtdHJhY2tzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNkcm9tLT50cmFja1tpXS5pZCA9IENEUk9NX0xFQURPVVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2Ryb20tPnRyYWNrW2ldLmlkID0gdG9jLmZpcnN0X3RyYWNrK2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNkcm9tLT50cmFja1tpXS50eXBlID0gdG9jLnRvY19lbnRyeVtpXS5jb250cm9sX2FkciAmIDB4MEY7CisgICAgICAgICAgICBjZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gdG9jLnRvY19lbnRyeVtpXS5hZGRyLmxiYTsKKyAgICAgICAgICAgIGNkcm9tLT50cmFja1tpXS5sZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGNkcm9tLT50cmFja1tpLTFdLmxlbmd0aCA9IGNkcm9tLT50cmFja1tpXS5vZmZzZXQtY2Ryb20tPnRyYWNrW2ktMV0ub2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID09IChjZHJvbS0+bnVtdHJhY2tzKzEpKQorICAgICAgICB7CisgICAgICAgICAgICBva2F5ID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKG9rYXkgPyAwIDogLTEpOworfQorCisvKiBHZXQgQ0QtUk9NIHN0YXR1cyAqLworc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKK3sKKyAgICBDRHN0YXR1cyBzdGF0dXM7CisKKyAgICBjZHJvbV9yZWFkX3RvY190IHRvYzsKKyAgICBjZHJvbV9zdWJjaF9kYXRhX3QgaW5mbzsKKyAgICBjYW1fZGV2aW5mb190IGRpbmZvOworCisgICAgaW50IGRldmN0bHJldD0wOworICAgIGludCBkcml2ZT0tMTsKKyAgICBpbnQgaTsKKyAgICBpbnQgZWFnYWluY250PTA7CisKKyAgICAvKiBjaGVjayBtZWRpYSBwcmVzZW5jZSBiZWZvcmUgcmVhZCBzdWJjaGFubmVsIGNhbGwsIHNvbWUgY2Ryb21zIGNhbiBsb2NrdXBzICovCisgICAgLyogaWYgbm8gbWVkaWEsIHdoaWxlIGNhbGxpbmcgcmVhZCBzdWJjaGFubmVsIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAqLworICAgIGRldmN0bHJldD1kZXZjdGwoY2Ryb20tPmlkLCBEQ01EX0NBTV9ERVZJTkZPLCAmZGluZm8sIHNpemVvZihjYW1fZGV2aW5mb190KSwgTlVMTCk7CisKKyAgICBpZiAoZGV2Y3RscmV0PT1FT0spCisgICAgeworICAgICAgICBpZiAoKGRpbmZvLmZsYWdzICYgREVWX05PX01FRElBKSE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQ0RfVFJBWUVNUFRZOworICAgICAgICAgICAgaWYgKHBvc2l0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwb3NpdGlvbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBtZWRpYSBleGlzdHMsIHRoZW4gZG8gb3RoZXIgc3R1ZmYgKi8KKworICAgIFNETF9tZW1zZXQoJmluZm8sIDB4MDAsIHNpemVvZihpbmZvKSk7CisgICAgaW5mby5zdWJjaF9jb21tYW5kLmRhdGFfZm9ybWF0ID0gQ0RST01fU1VCQ0hfQ1VSUkVOVF9QT1NJVElPTjsKKworICAgIGRvIHsKKyAgICAgICAgZGV2Y3RscmV0PWRldmN0bChjZHJvbS0+aWQsIERDTURfQ0FNX0NEUk9NU1VCQ0hOTCwgJmluZm8sIHNpemVvZihpbmZvKSwgTlVMTCk7CisgICAgICAgIGlmIChkZXZjdGxyZXQ9PUVJTykKKyAgICAgICAgeworICAgICAgICAgICAgLyogYmlnIHdvcmthcm91bmQgZm9yIG1lZGlhIGNoYW5nZSwgaGFuZGxlIGlzIHVudXNhYmxlIGFmdGVyIHRoYXQsCisgICAgICAgICAgICAgICB0aGF0IGJ1ZyB3YXMgZm91bmQgaW4gUU5YIDYuMiwgNi4yLjEgaXMgbm90IHJlbGVhc2VkIHlldC4gICAgKi8KKworICAgICAgICAgICAgZm9yIChpPTA7IGk8TUFYX0RSSVZFUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTRExfY2RvcGVuW2ldPT1jZHJvbS0+aWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkcml2ZT1pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHJpdmU9PS0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogdGhhdCBjYW5ub3QgaGFwcGVuLCBidXQgLi4uICovCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsb3NlKGNkcm9tLT5pZCk7CisgICAgICAgICAgICBjZHJvbS0+aWQ9b3BlbihTRExfY2RsaXN0W2RyaXZlXSwgUU5YX0NEX09QRU5NT0RFKTsKKyAgICAgICAgICAgIGRldmN0bHJldD1FQUdBSU47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmN0bHJldD09RUFHQUlOKQorICAgICAgICB7CisgICAgICAgICAgICBlYWdhaW5jbnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWFnYWluY250PT0yKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3b3JrYXJvdW5kIGZvciBicm9rZW4gY2Ryb21zLCB3aGljaCBjYW4gcmV0dXJuIGFsd2F5cyBFQUdBSU4gd2hlbiBpdHMgbm90IHJlYWR5LCAqLworICAgICAgICAgICAgLyogdGhhdCBtZWFuIGVycm9ybm91cyBtZWRpYSBvciBqdXN0IG5vIG1lZGlhIGF2YWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRldmN0bHJldD1FTlhJTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAoKGRldmN0bHJldD09RUFHQUlOKXx8KGRldmN0bHJldD09RVNUQUxFKSk7CisKKyAgICBpZiAoZGV2Y3RscmV0ICE9IDApCisgICAgeworICAgICAgICBpZiAoZGV2Y3RscmV0PT1FTlhJTykKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQ0RfVFJBWUVNUFRZOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQ0RfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoIChpbmZvLmN1cnJlbnRfcG9zaXRpb24uaGVhZGVyLmF1ZGlvX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBDRFJPTV9BVURJT19JTlZBTElEOgorICAgICAgICAgICAgY2FzZSBDRFJPTV9BVURJT19OT19TVEFUVVM6CisgICAgICAgICAgICAgICAgIC8qIFRyeSB0byBkZXRlcm1pbmUgaWYgdGhlcmUncyBhIENEIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgICBpZiAoZGV2Y3RsKGNkcm9tLT5pZCwgRENNRF9DQU1fQ0RST01SRUFEVE9DLCAmdG9jLCBzaXplb2YodG9jKSwgTlVMTCk9PTApCisgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDRF9TVE9QUEVEOworICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDRF9UUkFZRU1QVFk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDRFJPTV9BVURJT19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX1NUT1BQRUQ7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDRFJPTV9BVURJT19QTEFZOgorICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDRF9QTEFZSU5HOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0RST01fQVVESU9fUEFVU0VEOgorICAgICAgICAgICAgICAgICAvKiBXb3JrYXJvdW5kIGJ1Z2d5IENELVJPTSBkcml2ZSAqLworICAgICAgICAgICAgICAgICBpZiAoaW5mby5jdXJyZW50X3Bvc2l0aW9uLmRhdGFfZm9ybWF0ID09IENEUk9NX0xFQURPVVQpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IENEX1NUT1BQRUQ7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDRF9QQVVTRUQ7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDRF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocG9zaXRpb24pCisgICAgeworICAgICAgIGlmIChzdGF0dXM9PUNEX1BMQVlJTkcgfHwgKHN0YXR1cz09Q0RfUEFVU0VEKSkKKyAgICAgICB7CisgICAgICAgICAgICpwb3NpdGlvbiA9IE1TRl9UT19GUkFNRVMoaW5mby5jdXJyZW50X3Bvc2l0aW9uLmFkZHIubXNmLm1pbnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmN1cnJlbnRfcG9zaXRpb24uYWRkci5tc2Yuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uY3VycmVudF9wb3NpdGlvbi5hZGRyLm1zZi5mcmFtZSk7CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICAgICpwb3NpdGlvbiA9IDA7CisgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogU3RhcnQgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCit7CisgICAgY2Ryb21fcGxheW1zZl90IHBsYXl0aW1lOworCisgICAgRlJBTUVTX1RPX01TRihzdGFydCwgJnBsYXl0aW1lLnN0YXJ0X21pbnV0ZSwgJnBsYXl0aW1lLnN0YXJ0X3NlY29uZCwgJnBsYXl0aW1lLnN0YXJ0X2ZyYW1lKTsKKyAgICBGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwgJnBsYXl0aW1lLmVuZF9taW51dGUsICZwbGF5dGltZS5lbmRfc2Vjb25kLCAmcGxheXRpbWUuZW5kX2ZyYW1lKTsKKworICAgIGlmIChkZXZjdGwoY2Ryb20tPmlkLCBEQ01EX0NBTV9DRFJPTVBMQVlNU0YsICZwbGF5dGltZSwgc2l6ZW9mKHBsYXl0aW1lKSwgTlVMTCkgIT0gMCkKKyAgICB7CisgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogUGF1c2UgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBpZiAoZGV2Y3RsKGNkcm9tLT5pZCwgRENNRF9DQU1fQ0RST01QQVVTRSwgTlVMTCwgMCwgTlVMTCkhPTApCisgICAgeworICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIFJlc3VtZSBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBpZiAoZGV2Y3RsKGNkcm9tLT5pZCwgRENNRF9DQU1fQ0RST01SRVNVTUUsIE5VTEwsIDAsIE5VTEwpIT0wKQorICAgIHsKKyAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBTdG9wIHBsYXkgKi8KK3N0YXRpYyBpbnQgU0RMX1NZU19DRFN0b3AoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBpZiAoZGV2Y3RsKGNkcm9tLT5pZCwgRENNRF9DQU1fQ0RST01TVE9QLCBOVUxMLCAwLCBOVUxMKSE9MCkKKyAgICB7CisgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogRWplY3QgdGhlIENELVJPTSAqLworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKKyAgICBpZiAoZGV2Y3RsKGNkcm9tLT5pZCwgRENNRF9DQU1fRUpFQ1RfTUVESUEsIE5VTEwsIDAsIE5VTEwpIT0wKQorICAgIHsKKyAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLworc3RhdGljIHZvaWQgU0RMX1NZU19DRENsb3NlKFNETF9DRCAqY2Ryb20pCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxNQVhfRFJJVkVTOyBpKyspCisgICAgeworICAgICAgIGlmIChTRExfY2RvcGVuW2ldPT1jZHJvbS0+aWQpCisgICAgICAgeworICAgICAgICAgICBTRExfY2RvcGVuW2ldPTA7CisgICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgICB9CisKKyAgICBjbG9zZShjZHJvbS0+aWQpOworfQorCit2b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoU0RMX251bWNkcyA+IDApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTxTRExfbnVtY2RzOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9mcmVlKFNETF9jZGxpc3RbaV0pOworICAgICAgICB9CisgICAgICAgIFNETF9udW1jZHMgPSAwOworICAgIH0KK30KKworI2VuZGlmIC8qIFNETF9DRFJPTV9RTlggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY2Ryb20vd2luMzIvU0RMX3N5c2Nkcm9tLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL3dpbjMyL1NETF9zeXNjZHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzlmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2Nkcm9tL3dpbjMyL1NETF9zeXNjZHJvbS5jCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9DRFJPTV9XSU4zMgorCisvKiBGdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCAqLworCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KKworI2luY2x1ZGUgIlNETF9jZHJvbS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNjZHJvbS5oIgorCisvKiBUaGlzIHJlYWxseSBicm9rZW4/PyAqLworI2RlZmluZSBCUk9LRU5fTUNJX1BBVVNFCS8qIFBhdXNpbmcgYWN0dWFsbHkgc3RvcHMgcGxheSAtLSBEb2ghICovCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIHdlJ2xsIGRldGVjdCAoRG9uJ3QgY2hhbmdlISkgKi8KKyNkZWZpbmUgTUFYX0RSSVZFUwkyNgkKKworLyogQSBsaXN0IG9mIGF2YWlsYWJsZSBDRC1ST00gZHJpdmVzICovCitzdGF0aWMgY2hhciAqU0RMX2NkbGlzdFtNQVhfRFJJVkVTXTsKK3N0YXRpYyBNQ0lERVZJQ0VJRCBTRExfbWNpSURbTUFYX0RSSVZFU107CisjaWZkZWYgQlJPS0VOX01DSV9QQVVTRQorc3RhdGljIGludCBTRExfcGF1c2VkW01BWF9EUklWRVNdOworI2VuZGlmCitzdGF0aWMgaW50IFNETF9DRF9lbmRfcG9zaXRpb247CisKKy8qIFRoZSBzeXN0ZW0tZGVwZW5kZW50IENEIGNvbnRyb2wgZnVuY3Rpb25zICovCitzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DRE9wZW4oaW50IGRyaXZlKTsKK3N0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKTsKK3N0YXRpYyBDRHN0YXR1cyBTRExfU1lTX0NEU3RhdHVzKFNETF9DRCAqY2Ryb20sIGludCAqcG9zaXRpb24pOworc3RhdGljIGludCBTRExfU1lTX0NEUGxheShTRExfQ0QgKmNkcm9tLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgaW50IFNETF9TWVNfQ0RTdG9wKFNETF9DRCAqY2Ryb20pOworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7CitzdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSk7CisKKworLyogQWRkIGEgQ0QtUk9NIGRyaXZlIHRvIG91ciBsaXN0IG9mIHZhbGlkIGRyaXZlcyAqLworc3RhdGljIHZvaWQgQWRkRHJpdmUoY2hhciAqZHJpdmUpCit7CisJaW50IGk7CisKKwlpZiAoIFNETF9udW1jZHMgPCBNQVhfRFJJVkVTICkgeworCQkvKiBBZGQgdGhpcyBkcml2ZSB0byBvdXIgbGlzdCAqLworCQlpID0gU0RMX251bWNkczsKKwkJU0RMX2NkbGlzdFtpXSA9IFNETF9zdHJkdXAoZHJpdmUpOworCQlpZiAoIFNETF9jZGxpc3RbaV0gPT0gTlVMTCApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuOworCQl9CisJCSsrU0RMX251bWNkczsKKyNpZmRlZiBDRFJPTV9ERUJVRworICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIENELVJPTSBkcml2ZTogJXNcbiIsIGRyaXZlKTsKKyNlbmRpZgorCX0KK30KKworaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQoreworCS8qIGNoZWNrbGlzdDogRHJpdmUgJ0EnIC0gJ1onICovCisJaW50IGk7CisJY2hhciBkcml2ZVs0XTsKKworCS8qIEZpbGwgaW4gb3VyIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KKwlTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKKwlTRExfQ0RjYXBzLk9wZW4gPSBTRExfU1lTX0NET3BlbjsKKwlTRExfQ0RjYXBzLkdldFRPQyA9IFNETF9TWVNfQ0RHZXRUT0M7CisJU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOworCVNETF9DRGNhcHMuUGxheSA9IFNETF9TWVNfQ0RQbGF5OworCVNETF9DRGNhcHMuUGF1c2UgPSBTRExfU1lTX0NEUGF1c2U7CisJU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOworCVNETF9DRGNhcHMuU3RvcCA9IFNETF9TWVNfQ0RTdG9wOworCVNETF9DRGNhcHMuRWplY3QgPSBTRExfU1lTX0NERWplY3Q7CisJU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKKworCS8qIFNjYW4gdGhlIHN5c3RlbSBmb3IgQ0QtUk9NIGRyaXZlcyAqLworCWZvciAoIGk9J0EnOyBpPD0nWic7ICsraSApIHsKKwkJU0RMX3NucHJpbnRmKGRyaXZlLCBTRExfYXJyYXlzaXplKGRyaXZlKSwgIiVjOlxcIiwgaSk7CisJCWlmICggR2V0RHJpdmVUeXBlKGRyaXZlKSA9PSBEUklWRV9DRFJPTSApIHsKKwkJCUFkZERyaXZlKGRyaXZlKTsKKwkJfQorCX0KKwlTRExfbWVtc2V0KFNETF9tY2lJRCwgMCwgc2l6ZW9mKFNETF9tY2lJRCkpOworCXJldHVybigwKTsKK30KKworLyogR2VuZXJhbCBpb2N0bCgpIENELVJPTSBjb21tYW5kIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0Rpb2N0bChpbnQgaWQsIFVJTlQgbXNnLCBEV09SRCBmbGFncywgdm9pZCAqYXJnKQoreworCU1DSUVSUk9SIG1jaV9lcnJvcjsKKworCW1jaV9lcnJvciA9IG1jaVNlbmRDb21tYW5kKFNETF9tY2lJRFtpZF0sIG1zZywgZmxhZ3MsIChEV09SRF9QVFIpYXJnKTsKKwlpZiAoIG1jaV9lcnJvciApIHsKKwkJY2hhciBlcnJvclsyNTZdOworCisJCW1jaUdldEVycm9yU3RyaW5nKG1jaV9lcnJvciwgZXJyb3IsIDI1Nik7CisJCVNETF9TZXRFcnJvcigibWNpU2VuZENvbW1hbmQoKSBlcnJvcjogJXMiLCBlcnJvcik7CisJfQorCXJldHVybighbWNpX2Vycm9yID8gMCA6IC0xKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9TWVNfQ0ROYW1lKGludCBkcml2ZSkKK3sKKwlyZXR1cm4oU0RMX2NkbGlzdFtkcml2ZV0pOworfQorCitzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSkKK3sKKwlNQ0lfT1BFTl9QQVJNUyBtY2lfb3BlbjsKKwlNQ0lfU0VUX1BBUk1TIG1jaV9zZXQ7CisJY2hhciBkZXZpY2VbM107CisJRFdPUkQgZmxhZ3M7CisKKwkvKiBPcGVuIHRoZSByZXF1ZXN0ZWQgZGV2aWNlICovCisJbWNpX29wZW4ubHBzdHJEZXZpY2VUeXBlID0gKExQQ1NUUikgTUNJX0RFVlRZUEVfQ0RfQVVESU87CisJZGV2aWNlWzBdID0gKlNETF9jZGxpc3RbZHJpdmVdOworCWRldmljZVsxXSA9ICc6JzsKKwlkZXZpY2VbMl0gPSAnXDAnOworCW1jaV9vcGVuLmxwc3RyRWxlbWVudE5hbWUgPSBkZXZpY2U7CisJZmxhZ3MgPQorCSAgKE1DSV9PUEVOX1RZUEV8TUNJX09QRU5fU0hBUkVBQkxFfE1DSV9PUEVOX1RZUEVfSUR8TUNJX09QRU5fRUxFTUVOVCk7CisJaWYgKCBTRExfU1lTX0NEaW9jdGwoMCwgTUNJX09QRU4sIGZsYWdzLCAmbWNpX29wZW4pIDwgMCApIHsKKwkJZmxhZ3MgJj0gfk1DSV9PUEVOX1NIQVJFQUJMRTsKKwkJaWYgKCBTRExfU1lTX0NEaW9jdGwoMCwgTUNJX09QRU4sIGZsYWdzLCAmbWNpX29wZW4pIDwgMCApIHsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisJU0RMX21jaUlEW2RyaXZlXSA9IG1jaV9vcGVuLndEZXZpY2VJRDsKKworCS8qIFNldCB0aGUgbWludXRlLXNlY29uZC1mcmFtZSB0aW1lIGZvcm1hdCAqLworCW1jaV9zZXQuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NU0Y7CisJU0RMX1NZU19DRGlvY3RsKGRyaXZlLCBNQ0lfU0VULCBNQ0lfU0VUX1RJTUVfRk9STUFULCAmbWNpX3NldCk7CisKKyNpZmRlZiBCUk9LRU5fTUNJX1BBVVNFCisJU0RMX3BhdXNlZFtkcml2ZV0gPSAwOworI2VuZGlmCisJcmV0dXJuKGRyaXZlKTsKK30KKworc3RhdGljIGludCBTRExfU1lTX0NER2V0VE9DKFNETF9DRCAqY2Ryb20pCit7CisJTUNJX1NUQVRVU19QQVJNUyBtY2lfc3RhdHVzOworCWludCBpLCBva2F5OworCURXT1JEIGZsYWdzOworCisJb2theSA9IDA7CisJbWNpX3N0YXR1cy5kd0l0ZW0gPSBNQ0lfU1RBVFVTX05VTUJFUl9PRl9UUkFDS1M7CisJZmxhZ3MgPSBNQ0lfU1RBVFVTX0lURU0gfCBNQ0lfV0FJVDsKKwlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9TVEFUVVMsIGZsYWdzLCAmbWNpX3N0YXR1cykgPT0gMCApIHsKKwkJY2Ryb20tPm51bXRyYWNrcyA9IG1jaV9zdGF0dXMuZHdSZXR1cm47CisJCWlmICggY2Ryb20tPm51bXRyYWNrcyA+IFNETF9NQVhfVFJBQ0tTICkgeworCQkJY2Ryb20tPm51bXRyYWNrcyA9IFNETF9NQVhfVFJBQ0tTOworCQl9CisJCS8qIFJlYWQgYWxsIHRoZSB0cmFjayBUT0MgZW50cmllcyAqLworCQlmbGFncyA9IE1DSV9TVEFUVVNfSVRFTSB8IE1DSV9UUkFDSyB8IE1DSV9XQUlUOworCQlmb3IgKCBpPTA7IGk8Y2Ryb20tPm51bXRyYWNrczsgKytpICkgeworCQkJY2Ryb20tPnRyYWNrW2ldLmlkID0gaSsxOworCQkJbWNpX3N0YXR1cy5kd1RyYWNrID0gY2Ryb20tPnRyYWNrW2ldLmlkOworI2lmZGVmIE1DSV9DREFfU1RBVFVTX1RZUEVfVFJBQ0sKKwkJCW1jaV9zdGF0dXMuZHdJdGVtID0gTUNJX0NEQV9TVEFUVVNfVFlQRV9UUkFDSzsKKwkJCWlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1NUQVRVUywgZmxhZ3MsCisJCQkJCQkJJm1jaV9zdGF0dXMpIDwgMCApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICggbWNpX3N0YXR1cy5kd1JldHVybiA9PSBNQ0lfQ0RBX1RSQUNLX0FVRElPICkgeworCQkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOworCQkJfSBlbHNlIHsKKwkJCQljZHJvbS0+dHJhY2tbaV0udHlwZSA9IFNETF9EQVRBX1RSQUNLOworCQkJfQorI2Vsc2UKKwkJCWNkcm9tLT50cmFja1tpXS50eXBlID0gU0RMX0FVRElPX1RSQUNLOworI2VuZGlmCisJCQltY2lfc3RhdHVzLmR3SXRlbSA9IE1DSV9TVEFUVVNfUE9TSVRJT047CisJCQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9TVEFUVVMsIGZsYWdzLAorCQkJCQkJCSZtY2lfc3RhdHVzKSA8IDAgKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gTVNGX1RPX0ZSQU1FUygKKwkJCQkJTUNJX01TRl9NSU5VVEUobWNpX3N0YXR1cy5kd1JldHVybiksCisJCQkJCU1DSV9NU0ZfU0VDT05EKG1jaV9zdGF0dXMuZHdSZXR1cm4pLAorCQkJCQlNQ0lfTVNGX0ZSQU1FKG1jaV9zdGF0dXMuZHdSZXR1cm4pKTsKKwkJCWNkcm9tLT50cmFja1tpXS5sZW5ndGggPSAwOworCQkJaWYgKCBpID4gMCApIHsKKwkJCQljZHJvbS0+dHJhY2tbaS0xXS5sZW5ndGggPQorCQkJCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldC0KKwkJCQkJCWNkcm9tLT50cmFja1tpLTFdLm9mZnNldDsKKwkJCX0KKwkJfQorCQlpZiAoIGkgPT0gY2Ryb20tPm51bXRyYWNrcyApIHsKKwkJCW1jaV9zdGF0dXMuZHdUcmFjayA9IGNkcm9tLT50cmFja1tpIC0gMV0uaWQ7CisJCQltY2lfc3RhdHVzLmR3SXRlbSA9IE1DSV9TVEFUVVNfTEVOR1RIOworCQkJaWYgKCBTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBNQ0lfU1RBVFVTLCBmbGFncywKKwkJCQkJCQkmbWNpX3N0YXR1cykgPT0gMCApIHsKKwkJCQljZHJvbS0+dHJhY2tbaSAtIDFdLmxlbmd0aCA9IE1TRl9UT19GUkFNRVMoCisJCQkJCU1DSV9NU0ZfTUlOVVRFKG1jaV9zdGF0dXMuZHdSZXR1cm4pLAorCQkJCQlNQ0lfTVNGX1NFQ09ORChtY2lfc3RhdHVzLmR3UmV0dXJuKSwKKwkJCQkJTUNJX01TRl9GUkFNRShtY2lfc3RhdHVzLmR3UmV0dXJuKSk7CisJCQkJLyogY29tcHV0ZSBsZWFkLW91dCBvZmZzZXQgKi8KKwkJCQljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gY2Ryb20tPnRyYWNrW2kgLSAxXS5vZmZzZXQgKworCQkJCQljZHJvbS0+dHJhY2tbaSAtIDFdLmxlbmd0aDsKKwkJCQljZHJvbS0+dHJhY2tbaV0ubGVuZ3RoID0gMDsKKwkJCQlva2F5ID0gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4ob2theSA/IDAgOiAtMSk7Cit9CisKKy8qIEdldCBDRC1ST00gc3RhdHVzICovCitzdGF0aWMgQ0RzdGF0dXMgU0RMX1NZU19DRFN0YXR1cyhTRExfQ0QgKmNkcm9tLCBpbnQgKnBvc2l0aW9uKQoreworCUNEc3RhdHVzIHN0YXR1czsKKwlNQ0lfU1RBVFVTX1BBUk1TIG1jaV9zdGF0dXM7CisJRFdPUkQgZmxhZ3M7CisKKwlmbGFncyA9IE1DSV9TVEFUVVNfSVRFTSB8IE1DSV9XQUlUOworCW1jaV9zdGF0dXMuZHdJdGVtID0gTUNJX1NUQVRVU19NT0RFOworCWlmICggU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1NUQVRVUywgZmxhZ3MsICZtY2lfc3RhdHVzKSA8IDAgKSB7CisJCXN0YXR1cyA9IENEX0VSUk9SOworCX0gZWxzZSB7CisJCXN3aXRjaCAobWNpX3N0YXR1cy5kd1JldHVybikgeworCQkJY2FzZSBNQ0lfTU9ERV9OT1RfUkVBRFk6CisJCQljYXNlIE1DSV9NT0RFX09QRU46CisJCQkJc3RhdHVzID0gQ0RfVFJBWUVNUFRZOworCQkJCWJyZWFrOworCQkJY2FzZSBNQ0lfTU9ERV9TVE9QOgorI2lmZGVmIEJST0tFTl9NQ0lfUEFVU0UKKwkJCQlpZiAoIFNETF9wYXVzZWRbY2Ryb20tPmlkXSApIHsKKwkJCQkJc3RhdHVzID0gQ0RfUEFVU0VEOworCQkJCX0gZWxzZSB7CisJCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7CisJCQkJfQorI2Vsc2UKKwkJCQlzdGF0dXMgPSBDRF9TVE9QUEVEOworI2VuZGlmIC8qIEJST0tFTl9NQ0lfUEFVU0UgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgTUNJX01PREVfUExBWToKKyNpZmRlZiBCUk9LRU5fTUNJX1BBVVNFCisJCQkJaWYgKCBTRExfcGF1c2VkW2Nkcm9tLT5pZF0gKSB7CisJCQkJCXN0YXR1cyA9IENEX1BBVVNFRDsKKwkJCQl9IGVsc2UgeworCQkJCQlzdGF0dXMgPSBDRF9QTEFZSU5HOworCQkJCX0KKyNlbHNlCisJCQkJc3RhdHVzID0gQ0RfUExBWUlORzsKKyNlbmRpZiAvKiBCUk9LRU5fTUNJX1BBVVNFICovCisJCQkJYnJlYWs7CisJCQljYXNlIE1DSV9NT0RFX1BBVVNFOgorCQkJCXN0YXR1cyA9IENEX1BBVVNFRDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc3RhdHVzID0gQ0RfRVJST1I7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCBwb3NpdGlvbiApIHsKKwkJaWYgKCBzdGF0dXMgPT0gQ0RfUExBWUlORyB8fCAoc3RhdHVzID09IENEX1BBVVNFRCkgKSB7CisJCQltY2lfc3RhdHVzLmR3SXRlbSA9IE1DSV9TVEFUVVNfUE9TSVRJT047CisJCQlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9TVEFUVVMsIGZsYWdzLAorCQkJCQkJCSZtY2lfc3RhdHVzKSA9PSAwICkgeworCQkJCSpwb3NpdGlvbiA9IE1TRl9UT19GUkFNRVMoCisJCQkJCU1DSV9NU0ZfTUlOVVRFKG1jaV9zdGF0dXMuZHdSZXR1cm4pLAorCQkJCQlNQ0lfTVNGX1NFQ09ORChtY2lfc3RhdHVzLmR3UmV0dXJuKSwKKwkJCQkJTUNJX01TRl9GUkFNRShtY2lfc3RhdHVzLmR3UmV0dXJuKSk7CisJCQl9IGVsc2UgeworCQkJCSpwb3NpdGlvbiA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQkqcG9zaXRpb24gPSAwOworCQl9CisJfQorCXJldHVybihzdGF0dXMpOworfQorCisvKiBTdGFydCBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RQbGF5KFNETF9DRCAqY2Ryb20sIGludCBzdGFydCwgaW50IGxlbmd0aCkKK3sKKwlNQ0lfUExBWV9QQVJNUyBtY2lfcGxheTsKKwlpbnQgbSwgcywgZjsKKwlEV09SRCBmbGFnczsKKworCWZsYWdzID0gTUNJX0ZST00gfCBNQ0lfVE8gfCBNQ0lfTk9USUZZOworCW1jaV9wbGF5LmR3Q2FsbGJhY2sgPSAwOworCUZSQU1FU19UT19NU0Yoc3RhcnQsICZtLCAmcywgJmYpOworCW1jaV9wbGF5LmR3RnJvbSA9IE1DSV9NQUtFX01TRihtLCBzLCBmKTsKKwlGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwgJm0sICZzLCAmZik7CisJbWNpX3BsYXkuZHdUbyA9IE1DSV9NQUtFX01TRihtLCBzLCBmKTsKKwlTRExfQ0RfZW5kX3Bvc2l0aW9uID0gbWNpX3BsYXkuZHdUbzsKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1BMQVksIGZsYWdzLCAmbWNpX3BsYXkpKTsKK30KKworLyogUGF1c2UgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSkKK3sKKyNpZmRlZiBCUk9LRU5fTUNJX1BBVVNFCisJU0RMX3BhdXNlZFtjZHJvbS0+aWRdID0gMTsKKyNlbmRpZgorCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBNQ0lfUEFVU0UsIE1DSV9XQUlULCBOVUxMKSk7Cit9CisKKy8qIFJlc3VtZSBwbGF5ICovCitzdGF0aWMgaW50IFNETF9TWVNfQ0RSZXN1bWUoU0RMX0NEICpjZHJvbSkKK3sKKyNpZmRlZiBCUk9LRU5fTUNJX1BBVVNFCisJTUNJX1NUQVRVU19QQVJNUyBtY2lfc3RhdHVzOworCWludCBva2F5OworCWludCBmbGFnczsKKworCW9rYXkgPSAwOworCS8qIFBsYXkgZnJvbSB0aGUgY3VycmVudCBwbGF5IHBvc2l0aW9uIHRvIHRoZSBlbmQgcG9zaXRpb24gc2V0IGVhcmxpZXIgKi8KKwlmbGFncyA9IE1DSV9TVEFUVVNfSVRFTSB8IE1DSV9XQUlUOworCW1jaV9zdGF0dXMuZHdJdGVtID0gTUNJX1NUQVRVU19QT1NJVElPTjsKKwlpZiAoIFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9TVEFUVVMsIGZsYWdzLCAmbWNpX3N0YXR1cykgPT0gMCApIHsKKwkJTUNJX1BMQVlfUEFSTVMgbWNpX3BsYXk7CisKKwkJZmxhZ3MgPSBNQ0lfRlJPTSB8IE1DSV9UTyB8IE1DSV9OT1RJRlk7CisJCW1jaV9wbGF5LmR3Q2FsbGJhY2sgPSAwOworCQltY2lfcGxheS5kd0Zyb20gPSBtY2lfc3RhdHVzLmR3UmV0dXJuOworCQltY2lfcGxheS5kd1RvID0gU0RMX0NEX2VuZF9wb3NpdGlvbjsKKwkJaWYgKFNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsTUNJX1BMQVksZmxhZ3MsJm1jaV9wbGF5KSA9PSAwKSB7CisJCQlva2F5ID0gMTsKKwkJCVNETF9wYXVzZWRbY2Ryb20tPmlkXSA9IDA7CisJCX0KKwl9CisJcmV0dXJuKG9rYXkgPyAwIDogLTEpOworI2Vsc2UKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1JFU1VNRSwgTUNJX1dBSVQsIE5VTEwpKTsKKyNlbmRpZiAvKiBCUk9LRU5fTUNJX1BBVVNFICovCit9CisKKy8qIFN0b3AgcGxheSAqLworc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQoreworCXJldHVybihTRExfU1lTX0NEaW9jdGwoY2Ryb20tPmlkLCBNQ0lfU1RPUCwgTUNJX1dBSVQsIE5VTEwpKTsKK30KKworLyogRWplY3QgdGhlIENELVJPTSAqLworc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKK3sKKwlyZXR1cm4oU0RMX1NZU19DRGlvY3RsKGNkcm9tLT5pZCwgTUNJX1NFVCwgTUNJX1NFVF9ET09SX09QRU4sIE5VTEwpKTsKK30KKworLyogQ2xvc2UgdGhlIENELVJPTSBoYW5kbGUgKi8KK3N0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKQoreworCVNETF9TWVNfQ0Rpb2N0bChjZHJvbS0+aWQsIE1DSV9DTE9TRSwgTUNJX1dBSVQsIE5VTEwpOworfQorCit2b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoIFNETF9udW1jZHMgPiAwICkgeworCQlmb3IgKCBpPTA7IGk8U0RMX251bWNkczsgKytpICkgeworCQkJU0RMX2ZyZWUoU0RMX2NkbGlzdFtpXSk7CisJCQlTRExfY2RsaXN0W2ldID0gTlVMTDsKKwkJfQorCQlTRExfbnVtY2RzID0gMDsKKwl9Cit9CisKKyNlbmRpZiAvKiBTRExfQ0RST01fV0lOMzIgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY3B1aW5mby9TRExfY3B1aW5mby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9jcHVpbmZvL1NETF9jcHVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkMDgzOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvY3B1aW5mby9TRExfY3B1aW5mby5jCkBAIC0wLDAgKzEsNDk5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQ1BVIGZlYXR1cmUgZGV0ZWN0aW9uIGZvciBTREwgKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9jcHVpbmZvLmgiCisKKyNpZiBkZWZpbmVkKF9fTUFDT1NYX18pICYmIChkZWZpbmVkKF9fcHBjX18pIHx8IGRlZmluZWQoX19wcGM2NF9fKSkKKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+IC8qIEZvciBBbHRpVmVjIGNoZWNrICovCisjZWxpZiBTRExfQUxUSVZFQ19CTElUVEVSUyAmJiBIQVZFX1NFVEpNUAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2VuZGlmCisKKyNkZWZpbmUgQ1BVX0hBU19SRFRTQwkweDAwMDAwMDAxCisjZGVmaW5lIENQVV9IQVNfTU1YCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ1BVX0hBU19NTVhFWFQJMHgwMDAwMDAwNAorI2RlZmluZSBDUFVfSEFTXzNETk9XCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ1BVX0hBU18zRE5PV0VYVCAweDAwMDAwMDIwCisjZGVmaW5lIENQVV9IQVNfU1NFCTB4MDAwMDAwNDAKKyNkZWZpbmUgQ1BVX0hBU19TU0UyCTB4MDAwMDAwODAKKyNkZWZpbmUgQ1BVX0hBU19BTFRJVkVDCTB4MDAwMDAxMDAKKworI2lmIFNETF9BTFRJVkVDX0JMSVRURVJTICYmIEhBVkVfU0VUSk1QICYmICFfX01BQ09TWF9fCisvKiBUaGlzIGlzIHRoZSBicnV0ZSBmb3JjZSB3YXkgb2YgZGV0ZWN0aW5nIGluc3RydWN0aW9uIHNldHMuLi4KKyAgIHRoZSBpZGVhIGlzIGJvcnJvd2VkIGZyb20gdGhlIGxpYm1wZWcyIGxpYnJhcnkgLSB0aGFua3MhCisgKi8KK3N0YXRpYyBqbXBfYnVmIGptcGJ1ZjsKK3N0YXRpYyB2b2lkIGlsbGVnYWxfaW5zdHJ1Y3Rpb24oaW50IHNpZykKK3sKKwlsb25nam1wKGptcGJ1ZiwgMSk7Cit9CisjZW5kaWYgLyogSEFWRV9TRVRKTVAgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IENQVV9oYXZlQ1BVSUQodm9pZCkKK3sKKwlpbnQgaGFzX0NQVUlEID0gMDsKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKGkzODYpCisJX19hc21fXyAoCisiICAgICAgICBwdXNoZmwgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgb3JpZ2luYWwgRUZMQUdTICAgICAgICAgICAgIFxuIgorIiAgICAgICAgcG9wbCAgICAlJWVheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlYXgsJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICB4b3JsICAgICQweDIwMDAwMCwlJWVheCAgICAgIyBGbGlwIElEIGJpdCBpbiBFRkxBR1MgICAgICAgICAgIFxuIgorIiAgICAgICAgcHVzaGwgICAlJWVheCAgICAgICAgICAgICAgICMgU2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrICBcbiIKKyIgICAgICAgIHBvcGZsICAgICAgICAgICAgICAgICAgICAgICAjIFJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUgICAgXG4iCisiICAgICAgICBwdXNoZmwgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgbmV3IEVGTEFHUyAgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgcG9wbCAgICAlJWVheCAgICAgICAgICAgICAgICMgU3RvcmUgbmV3IEVGTEFHUyBpbiBFQVggICAgICAgICBcbiIKKyIgICAgICAgIHhvcmwgICAgJSVlY3gsJSVlYXggICAgICAgICAjIENhbiBub3QgdG9nZ2xlIElEIGJpdCwgICAgICAgICAgXG4iCisiICAgICAgICBqeiAgICAgIDFmICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzb3I9ODA0ODYgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgbW92bCAgICAkMSwlMCAgICAgICAgICAgICAgICMgV2UgaGF2ZSBDUFVJRCBzdXBwb3J0ICAgICAgICAgICBcbiIKKyIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPW0iIChoYXNfQ1BVSUQpCisJOgorCTogIiVlYXgiLCAiJWVjeCIKKwkpOworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX3g4Nl82NF9fKQorLyogVGVjaG5pY2FsbHksIGlmIHRoaXMgaXMgYmVpbmcgY29tcGlsZWQgdW5kZXIgX194ODZfNjRfXyB0aGVuIGl0IGhhcyAKK0NQVWlkIGJ5IGRlZmluaXRpb24uICBCdXQgaXQncyBuaWNlIHRvIGJlIGFibGUgdG8gcHJvdmUgaXQuICA6KSAgICAgICovCisJX19hc21fXyAoCisiICAgICAgICBwdXNoZnEgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgb3JpZ2luYWwgRUZMQUdTICAgICAgICAgICAgIFxuIgorIiAgICAgICAgcG9wcSAgICAlJXJheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIG1vdnEgICAgJSVyYXgsJSVyY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICB4b3JsICAgICQweDIwMDAwMCwlJWVheCAgICAgIyBGbGlwIElEIGJpdCBpbiBFRkxBR1MgICAgICAgICAgIFxuIgorIiAgICAgICAgcHVzaHEgICAlJXJheCAgICAgICAgICAgICAgICMgU2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrICBcbiIKKyIgICAgICAgIHBvcGZxICAgICAgICAgICAgICAgICAgICAgICAjIFJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUgICAgXG4iCisiICAgICAgICBwdXNoZnEgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgbmV3IEVGTEFHUyAgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgcG9wcSAgICAlJXJheCAgICAgICAgICAgICAgICMgU3RvcmUgbmV3IEVGTEFHUyBpbiBFQVggICAgICAgICBcbiIKKyIgICAgICAgIHhvcmwgICAgJSVlY3gsJSVlYXggICAgICAgICAjIENhbiBub3QgdG9nZ2xlIElEIGJpdCwgICAgICAgICAgXG4iCisiICAgICAgICBqeiAgICAgIDFmICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzb3I9ODA0ODYgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgbW92bCAgICAkMSwlMCAgICAgICAgICAgICAgICMgV2UgaGF2ZSBDUFVJRCBzdXBwb3J0ICAgICAgICAgICBcbiIKKyIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPW0iIChoYXNfQ1BVSUQpCisJOgorCTogIiVyYXgiLCAiJXJjeCIKKwkpOworI2VsaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikpIHx8IGRlZmluZWQoX19XQVRDT01DX18pCisJX19hc20geworICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgb3JpZ2luYWwgRUZMQUdTCisgICAgICAgIHBvcCAgICAgZWF4CisgICAgICAgIG1vdiAgICAgZWN4LCBlYXgKKyAgICAgICAgeG9yICAgICBlYXgsIDIwMDAwMGggICAgICAgIDsgRmxpcCBJRCBiaXQgaW4gRUZMQUdTCisgICAgICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgICAgICA7IFNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjaworICAgICAgICBwb3BmZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlCisgICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBuZXcgRUZMQUdTCisgICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IFN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYCisgICAgICAgIHhvciAgICAgZWF4LCBlY3ggICAgICAgICAgICA7IENhbiBub3QgdG9nZ2xlIElEIGJpdCwKKyAgICAgICAganogICAgICBkb25lICAgICAgICAgICAgICAgIDsgUHJvY2Vzc29yPTgwNDg2CisgICAgICAgIG1vdiAgICAgaGFzX0NQVUlELDEgICAgICAgICA7IFdlIGhhdmUgQ1BVSUQgc3VwcG9ydAorZG9uZToKKwl9CisjZWxpZiBkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9faTM4NikKKwlfX2FzbSAoCisiICAgICAgIHB1c2hmbCAgICAgICAgICAgICAgICAgXG4iCisiCXBvcGwgICAgJWVheCAgICAgICAgICAgXG4iCisiCW1vdmwgICAgJWVheCwlZWN4ICAgICAgXG4iCisiCXhvcmwgICAgJDB4MjAwMDAwLCVlYXggXG4iCisiCXB1c2hsICAgJWVheCAgICAgICAgICAgXG4iCisiCXBvcGZsICAgICAgICAgICAgICAgICAgXG4iCisiCXB1c2hmbCAgICAgICAgICAgICAgICAgXG4iCisiCXBvcGwgICAgJWVheCAgICAgICAgICAgXG4iCisiCXhvcmwgICAgJWVjeCwlZWF4ICAgICAgXG4iCisiCWp6ICAgICAgMWYgICAgICAgICAgICAgXG4iCisiCW1vdmwgICAgJDEsLTgoJWVicCkgICAgXG4iCisiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJKTsKKyNlbGlmIGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19hbWQ2NCkKKwlfX2FzbSAoCisiICAgICAgIHB1c2hmcSAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgIHBvcHEgICAgJXJheCAgICAgICAgICAgXG4iCisiICAgICAgIG1vdnEgICAgJXJheCwlcmN4ICAgICAgXG4iCisiICAgICAgIHhvcmwgICAgJDB4MjAwMDAwLCVlYXggXG4iCisiICAgICAgIHB1c2hxICAgJXJheCAgICAgICAgICAgXG4iCisiICAgICAgIHBvcGZxICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgIHB1c2hmcSAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgIHBvcHEgICAgJXJheCAgICAgICAgICAgXG4iCisiICAgICAgIHhvcmwgICAgJWVjeCwlZWF4ICAgICAgXG4iCisiICAgICAgIGp6ICAgICAgMWYgICAgICAgICAgICAgXG4iCisiICAgICAgIG1vdmwgICAgJDEsLTgoJXJicCkgICAgXG4iCisiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJKTsKKyNlbmRpZgorCXJldHVybiBoYXNfQ1BVSUQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBDUFVfZ2V0Q1BVSURGZWF0dXJlcyh2b2lkKQoreworCWludCBmZWF0dXJlcyA9IDA7CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChpMzg2KQorCV9fYXNtX18gKAorIiAgICAgICAgeG9ybCAgICAlJWVheCwlJWVheCAgICAgICAgICMgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbiAgICBcbiIKKyIgICAgICAgIHB1c2hsICAgJSVlYnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICBjcHVpZCAgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgYW5kIHNhdmUgdmVuZG9yIElEICAgICAgICAgIFxuIgorIiAgICAgICAgcG9wbCAgICAlJWVieCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIGNtcGwgICAgJDEsJSVlYXggICAgICAgICAgICAjIE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRFxuIgorIiAgICAgICAgamwgICAgICAxZiAgICAgICAgICAgICAgICAgICMgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvblxuIgorIiAgICAgICAgeG9ybCAgICAlJWVheCwlJWVheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIGluY2wgICAgJSVlYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICBwdXNobCAgICUlZWJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAgICMgR2V0IGZhbWlseS9tb2RlbC9zdGVwcGluZy9mZWF0dXJlc1xuIgorIiAgICAgICAgcG9wbCAgICAlJWVieCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlZHgsJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCTogIj1tIiAoZmVhdHVyZXMpCisJOgorCTogIiVlYXgiLCAiJWVjeCIsICIlZWR4IgorCSk7CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9feDg2XzY0X18pCisJX19hc21fXyAoCisiICAgICAgICB4b3JsICAgICUlZWF4LCUlZWF4ICAgICAgICAgIyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uICAgIFxuIgorIiAgICAgICAgcHVzaHEgICAlJXJieCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICAgICAjIEdldCBhbmQgc2F2ZSB2ZW5kb3IgSUQgICAgICAgICAgXG4iCisiICAgICAgICBwb3BxICAgICUlcmJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgY21wbCAgICAkMSwlJWVheCAgICAgICAgICAgICMgTWFrZSBzdXJlIDEgaXMgdmFsaWQgaW5wdXQgZm9yIENQVUlEXG4iCisiICAgICAgICBqbCAgICAgIDFmICAgICAgICAgICAgICAgICAgIyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uXG4iCisiICAgICAgICB4b3JsICAgICUlZWF4LCUlZWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgaW5jbCAgICAlJWVheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIHB1c2hxICAgJSVyYnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICBjcHVpZCAgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgZmFtaWx5L21vZGVsL3N0ZXBwaW5nL2ZlYXR1cmVzXG4iCisiICAgICAgICBwb3BxICAgICUlcmJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgbW92bCAgICAlJWVkeCwlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPW0iIChmZWF0dXJlcykKKwk6CisJOiAiJXJheCIsICIlcmN4IiwgIiVyZHgiCisJKTsKKyNlbGlmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKQorCV9fYXNtIHsKKyAgICAgICAgeG9yICAgICBlYXgsIGVheCAgICAgICAgICAgIDsgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbgorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBjcHVpZCAgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgYW5kIHNhdmUgdmVuZG9yIElECisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIGNtcCAgICAgZWF4LCAxICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRAorICAgICAgICBqbCAgICAgIGRvbmUgICAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uCisgICAgICAgIHhvciAgICAgZWF4LCBlYXgKKyAgICAgICAgaW5jICAgICBlYXgKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGZhbWlseS9tb2RlbC9zdGVwcGluZy9mZWF0dXJlcworICAgICAgICBwb3AgICAgIGVieAorICAgICAgICBtb3YgICAgIGZlYXR1cmVzLCBlZHgKK2RvbmU6CisJfQorI2VsaWYgZGVmaW5lZChfX3N1bikgJiYgKGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9fYW1kNjQpKQorCSAgICBfX2FzbSgKKyIgICAgICAgIHhvcmwgICAgJWVheCwlZWF4ICAgICAgICAgXG4iCisiICAgICAgICBwdXNobCAgICVlYnggICAgICAgICAgICAgIFxuIgorIiAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIHBvcGwgICAgJWVieCAgICAgICAgICAgICAgXG4iCisiICAgICAgICBjbXBsICAgICQxLCVlYXggICAgICAgICAgIFxuIgorIiAgICAgICAgamwgICAgICAxZiAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIHhvcmwgICAgJWVheCwlZWF4ICAgICAgICAgXG4iCisiICAgICAgICBpbmNsICAgICVlYXggICAgICAgICAgICAgIFxuIgorIiAgICAgICAgcHVzaGwgICAlZWJ4ICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICBwb3BsICAgICVlYnggICAgICAgICAgICAgIFxuIgorI2lmZGVmIF9faTM4NgorIiAgICAgICAgbW92bCAgICAlZWR4LC04KCVlYnApICAgICBcbiIKKyNlbHNlCisiICAgICAgICBtb3ZsICAgICVlZHgsLTgoJXJicCkgICAgIFxuIgorI2VuZGlmCisiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorI2VuZGlmCisJcmV0dXJuIGZlYXR1cmVzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgQ1BVX2dldENQVUlERmVhdHVyZXNFeHQodm9pZCkKK3sKKwlpbnQgZmVhdHVyZXMgPSAwOworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoaTM4NikKKwlfX2FzbV9fICgKKyIgICAgICAgIG1vdmwgICAgJDB4ODAwMDAwMDAsJSVlYXggICAjIFF1ZXJ5IGZvciBleHRlbmRlZCBmdW5jdGlvbnMgICAgXG4iCisiICAgICAgICBwdXNobCAgICUlZWJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAgICMgR2V0IGV4dGVuZGVkIGZ1bmN0aW9uIGxpbWl0ICAgICBcbiIKKyIgICAgICAgIHBvcGwgICAgJSVlYnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICBjbXBsICAgICQweDgwMDAwMDAxLCUlZWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgamwgICAgICAxZiAgICAgICAgICAgICAgICAgICMgTm9wZSwgd2UgZG9udCBoYXZlIGZ1bmN0aW9uIDgwMDAwMDAwMWhcbiIKKyIgICAgICAgIG1vdmwgICAgJDB4ODAwMDAwMDEsJSVlYXggICAjIFNldHVwIGV4dGVuZGVkIGZ1bmN0aW9uIDgwMDAwMDAwMWhcbiIKKyIgICAgICAgIHB1c2hsICAgJSVlYnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICBjcHVpZCAgICAgICAgICAgICAgICAgICAgICAgIyBhbmQgZ2V0IHRoZSBpbmZvcm1hdGlvbiAgICAgICAgIFxuIgorIiAgICAgICAgcG9wbCAgICAlJWVieCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlZHgsJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCTogIj1tIiAoZmVhdHVyZXMpCisJOgorCTogIiVlYXgiLCAiJWVjeCIsICIlZWR4IgorCSk7CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX3g4Nl82NF9fKQorCV9fYXNtX18gKAorIiAgICAgICAgbW92bCAgICAkMHg4MDAwMDAwMCwlJWVheCAgICMgUXVlcnkgZm9yIGV4dGVuZGVkIGZ1bmN0aW9ucyAgICBcbiIKKyIgICAgICAgIHB1c2hxICAgJSVyYnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICBjcHVpZCAgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgZXh0ZW5kZWQgZnVuY3Rpb24gbGltaXQgICAgIFxuIgorIiAgICAgICAgcG9wcSAgICAlJXJieCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIGNtcGwgICAgJDB4ODAwMDAwMDEsJSVlYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICAgICAgICBqbCAgICAgIDFmICAgICAgICAgICAgICAgICAgIyBOb3BlLCB3ZSBkb250IGhhdmUgZnVuY3Rpb24gODAwMDAwMDAxaFxuIgorIiAgICAgICAgbW92bCAgICAkMHg4MDAwMDAwMSwlJWVheCAgICMgU2V0dXAgZXh0ZW5kZWQgZnVuY3Rpb24gODAwMDAwMDAxaFxuIgorIiAgICAgICAgcHVzaHEgICAlJXJieCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCBnZXQgdGhlIGluZm9ybWF0aW9uICAgICAgICAgXG4iCisiICAgICAgICBwb3BxICAgICUlcmJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorIiAgICAgICAgbW92bCAgICAlJWVkeCwlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPW0iIChmZWF0dXJlcykKKwk6CisJOiAiJXJheCIsICIlcmN4IiwgIiVyZHgiCisJKTsKKyNlbGlmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKQorCV9fYXNtIHsKKyAgICAgICAgbW92ICAgICBlYXgsODAwMDAwMDBoICAgICAgIDsgUXVlcnkgZm9yIGV4dGVuZGVkIGZ1bmN0aW9ucworICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBjcHVpZCAgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgZXh0ZW5kZWQgZnVuY3Rpb24gbGltaXQKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgY21wICAgICBlYXgsODAwMDAwMDFoCisgICAgICAgIGpsICAgICAgZG9uZSAgICAgICAgICAgICAgICA7IE5vcGUsIHdlIGRvbnQgaGF2ZSBmdW5jdGlvbiA4MDAwMDAwMDFoCisgICAgICAgIG1vdiAgICAgZWF4LDgwMDAwMDAxaCAgICAgICA7IFNldHVwIGV4dGVuZGVkIGZ1bmN0aW9uIDgwMDAwMDAwMWgKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAgIDsgYW5kIGdldCB0aGUgaW5mb3JtYXRpb24KKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgbW92ICAgICBmZWF0dXJlcyxlZHgKK2RvbmU6CisJfQorI2VsaWYgZGVmaW5lZChfX3N1bikgJiYgKCBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2FtZDY0KSApCisJICAgIF9fYXNtICgKKyIgICAgICAgIG1vdmwgICAgJDB4ODAwMDAwMDAsJWVheCBcbiIKKyIgICAgICAgIHB1c2hsICAgJWVieCAgICAgICAgICAgICBcbiIKKyIgICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIHBvcGwgICAgJWVieCAgICAgICAgICAgICBcbiIKKyIgICAgICAgIGNtcGwgICAgJDB4ODAwMDAwMDEsJWVheCBcbiIKKyIgICAgICAgIGpsICAgICAgMWYgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIG1vdmwgICAgJDB4ODAwMDAwMDEsJWVheCBcbiIKKyIgICAgICAgIHB1c2hsICAgJWVieCAgICAgICAgICAgICBcbiIKKyIgICAgICAgIGNwdWlkICAgICAgICAgICAgICAgICAgICBcbiIKKyIgICAgICAgIHBvcGwgICAgJWVieCAgICAgICAgICAgICBcbiIKKyNpZmRlZiBfX2kzODYKKyIgICAgICAgIG1vdmwgICAgJWVkeCwtOCglZWJwKSAgIFxuIgorI2Vsc2UKKyIgICAgICAgIG1vdmwgICAgJWVkeCwtOCglcmJwKSAgIFxuIgorI2VuZGlmCisiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJICAgICk7CisjZW5kaWYKKwlyZXR1cm4gZmVhdHVyZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBDUFVfaGF2ZVJEVFNDKHZvaWQpCit7CisJaWYgKCBDUFVfaGF2ZUNQVUlEKCkgKSB7CisJCXJldHVybiAoQ1BVX2dldENQVUlERmVhdHVyZXMoKSAmIDB4MDAwMDAwMTApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IENQVV9oYXZlTU1YKHZvaWQpCit7CisJaWYgKCBDUFVfaGF2ZUNQVUlEKCkgKSB7CisJCXJldHVybiAoQ1BVX2dldENQVUlERmVhdHVyZXMoKSAmIDB4MDA4MDAwMDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IENQVV9oYXZlTU1YRXh0KHZvaWQpCit7CisJaWYgKCBDUFVfaGF2ZUNQVUlEKCkgKSB7CisJCXJldHVybiAoQ1BVX2dldENQVUlERmVhdHVyZXNFeHQoKSAmIDB4MDA0MDAwMDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IENQVV9oYXZlM0ROb3codm9pZCkKK3sKKwlpZiAoIENQVV9oYXZlQ1BVSUQoKSApIHsKKwkJcmV0dXJuIChDUFVfZ2V0Q1BVSURGZWF0dXJlc0V4dCgpICYgMHg4MDAwMDAwMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgQ1BVX2hhdmUzRE5vd0V4dCh2b2lkKQoreworCWlmICggQ1BVX2hhdmVDUFVJRCgpICkgeworCQlyZXR1cm4gKENQVV9nZXRDUFVJREZlYXR1cmVzRXh0KCkgJiAweDQwMDAwMDAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBDUFVfaGF2ZVNTRSh2b2lkKQoreworCWlmICggQ1BVX2hhdmVDUFVJRCgpICkgeworCQlyZXR1cm4gKENQVV9nZXRDUFVJREZlYXR1cmVzKCkgJiAweDAyMDAwMDAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBDUFVfaGF2ZVNTRTIodm9pZCkKK3sKKwlpZiAoIENQVV9oYXZlQ1BVSUQoKSApIHsKKwkJcmV0dXJuIChDUFVfZ2V0Q1BVSURGZWF0dXJlcygpICYgMHgwNDAwMDAwMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgQ1BVX2hhdmVBbHRpVmVjKHZvaWQpCit7CisJdm9sYXRpbGUgaW50IGFsdGl2ZWMgPSAwOworI2lmIGRlZmluZWQoX19NQUNPU1hfXykgJiYgKGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChfX3BwYzY0X18pKQorCWludCBzZWxlY3RvcnNbMl0gPSB7IENUTF9IVywgSFdfVkVDVE9SVU5JVCB9OyAKKwlpbnQgaGFzVmVjdG9yVW5pdCA9IDA7IAorCXNpemVfdCBsZW5ndGggPSBzaXplb2YoaGFzVmVjdG9yVW5pdCk7IAorCWludCBlcnJvciA9IHN5c2N0bChzZWxlY3RvcnMsIDIsICZoYXNWZWN0b3JVbml0LCAmbGVuZ3RoLCBOVUxMLCAwKTsgCisJaWYoIDAgPT0gZXJyb3IgKQorCQlhbHRpdmVjID0gKGhhc1ZlY3RvclVuaXQgIT0gMCk7IAorI2VsaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMgJiYgSEFWRV9TRVRKTVAKKwl2b2lkICgqaGFuZGxlcikoaW50IHNpZyk7CisJaGFuZGxlciA9IHNpZ25hbChTSUdJTEwsIGlsbGVnYWxfaW5zdHJ1Y3Rpb24pOworCWlmICggc2V0am1wKGptcGJ1ZikgPT0gMCApIHsKKwkJYXNtIHZvbGF0aWxlICgibXRzcHIgMjU2LCAlMFxuXHQiCisJCQkgICAgICAidmFuZCAlJXYwLCAlJXYwLCAlJXYwIgorCQkJICAgICAgOgorCQkJICAgICAgOiAiciIgKC0xKSk7CisJCWFsdGl2ZWMgPSAxOworCX0KKwlzaWduYWwoU0lHSUxMLCBoYW5kbGVyKTsKKyNlbmRpZgorCXJldHVybiBhbHRpdmVjOyAKK30KKworc3RhdGljIFVpbnQzMiBTRExfQ1BVRmVhdHVyZXMgPSAweEZGRkZGRkZGOworCitzdGF0aWMgVWludDMyIFNETF9HZXRDUFVGZWF0dXJlcyh2b2lkKQoreworCWlmICggU0RMX0NQVUZlYXR1cmVzID09IDB4RkZGRkZGRkYgKSB7CisJCVNETF9DUFVGZWF0dXJlcyA9IDA7CisJCWlmICggQ1BVX2hhdmVSRFRTQygpICkgeworCQkJU0RMX0NQVUZlYXR1cmVzIHw9IENQVV9IQVNfUkRUU0M7CisJCX0KKwkJaWYgKCBDUFVfaGF2ZU1NWCgpICkgeworCQkJU0RMX0NQVUZlYXR1cmVzIHw9IENQVV9IQVNfTU1YOworCQl9CisJCWlmICggQ1BVX2hhdmVNTVhFeHQoKSApIHsKKwkJCVNETF9DUFVGZWF0dXJlcyB8PSBDUFVfSEFTX01NWEVYVDsKKwkJfQorCQlpZiAoIENQVV9oYXZlM0ROb3coKSApIHsKKwkJCVNETF9DUFVGZWF0dXJlcyB8PSBDUFVfSEFTXzNETk9XOworCQl9CisJCWlmICggQ1BVX2hhdmUzRE5vd0V4dCgpICkgeworCQkJU0RMX0NQVUZlYXR1cmVzIHw9IENQVV9IQVNfM0ROT1dFWFQ7CisJCX0KKwkJaWYgKCBDUFVfaGF2ZVNTRSgpICkgeworCQkJU0RMX0NQVUZlYXR1cmVzIHw9IENQVV9IQVNfU1NFOworCQl9CisJCWlmICggQ1BVX2hhdmVTU0UyKCkgKSB7CisJCQlTRExfQ1BVRmVhdHVyZXMgfD0gQ1BVX0hBU19TU0UyOworCQl9CisJCWlmICggQ1BVX2hhdmVBbHRpVmVjKCkgKSB7CisJCQlTRExfQ1BVRmVhdHVyZXMgfD0gQ1BVX0hBU19BTFRJVkVDOworCQl9CisJfQorCXJldHVybiBTRExfQ1BVRmVhdHVyZXM7Cit9CisKK1NETF9ib29sIFNETF9IYXNSRFRTQyh2b2lkKQoreworCWlmICggU0RMX0dldENQVUZlYXR1cmVzKCkgJiBDUFVfSEFTX1JEVFNDICkgeworCQlyZXR1cm4gU0RMX1RSVUU7CisJfQorCXJldHVybiBTRExfRkFMU0U7Cit9CisKK1NETF9ib29sIFNETF9IYXNNTVgodm9pZCkKK3sKKwlpZiAoIFNETF9HZXRDUFVGZWF0dXJlcygpICYgQ1BVX0hBU19NTVggKSB7CisJCXJldHVybiBTRExfVFJVRTsKKwl9CisJcmV0dXJuIFNETF9GQUxTRTsKK30KKworU0RMX2Jvb2wgU0RMX0hhc01NWEV4dCh2b2lkKQoreworCWlmICggU0RMX0dldENQVUZlYXR1cmVzKCkgJiBDUFVfSEFTX01NWEVYVCApIHsKKwkJcmV0dXJuIFNETF9UUlVFOworCX0KKwlyZXR1cm4gU0RMX0ZBTFNFOworfQorCitTRExfYm9vbCBTRExfSGFzM0ROb3codm9pZCkKK3sKKwlpZiAoIFNETF9HZXRDUFVGZWF0dXJlcygpICYgQ1BVX0hBU18zRE5PVyApIHsKKwkJcmV0dXJuIFNETF9UUlVFOworCX0KKwlyZXR1cm4gU0RMX0ZBTFNFOworfQorCitTRExfYm9vbCBTRExfSGFzM0ROb3dFeHQodm9pZCkKK3sKKwlpZiAoIFNETF9HZXRDUFVGZWF0dXJlcygpICYgQ1BVX0hBU18zRE5PV0VYVCApIHsKKwkJcmV0dXJuIFNETF9UUlVFOworCX0KKwlyZXR1cm4gU0RMX0ZBTFNFOworfQorCitTRExfYm9vbCBTRExfSGFzU1NFKHZvaWQpCit7CisJaWYgKCBTRExfR2V0Q1BVRmVhdHVyZXMoKSAmIENQVV9IQVNfU1NFICkgeworCQlyZXR1cm4gU0RMX1RSVUU7CisJfQorCXJldHVybiBTRExfRkFMU0U7Cit9CisKK1NETF9ib29sIFNETF9IYXNTU0UyKHZvaWQpCit7CisJaWYgKCBTRExfR2V0Q1BVRmVhdHVyZXMoKSAmIENQVV9IQVNfU1NFMiApIHsKKwkJcmV0dXJuIFNETF9UUlVFOworCX0KKwlyZXR1cm4gU0RMX0ZBTFNFOworfQorCitTRExfYm9vbCBTRExfSGFzQWx0aVZlYyh2b2lkKQoreworCWlmICggU0RMX0dldENQVUZlYXR1cmVzKCkgJiBDUFVfSEFTX0FMVElWRUMgKSB7CisJCXJldHVybiBTRExfVFJVRTsKKwl9CisJcmV0dXJuIFNETF9GQUxTRTsKK30KKworI2lmZGVmIFRFU1RfTUFJTgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oKQoreworCXByaW50ZigiUkRUU0M6ICVkXG4iLCBTRExfSGFzUkRUU0MoKSk7CisJcHJpbnRmKCJNTVg6ICVkXG4iLCBTRExfSGFzTU1YKCkpOworCXByaW50ZigiTU1YRXh0OiAlZFxuIiwgU0RMX0hhc01NWEV4dCgpKTsKKwlwcmludGYoIjNETm93OiAlZFxuIiwgU0RMX0hhczNETm93KCkpOworCXByaW50ZigiM0ROb3dFeHQ6ICVkXG4iLCBTRExfSGFzM0ROb3dFeHQoKSk7CisJcHJpbnRmKCJTU0U6ICVkXG4iLCBTRExfSGFzU1NFKCkpOworCXByaW50ZigiU1NFMjogJWRcbiIsIFNETF9IYXNTU0UyKCkpOworCXByaW50ZigiQWx0aVZlYzogJWRcbiIsIFNETF9IYXNBbHRpVmVjKCkpOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogVEVTVF9NQUlOICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2V2ZW50cy9TRExfYWN0aXZlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2V2ZW50cy9TRExfYWN0aXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxZmI4MAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9hY3RpdmUuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQXBwbGljYXRpb24gZm9jdXMvaWNvbmlmaWNhdGlvbiBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KKworI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfZXZlbnRzX2MuaCIKKworCisvKiBUaGVzZSBhcmUgc3RhdGljIGZvciBvdXIgYWN0aXZlIGV2ZW50IGhhbmRsaW5nIGNvZGUgKi8KK3N0YXRpYyBVaW50OCBTRExfYXBwc3RhdGUgPSAwOworCisvKiBQdWJsaWMgZnVuY3Rpb25zICovCitpbnQgU0RMX0FwcEFjdGl2ZUluaXQodm9pZCkKK3sKKwkvKiBTdGFydCBjb21wbGV0ZWx5IGFjdGl2ZSAqLworCVNETF9hcHBzdGF0ZSA9IChTRExfQVBQQUNUSVZFfFNETF9BUFBJTlBVVEZPQ1VTfFNETF9BUFBNT1VTRUZPQ1VTKTsKKworCS8qIFRoYXQncyBpdCEgKi8KKwlyZXR1cm4oMCk7Cit9Cit2b2lkIFNETF9BcHBBY3RpdmVRdWl0KHZvaWQpCit7Cit9CisKK1VpbnQ4IFNETF9HZXRBcHBTdGF0ZSh2b2lkKQoreworCXJldHVybihTRExfYXBwc3RhdGUpOworfQorCisvKiBUaGlzIGlzIGdsb2JhbCBmb3IgU0RMX2V2ZW50bG9vcC5jICovCitpbnQgU0RMX1ByaXZhdGVBcHBBY3RpdmUoVWludDggZ2FpbiwgVWludDggc3RhdGUpCit7CisJaW50IHBvc3RlZDsKKwlVaW50OCBuZXdfc3RhdGU7CisKKwkvKiBNb2RpZnkgdGhlIGN1cnJlbnQgc3RhdGUgd2l0aCB0aGUgZ2l2ZW4gbWFzayAqLworCWlmICggZ2FpbiApIHsKKwkJbmV3X3N0YXRlID0gKFNETF9hcHBzdGF0ZSB8IHN0YXRlKTsKKwl9IGVsc2UgeworCQluZXdfc3RhdGUgPSAoU0RMX2FwcHN0YXRlICYgfnN0YXRlKTsKKwl9CisKKwkvKiBEcm9wIGV2ZW50cyB0aGF0IGRvbid0IGNoYW5nZSBzdGF0ZSAqLworCWlmICggbmV3X3N0YXRlID09IFNETF9hcHBzdGF0ZSApIHsKKwkJcmV0dXJuKDApOworCX0KKworCS8qIFVwZGF0ZSBpbnRlcm5hbCBhY3RpdmUgc3RhdGUgKi8KKwlTRExfYXBwc3RhdGUgPSBuZXdfc3RhdGU7CisKKwkvKiBQb3N0IHRoZSBldmVudCwgaWYgZGVzaXJlZCAqLworCXBvc3RlZCA9IDA7CisJaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tTRExfQUNUSVZFRVZFTlRdID09IFNETF9FTkFCTEUgKSB7CisJCVNETF9FdmVudCBldmVudDsKKwkJU0RMX21lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOworCQlldmVudC50eXBlID0gU0RMX0FDVElWRUVWRU5UOworCQlldmVudC5hY3RpdmUuZ2FpbiA9IGdhaW47CisJCWV2ZW50LmFjdGl2ZS5zdGF0ZSA9IHN0YXRlOworCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgeworCQkJcG9zdGVkID0gMTsKKwkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKKwkJfQorCX0KKworCS8qIElmIHdlIGxvc3Qga2V5Ym9hcmQgZm9jdXMsIHBvc3Qga2V5LXVwIGV2ZW50cyAqLworCWlmICggKHN0YXRlICYgU0RMX0FQUElOUFVURk9DVVMpICYmICFnYWluICkgeworCQlTRExfUmVzZXRLZXlib2FyZCgpOworCX0KKwkvKiBJZiB3ZSB3ZXJlIG1pbmltaXplZCwgcG9zdCBidXR0b24tdXAgZXZlbnRzICovCisJaWYgKCAoc3RhdGUgJiBTRExfQVBQQUNUSVZFKSAmJiAhZ2FpbiApIHsKKwkJU0RMX1Jlc2V0TW91c2UoKTsKKwl9CisJcmV0dXJuKHBvc3RlZCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2V2ZW50cy9TRExfZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2V2ZW50cy9TRExfZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyM2MwMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9ldmVudHMuYwpAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEdlbmVyYWwgZXZlbnQgaGFuZGxpbmcgY29kZSBmb3IgU0RMICovCisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfc3lzd20uaCIKKyNpbmNsdWRlICJTRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vdGltZXIvU0RMX3RpbWVyX2MuaCIKKyNpZiAhU0RMX0pPWVNUSUNLX0RJU0FCTEVECisjaW5jbHVkZSAiLi4vam95c3RpY2svU0RMX2pveXN0aWNrX2MuaCIKKyNlbmRpZgorCisvKiBQdWJsaWMgZGF0YSAtLSB0aGUgZXZlbnQgZmlsdGVyICovCitTRExfRXZlbnRGaWx0ZXIgU0RMX0V2ZW50T0sgPSBOVUxMOworVWludDggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX05VTUVWRU5UU107CitzdGF0aWMgVWludDMyIFNETF9ldmVudHN0YXRlID0gMDsKKworLyogUHJpdmF0ZSBkYXRhIC0tIGV2ZW50IHF1ZXVlICovCisjZGVmaW5lIE1BWEVWRU5UUwkxMjgKK3N0YXRpYyBzdHJ1Y3QgeworCVNETF9tdXRleCAqbG9jazsKKwlpbnQgYWN0aXZlOworCWludCBoZWFkOworCWludCB0YWlsOworCVNETF9FdmVudCBldmVudFtNQVhFVkVOVFNdOworCWludCB3bW1zZ19uZXh0OworCXN0cnVjdCBTRExfU3lzV01tc2cgd21tc2dbTUFYRVZFTlRTXTsKK30gU0RMX0V2ZW50UTsKKworLyogUHJpdmF0ZSBkYXRhIC0tIGV2ZW50IGxvY2tpbmcgc3RydWN0dXJlICovCitzdGF0aWMgc3RydWN0IHsKKwlTRExfbXV0ZXggKmxvY2s7CisJaW50IHNhZmU7Cit9IFNETF9FdmVudExvY2s7CisKKy8qIFRocmVhZCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBTRExfVGhyZWFkICpTRExfRXZlbnRUaHJlYWQgPSBOVUxMOwkvKiBUaHJlYWQgaGFuZGxlICovCitzdGF0aWMgVWludDMyIGV2ZW50X3RocmVhZDsJCQkvKiBUaGUgZXZlbnQgdGhyZWFkIGlkICovCisKK3ZvaWQgU0RMX0xvY2tfRXZlbnRUaHJlYWQodm9pZCkKK3sKKwlpZiAoIFNETF9FdmVudFRocmVhZCAmJiAoU0RMX1RocmVhZElEKCkgIT0gZXZlbnRfdGhyZWFkKSApIHsKKwkJLyogR3JhYiBsb2NrIGFuZCBzcGluIHVudGlsIHdlJ3JlIHN1cmUgZXZlbnQgdGhyZWFkIHN0b3BwZWQgKi8KKwkJU0RMX211dGV4UChTRExfRXZlbnRMb2NrLmxvY2spOworCQl3aGlsZSAoICEgU0RMX0V2ZW50TG9jay5zYWZlICkgeworCQkJU0RMX0RlbGF5KDEpOworCQl9CisJfQorfQordm9pZCBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKHZvaWQpCit7CisJaWYgKCBTRExfRXZlbnRUaHJlYWQgJiYgKFNETF9UaHJlYWRJRCgpICE9IGV2ZW50X3RocmVhZCkgKSB7CisJCVNETF9tdXRleFYoU0RMX0V2ZW50TG9jay5sb2NrKTsKKwl9Cit9CisKKyNpZmRlZiBfX09TMl9fCisvKgorICogV2UnbGwgaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIEdvYmJsZUV2ZW50cyB0aHJlYWQsIHNvIGl0IHdpbGwgcHJvY2VzcworICogIGV2ZW50cyBpbiB0aW1lIGZvciBzdXJlISBGb3IgdGhpcywgd2UgbmVlZCB0aGUgRG9zU2V0UHJpb3JpdHkoKSBBUEkKKyAqICBmcm9tIHRoZSBvczIuaCBpbmNsdWRlIGZpbGUuCisgKi8KKyNkZWZpbmUgSU5DTF9ET1NQUk9DRVNTCisjaW5jbHVkZSA8b3MyLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKK3N0YXRpYyBpbnQgU0RMQ0FMTCBTRExfR29iYmxlRXZlbnRzKHZvaWQgKnVudXNlZCkKK3sKKwlldmVudF90aHJlYWQgPSBTRExfVGhyZWFkSUQoKTsKKworI2lmZGVmIF9fT1MyX18KKyNpZmRlZiBVU0VfRE9TU0VUUFJJT1JJVFkKKwkvKiBJbmNyZWFzZSB0aHJlYWQgcHJpb3JpdHksIHNvIGl0IHdpbGwgcHJvY2VzcyBldmVudHMgaW4gdGltZSBmb3Igc3VyZSEgKi8KKwlEb3NTZXRQcmlvcml0eShQUlRZU19USFJFQUQsIFBSVFlDX1JFR1VMQVIsICsxNiwgMCk7CisjZW5kaWYKKyNlbmRpZgorCisJd2hpbGUgKCBTRExfRXZlbnRRLmFjdGl2ZSApIHsKKwkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCisJCS8qIEdldCBldmVudHMgZnJvbSB0aGUgdmlkZW8gc3Vic3lzdGVtICovCisJCWlmICggdmlkZW8gKSB7CisJCQl2aWRlby0+UHVtcEV2ZW50cyh0aGlzKTsKKwkJfQorCisJCS8qIFF1ZXVlIHBlbmRpbmcga2V5LXJlcGVhdCBldmVudHMgKi8KKwkJU0RMX0NoZWNrS2V5UmVwZWF0KCk7CisKKyNpZiAhU0RMX0pPWVNUSUNLX0RJU0FCTEVECisJCS8qIENoZWNrIGZvciBqb3lzdGljayBzdGF0ZSBjaGFuZ2UgKi8KKwkJaWYgKCBTRExfbnVtam95c3RpY2tzICYmIChTRExfZXZlbnRzdGF0ZSAmIFNETF9KT1lFVkVOVE1BU0spICkgeworCQkJU0RMX0pveXN0aWNrVXBkYXRlKCk7CisJCX0KKyNlbmRpZgorCisJCS8qIEdpdmUgdXAgdGhlIENQVSBmb3IgdGhlIHJlc3Qgb2Ygb3VyIHRpbWVzbGljZSAqLworCQlTRExfRXZlbnRMb2NrLnNhZmUgPSAxOworCQlpZiAoIFNETF90aW1lcl9ydW5uaW5nICkgeworCQkJU0RMX1RocmVhZGVkVGltZXJDaGVjaygpOworCQl9CisJCVNETF9EZWxheSgxKTsKKworCQkvKiBDaGVjayBmb3IgZXZlbnQgbG9ja2luZy4KKwkJICAgT24gdGhlIFAgb2YgdGhlIGxvY2sgbXV0ZXgsIGlmIHRoZSBsb2NrIGlzIGhlbGQsIHRoaXMgdGhyZWFkCisJCSAgIHdpbGwgd2FpdCB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZCBiZWZvcmUgY29udGludWluZy4gIFRoZQorCQkgICBzYWZlIGZsYWcgd2lsbCBiZSBzZXQsIG1lYW5pbmcgdGhhdCB0aGUgb3RoZXIgdGhyZWFkIGNhbiBnbworCQkgICBhYm91dCBpdCdzIGJ1c2luZXNzLiAgVGhlIHNhZmUgZmxhZyBpcyByZXNldCBiZWZvcmUgdGhlIFYsCisJCSAgIHNvIGFzIHNvb24gYXMgdGhlIG11dGV4IGlzIGZyZWUsIG90aGVyIHRocmVhZHMgY2FuIHNlZSB0aGF0CisJCSAgIGl0J3Mgbm90IHNhZmUgdG8gaW50ZXJmZXJlIHdpdGggdGhlIGV2ZW50IHRocmVhZC4KKwkJICovCisJCVNETF9tdXRleFAoU0RMX0V2ZW50TG9jay5sb2NrKTsKKwkJU0RMX0V2ZW50TG9jay5zYWZlID0gMDsKKwkJU0RMX211dGV4VihTRExfRXZlbnRMb2NrLmxvY2spOworCX0KKwlTRExfU2V0VGltZXJUaHJlYWRlZCgwKTsKKwlldmVudF90aHJlYWQgPSAwOworCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBTRExfU3RhcnRFdmVudFRocmVhZChVaW50MzIgZmxhZ3MpCit7CisJLyogUmVzZXQgZXZlcnl0aGluZyB0byB6ZXJvICovCisJU0RMX0V2ZW50VGhyZWFkID0gTlVMTDsKKwlTRExfbWVtc2V0KCZTRExfRXZlbnRMb2NrLCAwLCBzaXplb2YoU0RMX0V2ZW50TG9jaykpOworCisJLyogQ3JlYXRlIHRoZSBsb2NrIGFuZCBzZXQgb3Vyc2VsdmVzIGFjdGl2ZSAqLworI2lmICFTRExfVEhSRUFEU19ESVNBQkxFRAorCVNETF9FdmVudFEubG9jayA9IFNETF9DcmVhdGVNdXRleCgpOworCWlmICggU0RMX0V2ZW50US5sb2NrID09IE5VTEwgKSB7CisjaWZkZWYgX19NQUNPU19fIC8qIE1hY09TIGNsYXNzaWMgeW91IGNhbid0IG11bHRpdGhyZWFkLCBzbyBubyBsb2NrIG5lZWRlZCAqLworCQk7CisjZWxzZQorCQlyZXR1cm4oLTEpOworI2VuZGlmCisJfQorI2VuZGlmIC8qICFTRExfVEhSRUFEU19ESVNBQkxFRCAqLworCVNETF9FdmVudFEuYWN0aXZlID0gMTsKKworCWlmICggKGZsYWdzJlNETF9JTklUX0VWRU5UVEhSRUFEKSA9PSBTRExfSU5JVF9FVkVOVFRIUkVBRCApIHsKKwkJU0RMX0V2ZW50TG9jay5sb2NrID0gU0RMX0NyZWF0ZU11dGV4KCk7CisJCWlmICggU0RMX0V2ZW50TG9jay5sb2NrID09IE5VTEwgKSB7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCVNETF9FdmVudExvY2suc2FmZSA9IDA7CisKKwkJLyogVGhlIGV2ZW50IHRocmVhZCB3aWxsIGhhbmRsZSB0aW1lcnMgdG9vICovCisJCVNETF9TZXRUaW1lclRocmVhZGVkKDIpOworI2lmIChkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkpICYmICFkZWZpbmVkKEhBVkVfTElCQykgJiYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKKyN1bmRlZiBTRExfQ3JlYXRlVGhyZWFkCisJCVNETF9FdmVudFRocmVhZCA9IFNETF9DcmVhdGVUaHJlYWQoU0RMX0dvYmJsZUV2ZW50cywgTlVMTCwgTlVMTCwgTlVMTCk7CisjZWxzZQorCQlTRExfRXZlbnRUaHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkKFNETF9Hb2JibGVFdmVudHMsIE5VTEwpOworI2VuZGlmCisJCWlmICggU0RMX0V2ZW50VGhyZWFkID09IE5VTEwgKSB7CisJCQlyZXR1cm4oLTEpOworCQl9CisJfSBlbHNlIHsKKwkJZXZlbnRfdGhyZWFkID0gMDsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZCBTRExfU3RvcEV2ZW50VGhyZWFkKHZvaWQpCit7CisJU0RMX0V2ZW50US5hY3RpdmUgPSAwOworCWlmICggU0RMX0V2ZW50VGhyZWFkICkgeworCQlTRExfV2FpdFRocmVhZChTRExfRXZlbnRUaHJlYWQsIE5VTEwpOworCQlTRExfRXZlbnRUaHJlYWQgPSBOVUxMOworCQlTRExfRGVzdHJveU11dGV4KFNETF9FdmVudExvY2subG9jayk7CisJCVNETF9FdmVudExvY2subG9jayA9IE5VTEw7CisJfQorI2lmbmRlZiBJUE9ECisJU0RMX0Rlc3Ryb3lNdXRleChTRExfRXZlbnRRLmxvY2spOworCVNETF9FdmVudFEubG9jayA9IE5VTEw7CisjZW5kaWYKK30KKworVWludDMyIFNETF9FdmVudFRocmVhZElEKHZvaWQpCit7CisJcmV0dXJuKGV2ZW50X3RocmVhZCk7Cit9CisKKy8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KKwordm9pZCBTRExfU3RvcEV2ZW50TG9vcCh2b2lkKQoreworCS8qIEhhbHQgdGhlIGV2ZW50IHRocmVhZCwgaWYgcnVubmluZyAqLworCVNETF9TdG9wRXZlbnRUaHJlYWQoKTsKKworCS8qIFNodXRkb3duIGV2ZW50IGhhbmRsZXJzICovCisJU0RMX0FwcEFjdGl2ZVF1aXQoKTsKKwlTRExfS2V5Ym9hcmRRdWl0KCk7CisJU0RMX01vdXNlUXVpdCgpOworCVNETF9RdWl0UXVpdCgpOworCisJLyogQ2xlYW4gb3V0IEV2ZW50USAqLworCVNETF9FdmVudFEuaGVhZCA9IDA7CisJU0RMX0V2ZW50US50YWlsID0gMDsKKwlTRExfRXZlbnRRLndtbXNnX25leHQgPSAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIChhbmQgYXNzb2NpYXRlZCBjYWxscykgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSAqLworaW50IFNETF9TdGFydEV2ZW50TG9vcChVaW50MzIgZmxhZ3MpCit7CisJaW50IHJldGNvZGU7CisKKwkvKiBDbGVhbiBvdXQgdGhlIGV2ZW50IHF1ZXVlICovCisJU0RMX0V2ZW50VGhyZWFkID0gTlVMTDsKKwlTRExfRXZlbnRRLmxvY2sgPSBOVUxMOworCVNETF9TdG9wRXZlbnRMb29wKCk7CisKKwkvKiBObyBmaWx0ZXIgdG8gc3RhcnQgd2l0aCwgcHJvY2VzcyBtb3N0IGV2ZW50IHR5cGVzICovCisJU0RMX0V2ZW50T0sgPSBOVUxMOworCVNETF9tZW1zZXQoU0RMX1Byb2Nlc3NFdmVudHMsU0RMX0VOQUJMRSxzaXplb2YoU0RMX1Byb2Nlc3NFdmVudHMpKTsKKwlTRExfZXZlbnRzdGF0ZSA9IH4wOworCS8qIEl0J3Mgbm90IHNhdmUgdG8gY2FsbCBTRExfRXZlbnRTdGF0ZSgpIHlldCAqLworCVNETF9ldmVudHN0YXRlICY9IH4oMHgwMDAwMDAwMSA8PCBTRExfU1lTV01FVkVOVCk7CisJU0RMX1Byb2Nlc3NFdmVudHNbU0RMX1NZU1dNRVZFTlRdID0gU0RMX0lHTk9SRTsKKworCS8qIEluaXRpYWxpemUgZXZlbnQgaGFuZGxlcnMgKi8KKwlyZXRjb2RlID0gMDsKKwlyZXRjb2RlICs9IFNETF9BcHBBY3RpdmVJbml0KCk7CisJcmV0Y29kZSArPSBTRExfS2V5Ym9hcmRJbml0KCk7CisJcmV0Y29kZSArPSBTRExfTW91c2VJbml0KCk7CisJcmV0Y29kZSArPSBTRExfUXVpdEluaXQoKTsKKwlpZiAoIHJldGNvZGUgPCAwICkgeworCQkvKiBXZSBkb24ndCBleHBlY3QgdGhlbSB0byBmYWlsLCBidXQuLi4gKi8KKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIGxvY2sgYW5kIGV2ZW50IHRocmVhZCAqLworCWlmICggU0RMX1N0YXJ0RXZlbnRUaHJlYWQoZmxhZ3MpIDwgMCApIHsKKwkJU0RMX1N0b3BFdmVudExvb3AoKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKDApOworfQorCisKKy8qIEFkZCBhbiBldmVudCB0byB0aGUgZXZlbnQgcXVldWUgLS0gY2FsbGVkIHdpdGggdGhlIHF1ZXVlIGxvY2tlZCAqLworc3RhdGljIGludCBTRExfQWRkRXZlbnQoU0RMX0V2ZW50ICpldmVudCkKK3sKKwlpbnQgdGFpbCwgYWRkZWQ7CisKKwl0YWlsID0gKFNETF9FdmVudFEudGFpbCsxKSVNQVhFVkVOVFM7CisJaWYgKCB0YWlsID09IFNETF9FdmVudFEuaGVhZCApIHsKKwkJLyogT3ZlcmZsb3csIGRyb3AgZXZlbnQgKi8KKwkJYWRkZWQgPSAwOworCX0gZWxzZSB7CisJCVNETF9FdmVudFEuZXZlbnRbU0RMX0V2ZW50US50YWlsXSA9ICpldmVudDsKKwkJaWYgKGV2ZW50LT50eXBlID09IFNETF9TWVNXTUVWRU5UKSB7CisJCQkvKiBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSB0byBsb3NlIGFuIGV2ZW50ICovCisJCQlpbnQgbmV4dCA9IFNETF9FdmVudFEud21tc2dfbmV4dDsKKwkJCVNETF9FdmVudFEud21tc2dbbmV4dF0gPSAqZXZlbnQtPnN5c3dtLm1zZzsKKwkJICAgICAgICBTRExfRXZlbnRRLmV2ZW50W1NETF9FdmVudFEudGFpbF0uc3lzd20ubXNnID0KKwkJCQkJCSZTRExfRXZlbnRRLndtbXNnW25leHRdOworCQkJU0RMX0V2ZW50US53bW1zZ19uZXh0ID0gKG5leHQrMSklTUFYRVZFTlRTOworCQl9CisJCVNETF9FdmVudFEudGFpbCA9IHRhaWw7CisJCWFkZGVkID0gMTsKKwl9CisJcmV0dXJuKGFkZGVkKTsKK30KKworLyogQ3V0IGFuIGV2ZW50LCBhbmQgcmV0dXJuIHRoZSBuZXh0IHZhbGlkIHNwb3QsIG9yIHRoZSB0YWlsICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGNhbGxlZCB3aXRoIHRoZSBxdWV1ZSBsb2NrZWQgKi8KK3N0YXRpYyBpbnQgU0RMX0N1dEV2ZW50KGludCBzcG90KQoreworCWlmICggc3BvdCA9PSBTRExfRXZlbnRRLmhlYWQgKSB7CisJCVNETF9FdmVudFEuaGVhZCA9IChTRExfRXZlbnRRLmhlYWQrMSklTUFYRVZFTlRTOworCQlyZXR1cm4oU0RMX0V2ZW50US5oZWFkKTsKKwl9IGVsc2UKKwlpZiAoIChzcG90KzEpJU1BWEVWRU5UUyA9PSBTRExfRXZlbnRRLnRhaWwgKSB7CisJCVNETF9FdmVudFEudGFpbCA9IHNwb3Q7CisJCXJldHVybihTRExfRXZlbnRRLnRhaWwpOworCX0gZWxzZQorCS8qIFdlIGN1dCB0aGUgbWlkZGxlIC0tIHNoaWZ0IGV2ZXJ5dGhpbmcgb3ZlciAqLworCXsKKwkJaW50IGhlcmUsIG5leHQ7CisKKwkJLyogVGhpcyBjYW4gcHJvYmFibHkgYmUgb3B0aW1pemVkIHdpdGggU0RMX21lbWNweSgpIC0tIGNhcmVmdWwhICovCisJCWlmICggLS1TRExfRXZlbnRRLnRhaWwgPCAwICkgeworCQkJU0RMX0V2ZW50US50YWlsID0gTUFYRVZFTlRTLTE7CisJCX0KKwkJZm9yICggaGVyZT1zcG90OyBoZXJlICE9IFNETF9FdmVudFEudGFpbDsgaGVyZSA9IG5leHQgKSB7CisJCQluZXh0ID0gKGhlcmUrMSklTUFYRVZFTlRTOworCQkJU0RMX0V2ZW50US5ldmVudFtoZXJlXSA9IFNETF9FdmVudFEuZXZlbnRbbmV4dF07CisJCX0KKwkJcmV0dXJuKHNwb3QpOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qIExvY2sgdGhlIGV2ZW50IHF1ZXVlLCB0YWtlIGEgcGVlcCBhdCBpdCwgYW5kIHVubG9jayBpdCAqLworaW50IFNETF9QZWVwRXZlbnRzKFNETF9FdmVudCAqZXZlbnRzLCBpbnQgbnVtZXZlbnRzLCBTRExfZXZlbnRhY3Rpb24gYWN0aW9uLAorCQkJCQkJCQlVaW50MzIgbWFzaykKK3sKKwlpbnQgaSwgdXNlZDsKKworCS8qIERvbid0IGxvb2sgYWZ0ZXIgd2UndmUgcXVpdCAqLworCWlmICggISBTRExfRXZlbnRRLmFjdGl2ZSApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisJLyogTG9jayB0aGUgZXZlbnQgcXVldWUgKi8KKwl1c2VkID0gMDsKKwlpZiAoIFNETF9tdXRleFAoU0RMX0V2ZW50US5sb2NrKSA9PSAwICkgeworCQlpZiAoIGFjdGlvbiA9PSBTRExfQURERVZFTlQgKSB7CisJCQlmb3IgKCBpPTA7IGk8bnVtZXZlbnRzOyArK2kgKSB7CisJCQkJdXNlZCArPSBTRExfQWRkRXZlbnQoJmV2ZW50c1tpXSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlTRExfRXZlbnQgdG1wZXZlbnQ7CisJCQlpbnQgc3BvdDsKKworCQkJLyogSWYgJ2V2ZW50cycgaXMgTlVMTCwganVzdCBzZWUgaWYgdGhleSBleGlzdCAqLworCQkJaWYgKCBldmVudHMgPT0gTlVMTCApIHsKKwkJCQlhY3Rpb24gPSBTRExfUEVFS0VWRU5UOworCQkJCW51bWV2ZW50cyA9IDE7CisJCQkJZXZlbnRzID0gJnRtcGV2ZW50OworCQkJfQorCQkJc3BvdCA9IFNETF9FdmVudFEuaGVhZDsKKwkJCXdoaWxlICgodXNlZCA8IG51bWV2ZW50cykmJihzcG90ICE9IFNETF9FdmVudFEudGFpbCkpIHsKKwkJCQlpZiAoIG1hc2sgJiBTRExfRVZFTlRNQVNLKFNETF9FdmVudFEuZXZlbnRbc3BvdF0udHlwZSkgKSB7CisJCQkJCWV2ZW50c1t1c2VkKytdID0gU0RMX0V2ZW50US5ldmVudFtzcG90XTsKKwkJCQkJaWYgKCBhY3Rpb24gPT0gU0RMX0dFVEVWRU5UICkgeworCQkJCQkJc3BvdCA9IFNETF9DdXRFdmVudChzcG90KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNwb3QgPSAoc3BvdCsxKSVNQVhFVkVOVFM7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlzcG90ID0gKHNwb3QrMSklTUFYRVZFTlRTOworCQkJCX0KKwkJCX0KKwkJfQorCQlTRExfbXV0ZXhWKFNETF9FdmVudFEubG9jayk7CisJfSBlbHNlIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBsb2NrIGV2ZW50IHF1ZXVlIik7CisJCXVzZWQgPSAtMTsKKwl9CisJcmV0dXJuKHVzZWQpOworfQorCisvKiBSdW4gdGhlIHN5c3RlbSBkZXBlbmRlbnQgZXZlbnQgbG9vcHMgKi8KK3ZvaWQgU0RMX1B1bXBFdmVudHModm9pZCkKK3sKKwlpZiAoICFTRExfRXZlbnRUaHJlYWQgKSB7CisJCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKKworCQkvKiBHZXQgZXZlbnRzIGZyb20gdGhlIHZpZGVvIHN1YnN5c3RlbSAqLworCQlpZiAoIHZpZGVvICkgeworCQkJdmlkZW8tPlB1bXBFdmVudHModGhpcyk7CisJCX0KKworCQkvKiBRdWV1ZSBwZW5kaW5nIGtleS1yZXBlYXQgZXZlbnRzICovCisJCVNETF9DaGVja0tleVJlcGVhdCgpOworCisjaWYgIVNETF9KT1lTVElDS19ESVNBQkxFRAorCQkvKiBDaGVjayBmb3Igam95c3RpY2sgc3RhdGUgY2hhbmdlICovCisJCWlmICggU0RMX251bWpveXN0aWNrcyAmJiAoU0RMX2V2ZW50c3RhdGUgJiBTRExfSk9ZRVZFTlRNQVNLKSApIHsKKwkJCVNETF9Kb3lzdGlja1VwZGF0ZSgpOworCQl9CisjZW5kaWYKKwl9Cit9CisKKy8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KKworaW50IFNETF9Qb2xsRXZlbnQgKFNETF9FdmVudCAqZXZlbnQpCit7CisJU0RMX1B1bXBFdmVudHMoKTsKKworCS8qIFdlIGNhbid0IHJldHVybiAtMSwganVzdCByZXR1cm4gMCAobm8gZXZlbnQpIG9uIGVycm9yICovCisJaWYgKCBTRExfUGVlcEV2ZW50cyhldmVudCwgMSwgU0RMX0dFVEVWRU5ULCBTRExfQUxMRVZFTlRTKSA8PSAwICkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK2ludCBTRExfV2FpdEV2ZW50IChTRExfRXZlbnQgKmV2ZW50KQoreworCXdoaWxlICggMSApIHsKKwkJU0RMX1B1bXBFdmVudHMoKTsKKwkJc3dpdGNoKFNETF9QZWVwRXZlbnRzKGV2ZW50LCAxLCBTRExfR0VURVZFTlQsIFNETF9BTExFVkVOVFMpKSB7CisJCSAgICBjYXNlIC0xOiByZXR1cm4gMDsKKwkJICAgIGNhc2UgMTogcmV0dXJuIDE7CisJCSAgICBjYXNlIDA6IFNETF9EZWxheSgxMCk7CisJCX0KKwl9Cit9CisKK2ludCBTRExfUHVzaEV2ZW50KFNETF9FdmVudCAqZXZlbnQpCit7CisJaWYgKCBTRExfUGVlcEV2ZW50cyhldmVudCwgMSwgU0RMX0FEREVWRU5ULCAwKSA8PSAwICkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCit2b2lkIFNETF9TZXRFdmVudEZpbHRlciAoU0RMX0V2ZW50RmlsdGVyIGZpbHRlcikKK3sKKwlTRExfRXZlbnQgYml0YnVja2V0OworCisJLyogU2V0IGZpbHRlciBhbmQgZGlzY2FyZCBwZW5kaW5nIGV2ZW50cyAqLworCVNETF9FdmVudE9LID0gZmlsdGVyOworCXdoaWxlICggU0RMX1BvbGxFdmVudCgmYml0YnVja2V0KSA+IDAgKQorCQk7Cit9CisKK1NETF9FdmVudEZpbHRlciBTRExfR2V0RXZlbnRGaWx0ZXIodm9pZCkKK3sKKwlyZXR1cm4oU0RMX0V2ZW50T0spOworfQorCitVaW50OCBTRExfRXZlbnRTdGF0ZSAoVWludDggdHlwZSwgaW50IHN0YXRlKQoreworCVNETF9FdmVudCBiaXRidWNrZXQ7CisJVWludDggY3VycmVudF9zdGF0ZTsKKworCS8qIElmIFNETF9BTExFVkVOVFMgd2FzIHNwZWNpZmllZC4uLiAqLworCWlmICggdHlwZSA9PSAweEZGICkgeworCQljdXJyZW50X3N0YXRlID0gU0RMX0lHTk9SRTsKKwkJZm9yICggdHlwZT0wOyB0eXBlPFNETF9OVU1FVkVOVFM7ICsrdHlwZSApIHsKKwkJCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbdHlwZV0gIT0gU0RMX0lHTk9SRSApIHsKKwkJCQljdXJyZW50X3N0YXRlID0gU0RMX0VOQUJMRTsKKwkJCX0KKwkJCVNETF9Qcm9jZXNzRXZlbnRzW3R5cGVdID0gc3RhdGU7CisJCQlpZiAoIHN0YXRlID09IFNETF9FTkFCTEUgKSB7CisJCQkJU0RMX2V2ZW50c3RhdGUgfD0gKDB4MDAwMDAwMDEgPDwgKHR5cGUpKTsKKwkJCX0gZWxzZSB7CisJCQkJU0RMX2V2ZW50c3RhdGUgJj0gfigweDAwMDAwMDAxIDw8ICh0eXBlKSk7CisJCQl9CisJCX0KKwkJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZiaXRidWNrZXQpID4gMCApCisJCQk7CisJCXJldHVybihjdXJyZW50X3N0YXRlKTsKKwl9CisKKwkvKiBKdXN0IHNldCB0aGUgc3RhdGUgZm9yIG9uZSBldmVudCB0eXBlICovCisJY3VycmVudF9zdGF0ZSA9IFNETF9Qcm9jZXNzRXZlbnRzW3R5cGVdOworCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBTRExfSUdOT1JFOgorCQljYXNlIFNETF9FTkFCTEU6CisJCQkvKiBTZXQgc3RhdGUgYW5kIGRpc2NhcmQgcGVuZGluZyBldmVudHMgKi8KKwkJCVNETF9Qcm9jZXNzRXZlbnRzW3R5cGVdID0gc3RhdGU7CisJCQlpZiAoIHN0YXRlID09IFNETF9FTkFCTEUgKSB7CisJCQkJU0RMX2V2ZW50c3RhdGUgfD0gKDB4MDAwMDAwMDEgPDwgKHR5cGUpKTsKKwkJCX0gZWxzZSB7CisJCQkJU0RMX2V2ZW50c3RhdGUgJj0gfigweDAwMDAwMDAxIDw8ICh0eXBlKSk7CisJCQl9CisJCQl3aGlsZSAoIFNETF9Qb2xsRXZlbnQoJmJpdGJ1Y2tldCkgPiAwICkKKwkJCQk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFF1ZXJ5aW5nIHN0YXRlPyAqLworCQkJYnJlYWs7CisJfQorCXJldHVybihjdXJyZW50X3N0YXRlKTsKK30KKworLyogVGhpcyBpcyBhIGdlbmVyaWMgZXZlbnQgaGFuZGxlci4KKyAqLworaW50IFNETF9Qcml2YXRlU3lzV01FdmVudChTRExfU3lzV01tc2cgKm1lc3NhZ2UpCit7CisJaW50IHBvc3RlZDsKKworCXBvc3RlZCA9IDA7CisJaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tTRExfU1lTV01FVkVOVF0gPT0gU0RMX0VOQUJMRSApIHsKKwkJU0RMX0V2ZW50IGV2ZW50OworCQlTRExfbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7CisJCWV2ZW50LnR5cGUgPSBTRExfU1lTV01FVkVOVDsKKwkJZXZlbnQuc3lzd20ubXNnID0gbWVzc2FnZTsKKwkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgKCpTRExfRXZlbnRPSykoJmV2ZW50KSApIHsKKwkJCXBvc3RlZCA9IDE7CisJCQlTRExfUHVzaEV2ZW50KCZldmVudCk7CisJCX0KKwl9CisJLyogVXBkYXRlIGludGVybmFsIGV2ZW50IHN0YXRlICovCisJcmV0dXJuKHBvc3RlZCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2V2ZW50cy9TRExfZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9ldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzg0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2V2ZW50cy9TRExfZXZlbnRzX2MuaApAQCAtMCwwICsxLDgzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVXNlZnVsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGZyb20gU0RMX2V2ZW50cy5jICovCisjaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgorCisvKiBTdGFydCBhbmQgc3RvcCB0aGUgZXZlbnQgcHJvY2Vzc2luZyBsb29wICovCitleHRlcm4gaW50IFNETF9TdGFydEV2ZW50TG9vcChVaW50MzIgZmxhZ3MpOworZXh0ZXJuIHZvaWQgU0RMX1N0b3BFdmVudExvb3Aodm9pZCk7CitleHRlcm4gdm9pZCBTRExfUXVpdEludGVycnVwdCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgU0RMX0xvY2tfRXZlbnRUaHJlYWQodm9pZCk7CitleHRlcm4gdm9pZCBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKHZvaWQpOworZXh0ZXJuIFVpbnQzMiBTRExfRXZlbnRUaHJlYWRJRCh2b2lkKTsKKworLyogRXZlbnQgaGFuZGxlciBpbml0IHJvdXRpbmVzICovCitleHRlcm4gaW50ICBTRExfQXBwQWN0aXZlSW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgIFNETF9LZXlib2FyZEluaXQodm9pZCk7CitleHRlcm4gaW50ICBTRExfTW91c2VJbml0KHZvaWQpOworZXh0ZXJuIGludCAgU0RMX1F1aXRJbml0KHZvaWQpOworCisvKiBFdmVudCBoYW5kbGVyIHF1aXQgcm91dGluZXMgKi8KK2V4dGVybiB2b2lkIFNETF9BcHBBY3RpdmVRdWl0KHZvaWQpOworZXh0ZXJuIHZvaWQgU0RMX0tleWJvYXJkUXVpdCh2b2lkKTsKK2V4dGVybiB2b2lkIFNETF9Nb3VzZVF1aXQodm9pZCk7CitleHRlcm4gdm9pZCBTRExfUXVpdFF1aXQodm9pZCk7CisKKy8qIFRoZSBldmVudCBmaWx0ZXIgZnVuY3Rpb24gKi8KK2V4dGVybiBTRExfRXZlbnRGaWx0ZXIgU0RMX0V2ZW50T0s7CisKKy8qIFRoZSBhcnJheSBvZiBldmVudCBwcm9jZXNzaW5nIHN0YXRlcyAqLworZXh0ZXJuIFVpbnQ4IFNETF9Qcm9jZXNzRXZlbnRzW1NETF9OVU1FVkVOVFNdOworCisvKiBJbnRlcm5hbCBldmVudCBxdWV1ZWluZyBmdW5jdGlvbnMKKyAgIChmcm9tIFNETF9hY3RpdmUuYywgU0RMX21vdXNlLmMsIFNETF9rZXlib2FyZC5jLCBTRExfcXVpdC5jLCBTRExfZXZlbnRzLmMpCisgKi8KK2V4dGVybiBpbnQgU0RMX1ByaXZhdGVBcHBBY3RpdmUoVWludDggZ2FpbiwgVWludDggc3RhdGUpOworZXh0ZXJuIGludCBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKFVpbnQ4IGJ1dHRvbnN0YXRlLCBpbnQgcmVsYXRpdmUsCisJCQkJCQlTaW50MTYgeCwgU2ludDE2IHkpOworZXh0ZXJuIGludCBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFVpbnQ4IHN0YXRlLCBVaW50OCBidXR0b24sU2ludDE2IHgsU2ludDE2IHkpOworZXh0ZXJuIGludCBTRExfUHJpdmF0ZUtleWJvYXJkKFVpbnQ4IHN0YXRlLCBTRExfa2V5c3ltICprZXkpOworZXh0ZXJuIGludCBTRExfUHJpdmF0ZVJlc2l6ZShpbnQgdywgaW50IGgpOworZXh0ZXJuIGludCBTRExfUHJpdmF0ZUV4cG9zZSh2b2lkKTsKK2V4dGVybiBpbnQgU0RMX1ByaXZhdGVRdWl0KHZvaWQpOworZXh0ZXJuIGludCBTRExfUHJpdmF0ZVN5c1dNRXZlbnQoU0RMX1N5c1dNbXNnICptZXNzYWdlKTsKKworLyogVXNlZCB0byBjbGFtcCB0aGUgbW91c2UgY29vcmRpbmF0ZXMgc2VwYXJhdGVseSBmcm9tIHRoZSB2aWRlbyBzdXJmYWNlICovCitleHRlcm4gdm9pZCBTRExfU2V0TW91c2VSYW5nZShpbnQgbWF4WCwgaW50IG1heFkpOworCisvKiBVc2VkIGJ5IHRoZSBhY3Rpdml0eSBldmVudCBoYW5kbGVyIHRvIHJlbW92ZSBtb3VzZSBmb2N1cyAqLworZXh0ZXJuIHZvaWQgU0RMX1Jlc2V0TW91c2Uodm9pZCk7CisKKy8qIFVzZWQgYnkgdGhlIGFjdGl2aXR5IGV2ZW50IGhhbmRsZXIgdG8gcmVtb3ZlIGtleWJvYXJkIGZvY3VzICovCitleHRlcm4gdm9pZCBTRExfUmVzZXRLZXlib2FyZCh2b2lkKTsKKworLyogVXNlZCBieSB0aGUgZXZlbnQgbG9vcCB0byBxdWV1ZSBwZW5kaW5nIGtleWJvYXJkIHJlcGVhdCBldmVudHMgKi8KK2V4dGVybiB2b2lkIFNETF9DaGVja0tleVJlcGVhdCh2b2lkKTsKKworLyogVXNlZCBieSB0aGUgT1Mga2V5Ym9hcmQgY29kZSB0byBkZXRlY3Qgd2hldGhlciBvciBub3QgdG8gZG8gVU5JQ09ERSAqLworI2lmbmRlZiBERUZBVUxUX1VOSUNPREVfVFJBTlNMQVRJT04KKyNkZWZpbmUgREVGQVVMVF9VTklDT0RFX1RSQU5TTEFUSU9OIDAJLyogRGVmYXVsdCBvZmYgYmVjYXVzZSBvZiBvdmVyaGVhZCAqLworI2VuZGlmCitleHRlcm4gaW50IFNETF9UcmFuc2xhdGVVTklDT0RFOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9ldmVudHMvU0RMX2V4cG9zZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9ldmVudHMvU0RMX2V4cG9zZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YjAxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2V2ZW50cy9TRExfZXhwb3NlLmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFJlZnJlc2ggZXZlbnQgaGFuZGxpbmcgY29kZSBmb3IgU0RMICovCisKKyNpbmNsdWRlICJTRExfZXZlbnRzLmgiCisjaW5jbHVkZSAiU0RMX2V2ZW50c19jLmgiCisKKworLyogVGhpcyBpcyBnbG9iYWwgZm9yIFNETF9ldmVudGxvb3AuYyAqLworaW50IFNETF9Qcml2YXRlRXhwb3NlKHZvaWQpCit7CisJaW50IHBvc3RlZDsKKwlTRExfRXZlbnQgZXZlbnRzWzMyXTsKKworCS8qIFB1bGwgb3V0IGFsbCBvbGQgcmVmcmVzaCBldmVudHMgKi8KKwlTRExfUGVlcEV2ZW50cyhldmVudHMsIHNpemVvZihldmVudHMpL3NpemVvZihldmVudHNbMF0pLAorCSAgICAgICAgICAgICAgICAgICAgU0RMX0dFVEVWRU5ULCBTRExfVklERU9FWFBPU0VNQVNLKTsKKworCS8qIFBvc3QgdGhlIGV2ZW50LCBpZiBkZXNpcmVkICovCisJcG9zdGVkID0gMDsKKwlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW1NETF9WSURFT0VYUE9TRV0gPT0gU0RMX0VOQUJMRSApIHsKKwkJU0RMX0V2ZW50IGV2ZW50OworCQlldmVudC50eXBlID0gU0RMX1ZJREVPRVhQT1NFOworCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgeworCQkJcG9zdGVkID0gMTsKKwkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKKwkJfQorCX0KKwlyZXR1cm4ocG9zdGVkKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9rZXlib2FyZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9ldmVudHMvU0RMX2tleWJvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1MzkyNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9rZXlib2FyZC5jCkBAIC0wLDAgKzEsNjE0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogR2VuZXJhbCBrZXlib2FyZCBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfc3lzZXZlbnRzLmgiCisKKworLyogR2xvYmFsIGtleXN0YXRlIGluZm9ybWF0aW9uICovCitzdGF0aWMgVWludDggIFNETF9LZXlTdGF0ZVtTRExLX0xBU1RdOworc3RhdGljIFNETE1vZCBTRExfTW9kU3RhdGU7CitpbnQgU0RMX1RyYW5zbGF0ZVVOSUNPREUgPSAwOworCitzdGF0aWMgY29uc3QgY2hhciAqa2V5bmFtZXNbU0RMS19MQVNUXTsJLyogQXJyYXkgb2Yga2V5Y29kZSBuYW1lcyAqLworCisvKgorICogamsgOTkxMjE1IC0gYWRkZWQKKyAqLworc3RydWN0IHsKKwlpbnQgZmlyc3R0aW1lOyAgICAvKiBpZiB3ZSBjaGVjayBhZ2FpbnN0IHRoZSBkZWxheSBvciByZXBlYXQgdmFsdWUgKi8KKwlpbnQgZGVsYXk7ICAgICAgICAvKiB0aGUgZGVsYXkgYmVmb3JlIHdlIHN0YXJ0IHJlcGVhdGluZyAqLworCWludCBpbnRlcnZhbDsgICAgIC8qIHRoZSBkZWxheSBiZXR3ZWVuIGtleSByZXBlYXQgZXZlbnRzICovCisJVWludDMyIHRpbWVzdGFtcDsgLyogdGhlIHRpbWUgdGhlIGZpcnN0IGtleWRvd24gZXZlbnQgb2NjdXJyZWQgKi8KKworCVNETF9FdmVudCBldnQ7ICAgIC8qIHRoZSBldmVudCB3ZSBhcmUgc3VwcG9zZWQgdG8gcmVwZWF0ICovCit9IFNETF9LZXlSZXBlYXQ7CisKKy8qIEdsb2JhbCBuby1sb2NrLWtleXMgc3VwcG9ydCAqLworc3RhdGljIFVpbnQ4IFNETF9Ob0xvY2tLZXlzOworCisjZGVmaW5lIFNETF9OTEtfQ0FQUyAweDAxCisjZGVmaW5lIFNETF9OTEtfTlVNICAweDAyCisKKy8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KK2ludCBTRExfS2V5Ym9hcmRJbml0KHZvaWQpCit7CisJY29uc3QgY2hhciogZW52OworCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCisJLyogU2V0IGRlZmF1bHQgbW9kZSBvZiBVTklDT0RFIHRyYW5zbGF0aW9uICovCisJU0RMX0VuYWJsZVVOSUNPREUoREVGQVVMVF9VTklDT0RFX1RSQU5TTEFUSU9OKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHRhYmxlcyAqLworCVNETF9Nb2RTdGF0ZSA9IEtNT0RfTk9ORTsKKwlTRExfbWVtc2V0KCh2b2lkKilrZXluYW1lcywgMCwgc2l6ZW9mKGtleW5hbWVzKSk7CisJU0RMX21lbXNldChTRExfS2V5U3RhdGUsIDAsIHNpemVvZihTRExfS2V5U3RhdGUpKTsKKwl2aWRlby0+SW5pdE9TS2V5bWFwKHRoaXMpOworCisJU0RMX0VuYWJsZUtleVJlcGVhdCgwLCAwKTsKKworCS8qIEFsbG93IGVudmlyb25tZW50IG92ZXJyaWRlIHRvIGRpc2FibGUgc3BlY2lhbCBsb2NrLWtleSBiZWhhdmlvciAqLworCVNETF9Ob0xvY2tLZXlzID0gMDsKKwllbnYgPSBTRExfZ2V0ZW52KCJTRExfRElTQUJMRV9MT0NLX0tFWVMiKTsKKwlpZiAoZW52KSB7CisJCXN3aXRjaCAoU0RMX2F0b2koZW52KSkgeworCQkJY2FzZSAxOgorCQkJCVNETF9Ob0xvY2tLZXlzID0gU0RMX05MS19DQVBTIHwgU0RMX05MS19OVU07CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJU0RMX05vTG9ja0tleXMgPSBTRExfTkxLX0NBUFM7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJU0RMX05vTG9ja0tleXMgPSBTRExfTkxLX05VTTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBGaWxsIGluIHRoZSBibGFua3MgaW4ga2V5bmFtZXMgKi8KKwlrZXluYW1lc1tTRExLX0JBQ0tTUEFDRV0gPSAiYmFja3NwYWNlIjsKKwlrZXluYW1lc1tTRExLX1RBQl0gPSAidGFiIjsKKwlrZXluYW1lc1tTRExLX0NMRUFSXSA9ICJjbGVhciI7CisJa2V5bmFtZXNbU0RMS19SRVRVUk5dID0gInJldHVybiI7CisJa2V5bmFtZXNbU0RMS19QQVVTRV0gPSAicGF1c2UiOworCWtleW5hbWVzW1NETEtfRVNDQVBFXSA9ICJlc2NhcGUiOworCWtleW5hbWVzW1NETEtfU1BBQ0VdID0gInNwYWNlIjsKKwlrZXluYW1lc1tTRExLX0VYQ0xBSU1dICA9ICIhIjsKKwlrZXluYW1lc1tTRExLX1FVT1RFREJMXSAgPSAiXCIiOworCWtleW5hbWVzW1NETEtfSEFTSF0gID0gIiMiOworCWtleW5hbWVzW1NETEtfRE9MTEFSXSAgPSAiJCI7CisJa2V5bmFtZXNbU0RMS19BTVBFUlNBTkRdICA9ICImIjsKKwlrZXluYW1lc1tTRExLX1FVT1RFXSA9ICInIjsKKwlrZXluYW1lc1tTRExLX0xFRlRQQVJFTl0gPSAiKCI7CisJa2V5bmFtZXNbU0RMS19SSUdIVFBBUkVOXSA9ICIpIjsKKwlrZXluYW1lc1tTRExLX0FTVEVSSVNLXSA9ICIqIjsKKwlrZXluYW1lc1tTRExLX1BMVVNdID0gIisiOworCWtleW5hbWVzW1NETEtfQ09NTUFdID0gIiwiOworCWtleW5hbWVzW1NETEtfTUlOVVNdID0gIi0iOworCWtleW5hbWVzW1NETEtfUEVSSU9EXSA9ICIuIjsKKwlrZXluYW1lc1tTRExLX1NMQVNIXSA9ICIvIjsKKwlrZXluYW1lc1tTRExLXzBdID0gIjAiOworCWtleW5hbWVzW1NETEtfMV0gPSAiMSI7CisJa2V5bmFtZXNbU0RMS18yXSA9ICIyIjsKKwlrZXluYW1lc1tTRExLXzNdID0gIjMiOworCWtleW5hbWVzW1NETEtfNF0gPSAiNCI7CisJa2V5bmFtZXNbU0RMS181XSA9ICI1IjsKKwlrZXluYW1lc1tTRExLXzZdID0gIjYiOworCWtleW5hbWVzW1NETEtfN10gPSAiNyI7CisJa2V5bmFtZXNbU0RMS184XSA9ICI4IjsKKwlrZXluYW1lc1tTRExLXzldID0gIjkiOworCWtleW5hbWVzW1NETEtfQ09MT05dID0gIjoiOworCWtleW5hbWVzW1NETEtfU0VNSUNPTE9OXSA9ICI7IjsKKwlrZXluYW1lc1tTRExLX0xFU1NdID0gIjwiOworCWtleW5hbWVzW1NETEtfRVFVQUxTXSA9ICI9IjsKKwlrZXluYW1lc1tTRExLX0dSRUFURVJdID0gIj4iOworCWtleW5hbWVzW1NETEtfUVVFU1RJT05dID0gIj8iOworCWtleW5hbWVzW1NETEtfQVRdID0gIkAiOworCWtleW5hbWVzW1NETEtfTEVGVEJSQUNLRVRdID0gIlsiOworCWtleW5hbWVzW1NETEtfQkFDS1NMQVNIXSA9ICJcXCI7CisJa2V5bmFtZXNbU0RMS19SSUdIVEJSQUNLRVRdID0gIl0iOworCWtleW5hbWVzW1NETEtfQ0FSRVRdID0gIl4iOworCWtleW5hbWVzW1NETEtfVU5ERVJTQ09SRV0gPSAiXyI7CisJa2V5bmFtZXNbU0RMS19CQUNLUVVPVEVdID0gImAiOworCWtleW5hbWVzW1NETEtfYV0gPSAiYSI7CisJa2V5bmFtZXNbU0RMS19iXSA9ICJiIjsKKwlrZXluYW1lc1tTRExLX2NdID0gImMiOworCWtleW5hbWVzW1NETEtfZF0gPSAiZCI7CisJa2V5bmFtZXNbU0RMS19lXSA9ICJlIjsKKwlrZXluYW1lc1tTRExLX2ZdID0gImYiOworCWtleW5hbWVzW1NETEtfZ10gPSAiZyI7CisJa2V5bmFtZXNbU0RMS19oXSA9ICJoIjsKKwlrZXluYW1lc1tTRExLX2ldID0gImkiOworCWtleW5hbWVzW1NETEtfal0gPSAiaiI7CisJa2V5bmFtZXNbU0RMS19rXSA9ICJrIjsKKwlrZXluYW1lc1tTRExLX2xdID0gImwiOworCWtleW5hbWVzW1NETEtfbV0gPSAibSI7CisJa2V5bmFtZXNbU0RMS19uXSA9ICJuIjsKKwlrZXluYW1lc1tTRExLX29dID0gIm8iOworCWtleW5hbWVzW1NETEtfcF0gPSAicCI7CisJa2V5bmFtZXNbU0RMS19xXSA9ICJxIjsKKwlrZXluYW1lc1tTRExLX3JdID0gInIiOworCWtleW5hbWVzW1NETEtfc10gPSAicyI7CisJa2V5bmFtZXNbU0RMS190XSA9ICJ0IjsKKwlrZXluYW1lc1tTRExLX3VdID0gInUiOworCWtleW5hbWVzW1NETEtfdl0gPSAidiI7CisJa2V5bmFtZXNbU0RMS193XSA9ICJ3IjsKKwlrZXluYW1lc1tTRExLX3hdID0gIngiOworCWtleW5hbWVzW1NETEtfeV0gPSAieSI7CisJa2V5bmFtZXNbU0RMS196XSA9ICJ6IjsKKwlrZXluYW1lc1tTRExLX0RFTEVURV0gPSAiZGVsZXRlIjsKKworCWtleW5hbWVzW1NETEtfV09STERfMF0gPSAid29ybGQgMCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8xXSA9ICJ3b3JsZCAxIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzJdID0gIndvcmxkIDIiOworCWtleW5hbWVzW1NETEtfV09STERfM10gPSAid29ybGQgMyI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF80XSA9ICJ3b3JsZCA0IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzVdID0gIndvcmxkIDUiOworCWtleW5hbWVzW1NETEtfV09STERfNl0gPSAid29ybGQgNiI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF83XSA9ICJ3b3JsZCA3IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzhdID0gIndvcmxkIDgiOworCWtleW5hbWVzW1NETEtfV09STERfOV0gPSAid29ybGQgOSI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8xMF0gPSAid29ybGQgMTAiOworCWtleW5hbWVzW1NETEtfV09STERfMTFdID0gIndvcmxkIDExIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzEyXSA9ICJ3b3JsZCAxMiI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8xM10gPSAid29ybGQgMTMiOworCWtleW5hbWVzW1NETEtfV09STERfMTRdID0gIndvcmxkIDE0IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzE1XSA9ICJ3b3JsZCAxNSI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8xNl0gPSAid29ybGQgMTYiOworCWtleW5hbWVzW1NETEtfV09STERfMTddID0gIndvcmxkIDE3IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzE4XSA9ICJ3b3JsZCAxOCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8xOV0gPSAid29ybGQgMTkiOworCWtleW5hbWVzW1NETEtfV09STERfMjBdID0gIndvcmxkIDIwIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzIxXSA9ICJ3b3JsZCAyMSI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8yMl0gPSAid29ybGQgMjIiOworCWtleW5hbWVzW1NETEtfV09STERfMjNdID0gIndvcmxkIDIzIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzI0XSA9ICJ3b3JsZCAyNCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8yNV0gPSAid29ybGQgMjUiOworCWtleW5hbWVzW1NETEtfV09STERfMjZdID0gIndvcmxkIDI2IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzI3XSA9ICJ3b3JsZCAyNyI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8yOF0gPSAid29ybGQgMjgiOworCWtleW5hbWVzW1NETEtfV09STERfMjldID0gIndvcmxkIDI5IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzMwXSA9ICJ3b3JsZCAzMCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8zMV0gPSAid29ybGQgMzEiOworCWtleW5hbWVzW1NETEtfV09STERfMzJdID0gIndvcmxkIDMyIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzMzXSA9ICJ3b3JsZCAzMyI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8zNF0gPSAid29ybGQgMzQiOworCWtleW5hbWVzW1NETEtfV09STERfMzVdID0gIndvcmxkIDM1IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzM2XSA9ICJ3b3JsZCAzNiI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF8zN10gPSAid29ybGQgMzciOworCWtleW5hbWVzW1NETEtfV09STERfMzhdID0gIndvcmxkIDM4IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzM5XSA9ICJ3b3JsZCAzOSI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF80MF0gPSAid29ybGQgNDAiOworCWtleW5hbWVzW1NETEtfV09STERfNDFdID0gIndvcmxkIDQxIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzQyXSA9ICJ3b3JsZCA0MiI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF80M10gPSAid29ybGQgNDMiOworCWtleW5hbWVzW1NETEtfV09STERfNDRdID0gIndvcmxkIDQ0IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzQ1XSA9ICJ3b3JsZCA0NSI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF80Nl0gPSAid29ybGQgNDYiOworCWtleW5hbWVzW1NETEtfV09STERfNDddID0gIndvcmxkIDQ3IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzQ4XSA9ICJ3b3JsZCA0OCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF80OV0gPSAid29ybGQgNDkiOworCWtleW5hbWVzW1NETEtfV09STERfNTBdID0gIndvcmxkIDUwIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzUxXSA9ICJ3b3JsZCA1MSI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF81Ml0gPSAid29ybGQgNTIiOworCWtleW5hbWVzW1NETEtfV09STERfNTNdID0gIndvcmxkIDUzIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzU0XSA9ICJ3b3JsZCA1NCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF81NV0gPSAid29ybGQgNTUiOworCWtleW5hbWVzW1NETEtfV09STERfNTZdID0gIndvcmxkIDU2IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzU3XSA9ICJ3b3JsZCA1NyI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF81OF0gPSAid29ybGQgNTgiOworCWtleW5hbWVzW1NETEtfV09STERfNTldID0gIndvcmxkIDU5IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzYwXSA9ICJ3b3JsZCA2MCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF82MV0gPSAid29ybGQgNjEiOworCWtleW5hbWVzW1NETEtfV09STERfNjJdID0gIndvcmxkIDYyIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzYzXSA9ICJ3b3JsZCA2MyI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF82NF0gPSAid29ybGQgNjQiOworCWtleW5hbWVzW1NETEtfV09STERfNjVdID0gIndvcmxkIDY1IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzY2XSA9ICJ3b3JsZCA2NiI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF82N10gPSAid29ybGQgNjciOworCWtleW5hbWVzW1NETEtfV09STERfNjhdID0gIndvcmxkIDY4IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzY5XSA9ICJ3b3JsZCA2OSI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF83MF0gPSAid29ybGQgNzAiOworCWtleW5hbWVzW1NETEtfV09STERfNzFdID0gIndvcmxkIDcxIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzcyXSA9ICJ3b3JsZCA3MiI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF83M10gPSAid29ybGQgNzMiOworCWtleW5hbWVzW1NETEtfV09STERfNzRdID0gIndvcmxkIDc0IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzc1XSA9ICJ3b3JsZCA3NSI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF83Nl0gPSAid29ybGQgNzYiOworCWtleW5hbWVzW1NETEtfV09STERfNzddID0gIndvcmxkIDc3IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzc4XSA9ICJ3b3JsZCA3OCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF83OV0gPSAid29ybGQgNzkiOworCWtleW5hbWVzW1NETEtfV09STERfODBdID0gIndvcmxkIDgwIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzgxXSA9ICJ3b3JsZCA4MSI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF84Ml0gPSAid29ybGQgODIiOworCWtleW5hbWVzW1NETEtfV09STERfODNdID0gIndvcmxkIDgzIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzg0XSA9ICJ3b3JsZCA4NCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF84NV0gPSAid29ybGQgODUiOworCWtleW5hbWVzW1NETEtfV09STERfODZdID0gIndvcmxkIDg2IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzg3XSA9ICJ3b3JsZCA4NyI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF84OF0gPSAid29ybGQgODgiOworCWtleW5hbWVzW1NETEtfV09STERfODldID0gIndvcmxkIDg5IjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzkwXSA9ICJ3b3JsZCA5MCI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF85MV0gPSAid29ybGQgOTEiOworCWtleW5hbWVzW1NETEtfV09STERfOTJdID0gIndvcmxkIDkyIjsKKwlrZXluYW1lc1tTRExLX1dPUkxEXzkzXSA9ICJ3b3JsZCA5MyI7CisJa2V5bmFtZXNbU0RMS19XT1JMRF85NF0gPSAid29ybGQgOTQiOworCWtleW5hbWVzW1NETEtfV09STERfOTVdID0gIndvcmxkIDk1IjsKKworCWtleW5hbWVzW1NETEtfS1AwXSA9ICJbMF0iOworCWtleW5hbWVzW1NETEtfS1AxXSA9ICJbMV0iOworCWtleW5hbWVzW1NETEtfS1AyXSA9ICJbMl0iOworCWtleW5hbWVzW1NETEtfS1AzXSA9ICJbM10iOworCWtleW5hbWVzW1NETEtfS1A0XSA9ICJbNF0iOworCWtleW5hbWVzW1NETEtfS1A1XSA9ICJbNV0iOworCWtleW5hbWVzW1NETEtfS1A2XSA9ICJbNl0iOworCWtleW5hbWVzW1NETEtfS1A3XSA9ICJbN10iOworCWtleW5hbWVzW1NETEtfS1A4XSA9ICJbOF0iOworCWtleW5hbWVzW1NETEtfS1A5XSA9ICJbOV0iOworCWtleW5hbWVzW1NETEtfS1BfUEVSSU9EXSA9ICJbLl0iOworCWtleW5hbWVzW1NETEtfS1BfRElWSURFXSA9ICJbL10iOworCWtleW5hbWVzW1NETEtfS1BfTVVMVElQTFldID0gIlsqXSI7CisJa2V5bmFtZXNbU0RMS19LUF9NSU5VU10gPSAiWy1dIjsKKwlrZXluYW1lc1tTRExLX0tQX1BMVVNdID0gIlsrXSI7CisJa2V5bmFtZXNbU0RMS19LUF9FTlRFUl0gPSAiZW50ZXIiOworCWtleW5hbWVzW1NETEtfS1BfRVFVQUxTXSA9ICJlcXVhbHMiOworCisJa2V5bmFtZXNbU0RMS19VUF0gPSAidXAiOworCWtleW5hbWVzW1NETEtfRE9XTl0gPSAiZG93biI7CisJa2V5bmFtZXNbU0RMS19SSUdIVF0gPSAicmlnaHQiOworCWtleW5hbWVzW1NETEtfTEVGVF0gPSAibGVmdCI7CisJa2V5bmFtZXNbU0RMS19ET1dOXSA9ICJkb3duIjsKKwlrZXluYW1lc1tTRExLX0lOU0VSVF0gPSAiaW5zZXJ0IjsKKwlrZXluYW1lc1tTRExLX0hPTUVdID0gImhvbWUiOworCWtleW5hbWVzW1NETEtfRU5EXSA9ICJlbmQiOworCWtleW5hbWVzW1NETEtfUEFHRVVQXSA9ICJwYWdlIHVwIjsKKwlrZXluYW1lc1tTRExLX1BBR0VET1dOXSA9ICJwYWdlIGRvd24iOworCisJa2V5bmFtZXNbU0RMS19GMV0gPSAiZjEiOworCWtleW5hbWVzW1NETEtfRjJdID0gImYyIjsKKwlrZXluYW1lc1tTRExLX0YzXSA9ICJmMyI7CisJa2V5bmFtZXNbU0RMS19GNF0gPSAiZjQiOworCWtleW5hbWVzW1NETEtfRjVdID0gImY1IjsKKwlrZXluYW1lc1tTRExLX0Y2XSA9ICJmNiI7CisJa2V5bmFtZXNbU0RMS19GN10gPSAiZjciOworCWtleW5hbWVzW1NETEtfRjhdID0gImY4IjsKKwlrZXluYW1lc1tTRExLX0Y5XSA9ICJmOSI7CisJa2V5bmFtZXNbU0RMS19GMTBdID0gImYxMCI7CisJa2V5bmFtZXNbU0RMS19GMTFdID0gImYxMSI7CisJa2V5bmFtZXNbU0RMS19GMTJdID0gImYxMiI7CisJa2V5bmFtZXNbU0RMS19GMTNdID0gImYxMyI7CisJa2V5bmFtZXNbU0RMS19GMTRdID0gImYxNCI7CisJa2V5bmFtZXNbU0RMS19GMTVdID0gImYxNSI7CisKKwlrZXluYW1lc1tTRExLX05VTUxPQ0tdID0gIm51bWxvY2siOworCWtleW5hbWVzW1NETEtfQ0FQU0xPQ0tdID0gImNhcHMgbG9jayI7CisJa2V5bmFtZXNbU0RMS19TQ1JPTExPQ0tdID0gInNjcm9sbCBsb2NrIjsKKwlrZXluYW1lc1tTRExLX1JTSElGVF0gPSAicmlnaHQgc2hpZnQiOworCWtleW5hbWVzW1NETEtfTFNISUZUXSA9ICJsZWZ0IHNoaWZ0IjsKKwlrZXluYW1lc1tTRExLX1JDVFJMXSA9ICJyaWdodCBjdHJsIjsKKwlrZXluYW1lc1tTRExLX0xDVFJMXSA9ICJsZWZ0IGN0cmwiOworCWtleW5hbWVzW1NETEtfUkFMVF0gPSAicmlnaHQgYWx0IjsKKwlrZXluYW1lc1tTRExLX0xBTFRdID0gImxlZnQgYWx0IjsKKwlrZXluYW1lc1tTRExLX1JNRVRBXSA9ICJyaWdodCBtZXRhIjsKKwlrZXluYW1lc1tTRExLX0xNRVRBXSA9ICJsZWZ0IG1ldGEiOworCWtleW5hbWVzW1NETEtfTFNVUEVSXSA9ICJsZWZ0IHN1cGVyIjsJLyogIldpbmRvd3MiIGtleXMgKi8KKwlrZXluYW1lc1tTRExLX1JTVVBFUl0gPSAicmlnaHQgc3VwZXIiOwkKKwlrZXluYW1lc1tTRExLX01PREVdID0gImFsdCBnciI7CisJa2V5bmFtZXNbU0RMS19DT01QT1NFXSA9ICJjb21wb3NlIjsKKworCWtleW5hbWVzW1NETEtfSEVMUF0gPSAiaGVscCI7CisJa2V5bmFtZXNbU0RMS19QUklOVF0gPSAicHJpbnQgc2NyZWVuIjsKKwlrZXluYW1lc1tTRExLX1NZU1JFUV0gPSAic3lzIHJlcSI7CisJa2V5bmFtZXNbU0RMS19CUkVBS10gPSAiYnJlYWsiOworCWtleW5hbWVzW1NETEtfTUVOVV0gPSAibWVudSI7CisJa2V5bmFtZXNbU0RMS19QT1dFUl0gPSAicG93ZXIiOworCWtleW5hbWVzW1NETEtfRVVST10gPSAiZXVybyI7CisJa2V5bmFtZXNbU0RMS19VTkRPXSA9ICJ1bmRvIjsKKworCS8qIERvbmUuICBXaGV3LiAqLworCXJldHVybigwKTsKK30KK3ZvaWQgU0RMX0tleWJvYXJkUXVpdCh2b2lkKQoreworfQorCisvKiBXZSBsb3N0IHRoZSBrZXlib2FyZCwgc28gcG9zdCBrZXkgdXAgbWVzc2FnZXMgZm9yIGFsbCBwcmVzc2VkIGtleXMgKi8KK3ZvaWQgU0RMX1Jlc2V0S2V5Ym9hcmQodm9pZCkKK3sKKwlTRExfa2V5c3ltIGtleXN5bTsKKwlTRExLZXkga2V5OworCisJU0RMX21lbXNldCgma2V5c3ltLCAwLCAoc2l6ZW9mIGtleXN5bSkpOworCWZvciAoIGtleT1TRExLX0ZJUlNUOyBrZXk8U0RMS19MQVNUOyArK2tleSApIHsKKwkJaWYgKCBTRExfS2V5U3RhdGVba2V5XSA9PSBTRExfUFJFU1NFRCApIHsKKwkJCWtleXN5bS5zeW0gPSBrZXk7CisJCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgJmtleXN5bSk7CisJCX0KKwl9CisJU0RMX0tleVJlcGVhdC50aW1lc3RhbXAgPSAwOworfQorCitpbnQgU0RMX0VuYWJsZVVOSUNPREUoaW50IGVuYWJsZSkKK3sKKwlpbnQgb2xkX21vZGU7CisKKwlvbGRfbW9kZSA9IFNETF9UcmFuc2xhdGVVTklDT0RFOworCWlmICggZW5hYmxlID49IDAgKSB7CisJCVNETF9UcmFuc2xhdGVVTklDT0RFID0gZW5hYmxlOworCX0KKwlyZXR1cm4ob2xkX21vZGUpOworfQorCitVaW50OCAqIFNETF9HZXRLZXlTdGF0ZSAoaW50ICpudW1rZXlzKQoreworCWlmICggbnVta2V5cyAhPSAoaW50ICopMCApCisJCSpudW1rZXlzID0gU0RMS19MQVNUOworCXJldHVybihTRExfS2V5U3RhdGUpOworfQorU0RMTW9kIFNETF9HZXRNb2RTdGF0ZSAodm9pZCkKK3sKKwlyZXR1cm4oU0RMX01vZFN0YXRlKTsKK30KK3ZvaWQgU0RMX1NldE1vZFN0YXRlIChTRExNb2QgbW9kc3RhdGUpCit7CisJU0RMX01vZFN0YXRlID0gbW9kc3RhdGU7Cit9CisKK2NoYXIgKlNETF9HZXRLZXlOYW1lKFNETEtleSBrZXkpCit7CisJY29uc3QgY2hhciAqa2V5bmFtZTsKKworCWtleW5hbWUgPSBOVUxMOworCWlmICgga2V5IDwgU0RMS19MQVNUICkgeworCQlrZXluYW1lID0ga2V5bmFtZXNba2V5XTsKKwl9CisJaWYgKCBrZXluYW1lID09IE5VTEwgKSB7CisJCWtleW5hbWUgPSAidW5rbm93biBrZXkiOworCX0KKwkvKiBGSVhNRTogbWFrZSB0aGlzIGZ1bmN0aW9uIGNvbnN0IGluIDEuMyAqLworCXJldHVybiAoY2hhciAqKShrZXluYW1lKTsKK30KKworLyogVGhlc2UgYXJlIGdsb2JhbCBmb3IgU0RMX2V2ZW50bG9vcC5jICovCitpbnQgU0RMX1ByaXZhdGVLZXlib2FyZChVaW50OCBzdGF0ZSwgU0RMX2tleXN5bSAqa2V5c3ltKQoreworCVNETF9FdmVudCBldmVudDsKKwlpbnQgcG9zdGVkLCByZXBlYXRhYmxlOworCVVpbnQxNiBtb2RzdGF0ZTsKKworCVNETF9tZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKKworI2lmIDAKK3ByaW50ZigiVGhlICclcycga2V5IGhhcyBiZWVuICVzXG4iLCBTRExfR2V0S2V5TmFtZShrZXlzeW0tPnN5bSksIAorCQkJCXN0YXRlID09IFNETF9QUkVTU0VEID8gInByZXNzZWQiIDogInJlbGVhc2VkIik7CisjZW5kaWYKKwkvKiBTZXQgdXAgdGhlIGtleXN5bSAqLworCW1vZHN0YXRlID0gKFVpbnQxNilTRExfTW9kU3RhdGU7CisKKwlyZXBlYXRhYmxlID0gMDsKKworCWlmICggc3RhdGUgPT0gU0RMX1BSRVNTRUQgKSB7CisJCWtleXN5bS0+bW9kID0gKFNETE1vZCltb2RzdGF0ZTsKKwkJc3dpdGNoIChrZXlzeW0tPnN5bSkgeworCQkJY2FzZSBTRExLX1VOS05PV046CisJCQkJYnJlYWs7CisJCQljYXNlIFNETEtfTlVNTE9DSzoKKwkJCQltb2RzdGF0ZSBePSBLTU9EX05VTTsKKwkJCQlpZiAoIFNETF9Ob0xvY2tLZXlzICYgU0RMX05MS19OVU0gKQorCQkJCQlicmVhazsKKwkJCQlpZiAoICEgKG1vZHN0YXRlJktNT0RfTlVNKSApCisJCQkJCXN0YXRlID0gU0RMX1JFTEVBU0VEOworCQkJCWtleXN5bS0+bW9kID0gKFNETE1vZCltb2RzdGF0ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19DQVBTTE9DSzoKKwkJCQltb2RzdGF0ZSBePSBLTU9EX0NBUFM7CisJCQkJaWYgKCBTRExfTm9Mb2NrS2V5cyAmIFNETF9OTEtfQ0FQUyApCisJCQkJCWJyZWFrOworCQkJCWlmICggISAobW9kc3RhdGUmS01PRF9DQVBTKSApCisJCQkJCXN0YXRlID0gU0RMX1JFTEVBU0VEOworCQkJCWtleXN5bS0+bW9kID0gKFNETE1vZCltb2RzdGF0ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19MQ1RSTDoKKwkJCQltb2RzdGF0ZSB8PSBLTU9EX0xDVFJMOworCQkJCWJyZWFrOworCQkJY2FzZSBTRExLX1JDVFJMOgorCQkJCW1vZHN0YXRlIHw9IEtNT0RfUkNUUkw7CisJCQkJYnJlYWs7CisJCQljYXNlIFNETEtfTFNISUZUOgorCQkJCW1vZHN0YXRlIHw9IEtNT0RfTFNISUZUOworCQkJCWJyZWFrOworCQkJY2FzZSBTRExLX1JTSElGVDoKKwkJCQltb2RzdGF0ZSB8PSBLTU9EX1JTSElGVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19MQUxUOgorCQkJCW1vZHN0YXRlIHw9IEtNT0RfTEFMVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19SQUxUOgorCQkJCW1vZHN0YXRlIHw9IEtNT0RfUkFMVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19MTUVUQToKKwkJCQltb2RzdGF0ZSB8PSBLTU9EX0xNRVRBOworCQkJCWJyZWFrOworCQkJY2FzZSBTRExLX1JNRVRBOgorCQkJCW1vZHN0YXRlIHw9IEtNT0RfUk1FVEE7CisJCQkJYnJlYWs7CisJCQljYXNlIFNETEtfTU9ERToKKwkJCQltb2RzdGF0ZSB8PSBLTU9EX01PREU7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJlcGVhdGFibGUgPSAxOworCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChrZXlzeW0tPnN5bSkgeworCQkJY2FzZSBTRExLX1VOS05PV046CisJCQkJYnJlYWs7CisJCQljYXNlIFNETEtfTlVNTE9DSzoKKwkJCQlpZiAoIFNETF9Ob0xvY2tLZXlzICYgU0RMX05MS19OVU0gKQorCQkJCQlicmVhazsKKwkJCQkvKiBPbmx5IHNlbmQga2V5ZG93biBldmVudHMgKi8KKwkJCQlyZXR1cm4oMCk7CisJCQljYXNlIFNETEtfQ0FQU0xPQ0s6CisJCQkJaWYgKCBTRExfTm9Mb2NrS2V5cyAmIFNETF9OTEtfQ0FQUyApCisJCQkJCWJyZWFrOworCQkJCS8qIE9ubHkgc2VuZCBrZXlkb3duIGV2ZW50cyAqLworCQkJCXJldHVybigwKTsKKwkJCWNhc2UgU0RMS19MQ1RSTDoKKwkJCQltb2RzdGF0ZSAmPSB+S01PRF9MQ1RSTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19SQ1RSTDoKKwkJCQltb2RzdGF0ZSAmPSB+S01PRF9SQ1RSTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19MU0hJRlQ6CisJCQkJbW9kc3RhdGUgJj0gfktNT0RfTFNISUZUOworCQkJCWJyZWFrOworCQkJY2FzZSBTRExLX1JTSElGVDoKKwkJCQltb2RzdGF0ZSAmPSB+S01PRF9SU0hJRlQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNETEtfTEFMVDoKKwkJCQltb2RzdGF0ZSAmPSB+S01PRF9MQUxUOworCQkJCWJyZWFrOworCQkJY2FzZSBTRExLX1JBTFQ6CisJCQkJbW9kc3RhdGUgJj0gfktNT0RfUkFMVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19MTUVUQToKKwkJCQltb2RzdGF0ZSAmPSB+S01PRF9MTUVUQTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19STUVUQToKKwkJCQltb2RzdGF0ZSAmPSB+S01PRF9STUVUQTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMS19NT0RFOgorCQkJCW1vZHN0YXRlICY9IH5LTU9EX01PREU7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWtleXN5bS0+bW9kID0gKFNETE1vZCltb2RzdGF0ZTsKKwl9CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgdHlwZSBvZiBldmVudCB0aGlzIGlzICovCisJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFNETF9QUkVTU0VEOgorCQkJZXZlbnQudHlwZSA9IFNETF9LRVlET1dOOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX1JFTEVBU0VEOgorCQkJZXZlbnQudHlwZSA9IFNETF9LRVlVUDsKKwkJCS8qCisJCQkgKiBqayA5OTEyMTUgLSBBZGRlZAorCQkJICovCisJCQlpZiAoIFNETF9LZXlSZXBlYXQudGltZXN0YW1wICYmCisJCQkgICAgIFNETF9LZXlSZXBlYXQuZXZ0LmtleS5rZXlzeW0uc3ltID09IGtleXN5bS0+c3ltICkgeworCQkJCVNETF9LZXlSZXBlYXQudGltZXN0YW1wID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogSW52YWxpZCBzdGF0ZSAtLSBiYWlsICovCisJCQlyZXR1cm4oMCk7CisJfQorCisJaWYgKCBrZXlzeW0tPnN5bSAhPSBTRExLX1VOS05PV04gKSB7CisJCS8qIERyb3AgZXZlbnRzIHRoYXQgZG9uJ3QgY2hhbmdlIHN0YXRlICovCisJCWlmICggU0RMX0tleVN0YXRlW2tleXN5bS0+c3ltXSA9PSBzdGF0ZSApIHsKKyNpZiAwCitwcmludGYoIktleWJvYXJkIGV2ZW50IGRpZG4ndCBjaGFuZ2Ugc3RhdGUgLSBkcm9wcGVkIVxuIik7CisjZW5kaWYKKwkJCXJldHVybigwKTsKKwkJfQorCisJCS8qIFVwZGF0ZSBpbnRlcm5hbCBrZXlib2FyZCBzdGF0ZSAqLworCQlTRExfTW9kU3RhdGUgPSAoU0RMTW9kKW1vZHN0YXRlOworCQlTRExfS2V5U3RhdGVba2V5c3ltLT5zeW1dID0gc3RhdGU7CisJfQorCisJLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KKwlwb3N0ZWQgPSAwOworCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbZXZlbnQudHlwZV0gPT0gU0RMX0VOQUJMRSApIHsKKwkJZXZlbnQua2V5LnN0YXRlID0gc3RhdGU7CisJCWV2ZW50LmtleS5rZXlzeW0gPSAqa2V5c3ltOworCQkvKgorCQkgKiBqayA5OTEyMTUgLSBBZGRlZAorCQkgKi8KKwkJaWYgKHJlcGVhdGFibGUgJiYgKFNETF9LZXlSZXBlYXQuZGVsYXkgIT0gMCkpIHsKKwkJCVNETF9LZXlSZXBlYXQuZXZ0ID0gZXZlbnQ7CisJCQlTRExfS2V5UmVwZWF0LmZpcnN0dGltZSA9IDE7CisJCQlTRExfS2V5UmVwZWF0LnRpbWVzdGFtcD1TRExfR2V0VGlja3MoKTsKKwkJfQorCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCBTRExfRXZlbnRPSygmZXZlbnQpICkgeworCQkJcG9zdGVkID0gMTsKKwkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKKwkJfQorCX0KKwlyZXR1cm4ocG9zdGVkKTsKK30KKworLyoKKyAqIGprIDk5MTIxNSAtIEFkZGVkCisgKi8KK3ZvaWQgU0RMX0NoZWNrS2V5UmVwZWF0KHZvaWQpCit7CisJaWYgKCBTRExfS2V5UmVwZWF0LnRpbWVzdGFtcCApIHsKKwkJVWludDMyIG5vdywgaW50ZXJ2YWw7CisKKwkJbm93ID0gU0RMX0dldFRpY2tzKCk7CisJCWludGVydmFsID0gKG5vdyAtIFNETF9LZXlSZXBlYXQudGltZXN0YW1wKTsKKwkJaWYgKCBTRExfS2V5UmVwZWF0LmZpcnN0dGltZSApIHsKKwkJCWlmICggaW50ZXJ2YWwgPiAoVWludDMyKVNETF9LZXlSZXBlYXQuZGVsYXkgKSB7CisJCQkJU0RMX0tleVJlcGVhdC50aW1lc3RhbXAgPSBub3c7CisJCQkJU0RMX0tleVJlcGVhdC5maXJzdHRpbWUgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCBpbnRlcnZhbCA+IChVaW50MzIpU0RMX0tleVJlcGVhdC5pbnRlcnZhbCApIHsKKwkJCQlTRExfS2V5UmVwZWF0LnRpbWVzdGFtcCA9IG5vdzsKKwkJCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCBTRExfRXZlbnRPSygmU0RMX0tleVJlcGVhdC5ldnQpICkgeworCQkJCQlTRExfUHVzaEV2ZW50KCZTRExfS2V5UmVwZWF0LmV2dCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitpbnQgU0RMX0VuYWJsZUtleVJlcGVhdChpbnQgZGVsYXksIGludCBpbnRlcnZhbCkKK3sKKwlpZiAoIChkZWxheSA8IDApIHx8IChpbnRlcnZhbCA8IDApICkgeworCQlTRExfU2V0RXJyb3IoImtleWJvYXJkIHJlcGVhdCB2YWx1ZSBsZXNzIHRoYW4gemVybyIpOworCQlyZXR1cm4oLTEpOworCX0KKwlTRExfS2V5UmVwZWF0LmZpcnN0dGltZSA9IDA7CisJU0RMX0tleVJlcGVhdC5kZWxheSA9IGRlbGF5OworCVNETF9LZXlSZXBlYXQuaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKwlTRExfS2V5UmVwZWF0LnRpbWVzdGFtcCA9IDA7CisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9HZXRLZXlSZXBlYXQoaW50ICpkZWxheSwgaW50ICppbnRlcnZhbCkKK3sKKwkqZGVsYXkgPSBTRExfS2V5UmVwZWF0LmRlbGF5OworCSppbnRlcnZhbCA9IFNETF9LZXlSZXBlYXQuaW50ZXJ2YWw7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9tb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9ldmVudHMvU0RMX21vdXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3YTRjNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9tb3VzZS5jCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogR2VuZXJhbCBtb3VzZSBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KKworI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICIuLi92aWRlby9TRExfY3Vyc29yX2MuaCIKKyNpbmNsdWRlICIuLi92aWRlby9TRExfc3lzdmlkZW8uaCIKKworCisvKiBUaGVzZSBhcmUgc3RhdGljIGZvciBvdXIgbW91c2UgaGFuZGxpbmcgY29kZSAqLworc3RhdGljIFNpbnQxNiBTRExfTW91c2VYID0gMDsKK3N0YXRpYyBTaW50MTYgU0RMX01vdXNlWSA9IDA7CitzdGF0aWMgU2ludDE2IFNETF9EZWx0YVggPSAwOworc3RhdGljIFNpbnQxNiBTRExfRGVsdGFZID0gMDsKK3N0YXRpYyBTaW50MTYgU0RMX01vdXNlTWF4WCA9IDA7CitzdGF0aWMgU2ludDE2IFNETF9Nb3VzZU1heFkgPSAwOworc3RhdGljIFVpbnQ4ICBTRExfQnV0dG9uU3RhdGUgPSAwOworCisKKy8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KK2ludCBTRExfTW91c2VJbml0KHZvaWQpCit7CisJLyogVGhlIG1vdXNlIGlzIGF0ICgwLDApICovCisJU0RMX01vdXNlWCA9IDA7CisJU0RMX01vdXNlWSA9IDA7CisJU0RMX0RlbHRhWCA9IDA7CisJU0RMX0RlbHRhWSA9IDA7CisJU0RMX01vdXNlTWF4WCA9IDA7CisJU0RMX01vdXNlTWF4WSA9IDA7CisJU0RMX0J1dHRvblN0YXRlID0gMDsKKworCS8qIFRoYXQncyBpdCEgKi8KKwlyZXR1cm4oMCk7Cit9Cit2b2lkIFNETF9Nb3VzZVF1aXQodm9pZCkKK3sKK30KKworLyogV2UgbG9zdCB0aGUgbW91c2UsIHNvIHBvc3QgYnV0dG9uIHVwIG1lc3NhZ2VzIGZvciBhbGwgcHJlc3NlZCBidXR0b25zICovCit2b2lkIFNETF9SZXNldE1vdXNlKHZvaWQpCit7CisJVWludDggaTsKKwlmb3IgKCBpID0gMDsgaSA8IHNpemVvZihTRExfQnV0dG9uU3RhdGUpKjg7ICsraSApIHsKKwkJaWYgKCBTRExfQnV0dG9uU3RhdGUgJiBTRExfQlVUVE9OKGkpICkgeworCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIGksIDAsIDApOworCQl9CisJfQorfQorCitVaW50OCBTRExfR2V0TW91c2VTdGF0ZSAoaW50ICp4LCBpbnQgKnkpCit7CisJaWYgKCB4ICkgeworCQkqeCA9IFNETF9Nb3VzZVg7CisJfQorCWlmICggeSApIHsKKwkJKnkgPSBTRExfTW91c2VZOworCX0KKwlyZXR1cm4oU0RMX0J1dHRvblN0YXRlKTsKK30KKworVWludDggU0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZSAoaW50ICp4LCBpbnQgKnkpCit7CisJaWYgKCB4ICkKKwkJKnggPSBTRExfRGVsdGFYOworCWlmICggeSApCisJCSp5ID0gU0RMX0RlbHRhWTsKKwlTRExfRGVsdGFYID0gMDsKKwlTRExfRGVsdGFZID0gMDsKKwlyZXR1cm4oU0RMX0J1dHRvblN0YXRlKTsKK30KKworc3RhdGljIHZvaWQgQ2xpcE9mZnNldChTaW50MTYgKngsIFNpbnQxNiAqeSkKK3sKKwkvKiBUaGlzIGNsaXBzIGFic29sdXRlIG1vdXNlIGNvb3JkaW5hdGVzIHdoZW4gdGhlIGFwcGFyZW50CisJICAgZGlzcGxheSBzdXJmYWNlIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVhbCBkaXNwbGF5IHN1cmZhY2UuCisJICovCisJaWYgKCBTRExfVmlkZW9TdXJmYWNlICYmIFNETF9WaWRlb1N1cmZhY2UtPm9mZnNldCApIHsKKwkJKnkgLT0gU0RMX1ZpZGVvU3VyZmFjZS0+b2Zmc2V0L1NETF9WaWRlb1N1cmZhY2UtPnBpdGNoOworCQkqeCAtPSAoU0RMX1ZpZGVvU3VyZmFjZS0+b2Zmc2V0JVNETF9WaWRlb1N1cmZhY2UtPnBpdGNoKS8KKwkJCQlTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJfQorfQorCit2b2lkIFNETF9TZXRNb3VzZVJhbmdlKGludCBtYXhYLCBpbnQgbWF4WSkKK3sKKwlTRExfTW91c2VNYXhYID0gKFNpbnQxNiltYXhYOworCVNETF9Nb3VzZU1heFkgPSAoU2ludDE2KW1heFk7Cit9CisKKy8qIFRoZXNlIGFyZSBnbG9iYWwgZm9yIFNETF9ldmVudGxvb3AuYyAqLworaW50IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oVWludDggYnV0dG9uc3RhdGUsIGludCByZWxhdGl2ZSwgU2ludDE2IHgsIFNpbnQxNiB5KQoreworCWludCBwb3N0ZWQ7CisJVWludDE2IFgsIFk7CisJU2ludDE2IFhyZWw7CisJU2ludDE2IFlyZWw7CisKKwkvKiBEZWZhdWx0IGJ1dHRvbnN0YXRlIGlzIHRoZSBjdXJyZW50IG9uZSAqLworCWlmICggISBidXR0b25zdGF0ZSApIHsKKwkJYnV0dG9uc3RhdGUgPSBTRExfQnV0dG9uU3RhdGU7CisJfQorCisJWHJlbCA9IHg7CisJWXJlbCA9IHk7CisJaWYgKCByZWxhdGl2ZSApIHsKKwkJLyogUHVzaCB0aGUgY3Vyc29yIGFyb3VuZCAqLworCQl4ID0gKFNETF9Nb3VzZVgreCk7CisJCXkgPSAoU0RMX01vdXNlWSt5KTsKKwl9IGVsc2UgeworCQkvKiBEbyB3ZSBuZWVkIHRvIGNsaXAge3gseX0gPyAqLworCQlDbGlwT2Zmc2V0KCZ4LCAmeSk7CisJfQorCisJLyogTW91c2UgY29vcmRpbmF0ZXMgcmFuZ2UgZnJvbSAwIC0gd2lkdGgtMSBhbmQgMCAtIGhlaWdodC0xICovCisJaWYgKCB4IDwgMCApCisJCVggPSAwOworCWVsc2UKKwlpZiAoIHggPj0gU0RMX01vdXNlTWF4WCApCisJCVggPSBTRExfTW91c2VNYXhYLTE7CisJZWxzZQorCQlYID0gKFVpbnQxNil4OworCisJaWYgKCB5IDwgMCApCisJCVkgPSAwOworCWVsc2UKKwlpZiAoIHkgPj0gU0RMX01vdXNlTWF4WSApCisJCVkgPSBTRExfTW91c2VNYXhZLTE7CisJZWxzZQorCQlZID0gKFVpbnQxNil5OworCisJLyogSWYgbm90IHJlbGF0aXZlIG1vZGUsIGdlbmVyYXRlIHJlbGF0aXZlIG1vdGlvbiBmcm9tIGNsYW1wZWQgWC9ZLgorCSAgIFRoaXMgcHJldmVudHMgbG90cyBvZiBleHRyYW5lb3VzIGxhcmdlIGRlbHRhIHJlbGF0aXZlIG1vdGlvbiB3aGVuCisJICAgdGhlIHNjcmVlbiBpcyB3aW5kb3dlZCBtb2RlIGFuZCB0aGUgbW91c2UgaXMgb3V0c2lkZSB0aGUgd2luZG93LgorCSovCisJaWYgKCAhIHJlbGF0aXZlICkgeworCQlYcmVsID0gWC1TRExfTW91c2VYOworCQlZcmVsID0gWS1TRExfTW91c2VZOworCX0KKworCS8qIERyb3AgZXZlbnRzIHRoYXQgZG9uJ3QgY2hhbmdlIHN0YXRlICovCisJaWYgKCAhIFhyZWwgJiYgISBZcmVsICkgeworI2lmIDAKK3ByaW50ZigiTW91c2UgZXZlbnQgZGlkbid0IGNoYW5nZSBzdGF0ZSAtIGRyb3BwZWQhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4oMCk7CisJfQorCisJLyogVXBkYXRlIGludGVybmFsIG1vdXNlIHN0YXRlICovCisJU0RMX0J1dHRvblN0YXRlID0gYnV0dG9uc3RhdGU7CisJU0RMX01vdXNlWCA9IFg7CisJU0RMX01vdXNlWSA9IFk7CisJU0RMX0RlbHRhWCArPSBYcmVsOworCVNETF9EZWx0YVkgKz0gWXJlbDsKKyAgICAgICAgU0RMX01vdmVDdXJzb3IoU0RMX01vdXNlWCwgU0RMX01vdXNlWSk7CisKKwkvKiBQb3N0IHRoZSBldmVudCwgaWYgZGVzaXJlZCAqLworCXBvc3RlZCA9IDA7CisJaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tTRExfTU9VU0VNT1RJT05dID09IFNETF9FTkFCTEUgKSB7CisJCVNETF9FdmVudCBldmVudDsKKwkJU0RMX21lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOworCQlldmVudC50eXBlID0gU0RMX01PVVNFTU9USU9OOworCQlldmVudC5tb3Rpb24uc3RhdGUgPSBidXR0b25zdGF0ZTsKKwkJZXZlbnQubW90aW9uLnggPSBYOworCQlldmVudC5tb3Rpb24ueSA9IFk7CisJCWV2ZW50Lm1vdGlvbi54cmVsID0gWHJlbDsKKwkJZXZlbnQubW90aW9uLnlyZWwgPSBZcmVsOworCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgeworCQkJcG9zdGVkID0gMTsKKwkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKKwkJfQorCX0KKwlyZXR1cm4ocG9zdGVkKTsKK30KKworaW50IFNETF9Qcml2YXRlTW91c2VCdXR0b24oVWludDggc3RhdGUsIFVpbnQ4IGJ1dHRvbiwgU2ludDE2IHgsIFNpbnQxNiB5KQoreworCVNETF9FdmVudCBldmVudDsKKwlpbnQgcG9zdGVkOworCWludCBtb3ZlX21vdXNlOworCVVpbnQ4IGJ1dHRvbnN0YXRlOworCisJU0RMX21lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOworCisJLyogQ2hlY2sgcGFyYW1ldGVycyAqLworCWlmICggeCB8fCB5ICkgeworCQlDbGlwT2Zmc2V0KCZ4LCAmeSk7CisJCW1vdmVfbW91c2UgPSAxOworCQkvKiBNb3VzZSBjb29yZGluYXRlcyByYW5nZSBmcm9tIDAgLSB3aWR0aC0xIGFuZCAwIC0gaGVpZ2h0LTEgKi8KKwkJaWYgKCB4IDwgMCApCisJCQl4ID0gMDsKKwkJZWxzZQorCQlpZiAoIHggPj0gU0RMX01vdXNlTWF4WCApCisJCQl4ID0gU0RMX01vdXNlTWF4WC0xOworCisJCWlmICggeSA8IDAgKQorCQkJeSA9IDA7CisJCWVsc2UKKwkJaWYgKCB5ID49IFNETF9Nb3VzZU1heFkgKQorCQkJeSA9IFNETF9Nb3VzZU1heFktMTsKKwl9IGVsc2UgeworCQltb3ZlX21vdXNlID0gMDsKKwl9CisJaWYgKCAhIHggKQorCQl4ID0gU0RMX01vdXNlWDsKKwlpZiAoICEgeSApCisJCXkgPSBTRExfTW91c2VZOworCisJLyogRmlndXJlIG91dCB3aGljaCBldmVudCB0byBwZXJmb3JtICovCisJYnV0dG9uc3RhdGUgPSBTRExfQnV0dG9uU3RhdGU7CisJc3dpdGNoICggc3RhdGUgKSB7CisJCWNhc2UgU0RMX1BSRVNTRUQ6CisJCQlldmVudC50eXBlID0gU0RMX01PVVNFQlVUVE9ORE9XTjsKKwkJCWJ1dHRvbnN0YXRlIHw9IFNETF9CVVRUT04oYnV0dG9uKTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9SRUxFQVNFRDoKKwkJCWV2ZW50LnR5cGUgPSBTRExfTU9VU0VCVVRUT05VUDsKKwkJCWJ1dHRvbnN0YXRlICY9IH5TRExfQlVUVE9OKGJ1dHRvbik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIEludmFsaWQgc3RhdGUgLS0gYmFpbCAqLworCQkJcmV0dXJuKDApOworCX0KKworCS8qIFVwZGF0ZSBpbnRlcm5hbCBtb3VzZSBzdGF0ZSAqLworCVNETF9CdXR0b25TdGF0ZSA9IGJ1dHRvbnN0YXRlOworCWlmICggbW92ZV9tb3VzZSApIHsKKwkJU0RMX01vdXNlWCA9IHg7CisJCVNETF9Nb3VzZVkgPSB5OworCQlTRExfTW92ZUN1cnNvcihTRExfTW91c2VYLCBTRExfTW91c2VZKTsKKwl9CisKKwkvKiBQb3N0IHRoZSBldmVudCwgaWYgZGVzaXJlZCAqLworCXBvc3RlZCA9IDA7CisJaWYgKCBTRExfUHJvY2Vzc0V2ZW50c1tldmVudC50eXBlXSA9PSBTRExfRU5BQkxFICkgeworCQlldmVudC5idXR0b24uc3RhdGUgPSBzdGF0ZTsKKwkJZXZlbnQuYnV0dG9uLmJ1dHRvbiA9IGJ1dHRvbjsKKwkJZXZlbnQuYnV0dG9uLnggPSB4OworCQlldmVudC5idXR0b24ueSA9IHk7CisJCWlmICggKFNETF9FdmVudE9LID09IE5VTEwpIHx8ICgqU0RMX0V2ZW50T0spKCZldmVudCkgKSB7CisJCQlwb3N0ZWQgPSAxOworCQkJU0RMX1B1c2hFdmVudCgmZXZlbnQpOworCQl9CisJfQorCXJldHVybihwb3N0ZWQpOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2V2ZW50cy9TRExfcXVpdC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9ldmVudHMvU0RMX3F1aXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTZjNTZlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9ldmVudHMvU0RMX3F1aXQuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEdlbmVyYWwgcXVpdCBoYW5kbGluZyBjb2RlIGZvciBTREwgKi8KKworI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgorI2luY2x1ZGUgIlNETF9ldmVudHNfYy5oIgorCisKKyNpZmRlZiBIQVZFX1NJR05BTF9ICitzdGF0aWMgdm9pZCBTRExfSGFuZGxlU0lHKGludCBzaWcpCit7CisJLyogUmVzZXQgdGhlIHNpZ25hbCBoYW5kbGVyICovCisJc2lnbmFsKHNpZywgU0RMX0hhbmRsZVNJRyk7CisKKwkvKiBTaWduYWwgYSBxdWl0IGludGVycnVwdCAqLworCVNETF9Qcml2YXRlUXVpdCgpOworfQorI2VuZGlmIC8qIEhBVkVfU0lHTkFMX0ggKi8KKworLyogUHVibGljIGZ1bmN0aW9ucyAqLworaW50IFNETF9RdWl0SW5pdCh2b2lkKQoreworI2lmZGVmIEhBVkVfU0lHQUNUSU9OCisJc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247CisJc2lnYWN0aW9uKFNJR0lOVCwgTlVMTCwgJmFjdGlvbik7CisjICBpZmRlZiBIQVZFX1NBX1NJR0FDVElPTgorCWlmICggYWN0aW9uLnNhX2hhbmRsZXIgPT0gU0lHX0RGTCAmJiBhY3Rpb24uc2Ffc2lnYWN0aW9uID09ICh2b2lkKilTSUdfREZMICkgeworIyAgZWxzZQorCWlmICggYWN0aW9uLnNhX2hhbmRsZXIgPT0gU0lHX0RGTCApIHsKKyMgIGVuZGlmCisJCWFjdGlvbi5zYV9oYW5kbGVyID0gU0RMX0hhbmRsZVNJRzsKKwkJc2lnYWN0aW9uKFNJR0lOVCwgJmFjdGlvbiwgTlVMTCk7CisJfQorCXNpZ2FjdGlvbihTSUdURVJNLCBOVUxMLCAmYWN0aW9uKTsKKyMgIGlmZGVmIEhBVkVfU0FfU0lHQUNUSU9OCisJaWYgKCBhY3Rpb24uc2FfaGFuZGxlciA9PSBTSUdfREZMICYmIGFjdGlvbi5zYV9zaWdhY3Rpb24gPT0gKHZvaWQqKVNJR19ERkwgKSB7CisjICBlbHNlCisJaWYgKCBhY3Rpb24uc2FfaGFuZGxlciA9PSBTSUdfREZMICkgeworIyAgZW5kaWYKKwkJYWN0aW9uLnNhX2hhbmRsZXIgPSBTRExfSGFuZGxlU0lHOworCQlzaWdhY3Rpb24oU0lHVEVSTSwgJmFjdGlvbiwgTlVMTCk7CisJfQorI2VsaWYgSEFWRV9TSUdOQUxfSAorCXZvaWQgKCpvaGFuZGxlcikoaW50KTsKKworCS8qIEJvdGggU0lHSU5UIGFuZCBTSUdURVJNIGFyZSB0cmFuc2xhdGVkIGludG8gcXVpdCBpbnRlcnJ1cHRzICovCisJb2hhbmRsZXIgPSBzaWduYWwoU0lHSU5ULCBTRExfSGFuZGxlU0lHKTsKKwlpZiAoIG9oYW5kbGVyICE9IFNJR19ERkwgKQorCQlzaWduYWwoU0lHSU5ULCBvaGFuZGxlcik7CisJb2hhbmRsZXIgPSBzaWduYWwoU0lHVEVSTSwgU0RMX0hhbmRsZVNJRyk7CisJaWYgKCBvaGFuZGxlciAhPSBTSUdfREZMICkKKwkJc2lnbmFsKFNJR1RFUk0sIG9oYW5kbGVyKTsKKyNlbmRpZiAvKiBIQVZFX1NJR05BTF9IICovCisKKwkvKiBUaGF0J3MgaXQhICovCisJcmV0dXJuKDApOworfQordm9pZCBTRExfUXVpdFF1aXQodm9pZCkKK3sKKyNpZmRlZiBIQVZFX1NJR0FDVElPTgorCXN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOworCXNpZ2FjdGlvbihTSUdJTlQsIE5VTEwsICZhY3Rpb24pOworCWlmICggYWN0aW9uLnNhX2hhbmRsZXIgPT0gU0RMX0hhbmRsZVNJRyApIHsKKwkJYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfREZMOworCQlzaWdhY3Rpb24oU0lHSU5ULCAmYWN0aW9uLCBOVUxMKTsKKwl9CisJc2lnYWN0aW9uKFNJR1RFUk0sIE5VTEwsICZhY3Rpb24pOworCWlmICggYWN0aW9uLnNhX2hhbmRsZXIgPT0gU0RMX0hhbmRsZVNJRyApIHsKKwkJYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfREZMOworCQlzaWdhY3Rpb24oU0lHVEVSTSwgJmFjdGlvbiwgTlVMTCk7CisJfQorI2VsaWYgSEFWRV9TSUdOQUxfSAorCXZvaWQgKCpvaGFuZGxlcikoaW50KTsKKworCW9oYW5kbGVyID0gc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisJaWYgKCBvaGFuZGxlciAhPSBTRExfSGFuZGxlU0lHICkKKwkJc2lnbmFsKFNJR0lOVCwgb2hhbmRsZXIpOworCW9oYW5kbGVyID0gc2lnbmFsKFNJR1RFUk0sIFNJR19ERkwpOworCWlmICggb2hhbmRsZXIgIT0gU0RMX0hhbmRsZVNJRyApCisJCXNpZ25hbChTSUdURVJNLCBvaGFuZGxlcik7CisjZW5kaWYgLyogSEFWRV9TSUdOQUxfSCAqLworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMSBpZiBpdCdzIG9rYXkgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdyAqLworaW50IFNETF9Qcml2YXRlUXVpdCh2b2lkKQoreworCWludCBwb3N0ZWQ7CisKKwlwb3N0ZWQgPSAwOworCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX1FVSVRdID09IFNETF9FTkFCTEUgKSB7CisJCVNETF9FdmVudCBldmVudDsKKwkJZXZlbnQudHlwZSA9IFNETF9RVUlUOworCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgeworCQkJcG9zdGVkID0gMTsKKwkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKKwkJfQorCX0KKwlyZXR1cm4ocG9zdGVkKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9yZXNpemUuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9yZXNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzU0YTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9ldmVudHMvU0RMX3Jlc2l6ZS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBSZXNpemUgZXZlbnQgaGFuZGxpbmcgY29kZSBmb3IgU0RMICovCisKKyNpbmNsdWRlICJTRExfZXZlbnRzLmgiCisjaW5jbHVkZSAiU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vdmlkZW8vU0RMX3N5c3ZpZGVvLmgiCisKKworLyogS2VlcCB0aGUgbGFzdCByZXNpemUgZXZlbnQgc28gd2UgZG9uJ3QgcG9zdCBkdXBsaWNhdGVzICovCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgdzsKKwlpbnQgaDsKK30gbGFzdF9yZXNpemU7CisKKy8qIFRoaXMgaXMgZ2xvYmFsIGZvciBTRExfZXZlbnRsb29wLmMgKi8KK2ludCBTRExfUHJpdmF0ZVJlc2l6ZShpbnQgdywgaW50IGgpCit7CisJaW50IHBvc3RlZDsKKwlTRExfRXZlbnQgZXZlbnRzWzMyXTsKKworCS8qIFNlZSBpZiB0aGlzIGV2ZW50IHdvdWxkIGNoYW5nZSB0aGUgdmlkZW8gc3VyZmFjZSAqLworCWlmICggIXcgfHwgIWggfHwKKwkgICAgICgoIGxhc3RfcmVzaXplLncgPT0gdyApICYmICggbGFzdF9yZXNpemUuaCA9PSBoICkpIHx8CisJICAgICAhU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJIHJldHVybigwKTsKKwl9CisJbGFzdF9yZXNpemUudyA9IHc7CisJbGFzdF9yZXNpemUuaCA9IGg7CisKKwlTRExfU2V0TW91c2VSYW5nZSh3LCBoKTsKKworCS8qIFB1bGwgb3V0IGFsbCBvbGQgcmVzaXplIGV2ZW50cyAqLworCVNETF9QZWVwRXZlbnRzKGV2ZW50cywgc2l6ZW9mKGV2ZW50cykvc2l6ZW9mKGV2ZW50c1swXSksCisJICAgICAgICAgICAgICAgICAgICBTRExfR0VURVZFTlQsIFNETF9WSURFT1JFU0laRU1BU0spOworCisJLyogUG9zdCB0aGUgZXZlbnQsIGlmIGRlc2lyZWQgKi8KKwlwb3N0ZWQgPSAwOworCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX1ZJREVPUkVTSVpFXSA9PSBTRExfRU5BQkxFICkgeworCQlTRExfRXZlbnQgZXZlbnQ7CisJCWV2ZW50LnR5cGUgPSBTRExfVklERU9SRVNJWkU7CisJCWV2ZW50LnJlc2l6ZS53ID0gdzsKKwkJZXZlbnQucmVzaXplLmggPSBoOworCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgeworCQkJcG9zdGVkID0gMTsKKwkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKKwkJfQorCX0KKwlyZXR1cm4ocG9zdGVkKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9zeXNldmVudHMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvZXZlbnRzL1NETF9zeXNldmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBiZmUxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9ldmVudHMvU0RMX3N5c2V2ZW50cy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgU0RMX2ZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIi4uL3ZpZGVvL1NETF9zeXN2aWRlby5oIgorCisvKiBVc2VmdWwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZnJvbSBTRExfc3lzZXZlbnRzLmMgKi8KKworI2lmZGVmIF9fQkVPU19fCQkvKiBUaGUgQmUgZXZlbnQgbG9vcCBydW5zIGluIGEgc2VwYXJhdGUgdGhyZWFkICovCisjZGVmaW5lIE1VU1RfVEhSRUFEX0VWRU5UUworI2VuZGlmCisKKyNpZmRlZiBfX1dJTjMyX18JLyogV2luMzIgZG9lc24ndCBhbGxvdyBhIHNlcGFyYXRlIGV2ZW50IHRocmVhZCAqLworI2RlZmluZSBDQU5UX1RIUkVBRF9FVkVOVFMKKyNlbmRpZgorCisjaWZkZWYgSVBPRAkJCS8qIGlQb2QgZG9lc24ndCBzdXBwb3J0IHRocmVhZGluZyBhdCBhbGwgKi8KKyNkZWZpbmUgQ0FOVF9USFJFQURfRVZFTlRTCisjZW5kaWYKKworI2lmZGVmIF9fTUFDT1NfXwkvKiBNYWNPUyA3LzggZG9uJ3Qgc3VwcG9ydCBwcmVlbXB0aXZlIG11bHRpLXRhc2tpbmcgKi8KKyNkZWZpbmUgQ0FOVF9USFJFQURfRVZFTlRTCisjZW5kaWYKKworI2lmZGVmIF9fT1MyX18JCS8qIFRoZSBPUy8yIGV2ZW50IGxvb3AgcnVucyBpbiBhIHNlcGFyYXRlIHRocmVhZCAqLworI2RlZmluZSBNVVNUX1RIUkVBRF9FVkVOVFMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9maWxlL1NETF9yd29wcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9maWxlL1NETF9yd29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTNlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2ZpbGUvU0RMX3J3b3BzLmMKQEAgLTAsMCArMSw2NzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBnZW5lcmFsIGludGVyZmFjZSBmb3IgU0RMIHRvIHJlYWQgYW5kIHdyaXRlCisgICBkYXRhIHNvdXJjZXMuICBJdCBjYW4gZWFzaWx5IGJlIGV4dGVuZGVkIHRvIGZpbGVzLCBtZW1vcnksIGV0Yy4KKyovCisKKyNpbmNsdWRlICJTRExfZW5kaWFuLmgiCisjaW5jbHVkZSAiU0RMX3J3b3BzLmgiCisKKworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX1NZTUJJQU4zMl9fKQorCisvKiBGdW5jdGlvbnMgdG8gcmVhZC93cml0ZSBXaW4zMiBBUEkgZmlsZSBwb2ludGVycyAqLworLyogV2lsbCBub3QgdXNlIGl0IG9uIFdpbkNFIGJlY2F1c2Ugc3RkaW8gaXMgYnVmZmVyZWQsIGl0IG1lYW5zCisgICBmYXN0ZXIsIGFuZCBhbGwgc3RkaW8gZnVuY3Rpb25zIGFueXdheSBhcmUgZW1iZWRkZWQgaW4gY29yZWRsbC5kbGwgLSAKKyAgIHRoZSBtYWluIHdpbmNlIGRsbCovCisKKyNkZWZpbmUgV0lORE9XU19MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaWZuZGVmIElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUgorI2RlZmluZSBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIgMHhGRkZGRkZGRgorI2VuZGlmCisKKyNkZWZpbmUgUkVBREFIRUFEX0JVRkZFUl9TSVpFCTEwMjQKKworc3RhdGljIGludCBTRExDQUxMIHdpbjMyX2ZpbGVfb3BlbihTRExfUldvcHMgKmNvbnRleHQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKQoreworI2lmbmRlZiBfV0lOMzJfV0NFCisJVUlOVAlvbGRfZXJyb3JfbW9kZTsKKyNlbmRpZgorCUhBTkRMRQloOworCURXT1JECXJfcmlnaHQsIHdfcmlnaHQ7CisJRFdPUkQJbXVzdF9leGlzdCwgdHJ1bmNhdGU7CisJaW50CQlhX21vZGU7CisKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiAtMTsgLyogZmFpbGVkIChpbnZhbGlkIGNhbGwpICovCisJCQorCWNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmggPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsgLyogbWFyayB0aGlzIGFzIHVudXNhYmxlICovCisJY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEgPSBOVUxMOworCWNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5zaXplID0gMDsKKwljb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdCA9IDA7CisKKwkvKiAiciIgPSByZWFkaW5nLCBmaWxlIG11c3QgZXhpc3QgKi8KKwkvKiAidyIgPSB3cml0aW5nLCB0cnVuY2F0ZSBleGlzdGluZywgZmlsZSBtYXkgbm90IGV4aXN0ICovCisJLyogInIrIj0gcmVhZGluZyBvciB3cml0aW5nLCBmaWxlIG11c3QgZXhpc3QgICAgICAgICAgICAqLworCS8qICJhIiA9IHdyaXRpbmcsIGFwcGVuZCBmaWxlIG1heSBub3QgZXhpc3QgICAgICAgICAgICAgKi8KKwkvKiAiYSsiPSBhcHBlbmQgKyByZWFkLCBmaWxlIG1heSBub3QgZXhpc3QgICAgICAgICAgICAgICovCisJLyogIncrIiA9IHJlYWQsIHdyaXRlLCB0cnVuY2F0ZS4gZmlsZSBtYXkgbm90IGV4aXN0ICAgICovCisJCisJbXVzdF9leGlzdCA9ICggU0RMX3N0cmNocihtb2RlLCdyJykgIT0gTlVMTCApID8gT1BFTl9FWElTVElORyA6IDA7CisJdHJ1bmNhdGUgICA9ICggU0RMX3N0cmNocihtb2RlLCd3JykgIT0gTlVMTCApID8gQ1JFQVRFX0FMV0FZUyA6IDA7CisJcl9yaWdodCAgICA9ICggU0RMX3N0cmNocihtb2RlLCcrJykgIT0gTlVMTCB8fCBtdXN0X2V4aXN0ICkgPyBHRU5FUklDX1JFQUQgOiAwOworCWFfbW9kZSAgICAgPSAoIFNETF9zdHJjaHIobW9kZSwnYScpICE9IE5VTEwgKSA/IE9QRU5fQUxXQVlTIDogMDsKKwl3X3JpZ2h0ICAgID0gKCBhX21vZGUgfHwgU0RMX3N0cmNocihtb2RlLCcrJykgfHwgdHJ1bmNhdGUgKSA/IEdFTkVSSUNfV1JJVEUgOiAwOworCisJaWYgKCFyX3JpZ2h0ICYmICF3X3JpZ2h0KSAvKiBpbmNvbnNpc3RlbnQgbW9kZSAqLworCQlyZXR1cm4gLTE7IC8qIGZhaWxlZCAoaW52YWxpZCBjYWxsKSAqLworCisJY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEgPSAoY2hhciAqKVNETF9tYWxsb2MoUkVBREFIRUFEX0JVRkZFUl9TSVpFKTsKKwlpZiAoIWNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5kYXRhKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4gLTE7CisJfQorCisjaWZkZWYgX1dJTjMyX1dDRQorCXsKKwkJc2l6ZV90IHNpemUgPSBTRExfc3RybGVuKGZpbGVuYW1lKSsxOworCQl3Y2hhcl90ICpmaWxlbmFtZVcgPSBTRExfc3RhY2tfYWxsb2Mod2NoYXJfdCwgc2l6ZSk7CisKKwkJaWYgKCBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsIDAsIGZpbGVuYW1lLCAtMSwgZmlsZW5hbWVXLCBzaXplKSA9PSAwICkgeworCQkJU0RMX3N0YWNrX2ZyZWUoZmlsZW5hbWVXKTsKKwkJCVNETF9mcmVlKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5kYXRhKTsKKwkJCWNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5kYXRhID0gTlVMTDsKKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgZmlsZW5hbWUgdG8gVW5pY29kZSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWggPSBDcmVhdGVGaWxlKGZpbGVuYW1lVywgKHdfcmlnaHR8cl9yaWdodCksICh3X3JpZ2h0KT8gMCA6IEZJTEVfU0hBUkVfUkVBRCwgCisJCQkJCSAgIE5VTEwsIChtdXN0X2V4aXN0fHRydW5jYXRlfGFfbW9kZSksIEZJTEVfQVRUUklCVVRFX05PUk1BTCxOVUxMKTsKKwkJU0RMX3N0YWNrX2ZyZWUoZmlsZW5hbWVXKTsKKwl9CisjZWxzZQorCXsKKworCS8qIGhhbmRsZSBVbmljb2RlIGZpbGVuYW1lcy4gIFdlIGRvIHNvbWUgdGFwZGFuY2luZyBoZXJlIHRvIG1ha2Ugc3VyZSB0aGlzCisJICAgd29ya3Mgb24gV2luOXgsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBhbnl0aGluZyBidXQgMS1ieXRlIGNvZGVwYWdlcy4gKi8KKwljb25zdCBzaXplX3Qgc2l6ZSA9IFNETF9zdHJsZW4oZmlsZW5hbWUpKzE7CisJc3RhdGljIGludCB1bmljb2RlX3N1cHBvcnQgPSAtMTsKKworCWlmICh1bmljb2RlX3N1cHBvcnQgPT0gLTEpIHsKKwkJT1NWRVJTSU9OSU5GTyBvc1ZlckluZm87ICAgICAvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgT1MgKi8KKwkJb3NWZXJJbmZvLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2Yob3NWZXJJbmZvKTsKKwkJaWYgKCFHZXRWZXJzaW9uRXgoJm9zVmVySW5mbykpIHsKKwkJCXVuaWNvZGVfc3VwcG9ydCA9IDA7CisJCX0gZWxzZSBpZiAob3NWZXJJbmZvLmR3UGxhdGZvcm1JZCAhPSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUykgeworCQkJdW5pY29kZV9zdXBwb3J0ID0gMTsgIC8qIE5vdCBXaW45NS85OC9NRS4gKi8KKwkJfSBlbHNlIHsKKwkJCXVuaWNvZGVfc3VwcG9ydCA9IDA7CisJCX0KKwl9CisKKwlpZiAodW5pY29kZV9zdXBwb3J0KSB7ICAvKiBldmVyeXRoaW5nIGJ1dCBXaW45NS85OC9NRS4gKi8KKwkJd2NoYXJfdCAqZmlsZW5hbWVXID0gU0RMX3N0YWNrX2FsbG9jKHdjaGFyX3QsIHNpemUpOworCQlpZiAoIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgZmlsZW5hbWUsIC0xLCBmaWxlbmFtZVcsIHNpemUpID09IDAgKSB7CisJCQlTRExfc3RhY2tfZnJlZShmaWxlbmFtZVcpOworCQkJU0RMX2ZyZWUoY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEpOworCQkJY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEgPSBOVUxMOworCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gY29udmVydCBmaWxlbmFtZSB0byBVbmljb2RlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBEbyBub3Qgb3BlbiBhIGRpYWxvZyBib3ggaWYgZmFpbHVyZSAqLworCQlvbGRfZXJyb3JfbW9kZSA9IFNldEVycm9yTW9kZShTRU1fTk9PUEVORklMRUVSUk9SQk9YfFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMpOworCQloID0gQ3JlYXRlRmlsZVcoZmlsZW5hbWVXLCAod19yaWdodHxyX3JpZ2h0KSwgKHdfcmlnaHQpPyAwIDogRklMRV9TSEFSRV9SRUFELAorCQkJCQkgICBOVUxMLCAobXVzdF9leGlzdHx0cnVuY2F0ZXxhX21vZGUpLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsTlVMTCk7CisJCS8qIHJlc3RvcmUgb2xkIGJlaGF2aW91ciAqLworCQlTZXRFcnJvck1vZGUob2xkX2Vycm9yX21vZGUpOworCisJCVNETF9zdGFja19mcmVlKGZpbGVuYW1lVyk7CisJfSBlbHNlIHsKKwkJLyogQ1BfVVRGOCBtaWdodCBub3QgYmUgc3VwcG9ydGVkIChXaW45NSksIHNvIHVzZSBTRExfaWNvbnYgdG8gZ2V0IHdjaGFycy4gKi8KKwkJLyogVXNlIFVDUzI6IG5vIFVURi0xNiBzdXBwb3J0IGhlcmUuIFRyeSBhZ2FpbiBpbiBTREwgMS4zLiAgOikgKi8KKwkJY2hhciAqdXRmMTYgPSBTRExfaWNvbnZfc3RyaW5nKCJVQ1MyIiwgIlVURjgiLCBmaWxlbmFtZSwgU0RMX3N0cmxlbihmaWxlbmFtZSkgKyAxKTsKKwkJY2hhciAqZmlsZW5hbWVBID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIHNpemUgKiA2KTsgIC8qIDYsIGp1c3QgaW4gY2FzZS4gKi8KKwkJQk9PTCBiRGVmQ2hhclVzZWQgPSBGQUxTRTsKKworCQkvKiBEaXRoZXIgZG93biB0byBhIGNvZGVwYWdlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4gKi8KKwkJaWYgKCF1dGYxNiB8fAorCQkJIVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCAoTFBDV1NUUil1dGYxNiwgLTEsIGZpbGVuYW1lQSwgc2l6ZSo2LCAwLCAmYkRlZkNoYXJVc2VkKSB8fAorCQkJYkRlZkNoYXJVc2VkKSB7CisJCQlTRExfc3RhY2tfZnJlZShmaWxlbmFtZUEpOworCQkJU0RMX2ZyZWUodXRmMTYpOworCQkJU0RMX2ZyZWUoY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEpOworCQkJY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEgPSBOVUxMOworCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gY29udmVydCBmaWxlbmFtZSB0byBVbmljb2RlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBEbyBub3Qgb3BlbiBhIGRpYWxvZyBib3ggaWYgZmFpbHVyZSAqLworCQlvbGRfZXJyb3JfbW9kZSA9IFNldEVycm9yTW9kZShTRU1fTk9PUEVORklMRUVSUk9SQk9YfFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMpOworCQloID0gQ3JlYXRlRmlsZShmaWxlbmFtZUEsICh3X3JpZ2h0fHJfcmlnaHQpLCAod19yaWdodCk/IDAgOiBGSUxFX1NIQVJFX1JFQUQsCisJCSAgICAgICAgICAgICAgIE5VTEwsIChtdXN0X2V4aXN0fHRydW5jYXRlfGFfbW9kZSksIEZJTEVfQVRUUklCVVRFX05PUk1BTCxOVUxMKTsKKwkJLyogcmVzdG9yZSBvbGQgYmVoYXZpb3VyICovCisJCVNldEVycm9yTW9kZShvbGRfZXJyb3JfbW9kZSk7CisKKwkJU0RMX3N0YWNrX2ZyZWUoZmlsZW5hbWVBKTsKKwkJU0RMX2ZyZWUodXRmMTYpOworCX0KKworCX0KKyNlbmRpZiAvKiBfV0lOMzJfV0NFICovCisKKwlpZiAoaD09SU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJU0RMX2ZyZWUoY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEpOworCQljb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuZGF0YSA9IE5VTEw7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiAlcyIsZmlsZW5hbWUpOworCQlyZXR1cm4gLTI7IC8qIGZhaWxlZCAoQ3JlYXRlRmlsZSkgKi8KKwl9CisJY29udGV4dC0+aGlkZGVuLndpbjMyaW8uaCA9IGg7CisJY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYXBwZW5kID0gYV9tb2RlOworCisJcmV0dXJuIDA7IC8qIG9rICovCit9CitzdGF0aWMgaW50IFNETENBTEwgd2luMzJfZmlsZV9zZWVrKFNETF9SV29wcyAqY29udGV4dCwgaW50IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKwlEV09SRCB3aW4zMndoZW5jZTsKKwlpbnQgICBmaWxlX3BvczsKKwkKKwlpZiAoIWNvbnRleHQgfHwgY29udGV4dC0+aGlkZGVuLndpbjMyaW8uaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlTRExfU2V0RXJyb3IoIndpbjMyX2ZpbGVfc2VlazogaW52YWxpZCBjb250ZXh0L2ZpbGUgbm90IG9wZW5lZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRklYTUU6IFdlIG1heSBiZSBhYmxlIHRvIHNhdGlzZnkgdGhlIHNlZWsgd2l0aGluIGJ1ZmZlcmVkIGRhdGEgKi8KKwlpZiAod2hlbmNlID09IFJXX1NFRUtfQ1VSICYmIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0KSB7CisJCW9mZnNldCAtPSBjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdDsKKyAgICB9CisgICAgY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmxlZnQgPSAwOworCisJc3dpdGNoICh3aGVuY2UpIHsKKwkJY2FzZSBSV19TRUVLX1NFVDoJCQorCQkJd2luMzJ3aGVuY2UgPSBGSUxFX0JFR0lOOyBicmVhazsKKwkJY2FzZSBSV19TRUVLX0NVUjoKKwkJCXdpbjMyd2hlbmNlID0gRklMRV9DVVJSRU5UOyBicmVhazsKKwkJY2FzZSBSV19TRUVLX0VORDoKKwkJCXdpbjMyd2hlbmNlID0gRklMRV9FTkQ7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJU0RMX1NldEVycm9yKCJ3aW4zMl9maWxlX3NlZWs6IFVua25vd24gdmFsdWUgZm9yICd3aGVuY2UnIik7CQkJCisJCQlyZXR1cm4gLTE7CisJfQorCisJZmlsZV9wb3MgPSBTZXRGaWxlUG9pbnRlcihjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oLG9mZnNldCxOVUxMLHdpbjMyd2hlbmNlKTsKKworCWlmICggZmlsZV9wb3MgIT0gSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSICkKKwkJcmV0dXJuIGZpbGVfcG9zOyAvKiBzdWNjZXNzICovCisJCisJU0RMX0Vycm9yKFNETF9FRlNFRUspOworCXJldHVybiAtMTsgLyogZXJyb3IgKi8KK30KK3N0YXRpYyBpbnQgU0RMQ0FMTCB3aW4zMl9maWxlX3JlYWQoU0RMX1JXb3BzICpjb250ZXh0LCB2b2lkICpwdHIsIGludCBzaXplLCBpbnQgbWF4bnVtKQoreworCWludAkJdG90YWxfbmVlZDsgCisJaW50CQl0b3RhbF9yZWFkID0gMDsgCisgICAgaW50ICAgICByZWFkX2FoZWFkOworCURXT1JECWJ5dGVfcmVhZDsKKwkKKwl0b3RhbF9uZWVkID0gc2l6ZSptYXhudW07CisJCisJaWYgKCFjb250ZXh0IHx8IGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgfHwgdG90YWxfbmVlZDw9MCB8fCAhc2l6ZSkgCQorCQlyZXR1cm4gMDsKKworICAgIGlmIChjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdCA+IDApIHsKKyAgICAgICAgdm9pZCAqZGF0YSA9IChjaGFyICopY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuc2l6ZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0OworICAgICAgICByZWFkX2FoZWFkID0gU0RMX21pbih0b3RhbF9uZWVkLCBjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdCk7IAorICAgICAgICBTRExfbWVtY3B5KHB0ciwgZGF0YSwgcmVhZF9haGVhZCk7CisgICAgICAgIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0IC09IHJlYWRfYWhlYWQ7CisKKyAgICAgICAgaWYgKHJlYWRfYWhlYWQgPT0gdG90YWxfbmVlZCkgeworICAgICAgICAgICAgcmV0dXJuIG1heG51bTsKKyAgICAgICAgfQorICAgICAgICBwdHIgPSAoY2hhciAqKXB0ciArIHJlYWRfYWhlYWQ7CisgICAgICAgIHRvdGFsX25lZWQgLT0gcmVhZF9haGVhZDsgICAgICAgCisJCXRvdGFsX3JlYWQgKz0gcmVhZF9haGVhZDsKKyAgICB9CisKKyAgICBpZiAodG90YWxfbmVlZCA8IFJFQURBSEVBRF9CVUZGRVJfU0laRSkgeworICAgICAgICBpZiAoIVJlYWRGaWxlKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmgsY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLmRhdGEsUkVBREFIRUFEX0JVRkZFUl9TSVpFLCZieXRlX3JlYWQsTlVMTCkpIHsKKyAgICAgICAgICAgIFNETF9FcnJvcihTRExfRUZSRUFEKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJlYWRfYWhlYWQgPSBTRExfbWluKHRvdGFsX25lZWQsIChpbnQpYnl0ZV9yZWFkKTsKKyAgICAgICAgU0RMX21lbWNweShwdHIsIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5kYXRhLCByZWFkX2FoZWFkKTsKKyAgICAgICAgY29udGV4dC0+aGlkZGVuLndpbjMyaW8uYnVmZmVyLnNpemUgPSBieXRlX3JlYWQ7CisgICAgICAgIGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0ID0gYnl0ZV9yZWFkLXJlYWRfYWhlYWQ7CisgICAgICAgIHRvdGFsX3JlYWQgKz0gcmVhZF9haGVhZDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIVJlYWRGaWxlKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmgscHRyLHRvdGFsX25lZWQsJmJ5dGVfcmVhZCxOVUxMKSkgeworICAgICAgICAgICAgU0RMX0Vycm9yKFNETF9FRlJFQUQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxfcmVhZCArPSBieXRlX3JlYWQ7CisgICAgfQorCXJldHVybiAodG90YWxfcmVhZC9zaXplKTsKK30KK3N0YXRpYyBpbnQgU0RMQ0FMTCB3aW4zMl9maWxlX3dyaXRlKFNETF9SV29wcyAqY29udGV4dCwgY29uc3Qgdm9pZCAqcHRyLCBpbnQgc2l6ZSwgaW50IG51bSkKK3sKKwkKKwlpbnQJCXRvdGFsX2J5dGVzOyAKKwlEV09SRAlieXRlX3dyaXR0ZW4sbndyaXR0ZW47CisJCisJdG90YWxfYnl0ZXMgPSBzaXplKm51bTsKKworCWlmICghY29udGV4dCB8fCBjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oPT1JTlZBTElEX0hBTkRMRV9WQUxVRSB8fCB0b3RhbF9ieXRlczw9MCB8fCAhc2l6ZSkgCQorCQlyZXR1cm4gMDsKKworCWlmIChjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdCkgeworCQlTZXRGaWxlUG9pbnRlcihjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oLC1jb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIubGVmdCxOVUxMLEZJTEVfQ1VSUkVOVCk7CisJCWNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5sZWZ0ID0gMDsKKwl9CisKKwkvKiBpZiBpbiBhcHBlbmQgbW9kZSwgd2UgbXVzdCBnbyB0byB0aGUgRU9GIGJlZm9yZSB3cml0ZSAqLworCWlmIChjb250ZXh0LT5oaWRkZW4ud2luMzJpby5hcHBlbmQpIHsKKwkJaWYgKCBTZXRGaWxlUG9pbnRlcihjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oLDBMLE5VTEwsRklMRV9FTkQpID09IElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUiApIHsKKwkJCVNETF9FcnJvcihTRExfRUZXUklURSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkKKwlpZiAoIVdyaXRlRmlsZShjb250ZXh0LT5oaWRkZW4ud2luMzJpby5oLHB0cix0b3RhbF9ieXRlcywmYnl0ZV93cml0dGVuLE5VTEwpKSB7CisJCVNETF9FcnJvcihTRExfRUZXUklURSk7CisJCXJldHVybiAwOworCX0KKwkKKwlud3JpdHRlbiA9IGJ5dGVfd3JpdHRlbi9zaXplOworCXJldHVybiBud3JpdHRlbjsKK30KK3N0YXRpYyBpbnQgU0RMQ0FMTCB3aW4zMl9maWxlX2Nsb3NlKFNETF9SV29wcyAqY29udGV4dCkKK3sKKwkKKwlpZiAoIGNvbnRleHQgKSB7CQkJCQkJCQkKKwkJaWYgKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJCUNsb3NlSGFuZGxlKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmgpOworCQkJY29udGV4dC0+aGlkZGVuLndpbjMyaW8uaCA9IElOVkFMSURfSEFORExFX1ZBTFVFOyAvKiB0byBiZSBzdXJlICovCisJCX0KKwkJaWYgKGNvbnRleHQtPmhpZGRlbi53aW4zMmlvLmJ1ZmZlci5kYXRhKSB7CisJCQlTRExfZnJlZShjb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuZGF0YSk7CisJCQljb250ZXh0LT5oaWRkZW4ud2luMzJpby5idWZmZXIuZGF0YSA9IE5VTEw7CisJCX0KKwkJU0RMX0ZyZWVSVyhjb250ZXh0KTsKKwl9CisJcmV0dXJuKDApOworfQorI2VuZGlmIC8qIF9fV0lOMzJfXyAqLworCisjaWZkZWYgSEFWRV9TVERJT19ICisKKy8qIEZ1bmN0aW9ucyB0byByZWFkL3dyaXRlIHN0ZGlvIGZpbGUgcG9pbnRlcnMgKi8KKworc3RhdGljIGludCBTRExDQUxMIHN0ZGlvX3NlZWsoU0RMX1JXb3BzICpjb250ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworCWlmICggZnNlZWsoY29udGV4dC0+aGlkZGVuLnN0ZGlvLmZwLCBvZmZzZXQsIHdoZW5jZSkgPT0gMCApIHsKKwkJcmV0dXJuKGZ0ZWxsKGNvbnRleHQtPmhpZGRlbi5zdGRpby5mcCkpOworCX0gZWxzZSB7CisJCVNETF9FcnJvcihTRExfRUZTRUVLKTsKKwkJcmV0dXJuKC0xKTsKKwl9Cit9CitzdGF0aWMgaW50IFNETENBTEwgc3RkaW9fcmVhZChTRExfUldvcHMgKmNvbnRleHQsIHZvaWQgKnB0ciwgaW50IHNpemUsIGludCBtYXhudW0pCit7CisJc2l6ZV90IG5yZWFkOworCisJbnJlYWQgPSBmcmVhZChwdHIsIHNpemUsIG1heG51bSwgY29udGV4dC0+aGlkZGVuLnN0ZGlvLmZwKTsgCisJaWYgKCBucmVhZCA9PSAwICYmIGZlcnJvcihjb250ZXh0LT5oaWRkZW4uc3RkaW8uZnApICkgeworCQlTRExfRXJyb3IoU0RMX0VGUkVBRCk7CisJfQorCXJldHVybihucmVhZCk7Cit9CitzdGF0aWMgaW50IFNETENBTEwgc3RkaW9fd3JpdGUoU0RMX1JXb3BzICpjb250ZXh0LCBjb25zdCB2b2lkICpwdHIsIGludCBzaXplLCBpbnQgbnVtKQoreworCXNpemVfdCBud3JvdGU7CisKKwlud3JvdGUgPSBmd3JpdGUocHRyLCBzaXplLCBudW0sIGNvbnRleHQtPmhpZGRlbi5zdGRpby5mcCk7CisJaWYgKCBud3JvdGUgPT0gMCAmJiBmZXJyb3IoY29udGV4dC0+aGlkZGVuLnN0ZGlvLmZwKSApIHsKKwkJU0RMX0Vycm9yKFNETF9FRldSSVRFKTsKKwl9CisJcmV0dXJuKG53cm90ZSk7Cit9CitzdGF0aWMgaW50IFNETENBTEwgc3RkaW9fY2xvc2UoU0RMX1JXb3BzICpjb250ZXh0KQoreworCWlmICggY29udGV4dCApIHsKKwkJaWYgKCBjb250ZXh0LT5oaWRkZW4uc3RkaW8uYXV0b2Nsb3NlICkgeworCQkJLyogV0FSTklORzogIENoZWNrIHRoZSByZXR1cm4gdmFsdWUgaGVyZSEgKi8KKwkJCWZjbG9zZShjb250ZXh0LT5oaWRkZW4uc3RkaW8uZnApOworCQl9CisJCVNETF9GcmVlUlcoY29udGV4dCk7CisJfQorCXJldHVybigwKTsKK30KKyNlbmRpZiAvKiAhSEFWRV9TVERJT19IICovCisKKy8qIEZ1bmN0aW9ucyB0byByZWFkL3dyaXRlIG1lbW9yeSBwb2ludGVycyAqLworCitzdGF0aWMgaW50IFNETENBTEwgbWVtX3NlZWsoU0RMX1JXb3BzICpjb250ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworCVVpbnQ4ICpuZXdwb3M7CisKKwlzd2l0Y2ggKHdoZW5jZSkgeworCQljYXNlIFJXX1NFRUtfU0VUOgorCQkJbmV3cG9zID0gY29udGV4dC0+aGlkZGVuLm1lbS5iYXNlK29mZnNldDsKKwkJCWJyZWFrOworCQljYXNlIFJXX1NFRUtfQ1VSOgorCQkJbmV3cG9zID0gY29udGV4dC0+aGlkZGVuLm1lbS5oZXJlK29mZnNldDsKKwkJCWJyZWFrOworCQljYXNlIFJXX1NFRUtfRU5EOgorCQkJbmV3cG9zID0gY29udGV4dC0+aGlkZGVuLm1lbS5zdG9wK29mZnNldDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0RMX1NldEVycm9yKCJVbmtub3duIHZhbHVlIGZvciAnd2hlbmNlJyIpOworCQkJcmV0dXJuKC0xKTsKKwl9CisJaWYgKCBuZXdwb3MgPCBjb250ZXh0LT5oaWRkZW4ubWVtLmJhc2UgKSB7CisJCW5ld3BvcyA9IGNvbnRleHQtPmhpZGRlbi5tZW0uYmFzZTsKKwl9CisJaWYgKCBuZXdwb3MgPiBjb250ZXh0LT5oaWRkZW4ubWVtLnN0b3AgKSB7CisJCW5ld3BvcyA9IGNvbnRleHQtPmhpZGRlbi5tZW0uc3RvcDsKKwl9CisJY29udGV4dC0+aGlkZGVuLm1lbS5oZXJlID0gbmV3cG9zOworCXJldHVybihjb250ZXh0LT5oaWRkZW4ubWVtLmhlcmUtY29udGV4dC0+aGlkZGVuLm1lbS5iYXNlKTsKK30KK3N0YXRpYyBpbnQgU0RMQ0FMTCBtZW1fcmVhZChTRExfUldvcHMgKmNvbnRleHQsIHZvaWQgKnB0ciwgaW50IHNpemUsIGludCBtYXhudW0pCit7CisJc2l6ZV90IHRvdGFsX2J5dGVzOworCXNpemVfdCBtZW1fYXZhaWxhYmxlOworCisJdG90YWxfYnl0ZXMgPSAobWF4bnVtICogc2l6ZSk7CisJaWYgKCAobWF4bnVtIDw9IDApIHx8IChzaXplIDw9IDApIHx8ICgodG90YWxfYnl0ZXMgLyBtYXhudW0pICE9IChzaXplX3QpIHNpemUpICkgeworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1fYXZhaWxhYmxlID0gKGNvbnRleHQtPmhpZGRlbi5tZW0uc3RvcCAtIGNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSk7CisJaWYgKHRvdGFsX2J5dGVzID4gbWVtX2F2YWlsYWJsZSkgeworCQl0b3RhbF9ieXRlcyA9IG1lbV9hdmFpbGFibGU7CisJfQorCisJU0RMX21lbWNweShwdHIsIGNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSwgdG90YWxfYnl0ZXMpOworCWNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSArPSB0b3RhbF9ieXRlczsKKworCXJldHVybiAodG90YWxfYnl0ZXMgLyBzaXplKTsKK30KK3N0YXRpYyBpbnQgU0RMQ0FMTCBtZW1fd3JpdGUoU0RMX1JXb3BzICpjb250ZXh0LCBjb25zdCB2b2lkICpwdHIsIGludCBzaXplLCBpbnQgbnVtKQoreworCWlmICggKGNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSArIChudW0qc2l6ZSkpID4gY29udGV4dC0+aGlkZGVuLm1lbS5zdG9wICkgeworCQludW0gPSAoY29udGV4dC0+aGlkZGVuLm1lbS5zdG9wLWNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSkvc2l6ZTsKKwl9CisJU0RMX21lbWNweShjb250ZXh0LT5oaWRkZW4ubWVtLmhlcmUsIHB0ciwgbnVtKnNpemUpOworCWNvbnRleHQtPmhpZGRlbi5tZW0uaGVyZSArPSBudW0qc2l6ZTsKKwlyZXR1cm4obnVtKTsKK30KK3N0YXRpYyBpbnQgU0RMQ0FMTCBtZW1fd3JpdGVjb25zdChTRExfUldvcHMgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnB0ciwgaW50IHNpemUsIGludCBudW0pCit7CisJU0RMX1NldEVycm9yKCJDYW4ndCB3cml0ZSB0byByZWFkLW9ubHkgbWVtb3J5Iik7CisJcmV0dXJuKC0xKTsKK30KK3N0YXRpYyBpbnQgU0RMQ0FMTCBtZW1fY2xvc2UoU0RMX1JXb3BzICpjb250ZXh0KQoreworCWlmICggY29udGV4dCApIHsKKwkJU0RMX0ZyZWVSVyhjb250ZXh0KTsKKwl9CisJcmV0dXJuKDApOworfQorCisKKy8qIEZ1bmN0aW9ucyB0byBjcmVhdGUgU0RMX1JXb3BzIHN0cnVjdHVyZXMgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcyAqLworCisjaWZkZWYgX19NQUNPU19fCisvKgorICogdHJhbnNsYXRlIHVuaXgtc3R5bGUgc2xhc2gtc2VwYXJhdGVkIGZpbGVuYW1lIHRvIG1hYy1zdHlsZSBjb2xvbi1zZXBhcmF0ZWQKKyAqIG5hbWU7IHJldHVybiBtYWxsb2NlZCBzdHJpbmcKKyAqLworc3RhdGljIGNoYXIgKnVuaXhfdG9fbWFjKGNvbnN0IGNoYXIgKmZpbGUpCit7CisJaW50IGZsZW4gPSBTRExfc3RybGVuKGZpbGUpOworCWNoYXIgKnBhdGggPSBTRExfbWFsbG9jKGZsZW4gKyAyKTsKKwljb25zdCBjaGFyICpzcmMgPSBmaWxlOworCWNoYXIgKmRzdCA9IHBhdGg7CisJaWYoKnNyYyA9PSAnLycpIHsKKwkJLyogcmVhbGx5IGRlcGVuZHMgb24gZmlsZXN5c3RlbSBsYXlvdXQsIGhvcGUgZm9yIHRoZSBiZXN0ICovCisJCXNyYysrOworCX0gZWxzZSB7CisJCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBNYWNPUyBwYXRoIHRvIGJlZ2luIHdpdGggKi8KKwkJaWYoKnNyYyAhPSAnOicpCisJCQkqZHN0KysgPSAnOic7ICAgLyogcmVsYXRpdmUgcGF0aHMgYmVnaW4gd2l0aCAnOicgKi8KKwl9CisJd2hpbGUoc3JjIDwgZmlsZSArIGZsZW4pIHsKKwkJY29uc3QgY2hhciAqZW5kID0gU0RMX3N0cmNocihzcmMsICcvJyk7CisJCWludCBsZW47CisJCWlmKCFlbmQpCisJCQllbmQgPSBmaWxlICsgZmxlbjsgLyogbGFzdCBjb21wb25lbnQgKi8KKwkJbGVuID0gZW5kIC0gc3JjOworCQlpZihsZW4gPT0gMCB8fCAobGVuID09IDEgJiYgc3JjWzBdID09ICcuJykpIHsKKwkJCS8qIHJlbW92ZSByZXBlYXRlZCBzbGFzaGVzIGFuZCAuICovCisJCX0gZWxzZSB7CisJCQlpZihsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJy4nICYmIHNyY1sxXSA9PSAnLicpIHsKKwkJCQkvKiByZXBsYWNlIC4uIHdpdGggdGhlIGVtcHR5IHN0cmluZyAqLworCQkJfSBlbHNlIHsKKwkJCQlTRExfbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworCQkJCWRzdCArPSBsZW47CisJCQl9CisJCQlpZihlbmQgPCBmaWxlICsgZmxlbikKKwkJCQkqZHN0KysgPSAnOic7CisJCX0KKwkJc3JjID0gZW5kICsgMTsKKwl9CisJKmRzdCsrID0gJ1wwJzsKKwlyZXR1cm4gcGF0aDsKK30KKyNlbmRpZiAvKiBfX01BQ09TX18gKi8KKworU0RMX1JXb3BzICpTRExfUldGcm9tRmlsZShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RlKQoreworCVNETF9SV29wcyAqcndvcHMgPSBOVUxMOworI2lmZGVmIEhBVkVfU1RESU9fSAorCUZJTEUgKmZwID0gTlVMTDsKKwkodm9pZCkgZnA7CisjZW5kaWYKKwlpZiAoICFmaWxlIHx8ICEqZmlsZSB8fCAhbW9kZSB8fCAhKm1vZGUgKSB7CisJCVNETF9TZXRFcnJvcigiU0RMX1JXRnJvbUZpbGUoKTogTm8gZmlsZSBvciBubyBtb2RlIHNwZWNpZmllZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKKwlyd29wcyA9IFNETF9BbGxvY1JXKCk7CisJaWYgKCFyd29wcykKKwkJcmV0dXJuIE5VTEw7IC8qIFNETF9TZXRFcnJvciBhbHJlYWR5IHNldHVwIGJ5IFNETF9BbGxvY1JXKCkgKi8KKwlpZiAod2luMzJfZmlsZV9vcGVuKHJ3b3BzLGZpbGUsbW9kZSkgPCAwKSB7CisJCVNETF9GcmVlUlcocndvcHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CQorCXJ3b3BzLT5zZWVrICA9IHdpbjMyX2ZpbGVfc2VlazsKKwlyd29wcy0+cmVhZCAgPSB3aW4zMl9maWxlX3JlYWQ7CisJcndvcHMtPndyaXRlID0gd2luMzJfZmlsZV93cml0ZTsKKwlyd29wcy0+Y2xvc2UgPSB3aW4zMl9maWxlX2Nsb3NlOworCisjZWxpZiBIQVZFX1NURElPX0gKKworI2lmZGVmIF9fTUFDT1NfXworCXsKKwkJY2hhciAqbXBhdGggPSB1bml4X3RvX21hYyhmaWxlKTsKKwkJZnAgPSBmb3BlbihtcGF0aCwgbW9kZSk7CisJCVNETF9mcmVlKG1wYXRoKTsKKwl9CisjZWxzZQorCWZwID0gZm9wZW4oZmlsZSwgbW9kZSk7CisjZW5kaWYKKwlpZiAoIGZwID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiAlcyIsIGZpbGUpOworCX0gZWxzZSB7CisJCXJ3b3BzID0gU0RMX1JXRnJvbUZQKGZwLCAxKTsKKwl9CisjZWxzZQorCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb21waWxlZCB3aXRoIHN0ZGlvIHN1cHBvcnQiKTsKKyNlbmRpZiAvKiAhSEFWRV9TVERJT19IICovCisKKwlyZXR1cm4ocndvcHMpOworfQorCisjaWZkZWYgSEFWRV9TVERJT19ICitTRExfUldvcHMgKlNETF9SV0Zyb21GUChGSUxFICpmcCwgaW50IGF1dG9jbG9zZSkKK3sKKwlTRExfUldvcHMgKnJ3b3BzID0gTlVMTDsKKworCXJ3b3BzID0gU0RMX0FsbG9jUlcoKTsKKwlpZiAoIHJ3b3BzICE9IE5VTEwgKSB7CisJCXJ3b3BzLT5zZWVrID0gc3RkaW9fc2VlazsKKwkJcndvcHMtPnJlYWQgPSBzdGRpb19yZWFkOworCQlyd29wcy0+d3JpdGUgPSBzdGRpb193cml0ZTsKKwkJcndvcHMtPmNsb3NlID0gc3RkaW9fY2xvc2U7CisJCXJ3b3BzLT5oaWRkZW4uc3RkaW8uZnAgPSBmcDsKKwkJcndvcHMtPmhpZGRlbi5zdGRpby5hdXRvY2xvc2UgPSBhdXRvY2xvc2U7CisJfQorCXJldHVybihyd29wcyk7Cit9CisjZW5kaWYgLyogSEFWRV9TVERJT19IICovCisKK1NETF9SV29wcyAqU0RMX1JXRnJvbU1lbSh2b2lkICptZW0sIGludCBzaXplKQoreworCVNETF9SV29wcyAqcndvcHM7CisKKwlyd29wcyA9IFNETF9BbGxvY1JXKCk7CisJaWYgKCByd29wcyAhPSBOVUxMICkgeworCQlyd29wcy0+c2VlayA9IG1lbV9zZWVrOworCQlyd29wcy0+cmVhZCA9IG1lbV9yZWFkOworCQlyd29wcy0+d3JpdGUgPSBtZW1fd3JpdGU7CisJCXJ3b3BzLT5jbG9zZSA9IG1lbV9jbG9zZTsKKwkJcndvcHMtPmhpZGRlbi5tZW0uYmFzZSA9IChVaW50OCAqKW1lbTsKKwkJcndvcHMtPmhpZGRlbi5tZW0uaGVyZSA9IHJ3b3BzLT5oaWRkZW4ubWVtLmJhc2U7CisJCXJ3b3BzLT5oaWRkZW4ubWVtLnN0b3AgPSByd29wcy0+aGlkZGVuLm1lbS5iYXNlK3NpemU7CisJfQorCXJldHVybihyd29wcyk7Cit9CisKK1NETF9SV29wcyAqU0RMX1JXRnJvbUNvbnN0TWVtKGNvbnN0IHZvaWQgKm1lbSwgaW50IHNpemUpCit7CisJU0RMX1JXb3BzICpyd29wczsKKworCXJ3b3BzID0gU0RMX0FsbG9jUlcoKTsKKwlpZiAoIHJ3b3BzICE9IE5VTEwgKSB7CisJCXJ3b3BzLT5zZWVrID0gbWVtX3NlZWs7CisJCXJ3b3BzLT5yZWFkID0gbWVtX3JlYWQ7CisJCXJ3b3BzLT53cml0ZSA9IG1lbV93cml0ZWNvbnN0OworCQlyd29wcy0+Y2xvc2UgPSBtZW1fY2xvc2U7CisJCXJ3b3BzLT5oaWRkZW4ubWVtLmJhc2UgPSAoVWludDggKiltZW07CisJCXJ3b3BzLT5oaWRkZW4ubWVtLmhlcmUgPSByd29wcy0+aGlkZGVuLm1lbS5iYXNlOworCQlyd29wcy0+aGlkZGVuLm1lbS5zdG9wID0gcndvcHMtPmhpZGRlbi5tZW0uYmFzZStzaXplOworCX0KKwlyZXR1cm4ocndvcHMpOworfQorCitTRExfUldvcHMgKlNETF9BbGxvY1JXKHZvaWQpCit7CisJU0RMX1JXb3BzICphcmVhOworCisJYXJlYSA9IChTRExfUldvcHMgKilTRExfbWFsbG9jKHNpemVvZiAqYXJlYSk7CisJaWYgKCBhcmVhID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCX0KKwlyZXR1cm4oYXJlYSk7Cit9CisKK3ZvaWQgU0RMX0ZyZWVSVyhTRExfUldvcHMgKmFyZWEpCit7CisJU0RMX2ZyZWUoYXJlYSk7Cit9CisKKy8qIEZ1bmN0aW9ucyBmb3IgZHluYW1pY2FsbHkgcmVhZGluZyBhbmQgd3JpdGluZyBlbmRpYW4tc3BlY2lmaWMgdmFsdWVzICovCisKK1VpbnQxNiBTRExfUmVhZExFMTYgKFNETF9SV29wcyAqc3JjKQoreworCVVpbnQxNiB2YWx1ZTsKKworCVNETF9SV3JlYWQoc3JjLCAmdmFsdWUsIChzaXplb2YgdmFsdWUpLCAxKTsKKwlyZXR1cm4oU0RMX1N3YXBMRTE2KHZhbHVlKSk7Cit9CitVaW50MTYgU0RMX1JlYWRCRTE2IChTRExfUldvcHMgKnNyYykKK3sKKwlVaW50MTYgdmFsdWU7CisKKwlTRExfUldyZWFkKHNyYywgJnZhbHVlLCAoc2l6ZW9mIHZhbHVlKSwgMSk7CisJcmV0dXJuKFNETF9Td2FwQkUxNih2YWx1ZSkpOworfQorVWludDMyIFNETF9SZWFkTEUzMiAoU0RMX1JXb3BzICpzcmMpCit7CisJVWludDMyIHZhbHVlOworCisJU0RMX1JXcmVhZChzcmMsICZ2YWx1ZSwgKHNpemVvZiB2YWx1ZSksIDEpOworCXJldHVybihTRExfU3dhcExFMzIodmFsdWUpKTsKK30KK1VpbnQzMiBTRExfUmVhZEJFMzIgKFNETF9SV29wcyAqc3JjKQoreworCVVpbnQzMiB2YWx1ZTsKKworCVNETF9SV3JlYWQoc3JjLCAmdmFsdWUsIChzaXplb2YgdmFsdWUpLCAxKTsKKwlyZXR1cm4oU0RMX1N3YXBCRTMyKHZhbHVlKSk7Cit9CitVaW50NjQgU0RMX1JlYWRMRTY0IChTRExfUldvcHMgKnNyYykKK3sKKwlVaW50NjQgdmFsdWU7CisKKwlTRExfUldyZWFkKHNyYywgJnZhbHVlLCAoc2l6ZW9mIHZhbHVlKSwgMSk7CisJcmV0dXJuKFNETF9Td2FwTEU2NCh2YWx1ZSkpOworfQorVWludDY0IFNETF9SZWFkQkU2NCAoU0RMX1JXb3BzICpzcmMpCit7CisJVWludDY0IHZhbHVlOworCisJU0RMX1JXcmVhZChzcmMsICZ2YWx1ZSwgKHNpemVvZiB2YWx1ZSksIDEpOworCXJldHVybihTRExfU3dhcEJFNjQodmFsdWUpKTsKK30KKworaW50IFNETF9Xcml0ZUxFMTYgKFNETF9SV29wcyAqZHN0LCBVaW50MTYgdmFsdWUpCit7CisJdmFsdWUgPSBTRExfU3dhcExFMTYodmFsdWUpOworCXJldHVybihTRExfUld3cml0ZShkc3QsICZ2YWx1ZSwgKHNpemVvZiB2YWx1ZSksIDEpKTsKK30KK2ludCBTRExfV3JpdGVCRTE2IChTRExfUldvcHMgKmRzdCwgVWludDE2IHZhbHVlKQoreworCXZhbHVlID0gU0RMX1N3YXBCRTE2KHZhbHVlKTsKKwlyZXR1cm4oU0RMX1JXd3JpdGUoZHN0LCAmdmFsdWUsIChzaXplb2YgdmFsdWUpLCAxKSk7Cit9CitpbnQgU0RMX1dyaXRlTEUzMiAoU0RMX1JXb3BzICpkc3QsIFVpbnQzMiB2YWx1ZSkKK3sKKwl2YWx1ZSA9IFNETF9Td2FwTEUzMih2YWx1ZSk7CisJcmV0dXJuKFNETF9SV3dyaXRlKGRzdCwgJnZhbHVlLCAoc2l6ZW9mIHZhbHVlKSwgMSkpOworfQoraW50IFNETF9Xcml0ZUJFMzIgKFNETF9SV29wcyAqZHN0LCBVaW50MzIgdmFsdWUpCit7CisJdmFsdWUgPSBTRExfU3dhcEJFMzIodmFsdWUpOworCXJldHVybihTRExfUld3cml0ZShkc3QsICZ2YWx1ZSwgKHNpemVvZiB2YWx1ZSksIDEpKTsKK30KK2ludCBTRExfV3JpdGVMRTY0IChTRExfUldvcHMgKmRzdCwgVWludDY0IHZhbHVlKQoreworCXZhbHVlID0gU0RMX1N3YXBMRTY0KHZhbHVlKTsKKwlyZXR1cm4oU0RMX1JXd3JpdGUoZHN0LCAmdmFsdWUsIChzaXplb2YgdmFsdWUpLCAxKSk7Cit9CitpbnQgU0RMX1dyaXRlQkU2NCAoU0RMX1JXb3BzICpkc3QsIFVpbnQ2NCB2YWx1ZSkKK3sKKwl2YWx1ZSA9IFNETF9Td2FwQkU2NCh2YWx1ZSk7CisJcmV0dXJuKFNETF9SV3dyaXRlKGRzdCwgJnZhbHVlLCAoc2l6ZW9mIHZhbHVlKSwgMSkpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMvQ09QWUlORy5MSUIgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy9DT1BZSU5HLkxJQgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMvQ09QWUlORy5MSUIKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL0NPUFlJTkcuTElCCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy9IZWFkTU1YLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy9IZWFkTU1YLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5ODUwYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL0hlYWRNTVguaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAgIEhlYWRlciBkZWZpbml0aW9ucyBmb3IgdGhlIE1NWCByb3V0aW5lcyBmb3IgdGhlIEhFUk1FUyBsaWJyYXJ5CisgICBDb3B5cmlnaHQgKGMpIDE5OTggQ2hyaXN0aWFuIE5lbnR3aWNoIChjLm5lbnR3aWNoQGNzLnVjbC5hYy51aykKKyAgIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBMR1BMCisgIAorICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgorICAgbGljZW5zaW5nIGNvbmRpdGlvbnMKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9fSEVSTUVTX0hFQURfTU1YX18KKyNkZWZpbmUgX19IRVJNRVNfSEVBRF9NTVhfXworCisKKy8qIElmIHlvdSBjYW5ub3Qgc3RhbmQgaWZkZWZzLCB0aGVuIHBsZWFzZSBkbyBub3QgbG9vayBpbnRvIHRoaXMgZmlsZSwgaXQncworICAgZ29pbmcgdG8gZW5kIHlvdXIgbGlmZSA6KSAqLworCisjaWZkZWYgWDg2X0FTU0VNQkxFUgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBTVEFDS0NBTEwgQ29udmVydE1NWChIZXJtZXNDb252ZXJ0ZXJJbnRlcmZhY2UgKik7CisKK3ZvaWQgU1RBQ0tDQUxMIENsZWFyTU1YXzMyKEhlcm1lc0NsZWFySW50ZXJmYWNlICopOwordm9pZCBTVEFDS0NBTEwgQ2xlYXJNTVhfMjQoSGVybWVzQ2xlYXJJbnRlcmZhY2UgKik7Cit2b2lkIFNUQUNLQ0FMTCBDbGVhck1NWF8xNihIZXJtZXNDbGVhckludGVyZmFjZSAqKTsKK3ZvaWQgU1RBQ0tDQUxMIENsZWFyTU1YXzgoSGVybWVzQ2xlYXJJbnRlcmZhY2UgKik7CisKK3ZvaWQgQ29udmVydE1NWHBJSTMyXzI0UkdCODg4KCk7Cit2b2lkIENvbnZlcnRNTVhwSUkzMl8xNlJHQjU2NSgpOwordm9pZCBDb252ZXJ0TU1YcElJMzJfMTZCR1I1NjUoKTsKK3ZvaWQgQ29udmVydE1NWHBJSTMyXzE2UkdCNTU1KCk7Cit2b2lkIENvbnZlcnRNTVhwSUkzMl8xNkJHUjU2NSgpOwordm9pZCBDb252ZXJ0TU1YcElJMzJfMTZCR1I1NTUoKTsKKwordm9pZCBDb252ZXJ0TU1YcDMyXzE2UkdCNTU1KCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworCisvKiBGaXggdGhlIHVuZGVyc2NvcmUgYnVzaW5lc3Mgd2l0aCBFTEYgY29tcGlsZXJzICovCisKKyNpZiAoZGVmaW5lZChfX0VMRl9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKSkgfHwgZGVmaW5lZChfX1NVTlBST19DKQorICAjaWZkZWYgX19jcGx1c3BsdXMgCisgIGV4dGVybiAiQyIgeyAgIAorICAjZW5kaWYKKworICBleHRlcm4gdm9pZCBfQ29udmVydE1NWChIZXJtZXNDb252ZXJ0ZXJJbnRlcmZhY2UgKik7CisgIGV4dGVybiB2b2lkIF9Db252ZXJ0TU1YcElJMzJfMjRSR0I4ODgoKTsKKyAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRNTVhwSUkzMl8xNlJHQjU2NSgpOworICBleHRlcm4gdm9pZCBfQ29udmVydE1NWHBJSTMyXzE2QkdSNTY1KCk7CisgIGV4dGVybiB2b2lkIF9Db252ZXJ0TU1YcElJMzJfMTZSR0I1NTUoKTsKKyAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRNTVhwSUkzMl8xNkJHUjU1NSgpOworCisgICNkZWZpbmUgQ29udmVydE1NWCBfQ29udmVydE1NWAorICAjZGVmaW5lIENvbnZlcnRNTVhwSUkzMl8yNFJHQjg4OCBfQ29udmVydE1NWHBJSTMyXzI0UkdCODg4CisgICNkZWZpbmUgQ29udmVydE1NWHBJSTMyXzE2UkdCNTY1IF9Db252ZXJ0TU1YcElJMzJfMTZSR0I1NjUKKyAgI2RlZmluZSBDb252ZXJ0TU1YcElJMzJfMTZCR1I1NjUgX0NvbnZlcnRNTVhwSUkzMl8xNkJHUjU2NQorICAjZGVmaW5lIENvbnZlcnRNTVhwSUkzMl8xNlJHQjU1NSBfQ29udmVydE1NWHBJSTMyXzE2UkdCNTU1CisgICNkZWZpbmUgQ29udmVydE1NWHBJSTMyXzE2QkdSNTU1IF9Db252ZXJ0TU1YcElJMzJfMTZCR1I1NTUKKworICAjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorICAjZW5kaWYKKworI2VuZGlmIC8qIEVMRiBhbmQgR05VQyAqLworCisKKworCisvKiBNYWtlIGl0IHdvcmsgd2l0aCBXYXRjb20gKi8KKyNpZmRlZiBfX1dBVENPTUNfXworI3ByYWdtYSB3YXJuaW5nIDYwMSA5CisKKyNwcmFnbWEgYXV4IENvbnZlcnRNTVggIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQorCisjcHJhZ21hIGF1eCBDbGVhck1NWF8zMiAiXyoiIG1vZGlmeSBbRUFYIEVCWCBFQ1ggRURYIEVTSSBFREldCisjcHJhZ21hIGF1eCBDbGVhck1NWF8yNCAiXyoiIG1vZGlmeSBbRUFYIEVCWCBFQ1ggRURYIEVTSSBFREldCisjcHJhZ21hIGF1eCBDbGVhck1NWF8xNiAiXyoiIG1vZGlmeSBbRUFYIEVCWCBFQ1ggRURYIEVTSSBFREldCisjcHJhZ21hIGF1eCBDbGVhck1NWF84ICJfKiIgbW9kaWZ5IFtFQVggRUJYIEVDWCBFRFggRVNJIEVESV0KKworI3ByYWdtYSBhdXggQ29udmVydE1NWHBJSTMyXzI0UkdCODg4ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRNTVhwSUkzMl8xNlJHQjU2NSAiXyoiCisjcHJhZ21hIGF1eCBDb252ZXJ0TU1YcElJMzJfMTZCR1I1NjUgIl8qIgorI3ByYWdtYSBhdXggQ29udmVydE1NWHBJSTMyXzE2UkdCNTU1ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRNTVhwSUkzMl8xNkJHUjU1NSAiXyoiCisjcHJhZ21hIGF1eCBDb252ZXJ0TU1YcDMyXzE2UkdCNTU1ICJfKiIKKworI2VuZGlmIC8qIFdBVENPTSAqLworCisjZW5kaWYgLyogWDg2X0FTU0VNQkxFUiAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9oZXJtZXMvSGVhZFg4Ni5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9oZXJtZXMvSGVhZFg4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNmI2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy9IZWFkWDg2LmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgICBIZWFkZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSB4ODYgcm91dGluZXMgZm9yIHRoZSBIRVJNRVMgbGlicmFyeQorICAgQ29weXJpZ2h0IChjKSAxOTk4IENocmlzdGlhbiBOZW50d2ljaCAoYnJuQGVsZWV0Lm1jYi5hdCkKKyAgIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBMR1BMCisgIAorICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgorICAgbGljZW5zaW5nIGNvbmRpdGlvbnMKKyovCisKKyNpZm5kZWYgX19IRVJNRVNfSEVBRF9YODZfXworI2RlZmluZSBfX0hFUk1FU19IRUFEX1g4Nl9fCisKKworI2lmZGVmIFg4Nl9BU1NFTUJMRVIKKworLyogSWYgeW91IGNhbid0IHN0YW5kIElGREVGUywgdGhlbiBjbG9zZSB5b3VyIGV5ZXMgbm93LCBwbGVhc2UgOikgKi8KKworLyogT2ssIHdlIHN0YXJ0IHdpdGggbm9ybWFsIGZ1bmN0aW9uIGRlZmluaXRpb25zICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwordm9pZCBTVEFDS0NBTEwgQ29udmVydFg4NihIZXJtZXNDb252ZXJ0ZXJJbnRlcmZhY2UgKik7Cit2b2lkIFNUQUNLQ0FMTCBDbGVhclg4Nl8zMihIZXJtZXNDbGVhckludGVyZmFjZSAqKTsKK3ZvaWQgU1RBQ0tDQUxMIENsZWFyWDg2XzI0KEhlcm1lc0NsZWFySW50ZXJmYWNlICopOwordm9pZCBTVEFDS0NBTEwgQ2xlYXJYODZfMTYoSGVybWVzQ2xlYXJJbnRlcmZhY2UgKik7Cit2b2lkIFNUQUNLQ0FMTCBDbGVhclg4Nl84KEhlcm1lc0NsZWFySW50ZXJmYWNlICopOworCitpbnQgU1RBQ0tDQUxMIEhlcm1lc19YODZfQ1BVKCk7CisKK3ZvaWQgQ29udmVydFg4NnAzMl8zMkJHUjg4OCgpOwordm9pZCBDb252ZXJ0WDg2cDMyXzMyUkdCQTg4OCgpOwordm9pZCBDb252ZXJ0WDg2cDMyXzMyQkdSQTg4OCgpOwordm9pZCBDb252ZXJ0WDg2cDMyXzI0UkdCODg4KCk7Cit2b2lkIENvbnZlcnRYODZwMzJfMjRCR1I4ODgoKTsKK3ZvaWQgQ29udmVydFg4NnAzMl8xNlJHQjU2NSgpOwordm9pZCBDb252ZXJ0WDg2cDMyXzE2QkdSNTY1KCk7Cit2b2lkIENvbnZlcnRYODZwMzJfMTZSR0I1NTUoKTsKK3ZvaWQgQ29udmVydFg4NnAzMl8xNkJHUjU1NSgpOwordm9pZCBDb252ZXJ0WDg2cDMyXzhSR0IzMzIoKTsKKwordm9pZCBDb252ZXJ0WDg2cDE2XzMyUkdCODg4KCk7Cit2b2lkIENvbnZlcnRYODZwMTZfMzJCR1I4ODgoKTsKK3ZvaWQgQ29udmVydFg4NnAxNl8zMlJHQkE4ODgoKTsKK3ZvaWQgQ29udmVydFg4NnAxNl8zMkJHUkE4ODgoKTsKK3ZvaWQgQ29udmVydFg4NnAxNl8yNFJHQjg4OCgpOwordm9pZCBDb252ZXJ0WDg2cDE2XzI0QkdSODg4KCk7Cit2b2lkIENvbnZlcnRYODZwMTZfMTZCR1I1NjUoKTsKK3ZvaWQgQ29udmVydFg4NnAxNl8xNlJHQjU1NSgpOwordm9pZCBDb252ZXJ0WDg2cDE2XzE2QkdSNTU1KCk7Cit2b2lkIENvbnZlcnRYODZwMTZfOFJHQjMzMigpOworCit2b2lkIENvcHlYODZwXzRieXRlKCk7Cit2b2lkIENvcHlYODZwXzNieXRlKCk7Cit2b2lkIENvcHlYODZwXzJieXRlKCk7Cit2b2lkIENvcHlYODZwXzFieXRlKCk7CisKK3ZvaWQgQ29udmVydFg4NnBJOF8zMigpOwordm9pZCBDb252ZXJ0WDg2cEk4XzI0KCk7Cit2b2lkIENvbnZlcnRYODZwSThfMTYoKTsKKworZXh0ZXJuIGludCBDb252ZXJ0WDg2cDE2XzMyUkdCODg4X0xVVF9YODZbNTEyXTsKK2V4dGVybiBpbnQgQ29udmVydFg4NnAxNl8zMkJHUjg4OF9MVVRfWDg2WzUxMl07CitleHRlcm4gaW50IENvbnZlcnRYODZwMTZfMzJSR0JBODg4X0xVVF9YODZbNTEyXTsKK2V4dGVybiBpbnQgQ29udmVydFg4NnAxNl8zMkJHUkE4ODhfTFVUX1g4Nls1MTJdOworICAKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworCisKKy8qIE5vdyBmaXggdXAgdGhlIEVMRiB1bmRlcnNjb3JlIHByb2JsZW0gKi8KKworI2lmIChkZWZpbmVkKF9fRUxGX18pICYmIGRlZmluZWQoX19HTlVDX18pKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpCisgICNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyAgI2VuZGlmCisKKyAgZXh0ZXJuIGludCBfSGVybWVzX1g4Nl9DUFUoKTsKKworICBleHRlcm4gdm9pZCBfQ29udmVydFg4NihIZXJtZXNDb252ZXJ0ZXJJbnRlcmZhY2UgKik7CisKKyAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMzJfMzJCR1I4ODgoKTsKKyAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMzJfMzJSR0JBODg4KCk7CisgIGV4dGVybiB2b2lkIF9Db252ZXJ0WDg2cDMyXzMyQkdSQTg4OCgpOworICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8yNFJHQjg4OCgpOworICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8yNEJHUjg4OCgpOworICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8xNlJHQjU2NSgpOworICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8xNkJHUjU2NSgpOworICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8xNlJHQjU1NSgpOworICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl8xNkJHUjU1NSgpOworICBleHRlcm4gdm9pZCBfQ29udmVydFg4NnAzMl84UkdCMzMyKCk7CisKKyAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMTZfMTZCR1I1NjUoKTsKKyAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMTZfMTZSR0I1NTUoKTsKKyAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMTZfMTZCR1I1NTUoKTsKKyAgZXh0ZXJuIHZvaWQgX0NvbnZlcnRYODZwMTZfOFJHQjMzMigpOworCisKKyAgI2RlZmluZSBIZXJtZXNfWDg2X0NQVSBfSGVybWVzX1g4Nl9DUFUKKworICAjZGVmaW5lIENvbnZlcnRYODYgX0NvbnZlcnRYODYKKworICAjZGVmaW5lIENvbnZlcnRYODZwMzJfMzJCR1I4ODggX0NvbnZlcnRYODZwMzJfMzJCR1I4ODgKKyAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzMyUkdCQTg4OCBfQ29udmVydFg4NnAzMl8zMlJHQkE4ODgKKyAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzMyQkdSQTg4OCBfQ29udmVydFg4NnAzMl8zMkJHUkE4ODgKKyAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzI0UkdCODg4IF9Db252ZXJ0WDg2cDMyXzI0UkdCODg4CisgICNkZWZpbmUgQ29udmVydFg4NnAzMl8yNEJHUjg4OCBfQ29udmVydFg4NnAzMl8yNEJHUjg4OAorICAjZGVmaW5lIENvbnZlcnRYODZwMzJfMTZSR0I1NjUgX0NvbnZlcnRYODZwMzJfMTZSR0I1NjUKKyAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzE2QkdSNTY1IF9Db252ZXJ0WDg2cDMyXzE2QkdSNTY1CisgICNkZWZpbmUgQ29udmVydFg4NnAzMl8xNlJHQjU1NSBfQ29udmVydFg4NnAzMl8xNlJHQjU1NQorICAjZGVmaW5lIENvbnZlcnRYODZwMzJfMTZCR1I1NTUgX0NvbnZlcnRYODZwMzJfMTZCR1I1NTUKKyAgI2RlZmluZSBDb252ZXJ0WDg2cDMyXzhSR0IzMzIgX0NvbnZlcnRYODZwMzJfOFJHQjMzMgorCisgICNkZWZpbmUgQ29udmVydFg4NnAxNl8xNkJHUjU2NSBfQ29udmVydFg4NnAxNl8xNkJHUjU2NQorICAjZGVmaW5lIENvbnZlcnRYODZwMTZfMTZSR0I1NTUgX0NvbnZlcnRYODZwMTZfMTZSR0I1NTUKKyAgI2RlZmluZSBDb252ZXJ0WDg2cDE2XzE2QkdSNTU1IF9Db252ZXJ0WDg2cDE2XzE2QkdSNTU1CisgICNkZWZpbmUgQ29udmVydFg4NnAxNl84UkdCMzMyIF9Db252ZXJ0WDg2cDE2XzhSR0IzMzIKKworCisgICNpZmRlZiBfX2NwbHVzcGx1cworICB9CisgICNlbmRpZgorCisjZW5kaWYgLyogRUxGICYgR05VICovCisKKworCisvKiBNYWtlIGl0IHJ1biB3aXRoIFdBVENPTSBDICovCisjaWZkZWYgX19XQVRDT01DX18KKyNwcmFnbWEgd2FybmluZyA2MDEgOQorCisjcHJhZ21hIGF1eCBIZXJtZXNfWDg2X0NQVSAiXyoiCisKKyNwcmFnbWEgYXV4IENvbnZlcnRYODYgIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQorI3ByYWdtYSBhdXggQ2xlYXJYODZfMzIgIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQorI3ByYWdtYSBhdXggQ2xlYXJYODZfMjQgIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQorI3ByYWdtYSBhdXggQ2xlYXJYODZfMTYgIl8qIiBtb2RpZnkgW0VBWCBFQlggRUNYIEVEWCBFU0kgRURJXQorI3ByYWdtYSBhdXggQ2xlYXJYODZfOCAiXyoiIG1vZGlmeSBbRUFYIEVCWCBFQ1ggRURYIEVTSSBFREldCisKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwMzJfMzJCR1I4ODggIl8qIgorI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl8zMlJHQkE4ODggIl8qIgorI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl8zMkJHUkE4ODggIl8qIgorI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl8yNFJHQjg4OCAiXyoiCisjcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDMyXzI0QkdSODg4ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwMzJfMTZSR0I1NjUgIl8qIgorI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl8xNkJHUjU2NSAiXyoiCisjcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDMyXzE2UkdCNTU1ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwMzJfMTZCR1I1NTUgIl8qIgorI3ByYWdtYSBhdXggQ29udmVydFg4NnAzMl84UkdCMzMyICJfKiIKKworI3ByYWdtYSBhdXggQ29udmVydFg4NnAxNl8zMlJHQjg4OCAiXyoiCisjcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDE2XzMyQkdSODg4ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMzJSR0JBODg4ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMzJCR1JBODg4ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMjRSR0I4ODggIl8qIgorI3ByYWdtYSBhdXggQ29udmVydFg4NnAxNl8yNEJHUjg4OCAiXyoiCisjcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDE2XzE2QkdSNTY1ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMTZSR0I1NTUgIl8qIgorI3ByYWdtYSBhdXggQ29udmVydFg4NnAxNl8xNkJHUjU1NSAiXyoiCisjcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDE2XzhSR0IzMzIgIl8qIgorCisjcHJhZ21hIGF1eCBDb3B5WDg2cF80Ynl0ZSAiXyoiCisjcHJhZ21hIGF1eCBDb3B5WDg2cF8zYnl0ZSAiXyoiCisjcHJhZ21hIGF1eCBDb3B5WDg2cF8yYnl0ZSAiXyoiCisjcHJhZ21hIGF1eCBDb3B5WDg2cF8xYnl0ZSAiXyoiCisKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwSThfMzIgIl8qIgorI3ByYWdtYSBhdXggQ29udmVydFg4NnBJOF8yNCAiXyoiCisjcHJhZ21hIGF1eCBDb252ZXJ0WDg2cEk4XzE2ICJfKiIKKworI3ByYWdtYSBhdXggQ29udmVydFg4NnAxNl8zMlJHQjg4OF9MVVRfWDg2ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMzJCR1I4ODhfTFVUX1g4NiAiXyoiCisjcHJhZ21hIGF1eCBDb252ZXJ0WDg2cDE2XzMyUkdCQTg4OF9MVVRfWDg2ICJfKiIKKyNwcmFnbWEgYXV4IENvbnZlcnRYODZwMTZfMzJCR1JBODg4X0xVVF9YODYgIl8qIgorCisjZW5kaWYgLyogX19XQVRDT01DX18gKi8KKworCisjZW5kaWYgLyogWDg2X0FTU0VNQkxFUiAqLworCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvaGVybWVzL1JFQURNRSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL1JFQURNRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9oZXJtZXMvUkVBRE1FCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy9SRUFETUUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvaGVybWVzL2NvbW1vbi5pbmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy9jb21tb24uaW5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL2hlcm1lcy9jb21tb24uaW5jCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy9jb21tb24uaW5jCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy9tbXhfbWFpbi5hc20gYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy9tbXhfbWFpbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwMzJiOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL21teF9tYWluLmFzbQpAQCAtMCwwICsxLDc0IEBACis7Cis7IG1teCBmb3JtYXQgY29udmVydGVyIG1haW4gbG9vcHMgZm9yIEhFUk1FUworOyBTb21lIHJvdXRpbmVzIENvcHlyaWdodCAoYykgMTk5OCBDaHJpc3RpYW4gTmVudHdpY2ggKGMubmVudHdpY2hAY3MudWNsLmFjLnVrKQorOyBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAorOyAKKzsgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgorOyBsaWNlbnNpbmcgY29uZGl0aW9ucwkJCis7CisKK0JJVFMgMzIKKworJWluY2x1ZGUgImNvbW1vbi5pbmMiCisKK1NETF9GVU5DIF9Db252ZXJ0TU1YCisKK1NFQ1RJT04gLnRleHQKKwkJCis7OyBfQ29udmVydE1NWDoJIAorOzsgW0VTUCs4XSBDb252ZXJ0ZXJJbmZvKgorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IENvbnZlcnRlckluZm8gKGVicCsuLikKKzs7ICAgMDoJdm9pZCAqc19waXhlbHMKKzs7ICAgNDoJaW50IHNfd2lkdGgKKzs7ICAgODoJaW50IHNfaGVpZ2h0Cis7OyAgMTI6CWludCBzX2FkZAorOzsgIDE2Ogl2b2lkICpkX3BpeGVscworOzsgIDIwOglpbnQgZF93aWR0aAorOzsgIDI0OglpbnQgZF9oZWlnaHQKKzs7ICAyODoJaW50IGRfYWRkCis7OyAgMzI6CXZvaWQgKCpjb252ZXJ0ZXJfZnVuY3Rpb24pKCkgCis7OyAgMzY6IGludDMyICpsb29rdXAKKwkKK19Db252ZXJ0TU1YOgorCXB1c2ggZWJwCisJbW92IGVicCxlc3AKKworOyBTYXZlIHRoZSByZWdpc3RlcnMgdXNlZCBieSB0aGUgYmxpdHRlcnMsIG5lY2Vzc2FyeSBmb3Igb3B0aW1pemVkIGNvZGUKKwlwdXNoYQorCisJbW92IGVheCxbZWJwKzhdCisKKyAgICAgICAgY21wIGR3b3JkIFtlYXgrNF0sQllURSAwCisJamUgZW5kY29udmVydAorCQorCW1vdiBlYnAsZWF4CisJCisJbW92IGVzaSxbZWJwKzBdCisJbW92IGVkaSxbZWJwKzE2XQorCQoreV9sb29wOgkKKwltb3YgZWN4LFtlYnArNF0KKworCWNhbGwgW2VicCszMl0KKworCWFkZCBlc2ksW2VicCsxMl0KKwlhZGQgZWRpLFtlYnArMjhdCisJCisJZGVjIGR3b3JkICBbZWJwKzhdCisJam56IHlfbG9vcAorCisJCis7IFJlc3RvcmUgdGhlIHJlZ2lzdGVycyB1c2VkIGJ5IHRoZSBibGl0dGVycywgbmVjZXNzYXJ5IGZvciBvcHRpbWl6ZWQgY29kZQorCXBvcGEKKworCXBvcCBlYnAKKworZW5kY29udmVydDoKKwllbW1zCisJCisJcmV0CQkKKworJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjMyCitzZWN0aW9uIC5ub3RlLkdOVS1zdGFjayBub2FsbG9jIG5vZXhlYyBub3dyaXRlIHByb2diaXRzCislZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL21teHAyXzMyLmFzbSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL21teHAyXzMyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGMzMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9oZXJtZXMvbW14cDJfMzIuYXNtCkBAIC0wLDAgKzEsNDA1IEBACis7Cis7IHBJSS1vcHRpbWlzZWQgTU1YIGZvcm1hdCBjb252ZXJ0ZXJzIGZvciBIRVJNRVMKKzsgQ29weXJpZ2h0IChjKSAxOTk4IENocmlzdGlhbiBOZW50d2ljaCAoYy5uZW50d2ljaEBjcy51Y2wuYWMudWspCis7ICAgYW5kIChjKSAxOTk5IEpvbmF0aGFuIE1hdHRoZXcgKGptYXR0aGV3QHVxLm5ldC5hdSkKKzsgVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIExHUEwKKzsgCis7IFBsZWFzZSByZWZlciB0byB0aGUgZmlsZSBDT1BZSU5HLkxJQiBjb250YWluZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IKKzsgbGljZW5zaW5nIGNvbmRpdGlvbnMJCQorOworOyBDT1BZUklHSFQgTk9USUNFCis7IAorOyBUaGlzIGZpbGUgcGFydGx5IGNvbnRhaW5zIGNvZGUgdGhhdCBpcyAoYykgSW50ZWwgQ29ycG9yYXRpb24sIHNwZWNpZmljYWxseQorOyB0aGUgbW9kZSBkZXRlY3Rpb24gcm91dGluZSwgYW5kIHRoZSBjb252ZXJ0ZXIgdG8gMTUgYml0ICg4IHBpeGVsCis7IGNvbnZlcnNpb24gcm91dGluZSBmcm9tIHRoZSBtbXggcHJvZ3JhbW1pbmcgdHV0b3JpYWwgcGFnZXMpLgorOworOworOyBUaGVzZSByb3V0aW5lcyBhcmVuJ3QgZXhhY3RseSBwSUkgb3B0aW1pc2VkIC0gaXQncyBqdXN0IHRoYXQgYXMgdGhleQorOyBhcmUsIHRoZXkncmUgdGVycmlibGUgb24gcDUgTU1YcywgYnV0IGxlc3Mgc28gb24gcElJcy4gIFNvbWVvbmUgbmVlZHMgdG8KKzsgb3B0aW1pc2UgdGhlbSBmb3IgcDUgTU1Ycy4uCisKK0JJVFMgMzIKKworJWluY2x1ZGUgImNvbW1vbi5pbmMiCisJCitTRExfRlVOQyBfQ29udmVydE1NWHBJSTMyXzI0UkdCODg4CitTRExfRlVOQyBfQ29udmVydE1NWHBJSTMyXzE2UkdCNTY1CitTRExfRlVOQyBfQ29udmVydE1NWHBJSTMyXzE2QkdSNTY1CitTRExfRlVOQyBfQ29udmVydE1NWHBJSTMyXzE2UkdCNTU1CitTRExfRlVOQyBfQ29udmVydE1NWHBJSTMyXzE2QkdSNTU1CisKKzs7IE1hY3JvcyBmb3IgY29udmVyc2lvbiByb3V0aW5lcworCislbWFjcm8gX3B1c2hfaW1tcV9tYXNrIDEKKwlwdXNoIGR3b3JkICUxCisJcHVzaCBkd29yZCAlMQorJWVuZG1hY3JvCisKKyVtYWNybyBsb2FkX2ltbXEgMgorCV9wdXNoX2ltbXFfbWFzayAlMgorCW1vdnEgJTEsIFtlc3BdCislZW5kbWFjcm8KKworJW1hY3JvIHBhbmRfaW1tcSAyCisJX3B1c2hfaW1tcV9tYXNrICUyCisJcGFuZCAlMSwgW2VzcF0KKyVlbmRtYWNybworCislZGVmaW5lIENMRUFOVVBfSU1NUV9MT0FEUyhudW0pIFwKKwlhZGQgZXNwLCBieXRlIDggKiBudW0KKworJWRlZmluZSBtbXgzMl9yZ2I4ODhfbWFzayAwMGZmZmZmZmgKKyVkZWZpbmUgbW14MzJfcmdiNTY1X2IgMDAwMDAwZjhoCislZGVmaW5lIG1teDMyX3JnYjU2NV9nIDAwMDBmYzAwaAorJWRlZmluZSBtbXgzMl9yZ2I1NjVfciAwMGY4MDAwMGgKKworJWRlZmluZSBtbXgzMl9yZ2I1NTVfcmIgMDBmODAwZjhoCislZGVmaW5lIG1teDMyX3JnYjU1NV9nIDAwMDBmODAwaAorJWRlZmluZSBtbXgzMl9yZ2I1NTVfbXVsIDIwMDAwMDA4aAorJWRlZmluZSBtbXgzMl9iZ3I1NTVfbXVsIDAwMDgyMDAwaAorCitTRUNUSU9OIC50ZXh0CisKK19Db252ZXJ0TU1YcElJMzJfMjRSR0I4ODg6CisKKyAgICAgICAgOyBzZXQgdXAgbW02IGFzIHRoZSBtYXNrLCBtbTcgYXMgemVybworICAgICAgICBsb2FkX2ltbXEgbW02LCBtbXgzMl9yZ2I4ODhfbWFzaworICAgICAgICBDTEVBTlVQX0lNTVFfTE9BRFMoMSkKKyAgICAgICAgcHhvciBtbTcsIG1tNworCisgICAgICAgIG1vdiBlZHgsIGVjeCAgICAgICAgICAgICAgICAgICAgOyBzYXZlIGVjeAorICAgICAgICBhbmQgZWN4LCAwZmZmZmZmZmNoICAgICAgICAgICAgIDsgY2xlYXIgbG93ZXIgdHdvIGJpdHMKKyAgICAgICAgam56IC5MMQorICAgICAgICBqbXAgLkwyCisKKy5MMToKKworICAgICAgICBtb3ZxIG1tMCwgW2VzaV0gICAgICAgICAgICAgICAgIDsgQSBSIEcgQiBhIHIgZyBiCisgICAgICAgIHBhbmQgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgOyAwIFIgRyBCIDAgciBnIGIKKyAgICAgICAgbW92cSBtbTEsIFtlc2krOF0gICAgICAgICAgICAgICA7IEEgUiBHIEIgYSByIGcgYgorICAgICAgICBwYW5kIG1tMSwgbW02ICAgICAgICAgICAgICAgICAgIDsgMCBSIEcgQiAwIHIgZyBiCisKKyAgICAgICAgbW92cSBtbTIsIG1tMCAgICAgICAgICAgICAgICAgICA7IDAgUiBHIEIgMCByIGcgYgorICAgICAgICBwdW5wY2toZHEgbW0yLCBtbTcgICAgICAgICAgICAgIDsgMCAwIDAgMCAwIFIgRyBCCisgICAgICAgIHB1bnBja2xkcSBtbTAsIG1tNyAgICAgICAgICAgICAgOyAwIDAgMCAwIDAgciBnIGIKKyAgICAgICAgcHNsbHEgbW0yLCAyNCAgICAgICAgICAgICAgICAgICA7IDAgMCBSIEcgQiAwIDAgMAorICAgICAgICBwb3IgbW0wLCBtbTIgICAgICAgICAgICAgICAgICAgIDsgMCAwIFIgRyBCIHIgZyBiCisKKyAgICAgICAgbW92cSBtbTMsIG1tMSAgICAgICAgICAgICAgICAgICA7IDAgUiBHIEIgMCByIGcgYgorICAgICAgICBwc2xscSBtbTMsIDQ4ICAgICAgICAgICAgICAgICAgIDsgZyBiIDAgMCAwIDAgMCAwCisgICAgICAgIHBvciBtbTAsIG1tMyAgICAgICAgICAgICAgICAgICAgOyBnIGIgUiBHIEIgciBnIGIKKworICAgICAgICBtb3ZxIG1tNCwgbW0xICAgICAgICAgICAgICAgICAgIDsgMCBSIEcgQiAwIHIgZyBiCisgICAgICAgIHB1bnBja2hkcSBtbTQsIG1tNyAgICAgICAgICAgICAgOyAwIDAgMCAwIDAgUiBHIEIKKyAgICAgICAgcHVucGNrbGRxIG1tMSwgbW03ICAgICAgICAgICAgICA7IDAgMCAwIDAgMCByIGcgYgorICAgICAgICBwc3JscSBtbTEsIDE2ICAgICAgICAgICAgICAgICAgIDsgMCAwIDAgUiBHIEIgMCByCisgICAgICAgIHBzbGxxIG1tNCwgOCAgICAgICAgICAgICAgICAgICAgOyAwIDAgMCAwIFIgRyBCIDAKKyAgICAgICAgcG9yIG1tMSwgbW00ICAgICAgICAgICAgICAgICAgICA7IDAgMCAwIDAgUiBHIEIgcgorCisgICAgICAgIG1vdnEgW2VkaV0sIG1tMAorICAgICAgICBhZGQgZXNpLCBCWVRFIDE2CisgICAgICAgIG1vdmQgW2VkaSs4XSwgbW0xCisgICAgICAgIGFkZCBlZGksIEJZVEUgMTIKKyAgICAgICAgc3ViIGVjeCwgQllURSA0CisgICAgICAgIGpueiAuTDEKKworLkwyOgorICAgICAgICBtb3YgZWN4LCBlZHgKKyAgICAgICAgYW5kIGVjeCwgQllURSAzCisgICAgICAgIGp6IC5MNAorLkwzOgorICAgICAgICBtb3YgYWwsIFtlc2ldCisgICAgICAgIG1vdiBibCwgW2VzaSsxXQorICAgICAgICBtb3YgZGwsIFtlc2krMl0KKyAgICAgICAgbW92IFtlZGldLCBhbAorICAgICAgICBtb3YgW2VkaSsxXSwgYmwKKyAgICAgICAgbW92IFtlZGkrMl0sIGRsCisgICAgICAgIGFkZCBlc2ksIEJZVEUgNAorICAgICAgICBhZGQgZWRpLCBCWVRFIDMKKyAgICAgICAgZGVjIGVjeAorICAgICAgICBqbnogLkwzCisuTDQ6CisgICAgICAgIHJldG4KKworCisKK19Db252ZXJ0TU1YcElJMzJfMTZSR0I1NjU6CisKKyAgICAgICAgOyBzZXQgdXAgbWFza3MKKyAgICAgICAgbG9hZF9pbW1xIG1tNSwgbW14MzJfcmdiNTY1X2IKKyAgICAgICAgbG9hZF9pbW1xIG1tNiwgbW14MzJfcmdiNTY1X2cKKyAgICAgICAgbG9hZF9pbW1xIG1tNywgbW14MzJfcmdiNTY1X3IKKyAgICAgICAgQ0xFQU5VUF9JTU1RX0xPQURTKDMpCisKKyAgICAgICAgbW92IGVkeCwgZWN4CisgICAgICAgIHNociBlY3gsIDIKKyAgICAgICAgam56IC5MMQorICAgICAgICBqbXAgLkwyICAgICAgICAgOyBub3QgbmVjZXNzYXJ5IGF0IHRoZSBtb21lbnQsIGJ1dCBkb2Vzbid0IGh1cnQgKG11Y2gpCisKKy5MMToKKyAgICAgICAgbW92cSBtbTAsIFtlc2ldICAgICAgICAgOyBhcmdiCisgICAgICAgIG1vdnEgbW0xLCBtbTAgICAgICAgICAgIDsgYXJnYgorICAgICAgICBwYW5kIG1tMCwgbW02ICAgICAgICAgICA7IDAwZzAKKyAgICAgICAgbW92cSBtbTMsIG1tMSAgICAgICAgICAgOyBhcmdiCisgICAgICAgIHBhbmQgbW0xLCBtbTUgICAgICAgICAgIDsgMDAwYgorICAgICAgICBwYW5kIG1tMywgbW03ICAgICAgICAgICA7IDByMDAKKyAgICAgICAgcHNsbGQgbW0xLCAyICAgICAgICAgICAgOyAwIDAgMDAwMDAwYmIgYmJiMDAwMDAKKyAgICAgICAgcG9yIG1tMCwgbW0xICAgICAgICAgICAgOyAwIDAgZ2dnZ2dnYmIgYmJiMDAwMDAKKyAgICAgICAgcHNybGQgbW0wLCA1ICAgICAgICAgICAgOyAwIDAgMDAwMDBnZ2cgZ2dnYmJiYmIKKworICAgICAgICBtb3ZxIG1tNCwgW2VzaSs4XSAgICAgICA7IGFyZ2IKKyAgICAgICAgbW92cSBtbTIsIG1tNCAgICAgICAgICAgOyBhcmdiCisgICAgICAgIHBhbmQgbW00LCBtbTYgICAgICAgICAgIDsgMDBnMAorICAgICAgICBtb3ZxIG1tMSwgbW0yICAgICAgICAgICA7IGFyZ2IKKyAgICAgICAgcGFuZCBtbTIsIG1tNSAgICAgICAgICAgOyAwMDBiCisgICAgICAgIHBhbmQgbW0xLCBtbTcgICAgICAgICAgIDsgMHIwMAorICAgICAgICBwc2xsZCBtbTIsIDIgICAgICAgICAgICA7IDAgMCAwMDAwMDBiYiBiYmIwMDAwMAorICAgICAgICBwb3IgbW00LCBtbTIgICAgICAgICAgICA7IDAgMCBnZ2dnZ2diYiBiYmIwMDAwMAorICAgICAgICBwc3JsZCBtbTQsIDUgICAgICAgICAgICA7IDAgMCAwMDAwMGdnZyBnZ2diYmJiYgorCisgICAgICAgIHBhY2t1c3diIG1tMywgbW0xICAgICAgIDsgUiAwIHIgMAorICAgICAgICBwYWNrc3NkdyBtbTAsIG1tNCAgICAgICA7IGFzIGFib3ZlLi4gaXNoCisgICAgICAgIHBvciBtbTAsIG1tMyAgICAgICAgICAgIDsgZG9uZS4KKyAgICAgICAgbW92cSBbZWRpXSwgbW0wCisKKyAgICAgICAgYWRkIGVzaSwgMTYKKyAgICAgICAgYWRkIGVkaSwgOAorICAgICAgICBkZWMgZWN4CisgICAgICAgIGpueiAuTDEKKworLkwyOgorICAgICAgICBtb3YgZWN4LCBlZHgKKyAgICAgICAgYW5kIGVjeCwgQllURSAzCisgICAgICAgIGp6IC5MNAorLkwzOgorICAgICAgICBtb3YgYWwsIFtlc2ldCisgICAgICAgIG1vdiBiaCwgW2VzaSsxXQorICAgICAgICBtb3YgYWgsIFtlc2krMl0KKyAgICAgICAgc2hyIGFsLCAzCisgICAgICAgIGFuZCBlYXgsIDBGODFGaCAgICAgICAgICAgIDsgQllURT8KKyAgICAgICAgc2hyIGVieCwgNQorICAgICAgICBhbmQgZWJ4LCAwN0UwaCAgICAgICAgICAgICA7IEJZVEU/CisgICAgICAgIGFkZCBlYXgsIGVieAorICAgICAgICBtb3YgW2VkaV0sIGFsCisgICAgICAgIG1vdiBbZWRpKzFdLCBhaAorICAgICAgICBhZGQgZXNpLCBCWVRFIDQKKyAgICAgICAgYWRkIGVkaSwgQllURSAyCisgICAgICAgIGRlYyBlY3gKKyAgICAgICAgam56IC5MMworCisuTDQ6CisJcmV0bgorCisJCitfQ29udmVydE1NWHBJSTMyXzE2QkdSNTY1OgorCisgICAgICAgIGxvYWRfaW1tcSBtbTUsIG1teDMyX3JnYjU2NV9yCisgICAgICAgIGxvYWRfaW1tcSBtbTYsIG1teDMyX3JnYjU2NV9nCisgICAgICAgIGxvYWRfaW1tcSBtbTcsIG1teDMyX3JnYjU2NV9iCisgICAgICAgIENMRUFOVVBfSU1NUV9MT0FEUygzKQorCisgICAgICAgIG1vdiBlZHgsIGVjeAorICAgICAgICBzaHIgZWN4LCAyCisgICAgICAgIGpueiAuTDEKKyAgICAgICAgam1wIC5MMgorCisuTDE6CisgICAgICAgIG1vdnEgbW0wLCBbZXNpXSAgICAgICAgICAgICAgICAgOyBhIHIgZyBiCisgICAgICAgIG1vdnEgbW0xLCBtbTAgICAgICAgICAgICAgICAgICAgOyBhIHIgZyBiCisgICAgICAgIHBhbmQgbW0wLCBtbTYgICAgICAgICAgICAgICAgICAgOyAwIDAgZyAwCisgICAgICAgIG1vdnEgbW0zLCBtbTEgICAgICAgICAgICAgICAgICAgOyBhIHIgZyBiCisgICAgICAgIHBhbmQgbW0xLCBtbTUgICAgICAgICAgICAgICAgICAgOyAwIHIgMCAwCisgICAgICAgIHBhbmQgbW0zLCBtbTcgICAgICAgICAgICAgICAgICAgOyAwIDAgMCBiCisKKyAgICAgICAgcHNsbHEgbW0zLCAxNiAgICAgICAgICAgICAgICAgICA7IDAgYiAwIDAKKyAgICAgICAgcHNybGQgbW0xLCAxNCAgICAgICAgICAgICAgICAgICA7IDAgMCAwMDAwMDByciBycnIwMDAwMAorICAgICAgICBwb3IgbW0wLCBtbTEgICAgICAgICAgICAgICAgICAgIDsgMCAwIGdnZ2dnZ3JyIHJycjAwMDAwCisgICAgICAgIHBzcmxkIG1tMCwgNSAgICAgICAgICAgICAgICAgICAgOyAwIDAgMDAwMDBnZ2cgZ2dncnJycnIKKworICAgICAgICBtb3ZxIG1tNCwgW2VzaSs4XSAgICAgICAgICAgICAgIDsgYSByIGcgYgorICAgICAgICBtb3ZxIG1tMiwgbW00ICAgICAgICAgICAgICAgICAgIDsgYSByIGcgYgorICAgICAgICBwYW5kIG1tNCwgbW02ICAgICAgICAgICAgICAgICAgIDsgMCAwIGcgMAorICAgICAgICBtb3ZxIG1tMSwgbW0yICAgICAgICAgICAgICAgICAgIDsgYSByIGcgYgorICAgICAgICBwYW5kIG1tMiwgbW01ICAgICAgICAgICAgICAgICAgIDsgMCByIDAgMAorICAgICAgICBwYW5kIG1tMSwgbW03ICAgICAgICAgICAgICAgICAgIDsgMCAwIDAgYgorCisgICAgICAgIHBzbGxxIG1tMSwgMTYgICAgICAgICAgICAgICAgICAgOyAwIGIgMCAwCisgICAgICAgIHBzcmxkIG1tMiwgMTQgICAgICAgICAgICAgICAgICAgOyAwIDAgMDAwMDAwcnIgcnJyMDAwMDAKKyAgICAgICAgcG9yIG1tNCwgbW0yICAgICAgICAgICAgICAgICAgICA7IDAgMCBnZ2dnZ2dyciBycnIwMDAwMAorICAgICAgICBwc3JsZCBtbTQsIDUgICAgICAgICAgICAgICAgICAgIDsgMCAwIDAwMDAwZ2dnIGdnZ3JycnJyCisKKyAgICAgICAgcGFja3Vzd2IgbW0zLCBtbTEgICAgICAgICAgICAgICA7IEJCQkJCMDAwIDAwMDAwMDAwIGJiYmJiMDAwIDAwMDAwMDAwCisgICAgICAgIHBhY2tzc2R3IG1tMCwgbW00ICAgICAgICAgICAgICAgOyAwMDAwMEdHRyBHR0dSUlJSUiAwMDAwMEdHRyBHR0dSUlJSUgorICAgICAgICBwb3IgbW0wLCBtbTMgICAgICAgICAgICAgICAgICAgIDsgQkJCQkJHR0cgR0dHUlJSUlIgYmJiYmJnZ2cgZ2dncnJycnIKKyAgICAgICAgbW92cSBbZWRpXSwgbW0wCisKKyAgICAgICAgYWRkIGVzaSwgQllURSAxNgorICAgICAgICBhZGQgZWRpLCBCWVRFIDgKKyAgICAgICAgZGVjIGVjeAorICAgICAgICBqbnogLkwxCisKKy5MMjoKKyAgICAgICAgYW5kIGVkeCwgQllURSAzCisgICAgICAgIGp6IC5MNAorLkwzOgorICAgICAgICBtb3YgYWwsIFtlc2krMl0KKyAgICAgICAgbW92IGJoLCBbZXNpKzFdCisgICAgICAgIG1vdiBhaCwgW2VzaV0KKyAgICAgICAgc2hyIGFsLCAzCisgICAgICAgIGFuZCBlYXgsIDBGODFGaCAgICAgICAgICAgICAgICAgICAgOyBCWVRFID8KKyAgICAgICAgc2hyIGVieCwgNQorICAgICAgICBhbmQgZWJ4LCAwN0UwaCAgICAgICAgICAgICAgICAgICAgIDsgQllURSA/CisgICAgICAgIGFkZCBlYXgsIGVieAorICAgICAgICBtb3YgW2VkaV0sIGFsCisgICAgICAgIG1vdiBbZWRpKzFdLCBhaAorICAgICAgICBhZGQgZXNpLCBCWVRFIDQKKyAgICAgICAgYWRkIGVkaSwgQllURSAyCisgICAgICAgIGRlYyBlZHgKKyAgICAgICAgam56IC5MMworCisuTDQ6CisgICAgICAgIHJldG4KKworX0NvbnZlcnRNTVhwSUkzMl8xNkJHUjU1NToKKworICAgICAgICA7IHRoZSAxNkJHUjU1NSBjb252ZXJ0ZXIgaXMgaWRlbnRpY2FsIHRvIHRoZSBSR0I1NTUgb25lLAorICAgICAgICA7IGV4Y2VwdCBpdCB1c2VzIGEgZGlmZmVyZW50IG11bHRpcGxpZXIgZm9yIHRoZSBwbWFkZHdkCisgICAgICAgIDsgaW5zdHJ1Y3Rpb24uICBjb29sIGh1aC4KKworICAgICAgICBsb2FkX2ltbXEgbW03LCBtbXgzMl9iZ3I1NTVfbXVsCisgICAgICAgIGptcCBfY29udmVydF9iZ3I1NTVfY2hlYXQKKworOyBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBJbnRlbCB2ZXJzaW9uLi4gdGhleSBvYnZpb3VzbHkgd2VudCB0bworOyBtdWNoIG1vcmUgdHJvdWJsZSB0byBleHBhbmQvY29pbCB0aGUgbG9vcCB0aGFuIEkgZGlkLCBzbyB0aGVpcnMKKzsgd291bGQgYWxtb3N0IGNlcnRhaW5seSBiZSBmYXN0ZXIsIGV2ZW4gaWYgb25seSBhIGxpdHRsZS4KKzsgSSBkaWQgcmVuYW1lICdtbXgzMl9yZ2I1NTVfYWRkJyB0byAnbW14MzJfcmdiNTU1X211bCcsIHdoaWNoIGlzCis7IChJIHRoaW5rKSBhIG1vcmUgYWNjdXJhdGUgbmFtZS4uCitfQ29udmVydE1NWHBJSTMyXzE2UkdCNTU1OgorCisJbG9hZF9pbW1xIG1tNywgbW14MzJfcmdiNTU1X211bAorX2NvbnZlcnRfYmdyNTU1X2NoZWF0OgorCWxvYWRfaW1tcSBtbTYsIG1teDMyX3JnYjU1NV9nCisJQ0xFQU5VUF9JTU1RX0xPQURTKDIpCisgICAgICAgIAorCW1vdiBlZHgsZWN4CQkgICAgICAgICAgIDsgU2F2ZSBlY3ggCisKKyAgICAgICAgYW5kIGVjeCxEV09SRCAwZmZmZmZmZjhoICAgICAgICAgICAgOyBjbGVhciBsb3dlciB0aHJlZSBiaXRzCisJam56IC5MX09LCisgICAgICAgIGptcCBuZWFyIC5MMiAKKworLkxfT0s6CisJCisJbW92cSBtbTIsW2VzaSs4XQorCisJbW92cSBtbTAsW2VzaV0KKwltb3ZxIG1tMyxtbTIKKworCXBhbmRfaW1tcSBtbTMsIG1teDMyX3JnYjU1NV9yYgorCW1vdnEgbW0xLG1tMAorCisJcGFuZF9pbW1xIG1tMSwgbW14MzJfcmdiNTU1X3JiCisJcG1hZGR3ZCBtbTMsbW03CisKKwlDTEVBTlVQX0lNTVFfTE9BRFMoMikKKworCXBtYWRkd2QgbW0xLG1tNworCXBhbmQgbW0yLG1tNgorCisuTDE6CisJbW92cSBtbTQsW2VzaSsyNF0KKwlwYW5kIG1tMCxtbTYKKworCW1vdnEgbW01LFtlc2krMTZdCisJcG9yIG1tMyxtbTIKKworCXBzcmxkIG1tMyw2CisJcG9yIG1tMSxtbTAKKworCW1vdnEgbW0wLG1tNAorCXBzcmxkIG1tMSw2CisKKwlwYW5kX2ltbXEgbW0wLCBtbXgzMl9yZ2I1NTVfcmIKKwlwYWNrc3NkdyBtbTEsbW0zCisKKwltb3ZxIG1tMyxtbTUKKwlwbWFkZHdkIG1tMCxtbTcKKworCXBhbmRfaW1tcSBtbTMsIG1teDMyX3JnYjU1NV9yYgorCXBhbmQgbW00LG1tNgorCisJbW92cSBbZWRpXSxtbTEJCQkKKwlwbWFkZHdkIG1tMyxtbTcKKworICAgICAgICBhZGQgZXNpLEJZVEUgMzIKKwlwb3IgbW00LG1tMAorCisJcGFuZCBtbTUsbW02CisJcHNybGQgbW00LDYKKworCW1vdnEgbW0yLFtlc2krOF0KKwlwb3IgbW01LG1tMworCisJbW92cSBtbTAsW2VzaV0KKwlwc3JsZCBtbTUsNgorCisJbW92cSBtbTMsbW0yCisJbW92cSBtbTEsbW0wCisKKwlwYW5kX2ltbXEgbW0zLCBtbXgzMl9yZ2I1NTVfcmIKKwlwYWNrc3NkdyBtbTUsbW00CisKKwlwYW5kX2ltbXEgbW0xLCBtbXgzMl9yZ2I1NTVfcmIKKwlwYW5kIG1tMixtbTYKKworCUNMRUFOVVBfSU1NUV9MT0FEUyg0KQorCisJbW92cSBbZWRpKzhdLG1tNQorCXBtYWRkd2QgbW0zLG1tNworCisJcG1hZGR3ZCBtbTEsbW03CisgICAgICAgIGFkZCBlZGksQllURSAxNgorCQorICAgICAgICBzdWIgZWN4LEJZVEUgOAorCWp6IC5MMgorICAgICAgICBqbXAgLkwxCisKKworLkwyOgkKKwltb3YgZWN4LGVkeAorCQorICAgICAgICBhbmQgZWN4LEJZVEUgNworCWp6IC5MNAorCQorLkwzOgkKKwltb3YgZWJ4LFtlc2ldCisgICAgICAgIGFkZCBlc2ksQllURSA0CisJCisgICAgICAgIG1vdiBlYXgsZWJ4CisgICAgICAgIG1vdiBlZHgsZWJ4CisKKyAgICAgICAgc2hyIGVheCwzCisgICAgICAgIHNociBlZHgsNgorCisgICAgICAgIGFuZCBlYXgsQllURSAwMDAwMDAwMDAwMDExMTExYgorICAgICAgICBhbmQgZWR4LCAgICAgMDAwMDAwMTExMTEwMDAwMGIKKworICAgICAgICBzaHIgZWJ4LDkKKworICAgICAgICBvciBlYXgsZWR4CisKKyAgICAgICAgYW5kIGVieCwgICAgIDAxMTExMTAwMDAwMDAwMDBiCisKKyAgICAgICAgb3IgZWF4LGVieAorCisgICAgICAgIG1vdiBbZWRpXSxheAorICAgICAgICBhZGQgZWRpLEJZVEUgMgorCisJZGVjIGVjeAorCWpueiAuTDMJCisKKy5MNDoJCQorCXJldG4KKworJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjMyCitzZWN0aW9uIC5ub3RlLkdOVS1zdGFjayBub2FsbG9jIG5vZXhlYyBub3dyaXRlIHByb2diaXRzCislZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL3g4Nl9tYWluLmFzbSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL3g4Nl9tYWluLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RkM2RiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9oZXJtZXMveDg2X21haW4uYXNtCkBAIC0wLDAgKzEsNzUgQEAKKzsKKzsgeDg2IGZvcm1hdCBjb252ZXJ0ZXJzIGZvciBIRVJNRVMKKzsgU29tZSByb3V0aW5lcyBDb3B5cmlnaHQgKGMpIDE5OTggQ2hyaXN0aWFuIE5lbnR3aWNoIChicm5AZWxlZXQubWNiLmF0KQorOyBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAorOyAKKzsgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgorOyBsaWNlbnNpbmcgY29uZGl0aW9ucwkJCis7Cis7IE1vc3Qgcm91dGluZXMgYXJlIChjKSBHbGVubiBGaWVkbGVyIChwdGNAZ2FmZmVyLm9yZyksIHVzZWQgd2l0aCBwZXJtaXNzaW9uCis7IAorCitCSVRTIDMyCisKKyVpbmNsdWRlICJjb21tb24uaW5jIgorCitTRExfRlVOQyBfQ29udmVydFg4NgorCitTRUNUSU9OIC50ZXh0CisJCQorOzsgX0NvbnZlcnRYODY6CSAKKzs7IFtFU1ArOF0gQ29udmVydGVySW5mbyoKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBDb252ZXJ0ZXJJbmZvIChlYnArLi4pCis7OyAgIDA6CXZvaWQgKnNfcGl4ZWxzCis7OyAgIDQ6CWludCBzX3dpZHRoCis7OyAgIDg6CWludCBzX2hlaWdodAorOzsgIDEyOglpbnQgc19hZGQKKzs7ICAxNjoJdm9pZCAqZF9waXhlbHMKKzs7ICAyMDoJaW50IGRfd2lkdGgKKzs7ICAyNDoJaW50IGRfaGVpZ2h0Cis7OyAgMjg6CWludCBkX2FkZAorOzsgIDMyOgl2b2lkICgqY29udmVydGVyX2Z1bmN0aW9uKSgpIAorOzsgIDM2OiBpbnQzMiAqbG9va3VwCisJCitfQ29udmVydFg4NjoKKwlwdXNoIGVicAorCW1vdiBlYnAsZXNwCisKKzsgU2F2ZSB0aGUgcmVnaXN0ZXJzIHVzZWQgYnkgdGhlIGJsaXR0ZXJzLCBuZWNlc3NhcnkgZm9yIG9wdGltaXplZCBjb2RlCisJcHVzaGEKKworCW1vdiBlYXgsW2VicCs4XQorCisgICAgICAgIGNtcCBkd29yZCBbZWF4KzRdLEJZVEUgMAorCWplIGVuZGNvbnZlcnQKKwkKKwltb3YgZWJwLGVheAorCQorCW1vdiBlc2ksW2VicCswXQorCW1vdiBlZGksW2VicCsxNl0KKwkKK3lfbG9vcDoJCisJbW92IGVjeCxbZWJwKzRdCisKKwljYWxsIFtlYnArMzJdCisKKwlhZGQgZXNpLFtlYnArMTJdCisJYWRkIGVkaSxbZWJwKzI4XQorCQorCWRlYyBkd29yZCAgW2VicCs4XQorCWpueiB5X2xvb3AKKworOyBSZXN0b3JlIHRoZSByZWdpc3RlcnMgdXNlZCBieSB0aGUgYmxpdHRlcnMsIG5lY2Vzc2FyeSBmb3Igb3B0aW1pemVkIGNvZGUKKwlwb3BhCisJCisJcG9wIGVicAorCitlbmRjb252ZXJ0OgkKKwlyZXQJCQorCisKKworJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZjMyCitzZWN0aW9uIC5ub3RlLkdOVS1zdGFjayBub2FsbG9jIG5vZXhlYyBub3dyaXRlIHByb2diaXRzCislZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL3g4NnBfMTYuYXNtIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9oZXJtZXMveDg2cF8xNi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwMWJjZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL3g4NnBfMTYuYXNtCkBAIC0wLDAgKzEsNDkwIEBACis7Cis7IHg4NiBmb3JtYXQgY29udmVydGVycyBmb3IgSEVSTUVTCis7IENvcHlyaWdodCAoYykgMTk5OCBHbGVubiBGaWVsZGVyIChnYWZmZXJAZ2FmZmVyLm9yZykKKzsgVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIExHUEwKKzsgCis7IFBsZWFzZSByZWZlciB0byB0aGUgZmlsZSBDT1BZSU5HLkxJQiBjb250YWluZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IKKzsgbGljZW5zaW5nIGNvbmRpdGlvbnMJCQorOyAKKzsgUm91dGluZXMgYWRqdXN0ZWQgZm9yIEhlcm1lcyBieSBDaHJpc3RpYW4gTmVudHdpY2ggKGJybkBlbGVldC5tY2IuYXQpCis7IFVzZWQgd2l0aCBwZXJtaXNzaW9uLgorOyAKKworQklUUyAzMgorCislaW5jbHVkZSAiY29tbW9uLmluYyIKKworU0RMX0ZVTkMgX0NvbnZlcnRYODZwMTZfMTZCR1I1NjUKK1NETF9GVU5DIF9Db252ZXJ0WDg2cDE2XzE2UkdCNTU1CitTRExfRlVOQyBfQ29udmVydFg4NnAxNl8xNkJHUjU1NQorU0RMX0ZVTkMgX0NvbnZlcnRYODZwMTZfOFJHQjMzMgorCitFWFRFUk4gX0NvbnZlcnRYODYKKworU0VDVElPTiAudGV4dAorCitfQ29udmVydFg4NnAxNl8xNkJHUjU2NToKKworICAgIDsgY2hlY2sgc2hvcnQKKyAgICBjbXAgZWN4LEJZVEUgMTYKKyAgICBqYSAuTDMKKworCisuTDE6IDsgc2hvcnQgbG9vcAorICAgIG1vdiBhbCxbZXNpXQorICAgIG1vdiBhaCxbZXNpKzFdCisgICAgbW92IGVieCxlYXgKKyAgICBtb3YgZWR4LGVheAorICAgIHNociBlYXgsMTEKKyAgICBhbmQgZWF4LEJZVEUgMTExMTFiCisgICAgYW5kIGVieCwxMTExMTEwMDAwMGIKKyAgICBzaGwgZWR4LDExCisgICAgYWRkIGVheCxlYngKKyAgICBhZGQgZWF4LGVkeAorICAgIG1vdiBbZWRpXSxhbAorICAgIG1vdiBbZWRpKzFdLGFoCisgICAgYWRkIGVzaSxCWVRFIDIKKyAgICBhZGQgZWRpLEJZVEUgMgorICAgIGRlYyBlY3gKKyAgICBqbnogLkwxCisuTDI6CisgICAgcmV0bgorCisuTDM6IDsgaGVhZAorICAgIG1vdiBlYXgsZWRpCisgICAgYW5kIGVheCxCWVRFIDExYgorICAgIGp6IC5MNAorICAgIG1vdiBhbCxbZXNpXQorICAgIG1vdiBhaCxbZXNpKzFdCisgICAgbW92IGVieCxlYXgKKyAgICBtb3YgZWR4LGVheAorICAgIHNociBlYXgsMTEKKyAgICBhbmQgZWF4LEJZVEUgMTExMTFiCisgICAgYW5kIGVieCwxMTExMTEwMDAwMGIKKyAgICBzaGwgZWR4LDExCisgICAgYWRkIGVheCxlYngKKyAgICBhZGQgZWF4LGVkeAorICAgIG1vdiBbZWRpXSxhbAorICAgIG1vdiBbZWRpKzFdLGFoCisgICAgYWRkIGVzaSxCWVRFIDIKKyAgICBhZGQgZWRpLEJZVEUgMgorICAgIGRlYyBlY3gKKworLkw0OiA7IHNhdmUgY291bnQKKyAgICBwdXNoIGVjeAorCisgICAgOyB1bnJvbGwgdHdpY2UKKyAgICBzaHIgZWN4LDEKKyAgICAKKyAgICA7IHBvaW50IGFycmF5cyB0byBlbmQKKyAgICBsZWEgZXNpLFtlc2krZWN4KjRdCisgICAgbGVhIGVkaSxbZWRpK2VjeCo0XQorCisgICAgOyBuZWdhdGl2ZSBjb3VudGVyIAorICAgIG5lZyBlY3gKKyAgICBqbXAgU0hPUlQgLkw2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy5MNTogICAgbW92IFtlZGkrZWN4KjQtNF0sZWF4CisuTDY6ICAgIG1vdiBlYXgsW2VzaStlY3gqNF0KKworICAgICAgICBtb3YgZWJ4LFtlc2krZWN4KjRdCisgICAgICAgIGFuZCBlYXgsMDdFMDA3RTBoICAgICAgICAgCisKKyAgICAgICAgbW92IGVkeCxbZXNpK2VjeCo0XQorICAgICAgICBhbmQgZWJ4LDBGODAwRjgwMGgKKworICAgICAgICBzaHIgZWJ4LDExCisgICAgICAgIGFuZCBlZHgsMDAxRjAwMUZoCisKKyAgICAgICAgc2hsIGVkeCwxMQorICAgICAgICBhZGQgZWF4LGVieAorCisgICAgICAgIGFkZCBlYXgsZWR4ICAgICAgICAgICAgICAgICAKKyAgICAgICAgaW5jIGVjeAorCisgICAgICAgIGpueiAuTDUgICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgbW92IFtlZGkrZWN4KjQtNF0sZWF4CisKKyAgICA7IHRhaWwKKyAgICBwb3AgZWN4CisgICAgYW5kIGVjeCxCWVRFIDEKKyAgICBqeiAuTDcKKyAgICBtb3YgYWwsW2VzaV0KKyAgICBtb3YgYWgsW2VzaSsxXQorICAgIG1vdiBlYngsZWF4CisgICAgbW92IGVkeCxlYXgKKyAgICBzaHIgZWF4LDExCisgICAgYW5kIGVheCxCWVRFIDExMTExYgorICAgIGFuZCBlYngsMTExMTExMDAwMDBiCisgICAgc2hsIGVkeCwxMQorICAgIGFkZCBlYXgsZWJ4CisgICAgYWRkIGVheCxlZHgKKyAgICBtb3YgW2VkaV0sYWwKKyAgICBtb3YgW2VkaSsxXSxhaAorICAgIGFkZCBlc2ksQllURSAyCisgICAgYWRkIGVkaSxCWVRFIDIKKworLkw3OgorICAgIHJldG4KKworCisKKworCisKK19Db252ZXJ0WDg2cDE2XzE2UkdCNTU1OgorCisgICAgOyBjaGVjayBzaG9ydAorICAgIGNtcCBlY3gsQllURSAzMgorICAgIGphIC5MMworCisKKy5MMTogOyBzaG9ydCBsb29wCisgICAgbW92IGFsLFtlc2ldCisgICAgbW92IGFoLFtlc2krMV0KKyAgICBtb3YgZWJ4LGVheAorICAgIHNociBlYngsMQorICAgIGFuZCBlYngsICAgICAwMTExMTExMTExMTAwMDAwYgorICAgIGFuZCBlYXgsQllURSAwMDAwMDAwMDAwMDExMTExYgorICAgIGFkZCBlYXgsZWJ4CisgICAgbW92IFtlZGldLGFsCisgICAgbW92IFtlZGkrMV0sYWgKKyAgICBhZGQgZXNpLEJZVEUgMgorICAgIGFkZCBlZGksQllURSAyCisgICAgZGVjIGVjeAorICAgIGpueiAuTDEKKy5MMjoKKyAgICByZXRuCisKKy5MMzogOyBoZWFkCisgICAgbW92IGVheCxlZGkKKyAgICBhbmQgZWF4LEJZVEUgMTFiCisgICAganogLkw0CisgICAgbW92IGFsLFtlc2ldCisgICAgbW92IGFoLFtlc2krMV0KKyAgICBtb3YgZWJ4LGVheAorICAgIHNociBlYngsMQorICAgIGFuZCBlYngsICAgICAwMTExMTExMTExMTAwMDAwYgorICAgIGFuZCBlYXgsQllURSAwMDAwMDAwMDAwMDExMTExYgorICAgIGFkZCBlYXgsZWJ4CisgICAgbW92IFtlZGldLGFsCisgICAgbW92IFtlZGkrMV0sYWgKKyAgICBhZGQgZXNpLEJZVEUgMgorICAgIGFkZCBlZGksQllURSAyCisgICAgZGVjIGVjeAorCisuTDQ6IDsgc2F2ZSBlYnAKKyAgICBwdXNoIGVicAorCisgICAgOyBzYXZlIGNvdW50CisgICAgcHVzaCBlY3gKKworICAgIDsgdW5yb2xsIGZvdXIgdGltZXMKKyAgICBzaHIgZWN4LDIKKyAgICAKKyAgICA7IHBvaW50IGFycmF5cyB0byBlbmQKKyAgICBsZWEgZXNpLFtlc2krZWN4KjhdCisgICAgbGVhIGVkaSxbZWRpK2VjeCo4XQorCisgICAgOyBuZWdhdGl2ZSBjb3VudGVyIAorICAgIHhvciBlYnAsZWJwCisgICAgc3ViIGVicCxlY3gKKworLkw1OiAgICBtb3YgZWF4LFtlc2krZWJwKjhdICAgICAgICA7IGFnaT8KKyAgICAgICAgbW92IGVjeCxbZXNpK2VicCo4KzRdCisgICAgICAgCisgICAgICAgIG1vdiBlYngsZWF4CisgICAgICAgIG1vdiBlZHgsZWN4CisKKyAgICAgICAgYW5kIGVheCwwRkZDMEZGQzBoCisgICAgICAgIGFuZCBlY3gsMEZGQzBGRkMwaAorCisgICAgICAgIHNociBlYXgsMQorICAgICAgICBhbmQgZWJ4LDAwMUYwMDFGaAorCisgICAgICAgIHNociBlY3gsMQorICAgICAgICBhbmQgZWR4LDAwMUYwMDFGaAorCisgICAgICAgIGFkZCBlYXgsZWJ4CisgICAgICAgIGFkZCBlY3gsZWR4CisKKyAgICAgICAgbW92IFtlZGkrZWJwKjhdLGVheAorICAgICAgICBtb3YgW2VkaStlYnAqOCs0XSxlY3gKKworICAgICAgICBpbmMgZWJwCisgICAgICAgIGpueiAuTDUgICAgICAgICAgICAgICAgIAorCisgICAgOyB0YWlsCisgICAgcG9wIGVjeAorLkw2OiBhbmQgZWN4LEJZVEUgMTFiCisgICAganogLkw3CisgICAgbW92IGFsLFtlc2ldCisgICAgbW92IGFoLFtlc2krMV0KKyAgICBtb3YgZWJ4LGVheAorICAgIHNociBlYngsMQorICAgIGFuZCBlYngsICAgICAwMTExMTExMTExMTAwMDAwYgorICAgIGFuZCBlYXgsQllURSAwMDAwMDAwMDAwMDExMTExYgorICAgIGFkZCBlYXgsZWJ4CisgICAgbW92IFtlZGldLGFsCisgICAgbW92IFtlZGkrMV0sYWgKKyAgICBhZGQgZXNpLEJZVEUgMgorICAgIGFkZCBlZGksQllURSAyCisgICAgZGVjIGVjeAorICAgIGptcCBTSE9SVCAuTDYKKworLkw3OiBwb3AgZWJwCisgICAgcmV0bgorCisKKworCisKKworX0NvbnZlcnRYODZwMTZfMTZCR1I1NTU6CisKKyAgICA7IGNoZWNrIHNob3J0CisgICAgY21wIGVjeCxCWVRFIDE2CisgICAgamEgLkwzCisKKwkKKy5MMTogOyBzaG9ydCBsb29wCisgICAgbW92IGFsLFtlc2ldCisgICAgbW92IGFoLFtlc2krMV0KKyAgICBtb3YgZWJ4LGVheAorICAgIG1vdiBlZHgsZWF4CisgICAgc2hyIGVheCwxMQorICAgIGFuZCBlYXgsQllURSAxMTExMWIKKyAgICBzaHIgZWJ4LDEKKyAgICBhbmQgZWJ4LDExMTExMDAwMDBiCisgICAgc2hsIGVkeCwxMAorICAgIGFuZCBlZHgsMDExMTExMDAwMDAwMDAwMGIKKyAgICBhZGQgZWF4LGVieAorICAgIGFkZCBlYXgsZWR4CisgICAgbW92IFtlZGldLGFsCisgICAgbW92IFtlZGkrMV0sYWgKKyAgICBhZGQgZXNpLEJZVEUgMgorICAgIGFkZCBlZGksQllURSAyCisgICAgZGVjIGVjeAorICAgIGpueiAuTDEKKy5MMjoKKyAgICByZXRuCisKKy5MMzogOyBoZWFkCisgICAgbW92IGVheCxlZGkKKyAgICBhbmQgZWF4LEJZVEUgMTFiCisgICAganogLkw0CisgICAgbW92IGFsLFtlc2ldCisgICAgbW92IGFoLFtlc2krMV0KKyAgICBtb3YgZWJ4LGVheAorICAgIG1vdiBlZHgsZWF4CisgICAgc2hyIGVheCwxMQorICAgIGFuZCBlYXgsQllURSAxMTExMWIKKyAgICBzaHIgZWJ4LDEKKyAgICBhbmQgZWJ4LDExMTExMDAwMDBiCisgICAgc2hsIGVkeCwxMAorICAgIGFuZCBlZHgsMDExMTExMDAwMDAwMDAwMGIKKyAgICBhZGQgZWF4LGVieAorICAgIGFkZCBlYXgsZWR4CisgICAgbW92IFtlZGldLGFsCisgICAgbW92IFtlZGkrMV0sYWgKKyAgICBhZGQgZXNpLEJZVEUgMgorICAgIGFkZCBlZGksQllURSAyCisgICAgZGVjIGVjeAorCisuTDQ6IDsgc2F2ZSBjb3VudAorICAgIHB1c2ggZWN4CisKKyAgICA7IHVucm9sbCB0d2ljZQorICAgIHNociBlY3gsMQorICAgIAorICAgIDsgcG9pbnQgYXJyYXlzIHRvIGVuZAorICAgIGxlYSBlc2ksW2VzaStlY3gqNF0KKyAgICBsZWEgZWRpLFtlZGkrZWN4KjRdCisKKyAgICA7IG5lZ2F0aXZlIGNvdW50ZXIgCisgICAgbmVnIGVjeAorICAgIGptcCBTSE9SVCAuTDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLkw1OiAgICAgbW92IFtlZGkrZWN4KjQtNF0sZWF4CisuTDY6ICAgICBtb3YgZWF4LFtlc2krZWN4KjRdCisKKyAgICAgICAgc2hyIGVheCwxCisgICAgICAgIG1vdiBlYngsW2VzaStlY3gqNF0KKyAgICAgICAgCisgICAgICAgIGFuZCBlYXgsMDNFMDAzRTBoICAgICAgICAgCisgICAgICAgIG1vdiBlZHgsW2VzaStlY3gqNF0KKworICAgICAgICBhbmQgZWJ4LDBGODAwRjgwMGgKKworICAgICAgICBzaHIgZWJ4LDExCisgICAgICAgIGFuZCBlZHgsMDAxRjAwMUZoCisKKyAgICAgICAgc2hsIGVkeCwxMAorICAgICAgICBhZGQgZWF4LGVieAorCisgICAgICAgIGFkZCBlYXgsZWR4ICAgICAgICAgICAgICAgICAKKyAgICAgICAgaW5jIGVjeAorCisgICAgICAgIGpueiAuTDUgICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgbW92IFtlZGkrZWN4KjQtNF0sZWF4CisKKyAgICA7IHRhaWwKKyAgICBwb3AgZWN4CisgICAgYW5kIGVjeCxCWVRFIDEKKyAgICBqeiAuTDcKKyAgICBtb3YgYWwsW2VzaV0KKyAgICBtb3YgYWgsW2VzaSsxXQorICAgIG1vdiBlYngsZWF4CisgICAgbW92IGVkeCxlYXgKKyAgICBzaHIgZWF4LDExCisgICAgYW5kIGVheCxCWVRFIDExMTExYgorICAgIHNociBlYngsMQorICAgIGFuZCBlYngsMTExMTEwMDAwMGIKKyAgICBzaGwgZWR4LDEwCisgICAgYW5kIGVkeCwwMTExMTEwMDAwMDAwMDAwYgorICAgIGFkZCBlYXgsZWJ4CisgICAgYWRkIGVheCxlZHgKKyAgICBtb3YgW2VkaV0sYWwKKyAgICBtb3YgW2VkaSsxXSxhaAorICAgIGFkZCBlc2ksQllURSAyCisgICAgYWRkIGVkaSxCWVRFIDIKKworLkw3OgorICAgIHJldG4KKworCisKKworCisKK19Db252ZXJ0WDg2cDE2XzhSR0IzMzI6CisKKyAgICA7IGNoZWNrIHNob3J0CisgICAgY21wIGVjeCxCWVRFIDE2CisgICAgamEgLkwzCisKKworLkwxOiA7IHNob3J0IGxvb3AKKyAgICBtb3YgYWwsW2VzaSswXQorICAgIG1vdiBhaCxbZXNpKzFdCisgICAgbW92IGVieCxlYXgKKyAgICBtb3YgZWR4LGVheAorICAgIGFuZCBlYXgsQllURSAxMTAwMGIgICAgICAgICA7IGJsdWUKKyAgICBzaHIgZWF4LDMKKyAgICBhbmQgZWJ4LDExMTAwMDAwMDAwYiAgICAgICAgOyBncmVlbgorICAgIHNociBlYngsNgorICAgIGFuZCBlZHgsMTExMDAwMDAwMDAwMDAwMGIgICA7IHJlZAorICAgIHNociBlZHgsOAorICAgIGFkZCBlYXgsZWJ4CisgICAgYWRkIGVheCxlZHgKKyAgICBtb3YgW2VkaV0sYWwKKyAgICBhZGQgZXNpLEJZVEUgMgorICAgIGluYyBlZGkKKyAgICBkZWMgZWN4CisgICAgam56IC5MMQorLkwyOgorICAgIHJldG4KKworLkwzOiBtb3YgZWF4LGVkaQorICAgIGFuZCBlYXgsQllURSAxMWIKKyAgICBqeiAuTDQKKyAgICBtb3YgYWwsW2VzaSswXQorICAgIG1vdiBhaCxbZXNpKzFdCisgICAgbW92IGVieCxlYXgKKyAgICBtb3YgZWR4LGVheAorICAgIGFuZCBlYXgsQllURSAxMTAwMGIgICAgICAgICA7IGJsdWUKKyAgICBzaHIgZWF4LDMKKyAgICBhbmQgZWJ4LDExMTAwMDAwMDAwYiAgICAgICAgOyBncmVlbgorICAgIHNociBlYngsNgorICAgIGFuZCBlZHgsMTExMDAwMDAwMDAwMDAwMGIgICA7IHJlZAorICAgIHNociBlZHgsOAorICAgIGFkZCBlYXgsZWJ4CisgICAgYWRkIGVheCxlZHgKKyAgICBtb3YgW2VkaV0sYWwKKyAgICBhZGQgZXNpLEJZVEUgMgorICAgIGluYyBlZGkKKyAgICBkZWMgZWN4CisgICAgam1wIFNIT1JUIC5MMworCisuTDQ6IDsgc2F2ZSBlYnAKKyAgICBwdXNoIGVicAorCisgICAgOyBzYXZlIGNvdW50CisgICAgcHVzaCBlY3gKKworICAgIDsgdW5yb2xsIDQgdGltZXMKKyAgICBzaHIgZWN4LDIKKworICAgIDsgcHJlc3RlcAorICAgIG1vdiBkbCxbZXNpKzBdCisgICAgbW92IGJsLFtlc2krMV0KKyAgICBtb3YgZGgsW2VzaSsyXQorICAgICAgICAKKy5MNTogICAgIHNobCBlZHgsMTYKKyAgICAgICAgbW92IGJoLFtlc2krM10KKyAgICAgICAgCisgICAgICAgIHNobCBlYngsMTYKKyAgICAgICAgbW92IGRsLFtlc2krNF0KKworICAgICAgICBtb3YgZGgsW2VzaSs2XQorICAgICAgICBtb3YgYmwsW2VzaSs1XQorCisgICAgICAgIGFuZCBlZHgsMDAwMTEwMDAwMDAxMTAwMDAwMDExMDAwMDAwMTEwMDBiCisgICAgICAgIG1vdiBiaCxbZXNpKzddCisKKyAgICAgICAgcm9yIGVkeCwxNiszCisgICAgICAgIG1vdiBlYXgsZWJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc2V0dXAgZWF4IGZvciByZWRzCisKKyAgICAgICAgYW5kIGVieCwwMDAwMDExMTAwMDAwMTExMDAwMDAxMTEwMDAwMDExMWIKKyAgICAgICAgYW5kIGVheCwxMTEwMDAwMDExMTAwMDAwMTExMDAwMDAxMTEwMDAwMGIgICAgICAgOyByZWRzCisKKyAgICAgICAgcm9yIGVieCwxNi0yCisgICAgICAgIGFkZCBlc2ksQllURSA4CisKKyAgICAgICAgcm9yIGVheCwxNgorICAgICAgICBhZGQgZWRpLEJZVEUgNAorCisgICAgICAgIGFkZCBlYXgsZWJ4CisgICAgICAgIG1vdiBibCxbZXNpKzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZ3JlZW5zCisKKyAgICAgICAgYWRkIGVheCxlZHgKKyAgICAgICAgbW92IGRsLFtlc2krMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBibHVlcworCisgICAgICAgIG1vdiBbZWRpLTRdLGVheAorICAgICAgICBtb3YgZGgsW2VzaSsyXQorCisgICAgICAgIGRlYyBlY3gKKyAgICAgICAgam56IC5MNSAgICAgICAgICAgICAgICAgCisgICAgCisgICAgOyBjaGVjayB0YWlsCisgICAgcG9wIGVjeAorICAgIGFuZCBlY3gsQllURSAxMWIKKyAgICBqeiAuTDcKKworLkw2OiA7IHRhaWwKKyAgICBtb3YgYWwsW2VzaSswXQorICAgIG1vdiBhaCxbZXNpKzFdCisgICAgbW92IGVieCxlYXgKKyAgICBtb3YgZWR4LGVheAorICAgIGFuZCBlYXgsQllURSAxMTAwMGIgICAgICAgICA7IGJsdWUKKyAgICBzaHIgZWF4LDMKKyAgICBhbmQgZWJ4LDExMTAwMDAwMDAwYiAgICAgICAgOyBncmVlbgorICAgIHNociBlYngsNgorICAgIGFuZCBlZHgsMTExMDAwMDAwMDAwMDAwMGIgICA7IHJlZAorICAgIHNociBlZHgsOAorICAgIGFkZCBlYXgsZWJ4CisgICAgYWRkIGVheCxlZHgKKyAgICBtb3YgW2VkaV0sYWwKKyAgICBhZGQgZXNpLEJZVEUgMgorICAgIGluYyBlZGkKKyAgICBkZWMgZWN4CisgICAgam56IC5MNgorCisuTDc6IHBvcCBlYnAKKyAgICByZXRuCisKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGYzMgorc2VjdGlvbiAubm90ZS5HTlUtc3RhY2sgbm9hbGxvYyBub2V4ZWMgbm93cml0ZSBwcm9nYml0cworJWVuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy94ODZwXzMyLmFzbSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvaGVybWVzL3g4NnBfMzIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNDc4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2hlcm1lcy94ODZwXzMyLmFzbQpAQCAtMCwwICsxLDEwNDQgQEAKKzsKKzsgeDg2IGZvcm1hdCBjb252ZXJ0ZXJzIGZvciBIRVJNRVMKKzsgU29tZSByb3V0aW5lcyBDb3B5cmlnaHQgKGMpIDE5OTggQ2hyaXN0aWFuIE5lbnR3aWNoIChicm5AZWxlZXQubWNiLmF0KQorOyBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTEdQTAorOyAKKzsgUGxlYXNlIHJlZmVyIHRvIHRoZSBmaWxlIENPUFlJTkcuTElCIGNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvcgorOyBsaWNlbnNpbmcgY29uZGl0aW9ucwkJCis7Cis7IE1vc3Qgcm91dGluZXMgYXJlIChjKSBHbGVubiBGaWVkbGVyIChwdGNAZ2FmZmVyLm9yZyksIHVzZWQgd2l0aCBwZXJtaXNzaW9uCis7IAorCitCSVRTIDMyCisKKyVpbmNsdWRlICJjb21tb24uaW5jIgorCitTRExfRlVOQyBfQ29udmVydFg4NnAzMl8zMkJHUjg4OAorU0RMX0ZVTkMgX0NvbnZlcnRYODZwMzJfMzJSR0JBODg4CitTRExfRlVOQyBfQ29udmVydFg4NnAzMl8zMkJHUkE4ODgKK1NETF9GVU5DIF9Db252ZXJ0WDg2cDMyXzI0UkdCODg4CQorU0RMX0ZVTkMgX0NvbnZlcnRYODZwMzJfMjRCR1I4ODgKK1NETF9GVU5DIF9Db252ZXJ0WDg2cDMyXzE2UkdCNTY1CitTRExfRlVOQyBfQ29udmVydFg4NnAzMl8xNkJHUjU2NQorU0RMX0ZVTkMgX0NvbnZlcnRYODZwMzJfMTZSR0I1NTUKK1NETF9GVU5DIF9Db252ZXJ0WDg2cDMyXzE2QkdSNTU1CitTRExfRlVOQyBfQ29udmVydFg4NnAzMl84UkdCMzMyCisKK1NFQ1RJT04gLnRleHQKKworOzsgX0NvbnZlcnRfKgorOzsgUGFyYW10ZXJzOgkKKzs7ICAgRVNJID0gc291cmNlIAorOzsgICBFREkgPSBkZXN0Cis7OyAgIEVDWCA9IGFtb3VudCAoTk9UIDAhISEgKHRoZSBfQ29udmVydFg4NiByb3V0aW5lIGNoZWNrcyBmb3IgdGhhdCB0aG91Z2gpKQorOzsgRGVzdHJveXM6Cis7OyAgIEVBWCwgRUJYLCBFRFgKKworCitfQ29udmVydFg4NnAzMl8zMkJHUjg4ODoKKworICAgIDsgY2hlY2sgc2hvcnQKKyAgICBjbXAgZWN4LEJZVEUgMzIKKyAgICBqYSAuTDMKKworLkwxOiA7IHNob3J0IGxvb3AKKyAgICBtb3YgZWR4LFtlc2ldCisgICAgYnN3YXAgZWR4CisgICAgcm9yIGVkeCw4CisgICAgbW92IFtlZGldLGVkeAorICAgIGFkZCBlc2ksQllURSA0CisgICAgYWRkIGVkaSxCWVRFIDQKKyAgICBkZWMgZWN4CisgICAgam56IC5MMQorLkwyOgorICAgIHJldG4KKworLkwzOiA7IHNhdmUgZWJwCisgICAgcHVzaCBlYnAKKworICAgIDsgdW5yb2xsIGZvdXIgdGltZXMKKyAgICBtb3YgZWJwLGVjeAorICAgIHNociBlYnAsMgorICAgIAorICAgIDsgc2F2ZSBjb3VudAorICAgIHB1c2ggZWN4CisKKy5MNDogICAgbW92IGVheCxbZXNpXQorICAgICAgICBtb3YgZWJ4LFtlc2krNF0KKworICAgICAgICBic3dhcCBlYXgKKworICAgICAgICBic3dhcCBlYngKKworICAgICAgICByb3IgZWF4LDgKKyAgICAgICAgbW92IGVjeCxbZXNpKzhdCisKKyAgICAgICAgcm9yIGVieCw4CisgICAgICAgIG1vdiBlZHgsW2VzaSsxMl0KKworICAgICAgICBic3dhcCBlY3gKKworICAgICAgICBic3dhcCBlZHgKKworICAgICAgICByb3IgZWN4LDgKKyAgICAgICAgbW92IFtlZGkrMF0sZWF4CisKKyAgICAgICAgcm9yIGVkeCw4CisgICAgICAgIG1vdiBbZWRpKzRdLGVieAorCisgICAgICAgIG1vdiBbZWRpKzhdLGVjeAorICAgICAgICBtb3YgW2VkaSsxMl0sZWR4CisKKyAgICAgICAgYWRkIGVzaSxCWVRFIDE2CisgICAgICAgIGFkZCBlZGksQllURSAxNgorCisgICAgICAgIGRlYyBlYnAKKyAgICAgICAgam56IC5MNCAgICAgICAgICAgICAgICAgCisKKyAgICA7IGNoZWNrIHRhaWwKKyAgICBwb3AgZWN4CisgICAgYW5kIGVjeCxCWVRFIDExYgorICAgIGp6IC5MNgorCisuTDU6IDsgdGFpbCBsb29wCisgICAgbW92IGVkeCxbZXNpXQorICAgIGJzd2FwIGVkeAorICAgIHJvciBlZHgsOAorICAgIG1vdiBbZWRpXSxlZHgKKyAgICBhZGQgZXNpLEJZVEUgNAorICAgIGFkZCBlZGksQllURSA0CisgICAgZGVjIGVjeAorICAgIGpueiAuTDUKKworLkw2OiBwb3AgZWJwCisgICAgcmV0bgorCQorCisJCisJCQorX0NvbnZlcnRYODZwMzJfMzJSR0JBODg4OgorCQorICAgIDsgY2hlY2sgc2hvcnQKKyAgICBjbXAgZWN4LEJZVEUgMzIKKyAgICBqYSAuTDMKKworLkwxOiA7IHNob3J0IGxvb3AKKyAgICBtb3YgZWR4LFtlc2ldCisgICAgcm9sIGVkeCw4CisgICAgbW92IFtlZGldLGVkeAorICAgIGFkZCBlc2ksQllURSA0CisgICAgYWRkIGVkaSxCWVRFIDQKKyAgICBkZWMgZWN4CisgICAgam56IC5MMQorLkwyOgorICAgIHJldG4KKworLkwzOiA7IHNhdmUgZWJwCisgICAgcHVzaCBlYnAKKworICAgIDsgdW5yb2xsIGZvdXIgdGltZXMKKyAgICBtb3YgZWJwLGVjeAorICAgIHNociBlYnAsMgorICAgIAorICAgIDsgc2F2ZSBjb3VudAorICAgIHB1c2ggZWN4CisKKy5MNDogICAgbW92IGVheCxbZXNpXQorICAgICAgICBtb3YgZWJ4LFtlc2krNF0KKworICAgICAgICByb2wgZWF4LDgKKyAgICAgICAgbW92IGVjeCxbZXNpKzhdCisKKyAgICAgICAgcm9sIGVieCw4CisgICAgICAgIG1vdiBlZHgsW2VzaSsxMl0KKworICAgICAgICByb2wgZWN4LDgKKyAgICAgICAgbW92IFtlZGkrMF0sZWF4CisKKyAgICAgICAgcm9sIGVkeCw4CisgICAgICAgIG1vdiBbZWRpKzRdLGVieAorCisgICAgICAgIG1vdiBbZWRpKzhdLGVjeAorICAgICAgICBtb3YgW2VkaSsxMl0sZWR4CisKKyAgICAgICAgYWRkIGVzaSxCWVRFIDE2CisgICAgICAgIGFkZCBlZGksQllURSAxNgorCisgICAgICAgIGRlYyBlYnAKKyAgICAgICAgam56IC5MNCAgICAgICAgICAgICAgICAgCisKKyAgICA7IGNoZWNrIHRhaWwKKyAgICBwb3AgZWN4CisgICAgYW5kIGVjeCxCWVRFIDExYgorICAgIGp6IC5MNgorCisuTDU6IDsgdGFpbCBsb29wCisgICAgbW92IGVkeCxbZXNpXQorICAgIHJvbCBlZHgsOAorICAgIG1vdiBbZWRpXSxlZHgKKyAgICBhZGQgZXNpLEJZVEUgNAorICAgIGFkZCBlZGksQllURSA0CisgICAgZGVjIGVjeAorICAgIGpueiAuTDUKKworLkw2OiBwb3AgZWJwCisgICAgcmV0bgorCisJCisKKworX0NvbnZlcnRYODZwMzJfMzJCR1JBODg4OgorCisgICAgOyBjaGVjayBzaG9ydAorICAgIGNtcCBlY3gsQllURSAzMgorICAgIGphIC5MMworCisuTDE6IDsgc2hvcnQgbG9vcAorICAgIG1vdiBlZHgsW2VzaV0KKyAgICBic3dhcCBlZHgKKyAgICBtb3YgW2VkaV0sZWR4CisgICAgYWRkIGVzaSxCWVRFIDQKKyAgICBhZGQgZWRpLEJZVEUgNAorICAgIGRlYyBlY3gKKyAgICBqbnogLkwxCisuTDI6CisgICAgcmV0bgorCisuTDM6IDsgc2F2ZSBlYnAKKyAgICBwdXNoIGVicAorCisgICAgOyB1bnJvbGwgZm91ciB0aW1lcworICAgIG1vdiBlYnAsZWN4CisgICAgc2hyIGVicCwyCisgICAgCisgICAgOyBzYXZlIGNvdW50CisgICAgcHVzaCBlY3gKKworLkw0OiAgICBtb3YgZWF4LFtlc2ldCisgICAgICAgIG1vdiBlYngsW2VzaSs0XQorCisgICAgICAgIG1vdiBlY3gsW2VzaSs4XQorICAgICAgICBtb3YgZWR4LFtlc2krMTJdCisKKyAgICAgICAgYnN3YXAgZWF4CisKKyAgICAgICAgYnN3YXAgZWJ4CisKKyAgICAgICAgYnN3YXAgZWN4CisKKyAgICAgICAgYnN3YXAgZWR4CisKKyAgICAgICAgbW92IFtlZGkrMF0sZWF4CisgICAgICAgIG1vdiBbZWRpKzRdLGVieAorCisgICAgICAgIG1vdiBbZWRpKzhdLGVjeAorICAgICAgICBtb3YgW2VkaSsxMl0sZWR4CisKKyAgICAgICAgYWRkIGVzaSxCWVRFIDE2CisgICAgICAgIGFkZCBlZGksQllURSAxNgorCisgICAgICAgIGRlYyBlYnAKKyAgICAgICAgam56IC5MNCAgICAgICAgICAgICAgICAgCisKKyAgICA7IGNoZWNrIHRhaWwKKyAgICBwb3AgZWN4CisgICAgYW5kIGVjeCxCWVRFIDExYgorICAgIGp6IC5MNgorCisuTDU6IDsgdGFpbCBsb29wCisgICAgbW92IGVkeCxbZXNpXQorICAgIGJzd2FwIGVkeAorICAgIG1vdiBbZWRpXSxlZHgKKyAgICBhZGQgZXNpLEJZVEUgNAorICAgIGFkZCBlZGksQllURSA0CisgICAgZGVjIGVjeAorICAgIGpueiAuTDUKKworLkw2OiBwb3AgZWJwCisgICAgcmV0bgorCisKKwkKKwkKKzs7IDMyIGJpdCBSR0IgODg4IHRvIDI0IEJJVCBSR0IgODg4CisKK19Db252ZXJ0WDg2cDMyXzI0UkdCODg4OgorCisJOyBjaGVjayBzaG9ydAorCWNtcCBlY3gsQllURSAzMgorCWphIC5MMworCisuTDE6CTsgc2hvcnQgbG9vcAorCW1vdiBhbCxbZXNpXQorCW1vdiBibCxbZXNpKzFdCisJbW92IGRsLFtlc2krMl0KKwltb3YgW2VkaV0sYWwKKwltb3YgW2VkaSsxXSxibAorCW1vdiBbZWRpKzJdLGRsCisJYWRkIGVzaSxCWVRFIDQKKwlhZGQgZWRpLEJZVEUgMworCWRlYyBlY3gKKwlqbnogLkwxCisuTDI6CisJcmV0bgorCisuTDM6CTsJIGhlYWQKKwltb3YgZWR4LGVkaQorCWFuZCBlZHgsQllURSAxMWIKKwlqeiAuTDQKKwltb3YgYWwsW2VzaV0KKwltb3YgYmwsW2VzaSsxXQorCW1vdiBkbCxbZXNpKzJdCisJbW92IFtlZGldLGFsCisJbW92IFtlZGkrMV0sYmwKKwltb3YgW2VkaSsyXSxkbAorCWFkZCBlc2ksQllURSA0CisJYWRkIGVkaSxCWVRFIDMKKwlkZWMgZWN4CisJam1wIFNIT1JUIC5MMworCisuTDQ6IDsgdW5yb2xsIDQgdGltZXMKKwlwdXNoIGVicAorCW1vdiBlYnAsZWN4CisJc2hyIGVicCwyCisKKyAgICA7IHNhdmUgY291bnQKKwlwdXNoIGVjeAorCisuTDU6ICAgIG1vdiBlYXgsW2VzaV0gICAgICAgICAgICAgICAgICAgOyBmaXJzdCBkd29yZCAgICAgICAgICAgIGVheCA9IFtBXVtSXVtHXVtCXQorICAgICAgICBtb3YgZWJ4LFtlc2krNF0gICAgICAgICAgICAgICAgIDsgc2Vjb25kIGR3b3JkICAgICAgICAgICBlYnggPSBbYV1bcl1bZ11bYl0KKworICAgICAgICBzaGwgZWF4LDggICAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICBlYXggPSBbUl1bR11bQl1bLl0KKyAgICAgICAgbW92IGVjeCxbZXNpKzEyXSAgICAgICAgICAgICAgICA7IHRoaXJkIGR3b3JkICAgICAgICAgICAgZWN4ID0gW2FdW3JdW2ddW2JdCisKKyAgICAgICAgc2hsIGVieCw4ICAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWJ4ID0gW3JdW2ddW2JdWy5dCisgICAgICAgIG1vdiBhbCxbZXNpKzRdICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVheCA9IFtSXVtHXVtCXVtiXQorCisgICAgICAgIHJvciBlYXgsOCAgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVheCA9IFtiXVtSXVtHXVtCXSAoZG9uZSkKKyAgICAgICAgbW92IGJoLFtlc2krOCsxXSAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWJ4ID0gW3JdW2ddW0ddWy5dCisKKyAgICAgICAgbW92IFtlZGldLGVheAorICAgICAgICBhZGQgZWRpLEJZVEUgMyo0CisKKyAgICAgICAgc2hsIGVjeCw4ICAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWN4ID0gW3JdW2ddW2JdWy5dCisgICAgICAgIG1vdiBibCxbZXNpKzgrMF0gICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVieCA9IFtyXVtnXVtHXVtCXQorCisgICAgICAgIHJvbCBlYngsMTYgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVieCA9IFtHXVtCXVtyXVtnXSAoZG9uZSkKKyAgICAgICAgbW92IGNsLFtlc2krOCsyXSAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWN4ID0gW3JdW2ddW2JdW1JdIChkb25lKQorCisgICAgICAgIG1vdiBbZWRpKzQtMyo0XSxlYngKKyAgICAgICAgYWRkIGVzaSxCWVRFIDQqNAorICAgICAgICAKKyAgICAgICAgbW92IFtlZGkrOC0zKjRdLGVjeAorICAgICAgICBkZWMgZWJwCisKKyAgICAgICAgam56IC5MNQorCisgICAgOyBjaGVjayB0YWlsCisJcG9wIGVjeAorCWFuZCBlY3gsQllURSAxMWIKKwlqeiAuTDcKKworLkw2OiA7IHRhaWwgbG9vcAorCW1vdiBhbCxbZXNpXQorCW1vdiBibCxbZXNpKzFdCisJbW92IGRsLFtlc2krMl0KKwltb3YgW2VkaV0sYWwKKwltb3YgW2VkaSsxXSxibAorCW1vdiBbZWRpKzJdLGRsCisJYWRkIGVzaSxCWVRFIDQKKwlhZGQgZWRpLEJZVEUgMworCWRlYyBlY3gKKwlqbnogLkw2CisKKy5MNzoJcG9wIGVicAorCXJldG4KKworCisKKworOzsgMzIgYml0IFJHQiA4ODggdG8gMjQgYml0IEJHUiA4ODgKKworX0NvbnZlcnRYODZwMzJfMjRCR1I4ODg6CisKKwk7IGNoZWNrIHNob3J0CisJY21wIGVjeCxCWVRFIDMyCisJamEgLkwzCisKKy5MMToJOyBzaG9ydCBsb29wCisJbW92IGRsLFtlc2ldCisJbW92IGJsLFtlc2krMV0KKwltb3YgYWwsW2VzaSsyXQorCW1vdiBbZWRpXSxhbAorCW1vdiBbZWRpKzFdLGJsCisJbW92IFtlZGkrMl0sZGwKKwlhZGQgZXNpLEJZVEUgNAorCWFkZCBlZGksQllURSAzCisJZGVjIGVjeAorCWpueiAuTDEKKy5MMjoKKwlyZXRuCisKKy5MMzogOyBoZWFkCisJbW92IGVkeCxlZGkKKwlhbmQgZWR4LEJZVEUgMTFiCisJanogLkw0CisJbW92IGRsLFtlc2ldCisJbW92IGJsLFtlc2krMV0KKwltb3YgYWwsW2VzaSsyXQorCW1vdiBbZWRpXSxhbAorCW1vdiBbZWRpKzFdLGJsCisJbW92IFtlZGkrMl0sZGwKKwlhZGQgZXNpLEJZVEUgNAorCWFkZCBlZGksQllURSAzCisJZGVjIGVjeAorCWptcCBTSE9SVCAuTDMKKworLkw0Ogk7IHVucm9sbCA0IHRpbWVzCisJcHVzaCBlYnAKKwltb3YgZWJwLGVjeAorCXNociBlYnAsMgorCisJOyBzYXZlIGNvdW50CisJcHVzaCBlY3gKKworLkw1OgorCW1vdiBlYXgsW2VzaV0gICAgICAgICAgICAgICAgICAgOyBmaXJzdCBkd29yZCAgICAgICAgICAgIGVheCA9IFtBXVtSXVtHXVtCXQorICAgICAgICBtb3YgZWJ4LFtlc2krNF0gICAgICAgICAgICAgICAgIDsgc2Vjb25kIGR3b3JkICAgICAgICAgICBlYnggPSBbYV1bcl1bZ11bYl0KKworICAgICAgICBic3dhcCBlYXggICAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICBlYXggPSBbQl1bR11bUl1bQV0KKworICAgICAgICBic3dhcCBlYnggICAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICBlYnggPSBbYl1bZ11bcl1bYV0KKworICAgICAgICBtb3YgYWwsW2VzaSs0KzJdICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICBlYXggPSBbQl1bR11bUl1bcl0gCisgICAgICAgIG1vdiBiaCxbZXNpKzQrNCsxXSAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVieCA9IFtiXVtnXVtHXVthXQorCisgICAgICAgIHJvciBlYXgsOCAgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVheCA9IFtyXVtCXVtHXVtSXSAoZG9uZSkKKyAgICAgICAgbW92IGJsLFtlc2krNCs0KzJdICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWJ4ID0gW2JdW2ddW0ddW1JdCisKKyAgICAgICAgcm9yIGVieCwxNiAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWJ4ID0gW0ddW1JdW2JdW2ddIChkb25lKQorICAgICAgICBtb3YgW2VkaV0sZWF4CisgICAgCisgICAgICAgIG1vdiBbZWRpKzRdLGVieAorICAgICAgICBtb3YgZWN4LFtlc2krMTJdICAgICAgICAgICAgICAgIDsgdGhpcmQgZHdvcmQgICAgICAgICAgICBlY3ggPSBbYV1bcl1bZ11bYl0KKyAgICAgICAgCisgICAgICAgIGJzd2FwIGVjeCAgICAgICAgICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgIGVjeCA9IFtiXVtnXVtyXVthXQorICAgICAgICAKKyAgICAgICAgbW92IGNsLFtlc2krOF0gICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgZWN4ID0gW2JdW2ddW3JdW0JdIChkb25lKQorICAgICAgICBhZGQgZXNpLEJZVEUgNCo0CisKKyAgICAgICAgbW92IFtlZGkrOF0sZWN4CisgICAgICAgIGFkZCBlZGksQllURSAzKjQKKworICAgICAgICBkZWMgZWJwCisgICAgICAgIGpueiAuTDUKKworCTsgY2hlY2sgdGFpbAorCXBvcCBlY3gKKwlhbmQgZWN4LEJZVEUgMTFiCisJanogLkw3CisKKy5MNjoJOyB0YWlsIGxvb3AKKwltb3YgZGwsW2VzaV0KKwltb3YgYmwsW2VzaSsxXQorCW1vdiBhbCxbZXNpKzJdCisJbW92IFtlZGldLGFsCisJbW92IFtlZGkrMV0sYmwKKwltb3YgW2VkaSsyXSxkbAorCWFkZCBlc2ksQllURSA0CisJYWRkIGVkaSxCWVRFIDMKKwlkZWMgZWN4CisJam56IC5MNgorCisuTDc6CisJcG9wIGVicAorCXJldG4KKyAKKworCQorCQkKKzs7IDMyIGJpdCBSR0IgODg4IHRvIDE2IEJJVCBSR0IgNTY1IAorCitfQ29udmVydFg4NnAzMl8xNlJHQjU2NToKKwk7IGNoZWNrIHNob3J0CisJY21wIGVjeCxCWVRFIDE2CisJamEgLkwzCisKKy5MMTogOyBzaG9ydCBsb29wCisJbW92IGJsLFtlc2krMF0gICAgOyBibHVlCisJbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgorCW1vdiBhaCxbZXNpKzJdICAgIDsgcmVkCisJc2hyIGFoLDMKKyAgICAgICAgYW5kIGFsLDExMTExMTAwYgorCXNobCBlYXgsMworCXNociBibCwzCisJYWRkIGFsLGJsCisJbW92IFtlZGkrMF0sYWwKKwltb3YgW2VkaSsxXSxhaAorCWFkZCBlc2ksQllURSA0CisJYWRkIGVkaSxCWVRFIDIKKwlkZWMgZWN4CisJam56IC5MMQorCisuTDI6CQkJCTsgRW5kIG9mIHNob3J0IGxvb3AKKwlyZXRuCisKKwkKKy5MMzoJOyBoZWFkCisJbW92IGVieCxlZGkKKwlhbmQgZWJ4LEJZVEUgMTFiCisJanogLkw0CisJCisJbW92IGJsLFtlc2krMF0gICAgOyBibHVlCisJbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgorCW1vdiBhaCxbZXNpKzJdICAgIDsgcmVkCisJc2hyIGFoLDMKKwlhbmQgYWwsMTExMTExMDBiCisJc2hsIGVheCwzCisJc2hyIGJsLDMKKwlhZGQgYWwsYmwKKwltb3YgW2VkaSswXSxhbAorCW1vdiBbZWRpKzFdLGFoCisJYWRkIGVzaSxCWVRFIDQKKwlhZGQgZWRpLEJZVEUgMgorCWRlYyBlY3gKKworLkw0OgkgCisgICAgOyBzYXZlIGNvdW50CisJcHVzaCBlY3gKKworICAgIDsgdW5yb2xsIHR3aWNlCisJc2hyIGVjeCwxCisgICAgCisgICAgOyBwb2ludCBhcnJheXMgdG8gZW5kCisJbGVhIGVzaSxbZXNpK2VjeCo4XQorCWxlYSBlZGksW2VkaStlY3gqNF0KKworICAgIDsgbmVnYXRpdmUgY291bnRlciAKKwluZWcgZWN4CisJam1wIFNIT1JUIC5MNgorCisuTDU6CSAgICAKKwltb3YgW2VkaStlY3gqNC00XSxlYXgKKy5MNjoJCisJbW92IGVheCxbZXNpK2VjeCo4XQorCisgICAgICAgIHNociBhaCwyCisgICAgICAgIG1vdiBlYngsW2VzaStlY3gqOCs0XQorCisgICAgICAgIHNociBlYXgsMworICAgICAgICBtb3YgZWR4LFtlc2krZWN4KjgrNF0KKworICAgICAgICBzaHIgYmgsMgorICAgICAgICBtb3YgZGwsW2VzaStlY3gqOCsyXQorCisgICAgICAgIHNobCBlYngsMTMKKyAgICAgICAgYW5kIGVheCwwMDAwMDdGRmgKKyAgICAgICAgCisgICAgICAgIHNobCBlZHgsOAorICAgICAgICBhbmQgZWJ4LDA3RkYwMDAwaAorCisgICAgICAgIGFuZCBlZHgsMEY4MDBGODAwaAorICAgICAgICBhZGQgZWF4LGVieAorCisgICAgICAgIGFkZCBlYXgsZWR4CisgICAgICAgIGluYyBlY3gKKworICAgICAgICBqbnogLkw1ICAgICAgICAgICAgICAgICAKKworCW1vdiBbZWRpK2VjeCo0LTRdLGVheAorCisgICAgOyB0YWlsCisJcG9wIGVjeAorCXRlc3QgY2wsMQorCWp6IC5MNworCQorCW1vdiBibCxbZXNpKzBdICAgIDsgYmx1ZQorCW1vdiBhbCxbZXNpKzFdICAgIDsgZ3JlZW4KKwltb3YgYWgsW2VzaSsyXSAgICA7IHJlZAorCXNociBhaCwzCisJYW5kIGFsLDExMTExMTAwYgorCXNobCBlYXgsMworCXNociBibCwzCisJYWRkIGFsLGJsCisJbW92IFtlZGkrMF0sYWwKKwltb3YgW2VkaSsxXSxhaAorCWFkZCBlc2ksQllURSA0CisJYWRkIGVkaSxCWVRFIDIKKworLkw3OgkKKwlyZXRuCisKKworCisJCis7OyAzMiBiaXQgUkdCIDg4OCB0byAxNiBCSVQgQkdSIDU2NSAKKworX0NvbnZlcnRYODZwMzJfMTZCR1I1NjU6CisJCisJOyBjaGVjayBzaG9ydAorCWNtcCBlY3gsQllURSAxNgorCWphIC5MMworCisuTDE6CTsgc2hvcnQgbG9vcAorCW1vdiBhaCxbZXNpKzBdICAgIDsgYmx1ZQorCW1vdiBhbCxbZXNpKzFdICAgIDsgZ3JlZW4KKwltb3YgYmwsW2VzaSsyXSAgICA7IHJlZAorCXNociBhaCwzCisJYW5kIGFsLDExMTExMTAwYgorCXNobCBlYXgsMworCXNociBibCwzCisJYWRkIGFsLGJsCisJbW92IFtlZGkrMF0sYWwKKwltb3YgW2VkaSsxXSxhaAorCWFkZCBlc2ksQllURSA0CisJYWRkIGVkaSxCWVRFIDIKKwlkZWMgZWN4CisJam56IC5MMQorLkwyOgorCXJldG4KKworLkwzOgk7IGhlYWQKKwltb3YgZWJ4LGVkaQorCWFuZCBlYngsQllURSAxMWIKKwlqeiAuTDQgICAKKwltb3YgYWgsW2VzaSswXSAgICA7IGJsdWUKKwltb3YgYWwsW2VzaSsxXSAgICA7IGdyZWVuCisJbW92IGJsLFtlc2krMl0gICAgOyByZWQKKwlzaHIgYWgsMworCWFuZCBhbCwxMTExMTEwMGIKKwlzaGwgZWF4LDMKKwlzaHIgYmwsMworCWFkZCBhbCxibAorCW1vdiBbZWRpKzBdLGFsCisJbW92IFtlZGkrMV0sYWgKKwlhZGQgZXNpLEJZVEUgNAorCWFkZCBlZGksQllURSAyCisJZGVjIGVjeAorCisuTDQ6CTsgc2F2ZSBjb3VudAorCXB1c2ggZWN4CisKKwk7IHVucm9sbCB0d2ljZQorCXNociBlY3gsMQorICAgIAorCTsgcG9pbnQgYXJyYXlzIHRvIGVuZAorCWxlYSBlc2ksW2VzaStlY3gqOF0KKwlsZWEgZWRpLFtlZGkrZWN4KjRdCisKKwk7IG5lZ2F0aXZlIGNvdW50CisJbmVnIGVjeAorCWptcCBTSE9SVCAuTDYKKworLkw1OgorCW1vdiBbZWRpK2VjeCo0LTRdLGVheCAgICAgICAgICAgIAorLkw2OgorCW1vdiBlZHgsW2VzaStlY3gqOCs0XQorCisgICAgICAgIG1vdiBiaCxbZXNpK2VjeCo4KzRdICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgbW92IGFoLFtlc2krZWN4KjhdICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBzaHIgYmgsMworICAgICAgICBtb3YgYWwsW2VzaStlY3gqOCsxXSAgICAgICAgICAgICAKKworICAgICAgICBzaHIgYWgsMworICAgICAgICBtb3YgYmwsW2VzaStlY3gqOCs1XSAgICAgICAgICAgCisKKyAgICAgICAgc2hsIGVheCwzCisgICAgICAgIG1vdiBkbCxbZXNpK2VjeCo4KzJdCisKKyAgICAgICAgc2hsIGVieCwxOQorICAgICAgICBhbmQgZWF4LDAwMDBGRkUwaCAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIHNociBlZHgsMworICAgICAgICBhbmQgZWJ4LDBGRkUwMDAwMGggICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBhbmQgZWR4LDAwMUYwMDFGaCAgICAgICAgICAgICAgIAorICAgICAgICBhZGQgZWF4LGVieAorCisgICAgICAgIGFkZCBlYXgsZWR4CisgICAgICAgIGluYyBlY3gKKworICAgICAgICBqbnogLkw1ICAgICAgICAgICAgICAgICAKKworCW1vdiBbZWRpK2VjeCo0LTRdLGVheCAgICAgICAgICAgIAorCisJOyB0YWlsCisJcG9wIGVjeAorCWFuZCBlY3gsQllURSAxCisJanogLkw3CisJbW92IGFoLFtlc2krMF0gICAgOyBibHVlCisJbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgorCW1vdiBibCxbZXNpKzJdICAgIDsgcmVkCisJc2hyIGFoLDMKKwlhbmQgYWwsMTExMTExMDBiCisJc2hsIGVheCwzCisJc2hyIGJsLDMKKwlhZGQgYWwsYmwKKwltb3YgW2VkaSswXSxhbAorCW1vdiBbZWRpKzFdLGFoCisJYWRkIGVzaSxCWVRFIDQKKwlhZGQgZWRpLEJZVEUgMgorCisuTDc6CisJcmV0bgorCisKKwkKKwkKKzs7IDMyIEJJVCBSR0IgVE8gMTYgQklUIFJHQiA1NTUKKworX0NvbnZlcnRYODZwMzJfMTZSR0I1NTU6CisKKwk7IGNoZWNrIHNob3J0CisJY21wIGVjeCxCWVRFIDE2CisJamEgLkwzCisKKy5MMToJOyBzaG9ydCBsb29wCisJbW92IGJsLFtlc2krMF0gICAgOyBibHVlCisJbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgorCW1vdiBhaCxbZXNpKzJdICAgIDsgcmVkCisJc2hyIGFoLDMKKwlhbmQgYWwsMTExMTEwMDBiCisJc2hsIGVheCwyCisJc2hyIGJsLDMKKwlhZGQgYWwsYmwKKwltb3YgW2VkaSswXSxhbAorCW1vdiBbZWRpKzFdLGFoCisJYWRkIGVzaSxCWVRFIDQKKwlhZGQgZWRpLEJZVEUgMgorCWRlYyBlY3gKKwlqbnogLkwxCisuTDI6CisJcmV0bgorCisuTDM6CTsgaGVhZAorCW1vdiBlYngsZWRpCisgICAgICAgIGFuZCBlYngsQllURSAxMWIKKwlqeiAuTDQgICAKKwltb3YgYmwsW2VzaSswXSAgICA7IGJsdWUKKwltb3YgYWwsW2VzaSsxXSAgICA7IGdyZWVuCisJbW92IGFoLFtlc2krMl0gICAgOyByZWQKKwlzaHIgYWgsMworCWFuZCBhbCwxMTExMTAwMGIKKwlzaGwgZWF4LDIKKwlzaHIgYmwsMworCWFkZCBhbCxibAorCW1vdiBbZWRpKzBdLGFsCisJbW92IFtlZGkrMV0sYWgKKwlhZGQgZXNpLEJZVEUgNAorCWFkZCBlZGksQllURSAyCisJZGVjIGVjeAorCisuTDQ6CTsgc2F2ZSBjb3VudAorCXB1c2ggZWN4CisKKwk7IHVucm9sbCB0d2ljZQorCXNociBlY3gsMQorICAgIAorCTsgcG9pbnQgYXJyYXlzIHRvIGVuZAorCWxlYSBlc2ksW2VzaStlY3gqOF0KKwlsZWEgZWRpLFtlZGkrZWN4KjRdCisKKwk7IG5lZ2F0aXZlIGNvdW50ZXIgCisJbmVnIGVjeAorCWptcCBTSE9SVCAuTDYKKworLkw1OgorCW1vdiBbZWRpK2VjeCo0LTRdLGVheAorLkw2OgorCW1vdiBlYXgsW2VzaStlY3gqOF0KKworICAgICAgICBzaHIgYWgsMworICAgICAgICBtb3YgZWJ4LFtlc2krZWN4KjgrNF0KKworICAgICAgICBzaHIgZWF4LDMKKyAgICAgICAgbW92IGVkeCxbZXNpK2VjeCo4KzRdCisKKyAgICAgICAgc2hyIGJoLDMKKyAgICAgICAgbW92IGRsLFtlc2krZWN4KjgrMl0KKworICAgICAgICBzaGwgZWJ4LDEzCisgICAgICAgIGFuZCBlYXgsMDAwMDA3RkZoCisgICAgICAgIAorICAgICAgICBzaGwgZWR4LDcKKyAgICAgICAgYW5kIGVieCwwN0ZGMDAwMGgKKworICAgICAgICBhbmQgZWR4LDA3QzAwN0MwMGgKKyAgICAgICAgYWRkIGVheCxlYngKKworICAgICAgICBhZGQgZWF4LGVkeAorICAgICAgICBpbmMgZWN4CisKKyAgICAgICAgam56IC5MNSAgICAgICAgICAgICAgICAgCisKKwltb3YgW2VkaStlY3gqNC00XSxlYXgKKworCTsgdGFpbAorCXBvcCBlY3gKKwlhbmQgZWN4LEJZVEUgMQorCWp6IC5MNworCW1vdiBibCxbZXNpKzBdICAgIDsgYmx1ZQorCW1vdiBhbCxbZXNpKzFdICAgIDsgZ3JlZW4KKwltb3YgYWgsW2VzaSsyXSAgICA7IHJlZAorCXNociBhaCwzCisJYW5kIGFsLDExMTExMDAwYgorCXNobCBlYXgsMgorCXNociBibCwzCisJYWRkIGFsLGJsCisJbW92IFtlZGkrMF0sYWwKKwltb3YgW2VkaSsxXSxhaAorCWFkZCBlc2ksQllURSA0CisJYWRkIGVkaSxCWVRFIDIKKworLkw3OgorCXJldG4KKworCisKKworOzsgMzIgQklUIFJHQiBUTyAxNiBCSVQgQkdSIDU1NQorCQorX0NvbnZlcnRYODZwMzJfMTZCR1I1NTU6CisJCisJOyBjaGVjayBzaG9ydAorCWNtcCBlY3gsQllURSAxNgorCWphIC5MMworCisKKy5MMToJOyBzaG9ydCBsb29wCisJbW92IGFoLFtlc2krMF0gICAgOyBibHVlCisJbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgorCW1vdiBibCxbZXNpKzJdICAgIDsgcmVkCisJc2hyIGFoLDMKKwlhbmQgYWwsMTExMTEwMDBiCisJc2hsIGVheCwyCisJc2hyIGJsLDMKKwlhZGQgYWwsYmwKKwltb3YgW2VkaSswXSxhbAorCW1vdiBbZWRpKzFdLGFoCisJYWRkIGVzaSxCWVRFIDQKKwlhZGQgZWRpLEJZVEUgMgorCWRlYyBlY3gKKwlqbnogLkwxCisuTDI6CisJcmV0bgorCisuTDM6CTsgaGVhZAorCW1vdiBlYngsZWRpCisgICAgICAgIGFuZCBlYngsQllURSAxMWIKKwlqeiAuTDQgICAKKwltb3YgYWgsW2VzaSswXSAgICA7IGJsdWUKKwltb3YgYWwsW2VzaSsxXSAgICA7IGdyZWVuCisJbW92IGJsLFtlc2krMl0gICAgOyByZWQKKwlzaHIgYWgsMworCWFuZCBhbCwxMTExMTAwMGIKKwlzaGwgZWF4LDIKKwlzaHIgYmwsMworCWFkZCBhbCxibAorCW1vdiBbZWRpKzBdLGFsCisJbW92IFtlZGkrMV0sYWgKKwlhZGQgZXNpLEJZVEUgNAorCWFkZCBlZGksQllURSAyCisJZGVjIGVjeAorCisuTDQ6CTsgc2F2ZSBjb3VudAorCXB1c2ggZWN4CisKKwk7IHVucm9sbCB0d2ljZQorCXNociBlY3gsMQorICAgIAorCTsgcG9pbnQgYXJyYXlzIHRvIGVuZAorCWxlYSBlc2ksW2VzaStlY3gqOF0KKwlsZWEgZWRpLFtlZGkrZWN4KjRdCisKKwk7IG5lZ2F0aXZlIGNvdW50ZXIgCisJbmVnIGVjeAorCWptcCBTSE9SVCAuTDYKKworLkw1OgorCW1vdiBbZWRpK2VjeCo0LTRdLGVheCAgICAgICAgICAgIAorLkw2OgorCW1vdiBlZHgsW2VzaStlY3gqOCs0XQorCisgICAgICAgIG1vdiBiaCxbZXNpK2VjeCo4KzRdICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgbW92IGFoLFtlc2krZWN4KjhdICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBzaHIgYmgsMworICAgICAgICBtb3YgYWwsW2VzaStlY3gqOCsxXSAgICAgICAgICAgICAKKworICAgICAgICBzaHIgYWgsMworICAgICAgICBtb3YgYmwsW2VzaStlY3gqOCs1XSAgICAgICAgICAgCisKKyAgICAgICAgc2hsIGVheCwyCisgICAgICAgIG1vdiBkbCxbZXNpK2VjeCo4KzJdCisKKyAgICAgICAgc2hsIGVieCwxOAorICAgICAgICBhbmQgZWF4LDAwMDA3RkUwaCAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIHNociBlZHgsMworICAgICAgICBhbmQgZWJ4LDA3RkUwMDAwMGggICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBhbmQgZWR4LDAwMUYwMDFGaCAgICAgICAgICAgICAgIAorICAgICAgICBhZGQgZWF4LGVieAorCisgICAgICAgIGFkZCBlYXgsZWR4CisgICAgICAgIGluYyBlY3gKKworICAgICAgICBqbnogLkw1ICAgICAgICAgICAgICAgICAKKworCW1vdiBbZWRpK2VjeCo0LTRdLGVheCAgICAgICAgICAgIAorCisJOyB0YWlsCisJcG9wIGVjeAorCWFuZCBlY3gsQllURSAxCisJanogLkw3CisJbW92IGFoLFtlc2krMF0gICAgOyBibHVlCisJbW92IGFsLFtlc2krMV0gICAgOyBncmVlbgorCW1vdiBibCxbZXNpKzJdICAgIDsgcmVkCisJc2hyIGFoLDMKKwlhbmQgYWwsMTExMTEwMDBiCisJc2hsIGVheCwyCisJc2hyIGJsLDMKKwlhZGQgYWwsYmwKKwltb3YgW2VkaSswXSxhbAorCW1vdiBbZWRpKzFdLGFoCisJYWRkIGVzaSxCWVRFIDQKKwlhZGQgZWRpLEJZVEUgMgorCisuTDc6CisJcmV0bgorCisKKworCisJCis7OyBGUk9NIDMyIEJJVCBSR0IgdG8gOCBCSVQgUkdCIChycnJnZ2diYmIpCis7OyBUaGlzIHJvdXRpbmUgd3JpdGVzIEZPVVIgcGl4ZWxzIGF0IG9uY2UgKGR3b3JkKSBhbmQgdGhlbiwgaWYgdGhleSBleGlzdAorOzsgdGhlIHRyYWlsaW5nIHRocmVlIHBpeGVscworX0NvbnZlcnRYODZwMzJfOFJHQjMzMjoKKworCQorLkxfQUxJR05FRDoKKwlwdXNoIGVjeAorCisJc2hyIGVjeCwyCQk7IFdlIHdpbGwgZHJhdyA0IHBpeGVscyBhdCBvbmNlCisJam56IC5MMQorCQorCWptcCAuTDIJCQk7IHNob3J0IGp1bXAgb3V0IG9mIHJhbmdlIDooCisJCisuTDE6CisJbW92IGVheCxbZXNpXQkJOyBmaXJzdCBwYWlyIG9mIHBpeGVscworCW1vdiBlZHgsW2VzaSs0XQorCisJc2hyIGRsLDYKKwltb3YgZWJ4LGVheAorCisJc2hyIGFsLDYKKwlhbmQgYWgsMGUwaAorCisJc2hyIGVieCwxNgorCWFuZCBkaCwwZTBoCisJCisJc2hyIGFoLDMKKwlhbmQgYmwsMGUwaAorCisJc2hyIGRoLDMKKwkKKwlvciBhbCxibAorCQorCW1vdiBlYngsZWR4CQorCW9yIGFsLGFoCisJCisJc2hyIGVieCwxNgorCW9yIGRsLGRoCisKKwlhbmQgYmwsMGUwaAorCQorCW9yIGRsLGJsCisKKwltb3YgYWgsZGwKKworCQorCQkKKwltb3YgZWJ4LFtlc2krOF0JCTsgc2Vjb25kIHBhaXIgb2YgcGl4ZWxzCisKKwltb3YgZWR4LGVieAorCWFuZCBiaCwwZTBoCisKKwlzaHIgYmwsNgorCWFuZCBlZHgsMGUwMDAwMGgKKworCXNociBlZHgsMTYKKworCXNociBiaCwzCisKKwlyb3IgZWF4LDE2CisJb3IgYmwsZGwKKworCW1vdiBlZHgsW2VzaSsxMl0KKwlvciBibCxiaAorCQorCW1vdiBhbCxibAorCisJbW92IGVieCxlZHgKKwlhbmQgZGgsMGUwaAorCisJc2hyIGRsLDYKKwlhbmQgZWJ4LDBlMDAwMDBoCisJCisJc2hyIGRoLDMKKwltb3YgYWgsZGwKKworCXNociBlYngsMTYKKwlvciBhaCxkaAorCisJb3IgYWgsYmwKKworCXJvbCBlYXgsMTYKKwlhZGQgZXNpLEJZVEUgMTYKKwkJCQorCW1vdiBbZWRpXSxlYXgJCisJYWRkIGVkaSxCWVRFIDQKKwkKKwlkZWMgZWN4CisJanogLkwyCQkJOyBMMSBvdXQgb2YgcmFuZ2UgZm9yIHNob3J0IGp1bXAgOigKKwkKKwlqbXAgLkwxCisuTDI6CisJCisJcG9wIGVjeAorCWFuZCBlY3gsQllURSAzCQk7IG1hc2sgb3V0IG51bWJlciBvZiBwaXhlbHMgdG8gZHJhdworCQorCWp6IC5MNAkJCTsgTm90aGluZyB0byBkbyBhbnltb3JlCisKKy5MMzoKKwltb3YgZWF4LFtlc2ldCQk7IHNpbmdsZSBwaXhlbCBjb252ZXJzaW9uIGZvciB0cmFpbGluZyBwaXhlbHMKKworICAgICAgICBtb3YgZWJ4LGVheAorCisgICAgICAgIHNociBhbCw2CisgICAgICAgIGFuZCBhaCwwZTBoCisKKyAgICAgICAgc2hyIGVieCwxNgorCisgICAgICAgIHNociBhaCwzCisgICAgICAgIGFuZCBibCwwZTBoCisKKyAgICAgICAgb3IgYWwsYWgKKyAgICAgICAgb3IgYWwsYmwKKworICAgICAgICBtb3YgW2VkaV0sYWwKKworICAgICAgICBpbmMgZWRpCisgICAgICAgIGFkZCBlc2ksQllURSA0CisKKwlkZWMgZWN4CisJam56IC5MMworCQorLkw0OgkKKwlyZXRuCisKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGYzMgorc2VjdGlvbiAubm90ZS5HTlUtc3RhY2sgbm9hbGxvYyBub2V4ZWMgbm93cml0ZSBwcm9nYml0cworJWVuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL1NETF9qb3lzdGljay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9TRExfam95c3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODNiMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9TRExfam95c3RpY2suYwpAQCAtMCwwICsxLDYwNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgaXMgdGhlIGpveXN0aWNrIEFQSSBmb3IgU2ltcGxlIERpcmVjdE1lZGlhIExheWVyICovCisKKyNpbmNsdWRlICJTRExfZXZlbnRzLmgiCisjaW5jbHVkZSAiU0RMX3N5c2pveXN0aWNrLmgiCisjaW5jbHVkZSAiU0RMX2pveXN0aWNrX2MuaCIKKyNpZiAhU0RMX0VWRU5UU19ESVNBQkxFRAorI2luY2x1ZGUgIi4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNlbmRpZgorCisvKiBUaGlzIGlzIHVzZWQgZm9yIFF1YWtlIElJSSBBcmVuYSAqLworI2lmIFNETF9FVkVOVFNfRElTQUJMRUQKKyNkZWZpbmUgU0RMX0xvY2tfRXZlbnRUaHJlYWQoKQorI2RlZmluZSBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCkKKyNlbmRpZgorCitVaW50OCBTRExfbnVtam95c3RpY2tzID0gMDsKK2ludCBTRExfYWxsb2NhdGVkam95c3RpY2tzID0gMDsKK1NETF9Kb3lzdGljayAqKlNETF9qb3lzdGlja3MgPSBOVUxMOworCitpbnQgU0RMX0pveXN0aWNrSW5pdCh2b2lkKQoreworCWludCBhcnJheWxlbjsKKwlpbnQgc3RhdHVzOworCisJU0RMX251bWpveXN0aWNrcyA9IDA7CisJc3RhdHVzID0gU0RMX1NZU19Kb3lzdGlja0luaXQoKTsKKwlpZiAoIHN0YXR1cyA+PSAwICkgeworCQlTRExfYWxsb2NhdGVkam95c3RpY2tzID0gc3RhdHVzOworCQlhcnJheWxlbiA9IChTRExfYWxsb2NhdGVkam95c3RpY2tzKzEpKnNpemVvZigqU0RMX2pveXN0aWNrcyk7CisJCVNETF9qb3lzdGlja3MgPSAoU0RMX0pveXN0aWNrICoqKVNETF9tYWxsb2MoYXJyYXlsZW4pOworCQlpZiAoIFNETF9qb3lzdGlja3MgPT0gTlVMTCApIHsKKwkJCVNETF9udW1qb3lzdGlja3MgPSAwOworCQkJU0RMX2FsbG9jYXRlZGpveXN0aWNrcyA9IDA7CisJCX0gZWxzZSB7CisJCQlTRExfbWVtc2V0KFNETF9qb3lzdGlja3MsIDAsIGFycmF5bGVuKTsKKwkJCVNETF9udW1qb3lzdGlja3MgPSBzdGF0dXM7CisJCX0KKwkJc3RhdHVzID0gMDsKKwl9CisJcmV0dXJuKHN0YXR1cyk7Cit9CisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGpveXN0aWNrcyBhdHRhY2hlZCB0byB0aGUgc3lzdGVtCisgKi8KK2ludCBTRExfTnVtSm95c3RpY2tzKHZvaWQpCit7CisJcmV0dXJuIFNETF9udW1qb3lzdGlja3M7Cit9CisKKy8qCisgKiBHZXQgdGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBuYW1lIG9mIGEgam95c3RpY2sKKyAqLworY29uc3QgY2hhciAqU0RMX0pveXN0aWNrTmFtZShpbnQgZGV2aWNlX2luZGV4KQoreworCWlmICggKGRldmljZV9pbmRleCA8IDApIHx8IChkZXZpY2VfaW5kZXggPj0gU0RMX251bWpveXN0aWNrcykgKSB7CisJCVNETF9TZXRFcnJvcigiVGhlcmUgYXJlICVkIGpveXN0aWNrcyBhdmFpbGFibGUiLAorCQkgICAgICAgICAgICAgU0RMX251bWpveXN0aWNrcyk7CisJCXJldHVybihOVUxMKTsKKwl9CisJcmV0dXJuKFNETF9TWVNfSm95c3RpY2tOYW1lKGRldmljZV9pbmRleCkpOworfQorCisvKgorICogT3BlbiBhIGpveXN0aWNrIGZvciB1c2UgLSB0aGUgaW5kZXggcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHJlZmVycyB0bworICogdGhlIE4ndGggam95c3RpY2sgb24gdGhlIHN5c3RlbS4gIFRoaXMgaW5kZXggaXMgdGhlIHZhbHVlIHdoaWNoIHdpbGwKKyAqIGlkZW50aWZ5IHRoaXMgam95c3RpY2sgaW4gZnV0dXJlIGpveXN0aWNrIGV2ZW50cy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBqb3lzdGljayBpZGVudGlmaWVyLCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitTRExfSm95c3RpY2sgKlNETF9Kb3lzdGlja09wZW4oaW50IGRldmljZV9pbmRleCkKK3sKKwlpbnQgaTsKKwlTRExfSm95c3RpY2sgKmpveXN0aWNrOworCisJaWYgKCAoZGV2aWNlX2luZGV4IDwgMCkgfHwgKGRldmljZV9pbmRleCA+PSBTRExfbnVtam95c3RpY2tzKSApIHsKKwkJU0RMX1NldEVycm9yKCJUaGVyZSBhcmUgJWQgam95c3RpY2tzIGF2YWlsYWJsZSIsCisJCSAgICAgICAgICAgICBTRExfbnVtam95c3RpY2tzKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIElmIHRoZSBqb3lzdGljayBpcyBhbHJlYWR5IG9wZW4sIHJldHVybiBpdCAqLworCWZvciAoIGk9MDsgU0RMX2pveXN0aWNrc1tpXTsgKytpICkgeworCQlpZiAoIGRldmljZV9pbmRleCA9PSBTRExfam95c3RpY2tzW2ldLT5pbmRleCApIHsKKwkJCWpveXN0aWNrID0gU0RMX2pveXN0aWNrc1tpXTsKKwkJCSsram95c3RpY2stPnJlZl9jb3VudDsKKwkJCXJldHVybihqb3lzdGljayk7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIGpveXN0aWNrICovCisJam95c3RpY2sgPSAoU0RMX0pveXN0aWNrICopU0RMX21hbGxvYygoc2l6ZW9mICpqb3lzdGljaykpOworCWlmICggIWpveXN0aWNrICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCVNETF9tZW1zZXQoam95c3RpY2ssIDAsIChzaXplb2YgKmpveXN0aWNrKSk7CisJam95c3RpY2stPmluZGV4ID0gZGV2aWNlX2luZGV4OworCWlmICggU0RMX1NZU19Kb3lzdGlja09wZW4oam95c3RpY2spIDwgMCApIHsKKwkJU0RMX2ZyZWUoam95c3RpY2spOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJaWYgKCBqb3lzdGljay0+bmF4ZXMgPiAwICkgeworCQlqb3lzdGljay0+YXhlcyA9IChTaW50MTYgKilTRExfbWFsbG9jCisJCQkoam95c3RpY2stPm5heGVzKnNpemVvZihTaW50MTYpKTsKKwl9CisJaWYgKCBqb3lzdGljay0+bmhhdHMgPiAwICkgeworCQlqb3lzdGljay0+aGF0cyA9IChVaW50OCAqKVNETF9tYWxsb2MKKwkJCShqb3lzdGljay0+bmhhdHMqc2l6ZW9mKFVpbnQ4KSk7CisJfQorCWlmICggam95c3RpY2stPm5iYWxscyA+IDAgKSB7CisJCWpveXN0aWNrLT5iYWxscyA9IChzdHJ1Y3QgYmFsbGRlbHRhICopU0RMX21hbGxvYworCQkJKGpveXN0aWNrLT5uYmFsbHMqc2l6ZW9mKCpqb3lzdGljay0+YmFsbHMpKTsKKwl9CisJaWYgKCBqb3lzdGljay0+bmJ1dHRvbnMgPiAwICkgeworCQlqb3lzdGljay0+YnV0dG9ucyA9IChVaW50OCAqKVNETF9tYWxsb2MKKwkJCShqb3lzdGljay0+bmJ1dHRvbnMqc2l6ZW9mKFVpbnQ4KSk7CisJfQorCWlmICggKChqb3lzdGljay0+bmF4ZXMgPiAwKSAmJiAham95c3RpY2stPmF4ZXMpCisJICB8fCAoKGpveXN0aWNrLT5uaGF0cyA+IDApICYmICFqb3lzdGljay0+aGF0cykKKwkgIHx8ICgoam95c3RpY2stPm5iYWxscyA+IDApICYmICFqb3lzdGljay0+YmFsbHMpCisJICB8fCAoKGpveXN0aWNrLT5uYnV0dG9ucyA+IDApICYmICFqb3lzdGljay0+YnV0dG9ucykpIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCVNETF9Kb3lzdGlja0Nsb3NlKGpveXN0aWNrKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCWlmICggam95c3RpY2stPmF4ZXMgKSB7CisJCVNETF9tZW1zZXQoam95c3RpY2stPmF4ZXMsIDAsCisJCQlqb3lzdGljay0+bmF4ZXMqc2l6ZW9mKFNpbnQxNikpOworCX0KKwlpZiAoIGpveXN0aWNrLT5oYXRzICkgeworCQlTRExfbWVtc2V0KGpveXN0aWNrLT5oYXRzLCAwLAorCQkJam95c3RpY2stPm5oYXRzKnNpemVvZihVaW50OCkpOworCX0KKwlpZiAoIGpveXN0aWNrLT5iYWxscyApIHsKKwkJU0RMX21lbXNldChqb3lzdGljay0+YmFsbHMsIDAsCisJCQlqb3lzdGljay0+bmJhbGxzKnNpemVvZigqam95c3RpY2stPmJhbGxzKSk7CisJfQorCWlmICggam95c3RpY2stPmJ1dHRvbnMgKSB7CisJCVNETF9tZW1zZXQoam95c3RpY2stPmJ1dHRvbnMsIDAsCisJCQlqb3lzdGljay0+bmJ1dHRvbnMqc2l6ZW9mKFVpbnQ4KSk7CisJfQorCisJLyogQWRkIGpveXN0aWNrIHRvIGxpc3QgKi8KKwkrK2pveXN0aWNrLT5yZWZfY291bnQ7CisJU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKKwlmb3IgKCBpPTA7IFNETF9qb3lzdGlja3NbaV07ICsraSApCisJCS8qIFNraXAgdG8gbmV4dCBqb3lzdGljayAqLyA7CisJU0RMX2pveXN0aWNrc1tpXSA9IGpveXN0aWNrOworCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKKworCXJldHVybihqb3lzdGljayk7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgdGhlIGpveXN0aWNrIGhhcyBiZWVuIG9wZW5lZCwgb3IgMCBpZiBpdCBoYXMgbm90LgorICovCitpbnQgU0RMX0pveXN0aWNrT3BlbmVkKGludCBkZXZpY2VfaW5kZXgpCit7CisJaW50IGksIG9wZW5lZDsKKworCW9wZW5lZCA9IDA7CisJZm9yICggaT0wOyBTRExfam95c3RpY2tzW2ldOyArK2kgKSB7CisJCWlmICggU0RMX2pveXN0aWNrc1tpXS0+aW5kZXggPT0gKFVpbnQ4KWRldmljZV9pbmRleCApIHsKKwkJCW9wZW5lZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4ob3BlbmVkKTsKK30KKworc3RhdGljIGludCBWYWxpZEpveXN0aWNrKFNETF9Kb3lzdGljayAqKmpveXN0aWNrKQoreworCWludCB2YWxpZDsKKworCWlmICggKmpveXN0aWNrID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiSm95c3RpY2sgaGFzbid0IGJlZW4gb3BlbmVkIHlldCIpOworCQl2YWxpZCA9IDA7CisJfSBlbHNlIHsKKwkJdmFsaWQgPSAxOworCX0KKwlyZXR1cm4gdmFsaWQ7Cit9CisKKy8qCisgKiBHZXQgdGhlIGRldmljZSBpbmRleCBvZiBhbiBvcGVuZWQgam95c3RpY2suCisgKi8KK2ludCBTRExfSm95c3RpY2tJbmRleChTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCWlmICggISBWYWxpZEpveXN0aWNrKCZqb3lzdGljaykgKSB7CisJCXJldHVybigtMSk7CisJfQorCXJldHVybihqb3lzdGljay0+aW5kZXgpOworfQorCisvKgorICogR2V0IHRoZSBudW1iZXIgb2YgbXVsdGktZGltZW5zaW9uYWwgYXhpcyBjb250cm9scyBvbiBhIGpveXN0aWNrCisgKi8KK2ludCBTRExfSm95c3RpY2tOdW1BeGVzKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7CisJaWYgKCAhIFZhbGlkSm95c3RpY2soJmpveXN0aWNrKSApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKGpveXN0aWNrLT5uYXhlcyk7Cit9CisKKy8qCisgKiBHZXQgdGhlIG51bWJlciBvZiBoYXRzIG9uIGEgam95c3RpY2sKKyAqLworaW50IFNETF9Kb3lzdGlja051bUhhdHMoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgeworCQlyZXR1cm4oLTEpOworCX0KKwlyZXR1cm4oam95c3RpY2stPm5oYXRzKTsKK30KKworLyoKKyAqIEdldCB0aGUgbnVtYmVyIG9mIHRyYWNrYmFsbHMgb24gYSBqb3lzdGljaworICovCitpbnQgU0RMX0pveXN0aWNrTnVtQmFsbHMoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgeworCQlyZXR1cm4oLTEpOworCX0KKwlyZXR1cm4oam95c3RpY2stPm5iYWxscyk7Cit9CisKKy8qCisgKiBHZXQgdGhlIG51bWJlciBvZiBidXR0b25zIG9uIGEgam95c3RpY2sKKyAqLworaW50IFNETF9Kb3lzdGlja051bUJ1dHRvbnMoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgeworCQlyZXR1cm4oLTEpOworCX0KKwlyZXR1cm4oam95c3RpY2stPm5idXR0b25zKTsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBheGlzIGNvbnRyb2wgb24gYSBqb3lzdGljaworICovCitTaW50MTYgU0RMX0pveXN0aWNrR2V0QXhpcyhTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYXhpcykKK3sKKwlTaW50MTYgc3RhdGU7CisKKwlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgeworCQlyZXR1cm4oMCk7CisJfQorCWlmICggYXhpcyA8IGpveXN0aWNrLT5uYXhlcyApIHsKKwkJc3RhdGUgPSBqb3lzdGljay0+YXhlc1theGlzXTsKKwl9IGVsc2UgeworCQlTRExfU2V0RXJyb3IoIkpveXN0aWNrIG9ubHkgaGFzICVkIGF4ZXMiLCBqb3lzdGljay0+bmF4ZXMpOworCQlzdGF0ZSA9IDA7CisJfQorCXJldHVybihzdGF0ZSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBoYXQgb24gYSBqb3lzdGljaworICovCitVaW50OCBTRExfSm95c3RpY2tHZXRIYXQoU0RMX0pveXN0aWNrICpqb3lzdGljaywgaW50IGhhdCkKK3sKKwlVaW50OCBzdGF0ZTsKKworCWlmICggISBWYWxpZEpveXN0aWNrKCZqb3lzdGljaykgKSB7CisJCXJldHVybigwKTsKKwl9CisJaWYgKCBoYXQgPCBqb3lzdGljay0+bmhhdHMgKSB7CisJCXN0YXRlID0gam95c3RpY2stPmhhdHNbaGF0XTsKKwl9IGVsc2UgeworCQlTRExfU2V0RXJyb3IoIkpveXN0aWNrIG9ubHkgaGFzICVkIGhhdHMiLCBqb3lzdGljay0+bmhhdHMpOworCQlzdGF0ZSA9IDA7CisJfQorCXJldHVybihzdGF0ZSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGJhbGwgYXhpcyBjaGFuZ2Ugc2luY2UgdGhlIGxhc3QgcG9sbAorICovCitpbnQgU0RMX0pveXN0aWNrR2V0QmFsbChTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgYmFsbCwgaW50ICpkeCwgaW50ICpkeSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIFZhbGlkSm95c3RpY2soJmpveXN0aWNrKSApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwlyZXR2YWwgPSAwOworCWlmICggYmFsbCA8IGpveXN0aWNrLT5uYmFsbHMgKSB7CisJCWlmICggZHggKSB7CisJCQkqZHggPSBqb3lzdGljay0+YmFsbHNbYmFsbF0uZHg7CisJCX0KKwkJaWYgKCBkeSApIHsKKwkJCSpkeSA9IGpveXN0aWNrLT5iYWxsc1tiYWxsXS5keTsKKwkJfQorCQlqb3lzdGljay0+YmFsbHNbYmFsbF0uZHggPSAwOworCQlqb3lzdGljay0+YmFsbHNbYmFsbF0uZHkgPSAwOworCX0gZWxzZSB7CisJCVNETF9TZXRFcnJvcigiSm95c3RpY2sgb25seSBoYXMgJWQgYmFsbHMiLCBqb3lzdGljay0+bmJhbGxzKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgYnV0dG9uIG9uIGEgam95c3RpY2sKKyAqLworVWludDggU0RMX0pveXN0aWNrR2V0QnV0dG9uKFNETF9Kb3lzdGljayAqam95c3RpY2ssIGludCBidXR0b24pCit7CisJVWludDggc3RhdGU7CisKKwlpZiAoICEgVmFsaWRKb3lzdGljaygmam95c3RpY2spICkgeworCQlyZXR1cm4oMCk7CisJfQorCWlmICggYnV0dG9uIDwgam95c3RpY2stPm5idXR0b25zICkgeworCQlzdGF0ZSA9IGpveXN0aWNrLT5idXR0b25zW2J1dHRvbl07CisJfSBlbHNlIHsKKwkJU0RMX1NldEVycm9yKCJKb3lzdGljayBvbmx5IGhhcyAlZCBidXR0b25zIixqb3lzdGljay0+bmJ1dHRvbnMpOworCQlzdGF0ZSA9IDA7CisJfQorCXJldHVybihzdGF0ZSk7Cit9CisKKy8qCisgKiBDbG9zZSBhIGpveXN0aWNrIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggU0RMX0pveXN0aWNrT3BlbigpCisgKi8KK3ZvaWQgU0RMX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpbnQgaTsKKworCWlmICggISBWYWxpZEpveXN0aWNrKCZqb3lzdGljaykgKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaXJzdCBkZWNyZW1lbnQgcmVmIGNvdW50ICovCisJaWYgKCAtLWpveXN0aWNrLT5yZWZfY291bnQgPiAwICkgeworCQlyZXR1cm47CisJfQorCisJLyogTG9jayB0aGUgZXZlbnQgcXVldWUgLSBwcmV2ZW50IGpveXN0aWNrIHBvbGxpbmcgKi8KKwlTRExfTG9ja19FdmVudFRocmVhZCgpOworCisJU0RMX1NZU19Kb3lzdGlja0Nsb3NlKGpveXN0aWNrKTsKKworCS8qIFJlbW92ZSBqb3lzdGljayBmcm9tIGxpc3QgKi8KKwlmb3IgKCBpPTA7IFNETF9qb3lzdGlja3NbaV07ICsraSApIHsKKwkJaWYgKCBqb3lzdGljayA9PSBTRExfam95c3RpY2tzW2ldICkgeworCQkJU0RMX21lbW1vdmUoJlNETF9qb3lzdGlja3NbaV0sICZTRExfam95c3RpY2tzW2krMV0sCisJCQkgICAgICAgKFNETF9hbGxvY2F0ZWRqb3lzdGlja3MtaSkqc2l6ZW9mKGpveXN0aWNrKSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIExldCB0aGUgZXZlbnQgdGhyZWFkIGtlZXAgcnVubmluZyAqLworCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKKworCS8qIEZyZWUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgam95c3RpY2sgKi8KKwlpZiAoIGpveXN0aWNrLT5heGVzICkgeworCQlTRExfZnJlZShqb3lzdGljay0+YXhlcyk7CisJfQorCWlmICggam95c3RpY2stPmhhdHMgKSB7CisJCVNETF9mcmVlKGpveXN0aWNrLT5oYXRzKTsKKwl9CisJaWYgKCBqb3lzdGljay0+YmFsbHMgKSB7CisJCVNETF9mcmVlKGpveXN0aWNrLT5iYWxscyk7CisJfQorCWlmICggam95c3RpY2stPmJ1dHRvbnMgKSB7CisJCVNETF9mcmVlKGpveXN0aWNrLT5idXR0b25zKTsKKwl9CisJU0RMX2ZyZWUoam95c3RpY2spOworfQorCit2b2lkIFNETF9Kb3lzdGlja1F1aXQodm9pZCkKK3sKKwljb25zdCBpbnQgbnVtc3RpY2tzID0gU0RMX251bWpveXN0aWNrczsKKwlpbnQgaTsKKworCS8qIFN0b3AgdGhlIGV2ZW50IHBvbGxpbmcgKi8KKwlTRExfTG9ja19FdmVudFRocmVhZCgpOworCVNETF9udW1qb3lzdGlja3MgPSAwOworCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKKworCWlmIChTRExfam95c3RpY2tzICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bXN0aWNrczsgaSsrKSB7CisJCQlTRExfSm95c3RpY2sgKnN0aWNrID0gU0RMX2pveXN0aWNrc1tpXTsKKwkJCWlmIChzdGljayAmJiAoc3RpY2stPnJlZl9jb3VudCA+PSAxKSkgeworCQkJCXN0aWNrLT5yZWZfY291bnQgPSAxOworCQkJCVNETF9Kb3lzdGlja0Nsb3NlKHN0aWNrKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFF1aXQgdGhlIGpveXN0aWNrIHNldHVwICovCisJU0RMX1NZU19Kb3lzdGlja1F1aXQoKTsKKwlpZiAoIFNETF9qb3lzdGlja3MgKSB7CisJCVNETF9mcmVlKFNETF9qb3lzdGlja3MpOworCQlTRExfam95c3RpY2tzID0gTlVMTDsKKwkJU0RMX2FsbG9jYXRlZGpveXN0aWNrcyA9IDA7CisJfQorfQorCisKKy8qIFRoZXNlIGFyZSBnbG9iYWwgZm9yIFNETF9zeXNqb3lzdGljay5jIGFuZCBTRExfZXZlbnRzLmMgKi8KKworaW50IFNETF9Qcml2YXRlSm95c3RpY2tBeGlzKFNETF9Kb3lzdGljayAqam95c3RpY2ssIFVpbnQ4IGF4aXMsIFNpbnQxNiB2YWx1ZSkKK3sKKwlpbnQgcG9zdGVkOworCisJLyogTWFrZSBzdXJlIHdlJ3JlIG5vdCBnZXR0aW5nIGdhcmJhZ2UgZXZlbnRzICovCisJaWYgKGF4aXMgPj0gam95c3RpY2stPm5heGVzKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIFVwZGF0ZSBpbnRlcm5hbCBqb3lzdGljayBzdGF0ZSAqLworCWpveXN0aWNrLT5heGVzW2F4aXNdID0gdmFsdWU7CisKKwkvKiBQb3N0IHRoZSBldmVudCwgaWYgZGVzaXJlZCAqLworCXBvc3RlZCA9IDA7CisjaWYgIVNETF9FVkVOVFNfRElTQUJMRUQKKwlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW1NETF9KT1lBWElTTU9USU9OXSA9PSBTRExfRU5BQkxFICkgeworCQlTRExfRXZlbnQgZXZlbnQ7CisJCWV2ZW50LnR5cGUgPSBTRExfSk9ZQVhJU01PVElPTjsKKwkJZXZlbnQuamF4aXMud2hpY2ggPSBqb3lzdGljay0+aW5kZXg7CisJCWV2ZW50LmpheGlzLmF4aXMgPSBheGlzOworCQlldmVudC5qYXhpcy52YWx1ZSA9IHZhbHVlOworCQlpZiAoIChTRExfRXZlbnRPSyA9PSBOVUxMKSB8fCAoKlNETF9FdmVudE9LKSgmZXZlbnQpICkgeworCQkJcG9zdGVkID0gMTsKKwkJCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKKwkJfQorCX0KKyNlbmRpZiAvKiAhU0RMX0VWRU5UU19ESVNBQkxFRCAqLworCXJldHVybihwb3N0ZWQpOworfQorCitpbnQgU0RMX1ByaXZhdGVKb3lzdGlja0hhdChTRExfSm95c3RpY2sgKmpveXN0aWNrLCBVaW50OCBoYXQsIFVpbnQ4IHZhbHVlKQoreworCWludCBwb3N0ZWQ7CisKKwkvKiBNYWtlIHN1cmUgd2UncmUgbm90IGdldHRpbmcgZ2FyYmFnZSBldmVudHMgKi8KKwlpZiAoaGF0ID49IGpveXN0aWNrLT5uaGF0cykgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBVcGRhdGUgaW50ZXJuYWwgam95c3RpY2sgc3RhdGUgKi8KKwlqb3lzdGljay0+aGF0c1toYXRdID0gdmFsdWU7CisKKwkvKiBQb3N0IHRoZSBldmVudCwgaWYgZGVzaXJlZCAqLworCXBvc3RlZCA9IDA7CisjaWYgIVNETF9FVkVOVFNfRElTQUJMRUQKKwlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW1NETF9KT1lIQVRNT1RJT05dID09IFNETF9FTkFCTEUgKSB7CisJCVNETF9FdmVudCBldmVudDsKKwkJZXZlbnQuamhhdC50eXBlID0gU0RMX0pPWUhBVE1PVElPTjsKKwkJZXZlbnQuamhhdC53aGljaCA9IGpveXN0aWNrLT5pbmRleDsKKwkJZXZlbnQuamhhdC5oYXQgPSBoYXQ7CisJCWV2ZW50LmpoYXQudmFsdWUgPSB2YWx1ZTsKKwkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgKCpTRExfRXZlbnRPSykoJmV2ZW50KSApIHsKKwkJCXBvc3RlZCA9IDE7CisJCQlTRExfUHVzaEV2ZW50KCZldmVudCk7CisJCX0KKwl9CisjZW5kaWYgLyogIVNETF9FVkVOVFNfRElTQUJMRUQgKi8KKwlyZXR1cm4ocG9zdGVkKTsKK30KKworaW50IFNETF9Qcml2YXRlSm95c3RpY2tCYWxsKFNETF9Kb3lzdGljayAqam95c3RpY2ssIFVpbnQ4IGJhbGwsCisJCQkJCVNpbnQxNiB4cmVsLCBTaW50MTYgeXJlbCkKK3sKKwlpbnQgcG9zdGVkOworCisJLyogTWFrZSBzdXJlIHdlJ3JlIG5vdCBnZXR0aW5nIGdhcmJhZ2UgZXZlbnRzICovCisJaWYgKGJhbGwgPj0gam95c3RpY2stPm5iYWxscykgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBVcGRhdGUgaW50ZXJuYWwgbW91c2Ugc3RhdGUgKi8KKwlqb3lzdGljay0+YmFsbHNbYmFsbF0uZHggKz0geHJlbDsKKwlqb3lzdGljay0+YmFsbHNbYmFsbF0uZHkgKz0geXJlbDsKKworCS8qIFBvc3QgdGhlIGV2ZW50LCBpZiBkZXNpcmVkICovCisJcG9zdGVkID0gMDsKKyNpZiAhU0RMX0VWRU5UU19ESVNBQkxFRAorCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX0pPWUJBTExNT1RJT05dID09IFNETF9FTkFCTEUgKSB7CisJCVNETF9FdmVudCBldmVudDsKKwkJZXZlbnQuamJhbGwudHlwZSA9IFNETF9KT1lCQUxMTU9USU9OOworCQlldmVudC5qYmFsbC53aGljaCA9IGpveXN0aWNrLT5pbmRleDsKKwkJZXZlbnQuamJhbGwuYmFsbCA9IGJhbGw7CisJCWV2ZW50LmpiYWxsLnhyZWwgPSB4cmVsOworCQlldmVudC5qYmFsbC55cmVsID0geXJlbDsKKwkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgKCpTRExfRXZlbnRPSykoJmV2ZW50KSApIHsKKwkJCXBvc3RlZCA9IDE7CisJCQlTRExfUHVzaEV2ZW50KCZldmVudCk7CisJCX0KKwl9CisjZW5kaWYgLyogIVNETF9FVkVOVFNfRElTQUJMRUQgKi8KKwlyZXR1cm4ocG9zdGVkKTsKK30KKworaW50IFNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oU0RMX0pveXN0aWNrICpqb3lzdGljaywgVWludDggYnV0dG9uLCBVaW50OCBzdGF0ZSkKK3sKKwlpbnQgcG9zdGVkOworI2lmICFTRExfRVZFTlRTX0RJU0FCTEVECisJU0RMX0V2ZW50IGV2ZW50OworCisJc3dpdGNoICggc3RhdGUgKSB7CisJCWNhc2UgU0RMX1BSRVNTRUQ6CisJCQlldmVudC50eXBlID0gU0RMX0pPWUJVVFRPTkRPV047CisJCQlicmVhazsKKwkJY2FzZSBTRExfUkVMRUFTRUQ6CisJCQlldmVudC50eXBlID0gU0RMX0pPWUJVVFRPTlVQOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBJbnZhbGlkIHN0YXRlIC0tIGJhaWwgKi8KKwkJCXJldHVybigwKTsKKwl9CisjZW5kaWYgLyogIVNETF9FVkVOVFNfRElTQUJMRUQgKi8KKworCS8qIE1ha2Ugc3VyZSB3ZSdyZSBub3QgZ2V0dGluZyBnYXJiYWdlIGV2ZW50cyAqLworCWlmIChidXR0b24gPj0gam95c3RpY2stPm5idXR0b25zKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIFVwZGF0ZSBpbnRlcm5hbCBqb3lzdGljayBzdGF0ZSAqLworCWpveXN0aWNrLT5idXR0b25zW2J1dHRvbl0gPSBzdGF0ZTsKKworCS8qIFBvc3QgdGhlIGV2ZW50LCBpZiBkZXNpcmVkICovCisJcG9zdGVkID0gMDsKKyNpZiAhU0RMX0VWRU5UU19ESVNBQkxFRAorCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbZXZlbnQudHlwZV0gPT0gU0RMX0VOQUJMRSApIHsKKwkJZXZlbnQuamJ1dHRvbi53aGljaCA9IGpveXN0aWNrLT5pbmRleDsKKwkJZXZlbnQuamJ1dHRvbi5idXR0b24gPSBidXR0b247CisJCWV2ZW50LmpidXR0b24uc3RhdGUgPSBzdGF0ZTsKKwkJaWYgKCAoU0RMX0V2ZW50T0sgPT0gTlVMTCkgfHwgKCpTRExfRXZlbnRPSykoJmV2ZW50KSApIHsKKwkJCXBvc3RlZCA9IDE7CisJCQlTRExfUHVzaEV2ZW50KCZldmVudCk7CisJCX0KKwl9CisjZW5kaWYgLyogIVNETF9FVkVOVFNfRElTQUJMRUQgKi8KKwlyZXR1cm4ocG9zdGVkKTsKK30KKwordm9pZCBTRExfSm95c3RpY2tVcGRhdGUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoIGk9MDsgU0RMX2pveXN0aWNrc1tpXTsgKytpICkgeworCQlTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9qb3lzdGlja3NbaV0pOworCX0KK30KKworaW50IFNETF9Kb3lzdGlja0V2ZW50U3RhdGUoaW50IHN0YXRlKQoreworI2lmIFNETF9FVkVOVFNfRElTQUJMRUQKKwlyZXR1cm4gU0RMX0lHTk9SRTsKKyNlbHNlCisJY29uc3QgVWludDggZXZlbnRfbGlzdFtdID0geworCQlTRExfSk9ZQVhJU01PVElPTiwgU0RMX0pPWUJBTExNT1RJT04sIFNETF9KT1lIQVRNT1RJT04sCisJCVNETF9KT1lCVVRUT05ET1dOLCBTRExfSk9ZQlVUVE9OVVAsCisJfTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBTRExfUVVFUlk6CisJCQlzdGF0ZSA9IFNETF9JR05PUkU7CisJCQlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShldmVudF9saXN0KTsgKytpICkgeworCQkJCXN0YXRlID0gU0RMX0V2ZW50U3RhdGUoZXZlbnRfbGlzdFtpXSxTRExfUVVFUlkpOworCQkJCWlmICggc3RhdGUgPT0gU0RMX0VOQUJMRSApIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShldmVudF9saXN0KTsgKytpICkgeworCQkJCVNETF9FdmVudFN0YXRlKGV2ZW50X2xpc3RbaV0sIHN0YXRlKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwlyZXR1cm4oc3RhdGUpOworI2VuZGlmIC8qIFNETF9FVkVOVFNfRElTQUJMRUQgKi8KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svU0RMX2pveXN0aWNrX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svU0RMX2pveXN0aWNrX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTlkMTMwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9TRExfam95c3RpY2tfYy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBVc2VmdWwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZnJvbSBTRExfam95c3RpY2suYyAqLworI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgorCisvKiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBqb3lzdGlja3Mgb24gdGhlIHN5c3RlbSAqLworZXh0ZXJuIFVpbnQ4IFNETF9udW1qb3lzdGlja3M7CisKKy8qIEludGVybmFsIGV2ZW50IHF1ZXVlaW5nIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhTRExfSm95c3RpY2sgKmpveXN0aWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OCBheGlzLCBTaW50MTYgdmFsdWUpOworZXh0ZXJuIGludCBTRExfUHJpdmF0ZUpveXN0aWNrQmFsbChTRExfSm95c3RpY2sgKmpveXN0aWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OCBiYWxsLCBTaW50MTYgeHJlbCwgU2ludDE2IHlyZWwpOworZXh0ZXJuIGludCBTRExfUHJpdmF0ZUpveXN0aWNrSGF0KFNETF9Kb3lzdGljayAqam95c3RpY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OCBoYXQsIFVpbnQ4IHZhbHVlKTsKK2V4dGVybiBpbnQgU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihTRExfSm95c3RpY2sgKmpveXN0aWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQ4IGJ1dHRvbiwgVWludDggc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9TRExfc3lzam95c3RpY2suaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svU0RMX3N5c2pveXN0aWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExYjc2YQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svU0RMX3N5c2pveXN0aWNrLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBTRExfZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaGlzIGlzIHRoZSBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZvciB0aGUgU0RMIGpveXN0aWNrIEFQSSAqLworCisjaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCisKKy8qIFRoZSBTREwgam95c3RpY2sgc3RydWN0dXJlICovCitzdHJ1Y3QgX1NETF9Kb3lzdGljayB7CisJVWludDggaW5kZXg7CQkvKiBEZXZpY2UgaW5kZXggKi8KKwljb25zdCBjaGFyICpuYW1lOwkvKiBKb3lzdGljayBuYW1lIC0gc3lzdGVtIGRlcGVuZGVudCAqLworCisJaW50IG5heGVzOwkJLyogTnVtYmVyIG9mIGF4aXMgY29udHJvbHMgb24gdGhlIGpveXN0aWNrICovCisJU2ludDE2ICpheGVzOwkJLyogQ3VycmVudCBheGlzIHN0YXRlcyAqLworCisJaW50IG5oYXRzOwkJLyogTnVtYmVyIG9mIGhhdHMgb24gdGhlIGpveXN0aWNrICovCisJVWludDggKmhhdHM7CQkvKiBDdXJyZW50IGhhdCBzdGF0ZXMgKi8KKwkKKwlpbnQgbmJhbGxzOwkJLyogTnVtYmVyIG9mIHRyYWNrYmFsbHMgb24gdGhlIGpveXN0aWNrICovCisJc3RydWN0IGJhbGxkZWx0YSB7CisJCWludCBkeDsKKwkJaW50IGR5OworCX0gKmJhbGxzOwkJLyogQ3VycmVudCBiYWxsIG1vdGlvbiBkZWx0YXMgKi8KKwkKKwlpbnQgbmJ1dHRvbnM7CQkvKiBOdW1iZXIgb2YgYnV0dG9ucyBvbiB0aGUgam95c3RpY2sgKi8KKwlVaW50OCAqYnV0dG9uczsJCS8qIEN1cnJlbnQgYnV0dG9uIHN0YXRlcyAqLworCQorCXN0cnVjdCBqb3lzdGlja19od2RhdGEgKmh3ZGF0YTsJLyogRHJpdmVyIGRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLworCisJaW50IHJlZl9jb3VudDsJCS8qIFJlZmVyZW5jZSBjb3VudCBmb3IgbXVsdGlwbGUgb3BlbnMgKi8KK307CisKKy8qIEZ1bmN0aW9uIHRvIHNjYW4gdGhlIHN5c3RlbSBmb3Igam95c3RpY2tzLgorICogSm95c3RpY2sgMCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IGpveXN0aWNrLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGpveXN0aWNrcywgb3IgLTEKKyAqIG9uIGFuIHVucmVjb3ZlcmFibGUgZmF0YWwgZXJyb3IuCisgKi8KK2V4dGVybiBpbnQgU0RMX1NZU19Kb3lzdGlja0luaXQodm9pZCk7CisKKy8qIEZ1bmN0aW9uIHRvIGdldCB0aGUgZGV2aWNlLWRlcGVuZGVudCBuYW1lIG9mIGEgam95c3RpY2sgKi8KK2V4dGVybiBjb25zdCBjaGFyICpTRExfU1lTX0pveXN0aWNrTmFtZShpbnQgaW5kZXgpOworCisvKiBGdW5jdGlvbiB0byBvcGVuIGEgam95c3RpY2sgZm9yIHVzZS4KKyAgIFRoZSBqb3lzdGljayB0byBvcGVuIGlzIHNwZWNpZmllZCBieSB0aGUgaW5kZXggZmllbGQgb2YgdGhlIGpveXN0aWNrLgorICAgVGhpcyBzaG91bGQgZmlsbCB0aGUgbmJ1dHRvbnMgYW5kIG5heGVzIGZpZWxkcyBvZiB0aGUgam95c3RpY2sgc3RydWN0dXJlLgorICAgSXQgcmV0dXJucyAwLCBvciAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAqLworZXh0ZXJuIGludCBTRExfU1lTX0pveXN0aWNrT3BlbihTRExfSm95c3RpY2sgKmpveXN0aWNrKTsKKworLyogRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiBhIGpveXN0aWNrIC0gY2FsbGVkIGFzIGEgZGV2aWNlIHBvbGwuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZG4ndCB1cGRhdGUgdGhlIGpveXN0aWNrIHN0cnVjdHVyZSBkaXJlY3RseSwKKyAqIGJ1dCBpbnN0ZWFkIHNob3VsZCBjYWxsIFNETF9Qcml2YXRlSm95c3RpY2sqKCkgdG8gZGVsaXZlciBldmVudHMKKyAqIGFuZCB1cGRhdGUgam95c3RpY2sgZGV2aWNlIHN0YXRlLgorICovCitleHRlcm4gdm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spOworCisvKiBGdW5jdGlvbiB0byBjbG9zZSBhIGpveXN0aWNrIGFmdGVyIHVzZSAqLworZXh0ZXJuIHZvaWQgU0RMX1NZU19Kb3lzdGlja0Nsb3NlKFNETF9Kb3lzdGljayAqam95c3RpY2spOworCisvKiBGdW5jdGlvbiB0byBwZXJmb3JtIGFueSBzeXN0ZW0tc3BlY2lmaWMgam95c3RpY2sgcmVsYXRlZCBjbGVhbnVwICovCitleHRlcm4gdm9pZCBTRExfU1lTX0pveXN0aWNrUXVpdCh2b2lkKTsKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9iZW9zL1NETF9iZWpveXN0aWNrLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9iZW9zL1NETF9iZWpveXN0aWNrLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGEzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL2Jlb3MvU0RMX2Jlam95c3RpY2suY2MKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0pPWVNUSUNLX0JFT1MKKworLyogVGhpcyBpcyB0aGUgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmb3IgdGhlIFNETCBqb3lzdGljayBBUEkgKi8KKworI2luY2x1ZGUgPGJlL3N1cHBvcnQvU3RyaW5nLmg+CisjaW5jbHVkZSA8YmUvZGV2aWNlL0pveXN0aWNrLmg+CisKK2V4dGVybiAiQyIgeworCisjaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c2pveXN0aWNrLmgiCisjaW5jbHVkZSAiLi4vU0RMX2pveXN0aWNrX2MuaCIKKworCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygam95c3RpY2tzIHdlJ2xsIGRldGVjdCAqLworI2RlZmluZSBNQVhfSk9ZU1RJQ0tTCTE2CQorCisvKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIGpveXN0aWNrcyAqLworc3RhdGljIGNoYXIgKlNETF9qb3lwb3J0W01BWF9KT1lTVElDS1NdOworc3RhdGljIGNoYXIgKlNETF9qb3luYW1lW01BWF9KT1lTVElDS1NdOworCisvKiBUaGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGEgam95c3RpY2sgKi8KK3N0cnVjdCBqb3lzdGlja19od2RhdGEgeworCUJKb3lzdGljayAqc3RpY2s7CisJdWludDggKm5ld19oYXRzOworCWludDE2ICpuZXdfYXhlczsKK307CisKKy8qIEZ1bmN0aW9uIHRvIHNjYW4gdGhlIHN5c3RlbSBmb3Igam95c3RpY2tzLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgc2V0IFNETF9udW1qb3lzdGlja3MgdG8gdGhlIG51bWJlciBvZiBhdmFpbGFibGUKKyAqIGpveXN0aWNrcy4gIEpveXN0aWNrIDAgc2hvdWxkIGJlIHRoZSBzeXN0ZW0gZGVmYXVsdCBqb3lzdGljay4KKyAqIEl0IHNob3VsZCByZXR1cm4gMCwgb3IgLTEgb24gYW4gdW5yZWNvdmVyYWJsZSBmYXRhbCBlcnJvci4KKyAqLworaW50IFNETF9TWVNfSm95c3RpY2tJbml0KHZvaWQpCit7CisJQkpveXN0aWNrIGpveXN0aWNrOworCWludCBudW1qb3lzdGlja3M7CisJaW50IGk7CisJaW50MzIgbnBvcnRzOworCWNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKKwkKKwkvKiBTZWFyY2ggZm9yIGF0dGFjaGVkIGpveXN0aWNrcyAqLworCW5wb3J0cyA9IGpveXN0aWNrLkNvdW50RGV2aWNlcygpOworCW51bWpveXN0aWNrcyA9IDA7CisJU0RMX21lbXNldChTRExfam95cG9ydCwgMCwgKHNpemVvZiBTRExfam95cG9ydCkpOworCVNETF9tZW1zZXQoU0RMX2pveW5hbWUsIDAsIChzaXplb2YgU0RMX2pveW5hbWUpKTsKKwlmb3IgKCBpPTA7IChTRExfbnVtam95c3RpY2tzIDwgTUFYX0pPWVNUSUNLUykgJiYgKGkgPCBucG9ydHMpOyArK2kgKSB7CisJCWlmICggam95c3RpY2suR2V0RGV2aWNlTmFtZShpLCBuYW1lKSA9PSBCX09LICkgeworCQkJaWYgKCBqb3lzdGljay5PcGVuKG5hbWUpICE9IEJfRVJST1IgKSB7CisJCQkJQlN0cmluZyBzdGlja19uYW1lOworCQkJCWpveXN0aWNrLkdldENvbnRyb2xsZXJOYW1lKCZzdGlja19uYW1lKTsKKwkJCQlTRExfam95cG9ydFtudW1qb3lzdGlja3NdID0gc3RyZHVwKG5hbWUpOworCQkJCVNETF9qb3luYW1lW251bWpveXN0aWNrc10gPQorCQkJCQkgICAgICAgICAgIHN0cmR1cChzdGlja19uYW1lLlN0cmluZygpKTsKKwkJCQludW1qb3lzdGlja3MrKzsKKwkJCQlqb3lzdGljay5DbG9zZSgpOworCQkJfQorCQl9CisJfQorCXJldHVybihudW1qb3lzdGlja3MpOworfQorCisvKiBGdW5jdGlvbiB0byBnZXQgdGhlIGRldmljZS1kZXBlbmRlbnQgbmFtZSBvZiBhIGpveXN0aWNrICovCitjb25zdCBjaGFyICpTRExfU1lTX0pveXN0aWNrTmFtZShpbnQgaW5kZXgpCit7CisJcmV0dXJuIFNETF9qb3luYW1lW2luZGV4XTsKK30KKworLyogRnVuY3Rpb24gdG8gb3BlbiBhIGpveXN0aWNrIGZvciB1c2UuCisgICBUaGUgam95c3RpY2sgdG8gb3BlbiBpcyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGZpZWxkIG9mIHRoZSBqb3lzdGljay4KKyAgIFRoaXMgc2hvdWxkIGZpbGwgdGhlIG5idXR0b25zIGFuZCBuYXhlcyBmaWVsZHMgb2YgdGhlIGpveXN0aWNrIHN0cnVjdHVyZS4KKyAgIEl0IHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgKi8KK2ludCBTRExfU1lTX0pveXN0aWNrT3BlbihTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCUJKb3lzdGljayAqc3RpY2s7CisKKwkvKiBDcmVhdGUgdGhlIGpveXN0aWNrIGRhdGEgc3RydWN0dXJlICovCisJam95c3RpY2stPmh3ZGF0YSA9IChzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhICopCisJICAgICAgICAgICAgICAgICAgIFNETF9tYWxsb2Moc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7CisJaWYgKCBqb3lzdGljay0+aHdkYXRhID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oLTEpOworCX0KKwlTRExfbWVtc2V0KGpveXN0aWNrLT5od2RhdGEsIDAsIHNpemVvZigqam95c3RpY2stPmh3ZGF0YSkpOworCXN0aWNrID0gbmV3IEJKb3lzdGljazsKKwlqb3lzdGljay0+aHdkYXRhLT5zdGljayA9IHN0aWNrOworCisJLyogT3BlbiB0aGUgcmVxdWVzdGVkIGpveXN0aWNrIGZvciB1c2UgKi8KKwlpZiAoIHN0aWNrLT5PcGVuKFNETF9qb3lwb3J0W2pveXN0aWNrLT5pbmRleF0pID09IEJfRVJST1IgKSB7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gam95c3RpY2siKTsKKwkJU0RMX1NZU19Kb3lzdGlja0Nsb3NlKGpveXN0aWNrKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBTZXQgdGhlIGpveXN0aWNrIHRvIGNhbGlicmF0ZWQgbW9kZSAqLworCXN0aWNrLT5FbmFibGVDYWxpYnJhdGlvbigpOworCisJLyogR2V0IHRoZSBudW1iZXIgb2YgYnV0dG9ucywgaGF0cywgYW5kIGF4ZXMgb24gdGhlIGpveXN0aWNrICovCisJam95c3RpY2stPm5idXR0b25zID0gc3RpY2stPkNvdW50QnV0dG9ucygpOworCWpveXN0aWNrLT5uYXhlcyA9IHN0aWNrLT5Db3VudEF4ZXMoKTsKKwlqb3lzdGljay0+bmhhdHMgPSBzdGljay0+Q291bnRIYXRzKCk7CisKKwlqb3lzdGljay0+aHdkYXRhLT5uZXdfYXhlcyA9IChpbnQxNiAqKQorCSAgICAgICAgICAgICAgICAgIFNETF9tYWxsb2Moam95c3RpY2stPm5heGVzKnNpemVvZihpbnQxNikpOworCWpveXN0aWNrLT5od2RhdGEtPm5ld19oYXRzID0gKHVpbnQ4ICopCisJICAgICAgICAgICAgICAgICAgU0RMX21hbGxvYyhqb3lzdGljay0+bmhhdHMqc2l6ZW9mKHVpbnQ4KSk7CisJaWYgKCAhIGpveXN0aWNrLT5od2RhdGEtPm5ld19oYXRzIHx8ICEgam95c3RpY2stPmh3ZGF0YS0+bmV3X2F4ZXMgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlTRExfU1lTX0pveXN0aWNrQ2xvc2Uoam95c3RpY2spOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKDApOworfQorCisvKiBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHN0YXRlIG9mIGEgam95c3RpY2sgLSBjYWxsZWQgYXMgYSBkZXZpY2UgcG9sbC4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IHVwZGF0ZSB0aGUgam95c3RpY2sgc3RydWN0dXJlIGRpcmVjdGx5LAorICogYnV0IGluc3RlYWQgc2hvdWxkIGNhbGwgU0RMX1ByaXZhdGVKb3lzdGljayooKSB0byBkZWxpdmVyIGV2ZW50cworICogYW5kIHVwZGF0ZSBqb3lzdGljayBkZXZpY2Ugc3RhdGUuCisgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1VwZGF0ZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCXN0YXRpYyBjb25zdCBVaW50OCBoYXRfbWFwWzldID0geworICAgICAgICAgICAgIFNETF9IQVRfQ0VOVEVSRUQsCisgICAgICAgICAgICAgU0RMX0hBVF9VUCwKKyAgICAgICAgICAgICBTRExfSEFUX1JJR0hUVVAsCisgICAgICAgICAgICAgU0RMX0hBVF9SSUdIVCwKKyAgICAgICAgICAgICBTRExfSEFUX1JJR0hURE9XTiwKKyAgICAgICAgICAgICBTRExfSEFUX0RPV04sCisgICAgICAgICAgICAgU0RMX0hBVF9MRUZURE9XTiwKKyAgICAgICAgICAgICBTRExfSEFUX0xFRlQsCisgICAgICAgICAgICAgU0RMX0hBVF9MRUZUVVAKKwl9OworCWNvbnN0IGludCBKSVRURVIgPSAoMzI3NjgvMTApOwkvKiAxMCUgaml0dGVyIHRocmVzaG9sZCAob2s/KSAqLworCisJQkpveXN0aWNrICpzdGljazsKKwlpbnQgaSwgY2hhbmdlOworCWludDE2ICpheGVzOworCXVpbnQ4ICpoYXRzOworCXVpbnQzMiBidXR0b25zOworCisJLyogU2V0IHVwIGRhdGEgcG9pbnRlcnMgKi8KKwlzdGljayA9IGpveXN0aWNrLT5od2RhdGEtPnN0aWNrOworCWF4ZXMgPSBqb3lzdGljay0+aHdkYXRhLT5uZXdfYXhlczsKKwloYXRzID0gam95c3RpY2stPmh3ZGF0YS0+bmV3X2hhdHM7CisKKwkvKiBHZXQgdGhlIG5ldyBqb3lzdGljayBzdGF0ZSAqLworCXN0aWNrLT5VcGRhdGUoKTsKKwlzdGljay0+R2V0QXhpc1ZhbHVlcyhheGVzKTsKKwlzdGljay0+R2V0SGF0VmFsdWVzKGhhdHMpOworCWJ1dHRvbnMgPSBzdGljay0+QnV0dG9uVmFsdWVzKCk7CisKKwkvKiBHZW5lcmF0ZSBheGlzIG1vdGlvbiBldmVudHMgKi8KKwlmb3IgKCBpPTA7IGk8am95c3RpY2stPm5heGVzOyArK2kgKSB7CisJCWNoYW5nZSA9ICgoaW50MzIpYXhlc1tpXSAtIGpveXN0aWNrLT5heGVzW2ldKTsKKwkJaWYgKCAoY2hhbmdlID4gSklUVEVSKSB8fCAoY2hhbmdlIDwgLUpJVFRFUikgKSB7CisJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywgaSwgYXhlc1tpXSk7CisJCX0KKwl9CisKKwkvKiBHZW5lcmF0ZSBoYXQgY2hhbmdlIGV2ZW50cyAqLworCWZvciAoIGk9MDsgaTxqb3lzdGljay0+bmhhdHM7ICsraSApIHsKKwkJaWYgKCBoYXRzW2ldICE9IGpveXN0aWNrLT5oYXRzW2ldICkgeworCQkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgaSwgaGF0X21hcFtoYXRzW2ldXSk7CisJCX0KKwl9CisKKwkvKiBHZW5lcmF0ZSBidXR0b24gZXZlbnRzICovCisJZm9yICggaT0wOyBpPGpveXN0aWNrLT5uYnV0dG9uczsgKytpICkgeworCQlpZiAoIChidXR0b25zJjB4MDEpICE9IGpveXN0aWNrLT5idXR0b25zW2ldICkgeworCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywgaSwgKGJ1dHRvbnMmMHgwMSkpOworCQl9CisJCWJ1dHRvbnMgPj49IDE7CisJfQorfQorCisvKiBGdW5jdGlvbiB0byBjbG9zZSBhIGpveXN0aWNrIGFmdGVyIHVzZSAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpZiAoIGpveXN0aWNrLT5od2RhdGEgKSB7CisJCWpveXN0aWNrLT5od2RhdGEtPnN0aWNrLT5DbG9zZSgpOworCQlkZWxldGUgam95c3RpY2stPmh3ZGF0YS0+c3RpY2s7CisJCWlmICggam95c3RpY2stPmh3ZGF0YS0+bmV3X2hhdHMgKSB7CisJCQlTRExfZnJlZShqb3lzdGljay0+aHdkYXRhLT5uZXdfaGF0cyk7CisJCX0KKwkJaWYgKCBqb3lzdGljay0+aHdkYXRhLT5uZXdfYXhlcyApIHsKKwkJCVNETF9mcmVlKGpveXN0aWNrLT5od2RhdGEtPm5ld19heGVzKTsKKwkJfQorCQlTRExfZnJlZShqb3lzdGljay0+aHdkYXRhKTsKKwkJam95c3RpY2stPmh3ZGF0YSA9IE5VTEw7CisJfQorfQorCisvKiBGdW5jdGlvbiB0byBwZXJmb3JtIGFueSBzeXN0ZW0tc3BlY2lmaWMgam95c3RpY2sgcmVsYXRlZCBjbGVhbnVwICovCit2b2lkIFNETF9TWVNfSm95c3RpY2tRdWl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKCBpPTA7IFNETF9qb3lwb3J0W2ldOyArK2kgKSB7CisJCVNETF9mcmVlKFNETF9qb3lwb3J0W2ldKTsKKwl9CisJU0RMX2pveXBvcnRbMF0gPSBOVUxMOworCisJZm9yICggaT0wOyBTRExfam95bmFtZVtpXTsgKytpICkgeworCQlTRExfZnJlZShTRExfam95bmFtZVtpXSk7CisJfQorCVNETF9qb3luYW1lWzBdID0gTlVMTDsKK30KKworfTsgLy8gZXh0ZXJuICJDIgorCisjZW5kaWYgLyogU0RMX0pPWVNUSUNLX0JFT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svYnNkL1NETF9zeXNqb3lzdGljay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9ic2QvU0RMX3N5c2pveXN0aWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwZmM2MgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svYnNkL1NETF9zeXNqb3lzdGljay5jCkBAIC0wLDAgKzEsNjA4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9KT1lTVElDS19VU0JISUQKKworLyoKKyAqIEpveXN0aWNrIGRyaXZlciBmb3IgdGhlIHVoaWQoNCkgaW50ZXJmYWNlIGZvdW5kIGluIE9wZW5CU0QsCisgKiBOZXRCU0QgYW5kIEZyZWVCU0QuCisgKgorICogTWFpbnRhaW5lcjogPHZlZGdlIGF0IGNzb2Z0Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZm5kZWYgX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uCisjZGVmaW5lIF9fRnJlZUJTRF9rZXJuZWxfdmVyc2lvbiBfX0ZyZWVCU0RfdmVyc2lvbgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfVVNCX0gpCisjaW5jbHVkZSA8dXNiLmg+CisjZW5kaWYKKyNpZmRlZiBfX0RyYWdvbkZseV9fCisjaW5jbHVkZSA8YnVzL3VzYi91c2IuaD4KKyNpbmNsdWRlIDxidXMvdXNiL3VzYmhpZC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxkZXYvdXNiL3VzYi5oPgorI2luY2x1ZGUgPGRldi91c2IvdXNiaGlkLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9VU0JISURfSCkKKyNpbmNsdWRlIDx1c2JoaWQuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9MSUJVU0JfSCkKKyNpbmNsdWRlIDxsaWJ1c2IuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9MSUJVU0JISURfSCkKKyNpbmNsdWRlIDxsaWJ1c2JoaWQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0ZSRUVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisjaWZuZGVmIF9fRHJhZ29uRmx5X18KKyNpbmNsdWRlIDxvc3JlbGRhdGUuaD4KKyNlbmRpZgorI2lmIF9fRnJlZUJTRF9rZXJuZWxfdmVyc2lvbiA+IDgwMDA2MworI2luY2x1ZGUgPGRldi91c2IvdXNiX2lvY3RsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvam95c3RpY2suaD4KKyNlbmRpZgorCisjaWYgU0RMX0pPWVNUSUNLX1VTQkhJRF9NQUNISU5FX0pPWVNUSUNLX0gKKyNpbmNsdWRlIDxtYWNoaW5lL2pveXN0aWNrLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNqb3lzdGljay5oIgorI2luY2x1ZGUgIi4uL1NETF9qb3lzdGlja19jLmgiCisKKyNkZWZpbmUgTUFYX1VISURfSk9ZUwk0CisjZGVmaW5lIE1BWF9KT1lfSk9ZUwkyCisjZGVmaW5lIE1BWF9KT1lTCShNQVhfVUhJRF9KT1lTICsgTUFYX0pPWV9KT1lTKQorCitzdHJ1Y3QgcmVwb3J0IHsKKyNpZiBkZWZpbmVkKF9fRlJFRUJTRF9fKSAmJiAoX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uID4gODAwMDYzKQorCXN0cnVjdAl1c2JfZ2VuX2Rlc2NyaXB0b3IgKmJ1ZjsJLyogQnVmZmVyICovCisjZWxzZQorCXN0cnVjdAl1c2JfY3RsX3JlcG9ydCAqYnVmOwkvKiBCdWZmZXIgKi8KKyNlbmRpZgorCXNpemVfdAlzaXplOwkJCS8qIEJ1ZmZlciBzaXplICovCisJaW50CXJpZDsJCQkvKiBSZXBvcnQgSUQgKi8KKwllbnVtIHsKKwkJU1JFUE9SVF9VTklOSVQsCisJCVNSRVBPUlRfQ0xFQU4sCisJCVNSRVBPUlRfRElSVFkKKwl9IHN0YXR1czsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCWludAl1aGlkX3JlcG9ydDsKKwloaWRfa2luZF90IGtpbmQ7CisJY29uc3QJY2hhciAqbmFtZTsKK30gY29uc3QgcmVwaW5mb1tdID0geworCXsgVUhJRF9JTlBVVF9SRVBPUlQsCWhpZF9pbnB1dCwJImlucHV0IiB9LAorCXsgVUhJRF9PVVRQVVRfUkVQT1JULAloaWRfb3V0cHV0LAkib3V0cHV0IiB9LAorCXsgVUhJRF9GRUFUVVJFX1JFUE9SVCwJaGlkX2ZlYXR1cmUsCSJmZWF0dXJlIiB9Cit9OworCitlbnVtIHsKKwlSRVBPUlRfSU5QVVQgPSAwLAorCVJFUE9SVF9PVVRQVVQgPSAxLAorCVJFUE9SVF9GRUFUVVJFID0gMgorfTsKKworZW51bSB7CisJSk9ZQVhFX1gsCisJSk9ZQVhFX1ksCisJSk9ZQVhFX1osCisJSk9ZQVhFX1NMSURFUiwKKwlKT1lBWEVfV0hFRUwsCisJSk9ZQVhFX1JYLAorCUpPWUFYRV9SWSwKKwlKT1lBWEVfUlosCisJSk9ZQVhFX2NvdW50Cit9OworCitzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhIHsKKwlpbnQJZmQ7CisJY2hhcgkqcGF0aDsKKwllbnVtIHsKKwkJQlNESk9ZX1VISUQsCS8qIHVoaWQoNCkgKi8KKwkJQlNESk9ZX0pPWQkvKiBqb3koNCkgKi8KKwl9IHR5cGU7CisJc3RydWN0CXJlcG9ydF9kZXNjICpyZXBkZXNjOworCXN0cnVjdAlyZXBvcnQgaW5yZXBvcnQ7CisJaW50CWF4aXNfbWFwW0pPWUFYRV9jb3VudF07CS8qIG1hcCBwcmVzZW50IEpPWUFYRV8qIHRvIDAsMSwuLiovCisJaW50CXg7CisJaW50CXk7CisJaW50CXhtaW47CisJaW50CXltaW47CisJaW50CXhtYXg7CisJaW50CXltYXg7Cit9OworCitzdGF0aWMgY2hhciAqam95bmFtZXNbTUFYX0pPWVNdOworc3RhdGljIGNoYXIgKmpveWRldm5hbWVzW01BWF9KT1lTXTsKKworc3RhdGljIGludAlyZXBvcnRfYWxsb2Moc3RydWN0IHJlcG9ydCAqLCBzdHJ1Y3QgcmVwb3J0X2Rlc2MgKiwgaW50KTsKK3N0YXRpYyB2b2lkCXJlcG9ydF9mcmVlKHN0cnVjdCByZXBvcnQgKik7CisKKyNpZiBkZWZpbmVkKFVTQkhJRF9VQ1JfREFUQSkgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisjZGVmaW5lIFJFUF9CVUZfREFUQShyZXApICgocmVwKS0+YnVmLT51Y3JfZGF0YSkKKyNlbGlmIChkZWZpbmVkKF9fRlJFRUJTRF9fKSAmJiAoX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uID4gODAwMDYzKSkKKyNkZWZpbmUgUkVQX0JVRl9EQVRBKHJlcCkgKChyZXApLT5idWYtPnVnZF9kYXRhKQorI2Vsc2UKKyNkZWZpbmUgUkVQX0JVRl9EQVRBKHJlcCkgKChyZXApLT5idWYtPmRhdGEpCisjZW5kaWYKKworaW50CitTRExfU1lTX0pveXN0aWNrSW5pdCh2b2lkKQoreworCWNoYXIgc1sxNl07CisJaW50IGksIGZkOworCisJU0RMX251bWpveXN0aWNrcyA9IDA7CisKKwlTRExfbWVtc2V0KGpveW5hbWVzLCAwLCBzaXplb2Yoam95bmFtZXMpKTsKKwlTRExfbWVtc2V0KGpveWRldm5hbWVzLCAwLCBzaXplb2Yoam95ZGV2bmFtZXMpKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVUhJRF9KT1lTOyBpKyspIHsKKwkJU0RMX0pveXN0aWNrIG5qOworCisJCVNETF9zbnByaW50ZihzLCBTRExfYXJyYXlzaXplKHMpLCAiL2Rldi91aGlkJWQiLCBpKTsKKworCQluai5pbmRleCA9IFNETF9udW1qb3lzdGlja3M7CisJCWpveW5hbWVzW25qLmluZGV4XSA9IHN0cmR1cChzKTsKKworCQlpZiAoU0RMX1NZU19Kb3lzdGlja09wZW4oJm5qKSA9PSAwKSB7CisJCQlTRExfU1lTX0pveXN0aWNrQ2xvc2UoJm5qKTsKKwkJCVNETF9udW1qb3lzdGlja3MrKzsKKwkJfSBlbHNlIHsKKwkJCVNETF9mcmVlKGpveW5hbWVzW25qLmluZGV4XSk7CisJCQlqb3luYW1lc1tuai5pbmRleF0gPSBOVUxMOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfSk9ZX0pPWVM7IGkrKykgeworCQlTRExfc25wcmludGYocywgU0RMX2FycmF5c2l6ZShzKSwgIi9kZXYvam95JWQiLCBpKTsKKwkJZmQgPSBvcGVuKHMsIE9fUkRPTkxZKTsKKwkJaWYgKGZkICE9IC0xKSB7CisJCQlqb3luYW1lc1tTRExfbnVtam95c3RpY2tzKytdID0gc3RyZHVwKHMpOworCQkJY2xvc2UoZmQpOworCQl9CisJfQorCisJLyogUmVhZCB0aGUgZGVmYXVsdCBVU0IgSElEIHVzYWdlIHRhYmxlLiAqLworCWhpZF9pbml0KE5VTEwpOworCisJcmV0dXJuIChTRExfbnVtam95c3RpY2tzKTsKK30KKworY29uc3QgY2hhciAqCitTRExfU1lTX0pveXN0aWNrTmFtZShpbnQgaW5kZXgpCit7CisJaWYgKGpveWRldm5hbWVzW2luZGV4XSAhPSBOVUxMKSB7CisJCXJldHVybiAoam95ZGV2bmFtZXNbaW5kZXhdKTsKKwl9CisJcmV0dXJuIChqb3luYW1lc1tpbmRleF0pOworfQorCitzdGF0aWMgaW50Cit1c2FnZV90b19qb3lheGUodW5zaWduZWQgdXNhZ2UpCit7CisgICAgaW50IGpveWF4ZTsKKyAgICBzd2l0Y2ggKHVzYWdlKSB7CisgICAgY2FzZSBIVUdfWDoKKwlqb3lheGUgPSBKT1lBWEVfWDsgYnJlYWs7CisgICAgY2FzZSBIVUdfWToKKwlqb3lheGUgPSBKT1lBWEVfWTsgYnJlYWs7CisgICAgY2FzZSBIVUdfWjoKKwlqb3lheGUgPSBKT1lBWEVfWjsgYnJlYWs7CisgICAgY2FzZSBIVUdfU0xJREVSOgorCWpveWF4ZSA9IEpPWUFYRV9TTElERVI7IGJyZWFrOworICAgIGNhc2UgSFVHX1dIRUVMOgorCWpveWF4ZSA9IEpPWUFYRV9XSEVFTDsgYnJlYWs7CisgICAgY2FzZSBIVUdfUlg6CisJam95YXhlID0gSk9ZQVhFX1JYOyBicmVhazsKKyAgICBjYXNlIEhVR19SWToKKwlqb3lheGUgPSBKT1lBWEVfUlk7IGJyZWFrOworICAgIGNhc2UgSFVHX1JaOgorCWpveWF4ZSA9IEpPWUFYRV9SWjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKwlqb3lheGUgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIGpveWF4ZTsgICAgCit9CisKK3N0YXRpYyB1bnNpZ25lZAoraGF0dmFsX3RvX3NkbChTaW50MzIgaGF0dmFsKQoreworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBoYXRfZGlyX21hcFs4XSA9IHsKKwlTRExfSEFUX1VQLCBTRExfSEFUX1JJR0hUVVAsIFNETF9IQVRfUklHSFQsIFNETF9IQVRfUklHSFRET1dOLCAKKwlTRExfSEFUX0RPV04sIFNETF9IQVRfTEVGVERPV04sIFNETF9IQVRfTEVGVCwgU0RMX0hBVF9MRUZUVVAKKyAgICB9OworICAgIHVuc2lnbmVkIHJlc3VsdDsKKyAgICBpZiAoKGhhdHZhbCAmIDcpID09IGhhdHZhbCkgCisJcmVzdWx0ID0gaGF0X2Rpcl9tYXBbaGF0dmFsXTsKKyAgICBlbHNlIAorCXJlc3VsdCA9IFNETF9IQVRfQ0VOVEVSRUQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitpbnQKK1NETF9TWVNfSm95c3RpY2tPcGVuKFNETF9Kb3lzdGljayAqam95KQoreworCWNoYXIgKnBhdGggPSBqb3luYW1lc1tqb3ktPmluZGV4XTsKKwlzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhICpodzsKKwlzdHJ1Y3QgaGlkX2l0ZW0gaGl0ZW07CisJc3RydWN0IGhpZF9kYXRhICpoZGF0YTsKKwlzdHJ1Y3QgcmVwb3J0ICpyZXA7CisJaW50IGZkOworCWludCBpOworCisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJU0RMX1NldEVycm9yKCIlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlodyA9IChzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhICopU0RMX21hbGxvYyhzaXplb2Yoc3RydWN0IGpveXN0aWNrX2h3ZGF0YSkpOworCWlmIChodyA9PSBOVUxMKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQljbG9zZShmZCk7CisJCXJldHVybiAoLTEpOworCX0KKwlqb3ktPmh3ZGF0YSA9IGh3OworCWh3LT5mZCA9IGZkOworCWh3LT5wYXRoID0gc3RyZHVwKHBhdGgpOworCWh3LT54ID0gMDsKKwlody0+eSA9IDA7CisJaHctPnhtaW4gPSAweGZmZmY7CisJaHctPnltaW4gPSAweGZmZmY7CisJaHctPnhtYXggPSAwOworCWh3LT55bWF4ID0gMDsKKwlpZiAoISBTRExfc3RybmNtcChwYXRoLCAiL2Rldi9qb3kiLCA4KSkgeworCQlody0+dHlwZSA9IEJTREpPWV9KT1k7CisJCWpveS0+bmF4ZXMgPSAyOworCQlqb3ktPm5idXR0b25zID0gMjsKKwkJam95LT5uaGF0cyA9IDA7CisJCWpveS0+bmJhbGxzID0gMDsKKwkJam95ZGV2bmFtZXNbam95LT5pbmRleF0gPSBzdHJkdXAoIkdhbWVwb3J0IGpveXN0aWNrIik7CisJCWdvdG8gdXNiZW5kOworCX0gZWxzZSB7CisJCWh3LT50eXBlID0gQlNESk9ZX1VISUQ7CisJfQorCisJeworCSAgICBpbnQgYXg7CisJICAgIGZvciAoYXggPSAwOyBheCA8IEpPWUFYRV9jb3VudDsgYXgrKykKKwkJaHctPmF4aXNfbWFwW2F4XSA9IC0xOworCX0KKwlody0+cmVwZGVzYyA9IGhpZF9nZXRfcmVwb3J0X2Rlc2MoZmQpOworCWlmIChody0+cmVwZGVzYyA9PSBOVUxMKSB7CisJCVNETF9TZXRFcnJvcigiJXM6IFVTQl9HRVRfUkVQT1JUX0RFU0M6ICVzIiwgaHctPnBhdGgsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIHVzYmVycjsKKwl9CisJcmVwID0gJmh3LT5pbnJlcG9ydDsKKyNpZiBkZWZpbmVkKF9fRlJFRUJTRF9fKSAmJiAoX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uID4gODAwMDYzKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKyAgICAgICByZXAtPnJpZCA9IGhpZF9nZXRfcmVwb3J0X2lkKGZkKTsKKyAgICAgICBpZiAocmVwLT5yaWQgPCAwKSB7CisjZWxzZQorCWlmIChpb2N0bChmZCwgVVNCX0dFVF9SRVBPUlRfSUQsICZyZXAtPnJpZCkgPCAwKSB7CisjZW5kaWYKKwkJcmVwLT5yaWQgPSAtMTsgLyogWFhYICovCisJfQorCWlmIChyZXBvcnRfYWxsb2MocmVwLCBody0+cmVwZGVzYywgUkVQT1JUX0lOUFVUKSA8IDApIHsKKwkJZ290byB1c2JlcnI7CisJfQorCWlmIChyZXAtPnNpemUgPD0gMCkgeworCQlTRExfU2V0RXJyb3IoIiVzOiBJbnB1dCByZXBvcnQgZGVzY3JpcHRvciBoYXMgaW52YWxpZCBsZW5ndGgiLAorCQkgICAgaHctPnBhdGgpOworCQlnb3RvIHVzYmVycjsKKwl9CisKKyNpZiBkZWZpbmVkKFVTQkhJRF9ORVcpIHx8IChkZWZpbmVkKF9fRlJFRUJTRF9fKSAmJiBfX0ZyZWVCU0Rfa2VybmVsX3ZlcnNpb24gPj0gNTAwMTExKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKwloZGF0YSA9IGhpZF9zdGFydF9wYXJzZShody0+cmVwZGVzYywgMSA8PCBoaWRfaW5wdXQsIHJlcC0+cmlkKTsKKyNlbHNlCisJaGRhdGEgPSBoaWRfc3RhcnRfcGFyc2UoaHctPnJlcGRlc2MsIDEgPDwgaGlkX2lucHV0KTsKKyNlbmRpZgorCWlmIChoZGF0YSA9PSBOVUxMKSB7CisJCVNETF9TZXRFcnJvcigiJXM6IENhbm5vdCBzdGFydCBISUQgcGFyc2VyIiwgaHctPnBhdGgpOworCQlnb3RvIHVzYmVycjsKKwl9CisJam95LT5uYXhlcyA9IDA7CisJam95LT5uYnV0dG9ucyA9IDA7CisJam95LT5uaGF0cyA9IDA7CisJam95LT5uYmFsbHMgPSAwOworCWZvciAoaT0wOyBpPEpPWUFYRV9jb3VudDsgaSsrKQorCQlody0+YXhpc19tYXBbaV0gPSAtMTsKKworCXdoaWxlIChoaWRfZ2V0X2l0ZW0oaGRhdGEsICZoaXRlbSkgPiAwKSB7CisJCWNoYXIgKnNwOworCQljb25zdCBjaGFyICpzOworCisJCXN3aXRjaCAoaGl0ZW0ua2luZCkgeworCQljYXNlIGhpZF9jb2xsZWN0aW9uOgorCQkJc3dpdGNoIChISURfUEFHRShoaXRlbS51c2FnZSkpIHsKKwkJCWNhc2UgSFVQX0dFTkVSSUNfREVTS1RPUDoKKwkJCQlzd2l0Y2ggKEhJRF9VU0FHRShoaXRlbS51c2FnZSkpIHsKKwkJCQljYXNlIEhVR19KT1lTVElDSzoKKwkJCQljYXNlIEhVR19HQU1FX1BBRDoKKwkJCQkJcyA9IGhpZF91c2FnZV9pbl9wYWdlKGhpdGVtLnVzYWdlKTsKKwkJCQkJc3AgPSBTRExfbWFsbG9jKFNETF9zdHJsZW4ocykgKyA1KTsKKwkJCQkJU0RMX3NucHJpbnRmKHNwLCBTRExfc3RybGVuKHMpICsgNSwgIiVzICglZCkiLCBzLAorCQkJCQkgICAgam95LT5pbmRleCk7CisJCQkJCWpveWRldm5hbWVzW2pveS0+aW5kZXhdID0gc3A7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgaGlkX2lucHV0OgorCQkJc3dpdGNoIChISURfUEFHRShoaXRlbS51c2FnZSkpIHsKKwkJCWNhc2UgSFVQX0dFTkVSSUNfREVTS1RPUDogeworCQkJICAgIHVuc2lnbmVkIHVzYWdlID0gSElEX1VTQUdFKGhpdGVtLnVzYWdlKTsKKwkJCSAgICBpbnQgam95YXhlID0gdXNhZ2VfdG9fam95YXhlKHVzYWdlKTsKKwkJCSAgICBpZiAoam95YXhlID49IDApIHsKKwkJCQlody0+YXhpc19tYXBbam95YXhlXSA9IDE7CisJCQkgICAgfSBlbHNlIGlmICh1c2FnZSA9PSBIVUdfSEFUX1NXSVRDSCkgeworCQkJCWpveS0+bmhhdHMrKzsKKwkJCSAgICB9CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQljYXNlIEhVUF9CVVRUT046CisJCQkJam95LT5uYnV0dG9ucysrOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJaGlkX2VuZF9wYXJzZShoZGF0YSk7CisJZm9yIChpPTA7IGk8Sk9ZQVhFX2NvdW50OyBpKyspCisJCWlmIChody0+YXhpc19tYXBbaV0gPiAwKQorCQkJaHctPmF4aXNfbWFwW2ldID0gam95LT5uYXhlcysrOworCit1c2JlbmQ6CisJLyogVGhlIHBvbGwgYmxvY2tzIHRoZSBldmVudCB0aHJlYWQuICovCisJZmNudGwoZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworCisJcmV0dXJuICgwKTsKK3VzYmVycjoKKwljbG9zZShody0+ZmQpOworCVNETF9mcmVlKGh3LT5wYXRoKTsKKwlTRExfZnJlZShodyk7CisJcmV0dXJuICgtMSk7Cit9CisKK3ZvaWQKK1NETF9TWVNfSm95c3RpY2tVcGRhdGUoU0RMX0pveXN0aWNrICpqb3kpCit7CisJc3RydWN0IGhpZF9pdGVtIGhpdGVtOworCXN0cnVjdCBoaWRfZGF0YSAqaGRhdGE7CisJc3RydWN0IHJlcG9ydCAqcmVwOworCWludCBuYnV0dG9uLCBuYXhlID0gLTE7CisJU2ludDMyIHY7CisKKyNpZiBkZWZpbmVkKF9fRlJFRUJTRF9fKSB8fCBTRExfSk9ZU1RJQ0tfVVNCSElEX01BQ0hJTkVfSk9ZU1RJQ0tfSCB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKwlzdHJ1Y3Qgam95c3RpY2sgZ2FtZXBvcnQ7CisgCisJaWYgKGpveS0+aHdkYXRhLT50eXBlID09IEJTREpPWV9KT1kpIHsKKwkJaWYgKHJlYWQoam95LT5od2RhdGEtPmZkLCAmZ2FtZXBvcnQsIHNpemVvZiBnYW1lcG9ydCkgIT0gc2l6ZW9mIGdhbWVwb3J0KQorCQkJcmV0dXJuOworCQlpZiAoYWJzKGpveS0+aHdkYXRhLT54IC0gZ2FtZXBvcnQueCkgPiA4KSB7CisJCQlqb3ktPmh3ZGF0YS0+eCA9IGdhbWVwb3J0Lng7CisJCQlpZiAoam95LT5od2RhdGEtPnggPCBqb3ktPmh3ZGF0YS0+eG1pbikgeworCQkJCWpveS0+aHdkYXRhLT54bWluID0gam95LT5od2RhdGEtPng7CisJCQl9CisJCQlpZiAoam95LT5od2RhdGEtPnggPiBqb3ktPmh3ZGF0YS0+eG1heCkgeworCQkJCWpveS0+aHdkYXRhLT54bWF4ID0gam95LT5od2RhdGEtPng7CisJCQl9CisJCQlpZiAoam95LT5od2RhdGEtPnhtaW4gPT0gam95LT5od2RhdGEtPnhtYXgpIHsKKwkJCQlqb3ktPmh3ZGF0YS0+eG1pbi0tOworCQkJCWpveS0+aHdkYXRhLT54bWF4Kys7CisJCQl9CisJCQl2ID0gKFNpbnQzMilqb3ktPmh3ZGF0YS0+eDsKKwkJCXYgLT0gKGpveS0+aHdkYXRhLT54bWF4ICsgam95LT5od2RhdGEtPnhtaW4gKyAxKS8yOworCQkJdiAqPSAzMjc2OC8oKGpveS0+aHdkYXRhLT54bWF4IC0gam95LT5od2RhdGEtPnhtaW4gKyAxKS8yKTsKKwkJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveSwgMCwgdik7CisJCX0KKwkJaWYgKGFicyhqb3ktPmh3ZGF0YS0+eSAtIGdhbWVwb3J0LnkpID4gOCkgeworCQkJam95LT5od2RhdGEtPnkgPSBnYW1lcG9ydC55OworCQkJaWYgKGpveS0+aHdkYXRhLT55IDwgam95LT5od2RhdGEtPnltaW4pIHsKKwkJCQlqb3ktPmh3ZGF0YS0+eW1pbiA9IGpveS0+aHdkYXRhLT55OworCQkJfQorCQkJaWYgKGpveS0+aHdkYXRhLT55ID4gam95LT5od2RhdGEtPnltYXgpIHsKKwkJCQlqb3ktPmh3ZGF0YS0+eW1heCA9IGpveS0+aHdkYXRhLT55OworCQkJfQorCQkJaWYgKGpveS0+aHdkYXRhLT55bWluID09IGpveS0+aHdkYXRhLT55bWF4KSB7CisJCQkJam95LT5od2RhdGEtPnltaW4tLTsKKwkJCQlqb3ktPmh3ZGF0YS0+eW1heCsrOworCQkJfQorCQkJdiA9IChTaW50MzIpam95LT5od2RhdGEtPnk7CisJCQl2IC09IChqb3ktPmh3ZGF0YS0+eW1heCArIGpveS0+aHdkYXRhLT55bWluICsgMSkvMjsKKwkJCXYgKj0gMzI3NjgvKChqb3ktPmh3ZGF0YS0+eW1heCAtIGpveS0+aHdkYXRhLT55bWluICsgMSkvMik7CisJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3ksIDEsIHYpOworCQl9CisJCWlmIChnYW1lcG9ydC5iMSAhPSBqb3ktPmJ1dHRvbnNbMF0pIHsKKwkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95LCAwLCBnYW1lcG9ydC5iMSk7CisJCX0KKwkJaWYgKGdhbWVwb3J0LmIyICE9IGpveS0+YnV0dG9uc1sxXSkgeworCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3ksIDEsIGdhbWVwb3J0LmIyKTsKKwkJfQorCQlyZXR1cm47CisJfQorI2VuZGlmIC8qIGRlZmluZWQoX19GUkVFQlNEX18pIHx8IFNETF9KT1lTVElDS19VU0JISURfTUFDSElORV9KT1lTVElDS19IICovCisJCisJcmVwID0gJmpveS0+aHdkYXRhLT5pbnJlcG9ydDsKKworCWlmIChyZWFkKGpveS0+aHdkYXRhLT5mZCwgUkVQX0JVRl9EQVRBKHJlcCksIHJlcC0+c2l6ZSkgIT0gcmVwLT5zaXplKSB7CisJCXJldHVybjsKKwl9CisjaWYgZGVmaW5lZChVU0JISURfTkVXKSB8fCAoZGVmaW5lZChfX0ZSRUVCU0RfXykgJiYgX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uID49IDUwMDExMSkgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisJaGRhdGEgPSBoaWRfc3RhcnRfcGFyc2Uoam95LT5od2RhdGEtPnJlcGRlc2MsIDEgPDwgaGlkX2lucHV0LCByZXAtPnJpZCk7CisjZWxzZQorCWhkYXRhID0gaGlkX3N0YXJ0X3BhcnNlKGpveS0+aHdkYXRhLT5yZXBkZXNjLCAxIDw8IGhpZF9pbnB1dCk7CisjZW5kaWYKKwlpZiAoaGRhdGEgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDYW5ub3Qgc3RhcnQgSElEIHBhcnNlclxuIiwKKwkJICAgIGpveS0+aHdkYXRhLT5wYXRoKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAobmJ1dHRvbiA9IDA7IGhpZF9nZXRfaXRlbShoZGF0YSwgJmhpdGVtKSA+IDA7KSB7CisJCXN3aXRjaCAoaGl0ZW0ua2luZCkgeworCQljYXNlIGhpZF9pbnB1dDoKKwkJCXN3aXRjaCAoSElEX1BBR0UoaGl0ZW0udXNhZ2UpKSB7CisJCQljYXNlIEhVUF9HRU5FUklDX0RFU0tUT1A6IHsKKwkJCSAgICB1bnNpZ25lZCB1c2FnZSA9IEhJRF9VU0FHRShoaXRlbS51c2FnZSk7CisJCQkgICAgaW50IGpveWF4ZSA9IHVzYWdlX3RvX2pveWF4ZSh1c2FnZSk7CisJCQkgICAgaWYgKGpveWF4ZSA+PSAwKSB7CisJCQkJbmF4ZSA9IGpveS0+aHdkYXRhLT5heGlzX21hcFtqb3lheGVdOworCQkJCS8qIHNjYWxlYXhlICovCisJCQkJdiA9IChTaW50MzIpaGlkX2dldF9kYXRhKFJFUF9CVUZfREFUQShyZXApLAorCQkJCQkJCSAmaGl0ZW0pOworCQkJCXYgLT0gKGhpdGVtLmxvZ2ljYWxfbWF4aW11bSArIGhpdGVtLmxvZ2ljYWxfbWluaW11bSArIDEpLzI7CisJCQkJdiAqPSAzMjc2OC8oKGhpdGVtLmxvZ2ljYWxfbWF4aW11bSAtIGhpdGVtLmxvZ2ljYWxfbWluaW11bSArIDEpLzIpOworCQkJCWlmICh2ICE9IGpveS0+YXhlc1tuYXhlXSkgeworCQkJCSAgICBTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3ksIG5heGUsIHYpOworCQkJCX0KKwkJCSAgICB9IGVsc2UgaWYgKHVzYWdlID09IEhVR19IQVRfU1dJVENIKSB7CisJCQkJdiA9IChTaW50MzIpaGlkX2dldF9kYXRhKFJFUF9CVUZfREFUQShyZXApLAorCQkJCQkJCSAmaGl0ZW0pOworCQkJCVNETF9Qcml2YXRlSm95c3RpY2tIYXQoam95LCAwLAorCQkJCQloYXR2YWxfdG9fc2RsKHYpLWhpdGVtLmxvZ2ljYWxfbWluaW11bSk7CisJCQkgICAgfQorCQkJICAgIGJyZWFrOworCQkJfQorCQkJY2FzZSBIVVBfQlVUVE9OOgorCQkJCXYgPSAoU2ludDMyKWhpZF9nZXRfZGF0YShSRVBfQlVGX0RBVEEocmVwKSwKKwkJCQkgICAgJmhpdGVtKTsKKwkJCQlpZiAoam95LT5idXR0b25zW25idXR0b25dICE9IHYpIHsKKwkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3ksCisJCQkJCSAgICBuYnV0dG9uLCB2KTsKKwkJCQl9CisJCQkJbmJ1dHRvbisrOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJaGlkX2VuZF9wYXJzZShoZGF0YSk7CisKKwlyZXR1cm47Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGNsb3NlIGEgam95c3RpY2sgYWZ0ZXIgdXNlICovCit2b2lkCitTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3kpCit7CisJaWYgKFNETF9zdHJuY21wKGpveS0+aHdkYXRhLT5wYXRoLCAiL2Rldi9qb3kiLCA4KSkJeworCQlyZXBvcnRfZnJlZSgmam95LT5od2RhdGEtPmlucmVwb3J0KTsKKwkJaGlkX2Rpc3Bvc2VfcmVwb3J0X2Rlc2Moam95LT5od2RhdGEtPnJlcGRlc2MpOworCX0KKwljbG9zZShqb3ktPmh3ZGF0YS0+ZmQpOworCVNETF9mcmVlKGpveS0+aHdkYXRhLT5wYXRoKTsKKwlTRExfZnJlZShqb3ktPmh3ZGF0YSk7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQKK1NETF9TWVNfSm95c3RpY2tRdWl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0pPWVM7IGkrKykgeworCQlpZiAoam95bmFtZXNbaV0gIT0gTlVMTCkKKwkJCVNETF9mcmVlKGpveW5hbWVzW2ldKTsKKwkJaWYgKGpveWRldm5hbWVzW2ldICE9IE5VTEwpCisJCQlTRExfZnJlZShqb3lkZXZuYW1lc1tpXSk7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CityZXBvcnRfYWxsb2Moc3RydWN0IHJlcG9ydCAqciwgc3RydWN0IHJlcG9ydF9kZXNjICpyZCwgaW50IHJlcGluZCkKK3sKKwlpbnQgbGVuOworCisjaWZkZWYgX19EcmFnb25GbHlfXworCWxlbiA9IGhpZF9yZXBvcnRfc2l6ZShyZCwgci0+cmlkLCByZXBpbmZvW3JlcGluZF0ua2luZCk7CisjZWxpZiBfX0ZSRUVCU0RfXworIyBpZiAoX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uID49IDQ2MDAwMCkgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisjICBpZiAoX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uIDw9IDUwMDExMSkKKwlsZW4gPSBoaWRfcmVwb3J0X3NpemUocmQsIHItPnJpZCwgcmVwaW5mb1tyZXBpbmRdLmtpbmQpOworIyAgZWxzZQorCWxlbiA9IGhpZF9yZXBvcnRfc2l6ZShyZCwgcmVwaW5mb1tyZXBpbmRdLmtpbmQsIHItPnJpZCk7CisjICBlbmRpZgorIyBlbHNlCisJbGVuID0gaGlkX3JlcG9ydF9zaXplKHJkLCByZXBpbmZvW3JlcGluZF0ua2luZCwgJnItPnJpZCk7CisjIGVuZGlmCisjZWxzZQorIyBpZmRlZiBVU0JISURfTkVXCisJbGVuID0gaGlkX3JlcG9ydF9zaXplKHJkLCByZXBpbmZvW3JlcGluZF0ua2luZCwgci0+cmlkKTsKKyMgZWxzZQorCWxlbiA9IGhpZF9yZXBvcnRfc2l6ZShyZCwgcmVwaW5mb1tyZXBpbmRdLmtpbmQsICZyLT5yaWQpOworIyBlbmRpZgorI2VuZGlmCisKKwlpZiAobGVuIDwgMCkgeworCQlTRExfU2V0RXJyb3IoIk5lZ2F0aXZlIEhJRCByZXBvcnQgc2l6ZSIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJci0+c2l6ZSA9IGxlbjsKKworCWlmIChyLT5zaXplID4gMCkgeworCQlyLT5idWYgPSBTRExfbWFsbG9jKHNpemVvZigqci0+YnVmKSAtIHNpemVvZihSRVBfQlVGX0RBVEEocikpICsKKwkJICAgIHItPnNpemUpOworCQlpZiAoci0+YnVmID09IE5VTEwpIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9IGVsc2UgeworCQlyLT5idWYgPSBOVUxMOworCX0KKworCXItPnN0YXR1cyA9IFNSRVBPUlRfQ0xFQU47CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3JlcG9ydF9mcmVlKHN0cnVjdCByZXBvcnQgKnIpCit7CisJaWYgKHItPmJ1ZiAhPSBOVUxMKSB7CisJCVNETF9mcmVlKHItPmJ1Zik7CisJfQorCXItPnN0YXR1cyA9IFNSRVBPUlRfVU5JTklUOworfQorCisjZW5kaWYgLyogU0RMX0pPWVNUSUNLX1VTQkhJRCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9kYXJ3aW4vU0RMX3N5c2pveXN0aWNrLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL2Rhcndpbi9TRExfc3lzam95c3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWNjYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9kYXJ3aW4vU0RMX3N5c2pveXN0aWNrLmMKQEAgLTAsMCArMSw4NDIgQEAKKy8qCisJU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKwlUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKwlMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKwl2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKwlUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKwlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisJTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKwlGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKwlTYW0gTGFudGluZ2EKKwlzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0pPWVNUSUNLX0lPS0lUCisKKy8qIFNETCBqb3lzdGljayBkcml2ZXIgZm9yIERhcndpbiAvIE1hYyBPUyBYLCBiYXNlZCBvbiB0aGUgSU9LaXQgSElEIEFQSSAqLworLyogV3JpdHRlbiAyMDAxIGJ5IE1heCBIb3JuICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN5c2V4aXRzLmg+CisjaW5jbHVkZSA8bWFjaC9tYWNoLmg+CisjaW5jbHVkZSA8bWFjaC9tYWNoX2Vycm9yLmg+CisjaW5jbHVkZSA8SU9LaXQvSU9LaXRMaWIuaD4KKyNpbmNsdWRlIDxJT0tpdC9JT0NGUGx1Z0luLmg+CisjaWZkZWYgTUFDT1NfMTBfMF80CisjaW5jbHVkZSA8SU9LaXQvaGlkc3lzdGVtL0lPSElEVXNhZ2VUYWJsZXMuaD4KKyNlbHNlCisvKiBUaGUgaGVhZGVyIHdhcyBtb3ZlZCBoZXJlIGluIE1hYyBPUyBYIDEwLjEgKi8KKyNpbmNsdWRlIDxLZXJuZWwvSU9LaXQvaGlkc3lzdGVtL0lPSElEVXNhZ2VUYWJsZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPElPS2l0L2hpZC9JT0hJRExpYi5oPgorI2luY2x1ZGUgPElPS2l0L2hpZC9JT0hJREtleXMuaD4KKyNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4gLyogZm9yIE5ld1B0ckNsZWFyLCBEaXNwb3NlUHRyICovCisKKyNpbmNsdWRlICJTRExfam95c3RpY2suaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzam95c3RpY2suaCIKKyNpbmNsdWRlICIuLi9TRExfam95c3RpY2tfYy5oIgorCitzdHJ1Y3QgcmVjRWxlbWVudAoreworCUlPSElERWxlbWVudENvb2tpZSBjb29raWU7CQkJCS8qIHVuaXF1ZSB2YWx1ZSB3aGljaCBpZGVudGlmaWVzIGVsZW1lbnQsIHdpbGwgTk9UIGNoYW5nZSAqLworCWxvbmcgbWluOwkJCQkJCQkJLyogcmVwb3J0ZWQgbWluIHZhbHVlIHBvc3NpYmxlICovCisJbG9uZyBtYXg7CQkJCQkJCQkvKiByZXBvcnRlZCBtYXggdmFsdWUgcG9zc2libGUgKi8KKyNpZiAwCisJLyogVE9ETzogbWF5YmUgc2hvdWxkIGhhbmRsZSB0aGUgZm9sbG93aW5nIHN0dWZmIHNvbWVob3c/ICovCisKKwlsb25nIHNjYWxlZE1pbjsJCQkJCQkJLyogcmVwb3J0ZWQgc2NhbGVkIG1pbiB2YWx1ZSBwb3NzaWJsZSAqLworCWxvbmcgc2NhbGVkTWF4OwkJCQkJCQkvKiByZXBvcnRlZCBzY2FsZWQgbWF4IHZhbHVlIHBvc3NpYmxlICovCisJbG9uZyBzaXplOwkJCQkJCQkJLyogc2l6ZSBpbiBiaXRzIG9mIGRhdGEgcmV0dXJuIGZyb20gZWxlbWVudCAqLworCUJvb2xlYW4gcmVsYXRpdmU7CQkJCQkJLyogYXJlIHJlcG9ydHMgcmVsYXRpdmUgdG8gbGFzdCByZXBvcnQgKGRlbHRhcykgKi8KKwlCb29sZWFuIHdyYXBwaW5nOwkJCQkJCS8qIGRvZXMgZWxlbWVudCB3cmFwIGFyb3VuZCAob25lIHZhbHVlIGhpZ2hlciB0aGFuIG1heCBpcyBtaW4pICovCisJQm9vbGVhbiBub25MaW5lYXI7CQkJCQkJLyogYXJlIHRoZSB2YWx1ZXMgcmVwb3J0ZWQgbm9uLWxpbmVhciByZWxhdGl2ZSB0byBlbGVtZW50IG1vdmVtZW50ICovCisJQm9vbGVhbiBwcmVmZXJyZWRTdGF0ZTsJCQkJCS8qIGRvZXMgZWxlbWVudCBoYXZlIGEgcHJlZmVycmVkIHN0YXRlIChzdWNoIGFzIGEgYnV0dG9uKSAqLworCUJvb2xlYW4gbnVsbFN0YXRlOwkJCQkJCS8qIGRvZXMgZWxlbWVudCBoYXZlIG51bGwgc3RhdGUgKi8KKyNlbmRpZiAvKiAwICovCisKKwkvKiBydW50aW1lIHZhcmlhYmxlcyB1c2VkIGZvciBhdXRvLWNhbGlicmF0aW9uICovCisJbG9uZyBtaW5SZXBvcnQ7CQkJCQkJCS8qIG1pbiByZXR1cm5lZCB2YWx1ZSAqLworCWxvbmcgbWF4UmVwb3J0OwkJCQkJCQkvKiBtYXggcmV0dXJuZWQgdmFsdWUgKi8KKwkKKwlzdHJ1Y3QgcmVjRWxlbWVudCAqIHBOZXh0OwkJCQkvKiBuZXh0IGVsZW1lbnQgaW4gbGlzdCAqLworfTsKK3R5cGVkZWYgc3RydWN0IHJlY0VsZW1lbnQgcmVjRWxlbWVudDsKKworc3RydWN0IGpveXN0aWNrX2h3ZGF0YQoreworCUlPSElERGV2aWNlSW50ZXJmYWNlICoqIGludGVyZmFjZTsJCS8qIGludGVyZmFjZSB0byBkZXZpY2UsIE5VTEwgPSBubyBpbnRlcmZhY2UgKi8KKworCWNoYXIgcHJvZHVjdFsyNTZdOwkJCQkJCQkvKiBuYW1lIG9mIHByb2R1Y3QgKi8KKwlsb25nIHVzYWdlOwkJCQkJCQkJLyogdXNhZ2UgcGFnZSBmcm9tIElPVVNCSElEIFBhcnNlci5oIHdoaWNoIGRlZmluZXMgZ2VuZXJhbCB1c2FnZSAqLworCWxvbmcgdXNhZ2VQYWdlOwkJCQkJCQkvKiB1c2FnZSB3aXRoaW4gYWJvdmUgcGFnZSBmcm9tIElPVVNCSElEIFBhcnNlci5oIHdoaWNoIGRlZmluZXMgc3BlY2lmaWMgdXNhZ2UgKi8KKworCWxvbmcgYXhlczsJCQkJCQkJCS8qIG51bWJlciBvZiBheGlzIChjYWxjdWxhdGVkLCBub3QgcmVwb3J0ZWQgYnkgZGV2aWNlKSAqLworCWxvbmcgYnV0dG9uczsJCQkJCQkJLyogbnVtYmVyIG9mIGJ1dHRvbnMgKGNhbGN1bGF0ZWQsIG5vdCByZXBvcnRlZCBieSBkZXZpY2UpICovCisJbG9uZyBoYXRzOwkJCQkJCQkJLyogbnVtYmVyIG9mIGhhdCBzd2l0Y2hlcyAoY2FsY3VsYXRlZCwgbm90IHJlcG9ydGVkIGJ5IGRldmljZSkgKi8KKwlsb25nIGVsZW1lbnRzOwkJCQkJCQkvKiBudW1iZXIgb2YgdG90YWwgZWxlbWVudHMgKHNob3VsZGJlIHRvdGFsIG9mIGFib3ZlKSAoY2FsY3VsYXRlZCwgbm90IHJlcG9ydGVkIGJ5IGRldmljZSkgKi8KKworCXJlY0VsZW1lbnQqIGZpcnN0QXhpczsKKwlyZWNFbGVtZW50KiBmaXJzdEJ1dHRvbjsKKwlyZWNFbGVtZW50KiBmaXJzdEhhdDsKKworCWludCByZW1vdmVkOworCWludCB1bmNlbnRlcmVkOworCisJc3RydWN0IGpveXN0aWNrX2h3ZGF0YSogcE5leHQ7CQkJLyogbmV4dCBkZXZpY2UgKi8KK307Cit0eXBlZGVmIHN0cnVjdCBqb3lzdGlja19od2RhdGEgcmVjRGV2aWNlOworCisKKy8qIExpbmtlZCBsaXN0IG9mIGFsbCBhdmFpbGFibGUgZGV2aWNlcyAqLworc3RhdGljIHJlY0RldmljZSAqZ3BEZXZpY2VMaXN0ID0gTlVMTDsKKworCitzdGF0aWMgdm9pZCBISURSZXBvcnRFcnJvck51bSAoY2hhciAqIHN0ckVycm9yLCBsb25nIG51bUVycm9yKQoreworCVNETF9TZXRFcnJvcihzdHJFcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkIEhJREdldENvbGxlY3Rpb25FbGVtZW50cyAoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBkZXZpY2VQcm9wZXJ0aWVzLCByZWNEZXZpY2UgKnBEZXZpY2UpOworCisvKiByZXR1cm5zIGN1cnJlbnQgdmFsdWUgZm9yIGVsZW1lbnQsIHBvbGxpbmcgZWxlbWVudAorICogd2lsbCByZXR1cm4gMCBvbiBlcnJvciBjb25kaXRpb25zIHdoaWNoIHNob3VsZCBiZSBhY2NvdW50ZWQgZm9yIGJ5IGFwcGxpY2F0aW9uCisgKi8KKworc3RhdGljIFNJbnQzMiBISURHZXRFbGVtZW50VmFsdWUgKHJlY0RldmljZSAqcERldmljZSwgcmVjRWxlbWVudCAqcEVsZW1lbnQpCit7CisJSU9SZXR1cm4gcmVzdWx0ID0ga0lPUmV0dXJuU3VjY2VzczsKKwlJT0hJREV2ZW50U3RydWN0IGhpZEV2ZW50OworCWhpZEV2ZW50LnZhbHVlID0gMDsKKwkKKwlpZiAoTlVMTCAhPSBwRGV2aWNlICYmIE5VTEwgIT0gcEVsZW1lbnQgJiYgTlVMTCAhPSBwRGV2aWNlLT5pbnRlcmZhY2UpCisJeworCQlyZXN1bHQgPSAoKihwRGV2aWNlLT5pbnRlcmZhY2UpKS0+Z2V0RWxlbWVudFZhbHVlKHBEZXZpY2UtPmludGVyZmFjZSwgcEVsZW1lbnQtPmNvb2tpZSwgJmhpZEV2ZW50KTsKKwkJaWYgKGtJT1JldHVyblN1Y2Nlc3MgPT0gcmVzdWx0KQorCQl7CisJCQkvKiByZWNvcmQgbWluIGFuZCBtYXggZm9yIGF1dG8gY2FsaWJyYXRpb24gKi8KKwkJCWlmIChoaWRFdmVudC52YWx1ZSA8IHBFbGVtZW50LT5taW5SZXBvcnQpCisJCQkJcEVsZW1lbnQtPm1pblJlcG9ydCA9IGhpZEV2ZW50LnZhbHVlOworCQkJaWYgKGhpZEV2ZW50LnZhbHVlID4gcEVsZW1lbnQtPm1heFJlcG9ydCkKKwkJCQlwRWxlbWVudC0+bWF4UmVwb3J0ID0gaGlkRXZlbnQudmFsdWU7CisJCX0KKwl9CisKKwkvKiBhdXRvIHVzZXIgc2NhbGUgKi8KKwlyZXR1cm4gaGlkRXZlbnQudmFsdWU7Cit9CisKK3N0YXRpYyBTSW50MzIgSElEU2NhbGVkQ2FsaWJyYXRlZFZhbHVlIChyZWNEZXZpY2UgKnBEZXZpY2UsIHJlY0VsZW1lbnQgKnBFbGVtZW50LCBsb25nIG1pbiwgbG9uZyBtYXgpCit7CisJZmxvYXQgZGV2aWNlU2NhbGUgPSBtYXggLSBtaW47CisJZmxvYXQgcmVhZFNjYWxlID0gcEVsZW1lbnQtPm1heFJlcG9ydCAtIHBFbGVtZW50LT5taW5SZXBvcnQ7CisJU0ludDMyIHZhbHVlID0gSElER2V0RWxlbWVudFZhbHVlKHBEZXZpY2UsIHBFbGVtZW50KTsKKwlpZiAocmVhZFNjYWxlID09IDApCisJCXJldHVybiB2YWx1ZTsgLyogbm8gc2NhbGluZyBhdCBhbGwgKi8KKwllbHNlCisJCXJldHVybiAoKHZhbHVlIC0gcEVsZW1lbnQtPm1pblJlcG9ydCkgKiBkZXZpY2VTY2FsZSAvIHJlYWRTY2FsZSkgKyBtaW47Cit9CisKKworc3RhdGljIHZvaWQgSElEUmVtb3ZhbENhbGxiYWNrKHZvaWQgKiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9SZXR1cm4gcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiByZWZjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHNlbmRlcikKK3sKKwlyZWNEZXZpY2UgKmRldmljZSA9IChyZWNEZXZpY2UgKikgcmVmY29uOworCWRldmljZS0+cmVtb3ZlZCA9IDE7CisJZGV2aWNlLT51bmNlbnRlcmVkID0gMTsKK30KKworCisKKy8qIENyZWF0ZSBhbmQgb3BlbiBhbiBpbnRlcmZhY2UgdG8gZGV2aWNlLCByZXF1aXJlZCBwcmlvciB0byBleHRyYWN0aW5nIHZhbHVlcyBvciBidWlsZGluZyBxdWV1ZXMuCisgKiBOb3RlOiBhcHBsaWN0aW9uIG5vdyBvd25zIHRoZSBkZXZpY2UgYW5kIG11c3QgY2xvc2UgYW5kIHJlbGVhc2UgaXQgcHJpb3IgdG8gZXhpdGluZworICovCisKK3N0YXRpYyBJT1JldHVybiBISURDcmVhdGVPcGVuRGV2aWNlSW50ZXJmYWNlIChpb19vYmplY3RfdCBoaWREZXZpY2UsIHJlY0RldmljZSAqcERldmljZSkKK3sKKwlJT1JldHVybiByZXN1bHQgPSBrSU9SZXR1cm5TdWNjZXNzOworCUhSRVNVTFQgcGx1Z0luUmVzdWx0ID0gU19PSzsKKwlTSW50MzIgc2NvcmUgPSAwOworCUlPQ0ZQbHVnSW5JbnRlcmZhY2UgKiogcHBQbHVnSW5JbnRlcmZhY2UgPSBOVUxMOworCQorCWlmIChOVUxMID09IHBEZXZpY2UtPmludGVyZmFjZSkKKwl7CisJCXJlc3VsdCA9IElPQ3JlYXRlUGx1Z0luSW50ZXJmYWNlRm9yU2VydmljZSAoaGlkRGV2aWNlLCBrSU9ISUREZXZpY2VVc2VyQ2xpZW50VHlwZUlELAorCQkJCQkJCQkJCQkJCWtJT0NGUGx1Z0luSW50ZXJmYWNlSUQsICZwcFBsdWdJbkludGVyZmFjZSwgJnNjb3JlKTsKKwkJaWYgKGtJT1JldHVyblN1Y2Nlc3MgPT0gcmVzdWx0KQorCQl7CisJCQkvKiBDYWxsIGEgbWV0aG9kIG9mIHRoZSBpbnRlcm1lZGlhdGUgcGx1Zy1pbiB0byBjcmVhdGUgdGhlIGRldmljZSBpbnRlcmZhY2UgKi8KKwkJCXBsdWdJblJlc3VsdCA9ICgqcHBQbHVnSW5JbnRlcmZhY2UpLT5RdWVyeUludGVyZmFjZSAocHBQbHVnSW5JbnRlcmZhY2UsCisJCQkJCQkJCUNGVVVJREdldFVVSURCeXRlcyAoa0lPSElERGV2aWNlSW50ZXJmYWNlSUQpLCAodm9pZCAqKSAmKHBEZXZpY2UtPmludGVyZmFjZSkpOworCQkJaWYgKFNfT0sgIT0gcGx1Z0luUmVzdWx0KQorCQkJCUhJRFJlcG9ydEVycm9yTnVtICgiQ291bGRu1XQgcXVlcnkgSElEIGNsYXNzIGRldmljZSBpbnRlcmZhY2UgZnJvbSBwbHVnSW5JbnRlcmZhY2UiLCBwbHVnSW5SZXN1bHQpOworCQkJKCpwcFBsdWdJbkludGVyZmFjZSktPlJlbGVhc2UgKHBwUGx1Z0luSW50ZXJmYWNlKTsKKwkJfQorCQllbHNlCisJCQlISURSZXBvcnRFcnJvck51bSAoIkZhaWxlZCB0byBjcmVhdGUgKipwbHVnSW5JbnRlcmZhY2UgdmlhIElPQ3JlYXRlUGx1Z0luSW50ZXJmYWNlRm9yU2VydmljZS4iLCByZXN1bHQpOworCX0KKwlpZiAoTlVMTCAhPSBwRGV2aWNlLT5pbnRlcmZhY2UpCisJeworCQlyZXN1bHQgPSAoKihwRGV2aWNlLT5pbnRlcmZhY2UpKS0+b3BlbiAocERldmljZS0+aW50ZXJmYWNlLCAwKTsKKwkJaWYgKGtJT1JldHVyblN1Y2Nlc3MgIT0gcmVzdWx0KQorCQkJSElEUmVwb3J0RXJyb3JOdW0gKCJGYWlsZWQgdG8gb3BlbiBwRGV2aWNlLT5pbnRlcmZhY2UgdmlhIG9wZW4uIiwgcmVzdWx0KTsKKwkJZWxzZQorCQkJKCoocERldmljZS0+aW50ZXJmYWNlKSktPnNldFJlbW92YWxDYWxsYmFjayAocERldmljZS0+aW50ZXJmYWNlLCBISURSZW1vdmFsQ2FsbGJhY2ssIHBEZXZpY2UsIHBEZXZpY2UpOworCisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIENsb3NlcyBhbmQgcmVsZWFzZXMgaW50ZXJmYWNlIHRvIGRldmljZSwgc2hvdWxkIGJlIGRvbmUgcHJpb3IgdG8gZXh0aW5nIGFwcGxpY2F0aW9uCisgKiBOb3RlOiB3aWxsIGhhdmUgbm8gYWZmZWN0IGlmIGRldmljZSBvciBpbnRlcmZhY2UgZG8gbm90IGV4aXN0CisgKiBhcHBsaWNhdGlvbiB3aWxsICJvd24iIHRoZSBkZXZpY2UgaWYgaW50ZXJmYWNlIGlzIG5vdCBjbG9zZWQKKyAqIChkZXZpY2UgbWF5IGhhdmUgdG8gYmUgcGx1ZyBhbmQgcmUtcGx1Z2dlZCBpbiBkaWZmZXJlbnQgbG9jYXRpb24gdG8gZ2V0IGl0IHdvcmtpbmcgYWdhaW4gd2l0aG91dCBhIHJlc3RhcnQpCisgKi8KKworc3RhdGljIElPUmV0dXJuIEhJRENsb3NlUmVsZWFzZUludGVyZmFjZSAocmVjRGV2aWNlICpwRGV2aWNlKQoreworCUlPUmV0dXJuIHJlc3VsdCA9IGtJT1JldHVyblN1Y2Nlc3M7CisJCisJaWYgKChOVUxMICE9IHBEZXZpY2UpICYmIChOVUxMICE9IHBEZXZpY2UtPmludGVyZmFjZSkpCisJeworCQkvKiBjbG9zZSB0aGUgaW50ZXJmYWNlICovCisJCXJlc3VsdCA9ICgqKHBEZXZpY2UtPmludGVyZmFjZSkpLT5jbG9zZSAocERldmljZS0+aW50ZXJmYWNlKTsKKwkJaWYgKGtJT1JldHVybk5vdE9wZW4gPT0gcmVzdWx0KQorCQl7CisJCQkvKiBkbyBub3RoaW5nIGFzIGRldmljZSB3YXMgbm90IG9wZW5lZCwgdGh1cyBjYW4ndCBiZSBjbG9zZWQgKi8KKwkJfQorCQllbHNlIGlmIChrSU9SZXR1cm5TdWNjZXNzICE9IHJlc3VsdCkKKwkJCUhJRFJlcG9ydEVycm9yTnVtICgiRmFpbGVkIHRvIGNsb3NlIElPSElERGV2aWNlSW50ZXJmYWNlLiIsIHJlc3VsdCk7CisJCS8qIHJlbGVhc2UgdGhlIGludGVyZmFjZSAqLworCQlyZXN1bHQgPSAoKihwRGV2aWNlLT5pbnRlcmZhY2UpKS0+UmVsZWFzZSAocERldmljZS0+aW50ZXJmYWNlKTsKKwkJaWYgKGtJT1JldHVyblN1Y2Nlc3MgIT0gcmVzdWx0KQorCQkJSElEUmVwb3J0RXJyb3JOdW0gKCJGYWlsZWQgdG8gcmVsZWFzZSBJT0hJRERldmljZUludGVyZmFjZS4iLCByZXN1bHQpOworCQlwRGV2aWNlLT5pbnRlcmZhY2UgPSBOVUxMOworCX0JCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogZXh0cmFjdHMgYWN0dWFsIHNwZWNpZmljIGVsZW1lbnQgaW5mb3JtYXRpb24gZnJvbSBlYWNoIGVsZW1lbnQgQ0YgZGljdGlvbmFyeSBlbnRyeSAqLworCitzdGF0aWMgdm9pZCBISURHZXRFbGVtZW50SW5mbyAoQ0ZUeXBlUmVmIHJlZkVsZW1lbnQsIHJlY0VsZW1lbnQgKnBFbGVtZW50KQoreworCWxvbmcgbnVtYmVyOworCUNGVHlwZVJlZiByZWZUeXBlOworCisJcmVmVHlwZSA9IENGRGljdGlvbmFyeUdldFZhbHVlIChyZWZFbGVtZW50LCBDRlNUUihrSU9ISURFbGVtZW50Q29va2llS2V5KSk7CisJaWYgKHJlZlR5cGUgJiYgQ0ZOdW1iZXJHZXRWYWx1ZSAocmVmVHlwZSwga0NGTnVtYmVyTG9uZ1R5cGUsICZudW1iZXIpKQorCQlwRWxlbWVudC0+Y29va2llID0gKElPSElERWxlbWVudENvb2tpZSkgbnVtYmVyOworCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudE1pbktleSkpOworCWlmIChyZWZUeXBlICYmIENGTnVtYmVyR2V0VmFsdWUgKHJlZlR5cGUsIGtDRk51bWJlckxvbmdUeXBlLCAmbnVtYmVyKSkKKwkJcEVsZW1lbnQtPm1pblJlcG9ydCA9IHBFbGVtZW50LT5taW4gPSBudW1iZXI7CisJcmVmVHlwZSA9IENGRGljdGlvbmFyeUdldFZhbHVlIChyZWZFbGVtZW50LCBDRlNUUihrSU9ISURFbGVtZW50TWF4S2V5KSk7CisJaWYgKHJlZlR5cGUgJiYgQ0ZOdW1iZXJHZXRWYWx1ZSAocmVmVHlwZSwga0NGTnVtYmVyTG9uZ1R5cGUsICZudW1iZXIpKQorCQlwRWxlbWVudC0+bWF4UmVwb3J0ID0gcEVsZW1lbnQtPm1heCA9IG51bWJlcjsKKy8qCisJVE9ETzogbWF5YmUgc2hvdWxkIGhhbmRsZSB0aGUgZm9sbG93aW5nIHN0dWZmIHNvbWVob3c/CisKKwlyZWZUeXBlID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHJlZkVsZW1lbnQsIENGU1RSKGtJT0hJREVsZW1lbnRTY2FsZWRNaW5LZXkpKTsKKwlpZiAocmVmVHlwZSAmJiBDRk51bWJlckdldFZhbHVlIChyZWZUeXBlLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJm51bWJlcikpCisJCXBFbGVtZW50LT5zY2FsZWRNaW4gPSBudW1iZXI7CisJcmVmVHlwZSA9IENGRGljdGlvbmFyeUdldFZhbHVlIChyZWZFbGVtZW50LCBDRlNUUihrSU9ISURFbGVtZW50U2NhbGVkTWF4S2V5KSk7CisJaWYgKHJlZlR5cGUgJiYgQ0ZOdW1iZXJHZXRWYWx1ZSAocmVmVHlwZSwga0NGTnVtYmVyTG9uZ1R5cGUsICZudW1iZXIpKQorCQlwRWxlbWVudC0+c2NhbGVkTWF4ID0gbnVtYmVyOworCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudFNpemVLZXkpKTsKKwlpZiAocmVmVHlwZSAmJiBDRk51bWJlckdldFZhbHVlIChyZWZUeXBlLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJm51bWJlcikpCisJCXBFbGVtZW50LT5zaXplID0gbnVtYmVyOworCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudElzUmVsYXRpdmVLZXkpKTsKKwlpZiAocmVmVHlwZSkKKwkJcEVsZW1lbnQtPnJlbGF0aXZlID0gQ0ZCb29sZWFuR2V0VmFsdWUgKHJlZlR5cGUpOworCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudElzV3JhcHBpbmdLZXkpKTsKKwlpZiAocmVmVHlwZSkKKwkJcEVsZW1lbnQtPndyYXBwaW5nID0gQ0ZCb29sZWFuR2V0VmFsdWUgKHJlZlR5cGUpOworCXJlZlR5cGUgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAocmVmRWxlbWVudCwgQ0ZTVFIoa0lPSElERWxlbWVudElzTm9uTGluZWFyS2V5KSk7CisJaWYgKHJlZlR5cGUpCisJCXBFbGVtZW50LT5ub25MaW5lYXIgPSBDRkJvb2xlYW5HZXRWYWx1ZSAocmVmVHlwZSk7CisJcmVmVHlwZSA9IENGRGljdGlvbmFyeUdldFZhbHVlIChyZWZFbGVtZW50LCBDRlNUUihrSU9ISURFbGVtZW50SGFzUHJlZmVyZWRTdGF0ZUtleSkpOworCWlmIChyZWZUeXBlKQorCQlwRWxlbWVudC0+cHJlZmVycmVkU3RhdGUgPSBDRkJvb2xlYW5HZXRWYWx1ZSAocmVmVHlwZSk7CisJcmVmVHlwZSA9IENGRGljdGlvbmFyeUdldFZhbHVlIChyZWZFbGVtZW50LCBDRlNUUihrSU9ISURFbGVtZW50SGFzTnVsbFN0YXRlS2V5KSk7CisJaWYgKHJlZlR5cGUpCisJCXBFbGVtZW50LT5udWxsU3RhdGUgPSBDRkJvb2xlYW5HZXRWYWx1ZSAocmVmVHlwZSk7CisqLworfQkJCQorCisvKiBleGFtaW5lcyBDRiBkaWN0aW9uYXJ5IHZsYXVlIGluIGRldmljZSBlbGVtZW50IGhpZXJhcmNoeSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgZWxlbWVudCBvZiBpbnRlcmVzdCBvciBhIGNvbGxlY3Rpb24gb2YgbW9yZSBlbGVtZW50cworICogaWYgZWxlbWVudCBvZiBpbnRlcmVzdCBhbGxvY2F0ZSBzdG9yYWdlLCBhZGQgdG8gbGlzdCBhbmQgcmV0cmlldmUgZWxlbWVudCBzcGVjaWZpYyBpbmZvCisgKiBpZiBjb2xsZWN0aW9uIHRoZW4gcGFzcyBvbiB0byBkZWNvbnN0cnVjdGlvbiBjb2xsZWN0aW9uIGludG8gYWRkaXRpb25hbCBpbmRpdmlkdWFsIGVsZW1lbnRzCisgKi8KKworc3RhdGljIHZvaWQgSElEQWRkRWxlbWVudCAoQ0ZUeXBlUmVmIHJlZkVsZW1lbnQsIHJlY0RldmljZSogcERldmljZSkKK3sKKwlyZWNFbGVtZW50KiBlbGVtZW50ID0gTlVMTDsKKwlyZWNFbGVtZW50KiogaGVhZEVsZW1lbnQgPSBOVUxMOworCWxvbmcgZWxlbWVudFR5cGUsIHVzYWdlUGFnZSwgdXNhZ2U7CisJQ0ZUeXBlUmVmIHJlZkVsZW1lbnRUeXBlID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHJlZkVsZW1lbnQsIENGU1RSKGtJT0hJREVsZW1lbnRUeXBlS2V5KSk7CisJQ0ZUeXBlUmVmIHJlZlVzYWdlUGFnZSA9IENGRGljdGlvbmFyeUdldFZhbHVlIChyZWZFbGVtZW50LCBDRlNUUihrSU9ISURFbGVtZW50VXNhZ2VQYWdlS2V5KSk7CisJQ0ZUeXBlUmVmIHJlZlVzYWdlID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHJlZkVsZW1lbnQsIENGU1RSKGtJT0hJREVsZW1lbnRVc2FnZUtleSkpOworCisKKwlpZiAoKHJlZkVsZW1lbnRUeXBlKSAmJiAoQ0ZOdW1iZXJHZXRWYWx1ZSAocmVmRWxlbWVudFR5cGUsIGtDRk51bWJlckxvbmdUeXBlLCAmZWxlbWVudFR5cGUpKSkKKwl7CisJCS8qIGxvb2sgYXQgdHlwZXMgb2YgaW50ZXJlc3QgKi8KKwkJaWYgKChlbGVtZW50VHlwZSA9PSBrSU9ISURFbGVtZW50VHlwZUlucHV0X01pc2MpIHx8IChlbGVtZW50VHlwZSA9PSBrSU9ISURFbGVtZW50VHlwZUlucHV0X0J1dHRvbikgfHwKKwkJCShlbGVtZW50VHlwZSA9PSBrSU9ISURFbGVtZW50VHlwZUlucHV0X0F4aXMpKQorCQl7CisJCQlpZiAocmVmVXNhZ2VQYWdlICYmIENGTnVtYmVyR2V0VmFsdWUgKHJlZlVzYWdlUGFnZSwga0NGTnVtYmVyTG9uZ1R5cGUsICZ1c2FnZVBhZ2UpICYmCisJCQkJcmVmVXNhZ2UgJiYgQ0ZOdW1iZXJHZXRWYWx1ZSAocmVmVXNhZ2UsIGtDRk51bWJlckxvbmdUeXBlLCAmdXNhZ2UpKQorCQkJeworCQkJCXN3aXRjaCAodXNhZ2VQYWdlKSAvKiBvbmx5IGludGVyZXN0ZWQgaW4ga0hJRFBhZ2VfR2VuZXJpY0Rlc2t0b3AgYW5kIGtISURQYWdlX0J1dHRvbiAqLworCQkJCXsKKwkJCQkJY2FzZSBrSElEUGFnZV9HZW5lcmljRGVza3RvcDoKKwkJCQkJCXsKKwkJCQkJCQlzd2l0Y2ggKHVzYWdlKSAvKiBsb29rIGF0IHVzYWdlIHRvIGRldGVybWluZSBmdW5jdGlvbiAqLworCQkJCQkJCXsKKwkJCQkJCQkJY2FzZSBrSElEVXNhZ2VfR0RfWDoKKwkJCQkJCQkJY2FzZSBrSElEVXNhZ2VfR0RfWToKKwkJCQkJCQkJY2FzZSBrSElEVXNhZ2VfR0RfWjoKKwkJCQkJCQkJY2FzZSBrSElEVXNhZ2VfR0RfUng6CisJCQkJCQkJCWNhc2Uga0hJRFVzYWdlX0dEX1J5OgorCQkJCQkJCQljYXNlIGtISURVc2FnZV9HRF9SejoKKwkJCQkJCQkJY2FzZSBrSElEVXNhZ2VfR0RfU2xpZGVyOgorCQkJCQkJCQljYXNlIGtISURVc2FnZV9HRF9EaWFsOgorCQkJCQkJCQljYXNlIGtISURVc2FnZV9HRF9XaGVlbDoKKwkJCQkJCQkJCWVsZW1lbnQgPSAocmVjRWxlbWVudCAqKSBOZXdQdHJDbGVhciAoc2l6ZW9mIChyZWNFbGVtZW50KSk7CisJCQkJCQkJCQlpZiAoZWxlbWVudCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlwRGV2aWNlLT5heGVzKys7CisJCQkJCQkJCQkJaGVhZEVsZW1lbnQgPSAmKHBEZXZpY2UtPmZpcnN0QXhpcyk7CisJCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIGtISURVc2FnZV9HRF9IYXRzd2l0Y2g6CisJCQkJCQkJCQllbGVtZW50ID0gKHJlY0VsZW1lbnQgKikgTmV3UHRyQ2xlYXIgKHNpemVvZiAocmVjRWxlbWVudCkpOworCQkJCQkJCQkJaWYgKGVsZW1lbnQpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJcERldmljZS0+aGF0cysrOworCQkJCQkJCQkJCWhlYWRFbGVtZW50ID0gJihwRGV2aWNlLT5maXJzdEhhdCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0JCQkJCQkJCisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBrSElEUGFnZV9CdXR0b246CisJCQkJCQllbGVtZW50ID0gKHJlY0VsZW1lbnQgKikgTmV3UHRyQ2xlYXIgKHNpemVvZiAocmVjRWxlbWVudCkpOworCQkJCQkJaWYgKGVsZW1lbnQpCisJCQkJCQl7CisJCQkJCQkJcERldmljZS0+YnV0dG9ucysrOworCQkJCQkJCWhlYWRFbGVtZW50ID0gJihwRGV2aWNlLT5maXJzdEJ1dHRvbik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmIChrSU9ISURFbGVtZW50VHlwZUNvbGxlY3Rpb24gPT0gZWxlbWVudFR5cGUpCisJCQlISURHZXRDb2xsZWN0aW9uRWxlbWVudHMgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmKSByZWZFbGVtZW50LCBwRGV2aWNlKTsKKwl9CisKKwlpZiAoZWxlbWVudCAmJiBoZWFkRWxlbWVudCkgLyogYWRkIHRvIGxpc3QgKi8KKwl7CisJCXBEZXZpY2UtPmVsZW1lbnRzKys7CisJCWlmIChOVUxMID09ICpoZWFkRWxlbWVudCkKKwkJCSpoZWFkRWxlbWVudCA9IGVsZW1lbnQ7CisJCWVsc2UKKwkJeworCQkJcmVjRWxlbWVudCAqZWxlbWVudFByZXZpb3VzLCAqZWxlbWVudEN1cnJlbnQ7CisJCQllbGVtZW50Q3VycmVudCA9ICpoZWFkRWxlbWVudDsKKwkJCXdoaWxlIChlbGVtZW50Q3VycmVudCkKKwkJCXsKKwkJCQllbGVtZW50UHJldmlvdXMgPSBlbGVtZW50Q3VycmVudDsKKwkJCQllbGVtZW50Q3VycmVudCA9IGVsZW1lbnRQcmV2aW91cy0+cE5leHQ7CisJCQl9CisJCQllbGVtZW50UHJldmlvdXMtPnBOZXh0ID0gZWxlbWVudDsKKwkJfQorCQllbGVtZW50LT5wTmV4dCA9IE5VTEw7CisJCUhJREdldEVsZW1lbnRJbmZvIChyZWZFbGVtZW50LCBlbGVtZW50KTsKKwl9Cit9CisKKy8qIGNvbGxlY3RzIGluZm9ybWF0aW9uIGZyb20gZWFjaCBhcnJheSBtZW1iZXIgaW4gZGV2aWNlIGVsZW1lbnQgbGlzdCAoZWFjaCBhcnJheSBtZW1lYmVyID0gZWxlbWVudCkgKi8KKworc3RhdGljIHZvaWQgSElER2V0RWxlbWVudHNDRkFycmF5SGFuZGxlciAoY29uc3Qgdm9pZCAqIHZhbHVlLCB2b2lkICogcGFyYW1ldGVyKQoreworCWlmIChDRkdldFR5cGVJRCAodmFsdWUpID09IENGRGljdGlvbmFyeUdldFR5cGVJRCAoKSkKKwkJSElEQWRkRWxlbWVudCAoKENGVHlwZVJlZikgdmFsdWUsIChyZWNEZXZpY2UgKikgcGFyYW1ldGVyKTsKK30KKworLyogaGFuZGxlcyByZXRyaWV2YWwgb2YgZWxlbWVudCBpbmZvcm1hdGlvbiBmcm9tIGFycmF5cyBvZiBlbGVtZW50cyBpbiBkZXZpY2UgSU8gcmVnaXN0cnkgaW5mb3JtYXRpb24gKi8KKworc3RhdGljIHZvaWQgSElER2V0RWxlbWVudHMgKENGVHlwZVJlZiByZWZFbGVtZW50Q3VycmVudCwgcmVjRGV2aWNlICpwRGV2aWNlKQoreworCUNGVHlwZUlEIHR5cGUgPSBDRkdldFR5cGVJRCAocmVmRWxlbWVudEN1cnJlbnQpOworCWlmICh0eXBlID09IENGQXJyYXlHZXRUeXBlSUQoKSkgLyogaWYgZWxlbWVudCBpcyBhbiBhcnJheSAqLworCXsKKwkJQ0ZSYW5nZSByYW5nZSA9IHswLCBDRkFycmF5R2V0Q291bnQgKHJlZkVsZW1lbnRDdXJyZW50KX07CisJCS8qIENvdW50RWxlbWVudHNDRkFycmF5SGFuZGxlciBjYWxsZWQgZm9yIGVhY2ggYXJyYXkgbWVtYmVyICovCisJCUNGQXJyYXlBcHBseUZ1bmN0aW9uIChyZWZFbGVtZW50Q3VycmVudCwgcmFuZ2UsIEhJREdldEVsZW1lbnRzQ0ZBcnJheUhhbmRsZXIsIHBEZXZpY2UpOworCX0KK30JCQkKKworLyogaGFuZGxlcyBleHRyYWN0aW5nIGVsZW1lbnQgaW5mb3JtYXRpb24gZnJvbSBlbGVtZW50IGNvbGxlY3Rpb24gQ0YgdHlwZXMKKyAqIHVzZWQgZnJvbSB0b3AgbGV2ZWwgZWxlbWVudCBkZWNvZGluZyBhbmQgaGllcmFyY2h5IGRlY29uc3RydWN0aW9uIHRvIGZsYXR0ZW4gZGV2aWNlIGVsZW1lbnQgbGlzdAorICovCisKK3N0YXRpYyB2b2lkIEhJREdldENvbGxlY3Rpb25FbGVtZW50cyAoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBkZXZpY2VQcm9wZXJ0aWVzLCByZWNEZXZpY2UgKnBEZXZpY2UpCit7CisJQ0ZUeXBlUmVmIHJlZkVsZW1lbnRUb3AgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAoZGV2aWNlUHJvcGVydGllcywgQ0ZTVFIoa0lPSElERWxlbWVudEtleSkpOworCWlmIChyZWZFbGVtZW50VG9wKQorCQlISURHZXRFbGVtZW50cyAocmVmRWxlbWVudFRvcCwgcERldmljZSk7Cit9CisKKy8qIHVzZSB0b3AgbGV2ZWwgZWxlbWVudCB1c2FnZSBwYWdlIGFuZCB1c2FnZSB0byBkaXNjZXJuIGRldmljZSB1c2FnZSBwYWdlIGFuZCB1c2FnZSBzZXR0aW5nIGFwcHJvcHJpYXRlIHZsYXVlcyBpbiBkZXZpY2UgcmVjb3JkICovCisKK3N0YXRpYyB2b2lkIEhJRFRvcExldmVsRWxlbWVudEhhbmRsZXIgKGNvbnN0IHZvaWQgKiB2YWx1ZSwgdm9pZCAqIHBhcmFtZXRlcikKK3sKKwlDRlR5cGVSZWYgcmVmQ0YgPSAwOworCWlmIChDRkdldFR5cGVJRCAodmFsdWUpICE9IENGRGljdGlvbmFyeUdldFR5cGVJRCAoKSkKKwkJcmV0dXJuOworCXJlZkNGID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHZhbHVlLCBDRlNUUihrSU9ISURFbGVtZW50VXNhZ2VQYWdlS2V5KSk7CisJaWYgKCFDRk51bWJlckdldFZhbHVlIChyZWZDRiwga0NGTnVtYmVyTG9uZ1R5cGUsICYoKHJlY0RldmljZSAqKSBwYXJhbWV0ZXIpLT51c2FnZVBhZ2UpKQorCQlTRExfU2V0RXJyb3IgKCJDRk51bWJlckdldFZhbHVlIGVycm9yIHJldHJpZXZpbmcgcERldmljZS0+dXNhZ2VQYWdlLiIpOworCXJlZkNGID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHZhbHVlLCBDRlNUUihrSU9ISURFbGVtZW50VXNhZ2VLZXkpKTsKKwlpZiAoIUNGTnVtYmVyR2V0VmFsdWUgKHJlZkNGLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJigocmVjRGV2aWNlICopIHBhcmFtZXRlciktPnVzYWdlKSkKKwkJU0RMX1NldEVycm9yICgiQ0ZOdW1iZXJHZXRWYWx1ZSBlcnJvciByZXRyaWV2aW5nIHBEZXZpY2UtPnVzYWdlLiIpOworfQorCisvKiBleHRyYWN0cyBkZXZpY2UgaW5mbyBmcm9tIENGIGRpY3Rpb25hcnkgcmVjb3JkcyBpbiBJTyByZWdpc3RyeSAqLworCitzdGF0aWMgdm9pZCBISURHZXREZXZpY2VJbmZvIChpb19vYmplY3RfdCBoaWREZXZpY2UsIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgaGlkUHJvcGVydGllcywgcmVjRGV2aWNlICpwRGV2aWNlKQoreworCUNGTXV0YWJsZURpY3Rpb25hcnlSZWYgdXNiUHJvcGVydGllcyA9IDA7CisJaW9fcmVnaXN0cnlfZW50cnlfdCBwYXJlbnQxLCBwYXJlbnQyOworCQorCS8qIE1hYyBPUyBYIGN1cnJlbnRseSBpcyBub3QgbWlycm9yaW5nIGFsbCBVU0IgcHJvcGVydGllcyB0byBISUQgcGFnZSBzbyBuZWVkIHRvIGxvb2sgYXQgVVNCIGRldmljZSBwYWdlIGFsc28KKwkgKiBnZXQgZGljdGlvbmFyeSBmb3IgdXNiIHByb3BlcnRpZXM6IHN0ZXAgdXAgdHdvIGxldmVscyBhbmQgZ2V0IENGIGRpY3Rpb25hcnkgZm9yIFVTQiBwcm9wZXJ0aWVzCisJICovCisJaWYgKChLRVJOX1NVQ0NFU1MgPT0gSU9SZWdpc3RyeUVudHJ5R2V0UGFyZW50RW50cnkgKGhpZERldmljZSwga0lPU2VydmljZVBsYW5lLCAmcGFyZW50MSkpICYmCisJCShLRVJOX1NVQ0NFU1MgPT0gSU9SZWdpc3RyeUVudHJ5R2V0UGFyZW50RW50cnkgKHBhcmVudDEsIGtJT1NlcnZpY2VQbGFuZSwgJnBhcmVudDIpKSAmJgorCQkoS0VSTl9TVUNDRVNTID09IElPUmVnaXN0cnlFbnRyeUNyZWF0ZUNGUHJvcGVydGllcyAocGFyZW50MiwgJnVzYlByb3BlcnRpZXMsIGtDRkFsbG9jYXRvckRlZmF1bHQsIGtOaWxPcHRpb25zKSkpCisJeworCQlpZiAodXNiUHJvcGVydGllcykKKwkJeworCQkJQ0ZUeXBlUmVmIHJlZkNGID0gMDsKKwkJCS8qIGdldCBkZXZpY2UgaW5mbworCQkJICogdHJ5IGhpZCBkaWN0aW9uYXJ5IGZpcnN0LCBpZiBmYWlsIHRoZW4gZ28gdG8gdXNiIGRpY3Rpb25hcnkKKwkJCSAqLworCQkJCisJCQkKKwkJCS8qIGdldCBwcm9kdWN0IG5hbWUgKi8KKwkJCXJlZkNGID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKGhpZFByb3BlcnRpZXMsIENGU1RSKGtJT0hJRFByb2R1Y3RLZXkpKTsKKwkJCWlmICghcmVmQ0YpCisJCQkJcmVmQ0YgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAodXNiUHJvcGVydGllcywgQ0ZTVFIoIlVTQiBQcm9kdWN0IE5hbWUiKSk7CisJCQlpZiAocmVmQ0YpCisJCQl7CisJCQkJaWYgKCFDRlN0cmluZ0dldENTdHJpbmcgKHJlZkNGLCBwRGV2aWNlLT5wcm9kdWN0LCAyNTYsIENGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmcgKCkpKQorCQkJCQlTRExfU2V0RXJyb3IgKCJDRlN0cmluZ0dldENTdHJpbmcgZXJyb3IgcmV0cmlldmluZyBwRGV2aWNlLT5wcm9kdWN0LiIpOworCQkJfQorCQkJCisJCQkvKiBnZXQgdXNhZ2UgcGFnZSBhbmQgdXNhZ2UgKi8KKwkJCXJlZkNGID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKGhpZFByb3BlcnRpZXMsIENGU1RSKGtJT0hJRFByaW1hcnlVc2FnZVBhZ2VLZXkpKTsKKwkJCWlmIChyZWZDRikKKwkJCXsKKwkJCQlpZiAoIUNGTnVtYmVyR2V0VmFsdWUgKHJlZkNGLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJnBEZXZpY2UtPnVzYWdlUGFnZSkpCisJCQkJCVNETF9TZXRFcnJvciAoIkNGTnVtYmVyR2V0VmFsdWUgZXJyb3IgcmV0cmlldmluZyBwRGV2aWNlLT51c2FnZVBhZ2UuIik7CisJCQkJcmVmQ0YgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAoaGlkUHJvcGVydGllcywgQ0ZTVFIoa0lPSElEUHJpbWFyeVVzYWdlS2V5KSk7CisJCQkJaWYgKHJlZkNGKQorCQkJCQlpZiAoIUNGTnVtYmVyR2V0VmFsdWUgKHJlZkNGLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJnBEZXZpY2UtPnVzYWdlKSkKKwkJCQkJCVNETF9TZXRFcnJvciAoIkNGTnVtYmVyR2V0VmFsdWUgZXJyb3IgcmV0cmlldmluZyBwRGV2aWNlLT51c2FnZS4iKTsKKwkJCX0KKworCQkJaWYgKE5VTEwgPT0gcmVmQ0YpIC8qIGdldCB0b3AgbGV2ZWwgZWxlbWVudCBISUQgdXNhZ2UgcGFnZSBvciB1c2FnZSAqLworCQkJeworCQkJCS8qIHVzZSB0b3AgbGV2ZWwgZWxlbWVudCBpbnN0ZWFkICovCisJCQkJQ0ZUeXBlUmVmIHJlZkNGVG9wRWxlbWVudCA9IDA7CisJCQkJcmVmQ0ZUb3BFbGVtZW50ID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKGhpZFByb3BlcnRpZXMsIENGU1RSKGtJT0hJREVsZW1lbnRLZXkpKTsKKwkJCQl7CisJCQkJCS8qIHJlZkNGVG9wRWxlbWVudCBwb2ludHMgdG8gYW4gYXJyYXkgb2YgZWxlbWVudCBkaWN0aW9uYXJpZXMgKi8KKwkJCQkJQ0ZSYW5nZSByYW5nZSA9IHswLCBDRkFycmF5R2V0Q291bnQgKHJlZkNGVG9wRWxlbWVudCl9OworCQkJCQlDRkFycmF5QXBwbHlGdW5jdGlvbiAocmVmQ0ZUb3BFbGVtZW50LCByYW5nZSwgSElEVG9wTGV2ZWxFbGVtZW50SGFuZGxlciwgcERldmljZSk7CisJCQkJfQorCQkJfQorCisJCQlDRlJlbGVhc2UgKHVzYlByb3BlcnRpZXMpOworCQl9CisJCWVsc2UKKwkJCVNETF9TZXRFcnJvciAoIklPUmVnaXN0cnlFbnRyeUNyZWF0ZUNGUHJvcGVydGllcyBmYWlsZWQgdG8gY3JlYXRlIHVzYlByb3BlcnRpZXMuIik7CisKKwkJaWYgKGtJT1JldHVyblN1Y2Nlc3MgIT0gSU9PYmplY3RSZWxlYXNlIChwYXJlbnQyKSkKKwkJCVNETF9TZXRFcnJvciAoIklPT2JqZWN0UmVsZWFzZSBlcnJvciB3aXRoIHBhcmVudDIuIik7CisJCWlmIChrSU9SZXR1cm5TdWNjZXNzICE9IElPT2JqZWN0UmVsZWFzZSAocGFyZW50MSkpCisJCQlTRExfU2V0RXJyb3IgKCJJT09iamVjdFJlbGVhc2UgZXJyb3Igd2l0aCBwYXJlbnQxLiIpOworCX0KK30KKworCitzdGF0aWMgcmVjRGV2aWNlICpISURCdWlsZERldmljZSAoaW9fb2JqZWN0X3QgaGlkRGV2aWNlKQoreworCXJlY0RldmljZSAqcERldmljZSA9IChyZWNEZXZpY2UgKikgTmV3UHRyQ2xlYXIgKHNpemVvZiAocmVjRGV2aWNlKSk7CisJaWYgKHBEZXZpY2UpCisJeworCQkvKiBnZXQgZGljdGlvbmFyeSBmb3IgSElEIHByb3BlcnRpZXMgKi8KKwkJQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBoaWRQcm9wZXJ0aWVzID0gMDsKKwkJa2Vybl9yZXR1cm5fdCByZXN1bHQgPSBJT1JlZ2lzdHJ5RW50cnlDcmVhdGVDRlByb3BlcnRpZXMgKGhpZERldmljZSwgJmhpZFByb3BlcnRpZXMsIGtDRkFsbG9jYXRvckRlZmF1bHQsIGtOaWxPcHRpb25zKTsKKwkJaWYgKChyZXN1bHQgPT0gS0VSTl9TVUNDRVNTKSAmJiBoaWRQcm9wZXJ0aWVzKQorCQl7CisJCQkvKiBjcmVhdGUgZGV2aWNlIGludGVyZmFjZSAqLworCQkJcmVzdWx0ID0gSElEQ3JlYXRlT3BlbkRldmljZUludGVyZmFjZSAoaGlkRGV2aWNlLCBwRGV2aWNlKTsKKwkJCWlmIChrSU9SZXR1cm5TdWNjZXNzID09IHJlc3VsdCkKKwkJCXsKKwkJCQlISURHZXREZXZpY2VJbmZvIChoaWREZXZpY2UsIGhpZFByb3BlcnRpZXMsIHBEZXZpY2UpOyAvKiBoaWREZXZpY2UgdXNlZCB0byBmaW5kIHBhcmVudHMgaW4gcmVnaXN0cnkgdHJlZSAqLworCQkJCUhJREdldENvbGxlY3Rpb25FbGVtZW50cyAoaGlkUHJvcGVydGllcywgcERldmljZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJRGlzcG9zZVB0cigoUHRyKXBEZXZpY2UpOworCQkJCXBEZXZpY2UgPSBOVUxMOworCQkJfQorCQkJQ0ZSZWxlYXNlIChoaWRQcm9wZXJ0aWVzKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURpc3Bvc2VQdHIoKFB0cilwRGV2aWNlKTsKKwkJCXBEZXZpY2UgPSBOVUxMOworCQl9CisJfQorCXJldHVybiBwRGV2aWNlOworfQorCisvKiBkaXNwb3NlcyBvZiB0aGUgZWxlbWVudCBsaXN0IGFzc29jaWF0ZWQgd2l0aCBhIGRldmljZSBhbmQgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpc3QKKyAqLworCitzdGF0aWMgdm9pZCBISUREaXNwb3NlRWxlbWVudExpc3QgKHJlY0VsZW1lbnQgKiplbGVtZW50TGlzdCkKK3sKKwlyZWNFbGVtZW50ICpwRWxlbWVudCA9ICplbGVtZW50TGlzdDsKKwl3aGlsZSAocEVsZW1lbnQpCisJeworCQlyZWNFbGVtZW50ICpwRWxlbWVudE5leHQgPSBwRWxlbWVudC0+cE5leHQ7CisJCURpc3Bvc2VQdHIgKChQdHIpIHBFbGVtZW50KTsKKwkJcEVsZW1lbnQgPSBwRWxlbWVudE5leHQ7CisJfQorCSplbGVtZW50TGlzdCA9IE5VTEw7Cit9CisKKy8qIGRpc3Bvc2VzIG9mIGEgc2luZ2xlIGRldmljZSwgY2xvc2luZyBhbmQgcmVsZWFzZWluZyBpbnRlcmZhY2UsIGZyZWVpbmcgbWVtb3J5IGZybyBkZXZpY2UgYW5kIGVsZW1lbnRzLCBzZXR0aW5nIGRldmljZSBwb2ludGVyIHRvIE5VTEwKKyAqIGFsbCB5b3VyIGRldmljZSBubyBsb25nZXIgYmVsb25nIHRvIHVzLi4uIChpLmUuLCB5b3UgZG8gbm90ICdvd24nIHRoZSBkZXZpY2UgYW55bW9yZSkKKyAqLworCitzdGF0aWMgcmVjRGV2aWNlICpISUREaXNwb3NlRGV2aWNlIChyZWNEZXZpY2UgKipwcERldmljZSkKK3sKKwlrZXJuX3JldHVybl90IHJlc3VsdCA9IEtFUk5fU1VDQ0VTUzsKKwlyZWNEZXZpY2UgKnBEZXZpY2VOZXh0ID0gTlVMTDsKKwlpZiAoKnBwRGV2aWNlKQorCXsKKwkJLyogc2F2ZSBuZXh0IGRldmljZSBwcmlvciB0byBkaXNwb3Npbmcgb2YgdGhpcyBkZXZpY2UgKi8KKwkJcERldmljZU5leHQgPSAoKnBwRGV2aWNlKS0+cE5leHQ7CisJCQorCQkvKiBmcmVlIGVsZW1lbnQgbGlzdHMgKi8KKwkJSElERGlzcG9zZUVsZW1lbnRMaXN0ICgmKCpwcERldmljZSktPmZpcnN0QXhpcyk7CisJCUhJRERpc3Bvc2VFbGVtZW50TGlzdCAoJigqcHBEZXZpY2UpLT5maXJzdEJ1dHRvbik7CisJCUhJRERpc3Bvc2VFbGVtZW50TGlzdCAoJigqcHBEZXZpY2UpLT5maXJzdEhhdCk7CisJCQorCQlyZXN1bHQgPSBISURDbG9zZVJlbGVhc2VJbnRlcmZhY2UgKCpwcERldmljZSk7IC8qIGZ1bmN0aW9uIHNhbml0eSBjaGVja3MgaW50ZXJmYWNlIHZhbHVlIChub3cgYXBwbGljYXRpb24gZG9lcyBub3Qgb3duIGRldmljZSkgKi8KKwkJaWYgKGtJT1JldHVyblN1Y2Nlc3MgIT0gcmVzdWx0KQorCQkJSElEUmVwb3J0RXJyb3JOdW0gKCJISURDbG9zZVJlbGVhc2VJbnRlcmZhY2UgZmFpbGVkIHdoZW4gdHJ5aW5nIHRvIGRpcG9zZSBkZXZpY2UuIiwgcmVzdWx0KTsKKwkJRGlzcG9zZVB0ciAoKFB0cikqcHBEZXZpY2UpOworCQkqcHBEZXZpY2UgPSBOVUxMOworCX0KKwlyZXR1cm4gcERldmljZU5leHQ7Cit9CisKKworLyogRnVuY3Rpb24gdG8gc2NhbiB0aGUgc3lzdGVtIGZvciBqb3lzdGlja3MuCisgKiBKb3lzdGljayAwIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgam95c3RpY2suCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgam95c3RpY2tzLCBvciAtMQorICogb24gYW4gdW5yZWNvdmVyYWJsZSBmYXRhbCBlcnJvci4KKyAqLworaW50IFNETF9TWVNfSm95c3RpY2tJbml0KHZvaWQpCit7CisJSU9SZXR1cm4gcmVzdWx0ID0ga0lPUmV0dXJuU3VjY2VzczsKKwltYWNoX3BvcnRfdCBtYXN0ZXJQb3J0ID0gMDsKKwlpb19pdGVyYXRvcl90IGhpZE9iamVjdEl0ZXJhdG9yID0gMDsKKwlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGhpZE1hdGNoRGljdGlvbmFyeSA9IE5VTEw7CisJcmVjRGV2aWNlICpkZXZpY2UsICpsYXN0RGV2aWNlOworCWlvX29iamVjdF90IGlvSElERGV2aWNlT2JqZWN0ID0gMDsKKwkKKwlTRExfbnVtam95c3RpY2tzID0gMDsKKwkKKwlpZiAoZ3BEZXZpY2VMaXN0KQorCXsKKwkJU0RMX1NldEVycm9yKCJKb3lzdGljazogRGV2aWNlIGxpc3QgYWxyZWFkeSBpbml0ZWQuIik7CisJCXJldHVybiAtMTsKKwl9CisJCisJcmVzdWx0ID0gSU9NYXN0ZXJQb3J0IChib290c3RyYXBfcG9ydCwgJm1hc3RlclBvcnQpOworCWlmIChrSU9SZXR1cm5TdWNjZXNzICE9IHJlc3VsdCkKKwl7CisJCVNETF9TZXRFcnJvcigiSm95c3RpY2s6IElPTWFzdGVyUG9ydCBlcnJvciB3aXRoIGJvb3RzdHJhcF9wb3J0LiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2V0IHVwIGEgbWF0Y2hpbmcgZGljdGlvbmFyeSB0byBzZWFyY2ggSS9PIFJlZ2lzdHJ5IGJ5IGNsYXNzIG5hbWUgZm9yIGFsbCBISUQgY2xhc3MgZGV2aWNlcy4gKi8KKwloaWRNYXRjaERpY3Rpb25hcnkgPSBJT1NlcnZpY2VNYXRjaGluZyAoa0lPSElERGV2aWNlS2V5KTsKKwlpZiAoaGlkTWF0Y2hEaWN0aW9uYXJ5KQorCXsKKwkJLyogQWRkIGtleSBmb3IgZGV2aWNlIHR5cGUgKGpveXN0aWNrLCBpbiB0aGlzIGNhc2UpIHRvIHJlZmluZSB0aGUgbWF0Y2hpbmcgZGljdGlvbmFyeS4gKi8KKwkJCisJCS8qIE5PVEU6IHdlIG5vdyBwZXJmb3JtIHRoaXMgZmlsdGVyaW5nIGxhdGVyCisJCVVJbnQzMiB1c2FnZVBhZ2UgPSBrSElEUGFnZV9HZW5lcmljRGVza3RvcDsKKwkJVUludDMyIHVzYWdlID0ga0hJRFVzYWdlX0dEX0pveXN0aWNrOworCQlDRk51bWJlclJlZiByZWZVc2FnZSA9IE5VTEwsIHJlZlVzYWdlUGFnZSA9IE5VTEw7CisKKwkJcmVmVXNhZ2UgPSBDRk51bWJlckNyZWF0ZSAoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVySW50VHlwZSwgJnVzYWdlKTsKKwkJQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUgKGhpZE1hdGNoRGljdGlvbmFyeSwgQ0ZTVFIgKGtJT0hJRFByaW1hcnlVc2FnZUtleSksIHJlZlVzYWdlKTsKKwkJcmVmVXNhZ2VQYWdlID0gQ0ZOdW1iZXJDcmVhdGUgKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZ1c2FnZVBhZ2UpOworCQlDRkRpY3Rpb25hcnlTZXRWYWx1ZSAoaGlkTWF0Y2hEaWN0aW9uYXJ5LCBDRlNUUiAoa0lPSElEUHJpbWFyeVVzYWdlUGFnZUtleSksIHJlZlVzYWdlUGFnZSk7CisJCSovCisJfQorCWVsc2UKKwl7CisJCVNETF9TZXRFcnJvcigiSm95c3RpY2s6IEZhaWxlZCB0byBnZXQgSElEIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgdmlhIElPU2VydmljZU1hdGNoaW5nLiIpOworCQlyZXR1cm4gLTE7CisJfQorCQorCS8qLyBOb3cgc2VhcmNoIEkvTyBSZWdpc3RyeSBmb3IgbWF0Y2hpbmcgZGV2aWNlcy4gKi8KKwlyZXN1bHQgPSBJT1NlcnZpY2VHZXRNYXRjaGluZ1NlcnZpY2VzIChtYXN0ZXJQb3J0LCBoaWRNYXRjaERpY3Rpb25hcnksICZoaWRPYmplY3RJdGVyYXRvcik7CisJLyogQ2hlY2sgZm9yIGVycm9ycyAqLworCWlmIChrSU9SZXR1cm5TdWNjZXNzICE9IHJlc3VsdCkKKwl7CisJCVNETF9TZXRFcnJvcigiSm95c3RpY2s6IENvdWxkbid0IGNyZWF0ZSBhIEhJRCBvYmplY3QgaXRlcmF0b3IuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCFoaWRPYmplY3RJdGVyYXRvcikgLyogdGhlcmUgYXJlIG5vIGpveXN0aWNrcyAqLworCXsKKwkJZ3BEZXZpY2VMaXN0ID0gTlVMTDsKKwkJU0RMX251bWpveXN0aWNrcyA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKiBJT1NlcnZpY2VHZXRNYXRjaGluZ1NlcnZpY2VzIGNvbnN1bWVzIGEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5LCBzbyB3ZSBkb24ndCBuZWVkIHRvIHJlbGVhc2UgdGhlIGRpY3Rpb25hcnkgcmVmLiAqLworCisJLyogYnVpbGQgZmxhdCBsaW5rZWQgbGlzdCBvZiBkZXZpY2VzIGZyb20gZGV2aWNlIGl0ZXJhdG9yICovCisKKwlncERldmljZUxpc3QgPSBsYXN0RGV2aWNlID0gTlVMTDsKKwkKKwl3aGlsZSAoKGlvSElERGV2aWNlT2JqZWN0ID0gSU9JdGVyYXRvck5leHQgKGhpZE9iamVjdEl0ZXJhdG9yKSkpCisJeworCQkvKiBidWlsZCBhIGRldmljZSByZWNvcmQgKi8KKwkJZGV2aWNlID0gSElEQnVpbGREZXZpY2UgKGlvSElERGV2aWNlT2JqZWN0KTsKKwkJaWYgKCFkZXZpY2UpCisJCQljb250aW51ZTsKKworCQkvKiBkdW1wIGRldmljZSBvYmplY3QsIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKwkJcmVzdWx0ID0gSU9PYmplY3RSZWxlYXNlIChpb0hJRERldmljZU9iamVjdCk7CisvKgkJaWYgKEtFUk5fU1VDQ0VTUyAhPSByZXN1bHQpCisJCQlISURSZXBvcnRFcnJvck51bSAoIklPT2JqZWN0UmVsZWFzZSBlcnJvciB3aXRoIGlvSElERGV2aWNlT2JqZWN0LiIsIHJlc3VsdCk7CisqLworCisJCS8qIEZpbHRlciBkZXZpY2UgbGlzdCB0byBub24ta2V5Ym9hcmQvbW91c2Ugc3R1ZmYgKi8gCisJCWlmICggKGRldmljZS0+dXNhZ2VQYWdlICE9IGtISURQYWdlX0dlbmVyaWNEZXNrdG9wKSB8fAorCQkgICAgICgoZGV2aWNlLT51c2FnZSAhPSBrSElEVXNhZ2VfR0RfSm95c3RpY2sgJiYKKwkJICAgICAgZGV2aWNlLT51c2FnZSAhPSBrSElEVXNhZ2VfR0RfR2FtZVBhZCAmJgorCQkgICAgICBkZXZpY2UtPnVzYWdlICE9IGtISURVc2FnZV9HRF9NdWx0aUF4aXNDb250cm9sbGVyKSkgKSB7CisKKwkJCS8qIHJlbGVhc2UgbWVtb3J5IGZvciB0aGUgZGV2aWNlICovCisJCQlISUREaXNwb3NlRGV2aWNlICgmZGV2aWNlKTsKKwkJCURpc3Bvc2VQdHIoKFB0cilkZXZpY2UpOworCQkJY29udGludWU7CisJCX0KKwkJCisJCS8qIEFkZCBkZXZpY2UgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCAqLworCQlpZiAobGFzdERldmljZSkKKwkJCWxhc3REZXZpY2UtPnBOZXh0ID0gZGV2aWNlOworCQllbHNlCisJCQlncERldmljZUxpc3QgPSBkZXZpY2U7CisJCWxhc3REZXZpY2UgPSBkZXZpY2U7CisJfQorCXJlc3VsdCA9IElPT2JqZWN0UmVsZWFzZSAoaGlkT2JqZWN0SXRlcmF0b3IpOyAvKiByZWxlYXNlIHRoZSBpdGVyYXRvciAqLworCisJLyogQ291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBkZXZpY2VzIHdlIGZvdW5kICovCisJZGV2aWNlID0gZ3BEZXZpY2VMaXN0OworCXdoaWxlIChkZXZpY2UpCisJeworCQlTRExfbnVtam95c3RpY2tzKys7CisJCWRldmljZSA9IGRldmljZS0+cE5leHQ7CisJfQorCQorCXJldHVybiBTRExfbnVtam95c3RpY2tzOworfQorCisvKiBGdW5jdGlvbiB0byBnZXQgdGhlIGRldmljZS1kZXBlbmRlbnQgbmFtZSBvZiBhIGpveXN0aWNrICovCitjb25zdCBjaGFyICpTRExfU1lTX0pveXN0aWNrTmFtZShpbnQgaW5kZXgpCit7CisJcmVjRGV2aWNlICpkZXZpY2UgPSBncERldmljZUxpc3Q7CisJCisJZm9yICg7IGluZGV4ID4gMDsgaW5kZXgtLSkKKwkJZGV2aWNlID0gZGV2aWNlLT5wTmV4dDsKKworCXJldHVybiBkZXZpY2UtPnByb2R1Y3Q7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIG9wZW4gYSBqb3lzdGljayBmb3IgdXNlLgorICogVGhlIGpveXN0aWNrIHRvIG9wZW4gaXMgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCBmaWVsZCBvZiB0aGUgam95c3RpY2suCisgKiBUaGlzIHNob3VsZCBmaWxsIHRoZSBuYnV0dG9ucyBhbmQgbmF4ZXMgZmllbGRzIG9mIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUuCisgKiBJdCByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICovCitpbnQgU0RMX1NZU19Kb3lzdGlja09wZW4oU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlyZWNEZXZpY2UgKmRldmljZSA9IGdwRGV2aWNlTGlzdDsKKwlpbnQgaW5kZXg7CisJCisJZm9yIChpbmRleCA9IGpveXN0aWNrLT5pbmRleDsgaW5kZXggPiAwOyBpbmRleC0tKQorCQlkZXZpY2UgPSBkZXZpY2UtPnBOZXh0OworCisJam95c3RpY2stPmh3ZGF0YSA9IGRldmljZTsKKwlqb3lzdGljay0+bmFtZSA9IGRldmljZS0+cHJvZHVjdDsKKworCWpveXN0aWNrLT5uYXhlcyA9IGRldmljZS0+YXhlczsKKwlqb3lzdGljay0+bmhhdHMgPSBkZXZpY2UtPmhhdHM7CisJam95c3RpY2stPm5iYWxscyA9IDA7CisJam95c3RpY2stPm5idXR0b25zID0gZGV2aWNlLT5idXR0b25zOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCisgKiBidXQgaW5zdGVhZCBzaG91bGQgY2FsbCBTRExfUHJpdmF0ZUpveXN0aWNrKigpIHRvIGRlbGl2ZXIgZXZlbnRzCisgKiBhbmQgdXBkYXRlIGpveXN0aWNrIGRldmljZSBzdGF0ZS4KKyAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7CisJcmVjRGV2aWNlICpkZXZpY2UgPSBqb3lzdGljay0+aHdkYXRhOworCXJlY0VsZW1lbnQgKmVsZW1lbnQ7CisJU0ludDMyIHZhbHVlLCByYW5nZTsKKwlpbnQgaTsKKworCWlmIChkZXZpY2UtPnJlbW92ZWQpICAvKiBkZXZpY2Ugd2FzIHVucGx1Z2dlZDsgaWdub3JlIGl0LiAqLworCXsKKwkJaWYgKGRldmljZS0+dW5jZW50ZXJlZCkKKwkJeworCQkJZGV2aWNlLT51bmNlbnRlcmVkID0gMDsKKworCQkJLyogVGVsbCB0aGUgYXBwIHRoYXQgZXZlcnl0aGluZyBpcyBjZW50ZXJlZC91bnByZXNzZWQuLi4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPmF4ZXM7IGkrKykKKwkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywgaSwgMCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPmJ1dHRvbnM7IGkrKykKKwkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLCBpLCAwKTsKKworCQkJZm9yIChpID0gMDsgaSA8IGRldmljZS0+aGF0czsgaSsrKQorCQkJCVNETF9Qcml2YXRlSm95c3RpY2tIYXQoam95c3RpY2ssIGksIFNETF9IQVRfQ0VOVEVSRUQpOworCQl9CisKKwkJcmV0dXJuOworCX0KKworCWVsZW1lbnQgPSBkZXZpY2UtPmZpcnN0QXhpczsKKwlpID0gMDsKKwl3aGlsZSAoZWxlbWVudCkKKwl7CisJCXZhbHVlID0gSElEU2NhbGVkQ2FsaWJyYXRlZFZhbHVlKGRldmljZSwgZWxlbWVudCwgLTMyNzY4LCAzMjc2Nyk7CisJCWlmICggdmFsdWUgIT0gam95c3RpY2stPmF4ZXNbaV0gKQorCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssIGksIHZhbHVlKTsKKwkJZWxlbWVudCA9IGVsZW1lbnQtPnBOZXh0OworCQkrK2k7CisJfQorCQorCWVsZW1lbnQgPSBkZXZpY2UtPmZpcnN0QnV0dG9uOworCWkgPSAwOworCXdoaWxlIChlbGVtZW50KQorCXsKKwkJdmFsdWUgPSBISURHZXRFbGVtZW50VmFsdWUoZGV2aWNlLCBlbGVtZW50KTsKKyAgICAgICAgaWYgKHZhbHVlID4gMSkgIC8qIGhhbmRsZSBwcmVzc3VyZS1zZW5zaXRpdmUgYnV0dG9ucyAqLworICAgICAgICAgICAgdmFsdWUgPSAxOworCQlpZiAoIHZhbHVlICE9IGpveXN0aWNrLT5idXR0b25zW2ldICkKKwkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIGksIHZhbHVlKTsKKwkJZWxlbWVudCA9IGVsZW1lbnQtPnBOZXh0OworCQkrK2k7CisJfQorCSAgICAKKwllbGVtZW50ID0gZGV2aWNlLT5maXJzdEhhdDsKKwlpID0gMDsKKwl3aGlsZSAoZWxlbWVudCkKKwl7CisJCVVpbnQ4IHBvcyA9IDA7CisKKwkJcmFuZ2UgPSAoZWxlbWVudC0+bWF4IC0gZWxlbWVudC0+bWluICsgMSk7CisJCXZhbHVlID0gSElER2V0RWxlbWVudFZhbHVlKGRldmljZSwgZWxlbWVudCkgLSBlbGVtZW50LT5taW47CisJCWlmIChyYW5nZSA9PSA0KSAvKiA0IHBvc2l0aW9uIGhhdHN3aXRjaCAtIHNjYWxlIHVwIHZhbHVlICovCisJCQl2YWx1ZSAqPSAyOworCQllbHNlIGlmIChyYW5nZSAhPSA4KSAvKiBOZWl0aGVyIGEgNCBub3IgOCBwb3NpdGlvbnMgLSBmYWxsIGJhY2sgdG8gZGVmYXVsdCBwb3NpdGlvbiAoY2VudGVyZWQpICovCisJCQl2YWx1ZSA9IC0xOworCQlzd2l0Y2godmFsdWUpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQlwb3MgPSBTRExfSEFUX1VQOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXBvcyA9IFNETF9IQVRfUklHSFRVUDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwb3MgPSBTRExfSEFUX1JJR0hUOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXBvcyA9IFNETF9IQVRfUklHSFRET1dOOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXBvcyA9IFNETF9IQVRfRE9XTjsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlwb3MgPSBTRExfSEFUX0xFRlRET1dOOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCXBvcyA9IFNETF9IQVRfTEVGVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCQlwb3MgPSBTRExfSEFUX0xFRlRVUDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogRXZlcnkgb3RoZXIgdmFsdWUgaXMgbWFwcGVkIHRvIGNlbnRlci4gV2UgZG8gdGhhdCBiZWNhdXNlIHNvbWUKKwkJCQkgKiBqb3lzdGlja3MgdXNlIDggYW5kIHNvbWUgMTUgZm9yIHRoaXMgdmFsdWUsIGFuZCBhcHBhcmVudGx5CisJCQkJICogdGhlcmUgYXJlIGV2ZW4gbW9yZSB2YXJpYW50cyBvdXQgdGhlcmUgLSBzbyB3ZSB0cnkgdG8gYmUgZ2VuZXJvdXMuCisJCQkJICovCisJCQkJcG9zID0gU0RMX0hBVF9DRU5URVJFRDsKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIHBvcyAhPSBqb3lzdGljay0+aGF0c1tpXSApCisJCQlTRExfUHJpdmF0ZUpveXN0aWNrSGF0KGpveXN0aWNrLCBpLCBwb3MpOworCQllbGVtZW50ID0gZWxlbWVudC0+cE5leHQ7CisJCSsraTsKKwl9CisJCisJcmV0dXJuOworfQorCisvKiBGdW5jdGlvbiB0byBjbG9zZSBhIGpveXN0aWNrIGFmdGVyIHVzZSAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwkvKiBTaG91bGQgd2UgZG8gYW55dGhpbmcgaGVyZT8gKi8KKwlyZXR1cm47Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHBlcmZvcm0gYW55IHN5c3RlbS1zcGVjaWZpYyBqb3lzdGljayByZWxhdGVkIGNsZWFudXAgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCkKK3sKKwl3aGlsZSAoTlVMTCAhPSBncERldmljZUxpc3QpCisJCWdwRGV2aWNlTGlzdCA9IEhJRERpc3Bvc2VEZXZpY2UgKCZncERldmljZUxpc3QpOworfQorCisjZW5kaWYgLyogU0RMX0pPWVNUSUNLX0lPS0lUICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL2RjL1NETF9zeXNqb3lzdGljay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9kYy9TRExfc3lzam95c3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA4OWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9kYy9TRExfc3lzam95c3RpY2suYwpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfSk9ZU1RJQ0tfREMKKworI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfam95c3RpY2suaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzam95c3RpY2suaCIKKyNpbmNsdWRlICIuLi9TRExfam95c3RpY2tfYy5oIgorCisjaW5jbHVkZSA8ZGMvbWFwbGUuaD4KKyNpbmNsdWRlIDxkYy9tYXBsZS9jb250cm9sbGVyLmg+CisKKyNkZWZpbmUgTUFYX0pPWVNUSUNLUwk4CS8qIG9ubHkgMiBhcmUgc3VwcG9ydGVkIGluIHRoZSBtdWx0aW1lZGlhIEFQSSAqLworI2RlZmluZSBNQVhfQVhFUwk2CS8qIGVhY2ggam95c3RpY2sgY2FuIGhhdmUgdXAgdG8gNiBheGVzICovCisjZGVmaW5lIE1BWF9CVVRUT05TCTgJLyogYW5kIDggYnV0dG9ucyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlNQVhfSEFUUwkyCisKKyNkZWZpbmUJSk9ZTkFNRUxFTgk4CisKKy8qIGFycmF5IHRvIGhvbGQgam95c3RpY2sgSUQgdmFsdWVzICovCitzdGF0aWMgdWludDgJU1lTX0pveXN0aWNrX2FkZHJbTUFYX0pPWVNUSUNLU107CisKKy8qIFRoZSBwcml2YXRlIHN0cnVjdHVyZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYSBqb3lzdGljayAqLworc3RydWN0IGpveXN0aWNrX2h3ZGF0YQoreworCWNvbnRfY29uZF90IHByZXZfY29uZDsKKwlpbnQgcHJldl9idXR0b25zOworfTsKKworLyogRnVuY3Rpb24gdG8gc2NhbiB0aGUgc3lzdGVtIGZvciBqb3lzdGlja3MuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzZXQgU0RMX251bWpveXN0aWNrcyB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQorICogam95c3RpY2tzLiAgSm95c3RpY2sgMCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IGpveXN0aWNrLgorICogSXQgc2hvdWxkIHJldHVybiAwLCBvciAtMSBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgorICovCitpbnQgU0RMX1NZU19Kb3lzdGlja0luaXQodm9pZCkKK3sKKwlpbnQgbnVtZGV2czsKKworCWludCBwLHU7CisKKwludW1kZXZzID0gMDsKKwlmb3IocD0wO3A8TUFQTEVfUE9SVF9DT1VOVDtwKyspIHsKKwkJZm9yKHU9MDt1PE1BUExFX1VOSVRfQ09VTlQ7dSsrKSB7CisJCQlpZiAobWFwbGVfZGV2aWNlX2Z1bmMocCx1KSZNQVBMRV9GVU5DX0NPTlRST0xMRVIpIHsKKwkJCQlTWVNfSm95c3RpY2tfYWRkcltudW1kZXZzXSA9IG1hcGxlX2FkZHIocCx1KTsKKwkJCQludW1kZXZzKys7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4obnVtZGV2cyk7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGdldCB0aGUgZGV2aWNlLWRlcGVuZGVudCBuYW1lIG9mIGEgam95c3RpY2sgKi8KK2NvbnN0IGNoYXIgKlNETF9TWVNfSm95c3RpY2tOYW1lKGludCBpbmRleCkKK3sKKwltYXBsZV9kZXZpY2VfdCAqZGV2OworCWlmIChtYXBsZV9jb21wYXRfcmVzb2x2ZShTWVNfSm95c3RpY2tfYWRkcltpbmRleF0sJmRldixNQVBMRV9GVU5DX0NPTlRST0xMRVIpIT0wKSByZXR1cm4gTlVMTDsKKwlyZXR1cm4gZGV2LT5pbmZvLnByb2R1Y3RfbmFtZTsKK30KKworLyogRnVuY3Rpb24gdG8gb3BlbiBhIGpveXN0aWNrIGZvciB1c2UuCisgICBUaGUgam95c3RpY2sgdG8gb3BlbiBpcyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGZpZWxkIG9mIHRoZSBqb3lzdGljay4KKyAgIFRoaXMgc2hvdWxkIGZpbGwgdGhlIG5idXR0b25zIGFuZCBuYXhlcyBmaWVsZHMgb2YgdGhlIGpveXN0aWNrIHN0cnVjdHVyZS4KKyAgIEl0IHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgKi8KK2ludCBTRExfU1lTX0pveXN0aWNrT3BlbihTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3lzdGVtIHNwZWNpZmljIGhhcmR3YXJlIGRhdGEgKi8KKwlqb3lzdGljay0+aHdkYXRhID0gKHN0cnVjdCBqb3lzdGlja19od2RhdGEgKikgU0RMX21hbGxvYyhzaXplb2YoKmpveXN0aWNrLT5od2RhdGEpKTsKKwlpZiAoam95c3RpY2stPmh3ZGF0YSA9PSBOVUxMKQorCXsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tZW1zZXQoam95c3RpY2stPmh3ZGF0YSwgMCwgc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7CisKKwkvKiBmaWxsIG5idXR0b25zLCBuYXhlcywgYW5kIG5oYXRzIGZpZWxkcyAqLworCWpveXN0aWNrLT5uYnV0dG9ucyA9IE1BWF9CVVRUT05TOworCWpveXN0aWNrLT5uYXhlcyA9IE1BWF9BWEVTOworCWpveXN0aWNrLT5uaGF0cyA9IE1BWF9IQVRTOworCXJldHVybigwKTsKK30KKworCisvKiBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHN0YXRlIG9mIGEgam95c3RpY2sgLSBjYWxsZWQgYXMgYSBkZXZpY2UgcG9sbC4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IHVwZGF0ZSB0aGUgam95c3RpY2sgc3RydWN0dXJlIGRpcmVjdGx5LAorICogYnV0IGluc3RlYWQgc2hvdWxkIGNhbGwgU0RMX1ByaXZhdGVKb3lzdGljayooKSB0byBkZWxpdmVyIGV2ZW50cworICogYW5kIHVwZGF0ZSBqb3lzdGljayBkZXZpY2Ugc3RhdGUuCisgKi8KKwordm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7Citjb25zdAlpbnQgc2RsX2J1dHRvbnNbXSA9IHsKKwlDT05UX0MsCisJQ09OVF9CLAorCUNPTlRfQSwKKwlDT05UX1NUQVJULAorCUNPTlRfWiwKKwlDT05UX1ksCisJQ09OVF9YLAorCUNPTlRfRAorfTsKKworCXVpbnQ4IGFkZHI7CisJY29udF9jb25kX3QgY29uZCwqcHJldl9jb25kOworCWludCBidXR0b25zLHByZXZfYnV0dG9ucyxpLGNoYW5nZWQ7CisKKwlhZGRyID0gU1lTX0pveXN0aWNrX2FkZHJbam95c3RpY2stPmluZGV4XTsKKwlpZiAoY29udF9nZXRfY29uZChhZGRyLCZjb25kKTwwKSByZXR1cm47CisKKwlidXR0b25zID0gY29uZC5idXR0b25zOworCXByZXZfYnV0dG9ucyA9IGpveXN0aWNrLT5od2RhdGEtPnByZXZfYnV0dG9uczsKKwljaGFuZ2VkID0gYnV0dG9uc15wcmV2X2J1dHRvbnM7CisKKwlpZiAoKGNoYW5nZWQpJihDT05UX0RQQURfVVB8Q09OVF9EUEFEX0RPV058Q09OVF9EUEFEX0xFRlR8Q09OVF9EUEFEX1JJR0hUKSkgeworCQlpbnQgaGF0ID0gU0RMX0hBVF9DRU5URVJFRDsKKwkJaWYgKGJ1dHRvbnMmQ09OVF9EUEFEX1VQKSBoYXR8PVNETF9IQVRfVVA7CisJCWlmIChidXR0b25zJkNPTlRfRFBBRF9ET1dOKSBoYXR8PVNETF9IQVRfRE9XTjsKKwkJaWYgKGJ1dHRvbnMmQ09OVF9EUEFEX0xFRlQpIGhhdHw9U0RMX0hBVF9MRUZUOworCQlpZiAoYnV0dG9ucyZDT05UX0RQQURfUklHSFQpIGhhdHw9U0RMX0hBVF9SSUdIVDsKKwkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgMCwgaGF0KTsKKwl9CisJaWYgKChjaGFuZ2VkKSYoQ09OVF9EUEFEMl9VUHxDT05UX0RQQUQyX0RPV058Q09OVF9EUEFEMl9MRUZUfENPTlRfRFBBRDJfUklHSFQpKSB7CisJCWludCBoYXQgPSBTRExfSEFUX0NFTlRFUkVEOworCQlpZiAoYnV0dG9ucyZDT05UX0RQQUQyX1VQKSBoYXR8PVNETF9IQVRfVVA7CisJCWlmIChidXR0b25zJkNPTlRfRFBBRDJfRE9XTikgaGF0fD1TRExfSEFUX0RPV047CisJCWlmIChidXR0b25zJkNPTlRfRFBBRDJfTEVGVCkgaGF0fD1TRExfSEFUX0xFRlQ7CisJCWlmIChidXR0b25zJkNPTlRfRFBBRDJfUklHSFQpIGhhdHw9U0RMX0hBVF9SSUdIVDsKKwkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgMSwgaGF0KTsKKwl9CisKKwlmb3IoaT0wO2k8c2l6ZW9mKHNkbF9idXR0b25zKS9zaXplb2Yoc2RsX2J1dHRvbnNbMF0pO2krKykgeworCQlpZiAoY2hhbmdlZCAmIHNkbF9idXR0b25zW2ldKSB7CisJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLCBpLCAoYnV0dG9ucyAmIHNkbF9idXR0b25zW2ldKT9TRExfUFJFU1NFRDpTRExfUkVMRUFTRUQpOworCQl9CisJfQorCisJcHJldl9jb25kID0gJmpveXN0aWNrLT5od2RhdGEtPnByZXZfY29uZDsKKwlpZiAoY29uZC5qb3l4IT1wcmV2X2NvbmQtPmpveXgpCisJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLCAwLCBjb25kLmpveXgtMTI4KTsKKwlpZiAoY29uZC5qb3l5IT1wcmV2X2NvbmQtPmpveXkpCisJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLCAxLCBjb25kLmpveXktMTI4KTsKKwlpZiAoY29uZC5ydHJpZyE9cHJldl9jb25kLT5ydHJpZykKKwkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssIDIsIGNvbmQucnRyaWcpOworCWlmIChjb25kLmx0cmlnIT1wcmV2X2NvbmQtPmx0cmlnKQorCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywgMywgY29uZC5sdHJpZyk7CisJaWYgKGNvbmQuam95MnghPXByZXZfY29uZC0+am95MngpCisJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLCA0LCBjb25kLmpveTJ4LTEyOCk7CisJaWYgKGNvbmQuam95MnkhPXByZXZfY29uZC0+am95MnkpCisJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLCA1LCBjb25kLmpveTJ5LTEyOCk7CisKKwlqb3lzdGljay0+aHdkYXRhLT5wcmV2X2J1dHRvbnMgPSBidXR0b25zOworCWpveXN0aWNrLT5od2RhdGEtPnByZXZfY29uZCA9IGNvbmQ7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGNsb3NlIGEgam95c3RpY2sgYWZ0ZXIgdXNlICovCit2b2lkIFNETF9TWVNfSm95c3RpY2tDbG9zZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCWlmIChqb3lzdGljay0+aHdkYXRhICE9IE5VTEwpIHsKKwkJLyogZnJlZSBzeXN0ZW0gc3BlY2lmaWMgaGFyZHdhcmUgZGF0YSAqLworCQlTRExfZnJlZShqb3lzdGljay0+aHdkYXRhKTsKKwl9Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHBlcmZvcm0gYW55IHN5c3RlbS1zcGVjaWZpYyBqb3lzdGljayByZWxhdGVkIGNsZWFudXAgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBTRExfSk9ZU1RJQ0tfREMgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svZHVtbXkvU0RMX3N5c2pveXN0aWNrLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL2R1bW15L1NETF9zeXNqb3lzdGljay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMWFhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL2R1bW15L1NETF9zeXNqb3lzdGljay5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChTRExfSk9ZU1RJQ0tfRFVNTVkpIHx8IGRlZmluZWQoU0RMX0pPWVNUSUNLX0RJU0FCTEVEKQorCisvKiBUaGlzIGlzIHRoZSBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZvciB0aGUgU0RMIGpveXN0aWNrIEFQSSAqLworCisjaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c2pveXN0aWNrLmgiCisjaW5jbHVkZSAiLi4vU0RMX2pveXN0aWNrX2MuaCIKKworLyogRnVuY3Rpb24gdG8gc2NhbiB0aGUgc3lzdGVtIGZvciBqb3lzdGlja3MuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzZXQgU0RMX251bWpveXN0aWNrcyB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQorICogam95c3RpY2tzLiAgSm95c3RpY2sgMCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IGpveXN0aWNrLgorICogSXQgc2hvdWxkIHJldHVybiAwLCBvciAtMSBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgorICovCitpbnQgU0RMX1NZU19Kb3lzdGlja0luaXQodm9pZCkKK3sKKwlTRExfbnVtam95c3RpY2tzID0gMDsKKwlyZXR1cm4oMCk7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGdldCB0aGUgZGV2aWNlLWRlcGVuZGVudCBuYW1lIG9mIGEgam95c3RpY2sgKi8KK2NvbnN0IGNoYXIgKlNETF9TWVNfSm95c3RpY2tOYW1lKGludCBpbmRleCkKK3sKKwlTRExfU2V0RXJyb3IoIkxvZ2ljIGVycm9yOiBObyBqb3lzdGlja3MgYXZhaWxhYmxlIik7CisJcmV0dXJuKE5VTEwpOworfQorCisvKiBGdW5jdGlvbiB0byBvcGVuIGEgam95c3RpY2sgZm9yIHVzZS4KKyAgIFRoZSBqb3lzdGljayB0byBvcGVuIGlzIHNwZWNpZmllZCBieSB0aGUgaW5kZXggZmllbGQgb2YgdGhlIGpveXN0aWNrLgorICAgVGhpcyBzaG91bGQgZmlsbCB0aGUgbmJ1dHRvbnMgYW5kIG5heGVzIGZpZWxkcyBvZiB0aGUgam95c3RpY2sgc3RydWN0dXJlLgorICAgSXQgcmV0dXJucyAwLCBvciAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAqLworaW50IFNETF9TWVNfSm95c3RpY2tPcGVuKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7CisJU0RMX1NldEVycm9yKCJMb2dpYyBlcnJvcjogTm8gam95c3RpY2tzIGF2YWlsYWJsZSIpOworCXJldHVybigtMSk7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCisgKiBidXQgaW5zdGVhZCBzaG91bGQgY2FsbCBTRExfUHJpdmF0ZUpveXN0aWNrKigpIHRvIGRlbGl2ZXIgZXZlbnRzCisgKiBhbmQgdXBkYXRlIGpveXN0aWNrIGRldmljZSBzdGF0ZS4KKyAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7CisJcmV0dXJuOworfQorCisvKiBGdW5jdGlvbiB0byBjbG9zZSBhIGpveXN0aWNrIGFmdGVyIHVzZSAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlyZXR1cm47Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHBlcmZvcm0gYW55IHN5c3RlbS1zcGVjaWZpYyBqb3lzdGljayByZWxhdGVkIGNsZWFudXAgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBTRExfSk9ZU1RJQ0tfRFVNTVkgfHwgU0RMX0pPWVNUSUNLX0RJU0FCTEVEICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL2xpbnV4L1NETF9zeXNqb3lzdGljay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9saW51eC9TRExfc3lzam95c3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTQzOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9saW51eC9TRExfc3lzam95c3RpY2suYwpAQCAtMCwwICsxLDEyMTggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0pPWVNUSUNLX0xJTlVYCisKKy8qIFRoaXMgaXMgdGhlIHN5c3RlbSBzcGVjaWZpYyBoZWFkZXIgZm9yIHRoZSBTREwgam95c3RpY2sgQVBJICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CQkvKiBGb3IgdGhlIGRlZmluaXRpb24gb2YgUEFUSF9NQVggKi8KKyNpbmNsdWRlIDxsaW51eC9qb3lzdGljay5oPgorI2lmIFNETF9JTlBVVF9MSU5VWEVWCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c2pveXN0aWNrLmgiCisjaW5jbHVkZSAiLi4vU0RMX2pveXN0aWNrX2MuaCIKKworLyogU3BlY2lhbCBqb3lzdGljayBjb25maWd1cmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbmF4ZXM7CisJaW50IG5oYXRzOworCWludCBuYmFsbHM7Cit9IHNwZWNpYWxfam95c3RpY2tzW10gPSB7CisJeyAiTWFkQ2F0eiBQYW50aGVyIFhMIiwgMywgMiwgMSB9LCAvKiBXZSBkb24ndCBoYW5kbGUgcnVkZGVyIChheGlzIDgpICovCisJeyAiU2lkZVdpbmRlciBQcmVjaXNpb24gUHJvIiwgNCwgMSwgMCB9LAorCXsgIlNpZGVXaW5kZXIgM0QgUHJvIiwgNCwgMSwgMCB9LAorCXsgIk1pY3Jvc29mdCBTaWRlV2luZGVyIDNEIFBybyIsIDQsIDEsIDAgfSwKKwl7ICJNaWNyb3NvZnQgU2lkZVdpbmRlciBQcmVjaXNpb24gUHJvIiwgNCwgMSwgMCB9LAorCXsgIk1pY3Jvc29mdCBTaWRlV2luZGVyIER1YWwgU3RyaWtlIFVTQiB2ZXJzaW9uIDEuMCIsIDIsIDEsIDAgfSwKKwl7ICJXaW5nTWFuIEludGVyY2VwdG9yIiwgMywgMywgMCB9LAorCXsgIldpbmdNYW4gRXh0cmVtZSBEaWdpdGFsIDNEIiwgNCwgMSwgMCB9LAorCXsgIk1pY3Jvc29mdCBTaWRlV2luZGVyIFByZWNpc2lvbiAyIEpveXN0aWNrIiwgNCwgMSwgMCB9LAorCXsgIkxvZ2l0ZWNoIEluYy4gV2luZ01hbiBFeHRyZW1lIERpZ2l0YWwgM0QiLCA0LCAxLCAwIH0sCisJeyAiU2FpdGVrIFNhaXRlayBYNDUiLCA2LCAxLCAwIH0KK307CisKKy8qIEl0IGxvb2tzIGxpa2UgbmV3ZXIga2VybmVscyBoYXZlIHRoZSBsb2dpY2FsIG1hcHBpbmcgYXQgdGhlIGRyaXZlciBsZXZlbCAqLworI2RlZmluZSBOT19MT0dJQ0FMX0pPWVNUSUNLUworCisjaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCisKKy8qCisgICBTb21lIFVTQiBISURzIHNob3cgdXAgYXMgYSBzaW5nbGUgam95c3RpY2sgZXZlbiB0aG91Z2ggdGhleSBhY3R1YWxseQorICAgY29udHJvbCAyIG9yIG1vcmUgam95c3RpY2tzLgorKi8KKy8qCisgICBUaGlzIGNvZGUgaGFuZGxlcyB0aGUgTVAtODgwMCAoUXVhZCkgYW5kIE1QLTg4NjYgKER1YWwpLCB3aGljaCBjYW4KKyAgIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgdHJhbnNwYXJlbnQgYmx1ZSBkZXNpZ24uIEl0J3MgcXVpdGUgdHJpdmlhbAorICAgdG8gYWRkIG90aGVyIGpveXN0aWNrcyB3aXRoIHNpbWlsYXIgcXVpcmt5IGJlaGF2aW9yLgorICAgLWlkCisqLworCitzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nIHsKKyAgICAgICAgaW50IG5qb3k7CisgICAgICAgIGludCBudGhpbmc7Cit9OworCisvKgorICAge2xvZ2ljYWwgam95LCBsb2dpY2FsIGF4aXN9LAorICAge2xvZ2ljYWwgam95LCBsb2dpY2FsIGhhdH0sCisgICB7bG9naWNhbCBqb3ksIGxvZ2ljYWwgYmFsbH0sCisgICB7bG9naWNhbCBqb3ksIGxvZ2ljYWwgYnV0dG9ufQorKi8KKworc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgbXA4OHh4XzFfbG9naWNhbF9heGlzbWFwW10gPSB7CisgICB7MCwwfSx7MCwxfSx7MCwyfSx7MCwzfSx7MCw0fSx7MCw1fQorfTsKK3N0YXRpYyBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nIG1wODh4eF8xX2xvZ2ljYWxfYnV0dG9ubWFwW10gPSB7CisgICB7MCwwfSx7MCwxfSx7MCwyfSx7MCwzfSx7MCw0fSx7MCw1fSx7MCw2fSx7MCw3fSx7MCw4fSx7MCw5fSx7MCwxMH0sezAsMTF9Cit9OworCitzdGF0aWMgc3RydWN0IGpveXN0aWNrX2xvZ2ljYWxfbWFwcGluZyBtcDg4eHhfMl9sb2dpY2FsX2F4aXNtYXBbXSA9IHsKKyAgIHswLDB9LHswLDF9LHswLDJ9LHsxLDB9LHsxLDF9LHswLDN9LAorICAgezEsMn0sezEsM30sezAsNH0sezAsNX0sezEsNH0sezEsNX0KK307CitzdGF0aWMgc3RydWN0IGpveXN0aWNrX2xvZ2ljYWxfbWFwcGluZyBtcDg4eHhfMl9sb2dpY2FsX2J1dHRvbm1hcFtdID0geworICAgezAsMH0sezAsMX0sezAsMn0sezAsM30sezAsNH0sezAsNX0sezAsNn0sezAsN30sezAsOH0sezAsOX0sezAsMTB9LHswLDExfSwKKyAgIHsxLDB9LHsxLDF9LHsxLDJ9LHsxLDN9LHsxLDR9LHsxLDV9LHsxLDZ9LHsxLDd9LHsxLDh9LHsxLDl9LHsxLDEwfSx7MSwxMX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nIG1wODh4eF8zX2xvZ2ljYWxfYXhpc21hcFtdID0geworICAgezAsMH0sezAsMX0sezAsMn0sezEsMH0sezEsMX0sezAsM30sCisgICB7MSwyfSx7MSwzfSx7MiwwfSx7MiwxfSx7MiwyfSx7MiwzfSwKKyAgIHswLDR9LHswLDV9LHsxLDR9LHsxLDV9LHsyLDR9LHsyLDV9Cit9Oworc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgbXA4OHh4XzNfbG9naWNhbF9idXR0b25tYXBbXSA9IHsKKyAgIHswLDB9LHswLDF9LHswLDJ9LHswLDN9LHswLDR9LHswLDV9LHswLDZ9LHswLDd9LHswLDh9LHswLDl9LHswLDEwfSx7MCwxMX0sCisgICB7MSwwfSx7MSwxfSx7MSwyfSx7MSwzfSx7MSw0fSx7MSw1fSx7MSw2fSx7MSw3fSx7MSw4fSx7MSw5fSx7MSwxMH0sezEsMTF9LAorICAgezIsMH0sezIsMX0sezIsMn0sezIsM30sezIsNH0sezIsNX0sezIsNn0sezIsN30sezIsOH0sezIsOX0sezIsMTB9LHsyLDExfQorfTsKKworc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgbXA4OHh4XzRfbG9naWNhbF9heGlzbWFwW10gPSB7CisgICB7MCwwfSx7MCwxfSx7MCwyfSx7MSwwfSx7MSwxfSx7MCwzfSwKKyAgIHsxLDJ9LHsxLDN9LHsyLDB9LHsyLDF9LHsyLDJ9LHsyLDN9LAorICAgezMsMH0sezMsMX0sezMsMn0sezMsM30sezAsNH0sezAsNX0sCisgICB7MSw0fSx7MSw1fSx7Miw0fSx7Miw1fSx7Myw0fSx7Myw1fQorfTsKK3N0YXRpYyBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nIG1wODh4eF80X2xvZ2ljYWxfYnV0dG9ubWFwW10gPSB7CisgICB7MCwwfSx7MCwxfSx7MCwyfSx7MCwzfSx7MCw0fSx7MCw1fSx7MCw2fSx7MCw3fSx7MCw4fSx7MCw5fSx7MCwxMH0sezAsMTF9LAorICAgezEsMH0sezEsMX0sezEsMn0sezEsM30sezEsNH0sezEsNX0sezEsNn0sezEsN30sezEsOH0sezEsOX0sezEsMTB9LHsxLDExfSwKKyAgIHsyLDB9LHsyLDF9LHsyLDJ9LHsyLDN9LHsyLDR9LHsyLDV9LHsyLDZ9LHsyLDd9LHsyLDh9LHsyLDl9LHsyLDEwfSx7MiwxMX0sCisgICB7MywwfSx7MywxfSx7MywyfSx7MywzfSx7Myw0fSx7Myw1fSx7Myw2fSx7Myw3fSx7Myw4fSx7Myw5fSx7MywxMH0sezMsMTF9Cit9OworCitzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9sYXlvdXQgeworICAgICAgICBpbnQgbmF4ZXM7CisgICAgICAgIGludCBuaGF0czsKKyAgICAgICAgaW50IG5iYWxsczsKKyAgICAgICAgaW50IG5idXR0b25zOworfTsKKworc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCBtcDg4eHhfMV9sb2dpY2FsX2xheW91dFtdID0geworICAgICAgICB7NiwgMCwgMCwgMTJ9Cit9Oworc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCBtcDg4eHhfMl9sb2dpY2FsX2xheW91dFtdID0geworICAgICAgICB7NiwgMCwgMCwgMTJ9LAorICAgICAgICB7NiwgMCwgMCwgMTJ9Cit9Oworc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCBtcDg4eHhfM19sb2dpY2FsX2xheW91dFtdID0geworICAgICAgICB7NiwgMCwgMCwgMTJ9LAorICAgICAgICB7NiwgMCwgMCwgMTJ9LAorICAgICAgICB7NiwgMCwgMCwgMTJ9Cit9Oworc3RhdGljIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCBtcDg4eHhfNF9sb2dpY2FsX2xheW91dFtdID0geworICAgICAgICB7NiwgMCwgMCwgMTJ9LAorICAgICAgICB7NiwgMCwgMCwgMTJ9LAorICAgICAgICB7NiwgMCwgMCwgMTJ9LAorICAgICAgICB7NiwgMCwgMCwgMTJ9Cit9OworCisvKgorICAgVGhpcyBhcnJheSBzZXRzIHVwIGEgbWVhbnMgb2YgbWFwcGluZyBhIHNpbmdsZSBwaHlzaWNhbCBqb3lzdGljayB0bworICAgbXVsdGlwbGUgbG9naWNhbCBqb3lzdGlja3MuIChkam0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgbmpveXMKKyAgICAgICAgdGhlIG51bWJlciBvZiBsb2dpY2FsIGpveXN0aWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGxheW91dHMKKyAgICAgICAgYW4gYXJyYXkgb2YgbGF5b3V0IHN0cnVjdHVyZXMsIG9uZSB0byBkZXNjcmliZSBlYWNoIGxvZ2ljYWwgam95c3RpY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBheGVzLCBoYXRzLCBiYWxscywgYnV0dG9ucworICAgICAgICBhcnJheXMgdGhhdCBtYXAgYSBwaHlzaWNhbCB0aGluZ3kgdG8gYSBsb2dpY2FsIHRoaW5neQorICovCitzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbG1hcCB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisJaW50IG5idXR0b25zOworICAgICAgICBpbnQgbmpveXM7CisgICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX2xheW91dCAqbGF5b3V0OworICAgICAgICBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nICpheGlzbWFwOworICAgICAgICBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9tYXBwaW5nICpoYXRtYXA7CisgICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgKmJhbGxtYXA7CisgICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcgKmJ1dHRvbm1hcDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbG1hcCBqb3lzdGlja19sb2dpY2FsbWFwW10gPSB7CisgICAgICAgIHsKKwkJIldpc2VHcm91cC4sTHRkIE1QLTg4NjYgRHVhbCBVU0IgSm95cGFkIiwKKwkJMTIsCisJCTEsCisJCW1wODh4eF8xX2xvZ2ljYWxfbGF5b3V0LAorICAgICAgICAJbXA4OHh4XzFfbG9naWNhbF9heGlzbWFwLAorCQlOVUxMLAorCQlOVUxMLAorICAgICAgICAJbXA4OHh4XzFfbG9naWNhbF9idXR0b25tYXAKKwl9LAorICAgICAgICB7CisJCSJXaXNlR3JvdXAuLEx0ZCBNUC04ODY2IER1YWwgVVNCIEpveXBhZCIsCisJCTI0LAorCQkyLAorCQltcDg4eHhfMl9sb2dpY2FsX2xheW91dCwKKyAgICAgICAgCW1wODh4eF8yX2xvZ2ljYWxfYXhpc21hcCwKKwkJTlVMTCwKKwkJTlVMTCwKKyAgICAgICAgCW1wODh4eF8yX2xvZ2ljYWxfYnV0dG9ubWFwCisJfSwKKyAgICAgICAgeworCQkiV2lzZUdyb3VwLixMdGQgTVAtODgwMCBRdWFkIFVTQiBKb3lwYWQiLAorCQkxMiwKKwkJMSwKKwkJbXA4OHh4XzFfbG9naWNhbF9sYXlvdXQsCisgICAgICAgIAltcDg4eHhfMV9sb2dpY2FsX2F4aXNtYXAsCisJCU5VTEwsCisJCU5VTEwsCisgICAgICAgIAltcDg4eHhfMV9sb2dpY2FsX2J1dHRvbm1hcAorCX0sCisgICAgICAgIHsKKwkJIldpc2VHcm91cC4sTHRkIE1QLTg4MDAgUXVhZCBVU0IgSm95cGFkIiwKKwkJMjQsCisJCTIsCisJCW1wODh4eF8yX2xvZ2ljYWxfbGF5b3V0LAorICAgICAgICAJbXA4OHh4XzJfbG9naWNhbF9heGlzbWFwLAorCQlOVUxMLAorCQlOVUxMLAorICAgICAgICAJbXA4OHh4XzJfbG9naWNhbF9idXR0b25tYXAKKwl9LAorICAgICAgICB7CisJCSJXaXNlR3JvdXAuLEx0ZCBNUC04ODAwIFF1YWQgVVNCIEpveXBhZCIsCisJCTM2LAorCQkzLAorCQltcDg4eHhfM19sb2dpY2FsX2xheW91dCwKKyAgICAgICAgCW1wODh4eF8zX2xvZ2ljYWxfYXhpc21hcCwKKwkJTlVMTCwKKwkJTlVMTCwKKyAgICAgICAgCW1wODh4eF8zX2xvZ2ljYWxfYnV0dG9ubWFwCisJfSwKKyAgICAgICAgeworCQkiV2lzZUdyb3VwLixMdGQgTVAtODgwMCBRdWFkIFVTQiBKb3lwYWQiLAorCQk0OCwKKwkJNCwKKwkJbXA4OHh4XzRfbG9naWNhbF9sYXlvdXQsCisgICAgICAgIAltcDg4eHhfNF9sb2dpY2FsX2F4aXNtYXAsCisJCU5VTEwsCisJCU5VTEwsCisgICAgICAgIAltcDg4eHhfNF9sb2dpY2FsX2J1dHRvbm1hcAorCX0KK307CisKKy8qIGZpbmQgdGhlIGhlYWQgb2YgYSBsaW5rZWQgbGlzdCwgZ2l2ZW4gYSBwb2ludCBpbiBpdAorICovCisjZGVmaW5lIFNETF9qb3lsaXN0X2hlYWQoaSwgc3RhcnQpXAorICAgICAgICBmb3IoaSA9IHN0YXJ0OyBTRExfam95bGlzdFtpXS5mbmFtZSA9PSBOVUxMOykgaSA9IFNETF9qb3lsaXN0W2ldLnByZXY7CisKKyNkZWZpbmUgU0RMX2xvZ2ljYWxfam95ZGVjbChkKSBkCisKKworI2Vsc2UKKworI2RlZmluZSBTRExfbG9naWNhbF9qb3lkZWNsKGQpCisKKyNlbmRpZiAvKiBVU0VfTE9HSUNBTF9KT1lTVElDS1MgKi8KKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGpveXN0aWNrcyB3ZSdsbCBkZXRlY3QgKi8KKyNkZWZpbmUgTUFYX0pPWVNUSUNLUwkzMgorCisvKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIGpveXN0aWNrcyAqLworc3RhdGljIHN0cnVjdAoreworICAgICAgICBjaGFyKiBmbmFtZTsKKyNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKKyAgICAgICAgU0RMX0pveXN0aWNrKiBqb3k7CisgICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsbWFwKiBtYXA7CisgICAgICAgIGludCBwcmV2OworICAgICAgICBpbnQgbmV4dDsKKyAgICAgICAgaW50IGxvZ2ljYWxubzsKKyNlbmRpZiAvKiBVU0VfTE9HSUNBTF9KT1lTVElDS1MgKi8KK30gU0RMX2pveWxpc3RbTUFYX0pPWVNUSUNLU107CisKKworLyogVGhlIHByaXZhdGUgc3RydWN0dXJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhIGpveXN0aWNrICovCitzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhIHsKKwlpbnQgZmQ7CisJLyogVGhlIGN1cnJlbnQgbGludXggam95c3RpY2sgZHJpdmVyIG1hcHMgaGF0cyB0byB0d28gYXhlcyAqLworCXN0cnVjdCBod2RhdGFfaGF0IHsKKwkJaW50IGF4aXNbMl07CisJfSAqaGF0czsKKwkvKiBUaGUgY3VycmVudCBsaW51eCBqb3lzdGljayBkcml2ZXIgbWFwcyBiYWxscyB0byB0d28gYXhlcyAqLworCXN0cnVjdCBod2RhdGFfYmFsbCB7CisJCWludCBheGlzWzJdOworCX0gKmJhbGxzOworCisJLyogU3VwcG9ydCBmb3IgdGhlIExpbnV4IDIuNCB1bmlmaWVkIGlucHV0IGludGVyZmFjZSAqLworI2lmIFNETF9JTlBVVF9MSU5VWEVWCisJU0RMX2Jvb2wgaXNfaGlkOworCVVpbnQ4IGtleV9tYXBbS0VZX01BWC1CVE5fTUlTQ107CisJVWludDggYWJzX21hcFtBQlNfTUFYXTsKKwlzdHJ1Y3QgYXhpc19jb3JyZWN0IHsKKwkJaW50IHVzZWQ7CisJCWludCBjb2VmWzNdOworCX0gYWJzX2NvcnJlY3RbQUJTX01BWF07CisjZW5kaWYKK307CisKKworI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUworCitzdGF0aWMgaW50IENvdW50TG9naWNhbEpveXN0aWNrcyhpbnQgbWF4KQoreworICAgcmVnaXN0ZXIgaW50IGksIGosIGssIHJldCwgcHJldjsKKyAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICBpbnQgbmJ1dHRvbnMsIGZkOworICAgdW5zaWduZWQgY2hhciBuOworCisgICByZXQgPSAwOworCisgICBmb3IoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworICAgICAgbmFtZSA9IFNETF9TWVNfSm95c3RpY2tOYW1lKGkpOworCQorICAgICAgZmQgPSBvcGVuKFNETF9qb3lsaXN0W2ldLmZuYW1lLCBPX1JET05MWSwgMCk7CisgICAgICBpZiAoIGZkID49IDAgKSB7CisJIGlmICggaW9jdGwoZmQsIEpTSU9DR0JVVFRPTlMsICZuKSA8IDAgKSB7CisJICAgIG5idXR0b25zID0gLTE7CisJIH0gZWxzZSB7CisgICAgICAgICAgICBuYnV0dG9ucyA9IG47CisJIH0KKwkgY2xvc2UoZmQpOworICAgICAgfQorICAgICAgZWxzZSB7CisJIG5idXR0b25zPS0xOworICAgICAgfQorCisgICAgICBpZiAobmFtZSkgeworICAgICAgICAgZm9yKGogPSAwOyBqIDwgU0RMX2FycmF5c2l6ZShqb3lzdGlja19sb2dpY2FsbWFwKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoIVNETF9zdHJjbXAobmFtZSwgam95c3RpY2tfbG9naWNhbG1hcFtqXS5uYW1lKSAmJiAobmJ1dHRvbnM9PS0xIHx8IG5idXR0b25zPT1qb3lzdGlja19sb2dpY2FsbWFwW2pdLm5idXR0b25zKSkgeworICAgICAgICAgICAgICAgcHJldiA9IGk7CisgICAgICAgICAgICAgICBTRExfam95bGlzdFtwcmV2XS5tYXAgPSAmKGpveXN0aWNrX2xvZ2ljYWxtYXBbal0pOworCisgICAgICAgICAgICAgICBmb3IoayA9IDE7IGsgPCBqb3lzdGlja19sb2dpY2FsbWFwW2pdLm5qb3lzOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgIFNETF9qb3lsaXN0W3ByZXZdLm5leHQgPSBtYXggKyByZXQ7CisgICAgICAgICAgICAgICAgICBTRExfam95bGlzdFttYXgrcmV0XS5wcmV2ID0gcHJldjsKKwkJICAKKyAgICAgICAgICAgICAgICAgIHByZXYgPSBtYXggKyByZXQ7CisgICAgICAgICAgICAgICAgICBTRExfam95bGlzdFtwcmV2XS5sb2dpY2Fsbm8gPSBrOworICAgICAgICAgICAgICAgICAgU0RMX2pveWxpc3RbcHJldl0ubWFwID0gJihqb3lzdGlja19sb2dpY2FsbWFwW2pdKTsKKyAgICAgICAgICAgICAgICAgIHJldCsrOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgTG9naWNhbFN1ZmZpeChpbnQgbG9naWNhbG5vLCBjaGFyKiBuYW1lYnVmLCBpbnQgbGVuKQoreworICAgcmVnaXN0ZXIgaW50IHNsZW47CisgICBjb25zdCBzdGF0aWMgY2hhciBzdWZmaXhzW10gPQorICAgICAgIjAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5IgorICAgICAgIjIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyIjsKKyAgIGNvbnN0IGNoYXIqIHN1ZmZpeDsKKyAgIHNsZW4gPSBTRExfc3RybGVuKG5hbWVidWYpOworICAgc3VmZml4ID0gTlVMTDsKKworICAgaWYgKGxvZ2ljYWxubyoyPHNpemVvZihzdWZmaXhzKSkKKyAgICAgIHN1ZmZpeCA9IHN1ZmZpeHMgKyAobG9naWNhbG5vKjIpOworCisgICBpZiAoc2xlbiArIDQgPCBsZW4gJiYgc3VmZml4KSB7CisgICAgICBuYW1lYnVmW3NsZW4rK10gPSAnICc7CisgICAgICBuYW1lYnVmW3NsZW4rK10gPSAnIyc7CisgICAgICBuYW1lYnVmW3NsZW4rK10gPSBzdWZmaXhbMF07CisgICAgICBuYW1lYnVmW3NsZW4rK10gPSBzdWZmaXhbMV07CisgICAgICBuYW1lYnVmW3NsZW4rK10gPSAwOworICAgfQorfQorCisjZW5kaWYgLyogVVNFX0xPR0lDQUxfSk9ZU1RJQ0tTICovCisKKyNpZiBTRExfSU5QVVRfTElOVVhFVgorI2RlZmluZSB0ZXN0X2JpdChuciwgYWRkcikgXAorCSgoKDFVTCA8PCAoKG5yKSAlIChzaXplb2YobG9uZykgKiA4KSkpICYgKChhZGRyKVsobnIpIC8gKHNpemVvZihsb25nKSAqIDgpXSkpICE9IDApCisjZGVmaW5lIE5CSVRTKHgpICgoKCh4KS0xKS8oc2l6ZW9mKGxvbmcpICogOCkpKzEpCisKK3N0YXRpYyBpbnQgRVZfSXNKb3lzdGljayhpbnQgZmQpCit7CisJdW5zaWduZWQgbG9uZyBldmJpdFtOQklUUyhFVl9NQVgpXSA9IHsgMCB9OworCXVuc2lnbmVkIGxvbmcga2V5Yml0W05CSVRTKEtFWV9NQVgpXSA9IHsgMCB9OworCXVuc2lnbmVkIGxvbmcgYWJzYml0W05CSVRTKEFCU19NQVgpXSA9IHsgMCB9OworCisJaWYgKCAoaW9jdGwoZmQsIEVWSU9DR0JJVCgwLCBzaXplb2YoZXZiaXQpKSwgZXZiaXQpIDwgMCkgfHwKKwkgICAgIChpb2N0bChmZCwgRVZJT0NHQklUKEVWX0tFWSwgc2l6ZW9mKGtleWJpdCkpLCBrZXliaXQpIDwgMCkgfHwKKwkgICAgIChpb2N0bChmZCwgRVZJT0NHQklUKEVWX0FCUywgc2l6ZW9mKGFic2JpdCkpLCBhYnNiaXQpIDwgMCkgKSB7CisJCXJldHVybigwKTsKKwl9CisJaWYgKCEodGVzdF9iaXQoRVZfS0VZLCBldmJpdCkgJiYgdGVzdF9iaXQoRVZfQUJTLCBldmJpdCkgJiYKKwkgICAgICB0ZXN0X2JpdChBQlNfWCwgYWJzYml0KSAmJiB0ZXN0X2JpdChBQlNfWSwgYWJzYml0KSAmJgorCSAgICAgKHRlc3RfYml0KEJUTl9UUklHR0VSLCBrZXliaXQpIHx8IHRlc3RfYml0KEJUTl9BLCBrZXliaXQpIHx8IHRlc3RfYml0KEJUTl8xLCBrZXliaXQpKSkpIHJldHVybiAwOworCXJldHVybigxKTsKK30KKworI2VuZGlmIC8qIFNETF9JTlBVVF9MSU5VWEVWICovCisKKy8qIEZ1bmN0aW9uIHRvIHNjYW4gdGhlIHN5c3RlbSBmb3Igam95c3RpY2tzICovCitpbnQgU0RMX1NZU19Kb3lzdGlja0luaXQodm9pZCkKK3sKKwkvKiBUaGUgYmFzZSBwYXRoIG9mIHRoZSBqb3lzdGljayBkZXZpY2VzICovCisJY29uc3QgY2hhciAqam95ZGV2X3BhdHRlcm5bXSA9IHsKKyNpZiBTRExfSU5QVVRfTElOVVhFVgorCQkiL2Rldi9pbnB1dC9ldmVudCVkIiwKKyNlbmRpZgorCQkiL2Rldi9pbnB1dC9qcyVkIiwKKwkJIi9kZXYvanMlZCIKKwl9OworCWludCBudW1qb3lzdGlja3M7CisJaW50IGksIGo7CisJaW50IGZkOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJZGV2X3QgZGV2X251bXNbTUFYX0pPWVNUSUNLU107ICAvKiBtYWpvci9taW5vciBkZXZpY2UgbnVtYmVycyAqLworCXN0cnVjdCBzdGF0IHNiOworCWludCBuLCBkdXBsaWNhdGU7CisKKwludW1qb3lzdGlja3MgPSAwOworCisJLyogRmlyc3Qgc2VlIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBvbmUgb3IgbW9yZSBqb3lzdGlja3MgdG8gdXNlICovCisJaWYgKCBTRExfZ2V0ZW52KCJTRExfSk9ZU1RJQ0tfREVWSUNFIikgIT0gTlVMTCApIHsKKwkJY2hhciAqZW52Y29weSwgKmVudnBhdGgsICpkZWxpbTsKKwkJZW52Y29weSA9IFNETF9zdHJkdXAoU0RMX2dldGVudigiU0RMX0pPWVNUSUNLX0RFVklDRSIpKTsKKwkJZW52cGF0aCA9IGVudmNvcHk7CisJCXdoaWxlICggZW52cGF0aCAhPSBOVUxMICkgeworCQkJZGVsaW0gPSBTRExfc3RyY2hyKGVudnBhdGgsICc6Jyk7CisJCQlpZiAoIGRlbGltICE9IE5VTEwgKSB7CisJCQkJKmRlbGltKysgPSAnXDAnOworCQkJfQorCQkJaWYgKCBzdGF0KGVudnBhdGgsICZzYikgPT0gMCApIHsKKwkJCQlmZCA9IG9wZW4oZW52cGF0aCwgT19SRE9OTFksIDApOworCQkJCWlmICggZmQgPj0gMCApIHsKKwkJCQkJLyogQXNzdW1lIHRoZSB1c2VyIGtub3dzIHdoYXQgdGhleSdyZSBkb2luZy4gKi8KKwkJCQkJU0RMX2pveWxpc3RbbnVtam95c3RpY2tzXS5mbmFtZSA9IFNETF9zdHJkdXAoZW52cGF0aCk7CisJCQkJCWlmICggU0RMX2pveWxpc3RbbnVtam95c3RpY2tzXS5mbmFtZSApIHsKKwkJCQkJCWRldl9udW1zW251bWpveXN0aWNrc10gPSBzYi5zdF9yZGV2OworCQkJCQkJKytudW1qb3lzdGlja3M7CisJCQkJCX0KKwkJCQkJY2xvc2UoZmQpOworCQkJCX0KKwkJCX0KKwkJCWVudnBhdGggPSBkZWxpbTsKKwkJfQorCQlTRExfZnJlZShlbnZjb3B5KTsKKwl9CisKKwlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShqb3lkZXZfcGF0dGVybik7ICsraSApIHsKKwkJZm9yICggaj0wOyBqIDwgTUFYX0pPWVNUSUNLUzsgKytqICkgeworCQkJU0RMX3NucHJpbnRmKHBhdGgsIFNETF9hcnJheXNpemUocGF0aCksIGpveWRldl9wYXR0ZXJuW2ldLCBqKTsKKworCQkJLyogcmNnMDYzMDIwMDAgcmVwbGFjZWQgYWNjZXNzKEZfT0spIGNhbGwgd2l0aCBzdGF0KCkuCisJCQkgKiBzdGF0KCkgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIHNvIGl0J3MKKwkJCSAqIGVxdWl2YWxlbnQgYmVoYXZpb3VyLgorCQkJICovCisJCQlpZiAoIHN0YXQocGF0aCwgJnNiKSA9PSAwICkgeworCQkJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbHJlYWR5IGluIGxpc3QuCisJCQkJICogVGhpcyBoYXBwZW5zIHdoZW4gd2Ugc2VlIGEgc3RpY2sgdmlhIHN5bWxpbmsuCisJCQkJICovCisJCQkJZHVwbGljYXRlID0gMDsKKwkJCQlmb3IgKG49MDsgKG48bnVtam95c3RpY2tzKSAmJiAhZHVwbGljYXRlOyArK24pIHsKKwkJCQkJaWYgKCBzYi5zdF9yZGV2ID09IGRldl9udW1zW25dICkgeworCQkJCQkJZHVwbGljYXRlID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoZHVwbGljYXRlKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSwgMCk7CisJCQkJaWYgKCBmZCA8IDAgKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNpZiBTRExfSU5QVVRfTElOVVhFVgorI2lmZGVmIERFQlVHX0lOUFVUX0VWRU5UUworCQkJCXByaW50ZigiQ2hlY2tpbmcgJXNcbiIsIHBhdGgpOworI2VuZGlmCisJCQkJaWYgKCAoaSA9PSAwKSAmJiAhIEVWX0lzSm95c3RpY2soZmQpICkgeworCQkJCQljbG9zZShmZCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWNsb3NlKGZkKTsKKworCQkJCS8qIFdlJ3JlIGZpbmUsIGFkZCB0aGlzIGpveXN0aWNrICovCisJCQkJU0RMX2pveWxpc3RbbnVtam95c3RpY2tzXS5mbmFtZSA9IFNETF9zdHJkdXAocGF0aCk7CisJCQkJaWYgKCBTRExfam95bGlzdFtudW1qb3lzdGlja3NdLmZuYW1lICkgeworCQkJCQlkZXZfbnVtc1tudW1qb3lzdGlja3NdID0gc2Iuc3RfcmRldjsKKwkJCQkJKytudW1qb3lzdGlja3M7CisJCQkJfQorCQkJfQorCQl9CisKKyNpZiBTRExfSU5QVVRfTElOVVhFVgorCQkvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLi4uCisJCSAgIElmIHRoZSBldmVudCBkZXZpY2VzIGFyZSB2YWxpZCB0aGVuIHRoZSBqb3lzdGljayBkZXZpY2VzCisJCSAgIHdpbGwgYmUgZHVwbGljYXRlcyBidXQgd2l0aG91dCBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGVpcgorCQkgICBoYXRzIG9yIGJhbGxzLiBVbmZvcnR1bmF0ZWx5LCB0aGUgZXZlbnQgZGV2aWNlcyBjYW4ndAorCQkgICBjdXJyZW50bHkgYmUgY2FsaWJyYXRlZCwgc28gaXQncyBhIHdpbi1sb3NlIHNpdHVhdGlvbi4KKwkJICAgU28gOiAvZGV2L2lucHV0L2V2ZW50WCA9IC9kZXYvaW5wdXQvanNZID0gL2Rldi9qc1kKKwkJKi8KKwkJaWYgKCAoaSA9PSAwKSAmJiAobnVtam95c3RpY2tzID4gMCkgKQorCQkJYnJlYWs7CisjZW5kaWYKKwl9CisjaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCisJbnVtam95c3RpY2tzICs9IENvdW50TG9naWNhbEpveXN0aWNrcyhudW1qb3lzdGlja3MpOworI2VuZGlmCisKKwlyZXR1cm4obnVtam95c3RpY2tzKTsKK30KKworLyogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkZXZpY2UtZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljayAqLworY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQoreworCWludCBmZDsKKwlzdGF0aWMgY2hhciBuYW1lYnVmWzEyOF07CisJY2hhciAqbmFtZTsKKwlTRExfbG9naWNhbF9qb3lkZWNsKGludCBvaW5kZXggPSBpbmRleCk7CisKKyNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKKwlTRExfam95bGlzdF9oZWFkKGluZGV4LCBpbmRleCk7CisjZW5kaWYKKwluYW1lID0gTlVMTDsKKwlmZCA9IG9wZW4oU0RMX2pveWxpc3RbaW5kZXhdLmZuYW1lLCBPX1JET05MWSwgMCk7CisJaWYgKCBmZCA+PSAwICkgeworCQlpZiAoIAorI2lmIFNETF9JTlBVVF9MSU5VWEVWCisJCSAgICAgKGlvY3RsKGZkLCBFVklPQ0dOQU1FKHNpemVvZihuYW1lYnVmKSksIG5hbWVidWYpIDw9IDApICYmCisjZW5kaWYKKwkJICAgICAoaW9jdGwoZmQsIEpTSU9DR05BTUUoc2l6ZW9mKG5hbWVidWYpKSwgbmFtZWJ1ZikgPD0gMCkgKSB7CisJCQluYW1lID0gU0RMX2pveWxpc3RbaW5kZXhdLmZuYW1lOworCQl9IGVsc2UgeworCQkJbmFtZSA9IG5hbWVidWY7CisJCX0KKwkJY2xvc2UoZmQpOworCisKKyNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKKwkJaWYgKFNETF9qb3lsaXN0W29pbmRleF0ucHJldiB8fCBTRExfam95bGlzdFtvaW5kZXhdLm5leHQgfHwgaW5kZXghPW9pbmRleCkKKwkJeworICAgICAgIAkJICAgTG9naWNhbFN1ZmZpeChTRExfam95bGlzdFtvaW5kZXhdLmxvZ2ljYWxubywgbmFtZWJ1ZiwgMTI4KTsKKwkJfQorI2VuZGlmCisJfQorCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgaW50IGFsbG9jYXRlX2hhdGRhdGEoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpbnQgaTsKKworCWpveXN0aWNrLT5od2RhdGEtPmhhdHMgPSAoc3RydWN0IGh3ZGF0YV9oYXQgKilTRExfbWFsbG9jKAorCQlqb3lzdGljay0+bmhhdHMgKiBzaXplb2Yoc3RydWN0IGh3ZGF0YV9oYXQpKTsKKwlpZiAoIGpveXN0aWNrLT5od2RhdGEtPmhhdHMgPT0gTlVMTCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisJZm9yICggaT0wOyBpPGpveXN0aWNrLT5uaGF0czsgKytpICkgeworCQlqb3lzdGljay0+aHdkYXRhLT5oYXRzW2ldLmF4aXNbMF0gPSAxOworCQlqb3lzdGljay0+aHdkYXRhLT5oYXRzW2ldLmF4aXNbMV0gPSAxOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NhdGVfYmFsbGRhdGEoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpbnQgaTsKKworCWpveXN0aWNrLT5od2RhdGEtPmJhbGxzID0gKHN0cnVjdCBod2RhdGFfYmFsbCAqKVNETF9tYWxsb2MoCisJCWpveXN0aWNrLT5uYmFsbHMgKiBzaXplb2Yoc3RydWN0IGh3ZGF0YV9iYWxsKSk7CisJaWYgKCBqb3lzdGljay0+aHdkYXRhLT5iYWxscyA9PSBOVUxMICkgeworCQlyZXR1cm4oLTEpOworCX0KKwlmb3IgKCBpPTA7IGk8am95c3RpY2stPm5iYWxsczsgKytpICkgeworCQlqb3lzdGljay0+aHdkYXRhLT5iYWxsc1tpXS5heGlzWzBdID0gMDsKKwkJam95c3RpY2stPmh3ZGF0YS0+YmFsbHNbaV0uYXhpc1sxXSA9IDA7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIFNETF9ib29sIEpTX0NvbmZpZ0pveXN0aWNrKFNETF9Kb3lzdGljayAqam95c3RpY2ssIGludCBmZCkKK3sKKwlTRExfYm9vbCBoYW5kbGVkOworCXVuc2lnbmVkIGNoYXIgbjsKKwlpbnQgdG1wX25heGVzLCB0bXBfbmhhdHMsIHRtcF9uYmFsbHM7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICplbnYsIGVudl9uYW1lWzEyOF07CisJaW50IGk7CisKKwloYW5kbGVkID0gU0RMX0ZBTFNFOworCisJLyogRGVmYXVsdCBqb3lzdGljayBkZXZpY2Ugc2V0dGluZ3MgKi8KKwlpZiAoIGlvY3RsKGZkLCBKU0lPQ0dBWEVTLCAmbikgPCAwICkgeworCQlqb3lzdGljay0+bmF4ZXMgPSAyOworCX0gZWxzZSB7CisJCWpveXN0aWNrLT5uYXhlcyA9IG47CisJfQorCWlmICggaW9jdGwoZmQsIEpTSU9DR0JVVFRPTlMsICZuKSA8IDAgKSB7CisJCWpveXN0aWNrLT5uYnV0dG9ucyA9IDI7CisJfSBlbHNlIHsKKwkJam95c3RpY2stPm5idXR0b25zID0gbjsKKwl9CisKKwluYW1lID0gU0RMX1NZU19Kb3lzdGlja05hbWUoam95c3RpY2stPmluZGV4KTsKKworCS8qIEdlbmVyaWMgYW5hbG9nIGpveXN0aWNrIHN1cHBvcnQgKi8KKwlpZiAoIFNETF9zdHJzdHIobmFtZSwgIkFuYWxvZyIpID09IG5hbWUgJiYgU0RMX3N0cnN0cihuYW1lLCAiLWhhdCIpICkgeworCQlpZiAoIFNETF9zc2NhbmYobmFtZSwiQW5hbG9nICVkLWF4aXMgJSpkLWJ1dHRvbiAlZC1oYXQiLAorCQkJJnRtcF9uYXhlcywgJnRtcF9uaGF0cykgPT0gMiApIHsKKworCQkJam95c3RpY2stPm5heGVzID0gdG1wX25heGVzOworCQkJam95c3RpY2stPm5oYXRzID0gdG1wX25oYXRzOworCisJCQloYW5kbGVkID0gU0RMX1RSVUU7CisJCX0KKwl9CisKKwkvKiBTcGVjaWFsIGpveXN0aWNrIHN1cHBvcnQgKi8KKwlmb3IgKCBpPTA7IGkgPCBTRExfYXJyYXlzaXplKHNwZWNpYWxfam95c3RpY2tzKTsgKytpICkgeworCQlpZiAoIFNETF9zdHJjbXAobmFtZSwgc3BlY2lhbF9qb3lzdGlja3NbaV0ubmFtZSkgPT0gMCApIHsKKworCQkJam95c3RpY2stPm5heGVzID0gc3BlY2lhbF9qb3lzdGlja3NbaV0ubmF4ZXM7CisJCQlqb3lzdGljay0+bmhhdHMgPSBzcGVjaWFsX2pveXN0aWNrc1tpXS5uaGF0czsKKwkJCWpveXN0aWNrLT5uYmFsbHMgPSBzcGVjaWFsX2pveXN0aWNrc1tpXS5uYmFsbHM7CisKKwkJCWhhbmRsZWQgPSBTRExfVFJVRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVXNlciBlbnZpcm9ubWVudCBqb3lzdGljayBzdXBwb3J0ICovCisJaWYgKCAoZW52ID0gU0RMX2dldGVudigiU0RMX0xJTlVYX0pPWVNUSUNLIikpICkgeworCQkqZW52X25hbWUgPSAnXDAnOworCQlpZiAoICplbnYgPT0gJ1wnJyAmJiBTRExfc3NjYW5mKGVudiwgIiclW14nXXMnIiwgZW52X25hbWUpID09IDEgKQorCQkJZW52ICs9IFNETF9zdHJsZW4oZW52X25hbWUpKzI7CisJCWVsc2UgaWYgKCBTRExfc3NjYW5mKGVudiwgIiVzIiwgZW52X25hbWUpID09IDEgKQorCQkJZW52ICs9IFNETF9zdHJsZW4oZW52X25hbWUpOworCisJCWlmICggU0RMX3N0cmNtcChuYW1lLCBlbnZfbmFtZSkgPT0gMCApIHsKKworCQkJaWYgKCBTRExfc3NjYW5mKGVudiwgIiVkICVkICVkIiwgJnRtcF9uYXhlcywgJnRtcF9uaGF0cywKKwkJCQkmdG1wX25iYWxscykgPT0gMyApIHsKKworCQkJCWpveXN0aWNrLT5uYXhlcyA9IHRtcF9uYXhlczsKKwkJCQlqb3lzdGljay0+bmhhdHMgPSB0bXBfbmhhdHM7CisJCQkJam95c3RpY2stPm5iYWxscyA9IHRtcF9uYmFsbHM7CisKKwkJCQloYW5kbGVkID0gU0RMX1RSVUU7CisJCQl9CisJCX0KKwl9CisKKwkvKiBSZW1hcCBoYXRzIGFuZCBiYWxscyAqLworCWlmIChoYW5kbGVkKSB7CisJCWlmICggam95c3RpY2stPm5oYXRzID4gMCApIHsKKwkJCWlmICggYWxsb2NhdGVfaGF0ZGF0YShqb3lzdGljaykgPCAwICkgeworCQkJCWpveXN0aWNrLT5uaGF0cyA9IDA7CisJCQl9CisJCX0KKwkJaWYgKCBqb3lzdGljay0+bmJhbGxzID4gMCApIHsKKwkJCWlmICggYWxsb2NhdGVfYmFsbGRhdGEoam95c3RpY2spIDwgMCApIHsKKwkJCQlqb3lzdGljay0+bmJhbGxzID0gMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybihoYW5kbGVkKTsKK30KKworI2lmIFNETF9JTlBVVF9MSU5VWEVWCisKK3N0YXRpYyBTRExfYm9vbCBFVl9Db25maWdKb3lzdGljayhTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgZmQpCit7CisJaW50IGksIHQ7CisJdW5zaWduZWQgbG9uZyBrZXliaXRbTkJJVFMoS0VZX01BWCldID0geyAwIH07CisJdW5zaWduZWQgbG9uZyBhYnNiaXRbTkJJVFMoQUJTX01BWCldID0geyAwIH07CisJdW5zaWduZWQgbG9uZyByZWxiaXRbTkJJVFMoUkVMX01BWCldID0geyAwIH07CisKKwkvKiBTZWUgaWYgdGhpcyBkZXZpY2UgdXNlcyB0aGUgbmV3IHVuaWZpZWQgZXZlbnQgQVBJICovCisJaWYgKCAoaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9LRVksIHNpemVvZihrZXliaXQpKSwga2V5Yml0KSA+PSAwKSAmJgorCSAgICAgKGlvY3RsKGZkLCBFVklPQ0dCSVQoRVZfQUJTLCBzaXplb2YoYWJzYml0KSksIGFic2JpdCkgPj0gMCkgJiYKKwkgICAgIChpb2N0bChmZCwgRVZJT0NHQklUKEVWX1JFTCwgc2l6ZW9mKHJlbGJpdCkpLCByZWxiaXQpID49IDApICkgeworCQlqb3lzdGljay0+aHdkYXRhLT5pc19oaWQgPSBTRExfVFJVRTsKKworCQkvKiBHZXQgdGhlIG51bWJlciBvZiBidXR0b25zLCBheGVzLCBhbmQgb3RoZXIgdGhpbmdhbWFqaWdzICovCisJCWZvciAoIGk9QlROX0pPWVNUSUNLOyBpIDwgS0VZX01BWDsgKytpICkgeworCQkJaWYgKCB0ZXN0X2JpdChpLCBrZXliaXQpICkgeworI2lmZGVmIERFQlVHX0lOUFVUX0VWRU5UUworCQkJCXByaW50ZigiSm95c3RpY2sgaGFzIGJ1dHRvbjogMHgleFxuIiwgaSk7CisjZW5kaWYKKwkJCQlqb3lzdGljay0+aHdkYXRhLT5rZXlfbWFwW2ktQlROX01JU0NdID0KKwkJCQkJCWpveXN0aWNrLT5uYnV0dG9uczsKKwkJCQkrK2pveXN0aWNrLT5uYnV0dG9uczsKKwkJCX0KKwkJfQorCQlmb3IgKCBpPUJUTl9NSVNDOyBpIDwgQlROX0pPWVNUSUNLOyArK2kgKSB7CisJCQlpZiAoIHRlc3RfYml0KGksIGtleWJpdCkgKSB7CisjaWZkZWYgREVCVUdfSU5QVVRfRVZFTlRTCisJCQkJcHJpbnRmKCJKb3lzdGljayBoYXMgYnV0dG9uOiAweCV4XG4iLCBpKTsKKyNlbmRpZgorCQkJCWpveXN0aWNrLT5od2RhdGEtPmtleV9tYXBbaS1CVE5fTUlTQ10gPQorCQkJCQkJam95c3RpY2stPm5idXR0b25zOworCQkJCSsram95c3RpY2stPm5idXR0b25zOworCQkJfQorCQl9CisJCWZvciAoIGk9MDsgaTxBQlNfTUlTQzsgKytpICkgeworCQkJLyogU2tpcCBoYXRzICovCisJCQlpZiAoIGkgPT0gQUJTX0hBVDBYICkgeworCQkJCWkgPSBBQlNfSEFUM1k7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIHRlc3RfYml0KGksIGFic2JpdCkgKSB7CisJCQkJc3RydWN0IGlucHV0X2Fic2luZm8gYWJzaW5mbzsKKworCQkJCWlmICggaW9jdGwoZmQsIEVWSU9DR0FCUyhpKSwgJmFic2luZm8pIDwgMCApCisJCQkJCWNvbnRpbnVlOworI2lmZGVmIERFQlVHX0lOUFVUX0VWRU5UUworCQkJCXByaW50ZigiSm95c3RpY2sgaGFzIGFic29sdXRlIGF4aXM6ICV4XG4iLCBpKTsKKwkJCQlwcmludGYoIlZhbHVlcyA9IHsgJWQsICVkLCAlZCwgJWQsICVkIH1cbiIsCisJCQkJCWFic2luZm8udmFsdWUsIGFic2luZm8ubWluaW11bSwKKwkJCQkJYWJzaW5mby5tYXhpbXVtLCBhYnNpbmZvLmZ1enosIGFic2luZm8uZmxhdCk7CisjZW5kaWYgLyogREVCVUdfSU5QVVRfRVZFTlRTICovCisJCQkJam95c3RpY2stPmh3ZGF0YS0+YWJzX21hcFtpXSA9IGpveXN0aWNrLT5uYXhlczsKKwkJCQlpZiAoIGFic2luZm8ubWluaW11bSA9PSBhYnNpbmZvLm1heGltdW0gKSB7CisJCQkJICAgIGpveXN0aWNrLT5od2RhdGEtPmFic19jb3JyZWN0W2ldLnVzZWQgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJICAgIGpveXN0aWNrLT5od2RhdGEtPmFic19jb3JyZWN0W2ldLnVzZWQgPSAxOworCQkJCSAgICBqb3lzdGljay0+aHdkYXRhLT5hYnNfY29ycmVjdFtpXS5jb2VmWzBdID0KKwkJCQkJKGFic2luZm8ubWF4aW11bSArIGFic2luZm8ubWluaW11bSkgLyAyIC0gYWJzaW5mby5mbGF0OworCQkJCSAgICBqb3lzdGljay0+aHdkYXRhLT5hYnNfY29ycmVjdFtpXS5jb2VmWzFdID0KKwkJCQkJKGFic2luZm8ubWF4aW11bSArIGFic2luZm8ubWluaW11bSkgLyAyICsgYWJzaW5mby5mbGF0OworCQkJCSAgICB0ID0gKChhYnNpbmZvLm1heGltdW0gLSBhYnNpbmZvLm1pbmltdW0pIC8gMiAtIDIgKiBhYnNpbmZvLmZsYXQpOworCQkJCSAgICBpZiAoIHQgIT0gMCApIHsKKwkJCQkJam95c3RpY2stPmh3ZGF0YS0+YWJzX2NvcnJlY3RbaV0uY29lZlsyXSA9ICgxIDw8IDI5KSAvIHQ7CisJCQkJICAgIH0gZWxzZSB7CisJCQkJCWpveXN0aWNrLT5od2RhdGEtPmFic19jb3JyZWN0W2ldLmNvZWZbMl0gPSAwOworCQkJCSAgICB9CisJCQkJfQorCQkJCSsram95c3RpY2stPm5heGVzOworCQkJfQorCQl9CisJCWZvciAoIGk9QUJTX0hBVDBYOyBpIDw9IEFCU19IQVQzWTsgaSArPSAyICkgeworCQkJaWYgKCB0ZXN0X2JpdChpLCBhYnNiaXQpIHx8IHRlc3RfYml0KGkrMSwgYWJzYml0KSApIHsKKyNpZmRlZiBERUJVR19JTlBVVF9FVkVOVFMKKwkJCQlwcmludGYoIkpveXN0aWNrIGhhcyBoYXQgJWRcbiIsKGktQUJTX0hBVDBYKS8yKTsKKyNlbmRpZgorCQkJCSsram95c3RpY2stPm5oYXRzOworCQkJfQorCQl9CisJCWlmICggdGVzdF9iaXQoUkVMX1gsIHJlbGJpdCkgfHwgdGVzdF9iaXQoUkVMX1ksIHJlbGJpdCkgKSB7CisJCQkrK2pveXN0aWNrLT5uYmFsbHM7CisJCX0KKworCQkvKiBBbGxvY2F0ZSBkYXRhIHRvIGtlZXAgdHJhY2sgb2YgdGhlc2UgdGhpbmdhbWFqaWdzICovCisJCWlmICggam95c3RpY2stPm5oYXRzID4gMCApIHsKKwkJCWlmICggYWxsb2NhdGVfaGF0ZGF0YShqb3lzdGljaykgPCAwICkgeworCQkJCWpveXN0aWNrLT5uaGF0cyA9IDA7CisJCQl9CisJCX0KKwkJaWYgKCBqb3lzdGljay0+bmJhbGxzID4gMCApIHsKKwkJCWlmICggYWxsb2NhdGVfYmFsbGRhdGEoam95c3RpY2spIDwgMCApIHsKKwkJCQlqb3lzdGljay0+bmJhbGxzID0gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4oam95c3RpY2stPmh3ZGF0YS0+aXNfaGlkKTsKK30KKworI2VuZGlmIC8qIFNETF9JTlBVVF9MSU5VWEVWICovCisKKyNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKK3N0YXRpYyB2b2lkIENvbmZpZ0xvZ2ljYWxKb3lzdGljayhTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworICAgICAgICBzdHJ1Y3Qgam95c3RpY2tfbG9naWNhbF9sYXlvdXQqIGxheW91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGxheW91dCA9IFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0ubWFwLT5sYXlvdXQgKworICAgICAgICAgICAgICAgIFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0ubG9naWNhbG5vOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgam95c3RpY2stPm5idXR0b25zID0gbGF5b3V0LT5uYnV0dG9uczsKKyAgICAgICAgam95c3RpY2stPm5oYXRzID0gbGF5b3V0LT5uaGF0czsKKyAgICAgICAgam95c3RpY2stPm5heGVzID0gbGF5b3V0LT5uYXhlczsKKyAgICAgICAgam95c3RpY2stPm5iYWxscyA9IGxheW91dC0+bmJhbGxzOworfQorI2VuZGlmCisKKworLyogRnVuY3Rpb24gdG8gb3BlbiBhIGpveXN0aWNrIGZvciB1c2UuCisgICBUaGUgam95c3RpY2sgdG8gb3BlbiBpcyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGZpZWxkIG9mIHRoZSBqb3lzdGljay4KKyAgIFRoaXMgc2hvdWxkIGZpbGwgdGhlIG5idXR0b25zIGFuZCBuYXhlcyBmaWVsZHMgb2YgdGhlIGpveXN0aWNrIHN0cnVjdHVyZS4KKyAgIEl0IHJldHVybnMgMCwgb3IgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgKi8KK2ludCBTRExfU1lTX0pveXN0aWNrT3BlbihTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCWludCBmZDsKKwlTRExfbG9naWNhbF9qb3lkZWNsKGludCByZWFsaW5kZXgpOworCVNETF9sb2dpY2FsX2pveWRlY2woU0RMX0pveXN0aWNrICpyZWFsam95ID0gTlVMTCk7CisKKwkvKiBPcGVuIHRoZSBqb3lzdGljayBhbmQgc2V0IHRoZSBqb3lzdGljayBmaWxlIGRlc2NyaXB0b3IgKi8KKyNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKKwlpZiAoU0RMX2pveWxpc3Rbam95c3RpY2stPmluZGV4XS5mbmFtZSA9PSBOVUxMKSB7CisJCVNETF9qb3lsaXN0X2hlYWQocmVhbGluZGV4LCBqb3lzdGljay0+aW5kZXgpOworCQlyZWFsam95ID0gU0RMX0pveXN0aWNrT3BlbihyZWFsaW5kZXgpOworCisJCWlmIChyZWFsam95ID09IE5VTEwpCisJCQlyZXR1cm4oLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZmQgPSByZWFsam95LT5od2RhdGEtPmZkOworCisJfSBlbHNlIHsKKwkJZmQgPSBvcGVuKFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0uZm5hbWUsIE9fUkRPTkxZLCAwKTsKKwl9CisJU0RMX2pveWxpc3Rbam95c3RpY2stPmluZGV4XS5qb3kgPSBqb3lzdGljazsKKyNlbHNlCisJZmQgPSBvcGVuKFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0uZm5hbWUsIE9fUkRPTkxZLCAwKTsKKyNlbmRpZgorCisJaWYgKCBmZCA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gJXNcbiIsCisJCSAgICAgICAgICAgICBTRExfam95bGlzdFtqb3lzdGljay0+aW5kZXhdKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJam95c3RpY2stPmh3ZGF0YSA9IChzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhICopCisJICAgICAgICAgICAgICAgICAgIFNETF9tYWxsb2Moc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7CisJaWYgKCBqb3lzdGljay0+aHdkYXRhID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQljbG9zZShmZCk7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tZW1zZXQoam95c3RpY2stPmh3ZGF0YSwgMCwgc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7CisJam95c3RpY2stPmh3ZGF0YS0+ZmQgPSBmZDsKKworCS8qIFNldCB0aGUgam95c3RpY2sgdG8gbm9uLWJsb2NraW5nIHJlYWQgbW9kZSAqLworCWZjbnRsKGZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKworCS8qIEdldCB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMgYW5kIGF4ZXMgb24gdGhlIGpveXN0aWNrICovCisjaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCisJaWYgKHJlYWxqb3kpCisJCUNvbmZpZ0xvZ2ljYWxKb3lzdGljayhqb3lzdGljayk7CisJZWxzZQorI2VuZGlmCisjaWYgU0RMX0lOUFVUX0xJTlVYRVYKKwlpZiAoICEgRVZfQ29uZmlnSm95c3RpY2soam95c3RpY2ssIGZkKSApCisjZW5kaWYKKwkJSlNfQ29uZmlnSm95c3RpY2soam95c3RpY2ssIGZkKTsKKworCXJldHVybigwKTsKK30KKworI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUworCitzdGF0aWMgU0RMX0pveXN0aWNrKiBGaW5kTG9naWNhbEpveXN0aWNrKAorICAgU0RMX0pveXN0aWNrICpqb3lzdGljaywgc3RydWN0IGpveXN0aWNrX2xvZ2ljYWxfbWFwcGluZyogdikKK3sKKyAgICAgICAgU0RMX0pveXN0aWNrICpsb2dpY2Fsam95OworICAgICAgICByZWdpc3RlciBpbnQgaTsKKworICAgICAgICBpID0gam95c3RpY2stPmluZGV4OworICAgICAgICBsb2dpY2Fsam95ID0gTlVMTDsKKworICAgICAgICAvKiBnZXQgdGhlIGZha2Ugam95c3RpY2sgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGV2ZW50CisgICAgICAgICAqLworICAgICAgICBmb3IoOzspIHsKKworICAgICAgICAgICBpZiAoU0RMX2pveWxpc3RbaV0ubG9naWNhbG5vID09IHYtPm5qb3kpIHsKKyAgICAgICAgICAgICAgbG9naWNhbGpveSA9IFNETF9qb3lsaXN0W2ldLmpveTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBpZiAoU0RMX2pveWxpc3RbaV0ubmV4dCA9PSAwKQorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBpID0gU0RMX2pveWxpc3RbaV0ubmV4dDsKKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvZ2ljYWxqb3k7Cit9CisKK3N0YXRpYyBpbnQgTG9naWNhbEpveXN0aWNrQnV0dG9uKAorICAgU0RMX0pveXN0aWNrICpqb3lzdGljaywgVWludDggYnV0dG9uLCBVaW50OCBzdGF0ZSl7CisgICAgICAgIHN0cnVjdCBqb3lzdGlja19sb2dpY2FsX21hcHBpbmcqIGJ1dHRvbnM7CisgICAgICAgIFNETF9Kb3lzdGljayAqbG9naWNhbGpveSA9IE5VTEw7CisKKyAgICAgICAgLyogaWYgdGhlcmUncyBubyBtYXAgdGhlbiB0aGlzIGlzIGp1c3QgYSByZWd1bGFyIGpveXN0aWNrCisgICAgICAgICAqLworICAgICAgICBpZiAoU0RMX2pveWxpc3Rbam95c3RpY2stPmluZGV4XS5tYXAgPT0gTlVMTCkKKyAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyogZ2V0IHRoZSBsb2dpY2FsIGpveXN0aWNrIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBldmVudAorICAgICAgICAgKi8KKyAgICAgICAgYnV0dG9ucyA9IFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0ubWFwLT5idXR0b25tYXArYnV0dG9uOworICAgICAgICBsb2dpY2Fsam95ID0gRmluZExvZ2ljYWxKb3lzdGljayhqb3lzdGljaywgYnV0dG9ucyk7CisKKyAgICAgICAgaWYgKGxvZ2ljYWxqb3kgPT0gTlVMTCkKKyAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihsb2dpY2Fsam95LCBidXR0b25zLT5udGhpbmcsIHN0YXRlKTsKKworICAgICAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBMb2dpY2FsSm95c3RpY2tBeGlzKAorCVNETF9Kb3lzdGljayAqam95c3RpY2ssIFVpbnQ4IGF4aXMsIFNpbnQxNiB2YWx1ZSkKK3sKKyAgICAgICAgc3RydWN0IGpveXN0aWNrX2xvZ2ljYWxfbWFwcGluZyogYXhlczsKKyAgICAgICAgU0RMX0pveXN0aWNrICpsb2dpY2Fsam95ID0gTlVMTDsKKworICAgICAgICAvKiBpZiB0aGVyZSdzIG5vIG1hcCB0aGVuIHRoaXMgaXMganVzdCBhIHJlZ3VsYXIgam95c3RpY2sKKyAgICAgICAgICovCisgICAgICAgIGlmIChTRExfam95bGlzdFtqb3lzdGljay0+aW5kZXhdLm1hcCA9PSBOVUxMKQorICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAvKiBnZXQgdGhlIGxvZ2ljYWwgam95c3RpY2sgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGV2ZW50CisgICAgICAgICAqLworICAgICAgICBheGVzID0gU0RMX2pveWxpc3Rbam95c3RpY2stPmluZGV4XS5tYXAtPmF4aXNtYXArYXhpczsKKyAgICAgICAgbG9naWNhbGpveSA9IEZpbmRMb2dpY2FsSm95c3RpY2soam95c3RpY2ssIGF4ZXMpOworCisgICAgICAgIGlmIChsb2dpY2Fsam95ID09IE5VTEwpCisgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIFNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGxvZ2ljYWxqb3ksIGF4ZXMtPm50aGluZywgdmFsdWUpOworCisgICAgICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIFVTRV9MT0dJQ0FMX0pPWVNUSUNLUyAqLworCitzdGF0aWMgX19pbmxpbmVfXwordm9pZCBIYW5kbGVIYXQoU0RMX0pveXN0aWNrICpzdGljaywgVWludDggaGF0LCBpbnQgYXhpcywgaW50IHZhbHVlKQoreworCXN0cnVjdCBod2RhdGFfaGF0ICp0aGVfaGF0OworCWNvbnN0IFVpbnQ4IHBvc2l0aW9uX21hcFszXVszXSA9IHsKKwkJeyBTRExfSEFUX0xFRlRVUCwgU0RMX0hBVF9VUCwgU0RMX0hBVF9SSUdIVFVQIH0sCisJCXsgU0RMX0hBVF9MRUZULCBTRExfSEFUX0NFTlRFUkVELCBTRExfSEFUX1JJR0hUIH0sCisJCXsgU0RMX0hBVF9MRUZURE9XTiwgU0RMX0hBVF9ET1dOLCBTRExfSEFUX1JJR0hURE9XTiB9CisJfTsKKwlTRExfbG9naWNhbF9qb3lkZWNsKFNETF9Kb3lzdGljayAqbG9naWNhbGpveSA9IE5VTEwpOworCVNETF9sb2dpY2FsX2pveWRlY2woc3RydWN0IGpveXN0aWNrX2xvZ2ljYWxfbWFwcGluZyogaGF0cyA9IE5VTEwpOworCisJaWYgKHN0aWNrLT5uaGF0cyA8PSBoYXQpIHsKKwkJcmV0dXJuOyAgLyogd2hvb3BzLCB0aGF0IHNob3VsZG4ndCBoYXBwZW4hICovCisJfQorCisJdGhlX2hhdCA9ICZzdGljay0+aHdkYXRhLT5oYXRzW2hhdF07CisJaWYgKCB2YWx1ZSA8IDAgKSB7CisJCXZhbHVlID0gMDsKKwl9IGVsc2UKKwlpZiAoIHZhbHVlID09IDAgKSB7CisJCXZhbHVlID0gMTsKKwl9IGVsc2UKKwlpZiAoIHZhbHVlID4gMCApIHsKKwkJdmFsdWUgPSAyOworCX0KKwlpZiAoIHZhbHVlICE9IHRoZV9oYXQtPmF4aXNbYXhpc10gKSB7CisJCXRoZV9oYXQtPmF4aXNbYXhpc10gPSB2YWx1ZTsKKworI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUworCQkvKiBpZiB0aGVyZSdzIG5vIG1hcCB0aGVuIHRoaXMgaXMganVzdCBhIHJlZ3VsYXIgam95c3RpY2sKKwkJKi8KKwkJaWYgKFNETF9qb3lsaXN0W3N0aWNrLT5pbmRleF0ubWFwICE9IE5VTEwpIHsKKworCQkJLyogZ2V0IHRoZSBmYWtlIGpveXN0aWNrIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBldmVudAorCQkJKi8KKwkJCWhhdHMgPSBTRExfam95bGlzdFtzdGljay0+aW5kZXhdLm1hcC0+aGF0bWFwK2hhdDsKKwkJCWxvZ2ljYWxqb3kgPSBGaW5kTG9naWNhbEpveXN0aWNrKHN0aWNrLCBoYXRzKTsKKwkJfQorCisJCWlmIChsb2dpY2Fsam95KSB7CisJCQlzdGljayA9IGxvZ2ljYWxqb3k7CisJCQloYXQgPSBoYXRzLT5udGhpbmc7CisJCX0KKyNlbmRpZiAvKiBVU0VfTE9HSUNBTF9KT1lTVElDS1MgKi8KKworCQlTRExfUHJpdmF0ZUpveXN0aWNrSGF0KHN0aWNrLCBoYXQsCisJCQlwb3NpdGlvbl9tYXBbdGhlX2hhdC0+YXhpc1sxXV1bdGhlX2hhdC0+YXhpc1swXV0pOworCX0KK30KKworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgSGFuZGxlQmFsbChTRExfSm95c3RpY2sgKnN0aWNrLCBVaW50OCBiYWxsLCBpbnQgYXhpcywgaW50IHZhbHVlKQoreworCWlmICgoc3RpY2stPm5iYWxscyA8PSBiYWxsKSB8fCAoYXhpcyA+PSAyKSkgeworCQlyZXR1cm47ICAvKiB3aG9vcHMsIHRoYXQgc2hvdWxkbid0IGhhcHBlbiEgKi8KKwl9CisJc3RpY2stPmh3ZGF0YS0+YmFsbHNbYmFsbF0uYXhpc1theGlzXSArPSB2YWx1ZTsKK30KKworLyogRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiBhIGpveXN0aWNrIC0gY2FsbGVkIGFzIGEgZGV2aWNlIHBvbGwuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZG4ndCB1cGRhdGUgdGhlIGpveXN0aWNrIHN0cnVjdHVyZSBkaXJlY3RseSwKKyAqIGJ1dCBpbnN0ZWFkIHNob3VsZCBjYWxsIFNETF9Qcml2YXRlSm95c3RpY2sqKCkgdG8gZGVsaXZlciBldmVudHMKKyAqIGFuZCB1cGRhdGUgam95c3RpY2sgZGV2aWNlIHN0YXRlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIEpTX0hhbmRsZUV2ZW50cyhTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCXN0cnVjdCBqc19ldmVudCBldmVudHNbMzJdOworCWludCBpLCBsZW47CisJVWludDggb3RoZXJfYXhpczsKKworI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUworCWlmIChTRExfam95bGlzdFtqb3lzdGljay0+aW5kZXhdLmZuYW1lID09IE5VTEwpIHsKKwkJU0RMX2pveWxpc3RfaGVhZChpLCBqb3lzdGljay0+aW5kZXgpOworCQlKU19IYW5kbGVFdmVudHMoU0RMX2pveWxpc3RbaV0uam95KTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJd2hpbGUgKChsZW49cmVhZChqb3lzdGljay0+aHdkYXRhLT5mZCwgZXZlbnRzLCAoc2l6ZW9mIGV2ZW50cykpKSA+IDApIHsKKwkJbGVuIC89IHNpemVvZihldmVudHNbMF0pOworCQlmb3IgKCBpPTA7IGk8bGVuOyArK2kgKSB7CisJCQlzd2l0Y2ggKGV2ZW50c1tpXS50eXBlICYgfkpTX0VWRU5UX0lOSVQpIHsKKwkJCSAgICBjYXNlIEpTX0VWRU5UX0FYSVM6CisJCQkJaWYgKCBldmVudHNbaV0ubnVtYmVyIDwgam95c3RpY2stPm5heGVzICkgeworI2lmbmRlZiBOT19MT0dJQ0FMX0pPWVNUSUNLUworCQkJCQlpZiAoIUxvZ2ljYWxKb3lzdGlja0F4aXMoam95c3RpY2ssCisJCQkJICAgICAgICAgICBldmVudHNbaV0ubnVtYmVyLCBldmVudHNbaV0udmFsdWUpKQorI2VuZGlmCisJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLAorCQkJCSAgICAgICAgICAgZXZlbnRzW2ldLm51bWJlciwgZXZlbnRzW2ldLnZhbHVlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWV2ZW50c1tpXS5udW1iZXIgLT0gam95c3RpY2stPm5heGVzOworCQkJCW90aGVyX2F4aXMgPSAoZXZlbnRzW2ldLm51bWJlciAvIDIpOworCQkJCWlmICggb3RoZXJfYXhpcyA8IGpveXN0aWNrLT5uaGF0cyApIHsKKwkJCQkJSGFuZGxlSGF0KGpveXN0aWNrLCBvdGhlcl9heGlzLAorCQkJCQkJZXZlbnRzW2ldLm51bWJlciUyLAorCQkJCQkJZXZlbnRzW2ldLnZhbHVlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWV2ZW50c1tpXS5udW1iZXIgLT0gam95c3RpY2stPm5oYXRzKjI7CisJCQkJb3RoZXJfYXhpcyA9IChldmVudHNbaV0ubnVtYmVyIC8gMik7CisJCQkJaWYgKCBvdGhlcl9heGlzIDwgam95c3RpY2stPm5iYWxscyApIHsKKwkJCQkJSGFuZGxlQmFsbChqb3lzdGljaywgb3RoZXJfYXhpcywKKwkJCQkJCWV2ZW50c1tpXS5udW1iZXIlMiwKKwkJCQkJCWV2ZW50c1tpXS52YWx1ZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIEpTX0VWRU5UX0JVVFRPTjoKKyNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKKwkJCQlpZiAoIUxvZ2ljYWxKb3lzdGlja0J1dHRvbihqb3lzdGljaywKKwkJCQkgICAgICAgICAgIGV2ZW50c1tpXS5udW1iZXIsIGV2ZW50c1tpXS52YWx1ZSkpCisjZW5kaWYKKwkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLAorCQkJCSAgICAgICAgICAgZXZlbnRzW2ldLm51bWJlciwgZXZlbnRzW2ldLnZhbHVlKTsKKwkJCQlicmVhazsKKwkJCSAgICBkZWZhdWx0OgorCQkJCS8qID8/ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisjaWYgU0RMX0lOUFVUX0xJTlVYRVYKK3N0YXRpYyBfX2lubGluZV9fIGludCBFVl9BeGlzQ29ycmVjdChTRExfSm95c3RpY2sgKmpveXN0aWNrLCBpbnQgd2hpY2gsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXhpc19jb3JyZWN0ICpjb3JyZWN0OworCisJY29ycmVjdCA9ICZqb3lzdGljay0+aHdkYXRhLT5hYnNfY29ycmVjdFt3aGljaF07CisJaWYgKCBjb3JyZWN0LT51c2VkICkgeworCQlpZiAoIHZhbHVlID4gY29ycmVjdC0+Y29lZlswXSApIHsKKwkJCWlmICggdmFsdWUgPCBjb3JyZWN0LT5jb2VmWzFdICkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJdmFsdWUgLT0gY29ycmVjdC0+Y29lZlsxXTsKKwkJfSBlbHNlIHsKKwkJCXZhbHVlIC09IGNvcnJlY3QtPmNvZWZbMF07CisJCX0KKwkJdmFsdWUgKj0gY29ycmVjdC0+Y29lZlsyXTsKKwkJdmFsdWUgPj49IDE0OworCX0KKworCS8qIENsYW1wIGFuZCByZXR1cm4gKi8KKwlpZiAoIHZhbHVlIDwgLTMyNzY4ICkgcmV0dXJuIC0zMjc2ODsKKwlpZiAoIHZhbHVlID4gIDMyNzY3ICkgcmV0dXJuICAzMjc2NzsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBFVl9IYW5kbGVFdmVudHMoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlzdHJ1Y3QgaW5wdXRfZXZlbnQgZXZlbnRzWzMyXTsKKwlpbnQgaSwgbGVuOworCWludCBjb2RlOworCisjaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCisJaWYgKFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0uZm5hbWUgPT0gTlVMTCkgeworCQlTRExfam95bGlzdF9oZWFkKGksIGpveXN0aWNrLT5pbmRleCk7CisJCXJldHVybiBFVl9IYW5kbGVFdmVudHMoU0RMX2pveWxpc3RbaV0uam95KTsKKwl9CisjZW5kaWYKKworCXdoaWxlICgobGVuPXJlYWQoam95c3RpY2stPmh3ZGF0YS0+ZmQsIGV2ZW50cywgKHNpemVvZiBldmVudHMpKSkgPiAwKSB7CisJCWxlbiAvPSBzaXplb2YoZXZlbnRzWzBdKTsKKwkJZm9yICggaT0wOyBpPGxlbjsgKytpICkgeworCQkJY29kZSA9IGV2ZW50c1tpXS5jb2RlOworCQkJc3dpdGNoIChldmVudHNbaV0udHlwZSkgeworCQkJICAgIGNhc2UgRVZfS0VZOgorCQkJCWlmICggY29kZSA+PSBCVE5fTUlTQyApIHsKKwkJCQkJY29kZSAtPSBCVE5fTUlTQzsKKyNpZm5kZWYgTk9fTE9HSUNBTF9KT1lTVElDS1MKKwkJCQkJaWYgKCFMb2dpY2FsSm95c3RpY2tCdXR0b24oam95c3RpY2ssCisJCQkJICAgICAgICAgICBqb3lzdGljay0+aHdkYXRhLT5rZXlfbWFwW2NvZGVdLAorCQkJCQkgICBldmVudHNbaV0udmFsdWUpKQorI2VuZGlmCisJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssCisJCQkJICAgICAgICAgICBqb3lzdGljay0+aHdkYXRhLT5rZXlfbWFwW2NvZGVdLAorCQkJCQkgICBldmVudHNbaV0udmFsdWUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIEVWX0FCUzoKKwkJCQlzd2l0Y2ggKGNvZGUpIHsKKwkJCQkgICAgY2FzZSBBQlNfSEFUMFg6CisJCQkJICAgIGNhc2UgQUJTX0hBVDBZOgorCQkJCSAgICBjYXNlIEFCU19IQVQxWDoKKwkJCQkgICAgY2FzZSBBQlNfSEFUMVk6CisJCQkJICAgIGNhc2UgQUJTX0hBVDJYOgorCQkJCSAgICBjYXNlIEFCU19IQVQyWToKKwkJCQkgICAgY2FzZSBBQlNfSEFUM1g6CisJCQkJICAgIGNhc2UgQUJTX0hBVDNZOgorCQkJCQljb2RlIC09IEFCU19IQVQwWDsKKwkJCQkJSGFuZGxlSGF0KGpveXN0aWNrLCBjb2RlLzIsIGNvZGUlMiwKKwkJCQkJCQlldmVudHNbaV0udmFsdWUpOworCQkJCQlicmVhazsKKwkJCQkgICAgZGVmYXVsdDoKKwkJCQkJZXZlbnRzW2ldLnZhbHVlID0gRVZfQXhpc0NvcnJlY3Qoam95c3RpY2ssIGNvZGUsIGV2ZW50c1tpXS52YWx1ZSk7CisjaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCisJCQkJCWlmICghTG9naWNhbEpveXN0aWNrQXhpcyhqb3lzdGljaywKKwkJCQkgICAgICAgICAgIGpveXN0aWNrLT5od2RhdGEtPmFic19tYXBbY29kZV0sCisJCQkJCSAgIGV2ZW50c1tpXS52YWx1ZSkpCisjZW5kaWYKKwkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssCisJCQkJICAgICAgICAgICBqb3lzdGljay0+aHdkYXRhLT5hYnNfbWFwW2NvZGVdLAorCQkJCQkgICBldmVudHNbaV0udmFsdWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBFVl9SRUw6CisJCQkJc3dpdGNoIChjb2RlKSB7CisJCQkJICAgIGNhc2UgUkVMX1g6CisJCQkJICAgIGNhc2UgUkVMX1k6CisJCQkJCWNvZGUgLT0gUkVMX1g7CisJCQkJCUhhbmRsZUJhbGwoam95c3RpY2ssIGNvZGUvMiwgY29kZSUyLAorCQkJCQkJCWV2ZW50c1tpXS52YWx1ZSk7CisJCQkJCWJyZWFrOworCQkJCSAgICBkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgICAgZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvKiBTRExfSU5QVVRfTElOVVhFViAqLworCit2b2lkIFNETF9TWVNfSm95c3RpY2tVcGRhdGUoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpbnQgaTsKKwkKKyNpZiBTRExfSU5QVVRfTElOVVhFVgorCWlmICggam95c3RpY2stPmh3ZGF0YS0+aXNfaGlkICkKKwkJRVZfSGFuZGxlRXZlbnRzKGpveXN0aWNrKTsKKwllbHNlCisjZW5kaWYKKwkJSlNfSGFuZGxlRXZlbnRzKGpveXN0aWNrKTsKKworCS8qIERlbGl2ZXIgYmFsbCBtb3Rpb24gdXBkYXRlcyAqLworCWZvciAoIGk9MDsgaTxqb3lzdGljay0+bmJhbGxzOyArK2kgKSB7CisJCWludCB4cmVsLCB5cmVsOworCisJCXhyZWwgPSBqb3lzdGljay0+aHdkYXRhLT5iYWxsc1tpXS5heGlzWzBdOworCQl5cmVsID0gam95c3RpY2stPmh3ZGF0YS0+YmFsbHNbaV0uYXhpc1sxXTsKKwkJaWYgKCB4cmVsIHx8IHlyZWwgKSB7CisJCQlqb3lzdGljay0+aHdkYXRhLT5iYWxsc1tpXS5heGlzWzBdID0gMDsKKwkJCWpveXN0aWNrLT5od2RhdGEtPmJhbGxzW2ldLmF4aXNbMV0gPSAwOworCQkJU0RMX1ByaXZhdGVKb3lzdGlja0JhbGwoam95c3RpY2ssIChVaW50OClpLCB4cmVsLCB5cmVsKTsKKwkJfQorCX0KK30KKworLyogRnVuY3Rpb24gdG8gY2xvc2UgYSBqb3lzdGljayBhZnRlciB1c2UgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja0Nsb3NlKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7CisjaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCisJcmVnaXN0ZXIgaW50IGk7CisJaWYgKFNETF9qb3lsaXN0W2pveXN0aWNrLT5pbmRleF0uZm5hbWUgPT0gTlVMTCkgeworCQlTRExfam95bGlzdF9oZWFkKGksIGpveXN0aWNrLT5pbmRleCk7CisJCVNETF9Kb3lzdGlja0Nsb3NlKFNETF9qb3lsaXN0W2ldLmpveSk7CisJfQorI2VuZGlmCisKKwlpZiAoIGpveXN0aWNrLT5od2RhdGEgKSB7CisjaWZuZGVmIE5PX0xPR0lDQUxfSk9ZU1RJQ0tTCisJCWlmIChTRExfam95bGlzdFtqb3lzdGljay0+aW5kZXhdLmZuYW1lICE9IE5VTEwpCisjZW5kaWYKKwkJY2xvc2Uoam95c3RpY2stPmh3ZGF0YS0+ZmQpOworCQlpZiAoIGpveXN0aWNrLT5od2RhdGEtPmhhdHMgKSB7CisJCQlTRExfZnJlZShqb3lzdGljay0+aHdkYXRhLT5oYXRzKTsKKwkJfQorCQlpZiAoIGpveXN0aWNrLT5od2RhdGEtPmJhbGxzICkgeworCQkJU0RMX2ZyZWUoam95c3RpY2stPmh3ZGF0YS0+YmFsbHMpOworCQl9CisJCVNETF9mcmVlKGpveXN0aWNrLT5od2RhdGEpOworCQlqb3lzdGljay0+aHdkYXRhID0gTlVMTDsKKwl9Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHBlcmZvcm0gYW55IHN5c3RlbS1zcGVjaWZpYyBqb3lzdGljayByZWxhdGVkIGNsZWFudXAgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoIGk9MDsgU0RMX2pveWxpc3RbaV0uZm5hbWU7ICsraSApIHsKKwkJU0RMX2ZyZWUoU0RMX2pveWxpc3RbaV0uZm5hbWUpOworCQlTRExfam95bGlzdFtpXS5mbmFtZSA9IE5VTEw7CisJfQorfQorCisjZW5kaWYgLyogU0RMX0pPWVNUSUNLX0xJTlVYICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL21hY29zL1NETF9zeXNqb3lzdGljay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9tYWNvcy9TRExfc3lzam95c3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQ1ZGJkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9tYWNvcy9TRExfc3lzam95c3RpY2suYwpAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfSk9ZU1RJQ0tfTUFDT1MKKworLyogIFNETCBzdHVmZiAgLS0gICJTRExfc3lzam95c3RpY2suYyIKKyAgICBNYWNPUyBqb3lzdGljayBmdW5jdGlvbnMgYnkgRnJlZGVyaWNrIFJlaXRiZXJnZXIKKworICAgIFRoZSBjb2RlIHRoYXQgZm9sbG93cyBpcyBtZWFudCBmb3IgU0RMLiAgVXNlIGF0IHlvdXIgb3duIHJpc2suCisqLworCisjaW5jbHVkZSA8SW5wdXRTcHJvY2tldC5oPgorCisjaW5jbHVkZSAiU0RMX2pveXN0aWNrLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c2pveXN0aWNrLmgiCisjaW5jbHVkZSAiLi4vU0RMX2pveXN0aWNrX2MuaCIKKworCisvKiAgVGhlIG1heCBudW1iZXIgb2Ygam95c3RpY2tzIHdlIHdpbGwgZGV0ZWN0ICAqLworI2RlZmluZSAgICAgTUFYX0pPWVNUSUNLUyAgICAgICAxNiAKKy8qICBMaW1pdCBvdXJzZWx2ZXMgdG8gMzIgZWxlbWVudHMgcGVyIGRldmljZSAgKi8KKyNkZWZpbmUgICAgIGtNYXhSZWZlcmVuY2VzICAgICAgMzIgCisKKyNkZWZpbmUJCUlTcFN5bW1ldHJpY0F4aXNUb0Zsb2F0KGF4aXMpCSgoKChmbG9hdCkgYXhpcykgLSBrSVNwQXhpc01pZGRsZSkgLyAoa0lTcEF4aXNNYXhpbXVtLWtJU3BBeGlzTWlkZGxlKSkKKyNkZWZpbmUJCUlTcEFzeW1tZXRyaWNBeGlzVG9GbG9hdChheGlzKQkoKChmbG9hdCkgYXhpcykgLyAoa0lTcEF4aXNNYXhpbXVtKSkKKworCitzdGF0aWMgIElTcERldmljZVJlZmVyZW5jZSAgU1lTX0pveXN0aWNrc1tNQVhfSk9ZU1RJQ0tTXTsKK3N0YXRpYyAgSVNwRWxlbWVudExpc3RSZWZlcmVuY2UgU1lTX0VsZW1lbnRzW01BWF9KT1lTVElDS1NdOworc3RhdGljICBJU3BEZXZpY2VEZWZpbml0aW9uICAgICBTWVNfRGV2RGVmW01BWF9KT1lTVElDS1NdOworCitzdHJ1Y3Qgam95c3RpY2tfaHdkYXRhIAoreworICAgIGNoYXIgbmFtZVs2NF07CisvKiAgICBVaW50OCAgIGlkOyovCisgICAgSVNwRWxlbWVudFJlZmVyZW5jZSByZWZzW2tNYXhSZWZlcmVuY2VzXTsKKyAgICAvKiAgZ29ubmEgbmVlZCBzb21lIHNvcnQgb2YgbWFwcGluZyBpbmZvICAqLworfTsgCisKKworLyogRnVuY3Rpb24gdG8gc2NhbiB0aGUgc3lzdGVtIGZvciBqb3lzdGlja3MuCisgKiBKb3lzdGljayAwIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgam95c3RpY2suCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgam95c3RpY2tzLCBvciAtMQorICogb24gYW4gdW5yZWNvdmVyYWJsZSBmYXRhbCBlcnJvci4KKyAqLworaW50IFNETF9TWVNfSm95c3RpY2tJbml0KHZvaWQpCit7CisgICAgc3RhdGljIElTcERldmljZUNsYXNzIGNsYXNzZXNbNF0gPSB7CisgICAgICAgIGtJU3BEZXZpY2VDbGFzc19Kb3lzdGljaywKKyAgICAjaWYga0lTcERldmljZUNsYXNzX0dhbWVwYWQKKyAgICAgICAga0lTcERldmljZUNsYXNzX0dhbWVwYWQsCisgICAgI2VuZGlmCisgICAgICAgIGtJU3BEZXZpY2VDbGFzc19XaGVlbCwKKyAgICAgICAgMAorICAgIH07CisgICAgT1NFcnIgICBlcnI7CisgICAgaW50ICAgICBpOworICAgIFVJbnQzMiAgY291bnQsIG51bUpveXN0aWNrczsKKworICAgIGlmICggKFB0cikwID09IChQdHIpSVNwU3RhcnR1cCApIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJJbnB1dFNwcm9ja2V0IG5vdCBpbnN0YWxsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOyAgLy8gIElucHV0U3Byb2NrZXQgbm90IGluc3RhbGxlZAorICAgIH0KKworICAgIGlmKCAoUHRyKTAgPT0gKFB0cilJU3BHZXRWZXJzaW9uICkgeworICAgICAgICBTRExfU2V0RXJyb3IoIklucHV0U3Byb2NrZXQgbm90IHZlcnNpb24gMS4xIG9yIG5ld2VyIik7CisgICAgICAgIHJldHVybiAtMTsgIC8vICBvbGQgdmVyc2lvbiBvZiBJU3AgKG5vdCBhdCBsZWFzdCAxLjEpCisgICAgfQorCisgICAgSVNwU3RhcnR1cCgpOworCisgICAgLyogR2V0IGFsbCB0aGUgam95c3RpY2tzICovCisgICAgbnVtSm95c3RpY2tzID0gMDsKKyAgICBmb3IgKCBpPTA7IGNsYXNzZXNbaV07ICsraSApIHsKKyAgICAgICAgY291bnQgPSAwOworICAgICAgICBlcnIgPSBJU3BEZXZpY2VzX0V4dHJhY3RCeUNsYXNzKAorICAgICAgICAgICAgY2xhc3Nlc1tpXSwKKyAgICAgICAgICAgIE1BWF9KT1lTVElDS1MtbnVtSm95c3RpY2tzLAorICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgJlNZU19Kb3lzdGlja3NbbnVtSm95c3RpY2tzXSk7CisgICAgICAgIG51bUpveXN0aWNrcyArPSBjb3VudDsKKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBudW1Kb3lzdGlja3M7IGkrKykKKyAgICB7CisgICAgICAgIElTcERldmljZV9HZXREZWZpbml0aW9uKAorICAgICAgICAgICAgU1lTX0pveXN0aWNrc1tpXSwgc2l6ZW9mKElTcERldmljZURlZmluaXRpb24pLAorICAgICAgICAgICAgJlNZU19EZXZEZWZbaV0pOworICAgICAgICAKKyAgICAgICAgZXJyID0gSVNwRWxlbWVudExpc3RfTmV3KAorICAgICAgICAgICAgMCwgTlVMTCwKKyAgICAgICAgICAgICZTWVNfRWxlbWVudHNbaV0sIDApOworICAgICAgICAKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBJU3BEZXZpY2VfR2V0RWxlbWVudExpc3QoCisgICAgICAgICAgICBTWVNfSm95c3RpY2tzW2ldLAorICAgICAgICAgICAgJlNZU19FbGVtZW50c1tpXSk7CisgICAgfQorCisgICAgSVNwRGV2aWNlc19EZWFjdGl2YXRlKG51bUpveXN0aWNrcywgU1lTX0pveXN0aWNrcyk7CisKKyAgICByZXR1cm4gbnVtSm95c3RpY2tzOworfQorCisvKiBGdW5jdGlvbiB0byBnZXQgdGhlIGRldmljZS1kZXBlbmRlbnQgbmFtZSBvZiBhIGpveXN0aWNrICovCitjb25zdCBjaGFyICpTRExfU1lTX0pveXN0aWNrTmFtZShpbnQgaW5kZXgpCit7CisgICAgc3RhdGljIGNoYXIgbmFtZVs2NF07CisgICAgaW50IGxlbjsKKworICAgIC8qICBjb252ZXJ0IHBhc2NhbCBzdHJpbmcgdG8gYy1zdHJpbmcgICovCisgICAgbGVuID0gU1lTX0RldkRlZltpbmRleF0uZGV2aWNlTmFtZVswXTsKKyAgICBpZiAoIGxlbiA+PSBzaXplb2YobmFtZSkgKSB7CisgICAgICAgIGxlbiA9IChzaXplb2YobmFtZSkgLSAxKTsKKyAgICB9CisgICAgU0RMX21lbWNweShuYW1lLCAmU1lTX0RldkRlZltpbmRleF0uZGV2aWNlTmFtZVsxXSwgbGVuKTsKKyAgICBuYW1lW2xlbl0gPSAnXDAnOworCisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIG9wZW4gYSBqb3lzdGljayBmb3IgdXNlLgorICAgVGhlIGpveXN0aWNrIHRvIG9wZW4gaXMgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCBmaWVsZCBvZiB0aGUgam95c3RpY2suCisgICBUaGlzIHNob3VsZCBmaWxsIHRoZSBuYnV0dG9ucyBhbmQgbmF4ZXMgZmllbGRzIG9mIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUuCisgICBJdCByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICovCitpbnQgU0RMX1NZU19Kb3lzdGlja09wZW4oU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKyAgICBpbnQgICAgIGluZGV4OworICAgIFVJbnQzMiAgY291bnQsIGdvdENvdW50LCBjb3VudDI7CisgICAgbG9uZyAgICBudW1BeGlzLCBudW1CdXR0b25zLCBudW1IYXRzLCBudW1CYWxsczsKKworICAgIGNvdW50ID0ga01heFJlZmVyZW5jZXM7CisgICAgY291bnQyID0gMDsKKyAgICBudW1BeGlzID0gbnVtQnV0dG9ucyA9IG51bUhhdHMgPSBudW1CYWxscyA9IDA7CisKKyAgICBpbmRleCA9IGpveXN0aWNrLT5pbmRleDsKKworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3lzdGVtIHNwZWNpZmljIGhhcmR3YXJlIGRhdGEgKi8KKyAgICBqb3lzdGljay0+aHdkYXRhID0gKHN0cnVjdCBqb3lzdGlja19od2RhdGEgKikgU0RMX21hbGxvYyhzaXplb2YoKmpveXN0aWNrLT5od2RhdGEpKTsKKyAgICBpZiAoam95c3RpY2stPmh3ZGF0YSA9PSBOVUxMKQorICAgIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybigtMSk7CisgICAgfQorICAgIFNETF9tZW1zZXQoam95c3RpY2stPmh3ZGF0YSwgMCwgc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7CisgICAgU0RMX3N0cmxjcHkoam95c3RpY2stPmh3ZGF0YS0+bmFtZSwgU0RMX1NZU19Kb3lzdGlja05hbWUoaW5kZXgpLCBTRExfYXJyYXlzaXplKGpveXN0aWNrLT5od2RhdGEtPm5hbWUpKTsKKyAgICBqb3lzdGljay0+bmFtZSA9IGpveXN0aWNrLT5od2RhdGEtPm5hbWU7CisKKyAgICBJU3BFbGVtZW50TGlzdF9FeHRyYWN0QnlLaW5kKAorICAgICAgICBTWVNfRWxlbWVudHNbaW5kZXhdLAorICAgICAgICBrSVNwRWxlbWVudEtpbmRfQXhpcywKKyAgICAgICAgY291bnQsCisgICAgICAgICZnb3RDb3VudCwKKyAgICAgICAgam95c3RpY2stPmh3ZGF0YS0+cmVmcyk7CisKKyAgICBudW1BeGlzID0gZ290Q291bnQ7CisgICAgY291bnQgLT0gZ290Q291bnQ7CisgICAgY291bnQyICs9IGdvdENvdW50OworCisgICAgSVNwRWxlbWVudExpc3RfRXh0cmFjdEJ5S2luZCgKKyAgICAgICAgU1lTX0VsZW1lbnRzW2luZGV4XSwKKyAgICAgICAga0lTcEVsZW1lbnRLaW5kX0RQYWQsCisgICAgICAgIGNvdW50LAorICAgICAgICAmZ290Q291bnQsCisgICAgICAgICYoam95c3RpY2stPmh3ZGF0YS0+cmVmc1tjb3VudDJdKSk7CisKKyAgICBudW1IYXRzID0gZ290Q291bnQ7CisgICAgY291bnQgLT0gZ290Q291bnQ7CisgICAgY291bnQyICs9IGdvdENvdW50OworCisgICAgSVNwRWxlbWVudExpc3RfRXh0cmFjdEJ5S2luZCgKKyAgICAgICAgU1lTX0VsZW1lbnRzW2luZGV4XSwKKyAgICAgICAga0lTcEVsZW1lbnRLaW5kX0J1dHRvbiwKKyAgICAgICAgY291bnQsCisgICAgICAgICZnb3RDb3VudCwKKyAgICAgICAgJihqb3lzdGljay0+aHdkYXRhLT5yZWZzW2NvdW50Ml0pKTsKKworICAgIG51bUJ1dHRvbnMgPSBnb3RDb3VudDsKKyAgICBjb3VudCAtPSBnb3RDb3VudDsKKyAgICBjb3VudDIgKz0gZ290Q291bnQ7CisKKyAgICBqb3lzdGljay0+bmF4ZXMgPSBudW1BeGlzOworICAgIGpveXN0aWNrLT5uaGF0cyA9IG51bUhhdHM7CisgICAgam95c3RpY2stPm5iYWxscyA9IG51bUJhbGxzOworICAgIGpveXN0aWNrLT5uYnV0dG9ucyA9IG51bUJ1dHRvbnM7CisKKyAgICBJU3BEZXZpY2VzX0FjdGl2YXRlKAorICAgICAgICAxLAorICAgICAgICAmU1lTX0pveXN0aWNrc1tpbmRleF0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCisgKiBidXQgaW5zdGVhZCBzaG91bGQgY2FsbCBTRExfUHJpdmF0ZUpveXN0aWNrKigpIHRvIGRlbGl2ZXIgZXZlbnRzCisgKiBhbmQgdXBkYXRlIGpveXN0aWNrIGRldmljZSBzdGF0ZS4KKyAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7CisgICAgaW50ICAgICBpLCBqOworICAgIElTcEF4aXNEYXRhICAgICBhOworICAgIElTcERQYWREYXRhICAgICBiOworICAgIC8vSVNwRGVsdGFEYXRhICAgIGM7CisgICAgSVNwQnV0dG9uRGF0YSAgIGQ7CisKKyAgICBmb3IoaSA9IDAsIGogPSAwOyBpIDwgam95c3RpY2stPm5heGVzOyBpKyssIGorKykKKyAgICB7CisgICAgICAgIFNpbnQxNiB2YWx1ZTsKKworICAgICAgICBJU3BFbGVtZW50X0dldFNpbXBsZVN0YXRlKAorICAgICAgICAgICAgam95c3RpY2stPmh3ZGF0YS0+cmVmc1tqXSwKKyAgICAgICAgICAgICZhKTsKKyAgICAgICAgdmFsdWUgPSAoSVNwU3ltbWV0cmljQXhpc1RvRmxvYXQoYSkqIDMyNzY3LjApOworICAgICAgICBpZiAoIHZhbHVlICE9IGpveXN0aWNrLT5heGVzW2ldICkgeworICAgICAgICAgICAgU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssIGksIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IGpveXN0aWNrLT5uaGF0czsgaSsrLCBqKyspCisgICAgeworICAgICAgICBVaW50OCBwb3M7CisKKyAgICAgICAgSVNwRWxlbWVudF9HZXRTaW1wbGVTdGF0ZSgKKyAgICAgICAgICAgIGpveXN0aWNrLT5od2RhdGEtPnJlZnNbal0sCisgICAgICAgICAgICAmYik7CisgICAgICAgIHN3aXRjaChiKSB7CisgICAgICAgICAgICBjYXNlIGtJU3BQYWRJZGxlOgorICAgICAgICAgICAgICAgIHBvcyA9IFNETF9IQVRfQ0VOVEVSRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtJU3BQYWRMZWZ0OgorICAgICAgICAgICAgICAgIHBvcyA9IFNETF9IQVRfTEVGVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0lTcFBhZFVwTGVmdDoKKyAgICAgICAgICAgICAgICBwb3MgPSBTRExfSEFUX0xFRlRVUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0lTcFBhZFVwOgorICAgICAgICAgICAgICAgIHBvcyA9IFNETF9IQVRfVVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtJU3BQYWRVcFJpZ2h0OgorICAgICAgICAgICAgICAgIHBvcyA9IFNETF9IQVRfUklHSFRVUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0lTcFBhZFJpZ2h0OgorICAgICAgICAgICAgICAgIHBvcyA9IFNETF9IQVRfUklHSFQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtJU3BQYWREb3duUmlnaHQ6CisgICAgICAgICAgICAgICAgcG9zID0gU0RMX0hBVF9SSUdIVERPV047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtJU3BQYWREb3duOgorICAgICAgICAgICAgICAgIHBvcyA9IFNETF9IQVRfRE9XTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0lTcFBhZERvd25MZWZ0OgorICAgICAgICAgICAgICAgIHBvcyA9IFNETF9IQVRfTEVGVERPV047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBwb3MgIT0gam95c3RpY2stPmhhdHNbaV0gKSB7CisgICAgICAgICAgICBTRExfUHJpdmF0ZUpveXN0aWNrSGF0KGpveXN0aWNrLCBpLCBwb3MpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgam95c3RpY2stPm5iYWxsczsgaSsrLCBqKyspCisgICAgeworICAgICAgICAvKiAgaWdub3JlIGJhbGxzIHJpZ2h0IG5vdyAgKi8KKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBqb3lzdGljay0+bmJ1dHRvbnM7IGkrKywgaisrKQorICAgIHsKKyAgICAgICAgSVNwRWxlbWVudF9HZXRTaW1wbGVTdGF0ZSgKKyAgICAgICAgICAgIGpveXN0aWNrLT5od2RhdGEtPnJlZnNbal0sCisgICAgICAgICAgICAmZCk7CisgICAgICAgIGlmICggZCAhPSBqb3lzdGljay0+YnV0dG9uc1tpXSApIHsKKyAgICAgICAgICAgIFNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIGksIGQpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBGdW5jdGlvbiB0byBjbG9zZSBhIGpveXN0aWNrIGFmdGVyIHVzZSAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKyAgICBpbnQgaW5kZXg7CisKKyAgICBpbmRleCA9IGpveXN0aWNrLT5pbmRleDsKKworICAgIElTcERldmljZXNfRGVhY3RpdmF0ZSgKKyAgICAgICAgMSwKKyAgICAgICAgJlNZU19Kb3lzdGlja3NbaW5kZXhdKTsKK30KKworLyogRnVuY3Rpb24gdG8gcGVyZm9ybSBhbnkgc3lzdGVtLXNwZWNpZmljIGpveXN0aWNrIHJlbGF0ZWQgY2xlYW51cCAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrUXVpdCh2b2lkKQoreworICAgIElTcFNodXRkb3duKCk7Cit9CisKKyNlbmRpZiAvKiBTRExfSk9ZU1RJQ0tfTUFDT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svbWludC9TRExfc3lzam95c3RpY2suYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svbWludC9TRExfc3lzam95c3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTM2MTUyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9taW50L1NETF9zeXNqb3lzdGljay5jCkBAIC0wLDAgKzEsODI2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9KT1lTVElDS19NSU5UCisKKy8qCisgKglBdGFyaSBKb3lzdGljay9Kb3lwYWQgZHJpdmVycworICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2luY2x1ZGUgPG1pbnQvY29va2llLmg+CisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKworI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzam95c3RpY2suaCIKKyNpbmNsdWRlICIuLi9TRExfam95c3RpY2tfYy5oIgorCisjaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX2lrYmRpbnRlcnJ1cHRfcy5oIgorI2luY2x1ZGUgIi4uLy4uL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2V2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zaW50ZXJydXB0X3MuaCIKKworLyotLS0gQ29uc3QgLS0tKi8KKworLyogV2UgY2FuIGhhdmU6CisJMSBqb3lzdGljayBvbiBJS0JEIHBvcnQgMSwgcmVhZCB2aWEgaGFyZHdhcmUgSS9PCisJICBvciBzYW1lIGpveXN0aWNrIG9uIElLQkQgcG9ydCAxLCByZWFkIHZpYSB4YmlvcworCTEgam95cGFkIG9uIHBvcnQgQSAodXAgdG8gNCB3aXRoIHRlYW10YXApCisJICBvciAyIGpveXN0aWNrcyBvbiBqb3lwYWQgcG9ydCBBCisJICBvciAxIGFuYWxvZyBwYWRkbGUgb24gam95cGFkIHBvcnQgQQorCSAgb3IgMSBsaWdodHBlbiBvbiBqb3lwYWQgcG9ydCBBCisJMSBqb3lwYWQgb24gcG9ydCBCICh1cCB0byA0IHdpdGggdGVhbXRhcCkKKwkgIG9yIDIgam95c3RpY2tzIG9uIGpveXBhZCBwb3J0IEIKKwkgIG9yIDEgYW5hbG9nIHBhZGRsZSBvbiBqb3lwYWQgcG9ydCBCCisJMiBqb3lzdGlja3Mgb24gcGFyYWxsZWwgcG9ydAorKi8KKworZW51bSB7CisJSUtCRF9KT1kxPTAsCisJWEJJT1NfSk9ZMSwKKwlQT1JUQV9QQUQwLAorCVBPUlRBX1BBRDEsCisJUE9SVEFfUEFEMiwKKwlQT1JUQV9QQUQzLAorCVBPUlRCX1BBRDAsCisJUE9SVEJfUEFEMSwKKwlQT1JUQl9QQUQyLAorCVBPUlRCX1BBRDMsCisJUE9SVEFfSk9ZMCwKKwlQT1JUQV9KT1kxLAorCVBPUlRCX0pPWTAsCisJUE9SVEJfSk9ZMSwKKwlQT1JUQV9MUCwKKwlQT1JUQV9BTlBBRCwKKwlQT1JUQl9BTlBBRCwKKyNpZiAwCisJUEFSQV9KT1kwLAorCVBBUkFfSk9ZMSwKKyNlbmRpZgorCU1BWF9KT1lTVElDS1MKK307CisKK2VudW0geworCU1DSF9TVD0wLAorCU1DSF9TVEUsCisJTUNIX1RULAorCU1DSF9GMzAsCisJTUNIX0NMT05FLAorCU1DSF9BUkFOWU0KK307CisKKy8qCUpveXBhZCBidXR0b25zCisgKgkJUHJvY29udHJvbGxlciBub3RlOgorICoJCQlMLFIgYXJlIGNvbm5lY3RlZCB0byA0LDYKKyAqCQkJWCxZLFogYXJlIGNvbm5lY3RlZCB0byA3LDgsOQorICovCisKK2VudW0geworCUpQX1VQPTAsCUpQX0RPV04sCUpQX0xFRlQsCUpQX1JJR0hULAorCUpQX0tQTVVMVCwJSlBfS1A3LAkJSlBfS1A0LAkJSlBfS1AxLAorCUpQX0tQMCwJCUpQX0tQOCwJCUpQX0tQNSwJCUpQX0tQMiwKKwlKUF9LUE5VTSwJSlBfS1A5LAkJSlBfS1A2LAkJSlBfS1AzLAorCUpQX1BBVVNFLAlKUF9GSVJFMCwJSlBfVU5ERUYwLAlKUF9GSVJFMSwKKwlKUF9VTkRFRjEsCUpQX0ZJUkUyLAlKUF9VTkRFRjIsCUpQX09QVElPTgorfTsKKworI2RlZmluZSBKUF9OVU1fQlVUVE9OUyAxNworCisjZGVmaW5lIFBPUlRfSlNfUklHSFQJKDE8PDApCisjZGVmaW5lIFBPUlRfSlNfTEVGVAkoMTw8MSkKKyNkZWZpbmUgUE9SVF9KU19ET1dOCSgxPDwyKQorI2RlZmluZSBQT1JUX0pTX1VQCQkoMTw8MykKKyNkZWZpbmUgUE9SVF9KU19GSVJFCSgxPDw0KQorCitlbnVtIHsKKwlURUFNVEFQX01BWUJFPTAsCisJVEVBTVRBUF9ZRVMsCisJVEVBTVRBUF9OTworfTsKKworLyogVGVhbXRhcCBkZXRlY3Rpb24gdmFsdWVzICovCitzdGF0aWMgY29uc3QgVWludDMyIHRlYW10YXBfZ2hvc3RzWzIwXVs0XT17CisJezE8PEpQX1VQLAkvKiBmb3IgdGhpcyBldmVudCBvbiBqb3lwYWQgMCwgcG9ydCBYICovCisJCSgxPDxKUF9VUCl8KDE8PEpQX0tQMCksCS8qIHdlIGdldCB0aGlzIG9uIGpveXBhZCAxICovCisJCSgxPDxKUF9VUCl8KDE8PEpQX0tQTlVNKXwoMTw8SlBfS1AwKSwJLyogdGhpcyBvbiBqb3lwYWQgMiAqLworCQkoMTw8SlBfS1BNVUxUKXwoMTw8SlBfS1AwKX0sCS8qIHRoaXMgb24gam95cGFkIDMgKi8KKwl7MTw8SlBfRE9XTiwKKwkJKDE8PEpQX0RPV04pfCgxPDxKUF9LUDgpLAorCQkoMTw8SlBfRE9XTil8KDE8PEpQX0tQOSl8KDE8PEpQX0tQOCksCisJCSgxPDxKUF9LUDcpfCgxPDxKUF9LUDgpfSwKKwl7MTw8SlBfTEVGVCwKKwkJKDE8PEpQX0xFRlQpfCgxPDxKUF9LUDUpLAorCQkoMTw8SlBfTEVGVCl8KDE8PEpQX0tQNil8KDE8PEpQX0tQNSksCisJCSgxPDxKUF9LUDQpfCgxPDxKUF9LUDUpfSwKKwl7MTw8SlBfUklHSFQsCisJCSgxPDxKUF9SSUdIVCl8KDE8PEpQX0tQMiksCisJCSgxPDxKUF9SSUdIVCl8KDE8PEpQX0tQMyl8KDE8PEpQX0tQMiksCisJCSgxPDxKUF9LUDEpfCgxPDxKUF9LUDIpfSwKKwl7MTw8SlBfT1BUSU9OLAorCQkoMTw8SlBfT1BUSU9OKXwoMTw8SlBfRklSRTEpfCgxPDxKUF9GSVJFMiksCisJCSgxPDxKUF9GSVJFMCl8KDE8PEpQX0ZJUkUxKXwoMTw8SlBfRklSRTIpLAorCQkwfSwKKwl7MTw8SlBfRklSRTAsCisJCSgxPDxKUF9GSVJFMil8KDE8PEpQX0ZJUkUwKSwKKwkJKDE8PEpQX0ZJUkUwKXwoMTw8SlBfT1BUSU9OKXwoMTw8SlBfRklSRTIpLAorCQkoMTw8SlBfRklSRTEpfCgxPDxKUF9GSVJFMil9LAorCXsxPDxKUF9GSVJFMSwKKwkJKDE8PEpQX0ZJUkUwKSwKKwkJKDE8PEpQX09QVElPTil8KDE8PEpQX0ZJUkUwKXwoMTw8SlBfRklSRTEpLAorCQkoMTw8SlBfRklSRTApfCgxPDxKUF9GSVJFMil9LAorCXsxPDxKUF9GSVJFMiwKKwkJKDE8PEpQX09QVElPTil8KDE8PEpQX0ZJUkUwKXwoMTw8SlBfRklSRTEpfCgxPDxKUF9GSVJFMiksCisJCSgxPDxKUF9PUFRJT04pLAorCQkoMTw8SlBfRklSRTApfCgxPDxKUF9GSVJFMSl9LAorCXsxPDxKUF9LUDEsCisJCSgxPDxKUF9SSUdIVCl8KDE8PEpQX0tQMSksCisJCSgxPDxKUF9SSUdIVCl8KDE8PEpQX0tQMSl8KDE8PEpQX0tQMyksCisJCSgxPDxKUF9SSUdIVCl8KDE8PEpQX0tQMil9LAorCXsxPDxKUF9LUDIsCisJCSgxPDxKUF9SSUdIVCl8KDE8PEpQX0tQMSl8KDE8PEpQX0tQMil8KDE8PEpQX0tQMyksCisJCSgxPDxKUF9LUDMpLAorCQkoMTw8SlBfUklHSFQpfCgxPDxKUF9LUDEpfSwKKwl7MTw8SlBfS1AzLAorCQkoMTw8SlBfUklHSFQpfCgxPDxKUF9LUDEpfCgxPDxKUF9LUDIpfCgxPDxKUF9LUDMpLAorCQkoMTw8SlBfUklHSFQpfCgxPDxKUF9LUDEpfCgxPDxKUF9LUDIpLAorCQkwfSwKKwl7MTw8SlBfS1A0LAorCQkoMTw8SlBfTEVGVCl8KDE8PEpQX0tQNCksCisJCSgxPDxKUF9MRUZUKXwoMTw8SlBfS1A0KXwoMTw8SlBfS1A2KSwKKwkJKDE8PEpQX0xFRlQpfCgxPDxKUF9LUDUpfSwKKwl7MTw8SlBfS1A1LAorCQkoMTw8SlBfTEVGVCl8KDE8PEpQX0tQNCl8KDE8PEpQX0tQNSl8KDE8PEpQX0tQNiksCisJCSgxPDxKUF9LUDYpLAorCQkoMTw8SlBfTEVGVCl8KDE8PEpQX0tQNCl9LAorCXsxPDxKUF9LUDYsCisJCSgxPDxKUF9MRUZUKXwoMTw8SlBfS1A0KXwoMTw8SlBfS1A1KXwoMTw8SlBfS1A2KSwKKwkJKDE8PEpQX0xFRlQpfCgxPDxKUF9LUDQpfCgxPDxKUF9LUDUpLAorCQkwfSwKKwl7MTw8SlBfS1A3LAorCQkoMTw8SlBfRE9XTil8KDE8PEpQX0tQNyksCisJCSgxPDxKUF9ET1dOKXwoMTw8SlBfS1A3KXwoMTw8SlBfS1A5KSwKKwkJKDE8PEpQX0RPV04pfCgxPDxKUF9LUDgpfSwKKwl7MTw8SlBfS1A4LAorCQkoMTw8SlBfRE9XTil8KDE8PEpQX0tQNyl8KDE8PEpQX0tQOCl8KDE8PEpQX0tQOSksCisJCSgxPDxKUF9LUDkpLAorCQkoMTw8SlBfRE9XTil8KDE8PEpQX0tQNyl9LAorCXsxPDxKUF9LUDksCisJCSgxPDxKUF9ET1dOKXwoMTw8SlBfS1A3KXwoMTw8SlBfS1A4KXwoMTw8SlBfS1A5KSwKKwkJKDE8PEpQX0RPV04pfCgxPDxKUF9LUDcpfCgxPDxKUF9LUDgpLAorCQkwfSwKKwl7MTw8SlBfS1BNVUxULAorCQkoMTw8SlBfVVApfCgxPDxKUF9LUE1VTFQpLAorCQkoMTw8SlBfVVApfCgxPDxKUF9LUE5VTSksCisJCSgxPDxKUF9VUCl8KDE8PEpQX0tQMCl9LAorCXsxPDxKUF9LUDAsCisJCSgxPDxKUF9VUCl8KDE8PEpQX0tQTlVNKXwoMTw8SlBfS1BNVUxUKXwoMTw8SlBfS1AwKSwKKwkJMTw8SlBfS1BOVU0sCisJCSgxPDxKUF9VUCl8KDE8PEpQX0tQTVVMVCl9LAorCXsxPDxKUF9LUE5VTSwKKwkJKDE8PEpQX1VQKXwoMTw8SlBfS1BOVU0pfCgxPDxKUF9LUE1VTFQpfCgxPDxKUF9LUDApLAorCQkoMTw8SlBfVVApfCgxPDxKUF9LUE1VTFQpfCgxPDxKUF9LUDApLAorCQkwfSwKK307CisKKy8qLS0tIFR5cGVzIC0tLSovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlTRExfYm9vbCBlbmFibGVkOworCWNoYXIgKm5hbWU7CisJVWludDMyIHByZXZzdGF0ZTsKK30gYXRhcmlqb3lfdDsKKworLyotLS0gVmFyaWFibGVzIC0tLSovCisKK3N0YXRpYyBhdGFyaWpveV90IGF0YXJpam95c3RpY2tzW01BWF9KT1lTVElDS1NdPXsKKwl7U0RMX0ZBTFNFLCJJS0JEIGpveXN0aWNrIHBvcnQgMSIsMH0sCisJe1NETF9GQUxTRSwiWGJpb3Mgam95c3RpY2sgcG9ydCAxIiwwfSwKKwl7U0RMX0ZBTFNFLCJKb3lwYWQgMCBwb3J0IEEiLDB9LAorCXtTRExfRkFMU0UsIkpveXBhZCAxIHBvcnQgQSIsMH0sCisJe1NETF9GQUxTRSwiSm95cGFkIDIgcG9ydCBBIiwwfSwKKwl7U0RMX0ZBTFNFLCJKb3lwYWQgMyBwb3J0IEEiLDB9LAorCXtTRExfRkFMU0UsIkpveXBhZCAwIHBvcnQgQiIsMH0sCisJe1NETF9GQUxTRSwiSm95cGFkIDEgcG9ydCBCIiwwfSwKKwl7U0RMX0ZBTFNFLCJKb3lwYWQgMiBwb3J0IEIiLDB9LAorCXtTRExfRkFMU0UsIkpveXBhZCAzIHBvcnQgQiIsMH0sCisJe1NETF9GQUxTRSwiSm95c3RpY2sgMCBwb3J0IEEiLDB9LAorCXtTRExfRkFMU0UsIkpveXN0aWNrIDEgcG9ydCBBIiwwfSwKKwl7U0RMX0ZBTFNFLCJKb3lzdGljayAwIHBvcnQgQiIsMH0sCisJe1NETF9GQUxTRSwiSm95c3RpY2sgMSBwb3J0IEIiLDB9LAorCXtTRExfRkFMU0UsIkxpZ2h0cGVuIHBvcnQgQSIsMH0sCisJe1NETF9GQUxTRSwiQW5hbG9nIHBhZGRsZSBwb3J0IEEiLDB9LAorCXtTRExfRkFMU0UsIkFuYWxvZyBwYWRkbGUgcG9ydCBCIiwwfQorI2lmIDAKKwkse1NETF9GQUxTRSwiSm95c3RpY2sgMCBwYXJhbGxlbCBwb3J0IiwwfSwKKwl7U0RMX0ZBTFNFLCJKb3lzdGljayAxIHBhcmFsbGVsIHBvcnQiLDB9CisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBpbnQganBfYnV0dG9uc1tKUF9OVU1fQlVUVE9OU109eworCUpQX0ZJUkUwLAlKUF9GSVJFMSwJSlBfRklSRTIsCUpQX1BBVVNFLAorCUpQX09QVElPTiwJSlBfS1BNVUxULAlKUF9LUE5VTSwJSlBfS1AwLAorCUpQX0tQMSwJCUpQX0tQMiwJCUpQX0tQMywJCUpQX0tQNCwKKwlKUF9LUDUsCQlKUF9LUDYsCQlKUF9LUDcsCQlKUF9LUDgsCisJSlBfS1A5Cit9OworCitzdGF0aWMgU0RMX2Jvb2wgam95cGFkX3BvcnRzX2VuYWJsZWQ9U0RMX0ZBTFNFOworc3RhdGljIGludCBoYXNfdGVhbXRhcFsyXT17VEVBTVRBUF9NQVlCRSxURUFNVEFQX01BWUJFfTsKKworLyogVXBkYXRlZCBqb3lwYWQgcG9ydHMgKi8KK3N0YXRpYyBVaW50MTYganBfcGFkZGxlc1s0XTsKK3N0YXRpYyBVaW50MTYganBfbGlnaHRwZW5zWzJdOworc3RhdGljIFVpbnQxNiBqcF9kaXJlY3Rpb25zOworc3RhdGljIFVpbnQxNiBqcF9maXJlczsKK3N0YXRpYyBVaW50MzIganBfam95cGFkc1s4XTsKKworLyotLS0gRnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tKi8KKworc3RhdGljIGludCBHZXRFbmFibGVkQXRhcmlKb3lzdGljayhpbnQgaW5kZXgpOworc3RhdGljIHZvaWQgVXBkYXRlSm95cGFkcyh2b2lkKTsKKworLyotLS0gRnVuY3Rpb25zIC0tLSovCisKK2ludCBTRExfU1lTX0pveXN0aWNrSW5pdCh2b2lkKQoreworCWludCBpOworCWxvbmcgY29va2llX21jaDsKKwljb25zdCBjaGFyICplbnZyPVNETF9nZXRlbnYoIlNETF9KT1lTVElDS19BVEFSSSIpOworCQorI2RlZmluZSBURVNUX0pPWV9FTkFCTEVEKGVudixpZHN0cmluZyxudW0pIFwKKwlpZiAoU0RMX3N0cnN0cihlbnYsaWRzdHJpbmciLW9mZiIpKSB7IFwKKwkJYXRhcmlqb3lzdGlja3NbbnVtXS5lbmFibGVkPVNETF9GQUxTRTsgXAorCX0gXAorCWlmIChTRExfc3Ryc3RyKGVudixpZHN0cmluZyItb24iKSkgeyBcCisJCWF0YXJpam95c3RpY2tzW251bV0uZW5hYmxlZD1TRExfVFJVRTsgXAorCX0KKworCS8qIENvb2tpZSBfTUNIIHByZXNlbnQgPyBpZiBub3QsIGFzc3VtZSBTVCBtYWNoaW5lICovCisJaWYgKEdldGNvb2tpZShDX19NQ0gsICZjb29raWVfbWNoKSAhPSBDX0ZPVU5EKSB7CisJCWNvb2tpZV9tY2ggPSBNQ0hfU1QgPDwgMTY7CisJfQorCisJLyogRW5hYmxlIHNvbWUgZGVmYXVsdCBqb3lzdGlja3MgKi8KKwlpZiAoKGNvb2tpZV9tY2ggPT0gTUNIX1NUPDwxNikgfHwgKChjb29raWVfbWNoPj4xNikgPT0gTUNIX1NURSkgfHwKKwkgICAgKGNvb2tpZV9tY2ggPT0gTUNIX1RUPDwxNikgfHwgKGNvb2tpZV9tY2ggPT0gTUNIX0YzMDw8MTYpIHx8CisJICAgIChjb29raWVfbWNoID09IE1DSF9BUkFOWU08PDE2KSkKKwl7CisJCWF0YXJpam95c3RpY2tzW0lLQkRfSk9ZMV0uZW5hYmxlZD0oU0RMX0F0YXJpSWtiZF9lbmFibGVkIT0wKTsKKwl9CisJaWYgKChjb29raWVfbWNoID09IE1DSF9TVEU8PDE2KSB8fCAoY29va2llX21jaCA9PSBNQ0hfRjMwPDwxNikgfHwKKwkgICAgKGNvb2tpZV9tY2ggPT0gTUNIX0FSQU5ZTTw8MTYpKQorCXsKKwkJYXRhcmlqb3lzdGlja3NbUE9SVEFfUEFEMF0uZW5hYmxlZCA9IAorCQkJYXRhcmlqb3lzdGlja3NbUE9SVEFfUEFEMV0uZW5hYmxlZCA9CisJCQlhdGFyaWpveXN0aWNrc1tQT1JUQV9QQUQyXS5lbmFibGVkID0KKwkJCWF0YXJpam95c3RpY2tzW1BPUlRBX1BBRDNdLmVuYWJsZWQgPQorCQkJYXRhcmlqb3lzdGlja3NbUE9SVEJfUEFEMF0uZW5hYmxlZCA9CisJCQlhdGFyaWpveXN0aWNrc1tQT1JUQl9QQUQxXS5lbmFibGVkID0KKwkJCWF0YXJpam95c3RpY2tzW1BPUlRCX1BBRDJdLmVuYWJsZWQgPQorCQkJYXRhcmlqb3lzdGlja3NbUE9SVEJfUEFEM10uZW5hYmxlZCA9IFNETF9UUlVFOworCX0KKwlpZiAoIWF0YXJpam95c3RpY2tzW0lLQkRfSk9ZMV0uZW5hYmxlZCkgeworCQlhdGFyaWpveXN0aWNrc1tYQklPU19KT1kxXS5lbmFibGVkPShTRExfQXRhcmlYYmlvc19lbmFibGVkIT0wKTsKKwl9CisKKwkvKiBSZWFkIGVudmlyb25tZW50IGZvciBqb3lzdGlja3MgdG8gZW5hYmxlICovCisJaWYgKGVudnIpIHsKKwkJLyogSUtCRCBvbiBhbnkgQXRhcmksIG1heWJlIGNsb25lcyAqLworCQlpZiAoKGNvb2tpZV9tY2ggPT0gTUNIX1NUPDwxNikgfHwgKChjb29raWVfbWNoPj4xNikgPT0gTUNIX1NURSkgfHwKKwkJCShjb29raWVfbWNoID09IE1DSF9UVDw8MTYpIHx8IChjb29raWVfbWNoID09IE1DSF9GMzA8PDE2KSB8fAorCQkJKGNvb2tpZV9tY2ggPT0gTUNIX0FSQU5ZTTw8MTYpKSB7CisJCQlpZiAoU0RMX0F0YXJpSWtiZF9lbmFibGVkIT0wKSB7CisJCQkJVEVTVF9KT1lfRU5BQkxFRChlbnZyLCAiaWtiZC1qb3kxIiwgSUtCRF9KT1kxKTsKKwkJCX0KKwkJfQorCQkvKiBKb3lwYWRzIHBvcnRzIG9uIFNURSwgRmFsY29uIGFuZCBtYXliZSBvdGhlcnMgKi8KKwkJaWYgKChjb29raWVfbWNoID09IE1DSF9TVEU8PDE2KSB8fCAoY29va2llX21jaCA9PSBNQ0hfRjMwPDwxNikgfHwKKwkJCShjb29raWVfbWNoID09IE1DSF9BUkFOWU08PDE2KSkgeworCQkJVEVTVF9KT1lfRU5BQkxFRChlbnZyLCAicG9ydGEtcGFkIiwgUE9SVEFfUEFEMCk7CisJCQlpZiAoIWF0YXJpam95c3RpY2tzW1BPUlRBX1BBRDBdLmVuYWJsZWQpIHsKKwkJCQlURVNUX0pPWV9FTkFCTEVEKGVudnIsICJwb3J0YS1qb3kwIiwgUE9SVEFfSk9ZMCk7CisJCQkJVEVTVF9KT1lfRU5BQkxFRChlbnZyLCAicG9ydGEtam95MSIsIFBPUlRBX0pPWTEpOworCQkJCWlmICghKGF0YXJpam95c3RpY2tzW1BPUlRBX0pPWTBdLmVuYWJsZWQpICYmICEoYXRhcmlqb3lzdGlja3NbUE9SVEFfSk9ZMV0uZW5hYmxlZCkpIHsKKwkJCQkJVEVTVF9KT1lfRU5BQkxFRChlbnZyLCAicG9ydGEtbHAiLCBQT1JUQV9MUCk7CisJCQkJCWlmICghYXRhcmlqb3lzdGlja3NbUE9SVEFfTFBdLmVuYWJsZWQpIHsKKwkJCQkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgInBvcnRhLWFucGFkIiwgUE9SVEFfQU5QQUQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlURVNUX0pPWV9FTkFCTEVEKGVudnIsICJwb3J0Yi1wYWQiLCBQT1JUQl9QQUQwKTsKKwkJCWlmICghYXRhcmlqb3lzdGlja3NbUE9SVEJfUEFEMF0uZW5hYmxlZCkgeworCQkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgInBvcnRiLWpveTAiLCBQT1JUQl9KT1kwKTsKKwkJCQlURVNUX0pPWV9FTkFCTEVEKGVudnIsICJwb3J0Yi1qb3kxIiwgUE9SVEJfSk9ZMSk7CisJCQkJaWYgKCEoYXRhcmlqb3lzdGlja3NbUE9SVEJfSk9ZMF0uZW5hYmxlZCkgJiYgIShhdGFyaWpveXN0aWNrc1tQT1JUQl9KT1kxXS5lbmFibGVkKSkgeworCQkJCQlURVNUX0pPWV9FTkFCTEVEKGVudnIsICJwb3J0Yi1hbnBhZCIsIFBPUlRCX0FOUEFEKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIWF0YXJpam95c3RpY2tzW0lLQkRfSk9ZMV0uZW5hYmxlZCkgeworCQkJaWYgKFNETF9BdGFyaVhiaW9zX2VuYWJsZWQhPTApIHsKKwkJCQlURVNUX0pPWV9FTkFCTEVEKGVudnIsICJ4Ymlvcy1qb3kxIiwgWEJJT1NfSk9ZMSk7CisJCQl9CisJCX0KKyNpZiAwCisJCS8qIFBhcmFsbGVsIHBvcnQgb24gYW55IEF0YXJpLCBtYXliZSBjbG9uZXMgKi8KKwkJaWYgKChjb29raWVfbWNoID09IE1DSF9TVDw8MTYpIHx8ICgoY29va2llX21jaD4+MTYpID09IE1DSF9TVEUpIHx8CisJCQkoY29va2llX21jaCA9PSBNQ0hfVFQ8PDE2KSB8fCAoY29va2llX21jaCA9PSBNQ0hfRjMwPDwxNikpIHsKKwkJCVRFU1RfSk9ZX0VOQUJMRUQoZW52ciwgInBhcmEtam95MCIsIFBBUkFfSk9ZMCk7CisJCQlURVNUX0pPWV9FTkFCTEVEKGVudnIsICJwYXJhLWpveTEiLCBQQVJBX0pPWTEpOworCQl9CisjZW5kaWYKKwl9CisKKwkvKiBOZWVkIHRvIHVwZGF0ZSBqb3lwYWQgcG9ydHMgPyAqLworCWpveXBhZF9wb3J0c19lbmFibGVkPVNETF9GQUxTRTsKKwlmb3IgKGk9UE9SVEFfUEFEMDtpPD1QT1JUQl9BTlBBRDtpKyspIHsKKwkJaWYgKGF0YXJpam95c3RpY2tzW2ldLmVuYWJsZWQpIHsKKwkJCWpveXBhZF9wb3J0c19lbmFibGVkPVNETF9UUlVFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlTRExfbnVtam95c3RpY2tzID0gMDsKKwlmb3IgKGk9MDtpPE1BWF9KT1lTVElDS1M7aSsrKSB7CisJCWlmIChhdGFyaWpveXN0aWNrc1tpXS5lbmFibGVkKSB7CisJCQkrK1NETF9udW1qb3lzdGlja3M7CisJCX0KKwl9CisKKwlyZXR1cm4oU0RMX251bWpveXN0aWNrcyk7Cit9CisKK3N0YXRpYyBpbnQgR2V0RW5hYmxlZEF0YXJpSm95c3RpY2soaW50IGluZGV4KQoreworCWludCBpLGo7CisKKwkvKiBSZXR1cm4gdGhlIG50aCdpbmRleCcgZW5hYmxlZCBhdGFyaSBqb3lzdGljayAqLworCWo9MDsKKwlmb3IgKGk9MDtpPE1BWF9KT1lTVElDS1M7aSsrKSB7CisJCWlmICghYXRhcmlqb3lzdGlja3NbaV0uZW5hYmxlZCkgeworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaj09aW5kZXgpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJKytqOworCX0KKwlpZiAoaT09TUFYX0pPWVNUSUNLUykKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGk7Cit9CisKK2NvbnN0IGNoYXIgKlNETF9TWVNfSm95c3RpY2tOYW1lKGludCBpbmRleCkKK3sKKwlpbnQgbnVtam95c3RpY2s7CisKKwludW1qb3lzdGljaz1HZXRFbmFibGVkQXRhcmlKb3lzdGljayhpbmRleCk7CisJaWYgKG51bWpveXN0aWNrPT0tMSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4oYXRhcmlqb3lzdGlja3NbbnVtam95c3RpY2tdLm5hbWUpOworfQorCitpbnQgU0RMX1NZU19Kb3lzdGlja09wZW4oU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpbnQgbnVtam95c3RpY2s7CisJCisJbnVtam95c3RpY2s9R2V0RW5hYmxlZEF0YXJpSm95c3RpY2soam95c3RpY2stPmluZGV4KTsKKwlpZiAobnVtam95c3RpY2s9PS0xKQorCQlyZXR1cm4gLTE7CisJCisJam95c3RpY2stPm5heGVzPTA7CisJam95c3RpY2stPm5oYXRzPTA7CisJam95c3RpY2stPm5iYWxscz0wOworCisJc3dpdGNoKG51bWpveXN0aWNrKSB7CisJCWNhc2UgUE9SVEFfUEFEMDoKKwkJY2FzZSBQT1JUQV9QQUQxOgorCQljYXNlIFBPUlRBX1BBRDI6CisJCWNhc2UgUE9SVEFfUEFEMzoKKwkJY2FzZSBQT1JUQl9QQUQwOgorCQljYXNlIFBPUlRCX1BBRDE6CisJCWNhc2UgUE9SVEJfUEFEMjoKKwkJY2FzZSBQT1JUQl9QQUQzOgorCQkJam95c3RpY2stPm5oYXRzPTE7CisJCQlqb3lzdGljay0+bmJ1dHRvbnM9SlBfTlVNX0JVVFRPTlM7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUQV9MUDoKKwkJY2FzZSBQT1JUQV9BTlBBRDoKKwkJY2FzZSBQT1JUQl9BTlBBRDoKKwkJCWpveXN0aWNrLT5uYXhlcz0yOworCQkJam95c3RpY2stPm5idXR0b25zPTI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWpveXN0aWNrLT5uaGF0cz0xOworCQkJam95c3RpY2stPm5idXR0b25zPTE7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qIERldGVjdCBUZWFtdGFwIHVzaW5nIGdob3N0IGV2ZW50cyAqLworc3RhdGljIHZvaWQgZGV0ZWN0X3RlYW10YXAoaW50IG51bV9wb3J0KQoreworCWludCBpLGo7CisKKwkvKiBDaGVjayBpZiBqb3lwYWQgMSwyLDMgdHJpZ2dlcmVkIGJ1dCBub3QgMCAqLworCWZvciAoaT0xOyBpPDQ7IGkrKykgeworCQlpZiAoanBfam95cGFkc1tudW1fcG9ydCo0K2ldICYmIChqcF9qb3lwYWRzW251bV9wb3J0KjRdPT0wKSkgeworCQkJaGFzX3RlYW10YXBbbnVtX3BvcnRdID0gVEVBTVRBUF9ZRVM7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiBqb3lwYWQgMCBvbiBhIGdpdmVuIHBvcnQgdHJpZ2dlcmVkIGdob3N0IGV2ZW50cyBmb3IKKwkgKiBvdGhlciBqb3lwYWRzCisJICovCisJZm9yIChpPTA7IGk8MjA7IGkrKykgeworCQlpbnQgd2l0aF90ZWFtdGFwPTE7CisKKwkJaWYgKGpwX2pveXBhZHNbbnVtX3BvcnQqNF0hPXRlYW10YXBfZ2hvc3RzW2ldWzBdKQorCQkJY29udGludWU7CisKKwkJLyogSWYgYW55IGJ1dHRvbiBvbiBmaXJzdCBqb3lwYWQgcHJlc3NlZCwgY2hlY2sgb3RoZXIgcGFkcyAqLworCQlmb3IgKGo9MTsgajw0OyBqKyspIHsKKwkJCWlmICgoanBfam95cGFkc1tudW1fcG9ydCo0K2pdICYgdGVhbXRhcF9naG9zdHNbaV1bal0pCisJCQkgICAgPT10ZWFtdGFwX2dob3N0c1tpXVtqXSkKKwkJCXsKKwkJCQl3aXRoX3RlYW10YXAgPSAwOworCQkJfQkKKwkJfQorCisJCWhhc190ZWFtdGFwW251bV9wb3J0XSA9ICh3aXRoX3RlYW10YXAgPyBURUFNVEFQX1lFUyA6IFRFQU1UQVBfTk8pOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1VwZGF0ZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCWludCBudW1qb3lzdGljazsKKwlVaW50OCBoYXRzdGF0ZTsKKwlVaW50MzIgY3Vyc3RhdGUscHJldnN0YXRlOworCQorCW51bWpveXN0aWNrPUdldEVuYWJsZWRBdGFyaUpveXN0aWNrKGpveXN0aWNrLT5pbmRleCk7CisJaWYgKG51bWpveXN0aWNrPT0tMSkKKwkJcmV0dXJuOworCisJcHJldnN0YXRlID0gYXRhcmlqb3lzdGlja3NbbnVtam95c3RpY2tdLnByZXZzdGF0ZTsKKworCWlmIChqb3lwYWRfcG9ydHNfZW5hYmxlZCkgeworCQlTdXBleGVjKFVwZGF0ZUpveXBhZHMpOworCX0KKworCXN3aXRjaCAobnVtam95c3RpY2spIHsKKwkJY2FzZSBJS0JEX0pPWTE6CisJCWNhc2UgWEJJT1NfSk9ZMToKKwkJCXsKKwkJCQljdXJzdGF0ZSA9IDA7CisKKwkJCQlpZiAobnVtam95c3RpY2s9PUlLQkRfSk9ZMSkgeworCQkJCQljdXJzdGF0ZSA9IFNETF9BdGFyaUlrYmRfam95c3RpY2sgJiAweGZmOworCQkJCX0KKwkJCQlpZiAobnVtam95c3RpY2s9PVhCSU9TX0pPWTEpIHsKKwkJCQkJY3Vyc3RhdGUgPSBTRExfQXRhcmlYYmlvc19qb3lzdGljayAmIDB4ZmY7CisJCQkJfQorCisJCQkJaWYgKGN1cnN0YXRlICE9IHByZXZzdGF0ZSkgeworCQkJCQloYXRzdGF0ZSA9IFNETF9IQVRfQ0VOVEVSRUQ7CisJCQkJCWlmIChjdXJzdGF0ZSAmIElLQkRfSk9ZX0xFRlQpIHsKKwkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfTEVGVDsKKwkJCQkJfQorCQkJCQlpZiAoY3Vyc3RhdGUgJiBJS0JEX0pPWV9SSUdIVCkgeworCQkJCQkJaGF0c3RhdGUgfD0gU0RMX0hBVF9SSUdIVDsKKwkJCQkJfQorCQkJCQlpZiAoY3Vyc3RhdGUgJiBJS0JEX0pPWV9VUCkgeworCQkJCQkJaGF0c3RhdGUgfD0gU0RMX0hBVF9VUDsKKwkJCQkJfQorCQkJCQlpZiAoY3Vyc3RhdGUgJiBJS0JEX0pPWV9ET1dOKSB7CisJCQkJCQloYXRzdGF0ZSB8PSBTRExfSEFUX0RPV047CisJCQkJCX0KKwkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgMCwgaGF0c3RhdGUpOworCisJCQkJCS8qIEJ1dHRvbiAqLworCQkJCQlpZiAoKGN1cnN0YXRlICYgSUtCRF9KT1lfRklSRSkgJiYgIShwcmV2c3RhdGUgJiBJS0JEX0pPWV9GSVJFKSkgeworCQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywwLFNETF9QUkVTU0VEKTsKKwkJCQkJfQorCQkJCQlpZiAoIShjdXJzdGF0ZSAmIElLQkRfSk9ZX0ZJUkUpICYmIChwcmV2c3RhdGUgJiBJS0JEX0pPWV9GSVJFKSkgeworCQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywwLFNETF9SRUxFQVNFRCk7CisJCQkJCX0KKwkJCQl9CisJCQkJYXRhcmlqb3lzdGlja3NbbnVtam95c3RpY2tdLnByZXZzdGF0ZSA9IGN1cnN0YXRlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUE9SVEFfUEFEMDoKKwkJY2FzZSBQT1JUQV9QQUQxOgorCQljYXNlIFBPUlRBX1BBRDI6CisJCWNhc2UgUE9SVEFfUEFEMzoKKwkJY2FzZSBQT1JUQl9QQUQwOgorCQljYXNlIFBPUlRCX1BBRDE6CisJCWNhc2UgUE9SVEJfUEFEMjoKKwkJY2FzZSBQT1JUQl9QQUQzOgorCQkJeworCQkJCWludCBudW1qb3lwYWQsaSxudW1wb3J0OworCQkJCQorCQkJCW51bWpveXBhZCA9IG51bXBvcnQgPSAwOworCQkJCXN3aXRjaChudW1qb3lzdGljaykgeworCQkJCQljYXNlIFBPUlRBX1BBRDA6CisJCQkJCQludW1qb3lwYWQgPSAwOwlicmVhazsKKwkJCQkJY2FzZSBQT1JUQV9QQUQxOgorCQkJCQkJbnVtam95cGFkID0gMTsJYnJlYWs7CisJCQkJCWNhc2UgUE9SVEFfUEFEMjoKKwkJCQkJCW51bWpveXBhZCA9IDI7CWJyZWFrOworCQkJCQljYXNlIFBPUlRBX1BBRDM6CisJCQkJCQludW1qb3lwYWQgPSAzOwlicmVhazsKKwkJCQkJY2FzZSBQT1JUQl9QQUQwOgorCQkJCQkJbnVtam95cGFkID0gNDsJbnVtcG9ydCA9IDE7IGJyZWFrOworCQkJCQljYXNlIFBPUlRCX1BBRDE6CisJCQkJCQludW1qb3lwYWQgPSA1OwludW1wb3J0ID0gMTsgYnJlYWs7CisJCQkJCWNhc2UgUE9SVEJfUEFEMjoKKwkJCQkJCW51bWpveXBhZCA9IDY7CW51bXBvcnQgPSAxOyBicmVhazsKKwkJCQkJY2FzZSBQT1JUQl9QQUQzOgorCQkJCQkJbnVtam95cGFkID0gNzsJbnVtcG9ydCA9IDE7IGJyZWFrOworCQkJCX0JCQkJCisJCQkJCisJCQkJanBfam95cGFkc1tudW1qb3lwYWRdICY9IDB4YWJmZmZmOworCisJCQkJaWYgKGhhc190ZWFtdGFwW251bXBvcnRdPT1URUFNVEFQX01BWUJFKSB7CisJCQkJCWRldGVjdF90ZWFtdGFwKG51bXBvcnQpOworCQkJCX0KKwkJCQkvKiBObyBldmVudHMgZm9yIFBPUlRYX1BBRFsxLDIsM10gaWYgbm8gdGVhbXRhcCBkZXRlY3RlZCAqLworCQkJCWlmIChoYXNfdGVhbXRhcFtudW1wb3J0XSA9PSBURUFNVEFQX05PKSB7CisJCQkJCWlmICgobnVtam95cGFkICYgMykhPTApIHsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKworCQkJCWN1cnN0YXRlPWpwX2pveXBhZHNbbnVtam95cGFkXTsKKwkJCQlpZiAoY3Vyc3RhdGUhPXByZXZzdGF0ZSkgeworCQkJCQloYXRzdGF0ZSA9IFNETF9IQVRfQ0VOVEVSRUQ7CisJCQkJCWlmIChjdXJzdGF0ZSAmICgxPDxKUF9MRUZUKSkgeworCQkJCQkJaGF0c3RhdGUgfD0gU0RMX0hBVF9MRUZUOworCQkJCQl9CisJCQkJCWlmIChjdXJzdGF0ZSAmICgxPDxKUF9SSUdIVCkpIHsKKwkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfUklHSFQ7CisJCQkJCX0KKwkJCQkJaWYgKGN1cnN0YXRlICYgKDE8PEpQX1VQKSkgeworCQkJCQkJaGF0c3RhdGUgfD0gU0RMX0hBVF9VUDsKKwkJCQkJfQorCQkJCQlpZiAoY3Vyc3RhdGUgJiAoMTw8SlBfRE9XTikpIHsKKwkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfRE9XTjsKKwkJCQkJfQorCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrSGF0KGpveXN0aWNrLCAwLCBoYXRzdGF0ZSk7CisKKwkJCQkJLyogQnV0dG9ucyAqLworCQkJCQlmb3IgKGk9MDtpPEpQX05VTV9CVVRUT05TO2krKykgeworCQkJCQkJaW50IGJ1dHRvbjsKKwkJCQkJCQorCQkJCQkJYnV0dG9uPTE8PGpwX2J1dHRvbnNbaV07CisKKwkJCQkJCWlmICgoY3Vyc3RhdGUgJiBidXR0b24pICYmICEocHJldnN0YXRlICYgYnV0dG9uKSkgeworCQkJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssaSxTRExfUFJFU1NFRCk7CisJCQkJCQl9CisJCQkJCQlpZiAoIShjdXJzdGF0ZSAmIGJ1dHRvbikgJiYgKHByZXZzdGF0ZSAmIGJ1dHRvbikpIHsKKwkJCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLGksU0RMX1JFTEVBU0VEKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlhdGFyaWpveXN0aWNrc1tudW1qb3lzdGlja10ucHJldnN0YXRlID0gY3Vyc3RhdGU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQT1JUQV9KT1kwOgorCQljYXNlIFBPUlRBX0pPWTE6CisJCWNhc2UgUE9SVEJfSk9ZMDoKKwkJY2FzZSBQT1JUQl9KT1kxOgorCQkJeworCQkJCWludCBmaXJlX3NoaWZ0PTAsZGlyX3NoaWZ0PTA7CisJCQkJCisJCQkJaWYgKG51bWpveXN0aWNrPT1QT1JUQV9KT1kwKSB7CWZpcmVfc2hpZnQ9MDsgZGlyX3NoaWZ0PTA7IH0KKwkJCQlpZiAobnVtam95c3RpY2s9PVBPUlRBX0pPWTEpIHsJZmlyZV9zaGlmdD0xOyBkaXJfc2hpZnQ9NDsgfQorCQkJCWlmIChudW1qb3lzdGljaz09UE9SVEJfSk9ZMCkgewlmaXJlX3NoaWZ0PTI7IGRpcl9zaGlmdD04OyB9CisJCQkJaWYgKG51bWpveXN0aWNrPT1QT1JUQl9KT1kxKSB7CWZpcmVfc2hpZnQ9MzsgZGlyX3NoaWZ0PTEyOyB9CisKKwkJCQljdXJzdGF0ZSA9IChqcF9kaXJlY3Rpb25zPj5kaXJfc2hpZnQpICYgMTU7CisJCQkJY3Vyc3RhdGUgfD0gKChqcF9maXJlcz4+ZmlyZV9zaGlmdCkgJiAxKTw8NDsKKworCQkJCWlmIChjdXJzdGF0ZSAhPSBwcmV2c3RhdGUpIHsKKwkJCQkJaGF0c3RhdGUgPSBTRExfSEFUX0NFTlRFUkVEOworCQkJCQlpZiAoY3Vyc3RhdGUgJiBQT1JUX0pTX0xFRlQpIHsKKwkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfTEVGVDsKKwkJCQkJfQorCQkJCQlpZiAoY3Vyc3RhdGUgJiBQT1JUX0pTX1JJR0hUKSB7CisJCQkJCQloYXRzdGF0ZSB8PSBTRExfSEFUX1JJR0hUOworCQkJCQl9CisJCQkJCWlmIChjdXJzdGF0ZSAmIFBPUlRfSlNfVVApIHsKKwkJCQkJCWhhdHN0YXRlIHw9IFNETF9IQVRfVVA7CisJCQkJCX0KKwkJCQkJaWYgKGN1cnN0YXRlICYgUE9SVF9KU19ET1dOKSB7CisJCQkJCQloYXRzdGF0ZSB8PSBTRExfSEFUX0RPV047CisJCQkJCX0KKwkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgMCwgaGF0c3RhdGUpOworCisJCQkJCS8qIEJ1dHRvbiAqLworCQkJCQlpZiAoKGN1cnN0YXRlICYgUE9SVF9KU19GSVJFKSAmJiAhKHByZXZzdGF0ZSAmIFBPUlRfSlNfRklSRSkpIHsKKwkJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssMCxTRExfUFJFU1NFRCk7CisJCQkJCX0KKwkJCQkJaWYgKCEoY3Vyc3RhdGUgJiBQT1JUX0pTX0ZJUkUpICYmIChwcmV2c3RhdGUgJiBQT1JUX0pTX0ZJUkUpKSB7CisJCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLDAsU0RMX1JFTEVBU0VEKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlhdGFyaWpveXN0aWNrc1tudW1qb3lzdGlja10ucHJldnN0YXRlID0gY3Vyc3RhdGU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQT1JUQV9MUDoKKwkJCXsKKwkJCQlpbnQgaTsKKworCQkJCWN1cnN0YXRlID0ganBfbGlnaHRwZW5zWzBdPj4xOworCQkJCWN1cnN0YXRlIHw9IChqcF9saWdodHBlbnNbMV0+PjEpPDwxNTsKKwkJCQljdXJzdGF0ZSB8PSAoanBfZmlyZXMgJiAzKTw8MzA7CisKKwkJCQlpZiAoY3Vyc3RhdGUgIT0gcHJldnN0YXRlKSB7CisJCQkJCS8qIFggYXhpcyAqLworCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywwLGpwX2xpZ2h0cGVuc1swXSBeIDB4ODAwMCk7CisJCQkJCS8qIFkgYXhpcyAqLworCQkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywxLGpwX2xpZ2h0cGVuc1sxXSBeIDB4ODAwMCk7CisJCQkJCS8qIEJ1dHRvbnMgKi8KKwkJCQkJZm9yIChpPTA7aTwyO2krKykgeworCQkJCQkJaW50IGJ1dHRvbjsKKwkJCQkJCQorCQkJCQkJYnV0dG9uPTE8PCgzMCtpKTsKKworCQkJCQkJaWYgKChjdXJzdGF0ZSAmIGJ1dHRvbikgJiYgIShwcmV2c3RhdGUgJiBidXR0b24pKSB7CisJCQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayxpLFNETF9QUkVTU0VEKTsKKwkJCQkJCX0KKwkJCQkJCWlmICghKGN1cnN0YXRlICYgYnV0dG9uKSAmJiAocHJldnN0YXRlICYgYnV0dG9uKSkgeworCQkJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssaSxTRExfUkVMRUFTRUQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWF0YXJpam95c3RpY2tzW251bWpveXN0aWNrXS5wcmV2c3RhdGUgPSBjdXJzdGF0ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBPUlRBX0FOUEFEOgorCQljYXNlIFBPUlRCX0FOUEFEOgorCQkJeworCQkJCWludCBudW1wYWRkbGUsIGk7CisJCQkJCisJCQkJbnVtcGFkZGxlPTA8PDE7CisJCQkJaWYgKG51bWpveXN0aWNrPT1QT1JUQl9BTlBBRCkgbnVtcGFkZGxlPTE8PDE7CisKKwkJCQljdXJzdGF0ZSA9IGpwX3BhZGRsZXNbbnVtcGFkZGxlXT4+MTsKKwkJCQljdXJzdGF0ZSB8PSAoanBfcGFkZGxlc1tudW1wYWRkbGUrMV0+PjEpPDwxNTsKKwkJCQljdXJzdGF0ZSB8PSAoKGpwX2ZpcmVzPj5udW1wYWRkbGUpICYgMyk8PDMwOworCisJCQkJaWYgKGN1cnN0YXRlICE9IHByZXZzdGF0ZSkgeworCQkJCQkvKiBYIGF4aXMgKi8KKwkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssMCxqcF9wYWRkbGVzW251bXBhZGRsZV0gXiAweDgwMDApOworCQkJCQkvKiBZIGF4aXMgKi8KKwkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssMSxqcF9wYWRkbGVzW251bXBhZGRsZSsxXSBeIDB4ODAwMCk7CisJCQkJCS8qIEJ1dHRvbnMgKi8KKwkJCQkJZm9yIChpPTA7aTwyO2krKykgeworCQkJCQkJaW50IGJ1dHRvbjsKKwkJCQkJCQorCQkJCQkJYnV0dG9uPTE8PCgzMCtpKTsKKworCQkJCQkJaWYgKChjdXJzdGF0ZSAmIGJ1dHRvbikgJiYgIShwcmV2c3RhdGUgJiBidXR0b24pKSB7CisJCQkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayxpLFNETF9QUkVTU0VEKTsKKwkJCQkJCX0KKwkJCQkJCWlmICghKGN1cnN0YXRlICYgYnV0dG9uKSAmJiAocHJldnN0YXRlICYgYnV0dG9uKSkgeworCQkJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssaSxTRExfUkVMRUFTRUQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWF0YXJpam95c3RpY2tzW251bWpveXN0aWNrXS5wcmV2c3RhdGUgPSBjdXJzdGF0ZTsKKwkJCX0KKwkJCWJyZWFrOworI2lmIDAKKwkJY2FzZSBQQVJBX0pPWTA6CisJCWNhc2UgUEFSQV9KT1kxOgorCQkJYnJlYWs7CisjZW5kaWYKKwl9OworCisJcmV0dXJuOworfQorCit2b2lkIFNETF9TWVNfSm95c3RpY2tDbG9zZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCXJldHVybjsKK30KKwordm9pZCBTRExfU1lTX0pveXN0aWNrUXVpdCh2b2lkKQoreworCVNETF9udW1qb3lzdGlja3M9MDsKKwlyZXR1cm47Cit9CisKKy8qLS0tIEpveXBhZCBJL08gcmVhZC93cml0ZSBpbnRlcmZhY2UgLS0tKi8KKworI2RlZmluZSBKT1lQQURfSU9fQkFTRSAoMHhmZmZmOTIwMCkKK3N0cnVjdCBKT1lQQURfSU9fUyB7CisJVWludDE2IGZpcmVzOworCVVpbnQxNiBkaXJlY3Rpb25zOworCVVpbnQxNiBkdW1teTFbNl07CisJVWludDE2IHBhZGRsZXNbNF07CisJVWludDE2IGR1bW15Mls0XTsKKwlVaW50MTYgbGlnaHRwZW5zWzJdOworfTsKKyNkZWZpbmUgSk9ZUEFEX0lPICgoKih2b2xhdGlsZSBzdHJ1Y3QgSk9ZUEFEX0lPX1MgKilKT1lQQURfSU9fQkFTRSkpCisKK3N0YXRpYyBjb25zdCBVaW50MTYgam95cGFkX21hc2tzWzgqNF09eworCTB4ZmZmZSwgMHhmZmZkLCAweGZmZmIsIDB4ZmZmNywKKwkweGZmZjAsIDB4ZmZmMSwgMHhmZmYyLCAweGZmZjMsCisJMHhmZmY0LCAweGZmZjUsIDB4ZmZmNiwgMHhmZmY4LAorCTB4ZmZmOSwgMHhmZmZhLCAweGZmZmMsIDB4ZmZmZiwKKwkweGZmZWYsIDB4ZmZkZiwgMHhmZmJmLCAweGZmN2YsCisJMHhmZjBmLCAweGZmMWYsIDB4ZmYyZiwgMHhmZjNmLAorCTB4ZmY0ZiwgMHhmZjVmLCAweGZmNmYsIDB4ZmY4ZiwKKwkweGZmOWYsIDB4ZmZhZiwgMHhmZmNmLCAweGZmZmYKK307CisKK3N0YXRpYyB2b2lkIFVwZGF0ZUpveXBhZHModm9pZCkKK3sKKwlVaW50MTYgdG1wLCBpLCBqOworCVVpbnQzMiBjdXJfZmlyZSwgY3VyX2RpcjsKKworCS8qLS0tIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHN1cGVydmlzb3IgbW9kZSAtLS0qLworCisJLyogVXBkYXRlIGpveXN0aWNrcyAqLworCWpwX2ZpcmVzID0gKH4oSk9ZUEFEX0lPLmZpcmVzKSkgJiAxNTsKKwlqcF9kaXJlY3Rpb25zID0gKH4oSk9ZUEFEX0lPLmRpcmVjdGlvbnMpKTsKKwkKKwkvKiBVcGRhdGUgbGlnaHRwZW4gKi8KKwl0bXAgPSBKT1lQQURfSU8ubGlnaHRwZW5zWzBdICYgMTAyMzsKKwlqcF9saWdodHBlbnNbMF0gPSAodG1wPDw2KSB8ICh0bXA+PjQpOworCXRtcCA9IEpPWVBBRF9JTy5saWdodHBlbnNbMV0gJiAxMDIzOworCWpwX2xpZ2h0cGVuc1sxXSA9ICh0bXA8PDYpIHwgKHRtcD4+NCk7CisJCisJLyogVXBkYXRlIHBhZGRsZXMgKi8KKwl0bXAgPSAoSk9ZUEFEX0lPLnBhZGRsZXNbMF0gJiAyNTUpOworCWpwX3BhZGRsZXNbMF0gPSAodG1wPDw4KSB8IHRtcDsKKwl0bXAgPSAoSk9ZUEFEX0lPLnBhZGRsZXNbMV0gJiAyNTUpOworCWpwX3BhZGRsZXNbMV0gPSAodG1wPDw4KSB8IHRtcDsKKwl0bXAgPSAoSk9ZUEFEX0lPLnBhZGRsZXNbMl0gJiAyNTUpOworCWpwX3BhZGRsZXNbMl0gPSAodG1wPDw4KSB8IHRtcDsKKwl0bXAgPSAoSk9ZUEFEX0lPLnBhZGRsZXNbM10gJiAyNTUpOworCWpwX3BhZGRsZXNbM10gPSAodG1wPDw4KSB8IHRtcDsKKworCS8qIFVwZGF0ZSBqb3lwYWRzIG9uIHRlYW10YXAgcG9ydCBBICovCQorCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlqcF9qb3lwYWRzW2ldID0gMDsKKwkJZm9yIChqPTA7IGo8NDsgaisrKSB7CisJCQlKT1lQQURfSU8uZGlyZWN0aW9ucyA9IGpveXBhZF9tYXNrc1soaSo0KStqXTsKKworCQkJY3VyX2ZpcmUgPSAofihKT1lQQURfSU8uZmlyZXMpICYgMyk8PDE2OworCQkJY3VyX2RpciA9ICh+KEpPWVBBRF9JTy5kaXJlY3Rpb25zKT4+OCkgJiAxNTsKKworCQkJanBfam95cGFkc1tpXSB8PSBjdXJfZmlyZTw8KGoqMik7CisJCQlqcF9qb3lwYWRzW2ldIHw9IGN1cl9kaXI8PChqKjQpOworCQl9CisJfQorCisJLyogVXBkYXRlIGpveXBhZHMgb24gdGVhbXRhcCBwb3J0IEIgKi8JCisJZm9yIChpPTQ7IGk8ODsgaSsrKSB7CisJCWpwX2pveXBhZHNbaV0gPSAwOworCQlmb3IgKGo9MDsgajw0OyBqKyspIHsKKwkJCUpPWVBBRF9JTy5kaXJlY3Rpb25zID0gam95cGFkX21hc2tzWyhpKjQpK2pdOworCisJCQljdXJfZmlyZSA9ICh+KEpPWVBBRF9JTy5maXJlcykgJiAweGMpPDwxNDsKKwkJCWN1cl9kaXIgPSAofihKT1lQQURfSU8uZGlyZWN0aW9ucyk+PjEyKSAmIDE1OworCisJCQlqcF9qb3lwYWRzW2ldIHw9IGN1cl9maXJlPDwoaioyKTsKKwkJCWpwX2pveXBhZHNbaV0gfD0gY3VyX2Rpcjw8KGoqNCk7CisJCX0KKwl9CisKKwlKT1lQQURfSU8uZGlyZWN0aW9ucz0weGZmZmY7Cit9CisKKyNlbmRpZiAvKiBTRExfSk9ZU1RJQ0tfTUlOVCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9uZHMvU0RMX3N5c2pveXN0aWNrLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL25kcy9TRExfc3lzam95c3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjJmNDhkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9uZHMvU0RMX3N5c2pveXN0aWNrLmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaGlzIGlzIHRoZSBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZvciB0aGUgU0RMIGpveXN0aWNrIEFQSSAqLworI2luY2x1ZGUgPG5kcy5oPgorLy8jaW5jbHVkZSA8bmRzL3JlZ2lzdGVyc19hbHQuaD4KKworI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfam95c3RpY2suaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzam95c3RpY2suaCIKKyNpbmNsdWRlICIuLi9TRExfam95c3RpY2tfYy5oIgorCisjaW5jbHVkZSAiLi4vLi4vdmlkZW8vbmRzL1NETF9uZHNldmVudHNfYy5oIgorCisvKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIGpveXN0aWNrcy4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHNldCBTRExfbnVtam95c3RpY2tzIHRvIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCisgKiBqb3lzdGlja3MuICBKb3lzdGljayAwIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgam95c3RpY2suCisgKiBJdCBzaG91bGQgcmV0dXJuIDAsIG9yIC0xIG9uIGFuIHVucmVjb3ZlcmFibGUgZmF0YWwgZXJyb3IuCisgKi8KK2ludCBTRExfU1lTX0pveXN0aWNrSW5pdCh2b2lkKQoreworCVNETF9udW1qb3lzdGlja3MgPSAxOworICAgIC8va2V5c0luaXQoKTsKKworCXJldHVybigxKTsKK30KKworLyogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkZXZpY2UtZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljayAqLworY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQoreworCWlmKCFpbmRleCkKKwkJcmV0dXJuICJORFMgYnVpbHRpbiBqb3lwYWQiOworCVNETF9TZXRFcnJvcigiTm8gam95c3RpY2sgYXZhaWxhYmxlIHdpdGggdGhhdCBpbmRleCIpOworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIG9wZW4gYSBqb3lzdGljayBmb3IgdXNlLgorICAgVGhlIGpveXN0aWNrIHRvIG9wZW4gaXMgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCBmaWVsZCBvZiB0aGUgam95c3RpY2suCisgICBUaGlzIHNob3VsZCBmaWxsIHRoZSBuYnV0dG9ucyBhbmQgbmF4ZXMgZmllbGRzIG9mIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUuCisgICBJdCByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICovCitpbnQgU0RMX1NZU19Kb3lzdGlja09wZW4oU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlqb3lzdGljay0+bmJ1dHRvbnM9ODsKKwlqb3lzdGljay0+bmhhdHM9MDsKKwlqb3lzdGljay0+bmJhbGxzPTA7CisJam95c3RpY2stPm5heGVzPTI7CisJcmV0dXJuIDA7Cit9CisKKworLyogRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiBhIGpveXN0aWNrIC0gY2FsbGVkIGFzIGEgZGV2aWNlIHBvbGwuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZG4ndCB1cGRhdGUgdGhlIGpveXN0aWNrIHN0cnVjdHVyZSBkaXJlY3RseSwKKyAqIGJ1dCBpbnN0ZWFkIHNob3VsZCBjYWxsIFNETF9Qcml2YXRlSm95c3RpY2sqKCkgdG8gZGVsaXZlciBldmVudHMKKyAqIGFuZCB1cGRhdGUgam95c3RpY2sgZGV2aWNlIHN0YXRlLgorICovCisKK2ludCBwcmV2YnV0dG9uPTA7CitpbnQgcHJldmtleT0wOworCitpbnQgZGM9MDtpbnQgbGRjPTA7Cit1MzIga2V5c2Qsa2V5c3U9MDsKK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1VwZGF0ZShTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworICAgIC8vZGM9a2V5c2Q7CisJLy9pZiAoZGMpCisJLy97CisJCS8vZnByaW50ZihzdGRlcnIsImhlYXJ0YmVhdD0gJWRcbiIsUkVHX1ZDT1VOVCk7IAorCQkvL3N3aVdhaXRGb3JWQmxhbmsoKTsKKwkJLy9zY2FuS2V5cygpOworCQkvL2tleXNkID0ga2V5c0Rvd24oKTsgCisJCS8va2V5c3UgPSBrZXlzVXAoKTsKKwkJLy9sZGM9a2V5c2Q7CisJCSAKKwkvL30KKwkvKmlmIChwcmV2a2V5ICYmIHByZXZidXR0b24pCisJeworCQlzY2FuS2V5cygpOworCX0KKwkqLworCQorCS8vc2NhbktleXMoKTsKKwkJa2V5c2QgPSBrZXlzRG93bigpOyAKKwkJa2V5c3UgPSBrZXlzVXAoKTsKKwkJCisJCisJc2hvcnQgYXg9MCx2PTAsaD0wOworCWlmKChrZXlzZCZLRVlfVVApKSB7YXg9MTt2PS0xMDtTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljayxheCx2KTtwcmV2a2V5PUtFWV9VUDt9Ly9mcHJpbnRmKHN0ZGVyciwiS0VZX1VQXG4iKTt9CisJaWYoKGtleXNkJktFWV9ET1dOKSkge2F4PTE7dj0xMDtTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljayxheCx2KTtwcmV2a2V5PUtFWV9ET1dOO30vL2ZwcmludGYoc3RkZXJyLCJLRVlfRE9XTlxuIik7fQorCWlmKChrZXlzZCZLRVlfTEVGVCkpIHtheD0wO2g9LTEwO1NETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLGF4LGgpO3ByZXZrZXk9S0VZX0xFRlQ7fS8vZnByaW50ZihzdGRlcnIsIktFWV9MRUZUXG4iKTt9CisJaWYoKGtleXNkJktFWV9SSUdIVCkpIHtheD0wO2g9MTA7U0RMX1ByaXZhdGVKb3lzdGlja0F4aXMoam95c3RpY2ssYXgsaCk7cHJldmtleT1LRVlfUklHSFQ7fS8vZnByaW50ZihzdGRlcnIsIktFWV9SSUdIVFxuIik7fQorCisJaWYoKGtleXN1JktFWV9VUCkpIHtheD0xO3Y9MDtTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljayxheCx2KTtwcmV2a2V5PTA7fS8vZnByaW50ZihzdGRlcnIsIktFWV9VUFxuIik7fQorCWlmKChrZXlzdSZLRVlfRE9XTikpIHtheD0xO3Y9MDtTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljayxheCx2KTtwcmV2a2V5PTA7fS8vZnByaW50ZihzdGRlcnIsIktFWV9ET1dOXG4iKTt9CisJaWYoKGtleXN1JktFWV9MRUZUKSkge2F4PTA7aD0wO1NETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLGF4LGgpO3ByZXZrZXk9MDt9Ly9mcHJpbnRmKHN0ZGVyciwiS0VZX0xFRlRcbiIpO30KKwlpZigoa2V5c3UmS0VZX1JJR0hUKSkge2F4PTA7aD0wO1NETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLGF4LGgpO3ByZXZrZXk9MDt9Ly9mcHJpbnRmKHN0ZGVyciwiS0VZX1JJR0hUXG4iKTt9CisKKwlpZigoa2V5c2QmS0VZX0EpKQkJe1NETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssMCxTRExfUFJFU1NFRCk7cHJldmJ1dHRvbj1LRVlfQTt9CisJaWYoKGtleXNkJktFWV9CKSkJCXtTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLDEsU0RMX1BSRVNTRUQpO3ByZXZidXR0b249S0VZX0I7fQorCWlmKChrZXlzZCZLRVlfWCkpCQl7U0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywyLFNETF9QUkVTU0VEKTtwcmV2YnV0dG9uPUtFWV9YO30KKwlpZigoa2V5c2QmS0VZX1kpKQkJe1NETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssMyxTRExfUFJFU1NFRCk7cHJldmJ1dHRvbj1LRVlfWTt9CisJaWYoKGtleXNkJktFWV9TRUxFQ1QpKQl7U0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayw2LFNETF9QUkVTU0VEKTtwcmV2YnV0dG9uPUtFWV9TRUxFQ1Q7fQorCWlmKChrZXlzZCZLRVlfU1RBUlQpKQl7U0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayw3LFNETF9QUkVTU0VEKTtwcmV2YnV0dG9uPUtFWV9TVEFSVDt9CisJaWYoKGtleXNkJktFWV9MKSkJCXtTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLDQsU0RMX1BSRVNTRUQpO3ByZXZidXR0b249S0VZX0w7fQorCWlmKChrZXlzZCZLRVlfUikpCQl7U0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayw1LFNETF9QUkVTU0VEKTtwcmV2YnV0dG9uPUtFWV9SO30KKworCWlmKChrZXlzdSZLRVlfQSkpCQl7U0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywwLFNETF9SRUxFQVNFRCk7cHJldmJ1dHRvbj0wO30KKwlpZigoa2V5c3UmS0VZX0IpKQkJe1NETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssMSxTRExfUkVMRUFTRUQpO3ByZXZidXR0b249MDt9CisJaWYoKGtleXN1JktFWV9YKSkJCXtTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLDIsU0RMX1JFTEVBU0VEKTtwcmV2YnV0dG9uPTA7fQorCWlmKChrZXlzdSZLRVlfWSkpCQl7U0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywzLFNETF9SRUxFQVNFRCk7cHJldmJ1dHRvbj0wO30KKwlpZigoa2V5c3UmS0VZX1NFTEVDVCkpICB7U0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayw2LFNETF9SRUxFQVNFRCk7cHJldmJ1dHRvbj0wO30KKwlpZigoa2V5c3UmS0VZX1NUQVJUKSkJe1NETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssNyxTRExfUkVMRUFTRUQpO3ByZXZidXR0b249MDt9CisJaWYoKGtleXN1JktFWV9MKSkJCXtTRExfUHJpdmF0ZUpveXN0aWNrQnV0dG9uKGpveXN0aWNrLDQsU0RMX1JFTEVBU0VEKTtwcmV2YnV0dG9uPTA7fQorCWlmKChrZXlzdSZLRVlfUikpCQl7U0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljayw1LFNETF9SRUxFQVNFRCk7cHJldmJ1dHRvbj0wO30KKworCisKK30KKworLyogRnVuY3Rpb24gdG8gY2xvc2UgYSBqb3lzdGljayBhZnRlciB1c2UgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja0Nsb3NlKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHBlcmZvcm0gYW55IHN5c3RlbS1zcGVjaWZpYyBqb3lzdGljayByZWxhdGVkIGNsZWFudXAgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCkKK3sKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9yaXNjb3MvU0RMX3N5c2pveXN0aWNrLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL3Jpc2Nvcy9TRExfc3lzam95c3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTRkNGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9qb3lzdGljay9yaXNjb3MvU0RMX3N5c2pveXN0aWNrLmMKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0pPWVNUSUNLX1JJU0NPUworCisvKgorICAgUklTQyBPUyAtIEpveXN0aWNrIHN1cHBvcnQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgLSAxMCBBcHJpbCAyMDAzCisKKyAgIE5vdGU6IEN1cnJlbnRseSBhc3N1bWVzIGpveXN0aWNrIGlzIHByZXNlbnQgaWYgam95c3RpY2sgbW9kdWxlIGlzIGxvYWRlZAorICAgYW5kIHRoYXQgdGhlcmUgaXMgb25lIGpveXN0aWNrIHdpdGggZm91ciBidXR0b25zLgorKi8KKworLyogVGhpcyBpcyB0aGUgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmb3IgdGhlIFNETCBqb3lzdGljayBBUEkgKi8KKworI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfam95c3RpY2suaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzam95c3RpY2suaCIKKyNpbmNsdWRlICIuLi9TRExfam95c3RpY2tfYy5oIgorCisjaW5jbHVkZSAia2VybmVsLmgiCisKKyNkZWZpbmUgSk9ZU1RJQ0tfUkVBRCAweDQzRjQwCisKK3N0cnVjdCBqb3lzdGlja19od2RhdGEgCit7CisJaW50IGpveXN0YXRlOworfTsKKworCisvKiBGdW5jdGlvbiB0byBzY2FuIHRoZSBzeXN0ZW0gZm9yIGpveXN0aWNrcy4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHNldCBTRExfbnVtam95c3RpY2tzIHRvIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCisgKiBqb3lzdGlja3MuICBKb3lzdGljayAwIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgam95c3RpY2suCisgKiBJdCBzaG91bGQgcmV0dXJuIG51bWJlciBvZiBqb3lzdGlja3MsIG9yIC0xIG9uIGFuIHVucmVjb3ZlcmFibGUgZmF0YWwgZXJyb3IuCisgKi8KK2ludCBTRExfU1lTX0pveXN0aWNrSW5pdCh2b2lkKQoreworCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKworCSAvKiBUcnkgdG8gcmVhZCBqb3lzdGljayAwICovCisJcmVncy5yWzBdID0gMDsKKwlpZiAoX2tlcm5lbF9zd2koSk9ZU1RJQ0tfUkVBRCwgJnJlZ3MsICZyZWdzKSA9PSBOVUxMKQorCXsKKwkJLyogU3dpdGNoIHdvcmtzIHNvIGFzc3VtZSB3ZSd2ZSBnb3QgYSBqb3lzdGljayAqLworCQlyZXR1cm4gMTsKKwl9CisJLyogU3dpdGNoIGZhaWxzIHNvIGl0IGxvb2tzIGxpa2UgdGhlcmUncyBubyBqb3lzdGljayBoZXJlICovCisKKwlyZXR1cm4oMCk7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGdldCB0aGUgZGV2aWNlLWRlcGVuZGVudCBuYW1lIG9mIGEgam95c3RpY2sgKi8KK2NvbnN0IGNoYXIgKlNETF9TWVNfSm95c3RpY2tOYW1lKGludCBpbmRleCkKK3sKKwlpZiAoaW5kZXggPT0gMCkKKwl7CisJCXJldHVybiAiUklTQyBPUyBKb3lzdGljayAwIjsKKwl9CisKKwlTRExfU2V0RXJyb3IoIk5vIGpveXN0aWNrIGF2YWlsYWJsZSB3aXRoIHRoYXQgaW5kZXgiKTsKKwlyZXR1cm4oTlVMTCk7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIG9wZW4gYSBqb3lzdGljayBmb3IgdXNlLgorICAgVGhlIGpveXN0aWNrIHRvIG9wZW4gaXMgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCBmaWVsZCBvZiB0aGUgam95c3RpY2suCisgICBUaGlzIHNob3VsZCBmaWxsIHRoZSBuYnV0dG9ucyBhbmQgbmF4ZXMgZmllbGRzIG9mIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUuCisgICBJdCByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICovCitpbnQgU0RMX1NZU19Kb3lzdGlja09wZW4oU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisKKwlpZighKGpveXN0aWNrLT5od2RhdGE9U0RMX21hbGxvYyhzaXplb2Yoc3RydWN0IGpveXN0aWNrX2h3ZGF0YSkpKSkKKwkJcmV0dXJuIC0xOworCisJcmVncy5yWzBdID0gam95c3RpY2stPmluZGV4OworCisJLyogRG9uJ3Qga25vdyBob3cgdG8gZ2V0IGV4YWN0IGNvdW50IG9mIGJ1dHRvbnMgc28gYXNzdW1lIG1heCBvZiA0IGZvciBub3cgKi8KKwlqb3lzdGljay0+bmJ1dHRvbnM9NDsKKworCWpveXN0aWNrLT5uaGF0cz0wOworCWpveXN0aWNrLT5uYmFsbHM9MDsKKwlqb3lzdGljay0+bmF4ZXM9MjsKKwlqb3lzdGljay0+aHdkYXRhLT5qb3lzdGF0ZT0wOworCisJcmV0dXJuIDA7CisKK30KKworLyogRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiBhIGpveXN0aWNrIC0gY2FsbGVkIGFzIGEgZGV2aWNlIHBvbGwuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZG4ndCB1cGRhdGUgdGhlIGpveXN0aWNrIHN0cnVjdHVyZSBkaXJlY3RseSwKKyAqIGJ1dCBpbnN0ZWFkIHNob3VsZCBjYWxsIFNETF9Qcml2YXRlSm95c3RpY2sqKCkgdG8gZGVsaXZlciBldmVudHMKKyAqIGFuZCB1cGRhdGUgam95c3RpY2sgZGV2aWNlIHN0YXRlLgorICovCit2b2lkIFNETF9TWVNfSm95c3RpY2tVcGRhdGUoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisJcmVncy5yWzBdID0gam95c3RpY2stPmluZGV4OworCisJaWYgKF9rZXJuZWxfc3dpKEpPWVNUSUNLX1JFQUQsICZyZWdzLCAmcmVncykgPT0gTlVMTCkKKwl7CisJCWludCBuZXdzdGF0ZSA9IHJlZ3MuclswXTsKKwkJaW50IG9sZHN0YXRlID0gam95c3RpY2stPmh3ZGF0YS0+am95c3RhdGU7CisJCWlmIChuZXdzdGF0ZSAhPSBvbGRzdGF0ZSkKKwkJeworCQkJaWYgKChuZXdzdGF0ZSAmIDB4RkYpICE9IChvbGRzdGF0ZSAmIDB4RkYpKQorCQkJeworCQkJCWludCB5ID0gcmVncy5yWzBdICYgMHhGRjsKKwkJCQkvKiBDb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMgKi8KKwkJCQlpZiAoeSA+PSAxMjgpIHkgLT0gMjU2OworCQkJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLDEsLXkgKiAyNTYpOyAvKiBVcCBhbmQgZG93biBvcHBvc2l0ZSB0byByZXN1bHQgaW4gU0RMICovCisJCQl9CisJCQlpZiAoKG5ld3N0YXRlICYgMHhGRjAwKSAhPSAob2xkc3RhdGUgJiAweEZGMDApKQorCQkJeworCQkJCWludCB4ID0gKHJlZ3MuclswXSAmIDB4RkYwMCkgPj4gODsKKwkJCQlpZiAoeCA+PSAxMjgpIHggLT0gMjU2OworCQkJCVNETF9Qcml2YXRlSm95c3RpY2tBeGlzKGpveXN0aWNrLDAseCAqIDI1Nik7CisJCQl9CisKKwkJCWlmICgobmV3c3RhdGUgJiAweEZGMDAwMCkgIT0gKG9sZHN0YXRlICYgMHhGRjAwMDApKQorCQkJeworCQkJCWludCBidXR0b25zID0gKHJlZ3MuclswXSAmIDB4RkYwMDAwKSA+PiAxNjsKKwkJCQlpbnQgb2xkYnV0dG9ucyA9IChvbGRzdGF0ZSAmIDB4RkYwMDAwKSA+PiAxNjsKKwkJCQlpbnQgaTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgam95c3RpY2stPm5idXR0b25zOyBpKyspCisJCQkJeworCQkJCQlpZiAoKGJ1dHRvbnMgJiAoMTw8aSkpICE9IChvbGRidXR0b25zICYgKDE8PGkpKSkKKwkJCQkJeworCQkJCQkJaWYgKGJ1dHRvbnMgJiAoMTw8aSkpIFNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssaSxTRExfUFJFU1NFRCk7CisJCQkJCQllbHNlIFNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssaSxTRExfUkVMRUFTRUQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJam95c3RpY2stPmh3ZGF0YS0+am95c3RhdGUgPSBuZXdzdGF0ZTsKKwkJfQkJCisJfQorCisJcmV0dXJuOworfQorCisvKiBGdW5jdGlvbiB0byBjbG9zZSBhIGpveXN0aWNrIGFmdGVyIHVzZSAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrQ2xvc2UoU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpZihqb3lzdGljay0+aHdkYXRhKQorCQlTRExfZnJlZShqb3lzdGljay0+aHdkYXRhKTsKKwlyZXR1cm47Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHBlcmZvcm0gYW55IHN5c3RlbS1zcGVjaWZpYyBqb3lzdGljayByZWxhdGVkIGNsZWFudXAgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCkKK3sKKwlTRExfbnVtam95c3RpY2tzPTA7CisKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBTRExfSk9ZU1RJQ0tfUklTQ09TICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL3dpbjMyL1NETF9tbWpveXN0aWNrLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2pveXN0aWNrL3dpbjMyL1NETF9tbWpveXN0aWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1M2Y5ZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvam95c3RpY2svd2luMzIvU0RMX21tam95c3RpY2suYwpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfSk9ZU1RJQ0tfV0lOTU0KKworLyogV2luMzIgTXVsdGlNZWRpYSBKb3lzdGljayBkcml2ZXIsIGNvbnRyaWJ1dGVkIGJ5IEFuZHJlaSBkZSBBLiBGb3JtaWdhICovCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtbXN5c3RlbS5oPgorI2luY2x1ZGUgPHJlZ3N0ci5oPgorCisjaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgorI2luY2x1ZGUgIlNETF9qb3lzdGljay5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXNqb3lzdGljay5oIgorI2luY2x1ZGUgIi4uL1NETF9qb3lzdGlja19jLmgiCisKKyNkZWZpbmUgTUFYX0pPWVNUSUNLUwkxNgorI2RlZmluZSBNQVhfQVhFUwk2CS8qIGVhY2ggam95c3RpY2sgY2FuIGhhdmUgdXAgdG8gNiBheGVzICovCisjZGVmaW5lIE1BWF9CVVRUT05TCTMyCS8qIGFuZCAzMiBidXR0b25zICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFYSVNfTUlOCS0zMjc2OCAgLyogbWluaW11bSB2YWx1ZSBmb3IgYXhpcyBjb29yZGluYXRlICovCisjZGVmaW5lIEFYSVNfTUFYCTMyNzY3ICAgLyogbWF4aW11bSB2YWx1ZSBmb3IgYXhpcyBjb29yZGluYXRlICovCisvKiBsaW1pdCBheGlzIHRvIDI1NiBwb3NzaWJsZSBwb3NpdGlvbnMgdG8gZmlsdGVyIG91dCBub2lzZSAqLworI2RlZmluZSBKT1lfQVhJU19USFJFU0hPTEQgICAgICAoKChBWElTX01BWCktKEFYSVNfTUlOKSkvMjU2KQorI2RlZmluZSBKT1lfQlVUVE9OX0ZMQUcobikJKDE8PG4pCisKKworLyogYXJyYXkgdG8gaG9sZCBqb3lzdGljayBJRCB2YWx1ZXMgKi8KK3N0YXRpYyBVSU5UCVNZU19Kb3lzdGlja0lEW01BWF9KT1lTVElDS1NdOworc3RhdGljIEpPWUNBUFMJU1lTX0pveXN0aWNrW01BWF9KT1lTVElDS1NdOworc3RhdGljIGNoYXIJKlNZU19Kb3lzdGlja05hbWVbTUFYX0pPWVNUSUNLU107CisKKy8qIFRoZSBwcml2YXRlIHN0cnVjdHVyZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYSBqb3lzdGljayAqLworc3RydWN0IGpveXN0aWNrX2h3ZGF0YQoreworCS8qIGpveXN0aWNrIElEICovCisJVUlOVAlpZDsKKworCS8qIHZhbHVlcyB1c2VkIHRvIHRyYW5zbGF0ZSBkZXZpY2Utc3BlY2lmaWMgY29vcmRpbmF0ZXMgaW50bworCSAgIFNETC1zdGFuZGFyZCByYW5nZXMgKi8KKwlzdHJ1Y3QgX3RyYW5zYXhpcyB7CisJCWludCBvZmZzZXQ7CisJCWZsb2F0IHNjYWxlOworCX0gdHJhbnNheGlzWzZdOworfTsKKworLyogQ29udmVydCBhIHdpbjMyIE11bHRpbWVkaWEgQVBJIHJldHVybiBjb2RlIHRvIGEgdGV4dCBtZXNzYWdlICovCitzdGF0aWMgdm9pZCBTZXRNTWVycm9yKGNoYXIgKmZ1bmN0aW9uLCBpbnQgY29kZSk7CisKKworc3RhdGljIGNoYXIgKkdldEpveXN0aWNrTmFtZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKnN6UmVnS2V5KQoreworCS8qIGFkZGVkIDcvMjQvMjAwNCBieSBFY2toYXJkIFN0b2xiZXJnICovCisJLyoKKwkJc2VlIGlmIHRoZXJlIGlzIGEgam95c3RpY2sgZm9yIHRoZSBjdXJyZW50CisJCWluZGV4ICgxLTE2KSBsaXN0ZWQgaW4gdGhlIHJlZ2lzdHJ5CisJKi8KKwljaGFyICpuYW1lID0gTlVMTDsKKwlIS0VZIGhUb3BLZXk7CisJSEtFWSBoS2V5OworCURXT1JEIHJlZ3NpemU7CisJTE9ORyByZWdyZXN1bHQ7CisJY2hhciByZWdrZXlbMjU2XTsKKwljaGFyIHJlZ3ZhbHVlWzI1Nl07CisJY2hhciByZWduYW1lWzI1Nl07CisKKwlTRExfc25wcmludGYocmVna2V5LCBTRExfYXJyYXlzaXplKHJlZ2tleSksICIlc1xcJXNcXCVzIiwKKwkJUkVHU1RSX1BBVEhfSk9ZQ09ORklHLCBzelJlZ0tleSwgUkVHU1RSX0tFWV9KT1lDVVJSKTsKKwloVG9wS2V5ID0gSEtFWV9MT0NBTF9NQUNISU5FOworCXJlZ3Jlc3VsdCA9IFJlZ09wZW5LZXlFeEEoaFRvcEtleSwgcmVna2V5LCAwLCBLRVlfUkVBRCwgJmhLZXkpOworCWlmIChyZWdyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgeworCQloVG9wS2V5ID0gSEtFWV9DVVJSRU5UX1VTRVI7CisJCXJlZ3Jlc3VsdCA9IFJlZ09wZW5LZXlFeEEoaFRvcEtleSwgcmVna2V5LCAwLCBLRVlfUkVBRCwgJmhLZXkpOworCX0KKwlpZiAocmVncmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmluZCB0aGUgcmVnaXN0cnkga2V5IG5hbWUgZm9yIHRoZSBqb3lzdGljaydzIHByb3BlcnRpZXMgKi8KKwlyZWdzaXplID0gc2l6ZW9mKHJlZ25hbWUpOworCVNETF9zbnByaW50ZihyZWd2YWx1ZSwgU0RMX2FycmF5c2l6ZShyZWd2YWx1ZSksICJKb3lzdGljayVkJXMiLCBpbmRleCsxLCBSRUdTVFJfVkFMX0pPWU9FTU5BTUUpOworCXJlZ3Jlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgcmVndmFsdWUsIDAsIDAsIChMUEJZVEUpcmVnbmFtZSwgJnJlZ3NpemUpOworCVJlZ0Nsb3NlS2V5KGhLZXkpOworCisJaWYgKHJlZ3Jlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIG9wZW4gdGhhdCByZWdpc3RyeSBrZXkgKi8KKwlTRExfc25wcmludGYocmVna2V5LCBTRExfYXJyYXlzaXplKHJlZ2tleSksICIlc1xcJXMiLCBSRUdTVFJfUEFUSF9KT1lPRU0sIHJlZ25hbWUpOworCXJlZ3Jlc3VsdCA9IFJlZ09wZW5LZXlFeEEoaFRvcEtleSwgcmVna2V5LCAwLCBLRVlfUkVBRCwgJmhLZXkpOworCWlmIChyZWdyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBmaW5kIHRoZSBzaXplIGZvciB0aGUgT0VNIG5hbWUgdGV4dCAqLworCXJlZ3NpemUgPSBzaXplb2YocmVndmFsdWUpOworCXJlZ3Jlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgUkVHU1RSX1ZBTF9KT1lPRU1OQU1FLCAwLCAwLCBOVUxMLCAmcmVnc2l6ZSk7CisJaWYgKHJlZ3Jlc3VsdCA9PSBFUlJPUl9TVUNDRVNTKSB7CisJCS8qIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBPRU0gbmFtZSB0ZXh0IC4uLiAqLworCQluYW1lID0gKGNoYXIgKikgU0RMX21hbGxvYyhyZWdzaXplKTsKKwkJaWYgKCBuYW1lICkgeworCQkJLyogLi4uIGFuZCByZWFkIGl0IGZyb20gdGhlIHJlZ2lzdHJ5ICovCisJCQlyZWdyZXN1bHQgPSBSZWdRdWVyeVZhbHVlRXhBKGhLZXksCisJCQkJUkVHU1RSX1ZBTF9KT1lPRU1OQU1FLCAwLCAwLAorCQkJCShMUEJZVEUpIG5hbWUsICZyZWdzaXplKTsKKwkJfQorCX0KKwlSZWdDbG9zZUtleShoS2V5KTsKKworCXJldHVybihuYW1lKTsKK30KKworLyogRnVuY3Rpb24gdG8gc2NhbiB0aGUgc3lzdGVtIGZvciBqb3lzdGlja3MuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzZXQgU0RMX251bWpveXN0aWNrcyB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQorICogam95c3RpY2tzLiAgSm95c3RpY2sgMCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IGpveXN0aWNrLgorICogSXQgc2hvdWxkIHJldHVybiAwLCBvciAtMSBvbiBhbiB1bnJlY292ZXJhYmxlIGZhdGFsIGVycm9yLgorICovCitpbnQgU0RMX1NZU19Kb3lzdGlja0luaXQodm9pZCkKK3sKKwlpbnQJaTsKKwlpbnQgbWF4ZGV2czsKKwlpbnQgbnVtZGV2czsKKwlKT1lJTkZPRVggam95aW5mbzsKKwlKT1lDQVBTCWpveWNhcHM7CisJTU1SRVNVTFQgcmVzdWx0OworCisJLyogUmVzZXQgdGhlIGpveXN0aWNrIElEICYgbmFtZSBtYXBwaW5nIHRhYmxlcyAqLworCWZvciAoIGkgPSAwOyBpIDwgTUFYX0pPWVNUSUNLUzsgKytpICkgeworCQlTWVNfSm95c3RpY2tJRFtpXSA9IDA7CisJCVNZU19Kb3lzdGlja05hbWVbaV0gPSBOVUxMOworCX0KKworCS8qIExvb3Agb3ZlciBhbGwgcG90ZW50aWFsIGpveXN0aWNrIGRldmljZXMgKi8KKwludW1kZXZzID0gMDsKKwltYXhkZXZzID0gam95R2V0TnVtRGV2cygpOworCWZvciAoIGkgPSBKT1lTVElDS0lEMTsgaSA8IG1heGRldnMgJiYgbnVtZGV2cyA8IE1BWF9KT1lTVElDS1M7ICsraSApIHsKKwkJCisJCWpveWluZm8uZHdTaXplID0gc2l6ZW9mKGpveWluZm8pOworCQlqb3lpbmZvLmR3RmxhZ3MgPSBKT1lfUkVUVVJOQUxMOworCQlyZXN1bHQgPSBqb3lHZXRQb3NFeChpLCAmam95aW5mbyk7CisJCWlmICggcmVzdWx0ID09IEpPWUVSUl9OT0VSUk9SICkgeworCQkJcmVzdWx0ID0gam95R2V0RGV2Q2FwcyhpLCAmam95Y2Fwcywgc2l6ZW9mKGpveWNhcHMpKTsKKwkJCWlmICggcmVzdWx0ID09IEpPWUVSUl9OT0VSUk9SICkgeworCQkJCVNZU19Kb3lzdGlja0lEW251bWRldnNdID0gaTsKKwkJCQlTWVNfSm95c3RpY2tbbnVtZGV2c10gPSBqb3ljYXBzOworCQkJCVNZU19Kb3lzdGlja05hbWVbbnVtZGV2c10gPSBHZXRKb3lzdGlja05hbWUoaSwgam95Y2Fwcy5zelJlZ0tleSk7CisJCQkJbnVtZGV2cysrOworCQkJfQorCQl9CisJfQorCXJldHVybihudW1kZXZzKTsKK30KKworLyogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkZXZpY2UtZGVwZW5kZW50IG5hbWUgb2YgYSBqb3lzdGljayAqLworY29uc3QgY2hhciAqU0RMX1NZU19Kb3lzdGlja05hbWUoaW50IGluZGV4KQoreworCWlmICggU1lTX0pveXN0aWNrTmFtZVtpbmRleF0gIT0gTlVMTCApIHsKKwkJcmV0dXJuKFNZU19Kb3lzdGlja05hbWVbaW5kZXhdKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oU1lTX0pveXN0aWNrW2luZGV4XS5zelBuYW1lKTsKKwl9Cit9CisKKy8qIEZ1bmN0aW9uIHRvIG9wZW4gYSBqb3lzdGljayBmb3IgdXNlLgorICAgVGhlIGpveXN0aWNrIHRvIG9wZW4gaXMgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCBmaWVsZCBvZiB0aGUgam95c3RpY2suCisgICBUaGlzIHNob3VsZCBmaWxsIHRoZSBuYnV0dG9ucyBhbmQgbmF4ZXMgZmllbGRzIG9mIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUuCisgICBJdCByZXR1cm5zIDAsIG9yIC0xIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICovCitpbnQgU0RMX1NZU19Kb3lzdGlja09wZW4oU0RMX0pveXN0aWNrICpqb3lzdGljaykKK3sKKwlpbnQgaW5kZXgsIGk7CisJaW50IGNhcHNfZmxhZ3NbTUFYX0FYRVMtMl0gPQorCQl7IEpPWUNBUFNfSEFTWiwgSk9ZQ0FQU19IQVNSLCBKT1lDQVBTX0hBU1UsIEpPWUNBUFNfSEFTViB9OworCWludCBheGlzX21pbltNQVhfQVhFU10sIGF4aXNfbWF4W01BWF9BWEVTXTsKKworCisJLyogc2hvcnRjdXQgKi8KKwlpbmRleCA9IGpveXN0aWNrLT5pbmRleDsKKwlheGlzX21pblswXSA9IFNZU19Kb3lzdGlja1tpbmRleF0ud1htaW47CisJYXhpc19tYXhbMF0gPSBTWVNfSm95c3RpY2tbaW5kZXhdLndYbWF4OworCWF4aXNfbWluWzFdID0gU1lTX0pveXN0aWNrW2luZGV4XS53WW1pbjsKKwlheGlzX21heFsxXSA9IFNZU19Kb3lzdGlja1tpbmRleF0ud1ltYXg7CisJYXhpc19taW5bMl0gPSBTWVNfSm95c3RpY2tbaW5kZXhdLndabWluOworCWF4aXNfbWF4WzJdID0gU1lTX0pveXN0aWNrW2luZGV4XS53Wm1heDsKKwlheGlzX21pblszXSA9IFNZU19Kb3lzdGlja1tpbmRleF0ud1JtaW47CisJYXhpc19tYXhbM10gPSBTWVNfSm95c3RpY2tbaW5kZXhdLndSbWF4OworCWF4aXNfbWluWzRdID0gU1lTX0pveXN0aWNrW2luZGV4XS53VW1pbjsKKwlheGlzX21heFs0XSA9IFNZU19Kb3lzdGlja1tpbmRleF0ud1VtYXg7CisJYXhpc19taW5bNV0gPSBTWVNfSm95c3RpY2tbaW5kZXhdLndWbWluOworCWF4aXNfbWF4WzVdID0gU1lTX0pveXN0aWNrW2luZGV4XS53Vm1heDsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3lzdGVtIHNwZWNpZmljIGhhcmR3YXJlIGRhdGEgKi8KKwlqb3lzdGljay0+aHdkYXRhID0gKHN0cnVjdCBqb3lzdGlja19od2RhdGEgKikgU0RMX21hbGxvYyhzaXplb2YoKmpveXN0aWNrLT5od2RhdGEpKTsKKwlpZiAoam95c3RpY2stPmh3ZGF0YSA9PSBOVUxMKQorCXsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tZW1zZXQoam95c3RpY2stPmh3ZGF0YSwgMCwgc2l6ZW9mKCpqb3lzdGljay0+aHdkYXRhKSk7CisKKwkvKiBzZXQgaGFyZHdhcmUgZGF0YSAqLworCWpveXN0aWNrLT5od2RhdGEtPmlkID0gU1lTX0pveXN0aWNrSURbaW5kZXhdOworCWZvciAoIGkgPSAwOyBpIDwgTUFYX0FYRVM7ICsraSApIHsKKwkJaWYgKCAoaTwyKSB8fCAoU1lTX0pveXN0aWNrW2luZGV4XS53Q2FwcyAmIGNhcHNfZmxhZ3NbaS0yXSkgKSB7CisJCQlqb3lzdGljay0+aHdkYXRhLT50cmFuc2F4aXNbaV0ub2Zmc2V0ID0KKwkJCQlBWElTX01JTiAtIGF4aXNfbWluW2ldOworCQkJam95c3RpY2stPmh3ZGF0YS0+dHJhbnNheGlzW2ldLnNjYWxlID0KKwkJCQkoZmxvYXQpKEFYSVNfTUFYIC0gQVhJU19NSU4pIC8gKGF4aXNfbWF4W2ldIC0gYXhpc19taW5baV0pOworCQl9IGVsc2UgeworCQkJam95c3RpY2stPmh3ZGF0YS0+dHJhbnNheGlzW2ldLm9mZnNldCA9IDA7CisJCQlqb3lzdGljay0+aHdkYXRhLT50cmFuc2F4aXNbaV0uc2NhbGUgPSAxLjA7IC8qIEp1c3QgaW4gY2FzZSAqLworCQl9CisJfQorCisJLyogZmlsbCBuYnV0dG9ucywgbmF4ZXMsIGFuZCBuaGF0cyBmaWVsZHMgKi8KKwlqb3lzdGljay0+bmJ1dHRvbnMgPSBTWVNfSm95c3RpY2tbaW5kZXhdLndOdW1CdXR0b25zOworCWpveXN0aWNrLT5uYXhlcyA9IFNZU19Kb3lzdGlja1tpbmRleF0ud051bUF4ZXM7CisJaWYgKCBTWVNfSm95c3RpY2tbaW5kZXhdLndDYXBzICYgSk9ZQ0FQU19IQVNQT1YgKSB7CisJCWpveXN0aWNrLT5uaGF0cyA9IDE7CisJfSBlbHNlIHsKKwkJam95c3RpY2stPm5oYXRzID0gMDsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgVWludDggVHJhbnNsYXRlUE9WKERXT1JEIHZhbHVlKQoreworCVVpbnQ4IHBvczsKKworCXBvcyA9IFNETF9IQVRfQ0VOVEVSRUQ7CisJaWYgKCB2YWx1ZSAhPSBKT1lfUE9WQ0VOVEVSRUQgKSB7CisJCWlmICggKHZhbHVlID4gSk9ZX1BPVkxFRlQpIHx8ICh2YWx1ZSA8IEpPWV9QT1ZSSUdIVCkgKSB7CisJCQlwb3MgfD0gU0RMX0hBVF9VUDsKKwkJfQorCQlpZiAoICh2YWx1ZSA+IEpPWV9QT1ZGT1JXQVJEKSAmJiAodmFsdWUgPCBKT1lfUE9WQkFDS1dBUkQpICkgeworCQkJcG9zIHw9IFNETF9IQVRfUklHSFQ7CisJCX0KKwkJaWYgKCAodmFsdWUgPiBKT1lfUE9WUklHSFQpICYmICh2YWx1ZSA8IEpPWV9QT1ZMRUZUKSApIHsKKwkJCXBvcyB8PSBTRExfSEFUX0RPV047CisJCX0KKwkJaWYgKCB2YWx1ZSA+IEpPWV9QT1ZCQUNLV0FSRCApIHsKKwkJCXBvcyB8PSBTRExfSEFUX0xFRlQ7CisJCX0KKwl9CisJcmV0dXJuKHBvcyk7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBqb3lzdGljayAtIGNhbGxlZCBhcyBhIGRldmljZSBwb2xsLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgdXBkYXRlIHRoZSBqb3lzdGljayBzdHJ1Y3R1cmUgZGlyZWN0bHksCisgKiBidXQgaW5zdGVhZCBzaG91bGQgY2FsbCBTRExfUHJpdmF0ZUpveXN0aWNrKigpIHRvIGRlbGl2ZXIgZXZlbnRzCisgKiBhbmQgdXBkYXRlIGpveXN0aWNrIGRldmljZSBzdGF0ZS4KKyAqLwordm9pZCBTRExfU1lTX0pveXN0aWNrVXBkYXRlKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7CisJTU1SRVNVTFQgcmVzdWx0OworCWludCBpOworCURXT1JEIGZsYWdzW01BWF9BWEVTXSA9IHsgSk9ZX1JFVFVSTlgsIEpPWV9SRVRVUk5ZLCBKT1lfUkVUVVJOWiwgCisJCQkJICBKT1lfUkVUVVJOUiwgSk9ZX1JFVFVSTlUsIEpPWV9SRVRVUk5WIH07CisJRFdPUkQgcG9zW01BWF9BWEVTXTsKKwlzdHJ1Y3QgX3RyYW5zYXhpcyAqdHJhbnNheGlzOworCWludCB2YWx1ZSwgY2hhbmdlOworCUpPWUlORk9FWCBqb3lpbmZvOworCisJam95aW5mby5kd1NpemUgPSBzaXplb2Yoam95aW5mbyk7CisJam95aW5mby5kd0ZsYWdzID0gSk9ZX1JFVFVSTkFMTHxKT1lfUkVUVVJOUE9WQ1RTOworCWlmICggISBqb3lzdGljay0+aGF0cyApIHsKKwkJam95aW5mby5kd0ZsYWdzICY9IH4oSk9ZX1JFVFVSTlBPVnxKT1lfUkVUVVJOUE9WQ1RTKTsKKwl9CisJcmVzdWx0ID0gam95R2V0UG9zRXgoam95c3RpY2stPmh3ZGF0YS0+aWQsICZqb3lpbmZvKTsKKwlpZiAoIHJlc3VsdCAhPSBKT1lFUlJfTk9FUlJPUiApIHsKKwkJU2V0TU1lcnJvcigiam95R2V0UG9zRXgiLCByZXN1bHQpOworCQlyZXR1cm47CisJfQorCisJLyogam95c3RpY2sgbW90aW9uIGV2ZW50cyAqLworCXBvc1swXSA9IGpveWluZm8uZHdYcG9zOworCXBvc1sxXSA9IGpveWluZm8uZHdZcG9zOworCXBvc1syXSA9IGpveWluZm8uZHdacG9zOworCXBvc1szXSA9IGpveWluZm8uZHdScG9zOworCXBvc1s0XSA9IGpveWluZm8uZHdVcG9zOworCXBvc1s1XSA9IGpveWluZm8uZHdWcG9zOworCisJdHJhbnNheGlzID0gam95c3RpY2stPmh3ZGF0YS0+dHJhbnNheGlzOworCWZvciAoaSA9IDA7IGkgPCBqb3lzdGljay0+bmF4ZXM7IGkrKykgeworCQlpZiAoam95aW5mby5kd0ZsYWdzICYgZmxhZ3NbaV0pIHsKKwkJCXZhbHVlID0gKGludCkoKChmbG9hdClwb3NbaV0gKyB0cmFuc2F4aXNbaV0ub2Zmc2V0KSAqIHRyYW5zYXhpc1tpXS5zY2FsZSk7CisJCQljaGFuZ2UgPSAodmFsdWUgLSBqb3lzdGljay0+YXhlc1tpXSk7CisJCQlpZiAoIChjaGFuZ2UgPCAtSk9ZX0FYSVNfVEhSRVNIT0xEKSB8fCAoY2hhbmdlID4gSk9ZX0FYSVNfVEhSRVNIT0xEKSApIHsKKwkJCQlTRExfUHJpdmF0ZUpveXN0aWNrQXhpcyhqb3lzdGljaywgKFVpbnQ4KWksIChTaW50MTYpdmFsdWUpOworCQkJfQorCQl9CisJfQorCisJLyogam95c3RpY2sgYnV0dG9uIGV2ZW50cyAqLworCWlmICggam95aW5mby5kd0ZsYWdzICYgSk9ZX1JFVFVSTkJVVFRPTlMgKSB7CisJCWZvciAoIGkgPSAwOyBpIDwgam95c3RpY2stPm5idXR0b25zOyArK2kgKSB7CisJCQlpZiAoIGpveWluZm8uZHdCdXR0b25zICYgSk9ZX0JVVFRPTl9GTEFHKGkpICkgeworCQkJCWlmICggISBqb3lzdGljay0+YnV0dG9uc1tpXSApIHsKKwkJCQkJU0RMX1ByaXZhdGVKb3lzdGlja0J1dHRvbihqb3lzdGljaywgKFVpbnQ4KWksIFNETF9QUkVTU0VEKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICggam95c3RpY2stPmJ1dHRvbnNbaV0gKSB7CisJCQkJCVNETF9Qcml2YXRlSm95c3RpY2tCdXR0b24oam95c3RpY2ssIChVaW50OClpLCBTRExfUkVMRUFTRUQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIGpveXN0aWNrIGhhdCBldmVudHMgKi8KKwlpZiAoIGpveWluZm8uZHdGbGFncyAmIEpPWV9SRVRVUk5QT1YgKSB7CisJCVVpbnQ4IHBvczsKKworCQlwb3MgPSBUcmFuc2xhdGVQT1Yoam95aW5mby5kd1BPVik7CisJCWlmICggcG9zICE9IGpveXN0aWNrLT5oYXRzWzBdICkgeworCQkJU0RMX1ByaXZhdGVKb3lzdGlja0hhdChqb3lzdGljaywgMCwgcG9zKTsKKwkJfQorCX0KK30KKworLyogRnVuY3Rpb24gdG8gY2xvc2UgYSBqb3lzdGljayBhZnRlciB1c2UgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja0Nsb3NlKFNETF9Kb3lzdGljayAqam95c3RpY2spCit7CisJaWYgKGpveXN0aWNrLT5od2RhdGEgIT0gTlVMTCkgeworCQkvKiBmcmVlIHN5c3RlbSBzcGVjaWZpYyBoYXJkd2FyZSBkYXRhICovCisJCVNETF9mcmVlKGpveXN0aWNrLT5od2RhdGEpOworCQlqb3lzdGljay0+aHdkYXRhID0gTlVMTDsKKwl9Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHBlcmZvcm0gYW55IHN5c3RlbS1zcGVjaWZpYyBqb3lzdGljayByZWxhdGVkIGNsZWFudXAgKi8KK3ZvaWQgU0RMX1NZU19Kb3lzdGlja1F1aXQodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0pPWVNUSUNLUzsgaSsrKSB7CisJCWlmICggU1lTX0pveXN0aWNrTmFtZVtpXSAhPSBOVUxMICkgeworCQkJU0RMX2ZyZWUoU1lTX0pveXN0aWNrTmFtZVtpXSk7CisJCQlTWVNfSm95c3RpY2tOYW1lW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworCisvKiBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMgKi8KK3ZvaWQgU2V0TU1lcnJvcihjaGFyICpmdW5jdGlvbiwgaW50IGNvZGUpCit7CisJc3RhdGljIGNoYXIgKmVycm9yOworCXN0YXRpYyBjaGFyICBlcnJidWZbMTAyNF07CisKKwllcnJidWZbMF0gPSAwOworCXN3aXRjaCAoY29kZSkgCisJeworCQljYXNlIE1NU1lTRVJSX05PRFJJVkVSOgorCQkJZXJyb3IgPSAiSm95c3RpY2sgZHJpdmVyIG5vdCBwcmVzZW50IjsKKwkJYnJlYWs7CisKKwkJY2FzZSBNTVNZU0VSUl9JTlZBTFBBUkFNOgorCQljYXNlIEpPWUVSUl9QQVJNUzoKKwkJCWVycm9yID0gIkludmFsaWQgcGFyYW1ldGVyKHMpIjsKKwkJYnJlYWs7CisJCQorCQljYXNlIE1NU1lTRVJSX0JBRERFVklDRUlEOgorCQkJZXJyb3IgPSAiQmFkIGRldmljZSBJRCI7CisJCWJyZWFrOworCisJCWNhc2UgSk9ZRVJSX1VOUExVR0dFRDoKKwkJCWVycm9yID0gIkpveXN0aWNrIG5vdCBhdHRhY2hlZCI7CisJCWJyZWFrOworCisJCWNhc2UgSk9ZRVJSX05PQ0FORE86CisJCQllcnJvciA9ICJDYW4ndCBjYXB0dXJlIGpveXN0aWNrIGlucHV0IjsKKwkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNETF9zbnByaW50ZihlcnJidWYsIFNETF9hcnJheXNpemUoZXJyYnVmKSwKKwkJCSAgICAgICAgICIlczogVW5rbm93biBNdWx0aW1lZGlhIHN5c3RlbSBlcnJvcjogMHgleCIsCisJCQkJCQkJCWZ1bmN0aW9uLCBjb2RlKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCAhIGVycmJ1ZlswXSApIHsKKwkJU0RMX3NucHJpbnRmKGVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLCAiJXM6ICVzIiwgZnVuY3Rpb24sIGVycm9yKTsKKwl9CisJU0RMX1NldEVycm9yKCIlcyIsIGVycmJ1Zik7Cit9CisKKyNlbmRpZiAvKiBTRExfSk9ZU1RJQ0tfV0lOTU0gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbG9hZHNvL2Jlb3MvU0RMX3N5c2xvYWRzby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9sb2Fkc28vYmVvcy9TRExfc3lzbG9hZHNvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyNjdiNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbG9hZHNvL2Jlb3MvU0RMX3N5c2xvYWRzby5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0xPQURTT19CRU9TCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKy8qIFN5c3RlbSBkZXBlbmRlbnQgbGlicmFyeSBsb2FkaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YmUva2VybmVsL2ltYWdlLmg+CisKKyNpbmNsdWRlICJTRExfbG9hZHNvLmgiCisKK3ZvaWQgKgorU0RMX0xvYWRPYmplY3QoY29uc3QgY2hhciAqc29maWxlKQoreworICAgIHZvaWQgKmhhbmRsZSA9IE5VTEw7CisgICAgaW1hZ2VfaWQgbGlicmFyeV9pZCA9IGxvYWRfYWRkX29uKHNvZmlsZSk7CisgICAgaWYgKGxpYnJhcnlfaWQgPCAwKSB7CisgICAgICAgIFNETF9TZXRFcnJvcihzdHJlcnJvcigoaW50KSBsaWJyYXJ5X2lkKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGFuZGxlID0gKHZvaWQgKikgKGxpYnJhcnlfaWQpOworICAgIH0KKyAgICByZXR1cm4gKGhhbmRsZSk7Cit9CisKK3ZvaWQgKgorU0RMX0xvYWRGdW5jdGlvbih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgdm9pZCAqc3ltID0gTlVMTDsKKyAgICBpbWFnZV9pZCBsaWJyYXJ5X2lkID0gKGltYWdlX2lkKSBoYW5kbGU7CisgICAgc3RhdHVzX3QgcmMgPSBnZXRfaW1hZ2Vfc3ltYm9sKGxpYnJhcnlfaWQsIG5hbWUsIEJfU1lNQk9MX1RZUEVfVEVYVCwgJnN5bSk7CisgICAgaWYgKHJjICE9IEJfTk9fRVJST1IpIHsKKyAgICAgICAgU0RMX1NldEVycm9yKHN0cmVycm9yKHJjKSk7CisgICAgfQorICAgIHJldHVybiAoc3ltKTsKK30KKwordm9pZAorU0RMX1VubG9hZE9iamVjdCh2b2lkICpoYW5kbGUpCit7CisgICAgaW1hZ2VfaWQgbGlicmFyeV9pZDsKKyAgICBpZiAoaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbGlicmFyeV9pZCA9IChpbWFnZV9pZCkgaGFuZGxlOworICAgICAgICB1bmxvYWRfYWRkX29uKGxpYnJhcnlfaWQpOworICAgIH0KK30KKworI2VuZGlmIC8qIFNETF9MT0FEU09fQkVPUyAqLworCisvKiB2aTogc2V0IHRzPTQgc3c9NCBleHBhbmR0YWI6ICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbG9hZHNvL2Rsb3Blbi9TRExfc3lzbG9hZHNvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2xvYWRzby9kbG9wZW4vU0RMX3N5c2xvYWRzby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODVlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2xvYWRzby9kbG9wZW4vU0RMX3N5c2xvYWRzby5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0xPQURTT19ETE9QRU4KKworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLworLyogU3lzdGVtIGRlcGVuZGVudCBsaWJyYXJ5IGxvYWRpbmcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0RMX2xvYWRzby5oIgorCit2b2lkICpTRExfTG9hZE9iamVjdChjb25zdCBjaGFyICpzb2ZpbGUpCit7CisJdm9pZCAqaGFuZGxlID0gZGxvcGVuKHNvZmlsZSwgUlRMRF9OT1cpOworCWNvbnN0IGNoYXIgKmxvYWRlcnJvciA9IChjaGFyICopZGxlcnJvcigpOworCWlmICggaGFuZGxlID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiRmFpbGVkIGxvYWRpbmcgJXM6ICVzIiwgc29maWxlLCBsb2FkZXJyb3IpOworCX0KKwlyZXR1cm4oaGFuZGxlKTsKK30KKwordm9pZCAqU0RMX0xvYWRGdW5jdGlvbih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdm9pZCAqc3ltYm9sID0gZGxzeW0oaGFuZGxlLCBuYW1lKTsKKwlpZiAoIHN5bWJvbCA9PSBOVUxMICkgeworCQkvKiBhcHBlbmQgYW4gdW5kZXJzY29yZSBmb3IgcGxhdGZvcm1zIHRoYXQgbmVlZCB0aGF0LiAqLworCQlzaXplX3QgbGVuID0gMStTRExfc3RybGVuKG5hbWUpKzE7CisJCWNoYXIgKl9uYW1lID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIGxlbik7CisJCV9uYW1lWzBdID0gJ18nOworCQlTRExfc3RybGNweSgmX25hbWVbMV0sIG5hbWUsIGxlbik7CisJCXN5bWJvbCA9IGRsc3ltKGhhbmRsZSwgX25hbWUpOworCQlTRExfc3RhY2tfZnJlZShfbmFtZSk7CisJCWlmICggc3ltYm9sID09IE5VTEwgKSB7CisJCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIG5hbWUsIChjb25zdCBjaGFyICopZGxlcnJvcigpKTsKKwkJfQorCX0KKwlyZXR1cm4oc3ltYm9sKTsKK30KKwordm9pZCBTRExfVW5sb2FkT2JqZWN0KHZvaWQgKmhhbmRsZSkKK3sKKwlpZiAoIGhhbmRsZSAhPSBOVUxMICkgeworCQlkbGNsb3NlKGhhbmRsZSk7CisJfQorfQorCisjZW5kaWYgLyogU0RMX0xPQURTT19ETE9QRU4gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbG9hZHNvL2R1bW15L1NETF9zeXNsb2Fkc28uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbG9hZHNvL2R1bW15L1NETF9zeXNsb2Fkc28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGM5YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9sb2Fkc28vZHVtbXkvU0RMX3N5c2xvYWRzby5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChTRExfTE9BRFNPX0RVTU1ZKSB8fCBkZWZpbmVkKFNETF9MT0FEU09fRElTQUJMRUQpCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKy8qIFN5c3RlbSBkZXBlbmRlbnQgbGlicmFyeSBsb2FkaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2luY2x1ZGUgIlNETF9sb2Fkc28uaCIKKwordm9pZCAqU0RMX0xvYWRPYmplY3QoY29uc3QgY2hhciAqc29maWxlKQoreworCWNvbnN0IGNoYXIgKmxvYWRlcnJvciA9ICJTRExfTG9hZE9iamVjdCgpIG5vdCBpbXBsZW1lbnRlZCI7CisJU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBzb2ZpbGUsIGxvYWRlcnJvcik7CisJcmV0dXJuKE5VTEwpOworfQorCit2b2lkICpTRExfTG9hZEZ1bmN0aW9uKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBjaGFyICpsb2FkZXJyb3IgPSAiU0RMX0xvYWRGdW5jdGlvbigpIG5vdCBpbXBsZW1lbnRlZCI7CisJU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlczogJXMiLCBuYW1lLCBsb2FkZXJyb3IpOworCXJldHVybihOVUxMKTsKK30KKwordm9pZCBTRExfVW5sb2FkT2JqZWN0KHZvaWQgKmhhbmRsZSkKK3sKKyAgICAvKiBuby1vcC4gKi8KK30KKworI2VuZGlmIC8qIFNETF9MT0FEU09fRFVNTVkgfHwgU0RMX0xPQURTT19ESVNBQkxFRCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9sb2Fkc28vbWFjb3MvU0RMX3N5c2xvYWRzby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9sb2Fkc28vbWFjb3MvU0RMX3N5c2xvYWRzby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzViMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2xvYWRzby9tYWNvcy9TRExfc3lzbG9hZHNvLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX0xPQURTT19NQUNPUworCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisvKiBTeXN0ZW0gZGVwZW5kZW50IGxpYnJhcnkgbG9hZGluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2RlZmluZSBPTERQMkMgMQorI2luY2x1ZGUgPFN0cmluZ3MuaD4KKyNpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CisjaW5jbHVkZSA8RXJyb3JzLmg+CisKKyNpbmNsdWRlICJTRExfbG9hZHNvLmgiCisKK3ZvaWQgKlNETF9Mb2FkT2JqZWN0KGNvbnN0IGNoYXIgKnNvZmlsZSkKK3sKKwl2b2lkICpoYW5kbGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKmxvYWRlcnJvciA9IE5VTEw7CisJQ0ZyYWdDb25uZWN0aW9uSUQgbGlicmFyeV9pZDsKKwlQdHIgbWFpbkFkZHI7CisJU3RyMjU1IGVyck5hbWU7CisJT1NFcnIgZXJyb3I7CisJY2hhciBwc29maWxlWzUxMl07CisKKwlTRExfc3RybGNweShwc29maWxlLCBzb2ZpbGUsIFNETF9hcnJheXNpemUocHNvZmlsZSkpOworCWVycm9yID0gR2V0U2hhcmVkTGlicmFyeShDMlBTdHIocHNvZmlsZSksIGtDb21waWxlZENGcmFnQXJjaCwKKwkJCWtMb2FkQ0ZyYWcsICZsaWJyYXJ5X2lkLCAmbWFpbkFkZHIsIGVyck5hbWUpOworCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSBub0VycjoKKwkJCWxvYWRlcnJvciA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBjZnJhZ05vTGlicmFyeUVycjoKKwkJCWxvYWRlcnJvciA9ICJMaWJyYXJ5IG5vdCBmb3VuZCI7CisJCQlicmVhazsKKwkJY2FzZSBjZnJhZ1VucmVzb2x2ZWRFcnI6CisJCQlsb2FkZXJyb3IgPSAiVW5hYmxlZCB0byByZXNvbHZlIHN5bWJvbHMiOworCQkJYnJlYWs7CisJCWNhc2UgY2ZyYWdOb1ByaXZhdGVNZW1FcnI6CisJCWNhc2UgY2ZyYWdOb0NsaWVudE1lbUVycjoKKwkJCWxvYWRlcnJvciA9ICJPdXQgb2YgbWVtb3J5IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbG9hZGVycm9yID0gIlVua25vd24gQ29kZSBGcmFnbWVudCBNYW5hZ2VyIGVycm9yIjsKKwkJCWJyZWFrOworCX0KKwlpZiAoIGxvYWRlcnJvciA9PSBOVUxMICkgeworCQloYW5kbGUgPSAodm9pZCAqKShsaWJyYXJ5X2lkKTsKKwl9IGVsc2UgeworCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIHNvZmlsZSwgbG9hZGVycm9yKTsKKwl9CisJcmV0dXJuKGhhbmRsZSk7Cit9CisKK3ZvaWQgKlNETF9Mb2FkRnVuY3Rpb24odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lKQoreworCXZvaWQgKnN5bWJvbCA9IE5VTEw7CisJY29uc3QgY2hhciAqbG9hZGVycm9yID0gTlVMTDsKKwlDRnJhZ1N5bWJvbENsYXNzIGNsYXNzOworCUNGcmFnQ29ubmVjdGlvbklEIGxpYnJhcnlfaWQgPSAoQ0ZyYWdDb25uZWN0aW9uSUQpaGFuZGxlOworCWNoYXIgcG5hbWVbNTEyXTsKKworCVNETF9zdHJsY3B5KHBuYW1lLCBuYW1lLCBTRExfYXJyYXlzaXplKHBuYW1lKSk7CisJaWYgKCBGaW5kU3ltYm9sKGxpYnJhcnlfaWQsIEMyUFN0cihwbmFtZSksCisJICAgICAgICAgICAgICAgIChjaGFyICoqKSZzeW1ib2wsICZjbGFzcykgIT0gbm9FcnIgKSB7CisJCWxvYWRlcnJvciA9ICJTeW1ib2wgbm90IGZvdW5kIjsKKwl9CisKKwlpZiAoIHN5bWJvbCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIG5hbWUsIGxvYWRlcnJvcik7CisJfQorCXJldHVybihzeW1ib2wpOworfQorCit2b2lkIFNETF9VbmxvYWRPYmplY3Qodm9pZCAqaGFuZGxlKQoreworCUNGcmFnQ29ubmVjdGlvbklEIGxpYnJhcnlfaWQ7CisJaWYgKCBoYW5kbGUgIT0gTlVMTCApIHsKKwkJbGlicmFyeV9pZCA9IChDRnJhZ0Nvbm5lY3Rpb25JRCloYW5kbGU7CisJCUNsb3NlQ29ubmVjdGlvbigmbGlicmFyeV9pZCk7CisJfQorfQorCisjZW5kaWYgLyogU0RMX0xPQURTT19NQUNPUyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9sb2Fkc28vbWFjb3N4L1NETF9kbGNvbXBhdC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9sb2Fkc28vbWFjb3N4L1NETF9kbGNvbXBhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTk0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2xvYWRzby9tYWNvc3gvU0RMX2RsY29tcGF0LmMKQEAgLTAsMCArMSwxNDA3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9MT0FEU09fRExDT01QQVQKKworLyogUGxlYXNlIG5vdGUgdGhhdCBkbGNvbXBhdCBhcHBhcmVudGx5IHNoaXBzIGluIGN1cnJlbnQgTWFjIE9TIFggdmVyc2lvbnMKKyAqICBhcyBhIHN5c3RlbSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBVbml4ICJkbG9wZW4iCisgKiAgaW50ZXJmYWNlLiBJbiBvcmRlciB0byBhbGxvdyBTREwgdG8gd29yayBvbiBvbGRlciBPUyBYIHJlbGVhc2VzIGFuZCBhbHNvCisgKiAgbm90IGNvbmZsaWN0IHdpdGggdGhlIHN5c3RlbSBsaWIgb24gbmV3ZXIgdmVyc2lvbnMsIHdlIGluY2x1ZGUgZGxjb21wYXQKKyAqICBpbiBTREwgYW5kIGNoYW5nZSB0aGUgc3ltYm9scyB0byBwcmV2ZW50IHN5bWJvbCBjbGFzaCB3aXRoIGFueSBleGlzdGluZworICogIHN5c3RlbSBsaWJyYXJpZXMuICAtLXJ5YW4uCisgKi8KKworLyogaGVyZSBpcyB0aGUgZGxjb21wYXQgbGljZW5zZTogKi8KKworLyoKK0NvcHlyaWdodCAoYykgMjAwMiBKb3JnZSBBY2VyZWRhICA8amFjZXJlZGFAdXNlcnMuc291cmNlZm9yZ2UubmV0PiAmCisgICAgICAgICAgICAgICAgICAgUGV0ZXIgTydHb3JtYW4gPG9nb3JtYW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAgICAgICAgICAgICAgICAgIAorUG9ydGlvbnMgbWF5IGJlIGNvcHlyaWdodCBvdGhlcnMsIHNlZSB0aGUgQVVUSE9SUyBmaWxlIGluY2x1ZGVkIHdpdGggdGhpcworZGlzdHJpYnV0aW9uLgorCitNYWludGFpbmVkIGJ5IFBldGVyIE8nR29ybWFuIDxvZ29ybWFuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworQnVnIFJlcG9ydHMgYW5kIG90aGVyIHF1ZXJpZXMgc2hvdWxkIGdvIHRvIDxvZ29ybWFuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hY2gtby9keWxkLmg+CisjaW5jbHVkZSA8bWFjaC1vL25saXN0Lmg+CisjaW5jbHVkZSA8bWFjaC1vL2dldHNlY3QuaD4KKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKworLyogSnVzdCBwbGF5aW5nIHRvIHNlZSBpZiBpdCB3b3VsZCBjb21waWxlIHdpdGggdGhlIGZyZWVic2QgaGVhZGVycywgaXQgZG9lcywKKyAqIGJ1dCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgdmFsdWVzIGZvciBSVExEX0xPQ0FMIGV0YywgaXQgd291bGQgYnJlYWsgYmluYXJ5CisgKiBjb21wYXQuLi4gb2ggd2VsbAorICovCisjaWZuZGVmIF9fQlNEX1ZJU0lCTEUKKyNkZWZpbmUgX19CU0RfVklTSUJMRSAxCisjZW5kaWYKKworLyppbmNsdWRlICJkbGZjbi5oIiovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgX19HTlVDX18gPiAzCisjZGVmaW5lIGRsX3Jlc3RyaWN0IF9fcmVzdHJpY3QKKyNlbHNlCisjZGVmaW5lIGRsX3Jlc3RyaWN0CisjZW5kaWYKKworI2lmIDAKKyNpZm5kZWYgX1BPU0lYX1NPVVJDRQorLyoKKyAqIFN0cnVjdHVyZSBmaWxsZWQgaW4gYnkgZGxhZGRyKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9PU1hfZGxfaW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIgICAgICAqZGxpX2ZuYW1lOyAgICAgLyogUGF0aG5hbWUgb2Ygc2hhcmVkIG9iamVjdCAqLworICAgICAgICB2b2lkICAgICAgICAgICAgKmRsaV9mYmFzZTsgICAgIC8qIEJhc2UgYWRkcmVzcyBvZiBzaGFyZWQgb2JqZWN0ICovCisgICAgICAgIGNvbnN0IGNoYXIgICAgICAqZGxpX3NuYW1lOyAgICAgLyogTmFtZSBvZiBuZWFyZXN0IHN5bWJvbCAqLworICAgICAgICB2b2lkICAgICAgICAgICAgKmRsaV9zYWRkcjsgICAgIC8qIEFkZHJlc3Mgb2YgbmVhcmVzdCBzeW1ib2wgKi8KK30gU0RMX09TWF9EbF9pbmZvOworCitzdGF0aWMgaW50IFNETF9PU1hfZGxhZGRyKGNvbnN0IHZvaWQgKiBkbF9yZXN0cmljdCwgU0RMX09TWF9EbF9pbmZvICogZGxfcmVzdHJpY3QpOworI2VuZGlmIC8qICEgX1BPU0lYX1NPVVJDRSAqLworI2VuZGlmIC8qIDAgKi8KKworc3RhdGljIGludCBTRExfT1NYX2RsY2xvc2Uodm9pZCAqIGhhbmRsZSk7CitzdGF0aWMgY29uc3QgY2hhciAqIFNETF9PU1hfZGxlcnJvcih2b2lkKTsKK3N0YXRpYyB2b2lkICogU0RMX09TWF9kbG9wZW4oY29uc3QgY2hhciAqcGF0aCwgaW50IG1vZGUpOworc3RhdGljIHZvaWQgKiBTRExfT1NYX2Rsc3ltKHZvaWQgKiBkbF9yZXN0cmljdCBoYW5kbGUsIGNvbnN0IGNoYXIgKiBkbF9yZXN0cmljdCBzeW1ib2wpOworCisjZGVmaW5lIFJUTERfTEFaWQkweDEKKyNkZWZpbmUgUlRMRF9OT1cJMHgyCisjZGVmaW5lIFJUTERfTE9DQUwJMHg0CisjZGVmaW5lIFJUTERfR0xPQkFMCTB4OAorCisjaWZuZGVmIF9QT1NJWF9TT1VSQ0UKKyNkZWZpbmUgUlRMRF9OT0xPQUQJMHgxMAorI2RlZmluZSBSVExEX05PREVMRVRFCTB4ODAKKworLyoKKyAqIFNwZWNpYWwgaGFuZGxlIGFyZ3VtZW50cyBmb3IgU0RMX09TWF9kbHN5bSgpLgorICovCisjZGVmaW5lCVJUTERfTkVYVAkJKCh2b2lkICopIC0xKQkvKiBTZWFyY2ggc3Vic2VxdWVudCBvYmplY3RzLiAqLworI2RlZmluZQlSVExEX0RFRkFVTFQJKCh2b2lkICopIC0yKQkvKiBVc2UgZGVmYXVsdCBzZWFyY2ggYWxnb3JpdGhtLiAqLworI2VuZGlmIC8qICEgX1BPU0lYX1NPVVJDRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjaWZuZGVmIGRsX3Jlc3RyaWN0CisjZGVmaW5lIGRsX3Jlc3RyaWN0IF9fcmVzdHJpY3QKKyNlbmRpZgorLyogVGhpcyBpcyBub3QgYXZhaWxhYmxlIG9uIDEwLjEgKi8KKyNpZm5kZWYgTENfTE9BRF9XRUFLX0RZTElCCisjZGVmaW5lCUxDX0xPQURfV0VBS19EWUxJQiAoMHgxOCB8IExDX1JFUV9EWUxEKQorI2VuZGlmCisKKy8qIFdpdGggdGhpcyBzdHVmZiBoZXJlLCB0aGlzIHRoaW5nIG1heSBhY3R1YWxseSBjb21waWxlL3J1biBvbiAxMC4wIHN5c3RlbXMKKyAqIE5vdCB0aGF0IEkgaGF2ZSBhIDEwLjAgc3lzdGVtIHRvIHRlc3QgaXQgb24gYW55bG9uZ2VyCisgKi8KKyNpZm5kZWYgTENfUkVRX0RZTEQKKyNkZWZpbmUgTENfUkVRX0RZTEQgMHg4MDAwMDAwMAorI2VuZGlmCisjaWZuZGVmIE5TQURESU1BR0VfT1BUSU9OX1JFVFVSTl9PTkxZX0lGX0xPQURFRAorI2RlZmluZSBOU0FERElNQUdFX09QVElPTl9SRVRVUk5fT05MWV9JRl9MT0FERUQgMHg0CisjZW5kaWYKKyNpZm5kZWYgTlNBRERJTUFHRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SCisjZGVmaW5lIE5TQURESU1BR0VfT1BUSU9OX1JFVFVSTl9PTl9FUlJPUiAweDEKKyNlbmRpZgorI2lmbmRlZiBOU0xPT0tVUFNZTUJPTElOSU1BR0VfT1BUSU9OX0JJTkQKKyNkZWZpbmUgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9CSU5EIDB4MAorI2VuZGlmCisjaWZuZGVmIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SCisjZGVmaW5lIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SIDB4NAorI2VuZGlmCisvKiBUaGVzZSBzeW1ib2xzIHdpbGwgYmUgbG9va2VkIGZvciBpbiBkeWxkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICooKmR5bGRfTlNBZGRJbWFnZSkgKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZykgPSAwOworc3RhdGljIGludCAoKmR5bGRfTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSkgKGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqLCBjb25zdCBjaGFyICopID0gMDsKK3N0YXRpYyBOU1N5bWJvbCgqZHlsZF9OU0xvb2t1cFN5bWJvbEluSW1hZ2UpCisJKGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpID0gMDsKKworLyogRGVmaW5lIHRoaXMgdG8gbWFrZSBkbGNvbXBhdCByZXVzZSBkYXRhIGJsb2NrLiBUaGlzIHdheSBpbiB0aGVvcnkgd2Ugc2F2ZQorICogYSBsaXR0bGUgYml0IG9mIG92ZXJoZWFkLiBIb3dldmVyIHdlIHRoZW4gY291bGRuJ3QgY29ycmVjdGx5IGNhdGNoIGV4Y2VzcworICogY2FsbHMgdG8gU0RMX09TWF9kbGNsb3NlKCkuIEhlbmNlIHdlIGRvbid0IHVzZSB0aGlzIGZlYXR1cmUKKyAqLworI3VuZGVmIFJFVVNFX1NUQVRVUworCisvKiBTaXplIG9mIHRoZSBpbnRlcm5hbCBlcnJvciBtZXNzYWdlIGJ1ZmZlciAodXNlZCBieSBkbGVycm9yKCkpICovCisjZGVmaW5lIEVSUl9TVFJfTEVOCQkJMjUxCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHNlYXJjaCBwYXRocyBzdXBwb3J0ZWQgYnkgZ2V0U2VhcmNoUGF0aCAqLworI2RlZmluZSBNQVhfU0VBUkNIX1BBVEhTCTMyCisKKworI2RlZmluZSBNQUdJQ19EWUxJQl9PRkkgKChOU09iamVjdEZpbGVJbWFnZSkgJ0RZT0YnKQorI2RlZmluZSBNQUdJQ19EWUxJQl9NT0QgKChOU01vZHVsZSkgJ0RZTU8nKQorCisvKiBpbnRlcm5hbCBmbGFncyAqLworI2RlZmluZSBETF9JTl9MSVNUIDB4MDEKKworLyogb3VyIG11dGV4ICovCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGRsY29tcGF0X211dGV4OworLyogT3VyIHRocmVhZCBzcGVjaWZpYyBzdG9yYWdlCisgKi8KK3N0YXRpYyBwdGhyZWFkX2tleV90IGRsZXJyb3Jfa2V5OworCitzdHJ1Y3QgZGx0aHJlYWQKK3sKKwlpbnQgbG9ja2NudDsKKwl1bnNpZ25lZCBjaGFyIGVycnNldDsKKwljaGFyIGVycnN0cltFUlJfU1RSX0xFTl07Cit9OworCisvKiBUaGlzIGlzIG91ciBjZW50cmFsIGRhdGEgc3RydWN0dXJlLiBXaGVuZXZlciBhIG1vZHVsZSBpcyBsb2FkZWQgdmlhCisgKiBTRExfT1NYX2Rsb3BlbigpLCB3ZSBjcmVhdGUgc3VjaCBhIHN0cnVjdC4KKyAqLworc3RydWN0IGRsc3RhdHVzCit7CisJc3RydWN0IGRsc3RhdHVzICpuZXh0OwkJLyogcG9pbnRlciB0byBuZXh0IGVsZW1lbnQgaW4gdGhlIGxpbmtlZCBsaXN0ICovCisJTlNNb2R1bGUgbW9kdWxlOworCWNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqbGliOworCWludCByZWZzOwkJCQkJLyogcmVmZXJlbmNlIGNvdW50ICovCisJaW50IG1vZGU7CQkJCQkvKiBtb2RlIGluIHdoaWNoIHRoaXMgbW9kdWxlIHdhcyBsb2FkZWQgKi8KKwlkZXZfdCBkZXZpY2U7CisJaW5vX3QgaW5vZGU7CisJaW50IGZsYWdzOwkJCQkJLyogQW55IGludGVybmFsIGZsYWdzIHdlIG1heSBuZWVkICovCit9OworCisvKiBIZWFkIG5vZGUgb2YgdGhlIGRsc3RhdHVzIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgZGxzdGF0dXMgbWFpblN0YXR1cyA9IHsgMCwgTUFHSUNfRFlMSUJfTU9ELCBOVUxMLCAtMSwgUlRMRF9HTE9CQUwsIDAsIDAsIDAgfTsKK3N0YXRpYyBzdHJ1Y3QgZGxzdGF0dXMgKnN0cXVldWUgPSAmbWFpblN0YXR1czsKKworCisvKiBTdG9yYWdlIGZvciB0aGUgbGFzdCBlcnJvciBtZXNzYWdlICh1c2VkIGJ5IGRsZXJyb3IoKSkgKi8KKy8qIHN0YXRpYyBjaGFyIGVycl9zdHJbRVJSX1NUUl9MRU5dOyAqLworLyogc3RhdGljIGludCBlcnJfZmlsbGVkID0gMDsgKi8KKworLyogUHJvdG90eXBlcyB0byBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGRlYnVnKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKnN0ciwgLi4uKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzYWZlZ2V0ZW52KGNvbnN0IGNoYXIgKnMpOworc3RhdGljIGNvbnN0IGNoYXIgKnNlYXJjaExpc3Qodm9pZCk7CitzdGF0aWMgY29uc3QgY2hhciAqZ2V0U2VhcmNoUGF0aChpbnQgaSk7CitzdGF0aWMgY29uc3QgY2hhciAqZ2V0RnVsbFBhdGgoaW50IGksIGNvbnN0IGNoYXIgKmZpbGUpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGF0ICpmaW5kRmlsZShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICoqZnVsbFBhdGgpOworc3RhdGljIGludCBpc1ZhbGlkU3RhdHVzKHN0cnVjdCBkbHN0YXR1cyAqc3RhdHVzKTsKK3N0YXRpYyBpbmxpbmUgaW50IGlzRmxhZ1NldChpbnQgbW9kZSwgaW50IGZsYWcpOworc3RhdGljIHN0cnVjdCBkbHN0YXR1cyAqbG9va3VwU3RhdHVzKGNvbnN0IHN0cnVjdCBzdGF0ICpzYnVmKTsKK3N0YXRpYyB2b2lkIGluc2VydFN0YXR1cyhzdHJ1Y3QgZGxzdGF0dXMgKmRscywgY29uc3Qgc3RydWN0IHN0YXQgKnNidWYpOworc3RhdGljIGludCBwcm9tb3RlTG9jYWxUb0dsb2JhbChzdHJ1Y3QgZGxzdGF0dXMgKmRscyk7CitzdGF0aWMgdm9pZCAqcmVmZXJlbmNlKHN0cnVjdCBkbHN0YXR1cyAqZGxzLCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCAqZGxzeW1JbnRlcm4oc3RydWN0IGRsc3RhdHVzICpkbHMsIGNvbnN0IGNoYXIgKnN5bWJvbCwgaW50IGNhblNldEVycm9yKTsKK3N0YXRpYyBzdHJ1Y3QgZGxzdGF0dXMgKmFsbG9jU3RhdHVzKHZvaWQpOworc3RhdGljIHN0cnVjdCBkbHN0YXR1cyAqbG9hZE1vZHVsZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqc2J1ZiwgaW50IG1vZGUpOworc3RhdGljIE5TU3ltYm9sIHNlYXJjaF9saW5rZWRfbGlicyhjb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKm1oLCBjb25zdCBjaGFyICpzeW1ib2wpOworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9saWJfbmFtZShjb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKm1oKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKmdldF9tYWNoX2hlYWRlcl9mcm9tX05TTW9kdWxlKE5TTW9kdWxlIG1vZCk7CitzdGF0aWMgdm9pZCBkbGNvbXBhdF9pbml0X2Z1bmModm9pZCk7CitzdGF0aWMgaW5saW5lIHZvaWQgZGxjb21wYXRfaW5pdF9jaGVjayh2b2lkKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb2xvY2sodm9pZCk7CitzdGF0aWMgaW5saW5lIHZvaWQgZG91bmxvY2sodm9pZCk7CitzdGF0aWMgdm9pZCBkbGVycm9yZnJlZSh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHJlc2V0ZGxlcnJvcih2b2lkKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKm15X2ZpbmRfaW1hZ2UoY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICppbWFnZV9mb3JfYWRkcmVzcyhjb25zdCB2b2lkICphZGRyZXNzKTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqZHlsZF9lcnJvcl9zdHIodm9pZCk7CisKKyNpZiBGSU5LX0JVSUxECisvKiBUd28gR2xvYmFsIEZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgKmRsc3ltX3ByZXBlbmRfdW5kZXJzY29yZSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN5bWJvbCk7CitzdGF0aWMgdm9pZCAqZGxzeW1fYXV0b191bmRlcnNjb3JlKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKTsKKworLyogQW5kIHRoZWlyIF9pbnRlcm4gY291bnRlcnBhcnRzICovCitzdGF0aWMgdm9pZCAqZGxzeW1fcHJlcGVuZF91bmRlcnNjb3JlX2ludGVybih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN5bWJvbCk7CitzdGF0aWMgdm9pZCAqZGxzeW1fYXV0b191bmRlcnNjb3JlX2ludGVybih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN5bWJvbCk7CisjZW5kaWYKKworLyogRnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIGRlYnVnKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworI2lmIERFQlVHID4gMQorCXZhX2xpc3QgYXJnOworCXZhX3N0YXJ0KGFyZywgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIkRMREVCVUc6ICIpOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmcpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmZmx1c2goc3RkZXJyKTsKKwl2YV9lbmQoYXJnKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBlcnJvcihjb25zdCBjaGFyICpzdHIsIC4uLikKK3sKKwl2YV9saXN0IGFyZzsKKwlzdHJ1Y3QgZGx0aHJlYWQgICp0c3M7CisJY2hhciAqIGVycl9zdHI7CisJdmFfc3RhcnQoYXJnLCBzdHIpOworCXRzcyA9IHB0aHJlYWRfZ2V0c3BlY2lmaWMoZGxlcnJvcl9rZXkpOworCWVycl9zdHIgPSB0c3MtPmVycnN0cjsKKwlTRExfc3RybGNweShlcnJfc3RyLCAiZGxjb21wYXQ6ICIsIEVSUl9TVFJfTEVOKTsKKwl2c25wcmludGYoZXJyX3N0ciArIDEwLCBFUlJfU1RSX0xFTiAtIDEwLCBzdHIsIGFyZyk7CisJdmFfZW5kKGFyZyk7CisJZGVidWcoIkVSUk9SOiAlc1xuIiwgZXJyX3N0cik7CisJdHNzLT5lcnJzZXQgPSAxOworfQorCitzdGF0aWMgdm9pZCB3YXJuaW5nKGNvbnN0IGNoYXIgKnN0cikKK3sKKyNpZiBERUJVRyA+IDAKKwlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IGRsY29tcGF0OiAlc1xuIiwgc3RyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2FmZWdldGVudihjb25zdCBjaGFyICpzKQoreworCWNvbnN0IGNoYXIgKnNzID0gU0RMX2dldGVudihzKTsKKwlyZXR1cm4gc3MgPyBzcyA6ICIiOworfQorCisvKiBiZWNhdXNlIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kIGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbnMsIHdlCisgKiBkb24ndCByZWFsbHkgY2FyZSBhYm91dCBob3cgZWxlZ2FudCBpdCBpcy4uLiBpdCBjb3VsZCB1c2UgdGhlIGxvYWQKKyAqIGNvbW1hbmRzIHRvIGZpbmQgdGhlIGluc3RhbGwgbmFtZSBvZiB0aGUgbGlicmFyeSwgYnV0Li4uCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfbGliX25hbWUoY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICptaCkKK3sKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gX2R5bGRfaW1hZ2VfY291bnQoKTsKKwl1bnNpZ25lZCBsb25nIGk7CisJY29uc3QgY2hhciAqdmFsID0gTlVMTDsKKwlpZiAobWgpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJeworCQkJaWYgKG1oID09IF9keWxkX2dldF9pbWFnZV9oZWFkZXIoaSkpCisJCQl7CisJCQkJdmFsID0gX2R5bGRfZ2V0X2ltYWdlX25hbWUoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHZhbDsKK30KKworLyogUmV0dXJucyB0aGUgbWFjaF9oZWFkZXIgZm9yIHRoZSBtb2R1bGUgYnUgZ29pbmcgdGhyb3VnaCBhbGwgdGhlIGxvYWRlZCBpbWFnZXMKKyAqIGFuZCBmaW5kaW5nIHRoZSBvbmUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBtb2R1bGUuIFRoZXJlIHJlYWxseSBvdWdodCB0byBiZQorICogYW4gYXBpIGZvciBkb2luZyB0aGlzLCB3b3VsZCBiZSBmYXN0ZXIsIGJ1dCB0aGVyZSBpc24ndCBvbmUgcmlnaHQgbm93CisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKmdldF9tYWNoX2hlYWRlcl9mcm9tX05TTW9kdWxlKE5TTW9kdWxlIG1vZCkKK3sKKwljb25zdCBjaGFyICptb2RfbmFtZSA9IE5TTmFtZU9mTW9kdWxlKG1vZCk7CisJY29uc3Qgc3RydWN0IG1hY2hfaGVhZGVyICptaCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IF9keWxkX2ltYWdlX2NvdW50KCk7CisJdW5zaWduZWQgbG9uZyBpOworCWRlYnVnKCJNb2R1bGUgbmFtZTogJXMiLCBtb2RfbmFtZSk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJeworCQlpZiAoIVNETF9zdHJjbXAobW9kX25hbWUsIF9keWxkX2dldF9pbWFnZV9uYW1lKGkpKSkKKwkJeworCQkJbWggPSBfZHlsZF9nZXRfaW1hZ2VfaGVhZGVyKGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIG1oOworfQorCisKKy8qIENvbXB1dGUgYW5kIHJldHVybiBhIGxpc3Qgb2YgYWxsIGRpcmVjdG9yaWVzIHRoYXQgd2Ugc2hvdWxkIHNlYXJjaCB3aGVuCisgKiB0cnlpbmcgdG8gbG9jYXRlIGEgbW9kdWxlLiBXZSBmaXJzdCBsb29rIGF0IHRoZSB2YWx1ZXMgb2YgTERfTElCUkFSWV9QQVRICisgKiBhbmQgRFlMRF9MSUJSQVJZX1BBVEgsIGFuZCB0aGVuIGZpbmFsbHkgZmFsbCBiYWNrIHRvIGxvb2tpbmcgaW50bworICogL3Vzci9saWIgYW5kIC9saWIuIFNpbmNlIGJvdGggb2YgdGhlIGVudmlyb25tZW50cyB2YXJpYWJsZXMgY2FuIGNvbnRhaW4gYQorICogbGlzdCBvZiBjb2xvbiBzZXBlcmF0ZWQgcGF0aHMsIHdlIHNpbXBseSBjb25jYXQgdGhlbSBhbmQgdGhlIHR3byBvdGhlciBwYXRocworICogaW50byBvbmUgYmlnIHN0cmluZywgd2hpY2ggd2UgdGhlbiBjYW4gZWFzaWx5IHBhcnNlLgorICogU3BsaXR0aW5nIHRoaXMgc3RyaW5nIGludG8gdGhlIGFjdHVhbCBwYXRoIGxpc3QgaXMgZG9uZSBieSBnZXRTZWFyY2hQYXRoKCkKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnNlYXJjaExpc3QoKQoreworCXNpemVfdCBidWZfc2l6ZTsKKwlzdGF0aWMgY2hhciAqYnVmPU5VTEw7CisJY29uc3QgY2hhciAqbGRscCA9IHNhZmVnZXRlbnYoIkxEX0xJQlJBUllfUEFUSCIpOworCWNvbnN0IGNoYXIgKmR5bGRscCA9IHNhZmVnZXRlbnYoIkRZTERfTElCUkFSWV9QQVRIIik7CisJY29uc3QgY2hhciAqc3RkcGF0aCA9IFNETF9nZXRlbnYoIkRZTERfRkFMTEJBQ0tfTElCUkFSWV9QQVRIIik7CisJaWYgKCFzdGRwYXRoKQorCQlzdGRwYXRoID0gIi91c3IvbG9jYWwvbGliOi9saWI6L3Vzci9saWIiOworCWlmICghYnVmKQorCXsJCisJCWJ1Zl9zaXplID0gU0RMX3N0cmxlbihsZGxwKSArIFNETF9zdHJsZW4oZHlsZGxwKSArIFNETF9zdHJsZW4oc3RkcGF0aCkgKyA0OworCQlidWYgPSBTRExfbWFsbG9jKGJ1Zl9zaXplKTsKKwkJU0RMX3NucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICIlcyVzJXMlcyVzJWMiLCBkeWxkbHAsIChkeWxkbHBbMF0gPyAiOiIgOiAiIiksIGxkbHAsIChsZGxwWzBdID8gIjoiIDogIiIpLAorCQkJCSBzdGRwYXRoLCAnXDAnKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworLyogUmV0dXJucyB0aGUgaXRoIHNlYXJjaCBwYXRoIGZyb20gdGhlIGxpc3QgYXMgY29tcHV0ZWQgYnkgc2VhcmNoTGlzdCgpICovCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0U2VhcmNoUGF0aChpbnQgaSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqbGlzdCA9IDA7CisJc3RhdGljIGNoYXIgKipwYXRoID0gKGNoYXIgKiopMDsKKwlzdGF0aWMgaW50IGVuZCA9IDA7CisJc3RhdGljIGludCBudW1zaXplID0gTUFYX1NFQVJDSF9QQVRIUzsKKwlzdGF0aWMgY2hhciAqKnRtcDsKKwkvKiBTbyB3ZSBjYW4gY2FsbCBTRExfZnJlZSgpIGluIHRoZSAiZGVzdHJ1Y3RvciIgd2UgdXNlIGk9LTEgdG8gcmV0dXJuIHRoZSBhbGxvYydkIGFycmF5ICovCisJaWYgKGkgPT0gLTEpCisJeworCQlyZXR1cm4gKGNvbnN0IGNoYXIqKXBhdGg7CisJfQorCWlmICghcGF0aCkKKwl7CisJCXBhdGggPSAoY2hhciAqKilTRExfY2FsbG9jKE1BWF9TRUFSQ0hfUEFUSFMsIHNpemVvZihjaGFyICoqKSk7CisJfQorCWlmICghbGlzdCAmJiAhZW5kKQorCQlsaXN0ID0gc2VhcmNoTGlzdCgpOworCWlmIChpID49IChudW1zaXplKSkKKwl7CisJCWRlYnVnKCJJbmNyZWFzaW5nIHNpemUgZm9yIGxvbmcgUEFUSCIpOworCQl0bXAgPSAoY2hhciAqKilTRExfY2FsbG9jKChNQVhfU0VBUkNIX1BBVEhTICsgbnVtc2l6ZSksIHNpemVvZihjaGFyICoqKSk7CisJCWlmICh0bXApCisJCXsKKwkJCVNETF9tZW1jcHkodG1wLCBwYXRoLCBzaXplb2YoY2hhciAqKikgKiBudW1zaXplKTsKKwkJCVNETF9mcmVlKHBhdGgpOworCQkJcGF0aCA9IHRtcDsKKwkJCW51bXNpemUgKz0gTUFYX1NFQVJDSF9QQVRIUzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJd2hpbGUgKCFwYXRoW2ldICYmICFlbmQpCisJeworCQlwYXRoW2ldID0gc3Ryc2VwKChjaGFyICoqKSZsaXN0LCAiOiIpOworCisJCWlmIChwYXRoW2ldWzBdID09IDApCisJCQlwYXRoW2ldID0gMDsKKwkJZW5kID0gKGxpc3QgPT0gMCk7CisJfQorCXJldHVybiBwYXRoW2ldOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0RnVsbFBhdGgoaW50IGksIGNvbnN0IGNoYXIgKmZpbGUpCit7CisJc3RhdGljIGNoYXIgYnVmW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpwYXRoID0gZ2V0U2VhcmNoUGF0aChpKTsKKwlpZiAocGF0aCkKKwl7CisJCVNETF9zbnByaW50ZihidWYsIFBBVEhfTUFYLCAiJXMvJXMiLCBwYXRoLCBmaWxlKTsKKwl9CisJcmV0dXJuIHBhdGggPyBidWYgOiAwOworfQorCisvKiBHaXZlbiBhIGZpbGUgbmFtZSwgdHJ5IHRvIGRldGVybWluZSB0aGUgZnVsbCBwYXRoIGZvciB0aGF0IGZpbGUuIFN0YXJ0cworICogaXRzIHNlYXJjaCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCB0aGVuIHRyaWVzIGFsbCBwYXRocyBpbiB0aGUgCisgKiBzZWFyY2ggbGlzdCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgc3BlY2lmaWVkIHRoZXJlLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YXQgKmZpbmRGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKipmdWxsUGF0aCkKK3sKKwlpbnQgaSA9IDA7CisJc3RhdGljIHN0cnVjdCBzdGF0IHNidWY7CisJY2hhciAqZmlsZU5hbWU7CisJZGVidWcoImZpbmRpbmcgZmlsZSAlcyIsIGZpbGUpOworCSpmdWxsUGF0aCA9IGZpbGU7CisJaWYgKDAgPT0gc3RhdChmaWxlLCAmc2J1ZikpCisJCXJldHVybiAmc2J1ZjsKKwlpZiAoU0RMX3N0cmNocihmaWxlLCAnLycpKQorCQlyZXR1cm4gMDsJCQkJLyogSWYgdGhlIHBhdGggaGFkIGEgLyB3ZSBkb24ndCBsb29rIGluIGVudiB2YXIgcGxhY2VzICovCisJZmlsZU5hbWUgPSBOVUxMOworCWlmICghZmlsZU5hbWUpCisJCWZpbGVOYW1lID0gKGNoYXIgKilmaWxlOworCXdoaWxlICgoKmZ1bGxQYXRoID0gZ2V0RnVsbFBhdGgoaSsrLCBmaWxlTmFtZSkpKQorCXsKKwkJaWYgKDAgPT0gc3RhdCgqZnVsbFBhdGgsICZzYnVmKSkKKwkJCXJldHVybiAmc2J1ZjsKKwl9CisJOworCXJldHVybiAwOworfQorCisvKiBEZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIGRsc3RhdHVzIGlzIHZhbGlkIG9yIG5vdCAqLworc3RhdGljIGludCBpc1ZhbGlkU3RhdHVzKHN0cnVjdCBkbHN0YXR1cyAqc3RhdHVzKQoreworCS8qIFdhbGsgdGhlIGxpc3QgdG8gdmVyaWZ5IHN0YXR1cyBpcyBjb250YWluZWQgaW4gaXQgKi8KKwlzdHJ1Y3QgZGxzdGF0dXMgKmRscyA9IHN0cXVldWU7CisJd2hpbGUgKGRscyAmJiBzdGF0dXMgIT0gZGxzKQorCQlkbHMgPSBkbHMtPm5leHQ7CisJaWYgKGRscyA9PSAwKQorCQllcnJvcigiaW52YWxpZCBoYW5kbGUiKTsKKwllbHNlIGlmICgoZGxzLT5tb2R1bGUgPT0gMCkgfHwgKGRscy0+cmVmcyA9PSAwKSkKKwkJZXJyb3IoImhhbmRsZSB0byBjbG9zZWQgbGlicmFyeSIpOworCWVsc2UKKwkJcmV0dXJuIFRSVUU7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc0ZsYWdTZXQoaW50IG1vZGUsIGludCBmbGFnKQoreworCXJldHVybiAobW9kZSAmIGZsYWcpID09IGZsYWc7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGxzdGF0dXMgKmxvb2t1cFN0YXR1cyhjb25zdCBzdHJ1Y3Qgc3RhdCAqc2J1ZikKK3sKKwlzdHJ1Y3QgZGxzdGF0dXMgKmRscyA9IHN0cXVldWU7CisJZGVidWcoImxvb2tpbmcgZm9yIHN0YXR1cyIpOworCXdoaWxlIChkbHMgJiYgKCAvKiBpc0ZsYWdTZXQoZGxzLT5tb2RlLCBSVExEX1VOU0hBUkVEKSAqLyAwCisJCQkJICAgfHwgc2J1Zi0+c3RfZGV2ICE9IGRscy0+ZGV2aWNlIHx8IHNidWYtPnN0X2lubyAhPSBkbHMtPmlub2RlKSkKKwkJZGxzID0gZGxzLT5uZXh0OworCXJldHVybiBkbHM7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydFN0YXR1cyhzdHJ1Y3QgZGxzdGF0dXMgKmRscywgY29uc3Qgc3RydWN0IHN0YXQgKnNidWYpCit7CisJZGVidWcoImluc2VydGluZyBzdGF0dXMiKTsKKwlkbHMtPmlub2RlID0gc2J1Zi0+c3RfaW5vOworCWRscy0+ZGV2aWNlID0gc2J1Zi0+c3RfZGV2OworCWRscy0+cmVmcyA9IDA7CisJZGxzLT5tb2RlID0gMDsKKwlpZiAoKGRscy0+ZmxhZ3MgJiBETF9JTl9MSVNUKSA9PSAwKQorCXsKKwkJZGxzLT5uZXh0ID0gc3RxdWV1ZTsKKwkJc3RxdWV1ZSA9IGRsczsKKwkJZGxzLT5mbGFncyB8PSBETF9JTl9MSVNUOworCX0KK30KKworc3RhdGljIHN0cnVjdCBkbHN0YXR1cyAqYWxsb2NTdGF0dXMoKQoreworCXN0cnVjdCBkbHN0YXR1cyAqZGxzOworI2lmZGVmIFJFVVNFX1NUQVRVUworCWRscyA9IHN0cXVldWU7CisJd2hpbGUgKGRscyAmJiBkbHMtPm1vZHVsZSkKKwkJZGxzID0gZGxzLT5uZXh0OworCWlmICghZGxzKQorI2VuZGlmCisJCWRscyA9IFNETF9jYWxsb2Moc2l6ZW9mKCpkbHMpLDEpOworCXJldHVybiBkbHM7Cit9CisKK3N0YXRpYyBpbnQgcHJvbW90ZUxvY2FsVG9HbG9iYWwoc3RydWN0IGRsc3RhdHVzICpkbHMpCit7CisJc3RhdGljIGludCAoKnApIChOU01vZHVsZSBtb2R1bGUpID0gMDsKKwlkZWJ1ZygicHJvbW90aW5nIik7CisJaWYgKCFwKQorCQlfZHlsZF9mdW5jX2xvb2t1cCgiX19keWxkX05TTWFrZVByaXZhdGVNb2R1bGVQdWJsaWMiLCAodm9pZCAqKikmcCk7CisJcmV0dXJuIChkbHMtPm1vZHVsZSA9PSBNQUdJQ19EWUxJQl9NT0QpIHx8IChwICYmIHAoZGxzLT5tb2R1bGUpKTsKK30KKworc3RhdGljIHZvaWQgKnJlZmVyZW5jZShzdHJ1Y3QgZGxzdGF0dXMgKmRscywgaW50IG1vZGUpCit7CisJaWYgKGRscykKKwl7CisJCWlmIChkbHMtPm1vZHVsZSA9PSBNQUdJQ19EWUxJQl9NT0QgJiYgaXNGbGFnU2V0KG1vZGUsIFJUTERfTE9DQUwpKQorCQl7CisJCQl3YXJuaW5nKCJ0cnlpbmcgdG8gb3BlbiBhIC5keWxpYiB3aXRoIFJUTERfTE9DQUwiKTsKKwkJCWVycm9yKCJ1bmFibGUgdG8gb3BlbiBhIC5keWxpYiB3aXRoIFJUTERfTE9DQUwiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChpc0ZsYWdTZXQobW9kZSwgUlRMRF9HTE9CQUwpICYmCisJCQkhaXNGbGFnU2V0KGRscy0+bW9kZSwgUlRMRF9HTE9CQUwpICYmICFwcm9tb3RlTG9jYWxUb0dsb2JhbChkbHMpKQorCQl7CisJCQllcnJvcigidW5hYmxlIHRvIHByb21vdGUgbG9jYWwgbW9kdWxlIHRvIGdsb2JhbCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZGxzLT5tb2RlIHw9IG1vZGU7CisJCWRscy0+cmVmcysrOworCX0KKwllbHNlCisJCWRlYnVnKCJyZWZlcmVuY2UgY2FsbGVkIHdpdGggTlVMTCBhcmd1bWVudCIpOworCisJcmV0dXJuIGRsczsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqbXlfZmluZF9pbWFnZShjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqbWggPSAwOworCWNvbnN0IGNoYXIgKmlkID0gTlVMTDsKKwlpbnQgaSA9IF9keWxkX2ltYWdlX2NvdW50KCk7CisJaW50IGo7CisJbWggPSAoc3RydWN0IG1hY2hfaGVhZGVyICopCisJCWR5bGRfTlNBZGRJbWFnZShuYW1lLCBOU0FERElNQUdFX09QVElPTl9SRVRVUk5fT05MWV9JRl9MT0FERUQgfAorCQkJCQkJTlNBRERJTUFHRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SKTsKKwlpZiAoIW1oKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJeworCQkJaWQgPSBfZHlsZF9nZXRfaW1hZ2VfbmFtZShqKTsKKwkJCWlmICghU0RMX3N0cmNtcChpZCwgbmFtZSkpCisJCQl7CisJCQkJbWggPSBfZHlsZF9nZXRfaW1hZ2VfaGVhZGVyKGopOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBtaDsKK30KKworLyoKKyAqIGR5bGQgYWRkcyBsaWJyYXJpZXMgYnkgZmlyc3QgYWRkaW5nIHRoZSBkaXJlY3RseSBkZXBlbmRhbnQgbGlicmFyaWVzIGluIGxpbmsgb3JkZXIsIGFuZAorICogdGhlbiBhZGRpbmcgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhvc2UgbGlicmFyaWVzLCBzbyB3ZSBzaG91bGQgZG8gdGhlIHNhbWUuLi4gYnV0IHdlIGRvbid0CisgKiBib3RoZXIgYWRkaW5nIHRoZSBleHRyYSBkZXBlbmRlbmNpZXMsIGlmIHRoZSBzeW1ib2xzIGFyZSBuZWl0aGVyIGluIHRoZSBsb2FkZWQgaW1hZ2Ugbm9yCisgKiBhbnkgb2YgaXQncyBkaXJlY3QgZGVwZW5kZW5jaWVzLCB0aGVuIGl0IHByb2JhYmx5IGlzbid0IHRoZXJlLgorICovCitzdGF0aWMgTlNTeW1ib2wgc2VhcmNoX2xpbmtlZF9saWJzKGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqIG1oLCBjb25zdCBjaGFyICpzeW1ib2wpCit7CisJdW5zaWduZWQgaW50IG47CisJc3RydWN0IGxvYWRfY29tbWFuZCAqbGMgPSAwOworCXN0cnVjdCBtYWNoX2hlYWRlciAqd2g7CisJTlNTeW1ib2wgbnNzeW0gPSAwOworCWlmIChkeWxkX05TQWRkSW1hZ2UgJiYgZHlsZF9OU0lzU3ltYm9sTmFtZURlZmluZWRJbkltYWdlICYmIGR5bGRfTlNMb29rdXBTeW1ib2xJbkltYWdlKQorCXsKKwkJbGMgPSAoc3RydWN0IGxvYWRfY29tbWFuZCAqKSgoY2hhciAqKW1oICsgc2l6ZW9mKHN0cnVjdCBtYWNoX2hlYWRlcikpOworCQlmb3IgKG4gPSAwOyBuIDwgbWgtPm5jbWRzOyBuKyssIGxjID0gKHN0cnVjdCBsb2FkX2NvbW1hbmQgKikoKGNoYXIgKilsYyArIGxjLT5jbWRzaXplKSkKKwkJeworCQkJaWYgKChMQ19MT0FEX0RZTElCID09IGxjLT5jbWQpIHx8IChMQ19MT0FEX1dFQUtfRFlMSUIgPT0gbGMtPmNtZCkpCisJCQl7CisJCQkJaWYgKCh3aCA9IChzdHJ1Y3QgbWFjaF9oZWFkZXIgKikKKwkJCQkJIG15X2ZpbmRfaW1hZ2UoKGNoYXIgKikoKChzdHJ1Y3QgZHlsaWJfY29tbWFuZCAqKWxjKS0+ZHlsaWIubmFtZS5vZmZzZXQgKworCQkJCQkJCQkJCQkoY2hhciAqKWxjKSkpKQorCQkJCXsKKwkJCQkJaWYgKGR5bGRfTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSh3aCwgc3ltYm9sKSkKKwkJCQkJeworCQkJCQkJbnNzeW0gPSBkeWxkX05TTG9va3VwU3ltYm9sSW5JbWFnZSh3aCwKKwkJCQkJCQkJCQkJCQkJICAgc3ltYm9sLAorCQkJCQkJCQkJCQkJCQkgICBOU0xPT0tVUFNZTUJPTElOSU1BR0VfT1BUSU9OX0JJTkQgfAorCQkJCQkJCQkJCQkJCQkgICBOU0xPT0tVUFNZTUJPTElOSU1BR0VfT1BUSU9OX1JFVFVSTl9PTl9FUlJPUik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoKCFuc3N5bSkgJiYgTlNJc1N5bWJvbE5hbWVEZWZpbmVkKHN5bWJvbCkpCisJCXsKKwkJCS8qIEkndmUgbmV2ZXIgc2VlbiB0aGlzIGRlYnVnIG1lc3NhZ2UuLi4qLworCQkJZGVidWcoIlN5bWJvbCBcIiVzXCIgaXMgZGVmaW5lZCBidXQgd2FzIG5vdCBmb3VuZCIsIHN5bWJvbCk7CisJCX0KKwl9CisJcmV0dXJuIG5zc3ltOworfQorCisvKiBVcCB0byB0aGUgY2FsbGVyIHRvIFNETF9mcmVlKCkgcmV0dXJuZWQgc3RyaW5nICovCitzdGF0aWMgaW5saW5lIGNoYXIgKmR5bGRfZXJyb3Jfc3RyKCkKK3sKKwlOU0xpbmtFZGl0RXJyb3JzIGR5bGRlcjsKKwlpbnQgZHlsZGVybm87CisJY29uc3QgY2hhciAqZHlsZGVycnN0cjsKKwljb25zdCBjaGFyICpkeWxkZmlsZTsKKwljaGFyKiByZXRTdHIgPSBOVUxMOworCU5TTGlua0VkaXRFcnJvcigmZHlsZGVyLCAmZHlsZGVybm8sICZkeWxkZmlsZSwgJmR5bGRlcnJzdHIpOworCWlmIChkeWxkZXJyc3RyICYmICpkeWxkZXJyc3RyKQorCXsKKwkJcmV0U3RyID0gU0RMX3N0cmR1cChkeWxkZXJyc3RyKTsKKwl9CisJcmV0dXJuIHJldFN0cjsKK30KKworc3RhdGljIHZvaWQgKmRsc3ltSW50ZXJuKHN0cnVjdCBkbHN0YXR1cyAqZGxzLCBjb25zdCBjaGFyICpzeW1ib2wsIGludCBjYW5TZXRFcnJvcikKK3sKKyAgTlNTeW1ib2wgbnNzeW0gPSAwOworI2lmZGVmIF9fR0NDX18gIAorCXZvaWQgKmNhbGxlciA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygxKTsJLyogQmUgKnZlcnkqIGNhcmVmdWwgYWJvdXQgaW5saW5pbmcgKi8KKyNlbHNlCisJdm9pZCAqY2FsbGVyID0gTlVMTDsKKyNlbmRpZgorCWNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqY2FsbGVyX21oID0gMDsKKwljaGFyICpzYXZlZEVycm9yU3RyID0gTlVMTDsKKwlyZXNldGRsZXJyb3IoKTsKKyNpZm5kZWYgUlRMRF9TRUxGCisjZGVmaW5lCVJUTERfU0VMRgkJKCh2b2lkICopIC0zKQorI2VuZGlmCisJaWYgKE5VTEwgPT0gZGxzKQorCQlkbHMgPSBSVExEX1NFTEY7CisJaWYgKChSVExEX05FWFQgPT0gZGxzKSB8fCAoUlRMRF9TRUxGID09IGRscykpCisJeworCQlpZiAoZHlsZF9OU0lzU3ltYm9sTmFtZURlZmluZWRJbkltYWdlICYmIGR5bGRfTlNMb29rdXBTeW1ib2xJbkltYWdlICYmIGNhbGxlcikKKwkJICB7CisJCQljYWxsZXJfbWggPSBpbWFnZV9mb3JfYWRkcmVzcyhjYWxsZXIpOworCQkJaWYgKFJUTERfU0VMRiA9PSBkbHMpCisJCQl7CisJCQkJLyogRklYTUU6IFdlIHNob3VsZCBiZSB1c2luZyB0aGUgTlNNb2R1bGUgYXBpLCBpZiBTRUxGIGlzIGFuIE1IX0JVTkRMRQorCQkJCSAqIEJ1dCBpdCBhcHBlYXJzIHRvIHdvcmsgYW55d2F5LCBhbmQgbG9va2luZyBhdCB0aGUgY29kZSBpbiBkeWxkX2xpYmZ1bmNzLmMKKwkJCQkgKiB0aGlzIGlzIGFjY2VwdGFibGUuCisJCQkJICovCisJCQkJaWYgKGR5bGRfTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZShjYWxsZXJfbWgsIHN5bWJvbCkpCisJCQkJeworCQkJCQluc3N5bSA9IGR5bGRfTlNMb29rdXBTeW1ib2xJbkltYWdlKGNhbGxlcl9taCwKKwkJCQkJCQkJCQkJCQkgICBzeW1ib2wsCisJCQkJCQkJCQkJCQkJICAgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9CSU5EIHwKKwkJCQkJCQkJCQkJCQkgICBOU0xPT0tVUFNZTUJPTElOSU1BR0VfT1BUSU9OX1JFVFVSTl9PTl9FUlJPUik7CisJCQkJfQorCQkJfQorCQkJaWYgKCFuc3N5bSkKKwkJCXsKKwkJCQlpZiAoUlRMRF9TRUxGID09IGRscykKKwkJCQkJc2F2ZWRFcnJvclN0ciA9IGR5bGRfZXJyb3Jfc3RyKCk7CisJCQkJbnNzeW0gPSBzZWFyY2hfbGlua2VkX2xpYnMoY2FsbGVyX21oLCBzeW1ib2wpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKGNhblNldEVycm9yKQorCQkJCWVycm9yKCJSVExEX1NFTEYgYW5kIFJUTERfTkVYVCBhcmUgbm90IHN1cHBvcnRlZCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKCFuc3N5bSkKKwl7CisKKwkJaWYgKFJUTERfREVGQVVMVCA9PSBkbHMpCisJCXsKKwkJCWRscyA9ICZtYWluU3RhdHVzOworCQl9CisJCWlmICghaXNWYWxpZFN0YXR1cyhkbHMpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKGRscy0+bW9kdWxlICE9IE1BR0lDX0RZTElCX01PRCkKKwkJeworCQkJbnNzeW0gPSBOU0xvb2t1cFN5bWJvbEluTW9kdWxlKGRscy0+bW9kdWxlLCBzeW1ib2wpOworCQkJaWYgKCFuc3N5bSAmJiBOU0lzU3ltYm9sTmFtZURlZmluZWQoc3ltYm9sKSkKKwkJCXsKKwkJCQlkZWJ1ZygiU2VhcmNoaW5nIGRlcGVuZGVuY2llcyIpOworCQkJCXNhdmVkRXJyb3JTdHIgPSBkeWxkX2Vycm9yX3N0cigpOworCQkJCW5zc3ltID0gc2VhcmNoX2xpbmtlZF9saWJzKGdldF9tYWNoX2hlYWRlcl9mcm9tX05TTW9kdWxlKGRscy0+bW9kdWxlKSwgc3ltYm9sKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChkbHMtPmxpYiAmJiBkeWxkX05TSXNTeW1ib2xOYW1lRGVmaW5lZEluSW1hZ2UgJiYgZHlsZF9OU0xvb2t1cFN5bWJvbEluSW1hZ2UpCisJCXsKKwkJCWlmIChkeWxkX05TSXNTeW1ib2xOYW1lRGVmaW5lZEluSW1hZ2UoZGxzLT5saWIsIHN5bWJvbCkpCisJCQl7CisJCQkJbnNzeW0gPSBkeWxkX05TTG9va3VwU3ltYm9sSW5JbWFnZShkbHMtPmxpYiwKKwkJCQkJCQkJCQkJCSAgIHN5bWJvbCwKKwkJCQkJCQkJCQkJCSAgIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fQklORCB8CisJCQkJCQkJCQkJCQkgICBOU0xPT0tVUFNZTUJPTElOSU1BR0VfT1BUSU9OX1JFVFVSTl9PTl9FUlJPUik7CisJCQl9CisJCQllbHNlIGlmIChOU0lzU3ltYm9sTmFtZURlZmluZWQoc3ltYm9sKSkKKwkJCXsKKwkJCQlkZWJ1ZygiU2VhcmNoaW5nIGRlcGVuZGVuY2llcyIpOworCQkJCXNhdmVkRXJyb3JTdHIgPSBkeWxkX2Vycm9yX3N0cigpOworCQkJCW5zc3ltID0gc2VhcmNoX2xpbmtlZF9saWJzKGRscy0+bGliLCBzeW1ib2wpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGRscy0+bW9kdWxlID09IE1BR0lDX0RZTElCX01PRCkKKwkJeworCQkJLyogR2xvYmFsIGNvbnRleHQsIHVzZSBOU0xvb2t1cEFuZEJpbmRTeW1ib2wgKi8KKwkJCWlmIChOU0lzU3ltYm9sTmFtZURlZmluZWQoc3ltYm9sKSkKKwkJCXsKKwkJCQkvKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSByZXR1cm4gb24gZXJyb3Igb3B0aW9uIGZvciB0aGlzIGNhbGw/Pz8KKwkJCQkgICB0aGlzIGlzIHBvdGVudGlhbGx5IGJyb2tlbiwgaWYgYmluZGluZyBmYWlscywgaXQgd2lsbCBpbXByb3Blcmx5CisJCQkJICAgZXhpdCB0aGUgYXBwbGljYXRpb24uICovCisJCQkJbnNzeW0gPSBOU0xvb2t1cEFuZEJpbmRTeW1ib2woc3ltYm9sKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoc2F2ZWRFcnJvclN0cikKKwkJCQkJU0RMX2ZyZWUoc2F2ZWRFcnJvclN0cik7CQkJCisJCQkJc2F2ZWRFcnJvclN0ciA9IFNETF9tYWxsb2MoMjU2KTsKKwkJCQlTRExfc25wcmludGYoc2F2ZWRFcnJvclN0ciwgMjU2LCAiU3ltYm9sIFwiJXNcIiBub3QgaW4gZ2xvYmFsIGNvbnRleHQiLHN5bWJvbCk7CQorCQkJfQorCQl9CisJfQorCS8qIEVycm9yIHJlcG9ydGluZyAqLworCWlmICghbnNzeW0pCisJeworCQlpZiAoIXNhdmVkRXJyb3JTdHIgfHwgIVNETF9zdHJsZW4oc2F2ZWRFcnJvclN0cikpCisJCXsKKwkJCWlmIChzYXZlZEVycm9yU3RyKQorCQkJCVNETF9mcmVlKHNhdmVkRXJyb3JTdHIpOworCQkJc2F2ZWRFcnJvclN0ciA9IFNETF9tYWxsb2MoMjU2KTsKKwkJCVNETF9zbnByaW50ZihzYXZlZEVycm9yU3RyLCAyNTYsIlN5bWJvbCBcIiVzXCIgbm90IGZvdW5kIixzeW1ib2wpOworCQl9CisJCWlmIChjYW5TZXRFcnJvcikKKwkJeworCQkJZXJyb3Ioc2F2ZWRFcnJvclN0cik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkZWJ1ZyhzYXZlZEVycm9yU3RyKTsKKwkJfQorCQlpZiAoc2F2ZWRFcnJvclN0cikKKwkJCVNETF9mcmVlKHNhdmVkRXJyb3JTdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIE5TQWRkcmVzc09mU3ltYm9sKG5zc3ltKTsKK30KKworc3RhdGljIHN0cnVjdCBkbHN0YXR1cyAqbG9hZE1vZHVsZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqc2J1ZiwgaW50IG1vZGUpCit7CisJTlNPYmplY3RGaWxlSW1hZ2Ugb2ZpID0gMDsKKwlOU09iamVjdEZpbGVJbWFnZVJldHVybkNvZGUgb2ZpcmM7CisJc3RydWN0IGRsc3RhdHVzICpkbHM7CisJTlNMaW5rRWRpdEVycm9ycyBsZXI7CisJaW50IGxlcm5vOworCWNvbnN0IGNoYXIgKmVycnN0cjsKKwljb25zdCBjaGFyICpmaWxlOworCXZvaWQgKCppbml0KSAodm9pZCk7CisKKwlvZmlyYyA9IE5TQ3JlYXRlT2JqZWN0RmlsZUltYWdlRnJvbUZpbGUocGF0aCwgJm9maSk7CisJc3dpdGNoIChvZmlyYykKKwl7CisJCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VTdWNjZXNzOgorCQkJYnJlYWs7CisJCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VJbmFwcHJvcHJpYXRlRmlsZToKKwkJCWlmIChkeWxkX05TQWRkSW1hZ2UgJiYgZHlsZF9OU0lzU3ltYm9sTmFtZURlZmluZWRJbkltYWdlICYmIGR5bGRfTlNMb29rdXBTeW1ib2xJbkltYWdlKQorCQkJewkKKwkJCQlpZiAoaXNGbGFnU2V0KG1vZGUsIFJUTERfTE9DQUwpKQorCQkJCXsKKwkJCQkJd2FybmluZygidHJ5aW5nIHRvIG9wZW4gYSAuZHlsaWIgd2l0aCBSVExEX0xPQ0FMIik7CisJCQkJCWVycm9yKCJ1bmFibGUgdG8gb3BlbiB0aGlzIGZpbGUgd2l0aCBSVExEX0xPQ0FMIik7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllcnJvcigib3BlbmluZyB0aGlzIGZpbGUgaXMgdW5zdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0iKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlRmFpbHVyZToKKwkJCWVycm9yKCJvYmplY3QgZmlsZSBzZXR1cCBmYWlsdXJlIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJY2FzZSBOU09iamVjdEZpbGVJbWFnZUFyY2g6CisJCQllcnJvcigibm8gb2JqZWN0IGZvciB0aGlzIGFyY2hpdGVjdHVyZSIpOworCQkJcmV0dXJuIE5VTEw7CisJCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VGb3JtYXQ6CisJCQllcnJvcigiYmFkIG9iamVjdCBmaWxlIGZvcm1hdCIpOworCQkJcmV0dXJuIE5VTEw7CisJCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VBY2Nlc3M6CisJCQllcnJvcigiY2FuJ3QgcmVhZCBvYmplY3QgZmlsZSIpOworCQkJcmV0dXJuIE5VTEw7CisJCWRlZmF1bHQ6CisJCQllcnJvcigidW5rbm93biBlcnJvciBmcm9tIE5TQ3JlYXRlT2JqZWN0RmlsZUltYWdlRnJvbUZpbGUoKSIpOworCQkJcmV0dXJuIE5VTEw7CisJfQorCWRscyA9IGxvb2t1cFN0YXR1cyhzYnVmKTsKKwlpZiAoIWRscykKKwl7CisJCWRscyA9IGFsbG9jU3RhdHVzKCk7CisJfQorCWlmICghZGxzKQorCXsKKwkJZXJyb3IoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vCWRscy0+bGliID0gMDsKKwlpZiAob2ZpcmMgPT0gTlNPYmplY3RGaWxlSW1hZ2VJbmFwcHJvcHJpYXRlRmlsZSkKKwl7CisJCWlmICgoZGxzLT5saWIgPSBkeWxkX05TQWRkSW1hZ2UocGF0aCwgTlNBRERJTUFHRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SKSkpCisJCXsKKwkJCWRlYnVnKCJEeW5hbWljIGxpYiBsb2FkZWQgYXQgJWxkIiwgZGxzLT5saWIpOworCQkJb2ZpID0gTUFHSUNfRFlMSUJfT0ZJOworCQkJZGxzLT5tb2R1bGUgPSBNQUdJQ19EWUxJQl9NT0Q7CisJCQlvZmlyYyA9IE5TT2JqZWN0RmlsZUltYWdlU3VjY2VzczsKKwkJCS8qIEFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHdpdGggYSBiaXQgb2Ygd29yayB0byBtb2RpZnkgdGhpcyBzbyBpdCB3b3JrcyBhbmQKKwkJCSAgIGZ1bmN0aW9ucyB3aXRoIFJUTERfTk9XLCBJIGRvbid0IGRlZW0gaXQgbmVjZXNzYXJ5IGF0IHRoZSBtb21lbnQgKi8KKwkJfQorCQlpZiAoIShkbHMtPm1vZHVsZSkpCisJCXsKKwkJCU5TTGlua0VkaXRFcnJvcigmbGVyLCAmbGVybm8sICZmaWxlLCAmZXJyc3RyKTsKKwkJCWlmICghZXJyc3RyIHx8ICghU0RMX3N0cmxlbihlcnJzdHIpKSkKKwkJCQllcnJvcigiQ2FuJ3Qgb3BlbiB0aGlzIGZpbGUgdHlwZSIpOworCQkJZWxzZQorCQkJCWVycm9yKGVycnN0cik7CisJCQlpZiAoKGRscy0+ZmxhZ3MgJiBETF9JTl9MSVNUKSA9PSAwKQorCQkJeworCQkJCVNETF9mcmVlKGRscyk7CisJCQl9CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwllbHNlCisJeworCQlkbHMtPm1vZHVsZSA9IE5TTGlua01vZHVsZShvZmksIHBhdGgsCisJCQkJCQkJCSAgIE5TTElOS01PRFVMRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SIHwKKwkJCQkJCQkJICAgTlNMSU5LTU9EVUxFX09QVElPTl9QUklWQVRFIHwKKwkJCQkJCQkJICAgKGlzRmxhZ1NldChtb2RlLCBSVExEX05PVykgPyBOU0xJTktNT0RVTEVfT1BUSU9OX0JJTkROT1cgOiAwKSk7CisJCU5TRGVzdHJveU9iamVjdEZpbGVJbWFnZShvZmkpOworCQlpZiAoZGxzLT5tb2R1bGUpCisJCXsKKwkJCWRscy0+bGliID0gZ2V0X21hY2hfaGVhZGVyX2Zyb21fTlNNb2R1bGUoZGxzLT5tb2R1bGUpOworCQl9CisJfQorCWlmICghZGxzLT5tb2R1bGUpCisJeworCQlOU0xpbmtFZGl0RXJyb3IoJmxlciwgJmxlcm5vLCAmZmlsZSwgJmVycnN0cik7CisJCWlmICgoZGxzLT5mbGFncyAmIERMX0lOX0xJU1QpID09IDApCisJCXsKKwkJCVNETF9mcmVlKGRscyk7CisJCX0KKwkJZXJyb3IoZXJyc3RyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaW5zZXJ0U3RhdHVzKGRscywgc2J1Zik7CisJZGxzID0gcmVmZXJlbmNlKGRscywgbW9kZSk7CisJaWYgKChpbml0ID0gZGxzeW1JbnRlcm4oZGxzLCAiX19pbml0IiwgMCkpKQorCXsKKwkJZGVidWcoImNhbGxpbmcgX2luaXQoKSIpOworCQlpbml0KCk7CisJfQorCXJldHVybiBkbHM7Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBkbGNvbXBhdF9pbml0X2NoZWNrKHZvaWQpCit7CisJc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBsID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKwlzdGF0aWMgaW50IGluaXRfZG9uZSA9IDA7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmwpOworCWlmICghaW5pdF9kb25lKSB7CisJCWRsY29tcGF0X2luaXRfZnVuYygpOworCQlpbml0X2RvbmUgPSAxOworCX0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmbCk7Cit9CisKK3N0YXRpYyB2b2lkIGRsY29tcGF0X2luaXRfZnVuYyh2b2lkKQoreworICAgICAgICBfZHlsZF9mdW5jX2xvb2t1cCgiX19keWxkX05TQWRkSW1hZ2UiLCAodm9pZCAqKikmZHlsZF9OU0FkZEltYWdlKTsKKwlfZHlsZF9mdW5jX2xvb2t1cCgiX19keWxkX05TSXNTeW1ib2xOYW1lRGVmaW5lZEluSW1hZ2UiLAorCQkJICAodm9pZCAqKikmZHlsZF9OU0lzU3ltYm9sTmFtZURlZmluZWRJbkltYWdlKTsKKwlfZHlsZF9mdW5jX2xvb2t1cCgiX19keWxkX05TTG9va3VwU3ltYm9sSW5JbWFnZSIsICh2b2lkICoqKSZkeWxkX05TTG9va3VwU3ltYm9sSW5JbWFnZSk7CisJaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdCgmZGxjb21wYXRfbXV0ZXgsIE5VTEwpKQorCSAgICBleGl0KDEpOworCWlmIChwdGhyZWFkX2tleV9jcmVhdGUoJmRsZXJyb3Jfa2V5LCAmZGxlcnJvcmZyZWUpKQorCSAgICBleGl0KDEpOworfQorCitzdGF0aWMgdm9pZCByZXNldGRsZXJyb3IoKQoreworCXN0cnVjdCBkbHRocmVhZCAqdHNzOworCXRzcyA9IHB0aHJlYWRfZ2V0c3BlY2lmaWMoZGxlcnJvcl9rZXkpOworCXRzcy0+ZXJyc2V0ID0gMDsKK30KKworc3RhdGljIHZvaWQgZGxlcnJvcmZyZWUodm9pZCAqZGF0YSkKK3sKKwlTRExfZnJlZShkYXRhKTsKK30KKworLyogV2Uga2luZCBvZiB3YW50IGEgcmVjdXJzaXZlIGxvY2sgaGVyZSwgYnV0IG1lZXQgYSBsaXR0bGUgdHJvdWJsZQorICogYmVjYXVzZSB0aGV5IGFyZSBub3QgYXZhaWxhYmxlIHByZSBPUyBYIDEwLjIsIHNvIHdlIGZha2UgaXQKKyAqIHVzaW5nIHRocmVhZCBzcGVjaWZpYyBzdG9yYWdlIHRvIGtlZXAgYSBsb2NrIGNvdW50CisgKi8gCitzdGF0aWMgaW5saW5lIHZvaWQgZG9sb2NrKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGRsdGhyZWFkICp0c3M7CisJZGxjb21wYXRfaW5pdF9jaGVjaygpOworCXRzcyA9IHB0aHJlYWRfZ2V0c3BlY2lmaWMoZGxlcnJvcl9rZXkpOworCWlmICghdHNzKQorCXsKKwkJdHNzID0gU0RMX21hbGxvYyhzaXplb2Yoc3RydWN0IGRsdGhyZWFkKSk7CisJCXRzcy0+bG9ja2NudCA9IDA7CisJCXRzcy0+ZXJyc2V0ID0gMDsKKwkJaWYgKHB0aHJlYWRfc2V0c3BlY2lmaWMoZGxlcnJvcl9rZXksIHRzcykpCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCJkbGNvbXBhdDogcHRocmVhZF9zZXRzcGVjaWZpYyBmYWlsZWRcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKwlpZiAoIXRzcy0+bG9ja2NudCkKKwkJZXJyID0gcHRocmVhZF9tdXRleF9sb2NrKCZkbGNvbXBhdF9tdXRleCk7CisJdHNzLT5sb2NrY250ID0gdHNzLT5sb2NrY250ICsxOwkKKwlpZiAoZXJyKQorCQlleGl0KGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb3VubG9jayh2b2lkKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBkbHRocmVhZCAqdHNzOworCXRzcyA9IHB0aHJlYWRfZ2V0c3BlY2lmaWMoZGxlcnJvcl9rZXkpOworCXRzcy0+bG9ja2NudCA9IHRzcy0+bG9ja2NudCAtMTsKKwlpZiAoIXRzcy0+bG9ja2NudCkKKwkJZXJyID0gcHRocmVhZF9tdXRleF91bmxvY2soJmRsY29tcGF0X211dGV4KTsKKwlpZiAoZXJyKQorCQlleGl0KGVycik7Cit9CisKK3N0YXRpYyB2b2lkICpTRExfT1NYX2Rsb3Blbihjb25zdCBjaGFyICpwYXRoLCBpbnQgbW9kZSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3RhdCAqc2J1ZjsKKwlzdHJ1Y3QgZGxzdGF0dXMgKmRsczsKKwljb25zdCBjaGFyICpmdWxsUGF0aDsKKworCWRvbG9jaygpOworCXJlc2V0ZGxlcnJvcigpOworCWlmICghcGF0aCkKKwl7CisJCWRscyA9ICZtYWluU3RhdHVzOworCQlnb3RvIGRsb3Blbm9rOworCX0KKwlpZiAoIShzYnVmID0gZmluZEZpbGUocGF0aCwgJmZ1bGxQYXRoKSkpCisJeworCQllcnJvcigiZmlsZSBcIiVzXCIgbm90IGZvdW5kIiwgcGF0aCk7CisJCWdvdG8gZGxvcGVuZXJyb3I7CisJfQorCS8qIE5vdyBjaGVja3MgdGhhdCBpdCBoYXNuJ3QgYmVlbiBjbG9zZWQgYWxyZWFkeSAqLworCWlmICgoZGxzID0gbG9va3VwU3RhdHVzKHNidWYpKSAmJiAoZGxzLT5yZWZzID4gMCkpCisJeworCQkvKiBkZWJ1Zygic3RhdHVzIGZvdW5kIik7ICovCisJCWRscyA9IHJlZmVyZW5jZShkbHMsIG1vZGUpOworCQlnb3RvIGRsb3Blbm9rOworCX0KKyNpZmRlZiAJUlRMRF9OT0xPQUQKKwlpZiAoaXNGbGFnU2V0KG1vZGUsIFJUTERfTk9MT0FEKSkKKwl7CisJCWVycm9yKCJubyBleGlzdGluZyBoYW5kbGUgYW5kIFJUTERfTk9MT0FEIHNwZWNpZmllZCIpOworCQlnb3RvIGRsb3BlbmVycm9yOworCX0KKyNlbmRpZgorCWlmIChpc0ZsYWdTZXQobW9kZSwgUlRMRF9MQVpZKSAmJiBpc0ZsYWdTZXQobW9kZSwgUlRMRF9OT1cpKQorCXsKKwkJZXJyb3IoImhvdyBjYW4gSSBsb2FkIHNvbWV0aGluZyBib3RoIFJUTERfTEFaWSBhbmQgUlRMRF9OT1c/Iik7CisJCWdvdG8gZGxvcGVuZXJyb3I7CisJfQorCWRscyA9IGxvYWRNb2R1bGUoZnVsbFBhdGgsIHNidWYsIG1vZGUpOworCQorICBkbG9wZW5vazoKKwlkb3VubG9jaygpOworCXJldHVybiAodm9pZCAqKWRsczsKKyAgZGxvcGVuZXJyb3I6CisJZG91bmxvY2soKTsKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmICFGSU5LX0JVSUxECitzdGF0aWMgdm9pZCAqU0RMX09TWF9kbHN5bSh2b2lkICogZGxfcmVzdHJpY3QgaGFuZGxlLCBjb25zdCBjaGFyICogZGxfcmVzdHJpY3Qgc3ltYm9sKQoreworCWludCBzeW1fbGVuID0gU0RMX3N0cmxlbihzeW1ib2wpOworCXZvaWQgKnZhbHVlID0gTlVMTDsKKwljaGFyICptYWxsb2Nfc3ltID0gTlVMTDsKKwlkb2xvY2soKTsKKwltYWxsb2Nfc3ltID0gU0RMX21hbGxvYyhzeW1fbGVuICsgMik7CisJaWYgKG1hbGxvY19zeW0pCisJeworCQlTRExfc25wcmludGYobWFsbG9jX3N5bSwgc3ltX2xlbisyLCAiXyVzIiwgc3ltYm9sKTsKKwkJdmFsdWUgPSBkbHN5bUludGVybihoYW5kbGUsIG1hbGxvY19zeW0sIDEpOworCQlTRExfZnJlZShtYWxsb2Nfc3ltKTsKKwl9CisJZWxzZQorCXsKKwkJZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJZ290byBkbHN5bWVycm9yOworCX0KKwlkb3VubG9jaygpOworCXJldHVybiB2YWx1ZTsKKyAgZGxzeW1lcnJvcjoKKwlkb3VubG9jaygpOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZiBGSU5LX0JVSUxECisKK3N0YXRpYyB2b2lkICpkbHN5bV9wcmVwZW5kX3VuZGVyc2NvcmUodm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpzeW1ib2wpCit7CisJdm9pZCAqYW5zd2VyOworCWRvbG9jaygpOworCWFuc3dlciA9IGRsc3ltX3ByZXBlbmRfdW5kZXJzY29yZV9pbnRlcm4oaGFuZGxlLCBzeW1ib2wpOworCWRvdW5sb2NrKCk7CisJcmV0dXJuIGFuc3dlcjsKK30KKworc3RhdGljIHZvaWQgKmRsc3ltX3ByZXBlbmRfdW5kZXJzY29yZV9pbnRlcm4odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpzeW1ib2wpCit7CisvKgorICoJQSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHBvcnRpbmcgcGFja2FnZXMgd2hpY2ggY2FsbCBkbHN5bShoYW5kbGUsInN5bSIpCisgKglJZiB0aGUgcG9ydGVyIGFkZHMgLURkbHN5bT1kbHN5bV9wcmVwZW5kX3VuZGVyc2NvcmUgdG8gdGhlIENGTEFHUyB0aGVuCisgKgl0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkLCBhbmQgd2lsbCBhZGQgdGhlIHJlcXVpcmVkIHVuZGVyc2NvcmUuCisgKgkKKyAqCU5vdGUgdGhhdCBJIGhhdmVuJ3QgZmlndXJlZCBvdXQgeWV0IHdoaWNoIHNob3VsZCBiZSAic3RhbmRhcmQiLCBwcmVwZW5kCisgKgl0aGUgdW5kZXJzY29yZSBhbHdheXMsIG9yIG5vdCBhdCBhbGwuIFRoZXNlIGdsb2JhbCBmdW5jdGlvbnMgbmVlZCB0byBnbyBhd2F5CisgKglmb3Igb3BlbmRhcndpbi4KKyAqLworCWludCBzeW1fbGVuID0gU0RMX3N0cmxlbihzeW1ib2wpOworCXZvaWQgKnZhbHVlID0gTlVMTDsKKwljaGFyICptYWxsb2Nfc3ltID0gTlVMTDsKKwltYWxsb2Nfc3ltID0gU0RMX21hbGxvYyhzeW1fbGVuICsgMik7CisJaWYgKG1hbGxvY19zeW0pCisJeworCQlTRExfc25wcmludGYobWFsbG9jX3N5bSwgc3ltX2xlbisyLCAiXyVzIiwgc3ltYm9sKTsKKwkJdmFsdWUgPSBkbHN5bUludGVybihoYW5kbGUsIG1hbGxvY19zeW0sIDEpOworCQlTRExfZnJlZShtYWxsb2Nfc3ltKTsKKwl9CisJZWxzZQorCXsKKwkJZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKwl9CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCAqZGxzeW1fYXV0b191bmRlcnNjb3JlKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKQoreworCXZvaWQgKmFuc3dlcjsKKwlkb2xvY2soKTsKKwlhbnN3ZXIgPSBkbHN5bV9hdXRvX3VuZGVyc2NvcmVfaW50ZXJuKGhhbmRsZSwgc3ltYm9sKTsKKwlkb3VubG9jaygpOworCXJldHVybiBhbnN3ZXI7CisKK30KK3N0YXRpYyB2b2lkICpkbHN5bV9hdXRvX3VuZGVyc2NvcmVfaW50ZXJuKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKQoreworCXN0cnVjdCBkbHN0YXR1cyAqZGxzID0gaGFuZGxlOworCXZvaWQgKmFkZHIgPSAwOworCWFkZHIgPSBkbHN5bUludGVybihkbHMsIHN5bWJvbCwgMCk7CisJaWYgKCFhZGRyKQorCQlhZGRyID0gZGxzeW1fcHJlcGVuZF91bmRlcnNjb3JlX2ludGVybihoYW5kbGUsIHN5bWJvbCk7CisJcmV0dXJuIGFkZHI7Cit9CisKKworc3RhdGljIHZvaWQgKlNETF9PU1hfZGxzeW0odm9pZCAqIGRsX3Jlc3RyaWN0IGhhbmRsZSwgY29uc3QgY2hhciAqIGRsX3Jlc3RyaWN0IHN5bWJvbCkKK3sKKwlzdHJ1Y3QgZGxzdGF0dXMgKmRscyA9IGhhbmRsZTsKKwl2b2lkICphZGRyID0gMDsKKwlkb2xvY2soKTsKKwlhZGRyID0gZGxzeW1JbnRlcm4oZGxzLCBzeW1ib2wsIDEpOworCWRvdW5sb2NrKCk7CisJcmV0dXJuIGFkZHI7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBTRExfT1NYX2RsY2xvc2Uodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBkbHN0YXR1cyAqZGxzID0gaGFuZGxlOworCWRvbG9jaygpOworCXJlc2V0ZGxlcnJvcigpOworCWlmICghaXNWYWxpZFN0YXR1cyhkbHMpKQorCXsKKwkJZ290byBkbGNsb3NlZXJyb3I7CisJfQorCWlmIChkbHMtPm1vZHVsZSA9PSBNQUdJQ19EWUxJQl9NT0QpCisJeworCQljb25zdCBjaGFyICpuYW1lOworCQlpZiAoIWRscy0+bGliKQorCQl7CisJCQluYW1lID0gImdsb2JhbCBjb250ZXh0IjsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5hbWUgPSBnZXRfbGliX25hbWUoZGxzLT5saWIpOworCQl9CisJCXdhcm5pbmcoInRyeWluZyB0byBjbG9zZSBhIC5keWxpYiEiKTsKKwkJZXJyb3IoIk5vdCBjbG9zaW5nIFwiJXNcIiAtIGR5bmFtaWMgbGlicmFyaWVzIGNhbm5vdCBiZSBjbG9zZWQiLCBuYW1lKTsKKwkJZ290byBkbGNsb3NlZXJyb3I7CisJfQorCWlmICghZGxzLT5tb2R1bGUpCisJeworCQllcnJvcigibW9kdWxlIGFscmVhZHkgY2xvc2VkIik7CisJCWdvdG8gZGxjbG9zZWVycm9yOworCX0KKwkKKwlpZiAoZGxzLT5yZWZzID09IDEpCisJeworCQl1bnNpZ25lZCBsb25nIG9wdGlvbnMgPSAwOworCQl2b2lkICgqZmluaSkgKHZvaWQpOworCQlpZiAoKGZpbmkgPSBkbHN5bUludGVybihkbHMsICJfX2ZpbmkiLCAwKSkpCisJCXsKKwkJCWRlYnVnKCJjYWxsaW5nIF9maW5pKCkiKTsKKwkJCWZpbmkoKTsKKwkJfQorCQlvcHRpb25zIHw9IE5TVU5MSU5LTU9EVUxFX09QVElPTl9SRVNFVF9MQVpZX1JFRkVSRU5DRVM7CisjaWZkZWYgUlRMRF9OT0RFTEVURQorCQlpZiAoaXNGbGFnU2V0KGRscy0+bW9kZSwgUlRMRF9OT0RFTEVURSkpCisJCQlvcHRpb25zIHw9IE5TVU5MSU5LTU9EVUxFX09QVElPTl9LRUVQX01FTU9SWV9NQVBQRUQ7CisjZW5kaWYKKwkJaWYgKCFOU1VuTGlua01vZHVsZShkbHMtPm1vZHVsZSwgb3B0aW9ucykpCisJCXsKKwkJCWVycm9yKCJ1bmFibGUgdG8gdW5saW5rIG1vZHVsZSIpOworCQkJZ290byBkbGNsb3NlZXJyb3I7CisJCX0KKwkJZGxzLT5yZWZzLS07CisJCWRscy0+bW9kdWxlID0gMDsKKwkJLyogTm90ZTogdGhlIGRsc3RhdHVzIHN0cnVjdCBkbHMgaXMgbmVpdGhlciByZW1vdmVkIGZyb20gdGhlIGxpc3QKKwkJICogbm9yIGlzIHRoZSBtZW1vcnkgaXQgb2NjdXBpZXMgZnJlZWQuIFRoaXMgc2hvdWxkbid0IHBvc2UgYSAKKwkJICogcHJvYmxlbSBpbiBtb3N0bHkgYWxsIGNhc2VzLCB0aG91Z2guCisJCSAqLworCX0KKwlkb3VubG9jaygpOworCXJldHVybiAwOworICBkbGNsb3NlZXJyb3I6CisJZG91bmxvY2soKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKlNETF9PU1hfZGxlcnJvcih2b2lkKQoreworCXN0cnVjdCBkbHRocmVhZCAgKnRzczsKKwljb25zdCBjaGFyICogZXJyX3N0ciA9IE5VTEw7CisJZGxjb21wYXRfaW5pdF9jaGVjaygpOworCXRzcyA9IHB0aHJlYWRfZ2V0c3BlY2lmaWMoZGxlcnJvcl9rZXkpOworCWlmICh0c3MgIT0gTlVMTCAmJiB0c3MtPmVycnNldCAhPSAwKSB7CisJCXRzcy0+ZXJyc2V0ID0gMDsJCisJCWVycl9zdHIgPSB0c3MtPmVycnN0cjsKKwl9CisJcmV0dXJuIChlcnJfc3RyKTsKK30KKworLyogR2l2ZW4gYW4gYWRkcmVzcywgcmV0dXJuIHRoZSBtYWNoX2hlYWRlciBmb3IgdGhlIGltYWdlIGNvbnRhaW5pbmcgaXQKKyAqIG9yIHplcm8gaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgbm90IGNvbnRhaW5lZCBpbiBhbnkgbG9hZGVkIGltYWdlcy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqaW1hZ2VfZm9yX2FkZHJlc3MoY29uc3Qgdm9pZCAqYWRkcmVzcykKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgY291bnQgPSBfZHlsZF9pbWFnZV9jb3VudCgpOworCWNvbnN0IHN0cnVjdCBtYWNoX2hlYWRlciAqbWggPSAwOworCXN0cnVjdCBsb2FkX2NvbW1hbmQgKmxjID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCXsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKWFkZHJlc3MgLSBfZHlsZF9nZXRfaW1hZ2Vfdm1hZGRyX3NsaWRlKGkpOworCQltaCA9IF9keWxkX2dldF9pbWFnZV9oZWFkZXIoaSk7CisJCWlmIChtaCkKKwkJeworCQkJbGMgPSAoc3RydWN0IGxvYWRfY29tbWFuZCAqKSgoY2hhciAqKW1oICsgc2l6ZW9mKHN0cnVjdCBtYWNoX2hlYWRlcikpOworCQkJZm9yIChqID0gMDsgaiA8IG1oLT5uY21kczsgaisrLCBsYyA9IChzdHJ1Y3QgbG9hZF9jb21tYW5kICopKChjaGFyICopbGMgKyBsYy0+Y21kc2l6ZSkpCisJCQl7CisJCQkJaWYgKExDX1NFR01FTlQgPT0gbGMtPmNtZCAmJgorCQkJCQlhZGRyID49ICgoc3RydWN0IHNlZ21lbnRfY29tbWFuZCAqKWxjKS0+dm1hZGRyICYmCisJCQkJCWFkZHIgPAorCQkJCQkoKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQgKilsYyktPnZtYWRkciArICgoc3RydWN0IHNlZ21lbnRfY29tbWFuZCAqKWxjKS0+dm1zaXplKQorCQkJCXsKKwkJCQkJZ290byBpbWFnZV9mb3VuZDsKKwkJCQl9CisJCQl9CisJCX0KKwkJbWggPSAwOworCX0KKyAgaW1hZ2VfZm91bmQ6CisJcmV0dXJuIG1oOworfQorCisjaWYgMCAvKiB1bnVzZWQgKi8KK3N0YXRpYyBpbnQgU0RMX09TWF9kbGFkZHIoY29uc3Qgdm9pZCAqIGRsX3Jlc3RyaWN0IHAsIFNETF9PU1hfRGxfaW5mbyAqIGRsX3Jlc3RyaWN0IGluZm8pCit7CisvKgorCUZJWE1FOiBVU2UgdGhlIHJvdXRpbmUgaW1hZ2VfZm9yX2FkZHJlc3MuCisqLworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIGo7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IF9keWxkX2ltYWdlX2NvdW50KCk7CisJc3RydWN0IG1hY2hfaGVhZGVyICptaCA9IDA7CisJc3RydWN0IGxvYWRfY29tbWFuZCAqbGMgPSAwOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyB0YWJsZV9vZmYgPSAodW5zaWduZWQgbG9uZykwOworCWludCBmb3VuZCA9IDA7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gMDsKKwlkb2xvY2soKTsKKwlyZXNldGRsZXJyb3IoKTsKKwlpbmZvLT5kbGlfZm5hbWUgPSAwOworCWluZm8tPmRsaV9mYmFzZSA9IDA7CisJaW5mby0+ZGxpX3NuYW1lID0gMDsKKwlpbmZvLT5kbGlfc2FkZHIgPSAwOworLyogU29tZSBvZiB0aGlzIHdhcyBzd2lwZWQgZnJvbSBjb2RlIHBvc3RlZCBieSBEb3VnbGFzIERhdmlkc29uIDxkZGF2aWRzbyBBVCBhcHBsZSBET1QgY29tPgorICogdG8gZGFyd2luLWRldmVsb3BtZW50IEFUIGxpc3RzIERPVCBhcHBsZSBET1QgY29tIGFuZCBzbGlnaHRseSBtb2RpZmllZAorICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJeworCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpcCAtIF9keWxkX2dldF9pbWFnZV92bWFkZHJfc2xpZGUoaSk7CisJCW1oID0gX2R5bGRfZ2V0X2ltYWdlX2hlYWRlcihpKTsKKwkJaWYgKG1oKQorCQl7CisJCQlsYyA9IChzdHJ1Y3QgbG9hZF9jb21tYW5kICopKChjaGFyICopbWggKyBzaXplb2Yoc3RydWN0IG1hY2hfaGVhZGVyKSk7CisJCQlmb3IgKGogPSAwOyBqIDwgbWgtPm5jbWRzOyBqKyssIGxjID0gKHN0cnVjdCBsb2FkX2NvbW1hbmQgKikoKGNoYXIgKilsYyArIGxjLT5jbWRzaXplKSkKKwkJCXsKKwkJCQlpZiAoTENfU0VHTUVOVCA9PSBsYy0+Y21kICYmCisJCQkJCWFkZHIgPj0gKChzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kICopbGMpLT52bWFkZHIgJiYKKwkJCQkJYWRkciA8CisJCQkJCSgoc3RydWN0IHNlZ21lbnRfY29tbWFuZCAqKWxjKS0+dm1hZGRyICsgKChzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kICopbGMpLT52bXNpemUpCisJCQkJeworCQkJCQlpbmZvLT5kbGlfZm5hbWUgPSBfZHlsZF9nZXRfaW1hZ2VfbmFtZShpKTsKKwkJCQkJaW5mby0+ZGxpX2ZiYXNlID0gKHZvaWQgKiltaDsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoZm91bmQpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFmb3VuZCkKKwl7CisJCWRvdW5sb2NrKCk7CisJCXJldHVybiAwOworCX0KKwlsYyA9IChzdHJ1Y3QgbG9hZF9jb21tYW5kICopKChjaGFyICopbWggKyBzaXplb2Yoc3RydWN0IG1hY2hfaGVhZGVyKSk7CisJZm9yIChqID0gMDsgaiA8IG1oLT5uY21kczsgaisrLCBsYyA9IChzdHJ1Y3QgbG9hZF9jb21tYW5kICopKChjaGFyICopbGMgKyBsYy0+Y21kc2l6ZSkpCisJeworCQlpZiAoTENfU0VHTUVOVCA9PSBsYy0+Y21kKQorCQl7CisJCQlpZiAoIVNETF9zdHJjbXAoKChzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kICopbGMpLT5zZWduYW1lLCAiX19MSU5LRURJVCIpKQorCQkJCWJyZWFrOworCQl9CisJfQorCXRhYmxlX29mZiA9CisJCSgodW5zaWduZWQgbG9uZykoKHN0cnVjdCBzZWdtZW50X2NvbW1hbmQgKilsYyktPnZtYWRkcikgLQorCQkoKHVuc2lnbmVkIGxvbmcpKChzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kICopbGMpLT5maWxlb2ZmKSArIF9keWxkX2dldF9pbWFnZV92bWFkZHJfc2xpZGUoaSk7CisJZGVidWcoInRhYmxlIG9mZiAleCIsIHRhYmxlX29mZik7CisKKwlsYyA9IChzdHJ1Y3QgbG9hZF9jb21tYW5kICopKChjaGFyICopbWggKyBzaXplb2Yoc3RydWN0IG1hY2hfaGVhZGVyKSk7CisJZm9yIChqID0gMDsgaiA8IG1oLT5uY21kczsgaisrLCBsYyA9IChzdHJ1Y3QgbG9hZF9jb21tYW5kICopKChjaGFyICopbGMgKyBsYy0+Y21kc2l6ZSkpCisJeworCQlpZiAoTENfU1lNVEFCID09IGxjLT5jbWQpCisJCXsKKworCQkJc3RydWN0IG5saXN0ICpzeW10YWJsZSA9IChzdHJ1Y3Qgbmxpc3QgKikoKChzdHJ1Y3Qgc3ltdGFiX2NvbW1hbmQgKilsYyktPnN5bW9mZiArIHRhYmxlX29mZik7CisJCQl1bnNpZ25lZCBsb25nIG51bXN5bXMgPSAoKHN0cnVjdCBzeW10YWJfY29tbWFuZCAqKWxjKS0+bnN5bXM7CisJCQlzdHJ1Y3Qgbmxpc3QgKm5lYXJlc3QgPSBOVUxMOworCQkJdW5zaWduZWQgbG9uZyBkaWZmID0gMHhmZmZmZmZmZjsKKwkJCXVuc2lnbmVkIGxvbmcgc3RydGFibGUgPSAodW5zaWduZWQgbG9uZykoKChzdHJ1Y3Qgc3ltdGFiX2NvbW1hbmQgKilsYyktPnN0cm9mZiArIHRhYmxlX29mZik7CisJCQlkZWJ1Zygic3ltdGFibGUgJXgiLCBzeW10YWJsZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtc3ltczsgaSsrKQorCQkJeworCQkJCS8qIElnbm9yZSB0aGUgZm9sbG93aW5nIGtpbmRzIG9mIFN5bWJvbHMgKi8KKwkJCQlpZiAoKCFzeW10YWJsZS0+bl92YWx1ZSkJLyogVW5kZWZpbmVkICovCisJCQkJCXx8IChzeW10YWJsZS0+bl90eXBlID49IE5fUEVYVCkJLyogRGVidWcgc3ltYm9sICovCisJCQkJCXx8ICghKHN5bXRhYmxlLT5uX3R5cGUgJiBOX0VYVCkpCS8qIExvY2FsIFN5bWJvbCAqLworCQkJCQkpCisJCQkJeworCQkJCQlzeW10YWJsZSsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKChhZGRyID49IHN5bXRhYmxlLT5uX3ZhbHVlKSAmJiAoZGlmZiA+PSAoc3ltdGFibGUtPm5fdmFsdWUgLSBhZGRyKSkpCisJCQkJeworCQkJCQlkaWZmID0gKHVuc2lnbmVkIGxvbmcpc3ltdGFibGUtPm5fdmFsdWUgLSBhZGRyOworCQkJCQluZWFyZXN0ID0gc3ltdGFibGU7CisJCQkJfQorCQkJCXN5bXRhYmxlKys7CisJCQl9CisJCQlpZiAobmVhcmVzdCkKKwkJCXsKKwkJCQlpbmZvLT5kbGlfc2FkZHIgPSBuZWFyZXN0LT5uX3ZhbHVlICsgKCh2b2lkICopcCAtIGFkZHIpOworCQkJCWluZm8tPmRsaV9zbmFtZSA9IChjaGFyICopKHN0cnRhYmxlICsgbmVhcmVzdC0+bl91bi5uX3N0cngpOworCQkJfQorCQl9CisJfQorCWRvdW5sb2NrKCk7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoKKyAqIEltcGxlbWVudCB0aGUgZGxmdW5jKCkgaW50ZXJmYWNlLCB3aGljaCBiZWhhdmVzIGV4YWN0bHkgdGhlIHNhbWUgYXMKKyAqIGRsc3ltKCkgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyBhIGZ1bmN0aW9uIHBvaW50ZXIgaW5zdGVhZCBvZiBhIGRhdGEKKyAqIHBvaW50ZXIuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncworICogYWJvdXQgdW5kZWZpbmVkIGJlaGF2aW9yLCBhbmQgaXMgaW50ZW5kZWQgYXMgcHJpb3IgYXJ0IGZvciBmdXR1cmUKKyAqIFBPU0lYIHN0YW5kYXJkaXphdGlvbi4gIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCBhbGwgcG9pbnRlciB0eXBlcworICogaGF2ZSB0aGUgc2FtZSByZXByZXNlbnRhdGlvbiwgd2hpY2ggaXMgdHJ1ZSBvbiBhbGwgcGxhdGZvcm1zIEZyZWVCU0QKKyAqIHJ1bnMgb24sIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCBieSB0aGUgQyBzdGFuZGFyZC4KKyAqLworI2lmIDAgCitzdGF0aWMgZGxmdW5jX3QgU0RMX09TWF9kbGZ1bmModm9pZCAqIGRsX3Jlc3RyaWN0IGhhbmRsZSwgY29uc3QgY2hhciAqIGRsX3Jlc3RyaWN0IHN5bWJvbCkKK3sKKwl1bmlvbgorCXsKKwkJdm9pZCAqZDsKKwkJZGxmdW5jX3QgZjsKKwl9IHJ2OworCWludCBzeW1fbGVuID0gU0RMX3N0cmxlbihzeW1ib2wpOworCWNoYXIgKm1hbGxvY19zeW0gPSBOVUxMOworCWRvbG9jaygpOworCW1hbGxvY19zeW0gPSBTRExfbWFsbG9jKHN5bV9sZW4gKyAyKTsKKwlpZiAobWFsbG9jX3N5bSkKKwl7CisJCVNETF9zbnByaW50ZihtYWxsb2Nfc3ltLCBzeW1fbGVuKzIsICJfJXMiLCBzeW1ib2wpOworCQlydi5kID0gZGxzeW1JbnRlcm4oaGFuZGxlLCBtYWxsb2Nfc3ltLCAxKTsKKwkJU0RMX2ZyZWUobWFsbG9jX3N5bSk7CisJfQorCWVsc2UKKwl7CisJCWVycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5Iik7CisJCWdvdG8gZGxmdW5jZXJyb3I7CisJfQorCWRvdW5sb2NrKCk7CisJcmV0dXJuIHJ2LmY7CisgIGRsZnVuY2Vycm9yOgorCWRvdW5sb2NrKCk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworCisKKy8qIGRsY29tcGF0IGVuZHMsIGhlcmUncyB0aGUgU0RMIGludGVyZmFjZS4uLiAgLS1yeWFuLiAgKi8KKworCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisvKiBTeXN0ZW0gZGVwZW5kZW50IGxpYnJhcnkgbG9hZGluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpbmNsdWRlICJTRExfbG9hZHNvLmgiCisKK3ZvaWQgKlNETF9Mb2FkT2JqZWN0KGNvbnN0IGNoYXIgKnNvZmlsZSkKK3sKKwl2b2lkICpoYW5kbGUgPSBTRExfT1NYX2Rsb3Blbihzb2ZpbGUsIFJUTERfTk9XKTsKKwljb25zdCBjaGFyICpsb2FkZXJyb3IgPSBTRExfT1NYX2RsZXJyb3IoKTsKKwlpZiAoIGhhbmRsZSA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIHNvZmlsZSwgbG9hZGVycm9yKTsKKwl9CisJcmV0dXJuKGhhbmRsZSk7Cit9CisKK3ZvaWQgKlNETF9Mb2FkRnVuY3Rpb24odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lKQoreworCXZvaWQgKnN5bWJvbCA9IFNETF9PU1hfZGxzeW0oaGFuZGxlLCBuYW1lKTsKKwlpZiAoIHN5bWJvbCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIG5hbWUsIFNETF9PU1hfZGxlcnJvcigpKTsKKwl9CisJcmV0dXJuKHN5bWJvbCk7Cit9CisKK3ZvaWQgU0RMX1VubG9hZE9iamVjdCh2b2lkICpoYW5kbGUpCit7CisJaWYgKCBoYW5kbGUgIT0gTlVMTCApIHsKKwkJU0RMX09TWF9kbGNsb3NlKGhhbmRsZSk7CisJfQorfQorCisjZW5kaWYgLyogU0RMX0xPQURTT19ETENPTVBBVCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9sb2Fkc28vbWludC9TRExfc3lzbG9hZHNvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2xvYWRzby9taW50L1NETF9zeXNsb2Fkc28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmRkNzMyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9sb2Fkc28vbWludC9TRExfc3lzbG9hZHNvLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfTE9BRFNPX0xERworCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisvKiBTeXN0ZW0gZGVwZW5kZW50IGxpYnJhcnkgbG9hZGluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdlbS5oPgorI2luY2x1ZGUgPGxkZy5oPgorCisjaW5jbHVkZSAiU0RMX2xvYWRzby5oIgorCit2b2lkICpTRExfTG9hZE9iamVjdChjb25zdCBjaGFyICpzb2ZpbGUpCit7CisJY29uc3QgY2hhciAqbG9hZGVycm9yID0gIlVua25vd24gZXJyb3IiOworCXZvaWQgKmhhbmRsZSA9ICh2b2lkICopbGRnX29wZW4oKGNoYXIgKilzb2ZpbGUsIGxkZ19nbG9iYWwpOworCWlmICggaGFuZGxlID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiRmFpbGVkIGxvYWRpbmcgJXM6ICVzIiwgc29maWxlLCBsb2FkZXJyb3IpOworCX0KKwlyZXR1cm4oaGFuZGxlKTsKK30KKwordm9pZCAqU0RMX0xvYWRGdW5jdGlvbih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqbG9hZGVycm9yID0gIlVua25vd24gZXJyb3IiOworCXZvaWQgKnN5bWJvbCA9ICh2b2lkICopbGRnX2ZpbmQoKGNoYXIgKiluYW1lLCAoTERHICopaGFuZGxlKTsKKwlpZiAoIHN5bWJvbCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIG5hbWUsIGxvYWRlcnJvcik7CisJfQorCXJldHVybihzeW1ib2wpOworfQorCit2b2lkIFNETF9VbmxvYWRPYmplY3Qodm9pZCAqaGFuZGxlKQoreworCWlmICggaGFuZGxlICE9IE5VTEwgKSB7CisJCWxkZ19jbG9zZSgoTERHICopaGFuZGxlLCBsZGdfZ2xvYmFsKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBTRExfTE9BRFNPX0xERyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9sb2Fkc28vb3MyL1NETF9zeXNsb2Fkc28uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbG9hZHNvL29zMi9TRExfc3lzbG9hZHNvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlYTUzNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbG9hZHNvL29zMi9TRExfc3lzbG9hZHNvLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfTE9BRFNPX09TMgorCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisvKiBTeXN0ZW0gZGVwZW5kZW50IGxpYnJhcnkgbG9hZGluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBJTkNMX0RPU0VSUk9SUworI2RlZmluZSBJTkNMX0RPU01PRFVMRU1HUgorI2luY2x1ZGUgPG9zMi5oPgorCisjaW5jbHVkZSAiU0RMX2xvYWRzby5oIgorCit2b2lkICpTRExfTG9hZE9iamVjdChjb25zdCBjaGFyICpzb2ZpbGUpCit7CisgICAgSE1PRFVMRSBoYW5kbGUgPSBOVUxMOworICAgIGNoYXIgYnVmWzUxMl07CisgICAgQVBJUkVUIHVscmMgPSBEb3NMb2FkTW9kdWxlKGJ1Ziwgc2l6ZW9mIChidWYpLCAoY2hhciAqKSBzb2ZpbGUsICZoYW5kbGUpOworCisgICAgLyogR2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSBpZiBhbGwgbG9hZHMgZmFpbGVkICovCisgICAgaWYgKCh1bHJjICE9IE5PX0VSUk9SKSB8fCAoaGFuZGxlID09IE5VTEwpKQorICAgICAgICBTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIHNvZmlsZSwgYnVmKTsKKworICAgIHJldHVybigodm9pZCAqKSBoYW5kbGUpOworfQorCit2b2lkICpTRExfTG9hZEZ1bmN0aW9uKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpsb2FkZXJyb3IgPSAiVW5rbm93biBlcnJvciI7CisgICAgdm9pZCAqc3ltYm9sID0gTlVMTDsKKyAgICBBUElSRVQgdWxyYyA9IERvc1F1ZXJ5UHJvY0FkZHIoKEhNT0RVTEUpaGFuZGxlLCAwLCAoY2hhciAqKW5hbWUsICZzeW1ib2wpOworICAgIGlmICh1bHJjID09IEVSUk9SX0lOVkFMSURfSEFORExFKQorICAgICAgICBsb2FkZXJyb3IgPSAiSW52YWxpZCBtb2R1bGUgaGFuZGxlIjsKKyAgICBlbHNlIGlmICh1bHJjID09IEVSUk9SX0lOVkFMSURfTkFNRSkKKyAgICAgICAgbG9hZGVycm9yID0gIlN5bWJvbCBub3QgZm91bmQiOworCisgICAgaWYgKHN5bWJvbCA9PSBOVUxMKQorICAgICAgICBTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIG5hbWUsIGxvYWRlcnJvcik7CisKKyAgICByZXR1cm4oc3ltYm9sKTsKK30KKwordm9pZCBTRExfVW5sb2FkT2JqZWN0KHZvaWQgKmhhbmRsZSkKK3sKKyAgICBpZiAoIGhhbmRsZSAhPSBOVUxMICkKKyAgICAgICAgRG9zRnJlZU1vZHVsZSgoSE1PRFVMRSkgaGFuZGxlKTsKK30KKworI2VuZGlmIC8qIFNETF9MT0FEU09fT1MyICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2xvYWRzby93aW4zMi9TRExfc3lzbG9hZHNvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL2xvYWRzby93aW4zMi9TRExfc3lzbG9hZHNvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0YzdlNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbG9hZHNvL3dpbjMyL1NETF9zeXNsb2Fkc28uYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfTE9BRFNPX1dJTjMyCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKy8qIFN5c3RlbSBkZXBlbmRlbnQgbGlicmFyeSBsb2FkaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAiU0RMX2xvYWRzby5oIgorCit2b2lkICpTRExfTG9hZE9iamVjdChjb25zdCBjaGFyICpzb2ZpbGUpCit7CisJdm9pZCAqaGFuZGxlID0gTlVMTDsKKwljb25zdCBjaGFyICpsb2FkZXJyb3IgPSAiVW5rbm93biBlcnJvciI7CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisJY2hhciBlcnJidWZbNTEyXTsKKworCXdjaGFyX3QgKmVycmJ1Zl90ID0gU0RMX21hbGxvYyg1MTIgKiBzaXplb2Yod2NoYXJfdCkpOworCXdjaGFyX3QgKnNvZmlsZV90ID0gU0RMX21hbGxvYygoTUFYX1BBVEgrMSkgKiBzaXplb2Yod2NoYXJfdCkpOworCisJTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIE1CX1BSRUNPTVBPU0VELCBzb2ZpbGUsIC0xLCBzb2ZpbGVfdCwgTUFYX1BBVEgpOworCWhhbmRsZSA9ICh2b2lkICopTG9hZExpYnJhcnkoc29maWxlX3QpOworCisJLyogR2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSBpZiBhbGwgbG9hZHMgZmFpbGVkICovCisJaWYgKCBoYW5kbGUgPT0gTlVMTCApIHsKKwkJRm9ybWF0TWVzc2FnZSgoRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMgfAorCQkJCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSksCisJCQkJTlVMTCwgR2V0TGFzdEVycm9yKCksIAorCQkJCU1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAorCQkJCWVycmJ1Zl90LCBTRExfYXJyYXlzaXplKGVycmJ1ZiksIE5VTEwpOworCQlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgZXJyYnVmX3QsIC0xLCBlcnJidWYsIDUxMSwgTlVMTCwgTlVMTCk7CisJCWxvYWRlcnJvciA9IGVycmJ1ZjsKKwl9CisKKwlTRExfZnJlZShzb2ZpbGVfdCk7CisJU0RMX2ZyZWUoZXJyYnVmX3QpOworCisjZWxzZSAvKmlmIGRlZmluZWQoX19XSU4zMl9fKSovCisJY2hhciBlcnJidWZbNTEyXTsKKworCWhhbmRsZSA9ICh2b2lkICopTG9hZExpYnJhcnkoc29maWxlKTsKKworCS8qIEdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgaWYgYWxsIGxvYWRzIGZhaWxlZCAqLworCWlmICggaGFuZGxlID09IE5VTEwgKSB7CisJCUZvcm1hdE1lc3NhZ2UoKEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTIHwKKwkJCQkJRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0pLAorCQkJCU5VTEwsIEdldExhc3RFcnJvcigpLCAKKwkJCQlNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKKwkJCQllcnJidWYsIFNETF9hcnJheXNpemUoZXJyYnVmKSwgTlVMTCk7CisJCWxvYWRlcnJvciA9IGVycmJ1ZjsKKwl9CisjZW5kaWYKKworCWlmICggaGFuZGxlID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiRmFpbGVkIGxvYWRpbmcgJXM6ICVzIiwgc29maWxlLCBsb2FkZXJyb3IpOworCX0KKwlyZXR1cm4oaGFuZGxlKTsKK30KKwordm9pZCAqU0RMX0xvYWRGdW5jdGlvbih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdm9pZCAqc3ltYm9sID0gTlVMTDsKKwljb25zdCBjaGFyICpsb2FkZXJyb3IgPSAiVW5rbm93biBlcnJvciI7CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisJY2hhciBlcnJidWZbNTEyXTsKKwlpbnQgbGVuZ3RoID0gU0RMX3N0cmxlbihuYW1lKTsKKworCXdjaGFyX3QgKm5hbWVfdCA9IFNETF9tYWxsb2MoKGxlbmd0aCArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKKwl3Y2hhcl90ICplcnJidWZfdCA9IFNETF9tYWxsb2MoNTEyICogc2l6ZW9mKHdjaGFyX3QpKTsKKworCU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCBNQl9QUkVDT01QT1NFRCwgbmFtZSwgLTEsIG5hbWVfdCwgbGVuZ3RoKzEpOworCisJc3ltYm9sID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcygoSE1PRFVMRSloYW5kbGUsIG5hbWVfdCk7CisJaWYgKCBzeW1ib2wgPT0gTlVMTCApIHsKKwkJRm9ybWF0TWVzc2FnZSgoRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMgfAorCQkJCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSksCisJCQkJTlVMTCwgR2V0TGFzdEVycm9yKCksIAorCQkJCU1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAorCQkJCWVycmJ1Zl90LCBTRExfYXJyYXlzaXplKGVycmJ1ZiksIE5VTEwpOworCQlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgZXJyYnVmX3QsIC0xLCBlcnJidWYsIDUxMSwgTlVMTCwgTlVMTCk7CisJCWxvYWRlcnJvciA9IGVycmJ1ZjsKKwl9CisKKwlTRExfZnJlZShuYW1lX3QpOworCVNETF9mcmVlKGVycmJ1Zl90KTsKKworI2Vsc2UgLyppZiBkZWZpbmVkKFdJTjMyKSovCisJY2hhciBlcnJidWZbNTEyXTsKKworCXN5bWJvbCA9ICh2b2lkICopR2V0UHJvY0FkZHJlc3MoKEhNT0RVTEUpaGFuZGxlLCBuYW1lKTsKKwlpZiAoIHN5bWJvbCA9PSBOVUxMICkgeworCQlGb3JtYXRNZXNzYWdlKChGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUyB8CisJCQkJCUZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNKSwKKwkJCQlOVUxMLCBHZXRMYXN0RXJyb3IoKSwgCisJCQkJTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisJCQkJZXJyYnVmLCBTRExfYXJyYXlzaXplKGVycmJ1ZiksIE5VTEwpOworCQlsb2FkZXJyb3IgPSBlcnJidWY7CisJfQorI2VuZGlmCisKKwlpZiAoIHN5bWJvbCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIkZhaWxlZCBsb2FkaW5nICVzOiAlcyIsIG5hbWUsIGxvYWRlcnJvcik7CisJfQorCXJldHVybihzeW1ib2wpOworfQorCit2b2lkIFNETF9VbmxvYWRPYmplY3Qodm9pZCAqaGFuZGxlKQoreworCWlmICggaGFuZGxlICE9IE5VTEwgKSB7CisJCUZyZWVMaWJyYXJ5KChITU9EVUxFKWhhbmRsZSk7CisJfQorfQorCisjZW5kaWYgLyogU0RMX0xPQURTT19XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL2Jlb3MvU0RMX0JlQXBwLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL2Jlb3MvU0RMX0JlQXBwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzkzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vYmVvcy9TRExfQmVBcHAuY2MKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBIYW5kbGUgdGhlIEJlQXBwIHNwZWNpZmljIHBvcnRpb25zIG9mIHRoZSBhcHBsaWNhdGlvbiAqLworCisjaW5jbHVkZSA8QXBwS2l0Lmg+CisjaW5jbHVkZSA8c3RvcmFnZS9QYXRoLmg+CisjaW5jbHVkZSA8c3RvcmFnZS9FbnRyeS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiU0RMX0JlQXBwLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorCisvKiBGbGFnIHRvIHRlbGwgd2hldGhlciBvciBub3QgdGhlIEJlIGFwcGxpY2F0aW9uIGlzIGFjdGl2ZSBvciBub3QgKi8KK2ludCBTRExfQmVBcHBBY3RpdmUgPSAwOworc3RhdGljIFNETF9UaHJlYWQgKlNETF9BcHBUaHJlYWQgPSBOVUxMOworCitzdGF0aWMgaW50IFN0YXJ0QmVBcHAodm9pZCAqdW51c2VkKQoreworICBpZighYmVfYXBwKSB7CisJQkFwcGxpY2F0aW9uICpBcHA7CisKKwlBcHAgPSBuZXcgQkFwcGxpY2F0aW9uKCJhcHBsaWNhdGlvbi94LVNETC1leGVjdXRhYmxlIik7CisKKwlBcHAtPlJ1bigpOworCWRlbGV0ZSBBcHA7CisgIH0KKyByZXR1cm4oMCk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIEJlIEFwcGxpY2F0aW9uLCBpZiBpdCdzIG5vdCBhbHJlYWR5IHN0YXJ0ZWQgKi8KK2ludCBTRExfSW5pdEJlQXBwKHZvaWQpCit7CisJLyogQ3JlYXRlIHRoZSBCQXBwbGljYXRpb24gdGhhdCBoYW5kbGVzIGFwcHNlcnZlciBpbnRlcmFjdGlvbiAqLworCWlmICggU0RMX0JlQXBwQWN0aXZlIDw9IDAgKSB7CisJCVNETF9BcHBUaHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkKFN0YXJ0QmVBcHAsIE5VTEwpOworCQlpZiAoIFNETF9BcHBUaHJlYWQgPT0gTlVMTCApIHsKKwkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIEJBcHBsaWNhdGlvbiB0aHJlYWQiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJCisJCS8qIENoYW5nZSB3b3JraW5nIHRvIGRpcmVjdG9yeSB0byB0aGF0IG9mIGV4ZWN1dGFibGUgKi8KKwkJYXBwX2luZm8gaW5mbzsKKwkJaWYgKEJfT0sgPT0gYmVfYXBwLT5HZXRBcHBJbmZvKCZpbmZvKSkgeworCQkJZW50cnlfcmVmIHJlZiA9IGluZm8ucmVmOworCQkJQkVudHJ5IGVudHJ5OworCQkJaWYgKEJfT0sgPT0gZW50cnkuU2V0VG8oJnJlZikpIHsKKwkJCQlCUGF0aCBwYXRoOworCQkJCWlmIChCX09LID09IHBhdGguU2V0VG8oJmVudHJ5KSkgeworCQkJCQlpZiAoQl9PSyA9PSBwYXRoLkdldFBhcmVudCgmcGF0aCkpIHsKKwkJCQkJCWNoZGlyKHBhdGguUGF0aCgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQkKKwkJCisJCWRvIHsKKwkJCVNETF9EZWxheSgxMCk7CisJCX0gd2hpbGUgKCAoYmVfYXBwID09IE5VTEwpIHx8IGJlX2FwcC0+SXNMYXVuY2hpbmcoKSApOworCisJCS8qIE1hcmsgdGhlIGFwcGxpY2F0aW9uIGFjdGl2ZSAqLworCQlTRExfQmVBcHBBY3RpdmUgPSAwOworCX0KKworCS8qIEluY3JlbWVudCB0aGUgYXBwbGljYXRpb24gcmVmZXJlbmNlIGNvdW50ICovCisJKytTRExfQmVBcHBBY3RpdmU7CisKKwkvKiBUaGUgYXBwIGlzIHJ1bm5pbmcsIGFuZCB3ZSdyZSByZWFkeSB0byBnbyAqLworIHJldHVybigwKTsKK30KKworLyogUXVpdCB0aGUgQmUgQXBwbGljYXRpb24sIGlmIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCit2b2lkIFNETF9RdWl0QmVBcHAodm9pZCkKK3sKKwkvKiBEZWNyZW1lbnQgdGhlIGFwcGxpY2F0aW9uIHJlZmVyZW5jZSBjb3VudCAqLworCS0tU0RMX0JlQXBwQWN0aXZlOworCisJLyogSWYgdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVkIHplcm8sIGNsZWFuIHVwIHRoZSBhcHAgKi8KKwlpZiAoIFNETF9CZUFwcEFjdGl2ZSA9PSAwICkgeworCQlpZiAoIFNETF9BcHBUaHJlYWQgIT0gTlVMTCApIHsKKwkJCWlmICggYmVfYXBwICE9IE5VTEwgKSB7IC8qIE5vdCB0ZXN0ZWQgKi8KKwkJCQliZV9hcHAtPlBvc3RNZXNzYWdlKEJfUVVJVF9SRVFVRVNURUQpOworCQkJfQorCQkJU0RMX1dhaXRUaHJlYWQoU0RMX0FwcFRocmVhZCwgTlVMTCk7CisJCQlTRExfQXBwVGhyZWFkID0gTlVMTDsKKwkJfQorCQkvKiBiZV9hcHAgc2hvdWxkIG5vdyBiZSBOVUxMIHNpbmNlIGJlX2FwcCBoYXMgcXVpdCAqLworCX0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9iZW9zL1NETF9CZUFwcC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL2Jlb3MvU0RMX0JlQXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4ODIxMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9iZW9zL1NETF9CZUFwcC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBIYW5kbGUgdGhlIEJlQXBwIHNwZWNpZmljIHBvcnRpb25zIG9mIHRoZSBhcHBsaWNhdGlvbiAqLworCisvKiBJbml0aWFsaXplIHRoZSBCZSBBcHBsaWNhdGlvbiwgaWYgaXQncyBub3QgYWxyZWFkeSBzdGFydGVkICovCitleHRlcm4gaW50IFNETF9Jbml0QmVBcHAodm9pZCk7CisKKy8qIFF1aXQgdGhlIEJlIEFwcGxpY2F0aW9uLCBpZiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyAqLworZXh0ZXJuIHZvaWQgU0RMX1F1aXRCZUFwcCh2b2lkKTsKKworLyogRmxhZyB0byB0ZWxsIHdoZXRoZXIgdGhlIGFwcCBpcyBhY3RpdmUgb3Igbm90ICovCitleHRlcm4gaW50IFNETF9CZUFwcEFjdGl2ZTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9kdW1teS9TRExfZHVtbXlfbWFpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL2R1bW15L1NETF9kdW1teV9tYWluLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9kdW1teS9TRExfZHVtbXlfbWFpbi5jCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vZHVtbXkvU0RMX2R1bW15X21haW4uYwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL1NETC5yIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL1NETC5yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmNlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3MvU0RMLnIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL1NETC5zaGxpYi5yIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL1NETC5zaGxpYi5yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjMxMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3MvU0RMLnNobGliLnIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL1NETF9tYWluLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3MvU0RMX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFmZmRjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL1NETF9tYWluLmMKQEAgLTAsMCArMSw2MTAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qIFRoaXMgZmlsZSB0YWtlcyBjYXJlIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwYXJzaW5nLCBhbmQgc3RkaW8gcmVkaXJlY3Rpb24KKyAgIGluIHRoZSBNYWNPUyBlbnZpcm9ubWVudC4gKHN0ZGlvL3N0ZGVyciBpcyAqbm90KiBkaXJlY3RlZCBmb3IgTWFjaC1PIGJ1aWxkcykKKyAqLworCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCisjaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgorI2VsaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICYmIChVTklWRVJTQUxfSU5URVJGQUNFU19WRVJTSU9OID4gMHgwMzM1KQorI2luY2x1ZGUgPENhcmJvbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxEaWFsb2dzLmg+CisjaW5jbHVkZSA8Rm9udHMuaD4KKyNpbmNsdWRlIDxFdmVudHMuaD4KKyNpbmNsdWRlIDxSZXNvdXJjZXMuaD4KKyNpbmNsdWRlIDxGb2xkZXJzLmg+CisjZW5kaWYKKworLyogSW5jbHVkZSB0aGUgU0RMIG1haW4gZGVmaW5pdGlvbiBoZWFkZXIgKi8KKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfbWFpbi5oIgorI2lmZGVmIG1haW4KKyN1bmRlZiBtYWluCisjZW5kaWYKKworI2lmICEoZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pKQorLyogVGhlIHN0YW5kYXJkIG91dHB1dCBmaWxlcyAqLworI2RlZmluZSBTVERPVVRfRklMRQkic3Rkb3V0LnR4dCIKKyNkZWZpbmUgU1RERVJSX0ZJTEUJInN0ZGVyci50eHQiCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTVdFUktTX18pICYmICFUQVJHRVRfQVBJX01BQ19DQVJCT04KKwkvKiBJbiBNUFcsIHRoZSBxZCBnbG9iYWwgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsaWJyYXJpZXMgKi8KKwlRREdsb2JhbHMgcWQ7CisjZW5kaWYKKworLyogU3RydWN0dXJlIGZvciBrZWVwaW5nIHByZWZzIGluIDEgdmFyaWFibGUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTdHIyNTUgIGNvbW1hbmRfbGluZTsKKyAgICBTdHIyNTUgIHZpZGVvX2RyaXZlcl9uYW1lOworICAgIEJvb2xlYW4gb3V0cHV0X3RvX2ZpbGU7Cit9ICBQcmVmc1JlY29yZDsKKworLyogU2VlIGlmIHRoZSBjb21tYW5kIGtleSBpcyBoZWxkIGRvd24gYXQgc3RhcnR1cCAqLworc3RhdGljIEJvb2xlYW4gQ29tbWFuZEtleUlzRG93bih2b2lkKQoreworCUtleU1hcCAgdGhlS2V5TWFwOworCisJR2V0S2V5cyh0aGVLZXlNYXApOworCisJaWYgKCgodW5zaWduZWQgY2hhciAqKSB0aGVLZXlNYXApWzZdICYgMHg4MCkgeworCQlyZXR1cm4odHJ1ZSk7CisJfQorCXJldHVybihmYWxzZSk7Cit9CisKKyNpZiAhKGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKSkKKworLyogUGFyc2UgYSBjb21tYW5kIGxpbmUgYnVmZmVyIGludG8gYXJndW1lbnRzICovCitzdGF0aWMgaW50IFBhcnNlQ29tbWFuZExpbmUoY2hhciAqY21kbGluZSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYnVmcDsKKwlpbnQgYXJnYzsKKworCWFyZ2MgPSAwOworCWZvciAoIGJ1ZnAgPSBjbWRsaW5lOyAqYnVmcDsgKSB7CisJCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisJCXdoaWxlICggU0RMX2lzc3BhY2UoKmJ1ZnApICkgeworCQkJKytidWZwOworCQl9CisJCS8qIFNraXAgb3ZlciBhcmd1bWVudCAqLworCQlpZiAoICpidWZwID09ICciJyApIHsKKwkJCSsrYnVmcDsKKwkJCWlmICggKmJ1ZnAgKSB7CisJCQkJaWYgKCBhcmd2ICkgeworCQkJCQlhcmd2W2FyZ2NdID0gYnVmcDsKKwkJCQl9CisJCQkJKythcmdjOworCQkJfQorCQkJLyogU2tpcCBvdmVyIHdvcmQgKi8KKwkJCXdoaWxlICggKmJ1ZnAgJiYgKCpidWZwICE9ICciJykgKSB7CisJCQkJKytidWZwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCAqYnVmcCApIHsKKwkJCQlpZiAoIGFyZ3YgKSB7CisJCQkJCWFyZ3ZbYXJnY10gPSBidWZwOworCQkJCX0KKwkJCQkrK2FyZ2M7CisJCQl9CisJCQkvKiBTa2lwIG92ZXIgd29yZCAqLworCQkJd2hpbGUgKCAqYnVmcCAmJiAhIFNETF9pc3NwYWNlKCpidWZwKSApIHsKKwkJCQkrK2J1ZnA7CisJCQl9CisJCX0KKwkJaWYgKCAqYnVmcCApIHsKKwkJCWlmICggYXJndiApIHsKKwkJCQkqYnVmcCA9ICdcMCc7CisJCQl9CisJCQkrK2J1ZnA7CisJCX0KKwl9CisJaWYgKCBhcmd2ICkgeworCQlhcmd2W2FyZ2NdID0gTlVMTDsKKwl9CisJcmV0dXJuKGFyZ2MpOworfQorCisvKiBSZW1vdmUgdGhlIG91dHB1dCBmaWxlcyBpZiB0aGVyZSB3YXMgbm8gb3V0cHV0IHdyaXR0ZW4gKi8KK3N0YXRpYyB2b2lkIGNsZWFudXBfb3V0cHV0KHZvaWQpCit7CisJRklMRSAqZmlsZTsKKwlpbnQgZW1wdHk7CisKKwkvKiBGbHVzaCB0aGUgb3V0cHV0IGluIGNhc2UgYW55dGhpbmcgaXMgcXVldWVkICovCisJZmNsb3NlKHN0ZG91dCk7CisJZmNsb3NlKHN0ZGVycik7CisKKwkvKiBTZWUgaWYgdGhlIGZpbGVzIGhhdmUgYW55IG91dHB1dCBpbiB0aGVtICovCisJZmlsZSA9IGZvcGVuKFNURE9VVF9GSUxFLCAicmIiKTsKKwlpZiAoIGZpbGUgKSB7CisJCWVtcHR5ID0gKGZnZXRjKGZpbGUpID09IEVPRikgPyAxIDogMDsKKwkJZmNsb3NlKGZpbGUpOworCQlpZiAoIGVtcHR5ICkgeworCQkJcmVtb3ZlKFNURE9VVF9GSUxFKTsKKwkJfQorCX0KKwlmaWxlID0gZm9wZW4oU1RERVJSX0ZJTEUsICJyYiIpOworCWlmICggZmlsZSApIHsKKwkJZW1wdHkgPSAoZmdldGMoZmlsZSkgPT0gRU9GKSA/IDEgOiAwOworCQlmY2xvc2UoZmlsZSk7CisJCWlmICggZW1wdHkgKSB7CisJCQlyZW1vdmUoU1RERVJSX0ZJTEUpOworCQl9CisJfQorfQorCisjZW5kaWYgLy8hKGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKSkKKworc3RhdGljIGludCBnZXRDdXJyZW50QXBwTmFtZSAoU3RyRmlsZU5hbWUgbmFtZSkgeworCQorICAgIFByb2Nlc3NTZXJpYWxOdW1iZXIgcHJvY2VzczsKKyAgICBQcm9jZXNzSW5mb1JlYyAgICAgIHByb2Nlc3NfaW5mbzsKKyAgICBGU1NwZWMgICAgICAgICAgICAgIHByb2Nlc3NfZnNwOworICAgIAorICAgIHByb2Nlc3MuaGlnaExvbmdPZlBTTiA9IDA7CisgICAgcHJvY2Vzcy5sb3dMb25nT2ZQU04gID0ga0N1cnJlbnRQcm9jZXNzOworICAgIHByb2Nlc3NfaW5mby5wcm9jZXNzSW5mb0xlbmd0aCA9IHNpemVvZiAocHJvY2Vzc19pbmZvKTsKKyAgICBwcm9jZXNzX2luZm8ucHJvY2Vzc05hbWUgICAgPSBOVUxMOworICAgIHByb2Nlc3NfaW5mby5wcm9jZXNzQXBwU3BlYyA9ICZwcm9jZXNzX2ZzcDsKKyAgICAKKyAgICBpZiAoIG5vRXJyICE9IEdldFByb2Nlc3NJbmZvcm1hdGlvbiAoJnByb2Nlc3MsICZwcm9jZXNzX2luZm8pICkKKyAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBTRExfbWVtY3B5KG5hbWUsIHByb2Nlc3NfZnNwLm5hbWUsIHByb2Nlc3NfZnNwLm5hbWVbMF0gKyAxKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZXRQcmVmc0ZpbGUgKEZTU3BlYyAqcHJlZnNfZnNwLCBpbnQgY3JlYXRlKSB7CisKKyAgICAvKiBUaGUgcHJlZnMgZmlsZSBuYW1lIGlzIHRoZSBhcHBsaWNhdGlvbiBuYW1lLCBwb3NzaWJseSB0cnVuY2F0ZWQsICovCisgICAgLyogcGx1cyAiIFByZWZlcmVuY2VzICovCisgICAgCisgICAgI2RlZmluZSAgU1VGRklYICAgIiBQcmVmZXJlbmNlcyIKKyAgICAjZGVmaW5lICBNQVhfTkFNRSAxOSAgICAgICAgICAgICAvKiAzMSAtIHN0cmxlbiAoU1VGRklYKSAqLworICAgIAorICAgIHNob3J0ICB2b2x1bWVfcmVmX251bWJlcjsKKyAgICBsb25nICAgZGlyZWN0b3J5X2lkOworICAgIFN0ckZpbGVOYW1lICBwcmVmc19uYW1lOworICAgIFN0ckZpbGVOYW1lICBhcHBfbmFtZTsKKyAgICAKKyAgICAvKiBHZXQgUHJlZmVyZW5jZXMgZm9sZGVyIC0gd29ya3Mgd2l0aCBNdWx0aXBsZSBVc2VycyAqLworICAgIGlmICggbm9FcnIgIT0gRmluZEZvbGRlciAoIGtPblN5c3RlbURpc2ssIGtQcmVmZXJlbmNlc0ZvbGRlclR5cGUsIGtEb250Q3JlYXRlRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWVfcmVmX251bWJlciwgJmRpcmVjdG9yeV9pZCkgKQorICAgICAgICBleGl0ICgtMSk7CisgICAgCisgICAgaWYgKCAhIGdldEN1cnJlbnRBcHBOYW1lIChhcHBfbmFtZSkgKQorICAgICAgICBleGl0ICgtMSk7CisgICAgCisgICAgLyogVHJ1bmNhdGUgaWYgbmFtZSBpcyB0b28gbG9uZyAqLworICAgIGlmIChhcHBfbmFtZVswXSA+IE1BWF9OQU1FICkKKyAgICAgICAgYXBwX25hbWVbMF0gPSBNQVhfTkFNRTsKKyAgICAgICAgCisgICAgU0RMX21lbWNweShwcmVmc19uYW1lICsgMSwgYXBwX25hbWUgKyAxLCBhcHBfbmFtZVswXSk7ICAgIAorICAgIFNETF9tZW1jcHkocHJlZnNfbmFtZSArIGFwcF9uYW1lWzBdICsgMSwgU1VGRklYLCBzdHJsZW4gKFNVRkZJWCkpOworICAgIHByZWZzX25hbWVbMF0gPSBhcHBfbmFtZVswXSArIHN0cmxlbiAoU1VGRklYKTsKKyAgIAorICAgIC8qIE1ha2UgdGhlIGZpbGUgc3BlYyBmb3IgcHJlZnMgZmlsZSAqLworICAgIGlmICggbm9FcnIgIT0gRlNNYWtlRlNTcGVjICh2b2x1bWVfcmVmX251bWJlciwgZGlyZWN0b3J5X2lkLCBwcmVmc19uYW1lLCBwcmVmc19mc3ApICkgeworICAgICAgICBpZiAoICFjcmVhdGUgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBwcmVmcyBmaWxlICovCisgICAgICAgICAgICBTRExfbWVtY3B5KHByZWZzX2ZzcC0+bmFtZSwgcHJlZnNfbmFtZSwgcHJlZnNfbmFtZVswXSArIDEpOworICAgICAgICAgICAgcHJlZnNfZnNwLT5wYXJJRCAgID0gZGlyZWN0b3J5X2lkOworICAgICAgICAgICAgcHJlZnNfZnNwLT52UmVmTnVtID0gdm9sdW1lX3JlZl9udW1iZXI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBGU3BDcmVhdGVSZXNGaWxlIChwcmVmc19mc3AsIDB4M2YzZjNmM2YsICdwcmVmJywgMCk7IC8vICc/Pz8/JyBwYXJzZWQgYXMgdHJpZ3JhcGgKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCBub0VyciAhPSBSZXNFcnJvciAoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlYWRQcmVmc1Jlc291cmNlIChQcmVmc1JlY29yZCAqcHJlZnMpIHsKKyAgICAKKyAgICBIYW5kbGUgcHJlZnNfaGFuZGxlOworICAgIAorICAgIHByZWZzX2hhbmRsZSA9IEdldDFSZXNvdXJjZSggJ0NMbmUnLCAxMjggKTsKKworCWlmIChwcmVmc19oYW5kbGUgIT0gTlVMTCkgeworCQlpbnQgb2Zmc2V0ID0gMDsKKy8vCQlpbnQgaiAgICAgID0gMDsKKwkJCisJCUhMb2NrKHByZWZzX2hhbmRsZSk7CisJCQorCQkvKiBHZXQgY29tbWFuZCBsaW5lIHN0cmluZyAqLwkKKwkJU0RMX21lbWNweShwcmVmcy0+Y29tbWFuZF9saW5lLCAqcHJlZnNfaGFuZGxlLCAoKnByZWZzX2hhbmRsZSlbMF0rMSk7CisKKwkJLyogR2V0IHZpZGVvIGRyaXZlciBuYW1lICovCisJCW9mZnNldCArPSAoKnByZWZzX2hhbmRsZSlbMF0gKyAxOwkKKwkJU0RMX21lbWNweShwcmVmcy0+dmlkZW9fZHJpdmVyX25hbWUsICpwcmVmc19oYW5kbGUgKyBvZmZzZXQsICgqcHJlZnNfaGFuZGxlKVtvZmZzZXRdICsgMSk7CQkKKwkJCisJCS8qIEdldCBzYXZlLXRvLWZpbGUgb3B0aW9uICgxIG9yIDApICovCisJCW9mZnNldCArPSAoKnByZWZzX2hhbmRsZSlbb2Zmc2V0XSArIDE7CisJCXByZWZzLT5vdXRwdXRfdG9fZmlsZSA9ICgqcHJlZnNfaGFuZGxlKVtvZmZzZXRdOworCQkKKwkJUmVsZWFzZVJlc291cmNlKCBwcmVmc19oYW5kbGUgKTsKKyAgICAKKyAgICAgICAgcmV0dXJuIFJlc0Vycm9yKCkgPT0gbm9FcnI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVQcmVmc1Jlc291cmNlIChQcmVmc1JlY29yZCAqcHJlZnMsIHNob3J0IHJlc291cmNlX2ZpbGUpIHsKKworICAgIEhhbmRsZSBwcmVmc19oYW5kbGU7CisgICAgCisgICAgVXNlUmVzRmlsZSAocmVzb3VyY2VfZmlsZSk7CisgICAgCisgICAgcHJlZnNfaGFuZGxlID0gR2V0MVJlc291cmNlICggJ0NMbmUnLCAxMjggKTsKKyAgICBpZiAocHJlZnNfaGFuZGxlICE9IE5VTEwpCisgICAgICAgIFJlbW92ZVJlc291cmNlIChwcmVmc19oYW5kbGUpOworICAgIAorICAgIHByZWZzX2hhbmRsZSA9IE5ld0hhbmRsZSAoIHByZWZzLT5jb21tYW5kX2xpbmVbMF0gKyBwcmVmcy0+dmlkZW9fZHJpdmVyX25hbWVbMF0gKyA0ICk7CisgICAgaWYgKHByZWZzX2hhbmRsZSAhPSBOVUxMKSB7CisgICAgCisgICAgICAgIGludCBvZmZzZXQ7CisgICAgICAgIAorICAgICAgICBITG9jayAocHJlZnNfaGFuZGxlKTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbW1hbmQgbGluZSB0ZXh0ICovCisgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIFNETF9tZW1jcHkoKnByZWZzX2hhbmRsZSwgcHJlZnMtPmNvbW1hbmRfbGluZSwgcHJlZnMtPmNvbW1hbmRfbGluZVswXSArIDEpOworICAgICAgICAKKyAgICAgICAgLyogVmlkZW8gZHJpdmVyIG5hbWUgKi8KKyAgICAgICAgb2Zmc2V0ICs9IHByZWZzLT5jb21tYW5kX2xpbmVbMF0gKyAxOworICAgICAgICBTRExfbWVtY3B5KCpwcmVmc19oYW5kbGUgKyBvZmZzZXQsIHByZWZzLT52aWRlb19kcml2ZXJfbmFtZSwgcHJlZnMtPnZpZGVvX2RyaXZlcl9uYW1lWzBdICsgMSk7CisgICAgICAgIAorICAgICAgICAvKiBPdXRwdXQtdG8tZmlsZSBvcHRpb24gKi8KKyAgICAgICAgb2Zmc2V0ICs9IHByZWZzLT52aWRlb19kcml2ZXJfbmFtZVswXSArIDE7CisgICAgICAgICooICooKGNoYXIqKilwcmVmc19oYW5kbGUpICsgb2Zmc2V0KSAgICAgPSAoY2hhcilwcmVmcy0+b3V0cHV0X3RvX2ZpbGU7CisgICAgICAgICooICooKGNoYXIqKilwcmVmc19oYW5kbGUpICsgb2Zmc2V0ICsgMSkgPSAwOworICAgICAgICAgICAgICAKKyAgICAgICAgQWRkUmVzb3VyY2UgICAocHJlZnNfaGFuZGxlLCAnQ0xuZScsIDEyOCwgIlxwQ29tbWFuZCBMaW5lIik7CisgICAgICAgIFdyaXRlUmVzb3VyY2UgKHByZWZzX2hhbmRsZSk7CisgICAgICAgIFVwZGF0ZVJlc0ZpbGUgKHJlc291cmNlX2ZpbGUpOworICAgICAgICBEaXNwb3NlSGFuZGxlIChwcmVmc19oYW5kbGUpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIFJlc0Vycm9yKCkgPT0gbm9FcnI7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRQcmVmZXJlbmNlcyAoUHJlZnNSZWNvcmQgKnByZWZzKSB7CisKKyAgICBpbnQgICAgbm9fZXJyb3IgPSAxOworICAgIEZTU3BlYyBwcmVmc19mc3A7CisKKyAgICAvKiBDaGVjayBmb3IgcHJlZnMgZmlsZSBmaXJzdCAqLworICAgIGlmICggZ2V0UHJlZnNGaWxlICgmcHJlZnNfZnNwLCAwKSApIHsKKyAgICAKKyAgICAgICAgc2hvcnQgIHByZWZzX3Jlc291cmNlOworICAgICAgICAKKyAgICAgICAgcHJlZnNfcmVzb3VyY2UgPSBGU3BPcGVuUmVzRmlsZSAoJnByZWZzX2ZzcCwgZnNSZFBlcm0pOworICAgICAgICBpZiAoIHByZWZzX3Jlc291cmNlID09IC0xICkgLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQuLi4gKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgIAorICAgICAgICBVc2VSZXNGaWxlICAgKHByZWZzX3Jlc291cmNlKTsKKyAgICAgICAgbm9fZXJyb3IgPSByZWFkUHJlZnNSZXNvdXJjZSAocHJlZnMpOyAgICAgCisgICAgICAgIENsb3NlUmVzRmlsZSAocHJlZnNfcmVzb3VyY2UpOworICAgIH0KKyAgICAKKyAgICAvKiBGYWxsIGJhY2sgdG8gYXBwbGljYXRpb24ncyByZXNvdXJjZSBmb3JrIChyZWFkaW5nIG9ubHksIHNvIHRoaXMgaXMgc2FmZSkgKi8KKyAgICBlbHNlIHsKKyAgICAKKyAgICAgICAgICBub19lcnJvciA9IHJlYWRQcmVmc1Jlc291cmNlIChwcmVmcyk7CisgICAgIH0KKworICAgIHJldHVybiBub19lcnJvcjsKK30KKworc3RhdGljIGludCB3cml0ZVByZWZlcmVuY2VzIChQcmVmc1JlY29yZCAqcHJlZnMpIHsKKyAgICAKKyAgICBpbnQgICAgbm9fZXJyb3IgPSAxOworICAgIEZTU3BlYyBwcmVmc19mc3A7CisgICAgCisgICAgLyogR2V0IHByZWZzIGZpbGUsIGNyZWF0ZSBpZiBpdCBkb2Vzbid0IGV4aXN0ICovCisgICAgaWYgKCBnZXRQcmVmc0ZpbGUgKCZwcmVmc19mc3AsIDEpICkgeworICAgIAorICAgICAgICBzaG9ydCAgcHJlZnNfcmVzb3VyY2U7CisgICAgICAgIAorICAgICAgICBwcmVmc19yZXNvdXJjZSA9IEZTcE9wZW5SZXNGaWxlICgmcHJlZnNfZnNwLCBmc1JkV3JQZXJtKTsKKyAgICAgICAgaWYgKHByZWZzX3Jlc291cmNlID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5vX2Vycm9yID0gd3JpdGVQcmVmc1Jlc291cmNlIChwcmVmcywgcHJlZnNfcmVzb3VyY2UpOworICAgICAgICBDbG9zZVJlc0ZpbGUgKHByZWZzX3Jlc291cmNlKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG5vX2Vycm9yOworfQorCisvKiBUaGlzIGlzIHdoZXJlIGV4ZWN1dGlvbiBiZWdpbnMgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisKKyNpZiAhKGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKSkKKyNwcmFnbWEgdW51c2VkKGFyZ2MsIGFyZ3YpCisjZW5kaWYKKwkKKyNkZWZpbmUgREVGQVVMVF9BUkdTICJccCIgICAgICAgICAgICAgICAgLyogcGFzY2FsIHN0cmluZyBmb3IgZGVmYXVsdCBhcmdzICovCisjZGVmaW5lIERFRkFVTFRfVklERU9fRFJJVkVSICJccHRvb2xib3giIC8qIHBhc2NhbCBzdHJpbmcgZm9yIGRlZmF1bHQgdmlkZW8gZHJpdmVyIG5hbWUgKi8JCisjZGVmaW5lIERFRkFVTFRfT1VUUFVUX1RPX0ZJTEUgMSAgICAgICAgIC8qIDEgPT0gb3V0cHV0IHRvIGZpbGUsIDAgPT0gbm8gb3V0cHV0ICovCisKKyNkZWZpbmUgVklERU9fSURfRFJBV1NQUk9DS0VUIDEgICAgICAgICAgLyogdGhlc2UgY29ycmVzcG9uZCB0byBwb3B1cCBtZW51IGNob2ljZXMgKi8KKyNkZWZpbmUgVklERU9fSURfVE9PTEJPWCAgICAgIDIKKworICAgIFByZWZzUmVjb3JkIHByZWZzID0geyBERUZBVUxUX0FSR1MsIERFRkFVTFRfVklERU9fRFJJVkVSLCBERUZBVUxUX09VVFBVVF9UT19GSUxFIH07IAorCQorI2lmICEoZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pKQorCWludCAgICAgbmFyZ3M7CisJY2hhciAgICoqYXJnczsKKwljaGFyICAgKmNvbW1hbmRMaW5lOworCQorCVN0ckZpbGVOYW1lICBhcHBOYW1lVGV4dDsKKyNlbmRpZgorCWludCAgICAgdmlkZW9kcml2ZXIgICAgID0gVklERU9fSURfVE9PTEJPWDsKKyAgICBpbnQgICAgIHNldHRpbmdzQ2hhbmdlZCA9IDA7CisgICAgCisgICAgbG9uZwlpOworCisJLyogS3lsZSdzIFNETCBjb21tYW5kLWxpbmUgZGlhbG9nIGNvZGUgLi4uICovCisjaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgorCUluaXRHcmFmICAgICgmcWQudGhlUG9ydCk7CisJSW5pdEZvbnRzICAgKCk7CisJSW5pdFdpbmRvd3MgKCk7CisJSW5pdE1lbnVzICAgKCk7CisJSW5pdERpYWxvZ3MgKG5pbCk7CisjZW5kaWYKKwlJbml0Q3Vyc29yICgpOworCUZsdXNoRXZlbnRzKGV2ZXJ5RXZlbnQsMCk7CisjaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgorCU1heEFwcGxab25lICgpOworI2VuZGlmCisJTW9yZU1hc3RlcnMgKCk7CisJTW9yZU1hc3RlcnMgKCk7CisjaWYgMAorCS8qIEludGlhbGl6ZSBTREwsIGFuZCBwdXQgdXAgYSBkaWFsb2cgaWYgd2UgZmFpbCAqLworCWlmICggU0RMX0luaXQgKDApIDwgMCApIHsKKworI2RlZmluZSBrRXJyX09LCQkxCisjZGVmaW5lIGtFcnJfVGV4dAkyCisKKyAgICAgICAgRGlhbG9nUHRyIGVycm9yRGlhbG9nOworICAgICAgICBzaG9ydAkgIGR1bW15VHlwZTsKKyAgICAJUmVjdAkgIGR1bW15UmVjdDsKKwkgICAgSGFuZGxlICAgIGR1bW15SGFuZGxlOworCSAgICBzaG9ydCAgICAgaXRlbUhpdDsKKwkKKwkJZXJyb3JEaWFsb2cgPSBHZXROZXdEaWFsb2cgKDEwMDEsIG5pbCwgKFdpbmRvd1B0ciktMSk7CisJCWlmIChlcnJvckRpYWxvZyA9PSBOVUxMKQorCQkgICAgcmV0dXJuIC0xOworCQlEcmF3RGlhbG9nIChlcnJvckRpYWxvZyk7CisJCQorCQlHZXREaWFsb2dJdGVtIChlcnJvckRpYWxvZywga0Vycl9UZXh0LCAmZHVtbXlUeXBlLCAmZHVtbXlIYW5kbGUsICZkdW1teVJlY3QpOworCQlTZXREaWFsb2dJdGVtVGV4dCAoZHVtbXlIYW5kbGUsICJccEVycm9yIEluaXRpYWxpemluZyBTREwiKTsKKwkJCisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisJCVNldFBvcnQgKEdldERpYWxvZ1BvcnQoZXJyb3JEaWFsb2cpKTsKKyNlbHNlCisJCVNldFBvcnQgKGVycm9yRGlhbG9nKTsKKyNlbmRpZgorCQlkbyB7CisJCQlNb2RhbERpYWxvZyAobmlsLCAmaXRlbUhpdCk7CisJCX0gd2hpbGUgKGl0ZW1IaXQgIT0ga0Vycl9PSyk7CisJCQorCQlEaXNwb3NlRGlhbG9nIChlcnJvckRpYWxvZyk7CisJCWV4aXQgKC0xKTsKKwl9CisJYXRleGl0KGNsZWFudXBfb3V0cHV0KTsKKwlhdGV4aXQoU0RMX1F1aXQpOworI2VuZGlmCisKKy8qIFNldCB1cCBTREwncyBRdWlja0RyYXcgZW52aXJvbm1lbnQgICovCisjaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgorCVNETF9Jbml0UXVpY2tEcmF3KCZxZCk7CisjZW5kaWYKKworCSBpZiAoIHJlYWRQcmVmZXJlbmNlcyAoJnByZWZzKSApIHsKKwkJCisgICAgICAgIGlmIChTRExfbWVtY21wKHByZWZzLnZpZGVvX2RyaXZlcl9uYW1lKzEsICJEU3AiLCAzKSA9PSAwKQorICAgICAgICAgICAgdmlkZW9kcml2ZXIgPSAxOworICAgICAgICBlbHNlIGlmIChTRExfbWVtY21wKHByZWZzLnZpZGVvX2RyaXZlcl9uYW1lKzEsICJ0b29sYm94IiwgNykgPT0gMCkKKyAgICAgICAgICAgIHZpZGVvZHJpdmVyID0gMjsKKwkgfQorCSAJCisJaWYgKCBDb21tYW5kS2V5SXNEb3duKCkgKSB7CisKKyNkZWZpbmUga0NMX09LCQkxCisjZGVmaW5lIGtDTF9DYW5jZWwJMgorI2RlZmluZSBrQ0xfVGV4dAkzCisjZGVmaW5lIGtDTF9GaWxlCTQKKyNkZWZpbmUga0NMX1ZpZGVvICAgNgorICAgICAgIAorICAgICAgICBEaWFsb2dQdHIgY29tbWFuZERpYWxvZzsKKyAgICAgICAgc2hvcnQJICBkdW1teVR5cGU7CisgICAgICAgIFJlY3QJICBkdW1teVJlY3Q7CisgICAgICAgIEhhbmRsZSAgICBkdW1teUhhbmRsZTsKKyAgICAgICAgc2hvcnQgICAgIGl0ZW1IaXQ7CisgICAjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisgICAgICAgIENvbnRyb2xSZWYgY29udHJvbDsKKyAgICNlbmRpZgorICAgICAgICAKKyAgICAgICAgLyogQXNzdW1lIHRoYXQgdGhleSB3aWxsIGNoYW5nZSBzZXR0aW5ncywgcmF0aGVyIHRoYW4gZG8gZXhoYXVzdGl2ZSBjaGVjayAqLworICAgICAgICBzZXR0aW5nc0NoYW5nZWQgPSAxOworICAgICAgICAKKyAgICAgICAgLyogQ3JlYXRlIGRpYWxvZyBhbmQgZGlzcGxheSBpdCAqLworICAgICAgICBjb21tYW5kRGlhbG9nID0gR2V0TmV3RGlhbG9nICgxMDAwLCBuaWwsIChXaW5kb3dQdHIpLTEpOworICAgICNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKyAgICAgICAgU2V0UG9ydCAoIEdldERpYWxvZ1BvcnQoY29tbWFuZERpYWxvZykgKTsKKyAgICAjZWxzZQorICAgICAgICBTZXRQb3J0IChjb21tYW5kRGlhbG9nKTsKKyAgICAgI2VuZGlmCisgICAgICAgICAgIAorICAgICAgICAvKiBTZXR1cCBjb250cm9scyAqLworICAgICNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKyAgICAgICAgR2V0RGlhbG9nSXRlbUFzQ29udHJvbChjb21tYW5kRGlhbG9nLCBrQ0xfRmlsZSwgJmNvbnRyb2wpOworICAgICAgICBTZXRDb250cm9sVmFsdWUgKGNvbnRyb2wsIHByZWZzLm91dHB1dF90b19maWxlKTsKKyAgICAjZWxzZQorICAgICAgICBHZXREaWFsb2dJdGVtICAgKGNvbW1hbmREaWFsb2csIGtDTF9GaWxlLCAmZHVtbXlUeXBlLCAmZHVtbXlIYW5kbGUsICZkdW1teVJlY3QpOyAvKiBNSlMgKi8KKyAgICAgICAgU2V0Q29udHJvbFZhbHVlICgoQ29udHJvbEhhbmRsZSlkdW1teUhhbmRsZSwgcHJlZnMub3V0cHV0X3RvX2ZpbGUgKTsKKyAgICAjZW5kaWYKKworICAgICAgICBHZXREaWFsb2dJdGVtICAgICAoY29tbWFuZERpYWxvZywga0NMX1RleHQsICZkdW1teVR5cGUsICZkdW1teUhhbmRsZSwgJmR1bW15UmVjdCk7CisgICAgICAgIFNldERpYWxvZ0l0ZW1UZXh0IChkdW1teUhhbmRsZSwgcHJlZnMuY29tbWFuZF9saW5lKTsKKworICAgICNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKyAgICAgICAgR2V0RGlhbG9nSXRlbUFzQ29udHJvbChjb21tYW5kRGlhbG9nLCBrQ0xfVmlkZW8sICZjb250cm9sKTsKKyAgICAgICAgU2V0Q29udHJvbFZhbHVlIChjb250cm9sLCB2aWRlb2RyaXZlcik7CisgICAjZWxzZQorICAgICAgICBHZXREaWFsb2dJdGVtICAgKGNvbW1hbmREaWFsb2csIGtDTF9WaWRlbywgJmR1bW15VHlwZSwgJmR1bW15SGFuZGxlLCAmZHVtbXlSZWN0KTsKKyAgICAgICAgU2V0Q29udHJvbFZhbHVlICgoQ29udHJvbFJlZilkdW1teUhhbmRsZSwgdmlkZW9kcml2ZXIpOworICAgICAjZW5kaWYKKworICAgICAgICBTZXREaWFsb2dEZWZhdWx0SXRlbSAoY29tbWFuZERpYWxvZywga0NMX09LKTsKKyAgICAgICAgU2V0RGlhbG9nQ2FuY2VsSXRlbSAgKGNvbW1hbmREaWFsb2csIGtDTF9DYW5jZWwpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgCQkKKyAgICAgICAgCU1vZGFsRGlhbG9nKG5pbCwgJml0ZW1IaXQpOyAvKiB3YWl0IGZvciB1c2VyIHJlc3BvbnNlICovCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFRvZ2dsZSBjb21tYW5kLWxpbmUgb3V0cHV0IGNoZWNrYm94ICovCQorICAgICAgICAJaWYgKCBpdGVtSGl0ID09IGtDTF9GaWxlICkgeworICAgICAgICAjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisgICAgICAgIAkJR2V0RGlhbG9nSXRlbUFzQ29udHJvbChjb21tYW5kRGlhbG9nLCBrQ0xfRmlsZSwgJmNvbnRyb2wpOworICAgICAgICAJCVNldENvbnRyb2xWYWx1ZSAoY29udHJvbCwgIUdldENvbnRyb2xWYWx1ZShjb250cm9sKSk7CisgICAgICAgICNlbHNlCisgICAgICAgIAkJR2V0RGlhbG9nSXRlbShjb21tYW5kRGlhbG9nLCBrQ0xfRmlsZSwgJmR1bW15VHlwZSwgJmR1bW15SGFuZGxlLCAmZHVtbXlSZWN0KTsgLyogTUpTICovCisgICAgICAgIAkJU2V0Q29udHJvbFZhbHVlKChDb250cm9sSGFuZGxlKWR1bW15SGFuZGxlLCAhR2V0Q29udHJvbFZhbHVlKChDb250cm9sSGFuZGxlKWR1bW15SGFuZGxlKSApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgCX0KKworICAgICAgICB9IHdoaWxlIChpdGVtSGl0ICE9IGtDTF9PSyAmJiBpdGVtSGl0ICE9IGtDTF9DYW5jZWwpOworCisgICAgICAgIC8qIEdldCBjb250cm9sIHZhbHVlcywgZXZlbiBpZiB0aGV5IGRpZCBub3QgY2hhbmdlICovCisgICAgICAgIEdldERpYWxvZ0l0ZW0gICAgIChjb21tYW5kRGlhbG9nLCBrQ0xfVGV4dCwgJmR1bW15VHlwZSwgJmR1bW15SGFuZGxlLCAmZHVtbXlSZWN0KTsgLyogTUpTICovCisgICAgICAgIEdldERpYWxvZ0l0ZW1UZXh0IChkdW1teUhhbmRsZSwgcHJlZnMuY29tbWFuZF9saW5lKTsKKworICAgICNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKyAgICAgICAgR2V0RGlhbG9nSXRlbUFzQ29udHJvbChjb21tYW5kRGlhbG9nLCBrQ0xfRmlsZSwgJmNvbnRyb2wpOworICAgICAgICBwcmVmcy5vdXRwdXRfdG9fZmlsZSA9IEdldENvbnRyb2xWYWx1ZShjb250cm9sKTsKKwkjZWxzZQorICAgICAgICBHZXREaWFsb2dJdGVtIChjb21tYW5kRGlhbG9nLCBrQ0xfRmlsZSwgJmR1bW15VHlwZSwgJmR1bW15SGFuZGxlLCAmZHVtbXlSZWN0KTsgLyogTUpTICovCisgICAgICAgIHByZWZzLm91dHB1dF90b19maWxlID0gR2V0Q29udHJvbFZhbHVlICgoQ29udHJvbEhhbmRsZSlkdW1teUhhbmRsZSk7CisgCSNlbmRpZgorCisgICAgI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgorICAgICAgICBHZXREaWFsb2dJdGVtQXNDb250cm9sKGNvbW1hbmREaWFsb2csIGtDTF9WaWRlbywgJmNvbnRyb2wpOworICAgICAgICB2aWRlb2RyaXZlciA9IEdldENvbnRyb2xWYWx1ZShjb250cm9sKTsKKyAgICAjZWxzZQorICAgICAgICBHZXREaWFsb2dJdGVtIChjb21tYW5kRGlhbG9nLCBrQ0xfVmlkZW8sICZkdW1teVR5cGUsICZkdW1teUhhbmRsZSwgJmR1bW15UmVjdCk7CisgICAgICAgIHZpZGVvZHJpdmVyID0gR2V0Q29udHJvbFZhbHVlICgoQ29udHJvbFJlZilkdW1teUhhbmRsZSk7CisgICAgICNlbmRpZgorCisgICAgICAgIERpc3Bvc2VEaWFsb2cgKGNvbW1hbmREaWFsb2cpOworCisgICAgICAgIGlmIChpdGVtSGl0ID09IGtDTF9DYW5jZWwgKSB7CisgICAgICAgIAlleGl0ICgwKTsKKyAgICAgICAgfQorCX0KKyAgICAKKyAgICAvKiBTZXQgcHNldWRvLWVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdmlkZW8gZHJpdmVyLCB1cGRhdGUgcHJlZnMgKi8KKwlzd2l0Y2ggKCB2aWRlb2RyaXZlciApIHsKKwkgICBjYXNlIFZJREVPX0lEX0RSQVdTUFJPQ0tFVDogCisJICAgICAgU0RMX3B1dGVudigiU0RMX1ZJREVPRFJJVkVSPURTcCIpOworCSAgICAgIFNETF9tZW1jcHkocHJlZnMudmlkZW9fZHJpdmVyX25hbWUsICJccERTcCIsIDQpOworCSAgICAgIGJyZWFrOworCSAgIGNhc2UgVklERU9fSURfVE9PTEJPWDoKKwkgICAgICBTRExfcHV0ZW52KCJTRExfVklERU9EUklWRVI9dG9vbGJveCIpOworCSAgICAgIFNETF9tZW1jcHkocHJlZnMudmlkZW9fZHJpdmVyX25hbWUsICJccHRvb2xib3giLCA4KTsKKwkgICAgICBicmVhazsKKwl9CisKKyNpZiAhKGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKSkKKyAgICAvKiBSZWRpcmVjdCBzdGFuZGFyZCBJL08gdG8gZmlsZXMgKi8KKwlpZiAoIHByZWZzLm91dHB1dF90b19maWxlICkgeworCQlmcmVvcGVuIChTVERPVVRfRklMRSwgInciLCBzdGRvdXQpOworCQlmcmVvcGVuIChTVERFUlJfRklMRSwgInciLCBzdGRlcnIpOworCX0gZWxzZSB7CisJCWZjbG9zZSAoc3Rkb3V0KTsKKwkJZmNsb3NlIChzdGRlcnIpOworCX0KKyNlbmRpZgorICAgCisgICAgaWYgKHNldHRpbmdzQ2hhbmdlZCkgeworICAgICAgICAvKiBTYXZlIHRoZSBwcmVmcywgZXZlbiBpZiB0aGV5IG1pZ2h0IG5vdCBoYXZlIGNoYW5nZWQgKGJ1dCBwcm9iYWJseSBkaWQpICovCisgICAgICAgIGlmICggISB3cml0ZVByZWZlcmVuY2VzICgmcHJlZnMpICkKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldBUk5JTkc6IENvdWxkIG5vdCBzYXZlIHByZWZlcmVuY2VzIVxuIik7CisgICAgfQorICAgCisjaWYgIShkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykpCisgICAgYXBwTmFtZVRleHRbMF0gPSAwOworICAgIGdldEN1cnJlbnRBcHBOYW1lIChhcHBOYW1lVGV4dCk7IC8qIGNoZWNrIGZvciBlcnJvciBoZXJlID8gKi8KKworICAgIGNvbW1hbmRMaW5lID0gKGNoYXIqKSBtYWxsb2MgKGFwcE5hbWVUZXh0WzBdICsgcHJlZnMuY29tbWFuZF9saW5lWzBdICsgMik7CisgICAgaWYgKCBjb21tYW5kTGluZSA9PSBOVUxMICkgeworICAgICAgIGV4aXQoLTEpOworICAgIH0KKworICAgIC8qIFJhdGhlciB0aGFuIHJld3JpdGUgUGFyc2VDb21tYW5kTGluZSBtZXRob2QsIGxldCdzIHJlcGxhY2UgICovCisgICAgLyogYW55IHNwYWNlcyBpbiBhcHBsaWNhdGlvbiBuYW1lIHdpdGggdW5kZXJzY29yZXMsICAgICAgICAgICAgKi8KKyAgICAvKiBzbyB0aGF0IHRoZSBhcHAgbmFtZSBpcyBvbmx5IDEgYXJndW1lbnQgICAgICAgICAgICAgICAgICAgICAqLyAgIAorICAgIGZvciAoaSA9IDE7IGkgPCAxK2FwcE5hbWVUZXh0WzBdOyBpKyspCisgICAgICAgIGlmICggYXBwTmFtZVRleHRbaV0gPT0gJyAnICkgYXBwTmFtZVRleHRbaV0gPSAnXyc7CisKKyAgICAvKiBDb3B5IGFwcCBuYW1lICYgZnVsbCBjb21tYW5kIHRleHQgdG8gY29tbWFuZC1saW5lIEMtc3RyaW5nICovICAgICAgCisgICAgU0RMX21lbWNweShjb21tYW5kTGluZSwgYXBwTmFtZVRleHQgKyAxLCBhcHBOYW1lVGV4dFswXSk7CisgICAgY29tbWFuZExpbmVbYXBwTmFtZVRleHRbMF1dID0gJyAnOworICAgIFNETF9tZW1jcHkoY29tbWFuZExpbmUgKyBhcHBOYW1lVGV4dFswXSArIDEsIHByZWZzLmNvbW1hbmRfbGluZSArIDEsIHByZWZzLmNvbW1hbmRfbGluZVswXSk7CisgICAgY29tbWFuZExpbmVbIGFwcE5hbWVUZXh0WzBdICsgMSArIHByZWZzLmNvbW1hbmRfbGluZVswXSBdID0gJ1wwJzsKKworICAgIC8qIFBhcnNlIEMtc3RyaW5nIGludG8gYXJndiBhbmQgYXJnYyAqLworICAgIG5hcmdzID0gUGFyc2VDb21tYW5kTGluZSAoY29tbWFuZExpbmUsIE5VTEwpOworICAgIGFyZ3MgPSAoY2hhciAqKiltYWxsb2MoKG5hcmdzKzEpKihzaXplb2YgKmFyZ3MpKTsKKyAgICBpZiAoIGFyZ3MgPT0gTlVMTCApIHsKKwkJZXhpdCgtMSk7CisJfQorCVBhcnNlQ29tbWFuZExpbmUgKGNvbW1hbmRMaW5lLCBhcmdzKTsKKyAgICAgICAgCisJLyogUnVuIHRoZSBtYWluIGFwcGxpY2F0aW9uIGNvZGUgKi8KKwlTRExfbWFpbihuYXJncywgYXJncyk7CisJZnJlZSAoYXJncyk7CisJZnJlZSAoY29tbWFuZExpbmUpOworICAgCisgICAJLyogUmVtb3ZlIHVzZWxlc3Mgc3Rkb3V0LnR4dCBhbmQgc3RkZXJyLnR4dCAqLworICAgCWNsZWFudXBfb3V0cHV0ICgpOworI2Vsc2UgLy8gZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCisJU0RMX21haW4oYXJnYywgYXJndik7CisjZW5kaWYKKyAgIAkKKwkvKiBFeGl0IGNsZWFubHksIGNhbGxpbmcgYXRleGl0KCkgZnVuY3Rpb25zICovCisJZXhpdCAoMCk7ICAgIAorCisJLyogTmV2ZXIgcmVhY2hlZCwgYnV0IGtlZXBzIHRoZSBjb21waWxlciBxdWlldCAqLworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3MvU0laRS5yIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL1NJWkUucgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTYzZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL1NJWkUucgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3MvZXhwb3J0cy9NYWtlZmlsZSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9tYWNvcy9leHBvcnRzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMzdhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3MvZXhwb3J0cy9NYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACisKK0VYUE9SVFMgPSBTREwueAorSEVBREVSUyA9IFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETC5oIFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9hY3RpdmUuaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfYXVkaW8uaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfYnl0ZW9yZGVyLmggXAorCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX2Nkcm9tLmggXAorCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX2NvcHlpbmcuaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfY3B1aW5mby5oIFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9lbmRpYW4uaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfZXJyb3IuaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfZXZlbnRzLmggXAorCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX2dldGVudi5oIFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9qb3lzdGljay5oIFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9rZXlib2FyZC5oIFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9rZXlzeW0uaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfbG9hZHNvLmggXAorCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX21vdXNlLmggXAorCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX211dGV4LmggXAorCS4uLy4uLy4uLy4uL2luY2x1ZGUvU0RMX25hbWUuaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfcGxhdGZvcm0uaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfcXVpdC5oIFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9yd29wcy5oIFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF9zeXN3bS5oIFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF90aHJlYWQuaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfdGltZXIuaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfdHlwZXMuaCBcCisJLi4vLi4vLi4vLi4vaW5jbHVkZS9TRExfdmVyc2lvbi5oIFwKKwkuLi8uLi8uLi8uLi9pbmNsdWRlL1NETF92aWRlby5oCisKKworYWxsOiAkKEVYUE9SVFMpCisKKyQoRVhQT1JUUyk6IE1ha2VmaWxlIGdlbmRlZi5wbCAkKEhFQURFUlMpCisJcGVybCBnZW5kZWYucGwgJChIRUFERVJTKSA+JEAgfHwgcm0gJEAKKworY2xlYW46CisJcm0gLWYgJChFWFBPUlRTKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL2V4cG9ydHMvU0RMLnggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3MvZXhwb3J0cy9TREwueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTllOTZlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL2V4cG9ydHMvU0RMLngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL2V4cG9ydHMvZ2VuZGVmLnBsIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zL2V4cG9ydHMvZ2VuZGVmLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZmZjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3MvZXhwb3J0cy9nZW5kZWYucGwKQEAgLTAsMCArMSw0MyBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFByb2dyYW0gdG8gdGFrZSBhIHNldCBvZiBoZWFkZXIgZmlsZXMgYW5kIGdlbmVyYXRlIERMTCBleHBvcnQgZGVmaW5pdGlvbnMKKworIyBTcGVjaWFsIGV4cG9ydHMgdG8gaWdub3JlIGZvciB0aGlzIHBsYXRmb3JtCisKK3doaWxlICggKCRmaWxlID0gc2hpZnQoQEFSR1YpKSApIHsKKwlpZiAoICEgZGVmaW5lZChvcGVuKEZJTEUsICRmaWxlKSkgKSB7CisJCXdhcm4gIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworCQluZXh0OworCX0KKwkkcHJpbnRlZF9oZWFkZXIgPSAwOworCSRmaWxlID1+IHMsLiovLCw7CisJd2hpbGUgKDxGSUxFPikgeworCQlpZiAoIC8gREVDTFNQRUMuKiBTRExDQUxMIChbXlxzXChdKykvICkgeworCQkJaWYgKCBub3QgJGV4Y2x1ZGV7JDF9ICkgeworCQkJCXByaW50ICJcdCQxXHIiOworCQkJfQorCQl9CisJfQorCWNsb3NlKEZJTEUpOworfQorCisjIFNwZWNpYWwgZXhwb3J0cyB0byBpbmNsdWRlIGZvciB0aGlzIHBsYXRmb3JtCitwcmludCAiXHRTRExfcHV0ZW52XHIiOworcHJpbnQgIlx0U0RMX2dldGVudlxyIjsKK3ByaW50ICJcdFNETF9xc29ydFxyIjsKK3ByaW50ICJcdFNETF9yZXZjcHlcciI7CitwcmludCAiXHRTRExfc3RybGNweVxyIjsKK3ByaW50ICJcdFNETF9zdHJsY2F0XHIiOworcHJpbnQgIlx0U0RMX3N0cmR1cFxyIjsKK3ByaW50ICJcdFNETF9zdHJyZXZcciI7CitwcmludCAiXHRTRExfc3RydXByXHIiOworcHJpbnQgIlx0U0RMX3N0cmx3clxyIjsKK3ByaW50ICJcdFNETF9sdG9hXHIiOworcHJpbnQgIlx0U0RMX3VsdG9hXHIiOworcHJpbnQgIlx0U0RMX3N0cmNhc2VjbXBcciI7CitwcmludCAiXHRTRExfc3RybmNhc2VjbXBcciI7CitwcmludCAiXHRTRExfc25wcmludGZcciI7CitwcmludCAiXHRTRExfdnNucHJpbnRmXHIiOworcHJpbnQgIlx0U0RMX2ljb252XHIiOworcHJpbnQgIlx0U0RMX2ljb252X3N0cmluZ1xyIjsKK3ByaW50ICJcdFNETF9Jbml0UXVpY2tEcmF3XHIiOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zeC9JbmZvLnBsaXN0LmluIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zeC9JbmZvLnBsaXN0LmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3N4L0luZm8ucGxpc3QuaW4KcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9tYWNvc3gvSW5mby5wbGlzdC5pbgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zeC9TRExNYWluLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3N4L1NETE1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZkOTBjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zeC9TRExNYWluLmgKQEAgLTAsMCArMSwxNiBAQAorLyogICBTRExNYWluLm0gLSBtYWluIGVudHJ5IHBvaW50IGZvciBvdXIgQ29jb2EtaXplZCBTREwgYXBwCisgICAgICAgSW5pdGlhbCBWZXJzaW9uOiBEYXJyZWxsIFdhbGlzc2VyIDxkd2FsaXNzMUBwdXJkdWUuZWR1PgorICAgICAgIE5vbi1OSUItQ29kZSAmIG90aGVyIGNoYW5nZXM6IE1heCBIb3JuIDxtYXhAcXVlbmRpLmRlPgorCisgICAgRmVlbCBmcmVlIHRvIGN1c3RvbWl6ZSB0aGlzIGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzCisqLworCisjaWZuZGVmIF9TRExNYWluX2hfCisjZGVmaW5lIF9TRExNYWluX2hfCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgU0RMTWFpbiA6IE5TT2JqZWN0CitAZW5kCisKKyNlbmRpZiAvKiBfU0RMTWFpbl9oXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zeC9TRExNYWluLm0gYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3N4L1NETE1haW4ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGE3NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zeC9TRExNYWluLm0KQEAgLTAsMCArMSwzOTUgQEAKKy8qICAgU0RMTWFpbi5tIC0gbWFpbiBlbnRyeSBwb2ludCBmb3Igb3VyIENvY29hLWl6ZWQgU0RMIGFwcAorICAgICAgIEluaXRpYWwgVmVyc2lvbjogRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKyAgICAgICBOb24tTklCLUNvZGUgJiBvdGhlciBjaGFuZ2VzOiBNYXggSG9ybiA8bWF4QHF1ZW5kaS5kZT4KKworICAgIEZlZWwgZnJlZSB0byBjdXN0b21pemUgdGhpcyBmaWxlIHRvIHN1aXQgeW91ciBuZWVkcworKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETE1haW4uaCIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gLyogZm9yIE1BWFBBVEhMRU4gKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogRm9yIHNvbWUgcmVhb24sIEFwcGxlIHJlbW92ZWQgc2V0QXBwbGVNZW51IGZyb20gdGhlIGhlYWRlcnMgaW4gMTAuNCwKKyBidXQgdGhlIG1ldGhvZCBzdGlsbCBpcyB0aGVyZSBhbmQgd29ya3MuIFRvIGF2b2lkIHdhcm5pbmdzLCB3ZSBkZWNsYXJlCisgaXQgb3Vyc2VsdmVzIGhlcmUuICovCitAaW50ZXJmYWNlIE5TQXBwbGljYXRpb24oU0RMX01pc3NpbmdfTWV0aG9kcykKKy0gKHZvaWQpc2V0QXBwbGVNZW51OihOU01lbnUgKiltZW51OworQGVuZAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBTRExNYWluLm5pYiBvciBub3QgKi8KKyNkZWZpbmUJCVNETF9VU0VfTklCX0ZJTEUJMAorCisvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHVzZSBDUFMgKGRvY2tpbmcpIG9yIG5vdCAqLworI2RlZmluZQkJU0RMX1VTRV9DUFMJCTEKKyNpZmRlZiBTRExfVVNFX0NQUworLyogUG9ydGlvbnMgb2YgQ1BTLmggKi8KK3R5cGVkZWYgc3RydWN0IENQU1Byb2Nlc3NTZXJOdW0KK3sKKwlVSW50MzIJCWxvOworCVVJbnQzMgkJaGk7Cit9IENQU1Byb2Nlc3NTZXJOdW07CisKK2V4dGVybiBPU0VycglDUFNHZXRDdXJyZW50UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKK2V4dGVybiBPU0VyciAJQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbiggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuLCBVSW50MzIgX2FyZzIsIFVJbnQzMiBfYXJnMywgVUludDMyIF9hcmc0LCBVSW50MzIgX2FyZzUpOworZXh0ZXJuIE9TRXJyCUNQU1NldEZyb250UHJvY2VzcyggQ1BTUHJvY2Vzc1Nlck51bSAqcHNuKTsKKworI2VuZGlmIC8qIFNETF9VU0VfQ1BTICovCisKK3N0YXRpYyBpbnQgICAgZ0FyZ2M7CitzdGF0aWMgY2hhciAgKipnQXJndjsKK3N0YXRpYyBCT09MICAgZ0ZpbmRlckxhdW5jaDsKK3N0YXRpYyBCT09MICAgZ0NhbGxlZEFwcE1haW5saW5lID0gRkFMU0U7CisKK3N0YXRpYyBOU1N0cmluZyAqZ2V0QXBwbGljYXRpb25OYW1lKHZvaWQpCit7CisgICAgY29uc3QgTlNEaWN0aW9uYXJ5ICpkaWN0OworICAgIE5TU3RyaW5nICphcHBOYW1lID0gMDsKKworICAgIC8qIERldGVybWluZSB0aGUgYXBwbGljYXRpb24gbmFtZSAqLworICAgIGRpY3QgPSAoY29uc3QgTlNEaWN0aW9uYXJ5ICopQ0ZCdW5kbGVHZXRJbmZvRGljdGlvbmFyeShDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSk7CisgICAgaWYgKGRpY3QpCisgICAgICAgIGFwcE5hbWUgPSBbZGljdCBvYmplY3RGb3JLZXk6IEAiQ0ZCdW5kbGVOYW1lIl07CisgICAgCisgICAgaWYgKCFbYXBwTmFtZSBsZW5ndGhdKQorICAgICAgICBhcHBOYW1lID0gW1tOU1Byb2Nlc3NJbmZvIHByb2Nlc3NJbmZvXSBwcm9jZXNzTmFtZV07CisKKyAgICByZXR1cm4gYXBwTmFtZTsKK30KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKy8qIEEgaGVscGVyIGNhdGVnb3J5IGZvciBOU1N0cmluZyAqLworQGludGVyZmFjZSBOU1N0cmluZyAoUmVwbGFjZVN1YlN0cmluZykKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgTlNBcHBsaWNhdGlvbiAoU0RMQXBwbGljYXRpb24pCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBOU0FwcGxpY2F0aW9uIChTRExBcHBsaWNhdGlvbikKKy8qIEludm9rZWQgZnJvbSB0aGUgUXVpdCBtZW51IGl0ZW0gKi8KKy0gKHZvaWQpdGVybWluYXRlOihpZClzZW5kZXIKK3sKKyAgICAvKiBQb3N0IGEgU0RMX1FVSVQgZXZlbnQgKi8KKyAgICBTRExfRXZlbnQgZXZlbnQ7CisgICAgZXZlbnQudHlwZSA9IFNETF9RVUlUOworICAgIFNETF9QdXNoRXZlbnQoJmV2ZW50KTsKK30KK0BlbmQKKworLyogVGhlIG1haW4gY2xhc3Mgb2YgdGhlIGFwcGxpY2F0aW9uLCB0aGUgYXBwbGljYXRpb24ncyBkZWxlZ2F0ZSAqLworQGltcGxlbWVudGF0aW9uIFNETE1haW4KKworLyogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgLmFwcCdzIHBhcmVudCBkaXJlY3RvcnkgKi8KKy0gKHZvaWQpIHNldHVwV29ya2luZ0RpcmVjdG9yeTooQk9PTClzaG91bGRDaGRpcgoreworICAgIGlmIChzaG91bGRDaGRpcikKKyAgICB7CisgICAgICAgIGNoYXIgcGFyZW50ZGlyW01BWFBBVEhMRU5dOworICAgICAgICBDRlVSTFJlZiB1cmwgPSBDRkJ1bmRsZUNvcHlCdW5kbGVVUkwoQ0ZCdW5kbGVHZXRNYWluQnVuZGxlKCkpOworICAgICAgICBDRlVSTFJlZiB1cmwyID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCgwLCB1cmwpOworICAgICAgICBpZiAoQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24odXJsMiwgMSwgKFVJbnQ4ICopcGFyZW50ZGlyLCBNQVhQQVRITEVOKSkgeworICAgICAgICAgICAgY2hkaXIocGFyZW50ZGlyKTsgICAvKiBjaGRpciB0byB0aGUgYmluYXJ5IGFwcCdzIHBhcmVudCAqLworICAgICAgICB9CisgICAgICAgIENGUmVsZWFzZSh1cmwpOworICAgICAgICBDRlJlbGVhc2UodXJsMik7CisgICAgfQorfQorCisjaWYgU0RMX1VTRV9OSUJfRklMRQorCisvKiBGaXggbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCistICh2b2lkKWZpeE1lbnU6KE5TTWVudSAqKWFNZW51IHdpdGhBcHBOYW1lOihOU1N0cmluZyAqKWFwcE5hbWUKK3sKKyAgICBOU1JhbmdlIGFSYW5nZTsKKyAgICBOU0VudW1lcmF0b3IgKmVudW1lcmF0b3I7CisgICAgTlNNZW51SXRlbSAqbWVudUl0ZW07CisKKyAgICBhUmFuZ2UgPSBbW2FNZW51IHRpdGxlXSByYW5nZU9mU3RyaW5nOkAiU0RMIEFwcCJdOworICAgIGlmIChhUmFuZ2UubGVuZ3RoICE9IDApCisgICAgICAgIFthTWVudSBzZXRUaXRsZTogW1thTWVudSB0aXRsZV0gc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTphUmFuZ2Ugd2l0aDphcHBOYW1lXV07CisKKyAgICBlbnVtZXJhdG9yID0gW1thTWVudSBpdGVtQXJyYXldIG9iamVjdEVudW1lcmF0b3JdOworICAgIHdoaWxlICgobWVudUl0ZW0gPSBbZW51bWVyYXRvciBuZXh0T2JqZWN0XSkpCisgICAgeworICAgICAgICBhUmFuZ2UgPSBbW21lbnVJdGVtIHRpdGxlXSByYW5nZU9mU3RyaW5nOkAiU0RMIEFwcCJdOworICAgICAgICBpZiAoYVJhbmdlLmxlbmd0aCAhPSAwKQorICAgICAgICAgICAgW21lbnVJdGVtIHNldFRpdGxlOiBbW21lbnVJdGVtIHRpdGxlXSBzdHJpbmdCeVJlcGxhY2luZ1JhbmdlOmFSYW5nZSB3aXRoOmFwcE5hbWVdXTsKKyAgICAgICAgaWYgKFttZW51SXRlbSBoYXNTdWJtZW51XSkKKyAgICAgICAgICAgIFtzZWxmIGZpeE1lbnU6W21lbnVJdGVtIHN1Ym1lbnVdIHdpdGhBcHBOYW1lOmFwcE5hbWVdOworICAgIH0KK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgc2V0QXBwbGljYXRpb25NZW51KHZvaWQpCit7CisgICAgLyogd2FybmluZzogdGhpcyBjb2RlIGlzIHZlcnkgb2RkICovCisgICAgTlNNZW51ICphcHBsZU1lbnU7CisgICAgTlNNZW51SXRlbSAqbWVudUl0ZW07CisgICAgTlNTdHJpbmcgKnRpdGxlOworICAgIE5TU3RyaW5nICphcHBOYW1lOworICAgIAorICAgIGFwcE5hbWUgPSBnZXRBcHBsaWNhdGlvbk5hbWUoKTsKKyAgICBhcHBsZU1lbnUgPSBbW05TTWVudSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiJdOworICAgIAorICAgIC8qIEFkZCBtZW51IGl0ZW1zICovCisgICAgdGl0bGUgPSBbQCJBYm91dCAiIHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOmFwcE5hbWVdOworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTp0aXRsZSBhY3Rpb246QHNlbGVjdG9yKG9yZGVyRnJvbnRTdGFuZGFyZEFib3V0UGFuZWw6KSBrZXlFcXVpdmFsZW50OkAiIl07CisKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW06W05TTWVudUl0ZW0gc2VwYXJhdG9ySXRlbV1dOworCisgICAgdGl0bGUgPSBbQCJIaWRlICIgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6YXBwTmFtZV07CisgICAgW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOnRpdGxlIGFjdGlvbjpAc2VsZWN0b3IoaGlkZTopIGtleUVxdWl2YWxlbnQ6QCJoIl07CisKKyAgICBtZW51SXRlbSA9IChOU01lbnVJdGVtICopW2FwcGxlTWVudSBhZGRJdGVtV2l0aFRpdGxlOkAiSGlkZSBPdGhlcnMiIGFjdGlvbjpAc2VsZWN0b3IoaGlkZU90aGVyQXBwbGljYXRpb25zOikga2V5RXF1aXZhbGVudDpAImgiXTsKKyAgICBbbWVudUl0ZW0gc2V0S2V5RXF1aXZhbGVudE1vZGlmaWVyTWFzazooTlNBbHRlcm5hdGVLZXlNYXNrfE5TQ29tbWFuZEtleU1hc2spXTsKKworICAgIFthcHBsZU1lbnUgYWRkSXRlbVdpdGhUaXRsZTpAIlNob3cgQWxsIiBhY3Rpb246QHNlbGVjdG9yKHVuaGlkZUFsbEFwcGxpY2F0aW9uczopIGtleUVxdWl2YWxlbnQ6QCIiXTsKKworICAgIFthcHBsZU1lbnUgYWRkSXRlbTpbTlNNZW51SXRlbSBzZXBhcmF0b3JJdGVtXV07CisKKyAgICB0aXRsZSA9IFtAIlF1aXQgIiBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzphcHBOYW1lXTsKKyAgICBbYXBwbGVNZW51IGFkZEl0ZW1XaXRoVGl0bGU6dGl0bGUgYWN0aW9uOkBzZWxlY3Rvcih0ZXJtaW5hdGU6KSBrZXlFcXVpdmFsZW50OkAicSJdOworCisgICAgCisgICAgLyogUHV0IG1lbnUgaW50byB0aGUgbWVudWJhciAqLworICAgIG1lbnVJdGVtID0gW1tOU01lbnVJdGVtIGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiIiBhY3Rpb246bmlsIGtleUVxdWl2YWxlbnQ6QCIiXTsKKyAgICBbbWVudUl0ZW0gc2V0U3VibWVudTphcHBsZU1lbnVdOworICAgIFtbTlNBcHAgbWFpbk1lbnVdIGFkZEl0ZW06bWVudUl0ZW1dOworCisgICAgLyogVGVsbCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IHRoYXQgdGhpcyBpcyBub3cgdGhlIGFwcGxpY2F0aW9uIG1lbnUgKi8KKyAgICBbTlNBcHAgc2V0QXBwbGVNZW51OmFwcGxlTWVudV07CisKKyAgICAvKiBGaW5hbGx5IGdpdmUgdXAgb3VyIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdHMgKi8KKyAgICBbYXBwbGVNZW51IHJlbGVhc2VdOworICAgIFttZW51SXRlbSByZWxlYXNlXTsKK30KKworLyogQ3JlYXRlIGEgd2luZG93IG1lbnUgKi8KK3N0YXRpYyB2b2lkIHNldHVwV2luZG93TWVudSh2b2lkKQoreworICAgIE5TTWVudSAgICAgICp3aW5kb3dNZW51OworICAgIE5TTWVudUl0ZW0gICp3aW5kb3dNZW51SXRlbTsKKyAgICBOU01lbnVJdGVtICAqbWVudUl0ZW07CisKKyAgICB3aW5kb3dNZW51ID0gW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0bGU6QCJXaW5kb3ciXTsKKyAgICAKKyAgICAvKiAiTWluaW1pemUiIGl0ZW0gKi8KKyAgICBtZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIk1pbmltaXplIiBhY3Rpb246QHNlbGVjdG9yKHBlcmZvcm1NaW5pYXR1cml6ZTopIGtleUVxdWl2YWxlbnQ6QCJtIl07CisgICAgW3dpbmRvd01lbnUgYWRkSXRlbTptZW51SXRlbV07CisgICAgW21lbnVJdGVtIHJlbGVhc2VdOworICAgIAorICAgIC8qIFB1dCBtZW51IGludG8gdGhlIG1lbnViYXIgKi8KKyAgICB3aW5kb3dNZW51SXRlbSA9IFtbTlNNZW51SXRlbSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIldpbmRvdyIgYWN0aW9uOm5pbCBrZXlFcXVpdmFsZW50OkAiIl07CisgICAgW3dpbmRvd01lbnVJdGVtIHNldFN1Ym1lbnU6d2luZG93TWVudV07CisgICAgW1tOU0FwcCBtYWluTWVudV0gYWRkSXRlbTp3aW5kb3dNZW51SXRlbV07CisgICAgCisgICAgLyogVGVsbCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IHRoYXQgdGhpcyBpcyBub3cgdGhlIHdpbmRvdyBtZW51ICovCisgICAgW05TQXBwIHNldFdpbmRvd3NNZW51OndpbmRvd01lbnVdOworCisgICAgLyogRmluYWxseSBnaXZlIHVwIG91ciByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RzICovCisgICAgW3dpbmRvd01lbnUgcmVsZWFzZV07CisgICAgW3dpbmRvd01lbnVJdGVtIHJlbGVhc2VdOworfQorCisvKiBSZXBsYWNlbWVudCBmb3IgTlNBcHBsaWNhdGlvbk1haW4gKi8KK3N0YXRpYyB2b2lkIEN1c3RvbUFwcGxpY2F0aW9uTWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIE5TQXV0b3JlbGVhc2VQb29sCSpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisgICAgU0RMTWFpbgkJCQkqc2RsTWFpbjsKKworICAgIC8qIEVuc3VyZSB0aGUgYXBwbGljYXRpb24gb2JqZWN0IGlzIGluaXRpYWxpc2VkICovCisgICAgW05TQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIAorI2lmZGVmIFNETF9VU0VfQ1BTCisgICAgeworICAgICAgICBDUFNQcm9jZXNzU2VyTnVtIFBTTjsKKyAgICAgICAgLyogVGVsbCB0aGUgZG9jayBhYm91dCB1cyAqLworICAgICAgICBpZiAoIUNQU0dldEN1cnJlbnRQcm9jZXNzKCZQU04pKQorICAgICAgICAgICAgaWYgKCFDUFNFbmFibGVGb3JlZ3JvdW5kT3BlcmF0aW9uKCZQU04sMHgwMywweDNDLDB4MkMsMHgxMTAzKSkKKyAgICAgICAgICAgICAgICBpZiAoIUNQU1NldEZyb250UHJvY2VzcygmUFNOKSkKKyAgICAgICAgICAgICAgICAgICAgW05TQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworICAgIH0KKyNlbmRpZiAvKiBTRExfVVNFX0NQUyAqLworCisgICAgLyogU2V0IHVwIHRoZSBtZW51YmFyICovCisgICAgW05TQXBwIHNldE1haW5NZW51OltbTlNNZW51IGFsbG9jXSBpbml0XV07CisgICAgc2V0QXBwbGljYXRpb25NZW51KCk7CisgICAgc2V0dXBXaW5kb3dNZW51KCk7CisKKyAgICAvKiBDcmVhdGUgU0RMTWFpbiBhbmQgbWFrZSBpdCB0aGUgYXBwIGRlbGVnYXRlICovCisgICAgc2RsTWFpbiA9IFtbU0RMTWFpbiBhbGxvY10gaW5pdF07CisgICAgW05TQXBwIHNldERlbGVnYXRlOnNkbE1haW5dOworICAgIAorICAgIC8qIFN0YXJ0IHRoZSBtYWluIGV2ZW50IGxvb3AgKi8KKyAgICBbTlNBcHAgcnVuXTsKKyAgICAKKyAgICBbc2RsTWFpbiByZWxlYXNlXTsKKyAgICBbcG9vbCByZWxlYXNlXTsKK30KKworI2VuZGlmCisKKworLyoKKyAqIENhdGNoIGRvY3VtZW50IG9wZW4gcmVxdWVzdHMuLi50aGlzIGxldHMgdXMgbm90aWNlIGZpbGVzIHdoZW4gdGhlIGFwcAorICogIHdhcyBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgYSBkb2N1bWVudCwgb3Igd2hlbiBhIGRvY3VtZW50IHdhcworICogIGRyYWdnZWQvZHJvcHBlZCBvbiB0aGUgYXBwJ3MgaWNvbi4gWW91IG5lZWQgdG8gaGF2ZSBhCisgKiAgQ0ZCdW5kbGVEb2N1bWVudHNUeXBlIHNlY3Rpb24gaW4geW91ciBJbmZvLnBsaXN0IHRvIGdldCB0aGlzIG1lc3NhZ2UsCisgKiAgYXBwYXJlbnRseS4KKyAqCisgKiBGaWxlcyBhcmUgYWRkZWQgdG8gZ0FyZ3YsIHNvIHRvIHRoZSBhcHAsIHRoZXknbGwgbG9vayBsaWtlIGNvbW1hbmQgbGluZQorICogIGFyZ3VtZW50cy4gUHJldmlvdXNseSwgYXBwcyBsYXVuY2hlZCBmcm9tIHRoZSBmaW5kZXIgaGFkIG5vdGhpbmcgYnV0CisgKiAgYW4gYXJndlswXS4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgbWF5IGJlIHJlY2VpdmVkIG11bHRpcGxlIHRpbWVzIHRvIG9wZW4gc2V2ZXJhbCBkb2NzIG9uIGxhdW5jaC4KKyAqCisgKiBUaGlzIG1lc3NhZ2UgaXMgaWdub3JlZCBvbmNlIHRoZSBhcHAncyBtYWlubGluZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKy0gKEJPT0wpYXBwbGljYXRpb246KE5TQXBwbGljYXRpb24gKil0aGVBcHBsaWNhdGlvbiBvcGVuRmlsZTooTlNTdHJpbmcgKilmaWxlbmFtZQoreworICAgIGNvbnN0IGNoYXIgKnRlbXBhcmc7CisgICAgc2l6ZV90IGFyZ2xlbjsKKyAgICBjaGFyICphcmc7CisgICAgY2hhciAqKm5ld2FyZ3Y7CisKKyAgICBpZiAoIWdGaW5kZXJMYXVuY2gpICAvKiBNYWNPUyBpcyBwYXNzaW5nIGNvbW1hbmQgbGluZSBhcmdzLiAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoZ0NhbGxlZEFwcE1haW5saW5lKSAgLyogYXBwIGhhcyBzdGFydGVkLCBpZ25vcmUgdGhpcyBkb2N1bWVudC4gKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdGVtcGFyZyA9IFtmaWxlbmFtZSBVVEY4U3RyaW5nXTsKKyAgICBhcmdsZW4gPSBTRExfc3RybGVuKHRlbXBhcmcpICsgMTsKKyAgICBhcmcgPSAoY2hhciAqKSBTRExfbWFsbG9jKGFyZ2xlbik7CisgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBuZXdhcmd2ID0gKGNoYXIgKiopIHJlYWxsb2MoZ0FyZ3YsIHNpemVvZiAoY2hhciAqKSAqIChnQXJnYyArIDIpKTsKKyAgICBpZiAobmV3YXJndiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX2ZyZWUoYXJnKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBnQXJndiA9IG5ld2FyZ3Y7CisKKyAgICBTRExfc3RybGNweShhcmcsIHRlbXBhcmcsIGFyZ2xlbik7CisgICAgZ0FyZ3ZbZ0FyZ2MrK10gPSBhcmc7CisgICAgZ0FyZ3ZbZ0FyZ2NdID0gTlVMTDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKiBDYWxsZWQgd2hlbiB0aGUgaW50ZXJuYWwgZXZlbnQgbG9vcCBoYXMganVzdCBzdGFydGVkIHJ1bm5pbmcgKi8KKy0gKHZvaWQpIGFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOiAoTlNOb3RpZmljYXRpb24gKikgbm90ZQoreworICAgIGludCBzdGF0dXM7CisKKyAgICAvKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSAuYXBwJ3MgcGFyZW50IGRpcmVjdG9yeSAqLworICAgIFtzZWxmIHNldHVwV29ya2luZ0RpcmVjdG9yeTpnRmluZGVyTGF1bmNoXTsKKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICAvKiBTZXQgdGhlIG1haW4gbWVudSB0byBjb250YWluIHRoZSByZWFsIGFwcCBuYW1lIGluc3RlYWQgb2YgIlNETCBBcHAiICovCisgICAgW3NlbGYgZml4TWVudTpbTlNBcHAgbWFpbk1lbnVdIHdpdGhBcHBOYW1lOmdldEFwcGxpY2F0aW9uTmFtZSgpXTsKKyNlbmRpZgorCisgICAgLyogSGFuZCBvZmYgdG8gbWFpbiBhcHBsaWNhdGlvbiBjb2RlICovCisgICAgZ0NhbGxlZEFwcE1haW5saW5lID0gVFJVRTsKKyAgICBzdGF0dXMgPSBTRExfbWFpbiAoZ0FyZ2MsIGdBcmd2KTsKKworICAgIC8qIFdlJ3JlIGRvbmUsIHRoYW5rIHlvdSBmb3IgcGxheWluZyAqLworICAgIGV4aXQoc3RhdHVzKTsKK30KK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gTlNTdHJpbmcgKFJlcGxhY2VTdWJTdHJpbmcpCisKKy0gKE5TU3RyaW5nICopc3RyaW5nQnlSZXBsYWNpbmdSYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aDooTlNTdHJpbmcgKilhU3RyaW5nCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZmZlclNpemU7CisgICAgdW5zaWduZWQgaW50IHNlbGZMZW4gPSBbc2VsZiBsZW5ndGhdOworICAgIHVuc2lnbmVkIGludCBhU3RyaW5nTGVuID0gW2FTdHJpbmcgbGVuZ3RoXTsKKyAgICB1bmljaGFyICpidWZmZXI7CisgICAgTlNSYW5nZSBsb2NhbFJhbmdlOworICAgIE5TU3RyaW5nICpyZXN1bHQ7CisKKyAgICBidWZmZXJTaXplID0gc2VsZkxlbiArIGFTdHJpbmdMZW4gLSBhUmFuZ2UubGVuZ3RoOworICAgIGJ1ZmZlciA9ICh1bmljaGFyICopTlNBbGxvY2F0ZU1lbW9yeVBhZ2VzKGJ1ZmZlclNpemUqc2l6ZW9mKHVuaWNoYXIpKTsKKyAgICAKKyAgICAvKiBHZXQgZmlyc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVJhbmdlLmxvY2F0aW9uOworICAgIFtzZWxmIGdldENoYXJhY3RlcnM6YnVmZmVyIHJhbmdlOmxvY2FsUmFuZ2VdOworICAgIAorICAgIC8qIEdldCBtaWRkbGUgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSAwOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gYVN0cmluZ0xlbjsKKyAgICBbYVN0cmluZyBnZXRDaGFyYWN0ZXJzOihidWZmZXIrYVJhbmdlLmxvY2F0aW9uKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAgCisgICAgLyogR2V0IGxhc3QgcGFydCBpbnRvIGJ1ZmZlciAqLworICAgIGxvY2FsUmFuZ2UubG9jYXRpb24gPSBhUmFuZ2UubG9jYXRpb24gKyBhUmFuZ2UubGVuZ3RoOworICAgIGxvY2FsUmFuZ2UubGVuZ3RoID0gc2VsZkxlbiAtIGxvY2FsUmFuZ2UubG9jYXRpb247CisgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczooYnVmZmVyK2FSYW5nZS5sb2NhdGlvbithU3RyaW5nTGVuKSByYW5nZTpsb2NhbFJhbmdlXTsKKyAgICAKKyAgICAvKiBCdWlsZCBvdXRwdXQgc3RyaW5nICovCisgICAgcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhDaGFyYWN0ZXJzOmJ1ZmZlciBsZW5ndGg6YnVmZmVyU2l6ZV07CisgICAgCisgICAgTlNEZWFsbG9jYXRlTWVtb3J5UGFnZXMoYnVmZmVyLCBidWZmZXJTaXplKTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCisKKworCisjaWZkZWYgbWFpbgorIyAgdW5kZWYgbWFpbgorI2VuZGlmCisKKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBleGVjdXRhYmxlIC0gc2hvdWxkICpub3QqIGJlIFNETF9tYWluISAqLworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgaW50byBhIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIC8qIFRoaXMgaXMgcGFzc2VkIGlmIHdlIGFyZSBsYXVuY2hlZCBieSBkb3VibGUtY2xpY2tpbmcgKi8KKyAgICBpZiAoIGFyZ2MgPj0gMiAmJiBzdHJuY21wIChhcmd2WzFdLCAiLXBzbiIsIDQpID09IDAgKSB7CisgICAgICAgIGdBcmd2ID0gKGNoYXIgKiopIFNETF9tYWxsb2Moc2l6ZW9mIChjaGFyICopICogMik7CisgICAgICAgIGdBcmd2WzBdID0gYXJndlswXTsKKyAgICAgICAgZ0FyZ3ZbMV0gPSBOVUxMOworICAgICAgICBnQXJnYyA9IDE7CisgICAgICAgIGdGaW5kZXJMYXVuY2ggPSBZRVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGdBcmdjID0gYXJnYzsKKyAgICAgICAgZ0FyZ3YgPSAoY2hhciAqKikgU0RMX21hbGxvYyhzaXplb2YgKGNoYXIgKikgKiAoYXJnYysxKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYXJnYzsgaSsrKQorICAgICAgICAgICAgZ0FyZ3ZbaV0gPSBhcmd2W2ldOworICAgICAgICBnRmluZGVyTGF1bmNoID0gTk87CisgICAgfQorCisvKiBBTkRST0lEX0JFR0lOICovCisgICAgLyogaWYgLW5vLXdpbmRvdyBpcyB1c2VkLCB3ZSBkb24ndCB3YW50IHRvIGxhdW5jaCBhIGdyYXBoaWNhbAorICAgICAqIGFwcGxpY2F0aW9uIHRoYXQgY3JlYXRlcyBhIE1lbnUgYmFyIGFuZCBzdGVhbHMgdGhlIGZvY3VzLgorICAgICAqLworICAgIHsKKyAgICAgICAgaW50IG5uOworICAgICAgICBmb3IgKG5uID0gMDsgbm4gPCBhcmdjOyBubisrKSB7CisgICAgICAgICAgICBpZiAoICFzdHJjbXAoIGFyZ3Zbbm5dLCAiLW5vLXdpbmRvdyIgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU0RMX21haW4gKGFyZ2MsIGFyZ3YpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorLyogQU5EUk9JRF9FTkQgKi8KKworI2lmIFNETF9VU0VfTklCX0ZJTEUKKyAgICBOU0FwcGxpY2F0aW9uTWFpbiAoYXJnYywgYXJndik7CisjZWxzZQorICAgIEN1c3RvbUFwcGxpY2F0aW9uTWFpbiAoYXJnYywgYXJndik7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zeC9TRExNYWluLm5pYi9jbGFzc2VzLm5pYiBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9tYWNvc3gvU0RMTWFpbi5uaWIvY2xhc3Nlcy5uaWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9tYWNvc3gvU0RMTWFpbi5uaWIvY2xhc3Nlcy5uaWIKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9tYWNvc3gvU0RMTWFpbi5uaWIvY2xhc3Nlcy5uaWIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvbWFpbi9tYWNvc3gvU0RMTWFpbi5uaWIvaW5mby5uaWIgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3N4L1NETE1haW4ubmliL2luZm8ubmliCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3N4L1NETE1haW4ubmliL2luZm8ubmliCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vbWFjb3N4L1NETE1haW4ubmliL2luZm8ubmliCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3N4L1NETE1haW4ubmliL29iamVjdHMubmliIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zeC9TRExNYWluLm5pYi9vYmplY3RzLm5pYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zeC9TRExNYWluLm5pYi9vYmplY3RzLm5pYgpyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zeC9TRExNYWluLm5pYi9vYmplY3RzLm5pYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL21haW4vbWFjb3N4L2luZm8ubmliIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zeC9pbmZvLm5pYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL21hY29zeC9pbmZvLm5pYgpyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL21hY29zeC9pbmZvLm5pYgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL3F0b3BpYS9TRExfcXRvcGlhX21haW4uY2MgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vcXRvcGlhL1NETF9xdG9waWFfbWFpbi5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy9tYWluL3F0b3BpYS9TRExfcXRvcGlhX21haW4uY2MKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9xdG9waWEvU0RMX3F0b3BpYV9tYWluLmNjCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vc3ltYmlhbi9FS0ExL1NETF9tYWluLmNwcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9zeW1iaWFuL0VLQTEvU0RMX21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2RiODcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vc3ltYmlhbi9FS0ExL1NETF9tYWluLmNwcApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AZGV2b2x1dGlvbi5jb20KKyovCisKKy8qCisgICAgU0RMX21haW4uY3BwCisgICAgVGhlIEVwb2MgZXhlY3V0YWJsZSBzdGFydHVwIGZ1bmN0aW9ucyAKKworICAgIEVwb2MgdmVyc2lvbiBieSBIYW5udSBWaWl0YWxhIChoYW5udS5qLnZpaXRhbGFAbWJuZXQuZmkpCisqLworCisjaW5jbHVkZSA8ZTMyc3RkLmg+CisjaW5jbHVkZSA8ZTMyZGVmLmg+CisjaW5jbHVkZSA8ZTMyc3ZyLmg+CisjaW5jbHVkZSA8ZTMyYmFzZS5oPgorI2luY2x1ZGUgPGVzdGxpYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dzMyc3RkLmg+CisjaW5jbHVkZSA8YXBndGFzay5oPgorCisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisKKyNpZiBkZWZpbmVkKF9fV0lOU19fKQorI2luY2x1ZGUgPGVzdHczMi5oPgorSU1QT1JUX0Mgdm9pZCBSZWdpc3RlcldzRXhlKGNvbnN0IFREZXNDICZhTmFtZSk7CisjZW5kaWYKKworLyogVGhlIHByb3RvdHlwZSBmb3IgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbigpIGZ1bmN0aW9uICovCisjZGVmaW5lIG1haW4JU0RMX21haW4KK2V4dGVybiAiQyIgaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmVudnBbXSk7CitleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50IHJldCk7CisKKworLyogRXBvYyBtYWluIGZ1bmN0aW9uICovCisKKyNpZmRlZiBfX1dJTlNfXworCisKK3ZvaWQgR2V0Q21kTGluZShpbnQmIGFBcmdjLCBjaGFyKiomIGFBcmd2KQorICAgIHsKKyAgICBSQ2h1bmsgY2h1bms7CisKKyAgICBpZihjaHVuay5PcGVuR2xvYmFsKFJUaHJlYWQoKS5OYW1lKCksIEVUcnVlKSAhPSBLRXJyTm9uZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVFVpbnQqIHB0ciA9IChUVWludCopIGNodW5rLkJhc2UoKTsKKyAgICBpZihwdHIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICBhQXJnYyA9IChpbnQpICAgICoocHRyKTsgLy8gY291bnQKKyAgICAgICAgYUFyZ3YgPSAoY2hhcioqKSAqKHB0ciArIDEpOworICAgICAgICB9CisgICAgY2h1bmsuQ2xvc2UoKTsKKyAgICB9CisKKyNlbmRpZgorCisKK1RJbnQgRTMyTWFpbigpCisgICAgeworICAgIC8qICBHZXQgdGhlIGNsZWFuLXVwIHN0YWNrICovCisJQ1RyYXBDbGVhbnVwKiBjbGVhbnVwID0gQ1RyYXBDbGVhbnVwOjpOZXcoKTsKKworICAgIC8qIEFycmFuZ2UgZm9yIG11bHRpLXRocmVhZGVkIG9wZXJhdGlvbiAqLworCVNwYXduUG9zaXhTZXJ2ZXJUaHJlYWQoKTsJCisKKyAgICAvKiBHZXQgYXJncyBhbmQgZW52aXJvbm1lbnQgKi8KKwlpbnQgYXJnYz0wOworCWNoYXIqKiBhcmd2PTA7CisJY2hhcioqIGVudnA9MDsKKworI2lmbmRlZiBfX1dJTlNfXworCV9fY3J0MChhcmdjLGFyZ3YsZW52cCk7CQorI2Vsc2UKKyAgICBHZXRDbWRMaW5lKGFyZ2MsIGFyZ3YpOworI2VuZGlmCisgICAgLyogU3RhcnQgdGhlIGFwcGxpY2F0aW9uISAqLworCisgICAgLyogQ3JlYXRlIHN0ZGxpYiAqLworICAgIF9SRUVOVDsKKworICAgIC8qIFNldCBwcm9jZXNzIGFuZCB0aHJlYWQgcHJpb3JpdHkgYW5kIG5hbWUgKi8KKworICAgIFJUaHJlYWQgY3VycmVudFRocmVhZDsKKwlSUHJvY2VzcyB0aGlzUHJvY2VzczsKKwlUUGFyc2UgZXhlTmFtZTsKKwlleGVOYW1lLlNldCh0aGlzUHJvY2Vzcy5GaWxlTmFtZSgpLCBOVUxMLCBOVUxMKTsKKyAgICBjdXJyZW50VGhyZWFkLlJlbmFtZShleGVOYW1lLk5hbWUoKSk7CisgICAgY3VycmVudFRocmVhZC5TZXRQcm9jZXNzUHJpb3JpdHkoRVByaW9yaXR5TG93KTsKKyAgICBjdXJyZW50VGhyZWFkLlNldFByaW9yaXR5KEVQcmlvcml0eU11Y2hMZXNzKTsKKworICAgICAvKiBDYWxsIHN0ZGxpYiBtYWluICovCisgICAgaW50IHJldCA9IG1haW4oYXJnYywgYXJndiwgZW52cCk7IC8qICEhIHByb2Nlc3MgZXhpdHMgaGVyZSBpZiB0aGVyZSBpcyAiZXhpdCgpIiBpbiBtYWluISAqLwkKKyAgICAKKyAgICAvKiBDYWxsIGV4aXQgKi8KKyAgICAvL2V4aXQocmV0KTsgLyogISEgcHJvY2VzcyBleGl0cyBoZXJlISAqLwkKKyAgICAvL01hcmt1czogSSBkbyBub3QgdW5kZXJzdGFuZCBhYm92ZQorICAgIC8vSSBjb21tZW50ZWQgaXQgYXQgbGV0IHRoaXMgZnVuY3Rpb24KKyAgICAvL3RvIHJldHVybiByZXQgdmFsdWUgLSB3YXMgaXQgcHVycG9zZQorICAgIC8vdGhhdCBjbGVhbnVwIGJlbG93IGlzIG5vdCBjYWxsZWQgYXQgYWxsIC0gd2h5PworCisgICAgLyogRnJlZSByZXNvdXJjZXMgYW5kIHJldHVybiAqLworICAgIAorICAgIF9jbGVhbnVwKCk7IC8vdGhpcyBpcyBub3JtYWxseSBjYWxsZWQgYXQgZXhpdCwgSSBjYWxsIGl0IGhlcmUsIE1hcmt1cyAKKworICAgIENsb3NlU1RETElCKCk7CisgICAJZGVsZXRlIGNsZWFudXA7CQorI2lmZGVmIF9fV0lOU19fCisvLyAgICBVc2VyOjpQYW5pYyhfTCgiZXhpdCIpLCByZXQpOworICAvLyAgUlRocmVhZCgpLktpbGwocmV0KTsgLy9NYXJrdXMgIGdldCByaWQgb2YgdGhpcyB0aHJlYWQKKyAgLy8gIFJUaHJlYWQoKS5SYWlzZUV4Y2VwdGlvbihFRXhjS2lsbCk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0Oy8vTWFya3VzLCBvciBleGl0KHJldCk7ID8/CisgIC8vcmV0dXJuKEtFcnJOb25lKTsKKyAgICB9CisKKworI2lmZGVmIF9fV0lOU19fCitFWFBPUlRfQyBUSW50IFdpbnNNYWluKCkKKyAgICB7CisgICAgcmV0dXJuIEUzMk1haW4oKTsKKyAvLyAgIHJldHVybiBXaW5zTWFpbigwLCAwLCAwKTsKKyAgICB9CisjZW5kaWYKKworLyogRXBvYyBkbGwgZW50cnkgcG9pbnQgKi8KKyNpZiBkZWZpbmVkKF9fV0lOU19fKQorR0xERUZfQyBUSW50IEUzMkRsbChURGxsUmVhc29uKQorCXsKKwlyZXR1cm4oS0Vyck5vbmUpOworCX0KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9zeW1iaWFuL0VLQTIvU0RMX21haW4uY3BwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL3N5bWJpYW4vRUtBMi9TRExfbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjNjlkNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9zeW1iaWFuL0VLQTIvU0RMX21haW4uY3BwCkBAIC0wLDAgKzEsMTAzNSBAQAorLyoKKyAgICBTRExfTWFpbi5jcHAKKyAgICBTeW1iaWFuIE9TIHNlcnZpY2VzIGZvciBTREwKKworICAgIE1hcmt1cyBNZXJ0YW1hCisqLworCisKKyNpbmNsdWRlICJlcG9jX3NkbC5oIgorCisjaW5jbHVkZSJzZGxlcG9jYXBpLmgiCisjaW5jbHVkZSA8ZTMyYmFzZS5oPgorI2luY2x1ZGUgPGVzdGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YmFkZXNjYS5oPgorCisjaW5jbHVkZSAidmVjdG9yYnVmZmVyLmgiCisjaW5jbHVkZSA8dzMyc3RkLmg+CisjaW5jbHVkZSA8YWtuYXBwdWkuaD4KKyNpbmNsdWRlIDxha25hcHAuaD4KKyNpbmNsdWRlICJTRExfZXBvY2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX2tleXN5bS5oIgorI2luY2x1ZGUgImRzYS5oIgorCisKKyNpZmRlZiBTWU1CSUFOQworI2luY2x1ZGUgPHJlZW50Lmg+CisjZW5kaWYKKworLy9NYXJrdXMgTWVydGFtYQorCisKK2V4dGVybiBTRExLZXkqIEtleU1hcCgpOworZXh0ZXJuIHZvaWQgUmVzZXRLZXlNYXAoKTsKKworY2xhc3MgQ0N1cnJlbnRBcHBVaTsKKworLy9jb25zdCBUVWlkIEtTRExVaWQgPSAgeyAweEYwMUYzRDY5IH07CisKK05PTlNIQVJBQkxFX0NMQVNTKEVudlV0aWxzKQorCXsKKwlwdWJsaWM6CisJc3RhdGljIHZvaWQgRGlzYWJsZUtleUJsb2NraW5nKCk7CisJc3RhdGljIFRCb29sIFJlbmRlenZvdXMoUlRocmVhZCYgYVRocmVhZCwgVFJlcXVlc3RTdGF0dXMmIGFTdGF0dXMpOworCX07CisKK1RJbnQgUGFuaWMoVEludCBhRXJyLCBUSW50IGFMaW5lKQorCXsKKwlUQnVmPDY0PiBiOworCWIuRm9ybWF0KF9MKCJNYWluIGF0ICVkIiksIGFMaW5lKTsKKwlVc2VyOjpQYW5pYyhiLCBhRXJyKTsKKwlyZXR1cm4gMDsJCisJfQorCQorCitOT05TSEFSQUJMRV9DTEFTUyhDQ3VycmVudEFwcFVpKSA6IHB1YmxpYyBDQWtuQXBwVWkKKwl7CisJcHVibGljOgorCXN0YXRpYyBDQ3VycmVudEFwcFVpKiBDYXN0KENFaWtBcHBVaSogYVVpKTsKKwl2b2lkIERpc2FibGVLZXlCbG9ja2luZygpOworCX07CisJCisJCitDQ3VycmVudEFwcFVpKiBDQ3VycmVudEFwcFVpOjpDYXN0KENFaWtBcHBVaSogYVVpKQorCXsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8Q0N1cnJlbnRBcHBVaSo+KGFVaSk7CQorCX0KKwkKK3ZvaWQgQ0N1cnJlbnRBcHBVaTo6RGlzYWJsZUtleUJsb2NraW5nKCkJCisJeworCVNldEtleUJsb2NrTW9kZShFTm9LZXlCbG9jayk7CQorCX0KKworCitjbGFzcyBDRXZlbnRRdWV1ZSA6IHB1YmxpYyBDQmFzZSwgcHVibGljIE1FdmVudFF1ZXVlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIENFdmVudFF1ZXVlKiBOZXdMKCk7CisgICAgICAgIH5DRXZlbnRRdWV1ZSgpOworICAgIHB1YmxpYzoKKyAgICAgICAgVEludCBBcHBlbmQoY29uc3QgVFdzRXZlbnQmIGFFdmVudCk7CisgICAgICAgCWNvbnN0IFRXc0V2ZW50JiBTaGlmdCgpOworICAgICAgIAl2b2lkIExvY2soKTsKKyAgICAgICAJdm9pZCBVbmxvY2soKTsKKyAgICAgICAgVEJvb2wgSGFzRGF0YSgpOworICAgIHByaXZhdGU6CisgICAgICAgIFRWZWN0b3I8VFdzRXZlbnQsIDY0PiBpVmVjdG9yOworICAgICAgICBSQ3JpdGljYWxTZWN0aW9uIGlDUzsKKyAgICB9OworICAgIAorIENFdmVudFF1ZXVlKiBDRXZlbnRRdWV1ZTo6TmV3TCgpCisgICAgeworICAgIENFdmVudFF1ZXVlKiBxID0gbmV3IChFTGVhdmUpIENFdmVudFF1ZXVlKCk7CisgICAgQ2xlYW51cFN0YWNrOjpQdXNoTChxKTsKKyAgICBVc2VyOjpMZWF2ZUlmRXJyb3IocS0+aUNTLkNyZWF0ZUxvY2FsKCkpOworICAgIENsZWFudXBTdGFjazo6UG9wKCk7CisgICAgcmV0dXJuIHE7CisgICAgfQorICAgIAorQ0V2ZW50UXVldWU6On5DRXZlbnRRdWV1ZSgpCisgICAgeworICAgIGlDUy5DbG9zZSgpOworICAgIH0KKyAgICAKK1RJbnQgQ0V2ZW50UXVldWU6OkFwcGVuZChjb25zdCBUV3NFdmVudCYgYUV2ZW50KQorICAgIHsKKyAgICBpQ1MuV2FpdCgpOworICAgCWNvbnN0IFRJbnQgZXJyID0gaVZlY3Rvci5BcHBlbmQoYUV2ZW50KTsKKyAgICBpQ1MuU2lnbmFsKCk7CisgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgCisgICAgCitUQm9vbCBDRXZlbnRRdWV1ZTo6SGFzRGF0YSgpCisgICAgeworICAgIHJldHVybiBpVmVjdG9yLlNpemUoKSA+IDA7CisgICAgfQorCisKK3ZvaWQgQ0V2ZW50UXVldWU6OkxvY2soKQorCXsKKyAgICBpQ1MuV2FpdCgpOworCX0KKwkKK3ZvaWQgQ0V2ZW50UXVldWU6OlVubG9jaygpCisJeworCWlDUy5TaWduYWwoKTsKKwl9CisKK2NvbnN0IFRXc0V2ZW50JiBDRXZlbnRRdWV1ZTo6U2hpZnQoKQorICAgIHsKKyAgICBjb25zdCBUV3NFdmVudCYgZXZlbnQgPSAgaVZlY3Rvci5TaGlmdCgpOworICAgIHJldHVybiBldmVudDsKKyAgICB9CisKKworVFNkbENsZWFudXBJdGVtOjpUU2RsQ2xlYW51cEl0ZW0oVFNkbENsZWFudXBPcGVyYXRpb24gYU9wZXJhdGlvbiwgVEFueSogYUl0ZW0pIDoKK2lPcGVyYXRpb24oYU9wZXJhdGlvbiksIGlJdGVtKGFJdGVtKSwgaVRocmVhZChSVGhyZWFkKCkuSWQoKSkKKyAgICB7CisgICAgfQorCitjbGFzcyBDRWlrb25FbnY7CitjbGFzcyBDU2RsQXBwU2VydjsKKworICAgIAorTk9OU0hBUkFCTEVfQ0xBU1MoRXBvY1NkbEVudkRhdGEpCisgICAgeworICAgIHB1YmxpYzoKKyAgICB2b2lkIEZyZWUoKTsKKyAgICBDRXZlbnRRdWV1ZSogICAgICAgICAgICBpRXZlbnRRdWV1ZTsKKyAgICBUTWFpbkZ1bmMJCQkJaU1haW47CisgICAgVEludCAgICAgICAgICAgIAkJaUVwb2NFbnZGbGFnczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpQXJnYzsKKyAgICBjaGFyKiogICAgICAgICAgICAgICAgICBpQXJndjsKKyAgICBDRHNhKiAgICAgICAgICAgICAgICAgICBpRHNhOworICAgIENTZGxBcHBTZXJ2KiAgICAgICAgICAgIGlBcHBTcnY7CisgICAgVFRocmVhZElkICAgICAgICAgICAgICAgaUlkOworICAgIENBcnJheUZpeDxUU2RsQ2xlYW51cEl0ZW0+KiBpQ2xlYW51cEl0ZW1zOyAKKyAgICBDRWlrQXBwVWkqCQkJCWlBcHBVaTsKKyAgICBDU0RMKgkJCQkJaVNkbDsKKyAgICB9OworICAKKyAgIAorRXBvY1NkbEVudkRhdGEqIGdFcG9jRW52OworCisjZGVmaW5lIE1BSU5GVU5DKHgpIEVYUE9SVF9DIFRNYWluRnVuYzo6VE1haW5GdW5jKG1haW5mdW5jIyN4IGFGdW5jKXtNZW06OkZpbGxaKGlNYWluRnVuYywgc2l6ZW9mKGlNYWluRnVuYykpOyBpTWFpbkZ1bmNbeCAtIDFdID0gKHZvaWQqKSBhRnVuYzt9CisgICAgCitNQUlORlVOQygxKQorTUFJTkZVTkMoMikKK01BSU5GVU5DKDMpCitNQUlORlVOQyg0KQorTUFJTkZVTkMoNSkKK01BSU5GVU5DKDYpCisKK0VYUE9SVF9DIFRNYWluRnVuYzo6VE1haW5GdW5jKCkgCisJeworCU1lbTo6RmlsbFooaU1haW5GdW5jLCBzaXplb2YoaU1haW5GdW5jKSk7CisJfQorCQorCitjb25zdCB2b2lkKiBUTWFpbkZ1bmM6Om9wZXJhdG9yW10oVEludCBhSW5kZXgpIGNvbnN0CisJeworCXJldHVybiBpTWFpbkZ1bmNbYUluZGV4XTsKKwl9CisKKworTk9OU0hBUkFCTEVfQ0xBU1MoQ1NkbEFwcFNlcnYpIDogcHVibGljIENBY3RpdmUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBFQXBwU3J2Tm9vcCA9IENEc2E6OkVMYXN0RHNhUmVxdWVzdCwKKyAgICAgICAgICAgIEVBcHBTcnZXaW5kb3dXaWR0aCwKKyAgICAgICAgICAgIEVBcHBTcnZXaW5kb3dIZWlnaHQsCisgICAgICAgICAgICBFQXBwU3J2V2luZG93RGlzcGxheU1vZGUsCisgICAgICAgICAgICBFQXBwU3J2V2luZG93UG9pbnRlckN1cnNvck1vZGUsCisgICAgICAgICAgICBFQXBwU3J2RHNhU3RhdHVzLAorICAgICAgICAgICAgRUFwcFNydlN0b3BUaHJlYWQsCisgICAgICAgICAgICBFQXBwU3J2V2FpdERzYQorICAgICAgICAgICAgfTsKKyAgICAgICAgQ1NkbEFwcFNlcnYoKTsKKyAgICAgICAgdm9pZCBDb25zdHJ1Y3RMKCk7CisgICAgICAgIH5DU2RsQXBwU2VydigpOworICAgICAgICBUSW50IFJlcXVlc3QoVEludCBhU2VydmljZSk7CisgICAgICAgIFRJbnQgUmVxdWVzdFZhbHVlKFRJbnQgYVNlcnZpY2UpOworICAgICAgICB2b2lkIEluaXQoKTsgCisgICAgICAgIHZvaWQgUGFuaWNNYWluKFRJbnQgYVJlYXNvbik7CisgICAgICAgIHZvaWQgUGFuaWNNYWluKGNvbnN0IFREZXNDJiBhSW5mbywgVEludCBhUmVhc29uKTsKKyAgICAgICAgdm9pZCBTZXRPYnNlcnZlcihNU0RMT2JzZXJ2ZXIqIGFPYnNlcnZlcik7CisgICAgICAgIFRJbnQgT2JzZXJ2ZXJFdmVudChUSW50IGFFdmVudCwgVEludCBhUGFyYW0pOworICAgICAgICB2b2lkIFNldFBhcmFtKFRJbnQgYVBhcmFtKTsKKyAgICAgICAgdm9pZCBIYW5kbGVPYnNlcnZlclZhbHVlKFRJbnQgYVNlcnZpY2UsIFRJbnQgYVJldHVyblZhbHVlLCBUQm9vbCBhTWFpblRocmVhZCk7CisgICAgICAgIE1TRExPYnNlcnZlciogT2JzZXJ2ZXIoKTsKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIFJ1bkwoKTsKKyAgICAgICAgdm9pZCBEb0NhbmNlbCgpOworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IFRUaHJlYWRJZCBpTWFpbklkOworICAgICAgICBSVGhyZWFkIGlBcHBUaHJlYWQ7CisgICAgICAgIFRJbnQgaVNlcnZpY2U7CisgICAgICAgIFRJbnQgaVJldHVyblZhbHVlOworICAgICAgICBSU2VtYXBob3JlIGlTZW1hOworICAgICAgICBNU0RMT2JzZXJ2ZXIqIGlPYnNlcnZlcjsKKyAgICAgICAgVFJlcXVlc3RTdGF0dXMqIGlTdGF0dXNQdHI7CisgICAgfTsKKyAgICAKK0NTZGxBcHBTZXJ2OjpDU2RsQXBwU2VydigpIDogQ0FjdGl2ZShDQWN0aXZlOjpFUHJpb3JpdHlIaWdoKSwgaU1haW5JZChSVGhyZWFkKCkuSWQoKSkKKyAgICB7CisgICAgfQorICAgIAorICAgIAorICAgIAorTVNETE9ic2VydmVyKiBDU2RsQXBwU2Vydjo6T2JzZXJ2ZXIoKQorCXsKKwlyZXR1cm4gaU9ic2VydmVyOworCX0KKwkKKwkKK3ZvaWQgQ1NkbEFwcFNlcnY6OlNldE9ic2VydmVyKE1TRExPYnNlcnZlciogYU9ic2VydmVyKQorCXsKKwlpT2JzZXJ2ZXIgPSBhT2JzZXJ2ZXI7CisJfQkKKwkKK1RJbnQgQ1NkbEFwcFNlcnY6Ok9ic2VydmVyRXZlbnQoVEludCBhRXZlbnQsIFRJbnQgYVBhcmFtKQorCXsKKwlpZihpT2JzZXJ2ZXIgIT0gTlVMTCkKKwkJeworCQlpZihSVGhyZWFkKCkuSWQoKSA9PSBnRXBvY0Vudi0+aUlkKQorCQkJeworCQkJcmV0dXJuIGlPYnNlcnZlci0+U2RsVGhyZWFkRXZlbnQoYUV2ZW50LCBhUGFyYW0pOworCQkJfQorCQllbHNlIGlmKFJUaHJlYWQoKS5JZCgpID09IGlNYWluSWQpCisJCQl7CisJCQlyZXR1cm4gaU9ic2VydmVyLT5TZGxFdmVudChhRXZlbnQsIGFQYXJhbSk7CisJCQl9CisJCVBBTklDKEtFcnJOb3RTdXBwb3J0ZWQpOworCQl9CisJcmV0dXJuIDA7CisJfQorCQordm9pZCBDU2RsQXBwU2Vydjo6UGFuaWNNYWluKFRJbnQgYVJlYXNvbikgICAgCisgICAgeworICAgIGlBcHBUaHJlYWQuUGFuaWMoUlRocmVhZCgpLk5hbWUoKSwgYVJlYXNvbik7CisgICAgfQorICAgIAordm9pZCBDU2RsQXBwU2Vydjo6UGFuaWNNYWluKGNvbnN0IFREZXNDJiBhSW5mbywgVEludCBhUmVhc29uKSAgICAKKyAgICB7CisgICAgaUFwcFRocmVhZC5QYW5pYyhhSW5mbywgYVJlYXNvbik7CisgICAgfSAgICAKKyAgICAKK3ZvaWQgQ1NkbEFwcFNlcnY6OkNvbnN0cnVjdEwoKQorICAgIHsKKyAgICBDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisgICAgVXNlcjo6TGVhdmVJZkVycm9yKGlTZW1hLkNyZWF0ZUxvY2FsKDEpKTsKKyAgICBpU3RhdHVzID0gS1JlcXVlc3RQZW5kaW5nOworICAgIGlTdGF0dXNQdHIgPSAmaVN0YXR1czsKKyAgICBTZXRBY3RpdmUoKTsKKyAgICB9CisgICAgICAgIAorIENTZGxBcHBTZXJ2Ojp+Q1NkbEFwcFNlcnYoKQorICAgIHsKKyAgICBDYW5jZWwoKTsKKyAgICBpZihpU2VtYS5IYW5kbGUoKSAhPSBOVUxMKQorICAgICAgICBpU2VtYS5TaWduYWwoKTsKKyAgICBpU2VtYS5DbG9zZSgpOworICAgIGlBcHBUaHJlYWQuQ2xvc2UoKTsKKyAgICB9CisgICAgCitUSW50IENTZGxBcHBTZXJ2OjpSZXF1ZXN0KFRJbnQgYVNlcnZpY2UpCisgICAgeworICAgIGlmKFJUaHJlYWQoKS5JZCgpICE9IGlBcHBUaHJlYWQuSWQoKSkKKyAgICAJeworICAgIAlpU2VtYS5XYWl0KCk7CisgICAgCWlTZXJ2aWNlID0gYVNlcnZpY2U7CisgICAgCWlBcHBUaHJlYWQuUmVxdWVzdENvbXBsZXRlKGlTdGF0dXNQdHIsIEtFcnJOb25lKTsgCisgICAgCXJldHVybiBLRXJyTm9uZTsKKyAgICAJfQorICAgIHJldHVybiBLRXJyQmFkSGFuZGxlOworICAgIH0KKyAgICAKK1RJbnQgQ1NkbEFwcFNlcnY6OlJlcXVlc3RWYWx1ZShUSW50IGFTZXJ2aWNlKQorICAgIHsKKyAgICBSZXF1ZXN0KGFTZXJ2aWNlKTsKKyAgICBSZXF1ZXN0KEVBcHBTcnZOb29wKTsKKyAgICByZXR1cm4gaVJldHVyblZhbHVlOworICAgIH0KKyAgIAordm9pZCBDU2RsQXBwU2Vydjo6SW5pdCgpCisgICAgeworICAgIFBBTklDX0lGX0VSUk9SKGlBcHBUaHJlYWQuT3BlbihpTWFpbklkKSk7CisgICAgfQorCit2b2lkIENTZGxBcHBTZXJ2OjpTZXRQYXJhbShUSW50IGFQYXJhbSkKKwl7CisJaVJldHVyblZhbHVlID0gYVBhcmFtOworCX0KKwkKK3ZvaWQgQ1NkbEFwcFNlcnY6OkhhbmRsZU9ic2VydmVyVmFsdWUoVEludCBhU2VydmljZSwgVEludCBhUmV0dXJuVmFsdWUsIFRCb29sIGFNYWluVGhyZWFkKQorCXsKKwlpZihpT2JzZXJ2ZXIgIT0gTlVMTCAmJiBhTWFpblRocmVhZCkKKwkJeworCQlzd2l0Y2goYVNlcnZpY2UpCisJCQl7CisJCQljYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50U2NyZWVuU2l6ZUNoYW5nZWQ6CisJCQlpZihhUmV0dXJuVmFsdWUgPT0gTVNETE9ic2VydmVyOjpFU2NyZWVuU2l6ZUNoYW5nZWREZWZhdWx0UGFsZXR0ZSkKKwkJCQlFcG9jU2RsRW52OjpMb2NrUGFsZXR0ZShFRmFsc2UpOworCQkJYnJlYWs7CisJCQl9CisJCX0KKwlpZighYU1haW5UaHJlYWQgJiYgYVNlcnZpY2UgPT0gTVNETE9ic2VydmVyOjpFRXZlbnRTdXNwZW5kKQorCQl7CisJCWlmKGlPYnNlcnZlciA9PSBOVUxMIHx8IAorCQkoZ0Vwb2NFbnYtPmlEc2EtPlN0b3BwZWQoKSAmJiBhUmV0dXJuVmFsdWUgIT0gTVNETE9ic2VydmVyOjpFU3VzcGVuZE5vU3VzcGVuZCkpCisJCQl7CisJCQlFcG9jU2RsRW52OjpTdXNwZW5kKCk7CisJCQl9CisJCX0KKwl9CisKK3ZvaWQgQ1NkbEFwcFNlcnY6OlJ1bkwoKQorICAgIHsKKyAgICBpZihpU3RhdHVzID09IEtFcnJOb25lKQorICAgICAgICB7CisgICAgICAgIHN3aXRjaChpU2VydmljZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ1NkbEFwcFNlcnY6OkVBcHBTcnZXYWl0RHNhOgorICAgICAgICAgICAgCUVwb2NTZGxFbnY6OlNldFdhaXREc2EoKTsKKyAgICAgICAgICAgIAlpUmV0dXJuVmFsdWUgPSBFcG9jU2RsRW52OjpJc0RzYUF2YWlsYWJsZSgpOworICAgICAgICAgICAgLy8JCX0KKyAgICAgICAgICAgIC8vCWdFcG9jRW52LT5pRHNhLT5TdG9wKCk7CisgICAgICAgICAgICAvLwlnRXBvY0Vudi0+aURzYS0+UmVzdGFydEwoKTsKKyAgICAgICAgICAgIAlicmVhazsKKyAgICAgICAgICAgCSBjYXNlIENTZGxBcHBTZXJ2OjpFQXBwU3J2U3RvcFRocmVhZDoKKyAgICAgICAgICAgIAlnRXBvY0Vudi0+aURzYS0+U2V0U3VzcGVuZCgpOworICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgY2FzZSBFcG9jU2RsRW52OjpFRGlzYWJsZUtleUJsb2NraW5nOgorICAgICAgICAgICAgICAgIEVudlV0aWxzOjpEaXNhYmxlS2V5QmxvY2tpbmcoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgRUFwcFNydldpbmRvd1BvaW50ZXJDdXJzb3JNb2RlOgorICAgICAgICAgICAgICAgIGlSZXR1cm5WYWx1ZSA9IGdFcG9jRW52LT5pRHNhICE9IE5VTEwgPworICAgICAgICAgICAgICAgICBnRXBvY0Vudi0+aURzYS0+U2Vzc2lvbigpLlBvaW50ZXJDdXJzb3JNb2RlKCkgOiBLRXJyTm90UmVhZHk7IAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFQXBwU3J2RHNhU3RhdHVzOgorICAgICAgICAgICAgCWdFcG9jRW52LT5pRHNhLT5TdG9wKCk7CisgICAgICAgICAgICAgICAgaVJldHVyblZhbHVlID0gS0Vyck5vbmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENEc2E6OkVSZXF1ZXN0VXBkYXRlOgorICAgICAgICAgICAgCWdFcG9jRW52LT5pRHNhLT5VbmxvY2tIV1N1cmZhY2VSZXF1ZXN0Q29tcGxldGUoKTsKKyAgICAgICAgICAgIAlicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUFwcFNydk5vb3A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50UmVzdW1lOgorICAgICAgICAgICAgY2FzZSBNU0RMT2JzZXJ2ZXI6OkVFdmVudFN1c3BlbmQ6CisgICAgICAgICAgICBjYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50U2NyZWVuU2l6ZUNoYW5nZWQ6CisgICAgICAgICAgICBjYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50V2luZG93UmVzZXJ2ZWQ6CisgICAgICAgICAgICBjYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50S2V5TWFwSW5pdDoKKyAgICAgICAgICAgIGNhc2UgTVNETE9ic2VydmVyOjpFRXZlbnRXaW5kb3dOb3RBdmFpbGFibGU6CisgICAgICAgICAgICBjYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50TWFpbkV4aXQ6CisgICAgICAgICAgICAJaVJldHVyblZhbHVlID0gT2JzZXJ2ZXJFdmVudChpU2VydmljZSwgaVJldHVyblZhbHVlKTsKKyAgICAgICAgICAgIAlIYW5kbGVPYnNlcnZlclZhbHVlKGlTZXJ2aWNlLCBpUmV0dXJuVmFsdWUsIEVUcnVlKTsKKyAgICAgICAgICAgIAlicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUEFOSUMoS0Vyck5vdFN1cHBvcnRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIGlTdGF0dXMgPSBLUmVxdWVzdFBlbmRpbmc7CisgICAgICAgIGlTdGF0dXNQdHIgPSAmaVN0YXR1czsKKyAgICAgICAgU2V0QWN0aXZlKCk7CisgICAgICAgIH0KKyAgICBpU2VtYS5TaWduYWwoKTsKKyAgICB9CisgICAgCit2b2lkIENTZGxBcHBTZXJ2OjpEb0NhbmNlbCgpCisgICAgeworICAgIGlTZW1hLldhaXQoKTsKKyAgICBUUmVxdWVzdFN0YXR1cyogcyA9ICZpU3RhdHVzOworICAgIGlBcHBUaHJlYWQuUmVxdWVzdENvbXBsZXRlKHMsIEtFcnJDYW5jZWwpOyAKKyAgICB9CisgCisKKworTUV2ZW50UXVldWUmIEVwb2NTZGxFbnY6OkV2ZW50UXVldWUoKQorICAgIHsKKyAgICBfX0FTU0VSVF9ERUJVRyhnRXBvY0VudiAhPSBOVUxMLCBQQU5JQyhLRXJyTm90UmVhZHkpKTsKKyAgICByZXR1cm4gKmdFcG9jRW52LT5pRXZlbnRRdWV1ZTsKKyAgICB9CisKKworVEJvb2wgRXBvY1NkbEVudjo6RmxhZ3MoVEludCBhRmxhZykKKyAgICB7CisJY29uc3QgVEludCBmbGFnID0gZ0Vwb2NFbnYtPmlFcG9jRW52RmxhZ3MgJiBhRmxhZzsKKwlyZXR1cm4gZmxhZyA9PSBhRmxhZzsKKyAgICB9CisKK1RJbnQgRXBvY1NkbEVudjo6QXJnYygpCisgICAgeworICAgIF9fQVNTRVJUX0RFQlVHKGdFcG9jRW52ICE9IE5VTEwsIFBBTklDKEtFcnJOb3RSZWFkeSkpOworICAgIHJldHVybiBnRXBvY0Vudi0+aUFyZ2M7CisgICAgfQorICAgIAorICAgIAorY2hhcioqIEVwb2NTZGxFbnY6OkFyZ3YoKQorICAgIHsKKyAgICBfX0FTU0VSVF9ERUJVRyhnRXBvY0VudiAhPSBOVUxMLCBQQU5JQyhLRXJyTm90UmVhZHkpKTsKKyAgICByZXR1cm4gZ0Vwb2NFbnYtPmlBcmd2OworICAgIH0KKyAgICAKKyAgICAKK1RCb29sIEVwb2NTZGxFbnY6OklzRHNhQXZhaWxhYmxlKCkKKyAgICB7CisgICAgX19BU1NFUlRfREVCVUcoZ0Vwb2NFbnYgIT0gTlVMTCwgUEFOSUMoS0Vyck5vdFJlYWR5KSk7CisgICAgcmV0dXJuIGdFcG9jRW52LT5pRHNhICE9IE5VTEwgJiYgZ0Vwb2NFbnYtPmlEc2EtPklzRHNhQXZhaWxhYmxlKCk7CisgICAgfQorCisgIAordm9pZCBFcG9jU2RsRW52OjpXYWl0RHNhQXZhaWxhYmxlKCkKKwl7CisJRXBvY1NkbEVudjo6T2JzZXJ2ZXJFdmVudChNU0RMT2JzZXJ2ZXI6OkVFdmVudFdpbmRvd05vdEF2YWlsYWJsZSwgMCk7CisJZ0Vwb2NFbnYtPmlBcHBTcnYtPlJlcXVlc3QoQ1NkbEFwcFNlcnY6OkVBcHBTcnZTdG9wVGhyZWFkKTsKKwlpZihFcG9jU2RsRW52OjpGbGFncyhDU0RMOjpFRW5hYmxlRm9jdXNTdG9wKSkKKwkJeworCQlFcG9jU2RsRW52OjpPYnNlcnZlckV2ZW50KE1TRExPYnNlcnZlcjo6RUV2ZW50U3VzcGVuZCwgMCk7CisJCX0KKwl9CisJCit2b2lkIEVwb2NTZGxFbnY6OlN1c3BlbmQoKQorCXsKKwlpZihnRXBvY0Vudi0+aURzYS0+U3RvcHBlZCgpIHx8IEVwb2NTZGxFbnY6OkZsYWdzKENTREw6OkVFbmFibGVGb2N1c1N0b3ApKQorCQl7CisJLy8JZ0Vwb2NFbnYtPmlEc2EtPlJlbGVhc2VTdG9wKCk7IAorCQlnRXBvY0Vudi0+aURzYS0+U2V0U3VzcGVuZCgpOyAKKwkJUlRocmVhZCgpLlN1c3BlbmQoKTsKKwkJRXBvY1NkbEVudjo6T2JzZXJ2ZXJFdmVudChNU0RMT2JzZXJ2ZXI6OkVFdmVudFJlc3VtZSwgMCk7CisJCX0KKwl9CisJCit2b2lkIEVwb2NTZGxFbnY6OlNldFdhaXREc2EoKQorCXsKKwlpZighSXNEc2FBdmFpbGFibGUoKSkKKwkJeworCQlSVGhyZWFkIHRoOworCQl0aC5PcGVuKGdFcG9jRW52LT5pSWQpOworCQl0aC5TdXNwZW5kKCk7CisJCXRoLkNsb3NlKCk7CisJCWdFcG9jRW52LT5pRHNhLT5TZXRTdXNwZW5kKCk7IAorCQl9CisJfQorCQordm9pZCBFcG9jU2RsRW52OjpSZXN1bWUoKQorCXsKKwlnRXBvY0Vudi0+aURzYS0+UmVzdW1lKCk7CisJUlRocmVhZCB0aDsKKwl0aC5PcGVuKGdFcG9jRW52LT5pSWQpOworCXRoLlJlc3VtZSgpOworCXRoLkNsb3NlKCk7CisJCisJY29uc3QgVEludCB2YWx1ZSA9IGdFcG9jRW52LT5pQXBwU3J2LT5PYnNlcnZlckV2ZW50KE1TRExPYnNlcnZlcjo6RUV2ZW50UmVzdW1lLCAwKTsKKwlnRXBvY0Vudi0+aUFwcFNydi0+SGFuZGxlT2JzZXJ2ZXJWYWx1ZShNU0RMT2JzZXJ2ZXI6OkVFdmVudFJlc3VtZSwgdmFsdWUsIEVUcnVlKTsKKwl9CisgICAgCisKK1RJbnQgRXBvY1NkbEVudjo6QWxsb2NTd1N1cmZhY2UoY29uc3QgVFNpemUmIGFTaXplLCBURGlzcGxheU1vZGUgYU1vZGUpCisJeworCXJldHVybiBnRXBvY0Vudi0+aURzYS0+QWxsb2NTdXJmYWNlKEVGYWxzZSwgYVNpemUsIGFNb2RlKTsKKwl9CisJCitUSW50IEVwb2NTZGxFbnY6OkFsbG9jSHdTdXJmYWNlKGNvbnN0IFRTaXplJiBhU2l6ZSwgVERpc3BsYXlNb2RlIGFNb2RlKQorCXsKKwlyZXR1cm4gZ0Vwb2NFbnYtPmlEc2EtPkFsbG9jU3VyZmFjZShFVHJ1ZSwgYVNpemUsIGFNb2RlKTsKKwl9CisJCQorCQordm9pZCBFcG9jU2RsRW52OjpVbmxvY2tId1N1cmZhY2UoKQorCXsKKwlnRXBvY0Vudi0+aURzYS0+VW5sb2NrSHdTdXJmYWNlKCk7CisJfQorCQorVFVpbnQ4KiBFcG9jU2RsRW52OjpMb2NrSHdTdXJmYWNlKCkKKwl7CisJcmV0dXJuIGdFcG9jRW52LT5pRHNhLT5Mb2NrSHdTdXJmYWNlKCk7CisJfQorCisKK3ZvaWQgRXBvY1NkbEVudjo6VXBkYXRlU3dTdXJmYWNlKCkKKwl7CisJZ0Vwb2NFbnYtPmlEc2EtPlVwZGF0ZVN3U3VyZmFjZSgpOworCX0KKwkKK1RCb29sIEVwb2NTZGxFbnY6OkFkZFVwZGF0ZVJlY3QoVFVpbnQ4KiBhQWRkcmVzcywgY29uc3QgVFJlY3QmIGFVcGRhdGVSZWN0LCBjb25zdCBUUmVjdCYgYVJlY3QpCisJeworCXJldHVybiBnRXBvY0Vudi0+aURzYS0+QWRkVXBkYXRlUmVjdChhQWRkcmVzcywgYVVwZGF0ZVJlY3QsIGFSZWN0KTsKKwl9CisJCit2b2lkIEVwb2NTZGxFbnY6OlJlcXVlc3QoVEludCBhU2VydmljZSkKKyAgICB7CisgICAgX19BU1NFUlRfREVCVUcoZ0Vwb2NFbnYgIT0gTlVMTCwgUEFOSUMoS0Vyck5vdFJlYWR5KSk7CisgICAgZ0Vwb2NFbnYtPmlBcHBTcnYtPlJlcXVlc3QoYVNlcnZpY2UpOworICAgIH0KKyAgICAKKyAgICAKK1RTaXplIEVwb2NTZGxFbnY6OldpbmRvd1NpemUoY29uc3QgVFNpemUmIGFSZXF1ZXN0ZWRTaXplKQorICAgIHsgCisgICAgX19BU1NFUlRfREVCVUcoZ0Vwb2NFbnYgIT0gTlVMTCwgUEFOSUMoS0Vyck5vdFJlYWR5KSk7CisgICAgaWYoRXBvY1NkbEVudjo6RmxhZ3MoQ1NETDo6RUFsbG93SW1hZ2VSZXNpemUpICYmIGdFcG9jRW52LT5pRHNhLT5XaW5kb3dTaXplKCkgIT0gYVJlcXVlc3RlZFNpemUpCisgICAgCXsKKyAgICAJVFJBUF9JR05PUkUoZ0Vwb2NFbnYtPmlEc2EtPkNyZWF0ZVpvb21lckwoYVJlcXVlc3RlZFNpemUpKTsKKyAgICAJfQorICAgIHJldHVybiBnRXBvY0Vudi0+aURzYS0+V2luZG93U2l6ZSgpOworICAgIH0KKyAgICAKKyBUU2l6ZSBFcG9jU2RsRW52OjpXaW5kb3dTaXplKCkKKyAgICB7IAorICAgIF9fQVNTRVJUX0RFQlVHKGdFcG9jRW52ICE9IE5VTEwsIFBBTklDKEtFcnJOb3RSZWFkeSkpOworICAgIHJldHVybiBnRXBvY0Vudi0+aURzYS0+V2luZG93U2l6ZSgpOworICAgIH0gICAKKyAgICAKK1REaXNwbGF5TW9kZSBFcG9jU2RsRW52OjpEaXNwbGF5TW9kZSgpCisgICAgeworICAgIHJldHVybiBnRXBvY0Vudi0+aURzYS0+RGlzcGxheU1vZGUoKTsKKyAgICB9CisgICAgCitUUG9pbnRlckN1cnNvck1vZGUgRXBvY1NkbEVudjo6UG9pbnRlck1vZGUoKQorICAgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VFBvaW50ZXJDdXJzb3JNb2RlPgorICAgIChnRXBvY0Vudi0+aUFwcFNydi0+UmVxdWVzdFZhbHVlKENTZGxBcHBTZXJ2OjpFQXBwU3J2V2luZG93UG9pbnRlckN1cnNvck1vZGUpKTsKKyAgICB9CisgICAgCitUSW50IEVwb2NTZGxFbnY6OlNldFBhbGV0dGUoVEludCBhRmlyc3Rjb2xvciwgVEludCBhQ29sb3JDb3VudCwgVFVpbnQzMiogYVBhbGV0dGUpICAKKwl7CisJcmV0dXJuIAlnRXBvY0Vudi0+aURzYS0+U2V0UGFsZXR0ZShhRmlyc3Rjb2xvciwgYUNvbG9yQ291bnQsIGFQYWxldHRlKTsKKwl9CisKK3ZvaWQgRXBvY1NkbEVudjo6UGFuaWNNYWluKFRJbnQgYUVycikKKyAgICB7CisgICAgZ0Vwb2NFbnYtPmlBcHBTcnYtPlBhbmljTWFpbihhRXJyKTsKKyAgICB9CisgICAgCisgICAgCitUSW50IEVwb2NTZGxFbnY6OkFwcGVuZENsZWFudXBJdGVtKGNvbnN0IFRTZGxDbGVhbnVwSXRlbSYgYUl0ZW0pCisgICAgeworICAgIFRSQVBEKGVyciwgZ0Vwb2NFbnYtPmlDbGVhbnVwSXRlbXMtPkFwcGVuZEwoYUl0ZW0pKTsKKyAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAKK3ZvaWQgRXBvY1NkbEVudjo6UmVtb3ZlQ2xlYW51cEl0ZW0oVEFueSogYUl0ZW0pCisgICAgeworICAgIGZvcihUSW50IGkgPSAwOyBpIDwgZ0Vwb2NFbnYtPmlDbGVhbnVwSXRlbXMtPkNvdW50KCk7IGkrKykKKyAgICAgICAgeworICAgICAgICBpZihnRXBvY0Vudi0+aUNsZWFudXBJdGVtcy0+QXQoaSkuaUl0ZW0gPT0gYUl0ZW0pCisgICAgICAgICAgICBnRXBvY0Vudi0+aUNsZWFudXBJdGVtcy0+RGVsZXRlKGkpOworICAgICAgICB9CisgICAgfQorICAgIAordm9pZCBFcG9jU2RsRW52OjpDbGVhbnVwSXRlbXMoKSAgICAgCisJeworCWNvbnN0IFRUaHJlYWRJZCBpZCA9IFJUaHJlYWQoKS5JZCgpOworCVRJbnQgbGFzdCA9IGdFcG9jRW52LT5pQ2xlYW51cEl0ZW1zLT5Db3VudCgpIC0gMTsKKwlUSW50IGk7CisJZm9yKGkgPSBsYXN0OyBpID49IDAgOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgVFNkbENsZWFudXBJdGVtJiBpdGVtID0gZ0Vwb2NFbnYtPmlDbGVhbnVwSXRlbXMtPkF0KGkpOworICAgICAgICBpZihpdGVtLmlUaHJlYWQgPT0gaWQpCisgICAgICAgIAl7CisgICAgICAgIAlpdGVtLmlUaHJlYWQgPSBUVGhyZWFkSWQoMCk7IAorICAgICAgICAJaXRlbS5pT3BlcmF0aW9uKGl0ZW0uaUl0ZW0pOworICAgICAgICAJfQorICAgICAgICB9CisgICAgbGFzdCA9IGdFcG9jRW52LT5pQ2xlYW51cEl0ZW1zLT5Db3VudCgpIC0gMTsKKwlmb3IoaSA9IGxhc3Q7IGkgPj0gMCA7IGktLSkKKyAgICAgICAgeworICAgICAgICBUU2RsQ2xlYW51cEl0ZW0mIGl0ZW0gPSBnRXBvY0Vudi0+aUNsZWFudXBJdGVtcy0+QXQoaSk7CisgICAgICAgIGlmKGl0ZW0uaVRocmVhZCA9PSBUVGhyZWFkSWQoMCkpCisgICAgICAgIAl7CisgICAgICAgIAlnRXBvY0Vudi0+aUNsZWFudXBJdGVtcy0+RGVsZXRlKGkpOworICAgICAgICAJfQorICAgICAgICB9CisJfQorCQordm9pZCBFcG9jU2RsRW52OjpGcmVlU3VyZmFjZSgpCisJeworCVJlcXVlc3QoQ1NkbEFwcFNlcnY6OkVBcHBTcnZEc2FTdGF0dXMpOworCWdFcG9jRW52LT5pRHNhLT5GcmVlKCk7CisJfQorICAKK3ZvaWQgRXBvY1NkbEVudjo6TG9ja1BhbGV0dGUoVEJvb2wgYUxvY2spCisJeworCWdFcG9jRW52LT5pRHNhLT5Mb2NrUGFsZXR0ZShhTG9jayk7CisJfQorICAgIAordm9pZCBFcG9jU2RsRW52OjpPYnNlcnZlckV2ZW50KFRJbnQgYVNlcnZpY2UsIFRJbnQgYVBhcmFtKQorCXsKKwljb25zdCBUQm9vbCBzZGxUaHJlYWQgPSBSVGhyZWFkKCkuSWQoKSA9PSBnRXBvY0Vudi0+aUlkOworCWNvbnN0IFRJbnQgdmFsdWVhID0gZ0Vwb2NFbnYtPmlBcHBTcnYtPk9ic2VydmVyRXZlbnQoYVNlcnZpY2UsIGFQYXJhbSk7CisJZ0Vwb2NFbnYtPmlBcHBTcnYtPkhhbmRsZU9ic2VydmVyVmFsdWUoYVNlcnZpY2UsIHZhbHVlYSwgIXNkbFRocmVhZCk7CisJaWYoc2RsVGhyZWFkKQorCQl7CisJCWdFcG9jRW52LT5pQXBwU3J2LT5TZXRQYXJhbShhUGFyYW0pOworCQljb25zdCBUSW50IHZhbHVldCA9IGdFcG9jRW52LT5pQXBwU3J2LT5SZXF1ZXN0VmFsdWUoYVNlcnZpY2UpOworCQlnRXBvY0Vudi0+aUFwcFNydi0+SGFuZGxlT2JzZXJ2ZXJWYWx1ZShhU2VydmljZSwgdmFsdWV0LCBFRmFsc2UpOwkKKwkJfQorCX0KKwkJCQorICAgIAorVFBvaW50IEVwb2NTZGxFbnY6OldpbmRvd0Nvb3JkaW5hdGVzKGNvbnN0IFRQb2ludCYgYVBvaW50KSAgICAKKyAgICB7CisgICAgcmV0dXJuIGdFcG9jRW52LT5pRHNhLT5XaW5kb3dDb29yZGluYXRlcyhhUG9pbnQpOwkKKyAgICB9CisgICAgCit2b2lkIEVwb2NTZGxFbnY6OlBhbmljTWFpbihjb25zdCBURGVzQyYgYUluZm8sIFRJbnQgYUVycikKKyAgICB7CisgICAgZ0Vwb2NFbnYtPmlBcHBTcnYtPlBhbmljTWFpbihhSW5mbywgYUVycik7CisgICAgfQorLy9Ec2EgaXMgYSBsb3cgcHJpb3JpdHkgYW8sIGl0IGhhcyB0byB3YWl0IGlmIGl0cyBwZW5kaW5nIGV2ZW50LCBidXQgd3MKKy8vZXZlbnQgaGFzIGJlZW4gcHJpb3JpdGl6ZWQgYmVmb3JlIGl0CisvL3RoaXMgaXMgbm90IGNhbGxlZCBmcm9tIGFwcCB0aHJlYWQhCit2b2lkIEVwb2NTZGxFbnY6OldhaXREZXZpY2VDaGFuZ2UoKSAKKyAgICB7CisgIAlMb2NrUGFsZXR0ZShFVHJ1ZSk7CisgICAgZ0Vwb2NFbnYtPmlBcHBTcnYtPlJlcXVlc3RWYWx1ZShDU2RsQXBwU2Vydjo6RUFwcFNydldhaXREc2EpOworICAgIGNvbnN0IFRTaXplIHN6ID0gV2luZG93U2l6ZSgpOworICAgIGNvbnN0IFRJbnQgcGFyYW0gPSByZWludGVycHJldF9jYXN0PFRJbnQ+KCZzeik7CisgICAgT2JzZXJ2ZXJFdmVudChNU0RMT2JzZXJ2ZXI6OkVFdmVudFNjcmVlblNpemVDaGFuZ2VkLCBwYXJhbSk7CisgICAgCQorICAgLy8gUlRocmVhZCgpLlN1c3BlbmQoKTsKKyAgICB9ICAKKyAgICAKK0xPQ0FMX0MgVEJvb2wgQ2hlY2tTZGwoKSAKKyAgICB7CisgICAgVEludCBpc0V4aXQgPSBFVHJ1ZTsKKyAgICBSVGhyZWFkIHNkbDsKKyAgICBpZihzZGwuT3BlbihnRXBvY0Vudi0+aUlkKSA9PSBLRXJyTm9uZSkKKyAgICAgICAgeworICAgICAgICBpZihzZGwuRXhpdFR5cGUoKSA9PSBFRXhpdFBlbmRpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpc0V4aXQgPSBFRmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIHNkbC5DbG9zZSgpOworICAgICAgICB9CisgICAgcmV0dXJuIGlzRXhpdDsKKyAgICB9CisgICAgCit2b2lkIEVwb2NTZGxFbnZEYXRhOjpGcmVlKCkKKyAgICB7CisgICAgaWYoUlRocmVhZCgpLklkKCkgPT0gZ0Vwb2NFbnYtPmlJZCkKKyAgICAJeworICAgIAlpRHNhLT5GcmVlKCk7CisgICAgCXJldHVybjsKKyAgICAJfQorICAgCisgICAgX19BU1NFUlRfQUxXQVlTKGlBcmd2ID09IE5VTEwgfHwgQ2hlY2tTZGwoKSwgUEFOSUMoS0Vyck5vdFJlYWR5KSk7CisgICAgICAgIAorICAgIGZvcihUSW50IGkgPSAwOyBpIDwgaUFyZ2M7IGkrKykKKyAgICAgICAgVXNlcjo6RnJlZSggaUFyZ3ZbaV0gKTsKKyAgICAgICAgCisgICAgVXNlcjo6RnJlZShpQXJndik7CQorICAgICAKKyAgICAKKyAgICBkZWxldGUgaUV2ZW50UXVldWU7CisgICAgCisgICAgaWYoaURzYSAhPSBOVUxMKQorICAgIAlpRHNhLT5GcmVlKCk7CisgICAgCisJZGVsZXRlIGlEc2E7CisJZGVsZXRlIGlBcHBTcnY7CisgICAgfQorCitfTElUKEtTRExNYWluLCAiU0RMTWFpbiIpOworCitMT0NBTF9DIGludCBNYWluTCgpCisgICAgeworICAgIGdFcG9jRW52LT5pQ2xlYW51cEl0ZW1zID0gbmV3IChFTGVhdmUpIENBcnJheUZpeEZsYXQ8VFNkbENsZWFudXBJdGVtPig4KTsKKyAgICAKKyAgICBjaGFyKiogZW52cD0wOworICAgICAvKiAhISBwcm9jZXNzIGV4aXRzIGhlcmUgaWYgdGhlcmUgaXMgImV4aXQoKSIgaW4gbWFpbiEgKi8KKyAgICBpbnQgcmV0ID0gMDsKKyAgICBmb3IoVEludCBpID0gMDsgaSAgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgdm9pZCogZiA9ICh2b2lkKikgZ0Vwb2NFbnYtPmlNYWluW2ldOworICAgICAgICBpZihmICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goaSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICByZXQgPSAoKG1haW5mdW5jMSlmKSgpOyAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICgobWFpbmZ1bmMxKWYpKCk7IAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gKChtYWluZnVuYzIpZikoRXBvY1NkbEVudjo6QXJnYygpLCBFcG9jU2RsRW52OjpBcmd2KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgKChtYWluZnVuYzIpZikoRXBvY1NkbEVudjo6QXJnYygpLCBFcG9jU2RsRW52OjpBcmd2KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gKChtYWluZnVuYzMpZikoRXBvY1NkbEVudjo6QXJnYygpLCBFcG9jU2RsRW52OjpBcmd2KCksIGVudnApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgKChtYWluZnVuYzMpZikoRXBvY1NkbEVudjo6QXJnYygpLCBFcG9jU2RsRW52OjpBcmd2KCksIGVudnApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIFBBTklDKEtFcnJOb3RGb3VuZCk7CisgICAgcmV0dXJuIDA7CisgICAgfQorCitMT0NBTF9DIFRJbnQgRG9NYWluKFRBbnkqIC8qYVBhcmFtKi8pCisgICAgeworICAgIAorICAgIAorICAgIENUcmFwQ2xlYW51cCogY2xlYW51cCA9IENUcmFwQ2xlYW51cDo6TmV3KCk7CisgICAgICAJCisJVEJvb2wgZmJzY29ubmVjdGVkID0gRUZhbHNlOworCWlmKFJGYnNTZXNzaW9uOjpHZXRTZXNzaW9uKCkgPT0gTlVMTCkKKwkgICAgeworCSAgICBQQU5JQ19JRl9FUlJPUihSRmJzU2Vzc2lvbjo6Q29ubmVjdCgpKTsKKwkgICAgZmJzY29ubmVjdGVkID0gRVRydWU7CisJICAgIH0KKwkKKyAJZ0Vwb2NFbnYtPmlBcHBTcnYtPkluaXQoKTsJCisKKyNpZmRlZiBTWU1CSUFOQyAKKyAgICAvLyBDcmVhdGUgc3RkbGliIAorICAgIF9SRUVOVDsKKyNlbmRpZgorCisgICAgLy8gQ2FsbCBzdGRsaWIgbWFpbgorICAgIGludCByZXQgPSAwOworICAgIAorICAgIC8vY29tcGxldGVzIHdhaXRpbmcgcmVuZGVzdm91cworICAgIFJUaHJlYWQ6OlJlbmRlenZvdXMoS0Vyck5vbmUpOworICAgIAorICAgIFRSQVBEKGVyciwgZXJyID0gTWFpbkwoKSk7CisgICAgCisgICAgRXBvY1NkbEVudjo6T2JzZXJ2ZXJFdmVudChNU0RMT2JzZXJ2ZXI6OkVFdmVudE1haW5FeGl0LCBlcnIpOworICAgCisgICAgLy8gRnJlZSByZXNvdXJjZXMgYW5kIHJldHVybgorICAgIAorICAJRXBvY1NkbEVudjo6Q2xlYW51cEl0ZW1zKCk7CisgICAgICAgIAorICAgIGdFcG9jRW52LT5pQ2xlYW51cEl0ZW1zLT5SZXNldCgpOworICAgIGRlbGV0ZSBnRXBvY0Vudi0+aUNsZWFudXBJdGVtczsKKyAgICBnRXBvY0Vudi0+aUNsZWFudXBJdGVtcyA9IE5VTEw7CisgICAgCisgICAgZ0Vwb2NFbnYtPkZyZWUoKTsgLy9mcmVlIHVwIGluIHRocmVhZCByZXNvdXJjZXMgCisgICAgCisjaWZkZWYgU1lNQklBTkMgICAgCisgICAgX2NsZWFudXAoKTsgLy90aGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBhdCBleGl0LCBJIGNhbGwgaXQgaGVyZQorI2VuZGlmCisKKyAgICBpZihmYnNjb25uZWN0ZWQpCisgICAgICAgIFJGYnNTZXNzaW9uOjpEaXNjb25uZWN0KCk7CisgICAgCisjaWZkZWYgU1lNQklBTkMgICAgIAorICAgIENsb3NlU1RETElCKCk7CisjZW5kaWYKKyAgICAgICAKKyAvLyAgIGRlbGV0ZSBhczsKKyAgIAlkZWxldGUgY2xlYW51cDsJCisKKyAgICByZXR1cm4gZXJyID09IEtFcnJOb25lID8gcmV0IDogZXJyOzsKKyAgICB9CisgICAgCisKKyAgICAKK0VYUE9SVF9DIENTREw6On5DU0RMKCkKKyAgICB7CisgICAJZ0Vwb2NFbnYtPkZyZWUoKTsKKyAgICBVc2VyOjpGcmVlKGdFcG9jRW52KTsKKyAgICBnRXBvY0Vudi0+aVNkbCA9IE5VTEw7CisgICAgfQorCitFWFBPUlRfQyBDU0RMKiBDU0RMOjpOZXdMKFRJbnQgYUZsYWdzKQorICAgIHsKKyAgICBfX0FTU0VSVF9BTFdBWVMoZ0Vwb2NFbnYgPT0gTlVMTCwgUEFOSUMoS0VyckFscmVhZHlFeGlzdHMpKTsKKyAgICBnRXBvY0VudiA9IChFcG9jU2RsRW52RGF0YSopIFVzZXI6OkFsbG9jTChzaXplb2YoRXBvY1NkbEVudkRhdGEpKTsKKyAgICBNZW06OkZpbGxaKGdFcG9jRW52LCBzaXplb2YoRXBvY1NkbEVudkRhdGEpKTsKKyAgIAorICAgIGdFcG9jRW52LT5pRXBvY0VudkZsYWdzID0gYUZsYWdzOworICAgIGdFcG9jRW52LT5pRXZlbnRRdWV1ZSA9IENFdmVudFF1ZXVlOjpOZXdMKCk7CisgICAKKyAgICBnRXBvY0Vudi0+aUFwcFNydiA9IG5ldyAoRUxlYXZlKSBDU2RsQXBwU2VydigpOworICAgIGdFcG9jRW52LT5pQXBwU3J2LT5Db25zdHJ1Y3RMKCk7CisgICAgCisgICAgQ1NETCogc2RsID0gbmV3IChFTGVhdmUpIENTREwoKTsKKyAgICAKKyAgICBnRXBvY0Vudi0+aVNkbCA9IHNkbDsKKyAgICAKKyAgICByZXR1cm4gc2RsOworICAgIH0KKyAgICAKKyAgLyogIAorRVhQT1JUX0Mgdm9pZCBDU0RMOjpSZUluaXRMKFRGbGFncyBhRmxhZ3MpCisJeworCWNvbnN0IFRGbGFncyBwcmV2RmxhZ3MgPSBnRXBvY0Vudi0+aUVwb2NFbnZGbGFnczsKKwlnRXBvY0Vudi0+aUVwb2NFbnZGbGFncyA9IGFGbGFnczsKKwlUSW50IGVyciA9IEtFcnJOb25lOworCWlmKCgocHJldkZsYWdzICYgRURyYXdNb2RlRFNCKSAhPSAoYUZsYWdzICYgRURyYXdNb2RlRFNCKSkgJiYgZ0Vwb2NFbnYtPmlEc2EpCisJCXsKKwkJZGVsZXRlIGdFcG9jRW52LT5pRHNhOworCQlnRXBvY0Vudi0+aURzYSA9IE5VTEw7CisJCWdFcG9jRW52LT5pRHNhID0gQ0RzYTo6UmVjcmVhdGVMKEVwb2NTZGxFbnY6OkZsYWdzKENTREw6OkVEcmF3TW9kZURTQikpOworCQl9CisJfQorICovCisKKworRVhQT1JUX0Mgdm9pZCBDU0RMOjpTZXRDb250YWluZXJXaW5kb3dMKFJXaW5kb3cmIGFXaW5kb3csIFJXc1Nlc3Npb24mIGFTZXNzaW9uLCBDV3NTY3JlZW5EZXZpY2UmIGFEZXZpY2UpCisgICAgeworICAgIGlmKGdFcG9jRW52LT5pRHNhID09IE5VTEwpCisgICAgCWdFcG9jRW52LT5pRHNhID0gQ0RzYTo6Q3JlYXRlTChhU2Vzc2lvbik7CisgICAgZ0Vwb2NFbnYtPmlEc2EtPkNvbnN0cnVjdEwoYVdpbmRvdywgYURldmljZSk7CisgICAgfQorICAgICAgICAKKyAgIAorRVhQT1JUX0MgVFRocmVhZElkIENTREw6OkNhbGxNYWluTChjb25zdCBUTWFpbkZ1bmMmIGFGdW5jLCBUUmVxdWVzdFN0YXR1cyogY29uc3QgYVN0YXR1cywgY29uc3QgQ0Rlc0M4QXJyYXkqIGNvbnN0IGFBcmcsIFRJbnQgYUZsYWdzLCBUSW50IGFTdGFja1NpemUpCisgICAgeworICAgIEFTU0VSVChnRXBvY0VudiAhPSBOVUxMKTsKKyAgICBnRXBvY0Vudi0+aU1haW4gPSBhRnVuYzsKKyAgICBjb25zdCBUQm9vbCBhcmdzID0gYUFyZyAhPSBOVUxMOworICAgIAorICAgIGdFcG9jRW52LT5pQXJnYyA9IGFBcmctPkNvdW50KCkgKyAxOworICAgIGdFcG9jRW52LT5pQXJndiA9IChjaGFyKiopIFVzZXI6OkFsbG9jTChzaXplb2YoY2hhciopICogKGdFcG9jRW52LT5pQXJnYyArIDEpKTsgIAorICAgICAgCisgICAgVEludCBrID0gMDsKKyAgICBjb25zdCBURmlsZU5hbWUgcHJvY2Vzc05hbWUgPSBSUHJvY2VzcygpLkZpbGVOYW1lKCk7CisgICAgY29uc3QgVEludCBsZW4gPSBwcm9jZXNzTmFtZS5MZW5ndGgoKTsKKyAgICBnRXBvY0Vudi0+aUFyZ3Zba10gPSAoY2hhciopIFVzZXI6OkFsbG9jTChsZW4gKyAxKTsKKyAgICBNZW06OkNvcHkoZ0Vwb2NFbnYtPmlBcmd2W2tdLCBwcm9jZXNzTmFtZS5QdHIoKSwgbGVuKTsKKyAgICBnRXBvY0Vudi0+aUFyZ3Zba11bbGVuXSA9IDA7CisgICAgICAKKyAgICBmb3IoVEludCBpID0gIDA7IGFyZ3MgJiYgKGkgPCBhQXJnLT5Db3VudCgpKTsgaSsrKQorICAgICAgICB7CisgICAgICAgIGsrKzsKKyAgICAgICAgY29uc3QgVEludCBsZW4gPSBhQXJnLT5NZGNhUG9pbnQoaSkuTGVuZ3RoKCk7CisgICAgICAgIGdFcG9jRW52LT5pQXJndltrXSA9IChjaGFyKikgVXNlcjo6QWxsb2NMKGxlbiArIDEpOworICAgICAgICBNZW06OkNvcHkoZ0Vwb2NFbnYtPmlBcmd2W2tdLCBhQXJnLT5NZGNhUG9pbnQoaSkuUHRyKCksIGxlbik7CisgICAgICAgIGdFcG9jRW52LT5pQXJndltrXVtsZW5dID0gMDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICBnRXBvY0Vudi0+aUFyZ3ZbZ0Vwb2NFbnYtPmlBcmdjXSA9IE5VTEw7CisgICAgICAgICAKKyAgICBSVGhyZWFkIHRocmVhZDsKKyAgICBVc2VyOjpMZWF2ZUlmRXJyb3IodGhyZWFkLkNyZWF0ZShLU0RMTWFpbiwgRG9NYWluLCBhU3RhY2tTaXplLCBOVUxMLCBOVUxMKSk7CisgICAgCisgICAgaWYoYVN0YXR1cyAhPSBOVUxMKQorICAgIAl7CisgICAgCXRocmVhZC5Mb2dvbigqYVN0YXR1cyk7CisgICAgCX0KKyAgICAJCisgICAgZ0Vwb2NFbnYtPmlJZCA9IHRocmVhZC5JZCgpOworICAgIHRocmVhZC5TZXRQcmlvcml0eShFUHJpb3JpdHlMZXNzKTsKKyAgICBpZigoYUZsYWdzICYgQ1NETDo6RVJlcXVlc3RSZXN1bWUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgdGhyZWFkLlJlc3VtZSgpOworICAgICAgICB9CisgICAgdGhyZWFkLkNsb3NlKCk7CisgICAgcmV0dXJuIGdFcG9jRW52LT5pSWQ7CisgICAgfQorICAgIAorRVhQT1JUX0MgVEludCBDU0RMOjpBcHBlbmRXc0V2ZW50KGNvbnN0IFRXc0V2ZW50JiBhRXZlbnQpCisgICAgeworICAgIHJldHVybiBFcG9jU2RsRW52OjpFdmVudFF1ZXVlKCkuQXBwZW5kKGFFdmVudCk7CisgICAgfQorICAgIAorRVhQT1JUX0Mgdm9pZCBDU0RMOjpTRExQYW5pYyhjb25zdCBURGVzQyYgYUluZm8sIFRJbnQgYUVycikKKyAgICB7CisgICAgRXBvY1NkbEVudjo6UGFuaWNNYWluKGFJbmZvLCBhRXJyKTsKKyAgICB9CisgICAgCitFWFBPUlRfQyBUSW50IENTREw6OkdldFNETENvZGUoVEludCBhU2NhbkNvZGUpCisgICAgeworICAgIGlmKGFTY2FuQ29kZSA8IDApCisgICAgICAgIHJldHVybiBNQVhfU0NBTkNPREU7CisgICAgaWYoYVNjYW5Db2RlID49IE1BWF9TQ0FOQ09ERSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBLZXlNYXAoKVthU2NhbkNvZGVdOworICAgIH0KKyAgICAKK0VYUE9SVF9DIFRJbnQgQ1NETDo6U0RMQ29kZXNDb3VudCgpIGNvbnN0CisJeworCXJldHVybiBNQVhfU0NBTkNPREU7CisJfQorCQorRVhQT1JUX0Mgdm9pZCBDU0RMOjpSZXNldFNETENvZGVzKCkKKwl7CisJUmVzZXRLZXlNYXAoKTsKKwl9CisgICAgCitFWFBPUlRfQyB2b2lkIENTREw6OlNldE9yaWVudGF0aW9uKFRPcmllbnRhdGlvbk1vZGUgYU1vZGUpCisJeworCWdFcG9jRW52LT5pRHNhLT5TZXRPcmllbnRhdGlvbihhTW9kZSk7CisJfQorICAgIAorRVhQT1JUX0MgVEludCBDU0RMOjpTZXRTRExDb2RlKFRJbnQgYVNjYW5Db2RlLCBUSW50IGFTRExDb2RlKQorICAgIHsKKyAgICBjb25zdCBUSW50IGN1cnJlbnQgPSBHZXRTRExDb2RlKGFTY2FuQ29kZSk7CisgICAgaWYoYVNjYW5Db2RlID49IDAgJiYgYVNjYW5Db2RlIDwgTUFYX1NDQU5DT0RFKQorICAgICAgICBLZXlNYXAoKVthU2NhbkNvZGVdID0gc3RhdGljX2Nhc3Q8U0RMS2V5PihhU0RMQ29kZSk7CisgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorCisKK0VYUE9SVF9DIE1TRExPYnNlcnZlciogQ1NETDo6T2JzZXJ2ZXIoKQorCXsKKwlyZXR1cm4gZ0Vwb2NFbnYtPmlBcHBTcnYtPk9ic2VydmVyKCk7CisJfSAgICAKKyAgICAKK0VYUE9SVF9DIHZvaWQgQ1NETDo6U2V0T2JzZXJ2ZXIoTVNETE9ic2VydmVyKiBhT2JzZXJ2ZXIpCisJeworCWdFcG9jRW52LT5pQXBwU3J2LT5TZXRPYnNlcnZlcihhT2JzZXJ2ZXIpOworCX0KKwkKK0VYUE9SVF9DIHZvaWQgQ1NETDo6UmVzdW1lKCkKKwl7CisJRXBvY1NkbEVudjo6UmVzdW1lKCk7CisJfQorCQorRVhQT1JUX0Mgdm9pZCBDU0RMOjpTdXNwZW5kKCkKKwl7CisJZ0Vwb2NFbnYtPmlEc2EtPkRvU3RvcCgpOworCX0KKwkKK0VYUE9SVF9DIENTREw6OkNTREwoKQorICAgIHsKKyAgICB9CisKK0VYUE9SVF9DIHZvaWQgQ1NETDo6RGlzYWJsZUtleUJsb2NraW5nKENBa25BcHBVaSYgYUFwcFVpKSBjb25zdAorCXsKKwlnRXBvY0Vudi0+aUFwcFVpID0gJmFBcHBVaTsKKwlFbnZVdGlsczo6RGlzYWJsZUtleUJsb2NraW5nKCk7CisJfQorCitFWFBPUlRfQyBUSW50IENTREw6OlNldEJsaXR0ZXIoTUJsaXR0ZXIqIGFCbGl0dGVyKQorCXsKKwlpZihnRXBvY0VudiAmJiBnRXBvY0Vudi0+aURzYSkKKwkJeworCQlnRXBvY0Vudi0+aURzYS0+U2V0QmxpdHRlcihhQmxpdHRlcik7CisJCXJldHVybiBLRXJyTm9uZTsKKwkJfQorCXJldHVybiBLRXJyTm90UmVhZHk7CisJfQorCQkKKwkKK0VYUE9SVF9DIFRJbnQgQ1NETDo6QXBwZW5kT3ZlcmxheShNT3ZlcmxheSYgYU92ZXJsYXksIFRJbnQgYVByaW9yaXR5KQorCXsKKwlpZihnRXBvY0VudiAmJiBnRXBvY0Vudi0+aURzYSkKKwkJeworCQlyZXR1cm4gZ0Vwb2NFbnYtPmlEc2EtPkFwcGVuZE92ZXJsYXkoYU92ZXJsYXksIGFQcmlvcml0eSk7CisJCX0KKwlyZXR1cm4gS0Vyck5vdFJlYWR5OworCX0KKworRVhQT1JUX0MgVEludCBDU0RMOjpSZW1vdmVPdmVybGF5KE1PdmVybGF5JiBhT3ZlcmxheSkJCisJeworCWlmKGdFcG9jRW52ICYmIGdFcG9jRW52LT5pRHNhKQorCQl7CisJCXJldHVybiBnRXBvY0Vudi0+aURzYS0+UmVtb3ZlT3ZlcmxheShhT3ZlcmxheSk7CisJCX0KKwlyZXR1cm4gS0Vyck5vdFJlYWR5OworCX0KKworRVhQT1JUX0MgVEludCBDU0RMOjpSZWRyYXdSZXF1ZXN0KCkKKwl7CisJaWYoZ0Vwb2NFbnYgJiYgZ0Vwb2NFbnYtPmlEc2EpCisJCXsKKwkJcmV0dXJuIGdFcG9jRW52LT5pRHNhLT5SZWRyYXdSZXF1ZXN0KCk7CisJCX0KKwlyZXR1cm4gS0Vyck5vdFJlYWR5OworCX0KKwkKKy8qCitFWFBPUlRfQyBDU0RMKiBDU0RMOjpDdXJyZW50KCkKKyAgICB7CisgICAgcmV0dXJuIGdFcG9jRW52ICE9IE5VTEwgPyBnRXBvY0Vudi0+aVNkbCA6IE5VTEw7CisgICAgfQorCisgICAgCitFWFBPUlRfQyBUSW50IENTREw6OlNldFZvbHVtZShUSW50IGFWb2x1bWUpCisgICAgeworICAgIHJldHVybiBFcG9jU2RsRW52OjpTZXRWb2x1bWUoYVZvbHVtZSk7CisgICAgfSAKKyAgICAKK0VYUE9SVF9DIFRJbnQgQ1NETDo6Vm9sdW1lKCkgY29uc3QKKyAgICB7CisgICAgcmV0dXJuIEVwb2NTZGxFbnY6OlZvbHVtZSgpOworICAgIH0gICAgIAorCQorRVhQT1JUX0MgVEludCBDU0RMOjpNYXhWb2x1bWUoKSBjb25zdAorICAgIHsKKyAgICByZXR1cm4gRXBvY1NkbEVudjo6TWF4Vm9sdW1lKCk7CisgICAgfSAJCisqLworCQkJCit2b2lkIEVudlV0aWxzOjpEaXNhYmxlS2V5QmxvY2tpbmcoKQorCXsKKwlpZihnRXBvY0Vudi0+aUFwcFVpICE9IE5VTEwpCisJCXJldHVybiBDQ3VycmVudEFwcFVpOjpDYXN0KGdFcG9jRW52LT5pQXBwVWkpLT5EaXNhYmxlS2V5QmxvY2tpbmcoKTsKKwl9CisJCitUQm9vbCBFbnZVdGlsczo6UmVuZGV6dm91cyhSVGhyZWFkJiBhVGhyZWFkLCBUUmVxdWVzdFN0YXR1cyYgYVN0YXR1cykKKwl7CisJaWYoZ0Vwb2NFbnYtPmlJZCAhPSBUVGhyZWFkSWQoMCkgJiYKKyAgICAJCSAJYVRocmVhZC5PcGVuKGdFcG9jRW52LT5pSWQpICYmCisgICAgCQkgIAlhVGhyZWFkLkV4aXRUeXBlKCkgPT0gRUV4aXRQZW5kaW5nKQorICAgIAkJCXsKKyAgICAJCQlhVGhyZWFkLlJlbmRlenZvdXMoYVN0YXR1cyk7CisgICAgCQkJcmV0dXJuIEVUcnVlOworICAgIAkJCX0KKyAgICByZXR1cm4gRUZhbHNlOworCX0KKwkKKwkKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL3N5bWJpYW4vRUtBMi9zZGxleGUuY3BwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL3N5bWJpYW4vRUtBMi9zZGxleGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTYwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vc3ltYmlhbi9FS0EyL3NkbGV4ZS5jcHAKQEAgLTAsMCArMSw4MDkgQEAKKy8vICBJTkNMVURFUworI2luY2x1ZGUgPGFrbmFwcC5oPgorI2luY2x1ZGUgPGFrbmFwcHVpLmg+CisjaW5jbHVkZSA8ZWlrZG9jLmg+CisjaW5jbHVkZSA8c2RsZXBvY2FwaS5oPgorI2luY2x1ZGUgPGJhdXRpbHMuaD4KKyNpbmNsdWRlIDxlaWtzdGFydC5oPgorI2luY2x1ZGUgPGJhZGVzY2EuaD4KKyNpbmNsdWRlIDxiYXV0aWxzLmg+CisjaW5jbHVkZSA8YXBnY2xpLmg+CisjaW5jbHVkZSA8c2RsbWFpbi5oPgorI2luY2x1ZGUgPGVpa2Vkd2luLmg+CisjaW5jbHVkZSA8ZWlrbGFiZWwuaD4KKyNpbmNsdWRlIDxzZGxleGUucnNnPgorI2luY2x1ZGUgPGFrbmdsb2JhbG1zZ3F1ZXJ5Lmg+CisjaW5jbHVkZSA8YXBnd2duYW0uaD4gCisKKworCisvLyAgRk9SV0FSRCBERUNMQVJBVElPTlMKK2NsYXNzIENBcGFEb2N1bWVudDsKKworCisvL2NvbnN0IFRVaWQgS1NETFVJRCA9IHsgMHhGMDFGNjA1RSB9OworCitMT0NBTF9DIHZvaWQgTWFrZUNDbWRMaW5lTChjb25zdCBURGVzQzgmIGFQYXJhbSwgQ0Rlc0M4QXJyYXkmIGFBcnJheSkKKyAgICB7IAorICAgIAorICAgIGNvbnN0IFRDaGFyIGRxKCdcIicpOworCisgICAgVExleDggbGV4KGFQYXJhbSk7CisgICAgVEJvb2wgaW4gPSBFRmFsc2U7CisKKyAgICBsZXguU2tpcFNwYWNlQW5kTWFyaygpOworCisgICAgd2hpbGUoIWxleC5Fb3MoKSkKKyAgICAgICAgeworICAgICAgICBUUHRyQzggcHRyOworICAgICAgICBpZihpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFRQdHJDOCByZW0gPSBsZXguUmVtYWluZGVyRnJvbU1hcmsoKTsKKyAgICAgICAgICAgIGNvbnN0IFRJbnQgcG9zID0gcmVtLkxvY2F0ZShkcSk7CisgICAgICAgICAgICBpZihwb3MgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXguSW5jKHBvcyk7CisgICAgICAgICAgICAgICAgcHRyLlNldChsZXguTWFya2VkVG9rZW4oKSk7CisgICAgICAgICAgICAgICAgbGV4LlNraXBBbmRNYXJrKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHRyLlNldChyZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluID0gRUZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdHIuU2V0KGxleC5OZXh0VG9rZW4oKSk7CisgICAgICAgICAgICBjb25zdCBUSW50IHBvcyA9IHB0ci5Mb2NhdGUoZHEpOworICAgICAgICAgICAgaWYocG9zID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxleC5VbkdldFRvTWFyaygpOworICAgICAgICAgICAgICAgIGxleC5Ta2lwQW5kTWFyaygxKTsKKyAgICAgICAgICAgICAgICBpbiA9IEVUcnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBiYWNrIHRvIGluIGJyYWNlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxleC5Ta2lwU3BhY2VBbmRNYXJrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICBhQXJyYXkuQXBwZW5kTChwdHIpOworCisgICAgICAgIH0KKyAgICB9ICAKKyAgICAKK05PTlNIQVJBQkxFX0NMQVNTKFRWaXJ0dWFsQ3Vyc29yKSA6IHB1YmxpYyBNT3ZlcmxheQorCXsKKwlwdWJsaWM6CisJCVRWaXJ0dWFsQ3Vyc29yKCk7CisJCXZvaWQgU2V0KGNvbnN0IFRSZWN0JiBhUmVjdCwgQ0Zic0JpdG1hcCogYUJtcCwgQ0Zic0JpdG1hcCogYUFscGhhKTsKKwkJdm9pZCBNb3ZlKFRJbnQgYVgsIFRJbnQgYVkpOworCQl2b2lkIE1ha2VFdmVudChUV3NFdmVudCYgYUV2ZW50LCBjb25zdCBUUG9pbnQmIGFCYXNlUG9zKSBjb25zdDsKKwkJdm9pZCBUb2dnbGUoKTsKKwkJVEJvb2wgSXNPbigpIGNvbnN0OworCXByaXZhdGU6CisgICAgCXZvaWQgRHJhdyhDQml0bWFwQ29udGV4dCYgYUdjLCBjb25zdCBUUmVjdCYgYVRhcmdldFJlY3QsIGNvbnN0IFRTaXplJiBhU2l6ZSk7CisJcHJpdmF0ZToKKwkJVFJlY3QgaVJlY3Q7CisJCVRQb2ludCBpSW5jOworCQlUUG9pbnQgaVBvczsKKwkJVEJvb2wgaUlzT247CisJCUNGYnNCaXRtYXAqIGlDQm1wOworCQlDRmJzQml0bWFwKiBpQWxwaGE7CisJfTsKKwkKKwkKK1RWaXJ0dWFsQ3Vyc29yOjpUVmlydHVhbEN1cnNvcigpIDogIGlJbmMoMCwgMCksIGlJc09uKEVGYWxzZSksIGlDQm1wKE5VTEwpCisJewkKKwl9CisJCitjb25zdCBUSW50IEtNYXhNb3ZlID0gMTA7CQorCit2b2lkIFRWaXJ0dWFsQ3Vyc29yOjpNb3ZlKFRJbnQgYVgsIFRJbnQgYVkpCisJeworCWlmKGFYID4gMCAmJiBpSW5jLmlYID4gMCkKKwkJCSsraUluYy5pWDsKKwllbHNlIGlmKGFYIDwgMCAmJiBpSW5jLmlYIDwgMCkKKwkJCS0taUluYy5pWDsKKwllbHNlCisJCWlJbmMuaVggPSBhWDsKKworCWlmKGFZID4gMCAmJiBpSW5jLmlZID4gMCkKKwkJCSsraUluYy5pWTsKKwllbHNlIGlmKGFZIDwgMCAmJiBpSW5jLmlZIDwgMCkKKwkJCS0taUluYy5pWTsKKwllbHNlCisJCQlpSW5jLmlZID0gYVk7CisJCisJaUluYy5pWCA9IE1pbihLTWF4TW92ZSwgaUluYy5pWCk7IAorCQorCWlJbmMuaVggPSBNYXgoLUtNYXhNb3ZlLCBpSW5jLmlYKTsKKwkKKwlpSW5jLmlZID0gTWluKEtNYXhNb3ZlLCBpSW5jLmlZKTsKKwkKKwlpSW5jLmlZID1NYXgoLUtNYXhNb3ZlLCBpSW5jLmlZKTsKKwkKKwljb25zdCBUUG9pbnQgcG9zID0gaVBvcyArIGlJbmM7CisJaWYoaVJlY3QuQ29udGFpbnMocG9zKSkKKwkJeworCQlpUG9zID0gcG9zOworCQl9CisJZWxzZQorCQl7CisJCWlJbmMgPSBUUG9pbnQoMCwgMCk7CQorCQl9CisJfQorCQorCQordm9pZCBUVmlydHVhbEN1cnNvcjo6VG9nZ2xlKCkKKwl7CisJaUlzT24gPSAhaUlzT247CisJfQorCQorCQorVEJvb2wgVFZpcnR1YWxDdXJzb3I6OklzT24oKSBjb25zdAorCXsKKwlyZXR1cm4gaUlzT247CisJfQorCQordm9pZCBUVmlydHVhbEN1cnNvcjo6U2V0KGNvbnN0IFRSZWN0JiBhUmVjdCwgQ0Zic0JpdG1hcCogYUJtcCwgQ0Zic0JpdG1hcCogYUFscGhhKQorCXsKKwlpUmVjdCA9IGFSZWN0OworCWlDQm1wID0gYUJtcDsKKwlpQWxwaGEgPSBhQWxwaGE7CisJfQorCQorCQkKK3ZvaWQgVFZpcnR1YWxDdXJzb3I6Ok1ha2VFdmVudChUV3NFdmVudCYgYUV2ZW50LCBjb25zdCBUUG9pbnQmIGFCYXNlUG9zKSBjb25zdAorCXsKKyAJYUV2ZW50LlNldFR5cGUoRUV2ZW50UG9pbnRlciksCisJYUV2ZW50LlNldFRpbWVOb3coKTsKKwlUUG9pbnRlckV2ZW50JiBwb2ludGVyID0gKmFFdmVudC5Qb2ludGVyKCk7CQorCXBvaW50ZXIuaVR5cGUgPSBUUG9pbnRlckV2ZW50OjpFQnV0dG9uMURvd247CisJcG9pbnRlci5pUG9zaXRpb24gPSBpUG9zOworCXBvaW50ZXIuaVBhcmVudFBvc2l0aW9uID0gYUJhc2VQb3M7CisJfQorCQorCQordm9pZCBUVmlydHVhbEN1cnNvcjo6RHJhdyhDQml0bWFwQ29udGV4dCYgYUdjLCBjb25zdCBUUmVjdCYgLyphVGFyZ2V0UmVjdCovLCBjb25zdCBUU2l6ZSYgLyphU2l6ZSovKQorCXsKKwlpZihpSXNPbiAmJiBpQ0JtcCAhPSBOVUxMKQorCQl7CisJCWNvbnN0IFRSZWN0IHJlY3QoVFBvaW50KDAsIDApLCBpQ0JtcC0+U2l6ZUluUGl4ZWxzKCkpOworCQlhR2MuQWxwaGFCbGVuZEJpdG1hcHMoaVBvcywgaUNCbXAsIHJlY3QsIGlBbHBoYSwgVFBvaW50KDAsIDApKTsKKwkJfQorCQorCX0JCisKK05PTlNIQVJBQkxFX0NMQVNTKFRTZGxDbGFzcykKKwl7CisJcHVibGljOgorCQlUU2RsQ2xhc3MoKTsKKwkJdm9pZCBTZXRNYWluKGNvbnN0IFRNYWluRnVuYyYgYUZ1bmMsIFRJbnQgYUZsYWdzLCBNU0RMTWFpbk9icyogYU9icywgVEludCBhRXhlRmxhZ3MpOworCQlUSW50IFNkbEZsYWdzKCkgY29uc3Q7CisJCWNvbnN0IFRNYWluRnVuYyYgTWFpbigpIGNvbnN0OworCQl2b2lkIFNlbmRFdmVudChUSW50IGFFdmVudCwgVEludCBhUGFyYW0sIENTREwqIGFTREwpOworCQlUSW50IEFwcEZsYWdzKCkgY29uc3Q7IAorCQl2b2lkIEFwcEZsYWdzKFRJbnQgYUZsYWdzKTsgCisJcHJpdmF0ZToKKwkJVE1haW5GdW5jIGlGdW5jOworCQlUSW50IGlTZGxGbGFnczsKKwkJVEludCBpRXhlRmxhZ3M7CisJCU1TRExNYWluT2JzKiBpT2JzOworCX07CisJCisJCit2b2lkIFRTZGxDbGFzczo6QXBwRmxhZ3MoVEludCBhRmxhZ3MpCisJeworCWlFeGVGbGFncyB8PSBhRmxhZ3M7CisJfQorCQordm9pZCBUU2RsQ2xhc3M6OlNlbmRFdmVudChUSW50IGFFdmVudCwgVEludCBhUGFyYW0sIENTREwqIGFTREwpCisJeworCWlmKGlPYnMgIT0gTlVMTCkKKwkJaU9icy0+U0RMTWFpbkV2ZW50KGFFdmVudCwgYVBhcmFtLCBhU0RMKTsKKwl9CisJCitUSW50IFRTZGxDbGFzczo6QXBwRmxhZ3MoKSBjb25zdAorCXsKKwlyZXR1cm4gaUV4ZUZsYWdzOworCX0KKwkKK3ZvaWQgVFNkbENsYXNzOjpTZXRNYWluKGNvbnN0IFRNYWluRnVuYyYgYUZ1bmMsIFRJbnQgYUZsYWdzLCBNU0RMTWFpbk9icyogYU9icywgVEludCBhRXhlRmxhZ3MpCisJewkKKwlpRnVuYyA9IGFGdW5jOworCWlTZGxGbGFncyA9IGFGbGFnczsKKwlpRXhlRmxhZ3MgPSBhRXhlRmxhZ3M7CisJaU9icyA9IGFPYnM7CisJfQorCQorY29uc3QgVE1haW5GdW5jJiBUU2RsQ2xhc3M6Ok1haW4oKSBjb25zdAorCXsKKwlyZXR1cm4gaUZ1bmM7CisJfQorCQorIAorIFRJbnQgVFNkbENsYXNzOjpTZGxGbGFncygpIGNvbnN0CisgCXsKKyAJcmV0dXJuIGlTZGxGbGFnczsKKyAJfQorIAkKKworIAkKK1RTZGxDbGFzczo6VFNkbENsYXNzKCkKKwl7CisJTWVtOjpGaWxsWih0aGlzLCBzaXplb2YodGhpcykpOworCX0KKyAKK1RTZGxDbGFzcyBnU0RMQ2xhc3M7ICAgIAorICAgIAorCSAgICAgCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgIAorCitOT05TSEFSQUJMRV9DTEFTUyhDU0RMQXBwbGljYXRpb24pIDogcHVibGljIENBa25BcHBsaWNhdGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgCUNTRExBcHBsaWNhdGlvbigpOworICAgIHByaXZhdGU6CisgICAgICAgIENBcGFEb2N1bWVudCogQ3JlYXRlRG9jdW1lbnRMKCk7IAorICAgICAgICBURmlsZU5hbWUgUmVzb3VyY2VGaWxlTmFtZSgpIGNvbnN0OworICAgICAgICBUVWlkIEFwcERsbFVpZCgpIGNvbnN0OyAKKyAgICAgIAkJdm9pZCBGaW5kTWVMKCk7CisgICAgIAkJVFVpZCBpVWlkOworICAgIH07CisgICAgCitOT05TSEFSQUJMRV9DTEFTUyhDU0RMRG9jdW1lbnQpICA6IHB1YmxpYyBDRWlrRG9jdW1lbnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBDU0RMRG9jdW1lbnQoQ0Vpa0FwcGxpY2F0aW9uJiBhQXBwKTsKKyAgICAgcHJpdmF0ZToKKyAgICAgCUNFaWtBcHBVaSogQ3JlYXRlQXBwVWlMKCk7CisgICAgIAorICAgICB9OworICAgICAKKyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworIAorICAgICAKK05PTlNIQVJBQkxFX0NMQVNTKE1FeGl0V2FpdCkKKyAJeworIAlwdWJsaWM6CisgCQl2aXJ0dWFsIHZvaWQgRG9FeGl0KFRJbnQgYUVycikgPSAwOworIAl9OyAgIAorIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAKKyAJCitOT05TSEFSQUJMRV9DTEFTUyhDRXhpdFdhaXQpIDogcHVibGljIENBY3RpdmUKKyAJeworIAlwdWJsaWM6CisgCQlDRXhpdFdhaXQoTUV4aXRXYWl0JiBhV2FpdCk7CisgCQl+Q0V4aXRXYWl0KCk7CisgCXByaXZhdGU6CisgCQl2b2lkIFJ1bkwoKTsKKyAJCXZvaWQgRG9DYW5jZWwoKTsKKyAJcHJpdmF0ZToKKyAJCU1FeGl0V2FpdCYgaVdhaXQ7CisgCQlUUmVxdWVzdFN0YXR1cyogaVN0YXR1c1B0cjsKKyAJfTsKKyAJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gCisKKyAJCitOT05TSEFSQUJMRV9DTEFTUyhDU0RMV2luKSA6IHB1YmxpYyBDQ29lQ29udHJvbAorCXsKKwlwdWJsaWM6CisJCXZvaWQgQ29uc3RydWN0TChjb25zdCBUUmVjdCYgYVJlY3QpOworCQlSV2luZG93JiBHZXRXaW5kb3coKSBjb25zdDsKKwkJdm9pZCBTZXROb0RyYXcoKTsKKwlwcml2YXRlOgorCQl2b2lkIERyYXcoY29uc3QgVFJlY3QmIGFSZWN0KSBjb25zdDsKKwlwcml2YXRlOgorCQlUQm9vbCBpTm9EcmF3OworCX07IAkKKwkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwkKKyAgICAgCitOT05TSEFSQUJMRV9DTEFTUyhDU0RMQXBwVWkpIDogcHVibGljIENBa25BcHBVaSwgcHVibGljIE1FeGl0V2FpdCwgTVNETE9ic2VydmVyCisJeworCXB1YmxpYzoKKwkJfkNTRExBcHBVaSgpOworICAgCXByaXZhdGU6IC8vIE5ldyBmdW5jdGlvbnMKKyAJCXZvaWQgQ29uc3RydWN0TCgpOyAKKyAgIAl2b2lkIEhhbmRsZUNvbW1hbmRMKFRJbnQgYUNvbW1hbmQpOworIAkJdm9pZCBIYW5kbGVXc0V2ZW50TChjb25zdCBUV3NFdmVudCYgYUV2ZW50LCBDQ29lQ29udHJvbCogYURlc3RpbmF0aW9uKTsKKyAJCXZvaWQgSGFuZGxlUmVzb3VyY2VDaGFuZ2VMKFRJbnQgYVR5cGUpOworICAgICAgICAKKyAgIAkJdm9pZCBEb0V4aXQoVEludCBhRXJyKTsKKyAgIAkKKyAgIAkJVEludCBTZGxFdmVudChUSW50IGFFdmVudCwgVEludCBhUGFyYW0pOworICAgIAlUSW50IFNkbFRocmVhZEV2ZW50KFRJbnQgYUV2ZW50LCBUSW50IGFQYXJhbSk7CisgICAgCisgICAgCXZvaWQgU3RhcnRMKCk7CisgICAgCXN0YXRpYyBUQm9vbCBTdGFydEwoVEFueSogYVRoaXMpOworICAgIAkKKyAgICAJVEJvb2wgUGFyYW1FZGl0b3JMKFREZXMmIGFDaGVhdCk7CisgICAgCQorICAgIAlUQm9vbCBQcm9jZXNzQ29tbWFuZFBhcmFtZXRlcnNMKENBcGFDb21tYW5kTGluZSAmYUNvbW1hbmRMaW5lKTsKKyAgICAJCisgICAgCXZvaWQgUHJlcGFyZVRvRXhpdCgpOworICAgIAl2b2lkIEhhbmRsZUNvbnNvbGVXaW5kb3dMKCk7CisgICAgCXZvaWQgSGFuZGxlQ29uc29sZVdpbmRvdygpOworICAgIAl2b2lkIEhhbmRsZUZvcmVncm91bmRFdmVudEwoVEJvb2wgYUZvcmVncm91bmQpOworICAgIAkKKyAgICAJc3RhdGljIFRCb29sIElkbGVSZXF1ZXN0TChUQW55KiBhVGhpcyk7CisgICAgCQorICAgIAlUQm9vbCBIYW5kbGVLZXlMKGNvbnN0IFRXc0V2ZW50JiBhRXZlbnQpOworICAgIAorICAgIAkKKwlwcml2YXRlOgorCQlDRXhpdFdhaXQqIGlXYWl0OworCQlDU0RMV2luKiBpU0RMV2luOworCQlDU0RMKiBpU2RsOworCQlDSWRsZSogaVN0YXJ0ZXI7CisJCVRCb29sIGlFeGl0UmVxdWVzdDsKKwkJQ0Rlc0M4QXJyYXkqIGlQYXJhbXM7CisJCVRJbnQgaVJlc09mZnNldDsKKwkJQ0lkbGUqIGlJZGxlOworCQlUSW50IGlTdGRPdXQ7CisJCVRWaXJ0dWFsQ3Vyc29yIGlDdXJzb3I7CisJCUNGYnNCaXRtYXAqCWlDQm1wOworCQlDRmJzQml0bWFwKglpQWxwaGE7CisJLy8JVFRpbWUgaUxhc3RQcmVzczsKKwkvLwlDU0RMOjpUT3JpZW50YXRpb25Nb2RlIGlPcmllbnRhdGlvbjsKKwl9OworCQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLzcKKworQ0FwYURvY3VtZW50KiBDU0RMQXBwbGljYXRpb246OkNyZWF0ZURvY3VtZW50TCgpCisJeworCXJldHVybiBuZXcgKEVMZWF2ZSkgQ1NETERvY3VtZW50KCp0aGlzKTsKKwl9CisJCitUVWlkIENTRExBcHBsaWNhdGlvbjo6QXBwRGxsVWlkKCkgY29uc3QKKwl7CisJcmV0dXJuIGlVaWQ7CisJfQorCQorCQorQ1NETEFwcGxpY2F0aW9uOjpDU0RMQXBwbGljYXRpb24oKQorCXsKKwlUUkFQRChlcnIsIEZpbmRNZUwoKSk7CisJQVNTRVJUKGVyciA9PSBLRXJyTm9uZSk7CisJfQkKKwkKK3ZvaWQgQ1NETEFwcGxpY2F0aW9uOjpGaW5kTWVMKCkKKwl7CisJUkFwYUxzU2Vzc2lvbiBhcGE7CisJVXNlcjo6TGVhdmVJZkVycm9yKGFwYS5Db25uZWN0KCkpOworCUNsZWFudXBDbG9zZVB1c2hMKGFwYSk7CisJVXNlcjo6TGVhdmVJZkVycm9yKGFwYS5HZXRBbGxBcHBzKCkpOworCVRGaWxlTmFtZSBuYW1lID0gUlByb2Nlc3MoKS5GaWxlTmFtZSgpOworCVRBcGFBcHBJbmZvIGluZm87CisJd2hpbGUoYXBhLkdldE5leHRBcHAoaW5mbykgPT0gS0Vyck5vbmUpCisJCXsKKwkJaWYoaW5mby5pRnVsbE5hbWUuQ29tcGFyZUYobmFtZSkgPT0gMCkKKwkJCXsKKwkJCWlVaWQgPSBpbmZvLmlVaWQ7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCUNsZWFudXBTdGFjazo6UG9wQW5kRGVzdHJveSgpOworCX0KKwkKK1RGaWxlTmFtZSBDU0RMQXBwbGljYXRpb246OlJlc291cmNlRmlsZU5hbWUoKSBjb25zdAorCXsKKwlyZXR1cm4gS051bGxEZXNDKCk7CisJfQorCQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDRXhpdFdhaXQ6OkNFeGl0V2FpdChNRXhpdFdhaXQmIGFXYWl0KSA6IENBY3RpdmUoQ0FjdGl2ZTo6RVByaW9yaXR5U3RhbmRhcmQpLCBpV2FpdChhV2FpdCkKKwl7CisJQ0FjdGl2ZVNjaGVkdWxlcjo6QWRkKHRoaXMpOworCVNldEFjdGl2ZSgpOworCWlTdGF0dXNQdHIgPSAmaVN0YXR1czsKKwl9CisJCitDRXhpdFdhaXQ6On5DRXhpdFdhaXQoKQorCXsKKwlDYW5jZWwoKTsKKwl9CisgCit2b2lkIENFeGl0V2FpdDo6UnVuTCgpCisJeworCWlmKGlTdGF0dXNQdHIgIT0gTlVMTCApCisJCWlXYWl0LkRvRXhpdChpU3RhdHVzLkludCgpKTsKKwl9CisJCit2b2lkIENFeGl0V2FpdDo6RG9DYW5jZWwoKQorCXsKKwlpZihpU3RhdHVzUHRyICE9IE5VTEwgKQorCQlVc2VyOjpSZXF1ZXN0Q29tcGxldGUoaVN0YXR1c1B0ciAsIEtFcnJDYW5jZWwpOworCX0KKwkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDU0RMRG9jdW1lbnQ6OkNTRExEb2N1bWVudChDRWlrQXBwbGljYXRpb24mIGFBcHApIDogQ0Vpa0RvY3VtZW50KGFBcHApCisJe30KKyAgICAKK0NFaWtBcHBVaSogQ1NETERvY3VtZW50OjpDcmVhdGVBcHBVaUwoKQorCXsKKwlyZXR1cm4gbmV3IChFTGVhdmUpIENTRExBcHBVaTsKKwl9CisJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8JCisJCit2b2lkIENTRExXaW46OiBDb25zdHJ1Y3RMKGNvbnN0IFRSZWN0JiBhUmVjdCkJCisJeworCUNyZWF0ZVdpbmRvd0woKTsKKwlTZXRSZWN0KGFSZWN0KTsKKwlBY3RpdmF0ZUwoKTsKKwl9CisJCisJCitSV2luZG93JiBDU0RMV2luOjpHZXRXaW5kb3coKSBjb25zdAorCXsKKwlyZXR1cm4gV2luZG93KCk7CisJfQorCQorCit2b2lkIENTRExXaW46OkRyYXcoY29uc3QgVFJlY3QmIC8qYVJlY3QqLykgY29uc3QKKwl7CisJaWYoIWlOb0RyYXcpCisJCXsKKwkJQ1dpbmRvd0djJiBnYyA9IFN5c3RlbUdjKCk7CisJCWdjLlNldFBlblN0eWxlKENHcmFwaGljc0NvbnRleHQ6OkVTb2xpZFBlbik7CisJCWdjLlNldFBlbkNvbG9yKEtSZ2JHcmF5KTsKKwkJZ2MuU2V0QnJ1c2hTdHlsZShDR3JhcGhpY3NDb250ZXh0OjpFU29saWRCcnVzaCk7CisJCWdjLlNldEJydXNoQ29sb3IoMHhhYWFhYWEpOworCQlnYy5EcmF3UmVjdChSZWN0KCkpOworCQl9CisJfQkKKwkKK3ZvaWQgQ1NETFdpbjo6U2V0Tm9EcmF3KCkKKwl7CisJaU5vRHJhdyA9IEVUcnVlOworCX0KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwkJCQorCQorQ1NETEFwcFVpOjp+Q1NETEFwcFVpKCkKKwl7CisJaWYoaUlkbGUpCisJCWlJZGxlLT5DYW5jZWwoKTsKKwlkZWxldGUgaUlkbGU7CisJaWYoaVN0YXJ0ZXIgIT0gTlVMTCkKKwkJaVN0YXJ0ZXItPkNhbmNlbCgpOworCWRlbGV0ZSBpU3RhcnRlcjsKKwlkZWxldGUgaVdhaXQ7CisJZGVsZXRlIGlTZGw7CisJZGVsZXRlIGlTRExXaW47CisJZGVsZXRlIGlQYXJhbXM7CisJZGVsZXRlIGlDQm1wOworCWRlbGV0ZSBpQWxwaGE7CisJfQorCQorCQkKK3ZvaWQgQ1NETEFwcFVpOjpDb25zdHJ1Y3RMKCkKKyAJeworIAlCYXNlQ29uc3RydWN0TChFTm9BcHBSZXNvdXJjZUZpbGUgfCBFTm9TY3JlZW5GdXJuaXR1cmUpOworIAkKKyAJCisgCVJMaWJyYXJ5IGxpYjsKKyAJVXNlcjo6TGVhdmVJZkVycm9yKGxpYi5Mb2FkKF9MKCJzZGxleGUuZGxsIikpKTsKKyAJVEZpbGVOYW1lIG5hbWUgPSBsaWIuRmlsZU5hbWUoKTsKKyAJbGliLkNsb3NlKCk7CisgCW5hbWUuUmVwbGFjZSgzLCBuYW1lLkxlbmd0aCgpIC0gMywgX0woInJlc291cmNlXFxhcHBzXFxzZGxleGUucnNjIikpOworIAlCYWZsVXRpbHM6Ok5lYXJlc3RMYW5ndWFnZUZpbGUoaUVpa29uRW52LT5Gc1Nlc3Npb24oKSwgbmFtZSk7CisgCWlSZXNPZmZzZXQgPSBpQ29lRW52LT5BZGRSZXNvdXJjZUZpbGVMKG5hbWUpOworIAkKKyAJbmFtZS5SZXBsYWNlKG5hbWUuTGVuZ3RoKCkgLSAzLCAzLCBfTCgibWJtIikpOworCQorCVRFbnRyeSBlOworCWNvbnN0IFRJbnQgZXJyID0gaUVpa29uRW52LT5Gc1Nlc3Npb24oKS5FbnRyeShuYW1lLCBlKTsKKwkKKwlpQ0JtcCA9IGlFaWtvbkVudi0+Q3JlYXRlQml0bWFwTChuYW1lLCAwKTsKKwlpQWxwaGEgPSBpRWlrb25FbnYtPkNyZWF0ZUJpdG1hcEwobmFtZSwgMSk7CQorIAkKKyAJaUlkbGUgPSBDSWRsZTo6TmV3TChDQWN0aXZlOjpFUHJpb3JpdHlJZGxlKTsKKyAJCisgCWlTRExXaW4gPSBuZXcgKEVMZWF2ZSkgQ1NETFdpbjsKKyAJaVNETFdpbi0+Q29uc3RydWN0TChBcHBsaWNhdGlvblJlY3QoKSk7CisgCQorIAlpU2RsID0gQ1NETDo6TmV3TChnU0RMQ2xhc3MuU2RsRmxhZ3MoKSk7CisgCQorIAlnU0RMQ2xhc3MuU2VuZEV2ZW50KE1TRExNYWluT2JzOjpFU0RMQ3JlYXRlZCwgMCwgaVNkbCk7CisgCQorIAlpU2RsLT5TZXRPYnNlcnZlcih0aGlzKTsKKyAJaVNkbC0+RGlzYWJsZUtleUJsb2NraW5nKCp0aGlzKTsKKyAJaVNkbC0+U2V0Q29udGFpbmVyV2luZG93TCgKKyAJCQkJCWlTRExXaW4tPkdldFdpbmRvdygpLCAKKyAgICAgICAgCQkJaUVpa29uRW52LT5Xc1Nlc3Npb24oKSwKKyAgICAgICAgCQkJKmlFaWtvbkVudi0+U2NyZWVuRGV2aWNlKCkpOworICAgIGlTZGwtPkFwcGVuZE92ZXJsYXkoaUN1cnNvciwgMCk7CisgICAgCisgICAgaUN1cnNvci5TZXQoVFJlY3QoVFBvaW50KDAsIDApLCBpU0RMV2luLT5TaXplKCkpLCBpQ0JtcCwgaUFscGhhKTsKKyAgICAgICAgCQkJCisgICAgaVN0YXJ0ZXIgPSBDSWRsZTo6TmV3TChDQWN0aXZlOjpFUHJpb3JpdHlMb3cpOyAgIAorICAgIGlTdGFydGVyLT5TdGFydChUQ2FsbEJhY2soU3RhcnRMLCB0aGlzKSk7CisgICAgCisgICAgCisgCX0KKyAJCisKKworVEJvb2wgQ1NETEFwcFVpOjpTdGFydEwoVEFueSogYVRoaXMpCisJeworCXN0YXRpY19jYXN0PENTRExBcHBVaSo+KGFUaGlzKS0+U3RhcnRMKCk7CisJcmV0dXJuIEVGYWxzZTsKKwl9CisJCisJCit2b2lkIENTRExBcHBVaTo6UHJlcGFyZVRvRXhpdCgpCisJeworCUNBa25BcHBVaUJhc2U6OlByZXBhcmVUb0V4aXQoKTsgLy9ha25hcHB1OjpQcmVwYXJlVG9FeGl0IGNyYXNoZXMKKwlpQ29lRW52LT5EZWxldGVSZXNvdXJjZUZpbGUoaVJlc09mZnNldCk7CisJfQorCQorVEJvb2wgQ1NETEFwcFVpOjpQcm9jZXNzQ29tbWFuZFBhcmFtZXRlcnNMKENBcGFDb21tYW5kTGluZSAmYUNvbW1hbmRMaW5lKQorCXsKKwljb25zdCBUUHRyQzggY21kTGluZSA9IGFDb21tYW5kTGluZS5UYWlsRW5kKCk7CisJaVBhcmFtcyA9IG5ldyAoRUxlYXZlKSBDRGVzQzhBcnJheUZsYXQoOCk7CisJTWFrZUNDbWRMaW5lTChjbWRMaW5lLCAqaVBhcmFtcyk7CisJcmV0dXJuIEVGYWxzZTsKKwl9CisgCQorIAorIFRCb29sIENTRExBcHBVaTo6UGFyYW1FZGl0b3JMKFREZXMmIGFDaGVhdCkKKwl7CisJQ0FrblRleHRRdWVyeURpYWxvZyogcXVlcnkgPSBDQWtuVGV4dFF1ZXJ5RGlhbG9nOjpOZXdMKGFDaGVhdCk7CisJQ2xlYW51cFN0YWNrOjpQdXNoTChxdWVyeSk7CisJcXVlcnktPlNldFByb21wdEwoX0woIkVudGVyIHBhcmFtZXRlcnMiKSk7CisJQ2xlYW51cFN0YWNrOjpQb3AoKTsKKwlyZXR1cm4gcXVlcnktPkV4ZWN1dGVMRChSX1BBUkFNRURJVE9SKTsKKwl9CisgCQorIHZvaWQgQ1NETEFwcFVpOjpTdGFydEwoKQkKKyAJeyAJCQorIAlpZihnU0RMQ2xhc3MuQXBwRmxhZ3MoKSAmIFNETEVudjo6RVBhcmFtUXVlcnkpCisgCQl7CisgCQlUQnVmODwyNTY+IGNtZDsKKyAJCVJGaWxlIGZpbGU7CisgCQlUSW50IGVyciA9IGZpbGUuT3BlbihpRWlrb25FbnYtPkZzU2Vzc2lvbigpLCBfTCgic2RsX3BhcmFtLnR4dCIpLEVGaWxlUmVhZCk7CisgCQlpZihlcnIgPT0gS0Vyck5vbmUpCisgCQkJeworIAkJCWZpbGUuUmVhZChjbWQpOworIAkJCWZpbGUuQ2xvc2UoKTsJCisgCQkJTWFrZUNDbWRMaW5lTChjbWQsICppUGFyYW1zKTsKKyAJCQl9CisgCQlpZihlcnIgIT0gS0Vyck5vbmUgfHwgZ1NETENsYXNzLkFwcEZsYWdzKCkgJiAoU0RMRW52OjpFUGFyYW1RdWVyeURpYWxvZyBeIFNETEVudjo6RVBhcmFtUXVlcnkpKQorIAkJCXsKKyAJCQlUQnVmPDI1Nj4gYnVmZmVyOworIAkJCWlmKFBhcmFtRWRpdG9yTChidWZmZXIpKQorIAkJCQl7CisgCQkJCWNtZC5Db3B5KGJ1ZmZlcik7CisgCQkJCU1ha2VDQ21kTGluZUwoY21kLCAqaVBhcmFtcyk7CisgCQkJCX0JCisgCQkJfQorIAkJfQorIAlpV2FpdCA9IG5ldyAoRUxlYXZlKSBDRXhpdFdhaXQoKnRoaXMpOworIAlpU2RsLT5DYWxsTWFpbkwoZ1NETENsYXNzLk1haW4oKSwgJmlXYWl0LT5pU3RhdHVzLCBpUGFyYW1zLCBDU0RMOjpFTm9QYXJhbUZsYWdzLCAweEEwMDApOworIAl9CisgCQordm9pZCBDU0RMQXBwVWk6OkhhbmRsZUNvbW1hbmRMKFRJbnQgYUNvbW1hbmQpCisJeworCXN3aXRjaChhQ29tbWFuZCkKKwkJeworCQljYXNlIEVBa25Tb2Z0a2V5QmFjazoKKyAJCWNhc2UgRUFrblNvZnRrZXlFeGl0OgorCQljYXNlIEVBa25DbWRFeGl0OgorCQljYXNlIEVFaWtDbWRFeGl0OgorCQkJZ1NETENsYXNzLkFwcEZsYWdzKFNETEVudjo6RUFsbG93Q29uc29sZVZpZXcpOyAKKwkJICAgIGlmKGlXYWl0ID09IE5VTEwgfHwgIWlXYWl0LT5Jc0FjdGl2ZSgpIHx8IGlTZGwgPT0gTlVMTCkKKwkJICAgIAl7CisJCSAgICAJRXhpdCgpOworCQkgICAgCX0JCisJCQkgIGVsc2UgaWYoIWlFeGl0UmVxdWVzdCkKKwkJCSAgCXsKKwkJCSAgCWlFeGl0UmVxdWVzdCA9IEVUcnVlOyAvL3RyaWNrIGhvdyBTREwgY2FuIGJlIGNsb3NlZCEKKwkJCSAgCWlTZGwtPlN1c3BlbmQoKTsKKwkJCSAgCX0gCisJCQlicmVhazsKKwkJfQorCX0KKwkKKworCQorVEJvb2wgQ1NETEFwcFVpOjpIYW5kbGVLZXlMKGNvbnN0IFRXc0V2ZW50JiBhRXZlbnQpCisJeworCWNvbnN0IFRJbnQgdHlwZSA9IGFFdmVudC5UeXBlKCk7CisJaWYoISh0eXBlID09IEVFdmVudEtleSB8fCB0eXBlID09IEVFdmVudEtleVVwIHx8IHR5cGUgPT0gRUV2ZW50S2V5RG93bikpCisgCQkJeworIAkJCXJldHVybiBFVHJ1ZTsKKyAJCQl9CisgCWNvbnN0IFRLZXlFdmVudCYga2V5ID0gKmFFdmVudC5LZXkoKTsKKwlpZigoa2V5LmlTY2FuQ29kZSA9PSBFU3RkS2V5WWVzKSAmJiAoZ1NETENsYXNzLkFwcEZsYWdzKCkgJiBTRExFbnY6OkVWaXJ0dWFsTW91c2UpKQorIAkJeworIAkJaWYodHlwZSA9PSBFRXZlbnRLZXlVcCkKKyAJCQl7CisgCQkJaUN1cnNvci5Ub2dnbGUoKTsKKyAJCQlpU2RsLT5SZWRyYXdSZXF1ZXN0KCk7CQorIAkJCX0KKyAJCXJldHVybiBFRmFsc2U7CisJCX0KKwlpZihpQ3Vyc29yLklzT24oKSkKKwkJeworCQlzd2l0Y2goa2V5LmlTY2FuQ29kZSkKKwkJCXsKKwkJCWNhc2UgRVN0ZEtleVVwQXJyb3c6CisJCQkJaUN1cnNvci5Nb3ZlKDAsIC0xKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVN0ZEtleURvd25BcnJvdzoKKwkJCQlpQ3Vyc29yLk1vdmUoMCwgMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEVTdGRLZXlMZWZ0QXJyb3c6CisJCQkJaUN1cnNvci5Nb3ZlKC0xLCAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVN0ZEtleVJpZ2h0QXJyb3c6CisJCQkJaUN1cnNvci5Nb3ZlKDEsIDApOworCQkJCWJyZWFrOyAKKwkJCWNhc2UgRVN0ZEtleURldmljZTM6CisJCQkJaWYodHlwZSA9PSBFRXZlbnRLZXlVcCkKKwkJCQkJeworCQkJCQlUV3NFdmVudCBldmVudDsKKwkJCQkJaUN1cnNvci5NYWtlRXZlbnQoZXZlbnQsIGlTRExXaW4tPlBvc2l0aW9uKCkpOworCQkJCQlpU2RsLT5BcHBlbmRXc0V2ZW50KGV2ZW50KTsKKwkJCQkJfQorCQkJCXJldHVybiBFRmFsc2U7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBFVHJ1ZTsKKwkJCX0KKwkJaVNkbC0+UmVkcmF3UmVxdWVzdCgpOwkKKwkJcmV0dXJuIEVGYWxzZTsKKwkJfQorCXJldHVybiBFVHJ1ZTsKKwl9CisgCQkKKyB2b2lkIENTRExBcHBVaTo6SGFuZGxlV3NFdmVudEwoY29uc3QgVFdzRXZlbnQmIGFFdmVudCwgQ0NvZUNvbnRyb2wqIGFEZXN0aW5hdGlvbikKKyAJeworIAlpZihpU2RsICYmIGlXYWl0ICYmIEhhbmRsZUtleUwoYUV2ZW50KSkKKyAJCWlTZGwtPkFwcGVuZFdzRXZlbnQoYUV2ZW50KTsKKyAJQ0FrbkFwcFVpOjpIYW5kbGVXc0V2ZW50TChhRXZlbnQsIGFEZXN0aW5hdGlvbik7CisgCX0KKyAJCisgdm9pZCBDU0RMQXBwVWk6OkhhbmRsZVJlc291cmNlQ2hhbmdlTChUSW50IGFUeXBlKQorIAl7CisgICAgQ0FrbkFwcFVpOjpIYW5kbGVSZXNvdXJjZUNoYW5nZUwoYVR5cGUpOworICAgIGlmKGFUeXBlID09IEtFaWtEeW5hbWljTGF5b3V0VmFyaWFudFN3aXRjaCkKKyAgICAgICAgeyAgCQorICAgICAgICBpU0RMV2luLT5TZXRSZWN0KEFwcGxpY2F0aW9uUmVjdCgpKTsKKyAgICAgIAlpU2RsLT5TZXRDb250YWluZXJXaW5kb3dMKAorICAgICAgCQkJCWlTRExXaW4tPkdldFdpbmRvdygpLAorICAgICAgICAJCQlpRWlrb25FbnYtPldzU2Vzc2lvbigpLAorICAgICAgICAJCQkqaUVpa29uRW52LT5TY3JlZW5EZXZpY2UoKSk7CisgICAgICAgIH0KKyAJfQorIAkKKyAJCit2b2lkIENTRExBcHBVaTo6RG9FeGl0KFRJbnQvKkVyciovKQorICAgCXsKKyAgIAlpRXhpdFJlcXVlc3QgPSBFVHJ1ZTsKKyAgIAlFeGl0KCk7CisgICAJfQorCisgICAgCisgVEludCBDU0RMQXBwVWk6OlNkbFRocmVhZEV2ZW50KFRJbnQgYUV2ZW50LCBUSW50IC8qYVBhcmFtKi8pICAgIAorCXsKKwlzd2l0Y2goYUV2ZW50KQorCQl7CisJCWNhc2UgTVNETE9ic2VydmVyOjpFRXZlbnRSZXN1bWU6CisJCQlicmVhazsKKwkJY2FzZSBNU0RMT2JzZXJ2ZXI6OkVFdmVudFN1c3BlbmQ6CisJCQlpZihpRXhpdFJlcXVlc3QpCisJCQkJcmV0dXJuIE1TRExPYnNlcnZlcjo6RVN1c3BlbmROb1N1c3BlbmQ7CisJCQlicmVhazsKKwkJY2FzZSBNU0RMT2JzZXJ2ZXI6OkVFdmVudFdpbmRvd1Jlc2VydmVkOgorCQkJYnJlYWs7CisJCWNhc2UgTVNETE9ic2VydmVyOjpFRXZlbnRXaW5kb3dOb3RBdmFpbGFibGU6CisJCQlicmVhazsKKwkJY2FzZSBNU0RMT2JzZXJ2ZXI6OkVFdmVudFNjcmVlblNpemVDaGFuZ2VkOgorICAgICAgICAgICAgYnJlYWs7CisJCX0KKwlyZXR1cm4gTVNETE9ic2VydmVyOjpFUGFyYW1ldGVyTm9uZTsJCisJfQorCSAgICAKK1RJbnQgQ1NETEFwcFVpOjpTZGxFdmVudChUSW50IGFFdmVudCwgVEludCAvKmFQYXJhbSovKSAgICAKKwl7CisJc3dpdGNoKGFFdmVudCkKKwkJeworCQljYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50UmVzdW1lOgorCQkJYnJlYWs7CisJCWNhc2UgTVNETE9ic2VydmVyOjpFRXZlbnRTdXNwZW5kOgorCQkJaWYoaUV4aXRSZXF1ZXN0KQorCQkJCXJldHVybiBNU0RMT2JzZXJ2ZXI6OkVTdXNwZW5kTm9TdXNwZW5kOworCQkJYnJlYWs7CisJCWNhc2UgTVNETE9ic2VydmVyOjpFRXZlbnRXaW5kb3dSZXNlcnZlZDoKKwkJCWJyZWFrOworCQljYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50V2luZG93Tm90QXZhaWxhYmxlOgorCQkJeworCQkJVFJBUF9JR05PUkUoSGFuZGxlQ29uc29sZVdpbmRvd0woKSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBNU0RMT2JzZXJ2ZXI6OkVFdmVudFNjcmVlblNpemVDaGFuZ2VkOgorICAgICAJCWJyZWFrOworCQljYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50S2V5TWFwSW5pdDoKKwkJCWJyZWFrOworCQljYXNlIE1TRExPYnNlcnZlcjo6RUV2ZW50TWFpbkV4aXQ6CisJCQlpZihpU3RkT3V0ICE9IDApCisJCQkJeworCQkJCWdTRExDbGFzcy5BcHBGbGFncyhTRExFbnY6OkVBbGxvd0NvbnNvbGVWaWV3KTsgCisJCQkJaUVpa29uRW52LT5Xc1Nlc3Npb24oKS5TZXRXaW5kb3dHcm91cE9yZGluYWxQb3NpdGlvbihpU3RkT3V0LCAwKTsKKwkJCQl9CisJCQlicmVhazsKKwkJfQorCXJldHVybiBNU0RMT2JzZXJ2ZXI6OkVQYXJhbWV0ZXJOb25lOworCX0KKwkKK3ZvaWQgQ1NETEFwcFVpOjpIYW5kbGVGb3JlZ3JvdW5kRXZlbnRMKFRCb29sIGFGb3JlZ3JvdW5kKQorCXsKKwlDQWtuQXBwVWk6OkhhbmRsZUZvcmVncm91bmRFdmVudEwoYUZvcmVncm91bmQpOwkKKwlpZighYUZvcmVncm91bmQpCisJCUhhbmRsZUNvbnNvbGVXaW5kb3coKTsKKwl9CisJCit2b2lkIENTRExBcHBVaTo6SGFuZGxlQ29uc29sZVdpbmRvdygpCisJeworCWlmKCFpSWRsZS0+SXNBY3RpdmUoKSkKKwkJaUlkbGUtPlN0YXJ0KFRDYWxsQmFjayhJZGxlUmVxdWVzdEwsIHRoaXMpKTsKKwl9CisJCitUQm9vbCBDU0RMQXBwVWk6OklkbGVSZXF1ZXN0TChUQW55KiBhVGhpcykKKwl7CisJc3RhdGljX2Nhc3Q8Q1NETEFwcFVpKj4oYVRoaXMpLT5IYW5kbGVDb25zb2xlV2luZG93TCgpOworCXJldHVybiBFRmFsc2U7CisJfQorCit2b2lkIENTRExBcHBVaTo6SGFuZGxlQ29uc29sZVdpbmRvd0woKQorCXsKKwlpZihnU0RMQ2xhc3MuQXBwRmxhZ3MoKSAmIFNETEVudjo6RUFsbG93Q29uc29sZVZpZXcpCisJCXsKKwkJcmV0dXJuOworCQl9CisJUldzU2Vzc2lvbiYgc2VzID0gaUVpa29uRW52LT5Xc1Nlc3Npb24oKTsKKwljb25zdCBUSW50IGZvY3VzID0gc2VzLkdldEZvY3VzV2luZG93R3JvdXAoKTsKKwlDQXBhV2luZG93R3JvdXBOYW1lKiBuYW1lID0gQ0FwYVdpbmRvd0dyb3VwTmFtZTo6TmV3TEMoc2VzLCBmb2N1cyk7CisJY29uc3QgVFB0ckMgY2FwdGlvbiA9IG5hbWUtPkNhcHRpb24oKTsKKwlpZigwID09IGNhcHRpb24uQ29tcGFyZUYoX0woIlNURE9VVCIpKSkKKwkJeworCQlpU3RkT3V0ID0gZm9jdXM7CisJCXNlcy5TZXRXaW5kb3dHcm91cE9yZGluYWxQb3NpdGlvbihpRWlrb25FbnYtPlJvb3RXaW4oKS5JZGVudGlmaWVyKCksIDApOworCQl9CisJQ2xlYW51cFN0YWNrOjpQb3BBbmREZXN0cm95KCk7IC8vbmFtZQorCX0KKwkKKwkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK0NBcGFBcHBsaWNhdGlvbiogTmV3QXBwbGljYXRpb24oKQorICAgIHsKKyAgICByZXR1cm4gbmV3IENTRExBcHBsaWNhdGlvbigpOworICAgIH0KKworCQorRVhQT1JUX0MgVEludCBTRExFbnY6OlNldE1haW4oY29uc3QgVE1haW5GdW5jJiBhRnVuYywgVEludCBhU2RsRmxhZ3MsIE1TRExNYWluT2JzKiBhT2JzLCBUSW50IGFTZGxFeGVGbGFncykKKwl7CisJZ1NETENsYXNzLlNldE1haW4oYUZ1bmMsIGFTZGxGbGFncywgYU9icywgYVNkbEV4ZUZsYWdzKTsKKyAgCXJldHVybiBFaWtTdGFydDo6UnVuQXBwbGljYXRpb24oTmV3QXBwbGljYXRpb24pOworCX0JCisJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1RJbnQgU0RMVWlQcmludChjb25zdCBURGVzQzgmIC8qYUluZm8qLykKKyAgICB7CisgICAgcmV0dXJuIEtFcnJOb3RGb3VuZDsKKyAgICB9ICAgIAorCisKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL3N5bWJpYW4vRUtBMi9zZGxsaWIuY3BwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL3N5bWJpYW4vRUtBMi9zZGxsaWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDk5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vc3ltYmlhbi9FS0EyL3NkbGxpYi5jcHAKQEAgLTAsMCArMSwxMiBAQAorI2luY2x1ZGU8ZWlrc3RhcnQuaD4KKyNpbmNsdWRlPHNkbG1haW4uaD4KKyNpbmNsdWRlPHNkbGVwb2NhcGkuaD4KKworCitHTFJFRl9DIFRJbnQgRTMyTWFpbigpCisgICAgeworICAgIHJldHVybiBTRExFbnY6OlNldE1haW4oU0RMX21haW4sIENTREw6OkVFbmFibGVGb2N1c1N0b3AgfCBDU0RMOjpFQWxsb3dJbWFnZVJlc2l6ZSwKKyAgICAgTlVMTCwgU0RMRW52OjpFUGFyYW1RdWVyeSB8IFNETEVudjo6RVZpcnR1YWxNb3VzZSk7CisgICAgfQorICAgIAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9zeW1iaWFuL0VLQTIvdmVjdG9yYnVmZmVyLmNwcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9zeW1iaWFuL0VLQTIvdmVjdG9yYnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmMzYjNlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL3N5bWJpYW4vRUtBMi92ZWN0b3JidWZmZXIuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgICAgdmVjdG9yYnVmZmVyLmNwcAorICAgIHlldCBhbm90aGVyIGNpcmNsZSBidWZmZXIKKworICAgIE1hcmt1cyBNZXJ0YW1hCisqLworCisjaW5jbHVkZSJ2ZWN0b3JidWZmZXIuaCIKKworCisKK3ZvaWQgVmVjdG9yUGFuaWMoVEludCBhRXJyLCBUSW50IGFMaW5lKQorICAgIHsKKyAgICBUQnVmPDY0PiBiOworICAgIGIuRm9ybWF0KF9MKCJ2ZWN0b3IgYnVmZmVyIGF0ICUgZCAiKSwgYUxpbmUpOworICAgIFVzZXI6OlBhbmljKGIsIGFFcnIpOworICAgIH0KKwordm9pZCBUTm9kZUJ1ZmZlcjo6VE5vZGU6OlRlcm1pbmF0b3IoVE5vZGVCdWZmZXI6OlROb2RlKiBhTm9kZSkKKyAgICB7CisgICAgTWVtOjpDb3B5KGlTdWNjLCAmYU5vZGUsIHNpemVvZihUTm9kZSopKTsKKyAgICB9CisKK1RJbnQgVE5vZGVCdWZmZXI6OlROb2RlOjpTaXplKCkgY29uc3QKKyAgICB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFVpbnQ4Kj4oaVN1Y2MpIC0gUHRyKCk7CisgICAgfQorCitjb25zdCBUVWludDgqICBUTm9kZUJ1ZmZlcjo6VE5vZGU6OlB0cigpIGNvbnN0CisgICAgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFRVaW50OCo+KHRoaXMpICsgc2l6ZW9mKFROb2RlKTsKKyAgICB9CisKK1ROb2RlQnVmZmVyOjpUTm9kZSogIFROb2RlQnVmZmVyOjpUTm9kZTo6RW1wdHkoVFVpbnQ4KiBhQnVmZmVyKQorICAgIHsKKyAgICBUTm9kZSogbm9kZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VE5vZGUqPihhQnVmZmVyKTsKKyAgICBub2RlLT5pU3VjYyA9IG5vZGUgKyAxOworICAgIHJldHVybiBub2RlOworICAgIH0KKworIFROb2RlQnVmZmVyOjpUTm9kZSogIFROb2RlQnVmZmVyOjpUTm9kZTo6TmV3KFROb2RlKiBhUHJlZCwgY29uc3QgVERlc0M4JiBhRGF0YSkKKyAgICB7CisgICAgVE5vZGUqIG5vZGUgPSBhUHJlZC0+U2l6ZSgpID09IDAgPyBhUHJlZCA6IGFQcmVkLT5pU3VjYzsKKworICAgIAorICAgIFRVaW50OCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PFRVaW50OCo+KG5vZGUpICsgc2l6ZW9mKFROb2RlKTsKKyAgICBub2RlLT5pU3VjYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VE5vZGUqPihzdGFydCArIGFEYXRhLlNpemUoKSk7CisgICAgbm9kZS0+aVN1Y2MtPmlTdWNjID0gTlVMTDsgLy90ZXJtaW5hdG9yCisKKyAgICBfX0FTU0VSVF9ERUJVRyhub2RlLT5TaXplKCkgPT0gYURhdGEuU2l6ZSgpLCBWRUNQQU5JQyhLRXJyQ29ycnVwdCkpOworCisgICAgTWVtOjpDb3B5KHN0YXJ0LCBhRGF0YS5QdHIoKSwgYURhdGEuU2l6ZSgpKTsKKyAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgCisKKworCisKKworCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL3N5bWJpYW4vRUtBMi92ZWN0b3JidWZmZXIuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9zeW1iaWFuL0VLQTIvdmVjdG9yYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4YmU1OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi9zeW1iaWFuL0VLQTIvdmVjdG9yYnVmZmVyLmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgICAgdmVjdG9yYnVmZmVyLmNwcAorICAgIHlldCBhbm90aGVyIGNpcmNsZSBidWZmZXIKKworICAgIE1hcmt1cyBNZXJ0YW1hCisqLworCisjaWZuZGVmIF9fVkVDVE9SQlVGRkVSX0hfXworI2RlZmluZSBfX1ZFQ1RPUkJVRkZFUl9IX18KKworI2luY2x1ZGU8ZTMyc3RkLmg+CisjZGVmaW5lIFZMT0coeCkKKyNkZWZpbmUgVkVDUEFOSUMoeCkgVmVjdG9yUGFuaWMoeCwgX19MSU5FX18pCit2b2lkIFZlY3RvclBhbmljKFRJbnQsIFRJbnQpOworCisKKy8vaW50IERFQlVHX0lOVDsKKworTk9OU0hBUkFCTEVfQ0xBU1MoVE5vZGVCdWZmZXIpCisgICAgeworICAgIHB1YmxpYzoKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIE5PTlNIQVJBQkxFX0NMQVNTKFROb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVibGljOgorICAgICAgICAgICAgICAgIHN0YXRpYyAgVE5vZGUqIEVtcHR5KFRVaW50OCogaUJ1ZmZlcik7CisgICAgICAgICAgICAgICAgc3RhdGljICBUTm9kZSogTmV3KFROb2RlKiBhUHJldiwgIGNvbnN0IFREZXNDOCYgYURhdGEpOworICAgICAgICAgICAgICAgIGNvbnN0IFRVaW50OCogUHRyKCkgY29uc3Q7CisgICAgICAgICAgICAgICAgVEludCBTaXplKCkgY29uc3Q7CisgICAgICAgICAgICAgICAgaW5saW5lIFROb2RlKiBTdWNjKCk7CisgICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgU2V0U3VjYyhUTm9kZSomIGFOb2RlKTsKKyAgICAgICAgICAgICAgICB2b2lkIFRlcm1pbmF0b3IoVE5vZGUqIGFOb2RlKTsKKyAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgVE5vZGUqIGlTdWNjOworICAgICAgICAgICAgfTsKKyAgICB9OworCitpbmxpbmUgVE5vZGVCdWZmZXI6OlROb2RlKiBUTm9kZUJ1ZmZlcjo6VE5vZGU6OlN1Y2MoKQorICAgIHsKKyAgICByZXR1cm4gaVN1Y2M7CisgICAgfQorCit0ZW1wbGF0ZSA8VEludCBDPgorTk9OU0hBUkFCTEVfQ0xBU1MoVFZlY3RvckJ1ZmZlcikgOiBwdWJsaWMgVE5vZGVCdWZmZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBUVmVjdG9yQnVmZmVyKCk7CisgICAgICAgIFRJbnQgQXBwZW5kKGNvbnN0IFREZXNDOCYgYURhdGEpOworICAgICAvLyAgIFRJbnQgQXBwZW5kT3ZlcndyaXRlKGNvbnN0IFREZXNDOCYgYURhdGEpOworICAgICAgICBUUHRyQzggU2hpZnQoKTsKKyAgICAgICAgVFB0ckM4IG9wZXJhdG9yW10oVEludCBhSW5kZXgpIGNvbnN0OworICAgICAgICBUSW50IFNpemUoKSBjb25zdDsKKyAgICBwcml2YXRlOgorICAgICAgICBUSW50IEdldFJvb20oVEludCBhU2l6ZSkgY29uc3Q7CisgICAgICAgIFRJbnQgVW5yZXNlcnZlZCgpIGNvbnN0OworICAgIHByaXZhdGU6CisgICAgICAgIFROb2RlKiBpVG9wOworICAgICAgICBUTm9kZSogaUJvdHRvbTsKKyAgICAgICAgVEludCBpU2l6ZTsKKyAgICAgICAgVFVpbnQ4IGlCdWZmZXJbQ107CisgICAgfTsKKwordGVtcGxhdGUgPFRJbnQgQz4KK1RWZWN0b3JCdWZmZXI8Qz46OlRWZWN0b3JCdWZmZXIoKSA6IGlTaXplKDApCisgICAgeworICAgIE1lbTo6RmlsbFooaUJ1ZmZlciwgQyk7CisgICAgaVRvcCA9IFROb2RlOjpFbXB0eShpQnVmZmVyKTsgLy90aGVzZSBwb2ludHMgdG8gYnVmZmVyCisgICAgaUJvdHRvbSA9IFROb2RlOjpFbXB0eShpQnVmZmVyKTsKKyAgICB9CisKK3RlbXBsYXRlPFRJbnQgQyA+CitUSW50IFRWZWN0b3JCdWZmZXI8Qz46OlVucmVzZXJ2ZWQoKSBjb25zdAorICAgIHsKKyAgICBfX0FTU0VSVF9ERUJVRyhpQm90dG9tIDwgaUJvdHRvbS0+U3VjYygpLCBWRUNQQU5JQyhLRXJyQ29ycnVwdCkpOworICAgIGNvbnN0IFRJbnQgYnl0ZXNiZXR3ZWVuID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUVWludDgqPihpQm90dG9tLT5TdWNjKCkpIC0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUVWludDgqPihpVG9wKTsKKyAgICBjb25zdCBUSW50IHRvcHNpemUgPSBzaXplb2YoVE5vZGUpOworICAgIGlmKGJ5dGVzYmV0d2VlbiA+IDApICAgICAgICAgICAgLy9ieXRlc2JldHdlZW4gaXMgcm9vbSBiZXR3ZWVuIGJvdHRvbSBhbmQgdG9wIAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGVyZWZvcmUgZnJlZSByb29tIGlzIHN1YnJhY3RlZCBmcm9tIGZyZWUgc3BhY2UgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjb25zdCBUSW50IHJvb20gPSBDIC0gYnl0ZXNiZXR3ZWVuIC0gdG9wc2l6ZTsgCisgICAgICAgIHJldHVybiByb29tOworICAgICAgICB9CisgICAgaWYoYnl0ZXNiZXR3ZWVuID09IDApICAgICAgICAgICAKKyAgICAgICAgeworICAgICAgICAKKyAgICAgICAgaWYoU2l6ZSgpID4gMCkgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBDIC0gdG9wc2l6ZTsKKyAgICAgICAgfQorICAgIGNvbnN0IFRJbnQgcm9vbSA9IC1ieXRlc2JldHdlZW4gLSB0b3BzaXplOyAvL2ZyZWUgaXMgc3BhY2UgYmV0d2VlbiBwb2ludGVycworICAgIHJldHVybiByb29tOyAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKwordGVtcGxhdGUgPFRJbnQgQz4KK1RJbnQgVFZlY3RvckJ1ZmZlcjxDPjo6R2V0Um9vbShUSW50IGFTaXplKSBjb25zdAorICAgIHsKKyAgICBjb25zdCBUSW50IGJ5dGVzbmV3ID0gc2l6ZW9mKFROb2RlKSArIGFTaXplOworICAgIGNvbnN0IFRJbnQgcm9vbSA9IFVucmVzZXJ2ZWQoKSAtIGJ5dGVzbmV3OworICAgIHJldHVybiByb29tOworICAgIH0KKwordGVtcGxhdGUgPFRJbnQgQz4KK1RJbnQgVFZlY3RvckJ1ZmZlcjxDPjo6QXBwZW5kKGNvbnN0IFREZXNDOCYgYURhdGEpIC8vZWkgb2xlIG9rIQorICAgIHsKKyAgICBjb25zdCBUSW50IGxlbiA9IGFEYXRhLkxlbmd0aCgpOworICAgIGlmKEdldFJvb20obGVuKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgcmV0dXJuIEtFcnJPdmVyZmxvdzsKKyAgICAgICAgfQorICAgIGlmKGlCb3R0b20tPlN1Y2MoKS0+UHRyKCkgLSBpQnVmZmVyID4gKEMgLSAobGVuICsgVEludChzaXplb2YoVE5vZGUpKSkpKQorICAgICAgICB7CisgICAgICAgIFZMT0coInJjIik7CisgICAgICAgLy8gUkRlYnVnOjpQcmludChfTCgidmVjdG9yOiBhcHBlbmQiKSk7CisgICAgICAgIFROb2RlKiBwID0gVE5vZGU6OkVtcHR5KGlCdWZmZXIpOworICAgICAgICBpQm90dG9tLT5UZXJtaW5hdG9yKHApOworICAgICAgCWlCb3R0b20gPSBwOworICAgICAgCXJldHVybiBBcHBlbmQoYURhdGEpOworICAgICAvLwlBcHBlbmQoKTsKKyAgICAgLy8JaUJvdHRvbSA9IFROb2RlOjpOZXcocCwgYURhdGEpOyAvL2p1c3QgYXBwZW5kIHNvbWV0aGluZyBpbnRvIGVuZAorICAgICAgICB9IAorICAgIAorICAgIC8vREVCVUdfSU5UKys7CisgICAgICAgICAKKyAgICBpQm90dG9tID0gVE5vZGU6Ok5ldyhpQm90dG9tLCBhRGF0YSk7CisKKyAgICBpU2l6ZSArPSBsZW47CisgICAgcmV0dXJuIEtFcnJOb25lOworICAgIH0KKworLyoKK3RlbXBsYXRlIDxUSW50IEM+CitUSW50IFRWZWN0b3JCdWZmZXI8Qz46OkFwcGVuZE92ZXJ3cml0ZShjb25zdCBURGVzQzgmIGFEYXRhKSAvL2VpIG9sZSBvayEKKyAgICB7CisgICAgd2hpbGUoQXBwZW5kKGFEYXRhKSA9PSBLRXJyT3ZlcmZsb3cpCisgICAgICAgIHsKKyAgICAgICAgaWYoaVRvcC0+U3VjYygpID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gS0VyclVuZGVyZmxvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgLy9TaGlmdCgpOyAvL2RhdGEgaXMgbG9zdAorICAgICAgICB9CisgICAgcmV0dXJuIEtFcnJOb25lOworICAgIH0KKyovCit0ZW1wbGF0ZSA8VEludCBDPgorVFB0ckM4IFRWZWN0b3JCdWZmZXI8Qz46OlNoaWZ0KCkKKyAgICB7CisgICAgX19BU1NFUlRfQUxXQVlTKGlUb3AtPlN1Y2MoKSAhPSBOVUxMLCBWRUNQQU5JQyhLRXJyVW5kZXJmbG93KSk7IC8vY2FuIG5ldmVyIHBhc3MtYnkgYm90dG9tCisgICAgVE5vZGUqIG5vZGUgPSBpVG9wOworICAgIGlUb3AgPSBpVG9wLT5TdWNjKCk7CisgICAgaWYoaVRvcCA+IG5vZGUpCisgICAgICAgIHsKKyAgICAgIC8vICBERUJVR19JTlQtLTsKKyAgICAgICAgaVNpemUgLT0gbm9kZS0+U2l6ZSgpOworICAgICAgICByZXR1cm4gVFB0ckM4KG5vZGUtPlB0cigpLCBub2RlLT5TaXplKCkpOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICB7CisgICAgICAvLyAgUkRlYnVnOjpQcmludChfTCgidmVjdG9yOiBzaGlmdCIpKTsKKyAgICAgICAgcmV0dXJuIFNoaWZ0KCk7IC8vdGhpcyBoYXBwZW5zIHdoZW4gYnVmZmVyIGlzIHRlcm1pbmF0ZWQsIGFuZCBkYXRhIGxpZXMgaW4gbmV4dCAKKyAgICAgICAgfQorICAgIH0KKwordGVtcGxhdGUgPFRJbnQgQz4KK1RJbnQgVFZlY3RvckJ1ZmZlcjxDPjo6U2l6ZSgpIGNvbnN0CisgICAgeworICAgIHJldHVybiBpU2l6ZTsKKyAgICB9CisKK3RlbXBsYXRlIDxUSW50IEM+CitUUHRyQzggVFZlY3RvckJ1ZmZlcjxDPjo6b3BlcmF0b3JbXShUSW50IGFJbmRleCkgY29uc3QKKyAgICB7CisgICAgVEludCBpbmRleCA9IDA7CisgICAgVE5vZGUqIHQgPSBpVG9wLT5TaXplKCkgPiAwID8gaVRvcCA6IGlUb3AtPlN1Y2MoKTsgLy9lbGltaW5hdGUgdGVybWluYXRvcgorICAgIHdoaWxlKGluZGV4IDwgYUluZGV4KQorICAgICAgICB7CisgICAgICAgIFROb2RlKiBudCA9IHQtPlN1Y2MoKTsKKyAgICAgICAgaWYobnQgPCB0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgbnQgPSBudC0+U3VjYygpOworICAgICAgICAgICAgfQorICAgICAgICB0ID0gbnQ7CisgICAgICAgIGlmKHQtPlNpemUoKSA+IDApCisgICAgICAgIAlpbmRleCsrOworICAgICAgICBfX0FTU0VSVF9BTFdBWVModC0+U3VjYygpICE9IE5VTEwsIFZFQ1BBTklDKEtFcnJVbmRlcmZsb3cpKTsgLy9jYW4gbmV2ZXIgcGFzcy1ieSBib3R0b20KKyAgICAgICAgfQorICAgIHJldHVybiB0LT5QdHIoKTsKKyAgICB9CisKKwordGVtcGxhdGUgPGNsYXNzIFQsIFRJbnQgQz4KK05PTlNIQVJBQkxFX0NMQVNTKFRWZWN0b3IpIDogcHVibGljIFRWZWN0b3JCdWZmZXI8QyAqIHNpemVvZihUKT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBUVmVjdG9yKCk7CisgICAgICAgIFRJbnQgQXBwZW5kKGNvbnN0IFQmIGFEYXRhKTsKKyAgICAgICAgY29uc3QgVCYgU2hpZnQoKTsKKyAgICAgICAgVEludCBTaXplKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IFQmIG9wZXJhdG9yW10oVEludCBhSW5kZXgpIGNvbnN0OworICAgIH07CisKK3RlbXBsYXRlIDxjbGFzcyBULCBUSW50IEM+CitUVmVjdG9yPFQsIEM+OjpUVmVjdG9yKCkgOiBUVmVjdG9yQnVmZmVyPEMgKiBzaXplb2YoVCk+KCkKKyAgICB7CisgICAgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgVEludCBDPgorVEludCBUVmVjdG9yPFQsIEM+OjpBcHBlbmQoY29uc3QgVCYgYURhdGEpCisgICAgeworICAgIGNvbnN0IFRQY2tnQzxUPiBkYXRhKGFEYXRhKTsKKyAgICByZXR1cm4gVFZlY3RvckJ1ZmZlcjxDICogc2l6ZW9mKFQpPjo6QXBwZW5kKGRhdGEpOworICAgIH0KKwordGVtcGxhdGUgPGNsYXNzIFQsIFRJbnQgQz4KK2NvbnN0IFQmIFRWZWN0b3I8VCwgQz46OlNoaWZ0KCkKKyAgICB7CisgICAgY29uc3QgVFB0ckM4IHB0ciA9IFRWZWN0b3JCdWZmZXI8QyAqIHNpemVvZihUKT46OlNoaWZ0KCk7CisgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4ocHRyLlB0cigpKSk7CisgICAgfQorCisKK3RlbXBsYXRlIDxjbGFzcyBULCBUSW50IEM+CitUSW50IFRWZWN0b3I8VCwgQz46OlNpemUoKSBjb25zdAorICAgIHsKKyAgICByZXR1cm4gVFZlY3RvckJ1ZmZlcjxDICogc2l6ZW9mKFQpPjo6U2l6ZSgpIC8gc2l6ZW9mKFQpOworICAgIH0KKwordGVtcGxhdGUgPGNsYXNzIFQsIFRJbnQgQz4KK2NvbnN0IFQmIFRWZWN0b3I8VCwgQz46Om9wZXJhdG9yW10oVEludCBhSW5kZXgpIGNvbnN0CisgICAgeworICAgIGNvbnN0IFRQdHJDOCBwdHIgPSBUVmVjdG9yQnVmZmVyPEMgKiBzaXplb2YoVCk+OjpvcGVyYXRvcltdKGFJbmRleCk7CisgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4ocHRyLlB0cigpKSk7CisgICAgfQorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vd2luMzIvU0RMX3dpbjMyX21haW4uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvbWFpbi93aW4zMi9TRExfd2luMzJfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MmI0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vd2luMzIvU0RMX3dpbjMyX21haW4uYwpAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAgICBTRExfbWFpbi5jLCBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgU2FtIExhbnRpbmdhICA0LzEzLzk4CisKKyAgICBUaGUgV2luTWFpbiBmdW5jdGlvbiAtLSBjYWxscyB5b3VyIHByb2dyYW0ncyBtYWluKCkgZnVuY3Rpb24KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpZmRlZiBfV0lOMzJfV0NFCisjIGRlZmluZSBESVJfU0VQRVJBVE9SIFRFWFQoIlxcIikKKyMgdW5kZWYgX2dldGN3ZAorIyBkZWZpbmUgX2dldGN3ZChzdHIsbGVuKQl3Y3NjcHkoc3RyLFRFWFQoIiIpKQorIyBkZWZpbmUgc2V0YnVmKGYsYikKKyMgZGVmaW5lIHNldHZidWYodyx4LHkseikKKyMgZGVmaW5lIGZvcGVuCQlfd2ZvcGVuCisjIGRlZmluZSBmcmVvcGVuCV93ZnJlb3BlbgorIyBkZWZpbmUgcmVtb3ZlKHgpCURlbGV0ZUZpbGUoeCkKKyNlbHNlCisjIGRlZmluZSBESVJfU0VQRVJBVE9SIFRFWFQoIi8iKQorIyBpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbmRpZgorCisvKiBJbmNsdWRlIHRoZSBTREwgbWFpbiBkZWZpbml0aW9uIGhlYWRlciAqLworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9tYWluLmgiCisKKyNpZmRlZiBtYWluCisjIGlmbmRlZiBfV0lOMzJfV0NFX0VNVUxBVElPTgorIyAgdW5kZWYgbWFpbgorIyBlbmRpZiAvKiBfV0lOMzJfV0NFX0VNVUxBVElPTiAqLworI2VuZGlmIC8qIG1haW4gKi8KKworLyogVGhlIHN0YW5kYXJkIG91dHB1dCBmaWxlcyAqLworI2RlZmluZSBTVERPVVRfRklMRQlURVhUKCJzdGRvdXQudHh0IikKKyNkZWZpbmUgU1RERVJSX0ZJTEUJVEVYVCgic3RkZXJyLnR4dCIpCisKKy8qIFNldCBhIHZhcmlhYmxlIHRvIHRlbGwgaWYgdGhlIHN0ZGlvIHJlZGlyZWN0IGhhcyBiZWVuIGVuYWJsZWQuICovCitzdGF0aWMgaW50IHN0ZGlvUmVkaXJlY3RFbmFibGVkID0gMDsKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgc3RhdGljIHdjaGFyX3Qgc3Rkb3V0UGF0aFtNQVhfUEFUSF07CisgIHN0YXRpYyB3Y2hhcl90IHN0ZGVyclBhdGhbTUFYX1BBVEhdOworI2Vsc2UKKyAgc3RhdGljIGNoYXIgc3Rkb3V0UGF0aFtNQVhfUEFUSF07CisgIHN0YXRpYyBjaGFyIHN0ZGVyclBhdGhbTUFYX1BBVEhdOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIF9XSU4zMl9XQ0UgPCAzMDAKKy8qIHNlZW1zIHRvIGJlIHVuZGVmaW5lZCBpbiBXaW4gQ0UgYWx0aG91Z2ggaW4gb25saW5lIGhlbHAgKi8KKyNkZWZpbmUgaXNzcGFjZShhKSAoKChDSEFSKWEgPT0gJyAnKSB8fCAoKENIQVIpYSA9PSAnXHQnKSkKKyNlbmRpZiAvKiBfV0lOMzJfV0NFIDwgMzAwICovCisKK3N0YXRpYyB2b2lkIFVuRXNjYXBlUXVvdGVzKCBjaGFyICphcmcgKQoreworCWNoYXIgKmxhc3QgPSBOVUxMOworCisJd2hpbGUoICphcmcgKSB7CisJCWlmKCAqYXJnID09ICciJyAmJiAqbGFzdCA9PSAnXFwnICkgeworCQkJY2hhciAqY19jdXJyID0gYXJnOworCQkJY2hhciAqY19sYXN0ID0gbGFzdDsKKworCQkJd2hpbGUoICpjX2N1cnIgKSB7CisJCQkJKmNfbGFzdCA9ICpjX2N1cnI7CisJCQkJY19sYXN0ID0gY19jdXJyOworCQkJCWNfY3VycisrOworCQkJfQorCQkJKmNfbGFzdCA9ICdcMCc7CisJCX0KKwkJbGFzdCA9IGFyZzsKKwkJYXJnKys7CisJfQorfQorCisvKiBQYXJzZSBhIGNvbW1hbmQgbGluZSBidWZmZXIgaW50byBhcmd1bWVudHMgKi8KK3N0YXRpYyBpbnQgUGFyc2VDb21tYW5kTGluZShjaGFyICpjbWRsaW5lLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpidWZwOworCWNoYXIgKmxhc3RwID0gTlVMTDsKKwlpbnQgYXJnYywgbGFzdF9hcmdjOworCisJYXJnYyA9IGxhc3RfYXJnYyA9IDA7CisJZm9yICggYnVmcCA9IGNtZGxpbmU7ICpidWZwOyApIHsKKwkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKwkJd2hpbGUgKCBpc3NwYWNlKCpidWZwKSApIHsKKwkJCSsrYnVmcDsKKwkJfQorCQkvKiBTa2lwIG92ZXIgYXJndW1lbnQgKi8KKwkJaWYgKCAqYnVmcCA9PSAnIicgKSB7CisJCQkrK2J1ZnA7CisJCQlpZiAoICpidWZwICkgeworCQkJCWlmICggYXJndiApIHsKKwkJCQkJYXJndlthcmdjXSA9IGJ1ZnA7CisJCQkJfQorCQkJCSsrYXJnYzsKKwkJCX0KKwkJCS8qIFNraXAgb3ZlciB3b3JkICovCisJCQl3aGlsZSAoICpidWZwICYmICggKmJ1ZnAgIT0gJyInIHx8IChsYXN0cCAmJiAqbGFzdHAgPT0gJ1xcJykgKSApIHsKKwkJCQlsYXN0cCA9IGJ1ZnA7CisJCQkJKytidWZwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCAqYnVmcCApIHsKKwkJCQlpZiAoIGFyZ3YgKSB7CisJCQkJCWFyZ3ZbYXJnY10gPSBidWZwOworCQkJCX0KKwkJCQkrK2FyZ2M7CisJCQl9CisJCQkvKiBTa2lwIG92ZXIgd29yZCAqLworCQkJd2hpbGUgKCAqYnVmcCAmJiAhIGlzc3BhY2UoKmJ1ZnApICkgeworCQkJCSsrYnVmcDsKKwkJCX0KKwkJfQorCQlpZiAoICpidWZwICkgeworCQkJaWYgKCBhcmd2ICkgeworCQkJCSpidWZwID0gJ1wwJzsKKwkJCX0KKwkJCSsrYnVmcDsKKwkJfQorCisJCS8qIFN0cmlwIG91dCBcIGZyb20gXCIgc2VxdWVuY2VzICovCisJCWlmKCBhcmd2ICYmIGxhc3RfYXJnYyAhPSBhcmdjICkgeworCQkJVW5Fc2NhcGVRdW90ZXMoIGFyZ3ZbbGFzdF9hcmdjXSApOwkKKwkJfQorCQlsYXN0X2FyZ2MgPSBhcmdjOwkKKwl9CisJaWYgKCBhcmd2ICkgeworCQlhcmd2W2FyZ2NdID0gTlVMTDsKKwl9CisJcmV0dXJuKGFyZ2MpOworfQorCisvKiBTaG93IGFuIGVycm9yIG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIFNob3dFcnJvcihjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKy8qIElmIFVTRV9NRVNTQUdFQk9YIGlzIGRlZmluZWQsIHlvdSBuZWVkIHRvIGxpbmsgd2l0aCB1c2VyMzIubGliICovCisjaWZkZWYgVVNFX01FU1NBR0VCT1gKKwlNZXNzYWdlQm94KE5VTEwsIG1lc3NhZ2UsIHRpdGxlLCBNQl9JQ09ORVhDTEFNQVRJT058TUJfT0spOworI2Vsc2UKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgdGl0bGUsIG1lc3NhZ2UpOworI2VuZGlmCit9CisKKy8qIFBvcCB1cCBhbiBvdXQgb2YgbWVtb3J5IG1lc3NhZ2UsIHJldHVybnMgdG8gV2luZG93cyAqLworc3RhdGljIEJPT0wgT3V0T2ZNZW1vcnkodm9pZCkKK3sKKwlTaG93RXJyb3IoIkZhdGFsIEVycm9yIiwgIk91dCBvZiBtZW1vcnkgLSBhYm9ydGluZyIpOworCXJldHVybiBGQUxTRTsKK30KKworLyogU0RMX1F1aXQoKSBzaG91bGRuJ3QgYmUgdXNlZCB3aXRoIGF0ZXhpdCgpIGRpcmVjdGx5IGJlY2F1c2UKKyAgIGNhbGxpbmcgY29udmVudGlvbnMgbWF5IGRpZmZlci4uLiAqLworc3RhdGljIHZvaWQgY2xlYW51cCh2b2lkKQoreworCVNETF9RdWl0KCk7Cit9CisKKy8qIFJlbW92ZSB0aGUgb3V0cHV0IGZpbGVzIGlmIHRoZXJlIHdhcyBubyBvdXRwdXQgd3JpdHRlbiAqLworc3RhdGljIHZvaWQgY2xlYW51cF9vdXRwdXQodm9pZCkgeworCUZJTEUgKmZpbGU7CisJaW50IGVtcHR5OworCisJLyogRmx1c2ggdGhlIG91dHB1dCBpbiBjYXNlIGFueXRoaW5nIGlzIHF1ZXVlZCAqLworCWZjbG9zZShzdGRvdXQpOworCWZjbG9zZShzdGRlcnIpOworCisJLyogV2l0aG91dCByZWRpcmVjdGlvbiB3ZSdyZSBkb25lICovCisJaWYgKCFzdGRpb1JlZGlyZWN0RW5hYmxlZCkgeworCQlyZXR1cm47CisJfQorCisJLyogU2VlIGlmIHRoZSBmaWxlcyBoYXZlIGFueSBvdXRwdXQgaW4gdGhlbSAqLworCWlmICggc3Rkb3V0UGF0aFswXSApIHsKKwkJZmlsZSA9IGZvcGVuKHN0ZG91dFBhdGgsIFRFWFQoInJiIikpOworCQlpZiAoIGZpbGUgKSB7CisJCQllbXB0eSA9IChmZ2V0YyhmaWxlKSA9PSBFT0YpID8gMSA6IDA7CisJCQlmY2xvc2UoZmlsZSk7CisJCQlpZiAoIGVtcHR5ICkgeworCQkJCXJlbW92ZShzdGRvdXRQYXRoKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIHN0ZGVyclBhdGhbMF0gKSB7CisJCWZpbGUgPSBmb3BlbihzdGRlcnJQYXRoLCBURVhUKCJyYiIpKTsKKwkJaWYgKCBmaWxlICkgeworCQkJZW1wdHkgPSAoZmdldGMoZmlsZSkgPT0gRU9GKSA/IDEgOiAwOworCQkJZmNsb3NlKGZpbGUpOworCQkJaWYgKCBlbXB0eSApIHsKKwkJCQlyZW1vdmUoc3RkZXJyUGF0aCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIFJlZGlyZWN0IHRoZSBvdXRwdXQgKHN0ZG91dCBhbmQgc3RkZXJyKSB0byBhIGZpbGUgKi8KK3N0YXRpYyB2b2lkIHJlZGlyZWN0X291dHB1dCh2b2lkKQoreworCURXT1JEIHBhdGhsZW47CisjaWZkZWYgX1dJTjMyX1dDRQorCXdjaGFyX3QgcGF0aFtNQVhfUEFUSF07CisjZWxzZQorCWNoYXIgcGF0aFtNQVhfUEFUSF07CisjZW5kaWYKKwlGSUxFICpuZXdmcDsKKworCXBhdGhsZW4gPSBHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBwYXRoLCBTRExfYXJyYXlzaXplKHBhdGgpKTsKKwl3aGlsZSAoIHBhdGhsZW4gPiAwICYmIHBhdGhbcGF0aGxlbl0gIT0gJ1xcJyApIHsKKwkJLS1wYXRobGVuOworCX0KKwlwYXRoW3BhdGhsZW5dID0gJ1wwJzsKKworI2lmZGVmIF9XSU4zMl9XQ0UKKwl3Y3NuY3B5KCBzdGRvdXRQYXRoLCBwYXRoLCBTRExfYXJyYXlzaXplKHN0ZG91dFBhdGgpICk7CisJd2NzbmNhdCggc3Rkb3V0UGF0aCwgRElSX1NFUEVSQVRPUiBTVERPVVRfRklMRSwgU0RMX2FycmF5c2l6ZShzdGRvdXRQYXRoKSApOworI2Vsc2UKKwlTRExfc3RybGNweSggc3Rkb3V0UGF0aCwgcGF0aCwgU0RMX2FycmF5c2l6ZShzdGRvdXRQYXRoKSApOworCVNETF9zdHJsY2F0KCBzdGRvdXRQYXRoLCBESVJfU0VQRVJBVE9SIFNURE9VVF9GSUxFLCBTRExfYXJyYXlzaXplKHN0ZG91dFBhdGgpICk7CisjZW5kaWYKKyAgICAKKwkvKiBSZWRpcmVjdCBzdGFuZGFyZCBpbnB1dCBhbmQgc3RhbmRhcmQgb3V0cHV0ICovCisJbmV3ZnAgPSBmcmVvcGVuKHN0ZG91dFBhdGgsIFRFWFQoInciKSwgc3Rkb3V0KTsKKworI2lmbmRlZiBfV0lOMzJfV0NFCisJaWYgKCBuZXdmcCA9PSBOVUxMICkgewkvKiBUaGlzIGhhcHBlbnMgb24gTlQgKi8KKyNpZiAhZGVmaW5lZChzdGRvdXQpCisJCXN0ZG91dCA9IGZvcGVuKHN0ZG91dFBhdGgsIFRFWFQoInciKSk7CisjZWxzZQorCQluZXdmcCA9IGZvcGVuKHN0ZG91dFBhdGgsIFRFWFQoInciKSk7CisJCWlmICggbmV3ZnAgKSB7CisJCQkqc3Rkb3V0ID0gKm5ld2ZwOworCQl9CisjZW5kaWYKKwl9CisjZW5kaWYgLyogX1dJTjMyX1dDRSAqLworCisjaWZkZWYgX1dJTjMyX1dDRQorCXdjc25jcHkoIHN0ZGVyclBhdGgsIHBhdGgsIFNETF9hcnJheXNpemUoc3Rkb3V0UGF0aCkgKTsKKwl3Y3NuY2F0KCBzdGRlcnJQYXRoLCBESVJfU0VQRVJBVE9SIFNURE9VVF9GSUxFLCBTRExfYXJyYXlzaXplKHN0ZG91dFBhdGgpICk7CisjZWxzZQorCVNETF9zdHJsY3B5KCBzdGRlcnJQYXRoLCBwYXRoLCBTRExfYXJyYXlzaXplKHN0ZGVyclBhdGgpICk7CisJU0RMX3N0cmxjYXQoIHN0ZGVyclBhdGgsIERJUl9TRVBFUkFUT1IgU1RERVJSX0ZJTEUsIFNETF9hcnJheXNpemUoc3RkZXJyUGF0aCkgKTsKKyNlbmRpZgorCisJbmV3ZnAgPSBmcmVvcGVuKHN0ZGVyclBhdGgsIFRFWFQoInciKSwgc3RkZXJyKTsKKyNpZm5kZWYgX1dJTjMyX1dDRQorCWlmICggbmV3ZnAgPT0gTlVMTCApIHsJLyogVGhpcyBoYXBwZW5zIG9uIE5UICovCisjaWYgIWRlZmluZWQoc3RkZXJyKQorCQlzdGRlcnIgPSBmb3BlbihzdGRlcnJQYXRoLCBURVhUKCJ3IikpOworI2Vsc2UKKwkJbmV3ZnAgPSBmb3BlbihzdGRlcnJQYXRoLCBURVhUKCJ3IikpOworCQlpZiAoIG5ld2ZwICkgeworCQkJKnN0ZGVyciA9ICpuZXdmcDsKKwkJfQorI2VuZGlmCisJfQorI2VuZGlmIC8qIF9XSU4zMl9XQ0UgKi8KKworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9MQkYsIEJVRlNJWik7CS8qIExpbmUgYnVmZmVyZWQgKi8KKwlzZXRidWYoc3RkZXJyLCBOVUxMKTsJCQkvKiBObyBidWZmZXJpbmcgKi8KKwlzdGRpb1JlZGlyZWN0RW5hYmxlZCA9IDE7Cit9CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQorLyogVGhlIFZDKysgY29tcGlsZXIgbmVlZHMgbWFpbiBkZWZpbmVkICovCisjZGVmaW5lIGNvbnNvbGVfbWFpbiBtYWluCisjZW5kaWYKKworLyogVGhpcyBpcyB3aGVyZSBleGVjdXRpb24gYmVnaW5zIFtjb25zb2xlIGFwcHNdICovCitpbnQgY29uc29sZV9tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc2l6ZV90IG47CisJY2hhciAqYnVmcCwgKmFwcG5hbWU7CisJaW50IHN0YXR1czsKKworCS8qIEdldCB0aGUgY2xhc3MgbmFtZSBmcm9tIGFyZ3ZbMF0gKi8KKwlhcHBuYW1lID0gYXJndlswXTsKKwlpZiAoIChidWZwPVNETF9zdHJyY2hyKGFyZ3ZbMF0sICdcXCcpKSAhPSBOVUxMICkgeworCQlhcHBuYW1lID0gYnVmcCsxOworCX0gZWxzZQorCWlmICggKGJ1ZnA9U0RMX3N0cnJjaHIoYXJndlswXSwgJy8nKSkgIT0gTlVMTCApIHsKKwkJYXBwbmFtZSA9IGJ1ZnArMTsKKwl9CisKKwlpZiAoIChidWZwPVNETF9zdHJyY2hyKGFwcG5hbWUsICcuJykpID09IE5VTEwgKQorCQluID0gU0RMX3N0cmxlbihhcHBuYW1lKTsKKwllbHNlCisJCW4gPSAoYnVmcC1hcHBuYW1lKTsKKworCWJ1ZnAgPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbisxKTsKKwlpZiAoIGJ1ZnAgPT0gTlVMTCApIHsKKwkJcmV0dXJuIE91dE9mTWVtb3J5KCk7CisJfQorCVNETF9zdHJsY3B5KGJ1ZnAsIGFwcG5hbWUsIG4rMSk7CisJYXBwbmFtZSA9IGJ1ZnA7CisKKwkvKiBMb2FkIFNETCBkeW5hbWljIGxpbmsgbGlicmFyeSAqLworCWlmICggU0RMX0luaXQoU0RMX0lOSVRfTk9QQVJBQ0hVVEUpIDwgMCApIHsKKwkJU2hvd0Vycm9yKCJXaW5NYWluKCkgZXJyb3IiLCBTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybihGQUxTRSk7CisJfQorCWF0ZXhpdChjbGVhbnVwX291dHB1dCk7CisJYXRleGl0KGNsZWFudXApOworCisJLyogU2FtOgorCSAgIFdlIHN0aWxsIG5lZWQgdG8gcGFzcyBpbiB0aGUgYXBwbGljYXRpb24gaGFuZGxlIHNvIHRoYXQKKwkgICBEaXJlY3RJbnB1dCB3aWxsIGluaXRpYWxpemUgcHJvcGVybHkgd2hlbiBTRExfUmVnaXN0ZXJBcHAoKQorCSAgIGlzIGNhbGxlZCBsYXRlciBpbiB0aGUgdmlkZW8gaW5pdGlhbGl6YXRpb24uCisJICovCisJU0RMX1NldE1vZHVsZUhhbmRsZShHZXRNb2R1bGVIYW5kbGUoTlVMTCkpOworCisJLyogUnVuIHRoZSBhcHBsaWNhdGlvbiBtYWluKCkgY29kZSAqLworCXN0YXR1cyA9IFNETF9tYWluKGFyZ2MsIGFyZ3YpOworCisJLyogRXhpdCBjbGVhbmx5LCBjYWxsaW5nIGF0ZXhpdCgpIGZ1bmN0aW9ucyAqLworCWV4aXQoc3RhdHVzKTsKKworCS8qIEh1c2ggbGl0dGxlIGNvbXBpbGVyLCBkb24ndCB5b3UgY3J5Li4uICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMgd2hlcmUgZXhlY3V0aW9uIGJlZ2lucyBbd2luZG93ZWQgYXBwc10gKi8KKyNpZmRlZiBfV0lOMzJfV0NFCitpbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXYsIExQV1NUUiBzekNtZExpbmUsIGludCBzdykKKyNlbHNlCitpbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXYsIExQU1RSIHN6Q21kTGluZSwgaW50IHN3KQorI2VuZGlmCit7CisJSE1PRFVMRSBoYW5kbGU7CisJY2hhciAqKmFyZ3Y7CisJaW50IGFyZ2M7CisJY2hhciAqY21kbGluZTsKKwljaGFyICplbnZfc3RyOworI2lmZGVmIF9XSU4zMl9XQ0UKKwl3Y2hhcl90ICpidWZwOworCWludCBuTGVuOworI2Vsc2UKKwljaGFyICpidWZwOworCXNpemVfdCBuTGVuOworI2VuZGlmCisKKwkvKiBTdGFydCB1cCBEREhFTFAuRVhFIGJlZm9yZSBvcGVuaW5nIGFueSBmaWxlcywgc28gRERIRUxQIGRvZXNuJ3QKKwkgICBrZWVwIHRoZW0gb3Blbi4gIFRoaXMgaXMgYSBoYWNrLi4gaG9wZWZ1bGx5IGl0IHdpbGwgYmUgZml4ZWQgCisJICAgc29tZWRheS4gIERESEVMUC5FWEUgc3RhcnRzIHVwIHRoZSBmaXJzdCB0aW1lIEREUkFXLkRMTCBpcyBsb2FkZWQuCisJICovCisJaGFuZGxlID0gTG9hZExpYnJhcnkoVEVYVCgiRERSQVcuRExMIikpOworCWlmICggaGFuZGxlICE9IE5VTEwgKSB7CisJCUZyZWVMaWJyYXJ5KGhhbmRsZSk7CisJfQorCisJLyogQ2hlY2sgZm9yIHN0ZGlvIHJlZGlyZWN0IHNldHRpbmdzIGFuZCBkbyB0aGUgcmVkaXJlY3Rpb24gKi8KKwlpZiAoKGVudl9zdHIgPSBTRExfZ2V0ZW52KCJTRExfU1RESU9fUkVESVJFQ1QiKSkpIHsKKwkJaWYgKFNETF9hdG9pKGVudl9zdHIpKSB7CisJCQlyZWRpcmVjdF9vdXRwdXQoKTsKKwkJfQorCX0KKyNpZm5kZWYgTk9fU1RESU9fUkVESVJFQ1QKKwllbHNlIHsKKwkJcmVkaXJlY3Rfb3V0cHV0KCk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzJfV0NFCisJbkxlbiA9IHdjc2xlbihzekNtZExpbmUpKzEyOCsxOworCWJ1ZnAgPSBTRExfc3RhY2tfYWxsb2Mod2NoYXJfdCwgbkxlbioyKTsKKwl3Y3NjcHkgKGJ1ZnAsIFRFWFQoIlwiIikpOworCUdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIGJ1ZnArMSwgMTI4LTMpOworCXdjc2NweSAoYnVmcCt3Y3NsZW4oYnVmcCksIFRFWFQoIlwiICIpKTsKKwl3Y3NuY3B5KGJ1ZnArd2NzbGVuKGJ1ZnApLCBzekNtZExpbmUsbkxlbi13Y3NsZW4oYnVmcCkpOworCW5MZW4gPSB3Y3NsZW4oYnVmcCkrMTsKKwljbWRsaW5lID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIG5MZW4pOworCWlmICggY21kbGluZSA9PSBOVUxMICkgeworCQlyZXR1cm4gT3V0T2ZNZW1vcnkoKTsKKwl9CisJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIGJ1ZnAsIC0xLCBjbWRsaW5lLCBuTGVuLCBOVUxMLCBOVUxMKTsKKyNlbHNlCisJLyogR3JhYiB0aGUgY29tbWFuZCBsaW5lICovCisJYnVmcCA9IEdldENvbW1hbmRMaW5lKCk7CisJbkxlbiA9IFNETF9zdHJsZW4oYnVmcCkrMTsKKwljbWRsaW5lID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIG5MZW4pOworCWlmICggY21kbGluZSA9PSBOVUxMICkgeworCQlyZXR1cm4gT3V0T2ZNZW1vcnkoKTsKKwl9CisJU0RMX3N0cmxjcHkoY21kbGluZSwgYnVmcCwgbkxlbik7CisjZW5kaWYKKworCS8qIFBhcnNlIGl0IGludG8gYXJndiBhbmQgYXJnYyAqLworCWFyZ2MgPSBQYXJzZUNvbW1hbmRMaW5lKGNtZGxpbmUsIE5VTEwpOworCWFyZ3YgPSBTRExfc3RhY2tfYWxsb2MoY2hhciosIGFyZ2MrMSk7CisJaWYgKCBhcmd2ID09IE5VTEwgKSB7CisJCXJldHVybiBPdXRPZk1lbW9yeSgpOworCX0KKwlQYXJzZUNvbW1hbmRMaW5lKGNtZGxpbmUsIGFyZ3YpOworCisJLyogUnVuIHRoZSBtYWluIHByb2dyYW0gKGFmdGVyIGEgbGl0dGxlIFNETCBpbml0aWFsaXphdGlvbikgKi8KKwljb25zb2xlX21haW4oYXJnYywgYXJndik7CisKKwkvKiBIdXNoIGxpdHRsZSBjb21waWxlciwgZG9uJ3QgeW91IGNyeS4uLiAqLworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL3dpbjMyL3ZlcnNpb24ucmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL21haW4vd2luMzIvdmVyc2lvbi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZiNjQyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9tYWluL3dpbjMyL3ZlcnNpb24ucmMKQEAgLTAsMCArMSwzOCBAQAorCisjaW5jbHVkZSAid2lucmVzcmMuaCIKKworTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBWZXJzaW9uCisvLworCitWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KKyBGSUxFVkVSU0lPTiAxLDIsMTQsMAorIFBST0RVQ1RWRVJTSU9OIDEsMiwxNCwwCisgRklMRUZMQUdTTUFTSyAweDNmTAorIEZJTEVGTEFHUyAweDBMCisgRklMRU9TIDB4NDAwMDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJcMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiU0RMXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAiMSwgMiwgMTQsIDBcMCIKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAiU0RMXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IKkgMjAwOSBTYW0gTGFudGluZ2FcMCIKKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgIlNETC5kbGxcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXJcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxLCAyLCAxNCwgMFwwIgorICAgICAgICBFTkQKKyAgICBFTkQKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKKyAgICBFTkQKK0VORApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX2dldGVudi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX2dldGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWJhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3N0ZGxpYi9TRExfZ2V0ZW52LmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorCisjaWZuZGVmIEhBVkVfR0VURU5WCisKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkgJiYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvKiBOb3RlIHRoaXMgaXNuJ3QgdGhyZWFkLXNhZmUhICovCisKK3N0YXRpYyBjaGFyICpTRExfZW52bWVtID0gTlVMTDsJLyogVWdoLCBtZW1vcnkgbGVhayAqLworc3RhdGljIHNpemVfdCBTRExfZW52bWVtbGVuID0gMDsKKworLyogUHV0IGEgdmFyaWFibGUgb2YgdGhlIGZvcm0gIm5hbWU9dmFsdWUiIGludG8gdGhlIGVudmlyb25tZW50ICovCitpbnQgU0RMX3B1dGVudihjb25zdCBjaGFyICp2YXJpYWJsZSkKK3sKKwlzaXplX3QgYnVmZmVybGVuOworCWNoYXIgKnZhbHVlOworCWNvbnN0IGNoYXIgKnNlcDsKKworCXNlcCA9IFNETF9zdHJjaHIodmFyaWFibGUsICc9Jyk7CisJaWYgKCBzZXAgPT0gTlVMTCApIHsKKwkJcmV0dXJuIC0xOworCX0KKwlidWZmZXJsZW4gPSBTRExfc3RybGVuKHZhcmlhYmxlKSsxOworCWlmICggYnVmZmVybGVuID4gU0RMX2Vudm1lbWxlbiApIHsKKwkJY2hhciAqbmV3bWVtID0gKGNoYXIgKilTRExfcmVhbGxvYyhTRExfZW52bWVtLCBidWZmZXJsZW4pOworCQlpZiAoIG5ld21lbSA9PSBOVUxMICkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCVNETF9lbnZtZW0gPSBuZXdtZW07CisJCVNETF9lbnZtZW1sZW4gPSBidWZmZXJsZW47CisJfQorCVNETF9zdHJsY3B5KFNETF9lbnZtZW0sIHZhcmlhYmxlLCBidWZmZXJsZW4pOworCXZhbHVlID0gU0RMX2Vudm1lbSArIChzZXAgLSB2YXJpYWJsZSk7CisJKnZhbHVlKysgPSAnXDAnOworCWlmICggIVNldEVudmlyb25tZW50VmFyaWFibGUoU0RMX2Vudm1lbSwgKnZhbHVlID8gdmFsdWUgOiBOVUxMKSApIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmV0cmlldmUgYSB2YXJpYWJsZSBuYW1lZCAibmFtZSIgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KK2NoYXIgKlNETF9nZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzaXplX3QgYnVmZmVybGVuOworCisJYnVmZmVybGVuID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZShuYW1lLCBTRExfZW52bWVtLCAoRFdPUkQpU0RMX2Vudm1lbWxlbik7CisJaWYgKCBidWZmZXJsZW4gPT0gMCApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICggYnVmZmVybGVuID4gU0RMX2Vudm1lbWxlbiApIHsKKwkJY2hhciAqbmV3bWVtID0gKGNoYXIgKilTRExfcmVhbGxvYyhTRExfZW52bWVtLCBidWZmZXJsZW4pOworCQlpZiAoIG5ld21lbSA9PSBOVUxMICkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJU0RMX2Vudm1lbSA9IG5ld21lbTsKKwkJU0RMX2Vudm1lbWxlbiA9IGJ1ZmZlcmxlbjsKKwkJR2V0RW52aXJvbm1lbnRWYXJpYWJsZShuYW1lLCBTRExfZW52bWVtLCAoRFdPUkQpU0RMX2Vudm1lbWxlbik7CisJfQorCXJldHVybiBTRExfZW52bWVtOworfQorCisjZWxzZSAvKiByb2xsIG91ciBvd24gKi8KKworc3RhdGljIGNoYXIgKipTRExfZW52ID0gKGNoYXIgKiopMDsKKworLyogUHV0IGEgdmFyaWFibGUgb2YgdGhlIGZvcm0gIm5hbWU9dmFsdWUiIGludG8gdGhlIGVudmlyb25tZW50ICovCitpbnQgU0RMX3B1dGVudihjb25zdCBjaGFyICp2YXJpYWJsZSkKK3sKKwljb25zdCBjaGFyICpuYW1lLCAqdmFsdWU7CisJaW50IGFkZGVkOworCWludCBsZW4sIGk7CisJY2hhciAqKm5ld19lbnY7CisJY2hhciAqbmV3X3ZhcmlhYmxlOworCisJLyogQSBsaXR0bGUgZXJyb3IgY2hlY2tpbmcgKi8KKwlpZiAoICEgdmFyaWFibGUgKSB7CisJCXJldHVybigtMSk7CisJfQorCW5hbWUgPSB2YXJpYWJsZTsKKwlmb3IgKCB2YWx1ZT12YXJpYWJsZTsgKnZhbHVlICYmICgqdmFsdWUgIT0gJz0nKTsgKyt2YWx1ZSApIHsKKwkJLyogS2VlcCBsb29raW5nIGZvciAnPScgKi8gOworCX0KKwlpZiAoICp2YWx1ZSApIHsKKwkJKyt2YWx1ZTsKKwl9IGVsc2UgeworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHZhcmlhYmxlICovCisJbmV3X3ZhcmlhYmxlID0gU0RMX3N0cmR1cCh2YXJpYWJsZSk7CisJaWYgKCAhIG5ld192YXJpYWJsZSApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBBY3R1YWxseSBwdXQgaXQgaW50byB0aGUgZW52aXJvbm1lbnQgKi8KKwlhZGRlZCA9IDA7CisJaSA9IDA7CisJaWYgKCBTRExfZW52ICkgeworCQkvKiBDaGVjayB0byBzZWUgaWYgaXQncyBhbHJlYWR5IHRoZXJlLi4uICovCisJCWxlbiA9ICh2YWx1ZSAtIG5hbWUpOworCQlmb3IgKCA7IFNETF9lbnZbaV07ICsraSApIHsKKwkJCWlmICggU0RMX3N0cm5jbXAoU0RMX2VudltpXSwgbmFtZSwgbGVuKSA9PSAwICkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIElmIHdlIGZvdW5kIGl0LCBqdXN0IHJlcGxhY2UgdGhlIGVudHJ5ICovCisJCWlmICggU0RMX2VudltpXSApIHsKKwkJCVNETF9mcmVlKFNETF9lbnZbaV0pOworCQkJU0RMX2VudltpXSA9IG5ld192YXJpYWJsZTsKKwkJCWFkZGVkID0gMTsKKwkJfQorCX0KKworCS8qIERpZG4ndCBmaW5kIGl0IGluIHRoZSBlbnZpcm9ubWVudCwgZXhwYW5kIGFuZCBhZGQgKi8KKwlpZiAoICEgYWRkZWQgKSB7CisJCW5ld19lbnYgPSBTRExfcmVhbGxvYyhTRExfZW52LCAoaSsyKSpzaXplb2YoY2hhciAqKSk7CisJCWlmICggbmV3X2VudiApIHsKKwkJCVNETF9lbnYgPSBuZXdfZW52OworCQkJU0RMX2VudltpKytdID0gbmV3X3ZhcmlhYmxlOworCQkJU0RMX2VudltpKytdID0gKGNoYXIgKikwOworCQkJYWRkZWQgPSAxOworCQl9IGVsc2UgeworCQkJU0RMX2ZyZWUobmV3X3ZhcmlhYmxlKTsKKwkJfQorCX0KKwlyZXR1cm4gKGFkZGVkID8gMCA6IC0xKTsKK30KKworLyogUmV0cmlldmUgYSB2YXJpYWJsZSBuYW1lZCAibmFtZSIgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KK2NoYXIgKlNETF9nZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgbGVuLCBpOworCWNoYXIgKnZhbHVlOworCisJdmFsdWUgPSAoY2hhciAqKTA7CisJaWYgKCBTRExfZW52ICkgeworCQlsZW4gPSBTRExfc3RybGVuKG5hbWUpOworCQlmb3IgKCBpPTA7IFNETF9lbnZbaV0gJiYgIXZhbHVlOyArK2kgKSB7CisJCQlpZiAoIChTRExfc3RybmNtcChTRExfZW52W2ldLCBuYW1lLCBsZW4pID09IDApICYmCisJCQkgICAgIChTRExfZW52W2ldW2xlbl0gPT0gJz0nKSApIHsKKwkJCQl2YWx1ZSA9ICZTRExfZW52W2ldW2xlbisxXTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBfX1dJTjMyX18gKi8KKworI2VuZGlmIC8qICFIQVZFX0dFVEVOViAqLworCisjaWZkZWYgVEVTVF9NQUlOCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICp2YWx1ZTsKKworCXByaW50ZigiQ2hlY2tpbmcgZm9yIG5vbi1leGlzdGVudCB2YXJpYWJsZS4uLiAiKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoICEgU0RMX2dldGVudigiRVhJU1RTIikgKSB7CisJCXByaW50Zigib2theVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJmYWlsZWRcbiIpOworCX0KKwlwcmludGYoIlNldHRpbmcgRklSU1Q9VkFMVUUxIGluIHRoZSBlbnZpcm9ubWVudC4uLiAiKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoIFNETF9wdXRlbnYoIkZJUlNUPVZBTFVFMSIpID09IDAgKSB7CisJCXByaW50Zigib2theVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJmYWlsZWRcbiIpOworCX0KKwlwcmludGYoIkdldHRpbmcgRklSU1QgZnJvbSB0aGUgZW52aXJvbm1lbnQuLi4gIik7CisJZmZsdXNoKHN0ZG91dCk7CisJdmFsdWUgPSBTRExfZ2V0ZW52KCJGSVJTVCIpOworCWlmICggdmFsdWUgJiYgKFNETF9zdHJjbXAodmFsdWUsICJWQUxVRTEiKSA9PSAwKSApIHsKKwkJcHJpbnRmKCJva2F5XG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoImZhaWxlZFxuIik7CisJfQorCXByaW50ZigiU2V0dGluZyBTRUNPTkQ9VkFMVUUyIGluIHRoZSBlbnZpcm9ubWVudC4uLiAiKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoIFNETF9wdXRlbnYoIlNFQ09ORD1WQUxVRTIiKSA9PSAwICkgeworCQlwcmludGYoIm9rYXlcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiZmFpbGVkXG4iKTsKKwl9CisJcHJpbnRmKCJHZXR0aW5nIFNFQ09ORCBmcm9tIHRoZSBlbnZpcm9ubWVudC4uLiAiKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwl2YWx1ZSA9IFNETF9nZXRlbnYoIlNFQ09ORCIpOworCWlmICggdmFsdWUgJiYgKFNETF9zdHJjbXAodmFsdWUsICJWQUxVRTIiKSA9PSAwKSApIHsKKwkJcHJpbnRmKCJva2F5XG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoImZhaWxlZFxuIik7CisJfQorCXByaW50ZigiU2V0dGluZyBGSVJTVD1OT1ZBTFVFIGluIHRoZSBlbnZpcm9ubWVudC4uLiAiKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoIFNETF9wdXRlbnYoIkZJUlNUPU5PVkFMVUUiKSA9PSAwICkgeworCQlwcmludGYoIm9rYXlcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiZmFpbGVkXG4iKTsKKwl9CisJcHJpbnRmKCJHZXR0aW5nIEZJUlNUIGZyb20gdGhlIGVudmlyb25tZW50Li4uICIpOworCWZmbHVzaChzdGRvdXQpOworCXZhbHVlID0gU0RMX2dldGVudigiRklSU1QiKTsKKwlpZiAoIHZhbHVlICYmIChTRExfc3RyY21wKHZhbHVlLCAiTk9WQUxVRSIpID09IDApICkgeworCQlwcmludGYoIm9rYXlcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiZmFpbGVkXG4iKTsKKwl9CisJcHJpbnRmKCJDaGVja2luZyBmb3Igbm9uLWV4aXN0ZW50IHZhcmlhYmxlLi4uICIpOworCWZmbHVzaChzdGRvdXQpOworCWlmICggISBTRExfZ2V0ZW52KCJFWElTVFMiKSApIHsKKwkJcHJpbnRmKCJva2F5XG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoImZhaWxlZFxuIik7CisJfQorCXJldHVybigwKTsKK30KKyNlbmRpZiAvKiBURVNUX01BSU4gKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX2ljb252LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3N0ZGxpYi9TRExfaWNvbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTU2YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX2ljb252LmMKQEAgLTAsMCArMSw4ODEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaGlzIGZpbGUgY29udGFpbnMgcG9ydGFibGUgaWNvbnYgZnVuY3Rpb25zIGZvciBTREwgKi8KKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKyNpbmNsdWRlICJTRExfZW5kaWFuLmgiCisKKyNpZmRlZiBIQVZFX0lDT05WCisKKy8qIERlcGVuZGluZyBvbiB3aGljaCBzdGFuZGFyZCB0aGUgaWNvbnYoKSB3YXMgaW1wbGVtZW50ZWQgd2l0aCwKKyAgIGljb252KCkgbWF5IG9yIG1heSBub3QgdXNlIGNvbnN0IGNoYXIgKiogZm9yIHRoZSBpbmJ1ZiBwYXJhbS4KKyAgIElmIHdlIGdldCB0aGlzIHdyb25nLCBpdCdzIGp1c3QgYSB3YXJuaW5nLCBzbyBubyBiaWcgZGVhbC4KKyovCisjaWYgZGVmaW5lZChfWEdQNikgfHwgXAorICAgIGRlZmluZWQoX19HTElCQ19fKSAmJiAoKF9fR0xJQkNfXyA+IDIpIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMikpCisjZGVmaW5lIElDT05WX0lOQlVGX05PTkNPTlNUCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisKK3NpemVfdCBTRExfaWNvbnYoU0RMX2ljb252X3QgY2QsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKippbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwKKyAgICAgICAgICAgICAgICAgY2hhciAqKm91dGJ1Ziwgc2l6ZV90ICpvdXRieXRlc2xlZnQpCit7CisJc2l6ZV90IHJldENvZGU7CisjaWZkZWYgSUNPTlZfSU5CVUZfTk9OQ09OU1QKKwlyZXRDb2RlID0gaWNvbnYoY2QsIChjaGFyICoqKWluYnVmLCBpbmJ5dGVzbGVmdCwgb3V0YnVmLCBvdXRieXRlc2xlZnQpOworI2Vsc2UKKwlyZXRDb2RlID0gaWNvbnYoY2QsIGluYnVmLCBpbmJ5dGVzbGVmdCwgb3V0YnVmLCBvdXRieXRlc2xlZnQpOworI2VuZGlmCisJaWYgKCByZXRDb2RlID09IChzaXplX3QpLTEgKSB7CisJCXN3aXRjaChlcnJubykgeworCQkgICAgY2FzZSBFMkJJRzoKKwkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7CisJCSAgICBjYXNlIEVJTFNFUToKKwkJCXJldHVybiBTRExfSUNPTlZfRUlMU0VROworCQkgICAgY2FzZSBFSU5WQUw6CisJCQlyZXR1cm4gU0RMX0lDT05WX0VJTlZBTDsKKwkJICAgIGRlZmF1bHQ6CisJCQlyZXR1cm4gU0RMX0lDT05WX0VSUk9SOworCQl9CisJfQorCXJldHVybiByZXRDb2RlOworfQorCisjZWxzZQorCisvKiBMb3RzIG9mIHVzZWZ1bCBpbmZvcm1hdGlvbiBvbiBVbmljb2RlIGF0OgorCWh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91bmljb2RlLmh0bWwKKyovCisKKyNkZWZpbmUgVU5JQ09ERV9CT00JMHhGRUZGCisKKyNkZWZpbmUgVU5LTk9XTl9BU0NJSQknPycKKyNkZWZpbmUgVU5LTk9XTl9VTklDT0RFCTB4RkZGRAorCitlbnVtIHsKKwlFTkNPRElOR19VTktOT1dOLAorCUVOQ09ESU5HX0FTQ0lJLAorCUVOQ09ESU5HX0xBVElOMSwKKwlFTkNPRElOR19VVEY4LAorCUVOQ09ESU5HX1VURjE2LAkJLyogTmVlZHMgYnl0ZSBvcmRlciBtYXJrZXIgKi8KKwlFTkNPRElOR19VVEYxNkJFLAorCUVOQ09ESU5HX1VURjE2TEUsCisJRU5DT0RJTkdfVVRGMzIsCQkvKiBOZWVkcyBieXRlIG9yZGVyIG1hcmtlciAqLworCUVOQ09ESU5HX1VURjMyQkUsCisJRU5DT0RJTkdfVVRGMzJMRSwKKwlFTkNPRElOR19VQ1MyLAkJLyogTmF0aXZlIGJ5dGUgb3JkZXIgYXNzdW1lZCAqLworCUVOQ09ESU5HX1VDUzQsCQkvKiBOYXRpdmUgYnl0ZSBvcmRlciBhc3N1bWVkICovCit9OworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KKyNkZWZpbmUgRU5DT0RJTkdfVVRGMTZOQVRJVkUJRU5DT0RJTkdfVVRGMTZCRQorI2RlZmluZSBFTkNPRElOR19VVEYzMk5BVElWRQlFTkNPRElOR19VVEYzMkJFCisjZWxzZQorI2RlZmluZSBFTkNPRElOR19VVEYxNk5BVElWRQlFTkNPRElOR19VVEYxNkxFCisjZGVmaW5lIEVOQ09ESU5HX1VURjMyTkFUSVZFCUVOQ09ESU5HX1VURjMyTEUKKyNlbmRpZgorCitzdHJ1Y3QgX1NETF9pY29udl90Cit7CisJaW50IHNyY19mbXQ7CisJaW50IGRzdF9mbXQ7Cit9OworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBmb3JtYXQ7Cit9IGVuY29kaW5nc1tdID0geworCXsgIkFTQ0lJIiwJRU5DT0RJTkdfQVNDSUkgfSwKKwl7ICJVUy1BU0NJSSIsCUVOQ09ESU5HX0FTQ0lJIH0sCisJeyAiODg1OS0xIiwJRU5DT0RJTkdfTEFUSU4xIH0sCisJeyAiSVNPLTg4NTktMSIsCUVOQ09ESU5HX0xBVElOMSB9LAorCXsgIlVURjgiLAlFTkNPRElOR19VVEY4IH0sCisJeyAiVVRGLTgiLAlFTkNPRElOR19VVEY4IH0sCisJeyAiVVRGMTYiLAlFTkNPRElOR19VVEYxNiB9LAorCXsgIlVURi0xNiIsCUVOQ09ESU5HX1VURjE2IH0sCisJeyAiVVRGMTZCRSIsCUVOQ09ESU5HX1VURjE2QkUgfSwKKwl7ICJVVEYtMTZCRSIsCUVOQ09ESU5HX1VURjE2QkUgfSwKKwl7ICJVVEYxNkxFIiwJRU5DT0RJTkdfVVRGMTZMRSB9LAorCXsgIlVURi0xNkxFIiwJRU5DT0RJTkdfVVRGMTZMRSB9LAorCXsgIlVURjMyIiwJRU5DT0RJTkdfVVRGMzIgfSwKKwl7ICJVVEYtMzIiLAlFTkNPRElOR19VVEYzMiB9LAorCXsgIlVURjMyQkUiLAlFTkNPRElOR19VVEYzMkJFIH0sCisJeyAiVVRGLTMyQkUiLAlFTkNPRElOR19VVEYzMkJFIH0sCisJeyAiVVRGMzJMRSIsCUVOQ09ESU5HX1VURjMyTEUgfSwKKwl7ICJVVEYtMzJMRSIsCUVOQ09ESU5HX1VURjMyTEUgfSwKKwl7ICJVQ1MyIiwJRU5DT0RJTkdfVUNTMiB9LAorCXsgIlVDUy0yIiwJRU5DT0RJTkdfVUNTMiB9LAorCXsgIlVDUzQiLAlFTkNPRElOR19VQ1M0IH0sCisJeyAiVUNTLTQiLAlFTkNPRElOR19VQ1M0IH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0bG9jYWxlKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUpCit7CisJY29uc3QgY2hhciAqbGFuZzsKKwljaGFyICpwdHI7CisKKwlsYW5nID0gU0RMX2dldGVudigiTENfQUxMIik7CisJaWYgKCAhbGFuZyApIHsKKwkJbGFuZyA9IFNETF9nZXRlbnYoIkxDX0NUWVBFIik7CisJfQorCWlmICggIWxhbmcgKSB7CisJCWxhbmcgPSBTRExfZ2V0ZW52KCJMQ19NRVNTQUdFUyIpOworCX0KKwlpZiAoICFsYW5nICkgeworCQlsYW5nID0gU0RMX2dldGVudigiTEFORyIpOworCX0KKwlpZiAoICFsYW5nIHx8ICEqbGFuZyB8fCBTRExfc3RyY21wKGxhbmcsICJDIikgPT0gMCApIHsKKwkJbGFuZyA9ICJBU0NJSSI7CisJfQorCisJLyogV2UgbmVlZCB0byB0cmltIGRvd24gc3RyaW5ncyBsaWtlICJlbl9VUy5VVEYtOEBibGFoIiB0byAiVVRGLTgiICovCisJcHRyID0gU0RMX3N0cmNocihsYW5nLCAnLicpOworCWlmIChwdHIgIT0gTlVMTCkgeworCQlsYW5nID0gcHRyICsgMTsKKwl9CisKKwlTRExfc3RybGNweShidWZmZXIsIGxhbmcsIGJ1ZnNpemUpOworCXB0ciA9IFNETF9zdHJjaHIoYnVmZmVyLCAnQCcpOworCWlmIChwdHIgIT0gTlVMTCkgeworCQkqcHRyID0gJ1wwJzsgIC8qIGNob3AgZW5kIG9mIHN0cmluZy4gKi8KKwl9CisKKwlyZXR1cm4gYnVmZmVyOworfQorCitTRExfaWNvbnZfdCBTRExfaWNvbnZfb3Blbihjb25zdCBjaGFyICp0b2NvZGUsIGNvbnN0IGNoYXIgKmZyb21jb2RlKQoreworCWludCBzcmNfZm10ID0gRU5DT0RJTkdfVU5LTk9XTjsKKwlpbnQgZHN0X2ZtdCA9IEVOQ09ESU5HX1VOS05PV047CisJaW50IGk7CisJY2hhciBmcm9tY29kZV9idWZmZXJbNjRdOworCWNoYXIgdG9jb2RlX2J1ZmZlcls2NF07CisKKwlpZiAoICFmcm9tY29kZSB8fCAhKmZyb21jb2RlICkgeworCQlmcm9tY29kZSA9IGdldGxvY2FsZShmcm9tY29kZV9idWZmZXIsIHNpemVvZihmcm9tY29kZV9idWZmZXIpKTsKKwl9CisJaWYgKCAhdG9jb2RlIHx8ICEqdG9jb2RlICkgeworCQl0b2NvZGUgPSBnZXRsb2NhbGUodG9jb2RlX2J1ZmZlciwgc2l6ZW9mKHRvY29kZV9idWZmZXIpKTsKKwl9CisJZm9yICggaSA9IDA7IGkgPCBTRExfYXJyYXlzaXplKGVuY29kaW5ncyk7ICsraSApIHsKKwkJaWYgKCBTRExfc3RyY2FzZWNtcChmcm9tY29kZSwgZW5jb2RpbmdzW2ldLm5hbWUpID09IDAgKSB7CisJCQlzcmNfZm10ID0gZW5jb2RpbmdzW2ldLmZvcm1hdDsKKwkJCWlmICggZHN0X2ZtdCAhPSBFTkNPRElOR19VTktOT1dOICkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICggU0RMX3N0cmNhc2VjbXAodG9jb2RlLCBlbmNvZGluZ3NbaV0ubmFtZSkgPT0gMCApIHsKKwkJCWRzdF9mbXQgPSBlbmNvZGluZ3NbaV0uZm9ybWF0OworCQkJaWYgKCBzcmNfZm10ICE9IEVOQ09ESU5HX1VOS05PV04gKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKCBzcmNfZm10ICE9IEVOQ09ESU5HX1VOS05PV04gJiYgZHN0X2ZtdCAhPSBFTkNPRElOR19VTktOT1dOICkgeworCQlTRExfaWNvbnZfdCBjZCA9IChTRExfaWNvbnZfdClTRExfbWFsbG9jKHNpemVvZigqY2QpKTsKKwkJaWYgKCBjZCApIHsKKwkJCWNkLT5zcmNfZm10ID0gc3JjX2ZtdDsKKwkJCWNkLT5kc3RfZm10ID0gZHN0X2ZtdDsKKwkJCXJldHVybiBjZDsKKwkJfQorCX0KKwlyZXR1cm4gKFNETF9pY29udl90KS0xOworfQorCitzaXplX3QgU0RMX2ljb252KFNETF9pY29udl90IGNkLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqaW5idWYsIHNpemVfdCAqaW5ieXRlc2xlZnQsCisgICAgICAgICAgICAgICAgIGNoYXIgKipvdXRidWYsIHNpemVfdCAqb3V0Ynl0ZXNsZWZ0KQoreworCS8qIEZvciBzaW1wbGljaXR5LCB3ZSdsbCBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gYW5kIGZyb20gVUNTLTQgKi8KKwljb25zdCBjaGFyICpzcmM7CisJY2hhciAqZHN0OworCXNpemVfdCBzcmNsZW4sIGRzdGxlbjsKKwlVaW50MzIgY2ggPSAwOworCXNpemVfdCB0b3RhbDsKKworCWlmICggIWluYnVmIHx8ICEqaW5idWYgKSB7CisJCS8qIFJlc2V0IHRoZSBjb250ZXh0ICovCisJCXJldHVybiAwOworCX0KKwlpZiAoICFvdXRidWYgfHwgISpvdXRidWYgfHwgIW91dGJ5dGVzbGVmdCB8fCAhKm91dGJ5dGVzbGVmdCApIHsKKwkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKKwl9CisJc3JjID0gKmluYnVmOworCXNyY2xlbiA9IChpbmJ5dGVzbGVmdCA/ICppbmJ5dGVzbGVmdCA6IDApOworCWRzdCA9ICpvdXRidWY7CisJZHN0bGVuID0gKm91dGJ5dGVzbGVmdDsKKworCXN3aXRjaCAoIGNkLT5zcmNfZm10ICkgeworCSAgICBjYXNlIEVOQ09ESU5HX1VURjE2OgorCQkvKiBTY2FuIGZvciBhIGJ5dGUgb3JkZXIgbWFya2VyICovCisJCXsKKwkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopc3JjOworCQkJc2l6ZV90IG4gPSBzcmNsZW4gLyAyOworCQkJd2hpbGUgKCBuICkgeworCQkJCWlmICggcFswXSA9PSAweEZGICYmIHBbMV0gPT0gMHhGRSApIHsKKwkJCQkJY2QtPnNyY19mbXQgPSBFTkNPRElOR19VVEYxNkJFOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKCBwWzBdID09IDB4RkUgJiYgcFsxXSA9PSAweEZGICkgeworCQkJCQljZC0+c3JjX2ZtdCA9IEVOQ09ESU5HX1VURjE2TEU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwICs9IDI7CisJCQkJLS1uOworCQkJfQorCQkJaWYgKCBuID09IDAgKSB7CisJCQkJLyogV2UgY2FuJ3QgdGVsbCwgZGVmYXVsdCB0byBob3N0IG9yZGVyICovCisJCQkJY2QtPnNyY19mbXQgPSBFTkNPRElOR19VVEYxNk5BVElWRTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBFTkNPRElOR19VVEYzMjoKKwkJLyogU2NhbiBmb3IgYSBieXRlIG9yZGVyIG1hcmtlciAqLworCQl7CisJCQlVaW50OCAqcCA9IChVaW50OCAqKXNyYzsKKwkJCXNpemVfdCBuID0gc3JjbGVuIC8gNDsKKwkJCXdoaWxlICggbiApIHsKKwkJCQlpZiAoIHBbMF0gPT0gMHhGRiAmJiBwWzFdID09IDB4RkUgJiYKKwkJCQkgICAgIHBbMl0gPT0gMHgwMCAmJiBwWzNdID09IDB4MDAgKSB7CisJCQkJCWNkLT5zcmNfZm10ID0gRU5DT0RJTkdfVVRGMzJCRTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmICggcFswXSA9PSAweDAwICYmIHBbMV0gPT0gMHgwMCAmJgorCQkJCSAgICAgICAgICAgIHBbMl0gPT0gMHhGRSAmJiBwWzNdID09IDB4RkYgKSB7CisJCQkJCWNkLT5zcmNfZm10ID0gRU5DT0RJTkdfVVRGMzJMRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXAgKz0gNDsKKwkJCQktLW47CisJCQl9CisJCQlpZiAoIG4gPT0gMCApIHsKKwkJCQkvKiBXZSBjYW4ndCB0ZWxsLCBkZWZhdWx0IHRvIGhvc3Qgb3JkZXIgKi8KKwkJCQljZC0+c3JjX2ZtdCA9IEVOQ09ESU5HX1VURjMyTkFUSVZFOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoIGNkLT5kc3RfZm10ICkgeworCSAgICBjYXNlIEVOQ09ESU5HX1VURjE2OgorCQkvKiBEZWZhdWx0IHRvIGhvc3Qgb3JkZXIsIG5lZWQgdG8gYWRkIGJ5dGUgb3JkZXIgbWFya2VyICovCisJCWlmICggZHN0bGVuIDwgMiApIHsKKwkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7CisJCX0KKwkJKihVaW50MTYgKilkc3QgPSBVTklDT0RFX0JPTTsKKwkJZHN0ICs9IDI7CisJCWRzdGxlbiAtPSAyOworCQljZC0+ZHN0X2ZtdCA9IEVOQ09ESU5HX1VURjE2TkFUSVZFOworCQlicmVhazsKKwkgICAgY2FzZSBFTkNPRElOR19VVEYzMjoKKwkJLyogRGVmYXVsdCB0byBob3N0IG9yZGVyLCBuZWVkIHRvIGFkZCBieXRlIG9yZGVyIG1hcmtlciAqLworCQlpZiAoIGRzdGxlbiA8IDQgKSB7CisJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOworCQl9CisJCSooVWludDMyICopZHN0ID0gVU5JQ09ERV9CT007CisJCWRzdCArPSA0OworCQlkc3RsZW4gLT0gNDsKKwkJY2QtPmRzdF9mbXQgPSBFTkNPRElOR19VVEYzMk5BVElWRTsKKwkJYnJlYWs7CisJfQorCisJdG90YWwgPSAwOworCXdoaWxlICggc3JjbGVuID4gMCApIHsKKwkJLyogRGVjb2RlIGEgY2hhcmFjdGVyICovCisJCXN3aXRjaCAoIGNkLT5zcmNfZm10ICkgeworCQkgICAgY2FzZSBFTkNPRElOR19BU0NJSToKKwkJCXsKKwkJCQlVaW50OCAqcCA9IChVaW50OCAqKXNyYzsKKwkJCQljaCA9IChVaW50MzIpKHBbMF0gJiAweDdGKTsKKwkJCQkrK3NyYzsKKwkJCQktLXNyY2xlbjsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgY2FzZSBFTkNPRElOR19MQVRJTjE6CisJCQl7CisJCQkJVWludDggKnAgPSAoVWludDggKilzcmM7CisJCQkJY2ggPSAoVWludDMyKXBbMF07CisJCQkJKytzcmM7CisJCQkJLS1zcmNsZW47CisJCQl9CisJCQlicmVhazsKKwkJICAgIGNhc2UgRU5DT0RJTkdfVVRGODogLyogUkZDIDM2MjkgKi8KKwkJCXsKKwkJCQlVaW50OCAqcCA9IChVaW50OCAqKXNyYzsKKwkJCQlzaXplX3QgbGVmdCA9IDA7CisJCQkJU0RMX2Jvb2wgb3ZlcmxvbmcgPSBTRExfRkFMU0U7CisJCQkJaWYgKCBwWzBdID49IDB4RkMgKSB7CisJCQkJCWlmICggKHBbMF0gJiAweEZFKSAhPSAweEZDICkgeworCQkJCQkJLyogU2tpcCBpbGxlZ2FsIHNlcXVlbmNlcworCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7CisJCQkJCQkqLworCQkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoIHBbMF0gPT0gMHhGQyApIHsKKwkJCQkJCQlvdmVybG9uZyA9IFNETF9UUlVFOworCQkJCQkJfQorCQkJCQkJY2ggPSAoVWludDMyKShwWzBdICYgMHgwMSk7CisJCQkJCQlsZWZ0ID0gNTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoIHBbMF0gPj0gMHhGOCApIHsKKwkJCQkJaWYgKCAocFswXSAmIDB4RkMpICE9IDB4RjggKSB7CisJCQkJCQkvKiBTa2lwIGlsbGVnYWwgc2VxdWVuY2VzCisJCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTFNFUTsKKwkJCQkJCSovCisJCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICggcFswXSA9PSAweEY4ICkgeworCQkJCQkJCW92ZXJsb25nID0gU0RMX1RSVUU7CisJCQkJCQl9CisJCQkJCQljaCA9IChVaW50MzIpKHBbMF0gJiAweDAzKTsKKwkJCQkJCWxlZnQgPSA0OworCQkJCQl9CisJCQkJfSBlbHNlIGlmICggcFswXSA+PSAweEYwICkgeworCQkJCQlpZiAoIChwWzBdICYgMHhGOCkgIT0gMHhGMCApIHsKKwkJCQkJCS8qIFNraXAgaWxsZWdhbCBzZXF1ZW5jZXMKKwkJCQkJCXJldHVybiBTRExfSUNPTlZfRUlMU0VROworCQkJCQkJKi8KKwkJCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKCBwWzBdID09IDB4RjAgKSB7CisJCQkJCQkJb3ZlcmxvbmcgPSBTRExfVFJVRTsKKwkJCQkJCX0KKwkJCQkJCWNoID0gKFVpbnQzMikocFswXSAmIDB4MDcpOworCQkJCQkJbGVmdCA9IDM7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKCBwWzBdID49IDB4RTAgKSB7CisJCQkJCWlmICggKHBbMF0gJiAweEYwKSAhPSAweEUwICkgeworCQkJCQkJLyogU2tpcCBpbGxlZ2FsIHNlcXVlbmNlcworCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7CisJCQkJCQkqLworCQkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoIHBbMF0gPT0gMHhFMCApIHsKKwkJCQkJCQlvdmVybG9uZyA9IFNETF9UUlVFOworCQkJCQkJfQorCQkJCQkJY2ggPSAoVWludDMyKShwWzBdICYgMHgwRik7CisJCQkJCQlsZWZ0ID0gMjsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoIHBbMF0gPj0gMHhDMCApIHsKKwkJCQkJaWYgKCAocFswXSAmIDB4RTApICE9IDB4QzAgKSB7CisJCQkJCQkvKiBTa2lwIGlsbGVnYWwgc2VxdWVuY2VzCisJCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTFNFUTsKKwkJCQkJCSovCisJCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICggKHBbMF0gJiAweERFKSA9PSAweEMwICkgeworCQkJCQkJCW92ZXJsb25nID0gU0RMX1RSVUU7CisJCQkJCQl9CisJCQkJCQljaCA9IChVaW50MzIpKHBbMF0gJiAweDFGKTsKKwkJCQkJCWxlZnQgPSAxOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCAocFswXSAmIDB4ODApICE9IDB4MDAgKSB7CisJCQkJCQkvKiBTa2lwIGlsbGVnYWwgc2VxdWVuY2VzCisJCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTFNFUTsKKwkJCQkJCSovCisJCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNoID0gKFVpbnQzMilwWzBdOworCQkJCQl9CisJCQkJfQorCQkJCSsrc3JjOworCQkJCS0tc3JjbGVuOworCQkJCWlmICggc3JjbGVuIDwgbGVmdCApIHsKKwkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSU5WQUw7CisJCQkJfQorCQkJCXdoaWxlICggbGVmdC0tICkgeworCQkJCQkrK3A7CisJCQkJCWlmICggKHBbMF0gJiAweEMwKSAhPSAweDgwICkgeworCQkJCQkJLyogU2tpcCBpbGxlZ2FsIHNlcXVlbmNlcworCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7CisJCQkJCQkqLworCQkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljaCA8PD0gNjsKKwkJCQkJY2ggfD0gKHBbMF0gJiAweDNGKTsKKwkJCQkJKytzcmM7CisJCQkJCS0tc3JjbGVuOworCQkJCX0KKwkJCQlpZiAoIG92ZXJsb25nICkgeworCQkJCQkvKiBQb3RlbnRpYWwgc2VjdXJpdHkgcmlzaworCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTFNFUTsKKwkJCQkJKi8KKwkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJfQorCQkJCWlmICggKGNoID49IDB4RDgwMCAmJiBjaCA8PSAweERGRkYpIHx8CisJCQkJICAgICAoY2ggPT0gMHhGRkZFIHx8IGNoID09IDB4RkZGRikgfHwKKwkJCQkgICAgIGNoID4gMHgxMEZGRkYgKSB7CisJCQkJCS8qIFNraXAgaWxsZWdhbCBzZXF1ZW5jZXMKKwkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7CisJCQkJCSovCisJCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkgICAgY2FzZSBFTkNPRElOR19VVEYxNkJFOiAvKiBSRkMgMjc4MSAqLworCQkJeworCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopc3JjOworCQkJCVVpbnQxNiBXMSwgVzI7CisJCQkJaWYgKCBzcmNsZW4gPCAyICkgeworCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTlZBTDsKKwkJCQl9CisJCQkJVzEgPSAoKFVpbnQxNilwWzBdIDw8IDgpIHwKKwkJCQkgICAgICAoVWludDE2KXBbMV07CisJCQkJc3JjICs9IDI7CisJCQkJc3JjbGVuIC09IDI7CisJCQkJaWYgKCBXMSA8IDB4RDgwMCB8fCBXMSA+IDB4REZGRiApIHsKKwkJCQkJY2ggPSAoVWludDMyKVcxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCBXMSA+IDB4REJGRiApIHsKKwkJCQkJLyogU2tpcCBpbGxlZ2FsIHNlcXVlbmNlcworCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTFNFUTsKKwkJCQkJKi8KKwkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoIHNyY2xlbiA8IDIgKSB7CisJCQkJCXJldHVybiBTRExfSUNPTlZfRUlOVkFMOworCQkJCX0KKwkJCQlwID0gKFVpbnQ4ICopc3JjOworCQkJCVcyID0gKChVaW50MTYpcFswXSA8PCA4KSB8CisJCQkJICAgICAgKFVpbnQxNilwWzFdOworCQkJCXNyYyArPSAyOworCQkJCXNyY2xlbiAtPSAyOworCQkJCWlmICggVzIgPCAweERDMDAgfHwgVzIgPiAweERGRkYgKSB7CisJCQkJCS8qIFNraXAgaWxsZWdhbCBzZXF1ZW5jZXMKKwkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7CisJCQkJCSovCisJCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2ggPSAoKChVaW50MzIpKFcxICYgMHgzRkYpIDw8IDEwKSB8CisJCQkJICAgICAgKFVpbnQzMikoVzIgJiAweDNGRikpICsgMHgxMDAwMDsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgY2FzZSBFTkNPRElOR19VVEYxNkxFOiAvKiBSRkMgMjc4MSAqLworCQkJeworCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopc3JjOworCQkJCVVpbnQxNiBXMSwgVzI7CisJCQkJaWYgKCBzcmNsZW4gPCAyICkgeworCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTlZBTDsKKwkJCQl9CisJCQkJVzEgPSAoKFVpbnQxNilwWzFdIDw8IDgpIHwKKwkJCQkgICAgICAoVWludDE2KXBbMF07CisJCQkJc3JjICs9IDI7CisJCQkJc3JjbGVuIC09IDI7CisJCQkJaWYgKCBXMSA8IDB4RDgwMCB8fCBXMSA+IDB4REZGRiApIHsKKwkJCQkJY2ggPSAoVWludDMyKVcxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCBXMSA+IDB4REJGRiApIHsKKwkJCQkJLyogU2tpcCBpbGxlZ2FsIHNlcXVlbmNlcworCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTFNFUTsKKwkJCQkJKi8KKwkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoIHNyY2xlbiA8IDIgKSB7CisJCQkJCXJldHVybiBTRExfSUNPTlZfRUlOVkFMOworCQkJCX0KKwkJCQlwID0gKFVpbnQ4ICopc3JjOworCQkJCVcyID0gKChVaW50MTYpcFsxXSA8PCA4KSB8CisJCQkJICAgICAgKFVpbnQxNilwWzBdOworCQkJCXNyYyArPSAyOworCQkJCXNyY2xlbiAtPSAyOworCQkJCWlmICggVzIgPCAweERDMDAgfHwgVzIgPiAweERGRkYgKSB7CisJCQkJCS8qIFNraXAgaWxsZWdhbCBzZXF1ZW5jZXMKKwkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSUxTRVE7CisJCQkJCSovCisJCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2ggPSAoKChVaW50MzIpKFcxICYgMHgzRkYpIDw8IDEwKSB8CisJCQkJICAgICAgKFVpbnQzMikoVzIgJiAweDNGRikpICsgMHgxMDAwMDsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgY2FzZSBFTkNPRElOR19VVEYzMkJFOgorCQkJeworCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopc3JjOworCQkJCWlmICggc3JjbGVuIDwgNCApIHsKKwkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSU5WQUw7CisJCQkJfQorCQkJCWNoID0gKChVaW50MzIpcFswXSA8PCAyNCkgfAorCQkJCSAgICAgKChVaW50MzIpcFsxXSA8PCAxNikgfAorCQkJCSAgICAgKChVaW50MzIpcFsyXSA8PCA4KSB8CisJCQkJICAgICAgKFVpbnQzMilwWzNdOworCQkJCXNyYyArPSA0OworCQkJCXNyY2xlbiAtPSA0OworCQkJfQorCQkJYnJlYWs7CisJCSAgICBjYXNlIEVOQ09ESU5HX1VURjMyTEU6CisJCQl7CisJCQkJVWludDggKnAgPSAoVWludDggKilzcmM7CisJCQkJaWYgKCBzcmNsZW4gPCA0ICkgeworCQkJCQlyZXR1cm4gU0RMX0lDT05WX0VJTlZBTDsKKwkJCQl9CisJCQkJY2ggPSAoKFVpbnQzMilwWzNdIDw8IDI0KSB8CisJCQkJICAgICAoKFVpbnQzMilwWzJdIDw8IDE2KSB8CisJCQkJICAgICAoKFVpbnQzMilwWzFdIDw8IDgpIHwKKwkJCQkgICAgICAoVWludDMyKXBbMF07CisJCQkJc3JjICs9IDQ7CisJCQkJc3JjbGVuIC09IDQ7CisJCQl9CisJCQlicmVhazsKKwkJICAgIGNhc2UgRU5DT0RJTkdfVUNTMjoKKwkJCXsKKwkJCQlVaW50MTYgKnAgPSAoVWludDE2ICopc3JjOworCQkJCWlmICggc3JjbGVuIDwgMiApIHsKKwkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSU5WQUw7CisJCQkJfQorCQkJCWNoID0gKnA7CisJCQkJc3JjICs9IDI7CisJCQkJc3JjbGVuIC09IDI7CisJCQl9CisJCQlicmVhazsKKwkJICAgIGNhc2UgRU5DT0RJTkdfVUNTNDoKKwkJCXsKKwkJCQlVaW50MzIgKnAgPSAoVWludDMyICopc3JjOworCQkJCWlmICggc3JjbGVuIDwgNCApIHsKKwkJCQkJcmV0dXJuIFNETF9JQ09OVl9FSU5WQUw7CisJCQkJfQorCQkJCWNoID0gKnA7CisJCQkJc3JjICs9IDQ7CisJCQkJc3JjbGVuIC09IDQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIEVuY29kZSBhIGNoYXJhY3RlciAqLworCQlzd2l0Y2ggKCBjZC0+ZHN0X2ZtdCApIHsKKwkJICAgIGNhc2UgRU5DT0RJTkdfQVNDSUk6CisJCQl7CisJCQkJVWludDggKnAgPSAoVWludDggKilkc3Q7CisJCQkJaWYgKCBkc3RsZW4gPCAxICkgeworCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOworCQkJCX0KKwkJCQlpZiAoIGNoID4gMHg3RiApIHsKKwkJCQkJKnAgPSBVTktOT1dOX0FTQ0lJOworCQkJCX0gZWxzZSB7CisJCQkJCSpwID0gKFVpbnQ4KWNoOworCQkJCX0KKwkJCQkrK2RzdDsKKwkJCQktLWRzdGxlbjsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgY2FzZSBFTkNPRElOR19MQVRJTjE6CisJCQl7CisJCQkJVWludDggKnAgPSAoVWludDggKilkc3Q7CisJCQkJaWYgKCBkc3RsZW4gPCAxICkgeworCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOworCQkJCX0KKwkJCQlpZiAoIGNoID4gMHhGRiApIHsKKwkJCQkJKnAgPSBVTktOT1dOX0FTQ0lJOworCQkJCX0gZWxzZSB7CisJCQkJCSpwID0gKFVpbnQ4KWNoOworCQkJCX0KKwkJCQkrK2RzdDsKKwkJCQktLWRzdGxlbjsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgY2FzZSBFTkNPRElOR19VVEY4OiAvKiBSRkMgMzYyOSAqLworCQkJeworCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopZHN0OworCQkJCWlmICggY2ggPiAweDEwRkZGRiApIHsKKwkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJfQorCQkJCWlmICggY2ggPD0gMHg3RiApIHsKKwkJCQkJaWYgKCBkc3RsZW4gPCAxICkgeworCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKKwkJCQkJfQorCQkJCQkqcCA9IChVaW50OCljaDsKKwkJCQkJKytkc3Q7CisJCQkJCS0tZHN0bGVuOworCQkJCX0gZWxzZSBpZiAoIGNoIDw9IDB4N0ZGICkgeworCQkJCQlpZiAoIGRzdGxlbiA8IDIgKSB7CisJCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOworCQkJCQl9CisJCQkJCXBbMF0gPSAweEMwIHwgKFVpbnQ4KSgoY2ggPj4gNikgJiAweDFGKTsKKwkJCQkJcFsxXSA9IDB4ODAgfCAoVWludDgpKGNoICYgMHgzRik7CisJCQkJCWRzdCArPSAyOworCQkJCQlkc3RsZW4gLT0gMjsKKwkJCQl9IGVsc2UgaWYgKCBjaCA8PSAweEZGRkYgKSB7CisJCQkJCWlmICggZHN0bGVuIDwgMyApIHsKKwkJCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7CisJCQkJCX0KKwkJCQkJcFswXSA9IDB4RTAgfCAoVWludDgpKChjaCA+PiAxMikgJiAweDBGKTsKKwkJCQkJcFsxXSA9IDB4ODAgfCAoVWludDgpKChjaCA+PiA2KSAmIDB4M0YpOworCQkJCQlwWzJdID0gMHg4MCB8IChVaW50OCkoY2ggJiAweDNGKTsKKwkJCQkJZHN0ICs9IDM7CisJCQkJCWRzdGxlbiAtPSAzOworCQkJCX0gZWxzZSBpZiAoIGNoIDw9IDB4MUZGRkZGICkgeworCQkJCQlpZiAoIGRzdGxlbiA8IDQgKSB7CisJCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOworCQkJCQl9CisJCQkJCXBbMF0gPSAweEYwIHwgKFVpbnQ4KSgoY2ggPj4gMTgpICYgMHgwNyk7CisJCQkJCXBbMV0gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gMTIpICYgMHgzRik7CisJCQkJCXBbMl0gPSAweDgwIHwgKFVpbnQ4KSgoY2ggPj4gNikgJiAweDNGKTsKKwkJCQkJcFszXSA9IDB4ODAgfCAoVWludDgpKGNoICYgMHgzRik7CisJCQkJCWRzdCArPSA0OworCQkJCQlkc3RsZW4gLT0gNDsKKwkJCQl9IGVsc2UgaWYgKCBjaCA8PSAweDNGRkZGRkYgKSB7CisJCQkJCWlmICggZHN0bGVuIDwgNSApIHsKKwkJCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7CisJCQkJCX0KKwkJCQkJcFswXSA9IDB4RjggfCAoVWludDgpKChjaCA+PiAyNCkgJiAweDAzKTsKKwkJCQkJcFsxXSA9IDB4ODAgfCAoVWludDgpKChjaCA+PiAxOCkgJiAweDNGKTsKKwkJCQkJcFsyXSA9IDB4ODAgfCAoVWludDgpKChjaCA+PiAxMikgJiAweDNGKTsKKwkJCQkJcFszXSA9IDB4ODAgfCAoVWludDgpKChjaCA+PiA2KSAmIDB4M0YpOworCQkJCQlwWzRdID0gMHg4MCB8IChVaW50OCkoY2ggJiAweDNGKTsKKwkJCQkJZHN0ICs9IDU7CisJCQkJCWRzdGxlbiAtPSA1OworCQkJCX0gZWxzZSB7CisJCQkJCWlmICggZHN0bGVuIDwgNiApIHsKKwkJCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7CisJCQkJCX0KKwkJCQkJcFswXSA9IDB4RkMgfCAoVWludDgpKChjaCA+PiAzMCkgJiAweDAxKTsKKwkJCQkJcFsxXSA9IDB4ODAgfCAoVWludDgpKChjaCA+PiAyNCkgJiAweDNGKTsKKwkJCQkJcFsyXSA9IDB4ODAgfCAoVWludDgpKChjaCA+PiAxOCkgJiAweDNGKTsKKwkJCQkJcFszXSA9IDB4ODAgfCAoVWludDgpKChjaCA+PiAxMikgJiAweDNGKTsKKwkJCQkJcFs0XSA9IDB4ODAgfCAoVWludDgpKChjaCA+PiA2KSAmIDB4M0YpOworCQkJCQlwWzVdID0gMHg4MCB8IChVaW50OCkoY2ggJiAweDNGKTsKKwkJCQkJZHN0ICs9IDY7CisJCQkJCWRzdGxlbiAtPSA2OworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkgICAgY2FzZSBFTkNPRElOR19VVEYxNkJFOiAvKiBSRkMgMjc4MSAqLworCQkJeworCQkJCVVpbnQ4ICpwID0gKFVpbnQ4ICopZHN0OworCQkJCWlmICggY2ggPiAweDEwRkZGRiApIHsKKwkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJfQorCQkJCWlmICggY2ggPCAweDEwMDAwICkgeworCQkJCQlpZiAoIGRzdGxlbiA8IDIgKSB7CisJCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOworCQkJCQl9CisJCQkJCXBbMF0gPSAoVWludDgpKGNoID4+IDgpOworCQkJCQlwWzFdID0gKFVpbnQ4KWNoOworCQkJCQlkc3QgKz0gMjsKKwkJCQkJZHN0bGVuIC09IDI7CisJCQkJfSBlbHNlIHsKKwkJCQkJVWludDE2IFcxLCBXMjsKKwkJCQkJaWYgKCBkc3RsZW4gPCA0ICkgeworCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKKwkJCQkJfQorCQkJCQljaCA9IGNoIC0gMHgxMDAwMDsKKwkJCQkJVzEgPSAweEQ4MDAgfCAoVWludDE2KSgoY2ggPj4gMTApICYgMHgzRkYpOworCQkJCQlXMiA9IDB4REMwMCB8IChVaW50MTYpKGNoICYgMHgzRkYpOworCQkJCQlwWzBdID0gKFVpbnQ4KShXMSA+PiA4KTsKKwkJCQkJcFsxXSA9IChVaW50OClXMTsKKwkJCQkJcFsyXSA9IChVaW50OCkoVzIgPj4gOCk7CisJCQkJCXBbM10gPSAoVWludDgpVzI7CisJCQkJCWRzdCArPSA0OworCQkJCQlkc3RsZW4gLT0gNDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJICAgIGNhc2UgRU5DT0RJTkdfVVRGMTZMRTogLyogUkZDIDI3ODEgKi8KKwkJCXsKKwkJCQlVaW50OCAqcCA9IChVaW50OCAqKWRzdDsKKwkJCQlpZiAoIGNoID4gMHgxMEZGRkYgKSB7CisJCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOworCQkJCX0KKwkJCQlpZiAoIGNoIDwgMHgxMDAwMCApIHsKKwkJCQkJaWYgKCBkc3RsZW4gPCAyICkgeworCQkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKKwkJCQkJfQorCQkJCQlwWzFdID0gKFVpbnQ4KShjaCA+PiA4KTsKKwkJCQkJcFswXSA9IChVaW50OCljaDsKKwkJCQkJZHN0ICs9IDI7CisJCQkJCWRzdGxlbiAtPSAyOworCQkJCX0gZWxzZSB7CisJCQkJCVVpbnQxNiBXMSwgVzI7CisJCQkJCWlmICggZHN0bGVuIDwgNCApIHsKKwkJCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7CisJCQkJCX0KKwkJCQkJY2ggPSBjaCAtIDB4MTAwMDA7CisJCQkJCVcxID0gMHhEODAwIHwgKFVpbnQxNikoKGNoID4+IDEwKSAmIDB4M0ZGKTsKKwkJCQkJVzIgPSAweERDMDAgfCAoVWludDE2KShjaCAmIDB4M0ZGKTsKKwkJCQkJcFsxXSA9IChVaW50OCkoVzEgPj4gOCk7CisJCQkJCXBbMF0gPSAoVWludDgpVzE7CisJCQkJCXBbM10gPSAoVWludDgpKFcyID4+IDgpOworCQkJCQlwWzJdID0gKFVpbnQ4KVcyOworCQkJCQlkc3QgKz0gNDsKKwkJCQkJZHN0bGVuIC09IDQ7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCSAgICBjYXNlIEVOQ09ESU5HX1VURjMyQkU6CisJCQl7CisJCQkJVWludDggKnAgPSAoVWludDggKilkc3Q7CisJCQkJaWYgKCBjaCA+IDB4MTBGRkZGICkgeworCQkJCQljaCA9IFVOS05PV05fVU5JQ09ERTsKKwkJCQl9CisJCQkJaWYgKCBkc3RsZW4gPCA0ICkgeworCQkJCQlyZXR1cm4gU0RMX0lDT05WX0UyQklHOworCQkJCX0KKwkJCQlwWzBdID0gKFVpbnQ4KShjaCA+PiAyNCk7CisJCQkJcFsxXSA9IChVaW50OCkoY2ggPj4gMTYpOworCQkJCXBbMl0gPSAoVWludDgpKGNoID4+IDgpOworCQkJCXBbM10gPSAoVWludDgpY2g7CisJCQkJZHN0ICs9IDQ7CisJCQkJZHN0bGVuIC09IDQ7CisJCQl9CisJCQlicmVhazsKKwkJICAgIGNhc2UgRU5DT0RJTkdfVVRGMzJMRToKKwkJCXsKKwkJCQlVaW50OCAqcCA9IChVaW50OCAqKWRzdDsKKwkJCQlpZiAoIGNoID4gMHgxMEZGRkYgKSB7CisJCQkJCWNoID0gVU5LTk9XTl9VTklDT0RFOworCQkJCX0KKwkJCQlpZiAoIGRzdGxlbiA8IDQgKSB7CisJCQkJCXJldHVybiBTRExfSUNPTlZfRTJCSUc7CisJCQkJfQorCQkJCXBbM10gPSAoVWludDgpKGNoID4+IDI0KTsKKwkJCQlwWzJdID0gKFVpbnQ4KShjaCA+PiAxNik7CisJCQkJcFsxXSA9IChVaW50OCkoY2ggPj4gOCk7CisJCQkJcFswXSA9IChVaW50OCljaDsKKwkJCQlkc3QgKz0gNDsKKwkJCQlkc3RsZW4gLT0gNDsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgY2FzZSBFTkNPRElOR19VQ1MyOgorCQkJeworCQkJCVVpbnQxNiAqcCA9IChVaW50MTYgKilkc3Q7CisJCQkJaWYgKCBjaCA+IDB4RkZGRiApIHsKKwkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJfQorCQkJCWlmICggZHN0bGVuIDwgMiApIHsKKwkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKKwkJCQl9CisJCQkJKnAgPSAoVWludDE2KWNoOworCQkJCWRzdCArPSAyOworCQkJCWRzdGxlbiAtPSAyOworCQkJfQorCQkJYnJlYWs7CisJCSAgICBjYXNlIEVOQ09ESU5HX1VDUzQ6CisJCQl7CisJCQkJVWludDMyICpwID0gKFVpbnQzMiAqKWRzdDsKKwkJCQlpZiAoIGNoID4gMHg3RkZGRkZGRiApIHsKKwkJCQkJY2ggPSBVTktOT1dOX1VOSUNPREU7CisJCQkJfQorCQkJCWlmICggZHN0bGVuIDwgNCApIHsKKwkJCQkJcmV0dXJuIFNETF9JQ09OVl9FMkJJRzsKKwkJCQl9CisJCQkJKnAgPSBjaDsKKwkJCQlkc3QgKz0gNDsKKwkJCQlkc3RsZW4gLT0gNDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogVXBkYXRlIHN0YXRlICovCisJCSppbmJ1ZiA9IHNyYzsKKwkJKmluYnl0ZXNsZWZ0ID0gc3JjbGVuOworCQkqb3V0YnVmID0gZHN0OworCQkqb3V0Ynl0ZXNsZWZ0ID0gZHN0bGVuOworCQkrK3RvdGFsOworCX0KKwlyZXR1cm4gdG90YWw7Cit9CisKK2ludCBTRExfaWNvbnZfY2xvc2UoU0RMX2ljb252X3QgY2QpCit7CisJaWYgKCBjZCAmJiBjZCAhPSAoU0RMX2ljb252X3QpLTEgKSB7CisJCVNETF9mcmVlKGNkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAhSEFWRV9JQ09OViAqLworCitjaGFyICpTRExfaWNvbnZfc3RyaW5nKGNvbnN0IGNoYXIgKnRvY29kZSwgY29uc3QgY2hhciAqZnJvbWNvZGUsIGNvbnN0IGNoYXIgKmluYnVmLCBzaXplX3QgaW5ieXRlc2xlZnQpCit7CisJU0RMX2ljb252X3QgY2Q7CisJY2hhciAqc3RyaW5nOworCXNpemVfdCBzdHJpbmdzaXplOworCWNoYXIgKm91dGJ1ZjsKKwlzaXplX3Qgb3V0Ynl0ZXNsZWZ0OworCXNpemVfdCByZXRDb2RlID0gMDsKKworCWNkID0gU0RMX2ljb252X29wZW4odG9jb2RlLCBmcm9tY29kZSk7CisJaWYgKCBjZCA9PSAoU0RMX2ljb252X3QpLTEgKSB7CisJCS8qIFNlZSBpZiB3ZSBjYW4gcmVjb3ZlciBoZXJlIChmaXhlcyBpY29udiBvbiBTb2xhcmlzIDExKSAqLworCQlpZiAoICF0b2NvZGUgfHwgISp0b2NvZGUgKSB7CisJCQl0b2NvZGUgPSAiVVRGLTgiOworCQl9CisJCWlmICggIWZyb21jb2RlIHx8ICEqZnJvbWNvZGUgKSB7CisJCQlmcm9tY29kZSA9ICJVVEYtOCI7CisJCX0KKwkJY2QgPSBTRExfaWNvbnZfb3Blbih0b2NvZGUsIGZyb21jb2RlKTsKKwl9CisJaWYgKCBjZCA9PSAoU0RMX2ljb252X3QpLTEgKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXN0cmluZ3NpemUgPSBpbmJ5dGVzbGVmdCA+IDQgPyBpbmJ5dGVzbGVmdCA6IDQ7CisJc3RyaW5nID0gU0RMX21hbGxvYyhzdHJpbmdzaXplKTsKKwlpZiAoICFzdHJpbmcgKSB7CisJCVNETF9pY29udl9jbG9zZShjZCk7CisJCXJldHVybiBOVUxMOworCX0KKwlvdXRidWYgPSBzdHJpbmc7CisJb3V0Ynl0ZXNsZWZ0ID0gc3RyaW5nc2l6ZTsKKwlTRExfbWVtc2V0KG91dGJ1ZiwgMCwgNCk7CisKKwl3aGlsZSAoIGluYnl0ZXNsZWZ0ID4gMCApIHsKKwkJcmV0Q29kZSA9IFNETF9pY29udihjZCwgJmluYnVmLCAmaW5ieXRlc2xlZnQsICZvdXRidWYsICZvdXRieXRlc2xlZnQpOworCQlzd2l0Y2ggKHJldENvZGUpIHsKKwkJICAgIGNhc2UgU0RMX0lDT05WX0UyQklHOgorCQkJeworCQkJCWNoYXIgKm9sZHN0cmluZyA9IHN0cmluZzsKKwkJCQlzdHJpbmdzaXplICo9IDI7CisJCQkJc3RyaW5nID0gU0RMX3JlYWxsb2Moc3RyaW5nLCBzdHJpbmdzaXplKTsKKwkJCQlpZiAoICFzdHJpbmcgKSB7CisJCQkJCVNETF9pY29udl9jbG9zZShjZCk7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCQlvdXRidWYgPSBzdHJpbmcgKyAob3V0YnVmIC0gb2xkc3RyaW5nKTsKKwkJCQlvdXRieXRlc2xlZnQgPSBzdHJpbmdzaXplIC0gKG91dGJ1ZiAtIHN0cmluZyk7CisJCQkJU0RMX21lbXNldChvdXRidWYsIDAsIDQpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICBjYXNlIFNETF9JQ09OVl9FSUxTRVE6CisJCQkvKiBUcnkgc2tpcHBpbmcgc29tZSBpbnB1dCBkYXRhIC0gbm90IHBlcmZlY3QsIGJ1dC4uLiAqLworCQkJKytpbmJ1ZjsKKwkJCS0taW5ieXRlc2xlZnQ7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0lDT05WX0VJTlZBTDoKKwkJICAgIGNhc2UgU0RMX0lDT05WX0VSUk9SOgorCQkJLyogV2UgY2FuJ3QgY29udGludWUuLi4gKi8KKwkJCWluYnl0ZXNsZWZ0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCVNETF9pY29udl9jbG9zZShjZCk7CisKKwlyZXR1cm4gc3RyaW5nOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX21hbGxvYy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX21hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjVlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3N0ZGxpYi9TRExfbWFsbG9jLmMKQEAgLTAsMCArMSw1MTExIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHBvcnRhYmxlIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBmb3IgU0RMICovCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisKKyNpZm5kZWYgSEFWRV9NQUxMT0MKKworI2RlZmluZSBMQUNLU19TWVNfVFlQRVNfSAorI2RlZmluZSBMQUNLU19TVERJT19ICisjZGVmaW5lIExBQ0tTX1NUUklOR1NfSAorI2RlZmluZSBMQUNLU19TVFJJTkdfSAorI2RlZmluZSBMQUNLU19TVERMSUJfSAorI2RlZmluZSBBQk9SVAorCisvKgorICBUaGlzIGlzIGEgdmVyc2lvbiAoYWthIGRsbWFsbG9jKSBvZiBtYWxsb2MvZnJlZS9yZWFsbG9jIHdyaXR0ZW4gYnkKKyAgRG91ZyBMZWEgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluLiAgU2VuZCBxdWVzdGlvbnMsCisgIGNvbW1lbnRzLCBjb21wbGFpbnRzLCBwZXJmb3JtYW5jZSBkYXRhLCBldGMgdG8gZGxAY3Mub3N3ZWdvLmVkdQorCisqIFZlcnNpb24gMi44LjMgVGh1IFNlcCAyMiAxMToxNjoxNSAyMDA1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKworICAgTm90ZTogVGhlcmUgbWF5IGJlIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hbGxvYyBvYnRhaW5hYmxlIGF0CisgICAgICAgICAgIGZ0cDovL2dlZS5jcy5vc3dlZ28uZWR1L3B1Yi9taXNjL21hbGxvYy5jCisgICAgICAgICBDaGVjayBiZWZvcmUgaW5zdGFsbGluZyEKKworKiBRdWlja3N0YXJ0CisKKyAgVGhpcyBsaWJyYXJ5IGlzIGFsbCBpbiBvbmUgZmlsZSB0byBzaW1wbGlmeSB0aGUgbW9zdCBjb21tb24gdXNhZ2U6CisgIGZ0cCBpdCwgY29tcGlsZSBpdCAoLU8zKSwgYW5kIGxpbmsgaXQgaW50byBhbm90aGVyIHByb2dyYW0uIEFsbCBvZgorICB0aGUgY29tcGlsZS10aW1lIG9wdGlvbnMgZGVmYXVsdCB0byByZWFzb25hYmxlIHZhbHVlcyBmb3IgdXNlIG9uCisgIG1vc3QgcGxhdGZvcm1zLiAgWW91IG1pZ2h0IGxhdGVyIHdhbnQgdG8gc3RlcCB0aHJvdWdoIHZhcmlvdXMKKyAgY29tcGlsZS10aW1lIGFuZCBkeW5hbWljIHR1bmluZyBvcHRpb25zLgorCisgIEZvciBjb252ZW5pZW5jZSwgYW4gaW5jbHVkZSBmaWxlIGZvciBjb2RlIHVzaW5nIHRoaXMgbWFsbG9jIGlzIGF0OgorICAgICBmdHA6Ly9nZWUuY3Mub3N3ZWdvLmVkdS9wdWIvbWlzYy9tYWxsb2MtMi44LjMuaAorICBZb3UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhpcyAuaCBmaWxlIHVubGVzcyB5b3UgY2FsbCBmdW5jdGlvbnMgbm90CisgIGRlZmluZWQgaW4geW91ciBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gIFRoZSAuaCBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlCisgIGV4Y2VycHRzIGZyb20gdGhpcyBmaWxlIG5lZWRlZCBmb3IgdXNpbmcgdGhpcyBtYWxsb2Mgb24gQU5TSSBDL0MrKworICBzeXN0ZW1zLCBzbyBsb25nIGFzIHlvdSBoYXZlbid0IGNoYW5nZWQgY29tcGlsZS10aW1lIG9wdGlvbnMgYWJvdXQKKyAgbmFtaW5nIGFuZCB0dW5pbmcgcGFyYW1ldGVycy4gIElmIHlvdSBkbywgdGhlbiB5b3UgY2FuIGNyZWF0ZSB5b3VyCisgIG93biBtYWxsb2MuaCB0aGF0IGRvZXMgaW5jbHVkZSBhbGwgc2V0dGluZ3MgYnkgY3V0dGluZyBhdCB0aGUgcG9pbnQKKyAgaW5kaWNhdGVkIGJlbG93LiBOb3RlIHRoYXQgeW91IG1heSBhbHJlYWR5IGJ5IGRlZmF1bHQgYmUgdXNpbmcgYSBDCisgIGxpYnJhcnkgY29udGFpbmluZyBhIG1hbGxvYyB0aGF0IGlzIGJhc2VkIG9uIHNvbWUgdmVyc2lvbiBvZiB0aGlzCisgIG1hbGxvYyAoZm9yIGV4YW1wbGUgaW4gbGludXgpLiBZb3UgbWlnaHQgc3RpbGwgd2FudCB0byB1c2UgdGhlIG9uZQorICBpbiB0aGlzIGZpbGUgdG8gY3VzdG9taXplIHNldHRpbmdzIG9yIHRvIGF2b2lkIG92ZXJoZWFkcyBhc3NvY2lhdGVkCisgIHdpdGggbGlicmFyeSB2ZXJzaW9ucy4KKworKiBWaXRhbCBzdGF0aXN0aWNzOgorCisgIFN1cHBvcnRlZCBwb2ludGVyL3NpemVfdCByZXByZXNlbnRhdGlvbjogICAgICAgNCBvciA4IGJ5dGVzCisgICAgICAgc2l6ZV90IE1VU1QgYmUgYW4gdW5zaWduZWQgdHlwZSBvZiB0aGUgc2FtZSB3aWR0aCBhcworICAgICAgIHBvaW50ZXJzLiAoSWYgeW91IGFyZSB1c2luZyBhbiBhbmNpZW50IHN5c3RlbSB0aGF0IGRlY2xhcmVzCisgICAgICAgc2l6ZV90IGFzIGEgc2lnbmVkIHR5cGUsIG9yIG5lZWQgaXQgdG8gYmUgYSBkaWZmZXJlbnQgd2lkdGgKKyAgICAgICB0aGFuIHBvaW50ZXJzLCB5b3UgY2FuIHVzZSBhIHByZXZpb3VzIHJlbGVhc2Ugb2YgdGhpcyBtYWxsb2MKKyAgICAgICAoZS5nLiAyLjcuMikgc3VwcG9ydGluZyB0aGVzZS4pCisKKyAgQWxpZ25tZW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJ5dGVzIChkZWZhdWx0KQorICAgICAgIFRoaXMgc3VmZmljZXMgZm9yIG5lYXJseSBhbGwgY3VycmVudCBtYWNoaW5lcyBhbmQgQyBjb21waWxlcnMuCisgICAgICAgSG93ZXZlciwgeW91IGNhbiBkZWZpbmUgTUFMTE9DX0FMSUdOTUVOVCB0byBiZSB3aWRlciB0aGFuIHRoaXMKKyAgICAgICBpZiBuZWNlc3NhcnkgKHVwIHRvIDEyOGJ5dGVzKSwgYXQgdGhlIGV4cGVuc2Ugb2YgdXNpbmcgbW9yZSBzcGFjZS4KKworICBNaW5pbXVtIG92ZXJoZWFkIHBlciBhbGxvY2F0ZWQgY2h1bms6ICAgNCBvciAgOCBieXRlcyAoaWYgNGJ5dGUgc2l6ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IG9yIDE2IGJ5dGVzIChpZiA4Ynl0ZSBzaXplcykKKyAgICAgICBFYWNoIG1hbGxvY2VkIGNodW5rIGhhcyBhIGhpZGRlbiB3b3JkIG9mIG92ZXJoZWFkIGhvbGRpbmcgc2l6ZQorICAgICAgIGFuZCBzdGF0dXMgaW5mb3JtYXRpb24sIGFuZCBhZGRpdGlvbmFsIGNyb3NzLWNoZWNrIHdvcmQKKyAgICAgICBpZiBGT09URVJTIGlzIGRlZmluZWQuCisKKyAgTWluaW11bSBhbGxvY2F0ZWQgc2l6ZTogNC1ieXRlIHB0cnM6ICAxNiBieXRlcyAgICAoaW5jbHVkaW5nIG92ZXJoZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgICA4LWJ5dGUgcHRyczogIDMyIGJ5dGVzICAgIChpbmNsdWRpbmcgb3ZlcmhlYWQpCisKKyAgICAgICBFdmVuIGEgcmVxdWVzdCBmb3IgemVybyBieXRlcyAoaS5lLiwgbWFsbG9jKDApKSByZXR1cm5zIGEKKyAgICAgICBwb2ludGVyIHRvIHNvbWV0aGluZyBvZiB0aGUgbWluaW11bSBhbGxvY2F0YWJsZSBzaXplLgorICAgICAgIFRoZSBtYXhpbXVtIG92ZXJoZWFkIHdhc3RhZ2UgKGkuZS4sIG51bWJlciBvZiBleHRyYSBieXRlcworICAgICAgIGFsbG9jYXRlZCB0aGFuIHdlcmUgcmVxdWVzdGVkIGluIG1hbGxvYykgaXMgbGVzcyB0aGFuIG9yIGVxdWFsCisgICAgICAgdG8gdGhlIG1pbmltdW0gc2l6ZSwgZXhjZXB0IGZvciByZXF1ZXN0cyA+PSBtbWFwX3RocmVzaG9sZCB0aGF0CisgICAgICAgYXJlIHNlcnZpY2VkIHZpYSBtbWFwKCksIHdoZXJlIHRoZSB3b3JzdCBjYXNlIHdhc3RhZ2UgaXMgYWJvdXQKKyAgICAgICAzMiBieXRlcyBwbHVzIHRoZSByZW1haW5kZXIgZnJvbSBhIHN5c3RlbSBwYWdlICh0aGUgbWluaW1hbAorICAgICAgIG1tYXAgdW5pdCk7IHR5cGljYWxseSA0MDk2IG9yIDgxOTIgYnl0ZXMuCisKKyAgU2VjdXJpdHk6IHN0YXRpYy1zYWZlOyBvcHRpb25hbGx5IG1vcmUgb3IgbGVzcworICAgICAgIFRoZSAic2VjdXJpdHkiIG9mIG1hbGxvYyByZWZlcnMgdG8gdGhlIGFiaWxpdHkgb2YgbWFsaWNpb3VzCisgICAgICAgY29kZSB0byBhY2NlbnR1YXRlIHRoZSBlZmZlY3RzIG9mIGVycm9ycyAoZm9yIGV4YW1wbGUsIGZyZWVpbmcKKyAgICAgICBzcGFjZSB0aGF0IGlzIG5vdCBjdXJyZW50bHkgbWFsbG9jJ2VkIG9yIG92ZXJ3cml0aW5nIHBhc3QgdGhlCisgICAgICAgZW5kcyBvZiBjaHVua3MpIGluIGNvZGUgdGhhdCBjYWxscyBtYWxsb2MuICBUaGlzIG1hbGxvYworICAgICAgIGd1YXJhbnRlZXMgbm90IHRvIG1vZGlmeSBhbnkgbWVtb3J5IGxvY2F0aW9ucyBiZWxvdyB0aGUgYmFzZSBvZgorICAgICAgIGhlYXAsIGkuZS4sIHN0YXRpYyB2YXJpYWJsZXMsIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIHVzYWdlCisgICAgICAgZXJyb3JzLiAgVGhlIHJvdXRpbmVzIGFkZGl0aW9uYWxseSBkZXRlY3QgbW9zdCBpbXByb3BlciBmcmVlcworICAgICAgIGFuZCByZWFsbG9jcy4gIEFsbCB0aGlzIGhvbGRzIGFzIGxvbmcgYXMgdGhlIHN0YXRpYyBib29ra2VlcGluZworICAgICAgIGZvciBtYWxsb2MgaXRzZWxmIGlzIG5vdCBjb3JydXB0ZWQgYnkgc29tZSBvdGhlciBtZWFucy4gIFRoaXMKKyAgICAgICBpcyBvbmx5IG9uZSBhc3BlY3Qgb2Ygc2VjdXJpdHkgLS0gdGhlc2UgY2hlY2tzIGRvIG5vdCwgYW5kCisgICAgICAgY2Fubm90LCBkZXRlY3QgYWxsIHBvc3NpYmxlIHByb2dyYW1taW5nIGVycm9ycy4KKworICAgICAgIElmIEZPT1RFUlMgaXMgZGVmaW5lZCBub256ZXJvLCB0aGVuIGVhY2ggYWxsb2NhdGVkIGNodW5rCisgICAgICAgY2FycmllcyBhbiBhZGRpdGlvbmFsIGNoZWNrIHdvcmQgdG8gdmVyaWZ5IHRoYXQgaXQgd2FzIG1hbGxvY2VkCisgICAgICAgZnJvbSBpdHMgc3BhY2UuICBUaGVzZSBjaGVjayB3b3JkcyBhcmUgdGhlIHNhbWUgd2l0aGluIGVhY2gKKyAgICAgICBleGVjdXRpb24gb2YgYSBwcm9ncmFtIHVzaW5nIG1hbGxvYywgYnV0IGRpZmZlciBhY3Jvc3MKKyAgICAgICBleGVjdXRpb25zLCBzbyBleHRlcm5hbGx5IGNyYWZ0ZWQgZmFrZSBjaHVua3MgY2Fubm90IGJlCisgICAgICAgZnJlZWQuIFRoaXMgaW1wcm92ZXMgc2VjdXJpdHkgYnkgcmVqZWN0aW5nIGZyZWVzL3JlYWxsb2NzIHRoYXQKKyAgICAgICBjb3VsZCBjb3JydXB0IGhlYXAgbWVtb3J5LCBpbiBhZGRpdGlvbiB0byB0aGUgY2hlY2tzIHByZXZlbnRpbmcKKyAgICAgICB3cml0ZXMgdG8gc3RhdGljcyB0aGF0IGFyZSBhbHdheXMgb24uICBUaGlzIG1heSBmdXJ0aGVyIGltcHJvdmUKKyAgICAgICBzZWN1cml0eSBhdCB0aGUgZXhwZW5zZSBvZiB0aW1lIGFuZCBzcGFjZSBvdmVyaGVhZC4gIChOb3RlIHRoYXQKKyAgICAgICBGT09URVJTIG1heSBhbHNvIGJlIHdvcnRoIHVzaW5nIHdpdGggTVNQQUNFUy4pCisKKyAgICAgICBCeSBkZWZhdWx0IGRldGVjdGVkIGVycm9ycyBjYXVzZSB0aGUgcHJvZ3JhbSB0byBhYm9ydCAoY2FsbGluZworICAgICAgICJhYm9ydCgpIikuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyB0byBpbnN0ZWFkIHByb2NlZWQgcGFzdAorICAgICAgIGVycm9ycyBieSBkZWZpbmluZyBQUk9DRUVEX09OX0VSUk9SLiAgSW4gdGhpcyBjYXNlLCBhIGJhZCBmcmVlCisgICAgICAgaGFzIG5vIGVmZmVjdCwgYW5kIGEgbWFsbG9jIHRoYXQgZW5jb3VudGVycyBhIGJhZCBhZGRyZXNzCisgICAgICAgY2F1c2VkIGJ5IHVzZXIgb3ZlcndyaXRlcyB3aWxsIGlnbm9yZSB0aGUgYmFkIGFkZHJlc3MgYnkKKyAgICAgICBkcm9wcGluZyBwb2ludGVycyBhbmQgaW5kaWNlcyB0byBhbGwga25vd24gbWVtb3J5LiBUaGlzIG1heQorICAgICAgIGJlIGFwcHJvcHJpYXRlIGZvciBwcm9ncmFtcyB0aGF0IHNob3VsZCBjb250aW51ZSBpZiBhdCBhbGwKKyAgICAgICBwb3NzaWJsZSBpbiB0aGUgZmFjZSBvZiBwcm9ncmFtbWluZyBlcnJvcnMsIGFsdGhvdWdoIHRoZXkgbWF5CisgICAgICAgcnVuIG91dCBvZiBtZW1vcnkgYmVjYXVzZSBkcm9wcGVkIG1lbW9yeSBpcyBuZXZlciByZWNsYWltZWQuCisKKyAgICAgICBJZiB5b3UgZG9uJ3QgbGlrZSBlaXRoZXIgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBkZWZpbmUKKyAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTiBhbmQgVVNBR0VfRVJST1JfQUNUSU9OIHRvIGRvIGFueXRoaW5nCisgICAgICAgZWxzZS4gQW5kIGlmIGlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgcHJvZ3JhbSB1c2luZyBtYWxsb2MgaGFzCisgICAgICAgbm8gZXJyb3JzIG9yIHZ1bG5lcmFiaWxpdGllcywgeW91IGNhbiBkZWZpbmUgSU5TRUNVUkUgdG8gMSwKKyAgICAgICB3aGljaCBtaWdodCAob3IgbWlnaHQgbm90KSBwcm92aWRlIGEgc21hbGwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuCisKKyAgVGhyZWFkLXNhZmV0eTogTk9UIHRocmVhZC1zYWZlIHVubGVzcyBVU0VfTE9DS1MgZGVmaW5lZAorICAgICAgIFdoZW4gVVNFX0xPQ0tTIGlzIGRlZmluZWQsIGVhY2ggcHVibGljIGNhbGwgdG8gbWFsbG9jLCBmcmVlLAorICAgICAgIGV0YyBpcyBzdXJyb3VuZGVkIHdpdGggZWl0aGVyIGEgcHRocmVhZCBtdXRleCBvciBhIHdpbjMyCisgICAgICAgc3BpbmxvY2sgKGRlcGVuZGluZyBvbiBXSU4zMikuIFRoaXMgaXMgbm90IGVzcGVjaWFsbHkgZmFzdCwgYW5kCisgICAgICAgY2FuIGJlIGEgbWFqb3IgYm90dGxlbmVjay4gIEl0IGlzIGRlc2lnbmVkIG9ubHkgdG8gcHJvdmlkZQorICAgICAgIG1pbmltYWwgcHJvdGVjdGlvbiBpbiBjb25jdXJyZW50IGVudmlyb25tZW50cywgYW5kIHRvIHByb3ZpZGUgYQorICAgICAgIGJhc2lzIGZvciBleHRlbnNpb25zLiAgSWYgeW91IGFyZSB1c2luZyBtYWxsb2MgaW4gYSBjb25jdXJyZW50CisgICAgICAgcHJvZ3JhbSwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBwdG1hbGxvYywgd2hpY2ggaXMgZGVyaXZlZCBmcm9tCisgICAgICAgYSB2ZXJzaW9uIG9mIHRoaXMgbWFsbG9jLiAoU2VlIGh0dHA6Ly93d3cubWFsbG9jLmRlKS4KKworICBTeXN0ZW0gcmVxdWlyZW1lbnRzOiBBbnkgY29tYmluYXRpb24gb2YgTU9SRUNPUkUgYW5kL29yIE1NQVAvTVVOTUFQCisgICAgICAgVGhpcyBtYWxsb2MgY2FuIHVzZSB1bml4IHNicmsgb3IgYW55IGVtdWxhdGlvbiAoaW52b2tlZCB1c2luZworICAgICAgIHRoZSBDQUxMX01PUkVDT1JFIG1hY3JvKSBhbmQvb3IgbW1hcC9tdW5tYXAgb3IgYW55IGVtdWxhdGlvbgorICAgICAgIChpbnZva2VkIHVzaW5nIENBTExfTU1BUC9DQUxMX01VTk1BUCkgdG8gZ2V0IGFuZCByZWxlYXNlIHN5c3RlbQorICAgICAgIG1lbW9yeS4gIE9uIG1vc3QgdW5peCBzeXN0ZW1zLCBpdCB0ZW5kcyB0byB3b3JrIGJlc3QgaWYgYm90aAorICAgICAgIE1PUkVDT1JFIGFuZCBNTUFQIGFyZSBlbmFibGVkLiAgT24gV2luMzIsIGl0IHVzZXMgZW11bGF0aW9ucworICAgICAgIGJhc2VkIG9uIFZpcnR1YWxBbGxvYy4gSXQgYWxzbyB1c2VzIGNvbW1vbiBDIGxpYnJhcnkgZnVuY3Rpb25zCisgICAgICAgbGlrZSBtZW1zZXQuCisKKyAgQ29tcGxpYW5jZTogSSBiZWxpZXZlIGl0IGlzIGNvbXBsaWFudCB3aXRoIHRoZSBTaW5nbGUgVW5peCBTcGVjaWZpY2F0aW9uCisgICAgICAgKFNlZSBodHRwOi8vd3d3LnVuaXgub3JnKS4gQWxzbyBTVklEL1hQRywgQU5TSSBDLCBhbmQgcHJvYmFibHkKKyAgICAgICBvdGhlcnMgYXMgd2VsbC4KKworKiBPdmVydmlldyBvZiBhbGdvcml0aG1zCisKKyAgVGhpcyBpcyBub3QgdGhlIGZhc3Rlc3QsIG1vc3Qgc3BhY2UtY29uc2VydmluZywgbW9zdCBwb3J0YWJsZSwgb3IKKyAgbW9zdCB0dW5hYmxlIG1hbGxvYyBldmVyIHdyaXR0ZW4uIEhvd2V2ZXIgaXQgaXMgYW1vbmcgdGhlIGZhc3Rlc3QKKyAgd2hpbGUgYWxzbyBiZWluZyBhbW9uZyB0aGUgbW9zdCBzcGFjZS1jb25zZXJ2aW5nLCBwb3J0YWJsZSBhbmQKKyAgdHVuYWJsZS4gIENvbnNpc3RlbnQgYmFsYW5jZSBhY3Jvc3MgdGhlc2UgZmFjdG9ycyByZXN1bHRzIGluIGEgZ29vZAorICBnZW5lcmFsLXB1cnBvc2UgYWxsb2NhdG9yIGZvciBtYWxsb2MtaW50ZW5zaXZlIHByb2dyYW1zLgorCisgIEluIG1vc3Qgd2F5cywgdGhpcyBtYWxsb2MgaXMgYSBiZXN0LWZpdCBhbGxvY2F0b3IuIEdlbmVyYWxseSwgaXQKKyAgY2hvb3NlcyB0aGUgYmVzdC1maXR0aW5nIGV4aXN0aW5nIGNodW5rIGZvciBhIHJlcXVlc3QsIHdpdGggdGllcworICBicm9rZW4gaW4gYXBwcm94aW1hdGVseSBsZWFzdC1yZWNlbnRseS11c2VkIG9yZGVyLiAoVGhpcyBzdHJhdGVneQorICBub3JtYWxseSBtYWludGFpbnMgbG93IGZyYWdtZW50YXRpb24uKSBIb3dldmVyLCBmb3IgcmVxdWVzdHMgbGVzcworICB0aGFuIDI1NmJ5dGVzLCBpdCBkZXZpYXRlcyBmcm9tIGJlc3QtZml0IHdoZW4gdGhlcmUgaXMgbm90IGFuCisgIGV4YWN0bHkgZml0dGluZyBhdmFpbGFibGUgY2h1bmsgYnkgcHJlZmVycmluZyB0byB1c2Ugc3BhY2UgYWRqYWNlbnQKKyAgdG8gdGhhdCB1c2VkIGZvciB0aGUgcHJldmlvdXMgc21hbGwgcmVxdWVzdCwgYXMgd2VsbCBhcyBieSBicmVha2luZworICB0aWVzIGluIGFwcHJveGltYXRlbHkgbW9zdC1yZWNlbnRseS11c2VkIG9yZGVyLiAoVGhlc2UgZW5oYW5jZQorICBsb2NhbGl0eSBvZiBzZXJpZXMgb2Ygc21hbGwgYWxsb2NhdGlvbnMuKSAgQW5kIGZvciB2ZXJ5IGxhcmdlIHJlcXVlc3RzCisgICg+PSAyNTZLYiBieSBkZWZhdWx0KSwgaXQgcmVsaWVzIG9uIHN5c3RlbSBtZW1vcnkgbWFwcGluZworICBmYWNpbGl0aWVzLCBpZiBzdXBwb3J0ZWQuICAoVGhpcyBoZWxwcyBhdm9pZCBjYXJyeWluZyBhcm91bmQgYW5kCisgIHBvc3NpYmx5IGZyYWdtZW50aW5nIG1lbW9yeSB1c2VkIG9ubHkgZm9yIGxhcmdlIGNodW5rcy4pCisKKyAgQWxsIG9wZXJhdGlvbnMgKGV4Y2VwdCBtYWxsb2Nfc3RhdHMgYW5kIG1hbGxpbmZvKSBoYXZlIGV4ZWN1dGlvbgorICB0aW1lcyB0aGF0IGFyZSBib3VuZGVkIGJ5IGEgY29uc3RhbnQgZmFjdG9yIG9mIHRoZSBudW1iZXIgb2YgYml0cyBpbgorICBhIHNpemVfdCwgbm90IGNvdW50aW5nIGFueSBjbGVhcmluZyBpbiBjYWxsb2Mgb3IgY29weWluZyBpbiByZWFsbG9jLAorICBvciBhY3Rpb25zIHN1cnJvdW5kaW5nIE1PUkVDT1JFIGFuZCBNTUFQIHRoYXQgaGF2ZSB0aW1lcworICBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiBub24tY29udGlndW91cyByZWdpb25zIHJldHVybmVkIGJ5CisgIHN5c3RlbSBhbGxvY2F0aW9uIHJvdXRpbmVzLCB3aGljaCBpcyBvZnRlbiBqdXN0IDEuCisKKyAgVGhlIGltcGxlbWVudGF0aW9uIGlzIG5vdCB2ZXJ5IG1vZHVsYXIgYW5kIHNlcmlvdXNseSBvdmVydXNlcworICBtYWNyb3MuIFBlcmhhcHMgc29tZWRheSBhbGwgQyBjb21waWxlcnMgd2lsbCBkbyBhcyBnb29kIGEgam9iCisgIGlubGluaW5nIG1vZHVsYXIgY29kZSBhcyBjYW4gbm93IGJlIGRvbmUgYnkgYnJ1dGUtZm9yY2UgZXhwYW5zaW9uLAorICBidXQgbm93LCBlbm91Z2ggb2YgdGhlbSBzZWVtIG5vdCB0by4KKworICBTb21lIGNvbXBpbGVycyBpc3N1ZSBhIGxvdCBvZiB3YXJuaW5ncyBhYm91dCBjb2RlIHRoYXQgaXMKKyAgZGVhZC91bnJlYWNoYWJsZSBvbmx5IG9uIHNvbWUgcGxhdGZvcm1zLCBhbmQgYWxzbyBhYm91dCBpbnRlbnRpb25hbAorICB1c2VzIG9mIG5lZ2F0aW9uIG9uIHVuc2lnbmVkIHR5cGVzLiBBbGwga25vd24gY2FzZXMgb2YgZWFjaCBjYW4gYmUKKyAgaWdub3JlZC4KKworICBGb3IgYSBsb25nZXIgYnV0IG91dCBvZiBkYXRlIGhpZ2gtbGV2ZWwgZGVzY3JpcHRpb24sIHNlZQorICAgICBodHRwOi8vZ2VlLmNzLm9zd2Vnby5lZHUvZGwvaHRtbC9tYWxsb2MuaHRtbAorCisqIE1TUEFDRVMKKyAgSWYgTVNQQUNFUyBpcyBkZWZpbmVkLCB0aGVuIGluIGFkZGl0aW9uIHRvIG1hbGxvYywgZnJlZSwgZXRjLiwKKyAgdGhpcyBmaWxlIGFsc28gZGVmaW5lcyBtc3BhY2VfbWFsbG9jLCBtc3BhY2VfZnJlZSwgZXRjLiBUaGVzZQorICBhcmUgdmVyc2lvbnMgb2YgbWFsbG9jIHJvdXRpbmVzIHRoYXQgdGFrZSBhbiAibXNwYWNlIiBhcmd1bWVudAorICBvYnRhaW5lZCB1c2luZyBjcmVhdGVfbXNwYWNlLCB0byBjb250cm9sIGFsbCBpbnRlcm5hbCBib29ra2VlcGluZy4KKyAgSWYgT05MWV9NU1BBQ0VTIGlzIGRlZmluZWQsIG9ubHkgdGhlc2UgdmVyc2lvbnMgYXJlIGNvbXBpbGVkLgorICBTbyBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhpcyBhbGxvY2F0b3IgZm9yIG9ubHkgc29tZSBhbGxvY2F0aW9ucywKKyAgYW5kIHlvdXIgc3lzdGVtIG1hbGxvYyBmb3Igb3RoZXJzLCB5b3UgY2FuIGNvbXBpbGUgd2l0aAorICBPTkxZX01TUEFDRVMgYW5kIHRoZW4gZG8gc29tZXRoaW5nIGxpa2UuLi4KKyAgICBzdGF0aWMgbXNwYWNlIG15bXNwYWNlID0gY3JlYXRlX21zcGFjZSgwLDApOyAvLyBmb3IgZXhhbXBsZQorICAgICNkZWZpbmUgbXltYWxsb2MoYnl0ZXMpICBtc3BhY2VfbWFsbG9jKG15bXNwYWNlLCBieXRlcykKKworICAoTm90ZTogSWYgeW91IG9ubHkgbmVlZCBvbmUgaW5zdGFuY2Ugb2YgYW4gbXNwYWNlLCB5b3UgY2FuIGluc3RlYWQKKyAgdXNlICJVU0VfRExfUFJFRklYIiB0byByZWxhYmVsIHRoZSBnbG9iYWwgbWFsbG9jLikKKworICBZb3UgY2FuIHNpbWlsYXJseSBjcmVhdGUgdGhyZWFkLWxvY2FsIGFsbG9jYXRvcnMgYnkgc3RvcmluZworICBtc3BhY2VzIGFzIHRocmVhZC1sb2NhbHMuIEZvciBleGFtcGxlOgorICAgIHN0YXRpYyBfX3RocmVhZCBtc3BhY2UgdGxtcyA9IDA7CisgICAgdm9pZCogIHRsbWFsbG9jKHNpemVfdCBieXRlcykgeworICAgICAgaWYgKHRsbXMgPT0gMCkgdGxtcyA9IGNyZWF0ZV9tc3BhY2UoMCwgMCk7CisgICAgICByZXR1cm4gbXNwYWNlX21hbGxvYyh0bG1zLCBieXRlcyk7CisgICAgfQorICAgIHZvaWQgIHRsZnJlZSh2b2lkKiBtZW0pIHsgbXNwYWNlX2ZyZWUodGxtcywgbWVtKTsgfQorCisgIFVubGVzcyBGT09URVJTIGlzIGRlZmluZWQsIGVhY2ggbXNwYWNlIGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQuCisgIFlvdSBjYW5ub3QgYWxsb2NhdGUgZnJvbSBvbmUgYW5kIGZyZWUgdG8gYW5vdGhlciAoYWx0aG91Z2gKKyAgY29uZm9ybWFuY2UgaXMgb25seSB3ZWFrbHkgY2hlY2tlZCwgc28gdXNhZ2UgZXJyb3JzIGFyZSBub3QgYWx3YXlzCisgIGNhdWdodCkuIElmIEZPT1RFUlMgaXMgZGVmaW5lZCwgdGhlbiBlYWNoIGNodW5rIGNhcnJpZXMgYXJvdW5kIGEgdGFnCisgIGluZGljYXRpbmcgaXRzIG9yaWdpbmF0aW5nIG1zcGFjZSwgYW5kIGZyZWVzIGFyZSBkaXJlY3RlZCB0byB0aGVpcgorICBvcmlnaW5hdGluZyBzcGFjZXMuCisKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDb21waWxlLXRpbWUgb3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmUgY2FyZWZ1bCBpbiBzZXR0aW5nICNkZWZpbmUgdmFsdWVzIGZvciBudW1lcmljYWwgY29uc3RhbnRzIG9mIHR5cGUKK3NpemVfdC4gT24gc29tZSBzeXN0ZW1zLCBsaXRlcmFsIHZhbHVlcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQKK3RvIHNpemVfdCBwcmVjaXNpb24gdW5sZXNzIHRoZXkgYXJlIGV4cGxpY2l0bHkgY2FzdGVkLgorCitXSU4zMiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmaW5lZCBpZiBfV0lOMzIgZGVmaW5lZAorICBEZWZpbmluZyBXSU4zMiBzZXRzIHVwIGRlZmF1bHRzIGZvciBNUyBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXJzLgorICBPdGhlcndpc2UgZGVmYXVsdHMgYXJlIGZvciB1bml4LgorCitNQUxMT0NfQUxJR05NRU5UICAgICAgICAgZGVmYXVsdDogKHNpemVfdCk4CisgIENvbnRyb2xzIHRoZSBtaW5pbXVtIGFsaWdubWVudCBmb3IgbWFsbG9jJ2VkIGNodW5rcy4gIEl0IG11c3QgYmUgYQorICBwb3dlciBvZiB0d28gYW5kIGF0IGxlYXN0IDgsIGV2ZW4gb24gbWFjaGluZXMgZm9yIHdoaWNoIHNtYWxsZXIKKyAgYWxpZ25tZW50cyB3b3VsZCBzdWZmaWNlLiBJdCBtYXkgYmUgZGVmaW5lZCBhcyBsYXJnZXIgdGhhbiB0aGlzCisgIHRob3VnaC4gTm90ZSBob3dldmVyIHRoYXQgY29kZSBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBvcHRpbWl6ZWQgZm9yCisgIHRoZSBjYXNlIG9mIDgtYnl0ZSBhbGlnbm1lbnQuCisKK01TUEFDRVMgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAwIChmYWxzZSkKKyAgSWYgdHJ1ZSwgY29tcGlsZSBpbiBzdXBwb3J0IGZvciBpbmRlcGVuZGVudCBhbGxvY2F0aW9uIHNwYWNlcy4KKyAgVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpZiBIQVZFX01NQVAgaXMgdHJ1ZS4KKworT05MWV9NU1BBQ0VTICAgICAgICAgICAgIGRlZmF1bHQ6IDAgKGZhbHNlKQorICBJZiB0cnVlLCBvbmx5IGNvbXBpbGUgaW4gbXNwYWNlIHZlcnNpb25zLCBub3QgcmVndWxhciB2ZXJzaW9ucy4KKworVVNFX0xPQ0tTICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAgKGZhbHNlKQorICBDYXVzZXMgZWFjaCBjYWxsIHRvIGVhY2ggcHVibGljIHJvdXRpbmUgdG8gYmUgc3Vycm91bmRlZCB3aXRoCisgIHB0aHJlYWQgb3IgV0lOMzIgbXV0ZXggbG9jay91bmxvY2suIChJZiBzZXQgdHJ1ZSwgdGhpcyBjYW4gYmUKKyAgb3ZlcnJpZGRlbiBvbiBhIHBlci1tc3BhY2UgYmFzaXMgZm9yIG1zcGFjZSB2ZXJzaW9ucy4pCisKK0ZPT1RFUlMgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAwCisgIElmIHRydWUsIHByb3ZpZGUgZXh0cmEgY2hlY2tpbmcgYW5kIGRpc3BhdGNoaW5nIGJ5IHBsYWNpbmcKKyAgaW5mb3JtYXRpb24gaW4gdGhlIGZvb3RlcnMgb2YgYWxsb2NhdGVkIGNodW5rcy4gVGhpcyBhZGRzCisgIHNwYWNlIGFuZCB0aW1lIG92ZXJoZWFkLgorCitJTlNFQ1VSRSAgICAgICAgICAgICAgICAgZGVmYXVsdDogMAorICBJZiB0cnVlLCBvbWl0IGNoZWNrcyBmb3IgdXNhZ2UgZXJyb3JzIGFuZCBoZWFwIHNwYWNlIG92ZXJ3cml0ZXMuCisKK1VTRV9ETF9QUkVGSVggICAgICAgICAgICBkZWZhdWx0OiBOT1QgZGVmaW5lZAorICBDYXVzZXMgY29tcGlsZXIgdG8gcHJlZml4IGFsbCBwdWJsaWMgcm91dGluZXMgd2l0aCB0aGUgc3RyaW5nICdkbCcuCisgIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdSBvbmx5IHdhbnQgdG8gdXNlIHRoaXMgbWFsbG9jIGluIG9uZSBwYXJ0CisgIG9mIGEgcHJvZ3JhbSwgdXNpbmcgeW91ciByZWd1bGFyIHN5c3RlbSBtYWxsb2MgZWxzZXdoZXJlLgorCitBQk9SVCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmaW5lZCBhcyBhYm9ydCgpCisgIERlZmluZXMgaG93IHRvIGFib3J0IG9uIGZhaWxlZCBjaGVja3MuICBPbiBtb3N0IHN5c3RlbXMsIGEgZmFpbGVkCisgIGNoZWNrIGNhbm5vdCBkaWUgd2l0aCBhbiAiYXNzZXJ0IiBvciBldmVuIHByaW50IGFuIGluZm9ybWF0aXZlCisgIG1lc3NhZ2UsIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgcHJpbnQgcm91dGluZXMgaW4gdHVybiBjYWxsIG1hbGxvYywKKyAgd2hpY2ggd2lsbCBmYWlsIGFnYWluLiAgR2VuZXJhbGx5LCB0aGUgYmVzdCBwb2xpY3kgaXMgdG8gc2ltcGx5IGNhbGwKKyAgYWJvcnQoKS4gSXQncyBub3QgdmVyeSB1c2VmdWwgdG8gZG8gbW9yZSB0aGFuIHRoaXMgYmVjYXVzZSBtYW55CisgIGVycm9ycyBkdWUgdG8gb3ZlcndyaXRpbmcgd2lsbCBzaG93IHVwIGFzIGFkZHJlc3MgZmF1bHRzIChudWxsLCBvZGQKKyAgYWRkcmVzc2VzIGV0YykgcmF0aGVyIHRoYW4gbWFsbG9jLXRyaWdnZXJlZCBjaGVja3MsIHNvIHdpbGwgYWxzbworICBhYm9ydC4gIEFsc28sIG1vc3QgY29tcGlsZXJzIGtub3cgdGhhdCBhYm9ydCgpIGRvZXMgbm90IHJldHVybiwgc28KKyAgY2FuIGJldHRlciBvcHRpbWl6ZSBjb2RlIGNvbmRpdGlvbmFsbHkgY2FsbGluZyBpdC4KKworUFJPQ0VFRF9PTl9FUlJPUiAgICAgICAgICAgZGVmYXVsdDogZGVmaW5lZCBhcyAwIChmYWxzZSkKKyAgQ29udHJvbHMgd2hldGhlciBkZXRlY3RlZCBiYWQgYWRkcmVzc2VzIGNhdXNlIHRoZW0gdG8gYnlwYXNzZWQKKyAgcmF0aGVyIHRoYW4gYWJvcnRpbmcuIElmIHNldCwgZGV0ZWN0ZWQgYmFkIGFyZ3VtZW50cyB0byBmcmVlIGFuZAorICByZWFsbG9jIGFyZSBpZ25vcmVkLiBBbmQgYWxsIGJvb2trZWVwaW5nIGluZm9ybWF0aW9uIGlzIHplcm9lZCBvdXQKKyAgdXBvbiBhIGRldGVjdGVkIG92ZXJ3cml0ZSBvZiBmcmVlZCBoZWFwIHNwYWNlLCB0aHVzIGxvc2luZyB0aGUKKyAgYWJpbGl0eSB0byBldmVyIHJldHVybiBpdCBmcm9tIG1hbGxvYyBhZ2FpbiwgYnV0IGVuYWJsaW5nIHRoZQorICBhcHBsaWNhdGlvbiB0byBwcm9jZWVkLiBJZiBQUk9DRUVEX09OX0VSUk9SIGlzIGRlZmluZWQsIHRoZQorICBzdGF0aWMgdmFyaWFibGUgbWFsbG9jX2NvcnJ1cHRpb25fZXJyb3JfY291bnQgaXMgY29tcGlsZWQgaW4KKyAgYW5kIGNhbiBiZSBleGFtaW5lZCB0byBzZWUgaWYgZXJyb3JzIGhhdmUgb2NjdXJyZWQuIFRoaXMgb3B0aW9uCisgIGdlbmVyYXRlcyBzbG93ZXIgY29kZSB0aGFuIHRoZSBkZWZhdWx0IGFib3J0IHBvbGljeS4KKworREVCVUcgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IE5PVCBkZWZpbmVkCisgIFRoZSBERUJVRyBzZXR0aW5nIGlzIG1haW5seSBpbnRlbmRlZCBmb3IgcGVvcGxlIHRyeWluZyB0byBtb2RpZnkKKyAgdGhpcyBjb2RlIG9yIGRpYWdub3NlIHByb2JsZW1zIHdoZW4gcG9ydGluZyB0byBuZXcgcGxhdGZvcm1zLgorICBIb3dldmVyLCBpdCBtYXkgYWxzbyBiZSBhYmxlIHRvIGJldHRlciBpc29sYXRlIHVzZXIgZXJyb3JzIHRoYW4ganVzdAorICB1c2luZyBydW50aW1lIGNoZWNrcy4gIFRoZSBhc3NlcnRpb25zIGluIHRoZSBjaGVjayByb3V0aW5lcyBzcGVsbAorICBvdXQgaW4gbW9yZSBkZXRhaWwgdGhlIGFzc3VtcHRpb25zIGFuZCBpbnZhcmlhbnRzIHVuZGVybHlpbmcgdGhlCisgIGFsZ29yaXRobXMuICBUaGUgY2hlY2tpbmcgaXMgZmFpcmx5IGV4dGVuc2l2ZSwgYW5kIHdpbGwgc2xvdyBkb3duCisgIGV4ZWN1dGlvbiBub3RpY2VhYmx5LiBDYWxsaW5nIG1hbGxvY19zdGF0cyBvciBtYWxsaW5mbyB3aXRoIERFQlVHCisgIHNldCB3aWxsIGF0dGVtcHQgdG8gY2hlY2sgZXZlcnkgbm9uLW1tYXBwZWQgYWxsb2NhdGVkIGFuZCBmcmVlIGNodW5rCisgIGluIHRoZSBjb3Vyc2Ugb2YgY29tcHV0aW5nIHRoZSBzdW1tYXJpZXMuCisKK0FCT1JUX09OX0FTU0VSVF9GQUlMVVJFICAgZGVmYXVsdDogZGVmaW5lZCBhcyAxICh0cnVlKQorICBEZWJ1Z2dpbmcgYXNzZXJ0aW9uIGZhaWx1cmVzIGNhbiBiZSBuZWFybHkgaW1wb3NzaWJsZSBpZiB5b3VyCisgIHZlcnNpb24gb2YgdGhlIGFzc2VydCBtYWNybyBjYXVzZXMgbWFsbG9jIHRvIGJlIGNhbGxlZCwgd2hpY2ggd2lsbAorICBsZWFkIHRvIGEgY2FzY2FkZSBvZiBmdXJ0aGVyIGZhaWx1cmVzLCBibG93aW5nIHRoZSBydW50aW1lIHN0YWNrLgorICBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRSBjYXVzZSBhc3NlcnRpb25zIGZhaWx1cmVzIHRvIGNhbGwgYWJvcnQoKSwKKyAgd2hpY2ggd2lsbCB1c3VhbGx5IG1ha2UgZGVidWdnaW5nIGVhc2llci4KKworTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICAgICBkZWZhdWx0OiBzZXRzIGVycm5vIHRvIEVOT01FTSwgb3Igbm8tb3Agb24gd2luMzIKKyAgVGhlIGFjdGlvbiB0byB0YWtlIGJlZm9yZSAicmV0dXJuIDAiIHdoZW4gbWFsbG9jIGZhaWxzIHRvIGJlIGFibGUgdG8KKyAgcmV0dXJuIG1lbW9yeSBiZWNhdXNlIHRoZXJlIGlzIG5vbmUgYXZhaWxhYmxlLgorCitIQVZFX01PUkVDT1JFICAgICAgICAgICAgIGRlZmF1bHQ6IDEgKHRydWUpIHVubGVzcyB3aW4zMiBvciBPTkxZX01TUEFDRVMKKyAgVHJ1ZSBpZiB0aGlzIHN5c3RlbSBzdXBwb3J0cyBzYnJrIG9yIGFuIGVtdWxhdGlvbiBvZiBpdC4KKworTU9SRUNPUkUgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBzYnJrCisgIFRoZSBuYW1lIG9mIHRoZSBzYnJrLXN0eWxlIHN5c3RlbSByb3V0aW5lIHRvIGNhbGwgdG8gb2J0YWluIG1vcmUKKyAgbWVtb3J5LiAgU2VlIGJlbG93IGZvciBndWlkYW5jZSBvbiB3cml0aW5nIGN1c3RvbSBNT1JFQ09SRQorICBmdW5jdGlvbnMuIFRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudCB0byBzYnJrL01PUkVDT1JFIHZhcmllcyBhY3Jvc3MKKyAgc3lzdGVtcy4gIEl0IGNhbm5vdCBiZSBzaXplX3QsIGJlY2F1c2UgaXQgc3VwcG9ydHMgbmVnYXRpdmUKKyAgYXJndW1lbnRzLCBzbyBpdCBpcyBub3JtYWxseSB0aGUgc2lnbmVkIHR5cGUgb2YgdGhlIHNhbWUgd2lkdGggYXMKKyAgc2l6ZV90IChzb21ldGltZXMgZGVjbGFyZWQgYXMgImludHB0cl90IikuICBJdCBkb2Vzbid0IG11Y2ggbWF0dGVyCisgIHRob3VnaC4gSW50ZXJuYWxseSwgd2Ugb25seSBjYWxsIGl0IHdpdGggYXJndW1lbnRzIGxlc3MgdGhhbiBoYWxmCisgIHRoZSBtYXggdmFsdWUgb2YgYSBzaXplX3QsIHdoaWNoIHNob3VsZCB3b3JrIGFjcm9zcyBhbGwgcmVhc29uYWJsZQorICBwb3NzaWJpbGl0aWVzLCBhbHRob3VnaCBzb21ldGltZXMgZ2VuZXJhdGluZyBjb21waWxlciB3YXJuaW5ncy4gIFNlZQorICBuZWFyIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGZvciBndWlkZWxpbmVzIGZvciBjcmVhdGluZyBhIGN1c3RvbQorICB2ZXJzaW9uIG9mIE1PUkVDT1JFLgorCitNT1JFQ09SRV9DT05USUdVT1VTICAgICAgIGRlZmF1bHQ6IDEgKHRydWUpCisgIElmIHRydWUsIHRha2UgYWR2YW50YWdlIG9mIGZhY3QgdGhhdCBjb25zZWN1dGl2ZSBjYWxscyB0byBNT1JFQ09SRQorICB3aXRoIHBvc2l0aXZlIGFyZ3VtZW50cyBhbHdheXMgcmV0dXJuIGNvbnRpZ3VvdXMgaW5jcmVhc2luZworICBhZGRyZXNzZXMuICBUaGlzIGlzIHRydWUgb2YgdW5peCBzYnJrLiBJdCBkb2VzIG5vdCBodXJ0IHRvbyBtdWNoIHRvCisgIHNldCBpdCB0cnVlIGFueXdheSwgc2luY2UgbWFsbG9jIGNvcGVzIHdpdGggbm9uLWNvbnRpZ3VpdGllcy4KKyAgU2V0dGluZyBpdCBmYWxzZSB3aGVuIGRlZmluaXRlbHkgbm9uLWNvbnRpZ3VvdXMgc2F2ZXMgdGltZQorICBhbmQgcG9zc2libHkgd2FzdGVkIHNwYWNlIGl0IHdvdWxkIHRha2UgdG8gZGlzY292ZXIgdGhpcyB0aG91Z2guCisKK01PUkVDT1JFX0NBTk5PVF9UUklNICAgICAgZGVmYXVsdDogTk9UIGRlZmluZWQKKyAgVHJ1ZSBpZiBNT1JFQ09SRSBjYW5ub3QgcmVsZWFzZSBzcGFjZSBiYWNrIHRvIHRoZSBzeXN0ZW0gd2hlbiBnaXZlbgorICBuZWdhdGl2ZSBhcmd1bWVudHMuIFRoaXMgaXMgZ2VuZXJhbGx5IG5lY2Vzc2FyeSBvbmx5IGlmIHlvdSBhcmUKKyAgdXNpbmcgYSBoYW5kLWNyYWZ0ZWQgTU9SRUNPUkUgZnVuY3Rpb24gdGhhdCBjYW5ub3QgaGFuZGxlIG5lZ2F0aXZlCisgIGFyZ3VtZW50cy4KKworSEFWRV9NTUFQICAgICAgICAgICAgICAgICBkZWZhdWx0OiAxICh0cnVlKQorICBUcnVlIGlmIHRoaXMgc3lzdGVtIHN1cHBvcnRzIG1tYXAgb3IgYW4gZW11bGF0aW9uIG9mIGl0LiAgSWYgc28sIGFuZAorICBIQVZFX01PUkVDT1JFIGlzIG5vdCB0cnVlLCBNTUFQIGlzIHVzZWQgZm9yIGFsbCBzeXN0ZW0KKyAgYWxsb2NhdGlvbi4gSWYgc2V0IGFuZCBIQVZFX01PUkVDT1JFIGlzIHRydWUgYXMgd2VsbCwgTU1BUCBpcworICBwcmltYXJpbHkgdXNlZCB0byBkaXJlY3RseSBhbGxvY2F0ZSB2ZXJ5IGxhcmdlIGJsb2Nrcy4gSXQgaXMgYWxzbworICB1c2VkIGFzIGEgYmFja3VwIHN0cmF0ZWd5IGluIGNhc2VzIHdoZXJlIE1PUkVDT1JFIGZhaWxzIHRvIHByb3ZpZGUKKyAgc3BhY2UgZnJvbSBzeXN0ZW0uIE5vdGU6IEEgc2luZ2xlIGNhbGwgdG8gTVVOTUFQIGlzIGFzc3VtZWQgdG8gYmUKKyAgYWJsZSB0byB1bm1hcCBtZW1vcnkgdGhhdCBtYXkgaGF2ZSBiZSBhbGxvY2F0ZWQgdXNpbmcgbXVsdGlwbGUgY2FsbHMKKyAgdG8gTU1BUCwgc28gbG9uZyBhcyB0aGV5IGFyZSBhZGphY2VudC4KKworSEFWRV9NUkVNQVAgICAgICAgICAgICAgICBkZWZhdWx0OiAxIG9uIGxpbnV4LCBlbHNlIDAKKyAgSWYgdHJ1ZSByZWFsbG9jKCkgdXNlcyBtcmVtYXAoKSB0byByZS1hbGxvY2F0ZSBsYXJnZSBibG9ja3MgYW5kCisgIGV4dGVuZCBvciBzaHJpbmsgYWxsb2NhdGlvbiBzcGFjZXMuCisKK01NQVBfQ0xFQVJTICAgICAgICAgICAgICAgZGVmYXVsdDogMSBvbiB1bml4CisgIFRydWUgaWYgbW1hcCBjbGVhcnMgbWVtb3J5IHNvIGNhbGxvYyBkb2Vzbid0IG5lZWQgdG8uIFRoaXMgaXMgdHJ1ZQorICBmb3Igc3RhbmRhcmQgdW5peCBtbWFwIHVzaW5nIC9kZXYvemVyby4KKworVVNFX0JVSUxUSU5fRkZTICAgICAgICAgICAgZGVmYXVsdDogMCAoaS5lLiwgbm90IHVzZWQpCisgIENhdXNlcyBtYWxsb2MgdG8gdXNlIHRoZSBidWlsdGluIGZmcygpIGZ1bmN0aW9uIHRvIGNvbXB1dGUgaW5kaWNlcy4KKyAgU29tZSBjb21waWxlcnMgbWF5IHJlY29nbml6ZSBhbmQgaW50cmluc2lmeSBmZnMgdG8gYmUgZmFzdGVyIHRoYW4gdGhlCisgIHN1cHBsaWVkIEMgdmVyc2lvbi4gQWxzbywgdGhlIGNhc2Ugb2YgeDg2IHVzaW5nIGdjYyBpcyBzcGVjaWFsLWNhc2VkCisgIHRvIGFuIGFzbSBpbnN0cnVjdGlvbiwgc28gaXMgYWxyZWFkeSBhcyBmYXN0IGFzIGl0IGNhbiBiZSwgYW5kIHNvCisgIHRoaXMgc2V0dGluZyBoYXMgbm8gZWZmZWN0LiAoT24gbW9zdCB4ODZzLCB0aGUgYXNtIHZlcnNpb24gaXMgb25seQorICBzbGlnaHRseSBmYXN0ZXIgdGhhbiB0aGUgQyB2ZXJzaW9uLikKKworbWFsbG9jX2dldHBhZ2VzaXplICAgICAgICAgZGVmYXVsdDogZGVyaXZlIGZyb20gc3lzdGVtIGluY2x1ZGVzLCBvciA0MDk2LgorICBUaGUgc3lzdGVtIHBhZ2Ugc2l6ZS4gVG8gdGhlIGV4dGVudCBwb3NzaWJsZSwgdGhpcyBtYWxsb2MgbWFuYWdlcworICBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtIGluIHBhZ2Utc2l6ZSB1bml0cy4gIFRoaXMgbWF5IGJlIChhbmQKKyAgdXN1YWxseSBpcykgYSBmdW5jdGlvbiByYXRoZXIgdGhhbiBhIGNvbnN0YW50LiBUaGlzIGlzIGlnbm9yZWQKKyAgaWYgV0lOMzIsIHdoZXJlIHBhZ2Ugc2l6ZSBpcyBkZXRlcm1pbmVkIHVzaW5nIGdldFN5c3RlbUluZm8gZHVyaW5nCisgIGluaXRpYWxpemF0aW9uLgorCitVU0VfREVWX1JBTkRPTSAgICAgICAgICAgICBkZWZhdWx0OiAwIChpLmUuLCBub3QgdXNlZCkKKyAgQ2F1c2VzIG1hbGxvYyB0byB1c2UgL2Rldi9yYW5kb20gdG8gaW5pdGlhbGl6ZSBzZWN1cmUgbWFnaWMgc2VlZCBmb3IKKyAgc3RhbXBpbmcgZm9vdGVycy4gT3RoZXJ3aXNlLCB0aGUgY3VycmVudCB0aW1lIGlzIHVzZWQuCisKK05PX01BTExJTkZPICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAKKyAgSWYgZGVmaW5lZCwgZG9uJ3QgY29tcGlsZSAibWFsbGluZm8iLiBUaGlzIGNhbiBiZSBhIHNpbXBsZSB3YXkKKyAgb2YgZGVhbGluZyB3aXRoIG1pc21hdGNoZXMgYmV0d2VlbiBzeXN0ZW0gZGVjbGFyYXRpb25zIGFuZAorICB0aG9zZSBpbiB0aGlzIGZpbGUuCisKK01BTExJTkZPX0ZJRUxEX1RZUEUgICAgICAgIGRlZmF1bHQ6IHNpemVfdAorICBUaGUgdHlwZSBvZiB0aGUgZmllbGRzIGluIHRoZSBtYWxsaW5mbyBzdHJ1Y3QuIFRoaXMgd2FzIG9yaWdpbmFsbHkKKyAgZGVmaW5lZCBhcyAiaW50IiBpbiBTVklEIGV0YywgYnV0IGlzIG1vcmUgdXNlZnVsbHkgZGVmaW5lZCBhcworICBzaXplX3QuIFRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgaWYgIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggaXMgbm90IHNldAorCitSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgICAgZGVmYXVsdDogbm90IGRlZmluZWQKKyAgVGhpcyBzaG91bGQgYmUgc2V0IGlmIGEgY2FsbCB0byByZWFsbG9jIHdpdGggemVybyBieXRlcyBzaG91bGQgCisgIGJlIHRoZSBzYW1lIGFzIGEgY2FsbCB0byBmcmVlLiBTb21lIHBlb3BsZSB0aGluayBpdCBzaG91bGQuIE90aGVyd2lzZSwgCisgIHNpbmNlIHRoaXMgbWFsbG9jIHJldHVybnMgYSB1bmlxdWUgcG9pbnRlciBmb3IgbWFsbG9jKDApLCBzbyBkb2VzIAorICByZWFsbG9jKHAsIDApLgorCitMQUNLU19VTklTVERfSCwgTEFDS1NfRkNOVExfSCwgTEFDS1NfU1lTX1BBUkFNX0gsIExBQ0tTX1NZU19NTUFOX0gKK0xBQ0tTX1NUUklOR1NfSCwgTEFDS1NfU1RSSU5HX0gsIExBQ0tTX1NZU19UWVBFU19ILCAgTEFDS1NfRVJSTk9fSAorTEFDS1NfU1RETElCX0ggICAgICAgICAgICAgICAgZGVmYXVsdDogTk9UIGRlZmluZWQgdW5sZXNzIG9uIFdJTjMyCisgIERlZmluZSB0aGVzZSBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZXNlIGhlYWRlciBmaWxlcy4KKyAgWW91IG1pZ2h0IG5lZWQgdG8gbWFudWFsbHkgaW5zZXJ0IHNvbWUgb2YgdGhlIGRlY2xhcmF0aW9ucyB0aGV5IHByb3ZpZGUuCisKK0RFRkFVTFRfR1JBTlVMQVJJVFkgICAgICAgIGRlZmF1bHQ6IHBhZ2Ugc2l6ZSBpZiBNT1JFQ09SRV9DT05USUdVT1VTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1faW5mby5kd0FsbG9jYXRpb25HcmFudWxhcml0eSBpbiBXSU4zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIDY0Sy4KKyAgICAgIEFsc28gc2V0dGFibGUgdXNpbmcgbWFsbG9wdChNX0dSQU5VTEFSSVRZLCB4KQorICBUaGUgdW5pdCBmb3IgYWxsb2NhdGluZyBhbmQgZGVhbGxvY2F0aW5nIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0uICBPbgorICBtb3N0IHN5c3RlbXMgd2l0aCBjb250aWd1b3VzIE1PUkVDT1JFLCB0aGVyZSBpcyBubyByZWFzb24gdG8KKyAgbWFrZSB0aGlzIG1vcmUgdGhhbiBhIHBhZ2UuIEhvd2V2ZXIsIHN5c3RlbXMgd2l0aCBNTUFQIHRlbmQgdG8KKyAgZWl0aGVyIHJlcXVpcmUgb3IgZW5jb3VyYWdlIGxhcmdlciBncmFudWxhcml0aWVzLiAgWW91IGNhbiBpbmNyZWFzZQorICB0aGlzIHZhbHVlIHRvIHByZXZlbnQgc3lzdGVtIGFsbG9jYXRpb24gZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBzbworICBvZnRlbiwgZXNwZWNpYWxseSBpZiB0aGV5IGFyZSBzbG93LiAgVGhlIHZhbHVlIG11c3QgYmUgYXQgbGVhc3Qgb25lCisgIHBhZ2UgYW5kIG11c3QgYmUgYSBwb3dlciBvZiB0d28uICBTZXR0aW5nIHRvIDAgY2F1c2VzIGluaXRpYWxpemF0aW9uCisgIHRvIGVpdGhlciBwYWdlIHNpemUgb3Igd2luMzIgcmVnaW9uIHNpemUuICAoTm90ZTogSW4gcHJldmlvdXMKKyAgdmVyc2lvbnMgb2YgbWFsbG9jLCB0aGUgZXF1aXZhbGVudCBvZiB0aGlzIG9wdGlvbiB3YXMgY2FsbGVkCisgICJUT1BfUEFEIikKKworREVGQVVMVF9UUklNX1RIUkVTSE9MRCAgICBkZWZhdWx0OiAyTUIKKyAgICAgIEFsc28gc2V0dGFibGUgdXNpbmcgbWFsbG9wdChNX1RSSU1fVEhSRVNIT0xELCB4KQorICBUaGUgbWF4aW11bSBhbW91bnQgb2YgdW51c2VkIHRvcC1tb3N0IG1lbW9yeSB0byBrZWVwIGJlZm9yZQorICByZWxlYXNpbmcgdmlhIG1hbGxvY190cmltIGluIGZyZWUoKS4gIEF1dG9tYXRpYyB0cmltbWluZyBpcyBtYWlubHkKKyAgdXNlZnVsIGluIGxvbmctbGl2ZWQgcHJvZ3JhbXMgdXNpbmcgY29udGlndW91cyBNT1JFQ09SRS4gIEJlY2F1c2UKKyAgdHJpbW1pbmcgdmlhIHNicmsgY2FuIGJlIHNsb3cgb24gc29tZSBzeXN0ZW1zLCBhbmQgY2FuIHNvbWV0aW1lcyBiZQorICB3YXN0ZWZ1bCAoaW4gY2FzZXMgd2hlcmUgcHJvZ3JhbXMgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkIGFsbG9jYXRlCisgIG1vcmUgbGFyZ2UgY2h1bmtzKSB0aGUgdmFsdWUgc2hvdWxkIGJlIGhpZ2ggZW5vdWdoIHNvIHRoYXQgeW91cgorICBvdmVyYWxsIHN5c3RlbSBwZXJmb3JtYW5jZSB3b3VsZCBpbXByb3ZlIGJ5IHJlbGVhc2luZyB0aGlzIG11Y2gKKyAgbWVtb3J5LiAgQXMgYSByb3VnaCBndWlkZSwgeW91IG1pZ2h0IHNldCB0byBhIHZhbHVlIGNsb3NlIHRvIHRoZQorICBhdmVyYWdlIHNpemUgb2YgYSBwcm9jZXNzIChwcm9ncmFtKSBydW5uaW5nIG9uIHlvdXIgc3lzdGVtLgorICBSZWxlYXNpbmcgdGhpcyBtdWNoIG1lbW9yeSB3b3VsZCBhbGxvdyBzdWNoIGEgcHJvY2VzcyB0byBydW4gaW4KKyAgbWVtb3J5LiAgR2VuZXJhbGx5LCBpdCBpcyB3b3J0aCB0dW5pbmcgdHJpbSB0aHJlc2hvbGRzIHdoZW4gYQorICBwcm9ncmFtIHVuZGVyZ29lcyBwaGFzZXMgd2hlcmUgc2V2ZXJhbCBsYXJnZSBjaHVua3MgYXJlIGFsbG9jYXRlZAorICBhbmQgcmVsZWFzZWQgaW4gd2F5cyB0aGF0IGNhbiByZXVzZSBlYWNoIG90aGVyJ3Mgc3RvcmFnZSwgcGVyaGFwcworICBtaXhlZCB3aXRoIHBoYXNlcyB3aGVyZSB0aGVyZSBhcmUgbm8gc3VjaCBjaHVua3MgYXQgYWxsLiBUaGUgdHJpbQorICB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBwYWdlIHNpemUgdG8gaGF2ZSBhbnkgdXNlZnVsIGVmZmVjdC4gIFRvCisgIGRpc2FibGUgdHJpbW1pbmcgY29tcGxldGVseSwgeW91IGNhbiBzZXQgdG8gTUFYX1NJWkVfVC4gTm90ZSB0aGF0IHRoZSB0cmljaworICBzb21lIHBlb3BsZSB1c2Ugb2YgbWFsbG9jaW5nIGEgaHVnZSBzcGFjZSBhbmQgdGhlbiBmcmVlaW5nIGl0IGF0CisgIHByb2dyYW0gc3RhcnR1cCwgaW4gYW4gYXR0ZW1wdCB0byByZXNlcnZlIHN5c3RlbSBtZW1vcnksIGRvZXNuJ3QKKyAgaGF2ZSB0aGUgaW50ZW5kZWQgZWZmZWN0IHVuZGVyIGF1dG9tYXRpYyB0cmltbWluZywgc2luY2UgdGhhdCBtZW1vcnkKKyAgd2lsbCBpbW1lZGlhdGVseSBiZSByZXR1cm5lZCB0byB0aGUgc3lzdGVtLgorCitERUZBVUxUX01NQVBfVEhSRVNIT0xEICAgICAgIGRlZmF1bHQ6IDI1NksKKyAgICAgIEFsc28gc2V0dGFibGUgdXNpbmcgbWFsbG9wdChNX01NQVBfVEhSRVNIT0xELCB4KQorICBUaGUgcmVxdWVzdCBzaXplIHRocmVzaG9sZCBmb3IgdXNpbmcgTU1BUCB0byBkaXJlY3RseSBzZXJ2aWNlIGEKKyAgcmVxdWVzdC4gUmVxdWVzdHMgb2YgYXQgbGVhc3QgdGhpcyBzaXplIHRoYXQgY2Fubm90IGJlIGFsbG9jYXRlZAorICB1c2luZyBhbHJlYWR5LWV4aXN0aW5nIHNwYWNlIHdpbGwgYmUgc2VydmljZWQgdmlhIG1tYXAuICAoSWYgZW5vdWdoCisgIG5vcm1hbCBmcmVlZCBzcGFjZSBhbHJlYWR5IGV4aXN0cyBpdCBpcyB1c2VkIGluc3RlYWQuKSAgVXNpbmcgbW1hcAorICBzZWdyZWdhdGVzIHJlbGF0aXZlbHkgbGFyZ2UgY2h1bmtzIG9mIG1lbW9yeSBzbyB0aGF0IHRoZXkgY2FuIGJlCisgIGluZGl2aWR1YWxseSBvYnRhaW5lZCBhbmQgcmVsZWFzZWQgZnJvbSB0aGUgaG9zdCBzeXN0ZW0uIEEgcmVxdWVzdAorICBzZXJ2aWNlZCB0aHJvdWdoIG1tYXAgaXMgbmV2ZXIgcmV1c2VkIGJ5IGFueSBvdGhlciByZXF1ZXN0IChhdCBsZWFzdAorICBub3QgZGlyZWN0bHk7IHRoZSBzeXN0ZW0gbWF5IGp1c3Qgc28gaGFwcGVuIHRvIHJlbWFwIHN1Y2Nlc3NpdmUKKyAgcmVxdWVzdHMgdG8gdGhlIHNhbWUgbG9jYXRpb25zKS4gIFNlZ3JlZ2F0aW5nIHNwYWNlIGluIHRoaXMgd2F5IGhhcworICB0aGUgYmVuZWZpdHMgdGhhdDogTW1hcHBlZCBzcGFjZSBjYW4gYWx3YXlzIGJlIGluZGl2aWR1YWxseSByZWxlYXNlZAorICBiYWNrIHRvIHRoZSBzeXN0ZW0sIHdoaWNoIGhlbHBzIGtlZXAgdGhlIHN5c3RlbSBsZXZlbCBtZW1vcnkgZGVtYW5kcworICBvZiBhIGxvbmctbGl2ZWQgcHJvZ3JhbSBsb3cuICBBbHNvLCBtYXBwZWQgbWVtb3J5IGRvZXNuJ3QgYmVjb21lCisgIGBsb2NrZWQnIGJldHdlZW4gb3RoZXIgY2h1bmtzLCBhcyBjYW4gaGFwcGVuIHdpdGggbm9ybWFsbHkgYWxsb2NhdGVkCisgIGNodW5rcywgd2hpY2ggbWVhbnMgdGhhdCBldmVuIHRyaW1taW5nIHZpYSBtYWxsb2NfdHJpbSB3b3VsZCBub3QKKyAgcmVsZWFzZSB0aGVtLiAgSG93ZXZlciwgaXQgaGFzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCB0aGUgc3BhY2UKKyAgY2Fubm90IGJlIHJlY2xhaW1lZCwgY29uc29saWRhdGVkLCBhbmQgdGhlbiB1c2VkIHRvIHNlcnZpY2UgbGF0ZXIKKyAgcmVxdWVzdHMsIGFzIGhhcHBlbnMgd2l0aCBub3JtYWwgY2h1bmtzLiAgVGhlIGFkdmFudGFnZXMgb2YgbW1hcAorICBuZWFybHkgYWx3YXlzIG91dHdlaWdoIGRpc2FkdmFudGFnZXMgZm9yICJsYXJnZSIgY2h1bmtzLCBidXQgdGhlCisgIHZhbHVlIG9mICJsYXJnZSIgbWF5IHZhcnkgYWNyb3NzIHN5c3RlbXMuICBUaGUgZGVmYXVsdCBpcyBhbgorICBlbXBpcmljYWxseSBkZXJpdmVkIHZhbHVlIHRoYXQgd29ya3Mgd2VsbCBpbiBtb3N0IHN5c3RlbXMuIFlvdSBjYW4KKyAgZGlzYWJsZSBtbWFwIGJ5IHNldHRpbmcgdG8gTUFYX1NJWkVfVC4KKworKi8KKworI2lmbmRlZiBXSU4zMgorI2lmZGVmIF9XSU4zMgorI2RlZmluZSBXSU4zMiAxCisjZW5kaWYgIC8qIF9XSU4zMiAqLworI2VuZGlmICAvKiBXSU4zMiAqLworI2lmZGVmIFdJTjMyCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIEhBVkVfTU1BUCAxCisjZGVmaW5lIEhBVkVfTU9SRUNPUkUgMAorI2RlZmluZSBMQUNLU19VTklTVERfSAorI2RlZmluZSBMQUNLU19TWVNfUEFSQU1fSAorI2RlZmluZSBMQUNLU19TWVNfTU1BTl9ICisjZGVmaW5lIExBQ0tTX1NUUklOR19ICisjZGVmaW5lIExBQ0tTX1NUUklOR1NfSAorI2RlZmluZSBMQUNLU19TWVNfVFlQRVNfSAorI2RlZmluZSBMQUNLU19FUlJOT19ICisjZGVmaW5lIExBQ0tTX0ZDTlRMX0ggCisjZGVmaW5lIE1BTExPQ19GQUlMVVJFX0FDVElPTgorI2RlZmluZSBNTUFQX0NMRUFSUyAwIC8qIFdJTkNFIGFuZCBzb21lIG90aGVycyBhcHBhcmVudGx5IGRvbid0IGNsZWFyICovCisjZW5kaWYgIC8qIFdJTjMyICovCisKKyNpZiBkZWZpbmVkKERBUldJTikgfHwgZGVmaW5lZChfREFSV0lOKQorLyogTWFjIE9TWCBkb2NzIGFkdmlzZSBub3QgdG8gdXNlIHNicms7IGl0IHNlZW1zIGJldHRlciB0byB1c2UgbW1hcCAqLworI2lmbmRlZiBIQVZFX01PUkVDT1JFCisjZGVmaW5lIEhBVkVfTU9SRUNPUkUgMAorI2RlZmluZSBIQVZFX01NQVAgMQorI2VuZGlmICAvKiBIQVZFX01PUkVDT1JFICovCisjZW5kaWYgIC8qIERBUldJTiAqLworCisjaWZuZGVmIExBQ0tTX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvKiBGb3Igc2l6ZV90ICovCisjZW5kaWYgIC8qIExBQ0tTX1NZU19UWVBFU19IICovCisKKy8qIFRoZSBtYXhpbXVtIHBvc3NpYmxlIHNpemVfdCB2YWx1ZSBoYXMgYWxsIGJpdHMgc2V0ICovCisjZGVmaW5lIE1BWF9TSVpFX1QgICAgICAgICAgICh+KHNpemVfdCkwKQorCisjaWZuZGVmIE9OTFlfTVNQQUNFUworI2RlZmluZSBPTkxZX01TUEFDRVMgMAorI2VuZGlmICAvKiBPTkxZX01TUEFDRVMgKi8KKyNpZm5kZWYgTVNQQUNFUworI2lmIE9OTFlfTVNQQUNFUworI2RlZmluZSBNU1BBQ0VTIDEKKyNlbHNlICAgLyogT05MWV9NU1BBQ0VTICovCisjZGVmaW5lIE1TUEFDRVMgMAorI2VuZGlmICAvKiBPTkxZX01TUEFDRVMgKi8KKyNlbmRpZiAgLyogTVNQQUNFUyAqLworI2lmbmRlZiBNQUxMT0NfQUxJR05NRU5UCisjZGVmaW5lIE1BTExPQ19BTElHTk1FTlQgKChzaXplX3QpOFUpCisjZW5kaWYgIC8qIE1BTExPQ19BTElHTk1FTlQgKi8KKyNpZm5kZWYgRk9PVEVSUworI2RlZmluZSBGT09URVJTIDAKKyNlbmRpZiAgLyogRk9PVEVSUyAqLworI2lmbmRlZiBBQk9SVAorI2RlZmluZSBBQk9SVCAgYWJvcnQoKQorI2VuZGlmICAvKiBBQk9SVCAqLworI2lmbmRlZiBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRQorI2RlZmluZSBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRSAxCisjZW5kaWYgIC8qIEFCT1JUX09OX0FTU0VSVF9GQUlMVVJFICovCisjaWZuZGVmIFBST0NFRURfT05fRVJST1IKKyNkZWZpbmUgUFJPQ0VFRF9PTl9FUlJPUiAwCisjZW5kaWYgIC8qIFBST0NFRURfT05fRVJST1IgKi8KKyNpZm5kZWYgVVNFX0xPQ0tTCisjZGVmaW5lIFVTRV9MT0NLUyAwCisjZW5kaWYgIC8qIFVTRV9MT0NLUyAqLworI2lmbmRlZiBJTlNFQ1VSRQorI2RlZmluZSBJTlNFQ1VSRSAwCisjZW5kaWYgIC8qIElOU0VDVVJFICovCisjaWZuZGVmIEhBVkVfTU1BUAorI2RlZmluZSBIQVZFX01NQVAgMQorI2VuZGlmICAvKiBIQVZFX01NQVAgKi8KKyNpZm5kZWYgTU1BUF9DTEVBUlMKKyNkZWZpbmUgTU1BUF9DTEVBUlMgMQorI2VuZGlmICAvKiBNTUFQX0NMRUFSUyAqLworI2lmbmRlZiBIQVZFX01SRU1BUAorI2lmZGVmIGxpbnV4CisjZGVmaW5lIEhBVkVfTVJFTUFQIDEKKyNlbHNlICAgLyogbGludXggKi8KKyNkZWZpbmUgSEFWRV9NUkVNQVAgMAorI2VuZGlmICAvKiBsaW51eCAqLworI2VuZGlmICAvKiBIQVZFX01SRU1BUCAqLworI2lmbmRlZiBNQUxMT0NfRkFJTFVSRV9BQ1RJT04KKyNkZWZpbmUgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICBlcnJubyA9IEVOT01FTTsKKyNlbmRpZiAgLyogTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICovCisjaWZuZGVmIEhBVkVfTU9SRUNPUkUKKyNpZiBPTkxZX01TUEFDRVMKKyNkZWZpbmUgSEFWRV9NT1JFQ09SRSAwCisjZWxzZSAgIC8qIE9OTFlfTVNQQUNFUyAqLworI2RlZmluZSBIQVZFX01PUkVDT1JFIDEKKyNlbmRpZiAgLyogT05MWV9NU1BBQ0VTICovCisjZW5kaWYgIC8qIEhBVkVfTU9SRUNPUkUgKi8KKyNpZiAhSEFWRV9NT1JFQ09SRQorI2RlZmluZSBNT1JFQ09SRV9DT05USUdVT1VTIDAKKyNlbHNlICAgLyogIUhBVkVfTU9SRUNPUkUgKi8KKyNpZm5kZWYgTU9SRUNPUkUKKyNkZWZpbmUgTU9SRUNPUkUgc2JyaworI2VuZGlmICAvKiBNT1JFQ09SRSAqLworI2lmbmRlZiBNT1JFQ09SRV9DT05USUdVT1VTCisjZGVmaW5lIE1PUkVDT1JFX0NPTlRJR1VPVVMgMQorI2VuZGlmICAvKiBNT1JFQ09SRV9DT05USUdVT1VTICovCisjZW5kaWYgIC8qIEhBVkVfTU9SRUNPUkUgKi8KKyNpZm5kZWYgREVGQVVMVF9HUkFOVUxBUklUWQorI2lmIE1PUkVDT1JFX0NPTlRJR1VPVVMKKyNkZWZpbmUgREVGQVVMVF9HUkFOVUxBUklUWSAoMCkgIC8qIDAgbWVhbnMgdG8gY29tcHV0ZSBpbiBpbml0X21wYXJhbXMgKi8KKyNlbHNlICAgLyogTU9SRUNPUkVfQ09OVElHVU9VUyAqLworI2RlZmluZSBERUZBVUxUX0dSQU5VTEFSSVRZICgoc2l6ZV90KTY0VSAqIChzaXplX3QpMTAyNFUpCisjZW5kaWYgIC8qIE1PUkVDT1JFX0NPTlRJR1VPVVMgKi8KKyNlbmRpZiAgLyogREVGQVVMVF9HUkFOVUxBUklUWSAqLworI2lmbmRlZiBERUZBVUxUX1RSSU1fVEhSRVNIT0xECisjaWZuZGVmIE1PUkVDT1JFX0NBTk5PVF9UUklNCisjZGVmaW5lIERFRkFVTFRfVFJJTV9USFJFU0hPTEQgKChzaXplX3QpMlUgKiAoc2l6ZV90KTEwMjRVICogKHNpemVfdCkxMDI0VSkKKyNlbHNlICAgLyogTU9SRUNPUkVfQ0FOTk9UX1RSSU0gKi8KKyNkZWZpbmUgREVGQVVMVF9UUklNX1RIUkVTSE9MRCBNQVhfU0laRV9UCisjZW5kaWYgIC8qIE1PUkVDT1JFX0NBTk5PVF9UUklNICovCisjZW5kaWYgIC8qIERFRkFVTFRfVFJJTV9USFJFU0hPTEQgKi8KKyNpZm5kZWYgREVGQVVMVF9NTUFQX1RIUkVTSE9MRAorI2lmIEhBVkVfTU1BUAorI2RlZmluZSBERUZBVUxUX01NQVBfVEhSRVNIT0xEICgoc2l6ZV90KTI1NlUgKiAoc2l6ZV90KTEwMjRVKQorI2Vsc2UgICAvKiBIQVZFX01NQVAgKi8KKyNkZWZpbmUgREVGQVVMVF9NTUFQX1RIUkVTSE9MRCBNQVhfU0laRV9UCisjZW5kaWYgIC8qIEhBVkVfTU1BUCAqLworI2VuZGlmICAvKiBERUZBVUxUX01NQVBfVEhSRVNIT0xEICovCisjaWZuZGVmIFVTRV9CVUlMVElOX0ZGUworI2RlZmluZSBVU0VfQlVJTFRJTl9GRlMgMAorI2VuZGlmICAvKiBVU0VfQlVJTFRJTl9GRlMgKi8KKyNpZm5kZWYgVVNFX0RFVl9SQU5ET00KKyNkZWZpbmUgVVNFX0RFVl9SQU5ET00gMAorI2VuZGlmICAvKiBVU0VfREVWX1JBTkRPTSAqLworI2lmbmRlZiBOT19NQUxMSU5GTworI2RlZmluZSBOT19NQUxMSU5GTyAwCisjZW5kaWYgIC8qIE5PX01BTExJTkZPICovCisjaWZuZGVmIE1BTExJTkZPX0ZJRUxEX1RZUEUKKyNkZWZpbmUgTUFMTElORk9fRklFTERfVFlQRSBzaXplX3QKKyNlbmRpZiAgLyogTUFMTElORk9fRklFTERfVFlQRSAqLworCisjZGVmaW5lIG1lbXNldAlTRExfbWVtc2V0CisjZGVmaW5lIG1lbWNweQlTRExfbWVtY3B5CisjZGVmaW5lIG1hbGxvYwlTRExfbWFsbG9jCisjZGVmaW5lIGNhbGxvYwlTRExfY2FsbG9jCisjZGVmaW5lIHJlYWxsb2MJU0RMX3JlYWxsb2MKKyNkZWZpbmUgZnJlZQlTRExfZnJlZQorCisvKgorICBtYWxsb3B0IHR1bmluZyBvcHRpb25zLiAgU1ZJRC9YUEcgZGVmaW5lcyBmb3VyIHN0YW5kYXJkIHBhcmFtZXRlcgorICBudW1iZXJzIGZvciBtYWxsb3B0LCBub3JtYWxseSBkZWZpbmVkIGluIG1hbGxvYy5oLiAgTm9uZSBvZiB0aGVzZQorICBhcmUgdXNlZCBpbiB0aGlzIG1hbGxvYywgc28gc2V0dGluZyB0aGVtIGhhcyBubyBlZmZlY3QuIEJ1dCB0aGlzCisgIG1hbGxvYyBkb2VzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBvcHRpb25zLgorKi8KKworI2RlZmluZSBNX1RSSU1fVEhSRVNIT0xEICAgICAoLTEpCisjZGVmaW5lIE1fR1JBTlVMQVJJVFkgICAgICAgICgtMikKKyNkZWZpbmUgTV9NTUFQX1RIUkVTSE9MRCAgICAgKC0zKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFsbGluZm8gZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgIU5PX01BTExJTkZPCisvKgorICBUaGlzIHZlcnNpb24gb2YgbWFsbG9jIHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBTVklEL1hQRyBtYWxsaW5mbworICByb3V0aW5lIHRoYXQgcmV0dXJucyBhIHN0cnVjdCBjb250YWluaW5nIHVzYWdlIHByb3BlcnRpZXMgYW5kCisgIHN0YXRpc3RpY3MuIEl0IHNob3VsZCB3b3JrIG9uIGFueSBzeXN0ZW0gdGhhdCBoYXMgYQorICAvdXNyL2luY2x1ZGUvbWFsbG9jLmggZGVmaW5pbmcgc3RydWN0IG1hbGxpbmZvLiAgVGhlIG1haW4KKyAgZGVjbGFyYXRpb24gbmVlZGVkIGlzIHRoZSBtYWxsaW5mbyBzdHJ1Y3QgdGhhdCBpcyByZXR1cm5lZCAoYnktY29weSkKKyAgYnkgbWFsbGluZm8oKS4gIFRoZSBtYWxsb2luZm8gc3RydWN0IGNvbnRhaW5zIGEgYnVuY2ggb2YgZmllbGRzIHRoYXQKKyAgYXJlIG5vdCBldmVuIG1lYW5pbmdmdWwgaW4gdGhpcyB2ZXJzaW9uIG9mIG1hbGxvYy4gIFRoZXNlIGZpZWxkcyBhcmUKKyAgYXJlIGluc3RlYWQgZmlsbGVkIGJ5IG1hbGxpbmZvKCkgd2l0aCBvdGhlciBudW1iZXJzIHRoYXQgbWlnaHQgYmUgb2YKKyAgaW50ZXJlc3QuCisKKyAgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCBzaG91bGQgYmUgc2V0IGlmIHlvdSBoYXZlIGEKKyAgL3Vzci9pbmNsdWRlL21hbGxvYy5oIGZpbGUgdGhhdCBpbmNsdWRlcyBhIGRlY2xhcmF0aW9uIG9mIHN0cnVjdAorICBtYWxsaW5mby4gIElmIHNvLCBpdCBpcyBpbmNsdWRlZDsgZWxzZSBhIGNvbXBsaWFudCB2ZXJzaW9uIGlzCisgIGRlY2xhcmVkIGJlbG93LiAgVGhlc2UgbXVzdCBiZSBwcmVjaXNlbHkgdGhlIHNhbWUgZm9yIG1hbGxpbmZvKCkgdG8KKyAgd29yay4gIFRoZSBvcmlnaW5hbCBTVklEIHZlcnNpb24gb2YgdGhpcyBzdHJ1Y3QsIGRlZmluZWQgb24gbW9zdAorICBzeXN0ZW1zIHdpdGggbWFsbGluZm8sIGRlY2xhcmVzIGFsbCBmaWVsZHMgYXMgaW50cy4gQnV0IHNvbWUgb3RoZXJzCisgIGRlZmluZSBhcyB1bnNpZ25lZCBsb25nLiBJZiB5b3VyIHN5c3RlbSBkZWZpbmVzIHRoZSBmaWVsZHMgdXNpbmcgYQorICB0eXBlIG9mIGRpZmZlcmVudCB3aWR0aCB0aGFuIGxpc3RlZCBoZXJlLCB5b3UgTVVTVCAjaW5jbHVkZSB5b3VyCisgIHN5c3RlbSB2ZXJzaW9uIGFuZCAjZGVmaW5lIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0guCisqLworCisvKiAjZGVmaW5lIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKi8KKworI2lmZGVmIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0gKKyNpbmNsdWRlICIvdXNyL2luY2x1ZGUvbWFsbG9jLmgiCisjZWxzZSAvKiBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IICovCisKK3N0cnVjdCBtYWxsaW5mbyB7CisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgYXJlbmE7ICAgIC8qIG5vbi1tbWFwcGVkIHNwYWNlIGFsbG9jYXRlZCBmcm9tIHN5c3RlbSAqLworICBNQUxMSU5GT19GSUVMRF9UWVBFIG9yZGJsa3M7ICAvKiBudW1iZXIgb2YgZnJlZSBjaHVua3MgKi8KKyAgTUFMTElORk9fRklFTERfVFlQRSBzbWJsa3M7ICAgLyogYWx3YXlzIDAgKi8KKyAgTUFMTElORk9fRklFTERfVFlQRSBoYmxrczsgICAgLyogYWx3YXlzIDAgKi8KKyAgTUFMTElORk9fRklFTERfVFlQRSBoYmxraGQ7ICAgLyogc3BhY2UgaW4gbW1hcHBlZCByZWdpb25zICovCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgdXNtYmxrczsgIC8qIG1heGltdW0gdG90YWwgYWxsb2NhdGVkIHNwYWNlICovCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgZnNtYmxrczsgIC8qIGFsd2F5cyAwICovCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgdW9yZGJsa3M7IC8qIHRvdGFsIGFsbG9jYXRlZCBzcGFjZSAqLworICBNQUxMSU5GT19GSUVMRF9UWVBFIGZvcmRibGtzOyAvKiB0b3RhbCBmcmVlIHNwYWNlICovCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUga2VlcGNvc3Q7IC8qIHJlbGVhc2FibGUgKHZpYSBtYWxsb2NfdHJpbSkgc3BhY2UgKi8KK307CisKKyNlbmRpZiAvKiBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IICovCisjZW5kaWYgLyogTk9fTUFMTElORk8gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaWYgIU9OTFlfTVNQQUNFUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIERlY2xhcmF0aW9ucyBvZiBwdWJsaWMgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIFVTRV9ETF9QUkVGSVgKKyNkZWZpbmUgZGxjYWxsb2MgICAgICAgICAgICAgICBjYWxsb2MKKyNkZWZpbmUgZGxmcmVlICAgICAgICAgICAgICAgICBmcmVlCisjZGVmaW5lIGRsbWFsbG9jICAgICAgICAgICAgICAgbWFsbG9jCisjZGVmaW5lIGRsbWVtYWxpZ24gICAgICAgICAgICAgbWVtYWxpZ24KKyNkZWZpbmUgZGxyZWFsbG9jICAgICAgICAgICAgICByZWFsbG9jCisjZGVmaW5lIGRsdmFsbG9jICAgICAgICAgICAgICAgdmFsbG9jCisjZGVmaW5lIGRscHZhbGxvYyAgICAgICAgICAgICAgcHZhbGxvYworI2RlZmluZSBkbG1hbGxpbmZvICAgICAgICAgICAgIG1hbGxpbmZvCisjZGVmaW5lIGRsbWFsbG9wdCAgICAgICAgICAgICAgbWFsbG9wdAorI2RlZmluZSBkbG1hbGxvY190cmltICAgICAgICAgIG1hbGxvY190cmltCisjZGVmaW5lIGRsbWFsbG9jX3N0YXRzICAgICAgICAgbWFsbG9jX3N0YXRzCisjZGVmaW5lIGRsbWFsbG9jX3VzYWJsZV9zaXplICAgbWFsbG9jX3VzYWJsZV9zaXplCisjZGVmaW5lIGRsbWFsbG9jX2Zvb3RwcmludCAgICAgbWFsbG9jX2Zvb3RwcmludAorI2RlZmluZSBkbG1hbGxvY19tYXhfZm9vdHByaW50IG1hbGxvY19tYXhfZm9vdHByaW50CisjZGVmaW5lIGRsaW5kZXBlbmRlbnRfY2FsbG9jICAgaW5kZXBlbmRlbnRfY2FsbG9jCisjZGVmaW5lIGRsaW5kZXBlbmRlbnRfY29tYWxsb2MgaW5kZXBlbmRlbnRfY29tYWxsb2MKKyNlbmRpZiAvKiBVU0VfRExfUFJFRklYICovCisKKworLyoKKyAgbWFsbG9jKHNpemVfdCBuKQorICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBjaHVuayBvZiBhdCBsZWFzdCBuIGJ5dGVzLCBvcgorICBudWxsIGlmIG5vIHNwYWNlIGlzIGF2YWlsYWJsZSwgaW4gd2hpY2ggY2FzZSBlcnJubyBpcyBzZXQgdG8gRU5PTUVNCisgIG9uIEFOU0kgQyBzeXN0ZW1zLgorCisgIElmIG4gaXMgemVybywgbWFsbG9jIHJldHVybnMgYSBtaW5pbXVtLXNpemVkIGNodW5rLiAoVGhlIG1pbmltdW0KKyAgc2l6ZSBpcyAxNiBieXRlcyBvbiBtb3N0IDMyYml0IHN5c3RlbXMsIGFuZCAzMiBieXRlcyBvbiA2NGJpdAorICBzeXN0ZW1zLikgIE5vdGUgdGhhdCBzaXplX3QgaXMgYW4gdW5zaWduZWQgdHlwZSwgc28gY2FsbHMgd2l0aAorICBhcmd1bWVudHMgdGhhdCB3b3VsZCBiZSBuZWdhdGl2ZSBpZiBzaWduZWQgYXJlIGludGVycHJldGVkIGFzCisgIHJlcXVlc3RzIGZvciBodWdlIGFtb3VudHMgb2Ygc3BhY2UsIHdoaWNoIHdpbGwgb2Z0ZW4gZmFpbC4gVGhlCisgIG1heGltdW0gc3VwcG9ydGVkIHZhbHVlIG9mIG4gZGlmZmVycyBhY3Jvc3Mgc3lzdGVtcywgYnV0IGlzIGluIGFsbAorICBjYXNlcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBhIHNpemVfdC4KKyovCit2b2lkKiBkbG1hbGxvYyhzaXplX3QpOworCisvKgorICBmcmVlKHZvaWQqIHApCisgIFJlbGVhc2VzIHRoZSBjaHVuayBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBwLCB0aGF0IGhhZCBiZWVuIHByZXZpb3VzbHkKKyAgYWxsb2NhdGVkIHVzaW5nIG1hbGxvYyBvciBhIHJlbGF0ZWQgcm91dGluZSBzdWNoIGFzIHJlYWxsb2MuCisgIEl0IGhhcyBubyBlZmZlY3QgaWYgcCBpcyBudWxsLiBJZiBwIHdhcyBub3QgbWFsbG9jZWQgb3IgYWxyZWFkeQorICBmcmVlZCwgZnJlZShwKSB3aWxsIGJ5IGRlZmF1bHQgY2F1c2UgdGhlIGN1cnJlbnQgcHJvZ3JhbSB0byBhYm9ydC4KKyovCit2b2lkICBkbGZyZWUodm9pZCopOworCisvKgorICBjYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUpOworICBSZXR1cm5zIGEgcG9pbnRlciB0byBuX2VsZW1lbnRzICogZWxlbWVudF9zaXplIGJ5dGVzLCB3aXRoIGFsbCBsb2NhdGlvbnMKKyAgc2V0IHRvIHplcm8uCisqLwordm9pZCogZGxjYWxsb2Moc2l6ZV90LCBzaXplX3QpOworCisvKgorICByZWFsbG9jKHZvaWQqIHAsIHNpemVfdCBuKQorICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIGNodW5rIG9mIHNpemUgbiB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGRhdGEKKyAgYXMgZG9lcyBjaHVuayBwIHVwIHRvIHRoZSBtaW5pbXVtIG9mIChuLCBwJ3Mgc2l6ZSkgYnl0ZXMsIG9yIG51bGwKKyAgaWYgbm8gc3BhY2UgaXMgYXZhaWxhYmxlLgorCisgIFRoZSByZXR1cm5lZCBwb2ludGVyIG1heSBvciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHAuIFRoZSBhbGdvcml0aG0KKyAgcHJlZmVycyBleHRlbmRpbmcgcCBpbiBtb3N0IGNhc2VzIHdoZW4gcG9zc2libGUsIG90aGVyd2lzZSBpdAorICBlbXBsb3lzIHRoZSBlcXVpdmFsZW50IG9mIGEgbWFsbG9jLWNvcHktZnJlZSBzZXF1ZW5jZS4KKworICBJZiBwIGlzIG51bGwsIHJlYWxsb2MgaXMgZXF1aXZhbGVudCB0byBtYWxsb2MuCisKKyAgSWYgc3BhY2UgaXMgbm90IGF2YWlsYWJsZSwgcmVhbGxvYyByZXR1cm5zIG51bGwsIGVycm5vIGlzIHNldCAoaWYgb24KKyAgQU5TSSkgYW5kIHAgaXMgTk9UIGZyZWVkLgorCisgIGlmIG4gaXMgZm9yIGZld2VyIGJ5dGVzIHRoYW4gYWxyZWFkeSBoZWxkIGJ5IHAsIHRoZSBuZXdseSB1bnVzZWQKKyAgc3BhY2UgaXMgbG9wcGVkIG9mZiBhbmQgZnJlZWQgaWYgcG9zc2libGUuICByZWFsbG9jIHdpdGggYSBzaXplCisgIGFyZ3VtZW50IG9mIHplcm8gKHJlKWFsbG9jYXRlcyBhIG1pbmltdW0tc2l6ZWQgY2h1bmsuCisKKyAgVGhlIG9sZCB1bml4IHJlYWxsb2MgY29udmVudGlvbiBvZiBhbGxvd2luZyB0aGUgbGFzdC1mcmVlJ2QgY2h1bmsKKyAgdG8gYmUgdXNlZCBhcyBhbiBhcmd1bWVudCB0byByZWFsbG9jIGlzIG5vdCBzdXBwb3J0ZWQuCisqLworCit2b2lkKiBkbHJlYWxsb2Modm9pZCosIHNpemVfdCk7CisKKy8qCisgIG1lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBuKTsKKyAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgY2h1bmsgb2YgbiBieXRlcywgYWxpZ25lZAorICBpbiBhY2NvcmQgd2l0aCB0aGUgYWxpZ25tZW50IGFyZ3VtZW50LgorCisgIFRoZSBhbGlnbm1lbnQgYXJndW1lbnQgc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvLiBJZiB0aGUgYXJndW1lbnQgaXMKKyAgbm90IGEgcG93ZXIgb2YgdHdvLCB0aGUgbmVhcmVzdCBncmVhdGVyIHBvd2VyIGlzIHVzZWQuCisgIDgtYnl0ZSBhbGlnbm1lbnQgaXMgZ3VhcmFudGVlZCBieSBub3JtYWwgbWFsbG9jIGNhbGxzLCBzbyBkb24ndAorICBib3RoZXIgY2FsbGluZyBtZW1hbGlnbiB3aXRoIGFuIGFyZ3VtZW50IG9mIDggb3IgbGVzcy4KKworICBPdmVycmVsaWFuY2Ugb24gbWVtYWxpZ24gaXMgYSBzdXJlIHdheSB0byBmcmFnbWVudCBzcGFjZS4KKyovCit2b2lkKiBkbG1lbWFsaWduKHNpemVfdCwgc2l6ZV90KTsKKworLyoKKyAgdmFsbG9jKHNpemVfdCBuKTsKKyAgRXF1aXZhbGVudCB0byBtZW1hbGlnbihwYWdlc2l6ZSwgbiksIHdoZXJlIHBhZ2VzaXplIGlzIHRoZSBwYWdlCisgIHNpemUgb2YgdGhlIHN5c3RlbS4gSWYgdGhlIHBhZ2VzaXplIGlzIHVua25vd24sIDQwOTYgaXMgdXNlZC4KKyovCit2b2lkKiBkbHZhbGxvYyhzaXplX3QpOworCisvKgorICBtYWxsb3B0KGludCBwYXJhbWV0ZXJfbnVtYmVyLCBpbnQgcGFyYW1ldGVyX3ZhbHVlKQorICBTZXRzIHR1bmFibGUgcGFyYW1ldGVycyBUaGUgZm9ybWF0IGlzIHRvIHByb3ZpZGUgYQorICAocGFyYW1ldGVyLW51bWJlciwgcGFyYW1ldGVyLXZhbHVlKSBwYWlyLiAgbWFsbG9wdCB0aGVuIHNldHMgdGhlCisgIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHRvIHRoZSBhcmd1bWVudCB2YWx1ZSBpZiBpdCBjYW4gKGkuZS4sIHNvCisgIGxvbmcgYXMgdGhlIHZhbHVlIGlzIG1lYW5pbmdmdWwpLCBhbmQgcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwgZWxzZQorICAwLiAgU1ZJRC9YUEcvQU5TSSBkZWZpbmVzIGZvdXIgc3RhbmRhcmQgcGFyYW0gbnVtYmVycyBmb3IgbWFsbG9wdCwKKyAgbm9ybWFsbHkgZGVmaW5lZCBpbiBtYWxsb2MuaC4gIE5vbmUgb2YgdGhlc2UgYXJlIHVzZSBpbiB0aGlzIG1hbGxvYywKKyAgc28gc2V0dGluZyB0aGVtIGhhcyBubyBlZmZlY3QuIEJ1dCB0aGlzIG1hbGxvYyBhbHNvIHN1cHBvcnRzIG90aGVyCisgIG9wdGlvbnMgaW4gbWFsbG9wdC4gU2VlIGJlbG93IGZvciBkZXRhaWxzLiAgQnJpZWZseSwgc3VwcG9ydGVkCisgIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3MgKGxpc3RlZCBkZWZhdWx0cyBhcmUgZm9yICJ0eXBpY2FsIgorICBjb25maWd1cmF0aW9ucykuCisKKyAgU3ltYm9sICAgICAgICAgICAgcGFyYW0gIyAgZGVmYXVsdCAgICBhbGxvd2VkIHBhcmFtIHZhbHVlcworICBNX1RSSU1fVEhSRVNIT0xEICAgICAtMSAgIDIqMTAyNCoxMDI0ICAgYW55ICAgKE1BWF9TSVpFX1QgZGlzYWJsZXMpCisgIE1fR1JBTlVMQVJJVFkgICAgICAgIC0yICAgICBwYWdlIHNpemUgICBhbnkgcG93ZXIgb2YgMiA+PSBwYWdlIHNpemUKKyAgTV9NTUFQX1RIUkVTSE9MRCAgICAgLTMgICAgICAyNTYqMTAyNCAgIGFueSAgIChvciAwIGlmIG5vIE1NQVAgc3VwcG9ydCkKKyovCitpbnQgZGxtYWxsb3B0KGludCwgaW50KTsKKworLyoKKyAgbWFsbG9jX2Zvb3RwcmludCgpOworICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2J0YWluZWQgZnJvbSB0aGUgc3lzdGVtLiAgVGhlIHRvdGFsCisgIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgYnkgbWFsbG9jLCByZWFsbG9jIGV0Yy4sIGlzIGxlc3MgdGhhbiB0aGlzCisgIHZhbHVlLiBVbmxpa2UgbWFsbGluZm8sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBvbmx5IGEgcHJlY29tcHV0ZWQKKyAgcmVzdWx0LCBzbyBjYW4gYmUgY2FsbGVkIGZyZXF1ZW50bHkgdG8gbW9uaXRvciBtZW1vcnkgY29uc3VtcHRpb24uCisgIEV2ZW4gaWYgbG9ja3MgYXJlIG90aGVyd2lzZSBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSB0aGVtLAorICBzbyByZXN1bHRzIG1pZ2h0IG5vdCBiZSB1cCB0byBkYXRlLgorKi8KK3NpemVfdCBkbG1hbGxvY19mb290cHJpbnQodm9pZCk7CisKKy8qCisgIG1hbGxvY19tYXhfZm9vdHByaW50KCk7CisgIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9idGFpbmVkIGZyb20gdGhlIHN5c3RlbS4gVGhpcworICB2YWx1ZSB3aWxsIGJlIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGZvb3RwcmludCBpZiBkZWFsbG9jYXRlZCBzcGFjZQorICBoYXMgYmVlbiByZWNsYWltZWQgYnkgdGhlIHN5c3RlbS4gVGhlIHBlYWsgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZAorICBieSBtYWxsb2MsIHJlYWxsb2MgZXRjLiwgaXMgbGVzcyB0aGFuIHRoaXMgdmFsdWUuIFVubGlrZSBtYWxsaW5mbywKKyAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG9ubHkgYSBwcmVjb21wdXRlZCByZXN1bHQsIHNvIGNhbiBiZSBjYWxsZWQKKyAgZnJlcXVlbnRseSB0byBtb25pdG9yIG1lbW9yeSBjb25zdW1wdGlvbi4gIEV2ZW4gaWYgbG9ja3MgYXJlCisgIG90aGVyd2lzZSBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSB0aGVtLCBzbyByZXN1bHRzIG1pZ2h0CisgIG5vdCBiZSB1cCB0byBkYXRlLgorKi8KK3NpemVfdCBkbG1hbGxvY19tYXhfZm9vdHByaW50KHZvaWQpOworCisjaWYgIU5PX01BTExJTkZPCisvKgorICBtYWxsaW5mbygpCisgIFJldHVybnMgKGJ5IGNvcHkpIGEgc3RydWN0IGNvbnRhaW5pbmcgdmFyaW91cyBzdW1tYXJ5IHN0YXRpc3RpY3M6CisKKyAgYXJlbmE6ICAgICBjdXJyZW50IHRvdGFsIG5vbi1tbWFwcGVkIGJ5dGVzIGFsbG9jYXRlZCBmcm9tIHN5c3RlbQorICBvcmRibGtzOiAgIHRoZSBudW1iZXIgb2YgZnJlZSBjaHVua3MKKyAgc21ibGtzOiAgICBhbHdheXMgemVyby4KKyAgaGJsa3M6ICAgICBjdXJyZW50IG51bWJlciBvZiBtbWFwcGVkIHJlZ2lvbnMKKyAgaGJsa2hkOiAgICB0b3RhbCBieXRlcyBoZWxkIGluIG1tYXBwZWQgcmVnaW9ucworICB1c21ibGtzOiAgIHRoZSBtYXhpbXVtIHRvdGFsIGFsbG9jYXRlZCBzcGFjZS4gVGhpcyB3aWxsIGJlIGdyZWF0ZXIKKyAgICAgICAgICAgICAgICB0aGFuIGN1cnJlbnQgdG90YWwgaWYgdHJpbW1pbmcgaGFzIG9jY3VycmVkLgorICBmc21ibGtzOiAgIGFsd2F5cyB6ZXJvCisgIHVvcmRibGtzOiAgY3VycmVudCB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UgKG5vcm1hbCBvciBtbWFwcGVkKQorICBmb3JkYmxrczogIHRvdGFsIGZyZWUgc3BhY2UKKyAga2VlcGNvc3Q6ICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBpZGVhbGx5IGJlIHJlbGVhc2VkCisgICAgICAgICAgICAgICBiYWNrIHRvIHN5c3RlbSB2aWEgbWFsbG9jX3RyaW0uICgiaWRlYWxseSIgbWVhbnMgdGhhdAorICAgICAgICAgICAgICAgaXQgaWdub3JlcyBwYWdlIHJlc3RyaWN0aW9ucyBldGMuKQorCisgIEJlY2F1c2UgdGhlc2UgZmllbGRzIGFyZSBpbnRzLCBidXQgaW50ZXJuYWwgYm9va2tlZXBpbmcgbWF5CisgIGJlIGtlcHQgYXMgbG9uZ3MsIHRoZSByZXBvcnRlZCB2YWx1ZXMgbWF5IHdyYXAgYXJvdW5kIHplcm8gYW5kCisgIHRodXMgYmUgaW5hY2N1cmF0ZS4KKyovCitzdHJ1Y3QgbWFsbGluZm8gZGxtYWxsaW5mbyh2b2lkKTsKKyNlbmRpZiAvKiBOT19NQUxMSU5GTyAqLworCisvKgorICBpbmRlcGVuZGVudF9jYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUsIHZvaWQqIGNodW5rc1tdKTsKKworICBpbmRlcGVuZGVudF9jYWxsb2MgaXMgc2ltaWxhciB0byBjYWxsb2MsIGJ1dCBpbnN0ZWFkIG9mIHJldHVybmluZyBhCisgIHNpbmdsZSBjbGVhcmVkIHNwYWNlLCBpdCByZXR1cm5zIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIG5fZWxlbWVudHMKKyAgaW5kZXBlbmRlbnQgZWxlbWVudHMgdGhhdCBjYW4gaG9sZCBjb250ZW50cyBvZiBzaXplIGVsZW1fc2l6ZSwgZWFjaAorICBvZiB3aGljaCBzdGFydHMgb3V0IGNsZWFyZWQsIGFuZCBjYW4gYmUgaW5kZXBlbmRlbnRseSBmcmVlZCwKKyAgcmVhbGxvYydlZCBldGMuIFRoZSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBhZGphY2VudGx5CisgIGFsbG9jYXRlZCAodGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBvY2N1ciB3aXRoIG11bHRpcGxlIGNhbGxvY3Mgb3IKKyAgbWFsbG9jcyksIHdoaWNoIG1heSBhbHNvIGltcHJvdmUgY2FjaGUgbG9jYWxpdHkgaW4gc29tZQorICBhcHBsaWNhdGlvbnMuCisKKyAgVGhlICJjaHVua3MiIGFyZ3VtZW50IGlzIG9wdGlvbmFsIChpLmUuLCBtYXkgYmUgbnVsbCwgd2hpY2ggaXMKKyAgcHJvYmFibHkgdGhlIG1vc3QgdHlwaWNhbCB1c2FnZSkuIElmIGl0IGlzIG51bGwsIHRoZSByZXR1cm5lZCBhcnJheQorICBpcyBpdHNlbGYgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBzaG91bGQgYWxzbyBiZSBmcmVlZCB3aGVuIGl0IGlzCisgIG5vIGxvbmdlciBuZWVkZWQuIE90aGVyd2lzZSwgdGhlIGNodW5rcyBhcnJheSBtdXN0IGJlIG9mIGF0IGxlYXN0CisgIG5fZWxlbWVudHMgaW4gbGVuZ3RoLiBJdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgcG9pbnRlcnMgdG8gdGhlCisgIGNodW5rcy4KKworICBJbiBlaXRoZXIgY2FzZSwgaW5kZXBlbmRlbnRfY2FsbG9jIHJldHVybnMgdGhpcyBwb2ludGVyIGFycmF5LCBvcgorICBudWxsIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZC4gIElmIG5fZWxlbWVudHMgaXMgemVybyBhbmQgImNodW5rcyIKKyAgaXMgbnVsbCwgaXQgcmV0dXJucyBhIGNodW5rIHJlcHJlc2VudGluZyBhbiBhcnJheSB3aXRoIHplcm8gZWxlbWVudHMKKyAgKHdoaWNoIHNob3VsZCBiZSBmcmVlZCBpZiBub3Qgd2FudGVkKS4KKworICBFYWNoIGVsZW1lbnQgbXVzdCBiZSBpbmRpdmlkdWFsbHkgZnJlZWQgd2hlbiBpdCBpcyBubyBsb25nZXIKKyAgbmVlZGVkLiBJZiB5b3UnZCBsaWtlIHRvIGluc3RlYWQgYmUgYWJsZSB0byBmcmVlIGFsbCBhdCBvbmNlLCB5b3UKKyAgc2hvdWxkIGluc3RlYWQgdXNlIHJlZ3VsYXIgY2FsbG9jIGFuZCBhc3NpZ24gcG9pbnRlcnMgaW50byB0aGlzCisgIHNwYWNlIHRvIHJlcHJlc2VudCBlbGVtZW50cy4gIChJbiB0aGlzIGNhc2UgdGhvdWdoLCB5b3UgY2Fubm90CisgIGluZGVwZW5kZW50bHkgZnJlZSBlbGVtZW50cy4pCisKKyAgaW5kZXBlbmRlbnRfY2FsbG9jIHNpbXBsaWZpZXMgYW5kIHNwZWVkcyB1cCBpbXBsZW1lbnRhdGlvbnMgb2YgbWFueQorICBraW5kcyBvZiBwb29scy4gIEl0IG1heSBhbHNvIGJlIHVzZWZ1bCB3aGVuIGNvbnN0cnVjdGluZyBsYXJnZSBkYXRhCisgIHN0cnVjdHVyZXMgdGhhdCBpbml0aWFsbHkgaGF2ZSBhIGZpeGVkIG51bWJlciBvZiBmaXhlZC1zaXplZCBub2RlcywKKyAgYnV0IHRoZSBudW1iZXIgaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZSwgYW5kIHNvbWUgb2YgdGhlIG5vZGVzCisgIG1heSBsYXRlciBuZWVkIHRvIGJlIGZyZWVkLiBGb3IgZXhhbXBsZToKKworICBzdHJ1Y3QgTm9kZSB7IGludCBpdGVtOyBzdHJ1Y3QgTm9kZSogbmV4dDsgfTsKKworICBzdHJ1Y3QgTm9kZSogYnVpbGRfbGlzdCgpIHsKKyAgICBzdHJ1Y3QgTm9kZSoqIHBvb2w7CisgICAgaW50IG4gPSByZWFkX251bWJlcl9vZl9ub2Rlc19uZWVkZWQoKTsKKyAgICBpZiAobiA8PSAwKSByZXR1cm4gMDsKKyAgICBwb29sID0gKHN0cnVjdCBOb2RlKiopKGluZGVwZW5kZW50X2NhbGxvYyhuLCBzaXplb2Yoc3RydWN0IE5vZGUpLCAwKTsKKyAgICBpZiAocG9vbCA9PSAwKSBkaWUoKTsKKyAgICAvLyBvcmdhbml6ZSBpbnRvIGEgbGlua2VkIGxpc3QuLi4KKyAgICBzdHJ1Y3QgTm9kZSogZmlyc3QgPSBwb29sWzBdOworICAgIGZvciAoaSA9IDA7IGkgPCBuLTE7ICsraSkKKyAgICAgIHBvb2xbaV0tPm5leHQgPSBwb29sW2krMV07CisgICAgZnJlZShwb29sKTsgICAgIC8vIENhbiBub3cgZnJlZSB0aGUgYXJyYXkgKG9yIG5vdCwgaWYgaXQgaXMgbmVlZGVkIGxhdGVyKQorICAgIHJldHVybiBmaXJzdDsKKyAgfQorKi8KK3ZvaWQqKiBkbGluZGVwZW5kZW50X2NhbGxvYyhzaXplX3QsIHNpemVfdCwgdm9pZCoqKTsKKworLyoKKyAgaW5kZXBlbmRlbnRfY29tYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBzaXplc1tdLCB2b2lkKiBjaHVua3NbXSk7CisKKyAgaW5kZXBlbmRlbnRfY29tYWxsb2MgYWxsb2NhdGVzLCBhbGwgYXQgb25jZSwgYSBzZXQgb2Ygbl9lbGVtZW50cworICBjaHVua3Mgd2l0aCBzaXplcyBpbmRpY2F0ZWQgaW4gdGhlICJzaXplcyIgYXJyYXkuICAgIEl0IHJldHVybnMKKyAgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlc2UgZWxlbWVudHMsIGVhY2ggb2Ygd2hpY2ggY2FuIGJlCisgIGluZGVwZW5kZW50bHkgZnJlZWQsIHJlYWxsb2MnZWQgZXRjLiBUaGUgZWxlbWVudHMgYXJlIGd1YXJhbnRlZWQgdG8KKyAgYmUgYWRqYWNlbnRseSBhbGxvY2F0ZWQgKHRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aAorICBtdWx0aXBsZSBjYWxsb2NzIG9yIG1hbGxvY3MpLCB3aGljaCBtYXkgYWxzbyBpbXByb3ZlIGNhY2hlIGxvY2FsaXR5CisgIGluIHNvbWUgYXBwbGljYXRpb25zLgorCisgIFRoZSAiY2h1bmtzIiBhcmd1bWVudCBpcyBvcHRpb25hbCAoaS5lLiwgbWF5IGJlIG51bGwpLiBJZiBpdCBpcyBudWxsCisgIHRoZSByZXR1cm5lZCBhcnJheSBpcyBpdHNlbGYgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBzaG91bGQgYWxzbworICBiZSBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuIE90aGVyd2lzZSwgdGhlIGNodW5rcyBhcnJheQorICBtdXN0IGJlIG9mIGF0IGxlYXN0IG5fZWxlbWVudHMgaW4gbGVuZ3RoLiBJdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUKKyAgcG9pbnRlcnMgdG8gdGhlIGNodW5rcy4KKworICBJbiBlaXRoZXIgY2FzZSwgaW5kZXBlbmRlbnRfY29tYWxsb2MgcmV0dXJucyB0aGlzIHBvaW50ZXIgYXJyYXksIG9yCisgIG51bGwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLiAgSWYgbl9lbGVtZW50cyBpcyB6ZXJvIGFuZCBjaHVua3MgaXMKKyAgbnVsbCwgaXQgcmV0dXJucyBhIGNodW5rIHJlcHJlc2VudGluZyBhbiBhcnJheSB3aXRoIHplcm8gZWxlbWVudHMKKyAgKHdoaWNoIHNob3VsZCBiZSBmcmVlZCBpZiBub3Qgd2FudGVkKS4KKworICBFYWNoIGVsZW1lbnQgbXVzdCBiZSBpbmRpdmlkdWFsbHkgZnJlZWQgd2hlbiBpdCBpcyBubyBsb25nZXIKKyAgbmVlZGVkLiBJZiB5b3UnZCBsaWtlIHRvIGluc3RlYWQgYmUgYWJsZSB0byBmcmVlIGFsbCBhdCBvbmNlLCB5b3UKKyAgc2hvdWxkIGluc3RlYWQgdXNlIGEgc2luZ2xlIHJlZ3VsYXIgbWFsbG9jLCBhbmQgYXNzaWduIHBvaW50ZXJzIGF0CisgIHBhcnRpY3VsYXIgb2Zmc2V0cyBpbiB0aGUgYWdncmVnYXRlIHNwYWNlLiAoSW4gdGhpcyBjYXNlIHRob3VnaCwgeW91CisgIGNhbm5vdCBpbmRlcGVuZGVudGx5IGZyZWUgZWxlbWVudHMuKQorCisgIGluZGVwZW5kZW50X2NvbWFsbGFjIGRpZmZlcnMgZnJvbSBpbmRlcGVuZGVudF9jYWxsb2MgaW4gdGhhdCBlYWNoCisgIGVsZW1lbnQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgc2l6ZSwgYW5kIGFsc28gdGhhdCBpdCBkb2VzIG5vdAorICBhdXRvbWF0aWNhbGx5IGNsZWFyIGVsZW1lbnRzLgorCisgIGluZGVwZW5kZW50X2NvbWFsbG9jIGNhbiBiZSB1c2VkIHRvIHNwZWVkIHVwIGFsbG9jYXRpb24gaW4gY2FzZXMKKyAgd2hlcmUgc2V2ZXJhbCBzdHJ1Y3RzIG9yIG9iamVjdHMgbXVzdCBhbHdheXMgYmUgYWxsb2NhdGVkIGF0IHRoZQorICBzYW1lIHRpbWUuICBGb3IgZXhhbXBsZToKKworICBzdHJ1Y3QgSGVhZCB7IC4uLiB9CisgIHN0cnVjdCBGb290IHsgLi4uIH0KKworICB2b2lkIHNlbmRfbWVzc2FnZShjaGFyKiBtc2cpIHsKKyAgICBpbnQgbXNnbGVuID0gc3RybGVuKG1zZyk7CisgICAgc2l6ZV90IHNpemVzWzNdID0geyBzaXplb2Yoc3RydWN0IEhlYWQpLCBtc2dsZW4sIHNpemVvZihzdHJ1Y3QgRm9vdCkgfTsKKyAgICB2b2lkKiBjaHVua3NbM107CisgICAgaWYgKGluZGVwZW5kZW50X2NvbWFsbG9jKDMsIHNpemVzLCBjaHVua3MpID09IDApCisgICAgICBkaWUoKTsKKyAgICBzdHJ1Y3QgSGVhZCogaGVhZCA9IChzdHJ1Y3QgSGVhZCopKGNodW5rc1swXSk7CisgICAgY2hhciogICAgICAgIGJvZHkgPSAoY2hhciopKGNodW5rc1sxXSk7CisgICAgc3RydWN0IEZvb3QqIGZvb3QgPSAoc3RydWN0IEZvb3QqKShjaHVua3NbMl0pOworICAgIC8vIC4uLgorICB9CisKKyAgSW4gZ2VuZXJhbCB0aG91Z2gsIGluZGVwZW5kZW50X2NvbWFsbG9jIGlzIHdvcnRoIHVzaW5nIG9ubHkgZm9yCisgIGxhcmdlciB2YWx1ZXMgb2Ygbl9lbGVtZW50cy4gRm9yIHNtYWxsIHZhbHVlcywgeW91IHByb2JhYmx5IHdvbid0CisgIGRldGVjdCBlbm91Z2ggZGlmZmVyZW5jZSBmcm9tIHNlcmllcyBvZiBtYWxsb2MgY2FsbHMgdG8gYm90aGVyLgorCisgIE92ZXJ1c2Ugb2YgaW5kZXBlbmRlbnRfY29tYWxsb2MgY2FuIGluY3JlYXNlIG92ZXJhbGwgbWVtb3J5IHVzYWdlLAorICBzaW5jZSBpdCBjYW5ub3QgcmV1c2UgZXhpc3Rpbmcgbm9uY29udGlndW91cyBzbWFsbCBjaHVua3MgdGhhdAorICBtaWdodCBiZSBhdmFpbGFibGUgZm9yIHNvbWUgb2YgdGhlIGVsZW1lbnRzLgorKi8KK3ZvaWQqKiBkbGluZGVwZW5kZW50X2NvbWFsbG9jKHNpemVfdCwgc2l6ZV90Kiwgdm9pZCoqKTsKKworCisvKgorICBwdmFsbG9jKHNpemVfdCBuKTsKKyAgRXF1aXZhbGVudCB0byB2YWxsb2MobWluaW11bS1wYWdlLXRoYXQtaG9sZHMobikpLCB0aGF0IGlzLAorICByb3VuZCB1cCBuIHRvIG5lYXJlc3QgcGFnZXNpemUuCisgKi8KK3ZvaWQqICBkbHB2YWxsb2Moc2l6ZV90KTsKKworLyoKKyAgbWFsbG9jX3RyaW0oc2l6ZV90IHBhZCk7CisKKyAgSWYgcG9zc2libGUsIGdpdmVzIG1lbW9yeSBiYWNrIHRvIHRoZSBzeXN0ZW0gKHZpYSBuZWdhdGl2ZSBhcmd1bWVudHMKKyAgdG8gc2JyaykgaWYgdGhlcmUgaXMgdW51c2VkIG1lbW9yeSBhdCB0aGUgYGhpZ2gnIGVuZCBvZiB0aGUgbWFsbG9jCisgIHBvb2wgb3IgaW4gdW51c2VkIE1NQVAgc2VnbWVudHMuIFlvdSBjYW4gY2FsbCB0aGlzIGFmdGVyIGZyZWVpbmcKKyAgbGFyZ2UgYmxvY2tzIG9mIG1lbW9yeSB0byBwb3RlbnRpYWxseSByZWR1Y2UgdGhlIHN5c3RlbS1sZXZlbCBtZW1vcnkKKyAgcmVxdWlyZW1lbnRzIG9mIGEgcHJvZ3JhbS4gSG93ZXZlciwgaXQgY2Fubm90IGd1YXJhbnRlZSB0byByZWR1Y2UKKyAgbWVtb3J5LiBVbmRlciBzb21lIGFsbG9jYXRpb24gcGF0dGVybnMsIHNvbWUgbGFyZ2UgZnJlZSBibG9ja3Mgb2YKKyAgbWVtb3J5IHdpbGwgYmUgbG9ja2VkIGJldHdlZW4gdHdvIHVzZWQgY2h1bmtzLCBzbyB0aGV5IGNhbm5vdCBiZQorICBnaXZlbiBiYWNrIHRvIHRoZSBzeXN0ZW0uCisKKyAgVGhlIGBwYWQnIGFyZ3VtZW50IHRvIG1hbGxvY190cmltIHJlcHJlc2VudHMgdGhlIGFtb3VudCBvZiBmcmVlCisgIHRyYWlsaW5nIHNwYWNlIHRvIGxlYXZlIHVudHJpbW1lZC4gSWYgdGhpcyBhcmd1bWVudCBpcyB6ZXJvLCBvbmx5CisgIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBtZW1vcnkgdG8gbWFpbnRhaW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCisgIHdpbGwgYmUgbGVmdC4gTm9uLXplcm8gYXJndW1lbnRzIGNhbiBiZSBzdXBwbGllZCB0byBtYWludGFpbiBlbm91Z2gKKyAgdHJhaWxpbmcgc3BhY2UgdG8gc2VydmljZSBmdXR1cmUgZXhwZWN0ZWQgYWxsb2NhdGlvbnMgd2l0aG91dCBoYXZpbmcKKyAgdG8gcmUtb2J0YWluIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0uCisKKyAgTWFsbG9jX3RyaW0gcmV0dXJucyAxIGlmIGl0IGFjdHVhbGx5IHJlbGVhc2VkIGFueSBtZW1vcnksIGVsc2UgMC4KKyovCitpbnQgIGRsbWFsbG9jX3RyaW0oc2l6ZV90KTsKKworLyoKKyAgbWFsbG9jX3VzYWJsZV9zaXplKHZvaWQqIHApOworCisgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB5b3UgY2FuIGFjdHVhbGx5IHVzZSBpbgorICBhbiBhbGxvY2F0ZWQgY2h1bmssIHdoaWNoIG1heSBiZSBtb3JlIHRoYW4geW91IHJlcXVlc3RlZCAoYWx0aG91Z2gKKyAgb2Z0ZW4gbm90KSBkdWUgdG8gYWxpZ25tZW50IGFuZCBtaW5pbXVtIHNpemUgY29uc3RyYWludHMuCisgIFlvdSBjYW4gdXNlIHRoaXMgbWFueSBieXRlcyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0CisgIG92ZXJ3cml0aW5nIG90aGVyIGFsbG9jYXRlZCBvYmplY3RzLiBUaGlzIGlzIG5vdCBhIHBhcnRpY3VsYXJseSBncmVhdAorICBwcm9ncmFtbWluZyBwcmFjdGljZS4gbWFsbG9jX3VzYWJsZV9zaXplIGNhbiBiZSBtb3JlIHVzZWZ1bCBpbgorICBkZWJ1Z2dpbmcgYW5kIGFzc2VydGlvbnMsIGZvciBleGFtcGxlOgorCisgIHAgPSBtYWxsb2Mobik7CisgIGFzc2VydChtYWxsb2NfdXNhYmxlX3NpemUocCkgPj0gMjU2KTsKKyovCitzaXplX3QgZGxtYWxsb2NfdXNhYmxlX3NpemUodm9pZCopOworCisvKgorICBtYWxsb2Nfc3RhdHMoKTsKKyAgUHJpbnRzIG9uIHN0ZGVyciB0aGUgYW1vdW50IG9mIHNwYWNlIG9idGFpbmVkIGZyb20gdGhlIHN5c3RlbSAoYm90aAorICB2aWEgc2JyayBhbmQgbW1hcCksIHRoZSBtYXhpbXVtIGFtb3VudCAod2hpY2ggbWF5IGJlIG1vcmUgdGhhbgorICBjdXJyZW50IGlmIG1hbGxvY190cmltIGFuZC9vciBtdW5tYXAgZ290IGNhbGxlZCksIGFuZCB0aGUgY3VycmVudAorICBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIHZpYSBtYWxsb2MgKG9yIHJlYWxsb2MsIGV0YykgYnV0IG5vdCB5ZXQKKyAgZnJlZWQuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkLCBub3QgdGhlCisgIG51bWJlciByZXF1ZXN0ZWQuIEl0IHdpbGwgYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciByZXF1ZXN0ZWQKKyAgYmVjYXVzZSBvZiBhbGlnbm1lbnQgYW5kIGJvb2trZWVwaW5nIG92ZXJoZWFkLiBCZWNhdXNlIGl0IGluY2x1ZGVzCisgIGFsaWdubWVudCB3YXN0YWdlIGFzIGJlaW5nIGluIHVzZSwgdGhpcyBmaWd1cmUgbWF5IGJlIGdyZWF0ZXIgdGhhbgorICB6ZXJvIGV2ZW4gd2hlbiBubyB1c2VyLWxldmVsIGNodW5rcyBhcmUgYWxsb2NhdGVkLgorCisgIFRoZSByZXBvcnRlZCBjdXJyZW50IGFuZCBtYXhpbXVtIHN5c3RlbSBtZW1vcnkgY2FuIGJlIGluYWNjdXJhdGUgaWYKKyAgYSBwcm9ncmFtIG1ha2VzIG90aGVyIGNhbGxzIHRvIHN5c3RlbSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMKKyAgKG5vcm1hbGx5IHNicmspIG91dHNpZGUgb2YgbWFsbG9jLgorCisgIG1hbGxvY19zdGF0cyBwcmludHMgb25seSB0aGUgbW9zdCBjb21tb25seSBpbnRlcmVzdGluZyBzdGF0aXN0aWNzLgorICBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIG1hbGxpbmZvLgorKi8KK3ZvaWQgIGRsbWFsbG9jX3N0YXRzKHZvaWQpOworCisjZW5kaWYgLyogT05MWV9NU1BBQ0VTICovCisKKyNpZiBNU1BBQ0VTCisKKy8qCisgIG1zcGFjZSBpcyBhbiBvcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYW4gaW5kZXBlbmRlbnQKKyAgcmVnaW9uIG9mIHNwYWNlIHRoYXQgc3VwcG9ydHMgbXNwYWNlX21hbGxvYywgZXRjLgorKi8KK3R5cGVkZWYgdm9pZCogbXNwYWNlOworCisvKgorICBjcmVhdGVfbXNwYWNlIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgaW5kZXBlbmRlbnQgc3BhY2Ugd2l0aCB0aGUKKyAgZ2l2ZW4gaW5pdGlhbCBjYXBhY2l0eSwgb3IsIGlmIDAsIHRoZSBkZWZhdWx0IGdyYW51bGFyaXR5IHNpemUuICBJdAorICByZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3lzdGVtIG1lbW9yeSBhdmFpbGFibGUgdG8gY3JlYXRlIHRoZQorICBzcGFjZS4gIElmIGFyZ3VtZW50IGxvY2tlZCBpcyBub24temVybywgdGhlIHNwYWNlIHVzZXMgYSBzZXBhcmF0ZQorICBsb2NrIHRvIGNvbnRyb2wgYWNjZXNzLiBUaGUgY2FwYWNpdHkgb2YgdGhlIHNwYWNlIHdpbGwgZ3JvdworICBkeW5hbWljYWxseSBhcyBuZWVkZWQgdG8gc2VydmljZSBtc3BhY2VfbWFsbG9jIHJlcXVlc3RzLiAgWW91IGNhbgorICBjb250cm9sIHRoZSBzaXplcyBvZiBpbmNyZW1lbnRhbCBpbmNyZWFzZXMgb2YgdGhpcyBzcGFjZSBieQorICBjb21waWxpbmcgd2l0aCBhIGRpZmZlcmVudCBERUZBVUxUX0dSQU5VTEFSSVRZIG9yIGR5bmFtaWNhbGx5CisgIHNldHRpbmcgd2l0aCBtYWxsb3B0KE1fR1JBTlVMQVJJVFksIHZhbHVlKS4KKyovCittc3BhY2UgY3JlYXRlX21zcGFjZShzaXplX3QgY2FwYWNpdHksIGludCBsb2NrZWQpOworCisvKgorICBkZXN0cm95X21zcGFjZSBkZXN0cm95cyB0aGUgZ2l2ZW4gc3BhY2UsIGFuZCBhdHRlbXB0cyB0byByZXR1cm4gYWxsCisgIG9mIGl0cyBtZW1vcnkgYmFjayB0byB0aGUgc3lzdGVtLCByZXR1cm5pbmcgdGhlIHRvdGFsIG51bWJlciBvZgorICBieXRlcyBmcmVlZC4gQWZ0ZXIgZGVzdHJ1Y3Rpb24sIHRoZSByZXN1bHRzIG9mIGFjY2VzcyB0byBhbGwgbWVtb3J5CisgIHVzZWQgYnkgdGhlIHNwYWNlIGJlY29tZSB1bmRlZmluZWQuCisqLworc2l6ZV90IGRlc3Ryb3lfbXNwYWNlKG1zcGFjZSBtc3ApOworCisvKgorICBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZSB1c2VzIHRoZSBtZW1vcnkgc3VwcGxpZWQgYXMgdGhlIGluaXRpYWwgYmFzZQorICBvZiBhIG5ldyBtc3BhY2UuIFBhcnQgKGxlc3MgdGhhbiAxMjgqc2l6ZW9mKHNpemVfdCkgYnl0ZXMpIG9mIHRoaXMKKyAgc3BhY2UgaXMgdXNlZCBmb3IgYm9va2tlZXBpbmcsIHNvIHRoZSBjYXBhY2l0eSBtdXN0IGJlIGF0IGxlYXN0IHRoaXMKKyAgbGFyZ2UuIChPdGhlcndpc2UgMCBpcyByZXR1cm5lZC4pIFdoZW4gdGhpcyBpbml0aWFsIHNwYWNlIGlzCisgIGV4aGF1c3RlZCwgYWRkaXRpb25hbCBtZW1vcnkgd2lsbCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBzeXN0ZW0uCisgIERlc3Ryb3lpbmcgdGhpcyBzcGFjZSB3aWxsIGRlYWxsb2NhdGUgYWxsIGFkZGl0aW9uYWxseSBhbGxvY2F0ZWQKKyAgc3BhY2UgKGlmIHBvc3NpYmxlKSBidXQgbm90IHRoZSBpbml0aWFsIGJhc2UuCisqLworbXNwYWNlIGNyZWF0ZV9tc3BhY2Vfd2l0aF9iYXNlKHZvaWQqIGJhc2UsIHNpemVfdCBjYXBhY2l0eSwgaW50IGxvY2tlZCk7CisKKy8qCisgIG1zcGFjZV9tYWxsb2MgYmVoYXZlcyBhcyBtYWxsb2MsIGJ1dCBvcGVyYXRlcyB3aXRoaW4KKyAgdGhlIGdpdmVuIHNwYWNlLgorKi8KK3ZvaWQqIG1zcGFjZV9tYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IGJ5dGVzKTsKKworLyoKKyAgbXNwYWNlX2ZyZWUgYmVoYXZlcyBhcyBmcmVlLCBidXQgb3BlcmF0ZXMgd2l0aGluCisgIHRoZSBnaXZlbiBzcGFjZS4KKworICBJZiBjb21waWxlZCB3aXRoIEZPT1RFUlM9PTEsIG1zcGFjZV9mcmVlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQuCisgIGZyZWUgbWF5IGJlIGNhbGxlZCBpbnN0ZWFkIG9mIG1zcGFjZV9mcmVlIGJlY2F1c2UgZnJlZWQgY2h1bmtzIGZyb20KKyAgYW55IHNwYWNlIGFyZSBoYW5kbGVkIGJ5IHRoZWlyIG9yaWdpbmF0aW5nIHNwYWNlcy4KKyovCit2b2lkIG1zcGFjZV9mcmVlKG1zcGFjZSBtc3AsIHZvaWQqIG1lbSk7CisKKy8qCisgIG1zcGFjZV9yZWFsbG9jIGJlaGF2ZXMgYXMgcmVhbGxvYywgYnV0IG9wZXJhdGVzIHdpdGhpbgorICB0aGUgZ2l2ZW4gc3BhY2UuCisKKyAgSWYgY29tcGlsZWQgd2l0aCBGT09URVJTPT0xLCBtc3BhY2VfcmVhbGxvYyBpcyBub3QgYWN0dWFsbHkKKyAgbmVlZGVkLiAgcmVhbGxvYyBtYXkgYmUgY2FsbGVkIGluc3RlYWQgb2YgbXNwYWNlX3JlYWxsb2MgYmVjYXVzZQorICByZWFsbG9jZWQgY2h1bmtzIGZyb20gYW55IHNwYWNlIGFyZSBoYW5kbGVkIGJ5IHRoZWlyIG9yaWdpbmF0aW5nCisgIHNwYWNlcy4KKyovCit2b2lkKiBtc3BhY2VfcmVhbGxvYyhtc3BhY2UgbXNwLCB2b2lkKiBtZW0sIHNpemVfdCBuZXdzaXplKTsKKworLyoKKyAgbXNwYWNlX2NhbGxvYyBiZWhhdmVzIGFzIGNhbGxvYywgYnV0IG9wZXJhdGVzIHdpdGhpbgorICB0aGUgZ2l2ZW4gc3BhY2UuCisqLwordm9pZCogbXNwYWNlX2NhbGxvYyhtc3BhY2UgbXNwLCBzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1fc2l6ZSk7CisKKy8qCisgIG1zcGFjZV9tZW1hbGlnbiBiZWhhdmVzIGFzIG1lbWFsaWduLCBidXQgb3BlcmF0ZXMgd2l0aGluCisgIHRoZSBnaXZlbiBzcGFjZS4KKyovCit2b2lkKiBtc3BhY2VfbWVtYWxpZ24obXNwYWNlIG1zcCwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IGJ5dGVzKTsKKworLyoKKyAgbXNwYWNlX2luZGVwZW5kZW50X2NhbGxvYyBiZWhhdmVzIGFzIGluZGVwZW5kZW50X2NhbGxvYywgYnV0CisgIG9wZXJhdGVzIHdpdGhpbiB0aGUgZ2l2ZW4gc3BhY2UuCisqLwordm9pZCoqIG1zcGFjZV9pbmRlcGVuZGVudF9jYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZWxlbV9zaXplLCB2b2lkKiBjaHVua3NbXSk7CisKKy8qCisgIG1zcGFjZV9pbmRlcGVuZGVudF9jb21hbGxvYyBiZWhhdmVzIGFzIGluZGVwZW5kZW50X2NvbWFsbG9jLCBidXQKKyAgb3BlcmF0ZXMgd2l0aGluIHRoZSBnaXZlbiBzcGFjZS4KKyovCit2b2lkKiogbXNwYWNlX2luZGVwZW5kZW50X2NvbWFsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZXNbXSwgdm9pZCogY2h1bmtzW10pOworCisvKgorICBtc3BhY2VfZm9vdHByaW50KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9idGFpbmVkIGZyb20gdGhlCisgIHN5c3RlbSBmb3IgdGhpcyBzcGFjZS4KKyovCitzaXplX3QgbXNwYWNlX2Zvb3RwcmludChtc3BhY2UgbXNwKTsKKworLyoKKyAgbXNwYWNlX21heF9mb290cHJpbnQoKSByZXR1cm5zIHRoZSBwZWFrIG51bWJlciBvZiBieXRlcyBvYnRhaW5lZCBmcm9tIHRoZQorICBzeXN0ZW0gZm9yIHRoaXMgc3BhY2UuCisqLworc2l6ZV90IG1zcGFjZV9tYXhfZm9vdHByaW50KG1zcGFjZSBtc3ApOworCisKKyNpZiAhTk9fTUFMTElORk8KKy8qCisgIG1zcGFjZV9tYWxsaW5mbyBiZWhhdmVzIGFzIG1hbGxpbmZvLCBidXQgcmVwb3J0cyBwcm9wZXJ0aWVzIG9mCisgIHRoZSBnaXZlbiBzcGFjZS4KKyovCitzdHJ1Y3QgbWFsbGluZm8gbXNwYWNlX21hbGxpbmZvKG1zcGFjZSBtc3ApOworI2VuZGlmIC8qIE5PX01BTExJTkZPICovCisKKy8qCisgIG1zcGFjZV9tYWxsb2Nfc3RhdHMgYmVoYXZlcyBhcyBtYWxsb2Nfc3RhdHMsIGJ1dCByZXBvcnRzCisgIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIHNwYWNlLgorKi8KK3ZvaWQgbXNwYWNlX21hbGxvY19zdGF0cyhtc3BhY2UgbXNwKTsKKworLyoKKyAgbXNwYWNlX3RyaW0gYmVoYXZlcyBhcyBtYWxsb2NfdHJpbSwgYnV0CisgIG9wZXJhdGVzIHdpdGhpbiB0aGUgZ2l2ZW4gc3BhY2UuCisqLworaW50IG1zcGFjZV90cmltKG1zcGFjZSBtc3AsIHNpemVfdCBwYWQpOworCisvKgorICBBbiBhbGlhcyBmb3IgbWFsbG9wdC4KKyovCitpbnQgbXNwYWNlX21hbGxvcHQoaW50LCBpbnQpOworCisjZW5kaWYgLyogTVNQQUNFUyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK307ICAvKiBlbmQgb2YgZXh0ZXJuICJDIiAqLworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUbyBtYWtlIGEgZnVsbHkgY3VzdG9taXphYmxlIG1hbGxvYy5oIGhlYWRlciBmaWxlLCBjdXQgZXZlcnl0aGluZworICBhYm92ZSB0aGlzIGxpbmUsIHB1dCBpbnRvIGZpbGUgbWFsbG9jLmgsIGVkaXQgdG8gc3VpdCwgYW5kICNpbmNsdWRlIGl0CisgIG9uIHRoZSBuZXh0IGxpbmUsIGFzIHdlbGwgYXMgaW4gcHJvZ3JhbXMgdGhhdCB1c2UgdGhpcyBtYWxsb2MuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyogI2luY2x1ZGUgIm1hbGxvYy5oIiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpbnRlcm5hbCAjaW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxNDYgKSAvKiBubyAidW5zaWduZWQiIHdhcm5pbmdzICovCisjZW5kaWYgLyogX01TQ19WRVIgKi8KKworI2lmbmRlZiBMQUNLU19TVERJT19ICisjaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgLyogZm9yIHByaW50aW5nIGluIG1hbGxvY19zdGF0cyAqLworI2VuZGlmCisKKyNpZm5kZWYgTEFDS1NfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+ICAgICAgIC8qIGZvciBNQUxMT0NfRkFJTFVSRV9BQ1RJT04gKi8KKyNlbmRpZiAvKiBMQUNLU19FUlJOT19IICovCisjaWYgRk9PVEVSUworI2luY2x1ZGUgPHRpbWUuaD4gICAgICAgIC8qIGZvciBtYWdpYyBpbml0aWFsaXphdGlvbiAqLworI2VuZGlmIC8qIEZPT1RFUlMgKi8KKyNpZm5kZWYgTEFDS1NfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAvKiBmb3IgYWJvcnQoKSAqLworI2VuZGlmIC8qIExBQ0tTX1NURExJQl9IICovCisjaWZkZWYgREVCVUcKKyNpZiBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRQorI2RlZmluZSBhc3NlcnQoeCkgaWYoISh4KSkgQUJPUlQKKyNlbHNlIC8qIEFCT1JUX09OX0FTU0VSVF9GQUlMVVJFICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYgLyogQUJPUlRfT05fQVNTRVJUX0ZBSUxVUkUgKi8KKyNlbHNlICAvKiBERUJVRyAqLworI2RlZmluZSBhc3NlcnQoeCkKKyNlbmRpZiAvKiBERUJVRyAqLworI2lmbmRlZiBMQUNLU19TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgIC8qIGZvciBtZW1zZXQgZXRjICovCisjZW5kaWYgIC8qIExBQ0tTX1NUUklOR19IICovCisjaWYgVVNFX0JVSUxUSU5fRkZTCisjaWZuZGVmIExBQ0tTX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4gICAgIC8qIGZvciBmZnMgKi8KKyNlbmRpZiAvKiBMQUNLU19TVFJJTkdTX0ggKi8KKyNlbmRpZiAvKiBVU0VfQlVJTFRJTl9GRlMgKi8KKyNpZiBIQVZFX01NQVAKKyNpZm5kZWYgTEFDS1NfU1lTX01NQU5fSAorI2luY2x1ZGUgPHN5cy9tbWFuLmg+ICAgIC8qIGZvciBtbWFwICovCisjZW5kaWYgLyogTEFDS1NfU1lTX01NQU5fSCAqLworI2lmbmRlZiBMQUNLU19GQ05UTF9ICisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZiAvKiBMQUNLU19GQ05UTF9IICovCisjZW5kaWYgLyogSEFWRV9NTUFQICovCisjaWYgSEFWRV9NT1JFQ09SRQorI2lmbmRlZiBMQUNLU19VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgLyogZm9yIHNicmsgKi8KKyNlbHNlIC8qIExBQ0tTX1VOSVNURF9IICovCisjaWYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKQorZXh0ZXJuIHZvaWQqICAgICBzYnJrKHB0cmRpZmZfdCk7CisjZW5kaWYgLyogRnJlZUJTRCBldGMgKi8KKyNlbmRpZiAvKiBMQUNLU19VTklTVERfSCAqLworI2VuZGlmIC8qIEhBVkVfTU1BUCAqLworCisjaWZuZGVmIFdJTjMyCisjaWZuZGVmIG1hbGxvY19nZXRwYWdlc2l6ZQorIyAgaWZkZWYgX1NDX1BBR0VTSVpFICAgICAgICAgLyogc29tZSBTVlI0IHN5c3RlbXMgb21pdCBhbiB1bmRlcnNjb3JlICovCisjICAgIGlmbmRlZiBfU0NfUEFHRV9TSVpFCisjICAgICAgZGVmaW5lIF9TQ19QQUdFX1NJWkUgX1NDX1BBR0VTSVpFCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgX1NDX1BBR0VfU0laRQorIyAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIHN5c2NvbmYoX1NDX1BBR0VfU0laRSkKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZChCU0QpIHx8IGRlZmluZWQoREdVWCkgfHwgZGVmaW5lZChIQVZFX0dFVFBBR0VTSVpFKQorICAgICAgIGV4dGVybiBzaXplX3QgZ2V0cGFnZXNpemUoKTsKKyMgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIGdldHBhZ2VzaXplKCkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFdJTjMyIC8qIHVzZSBzdXBwbGllZCBlbXVsYXRpb24gb2YgZ2V0cGFnZXNpemUgKi8KKyMgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgZ2V0cGFnZXNpemUoKQorIyAgICAgIGVsc2UKKyMgICAgICAgIGlmbmRlZiBMQUNLU19TWVNfUEFSQU1fSAorIyAgICAgICAgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICAgICAgIGVuZGlmCisjICAgICAgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgRVhFQ19QQUdFU0laRQorIyAgICAgICAgZWxzZQorIyAgICAgICAgICBpZmRlZiBOQlBHCisjICAgICAgICAgICAgaWZuZGVmIENMU0laRQorIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBOQlBHCisjICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSAoTkJQRyAqIENMU0laRSkKKyMgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgaWZkZWYgTkJQQworIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBOQlBDCisjICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBQQUdFU0laRQorIyAgICAgICAgICAgICAgZWxzZSAvKiBqdXN0IGd1ZXNzICovCisjICAgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgKChzaXplX3QpNDA5NlUpCisjICAgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICAgIGVuZGlmCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBzaXplX3QgYW5kIGFsaWdubWVudCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoZSBieXRlIGFuZCBiaXQgc2l6ZSBvZiBhIHNpemVfdCAqLworI2RlZmluZSBTSVpFX1RfU0laRSAgICAgICAgIChzaXplb2Yoc2l6ZV90KSkKKyNkZWZpbmUgU0laRV9UX0JJVFNJWkUgICAgICAoc2l6ZW9mKHNpemVfdCkgPDwgMykKKworLyogU29tZSBjb25zdGFudHMgY29lcmNlZCB0byBzaXplX3QgKi8KKy8qIEFubm95aW5nIGJ1dCBuZWNlc3NhcnkgdG8gYXZvaWQgZXJyb3JzIG9uIHNvbWUgcGxhZnRvcm1zICovCisjZGVmaW5lIFNJWkVfVF9aRVJPICAgICAgICAgKChzaXplX3QpMCkKKyNkZWZpbmUgU0laRV9UX09ORSAgICAgICAgICAoKHNpemVfdCkxKQorI2RlZmluZSBTSVpFX1RfVFdPICAgICAgICAgICgoc2l6ZV90KTIpCisjZGVmaW5lIFRXT19TSVpFX1RfU0laRVMgICAgKFNJWkVfVF9TSVpFPDwxKQorI2RlZmluZSBGT1VSX1NJWkVfVF9TSVpFUyAgIChTSVpFX1RfU0laRTw8MikKKyNkZWZpbmUgU0lYX1NJWkVfVF9TSVpFUyAgICAoRk9VUl9TSVpFX1RfU0laRVMrVFdPX1NJWkVfVF9TSVpFUykKKyNkZWZpbmUgSEFMRl9NQVhfU0laRV9UICAgICAoTUFYX1NJWkVfVCAvIDJVKQorCisvKiBUaGUgYml0IG1hc2sgdmFsdWUgY29ycmVzcG9uZGluZyB0byBNQUxMT0NfQUxJR05NRU5UICovCisjZGVmaW5lIENIVU5LX0FMSUdOX01BU0sgICAgKE1BTExPQ19BTElHTk1FTlQgLSBTSVpFX1RfT05FKQorCisvKiBUcnVlIGlmIGFkZHJlc3MgYSBoYXMgYWNjZXB0YWJsZSBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgaXNfYWxpZ25lZChBKSAgICAgICAoKChzaXplX3QpKChBKSkgJiAoQ0hVTktfQUxJR05fTUFTSykpID09IDApCisKKy8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gb2Zmc2V0IGFuIGFkZHJlc3MgdG8gYWxpZ24gaXQgKi8KKyNkZWZpbmUgYWxpZ25fb2Zmc2V0KEEpXAorICgoKChzaXplX3QpKEEpICYgQ0hVTktfQUxJR05fTUFTSykgPT0gMCk/IDAgOlwKKyAgKChNQUxMT0NfQUxJR05NRU5UIC0gKChzaXplX3QpKEEpICYgQ0hVTktfQUxJR05fTUFTSykpICYgQ0hVTktfQUxJR05fTUFTSykpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1NQVAgcHJlbGltaW5hcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgICBJZiBIQVZFX01PUkVDT1JFIG9yIEhBVkVfTU1BUCBhcmUgZmFsc2UsIHdlIGp1c3QgZGVmaW5lIGNhbGxzIGFuZAorICAgY2hlY2tzIHRvIGZhaWwgc28gY29tcGlsZXIgb3B0aW1pemVyIGNhbiBkZWxldGUgY29kZSByYXRoZXIgdGhhbgorICAgdXNpbmcgc28gbWFueSAiI2lmInMuCisqLworCisKKy8qIE1PUkVDT1JFIGFuZCBNTUFQIG11c3QgcmV0dXJuIE1GQUlMIG9uIGZhaWx1cmUgKi8KKyNkZWZpbmUgTUZBSUwgICAgICAgICAgICAgICAgKCh2b2lkKikoTUFYX1NJWkVfVCkpCisjZGVmaW5lIENNRkFJTCAgICAgICAgICAgICAgICgoY2hhciopKE1GQUlMKSkgLyogZGVmaW5lZCBmb3IgY29udmVuaWVuY2UgKi8KKworI2lmICFIQVZFX01NQVAKKyNkZWZpbmUgSVNfTU1BUFBFRF9CSVQgICAgICAgKFNJWkVfVF9aRVJPKQorI2RlZmluZSBVU0VfTU1BUF9CSVQgICAgICAgICAoU0laRV9UX1pFUk8pCisjZGVmaW5lIENBTExfTU1BUChzKSAgICAgICAgIE1GQUlMCisjZGVmaW5lIENBTExfTVVOTUFQKGEsIHMpICAgICgtMSkKKyNkZWZpbmUgRElSRUNUX01NQVAocykgICAgICAgTUZBSUwKKworI2Vsc2UgLyogSEFWRV9NTUFQICovCisjZGVmaW5lIElTX01NQVBQRURfQklUICAgICAgIChTSVpFX1RfT05FKQorI2RlZmluZSBVU0VfTU1BUF9CSVQgICAgICAgICAoU0laRV9UX09ORSkKKworI2lmbmRlZiBXSU4zMgorI2RlZmluZSBDQUxMX01VTk1BUChhLCBzKSAgICBtdW5tYXAoKGEpLCAocykpCisjZGVmaW5lIE1NQVBfUFJPVCAgICAgICAgICAgIChQUk9UX1JFQUR8UFJPVF9XUklURSkKKyNpZiAhZGVmaW5lZChNQVBfQU5PTllNT1VTKSAmJiBkZWZpbmVkKE1BUF9BTk9OKQorI2RlZmluZSBNQVBfQU5PTllNT1VTICAgICAgICBNQVBfQU5PTgorI2VuZGlmIC8qIE1BUF9BTk9OICovCisjaWZkZWYgTUFQX0FOT05ZTU9VUworI2RlZmluZSBNTUFQX0ZMQUdTICAgICAgICAgICAoTUFQX1BSSVZBVEV8TUFQX0FOT05ZTU9VUykKKyNkZWZpbmUgQ0FMTF9NTUFQKHMpICAgICAgICAgbW1hcCgwLCAocyksIE1NQVBfUFJPVCwgTU1BUF9GTEFHUywgLTEsIDApCisjZWxzZSAvKiBNQVBfQU5PTllNT1VTICovCisvKgorICAgTmVhcmx5IGFsbCB2ZXJzaW9ucyBvZiBtbWFwIHN1cHBvcnQgTUFQX0FOT05ZTU9VUywgc28gdGhlIGZvbGxvd2luZworICAgaXMgdW5saWtlbHkgdG8gYmUgbmVlZGVkLCBidXQgaXMgc3VwcGxpZWQganVzdCBpbiBjYXNlLgorKi8KKyNkZWZpbmUgTU1BUF9GTEFHUyAgICAgICAgICAgKE1BUF9QUklWQVRFKQorc3RhdGljIGludCBkZXZfemVyb19mZCA9IC0xOyAvKiBDYWNoZWQgZmlsZSBkZXNjcmlwdG9yIGZvciAvZGV2L3plcm8uICovCisjZGVmaW5lIENBTExfTU1BUChzKSAoKGRldl96ZXJvX2ZkIDwgMCkgPyBcCisgICAgICAgICAgIChkZXZfemVyb19mZCA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRXUiksIFwKKyAgICAgICAgICAgIG1tYXAoMCwgKHMpLCBNTUFQX1BST1QsIE1NQVBfRkxBR1MsIGRldl96ZXJvX2ZkLCAwKSkgOiBcCisgICAgICAgICAgICBtbWFwKDAsIChzKSwgTU1BUF9QUk9ULCBNTUFQX0ZMQUdTLCBkZXZfemVyb19mZCwgMCkpCisjZW5kaWYgLyogTUFQX0FOT05ZTU9VUyAqLworCisjZGVmaW5lIERJUkVDVF9NTUFQKHMpICAgICAgIENBTExfTU1BUChzKQorI2Vsc2UgLyogV0lOMzIgKi8KKworLyogV2luMzIgTU1BUCB2aWEgVmlydHVhbEFsbG9jICovCitzdGF0aWMgdm9pZCogd2luMzJtbWFwKHNpemVfdCBzaXplKSB7CisgIHZvaWQqIHB0ciA9IFZpcnR1YWxBbGxvYygwLCBzaXplLCBNRU1fUkVTRVJWRXxNRU1fQ09NTUlULCBQQUdFX1JFQURXUklURSk7CisgIHJldHVybiAocHRyICE9IDApPyBwdHI6IE1GQUlMOworfQorCisvKiBGb3IgZGlyZWN0IE1NQVAsIHVzZSBNRU1fVE9QX0RPV04gdG8gbWluaW1pemUgaW50ZXJmZXJlbmNlICovCitzdGF0aWMgdm9pZCogd2luMzJkaXJlY3RfbW1hcChzaXplX3Qgc2l6ZSkgeworICB2b2lkKiBwdHIgPSBWaXJ0dWFsQWxsb2MoMCwgc2l6ZSwgTUVNX1JFU0VSVkV8TUVNX0NPTU1JVHxNRU1fVE9QX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1JFQURXUklURSk7CisgIHJldHVybiAocHRyICE9IDApPyBwdHI6IE1GQUlMOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHJlbGVhc2luZyBjb2FsZXNlZCBzZWdtZW50cyAqLworc3RhdGljIGludCB3aW4zMm11bm1hcCh2b2lkKiBwdHIsIHNpemVfdCBzaXplKSB7CisgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBtaW5mbzsKKyAgY2hhciogY3B0ciA9IHB0cjsKKyAgd2hpbGUgKHNpemUpIHsKKyAgICBpZiAoVmlydHVhbFF1ZXJ5KGNwdHIsICZtaW5mbywgc2l6ZW9mKG1pbmZvKSkgPT0gMCkKKyAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobWluZm8uQmFzZUFkZHJlc3MgIT0gY3B0ciB8fCBtaW5mby5BbGxvY2F0aW9uQmFzZSAhPSBjcHRyIHx8CisgICAgICAgIG1pbmZvLlN0YXRlICE9IE1FTV9DT01NSVQgfHwgbWluZm8uUmVnaW9uU2l6ZSA+IHNpemUpCisgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFZpcnR1YWxGcmVlKGNwdHIsIDAsIE1FTV9SRUxFQVNFKSA9PSAwKQorICAgICAgcmV0dXJuIC0xOworICAgIGNwdHIgKz0gbWluZm8uUmVnaW9uU2l6ZTsKKyAgICBzaXplIC09IG1pbmZvLlJlZ2lvblNpemU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0FMTF9NTUFQKHMpICAgICAgICAgd2luMzJtbWFwKHMpCisjZGVmaW5lIENBTExfTVVOTUFQKGEsIHMpICAgIHdpbjMybXVubWFwKChhKSwgKHMpKQorI2RlZmluZSBESVJFQ1RfTU1BUChzKSAgICAgICB3aW4zMmRpcmVjdF9tbWFwKHMpCisjZW5kaWYgLyogV0lOMzIgKi8KKyNlbmRpZiAvKiBIQVZFX01NQVAgKi8KKworI2lmIEhBVkVfTU1BUCAmJiBIQVZFX01SRU1BUAorI2RlZmluZSBDQUxMX01SRU1BUChhZGRyLCBvc3osIG5zeiwgbXYpIG1yZW1hcCgoYWRkciksIChvc3opLCAobnN6KSwgKG12KSkKKyNlbHNlICAvKiBIQVZFX01NQVAgJiYgSEFWRV9NUkVNQVAgKi8KKyNkZWZpbmUgQ0FMTF9NUkVNQVAoYWRkciwgb3N6LCBuc3osIG12KSBNRkFJTAorI2VuZGlmIC8qIEhBVkVfTU1BUCAmJiBIQVZFX01SRU1BUCAqLworCisjaWYgSEFWRV9NT1JFQ09SRQorI2RlZmluZSBDQUxMX01PUkVDT1JFKFMpICAgICBNT1JFQ09SRShTKQorI2Vsc2UgIC8qIEhBVkVfTU9SRUNPUkUgKi8KKyNkZWZpbmUgQ0FMTF9NT1JFQ09SRShTKSAgICAgTUZBSUwKKyNlbmRpZiAvKiBIQVZFX01PUkVDT1JFICovCisKKy8qIG1zdGF0ZSBiaXQgc2V0IGlmIGNvbnRpbmd1b3VzIG1vcmVjb3JlIGRpc2FibGVkIG9yIGZhaWxlZCAqLworI2RlZmluZSBVU0VfTk9OQ09OVElHVU9VU19CSVQgKDRVKQorCisvKiBzZWdtZW50IGJpdCBzZXQgaW4gY3JlYXRlX21zcGFjZV93aXRoX2Jhc2UgKi8KKyNkZWZpbmUgRVhURVJOX0JJVCAgICAgICAgICAgICg4VSkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTG9jayBwcmVsaW1pbmFyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgVVNFX0xPQ0tTCisKKy8qCisgIFdoZW4gbG9ja3MgYXJlIGRlZmluZWQsIHRoZXJlIGFyZSB1cCB0byB0d28gZ2xvYmFsIGxvY2tzOgorCisgICogSWYgSEFWRV9NT1JFQ09SRSwgbW9yZWNvcmVfbXV0ZXggcHJvdGVjdHMgc2VxdWVuY2VzIG9mIGNhbGxzIHRvCisgICAgTU9SRUNPUkUuICBJbiBtYW55IGNhc2VzIHN5c19hbGxvYyByZXF1aXJlcyB0d28gY2FsbHMsIHRoYXQgc2hvdWxkCisgICAgbm90IGJlIGludGVybGVhdmVkIHdpdGggY2FsbHMgYnkgb3RoZXIgdGhyZWFkcy4gIFRoaXMgZG9lcyBub3QKKyAgICBwcm90ZWN0IGFnYWluc3QgZGlyZWN0IGNhbGxzIHRvIE1PUkVDT1JFIGJ5IG90aGVyIHRocmVhZHMgbm90CisgICAgdXNpbmcgdGhpcyBsb2NrLCBzbyB0aGVyZSBpcyBzdGlsbCBjb2RlIHRvIGNvcGUgdGhlIGJlc3Qgd2UgY2FuIG9uCisgICAgaW50ZXJmZXJlbmNlLgorCisgICogbWFnaWNfaW5pdF9tdXRleCBlbnN1cmVzIHRoYXQgbXBhcmFtcy5tYWdpYyBhbmQgb3RoZXIKKyAgICB1bmlxdWUgbXBhcmFtcyB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4KKyovCisKKyNpZm5kZWYgV0lOMzIKKy8qIEJ5IGRlZmF1bHQgdXNlIHBvc2l4IGxvY2tzICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2RlZmluZSBNTE9DS19UIHB0aHJlYWRfbXV0ZXhfdAorI2RlZmluZSBJTklUSUFMX0xPQ0sobCkgICAgICBwdGhyZWFkX211dGV4X2luaXQobCwgTlVMTCkKKyNkZWZpbmUgQUNRVUlSRV9MT0NLKGwpICAgICAgcHRocmVhZF9tdXRleF9sb2NrKGwpCisjZGVmaW5lIFJFTEVBU0VfTE9DSyhsKSAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKGwpCisKKyNpZiBIQVZFX01PUkVDT1JFCitzdGF0aWMgTUxPQ0tfVCBtb3JlY29yZV9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjZW5kaWYgLyogSEFWRV9NT1JFQ09SRSAqLworCitzdGF0aWMgTUxPQ0tfVCBtYWdpY19pbml0X211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworI2Vsc2UgLyogV0lOMzIgKi8KKy8qCisgICBCZWNhdXNlIGxvY2stcHJvdGVjdGVkIHJlZ2lvbnMgaGF2ZSBib3VuZGVkIHRpbWVzLCBhbmQgdGhlcmUKKyAgIGFyZSBubyByZWN1cnNpdmUgbG9jayBjYWxscywgd2UgY2FuIHVzZSBzaW1wbGUgc3BpbmxvY2tzLgorKi8KKworI2RlZmluZSBNTE9DS19UIGxvbmcKK3N0YXRpYyBpbnQgd2luMzJfYWNxdWlyZV9sb2NrIChNTE9DS19UICpzbCkgeworICBmb3IgKDs7KSB7CisjaWZkZWYgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyCisgICAgaWYgKCFJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZShzbCwgMSwgMCkpCisgICAgICByZXR1cm4gMDsKKyNlbHNlICAvKiBVc2Ugb2xkZXIgdm9pZCogdmVyc2lvbiAqLworICAgIGlmICghSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKHZvaWQqKilzbCwgKHZvaWQqKTEsICh2b2lkKikwKSkKKyAgICAgIHJldHVybiAwOworI2VuZGlmIC8qIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlciAqLworICAgIFNsZWVwICgwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB3aW4zMl9yZWxlYXNlX2xvY2sgKE1MT0NLX1QgKnNsKSB7CisgIEludGVybG9ja2VkRXhjaGFuZ2UgKHNsLCAwKTsKK30KKworI2RlZmluZSBJTklUSUFMX0xPQ0sobCkgICAgICAqKGwpPTAKKyNkZWZpbmUgQUNRVUlSRV9MT0NLKGwpICAgICAgd2luMzJfYWNxdWlyZV9sb2NrKGwpCisjZGVmaW5lIFJFTEVBU0VfTE9DSyhsKSAgICAgIHdpbjMyX3JlbGVhc2VfbG9jayhsKQorI2lmIEhBVkVfTU9SRUNPUkUKK3N0YXRpYyBNTE9DS19UIG1vcmVjb3JlX211dGV4OworI2VuZGlmIC8qIEhBVkVfTU9SRUNPUkUgKi8KK3N0YXRpYyBNTE9DS19UIG1hZ2ljX2luaXRfbXV0ZXg7CisjZW5kaWYgLyogV0lOMzIgKi8KKworI2RlZmluZSBVU0VfTE9DS19CSVQgICAgICAgICAgICAgICAoMlUpCisjZWxzZSAgLyogVVNFX0xPQ0tTICovCisjZGVmaW5lIFVTRV9MT0NLX0JJVCAgICAgICAgICAgICAgICgwVSkKKyNkZWZpbmUgSU5JVElBTF9MT0NLKGwpCisjZW5kaWYgLyogVVNFX0xPQ0tTICovCisKKyNpZiBVU0VfTE9DS1MgJiYgSEFWRV9NT1JFQ09SRQorI2RlZmluZSBBQ1FVSVJFX01PUkVDT1JFX0xPQ0soKSAgICBBQ1FVSVJFX0xPQ0soJm1vcmVjb3JlX211dGV4KTsKKyNkZWZpbmUgUkVMRUFTRV9NT1JFQ09SRV9MT0NLKCkgICAgUkVMRUFTRV9MT0NLKCZtb3JlY29yZV9tdXRleCk7CisjZWxzZSAvKiBVU0VfTE9DS1MgJiYgSEFWRV9NT1JFQ09SRSAqLworI2RlZmluZSBBQ1FVSVJFX01PUkVDT1JFX0xPQ0soKQorI2RlZmluZSBSRUxFQVNFX01PUkVDT1JFX0xPQ0soKQorI2VuZGlmIC8qIFVTRV9MT0NLUyAmJiBIQVZFX01PUkVDT1JFICovCisKKyNpZiBVU0VfTE9DS1MKKyNkZWZpbmUgQUNRVUlSRV9NQUdJQ19JTklUX0xPQ0soKSAgQUNRVUlSRV9MT0NLKCZtYWdpY19pbml0X211dGV4KTsKKyNkZWZpbmUgUkVMRUFTRV9NQUdJQ19JTklUX0xPQ0soKSAgUkVMRUFTRV9MT0NLKCZtYWdpY19pbml0X211dGV4KTsKKyNlbHNlICAvKiBVU0VfTE9DS1MgKi8KKyNkZWZpbmUgQUNRVUlSRV9NQUdJQ19JTklUX0xPQ0soKQorI2RlZmluZSBSRUxFQVNFX01BR0lDX0lOSVRfTE9DSygpCisjZW5kaWYgLyogVVNFX0xPQ0tTICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIENodW5rIHJlcHJlc2VudGF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAgKFRoZSBmb2xsb3dpbmcgaW5jbHVkZXMgbGlnaHRseSBlZGl0ZWQgZXhwbGFuYXRpb25zIGJ5IENvbGluIFBsdW1iLikKKworICBUaGUgbWFsbG9jX2NodW5rIGRlY2xhcmF0aW9uIGJlbG93IGlzIG1pc2xlYWRpbmcgKGJ1dCBhY2N1cmF0ZSBhbmQKKyAgbmVjZXNzYXJ5KS4gIEl0IGRlY2xhcmVzIGEgInZpZXciIGludG8gbWVtb3J5IGFsbG93aW5nIGFjY2VzcyB0bworICBuZWNlc3NhcnkgZmllbGRzIGF0IGtub3duIG9mZnNldHMgZnJvbSBhIGdpdmVuIGJhc2UuCisKKyAgQ2h1bmtzIG9mIG1lbW9yeSBhcmUgbWFpbnRhaW5lZCB1c2luZyBhIGBib3VuZGFyeSB0YWcnIG1ldGhvZCBhcworICBvcmlnaW5hbGx5IGRlc2NyaWJlZCBieSBLbnV0aC4gIChTZWUgdGhlIHBhcGVyIGJ5IFBhdWwgV2lsc29uCisgIGZ0cDovL2Z0cC5jcy51dGV4YXMuZWR1L3B1Yi9nYXJiYWdlL2FsbG9jc3J2LnBzIGZvciBhIHN1cnZleSBvZiBzdWNoCisgIHRlY2huaXF1ZXMuKSAgU2l6ZXMgb2YgZnJlZSBjaHVua3MgYXJlIHN0b3JlZCBib3RoIGluIHRoZSBmcm9udCBvZgorICBlYWNoIGNodW5rIGFuZCBhdCB0aGUgZW5kLiAgVGhpcyBtYWtlcyBjb25zb2xpZGF0aW5nIGZyYWdtZW50ZWQKKyAgY2h1bmtzIGludG8gYmlnZ2VyIGNodW5rcyBmYXN0LiAgVGhlIGhlYWQgZmllbGRzIGFsc28gaG9sZCBiaXRzCisgIHJlcHJlc2VudGluZyB3aGV0aGVyIGNodW5rcyBhcmUgZnJlZSBvciBpbiB1c2UuCisKKyAgSGVyZSBhcmUgc29tZSBwaWN0dXJlcyB0byBtYWtlIGl0IGNsZWFyZXIuICBUaGV5IGFyZSAiZXhwbG9kZWQiIHRvCisgIHNob3cgdGhhdCB0aGUgc3RhdGUgb2YgYSBjaHVuayBjYW4gYmUgdGhvdWdodCBvZiBhcyBleHRlbmRpbmcgZnJvbQorICB0aGUgaGlnaCAzMSBiaXRzIG9mIHRoZSBoZWFkIGZpZWxkIG9mIGl0cyBoZWFkZXIgdGhyb3VnaCB0aGUKKyAgcHJldl9mb290IGFuZCBQSU5VU0VfQklUIGJpdCBvZiB0aGUgZm9sbG93aW5nIGNodW5rIGhlYWRlci4KKworICBBIGNodW5rIHRoYXQncyBpbiB1c2UgbG9va3MgbGlrZToKKworICAgY2h1bmstPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICB8IFNpemUgb2YgcHJldmlvdXMgY2h1bmsgKGlmIFAgPSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rIHxQfAorICAgICAgICAgfCBTaXplIG9mIHRoaXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDF8ICstKworICAgbWVtLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKworICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICstICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0rCisgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgKy0gICAgICBzaXplIC0gc2l6ZW9mKHNpemVfdCkgYXZhaWxhYmxlIHBheWxvYWQgYnl0ZXMgICAgICAgICAgLSsKKyAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgY2h1bmstPiArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKworICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rIHwxfAorICAgICAgIHwgU2l6ZSBvZiBuZXh0IGNodW5rIChtYXkgb3IgbWF5IG5vdCBiZSBpbiB1c2UpICAgICAgICAgICAgICAgfCArLSsKKyBtZW0tPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisgICAgQW5kIGlmIGl0J3MgZnJlZSwgaXQgbG9va3MgbGlrZSB0aGlzOgorCisgICBjaHVuay0+ICstICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0rCisgICAgICAgICAgIHwgVXNlciBwYXlsb2FkIChtdXN0IGJlIGluIHVzZSwgb3Igd2Ugd291bGQgaGF2ZSBtZXJnZWQhKSAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgfFB8CisgICAgICAgICB8IFNpemUgb2YgdGhpcyBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHwgKy0rCisgICBtZW0tPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgfCBOZXh0IHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICB8IFByZXYgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICArLSAgICAgIHNpemUgLSBzaXplb2Yoc3RydWN0IGNodW5rKSB1bnVzZWQgYnl0ZXMgICAgICAgICAgICAgICAtKworICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyBjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICB8IFNpemUgb2YgdGhpcyBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgfDB8CisgICAgICAgfCBTaXplIG9mIG5leHQgY2h1bmsgKG11c3QgYmUgaW4gdXNlLCBvciB3ZSB3b3VsZCBoYXZlIG1lcmdlZCl8ICstKworIG1lbS0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICArLSBVc2VyIHBheWxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKworICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwwfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0rCisgIE5vdGUgdGhhdCBzaW5jZSB3ZSBhbHdheXMgbWVyZ2UgYWRqYWNlbnQgZnJlZSBjaHVua3MsIHRoZSBjaHVua3MKKyAgYWRqYWNlbnQgdG8gYSBmcmVlIGNodW5rIG11c3QgYmUgaW4gdXNlLgorCisgIEdpdmVuIGEgcG9pbnRlciB0byBhIGNodW5rICh3aGljaCBjYW4gYmUgZGVyaXZlZCB0cml2aWFsbHkgZnJvbSB0aGUKKyAgcGF5bG9hZCBwb2ludGVyKSB3ZSBjYW4sIGluIE8oMSkgdGltZSwgZmluZCBvdXQgd2hldGhlciB0aGUgYWRqYWNlbnQKKyAgY2h1bmtzIGFyZSBmcmVlLCBhbmQgaWYgc28sIHVubGluayB0aGVtIGZyb20gdGhlIGxpc3RzIHRoYXQgdGhleQorICBhcmUgb24gYW5kIG1lcmdlIHRoZW0gd2l0aCB0aGUgY3VycmVudCBjaHVuay4KKworICBDaHVua3MgYWx3YXlzIGJlZ2luIG9uIGV2ZW4gd29yZCBib3VuZGFyaWVzLCBzbyB0aGUgbWVtIHBvcnRpb24KKyAgKHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSB1c2VyKSBpcyBhbHNvIG9uIGFuIGV2ZW4gd29yZCBib3VuZGFyeSwgYW5kCisgIHRodXMgYXQgbGVhc3QgZG91YmxlLXdvcmQgYWxpZ25lZC4KKworICBUaGUgUCAoUElOVVNFX0JJVCkgYml0LCBzdG9yZWQgaW4gdGhlIHVudXNlZCBsb3ctb3JkZXIgYml0IG9mIHRoZQorICBjaHVuayBzaXplICh3aGljaCBpcyBhbHdheXMgYSBtdWx0aXBsZSBvZiB0d28gd29yZHMpLCBpcyBhbiBpbi11c2UKKyAgYml0IGZvciB0aGUgKnByZXZpb3VzKiBjaHVuay4gIElmIHRoYXQgYml0IGlzICpjbGVhciosIHRoZW4gdGhlCisgIHdvcmQgYmVmb3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUgY29udGFpbnMgdGhlIHByZXZpb3VzIGNodW5rCisgIHNpemUsIGFuZCBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSBmcm9udCBvZiB0aGUgcHJldmlvdXMgY2h1bmsuCisgIFRoZSB2ZXJ5IGZpcnN0IGNodW5rIGFsbG9jYXRlZCBhbHdheXMgaGFzIHRoaXMgYml0IHNldCwgcHJldmVudGluZworICBhY2Nlc3MgdG8gbm9uLWV4aXN0ZW50IChvciBub24tb3duZWQpIG1lbW9yeS4gSWYgcGludXNlIGlzIHNldCBmb3IKKyAgYW55IGdpdmVuIGNodW5rLCB0aGVuIHlvdSBDQU5OT1QgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZQorICBwcmV2aW91cyBjaHVuaywgYW5kIG1pZ2h0IGV2ZW4gZ2V0IGEgbWVtb3J5IGFkZHJlc3NpbmcgZmF1bHQgd2hlbgorICB0cnlpbmcgdG8gZG8gc28uCisKKyAgVGhlIEMgKENJTlVTRV9CSVQpIGJpdCwgc3RvcmVkIGluIHRoZSB1bnVzZWQgc2Vjb25kLWxvd2VzdCBiaXQgb2YKKyAgdGhlIGNodW5rIHNpemUgcmVkdW5kYW50bHkgcmVjb3JkcyB3aGV0aGVyIHRoZSBjdXJyZW50IGNodW5rIGlzCisgIGludXNlLiBUaGlzIHJlZHVuZGFuY3kgZW5hYmxlcyB1c2FnZSBjaGVja3Mgd2l0aGluIGZyZWUgYW5kIHJlYWxsb2MsCisgIGFuZCByZWR1Y2VzIGluZGlyZWN0aW9uIHdoZW4gZnJlZWluZyBhbmQgY29uc29saWRhdGluZyBjaHVua3MuCisKKyAgRWFjaCBmcmVzaGx5IGFsbG9jYXRlZCBjaHVuayBtdXN0IGhhdmUgYm90aCBjaW51c2UgYW5kIHBpbnVzZSBzZXQuCisgIFRoYXQgaXMsIGVhY2ggYWxsb2NhdGVkIGNodW5rIGJvcmRlcnMgZWl0aGVyIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQKKyAgYW5kIHN0aWxsIGluLXVzZSBjaHVuaywgb3IgdGhlIGJhc2Ugb2YgaXRzIG1lbW9yeSBhcmVuYS4gVGhpcyBpcworICBlbnN1cmVkIGJ5IG1ha2luZyBhbGwgYWxsb2NhdGlvbnMgZnJvbSB0aGUgdGhlIGBsb3dlc3QnIHBhcnQgb2YgYW55CisgIGZvdW5kIGNodW5rLiAgRnVydGhlciwgbm8gZnJlZSBjaHVuayBwaHlzaWNhbGx5IGJvcmRlcnMgYW5vdGhlciBvbmUsCisgIHNvIGVhY2ggZnJlZSBjaHVuayBpcyBrbm93biB0byBiZSBwcmVjZWRlZCBhbmQgZm9sbG93ZWQgYnkgZWl0aGVyCisgIGludXNlIGNodW5rcyBvciB0aGUgZW5kcyBvZiBtZW1vcnkuCisKKyAgTm90ZSB0aGF0IHRoZSBgZm9vdCcgb2YgdGhlIGN1cnJlbnQgY2h1bmsgaXMgYWN0dWFsbHkgcmVwcmVzZW50ZWQKKyAgYXMgdGhlIHByZXZfZm9vdCBvZiB0aGUgTkVYVCBjaHVuay4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8KKyAgZGVhbCB3aXRoIGFsaWdubWVudHMgZXRjIGJ1dCBjYW4gYmUgdmVyeSBjb25mdXNpbmcgd2hlbiB0cnlpbmcKKyAgdG8gZXh0ZW5kIG9yIGFkYXB0IHRoaXMgY29kZS4KKworICBUaGUgZXhjZXB0aW9ucyB0byBhbGwgdGhpcyBhcmUKKworICAgICAxLiBUaGUgc3BlY2lhbCBjaHVuayBgdG9wJyBpcyB0aGUgdG9wLW1vc3QgYXZhaWxhYmxlIGNodW5rIChpLmUuLAorICAgICAgICB0aGUgb25lIGJvcmRlcmluZyB0aGUgZW5kIG9mIGF2YWlsYWJsZSBtZW1vcnkpLiBJdCBpcyB0cmVhdGVkCisgICAgICAgIHNwZWNpYWxseS4gIFRvcCBpcyBuZXZlciBpbmNsdWRlZCBpbiBhbnkgYmluLCBpcyB1c2VkIG9ubHkgaWYKKyAgICAgICAgbm8gb3RoZXIgY2h1bmsgaXMgYXZhaWxhYmxlLCBhbmQgaXMgcmVsZWFzZWQgYmFjayB0byB0aGUKKyAgICAgICAgc3lzdGVtIGlmIGl0IGlzIHZlcnkgbGFyZ2UgKHNlZSBNX1RSSU1fVEhSRVNIT0xEKS4gIEluIGVmZmVjdCwKKyAgICAgICAgdGhlIHRvcCBjaHVuayBpcyB0cmVhdGVkIGFzIGxhcmdlciAoYW5kIHRodXMgbGVzcyB3ZWxsCisgICAgICAgIGZpdHRpbmcpIHRoYW4gYW55IG90aGVyIGF2YWlsYWJsZSBjaHVuay4gIFRoZSB0b3AgY2h1bmsKKyAgICAgICAgZG9lc24ndCB1cGRhdGUgaXRzIHRyYWlsaW5nIHNpemUgZmllbGQgc2luY2UgdGhlcmUgaXMgbm8gbmV4dAorICAgICAgICBjb250aWd1b3VzIGNodW5rIHRoYXQgd291bGQgaGF2ZSB0byBpbmRleCBvZmYgaXQuIEhvd2V2ZXIsCisgICAgICAgIHNwYWNlIGlzIHN0aWxsIGFsbG9jYXRlZCBmb3IgaXQgKFRPUF9GT09UX1NJWkUpIHRvIGVuYWJsZQorICAgICAgICBzZXBhcmF0aW9uIG9yIG1lcmdpbmcgd2hlbiBzcGFjZSBpcyBleHRlbmRlZC4KKworICAgICAzLiBDaHVua3MgYWxsb2NhdGVkIHZpYSBtbWFwLCB3aGljaCBoYXZlIHRoZSBsb3dlc3Qtb3JkZXIgYml0CisgICAgICAgIChJU19NTUFQUEVEX0JJVCkgc2V0IGluIHRoZWlyIHByZXZfZm9vdCBmaWVsZHMsIGFuZCBkbyBub3Qgc2V0CisgICAgICAgIFBJTlVTRV9CSVQgaW4gdGhlaXIgaGVhZCBmaWVsZHMuICBCZWNhdXNlIHRoZXkgYXJlIGFsbG9jYXRlZAorICAgICAgICBvbmUtYnktb25lLCBlYWNoIG11c3QgY2FycnkgaXRzIG93biBwcmV2X2Zvb3QgZmllbGQsIHdoaWNoIGlzCisgICAgICAgIGFsc28gdXNlZCB0byBob2xkIHRoZSBvZmZzZXQgdGhpcyBjaHVuayBoYXMgd2l0aGluIGl0cyBtbWFwcGVkCisgICAgICAgIHJlZ2lvbiwgd2hpY2ggaXMgbmVlZGVkIHRvIHByZXNlcnZlIGFsaWdubWVudC4gRWFjaCBtbWFwcGVkCisgICAgICAgIGNodW5rIGlzIHRyYWlsZWQgYnkgdGhlIGZpcnN0IHR3byBmaWVsZHMgb2YgYSBmYWtlIG5leHQtY2h1bmsKKyAgICAgICAgZm9yIHNha2Ugb2YgdXNhZ2UgY2hlY2tzLgorCisqLworCitzdHJ1Y3QgbWFsbG9jX2NodW5rIHsKKyAgc2l6ZV90ICAgICAgICAgICAgICAgcHJldl9mb290OyAgLyogU2l6ZSBvZiBwcmV2aW91cyBjaHVuayAoaWYgZnJlZSkuICAqLworICBzaXplX3QgICAgICAgICAgICAgICBoZWFkOyAgICAgICAvKiBTaXplIGFuZCBpbnVzZSBiaXRzLiAqLworICBzdHJ1Y3QgbWFsbG9jX2NodW5rKiBmZDsgICAgICAgICAvKiBkb3VibGUgbGlua3MgLS0gdXNlZCBvbmx5IGlmIGZyZWUuICovCisgIHN0cnVjdCBtYWxsb2NfY2h1bmsqIGJrOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX2NodW5rICBtY2h1bms7Cit0eXBlZGVmIHN0cnVjdCBtYWxsb2NfY2h1bmsqIG1jaHVua3B0cjsKK3R5cGVkZWYgc3RydWN0IG1hbGxvY19jaHVuayogc2JpbnB0cjsgIC8qIFRoZSB0eXBlIG9mIGJpbnMgb2YgY2h1bmtzICovCit0eXBlZGVmIHNpemVfdCBiaW5kZXhfdDsgICAgICAgICAgICAgICAvKiBEZXNjcmliZWQgYmVsb3cgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IGJpbm1hcF90OyAgICAgICAgIC8qIERlc2NyaWJlZCBiZWxvdyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxhZ190OyAgICAgICAgICAgLyogVGhlIHR5cGUgb2YgdmFyaW91cyBiaXQgZmxhZyBzZXRzICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gQ2h1bmtzIHNpemVzIGFuZCBhbGlnbm1lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTUNIVU5LX1NJWkUgICAgICAgICAoc2l6ZW9mKG1jaHVuaykpCisKKyNpZiBGT09URVJTCisjZGVmaW5lIENIVU5LX09WRVJIRUFEICAgICAgKFRXT19TSVpFX1RfU0laRVMpCisjZWxzZSAvKiBGT09URVJTICovCisjZGVmaW5lIENIVU5LX09WRVJIRUFEICAgICAgKFNJWkVfVF9TSVpFKQorI2VuZGlmIC8qIEZPT1RFUlMgKi8KKworLyogTU1hcHBlZCBjaHVua3MgbmVlZCBhIHNlY29uZCB3b3JkIG9mIG92ZXJoZWFkIC4uLiAqLworI2RlZmluZSBNTUFQX0NIVU5LX09WRVJIRUFEIChUV09fU0laRV9UX1NJWkVTKQorLyogLi4uIGFuZCBhZGRpdGlvbmFsIHBhZGRpbmcgZm9yIGZha2UgbmV4dC1jaHVuayBhdCBmb290ICovCisjZGVmaW5lIE1NQVBfRk9PVF9QQUQgICAgICAgKEZPVVJfU0laRV9UX1NJWkVTKQorCisvKiBUaGUgc21hbGxlc3Qgc2l6ZSB3ZSBjYW4gbWFsbG9jIGlzIGFuIGFsaWduZWQgbWluaW1hbCBjaHVuayAqLworI2RlZmluZSBNSU5fQ0hVTktfU0laRVwKKyAgKChNQ0hVTktfU0laRSArIENIVU5LX0FMSUdOX01BU0spICYgfkNIVU5LX0FMSUdOX01BU0spCisKKy8qIGNvbnZlcnNpb24gZnJvbSBtYWxsb2MgaGVhZGVycyB0byB1c2VyIHBvaW50ZXJzLCBhbmQgYmFjayAqLworI2RlZmluZSBjaHVuazJtZW0ocCkgICAgICAgICgodm9pZCopKChjaGFyKikocCkgICAgICAgKyBUV09fU0laRV9UX1NJWkVTKSkKKyNkZWZpbmUgbWVtMmNodW5rKG1lbSkgICAgICAoKG1jaHVua3B0cikoKGNoYXIqKShtZW0pIC0gVFdPX1NJWkVfVF9TSVpFUykpCisvKiBjaHVuayBhc3NvY2lhdGVkIHdpdGggYWxpZ25lZCBhZGRyZXNzIEEgKi8KKyNkZWZpbmUgYWxpZ25fYXNfY2h1bmsoQSkgICAobWNodW5rcHRyKSgoQSkgKyBhbGlnbl9vZmZzZXQoY2h1bmsybWVtKEEpKSkKKworLyogQm91bmRzIG9uIHJlcXVlc3QgKG5vdCBjaHVuaykgc2l6ZXMuICovCisjZGVmaW5lIE1BWF9SRVFVRVNUICAgICAgICAgKCgtTUlOX0NIVU5LX1NJWkUpIDw8IDIpCisjZGVmaW5lIE1JTl9SRVFVRVNUICAgICAgICAgKE1JTl9DSFVOS19TSVpFIC0gQ0hVTktfT1ZFUkhFQUQgLSBTSVpFX1RfT05FKQorCisvKiBwYWQgcmVxdWVzdCBieXRlcyBpbnRvIGEgdXNhYmxlIHNpemUgKi8KKyNkZWZpbmUgcGFkX3JlcXVlc3QocmVxKSBcCisgICAoKChyZXEpICsgQ0hVTktfT1ZFUkhFQUQgKyBDSFVOS19BTElHTl9NQVNLKSAmIH5DSFVOS19BTElHTl9NQVNLKQorCisvKiBwYWQgcmVxdWVzdCwgY2hlY2tpbmcgZm9yIG1pbmltdW0gKGJ1dCBub3QgbWF4aW11bSkgKi8KKyNkZWZpbmUgcmVxdWVzdDJzaXplKHJlcSkgXAorICAoKChyZXEpIDwgTUlOX1JFUVVFU1QpPyBNSU5fQ0hVTktfU0laRSA6IHBhZF9yZXF1ZXN0KHJlcSkpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMgb24gaGVhZCBhbmQgZm9vdCBmaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAgVGhlIGhlYWQgZmllbGQgb2YgYSBjaHVuayBpcyBvcidlZCB3aXRoIFBJTlVTRV9CSVQgd2hlbiBwcmV2aW91cworICBhZGphY2VudCBjaHVuayBpbiB1c2UsIGFuZCBvcidlZCB3aXRoIENJTlVTRV9CSVQgaWYgdGhpcyBjaHVuayBpcyBpbgorICB1c2UuIElmIHRoZSBjaHVuayB3YXMgb2J0YWluZWQgd2l0aCBtbWFwLCB0aGUgcHJldl9mb290IGZpZWxkIGhhcworICBJU19NTUFQUEVEX0JJVCBzZXQsIG90aGVyd2lzZSBob2xkaW5nIHRoZSBvZmZzZXQgb2YgdGhlIGJhc2Ugb2YgdGhlCisgIG1tYXBwZWQgcmVnaW9uIHRvIHRoZSBiYXNlIG9mIHRoZSBjaHVuay4KKyovCisKKyNkZWZpbmUgUElOVVNFX0JJVCAgICAgICAgICAoU0laRV9UX09ORSkKKyNkZWZpbmUgQ0lOVVNFX0JJVCAgICAgICAgICAoU0laRV9UX1RXTykKKyNkZWZpbmUgSU5VU0VfQklUUyAgICAgICAgICAoUElOVVNFX0JJVHxDSU5VU0VfQklUKQorCisvKiBIZWFkIHZhbHVlIGZvciBmZW5jZXBvc3RzICovCisjZGVmaW5lIEZFTkNFUE9TVF9IRUFEICAgICAgKElOVVNFX0JJVFN8U0laRV9UX1NJWkUpCisKKy8qIGV4dHJhY3Rpb24gb2YgZmllbGRzIGZyb20gaGVhZCB3b3JkcyAqLworI2RlZmluZSBjaW51c2UocCkgICAgICAgICAgICgocCktPmhlYWQgJiBDSU5VU0VfQklUKQorI2RlZmluZSBwaW51c2UocCkgICAgICAgICAgICgocCktPmhlYWQgJiBQSU5VU0VfQklUKQorI2RlZmluZSBjaHVua3NpemUocCkgICAgICAgICgocCktPmhlYWQgJiB+KElOVVNFX0JJVFMpKQorCisjZGVmaW5lIGNsZWFyX3BpbnVzZShwKSAgICAgKChwKS0+aGVhZCAmPSB+UElOVVNFX0JJVCkKKyNkZWZpbmUgY2xlYXJfY2ludXNlKHApICAgICAoKHApLT5oZWFkICY9IH5DSU5VU0VfQklUKQorCisvKiBUcmVhdCBzcGFjZSBhdCBwdHIgKy8tIG9mZnNldCBhcyBhIGNodW5rICovCisjZGVmaW5lIGNodW5rX3BsdXNfb2Zmc2V0KHAsIHMpICAoKG1jaHVua3B0cikoKChjaGFyKikocCkpICsgKHMpKSkKKyNkZWZpbmUgY2h1bmtfbWludXNfb2Zmc2V0KHAsIHMpICgobWNodW5rcHRyKSgoKGNoYXIqKShwKSkgLSAocykpKQorCisvKiBQdHIgdG8gbmV4dCBvciBwcmV2aW91cyBwaHlzaWNhbCBtYWxsb2NfY2h1bmsuICovCisjZGVmaW5lIG5leHRfY2h1bmsocCkgKChtY2h1bmtwdHIpKCAoKGNoYXIqKShwKSkgKyAoKHApLT5oZWFkICYgfklOVVNFX0JJVFMpKSkKKyNkZWZpbmUgcHJldl9jaHVuayhwKSAoKG1jaHVua3B0cikoICgoY2hhciopKHApKSAtICgocCktPnByZXZfZm9vdCkgKSkKKworLyogZXh0cmFjdCBuZXh0IGNodW5rJ3MgcGludXNlIGJpdCAqLworI2RlZmluZSBuZXh0X3BpbnVzZShwKSAgKChuZXh0X2NodW5rKHApLT5oZWFkKSAmIFBJTlVTRV9CSVQpCisKKy8qIEdldC9zZXQgc2l6ZSBhdCBmb290ZXIgKi8KKyNkZWZpbmUgZ2V0X2Zvb3QocCwgcykgICgoKG1jaHVua3B0cikoKGNoYXIqKShwKSArIChzKSkpLT5wcmV2X2Zvb3QpCisjZGVmaW5lIHNldF9mb290KHAsIHMpICAoKChtY2h1bmtwdHIpKChjaGFyKikocCkgKyAocykpKS0+cHJldl9mb290ID0gKHMpKQorCisvKiBTZXQgc2l6ZSwgcGludXNlIGJpdCwgYW5kIGZvb3QgKi8KKyNkZWZpbmUgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHAsIHMpXAorICAoKHApLT5oZWFkID0gKHN8UElOVVNFX0JJVCksIHNldF9mb290KHAsIHMpKQorCisvKiBTZXQgc2l6ZSwgcGludXNlIGJpdCwgZm9vdCwgYW5kIGNsZWFyIG5leHQgcGludXNlICovCisjZGVmaW5lIHNldF9mcmVlX3dpdGhfcGludXNlKHAsIHMsIG4pXAorICAoY2xlYXJfcGludXNlKG4pLCBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgcykpCisKKyNkZWZpbmUgaXNfbW1hcHBlZChwKVwKKyAgKCEoKHApLT5oZWFkICYgUElOVVNFX0JJVCkgJiYgKChwKS0+cHJldl9mb290ICYgSVNfTU1BUFBFRF9CSVQpKQorCisvKiBHZXQgdGhlIGludGVybmFsIG92ZXJoZWFkIGFzc29jaWF0ZWQgd2l0aCBjaHVuayBwICovCisjZGVmaW5lIG92ZXJoZWFkX2ZvcihwKVwKKyAoaXNfbW1hcHBlZChwKT8gTU1BUF9DSFVOS19PVkVSSEVBRCA6IENIVU5LX09WRVJIRUFEKQorCisvKiBSZXR1cm4gdHJ1ZSBpZiBtYWxsb2NlZCBzcGFjZSBpcyBub3QgbmVjZXNzYXJpbHkgY2xlYXJlZCAqLworI2lmIE1NQVBfQ0xFQVJTCisjZGVmaW5lIGNhbGxvY19tdXN0X2NsZWFyKHApICghaXNfbW1hcHBlZChwKSkKKyNlbHNlIC8qIE1NQVBfQ0xFQVJTICovCisjZGVmaW5lIGNhbGxvY19tdXN0X2NsZWFyKHApICgxKQorI2VuZGlmIC8qIE1NQVBfQ0xFQVJTICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3ZlcmxhaWQgZGF0YSBzdHJ1Y3R1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIFdoZW4gY2h1bmtzIGFyZSBub3QgaW4gdXNlLCB0aGV5IGFyZSB0cmVhdGVkIGFzIG5vZGVzIG9mIGVpdGhlcgorICBsaXN0cyBvciB0cmVlcy4KKworICAiU21hbGwiICBjaHVua3MgYXJlIHN0b3JlZCBpbiBjaXJjdWxhciBkb3VibHktbGlua2VkIGxpc3RzLCBhbmQgbG9vaworICBsaWtlIHRoaXM6CisKKyAgICBjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICB8ICAgICAgICAgICAgIFNpemUgb2YgcHJldmlvdXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICBgaGVhZDonIHwgICAgICAgICAgICAgU2l6ZSBvZiBjaHVuaywgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgfFB8CisgICAgICBtZW0tPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfCAgICAgICAgICAgICBGb3J3YXJkIHBvaW50ZXIgdG8gbmV4dCBjaHVuayBpbiBsaXN0ICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICB8ICAgICAgICAgICAgIEJhY2sgcG9pbnRlciB0byBwcmV2aW91cyBjaHVuayBpbiBsaXN0ICAgICAgICAgICAgfAorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgVW51c2VkIHNwYWNlIChtYXkgYmUgMCBieXRlcyBsb25nKSAgICAgICAgICAgICAgICAuCisgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK25leHRjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgYGZvb3Q6JyB8ICAgICAgICAgICAgIFNpemUgb2YgY2h1bmssIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworICBMYXJnZXIgY2h1bmtzIGFyZSBrZXB0IGluIGEgZm9ybSBvZiBiaXR3aXNlIGRpZ2l0YWwgdHJlZXMgKGFrYQorICB0cmllcykga2V5ZWQgb24gY2h1bmtzaXplcy4gIEJlY2F1c2UgbWFsbG9jX3RyZWVfY2h1bmtzIGFyZSBvbmx5IGZvcgorICBmcmVlIGNodW5rcyBncmVhdGVyIHRoYW4gMjU2IGJ5dGVzLCB0aGVpciBzaXplIGRvZXNuJ3QgaW1wb3NlIGFueQorICBjb25zdHJhaW50cyBvbiB1c2VyIGNodW5rIHNpemVzLiAgRWFjaCBub2RlIGxvb2tzIGxpa2U6CisKKyAgICBjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICB8ICAgICAgICAgICAgIFNpemUgb2YgcHJldmlvdXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICBgaGVhZDonIHwgICAgICAgICAgICAgU2l6ZSBvZiBjaHVuaywgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgfFB8CisgICAgICBtZW0tPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfCAgICAgICAgICAgICBGb3J3YXJkIHBvaW50ZXIgdG8gbmV4dCBjaHVuayBvZiBzYW1lIHNpemUgICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICB8ICAgICAgICAgICAgIEJhY2sgcG9pbnRlciB0byBwcmV2aW91cyBjaHVuayBvZiBzYW1lIHNpemUgICAgICAgfAorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgUG9pbnRlciB0byBsZWZ0IGNoaWxkIChjaGlsZFswXSkgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfCAgICAgICAgICAgICBQb2ludGVyIHRvIHJpZ2h0IGNoaWxkIChjaGlsZFsxXSkgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICB8ICAgICAgICAgICAgIFBvaW50ZXIgdG8gcGFyZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgYmluIGluZGV4IG9mIHRoaXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfCAgICAgICAgICAgICBVbnVzZWQgc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CituZXh0Y2h1bmstPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIGBmb290OicgfCAgICAgICAgICAgICBTaXplIG9mIGNodW5rLCBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKyAgRWFjaCB0cmVlIGhvbGRpbmcgdHJlZW5vZGVzIGlzIGEgdHJlZSBvZiB1bmlxdWUgY2h1bmsgc2l6ZXMuICBDaHVua3MKKyAgb2YgdGhlIHNhbWUgc2l6ZSBhcmUgYXJyYW5nZWQgaW4gYSBjaXJjdWxhcmx5LWxpbmtlZCBsaXN0LCB3aXRoIG9ubHkKKyAgdGhlIG9sZGVzdCBjaHVuayAodGhlIG5leHQgdG8gYmUgdXNlZCwgaW4gb3VyIEZJRk8gb3JkZXJpbmcpCisgIGFjdHVhbGx5IGluIHRoZSB0cmVlLiAgKFRyZWUgbWVtYmVycyBhcmUgZGlzdGluZ3Vpc2hlZCBieSBhIG5vbi1udWxsCisgIHBhcmVudCBwb2ludGVyLikgIElmIGEgY2h1bmsgd2l0aCB0aGUgc2FtZSBzaXplIGFuIGFuIGV4aXN0aW5nIG5vZGUKKyAgaXMgaW5zZXJ0ZWQsIGl0IGlzIGxpbmtlZCBvZmYgdGhlIGV4aXN0aW5nIG5vZGUgdXNpbmcgcG9pbnRlcnMgdGhhdAorICB3b3JrIGluIHRoZSBzYW1lIHdheSBhcyBmZC9iayBwb2ludGVycyBvZiBzbWFsbCBjaHVua3MuCisKKyAgRWFjaCB0cmVlIGNvbnRhaW5zIGEgcG93ZXIgb2YgMiBzaXplZCByYW5nZSBvZiBjaHVuayBzaXplcyAodGhlCisgIHNtYWxsZXN0IGlzIDB4MTAwIDw9IHggPCAweDE4MCksIHdoaWNoIGlzIGlzIGRpdmlkZWQgaW4gaGFsZiBhdCBlYWNoCisgIHRyZWUgbGV2ZWwsIHdpdGggdGhlIGNodW5rcyBpbiB0aGUgc21hbGxlciBoYWxmIG9mIHRoZSByYW5nZSAoMHgxMDAKKyAgPD0geCA8IDB4MTQwIGZvciB0aGUgdG9wIG5vc2UpIGluIHRoZSBsZWZ0IHN1YnRyZWUgYW5kIHRoZSBsYXJnZXIKKyAgaGFsZiAoMHgxNDAgPD0geCA8IDB4MTgwKSBpbiB0aGUgcmlnaHQgc3VidHJlZS4gIFRoaXMgaXMsIG9mIGNvdXJzZSwKKyAgZG9uZSBieSBpbnNwZWN0aW5nIGluZGl2aWR1YWwgYml0cy4KKworICBVc2luZyB0aGVzZSBydWxlcywgZWFjaCBub2RlJ3MgbGVmdCBzdWJ0cmVlIGNvbnRhaW5zIGFsbCBzbWFsbGVyCisgIHNpemVzIHRoYW4gaXRzIHJpZ2h0IHN1YnRyZWUuICBIb3dldmVyLCB0aGUgbm9kZSBhdCB0aGUgcm9vdCBvZiBlYWNoCisgIHN1YnRyZWUgaGFzIG5vIHBhcnRpY3VsYXIgb3JkZXJpbmcgcmVsYXRpb25zaGlwIHRvIGVpdGhlci4gIChUaGUKKyAgZGl2aWRpbmcgbGluZSBiZXR3ZWVuIHRoZSBzdWJ0cmVlIHNpemVzIGlzIGJhc2VkIG9uIHRyaWUgcmVsYXRpb24uKQorICBJZiB3ZSByZW1vdmUgdGhlIGxhc3QgY2h1bmsgb2YgYSBnaXZlbiBzaXplIGZyb20gdGhlIGludGVyaW9yIG9mIHRoZQorICB0cmVlLCB3ZSBuZWVkIHRvIHJlcGxhY2UgaXQgd2l0aCBhIGxlYWYgbm9kZS4gIFRoZSB0cmVlIG9yZGVyaW5nCisgIHJ1bGVzIHBlcm1pdCBhIG5vZGUgdG8gYmUgcmVwbGFjZWQgYnkgYW55IGxlYWYgYmVsb3cgaXQuCisKKyAgVGhlIHNtYWxsZXN0IGNodW5rIGluIGEgdHJlZSAoYSBjb21tb24gb3BlcmF0aW9uIGluIGEgYmVzdC1maXQKKyAgYWxsb2NhdG9yKSBjYW4gYmUgZm91bmQgYnkgd2Fsa2luZyBhIHBhdGggdG8gdGhlIGxlZnRtb3N0IGxlYWYgaW4KKyAgdGhlIHRyZWUuICBVbmxpa2UgYSB1c3VhbCBiaW5hcnkgdHJlZSwgd2hlcmUgd2UgZm9sbG93IGxlZnQgY2hpbGQKKyAgcG9pbnRlcnMgdW50aWwgd2UgcmVhY2ggYSBudWxsLCBoZXJlIHdlIGZvbGxvdyB0aGUgcmlnaHQgY2hpbGQKKyAgcG9pbnRlciBhbnkgdGltZSB0aGUgbGVmdCBvbmUgaXMgbnVsbCwgdW50aWwgd2UgcmVhY2ggYSBsZWFmIHdpdGgKKyAgYm90aCBjaGlsZCBwb2ludGVycyBudWxsLiBUaGUgc21hbGxlc3QgY2h1bmsgaW4gdGhlIHRyZWUgd2lsbCBiZQorICBzb21ld2hlcmUgYWxvbmcgdGhhdCBwYXRoLgorCisgIFRoZSB3b3JzdCBjYXNlIG51bWJlciBvZiBzdGVwcyB0byBhZGQsIGZpbmQsIG9yIHJlbW92ZSBhIG5vZGUgaXMKKyAgYm91bmRlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgZGlmZmVyZW50aWF0aW5nIGNodW5rcyB3aXRoaW4KKyAgYmlucy4gVW5kZXIgY3VycmVudCBiaW4gY2FsY3VsYXRpb25zLCB0aGlzIHJhbmdlcyBmcm9tIDYgdXAgdG8gMjEKKyAgKGZvciAzMiBiaXQgc2l6ZXMpIG9yIHVwIHRvIDUzIChmb3IgNjQgYml0IHNpemVzKS4gVGhlIHR5cGljYWwgY2FzZQorICBpcyBvZiBjb3Vyc2UgbXVjaCBiZXR0ZXIuCisqLworCitzdHJ1Y3QgbWFsbG9jX3RyZWVfY2h1bmsgeworICAvKiBUaGUgZmlyc3QgZm91ciBmaWVsZHMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggbWFsbG9jX2NodW5rICovCisgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgcHJldl9mb290OworICBzaXplX3QgICAgICAgICAgICAgICAgICAgIGhlYWQ7CisgIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayogZmQ7CisgIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayogYms7CisKKyAgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiBjaGlsZFsyXTsKKyAgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiBwYXJlbnQ7CisgIGJpbmRleF90ICAgICAgICAgICAgICAgICAgaW5kZXg7Cit9OworCit0eXBlZGVmIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayAgdGNodW5rOwordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3RyZWVfY2h1bmsqIHRjaHVua3B0cjsKK3R5cGVkZWYgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiB0YmlucHRyOyAvKiBUaGUgdHlwZSBvZiBiaW5zIG9mIHRyZWVzICovCisKKy8qIEEgbGl0dGxlIGhlbHBlciBtYWNybyBmb3IgdHJlZXMgKi8KKyNkZWZpbmUgbGVmdG1vc3RfY2hpbGQodCkgKCh0KS0+Y2hpbGRbMF0gIT0gMD8gKHQpLT5jaGlsZFswXSA6ICh0KS0+Y2hpbGRbMV0pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlZ21lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIEVhY2ggbWFsbG9jIHNwYWNlIG1heSBpbmNsdWRlIG5vbi1jb250aWd1b3VzIHNlZ21lbnRzLCBoZWxkIGluIGEKKyAgbGlzdCBoZWFkZWQgYnkgYW4gZW1iZWRkZWQgbWFsbG9jX3NlZ21lbnQgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUKKyAgdG9wLW1vc3Qgc3BhY2UuIFNlZ21lbnRzIGFsc28gaW5jbHVkZSBmbGFncyBob2xkaW5nIHByb3BlcnRpZXMgb2YKKyAgdGhlIHNwYWNlLiBMYXJnZSBjaHVua3MgdGhhdCBhcmUgZGlyZWN0bHkgYWxsb2NhdGVkIGJ5IG1tYXAgYXJlIG5vdAorICBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuIFRoZXkgYXJlIGluc3RlYWQgaW5kZXBlbmRlbnRseSBjcmVhdGVkIGFuZAorICBkZXN0cm95ZWQgd2l0aG91dCBvdGhlcndpc2Uga2VlcGluZyB0cmFjayBvZiB0aGVtLgorCisgIFNlZ21lbnQgbWFuYWdlbWVudCBtYWlubHkgY29tZXMgaW50byBwbGF5IGZvciBzcGFjZXMgYWxsb2NhdGVkIGJ5CisgIE1NQVAuICBBbnkgY2FsbCB0byBNTUFQIG1pZ2h0IG9yIG1pZ2h0IG5vdCByZXR1cm4gbWVtb3J5IHRoYXQgaXMKKyAgYWRqYWNlbnQgdG8gYW4gZXhpc3Rpbmcgc2VnbWVudC4gIE1PUkVDT1JFIG5vcm1hbGx5IGNvbnRpZ3VvdXNseQorICBleHRlbmRzIHRoZSBjdXJyZW50IHNwYWNlLCBzbyB0aGlzIHNwYWNlIGlzIGFsbW9zdCBhbHdheXMgYWRqYWNlbnQsCisgIHdoaWNoIGlzIHNpbXBsZXIgYW5kIGZhc3RlciB0byBkZWFsIHdpdGguIChUaGlzIGlzIHdoeSBNT1JFQ09SRSBpcworICB1c2VkIHByZWZlcmVudGlhbGx5IHRvIE1NQVAgd2hlbiBib3RoIGFyZSBhdmFpbGFibGUgLS0gc2VlCisgIHN5c19hbGxvYy4pICBXaGVuIGFsbG9jYXRpbmcgdXNpbmcgTU1BUCwgd2UgZG9uJ3QgdXNlIGFueSBvZiB0aGUKKyAgaGludGluZyBtZWNoYW5pc21zIChpbmNvbnNpc3RlbnRseSkgc3VwcG9ydGVkIGluIHZhcmlvdXMKKyAgaW1wbGVtZW50YXRpb25zIG9mIHVuaXggbW1hcCwgb3IgZGlzdGluZ3Vpc2ggcmVzZXJ2aW5nIGZyb20KKyAgY29tbWl0dGluZyBtZW1vcnkuIEluc3RlYWQsIHdlIGp1c3QgYXNrIGZvciBzcGFjZSwgYW5kIGV4cGxvaXQKKyAgY29udGlndWl0eSB3aGVuIHdlIGdldCBpdC4gIEl0IGlzIHByb2JhYmx5IHBvc3NpYmxlIHRvIGRvCisgIGJldHRlciB0aGFuIHRoaXMgb24gc29tZSBzeXN0ZW1zLCBidXQgbm8gZ2VuZXJhbCBzY2hlbWUgc2VlbXMKKyAgdG8gYmUgc2lnbmlmaWNhbnRseSBiZXR0ZXIuCisKKyAgTWFuYWdlbWVudCBlbnRhaWxzIGEgc2ltcGxlciB2YXJpYW50IG9mIHRoZSBjb25zb2xpZGF0aW9uIHNjaGVtZQorICB1c2VkIGZvciBjaHVua3MgdG8gcmVkdWNlIGZyYWdtZW50YXRpb24gLS0gbmV3IGFkamFjZW50IG1lbW9yeSBpcworICBub3JtYWxseSBwcmVwZW5kZWQgb3IgYXBwZW5kZWQgdG8gYW4gZXhpc3Rpbmcgc2VnbWVudC4gSG93ZXZlciwKKyAgdGhlcmUgYXJlIGxpbWl0YXRpb25zIGNvbXBhcmVkIHRvIGNodW5rIGNvbnNvbGlkYXRpb24gdGhhdCBtb3N0bHkKKyAgcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHNlZ21lbnQgcHJvY2Vzc2luZyBpcyByZWxhdGl2ZWx5IGluZnJlcXVlbnQKKyAgKG9jY3VycmluZyBvbmx5IHdoZW4gZ2V0dGluZyBtZW1vcnkgZnJvbSBzeXN0ZW0pIGFuZCB0aGF0IHdlCisgIGRvbid0IGV4cGVjdCB0byBoYXZlIGh1Z2UgbnVtYmVycyBvZiBzZWdtZW50czoKKworICAqIFNlZ21lbnRzIGFyZSBub3QgaW5kZXhlZCwgc28gdHJhdmVyc2FsIHJlcXVpcmVzIGxpbmVhciBzY2Fucy4gIChJdAorICAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluZGV4IHRoZXNlLCBidXQgaXMgbm90IHdvcnRoIHRoZSBleHRyYQorICAgIG92ZXJoZWFkIGFuZCBjb21wbGV4aXR5IGZvciBtb3N0IHByb2dyYW1zIG9uIG1vc3QgcGxhdGZvcm1zLikKKyAgKiBOZXcgc2VnbWVudHMgYXJlIG9ubHkgYXBwZW5kZWQgdG8gb2xkIG9uZXMgd2hlbiBob2xkaW5nIHRvcC1tb3N0CisgICAgbWVtb3J5OyBpZiB0aGV5IGNhbm5vdCBiZSBwcmVwZW5kZWQgdG8gb3RoZXJzLCB0aGV5IGFyZSBoZWxkIGluCisgICAgZGlmZmVyZW50IHNlZ21lbnRzLgorCisgIEV4Y2VwdCBmb3IgdGhlIHRvcC1tb3N0IHNlZ21lbnQgb2YgYW4gbXN0YXRlLCBlYWNoIHNlZ21lbnQgcmVjb3JkCisgIGlzIGtlcHQgYXQgdGhlIHRhaWwgb2YgaXRzIHNlZ21lbnQuIFNlZ21lbnRzIGFyZSBhZGRlZCBieSBwdXNoaW5nCisgIHNlZ21lbnQgcmVjb3JkcyBvbnRvIHRoZSBsaXN0IGhlYWRlZCBieSAmbXN0YXRlLnNlZyBmb3IgdGhlCisgIGNvbnRhaW5pbmcgbXN0YXRlLgorCisgIFNlZ21lbnQgZmxhZ3MgY29udHJvbCBhbGxvY2F0aW9uL21lcmdlL2RlYWxsb2NhdGlvbiBwb2xpY2llczoKKyAgKiBJZiBFWFRFUk5fQklUIHNldCwgdGhlbiB3ZSBkaWQgbm90IGFsbG9jYXRlIHRoaXMgc2VnbWVudCwKKyAgICBhbmQgc28gc2hvdWxkIG5vdCB0cnkgdG8gZGVhbGxvY2F0ZSBvciBtZXJnZSB3aXRoIG90aGVycy4KKyAgICAoVGhpcyBjdXJyZW50bHkgaG9sZHMgb25seSBmb3IgdGhlIGluaXRpYWwgc2VnbWVudCBwYXNzZWQKKyAgICBpbnRvIGNyZWF0ZV9tc3BhY2Vfd2l0aF9iYXNlLikKKyAgKiBJZiBJU19NTUFQUEVEX0JJVCBzZXQsIHRoZSBzZWdtZW50IG1heSBiZSBtZXJnZWQgd2l0aAorICAgIG90aGVyIHN1cnJvdW5kaW5nIG1tYXBwZWQgc2VnbWVudHMgYW5kIHRyaW1tZWQvZGUtYWxsb2NhdGVkCisgICAgdXNpbmcgbXVubWFwLgorICAqIElmIG5laXRoZXIgYml0IGlzIHNldCwgdGhlbiB0aGUgc2VnbWVudCB3YXMgb2J0YWluZWQgdXNpbmcKKyAgICBNT1JFQ09SRSBzbyBjYW4gYmUgbWVyZ2VkIHdpdGggc3Vycm91bmRpbmcgTU9SRUNPUkUnZCBzZWdtZW50cworICAgIGFuZCBkZWFsbG9jYXRlZC90cmltbWVkIHVzaW5nIE1PUkVDT1JFIHdpdGggbmVnYXRpdmUgYXJndW1lbnRzLgorKi8KKworc3RydWN0IG1hbGxvY19zZWdtZW50IHsKKyAgY2hhciogICAgICAgIGJhc2U7ICAgICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyAqLworICBzaXplX3QgICAgICAgc2l6ZTsgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNpemUgKi8KKyAgc3RydWN0IG1hbGxvY19zZWdtZW50KiBuZXh0OyAgIC8qIHB0ciB0byBuZXh0IHNlZ21lbnQgKi8KKyAgZmxhZ190ICAgICAgIHNmbGFnczsgICAgICAgICAgIC8qIG1tYXAgYW5kIGV4dGVybiBmbGFnICovCit9OworCisjZGVmaW5lIGlzX21tYXBwZWRfc2VnbWVudChTKSAgKChTKS0+c2ZsYWdzICYgSVNfTU1BUFBFRF9CSVQpCisjZGVmaW5lIGlzX2V4dGVybl9zZWdtZW50KFMpICAgKChTKS0+c2ZsYWdzICYgRVhURVJOX0JJVCkKKwordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQgIG1zZWdtZW50OwordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQqIG1zZWdtZW50cHRyOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1hbGxvY19zdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICAgQSBtYWxsb2Nfc3RhdGUgaG9sZHMgYWxsIG9mIHRoZSBib29ra2VlcGluZyBmb3IgYSBzcGFjZS4KKyAgIFRoZSBtYWluIGZpZWxkcyBhcmU6CisKKyAgVG9wCisgICAgVGhlIHRvcG1vc3QgY2h1bmsgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2VnbWVudC4gSXRzIHNpemUgaXMKKyAgICBjYWNoZWQgaW4gdG9wc2l6ZS4gIFRoZSBhY3R1YWwgc2l6ZSBvZiB0b3Btb3N0IHNwYWNlIGlzCisgICAgdG9wc2l6ZStUT1BfRk9PVF9TSVpFLCB3aGljaCBpbmNsdWRlcyBzcGFjZSByZXNlcnZlZCBmb3IgYWRkaW5nCisgICAgZmVuY2Vwb3N0cyBhbmQgc2VnbWVudCByZWNvcmRzIGlmIG5lY2Vzc2FyeSB3aGVuIGdldHRpbmcgbW9yZQorICAgIHNwYWNlIGZyb20gdGhlIHN5c3RlbS4gIFRoZSBzaXplIGF0IHdoaWNoIHRvIGF1dG90cmltIHRvcCBpcworICAgIGNhY2hlZCBmcm9tIG1wYXJhbXMgaW4gdHJpbV9jaGVjaywgZXhjZXB0IHRoYXQgaXQgaXMgZGlzYWJsZWQgaWYKKyAgICBhbiBhdXRvdHJpbSBmYWlscy4KKworICBEZXNpZ25hdGVkIHZpY3RpbSAoZHYpCisgICAgVGhpcyBpcyB0aGUgcHJlZmVycmVkIGNodW5rIGZvciBzZXJ2aWNpbmcgc21hbGwgcmVxdWVzdHMgdGhhdAorICAgIGRvbid0IGhhdmUgZXhhY3QgZml0cy4gIEl0IGlzIG5vcm1hbGx5IHRoZSBjaHVuayBzcGxpdCBvZmYgbW9zdAorICAgIHJlY2VudGx5IHRvIHNlcnZpY2UgYW5vdGhlciBzbWFsbCByZXF1ZXN0LiAgSXRzIHNpemUgaXMgY2FjaGVkIGluCisgICAgZHZzaXplLiBUaGUgbGluayBmaWVsZHMgb2YgdGhpcyBjaHVuayBhcmUgbm90IG1haW50YWluZWQgc2luY2UgaXQKKyAgICBpcyBub3Qga2VwdCBpbiBhIGJpbi4KKworICBTbWFsbEJpbnMKKyAgICBBbiBhcnJheSBvZiBiaW4gaGVhZGVycyBmb3IgZnJlZSBjaHVua3MuICBUaGVzZSBiaW5zIGhvbGQgY2h1bmtzCisgICAgd2l0aCBzaXplcyBsZXNzIHRoYW4gTUlOX0xBUkdFX1NJWkUgYnl0ZXMuIEVhY2ggYmluIGNvbnRhaW5zCisgICAgY2h1bmtzIG9mIGFsbCB0aGUgc2FtZSBzaXplLCBzcGFjZWQgOCBieXRlcyBhcGFydC4gIFRvIHNpbXBsaWZ5CisgICAgdXNlIGluIGRvdWJsZS1saW5rZWQgbGlzdHMsIGVhY2ggYmluIGhlYWRlciBhY3RzIGFzIGEgbWFsbG9jX2NodW5rCisgICAgcG9pbnRpbmcgdG8gdGhlIHJlYWwgZmlyc3Qgbm9kZSwgaWYgaXQgZXhpc3RzIChlbHNlIHBvaW50aW5nIHRvCisgICAgaXRzZWxmKS4gIFRoaXMgYXZvaWRzIHNwZWNpYWwtY2FzaW5nIGZvciBoZWFkZXJzLiAgQnV0IHRvIGF2b2lkCisgICAgd2FzdGUsIHdlIGFsbG9jYXRlIG9ubHkgdGhlIGZkL2JrIHBvaW50ZXJzIG9mIGJpbnMsIGFuZCB0aGVuIHVzZQorICAgIHJlcG9zaXRpb25pbmcgdHJpY2tzIHRvIHRyZWF0IHRoZXNlIGFzIHRoZSBmaWVsZHMgb2YgYSBjaHVuay4KKworICBUcmVlQmlucworICAgIFRyZWViaW5zIGFyZSBwb2ludGVycyB0byB0aGUgcm9vdHMgb2YgdHJlZXMgaG9sZGluZyBhIHJhbmdlIG9mCisgICAgc2l6ZXMuIFRoZXJlIGFyZSAyIGVxdWFsbHkgc3BhY2VkIHRyZWViaW5zIGZvciBlYWNoIHBvd2VyIG9mIHR3bworICAgIGZyb20gVFJFRV9TSElGVCB0byBUUkVFX1NISUZUKzE2LiBUaGUgbGFzdCBiaW4gaG9sZHMgYW55dGhpbmcKKyAgICBsYXJnZXIuCisKKyAgQmluIG1hcHMKKyAgICBUaGVyZSBpcyBvbmUgYml0IG1hcCBmb3Igc21hbGwgYmlucyAoInNtYWxsbWFwIikgYW5kIG9uZSBmb3IKKyAgICB0cmVlYmlucyAoInRyZWVtYXApLiAgRWFjaCBiaW4gc2V0cyBpdHMgYml0IHdoZW4gbm9uLWVtcHR5LCBhbmQKKyAgICBjbGVhcnMgdGhlIGJpdCB3aGVuIGVtcHR5LiAgQml0IG9wZXJhdGlvbnMgYXJlIHRoZW4gdXNlZCB0byBhdm9pZAorICAgIGJpbi1ieS1iaW4gc2VhcmNoaW5nIC0tIG5lYXJseSBhbGwgInNlYXJjaCIgaXMgZG9uZSB3aXRob3V0IGV2ZXIKKyAgICBsb29raW5nIGF0IGJpbnMgdGhhdCB3b24ndCBiZSBzZWxlY3RlZC4gIFRoZSBiaXQgbWFwcworICAgIGNvbnNlcnZhdGl2ZWx5IHVzZSAzMiBiaXRzIHBlciBtYXAgd29yZCwgZXZlbiBpZiBvbiA2NGJpdCBzeXN0ZW0uCisgICAgRm9yIGEgZ29vZCBkZXNjcmlwdGlvbiBvZiBzb21lIG9mIHRoZSBiaXQtYmFzZWQgdGVjaG5pcXVlcyB1c2VkCisgICAgaGVyZSwgc2VlIEhlbnJ5IFMuIFdhcnJlbiBKcidzIGJvb2sgIkhhY2tlcidzIERlbGlnaHQiIChhbmQKKyAgICBzdXBwbGVtZW50IGF0IGh0dHA6Ly9oYWNrZXJzZGVsaWdodC5vcmcvKS4gTWFueSBvZiB0aGVzZSBhcmUKKyAgICBpbnRlbmRlZCB0byByZWR1Y2UgdGhlIGJyYW5jaGluZXNzIG9mIHBhdGhzIHRocm91Z2ggbWFsbG9jIGV0YywgYXMKKyAgICB3ZWxsIGFzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lbW9yeSBsb2NhdGlvbnMgcmVhZCBvciB3cml0dGVuLgorCisgIFNlZ21lbnRzCisgICAgQSBsaXN0IG9mIHNlZ21lbnRzIGhlYWRlZCBieSBhbiBlbWJlZGRlZCBtYWxsb2Nfc2VnbWVudCByZWNvcmQKKyAgICByZXByZXNlbnRpbmcgdGhlIGluaXRpYWwgc3BhY2UuCisKKyAgQWRkcmVzcyBjaGVjayBzdXBwb3J0CisgICAgVGhlIGxlYXN0X2FkZHIgZmllbGQgaXMgdGhlIGxlYXN0IGFkZHJlc3MgZXZlciBvYnRhaW5lZCBmcm9tCisgICAgTU9SRUNPUkUgb3IgTU1BUC4gQXR0ZW1wdGVkIGZyZWVzIGFuZCByZWFsbG9jcyBvZiBhbnkgYWRkcmVzcyBsZXNzCisgICAgdGhhbiB0aGlzIGFyZSB0cmFwcGVkICh1bmxlc3MgSU5TRUNVUkUgaXMgZGVmaW5lZCkuCisKKyAgTWFnaWMgdGFnCisgICAgQSBjcm9zcy1jaGVjayBmaWVsZCB0aGF0IHNob3VsZCBhbHdheXMgaG9sZCBzYW1lIHZhbHVlIGFzIG1wYXJhbXMubWFnaWMuCisKKyAgRmxhZ3MKKyAgICBCaXRzIHJlY29yZGluZyB3aGV0aGVyIHRvIHVzZSBNTUFQLCBsb2Nrcywgb3IgY29udGlndW91cyBNT1JFQ09SRQorCisgIFN0YXRpc3RpY3MKKyAgICBFYWNoIHNwYWNlIGtlZXBzIHRyYWNrIG9mIGN1cnJlbnQgYW5kIG1heGltdW0gc3lzdGVtIG1lbW9yeQorICAgIG9idGFpbmVkIHZpYSBNT1JFQ09SRSBvciBNTUFQLgorCisgIExvY2tpbmcKKyAgICBJZiBVU0VfTE9DS1MgaXMgZGVmaW5lZCwgdGhlICJtdXRleCIgbG9jayBpcyBhY3F1aXJlZCBhbmQgcmVsZWFzZWQKKyAgICBhcm91bmQgZXZlcnkgcHVibGljIGNhbGwgdXNpbmcgdGhpcyBtc3BhY2UuCisqLworCisvKiBCaW4gdHlwZXMsIHdpZHRocyBhbmQgc2l6ZXMgKi8KKyNkZWZpbmUgTlNNQUxMQklOUyAgICAgICAgKDMyVSkKKyNkZWZpbmUgTlRSRUVCSU5TICAgICAgICAgKDMyVSkKKyNkZWZpbmUgU01BTExCSU5fU0hJRlQgICAgKDNVKQorI2RlZmluZSBTTUFMTEJJTl9XSURUSCAgICAoU0laRV9UX09ORSA8PCBTTUFMTEJJTl9TSElGVCkKKyNkZWZpbmUgVFJFRUJJTl9TSElGVCAgICAgKDhVKQorI2RlZmluZSBNSU5fTEFSR0VfU0laRSAgICAoU0laRV9UX09ORSA8PCBUUkVFQklOX1NISUZUKQorI2RlZmluZSBNQVhfU01BTExfU0laRSAgICAoTUlOX0xBUkdFX1NJWkUgLSBTSVpFX1RfT05FKQorI2RlZmluZSBNQVhfU01BTExfUkVRVUVTVCAoTUFYX1NNQUxMX1NJWkUgLSBDSFVOS19BTElHTl9NQVNLIC0gQ0hVTktfT1ZFUkhFQUQpCisKK3N0cnVjdCBtYWxsb2Nfc3RhdGUgeworICBiaW5tYXBfdCAgIHNtYWxsbWFwOworICBiaW5tYXBfdCAgIHRyZWVtYXA7CisgIHNpemVfdCAgICAgZHZzaXplOworICBzaXplX3QgICAgIHRvcHNpemU7CisgIGNoYXIqICAgICAgbGVhc3RfYWRkcjsKKyAgbWNodW5rcHRyICBkdjsKKyAgbWNodW5rcHRyICB0b3A7CisgIHNpemVfdCAgICAgdHJpbV9jaGVjazsKKyAgc2l6ZV90ICAgICBtYWdpYzsKKyAgbWNodW5rcHRyICBzbWFsbGJpbnNbKE5TTUFMTEJJTlMrMSkqMl07CisgIHRiaW5wdHIgICAgdHJlZWJpbnNbTlRSRUVCSU5TXTsKKyAgc2l6ZV90ICAgICBmb290cHJpbnQ7CisgIHNpemVfdCAgICAgbWF4X2Zvb3RwcmludDsKKyAgZmxhZ190ICAgICBtZmxhZ3M7CisjaWYgVVNFX0xPQ0tTCisgIE1MT0NLX1QgICAgbXV0ZXg7ICAgICAvKiBsb2NhdGUgbG9jayBhbW9uZyBmaWVsZHMgdGhhdCByYXJlbHkgY2hhbmdlICovCisjZW5kaWYgLyogVVNFX0xPQ0tTICovCisgIG1zZWdtZW50ICAgc2VnOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3N0YXRlKiAgICBtc3RhdGU7CisKKy8qIC0tLS0tLS0tLS0tLS0gR2xvYmFsIG1hbGxvY19zdGF0ZSBhbmQgbWFsbG9jX3BhcmFtcyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIG1hbGxvY19wYXJhbXMgaG9sZHMgZ2xvYmFsIHByb3BlcnRpZXMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGNhbiBiZQorICBkeW5hbWljYWxseSBzZXQgdXNpbmcgbWFsbG9wdC4gVGhlcmUgaXMgYSBzaW5nbGUgaW5zdGFuY2UsIG1wYXJhbXMsCisgIGluaXRpYWxpemVkIGluIGluaXRfbXBhcmFtcy4KKyovCisKK3N0cnVjdCBtYWxsb2NfcGFyYW1zIHsKKyAgc2l6ZV90IG1hZ2ljOworICBzaXplX3QgcGFnZV9zaXplOworICBzaXplX3QgZ3JhbnVsYXJpdHk7CisgIHNpemVfdCBtbWFwX3RocmVzaG9sZDsKKyAgc2l6ZV90IHRyaW1fdGhyZXNob2xkOworICBmbGFnX3QgZGVmYXVsdF9tZmxhZ3M7Cit9OworCitzdGF0aWMgc3RydWN0IG1hbGxvY19wYXJhbXMgbXBhcmFtczsKKworLyogVGhlIGdsb2JhbCBtYWxsb2Nfc3RhdGUgdXNlZCBmb3IgYWxsIG5vbi0ibXNwYWNlIiBjYWxscyAqLworc3RhdGljIHN0cnVjdCBtYWxsb2Nfc3RhdGUgX2dtXzsKKyNkZWZpbmUgZ20gICAgICAgICAgICAgICAgICgmX2dtXykKKyNkZWZpbmUgaXNfZ2xvYmFsKE0pICAgICAgICgoTSkgPT0gJl9nbV8pCisjZGVmaW5lIGlzX2luaXRpYWxpemVkKE0pICAoKE0pLT50b3AgIT0gMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3lzdGVtIGFsbG9jIHNldHVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogT3BlcmF0aW9ucyBvbiBtZmxhZ3MgKi8KKworI2RlZmluZSB1c2VfbG9jayhNKSAgICAgICAgICAgKChNKS0+bWZsYWdzICYgICBVU0VfTE9DS19CSVQpCisjZGVmaW5lIGVuYWJsZV9sb2NrKE0pICAgICAgICAoKE0pLT5tZmxhZ3MgfD0gIFVTRV9MT0NLX0JJVCkKKyNkZWZpbmUgZGlzYWJsZV9sb2NrKE0pICAgICAgICgoTSktPm1mbGFncyAmPSB+VVNFX0xPQ0tfQklUKQorCisjZGVmaW5lIHVzZV9tbWFwKE0pICAgICAgICAgICAoKE0pLT5tZmxhZ3MgJiAgIFVTRV9NTUFQX0JJVCkKKyNkZWZpbmUgZW5hYmxlX21tYXAoTSkgICAgICAgICgoTSktPm1mbGFncyB8PSAgVVNFX01NQVBfQklUKQorI2RlZmluZSBkaXNhYmxlX21tYXAoTSkgICAgICAgKChNKS0+bWZsYWdzICY9IH5VU0VfTU1BUF9CSVQpCisKKyNkZWZpbmUgdXNlX25vbmNvbnRpZ3VvdXMoTSkgICgoTSktPm1mbGFncyAmICAgVVNFX05PTkNPTlRJR1VPVVNfQklUKQorI2RlZmluZSBkaXNhYmxlX2NvbnRpZ3VvdXMoTSkgKChNKS0+bWZsYWdzIHw9ICBVU0VfTk9OQ09OVElHVU9VU19CSVQpCisKKyNkZWZpbmUgc2V0X2xvY2soTSxMKVwKKyAoKE0pLT5tZmxhZ3MgPSAoTCk/XAorICAoKE0pLT5tZmxhZ3MgfCBVU0VfTE9DS19CSVQpIDpcCisgICgoTSktPm1mbGFncyAmIH5VU0VfTE9DS19CSVQpKQorCisvKiBwYWdlLWFsaWduIGEgc2l6ZSAqLworI2RlZmluZSBwYWdlX2FsaWduKFMpXAorICgoKFMpICsgKG1wYXJhbXMucGFnZV9zaXplKSkgJiB+KG1wYXJhbXMucGFnZV9zaXplIC0gU0laRV9UX09ORSkpCisKKy8qIGdyYW51bGFyaXR5LWFsaWduIGEgc2l6ZSAqLworI2RlZmluZSBncmFudWxhcml0eV9hbGlnbihTKVwKKyAgKCgoUykgKyAobXBhcmFtcy5ncmFudWxhcml0eSkpICYgfihtcGFyYW1zLmdyYW51bGFyaXR5IC0gU0laRV9UX09ORSkpCisKKyNkZWZpbmUgaXNfcGFnZV9hbGlnbmVkKFMpXAorICAgKCgoc2l6ZV90KShTKSAmIChtcGFyYW1zLnBhZ2Vfc2l6ZSAtIFNJWkVfVF9PTkUpKSA9PSAwKQorI2RlZmluZSBpc19ncmFudWxhcml0eV9hbGlnbmVkKFMpXAorICAgKCgoc2l6ZV90KShTKSAmIChtcGFyYW1zLmdyYW51bGFyaXR5IC0gU0laRV9UX09ORSkpID09IDApCisKKy8qICBUcnVlIGlmIHNlZ21lbnQgUyBob2xkcyBhZGRyZXNzIEEgKi8KKyNkZWZpbmUgc2VnbWVudF9ob2xkcyhTLCBBKVwKKyAgKChjaGFyKikoQSkgPj0gUy0+YmFzZSAmJiAoY2hhciopKEEpIDwgUy0+YmFzZSArIFMtPnNpemUpCisKKy8qIFJldHVybiBzZWdtZW50IGhvbGRpbmcgZ2l2ZW4gYWRkcmVzcyAqLworc3RhdGljIG1zZWdtZW50cHRyIHNlZ21lbnRfaG9sZGluZyhtc3RhdGUgbSwgY2hhciogYWRkcikgeworICBtc2VnbWVudHB0ciBzcCA9ICZtLT5zZWc7CisgIGZvciAoOzspIHsKKyAgICBpZiAoYWRkciA+PSBzcC0+YmFzZSAmJiBhZGRyIDwgc3AtPmJhc2UgKyBzcC0+c2l6ZSkKKyAgICAgIHJldHVybiBzcDsKKyAgICBpZiAoKHNwID0gc3AtPm5leHQpID09IDApCisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiBzZWdtZW50IGNvbnRhaW5zIGEgc2VnbWVudCBsaW5rICovCitzdGF0aWMgaW50IGhhc19zZWdtZW50X2xpbmsobXN0YXRlIG0sIG1zZWdtZW50cHRyIHNzKSB7CisgIG1zZWdtZW50cHRyIHNwID0gJm0tPnNlZzsKKyAgZm9yICg7OykgeworICAgIGlmICgoY2hhciopc3AgPj0gc3MtPmJhc2UgJiYgKGNoYXIqKXNwIDwgc3MtPmJhc2UgKyBzcy0+c2l6ZSkKKyAgICAgIHJldHVybiAxOworICAgIGlmICgoc3AgPSBzcC0+bmV4dCkgPT0gMCkKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKKyNpZm5kZWYgTU9SRUNPUkVfQ0FOTk9UX1RSSU0KKyNkZWZpbmUgc2hvdWxkX3RyaW0oTSxzKSAgKChzKSA+IChNKS0+dHJpbV9jaGVjaykKKyNlbHNlICAvKiBNT1JFQ09SRV9DQU5OT1RfVFJJTSAqLworI2RlZmluZSBzaG91bGRfdHJpbShNLHMpICAoMCkKKyNlbmRpZiAvKiBNT1JFQ09SRV9DQU5OT1RfVFJJTSAqLworCisvKgorICBUT1BfRk9PVF9TSVpFIGlzIHBhZGRpbmcgYXQgdGhlIGVuZCBvZiBhIHNlZ21lbnQsIGluY2x1ZGluZyBzcGFjZQorICB0aGF0IG1heSBiZSBuZWVkZWQgdG8gcGxhY2Ugc2VnbWVudCByZWNvcmRzIGFuZCBmZW5jZXBvc3RzIHdoZW4gbmV3CisgIG5vbmNvbnRpZ3VvdXMgc2VnbWVudHMgYXJlIGFkZGVkLgorKi8KKyNkZWZpbmUgVE9QX0ZPT1RfU0laRVwKKyAgKGFsaWduX29mZnNldChjaHVuazJtZW0oMCkpK3BhZF9yZXF1ZXN0KHNpemVvZihzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQpKStNSU5fQ0hVTktfU0laRSkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBIb29rcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICBQUkVBQ1RJT04gc2hvdWxkIGJlIGRlZmluZWQgdG8gcmV0dXJuIDAgb24gc3VjY2VzcywgYW5kIG5vbnplcm8gb24KKyAgZmFpbHVyZS4gSWYgeW91IGFyZSBub3QgdXNpbmcgbG9ja2luZywgeW91IGNhbiByZWRlZmluZSB0aGVzZSB0byBkbworICBhbnl0aGluZyB5b3UgbGlrZS4KKyovCisKKyNpZiBVU0VfTE9DS1MKKworLyogRW5zdXJlIGxvY2tzIGFyZSBpbml0aWFsaXplZCAqLworI2RlZmluZSBHTE9CQUxMWV9JTklUSUFMSVpFKCkgKG1wYXJhbXMucGFnZV9zaXplID09IDAgJiYgaW5pdF9tcGFyYW1zKCkpCisKKyNkZWZpbmUgUFJFQUNUSU9OKE0pICAoKEdMT0JBTExZX0lOSVRJQUxJWkUoKSB8fCB1c2VfbG9jayhNKSk/IEFDUVVJUkVfTE9DSygmKE0pLT5tdXRleCkgOiAwKQorI2RlZmluZSBQT1NUQUNUSU9OKE0pIHsgaWYgKHVzZV9sb2NrKE0pKSBSRUxFQVNFX0xPQ0soJihNKS0+bXV0ZXgpOyB9CisjZWxzZSAvKiBVU0VfTE9DS1MgKi8KKworI2lmbmRlZiBQUkVBQ1RJT04KKyNkZWZpbmUgUFJFQUNUSU9OKE0pICgwKQorI2VuZGlmICAvKiBQUkVBQ1RJT04gKi8KKworI2lmbmRlZiBQT1NUQUNUSU9OCisjZGVmaW5lIFBPU1RBQ1RJT04oTSkKKyNlbmRpZiAgLyogUE9TVEFDVElPTiAqLworCisjZW5kaWYgLyogVVNFX0xPQ0tTICovCisKKy8qCisgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OIGlzIHRyaWdnZXJlZCB1cG9uIGRldGVjdGVkIGJhZCBhZGRyZXNzZXMuCisgIFVTQUdFX0VSUk9SX0FDVElPTiBpcyB0cmlnZ2VyZWQgb24gZGV0ZWN0ZWQgYmFkIGZyZWVzIGFuZAorICByZWFsbG9jcy4gVGhlIGFyZ3VtZW50IHAgaXMgYW4gYWRkcmVzcyB0aGF0IG1pZ2h0IGhhdmUgdHJpZ2dlcmVkIHRoZQorICBmYXVsdC4gSXQgaXMgaWdub3JlZCBieSB0aGUgdHdvIHByZWRlZmluZWQgYWN0aW9ucywgYnV0IG1pZ2h0IGJlCisgIHVzZWZ1bCBpbiBjdXN0b20gYWN0aW9ucyB0aGF0IHRyeSB0byBoZWxwIGRpYWdub3NlIGVycm9ycy4KKyovCisKKyNpZiBQUk9DRUVEX09OX0VSUk9SCisKKy8qIEEgY291bnQgb2YgdGhlIG51bWJlciBvZiBjb3JydXB0aW9uIGVycm9ycyBjYXVzaW5nIHJlc2V0cyAqLworaW50IG1hbGxvY19jb3JydXB0aW9uX2Vycm9yX2NvdW50OworCisvKiBkZWZhdWx0IGNvcnJ1cHRpb24gYWN0aW9uICovCitzdGF0aWMgdm9pZCByZXNldF9vbl9lcnJvcihtc3RhdGUgbSk7CisKKyNkZWZpbmUgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04obSkgIHJlc2V0X29uX2Vycm9yKG0pCisjZGVmaW5lIFVTQUdFX0VSUk9SX0FDVElPTihtLCBwKQorCisjZWxzZSAvKiBQUk9DRUVEX09OX0VSUk9SICovCisKKyNpZm5kZWYgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04KKyNkZWZpbmUgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04obSkgQUJPUlQKKyNlbmRpZiAvKiBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTiAqLworCisjaWZuZGVmIFVTQUdFX0VSUk9SX0FDVElPTgorI2RlZmluZSBVU0FHRV9FUlJPUl9BQ1RJT04obSxwKSBBQk9SVAorI2VuZGlmIC8qIFVTQUdFX0VSUk9SX0FDVElPTiAqLworCisjZW5kaWYgLyogUFJPQ0VFRF9PTl9FUlJPUiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWJ1Z2dpbmcgc2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgISBERUJVRworCisjZGVmaW5lIGNoZWNrX2ZyZWVfY2h1bmsoTSxQKQorI2RlZmluZSBjaGVja19pbnVzZV9jaHVuayhNLFApCisjZGVmaW5lIGNoZWNrX21hbGxvY2VkX2NodW5rKE0sUCxOKQorI2RlZmluZSBjaGVja19tbWFwcGVkX2NodW5rKE0sUCkKKyNkZWZpbmUgY2hlY2tfbWFsbG9jX3N0YXRlKE0pCisjZGVmaW5lIGNoZWNrX3RvcF9jaHVuayhNLFApCisKKyNlbHNlIC8qIERFQlVHICovCisjZGVmaW5lIGNoZWNrX2ZyZWVfY2h1bmsoTSxQKSAgICAgICBkb19jaGVja19mcmVlX2NodW5rKE0sUCkKKyNkZWZpbmUgY2hlY2tfaW51c2VfY2h1bmsoTSxQKSAgICAgIGRvX2NoZWNrX2ludXNlX2NodW5rKE0sUCkKKyNkZWZpbmUgY2hlY2tfdG9wX2NodW5rKE0sUCkgICAgICAgIGRvX2NoZWNrX3RvcF9jaHVuayhNLFApCisjZGVmaW5lIGNoZWNrX21hbGxvY2VkX2NodW5rKE0sUCxOKSBkb19jaGVja19tYWxsb2NlZF9jaHVuayhNLFAsTikKKyNkZWZpbmUgY2hlY2tfbW1hcHBlZF9jaHVuayhNLFApICAgIGRvX2NoZWNrX21tYXBwZWRfY2h1bmsoTSxQKQorI2RlZmluZSBjaGVja19tYWxsb2Nfc3RhdGUoTSkgICAgICAgZG9fY2hlY2tfbWFsbG9jX3N0YXRlKE0pCisKK3N0YXRpYyB2b2lkICAgZG9fY2hlY2tfYW55X2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7CitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX3RvcF9jaHVuayhtc3RhdGUgbSwgbWNodW5rcHRyIHApOworc3RhdGljIHZvaWQgICBkb19jaGVja19tbWFwcGVkX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7CitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX2ludXNlX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7CitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX2ZyZWVfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKTsKK3N0YXRpYyB2b2lkICAgZG9fY2hlY2tfbWFsbG9jZWRfY2h1bmsobXN0YXRlIG0sIHZvaWQqIG1lbSwgc2l6ZV90IHMpOworc3RhdGljIHZvaWQgICBkb19jaGVja190cmVlKG1zdGF0ZSBtLCB0Y2h1bmtwdHIgdCk7CitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX3RyZWViaW4obXN0YXRlIG0sIGJpbmRleF90IGkpOworc3RhdGljIHZvaWQgICBkb19jaGVja19zbWFsbGJpbihtc3RhdGUgbSwgYmluZGV4X3QgaSk7CitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX21hbGxvY19zdGF0ZShtc3RhdGUgbSk7CitzdGF0aWMgaW50ICAgIGJpbl9maW5kKG1zdGF0ZSBtLCBtY2h1bmtwdHIgeCk7CitzdGF0aWMgc2l6ZV90IHRyYXZlcnNlX2FuZF9jaGVjayhtc3RhdGUgbSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmRleGluZyBCaW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBpc19zbWFsbChzKSAgICAgICAgICgoKHMpID4+IFNNQUxMQklOX1NISUZUKSA8IE5TTUFMTEJJTlMpCisjZGVmaW5lIHNtYWxsX2luZGV4KHMpICAgICAgKChzKSAgPj4gU01BTExCSU5fU0hJRlQpCisjZGVmaW5lIHNtYWxsX2luZGV4MnNpemUoaSkgKChpKSAgPDwgU01BTExCSU5fU0hJRlQpCisjZGVmaW5lIE1JTl9TTUFMTF9JTkRFWCAgICAgKHNtYWxsX2luZGV4KE1JTl9DSFVOS19TSVpFKSkKKworLyogYWRkcmVzc2luZyBieSBpbmRleC4gU2VlIGFib3ZlIGFib3V0IHNtYWxsYmluIHJlcG9zaXRpb25pbmcgKi8KKyNkZWZpbmUgc21hbGxiaW5fYXQoTSwgaSkgICAoKHNiaW5wdHIpKChjaGFyKikmKChNKS0+c21hbGxiaW5zWyhpKTw8MV0pKSkKKyNkZWZpbmUgdHJlZWJpbl9hdChNLGkpICAgICAoJigoTSktPnRyZWViaW5zW2ldKSkKKworLyogYXNzaWduIHRyZWUgaW5kZXggZm9yIHNpemUgUyB0byB2YXJpYWJsZSBJICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChpMzg2KQorI2RlZmluZSBjb21wdXRlX3RyZWVfaW5kZXgoUywgSSlcCit7XAorICBzaXplX3QgWCA9IFMgPj4gVFJFRUJJTl9TSElGVDtcCisgIGlmIChYID09IDApXAorICAgIEkgPSAwO1wKKyAgZWxzZSBpZiAoWCA+IDB4RkZGRilcCisgICAgSSA9IE5UUkVFQklOUy0xO1wKKyAgZWxzZSB7XAorICAgIHVuc2lnbmVkIGludCBLO1wKKyAgICBfX2FzbV9fKCJic3JsICUxLCUwXG5cdCIgOiAiPXIiIChLKSA6ICJybSIgIChYKSk7XAorICAgIEkgPSAgKGJpbmRleF90KSgoSyA8PCAxKSArICgoUyA+PiAoSyArIChUUkVFQklOX1NISUZULTEpKSAmIDEpKSk7XAorICB9XAorfQorI2Vsc2UgLyogR05VQyAqLworI2RlZmluZSBjb21wdXRlX3RyZWVfaW5kZXgoUywgSSlcCit7XAorICBzaXplX3QgWCA9IFMgPj4gVFJFRUJJTl9TSElGVDtcCisgIGlmIChYID09IDApXAorICAgIEkgPSAwO1wKKyAgZWxzZSBpZiAoWCA+IDB4RkZGRilcCisgICAgSSA9IE5UUkVFQklOUy0xO1wKKyAgZWxzZSB7XAorICAgIHVuc2lnbmVkIGludCBZID0gKHVuc2lnbmVkIGludClYO1wKKyAgICB1bnNpZ25lZCBpbnQgTiA9ICgoWSAtIDB4MTAwKSA+PiAxNikgJiA4O1wKKyAgICB1bnNpZ25lZCBpbnQgSyA9ICgoKFkgPDw9IE4pIC0gMHgxMDAwKSA+PiAxNikgJiA0O1wKKyAgICBOICs9IEs7XAorICAgIE4gKz0gSyA9ICgoKFkgPDw9IEspIC0gMHg0MDAwKSA+PiAxNikgJiAyO1wKKyAgICBLID0gMTQgLSBOICsgKChZIDw8PSBLKSA+PiAxNSk7XAorICAgIEkgPSAoSyA8PCAxKSArICgoUyA+PiAoSyArIChUUkVFQklOX1NISUZULTEpKSAmIDEpKTtcCisgIH1cCit9CisjZW5kaWYgLyogR05VQyAqLworCisvKiBCaXQgcmVwcmVzZW50aW5nIG1heGltdW0gcmVzb2x2ZWQgc2l6ZSBpbiBhIHRyZWViaW4gYXQgaSAqLworI2RlZmluZSBiaXRfZm9yX3RyZWVfaW5kZXgoaSkgXAorICAgKGkgPT0gTlRSRUVCSU5TLTEpPyAoU0laRV9UX0JJVFNJWkUtMSkgOiAoKChpKSA+PiAxKSArIFRSRUVCSU5fU0hJRlQgLSAyKQorCisvKiBTaGlmdCBwbGFjaW5nIG1heGltdW0gcmVzb2x2ZWQgYml0IGluIGEgdHJlZWJpbiBhdCBpIGFzIHNpZ24gYml0ICovCisjZGVmaW5lIGxlZnRzaGlmdF9mb3JfdHJlZV9pbmRleChpKSBcCisgICAoKGkgPT0gTlRSRUVCSU5TLTEpPyAwIDogXAorICAgICgoU0laRV9UX0JJVFNJWkUtU0laRV9UX09ORSkgLSAoKChpKSA+PiAxKSArIFRSRUVCSU5fU0hJRlQgLSAyKSkpCisKKy8qIFRoZSBzaXplIG9mIHRoZSBzbWFsbGVzdCBjaHVuayBoZWxkIGluIGJpbiB3aXRoIGluZGV4IGkgKi8KKyNkZWZpbmUgbWluc2l6ZV9mb3JfdHJlZV9pbmRleChpKSBcCisgICAoKFNJWkVfVF9PTkUgPDwgKCgoaSkgPj4gMSkgKyBUUkVFQklOX1NISUZUKSkgfCAgXAorICAgKCgoc2l6ZV90KSgoaSkgJiBTSVpFX1RfT05FKSkgPDwgKCgoaSkgPj4gMSkgKyBUUkVFQklOX1NISUZUIC0gMSkpKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zIG9uIGJpbiBtYXBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGJpdCBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGluZGV4ICovCisjZGVmaW5lIGlkeDJiaXQoaSkgICAgICAgICAgICAgICgoYmlubWFwX3QpKDEpIDw8IChpKSkKKworLyogTWFyay9DbGVhciBiaXRzIHdpdGggZ2l2ZW4gaW5kZXggKi8KKyNkZWZpbmUgbWFya19zbWFsbG1hcChNLGkpICAgICAgKChNKS0+c21hbGxtYXAgfD0gIGlkeDJiaXQoaSkpCisjZGVmaW5lIGNsZWFyX3NtYWxsbWFwKE0saSkgICAgICgoTSktPnNtYWxsbWFwICY9IH5pZHgyYml0KGkpKQorI2RlZmluZSBzbWFsbG1hcF9pc19tYXJrZWQoTSxpKSAoKE0pLT5zbWFsbG1hcCAmICAgaWR4MmJpdChpKSkKKworI2RlZmluZSBtYXJrX3RyZWVtYXAoTSxpKSAgICAgICAoKE0pLT50cmVlbWFwICB8PSAgaWR4MmJpdChpKSkKKyNkZWZpbmUgY2xlYXJfdHJlZW1hcChNLGkpICAgICAgKChNKS0+dHJlZW1hcCAgJj0gfmlkeDJiaXQoaSkpCisjZGVmaW5lIHRyZWVtYXBfaXNfbWFya2VkKE0saSkgICgoTSktPnRyZWVtYXAgICYgICBpZHgyYml0KGkpKQorCisvKiBpbmRleCBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGJpdCAqLworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChpMzg2KQorI2RlZmluZSBjb21wdXRlX2JpdDJpZHgoWCwgSSlcCit7XAorICB1bnNpZ25lZCBpbnQgSjtcCisgIF9fYXNtX18oImJzZmwgJTEsJTBcblx0IiA6ICI9ciIgKEopIDogInJtIiAoWCkpO1wKKyAgSSA9IChiaW5kZXhfdClKO1wKK30KKworI2Vsc2UgLyogR05VQyAqLworI2lmICBVU0VfQlVJTFRJTl9GRlMKKyNkZWZpbmUgY29tcHV0ZV9iaXQyaWR4KFgsIEkpIEkgPSBmZnMoWCktMQorCisjZWxzZSAvKiBVU0VfQlVJTFRJTl9GRlMgKi8KKyNkZWZpbmUgY29tcHV0ZV9iaXQyaWR4KFgsIEkpXAore1wKKyAgdW5zaWduZWQgaW50IFkgPSBYIC0gMTtcCisgIHVuc2lnbmVkIGludCBLID0gWSA+PiAoMTYtNCkgJiAxNjtcCisgIHVuc2lnbmVkIGludCBOID0gSzsgICAgICAgIFkgPj49IEs7XAorICBOICs9IEsgPSBZID4+ICg4LTMpICYgIDg7ICBZID4+PSBLO1wKKyAgTiArPSBLID0gWSA+PiAoNC0yKSAmICA0OyAgWSA+Pj0gSztcCisgIE4gKz0gSyA9IFkgPj4gKDItMSkgJiAgMjsgIFkgPj49IEs7XAorICBOICs9IEsgPSBZID4+ICgxLTApICYgIDE7ICBZID4+PSBLO1wKKyAgSSA9IChiaW5kZXhfdCkoTiArIFkpO1wKK30KKyNlbmRpZiAvKiBVU0VfQlVJTFRJTl9GRlMgKi8KKyNlbmRpZiAvKiBHTlVDICovCisKKy8qIGlzb2xhdGUgdGhlIGxlYXN0IHNldCBiaXQgb2YgYSBiaXRtYXAgKi8KKyNkZWZpbmUgbGVhc3RfYml0KHgpICAgICAgICAgKCh4KSAmIC0oeCkpCisKKy8qIG1hc2sgd2l0aCBhbGwgYml0cyB0byBsZWZ0IG9mIGxlYXN0IGJpdCBvZiB4IG9uICovCisjZGVmaW5lIGxlZnRfYml0cyh4KSAgICAgICAgICgoeDw8MSkgfCAtKHg8PDEpKQorCisvKiBtYXNrIHdpdGggYWxsIGJpdHMgdG8gbGVmdCBvZiBvciBlcXVhbCB0byBsZWFzdCBiaXQgb2YgeCBvbiAqLworI2RlZmluZSBzYW1lX29yX2xlZnRfYml0cyh4KSAoKHgpIHwgLSh4KSkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSdW50aW1lIENoZWNrIFN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICBGb3Igc2VjdXJpdHksIHRoZSBtYWluIGludmFyaWFudCBpcyB0aGF0IG1hbGxvYy9mcmVlL2V0YyBuZXZlcgorICB3cml0ZXMgdG8gYSBzdGF0aWMgYWRkcmVzcyBvdGhlciB0aGFuIG1hbGxvY19zdGF0ZSwgdW5sZXNzIHN0YXRpYworICBtYWxsb2Nfc3RhdGUgaXRzZWxmIGhhcyBiZWVuIGNvcnJ1cHRlZCwgd2hpY2ggY2Fubm90IG9jY3VyIHZpYQorICBtYWxsb2MgKGJlY2F1c2Ugb2YgdGhlc2UgY2hlY2tzKS4gSW4gZXNzZW5jZSB0aGlzIG1lYW5zIHRoYXQgd2UKKyAgYmVsaWV2ZSBhbGwgcG9pbnRlcnMsIHNpemVzLCBtYXBzIGV0YyBoZWxkIGluIG1hbGxvY19zdGF0ZSwgYnV0CisgIGNoZWNrIGFsbCBvZiB0aG9zZSBsaW5rZWQgb3Igb2Zmc2V0dGVkIGZyb20gb3RoZXIgZW1iZWRkZWQgZGF0YQorICBzdHJ1Y3R1cmVzLiAgVGhlc2UgY2hlY2tzIGFyZSBpbnRlcnNwZXJzZWQgd2l0aCBtYWluIGNvZGUgaW4gYSB3YXkKKyAgdGhhdCB0ZW5kcyB0byBtaW5pbWl6ZSB0aGVpciBydW4tdGltZSBjb3N0LgorCisgIFdoZW4gRk9PVEVSUyBpcyBkZWZpbmVkLCBpbiBhZGRpdGlvbiB0byByYW5nZSBjaGVja2luZywgd2UgYWxzbworICB2ZXJpZnkgZm9vdGVyIGZpZWxkcyBvZiBpbnVzZSBjaHVua3MsIHdoaWNoIGNhbiBiZSB1c2VkIGd1YXJhbnRlZQorICB0aGF0IHRoZSBtc3RhdGUgY29udHJvbGxpbmcgbWFsbG9jL2ZyZWUgaXMgaW50YWN0LiAgVGhpcyBpcyBhCisgIHN0cmVhbWxpbmVkIHZlcnNpb24gb2YgdGhlIGFwcHJvYWNoIGRlc2NyaWJlZCBieSBXaWxsaWFtIFJvYmVydHNvbgorICBldCBhbCBpbiAiUnVuLXRpbWUgRGV0ZWN0aW9uIG9mIEhlYXAtYmFzZWQgT3ZlcmZsb3dzIiBMSVNBJzAzCisgIGh0dHA6Ly93d3cudXNlbml4Lm9yZy9ldmVudHMvbGlzYTAzL3RlY2gvcm9iZXJ0c29uLmh0bWwgVGhlIGZvb3RlcgorICBvZiBhbiBpbnVzZSBjaHVuayBob2xkcyB0aGUgeG9yIG9mIGl0cyBtc3RhdGUgYW5kIGEgcmFuZG9tIHNlZWQsCisgIHRoYXQgaXMgY2hlY2tlZCB1cG9uIGNhbGxzIHRvIGZyZWUoKSBhbmQgcmVhbGxvYygpLiAgVGhpcyBpcworICAocHJvYmFibGlzdGljYWxseSkgdW5ndWVzc2FibGUgZnJvbSBvdXRzaWRlIHRoZSBwcm9ncmFtLCBidXQgY2FuIGJlCisgIGNvbXB1dGVkIGJ5IGFueSBjb2RlIHN1Y2Nlc3NmdWxseSBtYWxsb2MnaW5nIGFueSBjaHVuaywgc28gZG9lcyBub3QKKyAgaXRzZWxmIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGNvZGUgdGhhdCBoYXMgYWxyZWFkeSBicm9rZW4KKyAgc2VjdXJpdHkgdGhyb3VnaCBzb21lIG90aGVyIG1lYW5zLiAgVW5saWtlIFJvYmVydHNvbiBldCBhbCwgd2UKKyAgYWx3YXlzIGR5bmFtaWNhbGx5IGNoZWNrIGFkZHJlc3NlcyBvZiBhbGwgb2Zmc2V0IGNodW5rcyAocHJldmlvdXMsCisgIG5leHQsIGV0YykuIFRoaXMgdHVybnMgb3V0IHRvIGJlIGNoZWFwZXIgdGhhbiByZWx5aW5nIG9uIGhhc2hlcy4KKyovCisKKyNpZiAhSU5TRUNVUkUKKy8qIENoZWNrIGlmIGFkZHJlc3MgYSBpcyBhdCBsZWFzdCBhcyBoaWdoIGFzIGFueSBmcm9tIE1PUkVDT1JFIG9yIE1NQVAgKi8KKyNkZWZpbmUgb2tfYWRkcmVzcyhNLCBhKSAoKGNoYXIqKShhKSA+PSAoTSktPmxlYXN0X2FkZHIpCisvKiBDaGVjayBpZiBhZGRyZXNzIG9mIG5leHQgY2h1bmsgbiBpcyBoaWdoZXIgdGhhbiBiYXNlIGNodW5rIHAgKi8KKyNkZWZpbmUgb2tfbmV4dChwLCBuKSAgICAoKGNoYXIqKShwKSA8IChjaGFyKikobikpCisvKiBDaGVjayBpZiBwIGhhcyBpdHMgY2ludXNlIGJpdCBvbiAqLworI2RlZmluZSBva19jaW51c2UocCkgICAgIGNpbnVzZShwKQorLyogQ2hlY2sgaWYgcCBoYXMgaXRzIHBpbnVzZSBiaXQgb24gKi8KKyNkZWZpbmUgb2tfcGludXNlKHApICAgICBwaW51c2UocCkKKworI2Vsc2UgLyogIUlOU0VDVVJFICovCisjZGVmaW5lIG9rX2FkZHJlc3MoTSwgYSkgKDEpCisjZGVmaW5lIG9rX25leHQoYiwgbikgICAgKDEpCisjZGVmaW5lIG9rX2NpbnVzZShwKSAgICAgKDEpCisjZGVmaW5lIG9rX3BpbnVzZShwKSAgICAgKDEpCisjZW5kaWYgLyogIUlOU0VDVVJFICovCisKKyNpZiAoRk9PVEVSUyAmJiAhSU5TRUNVUkUpCisvKiBDaGVjayBpZiAoYWxsZWdlZCkgbXN0YXRlIG0gaGFzIGV4cGVjdGVkIG1hZ2ljIGZpZWxkICovCisjZGVmaW5lIG9rX21hZ2ljKE0pICAgICAgKChNKS0+bWFnaWMgPT0gbXBhcmFtcy5tYWdpYykKKyNlbHNlICAvKiAoRk9PVEVSUyAmJiAhSU5TRUNVUkUpICovCisjZGVmaW5lIG9rX21hZ2ljKE0pICAgICAgKDEpCisjZW5kaWYgLyogKEZPT1RFUlMgJiYgIUlOU0VDVVJFKSAqLworCisKKy8qIEluIGdjYywgdXNlIF9fYnVpbHRpbl9leHBlY3QgdG8gbWluaW1pemUgaW1wYWN0IG9mIGNoZWNrcyAqLworI2lmICFJTlNFQ1VSRQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDMKKyNkZWZpbmUgUlRDSEVDSyhlKSAgX19idWlsdGluX2V4cGVjdChlLCAxKQorI2Vsc2UgLyogR05VQyAqLworI2RlZmluZSBSVENIRUNLKGUpICAoZSkKKyNlbmRpZiAvKiBHTlVDICovCisjZWxzZSAvKiAhSU5TRUNVUkUgKi8KKyNkZWZpbmUgUlRDSEVDSyhlKSAgKDEpCisjZW5kaWYgLyogIUlOU0VDVVJFICovCisKKy8qIG1hY3JvcyB0byBzZXQgdXAgaW51c2UgY2h1bmtzIHdpdGggb3Igd2l0aG91dCBmb290ZXJzICovCisKKyNpZiAhRk9PVEVSUworCisjZGVmaW5lIG1hcmtfaW51c2VfZm9vdChNLHAscykKKworLyogU2V0IGNpbnVzZSBiaXQgYW5kIHBpbnVzZSBiaXQgb2YgbmV4dCBjaHVuayAqLworI2RlZmluZSBzZXRfaW51c2UoTSxwLHMpXAorICAoKHApLT5oZWFkID0gKCgocCktPmhlYWQgJiBQSU5VU0VfQklUKXxzfENJTlVTRV9CSVQpLFwKKyAgKChtY2h1bmtwdHIpKCgoY2hhciopKHApKSArIChzKSkpLT5oZWFkIHw9IFBJTlVTRV9CSVQpCisKKy8qIFNldCBjaW51c2UgYW5kIHBpbnVzZSBvZiB0aGlzIGNodW5rIGFuZCBwaW51c2Ugb2YgbmV4dCBjaHVuayAqLworI2RlZmluZSBzZXRfaW51c2VfYW5kX3BpbnVzZShNLHAscylcCisgICgocCktPmhlYWQgPSAoc3xQSU5VU0VfQklUfENJTlVTRV9CSVQpLFwKKyAgKChtY2h1bmtwdHIpKCgoY2hhciopKHApKSArIChzKSkpLT5oZWFkIHw9IFBJTlVTRV9CSVQpCisKKy8qIFNldCBzaXplLCBjaW51c2UgYW5kIHBpbnVzZSBiaXQgb2YgdGhpcyBjaHVuayAqLworI2RlZmluZSBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKE0sIHAsIHMpXAorICAoKHApLT5oZWFkID0gKHN8UElOVVNFX0JJVHxDSU5VU0VfQklUKSkKKworI2Vsc2UgLyogRk9PVEVSUyAqLworCisvKiBTZXQgZm9vdCBvZiBpbnVzZSBjaHVuayB0byBiZSB4b3Igb2YgbXN0YXRlIGFuZCBzZWVkICovCisjZGVmaW5lIG1hcmtfaW51c2VfZm9vdChNLHAscylcCisgICgoKG1jaHVua3B0cikoKGNoYXIqKShwKSArIChzKSkpLT5wcmV2X2Zvb3QgPSAoKHNpemVfdCkoTSkgXiBtcGFyYW1zLm1hZ2ljKSkKKworI2RlZmluZSBnZXRfbXN0YXRlX2ZvcihwKVwKKyAgKChtc3RhdGUpKCgobWNodW5rcHRyKSgoY2hhciopKHApICtcCisgICAgKGNodW5rc2l6ZShwKSkpKS0+cHJldl9mb290IF4gbXBhcmFtcy5tYWdpYykpCisKKyNkZWZpbmUgc2V0X2ludXNlKE0scCxzKVwKKyAgKChwKS0+aGVhZCA9ICgoKHApLT5oZWFkICYgUElOVVNFX0JJVCl8c3xDSU5VU0VfQklUKSxcCisgICgoKG1jaHVua3B0cikoKChjaGFyKikocCkpICsgKHMpKSktPmhlYWQgfD0gUElOVVNFX0JJVCksIFwKKyAgbWFya19pbnVzZV9mb290KE0scCxzKSkKKworI2RlZmluZSBzZXRfaW51c2VfYW5kX3BpbnVzZShNLHAscylcCisgICgocCktPmhlYWQgPSAoc3xQSU5VU0VfQklUfENJTlVTRV9CSVQpLFwKKyAgKCgobWNodW5rcHRyKSgoKGNoYXIqKShwKSkgKyAocykpKS0+aGVhZCB8PSBQSU5VU0VfQklUKSxcCisgbWFya19pbnVzZV9mb290KE0scCxzKSkKKworI2RlZmluZSBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKE0sIHAsIHMpXAorICAoKHApLT5oZWFkID0gKHN8UElOVVNFX0JJVHxDSU5VU0VfQklUKSxcCisgIG1hcmtfaW51c2VfZm9vdChNLCBwLCBzKSkKKworI2VuZGlmIC8qICFGT09URVJTICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2V0dGluZyBtcGFyYW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEluaXRpYWxpemUgbXBhcmFtcyAqLworc3RhdGljIGludCBpbml0X21wYXJhbXModm9pZCkgeworICBpZiAobXBhcmFtcy5wYWdlX3NpemUgPT0gMCkgeworICAgIHNpemVfdCBzOworCisgICAgbXBhcmFtcy5tbWFwX3RocmVzaG9sZCA9IERFRkFVTFRfTU1BUF9USFJFU0hPTEQ7CisgICAgbXBhcmFtcy50cmltX3RocmVzaG9sZCA9IERFRkFVTFRfVFJJTV9USFJFU0hPTEQ7CisjaWYgTU9SRUNPUkVfQ09OVElHVU9VUworICAgIG1wYXJhbXMuZGVmYXVsdF9tZmxhZ3MgPSBVU0VfTE9DS19CSVR8VVNFX01NQVBfQklUOworI2Vsc2UgIC8qIE1PUkVDT1JFX0NPTlRJR1VPVVMgKi8KKyAgICBtcGFyYW1zLmRlZmF1bHRfbWZsYWdzID0gVVNFX0xPQ0tfQklUfFVTRV9NTUFQX0JJVHxVU0VfTk9OQ09OVElHVU9VU19CSVQ7CisjZW5kaWYgLyogTU9SRUNPUkVfQ09OVElHVU9VUyAqLworCisjaWYgKEZPT1RFUlMgJiYgIUlOU0VDVVJFKQorICAgIHsKKyNpZiBVU0VfREVWX1JBTkRPTQorICAgICAgaW50IGZkOworICAgICAgdW5zaWduZWQgY2hhciBidWZbc2l6ZW9mKHNpemVfdCldOworICAgICAgLyogVHJ5IHRvIHVzZSAvZGV2L3VyYW5kb20sIGVsc2UgZmFsbCBiYWNrIG9uIHVzaW5nIHRpbWUgKi8KKyAgICAgIGlmICgoZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSkpID49IDAgJiYKKyAgICAgICAgICByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSA9PSBzaXplb2YoYnVmKSkgeworICAgICAgICBzID0gKigoc2l6ZV90ICopIGJ1Zik7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZiAvKiBVU0VfREVWX1JBTkRPTSAqLworICAgICAgICBzID0gKHNpemVfdCkodGltZSgwKSBeIChzaXplX3QpMHg1NTU1NTU1NVUpOworCisgICAgICBzIHw9IChzaXplX3QpOFU7ICAgIC8qIGVuc3VyZSBub256ZXJvICovCisgICAgICBzICY9IH4oc2l6ZV90KTdVOyAgIC8qIGltcHJvdmUgY2hhbmNlcyBvZiBmYXVsdCBmb3IgYmFkIHZhbHVlcyAqLworCisgICAgfQorI2Vsc2UgLyogKEZPT1RFUlMgJiYgIUlOU0VDVVJFKSAqLworICAgIHMgPSAoc2l6ZV90KTB4NTg1ODU4NThVOworI2VuZGlmIC8qIChGT09URVJTICYmICFJTlNFQ1VSRSkgKi8KKyAgICBBQ1FVSVJFX01BR0lDX0lOSVRfTE9DSygpOworICAgIGlmIChtcGFyYW1zLm1hZ2ljID09IDApIHsKKyAgICAgIG1wYXJhbXMubWFnaWMgPSBzOworICAgICAgLyogU2V0IHVwIGxvY2sgZm9yIG1haW4gbWFsbG9jIGFyZWEgKi8KKyAgICAgIElOSVRJQUxfTE9DSygmZ20tPm11dGV4KTsKKyAgICAgIGdtLT5tZmxhZ3MgPSBtcGFyYW1zLmRlZmF1bHRfbWZsYWdzOworICAgIH0KKyAgICBSRUxFQVNFX01BR0lDX0lOSVRfTE9DSygpOworCisjaWZuZGVmIFdJTjMyCisgICAgbXBhcmFtcy5wYWdlX3NpemUgPSBtYWxsb2NfZ2V0cGFnZXNpemU7CisgICAgbXBhcmFtcy5ncmFudWxhcml0eSA9ICgoREVGQVVMVF9HUkFOVUxBUklUWSAhPSAwKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfR1JBTlVMQVJJVFkgOiBtcGFyYW1zLnBhZ2Vfc2l6ZSk7CisjZWxzZSAvKiBXSU4zMiAqLworICAgIHsKKyAgICAgIFNZU1RFTV9JTkZPIHN5c3RlbV9pbmZvOworICAgICAgR2V0U3lzdGVtSW5mbygmc3lzdGVtX2luZm8pOworICAgICAgbXBhcmFtcy5wYWdlX3NpemUgPSBzeXN0ZW1faW5mby5kd1BhZ2VTaXplOworICAgICAgbXBhcmFtcy5ncmFudWxhcml0eSA9IHN5c3RlbV9pbmZvLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5OworICAgIH0KKyNlbmRpZiAvKiBXSU4zMiAqLworCisgICAgLyogU2FuaXR5LWNoZWNrIGNvbmZpZ3VyYXRpb246CisgICAgICAgc2l6ZV90IG11c3QgYmUgdW5zaWduZWQgYW5kIGFzIHdpZGUgYXMgcG9pbnRlciB0eXBlLgorICAgICAgIGludHMgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVzLgorICAgICAgIGFsaWdubWVudCBtdXN0IGJlIGF0IGxlYXN0IDguCisgICAgICAgQWxpZ25tZW50LCBtaW4gY2h1bmsgc2l6ZSwgYW5kIHBhZ2Ugc2l6ZSBtdXN0IGFsbCBiZSBwb3dlcnMgb2YgMi4KKyAgICAqLworICAgIGlmICgoc2l6ZW9mKHNpemVfdCkgIT0gc2l6ZW9mKGNoYXIqKSkgfHwKKyAgICAgICAgKE1BWF9TSVpFX1QgPCBNSU5fQ0hVTktfU0laRSkgIHx8CisgICAgICAgIChzaXplb2YoaW50KSA8IDQpICB8fAorICAgICAgICAoTUFMTE9DX0FMSUdOTUVOVCA8IChzaXplX3QpOFUpIHx8CisgICAgICAgICgoTUFMTE9DX0FMSUdOTUVOVCAgICAmIChNQUxMT0NfQUxJR05NRU5ULVNJWkVfVF9PTkUpKSAgICAhPSAwKSB8fAorICAgICAgICAoKE1DSFVOS19TSVpFICAgICAgICAgJiAoTUNIVU5LX1NJWkUtU0laRV9UX09ORSkpICAgICAgICAgIT0gMCkgfHwKKyAgICAgICAgKChtcGFyYW1zLmdyYW51bGFyaXR5ICYgKG1wYXJhbXMuZ3JhbnVsYXJpdHktU0laRV9UX09ORSkpICE9IDApIHx8CisgICAgICAgICgobXBhcmFtcy5wYWdlX3NpemUgICAmIChtcGFyYW1zLnBhZ2Vfc2l6ZS1TSVpFX1RfT05FKSkgICAhPSAwKSkKKyAgICAgIEFCT1JUOworICB9CisgIHJldHVybiAwOworfQorCisvKiBzdXBwb3J0IGZvciBtYWxsb3B0ICovCitzdGF0aWMgaW50IGNoYW5nZV9tcGFyYW0oaW50IHBhcmFtX251bWJlciwgaW50IHZhbHVlKSB7CisgIHNpemVfdCB2YWwgPSAoc2l6ZV90KXZhbHVlOworICBpbml0X21wYXJhbXMoKTsKKyAgc3dpdGNoKHBhcmFtX251bWJlcikgeworICBjYXNlIE1fVFJJTV9USFJFU0hPTEQ6CisgICAgbXBhcmFtcy50cmltX3RocmVzaG9sZCA9IHZhbDsKKyAgICByZXR1cm4gMTsKKyAgY2FzZSBNX0dSQU5VTEFSSVRZOgorICAgIGlmICh2YWwgPj0gbXBhcmFtcy5wYWdlX3NpemUgJiYgKCh2YWwgJiAodmFsLTEpKSA9PSAwKSkgeworICAgICAgbXBhcmFtcy5ncmFudWxhcml0eSA9IHZhbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgY2FzZSBNX01NQVBfVEhSRVNIT0xEOgorICAgIG1wYXJhbXMubW1hcF90aHJlc2hvbGQgPSB2YWw7CisgICAgcmV0dXJuIDE7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2lmIERFQlVHCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlYnVnZ2luZyBTdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGFueSBjaHVuaywgd2hldGhlciBmcmVlLCBpbnVzZSwgbW1hcHBlZCBldGMgICovCitzdGF0aWMgdm9pZCBkb19jaGVja19hbnlfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7CisgIGFzc2VydCgoaXNfYWxpZ25lZChjaHVuazJtZW0ocCkpKSB8fCAocC0+aGVhZCA9PSBGRU5DRVBPU1RfSEVBRCkpOworICBhc3NlcnQob2tfYWRkcmVzcyhtLCBwKSk7Cit9CisKKy8qIENoZWNrIHByb3BlcnRpZXMgb2YgdG9wIGNodW5rICovCitzdGF0aWMgdm9pZCBkb19jaGVja190b3BfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7CisgIG1zZWdtZW50cHRyIHNwID0gc2VnbWVudF9ob2xkaW5nKG0sIChjaGFyKilwKTsKKyAgc2l6ZV90ICBzeiA9IGNodW5rc2l6ZShwKTsKKyAgYXNzZXJ0KHNwICE9IDApOworICBhc3NlcnQoKGlzX2FsaWduZWQoY2h1bmsybWVtKHApKSkgfHwgKHAtPmhlYWQgPT0gRkVOQ0VQT1NUX0hFQUQpKTsKKyAgYXNzZXJ0KG9rX2FkZHJlc3MobSwgcCkpOworICBhc3NlcnQoc3ogPT0gbS0+dG9wc2l6ZSk7CisgIGFzc2VydChzeiA+IDApOworICBhc3NlcnQoc3ogPT0gKChzcC0+YmFzZSArIHNwLT5zaXplKSAtIChjaGFyKilwKSAtIFRPUF9GT09UX1NJWkUpOworICBhc3NlcnQocGludXNlKHApKTsKKyAgYXNzZXJ0KCFuZXh0X3BpbnVzZShwKSk7Cit9CisKKy8qIENoZWNrIHByb3BlcnRpZXMgb2YgKGludXNlKSBtbWFwcGVkIGNodW5rcyAqLworc3RhdGljIHZvaWQgZG9fY2hlY2tfbW1hcHBlZF9jaHVuayhtc3RhdGUgbSwgbWNodW5rcHRyIHApIHsKKyAgc2l6ZV90ICBzeiA9IGNodW5rc2l6ZShwKTsKKyAgc2l6ZV90IGxlbiA9IChzeiArIChwLT5wcmV2X2Zvb3QgJiB+SVNfTU1BUFBFRF9CSVQpICsgTU1BUF9GT09UX1BBRCk7CisgIGFzc2VydChpc19tbWFwcGVkKHApKTsKKyAgYXNzZXJ0KHVzZV9tbWFwKG0pKTsKKyAgYXNzZXJ0KChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpIHx8IChwLT5oZWFkID09IEZFTkNFUE9TVF9IRUFEKSk7CisgIGFzc2VydChva19hZGRyZXNzKG0sIHApKTsKKyAgYXNzZXJ0KCFpc19zbWFsbChzeikpOworICBhc3NlcnQoKGxlbiAmIChtcGFyYW1zLnBhZ2Vfc2l6ZS1TSVpFX1RfT05FKSkgPT0gMCk7CisgIGFzc2VydChjaHVua19wbHVzX29mZnNldChwLCBzeiktPmhlYWQgPT0gRkVOQ0VQT1NUX0hFQUQpOworICBhc3NlcnQoY2h1bmtfcGx1c19vZmZzZXQocCwgc3orU0laRV9UX1NJWkUpLT5oZWFkID09IDApOworfQorCisvKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGludXNlIGNodW5rcyAqLworc3RhdGljIHZvaWQgZG9fY2hlY2tfaW51c2VfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7CisgIGRvX2NoZWNrX2FueV9jaHVuayhtLCBwKTsKKyAgYXNzZXJ0KGNpbnVzZShwKSk7CisgIGFzc2VydChuZXh0X3BpbnVzZShwKSk7CisgIC8qIElmIG5vdCBwaW51c2UgYW5kIG5vdCBtbWFwcGVkLCBwcmV2aW91cyBjaHVuayBoYXMgT0sgb2Zmc2V0ICovCisgIGFzc2VydChpc19tbWFwcGVkKHApIHx8IHBpbnVzZShwKSB8fCBuZXh0X2NodW5rKHByZXZfY2h1bmsocCkpID09IHApOworICBpZiAoaXNfbW1hcHBlZChwKSkKKyAgICBkb19jaGVja19tbWFwcGVkX2NodW5rKG0sIHApOworfQorCisvKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGZyZWUgY2h1bmtzICovCitzdGF0aWMgdm9pZCBkb19jaGVja19mcmVlX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCkgeworICBzaXplX3Qgc3ogPSBwLT5oZWFkICYgfihQSU5VU0VfQklUfENJTlVTRV9CSVQpOworICBtY2h1bmtwdHIgbmV4dCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIHN6KTsKKyAgZG9fY2hlY2tfYW55X2NodW5rKG0sIHApOworICBhc3NlcnQoIWNpbnVzZShwKSk7CisgIGFzc2VydCghbmV4dF9waW51c2UocCkpOworICBhc3NlcnQgKCFpc19tbWFwcGVkKHApKTsKKyAgaWYgKHAgIT0gbS0+ZHYgJiYgcCAhPSBtLT50b3ApIHsKKyAgICBpZiAoc3ogPj0gTUlOX0NIVU5LX1NJWkUpIHsKKyAgICAgIGFzc2VydCgoc3ogJiBDSFVOS19BTElHTl9NQVNLKSA9PSAwKTsKKyAgICAgIGFzc2VydChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpOworICAgICAgYXNzZXJ0KG5leHQtPnByZXZfZm9vdCA9PSBzeik7CisgICAgICBhc3NlcnQocGludXNlKHApKTsKKyAgICAgIGFzc2VydCAobmV4dCA9PSBtLT50b3AgfHwgY2ludXNlKG5leHQpKTsKKyAgICAgIGFzc2VydChwLT5mZC0+YmsgPT0gcCk7CisgICAgICBhc3NlcnQocC0+YmstPmZkID09IHApOworICAgIH0KKyAgICBlbHNlICAvKiBtYXJrZXJzIGFyZSBhbHdheXMgb2Ygc2l6ZSBTSVpFX1RfU0laRSAqLworICAgICAgYXNzZXJ0KHN6ID09IFNJWkVfVF9TSVpFKTsKKyAgfQorfQorCisvKiBDaGVjayBwcm9wZXJ0aWVzIG9mIG1hbGxvY2VkIGNodW5rcyBhdCB0aGUgcG9pbnQgdGhleSBhcmUgbWFsbG9jZWQgKi8KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX21hbGxvY2VkX2NodW5rKG1zdGF0ZSBtLCB2b2lkKiBtZW0sIHNpemVfdCBzKSB7CisgIGlmIChtZW0gIT0gMCkgeworICAgIG1jaHVua3B0ciBwID0gbWVtMmNodW5rKG1lbSk7CisgICAgc2l6ZV90IHN6ID0gcC0+aGVhZCAmIH4oUElOVVNFX0JJVHxDSU5VU0VfQklUKTsKKyAgICBkb19jaGVja19pbnVzZV9jaHVuayhtLCBwKTsKKyAgICBhc3NlcnQoKHN6ICYgQ0hVTktfQUxJR05fTUFTSykgPT0gMCk7CisgICAgYXNzZXJ0KHN6ID49IE1JTl9DSFVOS19TSVpFKTsKKyAgICBhc3NlcnQoc3ogPj0gcyk7CisgICAgLyogdW5sZXNzIG1tYXBwZWQsIHNpemUgaXMgbGVzcyB0aGFuIE1JTl9DSFVOS19TSVpFIG1vcmUgdGhhbiByZXF1ZXN0ICovCisgICAgYXNzZXJ0KGlzX21tYXBwZWQocCkgfHwgc3ogPCAocyArIE1JTl9DSFVOS19TSVpFKSk7CisgIH0KK30KKworLyogQ2hlY2sgYSB0cmVlIGFuZCBpdHMgc3VidHJlZXMuICAqLworc3RhdGljIHZvaWQgZG9fY2hlY2tfdHJlZShtc3RhdGUgbSwgdGNodW5rcHRyIHQpIHsKKyAgdGNodW5rcHRyIGhlYWQgPSAwOworICB0Y2h1bmtwdHIgdSA9IHQ7CisgIGJpbmRleF90IHRpbmRleCA9IHQtPmluZGV4OworICBzaXplX3QgdHNpemUgPSBjaHVua3NpemUodCk7CisgIGJpbmRleF90IGlkeDsKKyAgY29tcHV0ZV90cmVlX2luZGV4KHRzaXplLCBpZHgpOworICBhc3NlcnQodGluZGV4ID09IGlkeCk7CisgIGFzc2VydCh0c2l6ZSA+PSBNSU5fTEFSR0VfU0laRSk7CisgIGFzc2VydCh0c2l6ZSA+PSBtaW5zaXplX2Zvcl90cmVlX2luZGV4KGlkeCkpOworICBhc3NlcnQoKGlkeCA9PSBOVFJFRUJJTlMtMSkgfHwgKHRzaXplIDwgbWluc2l6ZV9mb3JfdHJlZV9pbmRleCgoaWR4KzEpKSkpOworCisgIGRvIHsgLyogdHJhdmVyc2UgdGhyb3VnaCBjaGFpbiBvZiBzYW1lLXNpemVkIG5vZGVzICovCisgICAgZG9fY2hlY2tfYW55X2NodW5rKG0sICgobWNodW5rcHRyKXUpKTsKKyAgICBhc3NlcnQodS0+aW5kZXggPT0gdGluZGV4KTsKKyAgICBhc3NlcnQoY2h1bmtzaXplKHUpID09IHRzaXplKTsKKyAgICBhc3NlcnQoIWNpbnVzZSh1KSk7CisgICAgYXNzZXJ0KCFuZXh0X3BpbnVzZSh1KSk7CisgICAgYXNzZXJ0KHUtPmZkLT5iayA9PSB1KTsKKyAgICBhc3NlcnQodS0+YmstPmZkID09IHUpOworICAgIGlmICh1LT5wYXJlbnQgPT0gMCkgeworICAgICAgYXNzZXJ0KHUtPmNoaWxkWzBdID09IDApOworICAgICAgYXNzZXJ0KHUtPmNoaWxkWzFdID09IDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGFzc2VydChoZWFkID09IDApOyAvKiBvbmx5IG9uZSBub2RlIG9uIGNoYWluIGhhcyBwYXJlbnQgKi8KKyAgICAgIGhlYWQgPSB1OworICAgICAgYXNzZXJ0KHUtPnBhcmVudCAhPSB1KTsKKyAgICAgIGFzc2VydCAodS0+cGFyZW50LT5jaGlsZFswXSA9PSB1IHx8CisgICAgICAgICAgICAgIHUtPnBhcmVudC0+Y2hpbGRbMV0gPT0gdSB8fAorICAgICAgICAgICAgICAqKCh0YmlucHRyKikodS0+cGFyZW50KSkgPT0gdSk7CisgICAgICBpZiAodS0+Y2hpbGRbMF0gIT0gMCkgeworICAgICAgICBhc3NlcnQodS0+Y2hpbGRbMF0tPnBhcmVudCA9PSB1KTsKKyAgICAgICAgYXNzZXJ0KHUtPmNoaWxkWzBdICE9IHUpOworICAgICAgICBkb19jaGVja190cmVlKG0sIHUtPmNoaWxkWzBdKTsKKyAgICAgIH0KKyAgICAgIGlmICh1LT5jaGlsZFsxXSAhPSAwKSB7CisgICAgICAgIGFzc2VydCh1LT5jaGlsZFsxXS0+cGFyZW50ID09IHUpOworICAgICAgICBhc3NlcnQodS0+Y2hpbGRbMV0gIT0gdSk7CisgICAgICAgIGRvX2NoZWNrX3RyZWUobSwgdS0+Y2hpbGRbMV0pOworICAgICAgfQorICAgICAgaWYgKHUtPmNoaWxkWzBdICE9IDAgJiYgdS0+Y2hpbGRbMV0gIT0gMCkgeworICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHUtPmNoaWxkWzBdKSA8IGNodW5rc2l6ZSh1LT5jaGlsZFsxXSkpOworICAgICAgfQorICAgIH0KKyAgICB1ID0gdS0+ZmQ7CisgIH0gd2hpbGUgKHUgIT0gdCk7CisgIGFzc2VydChoZWFkICE9IDApOworfQorCisvKiAgQ2hlY2sgYWxsIHRoZSBjaHVua3MgaW4gYSB0cmVlYmluLiAgKi8KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX3RyZWViaW4obXN0YXRlIG0sIGJpbmRleF90IGkpIHsKKyAgdGJpbnB0ciogdGIgPSB0cmVlYmluX2F0KG0sIGkpOworICB0Y2h1bmtwdHIgdCA9ICp0YjsKKyAgaW50IGVtcHR5ID0gKG0tPnRyZWVtYXAgJiAoMVUgPDwgaSkpID09IDA7CisgIGlmICh0ID09IDApCisgICAgYXNzZXJ0KGVtcHR5KTsKKyAgaWYgKCFlbXB0eSkKKyAgICBkb19jaGVja190cmVlKG0sIHQpOworfQorCisvKiAgQ2hlY2sgYWxsIHRoZSBjaHVua3MgaW4gYSBzbWFsbGJpbi4gICovCitzdGF0aWMgdm9pZCBkb19jaGVja19zbWFsbGJpbihtc3RhdGUgbSwgYmluZGV4X3QgaSkgeworICBzYmlucHRyIGIgPSBzbWFsbGJpbl9hdChtLCBpKTsKKyAgbWNodW5rcHRyIHAgPSBiLT5iazsKKyAgdW5zaWduZWQgaW50IGVtcHR5ID0gKG0tPnNtYWxsbWFwICYgKDFVIDw8IGkpKSA9PSAwOworICBpZiAocCA9PSBiKQorICAgIGFzc2VydChlbXB0eSk7CisgIGlmICghZW1wdHkpIHsKKyAgICBmb3IgKDsgcCAhPSBiOyBwID0gcC0+YmspIHsKKyAgICAgIHNpemVfdCBzaXplID0gY2h1bmtzaXplKHApOworICAgICAgbWNodW5rcHRyIHE7CisgICAgICAvKiBlYWNoIGNodW5rIGNsYWltcyB0byBiZSBmcmVlICovCisgICAgICBkb19jaGVja19mcmVlX2NodW5rKG0sIHApOworICAgICAgLyogY2h1bmsgYmVsb25ncyBpbiBiaW4gKi8KKyAgICAgIGFzc2VydChzbWFsbF9pbmRleChzaXplKSA9PSBpKTsKKyAgICAgIGFzc2VydChwLT5iayA9PSBiIHx8IGNodW5rc2l6ZShwLT5iaykgPT0gY2h1bmtzaXplKHApKTsKKyAgICAgIC8qIGNodW5rIGlzIGZvbGxvd2VkIGJ5IGFuIGludXNlIGNodW5rICovCisgICAgICBxID0gbmV4dF9jaHVuayhwKTsKKyAgICAgIGlmIChxLT5oZWFkICE9IEZFTkNFUE9TVF9IRUFEKQorICAgICAgICBkb19jaGVja19pbnVzZV9jaHVuayhtLCBxKTsKKyAgICB9CisgIH0KK30KKworLyogRmluZCB4IGluIGEgYmluLiBVc2VkIGluIG90aGVyIGNoZWNrIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyBpbnQgYmluX2ZpbmQobXN0YXRlIG0sIG1jaHVua3B0ciB4KSB7CisgIHNpemVfdCBzaXplID0gY2h1bmtzaXplKHgpOworICBpZiAoaXNfc21hbGwoc2l6ZSkpIHsKKyAgICBiaW5kZXhfdCBzaWR4ID0gc21hbGxfaW5kZXgoc2l6ZSk7CisgICAgc2JpbnB0ciBiID0gc21hbGxiaW5fYXQobSwgc2lkeCk7CisgICAgaWYgKHNtYWxsbWFwX2lzX21hcmtlZChtLCBzaWR4KSkgeworICAgICAgbWNodW5rcHRyIHAgPSBiOworICAgICAgZG8geworICAgICAgICBpZiAocCA9PSB4KQorICAgICAgICAgIHJldHVybiAxOworICAgICAgfSB3aGlsZSAoKHAgPSBwLT5mZCkgIT0gYik7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGJpbmRleF90IHRpZHg7CisgICAgY29tcHV0ZV90cmVlX2luZGV4KHNpemUsIHRpZHgpOworICAgIGlmICh0cmVlbWFwX2lzX21hcmtlZChtLCB0aWR4KSkgeworICAgICAgdGNodW5rcHRyIHQgPSAqdHJlZWJpbl9hdChtLCB0aWR4KTsKKyAgICAgIHNpemVfdCBzaXplYml0cyA9IHNpemUgPDwgbGVmdHNoaWZ0X2Zvcl90cmVlX2luZGV4KHRpZHgpOworICAgICAgd2hpbGUgKHQgIT0gMCAmJiBjaHVua3NpemUodCkgIT0gc2l6ZSkgeworICAgICAgICB0ID0gdC0+Y2hpbGRbKHNpemViaXRzID4+IChTSVpFX1RfQklUU0laRS1TSVpFX1RfT05FKSkgJiAxXTsKKyAgICAgICAgc2l6ZWJpdHMgPDw9IDE7CisgICAgICB9CisgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHRjaHVua3B0ciB1ID0gdDsKKyAgICAgICAgZG8geworICAgICAgICAgIGlmICh1ID09ICh0Y2h1bmtwdHIpeCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IHdoaWxlICgodSA9IHUtPmZkKSAhPSB0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRyYXZlcnNlIGVhY2ggY2h1bmsgYW5kIGNoZWNrIGl0OyByZXR1cm4gdG90YWwgKi8KK3N0YXRpYyBzaXplX3QgdHJhdmVyc2VfYW5kX2NoZWNrKG1zdGF0ZSBtKSB7CisgIHNpemVfdCBzdW0gPSAwOworICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsKKyAgICBtc2VnbWVudHB0ciBzID0gJm0tPnNlZzsKKyAgICBzdW0gKz0gbS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkU7CisgICAgd2hpbGUgKHMgIT0gMCkgeworICAgICAgbWNodW5rcHRyIHEgPSBhbGlnbl9hc19jaHVuayhzLT5iYXNlKTsKKyAgICAgIG1jaHVua3B0ciBsYXN0cSA9IDA7CisgICAgICBhc3NlcnQocGludXNlKHEpKTsKKyAgICAgIHdoaWxlIChzZWdtZW50X2hvbGRzKHMsIHEpICYmCisgICAgICAgICAgICAgcSAhPSBtLT50b3AgJiYgcS0+aGVhZCAhPSBGRU5DRVBPU1RfSEVBRCkgeworICAgICAgICBzdW0gKz0gY2h1bmtzaXplKHEpOworICAgICAgICBpZiAoY2ludXNlKHEpKSB7CisgICAgICAgICAgYXNzZXJ0KCFiaW5fZmluZChtLCBxKSk7CisgICAgICAgICAgZG9fY2hlY2tfaW51c2VfY2h1bmsobSwgcSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgYXNzZXJ0KHEgPT0gbS0+ZHYgfHwgYmluX2ZpbmQobSwgcSkpOworICAgICAgICAgIGFzc2VydChsYXN0cSA9PSAwIHx8IGNpbnVzZShsYXN0cSkpOyAvKiBOb3QgMiBjb25zZWN1dGl2ZSBmcmVlICovCisgICAgICAgICAgZG9fY2hlY2tfZnJlZV9jaHVuayhtLCBxKTsKKyAgICAgICAgfQorICAgICAgICBsYXN0cSA9IHE7CisgICAgICAgIHEgPSBuZXh0X2NodW5rKHEpOworICAgICAgfQorICAgICAgcyA9IHMtPm5leHQ7CisgICAgfQorICB9CisgIHJldHVybiBzdW07Cit9CisKKy8qIENoZWNrIGFsbCBwcm9wZXJ0aWVzIG9mIG1hbGxvY19zdGF0ZS4gKi8KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX21hbGxvY19zdGF0ZShtc3RhdGUgbSkgeworICBiaW5kZXhfdCBpOworICBzaXplX3QgdG90YWw7CisgIC8qIGNoZWNrIGJpbnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5TTUFMTEJJTlM7ICsraSkKKyAgICBkb19jaGVja19zbWFsbGJpbihtLCBpKTsKKyAgZm9yIChpID0gMDsgaSA8IE5UUkVFQklOUzsgKytpKQorICAgIGRvX2NoZWNrX3RyZWViaW4obSwgaSk7CisKKyAgaWYgKG0tPmR2c2l6ZSAhPSAwKSB7IC8qIGNoZWNrIGR2IGNodW5rICovCisgICAgZG9fY2hlY2tfYW55X2NodW5rKG0sIG0tPmR2KTsKKyAgICBhc3NlcnQobS0+ZHZzaXplID09IGNodW5rc2l6ZShtLT5kdikpOworICAgIGFzc2VydChtLT5kdnNpemUgPj0gTUlOX0NIVU5LX1NJWkUpOworICAgIGFzc2VydChiaW5fZmluZChtLCBtLT5kdikgPT0gMCk7CisgIH0KKworICBpZiAobS0+dG9wICE9IDApIHsgICAvKiBjaGVjayB0b3AgY2h1bmsgKi8KKyAgICBkb19jaGVja190b3BfY2h1bmsobSwgbS0+dG9wKTsKKyAgICBhc3NlcnQobS0+dG9wc2l6ZSA9PSBjaHVua3NpemUobS0+dG9wKSk7CisgICAgYXNzZXJ0KG0tPnRvcHNpemUgPiAwKTsKKyAgICBhc3NlcnQoYmluX2ZpbmQobSwgbS0+dG9wKSA9PSAwKTsKKyAgfQorCisgIHRvdGFsID0gdHJhdmVyc2VfYW5kX2NoZWNrKG0pOworICBhc3NlcnQodG90YWwgPD0gbS0+Zm9vdHByaW50KTsKKyAgYXNzZXJ0KG0tPmZvb3RwcmludCA8PSBtLT5tYXhfZm9vdHByaW50KTsKK30KKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0aXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgIU5PX01BTExJTkZPCitzdGF0aWMgc3RydWN0IG1hbGxpbmZvIGludGVybmFsX21hbGxpbmZvKG1zdGF0ZSBtKSB7CisgIHN0cnVjdCBtYWxsaW5mbyBubSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBpZiAoIVBSRUFDVElPTihtKSkgeworICAgIGNoZWNrX21hbGxvY19zdGF0ZShtKTsKKyAgICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsKKyAgICAgIHNpemVfdCBuZnJlZSA9IFNJWkVfVF9PTkU7IC8qIHRvcCBhbHdheXMgZnJlZSAqLworICAgICAgc2l6ZV90IG1mcmVlID0gbS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkU7CisgICAgICBzaXplX3Qgc3VtID0gbWZyZWU7CisgICAgICBtc2VnbWVudHB0ciBzID0gJm0tPnNlZzsKKyAgICAgIHdoaWxlIChzICE9IDApIHsKKyAgICAgICAgbWNodW5rcHRyIHEgPSBhbGlnbl9hc19jaHVuayhzLT5iYXNlKTsKKyAgICAgICAgd2hpbGUgKHNlZ21lbnRfaG9sZHMocywgcSkgJiYKKyAgICAgICAgICAgICAgIHEgIT0gbS0+dG9wICYmIHEtPmhlYWQgIT0gRkVOQ0VQT1NUX0hFQUQpIHsKKyAgICAgICAgICBzaXplX3Qgc3ogPSBjaHVua3NpemUocSk7CisgICAgICAgICAgc3VtICs9IHN6OworICAgICAgICAgIGlmICghY2ludXNlKHEpKSB7CisgICAgICAgICAgICBtZnJlZSArPSBzejsKKyAgICAgICAgICAgICsrbmZyZWU7CisgICAgICAgICAgfQorICAgICAgICAgIHEgPSBuZXh0X2NodW5rKHEpOworICAgICAgICB9CisgICAgICAgIHMgPSBzLT5uZXh0OworICAgICAgfQorCisgICAgICBubS5hcmVuYSAgICA9IHN1bTsKKyAgICAgIG5tLm9yZGJsa3MgID0gbmZyZWU7CisgICAgICBubS5oYmxraGQgICA9IG0tPmZvb3RwcmludCAtIHN1bTsKKyAgICAgIG5tLnVzbWJsa3MgID0gbS0+bWF4X2Zvb3RwcmludDsKKyAgICAgIG5tLnVvcmRibGtzID0gbS0+Zm9vdHByaW50IC0gbWZyZWU7CisgICAgICBubS5mb3JkYmxrcyA9IG1mcmVlOworICAgICAgbm0ua2VlcGNvc3QgPSBtLT50b3BzaXplOworICAgIH0KKworICAgIFBPU1RBQ1RJT04obSk7CisgIH0KKyAgcmV0dXJuIG5tOworfQorI2VuZGlmIC8qICFOT19NQUxMSU5GTyAqLworCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9tYWxsb2Nfc3RhdHMobXN0YXRlIG0pIHsKKyAgaWYgKCFQUkVBQ1RJT04obSkpIHsKKyAgICBzaXplX3QgbWF4ZnAgPSAwOworICAgIHNpemVfdCBmcCA9IDA7CisgICAgc2l6ZV90IHVzZWQgPSAwOworICAgIGNoZWNrX21hbGxvY19zdGF0ZShtKTsKKyAgICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsKKyAgICAgIG1zZWdtZW50cHRyIHMgPSAmbS0+c2VnOworICAgICAgbWF4ZnAgPSBtLT5tYXhfZm9vdHByaW50OworICAgICAgZnAgPSBtLT5mb290cHJpbnQ7CisgICAgICB1c2VkID0gZnAgLSAobS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkUpOworCisgICAgICB3aGlsZSAocyAhPSAwKSB7CisgICAgICAgIG1jaHVua3B0ciBxID0gYWxpZ25fYXNfY2h1bmsocy0+YmFzZSk7CisgICAgICAgIHdoaWxlIChzZWdtZW50X2hvbGRzKHMsIHEpICYmCisgICAgICAgICAgICAgICBxICE9IG0tPnRvcCAmJiBxLT5oZWFkICE9IEZFTkNFUE9TVF9IRUFEKSB7CisgICAgICAgICAgaWYgKCFjaW51c2UocSkpCisgICAgICAgICAgICB1c2VkIC09IGNodW5rc2l6ZShxKTsKKyAgICAgICAgICBxID0gbmV4dF9jaHVuayhxKTsKKyAgICAgICAgfQorICAgICAgICBzID0gcy0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisKKyNpZm5kZWYgTEFDS1NfU1RESU9fSAorICAgIGZwcmludGYoc3RkZXJyLCAibWF4IHN5c3RlbSBieXRlcyA9ICUxMGx1XG4iLCAodW5zaWduZWQgbG9uZykobWF4ZnApKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInN5c3RlbSBieXRlcyAgICAgPSAlMTBsdVxuIiwgKHVuc2lnbmVkIGxvbmcpKGZwKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJpbiB1c2UgYnl0ZXMgICAgID0gJTEwbHVcbiIsICh1bnNpZ25lZCBsb25nKSh1c2VkKSk7CisjZW5kaWYKKworICAgIFBPU1RBQ1RJT04obSk7CisgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW9ucyBvbiBzbWFsbGJpbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAgVmFyaW91cyBmb3JtcyBvZiBsaW5raW5nIGFuZCB1bmxpbmtpbmcgYXJlIGRlZmluZWQgYXMgbWFjcm9zLiAgRXZlbgorICB0aGUgb25lcyBmb3IgdHJlZXMsIHdoaWNoIGFyZSB2ZXJ5IGxvbmcgYnV0IGhhdmUgdmVyeSBzaG9ydCB0eXBpY2FsCisgIHBhdGhzLiAgVGhpcyBpcyB1Z2x5IGJ1dCByZWR1Y2VzIHJlbGlhbmNlIG9uIGlubGluaW5nIHN1cHBvcnQgb2YKKyAgY29tcGlsZXJzLgorKi8KKworLyogTGluayBhIGZyZWUgY2h1bmsgaW50byBhIHNtYWxsYmluICAqLworI2RlZmluZSBpbnNlcnRfc21hbGxfY2h1bmsoTSwgUCwgUykge1wKKyAgYmluZGV4X3QgSSAgPSBzbWFsbF9pbmRleChTKTtcCisgIG1jaHVua3B0ciBCID0gc21hbGxiaW5fYXQoTSwgSSk7XAorICBtY2h1bmtwdHIgRiA9IEI7XAorICBhc3NlcnQoUyA+PSBNSU5fQ0hVTktfU0laRSk7XAorICBpZiAoIXNtYWxsbWFwX2lzX21hcmtlZChNLCBJKSlcCisgICAgbWFya19zbWFsbG1hcChNLCBJKTtcCisgIGVsc2UgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBCLT5mZCkpKVwKKyAgICBGID0gQi0+ZmQ7XAorICBlbHNlIHtcCisgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAorICB9XAorICBCLT5mZCA9IFA7XAorICBGLT5iayA9IFA7XAorICBQLT5mZCA9IEY7XAorICBQLT5iayA9IEI7XAorfQorCisvKiBVbmxpbmsgYSBjaHVuayBmcm9tIGEgc21hbGxiaW4gICovCisjZGVmaW5lIHVubGlua19zbWFsbF9jaHVuayhNLCBQLCBTKSB7XAorICBtY2h1bmtwdHIgRiA9IFAtPmZkO1wKKyAgbWNodW5rcHRyIEIgPSBQLT5iaztcCisgIGJpbmRleF90IEkgPSBzbWFsbF9pbmRleChTKTtcCisgIGFzc2VydChQICE9IEIpO1wKKyAgYXNzZXJ0KFAgIT0gRik7XAorICBhc3NlcnQoY2h1bmtzaXplKFApID09IHNtYWxsX2luZGV4MnNpemUoSSkpO1wKKyAgaWYgKEYgPT0gQilcCisgICAgY2xlYXJfc21hbGxtYXAoTSwgSSk7XAorICBlbHNlIGlmIChSVENIRUNLKChGID09IHNtYWxsYmluX2F0KE0sSSkgfHwgb2tfYWRkcmVzcyhNLCBGKSkgJiZcCisgICAgICAgICAgICAgICAgICAgKEIgPT0gc21hbGxiaW5fYXQoTSxJKSB8fCBva19hZGRyZXNzKE0sIEIpKSkpIHtcCisgICAgRi0+YmsgPSBCO1wKKyAgICBCLT5mZCA9IEY7XAorICB9XAorICBlbHNlIHtcCisgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAorICB9XAorfQorCisvKiBVbmxpbmsgdGhlIGZpcnN0IGNodW5rIGZyb20gYSBzbWFsbGJpbiAqLworI2RlZmluZSB1bmxpbmtfZmlyc3Rfc21hbGxfY2h1bmsoTSwgQiwgUCwgSSkge1wKKyAgbWNodW5rcHRyIEYgPSBQLT5mZDtcCisgIGFzc2VydChQICE9IEIpO1wKKyAgYXNzZXJ0KFAgIT0gRik7XAorICBhc3NlcnQoY2h1bmtzaXplKFApID09IHNtYWxsX2luZGV4MnNpemUoSSkpO1wKKyAgaWYgKEIgPT0gRilcCisgICAgY2xlYXJfc21hbGxtYXAoTSwgSSk7XAorICBlbHNlIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgRikpKSB7XAorICAgIEItPmZkID0gRjtcCisgICAgRi0+YmsgPSBCO1wKKyAgfVwKKyAgZWxzZSB7XAorICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wKKyAgfVwKK30KKworLyogUmVwbGFjZSBkdiBub2RlLCBiaW5uaW5nIHRoZSBvbGQgb25lICovCisvKiBVc2VkIG9ubHkgd2hlbiBkdnNpemUga25vd24gdG8gYmUgc21hbGwgKi8KKyNkZWZpbmUgcmVwbGFjZV9kdihNLCBQLCBTKSB7XAorICBzaXplX3QgRFZTID0gTS0+ZHZzaXplO1wKKyAgaWYgKERWUyAhPSAwKSB7XAorICAgIG1jaHVua3B0ciBEViA9IE0tPmR2O1wKKyAgICBhc3NlcnQoaXNfc21hbGwoRFZTKSk7XAorICAgIGluc2VydF9zbWFsbF9jaHVuayhNLCBEViwgRFZTKTtcCisgIH1cCisgIE0tPmR2c2l6ZSA9IFM7XAorICBNLT5kdiA9IFA7XAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMgb24gdHJlZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBJbnNlcnQgY2h1bmsgaW50byB0cmVlICovCisjZGVmaW5lIGluc2VydF9sYXJnZV9jaHVuayhNLCBYLCBTKSB7XAorICB0YmlucHRyKiBIO1wKKyAgYmluZGV4X3QgSTtcCisgIGNvbXB1dGVfdHJlZV9pbmRleChTLCBJKTtcCisgIEggPSB0cmVlYmluX2F0KE0sIEkpO1wKKyAgWC0+aW5kZXggPSBJO1wKKyAgWC0+Y2hpbGRbMF0gPSBYLT5jaGlsZFsxXSA9IDA7XAorICBpZiAoIXRyZWVtYXBfaXNfbWFya2VkKE0sIEkpKSB7XAorICAgIG1hcmtfdHJlZW1hcChNLCBJKTtcCisgICAgKkggPSBYO1wKKyAgICBYLT5wYXJlbnQgPSAodGNodW5rcHRyKUg7XAorICAgIFgtPmZkID0gWC0+YmsgPSBYO1wKKyAgfVwKKyAgZWxzZSB7XAorICAgIHRjaHVua3B0ciBUID0gKkg7XAorICAgIHNpemVfdCBLID0gUyA8PCBsZWZ0c2hpZnRfZm9yX3RyZWVfaW5kZXgoSSk7XAorICAgIGZvciAoOzspIHtcCisgICAgICBpZiAoY2h1bmtzaXplKFQpICE9IFMpIHtcCisgICAgICAgIHRjaHVua3B0ciogQyA9ICYoVC0+Y2hpbGRbKEsgPj4gKFNJWkVfVF9CSVRTSVpFLVNJWkVfVF9PTkUpKSAmIDFdKTtcCisgICAgICAgIEsgPDw9IDE7XAorICAgICAgICBpZiAoKkMgIT0gMClcCisgICAgICAgICAgVCA9ICpDO1wKKyAgICAgICAgZWxzZSBpZiAoUlRDSEVDSyhva19hZGRyZXNzKE0sIEMpKSkge1wKKyAgICAgICAgICAqQyA9IFg7XAorICAgICAgICAgIFgtPnBhcmVudCA9IFQ7XAorICAgICAgICAgIFgtPmZkID0gWC0+YmsgPSBYO1wKKyAgICAgICAgICBicmVhaztcCisgICAgICAgIH1cCisgICAgICAgIGVsc2Uge1wKKyAgICAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCisgICAgICAgICAgYnJlYWs7XAorICAgICAgICB9XAorICAgICAgfVwKKyAgICAgIGVsc2Uge1wKKyAgICAgICAgdGNodW5rcHRyIEYgPSBULT5mZDtcCisgICAgICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgVCkgJiYgb2tfYWRkcmVzcyhNLCBGKSkpIHtcCisgICAgICAgICAgVC0+ZmQgPSBGLT5iayA9IFg7XAorICAgICAgICAgIFgtPmZkID0gRjtcCisgICAgICAgICAgWC0+YmsgPSBUO1wKKyAgICAgICAgICBYLT5wYXJlbnQgPSAwO1wKKyAgICAgICAgICBicmVhaztcCisgICAgICAgIH1cCisgICAgICAgIGVsc2Uge1wKKyAgICAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCisgICAgICAgICAgYnJlYWs7XAorICAgICAgICB9XAorICAgICAgfVwKKyAgICB9XAorICB9XAorfQorCisvKgorICBVbmxpbmsgc3RlcHM6CisKKyAgMS4gSWYgeCBpcyBhIGNoYWluZWQgbm9kZSwgdW5saW5rIGl0IGZyb20gaXRzIHNhbWUtc2l6ZWQgZmQvYmsgbGlua3MKKyAgICAgYW5kIGNob29zZSBpdHMgYmsgbm9kZSBhcyBpdHMgcmVwbGFjZW1lbnQuCisgIDIuIElmIHggd2FzIHRoZSBsYXN0IG5vZGUgb2YgaXRzIHNpemUsIGJ1dCBub3QgYSBsZWFmIG5vZGUsIGl0IG11c3QKKyAgICAgYmUgcmVwbGFjZWQgd2l0aCBhIGxlYWYgbm9kZSAobm90IG1lcmVseSBvbmUgd2l0aCBhbiBvcGVuIGxlZnQgb3IKKyAgICAgcmlnaHQpLCB0byBtYWtlIHN1cmUgdGhhdCBsZWZ0cyBhbmQgcmlnaHRzIG9mIGRlc2NlbmRlbnRzCisgICAgIGNvcnJlc3BvbmQgcHJvcGVybHkgdG8gYml0IG1hc2tzLiAgV2UgdXNlIHRoZSByaWdodG1vc3QgZGVzY2VuZGVudAorICAgICBvZiB4LiAgV2UgY291bGQgdXNlIGFueSBvdGhlciBsZWFmLCBidXQgdGhpcyBpcyBlYXN5IHRvIGxvY2F0ZSBhbmQKKyAgICAgdGVuZHMgdG8gY291bnRlcmFjdCByZW1vdmFsIG9mIGxlZnRtb3N0cyBlbHNld2hlcmUsIGFuZCBzbyBrZWVwcworICAgICBwYXRocyBzaG9ydGVyIHRoYW4gbWluaW1hbGx5IGd1YXJhbnRlZWQuICBUaGlzIGRvZXNuJ3QgbG9vcCBtdWNoCisgICAgIGJlY2F1c2Ugb24gYXZlcmFnZSBhIG5vZGUgaW4gYSB0cmVlIGlzIG5lYXIgdGhlIGJvdHRvbS4KKyAgMy4gSWYgeCBpcyB0aGUgYmFzZSBvZiBhIGNoYWluIChpLmUuLCBoYXMgcGFyZW50IGxpbmtzKSByZWxpbmsKKyAgICAgeCdzIHBhcmVudCBhbmQgY2hpbGRyZW4gdG8geCdzIHJlcGxhY2VtZW50IChvciBudWxsIGlmIG5vbmUpLgorKi8KKworI2RlZmluZSB1bmxpbmtfbGFyZ2VfY2h1bmsoTSwgWCkge1wKKyAgdGNodW5rcHRyIFhQID0gWC0+cGFyZW50O1wKKyAgdGNodW5rcHRyIFI7XAorICBpZiAoWC0+YmsgIT0gWCkge1wKKyAgICB0Y2h1bmtwdHIgRiA9IFgtPmZkO1wKKyAgICBSID0gWC0+Yms7XAorICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgRikpKSB7XAorICAgICAgRi0+YmsgPSBSO1wKKyAgICAgIFItPmZkID0gRjtcCisgICAgfVwKKyAgICBlbHNlIHtcCisgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCisgICAgfVwKKyAgfVwKKyAgZWxzZSB7XAorICAgIHRjaHVua3B0ciogUlA7XAorICAgIGlmICgoKFIgPSAqKFJQID0gJihYLT5jaGlsZFsxXSkpKSAhPSAwKSB8fFwKKyAgICAgICAgKChSID0gKihSUCA9ICYoWC0+Y2hpbGRbMF0pKSkgIT0gMCkpIHtcCisgICAgICB0Y2h1bmtwdHIqIENQO1wKKyAgICAgIHdoaWxlICgoKihDUCA9ICYoUi0+Y2hpbGRbMV0pKSAhPSAwKSB8fFwKKyAgICAgICAgICAgICAoKihDUCA9ICYoUi0+Y2hpbGRbMF0pKSAhPSAwKSkge1wKKyAgICAgICAgUiA9ICooUlAgPSBDUCk7XAorICAgICAgfVwKKyAgICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgUlApKSlcCisgICAgICAgICpSUCA9IDA7XAorICAgICAgZWxzZSB7XAorICAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCisgICAgICB9XAorICAgIH1cCisgIH1cCisgIGlmIChYUCAhPSAwKSB7XAorICAgIHRiaW5wdHIqIEggPSB0cmVlYmluX2F0KE0sIFgtPmluZGV4KTtcCisgICAgaWYgKFggPT0gKkgpIHtcCisgICAgICBpZiAoKCpIID0gUikgPT0gMCkgXAorICAgICAgICBjbGVhcl90cmVlbWFwKE0sIFgtPmluZGV4KTtcCisgICAgfVwKKyAgICBlbHNlIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgWFApKSkge1wKKyAgICAgIGlmIChYUC0+Y2hpbGRbMF0gPT0gWCkgXAorICAgICAgICBYUC0+Y2hpbGRbMF0gPSBSO1wKKyAgICAgIGVsc2UgXAorICAgICAgICBYUC0+Y2hpbGRbMV0gPSBSO1wKKyAgICB9XAorICAgIGVsc2VcCisgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCisgICAgaWYgKFIgIT0gMCkge1wKKyAgICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgUikpKSB7XAorICAgICAgICB0Y2h1bmtwdHIgQzAsIEMxO1wKKyAgICAgICAgUi0+cGFyZW50ID0gWFA7XAorICAgICAgICBpZiAoKEMwID0gWC0+Y2hpbGRbMF0pICE9IDApIHtcCisgICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBDMCkpKSB7XAorICAgICAgICAgICAgUi0+Y2hpbGRbMF0gPSBDMDtcCisgICAgICAgICAgICBDMC0+cGFyZW50ID0gUjtcCisgICAgICAgICAgfVwKKyAgICAgICAgICBlbHNlXAorICAgICAgICAgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAorICAgICAgICB9XAorICAgICAgICBpZiAoKEMxID0gWC0+Y2hpbGRbMV0pICE9IDApIHtcCisgICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBDMSkpKSB7XAorICAgICAgICAgICAgUi0+Y2hpbGRbMV0gPSBDMTtcCisgICAgICAgICAgICBDMS0+cGFyZW50ID0gUjtcCisgICAgICAgICAgfVwKKyAgICAgICAgICBlbHNlXAorICAgICAgICAgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAorICAgICAgICB9XAorICAgICAgfVwKKyAgICAgIGVsc2VcCisgICAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wKKyAgICB9XAorICB9XAorfQorCisvKiBSZWxheXMgdG8gbGFyZ2UgdnMgc21hbGwgYmluIG9wZXJhdGlvbnMgKi8KKworI2RlZmluZSBpbnNlcnRfY2h1bmsoTSwgUCwgUylcCisgIGlmIChpc19zbWFsbChTKSkgaW5zZXJ0X3NtYWxsX2NodW5rKE0sIFAsIFMpXAorICBlbHNlIHsgdGNodW5rcHRyIFRQID0gKHRjaHVua3B0cikoUCk7IGluc2VydF9sYXJnZV9jaHVuayhNLCBUUCwgUyk7IH0KKworI2RlZmluZSB1bmxpbmtfY2h1bmsoTSwgUCwgUylcCisgIGlmIChpc19zbWFsbChTKSkgdW5saW5rX3NtYWxsX2NodW5rKE0sIFAsIFMpXAorICBlbHNlIHsgdGNodW5rcHRyIFRQID0gKHRjaHVua3B0cikoUCk7IHVubGlua19sYXJnZV9jaHVuayhNLCBUUCk7IH0KKworCisvKiBSZWxheXMgdG8gaW50ZXJuYWwgY2FsbHMgdG8gbWFsbG9jL2ZyZWUgZnJvbSByZWFsbG9jLCBtZW1hbGlnbiBldGMgKi8KKworI2lmIE9OTFlfTVNQQUNFUworI2RlZmluZSBpbnRlcm5hbF9tYWxsb2MobSwgYikgbXNwYWNlX21hbGxvYyhtLCBiKQorI2RlZmluZSBpbnRlcm5hbF9mcmVlKG0sIG1lbSkgbXNwYWNlX2ZyZWUobSxtZW0pOworI2Vsc2UgLyogT05MWV9NU1BBQ0VTICovCisjaWYgTVNQQUNFUworI2RlZmluZSBpbnRlcm5hbF9tYWxsb2MobSwgYilcCisgICAobSA9PSBnbSk/IGRsbWFsbG9jKGIpIDogbXNwYWNlX21hbGxvYyhtLCBiKQorI2RlZmluZSBpbnRlcm5hbF9mcmVlKG0sIG1lbSlcCisgICBpZiAobSA9PSBnbSkgZGxmcmVlKG1lbSk7IGVsc2UgbXNwYWNlX2ZyZWUobSxtZW0pOworI2Vsc2UgLyogTVNQQUNFUyAqLworI2RlZmluZSBpbnRlcm5hbF9tYWxsb2MobSwgYikgZGxtYWxsb2MoYikKKyNkZWZpbmUgaW50ZXJuYWxfZnJlZShtLCBtZW0pIGRsZnJlZShtZW0pCisjZW5kaWYgLyogTVNQQUNFUyAqLworI2VuZGlmIC8qIE9OTFlfTVNQQUNFUyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRGlyZWN0LW1tYXBwaW5nIGNodW5rcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICBEaXJlY3RseSBtbWFwcGVkIGNodW5rcyBhcmUgc2V0IHVwIHdpdGggYW4gb2Zmc2V0IHRvIHRoZSBzdGFydCBvZgorICB0aGUgbW1hcHBlZCByZWdpb24gc3RvcmVkIGluIHRoZSBwcmV2X2Zvb3QgZmllbGQgb2YgdGhlIGNodW5rLiBUaGlzCisgIGFsbG93cyByZWNvbnN0cnVjdGlvbiBvZiB0aGUgcmVxdWlyZWQgYXJndW1lbnQgdG8gTVVOTUFQIHdoZW4gZnJlZWQsCisgIGFuZCBhbHNvIGFsbG93cyBhZGp1c3RtZW50IG9mIHRoZSByZXR1cm5lZCBjaHVuayB0byBtZWV0IGFsaWdubWVudAorICByZXF1aXJlbWVudHMgKGVzcGVjaWFsbHkgaW4gbWVtYWxpZ24pLiAgVGhlcmUgaXMgYWxzbyBlbm91Z2ggc3BhY2UKKyAgYWxsb2NhdGVkIHRvIGhvbGQgYSBmYWtlIG5leHQgY2h1bmsgb2Ygc2l6ZSBTSVpFX1RfU0laRSB0byBtYWludGFpbgorICB0aGUgUElOVVNFIGJpdCBzbyBmcmVlcyBjYW4gYmUgY2hlY2tlZC4KKyovCisKKy8qIE1hbGxvYyB1c2luZyBtbWFwICovCitzdGF0aWMgdm9pZCogbW1hcF9hbGxvYyhtc3RhdGUgbSwgc2l6ZV90IG5iKSB7CisgIHNpemVfdCBtbXNpemUgPSBncmFudWxhcml0eV9hbGlnbihuYiArIFNJWF9TSVpFX1RfU0laRVMgKyBDSFVOS19BTElHTl9NQVNLKTsKKyAgaWYgKG1tc2l6ZSA+IG5iKSB7ICAgICAvKiBDaGVjayBmb3Igd3JhcCBhcm91bmQgMCAqLworICAgIGNoYXIqIG1tID0gKGNoYXIqKShESVJFQ1RfTU1BUChtbXNpemUpKTsKKyAgICBpZiAobW0gIT0gQ01GQUlMKSB7CisgICAgICBzaXplX3Qgb2Zmc2V0ID0gYWxpZ25fb2Zmc2V0KGNodW5rMm1lbShtbSkpOworICAgICAgc2l6ZV90IHBzaXplID0gbW1zaXplIC0gb2Zmc2V0IC0gTU1BUF9GT09UX1BBRDsKKyAgICAgIG1jaHVua3B0ciBwID0gKG1jaHVua3B0cikobW0gKyBvZmZzZXQpOworICAgICAgcC0+cHJldl9mb290ID0gb2Zmc2V0IHwgSVNfTU1BUFBFRF9CSVQ7CisgICAgICAocCktPmhlYWQgPSAocHNpemV8Q0lOVVNFX0JJVCk7CisgICAgICBtYXJrX2ludXNlX2Zvb3QobSwgcCwgcHNpemUpOworICAgICAgY2h1bmtfcGx1c19vZmZzZXQocCwgcHNpemUpLT5oZWFkID0gRkVOQ0VQT1NUX0hFQUQ7CisgICAgICBjaHVua19wbHVzX29mZnNldChwLCBwc2l6ZStTSVpFX1RfU0laRSktPmhlYWQgPSAwOworCisgICAgICBpZiAobW0gPCBtLT5sZWFzdF9hZGRyKQorICAgICAgICBtLT5sZWFzdF9hZGRyID0gbW07CisgICAgICBpZiAoKG0tPmZvb3RwcmludCArPSBtbXNpemUpID4gbS0+bWF4X2Zvb3RwcmludCkKKyAgICAgICAgbS0+bWF4X2Zvb3RwcmludCA9IG0tPmZvb3RwcmludDsKKyAgICAgIGFzc2VydChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpOworICAgICAgY2hlY2tfbW1hcHBlZF9jaHVuayhtLCBwKTsKKyAgICAgIHJldHVybiBjaHVuazJtZW0ocCk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvKiBSZWFsbG9jIHVzaW5nIG1tYXAgKi8KK3N0YXRpYyBtY2h1bmtwdHIgbW1hcF9yZXNpemUobXN0YXRlIG0sIG1jaHVua3B0ciBvbGRwLCBzaXplX3QgbmIpIHsKKyAgc2l6ZV90IG9sZHNpemUgPSBjaHVua3NpemUob2xkcCk7CisgIGlmIChpc19zbWFsbChuYikpIC8qIENhbid0IHNocmluayBtbWFwIHJlZ2lvbnMgYmVsb3cgc21hbGwgc2l6ZSAqLworICAgIHJldHVybiAwOworICAvKiBLZWVwIG9sZCBjaHVuayBpZiBiaWcgZW5vdWdoIGJ1dCBub3QgdG9vIGJpZyAqLworICBpZiAob2xkc2l6ZSA+PSBuYiArIFNJWkVfVF9TSVpFICYmCisgICAgICAob2xkc2l6ZSAtIG5iKSA8PSAobXBhcmFtcy5ncmFudWxhcml0eSA8PCAxKSkKKyAgICByZXR1cm4gb2xkcDsKKyAgZWxzZSB7CisgICAgc2l6ZV90IG9mZnNldCA9IG9sZHAtPnByZXZfZm9vdCAmIH5JU19NTUFQUEVEX0JJVDsKKyAgICBzaXplX3Qgb2xkbW1zaXplID0gb2xkc2l6ZSArIG9mZnNldCArIE1NQVBfRk9PVF9QQUQ7CisgICAgc2l6ZV90IG5ld21tc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgU0lYX1NJWkVfVF9TSVpFUyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIVU5LX0FMSUdOX01BU0spOworICAgIGNoYXIqIGNwID0gKGNoYXIqKUNBTExfTVJFTUFQKChjaGFyKilvbGRwIC0gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZG1tc2l6ZSwgbmV3bW1zaXplLCAxKTsKKyAgICBpZiAoY3AgIT0gQ01GQUlMKSB7CisgICAgICBtY2h1bmtwdHIgbmV3cCA9IChtY2h1bmtwdHIpKGNwICsgb2Zmc2V0KTsKKyAgICAgIHNpemVfdCBwc2l6ZSA9IG5ld21tc2l6ZSAtIG9mZnNldCAtIE1NQVBfRk9PVF9QQUQ7CisgICAgICBuZXdwLT5oZWFkID0gKHBzaXplfENJTlVTRV9CSVQpOworICAgICAgbWFya19pbnVzZV9mb290KG0sIG5ld3AsIHBzaXplKTsKKyAgICAgIGNodW5rX3BsdXNfb2Zmc2V0KG5ld3AsIHBzaXplKS0+aGVhZCA9IEZFTkNFUE9TVF9IRUFEOworICAgICAgY2h1bmtfcGx1c19vZmZzZXQobmV3cCwgcHNpemUrU0laRV9UX1NJWkUpLT5oZWFkID0gMDsKKworICAgICAgaWYgKGNwIDwgbS0+bGVhc3RfYWRkcikKKyAgICAgICAgbS0+bGVhc3RfYWRkciA9IGNwOworICAgICAgaWYgKChtLT5mb290cHJpbnQgKz0gbmV3bW1zaXplIC0gb2xkbW1zaXplKSA+IG0tPm1heF9mb290cHJpbnQpCisgICAgICAgIG0tPm1heF9mb290cHJpbnQgPSBtLT5mb290cHJpbnQ7CisgICAgICBjaGVja19tbWFwcGVkX2NodW5rKG0sIG5ld3ApOworICAgICAgcmV0dXJuIG5ld3A7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtc3BhY2UgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBJbml0aWFsaXplIHRvcCBjaHVuayBhbmQgaXRzIHNpemUgKi8KK3N0YXRpYyB2b2lkIGluaXRfdG9wKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCwgc2l6ZV90IHBzaXplKSB7CisgIC8qIEVuc3VyZSBhbGlnbm1lbnQgKi8KKyAgc2l6ZV90IG9mZnNldCA9IGFsaWduX29mZnNldChjaHVuazJtZW0ocCkpOworICBwID0gKG1jaHVua3B0cikoKGNoYXIqKXAgKyBvZmZzZXQpOworICBwc2l6ZSAtPSBvZmZzZXQ7CisKKyAgbS0+dG9wID0gcDsKKyAgbS0+dG9wc2l6ZSA9IHBzaXplOworICBwLT5oZWFkID0gcHNpemUgfCBQSU5VU0VfQklUOworICAvKiBzZXQgc2l6ZSBvZiBmYWtlIHRyYWlsaW5nIGNodW5rIGhvbGRpbmcgb3ZlcmhlYWQgc3BhY2Ugb25seSBvbmNlICovCisgIGNodW5rX3BsdXNfb2Zmc2V0KHAsIHBzaXplKS0+aGVhZCA9IFRPUF9GT09UX1NJWkU7CisgIG0tPnRyaW1fY2hlY2sgPSBtcGFyYW1zLnRyaW1fdGhyZXNob2xkOyAvKiByZXNldCBvbiBlYWNoIHVwZGF0ZSAqLworfQorCisvKiBJbml0aWFsaXplIGJpbnMgZm9yIGEgbmV3IG1zdGF0ZSB0aGF0IGlzIG90aGVyd2lzZSB6ZXJvZWQgb3V0ICovCitzdGF0aWMgdm9pZCBpbml0X2JpbnMobXN0YXRlIG0pIHsKKyAgLyogRXN0YWJsaXNoIGNpcmN1bGFyIGxpbmtzIGZvciBzbWFsbGJpbnMgKi8KKyAgYmluZGV4X3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IE5TTUFMTEJJTlM7ICsraSkgeworICAgIHNiaW5wdHIgYmluID0gc21hbGxiaW5fYXQobSxpKTsKKyAgICBiaW4tPmZkID0gYmluLT5iayA9IGJpbjsKKyAgfQorfQorCisjaWYgUFJPQ0VFRF9PTl9FUlJPUgorCisvKiBkZWZhdWx0IGNvcnJ1cHRpb24gYWN0aW9uICovCitzdGF0aWMgdm9pZCByZXNldF9vbl9lcnJvcihtc3RhdGUgbSkgeworICBpbnQgaTsKKyAgKyttYWxsb2NfY29ycnVwdGlvbl9lcnJvcl9jb3VudDsKKyAgLyogUmVpbml0aWFsaXplIGZpZWxkcyB0byBmb3JnZXQgYWJvdXQgYWxsIG1lbW9yeSAqLworICBtLT5zbWFsbGJpbnMgPSBtLT50cmVlYmlucyA9IDA7CisgIG0tPmR2c2l6ZSA9IG0tPnRvcHNpemUgPSAwOworICBtLT5zZWcuYmFzZSA9IDA7CisgIG0tPnNlZy5zaXplID0gMDsKKyAgbS0+c2VnLm5leHQgPSAwOworICBtLT50b3AgPSBtLT5kdiA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBOVFJFRUJJTlM7ICsraSkKKyAgICAqdHJlZWJpbl9hdChtLCBpKSA9IDA7CisgIGluaXRfYmlucyhtKTsKK30KKyNlbmRpZiAvKiBQUk9DRUVEX09OX0VSUk9SICovCisKKy8qIEFsbG9jYXRlIGNodW5rIGFuZCBwcmVwZW5kIHJlbWFpbmRlciB3aXRoIGNodW5rIGluIHN1Y2Nlc3NvciBiYXNlLiAqLworc3RhdGljIHZvaWQqIHByZXBlbmRfYWxsb2MobXN0YXRlIG0sIGNoYXIqIG5ld2Jhc2UsIGNoYXIqIG9sZGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmIpIHsKKyAgbWNodW5rcHRyIHAgPSBhbGlnbl9hc19jaHVuayhuZXdiYXNlKTsKKyAgbWNodW5rcHRyIG9sZGZpcnN0ID0gYWxpZ25fYXNfY2h1bmsob2xkYmFzZSk7CisgIHNpemVfdCBwc2l6ZSA9IChjaGFyKilvbGRmaXJzdCAtIChjaGFyKilwOworICBtY2h1bmtwdHIgcSA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKKyAgc2l6ZV90IHFzaXplID0gcHNpemUgLSBuYjsKKyAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCBwLCBuYik7CisKKyAgYXNzZXJ0KChjaGFyKilvbGRmaXJzdCA+IChjaGFyKilxKTsKKyAgYXNzZXJ0KHBpbnVzZShvbGRmaXJzdCkpOworICBhc3NlcnQocXNpemUgPj0gTUlOX0NIVU5LX1NJWkUpOworCisgIC8qIGNvbnNvbGlkYXRlIHJlbWFpbmRlciB3aXRoIGZpcnN0IGNodW5rIG9mIG9sZCBiYXNlICovCisgIGlmIChvbGRmaXJzdCA9PSBtLT50b3ApIHsKKyAgICBzaXplX3QgdHNpemUgPSBtLT50b3BzaXplICs9IHFzaXplOworICAgIG0tPnRvcCA9IHE7CisgICAgcS0+aGVhZCA9IHRzaXplIHwgUElOVVNFX0JJVDsKKyAgICBjaGVja190b3BfY2h1bmsobSwgcSk7CisgIH0KKyAgZWxzZSBpZiAob2xkZmlyc3QgPT0gbS0+ZHYpIHsKKyAgICBzaXplX3QgZHNpemUgPSBtLT5kdnNpemUgKz0gcXNpemU7CisgICAgbS0+ZHYgPSBxOworICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhxLCBkc2l6ZSk7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCFjaW51c2Uob2xkZmlyc3QpKSB7CisgICAgICBzaXplX3QgbnNpemUgPSBjaHVua3NpemUob2xkZmlyc3QpOworICAgICAgdW5saW5rX2NodW5rKG0sIG9sZGZpcnN0LCBuc2l6ZSk7CisgICAgICBvbGRmaXJzdCA9IGNodW5rX3BsdXNfb2Zmc2V0KG9sZGZpcnN0LCBuc2l6ZSk7CisgICAgICBxc2l6ZSArPSBuc2l6ZTsKKyAgICB9CisgICAgc2V0X2ZyZWVfd2l0aF9waW51c2UocSwgcXNpemUsIG9sZGZpcnN0KTsKKyAgICBpbnNlcnRfY2h1bmsobSwgcSwgcXNpemUpOworICAgIGNoZWNrX2ZyZWVfY2h1bmsobSwgcSk7CisgIH0KKworICBjaGVja19tYWxsb2NlZF9jaHVuayhtLCBjaHVuazJtZW0ocCksIG5iKTsKKyAgcmV0dXJuIGNodW5rMm1lbShwKTsKK30KKworCisvKiBBZGQgYSBzZWdtZW50IHRvIGhvbGQgYSBuZXcgbm9uY29udGlndW91cyByZWdpb24gKi8KK3N0YXRpYyB2b2lkIGFkZF9zZWdtZW50KG1zdGF0ZSBtLCBjaGFyKiB0YmFzZSwgc2l6ZV90IHRzaXplLCBmbGFnX3QgbW1hcHBlZCkgeworICAvKiBEZXRlcm1pbmUgbG9jYXRpb25zIGFuZCBzaXplcyBvZiBzZWdtZW50LCBmZW5jZXBvc3RzLCBvbGQgdG9wICovCisgIGNoYXIqIG9sZF90b3AgPSAoY2hhciopbS0+dG9wOworICBtc2VnbWVudHB0ciBvbGRzcCA9IHNlZ21lbnRfaG9sZGluZyhtLCBvbGRfdG9wKTsKKyAgY2hhciogb2xkX2VuZCA9IG9sZHNwLT5iYXNlICsgb2xkc3AtPnNpemU7CisgIHNpemVfdCBzc2l6ZSA9IHBhZF9yZXF1ZXN0KHNpemVvZihzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQpKTsKKyAgY2hhciogcmF3c3AgPSBvbGRfZW5kIC0gKHNzaXplICsgRk9VUl9TSVpFX1RfU0laRVMgKyBDSFVOS19BTElHTl9NQVNLKTsKKyAgc2l6ZV90IG9mZnNldCA9IGFsaWduX29mZnNldChjaHVuazJtZW0ocmF3c3ApKTsKKyAgY2hhciogYXNwID0gcmF3c3AgKyBvZmZzZXQ7CisgIGNoYXIqIGNzcCA9IChhc3AgPCAob2xkX3RvcCArIE1JTl9DSFVOS19TSVpFKSk/IG9sZF90b3AgOiBhc3A7CisgIG1jaHVua3B0ciBzcCA9IChtY2h1bmtwdHIpY3NwOworICBtc2VnbWVudHB0ciBzcyA9IChtc2VnbWVudHB0cikoY2h1bmsybWVtKHNwKSk7CisgIG1jaHVua3B0ciB0bmV4dCA9IGNodW5rX3BsdXNfb2Zmc2V0KHNwLCBzc2l6ZSk7CisgIG1jaHVua3B0ciBwID0gdG5leHQ7CisgIGludCBuZmVuY2VzID0gMDsKKworICAvKiByZXNldCB0b3AgdG8gbmV3IHNwYWNlICovCisgIGluaXRfdG9wKG0sIChtY2h1bmtwdHIpdGJhc2UsIHRzaXplIC0gVE9QX0ZPT1RfU0laRSk7CisKKyAgLyogU2V0IHVwIHNlZ21lbnQgcmVjb3JkICovCisgIGFzc2VydChpc19hbGlnbmVkKHNzKSk7CisgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgc3AsIHNzaXplKTsKKyAgKnNzID0gbS0+c2VnOyAvKiBQdXNoIGN1cnJlbnQgcmVjb3JkICovCisgIG0tPnNlZy5iYXNlID0gdGJhc2U7CisgIG0tPnNlZy5zaXplID0gdHNpemU7CisgIG0tPnNlZy5zZmxhZ3MgPSBtbWFwcGVkOworICBtLT5zZWcubmV4dCA9IHNzOworCisgIC8qIEluc2VydCB0cmFpbGluZyBmZW5jZXBvc3RzICovCisgIGZvciAoOzspIHsKKyAgICBtY2h1bmtwdHIgbmV4dHAgPSBjaHVua19wbHVzX29mZnNldChwLCBTSVpFX1RfU0laRSk7CisgICAgcC0+aGVhZCA9IEZFTkNFUE9TVF9IRUFEOworICAgICsrbmZlbmNlczsKKyAgICBpZiAoKGNoYXIqKSgmKG5leHRwLT5oZWFkKSkgPCBvbGRfZW5kKQorICAgICAgcCA9IG5leHRwOworICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIGFzc2VydChuZmVuY2VzID49IDIpOworCisgIC8qIEluc2VydCB0aGUgcmVzdCBvZiBvbGQgdG9wIGludG8gYSBiaW4gYXMgYW4gb3JkaW5hcnkgZnJlZSBjaHVuayAqLworICBpZiAoY3NwICE9IG9sZF90b3ApIHsKKyAgICBtY2h1bmtwdHIgcSA9IChtY2h1bmtwdHIpb2xkX3RvcDsKKyAgICBzaXplX3QgcHNpemUgPSBjc3AgLSBvbGRfdG9wOworICAgIG1jaHVua3B0ciB0biA9IGNodW5rX3BsdXNfb2Zmc2V0KHEsIHBzaXplKTsKKyAgICBzZXRfZnJlZV93aXRoX3BpbnVzZShxLCBwc2l6ZSwgdG4pOworICAgIGluc2VydF9jaHVuayhtLCBxLCBwc2l6ZSk7CisgIH0KKworICBjaGVja190b3BfY2h1bmsobSwgbS0+dG9wKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3lzdGVtIGFsbG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogR2V0IG1lbW9yeSBmcm9tIHN5c3RlbSB1c2luZyBNT1JFQ09SRSBvciBNTUFQICovCitzdGF0aWMgdm9pZCogc3lzX2FsbG9jKG1zdGF0ZSBtLCBzaXplX3QgbmIpIHsKKyAgY2hhciogdGJhc2UgPSBDTUZBSUw7CisgIHNpemVfdCB0c2l6ZSA9IDA7CisgIGZsYWdfdCBtbWFwX2ZsYWcgPSAwOworCisgIGluaXRfbXBhcmFtcygpOworCisgIC8qIERpcmVjdGx5IG1hcCBsYXJnZSBjaHVua3MgKi8KKyAgaWYgKHVzZV9tbWFwKG0pICYmIG5iID49IG1wYXJhbXMubW1hcF90aHJlc2hvbGQpIHsKKyAgICB2b2lkKiBtZW0gPSBtbWFwX2FsbG9jKG0sIG5iKTsKKyAgICBpZiAobWVtICE9IDApCisgICAgICByZXR1cm4gbWVtOworICB9CisKKyAgLyoKKyAgICBUcnkgZ2V0dGluZyBtZW1vcnkgaW4gYW55IG9mIHRocmVlIHdheXMgKGluIG1vc3QtcHJlZmVycmVkIHRvCisgICAgbGVhc3QtcHJlZmVycmVkIG9yZGVyKToKKyAgICAxLiBBIGNhbGwgdG8gTU9SRUNPUkUgdGhhdCBjYW4gbm9ybWFsbHkgY29udGlndW91c2x5IGV4dGVuZCBtZW1vcnkuCisgICAgICAgKGRpc2FibGVkIGlmIG5vdCBNT1JFQ09SRV9DT05USUdVT1VTIG9yIG5vdCBIQVZFX01PUkVDT1JFIG9yCisgICAgICAgb3IgbWFpbiBzcGFjZSBpcyBtbWFwcGVkIG9yIGEgcHJldmlvdXMgY29udGlndW91cyBjYWxsIGZhaWxlZCkKKyAgICAyLiBBIGNhbGwgdG8gTU1BUCBuZXcgc3BhY2UgKGRpc2FibGVkIGlmIG5vdCBIQVZFX01NQVApLgorICAgICAgIE5vdGUgdGhhdCB1bmRlciB0aGUgZGVmYXVsdCBzZXR0aW5ncywgaWYgTU9SRUNPUkUgaXMgdW5hYmxlIHRvCisgICAgICAgZnVsZmlsbCBhIHJlcXVlc3QsIGFuZCBIQVZFX01NQVAgaXMgdHJ1ZSwgdGhlbiBtbWFwIGlzCisgICAgICAgdXNlZCBhcyBhIG5vbmNvbnRpZ3VvdXMgc3lzdGVtIGFsbG9jYXRvci4gVGhpcyBpcyBhIHVzZWZ1bCBiYWNrdXAKKyAgICAgICBzdHJhdGVneSBmb3Igc3lzdGVtcyB3aXRoIGhvbGVzIGluIGFkZHJlc3Mgc3BhY2VzIC0tIGluIHRoaXMgY2FzZQorICAgICAgIHNicmsgY2Fubm90IGNvbnRpZ3VvdXNseSBleHBhbmQgdGhlIGhlYXAsIGJ1dCBtbWFwIG1heSBiZSBhYmxlIHRvCisgICAgICAgZmluZCBzcGFjZS4KKyAgICAzLiBBIGNhbGwgdG8gTU9SRUNPUkUgdGhhdCBjYW5ub3QgdXN1YWxseSBjb250aWd1b3VzbHkgZXh0ZW5kIG1lbW9yeS4KKyAgICAgICAoZGlzYWJsZWQgaWYgbm90IEhBVkVfTU9SRUNPUkUpCisgICovCisKKyAgaWYgKE1PUkVDT1JFX0NPTlRJR1VPVVMgJiYgIXVzZV9ub25jb250aWd1b3VzKG0pKSB7CisgICAgY2hhciogYnIgPSBDTUZBSUw7CisgICAgbXNlZ21lbnRwdHIgc3MgPSAobS0+dG9wID09IDApPyAwIDogc2VnbWVudF9ob2xkaW5nKG0sIChjaGFyKiltLT50b3ApOworICAgIHNpemVfdCBhc2l6ZSA9IDA7CisgICAgQUNRVUlSRV9NT1JFQ09SRV9MT0NLKCk7CisKKyAgICBpZiAoc3MgPT0gMCkgeyAgLyogRmlyc3QgdGltZSB0aHJvdWdoIG9yIHJlY292ZXJ5ICovCisgICAgICBjaGFyKiBiYXNlID0gKGNoYXIqKUNBTExfTU9SRUNPUkUoMCk7CisgICAgICBpZiAoYmFzZSAhPSBDTUZBSUwpIHsKKyAgICAgICAgYXNpemUgPSBncmFudWxhcml0eV9hbGlnbihuYiArIFRPUF9GT09UX1NJWkUgKyBNQUxMT0NfQUxJR05NRU5UICsgU0laRV9UX09ORSk7CisgICAgICAgIC8qIEFkanVzdCB0byBlbmQgb24gYSBwYWdlIGJvdW5kYXJ5ICovCisgICAgICAgIGlmICghaXNfcGFnZV9hbGlnbmVkKGJhc2UpKQorICAgICAgICAgIGFzaXplICs9IChwYWdlX2FsaWduKChzaXplX3QpYmFzZSkgLSAoc2l6ZV90KWJhc2UpOworICAgICAgICAvKiBDYW4ndCBjYWxsIE1PUkVDT1JFIGlmIHNpemUgaXMgbmVnYXRpdmUgd2hlbiB0cmVhdGVkIGFzIHNpZ25lZCAqLworICAgICAgICBpZiAoYXNpemUgPCBIQUxGX01BWF9TSVpFX1QgJiYKKyAgICAgICAgICAgIChiciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRShhc2l6ZSkpKSA9PSBiYXNlKSB7CisgICAgICAgICAgdGJhc2UgPSBiYXNlOworICAgICAgICAgIHRzaXplID0gYXNpemU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBTdWJ0cmFjdCBvdXQgZXhpc3RpbmcgYXZhaWxhYmxlIHRvcCBzcGFjZSBmcm9tIE1PUkVDT1JFIHJlcXVlc3QuICovCisgICAgICBhc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iIC0gbS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkUgKyBNQUxMT0NfQUxJR05NRU5UICsgU0laRV9UX09ORSk7CisgICAgICAvKiBVc2UgbWVtIGhlcmUgb25seSBpZiBpdCBkaWQgY29udGludW91c2x5IGV4dGVuZCBvbGQgc3BhY2UgKi8KKyAgICAgIGlmIChhc2l6ZSA8IEhBTEZfTUFYX1NJWkVfVCAmJgorICAgICAgICAgIChiciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRShhc2l6ZSkpKSA9PSBzcy0+YmFzZStzcy0+c2l6ZSkgeworICAgICAgICB0YmFzZSA9IGJyOworICAgICAgICB0c2l6ZSA9IGFzaXplOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0YmFzZSA9PSBDTUZBSUwpIHsgICAgLyogQ29wZSB3aXRoIHBhcnRpYWwgZmFpbHVyZSAqLworICAgICAgaWYgKGJyICE9IENNRkFJTCkgeyAgICAvKiBUcnkgdG8gdXNlL2V4dGVuZCB0aGUgc3BhY2Ugd2UgZGlkIGdldCAqLworICAgICAgICBpZiAoYXNpemUgPCBIQUxGX01BWF9TSVpFX1QgJiYKKyAgICAgICAgICAgIGFzaXplIDwgbmIgKyBUT1BfRk9PVF9TSVpFICsgU0laRV9UX09ORSkgeworICAgICAgICAgIHNpemVfdCBlc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgVE9QX0ZPT1RfU0laRSArIE1BTExPQ19BTElHTk1FTlQgKyBTSVpFX1RfT05FIC0gYXNpemUpOworICAgICAgICAgIGlmIChlc2l6ZSA8IEhBTEZfTUFYX1NJWkVfVCkgeworICAgICAgICAgICAgY2hhciogZW5kID0gKGNoYXIqKUNBTExfTU9SRUNPUkUoZXNpemUpOworICAgICAgICAgICAgaWYgKGVuZCAhPSBDTUZBSUwpCisgICAgICAgICAgICAgIGFzaXplICs9IGVzaXplOworICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgLyogQ2FuJ3QgdXNlOyB0cnkgdG8gcmVsZWFzZSAqLworICAgICAgICAgICAgICBlbmQgPSAoY2hhciopQ0FMTF9NT1JFQ09SRSgtYXNpemUpOworICAgICAgICAgICAgICBiciA9IENNRkFJTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChiciAhPSBDTUZBSUwpIHsgICAgLyogVXNlIHRoZSBzcGFjZSB3ZSBkaWQgZ2V0ICovCisgICAgICAgIHRiYXNlID0gYnI7CisgICAgICAgIHRzaXplID0gYXNpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGRpc2FibGVfY29udGlndW91cyhtKTsgLyogRG9uJ3QgdHJ5IGNvbnRpZ3VvdXMgcGF0aCBpbiB0aGUgZnV0dXJlICovCisgICAgfQorCisgICAgUkVMRUFTRV9NT1JFQ09SRV9MT0NLKCk7CisgIH0KKworICBpZiAoSEFWRV9NTUFQICYmIHRiYXNlID09IENNRkFJTCkgeyAgLyogVHJ5IE1NQVAgKi8KKyAgICBzaXplX3QgcmVxID0gbmIgKyBUT1BfRk9PVF9TSVpFICsgTUFMTE9DX0FMSUdOTUVOVCArIFNJWkVfVF9PTkU7CisgICAgc2l6ZV90IHJzaXplID0gZ3JhbnVsYXJpdHlfYWxpZ24ocmVxKTsKKyAgICBpZiAocnNpemUgPiBuYikgeyAvKiBGYWlsIGlmIHdyYXBzIGFyb3VuZCB6ZXJvICovCisgICAgICBjaGFyKiBtcCA9IChjaGFyKikoQ0FMTF9NTUFQKHJzaXplKSk7CisgICAgICBpZiAobXAgIT0gQ01GQUlMKSB7CisgICAgICAgIHRiYXNlID0gbXA7CisgICAgICAgIHRzaXplID0gcnNpemU7CisgICAgICAgIG1tYXBfZmxhZyA9IElTX01NQVBQRURfQklUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChIQVZFX01PUkVDT1JFICYmIHRiYXNlID09IENNRkFJTCkgeyAvKiBUcnkgbm9uY29udGlndW91cyBNT1JFQ09SRSAqLworICAgIHNpemVfdCBhc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgVE9QX0ZPT1RfU0laRSArIE1BTExPQ19BTElHTk1FTlQgKyBTSVpFX1RfT05FKTsKKyAgICBpZiAoYXNpemUgPCBIQUxGX01BWF9TSVpFX1QpIHsKKyAgICAgIGNoYXIqIGJyID0gQ01GQUlMOworICAgICAgY2hhciogZW5kID0gQ01GQUlMOworICAgICAgQUNRVUlSRV9NT1JFQ09SRV9MT0NLKCk7CisgICAgICBiciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRShhc2l6ZSkpOworICAgICAgZW5kID0gKGNoYXIqKShDQUxMX01PUkVDT1JFKDApKTsKKyAgICAgIFJFTEVBU0VfTU9SRUNPUkVfTE9DSygpOworICAgICAgaWYgKGJyICE9IENNRkFJTCAmJiBlbmQgIT0gQ01GQUlMICYmIGJyIDwgZW5kKSB7CisgICAgICAgIHNpemVfdCBzc2l6ZSA9IGVuZCAtIGJyOworICAgICAgICBpZiAoc3NpemUgPiBuYiArIFRPUF9GT09UX1NJWkUpIHsKKyAgICAgICAgICB0YmFzZSA9IGJyOworICAgICAgICAgIHRzaXplID0gc3NpemU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAodGJhc2UgIT0gQ01GQUlMKSB7CisKKyAgICBpZiAoKG0tPmZvb3RwcmludCArPSB0c2l6ZSkgPiBtLT5tYXhfZm9vdHByaW50KQorICAgICAgbS0+bWF4X2Zvb3RwcmludCA9IG0tPmZvb3RwcmludDsKKworICAgIGlmICghaXNfaW5pdGlhbGl6ZWQobSkpIHsgLyogZmlyc3QtdGltZSBpbml0aWFsaXphdGlvbiAqLworICAgICAgbS0+c2VnLmJhc2UgPSBtLT5sZWFzdF9hZGRyID0gdGJhc2U7CisgICAgICBtLT5zZWcuc2l6ZSA9IHRzaXplOworICAgICAgbS0+c2VnLnNmbGFncyA9IG1tYXBfZmxhZzsKKyAgICAgIG0tPm1hZ2ljID0gbXBhcmFtcy5tYWdpYzsKKyAgICAgIGluaXRfYmlucyhtKTsKKyAgICAgIGlmIChpc19nbG9iYWwobSkpIAorICAgICAgICBpbml0X3RvcChtLCAobWNodW5rcHRyKXRiYXNlLCB0c2l6ZSAtIFRPUF9GT09UX1NJWkUpOworICAgICAgZWxzZSB7CisgICAgICAgIC8qIE9mZnNldCB0b3AgYnkgZW1iZWRkZWQgbWFsbG9jX3N0YXRlICovCisgICAgICAgIG1jaHVua3B0ciBtbiA9IG5leHRfY2h1bmsobWVtMmNodW5rKG0pKTsKKyAgICAgICAgaW5pdF90b3AobSwgbW4sIChzaXplX3QpKCh0YmFzZSArIHRzaXplKSAtIChjaGFyKiltbikgLVRPUF9GT09UX1NJWkUpOworICAgICAgfQorICAgIH0KKworICAgIGVsc2UgeworICAgICAgLyogVHJ5IHRvIG1lcmdlIHdpdGggYW4gZXhpc3Rpbmcgc2VnbWVudCAqLworICAgICAgbXNlZ21lbnRwdHIgc3AgPSAmbS0+c2VnOworICAgICAgd2hpbGUgKHNwICE9IDAgJiYgdGJhc2UgIT0gc3AtPmJhc2UgKyBzcC0+c2l6ZSkKKyAgICAgICAgc3AgPSBzcC0+bmV4dDsKKyAgICAgIGlmIChzcCAhPSAwICYmCisgICAgICAgICAgIWlzX2V4dGVybl9zZWdtZW50KHNwKSAmJgorICAgICAgICAgIChzcC0+c2ZsYWdzICYgSVNfTU1BUFBFRF9CSVQpID09IG1tYXBfZmxhZyAmJgorICAgICAgICAgIHNlZ21lbnRfaG9sZHMoc3AsIG0tPnRvcCkpIHsgLyogYXBwZW5kICovCisgICAgICAgIHNwLT5zaXplICs9IHRzaXplOworICAgICAgICBpbml0X3RvcChtLCBtLT50b3AsIG0tPnRvcHNpemUgKyB0c2l6ZSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKHRiYXNlIDwgbS0+bGVhc3RfYWRkcikKKyAgICAgICAgICBtLT5sZWFzdF9hZGRyID0gdGJhc2U7CisgICAgICAgIHNwID0gJm0tPnNlZzsKKyAgICAgICAgd2hpbGUgKHNwICE9IDAgJiYgc3AtPmJhc2UgIT0gdGJhc2UgKyB0c2l6ZSkKKyAgICAgICAgICBzcCA9IHNwLT5uZXh0OworICAgICAgICBpZiAoc3AgIT0gMCAmJgorICAgICAgICAgICAgIWlzX2V4dGVybl9zZWdtZW50KHNwKSAmJgorICAgICAgICAgICAgKHNwLT5zZmxhZ3MgJiBJU19NTUFQUEVEX0JJVCkgPT0gbW1hcF9mbGFnKSB7CisgICAgICAgICAgY2hhciogb2xkYmFzZSA9IHNwLT5iYXNlOworICAgICAgICAgIHNwLT5iYXNlID0gdGJhc2U7CisgICAgICAgICAgc3AtPnNpemUgKz0gdHNpemU7CisgICAgICAgICAgcmV0dXJuIHByZXBlbmRfYWxsb2MobSwgdGJhc2UsIG9sZGJhc2UsIG5iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgYWRkX3NlZ21lbnQobSwgdGJhc2UsIHRzaXplLCBtbWFwX2ZsYWcpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChuYiA8IG0tPnRvcHNpemUpIHsgLyogQWxsb2NhdGUgZnJvbSBuZXcgb3IgZXh0ZW5kZWQgdG9wIHNwYWNlICovCisgICAgICBzaXplX3QgcnNpemUgPSBtLT50b3BzaXplIC09IG5iOworICAgICAgbWNodW5rcHRyIHAgPSBtLT50b3A7CisgICAgICBtY2h1bmtwdHIgciA9IG0tPnRvcCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKKyAgICAgIHItPmhlYWQgPSByc2l6ZSB8IFBJTlVTRV9CSVQ7CisgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIHAsIG5iKTsKKyAgICAgIGNoZWNrX3RvcF9jaHVuayhtLCBtLT50b3ApOworICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobSwgY2h1bmsybWVtKHApLCBuYik7CisgICAgICByZXR1cm4gY2h1bmsybWVtKHApOworICAgIH0KKyAgfQorCisgIE1BTExPQ19GQUlMVVJFX0FDVElPTjsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBzeXN0ZW0gZGVhbGxvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFVubWFwIGFuZCB1bmxpbmsgYW55IG1tYXBwZWQgc2VnbWVudHMgdGhhdCBkb24ndCBjb250YWluIHVzZWQgY2h1bmtzICovCitzdGF0aWMgc2l6ZV90IHJlbGVhc2VfdW51c2VkX3NlZ21lbnRzKG1zdGF0ZSBtKSB7CisgIHNpemVfdCByZWxlYXNlZCA9IDA7CisgIG1zZWdtZW50cHRyIHByZWQgPSAmbS0+c2VnOworICBtc2VnbWVudHB0ciBzcCA9IHByZWQtPm5leHQ7CisgIHdoaWxlIChzcCAhPSAwKSB7CisgICAgY2hhciogYmFzZSA9IHNwLT5iYXNlOworICAgIHNpemVfdCBzaXplID0gc3AtPnNpemU7CisgICAgbXNlZ21lbnRwdHIgbmV4dCA9IHNwLT5uZXh0OworICAgIGlmIChpc19tbWFwcGVkX3NlZ21lbnQoc3ApICYmICFpc19leHRlcm5fc2VnbWVudChzcCkpIHsKKyAgICAgIG1jaHVua3B0ciBwID0gYWxpZ25fYXNfY2h1bmsoYmFzZSk7CisgICAgICBzaXplX3QgcHNpemUgPSBjaHVua3NpemUocCk7CisgICAgICAvKiBDYW4gdW5tYXAgaWYgZmlyc3QgY2h1bmsgaG9sZHMgZW50aXJlIHNlZ21lbnQgYW5kIG5vdCBwaW5uZWQgKi8KKyAgICAgIGlmICghY2ludXNlKHApICYmIChjaGFyKilwICsgcHNpemUgPj0gYmFzZSArIHNpemUgLSBUT1BfRk9PVF9TSVpFKSB7CisgICAgICAgIHRjaHVua3B0ciB0cCA9ICh0Y2h1bmtwdHIpcDsKKyAgICAgICAgYXNzZXJ0KHNlZ21lbnRfaG9sZHMoc3AsIChjaGFyKilzcCkpOworICAgICAgICBpZiAocCA9PSBtLT5kdikgeworICAgICAgICAgIG0tPmR2ID0gMDsKKyAgICAgICAgICBtLT5kdnNpemUgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHVubGlua19sYXJnZV9jaHVuayhtLCB0cCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENBTExfTVVOTUFQKGJhc2UsIHNpemUpID09IDApIHsKKyAgICAgICAgICByZWxlYXNlZCArPSBzaXplOworICAgICAgICAgIG0tPmZvb3RwcmludCAtPSBzaXplOworICAgICAgICAgIC8qIHVubGluayBvYnNvbGV0ZWQgcmVjb3JkICovCisgICAgICAgICAgc3AgPSBwcmVkOworICAgICAgICAgIHNwLT5uZXh0ID0gbmV4dDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLyogYmFjayBvdXQgaWYgY2Fubm90IHVubWFwICovCisgICAgICAgICAgaW5zZXJ0X2xhcmdlX2NodW5rKG0sIHRwLCBwc2l6ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcHJlZCA9IHNwOworICAgIHNwID0gbmV4dDsKKyAgfQorICByZXR1cm4gcmVsZWFzZWQ7Cit9CisKK3N0YXRpYyBpbnQgc3lzX3RyaW0obXN0YXRlIG0sIHNpemVfdCBwYWQpIHsKKyAgc2l6ZV90IHJlbGVhc2VkID0gMDsKKyAgaWYgKHBhZCA8IE1BWF9SRVFVRVNUICYmIGlzX2luaXRpYWxpemVkKG0pKSB7CisgICAgcGFkICs9IFRPUF9GT09UX1NJWkU7IC8qIGVuc3VyZSBlbm91Z2ggcm9vbSBmb3Igc2VnbWVudCBvdmVyaGVhZCAqLworCisgICAgaWYgKG0tPnRvcHNpemUgPiBwYWQpIHsKKyAgICAgIC8qIFNocmluayB0b3Agc3BhY2UgaW4gZ3JhbnVsYXJpdHktc2l6ZSB1bml0cywga2VlcGluZyBhdCBsZWFzdCBvbmUgKi8KKyAgICAgIHNpemVfdCB1bml0ID0gbXBhcmFtcy5ncmFudWxhcml0eTsKKyAgICAgIHNpemVfdCBleHRyYSA9ICgobS0+dG9wc2l6ZSAtIHBhZCArICh1bml0IC0gU0laRV9UX09ORSkpIC8gdW5pdCAtCisgICAgICAgICAgICAgICAgICAgICAgU0laRV9UX09ORSkgKiB1bml0OworICAgICAgbXNlZ21lbnRwdHIgc3AgPSBzZWdtZW50X2hvbGRpbmcobSwgKGNoYXIqKW0tPnRvcCk7CisKKyAgICAgIGlmICghaXNfZXh0ZXJuX3NlZ21lbnQoc3ApKSB7CisgICAgICAgIGlmIChpc19tbWFwcGVkX3NlZ21lbnQoc3ApKSB7CisgICAgICAgICAgaWYgKEhBVkVfTU1BUCAmJgorICAgICAgICAgICAgICBzcC0+c2l6ZSA+PSBleHRyYSAmJgorICAgICAgICAgICAgICAhaGFzX3NlZ21lbnRfbGluayhtLCBzcCkpIHsgLyogY2FuJ3Qgc2hyaW5rIGlmIHBpbm5lZCAqLworICAgICAgICAgICAgc2l6ZV90IG5ld3NpemUgPSBzcC0+c2l6ZSAtIGV4dHJhOworICAgICAgICAgICAgLyogUHJlZmVyIG1yZW1hcCwgZmFsbCBiYWNrIHRvIG11bm1hcCAqLworICAgICAgICAgICAgaWYgKChDQUxMX01SRU1BUChzcC0+YmFzZSwgc3AtPnNpemUsIG5ld3NpemUsIDApICE9IE1GQUlMKSB8fAorICAgICAgICAgICAgICAgIChDQUxMX01VTk1BUChzcC0+YmFzZSArIG5ld3NpemUsIGV4dHJhKSA9PSAwKSkgeworICAgICAgICAgICAgICByZWxlYXNlZCA9IGV4dHJhOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChIQVZFX01PUkVDT1JFKSB7CisgICAgICAgICAgaWYgKGV4dHJhID49IEhBTEZfTUFYX1NJWkVfVCkgLyogQXZvaWQgd3JhcHBpbmcgbmVnYXRpdmUgKi8KKyAgICAgICAgICAgIGV4dHJhID0gKEhBTEZfTUFYX1NJWkVfVCkgKyBTSVpFX1RfT05FIC0gdW5pdDsKKyAgICAgICAgICBBQ1FVSVJFX01PUkVDT1JFX0xPQ0soKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgZW5kIG9mIG1lbW9yeSBpcyB3aGVyZSB3ZSBsYXN0IHNldCBpdC4gKi8KKyAgICAgICAgICAgIGNoYXIqIG9sZF9iciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRSgwKSk7CisgICAgICAgICAgICBpZiAob2xkX2JyID09IHNwLT5iYXNlICsgc3AtPnNpemUpIHsKKyAgICAgICAgICAgICAgY2hhciogcmVsX2JyID0gKGNoYXIqKShDQUxMX01PUkVDT1JFKC1leHRyYSkpOworICAgICAgICAgICAgICBjaGFyKiBuZXdfYnIgPSAoY2hhciopKENBTExfTU9SRUNPUkUoMCkpOworICAgICAgICAgICAgICBpZiAocmVsX2JyICE9IENNRkFJTCAmJiBuZXdfYnIgPCBvbGRfYnIpCisgICAgICAgICAgICAgICAgcmVsZWFzZWQgPSBvbGRfYnIgLSBuZXdfYnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIFJFTEVBU0VfTU9SRUNPUkVfTE9DSygpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChyZWxlYXNlZCAhPSAwKSB7CisgICAgICAgIHNwLT5zaXplIC09IHJlbGVhc2VkOworICAgICAgICBtLT5mb290cHJpbnQgLT0gcmVsZWFzZWQ7CisgICAgICAgIGluaXRfdG9wKG0sIG0tPnRvcCwgbS0+dG9wc2l6ZSAtIHJlbGVhc2VkKTsKKyAgICAgICAgY2hlY2tfdG9wX2NodW5rKG0sIG0tPnRvcCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogVW5tYXAgYW55IHVudXNlZCBtbWFwcGVkIHNlZ21lbnRzICovCisgICAgaWYgKEhBVkVfTU1BUCkgCisgICAgICByZWxlYXNlZCArPSByZWxlYXNlX3VudXNlZF9zZWdtZW50cyhtKTsKKworICAgIC8qIE9uIGZhaWx1cmUsIGRpc2FibGUgYXV0b3RyaW0gdG8gYXZvaWQgcmVwZWF0ZWQgZmFpbGVkIGZ1dHVyZSBjYWxscyAqLworICAgIGlmIChyZWxlYXNlZCA9PSAwKQorICAgICAgbS0+dHJpbV9jaGVjayA9IE1BWF9TSVpFX1Q7CisgIH0KKworICByZXR1cm4gKHJlbGVhc2VkICE9IDApPyAxIDogMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtYWxsb2Mgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogYWxsb2NhdGUgYSBsYXJnZSByZXF1ZXN0IGZyb20gdGhlIGJlc3QgZml0dGluZyBjaHVuayBpbiBhIHRyZWViaW4gKi8KK3N0YXRpYyB2b2lkKiB0bWFsbG9jX2xhcmdlKG1zdGF0ZSBtLCBzaXplX3QgbmIpIHsKKyAgdGNodW5rcHRyIHYgPSAwOworICBzaXplX3QgcnNpemUgPSAtbmI7IC8qIFVuc2lnbmVkIG5lZ2F0aW9uICovCisgIHRjaHVua3B0ciB0OworICBiaW5kZXhfdCBpZHg7CisgIGNvbXB1dGVfdHJlZV9pbmRleChuYiwgaWR4KTsKKworICBpZiAoKHQgPSAqdHJlZWJpbl9hdChtLCBpZHgpKSAhPSAwKSB7CisgICAgLyogVHJhdmVyc2UgdHJlZSBmb3IgdGhpcyBiaW4gbG9va2luZyBmb3Igbm9kZSB3aXRoIHNpemUgPT0gbmIgKi8KKyAgICBzaXplX3Qgc2l6ZWJpdHMgPSBuYiA8PCBsZWZ0c2hpZnRfZm9yX3RyZWVfaW5kZXgoaWR4KTsKKyAgICB0Y2h1bmtwdHIgcnN0ID0gMDsgIC8qIFRoZSBkZWVwZXN0IHVudGFrZW4gcmlnaHQgc3VidHJlZSAqLworICAgIGZvciAoOzspIHsKKyAgICAgIHRjaHVua3B0ciBydDsKKyAgICAgIHNpemVfdCB0cmVtID0gY2h1bmtzaXplKHQpIC0gbmI7CisgICAgICBpZiAodHJlbSA8IHJzaXplKSB7CisgICAgICAgIHYgPSB0OworICAgICAgICBpZiAoKHJzaXplID0gdHJlbSkgPT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJ0ID0gdC0+Y2hpbGRbMV07CisgICAgICB0ID0gdC0+Y2hpbGRbKHNpemViaXRzID4+IChTSVpFX1RfQklUU0laRS1TSVpFX1RfT05FKSkgJiAxXTsKKyAgICAgIGlmIChydCAhPSAwICYmIHJ0ICE9IHQpCisgICAgICAgIHJzdCA9IHJ0OworICAgICAgaWYgKHQgPT0gMCkgeworICAgICAgICB0ID0gcnN0OyAvKiBzZXQgdCB0byBsZWFzdCBzdWJ0cmVlIGhvbGRpbmcgc2l6ZXMgPiBuYiAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNpemViaXRzIDw8PSAxOworICAgIH0KKyAgfQorCisgIGlmICh0ID09IDAgJiYgdiA9PSAwKSB7IC8qIHNldCB0IHRvIHJvb3Qgb2YgbmV4dCBub24tZW1wdHkgdHJlZWJpbiAqLworICAgIGJpbm1hcF90IGxlZnRiaXRzID0gbGVmdF9iaXRzKGlkeDJiaXQoaWR4KSkgJiBtLT50cmVlbWFwOworICAgIGlmIChsZWZ0Yml0cyAhPSAwKSB7CisgICAgICBiaW5kZXhfdCBpOworICAgICAgYmlubWFwX3QgbGVhc3RiaXQgPSBsZWFzdF9iaXQobGVmdGJpdHMpOworICAgICAgY29tcHV0ZV9iaXQyaWR4KGxlYXN0Yml0LCBpKTsKKyAgICAgIHQgPSAqdHJlZWJpbl9hdChtLCBpKTsKKyAgICB9CisgIH0KKworICB3aGlsZSAodCAhPSAwKSB7IC8qIGZpbmQgc21hbGxlc3Qgb2YgdHJlZSBvciBzdWJ0cmVlICovCisgICAgc2l6ZV90IHRyZW0gPSBjaHVua3NpemUodCkgLSBuYjsKKyAgICBpZiAodHJlbSA8IHJzaXplKSB7CisgICAgICByc2l6ZSA9IHRyZW07CisgICAgICB2ID0gdDsKKyAgICB9CisgICAgdCA9IGxlZnRtb3N0X2NoaWxkKHQpOworICB9CisKKyAgLyogIElmIGR2IGlzIGEgYmV0dGVyIGZpdCwgcmV0dXJuIDAgc28gbWFsbG9jIHdpbGwgdXNlIGl0ICovCisgIGlmICh2ICE9IDAgJiYgcnNpemUgPCAoc2l6ZV90KShtLT5kdnNpemUgLSBuYikpIHsKKyAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKG0sIHYpKSkgeyAvKiBzcGxpdCAqLworICAgICAgbWNodW5rcHRyIHIgPSBjaHVua19wbHVzX29mZnNldCh2LCBuYik7CisgICAgICBhc3NlcnQoY2h1bmtzaXplKHYpID09IHJzaXplICsgbmIpOworICAgICAgaWYgKFJUQ0hFQ0sob2tfbmV4dCh2LCByKSkpIHsKKyAgICAgICAgdW5saW5rX2xhcmdlX2NodW5rKG0sIHYpOworICAgICAgICBpZiAocnNpemUgPCBNSU5fQ0hVTktfU0laRSkKKyAgICAgICAgICBzZXRfaW51c2VfYW5kX3BpbnVzZShtLCB2LCAocnNpemUgKyBuYikpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIHYsIG5iKTsKKyAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsociwgcnNpemUpOworICAgICAgICAgIGluc2VydF9jaHVuayhtLCByLCByc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNodW5rMm1lbSh2KTsKKyAgICAgIH0KKyAgICB9CisgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04obSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIGFsbG9jYXRlIGEgc21hbGwgcmVxdWVzdCBmcm9tIHRoZSBiZXN0IGZpdHRpbmcgY2h1bmsgaW4gYSB0cmVlYmluICovCitzdGF0aWMgdm9pZCogdG1hbGxvY19zbWFsbChtc3RhdGUgbSwgc2l6ZV90IG5iKSB7CisgIHRjaHVua3B0ciB0LCB2OworICBzaXplX3QgcnNpemU7CisgIGJpbmRleF90IGk7CisgIGJpbm1hcF90IGxlYXN0Yml0ID0gbGVhc3RfYml0KG0tPnRyZWVtYXApOworICBjb21wdXRlX2JpdDJpZHgobGVhc3RiaXQsIGkpOworCisgIHYgPSB0ID0gKnRyZWViaW5fYXQobSwgaSk7CisgIHJzaXplID0gY2h1bmtzaXplKHQpIC0gbmI7CisKKyAgd2hpbGUgKCh0ID0gbGVmdG1vc3RfY2hpbGQodCkpICE9IDApIHsKKyAgICBzaXplX3QgdHJlbSA9IGNodW5rc2l6ZSh0KSAtIG5iOworICAgIGlmICh0cmVtIDwgcnNpemUpIHsKKyAgICAgIHJzaXplID0gdHJlbTsKKyAgICAgIHYgPSB0OworICAgIH0KKyAgfQorCisgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MobSwgdikpKSB7CisgICAgbWNodW5rcHRyIHIgPSBjaHVua19wbHVzX29mZnNldCh2LCBuYik7CisgICAgYXNzZXJ0KGNodW5rc2l6ZSh2KSA9PSByc2l6ZSArIG5iKTsKKyAgICBpZiAoUlRDSEVDSyhva19uZXh0KHYsIHIpKSkgeworICAgICAgdW5saW5rX2xhcmdlX2NodW5rKG0sIHYpOworICAgICAgaWYgKHJzaXplIDwgTUlOX0NIVU5LX1NJWkUpCisgICAgICAgIHNldF9pbnVzZV9hbmRfcGludXNlKG0sIHYsIChyc2l6ZSArIG5iKSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCB2LCBuYik7CisgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7CisgICAgICAgIHJlcGxhY2VfZHYobSwgciwgcnNpemUpOworICAgICAgfQorICAgICAgcmV0dXJuIGNodW5rMm1lbSh2KTsKKyAgICB9CisgIH0KKworICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihtKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWFsbG9jIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkKiBpbnRlcm5hbF9yZWFsbG9jKG1zdGF0ZSBtLCB2b2lkKiBvbGRtZW0sIHNpemVfdCBieXRlcykgeworICBpZiAoYnl0ZXMgPj0gTUFYX1JFUVVFU1QpIHsKKyAgICBNQUxMT0NfRkFJTFVSRV9BQ1RJT047CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFQUkVBQ1RJT04obSkpIHsKKyAgICBtY2h1bmtwdHIgb2xkcCA9IG1lbTJjaHVuayhvbGRtZW0pOworICAgIHNpemVfdCBvbGRzaXplID0gY2h1bmtzaXplKG9sZHApOworICAgIG1jaHVua3B0ciBuZXh0ID0gY2h1bmtfcGx1c19vZmZzZXQob2xkcCwgb2xkc2l6ZSk7CisgICAgbWNodW5rcHRyIG5ld3AgPSAwOworICAgIHZvaWQqIGV4dHJhID0gMDsKKworICAgIC8qIFRyeSB0byBlaXRoZXIgc2hyaW5rIG9yIGV4dGVuZCBpbnRvIHRvcC4gRWxzZSBtYWxsb2MtY29weS1mcmVlICovCisKKyAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKG0sIG9sZHApICYmIG9rX2NpbnVzZShvbGRwKSAmJgorICAgICAgICAgICAgICAgIG9rX25leHQob2xkcCwgbmV4dCkgJiYgb2tfcGludXNlKG5leHQpKSkgeworICAgICAgc2l6ZV90IG5iID0gcmVxdWVzdDJzaXplKGJ5dGVzKTsKKyAgICAgIGlmIChpc19tbWFwcGVkKG9sZHApKQorICAgICAgICBuZXdwID0gbW1hcF9yZXNpemUobSwgb2xkcCwgbmIpOworICAgICAgZWxzZSBpZiAob2xkc2l6ZSA+PSBuYikgeyAvKiBhbHJlYWR5IGJpZyBlbm91Z2ggKi8KKyAgICAgICAgc2l6ZV90IHJzaXplID0gb2xkc2l6ZSAtIG5iOworICAgICAgICBuZXdwID0gb2xkcDsKKyAgICAgICAgaWYgKHJzaXplID49IE1JTl9DSFVOS19TSVpFKSB7CisgICAgICAgICAgbWNodW5rcHRyIHJlbWFpbmRlciA9IGNodW5rX3BsdXNfb2Zmc2V0KG5ld3AsIG5iKTsKKyAgICAgICAgICBzZXRfaW51c2UobSwgbmV3cCwgbmIpOworICAgICAgICAgIHNldF9pbnVzZShtLCByZW1haW5kZXIsIHJzaXplKTsKKyAgICAgICAgICBleHRyYSA9IGNodW5rMm1lbShyZW1haW5kZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChuZXh0ID09IG0tPnRvcCAmJiBvbGRzaXplICsgbS0+dG9wc2l6ZSA+IG5iKSB7CisgICAgICAgIC8qIEV4cGFuZCBpbnRvIHRvcCAqLworICAgICAgICBzaXplX3QgbmV3c2l6ZSA9IG9sZHNpemUgKyBtLT50b3BzaXplOworICAgICAgICBzaXplX3QgbmV3dG9wc2l6ZSA9IG5ld3NpemUgLSBuYjsKKyAgICAgICAgbWNodW5rcHRyIG5ld3RvcCA9IGNodW5rX3BsdXNfb2Zmc2V0KG9sZHAsIG5iKTsKKyAgICAgICAgc2V0X2ludXNlKG0sIG9sZHAsIG5iKTsKKyAgICAgICAgbmV3dG9wLT5oZWFkID0gbmV3dG9wc2l6ZSB8UElOVVNFX0JJVDsKKyAgICAgICAgbS0+dG9wID0gbmV3dG9wOworICAgICAgICBtLT50b3BzaXplID0gbmV3dG9wc2l6ZTsKKyAgICAgICAgbmV3cCA9IG9sZHA7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgVVNBR0VfRVJST1JfQUNUSU9OKG0sIG9sZG1lbSk7CisgICAgICBQT1NUQUNUSU9OKG0pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgUE9TVEFDVElPTihtKTsKKworICAgIGlmIChuZXdwICE9IDApIHsKKyAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgIGludGVybmFsX2ZyZWUobSwgZXh0cmEpOworICAgICAgfQorICAgICAgY2hlY2tfaW51c2VfY2h1bmsobSwgbmV3cCk7CisgICAgICByZXR1cm4gY2h1bmsybWVtKG5ld3ApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHZvaWQqIG5ld21lbSA9IGludGVybmFsX21hbGxvYyhtLCBieXRlcyk7CisgICAgICBpZiAobmV3bWVtICE9IDApIHsKKyAgICAgICAgc2l6ZV90IG9jID0gb2xkc2l6ZSAtIG92ZXJoZWFkX2ZvcihvbGRwKTsKKyAgICAgICAgbWVtY3B5KG5ld21lbSwgb2xkbWVtLCAob2MgPCBieXRlcyk/IG9jIDogYnl0ZXMpOworICAgICAgICBpbnRlcm5hbF9mcmVlKG0sIG9sZG1lbSk7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3bWVtOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lbWFsaWduIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQqIGludGVybmFsX21lbWFsaWduKG1zdGF0ZSBtLCBzaXplX3QgYWxpZ25tZW50LCBzaXplX3QgYnl0ZXMpIHsKKyAgaWYgKGFsaWdubWVudCA8PSBNQUxMT0NfQUxJR05NRU5UKSAgICAvKiBDYW4ganVzdCB1c2UgbWFsbG9jICovCisgICAgcmV0dXJuIGludGVybmFsX21hbGxvYyhtLCBieXRlcyk7CisgIGlmIChhbGlnbm1lbnQgPCAgTUlOX0NIVU5LX1NJWkUpIC8qIG11c3QgYmUgYXQgbGVhc3QgYSBtaW5pbXVtIGNodW5rIHNpemUgKi8KKyAgICBhbGlnbm1lbnQgPSBNSU5fQ0hVTktfU0laRTsKKyAgaWYgKChhbGlnbm1lbnQgJiAoYWxpZ25tZW50LVNJWkVfVF9PTkUpKSAhPSAwKSB7LyogRW5zdXJlIGEgcG93ZXIgb2YgMiAqLworICAgIHNpemVfdCBhID0gTUFMTE9DX0FMSUdOTUVOVCA8PCAxOworICAgIHdoaWxlIChhIDwgYWxpZ25tZW50KSBhIDw8PSAxOworICAgIGFsaWdubWVudCA9IGE7CisgIH0KKyAgCisgIGlmIChieXRlcyA+PSBNQVhfUkVRVUVTVCAtIGFsaWdubWVudCkgeworICAgIGlmIChtICE9IDApICB7IC8qIFRlc3QgaXNuJ3QgbmVlZGVkIGJ1dCBhdm9pZHMgY29tcGlsZXIgd2FybmluZyAqLworICAgICAgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBzaXplX3QgbmIgPSByZXF1ZXN0MnNpemUoYnl0ZXMpOworICAgIHNpemVfdCByZXEgPSBuYiArIGFsaWdubWVudCArIE1JTl9DSFVOS19TSVpFIC0gQ0hVTktfT1ZFUkhFQUQ7CisgICAgY2hhciogbWVtID0gKGNoYXIqKWludGVybmFsX21hbGxvYyhtLCByZXEpOworICAgIGlmIChtZW0gIT0gMCkgeworICAgICAgdm9pZCogbGVhZGVyID0gMDsKKyAgICAgIHZvaWQqIHRyYWlsZXIgPSAwOworICAgICAgbWNodW5rcHRyIHAgPSBtZW0yY2h1bmsobWVtKTsKKworICAgICAgaWYgKFBSRUFDVElPTihtKSkgcmV0dXJuIDA7CisgICAgICBpZiAoKCgoc2l6ZV90KShtZW0pKSAlIGFsaWdubWVudCkgIT0gMCkgeyAvKiBtaXNhbGlnbmVkICovCisgICAgICAgIC8qCisgICAgICAgICAgRmluZCBhbiBhbGlnbmVkIHNwb3QgaW5zaWRlIGNodW5rLiAgU2luY2Ugd2UgbmVlZCB0byBnaXZlCisgICAgICAgICAgYmFjayBsZWFkaW5nIHNwYWNlIGluIGEgY2h1bmsgb2YgYXQgbGVhc3QgTUlOX0NIVU5LX1NJWkUsIGlmCisgICAgICAgICAgdGhlIGZpcnN0IGNhbGN1bGF0aW9uIHBsYWNlcyB1cyBhdCBhIHNwb3Qgd2l0aCBsZXNzIHRoYW4KKyAgICAgICAgICBNSU5fQ0hVTktfU0laRSBsZWFkZXIsIHdlIGNhbiBtb3ZlIHRvIHRoZSBuZXh0IGFsaWduZWQgc3BvdC4KKyAgICAgICAgICBXZSd2ZSBhbGxvY2F0ZWQgZW5vdWdoIHRvdGFsIHJvb20gc28gdGhhdCB0aGlzIGlzIGFsd2F5cworICAgICAgICAgIHBvc3NpYmxlLgorICAgICAgICAqLworICAgICAgICBjaGFyKiBiciA9IChjaGFyKiltZW0yY2h1bmsoKHNpemVfdCkoKChzaXplX3QpKG1lbSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFX1RfT05FKSkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWFsaWdubWVudCkpOworICAgICAgICBjaGFyKiBwb3MgPSAoKHNpemVfdCkoYnIgLSAoY2hhciopKHApKSA+PSBNSU5fQ0hVTktfU0laRSk/CisgICAgICAgICAgYnIgOiBicithbGlnbm1lbnQ7CisgICAgICAgIG1jaHVua3B0ciBuZXdwID0gKG1jaHVua3B0cilwb3M7CisgICAgICAgIHNpemVfdCBsZWFkc2l6ZSA9IHBvcyAtIChjaGFyKikocCk7CisgICAgICAgIHNpemVfdCBuZXdzaXplID0gY2h1bmtzaXplKHApIC0gbGVhZHNpemU7CisKKyAgICAgICAgaWYgKGlzX21tYXBwZWQocCkpIHsgLyogRm9yIG1tYXBwZWQgY2h1bmtzLCBqdXN0IGFkanVzdCBvZmZzZXQgKi8KKyAgICAgICAgICBuZXdwLT5wcmV2X2Zvb3QgPSBwLT5wcmV2X2Zvb3QgKyBsZWFkc2l6ZTsKKyAgICAgICAgICBuZXdwLT5oZWFkID0gKG5ld3NpemV8Q0lOVVNFX0JJVCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8qIE90aGVyd2lzZSwgZ2l2ZSBiYWNrIGxlYWRlciwgdXNlIHRoZSByZXN0ICovCisgICAgICAgICAgc2V0X2ludXNlKG0sIG5ld3AsIG5ld3NpemUpOworICAgICAgICAgIHNldF9pbnVzZShtLCBwLCBsZWFkc2l6ZSk7CisgICAgICAgICAgbGVhZGVyID0gY2h1bmsybWVtKHApOworICAgICAgICB9CisgICAgICAgIHAgPSBuZXdwOworICAgICAgfQorCisgICAgICAvKiBHaXZlIGJhY2sgc3BhcmUgcm9vbSBhdCB0aGUgZW5kICovCisgICAgICBpZiAoIWlzX21tYXBwZWQocCkpIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBjaHVua3NpemUocCk7CisgICAgICAgIGlmIChzaXplID4gbmIgKyBNSU5fQ0hVTktfU0laRSkgeworICAgICAgICAgIHNpemVfdCByZW1haW5kZXJfc2l6ZSA9IHNpemUgLSBuYjsKKyAgICAgICAgICBtY2h1bmtwdHIgcmVtYWluZGVyID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgICAgIHNldF9pbnVzZShtLCBwLCBuYik7CisgICAgICAgICAgc2V0X2ludXNlKG0sIHJlbWFpbmRlciwgcmVtYWluZGVyX3NpemUpOworICAgICAgICAgIHRyYWlsZXIgPSBjaHVuazJtZW0ocmVtYWluZGVyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBhc3NlcnQgKGNodW5rc2l6ZShwKSA+PSBuYik7CisgICAgICBhc3NlcnQoKCgoc2l6ZV90KShjaHVuazJtZW0ocCkpKSAlIGFsaWdubWVudCkgPT0gMCk7CisgICAgICBjaGVja19pbnVzZV9jaHVuayhtLCBwKTsKKyAgICAgIFBPU1RBQ1RJT04obSk7CisgICAgICBpZiAobGVhZGVyICE9IDApIHsKKyAgICAgICAgaW50ZXJuYWxfZnJlZShtLCBsZWFkZXIpOworICAgICAgfQorICAgICAgaWYgKHRyYWlsZXIgIT0gMCkgeworICAgICAgICBpbnRlcm5hbF9mcmVlKG0sIHRyYWlsZXIpOworICAgICAgfQorICAgICAgcmV0dXJuIGNodW5rMm1lbShwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb21hbGxvYy9jb2FsbG9jIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkKiogaWFsbG9jKG1zdGF0ZSBtLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHNpemVzLAorICAgICAgICAgICAgICAgICAgICAgaW50IG9wdHMsCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjaHVua3NbXSkgeworICAvKgorICAgIFRoaXMgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIGluZGVwZW5kZW50X1ggcm91dGluZXMsIGhhbmRsaW5nCisgICAgYWxsIG9mIHRoZSBjb21iaW5hdGlvbnMgdGhhdCBjYW4gcmVzdWx0LgorCisgICAgVGhlIG9wdHMgYXJnIGhhczoKKyAgICBiaXQgMCBzZXQgaWYgYWxsIGVsZW1lbnRzIGFyZSBzYW1lIHNpemUgKHVzaW5nIHNpemVzWzBdKQorICAgIGJpdCAxIHNldCBpZiBlbGVtZW50cyBzaG91bGQgYmUgemVyb2VkCisgICovCisKKyAgc2l6ZV90ICAgIGVsZW1lbnRfc2l6ZTsgICAvKiBjaHVua3NpemUgb2YgZWFjaCBlbGVtZW50LCBpZiBhbGwgc2FtZSAqLworICBzaXplX3QgICAgY29udGVudHNfc2l6ZTsgIC8qIHRvdGFsIHNpemUgb2YgZWxlbWVudHMgKi8KKyAgc2l6ZV90ICAgIGFycmF5X3NpemU7ICAgICAvKiByZXF1ZXN0IHNpemUgb2YgcG9pbnRlciBhcnJheSAqLworICB2b2lkKiAgICAgbWVtOyAgICAgICAgICAgIC8qIG1hbGxvY2VkIGFnZ3JlZ2F0ZSBzcGFjZSAqLworICBtY2h1bmtwdHIgcDsgICAgICAgICAgICAgIC8qIGNvcnJlc3BvbmRpbmcgY2h1bmsgKi8KKyAgc2l6ZV90ICAgIHJlbWFpbmRlcl9zaXplOyAvKiByZW1haW5pbmcgYnl0ZXMgd2hpbGUgc3BsaXR0aW5nICovCisgIHZvaWQqKiAgICBtYXJyYXk7ICAgICAgICAgLyogZWl0aGVyICJjaHVua3MiIG9yIG1hbGxvY2VkIHB0ciBhcnJheSAqLworICBtY2h1bmtwdHIgYXJyYXlfY2h1bms7ICAgIC8qIGNodW5rIGZvciBtYWxsb2NlZCBwdHIgYXJyYXkgKi8KKyAgZmxhZ190ICAgIHdhc19lbmFibGVkOyAgICAvKiB0byBkaXNhYmxlIG1tYXAgKi8KKyAgc2l6ZV90ICAgIHNpemU7CisgIHNpemVfdCAgICBpOworCisgIC8qIGNvbXB1dGUgYXJyYXkgbGVuZ3RoLCBpZiBuZWVkZWQgKi8KKyAgaWYgKGNodW5rcyAhPSAwKSB7CisgICAgaWYgKG5fZWxlbWVudHMgPT0gMCkKKyAgICAgIHJldHVybiBjaHVua3M7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICBtYXJyYXkgPSBjaHVua3M7CisgICAgYXJyYXlfc2l6ZSA9IDA7CisgIH0KKyAgZWxzZSB7CisgICAgLyogaWYgZW1wdHkgcmVxLCBtdXN0IHN0aWxsIHJldHVybiBjaHVuayByZXByZXNlbnRpbmcgZW1wdHkgYXJyYXkgKi8KKyAgICBpZiAobl9lbGVtZW50cyA9PSAwKQorICAgICAgcmV0dXJuICh2b2lkKiopaW50ZXJuYWxfbWFsbG9jKG0sIDApOworICAgIG1hcnJheSA9IDA7CisgICAgYXJyYXlfc2l6ZSA9IHJlcXVlc3Qyc2l6ZShuX2VsZW1lbnRzICogKHNpemVvZih2b2lkKikpKTsKKyAgfQorCisgIC8qIGNvbXB1dGUgdG90YWwgZWxlbWVudCBzaXplICovCisgIGlmIChvcHRzICYgMHgxKSB7IC8qIGFsbC1zYW1lLXNpemUgKi8KKyAgICBlbGVtZW50X3NpemUgPSByZXF1ZXN0MnNpemUoKnNpemVzKTsKKyAgICBjb250ZW50c19zaXplID0gbl9lbGVtZW50cyAqIGVsZW1lbnRfc2l6ZTsKKyAgfQorICBlbHNlIHsgLyogYWRkIHVwIGFsbCB0aGUgc2l6ZXMgKi8KKyAgICBlbGVtZW50X3NpemUgPSAwOworICAgIGNvbnRlbnRzX3NpemUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgIT0gbl9lbGVtZW50czsgKytpKQorICAgICAgY29udGVudHNfc2l6ZSArPSByZXF1ZXN0MnNpemUoc2l6ZXNbaV0pOworICB9CisKKyAgc2l6ZSA9IGNvbnRlbnRzX3NpemUgKyBhcnJheV9zaXplOworCisgIC8qCisgICAgIEFsbG9jYXRlIHRoZSBhZ2dyZWdhdGUgY2h1bmsuICBGaXJzdCBkaXNhYmxlIGRpcmVjdC1tbWFwcGluZyBzbworICAgICBtYWxsb2Mgd29uJ3QgdXNlIGl0LCBzaW5jZSB3ZSB3b3VsZCBub3QgYmUgYWJsZSB0byBsYXRlcgorICAgICBmcmVlL3JlYWxsb2Mgc3BhY2UgaW50ZXJuYWwgdG8gYSBzZWdyZWdhdGVkIG1tYXAgcmVnaW9uLgorICAqLworICB3YXNfZW5hYmxlZCA9IHVzZV9tbWFwKG0pOworICBkaXNhYmxlX21tYXAobSk7CisgIG1lbSA9IGludGVybmFsX21hbGxvYyhtLCBzaXplIC0gQ0hVTktfT1ZFUkhFQUQpOworICBpZiAod2FzX2VuYWJsZWQpCisgICAgZW5hYmxlX21tYXAobSk7CisgIGlmIChtZW0gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoUFJFQUNUSU9OKG0pKSByZXR1cm4gMDsKKyAgcCA9IG1lbTJjaHVuayhtZW0pOworICByZW1haW5kZXJfc2l6ZSA9IGNodW5rc2l6ZShwKTsKKworICBhc3NlcnQoIWlzX21tYXBwZWQocCkpOworCisgIGlmIChvcHRzICYgMHgyKSB7ICAgICAgIC8qIG9wdGlvbmFsbHkgY2xlYXIgdGhlIGVsZW1lbnRzICovCisgICAgbWVtc2V0KChzaXplX3QqKW1lbSwgMCwgcmVtYWluZGVyX3NpemUgLSBTSVpFX1RfU0laRSAtIGFycmF5X3NpemUpOworICB9CisKKyAgLyogSWYgbm90IHByb3ZpZGVkLCBhbGxvY2F0ZSB0aGUgcG9pbnRlciBhcnJheSBhcyBmaW5hbCBwYXJ0IG9mIGNodW5rICovCisgIGlmIChtYXJyYXkgPT0gMCkgeworICAgIHNpemVfdCAgYXJyYXlfY2h1bmtfc2l6ZTsKKyAgICBhcnJheV9jaHVuayA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIGNvbnRlbnRzX3NpemUpOworICAgIGFycmF5X2NodW5rX3NpemUgPSByZW1haW5kZXJfc2l6ZSAtIGNvbnRlbnRzX3NpemU7CisgICAgbWFycmF5ID0gKHZvaWQqKikgKGNodW5rMm1lbShhcnJheV9jaHVuaykpOworICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgYXJyYXlfY2h1bmssIGFycmF5X2NodW5rX3NpemUpOworICAgIHJlbWFpbmRlcl9zaXplID0gY29udGVudHNfc2l6ZTsKKyAgfQorCisgIC8qIHNwbGl0IG91dCBlbGVtZW50cyAqLworICBmb3IgKGkgPSAwOyA7ICsraSkgeworICAgIG1hcnJheVtpXSA9IGNodW5rMm1lbShwKTsKKyAgICBpZiAoaSAhPSBuX2VsZW1lbnRzLTEpIHsKKyAgICAgIGlmIChlbGVtZW50X3NpemUgIT0gMCkKKyAgICAgICAgc2l6ZSA9IGVsZW1lbnRfc2l6ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgc2l6ZSA9IHJlcXVlc3Qyc2l6ZShzaXplc1tpXSk7CisgICAgICByZW1haW5kZXJfc2l6ZSAtPSBzaXplOworICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCBwLCBzaXplKTsKKyAgICAgIHAgPSBjaHVua19wbHVzX29mZnNldChwLCBzaXplKTsKKyAgICB9CisgICAgZWxzZSB7IC8qIHRoZSBmaW5hbCBlbGVtZW50IGFic29yYnMgYW55IG92ZXJhbGxvY2F0aW9uIHNsb3AgKi8KKyAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgcCwgcmVtYWluZGVyX3NpemUpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyNpZiBERUJVRworICBpZiAobWFycmF5ICE9IGNodW5rcykgeworICAgIC8qIGZpbmFsIGVsZW1lbnQgbXVzdCBoYXZlIGV4YWN0bHkgZXhoYXVzdGVkIGNodW5rICovCisgICAgaWYgKGVsZW1lbnRfc2l6ZSAhPSAwKSB7CisgICAgICBhc3NlcnQocmVtYWluZGVyX3NpemUgPT0gZWxlbWVudF9zaXplKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBhc3NlcnQocmVtYWluZGVyX3NpemUgPT0gcmVxdWVzdDJzaXplKHNpemVzW2ldKSk7CisgICAgfQorICAgIGNoZWNrX2ludXNlX2NodW5rKG0sIG1lbTJjaHVuayhtYXJyYXkpKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpICE9IG5fZWxlbWVudHM7ICsraSkKKyAgICBjaGVja19pbnVzZV9jaHVuayhtLCBtZW0yY2h1bmsobWFycmF5W2ldKSk7CisKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIFBPU1RBQ1RJT04obSk7CisgIHJldHVybiBtYXJyYXk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHVibGljIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmICFPTkxZX01TUEFDRVMKKwordm9pZCogZGxtYWxsb2Moc2l6ZV90IGJ5dGVzKSB7CisgIC8qCisgICAgIEJhc2ljIGFsZ29yaXRobToKKyAgICAgSWYgYSBzbWFsbCByZXF1ZXN0ICg8IDI1NiBieXRlcyBtaW51cyBwZXItY2h1bmsgb3ZlcmhlYWQpOgorICAgICAgIDEuIElmIG9uZSBleGlzdHMsIHVzZSBhIHJlbWFpbmRlcmxlc3MgY2h1bmsgaW4gYXNzb2NpYXRlZCBzbWFsbGJpbi4KKyAgICAgICAgICAoUmVtYWluZGVybGVzcyBtZWFucyB0aGF0IHRoZXJlIGFyZSB0b28gZmV3IGV4Y2VzcyBieXRlcyB0bworICAgICAgICAgIHJlcHJlc2VudCBhcyBhIGNodW5rLikKKyAgICAgICAyLiBJZiBpdCBpcyBiaWcgZW5vdWdoLCB1c2UgdGhlIGR2IGNodW5rLCB3aGljaCBpcyBub3JtYWxseSB0aGUKKyAgICAgICAgICBjaHVuayBhZGphY2VudCB0byB0aGUgb25lIHVzZWQgZm9yIHRoZSBtb3N0IHJlY2VudCBzbWFsbCByZXF1ZXN0LgorICAgICAgIDMuIElmIG9uZSBleGlzdHMsIHNwbGl0IHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgY2h1bmsgaW4gYSBiaW4sCisgICAgICAgICAgc2F2aW5nIHJlbWFpbmRlciBpbiBkdi4KKyAgICAgICA0LiBJZiBpdCBpcyBiaWcgZW5vdWdoLCB1c2UgdGhlIHRvcCBjaHVuay4KKyAgICAgICA1LiBJZiBhdmFpbGFibGUsIGdldCBtZW1vcnkgZnJvbSBzeXN0ZW0gYW5kIHVzZSBpdAorICAgICBPdGhlcndpc2UsIGZvciBhIGxhcmdlIHJlcXVlc3Q6CisgICAgICAgMS4gRmluZCB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIGJpbm5lZCBjaHVuayB0aGF0IGZpdHMsIGFuZCB1c2UgaXQKKyAgICAgICAgICBpZiBpdCBpcyBiZXR0ZXIgZml0dGluZyB0aGFuIGR2IGNodW5rLCBzcGxpdHRpbmcgaWYgbmVjZXNzYXJ5LgorICAgICAgIDIuIElmIGJldHRlciBmaXR0aW5nIHRoYW4gYW55IGJpbm5lZCBjaHVuaywgdXNlIHRoZSBkdiBjaHVuay4KKyAgICAgICAzLiBJZiBpdCBpcyBiaWcgZW5vdWdoLCB1c2UgdGhlIHRvcCBjaHVuay4KKyAgICAgICA0LiBJZiByZXF1ZXN0IHNpemUgPj0gbW1hcCB0aHJlc2hvbGQsIHRyeSB0byBkaXJlY3RseSBtbWFwIHRoaXMgY2h1bmsuCisgICAgICAgNS4gSWYgYXZhaWxhYmxlLCBnZXQgbWVtb3J5IGZyb20gc3lzdGVtIGFuZCB1c2UgaXQKKworICAgICBUaGUgdWdseSBnb3RvJ3MgaGVyZSBlbnN1cmUgdGhhdCBwb3N0YWN0aW9uIG9jY3VycyBhbG9uZyBhbGwgcGF0aHMuCisgICovCisKKyAgaWYgKCFQUkVBQ1RJT04oZ20pKSB7CisgICAgdm9pZCogbWVtOworICAgIHNpemVfdCBuYjsKKyAgICBpZiAoYnl0ZXMgPD0gTUFYX1NNQUxMX1JFUVVFU1QpIHsKKyAgICAgIGJpbmRleF90IGlkeDsKKyAgICAgIGJpbm1hcF90IHNtYWxsYml0czsKKyAgICAgIG5iID0gKGJ5dGVzIDwgTUlOX1JFUVVFU1QpPyBNSU5fQ0hVTktfU0laRSA6IHBhZF9yZXF1ZXN0KGJ5dGVzKTsKKyAgICAgIGlkeCA9IHNtYWxsX2luZGV4KG5iKTsKKyAgICAgIHNtYWxsYml0cyA9IGdtLT5zbWFsbG1hcCA+PiBpZHg7CisKKyAgICAgIGlmICgoc21hbGxiaXRzICYgMHgzVSkgIT0gMCkgeyAvKiBSZW1haW5kZXJsZXNzIGZpdCB0byBhIHNtYWxsYmluLiAqLworICAgICAgICBtY2h1bmtwdHIgYiwgcDsKKyAgICAgICAgaWR4ICs9IH5zbWFsbGJpdHMgJiAxOyAgICAgICAvKiBVc2VzIG5leHQgYmluIGlmIGlkeCBlbXB0eSAqLworICAgICAgICBiID0gc21hbGxiaW5fYXQoZ20sIGlkeCk7CisgICAgICAgIHAgPSBiLT5mZDsKKyAgICAgICAgYXNzZXJ0KGNodW5rc2l6ZShwKSA9PSBzbWFsbF9pbmRleDJzaXplKGlkeCkpOworICAgICAgICB1bmxpbmtfZmlyc3Rfc21hbGxfY2h1bmsoZ20sIGIsIHAsIGlkeCk7CisgICAgICAgIHNldF9pbnVzZV9hbmRfcGludXNlKGdtLCBwLCBzbWFsbF9pbmRleDJzaXplKGlkeCkpOworICAgICAgICBtZW0gPSBjaHVuazJtZW0ocCk7CisgICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKGdtLCBtZW0sIG5iKTsKKyAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgfQorCisgICAgICBlbHNlIGlmIChuYiA+IGdtLT5kdnNpemUpIHsKKyAgICAgICAgaWYgKHNtYWxsYml0cyAhPSAwKSB7IC8qIFVzZSBjaHVuayBpbiBuZXh0IG5vbmVtcHR5IHNtYWxsYmluICovCisgICAgICAgICAgbWNodW5rcHRyIGIsIHAsIHI7CisgICAgICAgICAgc2l6ZV90IHJzaXplOworICAgICAgICAgIGJpbmRleF90IGk7CisgICAgICAgICAgYmlubWFwX3QgbGVmdGJpdHMgPSAoc21hbGxiaXRzIDw8IGlkeCkgJiBsZWZ0X2JpdHMoaWR4MmJpdChpZHgpKTsKKyAgICAgICAgICBiaW5tYXBfdCBsZWFzdGJpdCA9IGxlYXN0X2JpdChsZWZ0Yml0cyk7CisgICAgICAgICAgY29tcHV0ZV9iaXQyaWR4KGxlYXN0Yml0LCBpKTsKKyAgICAgICAgICBiID0gc21hbGxiaW5fYXQoZ20sIGkpOworICAgICAgICAgIHAgPSBiLT5mZDsKKyAgICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHApID09IHNtYWxsX2luZGV4MnNpemUoaSkpOworICAgICAgICAgIHVubGlua19maXJzdF9zbWFsbF9jaHVuayhnbSwgYiwgcCwgaSk7CisgICAgICAgICAgcnNpemUgPSBzbWFsbF9pbmRleDJzaXplKGkpIC0gbmI7CisgICAgICAgICAgLyogRml0IGhlcmUgY2Fubm90IGJlIHJlbWFpbmRlcmxlc3MgaWYgNGJ5dGUgc2l6ZXMgKi8KKyAgICAgICAgICBpZiAoU0laRV9UX1NJWkUgIT0gNCAmJiByc2l6ZSA8IE1JTl9DSFVOS19TSVpFKQorICAgICAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UoZ20sIHAsIHNtYWxsX2luZGV4MnNpemUoaSkpOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhnbSwgcCwgbmIpOworICAgICAgICAgICAgciA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKKyAgICAgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7CisgICAgICAgICAgICByZXBsYWNlX2R2KGdtLCByLCByc2l6ZSk7CisgICAgICAgICAgfQorICAgICAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKKyAgICAgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhnbSwgbWVtLCBuYik7CisgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgZWxzZSBpZiAoZ20tPnRyZWVtYXAgIT0gMCAmJiAobWVtID0gdG1hbGxvY19zbWFsbChnbSwgbmIpKSAhPSAwKSB7CisgICAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOworICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChieXRlcyA+PSBNQVhfUkVRVUVTVCkKKyAgICAgIG5iID0gTUFYX1NJWkVfVDsgLyogVG9vIGJpZyB0byBhbGxvY2F0ZS4gRm9yY2UgZmFpbHVyZSAoaW4gc3lzIGFsbG9jKSAqLworICAgIGVsc2UgeworICAgICAgbmIgPSBwYWRfcmVxdWVzdChieXRlcyk7CisgICAgICBpZiAoZ20tPnRyZWVtYXAgIT0gMCAmJiAobWVtID0gdG1hbGxvY19sYXJnZShnbSwgbmIpKSAhPSAwKSB7CisgICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKGdtLCBtZW0sIG5iKTsKKyAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgfQorICAgIH0KKworICAgIGlmIChuYiA8PSBnbS0+ZHZzaXplKSB7CisgICAgICBzaXplX3QgcnNpemUgPSBnbS0+ZHZzaXplIC0gbmI7CisgICAgICBtY2h1bmtwdHIgcCA9IGdtLT5kdjsKKyAgICAgIGlmIChyc2l6ZSA+PSBNSU5fQ0hVTktfU0laRSkgeyAvKiBzcGxpdCBkdiAqLworICAgICAgICBtY2h1bmtwdHIgciA9IGdtLT5kdiA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKKyAgICAgICAgZ20tPmR2c2l6ZSA9IHJzaXplOworICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsociwgcnNpemUpOworICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKGdtLCBwLCBuYik7CisgICAgICB9CisgICAgICBlbHNlIHsgLyogZXhoYXVzdCBkdiAqLworICAgICAgICBzaXplX3QgZHZzID0gZ20tPmR2c2l6ZTsKKyAgICAgICAgZ20tPmR2c2l6ZSA9IDA7CisgICAgICAgIGdtLT5kdiA9IDA7CisgICAgICAgIHNldF9pbnVzZV9hbmRfcGludXNlKGdtLCBwLCBkdnMpOworICAgICAgfQorICAgICAgbWVtID0gY2h1bmsybWVtKHApOworICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOworICAgICAgZ290byBwb3N0YWN0aW9uOworICAgIH0KKworICAgIGVsc2UgaWYgKG5iIDwgZ20tPnRvcHNpemUpIHsgLyogU3BsaXQgdG9wICovCisgICAgICBzaXplX3QgcnNpemUgPSBnbS0+dG9wc2l6ZSAtPSBuYjsKKyAgICAgIG1jaHVua3B0ciBwID0gZ20tPnRvcDsKKyAgICAgIG1jaHVua3B0ciByID0gZ20tPnRvcCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsKKyAgICAgIHItPmhlYWQgPSByc2l6ZSB8IFBJTlVTRV9CSVQ7CisgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKGdtLCBwLCBuYik7CisgICAgICBtZW0gPSBjaHVuazJtZW0ocCk7CisgICAgICBjaGVja190b3BfY2h1bmsoZ20sIGdtLT50b3ApOworICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOworICAgICAgZ290byBwb3N0YWN0aW9uOworICAgIH0KKworICAgIG1lbSA9IHN5c19hbGxvYyhnbSwgbmIpOworCisgIHBvc3RhY3Rpb246CisgICAgUE9TVEFDVElPTihnbSk7CisgICAgcmV0dXJuIG1lbTsKKyAgfQorCisgIHJldHVybiAwOworfQorCit2b2lkIGRsZnJlZSh2b2lkKiBtZW0pIHsKKyAgLyoKKyAgICAgQ29uc29saWRhdGUgZnJlZWQgY2h1bmtzIHdpdGggcHJlY2VlZGluZyBvciBzdWNjZWVkaW5nIGJvcmRlcmluZworICAgICBmcmVlIGNodW5rcywgaWYgdGhleSBleGlzdCwgYW5kIHRoZW4gcGxhY2UgaW4gYSBiaW4uICBJbnRlcm1peGVkCisgICAgIHdpdGggc3BlY2lhbCBjYXNlcyBmb3IgdG9wLCBkdiwgbW1hcHBlZCBjaHVua3MsIGFuZCB1c2FnZSBlcnJvcnMuCisgICovCisKKyAgaWYgKG1lbSAhPSAwKSB7CisgICAgbWNodW5rcHRyIHAgID0gbWVtMmNodW5rKG1lbSk7CisjaWYgRk9PVEVSUworICAgIG1zdGF0ZSBmbSA9IGdldF9tc3RhdGVfZm9yKHApOworICAgIGlmICghb2tfbWFnaWMoZm0pKSB7CisgICAgICBVU0FHRV9FUlJPUl9BQ1RJT04oZm0sIHApOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbHNlIC8qIEZPT1RFUlMgKi8KKyNkZWZpbmUgZm0gZ20KKyNlbmRpZiAvKiBGT09URVJTICovCisgICAgaWYgKCFQUkVBQ1RJT04oZm0pKSB7CisgICAgICBjaGVja19pbnVzZV9jaHVuayhmbSwgcCk7CisgICAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKGZtLCBwKSAmJiBva19jaW51c2UocCkpKSB7CisgICAgICAgIHNpemVfdCBwc2l6ZSA9IGNodW5rc2l6ZShwKTsKKyAgICAgICAgbWNodW5rcHRyIG5leHQgPSBjaHVua19wbHVzX29mZnNldChwLCBwc2l6ZSk7CisgICAgICAgIGlmICghcGludXNlKHApKSB7CisgICAgICAgICAgc2l6ZV90IHByZXZzaXplID0gcC0+cHJldl9mb290OworICAgICAgICAgIGlmICgocHJldnNpemUgJiBJU19NTUFQUEVEX0JJVCkgIT0gMCkgeworICAgICAgICAgICAgcHJldnNpemUgJj0gfklTX01NQVBQRURfQklUOworICAgICAgICAgICAgcHNpemUgKz0gcHJldnNpemUgKyBNTUFQX0ZPT1RfUEFEOworICAgICAgICAgICAgaWYgKENBTExfTVVOTUFQKChjaGFyKilwIC0gcHJldnNpemUsIHBzaXplKSA9PSAwKQorICAgICAgICAgICAgICBmbS0+Zm9vdHByaW50IC09IHBzaXplOworICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1jaHVua3B0ciBwcmV2ID0gY2h1bmtfbWludXNfb2Zmc2V0KHAsIHByZXZzaXplKTsKKyAgICAgICAgICAgIHBzaXplICs9IHByZXZzaXplOworICAgICAgICAgICAgcCA9IHByZXY7CisgICAgICAgICAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKGZtLCBwcmV2KSkpIHsgLyogY29uc29saWRhdGUgYmFja3dhcmQgKi8KKyAgICAgICAgICAgICAgaWYgKHAgIT0gZm0tPmR2KSB7CisgICAgICAgICAgICAgICAgdW5saW5rX2NodW5rKGZtLCBwLCBwcmV2c2l6ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoKG5leHQtPmhlYWQgJiBJTlVTRV9CSVRTKSA9PSBJTlVTRV9CSVRTKSB7CisgICAgICAgICAgICAgICAgZm0tPmR2c2l6ZSA9IHBzaXplOworICAgICAgICAgICAgICAgIHNldF9mcmVlX3dpdGhfcGludXNlKHAsIHBzaXplLCBuZXh0KTsKKyAgICAgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ290byBlcnJvcmFjdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoUlRDSEVDSyhva19uZXh0KHAsIG5leHQpICYmIG9rX3BpbnVzZShuZXh0KSkpIHsKKyAgICAgICAgICBpZiAoIWNpbnVzZShuZXh0KSkgeyAgLyogY29uc29saWRhdGUgZm9yd2FyZCAqLworICAgICAgICAgICAgaWYgKG5leHQgPT0gZm0tPnRvcCkgeworICAgICAgICAgICAgICBzaXplX3QgdHNpemUgPSBmbS0+dG9wc2l6ZSArPSBwc2l6ZTsKKyAgICAgICAgICAgICAgZm0tPnRvcCA9IHA7CisgICAgICAgICAgICAgIHAtPmhlYWQgPSB0c2l6ZSB8IFBJTlVTRV9CSVQ7CisgICAgICAgICAgICAgIGlmIChwID09IGZtLT5kdikgeworICAgICAgICAgICAgICAgIGZtLT5kdiA9IDA7CisgICAgICAgICAgICAgICAgZm0tPmR2c2l6ZSA9IDA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNob3VsZF90cmltKGZtLCB0c2l6ZSkpCisgICAgICAgICAgICAgICAgc3lzX3RyaW0oZm0sIDApOworICAgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChuZXh0ID09IGZtLT5kdikgeworICAgICAgICAgICAgICBzaXplX3QgZHNpemUgPSBmbS0+ZHZzaXplICs9IHBzaXplOworICAgICAgICAgICAgICBmbS0+ZHYgPSBwOworICAgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgZHNpemUpOworICAgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgc2l6ZV90IG5zaXplID0gY2h1bmtzaXplKG5leHQpOworICAgICAgICAgICAgICBwc2l6ZSArPSBuc2l6ZTsKKyAgICAgICAgICAgICAgdW5saW5rX2NodW5rKGZtLCBuZXh0LCBuc2l6ZSk7CisgICAgICAgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhwLCBwc2l6ZSk7CisgICAgICAgICAgICAgIGlmIChwID09IGZtLT5kdikgeworICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSBwc2l6ZTsKKyAgICAgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0X2ZyZWVfd2l0aF9waW51c2UocCwgcHNpemUsIG5leHQpOworICAgICAgICAgIGluc2VydF9jaHVuayhmbSwgcCwgcHNpemUpOworICAgICAgICAgIGNoZWNrX2ZyZWVfY2h1bmsoZm0sIHApOworICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIGVycm9yYWN0aW9uOgorICAgICAgVVNBR0VfRVJST1JfQUNUSU9OKGZtLCBwKTsKKyAgICBwb3N0YWN0aW9uOgorICAgICAgUE9TVEFDVElPTihmbSk7CisgICAgfQorICB9CisjaWYgIUZPT1RFUlMKKyN1bmRlZiBmbQorI2VuZGlmIC8qIEZPT1RFUlMgKi8KK30KKwordm9pZCogZGxjYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtX3NpemUpIHsKKyAgdm9pZCogbWVtOworICBzaXplX3QgcmVxID0gMDsKKyAgaWYgKG5fZWxlbWVudHMgIT0gMCkgeworICAgIHJlcSA9IG5fZWxlbWVudHMgKiBlbGVtX3NpemU7CisgICAgaWYgKCgobl9lbGVtZW50cyB8IGVsZW1fc2l6ZSkgJiB+KHNpemVfdCkweGZmZmYpICYmCisgICAgICAgIChyZXEgLyBuX2VsZW1lbnRzICE9IGVsZW1fc2l6ZSkpCisgICAgICByZXEgPSBNQVhfU0laRV9UOyAvKiBmb3JjZSBkb3duc3RyZWFtIGZhaWx1cmUgb24gb3ZlcmZsb3cgKi8KKyAgfQorICBtZW0gPSBkbG1hbGxvYyhyZXEpOworICBpZiAobWVtICE9IDAgJiYgY2FsbG9jX211c3RfY2xlYXIobWVtMmNodW5rKG1lbSkpKQorICAgIG1lbXNldChtZW0sIDAsIHJlcSk7CisgIHJldHVybiBtZW07Cit9CisKK3ZvaWQqIGRscmVhbGxvYyh2b2lkKiBvbGRtZW0sIHNpemVfdCBieXRlcykgeworICBpZiAob2xkbWVtID09IDApCisgICAgcmV0dXJuIGRsbWFsbG9jKGJ5dGVzKTsKKyNpZmRlZiBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMKKyAgaWYgKGJ5dGVzID09IDApIHsKKyAgICBkbGZyZWUob2xkbWVtKTsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmIC8qIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyAqLworICBlbHNlIHsKKyNpZiAhIEZPT1RFUlMKKyAgICBtc3RhdGUgbSA9IGdtOworI2Vsc2UgLyogRk9PVEVSUyAqLworICAgIG1zdGF0ZSBtID0gZ2V0X21zdGF0ZV9mb3IobWVtMmNodW5rKG9sZG1lbSkpOworICAgIGlmICghb2tfbWFnaWMobSkpIHsKKyAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihtLCBvbGRtZW0pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmIC8qIEZPT1RFUlMgKi8KKyAgICByZXR1cm4gaW50ZXJuYWxfcmVhbGxvYyhtLCBvbGRtZW0sIGJ5dGVzKTsKKyAgfQorfQorCit2b2lkKiBkbG1lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBieXRlcykgeworICByZXR1cm4gaW50ZXJuYWxfbWVtYWxpZ24oZ20sIGFsaWdubWVudCwgYnl0ZXMpOworfQorCit2b2lkKiogZGxpbmRlcGVuZGVudF9jYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjaHVua3NbXSkgeworICBzaXplX3Qgc3ogPSBlbGVtX3NpemU7IC8qIHNlcnZlcyBhcyAxLWVsZW1lbnQgYXJyYXkgKi8KKyAgcmV0dXJuIGlhbGxvYyhnbSwgbl9lbGVtZW50cywgJnN6LCAzLCBjaHVua3MpOworfQorCit2b2lkKiogZGxpbmRlcGVuZGVudF9jb21hbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IHNpemVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNodW5rc1tdKSB7CisgIHJldHVybiBpYWxsb2MoZ20sIG5fZWxlbWVudHMsIHNpemVzLCAwLCBjaHVua3MpOworfQorCit2b2lkKiBkbHZhbGxvYyhzaXplX3QgYnl0ZXMpIHsKKyAgc2l6ZV90IHBhZ2VzejsKKyAgaW5pdF9tcGFyYW1zKCk7CisgIHBhZ2VzeiA9IG1wYXJhbXMucGFnZV9zaXplOworICByZXR1cm4gZGxtZW1hbGlnbihwYWdlc3osIGJ5dGVzKTsKK30KKwordm9pZCogZGxwdmFsbG9jKHNpemVfdCBieXRlcykgeworICBzaXplX3QgcGFnZXN6OworICBpbml0X21wYXJhbXMoKTsKKyAgcGFnZXN6ID0gbXBhcmFtcy5wYWdlX3NpemU7CisgIHJldHVybiBkbG1lbWFsaWduKHBhZ2VzeiwgKGJ5dGVzICsgcGFnZXN6IC0gU0laRV9UX09ORSkgJiB+KHBhZ2VzeiAtIFNJWkVfVF9PTkUpKTsKK30KKworaW50IGRsbWFsbG9jX3RyaW0oc2l6ZV90IHBhZCkgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgaWYgKCFQUkVBQ1RJT04oZ20pKSB7CisgICAgcmVzdWx0ID0gc3lzX3RyaW0oZ20sIHBhZCk7CisgICAgUE9TVEFDVElPTihnbSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc2l6ZV90IGRsbWFsbG9jX2Zvb3RwcmludCh2b2lkKSB7CisgIHJldHVybiBnbS0+Zm9vdHByaW50OworfQorCitzaXplX3QgZGxtYWxsb2NfbWF4X2Zvb3RwcmludCh2b2lkKSB7CisgIHJldHVybiBnbS0+bWF4X2Zvb3RwcmludDsKK30KKworI2lmICFOT19NQUxMSU5GTworc3RydWN0IG1hbGxpbmZvIGRsbWFsbGluZm8odm9pZCkgeworICByZXR1cm4gaW50ZXJuYWxfbWFsbGluZm8oZ20pOworfQorI2VuZGlmIC8qIE5PX01BTExJTkZPICovCisKK3ZvaWQgZGxtYWxsb2Nfc3RhdHMoKSB7CisgIGludGVybmFsX21hbGxvY19zdGF0cyhnbSk7Cit9CisKK3NpemVfdCBkbG1hbGxvY191c2FibGVfc2l6ZSh2b2lkKiBtZW0pIHsKKyAgaWYgKG1lbSAhPSAwKSB7CisgICAgbWNodW5rcHRyIHAgPSBtZW0yY2h1bmsobWVtKTsKKyAgICBpZiAoY2ludXNlKHApKQorICAgICAgcmV0dXJuIGNodW5rc2l6ZShwKSAtIG92ZXJoZWFkX2ZvcihwKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGRsbWFsbG9wdChpbnQgcGFyYW1fbnVtYmVyLCBpbnQgdmFsdWUpIHsKKyAgcmV0dXJuIGNoYW5nZV9tcGFyYW0ocGFyYW1fbnVtYmVyLCB2YWx1ZSk7Cit9CisKKyNlbmRpZiAvKiAhT05MWV9NU1BBQ0VTICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHVzZXIgbXNwYWNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBNU1BBQ0VTCisKK3N0YXRpYyBtc3RhdGUgaW5pdF91c2VyX21zdGF0ZShjaGFyKiB0YmFzZSwgc2l6ZV90IHRzaXplKSB7CisgIHNpemVfdCBtc2l6ZSA9IHBhZF9yZXF1ZXN0KHNpemVvZihzdHJ1Y3QgbWFsbG9jX3N0YXRlKSk7CisgIG1jaHVua3B0ciBtbjsKKyAgbWNodW5rcHRyIG1zcCA9IGFsaWduX2FzX2NodW5rKHRiYXNlKTsKKyAgbXN0YXRlIG0gPSAobXN0YXRlKShjaHVuazJtZW0obXNwKSk7CisgIG1lbXNldChtLCAwLCBtc2l6ZSk7CisgIElOSVRJQUxfTE9DSygmbS0+bXV0ZXgpOworICBtc3AtPmhlYWQgPSAobXNpemV8UElOVVNFX0JJVHxDSU5VU0VfQklUKTsKKyAgbS0+c2VnLmJhc2UgPSBtLT5sZWFzdF9hZGRyID0gdGJhc2U7CisgIG0tPnNlZy5zaXplID0gbS0+Zm9vdHByaW50ID0gbS0+bWF4X2Zvb3RwcmludCA9IHRzaXplOworICBtLT5tYWdpYyA9IG1wYXJhbXMubWFnaWM7CisgIG0tPm1mbGFncyA9IG1wYXJhbXMuZGVmYXVsdF9tZmxhZ3M7CisgIGRpc2FibGVfY29udGlndW91cyhtKTsKKyAgaW5pdF9iaW5zKG0pOworICBtbiA9IG5leHRfY2h1bmsobWVtMmNodW5rKG0pKTsKKyAgaW5pdF90b3AobSwgbW4sIChzaXplX3QpKCh0YmFzZSArIHRzaXplKSAtIChjaGFyKiltbikgLSBUT1BfRk9PVF9TSVpFKTsKKyAgY2hlY2tfdG9wX2NodW5rKG0sIG0tPnRvcCk7CisgIHJldHVybiBtOworfQorCittc3BhY2UgY3JlYXRlX21zcGFjZShzaXplX3QgY2FwYWNpdHksIGludCBsb2NrZWQpIHsKKyAgbXN0YXRlIG0gPSAwOworICBzaXplX3QgbXNpemUgPSBwYWRfcmVxdWVzdChzaXplb2Yoc3RydWN0IG1hbGxvY19zdGF0ZSkpOworICBpbml0X21wYXJhbXMoKTsgLyogRW5zdXJlIHBhZ2VzaXplIGV0YyBpbml0aWFsaXplZCAqLworCisgIGlmIChjYXBhY2l0eSA8IChzaXplX3QpIC0obXNpemUgKyBUT1BfRk9PVF9TSVpFICsgbXBhcmFtcy5wYWdlX3NpemUpKSB7CisgICAgc2l6ZV90IHJzID0gKChjYXBhY2l0eSA9PSAwKT8gbXBhcmFtcy5ncmFudWxhcml0eSA6CisgICAgICAgICAgICAgICAgIChjYXBhY2l0eSArIFRPUF9GT09UX1NJWkUgKyBtc2l6ZSkpOworICAgIHNpemVfdCB0c2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKHJzKTsKKyAgICBjaGFyKiB0YmFzZSA9IChjaGFyKikoQ0FMTF9NTUFQKHRzaXplKSk7CisgICAgaWYgKHRiYXNlICE9IENNRkFJTCkgeworICAgICAgbSA9IGluaXRfdXNlcl9tc3RhdGUodGJhc2UsIHRzaXplKTsKKyAgICAgIG0tPnNlZy5zZmxhZ3MgPSBJU19NTUFQUEVEX0JJVDsKKyAgICAgIHNldF9sb2NrKG0sIGxvY2tlZCk7CisgICAgfQorICB9CisgIHJldHVybiAobXNwYWNlKW07Cit9CisKK21zcGFjZSBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZSh2b2lkKiBiYXNlLCBzaXplX3QgY2FwYWNpdHksIGludCBsb2NrZWQpIHsKKyAgbXN0YXRlIG0gPSAwOworICBzaXplX3QgbXNpemUgPSBwYWRfcmVxdWVzdChzaXplb2Yoc3RydWN0IG1hbGxvY19zdGF0ZSkpOworICBpbml0X21wYXJhbXMoKTsgLyogRW5zdXJlIHBhZ2VzaXplIGV0YyBpbml0aWFsaXplZCAqLworCisgIGlmIChjYXBhY2l0eSA+IG1zaXplICsgVE9QX0ZPT1RfU0laRSAmJgorICAgICAgY2FwYWNpdHkgPCAoc2l6ZV90KSAtKG1zaXplICsgVE9QX0ZPT1RfU0laRSArIG1wYXJhbXMucGFnZV9zaXplKSkgeworICAgIG0gPSBpbml0X3VzZXJfbXN0YXRlKChjaGFyKiliYXNlLCBjYXBhY2l0eSk7CisgICAgbS0+c2VnLnNmbGFncyA9IEVYVEVSTl9CSVQ7CisgICAgc2V0X2xvY2sobSwgbG9ja2VkKTsKKyAgfQorICByZXR1cm4gKG1zcGFjZSltOworfQorCitzaXplX3QgZGVzdHJveV9tc3BhY2UobXNwYWNlIG1zcCkgeworICBzaXplX3QgZnJlZWQgPSAwOworICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKKyAgaWYgKG9rX21hZ2ljKG1zKSkgeworICAgIG1zZWdtZW50cHRyIHNwID0gJm1zLT5zZWc7CisgICAgd2hpbGUgKHNwICE9IDApIHsKKyAgICAgIGNoYXIqIGJhc2UgPSBzcC0+YmFzZTsKKyAgICAgIHNpemVfdCBzaXplID0gc3AtPnNpemU7CisgICAgICBmbGFnX3QgZmxhZyA9IHNwLT5zZmxhZ3M7CisgICAgICBzcCA9IHNwLT5uZXh0OworICAgICAgaWYgKChmbGFnICYgSVNfTU1BUFBFRF9CSVQpICYmICEoZmxhZyAmIEVYVEVSTl9CSVQpICYmCisgICAgICAgICAgQ0FMTF9NVU5NQVAoYmFzZSwgc2l6ZSkgPT0gMCkKKyAgICAgICAgZnJlZWQgKz0gc2l6ZTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKKyAgfQorICByZXR1cm4gZnJlZWQ7Cit9CisKKy8qCisgIG1zcGFjZSB2ZXJzaW9ucyBvZiByb3V0aW5lcyBhcmUgbmVhci1jbG9uZXMgb2YgdGhlIGdsb2JhbAorICB2ZXJzaW9ucy4gVGhpcyBpcyBub3Qgc28gbmljZSBidXQgYmV0dGVyIHRoYW4gdGhlIGFsdGVybmF0aXZlcy4KKyovCisKKwordm9pZCogbXNwYWNlX21hbGxvYyhtc3BhY2UgbXNwLCBzaXplX3QgYnl0ZXMpIHsKKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisgIGlmICghb2tfbWFnaWMobXMpKSB7CisgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIVBSRUFDVElPTihtcykpIHsKKyAgICB2b2lkKiBtZW07CisgICAgc2l6ZV90IG5iOworICAgIGlmIChieXRlcyA8PSBNQVhfU01BTExfUkVRVUVTVCkgeworICAgICAgYmluZGV4X3QgaWR4OworICAgICAgYmlubWFwX3Qgc21hbGxiaXRzOworICAgICAgbmIgPSAoYnl0ZXMgPCBNSU5fUkVRVUVTVCk/IE1JTl9DSFVOS19TSVpFIDogcGFkX3JlcXVlc3QoYnl0ZXMpOworICAgICAgaWR4ID0gc21hbGxfaW5kZXgobmIpOworICAgICAgc21hbGxiaXRzID0gbXMtPnNtYWxsbWFwID4+IGlkeDsKKworICAgICAgaWYgKChzbWFsbGJpdHMgJiAweDNVKSAhPSAwKSB7IC8qIFJlbWFpbmRlcmxlc3MgZml0IHRvIGEgc21hbGxiaW4uICovCisgICAgICAgIG1jaHVua3B0ciBiLCBwOworICAgICAgICBpZHggKz0gfnNtYWxsYml0cyAmIDE7ICAgICAgIC8qIFVzZXMgbmV4dCBiaW4gaWYgaWR4IGVtcHR5ICovCisgICAgICAgIGIgPSBzbWFsbGJpbl9hdChtcywgaWR4KTsKKyAgICAgICAgcCA9IGItPmZkOworICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHApID09IHNtYWxsX2luZGV4MnNpemUoaWR4KSk7CisgICAgICAgIHVubGlua19maXJzdF9zbWFsbF9jaHVuayhtcywgYiwgcCwgaWR4KTsKKyAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobXMsIHAsIHNtYWxsX2luZGV4MnNpemUoaWR4KSk7CisgICAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKKyAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobXMsIG1lbSwgbmIpOworICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKG5iID4gbXMtPmR2c2l6ZSkgeworICAgICAgICBpZiAoc21hbGxiaXRzICE9IDApIHsgLyogVXNlIGNodW5rIGluIG5leHQgbm9uZW1wdHkgc21hbGxiaW4gKi8KKyAgICAgICAgICBtY2h1bmtwdHIgYiwgcCwgcjsKKyAgICAgICAgICBzaXplX3QgcnNpemU7CisgICAgICAgICAgYmluZGV4X3QgaTsKKyAgICAgICAgICBiaW5tYXBfdCBsZWZ0Yml0cyA9IChzbWFsbGJpdHMgPDwgaWR4KSAmIGxlZnRfYml0cyhpZHgyYml0KGlkeCkpOworICAgICAgICAgIGJpbm1hcF90IGxlYXN0Yml0ID0gbGVhc3RfYml0KGxlZnRiaXRzKTsKKyAgICAgICAgICBjb21wdXRlX2JpdDJpZHgobGVhc3RiaXQsIGkpOworICAgICAgICAgIGIgPSBzbWFsbGJpbl9hdChtcywgaSk7CisgICAgICAgICAgcCA9IGItPmZkOworICAgICAgICAgIGFzc2VydChjaHVua3NpemUocCkgPT0gc21hbGxfaW5kZXgyc2l6ZShpKSk7CisgICAgICAgICAgdW5saW5rX2ZpcnN0X3NtYWxsX2NodW5rKG1zLCBiLCBwLCBpKTsKKyAgICAgICAgICByc2l6ZSA9IHNtYWxsX2luZGV4MnNpemUoaSkgLSBuYjsKKyAgICAgICAgICAvKiBGaXQgaGVyZSBjYW5ub3QgYmUgcmVtYWluZGVybGVzcyBpZiA0Ynl0ZSBzaXplcyAqLworICAgICAgICAgIGlmIChTSVpFX1RfU0laRSAhPSA0ICYmIHJzaXplIDwgTUlOX0NIVU5LX1NJWkUpCisgICAgICAgICAgICBzZXRfaW51c2VfYW5kX3BpbnVzZShtcywgcCwgc21hbGxfaW5kZXgyc2l6ZShpKSk7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG1zLCBwLCBuYik7CisgICAgICAgICAgICByID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHIsIHJzaXplKTsKKyAgICAgICAgICAgIHJlcGxhY2VfZHYobXMsIHIsIHJzaXplKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVtID0gY2h1bmsybWVtKHApOworICAgICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKG1zLCBtZW0sIG5iKTsKKyAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmIChtcy0+dHJlZW1hcCAhPSAwICYmIChtZW0gPSB0bWFsbG9jX3NtYWxsKG1zLCBuYikpICE9IDApIHsKKyAgICAgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7CisgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzID49IE1BWF9SRVFVRVNUKQorICAgICAgbmIgPSBNQVhfU0laRV9UOyAvKiBUb28gYmlnIHRvIGFsbG9jYXRlLiBGb3JjZSBmYWlsdXJlIChpbiBzeXMgYWxsb2MpICovCisgICAgZWxzZSB7CisgICAgICBuYiA9IHBhZF9yZXF1ZXN0KGJ5dGVzKTsKKyAgICAgIGlmIChtcy0+dHJlZW1hcCAhPSAwICYmIChtZW0gPSB0bWFsbG9jX2xhcmdlKG1zLCBuYikpICE9IDApIHsKKyAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobXMsIG1lbSwgbmIpOworICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5iIDw9IG1zLT5kdnNpemUpIHsKKyAgICAgIHNpemVfdCByc2l6ZSA9IG1zLT5kdnNpemUgLSBuYjsKKyAgICAgIG1jaHVua3B0ciBwID0gbXMtPmR2OworICAgICAgaWYgKHJzaXplID49IE1JTl9DSFVOS19TSVpFKSB7IC8qIHNwbGl0IGR2ICovCisgICAgICAgIG1jaHVua3B0ciByID0gbXMtPmR2ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgICBtcy0+ZHZzaXplID0gcnNpemU7CisgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7CisgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobXMsIHAsIG5iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeyAvKiBleGhhdXN0IGR2ICovCisgICAgICAgIHNpemVfdCBkdnMgPSBtcy0+ZHZzaXplOworICAgICAgICBtcy0+ZHZzaXplID0gMDsKKyAgICAgICAgbXMtPmR2ID0gMDsKKyAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobXMsIHAsIGR2cyk7CisgICAgICB9CisgICAgICBtZW0gPSBjaHVuazJtZW0ocCk7CisgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7CisgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgfQorCisgICAgZWxzZSBpZiAobmIgPCBtcy0+dG9wc2l6ZSkgeyAvKiBTcGxpdCB0b3AgKi8KKyAgICAgIHNpemVfdCByc2l6ZSA9IG1zLT50b3BzaXplIC09IG5iOworICAgICAgbWNodW5rcHRyIHAgPSBtcy0+dG9wOworICAgICAgbWNodW5rcHRyIHIgPSBtcy0+dG9wID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgci0+aGVhZCA9IHJzaXplIHwgUElOVVNFX0JJVDsKKyAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobXMsIHAsIG5iKTsKKyAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKKyAgICAgIGNoZWNrX3RvcF9jaHVuayhtcywgbXMtPnRvcCk7CisgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7CisgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgfQorCisgICAgbWVtID0gc3lzX2FsbG9jKG1zLCBuYik7CisKKyAgcG9zdGFjdGlvbjoKKyAgICBQT1NUQUNUSU9OKG1zKTsKKyAgICByZXR1cm4gbWVtOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXNwYWNlX2ZyZWUobXNwYWNlIG1zcCwgdm9pZCogbWVtKSB7CisgIGlmIChtZW0gIT0gMCkgeworICAgIG1jaHVua3B0ciBwICA9IG1lbTJjaHVuayhtZW0pOworI2lmIEZPT1RFUlMKKyAgICBtc3RhdGUgZm0gPSBnZXRfbXN0YXRlX2ZvcihwKTsKKyNlbHNlIC8qIEZPT1RFUlMgKi8KKyAgICBtc3RhdGUgZm0gPSAobXN0YXRlKW1zcDsKKyNlbmRpZiAvKiBGT09URVJTICovCisgICAgaWYgKCFva19tYWdpYyhmbSkpIHsKKyAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihmbSwgcCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghUFJFQUNUSU9OKGZtKSkgeworICAgICAgY2hlY2tfaW51c2VfY2h1bmsoZm0sIHApOworICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcCkgJiYgb2tfY2ludXNlKHApKSkgeworICAgICAgICBzaXplX3QgcHNpemUgPSBjaHVua3NpemUocCk7CisgICAgICAgIG1jaHVua3B0ciBuZXh0ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgcHNpemUpOworICAgICAgICBpZiAoIXBpbnVzZShwKSkgeworICAgICAgICAgIHNpemVfdCBwcmV2c2l6ZSA9IHAtPnByZXZfZm9vdDsKKyAgICAgICAgICBpZiAoKHByZXZzaXplICYgSVNfTU1BUFBFRF9CSVQpICE9IDApIHsKKyAgICAgICAgICAgIHByZXZzaXplICY9IH5JU19NTUFQUEVEX0JJVDsKKyAgICAgICAgICAgIHBzaXplICs9IHByZXZzaXplICsgTU1BUF9GT09UX1BBRDsKKyAgICAgICAgICAgIGlmIChDQUxMX01VTk1BUCgoY2hhciopcCAtIHByZXZzaXplLCBwc2l6ZSkgPT0gMCkKKyAgICAgICAgICAgICAgZm0tPmZvb3RwcmludCAtPSBwc2l6ZTsKKyAgICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtY2h1bmtwdHIgcHJldiA9IGNodW5rX21pbnVzX29mZnNldChwLCBwcmV2c2l6ZSk7CisgICAgICAgICAgICBwc2l6ZSArPSBwcmV2c2l6ZTsKKyAgICAgICAgICAgIHAgPSBwcmV2OworICAgICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcHJldikpKSB7IC8qIGNvbnNvbGlkYXRlIGJhY2t3YXJkICovCisgICAgICAgICAgICAgIGlmIChwICE9IGZtLT5kdikgeworICAgICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgcCwgcHJldnNpemUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKChuZXh0LT5oZWFkICYgSU5VU0VfQklUUykgPT0gSU5VU0VfQklUUykgeworICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSBwc2l6ZTsKKyAgICAgICAgICAgICAgICBzZXRfZnJlZV93aXRoX3BpbnVzZShwLCBwc2l6ZSwgbmV4dCk7CisgICAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGdvdG8gZXJyb3JhY3Rpb247CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFJUQ0hFQ0sob2tfbmV4dChwLCBuZXh0KSAmJiBva19waW51c2UobmV4dCkpKSB7CisgICAgICAgICAgaWYgKCFjaW51c2UobmV4dCkpIHsgIC8qIGNvbnNvbGlkYXRlIGZvcndhcmQgKi8KKyAgICAgICAgICAgIGlmIChuZXh0ID09IGZtLT50b3ApIHsKKyAgICAgICAgICAgICAgc2l6ZV90IHRzaXplID0gZm0tPnRvcHNpemUgKz0gcHNpemU7CisgICAgICAgICAgICAgIGZtLT50b3AgPSBwOworICAgICAgICAgICAgICBwLT5oZWFkID0gdHNpemUgfCBQSU5VU0VfQklUOworICAgICAgICAgICAgICBpZiAocCA9PSBmbS0+ZHYpIHsKKyAgICAgICAgICAgICAgICBmbS0+ZHYgPSAwOworICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSAwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzaG91bGRfdHJpbShmbSwgdHNpemUpKQorICAgICAgICAgICAgICAgIHN5c190cmltKGZtLCAwKTsKKyAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PSBmbS0+ZHYpIHsKKyAgICAgICAgICAgICAgc2l6ZV90IGRzaXplID0gZm0tPmR2c2l6ZSArPSBwc2l6ZTsKKyAgICAgICAgICAgICAgZm0tPmR2ID0gcDsKKyAgICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHAsIGRzaXplKTsKKyAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHNpemVfdCBuc2l6ZSA9IGNodW5rc2l6ZShuZXh0KTsKKyAgICAgICAgICAgICAgcHNpemUgKz0gbnNpemU7CisgICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgbmV4dCwgbnNpemUpOworICAgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgcHNpemUpOworICAgICAgICAgICAgICBpZiAocCA9PSBmbS0+ZHYpIHsKKyAgICAgICAgICAgICAgICBmbS0+ZHZzaXplID0gcHNpemU7CisgICAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldF9mcmVlX3dpdGhfcGludXNlKHAsIHBzaXplLCBuZXh0KTsKKyAgICAgICAgICBpbnNlcnRfY2h1bmsoZm0sIHAsIHBzaXplKTsKKyAgICAgICAgICBjaGVja19mcmVlX2NodW5rKGZtLCBwKTsKKyAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBlcnJvcmFjdGlvbjoKKyAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihmbSwgcCk7CisgICAgcG9zdGFjdGlvbjoKKyAgICAgIFBPU1RBQ1RJT04oZm0pOworICAgIH0KKyAgfQorfQorCit2b2lkKiBtc3BhY2VfY2FsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBuX2VsZW1lbnRzLCBzaXplX3QgZWxlbV9zaXplKSB7CisgIHZvaWQqIG1lbTsKKyAgc2l6ZV90IHJlcSA9IDA7CisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOworICBpZiAoIW9rX21hZ2ljKG1zKSkgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG5fZWxlbWVudHMgIT0gMCkgeworICAgIHJlcSA9IG5fZWxlbWVudHMgKiBlbGVtX3NpemU7CisgICAgaWYgKCgobl9lbGVtZW50cyB8IGVsZW1fc2l6ZSkgJiB+KHNpemVfdCkweGZmZmYpICYmCisgICAgICAgIChyZXEgLyBuX2VsZW1lbnRzICE9IGVsZW1fc2l6ZSkpCisgICAgICByZXEgPSBNQVhfU0laRV9UOyAvKiBmb3JjZSBkb3duc3RyZWFtIGZhaWx1cmUgb24gb3ZlcmZsb3cgKi8KKyAgfQorICBtZW0gPSBpbnRlcm5hbF9tYWxsb2MobXMsIHJlcSk7CisgIGlmIChtZW0gIT0gMCAmJiBjYWxsb2NfbXVzdF9jbGVhcihtZW0yY2h1bmsobWVtKSkpCisgICAgbWVtc2V0KG1lbSwgMCwgcmVxKTsKKyAgcmV0dXJuIG1lbTsKK30KKwordm9pZCogbXNwYWNlX3JlYWxsb2MobXNwYWNlIG1zcCwgdm9pZCogb2xkbWVtLCBzaXplX3QgYnl0ZXMpIHsKKyAgaWYgKG9sZG1lbSA9PSAwKQorICAgIHJldHVybiBtc3BhY2VfbWFsbG9jKG1zcCwgYnl0ZXMpOworI2lmZGVmIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUworICBpZiAoYnl0ZXMgPT0gMCkgeworICAgIG1zcGFjZV9mcmVlKG1zcCwgb2xkbWVtKTsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmIC8qIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyAqLworICBlbHNlIHsKKyNpZiBGT09URVJTCisgICAgbWNodW5rcHRyIHAgID0gbWVtMmNodW5rKG9sZG1lbSk7CisgICAgbXN0YXRlIG1zID0gZ2V0X21zdGF0ZV9mb3IocCk7CisjZWxzZSAvKiBGT09URVJTICovCisgICAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisjZW5kaWYgLyogRk9PVEVSUyAqLworICAgIGlmICghb2tfbWFnaWMobXMpKSB7CisgICAgICBVU0FHRV9FUlJPUl9BQ1RJT04obXMsbXMpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBpbnRlcm5hbF9yZWFsbG9jKG1zLCBvbGRtZW0sIGJ5dGVzKTsKKyAgfQorfQorCit2b2lkKiBtc3BhY2VfbWVtYWxpZ24obXNwYWNlIG1zcCwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IGJ5dGVzKSB7CisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOworICBpZiAoIW9rX21hZ2ljKG1zKSkgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGludGVybmFsX21lbWFsaWduKG1zLCBhbGlnbm1lbnQsIGJ5dGVzKTsKK30KKwordm9pZCoqIG1zcGFjZV9pbmRlcGVuZGVudF9jYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZWxlbV9zaXplLCB2b2lkKiBjaHVua3NbXSkgeworICBzaXplX3Qgc3ogPSBlbGVtX3NpemU7IC8qIHNlcnZlcyBhcyAxLWVsZW1lbnQgYXJyYXkgKi8KKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisgIGlmICghb2tfbWFnaWMobXMpKSB7CisgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gaWFsbG9jKG1zLCBuX2VsZW1lbnRzLCAmc3osIDMsIGNodW5rcyk7Cit9CisKK3ZvaWQqKiBtc3BhY2VfaW5kZXBlbmRlbnRfY29tYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplc1tdLCB2b2lkKiBjaHVua3NbXSkgeworICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKKyAgaWYgKCFva19tYWdpYyhtcykpIHsKKyAgICBVU0FHRV9FUlJPUl9BQ1RJT04obXMsbXMpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBpYWxsb2MobXMsIG5fZWxlbWVudHMsIHNpemVzLCAwLCBjaHVua3MpOworfQorCitpbnQgbXNwYWNlX3RyaW0obXNwYWNlIG1zcCwgc2l6ZV90IHBhZCkgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisgIGlmIChva19tYWdpYyhtcykpIHsKKyAgICBpZiAoIVBSRUFDVElPTihtcykpIHsKKyAgICAgIHJlc3VsdCA9IHN5c190cmltKG1zLCBwYWQpOworICAgICAgUE9TVEFDVElPTihtcyk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBtc3BhY2VfbWFsbG9jX3N0YXRzKG1zcGFjZSBtc3ApIHsKKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisgIGlmIChva19tYWdpYyhtcykpIHsKKyAgICBpbnRlcm5hbF9tYWxsb2Nfc3RhdHMobXMpOworICB9CisgIGVsc2UgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgIH0KK30KKworc2l6ZV90IG1zcGFjZV9mb290cHJpbnQobXNwYWNlIG1zcCkgeworICBzaXplX3QgcmVzdWx0OworICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKKyAgaWYgKG9rX21hZ2ljKG1zKSkgeworICAgIHJlc3VsdCA9IG1zLT5mb290cHJpbnQ7CisgIH0KKyAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzaXplX3QgbXNwYWNlX21heF9mb290cHJpbnQobXNwYWNlIG1zcCkgeworICBzaXplX3QgcmVzdWx0OworICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKKyAgaWYgKG9rX21hZ2ljKG1zKSkgeworICAgIHJlc3VsdCA9IG1zLT5tYXhfZm9vdHByaW50OworICB9CisgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworI2lmICFOT19NQUxMSU5GTworc3RydWN0IG1hbGxpbmZvIG1zcGFjZV9tYWxsaW5mbyhtc3BhY2UgbXNwKSB7CisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOworICBpZiAoIW9rX21hZ2ljKG1zKSkgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgIH0KKyAgcmV0dXJuIGludGVybmFsX21hbGxpbmZvKG1zKTsKK30KKyNlbmRpZiAvKiBOT19NQUxMSU5GTyAqLworCitpbnQgbXNwYWNlX21hbGxvcHQoaW50IHBhcmFtX251bWJlciwgaW50IHZhbHVlKSB7CisgIHJldHVybiBjaGFuZ2VfbXBhcmFtKHBhcmFtX251bWJlciwgdmFsdWUpOworfQorCisjZW5kaWYgLyogTVNQQUNFUyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBBbHRlcm5hdGl2ZSBNT1JFQ09SRSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICBHdWlkZWxpbmVzIGZvciBjcmVhdGluZyBhIGN1c3RvbSB2ZXJzaW9uIG9mIE1PUkVDT1JFOgorCisgICogRm9yIGJlc3QgcGVyZm9ybWFuY2UsIE1PUkVDT1JFIHNob3VsZCBhbGxvY2F0ZSBpbiBtdWx0aXBsZXMgb2YgcGFnZXNpemUuCisgICogTU9SRUNPUkUgbWF5IGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gcmVxdWVzdGVkLiAoT3IgZXZlbiBsZXNzLAorICAgICAgYnV0IHRoaXMgd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhIG1hbGxvYyBmYWlsdXJlLikKKyAgKiBNT1JFQ09SRSBtdXN0IG5vdCBhbGxvY2F0ZSBtZW1vcnkgd2hlbiBnaXZlbiBhcmd1bWVudCB6ZXJvLCBidXQKKyAgICAgIGluc3RlYWQgcmV0dXJuIG9uZSBwYXN0IHRoZSBlbmQgYWRkcmVzcyBvZiBtZW1vcnkgZnJvbSBwcmV2aW91cworICAgICAgbm9uemVybyBjYWxsLgorICAqIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBjb25zZWN1dGl2ZSBjYWxscyB0byBNT1JFQ09SRSB3aXRoIHBvc2l0aXZlCisgICAgICBhcmd1bWVudHMgc2hvdWxkIHJldHVybiBpbmNyZWFzaW5nIGFkZHJlc3NlcywgaW5kaWNhdGluZyB0aGF0CisgICAgICBzcGFjZSBoYXMgYmVlbiBjb250aWd1b3VzbHkgZXh0ZW5kZWQuCisgICogRXZlbiB0aG91Z2ggY29uc2VjdXRpdmUgY2FsbHMgdG8gTU9SRUNPUkUgbmVlZCBub3QgcmV0dXJuIGNvbnRpZ3VvdXMKKyAgICAgIGFkZHJlc3NlcywgaXQgbXVzdCBiZSBPSyBmb3IgbWFsbG9jJ2VkIGNodW5rcyB0byBzcGFuIG11bHRpcGxlCisgICAgICByZWdpb25zIGluIHRob3NlIGNhc2VzIHdoZXJlIHRoZXkgZG8gaGFwcGVuIHRvIGJlIGNvbnRpZ3VvdXMuCisgICogTU9SRUNPUkUgbmVlZCBub3QgaGFuZGxlIG5lZ2F0aXZlIGFyZ3VtZW50cyAtLSBpdCBtYXkgaW5zdGVhZAorICAgICAganVzdCByZXR1cm4gTUZBSUwgd2hlbiBnaXZlbiBuZWdhdGl2ZSBhcmd1bWVudHMuCisgICAgICBOZWdhdGl2ZSBhcmd1bWVudHMgYXJlIGFsd2F5cyBtdWx0aXBsZXMgb2YgcGFnZXNpemUuIE1PUkVDT1JFCisgICAgICBtdXN0IG5vdCBtaXNpbnRlcnByZXQgbmVnYXRpdmUgYXJncyBhcyBsYXJnZSBwb3NpdGl2ZSB1bnNpZ25lZAorICAgICAgYXJncy4gWW91IGNhbiBzdXBwcmVzcyBhbGwgc3VjaCBjYWxscyBmcm9tIGV2ZW4gb2NjdXJyaW5nIGJ5IGRlZmluaW5nCisgICAgICBNT1JFQ09SRV9DQU5OT1RfVFJJTSwKKworICBBcyBhbiBleGFtcGxlIGFsdGVybmF0aXZlIE1PUkVDT1JFLCBoZXJlIGlzIGEgY3VzdG9tIGFsbG9jYXRvcgorICBraW5kbHkgY29udHJpYnV0ZWQgZm9yIHByZS1PU1ggbWFjT1MuICBJdCB1c2VzIHZpcnR1YWxseSBidXQgbm90CisgIG5lY2Vzc2FyaWx5IHBoeXNpY2FsbHkgY29udGlndW91cyBub24tcGFnZWQgbWVtb3J5IChsb2NrZWQgaW4sCisgIHByZXNlbnQgYW5kIHdvbid0IGdldCBzd2FwcGVkIG91dCkuICBZb3UgY2FuIHVzZSBpdCBieSB1bmNvbW1lbnRpbmcKKyAgdGhpcyBzZWN0aW9uLCBhZGRpbmcgc29tZSAjaW5jbHVkZXMsIGFuZCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZQorICBkZWZpbmVzIGFib3ZlOgorCisgICAgICAjZGVmaW5lIE1PUkVDT1JFIG9zTW9yZUNvcmUKKworICBUaGVyZSBpcyBhbHNvIGEgc2h1dGRvd24gcm91dGluZSB0aGF0IHNob3VsZCBzb21laG93IGJlIGNhbGxlZCBmb3IKKyAgY2xlYW51cCB1cG9uIHByb2dyYW0gZXhpdC4KKworICAjZGVmaW5lIE1BWF9QT09MX0VOVFJJRVMgMTAwCisgICNkZWZpbmUgTUlOSU1VTV9NT1JFQ09SRV9TSVpFICAoNjQgKiAxMDI0VSkKKyAgc3RhdGljIGludCBuZXh0X29zX3Bvb2w7CisgIHZvaWQgKm91cl9vc19wb29sc1tNQVhfUE9PTF9FTlRSSUVTXTsKKworICB2b2lkICpvc01vcmVDb3JlKGludCBzaXplKQorICB7CisgICAgdm9pZCAqcHRyID0gMDsKKyAgICBzdGF0aWMgdm9pZCAqc2Jya190b3AgPSAwOworCisgICAgaWYgKHNpemUgPiAwKQorICAgIHsKKyAgICAgIGlmIChzaXplIDwgTUlOSU1VTV9NT1JFQ09SRV9TSVpFKQorICAgICAgICAgc2l6ZSA9IE1JTklNVU1fTU9SRUNPUkVfU0laRTsKKyAgICAgIGlmIChDdXJyZW50RXhlY3V0aW9uTGV2ZWwoKSA9PSBrVGFza0xldmVsKQorICAgICAgICAgcHRyID0gUG9vbEFsbG9jYXRlUmVzaWRlbnQoc2l6ZSArIFJNX1BBR0VfU0laRSwgMCk7CisgICAgICBpZiAocHRyID09IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAodm9pZCAqKSBNRkFJTDsKKyAgICAgIH0KKyAgICAgIC8vIHNhdmUgcHRycyBzbyB0aGV5IGNhbiBiZSBmcmVlZCBkdXJpbmcgY2xlYW51cAorICAgICAgb3VyX29zX3Bvb2xzW25leHRfb3NfcG9vbF0gPSBwdHI7CisgICAgICBuZXh0X29zX3Bvb2wrKzsKKyAgICAgIHB0ciA9ICh2b2lkICopICgoKChzaXplX3QpIHB0cikgKyBSTV9QQUdFX01BU0spICYgflJNX1BBR0VfTUFTSyk7CisgICAgICBzYnJrX3RvcCA9IChjaGFyICopIHB0ciArIHNpemU7CisgICAgICByZXR1cm4gcHRyOworICAgIH0KKyAgICBlbHNlIGlmIChzaXplIDwgMCkKKyAgICB7CisgICAgICAvLyB3ZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCBzaHJpbmsgYmVoYXZpb3IKKyAgICAgIHJldHVybiAodm9pZCAqKSBNRkFJTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBzYnJrX3RvcDsKKyAgICB9CisgIH0KKworICAvLyBjbGVhbnVwIGFueSBhbGxvY2F0ZWQgbWVtb3J5IHBvb2xzCisgIC8vIGNhbGxlZCBhcyBsYXN0IHRoaW5nIGJlZm9yZSBzaHV0dGluZyBkb3duIGRyaXZlcgorCisgIHZvaWQgb3NDbGVhbnVwTWVtKHZvaWQpCisgIHsKKyAgICB2b2lkICoqcHRyOworCisgICAgZm9yIChwdHIgPSBvdXJfb3NfcG9vbHM7IHB0ciA8ICZvdXJfb3NfcG9vbHNbTUFYX1BPT0xfRU5UUklFU107IHB0cisrKQorICAgICAgaWYgKCpwdHIpCisgICAgICB7CisgICAgICAgICBQb29sRGVhbGxvY2F0ZSgqcHRyKTsKKyAgICAgICAgICpwdHIgPSAwOworICAgICAgfQorICB9CisKKyovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0hpc3Rvcnk6CisgICAgVjIuOC4zIFRodSBTZXAgMjIgMTE6MTY6MzIgMjAwNSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCisgICAgICAqIEFkZCBtYXhfZm9vdHByaW50IGZ1bmN0aW9ucworICAgICAgKiBFbnN1cmUgYWxsIGFwcHJvcHJpYXRlIGxpdGVyYWxzIGFyZSBzaXplX3QKKyAgICAgICogRml4IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHByb2JsZW0gZm9yIHNvbWUgI2RlZmluZSBzZXR0aW5ncworICAgICAgKiBBdm9pZCBjb25jYXRlbmF0aW5nIHNlZ21lbnRzIHdpdGggdGhlIG9uZSBwcm92aWRlZAorICAgICAgICBpbiBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZQorICAgICAgKiBSZW5hbWUgc29tZSB2YXJpYWJsZXMgdG8gYXZvaWQgY29tcGlsZXIgc2hhZG93aW5nIHdhcm5pbmdzCisgICAgICAqIFVzZSBleHBsaWNpdCBsb2NrIGluaXRpYWxpemF0aW9uLgorICAgICAgKiBCZXR0ZXIgaGFuZGxpbmcgb2Ygc2JyayBpbnRlcmZlcmVuY2UuCisgICAgICAqIFNpbXBsaWZ5IGFuZCBmaXggc2VnbWVudCBpbnNlcnRpb24sIHRyaW1taW5nIGFuZCBtc3BhY2VfZGVzdHJveQorICAgICAgKiBSZWluc3RhdGUgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTIG9wdGlvbiBmcm9tIDIuNy54CisgICAgICAqIFRoYW5rcyBlc3BlY2lhbGx5IHRvIERlbm5pcyBGbGFuYWdhbiBmb3IgaGVscCBvbiB0aGVzZS4KKworICAgIFYyLjguMiBTdW4gSnVuIDEyIDE2OjAxOjEwIDIwMDUgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorICAgICAgKiBGaXggbWVtYWxpZ24gYnJhY2UgZXJyb3IuCisKKyAgICBWMi44LjEgV2VkIEp1biAgOCAxNjoxMTo0NiAyMDA1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogRml4IGltcHJvcGVyICNlbmRpZiBuZXN0aW5nIGluIEMrKworICAgICAgKiBBZGQgZXhwbGljaXQgY2FzdHMgbmVlZGVkIGZvciBDKysKKworICAgIFYyLjguMCBNb24gTWF5IDMwIDE0OjA5OjAyIDIwMDUgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorICAgICAgKiBVc2UgdHJlZXMgZm9yIGxhcmdlIGJpbnMKKyAgICAgICogU3VwcG9ydCBtc3BhY2VzCisgICAgICAqIFVzZSBzZWdtZW50cyB0byB1bmlmeSBzYnJrLWJhc2VkIGFuZCBtbWFwLWJhc2VkIHN5c3RlbSBhbGxvY2F0aW9uLAorICAgICAgICByZW1vdmluZyBuZWVkIGZvciBlbXVsYXRpb24gb24gbW9zdCBwbGF0Zm9ybXMgd2l0aG91dCBzYnJrLgorICAgICAgKiBEZWZhdWx0IHNhZmV0eSBjaGVja3MKKyAgICAgICogT3B0aW9uYWwgZm9vdGVyIGNoZWNrcy4gVGhhbmtzIHRvIFdpbGxpYW0gUm9iZXJ0c29uIGZvciB0aGUgaWRlYS4KKyAgICAgICogSW50ZXJuYWwgY29kZSByZWZhY3RvcmluZworICAgICAgKiBJbmNvcnBvcmF0ZSBzdWdnZXN0aW9ucyBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgY2hhbmdlcy4KKyAgICAgICAgVGhhbmtzIHRvIERlbm5pcyBGbGFuYWdhbiwgQ29saW4gUGx1bWIsIE5pYWxsIERvdWdsYXMsCisgICAgICAgIEFhcm9uIEJhY2htYW5uLCAgRW1lcnkgQmVyZ2VyLCBhbmQgb3RoZXJzLgorICAgICAgKiBTcGVlZCB1cCBub24tZmFzdGJpbiBwcm9jZXNzaW5nIGVub3VnaCB0byByZW1vdmUgZmFzdGJpbnMuCisgICAgICAqIFJlbW92ZSB1c2VsZXNzIGNmcmVlKCkgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIgYXBwcy4KKyAgICAgICogUmVtb3ZlIGludGVybmFsIG1lbWNweSwgbWVtc2V0LiBDb21waWxlcnMgaGFuZGxlIGJ1aWx0aW5zIGJldHRlci4KKyAgICAgICogUmVtb3ZlIHNvbWUgb3B0aW9ucyB0aGF0IG5vIG9uZSBldmVyIHVzZWQgYW5kIHJlbmFtZSBvdGhlcnMuCisKKyAgICBWMi43LjIgU2F0IEF1ZyAxNyAwOTowNzozMCAyMDAyICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogRml4IG1hbGxvY19zdGF0ZSBiaXRtYXAgYXJyYXkgbWlzZGVjbGFyYXRpb24KKworICAgIFYyLjcuMSBUaHUgSnVsIDI1IDEwOjU4OjAzIDIwMDIgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorICAgICAgKiBBbGxvdyB0dW5pbmcgb2YgRklSU1RfU09SVEVEX0JJTl9TSVpFCisgICAgICAqIFVzZSBQVFJfVUlOVCBhcyB0eXBlIGZvciBhbGwgcHRyLT5pbnQgY2FzdHMuIFRoYW5rcyB0byBKb2huIEJlbG1vbnRlLgorICAgICAgKiBCZXR0ZXIgZGV0ZWN0aW9uIGFuZCBzdXBwb3J0IGZvciBub24tY29udGlndW91c25lc3Mgb2YgTU9SRUNPUkUuCisgICAgICAgIFRoYW5rcyB0byBBbmRyZWFzIE11ZWxsZXIsIENvbmFsIFdhbHNoLCBhbmQgV29sZnJhbSBHbG9nZXIKKyAgICAgICogQnlwYXNzIG1vc3Qgb2YgbWFsbG9jIGlmIG5vIGZyZWVzLiBUaGFua3MgVG8gRW1lcnkgQmVyZ2VyLgorICAgICAgKiBGaXggZnJlZWluZyBvZiBvbGQgdG9wIG5vbi1jb250aWd1b3VzIGNodW5rIGltIHN5c21hbGxvYy4KKyAgICAgICogUmFpc2VkIGRlZmF1bHQgdHJpbSBhbmQgbWFwIHRocmVzaG9sZHMgdG8gMjU2Sy4KKyAgICAgICogRml4IG1tYXAtcmVsYXRlZCAjZGVmaW5lcy4gVGhhbmtzIHRvIEx1Ym9zIEx1bmFrLgorICAgICAgKiBGaXggY29weSBtYWNyb3M7IGFkZGVkIExBQ0tTX0ZDTlRMX0guIFRoYW5rcyB0byBOZWFsIFdhbGZpZWxkLgorICAgICAgKiBCcmFuY2gtZnJlZSBiaW4gY2FsY3VsYXRpb24KKyAgICAgICogRGVmYXVsdCB0cmltIGFuZCBtbWFwIHRocmVzaG9sZHMgbm93IDI1NksuCisKKyAgICBWMi43LjAgU3VuIE1hciAxMSAxNDoxNDowNiAyMDAxICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogSW50cm9kdWNlIGluZGVwZW5kZW50X2NvbWFsbG9jIGFuZCBpbmRlcGVuZGVudF9jYWxsb2MuCisgICAgICAgIFRoYW5rcyB0byBNaWNoYWVsIFBhY2hvcyBmb3IgbW90aXZhdGlvbiBhbmQgaGVscC4KKyAgICAgICogTWFrZSBvcHRpb25hbCAuaCBmaWxlIGF2YWlsYWJsZQorICAgICAgKiBBbGxvdyA+IDJHQiByZXF1ZXN0cyBvbiAzMmJpdCBzeXN0ZW1zLgorICAgICAgKiBuZXcgV0lOMzIgc2JyaywgbW1hcCwgbXVubWFwLCBsb2NrIGNvZGUgZnJvbSA8V2FsdGVyQEdlTmVTeXMtZS5kZT4uCisgICAgICAgIFRoYW5rcyBhbHNvIHRvIEFuZHJlYXMgTXVlbGxlciA8YS5tdWVsbGVyIGF0IHBhcmFkYXRlYy5kZT4sCisgICAgICAgIGFuZCBBbm9ueW1vdXMuCisgICAgICAqIEFsbG93IG92ZXJyaWRlIG9mIE1BTExPQ19BTElHTk1FTlQgKFRoYW5rcyB0byBSdXVkIFdhaWogZm9yCisgICAgICAgIGhlbHBpbmcgdGVzdCB0aGlzLikKKyAgICAgICogbWVtYWxpZ246IGNoZWNrIGFsaWdubWVudCBhcmcKKyAgICAgICogcmVhbGxvYzogZG9uJ3QgdHJ5IHRvIHNoaWZ0IGNodW5rcyBiYWNrd2FyZHMsIHNpbmNlIHRoaXMKKyAgICAgICAgbGVhZHMgdG8gIG1vcmUgZnJhZ21lbnRhdGlvbiBpbiBzb21lIHByb2dyYW1zIGFuZCBkb2Vzbid0CisgICAgICAgIHNlZW0gdG8gaGVscCBpbiBhbnkgb3RoZXJzLgorICAgICAgKiBDb2xsZWN0IGFsbCBjYXNlcyBpbiBtYWxsb2MgcmVxdWlyaW5nIHN5c3RlbSBtZW1vcnkgaW50byBzeXNtYWxsb2MKKyAgICAgICogVXNlIG1tYXAgYXMgYmFja3VwIHRvIHNicmsKKyAgICAgICogUGxhY2UgYWxsIGludGVybmFsIHN0YXRlIGluIG1hbGxvY19zdGF0ZQorICAgICAgKiBJbnRyb2R1Y2UgZmFzdGJpbnMgKGFsdGhvdWdoIHNpbWlsYXIgdG8gMi41LjEpCisgICAgICAqIE1hbnkgbWlub3IgdHVuaW5ncyBhbmQgY29zbWV0aWMgaW1wcm92ZW1lbnRzCisgICAgICAqIEludHJvZHVjZSBVU0VfUFVCTElDX01BTExPQ19XUkFQUEVSUywgVVNFX01BTExPQ19MT0NLCisgICAgICAqIEludHJvZHVjZSBNQUxMT0NfRkFJTFVSRV9BQ1RJT04sIE1PUkVDT1JFX0NPTlRJR1VPVVMKKyAgICAgICAgVGhhbmtzIHRvIFRvbnkgRS4gQmVubmV0dCA8dGJlbm5ldHRAbnZpZGlhLmNvbT4gYW5kIG90aGVycy4KKyAgICAgICogSW5jbHVkZSBlcnJuby5oIHRvIHN1cHBvcnQgZGVmYXVsdCBmYWlsdXJlIGFjdGlvbi4KKworICAgIFYyLjYuNiBTdW4gRGVjICA1IDA3OjQyOjE5IDE5OTkgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorICAgICAgKiByZXR1cm4gbnVsbCBmb3IgbmVnYXRpdmUgYXJndW1lbnRzCisgICAgICAqIEFkZGVkIFNldmVyYWwgV0lOMzIgY2xlYW51cHMgZnJvbSBNYXJ0aW4gQy4gRm9uZyA8bWNmb25nIGF0IHlhaG9vLmNvbT4KKyAgICAgICAgICogQWRkICdMQUNLU19TWVNfUEFSQU1fSCcgZm9yIHRob3NlIHN5c3RlbXMgd2l0aG91dCAnc3lzL3BhcmFtLmgnCisgICAgICAgICAgKGUuZy4gV0lOMzIgcGxhdGZvcm1zKQorICAgICAgICAgKiBDbGVhbnVwIGhlYWRlciBmaWxlIGluY2x1c2lvbiBmb3IgV0lOMzIgcGxhdGZvcm1zCisgICAgICAgICAqIENsZWFudXAgY29kZSB0byBhdm9pZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyBjb21waWxlciBjb21wbGFpbnRzCisgICAgICAgICAqIEFkZCAnVVNFX0RMX1BSRUZJWCcgdG8gcXVpY2tseSBhbGxvdyBjby1leGlzdGVuY2Ugd2l0aCBleGlzdGluZworICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcworICAgICAgICAgKiBTZXQgJ21hbGxvY19nZXRwYWdlc2l6ZScgZm9yIFdJTjMyIHBsYXRmb3JtcyAobmVlZHMgbW9yZSB3b3JrKQorICAgICAgICAgKiBVc2UgJ2Fzc2VydCcgcmF0aGVyIHRoYW4gJ0FTU0VSVCcgaW4gV0lOMzIgY29kZSB0byBjb25mb3JtIHRvCisgICAgICAgICAgIHVzYWdlIG9mICdhc3NlcnQnIGluIG5vbi1XSU4zMiBjb2RlCisgICAgICAgICAqIEltcHJvdmUgV0lOMzIgJ3NicmsoKScgZW11bGF0aW9uJ3MgJ2ZpbmRSZWdpb24oKScgcm91dGluZSB0bworICAgICAgICAgICBhdm9pZCBpbmZpbml0ZSBsb29wCisgICAgICAqIEFsd2F5cyBjYWxsICdmUkVlKCknIHJhdGhlciB0aGFuICdmcmVlKCknCisKKyAgICBWMi42LjUgV2VkIEp1biAxNyAxNTo1NzozMSAxOTk4ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogRml4ZWQgb3JkZXJpbmcgcHJvYmxlbSB3aXRoIGJvdW5kYXJ5LXN0YW1waW5nCisKKyAgICBWMi42LjMgU3VuIE1heSAxOSAwODoxNzo1OCAxOTk2ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogQWRkZWQgcHZhbGxvYywgYXMgcmVjb21tZW5kZWQgYnkgSC5KLiBMaXUKKyAgICAgICogQWRkZWQgNjRiaXQgcG9pbnRlciBzdXBwb3J0IG1haW5seSBmcm9tIFdvbGZyYW0gR2xvZ2VyCisgICAgICAqIEFkZGVkIGFub255bW91c2x5IGRvbmF0ZWQgV0lOMzIgc2JyayBlbXVsYXRpb24KKyAgICAgICogTWFsbG9jLCBjYWxsb2MsIGdldHBhZ2VzaXplOiBhZGQgb3B0aW1pemF0aW9ucyBmcm9tIFJheW1vbmQgTmlqc3NlbgorICAgICAgKiBtYWxsb2NfZXh0ZW5kX3RvcDogZml4IG1hc2sgZXJyb3IgdGhhdCBjYXVzZWQgd2FzdGFnZSBhZnRlcgorICAgICAgICBmb3JlaWduIHNicmtzCisgICAgICAqIEFkZCBsaW51eCBtcmVtYXAgc3VwcG9ydCBjb2RlIGZyb20gSEogTGl1CisKKyAgICBWMi42LjIgVHVlIERlYyAgNSAwNjo1Mjo1NSAxOTk1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogSW50ZWdyYXRlZCBtb3N0IGRvY3VtZW50YXRpb24gd2l0aCB0aGUgY29kZS4KKyAgICAgICogQWRkIHN1cHBvcnQgZm9yIG1tYXAsIHdpdGggaGVscCBmcm9tCisgICAgICAgIFdvbGZyYW0gR2xvZ2VyIChHbG9nZXJAbHJ6LnVuaS1tdWVuY2hlbi5kZSkuCisgICAgICAqIFVzZSBsYXN0X3JlbWFpbmRlciBpbiBtb3JlIGNhc2VzLgorICAgICAgKiBQYWNrIGJpbnMgdXNpbmcgaWRlYSBmcm9tICBjb2xpbkBueXgxMC5jcy5kdS5lZHUKKyAgICAgICogVXNlIG9yZGVyZWQgYmlucyBpbnN0ZWFkIG9mIGJlc3QtZml0IHRocmVzaGhvbGQKKyAgICAgICogRWxpbWluYXRlIGJsb2NrLWxvY2FsIGRlY2xzIHRvIHNpbXBsaWZ5IHRyYWNpbmcgYW5kIGRlYnVnZ2luZy4KKyAgICAgICogU3VwcG9ydCBhbm90aGVyIGNhc2Ugb2YgcmVhbGxvYyB2aWEgbW92ZSBpbnRvIHRvcAorICAgICAgKiBGaXggZXJyb3Igb2NjdXJpbmcgd2hlbiBpbml0aWFsIHNicmtfYmFzZSBub3Qgd29yZC1hbGlnbmVkLgorICAgICAgKiBSZWx5IG9uIHBhZ2Ugc2l6ZSBmb3IgdW5pdHMgaW5zdGVhZCBvZiBTQlJLX1VOSVQgdG8KKyAgICAgICAgYXZvaWQgc3VycHJpc2VzIGFib3V0IHNicmsgYWxpZ25tZW50IGNvbnZlbnRpb25zLgorICAgICAgKiBBZGQgbWFsbGluZm8sIG1hbGxvcHQuIFRoYW5rcyB0byBSYXltb25kIE5panNzZW4KKyAgICAgICAgKHJheW1vbmRAZXMuZWxlLnR1ZS5ubCkgZm9yIHRoZSBzdWdnZXN0aW9uLgorICAgICAgKiBBZGQgYHBhZCcgYXJndW1lbnQgdG8gbWFsbG9jX3RyaW0gYW5kIHRvcF9wYWQgbWFsbG9wdCBwYXJhbWV0ZXIuCisgICAgICAqIE1vcmUgcHJlY2F1dGlvbnMgZm9yIGNhc2VzIHdoZXJlIG90aGVyIHJvdXRpbmVzIGNhbGwgc2JyaywKKyAgICAgICAgY291cnRlc3kgb2YgV29sZnJhbSBHbG9nZXIgKEdsb2dlckBscnoudW5pLW11ZW5jaGVuLmRlKS4KKyAgICAgICogQWRkZWQgbWFjcm9zIGV0Yy4sIGFsbG93aW5nIHVzZSBpbiBsaW51eCBsaWJjIGZyb20KKyAgICAgICAgSC5KLiBMdSAoaGpsQGdudS5haS5taXQuZWR1KQorICAgICAgKiBJbnZlcnRlZCB0aGlzIGhpc3RvcnkgbGlzdAorCisgICAgVjIuNi4xIFNhdCBEZWMgIDIgMTQ6MTA6NTcgMTk5NSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCisgICAgICAqIFJlLXR1bmVkIGFuZCBmaXhlZCB0byBiZWhhdmUgbW9yZSBuaWNlbHkgd2l0aCBWMi42LjAgY2hhbmdlcy4KKyAgICAgICogUmVtb3ZlZCBhbGwgcHJlYWxsb2NhdGlvbiBjb2RlIHNpbmNlIHVuZGVyIGN1cnJlbnQgc2NoZW1lCisgICAgICAgIHRoZSB3b3JrIHJlcXVpcmVkIHRvIHVuZG8gYmFkIHByZWFsbG9jYXRpb25zIGV4Y2VlZHMKKyAgICAgICAgdGhlIHdvcmsgc2F2ZWQgaW4gZ29vZCBjYXNlcyBmb3IgbW9zdCB0ZXN0IHByb2dyYW1zLgorICAgICAgKiBObyBsb25nZXIgdXNlIHJldHVybiBsaXN0IG9yIHVuY29uc29saWRhdGVkIGJpbnMgc2luY2UKKyAgICAgICAgbm8gc2NoZW1lIHVzaW5nIHRoZW0gY29uc2lzdGVudGx5IG91dHBlcmZvcm1zIHRob3NlIHRoYXQgZG9uJ3QKKyAgICAgICAgZ2l2ZW4gYWJvdmUgY2hhbmdlcy4KKyAgICAgICogVXNlIGJlc3QgZml0IGZvciB2ZXJ5IGxhcmdlIGNodW5rcyB0byBwcmV2ZW50IHNvbWUgd29yc3QtY2FzZXMuCisgICAgICAqIEFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgZGVidWdnaW5nCisKKyAgICBWMi42LjAgU2F0IE5vdiAgNCAwNzowNToyMyAxOTk1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogUmVtb3ZlZCBmb290ZXJzIHdoZW4gY2h1bmtzIGFyZSBpbiB1c2UuIFRoYW5rcyB0bworICAgICAgICBQYXVsIFdpbHNvbiAod2lsc29uQGNzLnRleGFzLmVkdSkgZm9yIHRoZSBzdWdnZXN0aW9uLgorCisgICAgVjIuNS40IFdlZCBOb3YgIDEgMDc6NTQ6NTEgMTk5NSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCisgICAgICAqIEFkZGVkIG1hbGxvY190cmltLCB3aXRoIGhlbHAgZnJvbSBXb2xmcmFtIEdsb2dlcgorICAgICAgICAod21nbG9ARGVudC5NRUQuVW5pLU11ZW5jaGVuLkRFKS4KKworICAgIFYyLjUuMyBUdWUgQXByIDI2IDEwOjE2OjAxIDE5OTQgIERvdWcgTGVhICAoZGwgYXQgZykKKworICAgIFYyLjUuMiBUdWUgQXByICA1IDE2OjIwOjQwIDE5OTQgIERvdWcgTGVhICAoZGwgYXQgZykKKyAgICAgICogcmVhbGxvYzogdHJ5IHRvIGV4cGFuZCBpbiBib3RoIGRpcmVjdGlvbnMKKyAgICAgICogbWFsbG9jOiBzd2FwIG9yZGVyIG9mIGNsZWFuLWJpbiBzdHJhdGVneTsKKyAgICAgICogcmVhbGxvYzogb25seSBjb25kaXRpb25hbGx5IGV4cGFuZCBiYWNrd2FyZHMKKyAgICAgICogVHJ5IG5vdCB0byBzY2F2ZW5nZSB1c2VkIGJpbnMKKyAgICAgICogVXNlIGJpbiBjb3VudHMgYXMgYSBndWlkZSB0byBwcmVhbGxvY2F0aW9uCisgICAgICAqIE9jY2FzaW9uYWxseSBiaW4gcmV0dXJuIGxpc3QgY2h1bmtzIGluIGZpcnN0IHNjYW4KKyAgICAgICogQWRkIGEgZmV3IG9wdGltaXphdGlvbnMgZnJvbSBjb2xpbkBueXgxMC5jcy5kdS5lZHUKKworICAgIFYyLjUuMSBTYXQgQXVnIDE0IDE1OjQwOjQzIDE5OTMgIERvdWcgTGVhICAoZGwgYXQgZykKKyAgICAgICogZmFzdGVyIGJpbiBjb21wdXRhdGlvbiAmIHNsaWdodGx5IGRpZmZlcmVudCBiaW5uaW5nCisgICAgICAqIG1lcmdlZCBhbGwgY29uc29saWRhdGlvbnMgdG8gb25lIHBhcnQgb2YgbWFsbG9jIHByb3BlcgorICAgICAgICAgKGVsaW1pbmF0aW5nIG9sZCBtYWxsb2NfZmluZF9zcGFjZSAmIG1hbGxvY19jbGVhbl9iaW4pCisgICAgICAqIFNjYW4gMiByZXR1cm5zIGNodW5rcyAobm90IGp1c3QgMSkKKyAgICAgICogUHJvcGFnYXRlIGZhaWx1cmUgaW4gcmVhbGxvYyBpZiBtYWxsb2MgcmV0dXJucyAwCisgICAgICAqIEFkZCBzdHVmZiB0byBhbGxvdyBjb21waWxhdGlvbiBvbiBub24tQU5TSSBjb21waWxlcnMKKyAgICAgICAgICBmcm9tIGtwdkByZXNlYXJjaC5hdHQuY29tCisKKyAgICBWMi41IFNhdCBBdWcgIDcgMDc6NDE6NTkgMTk5MyAgRG91ZyBMZWEgIChkbCBhdCBnLm9zd2Vnby5lZHUpCisgICAgICAqIHJlbW92ZWQgcG90ZW50aWFsIGZvciBvZGQgYWRkcmVzcyBhY2Nlc3MgaW4gcHJldl9jaHVuaworICAgICAgKiByZW1vdmVkIGRlcGVuZGVuY3kgb24gZ2V0cGFnZXNpemUuaAorICAgICAgKiBtaXNjIGNvc21ldGljcyBhbmQgYSBiaXQgbW9yZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uCisgICAgICAqIGFudGljb3NtZXRpY3M6IG1hbmdsZWQgbmFtZXMgaW4gbWFjcm9zIHRvIGV2YWRlIGRlYnVnZ2VyIHN0cmFuZ2VuZXNzCisgICAgICAqIHRlc3RlZCBvbiBzcGFyYywgaHAtNzAwLCBkZWMtbWlwcywgcnM2MDAwCisgICAgICAgICAgd2l0aCBnY2MgJiBuYXRpdmUgY2MgKGhwLCBkZWMgb25seSkgYWxsb3dpbmcKKyAgICAgICAgICBEZXRsZWZzICYgWm9ybiBjb21wYXJpc29uIHN0dWR5IChpbiBTSUdQTEFOIE5vdGljZXMuKQorCisgICAgVHJpYWwgdmVyc2lvbiBGcmkgQXVnIDI4IDEzOjE0OjI5IDE5OTIgIERvdWcgTGVhICAoZGwgYXQgZy5vc3dlZ28uZWR1KQorICAgICAgKiBCYXNlZCBsb29zZWx5IG9uIGxpYmcrKy0xLjJYIG1hbGxvYy4gKEl0IHJldGFpbnMgc29tZSBvZiB0aGUgb3ZlcmFsbAorICAgICAgICAgc3RydWN0dXJlIG9mIG9sZCB2ZXJzaW9uLCAgYnV0IG1vc3QgZGV0YWlscyBkaWZmZXIuKQorIAorKi8KKworI2VuZGlmIC8qICFIQVZFX01BTExPQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX3Fzb3J0LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3N0ZGxpYi9TRExfcXNvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVhYmVhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX3Fzb3J0LmMKQEAgLTAsMCArMSw0NDMgQEAKKy8qIHFzb3J0LmMKKyAqIChjKSAxOTk4IEdhcmV0aCBNY0NhdWdoYW4KKyAqCisgKiBUaGlzIGlzIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIEMgbGlicmFyeSdzIHxxc29ydCgpfCByb3V0aW5lLgorICoKKyAqIEZlYXR1cmVzOgorICogICAtIE1lZGlhbi1vZi10aHJlZSBwaXZvdGluZyAoYW5kIG1vcmUpCisgKiAgIC0gVHJ1bmNhdGlvbiBhbmQgZmluYWwgcG9saXNoaW5nIGJ5IGEgc2luZ2xlIGluc2VydGlvbiBzb3J0CisgKiAgIC0gRWFybHkgdHJ1bmNhdGlvbiB3aGVuIG5vIHN3YXBzIG5lZWRlZCBpbiBwaXZvdGluZyBzdGVwCisgKiAgIC0gRXhwbGljaXQgcmVjdXJzaW9uLCBndWFyYW50ZWVkIG5vdCB0byBvdmVyZmxvdworICogICAtIEEgZmV3IGxpdHRsZSB3cmlua2xlcyBzdG9sZW4gZnJvbSB0aGUgR05VIHxxc29ydCgpfC4KKyAqICAgLSBzZXBhcmF0ZSBjb2RlIGZvciBub24tYWxpZ25lZCAvIGFsaWduZWQgLyB3b3JkLXNpemUgb2JqZWN0cworICoKKyAqIFRoaXMgY29kZSBtYXkgYmUgcmVwcm9kdWNlZCBmcmVlbHkgcHJvdmlkZWQKKyAqICAgLSB0aGlzIGZpbGUgaXMgcmV0YWluZWQgdW5hbHRlcmVkIGFwYXJ0IGZyb20gbWlub3IKKyAqICAgICBjaGFuZ2VzIGZvciBwb3J0YWJpbGl0eSBhbmQgZWZmaWNpZW5jeQorICogICAtIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhpcyBjb21tZW50CisgKiAgIC0gYW55IGNoYW5nZXMgdGhhdCAqYXJlKiBtYWRlIGFyZSBjbGVhcmx5IGZsYWdnZWQKKyAqICAgLSB0aGUgX0lEIHN0cmluZyBiZWxvdyBpcyBhbHRlcmVkIGJ5IGluc2VydGluZywgYWZ0ZXIKKyAqICAgICB0aGUgZGF0ZSwgdGhlIHN0cmluZyAiIGFsdGVyZWQiIGZvbGxvd2VkIGF0IHlvdXIgb3B0aW9uCisgKiAgICAgYnkgb3RoZXIgbWF0ZXJpYWwuIChFeGNlcHRpb25zOiB5b3UgbWF5IGNoYW5nZSB0aGUgbmFtZQorICogICAgIG9mIHRoZSBleHBvcnRlZCByb3V0aW5lIHdpdGhvdXQgY2hhbmdpbmcgdGhlIElEIHN0cmluZy4KKyAqICAgICBZb3UgbWF5IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBtYWNyb3MgVFJVTkNfKiBhbmQKKyAqICAgICBQSVZPVF9USFJFU0hPTEQgd2l0aG91dCBjaGFuZ2luZyB0aGUgSUQgc3RyaW5nLCBwcm92aWRlZAorICogICAgIHRoZXkgcmVtYWluIGNvbnN0YW50cyB3aXRoIFRSVU5DX25vbmFsaWduZWQsIFRSVU5DX2FsaWduZWQKKyAqICAgICBhbmQgVFJVTkNfd29yZHMvV09SRF9CWVRFUyBiZXR3ZWVuIDggYW5kIDI0LCBhbmQKKyAqICAgICBQSVZPVF9USFJFU0hPTEQgYmV0d2VlbiAzMiBhbmQgMjAwLikKKyAqCisgKiBZb3UgbWF5IHVzZSBpdCBpbiBhbnl0aGluZyB5b3UgbGlrZTsgeW91IG1heSBtYWtlIG1vbmV5CisgKiBvdXQgb2YgaXQ7IHlvdSBtYXkgZGlzdHJpYnV0ZSBpdCBpbiBvYmplY3QgZm9ybSBvciBhcworICogcGFydCBvZiBhbiBleGVjdXRhYmxlIHdpdGhvdXQgaW5jbHVkaW5nIHNvdXJjZSBjb2RlOworICogeW91IGRvbid0IGhhdmUgdG8gY3JlZGl0IG1lLiAoQnV0IGl0IHdvdWxkIGJlIG5pY2UgaWYKKyAqIHlvdSBkaWQuKQorICoKKyAqIElmIHlvdSBmaW5kIHByb2JsZW1zIHdpdGggdGhpcyBjb2RlLCBvciBmaW5kIHdheXMgb2YKKyAqIG1ha2luZyBpdCBzaWduaWZpY2FudGx5IGZhc3RlciwgcGxlYXNlIGxldCBtZSBrbm93IQorICogTXkgZS1tYWlsIGFkZHJlc3MsIHZhbGlkIGFzIG9mIGVhcmx5IDE5OTggYW5kIGNlcnRhaW5seQorICogT0sgZm9yIGF0IGxlYXN0IHRoZSBuZXh0IDE4IG1vbnRocywgaXMKKyAqICAgIGdqbTExQGRwbW1zLmNhbS5hYy51aworICogVGhhbmtzIQorICoKKyAqIEdhcmV0aCBNY0NhdWdoYW4gICBQZXRlcmhvdXNlICAgQ2FtYnJpZGdlICAgMTk5OAorICovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorKi8KKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisKKyNpZmRlZiBhc3NlcnQKKyN1bmRlZiBhc3NlcnQKKyNlbmRpZgorI2RlZmluZSBhc3NlcnQoWCkKKyNpZmRlZiBtYWxsb2MKKyN1bmRlZiBtYWxsb2MKKyNlbmRpZgorI2RlZmluZSBtYWxsb2MJU0RMX21hbGxvYworI2lmZGVmIGZyZWUKKyN1bmRlZiBmcmVlCisjZW5kaWYKKyNkZWZpbmUgZnJlZQlTRExfZnJlZQorI2lmZGVmIG1lbWNweQorI3VuZGVmIG1lbWNweQorI2VuZGlmCisjZGVmaW5lIG1lbWNweQlTRExfbWVtY3B5CisjaWZkZWYgbWVtbW92ZQorI3VuZGVmIG1lbW1vdmUKKyNlbmRpZgorI2RlZmluZSBtZW1tb3ZlCVNETF9tZW1tb3ZlCisjaWZkZWYgcXNvcnQKKyN1bmRlZiBxc29ydAorI2VuZGlmCisjZGVmaW5lIHFzb3J0CVNETF9xc29ydAorCisKKyNpZm5kZWYgSEFWRV9RU09SVAorCitzdGF0aWMgY2hhciBfSURbXT0iPHFzb3J0LmMgZ2ptIDEuMTIgMTk5OC0wMy0xOT4iOworCisvKiBIb3cgbWFueSBieXRlcyBhcmUgdGhlcmUgcGVyIHdvcmQ/IChNdXN0IGJlIGEgcG93ZXIgb2YgMiwKKyAqIGFuZCBtdXN0IGluIGZhY3QgZXF1YWwgc2l6ZW9mKGludCkuKQorICovCisjZGVmaW5lIFdPUkRfQllURVMgc2l6ZW9mKGludCkKKworLyogSG93IGJpZyBkb2VzIG91ciBzdGFjayBuZWVkIHRvIGJlPyBBbnN3ZXI6IG9uZSBlbnRyeSBwZXIKKyAqIGJpdCBpbiBhIHxzaXplX3R8LgorICovCisjZGVmaW5lIFNUQUNLX1NJWkUgKDgqc2l6ZW9mKHNpemVfdCkpCisKKy8qIERpZmZlcmVudCBzaXR1YXRpb25zIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHJlcXVpcmVtZW50cywKKyAqIGFuZCB3ZSBtYWtlIGxpZmUgZXBzaWxvbiBlYXNpZXIgYnkgdXNpbmcgZGlmZmVyZW50IHRydW5jYXRpb24KKyAqIHBvaW50cyBmb3IgdGhlIHRocmVlIGRpZmZlcmVudCBjYXNlcy4KKyAqIFNvIGZhciwgSSBoYXZlIHR1bmVkIFRSVU5DX3dvcmRzIGFuZCBndWVzc2VkIHRoYXQgdGhlIHNhbWUKKyAqIHZhbHVlIG1pZ2h0IHdvcmsgd2VsbCBmb3IgdGhlIG90aGVyIHR3byBjYXNlcy4gT2YgY291cnNlCisgKiB3aGF0IHdvcmtzIHdlbGwgb24gbXkgbWFjaGluZSBtaWdodCB3b3JrIGJhZGx5IG9uIHlvdXJzLgorICovCisjZGVmaW5lIFRSVU5DX25vbmFsaWduZWQJMTIKKyNkZWZpbmUgVFJVTkNfYWxpZ25lZAkJMTIKKyNkZWZpbmUgVFJVTkNfd29yZHMJCTEyKldPUkRfQllURVMJLyogbmIgZGlmZmVyZW50IG1lYW5pbmcgKi8KKworLyogV2UgdXNlIGEgc2ltcGxlIHBpdm90aW5nIGFsZ29yaXRobSBmb3Igc2hvcnRpc2ggc3ViLWFycmF5cworICogYW5kIGEgbW9yZSBjb21wbGljYXRlZCBvbmUgZm9yIGxhcmdlciBvbmVzLiBUaGUgdGhyZXNob2xkCisgKiBpcyBQSVZPVF9USFJFU0hPTEQuCisgKi8KKyNkZWZpbmUgUElWT1RfVEhSRVNIT0xEIDQwCisKK3R5cGVkZWYgc3RydWN0IHsgY2hhciAqIGZpcnN0OyBjaGFyICogbGFzdDsgfSBzdGFja19lbnRyeTsKKyNkZWZpbmUgcHVzaExlZnQge3N0YWNrW3N0YWNrdG9wXS5maXJzdD1mZmlyc3Q7c3RhY2tbc3RhY2t0b3ArK10ubGFzdD1sYXN0O30KKyNkZWZpbmUgcHVzaFJpZ2h0IHtzdGFja1tzdGFja3RvcF0uZmlyc3Q9Zmlyc3Q7c3RhY2tbc3RhY2t0b3ArK10ubGFzdD1sbGFzdDt9CisjZGVmaW5lIGRvTGVmdCB7Zmlyc3Q9ZmZpcnN0O2xsYXN0PWxhc3Q7Y29udGludWU7fQorI2RlZmluZSBkb1JpZ2h0IHtmZmlyc3Q9Zmlyc3Q7bGFzdD1sbGFzdDtjb250aW51ZTt9CisjZGVmaW5lIHBvcCB7aWYgKC0tc3RhY2t0b3A8MCkgYnJlYWs7XAorICBmaXJzdD1mZmlyc3Q9c3RhY2tbc3RhY2t0b3BdLmZpcnN0O1wKKyAgbGFzdD1sbGFzdD1zdGFja1tzdGFja3RvcF0ubGFzdDtcCisgIGNvbnRpbnVlO30KKworLyogU29tZSBjb21tZW50cyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCisgKiAxLiBXaGVuIHdlIGZpbmlzaCBwYXJ0aXRpb25pbmcgdGhlIGFycmF5IGludG8gImxvdyIKKyAqICAgIGFuZCAiaGlnaCIsIHdlIGZvcmdldCBlbnRpcmVseSBhYm91dCBzaG9ydCBzdWJhcnJheXMsCisgKiAgICBiZWNhdXNlIHRoZXknbGwgYmUgZG9uZSBsYXRlciBieSBpbnNlcnRpb24gc29ydC4KKyAqICAgIERvaW5nIGxvdHMgb2YgbGl0dGxlIGluc2VydGlvbiBzb3J0cyBtaWdodCBiZSBhIHdpbgorICogICAgb24gbGFyZ2UgZGF0YXNldHMgZm9yIGxvY2FsaXR5LW9mLXJlZmVyZW5jZSByZWFzb25zLAorICogICAgYnV0IGl0IG1ha2VzIHRoZSBjb2RlIG11Y2ggbmFzdGllciBhbmQgaW5jcmVhc2VzCisgKiAgICBib29ra2VlcGluZyBvdmVyaGVhZC4KKyAqIDIuIFdlIGFsd2F5cyBzYXZlIHRoZSBzaG9ydGVyIGFuZCBnZXQgdG8gd29yayBvbiB0aGUKKyAqICAgIGxvbmdlci4gVGhpcyBndWFyYW50ZWVzIHRoYXQgZXZlcnkgdGltZSB3ZSBwdXNoCisgKiAgICBhbiBpdGVtIG9udG8gdGhlIHN0YWNrIGl0cyBzaXplIGlzIDw9IDEvMiBvZiB0aGF0CisgKiAgICBvZiBpdHMgcGFyZW50OyBzbyB0aGUgc3RhY2sgY2FuJ3QgbmVlZCBtb3JlIHRoYW4KKyAqICAgIGxvZ18yKG1heC1hcnJheS1zaXplKSBlbnRyaWVzLgorICogMy4gV2UgY2hvb3NlIGEgcGl2b3QgYnkgbG9va2luZyBhdCB0aGUgZmlyc3QsIGxhc3QKKyAqICAgIGFuZCBtaWRkbGUgZWxlbWVudHMuIFdlIGFycmFuZ2UgdGhlbSBpbnRvIG9yZGVyCisgKiAgICBiZWNhdXNlIGl0J3MgZWFzeSB0byBkbyB0aGF0IGluIGNvbmp1bmN0aW9uIHdpdGgKKyAqICAgIGNob29zaW5nIHRoZSBwaXZvdCwgYW5kIGl0IG1ha2VzIHRoaW5ncyBhIGxpdHRsZQorICogICAgZWFzaWVyIGluIHRoZSBwYXJ0aXRpb25pbmcgc3RlcC4gQW55d2F5LCB0aGUgcGl2b3QKKyAqICAgIGlzIHRoZSBtaWRkbGUgb2YgdGhlc2UgdGhyZWUuIEl0J3Mgc3RpbGwgcG9zc2libGUKKyAqICAgIHRvIGNvbnN0cnVjdCBkYXRhc2V0cyB3aGVyZSB0aGUgYWxnb3JpdGhtIHRha2VzCisgKiAgICB0aW1lIG9mIG9yZGVyIG5eMiwgYnV0IGl0IHNpbXBseSBuZXZlciBoYXBwZW5zIGluCisgKiAgICBwcmFjdGljZS4KKyAqIDMnIE5ld3NmbGFzaDogT24gZnVydGhlciBpbnZlc3RpZ2F0aW9uIEkgZmluZCB0aGF0CisgKiAgICBpdCdzIGVhc3kgdG8gY29uc3RydWN0IGRhdGFzZXRzIHdoZXJlIG1lZGlhbi1vZi0zCisgKiAgICBzaW1wbHkgaXNuJ3QgZ29vZCBlbm91Z2guIFNvIG9uIGxhcmdlLWlzaCBzdWJhcnJheXMKKyAqICAgIHdlIGRvIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHBpdm90aW5nOiB3ZSB0YWtlIHRocmVlCisgKiAgICBzZXRzIG9mIDMgZWxlbWVudHMsIGZpbmQgdGhlaXIgbWVkaWFucywgYW5kIHRoZW4KKyAqICAgIHRha2UgdGhlIG1lZGlhbiBvZiB0aG9zZS4KKyAqIDQuIFdlIGNvcHkgdGhlIHBpdm90IGVsZW1lbnQgdG8gYSBzZXBhcmF0ZSBwbGFjZQorICogICAgYmVjYXVzZSB0aGF0IHdheSB3ZSBjYW4gYWx3YXlzIGRvIG91ciBjb21wYXJpc29ucworICogICAgZGlyZWN0bHkgYWdhaW5zdCBhIHBvaW50ZXIgdG8gdGhhdCBzZXBhcmF0ZSBwbGFjZSwKKyAqICAgIGFuZCBkb24ndCBoYXZlIHRvIHdvbmRlciAiZGlkIHdlIG1vdmUgdGhlIHBpdm90CisgKiAgICBlbGVtZW50PyIuIFRoaXMgbWFrZXMgdGhlIGlubmVyIGxvb3AgYmV0dGVyLgorICogNS4gSXQncyBwb3NzaWJsZSB0byBtYWtlIHRoZSBwaXZvdGluZyBldmVuIG1vcmUKKyAqICAgIHJlbGlhYmxlIGJ5IGxvb2tpbmcgYXQgbW9yZSBjYW5kaWRhdGVzIHdoZW4gbgorICogICAgaXMgbGFyZ2VyLiAoVGFraW5nIHRoaXMgdG8gaXRzIGxvZ2ljYWwgY29uY2x1c2lvbgorICogICAgcmVzdWx0cyBpbiBhIHZhcmlhbnQgb2YgcXVpY2tzb3J0IHRoYXQgZG9lc24ndAorICogICAgaGF2ZSB0aGF0IG5eMiB3b3JzdCBjYXNlLikgSG93ZXZlciwgdGhlIG92ZXJoZWFkCisgKiAgICBmcm9tIHRoZSBleHRyYSBib29ra2VlcGluZyBtZWFucyB0aGF0IGl0J3MganVzdAorICogICAgbm90IHdvcnRoIHdoaWxlLgorICogNi4gVGhpcyBpcyBwcmV0dHkgY2xlYW4gYW5kIHBvcnRhYmxlIGNvZGUuIEhlcmUgYXJlCisgKiAgICBhbGwgdGhlIHBvdGVudGlhbCBwb3J0YWJpbGl0eSBwaXRmYWxscyBhbmQgcHJvYmxlbXMKKyAqICAgIEkga25vdyBvZjoKKyAqICAgICAgLSBJbiBvbmUgcGxhY2UgKHRoZSBpbnNlcnRpb24gc29ydCkgSSBjb25zdHJ1Y3QKKyAqICAgICAgICBhIHBvaW50ZXIgdGhhdCBwb2ludHMganVzdCBwYXN0IHRoZSBlbmQgb2YgdGhlCisgKiAgICAgICAgc3VwcGxpZWQgYXJyYXksIGFuZCBhc3N1bWUgdGhhdCAoYSkgaXQgd29uJ3QKKyAqICAgICAgICBjb21wYXJlIGVxdWFsIHRvIGFueSBwb2ludGVyIHdpdGhpbiB0aGUgYXJyYXksCisgKiAgICAgICAgYW5kIChiKSBpdCB3aWxsIGNvbXBhcmUgZXF1YWwgdG8gYSBwb2ludGVyCisgKiAgICAgICAgb2J0YWluZWQgYnkgc3RlcHBpbmcgb2ZmIHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICogICAgICAgIFRoZXNlIG1pZ2h0IGZhaWwgb24gc29tZSBzZWdtZW50ZWQgYXJjaGl0ZWN0dXJlcy4KKyAqICAgICAgLSBJIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSA4IGJpdHMgaW4gYSB8Y2hhcnwgd2hlbgorICogICAgICAgIGNvbXB1dGluZyB0aGUgc2l6ZSBvZiBzdGFjayBuZWVkZWQuIFRoaXMgd291bGQKKyAqICAgICAgICBmYWlsIG9uIG1hY2hpbmVzIHdpdGggOS1iaXQgb3IgMTYtYml0IGJ5dGVzLgorICogICAgICAtIEkgYXNzdW1lIHRoYXQgaWYgfCgoaW50KWJhc2UmKHNpemVvZihpbnQpLTEpKT09MHwKKyAqICAgICAgICBhbmQgfChzaXplJihzaXplb2YoaW50KS0xKSk9PTB8IHRoZW4gaXQncyBzYWZlIHRvCisgKiAgICAgICAgZ2V0IGF0IGFycmF5IGVsZW1lbnRzIHZpYSB8aW50KnxzLCBhbmQgdGhhdCBpZgorICogICAgICAgIGFjdHVhbGx5IHxzaXplPT1zaXplb2YoaW50KXwgYXMgd2VsbCB0aGVuIGl0J3MKKyAqICAgICAgICBzYWZlIHRvIHRyZWF0IHRoZSBlbGVtZW50cyBhcyB8aW50fHMuIFRoaXMgbWlnaHQKKyAqICAgICAgICBmYWlsIG9uIHN5c3RlbXMgdGhhdCBjb252ZXJ0IHBvaW50ZXJzIHRvIGludGVnZXJzCisgKiAgICAgICAgaW4gbm9uLXN0YW5kYXJkIHdheXMuCisgKiAgICAgIC0gSSBhc3N1bWUgdGhhdCB8OCpzaXplb2Yoc2l6ZV90KTw9SU5UX01BWHwuIFRoaXMKKyAqICAgICAgICB3b3VsZCBiZSBmYWxzZSBvbiBhIG1hY2hpbmUgd2l0aCA4LWJpdCB8Y2hhcnxzLAorICogICAgICAgIDE2LWJpdCB8aW50fHMgYW5kIDQwOTYtYml0IHxzaXplX3R8cy4gOi0pCisgKi8KKworLyogVGhlIHJlY3Vyc2lvbiBsb2dpYyBpcyB0aGUgc2FtZSBpbiBlYWNoIGNhc2U6ICovCisjZGVmaW5lIFJlY3Vyc2UoVHJ1bmMpCQkJCVwKKyAgICAgIHsgc2l6ZV90IGw9bGFzdC1mZmlyc3Qscj1sbGFzdC1maXJzdDsJXAorICAgICAgICBpZiAobDxUcnVuYykgewkJCQlcCisgICAgICAgICAgaWYgKHI+PVRydW5jKSBkb1JpZ2h0CQkJXAorICAgICAgICAgIGVsc2UgcG9wCQkJCVwKKyAgICAgICAgfQkJCQkJXAorICAgICAgICBlbHNlIGlmIChsPD1yKSB7IHB1c2hMZWZ0OyBkb1JpZ2h0IH0JXAorICAgICAgICBlbHNlIGlmIChyPj1UcnVuYykgeyBwdXNoUmlnaHQ7IGRvTGVmdCB9XAorICAgICAgICBlbHNlIGRvTGVmdAkJCQlcCisgICAgICB9CisKKy8qIGFuZCBzbyBpcyB0aGUgcGl2b3RpbmcgbG9naWM6ICovCisjZGVmaW5lIFBpdm90KHN3YXBwZXIsc3opCQkJXAorICBpZiAoKHNpemVfdCkobGFzdC1maXJzdCk+UElWT1RfVEhSRVNIT0xEKnN6KSBtaWQ9cGl2b3RfYmlnKGZpcnN0LG1pZCxsYXN0LHN6LGNvbXBhcmUpO1wKKyAgZWxzZSB7CVwKKyAgICBpZiAoY29tcGFyZShmaXJzdCxtaWQpPDApIHsJCQlcCisgICAgICBpZiAoY29tcGFyZShtaWQsbGFzdCk+MCkgewkJXAorICAgICAgICBzd2FwcGVyKG1pZCxsYXN0KTsJCQlcCisgICAgICAgIGlmIChjb21wYXJlKGZpcnN0LG1pZCk+MCkgc3dhcHBlcihmaXJzdCxtaWQpO1wKKyAgICAgIH0JCQkJCQlcCisgICAgfQkJCQkJCVwKKyAgICBlbHNlIHsJCQkJCVwKKyAgICAgIGlmIChjb21wYXJlKG1pZCxsYXN0KT4wKSBzd2FwcGVyKGZpcnN0LGxhc3QpXAorICAgICAgZWxzZSB7CQkJCQlcCisgICAgICAgIHN3YXBwZXIoZmlyc3QsbWlkKTsJCQlcCisgICAgICAgIGlmIChjb21wYXJlKG1pZCxsYXN0KT4wKSBzd2FwcGVyKG1pZCxsYXN0KTtcCisgICAgICB9CQkJCQkJXAorICAgIH0JCQkJCQlcCisgICAgZmlyc3QrPXN6OyBsYXN0LT1zejsJCQlcCisgIH0KKworI2lmZGVmIERFQlVHX1FTT1JUCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisvKiBhbmQgc28gaXMgdGhlIHBhcnRpdGlvbmluZyBsb2dpYzogKi8KKyNkZWZpbmUgUGFydGl0aW9uKHN3YXBwZXIsc3opIHsJCQlcCisgIGludCBzd2FwcGVkPTA7CQkJCVwKKyAgZG8gewkJCQkJCVwKKyAgICB3aGlsZSAoY29tcGFyZShmaXJzdCxwaXZvdCk8MCkgZmlyc3QrPXN6OwlcCisgICAgd2hpbGUgKGNvbXBhcmUocGl2b3QsbGFzdCk8MCkgbGFzdC09c3o7CVwKKyAgICBpZiAoZmlyc3Q8bGFzdCkgewkJCQlcCisgICAgICBzd2FwcGVyKGZpcnN0LGxhc3QpOyBzd2FwcGVkPTE7CQlcCisgICAgICBmaXJzdCs9c3o7IGxhc3QtPXN6OyB9CQkJXAorICAgIGVsc2UgaWYgKGZpcnN0PT1sYXN0KSB7IGZpcnN0Kz1zejsgbGFzdC09c3o7IGJyZWFrOyB9XAorICB9IHdoaWxlIChmaXJzdDw9bGFzdCk7CQkJXAorICBpZiAoIXN3YXBwZWQpIHBvcAkJCQlcCit9CisKKy8qIGFuZCBzbyBpcyB0aGUgcHJlLWluc2VydGlvbi1zb3J0IG9wZXJhdGlvbiBvZiBwdXR0aW5nCisgKiB0aGUgc21hbGxlc3QgZWxlbWVudCBpbnRvIHBsYWNlIGFzIGEgc2VudGluZWwuCisgKiBEb2luZyB0aGlzIG1ha2VzIHRoZSBpbm5lciBsb29wIG5pY2VyLiBJIGdvdCB0aGlzCisgKiBpZGVhIGZyb20gdGhlIEdOVSBpbXBsZW1lbnRhdGlvbiBvZiBxc29ydCgpLgorICovCisjZGVmaW5lIFByZUluc2VydGlvbihzd2FwcGVyLGxpbWl0LHN6KQkJXAorICBmaXJzdD1iYXNlOwkJCQkJXAorICBsYXN0PWZpcnN0ICsgKG5tZW1iPmxpbWl0ID8gbGltaXQgOiBubWVtYi0xKSpzejtcCisgIHdoaWxlIChsYXN0IT1iYXNlKSB7CQkJCVwKKyAgICBpZiAoY29tcGFyZShmaXJzdCxsYXN0KT4wKSBmaXJzdD1sYXN0OwlcCisgICAgbGFzdC09c3o7IH0JCQkJCVwKKyAgaWYgKGZpcnN0IT1iYXNlKSBzd2FwcGVyKGZpcnN0LChjaGFyKiliYXNlKTsKKworLyogYW5kIHNvIGlzIHRoZSBpbnNlcnRpb24gc29ydCwgaW4gdGhlIGZpcnN0IHR3byBjYXNlczogKi8KKyNkZWZpbmUgSW5zZXJ0aW9uKHN3YXBwZXIpCQkJXAorICBsYXN0PSgoY2hhciopYmFzZSkrbm1lbWIqc2l6ZTsJCVwKKyAgZm9yIChmaXJzdD0oKGNoYXIqKWJhc2UpK3NpemU7Zmlyc3QhPWxhc3Q7Zmlyc3QrPXNpemUpIHsJXAorICAgIGNoYXIgKnRlc3Q7CQkJCQlcCisgICAgLyogRmluZCB0aGUgcmlnaHQgcGxhY2UgZm9yIHxmaXJzdHwuCVwKKyAgICAgKiBNeSBhcG9sb2dpZXMgZm9yIHZhciByZXVzZS4gKi8JCVwKKyAgICBmb3IgKHRlc3Q9Zmlyc3Qtc2l6ZTtjb21wYXJlKHRlc3QsZmlyc3QpPjA7dGVzdC09c2l6ZSkgOwlcCisgICAgdGVzdCs9c2l6ZTsJCQkJCVwKKyAgICBpZiAodGVzdCE9Zmlyc3QpIHsJCQkJXAorICAgICAgLyogU2hpZnQgZXZlcnl0aGluZyBpbiBbdGVzdCxmaXJzdCkJXAorICAgICAgICogdXAgYnkgb25lLCBhbmQgcGxhY2UgfGZpcnN0fAkJXAorICAgICAgICogd2hlcmUgfHRlc3R8IGlzLiAqLwkJCVwKKyAgICAgIG1lbWNweShwaXZvdCxmaXJzdCxzaXplKTsJCQlcCisgICAgICBtZW1tb3ZlKHRlc3Qrc2l6ZSx0ZXN0LGZpcnN0LXRlc3QpOwlcCisgICAgICBtZW1jcHkodGVzdCxwaXZvdCxzaXplKTsJCQlcCisgICAgfQkJCQkJCVwKKyAgfQorCisjZGVmaW5lIFNXQVBfbm9uYWxpZ25lZChhLGIpIHsgXAorICByZWdpc3RlciBjaGFyICphYT0oYSksKmJiPShiKTsgXAorICByZWdpc3RlciBzaXplX3Qgc3o9c2l6ZTsgXAorICBkbyB7IHJlZ2lzdGVyIGNoYXIgdD0qYWE7ICphYSsrPSpiYjsgKmJiKys9dDsgfSB3aGlsZSAoLS1zeik7IH0KKworI2RlZmluZSBTV0FQX2FsaWduZWQoYSxiKSB7IFwKKyAgcmVnaXN0ZXIgaW50ICphYT0oaW50KikoYSksKmJiPShpbnQqKShiKTsgXAorICByZWdpc3RlciBzaXplX3Qgc3o9c2l6ZTsgXAorICBkbyB7IHJlZ2lzdGVyIGludCB0PSphYTsqYWErKz0qYmI7ICpiYisrPXQ7IH0gd2hpbGUgKHN6LT1XT1JEX0JZVEVTKTsgfQorCisjZGVmaW5lIFNXQVBfd29yZHMoYSxiKSB7IFwKKyAgcmVnaXN0ZXIgaW50IHQ9KigoaW50KilhKTsgKigoaW50KilhKT0qKChpbnQqKWIpOyAqKChpbnQqKWIpPXQ7IH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY2hhciAqIHBpdm90X2JpZyhjaGFyICpmaXJzdCwgY2hhciAqbWlkLCBjaGFyICpsYXN0LCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wYXJlKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgeworICBzaXplX3QgZD0oKChsYXN0LWZpcnN0KS9zaXplKT4+Mykqc2l6ZTsKKyAgY2hhciAqbTEsKm0yLCptMzsKKyAgeyBjaGFyICphPWZpcnN0LCAqYj1maXJzdCtkLCAqYz1maXJzdCsyKmQ7CisjaWZkZWYgREVCVUdfUVNPUlQKK2ZwcmludGYoc3RkZXJyLCI8ICVkICVkICVkXG4iLCooaW50KilhLCooaW50KiliLCooaW50KiljKTsKKyNlbmRpZgorICAgIG0xID0gY29tcGFyZShhLGIpPDAgPworICAgICAgICAgICAoY29tcGFyZShiLGMpPDAgPyBiIDogKGNvbXBhcmUoYSxjKTwwID8gYyA6IGEpKQorICAgICAgICAgOiAoY29tcGFyZShhLGMpPDAgPyBhIDogKGNvbXBhcmUoYixjKTwwID8gYyA6IGIpKTsKKyAgfQorICB7IGNoYXIgKmE9bWlkLWQsICpiPW1pZCwgKmM9bWlkK2Q7CisjaWZkZWYgREVCVUdfUVNPUlQKK2ZwcmludGYoc3RkZXJyLCIuICVkICVkICVkXG4iLCooaW50KilhLCooaW50KiliLCooaW50KiljKTsKKyNlbmRpZgorICAgIG0yID0gY29tcGFyZShhLGIpPDAgPworICAgICAgICAgICAoY29tcGFyZShiLGMpPDAgPyBiIDogKGNvbXBhcmUoYSxjKTwwID8gYyA6IGEpKQorICAgICAgICAgOiAoY29tcGFyZShhLGMpPDAgPyBhIDogKGNvbXBhcmUoYixjKTwwID8gYyA6IGIpKTsKKyAgfQorICB7IGNoYXIgKmE9bGFzdC0yKmQsICpiPWxhc3QtZCwgKmM9bGFzdDsKKyNpZmRlZiBERUJVR19RU09SVAorZnByaW50ZihzdGRlcnIsIj4gJWQgJWQgJWRcbiIsKihpbnQqKWEsKihpbnQqKWIsKihpbnQqKWMpOworI2VuZGlmCisgICAgbTMgPSBjb21wYXJlKGEsYik8MCA/CisgICAgICAgICAgIChjb21wYXJlKGIsYyk8MCA/IGIgOiAoY29tcGFyZShhLGMpPDAgPyBjIDogYSkpCisgICAgICAgICA6IChjb21wYXJlKGEsYyk8MCA/IGEgOiAoY29tcGFyZShiLGMpPDAgPyBjIDogYikpOworICB9CisjaWZkZWYgREVCVUdfUVNPUlQKK2ZwcmludGYoc3RkZXJyLCItPiAlZCAlZCAlZFxuIiwqKGludCopbTEsKihpbnQqKW0yLCooaW50KiltMyk7CisjZW5kaWYKKyAgcmV0dXJuIGNvbXBhcmUobTEsbTIpPDAgPworICAgICAgICAgICAoY29tcGFyZShtMixtMyk8MCA/IG0yIDogKGNvbXBhcmUobTEsbTMpPDAgPyBtMyA6IG0xKSkKKyAgICAgICAgIDogKGNvbXBhcmUobTEsbTMpPDAgPyBtMSA6IChjb21wYXJlKG0yLG0zKTwwID8gbTMgOiBtMikpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHFzb3J0X25vbmFsaWduZWQodm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgaW50ICgqY29tcGFyZSkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSB7CisKKyAgc3RhY2tfZW50cnkgc3RhY2tbU1RBQ0tfU0laRV07CisgIGludCBzdGFja3RvcD0wOworICBjaGFyICpmaXJzdCwqbGFzdDsKKyAgY2hhciAqcGl2b3Q9bWFsbG9jKHNpemUpOworICBzaXplX3QgdHJ1bmM9VFJVTkNfbm9uYWxpZ25lZCpzaXplOworICBhc3NlcnQocGl2b3QhPTApOworCisgIGZpcnN0PShjaGFyKiliYXNlOyBsYXN0PWZpcnN0KyhubWVtYi0xKSpzaXplOworCisgIGlmICgoc2l6ZV90KShsYXN0LWZpcnN0KT50cnVuYykgeworICAgIGNoYXIgKmZmaXJzdD1maXJzdCwgKmxsYXN0PWxhc3Q7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIC8qIFNlbGVjdCBwaXZvdCAqLworICAgICAgeyBjaGFyICogbWlkPWZpcnN0K3NpemUqKChsYXN0LWZpcnN0KS9zaXplID4+IDEpOworICAgICAgICBQaXZvdChTV0FQX25vbmFsaWduZWQsc2l6ZSk7CisgICAgICAgIG1lbWNweShwaXZvdCxtaWQsc2l6ZSk7CisgICAgICB9CisgICAgICAvKiBQYXJ0aXRpb24uICovCisgICAgICBQYXJ0aXRpb24oU1dBUF9ub25hbGlnbmVkLHNpemUpOworICAgICAgLyogUHJlcGFyZSB0byByZWN1cnNlL2l0ZXJhdGUuICovCisgICAgICBSZWN1cnNlKHRydW5jKQorICAgIH0KKyAgfQorICBQcmVJbnNlcnRpb24oU1dBUF9ub25hbGlnbmVkLFRSVU5DX25vbmFsaWduZWQsc2l6ZSk7CisgIEluc2VydGlvbihTV0FQX25vbmFsaWduZWQpOworICBmcmVlKHBpdm90KTsKK30KKworc3RhdGljIHZvaWQgcXNvcnRfYWxpZ25lZCh2b2lkICpiYXNlLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLAorICAgICAgICAgICBpbnQgKCpjb21wYXJlKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIHsKKworICBzdGFja19lbnRyeSBzdGFja1tTVEFDS19TSVpFXTsKKyAgaW50IHN0YWNrdG9wPTA7CisgIGNoYXIgKmZpcnN0LCpsYXN0OworICBjaGFyICpwaXZvdD1tYWxsb2Moc2l6ZSk7CisgIHNpemVfdCB0cnVuYz1UUlVOQ19hbGlnbmVkKnNpemU7CisgIGFzc2VydChwaXZvdCE9MCk7CisKKyAgZmlyc3Q9KGNoYXIqKWJhc2U7IGxhc3Q9Zmlyc3QrKG5tZW1iLTEpKnNpemU7CisKKyAgaWYgKChzaXplX3QpKGxhc3QtZmlyc3QpPnRydW5jKSB7CisgICAgY2hhciAqZmZpcnN0PWZpcnN0LCpsbGFzdD1sYXN0OworICAgIHdoaWxlICgxKSB7CisgICAgICAvKiBTZWxlY3QgcGl2b3QgKi8KKyAgICAgIHsgY2hhciAqIG1pZD1maXJzdCtzaXplKigobGFzdC1maXJzdCkvc2l6ZSA+PiAxKTsKKyAgICAgICAgUGl2b3QoU1dBUF9hbGlnbmVkLHNpemUpOworICAgICAgICBtZW1jcHkocGl2b3QsbWlkLHNpemUpOworICAgICAgfQorICAgICAgLyogUGFydGl0aW9uLiAqLworICAgICAgUGFydGl0aW9uKFNXQVBfYWxpZ25lZCxzaXplKTsKKyAgICAgIC8qIFByZXBhcmUgdG8gcmVjdXJzZS9pdGVyYXRlLiAqLworICAgICAgUmVjdXJzZSh0cnVuYykKKyAgICB9CisgIH0KKyAgUHJlSW5zZXJ0aW9uKFNXQVBfYWxpZ25lZCxUUlVOQ19hbGlnbmVkLHNpemUpOworICBJbnNlcnRpb24oU1dBUF9hbGlnbmVkKTsKKyAgZnJlZShwaXZvdCk7Cit9CisKK3N0YXRpYyB2b2lkIHFzb3J0X3dvcmRzKHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwKKyAgICAgICAgICAgaW50ICgqY29tcGFyZSkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSB7CisKKyAgc3RhY2tfZW50cnkgc3RhY2tbU1RBQ0tfU0laRV07CisgIGludCBzdGFja3RvcD0wOworICBjaGFyICpmaXJzdCwqbGFzdDsKKyAgY2hhciAqcGl2b3Q9bWFsbG9jKFdPUkRfQllURVMpOworICBhc3NlcnQocGl2b3QhPTApOworCisgIGZpcnN0PShjaGFyKiliYXNlOyBsYXN0PWZpcnN0KyhubWVtYi0xKSpXT1JEX0JZVEVTOworCisgIGlmIChsYXN0LWZpcnN0PlRSVU5DX3dvcmRzKSB7CisgICAgY2hhciAqZmZpcnN0PWZpcnN0LCAqbGxhc3Q9bGFzdDsKKyAgICB3aGlsZSAoMSkgeworI2lmZGVmIERFQlVHX1FTT1JUCitmcHJpbnRmKHN0ZGVyciwiRG9pbmcgJWQ6JWQ6ICIsCisgICAgICAgIChmaXJzdC0oY2hhciopYmFzZSkvV09SRF9CWVRFUywKKyAgICAgICAgKGxhc3QtKGNoYXIqKWJhc2UpL1dPUkRfQllURVMpOworI2VuZGlmCisgICAgICAvKiBTZWxlY3QgcGl2b3QgKi8KKyAgICAgIHsgY2hhciAqIG1pZD1maXJzdCtXT1JEX0JZVEVTKigobGFzdC1maXJzdCkgLyAoMipXT1JEX0JZVEVTKSk7CisgICAgICAgIFBpdm90KFNXQVBfd29yZHMsV09SRF9CWVRFUyk7CisgICAgICAgICooaW50KilwaXZvdD0qKGludCopbWlkOworICAgICAgfQorI2lmZGVmIERFQlVHX1FTT1JUCitmcHJpbnRmKHN0ZGVyciwicGl2b3Q9JWRcbiIsKihpbnQqKXBpdm90KTsKKyNlbmRpZgorICAgICAgLyogUGFydGl0aW9uLiAqLworICAgICAgUGFydGl0aW9uKFNXQVBfd29yZHMsV09SRF9CWVRFUyk7CisgICAgICAvKiBQcmVwYXJlIHRvIHJlY3Vyc2UvaXRlcmF0ZS4gKi8KKyAgICAgIFJlY3Vyc2UoVFJVTkNfd29yZHMpCisgICAgfQorICB9CisgIFByZUluc2VydGlvbihTV0FQX3dvcmRzLChUUlVOQ193b3Jkcy9XT1JEX0JZVEVTKSxXT1JEX0JZVEVTKTsKKyAgLyogTm93IGRvIGluc2VydGlvbiBzb3J0LiAqLworICBsYXN0PSgoY2hhciopYmFzZSkrbm1lbWIqV09SRF9CWVRFUzsKKyAgZm9yIChmaXJzdD0oKGNoYXIqKWJhc2UpK1dPUkRfQllURVM7Zmlyc3QhPWxhc3Q7Zmlyc3QrPVdPUkRfQllURVMpIHsKKyAgICAvKiBGaW5kIHRoZSByaWdodCBwbGFjZSBmb3IgfGZpcnN0fC4gTXkgYXBvbG9naWVzIGZvciB2YXIgcmV1c2UgKi8KKyAgICBpbnQgKnBsPShpbnQqKShmaXJzdC1XT1JEX0JZVEVTKSwqcHI9KGludCopZmlyc3Q7CisgICAgKihpbnQqKXBpdm90PSooaW50KilmaXJzdDsKKyAgICBmb3IgKDtjb21wYXJlKHBsLHBpdm90KT4wO3ByPXBsLC0tcGwpIHsKKyAgICAgICpwcj0qcGw7IH0KKyAgICBpZiAocHIhPShpbnQqKWZpcnN0KSAqcHI9KihpbnQqKXBpdm90OworICB9CisgIGZyZWUocGl2b3QpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgcXNvcnQodm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgaW50ICgqY29tcGFyZSkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSB7CisKKyAgaWYgKG5tZW1iPD0xKSByZXR1cm47CisgIGlmICgoKHVpbnRwdHJfdCliYXNlfHNpemUpJihXT1JEX0JZVEVTLTEpKQorICAgIHFzb3J0X25vbmFsaWduZWQoYmFzZSxubWVtYixzaXplLGNvbXBhcmUpOworICBlbHNlIGlmIChzaXplIT1XT1JEX0JZVEVTKQorICAgIHFzb3J0X2FsaWduZWQoYmFzZSxubWVtYixzaXplLGNvbXBhcmUpOworICBlbHNlCisgICAgcXNvcnRfd29yZHMoYmFzZSxubWVtYixjb21wYXJlKTsKK30KKworI2VuZGlmIC8qICFIQVZFX1FTT1JUICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3N0ZGxpYi9TRExfc3RkbGliLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3N0ZGxpYi9TRExfc3RkbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4OGZlNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvc3RkbGliL1NETF9zdGRsaWIuYwpAQCAtMCwwICsxLDYyMCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBwb3J0YWJsZSBzdGRsaWIgZnVuY3Rpb25zIGZvciBTREwgKi8KKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKworI2lmbmRlZiBIQVZFX0xJQkMKKy8qIFRoZXNlIGFyZSBzb21lIEMgcnVudGltZSBpbnRyaW5zaWNzIHRoYXQgbmVlZCB0byBiZSBkZWZpbmVkICovCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorCisjaWZuZGVmIF9fRkxUVVNFRF9fCisjZGVmaW5lIF9fRkxUVVNFRF9fCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgIGV4dGVybiAiQyIKKyNlbmRpZgorCSAgIF9fZGVjbHNwZWMoc2VsZWN0YW55KSBpbnQgX2ZsdHVzZWQ9MTsKKyNlbmRpZgorCisvKiBGbG9hdCB0byBsb25nICovCit2b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9mdG9sKCkKK3sKKwlfX2FzbSB7CisJCXB1c2ggICAgICAgIGVicAorCQltb3YgICAgICAgICBlYnAsZXNwCisJCXN1YiAgICAgICAgIGVzcCwyMGgKKwkJYW5kICAgICAgICAgZXNwLDBGRkZGRkZGMGgKKwkJZmxkICAgICAgICAgc3QoMCkKKwkJZnN0ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMThoXQorCQlmaXN0cCAgICAgICBxd29yZCBwdHIgW2VzcCsxMGhdCisJCWZpbGQgICAgICAgIHF3b3JkIHB0ciBbZXNwKzEwaF0KKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE4aF0KKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJdGVzdCAgICAgICAgZWF4LGVheAorCQlqZSAgICAgICAgICBpbnRlZ2VyX1FuYU5fb3JfemVybworYXJnX2lzX25vdF9pbnRlZ2VyX1FuYU46CisJCWZzdWJwICAgICAgIHN0KDEpLHN0CisJCXRlc3QgICAgICAgIGVkeCxlZHgKKwkJam5zICAgICAgICAgcG9zaXRpdmUKKwkJZnN0cCAgICAgICAgZHdvcmQgcHRyIFtlc3BdCisJCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcF0KKwkJeG9yICAgICAgICAgZWN4LDgwMDAwMDAwaAorCQlhZGQgICAgICAgICBlY3gsN0ZGRkZGRkZoCisJCWFkYyAgICAgICAgIGVheCwwCisJCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxNGhdCisJCWFkYyAgICAgICAgIGVkeCwwCisJCWptcCAgICAgICAgIGxvY2FsZXhpdAorcG9zaXRpdmU6CisJCWZzdHAgICAgICAgIGR3b3JkIHB0ciBbZXNwXQorCQltb3YgICAgICAgICBlY3gsZHdvcmQgcHRyIFtlc3BdCisJCWFkZCAgICAgICAgIGVjeCw3RkZGRkZGRmgKKwkJc2JiICAgICAgICAgZWF4LDAKKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJc2JiICAgICAgICAgZWR4LDAKKwkJam1wICAgICAgICAgbG9jYWxleGl0CitpbnRlZ2VyX1FuYU5fb3JfemVybzoKKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJdGVzdCAgICAgICAgZWR4LDdGRkZGRkZGaAorCQlqbmUgICAgICAgICBhcmdfaXNfbm90X2ludGVnZXJfUW5hTgorCQlmc3RwICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCisJCWZzdHAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzE4aF0KK2xvY2FsZXhpdDoKKwkJbGVhdmUKKwkJcmV0CisJfQorfQordm9pZCBfX2RlY2xzcGVjKG5ha2VkKSBfZnRvbDJfc3NlKCkKK3sKKwlfZnRvbCgpOworfQorCisvKiA2NC1iaXQgbWF0aCBvcGVyYXRvcnMgZm9yIDMyLWJpdCBzeXN0ZW1zICovCit2b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9hbGxtdWwoKQoreworCV9fYXNtIHsKKwkJcHVzaCAgICAgICAgZWJwCisJCW1vdiAgICAgICAgIGVicCxlc3AKKwkJcHVzaCAgICAgICAgZWRpCisJCXB1c2ggICAgICAgIGVzaQorCQlwdXNoICAgICAgICBlYngKKwkJc3ViICAgICAgICAgZXNwLDBDaAorCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlYnArMTBoXQorCQltb3YgICAgICAgICBlZGksZHdvcmQgcHRyIFtlYnArOF0KKwkJbW92ICAgICAgICAgZWJ4LGVheAorCQltb3YgICAgICAgICBlc2ksZWF4CisJCXNhciAgICAgICAgIGVzaSwxRmgKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZWJwKzhdCisJCW11bCAgICAgICAgIGVieAorCQlpbXVsICAgICAgICBlZGksZXNpCisJCW1vdiAgICAgICAgIGVjeCxlZHgKKwkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlYnAtMThoXSxlYXgKKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZWJwKzBDaF0KKwkJYWRkICAgICAgICAgZWN4LGVkaQorCQlpbXVsICAgICAgICBlYngsZWR4CisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VicC0xOGhdCisJCWxlYSAgICAgICAgIGVieCxbZWJ4K2VjeF0KKwkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlYnAtMTRoXSxlYngKKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZWJwLTE0aF0KKwkJYWRkICAgICAgICAgZXNwLDBDaAorCQlwb3AgICAgICAgICBlYngKKwkJcG9wICAgICAgICAgZXNpCisJCXBvcCAgICAgICAgIGVkaQorCQlwb3AgICAgICAgICBlYnAKKwkJcmV0CisJfQorfQordm9pZCBfX2RlY2xzcGVjKG5ha2VkKSBfYWxsZGl2KCkKK3sKKwlfX2FzbSB7CisJCXB1c2ggICAgICAgIGVkaQorCQlwdXNoICAgICAgICBlc2kKKwkJcHVzaCAgICAgICAgZWJ4CisJCXhvciAgICAgICAgIGVkaSxlZGkKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJb3IgICAgICAgICAgZWF4LGVheAorCQlqZ2UgICAgICAgICBMMQorCQlpbmMgICAgICAgICBlZGkKKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJbmVnICAgICAgICAgZWF4CisJCW5lZyAgICAgICAgIGVkeAorCQlzYmIgICAgICAgICBlYXgsMAorCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxNGhdLGVheAorCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxMGhdLGVkeAorTDE6CisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxQ2hdCisJCW9yICAgICAgICAgIGVheCxlYXgKKwkJamdlICAgICAgICAgTDIKKwkJaW5jICAgICAgICAgZWRpCisJCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxOGhdCisJCW5lZyAgICAgICAgIGVheAorCQluZWcgICAgICAgICBlZHgKKwkJc2JiICAgICAgICAgZWF4LDAKKwkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMUNoXSxlYXgKKwkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMThoXSxlZHgKK0wyOgorCQlvciAgICAgICAgICBlYXgsZWF4CisJCWpuZSAgICAgICAgIEwzCisJCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxOGhdCisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxNGhdCisJCXhvciAgICAgICAgIGVkeCxlZHgKKwkJZGl2ICAgICAgICAgZWN4CisJCW1vdiAgICAgICAgIGVieCxlYXgKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJZGl2ICAgICAgICAgZWN4CisJCW1vdiAgICAgICAgIGVkeCxlYngKKwkJam1wICAgICAgICAgTDQKK0wzOgorCQltb3YgICAgICAgICBlYngsZWF4CisJCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxOGhdCisJCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxNGhdCisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxMGhdCitMNToKKwkJc2hyICAgICAgICAgZWJ4LDEKKwkJcmNyICAgICAgICAgZWN4LDEKKwkJc2hyICAgICAgICAgZWR4LDEKKwkJcmNyICAgICAgICAgZWF4LDEKKwkJb3IgICAgICAgICAgZWJ4LGVieAorCQlqbmUgICAgICAgICBMNQorCQlkaXYgICAgICAgICBlY3gKKwkJbW92ICAgICAgICAgZXNpLGVheAorCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxQ2hdCisJCW1vdiAgICAgICAgIGVjeCxlYXgKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE4aF0KKwkJbXVsICAgICAgICAgZXNpCisJCWFkZCAgICAgICAgIGVkeCxlY3gKKwkJamIgICAgICAgICAgTDYKKwkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJamEgICAgICAgICAgTDYKKwkJamIgICAgICAgICAgTDcKKwkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJamJlICAgICAgICAgTDcKK0w2OgorCQlkZWMgICAgICAgICBlc2kKK0w3OgorCQl4b3IgICAgICAgICBlZHgsZWR4CisJCW1vdiAgICAgICAgIGVheCxlc2kKK0w0OgorCQlkZWMgICAgICAgICBlZGkKKwkJam5lICAgICAgICAgTDgKKwkJbmVnICAgICAgICAgZWR4CisJCW5lZyAgICAgICAgIGVheAorCQlzYmIgICAgICAgICBlZHgsMAorTDg6CisJCXBvcCAgICAgICAgIGVieAorCQlwb3AgICAgICAgICBlc2kKKwkJcG9wICAgICAgICAgZWRpCisJCXJldCAgICAgICAgIDEwaAorCX0KK30KK3ZvaWQgX19kZWNsc3BlYyhuYWtlZCkgX2F1bGxkaXYoKQoreworCV9fYXNtIHsKKwkJcHVzaCAgICAgICAgZWJ4CisJCXB1c2ggICAgICAgIGVzaQorCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMThoXQorCQlvciAgICAgICAgICBlYXgsZWF4CisJCWpuZSAgICAgICAgIEwxCisJCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxNGhdCisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxMGhdCisJCXhvciAgICAgICAgIGVkeCxlZHgKKwkJZGl2ICAgICAgICAgZWN4CisJCW1vdiAgICAgICAgIGVieCxlYXgKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzBDaF0KKwkJZGl2ICAgICAgICAgZWN4CisJCW1vdiAgICAgICAgIGVkeCxlYngKKwkJam1wICAgICAgICAgTDIKK0wxOgorCQltb3YgICAgICAgICBlY3gsZWF4CisJCW1vdiAgICAgICAgIGVieCxkd29yZCBwdHIgW2VzcCsxNGhdCisJCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxMGhdCisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCswQ2hdCitMMzoKKwkJc2hyICAgICAgICAgZWN4LDEKKwkJcmNyICAgICAgICAgZWJ4LDEKKwkJc2hyICAgICAgICAgZWR4LDEKKwkJcmNyICAgICAgICAgZWF4LDEKKwkJb3IgICAgICAgICAgZWN4LGVjeAorCQlqbmUgICAgICAgICBMMworCQlkaXYgICAgICAgICBlYngKKwkJbW92ICAgICAgICAgZXNpLGVheAorCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCisJCW1vdiAgICAgICAgIGVjeCxlYXgKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJbXVsICAgICAgICAgZXNpCisJCWFkZCAgICAgICAgIGVkeCxlY3gKKwkJamIgICAgICAgICAgTDQKKwkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJamEgICAgICAgICAgTDQKKwkJamIgICAgICAgICAgTDUKKwkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzBDaF0KKwkJamJlICAgICAgICAgTDUKK0w0OgorCQlkZWMgICAgICAgICBlc2kKK0w1OgorCQl4b3IgICAgICAgICBlZHgsZWR4CisJCW1vdiAgICAgICAgIGVheCxlc2kKK0wyOgorCQlwb3AgICAgICAgICBlc2kKKwkJcG9wICAgICAgICAgZWJ4CisJCXJldCAgICAgICAgIDEwaAorCX0KK30KK3ZvaWQgX19kZWNsc3BlYyhuYWtlZCkgX2FsbHJlbSgpCit7CisJX19hc20geworCQlwdXNoICAgICAgICBlYngKKwkJcHVzaCAgICAgICAgZWRpCisJCXhvciAgICAgICAgIGVkaSxlZGkKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJb3IgICAgICAgICAgZWF4LGVheAorCQlqZ2UgICAgICAgICBMMQorCQlpbmMgICAgICAgICBlZGkKKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KKwkJbmVnICAgICAgICAgZWF4CisJCW5lZyAgICAgICAgIGVkeAorCQlzYmIgICAgICAgICBlYXgsMAorCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxMGhdLGVheAorCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCswQ2hdLGVkeAorTDE6CisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxOGhdCisJCW9yICAgICAgICAgIGVheCxlYXgKKwkJamdlICAgICAgICAgTDIKKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJbmVnICAgICAgICAgZWF4CisJCW5lZyAgICAgICAgIGVkeAorCQlzYmIgICAgICAgICBlYXgsMAorCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdLGVheAorCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxNGhdLGVkeAorTDI6CisJCW9yICAgICAgICAgIGVheCxlYXgKKwkJam5lICAgICAgICAgTDMKKwkJbW92ICAgICAgICAgZWN4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJeG9yICAgICAgICAgZWR4LGVkeAorCQlkaXYgICAgICAgICBlY3gKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzBDaF0KKwkJZGl2ICAgICAgICAgZWN4CisJCW1vdiAgICAgICAgIGVheCxlZHgKKwkJeG9yICAgICAgICAgZWR4LGVkeAorCQlkZWMgICAgICAgICBlZGkKKwkJam5zICAgICAgICAgTDQKKwkJam1wICAgICAgICAgTDgKK0wzOgorCQltb3YgICAgICAgICBlYngsZWF4CisJCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxNGhdCisJCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxMGhdCisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCswQ2hdCitMNToKKwkJc2hyICAgICAgICAgZWJ4LDEKKwkJcmNyICAgICAgICAgZWN4LDEKKwkJc2hyICAgICAgICAgZWR4LDEKKwkJcmNyICAgICAgICAgZWF4LDEKKwkJb3IgICAgICAgICAgZWJ4LGVieAorCQlqbmUgICAgICAgICBMNQorCQlkaXYgICAgICAgICBlY3gKKwkJbW92ICAgICAgICAgZWN4LGVheAorCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCisJCXhjaGcgICAgICAgIGVheCxlY3gKKwkJbXVsICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMTRoXQorCQlhZGQgICAgICAgICBlZHgsZWN4CisJCWpiICAgICAgICAgIEw2CisJCWNtcCAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxMGhdCisJCWphICAgICAgICAgIEw2CisJCWpiICAgICAgICAgIEw3CisJCWNtcCAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCswQ2hdCisJCWpiZSAgICAgICAgIEw3CitMNjoKKwkJc3ViICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE4aF0KK0w3OgorCQlzdWIgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMENoXQorCQlzYmIgICAgICAgICBlZHgsZHdvcmQgcHRyIFtlc3ArMTBoXQorCQlkZWMgICAgICAgICBlZGkKKwkJam5zICAgICAgICAgTDgKK0w0OgorCQluZWcgICAgICAgICBlZHgKKwkJbmVnICAgICAgICAgZWF4CisJCXNiYiAgICAgICAgIGVkeCwwCitMODoKKwkJcG9wICAgICAgICAgZWRpCisJCXBvcCAgICAgICAgIGVieAorCQlyZXQgICAgICAgICAxMGgKKwl9Cit9Cit2b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9hdWxscmVtKCkKK3sKKwlfX2FzbSB7CisJCXB1c2ggICAgICAgIGVieAorCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMTRoXQorCQlvciAgICAgICAgICBlYXgsZWF4CisJCWpuZSAgICAgICAgIEwxCisJCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxMGhdCisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCswQ2hdCisJCXhvciAgICAgICAgIGVkeCxlZHgKKwkJZGl2ICAgICAgICAgZWN4CisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCs4XQorCQlkaXYgICAgICAgICBlY3gKKwkJbW92ICAgICAgICAgZWF4LGVkeAorCQl4b3IgICAgICAgICBlZHgsZWR4CisJCWptcCAgICAgICAgIEwyCitMMToKKwkJbW92ICAgICAgICAgZWN4LGVheAorCQltb3YgICAgICAgICBlYngsZHdvcmQgcHRyIFtlc3ArMTBoXQorCQltb3YgICAgICAgICBlZHgsZHdvcmQgcHRyIFtlc3ArMENoXQorCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArOF0KK0wzOgorCQlzaHIgICAgICAgICBlY3gsMQorCQlyY3IgICAgICAgICBlYngsMQorCQlzaHIgICAgICAgICBlZHgsMQorCQlyY3IgICAgICAgICBlYXgsMQorCQlvciAgICAgICAgICBlY3gsZWN4CisJCWpuZSAgICAgICAgIEwzCisJCWRpdiAgICAgICAgIGVieAorCQltb3YgICAgICAgICBlY3gsZWF4CisJCW11bCAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJeGNoZyAgICAgICAgZWF4LGVjeAorCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxMGhdCisJCWFkZCAgICAgICAgIGVkeCxlY3gKKwkJamIgICAgICAgICAgTDQKKwkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KKwkJamEgICAgICAgICAgTDQKKwkJamIgICAgICAgICAgTDUKKwkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzhdCisJCWpiZSAgICAgICAgIEw1CitMNDoKKwkJc3ViICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KK0w1OgorCQlzdWIgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArOF0KKwkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KKwkJbmVnICAgICAgICAgZWR4CisJCW5lZyAgICAgICAgIGVheAorCQlzYmIgICAgICAgICBlZHgsMAorTDI6CisJCXBvcCAgICAgICAgIGVieAorCQlyZXQgICAgICAgICAxMGgKKwl9Cit9Cit2b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9hbGxkdnJtKCkKK3sKKwlfX2FzbSB7CisJCXB1c2ggICAgICAgIGVkaQorCQlwdXNoICAgICAgICBlc2kKKwkJcHVzaCAgICAgICAgZWJwCisJCXhvciAgICAgICAgIGVkaSxlZGkKKwkJeG9yICAgICAgICAgZWJwLGVicAorCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMTRoXQorCQlvciAgICAgICAgICBlYXgsZWF4CisJCWpnZSAgICAgICAgIEwxCisJCWluYyAgICAgICAgIGVkaQorCQlpbmMgICAgICAgICBlYnAKKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJbmVnICAgICAgICAgZWF4CisJCW5lZyAgICAgICAgIGVkeAorCQlzYmIgICAgICAgICBlYXgsMAorCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxNGhdLGVheAorCQltb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCsxMGhdLGVkeAorTDE6CisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxQ2hdCisJCW9yICAgICAgICAgIGVheCxlYXgKKwkJamdlICAgICAgICAgTDIKKwkJaW5jICAgICAgICAgZWRpCisJCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxOGhdCisJCW5lZyAgICAgICAgIGVheAorCQluZWcgICAgICAgICBlZHgKKwkJc2JiICAgICAgICAgZWF4LDAKKwkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMUNoXSxlYXgKKwkJbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMThoXSxlZHgKK0wyOgorCQlvciAgICAgICAgICBlYXgsZWF4CisJCWpuZSAgICAgICAgIEwzCisJCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxOGhdCisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxNGhdCisJCXhvciAgICAgICAgIGVkeCxlZHgKKwkJZGl2ICAgICAgICAgZWN4CisJCW1vdiAgICAgICAgIGVieCxlYXgKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJZGl2ICAgICAgICAgZWN4CisJCW1vdiAgICAgICAgIGVzaSxlYXgKKwkJbW92ICAgICAgICAgZWF4LGVieAorCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCisJCW1vdiAgICAgICAgIGVjeCxlYXgKKwkJbW92ICAgICAgICAgZWF4LGVzaQorCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxOGhdCisJCWFkZCAgICAgICAgIGVkeCxlY3gKKwkJam1wICAgICAgICAgTDQKK0wzOgorCQltb3YgICAgICAgICBlYngsZWF4CisJCW1vdiAgICAgICAgIGVjeCxkd29yZCBwdHIgW2VzcCsxOGhdCisJCW1vdiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxNGhdCisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxMGhdCitMNToKKwkJc2hyICAgICAgICAgZWJ4LDEKKwkJcmNyICAgICAgICAgZWN4LDEKKwkJc2hyICAgICAgICAgZWR4LDEKKwkJcmNyICAgICAgICAgZWF4LDEKKwkJb3IgICAgICAgICAgZWJ4LGVieAorCQlqbmUgICAgICAgICBMNQorCQlkaXYgICAgICAgICBlY3gKKwkJbW92ICAgICAgICAgZXNpLGVheAorCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxQ2hdCisJCW1vdiAgICAgICAgIGVjeCxlYXgKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE4aF0KKwkJbXVsICAgICAgICAgZXNpCisJCWFkZCAgICAgICAgIGVkeCxlY3gKKwkJamIgICAgICAgICAgTDYKKwkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJamEgICAgICAgICAgTDYKKwkJamIgICAgICAgICAgTDcKKwkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJamJlICAgICAgICAgTDcKK0w2OgorCQlkZWMgICAgICAgICBlc2kKKwkJc3ViICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE4aF0KKwkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzFDaF0KK0w3OgorCQl4b3IgICAgICAgICBlYngsZWJ4CitMNDoKKwkJc3ViICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJc2JiICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJZGVjICAgICAgICAgZWJwCisJCWpucyAgICAgICAgIEw5CisJCW5lZyAgICAgICAgIGVkeAorCQluZWcgICAgICAgICBlYXgKKwkJc2JiICAgICAgICAgZWR4LDAKK0w5OgorCQltb3YgICAgICAgICBlY3gsZWR4CisJCW1vdiAgICAgICAgIGVkeCxlYngKKwkJbW92ICAgICAgICAgZWJ4LGVjeAorCQltb3YgICAgICAgICBlY3gsZWF4CisJCW1vdiAgICAgICAgIGVheCxlc2kKKwkJZGVjICAgICAgICAgZWRpCisJCWpuZSAgICAgICAgIEw4CisJCW5lZyAgICAgICAgIGVkeAorCQluZWcgICAgICAgICBlYXgKKwkJc2JiICAgICAgICAgZWR4LDAKK0w4OgorCQlwb3AgICAgICAgICBlYnAKKwkJcG9wICAgICAgICAgZXNpCisJCXBvcCAgICAgICAgIGVkaQorCQlyZXQgICAgICAgICAxMGgKKwl9Cit9Cit2b2lkIF9fZGVjbHNwZWMobmFrZWQpIF9hdWxsZHZybSgpCit7CisJX19hc20geworCQlwdXNoICAgICAgICBlc2kKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzE0aF0KKwkJb3IgICAgICAgICAgZWF4LGVheAorCQlqbmUgICAgICAgICBMMQorCQltb3YgICAgICAgICBlY3gsZHdvcmQgcHRyIFtlc3ArMTBoXQorCQltb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlc3ArMENoXQorCQl4b3IgICAgICAgICBlZHgsZWR4CisJCWRpdiAgICAgICAgIGVjeAorCQltb3YgICAgICAgICBlYngsZWF4CisJCW1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCs4XQorCQlkaXYgICAgICAgICBlY3gKKwkJbW92ICAgICAgICAgZXNpLGVheAorCQltb3YgICAgICAgICBlYXgsZWJ4CisJCW11bCAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJbW92ICAgICAgICAgZWN4LGVheAorCQltb3YgICAgICAgICBlYXgsZXNpCisJCW11bCAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJYWRkICAgICAgICAgZWR4LGVjeAorCQlqbXAgICAgICAgICBMMgorTDE6CisJCW1vdiAgICAgICAgIGVjeCxlYXgKKwkJbW92ICAgICAgICAgZWJ4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJbW92ICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzhdCitMMzoKKwkJc2hyICAgICAgICAgZWN4LDEKKwkJcmNyICAgICAgICAgZWJ4LDEKKwkJc2hyICAgICAgICAgZWR4LDEKKwkJcmNyICAgICAgICAgZWF4LDEKKwkJb3IgICAgICAgICAgZWN4LGVjeAorCQlqbmUgICAgICAgICBMMworCQlkaXYgICAgICAgICBlYngKKwkJbW92ICAgICAgICAgZXNpLGVheAorCQltdWwgICAgICAgICBkd29yZCBwdHIgW2VzcCsxNGhdCisJCW1vdiAgICAgICAgIGVjeCxlYXgKKwkJbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzEwaF0KKwkJbXVsICAgICAgICAgZXNpCisJCWFkZCAgICAgICAgIGVkeCxlY3gKKwkJamIgICAgICAgICAgTDQKKwkJY21wICAgICAgICAgZWR4LGR3b3JkIHB0ciBbZXNwKzBDaF0KKwkJamEgICAgICAgICAgTDQKKwkJamIgICAgICAgICAgTDUKKwkJY21wICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzhdCisJCWpiZSAgICAgICAgIEw1CitMNDoKKwkJZGVjICAgICAgICAgZXNpCisJCXN1YiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCsxMGhdCisJCXNiYiAgICAgICAgIGVkeCxkd29yZCBwdHIgW2VzcCsxNGhdCitMNToKKwkJeG9yICAgICAgICAgZWJ4LGVieAorTDI6CisJCXN1YiAgICAgICAgIGVheCxkd29yZCBwdHIgW2VzcCs4XQorCQlzYmIgICAgICAgICBlZHgsZHdvcmQgcHRyIFtlc3ArMENoXQorCQluZWcgICAgICAgICBlZHgKKwkJbmVnICAgICAgICAgZWF4CisJCXNiYiAgICAgICAgIGVkeCwwCisJCW1vdiAgICAgICAgIGVjeCxlZHgKKwkJbW92ICAgICAgICAgZWR4LGVieAorCQltb3YgICAgICAgICBlYngsZWN4CisJCW1vdiAgICAgICAgIGVjeCxlYXgKKwkJbW92ICAgICAgICAgZWF4LGVzaQorCQlwb3AgICAgICAgICBlc2kKKwkJcmV0ICAgICAgICAgMTBoCisJfQorfQordm9pZCBfX2RlY2xzcGVjKG5ha2VkKSBfYWxsc2hsKCkKK3sKKwlfX2FzbSB7CisJCWNtcCAgICAgICAgIGNsLDQwaAorCQlqYWUgICAgICAgICBSRVRaRVJPCisJCWNtcCAgICAgICAgIGNsLDIwaAorCQlqYWUgICAgICAgICBNT1JFMzIKKwkJc2hsZCAgICAgICAgZWR4LGVheCxjbAorCQlzaGwgICAgICAgICBlYXgsY2wKKwkJcmV0CitNT1JFMzI6CisJCW1vdiAgICAgICAgIGVkeCxlYXgKKwkJeG9yICAgICAgICAgZWF4LGVheAorCQlhbmQgICAgICAgICBjbCwxRmgKKwkJc2hsICAgICAgICAgZWR4LGNsCisJCXJldAorUkVUWkVSTzoKKwkJeG9yICAgICAgICAgZWF4LGVheAorCQl4b3IgICAgICAgICBlZHgsZWR4CisJCXJldAorCX0KK30KK3ZvaWQgX19kZWNsc3BlYyhuYWtlZCkgX2F1bGxzaHIoKQoreworCV9fYXNtIHsKKwkJY21wICAgICAgICAgY2wsNDBoCisJCWphZSAgICAgICAgIFJFVFpFUk8KKwkJY21wICAgICAgICAgY2wsMjBoCisJCWphZSAgICAgICAgIE1PUkUzMgorCQlzaHJkICAgICAgICBlYXgsZWR4LGNsCisJCXNociAgICAgICAgIGVkeCxjbAorCQlyZXQKK01PUkUzMjoKKwkJbW92ICAgICAgICAgZWF4LGVkeAorCQl4b3IgICAgICAgICBlZHgsZWR4CisJCWFuZCAgICAgICAgIGNsLDFGaAorCQlzaHIgICAgICAgICBlYXgsY2wKKwkJcmV0CitSRVRaRVJPOgorCQl4b3IgICAgICAgICBlYXgsZWF4CisJCXhvciAgICAgICAgIGVkeCxlZHgKKwkJcmV0CisJfQorfQorCisjZW5kaWYgLyogTVNDX1ZFUiAqLworCisjZW5kaWYgLyogIUhBVkVfTElCQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX3N0cmluZy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy9zdGRsaWIvU0RMX3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MGE2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3N0ZGxpYi9TRExfc3RyaW5nLmMKQEAgLTAsMCArMSwxMjQ4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHBvcnRhYmxlIHN0cmluZyBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIGZvciBTREwgKi8KKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKworCisjZGVmaW5lIFNETF9pc3VwcGVyaGV4KFgpICAgKCgoWCkgPj0gJ0EnKSAmJiAoKFgpIDw9ICdGJykpCisjZGVmaW5lIFNETF9pc2xvd2VyaGV4KFgpICAgKCgoWCkgPj0gJ2EnKSAmJiAoKFgpIDw9ICdmJykpCisKKyNpZiAhZGVmaW5lZChIQVZFX1NTQ0FORikgfHwgIWRlZmluZWQoSEFWRV9TVFJUT0wpCitzdGF0aWMgc2l6ZV90IFNETF9TY2FuTG9uZyhjb25zdCBjaGFyICp0ZXh0LCBpbnQgcmFkaXgsIGxvbmcgKnZhbHVlcCkKK3sKKyAgICBjb25zdCBjaGFyICp0ZXh0c3RhcnQgPSB0ZXh0OworICAgIGxvbmcgdmFsdWUgPSAwOworICAgIFNETF9ib29sIG5lZ2F0aXZlID0gU0RMX0ZBTFNFOworCisgICAgaWYgKCAqdGV4dCA9PSAnLScgKSB7CisgICAgICAgIG5lZ2F0aXZlID0gU0RMX1RSVUU7CisgICAgICAgICsrdGV4dDsKKyAgICB9CisgICAgaWYgKCByYWRpeCA9PSAxNiAmJiBTRExfc3RybmNtcCh0ZXh0LCAiMHgiLCAyKSA9PSAwICkgeworICAgICAgICB0ZXh0ICs9IDI7CisgICAgfQorICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaW50IHY7CisgICAgICAgIGlmICggU0RMX2lzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICp0ZXh0KSApIHsKKyAgICAgICAgICAgIHYgPSAqdGV4dCAtICcwJzsKKyAgICAgICAgfSBlbHNlIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX2lzdXBwZXJoZXgoKnRleHQpICkgeworICAgICAgICAgICAgdiA9IDEwICsgKCp0ZXh0IC0gJ0EnKTsKKyAgICAgICAgfSBlbHNlIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX2lzbG93ZXJoZXgoKnRleHQpICkgeworICAgICAgICAgICAgdiA9IDEwICsgKCp0ZXh0IC0gJ2EnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZhbHVlICo9IHJhZGl4OworICAgICAgICB2YWx1ZSArPSB2OworICAgICAgICArK3RleHQ7CisgICAgfQorICAgIGlmICggdmFsdWVwICkgeworICAgICAgICBpZiAoIG5lZ2F0aXZlICYmIHZhbHVlICkgeworICAgICAgICAgICAgKnZhbHVlcCA9IC12YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHRleHQgLSB0ZXh0c3RhcnQpOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX1NTQ0FORikgfHwgIWRlZmluZWQoSEFWRV9TVFJUT1VMKSB8fCAhZGVmaW5lZChIQVZFX1NUUlRPRCkKK3N0YXRpYyBzaXplX3QgU0RMX1NjYW5VbnNpZ25lZExvbmcoY29uc3QgY2hhciAqdGV4dCwgaW50IHJhZGl4LCB1bnNpZ25lZCBsb25nICp2YWx1ZXApCit7CisgICAgY29uc3QgY2hhciAqdGV4dHN0YXJ0ID0gdGV4dDsKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKKworICAgIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX3N0cm5jbXAodGV4dCwgIjB4IiwgMikgPT0gMCApIHsKKyAgICAgICAgdGV4dCArPSAyOworICAgIH0KKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIGludCB2OworICAgICAgICBpZiAoIFNETF9pc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqdGV4dCkgKSB7CisgICAgICAgICAgICB2ID0gKnRleHQgLSAnMCc7CisgICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc3VwcGVyaGV4KCp0ZXh0KSApIHsKKyAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdBJyk7CisgICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc2xvd2VyaGV4KCp0ZXh0KSApIHsKKyAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdhJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSAqPSByYWRpeDsKKyAgICAgICAgdmFsdWUgKz0gdjsKKyAgICAgICAgKyt0ZXh0OworICAgIH0KKyAgICBpZiAoIHZhbHVlcCApIHsKKyAgICAgICAgKnZhbHVlcCA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gKHRleHQgLSB0ZXh0c3RhcnQpOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TU0NBTkYKK3N0YXRpYyBzaXplX3QgU0RMX1NjYW5VaW50UHRyVChjb25zdCBjaGFyICp0ZXh0LCBpbnQgcmFkaXgsIHVpbnRwdHJfdCAqdmFsdWVwKQoreworICAgIGNvbnN0IGNoYXIgKnRleHRzdGFydCA9IHRleHQ7CisgICAgdWludHB0cl90IHZhbHVlID0gMDsKKworICAgIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX3N0cm5jbXAodGV4dCwgIjB4IiwgMikgPT0gMCApIHsKKyAgICAgICAgdGV4dCArPSAyOworICAgIH0KKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIGludCB2OworICAgICAgICBpZiAoIFNETF9pc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqdGV4dCkgKSB7CisgICAgICAgICAgICB2ID0gKnRleHQgLSAnMCc7CisgICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc3VwcGVyaGV4KCp0ZXh0KSApIHsKKyAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdBJyk7CisgICAgICAgIH0gZWxzZSBpZiAoIHJhZGl4ID09IDE2ICYmIFNETF9pc2xvd2VyaGV4KCp0ZXh0KSApIHsKKyAgICAgICAgICAgIHYgPSAxMCArICgqdGV4dCAtICdhJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSAqPSByYWRpeDsKKyAgICAgICAgdmFsdWUgKz0gdjsKKyAgICAgICAgKyt0ZXh0OworICAgIH0KKyAgICBpZiAoIHZhbHVlcCApIHsKKyAgICAgICAgKnZhbHVlcCA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gKHRleHQgLSB0ZXh0c3RhcnQpOworfQorI2VuZGlmCisKKyNpZmRlZiBTRExfSEFTXzY0QklUX1RZUEUKKyNpZiAhZGVmaW5lZChIQVZFX1NTQ0FORikgfHwgIWRlZmluZWQoSEFWRV9TVFJUT0xMKQorc3RhdGljIHNpemVfdCBTRExfU2NhbkxvbmdMb25nKGNvbnN0IGNoYXIgKnRleHQsIGludCByYWRpeCwgU2ludDY0ICp2YWx1ZXApCit7CisgICAgY29uc3QgY2hhciAqdGV4dHN0YXJ0ID0gdGV4dDsKKyAgICBTaW50NjQgdmFsdWUgPSAwOworICAgIFNETF9ib29sIG5lZ2F0aXZlID0gU0RMX0ZBTFNFOworCisgICAgaWYgKCAqdGV4dCA9PSAnLScgKSB7CisgICAgICAgIG5lZ2F0aXZlID0gU0RMX1RSVUU7CisgICAgICAgICsrdGV4dDsKKyAgICB9CisgICAgaWYgKCByYWRpeCA9PSAxNiAmJiBTRExfc3RybmNtcCh0ZXh0LCAiMHgiLCAyKSA9PSAwICkgeworICAgICAgICB0ZXh0ICs9IDI7CisgICAgfQorICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaW50IHY7CisgICAgICAgIGlmICggU0RMX2lzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICp0ZXh0KSApIHsKKyAgICAgICAgICAgIHYgPSAqdGV4dCAtICcwJzsKKyAgICAgICAgfSBlbHNlIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX2lzdXBwZXJoZXgoKnRleHQpICkgeworICAgICAgICAgICAgdiA9IDEwICsgKCp0ZXh0IC0gJ0EnKTsKKyAgICAgICAgfSBlbHNlIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX2lzbG93ZXJoZXgoKnRleHQpICkgeworICAgICAgICAgICAgdiA9IDEwICsgKCp0ZXh0IC0gJ2EnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZhbHVlICo9IHJhZGl4OworICAgICAgICB2YWx1ZSArPSB2OworICAgICAgICArK3RleHQ7CisgICAgfQorICAgIGlmICggdmFsdWVwICkgeworICAgICAgICBpZiAoIG5lZ2F0aXZlICYmIHZhbHVlICkgeworICAgICAgICAgICAgKnZhbHVlcCA9IC12YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHRleHQgLSB0ZXh0c3RhcnQpOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX1NTQ0FORikgfHwgIWRlZmluZWQoSEFWRV9TVFJUT1VMTCkKK3N0YXRpYyBzaXplX3QgU0RMX1NjYW5VbnNpZ25lZExvbmdMb25nKGNvbnN0IGNoYXIgKnRleHQsIGludCByYWRpeCwgVWludDY0ICp2YWx1ZXApCit7CisgICAgY29uc3QgY2hhciAqdGV4dHN0YXJ0ID0gdGV4dDsKKyAgICBVaW50NjQgdmFsdWUgPSAwOworCisgICAgaWYgKCByYWRpeCA9PSAxNiAmJiBTRExfc3RybmNtcCh0ZXh0LCAiMHgiLCAyKSA9PSAwICkgeworICAgICAgICB0ZXh0ICs9IDI7CisgICAgfQorICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaW50IHY7CisgICAgICAgIGlmICggU0RMX2lzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICp0ZXh0KSApIHsKKyAgICAgICAgICAgIHYgPSAqdGV4dCAtICcwJzsKKyAgICAgICAgfSBlbHNlIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX2lzdXBwZXJoZXgoKnRleHQpICkgeworICAgICAgICAgICAgdiA9IDEwICsgKCp0ZXh0IC0gJ0EnKTsKKyAgICAgICAgfSBlbHNlIGlmICggcmFkaXggPT0gMTYgJiYgU0RMX2lzbG93ZXJoZXgoKnRleHQpICkgeworICAgICAgICAgICAgdiA9IDEwICsgKCp0ZXh0IC0gJ2EnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZhbHVlICo9IHJhZGl4OworICAgICAgICB2YWx1ZSArPSB2OworICAgICAgICArK3RleHQ7CisgICAgfQorICAgIGlmICggdmFsdWVwICkgeworICAgICAgICAqdmFsdWVwID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiAodGV4dCAtIHRleHRzdGFydCk7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBTRExfSEFTXzY0QklUX1RZUEUgKi8KKworI2lmICFkZWZpbmVkKEhBVkVfU1NDQU5GKSB8fCAhZGVmaW5lZChIQVZFX1NUUlRPRCkKK3N0YXRpYyBzaXplX3QgU0RMX1NjYW5GbG9hdChjb25zdCBjaGFyICp0ZXh0LCBkb3VibGUgKnZhbHVlcCkKK3sKKyAgICBjb25zdCBjaGFyICp0ZXh0c3RhcnQgPSB0ZXh0OworICAgIHVuc2lnbmVkIGxvbmcgbHZhbHVlID0gMDsKKyAgICBkb3VibGUgdmFsdWUgPSAwLjA7CisgICAgU0RMX2Jvb2wgbmVnYXRpdmUgPSBTRExfRkFMU0U7CisKKyAgICBpZiAoICp0ZXh0ID09ICctJyApIHsKKyAgICAgICAgbmVnYXRpdmUgPSBTRExfVFJVRTsKKyAgICAgICAgKyt0ZXh0OworICAgIH0KKyAgICB0ZXh0ICs9IFNETF9TY2FuVW5zaWduZWRMb25nKHRleHQsIDEwLCAmbHZhbHVlKTsKKyAgICB2YWx1ZSArPSBsdmFsdWU7CisgICAgaWYgKCAqdGV4dCA9PSAnLicgKSB7CisgICAgICAgIGludCBtdWx0ID0gMTA7CisgICAgICAgICsrdGV4dDsKKyAgICAgICAgd2hpbGUgKCBTRExfaXNkaWdpdCgodW5zaWduZWQgY2hhcikgKnRleHQpICkgeworICAgICAgICAgICAgbHZhbHVlID0gKnRleHQgLSAnMCc7CisgICAgICAgICAgICB2YWx1ZSArPSAoZG91YmxlKWx2YWx1ZSAvIG11bHQ7CisgICAgICAgICAgICBtdWx0ICo9IDEwOworICAgICAgICAgICAgKyt0ZXh0OworICAgICAgICB9CisgICAgfQorICAgIGlmICggdmFsdWVwICkgeworICAgICAgICBpZiAoIG5lZ2F0aXZlICYmIHZhbHVlICkgeworICAgICAgICAgICAgKnZhbHVlcCA9IC12YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHRleHQgLSB0ZXh0c3RhcnQpOworfQorI2VuZGlmCisKKyNpZm5kZWYgU0RMX21lbXNldAordm9pZCAqU0RMX21lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3QgbGVuKQoreworICAgIHNpemVfdCBsZWZ0ID0gKGxlbiAlIDQpOworICAgIGlmICggbGVuID49IDQgKSB7CisgICAgICAgIFVpbnQzMiB2YWx1ZSA9IDA7CisgICAgICAgIFVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilkc3Q7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICB2YWx1ZSA8PD0gODsKKyAgICAgICAgICAgIHZhbHVlIHw9IGM7CisgICAgICAgIH0KKyAgICAgICAgbGVuIC89IDQ7CisgICAgICAgIHdoaWxlICggbGVuLS0gKSB7CisgICAgICAgICAgICAqZHN0cCsrID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBsZWZ0ID4gMCApIHsKKyAgICAgICAgVWludDggdmFsdWUgPSAoVWludDgpYzsKKyAgICAgICAgVWludDggKmRzdHAgPSAoVWludDggKilkc3Q7CisJc3dpdGNoKGxlZnQpIHsKKwljYXNlIDM6CisgICAgICAgICAgICAqZHN0cCsrID0gdmFsdWU7CisJY2FzZSAyOgorICAgICAgICAgICAgKmRzdHArKyA9IHZhbHVlOworCWNhc2UgMToKKyAgICAgICAgICAgICpkc3RwKysgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZHN0OworfQorI2VuZGlmCisKKyNpZm5kZWYgU0RMX21lbWNweQordm9pZCAqU0RMX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbikKK3sKKyAgICBjaGFyICpzcmNwID0gKGNoYXIgKilzcmM7CisgICAgY2hhciAqZHN0cCA9IChjaGFyICopZHN0OworICAgIHdoaWxlICggbGVuLS0gKSB7CisgICAgICAgICpkc3RwKysgPSAqc3JjcCsrOworICAgIH0KKyAgICByZXR1cm4gZHN0OworfQorI2VuZGlmCisKKyNpZm5kZWYgU0RMX3JldmNweQordm9pZCAqU0RMX3JldmNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbikKK3sKKyAgICBjaGFyICpzcmNwID0gKGNoYXIgKilzcmM7CisgICAgY2hhciAqZHN0cCA9IChjaGFyICopZHN0OworICAgIHNyY3AgKz0gbGVuLTE7CisgICAgZHN0cCArPSBsZW4tMTsKKyAgICB3aGlsZSAoIGxlbi0tICkgeworICAgICAgICAqZHN0cC0tID0gKnNyY3AtLTsKKyAgICB9CisgICAgcmV0dXJuIGRzdDsKK30KKyNlbmRpZgorCisjaWZuZGVmIFNETF9tZW1jbXAKK2ludCBTRExfbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IGxlbikKK3sKKyAgICBjaGFyICpzMXAgPSAoY2hhciAqKXMxOworICAgIGNoYXIgKnMycCA9IChjaGFyICopczI7CisgICAgd2hpbGUgKCBsZW4tLSApIHsKKyAgICAgICAgaWYgKCAqczFwICE9ICpzMnAgKSB7CisgICAgICAgICAgICByZXR1cm4gKCpzMXAgLSAqczJwKTsKKyAgICB9CisgICAgKytzMXA7CisgICAgKytzMnA7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJMRU4KK3NpemVfdCBTRExfc3RybGVuKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgICBzaXplX3QgbGVuID0gMDsKKyAgICB3aGlsZSAoICpzdHJpbmcrKyApIHsKKyAgICAgICAgKytsZW47CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkxDUFkKK3NpemVfdCBTRExfc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG1heGxlbikKK3sKKyAgICBzaXplX3Qgc3JjbGVuID0gU0RMX3N0cmxlbihzcmMpOworICAgIGlmICggbWF4bGVuID4gMCApIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IFNETF9taW4oc3JjbGVuLCBtYXhsZW4tMSk7CisgICAgICAgIFNETF9tZW1jcHkoZHN0LCBzcmMsIGxlbik7CisgICAgICAgIGRzdFtsZW5dID0gJ1wwJzsKKyAgICB9CisgICAgcmV0dXJuIHNyY2xlbjsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSTENBVAorc2l6ZV90IFNETF9zdHJsY2F0KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbWF4bGVuKQoreworICAgIHNpemVfdCBkc3RsZW4gPSBTRExfc3RybGVuKGRzdCk7CisgICAgc2l6ZV90IHNyY2xlbiA9IFNETF9zdHJsZW4oc3JjKTsKKyAgICBpZiAoIGRzdGxlbiA8IG1heGxlbiApIHsKKyAgICAgICAgU0RMX3N0cmxjcHkoZHN0K2RzdGxlbiwgc3JjLCBtYXhsZW4tZHN0bGVuKTsKKyAgICB9CisgICAgcmV0dXJuIGRzdGxlbitzcmNsZW47Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkRVUAorY2hhciAqU0RMX3N0cmR1cChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgc2l6ZV90IGxlbiA9IFNETF9zdHJsZW4oc3RyaW5nKSsxOworICAgIGNoYXIgKm5ld3N0ciA9IFNETF9tYWxsb2MobGVuKTsKKyAgICBpZiAoIG5ld3N0ciApIHsKKyAgICAgICAgU0RMX3N0cmxjcHkobmV3c3RyLCBzdHJpbmcsIGxlbik7CisgICAgfQorICAgIHJldHVybiBuZXdzdHI7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX19TVFJSRVYKK2NoYXIgKlNETF9zdHJyZXYoY2hhciAqc3RyaW5nKQoreworICAgIHNpemVfdCBsZW4gPSBTRExfc3RybGVuKHN0cmluZyk7CisgICAgY2hhciAqYSA9ICZzdHJpbmdbMF07CisgICAgY2hhciAqYiA9ICZzdHJpbmdbbGVuLTFdOworICAgIGxlbiAvPSAyOworICAgIHdoaWxlICggbGVuLS0gKSB7CisgICAgICAgIGNoYXIgYyA9ICphOworICAgICAgICAqYSsrID0gKmI7CisgICAgICAgICpiLS0gPSBjOworICAgIH0KKyAgICByZXR1cm4gc3RyaW5nOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9fU1RSVVBSCitjaGFyICpTRExfc3RydXByKGNoYXIgKnN0cmluZykKK3sKKyAgICBjaGFyICpidWZwID0gc3RyaW5nOworICAgIHdoaWxlICggKmJ1ZnAgKSB7CisgICAgICAgICpidWZwID0gU0RMX3RvdXBwZXIoKHVuc2lnbmVkIGNoYXIpICpidWZwKTsKKwkrK2J1ZnA7CisgICAgfQorICAgIHJldHVybiBzdHJpbmc7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX19TVFJMV1IKK2NoYXIgKlNETF9zdHJsd3IoY2hhciAqc3RyaW5nKQoreworICAgIGNoYXIgKmJ1ZnAgPSBzdHJpbmc7CisgICAgd2hpbGUgKCAqYnVmcCApIHsKKyAgICAgICAgKmJ1ZnAgPSBTRExfdG9sb3dlcigodW5zaWduZWQgY2hhcikgKmJ1ZnApOworCSsrYnVmcDsKKyAgICB9CisgICAgcmV0dXJuIHN0cmluZzsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSQ0hSCitjaGFyICpTRExfc3RyY2hyKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGMpCit7CisgICAgd2hpbGUgKCAqc3RyaW5nICkgeworICAgICAgICBpZiAoICpzdHJpbmcgPT0gYyApIHsKKyAgICAgICAgICAgIHJldHVybiAoY2hhciAqKXN0cmluZzsKKyAgICAgICAgfQorCSsrc3RyaW5nOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSUkNIUgorY2hhciAqU0RMX3N0cnJjaHIoY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgYykKK3sKKyAgICBjb25zdCBjaGFyICpidWZwID0gc3RyaW5nICsgU0RMX3N0cmxlbihzdHJpbmcpIC0gMTsKKyAgICB3aGlsZSAoIGJ1ZnAgPj0gc3RyaW5nICkgeworICAgICAgICBpZiAoICpidWZwID09IGMgKSB7CisgICAgICAgICAgICByZXR1cm4gKGNoYXIgKilidWZwOworICAgICAgICB9CisJLS1idWZwOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSU1RSCitjaGFyICpTRExfc3Ryc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpCit7CisgICAgc2l6ZV90IGxlbmd0aCA9IFNETF9zdHJsZW4obmVlZGxlKTsKKyAgICB3aGlsZSAoICpoYXlzdGFjayApIHsKKyAgICAgICAgaWYgKCBTRExfc3RybmNtcChoYXlzdGFjaywgbmVlZGxlLCBsZW5ndGgpID09IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gKGNoYXIgKiloYXlzdGFjazsKKyAgICAgICAgfQorCSsraGF5c3RhY2s7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX19MVE9BKSAgfHwgIWRlZmluZWQoSEFWRV9fSTY0VE9BKSB8fCBcCisgICAgIWRlZmluZWQoSEFWRV9fVUxUT0EpIHx8ICFkZWZpbmVkKEhBVkVfX1VJNjRUT0EpCitzdGF0aWMgY29uc3QgY2hhciBudG9hX3RhYmxlW10gPSB7CisgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorICAgICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywKKyAgICAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsCisgICAgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJworfTsKKyNlbmRpZiAvKiBudG9hKCkgY29udmVyc2lvbiB0YWJsZSAqLworCisjaWZuZGVmIEhBVkVfX0xUT0EKK2NoYXIgKlNETF9sdG9hKGxvbmcgdmFsdWUsIGNoYXIgKnN0cmluZywgaW50IHJhZGl4KQoreworICAgIGNoYXIgKmJ1ZnAgPSBzdHJpbmc7CisKKyAgICBpZiAoIHZhbHVlIDwgMCApIHsKKyAgICAgICAgKmJ1ZnArKyA9ICctJzsKKyAgICAgICAgdmFsdWUgPSAtdmFsdWU7CisgICAgfQorICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIHdoaWxlICggdmFsdWUgPiAwICkgeworICAgICAgICAgICAgKmJ1ZnArKyA9IG50b2FfdGFibGVbdmFsdWUgJSByYWRpeF07CisgICAgICAgICAgICB2YWx1ZSAvPSByYWRpeDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpidWZwKysgPSAnMCc7CisgICAgfQorICAgICpidWZwID0gJ1wwJzsKKworICAgIC8qIFRoZSBudW1iZXJzIHdlbnQgaW50byB0aGUgc3RyaW5nIGJhY2t3YXJkcy4gOikgKi8KKyAgICBpZiAoICpzdHJpbmcgPT0gJy0nICkgeworICAgICAgICBTRExfc3RycmV2KHN0cmluZysxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTRExfc3RycmV2KHN0cmluZyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmluZzsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfX1VMVE9BCitjaGFyICpTRExfdWx0b2EodW5zaWduZWQgbG9uZyB2YWx1ZSwgY2hhciAqc3RyaW5nLCBpbnQgcmFkaXgpCit7CisgICAgY2hhciAqYnVmcCA9IHN0cmluZzsKKworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIHdoaWxlICggdmFsdWUgPiAwICkgeworICAgICAgICAgICAgKmJ1ZnArKyA9IG50b2FfdGFibGVbdmFsdWUgJSByYWRpeF07CisgICAgICAgICAgICB2YWx1ZSAvPSByYWRpeDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpidWZwKysgPSAnMCc7CisgICAgfQorICAgICpidWZwID0gJ1wwJzsKKworICAgIC8qIFRoZSBudW1iZXJzIHdlbnQgaW50byB0aGUgc3RyaW5nIGJhY2t3YXJkcy4gOikgKi8KKyAgICBTRExfc3RycmV2KHN0cmluZyk7CisKKyAgICByZXR1cm4gc3RyaW5nOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJUT0wKK2xvbmcgU0RMX3N0cnRvbChjb25zdCBjaGFyICpzdHJpbmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sKKyAgICBzaXplX3QgbGVuOworICAgIGxvbmcgdmFsdWU7CisKKyAgICBpZiAoICFiYXNlICkgeworICAgICAgICBpZiAoIChTRExfc3RybGVuKHN0cmluZykgPiAyKSAmJiAoU0RMX3N0cm5jbXAoc3RyaW5nLCAiMHgiLCAyKSA9PSAwKSApIHsKKyAgICAgICAgICAgIGJhc2UgPSAxNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2UgPSAxMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxlbiA9IFNETF9TY2FuTG9uZyhzdHJpbmcsIGJhc2UsICZ2YWx1ZSk7CisgICAgaWYgKCBlbmRwICkgeworICAgICAgICAqZW5kcCA9IChjaGFyICopc3RyaW5nICsgbGVuOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlRPVUwKK3Vuc2lnbmVkIGxvbmcgU0RMX3N0cnRvdWwoY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCit7CisgICAgc2l6ZV90IGxlbjsKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworCisgICAgaWYgKCAhYmFzZSApIHsKKyAgICAgICAgaWYgKCAoU0RMX3N0cmxlbihzdHJpbmcpID4gMikgJiYgKFNETF9zdHJuY21wKHN0cmluZywgIjB4IiwgMikgPT0gMCkgKSB7CisgICAgICAgICAgICBiYXNlID0gMTY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW4gPSBTRExfU2NhblVuc2lnbmVkTG9uZyhzdHJpbmcsIGJhc2UsICZ2YWx1ZSk7CisgICAgaWYgKCBlbmRwICkgeworICAgICAgICAqZW5kcCA9IChjaGFyICopc3RyaW5nICsgbGVuOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisjZW5kaWYKKworI2lmZGVmIFNETF9IQVNfNjRCSVRfVFlQRQorCisjaWZuZGVmIEhBVkVfX0k2NFRPQQorY2hhciAqU0RMX2xsdG9hKFNpbnQ2NCB2YWx1ZSwgY2hhciAqc3RyaW5nLCBpbnQgcmFkaXgpCit7CisgICAgY2hhciAqYnVmcCA9IHN0cmluZzsKKworICAgIGlmICggdmFsdWUgPCAwICkgeworICAgICAgICAqYnVmcCsrID0gJy0nOworICAgICAgICB2YWx1ZSA9IC12YWx1ZTsKKyAgICB9CisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgd2hpbGUgKCB2YWx1ZSA+IDAgKSB7CisgICAgICAgICAgICAqYnVmcCsrID0gbnRvYV90YWJsZVt2YWx1ZSAlIHJhZGl4XTsKKyAgICAgICAgICAgIHZhbHVlIC89IHJhZGl4OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmJ1ZnArKyA9ICcwJzsKKyAgICB9CisgICAgKmJ1ZnAgPSAnXDAnOworCisgICAgLyogVGhlIG51bWJlcnMgd2VudCBpbnRvIHRoZSBzdHJpbmcgYmFja3dhcmRzLiA6KSAqLworICAgIGlmICggKnN0cmluZyA9PSAnLScgKSB7CisgICAgICAgIFNETF9zdHJyZXYoc3RyaW5nKzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFNETF9zdHJyZXYoc3RyaW5nKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyaW5nOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9fVUk2NFRPQQorY2hhciAqU0RMX3VsbHRvYShVaW50NjQgdmFsdWUsIGNoYXIgKnN0cmluZywgaW50IHJhZGl4KQoreworICAgIGNoYXIgKmJ1ZnAgPSBzdHJpbmc7CisKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICB3aGlsZSAoIHZhbHVlID4gMCApIHsKKyAgICAgICAgICAgICpidWZwKysgPSBudG9hX3RhYmxlW3ZhbHVlICUgcmFkaXhdOworICAgICAgICAgICAgdmFsdWUgLz0gcmFkaXg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqYnVmcCsrID0gJzAnOworICAgIH0KKyAgICAqYnVmcCA9ICdcMCc7CisKKyAgICAvKiBUaGUgbnVtYmVycyB3ZW50IGludG8gdGhlIHN0cmluZyBiYWNrd2FyZHMuIDopICovCisgICAgU0RMX3N0cnJldihzdHJpbmcpOworCisgICAgcmV0dXJuIHN0cmluZzsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSVE9MTAorU2ludDY0IFNETF9zdHJ0b2xsKGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworICAgIHNpemVfdCBsZW47CisgICAgU2ludDY0IHZhbHVlOworCisgICAgaWYgKCAhYmFzZSApIHsKKyAgICAgICAgaWYgKCAoU0RMX3N0cmxlbihzdHJpbmcpID4gMikgJiYgKFNETF9zdHJuY21wKHN0cmluZywgIjB4IiwgMikgPT0gMCkgKSB7CisgICAgICAgICAgICBiYXNlID0gMTY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW4gPSBTRExfU2NhbkxvbmdMb25nKHN0cmluZywgYmFzZSwgJnZhbHVlKTsKKyAgICBpZiAoIGVuZHAgKSB7CisgICAgICAgICplbmRwID0gKGNoYXIgKilzdHJpbmcgKyBsZW47CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSVE9VTEwKK1VpbnQ2NCBTRExfc3RydG91bGwoY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCit7CisgICAgc2l6ZV90IGxlbjsKKyAgICBVaW50NjQgdmFsdWU7CisKKyAgICBpZiAoICFiYXNlICkgeworICAgICAgICBpZiAoIChTRExfc3RybGVuKHN0cmluZykgPiAyKSAmJiAoU0RMX3N0cm5jbXAoc3RyaW5nLCAiMHgiLCAyKSA9PSAwKSApIHsKKyAgICAgICAgICAgIGJhc2UgPSAxNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2UgPSAxMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxlbiA9IFNETF9TY2FuVW5zaWduZWRMb25nTG9uZyhzdHJpbmcsIGJhc2UsICZ2YWx1ZSk7CisgICAgaWYgKCBlbmRwICkgeworICAgICAgICAqZW5kcCA9IChjaGFyICopc3RyaW5nICsgbGVuOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNETF9IQVNfNjRCSVRfVFlQRSAqLworCisjaWZuZGVmIEhBVkVfU1RSVE9ECitkb3VibGUgU0RMX3N0cnRvZChjb25zdCBjaGFyICpzdHJpbmcsIGNoYXIgKiplbmRwKQoreworICAgIHNpemVfdCBsZW47CisgICAgZG91YmxlIHZhbHVlOworCisgICAgbGVuID0gU0RMX1NjYW5GbG9hdChzdHJpbmcsICZ2YWx1ZSk7CisgICAgaWYgKCBlbmRwICkgeworICAgICAgICAqZW5kcCA9IChjaGFyICopc3RyaW5nICsgbGVuOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkNNUAoraW50IFNETF9zdHJjbXAoY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMikKK3sKKyAgICB3aGlsZSAoKnN0cjEgJiYgKnN0cjIpIHsKKyAgICAgICAgaWYgKCAqc3RyMSAhPSAqc3RyMiApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKytzdHIxOworICAgICAgICArK3N0cjI7CisgICAgfQorICAgIHJldHVybiAoaW50KSgodW5zaWduZWQgY2hhcikqc3RyMSAtICh1bnNpZ25lZCBjaGFyKSpzdHIyKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSTkNNUAoraW50IFNETF9zdHJuY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIsIHNpemVfdCBtYXhsZW4pCit7CisgICAgd2hpbGUgKCAqc3RyMSAmJiAqc3RyMiAmJiBtYXhsZW4gKSB7CisgICAgICAgIGlmICggKnN0cjEgIT0gKnN0cjIgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrc3RyMTsKKyAgICAgICAgKytzdHIyOworICAgICAgICAtLW1heGxlbjsKKyAgICB9CisgICAgaWYgKCAhIG1heGxlbiApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAoaW50KSgodW5zaWduZWQgY2hhcikqc3RyMSAtICh1bnNpZ25lZCBjaGFyKSpzdHIyKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9TVFJDQVNFQ01QKSAmJiAhZGVmaW5lZChIQVZFX19TVFJJQ01QKQoraW50IFNETF9zdHJjYXNlY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpCit7CisgICAgY2hhciBhID0gMDsKKyAgICBjaGFyIGIgPSAwOworICAgIHdoaWxlICggKnN0cjEgJiYgKnN0cjIgKSB7CisgICAgICAgIGEgPSBTRExfdG9sb3dlcigodW5zaWduZWQgY2hhcikgKnN0cjEpOworICAgICAgICBiID0gU0RMX3RvbG93ZXIoKHVuc2lnbmVkIGNoYXIpICpzdHIyKTsKKyAgICAgICAgaWYgKCBhICE9IGIgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrc3RyMTsKKyAgICAgICAgKytzdHIyOworICAgIH0KKyAgICByZXR1cm4gKGludCkoKHVuc2lnbmVkIGNoYXIpYSAtICh1bnNpZ25lZCBjaGFyKWIpOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX1NUUk5DQVNFQ01QKSAmJiAhZGVmaW5lZChIQVZFX19TVFJOSUNNUCkKK2ludCBTRExfc3RybmNhc2VjbXAoY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiwgc2l6ZV90IG1heGxlbikKK3sKKyAgICBjaGFyIGEgPSAwOworICAgIGNoYXIgYiA9IDA7CisgICAgd2hpbGUgKCAqc3RyMSAmJiAqc3RyMiAmJiBtYXhsZW4gKSB7CisgICAgICAgIGEgPSBTRExfdG9sb3dlcigodW5zaWduZWQgY2hhcikgKnN0cjEpOworICAgICAgICBiID0gU0RMX3RvbG93ZXIoKHVuc2lnbmVkIGNoYXIpICpzdHIyKTsKKyAgICAgICAgaWYgKCBhICE9IGIgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrc3RyMTsKKyAgICAgICAgKytzdHIyOworICAgICAgICAtLW1heGxlbjsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpKCh1bnNpZ25lZCBjaGFyKWEgLSAodW5zaWduZWQgY2hhciliKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1NDQU5GCitpbnQgU0RMX3NzY2FuZihjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIGludCByZXR2YWwgPSAwOworCisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgd2hpbGUgKCAqZm10ICkgeworICAgICAgICBpZiAoICpmbXQgPT0gJyAnICkgeworICAgICAgICAgICAgd2hpbGUgKCBTRExfaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnRleHQpICkgeworICAgICAgICAgICAgICAgICsrdGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrZm10OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAqZm10ID09ICclJyApIHsKKyAgICAgICAgICAgIFNETF9ib29sIGRvbmUgPSBTRExfRkFMU0U7CisgICAgICAgICAgICBsb25nIGNvdW50ID0gMDsKKyAgICAgICAgICAgIGludCByYWRpeCA9IDEwOworICAgICAgICAgICAgZW51bSB7CisgICAgICAgICAgICAgICAgRE9fU0hPUlQsCisgICAgICAgICAgICAgICAgRE9fSU5ULAorICAgICAgICAgICAgICAgIERPX0xPTkcsCisgICAgICAgICAgICAgICAgRE9fTE9OR0xPTkcKKyAgICAgICAgICAgIH0gaW50dHlwZSA9IERPX0lOVDsKKyAgICAgICAgICAgIFNETF9ib29sIHN1cHByZXNzID0gU0RMX0ZBTFNFOworCisgICAgICAgICAgICArK2ZtdDsKKyAgICAgICAgICAgIGlmICggKmZtdCA9PSAnJScgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAqdGV4dCA9PSAnJScgKSB7CisgICAgICAgICAgICAgICAgICAgICsrdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgKytmbXQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggKmZtdCA9PSAnKicgKSB7CisgICAgICAgICAgICAgICAgc3VwcHJlc3MgPSBTRExfVFJVRTsKKyAgICAgICAgICAgICAgICArK2ZtdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZtdCArPSBTRExfU2NhbkxvbmcoZm10LCAxMCwgJmNvdW50KTsKKworICAgICAgICAgICAgaWYgKCAqZm10ID09ICdjJyApIHsKKyAgICAgICAgICAgICAgICBpZiAoICEgY291bnQgKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBzdXBwcmVzcyApIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBjb3VudC0tICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKyt0ZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqdmFsdWVwID0gdmFfYXJnKGFwLCBjaGFyKik7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICggY291bnQtLSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZXArKyA9ICp0ZXh0Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytyZXR2YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoIFNETF9pc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqdGV4dCkgKSB7CisgICAgICAgICAgICAgICAgKyt0ZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBGSVhNRTogaW1wbGVtZW50IG1vcmUgb2YgdGhlIGZvcm1hdCBzcGVjaWZpZXJzICovCisgICAgICAgICAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goKmZtdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzID0gU0RMX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGludHR5cGUgPiBET19TSE9SVCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2ludHR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGludHR5cGUgPCBET19MT05HTE9ORyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2ludHR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIFNETF9zdHJuY21wKGZtdCwgIkk2NCIsIDMpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10ICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50dHlwZSA9IERPX0xPTkdMT05HOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0ZXh0W2luZGV4XSA9PSAnLScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdGV4dFtpbmRleF0gPT0gJzAnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIFNETF90b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSB0ZXh0W2luZGV4KzFdKSA9PSAneCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpeCA9IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXggPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvICVkIGhhbmRsaW5nICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgorI2lmZGVmIFNETF9IQVNfNjRCSVRfVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnR0eXBlID09IERPX0xPTkdMT05HICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbnQ2NCB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFNETF9TY2FuTG9uZ0xvbmcodGV4dCwgcmFkaXgsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHN1cHByZXNzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW50NjQgKnZhbHVlcCA9IHZhX2FyZyhhcCwgU2ludDY0Kik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytyZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIFNETF9IQVNfNjRCSVRfVFlQRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBTRExfU2NhbkxvbmcodGV4dCwgcmFkaXgsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHN1cHByZXNzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGludHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fU0hPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzaG9ydCogdmFsdWVwID0gdmFfYXJnKGFwLCBzaG9ydCopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwID0gKHNob3J0KXZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fSU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaW50KiB2YWx1ZXAgPSB2YV9hcmcoYXAsIGludCopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwID0gKGludCl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX0xPTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBsb25nKiB2YWx1ZXAgPSB2YV9hcmcoYXAsIGxvbmcqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlcCA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fTE9OR0xPTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGFuZGxlZCBhYm92ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBTRExfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmFkaXggPT0gMTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXggPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIHVuc2lnbmVkIGhhbmRsaW5nICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmFkaXggPT0gMTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXggPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byB1bnNpZ25lZCBoYW5kbGluZyAqLworICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoKKyNpZmRlZiBTRExfSEFTXzY0QklUX1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW50dHlwZSA9PSBET19MT05HTE9ORyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50NjQgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBTRExfU2NhblVuc2lnbmVkTG9uZ0xvbmcodGV4dCwgcmFkaXgsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHN1cHByZXNzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50NjQgKnZhbHVlcCA9IHZhX2FyZyhhcCwgVWludDY0Kik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytyZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIFNETF9IQVNfNjRCSVRfVFlQRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBTRExfU2NhblVuc2lnbmVkTG9uZyh0ZXh0LCByYWRpeCwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgc3VwcHJlc3MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaW50dHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBET19TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHNob3J0KiB2YWx1ZXAgPSB2YV9hcmcoYXAsIHNob3J0Kik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZXAgPSAoc2hvcnQpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBET19JTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpbnQqIHZhbHVlcCA9IHZhX2FyZyhhcCwgaW50Kik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZXAgPSAoaW50KXZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGxvbmcqIHZhbHVlcCA9IHZhX2FyZyhhcCwgbG9uZyopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBET19MT05HTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGVkIGFib3ZlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytyZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFNETF9TY2FuVWludFB0clQodGV4dCwgMTYsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHN1cHByZXNzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogdmFsdWVwID0gdmFfYXJnKGFwLCB2b2lkKiopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWVwID0gKHZvaWQqKXZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3JldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gU0RMX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gU0RMX1NjYW5GbG9hdCh0ZXh0LCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBzdXBwcmVzcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZhbHVlcCA9IHZhX2FyZyhhcCwgZmxvYXQqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlcCA9IChmbG9hdCl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytyZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdXBwcmVzcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoICFTRExfaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnRleHQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3RleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY291bnQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIC0tY291bnQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdmFsdWVwID0gdmFfYXJnKGFwLCBjaGFyKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAhU0RMX2lzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICp0ZXh0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlcCsrID0gKnRleHQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjb3VudCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggLS1jb3VudCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZXAgPSAnXDAnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gU0RMX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytmbXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICp0ZXh0ID09ICpmbXQgKSB7CisgICAgICAgICAgICArK3RleHQ7CisgICAgICAgICAgICArK2ZtdDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8qIFRleHQgZGlkbid0IG1hdGNoIGZvcm1hdCBzcGVjaWZpZXIgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHZhX2VuZChhcCk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TTlBSSU5URgoraW50IFNETF9zbnByaW50ZihjaGFyICp0ZXh0LCBzaXplX3QgbWF4bGVuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIGludCByZXR2YWw7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICByZXR2YWwgPSBTRExfdnNucHJpbnRmKHRleHQsIG1heGxlbiwgZm10LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgorc3RhdGljIHNpemVfdCBTRExfUHJpbnRMb25nKGNoYXIgKnRleHQsIGxvbmcgdmFsdWUsIGludCByYWRpeCwgc2l6ZV90IG1heGxlbikKK3sKKyAgICBjaGFyIG51bVsxMzBdOworICAgIHNpemVfdCBzaXplOworCisgICAgU0RMX2x0b2EodmFsdWUsIG51bSwgcmFkaXgpOworICAgIHNpemUgPSBTRExfc3RybGVuKG51bSk7CisgICAgaWYgKCBzaXplID49IG1heGxlbiApIHsKKyAgICAgICAgc2l6ZSA9IG1heGxlbi0xOworICAgIH0KKyAgICBTRExfc3RybGNweSh0ZXh0LCBudW0sIHNpemUrMSk7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KK3N0YXRpYyBzaXplX3QgU0RMX1ByaW50VW5zaWduZWRMb25nKGNoYXIgKnRleHQsIHVuc2lnbmVkIGxvbmcgdmFsdWUsIGludCByYWRpeCwgc2l6ZV90IG1heGxlbikKK3sKKyAgICBjaGFyIG51bVsxMzBdOworICAgIHNpemVfdCBzaXplOworCisgICAgU0RMX3VsdG9hKHZhbHVlLCBudW0sIHJhZGl4KTsKKyAgICBzaXplID0gU0RMX3N0cmxlbihudW0pOworICAgIGlmICggc2l6ZSA+PSBtYXhsZW4gKSB7CisgICAgICAgIHNpemUgPSBtYXhsZW4tMTsKKyAgICB9CisgICAgU0RMX3N0cmxjcHkodGV4dCwgbnVtLCBzaXplKzEpOworCisgICAgcmV0dXJuIHNpemU7Cit9CisjaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCitzdGF0aWMgc2l6ZV90IFNETF9QcmludExvbmdMb25nKGNoYXIgKnRleHQsIFNpbnQ2NCB2YWx1ZSwgaW50IHJhZGl4LCBzaXplX3QgbWF4bGVuKQoreworICAgIGNoYXIgbnVtWzEzMF07CisgICAgc2l6ZV90IHNpemU7CisKKyAgICBTRExfbGx0b2EodmFsdWUsIG51bSwgcmFkaXgpOworICAgIHNpemUgPSBTRExfc3RybGVuKG51bSk7CisgICAgaWYgKCBzaXplID49IG1heGxlbiApIHsKKyAgICAgICAgc2l6ZSA9IG1heGxlbi0xOworICAgIH0KKyAgICBTRExfc3RybGNweSh0ZXh0LCBudW0sIHNpemUrMSk7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KK3N0YXRpYyBzaXplX3QgU0RMX1ByaW50VW5zaWduZWRMb25nTG9uZyhjaGFyICp0ZXh0LCBVaW50NjQgdmFsdWUsIGludCByYWRpeCwgc2l6ZV90IG1heGxlbikKK3sKKyAgICBjaGFyIG51bVsxMzBdOworICAgIHNpemVfdCBzaXplOworCisgICAgU0RMX3VsbHRvYSh2YWx1ZSwgbnVtLCByYWRpeCk7CisgICAgc2l6ZSA9IFNETF9zdHJsZW4obnVtKTsKKyAgICBpZiAoIHNpemUgPj0gbWF4bGVuICkgeworICAgICAgICBzaXplID0gbWF4bGVuLTE7CisgICAgfQorICAgIFNETF9zdHJsY3B5KHRleHQsIG51bSwgc2l6ZSsxKTsKKworICAgIHJldHVybiBzaXplOworfQorI2VuZGlmIC8qIFNETF9IQVNfNjRCSVRfVFlQRSAqLworc3RhdGljIHNpemVfdCBTRExfUHJpbnRGbG9hdChjaGFyICp0ZXh0LCBkb3VibGUgYXJnLCBzaXplX3QgbWF4bGVuKQoreworICAgIGNoYXIgKnRleHRzdGFydCA9IHRleHQ7CisgICAgaWYgKCBhcmcgKSB7CisgICAgICAgIC8qIFRoaXMgaXNuJ3QgZXNwZWNpYWxseSBhY2N1cmF0ZSwgYnV0IGhleSwgaXQncyBlYXN5LiA6KSAqLworICAgICAgICBjb25zdCBkb3VibGUgcHJlY2lzaW9uID0gMC4wMDAwMDAwMTsKKyAgICAgICAgc2l6ZV90IGxlbjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworICAgICAgICBpZiAoIGFyZyA8IDAgKSB7CisgICAgICAgICAgICAqdGV4dCsrID0gJy0nOworICAgICAgICAgICAgLS1tYXhsZW47CisgICAgICAgICAgICBhcmcgPSAtYXJnOworICAgICAgICB9CisgICAgICAgIHZhbHVlID0gKHVuc2lnbmVkIGxvbmcpYXJnOworICAgICAgICBsZW4gPSBTRExfUHJpbnRVbnNpZ25lZExvbmcodGV4dCwgdmFsdWUsIDEwLCBtYXhsZW4pOworICAgICAgICB0ZXh0ICs9IGxlbjsKKyAgICAgICAgbWF4bGVuIC09IGxlbjsKKyAgICAgICAgYXJnIC09IHZhbHVlOworICAgICAgICBpZiAoIGFyZyA+IHByZWNpc2lvbiAmJiBtYXhsZW4gKSB7CisgICAgICAgICAgICBpbnQgbXVsdCA9IDEwOworICAgICAgICAgICAgKnRleHQrKyA9ICcuJzsKKyAgICAgICAgICAgIHdoaWxlICggKGFyZyA+IHByZWNpc2lvbikgJiYgbWF4bGVuICkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gKHVuc2lnbmVkIGxvbmcpKGFyZyAqIG11bHQpOworICAgICAgICAgICAgICAgIGxlbiA9IFNETF9QcmludFVuc2lnbmVkTG9uZyh0ZXh0LCB2YWx1ZSwgMTAsIG1heGxlbik7CisgICAgICAgICAgICAgICAgdGV4dCArPSBsZW47CisgICAgICAgICAgICAgICAgbWF4bGVuIC09IGxlbjsKKyAgICAgICAgICAgICAgICBhcmcgLT0gKGRvdWJsZSl2YWx1ZSAvIG11bHQ7CisgICAgICAgICAgICAgICAgbXVsdCAqPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICp0ZXh0KysgPSAnMCc7CisgICAgfQorICAgIHJldHVybiAodGV4dCAtIHRleHRzdGFydCk7Cit9CitzdGF0aWMgc2l6ZV90IFNETF9QcmludFN0cmluZyhjaGFyICp0ZXh0LCBjb25zdCBjaGFyICpzdHJpbmcsIHNpemVfdCBtYXhsZW4pCit7CisgICAgY2hhciAqdGV4dHN0YXJ0ID0gdGV4dDsKKyAgICB3aGlsZSAoICpzdHJpbmcgJiYgbWF4bGVuLS0gKSB7CisgICAgICAgICp0ZXh0KysgPSAqc3RyaW5nKys7CisgICAgfQorICAgIHJldHVybiAodGV4dCAtIHRleHRzdGFydCk7Cit9CitpbnQgU0RMX3ZzbnByaW50ZihjaGFyICp0ZXh0LCBzaXplX3QgbWF4bGVuLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgICAgY2hhciAqdGV4dHN0YXJ0ID0gdGV4dDsKKyAgICBpZiAoIG1heGxlbiA8PSAwICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLS1tYXhsZW47IC8qIEZvciB0aGUgdHJhaWxpbmcgJ1wwJyAqLworICAgIHdoaWxlICggKmZtdCAmJiBtYXhsZW4gKSB7CisgICAgICAgIGlmICggKmZtdCA9PSAnJScgKSB7CisgICAgICAgICAgICBTRExfYm9vbCBkb25lID0gU0RMX0ZBTFNFOworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IDA7CisgICAgICAgICAgICBTRExfYm9vbCBkb19sb3dlcmNhc2UgPSBTRExfRkFMU0U7CisgICAgICAgICAgICBpbnQgcmFkaXggPSAxMDsKKyAgICAgICAgICAgIGVudW0geworICAgICAgICAgICAgICAgIERPX0lOVCwKKyAgICAgICAgICAgICAgICBET19MT05HLAorICAgICAgICAgICAgICAgIERPX0xPTkdMT05HCisgICAgICAgICAgICB9IGludHR5cGUgPSBET19JTlQ7CisKKyAgICAgICAgICAgICsrZm10OworICAgICAgICAgICAgLyogRklYTUU6IGltcGxlbWVudCBtb3JlIG9mIHRoZSBmb3JtYXQgc3BlY2lmaWVycyAqLworICAgICAgICAgICAgd2hpbGUgKCAqZm10ID09ICcuJyB8fCAoKmZtdCA+PSAnMCcgJiYgKmZtdCA8PSAnOScpICkgeworICAgICAgICAgICAgICAgICsrZm10OworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKCpmbXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnJSc6CisgICAgICAgICAgICAgICAgICAgICAgICAqdGV4dCA9ICclJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gU0RMX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFyIGlzIHByb21vdGVkIHRvIGludCB3aGVuIHBhc3NlZCB0aHJvdWdoICguLi4pICovCisgICAgICAgICAgICAgICAgICAgICAgICAqdGV4dCA9IChjaGFyKXZhX2FyZyhhcCwgaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gU0RMX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG9ydCBpcyBwcm9tb3RlZCB0byBpbnQgd2hlbiBwYXNzZWQgdGhyb3VnaCAoLi4uKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnR0eXBlIDwgRE9fTE9OR0xPTkcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbnR0eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBTRExfc3RybmNtcChmbXQsICJJNjQiLCAzKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHR5cGUgPSBET19MT05HTE9ORzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGludHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX0lOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gU0RMX1ByaW50TG9uZyh0ZXh0LCAobG9uZyl2YV9hcmcoYXAsIGludCksIHJhZGl4LCBtYXhsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPX0xPTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IFNETF9QcmludExvbmcodGV4dCwgdmFfYXJnKGFwLCBsb25nKSwgcmFkaXgsIG1heGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fTE9OR0xPTkc6CisjaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IFNETF9QcmludExvbmdMb25nKHRleHQsIHZhX2FyZyhhcCwgU2ludDY0KSwgcmFkaXgsIG1heGxlbik7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRMb25nKHRleHQsIHZhX2FyZyhhcCwgbG9uZyksIHJhZGl4LCBtYXhsZW4pOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFNETF9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvX2xvd2VyY2FzZSA9IFNETF9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvICdYJyBoYW5kbGluZyAqLworICAgICAgICAgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmFkaXggPT0gMTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXggPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKmZtdCA9PSAncCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50dHlwZSA9IERPX0xPTkc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gdW5zaWduZWQgaGFuZGxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJhZGl4ID09IDEwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl4ID0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byB1bnNpZ25lZCBoYW5kbGluZyAqLworICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaW50dHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fSU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRVbnNpZ25lZExvbmcodGV4dCwgKHVuc2lnbmVkIGxvbmcpdmFfYXJnKGFwLCB1bnNpZ25lZCBpbnQpLCByYWRpeCwgbWF4bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBET19MT05HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRVbnNpZ25lZExvbmcodGV4dCwgdmFfYXJnKGFwLCB1bnNpZ25lZCBsb25nKSwgcmFkaXgsIG1heGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9fTE9OR0xPTkc6CisjaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IFNETF9QcmludFVuc2lnbmVkTG9uZ0xvbmcodGV4dCwgdmFfYXJnKGFwLCBVaW50NjQpLCByYWRpeCwgbWF4bGVuKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IFNETF9QcmludFVuc2lnbmVkTG9uZyh0ZXh0LCB2YV9hcmcoYXAsIHVuc2lnbmVkIGxvbmcpLCByYWRpeCwgbWF4bGVuKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZG9fbG93ZXJjYXNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9zdHJsd3IodGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gU0RMX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRGbG9hdCh0ZXh0LCB2YV9hcmcoYXAsIGRvdWJsZSksIG1heGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gU0RMX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBTRExfUHJpbnRTdHJpbmcodGV4dCwgdmFfYXJnKGFwLCBjaGFyKiksIG1heGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gU0RMX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBTRExfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2ZtdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRleHQgKz0gbGVuOworICAgICAgICAgICAgbWF4bGVuIC09IGxlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp0ZXh0KysgPSAqZm10Kys7CisgICAgICAgICAgICAtLW1heGxlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICAqdGV4dCA9ICdcMCc7CisKKyAgICByZXR1cm4gKHRleHQgLSB0ZXh0c3RhcnQpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9TRExfc3lzdGhyZWFkLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9TRExfc3lzdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5YWM1MAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL1NETF9zeXN0aHJlYWQuaApAQCAtMCwwICsxLDUyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhlc2UgYXJlIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBwb3J0IG9mIFNETCAqLworCisjaWZuZGVmIF9TRExfc3lzdGhyZWFkX2gKKyNkZWZpbmUgX1NETF9zeXN0aHJlYWRfaAorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorCisvKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSB0aHJlYWQsIHBhc3NpbmcgYXJncyB0byBTRExfUnVuVGhyZWFkKCksCisgICBzYXZlcyBhIHN5c3RlbS1kZXBlbmRlbnQgdGhyZWFkIGlkIGluIHRocmVhZC0+aWQsIGFuZCByZXR1cm5zIDAKKyAgIG9uIHN1Y2Nlc3MuCisqLworI2lmZGVmIFNETF9QQVNTRURfQkVHSU5USFJFQURfRU5EVEhSRUFECitleHRlcm4gaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncywgcGZuU0RMX0N1cnJlbnRCZWdpblRocmVhZCBwZm5CZWdpblRocmVhZCwgcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuRW5kVGhyZWFkKTsKKyNlbHNlCitleHRlcm4gaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncyk7CisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiBkb2VzIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gdGhlIGNoaWxkIHRocmVhZCAqLworZXh0ZXJuIHZvaWQgU0RMX1NZU19TZXR1cFRocmVhZCh2b2lkKTsKKworLyogVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2ggYW5kIGZyZWVzIGFueSBkYXRhCisgICBhbGxvY2F0ZWQgYnkgU0RMX1NZU19DcmVhdGVUaHJlYWQoKQorICovCitleHRlcm4gdm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKTsKKworLyogVGhpcyBmdW5jdGlvbiBraWxscyB0aGUgdGhyZWFkIGFuZCByZXR1cm5zICovCitleHRlcm4gdm9pZCBTRExfU1lTX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKTsKKworI2VuZGlmIC8qIF9TRExfc3lzdGhyZWFkX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL1NETF90aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL1NETF90aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTAzNzFkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvU0RMX3RocmVhZC5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogU3lzdGVtIGluZGVwZW5kZW50IHRocmVhZCBtYW5hZ2VtZW50IHJvdXRpbmVzIGZvciBTREwgKi8KKworI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkX2MuaCIKKyNpbmNsdWRlICJTRExfc3lzdGhyZWFkLmgiCisKKyNkZWZpbmUgQVJSQVlfQ0hVTktTSVpFCTMyCisvKiBUaGUgYXJyYXkgb2YgdGhyZWFkcyBjdXJyZW50bHkgYWN0aXZlIGluIHRoZSBhcHBsaWNhdGlvbgorICAgKGV4Y2VwdCB0aGUgbWFpbiB0aHJlYWQpCisgICBUaGUgbWFuaXB1bGF0aW9uIG9mIGFuIGFycmF5IGhlcmUgaXMgc2FmZXIgdGhhbiB1c2luZyBhIGxpbmtlZCBsaXN0LgorKi8KK3N0YXRpYyBpbnQgU0RMX21heHRocmVhZHMgPSAwOworc3RhdGljIGludCBTRExfbnVtdGhyZWFkcyA9IDA7CitzdGF0aWMgU0RMX1RocmVhZCAqKlNETF9UaHJlYWRzID0gTlVMTDsKK3N0YXRpYyBTRExfbXV0ZXggKnRocmVhZF9sb2NrID0gTlVMTDsKKworaW50IFNETF9UaHJlYWRzSW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSAwOworCXRocmVhZF9sb2NrID0gU0RMX0NyZWF0ZU11dGV4KCk7CisJaWYgKCB0aHJlYWRfbG9jayA9PSBOVUxMICkgeworCQlyZXR2YWwgPSAtMTsKKwl9CisJcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4uLgorICAgSWYgdGhpcyBpcyBjYWxsZWQgYnkgU0RMX1F1aXQoKSwgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQKKyAgIGNsZWFuIHVwIHRocmVhZHMgaGVyZS4gIElmIGFueSB0aHJlYWRzIGFyZSBzdGlsbCBydW5uaW5nIGFmdGVyIHRoaXMgY2FsbCwKKyAgIHRoZXkgd2lsbCBubyBsb25nZXIgaGF2ZSBhY2Nlc3MgdG8gYW55IHBlci10aHJlYWQgZGF0YS4KKyAqLwordm9pZCBTRExfVGhyZWFkc1F1aXQodm9pZCkKK3sKKwlTRExfbXV0ZXggKm11dGV4OworCisJbXV0ZXggPSB0aHJlYWRfbG9jazsKKwl0aHJlYWRfbG9jayA9IE5VTEw7CisJaWYgKCBtdXRleCAhPSBOVUxMICkgeworCQlTRExfRGVzdHJveU11dGV4KG11dGV4KTsKKwl9Cit9CisKKy8qIFJvdXRpbmVzIGZvciBtYW5pcHVsYXRpbmcgdGhlIHRocmVhZCBsaXN0ICovCitzdGF0aWMgdm9pZCBTRExfQWRkVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKK3sKKwkvKiBXQVJOSU5HOgorCSAgIElmIHRoZSB2ZXJ5IGZpcnN0IHRocmVhZHMgYXJlIGNyZWF0ZWQgc2ltdWx0YW5lb3VzbHksIHRoZW4KKwkgICB0aGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIGNhdXNpbmcgbWVtb3J5IGNvcnJ1cHRpb24uCisJICAgSW4gcHJhY3RpY2UsIHRoaXMgaXNuJ3QgYSBwcm9ibGVtIGJlY2F1c2UgYnkgZGVmaW5pdGlvbiB0aGVyZQorCSAgIGlzIG9ubHkgb25lIHRocmVhZCBydW5uaW5nIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkLgorCSovCisJaWYgKCAhdGhyZWFkX2xvY2sgKSB7CisJCWlmICggU0RMX1RocmVhZHNJbml0KCkgPCAwICkgeworCQkJcmV0dXJuOworCQl9CisJfQorCVNETF9tdXRleFAodGhyZWFkX2xvY2spOworCisJLyogRXhwYW5kIHRoZSBsaXN0IG9mIHRocmVhZHMsIGlmIG5lY2Vzc2FyeSAqLworI2lmZGVmIERFQlVHX1RIUkVBRFMKKwlwcmludGYoIkFkZGluZyB0aHJlYWQgKCVkIGFscmVhZHkgLSAlZCBtYXgpXG4iLAorCQkJU0RMX251bXRocmVhZHMsIFNETF9tYXh0aHJlYWRzKTsKKyNlbmRpZgorCWlmICggU0RMX251bXRocmVhZHMgPT0gU0RMX21heHRocmVhZHMgKSB7CisJCVNETF9UaHJlYWQgKip0aHJlYWRzOworCQl0aHJlYWRzID0gKFNETF9UaHJlYWQgKiopU0RMX3JlYWxsb2MoU0RMX1RocmVhZHMsCisJCQkoU0RMX21heHRocmVhZHMrQVJSQVlfQ0hVTktTSVpFKSooc2l6ZW9mICp0aHJlYWRzKSk7CisJCWlmICggdGhyZWFkcyA9PSBOVUxMICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJU0RMX21heHRocmVhZHMgKz0gQVJSQVlfQ0hVTktTSVpFOworCQlTRExfVGhyZWFkcyA9IHRocmVhZHM7CisJfQorCVNETF9UaHJlYWRzW1NETF9udW10aHJlYWRzKytdID0gdGhyZWFkOworZG9uZToKKwlTRExfbXV0ZXhWKHRocmVhZF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgU0RMX0RlbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisJaW50IGk7CisKKwlpZiAoICF0aHJlYWRfbG9jayApIHsKKwkJcmV0dXJuOworCX0KKwlTRExfbXV0ZXhQKHRocmVhZF9sb2NrKTsKKwlmb3IgKCBpPTA7IGk8U0RMX251bXRocmVhZHM7ICsraSApIHsKKwkJaWYgKCB0aHJlYWQgPT0gU0RMX1RocmVhZHNbaV0gKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIGkgPCBTRExfbnVtdGhyZWFkcyApIHsKKwkJaWYgKCAtLVNETF9udW10aHJlYWRzID4gMCApIHsKKwkJCXdoaWxlICggaSA8IFNETF9udW10aHJlYWRzICkgeworCQkJCVNETF9UaHJlYWRzW2ldID0gU0RMX1RocmVhZHNbaSsxXTsKKwkJCQkrK2k7CisJCQl9CisJCX0gZWxzZSB7CisJCQlTRExfbWF4dGhyZWFkcyA9IDA7CisJCQlTRExfZnJlZShTRExfVGhyZWFkcyk7CisJCQlTRExfVGhyZWFkcyA9IE5VTEw7CisJCX0KKyNpZmRlZiBERUJVR19USFJFQURTCisJCXByaW50ZigiRGVsZXRpbmcgdGhyZWFkICglZCBsZWZ0IC0gJWQgbWF4KVxuIiwKKwkJCQlTRExfbnVtdGhyZWFkcywgU0RMX21heHRocmVhZHMpOworI2VuZGlmCisJfQorCVNETF9tdXRleFYodGhyZWFkX2xvY2spOworCisjaWYgMAkvKiBUaGVyZSBjb3VsZCBiZSBtZW1vcnkgY29ycnVwdGlvbiBpZiBhbm90aGVyIHRocmVhZCBpcyBzdGFydGluZyAqLworCWlmICggU0RMX1RocmVhZHMgPT0gTlVMTCApIHsKKwkJU0RMX1RocmVhZHNRdWl0KCk7CisJfQorI2VuZGlmCit9CisKKy8qIFRoZSBkZWZhdWx0IChub24tdGhyZWFkLXNhZmUpIGdsb2JhbCBlcnJvciB2YXJpYWJsZSAqLworc3RhdGljIFNETF9lcnJvciBTRExfZ2xvYmFsX2Vycm9yOworCisvKiBSb3V0aW5lIHRvIGdldCB0aGUgdGhyZWFkLXNwZWNpZmljIGVycm9yIHZhcmlhYmxlICovCitTRExfZXJyb3IgKlNETF9HZXRFcnJCdWYodm9pZCkKK3sKKwlTRExfZXJyb3IgKmVycmJ1ZjsKKworCWVycmJ1ZiA9ICZTRExfZ2xvYmFsX2Vycm9yOworCWlmICggU0RMX1RocmVhZHMgKSB7CisJCWludCBpOworCQlVaW50MzIgdGhpc190aHJlYWQ7CisKKwkJdGhpc190aHJlYWQgPSBTRExfVGhyZWFkSUQoKTsKKwkJU0RMX211dGV4UCh0aHJlYWRfbG9jayk7CisJCWZvciAoIGk9MDsgaTxTRExfbnVtdGhyZWFkczsgKytpICkgeworCQkJaWYgKCB0aGlzX3RocmVhZCA9PSBTRExfVGhyZWFkc1tpXS0+dGhyZWFkaWQgKSB7CisJCQkJZXJyYnVmID0gJlNETF9UaHJlYWRzW2ldLT5lcnJidWY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJU0RMX211dGV4Vih0aHJlYWRfbG9jayk7CisJfQorCXJldHVybihlcnJidWYpOworfQorCisKKy8qIEFyZ3VtZW50cyBhbmQgY2FsbGJhY2sgdG8gc2V0dXAgYW5kIHJ1biB0aGUgdXNlciB0aHJlYWQgZnVuY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgKFNETENBTEwgKmZ1bmMpKHZvaWQgKik7CisJdm9pZCAqZGF0YTsKKwlTRExfVGhyZWFkICppbmZvOworCVNETF9zZW0gKndhaXQ7Cit9IHRocmVhZF9hcmdzOworCit2b2lkIFNETF9SdW5UaHJlYWQodm9pZCAqZGF0YSkKK3sKKwl0aHJlYWRfYXJncyAqYXJnczsKKwlpbnQgKFNETENBTEwgKnVzZXJmdW5jKSh2b2lkICopOworCXZvaWQgKnVzZXJkYXRhOworCWludCAqc3RhdHVzbG9jOworCisJLyogUGVyZm9ybSBhbnkgc3lzdGVtLWRlcGVuZGVudCBzZXR1cAorCSAgIC0gdGhpcyBmdW5jdGlvbiBjYW5ub3QgZmFpbCwgYW5kIGNhbm5vdCB1c2UgU0RMX1NldEVycm9yKCkKKwkgKi8KKwlTRExfU1lTX1NldHVwVGhyZWFkKCk7CisKKwkvKiBHZXQgdGhlIHRocmVhZCBpZCAqLworCWFyZ3MgPSAodGhyZWFkX2FyZ3MgKilkYXRhOworCWFyZ3MtPmluZm8tPnRocmVhZGlkID0gU0RMX1RocmVhZElEKCk7CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgZnVuY3Rpb24gdG8gcnVuICovCisJdXNlcmZ1bmMgPSBhcmdzLT5mdW5jOworCXVzZXJkYXRhID0gYXJncy0+ZGF0YTsKKwlzdGF0dXNsb2MgPSAmYXJncy0+aW5mby0+c3RhdHVzOworCisJLyogV2FrZSB1cCB0aGUgcGFyZW50IHRocmVhZCAqLworCVNETF9TZW1Qb3N0KGFyZ3MtPndhaXQpOworCisJLyogUnVuIHRoZSBmdW5jdGlvbiAqLworCSpzdGF0dXNsb2MgPSB1c2VyZnVuYyh1c2VyZGF0YSk7Cit9CisKKyNpZmRlZiBTRExfUEFTU0VEX0JFR0lOVEhSRUFEX0VORFRIUkVBRAorI3VuZGVmIFNETF9DcmVhdGVUaHJlYWQKK0RFQ0xTUEVDIFNETF9UaHJlYWQgKiBTRExDQUxMIFNETF9DcmVhdGVUaHJlYWQoaW50IChTRExDQUxMICpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSwgcGZuU0RMX0N1cnJlbnRCZWdpblRocmVhZCBwZm5CZWdpblRocmVhZCwgcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuRW5kVGhyZWFkKQorI2Vsc2UKK0RFQ0xTUEVDIFNETF9UaHJlYWQgKiBTRExDQUxMIFNETF9DcmVhdGVUaHJlYWQoaW50IChTRExDQUxMICpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSkKKyNlbmRpZgoreworCVNETF9UaHJlYWQgKnRocmVhZDsKKwl0aHJlYWRfYXJncyAqYXJnczsKKwlpbnQgcmV0OworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdGhyZWFkIGluZm8gc3RydWN0dXJlICovCisJdGhyZWFkID0gKFNETF9UaHJlYWQgKilTRExfbWFsbG9jKHNpemVvZigqdGhyZWFkKSk7CisJaWYgKCB0aHJlYWQgPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJU0RMX21lbXNldCh0aHJlYWQsIDAsIChzaXplb2YgKnRocmVhZCkpOworCXRocmVhZC0+c3RhdHVzID0gLTE7CisKKwkvKiBTZXQgdXAgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIHRocmVhZCAqLworCWFyZ3MgPSAodGhyZWFkX2FyZ3MgKilTRExfbWFsbG9jKHNpemVvZigqYXJncykpOworCWlmICggYXJncyA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJU0RMX2ZyZWUodGhyZWFkKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlhcmdzLT5mdW5jID0gZm47CisJYXJncy0+ZGF0YSA9IGRhdGE7CisJYXJncy0+aW5mbyA9IHRocmVhZDsKKwlhcmdzLT53YWl0ID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSgwKTsKKwlpZiAoIGFyZ3MtPndhaXQgPT0gTlVMTCApIHsKKwkJU0RMX2ZyZWUodGhyZWFkKTsKKwkJU0RMX2ZyZWUoYXJncyk7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBBZGQgdGhlIHRocmVhZCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGhyZWFkcyAqLworCVNETF9BZGRUaHJlYWQodGhyZWFkKTsKKworCS8qIENyZWF0ZSB0aGUgdGhyZWFkIGFuZCBnbyEgKi8KKyNpZmRlZiBTRExfUEFTU0VEX0JFR0lOVEhSRUFEX0VORFRIUkVBRAorCXJldCA9IFNETF9TWVNfQ3JlYXRlVGhyZWFkKHRocmVhZCwgYXJncywgcGZuQmVnaW5UaHJlYWQsIHBmbkVuZFRocmVhZCk7CisjZWxzZQorCXJldCA9IFNETF9TWVNfQ3JlYXRlVGhyZWFkKHRocmVhZCwgYXJncyk7CisjZW5kaWYKKwlpZiAoIHJldCA+PSAwICkgeworCQkvKiBXYWl0IGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uIHRvIHVzZSBhcmd1bWVudHMgKi8KKwkJU0RMX1NlbVdhaXQoYXJncy0+d2FpdCk7CisJfSBlbHNlIHsKKwkJLyogT29wcywgZmFpbGVkLiAgR290dGEgZnJlZSBldmVyeXRoaW5nICovCisJCVNETF9EZWxUaHJlYWQodGhyZWFkKTsKKwkJU0RMX2ZyZWUodGhyZWFkKTsKKwkJdGhyZWFkID0gTlVMTDsKKwl9CisJU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoYXJncy0+d2FpdCk7CisJU0RMX2ZyZWUoYXJncyk7CisKKwkvKiBFdmVyeXRoaW5nIGlzIHJ1bm5pbmcgbm93ICovCisJcmV0dXJuKHRocmVhZCk7Cit9CisKK3ZvaWQgU0RMX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCBpbnQgKnN0YXR1cykKK3sKKwlpZiAoIHRocmVhZCApIHsKKwkJU0RMX1NZU19XYWl0VGhyZWFkKHRocmVhZCk7CisJCWlmICggc3RhdHVzICkgeworCQkJKnN0YXR1cyA9IHRocmVhZC0+c3RhdHVzOworCQl9CisJCVNETF9EZWxUaHJlYWQodGhyZWFkKTsKKwkJU0RMX2ZyZWUodGhyZWFkKTsKKwl9Cit9CisKK1VpbnQzMiBTRExfR2V0VGhyZWFkSUQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworCVVpbnQzMiBpZDsKKworCWlmICggdGhyZWFkICkgeworCQlpZCA9IHRocmVhZC0+dGhyZWFkaWQ7CisJfSBlbHNlIHsKKwkJaWQgPSBTRExfVGhyZWFkSUQoKTsKKwl9CisJcmV0dXJuKGlkKTsKK30KKwordm9pZCBTRExfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisJaWYgKCB0aHJlYWQgKSB7CisJCVNETF9TWVNfS2lsbFRocmVhZCh0aHJlYWQpOworCQlTRExfV2FpdFRocmVhZCh0aHJlYWQsIE5VTEwpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvU0RMX3RocmVhZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9TRExfdGhyZWFkX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY2ZTUyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvU0RMX3RocmVhZF9jLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF90aHJlYWRfY19oCisjZGVmaW5lIF9TRExfdGhyZWFkX2NfaAorCisvKiBOZWVkIHRoZSBkZWZpbml0aW9ucyBvZiBTWVNfVGhyZWFkSGFuZGxlICovCisjaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKKyNpbmNsdWRlICJnZW5lcmljL1NETF9zeXN0aHJlYWRfYy5oIgorI2VsaWYgU0RMX1RIUkVBRF9CRU9TCisjaW5jbHVkZSAiYmVvcy9TRExfc3lzdGhyZWFkX2MuaCIKKyNlbGlmIFNETF9USFJFQURfREMKKyNpbmNsdWRlICJkYy9TRExfc3lzdGhyZWFkX2MuaCIKKyNlbGlmIFNETF9USFJFQURfT1MyCisjaW5jbHVkZSAib3MyL1NETF9zeXN0aHJlYWRfYy5oIgorI2VsaWYgU0RMX1RIUkVBRF9QVEgKKyNpbmNsdWRlICJwdGgvU0RMX3N5c3RocmVhZF9jLmgiCisjZWxpZiBTRExfVEhSRUFEX1BUSFJFQUQKKyNpbmNsdWRlICJwdGhyZWFkL1NETF9zeXN0aHJlYWRfYy5oIgorI2VsaWYgU0RMX1RIUkVBRF9TUFJPQworI2luY2x1ZGUgImlyaXgvU0RMX3N5c3RocmVhZF9jLmgiCisjZWxpZiBTRExfVEhSRUFEX1dJTjMyCisjaW5jbHVkZSAid2luMzIvU0RMX3N5c3RocmVhZF9jLmgiCisjZWxpZiBTRExfVEhSRUFEX1NZTUJJQU4KKyNpbmNsdWRlICJzeW1iaWFuL1NETF9zeXN0aHJlYWRfYy5oIgorI2Vsc2UKKyNlcnJvciBOZWVkIHRocmVhZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBwbGF0Zm9ybQorI2luY2x1ZGUgImdlbmVyaWMvU0RMX3N5c3RocmVhZF9jLmgiCisjZW5kaWYKKyNpbmNsdWRlICIuLi9TRExfZXJyb3JfYy5oIgorCisvKiBUaGlzIGlzIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgdGhyZWFkIGluZm8gc3RydWN0dXJlICovCitzdHJ1Y3QgU0RMX1RocmVhZCB7CisJVWludDMyIHRocmVhZGlkOworCVNZU19UaHJlYWRIYW5kbGUgaGFuZGxlOworCWludCBzdGF0dXM7CisJU0RMX2Vycm9yIGVycmJ1ZjsKKwl2b2lkICpkYXRhOworfTsKKworLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gY2FsbGVkIHRvIHJ1biBhIHRocmVhZCAqLworZXh0ZXJuIHZvaWQgU0RMX1J1blRocmVhZCh2b2lkICpkYXRhKTsKKworI2VuZGlmIC8qIF9TRExfdGhyZWFkX2NfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvYmVvcy9TRExfc3lzc2VtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9iZW9zL1NETF9zeXNzZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmExOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvYmVvcy9TRExfc3lzc2VtLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBTZW1hcGhvcmVzIGluIHRoZSBCZU9TIGVudmlyb25tZW50ICovCisKKyNpbmNsdWRlIDxiZS9rZXJuZWwvT1MuaD4KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKworCitzdHJ1Y3QgU0RMX3NlbWFwaG9yZSB7CisJc2VtX2lkIGlkOworfTsKKworLyogQ3JlYXRlIGEgY291bnRpbmcgc2VtYXBob3JlICovCitTRExfc2VtICpTRExfQ3JlYXRlU2VtYXBob3JlKFVpbnQzMiBpbml0aWFsX3ZhbHVlKQoreworCVNETF9zZW0gKnNlbTsKKworCXNlbSA9IChTRExfc2VtICopU0RMX21hbGxvYyhzaXplb2YoKnNlbSkpOworCWlmICggc2VtICkgeworCQlzZW0tPmlkID0gY3JlYXRlX3NlbShpbml0aWFsX3ZhbHVlLCAiU0RMIHNlbWFwaG9yZSIpOworCQlpZiAoIHNlbS0+aWQgPCBCX05PX0VSUk9SICkgeworCQkJU0RMX1NldEVycm9yKCJjcmVhdGVfc2VtKCkgZmFpbGVkIik7CisJCQlTRExfZnJlZShzZW0pOworCQkJc2VtID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCX0KKwlyZXR1cm4oc2VtKTsKK30KKworLyogRnJlZSB0aGUgc2VtYXBob3JlICovCit2b2lkIFNETF9EZXN0cm95U2VtYXBob3JlKFNETF9zZW0gKnNlbSkKK3sKKwlpZiAoIHNlbSApIHsKKwkJaWYgKCBzZW0tPmlkID49IEJfTk9fRVJST1IgKSB7CisJCQlkZWxldGVfc2VtKHNlbS0+aWQpOworCQl9CisJCVNETF9mcmVlKHNlbSk7CisJfQorfQorCitpbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCit7CisJaW50MzIgdmFsOworCWludCByZXR2YWw7CisKKwlpZiAoICEgc2VtICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7CisJCXJldHVybiAtMTsKKwl9CisKKyAgdHJ5YWdhaW46CisJaWYgKCB0aW1lb3V0ID09IFNETF9NVVRFWF9NQVhXQUlUICkgeworCQl2YWwgPSBhY3F1aXJlX3NlbShzZW0tPmlkKTsKKwl9IGVsc2UgeworCQl0aW1lb3V0ICo9IDEwMDA7IC8qIEJlT1MgdXNlcyBhIHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzICovCisJCXZhbCA9IGFjcXVpcmVfc2VtX2V0YyhzZW0tPmlkLCAxLCBCX1JFTEFUSVZFX1RJTUVPVVQsIHRpbWVvdXQpOworCX0KKwlzd2l0Y2ggKHZhbCkgeworCSAgICBjYXNlIEJfSU5URVJSVVBURUQ6CisJCWdvdG8gdHJ5YWdhaW47CisJICAgIGNhc2UgQl9OT19FUlJPUjoKKwkJcmV0dmFsID0gMDsKKwkJYnJlYWs7CisJICAgIGNhc2UgQl9USU1FRF9PVVQ6CisJCXJldHZhbCA9IFNETF9NVVRFWF9USU1FRE9VVDsKKwkJYnJlYWs7CisJICAgIGNhc2UgQl9XT1VMRF9CTE9DSzoKKwkJcmV0dmFsID0gU0RMX01VVEVYX1RJTUVET1VUOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJU0RMX1NldEVycm9yKCJhY3F1aXJlX3NlbSgpIGZhaWxlZCIpOworCQlyZXR2YWwgPSAtMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKK3sKKwlyZXR1cm4gU0RMX1NlbVdhaXRUaW1lb3V0KHNlbSwgMCk7Cit9CisKK2ludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCit7CisJcmV0dXJuIFNETF9TZW1XYWl0VGltZW91dChzZW0sIFNETF9NVVRFWF9NQVhXQUlUKTsKK30KKworLyogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvZiB0aGUgc2VtYXBob3JlICovCitVaW50MzIgU0RMX1NlbVZhbHVlKFNETF9zZW0gKnNlbSkKK3sKKwlpbnQzMiBjb3VudDsKKwlVaW50MzIgdmFsdWU7CisKKwl2YWx1ZSA9IDA7CisJaWYgKCBzZW0gKSB7CisJCWdldF9zZW1fY291bnQoc2VtLT5pZCwgJmNvdW50KTsKKwkJaWYgKCBjb3VudCA+IDAgKSB7CisJCQl2YWx1ZSA9IChVaW50MzIpY291bnQ7CisJCX0KKwl9CisJcmV0dXJuIHZhbHVlOworfQorCisvKiBBdG9taWNhbGx5IGluY3JlYXNlcyB0aGUgc2VtYXBob3JlJ3MgY291bnQgKG5vdCBibG9ja2luZykgKi8KK2ludCBTRExfU2VtUG9zdChTRExfc2VtICpzZW0pCit7CisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCByZWxlYXNlX3NlbShzZW0tPmlkKSAhPSBCX05PX0VSUk9SICkgeworCQlTRExfU2V0RXJyb3IoInJlbGVhc2Vfc2VtKCkgZmFpbGVkIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9iZW9zL1NETF9zeXN0aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2Jlb3MvU0RMX3N5c3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjUyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9iZW9zL1NETF9zeXN0aHJlYWQuYwpAQCAtMCwwICsxLDk2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQmVPUyB0aHJlYWQgbWFuYWdlbWVudCByb3V0aW5lcyBmb3IgU0RMICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGJlL2tlcm5lbC9PUy5oPgorCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIi4uL1NETF90aHJlYWRfYy5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKKworCitzdGF0aWMgaW50IHNpZ19saXN0W10gPSB7CisJU0lHSFVQLCBTSUdJTlQsIFNJR1FVSVQsIFNJR1BJUEUsIFNJR0FMUk0sIFNJR1RFUk0sIFNJR1dJTkNILCAwCit9OworCit2b2lkIFNETF9NYXNrU2lnbmFscyhzaWdzZXRfdCAqb21hc2spCit7CisJc2lnc2V0X3QgbWFzazsKKwlpbnQgaTsKKworCXNpZ2VtcHR5c2V0KCZtYXNrKTsKKwlmb3IgKCBpPTA7IHNpZ19saXN0W2ldOyArK2kgKSB7CisJCXNpZ2FkZHNldCgmbWFzaywgc2lnX2xpc3RbaV0pOworCX0KKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZtYXNrLCBvbWFzayk7Cit9Cit2b2lkIFNETF9Vbm1hc2tTaWduYWxzKHNpZ3NldF90ICpvbWFzaykKK3sKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgb21hc2ssIE5VTEwpOworfQorCitzdGF0aWMgaW50MzIgUnVuVGhyZWFkKHZvaWQgKmRhdGEpCit7CisJU0RMX1J1blRocmVhZChkYXRhKTsKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBTRExfU1lTX0NyZWF0ZVRocmVhZChTRExfVGhyZWFkICp0aHJlYWQsIHZvaWQgKmFyZ3MpCit7CisJLyogQ3JlYXRlIHRoZSB0aHJlYWQgYW5kIGdvISAqLworCXRocmVhZC0+aGFuZGxlPXNwYXduX3RocmVhZChSdW5UaHJlYWQsICJTREwiLCBCX05PUk1BTF9QUklPUklUWSwgYXJncyk7CisJaWYgKCAodGhyZWFkLT5oYW5kbGUgPT0gQl9OT19NT1JFX1RIUkVBRFMpIHx8CisJICAgICAodGhyZWFkLT5oYW5kbGUgPT0gQl9OT19NRU1PUlkpICkgeworCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmVzdW1lX3RocmVhZCh0aHJlYWQtPmhhbmRsZSk7CisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9TWVNfU2V0dXBUaHJlYWQodm9pZCkKK3sKKwkvKiBNYXNrIGFzeW5jaHJvbm91cyBzaWduYWxzIGZvciB0aGlzIHRocmVhZCAqLworCVNETF9NYXNrU2lnbmFscyhOVUxMKTsKK30KKworVWludDMyIFNETF9UaHJlYWRJRCh2b2lkKQoreworCXJldHVybigoVWludDMyKWZpbmRfdGhyZWFkKE5VTEwpKTsKK30KKwordm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworCXN0YXR1c190IHRoZV9zdGF0dXM7CisKKwl3YWl0X2Zvcl90aHJlYWQodGhyZWFkLT5oYW5kbGUsICZ0aGVfc3RhdHVzKTsKK30KKwordm9pZCBTRExfU1lTX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworCWtpbGxfdGhyZWFkKHRocmVhZC0+aGFuZGxlKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2Jlb3MvU0RMX3N5c3RocmVhZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9iZW9zL1NETF9zeXN0aHJlYWRfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjU0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9iZW9zL1NETF9zeXN0aHJlYWRfYy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8YmUva2VybmVsL09TLmg+CisKK3R5cGVkZWYgdGhyZWFkX2lkIFNZU19UaHJlYWRIYW5kbGU7CisKKy8qIEZ1bmN0aW9ucyBuZWVkZWQgdG8gd29yayB3aXRoIHN5c3RlbSB0aHJlYWRzIGluIG90aGVyIHBvcnRpb25zIG9mIFNETCAqLworZXh0ZXJuIHZvaWQgU0RMX01hc2tTaWduYWxzKHNpZ3NldF90ICpvbWFzayk7CitleHRlcm4gdm9pZCBTRExfVW5tYXNrU2lnbmFscyhzaWdzZXRfdCAqb21hc2spOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZGMvU0RMX3N5c2NvbmQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXNjb25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlNzIyMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXNjb25kLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBjb25kaXRpb24gdmFyaWFibGVzIHVzaW5nIHNlbWFwaG9yZXMgYW5kIG11dGV4ZXMgKi8KKy8qCisgICBUaGlzIGltcGxlbWVudGF0aW9uIGJvcnJvd3MgaGVhdmlseSBmcm9tIHRoZSBCZU9TIGNvbmRpdGlvbiB2YXJpYWJsZQorICAgaW1wbGVtZW50YXRpb24sIHdyaXR0ZW4gYnkgQ2hyaXN0b3BoZXIgVGF0ZSBhbmQgT3dlbiBTbWl0aC4gIFRoYW5rcyEKKyAqLworCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorCitzdHJ1Y3QgU0RMX2NvbmQKK3sKKwlTRExfbXV0ZXggKmxvY2s7CisJaW50IHdhaXRpbmc7CisJaW50IHNpZ25hbHM7CisJU0RMX3NlbSAqd2FpdF9zZW07CisJU0RMX3NlbSAqd2FpdF9kb25lOworfTsKKworLyogQ3JlYXRlIGEgY29uZGl0aW9uIHZhcmlhYmxlICovCitTRExfY29uZCAqIFNETF9DcmVhdGVDb25kKHZvaWQpCit7CisJU0RMX2NvbmQgKmNvbmQ7CisKKwljb25kID0gKFNETF9jb25kICopIFNETF9tYWxsb2Moc2l6ZW9mKFNETF9jb25kKSk7CisJaWYgKCBjb25kICkgeworCQljb25kLT5sb2NrID0gU0RMX0NyZWF0ZU11dGV4KCk7CisJCWNvbmQtPndhaXRfc2VtID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSgwKTsKKwkJY29uZC0+d2FpdF9kb25lID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSgwKTsKKwkJY29uZC0+d2FpdGluZyA9IGNvbmQtPnNpZ25hbHMgPSAwOworCQlpZiAoICEgY29uZC0+bG9jayB8fCAhIGNvbmQtPndhaXRfc2VtIHx8ICEgY29uZC0+d2FpdF9kb25lICkgeworCQkJU0RMX0Rlc3Ryb3lDb25kKGNvbmQpOworCQkJY29uZCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwl9CisJcmV0dXJuKGNvbmQpOworfQorCisvKiBEZXN0cm95IGEgY29uZGl0aW9uIHZhcmlhYmxlICovCit2b2lkIFNETF9EZXN0cm95Q29uZChTRExfY29uZCAqY29uZCkKK3sKKwlpZiAoIGNvbmQgKSB7CisJCWlmICggY29uZC0+d2FpdF9zZW0gKSB7CisJCQlTRExfRGVzdHJveVNlbWFwaG9yZShjb25kLT53YWl0X3NlbSk7CisJCX0KKwkJaWYgKCBjb25kLT53YWl0X2RvbmUgKSB7CisJCQlTRExfRGVzdHJveVNlbWFwaG9yZShjb25kLT53YWl0X2RvbmUpOworCQl9CisJCWlmICggY29uZC0+bG9jayApIHsKKwkJCVNETF9EZXN0cm95TXV0ZXgoY29uZC0+bG9jayk7CisJCX0KKwkJU0RMX2ZyZWUoY29uZCk7CisJfQorfQorCisvKiBSZXN0YXJ0IG9uZSBvZiB0aGUgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KK2ludCBTRExfQ29uZFNpZ25hbChTRExfY29uZCAqY29uZCkKK3sKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSWYgdGhlcmUgYXJlIHdhaXRpbmcgdGhyZWFkcyBub3QgYWxyZWFkeSBzaWduYWxsZWQsIHRoZW4KKwkgICBzaWduYWwgdGhlIGNvbmRpdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byByZXNwb25kLgorCSovCisJU0RMX0xvY2tNdXRleChjb25kLT5sb2NrKTsKKwlpZiAoIGNvbmQtPndhaXRpbmcgPiBjb25kLT5zaWduYWxzICkgeworCQkrK2NvbmQtPnNpZ25hbHM7CisJCVNETF9TZW1Qb3N0KGNvbmQtPndhaXRfc2VtKTsKKwkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOworCQlTRExfU2VtV2FpdChjb25kLT53YWl0X2RvbmUpOworCX0gZWxzZSB7CisJCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzdGFydCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KK2ludCBTRExfQ29uZEJyb2FkY2FzdChTRExfY29uZCAqY29uZCkKK3sKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSWYgdGhlcmUgYXJlIHdhaXRpbmcgdGhyZWFkcyBub3QgYWxyZWFkeSBzaWduYWxsZWQsIHRoZW4KKwkgICBzaWduYWwgdGhlIGNvbmRpdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byByZXNwb25kLgorCSovCisJU0RMX0xvY2tNdXRleChjb25kLT5sb2NrKTsKKwlpZiAoIGNvbmQtPndhaXRpbmcgPiBjb25kLT5zaWduYWxzICkgeworCQlpbnQgaSwgbnVtX3dhaXRpbmc7CisKKwkJbnVtX3dhaXRpbmcgPSAoY29uZC0+d2FpdGluZyAtIGNvbmQtPnNpZ25hbHMpOworCQljb25kLT5zaWduYWxzID0gY29uZC0+d2FpdGluZzsKKwkJZm9yICggaT0wOyBpPG51bV93YWl0aW5nOyArK2kgKSB7CisJCQlTRExfU2VtUG9zdChjb25kLT53YWl0X3NlbSk7CisJCX0KKwkJLyogTm93IGFsbCByZWxlYXNlZCB0aHJlYWRzIGFyZSBibG9ja2VkIGhlcmUsIHdhaXRpbmcgZm9yIHVzLgorCQkgICBDb2xsZWN0IHRoZW0gYWxsIChhbmQgd2luIGZhYnVsb3VzIHByaXplcyEpIDotKQorCQkgKi8KKwkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOworCQlmb3IgKCBpPTA7IGk8bnVtX3dhaXRpbmc7ICsraSApIHsKKwkJCVNETF9TZW1XYWl0KGNvbmQtPndhaXRfZG9uZSk7CisJCX0KKwl9IGVsc2UgeworCQlTRExfVW5sb2NrTXV0ZXgoY29uZC0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3IgYXQgbW9zdCAnbXMnIG1pbGxpc2Vjb25kcy4KKyAgIFRoZSBtdXRleCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbiEKKyAgIFRoZSBtdXRleCBpcyB1bmxvY2tlZCBkdXJpbmcgdGhlIHdhaXQsIGFuZCBsb2NrZWQgYWdhaW4gYWZ0ZXIgdGhlIHdhaXQuCisKK1R5cGljYWwgdXNlOgorCitUaHJlYWQgQToKKwlTRExfTG9ja011dGV4KGxvY2spOworCXdoaWxlICggISBjb25kaXRpb24gKSB7CisJCVNETF9Db25kV2FpdChjb25kKTsKKwl9CisJU0RMX1VubG9ja011dGV4KGxvY2spOworCitUaHJlYWQgQjoKKwlTRExfTG9ja011dGV4KGxvY2spOworCS4uLgorCWNvbmRpdGlvbiA9IHRydWU7CisJLi4uCisJU0RMX1VubG9ja011dGV4KGxvY2spOworICovCitpbnQgU0RMX0NvbmRXYWl0VGltZW91dChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCwgVWludDMyIG1zKQoreworCWludCByZXR2YWw7CisKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogT2J0YWluIHRoZSBwcm90ZWN0aW9uIG11dGV4LCBhbmQgaW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygd2FpdGVycy4KKwkgICBUaGlzIGFsbG93cyB0aGUgc2lnbmFsIG1lY2hhbmlzbSB0byBvbmx5IHBlcmZvcm0gYSBzaWduYWwgaWYgdGhlcmUKKwkgICBhcmUgd2FpdGluZyB0aHJlYWRzLgorCSAqLworCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7CisJKytjb25kLT53YWl0aW5nOworCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKKworCS8qIFVubG9jayB0aGUgbXV0ZXgsIGFzIGlzIHJlcXVpcmVkIGJ5IGNvbmRpdGlvbiB2YXJpYWJsZSBzZW1hbnRpY3MgKi8KKwlTRExfVW5sb2NrTXV0ZXgobXV0ZXgpOworCisJLyogV2FpdCBmb3IgYSBzaWduYWwgKi8KKwlpZiAoIG1zID09IFNETF9NVVRFWF9NQVhXQUlUICkgeworCQlyZXR2YWwgPSBTRExfU2VtV2FpdChjb25kLT53YWl0X3NlbSk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gU0RMX1NlbVdhaXRUaW1lb3V0KGNvbmQtPndhaXRfc2VtLCBtcyk7CisJfQorCisJLyogTGV0IHRoZSBzaWduYWxlciBrbm93IHdlIGhhdmUgY29tcGxldGVkIHRoZSB3YWl0LCBvdGhlcndpc2UKKyAgICAgICAgICAgdGhlIHNpZ25hbGVyIGNhbiByYWNlIGFoZWFkIGFuZCBnZXQgdGhlIGNvbmRpdGlvbiBzZW1hcGhvcmUKKyAgICAgICAgICAgaWYgd2UgYXJlIHN0b3BwZWQgYmV0d2VlbiB0aGUgbXV0ZXggdW5sb2NrIGFuZCBzZW1hcGhvcmUgd2FpdCwKKyAgICAgICAgICAgZ2l2aW5nIGEgZGVhZGxvY2suICBTZWUgdGhlIGZvbGxvd2luZyBVUkwgZm9yIGRldGFpbHM6CisgICAgICAgIGh0dHA6Ly93d3ctY2xhc3NpYy5iZS5jb20vYWJvdXRiZS9iZW5ld3NsZXR0ZXIvdm9sdW1lX0lJSS9Jc3N1ZTQwLmh0bWwKKwkqLworCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7CisJaWYgKCBjb25kLT5zaWduYWxzID4gMCApIHsKKwkJLyogSWYgd2UgdGltZWQgb3V0LCB3ZSBuZWVkIHRvIGVhdCBhIGNvbmRpdGlvbiBzaWduYWwgKi8KKwkJaWYgKCByZXR2YWwgPiAwICkgeworCQkJU0RMX1NlbVdhaXQoY29uZC0+d2FpdF9zZW0pOworCQl9CisJCS8qIFdlIGFsd2F5cyBub3RpZnkgdGhlIHNpZ25hbCB0aHJlYWQgdGhhdCB3ZSBhcmUgZG9uZSAqLworCQlTRExfU2VtUG9zdChjb25kLT53YWl0X2RvbmUpOworCisJCS8qIFNpZ25hbCBoYW5kc2hha2UgY29tcGxldGUgKi8KKwkJLS1jb25kLT5zaWduYWxzOworCX0KKwktLWNvbmQtPndhaXRpbmc7CisJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOworCisJLyogTG9jayB0aGUgbXV0ZXgsIGFzIGlzIHJlcXVpcmVkIGJ5IGNvbmRpdGlvbiB2YXJpYWJsZSBzZW1hbnRpY3MgKi8KKwlTRExfTG9ja011dGV4KG11dGV4KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3JldmVyICovCitpbnQgU0RMX0NvbmRXYWl0KFNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dGV4KQoreworCXJldHVybiBTRExfQ29uZFdhaXRUaW1lb3V0KGNvbmQsIG11dGV4LCBTRExfTVVURVhfTUFYV0FJVCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9kYy9TRExfc3lzY29uZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9kYy9TRExfc3lzY29uZF9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyMGIyZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXNjb25kX2MuaApAQCAtMCwwICsxLDIzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZGMvU0RMX3N5c211dGV4LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9kYy9TRExfc3lzbXV0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmM0NjUxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZGMvU0RMX3N5c211dGV4LmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBtdXRleGVzIHVzaW5nIHNlbWFwaG9yZXMgKi8KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICJTRExfc3lzdGhyZWFkX2MuaCIKKworI2luY2x1ZGUgPGFyY2gvc3BpbmxvY2suaD4KKworc3RydWN0IFNETF9tdXRleCB7CisJaW50IHJlY3Vyc2l2ZTsKKwlVaW50MzIgb3duZXI7CisJc3BpbmxvY2tfdCBtdXRleDsKK307CisKKy8qIENyZWF0ZSBhIG11dGV4ICovCitTRExfbXV0ZXggKlNETF9DcmVhdGVNdXRleCh2b2lkKQoreworCVNETF9tdXRleCAqbXV0ZXg7CisKKwkvKiBBbGxvY2F0ZSBtdXRleCBtZW1vcnkgKi8KKwltdXRleCA9IChTRExfbXV0ZXggKilTRExfbWFsbG9jKHNpemVvZigqbXV0ZXgpKTsKKwlpZiAoIG11dGV4ICkgeworCQlzcGlubG9ja19pbml0KCZtdXRleC0+bXV0ZXgpOworCQltdXRleC0+cmVjdXJzaXZlID0gMDsKKwkJbXV0ZXgtPm93bmVyID0gMDsKKwl9IGVsc2UgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwl9CisJcmV0dXJuIG11dGV4OworfQorCisvKiBGcmVlIHRoZSBtdXRleCAqLwordm9pZCBTRExfRGVzdHJveU11dGV4KFNETF9tdXRleCAqbXV0ZXgpCit7CisJaWYgKCBtdXRleCApIHsKKwkJU0RMX2ZyZWUobXV0ZXgpOworCX0KK30KKworLyogTG9jayB0aGUgc2VtYXBob3JlICovCitpbnQgU0RMX211dGV4UChTRExfbXV0ZXggKm11dGV4KQoreworI2lmIFNETF9USFJFQURTX0RJU0FCTEVECisJcmV0dXJuICBTRExfYXJyYXlzaXplKHJldHVybiApLDA7CisjZWxzZQorCVVpbnQzMiB0aGlzX3RocmVhZDsKKworCWlmICggbXV0ZXggPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwl0aGlzX3RocmVhZCA9IFNETF9UaHJlYWRJRCgpOworCWlmICggbXV0ZXgtPm93bmVyID09IHRoaXNfdGhyZWFkICkgeworCQkrK211dGV4LT5yZWN1cnNpdmU7CisJfSBlbHNlIHsKKwkJLyogVGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgaW1wb3J0YW50LgorCQkgICBXZSBzZXQgdGhlIGxvY2tpbmcgdGhyZWFkIGlkIGFmdGVyIHdlIG9idGFpbiB0aGUgbG9jaworCQkgICBzbyB1bmxvY2tzIGZyb20gb3RoZXIgdGhyZWFkcyB3aWxsIGZhaWwuCisJCSovCisJCXNwaW5sb2NrX2xvY2soJm11dGV4LT5tdXRleCk7CisJCW11dGV4LT5vd25lciA9IHRoaXNfdGhyZWFkOworCQltdXRleC0+cmVjdXJzaXZlID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBTRExfVEhSRUFEU19ESVNBQkxFRCAqLworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitpbnQgU0RMX211dGV4VihTRExfbXV0ZXggKm11dGV4KQoreworI2lmIFNETF9USFJFQURTX0RJU0FCTEVECisJcmV0dXJuIDA7CisjZWxzZQorCWlmICggbXV0ZXggPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBJZiB3ZSBkb24ndCBvd24gdGhlIG11dGV4LCB3ZSBjYW4ndCB1bmxvY2sgaXQgKi8KKwlpZiAoIFNETF9UaHJlYWRJRCgpICE9IG11dGV4LT5vd25lciApIHsKKwkJU0RMX1NldEVycm9yKCJtdXRleCBub3Qgb3duZWQgYnkgdGhpcyB0aHJlYWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICggbXV0ZXgtPnJlY3Vyc2l2ZSApIHsKKwkJLS1tdXRleC0+cmVjdXJzaXZlOworCX0gZWxzZSB7CisJCS8qIFRoZSBvcmRlciBvZiBvcGVyYXRpb25zIGlzIGltcG9ydGFudC4KKwkJICAgRmlyc3QgcmVzZXQgdGhlIG93bmVyIHNvIGFub3RoZXIgdGhyZWFkIGRvZXNuJ3QgbG9jaworCQkgICB0aGUgbXV0ZXggYW5kIHNldCB0aGUgb3duZXJzaGlwIGJlZm9yZSB3ZSByZXNldCBpdCwKKwkJICAgdGhlbiByZWxlYXNlIHRoZSBsb2NrIHNlbWFwaG9yZS4KKwkJICovCisJCW11dGV4LT5vd25lciA9IDA7CisJCXNwaW5sb2NrX3VubG9jaygmbXV0ZXgtPm11dGV4KTsKKwl9CisJcmV0dXJuIDA7CisjZW5kaWYgLyogU0RMX1RIUkVBRFNfRElTQUJMRUQgKi8KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXNtdXRleF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9kYy9TRExfc3lzbXV0ZXhfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjBiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9kYy9TRExfc3lzbXV0ZXhfYy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9kYy9TRExfc3lzc2VtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9kYy9TRExfc3lzc2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzMWNjZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXNzZW0uYwpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFuIGltcGxlbWVudGF0aW9uIG9mIHNlbWFwaG9yZXMgdXNpbmcgbXV0ZXhlcyBhbmQgY29uZGl0aW9uIHZhcmlhYmxlcyAqLworCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF9zeXN0aHJlYWRfYy5oIgorCisKKyNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAorCitTRExfc2VtICpTRExfQ3JlYXRlU2VtYXBob3JlKFVpbnQzMiBpbml0aWFsX3ZhbHVlKQoreworCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKKwlyZXR1cm4gKFNETF9zZW0gKikwOworfQorCit2b2lkIFNETF9EZXN0cm95U2VtYXBob3JlKFNETF9zZW0gKnNlbSkKK3sKKwlyZXR1cm47Cit9CisKK2ludCBTRExfU2VtVHJ5V2FpdChTRExfc2VtICpzZW0pCit7CisJU0RMX1NldEVycm9yKCJTREwgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aHJlYWQgc3VwcG9ydCIpOworCXJldHVybiAtMTsKK30KKworaW50IFNETF9TZW1XYWl0VGltZW91dChTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0KQoreworCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCit7CisJU0RMX1NldEVycm9yKCJTREwgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aHJlYWQgc3VwcG9ydCIpOworCXJldHVybiAtMTsKK30KKworVWludDMyIFNETF9TZW1WYWx1ZShTRExfc2VtICpzZW0pCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBTRExfU2VtUG9zdChTRExfc2VtICpzZW0pCit7CisJU0RMX1NldEVycm9yKCJTREwgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aHJlYWQgc3VwcG9ydCIpOworCXJldHVybiAtMTsKK30KKworI2Vsc2UKKworI2luY2x1ZGUgPGtvcy9zZW0uaD4KKworc3RydWN0IFNETF9zZW1hcGhvcmUKK3sKKwlzZW1hcGhvcmVfdCBzZW07Cit9OworCitTRExfc2VtICpTRExfQ3JlYXRlU2VtYXBob3JlKFVpbnQzMiBpbml0aWFsX3ZhbHVlKQoreworCXJldHVybiAoU0RMX3NlbSAqKXNlbV9jcmVhdGUoaW5pdGlhbF92YWx1ZSk7Cit9CisKKy8qIFdBUk5JTkc6CisgICBZb3UgY2Fubm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGFub3RoZXIgdGhyZWFkIGlzIHVzaW5nIHRoZSBzZW1hcGhvcmUuCisqLwordm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCit7CisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm47CisJfQorCisJc2VtX2Rlc3Ryb3koJnNlbS0+c2VtKTsKK30KKworaW50IFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dmFsID0gc2VtX3RyeXdhaXQoJnNlbS0+c2VtKTsKKwlpZiAocmV0dmFsPT0wKSByZXR1cm4gMDsKKwllbHNlIHJldHVybiBTRExfTVVURVhfVElNRURPVVQ7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCit7CisJaW50IHJldHZhbDsKKworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEEgdGltZW91dCBvZiAwIGlzIGFuIGVhc3kgY2FzZSAqLworCWlmICggdGltZW91dCA9PSAwICkgeworCQlyZXR1cm4gU0RMX1NlbVRyeVdhaXQoc2VtKTsKKwl9CisKKwlyZXR2YWwgPSBzZW1fd2FpdF90aW1lZCgmc2VtLT5zZW0sdGltZW91dCk7CisJaWYgKHJldHZhbD09LTEpIHJldHZhbD0gU0RMX01VVEVYX1RJTUVET1VUOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IFNETF9TZW1XYWl0KFNETF9zZW0gKnNlbSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJd2hpbGUgKCAoKHJldHZhbCA9IHNlbV93YWl0KCZzZW0tPnNlbSkpID09IC0xKSAmJiAoZXJybm8gPT0gRUlOVFIpICkge30KKwlyZXR1cm4gcmV0dmFsOworfQorCitVaW50MzIgU0RMX1NlbVZhbHVlKFNETF9zZW0gKnNlbSkKK3sKKwlpZiAoICEgc2VtICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gc2VtX2NvdW50KCZzZW0tPnNlbSk7Cit9CisKK2ludCBTRExfU2VtUG9zdChTRExfc2VtICpzZW0pCit7CisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2VtX3NpZ25hbCgmc2VtLT5zZW0pOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogU0RMX1RIUkVBRFNfRElTQUJMRUQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXNzZW1fYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZGMvU0RMX3N5c3NlbV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyMGIyZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXNzZW1fYy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9kYy9TRExfc3lzdGhyZWFkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9kYy9TRExfc3lzdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyNjY3NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXN0aHJlYWQuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhyZWFkIG1hbmFnZW1lbnQgcm91dGluZXMgZm9yIFNETCAqLworCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIi4uL1NETF90aHJlYWRfYy5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKKworI2luY2x1ZGUgPGtvcy90aHJlYWQuaD4KKworaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncykKK3sKKwl0aHJlYWQtPmhhbmRsZSA9IHRoZF9jcmVhdGUoU0RMX1J1blRocmVhZCxhcmdzKTsKKwlpZiAodGhyZWFkLT5oYW5kbGUgPT0gTlVMTCkgeworCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9TWVNfU2V0dXBUaHJlYWQodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKK1VpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKK3sKKwlyZXR1cm4gKFVpbnQzMil0aGRfZ2V0X2N1cnJlbnQoKTsKK30KKwordm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworCXRoZF93YWl0KHRocmVhZC0+aGFuZGxlKTsKK30KKwordm9pZCBTRExfU1lTX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworCXRoZF9kZXN0cm95KHRocmVhZC0+aGFuZGxlKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXN0aHJlYWRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZGMvU0RMX3N5c3RocmVhZF9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkYTFhNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2RjL1NETF9zeXN0aHJlYWRfYy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCit0eXBlZGVmIHN0cnVjdCBrdGhyZWFkKiBTWVNfVGhyZWFkSGFuZGxlOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzY29uZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzY29uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZTcyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXNjb25kLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBjb25kaXRpb24gdmFyaWFibGVzIHVzaW5nIHNlbWFwaG9yZXMgYW5kIG11dGV4ZXMgKi8KKy8qCisgICBUaGlzIGltcGxlbWVudGF0aW9uIGJvcnJvd3MgaGVhdmlseSBmcm9tIHRoZSBCZU9TIGNvbmRpdGlvbiB2YXJpYWJsZQorICAgaW1wbGVtZW50YXRpb24sIHdyaXR0ZW4gYnkgQ2hyaXN0b3BoZXIgVGF0ZSBhbmQgT3dlbiBTbWl0aC4gIFRoYW5rcyEKKyAqLworCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorCitzdHJ1Y3QgU0RMX2NvbmQKK3sKKwlTRExfbXV0ZXggKmxvY2s7CisJaW50IHdhaXRpbmc7CisJaW50IHNpZ25hbHM7CisJU0RMX3NlbSAqd2FpdF9zZW07CisJU0RMX3NlbSAqd2FpdF9kb25lOworfTsKKworLyogQ3JlYXRlIGEgY29uZGl0aW9uIHZhcmlhYmxlICovCitTRExfY29uZCAqIFNETF9DcmVhdGVDb25kKHZvaWQpCit7CisJU0RMX2NvbmQgKmNvbmQ7CisKKwljb25kID0gKFNETF9jb25kICopIFNETF9tYWxsb2Moc2l6ZW9mKFNETF9jb25kKSk7CisJaWYgKCBjb25kICkgeworCQljb25kLT5sb2NrID0gU0RMX0NyZWF0ZU11dGV4KCk7CisJCWNvbmQtPndhaXRfc2VtID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSgwKTsKKwkJY29uZC0+d2FpdF9kb25lID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSgwKTsKKwkJY29uZC0+d2FpdGluZyA9IGNvbmQtPnNpZ25hbHMgPSAwOworCQlpZiAoICEgY29uZC0+bG9jayB8fCAhIGNvbmQtPndhaXRfc2VtIHx8ICEgY29uZC0+d2FpdF9kb25lICkgeworCQkJU0RMX0Rlc3Ryb3lDb25kKGNvbmQpOworCQkJY29uZCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwl9CisJcmV0dXJuKGNvbmQpOworfQorCisvKiBEZXN0cm95IGEgY29uZGl0aW9uIHZhcmlhYmxlICovCit2b2lkIFNETF9EZXN0cm95Q29uZChTRExfY29uZCAqY29uZCkKK3sKKwlpZiAoIGNvbmQgKSB7CisJCWlmICggY29uZC0+d2FpdF9zZW0gKSB7CisJCQlTRExfRGVzdHJveVNlbWFwaG9yZShjb25kLT53YWl0X3NlbSk7CisJCX0KKwkJaWYgKCBjb25kLT53YWl0X2RvbmUgKSB7CisJCQlTRExfRGVzdHJveVNlbWFwaG9yZShjb25kLT53YWl0X2RvbmUpOworCQl9CisJCWlmICggY29uZC0+bG9jayApIHsKKwkJCVNETF9EZXN0cm95TXV0ZXgoY29uZC0+bG9jayk7CisJCX0KKwkJU0RMX2ZyZWUoY29uZCk7CisJfQorfQorCisvKiBSZXN0YXJ0IG9uZSBvZiB0aGUgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KK2ludCBTRExfQ29uZFNpZ25hbChTRExfY29uZCAqY29uZCkKK3sKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSWYgdGhlcmUgYXJlIHdhaXRpbmcgdGhyZWFkcyBub3QgYWxyZWFkeSBzaWduYWxsZWQsIHRoZW4KKwkgICBzaWduYWwgdGhlIGNvbmRpdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byByZXNwb25kLgorCSovCisJU0RMX0xvY2tNdXRleChjb25kLT5sb2NrKTsKKwlpZiAoIGNvbmQtPndhaXRpbmcgPiBjb25kLT5zaWduYWxzICkgeworCQkrK2NvbmQtPnNpZ25hbHM7CisJCVNETF9TZW1Qb3N0KGNvbmQtPndhaXRfc2VtKTsKKwkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOworCQlTRExfU2VtV2FpdChjb25kLT53YWl0X2RvbmUpOworCX0gZWxzZSB7CisJCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzdGFydCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KK2ludCBTRExfQ29uZEJyb2FkY2FzdChTRExfY29uZCAqY29uZCkKK3sKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSWYgdGhlcmUgYXJlIHdhaXRpbmcgdGhyZWFkcyBub3QgYWxyZWFkeSBzaWduYWxsZWQsIHRoZW4KKwkgICBzaWduYWwgdGhlIGNvbmRpdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byByZXNwb25kLgorCSovCisJU0RMX0xvY2tNdXRleChjb25kLT5sb2NrKTsKKwlpZiAoIGNvbmQtPndhaXRpbmcgPiBjb25kLT5zaWduYWxzICkgeworCQlpbnQgaSwgbnVtX3dhaXRpbmc7CisKKwkJbnVtX3dhaXRpbmcgPSAoY29uZC0+d2FpdGluZyAtIGNvbmQtPnNpZ25hbHMpOworCQljb25kLT5zaWduYWxzID0gY29uZC0+d2FpdGluZzsKKwkJZm9yICggaT0wOyBpPG51bV93YWl0aW5nOyArK2kgKSB7CisJCQlTRExfU2VtUG9zdChjb25kLT53YWl0X3NlbSk7CisJCX0KKwkJLyogTm93IGFsbCByZWxlYXNlZCB0aHJlYWRzIGFyZSBibG9ja2VkIGhlcmUsIHdhaXRpbmcgZm9yIHVzLgorCQkgICBDb2xsZWN0IHRoZW0gYWxsIChhbmQgd2luIGZhYnVsb3VzIHByaXplcyEpIDotKQorCQkgKi8KKwkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOworCQlmb3IgKCBpPTA7IGk8bnVtX3dhaXRpbmc7ICsraSApIHsKKwkJCVNETF9TZW1XYWl0KGNvbmQtPndhaXRfZG9uZSk7CisJCX0KKwl9IGVsc2UgeworCQlTRExfVW5sb2NrTXV0ZXgoY29uZC0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3IgYXQgbW9zdCAnbXMnIG1pbGxpc2Vjb25kcy4KKyAgIFRoZSBtdXRleCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbiEKKyAgIFRoZSBtdXRleCBpcyB1bmxvY2tlZCBkdXJpbmcgdGhlIHdhaXQsIGFuZCBsb2NrZWQgYWdhaW4gYWZ0ZXIgdGhlIHdhaXQuCisKK1R5cGljYWwgdXNlOgorCitUaHJlYWQgQToKKwlTRExfTG9ja011dGV4KGxvY2spOworCXdoaWxlICggISBjb25kaXRpb24gKSB7CisJCVNETF9Db25kV2FpdChjb25kKTsKKwl9CisJU0RMX1VubG9ja011dGV4KGxvY2spOworCitUaHJlYWQgQjoKKwlTRExfTG9ja011dGV4KGxvY2spOworCS4uLgorCWNvbmRpdGlvbiA9IHRydWU7CisJLi4uCisJU0RMX1VubG9ja011dGV4KGxvY2spOworICovCitpbnQgU0RMX0NvbmRXYWl0VGltZW91dChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCwgVWludDMyIG1zKQoreworCWludCByZXR2YWw7CisKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogT2J0YWluIHRoZSBwcm90ZWN0aW9uIG11dGV4LCBhbmQgaW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygd2FpdGVycy4KKwkgICBUaGlzIGFsbG93cyB0aGUgc2lnbmFsIG1lY2hhbmlzbSB0byBvbmx5IHBlcmZvcm0gYSBzaWduYWwgaWYgdGhlcmUKKwkgICBhcmUgd2FpdGluZyB0aHJlYWRzLgorCSAqLworCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7CisJKytjb25kLT53YWl0aW5nOworCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKKworCS8qIFVubG9jayB0aGUgbXV0ZXgsIGFzIGlzIHJlcXVpcmVkIGJ5IGNvbmRpdGlvbiB2YXJpYWJsZSBzZW1hbnRpY3MgKi8KKwlTRExfVW5sb2NrTXV0ZXgobXV0ZXgpOworCisJLyogV2FpdCBmb3IgYSBzaWduYWwgKi8KKwlpZiAoIG1zID09IFNETF9NVVRFWF9NQVhXQUlUICkgeworCQlyZXR2YWwgPSBTRExfU2VtV2FpdChjb25kLT53YWl0X3NlbSk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gU0RMX1NlbVdhaXRUaW1lb3V0KGNvbmQtPndhaXRfc2VtLCBtcyk7CisJfQorCisJLyogTGV0IHRoZSBzaWduYWxlciBrbm93IHdlIGhhdmUgY29tcGxldGVkIHRoZSB3YWl0LCBvdGhlcndpc2UKKyAgICAgICAgICAgdGhlIHNpZ25hbGVyIGNhbiByYWNlIGFoZWFkIGFuZCBnZXQgdGhlIGNvbmRpdGlvbiBzZW1hcGhvcmUKKyAgICAgICAgICAgaWYgd2UgYXJlIHN0b3BwZWQgYmV0d2VlbiB0aGUgbXV0ZXggdW5sb2NrIGFuZCBzZW1hcGhvcmUgd2FpdCwKKyAgICAgICAgICAgZ2l2aW5nIGEgZGVhZGxvY2suICBTZWUgdGhlIGZvbGxvd2luZyBVUkwgZm9yIGRldGFpbHM6CisgICAgICAgIGh0dHA6Ly93d3ctY2xhc3NpYy5iZS5jb20vYWJvdXRiZS9iZW5ld3NsZXR0ZXIvdm9sdW1lX0lJSS9Jc3N1ZTQwLmh0bWwKKwkqLworCVNETF9Mb2NrTXV0ZXgoY29uZC0+bG9jayk7CisJaWYgKCBjb25kLT5zaWduYWxzID4gMCApIHsKKwkJLyogSWYgd2UgdGltZWQgb3V0LCB3ZSBuZWVkIHRvIGVhdCBhIGNvbmRpdGlvbiBzaWduYWwgKi8KKwkJaWYgKCByZXR2YWwgPiAwICkgeworCQkJU0RMX1NlbVdhaXQoY29uZC0+d2FpdF9zZW0pOworCQl9CisJCS8qIFdlIGFsd2F5cyBub3RpZnkgdGhlIHNpZ25hbCB0aHJlYWQgdGhhdCB3ZSBhcmUgZG9uZSAqLworCQlTRExfU2VtUG9zdChjb25kLT53YWl0X2RvbmUpOworCisJCS8qIFNpZ25hbCBoYW5kc2hha2UgY29tcGxldGUgKi8KKwkJLS1jb25kLT5zaWduYWxzOworCX0KKwktLWNvbmQtPndhaXRpbmc7CisJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOworCisJLyogTG9jayB0aGUgbXV0ZXgsIGFzIGlzIHJlcXVpcmVkIGJ5IGNvbmRpdGlvbiB2YXJpYWJsZSBzZW1hbnRpY3MgKi8KKwlTRExfTG9ja011dGV4KG11dGV4KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3JldmVyICovCitpbnQgU0RMX0NvbmRXYWl0KFNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dGV4KQoreworCXJldHVybiBTRExfQ29uZFdhaXRUaW1lb3V0KGNvbmQsIG11dGV4LCBTRExfTVVURVhfTUFYV0FJVCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXNtdXRleC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzbXV0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2ZlYTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzbXV0ZXguYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFuIGltcGxlbWVudGF0aW9uIG9mIG11dGV4ZXMgdXNpbmcgc2VtYXBob3JlcyAqLworCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF9zeXN0aHJlYWRfYy5oIgorCisKK3N0cnVjdCBTRExfbXV0ZXggeworCWludCByZWN1cnNpdmU7CisJVWludDMyIG93bmVyOworCVNETF9zZW0gKnNlbTsKK307CisKKy8qIENyZWF0ZSBhIG11dGV4ICovCitTRExfbXV0ZXggKlNETF9DcmVhdGVNdXRleCh2b2lkKQoreworCVNETF9tdXRleCAqbXV0ZXg7CisKKwkvKiBBbGxvY2F0ZSBtdXRleCBtZW1vcnkgKi8KKwltdXRleCA9IChTRExfbXV0ZXggKilTRExfbWFsbG9jKHNpemVvZigqbXV0ZXgpKTsKKwlpZiAoIG11dGV4ICkgeworCQkvKiBDcmVhdGUgdGhlIG11dGV4IHNlbWFwaG9yZSwgd2l0aCBpbml0aWFsIHZhbHVlIDEgKi8KKwkJbXV0ZXgtPnNlbSA9IFNETF9DcmVhdGVTZW1hcGhvcmUoMSk7CisJCW11dGV4LT5yZWN1cnNpdmUgPSAwOworCQltdXRleC0+b3duZXIgPSAwOworCQlpZiAoICEgbXV0ZXgtPnNlbSApIHsKKwkJCVNETF9mcmVlKG11dGV4KTsKKwkJCW11dGV4ID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCX0KKwlyZXR1cm4gbXV0ZXg7Cit9CisKKy8qIEZyZWUgdGhlIG11dGV4ICovCit2b2lkIFNETF9EZXN0cm95TXV0ZXgoU0RMX211dGV4ICptdXRleCkKK3sKKwlpZiAoIG11dGV4ICkgeworCQlpZiAoIG11dGV4LT5zZW0gKSB7CisJCQlTRExfRGVzdHJveVNlbWFwaG9yZShtdXRleC0+c2VtKTsKKwkJfQorCQlTRExfZnJlZShtdXRleCk7CisJfQorfQorCisvKiBMb2NrIHRoZSBzZW1hcGhvcmUgKi8KK2ludCBTRExfbXV0ZXhQKFNETF9tdXRleCAqbXV0ZXgpCit7CisjaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKKwlyZXR1cm4gMDsKKyNlbHNlCisJVWludDMyIHRoaXNfdGhyZWFkOworCisJaWYgKCBtdXRleCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRoaXNfdGhyZWFkID0gU0RMX1RocmVhZElEKCk7CisJaWYgKCBtdXRleC0+b3duZXIgPT0gdGhpc190aHJlYWQgKSB7CisJCSsrbXV0ZXgtPnJlY3Vyc2l2ZTsKKwl9IGVsc2UgeworCQkvKiBUaGUgb3JkZXIgb2Ygb3BlcmF0aW9ucyBpcyBpbXBvcnRhbnQuCisJCSAgIFdlIHNldCB0aGUgbG9ja2luZyB0aHJlYWQgaWQgYWZ0ZXIgd2Ugb2J0YWluIHRoZSBsb2NrCisJCSAgIHNvIHVubG9ja3MgZnJvbSBvdGhlciB0aHJlYWRzIHdpbGwgZmFpbC4KKwkJKi8KKwkJU0RMX1NlbVdhaXQobXV0ZXgtPnNlbSk7CisJCW11dGV4LT5vd25lciA9IHRoaXNfdGhyZWFkOworCQltdXRleC0+cmVjdXJzaXZlID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBTRExfVEhSRUFEU19ESVNBQkxFRCAqLworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitpbnQgU0RMX211dGV4VihTRExfbXV0ZXggKm11dGV4KQoreworI2lmIFNETF9USFJFQURTX0RJU0FCTEVECisJcmV0dXJuIDA7CisjZWxzZQorCWlmICggbXV0ZXggPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBJZiB3ZSBkb24ndCBvd24gdGhlIG11dGV4LCB3ZSBjYW4ndCB1bmxvY2sgaXQgKi8KKwlpZiAoIFNETF9UaHJlYWRJRCgpICE9IG11dGV4LT5vd25lciApIHsKKwkJU0RMX1NldEVycm9yKCJtdXRleCBub3Qgb3duZWQgYnkgdGhpcyB0aHJlYWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICggbXV0ZXgtPnJlY3Vyc2l2ZSApIHsKKwkJLS1tdXRleC0+cmVjdXJzaXZlOworCX0gZWxzZSB7CisJCS8qIFRoZSBvcmRlciBvZiBvcGVyYXRpb25zIGlzIGltcG9ydGFudC4KKwkJICAgRmlyc3QgcmVzZXQgdGhlIG93bmVyIHNvIGFub3RoZXIgdGhyZWFkIGRvZXNuJ3QgbG9jaworCQkgICB0aGUgbXV0ZXggYW5kIHNldCB0aGUgb3duZXJzaGlwIGJlZm9yZSB3ZSByZXNldCBpdCwKKwkJICAgdGhlbiByZWxlYXNlIHRoZSBsb2NrIHNlbWFwaG9yZS4KKwkJICovCisJCW11dGV4LT5vd25lciA9IDA7CisJCVNETF9TZW1Qb3N0KG11dGV4LT5zZW0pOworCX0KKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBTRExfVEhSRUFEU19ESVNBQkxFRCAqLworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzbXV0ZXhfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzbXV0ZXhfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjBiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXNtdXRleF9jLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2dlbmVyaWMvU0RMX3N5c3NlbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzc2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyODljMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2dlbmVyaWMvU0RMX3N5c3NlbS5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQW4gaW1wbGVtZW50YXRpb24gb2Ygc2VtYXBob3JlcyB1c2luZyBtdXRleGVzIGFuZCBjb25kaXRpb24gdmFyaWFibGVzICovCisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3N5c3RocmVhZF9jLmgiCisKKworI2lmIFNETF9USFJFQURTX0RJU0FCTEVECisKK1NETF9zZW0gKlNETF9DcmVhdGVTZW1hcGhvcmUoVWludDMyIGluaXRpYWxfdmFsdWUpCit7CisJU0RMX1NldEVycm9yKCJTREwgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aHJlYWQgc3VwcG9ydCIpOworCXJldHVybiAoU0RMX3NlbSAqKTA7Cit9CisKK3ZvaWQgU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoU0RMX3NlbSAqc2VtKQoreworCXJldHVybjsKK30KKworaW50IFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKK3sKKwlTRExfU2V0RXJyb3IoIlNETCBub3QgY29uZmlndXJlZCB3aXRoIHRocmVhZCBzdXBwb3J0Iik7CisJcmV0dXJuIC0xOworfQorCitpbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCit7CisJU0RMX1NldEVycm9yKCJTREwgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aHJlYWQgc3VwcG9ydCIpOworCXJldHVybiAtMTsKK30KKworaW50IFNETF9TZW1XYWl0KFNETF9zZW0gKnNlbSkKK3sKKwlTRExfU2V0RXJyb3IoIlNETCBub3QgY29uZmlndXJlZCB3aXRoIHRocmVhZCBzdXBwb3J0Iik7CisJcmV0dXJuIC0xOworfQorCitVaW50MzIgU0RMX1NlbVZhbHVlKFNETF9zZW0gKnNlbSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IFNETF9TZW1Qb3N0KFNETF9zZW0gKnNlbSkKK3sKKwlTRExfU2V0RXJyb3IoIlNETCBub3QgY29uZmlndXJlZCB3aXRoIHRocmVhZCBzdXBwb3J0Iik7CisJcmV0dXJuIC0xOworfQorCisjZWxzZQorCitzdHJ1Y3QgU0RMX3NlbWFwaG9yZQoreworCVVpbnQzMiBjb3VudDsKKwlVaW50MzIgd2FpdGVyc19jb3VudDsKKwlTRExfbXV0ZXggKmNvdW50X2xvY2s7CisJU0RMX2NvbmQgKmNvdW50X25vbnplcm87Cit9OworCitTRExfc2VtICpTRExfQ3JlYXRlU2VtYXBob3JlKFVpbnQzMiBpbml0aWFsX3ZhbHVlKQoreworCVNETF9zZW0gKnNlbTsKKworCXNlbSA9IChTRExfc2VtICopU0RMX21hbGxvYyhzaXplb2YoKnNlbSkpOworCWlmICggISBzZW0gKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc2VtLT5jb3VudCA9IGluaXRpYWxfdmFsdWU7CisJc2VtLT53YWl0ZXJzX2NvdW50ID0gMDsKKworCXNlbS0+Y291bnRfbG9jayA9IFNETF9DcmVhdGVNdXRleCgpOworCXNlbS0+Y291bnRfbm9uemVybyA9IFNETF9DcmVhdGVDb25kKCk7CisJaWYgKCAhIHNlbS0+Y291bnRfbG9jayB8fCAhIHNlbS0+Y291bnRfbm9uemVybyApIHsKKwkJU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoc2VtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHNlbTsKK30KKworLyogV0FSTklORzoKKyAgIFlvdSBjYW5ub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYW5vdGhlciB0aHJlYWQgaXMgdXNpbmcgdGhlIHNlbWFwaG9yZS4KKyovCit2b2lkIFNETF9EZXN0cm95U2VtYXBob3JlKFNETF9zZW0gKnNlbSkKK3sKKwlpZiAoIHNlbSApIHsKKwkJc2VtLT5jb3VudCA9IDB4RkZGRkZGRkY7CisJCXdoaWxlICggc2VtLT53YWl0ZXJzX2NvdW50ID4gMCkgeworCQkJU0RMX0NvbmRTaWduYWwoc2VtLT5jb3VudF9ub256ZXJvKTsKKwkJCVNETF9EZWxheSgxMCk7CisJCX0KKwkJU0RMX0Rlc3Ryb3lDb25kKHNlbS0+Y291bnRfbm9uemVybyk7CisJCWlmICggc2VtLT5jb3VudF9sb2NrICkgeworCQkJU0RMX211dGV4UChzZW0tPmNvdW50X2xvY2spOworCQkJU0RMX211dGV4VihzZW0tPmNvdW50X2xvY2spOworCQkJU0RMX0Rlc3Ryb3lNdXRleChzZW0tPmNvdW50X2xvY2spOworCQl9CisJCVNETF9mcmVlKHNlbSk7CisJfQorfQorCitpbnQgU0RMX1NlbVRyeVdhaXQoU0RMX3NlbSAqc2VtKQoreworCWludCByZXR2YWw7CisKKwlpZiAoICEgc2VtICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR2YWwgPSBTRExfTVVURVhfVElNRURPVVQ7CisJU0RMX0xvY2tNdXRleChzZW0tPmNvdW50X2xvY2spOworCWlmICggc2VtLT5jb3VudCA+IDAgKSB7CisJCS0tc2VtLT5jb3VudDsKKwkJcmV0dmFsID0gMDsKKwl9CisJU0RMX1VubG9ja011dGV4KHNlbS0+Y291bnRfbG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCit7CisJaW50IHJldHZhbDsKKworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEEgdGltZW91dCBvZiAwIGlzIGFuIGVhc3kgY2FzZSAqLworCWlmICggdGltZW91dCA9PSAwICkgeworCQlyZXR1cm4gU0RMX1NlbVRyeVdhaXQoc2VtKTsKKwl9CisKKwlTRExfTG9ja011dGV4KHNlbS0+Y291bnRfbG9jayk7CisJKytzZW0tPndhaXRlcnNfY291bnQ7CisJcmV0dmFsID0gMDsKKwl3aGlsZSAoIChzZW0tPmNvdW50ID09IDApICYmIChyZXR2YWwgIT0gU0RMX01VVEVYX1RJTUVET1VUKSApIHsKKwkJcmV0dmFsID0gU0RMX0NvbmRXYWl0VGltZW91dChzZW0tPmNvdW50X25vbnplcm8sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtLT5jb3VudF9sb2NrLCB0aW1lb3V0KTsKKwl9CisJLS1zZW0tPndhaXRlcnNfY291bnQ7CisJaWYgKHJldHZhbCA9PSAwKSB7CisJCS0tc2VtLT5jb3VudDsKKwl9CisJU0RMX1VubG9ja011dGV4KHNlbS0+Y291bnRfbG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgU0RMX1NlbVdhaXQoU0RMX3NlbSAqc2VtKQoreworCXJldHVybiBTRExfU2VtV2FpdFRpbWVvdXQoc2VtLCBTRExfTVVURVhfTUFYV0FJVCk7Cit9CisKK1VpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQoreworCVVpbnQzMiB2YWx1ZTsKKwkKKwl2YWx1ZSA9IDA7CisJaWYgKCBzZW0gKSB7CisJCVNETF9Mb2NrTXV0ZXgoc2VtLT5jb3VudF9sb2NrKTsKKwkJdmFsdWUgPSBzZW0tPmNvdW50OworCQlTRExfVW5sb2NrTXV0ZXgoc2VtLT5jb3VudF9sb2NrKTsKKwl9CisJcmV0dXJuIHZhbHVlOworfQorCitpbnQgU0RMX1NlbVBvc3QoU0RMX3NlbSAqc2VtKQoreworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCVNETF9Mb2NrTXV0ZXgoc2VtLT5jb3VudF9sb2NrKTsKKwlpZiAoIHNlbS0+d2FpdGVyc19jb3VudCA+IDAgKSB7CisJCVNETF9Db25kU2lnbmFsKHNlbS0+Y291bnRfbm9uemVybyk7CisJfQorCSsrc2VtLT5jb3VudDsKKwlTRExfVW5sb2NrTXV0ZXgoc2VtLT5jb3VudF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogU0RMX1RIUkVBRFNfRElTQUJMRUQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2dlbmVyaWMvU0RMX3N5c3RocmVhZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4MDEyMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2dlbmVyaWMvU0RMX3N5c3RocmVhZC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaHJlYWQgbWFuYWdlbWVudCByb3V0aW5lcyBmb3IgU0RMICovCisKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3RocmVhZC5oIgorCitpbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzKQoreworCVNETF9TZXRFcnJvcigiVGhyZWFkcyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisJcmV0dXJuKC0xKTsKK30KKwordm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCit7CisJcmV0dXJuOworfQorCitVaW50MzIgU0RMX1RocmVhZElEKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9TWVNfV2FpdFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisJcmV0dXJuOworfQorCit2b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9nZW5lcmljL1NETF9zeXN0aHJlYWRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzdGhyZWFkX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTM1YjUwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvZ2VuZXJpYy9TRExfc3lzdGhyZWFkX2MuaApAQCAtMCwwICsxLDI1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogU3R1YiB1bnRpbCB3ZSBpbXBsZW1lbnQgdGhyZWFkcyBvbiB0aGlzIHBsYXRmb3JtICovCit0eXBlZGVmIGludCBTWVNfVGhyZWFkSGFuZGxlOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvaXJpeC9TRExfc3lzc2VtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9pcml4L1NETF9zeXNzZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDhjMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvaXJpeC9TRExfc3lzc2VtLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvc2VtLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKworCitzdHJ1Y3QgU0RMX3NlbWFwaG9yZSB7CisJaW50IGlkOworfTsKKworLyogTm90IGRlZmluZWQgYnkgbWFueSBvcGVyYXRpbmcgc3lzdGVtcywgdXNlIGNvbmZpZ3VyZSB0byBkZXRlY3QgKi8KKy8qCisjaWYgIWRlZmluZWQoSEFWRV9TRU1VTikKK3VuaW9uIHNlbXVuIHsKKwlpbnQgdmFsOworCXN0cnVjdCBzZW1pZF9kcyAqYnVmOworCXVzaG9ydCAqYXJyYXk7Cit9OworI2VuZGlmCisqLworCitzdGF0aWMgc3RydWN0IHNlbWJ1ZiBvcF90cnl3YWl0WzJdID0geworCXsgMCwgLTEsIChJUENfTk9XQUlUfFNFTV9VTkRPKSB9IC8qIERlY3JlbWVudCBzZW1hcGhvcmUsIG5vIGJsb2NrICovCit9Oworc3RhdGljIHN0cnVjdCBzZW1idWYgb3Bfd2FpdFsyXSA9IHsKKwl7IDAsIC0xLCBTRU1fVU5ETyB9CQkvKiBEZWNyZW1lbnQgc2VtYXBob3JlICovCit9Oworc3RhdGljIHN0cnVjdCBzZW1idWYgb3BfcG9zdFsxXSA9IHsKKwl7IDAsIDEsIChJUENfTk9XQUlUfFNFTV9VTkRPKSB9CS8qIEluY3JlbWVudCBzZW1hcGhvcmUgKi8KK307CisKKy8qIENyZWF0ZSBhIGJsb2NrYWJsZSBzZW1hcGhvcmUgKi8KK1NETF9zZW0gKlNETF9DcmVhdGVTZW1hcGhvcmUoVWludDMyIGluaXRpYWxfdmFsdWUpCit7CisJZXh0ZXJuIGludCBfY3JlYXRpbmdfdGhyZWFkX2xvY2s7CS8qIFNETF90aHJlYWRzLmMgKi8KKwlTRExfc2VtICpzZW07CisJdW5pb24gc2VtdW4gaW5pdDsKKworCXNlbSA9IChTRExfc2VtICopU0RMX21hbGxvYyhzaXplb2YoKnNlbSkpOworCWlmICggc2VtID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCXNlbS0+aWQgPSBzZW1nZXQoSVBDX1BSSVZBVEUsIDEsICgwNjAwfElQQ19DUkVBVCkpOworCWlmICggc2VtLT5pZCA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNlbWFwaG9yZSIpOworCQlTRExfZnJlZShzZW0pOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWluaXQudmFsID0gaW5pdGlhbF92YWx1ZTsJLyogSW5pdGlhbGl6ZSBzZW1hcGhvcmUgKi8KKwlzZW1jdGwoc2VtLT5pZCwgMCwgU0VUVkFMLCBpbml0KTsKKwlyZXR1cm4oc2VtKTsKK30KKwordm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCit7CisJaWYgKCBzZW0gKSB7CisjaWZkZWYgX19JUklYX18KKwkJc2VtY3RsKHNlbS0+aWQsIDAsIElQQ19STUlEKTsKKyNlbHNlCisJCXVuaW9uIHNlbXVuIGR1bW15OworCQlkdW1teS52YWwgPSAwOworCQlzZW1jdGwoc2VtLT5pZCwgMCwgSVBDX1JNSUQsIGR1bW15KTsKKyNlbmRpZgorCQlTRExfZnJlZShzZW0pOworCX0KK30KKworaW50IFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dmFsID0gMDsKKyAgdHJ5YWdhaW46CisJaWYgKCBzZW1vcChzZW0tPmlkLCBvcF90cnl3YWl0LCAxKSA8IDAgKSB7CisJCWlmICggZXJybm8gPT0gRUlOVFIgKSB7CisJCQlnb3RvIHRyeWFnYWluOworCQl9CisJCXJldHZhbCA9IFNETF9NVVRFWF9USU1FRE9VVDsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IFNETF9TZW1XYWl0KFNETF9zZW0gKnNlbSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dmFsID0gMDsKKyAgdHJ5YWdhaW46CisJaWYgKCBzZW1vcChzZW0tPmlkLCBvcF93YWl0LCAxKSA8IDAgKSB7CisJCWlmICggZXJybm8gPT0gRUlOVFIgKSB7CisJCQlnb3RvIHRyeWFnYWluOworCQl9CisJCVNETF9TZXRFcnJvcigiU2VtYXBob3JlIG9wZXJhdGlvbiBlcnJvciIpOworCQlyZXR2YWwgPSAtMTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IFNETF9TZW1XYWl0VGltZW91dChTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0KQoreworCWludCByZXR2YWw7CisKKwlpZiAoICEgc2VtICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUcnkgdGhlIGVhc3kgY2FzZXMgZmlyc3QgKi8KKwlpZiAoIHRpbWVvdXQgPT0gMCApIHsKKwkJcmV0dXJuIFNETF9TZW1UcnlXYWl0KHNlbSk7CisJfQorCWlmICggdGltZW91dCA9PSBTRExfTVVURVhfTUFYV0FJVCApIHsKKwkJcmV0dXJuIFNETF9TZW1XYWl0KHNlbSk7CisJfQorCisJLyogQWNrISAgV2UgaGF2ZSB0byBidXN5IHdhaXQuLi4gKi8KKwl0aW1lb3V0ICs9IFNETF9HZXRUaWNrcygpOworCWRvIHsKKwkJcmV0dmFsID0gU0RMX1NlbVRyeVdhaXQoc2VtKTsKKwkJaWYgKCByZXR2YWwgPT0gMCApIHsKKwkJCWJyZWFrOworCQl9CisJCVNETF9EZWxheSgxKTsKKwl9IHdoaWxlICggU0RMX0dldFRpY2tzKCkgPCB0aW1lb3V0ICk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitVaW50MzIgU0RMX1NlbVZhbHVlKFNETF9zZW0gKnNlbSkKK3sKKwlpbnQgc2VtdmFsOworCVVpbnQzMiB2YWx1ZTsKKwkKKwl2YWx1ZSA9IDA7CisJaWYgKCBzZW0gKSB7CisJICB0cnlhZ2FpbjoKKyNpZmRlZiBfX0lSSVhfXworCQlzZW12YWwgPSBzZW1jdGwoc2VtLT5pZCwgMCwgR0VUVkFMKTsKKyNlbHNlCisJCXsKKwkJdW5pb24gc2VtdW4gYXJnOworCQlhcmcudmFsID0gMDsKKwkJc2VtdmFsID0gc2VtY3RsKHNlbS0+aWQsIDAsIEdFVFZBTCwgYXJnKTsKKwkJfQorI2VuZGlmCisJCWlmICggc2VtdmFsIDwgMCApIHsKKwkJCWlmICggZXJybm8gPT0gRUlOVFIgKSB7CisJCQkJZ290byB0cnlhZ2FpbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZhbHVlID0gKFVpbnQzMilzZW12YWw7CisJCX0KKwl9CisJcmV0dXJuIHZhbHVlOworfQorCitpbnQgU0RMX1NlbVBvc3QoU0RMX3NlbSAqc2VtKQoreworCWludCByZXR2YWw7CisKKwlpZiAoICEgc2VtICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtYXBob3JlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR2YWwgPSAwOworICB0cnlhZ2FpbjoKKwlpZiAoIHNlbW9wKHNlbS0+aWQsIG9wX3Bvc3QsIDEpIDwgMCApIHsKKwkJaWYgKCBlcnJubyA9PSBFSU5UUiApIHsKKwkJCWdvdG8gdHJ5YWdhaW47CisJCX0KKwkJU0RMX1NldEVycm9yKCJTZW1hcGhvcmUgb3BlcmF0aW9uIGVycm9yIik7CisJCXJldHZhbCA9IC0xOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvaXJpeC9TRExfc3lzdGhyZWFkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9pcml4L1NETF9zeXN0aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWU3ZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvaXJpeC9TRExfc3lzdGhyZWFkLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIElSSVggdGhyZWFkIG1hbmFnZW1lbnQgcm91dGluZXMgZm9yIFNETCAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKKworCitzdGF0aWMgaW50IHNpZ19saXN0W10gPSB7CisJU0lHSFVQLCBTSUdJTlQsIFNJR1FVSVQsIFNJR1BJUEUsIFNJR0FMUk0sIFNJR1RFUk0sIFNJR0NMRCwgU0lHV0lOQ0gsCisJU0lHVlRBTFJNLCBTSUdQUk9GLCAwCit9OworCisKK2ludCBTRExfU1lTX0NyZWF0ZVRocmVhZChTRExfVGhyZWFkICp0aHJlYWQsIHZvaWQgKmFyZ3MpCit7CisJLyogQ3JlYXRlIHRoZSB0aHJlYWQgYW5kIGdvISAqLworCWlmICggc3Byb2MoU0RMX1J1blRocmVhZCwgUFJfU0FMTCwgYXJncykgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9TWVNfU2V0dXBUaHJlYWQodm9pZCkKK3sKKwlpbnQgaTsKKwlzaWdzZXRfdCBtYXNrOworCisJLyogTWFzayBhc3luY2hyb25vdXMgc2lnbmFscyBmb3IgdGhpcyB0aHJlYWQgKi8KKwlzaWdlbXB0eXNldCgmbWFzayk7CisJZm9yICggaT0wOyBzaWdfbGlzdFtpXTsgKytpICkgeworCQlzaWdhZGRzZXQoJm1hc2ssIHNpZ19saXN0W2ldKTsKKwl9CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFzaywgTlVMTCk7Cit9CisKKy8qIFdBUk5JTkc6ICBUaGlzIG1heSBub3Qgd29yayBmb3Igc3lzdGVtcyB3aXRoIDY0LWJpdCBwaWRfdCAqLworVWludDMyIFNETF9UaHJlYWRJRCh2b2lkKQoreworCXJldHVybigoVWludDMyKWdldHBpZCgpKTsKK30KKworLyogV0FSTklORzogIFRoaXMgbWF5IG5vdCB3b3JrIGZvciBzeXN0ZW1zIHdpdGggNjQtYml0IHBpZF90ICovCit2b2lkIFNETF9XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgaW50ICpzdGF0dXMpCit7CisJZXJybm8gPSAwOworCXdoaWxlICggZXJybm8gIT0gRUNISUxEICkgeworCQl3YWl0cGlkKHRocmVhZC0+aGFuZGxlLCBOVUxMLCAwKTsKKwl9Cit9CisKKy8qIFdBUk5JTkc6ICBUaGlzIG1heSBub3Qgd29yayBmb3Igc3lzdGVtcyB3aXRoIDY0LWJpdCBwaWRfdCAqLwordm9pZCBTRExfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisJa2lsbCh0aHJlYWQtPmhhbmRsZSwgU0lHS0lMTCk7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL2lyaXgvU0RMX3N5c3RocmVhZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9pcml4L1NETF9zeXN0aHJlYWRfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjg2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9pcml4L1NETF9zeXN0aHJlYWRfYy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK3R5cGVkZWYgcGlkX3QgU1lTX1RocmVhZEhhbmRsZTsKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvb3MyL1NETF9zeXNjb25kLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9vczIvU0RMX3N5c2NvbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgwNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvb3MyL1NETF9zeXNjb25kLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBjb25kaXRpb24gdmFyaWFibGVzIHVzaW5nIHNlbWFwaG9yZXMgYW5kIG11dGV4ZXMgKi8KKy8qCisgICBUaGlzIGltcGxlbWVudGF0aW9uIGJvcnJvd3MgaGVhdmlseSBmcm9tIHRoZSBCZU9TIGNvbmRpdGlvbiB2YXJpYWJsZQorICAgaW1wbGVtZW50YXRpb24sIHdyaXR0ZW4gYnkgQ2hyaXN0b3BoZXIgVGF0ZSBhbmQgT3dlbiBTbWl0aC4gIFRoYW5rcyEKKyAqLworCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorCitzdHJ1Y3QgU0RMX2NvbmQKK3sKKwlTRExfbXV0ZXggKmxvY2s7CisJaW50IHdhaXRpbmc7CisJaW50IHNpZ25hbHM7CisJU0RMX3NlbSAqd2FpdF9zZW07CisJU0RMX3NlbSAqd2FpdF9kb25lOworfTsKKworLyogQ3JlYXRlIGEgY29uZGl0aW9uIHZhcmlhYmxlICovCitERUNMU1BFQyBTRExfY29uZCAqIFNETENBTEwgU0RMX0NyZWF0ZUNvbmQodm9pZCkKK3sKKwlTRExfY29uZCAqY29uZDsKKworCWNvbmQgPSAoU0RMX2NvbmQgKikgU0RMX21hbGxvYyhzaXplb2YoU0RMX2NvbmQpKTsKKwlpZiAoIGNvbmQgKSB7CisJCWNvbmQtPmxvY2sgPSBTRExfQ3JlYXRlTXV0ZXgoKTsKKwkJY29uZC0+d2FpdF9zZW0gPSBTRExfQ3JlYXRlU2VtYXBob3JlKDApOworCQljb25kLT53YWl0X2RvbmUgPSBTRExfQ3JlYXRlU2VtYXBob3JlKDApOworCQljb25kLT53YWl0aW5nID0gY29uZC0+c2lnbmFscyA9IDA7CisJCWlmICggISBjb25kLT5sb2NrIHx8ICEgY29uZC0+d2FpdF9zZW0gfHwgISBjb25kLT53YWl0X2RvbmUgKSB7CisJCQlTRExfRGVzdHJveUNvbmQoY29uZCk7CisJCQljb25kID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCX0KKwlyZXR1cm4oY29uZCk7Cit9CisKKy8qIERlc3Ryb3kgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KK0RFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRGVzdHJveUNvbmQoU0RMX2NvbmQgKmNvbmQpCit7CisJaWYgKCBjb25kICkgeworCQlpZiAoIGNvbmQtPndhaXRfc2VtICkgeworCQkJU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoY29uZC0+d2FpdF9zZW0pOworCQl9CisJCWlmICggY29uZC0+d2FpdF9kb25lICkgeworCQkJU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoY29uZC0+d2FpdF9kb25lKTsKKwkJfQorCQlpZiAoIGNvbmQtPmxvY2sgKSB7CisJCQlTRExfRGVzdHJveU11dGV4KGNvbmQtPmxvY2spOworCQl9CisJCVNETF9mcmVlKGNvbmQpOworCX0KK30KKworLyogUmVzdGFydCBvbmUgb2YgdGhlIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlICovCitERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfQ29uZFNpZ25hbChTRExfY29uZCAqY29uZCkKK3sKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSWYgdGhlcmUgYXJlIHdhaXRpbmcgdGhyZWFkcyBub3QgYWxyZWFkeSBzaWduYWxsZWQsIHRoZW4KKwkgICBzaWduYWwgdGhlIGNvbmRpdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byByZXNwb25kLgorCSovCisJU0RMX0xvY2tNdXRleChjb25kLT5sb2NrKTsKKwlpZiAoIGNvbmQtPndhaXRpbmcgPiBjb25kLT5zaWduYWxzICkgeworCQkrK2NvbmQtPnNpZ25hbHM7CisJCVNETF9TZW1Qb3N0KGNvbmQtPndhaXRfc2VtKTsKKwkJU0RMX1VubG9ja011dGV4KGNvbmQtPmxvY2spOworCQlTRExfU2VtV2FpdChjb25kLT53YWl0X2RvbmUpOworCX0gZWxzZSB7CisJCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzdGFydCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KK0RFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Db25kQnJvYWRjYXN0KFNETF9jb25kICpjb25kKQoreworCWlmICggISBjb25kICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBJZiB0aGVyZSBhcmUgd2FpdGluZyB0aHJlYWRzIG5vdCBhbHJlYWR5IHNpZ25hbGxlZCwgdGhlbgorCSAgIHNpZ25hbCB0aGUgY29uZGl0aW9uIGFuZCB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIHJlc3BvbmQuCisJKi8KKwlTRExfTG9ja011dGV4KGNvbmQtPmxvY2spOworCWlmICggY29uZC0+d2FpdGluZyA+IGNvbmQtPnNpZ25hbHMgKSB7CisJCWludCBpLCBudW1fd2FpdGluZzsKKworCQludW1fd2FpdGluZyA9IChjb25kLT53YWl0aW5nIC0gY29uZC0+c2lnbmFscyk7CisJCWNvbmQtPnNpZ25hbHMgPSBjb25kLT53YWl0aW5nOworCQlmb3IgKCBpPTA7IGk8bnVtX3dhaXRpbmc7ICsraSApIHsKKwkJCVNETF9TZW1Qb3N0KGNvbmQtPndhaXRfc2VtKTsKKwkJfQorCQkvKiBOb3cgYWxsIHJlbGVhc2VkIHRocmVhZHMgYXJlIGJsb2NrZWQgaGVyZSwgd2FpdGluZyBmb3IgdXMuCisJCSAgIENvbGxlY3QgdGhlbSBhbGwgKGFuZCB3aW4gZmFidWxvdXMgcHJpemVzISkgOi0pCisJCSAqLworCQlTRExfVW5sb2NrTXV0ZXgoY29uZC0+bG9jayk7CisJCWZvciAoIGk9MDsgaTxudW1fd2FpdGluZzsgKytpICkgeworCQkJU0RMX1NlbVdhaXQoY29uZC0+d2FpdF9kb25lKTsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogV2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGZvciBhdCBtb3N0ICdtcycgbWlsbGlzZWNvbmRzLgorICAgVGhlIG11dGV4IG11c3QgYmUgbG9ja2VkIGJlZm9yZSBlbnRlcmluZyB0aGlzIGZ1bmN0aW9uIQorICAgVGhlIG11dGV4IGlzIHVubG9ja2VkIGR1cmluZyB0aGUgd2FpdCwgYW5kIGxvY2tlZCBhZ2FpbiBhZnRlciB0aGUgd2FpdC4KKworVHlwaWNhbCB1c2U6CisKK1RocmVhZCBBOgorCVNETF9Mb2NrTXV0ZXgobG9jayk7CisJd2hpbGUgKCAhIGNvbmRpdGlvbiApIHsKKwkJU0RMX0NvbmRXYWl0KGNvbmQpOworCX0KKwlTRExfVW5sb2NrTXV0ZXgobG9jayk7CisKK1RocmVhZCBCOgorCVNETF9Mb2NrTXV0ZXgobG9jayk7CisJLi4uCisJY29uZGl0aW9uID0gdHJ1ZTsKKwkuLi4KKwlTRExfVW5sb2NrTXV0ZXgobG9jayk7CisgKi8KK0RFQ0xTUEVDIGludCBTRExDQUxMIFNETF9Db25kV2FpdFRpbWVvdXQoU0RMX2NvbmQgKmNvbmQsIFNETF9tdXRleCAqbXV0ZXgsIFVpbnQzMiBtcykKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIGNvbmQgKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE9idGFpbiB0aGUgcHJvdGVjdGlvbiBtdXRleCwgYW5kIGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHdhaXRlcnMuCisJICAgVGhpcyBhbGxvd3MgdGhlIHNpZ25hbCBtZWNoYW5pc20gdG8gb25seSBwZXJmb3JtIGEgc2lnbmFsIGlmIHRoZXJlCisJICAgYXJlIHdhaXRpbmcgdGhyZWFkcy4KKwkgKi8KKwlTRExfTG9ja011dGV4KGNvbmQtPmxvY2spOworCSsrY29uZC0+d2FpdGluZzsKKwlTRExfVW5sb2NrTXV0ZXgoY29uZC0+bG9jayk7CisKKwkvKiBVbmxvY2sgdGhlIG11dGV4LCBhcyBpcyByZXF1aXJlZCBieSBjb25kaXRpb24gdmFyaWFibGUgc2VtYW50aWNzICovCisJU0RMX1VubG9ja011dGV4KG11dGV4KTsKKworCS8qIFdhaXQgZm9yIGEgc2lnbmFsICovCisJaWYgKCBtcyA9PSBTRExfTVVURVhfTUFYV0FJVCApIHsKKwkJcmV0dmFsID0gU0RMX1NlbVdhaXQoY29uZC0+d2FpdF9zZW0pOworCX0gZWxzZSB7CisJCXJldHZhbCA9IFNETF9TZW1XYWl0VGltZW91dChjb25kLT53YWl0X3NlbSwgbXMpOworCX0KKworCS8qIExldCB0aGUgc2lnbmFsZXIga25vdyB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgd2FpdCwgb3RoZXJ3aXNlCisgICAgICAgICAgIHRoZSBzaWduYWxlciBjYW4gcmFjZSBhaGVhZCBhbmQgZ2V0IHRoZSBjb25kaXRpb24gc2VtYXBob3JlCisgICAgICAgICAgIGlmIHdlIGFyZSBzdG9wcGVkIGJldHdlZW4gdGhlIG11dGV4IHVubG9jayBhbmQgc2VtYXBob3JlIHdhaXQsCisgICAgICAgICAgIGdpdmluZyBhIGRlYWRsb2NrLiAgU2VlIHRoZSBmb2xsb3dpbmcgVVJMIGZvciBkZXRhaWxzOgorICAgICAgICBodHRwOi8vd3d3LWNsYXNzaWMuYmUuY29tL2Fib3V0YmUvYmVuZXdzbGV0dGVyL3ZvbHVtZV9JSUkvSXNzdWU0MC5odG1sCisJKi8KKwlTRExfTG9ja011dGV4KGNvbmQtPmxvY2spOworCWlmICggY29uZC0+c2lnbmFscyA+IDAgKSB7CisJCS8qIElmIHdlIHRpbWVkIG91dCwgd2UgbmVlZCB0byBlYXQgYSBjb25kaXRpb24gc2lnbmFsICovCisJCWlmICggcmV0dmFsID4gMCApIHsKKwkJCVNETF9TZW1XYWl0KGNvbmQtPndhaXRfc2VtKTsKKwkJfQorCQkvKiBXZSBhbHdheXMgbm90aWZ5IHRoZSBzaWduYWwgdGhyZWFkIHRoYXQgd2UgYXJlIGRvbmUgKi8KKwkJU0RMX1NlbVBvc3QoY29uZC0+d2FpdF9kb25lKTsKKworCQkvKiBTaWduYWwgaGFuZHNoYWtlIGNvbXBsZXRlICovCisJCS0tY29uZC0+c2lnbmFsczsKKwl9CisJLS1jb25kLT53YWl0aW5nOworCVNETF9VbmxvY2tNdXRleChjb25kLT5sb2NrKTsKKworCS8qIExvY2sgdGhlIG11dGV4LCBhcyBpcyByZXF1aXJlZCBieSBjb25kaXRpb24gdmFyaWFibGUgc2VtYW50aWNzICovCisJU0RMX0xvY2tNdXRleChtdXRleCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgZm9yZXZlciAqLworREVDTFNQRUMgaW50IFNETENBTEwgU0RMX0NvbmRXYWl0KFNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dGV4KQoreworCXJldHVybiBTRExfQ29uZFdhaXRUaW1lb3V0KGNvbmQsIG11dGV4LCBTRExfTVVURVhfTUFYV0FJVCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9vczIvU0RMX3N5c2NvbmRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvb3MyL1NETF9zeXNjb25kX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTIwYjJkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvb3MyL1NETF9zeXNjb25kX2MuaApAQCAtMCwwICsxLDIzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvb3MyL1NETF9zeXNtdXRleC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvb3MyL1NETF9zeXNtdXRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjE4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9vczIvU0RMX3N5c211dGV4LmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBNdXRleCBmdW5jdGlvbnMgdXNpbmcgdGhlIE9TLzIgQVBJICovCisKKyNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKKyNkZWZpbmUgSU5DTF9ET1NTRU1BUEhPUkVTCisjaW5jbHVkZSA8b3MyLmg+CisKKyNpbmNsdWRlICJTRExfbXV0ZXguaCIKKworCitzdHJ1Y3QgU0RMX211dGV4IHsKKwlITVRYIGhtdHhJRDsKK307CisKKy8qIENyZWF0ZSBhIG11dGV4ICovCitERUNMU1BFQyBTRExfbXV0ZXggKiBTRExDQUxMIFNETF9DcmVhdGVNdXRleCh2b2lkKQoreworICBTRExfbXV0ZXggKm11dGV4OworICBBUElSRVQgdWxyYzsKKworICAvKiBBbGxvY2F0ZSBtdXRleCBtZW1vcnkgKi8KKyAgbXV0ZXggPSAoU0RMX211dGV4ICopU0RMX21hbGxvYyhzaXplb2YoKm11dGV4KSk7CisgIGlmIChtdXRleCkKKyAgeworICAgIC8qIENyZWF0ZSB0aGUgbXV0ZXgsIHdpdGggaW5pdGlhbCB2YWx1ZSBzaWduYWxlZCAqLworICAgIHVscmMgPSBEb3NDcmVhdGVNdXRleFNlbShOVUxMLCAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB1bm5hbWVkIHNlbWFwaG9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKG11dGV4LT5obXR4SUQpLCAgICAgIC8vIFBvaW50ZXIgdG8gaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMLCAgICAgICAgICAgICAgICAgICAgLy8gRmxhZ3M6IGNyZWF0ZSBpdCBwcml2YXRlIChub3Qgc2hhcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7ICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWU6IHVub3duZWQKKyAgICBpZiAodWxyYyE9Tk9fRVJST1IpCisgICAgeworICAgICAgU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgbXV0ZXgiKTsKKyAgICAgIFNETF9mcmVlKG11dGV4KTsKKyAgICAgIG11dGV4ID0gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgU0RMX091dE9mTWVtb3J5KCk7CisgIH0KKyAgcmV0dXJuKG11dGV4KTsKK30KKworLyogRnJlZSB0aGUgbXV0ZXggKi8KK0RFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRGVzdHJveU11dGV4KFNETF9tdXRleCAqbXV0ZXgpCit7CisgIGlmICggbXV0ZXggKQorICB7CisgICAgaWYgKCBtdXRleC0+aG10eElEICkKKyAgICB7CisgICAgICBEb3NDbG9zZU11dGV4U2VtKG11dGV4LT5obXR4SUQpOworICAgICAgbXV0ZXgtPmhtdHhJRCA9IDA7CisgICAgfQorICAgIFNETF9mcmVlKG11dGV4KTsKKyAgfQorfQorCisvKiBMb2NrIHRoZSBtdXRleCAqLworREVDTFNQRUMgaW50IFNETENBTEwgU0RMX211dGV4UChTRExfbXV0ZXggKm11dGV4KQoreworICBpZiAoIG11dGV4ID09IE5VTEwgKQorICB7CisgICAgU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICggRG9zUmVxdWVzdE11dGV4U2VtKG11dGV4LT5obXR4SUQsIFNFTV9JTkRFRklOSVRFX1dBSVQpICE9IE5PX0VSUk9SICkKKyAgeworICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3Qgd2FpdCBvbiBtdXRleCIpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4oMCk7Cit9CisKKy8qIFVubG9jayB0aGUgbXV0ZXggKi8KK0RFQ0xTUEVDIGludCBTRExDQUxMIFNETF9tdXRleFYoU0RMX211dGV4ICptdXRleCkKK3sKKyAgaWYgKCBtdXRleCA9PSBOVUxMICkKKyAgeworICAgIFNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoIERvc1JlbGVhc2VNdXRleFNlbShtdXRleC0+aG10eElEKSAhPSBOT19FUlJPUiApCisgIHsKKyAgICBTRExfU2V0RXJyb3IoIkNvdWxkbid0IHJlbGVhc2UgbXV0ZXgiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvb3MyL1NETF9zeXNzZW0uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL29zMi9TRExfc3lzc2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZmJhNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL29zMi9TRExfc3lzc2VtLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBTZW1hcGhvcmUgZnVuY3Rpb25zIHVzaW5nIHRoZSBPUy8yIEFQSSAqLworCisjZGVmaW5lIElOQ0xfRE9TCisjZGVmaW5lIElOQ0xfRE9TRVJST1JTCisjZGVmaW5lIElOQ0xfRE9TU0VNQVBIT1JFUworI2luY2x1ZGUgPG9zMi5oPgorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorCisKK3N0cnVjdCBTRExfc2VtYXBob3JlIHsKKyAgICAgICAgSE1UWCBpZDsKKyAgICAgICAgSEVWICBjaGFuZ2VkOworICAgICAgICBVaW50MzIgdmFsdWU7Cit9OworCisKKy8qIENyZWF0ZSBhIHNlbWFwaG9yZSAqLworREVDTFNQRUMgU0RMX3NlbSAqIFNETENBTEwgU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKK3sKKyAgICAgICAgU0RMX3NlbSAqc2VtOworICAgICAgICBVTE9ORyB1bHJjOworCisgICAgICAgIC8qIEFsbG9jYXRlIHNlbSBtZW1vcnkgKi8KKyAgICAgICAgc2VtID0gKFNETF9zZW0gKilTRExfbWFsbG9jKHNpemVvZigqc2VtKSk7CisgICAgICAgIGlmICggc2VtICkgeworICAgICAgICAgICAgICAgIC8qIENyZWF0ZSB0aGUgbXV0ZXggc2VtYXBob3JlICovCisgICAgICAgICAgICAgICAgdWxyYyA9IERvc0NyZWF0ZU11dGV4U2VtKE5VTEwsJihzZW0tPmlkKSwwLFRSVUUpOworICAgICAgICAgICAgICAgIGlmICggdWxyYyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNlbWFwaG9yZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgU0RMX2ZyZWUoc2VtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEb3NDcmVhdGVFdmVudFNlbShOVUxMLCAmKHNlbS0+Y2hhbmdlZCksIDAsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgc2VtLT52YWx1ZSA9IGluaXRpYWxfdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIERvc1JlbGVhc2VNdXRleFNlbShzZW0tPmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHNlbSk7Cit9CisKKy8qIEZyZWUgdGhlIHNlbWFwaG9yZSAqLworREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9EZXN0cm95U2VtYXBob3JlKFNETF9zZW0gKnNlbSkKK3sKKyAgICAgICAgaWYgKCBzZW0gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzZW0tPmlkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgRG9zQ2xvc2VFdmVudFNlbShzZW0tPmNoYW5nZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgRG9zQ2xvc2VNdXRleFNlbShzZW0tPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbS0+aWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTRExfZnJlZShzZW0pOworICAgICAgICB9Cit9CisKK0RFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZW1XYWl0VGltZW91dChTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0KQoreworICAgICAgICBVTE9ORyB1bHJjOworCisgICAgICAgIGlmICggISBzZW0gKSB7CisgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGltZW91dCA9PSBTRExfTVVURVhfTUFYV0FJVCApIHsKKyAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgdWxyYyA9IERvc1JlcXVlc3RNdXRleFNlbShzZW0tPmlkLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKKyAgICAgICAgICAgICAgaWYgKHVscmMpIHsKKyAgICAgICAgICAgICAgICAgLyogaWYgZXJyb3Igd2FpdGluZyBtdXRleCAqLworICAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIkRvc1JlcXVlc3RNdXRleFNlbSgpIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VtLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VtLT52YWx1ZS0tOworICAgICAgICAgICAgICAgICAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKHNlbS0+aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgdWxQb3N0Q291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBEb3NSZXNldEV2ZW50U2VtKHNlbS0+Y2hhbmdlZCwgJnVsUG9zdENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERvc1JlbGVhc2VNdXRleFNlbShzZW0tPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIHdhaXRpbmcgdW50aWwgc29tZWJvZHkgcG9zdHMgdGhlIHNlbWFwaG9yZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgRG9zV2FpdEV2ZW50U2VtKHNlbS0+Y2hhbmdlZCwgU0VNX0lOREVGSU5JVEVfV0FJVCk7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgIGlmICggdGltZW91dCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgdWxyYyA9IERvc1JlcXVlc3RNdXRleFNlbShzZW0tPmlkLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKKyAgICAgICAgICAgIGlmICh1bHJjPT1OT19FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VtLT52YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlbS0+dmFsdWUtLTsKKyAgICAgICAgICAgICAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKHNlbS0+aWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERvc1JlbGVhc2VNdXRleFNlbShzZW0tPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNETF9NVVRFWF9USU1FRE9VVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIkRvc1JlcXVlc3RNdXRleFNlbSgpIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVscmMgPSBEb3NSZXF1ZXN0TXV0ZXhTZW0oc2VtLT5pZCwgU0VNX0lOREVGSU5JVEVfV0FJVCk7CisgICAgICAgICAgICBpZiAodWxyYykgeworICAgICAgICAgICAgICAgLyogaWYgZXJyb3Igd2FpdGluZyBtdXRleCAqLworICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJEb3NSZXF1ZXN0TXV0ZXhTZW0oKSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBpZiAoc2VtLT52YWx1ZSkgeworICAgICAgICAgICAgICAgIHNlbS0+dmFsdWUtLTsKKyAgICAgICAgICAgICAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oc2VtLT5pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVUxPTkcgdWxQb3N0Q291bnQ7CisgICAgICAgICAgICAgICAgRG9zUmVzZXRFdmVudFNlbShzZW0tPmNoYW5nZWQsICZ1bFBvc3RDb3VudCk7CisgICAgICAgICAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKHNlbS0+aWQpOworICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIHdhaXRpbmcgdW50aWwgc29tZWJvZHkgcG9zdHMgdGhlIHNlbWFwaG9yZSAqLworICAgICAgICAgICAgICAgIHVscmMgPSBEb3NXYWl0RXZlbnRTZW0oc2VtLT5jaGFuZ2VkLCB0aW1lb3V0KTsKKyAgICAgICAgICAgICAgICBpZiAodWxyYz09Tk9fRVJST1IpCisgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICByZXR1cm4gU0RMX01VVEVYX1RJTUVET1VUOworICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbmV2ZXIgcmVhY2hlZCAqLworICAgICAgICByZXR1cm4gLTE7Cit9CisKK0RFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKK3sKKyAgICAgICAgcmV0dXJuIFNETF9TZW1XYWl0VGltZW91dChzZW0sIDApOworfQorCitERUNMU1BFQyBpbnQgU0RMQ0FMTCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCit7CisgICAgICAgIHJldHVybiBTRExfU2VtV2FpdFRpbWVvdXQoc2VtLCBTRExfTVVURVhfTUFYV0FJVCk7Cit9CisKKy8qIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgb2YgdGhlIHNlbWFwaG9yZSAqLworREVDTFNQRUMgVWludDMyIFNETENBTEwgU0RMX1NlbVZhbHVlKFNETF9zZW0gKnNlbSkKK3sKKyAgICAgICAgaWYgKCAhIHNlbSApIHsKKyAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbS0+dmFsdWU7Cit9CisKK0RFQ0xTUEVDIGludCBTRExDQUxMIFNETF9TZW1Qb3N0KFNETF9zZW0gKnNlbSkKK3sKKyAgICAgICAgaWYgKCAhIHNlbSApIHsKKyAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICggRG9zUmVxdWVzdE11dGV4U2VtKHNlbS0+aWQsU0VNX0lOREVGSU5JVEVfV0FJVCkgKSB7CisgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJEb3NSZXF1ZXN0TXV0ZXhTZW0oKSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc2VtLT52YWx1ZSsrOworICAgICAgICBEb3NQb3N0RXZlbnRTZW0oc2VtLT5jaGFuZ2VkKTsKKyAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKHNlbS0+aWQpOworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL29zMi9TRExfc3lzdGhyZWFkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9vczIvU0RMX3N5c3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjgxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9vczIvU0RMX3N5c3RocmVhZC5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogT1MvMiB0aHJlYWQgbWFuYWdlbWVudCByb3V0aW5lcyBmb3IgU0RMICovCisKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZGVmaW5lIElOQ0xfRE9TRVJST1JTCisjZGVmaW5lIElOQ0xfRE9TUFJPQ0VTUworI2luY2x1ZGUgPG9zMi5oPgorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKKyNpbmNsdWRlICIuLi9TRExfdGhyZWFkX2MuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkU3RhcnRQYXJtcworeworICB2b2lkICphcmdzOworICBwZm5TRExfQ3VycmVudEVuZFRocmVhZCBwZm5DdXJyZW50RW5kVGhyZWFkOworfSB0VGhyZWFkU3RhcnRQYXJtcywgKnBUaHJlYWRTdGFydFBhcm1zOworCitzdGF0aWMgdm9pZCB0aHJlYWRmdW5jKHZvaWQgKnBwYXJtKQoreworICBwVGhyZWFkU3RhcnRQYXJtcyBwVGhyZWFkUGFybXMgPSBwcGFybTsKKyAgcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuQ3VycmVudEVuZFRocmVhZCA9IE5VTEw7CisKKyAgLy8gQ2FsbCB0aGUgdGhyZWFkIGZ1bmN0aW9uIQorICBTRExfUnVuVGhyZWFkKHBUaHJlYWRQYXJtcy0+YXJncyk7CisKKyAgLy8gR2V0IHRoZSBjdXJyZW50IGVuZHRocmVhZCB3ZSBoYXZlIHRvIHVzZSEKKyAgaWYgKHBUaHJlYWRQYXJtcykKKyAgeworICAgIHBmbkN1cnJlbnRFbmRUaHJlYWQgPSBwVGhyZWFkUGFybXMtPnBmbkN1cnJlbnRFbmRUaHJlYWQ7CisgICAgU0RMX2ZyZWUocFRocmVhZFBhcm1zKTsKKyAgfQorICAvLyBDYWxsIGVuZHRocmVhZCEKKyAgaWYgKHBmbkN1cnJlbnRFbmRUaHJlYWQpCisgICAgKCpwZm5DdXJyZW50RW5kVGhyZWFkKSgpOworfQorCitpbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzLCBwZm5TRExfQ3VycmVudEJlZ2luVGhyZWFkIHBmbkJlZ2luVGhyZWFkLCBwZm5TRExfQ3VycmVudEVuZFRocmVhZCBwZm5FbmRUaHJlYWQpCit7CisgIHBUaHJlYWRTdGFydFBhcm1zIHBUaHJlYWRQYXJtcyA9IFNETF9tYWxsb2Moc2l6ZW9mKHRUaHJlYWRTdGFydFBhcm1zKSk7CisgIGlmICghcFRocmVhZFBhcm1zKQorICB7CisgICAgU0RMX1NldEVycm9yKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhyZWFkIik7CisgICAgcmV0dXJuKC0xKTsKKyAgfQorCisgIC8vIFNhdmUgdGhlIGZ1bmN0aW9uIHdoaWNoIHdlIHdpbGwgaGF2ZSB0byBjYWxsIHRvIGNsZWFyIHRoZSBSVEwgb2YgY2FsbGluZyBhcHAhCisgIHBUaHJlYWRQYXJtcy0+cGZuQ3VycmVudEVuZFRocmVhZCA9IHBmbkVuZFRocmVhZDsKKyAgLy8gQWxzbyBzYXZlIHRoZSByZWFsIHBhcmFtZXRlcnMgd2UgaGF2ZSB0byBwYXNzIHRvIHRocmVhZCBmdW5jdGlvbgorICBwVGhyZWFkUGFybXMtPmFyZ3MgPSBhcmdzOworICAvLyBTdGFydCB0aGUgdGhyZWFkIHVzaW5nIHRoZSBydW50aW1lIGxpYnJhcnkgb2YgY2FsbGluZyBhcHAhCisgIHRocmVhZC0+dGhyZWFkaWQgPSB0aHJlYWQtPmhhbmRsZSA9ICgqcGZuQmVnaW5UaHJlYWQpKHRocmVhZGZ1bmMsIE5VTEwsIDUxMioxMDI0LCBwVGhyZWFkUGFybXMpOworICBpZiAoKGludCl0aHJlYWQtPnRocmVhZGlkIDw9IDApCisgIHsKKyAgICBTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKKyAgICByZXR1cm4oLTEpOworICB9CisgIHJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCit7CisgIHJldHVybjsKK30KKworREVDTFNQRUMgVWludDMyIFNETENBTEwgU0RMX1RocmVhZElEKHZvaWQpCit7CisgIFBUSUIgdGliOworICBEb3NHZXRJbmZvQmxvY2tzKCZ0aWIsIE5VTEwpOworICByZXR1cm4oKFVpbnQzMikgKHRpYi0+dGliX3B0aWIyLT50aWIyX3VsdGlkKSk7Cit9CisKK3ZvaWQgU0RMX1NZU19XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKK3sKKyAgVElEIHRpZCA9IHRocmVhZC0+aGFuZGxlOworICBEb3NXYWl0VGhyZWFkKCZ0aWQsIERDV1dfV0FJVCk7Cit9CisKKy8qIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGEgbGFzdCByZXNvcnQuCisgKiBUaHJlYWRzIHNob3VsZCBiZSBzaWduYWxlZCBhbmQgdGhlbiBleGl0IGJ5IHRoZW1zZWx2ZXMuCisgKiBUZXJtaW5hdGVUaHJlYWQoKSBkb2Vzbid0IHBlcmZvcm0gc3RhY2sgYW5kIERMTCBjbGVhbnVwLgorICovCit2b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisgIERvc0tpbGxUaHJlYWQodGhyZWFkLT5oYW5kbGUpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvb3MyL1NETF9zeXN0aHJlYWRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvb3MyL1NETF9zeXN0aHJlYWRfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTRkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9vczIvU0RMX3N5c3RocmVhZF9jLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNkZWZpbmUgSU5DTF9ET1NQUk9DRVNTCisjaW5jbHVkZSA8b3MyLmg+CisKK3R5cGVkZWYgVElEIFNZU19UaHJlYWRIYW5kbGU7CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aC9TRExfc3lzY29uZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcHRoL1NETF9zeXNjb25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlNzRhYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aC9TRExfc3lzY29uZC5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqCUdOVSBwdGggY29uZGl0aW9ucyB2YXJpYWJsZXMKKyAqCisgKglQYXRyaWNlIE1hbmRpbgorICovCisKKyNpbmNsdWRlIDxwdGguaD4KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICJTRExfc3lzbXV0ZXhfYy5oIgorCitzdHJ1Y3QgU0RMX2NvbmQKK3sKKwlwdGhfY29uZF90CWNvbmRwdGhfcDsKK307CisKKy8qIENyZWF0ZSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLworU0RMX2NvbmQgKiBTRExfQ3JlYXRlQ29uZCh2b2lkKQoreworCVNETF9jb25kICpjb25kOworCisJY29uZCA9IChTRExfY29uZCAqKSBTRExfbWFsbG9jKHNpemVvZihTRExfY29uZCkpOworCWlmICggY29uZCApIHsKKwkJaWYgKCBwdGhfY29uZF9pbml0KCYoY29uZC0+Y29uZHB0aF9wKSkgPCAwICkgeworCQkJU0RMX1NldEVycm9yKCJwdGhyZWFkX2NvbmRfaW5pdCgpIGZhaWxlZCIpOworCQkJU0RMX2ZyZWUoY29uZCk7CisJCQljb25kID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCX0KKwlyZXR1cm4oY29uZCk7Cit9CisKKy8qIERlc3Ryb3kgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KK3ZvaWQgU0RMX0Rlc3Ryb3lDb25kKFNETF9jb25kICpjb25kKQoreworCWlmICggY29uZCApIHsKKwkJU0RMX2ZyZWUoY29uZCk7CisJfQorfQorCisvKiBSZXN0YXJ0IG9uZSBvZiB0aGUgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KK2ludCBTRExfQ29uZFNpZ25hbChTRExfY29uZCAqY29uZCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIGNvbmQgKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHZhbCA9IDA7CisJaWYgKCBwdGhfY29uZF9ub3RpZnkoJihjb25kLT5jb25kcHRoX3ApLCBGQUxTRSkgIT0gMCApIHsKKwkJU0RMX1NldEVycm9yKCJwdGhfY29uZF9ub3RpZnkoKSBmYWlsZWQiKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFJlc3RhcnQgYWxsIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlICovCitpbnQgU0RMX0NvbmRCcm9hZGNhc3QoU0RMX2NvbmQgKmNvbmQpCit7CisJaW50IHJldHZhbDsKKworCWlmICggISBjb25kICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR2YWwgPSAwOworCWlmICggcHRoX2NvbmRfbm90aWZ5KCYoY29uZC0+Y29uZHB0aF9wKSwgVFJVRSkgIT0gMCApIHsKKwkJU0RMX1NldEVycm9yKCJwdGhfY29uZF9ub3RpZnkoKSBmYWlsZWQiKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3IgYXQgbW9zdCAnbXMnIG1pbGxpc2Vjb25kcy4KKyAgIFRoZSBtdXRleCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbiEKKyAgIFRoZSBtdXRleCBpcyB1bmxvY2tlZCBkdXJpbmcgdGhlIHdhaXQsIGFuZCBsb2NrZWQgYWdhaW4gYWZ0ZXIgdGhlIHdhaXQuCisKK1R5cGljYWwgdXNlOgorCitUaHJlYWQgQToKKwlTRExfTG9ja011dGV4KGxvY2spOworCXdoaWxlICggISBjb25kaXRpb24gKSB7CisJCVNETF9Db25kV2FpdChjb25kKTsKKwl9CisJU0RMX1VubG9ja011dGV4KGxvY2spOworCitUaHJlYWQgQjoKKwlTRExfTG9ja011dGV4KGxvY2spOworCS4uLgorCWNvbmRpdGlvbiA9IHRydWU7CisJLi4uCisJU0RMX1VubG9ja011dGV4KGxvY2spOworICovCitpbnQgU0RMX0NvbmRXYWl0VGltZW91dChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCwgVWludDMyIG1zKQoreworCWludCByZXR2YWw7CisJcHRoX2V2ZW50X3QgZXY7CisJaW50IHNlYzsKKworCWlmICggISBjb25kICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR2YWwgPSAwOworCisJc2VjID0gbXMvMTAwMDsKKwlldiA9IHB0aF9ldmVudChQVEhfRVZFTlRfVElNRSwgcHRoX3RpbWVvdXQoc2VjLChtcy1zZWMqMTAwMCkqMTAwMCkpOworCisJaWYgKCBwdGhfY29uZF9hd2FpdCgmKGNvbmQtPmNvbmRwdGhfcCksICYobXV0ZXgtPm11dGV4cHRoX3ApLCBldikgIT0gMCApIHsKKwkJU0RMX1NldEVycm9yKCJwdGhfY29uZF9hd2FpdCgpIGZhaWxlZCIpOworCQlyZXR2YWwgPSAtMTsKKwl9CisKKyAgICBwdGhfZXZlbnRfZnJlZShldiwgUFRIX0ZSRUVfQUxMKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3JldmVyICovCitpbnQgU0RMX0NvbmRXYWl0KFNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dGV4KQoreworCWludCByZXR2YWw7CisKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dmFsID0gMDsKKwlpZiAoIHB0aF9jb25kX2F3YWl0KCYoY29uZC0+Y29uZHB0aF9wKSwgJihtdXRleC0+bXV0ZXhwdGhfcCksIE5VTEwpICE9IDAgKSB7CisJCVNETF9TZXRFcnJvcigicHRoX2NvbmRfYXdhaXQoKSBmYWlsZWQiKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9wdGgvU0RMX3N5c211dGV4LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9wdGgvU0RMX3N5c211dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4M2I5MgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aC9TRExfc3lzbXV0ZXguYwpAQCAtMCwwICsxLDg3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqCUdOVSBwdGggbXV0ZXhlcworICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2luY2x1ZGUgPHB0aC5oPgorCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisjaW5jbHVkZSAiU0RMX3N5c211dGV4X2MuaCIKKworLyogQ3JlYXRlIGEgbXV0ZXggKi8KK1NETF9tdXRleCAqU0RMX0NyZWF0ZU11dGV4KHZvaWQpCit7CisJU0RMX211dGV4ICptdXRleDsKKworCS8qIEFsbG9jYXRlIG11dGV4IG1lbW9yeSAqLworCW11dGV4ID0gKFNETF9tdXRleCAqKVNETF9tYWxsb2Moc2l6ZW9mKCptdXRleCkpOworCWlmICggbXV0ZXggKSB7CisJCS8qIENyZWF0ZSB0aGUgbXV0ZXgsIHdpdGggaW5pdGlhbCB2YWx1ZSBzaWduYWxlZCAqLworCSAgICBpZiAoIXB0aF9tdXRleF9pbml0KCYobXV0ZXgtPm11dGV4cHRoX3ApKSkgeworCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgbXV0ZXgiKTsKKwkJCVNETF9mcmVlKG11dGV4KTsKKwkJCW11dGV4ID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCX0KKwlyZXR1cm4obXV0ZXgpOworfQorCisvKiBGcmVlIHRoZSBtdXRleCAqLwordm9pZCBTRExfRGVzdHJveU11dGV4KFNETF9tdXRleCAqbXV0ZXgpCit7CisJaWYgKCBtdXRleCApIHsKKwkJU0RMX2ZyZWUobXV0ZXgpOworCX0KK30KKworLyogTG9jayB0aGUgbXV0ZXggKi8KK2ludCBTRExfbXV0ZXhQKFNETF9tdXRleCAqbXV0ZXgpCit7CisJaWYgKCBtdXRleCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXB0aF9tdXRleF9hY3F1aXJlKCYobXV0ZXgtPm11dGV4cHRoX3ApLCBGQUxTRSwgTlVMTCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qIFVubG9jayB0aGUgbXV0ZXggKi8KK2ludCBTRExfbXV0ZXhWKFNETF9tdXRleCAqbXV0ZXgpCit7CisJaWYgKCBtdXRleCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKKwkJcmV0dXJuIC0xOworCX0KKworICAgIHB0aF9tdXRleF9yZWxlYXNlKCYobXV0ZXgtPm11dGV4cHRoX3ApKTsKKworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aC9TRExfc3lzbXV0ZXhfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcHRoL1NETF9zeXNtdXRleF9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5MDYwZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aC9TRExfc3lzbXV0ZXhfYy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfU1lTTVVURVhfQ19IXworI2RlZmluZSBfU0RMX1NZU01VVEVYX0NfSF8KKworc3RydWN0IFNETF9tdXRleCB7CisJcHRoX211dGV4X3QgbXV0ZXhwdGhfcDsKK307CisKKyNlbmRpZiAvKiBfU0RMX1NZU01VVEVYX0NfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aC9TRExfc3lzdGhyZWFkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9wdGgvU0RMX3N5c3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmY2NhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9wdGgvU0RMX3N5c3RocmVhZC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqCUdOVSBwdGggdGhyZWFkcworICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2luY2x1ZGUgPHB0aC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIi4uL1NETF90aHJlYWRfYy5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKKworLyogTGlzdCBvZiBzaWduYWxzIHRvIG1hc2sgaW4gdGhlIHN1YnRocmVhZHMgKi8KK3N0YXRpYyBpbnQgc2lnX2xpc3RbXSA9IHsKKwlTSUdIVVAsIFNJR0lOVCwgU0lHUVVJVCwgU0lHUElQRSwgU0lHQUxSTSwgU0lHVEVSTSwgU0lHQ0hMRCwgU0lHV0lOQ0gsCisJU0lHVlRBTFJNLCBTSUdQUk9GLCAwCit9OworCitzdGF0aWMgdm9pZCAqUnVuVGhyZWFkKHZvaWQgKmRhdGEpCit7CisJU0RMX1J1blRocmVhZChkYXRhKTsKKwlwdGhfZXhpdCgodm9pZCopMCk7CisJcmV0dXJuKCh2b2lkICopMCk7CQkvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcgKi8KK30KKworaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncykKK3sKKwlwdGhfYXR0cl90IHR5cGU7CisKKwkvKiBDcmVhdGUgYSBuZXcgYXR0cmlidXRlICovCisJdHlwZSA9IHB0aF9hdHRyX25ldygpOworCWlmICggdHlwZSA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGluaXRpYWxpemUgcHRoIGF0dHJpYnV0ZXMiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcHRoX2F0dHJfc2V0KHR5cGUsIFBUSF9BVFRSX0pPSU5BQkxFLCBUUlVFKTsKKworCS8qIENyZWF0ZSB0aGUgdGhyZWFkIGFuZCBnbyEgKi8KKwl0aHJlYWQtPmhhbmRsZSA9IHB0aF9zcGF3bih0eXBlLCBSdW5UaHJlYWQsIGFyZ3MpOworCWlmICggdGhyZWFkLT5oYW5kbGUgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJOb3QgZW5vdWdoIHJlc291cmNlcyB0byBjcmVhdGUgdGhyZWFkIik7CisJCXJldHVybigtMSk7CisJfQorCXJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCit7CisJaW50IGk7CisJc2lnc2V0X3QgbWFzazsKKwlpbnQgb2xkc3RhdGU7CisKKwkvKiBNYXNrIGFzeW5jaHJvbm91cyBzaWduYWxzIGZvciB0aGlzIHRocmVhZCAqLworCXNpZ2VtcHR5c2V0KCZtYXNrKTsKKwlmb3IgKCBpPTA7IHNpZ19saXN0W2ldOyArK2kgKSB7CisJCXNpZ2FkZHNldCgmbWFzaywgc2lnX2xpc3RbaV0pOworCX0KKwlwdGhfc2lnbWFzayhTSUdfQkxPQ0ssICZtYXNrLCAwKTsKKworCS8qIEFsbG93IG91cnNlbHZlcyB0byBiZSBhc3luY2hyb25vdXNseSBjYW5jZWxsZWQgKi8KKwlwdGhfY2FuY2VsX3N0YXRlKFBUSF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmb2xkc3RhdGUpOworfQorCisvKiBXQVJOSU5HOiAgVGhpcyBtYXkgbm90IHdvcmsgZm9yIHN5c3RlbXMgd2l0aCA2NC1iaXQgcGlkX3QgKi8KK1VpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKK3sKKwlyZXR1cm4oKFVpbnQzMilwdGhfc2VsZigpKTsKK30KKwordm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworCXB0aF9qb2luKHRocmVhZC0+aGFuZGxlLCBOVUxMKTsKK30KKwordm9pZCBTRExfU1lTX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworCXB0aF9jYW5jZWwodGhyZWFkLT5oYW5kbGUpOworCXB0aF9qb2luKHRocmVhZC0+aGFuZGxlLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aC9TRExfc3lzdGhyZWFkX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aC9TRExfc3lzdGhyZWFkX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJiMjZkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcHRoL1NETF9zeXN0aHJlYWRfYy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfU1lTVEhSRUFEX0NfSF8KKyNkZWZpbmUgX1NETF9TWVNUSFJFQURfQ19IXworCisjaW5jbHVkZSA8cHRoLmg+CisKK3R5cGVkZWYgcHRoX3QgU1lTX1RocmVhZEhhbmRsZTsKKworI2VuZGlmIC8qIF9TRExfU1lTVEhSRUFEX0NfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c2NvbmQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c2NvbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJjZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzY29uZC5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3N5c211dGV4X2MuaCIKKworc3RydWN0IFNETF9jb25kCit7CisJcHRocmVhZF9jb25kX3QgY29uZDsKK307CisKKy8qIENyZWF0ZSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLworU0RMX2NvbmQgKiBTRExfQ3JlYXRlQ29uZCh2b2lkKQoreworCVNETF9jb25kICpjb25kOworCisJY29uZCA9IChTRExfY29uZCAqKSBTRExfbWFsbG9jKHNpemVvZihTRExfY29uZCkpOworCWlmICggY29uZCApIHsKKwkJaWYgKCBwdGhyZWFkX2NvbmRfaW5pdCgmY29uZC0+Y29uZCwgTlVMTCkgPCAwICkgeworCQkJU0RMX1NldEVycm9yKCJwdGhyZWFkX2NvbmRfaW5pdCgpIGZhaWxlZCIpOworCQkJU0RMX2ZyZWUoY29uZCk7CisJCQljb25kID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4oY29uZCk7Cit9CisKKy8qIERlc3Ryb3kgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KK3ZvaWQgU0RMX0Rlc3Ryb3lDb25kKFNETF9jb25kICpjb25kKQoreworCWlmICggY29uZCApIHsKKwkJcHRocmVhZF9jb25kX2Rlc3Ryb3koJmNvbmQtPmNvbmQpOworCQlTRExfZnJlZShjb25kKTsKKwl9Cit9CisKKy8qIFJlc3RhcnQgb25lIG9mIHRoZSB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSAqLworaW50IFNETF9Db25kU2lnbmFsKFNETF9jb25kICpjb25kKQoreworCWludCByZXR2YWw7CisKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dmFsID0gMDsKKwlpZiAoIHB0aHJlYWRfY29uZF9zaWduYWwoJmNvbmQtPmNvbmQpICE9IDAgKSB7CisJCVNETF9TZXRFcnJvcigicHRocmVhZF9jb25kX3NpZ25hbCgpIGZhaWxlZCIpOworCQlyZXR2YWwgPSAtMTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogUmVzdGFydCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KK2ludCBTRExfQ29uZEJyb2FkY2FzdChTRExfY29uZCAqY29uZCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIGNvbmQgKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHZhbCA9IDA7CisJaWYgKCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjb25kLT5jb25kKSAhPSAwICkgeworCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfY29uZF9icm9hZGNhc3QoKSBmYWlsZWQiKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBTRExfQ29uZFdhaXRUaW1lb3V0KFNETF9jb25kICpjb25kLCBTRExfbXV0ZXggKm11dGV4LCBVaW50MzIgbXMpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgdGltZXZhbCBkZWx0YTsKKwlzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKKworCWlmICggISBjb25kICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlnZXR0aW1lb2ZkYXkoJmRlbHRhLCBOVUxMKTsKKworCWFic3RpbWUudHZfc2VjID0gZGVsdGEudHZfc2VjICsgKG1zLzEwMDApOworCWFic3RpbWUudHZfbnNlYyA9IChkZWx0YS50dl91c2VjICsgKG1zJTEwMDApICogMTAwMCkgKiAxMDAwOworICAgICAgICBpZiAoIGFic3RpbWUudHZfbnNlYyA+IDEwMDAwMDAwMDAgKSB7CisgICAgICAgICAgYWJzdGltZS50dl9zZWMgKz0gMTsKKyAgICAgICAgICBhYnN0aW1lLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKKyAgICAgICAgfQorCisgIHRyeWFnYWluOgorCXJldHZhbCA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJmNvbmQtPmNvbmQsICZtdXRleC0+aWQsICZhYnN0aW1lKTsKKwlzd2l0Y2ggKHJldHZhbCkgeworCSAgICBjYXNlIEVJTlRSOgorCQlnb3RvIHRyeWFnYWluOworCQlicmVhazsKKwkgICAgY2FzZSBFVElNRURPVVQ6CisJCXJldHZhbCA9IFNETF9NVVRFWF9USU1FRE9VVDsKKwkJYnJlYWs7CisJICAgIGNhc2UgMDoKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCVNETF9TZXRFcnJvcigicHRocmVhZF9jb25kX3RpbWVkd2FpdCgpIGZhaWxlZCIpOworCQlyZXR2YWwgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgdW5sb2NraW5nIHRoZSBwcm92aWRlZCBtdXRleC4KKyAgIFRoZSBtdXRleCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbiEKKyAqLworaW50IFNETF9Db25kV2FpdChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIGNvbmQgKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHZhbCA9IDA7CisJaWYgKCBwdGhyZWFkX2NvbmRfd2FpdCgmY29uZC0+Y29uZCwgJm11dGV4LT5pZCkgIT0gMCApIHsKKwkJU0RMX1NldEVycm9yKCJwdGhyZWFkX2NvbmRfd2FpdCgpIGZhaWxlZCIpOworCQlyZXR2YWwgPSAtMTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c211dGV4LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXNtdXRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjhjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXNtdXRleC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKworI2lmICFTRExfVEhSRUFEX1BUSFJFQURfUkVDVVJTSVZFX01VVEVYICYmIFwKKyAgICAhU0RMX1RIUkVBRF9QVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9OUAorI2RlZmluZSBGQUtFX1JFQ1VSU0lWRV9NVVRFWAorI2VuZGlmCisKK3N0cnVjdCBTRExfbXV0ZXggeworCXB0aHJlYWRfbXV0ZXhfdCBpZDsKKyNpZiBGQUtFX1JFQ1VSU0lWRV9NVVRFWAorCWludCByZWN1cnNpdmU7CisJcHRocmVhZF90IG93bmVyOworI2VuZGlmCit9OworCitTRExfbXV0ZXggKlNETF9DcmVhdGVNdXRleCAodm9pZCkKK3sKKwlTRExfbXV0ZXggKm11dGV4OworCXB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cjsKKworCS8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgKi8KKwltdXRleCA9IChTRExfbXV0ZXggKilTRExfY2FsbG9jKDEsIHNpemVvZigqbXV0ZXgpKTsKKwlpZiAoIG11dGV4ICkgeworCQlwdGhyZWFkX211dGV4YXR0cl9pbml0KCZhdHRyKTsKKyNpZiBTRExfVEhSRUFEX1BUSFJFQURfUkVDVVJTSVZFX01VVEVYCisJCXB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJmF0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsKKyNlbGlmIFNETF9USFJFQURfUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfTlAKKwkJcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucCgmYXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOworI2Vsc2UKKwkJLyogTm8gZXh0cmEgYXR0cmlidXRlcyBuZWNlc3NhcnkgKi8KKyNlbmRpZgorCQlpZiAoIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXgtPmlkLCAmYXR0cikgIT0gMCApIHsKKwkJCVNETF9TZXRFcnJvcigicHRocmVhZF9tdXRleF9pbml0KCkgZmFpbGVkIik7CisJCQlTRExfZnJlZShtdXRleCk7CisJCQltdXRleCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwl9CisJcmV0dXJuKG11dGV4KTsKK30KKwordm9pZCBTRExfRGVzdHJveU11dGV4KFNETF9tdXRleCAqbXV0ZXgpCit7CisJaWYgKCBtdXRleCApIHsKKwkJcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleC0+aWQpOworCQlTRExfZnJlZShtdXRleCk7CisJfQorfQorCisvKiBMb2NrIHRoZSBtdXRleCAqLworaW50IFNETF9tdXRleFAoU0RMX211dGV4ICptdXRleCkKK3sKKwlpbnQgcmV0dmFsOworI2lmIEZBS0VfUkVDVVJTSVZFX01VVEVYCisJcHRocmVhZF90IHRoaXNfdGhyZWFkOworI2VuZGlmCisKKwlpZiAoIG11dGV4ID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dmFsID0gMDsKKyNpZiBGQUtFX1JFQ1VSU0lWRV9NVVRFWAorCXRoaXNfdGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CisJaWYgKCBtdXRleC0+b3duZXIgPT0gdGhpc190aHJlYWQgKSB7CisJCSsrbXV0ZXgtPnJlY3Vyc2l2ZTsKKwl9IGVsc2UgeworCQkvKiBUaGUgb3JkZXIgb2Ygb3BlcmF0aW9ucyBpcyBpbXBvcnRhbnQuCisJCSAgIFdlIHNldCB0aGUgbG9ja2luZyB0aHJlYWQgaWQgYWZ0ZXIgd2Ugb2J0YWluIHRoZSBsb2NrCisJCSAgIHNvIHVubG9ja3MgZnJvbSBvdGhlciB0aHJlYWRzIHdpbGwgZmFpbC4KKwkJKi8KKwkJaWYgKCBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4LT5pZCkgPT0gMCApIHsKKwkJCW11dGV4LT5vd25lciA9IHRoaXNfdGhyZWFkOworCQkJbXV0ZXgtPnJlY3Vyc2l2ZSA9IDA7CisJCX0gZWxzZSB7CisJCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfbXV0ZXhfbG9jaygpIGZhaWxlZCIpOworCQkJcmV0dmFsID0gLTE7CisJCX0KKwl9CisjZWxzZQorCWlmICggcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleC0+aWQpIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJwdGhyZWFkX211dGV4X2xvY2soKSBmYWlsZWQiKTsKKwkJcmV0dmFsID0gLTE7CisJfQorI2VuZGlmCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IFNETF9tdXRleFYoU0RMX211dGV4ICptdXRleCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCBtdXRleCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHZhbCA9IDA7CisjaWYgRkFLRV9SRUNVUlNJVkVfTVVURVgKKwkvKiBXZSBjYW4gb25seSB1bmxvY2sgdGhlIG11dGV4IGlmIHdlIG93biBpdCAqLworCWlmICggcHRocmVhZF9zZWxmKCkgPT0gbXV0ZXgtPm93bmVyICkgeworCQlpZiAoIG11dGV4LT5yZWN1cnNpdmUgKSB7CisJCQktLW11dGV4LT5yZWN1cnNpdmU7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgb3JkZXIgb2Ygb3BlcmF0aW9ucyBpcyBpbXBvcnRhbnQuCisJCQkgICBGaXJzdCByZXNldCB0aGUgb3duZXIgc28gYW5vdGhlciB0aHJlYWQgZG9lc24ndCBsb2NrCisJCQkgICB0aGUgbXV0ZXggYW5kIHNldCB0aGUgb3duZXJzaGlwIGJlZm9yZSB3ZSByZXNldCBpdCwKKwkJCSAgIHRoZW4gcmVsZWFzZSB0aGUgbG9jayBzZW1hcGhvcmUuCisJCQkgKi8KKwkJCW11dGV4LT5vd25lciA9IDA7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgtPmlkKTsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9TZXRFcnJvcigibXV0ZXggbm90IG93bmVkIGJ5IHRoaXMgdGhyZWFkIik7CisJCXJldHZhbCA9IC0xOworCX0KKworI2Vsc2UKKwlpZiAoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleC0+aWQpIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJwdGhyZWFkX211dGV4X3VubG9jaygpIGZhaWxlZCIpOworCQlyZXR2YWwgPSAtMTsKKwl9CisjZW5kaWYgLyogRkFLRV9SRUNVUlNJVkVfTVVURVggKi8KKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXNtdXRleF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9wdGhyZWFkL1NETF9zeXNtdXRleF9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1ODg5MAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c211dGV4X2MuaApAQCAtMCwwICsxLDMxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX211dGV4X2NfaAorI2RlZmluZSBfU0RMX211dGV4X2NfaAorCitzdHJ1Y3QgU0RMX211dGV4IHsKKwlwdGhyZWFkX211dGV4X3QgaWQ7Cit9OworCisjZW5kaWYgLyogX1NETF9tdXRleF9jX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3NlbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzc2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzODcwZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3NlbS5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisKKy8qIFdyYXBwZXIgYXJvdW5kIFBPU0lYIDEwMDMuMWIgc2VtYXBob3JlcyAqLworCisjaWZkZWYgX19NQUNPU1hfXworLyogTWFjIE9TIFggZG9lc24ndCBzdXBwb3J0IHNlbV9nZXR2YWx1ZSgpIGFzIG9mIHZlcnNpb24gMTAuNCAqLworI2luY2x1ZGUgIi4uL2dlbmVyaWMvU0RMX3N5c3NlbS5jIgorI2Vsc2UKKworc3RydWN0IFNETF9zZW1hcGhvcmUgeworCXNlbV90IHNlbTsKK307CisKKy8qIENyZWF0ZSBhIHNlbWFwaG9yZSwgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZSAqLworU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKK3sKKwlTRExfc2VtICpzZW0gPSAoU0RMX3NlbSAqKSBTRExfbWFsbG9jKHNpemVvZihTRExfc2VtKSk7CisJaWYgKCBzZW0gKSB7CisJCWlmICggc2VtX2luaXQoJnNlbS0+c2VtLCAwLCBpbml0aWFsX3ZhbHVlKSA8IDAgKSB7CisJCQlTRExfU2V0RXJyb3IoInNlbV9pbml0KCkgZmFpbGVkIik7CisJCQlTRExfZnJlZShzZW0pOworCQkJc2VtID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCX0KKwlyZXR1cm4gc2VtOworfQorCit2b2lkIFNETF9EZXN0cm95U2VtYXBob3JlKFNETF9zZW0gKnNlbSkKK3sKKwlpZiAoIHNlbSApIHsKKwkJc2VtX2Rlc3Ryb3koJnNlbS0+c2VtKTsKKwkJU0RMX2ZyZWUoc2VtKTsKKwl9Cit9CisKK2ludCBTRExfU2VtVHJ5V2FpdChTRExfc2VtICpzZW0pCit7CisJaW50IHJldHZhbDsKKworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR2YWwgPSBTRExfTVVURVhfVElNRURPVVQ7CisJaWYgKCBzZW1fdHJ5d2FpdCgmc2VtLT5zZW0pID09IDAgKSB7CisJCXJldHZhbCA9IDA7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCit7CisJaW50IHJldHZhbDsKKworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdoaWxlICggKChyZXR2YWwgPSBzZW1fd2FpdCgmc2VtLT5zZW0pKSA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSApIHt9CisJaWYgKCByZXR2YWwgPCAwICkgeworCQlTRExfU2V0RXJyb3IoInNlbV93YWl0KCkgZmFpbGVkIik7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBTRExfU2VtV2FpdFRpbWVvdXQoU0RMX3NlbSAqc2VtLCBVaW50MzIgdGltZW91dCkKK3sKKwlpbnQgcmV0dmFsOworI2lmZGVmIEhBVkVfU0VNX1RJTUVEV0FJVAorCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlzdHJ1Y3QgdGltZXNwZWMgdHNfdGltZW91dDsKKyNlbHNlCisJVWludDMyIGVuZDsKKyNlbmRpZgorCisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVHJ5IHRoZSBlYXN5IGNhc2VzIGZpcnN0ICovCisJaWYgKCB0aW1lb3V0ID09IDAgKSB7CisJCXJldHVybiBTRExfU2VtVHJ5V2FpdChzZW0pOworCX0KKwlpZiAoIHRpbWVvdXQgPT0gU0RMX01VVEVYX01BWFdBSVQgKSB7CisJCXJldHVybiBTRExfU2VtV2FpdChzZW0pOworCX0KKworI2lmZGVmIEhBVkVfU0VNX1RJTUVEV0FJVAorCS8qIFNldHVwIHRoZSB0aW1lb3V0LiBzZW1fdGltZWR3YWl0IGRvZXNuJ3Qgd2FpdCBmb3IKKwkgKiBhIGxhcHNlIG9mIHRpbWUsIGJ1dCB1bnRpbCB3ZSByZWFjaCBhIGNlcnRhaW4gdGltZS4KKwkgKiBUaGlzIHRpbWUgaXMgbm93IHBsdXMgdGhlIHRpbWVvdXQuCisJICovCisJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCisJLyogQWRkIG91ciB0aW1lb3V0IHRvIGN1cnJlbnQgdGltZSAqLworCW5vdy50dl91c2VjICs9ICh0aW1lb3V0ICUgMTAwMCkgKiAxMDAwOworCW5vdy50dl9zZWMgKz0gdGltZW91dCAvIDEwMDA7CisKKwkvKiBXcmFwIHRoZSBzZWNvbmQgaWYgbmVlZGVkICovCisJaWYgKCBub3cudHZfdXNlYyA+PSAxMDAwMDAwICkgeworCQlub3cudHZfdXNlYyAtPSAxMDAwMDAwOworCQlub3cudHZfc2VjICsrOworCX0KKworCS8qIENvbnZlcnQgdG8gdGltZXNwZWMgKi8KKwl0c190aW1lb3V0LnR2X3NlYyA9IG5vdy50dl9zZWM7CisJdHNfdGltZW91dC50dl9uc2VjID0gbm93LnR2X3VzZWMgKiAxMDAwOworCisJLyogV2FpdC4gKi8KKwlkbworCQlyZXR2YWwgPSBzZW1fdGltZWR3YWl0KCZzZW0tPnNlbSwgJnRzX3RpbWVvdXQpOworCXdoaWxlIChyZXR2YWwgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisJaWYgKHJldHZhbCA9PSAtMSkKKwkJU0RMX1NldEVycm9yKHN0cmVycm9yKGVycm5vKSk7CisjZWxzZQorCWVuZCA9IFNETF9HZXRUaWNrcygpICsgdGltZW91dDsKKwl3aGlsZSAoKHJldHZhbCA9IFNETF9TZW1UcnlXYWl0KHNlbSkpID09IFNETF9NVVRFWF9USU1FRE9VVCkgeworCQlpZiAoKFNETF9HZXRUaWNrcygpIC0gZW5kKSA+PSAwKSB7CisJCQlicmVhazsKKwkJfQorCQlTRExfRGVsYXkoMCk7CisJfQorI2VuZGlmIC8qIEhBVkVfU0VNX1RJTUVEV0FJVCAqLworCisJcmV0dXJuIHJldHZhbDsKK30KKworVWludDMyIFNETF9TZW1WYWx1ZShTRExfc2VtICpzZW0pCit7CisJaW50IHJldCA9IDA7CisJaWYgKCBzZW0gKSB7CisJCXNlbV9nZXR2YWx1ZSgmc2VtLT5zZW0sICZyZXQpOworCQlpZiAoIHJldCA8IDAgKSB7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiAoVWludDMyKXJldDsKK30KKworaW50IFNETF9TZW1Qb3N0KFNETF9zZW0gKnNlbSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dmFsID0gc2VtX3Bvc3QoJnNlbS0+c2VtKTsKKwlpZiAoIHJldHZhbCA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigic2VtX3Bvc3QoKSBmYWlsZWQiKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8qIF9fTUFDT1NYX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3RocmVhZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjYzNiNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3RocmVhZC5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICIuLi9TRExfdGhyZWFkX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdGhyZWFkLmgiCisKKy8qIExpc3Qgb2Ygc2lnbmFscyB0byBtYXNrIGluIHRoZSBzdWJ0aHJlYWRzICovCitzdGF0aWMgaW50IHNpZ19saXN0W10gPSB7CisJU0lHSFVQLCBTSUdJTlQsIFNJR1FVSVQsIFNJR1BJUEUsIFNJR0FMUk0sIFNJR1RFUk0sIFNJR0NITEQsIFNJR1dJTkNILAorCVNJR1ZUQUxSTSwgU0lHUFJPRiwgMAorfTsKKworI2lmZGVmIF9fUklTQ09TX18KKy8qIFJJU0MgT1MgbmVlZHMgdG8ga25vdyB0aGUgbWFpbiB0aHJlYWQgZm9yCisgKiBpdCdzIHRpbWVyIGFuZCBldmVudCBwcm9jZXNzaW5nLiAqLworaW50IHJpc2Nvc191c2luZ190aHJlYWRzID0gMDsKK1VpbnQzMiByaXNjb3NfbWFpbl90aHJlYWQgPSAwOyAvKiBUaHJlYWQgcnVubmluZyBldmVudHMgKi8KKyNlbmRpZgorIAorCitzdGF0aWMgdm9pZCAqUnVuVGhyZWFkKHZvaWQgKmRhdGEpCit7CisJU0RMX1J1blRocmVhZChkYXRhKTsKKwlwdGhyZWFkX2V4aXQoKHZvaWQqKTApOworCXJldHVybigodm9pZCAqKTApOwkJLyogUHJldmVudCBjb21waWxlciB3YXJuaW5nICovCit9CisKK2ludCBTRExfU1lTX0NyZWF0ZVRocmVhZChTRExfVGhyZWFkICp0aHJlYWQsIHZvaWQgKmFyZ3MpCit7CisJcHRocmVhZF9hdHRyX3QgdHlwZTsKKworCS8qIFNldCB0aGUgdGhyZWFkIGF0dHJpYnV0ZXMgKi8KKwlpZiAoIHB0aHJlYWRfYXR0cl9pbml0KCZ0eXBlKSAhPSAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGluaXRpYWxpemUgcHRocmVhZCBhdHRyaWJ1dGVzIik7CisJCXJldHVybigtMSk7CisJfQorCXB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdHlwZSwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworCisJLyogQ3JlYXRlIHRoZSB0aHJlYWQgYW5kIGdvISAqLworCWlmICggcHRocmVhZF9jcmVhdGUoJnRocmVhZC0+aGFuZGxlLCAmdHlwZSwgUnVuVGhyZWFkLCBhcmdzKSAhPSAwICkgeworCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKyNpZmRlZiBfX1JJU0NPU19fCisJaWYgKHJpc2Nvc191c2luZ190aHJlYWRzID09IDApIHsKKwkJcmlzY29zX3VzaW5nX3RocmVhZHMgPSAxOworCQlyaXNjb3NfbWFpbl90aHJlYWQgPSBTRExfVGhyZWFkSUQoKTsKKwl9CisjZW5kaWYKKworCXJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCit7CisJaW50IGk7CisJc2lnc2V0X3QgbWFzazsKKworCS8qIE1hc2sgYXN5bmNocm9ub3VzIHNpZ25hbHMgZm9yIHRoaXMgdGhyZWFkICovCisJc2lnZW1wdHlzZXQoJm1hc2spOworCWZvciAoIGk9MDsgc2lnX2xpc3RbaV07ICsraSApIHsKKwkJc2lnYWRkc2V0KCZtYXNrLCBzaWdfbGlzdFtpXSk7CisJfQorCXB0aHJlYWRfc2lnbWFzayhTSUdfQkxPQ0ssICZtYXNrLCAwKTsKKworI2lmZGVmIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUworCS8qIEFsbG93IG91cnNlbHZlcyB0byBiZSBhc3luY2hyb25vdXNseSBjYW5jZWxsZWQgKi8KKwl7IGludCBvbGRzdGF0ZTsKKwkJcHRocmVhZF9zZXRjYW5jZWx0eXBlKFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUywgJm9sZHN0YXRlKTsKKwl9CisjZW5kaWYKK30KKworLyogV0FSTklORzogIFRoaXMgbWF5IG5vdCB3b3JrIGZvciBzeXN0ZW1zIHdpdGggNjQtYml0IHBpZF90ICovCitVaW50MzIgU0RMX1RocmVhZElEKHZvaWQpCit7CisJcmV0dXJuKChVaW50MzIpKChzaXplX3QpcHRocmVhZF9zZWxmKCkpKTsKK30KKwordm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworCXB0aHJlYWRfam9pbih0aHJlYWQtPmhhbmRsZSwgMCk7Cit9CisKK3ZvaWQgU0RMX1NZU19LaWxsVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKK3sKKyNpZmRlZiBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMKKwlwdGhyZWFkX2NhbmNlbCh0aHJlYWQtPmhhbmRsZSk7CisjZWxzZQorI2lmZGVmIF9fRlJFRUJTRF9fCisjd2FybmluZyBGb3Igc29tZSByZWFzb24sIHRoaXMgZG9lc250IGFjdHVhbGx5IGtpbGwgYSB0aHJlYWQgLSBGcmVlQlNEIDMuMgorI2VuZGlmCisJcHRocmVhZF9raWxsKHRocmVhZC0+aGFuZGxlLCBTSUdLSUxMKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcHRocmVhZC9TRExfc3lzdGhyZWFkX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3RocmVhZF9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlZDc1MAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3B0aHJlYWQvU0RMX3N5c3RocmVhZF9jLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK3R5cGVkZWYgcHRocmVhZF90IFNZU19UaHJlYWRIYW5kbGU7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c2NvbmQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzY29uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTU2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c2NvbmQuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFJJU0MgT1MgaW1wbGVtZW50YXRpb25zIHVzZXMgcHRocmVhZHMgYmFzZWQgb24gbGludXggY29kZSAqLworCisjaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKKyNpbmNsdWRlICIuLi9nZW5lcmljL1NETF9zeXNjb25kLmMiCisjZWxzZQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF9zeXNtdXRleF9jLmgiCisKK3N0cnVjdCBTRExfY29uZAoreworCXB0aHJlYWRfY29uZF90IGNvbmQ7Cit9OworCisvKiBDcmVhdGUgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KK1NETF9jb25kICogU0RMX0NyZWF0ZUNvbmQodm9pZCkKK3sKKwlTRExfY29uZCAqY29uZDsKKworCWNvbmQgPSAoU0RMX2NvbmQgKikgU0RMX21hbGxvYyhzaXplb2YoU0RMX2NvbmQpKTsKKwlpZiAoIGNvbmQgKSB7CisJCWlmICggcHRocmVhZF9jb25kX2luaXQoJmNvbmQtPmNvbmQsIE5VTEwpIDwgMCApIHsKKwkJCVNETF9TZXRFcnJvcigicHRocmVhZF9jb25kX2luaXQoKSBmYWlsZWQiKTsKKwkJCVNETF9mcmVlKGNvbmQpOworCQkJY29uZCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuKGNvbmQpOworfQorCisvKiBEZXN0cm95IGEgY29uZGl0aW9uIHZhcmlhYmxlICovCit2b2lkIFNETF9EZXN0cm95Q29uZChTRExfY29uZCAqY29uZCkKK3sKKwlpZiAoIGNvbmQgKSB7CisJCXB0aHJlYWRfY29uZF9kZXN0cm95KCZjb25kLT5jb25kKTsKKwkJU0RMX2ZyZWUoY29uZCk7CisJfQorfQorCisvKiBSZXN0YXJ0IG9uZSBvZiB0aGUgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgKi8KK2ludCBTRExfQ29uZFNpZ25hbChTRExfY29uZCAqY29uZCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIGNvbmQgKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBjb25kaXRpb24gdmFyaWFibGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHZhbCA9IDA7CisJaWYgKCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZjb25kLT5jb25kKSAhPSAwICkgeworCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfY29uZF9zaWduYWwoKSBmYWlsZWQiKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFJlc3RhcnQgYWxsIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlICovCitpbnQgU0RMX0NvbmRCcm9hZGNhc3QoU0RMX2NvbmQgKmNvbmQpCit7CisJaW50IHJldHZhbDsKKworCWlmICggISBjb25kICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR2YWwgPSAwOworCWlmICggcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmY29uZC0+Y29uZCkgIT0gMCApIHsKKwkJU0RMX1NldEVycm9yKCJwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCkgZmFpbGVkIik7CisJCXJldHZhbCA9IC0xOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgU0RMX0NvbmRXYWl0VGltZW91dChTRExfY29uZCAqY29uZCwgU0RMX211dGV4ICptdXRleCwgVWludDMyIG1zKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHRpbWV2YWwgZGVsdGE7CisJc3RydWN0IHRpbWVzcGVjIGFic3RpbWU7CisKKwlpZiAoICEgY29uZCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIGNvbmRpdGlvbiB2YXJpYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZ2V0dGltZW9mZGF5KCZkZWx0YSwgTlVMTCk7CisKKwlhYnN0aW1lLnR2X3NlYyA9IGRlbHRhLnR2X3NlYyArIChtcy8xMDAwKTsKKwlhYnN0aW1lLnR2X25zZWMgPSAoZGVsdGEudHZfdXNlYyArIChtcyUxMDAwKSAqIDEwMDApICogMTAwMDsKKyAgICAgICAgaWYgKCBhYnN0aW1lLnR2X25zZWMgPiAxMDAwMDAwMDAwICkgeworICAgICAgICAgIGFic3RpbWUudHZfc2VjICs9IDE7CisgICAgICAgICAgYWJzdGltZS50dl9uc2VjIC09IDEwMDAwMDAwMDA7CisgICAgICAgIH0KKworICB0cnlhZ2FpbjoKKwlyZXR2YWwgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZjb25kLT5jb25kLCAmbXV0ZXgtPmlkLCAmYWJzdGltZSk7CisJc3dpdGNoIChyZXR2YWwpIHsKKwkgICAgY2FzZSBFSU5UUjoKKwkJZ290byB0cnlhZ2FpbjsKKwkJYnJlYWs7CisJICAgIGNhc2UgRVRJTUVET1VUOgorCQlyZXR2YWwgPSBTRExfTVVURVhfVElNRURPVVQ7CisJCWJyZWFrOworCSAgICBjYXNlIDA6CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlTRExfU2V0RXJyb3IoInB0aHJlYWRfY29uZF90aW1lZHdhaXQoKSBmYWlsZWQiKTsKKwkJcmV0dmFsID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUsIHVubG9ja2luZyB0aGUgcHJvdmlkZWQgbXV0ZXguCisgICBUaGUgbXV0ZXggbXVzdCBiZSBsb2NrZWQgYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuY3Rpb24hCisgKi8KK2ludCBTRExfQ29uZFdhaXQoU0RMX2NvbmQgKmNvbmQsIFNETF9tdXRleCAqbXV0ZXgpCit7CisJaW50IHJldHZhbDsKKworCWlmICggISBjb25kICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgY29uZGl0aW9uIHZhcmlhYmxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR2YWwgPSAwOworCWlmICggcHRocmVhZF9jb25kX3dhaXQoJmNvbmQtPmNvbmQsICZtdXRleC0+aWQpICE9IDAgKSB7CisJCVNETF9TZXRFcnJvcigicHRocmVhZF9jb25kX3dhaXQoKSBmYWlsZWQiKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzbXV0ZXguYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzbXV0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWFjMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXNtdXRleC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogUklTQyBPUyBpbXBsZW1lbnRhdGlvbnMgdXNlcyBwdGhyZWFkcyBiYXNlZCBvbiBsaW51eCBjb2RlICovCisKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisKKyNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAorI2luY2x1ZGUgIi4uL2dlbmVyaWMvU0RMX3N5c211dGV4LmMiCisjZWxzZQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCitzdHJ1Y3QgU0RMX211dGV4IHsKKwlwdGhyZWFkX211dGV4X3QgaWQ7CisjaWYgU0RMX1RIUkVBRF9QVEhSRUFEX05PX1JFQ1VSU0lWRV9NVVRFWAorCWludCByZWN1cnNpdmU7CisJcHRocmVhZF90IG93bmVyOworI2VuZGlmCit9OworCitTRExfbXV0ZXggKlNETF9DcmVhdGVNdXRleCAodm9pZCkKK3sKKwlTRExfbXV0ZXggKm11dGV4OworCXB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cjsKKworCS8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgKi8KKwltdXRleCA9IChTRExfbXV0ZXggKilTRExfY2FsbG9jKDEsIHNpemVvZigqbXV0ZXgpKTsKKwlpZiAoIG11dGV4ICkgeworCQlwdGhyZWFkX211dGV4YXR0cl9pbml0KCZhdHRyKTsKKyNpZiBTRExfVEhSRUFEX1BUSFJFQURfTk9fUkVDVVJTSVZFX01VVEVYCisJCS8qIE5vIGV4dHJhIGF0dHJpYnV0ZXMgbmVjZXNzYXJ5ICovCisjZWxzZQorCQlwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZhdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisjZW5kaWYgLyogU0RMX1RIUkVBRF9QVEhSRUFEX05PX1JFQ1VSU0lWRV9NVVRFWCAqLworCQlpZiAoIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXgtPmlkLCAmYXR0cikgIT0gMCApIHsKKwkJCVNETF9TZXRFcnJvcigicHRocmVhZF9tdXRleF9pbml0KCkgZmFpbGVkIik7CisJCQlTRExfZnJlZShtdXRleCk7CisJCQltdXRleCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwl9CisJcmV0dXJuKG11dGV4KTsKK30KKwordm9pZCBTRExfRGVzdHJveU11dGV4KFNETF9tdXRleCAqbXV0ZXgpCit7CisJaWYgKCBtdXRleCApIHsKKwkJcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleC0+aWQpOworCQlTRExfZnJlZShtdXRleCk7CisJfQorfQorCisvKiBMb2NrIHRoZSBtdXRleCAqLworaW50IFNETF9tdXRleFAoU0RMX211dGV4ICptdXRleCkKK3sKKwlpbnQgcmV0dmFsOworI2lmIFNETF9USFJFQURfUFRIUkVBRF9OT19SRUNVUlNJVkVfTVVURVgKKwlwdGhyZWFkX3QgdGhpc190aHJlYWQ7CisjZW5kaWYKKworCWlmICggbXV0ZXggPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR2YWwgPSAwOworI2lmIFNETF9USFJFQURfUFRIUkVBRF9OT19SRUNVUlNJVkVfTVVURVgKKwl0aGlzX3RocmVhZCA9IHB0aHJlYWRfc2VsZigpOworCWlmICggbXV0ZXgtPm93bmVyID09IHRoaXNfdGhyZWFkICkgeworCQkrK211dGV4LT5yZWN1cnNpdmU7CisJfSBlbHNlIHsKKwkJLyogVGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgaW1wb3J0YW50LgorCQkgICBXZSBzZXQgdGhlIGxvY2tpbmcgdGhyZWFkIGlkIGFmdGVyIHdlIG9idGFpbiB0aGUgbG9jaworCQkgICBzbyB1bmxvY2tzIGZyb20gb3RoZXIgdGhyZWFkcyB3aWxsIGZhaWwuCisJCSovCisJCWlmICggcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleC0+aWQpID09IDAgKSB7CisJCQltdXRleC0+b3duZXIgPSB0aGlzX3RocmVhZDsKKwkJCW11dGV4LT5yZWN1cnNpdmUgPSAwOworCQl9IGVsc2UgeworCQkJU0RMX1NldEVycm9yKCJwdGhyZWFkX211dGV4X2xvY2soKSBmYWlsZWQiKTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisJfQorI2Vsc2UKKwlpZiAoIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgtPmlkKSA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigicHRocmVhZF9tdXRleF9sb2NrKCkgZmFpbGVkIik7CisJCXJldHZhbCA9IC0xOworCX0KKyNlbmRpZgorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBTRExfbXV0ZXhWKFNETF9tdXRleCAqbXV0ZXgpCit7CisJaW50IHJldHZhbDsKKworCWlmICggbXV0ZXggPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR2YWwgPSAwOworI2lmIFNETF9USFJFQURfUFRIUkVBRF9OT19SRUNVUlNJVkVfTVVURVgKKwkvKiBXZSBjYW4gb25seSB1bmxvY2sgdGhlIG11dGV4IGlmIHdlIG93biBpdCAqLworCWlmICggcHRocmVhZF9zZWxmKCkgPT0gbXV0ZXgtPm93bmVyICkgeworCQlpZiAoIG11dGV4LT5yZWN1cnNpdmUgKSB7CisJCQktLW11dGV4LT5yZWN1cnNpdmU7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgb3JkZXIgb2Ygb3BlcmF0aW9ucyBpcyBpbXBvcnRhbnQuCisJCQkgICBGaXJzdCByZXNldCB0aGUgb3duZXIgc28gYW5vdGhlciB0aHJlYWQgZG9lc24ndCBsb2NrCisJCQkgICB0aGUgbXV0ZXggYW5kIHNldCB0aGUgb3duZXJzaGlwIGJlZm9yZSB3ZSByZXNldCBpdCwKKwkJCSAgIHRoZW4gcmVsZWFzZSB0aGUgbG9jayBzZW1hcGhvcmUuCisJCQkgKi8KKwkJCW11dGV4LT5vd25lciA9IDA7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgtPmlkKTsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9TZXRFcnJvcigibXV0ZXggbm90IG93bmVkIGJ5IHRoaXMgdGhyZWFkIik7CisJCXJldHZhbCA9IC0xOworCX0KKworI2Vsc2UKKwlpZiAoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleC0+aWQpIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJwdGhyZWFkX211dGV4X3VubG9jaygpIGZhaWxlZCIpOworCQlyZXR2YWwgPSAtMTsKKwl9CisjZW5kaWYgLyogU0RMX1RIUkVBRF9QVEhSRUFEX05PX1JFQ1VSU0lWRV9NVVRFWCAqLworCisJcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXNtdXRleF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c211dGV4X2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzkxYzNjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXNtdXRleF9jLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9tdXRleF9jX2gKKyNkZWZpbmUgX1NETF9tdXRleF9jX2gKKworI2lmICFTRExfVEhSRUFEU19ESVNBQkxFRAorc3RydWN0IFNETF9tdXRleCB7CisJcHRocmVhZF9tdXRleF90IGlkOworfTsKKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfU0RMX211dGV4X2NfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXNzZW0uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzc2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3MjExYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3Jpc2Nvcy9TRExfc3lzc2VtLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBSSVNDIE9TIHNlbWlwaG9yZXMgYmFzZWQgb24gbGludXggY29kZSAqLworCisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3N5c3RocmVhZF9jLmgiCisKKyNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKKworU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKK3sKKwlTRExfU2V0RXJyb3IoIlNETCBub3QgY29uZmlndXJlZCB3aXRoIHRocmVhZCBzdXBwb3J0Iik7CisJcmV0dXJuIChTRExfc2VtICopMDsKK30KKwordm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCit7CisJcmV0dXJuOworfQorCitpbnQgU0RMX1NlbVRyeVdhaXQoU0RMX3NlbSAqc2VtKQoreworCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBTRExfU2VtV2FpdFRpbWVvdXQoU0RMX3NlbSAqc2VtLCBVaW50MzIgdGltZW91dCkKK3sKKwlTRExfU2V0RXJyb3IoIlNETCBub3QgY29uZmlndXJlZCB3aXRoIHRocmVhZCBzdXBwb3J0Iik7CisJcmV0dXJuIC0xOworfQorCitpbnQgU0RMX1NlbVdhaXQoU0RMX3NlbSAqc2VtKQoreworCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKKwlyZXR1cm4gLTE7Cit9CisKK1VpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQoreworCXJldHVybiAwOworfQorCitpbnQgU0RMX1NlbVBvc3QoU0RMX3NlbSAqc2VtKQoreworCVNETF9TZXRFcnJvcigiU0RMIG5vdCBjb25maWd1cmVkIHdpdGggdGhyZWFkIHN1cHBvcnQiKTsKKwlyZXR1cm4gLTE7Cit9CisKKyNlbHNlCisKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgkJCS8qIEZvciBnZXRwaWQoKSAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKworc3RydWN0IFNETF9zZW1hcGhvcmUgeworCXNlbV90ICpzZW07CisJc2VtX3Qgc2VtX2RhdGE7Cit9OworCisvKiBDcmVhdGUgYSBzZW1hcGhvcmUsIGluaXRpYWxpemVkIHdpdGggdmFsdWUgKi8KK1NETF9zZW0gKlNETF9DcmVhdGVTZW1hcGhvcmUoVWludDMyIGluaXRpYWxfdmFsdWUpCit7CisJU0RMX3NlbSAqc2VtID0gKFNETF9zZW0gKikgU0RMX21hbGxvYyhzaXplb2YoU0RMX3NlbSkpOworCWlmICggc2VtICkgeworCQlpZiAoIHNlbV9pbml0KCZzZW0tPnNlbV9kYXRhLCAwLCBpbml0aWFsX3ZhbHVlKSA8IDAgKSB7CisJCQlTRExfU2V0RXJyb3IoInNlbV9pbml0KCkgZmFpbGVkIik7CisJCQlTRExfZnJlZShzZW0pOworCQkJc2VtID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXNlbS0+c2VtID0gJnNlbS0+c2VtX2RhdGE7CisJCX0KKwl9IGVsc2UgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwl9CisJcmV0dXJuIHNlbTsKK30KKwordm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCit7CisJaWYgKCBzZW0gKSB7CisJCXNlbV9kZXN0cm95KHNlbS0+c2VtKTsKKwkJU0RMX2ZyZWUoc2VtKTsKKwl9Cit9CisKK2ludCBTRExfU2VtVHJ5V2FpdChTRExfc2VtICpzZW0pCit7CisJaW50IHJldHZhbDsKKworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR2YWwgPSBTRExfTVVURVhfVElNRURPVVQ7CisJaWYgKCBzZW1fdHJ5d2FpdChzZW0tPnNlbSkgPT0gMCApIHsKKwkJcmV0dmFsID0gMDsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IFNETF9TZW1XYWl0KFNETF9zZW0gKnNlbSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJd2hpbGUgKCAoKHJldHZhbCA9IHNlbV93YWl0KHNlbS0+c2VtKSkgPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikgKSB7fQorCWlmICggcmV0dmFsIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJzZW1fd2FpdCgpIGZhaWxlZCIpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCit7CisJaW50IHJldHZhbDsKKworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW1hcGhvcmUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRyeSB0aGUgZWFzeSBjYXNlcyBmaXJzdCAqLworCWlmICggdGltZW91dCA9PSAwICkgeworCQlyZXR1cm4gU0RMX1NlbVRyeVdhaXQoc2VtKTsKKwl9CisJaWYgKCB0aW1lb3V0ID09IFNETF9NVVRFWF9NQVhXQUlUICkgeworCQlyZXR1cm4gU0RMX1NlbVdhaXQoc2VtKTsKKwl9CisKKwkvKiBBY2shICBXZSBoYXZlIHRvIGJ1c3kgd2FpdC4uLiAqLworCXRpbWVvdXQgKz0gU0RMX0dldFRpY2tzKCk7CisJZG8geworCQlyZXR2YWwgPSBTRExfU2VtVHJ5V2FpdChzZW0pOworCQlpZiAoIHJldHZhbCA9PSAwICkgeworCQkJYnJlYWs7CisJCX0KKwkJU0RMX0RlbGF5KDEpOworCX0gd2hpbGUgKCBTRExfR2V0VGlja3MoKSA8IHRpbWVvdXQgKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK1VpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQoreworCWludCByZXQgPSAwOworCWlmICggc2VtICkgeworCQlzZW1fZ2V0dmFsdWUoc2VtLT5zZW0sICZyZXQpOworCQlpZiAoIHJldCA8IDAgKSB7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiAoVWludDMyKXJldDsKK30KKworaW50IFNETF9TZW1Qb3N0KFNETF9zZW0gKnNlbSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCAhIHNlbSApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIHNlbWFwaG9yZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dmFsID0gc2VtX3Bvc3Qoc2VtLT5zZW0pOworCWlmICggcmV0dmFsIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJzZW1fcG9zdCgpIGZhaWxlZCIpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYgLyogIVNETF9USFJFQURTX0RJU0FCTEVEICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c3RocmVhZC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXN0aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZjMzMzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXN0aHJlYWQuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFJJU0MgT1MgdmVyc2lvbiBiYXNlZCBvbiBwdGhyZWFkcyBsaW51eCBzb3VyY2UgKi8KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdGhyZWFkLmgiCisKKyNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAorCitpbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzKQoreworCVNETF9TZXRFcnJvcigiVGhyZWFkcyBoYXZlIG5vdCBiZWVuIGNvbXBpbGVkIGludG8gdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5Iik7CisJcmV0dXJuKC0xKTsKK30KKwordm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCit7CisJcmV0dXJuOworfQorCitVaW50MzIgU0RMX1RocmVhZElEKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9TWVNfV2FpdFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisJcmV0dXJuOworfQorCit2b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisJcmV0dXJuOworfQorCisjZWxzZQorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKy8qIExpc3Qgb2Ygc2lnbmFscyB0byBtYXNrIGluIHRoZSBzdWJ0aHJlYWRzICovCitzdGF0aWMgaW50IHNpZ19saXN0W10gPSB7CisJU0lHSFVQLCBTSUdJTlQsIFNJR1FVSVQsIFNJR1BJUEUsIFNJR0FMUk0sIFNJR1RFUk0sIFNJR0NITEQsIFNJR1dJTkNILAorCVNJR1ZUQUxSTSwgU0lHUFJPRiwgMAorfTsKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworaW50IHJpc2Nvc191c2luZ190aHJlYWRzID0gMDsKK1VpbnQzMiByaXNjb3NfbWFpbl90aHJlYWQgPSAwOyAvKiBUaHJlYWQgcnVubmluZyBldmVudHMgKi8KKworc3RhdGljIHZvaWQgKlJ1blRocmVhZCh2b2lkICpkYXRhKQoreworCVNETF9SdW5UaHJlYWQoZGF0YSk7CisJcHRocmVhZF9leGl0KCh2b2lkKikwKTsKKwlyZXR1cm4oKHZvaWQgKikwKTsJCS8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZyAqLworfQorCitpbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzKQoreworCXB0aHJlYWRfYXR0cl90IHR5cGU7CisKKwkvKiBTZXQgdGhlIHRocmVhZCBhdHRyaWJ1dGVzICovCisJaWYgKCBwdGhyZWFkX2F0dHJfaW5pdCgmdHlwZSkgIT0gMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBpbml0aWFsaXplIHB0aHJlYWQgYXR0cmlidXRlcyIpOworCQlyZXR1cm4oLTEpOworCX0KKwlwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnR5cGUsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKworCS8qIENyZWF0ZSB0aGUgdGhyZWFkIGFuZCBnbyEgKi8KKwlpZiAoIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQtPmhhbmRsZSwgJnR5cGUsIFJ1blRocmVhZCwgYXJncykgIT0gMCApIHsKKwkJU0RMX1NldEVycm9yKCJOb3QgZW5vdWdoIHJlc291cmNlcyB0byBjcmVhdGUgdGhyZWFkIik7CisJCXJldHVybigtMSk7CisJfQorCisgICAgICAgIGlmIChyaXNjb3NfdXNpbmdfdGhyZWFkcyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgIHJpc2Nvc191c2luZ190aHJlYWRzID0gMTsKKyAgICAgICAgICAgcmlzY29zX21haW5fdGhyZWFkID0gU0RMX1RocmVhZElEKCk7CisgICAgICAgIH0KKyAgICAgIAorCXJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1NldHVwVGhyZWFkKHZvaWQpCit7CisJaW50IGk7CisJc2lnc2V0X3QgbWFzazsKKworCS8qIE1hc2sgYXN5bmNocm9ub3VzIHNpZ25hbHMgZm9yIHRoaXMgdGhyZWFkICovCisJc2lnZW1wdHlzZXQoJm1hc2spOworCWZvciAoIGk9MDsgc2lnX2xpc3RbaV07ICsraSApIHsKKwkJc2lnYWRkc2V0KCZtYXNrLCBzaWdfbGlzdFtpXSk7CisJfQorCXB0aHJlYWRfc2lnbWFzayhTSUdfQkxPQ0ssICZtYXNrLCAwKTsKKwkKKyNpZmRlZiBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMKKwkvKiBBbGxvdyBvdXJzZWx2ZXMgdG8gYmUgYXN5bmNocm9ub3VzbHkgY2FuY2VsbGVkICovCisJeyBpbnQgb2xkc3RhdGU7CisJCXB0aHJlYWRfc2V0Y2FuY2VsdHlwZShQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMsICZvbGRzdGF0ZSk7CisJfQorI2VuZGlmCit9CisKK1VpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKK3sKKwlyZXR1cm4oKFVpbnQzMilwdGhyZWFkX3NlbGYoKSk7Cit9CisKK3ZvaWQgU0RMX1NZU19XYWl0VGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCkKK3sKKwlwdGhyZWFkX2pvaW4odGhyZWFkLT5oYW5kbGUsIDApOworfQorCit2b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisjaWZkZWYgUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTCisJcHRocmVhZF9jYW5jZWwodGhyZWFkLT5oYW5kbGUpOworI2Vsc2UKKwlwdGhyZWFkX2tpbGwodGhyZWFkLT5oYW5kbGUsIFNJR0tJTEwpOworI2VuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXN0aHJlYWRfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvcmlzY29zL1NETF9zeXN0aHJlYWRfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMWQyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9yaXNjb3MvU0RMX3N5c3RocmVhZF9jLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAorCit0eXBlZGVmIGludCBTWVNfVGhyZWFkSGFuZGxlOworCisjZWxzZQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCit0eXBlZGVmIHB0aHJlYWRfdCBTWVNfVGhyZWFkSGFuZGxlOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3N5bWJpYW4vU0RMX3N5c211dGV4LmNwcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3N5bWJpYW4vU0RMX3N5c211dGV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIxYWVhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvc3ltYmlhbi9TRExfc3lzbXV0ZXguY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBkZXZvbHV0aW9uLmNvbQorKi8KKworLyoKKyAgICBTRExfc3lzbXV0ZXguY3BwCisKKyAgICBFcG9jIHZlcnNpb24gYnkgTWFya3VzIE1lcnRhbWEgKHdAaWtpLmZpKQorKi8KKworCisjaWZkZWYgU0FWRV9SQ1NJRAorc3RhdGljIGNoYXIgcmNzaWQgPQorICJAKCMpICRJZDogU0RMX3N5c211dGV4LmMsdiAxLjEuMi4zIDIwMDAvMDYvMjIgMTU6MjU6MjMgaGVyY3VsZXMgRXhwICQiOworI2VuZGlmCisKKy8qIE11dGV4IGZ1bmN0aW9ucyB1c2luZyB0aGUgV2luMzIgQVBJICovCisKKy8vI2luY2x1ZGUgPHN0ZGlvLmg+CisvLyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGUzMnN0ZC5oPgorCisjaW5jbHVkZSAiZXBvY19zZGwuaCIKKworI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF9tdXRleC5oIgorCisKKyNpZmRlZiBFS0EyIC8vPz8/CitzdHJ1Y3QgU0RMX211dGV4CisgICAgeworICAgIFRJbnQgaGFuZGxlOworICAgIH07CisjZWxzZQorc3RydWN0IF9TRExfbXV0ZXgKKyAgICB7CisgICAgVEludCBoYW5kbGU7CisgICAgfTsKKyNlbmRpZgorCitleHRlcm4gVEludCBDcmVhdGVVbmlxdWUoVEludCAoKmFGdW5jKShjb25zdCBURGVzQyYgYU5hbWUsIFRBbnkqLCBUQW55KiksIFRBbnkqLCBUQW55Kik7CisKK1RJbnQgTmV3TXV0ZXgoY29uc3QgVERlc0MmIGFOYW1lLCBUQW55KiBhUHRyMSwgVEFueSopCisgICAgeworICAgIHJldHVybiAoKFJNdXRleCopYVB0cjEpLT5DcmVhdGVHbG9iYWwoYU5hbWUpOworICAgIH0KKyAgICAKK3ZvaWQgRGVsZXRlTXV0ZXgoVEFueSogYU11dGV4KQorICAgIHsKKyAgICBTRExfRGVzdHJveU11dGV4ICgoU0RMX211dGV4KikgYU11dGV4KTsKKyAgICB9CisKKy8qIENyZWF0ZSBhIG11dGV4ICovCitTRExfbXV0ZXggKlNETF9DcmVhdGVNdXRleCh2b2lkKQoreworICAgIFJNdXRleCBybXV0ZXg7CisKKyAgICBUSW50IHN0YXR1cyA9IENyZWF0ZVVuaXF1ZShOZXdNdXRleCwgJnJtdXRleCwgTlVMTCk7CisJaWYoc3RhdHVzICE9IEtFcnJOb25lKQorCSAgICB7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBtdXRleCIpOworCQl9CisgICAgU0RMX211dGV4KiBtdXRleCA9IG5ldyAvKihFTGVhdmUpKi8gU0RMX211dGV4OworICAgIG11dGV4LT5oYW5kbGUgPSBybXV0ZXguSGFuZGxlKCk7CisgICAgRXBvY1NkbEVudjo6QXBwZW5kQ2xlYW51cEl0ZW0oVFNkbENsZWFudXBJdGVtKERlbGV0ZU11dGV4LCBtdXRleCkpOworCXJldHVybihtdXRleCk7Cit9CisKKy8qIEZyZWUgdGhlIG11dGV4ICovCit2b2lkIFNETF9EZXN0cm95TXV0ZXgoU0RMX211dGV4ICptdXRleCkKK3sKKwlpZiAoIG11dGV4ICkgCisJeworICAgIFJNdXRleCBybXV0ZXg7CisgICAgcm11dGV4LlNldEhhbmRsZShtdXRleC0+aGFuZGxlKTsKKyAgICBpZihybXV0ZXguSXNIZWxkKCkpCisgICAgICAgIHsKKwkgICAgcm11dGV4LlNpZ25hbCgpOworICAgICAgICB9CisJcm11dGV4LkNsb3NlKCk7CisJRXBvY1NkbEVudjo6UmVtb3ZlQ2xlYW51cEl0ZW0obXV0ZXgpOworCWRlbGV0ZShtdXRleCk7CisgICAgbXV0ZXggPSBOVUxMOworCX0KK30KKworLyogTG9jayB0aGUgbXV0ZXggKi8KK2ludCBTRExfbXV0ZXhQKFNETF9tdXRleCAqbXV0ZXgpCit7CisJaWYgKCBtdXRleCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgbXV0ZXgiKTsKKwkJcmV0dXJuIC0xOworCX0KKyAgICBSTXV0ZXggcm11dGV4OworICAgIHJtdXRleC5TZXRIYW5kbGUobXV0ZXgtPmhhbmRsZSk7CisJcm11dGV4LldhaXQoKTsgCisJcmV0dXJuKDApOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitpbnQgU0RMX211dGV4VihTRExfbXV0ZXggKm11dGV4KQoreworCWlmICggbXV0ZXggPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7CisJCXJldHVybiAtMTsKKwl9CisJUk11dGV4IHJtdXRleDsKKyAgICBybXV0ZXguU2V0SGFuZGxlKG11dGV4LT5oYW5kbGUpOworCXJtdXRleC5TaWduYWwoKTsKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9zeW1iaWFuL1NETF9zeXNzZW0uY3BwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvc3ltYmlhbi9TRExfc3lzc2VtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGY5OTAxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvc3ltYmlhbi9TRExfc3lzc2VtLmNwcApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AZGV2b2x1dGlvbi5jb20KKyovCisKKy8qCisgICAgU0RMX3N5c3NlbS5jcHAKKworICAgIEVwb2MgdmVyc2lvbiBieSBNYXJrdXMgTWVydGFtYSAgKHdAaWtpLmZpKQorKi8KKworI2lmZGVmIFNBVkVfUkNTSUQKK3N0YXRpYyBjaGFyIHJjc2lkID0KKyAiQCgjKSAkSWQ6IFNETF9zeXNzZW0uYyx2IDEuMS4yLjQgMjAwMC8wNi8yMiAxNToyNDo0OCBoZXJjdWxlcyBFeHAgJCI7CisjZW5kaWYKKworLyogU2VtYXBob3JlIGZ1bmN0aW9ucyB1c2luZyB0aGUgV2luMzIgQVBJICovCisKKy8vI2luY2x1ZGUgPHN0ZGlvLmg+CisvLyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlMzJzdGQuaD4KKworI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKworCisjZGVmaW5lIFNETF9NVVRFWF9USU1FT1VUIC0yCisKK3N0cnVjdCBTRExfc2VtYXBob3JlCisgeworIFRJbnQgaGFuZGxlOworIFRJbnQgY291bnQ7CisgfTsKKworCitleHRlcm4gVEludCBDcmVhdGVVbmlxdWUoVEludCAoKmFGdW5jKShjb25zdCBURGVzQyYgYU5hbWUsIFRBbnkqLCBUQW55KiksIFRBbnkqLCBUQW55Kik7CisjaWZuZGVmIEVLQTIKK2V4dGVybiBUSW50IE5ld1RocmVhZChjb25zdCBURGVzQyYgYU5hbWUsIFRBbnkqIGFQdHIxLCBUQW55KiBhUHRyMik7CisjZW5kaWYKKworVEludCBOZXdTZW1hKGNvbnN0IFREZXNDJiBhTmFtZSwgVEFueSogYVB0cjEsIFRBbnkqIGFQdHIyKSAKKyAgICB7CisgICAgVEludCB2YWx1ZSA9ICooKFRJbnQqKSBhUHRyMik7CisgICAgcmV0dXJuICgoUlNlbWFwaG9yZSopYVB0cjEpLT5DcmVhdGVHbG9iYWwoYU5hbWUsIHZhbHVlKTsKKyAgICB9CisKKy8qIENyZWF0ZSBhIHNlbWFwaG9yZSAqLworU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKK3sKKyAgIFJTZW1hcGhvcmUgczsKKyAgIFRJbnQgc3RhdHVzID0gQ3JlYXRlVW5pcXVlKE5ld1NlbWEsICZzLCAmaW5pdGlhbF92YWx1ZSk7CisgICBpZihzdGF0dXMgIT0gS0Vyck5vbmUpCisJIHsKKwkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNlbWFwaG9yZSIpOworCX0KKyAgICBTRExfc2VtYXBob3JlKiBzZW0gPSBuZXcgLyooRUxlYXZlKSovIFNETF9zZW1hcGhvcmU7ICAKKyAgICBzZW0tPmhhbmRsZSA9IHMuSGFuZGxlKCk7CisJc2VtLT5jb3VudCA9IGluaXRpYWxfdmFsdWU7CisJcmV0dXJuKHNlbSk7Cit9CisKKy8qIEZyZWUgdGhlIHNlbWFwaG9yZSAqLwordm9pZCBTRExfRGVzdHJveVNlbWFwaG9yZShTRExfc2VtICpzZW0pCit7CisJaWYgKCBzZW0gKSAKKwl7CisgICAgUlNlbWFwaG9yZSBzZW1hOworICAgIHNlbWEuU2V0SGFuZGxlKHNlbS0+aGFuZGxlKTsKKwl3aGlsZSgtLXNlbS0+Y291bnQpCisJICAgIHNlbWEuU2lnbmFsKCk7CisgICAgc2VtYS5DbG9zZSgpOworICAgIGRlbGV0ZSBzZW07CisJc2VtID0gTlVMTDsKKwl9Cit9CisKKyNpZm5kZWYgRUtBMgorCisgIHN0cnVjdCBUSW5mbworICAgIHsKKyAgICAgICAgVEluZm8oVEludCBhVGltZSwgVEludCBhSGFuZGxlKSA6IAorICAgICAgICBpVGltZShhVGltZSksIGlIYW5kbGUoYUhhbmRsZSksIGlWYWwoMCkge30KKyAgICAgICAgVEludCBpVGltZTsKKyAgICAgICAgVEludCBpSGFuZGxlOworICAgICAgICBUSW50IGlWYWw7IAorICAgIH07CisKKworCitUQm9vbCBUaHJlYWRSdW4oVEFueSogYUluZm8pCisgICAgeworICAgICAgICBUSW5mbyogaW5mbyA9IFNUQVRJQ19DQVNUKFRJbmZvKiwgYUluZm8pOworICAgICAgICBVc2VyOjpBZnRlcihpbmZvLT5pVGltZSk7CisgICAgICAgIFJTZW1hcGhvcmUgc2VtYTsKKyAgICAgICAgc2VtYS5TZXRIYW5kbGUoaW5mby0+aUhhbmRsZSk7CisgICAgICAgIHNlbWEuU2lnbmFsKCk7CisgICAgICAgIGluZm8tPmlWYWwgPSBTRExfTVVURVhfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorI2VuZGlmIAorICAgIAorICAgIAordm9pZCBfV2FpdEFsbChTRExfc2VtICpzZW0pCisgICAgeworICAgICAgIC8vc2luY2UgU2VtVHJ5V2FpdCBtYXkgY2hhbmdlZCB0aGUgY291bnRlci4KKyAgICAgICAvL3RoaXMgbWF5IG5vdCBiZSBhdG9taWMsIGJ1dCBob3BlcyBpdCB3b3Jrcy4KKyAgICBSU2VtYXBob3JlIHNlbWE7CisgICAgc2VtYS5TZXRIYW5kbGUoc2VtLT5oYW5kbGUpOworICAgIHNlbWEuV2FpdCgpOworICAgIHdoaWxlKHNlbS0+Y291bnQgPCAwKQorICAgICAgICB7CisgICAgICAgIHNlbWEuV2FpdCgpOworICAgICAgICB9ICAgIAorICAgIH0KKworaW50IFNETF9TZW1XYWl0VGltZW91dChTRExfc2VtICpzZW0sIFVpbnQzMiB0aW1lb3V0KQoreworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW0iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICggdGltZW91dCA9PSBTRExfTVVURVhfTUFYV0FJVCApCisJICAgIHsKKwkgICAgX1dhaXRBbGwoc2VtKTsKKwkJcmV0dXJuIFNETF9NVVRFWF9NQVhXQUlUOworCSAgICB9IAorCQorI2lmZGVmIEVLQTIKKworICAgIFJTZW1hcGhvcmUgc2VtYTsKKyAgICBzZW1hLlNldEhhbmRsZShzZW0tPmhhbmRsZSk7CisgICAgaWYoS0Vyck5vbmUgPT0gc2VtYS5XYWl0KHRpbWVvdXQpKQorICAgIAlyZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7CisjZWxzZQorCVJUaHJlYWQgdGhyZWFkOworCQorCVRJbmZvKiBpbmZvID0gbmV3IChFTGVhdmUpVEluZm8odGltZW91dCwgc2VtLT5oYW5kbGUpOworCQorICAgIFRJbnQgc3RhdHVzID0gQ3JlYXRlVW5pcXVlKE5ld1RocmVhZCwgJnRocmVhZCwgaW5mbyk7CisgIAorCWlmKHN0YXR1cyAhPSBLRXJyTm9uZSkKKwkgICAgcmV0dXJuIHN0YXR1czsKKwkKKwl0aHJlYWQuUmVzdW1lKCk7CisJCisJX1dhaXRBbGwoc2VtKTsKKwkKKwlpZih0aHJlYWQuRXhpdFR5cGUoKSA9PSBFRXhpdFBlbmRpbmcpCisJICAgIHsKKwkgICAgICAgIHRocmVhZC5LaWxsKFNETF9NVVRFWF9USU1FT1VUKTsKKwkgICAgfQorCQorCXRocmVhZC5DbG9zZSgpOworCQorCXJldHVybiBpbmZvLT5pVmFsOworI2VuZGlmCit9CisKK2ludCBTRExfU2VtVHJ5V2FpdChTRExfc2VtICpzZW0pCit7CisgICAgaWYoc2VtLT5jb3VudCA+IDApCisgICAgICAgIHsKKyAgICAgICAgc2VtLT5jb3VudC0tOworICAgICAgICB9CisgICAgcmV0dXJuIFNETF9NVVRFWF9USU1FT1VUOworfQorCitpbnQgU0RMX1NlbVdhaXQoU0RMX3NlbSAqc2VtKSAKK3sKKwlyZXR1cm4gU0RMX1NlbVdhaXRUaW1lb3V0KHNlbSwgU0RMX01VVEVYX01BWFdBSVQpOworfQorCisvKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IG9mIHRoZSBzZW1hcGhvcmUgKi8KK1VpbnQzMiBTRExfU2VtVmFsdWUoU0RMX3NlbSAqc2VtKQoreworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW0iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBzZW0tPmNvdW50OworfQorCitpbnQgU0RMX1NlbVBvc3QoU0RMX3NlbSAqc2VtKQoreworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW0iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZW0tPmNvdW50Kys7CisgICAgUlNlbWFwaG9yZSBzZW1hOworICAgIHNlbWEuU2V0SGFuZGxlKHNlbS0+aGFuZGxlKTsKKwlzZW1hLlNpZ25hbCgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvc3ltYmlhbi9TRExfc3lzdGhyZWFkLmNwcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3N5bWJpYW4vU0RMX3N5c3RocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3YWRjNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3N5bWJpYW4vU0RMX3N5c3RocmVhZC5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGRldm9sdXRpb24uY29tCisqLworCisvKgorICAgIFNETF9zeXN0aHJlYWQuY3BwCisgICAgRXBvYyB0aHJlYWQgbWFuYWdlbWVudCByb3V0aW5lcyBmb3IgU0RMCisKKyAgICBFcG9jIHZlcnNpb24gYnkgTWFya3VzIE1lcnRhbWEgICh3QGlraS5maSkKKyovCisKKyNpbmNsdWRlICJlcG9jX3NkbC5oIgorCisvLyNpbmNsdWRlIDxzdGRsaWIuaD4KKy8vI2luY2x1ZGUgPHN0ZGlvLmg+CisKKworCitleHRlcm4gIkMiIHsKKyN1bmRlZiBOVUxMCisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF9zeXN0aHJlYWQuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkX2MuaCIKKyAgICB9CisKKyNpbmNsdWRlIDxlMzJzdGQuaD4KKyNpbmNsdWRlICJlcG9jX3NkbC5oIgorCisKK3N0YXRpYyBpbnQgb2JqZWN0X2NvdW50OworCitpbnQgUnVuVGhyZWFkKFRBbnkqIGRhdGEpCit7CisJQ1RyYXBDbGVhbnVwKiBjbGVhbnVwID0gQ1RyYXBDbGVhbnVwOjpOZXcoKTsKKwlUUkFQRChlcnIsIFNETF9SdW5UaHJlYWQoZGF0YSkpOworCUVwb2NTZGxFbnY6OkNsZWFudXBJdGVtcygpOworCWRlbGV0ZSBjbGVhbnVwOworCXJldHVybihlcnIpOworfQorCisKK1RJbnQgTmV3VGhyZWFkKGNvbnN0IFREZXNDJiBhTmFtZSwgVEFueSogYVB0cjEsIFRBbnkqIGFQdHIyKQorICAgIHsKKyAgICByZXR1cm4gKChSVGhyZWFkKikoYVB0cjEpKS0+Q3JlYXRlKGFOYW1lLAorICAgICAgICAgICAgUnVuVGhyZWFkLAorICAgICAgICAgICAgS0RlZmF1bHRTdGFja1NpemUsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgYVB0cjIpOworICAgIH0KKworaW50IENyZWF0ZVVuaXF1ZShUSW50ICgqYUZ1bmMpKGNvbnN0IFREZXNDJiBhTmFtZSwgVEFueSosIFRBbnkqKSwgVEFueSogYVB0cjEsIFRBbnkqIGFQdHIyKQorICAgIHsKKyAgICBUQnVmPDE2PiBuYW1lOworICAgIFRJbnQgc3RhdHVzID0gS0Vyck5vbmU7CisgICAgZG8KKyAgICAgICAgeworICAgICAgICBvYmplY3RfY291bnQrKzsKKyAgICAgICAgbmFtZS5Gb3JtYXQoX0woIlNETF8leCIpLCBvYmplY3RfY291bnQpOworICAgICAgICBzdGF0dXMgPSBhRnVuYyhuYW1lLCBhUHRyMSwgYVB0cjIpOworICAgICAgICB9CisgICAgICAgIHdoaWxlKHN0YXR1cyA9PSBLRXJyQWxyZWFkeUV4aXN0cyk7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKworaW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncykKK3sKKyAgICBSVGhyZWFkIHJ0aHJlYWQ7CisgICAKKyAgICBjb25zdCBUSW50IHN0YXR1cyA9IENyZWF0ZVVuaXF1ZShOZXdUaHJlYWQsICZydGhyZWFkLCBhcmdzKTsKKyAgICBpZiAoc3RhdHVzICE9IEtFcnJOb25lKSAKKyAgICB7CisgICAgICAgIGRlbGV0ZSgoKFJUaHJlYWQqKSh0aHJlYWQtPmhhbmRsZSkpKTsKKyAgICAgICAgdGhyZWFkLT5oYW5kbGUgPSBOVUxMOworCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aHJlYWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcnRocmVhZC5SZXN1bWUoKTsKKyAgICB0aHJlYWQtPmhhbmRsZSA9IHJ0aHJlYWQuSGFuZGxlKCk7CisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9TWVNfU2V0dXBUaHJlYWQodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKK1VpbnQzMiBTRExfVGhyZWFkSUQodm9pZCkKK3sKKyAgICBSVGhyZWFkIGN1cnJlbnQ7CisgICAgY29uc3QgVFRocmVhZElkIGlkID0gY3VycmVudC5JZCgpOworCXJldHVybiBpZDsKK30KKwordm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworICAgIFNETF9UUkFDRTEoIkNsb3NlIHRocmVhZCIsIHRocmVhZCk7CisgICAgUlRocmVhZCB0OworICAgIGNvbnN0IFRJbnQgZXJyID0gdC5PcGVuKHRocmVhZC0+dGhyZWFkaWQpOworICAgIGlmKGVyciA9PSBLRXJyTm9uZSAmJiB0LkV4aXRUeXBlKCkgPT0gRUV4aXRQZW5kaW5nKQorICAgICAgICB7CisgICAgICAgIFRSZXF1ZXN0U3RhdHVzIHN0YXR1czsKKyAgICAgICAgdC5Mb2dvbihzdGF0dXMpOworICAgICAgICBVc2VyOjpXYWl0Rm9yUmVxdWVzdChzdGF0dXMpOworICAgICAgICB9CisgICAgdC5DbG9zZSgpOworICAgIAorICAvKiAgUlVuZGVydGFrZXIgdGFrZXI7CisgICAgdGFrZXIuQ3JlYXRlKCk7CisgICAgVFJlcXVlc3RTdGF0dXMgc3RhdHVzOworICAgIHRha2VyLkxvZ29uKHN0YXR1cywgdGhyZWFkLT5oYW5kbGUpOworICAgIFVzZXI6OldhaXRGb3JSZXF1ZXN0KHN0YXR1cyk7CisgICAgdGFrZXIuQ2xvc2UoKTsqLworICAgIFNETF9UUkFDRTEoIkNsb3NlZCB0aHJlYWQiLCB0aHJlYWQpOworfQorCisvKiBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIGlzIHJlYWxseSBhIGxhc3QgcmVzb3J0LgorICogVGhyZWFkcyBzaG91bGQgYmUgc2lnbmFsZWQgYW5kIHRoZW4gZXhpdCBieSB0aGVtc2VsdmVzLgorICogVGVybWluYXRlVGhyZWFkKCkgZG9lc24ndCBwZXJmb3JtIHN0YWNrIGFuZCBETEwgY2xlYW51cC4KKyAqLwordm9pZCBTRExfU1lTX0tpbGxUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworICAgIFJUaHJlYWQgcnRocmVhZDsKKyAgICBydGhyZWFkLlNldEhhbmRsZSh0aHJlYWQtPmhhbmRsZSk7CisJcnRocmVhZC5LaWxsKDApOworCXJ0aHJlYWQuQ2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3N5bWJpYW4vU0RMX3N5c3RocmVhZF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9zeW1iaWFuL1NETF9zeXN0aHJlYWRfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZjE3MjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC9zeW1iaWFuL1NETF9zeXN0aHJlYWRfYy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGRldm9sdXRpb24uY29tCisqLworCisvKgorICAgIFNETF9zeXN0aHJlYWRfYy5oCisKKyAgICBFcG9jIHZlcnNpb24gYnkgTWFya3VzIE1lcnRhbWEgKHdAaWtpLmZpKQorKi8KKwordHlwZWRlZiBpbnQgU1lTX1RocmVhZEhhbmRsZTsKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c211dGV4LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzbXV0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDc4MDVjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c211dGV4LmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIE11dGV4IGZ1bmN0aW9ucyB1c2luZyB0aGUgV2luMzIgQVBJICovCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgIlNETF9tdXRleC5oIgorCisKK3N0cnVjdCBTRExfbXV0ZXggeworCUhBTkRMRSBpZDsKK307CisKKy8qIENyZWF0ZSBhIG11dGV4ICovCitTRExfbXV0ZXggKlNETF9DcmVhdGVNdXRleCh2b2lkKQoreworCVNETF9tdXRleCAqbXV0ZXg7CisKKwkvKiBBbGxvY2F0ZSBtdXRleCBtZW1vcnkgKi8KKwltdXRleCA9IChTRExfbXV0ZXggKilTRExfbWFsbG9jKHNpemVvZigqbXV0ZXgpKTsKKwlpZiAoIG11dGV4ICkgeworCQkvKiBDcmVhdGUgdGhlIG11dGV4LCB3aXRoIGluaXRpYWwgdmFsdWUgc2lnbmFsZWQgKi8KKwkJbXV0ZXgtPmlkID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIE5VTEwpOworCQlpZiAoICEgbXV0ZXgtPmlkICkgeworCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgbXV0ZXgiKTsKKwkJCVNETF9mcmVlKG11dGV4KTsKKwkJCW11dGV4ID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCX0KKwlyZXR1cm4obXV0ZXgpOworfQorCisvKiBGcmVlIHRoZSBtdXRleCAqLwordm9pZCBTRExfRGVzdHJveU11dGV4KFNETF9tdXRleCAqbXV0ZXgpCit7CisJaWYgKCBtdXRleCApIHsKKwkJaWYgKCBtdXRleC0+aWQgKSB7CisJCQlDbG9zZUhhbmRsZShtdXRleC0+aWQpOworCQkJbXV0ZXgtPmlkID0gMDsKKwkJfQorCQlTRExfZnJlZShtdXRleCk7CisJfQorfQorCisvKiBMb2NrIHRoZSBtdXRleCAqLworaW50IFNETF9tdXRleFAoU0RMX211dGV4ICptdXRleCkKK3sKKwlpZiAoIG11dGV4ID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBtdXRleCIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICggV2FpdEZvclNpbmdsZU9iamVjdChtdXRleC0+aWQsIElORklOSVRFKSA9PSBXQUlUX0ZBSUxFRCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCB3YWl0IG9uIG11dGV4Iik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitpbnQgU0RMX211dGV4VihTRExfbXV0ZXggKm11dGV4KQoreworCWlmICggbXV0ZXggPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgYSBOVUxMIG11dGV4Iik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCBSZWxlYXNlTXV0ZXgobXV0ZXgtPmlkKSA9PSBGQUxTRSApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCByZWxlYXNlIG11dGV4Iik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c3NlbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvd2luMzIvU0RMX3N5c3NlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MWQyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzc2VtLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBTZW1hcGhvcmUgZnVuY3Rpb25zIHVzaW5nIHRoZSBXaW4zMiBBUEkgKi8KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgKF9XSU4zMl9XQ0UgPCAzMDApCisjaW5jbHVkZSAid2luX2NlX3NlbWFwaG9yZS5oIgorI2VuZGlmCisKKworc3RydWN0IFNETF9zZW1hcGhvcmUgeworI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgKF9XSU4zMl9XQ0UgPCAzMDApCisJU1lOQ0hIQU5ETEUgaWQ7CisjZWxzZQorCUhBTkRMRSBpZDsKKyNlbmRpZgorCXZvbGF0aWxlIExPTkcgY291bnQ7Cit9OworCisKKy8qIENyZWF0ZSBhIHNlbWFwaG9yZSAqLworU0RMX3NlbSAqU0RMX0NyZWF0ZVNlbWFwaG9yZShVaW50MzIgaW5pdGlhbF92YWx1ZSkKK3sKKwlTRExfc2VtICpzZW07CisKKwkvKiBBbGxvY2F0ZSBzZW0gbWVtb3J5ICovCisJc2VtID0gKFNETF9zZW0gKilTRExfbWFsbG9jKHNpemVvZigqc2VtKSk7CisJaWYgKCBzZW0gKSB7CisJCS8qIENyZWF0ZSB0aGUgc2VtYXBob3JlLCB3aXRoIG1heCB2YWx1ZSAzMksgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIChfV0lOMzJfV0NFIDwgMzAwKQorCQlzZW0tPmlkID0gQ3JlYXRlU2VtYXBob3JlQ0UoTlVMTCwgaW5pdGlhbF92YWx1ZSwgMzIqMTAyNCwgTlVMTCk7CisjZWxzZQorCQlzZW0tPmlkID0gQ3JlYXRlU2VtYXBob3JlKE5VTEwsIGluaXRpYWxfdmFsdWUsIDMyKjEwMjQsIE5VTEwpOworI2VuZGlmCisJCXNlbS0+Y291bnQgPSAoTE9ORykgaW5pdGlhbF92YWx1ZTsKKwkJaWYgKCAhIHNlbS0+aWQgKSB7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBzZW1hcGhvcmUiKTsKKwkJCVNETF9mcmVlKHNlbSk7CisJCQlzZW0gPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJfQorCXJldHVybihzZW0pOworfQorCisvKiBGcmVlIHRoZSBzZW1hcGhvcmUgKi8KK3ZvaWQgU0RMX0Rlc3Ryb3lTZW1hcGhvcmUoU0RMX3NlbSAqc2VtKQoreworCWlmICggc2VtICkgeworCQlpZiAoIHNlbS0+aWQgKSB7CisjaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAoX1dJTjMyX1dDRSA8IDMwMCkKKwkJCUNsb3NlU3luY2hIYW5kbGUoc2VtLT5pZCk7CisjZWxzZQorCQkJQ2xvc2VIYW5kbGUoc2VtLT5pZCk7CisjZW5kaWYKKwkJCXNlbS0+aWQgPSAwOworCQl9CisJCVNETF9mcmVlKHNlbSk7CisJfQorfQorCitpbnQgU0RMX1NlbVdhaXRUaW1lb3V0KFNETF9zZW0gKnNlbSwgVWludDMyIHRpbWVvdXQpCit7CisJaW50IHJldHZhbDsKKwlEV09SRCBkd01pbGxpc2Vjb25kczsKKworCWlmICggISBzZW0gKSB7CisJCVNETF9TZXRFcnJvcigiUGFzc2VkIGEgTlVMTCBzZW0iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICggdGltZW91dCA9PSBTRExfTVVURVhfTUFYV0FJVCApIHsKKwkJZHdNaWxsaXNlY29uZHMgPSBJTkZJTklURTsKKwl9IGVsc2UgeworCQlkd01pbGxpc2Vjb25kcyA9IChEV09SRCl0aW1lb3V0OworCX0KKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIChfV0lOMzJfV0NFIDwgMzAwKQorCXN3aXRjaCAoV2FpdEZvclNlbWFwaG9yZUNFKHNlbS0+aWQsIGR3TWlsbGlzZWNvbmRzKSkgeworI2Vsc2UKKwlzd2l0Y2ggKFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VtLT5pZCwgZHdNaWxsaXNlY29uZHMpKSB7CisjZW5kaWYKKwkgICAgY2FzZSBXQUlUX09CSkVDVF8wOgorCQlJbnRlcmxvY2tlZERlY3JlbWVudCgmc2VtLT5jb3VudCk7CisJCXJldHZhbCA9IDA7CisJCWJyZWFrOworCSAgICBjYXNlIFdBSVRfVElNRU9VVDoKKwkJcmV0dmFsID0gU0RMX01VVEVYX1RJTUVET1VUOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJU0RMX1NldEVycm9yKCJXYWl0Rm9yU2luZ2xlT2JqZWN0KCkgZmFpbGVkIik7CisJCXJldHZhbCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IFNETF9TZW1UcnlXYWl0KFNETF9zZW0gKnNlbSkKK3sKKwlyZXR1cm4gU0RMX1NlbVdhaXRUaW1lb3V0KHNlbSwgMCk7Cit9CisKK2ludCBTRExfU2VtV2FpdChTRExfc2VtICpzZW0pCit7CisJcmV0dXJuIFNETF9TZW1XYWl0VGltZW91dChzZW0sIFNETF9NVVRFWF9NQVhXQUlUKTsKK30KKworLyogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvZiB0aGUgc2VtYXBob3JlICovCitVaW50MzIgU0RMX1NlbVZhbHVlKFNETF9zZW0gKnNlbSkKK3sKKwlpZiAoICEgc2VtICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gKFVpbnQzMikgc2VtLT5jb3VudDsKK30KKworaW50IFNETF9TZW1Qb3N0KFNETF9zZW0gKnNlbSkKK3sKKwlpZiAoICEgc2VtICkgeworCQlTRExfU2V0RXJyb3IoIlBhc3NlZCBhIE5VTEwgc2VtIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogSW5jcmVhc2UgdGhlIGNvdW50ZXIgaW4gdGhlIGZpcnN0IHBsYWNlLCBiZWNhdXNlCisJICogYWZ0ZXIgYSBzdWNjZXNzZnVsIHJlbGVhc2UgdGhlIHNlbWFwaG9yZSBtYXkKKwkgKiBpbW1lZGlhdGVseSBnZXQgZGVzdHJveWVkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWNoCisJICogaXMgd2FpdGluZyBmb3IgdGhpcyBzZW1hcGhvcmUuCisJICovCisJSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnNlbS0+Y291bnQpOworI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgKF9XSU4zMl9XQ0UgPCAzMDApCisJaWYgKCBSZWxlYXNlU2VtYXBob3JlQ0Uoc2VtLT5pZCwgMSwgTlVMTCkgPT0gRkFMU0UgKSB7CisjZWxzZQorCWlmICggUmVsZWFzZVNlbWFwaG9yZShzZW0tPmlkLCAxLCBOVUxMKSA9PSBGQUxTRSApIHsKKyNlbmRpZgorCQlJbnRlcmxvY2tlZERlY3JlbWVudCgmc2VtLT5jb3VudCk7CS8qIHJlc3RvcmUgKi8KKwkJU0RMX1NldEVycm9yKCJSZWxlYXNlU2VtYXBob3JlKCkgZmFpbGVkIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzdGhyZWFkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjYjg4YQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3dpbjMyL1NETF9zeXN0aHJlYWQuYwpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFdpbjMyIHRocmVhZCBtYW5hZ2VtZW50IHJvdXRpbmVzIGZvciBTREwgKi8KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIi4uL1NETF90aHJlYWRfYy5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN0aHJlYWQuaCIKKworI2lmbmRlZiBTRExfUEFTU0VEX0JFR0lOVEhSRUFEX0VORFRIUkVBRAorI2lmbmRlZiBfV0lOMzJfV0NFCisvKiBXZSdsbCB1c2UgdGhlIEMgbGlicmFyeSBmcm9tIHRoaXMgRExMICovCisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQorLyogVGhpcyBpcyBmb3IgV2F0Y29tIHRhcmdldHMgZXhjZXB0IE9TMiAqLworI2lmIF9fV0FUQ09NQ19fIDwgMTI0MAorI2RlZmluZSBfX3dhdGNhbGwKKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBsb25nIChfX3dhdGNhbGwgKnBmblNETF9DdXJyZW50QmVnaW5UaHJlYWQpICh2b2lkICosIHVuc2lnbmVkLAorICAgICAgICB1bnNpZ25lZCAoX19zdGRjYWxsICpmdW5jKSh2b2lkICopLCB2b2lkICphcmcsIAorICAgICAgICB1bnNpZ25lZCwgdW5zaWduZWQgKnRocmVhZElEKTsKK3R5cGVkZWYgdm9pZCAoX193YXRjYWxsICpwZm5TRExfQ3VycmVudEVuZFRocmVhZCkodW5zaWduZWQgY29kZSk7CisjZWxpZiAoZGVmaW5lZChfX01JTkdXMzJfXykgJiYgKF9fR05VQ19fIDwgNCkpCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgKF9fY2RlY2wgKnBmblNETF9DdXJyZW50QmVnaW5UaHJlYWQpICh2b2lkICosIHVuc2lnbmVkLAorICAgICAgICB1bnNpZ25lZCAoX19zdGRjYWxsICpmdW5jKSh2b2lkICopLCB2b2lkICphcmcsIAorICAgICAgICB1bnNpZ25lZCwgdW5zaWduZWQgKnRocmVhZElEKTsKK3R5cGVkZWYgdm9pZCAoX19jZGVjbCAqcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQpKHVuc2lnbmVkIGNvZGUpOworI2Vsc2UKK3R5cGVkZWYgdWludHB0cl90IChfX2NkZWNsICpwZm5TRExfQ3VycmVudEJlZ2luVGhyZWFkKSAodm9pZCAqLCB1bnNpZ25lZCwKKyAgICAgICAgdW5zaWduZWQgKF9fc3RkY2FsbCAqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnLCAKKyAgICAgICAgdW5zaWduZWQsIHVuc2lnbmVkICp0aHJlYWRJRCk7Cit0eXBlZGVmIHZvaWQgKF9fY2RlY2wgKnBmblNETF9DdXJyZW50RW5kVGhyZWFkKSh1bnNpZ25lZCBjb2RlKTsKKyNlbmRpZgorI2VuZGlmIC8qICFTRExfUEFTU0VEX0JFR0lOVEhSRUFEX0VORFRIUkVBRCAqLworCisKK3R5cGVkZWYgc3RydWN0IFRocmVhZFN0YXJ0UGFybXMKK3sKKyAgdm9pZCAqYXJnczsKKyAgcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuQ3VycmVudEVuZFRocmVhZDsKK30gdFRocmVhZFN0YXJ0UGFybXMsICpwVGhyZWFkU3RhcnRQYXJtczsKKworc3RhdGljIERXT1JEIFJ1blRocmVhZCh2b2lkICpkYXRhKQoreworICBwVGhyZWFkU3RhcnRQYXJtcyBwVGhyZWFkUGFybXMgPSAocFRocmVhZFN0YXJ0UGFybXMpZGF0YTsKKyAgcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuQ3VycmVudEVuZFRocmVhZCA9IE5VTEw7CisKKyAgLy8gQ2FsbCB0aGUgdGhyZWFkIGZ1bmN0aW9uIQorICBTRExfUnVuVGhyZWFkKHBUaHJlYWRQYXJtcy0+YXJncyk7CisKKyAgLy8gR2V0IHRoZSBjdXJyZW50IGVuZHRocmVhZCB3ZSBoYXZlIHRvIHVzZSEKKyAgaWYgKHBUaHJlYWRQYXJtcykKKyAgeworICAgIHBmbkN1cnJlbnRFbmRUaHJlYWQgPSBwVGhyZWFkUGFybXMtPnBmbkN1cnJlbnRFbmRUaHJlYWQ7CisgICAgU0RMX2ZyZWUocFRocmVhZFBhcm1zKTsKKyAgfQorICAvLyBDYWxsIGVuZHRocmVhZCEKKyAgaWYgKHBmbkN1cnJlbnRFbmRUaHJlYWQpCisgICAgKCpwZm5DdXJyZW50RW5kVGhyZWFkKSgwKTsKKyAgcmV0dXJuKDApOworfQorCitzdGF0aWMgRFdPUkQgV0lOQVBJIFJ1blRocmVhZFZpYUNyZWF0ZVRocmVhZChMUFZPSUQgZGF0YSkKK3sKKyAgcmV0dXJuIFJ1blRocmVhZChkYXRhKTsKK30KKworc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbCBSdW5UaHJlYWRWaWFCZWdpblRocmVhZEV4KHZvaWQgKmRhdGEpCit7CisgIHJldHVybiAodW5zaWduZWQpIFJ1blRocmVhZChkYXRhKTsKK30KKworI2lmZGVmIFNETF9QQVNTRURfQkVHSU5USFJFQURfRU5EVEhSRUFECitpbnQgU0RMX1NZU19DcmVhdGVUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmdzLCBwZm5TRExfQ3VycmVudEJlZ2luVGhyZWFkIHBmbkJlZ2luVGhyZWFkLCBwZm5TRExfQ3VycmVudEVuZFRocmVhZCBwZm5FbmRUaHJlYWQpCit7CisjZWxzZQoraW50IFNETF9TWVNfQ3JlYXRlVGhyZWFkKFNETF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJncykKK3sKKyNpZmRlZiBfV0lOMzJfV0NFCisJcGZuU0RMX0N1cnJlbnRCZWdpblRocmVhZCBwZm5CZWdpblRocmVhZCA9IE5VTEw7CisJcGZuU0RMX0N1cnJlbnRFbmRUaHJlYWQgcGZuRW5kVGhyZWFkID0gTlVMTDsKKyNlbHNlCisJcGZuU0RMX0N1cnJlbnRCZWdpblRocmVhZCBwZm5CZWdpblRocmVhZCA9IF9iZWdpbnRocmVhZGV4OworCXBmblNETF9DdXJyZW50RW5kVGhyZWFkIHBmbkVuZFRocmVhZCA9IF9lbmR0aHJlYWRleDsKKyNlbmRpZgorI2VuZGlmIC8qIFNETF9QQVNTRURfQkVHSU5USFJFQURfRU5EVEhSRUFEICovCisJcFRocmVhZFN0YXJ0UGFybXMgcFRocmVhZFBhcm1zID0gKHBUaHJlYWRTdGFydFBhcm1zKVNETF9tYWxsb2Moc2l6ZW9mKHRUaHJlYWRTdGFydFBhcm1zKSk7CisJaWYgKCFwVGhyZWFkUGFybXMpIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybigtMSk7CisJfQorCisJLy8gU2F2ZSB0aGUgZnVuY3Rpb24gd2hpY2ggd2Ugd2lsbCBoYXZlIHRvIGNhbGwgdG8gY2xlYXIgdGhlIFJUTCBvZiBjYWxsaW5nIGFwcCEKKwlwVGhyZWFkUGFybXMtPnBmbkN1cnJlbnRFbmRUaHJlYWQgPSBwZm5FbmRUaHJlYWQ7CisJLy8gQWxzbyBzYXZlIHRoZSByZWFsIHBhcmFtZXRlcnMgd2UgaGF2ZSB0byBwYXNzIHRvIHRocmVhZCBmdW5jdGlvbgorCXBUaHJlYWRQYXJtcy0+YXJncyA9IGFyZ3M7CisKKwlpZiAocGZuQmVnaW5UaHJlYWQpIHsKKwkJdW5zaWduZWQgdGhyZWFkaWQgPSAwOworCQl0aHJlYWQtPmhhbmRsZSA9IChTWVNfVGhyZWFkSGFuZGxlKQorCQkJCSgoc2l6ZV90KSBwZm5CZWdpblRocmVhZChOVUxMLCAwLCBSdW5UaHJlYWRWaWFCZWdpblRocmVhZEV4LAorCQkJCQkJCQkJCSBwVGhyZWFkUGFybXMsIDAsICZ0aHJlYWRpZCkpOworCX0gZWxzZSB7CisJCURXT1JEIHRocmVhZGlkID0gMDsKKwkJdGhyZWFkLT5oYW5kbGUgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgUnVuVGhyZWFkVmlhQ3JlYXRlVGhyZWFkLCBwVGhyZWFkUGFybXMsIDAsICZ0aHJlYWRpZCk7CisJfQorCWlmICh0aHJlYWQtPmhhbmRsZSA9PSBOVUxMKSB7CisJCVNETF9TZXRFcnJvcigiTm90IGVub3VnaCByZXNvdXJjZXMgdG8gY3JlYXRlIHRocmVhZCIpOworCQlyZXR1cm4oLTEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgU0RMX1NZU19TZXR1cFRocmVhZCh2b2lkKQoreworCXJldHVybjsKK30KKworVWludDMyIFNETF9UaHJlYWRJRCh2b2lkKQoreworCXJldHVybigoVWludDMyKUdldEN1cnJlbnRUaHJlYWRJZCgpKTsKK30KKwordm9pZCBTRExfU1lTX1dhaXRUaHJlYWQoU0RMX1RocmVhZCAqdGhyZWFkKQoreworCVdhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkLT5oYW5kbGUsIElORklOSVRFKTsKKwlDbG9zZUhhbmRsZSh0aHJlYWQtPmhhbmRsZSk7Cit9CisKKy8qIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGEgbGFzdCByZXNvcnQuCisgKiBUaHJlYWRzIHNob3VsZCBiZSBzaWduYWxlZCBhbmQgdGhlbiBleGl0IGJ5IHRoZW1zZWx2ZXMuCisgKiBUZXJtaW5hdGVUaHJlYWQoKSBkb2Vzbid0IHBlcmZvcm0gc3RhY2sgYW5kIERMTCBjbGVhbnVwLgorICovCit2b2lkIFNETF9TWVNfS2lsbFRocmVhZChTRExfVGhyZWFkICp0aHJlYWQpCit7CisJVGVybWluYXRlVGhyZWFkKHRocmVhZC0+aGFuZGxlLCBGQUxTRSk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzdGhyZWFkX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGhyZWFkL3dpbjMyL1NETF9zeXN0aHJlYWRfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjBhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC93aW4zMi9TRExfc3lzdGhyZWFkX2MuaApAQCAtMCwwICsxLDI4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCit0eXBlZGVmIEhBTkRMRSBTWVNfVGhyZWFkSGFuZGxlOworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC93aW4zMi93aW5fY2Vfc2VtYXBob3JlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC93aW4zMi93aW5fY2Vfc2VtYXBob3JlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3dpbjMyL3dpbl9jZV9zZW1hcGhvcmUuYwpyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvd2luMzIvd2luX2NlX3NlbWFwaG9yZS5jCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3RocmVhZC93aW4zMi93aW5fY2Vfc2VtYXBob3JlLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RocmVhZC93aW4zMi93aW5fY2Vfc2VtYXBob3JlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdGhyZWFkL3dpbjMyL3dpbl9jZV9zZW1hcGhvcmUuaApyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aHJlYWQvd2luMzIvd2luX2NlX3NlbWFwaG9yZS5oCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL1NETF9zeXN0aW1lci5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9TRExfc3lzdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTliNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9TRExfc3lzdGltZXIuaApAQCAtMCwwICsxLDQwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhlIHN5c3RlbSBkZXBlbmRlbnQgdGltZXIgaGFuZGxpbmcgZnVuY3Rpb25zICovCisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfdGltZXJfYy5oIgorCisKKy8qIEluaXRpYWxpemUgdGhlIHN5c3RlbSBkZXBlbmRlbnQgdGltZXIgc3Vic3lzdGVtICovCitleHRlcm4gaW50IFNETF9TWVNfVGltZXJJbml0KHZvaWQpOworCisvKiBRdWl0IHRoZSBzeXN0ZW0gZGVwZW5kZW50IHRpbWVyIHN1YnN5c3RlbSAqLworZXh0ZXJuIHZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCk7CisKKy8qIFN0YXJ0IGEgdGltZXIgc2V0IHVwIGJ5IFNETF9TZXRUaW1lcigpICovCitleHRlcm4gaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKTsKKworLyogU3RvcCBhIHByZXZpb3VzbHkgc3RhcnRlZCB0aW1lciAqLworZXh0ZXJuIHZvaWQgU0RMX1NZU19TdG9wVGltZXIodm9pZCk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL1NETF90aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9TRExfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDEzN2UxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9TRExfdGltZXIuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfdGltZXJfYy5oIgorI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgIlNETF9zeXN0aW1lci5oIgorCisvKiAjZGVmaW5lIERFQlVHX1RJTUVSUyAqLworCitpbnQgU0RMX3RpbWVyX3N0YXJ0ZWQgPSAwOworaW50IFNETF90aW1lcl9ydW5uaW5nID0gMDsKKworLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KK1VpbnQzMiBTRExfYWxhcm1faW50ZXJ2YWwgPSAwOworU0RMX1RpbWVyQ2FsbGJhY2sgU0RMX2FsYXJtX2NhbGxiYWNrOworCisvKiBEYXRhIHVzZWQgZm9yIGEgdGhyZWFkLWJhc2VkIHRpbWVyICovCitzdGF0aWMgaW50IFNETF90aW1lcl90aHJlYWRlZCA9IDA7CisKK3N0cnVjdCBfU0RMX1RpbWVySUQgeworCVVpbnQzMiBpbnRlcnZhbDsKKwlTRExfTmV3VGltZXJDYWxsYmFjayBjYjsKKwl2b2lkICpwYXJhbTsKKwlVaW50MzIgbGFzdF9hbGFybTsKKwlzdHJ1Y3QgX1NETF9UaW1lcklEICpuZXh0OworfTsKKworc3RhdGljIFNETF9UaW1lcklEIFNETF90aW1lcnMgPSBOVUxMOworc3RhdGljIFNETF9tdXRleCAqU0RMX3RpbWVyX211dGV4Oworc3RhdGljIHZvbGF0aWxlIFNETF9ib29sIGxpc3RfY2hhbmdlZCA9IFNETF9GQUxTRTsKKworLyogU2V0IHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBzaG91bGQgdXNlIGEgdGhyZWFkLgorICAgVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGlsZSB0aGUgdGltZXIgc3Vic3lzdGVtIGlzIHJ1bm5pbmcuCisqLworaW50IFNETF9TZXRUaW1lclRocmVhZGVkKGludCB2YWx1ZSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCBTRExfdGltZXJfc3RhcnRlZCApIHsKKwkJU0RMX1NldEVycm9yKCJUaW1lciBhbHJlYWR5IGluaXRpYWxpemVkIik7CisJCXJldHZhbCA9IC0xOworCX0gZWxzZSB7CisJCXJldHZhbCA9IDA7CisJCVNETF90aW1lcl90aHJlYWRlZCA9IHZhbHVlOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgU0RMX1RpbWVySW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSAwOworCWlmICggU0RMX3RpbWVyX3N0YXJ0ZWQgKSB7CisJCVNETF9UaW1lclF1aXQoKTsKKwl9CisJaWYgKCAhIFNETF90aW1lcl90aHJlYWRlZCApIHsKKwkJcmV0dmFsID0gU0RMX1NZU19UaW1lckluaXQoKTsKKwl9CisJaWYgKCBTRExfdGltZXJfdGhyZWFkZWQgKSB7CisJCVNETF90aW1lcl9tdXRleCA9IFNETF9DcmVhdGVNdXRleCgpOworCX0KKwlpZiAoIHJldHZhbCA9PSAwICkgeworCQlTRExfdGltZXJfc3RhcnRlZCA9IDE7CisJfQorCXJldHVybihyZXR2YWwpOworfQorCit2b2lkIFNETF9UaW1lclF1aXQodm9pZCkKK3sKKwlTRExfU2V0VGltZXIoMCwgTlVMTCk7CisJaWYgKCBTRExfdGltZXJfdGhyZWFkZWQgPCAyICkgeworCQlTRExfU1lTX1RpbWVyUXVpdCgpOworCX0KKwlpZiAoIFNETF90aW1lcl90aHJlYWRlZCApIHsKKwkJU0RMX0Rlc3Ryb3lNdXRleChTRExfdGltZXJfbXV0ZXgpOworCQlTRExfdGltZXJfbXV0ZXggPSBOVUxMOworCX0KKwlTRExfdGltZXJfc3RhcnRlZCA9IDA7CisJU0RMX3RpbWVyX3RocmVhZGVkID0gMDsKK30KKwordm9pZCBTRExfVGhyZWFkZWRUaW1lckNoZWNrKHZvaWQpCit7CisJVWludDMyIG5vdywgbXM7CisJU0RMX1RpbWVySUQgdCwgcHJldiwgbmV4dDsKKwlTRExfYm9vbCByZW1vdmVkOworCisJU0RMX211dGV4UChTRExfdGltZXJfbXV0ZXgpOworCWxpc3RfY2hhbmdlZCA9IFNETF9GQUxTRTsKKwlub3cgPSBTRExfR2V0VGlja3MoKTsKKwlmb3IgKCBwcmV2ID0gTlVMTCwgdCA9IFNETF90aW1lcnM7IHQ7IHQgPSBuZXh0ICkgeworCQlyZW1vdmVkID0gU0RMX0ZBTFNFOworCQltcyA9IHQtPmludGVydmFsIC0gU0RMX1RJTUVTTElDRTsKKwkJbmV4dCA9IHQtPm5leHQ7CisJCWlmICggKGludCkobm93IC0gdC0+bGFzdF9hbGFybSkgPiAoaW50KW1zICkgeworCQkJc3RydWN0IF9TRExfVGltZXJJRCB0aW1lcjsKKworCQkJaWYgKCAobm93IC0gdC0+bGFzdF9hbGFybSkgPCB0LT5pbnRlcnZhbCApIHsKKwkJCQl0LT5sYXN0X2FsYXJtICs9IHQtPmludGVydmFsOworCQkJfSBlbHNlIHsKKwkJCQl0LT5sYXN0X2FsYXJtID0gbm93OworCQkJfQorI2lmZGVmIERFQlVHX1RJTUVSUworCQkJcHJpbnRmKCJFeGVjdXRpbmcgdGltZXIgJXAgKHRocmVhZCA9ICVkKVxuIiwKKwkJCQl0LCBTRExfVGhyZWFkSUQoKSk7CisjZW5kaWYKKwkJCXRpbWVyID0gKnQ7CisJCQlTRExfbXV0ZXhWKFNETF90aW1lcl9tdXRleCk7CisJCQltcyA9IHRpbWVyLmNiKHRpbWVyLmludGVydmFsLCB0aW1lci5wYXJhbSk7CisJCQlTRExfbXV0ZXhQKFNETF90aW1lcl9tdXRleCk7CisJCQlpZiAoIGxpc3RfY2hhbmdlZCApIHsKKwkJCQkvKiBBYm9ydCwgbGlzdCBvZiB0aW1lcnMgbW9kaWZpZWQgKi8KKwkJCQkvKiBGSVhNRTogd2hhdCBpZiBtcyB3YXMgY2hhbmdlZD8gKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICggbXMgIT0gdC0+aW50ZXJ2YWwgKSB7CisJCQkJaWYgKCBtcyApIHsKKwkJCQkJdC0+aW50ZXJ2YWwgPSBST1VORF9SRVNPTFVUSU9OKG1zKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBSZW1vdmUgdGltZXIgZnJvbSB0aGUgbGlzdCAqLworI2lmZGVmIERFQlVHX1RJTUVSUworCQkJCQlwcmludGYoIlNETDogUmVtb3ZpbmcgdGltZXIgJXBcbiIsIHQpOworI2VuZGlmCisJCQkJCWlmICggcHJldiApIHsKKwkJCQkJCXByZXYtPm5leHQgPSBuZXh0OworCQkJCQl9IGVsc2UgeworCQkJCQkJU0RMX3RpbWVycyA9IG5leHQ7CisJCQkJCX0KKwkJCQkJU0RMX2ZyZWUodCk7CisJCQkJCS0tU0RMX3RpbWVyX3J1bm5pbmc7CisJCQkJCXJlbW92ZWQgPSBTRExfVFJVRTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogRG9uJ3QgdXBkYXRlIHByZXYgaWYgdGhlIHRpbWVyIGhhcyBkaXNhcHBlYXJlZCAqLworCQlpZiAoICEgcmVtb3ZlZCApIHsKKwkJCXByZXYgPSB0OworCQl9CisJfQorCVNETF9tdXRleFYoU0RMX3RpbWVyX211dGV4KTsKK30KKworc3RhdGljIFNETF9UaW1lcklEIFNETF9BZGRUaW1lckludGVybmFsKFVpbnQzMiBpbnRlcnZhbCwgU0RMX05ld1RpbWVyQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBhcmFtKQoreworCVNETF9UaW1lcklEIHQ7CisJdCA9IChTRExfVGltZXJJRCkgU0RMX21hbGxvYyhzaXplb2Yoc3RydWN0IF9TRExfVGltZXJJRCkpOworCWlmICggdCApIHsKKwkJdC0+aW50ZXJ2YWwgPSBST1VORF9SRVNPTFVUSU9OKGludGVydmFsKTsKKwkJdC0+Y2IgPSBjYWxsYmFjazsKKwkJdC0+cGFyYW0gPSBwYXJhbTsKKwkJdC0+bGFzdF9hbGFybSA9IFNETF9HZXRUaWNrcygpOworCQl0LT5uZXh0ID0gU0RMX3RpbWVyczsKKwkJU0RMX3RpbWVycyA9IHQ7CisJCSsrU0RMX3RpbWVyX3J1bm5pbmc7CisJCWxpc3RfY2hhbmdlZCA9IFNETF9UUlVFOworCX0KKyNpZmRlZiBERUJVR19USU1FUlMKKwlwcmludGYoIlNETF9BZGRUaW1lciglZCkgPSAlMDh4IG51bV90aW1lcnMgPSAlZFxuIiwgaW50ZXJ2YWwsIChVaW50MzIpdCwgU0RMX3RpbWVyX3J1bm5pbmcpOworI2VuZGlmCisJcmV0dXJuIHQ7Cit9CisKK1NETF9UaW1lcklEIFNETF9BZGRUaW1lcihVaW50MzIgaW50ZXJ2YWwsIFNETF9OZXdUaW1lckNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwYXJhbSkKK3sKKwlTRExfVGltZXJJRCB0OworCWlmICggISBTRExfdGltZXJfbXV0ZXggKSB7CisJCWlmICggU0RMX3RpbWVyX3N0YXJ0ZWQgKSB7CisJCQlTRExfU2V0RXJyb3IoIlRoaXMgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IG11bHRpcGxlIHRpbWVycyIpOworCQl9IGVsc2UgeworCQkJU0RMX1NldEVycm9yKCJZb3UgbXVzdCBjYWxsIFNETF9Jbml0KFNETF9JTklUX1RJTUVSKSBmaXJzdCIpOworCQl9CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoICEgU0RMX3RpbWVyX3RocmVhZGVkICkgeworCQlTRExfU2V0RXJyb3IoIk11bHRpcGxlIHRpbWVycyByZXF1aXJlIHRocmVhZGVkIGV2ZW50cyEiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVNETF9tdXRleFAoU0RMX3RpbWVyX211dGV4KTsKKwl0ID0gU0RMX0FkZFRpbWVySW50ZXJuYWwoaW50ZXJ2YWwsIGNhbGxiYWNrLCBwYXJhbSk7CisJU0RMX211dGV4VihTRExfdGltZXJfbXV0ZXgpOworCXJldHVybiB0OworfQorCitTRExfYm9vbCBTRExfUmVtb3ZlVGltZXIoU0RMX1RpbWVySUQgaWQpCit7CisJU0RMX1RpbWVySUQgdCwgcHJldiA9IE5VTEw7CisJU0RMX2Jvb2wgcmVtb3ZlZDsKKworCXJlbW92ZWQgPSBTRExfRkFMU0U7CisJU0RMX211dGV4UChTRExfdGltZXJfbXV0ZXgpOworCS8qIExvb2sgZm9yIGlkIGluIHRoZSBsaW5rZWQgbGlzdCBvZiB0aW1lcnMgKi8KKwlmb3IgKHQgPSBTRExfdGltZXJzOyB0OyBwcmV2PXQsIHQgPSB0LT5uZXh0ICkgeworCQlpZiAoIHQgPT0gaWQgKSB7CisJCQlpZihwcmV2KSB7CisJCQkJcHJldi0+bmV4dCA9IHQtPm5leHQ7CisJCQl9IGVsc2UgeworCQkJCVNETF90aW1lcnMgPSB0LT5uZXh0OworCQkJfQorCQkJU0RMX2ZyZWUodCk7CisJCQktLVNETF90aW1lcl9ydW5uaW5nOworCQkJcmVtb3ZlZCA9IFNETF9UUlVFOworCQkJbGlzdF9jaGFuZ2VkID0gU0RMX1RSVUU7CisJCQlicmVhazsKKwkJfQorCX0KKyNpZmRlZiBERUJVR19USU1FUlMKKwlwcmludGYoIlNETF9SZW1vdmVUaW1lciglMDh4KSA9ICVkIG51bV90aW1lcnMgPSAlZCB0aHJlYWQgPSAlZFxuIiwgKFVpbnQzMilpZCwgcmVtb3ZlZCwgU0RMX3RpbWVyX3J1bm5pbmcsIFNETF9UaHJlYWRJRCgpKTsKKyNlbmRpZgorCVNETF9tdXRleFYoU0RMX3RpbWVyX211dGV4KTsKKwlyZXR1cm4gcmVtb3ZlZDsKK30KKworLyogT2xkIHN0eWxlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgd3JhcHBlZCB0aHJvdWdoIHRoaXMgKi8KK3N0YXRpYyBVaW50MzIgU0RMQ0FMTCBjYWxsYmFja193cmFwcGVyKFVpbnQzMiBtcywgdm9pZCAqcGFyYW0pCit7CisJU0RMX1RpbWVyQ2FsbGJhY2sgZnVuYyA9IChTRExfVGltZXJDYWxsYmFjaykgcGFyYW07CisJcmV0dXJuICgqZnVuYykobXMpOworfQorCitpbnQgU0RMX1NldFRpbWVyKFVpbnQzMiBtcywgU0RMX1RpbWVyQ2FsbGJhY2sgY2FsbGJhY2spCit7CisJaW50IHJldHZhbDsKKworI2lmZGVmIERFQlVHX1RJTUVSUworCXByaW50ZigiU0RMX1NldFRpbWVyKCVkKVxuIiwgbXMpOworI2VuZGlmCisJcmV0dmFsID0gMDsKKworCWlmICggU0RMX3RpbWVyX3RocmVhZGVkICkgeworCQlTRExfbXV0ZXhQKFNETF90aW1lcl9tdXRleCk7CisJfQorCWlmICggU0RMX3RpbWVyX3J1bm5pbmcgKSB7CS8qIFN0b3AgYW55IGN1cnJlbnRseSBydW5uaW5nIHRpbWVyICovCisJCWlmICggU0RMX3RpbWVyX3RocmVhZGVkICkgeworCQkJd2hpbGUgKCBTRExfdGltZXJzICkgeworCQkJCVNETF9UaW1lcklEIGZyZWVtZSA9IFNETF90aW1lcnM7CisJCQkJU0RMX3RpbWVycyA9IFNETF90aW1lcnMtPm5leHQ7CisJCQkJU0RMX2ZyZWUoZnJlZW1lKTsKKwkJCX0KKwkJCVNETF90aW1lcl9ydW5uaW5nID0gMDsKKwkJCWxpc3RfY2hhbmdlZCA9IFNETF9UUlVFOworCQl9IGVsc2UgeworCQkJU0RMX1NZU19TdG9wVGltZXIoKTsKKwkJCVNETF90aW1lcl9ydW5uaW5nID0gMDsKKwkJfQorCX0KKwlpZiAoIG1zICkgeworCQlpZiAoIFNETF90aW1lcl90aHJlYWRlZCApIHsKKwkJCWlmICggU0RMX0FkZFRpbWVySW50ZXJuYWwobXMsIGNhbGxiYWNrX3dyYXBwZXIsICh2b2lkICopY2FsbGJhY2spID09IE5VTEwgKSB7CisJCQkJcmV0dmFsID0gLTE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlTRExfdGltZXJfcnVubmluZyA9IDE7CisJCQlTRExfYWxhcm1faW50ZXJ2YWwgPSBtczsKKwkJCVNETF9hbGFybV9jYWxsYmFjayA9IGNhbGxiYWNrOworCQkJcmV0dmFsID0gU0RMX1NZU19TdGFydFRpbWVyKCk7CisJCX0KKwl9CisJaWYgKCBTRExfdGltZXJfdGhyZWFkZWQgKSB7CisJCVNETF9tdXRleFYoU0RMX3RpbWVyX211dGV4KTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9TRExfdGltZXJfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9TRExfdGltZXJfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTgxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL1NETF90aW1lcl9jLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFVzZWZ1bCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBmcm9tIFNETF90aW1lci5jICovCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisKKyNkZWZpbmUgUk9VTkRfUkVTT0xVVElPTihYKQlcCisJKCgoWCtUSU1FUl9SRVNPTFVUSU9OLTEpL1RJTUVSX1JFU09MVVRJT04pKlRJTUVSX1JFU09MVVRJT04pCisKK2V4dGVybiBpbnQgU0RMX3RpbWVyX3N0YXJ0ZWQ7CitleHRlcm4gaW50IFNETF90aW1lcl9ydW5uaW5nOworCisvKiBEYXRhIHRvIGhhbmRsZSBhIHNpbmdsZSBwZXJpb2RpYyBhbGFybSAqLworZXh0ZXJuIFVpbnQzMiBTRExfYWxhcm1faW50ZXJ2YWw7CitleHRlcm4gU0RMX1RpbWVyQ2FsbGJhY2sgU0RMX2FsYXJtX2NhbGxiYWNrOworCisvKiBTZXQgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIHNob3VsZCB1c2UgYSB0aHJlYWQuCisgICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hpbGUgdGhlIHRpbWVyIHN1YnN5c3RlbSBpcyBydW5uaW5nLgorKi8KK2V4dGVybiBpbnQgU0RMX1NldFRpbWVyVGhyZWFkZWQoaW50IHZhbHVlKTsKKworZXh0ZXJuIGludCBTRExfVGltZXJJbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgU0RMX1RpbWVyUXVpdCh2b2lkKTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgU0RMIGV2ZW50IHRocmVhZCBpZiBpdCBpcyBhdmFpbGFibGUgKi8KK2V4dGVybiB2b2lkIFNETF9UaHJlYWRlZFRpbWVyQ2hlY2sodm9pZCk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL2Jlb3MvU0RMX3N5c3RpbWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL2Jlb3MvU0RMX3N5c3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjZjZjNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvYmVvcy9TRExfc3lzdGltZXIuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9USU1FUl9CRU9TCisKKyNpbmNsdWRlIDxiZS9rZXJuZWwvT1MuaD4KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICIuLi9TRExfdGltZXJfYy5oIgorCitzdGF0aWMgYmlndGltZV90IHN0YXJ0OworCit2b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCit7CisJLyogU2V0IGZpcnN0IHRpY2tzIHZhbHVlICovCisJc3RhcnQgPSBzeXN0ZW1fdGltZSgpOworfQorCitVaW50MzIgU0RMX0dldFRpY2tzKHZvaWQpCit7CisJcmV0dXJuKChzeXN0ZW1fdGltZSgpLXN0YXJ0KS8xMDAwKTsKK30KKwordm9pZCBTRExfRGVsYXkoVWludDMyIG1zKQoreworCXNub296ZShtcyoxMDAwKTsKK30KKworLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KK3N0YXRpYyBpbnQgdGltZXJfYWxpdmUgPSAwOworc3RhdGljIFNETF9UaHJlYWQgKnRpbWVyID0gTlVMTDsKKworc3RhdGljIGludCBSdW5UaW1lcih2b2lkICp1bnVzZWQpCit7CisJd2hpbGUgKCB0aW1lcl9hbGl2ZSApIHsKKwkJaWYgKCBTRExfdGltZXJfcnVubmluZyApIHsKKwkJCVNETF9UaHJlYWRlZFRpbWVyQ2hlY2soKTsKKwkJfQorCQlTRExfRGVsYXkoMTApOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qIFRoaXMgaXMgb25seSBjYWxsZWQgaWYgdGhlIGV2ZW50IHRocmVhZCBpcyBub3QgcnVubmluZyAqLworaW50IFNETF9TWVNfVGltZXJJbml0KHZvaWQpCit7CisJdGltZXJfYWxpdmUgPSAxOworCXRpbWVyID0gU0RMX0NyZWF0ZVRocmVhZChSdW5UaW1lciwgTlVMTCk7CisJaWYgKCB0aW1lciA9PSBOVUxMICkKKwkJcmV0dXJuKC0xKTsKKwlyZXR1cm4oU0RMX1NldFRpbWVyVGhyZWFkZWQoMSkpOworfQorCit2b2lkIFNETF9TWVNfVGltZXJRdWl0KHZvaWQpCit7CisJdGltZXJfYWxpdmUgPSAwOworCWlmICggdGltZXIgKSB7CisJCVNETF9XYWl0VGhyZWFkKHRpbWVyLCBOVUxMKTsKKwkJdGltZXIgPSBOVUxMOworCX0KK30KKworaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKQoreworCVNETF9TZXRFcnJvcigiSW50ZXJuYWwgbG9naWMgZXJyb3I6IEJlT1MgdXNlcyB0aHJlYWRlZCB0aW1lciIpOworCXJldHVybigtMSk7Cit9CisKK3ZvaWQgU0RMX1NZU19TdG9wVGltZXIodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBTRExfVElNRVJfQkVPUyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9kYy9TRExfc3lzdGltZXIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvZGMvU0RMX3N5c3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2ZTE1OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvZGMvU0RMX3N5c3RpbWVyLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX1RJTUVSX0RDCisKKyNpbmNsdWRlIDxrb3MuaD4KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICIuLi9TRExfdGltZXJfYy5oIgorCitzdGF0aWMgdW5zaWduZWQgc3RhcnQ7CisKKy8qIAorCWppZiA9ICBtcyAqIEhaIC8xMDAwCisJbXMgID0gamlmICogMTAwMC9IWgorKi8KKwordm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKQoreworCS8qIFNldCBmaXJzdCB0aWNrcyB2YWx1ZSAqLworCXN0YXJ0ID0gamlmZmllczsKK30KKworVWludDMyIFNETF9HZXRUaWNrcyh2b2lkKQoreworCXJldHVybigoamlmZmllcy1zdGFydCkqMTAwMC9IWik7Cit9CisKK3ZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKK3sKKwl0aGRfc2xlZXAobXMpOworfQorCisvKiBEYXRhIHRvIGhhbmRsZSBhIHNpbmdsZSBwZXJpb2RpYyBhbGFybSAqLworc3RhdGljIGludCB0aW1lcl9hbGl2ZSA9IDA7CitzdGF0aWMgU0RMX1RocmVhZCAqdGltZXIgPSBOVUxMOworCitzdGF0aWMgaW50IFJ1blRpbWVyKHZvaWQgKnVudXNlZCkKK3sKKwl3aGlsZSAoIHRpbWVyX2FsaXZlICkgeworCQlpZiAoIFNETF90aW1lcl9ydW5uaW5nICkgeworCQkJU0RMX1RocmVhZGVkVGltZXJDaGVjaygpOworCQl9CisJCVNETF9EZWxheSgxMCk7CisJfQorCXJldHVybigwKTsKK30KKworLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgZXZlbnQgdGhyZWFkIGlzIG5vdCBydW5uaW5nICovCitpbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKK3sKKwl0aW1lcl9hbGl2ZSA9IDE7CisJdGltZXIgPSBTRExfQ3JlYXRlVGhyZWFkKFJ1blRpbWVyLCBOVUxMKTsKKwlpZiAoIHRpbWVyID09IE5VTEwgKQorCQlyZXR1cm4oLTEpOworCXJldHVybihTRExfU2V0VGltZXJUaHJlYWRlZCgxKSk7Cit9CisKK3ZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCkKK3sKKwl0aW1lcl9hbGl2ZSA9IDA7CisJaWYgKCB0aW1lciApIHsKKwkJU0RMX1dhaXRUaHJlYWQodGltZXIsIE5VTEwpOworCQl0aW1lciA9IE5VTEw7CisJfQorfQorCitpbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCit7CisJU0RMX1NldEVycm9yKCJJbnRlcm5hbCBsb2dpYyBlcnJvcjogREMgdXNlcyB0aHJlYWRlZCB0aW1lciIpOworCXJldHVybigtMSk7Cit9CisKK3ZvaWQgU0RMX1NZU19TdG9wVGltZXIodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBTRExfVElNRVJfREMgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvZHVtbXkvU0RMX3N5c3RpbWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL2R1bW15L1NETF9zeXN0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMjY2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL2R1bW15L1NETF9zeXN0aW1lci5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChTRExfVElNRVJfRFVNTVkpIHx8IGRlZmluZWQoU0RMX1RJTUVSU19ESVNBQkxFRCkKKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCisKK3ZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKK3sKK30KKworVWludDMyIFNETF9HZXRUaWNrcyAodm9pZCkKK3sKKwlTRExfVW5zdXBwb3J0ZWQoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBTRExfRGVsYXkgKFVpbnQzMiBtcykKK3sKKwlTRExfVW5zdXBwb3J0ZWQoKTsKK30KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKworLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KK3N0YXRpYyBpbnQgdGltZXJfYWxpdmUgPSAwOworc3RhdGljIFNETF9UaHJlYWQgKnRpbWVyID0gTlVMTDsKKworc3RhdGljIGludCBSdW5UaW1lcih2b2lkICp1bnVzZWQpCit7CisJd2hpbGUgKCB0aW1lcl9hbGl2ZSApIHsKKwkJaWYgKCBTRExfdGltZXJfcnVubmluZyApIHsKKwkJCVNETF9UaHJlYWRlZFRpbWVyQ2hlY2soKTsKKwkJfQorCQlTRExfRGVsYXkoMSk7CisJfQorCXJldHVybigwKTsKK30KKworLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgZXZlbnQgdGhyZWFkIGlzIG5vdCBydW5uaW5nICovCitpbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKK3sKKwl0aW1lcl9hbGl2ZSA9IDE7CisJdGltZXIgPSBTRExfQ3JlYXRlVGhyZWFkKFJ1blRpbWVyLCBOVUxMKTsKKwlpZiAoIHRpbWVyID09IE5VTEwgKQorCQlyZXR1cm4oLTEpOworCXJldHVybihTRExfU2V0VGltZXJUaHJlYWRlZCgxKSk7Cit9CisKK3ZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCkKK3sKKwl0aW1lcl9hbGl2ZSA9IDA7CisJaWYgKCB0aW1lciApIHsKKwkJU0RMX1dhaXRUaHJlYWQodGltZXIsIE5VTEwpOworCQl0aW1lciA9IE5VTEw7CisJfQorfQorCitpbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCit7CisJU0RMX1NldEVycm9yKCJJbnRlcm5hbCBsb2dpYyBlcnJvcjogdGhyZWFkZWQgdGltZXIgaW4gdXNlIik7CisJcmV0dXJuKC0xKTsKK30KKwordm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQoreworCXJldHVybjsKK30KKworI2VuZGlmIC8qIFNETF9USU1FUl9EVU1NWSB8fCBTRExfVElNRVJTX0RJU0FCTEVEICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL21hY29zL0Zhc3RUaW1lcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9tYWNvcy9GYXN0VGltZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGE3NGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9tYWNvcy9GYXN0VGltZXMuYwpAQCAtMCwwICsxLDM1MiBAQAorLyogRmlsZSAiRmFzdFRpbWVzLmMiIC0gT3JpZ2luYWwgY29kZSBieSBNYXR0IFNsb3QgPGZwcmVmZWN0QGFtYnJvc2lhc3cuY29tPiAgKi8KKy8qIENyZWF0ZWQgNC8yNC85OSAgICAtIFRoaXMgZmlsZSBpcyBoZXJlYnkgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluICAgICAgICovCisvKiBVcGRhdGVkIDUvMjEvOTkgICAgLSBDYWxpYnJhdGUgdG8gVklBLCBhZGQgVEJSIHN1cHBvcnQsIHJlbmFtZWQgZnVuY3Rpb25zICAqLworLyogVXBkYXRlZCAxMC80Lzk5ICAgIC0gVXNlIEFic29sdXRlVG9OYW5vc2Vjb25kcygpIGluIGNhc2UgQWJzb2x1dGUgPSBkb3VibGUgKi8KKy8qIFVwZGF0ZWQgMi8xNS8wMCAgICAtIENoZWNrIGZvciBuYXRpdmUgVGltZSBNYW5hZ2VyLCBubyBuZWVkIHRvIGNhbGlicmF0ZSAgICovCisvKiBVcGRhdGVkIDIvMTkvMDAgICAgLSBGaXhlZCBkZWZhdWx0IHZhbHVlIGZvciBnU2NhbGUgdW5kZXIgbmF0aXZlIFRpbWUgTWdyICAqLworLyogVXBkYXRlZCAzLzIxLzAwICAgIC0gRml4ZWQgbnMgY29udmVyc2lvbiwgY3JlYXRlIDIgZGlmZmVyZW50IHNjYWxlIGZhY3RvcnMgKi8KKy8qIFVwZGF0ZWQgNS8wMy8wMCAgICAtIEFkZGVkIGNvcHlyaWdodCBhbmQgcGxhY2VkIGludG8gUEQuIE5vIGNvZGUgY2hhbmdlcyAgICovCisvKiBVcGRhdGVkIDgvMDEvMDAgICAgLSBNYWRlICJDYXJib24tY29tcGF0aWJsZSIgYnkgcmVwbGFjaW5nIExNR2V0VGlja3MoKSAgICAqLworCisvKiBUaGlzIGZpbGUgaXMgQ29weXJpZ2h0IChDKSBNYXR0IFNsb3QsIDE5OTktMjAxMi4gSXQgaXMgaGVyZWJ5IHBsYWNlZCBpbnRvIAorICAgdGhlIHB1YmxpYyBkb21haW4uIFRoZSBhdXRob3IgbWFrZXMgbm8gd2FycmFudHkgYXMgdG8gZml0bmVzcyBvciBzdGFiaWxpdHkgKi8KKworI2luY2x1ZGUgPEdlc3RhbHQuaD4KKyNpbmNsdWRlIDxMb3dNZW0uaD4KKyNpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CisjaW5jbHVkZSA8RHJpdmVyU2VydmljZXMuaD4KKyNpbmNsdWRlIDxUaW1lci5oPgorCisjaW5jbHVkZSAiRmFzdFRpbWVzLmgiCisKKyNpZmRlZiBUQVJHRVRfQ1BVX1BQQworI3VuZGVmIEdFTkVSQVRJTkdQT1dFUlBDIC8qIHN0b3Agd2hpbmluZyAqLworI2RlZmluZSBHRU5FUkFUSU5HUE9XRVJQQyBUQVJHRVRfQ1BVX1BQQworI2VuZGlmCisKKy8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCisvKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLworLyoKKwlPbiA2ODB4MCBtYWNoaW5lcywgd2UganVzdCB1c2UgTWljcm9zZWNvbmRzKCkuCisJCisJT24gUG93ZXJQQyBtYWNoaW5lcywgd2UgdHJ5IHNldmVyYWwgbWV0aG9kczoKKwkgICogRHJpdmVyU2VydmljZXNMaWIgaXMgYXZhaWxhYmxlIG9uIGFsbCBQQ0kgUG93ZXJNYWNzLCBhbmQgcGVyaGFwcworCSAgICBzb21lIE51QnVzIFBvd2VyTWFjcy4gSWYgaXQgaXMsIHdlIHVzZSBVcFRpbWUoKSA6IE92ZXJoZWFkID0gMi4xILVzZWMuCisJICAqIFRoZSBQb3dlclBDIDYwMSBoYXMgYSBidWlsdC1pbiAicmVhbCB0aW1lIGNsb2NrIiBSVEMsIGFuZCB3ZSBmYWxsCisJICAgIGJhY2sgdG8gdGhhdCwgYWNjZXNzaW5nIGl0IGRpcmVjdGx5IGZyb20gYXNtLiBPdmVyaGVhZCA9IDEuMyC1c2VjLgorCSAgKiBMYXRlciBQb3dlclBDcyBoYXZlIGFuIGFjY3VyYXRlICJ0aW1lIGJhc2UgcmVnaXN0ZXIiIFRCUiwgYW5kIHdlIAorCSAgICBmYWxsIGJhY2sgdG8gdGhhdCwgYWNjZXNzIGl0IGZyb20gUG93ZXJQQyBhc20uIE92ZXJoZWFkID0gMS4zILVzZWMuCisJICAqIFdlIGNhbiBhbHNvIHRyeSBNaWNyb3NlY29uZHMoKSB3aGljaCBpcyBlbXVsYXRlZCA6IE92ZXJoZWFkID0gMzYgtXNlYy4KKworCU9uIFBvd2VyUEMgbWFjaGluZXMsIHdlIGF2b2lkIHRoZSBmb2xsb3dpbmc6CisJICAqIE9wZW5UcmFuc3BvcnQgaXMgYXZhaWxhYmxlIG9uIGFsbCBQQ0kgYW5kIHNvbWUgTnVCdXMgUG93ZXJNYWNzLCBidXQgaXQKKwkgICAgdXNlcyBVcFRpbWUoKSBpZiBhdmFpbGFibGUgYW5kIGZhbGxzIGJhY2sgdG8gTWljcm9zZWNvbmRzKCkgb3RoZXJ3aXNlLgorCSAgKiBJbnB1dFNwcm9ja2V0IGlzIGF2YWlsYWJsZSBvbiBtYW55IFBvd2VyTWFjcywgYnV0IGFnYWluIGl0IHVzZXMKKwkgICAgVXBUaW1lKCkgaWYgYXZhaWxhYmxlIGFuZCBmYWxscyBiYWNrIHRvIE1pY3Jvc2Vjb25kcygpIG90aGVyd2lzZS4KKworCUFub3RoZXIgUG93ZXJQQyBub3RlOiBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zLCBlc3BlY2lhbGx5IDNyZCBwYXJ0eSB1cGdyYWRlCisJY2FyZHMsIG1heSByZXR1cm4gaW5hY2N1cmF0ZSB0aW1pbmdzIGZvciB0aGUgQ1BVIG9yIG1lbW9yeSBidXMgLS0gY2F1c2luZworCXNrZXcgaW4gdmFyaW91cyBzeXN0ZW0gcm91dGluZXMgKHVwIHRvIDIwJSBkcmlmdCEpLiBUaGUgVklBIGNoaXAgaXMgdmVyeQorCWFjY3VyYXRlLCBhbmQgaXQncyB0aGUgYmFzaXMgZm9yIHRoZSBUaW1lIE1hbmFnZXIgYW5kIE1pY3Jvc2Vjb25kcygpLgorCVVuZm9ydHVuYXRlbHksIGl0J3MgYWxzbyB2ZXJ5IHNsb3cgYmVjYXVzZSB0aGUgTWFjT1MgaGFzIHRvIChhKSBzd2l0Y2ggdG8KKwk2OEsgYW5kIChiKSBwb2xsIGZvciBhIFZJQSBldmVudC4KKwkKKwlXZSBjb21wZW5zYXRlIGZvciB0aGUgZHJpZnQgYnkgY2FsaWJyYXRpbmcgYSBmbG9hdGluZyBwb2ludCBzY2FsZSBmYWN0b3IKKwliZXR3ZWVuIG91ciBmYXN0IG1ldGhvZCBhbmQgdGhlIGFjY3VyYXRlIHRpbWVyIGF0IHN0YXJ0dXAsIHRoZW4gY29udmVydAorCWVhY2ggc2FtcGxlIHF1aWNrbHkgb24gdGhlIGZseS4gSSdkIHJhdGhlciBub3QgaGF2ZSB0aGUgaW5pdGlhbGl6YXRpb24gCisJb3ZlcmhlYWQgLS0gYnV0IGl0J3Mgc2ltcGx5IG5lY2Vzc2FyeSBmb3IgYWNjdXJhdGUgdGltaW5nLiBZb3UgY2FuIGRyb3AKKwlpdCBkb3duIHRvIDMwIHRpY2tzIGlmIHlvdSBwcmVmZXIsIGJ1dCB0aGF0J3MgYXMgbG93IGFzIEknZCByZWNvbW1lbmQuCisKKwlVbmRlciBNYWNPUyA5LCAibmV3IHdvcmxkIiBNYWNzIChpTWFjcywgQitXIEczcyBhbmQgRytXIEc0cykgaGF2ZSBhIG5hdGl2ZQorCVRpbWUgTWFuYWdlciBpbXBsZW1lbnRhdGlvbjogVXBUaW1lKCksIE1pY3Jvc2Vjb25kcygpLCBhbmQgVGlja0NvdW50KCkgYXJlCisJYWxsIGJhc2VkIG9uIHRoZSBzYW1lIHVuZGVybHlpbmcgY291bnRlci4gVGhpcyBtYWtlcyBpdCBzaWxseSB0byBjYWxpYnJhdGUKKwlVcFRpbWUoKSBhZ2FpbnN0IFRpY2tDb3VudCgpLiBXZSBub3cgY2hlY2sgZm9yIHRoaXMgZmVhdHVyZSB1c2luZyBHZXN0YWx0KCksCisJYW5kIHNraXAgdGhlIHdob2xlIGNhbGlicmF0aW9uIHN0ZXAgaWYgcG9zc2libGUuCisKKyovCisvKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLworLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KKworI2RlZmluZSBSVENUb05hbm8odykJKChkb3VibGUpICh3KS5oaSAqIDEwMDAwMDAwMDAuMCArIChkb3VibGUpICh3KS5sbykKKyNkZWZpbmUgV2lkZVRvNjRiaXQodykJKCooVUludDY0ICopICYodykpCisKKy8qIExNR2V0VGlja3MoKSBpcyBub3QgaW4gQ2FyYm9uIGFuZCBUaWNrQ291bnQoKSBoYXMgYSBmYWlyIGJpdCBvZiBvdmVyaGVhZCwKKyAgIHNvIGZvciBzcGVlZCB3ZSBhbHdheXMgcmVhZCBsb3dtZW0gZGlyZWN0bHkuIFRoaXMgaXMgYSBNYWMgT1MgWCBuby1ubywgYnV0IAorICAgaXQgYWx3YXlzIHdvcmsgb24gdGhvc2Ugc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgYSBuYXRpdmUgVGltZSBNYW5hZ2VyIChpZSwKKyAgIGFueXRoaW5nIGJlZm9yZSBNYWNPUyA5KSAtLSByZWdhcmRsZXNzIHdoZXRoZXIgd2UgYXJlIGluIENhcmJvbiBvciBub3QhICovCisjZGVmaW5lIE15TE1HZXRUaWNrcygpCSgqKHZvbGF0aWxlIFVJbnQzMiAqKSAweDE2QSkKKworI2lmIEdFTkVSQVRJTkdQT1dFUlBDCisKK3N0YXRpYyBhc20gVW5zaWduZWRXaWRlIFBvbGxSVEModm9pZCk7CitzdGF0aWMgYXNtIFVuc2lnbmVkV2lkZSBQb2xsVEJSKHZvaWQpOworc3RhdGljIFB0ciBGaW5kRnVuY3Rpb25JblNoYXJlZExpYihTdHJpbmdQdHIgbGliTmFtZSwgU3RyaW5nUHRyIGZ1bmNOYW1lKTsKKworc3RhdGljIEJvb2xlYW4JCQlnSW5pdGVkID0gZmFsc2U7CitzdGF0aWMgQm9vbGVhbgkJCWdOYXRpdmUgPSBmYWxzZTsKK3N0YXRpYyBCb29sZWFuCQkJZ1VzZVJUQyA9IGZhbHNlOworc3RhdGljIEJvb2xlYW4JCQlnVXNlVEJSID0gZmFsc2U7CitzdGF0aWMgZG91YmxlCQkJZ1NjYWxlVVNlYyA9IDEuMCAvIDEwMDAuMDsgICAgLyogMSAvICggbnNlYyAvIHVzZWMpICovCitzdGF0aWMgZG91YmxlCQkJZ1NjYWxlTVNlYyA9IDEuMCAvIDEwMDAwMDAuMDsgLyogMSAvICggbnNlYyAvIG1zZWMpICovCisKKy8qIEZ1bmN0aW9ucyBsb2FkZWQgZnJvbSBEcml2ZXJTZXJ2aWNlc0xpYiAqLwordHlwZWRlZiBBYnNvbHV0ZVRpbWUgCSgqVXBUaW1lUHJvY1B0cikodm9pZCk7Cit0eXBlZGVmIE5hbm9zZWNvbmRzIAkoKkEyTlNQcm9jUHRyKShBYnNvbHV0ZVRpbWUpOworc3RhdGljIFVwVGltZVByb2NQdHIgCWdVcFRpbWUgPSBOVUxMOworc3RhdGljIEEyTlNQcm9jUHRyIAkJZ0EyTlMgPSBOVUxMOworCisjZW5kaWYgLyogR0VORVJBVElOR1BPV0VSUEMgKi8KKworLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KKy8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCisKK3ZvaWQgRmFzdEluaXRpYWxpemUoKSB7CisJU0ludDMyCQkJcmVzdWx0OworCisJaWYgKCFnSW5pdGVkKSB7CisKKyNpZiBHRU5FUkFUSU5HUE9XRVJQQworCisJCS8qIEluaXRpYWxpemUgdGhlIGZlYXR1cmUgZmxhZ3MgKi8KKwkJZ05hdGl2ZSA9IGdVc2VSVEMgPSBnVXNlVEJSID0gZmFsc2U7CisKKwkJLyogV2UgdXNlIENGTSB0byBmaW5kIGFuZCBsb2FkIG5lZWRlZCBzeW1ib2xzIGZyb20gc2hhcmVkIGxpYnJhcmllcywgc28KKwkJICAgdGhlIGFwcGxpY2F0aW9uIGRvZXNuJ3QgaGF2ZSB0byB3ZWFrLWxpbmsgdGhlbSwgZm9yIGNvbnZlbmllbmNlLiAgICovCisJCWdVcFRpbWUgPSAoVXBUaW1lUHJvY1B0cikgRmluZEZ1bmN0aW9uSW5TaGFyZWRMaWIoCisJCQkJIlxwRHJpdmVyU2VydmljZXNMaWIiLCAiXHBVcFRpbWUiKTsKKwkJaWYgKGdVcFRpbWUpIGdBMk5TID0gKEEyTlNQcm9jUHRyKSBGaW5kRnVuY3Rpb25JblNoYXJlZExpYigKKwkJCQkiXHBEcml2ZXJTZXJ2aWNlc0xpYiIsICJccEFic29sdXRlVG9OYW5vc2Vjb25kcyIpOworCQlpZiAoIWdBMk5TKSBnVXBUaW1lID0gbmlsOyAvKiBQZWRhbnRpYyBidXQgbmVjZXNzYXJ5ICovCisKKwkJaWYgKGdVcFRpbWUpIHsKKwkJCS8qIElmIHdlIGxvYWRlZCBVcFRpbWUoKSwgdGhlbiB3ZSBuZWVkIHRvIGtub3cgaWYgdGhlIHN5c3RlbSBoYXMKKwkJCSAgIGEgbmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaW1lIE1hbmFnZXIuIElmIHNvLCB0aGVuIGl0J3MKKwkJCSAgIHBvaW50bGVzcyB0byBjYWxjdWxhdGUgYSBzY2FsZSBmYWN0b3IgYWdhaW5zdCB0aGUgbWlzc2luZyBWSUEgKi8KKworCQkJLyogZ2VzdGFsdE5hdGl2ZVRpbWVNZ3IgPSA0IGluIHNvbWUgZnV0dXJlIHZlcnNpb24gb2YgdGhlIGhlYWRlcnMgKi8KKwkJCWlmICghR2VzdGFsdChnZXN0YWx0VGltZU1nclZlcnNpb24sICZyZXN1bHQpICYmCisJCQkJCShyZXN1bHQgPiBnZXN0YWx0RXh0ZW5kZWRUaW1lTWdyKSkgCisJCQkJZ05hdGl2ZSA9IHRydWU7CisJCQl9CisJCSAgZWxzZSB7CisJCQkvKiBJZiBubyBEcml2ZXJTZXJ2aWNlc0xpYiwgdXNlIEdlc3RhbHQoKSB0byBnZXQgdGhlIHByb2Nlc3NvciB0eXBlLiAKKwkJCSAgIE9ubHkgTnVCdXMgUG93ZXJNYWNzIHdpdGggb2xkIFN5c3RlbSBTb2Z0d2FyZSB3b24ndCBoYXZlIERTTCwgc28KKwkJCSAgIHdlIGtub3cgaXQgc2hvdWxkIGVpdGhlciBiZSBhIDYwMSBvciA2MDMuICovCisKKwkJCS8qIFVzZSB0aGUgcHJvY2Vzc29yIGdlc3RhbHQgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlZ2lzdGVyIHRvIHVzZSAqLworCQkgCWlmICghR2VzdGFsdChnZXN0YWx0TmF0aXZlQ1BVdHlwZSwgJnJlc3VsdCkpIHsKKwkJCQlpZiAocmVzdWx0ID09IGdlc3RhbHRDUFU2MDEpIGdVc2VSVEMgPSB0cnVlOworCQkJCSAgZWxzZSBpZiAocmVzdWx0ID4gZ2VzdGFsdENQVTYwMSkgZ1VzZVRCUiA9IHRydWU7CisJCQkJfQorCQkJfQorCisJCS8qIE5vdyBjYWxjdWxhdGUgYSBzY2FsZSBmYWN0b3IgdG8ga2VlcCB1cyBhY2N1cmF0ZS4gKi8KKwkJaWYgKChnVXBUaW1lICYmICFnTmF0aXZlKSB8fCBnVXNlUlRDIHx8IGdVc2VUQlIpIHsKKwkJCVVJbnQ2NAkJCXRpY2ssIHVzZWMxLCB1c2VjMjsKKwkJCVVuc2lnbmVkV2lkZQl3aWRlOworCisJCQkvKiBXYWl0IGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2ZXJ5IG5leHQgdGljayAqLworCQkJZm9yKHRpY2sgPSBNeUxNR2V0VGlja3MoKSArIDE7IHRpY2sgPiBNeUxNR2V0VGlja3MoKTsgKTsKKwkJCQorCQkJLyogUG9sbCB0aGUgc2VsZWN0ZWQgdGltZXIgYW5kIHByZXBhcmUgaXQgKHNpbmNlIHdlIGhhdmUgdGltZSkgKi8KKwkJCXdpZGUgPSAoZ1VwVGltZSkgPyAoKmdBMk5TKSgoKmdVcFRpbWUpKCkpIDogCisJCQkJCSgoZ1VzZVJUQykgPyBQb2xsUlRDKCkgOiBQb2xsVEJSKCkpOworCQkJdXNlYzEgPSAoZ1VzZVJUQykgPyBSVENUb05hbm8od2lkZSkgOiBXaWRlVG82NGJpdCh3aWRlKTsKKwkJCQorCQkJLyogV2FpdCBmb3IgdGhlIGV4YWN0IDYwdGggdGljayB0byByb2xsIG92ZXIgKi8KKwkJCXdoaWxlKHRpY2sgKyA2MCA+IE15TE1HZXRUaWNrcygpKTsKKworCQkJLyogUG9sbCB0aGUgc2VsZWN0ZWQgdGltZXIgYWdhaW4gYW5kIHByZXBhcmUgaXQgICovCisJCQl3aWRlID0gKGdVcFRpbWUpID8gKCpnQTJOUykoKCpnVXBUaW1lKSgpKSA6IAorCQkJCQkoKGdVc2VSVEMpID8gUG9sbFJUQygpIDogUG9sbFRCUigpKTsKKwkJCXVzZWMyID0gKGdVc2VSVEMpID8gUlRDVG9OYW5vKHdpZGUpIDogV2lkZVRvNjRiaXQod2lkZSk7CisJCQkKKwkJCS8qIENhbGN1bGF0ZSBhIHNjYWxlIHZhbHVlIHRoYXQgd2lsbCBnaXZlIG1pY3Jvc2Vjb25kcyBwZXIgc2Vjb25kLgorCQkJICAgUmVtZW1iZXIsIHRoZXJlIGFyZSBhY3R1YWxseSA2MC4xNSB0aWNrcyBpbiBhIHNlY29uZCwgbm90IDYwLiAgKi8KKwkJCWdTY2FsZVVTZWMgPSAoNjAuMCAqIDEwMDAwMDAuMCkgLyAoKHVzZWMyIC0gdXNlYzEpICogNjAuMTUpOworCQkJZ1NjYWxlTVNlYyA9IGdTY2FsZVVTZWMgLyAxMDAwLjA7CisJCQl9CisKKyNlbmRpZiAvKiBHRU5FUkFUSU5HUE9XRVJQQyAqLworCisJCS8qIFdlJ3ZlIGluaXRpYWxpemVkIG91ciBnbG9iYWxzICovCisJCWdJbml0ZWQgPSB0cnVlOworCQl9CisJfQorCisvKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLworLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KKworVUludDY0IEZhc3RNaWNyb3NlY29uZHMoKSB7CisJVW5zaWduZWRXaWRlCXdpZGU7CisJVUludDY0CQkJdXNlYzsKKwkKKyNpZiBHRU5FUkFUSU5HUE9XRVJQQworCS8qIEluaXRpYWxpemUgZ2xvYmFscyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgY2FsbGVkICovCisJaWYgKCFnSW5pdGVkKSBGYXN0SW5pdGlhbGl6ZSgpOworCQorCWlmIChnTmF0aXZlKSB7CisJCS8qIFVzZSBEcml2ZXJTZXJ2aWNlcyBpZiBpdCdzIGF2YWlsYWJsZSAtLSBpdCdzIGZhc3QgYW5kIGNvbXBhdGlibGUgKi8KKwkJd2lkZSA9ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSk7CisJCXVzZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZVVTZWMgKyAwLjU7CisJCX0KKwkgIGVsc2UgaWYgKGdVcFRpbWUpIHsKKwkJLyogVXNlIERyaXZlclNlcnZpY2VzIGlmIGl0J3MgYXZhaWxhYmxlIC0tIGl0J3MgZmFzdCBhbmQgY29tcGF0aWJsZSAqLworCQl3aWRlID0gKCpnQTJOUykoKCpnVXBUaW1lKSgpKTsKKwkJdXNlYyA9IChkb3VibGUpIFdpZGVUbzY0Yml0KHdpZGUpICogZ1NjYWxlVVNlYyArIDAuNTsKKwkJfQorCSAgZWxzZSBpZiAoZ1VzZVRCUikgeworCQkvKiBPbiBhIHJlY2VudCBQb3dlclBDLCB3ZSBwb2xsIHRoZSBUQlIgZGlyZWN0bHkgKi8KKwkJd2lkZSA9IFBvbGxUQlIoKTsKKwkJdXNlYyA9IChkb3VibGUpIFdpZGVUbzY0Yml0KHdpZGUpICogZ1NjYWxlVVNlYyArIDAuNTsKKwkJfQorCSAgZWxzZSBpZiAoZ1VzZVJUQykgeworCQkvKiBPbiBhIDYwMSwgd2UgY2FuIHBvbGwgdGhlIFJUQyBpbnN0ZWFkICovCisJCXdpZGUgPSBQb2xsUlRDKCk7CisJCXVzZWMgPSAoZG91YmxlKSBSVENUb05hbm8od2lkZSkgKiBnU2NhbGVVU2VjICsgMC41OworCQl9CisJICBlbHNlIAorI2VuZGlmIC8qIEdFTkVSQVRJTkdQT1dFUlBDICovCisJCXsKKwkJLyogSWYgYWxsIGVsc2UgZmFpbHMsIHN1ZmZlciB0aGUgbWl4ZWQgbW9kZSBvdmVyaGVhZCAqLworCQlNaWNyb3NlY29uZHMoJndpZGUpOworCQl1c2VjID0gV2lkZVRvNjRiaXQod2lkZSk7CisJCX0KKworCXJldHVybih1c2VjKTsKKwl9CisKKy8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCisvKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLworCitVSW50NjQgRmFzdE1pbGxpc2Vjb25kcygpIHsKKwlVbnNpZ25lZFdpZGUJd2lkZTsKKwlVSW50NjQJCQltc2VjOwkKKwkKKyNpZiBHRU5FUkFUSU5HUE9XRVJQQworCS8qIEluaXRpYWxpemUgZ2xvYmFscyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgY2FsbGVkICovCisJaWYgKCFnSW5pdGVkKSBGYXN0SW5pdGlhbGl6ZSgpOworCQorCWlmIChnTmF0aXZlKSB7CisJCS8qIFVzZSBEcml2ZXJTZXJ2aWNlcyBpZiBpdCdzIGF2YWlsYWJsZSAtLSBpdCdzIGZhc3QgYW5kIGNvbXBhdGlibGUgKi8KKwkJd2lkZSA9ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSk7CisJCW1zZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZU1TZWMgKyAwLjU7CisJCX0KKwkgIGVsc2UgaWYgKGdVcFRpbWUpIHsKKwkJLyogVXNlIERyaXZlclNlcnZpY2VzIGlmIGl0J3MgYXZhaWxhYmxlIC0tIGl0J3MgZmFzdCBhbmQgY29tcGF0aWJsZSAqLworCQl3aWRlID0gKCpnQTJOUykoKCpnVXBUaW1lKSgpKTsKKwkJbXNlYyA9IChkb3VibGUpIFdpZGVUbzY0Yml0KHdpZGUpICogZ1NjYWxlTVNlYyArIDAuNTsKKwkJfQorCSAgZWxzZSBpZiAoZ1VzZVRCUikgeworCQkvKiBPbiBhIHJlY2VudCBQb3dlclBDLCB3ZSBwb2xsIHRoZSBUQlIgZGlyZWN0bHkgKi8KKwkJd2lkZSA9IFBvbGxUQlIoKTsKKwkJbXNlYyA9IChkb3VibGUpIFdpZGVUbzY0Yml0KHdpZGUpICogZ1NjYWxlTVNlYyArIDAuNTsKKwkJfQorCSAgZWxzZSBpZiAoZ1VzZVJUQykgeworCQkvKiBPbiBhIDYwMSwgd2UgY2FuIHBvbGwgdGhlIFJUQyBpbnN0ZWFkICovCisJCXdpZGUgPSBQb2xsUlRDKCk7CisJCW1zZWMgPSAoZG91YmxlKSBSVENUb05hbm8od2lkZSkgKiBnU2NhbGVNU2VjICsgMC41OworCQl9CisJICBlbHNlIAorI2VuZGlmIC8qIEdFTkVSQVRJTkdQT1dFUlBDICovCisJCXsKKwkJLyogSWYgYWxsIGVsc2UgZmFpbHMsIHN1ZmZlciB0aGUgbWl4ZWQgbW9kZSBvdmVyaGVhZCAqLworCQlNaWNyb3NlY29uZHMoJndpZGUpOworCQltc2VjID0gKChkb3VibGUpIFdpZGVUbzY0Yml0KHdpZGUpICsgNTAwLjApIC8gMTAwMC4wOworCQl9CisKKwlyZXR1cm4obXNlYyk7CisJfQorCisvKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLworLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KKworU3RyaW5nUHRyIEZhc3RNZXRob2QoKSB7CisJU3RyaW5nUHRyCW1ldGhvZCA9ICJccDxVbmtub3duPiI7CisKKyNpZiBHRU5FUkFUSU5HUE9XRVJQQworCS8qIEluaXRpYWxpemUgZ2xvYmFscyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgY2FsbGVkICovCisJaWYgKCFnSW5pdGVkKSBGYXN0SW5pdGlhbGl6ZSgpOworCQorCWlmIChnTmF0aXZlKSB7CisJCS8qIFRoZSBUaW1lIE1hbmFnZXIgYW5kIFVwVGltZSgpIGFyZSBlbnRpcmVseSBuYXRpdmUgb24gdGhpcyBtYWNoaW5lICovCisJCW1ldGhvZCA9ICJccE5hdGl2ZSBVcFRpbWUoKSI7CisJCX0KKwkgIGVsc2UgaWYgKGdVcFRpbWUpIHsKKwkJLyogVXNlIERyaXZlclNlcnZpY2VzIGlmIGl0J3MgYXZhaWxhYmxlIC0tIGl0J3MgZmFzdCBhbmQgY29tcGF0aWJsZSAqLworCQltZXRob2QgPSAiXHBVcFRpbWUoKSI7CisJCX0KKwkgIGVsc2UgaWYgKGdVc2VUQlIpIHsKKwkJLyogT24gYSByZWNlbnQgUG93ZXJQQywgd2UgcG9sbCB0aGUgVEJSIGRpcmVjdGx5ICovCisJCW1ldGhvZCA9ICJccFBvd2VyUEMgVEJSIjsKKwkJfQorCSAgZWxzZSBpZiAoZ1VzZVJUQykgeworCQkvKiBPbiBhIDYwMSwgd2UgY2FuIHBvbGwgdGhlIFJUQyBpbnN0ZWFkICovCisJCW1ldGhvZCA9ICJccFBvd2VyUEMgUlRDIjsKKwkJfQorCSAgZWxzZSAKKyNlbmRpZiAvKiBHRU5FUkFUSU5HUE9XRVJQQyAqLworCQl7CisJCS8qIElmIGFsbCBlbHNlIGZhaWxzLCBzdWZmZXIgdGhlIG1peGVkIG1vZGUgb3ZlcmhlYWQgKi8KKwkJbWV0aG9kID0gIlxwTWljcm9zZWNvbmRzKCkiOworCQl9CisKKwlyZXR1cm4obWV0aG9kKTsKKwl9CisKKy8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCisvKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLworI3ByYWdtYSBtYXJrIC0KKworI2lmIEdFTkVSQVRJTkdQT1dFUlBDCithc20gc3RhdGljIFVuc2lnbmVkV2lkZSBQb2xsUlRDXygpIHsKK2VudHJ5IFBvbGxSVEMgLyogQXZvaWQgQ29kZVdhcnJpb3IgZ2x1ZSAqLworCW1hY2hpbmUgNjAxCitAQUdBSU46CisJbWZydGN1CXI0IC8qIFJUQ1UgPSBTUFIgNCAqLworCW1mcnRjbAlyNSAvKiBSVENMID0gU1BSIDUgKi8KKwltZnJ0Y3UJcjYKKwljbXB3CXI0LHI2CisJYm5lCQlAQUdBSU4KKwlzdHcJCXI0LDAocjMpCisJc3R3CQlyNSw0KHIzKQorCWJscgorCX0KKworLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KKy8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCisKK2FzbSBzdGF0aWMgVW5zaWduZWRXaWRlIFBvbGxUQlJfKCkgeworZW50cnkgUG9sbFRCUiAvKiBBdm9pZCBDb2RlV2FycmlvciBnbHVlICovCisJbWFjaGluZSA2MDQKK0BBR0FJTjoKKwltZnRidQlyNCAvKiBUQlJVID0gU1BSIDI2OCAqLworCW1mdGIJcjUgLyogVEJSTCA9IFNQUiAyNjkgKi8KKwltZnRidQlyNgorCWNtcHcJcjQscjYKKwlibmUJCUBBR0FJTgorCXN0dwkJcjQsMChyMykKKwlzdHcJCXI1LDQocjMpCisJYmxyCisJfQorCisvKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLworLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KKworc3RhdGljIFB0ciBGaW5kRnVuY3Rpb25JblNoYXJlZExpYihTdHJpbmdQdHIgbGliTmFtZSwgU3RyaW5nUHRyIGZ1bmNOYW1lKSB7CisJT1NFcnIJCQkJZXJyb3IgPSBub0VycjsKKwlTdHIyNTUJCQkJZXJyb3JTdHI7CisJUHRyCQkJCQlmdW5jID0gTlVMTDsKKwlQdHIJCQkJCWVudHJ5ID0gTlVMTDsKKwlDRnJhZ1N5bWJvbENsYXNzCXN5bUNsYXNzOworCUNGcmFnQ29ubmVjdGlvbklECWNvbm5JRDsKKwkKKwkvKiBGaW5kIENGTSBjb250YWluZXJzIGZvciB0aGUgY3VycmVudCBhcmNoZWN0dXJlIC0tIENGTS1QUEMgb3IgQ0ZNLTY4SyAqLworCWlmICgvKiBlcnJvciA9ICovIEdldFNoYXJlZExpYnJhcnkobGliTmFtZSwga0NvbXBpbGVkQ0ZyYWdBcmNoLAorCQkJa0xvYWRDRnJhZywgJmNvbm5JRCwgJmVudHJ5LCBlcnJvclN0cikpIHJldHVybihOVUxMKTsKKwlpZiAoLyogZXJyb3IgPSAqLyBGaW5kU3ltYm9sKGNvbm5JRCwgZnVuY05hbWUsICZmdW5jLCAmc3ltQ2xhc3MpKQorCQlyZXR1cm4oTlVMTCk7CisJCisJcmV0dXJuKGZ1bmMpOworCX0KKyNlbmRpZiAvKiBHRU5FUkFUSU5HUE9XRVJQQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9tYWNvcy9GYXN0VGltZXMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvbWFjb3MvRmFzdFRpbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1NzQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvbWFjb3MvRmFzdFRpbWVzLmgKQEAgLTAsMCArMSwyNyBAQAorLyogRmlsZSAiRmFzdFRpbWVzLmgiIC0gT3JpZ2luYWwgY29kZSBieSBNYXR0IFNsb3QgPGZwcmVmZWN0QGFtYnJvc2lhc3cuY29tPiAgKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisvKiBDcmVhdGVkIDQvMjQvOTkgICAgLSBUaGlzIGZpbGUgaXMgaGVyZWJ5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiAgICAgICAqLworLyogVXBkYXRlZCA1LzIxLzk5ICAgIC0gQ2FsaWJyYXRlIHRvIFZJQSwgYWRkIFRCUiBzdXBwb3J0LCByZW5hbWVkIGZ1bmN0aW9ucyAgKi8KKy8qIFVwZGF0ZWQgMTAvNC85OSAgICAtIFVzZSBBYnNvbHV0ZVRvTmFub3NlY29uZHMoKSBpbiBjYXNlIEFic29sdXRlID0gZG91YmxlICovCisvKiBVcGRhdGVkIDIvMTUvMDAgICAgLSBDaGVjayBmb3IgbmF0aXZlIFRpbWUgTWFuYWdlciwgbm8gbmVlZCB0byBjYWxpYnJhdGUgICAqLworLyogVXBkYXRlZCAzLzIxLzAwICAgIC0gRml4ZWQgbnMgY29udmVyc2lvbiwgY3JlYXRlIDIgZGlmZmVyZW50IHNjYWxlIGZhY3RvcnMgKi8KKy8qIFVwZGF0ZWQgNS8wMy8wMCAgICAtIEFkZGVkIGNvcHlyaWdodCBhbmQgcGxhY2VkIGludG8gUEQuIE5vIGNvZGUgY2hhbmdlcyAgICovCisKKy8qIFRoaXMgZmlsZSBpcyBDb3B5cmlnaHQgKEMpIE1hdHQgU2xvdCwgMTk5OS0yMDEyLiBJdCBpcyBoZXJlYnkgcGxhY2VkIGludG8gCisgICB0aGUgcHVibGljIGRvbWFpbi4gVGhlIGF1dGhvciBtYWtlcyBubyB3YXJyYW50eSBhcyB0byBmaXRuZXNzIG9yIHN0YWJpbGl0eSAqLworCisjaWZuZGVmIF9fRkFTVF9USU1FU19IRUFERVJfXworI2RlZmluZSBfX0ZBU1RfVElNRVNfSEVBREVSX18KKworLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KKy8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCisKK2V4dGVybiB2b2lkCQkJRmFzdEluaXRpYWxpemUodm9pZCk7CitleHRlcm4gVUludDY0CQlGYXN0TWljcm9zZWNvbmRzKHZvaWQpOworZXh0ZXJuIFVJbnQ2NAkJRmFzdE1pbGxpc2Vjb25kcyh2b2lkKTsKK2V4dGVybiBTdHJpbmdQdHIJRmFzdE1ldGhvZCh2b2lkKTsKKworLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KKy8qICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICovCisKKyNlbmRpZiAvKiBfX0ZBU1RfVElNRVNfSEVBREVSX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvbWFjb3MvU0RMX01QV3RpbWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL21hY29zL1NETF9NUFd0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNGI2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL21hY29zL1NETF9NUFd0aW1lci5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9USU1FUl9NQUNPUworCisjaW5jbHVkZSA8VHlwZXMuaD4KKyNpbmNsdWRlIDxUaW1lci5oPgorI2luY2x1ZGUgPE9TVXRpbHMuaD4KKyNpbmNsdWRlIDxHZXN0YWx0Lmg+CisjaW5jbHVkZSA8UHJvY2Vzc2VzLmg+CisKKyNpbmNsdWRlIDxMb3dNZW0uaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCisKKyNkZWZpbmUgTVNfUEVSX1RJQ0sJKDEwMDAvNjApCQkvKiBNYWNPUyB0aWNrID0gMS82MCBzZWNvbmQgKi8KKworLyogTm90ZTogVGhpcyBpcyBvbmx5IGEgc3RlcCBhYm92ZSB0aGUgb3JpZ2luYWwgMS82MHMgaW1wbGVtZW50YXRpb24uCisgKiAgICAgICBGb3IgYSBnb29kIGltcGxlbWVudGF0aW9uLCBzZWUgRmFzdFRpbWVzLltjaF0sIGJ5IE1hdHQgU2xvdC4KKyAqLworI2RlZmluZSBVU0VfTUlDUk9TRUNPTkRTCisjZGVmaW5lIFdpZGVUbzY0Yml0KHcpCSgqKFVJbnQ2NCAqKSAmKHcpKQorCitVSW50NjQgc3RhcnQ7CisKK3ZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKK3sKKyNpZmRlZiBVU0VfTUlDUk9TRUNPTkRTCisJVW5zaWduZWRXaWRlIG5vdzsKKwkKKwlNaWNyb3NlY29uZHMoJm5vdyk7CisJc3RhcnQgPSBXaWRlVG82NGJpdChub3cpOworI2Vsc2UKKwkvKiBGSVhNRTogU2hvdWxkIHdlIGltcGxlbWVudCBhIHdyYXBwaW5nIGFsZ29yaXRobSwgbGlrZSBXaW4zMj8gKi8KKyNlbmRpZgorfQorCitVaW50MzIgU0RMX0dldFRpY2tzKHZvaWQpCit7CisjaWZkZWYgVVNFX01JQ1JPU0VDT05EUworCVVuc2lnbmVkV2lkZSBub3c7CisJCisJTWljcm9zZWNvbmRzKCZub3cpOworCXJldHVybiAoVWludDMyKSgoV2lkZVRvNjRiaXQobm93KS1zdGFydCkvMTAwMCk7CisjZWxzZQorCXJldHVybihMTUdldFRpY2tzKCkqTVNfUEVSX1RJQ0spOworI2VuZGlmCit9CisKK3ZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKK3sKKyNpZmRlZiBVU0VfTUlDUk9TRUNPTkRTCisJVWludDMyIGVuZF9tczsKKwkKKwllbmRfbXMgPSBTRExfR2V0VGlja3MoKSArIG1zOworCWRvIHsKKwkJLyogRklYTUU6IFlpZWxkIENQVT8gKi8gOworCX0gd2hpbGUgKCBTRExfR2V0VGlja3MoKSA8IGVuZF9tcyApOworI2Vsc2UKKwlVSW50MzIJCXVudXNlZDsgLyogTUpTICovCisJRGVsYXkobXMvTVNfUEVSX1RJQ0ssICZ1bnVzZWQpOworI2VuZGlmCit9CisKKworLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KK3R5cGVkZWYgc3RydWN0IF9FeHRlbmRlZFRpbWVyUmVjCit7CisJVE1UYXNrCQkgICAgIHRtVGFzazsKKwlQcm9jZXNzU2VyaWFsTnVtYmVyICB0YXNrUFNOOworfSBFeHRlbmRlZFRpbWVyUmVjLCAqRXh0ZW5kZWRUaW1lclB0cjsKKworc3RhdGljIEV4dGVuZGVkVGltZXJSZWMgZ0V4dGVuZGVkVGltZXJSZWM7CisKKworaW50IFNETF9TWVNfVGltZXJJbml0KHZvaWQpCit7CisJLyogV2UgZG9uJ3QgbmVlZCBhIHNldHVwPyAqLworCXJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQoreworCS8qIFdlIGRvbid0IG5lZWQgYSBjbGVhbnVwPyAqLworCXJldHVybjsKK30KKworLyogT3VyIFN0dWIgcm91dGluZSB0byBzZXQgdXAgYW5kIHRoZW4gY2FsbCB0aGUgcmVhbCByb3V0aW5lLiAqLworcGFzY2FsIHZvaWQgVGltZXJDYWxsYmFja1Byb2MoVE1UYXNrUHRyIHRtVGFza1B0cikKK3sKKwlVaW50MzIgbXM7CisKKwlXYWtlVXBQcm9jZXNzKCYoKEV4dGVuZGVkVGltZXJQdHIpIHRtVGFza1B0ciktPnRhc2tQU04pOworCisJbXMgPSBTRExfYWxhcm1fY2FsbGJhY2soU0RMX2FsYXJtX2ludGVydmFsKTsKKwlpZiAoIG1zICkgeworCQlTRExfYWxhcm1faW50ZXJ2YWwgPSBST1VORF9SRVNPTFVUSU9OKG1zKTsKKwkJUHJpbWVUaW1lKChRRWxlbVB0cikmZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLAorCQkgICAgICAgICAgU0RMX2FsYXJtX2ludGVydmFsKTsKKwl9IGVsc2UgeworCQlTRExfYWxhcm1faW50ZXJ2YWwgPSAwOworCX0KK30KKworaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKQoreworCS8qCisJICogQ29uZmlndXJlIHRoZSBnbG9iYWwgc3RydWN0dXJlIHRoYXQgc3RvcmVzIHRoZSB0aW1pbmcgaW5mb3JtYXRpb24uCisJICovCisJZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLnFMaW5rID0gTlVMTDsKKwlnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2sucVR5cGUgPSAwOworCWdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzay50bUFkZHIgPSBOZXdUaW1lclVQUChUaW1lckNhbGxiYWNrUHJvYyk7CisJZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLnRtQ291bnQgPSAwOworCWdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzay50bVdha2VVcCA9IDA7CisJZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLnRtUmVzZXJ2ZWQgPSAwOworCUdldEN1cnJlbnRQcm9jZXNzKCZnRXh0ZW5kZWRUaW1lclJlYy50YXNrUFNOKTsKKworCS8qIEluc3RhbGwgdGhlIHRhc2sgcmVjb3JkICovCisJSW5zWFRpbWUoKFFFbGVtUHRyKSZnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2spOworCisJLyogR28hICovCisJUHJpbWVUaW1lKChRRWxlbVB0cikmZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLCBTRExfYWxhcm1faW50ZXJ2YWwpOworCXJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQoreworCVJtdlRpbWUoKFFFbGVtUHRyKSZnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2spOworfQorCisjZW5kaWYgLyogU0RMX1RJTUVSX01BQ09TICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL21hY29zL1NETF9zeXN0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9tYWNvcy9TRExfc3lzdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTgwNjNlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9tYWNvcy9TRExfc3lzdGltZXIuYwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfVElNRVJfTUFDT1MKKworI2luY2x1ZGUgPFR5cGVzLmg+CisjaW5jbHVkZSA8VGltZXIuaD4KKyNpbmNsdWRlIDxPU1V0aWxzLmg+CisjaW5jbHVkZSA8R2VzdGFsdC5oPgorI2luY2x1ZGUgPFByb2Nlc3Nlcy5oPgorCisjaW5jbHVkZSA8TG93TWVtLmg+CisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICIuLi9TRExfdGltZXJfYy5oIgorCisjaW5jbHVkZSAiRmFzdFRpbWVzLmgiCisKKyNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKyNkZWZpbmUgTmV3VGltZXJQcm9jIE5ld1RpbWVyVVBQCisjZW5kaWYKKworI2RlZmluZSBNU19QRVJfVElDSwkoMTAwMC4wLzYwLjApCQkvKiBNYWNPUyB0aWNrID0gMS82MCBzZWNvbmQgKi8KKworCisjZGVmaW5lIGtUd29Qb3dlcjMyICAgICAoNDI5NDk2NzI5Ni4wKSAgICAgICAgICAvKiAyXjMyICovCisKK3N0YXRpYyBkb3VibGUgc3RhcnRfdGljazsKK3N0YXRpYyBpbnQgICAgaXNfZmFzdF9pbml0ZWQgPSAwOworCit2b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCit7CisgICAgICAgIGlmICggISBpc19mYXN0X2luaXRlZCApICAgICAvLyBpbXBvcnRhbnQgdG8gY2hlY2sgb3IgRmFzdFRpbWUgbWF5IGhhbmcgbWFjaGluZSEKKyAgICAgICAgICAgIFNETF9TWVNfVGltZXJJbml0KCk7CisKKyAgICAgICAgc3RhcnRfdGljayA9IEZhc3RNaWNyb3NlY29uZHMoKTsKK30KKworVWludDMyIFNETF9HZXRUaWNrcyh2b2lkKQoreworICAgICAgICAKKyAgICAgICAgaWYgKCAhIGlzX2Zhc3RfaW5pdGVkICkKKyAgICAgICAgICAgIFNETF9TWVNfVGltZXJJbml0KCk7CisgICAgICAgICAKKyAgICAgICAgcmV0dXJuIEZhc3RNaWxsaXNlY29uZHMoKTsKK30KKwordm9pZCBTRExfRGVsYXkoVWludDMyIG1zKQoreworICAgICAgICBVaW50MzIgc3RvcCwgbm93OworCisgICAgICAgIHN0b3AgPSBTRExfR2V0VGlja3MoKSArIG1zOworICAgICAgICBkbyB7CisgICAgICAgICAgICAjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisgICAgICAgICAgICAgICAgTVBZaWVsZCgpOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBTeXN0ZW1UYXNrKCk7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIG5vdyA9IFNETF9HZXRUaWNrcygpOworCisgICAgICAgIH0gd2hpbGUgKCBzdG9wID4gbm93ICk7Cit9CisKKy8qCit2b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCit7CisJLy8gRklYTUU6IFNob3VsZCB3ZSBpbXBsZW1lbnQgYSB3cmFwcGluZyBhbGdvcml0aG0sIGxpa2UgV2luMzI/IAorfQorCitVaW50MzIgU0RMX0dldFRpY2tzKHZvaWQpCit7CisJVW5zaWduZWRXaWRlIG1zOworCQorCU1pY3Jvc2Vjb25kcyAoJm1zKTsKKwkKKwlyZXR1cm4gKCBtcy5sbyAvIDEwMDAgKTsKK30KKwordm9pZCBTRExfRGVsYXkoVWludDMyIG1zKQoreworCQorCVVuc2lnbmVkV2lkZSBtaWNyb3NlY3M7CisJVUludDMyICAgICAgIHN0b3A7CisJCisJTWljcm9zZWNvbmRzICgmbWljcm9zZWNzKTsKKwkKKwlzdG9wID0gbWljcm9zZWNzLmxvICsgKG1zICogMTAwMCk7CisJCisJd2hpbGUgKCBzdG9wID4gbWljcm9zZWNzLmxvICkgeworCQorCSAgIFN5c3RlbVRhc2sgKCk7CisJICAgCisJICAgTWljcm9zZWNvbmRzICgmbWljcm9zZWNzKTsKKwl9CisKK30qLworIAorLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KK3R5cGVkZWYgc3RydWN0IF9FeHRlbmRlZFRpbWVyUmVjCit7CisJVE1UYXNrCQkgICAgIHRtVGFzazsKKwlQcm9jZXNzU2VyaWFsTnVtYmVyICB0YXNrUFNOOworfSBFeHRlbmRlZFRpbWVyUmVjLCAqRXh0ZW5kZWRUaW1lclB0cjsKKworc3RhdGljIEV4dGVuZGVkVGltZXJSZWMgZ0V4dGVuZGVkVGltZXJSZWM7CisKKworaW50IFNETF9TWVNfVGltZXJJbml0KHZvaWQpCit7CisJRmFzdEluaXRpYWxpemUgKCk7CisJaXNfZmFzdF9pbml0ZWQgPSAxOworCQorCXJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQoreworCS8qIFdlIGRvbid0IG5lZWQgYSBjbGVhbnVwPyAqLworCXJldHVybjsKK30KKworLyogT3VyIFN0dWIgcm91dGluZSB0byBzZXQgdXAgYW5kIHRoZW4gY2FsbCB0aGUgcmVhbCByb3V0aW5lLiAqLworcGFzY2FsIHZvaWQgVGltZXJDYWxsYmFja1Byb2MoVE1UYXNrUHRyIHRtVGFza1B0cikKK3sKKwlVaW50MzIgbXM7CisKKwlXYWtlVXBQcm9jZXNzKCYoKEV4dGVuZGVkVGltZXJQdHIpIHRtVGFza1B0ciktPnRhc2tQU04pOworCisJbXMgPSBTRExfYWxhcm1fY2FsbGJhY2soU0RMX2FsYXJtX2ludGVydmFsKTsKKwlpZiAoIG1zICkgeworCQlTRExfYWxhcm1faW50ZXJ2YWwgPSBST1VORF9SRVNPTFVUSU9OKG1zKTsKKwkJUHJpbWVUaW1lKChRRWxlbVB0cikmZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLAorCQkgICAgICAgICAgU0RMX2FsYXJtX2ludGVydmFsKTsKKwl9IGVsc2UgeworCQlTRExfYWxhcm1faW50ZXJ2YWwgPSAwOworCX0KK30KKworaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKQoreworCS8qCisJICogQ29uZmlndXJlIHRoZSBnbG9iYWwgc3RydWN0dXJlIHRoYXQgc3RvcmVzIHRoZSB0aW1pbmcgaW5mb3JtYXRpb24uCisJICovCisJZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrLnFMaW5rID0gTlVMTDsKKwlnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2sucVR5cGUgPSAwOworCWdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzay50bUFkZHIgPSBOZXdUaW1lclByb2MoVGltZXJDYWxsYmFja1Byb2MpOworCWdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzay50bUNvdW50ID0gMDsKKwlnRXh0ZW5kZWRUaW1lclJlYy50bVRhc2sudG1XYWtlVXAgPSAwOworCWdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzay50bVJlc2VydmVkID0gMDsKKwlHZXRDdXJyZW50UHJvY2VzcygmZ0V4dGVuZGVkVGltZXJSZWMudGFza1BTTik7CisKKwkvKiBJbnN0YWxsIHRoZSB0YXNrIHJlY29yZCAqLworCUluc1hUaW1lKChRRWxlbVB0cikmZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrKTsKKworCS8qIEdvISAqLworCVByaW1lVGltZSgoUUVsZW1QdHIpJmdFeHRlbmRlZFRpbWVyUmVjLnRtVGFzaywgU0RMX2FsYXJtX2ludGVydmFsKTsKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgU0RMX1NZU19TdG9wVGltZXIodm9pZCkKK3sKKwlSbXZUaW1lKChRRWxlbVB0cikmZ0V4dGVuZGVkVGltZXJSZWMudG1UYXNrKTsKK30KKworI2VuZGlmIC8qIFNETF9USU1FUl9NQUNPUyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9taW50L1NETF9zeXN0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9taW50L1NETF9zeXN0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTdhNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL21pbnQvU0RMX3N5c3RpbWVyLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX1RJTUVSX01JTlQKKworLyoKKyAqCVRPUy9NaU5UIHRpbWVyIGRyaXZlcgorICoJYmFzZWQgb24gdmJsIHZlY3RvcgorICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8bWludC9jb29raWUuaD4KKyNpbmNsdWRlIDxtaW50L3N5c3ZhcnMuaD4KKyNpbmNsdWRlIDxtaW50L29zYmluZC5oPgorI2luY2x1ZGUgPG1pbnQvbWludGJpbmQuaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorCisjaW5jbHVkZSAiLi4vLi4vdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpc3VwZXIuaCIKKworI2luY2x1ZGUgIlNETF92Ymx0aW1lcl9zLmgiCisKKy8qIGZyb20gYXVkaW8vbWludCAqLwordm9pZCBTRExfTWludEF1ZGlvX0NoZWNrRnB1KHZvaWQpOworCisvKiBUaGUgZmlyc3QgdGlja3MgdmFsdWUgb2YgdGhlIGFwcGxpY2F0aW9uICovCitzdGF0aWMgVWludDMyIHN0YXJ0Oworc3RhdGljIFNETF9ib29sIHJlYWRfaHoyMDBfZnJvbV92YmwgPSBTRExfRkFMU0U7CitzdGF0aWMgaW50IG1pbnRfcHJlc2VudDsgLyogY2FuIHdlIHVzZSBTeWllbGQoKSA/ICovCisKK3ZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKK3sKKwl2b2lkICpvbGRfc3RhY2s7CisJbG9uZyBkdW1teTsKKworCS8qIFNldCBmaXJzdCB0aWNrcyB2YWx1ZSAqLworCW9sZF9zdGFjayA9ICh2b2lkICopU3VwZXIoMCk7CisJc3RhcnQgPSAqKCh2b2xhdGlsZSBsb25nICopX2h6XzIwMCk7CisJU3VwZXJUb1VzZXIob2xkX3N0YWNrKTsKKworCXN0YXJ0ICo9IDU7CS8qIE9uZSBfaHpfMjAwIHRpYyBpcyA1bXMgKi8KKworCW1pbnRfcHJlc2VudCA9IChHZXRjb29raWUoQ19NaU5ULCAmZHVtbXkpID09IENfRk9VTkQpOworfQorCitVaW50MzIgU0RMX0dldFRpY2tzICh2b2lkKQoreworCVVpbnQzMiBub3cgPSBzdGFydDsKKworCWlmIChyZWFkX2h6MjAwX2Zyb21fdmJsKSB7CisJCW5vdyA9IFNETF9BdGFyaV9oejIwMDsKKwl9IGVsc2UgeworCQl2b2lkICpvbGRfc3RhY2sgPSAodm9pZCAqKVN1cGVyKDApOworCQlub3cgPSAqKCh2b2xhdGlsZSBsb25nICopX2h6XzIwMCk7CisJCVN1cGVyVG9Vc2VyKG9sZF9zdGFjayk7CisJfQorCisJcmV0dXJuKChub3cqNSktc3RhcnQpOworfQorCit2b2lkIFNETF9EZWxheSAoVWludDMyIG1zKQoreworCVVpbnQzMiBub3c7CisKKwlub3cgPSBTRExfR2V0VGlja3MoKTsKKwl3aGlsZSAoKFNETF9HZXRUaWNrcygpLW5vdyk8bXMpeworCQlpZiAobWludF9wcmVzZW50KSB7CisJCQlTeWllbGQoKTsKKwkJfQorCX0KK30KKworLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KK3N0YXRpYyBTRExfYm9vbCB0aW1lcl9pbnN0YWxsZWQ9U0RMX0ZBTFNFOworCisvKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBldmVudCB0aHJlYWQgaXMgbm90IHJ1bm5pbmcgKi8KK2ludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQoreworCXZvaWQgKm9sZF9zdGFjazsKKworCVNETF9NaW50QXVkaW9fQ2hlY2tGcHUoKTsKKworCS8qIEluc3RhbGwgUnVuVGltZXIgaW4gdmJsIHZlY3RvciAqLworCW9sZF9zdGFjayA9ICh2b2lkICopU3VwZXIoMCk7CisJdGltZXJfaW5zdGFsbGVkID0gIVNETF9BdGFyaVZibEluc3RhbGwoU0RMX1RocmVhZGVkVGltZXJDaGVjayk7CisJU3VwZXJUb1VzZXIob2xkX3N0YWNrKTsKKworCWlmICghdGltZXJfaW5zdGFsbGVkKSB7CisJCXJldHVybigtMSk7CisJfQorCisJcmVhZF9oejIwMF9mcm9tX3ZibCA9IFNETF9UUlVFOworCXJldHVybihTRExfU2V0VGltZXJUaHJlYWRlZCgwKSk7Cit9CisKK3ZvaWQgU0RMX1NZU19UaW1lclF1aXQodm9pZCkKK3sKKwkvKiBVbmluc3RhbGwgUnVuVGltZXIgdmJsIHZlY3RvciAqLworCWlmICh0aW1lcl9pbnN0YWxsZWQpIHsKKwkJdm9pZCAqb2xkX3N0YWNrID0gKHZvaWQgKilTdXBlcigwKTsKKwkJU0RMX0F0YXJpVmJsVW5pbnN0YWxsKFNETF9UaHJlYWRlZFRpbWVyQ2hlY2spOworCQlTdXBlclRvVXNlcihvbGRfc3RhY2spOworCQl0aW1lcl9pbnN0YWxsZWQgPSBTRExfRkFMU0U7CisJfQorCXJlYWRfaHoyMDBfZnJvbV92YmwgPSBTRExfRkFMU0U7Cit9CisKK2ludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKK3sKKwlTRExfU2V0RXJyb3IoIkludGVybmFsIGxvZ2ljIGVycm9yOiBNaU5UIHVzZXMgdmJsIHRpbWVyIik7CisJcmV0dXJuKC0xKTsKK30KKwordm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQoreworCXJldHVybjsKK30KKworI2VuZGlmIC8qIFNETF9USU1FUl9NSU5UICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL21pbnQvU0RMX3ZibHRpbWVyLlMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL21pbnQvU0RMX3ZibHRpbWVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzN2FmYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvbWludC9TRExfdmJsdGltZXIuUwpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoKKyAqCVZCTCBxdWV1ZSByb3V0aW5lCisgKgorICoJUGF0cmljZSBNYW5kaW4KKyAqLworCisjZGVmaW5lIF92YmxfcXVldWUgMHg0NTYKKyNkZWZpbmUgX2h6XzIwMCAgICAweDRiYQorCisJLnRleHQKKworCS5nbG9ibAlfU0RMX0F0YXJpVmJsSW5zdGFsbAorCS5nbG9ibAlfU0RMX0F0YXJpVmJsVW5pbnN0YWxsCisKKwkuZ2xvYmwJX1NETF9NaW50QXVkaW9faGFzZnB1CisKKy8qLS0tIFNhdmUvcmVzdG9yZSBGUFUgY29udGV4dCAtLS0qLworCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCisjZGVmaW5lIFNBVkVfRlBVX0NPTlRFWFQgXAorCWxlYQkJc3BAKC0yMTYpLHNwOwlcCisJZnNhdmUJCXNwQDsJXAorCWZtb3ZlbAkJZnBpYXIsc3BALTsJXAorCWxlYQkJc3BAKC02NCksc3A7CVwKKwlmbW92ZW1kCWZwMC1mcDcsc3BACisKKyNkZWZpbmUgUkVTVE9SRV9GUFVfQ09OVEVYVAlcCisJZm1vdmVtZAkJc3BALGZwMC1mcDc7CVwKKwlsZWEJCXNwQCg2NCksc3A7CVwKKwlmbW92ZWwJCXNwQCssZnBpYXI7CVwKKwlmcmVzdG9yZQlzcEA7CVwKKwlsZWEJCXNwQCgyMTYpLHNwCisKKyNlbHNlCisKKyNkZWZpbmUgU0FWRV9GUFVfQ09OVEVYVAlcCisJLmNoaXAJNjhrLzY4ODgxOwlcCisJZnNhdmUJc3BALTsJXAorCWZtb3ZlbWwgZnBjci9mcHNyL2ZwaWFyLHNwQC07CVwKKwlmbW92ZW14CWZwMC1mcDcsc3BALTsJXAorCS5jaGlwCTY4aworCisjZGVmaW5lIFJFU1RPUkVfRlBVX0NPTlRFWFQJXAorCS5jaGlwCTY4ay82ODg4MTsJXAorCWZtb3ZlbXgJc3BAKyxmcDAtZnA3OwlcCisJZm1vdmVtbAlzcEArLGZwY3IvZnBzci9mcGlhcjsJXAorCWZyZXN0b3JlCXNwQCs7CVwKKwkuY2hpcAk2OGsKKworI2VuZGlmCisKKy8qLS0tIFZlY3RvciBpbnN0YWxsZXIgLS0tKi8KKworX1NETF9BdGFyaVZibEluc3RhbGw6CisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCW1vdmVsCXNwQCg0KSxkMAorCW1vdmVsCWQwLG15X3ZlY3RvcgorI2Vsc2UKKwltb3ZlbAlzcEAoNCksbXlfdmVjdG9yCisjZW5kaWYKKworCWxlYQkJX215X3ZibCxhMAorCisJY2xydwl2YmxfbXV0ZXgKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZWwJX2h6XzIwMC53LGQwCisJbW92ZWwJZDAsIF9TRExfQXRhcmlfaHoyMDAKKyNlbHNlCisJbW92ZWwJX2h6XzIwMC53LCBfU0RMX0F0YXJpX2h6MjAwCisjZW5kaWYKKworCS8qIFN0b3AgaW50ZXJydXB0cyAqLworCisJbW92ZXcJIzB4MjcwMCxzcgorCisJLyogUmVhZCB2YmxfcXVldWUgcG9pbnRlciAqLworCW1vdmVsCV92YmxfcXVldWUudyxhMQorCisJLyogU2VhcmNoIGEgZnJlZSBwbGFjZSAqLworCW1vdmVxCSM3LGQwCitiY2xfc2VhcmNoX3BsYWNlOgorCW1vdmVsCShhMSksZDEKKwliZXFzCXBsYWNlX2ZvdW5kCisJYWRkcWwJIzQsYTEKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJc3VicWwJIzEsZDAKKwlicGxzCWJjbF9zZWFyY2hfcGxhY2UKKyNlbHNlCisJZGJyYQlkMCxiY2xfc2VhcmNoX3BsYWNlCisjZW5kaWYKKworCS8qIE5vdCBmb3VuZCAqLworCW1vdmVxCSMxLGQwCisJYnJhcwlleGl0X3ZibF9xdWV1ZQorCisJLyogVGhlbiBpbnN0YWxsIG91cnNlbHZlcyAqLworcGxhY2VfZm91bmQ6CisJbW92ZWwJYTAsKGExKQorCW1vdmVxCSMwLGQwCQorCitleGl0X3ZibF9xdWV1ZToKKwkvKiBSZXN0YXJ0IGludGVycnVwdHMgKi8KKwltb3ZldwkjMHgyMzAwLHNyCisKKwlydHMKKworLyotLS0gVmVjdG9yIHVuaW5zdGFsbGVyIC0tLSovCisKK19TRExfQXRhcmlWYmxVbmluc3RhbGw6CisJbW92ZWwJc3BAKDQpLGQwCisJY21wbAlteV92ZWN0b3IsZDAKKwlibmVzCWJhZHZlY3RvcgorCQorCW1vdmVsCSNfbXlfdmJsLGQwCisKKwkvKiBTdG9wIGludGVycnVwdHMgKi8KKworCW1vdmV3CSMweDI3MDAsc3IKKworCS8qIFJlYWQgdmJsX3F1ZXVlIHBvaW50ZXIgKi8KKwltb3ZlbAlfdmJsX3F1ZXVlLncsYTEKKworCS8qIFNlYXJjaCB3aGVyZSB3ZSBhcmUgKi8KKwltb3ZlcQkjNyxkMQorYmNsMl9zZWFyY2hfcGxhY2U6CisJY21wbAkoYTEpLGQwCisJYm5lcwluZXh0X3BsYWNlCisJY2xybAkoYTEpCisJbW92ZXEJIzAsZDEKK25leHRfcGxhY2U6CisJYWRkcWwJIzQsYTEKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJc3VicWwJIzEsZDEKKwlicGxzCWJjbF9zZWFyY2hfcGxhY2UKKyNlbHNlCisJZGJyYQlkMSxiY2wyX3NlYXJjaF9wbGFjZQorI2VuZGlmCisKKwkvKiBSZXN0YXJ0IGludGVycnVwdHMgKi8KKwltb3ZldwkjMHgyMzAwLHNyCitiYWR2ZWN0b3I6CisJcnRzCisKKy8qLS0tIE91ciB2YmwgLS0tKi8KKworX215X3ZibDoKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbGVhCXNwQCgtNjApLHNwCisJbW92ZW1sCWQwLWQ3L2EwLWE2LHNwQAorI2Vsc2UKKwltb3ZlbWwJZDAtZDcvYTAtYTYsc3BALQorI2VuZGlmCisKKwkvKiBVcGRhdGUgX2h6XzIwMCAqLworI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlbAlfaHpfMjAwLncsZDAKKwltb3ZlbAlkMCwgX1NETF9BdGFyaV9oejIwMAorI2Vsc2UKKwltb3ZlbAlfaHpfMjAwLncsIF9TRExfQXRhcmlfaHoyMDAKKyNlbmRpZgorCisJLyogVmVyaWZ5IGlmIHRoaXMgaXMgbm90IGFscmVhZHkgcnVubmluZyAqLworCisJdHN0dwl2YmxfbXV0ZXgKKwlibmVzCXZibF9lbmQKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZXcJdmJsX211dGV4LGQwCisJbm90bAlkMAorCW1vdmV3CWQwLHZibF9tdXRleAorI2Vsc2UKKwlub3R3CXZibF9tdXRleAorI2VuZGlmCisKKwkvKiBTYXZlIEZQVSBpZiBuZWVkZWQgKi8KKwl0c3R3CV9TRExfTWludEF1ZGlvX2hhc2ZwdQorCWJlcXMJU0RMX0F0YXJpVmJsX25vZnB1MQorCVNBVkVfRlBVX0NPTlRFWFQKK1NETF9BdGFyaVZibF9ub2ZwdTE6CisKKwltb3ZlbAlteV92ZWN0b3IsYTAKKwlqc3IJCWEwQAorCisJLyogUmVzdG9yZSBGUFUgaWYgbmVlZGVkICovCisJdHN0dwlfU0RMX01pbnRBdWRpb19oYXNmcHUKKwliZXFzCVNETF9BdGFyaVZibF9YYmlvc19ub2ZwdTIKKwlSRVNUT1JFX0ZQVV9DT05URVhUCitTRExfQXRhcmlWYmxfWGJpb3Nfbm9mcHUyOgorCisJY2xydwl2YmxfbXV0ZXgKK3ZibF9lbmQ6CisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCW1vdmVtbAlzcEAsZDAtZDcvYTAtYTYKKwlsZWEJc3BAKDYwKSxzcAorI2Vsc2UKKwltb3ZlbWwJc3BAKyxkMC1kNy9hMC1hNgorI2VuZGlmCisJcnRzCisKKwkuZGF0YQorCS5ldmVuCisJLmNvbW0JX1NETF9BdGFyaV9oejIwMCw0KjEKKwkuZXZlbgorCS5jb21tCXZibF9tdXRleCwyKjEKKwkuZXZlbgorCS5jb21tCW15X3ZlY3Rvciw0KjEKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvbWludC9TRExfdmJsdGltZXJfcy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9taW50L1NETF92Ymx0aW1lcl9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExYzEzOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvbWludC9TRExfdmJsdGltZXJfcy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICoJVE9TL01pTlQgdGltZXIgZHJpdmVyCisgKgliYXNlZCBvbiB2YmwgdmVjdG9yCisgKgorICoJUGF0cmljZSBNYW5kaW4KKyAqLworCitleHRlcm4gdm9sYXRpbGUgbG9uZyBTRExfQXRhcmlfaHoyMDA7CisKKy8qIEZ1bmN0aW9ucyBwcm90b3R5cGVzICovCitleHRlcm4gaW50IFNETF9BdGFyaVZibEluc3RhbGwodm9pZCAqbmV3dmVjdG9yKTsKK2V4dGVybiB2b2lkIFNETF9BdGFyaVZibFVuaW5zdGFsbCh2b2lkICpuZXd2ZWN0b3IpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9uZHMvU0RMX3N5c3RpbWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL25kcy9TRExfc3lzdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjU0ZjQyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9uZHMvU0RMX3N5c3RpbWVyLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisjaW5jbHVkZSAiLi4vU0RMX3RpbWVyX2MuaCIKKworI2luY2x1ZGUgPG5kcy5oPgorCisjZGVmaW5lIHRpbWVyczJtcyh0bG93LHRoaWdoKSh0bG93IHwgKHRoaWdoPDwxNikpID4+IDUKKworCit2b2lkIFNETF9TdGFydFRpY2tzKHZvaWQpCit7CisgICBUSU1FUjBfREFUQT0wOyAKKyAgIFRJTUVSMV9EQVRBPTA7IAorICAgVElNRVIwX0NSPVRJTUVSX0VOQUJMRXxUSU1FUl9ESVZfMTAyNDsgCisgICBUSU1FUjFfQ1I9VElNRVJfRU5BQkxFfFRJTUVSX0NBU0NBREU7Cit9CisKK1VpbnQzMiBTRExfR2V0VGlja3Modm9pZCkKK3sKKwlyZXR1cm4gdGltZXJzMm1zKFRJTUVSMF9EQVRBLCBUSU1FUjFfREFUQSk7Cit9CisKK3ZvaWQgU0RMX0RlbGF5KFVpbnQzMiBtcykKK3sKKyAgIFVpbnQzMiBub3c7IAorICAgbm93PXRpbWVyczJtcyhUSU1FUjBfREFUQSwgVElNRVIxX0RBVEEpOyAKKyAgIHdoaWxlKChVaW50MzIpdGltZXJzMm1zKFRJTUVSMF9EQVRBLCBUSU1FUjFfREFUQSk8bm93K21zKTsgCisKK30KKworLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgZXZlbnQgdGhyZWFkIGlzIG5vdCBydW5uaW5nICovCitpbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQoreworfQorCitpbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCit7CisJU0RMX1NldEVycm9yKCJUaW1lcnMgbm90IGltcGxlbWVudGVkIG9uIE5EUyIpOworCXJldHVybiAtMTsKK30KKwordm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9vczIvU0RMX3N5c3RpbWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL29zMi9TRExfc3lzdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODJkNTMxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9vczIvU0RMX3N5c3RpbWVyLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX1RJTUVSX09TMgorCisjZGVmaW5lIElOQ0xfRE9TTUlTQworI2RlZmluZSBJTkNMX0RPU0VSUk9SUworI2RlZmluZSBJTkNMX0RPU1NFTUFQSE9SRVMKKyNkZWZpbmUgSU5DTF9ET1NEQVRFVElNRQorI2RlZmluZSBJTkNMX0RPU1BST0NFU1MKKyNkZWZpbmUgSU5DTF9ET1NQUk9GSUxFCisjZGVmaW5lIElOQ0xfRE9TRVhDRVBUSU9OUworI2luY2x1ZGUgPG9zMi5oPgorCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCisKKworI2RlZmluZSBUSU1FX1dSQVBfVkFMVUUgKH4oRFdPUkQpMCkKKworLyogVGhlIGZpcnN0IGhpZ2gtcmVzb2x1dGlvbiB0aWNrcyB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24gKi8KK3N0YXRpYyBsb25nIGxvbmcgaGlyZXNfc3RhcnRfdGlja3M7CisvKiBUaGUgbnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQgb2YgdGhlIGhpZ2gtcmVzb2x1dGlvbiBwZXJmb3JtYW5jZSBjb3VudGVyICovCitzdGF0aWMgVUxPTkcgaGlyZXNfdGlja3NfcGVyX3NlY29uZDsKKwordm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKQoreworICAgICAgICBEb3NUbXJRdWVyeUZyZXEoJmhpcmVzX3RpY2tzX3Blcl9zZWNvbmQpOworICAgICAgICBEb3NUbXJRdWVyeVRpbWUoKFBRV09SRCkmaGlyZXNfc3RhcnRfdGlja3MpOworfQorCitERUNMU1BFQyBVaW50MzIgU0RMQ0FMTCBTRExfR2V0VGlja3Modm9pZCkKK3sKKyAgICAgICAgbG9uZyBsb25nIGhpcmVzX25vdzsKKyAgICAgICAgVUxPTkcgdGlja3MgPSB0aWNrczsKKworICAgICAgICBEb3NUbXJRdWVyeVRpbWUoKFBRV09SRCkmaGlyZXNfbm93KTsKKy8qCisgICAgICAgIGhpcmVzX25vdyAtPSBoaXJlc19zdGFydF90aWNrczsKKyAgICAgICAgaGlyZXNfbm93ICo9IDEwMDA7CisgICAgICAgIGhpcmVzX25vdyAvPSBoaXJlc190aWNrc19wZXJfc2Vjb25kOworKi8KKyAgICAgICAgLyogaW5saW5lIGFzbSB0byBhdm9pZCBydW50aW1lIGluY2x1c2lvbiAqLworICAgICAgICBfYXNtIHsKKyAgICAgICAgICAgcHVzaCBlZHgKKyAgICAgICAgICAgcHVzaCBlYXgKKyAgICAgICAgICAgbW92IGVheCwgZHdvcmQgcHRyIGhpcmVzX25vdworICAgICAgICAgICBtb3YgZWR4LCBkd29yZCBwdHIgaGlyZXNfbm93KzQKKyAgICAgICAgICAgc3ViIGVheCwgZHdvcmQgcHRyIGhpcmVzX3N0YXJ0X3RpY2tzCisgICAgICAgICAgIHNiYiBlZHgsIGR3b3JkIHB0ciBoaXJlc19zdGFydF90aWNrcys0CisgICAgICAgICAgIG1vdiBlYngsMTAwMAorICAgICAgICAgICBtb3YgZWN4LGVkeAorICAgICAgICAgICBtdWwgZWJ4CisgICAgICAgICAgIHB1c2ggZWF4CisgICAgICAgICAgIHB1c2ggZWR4CisgICAgICAgICAgIG1vdiBlYXgsZWN4CisgICAgICAgICAgIG11bCBlYngKKyAgICAgICAgICAgcG9wIGVheAorICAgICAgICAgICBhZGQgZWR4LGVheAorICAgICAgICAgICBwb3AgZWF4CisgICAgICAgICAgIG1vdiBlYngsIGR3b3JkIHB0ciBoaXJlc190aWNrc19wZXJfc2Vjb25kCisgICAgICAgICAgIGRpdiBlYngKKyAgICAgICAgICAgbW92IGR3b3JkIHB0ciB0aWNrcywgZWF4CisgICAgICAgICAgIHBvcCBlZHgKKyAgICAgICAgICAgcG9wIGVheAorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRpY2tzOworCit9CisKKy8qIEhpZ2ggcmVzb2x1dGlvbiBzbGVlcCwgb3JpZ2luYWxseSBtYWRlIGJ5IElseWEgWmFraGFyZXZpY2ggKi8KK0RFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfRGVsYXkoVWludDMyIG1zKQoreworICAvKiBUaGlzIGlzIHNpbWlsYXIgdG8gRG9zU2xlZXAoKSwgYnV0IGhhcyA4bXMgZ3JhbnVsYXJpdHkgaW4gdGltZS1jcml0aWNhbAorICAgICB0aHJlYWRzIGV2ZW4gb24gV2FycDMuICovCisgIEhFViAgICAgaGV2RXZlbnQxICAgICA9IDA7ICAgLyogRXZlbnQgc2VtYXBob3JlIGhhbmRsZSAgICAqLworICBIVElNRVIgIGh0aW1lckV2ZW50MSAgPSAwOyAgIC8qIFRpbWVyIGhhbmRsZSAgICAgICAgICAgICAgKi8KKyAgQVBJUkVUICByYyAgICAgICAgICAgID0gTk9fRVJST1I7ICAvKiBSZXR1cm4gY29kZSAgICAgICAgICAgICAgICovCisgIGludCByZXQgPSAxOworICBVTE9ORyBwcmlvcml0eSA9IDAsIG5lc3Rpbmc7ICAgLyogU2h1dCBkb3duIHRoZSB3YXJuaW5ncyAqLworICBQUElCIHBpYjsKKyAgUFRJQiB0aWI7CisgIGNoYXIgKmUgPSBOVUxMOworICBBUElSRVQgYmFkcmM7CisgIGludCBzd2l0Y2hfcHJpb3JpdHkgPSA1MDsKKworICBEb3NDcmVhdGVFdmVudFNlbShOVUxMLCAgICAgIC8qIFVubmFtZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgJmhldkV2ZW50MSwgIC8qIEhhbmRsZSBvZiBzZW1hcGhvcmUgcmV0dXJuZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgRENfU0VNX1NIQVJFRCwgLyogU2hhcmVkIG5lZWRlZCBmb3IgRG9zQXN5bmNUaW1lciAqLworICAgICAgICAgICAgICAgICAgICBGQUxTRSk7ICAgICAgLyogU2VtYXBob3JlIGlzIGluIFJFU0VUIHN0YXRlICAqLworCisgIGlmIChtcyA+PSBzd2l0Y2hfcHJpb3JpdHkpCisgICAgc3dpdGNoX3ByaW9yaXR5ID0gMDsKKyAgaWYgKHN3aXRjaF9wcmlvcml0eSkKKyAgeworICAgIGlmIChEb3NHZXRJbmZvQmxvY2tzKCZ0aWIsICZwaWIpIT1OT19FUlJPUikKKyAgICAgIHN3aXRjaF9wcmlvcml0eSA9IDA7CisgICAgZWxzZQorICAgIHsKKyAvKiBJbiBXYXJwMywgdG8gc3dpdGNoIHNjaGVkdWxpbmcgdG8gOG1zIHN0ZXAsIG9uZSBuZWVkcyB0byBkbyAKKyAgICBEb3NBc3luY1RpbWVyKCkgaW4gdGltZS1jcml0aWNhbCB0aHJlYWQuICBPbiBsYXRlcnMgdmVyc2lvbnMsCisgICAgbW9yZSBhbmQgbW9yZSBjYXNlcyBvZiB3YWl0LWZvci1zb21ldGhpbmcgYXJlIGNvdmVyZWQuCisKKyAgICBJdCB0dXJucyBvdXQgdGhhdCBvbiBXYXJwM2ZwNDIgaXQgaXMgdGhlIHByaW9yaXR5IGF0IHRoZSB0aW1lCisgICAgb2YgRG9zQXN5bmNUaW1lcigpIHdoaWNoIG1hdHRlcnMuICBMZXQncyBob3BlIHRoYXQgdGhpcyB3b3JrcworICAgIHdpdGggbGF0ZXIgdmVyc2lvbnMgdG9vLi4uICBYWFhYCisgICovCisgICAgICBwcmlvcml0eSA9ICh0aWItPnRpYl9wdGliMi0+dGliMl91bHByaSk7CisgICAgICBpZiAoKHByaW9yaXR5ICYgMHhGRjAwKSA9PSAweDAzMDApIC8qIGFscmVhZHkgdGltZS1jcml0aWNhbCAqLworICAgICAgICBzd2l0Y2hfcHJpb3JpdHkgPSAwOworIC8qIE1ha2UgdXMgdGltZS1jcml0aWNhbC4gIEp1c3QgbW9kaWZ5aW5nIFRJQiBpcyBub3QgZW5vdWdoLi4uICovCisgLyogdGliLT50aWJfcHRpYjItPnRpYjJfdWxwcmkgPSAweDAzMDA7Ki8KKyAvKiBXZSBkbyBub3Qgd2FudCB0byBydW4gYXQgaGlnaCBwcmlvcml0eSBpZiBhIHNpZ25hbCBjYXVzZXMgdXMKKyAgICB0byBsb25nam1wKCkgb3V0IG9mIHRoaXMgc2VjdGlvbi4uLiAqLworICAgICAgaWYgKERvc0VudGVyTXVzdENvbXBsZXRlKCZuZXN0aW5nKSkKKyAgICAgICAgc3dpdGNoX3ByaW9yaXR5ID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgRG9zU2V0UHJpb3JpdHkoUFJUWVNfVEhSRUFELCBQUlRZQ19USU1FQ1JJVElDQUwsIDAsIDApOworICAgIH0KKyAgfQorCisgIGlmICgoYmFkcmMgPSBEb3NBc3luY1RpbWVyKG1zLAorICAgICAgICAoSFNFTSkgaGV2RXZlbnQxLCAvKiBTZW1hcGhvcmUgdG8gcG9zdCAgICAgICAgKi8KKyAgICAgICAgJmh0aW1lckV2ZW50MSkpKSAvKiBUaW1lciBoYW5kbGVyIChyZXR1cm5lZCkgKi8KKyAgICBlID0gIkRvc0FzeW5jVGltZXIiOworCisgIGlmIChzd2l0Y2hfcHJpb3JpdHkgJiYgdGliLT50aWJfcHRpYjItPnRpYjJfdWxwcmkgPT0gMHgwMzAwKQorICB7CisgLyogTm9ib2R5IHN3aXRjaGVkIHByaW9yaXR5IHdoaWxlIHdlIHNsZXB0Li4uICBJZ25vcmUgZXJyb3JzLi4uICovCisgLyogdGliLT50aWJfcHRpYjItPnRpYjJfdWxwcmkgPSBwcmlvcml0eTsgKi8gLyogR2V0IGJhY2suLi4gKi8KKyAgICBpZiAoIShyYyA9IERvc1NldFByaW9yaXR5KFBSVFlTX1RIUkVBRCwgKHByaW9yaXR5Pj44KSAmIDB4RkYsIDAsIDApKSkKKyAgICAgIHJjID0gRG9zU2V0UHJpb3JpdHkoUFJUWVNfVEhSRUFELCAwLCBwcmlvcml0eSAmIDB4RkYsIDApOworICB9CisgIGlmIChzd2l0Y2hfcHJpb3JpdHkpCisgICAgcmMgPSBEb3NFeGl0TXVzdENvbXBsZXRlKCZuZXN0aW5nKTsgLyogSWdub3JlIGVycm9ycyAqLworCisgIC8qIFRoZSBhY3R1YWwgYmxvY2tpbmcgY2FsbCBpcyBtYWRlIHdpdGggIm5vcm1hbCIgcHJpb3JpdHkuICBUaGlzIHdheSB3ZQorICAgICBzaG91bGQgbm90IGJvdGhlciB3aXRoIERvc1NsZWVwKDApIGV0Yy4gdG8gY29tcGVuc2F0ZSBmb3IgdXMgaW50ZXJydXB0aW5nCisgICAgIGhpZ2hlci1wcmlvcml0eSB0aHJlYWRzLiAgVGhlIGdvYWwgaXMgdG8gcHJvaGliaXQgdGhlIHN5c3RlbSBzcGVuZGluZyB0b28KKyAgICAgbXVjaCB0aW1lIGhhbHQoKWluZywgbm90IHRvIHJ1biB1cyAibm8gbWF0dGVyIHdoYXQiLiAqLworICBpZiAoIWUpICAgICAvKiBXYWl0IGZvciBBc3luY1RpbWVyIGV2ZW50ICovCisgICAgYmFkcmMgPSBEb3NXYWl0RXZlbnRTZW0oaGV2RXZlbnQxLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKKworICBpZiAoZSkgOyAgICAvKiBEbyBub3RoaW5nICovCisgIGVsc2UgaWYgKGJhZHJjID09IEVSUk9SX0lOVEVSUlVQVCkKKyAgICByZXQgPSAwOworICBlbHNlIGlmIChiYWRyYykKKyAgICBlID0gIkRvc1dhaXRFdmVudFNlbSI7CisgIGlmICgocmMgPSBEb3NDbG9zZUV2ZW50U2VtKGhldkV2ZW50MSkpICYmICFlKSB7IC8qIEdldCByaWQgb2Ygc2VtYXBob3JlICovCisgICAgZSA9ICJEb3NDbG9zZUV2ZW50U2VtIjsKKyAgICBiYWRyYyA9IHJjOworICB9CisgIGlmIChlKQorICB7CisgICAgU0RMX1NldEVycm9yKCJbU0RMX0RlbGF5XSA6IEhhZCBlcnJvciBpbiAlcygpLCByYyBpcyAweCV4XG4iLCBlLCBiYWRyYyk7CisgIH0KK30KKworLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KK3N0YXRpYyBpbnQgdGltZXJfYWxpdmUgPSAwOworc3RhdGljIFNETF9UaHJlYWQgKnRpbWVyID0gTlVMTDsKKworc3RhdGljIGludCBTRExDQUxMIFJ1blRpbWVyKHZvaWQgKnVudXNlZCkKK3sKKyAgICAgICAgRG9zU2V0UHJpb3JpdHkoUFJUWVNfVEhSRUFELCBQUlRZQ19USU1FQ1JJVElDQUwsIDAsIDApOworICAgICAgICB3aGlsZSAoIHRpbWVyX2FsaXZlICkgeworICAgICAgICAgICAgICAgIGlmICggU0RMX3RpbWVyX3J1bm5pbmcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTRExfVGhyZWFkZWRUaW1lckNoZWNrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNETF9EZWxheSgxMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKDApOworfQorCisvKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBldmVudCB0aHJlYWQgaXMgbm90IHJ1bm5pbmcgKi8KK2ludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQoreworICAgICAgICB0aW1lcl9hbGl2ZSA9IDE7CisgICAgICAgIHRpbWVyID0gU0RMX0NyZWF0ZVRocmVhZChSdW5UaW1lciwgTlVMTCk7CisgICAgICAgIGlmICggdGltZXIgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKK30KKwordm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQoreworICAgICAgICB0aW1lcl9hbGl2ZSA9IDA7CisgICAgICAgIGlmICggdGltZXIgKSB7CisgICAgICAgICAgICAgICAgU0RMX1dhaXRUaHJlYWQodGltZXIsIE5VTEwpOworICAgICAgICAgICAgICAgIHRpbWVyID0gTlVMTDsKKyAgICAgICAgfQorfQorCitpbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCit7CisgICAgICAgIFNETF9TZXRFcnJvcigiSW50ZXJuYWwgbG9naWMgZXJyb3I6IE9TLzIgdXNlcyB0aHJlYWRlZCB0aW1lciIpOworICAgICAgICByZXR1cm4oLTEpOworfQorCit2b2lkIFNETF9TWVNfU3RvcFRpbWVyKHZvaWQpCit7CisgICAgICAgIHJldHVybjsKK30KKworI2VuZGlmIC8qIFNETF9USU1FUl9PUzIgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvcmlzY29zL1NETF9zeXN0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9yaXNjb3MvU0RMX3N5c3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViYTY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvcmlzY29zL1NETF9zeXN0aW1lci5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9USU1FUl9SSVNDT1MKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIi4uL1NETF90aW1lcl9jLmgiCisKKyNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAorLyogVGltZXIgIFNETF9hcnJheXNpemUoVGltZXIgKSxzdGFydC9yZXNldCB0aW1lICovCitzdGF0aWMgVWludDMyIHRpbWVyU3RhcnQ7CisvKiBUaW1lciBydW5uaW5nIGZ1bmN0aW9uICovCit2b2lkIFJJU0NPU19DaGVja1RpbWVyKCk7CisjZWxzZQorI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2V4dGVybiBVaW50MzIgcmlzY29zX21haW5fdGhyZWFkOworZXh0ZXJuIGludCByaXNjb3NfdXNpbmdfdGhyZWFkczsKK2V4dGVybiBVaW50MzIgU0RMX1RocmVhZElEKCk7CitleHRlcm4gVWludDMyIFNETF9FdmVudFRocmVhZElEKHZvaWQpOworI2VuZGlmCisKKworZXh0ZXJuIHZvaWQgUklTQ09TX0JhY2tncm91bmRUYXNrcyh2b2lkKTsKKworLyogVGhlIGZpcnN0IHRpY2tzIHZhbHVlIG9mIHRoZSBhcHBsaWNhdGlvbiAqLworY2xvY2tfdCBzdGFydDsKKwordm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKQoreworCS8qIFNldCBmaXJzdCB0aWNrcyB2YWx1ZSAqLworCXN0YXJ0ID0gY2xvY2soKTsKK30KKworVWludDMyIFNETF9HZXRUaWNrcyAodm9pZCkKK3sKKwljbG9ja190IHRpY2tzOworCisJdGlja3M9Y2xvY2soKS1zdGFydDsKKworCisjaWYgQ0xPQ0tTX1BFUl9TRUMgPT0gMTAwMAorCisJcmV0dXJuKHRpY2tzKTsKKworI2VsaWYgQ0xPQ0tTX1BFUl9TRUMgPT0gMTAwCisKKwlyZXR1cm4gKHRpY2tzICogMTApOworCisjZWxzZQorCisJcmV0dXJuIHRpY2tzKigxMDAwL0NMT0NLU19QRVJfU0VDKTsKKworI2VuZGlmCisKK30KKwordm9pZCBTRExfRGVsYXkgKFVpbnQzMiBtcykKK3sKKyAgICBVaW50MzIgbm93LHRoZW4sZWxhcHNlZDsKKyNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKKyAgICBpbnQgaXNfZXZlbnRfdGhyZWFkOworICAgIGlmIChyaXNjb3NfdXNpbmdfdGhyZWFkcykKKyAgICB7CisgICAgICAgaXNfZXZlbnRfdGhyZWFkID0gMDsKKyAgICAgICBpZiAoU0RMX0V2ZW50VGhyZWFkSUQoKSkKKyAgICAgICB7CisgICAgICAgICAgaWYgKFNETF9FdmVudFRocmVhZElEKCkgPT0gU0RMX1RocmVhZElEKCkpIGlzX2V2ZW50X3RocmVhZCA9IDE7CisgICAgICAgfSBlbHNlIGlmIChTRExfVGhyZWFkSUQoKSA9PSByaXNjb3NfbWFpbl90aHJlYWQpIGlzX2V2ZW50X3RocmVhZCA9IDE7CisgICAgfSBlbHNlIGlzX2V2ZW50X3RocmVhZCA9IDE7CisjZW5kaWYKKworICAgICAgICAvKlRPRE86IE5leHQgdmVyc2lvbiBvZiBVbml4bGliIG1heSBhbGxvdyB1cyB0byB1c2UgdXNsZWVwIGhlcmUgKi8KKyAgICAgICAgLyogICAgICBmb3Igbm9uIGV2ZW50IHRocmVhZHMgKi8KKworCS8qIFNldCB0aGUgdGltZW91dCBpbnRlcnZhbCAtIExpbnV4IG9ubHkgbmVlZHMgdG8gZG8gdGhpcyBvbmNlICovCisJdGhlbiA9IFNETF9HZXRUaWNrcygpOworCisJZG8geworCQkvKiBEbyBiYWNrZ3JvdW5kIHRhc2tzIHJlcXVpcmVkIHdoaWxlIHNsZWVwaW5nIGFzIHdlIGFyZSBub3QgbXVsdGl0aHJlYWRlZCAqLworI2lmIFNETF9USFJFQURTX0RJU0FCTEVECisJCVJJU0NPU19CYWNrZ3JvdW5kVGFza3MoKTsKKyNlbHNlCisJCS8qIEZvciB0aHJlYWRlZCBidWlsZCBvbmx5IHJ1biBiYWNrZ3JvdW5kIHRhc2tzIGluIGV2ZW50IHRocmVhZCAqLworCQlpZiAoaXNfZXZlbnRfdGhyZWFkKSBSSVNDT1NfQmFja2dyb3VuZFRhc2tzKCk7CisjZW5kaWYKKworCQkvKiBDYWxjdWxhdGUgdGhlIHRpbWUgaW50ZXJ2YWwgbGVmdCAoaW4gY2FzZSBvZiBpbnRlcnJ1cHQpICovCisJCW5vdyA9IFNETF9HZXRUaWNrcygpOworCQllbGFwc2VkID0gKG5vdy10aGVuKTsKKwkJdGhlbiA9IG5vdzsKKwkJaWYgKCBlbGFwc2VkID49IG1zICkgeworCQkJYnJlYWs7CisJCX0KKwkJbXMgLT0gZWxhcHNlZDsKKyNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKKyAgICAgICAgICAgIC8qIE5lZWQgdG8geWllbGQgdG8gbGV0IG90aGVyIHRocmVhZHMgaGF2ZSBhIGdvICovCisgICAgICAgICAgICBpZiAocmlzY29zX3VzaW5nX3RocmVhZHMpIHB0aHJlYWRfeWllbGQoKTsKKyNlbmRpZgorCisJfSB3aGlsZSAoIDEgKTsKK30KKworI2lmIFNETF9USFJFQURTX0RJU0FCTEVECisKKy8qIE5vbi10aHJlYWRlZCB2ZXJzaW9uIG9mIHRpbWVyICovCisKK2ludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQoreworCXJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQoreworCVNETF9TZXRUaW1lcigwLCBOVUxMKTsKK30KKworaW50IFNETF9TWVNfU3RhcnRUaW1lcih2b2lkKQoreworCXRpbWVyU3RhcnQgPSBTRExfR2V0VGlja3MoKTsKKworCXJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQoreworCS8qIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgd2UgdXNlIFNETF90aW1lcl9ydW5uaW5nCisJICAgdG8gZGV0ZWN0IGlmIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHRpbWVyICovCit9CisKKwordm9pZCBSSVNDT1NfQ2hlY2tUaW1lcigpCit7CisJaWYgKFNETF90aW1lcl9ydW5uaW5nICYmIFNETF9HZXRUaWNrcygpIC0gdGltZXJTdGFydCA+PSBTRExfYWxhcm1faW50ZXJ2YWwpCisJeworCQlVaW50MzIgbXM7CisKKwkJbXMgPSBTRExfYWxhcm1fY2FsbGJhY2soU0RMX2FsYXJtX2ludGVydmFsKTsKKwkJaWYgKCBtcyAhPSBTRExfYWxhcm1faW50ZXJ2YWwgKQorCQl7CisJCQlpZiAoIG1zICkKKwkJCXsKKwkJCQlTRExfYWxhcm1faW50ZXJ2YWwgPSBST1VORF9SRVNPTFVUSU9OKG1zKTsKKwkJCX0gZWxzZQorCQkJeworCQkJCVNETF9hbGFybV9pbnRlcnZhbCA9IDA7CisJCQkJU0RMX3RpbWVyX3J1bm5pbmcgPSAwOworCQkJfQorCQl9CisJCWlmIChTRExfYWxhcm1faW50ZXJ2YWwpIHRpbWVyU3RhcnQgPSBTRExfR2V0VGlja3MoKTsKKwl9Cit9CisKKyNlbHNlCisKKy8qIFRocmVhZGVkIHZlcnNpb24gb2YgdGltZXIgLSBiYXNlZCBvbiBjb2RlIGZvciBsaW51eCAqLworCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorCisvKiBEYXRhIHRvIGhhbmRsZSBhIHNpbmdsZSBwZXJpb2RpYyBhbGFybSAqLworc3RhdGljIGludCB0aW1lcl9hbGl2ZSA9IDA7CitzdGF0aWMgU0RMX1RocmVhZCAqdGltZXIgPSBOVUxMOworCitzdGF0aWMgaW50IFJ1blRpbWVyKHZvaWQgKnVudXNlZCkKK3sKKwl3aGlsZSAoIHRpbWVyX2FsaXZlICkgeworCQlpZiAoIFNETF90aW1lcl9ydW5uaW5nICkgeworCQkJU0RMX1RocmVhZGVkVGltZXJDaGVjaygpOworCQl9CisJCVNETF9EZWxheSgxKTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBldmVudCB0aHJlYWQgaXMgbm90IHJ1bm5pbmcgKi8KK2ludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQoreworCXRpbWVyX2FsaXZlID0gMTsKKwl0aW1lciA9IFNETF9DcmVhdGVUaHJlYWQoUnVuVGltZXIsIE5VTEwpOworCWlmICggdGltZXIgPT0gTlVMTCApCisJCXJldHVybigtMSk7CisJcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKK30KKwordm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQoreworCXRpbWVyX2FsaXZlID0gMDsKKwlpZiAoIHRpbWVyICkgeworCQlTRExfV2FpdFRocmVhZCh0aW1lciwgTlVMTCk7CisJCXRpbWVyID0gTlVMTDsKKwl9Cit9CisKK2ludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKK3sKKwlTRExfU2V0RXJyb3IoIkludGVybmFsIGxvZ2ljIGVycm9yOiBSSVNDIE9TIHVzZXMgdGhyZWFkZWQgdGltZXIiKTsKKwlyZXR1cm4oLTEpOworfQorCit2b2lkIFNETF9TWVNfU3RvcFRpbWVyKHZvaWQpCit7CisJcmV0dXJuOworfQorCisjZW5kaWYgLyogU0RMX1RIUkVBRFNfRElTQUJMRUQgKi8KKworI2VuZGlmIC8qIFNETF9USU1FUl9SSVNDT1MgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvc3ltYmlhbi9TRExfc3lzdGltZXIuY3BwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci9zeW1iaWFuL1NETF9zeXN0aW1lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViYjc0OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvc3ltYmlhbi9TRExfc3lzdGltZXIuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBkZXZvbHV0aW9uLmNvbQorKi8KKworLyoKKyAgICBTRExfc3lzdGltZXIuY3BwCisKKyAgICBFcG9jIHZlcnNpb24gYnkgSGFubnUgVmlpdGFsYSAoaGFubnUuai52aWl0YWxhQG1ibmV0LmZpKSAKKyAgICBNYXJrdXMgTWVydGFtYQorKi8KKworI2luY2x1ZGUgPGUzMnN0ZC5oPgorI2luY2x1ZGUgPGUzMmhhbC5oPgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJTRExfZXJyb3IuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyX2MuaCIKKworc3RhdGljIFRVaW50IHN0YXJ0ID0gMDsKK3N0YXRpYyBUSW50IHRpY2tQZXJpb2RNaWxsaVNlY29uZHM7CisKKwordm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKQorCXsKKwkvKiBTZXQgZmlyc3QgdGlja3MgdmFsdWUgKi8KKyAgICBzdGFydCA9IFVzZXI6OlRpY2tDb3VudCgpOworCisgICAgVFRpbWVJbnRlcnZhbE1pY3JvU2Vjb25kczMyIHBlcmlvZDsKKwlUSW50IHRtcCA9IFVzZXJIYWw6OlRpY2tQZXJpb2QocGVyaW9kKTsKKyAgICB0aWNrUGVyaW9kTWlsbGlTZWNvbmRzID0gcGVyaW9kLkludCgpIC8gMTAwMDsKKwl9CisKK1VpbnQzMiBTRExfR2V0VGlja3Modm9pZCkKKwl7CisgICAgVFVpbnQgZGVsdGFUaWNzID0gVXNlcjo6VGlja0NvdW50KCkgLSBzdGFydDsKKwlyZXR1cm4oZGVsdGFUaWNzICogdGlja1BlcmlvZE1pbGxpU2Vjb25kcyk7IAorCX0KKwordm9pZCBTRExfRGVsYXkoVWludDMyIG1zKQorCXsgICAgIAorICAgIFVzZXI6OkFmdGVyKFRUaW1lSW50ZXJ2YWxNaWNyb1NlY29uZHMzMihtcyoxMDAwKSk7CisJfQorCisvKiBEYXRhIHRvIGhhbmRsZSBhIHNpbmdsZSBwZXJpb2RpYyBhbGFybSAqLworc3RhdGljIGludCB0aW1lcl9hbGl2ZSA9IDA7CitzdGF0aWMgU0RMX1RocmVhZCAqdGltZXIgPSBOVUxMOworCitzdGF0aWMgaW50IFJ1blRpbWVyKHZvaWQgKnVudXNlZCkKKwl7CisJd2hpbGUgKCB0aW1lcl9hbGl2ZSApCisJCXsKKwkJaWYgKFNETF90aW1lcl9ydW5uaW5nKQorCQkJeworCQkJU0RMX1RocmVhZGVkVGltZXJDaGVjaygpOworCQkJfQorCQlTRExfRGVsYXkoMTApOworCQl9CisJcmV0dXJuKDApOworCX0KKworLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgZXZlbnQgdGhyZWFkIGlzIG5vdCBydW5uaW5nICovCitpbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKKwl7CisJaWYodGltZXIgIT0gTlVMTCkKKwkJcmV0dXJuICgtMSk7CisJdGltZXJfYWxpdmUgPSAxOworCXRpbWVyID0gU0RMX0NyZWF0ZVRocmVhZChSdW5UaW1lciwgTlVMTCk7CisJaWYgKCB0aW1lciA9PSBOVUxMICkKKwkJcmV0dXJuKC0xKTsKKwlyZXR1cm4oU0RMX1NldFRpbWVyVGhyZWFkZWQoMSkpOworCX0KKwordm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQorCXsKKwl0aW1lcl9hbGl2ZSA9IDA7CisJaWYgKCB0aW1lciApIAorCQl7CisJCVNETF9XYWl0VGhyZWFkKHRpbWVyLCBOVUxMKTsKKwkJdGltZXIgPSBOVUxMOworCQl9CisJfQorCitpbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCisJeworCVNETF9TZXRFcnJvcigiSW50ZXJuYWwgbG9naWMgZXJyb3I6IEVwb2MgdXNlcyB0aHJlYWRlZCB0aW1lciIpOworCXJldHVybigtMSk7CisJfQorCit2b2lkIFNETF9TWVNfU3RvcFRpbWVyKHZvaWQpCisJeworCXJldHVybjsKKwl9CisKK30gLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci91bml4L1NETF9zeXN0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci91bml4L1NETF9zeXN0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYjIyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL3VuaXgvU0RMX3N5c3RpbWVyLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZkZWYgU0RMX1RJTUVSX1VOSVgKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiLi4vU0RMX3RpbWVyX2MuaCIKKworLyogVGhlIGNsb2NrX2dldHRpbWUgcHJvdmlkZXMgbW9ub3Rvbm91cyB0aW1lLCBzbyB3ZSBzaG91bGQgdXNlIGl0IGlmCisgICBpdCdzIGF2YWlsYWJsZS4gVGhlIGNsb2NrX2dldHRpbWUgZnVuY3Rpb24gaXMgYmVoaW5kIGlmZGVmCisgICBmb3IgX19VU0VfUE9TSVgxOTkzMDkKKyAgIFRvbW1pIEt5bnRvbGEgKHRvbW1pLmt5bnRvbGFAcmF5LmZpKSAyNy8wOS8yMDA1CisqLworI2lmIEhBVkVfTkFOT1NMRUVQIHx8IEhBVkVfQ0xPQ0tfR0VUVElNRQorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisjaWYgU0RMX1RIUkVBRF9QVEgKKyNpbmNsdWRlIDxwdGguaD4KKyNlbmRpZgorCisjaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKKyNkZWZpbmUgVVNFX0lUSU1FUgorI2VuZGlmCisKKy8qIFRoZSBmaXJzdCB0aWNrcyB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24gKi8KKyNpZmRlZiBIQVZFX0NMT0NLX0dFVFRJTUUKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgc3RhcnQ7CisjZWxzZQorc3RhdGljIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OworI2VuZGlmIC8qIEhBVkVfQ0xPQ0tfR0VUVElNRSAqLworCisKK3ZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKK3sKKwkvKiBTZXQgZmlyc3QgdGlja3MgdmFsdWUgKi8KKyNpZiBIQVZFX0NMT0NLX0dFVFRJTUUKKwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywmc3RhcnQpOworI2Vsc2UKKwlnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKyNlbmRpZgorfQorCitVaW50MzIgU0RMX0dldFRpY2tzICh2b2lkKQoreworI2lmIEhBVkVfQ0xPQ0tfR0VUVElNRQorCVVpbnQzMiB0aWNrczsKKwlzdHJ1Y3QgdGltZXNwZWMgbm93OworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCZub3cpOworCXRpY2tzPShub3cudHZfc2VjLXN0YXJ0LnR2X3NlYykqMTAwMCsobm93LnR2X25zZWMtc3RhcnQudHZfbnNlYykvMTAwMDAwMDsKKwlyZXR1cm4odGlja3MpOworI2Vsc2UKKwlVaW50MzIgdGlja3M7CisJc3RydWN0IHRpbWV2YWwgbm93OworCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKwl0aWNrcz0obm93LnR2X3NlYy1zdGFydC50dl9zZWMpKjEwMDArKG5vdy50dl91c2VjLXN0YXJ0LnR2X3VzZWMpLzEwMDA7CisJcmV0dXJuKHRpY2tzKTsKKyNlbmRpZgorfQorCit2b2lkIFNETF9EZWxheSAoVWludDMyIG1zKQoreworI2lmIFNETF9USFJFQURfUFRICisJcHRoX3RpbWVfdCB0djsKKwl0di50dl9zZWMgID0gIG1zLzEwMDA7CisJdHYudHZfdXNlYyA9IChtcyUxMDAwKSoxMDAwOworCXB0aF9uYXAodHYpOworI2Vsc2UKKwlpbnQgd2FzX2Vycm9yOworCisjaWYgSEFWRV9OQU5PU0xFRVAKKwlzdHJ1Y3QgdGltZXNwZWMgZWxhcHNlZCwgdHY7CisjZWxzZQorCXN0cnVjdCB0aW1ldmFsIHR2OworCVVpbnQzMiB0aGVuLCBub3csIGVsYXBzZWQ7CisjZW5kaWYKKworCS8qIFNldCB0aGUgdGltZW91dCBpbnRlcnZhbCAqLworI2lmIEhBVkVfTkFOT1NMRUVQCisJZWxhcHNlZC50dl9zZWMgPSBtcy8xMDAwOworCWVsYXBzZWQudHZfbnNlYyA9IChtcyUxMDAwKSoxMDAwMDAwOworI2Vsc2UKKwl0aGVuID0gU0RMX0dldFRpY2tzKCk7CisjZW5kaWYKKwlkbyB7CisJCWVycm5vID0gMDsKKworI2lmIEhBVkVfTkFOT1NMRUVQCisJCXR2LnR2X3NlYyA9IGVsYXBzZWQudHZfc2VjOworCQl0di50dl9uc2VjID0gZWxhcHNlZC50dl9uc2VjOworCQl3YXNfZXJyb3IgPSBuYW5vc2xlZXAoJnR2LCAmZWxhcHNlZCk7CisjZWxzZQorCQkvKiBDYWxjdWxhdGUgdGhlIHRpbWUgaW50ZXJ2YWwgbGVmdCAoaW4gY2FzZSBvZiBpbnRlcnJ1cHQpICovCisJCW5vdyA9IFNETF9HZXRUaWNrcygpOworCQllbGFwc2VkID0gKG5vdy10aGVuKTsKKwkJdGhlbiA9IG5vdzsKKwkJaWYgKCBlbGFwc2VkID49IG1zICkgeworCQkJYnJlYWs7CisJCX0KKwkJbXMgLT0gZWxhcHNlZDsKKwkJdHYudHZfc2VjID0gbXMvMTAwMDsKKwkJdHYudHZfdXNlYyA9IChtcyUxMDAwKSoxMDAwOworCisJCXdhc19lcnJvciA9IHNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOworI2VuZGlmIC8qIEhBVkVfTkFOT1NMRUVQICovCisJfSB3aGlsZSAoIHdhc19lcnJvciAmJiAoZXJybm8gPT0gRUlOVFIpICk7CisjZW5kaWYgLyogU0RMX1RIUkVBRF9QVEggKi8KK30KKworI2lmZGVmIFVTRV9JVElNRVIKKworc3RhdGljIHZvaWQgSGFuZGxlQWxhcm0oaW50IHNpZykKK3sKKwlVaW50MzIgbXM7CisKKwlpZiAoIFNETF9hbGFybV9jYWxsYmFjayApIHsKKwkJbXMgPSAoKlNETF9hbGFybV9jYWxsYmFjaykoU0RMX2FsYXJtX2ludGVydmFsKTsKKwkJaWYgKCBtcyAhPSBTRExfYWxhcm1faW50ZXJ2YWwgKSB7CisJCQlTRExfU2V0VGltZXIobXMsIFNETF9hbGFybV9jYWxsYmFjayk7CisJCX0KKwl9Cit9CisKK2ludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQoreworCXN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOworCisJLyogU2V0IHRoZSBhbGFybSBoYW5kbGVyIChMaW51eCBzcGVjaWZpYykgKi8KKwlTRExfbWVtc2V0KCZhY3Rpb24sIDAsIHNpemVvZihhY3Rpb24pKTsKKwlhY3Rpb24uc2FfaGFuZGxlciA9IEhhbmRsZUFsYXJtOworCWFjdGlvbi5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7CisJc2lnZW1wdHlzZXQoJmFjdGlvbi5zYV9tYXNrKTsKKwlzaWdhY3Rpb24oU0lHQUxSTSwgJmFjdGlvbiwgTlVMTCk7CisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9TWVNfVGltZXJRdWl0KHZvaWQpCit7CisJU0RMX1NldFRpbWVyKDAsIE5VTEwpOworfQorCitpbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCit7CisJc3RydWN0IGl0aW1lcnZhbCB0aW1lcjsKKworCXRpbWVyLml0X3ZhbHVlLnR2X3NlYyA9IChTRExfYWxhcm1faW50ZXJ2YWwvMTAwMCk7CisJdGltZXIuaXRfdmFsdWUudHZfdXNlYyA9IChTRExfYWxhcm1faW50ZXJ2YWwlMTAwMCkqMTAwMDsKKwl0aW1lci5pdF9pbnRlcnZhbC50dl9zZWMgPSAoU0RMX2FsYXJtX2ludGVydmFsLzEwMDApOworCXRpbWVyLml0X2ludGVydmFsLnR2X3VzZWMgPSAoU0RMX2FsYXJtX2ludGVydmFsJTEwMDApKjEwMDA7CisJc2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmdGltZXIsIE5VTEwpOworCXJldHVybigwKTsKK30KKwordm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQoreworCXN0cnVjdCBpdGltZXJ2YWwgdGltZXI7CisKKwlTRExfbWVtc2V0KCZ0aW1lciwgMCwgKHNpemVvZiB0aW1lcikpOworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnRpbWVyLCBOVUxMKTsKK30KKworI2Vsc2UgLyogVVNFX0lUSU1FUiAqLworCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorCisvKiBEYXRhIHRvIGhhbmRsZSBhIHNpbmdsZSBwZXJpb2RpYyBhbGFybSAqLworc3RhdGljIGludCB0aW1lcl9hbGl2ZSA9IDA7CitzdGF0aWMgU0RMX1RocmVhZCAqdGltZXIgPSBOVUxMOworCitzdGF0aWMgaW50IFJ1blRpbWVyKHZvaWQgKnVudXNlZCkKK3sKKwl3aGlsZSAoIHRpbWVyX2FsaXZlICkgeworCQlpZiAoIFNETF90aW1lcl9ydW5uaW5nICkgeworCQkJU0RMX1RocmVhZGVkVGltZXJDaGVjaygpOworCQl9CisJCVNETF9EZWxheSgxKTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBldmVudCB0aHJlYWQgaXMgbm90IHJ1bm5pbmcgKi8KK2ludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQoreworCXRpbWVyX2FsaXZlID0gMTsKKwl0aW1lciA9IFNETF9DcmVhdGVUaHJlYWQoUnVuVGltZXIsIE5VTEwpOworCWlmICggdGltZXIgPT0gTlVMTCApCisJCXJldHVybigtMSk7CisJcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKK30KKwordm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQoreworCXRpbWVyX2FsaXZlID0gMDsKKwlpZiAoIHRpbWVyICkgeworCQlTRExfV2FpdFRocmVhZCh0aW1lciwgTlVMTCk7CisJCXRpbWVyID0gTlVMTDsKKwl9Cit9CisKK2ludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKK3sKKwlTRExfU2V0RXJyb3IoIkludGVybmFsIGxvZ2ljIGVycm9yOiBMaW51eCB1c2VzIHRocmVhZGVkIHRpbWVyIik7CisJcmV0dXJuKC0xKTsKK30KKwordm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQoreworCXJldHVybjsKK30KKworI2VuZGlmIC8qIFVTRV9JVElNRVIgKi8KKworI2VuZGlmIC8qIFNETF9USU1FUl9VTklYICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL3dpbjMyL1NETF9zeXN0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci93aW4zMi9TRExfc3lzdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI1ZTJlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy90aW1lci93aW4zMi9TRExfc3lzdGltZXIuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZmRlZiBTRExfVElNRVJfV0lOMzIKKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG1tc3lzdGVtLmg+CisKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICIuLi9TRExfdGltZXJfYy5oIgorCisjaWZkZWYgX1dJTjMyX1dDRQorICAjZXJyb3IgVGhpcyBpcyBXaW5DRS4gUGxlYXNlIHVzZSBzcmMvdGltZXIvd2luY2UvU0RMX3N5c3RpbWVyLmMgaW5zdGVhZC4KKyNlbmRpZgorCisjZGVmaW5lIFRJTUVfV1JBUF9WQUxVRQkofihEV09SRCkwKQorCisvKiBUaGUgZmlyc3QgKGxvdy1yZXNvbHV0aW9uKSB0aWNrcyB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24gKi8KK3N0YXRpYyBEV09SRCBzdGFydDsKKworI2lmbmRlZiBVU0VfR0VUVElDS0NPVU5UCisvKiBTdG9yZSBpZiBhIGhpZ2gtcmVzb2x1dGlvbiBwZXJmb3JtYW5jZSBjb3VudGVyIGV4aXN0cyBvbiB0aGUgc3lzdGVtICovCitzdGF0aWMgQk9PTCBoaXJlc190aW1lcl9hdmFpbGFibGU7CisvKiBUaGUgZmlyc3QgaGlnaC1yZXNvbHV0aW9uIHRpY2tzIHZhbHVlIG9mIHRoZSBhcHBsaWNhdGlvbiAqLworc3RhdGljIExBUkdFX0lOVEVHRVIgaGlyZXNfc3RhcnRfdGlja3M7CisvKiBUaGUgbnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQgb2YgdGhlIGhpZ2gtcmVzb2x1dGlvbiBwZXJmb3JtYW5jZSBjb3VudGVyICovCitzdGF0aWMgTEFSR0VfSU5URUdFUiBoaXJlc190aWNrc19wZXJfc2Vjb25kOworI2VuZGlmCisKK3ZvaWQgU0RMX1N0YXJ0VGlja3Modm9pZCkKK3sKKwkvKiBTZXQgZmlyc3QgdGlja3MgdmFsdWUgKi8KKyNpZmRlZiBVU0VfR0VUVElDS0NPVU5UCisJc3RhcnQgPSBHZXRUaWNrQ291bnQoKTsKKyNlbHNlCisjaWYgMCAvKiBBcHBhcmVudGx5IHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIFFQQyBvbiBXaW4ySyAqLworCWlmIChRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZoaXJlc190aWNrc19wZXJfc2Vjb25kKSA9PSBUUlVFKQorCXsKKwkJaGlyZXNfdGltZXJfYXZhaWxhYmxlID0gVFJVRTsKKwkJUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmhpcmVzX3N0YXJ0X3RpY2tzKTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCQloaXJlc190aW1lcl9hdmFpbGFibGUgPSBGQUxTRTsKKwkJdGltZUJlZ2luUGVyaW9kKDEpOwkJLyogdXNlIDEgbXMgdGltZXIgcHJlY2lzaW9uICovCisJCXN0YXJ0ID0gdGltZUdldFRpbWUoKTsKKwl9CisjZW5kaWYKK30KKworVWludDMyIFNETF9HZXRUaWNrcyh2b2lkKQoreworCURXT1JEIG5vdywgdGlja3M7CisjaWZuZGVmIFVTRV9HRVRUSUNLQ09VTlQKKwlMQVJHRV9JTlRFR0VSIGhpcmVzX25vdzsKKyNlbmRpZgorCisjaWZkZWYgVVNFX0dFVFRJQ0tDT1VOVAorCW5vdyA9IEdldFRpY2tDb3VudCgpOworI2Vsc2UKKwlpZiAoaGlyZXNfdGltZXJfYXZhaWxhYmxlKQorCXsKKwkJUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmhpcmVzX25vdyk7CisKKwkJaGlyZXNfbm93LlF1YWRQYXJ0IC09IGhpcmVzX3N0YXJ0X3RpY2tzLlF1YWRQYXJ0OworCQloaXJlc19ub3cuUXVhZFBhcnQgKj0gMTAwMDsKKwkJaGlyZXNfbm93LlF1YWRQYXJ0IC89IGhpcmVzX3RpY2tzX3Blcl9zZWNvbmQuUXVhZFBhcnQ7CisKKwkJcmV0dXJuIChEV09SRCloaXJlc19ub3cuUXVhZFBhcnQ7CisJfQorCWVsc2UKKwl7CisJCW5vdyA9IHRpbWVHZXRUaW1lKCk7CisJfQorI2VuZGlmCisKKwlpZiAoIG5vdyA8IHN0YXJ0ICkgeworCQl0aWNrcyA9IChUSU1FX1dSQVBfVkFMVUUtc3RhcnQpICsgbm93OworCX0gZWxzZSB7CisJCXRpY2tzID0gKG5vdyAtIHN0YXJ0KTsKKwl9CisJcmV0dXJuKHRpY2tzKTsKK30KKwordm9pZCBTRExfRGVsYXkoVWludDMyIG1zKQoreworCVNsZWVwKG1zKTsKK30KKworLyogRGF0YSB0byBoYW5kbGUgYSBzaW5nbGUgcGVyaW9kaWMgYWxhcm0gKi8KK3N0YXRpYyBVSU5UIHRpbWVySUQgPSAwOworCitzdGF0aWMgdm9pZCBDQUxMQkFDSyBIYW5kbGVBbGFybShVSU5UIHVJRCwgIFVJTlQgdU1zZywgRFdPUkRfUFRSIGR3VXNlciwKKwkJCQkJCURXT1JEX1BUUiBkdzEsIERXT1JEX1BUUiBkdzIpCit7CisJU0RMX1RocmVhZGVkVGltZXJDaGVjaygpOworfQorCisKK2ludCBTRExfU1lTX1RpbWVySW5pdCh2b2lkKQoreworCU1NUkVTVUxUIHJlc3VsdDsKKworCS8qIFNldCB0aW1lciByZXNvbHV0aW9uICovCisJcmVzdWx0ID0gdGltZUJlZ2luUGVyaW9kKFRJTUVSX1JFU09MVVRJT04pOworCWlmICggcmVzdWx0ICE9IFRJTUVSUl9OT0VSUk9SICkgeworCQlTRExfU2V0RXJyb3IoIldhcm5pbmc6IENhbid0IHNldCAlZCBtcyB0aW1lciByZXNvbHV0aW9uIiwKKwkJCQkJCQlUSU1FUl9SRVNPTFVUSU9OKTsKKwl9CisJLyogQWxsb3cgMTAgbXMgb2YgZHJpZnQgc28gd2UgZG9uJ3QgY2hldyBvbiBDUFUgKi8KKwl0aW1lcklEID0gdGltZVNldEV2ZW50KFRJTUVSX1JFU09MVVRJT04sMSxIYW5kbGVBbGFybSwwLFRJTUVfUEVSSU9ESUMpOworCWlmICggISB0aW1lcklEICkgeworCQlTRExfU2V0RXJyb3IoInRpbWVTZXRFdmVudCgpIGZhaWxlZCIpOworCQlyZXR1cm4oLTEpOworCX0KKwlyZXR1cm4oU0RMX1NldFRpbWVyVGhyZWFkZWQoMSkpOworfQorCit2b2lkIFNETF9TWVNfVGltZXJRdWl0KHZvaWQpCit7CisJaWYgKCB0aW1lcklEICkgeworCQl0aW1lS2lsbEV2ZW50KHRpbWVySUQpOworCX0KKwl0aW1lRW5kUGVyaW9kKFRJTUVSX1JFU09MVVRJT04pOworfQorCitpbnQgU0RMX1NZU19TdGFydFRpbWVyKHZvaWQpCit7CisJU0RMX1NldEVycm9yKCJJbnRlcm5hbCBsb2dpYyBlcnJvcjogV2luMzIgdXNlcyB0aHJlYWRlZCB0aW1lciIpOworCXJldHVybigtMSk7Cit9CisKK3ZvaWQgU0RMX1NZU19TdG9wVGltZXIodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBTRExfVElNRVJfV0lOMzIgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdGltZXIvd2luY2UvU0RMX3N5c3RpbWVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL3dpbmNlL1NETF9zeXN0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDE4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3RpbWVyL3dpbmNlL1NETF9zeXN0aW1lci5jCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmZGVmIFNETF9USU1FUl9XSU5DRQorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KKworI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICIuLi9TRExfdGltZXJfYy5oIgorCitzdGF0aWMgVWludDY0IHN0YXJ0X2RhdGU7CitzdGF0aWMgVWludDY0IHN0YXJ0X3RpY2tzOworCitzdGF0aWMgVWludDY0IHdjZV90aWNrcyh2b2lkKQoreworICByZXR1cm4oKFVpbnQ2NClHZXRUaWNrQ291bnQoKSk7Cit9CisKK3N0YXRpYyBVaW50NjQgd2NlX2RhdGUodm9pZCkKK3sKKyAgdW5pb24KKyAgeworCUZJTEVUSU1FIGZ0aW1lOworCVVpbnQ2NCBpdGltZTsKKyAgfSBmdGltZTsKKyAgU1lTVEVNVElNRSBzdGltZTsKKworICBHZXRTeXN0ZW1UaW1lKCZzdGltZSk7CisgIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKCZzdGltZSwmZnRpbWUuZnRpbWUpOworICBmdGltZS5pdGltZS89MTAwMDA7IC8vIENvbnZlcnQgMTAwbnMgaW50ZXJ2YWxzIHRvIDFtcyBpbnRlcnZhbHMKKyAgLy8gUmVtb3ZlIG1zIHBvcnRpb24sIHdoaWNoIGNhbid0IGJlIHJlbGllZCBvbgorICBmdGltZS5pdGltZSAtPSAoZnRpbWUuaXRpbWUgJSAxMDAwKTsKKyAgcmV0dXJuKGZ0aW1lLml0aW1lKTsKK30KKworc3RhdGljIFNpbnQzMiB3Y2VfcmVsX3RpY2tzKHZvaWQpCit7CisgIHJldHVybigoU2ludDMyKSh3Y2VfdGlja3MoKS1zdGFydF90aWNrcykpOworfQorCitzdGF0aWMgU2ludDMyIHdjZV9yZWxfZGF0ZSh2b2lkKQoreworICByZXR1cm4oKFNpbnQzMikod2NlX2RhdGUoKS1zdGFydF9kYXRlKSk7Cit9CisKKy8qIFJldHVybiB0aW1lIGluIG1zIHJlbGF0aXZlIHRvIHdoZW4gU0RMIHdhcyBzdGFydGVkICovCitVaW50MzIgU0RMX0dldFRpY2tzKCkKK3sKKyAgU2ludDMyIG9mZnNldD13Y2VfcmVsX2RhdGUoKS13Y2VfcmVsX3RpY2tzKCk7CisgIGlmKChvZmZzZXQgPCAtMTAwMCkgfHwgKG9mZnNldCA+IDEwMDApKQorICB7CisvLyAgICBmcHJpbnRmKHN0ZGVyciwiVGltZSBkZXN5bmMoJStkKSwgcmVzeW5jaW5nXG4iLG9mZnNldC8xMDAwKTsKKwlzdGFydF90aWNrcy09b2Zmc2V0OworICB9CisKKyAgcmV0dXJuKChVaW50MzIpd2NlX3JlbF90aWNrcygpKTsKK30KKworLyogR2l2ZSB1cCBhcHByb3guIGdpdmVtIG1pbGxpc2Vjb25kcyB0byB0aGUgT1MuICovCit2b2lkIFNETF9EZWxheShVaW50MzIgbXMpCit7CisgIFNsZWVwKG1zKTsKK30KKworLyogUmVjYXJkIHN0YXJ0LXRpbWUgb2YgYXBwbGljYXRpb24gZm9yIHJlZmVyZW5jZSAqLwordm9pZCBTRExfU3RhcnRUaWNrcyh2b2lkKQoreworICBzdGFydF9kYXRlPXdjZV9kYXRlKCk7CisgIHN0YXJ0X3RpY2tzPXdjZV90aWNrcygpOworfQorCitzdGF0aWMgVUlOVCBXSU5fdGltZXI7CisKKyNpZiAoIF9XSU4zMl9XQ0UgPD0gNDIwICkKKworc3RhdGljIEhBTkRMRSB0aW1lcnNUaHJlYWQgPSAwOworc3RhdGljIEhBTkRMRSB0aW1lcnNRdWl0RXZlbnQgPSAwOworCitEV09SRCBUaW1lcnNUaHJlYWRQcm9jKHZvaWQgKmRhdGEpCit7CisJd2hpbGUoV2FpdEZvclNpbmdsZU9iamVjdCh0aW1lcnNRdWl0RXZlbnQsIDEwKSA9PSBXQUlUX1RJTUVPVVQpCisJeworCQlTRExfVGhyZWFkZWRUaW1lckNoZWNrKCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKK3sKKwkvLyBjcmVhdGUgYSB0aHJlYWQgdG8gcHJvY2VzcyBhIHRocmVhZGVkIHRpbWVycworCS8vIFNldFRpbWVyIGRvZXMgbm90IHN1aXQgdGhlIG5lZWRzIGJlY2F1c2UgCisJLy8gVGltZXJDYWxsYmFja1Byb2Mgd2lsbCBiZSBjYWxsZWQgb25seSB3aGVuIFdNX1RJTUVSIG9jY3VyZWQKKworCXRpbWVyc1F1aXRFdmVudCA9IENyZWF0ZUV2ZW50KDAsIFRSVUUsIEZBTFNFLCAwKTsKKwlpZiggIXRpbWVyc1F1aXRFdmVudCApCisJeworCQlTRExfU2V0RXJyb3IoIkNhbm5vdCBjcmVhdGUgZXZlbnQgZm9yIHRpbWVycyB0aHJlYWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0aW1lcnNUaHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgVGltZXJzVGhyZWFkUHJvYywgMCwgMCwgMCk7CisJaWYoICF0aW1lcnNUaHJlYWQgKQorCXsKKwkJU0RMX1NldEVycm9yKCJDYW5ub3QgY3JlYXRlIHRpbWVycyB0aHJlYWQsIGNoZWNrIGFtb3VudCBvZiBSQU0gYXZhaWxhYmxlIik7CisJCXJldHVybiAtMTsKKwl9CisJU2V0VGhyZWFkUHJpb3JpdHkodGltZXJzVGhyZWFkLCBUSFJFQURfUFJJT1JJVFlfSElHSEVTVCk7CisKKwlyZXR1cm4oU0RMX1NldFRpbWVyVGhyZWFkZWQoMSkpOworfQorCit2b2lkIFNETF9TWVNfVGltZXJRdWl0KHZvaWQpCit7CisJU2V0RXZlbnQodGltZXJzUXVpdEV2ZW50KTsKKwlpZiggV2FpdEZvclNpbmdsZU9iamVjdCh0aW1lcnNUaHJlYWQsIDIwMDApID09IFdBSVRfVElNRU9VVCApCisJCVRlcm1pbmF0ZVRocmVhZCh0aW1lcnNUaHJlYWQsIDApOworCUNsb3NlSGFuZGxlKHRpbWVyc1RocmVhZCk7CisJQ2xvc2VIYW5kbGUodGltZXJzUXVpdEV2ZW50KTsKKwlyZXR1cm47Cit9CisKKyNlbHNlCisKKyNwcmFnbWEgY29tbWVudChsaWIsICJtbXRpbWVyLmxpYiIpCisKKy8qIERhdGEgdG8gaGFuZGxlIGEgc2luZ2xlIHBlcmlvZGljIGFsYXJtICovCitzdGF0aWMgVUlOVCB0aW1lcklEID0gMDsKKworc3RhdGljIHZvaWQgQ0FMTEJBQ0sgSGFuZGxlQWxhcm0oVUlOVCB1SUQsICBVSU5UIHVNc2csIERXT1JEIGR3VXNlciwKKwkJCQkJCURXT1JEIGR3MSwgRFdPUkQgZHcyKQoreworCVNETF9UaHJlYWRlZFRpbWVyQ2hlY2soKTsKK30KKworCitpbnQgU0RMX1NZU19UaW1lckluaXQodm9pZCkKK3sKKwlNTVJFU1VMVCByZXN1bHQ7CisKKwkvKiBTZXQgdGltZXIgcmVzb2x1dGlvbiAqLworCXJlc3VsdCA9IHRpbWVCZWdpblBlcmlvZChUSU1FUl9SRVNPTFVUSU9OKTsKKwlpZiAoIHJlc3VsdCAhPSBUSU1FUlJfTk9FUlJPUiApIHsKKwkJU0RMX1NldEVycm9yKCJXYXJuaW5nOiBDYW4ndCBzZXQgJWQgbXMgdGltZXIgcmVzb2x1dGlvbiIsCisJCQkJCQkJVElNRVJfUkVTT0xVVElPTik7CisJfQorCS8qIEFsbG93IDEwIG1zIG9mIGRyaWZ0IHNvIHdlIGRvbid0IGNoZXcgb24gQ1BVICovCisJdGltZXJJRCA9IHRpbWVTZXRFdmVudChUSU1FUl9SRVNPTFVUSU9OLDEsSGFuZGxlQWxhcm0sMCxUSU1FX1BFUklPRElDKTsKKwlpZiAoICEgdGltZXJJRCApIHsKKwkJU0RMX1NldEVycm9yKCJ0aW1lU2V0RXZlbnQoKSBmYWlsZWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKFNETF9TZXRUaW1lclRocmVhZGVkKDEpKTsKK30KKwordm9pZCBTRExfU1lTX1RpbWVyUXVpdCh2b2lkKQoreworCWlmICggdGltZXJJRCApIHsKKwkJdGltZUtpbGxFdmVudCh0aW1lcklEKTsKKwl9CisJdGltZUVuZFBlcmlvZChUSU1FUl9SRVNPTFVUSU9OKTsKK30KKworI2VuZGlmCisKK2ludCBTRExfU1lTX1N0YXJ0VGltZXIodm9pZCkKK3sKKwlTRExfU2V0RXJyb3IoIkludGVybmFsIGxvZ2ljIGVycm9yOiBXaW5DRSB1c2VzIHRocmVhZGVkIHRpbWVyIik7CisJcmV0dXJuKC0xKTsKK30KKwordm9pZCBTRExfU1lTX1N0b3BUaW1lcih2b2lkKQoreworCXJldHVybjsKK30KKworI2VuZGlmIC8qIFNETF9USU1FUl9XSU5DRSAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfUkxFYWNjZWwuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX1JMRWFjY2VsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiMTkxYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX1JMRWFjY2VsLmMKQEAgLTAsMCArMSwxOTQxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqIFJMRSBlbmNvZGluZyBmb3Igc29mdHdhcmUgY29sb3JrZXkgYW5kIGFscGhhLWNoYW5uZWwgYWNjZWxlcmF0aW9uCisgKgorICogT3JpZ2luYWwgdmVyc2lvbiBieSBTYW0gTGFudGluZ2EKKyAqCisgKiBNYXR0aWFzIEVuZ2RlZ+VyZCAoWW9yaWNrKTogUmV3cml0ZS4gTmV3IGVuY29kaW5nIGZvcm1hdCwgZW5jb2RlciBhbmQKKyAqIGRlY29kZXIuIEFkZGVkIHBlci1zdXJmYWNlIGFscGhhIGJsaXR0ZXIuIEFkZGVkIHBlci1waXhlbCBhbHBoYQorICogZm9ybWF0LCBlbmNvZGVyIGFuZCBibGl0dGVyLgorICoKKyAqIE1hbnkgdGhhbmtzIHRvIFhhcmsgYW5kIGpvaG5zIGZvciBoaW50cywgYmVuY2htYXJrcyBhbmQgdXNlZnVsIGNvbW1lbnRzCisgKiBsZWFkaW5nIHRvIHRoaXMgY29kZS4KKyAqCisgKiBXZWxjb21lIHRvIE1hY3JvIE1heWhlbS4KKyAqLworCisvKgorICogVGhlIGVuY29kaW5nIHRyYW5zbGF0ZXMgdGhlIGltYWdlIGRhdGEgdG8gYSBzdHJlYW0gb2Ygc2VnbWVudHMgb2YgdGhlIGZvcm0KKyAqCisgKiA8c2tpcD4gPHJ1bj4gPGRhdGE+CisgKgorICogd2hlcmUgPHNraXA+IGlzIHRoZSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgcGl4ZWxzIHRvIHNraXAsCisgKiAgICAgICA8cnVuPiAgaXMgdGhlIG51bWJlciBvZiBvcGFxdWUgcGl4ZWxzIHRvIGJsaXQsCisgKiBhbmQgICA8ZGF0YT4gYXJlIHRoZSBwaXhlbHMgdGhlbXNlbHZlcy4KKyAqCisgKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyB1c2VkIGJvdGggZm9yIGNvbG9ya2V5ZWQgc3VyZmFjZXMsIHVzZWQgZm9yIHNpbXBsZQorICogYmluYXJ5IHRyYW5zcGFyZW5jeSBhbmQgZm9yIHBlci1zdXJmYWNlIGFscGhhIGJsZW5kaW5nLCBhbmQgZm9yIHN1cmZhY2VzCisgKiB3aXRoIHBlci1waXhlbCBhbHBoYS4gVGhlIGRldGFpbHMgZGlmZmVyLCBob3dldmVyOgorICoKKyAqIEVuY29kaW5nIG9mIGNvbG9ya2V5ZWQgc3VyZmFjZXM6CisgKgorICogICBFbmNvZGVkIHBpeGVscyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHRhcmdldCBzdXJmYWNlLgorICogICA8c2tpcD4gYW5kIDxydW4+IGFyZSB1bnNpZ25lZCA4IGJpdCBpbnRlZ2VycywgZXhjZXB0IGZvciAzMiBiaXQgZGVwdGgKKyAqICAgd2hlcmUgdGhleSBhcmUgMTYgYml0LiBUaGlzIG1ha2VzIHRoZSBwaXhlbCBkYXRhIGFsaWduZWQgYXQgYWxsIHRpbWVzLgorICogICBTZWdtZW50cyBuZXZlciB3cmFwIGFyb3VuZCBmcm9tIG9uZSBzY2FuIGxpbmUgdG8gdGhlIG5leHQuCisgKgorICogICBUaGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSBpcyBtYXJrZWQgYnkgYSB6ZXJvIDxza2lwPiw8cnVuPiBwYWlyIGF0IHRoZSAqCisgKiAgIGJlZ2lubmluZyBvZiBhIGxpbmUuCisgKgorICogRW5jb2Rpbmcgb2Ygc3VyZmFjZXMgd2l0aCBwZXItcGl4ZWwgYWxwaGE6CisgKgorICogICBUaGUgc2VxdWVuY2UgYmVnaW5zIHdpdGggYSBzdHJ1Y3QgUkxFRGVzdEZvcm1hdCBkZXNjcmliaW5nIHRoZSB0YXJnZXQKKyAqICAgcGl4ZWwgZm9ybWF0LCB0byBwcm92aWRlIHJlbGlhYmxlIHVuLWVuY29kaW5nLgorICoKKyAqICAgRWFjaCBzY2FuIGxpbmUgaXMgZW5jb2RlZCB0d2ljZTogRmlyc3QgYWxsIGNvbXBsZXRlbHkgb3BhcXVlIHBpeGVscywKKyAqICAgZW5jb2RlZCBpbiB0aGUgdGFyZ2V0IGZvcm1hdCBhcyBkZXNjcmliZWQgYWJvdmUsIGFuZCB0aGVuIGFsbAorICogICBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKHRyYW5zbHVjZW50KSBwaXhlbHMgKHdoZXJlIDEgPD0gYWxwaGEgPD0gMjU0KSwKKyAqICAgaW4gdGhlIGZvbGxvd2luZyAzMi1iaXQgZm9ybWF0OgorICoKKyAqICAgRm9yIDMyLWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQgYnV0IHdpdGgKKyAqICAgdGhlIGFscGhhIHZhbHVlIG9jY3VweWluZyB0aGUgaGlnaGVzdCA4IGJpdHMuIFRoZSA8c2tpcD4gYW5kIDxydW4+CisgKiAgIGNvdW50cyBhcmUgMTYgYml0LgorICogCisgKiAgIEZvciAxNi1iaXQgdGFyZ2V0cywgZWFjaCBwaXhlbCBoYXMgdGhlIHRhcmdldCBSR0IgZm9ybWF0LCBidXQgd2l0aAorICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKKyAqICAgYW5kIHRoZSBob2xlIGZpbGxlZCB3aXRoIHRoZSA1IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgYWxwaGEgdmFsdWUuCisgKiAgIGkuZS4gaWYgdGhlIHRhcmdldCBoYXMgdGhlIGZvcm1hdCAgICAgICAgIHJycnJyZ2dnZ2dnYmJiYmIsCisgKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCisgKiAgIFRoZSA8c2tpcD4gYW5kIDxydW4+IGNvdW50cyBhcmUgOCBiaXQgZm9yIHRoZSBvcGFxdWUgbGluZXMsIDE2IGJpdAorICogICBmb3IgdGhlIHRyYW5zbHVjZW50IGxpbmVzLiBUd28gcGFkZGluZyBieXRlcyBtYXkgYmUgaW5zZXJ0ZWQKKyAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCisgKgorICogICBUaGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSBpcyBtYXJrZWQgYnkgYSB6ZXJvIDxza2lwPiw8cnVuPiBwYWlyIGF0IHRoZQorICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCisgKi8KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIlNETF9ibGl0LmgiCisjaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKKworLyogRm9yY2UgTU1YIHRvIDA7IHRoaXMgYmxvd3MgdXAgb24gYWxtb3N0IGV2ZXJ5IG1ham9yIGNvbXBpbGVyIG5vdy4gLS1yeWFuLiAqLworI2lmIDAgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpICYmIFNETF9BU1NFTUJMWV9ST1VUSU5FUworI2RlZmluZSBNTVhfQVNNQkxJVAorI2VuZGlmCisKKyNpZmRlZiBNTVhfQVNNQkxJVAorI2luY2x1ZGUgIm1teC5oIgorI2luY2x1ZGUgIlNETF9jcHVpbmZvLmgiCisjZW5kaWYKKworI2lmbmRlZiBNQVgKKyNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNpZm5kZWYgTUlOCisjZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNkZWZpbmUgUElYRUxfQ09QWSh0bywgZnJvbSwgbGVuLCBicHApCQkJXAorZG8gewkJCQkJCQlcCisgICAgaWYoYnBwID09IDQpIHsJCQkJCVwKKwlTRExfbWVtY3B5NCh0bywgZnJvbSwgKHNpemVfdCkobGVuKSk7CQlcCisgICAgfSBlbHNlIHsJCQkJCQlcCisJU0RMX21lbWNweSh0bywgZnJvbSwgKHNpemVfdCkobGVuKSAqIChicHApKTsJXAorICAgIH0JCQkJCQkJXAorfSB3aGlsZSgwKQorCisvKgorICogVmFyaW91cyBjb2xvcmtleSBibGl0IG1ldGhvZHMsIGZvciBvcGFxdWUgYW5kIHBlci1zdXJmYWNlIGFscGhhCisgKi8KKworI2RlZmluZSBPUEFRVUVfQkxJVCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCisgICAgUElYRUxfQ09QWSh0bywgZnJvbSwgbGVuZ3RoLCBicHApCisKKyNpZmRlZiBNTVhfQVNNQkxJVAorCisjZGVmaW5lIEFMUEhBX0JMSVQzMl84ODhNTVgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAorICAgIGRvIHsJCQkJCQkJXAorCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKikoZnJvbSk7CQkJXAorCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKikodG8pOwkJCQlcCisgICAgICAgIGludCBpID0gMHgwMEZGMDBGRjsJCQkJCVwKKyAgICAgICAgbW92ZF9tMnIoKigmaSksIG1tMyk7CQkJCQlcCisgICAgICAgIHB1bnBja2xkcV9yMnIobW0zLCBtbTMpOwkJCQlcCisgICAgICAgIGkgPSAweEZGMDAwMDAwOwkJCQkJCVwKKyAgICAgICAgbW92ZF9tMnIoKigmaSksIG1tNyk7CQkJCQlcCisgICAgICAgIHB1bnBja2xkcV9yMnIobW03LCBtbTcpOwkJCQlcCisgICAgICAgIGkgPSBhbHBoYSB8IGFscGhhIDw8IDE2OwkJCQlcCisgICAgICAgIG1vdmRfbTJyKCooJmkpLCBtbTQpOwkJCQkJXAorICAgICAgICBwdW5wY2tsZHFfcjJyKG1tNCwgbW00KTsJCQkJXAorCXBjbXBlcWRfcjJyKG1tNSxtbTUpOyAvKiBzZXQgbW01IHRvICIxIiAqLwkJXAorCXB4b3JfcjJyKG1tNywgbW01KTsgLyogbWFrZSBjbGVhciBhbHBoYSBtYXNrICovCQlcCisgICAgICAgIGkgPSBsZW5ndGg7CQkJCQkJXAorCWlmKGkgJiAxKSB7CQkJCQkJXAorICAgICAgICAgIG1vdmRfbTJyKCgqc3JjcCksIG1tMSk7IC8qIHNyYyAtPiBtbTEgKi8JCVwKKyAgICAgICAgICBwdW5wY2tsYndfcjJyKG1tMSwgbW0xKTsJCQkJXAorICAgICAgICAgIHBhbmRfcjJyKG1tMywgbW0xKTsJCQkJCVwKKwkgIG1vdmRfbTJyKCgqZHN0cCksIG1tMik7IC8qIGRzdCAtPiBtbTIgKi8JCVwKKyAgICAgICAgICBwdW5wY2tsYndfcjJyKG1tMiwgbW0yKTsJCQkJXAorICAgICAgICAgIHBhbmRfcjJyKG1tMywgbW0yKTsJCQkJCVwKKwkgIHBzdWJ3X3IycihtbTIsIG1tMSk7CQkJCQlcCisJICBwbXVsbHdfcjJyKG1tNCwgbW0xKTsJCQkJCVwKKwkgIHBzcmx3X2kycig4LCBtbTEpOwkJCQkJXAorCSAgcGFkZHdfcjJyKG1tMSwgbW0yKTsJCQkJCVwKKwkgIHBhbmRfcjJyKG1tMywgbW0yKTsJCQkJCVwKKwkgIHBhY2t1c3diX3IycihtbTIsIG1tMik7CQkJCVwKKwkgIHBhbmRfcjJyKG1tNSwgbW0yKTsgLyogMDAwMDBSR0IgLT4gbW0yICovCQlcCisJICBtb3ZkX3IybShtbTIsICpkc3RwKTsJCQkJCVwKKwkgICsrc3JjcDsJCQkJCQlcCisJICArK2RzdHA7CQkJCQkJXAorCSAgaS0tOwkJCQkJCQlcCisJfQkJCQkJCQlcCisJZm9yKDsgaSA+IDA7IC0taSkgewkJCQkJXAorICAgICAgICAgIG1vdnFfbTJyKCgqc3JjcCksIG1tMCk7CQkJCVwKKwkgIG1vdnFfcjJyKG1tMCwgbW0xKTsJCQkJCVwKKyAgICAgICAgICBwdW5wY2tsYndfcjJyKG1tMCwgbW0wKTsJCQkJXAorCSAgbW92cV9tMnIoKCpkc3RwKSwgbW0yKTsJCQkJXAorCSAgcHVucGNraGJ3X3IycihtbTEsIG1tMSk7CQkJCVwKKwkgIG1vdnFfcjJyKG1tMiwgbW02KTsJCQkJCVwKKyAgICAgICAgICBwYW5kX3IycihtbTMsIG1tMCk7CQkJCQlcCisgICAgICAgICAgcHVucGNrbGJ3X3IycihtbTIsIG1tMik7CQkJCVwKKwkgIHBhbmRfcjJyKG1tMywgbW0xKTsJCQkJCVwKKwkgIHB1bnBja2hid19yMnIobW02LCBtbTYpOwkJCQlcCisgICAgICAgICAgcGFuZF9yMnIobW0zLCBtbTIpOwkJCQkJXAorCSAgcHN1YndfcjJyKG1tMiwgbW0wKTsJCQkJCVwKKwkgIHBtdWxsd19yMnIobW00LCBtbTApOwkJCQkJXAorCSAgcGFuZF9yMnIobW0zLCBtbTYpOwkJCQkJXAorCSAgcHN1YndfcjJyKG1tNiwgbW0xKTsJCQkJCVwKKwkgIHBtdWxsd19yMnIobW00LCBtbTEpOwkJCQkJXAorCSAgcHNybHdfaTJyKDgsIG1tMCk7CQkJCQlcCisJICBwYWRkd19yMnIobW0wLCBtbTIpOwkJCQkJXAorCSAgcHNybHdfaTJyKDgsIG1tMSk7CQkJCQlcCisJICBwYWRkd19yMnIobW0xLCBtbTYpOwkJCQkJXAorCSAgcGFuZF9yMnIobW0zLCBtbTIpOwkJCQkJXAorCSAgcGFuZF9yMnIobW0zLCBtbTYpOwkJCQkJXAorCSAgcGFja3Vzd2JfcjJyKG1tMiwgbW0yKTsJCQkJXAorCSAgcGFja3Vzd2JfcjJyKG1tNiwgbW02KTsJCQkJXAorCSAgcHNybHFfaTJyKDMyLCBtbTIpOwkJCQkJXAorCSAgcHNsbHFfaTJyKDMyLCBtbTYpOwkJCQkJXAorCSAgcG9yX3IycihtbTYsIG1tMik7CQkJCQlcCisJICBwYW5kX3IycihtbTUsIG1tMik7IC8qIDAwMDAwUkdCIC0+IG1tMiAqLwkJXAorICAgICAgICAgbW92cV9yMm0obW0yLCAqZHN0cCk7CQkJCQlcCisJICBzcmNwICs9IDI7CQkJCQkJXAorCSAgZHN0cCArPSAyOwkJCQkJCVwKKwkgIGktLTsJCQkJCQkJXAorCX0JCQkJCQkJXAorCWVtbXMoKTsJCQkJCQkJXAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBBTFBIQV9CTElUMTZfNTY1TU1YKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKKyAgICBkbyB7CQkJCQkJXAorICAgICAgICBpbnQgaSwgbiA9IDA7CQkJCQlcCisJVWludDE2ICpzcmNwID0gKFVpbnQxNiAqKShmcm9tKTsJCVwKKwlVaW50MTYgKmRzdHAgPSAoVWludDE2ICopKHRvKTsJCQlcCisgICAgICAgIFVpbnQzMiBBTFBIQSA9IDB4RjgwMDsJCQkJXAorCW1vdmRfbTJyKCooJkFMUEhBKSwgbW0xKTsJCQlcCisgICAgICAgIHB1bnBja2x3ZF9yMnIobW0xLCBtbTEpOwkJCVwKKyAgICAgICAgcHVucGNrbHdkX3IycihtbTEsIG1tMSk7CQkJXAorCUFMUEhBID0gMHgwN0UwOwkJCQkJXAorCW1vdmRfbTJyKCooJkFMUEhBKSwgbW00KTsJCQlcCisgICAgICAgIHB1bnBja2x3ZF9yMnIobW00LCBtbTQpOwkJCVwKKyAgICAgICAgcHVucGNrbHdkX3IycihtbTQsIG1tNCk7CQkJXAorCUFMUEhBID0gMHgwMDFGOwkJCQkJXAorCW1vdmRfbTJyKCooJkFMUEhBKSwgbW03KTsJCQlcCisgICAgICAgIHB1bnBja2x3ZF9yMnIobW03LCBtbTcpOwkJCVwKKyAgICAgICAgcHVucGNrbHdkX3IycihtbTcsIG1tNyk7CQkJXAorCWFscGhhICY9IH4oMSsyKzQpOwkJCQlcCisgICAgICAgIGkgPSAoVWludDMyKWFscGhhIHwgKFVpbnQzMilhbHBoYSA8PCAxNjsJXAorICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW0wKTsJCQkJXAorICAgICAgICBwdW5wY2tsZHFfcjJyKG1tMCwgbW0wKTsJCQlcCisgICAgICAgIEFMUEhBID0gYWxwaGEgPj4gMzsJCQkJXAorICAgICAgICBpID0gKChpbnQpKGxlbmd0aCkgJiAzKTsJCQlcCisJZm9yKDsgaSA+IDA7IC0taSkgewkJCQlcCisJICAgIFVpbnQzMiBzID0gKnNyY3ArKzsJCQkJXAorCSAgICBVaW50MzIgZCA9ICpkc3RwOwkJCQlcCisJICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsJCVwKKwkgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOwkJXAorCSAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OwkJCVwKKwkgICAgZCAmPSAweDA3ZTBmODFmOwkJCQlcCisJICAgICpkc3RwKysgPSBkIHwgZCA+PiAxNjsJCQlcCisJICAgIG4rKzsJCQkJCVwKKwl9CQkJCQkJXAorCWkgPSAoaW50KShsZW5ndGgpIC0gbjsJCQkJXAorCWZvcig7IGkgPiAwOyAtLWkpIHsJCQkJXAorCSAgbW92cV9tMnIoKCpkc3RwKSwgbW0zKTsJCQlcCisJICBtb3ZxX20ycigoKnNyY3ApLCBtbTIpOwkJCVwKKwkgIG1vdnFfcjJyKG1tMiwgbW01KTsJCQkJXAorCSAgcGFuZF9yMnIobW0xICwgbW01KTsJCQkJXAorCSAgcHNybHFfaTJyKDExLCBtbTUpOwkJCQlcCisJICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKKwkgIHBhbmRfcjJyKG1tMSAsIG1tNik7CQkJCVwKKwkgIHBzcmxxX2kycigxMSwgbW02KTsJCQkJXAorCSAgcHN1YndfcjJyKG1tNiwgbW01KTsJCQkJXAorCSAgcG11bGx3X3IycihtbTAsIG1tNSk7CQkJCVwKKwkgIHBzcmx3X2kycig4LCBtbTUpOwkJCQlcCisJICBwYWRkd19yMnIobW01LCBtbTYpOwkJCQlcCisJICBwc2xscV9pMnIoMTEsIG1tNik7CQkJCVwKKwkgIHBhbmRfcjJyKG1tMSwgbW02KTsJCQkJXAorCSAgbW92cV9yMnIobW00LCBtbTUpOwkJCQlcCisJICBwb3JfcjJyKG1tNywgbW01KTsJCQkJXAorCSAgcGFuZF9yMnIobW01LCBtbTMpOwkJCQlcCisJICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAorCSAgbW92cV9yMnIobW0yLCBtbTUpOwkJCQlcCisJICBwYW5kX3IycihtbTQgLCBtbTUpOwkJCQlcCisJICBwc3JscV9pMnIoNSwgbW01KTsJCQkJXAorCSAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCisJICBwYW5kX3IycihtbTQgLCBtbTYpOwkJCQlcCisJICBwc3JscV9pMnIoNSwgbW02KTsJCQkJXAorCSAgcHN1YndfcjJyKG1tNiwgbW01KTsJCQkJXAorCSAgcG11bGx3X3IycihtbTAsIG1tNSk7CQkJCVwKKwkgIHBzcmx3X2kycig4LCBtbTUpOwkJCQlcCisJICBwYWRkd19yMnIobW01LCBtbTYpOwkJCQlcCisJICBwc2xscV9pMnIoNSwgbW02KTsJCQkJXAorCSAgcGFuZF9yMnIobW00LCBtbTYpOwkJCQlcCisJICBtb3ZxX3IycihtbTEsIG1tNSk7CQkJCVwKKwkgIHBvcl9yMnIobW03LCBtbTUpOwkJCQlcCisJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKKwkgIHBvcl9yMnIobW02LCBtbTMpOwkJCQlcCisJICBtb3ZxX3IycihtbTIsIG1tNSk7CQkJCVwKKwkgIHBhbmRfcjJyKG1tNyAsIG1tNSk7CQkJCVwKKyAgICAgICAgICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKKwkgIHBhbmRfcjJyKG1tNyAsIG1tNik7CQkJCVwKKwkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKKwkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCisJICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAorCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAorCSAgcGFuZF9yMnIobW03LCBtbTYpOwkJCQlcCisJICBtb3ZxX3IycihtbTEsIG1tNSk7CQkJCVwKKwkgIHBvcl9yMnIobW00LCBtbTUpOwkJCQlcCisJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKKwkgIHBvcl9yMnIobW02LCBtbTMpOwkJCQlcCisJICBtb3ZxX3IybShtbTMsICpkc3RwKTsJCQkJXAorCSAgc3JjcCArPSA0OwkJCQkJXAorCSAgZHN0cCArPSA0OwkJCQkJXAorCSAgaSAtPSAzOwkJCQkJXAorCX0JCQkJCQlcCisJZW1tcygpOwkJCQkJCVwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQUxQSEFfQkxJVDE2XzU1NU1NWCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCisgICAgZG8gewkJCQkJCVwKKyAgICAgICAgaW50IGksIG4gPSAwOwkJCQkJXAorCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKikoZnJvbSk7CQlcCisJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKSh0byk7CQkJXAorICAgICAgICBVaW50MzIgQUxQSEEgPSAweDdDMDA7CQkJCVwKKwltb3ZkX20ycigqKCZBTFBIQSksIG1tMSk7CQkJXAorICAgICAgICBwdW5wY2tsd2RfcjJyKG1tMSwgbW0xKTsJCQlcCisgICAgICAgIHB1bnBja2x3ZF9yMnIobW0xLCBtbTEpOwkJCVwKKwlBTFBIQSA9IDB4MDNFMDsJCQkJCVwKKyAgICAgICAgbW92ZF9tMnIoKigmQUxQSEEpLCBtbTQpOwkJCVwKKyAgICAgICAgcHVucGNrbHdkX3IycihtbTQsIG1tNCk7CQkJXAorICAgICAgICBwdW5wY2tsd2RfcjJyKG1tNCwgbW00KTsJCQlcCisJQUxQSEEgPSAweDAwMUY7CQkJCQlcCisJbW92ZF9tMnIoKigmQUxQSEEpLCBtbTcpOwkJCVwKKyAgICAgICAgcHVucGNrbHdkX3IycihtbTcsIG1tNyk7CQkJXAorICAgICAgICBwdW5wY2tsd2RfcjJyKG1tNywgbW03KTsJCQlcCisJYWxwaGEgJj0gfigxKzIrNCk7CQkJCVwKKyAgICAgICAgaSA9IChVaW50MzIpYWxwaGEgfCAoVWludDMyKWFscGhhIDw8IDE2OwlcCisgICAgICAgIG1vdmRfbTJyKCooJmkpLCBtbTApOwkJCQlcCisgICAgICAgIHB1bnBja2xkcV9yMnIobW0wLCBtbTApOwkJCVwKKyAgICAgICAgaSA9ICgoaW50KShsZW5ndGgpICYgMyk7CQkJCVwKKyAgICAgICAgQUxQSEEgPSBhbHBoYSA+PiAzOwkJCQlcCisJZm9yKDsgaSA+IDA7IC0taSkgewkJCQlcCisJICAgIFVpbnQzMiBzID0gKnNyY3ArKzsJCQkJXAorCSAgICBVaW50MzIgZCA9ICpkc3RwOwkJCQlcCisJICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsJCVwKKwkgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOwkJXAorCSAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OwkJCVwKKwkgICAgZCAmPSAweDAzZTA3YzFmOwkJCQlcCisJICAgICpkc3RwKysgPSBkIHwgZCA+PiAxNjsJCQlcCisJICAgIG4rKzsJCQkJCVwKKwl9CQkJCQkJXAorCWkgPSAoaW50KShsZW5ndGgpIC0gbjsJCQkJXAorCWZvcig7IGkgPiAwOyAtLWkpIHsJCQkJXAorCSAgbW92cV9tMnIoKCpkc3RwKSwgbW0zKTsJCQlcCisJICBtb3ZxX20ycigoKnNyY3ApLCBtbTIpOwkJCVwKKwkgIG1vdnFfcjJyKG1tMiwgbW01KTsJCQkJXAorCSAgcGFuZF9yMnIobW0xICwgbW01KTsJCQkJXAorCSAgcHNybHFfaTJyKDEwLCBtbTUpOwkJCQlcCisJICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKKwkgIHBhbmRfcjJyKG1tMSAsIG1tNik7CQkJCVwKKwkgIHBzcmxxX2kycigxMCwgbW02KTsJCQkJXAorCSAgcHN1YndfcjJyKG1tNiwgbW01KTsJCQkJXAorCSAgcG11bGx3X3IycihtbTAsIG1tNSk7CQkJCVwKKwkgIHBzcmx3X2kycig4LCBtbTUpOwkJCQlcCisJICBwYWRkd19yMnIobW01LCBtbTYpOwkJCQlcCisJICBwc2xscV9pMnIoMTAsIG1tNik7CQkJCVwKKwkgIHBhbmRfcjJyKG1tMSwgbW02KTsJCQkJXAorCSAgbW92cV9yMnIobW00LCBtbTUpOwkJCQlcCisJICBwb3JfcjJyKG1tNywgbW01KTsJCQkJXAorCSAgcGFuZF9yMnIobW01LCBtbTMpOwkJCQlcCisJICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAorCSAgbW92cV9yMnIobW0yLCBtbTUpOwkJCQlcCisJICBwYW5kX3IycihtbTQgLCBtbTUpOwkJCQlcCisJICBwc3JscV9pMnIoNSwgbW01KTsJCQkJXAorCSAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCisJICBwYW5kX3IycihtbTQgLCBtbTYpOwkJCQlcCisJICBwc3JscV9pMnIoNSwgbW02KTsJCQkJXAorCSAgcHN1YndfcjJyKG1tNiwgbW01KTsJCQkJXAorCSAgcG11bGx3X3IycihtbTAsIG1tNSk7CQkJCVwKKwkgIHBzcmx3X2kycig4LCBtbTUpOwkJCQlcCisJICBwYWRkd19yMnIobW01LCBtbTYpOwkJCQlcCisJICBwc2xscV9pMnIoNSwgbW02KTsJCQkJXAorCSAgcGFuZF9yMnIobW00LCBtbTYpOwkJCQlcCisJICBtb3ZxX3IycihtbTEsIG1tNSk7CQkJCVwKKwkgIHBvcl9yMnIobW03LCBtbTUpOwkJCQlcCisJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKKwkgIHBvcl9yMnIobW02LCBtbTMpOwkJCQlcCisJICBtb3ZxX3IycihtbTIsIG1tNSk7CQkJCVwKKwkgIHBhbmRfcjJyKG1tNyAsIG1tNSk7CQkJCVwKKyAgICAgICAgICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKKwkgIHBhbmRfcjJyKG1tNyAsIG1tNik7CQkJCVwKKwkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKKwkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCisJICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAorCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAorCSAgcGFuZF9yMnIobW03LCBtbTYpOwkJCQlcCisJICBtb3ZxX3IycihtbTEsIG1tNSk7CQkJCVwKKwkgIHBvcl9yMnIobW00LCBtbTUpOwkJCQlcCisJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKKwkgIHBvcl9yMnIobW02LCBtbTMpOwkJCQlcCisJICBtb3ZxX3IybShtbTMsICpkc3RwKTsJCQkJXAorCSAgc3JjcCArPSA0OwkJCQkJXAorCSAgZHN0cCArPSA0OwkJCQkJXAorCSAgaSAtPSAzOwkJCQkJXAorCX0JCQkJCQlcCisJZW1tcygpOwkJCQkJCVwKKyAgICB9IHdoaWxlKDApCisKKyNlbmRpZgorCisvKgorICogRm9yIDMyYnBwIHBpeGVscyBvbiB0aGUgZm9ybSAweDAwcnJnZ2JiOgorICogSWYgd2UgdHJlYXQgdGhlIG1pZGRsZSBjb21wb25lbnQgc2VwYXJhdGVseSwgd2UgY2FuIHByb2Nlc3MgdGhlIHR3bworICogcmVtYWluaW5nIGluIHBhcmFsbGVsLiBUaGlzIGlzIHNhZmUgdG8gZG8gYmVjYXVzZSBvZiB0aGUgZ2FwIHRvIHRoZSBsZWZ0CisgKiBvZiBlYWNoIGNvbXBvbmVudCwgc28gdGhlIGJpdHMgZnJvbSB0aGUgbXVsdGlwbGljYXRpb24gZG9uJ3QgY29sbGlkZS4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFueSBSR0IgcGVybXV0YXRpb24gb2YgY291cnNlLgorICovCisjZGVmaW5lIEFMUEhBX0JMSVQzMl84ODgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJCVwKKyAgICBkbyB7CQkJCQkJCVwKKyAgICAgICAgaW50IGk7CQkJCQkJCVwKKwlVaW50MzIgKnNyYyA9IChVaW50MzIgKikoZnJvbSk7CQkJCVwKKwlVaW50MzIgKmRzdCA9IChVaW50MzIgKikodG8pOwkJCQlcCisJZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7CQkJXAorCSAgICBVaW50MzIgcyA9ICpzcmMrKzsJCQkJCVwKKwkgICAgVWludDMyIGQgPSAqZHN0OwkJCQkJXAorCSAgICBVaW50MzIgczEgPSBzICYgMHhmZjAwZmY7CQkJCVwKKwkgICAgVWludDMyIGQxID0gZCAmIDB4ZmYwMGZmOwkJCQlcCisJICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOwlcCisJICAgIHMgJj0gMHhmZjAwOwkJCQkJXAorCSAgICBkICY9IDB4ZmYwMDsJCQkJCVwKKwkgICAgZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7CQlcCisJICAgICpkc3QrKyA9IGQxIHwgZDsJCQkJCVwKKwl9CQkJCQkJCVwKKyAgICB9IHdoaWxlKDApCisKKy8qCisgKiBGb3IgMTZicHAgcGl4ZWxzIHdlIGNhbiBnbyBhIHN0ZXAgZnVydGhlcjogcHV0IHRoZSBtaWRkbGUgY29tcG9uZW50CisgKiBpbiB0aGUgaGlnaCAxNiBiaXRzIG9mIGEgMzIgYml0IHdvcmQsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKKyAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4gU2luY2UgdGhlIHNtYWxsZXN0IGdhcCBpcyBoZXJlIGp1c3QKKyAqIDUgYml0cywgd2UgaGF2ZSB0byBzY2FsZSBhbHBoYSBkb3duIHRvIDUgYml0cyBhcyB3ZWxsLgorICovCisjZGVmaW5lIEFMUEhBX0JMSVQxNl81NjUodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAorICAgIGRvIHsJCQkJCQlcCisgICAgICAgIGludCBpOwkJCQkJCVwKKwlVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7CQkJXAorCVVpbnQxNiAqZHN0ID0gKFVpbnQxNiAqKSh0byk7CQkJXAorCVVpbnQzMiBBTFBIQSA9IGFscGhhID4+IDM7CQkJXAorCWZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgewkJXAorCSAgICBVaW50MzIgcyA9ICpzcmMrKzsJCQkJXAorCSAgICBVaW50MzIgZCA9ICpkc3Q7CQkJCVwKKwkgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDA3ZTBmODFmOwkJXAorCSAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7CQlcCisJICAgIGQgKz0gKHMgLSBkKSAqIEFMUEhBID4+IDU7CQkJXAorCSAgICBkICY9IDB4MDdlMGY4MWY7CQkJCVwKKwkgICAgKmRzdCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOwkJCVwKKwl9CQkJCQkJXAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKKyAgICBkbyB7CQkJCQkJXAorICAgICAgICBpbnQgaTsJCQkJCQlcCisJVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOwkJCVwKKwlVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOwkJCVwKKwlVaW50MzIgQUxQSEEgPSBhbHBoYSA+PiAzOwkJCVwKKwlmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsJCVwKKwkgICAgVWludDMyIHMgPSAqc3JjKys7CQkJCVwKKwkgICAgVWludDMyIGQgPSAqZHN0OwkJCQlcCisJICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsJCVwKKwkgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOwkJXAorCSAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OwkJCVwKKwkgICAgZCAmPSAweDAzZTA3YzFmOwkJCQlcCisJICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsJCQlcCisJfQkJCQkJCVwKKyAgICB9IHdoaWxlKDApCisKKy8qCisgKiBUaGUgZ2VuZXJhbCBzbG93IGNhdGNoLWFsbCBmdW5jdGlvbiwgZm9yIHJlbWFpbmluZyBkZXB0aHMgYW5kIGZvcm1hdHMKKyAqLworI2RlZmluZSBBTFBIQV9CTElUX0FOWSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQkJCVwKKyAgICBkbyB7CQkJCQkJCQlcCisgICAgICAgIGludCBpOwkJCQkJCQkJXAorCVVpbnQ4ICpzcmMgPSBmcm9tOwkJCQkJCVwKKwlVaW50OCAqZHN0ID0gdG87CQkJCQkJXAorCWZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgewkJCQlcCisJICAgIFVpbnQzMiBzLCBkOwkJCQkJCVwKKwkgICAgdW5zaWduZWQgcnMsIGdzLCBicywgcmQsIGdkLCBiZDsJCQkJXAorCSAgICBzd2l0Y2goYnBwKSB7CQkJCQkJXAorCSAgICBjYXNlIDI6CQkJCQkJCVwKKwkJcyA9ICooVWludDE2ICopc3JjOwkJCQkJXAorCQlkID0gKihVaW50MTYgKilkc3Q7CQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJICAgIGNhc2UgMzoJCQkJCQkJXAorCQlpZihTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB7CQkJXAorCQkgICAgcyA9IChzcmNbMF0gPDwgMTYpIHwgKHNyY1sxXSA8PCA4KSB8IHNyY1syXTsJXAorCQkgICAgZCA9IChkc3RbMF0gPDwgMTYpIHwgKGRzdFsxXSA8PCA4KSB8IGRzdFsyXTsJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJICAgIHMgPSAoc3JjWzJdIDw8IDE2KSB8IChzcmNbMV0gPDwgOCkgfCBzcmNbMF07CVwKKwkJICAgIGQgPSAoZHN0WzJdIDw8IDE2KSB8IChkc3RbMV0gPDwgOCkgfCBkc3RbMF07CVwKKwkJfQkJCQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJICAgIGNhc2UgNDoJCQkJCQkJXAorCQlzID0gKihVaW50MzIgKilzcmM7CQkJCQlcCisJCWQgPSAqKFVpbnQzMiAqKWRzdDsJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCSAgICBSR0JfRlJPTV9QSVhFTChzLCBmbXQsIHJzLCBncywgYnMpOwkJCQlcCisJICAgIFJHQl9GUk9NX1BJWEVMKGQsIGZtdCwgcmQsIGdkLCBiZCk7CQkJCVwKKwkgICAgcmQgKz0gKHJzIC0gcmQpICogYWxwaGEgPj4gODsJCQkJXAorCSAgICBnZCArPSAoZ3MgLSBnZCkgKiBhbHBoYSA+PiA4OwkJCQlcCisJICAgIGJkICs9IChicyAtIGJkKSAqIGFscGhhID4+IDg7CQkJCVwKKwkgICAgUElYRUxfRlJPTV9SR0IoZCwgZm10LCByZCwgZ2QsIGJkKTsJCQkJXAorCSAgICBzd2l0Y2goYnBwKSB7CQkJCQkJXAorCSAgICBjYXNlIDI6CQkJCQkJCVwKKwkJKihVaW50MTYgKilkc3QgPSAoVWludDE2KWQ7CQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJICAgIGNhc2UgMzoJCQkJCQkJXAorCQlpZihTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB7CQkJXAorCQkgICAgZHN0WzBdID0gKFVpbnQ4KShkID4+IDE2KTsJCQkJCVwKKwkJICAgIGRzdFsxXSA9IChVaW50OCkoZCA+PiA4KTsJCQkJCVwKKwkJICAgIGRzdFsyXSA9IChVaW50OCkoZCk7CQkJCQkJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJICAgIGRzdFswXSA9IChVaW50OClkOwkJCQkJCVwKKwkJICAgIGRzdFsxXSA9IChVaW50OCkoZCA+PiA4KTsJCQkJCVwKKwkJICAgIGRzdFsyXSA9IChVaW50OCkoZCA+PiAxNik7CQkJCQlcCisJCX0JCQkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCSAgICBjYXNlIDQ6CQkJCQkJCVwKKwkJKihVaW50MzIgKilkc3QgPSBkOwkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCSAgICB9CQkJCQkJCQlcCisJICAgIHNyYyArPSBicHA7CQkJCQkJCVwKKwkgICAgZHN0ICs9IGJwcDsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICB9IHdoaWxlKDApCisKKyNpZmRlZiBNTVhfQVNNQkxJVAorCisjZGVmaW5lIEFMUEhBX0JMSVQzMl84ODhfNTBNTVgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJCVwKKyAgICBkbyB7CQkJCQkJCQlcCisJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKShmcm9tKTsJCQkJXAorCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKikodG8pOwkJCQkJXAorICAgICAgICBpbnQgaSA9IDB4MDBmZWZlZmU7CQkJCQkJXAorICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW00KTsJCQkJCQlcCisgICAgICAgIHB1bnBja2xkcV9yMnIobW00LCBtbTQpOwkJCQkJXAorICAgICAgICBpID0gMHgwMDAxMDEwMTsJCQkJCQkJXAorICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW0zKTsJCQkJCQlcCisgICAgICAgIHB1bnBja2xkcV9yMnIobW0zLCBtbTMpOwkJCQkJXAorICAgICAgICBpID0gKGludCkobGVuZ3RoKTsJCQkJCQlcCisgICAgICAgIGlmKCBpICYgMSApIHsJCQkJCQkJXAorCSAgVWludDMyIHMgPSAqc3JjcCsrOwkJCQkJCVwKKwkgIFVpbnQzMiBkID0gKmRzdHA7CQkJCQkJXAorCSAgKmRzdHArKyA9ICgoKHMgJiAweDAwZmVmZWZlKSArIChkICYgMHgwMGZlZmVmZSkpID4+IDEpCVwKKwkJICAgICArIChzICYgZCAmIDB4MDAwMTAxMDEpOwkJCQlcCisJICBpLS07CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWZvcig7IGkgPiAwOyAtLWkpIHsJCQkJCQlcCisJICAgIG1vdnFfbTJyKCgqZHN0cCksIG1tMik7IC8qIGRzdCAtPiBtbTIgKi8JCQlcCisJICAgIG1vdnFfcjJyKG1tMiwgbW02KTsJLyogZHN0IC0+IG1tNiAqLwkJCVwKKwkgICAgbW92cV9tMnIoKCpzcmNwKSwgbW0xKTsgLyogc3JjIC0+IG1tMSAqLwkJCVwKKwkgICAgbW92cV9yMnIobW0xLCBtbTUpOwkvKiBzcmMgLT4gbW01ICovCQkJXAorCSAgICBwYW5kX3IycihtbTQsIG1tNik7CS8qIGRzdCAmIDB4MDBmZWZlZmUgLT4gbW02ICovCQlcCisJICAgIHBhbmRfcjJyKG1tNCwgbW01KTsgLyogc3JjICYgMHgwMGZlZmVmZSAtPiBtbTUgKi8JCVwKKwkgICAgcGFkZGRfcjJyKG1tNiwgbW01KTsgLyogKGRzdCAmIDB4MDBmZWZlZmUpICsgKGRzdCAmIDB4MDBmZWZlZmUpIC0+IG1tNSAqLwlcCisJICAgIHBzcmxkX2kycigxLCBtbTUpOwkJCQkJCVwKKwkgICAgcGFuZF9yMnIobW0xLCBtbTIpOwkvKiBzICYgZCAtPiBtbTIgKi8JCQlcCisJICAgIHBhbmRfcjJyKG1tMywgbW0yKTsJLyogcyAmIGQgJiAweDAwMDEwMTAxIC0+IG1tMiAqLwkJXAorCSAgICBwYWRkZF9yMnIobW01LCBtbTIpOwkJCQkJXAorCSAgICBtb3ZxX3IybShtbTIsICgqZHN0cCkpOwkJCQkJXAorCSAgICBkc3RwICs9IDI7CQkJCQkJCVwKKwkgICAgc3JjcCArPSAyOwkJCQkJCQlcCisJICAgIGktLTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwllbW1zKCk7CQkJCQkJCQlcCisgICAgfSB3aGlsZSgwKQorCisjZW5kaWYKKyAgICAKKy8qCisgKiBTcGVjaWFsIGNhc2U6IDUwJSBhbHBoYSAoYWxwaGE9MTI4KQorICogVGhpcyBpcyB0cmVhdGVkIHNwZWNpYWxseSBiZWNhdXNlIGl0IGNhbiBiZSBvcHRpbWl6ZWQgdmVyeSB3ZWxsLCBhbmQKKyAqIHNpbmNlIGl0IGlzIGdvb2QgZm9yIG1hbnkgY2FzZXMgb2Ygc2VtaS10cmFuc2x1Y2VuY3kuCisgKiBUaGUgdGhlb3J5IGlzIHRvIGRvIGFsbCB0aHJlZSBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWU6CisgKiBGaXJzdCB6ZXJvIHRoZSBsb3dlc3QgYml0IG9mIGVhY2ggY29tcG9uZW50LCB3aGljaCBnaXZlcyB1cyByb29tIHRvCisgKiBhZGQgdGhlbS4gVGhlbiBzaGlmdCByaWdodCBhbmQgYWRkIHRoZSBzdW0gb2YgdGhlIGxvd2VzdCBiaXRzLgorICovCisjZGVmaW5lIEFMUEhBX0JMSVQzMl84ODhfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJCVwKKyAgICBkbyB7CQkJCQkJCQlcCisgICAgICAgIGludCBpOwkJCQkJCQkJXAorCVVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKShmcm9tKTsJCQkJCVwKKwlVaW50MzIgKmRzdCA9IChVaW50MzIgKikodG8pOwkJCQkJXAorCWZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgewkJCQlcCisJICAgIFVpbnQzMiBzID0gKnNyYysrOwkJCQkJCVwKKwkgICAgVWludDMyIGQgPSAqZHN0OwkJCQkJCVwKKwkgICAgKmRzdCsrID0gKCgocyAmIDB4MDBmZWZlZmUpICsgKGQgJiAweDAwZmVmZWZlKSkgPj4gMSkJXAorCQkgICAgICsgKHMgJiBkICYgMHgwMDAxMDEwMSk7CQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfSB3aGlsZSgwKQorCisvKgorICogRm9yIDE2YnBwLCB3ZSBjYW4gYWN0dWFsbHkgYmxlbmQgdHdvIHBpeGVscyBpbiBwYXJhbGxlbCwgaWYgd2UgdGFrZQorICogY2FyZSB0byBzaGlmdCBiZWZvcmUgd2UgYWRkLCBub3QgYWZ0ZXIuCisgKi8KKworLyogaGVscGVyOiBibGVuZCBhIHNpbmdsZSAxNiBiaXQgcGl4ZWwgYXQgNTAlICovCisjZGVmaW5lIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spCQkJXAorICAgIGRvIHsJCQkJCQlcCisJVWludDMyIHMgPSAqc3JjKys7CQkJCVwKKwlVaW50MzIgZCA9ICpkc3Q7CQkJCVwKKwkqZHN0KysgPSAoVWludDE2KSgoKChzICYgbWFzaykgKyAoZCAmIG1hc2spKSA+PiAxKSArCVwKKwkgICAgICAgICAgICAgICAgICAocyAmIGQgJiAofm1hc2sgJiAweGZmZmYpKSk7CQlcCisgICAgfSB3aGlsZSgwKQorCisvKiBiYXNpYyAxNmJwcCBibGVuZGVyLiBtYXNrIGlzIHRoZSBwaXhlbHMgdG8ga2VlcCB3aGVuIGFkZGluZy4gKi8KKyNkZWZpbmUgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIG1hc2spCQlcCisgICAgZG8gewkJCQkJCQkJXAorCXVuc2lnbmVkIG4gPSAobGVuZ3RoKTsJCQkJCQlcCisJVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOwkJCQkJXAorCVVpbnQxNiAqZHN0ID0gKFVpbnQxNiAqKSh0byk7CQkJCQlcCisJaWYoKCh1aW50cHRyX3Qpc3JjIF4gKHVpbnRwdHJfdClkc3QpICYgMykgewkJCVwKKwkgICAgLyogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBub3QgaW4gcGhhc2UsIGJsaXQgb25lIGJ5IG9uZSAqLwlcCisJICAgIHdoaWxlKG4tLSkJCQkJCQkJXAorCQlCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsJCQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkgICAgaWYoKHVpbnRwdHJfdClzcmMgJiAzKSB7CQkJCQlcCisJCS8qIGZpcnN0IG9kZCBwaXhlbCAqLwkJCQkJXAorCQlCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsJCQkJXAorCQluLS07CQkJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCSAgICBmb3IoOyBuID4gMTsgbiAtPSAyKSB7CQkJCQlcCisJCVVpbnQzMiBzID0gKihVaW50MzIgKilzcmM7CQkJCVwKKwkJVWludDMyIGQgPSAqKFVpbnQzMiAqKWRzdDsJCQkJXAorCQkqKFVpbnQzMiAqKWRzdCA9ICgocyAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpCVwKKwkJICAgICAgICAgICAgICAgKyAoKGQgJiAobWFzayB8IG1hc2sgPDwgMTYpKSA+PiAxKQlcCisJCSAgICAgICAgICAgICAgICsgKHMgJiBkICYgKH4obWFzayB8IG1hc2sgPDwgMTYpKSk7CVwKKwkJc3JjICs9IDI7CQkJCQkJXAorCQlkc3QgKz0gMjsJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwkgICAgaWYobikJCQkJCQkJXAorCQlCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgLyogbGFzdCBvZGQgcGl4ZWwgKi8JXAorCX0JCQkJCQkJCVwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQUxQSEFfQkxJVDE2XzU2NV81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCisgICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZjdkZSkKKworI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKKyAgICBBTFBIQV9CTElUMTZfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSwgMHhmYmRlKQorCisjaWZkZWYgTU1YX0FTTUJMSVQKKworI2RlZmluZSBDSE9PU0VfQkxJVChibGl0dGVyLCBhbHBoYSwgZm10KQkJCQlcCisgICAgZG8gewkJCQkJCQkJXAorICAgICAgICBpZihhbHBoYSA9PSAyNTUpIHsJCQkJCQlcCisJICAgIHN3aXRjaChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsJCQkJXAorCSAgICBjYXNlIDE6IGJsaXR0ZXIoMSwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCisJICAgIGNhc2UgMjogYmxpdHRlcigyLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKKwkgICAgY2FzZSAzOiBibGl0dGVyKDMsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAorCSAgICBjYXNlIDQ6IGJsaXR0ZXIoNCwgVWludDE2LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAorCSAgICB9CQkJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCSAgICBzd2l0Y2goZm10LT5CeXRlc1BlclBpeGVsKSB7CQkJCVwKKwkgICAgY2FzZSAxOgkJCQkJCQlcCisJCS8qIE5vIDhicHAgYWxwaGEgYmxpdHRpbmcgKi8JCQkJXAorCQlicmVhazsJCQkJCQkJXAorCQkJCQkJCQkJXAorCSAgICBjYXNlIDI6CQkJCQkJCVwKKwkJc3dpdGNoKGZtdC0+Um1hc2sgfCBmbXQtPkdtYXNrIHwgZm10LT5CbWFzaykgewkJXAorCQljYXNlIDB4ZmZmZjoJCQkJCQlcCisJCSAgICBpZihmbXQtPkdtYXNrID09IDB4MDdlMAkJCQlcCisJCSAgICAgICB8fCBmbXQtPlJtYXNrID09IDB4MDdlMAkJCQlcCisJCSAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4MDdlMCkgewkJCVwKKwkJCWlmKGFscGhhID09IDEyOCkJCQkJXAorCQkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjVfNTApOwlcCisJCQllbHNlIHsJCQkJCQlcCisJCQkgICAgaWYoU0RMX0hhc01NWCgpKQkJCQlcCisJCQkJYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NU1NWCk7CVwKKwkJCSAgICBlbHNlCQkJCQlcCisJCQkJYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NSk7CVwKKwkJCX0JCQkJCQlcCisJCSAgICB9IGVsc2UJCQkJCQlcCisJCQlnb3RvIGdlbmVyYWwxNjsJCQkJCVwKKwkJICAgIGJyZWFrOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwkJY2FzZSAweDdmZmY6CQkJCQkJXAorCQkgICAgaWYoZm10LT5HbWFzayA9PSAweDAzZTAJCQkJXAorCQkgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDAzZTAJCQkJXAorCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDAzZTApIHsJCQlcCisJCQlpZihhbHBoYSA9PSAxMjgpCQkJCVwKKwkJCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1XzUwKTsJXAorCQkJZWxzZSB7CQkJCQkJXAorCQkJICAgIGlmKFNETF9IYXNNTVgoKSkJCQkJXAorCQkJCWJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTVNTVgpOwlcCisJCQkgICAgZWxzZQkJCQkJXAorCQkJCWJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTUpOwlcCisJCQl9CQkJCQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQkgICAgfQkJCQkJCQlcCisJCSAgICAvKiBmYWxsdGhyb3VnaCAqLwkJCQkJXAorCQkJCQkJCQkJXAorCQlkZWZhdWx0OgkJCQkJCVwKKwkJZ2VuZXJhbDE2OgkJCQkJCVwKKwkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCisJCX0JCQkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCQkJCQkJCQkJXAorCSAgICBjYXNlIDM6CQkJCQkJCVwKKwkJYmxpdHRlcigzLCBVaW50OCwgQUxQSEFfQkxJVF9BTlkpOwkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkgICAgY2FzZSA0OgkJCQkJCQlcCisJCWlmKChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spID09IDB4MDBmZmZmZmYJXAorCQkgICAmJiAoZm10LT5HbWFzayA9PSAweGZmMDAgfHwgZm10LT5SbWFzayA9PSAweGZmMDAJXAorCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweGZmMDApKSB7CQkJXAorCQkgICAgaWYoYWxwaGEgPT0gMTI4KQkJCQkJXAorCQkgICAgewkJCQkJCQlcCisJCQlpZihTRExfSGFzTU1YKCkpCQkJCVwKKwkJCQlibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OF81ME1NWCk7XAorCQkJZWxzZQkJCQkJCVwKKwkJCQlibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OF81MCk7XAorCQkgICAgfQkJCQkJCQlcCisJCSAgICBlbHNlCQkJCQkJXAorCQkgICAgewkJCQkJCQlcCisJCQlpZihTRExfSGFzTU1YKCkpCQkJCVwKKwkJCQlibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OE1NWCk7XAorCQkJZWxzZQkJCQkJCVwKKwkJCQlibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OCk7CVwKKwkJICAgIH0JCQkJCQkJXAorCQl9IGVsc2UJCQkJCQkJXAorCQkgICAgYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfSB3aGlsZSgwKQorCisjZWxzZQorCQorI2RlZmluZSBDSE9PU0VfQkxJVChibGl0dGVyLCBhbHBoYSwgZm10KQkJCQlcCisgICAgZG8gewkJCQkJCQkJXAorICAgICAgICBpZihhbHBoYSA9PSAyNTUpIHsJCQkJCQlcCisJICAgIHN3aXRjaChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsJCQkJXAorCSAgICBjYXNlIDE6IGJsaXR0ZXIoMSwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCisJICAgIGNhc2UgMjogYmxpdHRlcigyLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKKwkgICAgY2FzZSAzOiBibGl0dGVyKDMsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAorCSAgICBjYXNlIDQ6IGJsaXR0ZXIoNCwgVWludDE2LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAorCSAgICB9CQkJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCSAgICBzd2l0Y2goZm10LT5CeXRlc1BlclBpeGVsKSB7CQkJCVwKKwkgICAgY2FzZSAxOgkJCQkJCQlcCisJCS8qIE5vIDhicHAgYWxwaGEgYmxpdHRpbmcgKi8JCQkJXAorCQlicmVhazsJCQkJCQkJXAorCQkJCQkJCQkJXAorCSAgICBjYXNlIDI6CQkJCQkJCVwKKwkJc3dpdGNoKGZtdC0+Um1hc2sgfCBmbXQtPkdtYXNrIHwgZm10LT5CbWFzaykgewkJXAorCQljYXNlIDB4ZmZmZjoJCQkJCQlcCisJCSAgICBpZihmbXQtPkdtYXNrID09IDB4MDdlMAkJCQlcCisJCSAgICAgICB8fCBmbXQtPlJtYXNrID09IDB4MDdlMAkJCQlcCisJCSAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4MDdlMCkgewkJCVwKKwkJCWlmKGFscGhhID09IDEyOCkJCQkJXAorCQkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjVfNTApOwlcCisJCQllbHNlIHsJCQkJCQlcCisJCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NSk7CVwKKwkJCX0JCQkJCQlcCisJCSAgICB9IGVsc2UJCQkJCQlcCisJCQlnb3RvIGdlbmVyYWwxNjsJCQkJCVwKKwkJICAgIGJyZWFrOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwkJY2FzZSAweDdmZmY6CQkJCQkJXAorCQkgICAgaWYoZm10LT5HbWFzayA9PSAweDAzZTAJCQkJXAorCQkgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDAzZTAJCQkJXAorCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDAzZTApIHsJCQlcCisJCQlpZihhbHBoYSA9PSAxMjgpCQkJCVwKKwkJCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1XzUwKTsJXAorCQkJZWxzZSB7CQkJCQkJXAorCQkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTUpOwlcCisJCQl9CQkJCQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQkgICAgfQkJCQkJCQlcCisJCSAgICAvKiBmYWxsdGhyb3VnaCAqLwkJCQkJXAorCQkJCQkJCQkJXAorCQlkZWZhdWx0OgkJCQkJCVwKKwkJZ2VuZXJhbDE2OgkJCQkJCVwKKwkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCisJCX0JCQkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCQkJCQkJCQkJXAorCSAgICBjYXNlIDM6CQkJCQkJCVwKKwkJYmxpdHRlcigzLCBVaW50OCwgQUxQSEFfQkxJVF9BTlkpOwkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkgICAgY2FzZSA0OgkJCQkJCQlcCisJCWlmKChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spID09IDB4MDBmZmZmZmYJXAorCQkgICAmJiAoZm10LT5HbWFzayA9PSAweGZmMDAgfHwgZm10LT5SbWFzayA9PSAweGZmMDAJXAorCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweGZmMDApKSB7CQkJXAorCQkgICAgaWYoYWxwaGEgPT0gMTI4KQkJCQkJXAorCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODhfNTApOwlcCisJCSAgICBlbHNlCQkJCQkJXAorCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODgpOwkJXAorCQl9IGVsc2UJCQkJCQkJXAorCQkgICAgYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfSB3aGlsZSgwKQorCisjZW5kaWYKKworLyoKKyAqIFRoaXMgdGFrZXMgY2FyZSBvZiB0aGUgY2FzZSB3aGVuIHRoZSBzdXJmYWNlIGlzIGNsaXBwZWQgb24gdGhlIGxlZnQgYW5kL29yCisgKiByaWdodC4gVG9wIGNsaXBwaW5nIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZi4KKyAqLworc3RhdGljIHZvaWQgUkxFQ2xpcEJsaXQoaW50IHcsIFVpbnQ4ICpzcmNidWYsIFNETF9TdXJmYWNlICpkc3QsCisJCQlVaW50OCAqZHN0YnVmLCBTRExfUmVjdCAqc3JjcmVjdCwgdW5zaWduZWQgYWxwaGEpCit7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpmbXQgPSBkc3QtPmZvcm1hdDsKKworI2RlZmluZSBSTEVDTElQQkxJVChicHAsIFR5cGUsIGRvX2JsaXQpCQkJCQkgICBcCisgICAgZG8gewkJCQkJCQkJICAgXAorCWludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOwkJCQkJICAgXAorCWludCBvZnMgPSAwOwkJCQkJCQkgICBcCisJaW50IGxlZnQgPSBzcmNyZWN0LT54OwkJCQkJCSAgIFwKKwlpbnQgcmlnaHQgPSBsZWZ0ICsgc3JjcmVjdC0+dzsJCQkJCSAgIFwKKwlkc3RidWYgLT0gbGVmdCAqIGJwcDsJCQkJCQkgICBcCisJZm9yKDs7KSB7CQkJCQkJCSAgIFwKKwkgICAgaW50IHJ1bjsJCQkJCQkJICAgXAorCSAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOwkJCQkJICAgXAorCSAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOwkJCQkJICAgXAorCSAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsJCQkJCSAgIFwKKwkgICAgaWYocnVuKSB7CQkJCQkJCSAgIFwKKwkJLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovCQkJICAgXAorCQlpZihvZnMgPCByaWdodCkgewkJCQkJICAgXAorCQkgICAgaW50IHN0YXJ0ID0gMDsJCQkJCSAgIFwKKwkJICAgIGludCBsZW4gPSBydW47CQkJCQkgICBcCisJCSAgICBpbnQgc3RhcnRjb2w7CQkJCQkgICBcCisJCSAgICBpZihsZWZ0IC0gb2ZzID4gMCkgewkJCQkgICBcCisJCQlzdGFydCA9IGxlZnQgLSBvZnM7CQkJCSAgIFwKKwkJCWxlbiAtPSBzdGFydDsJCQkJCSAgIFwKKwkJCWlmKGxlbiA8PSAwKQkJCQkJICAgXAorCQkJICAgIGdvdG8gbm9jb3B5ICMjIGJwcCAjIyBkb19ibGl0OwkJICAgXAorCQkgICAgfQkJCQkJCQkgICBcCisJCSAgICBzdGFydGNvbCA9IG9mcyArIHN0YXJ0OwkJCQkgICBcCisJCSAgICBpZihsZW4gPiByaWdodCAtIHN0YXJ0Y29sKQkJCQkgICBcCisJCQlsZW4gPSByaWdodCAtIHN0YXJ0Y29sOwkJCQkgICBcCisJCSAgICBkb19ibGl0KGRzdGJ1ZiArIHN0YXJ0Y29sICogYnBwLCBzcmNidWYgKyBzdGFydCAqIGJwcCwgXAorCQkJICAgIGxlbiwgYnBwLCBhbHBoYSk7CQkJCSAgIFwKKwkJfQkJCQkJCQkgICBcCisJICAgIG5vY29weSAjIyBicHAgIyMgZG9fYmxpdDoJCQkJCSAgIFwKKwkJc3JjYnVmICs9IHJ1biAqIGJwcDsJCQkJCSAgIFwKKwkJb2ZzICs9IHJ1bjsJCQkJCQkgICBcCisJICAgIH0gZWxzZSBpZighb2ZzKQkJCQkJCSAgIFwKKwkJYnJlYWs7CQkJCQkJCSAgIFwKKwkgICAgaWYob2ZzID09IHcpIHsJCQkJCQkgICBcCisJCW9mcyA9IDA7CQkJCQkJICAgXAorCQlkc3RidWYgKz0gZHN0LT5waXRjaDsJCQkJCSAgIFwKKwkJaWYoIS0tbGluZWNvdW50KQkJCQkJICAgXAorCQkgICAgYnJlYWs7CQkJCQkJICAgXAorCSAgICB9CQkJCQkJCQkgICBcCisJfQkJCQkJCQkJICAgXAorICAgIH0gd2hpbGUoMCkKKworICAgIENIT09TRV9CTElUKFJMRUNMSVBCTElULCBhbHBoYSwgZm10KTsKKworI3VuZGVmIFJMRUNMSVBCTElUCisKK30KKworCisvKiBibGl0IGEgY29sb3JrZXllZCBSTEUgc3VyZmFjZSAqLworaW50IFNETF9STEVCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAorCQlTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCkKK3sKKwlVaW50OCAqZHN0YnVmOworCVVpbnQ4ICpzcmNidWY7CisJaW50IHgsIHk7CisJaW50IHcgPSBzcmMtPnc7CisJdW5zaWduZWQgYWxwaGE7CisKKwkvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIFNETF9NVVNUTE9DSyhkc3QpICkgeworCQlpZiAoIFNETF9Mb2NrU3VyZmFjZShkc3QpIDwgMCApIHsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisKKwkvKiBTZXQgdXAgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KKwl4ID0gZHN0cmVjdC0+eDsKKwl5ID0gZHN0cmVjdC0+eTsKKwlkc3RidWYgPSAoVWludDggKilkc3QtPnBpeGVscworCSAgICAgICAgICsgeSAqIGRzdC0+cGl0Y2ggKyB4ICogc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJc3JjYnVmID0gKFVpbnQ4ICopc3JjLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhOworCisJeworCSAgICAvKiBza2lwIGxpbmVzIGF0IHRoZSB0b3AgaWYgbmVjY2Vzc2FyeSAqLworCSAgICBpbnQgdnNraXAgPSBzcmNyZWN0LT55OworCSAgICBpbnQgb2ZzID0gMDsKKwkgICAgaWYodnNraXApIHsKKworI2RlZmluZSBSTEVTS0lQKGJwcCwgVHlwZSkJCQlcCisJCWZvcig7OykgewkJCVwKKwkJICAgIGludCBydW47CQkJXAorCQkgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsJXAorCQkgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsJXAorCQkgICAgc3JjYnVmICs9IHNpemVvZihUeXBlKSAqIDI7CVwKKwkJICAgIGlmKHJ1bikgewkJCVwKKwkJCXNyY2J1ZiArPSBydW4gKiBicHA7CVwKKwkJCW9mcyArPSBydW47CQlcCisJCSAgICB9IGVsc2UgaWYoIW9mcykJCVwKKwkJCWdvdG8gZG9uZTsJCVwKKwkJICAgIGlmKG9mcyA9PSB3KSB7CQlcCisJCQlvZnMgPSAwOwkJXAorCQkJaWYoIS0tdnNraXApCQlcCisJCQkgICAgYnJlYWs7CQlcCisJCSAgICB9CQkJCVwKKwkJfQorCisJCXN3aXRjaChzcmMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCkgeworCQljYXNlIDE6IFJMRVNLSVAoMSwgVWludDgpOyBicmVhazsKKwkJY2FzZSAyOiBSTEVTS0lQKDIsIFVpbnQ4KTsgYnJlYWs7CisJCWNhc2UgMzogUkxFU0tJUCgzLCBVaW50OCk7IGJyZWFrOworCQljYXNlIDQ6IFJMRVNLSVAoNCwgVWludDE2KTsgYnJlYWs7CisJCX0KKworI3VuZGVmIFJMRVNLSVAKKworCSAgICB9CisJfQorCisJYWxwaGEgPSAoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBCisJICAgICAgICA/IHNyYy0+Zm9ybWF0LT5hbHBoYSA6IDI1NTsKKwkvKiBpZiBsZWZ0IG9yIHJpZ2h0IGVkZ2UgY2xpcHBpbmcgbmVlZGVkLCBjYWxsIGNsaXAgYmxpdCAqLworCWlmICggc3JjcmVjdC0+eCB8fCBzcmNyZWN0LT53ICE9IHNyYy0+dyApIHsKKwkgICAgUkxFQ2xpcEJsaXQodywgc3JjYnVmLCBkc3QsIGRzdGJ1Ziwgc3JjcmVjdCwgYWxwaGEpOworCX0gZWxzZSB7CisJICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gc3JjLT5mb3JtYXQ7CisKKyNkZWZpbmUgUkxFQkxJVChicHAsIFR5cGUsIGRvX2JsaXQpCQkJCQkgICAgICBcCisJICAgIGRvIHsJCQkJCQkJICAgICAgXAorCQlpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsJCQkJICAgICAgXAorCQlpbnQgb2ZzID0gMDsJCQkJCQkgICAgICBcCisJCWZvcig7OykgewkJCQkJCSAgICAgIFwKKwkJICAgIHVuc2lnbmVkIHJ1bjsJCQkJCSAgICAgIFwKKwkJICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7CQkJCSAgICAgIFwKKwkJICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07CQkJCSAgICAgIFwKKwkJICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKFR5cGUpOwkJCQkgICAgICBcCisJCSAgICBpZihydW4pIHsJCQkJCQkgICAgICBcCisJCQlkb19ibGl0KGRzdGJ1ZiArIG9mcyAqIGJwcCwgc3JjYnVmLCBydW4sIGJwcCwgYWxwaGEpOyBcCisJCQlzcmNidWYgKz0gcnVuICogYnBwOwkJCQkgICAgICBcCisJCQlvZnMgKz0gcnVuOwkJCQkJICAgICAgXAorCQkgICAgfSBlbHNlIGlmKCFvZnMpCQkJCQkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICBpZihvZnMgPT0gdykgewkJCQkJICAgICAgXAorCQkJb2ZzID0gMDsJCQkJCSAgICAgIFwKKwkJCWRzdGJ1ZiArPSBkc3QtPnBpdGNoOwkJCQkgICAgICBcCisJCQlpZighLS1saW5lY291bnQpCQkJCSAgICAgIFwKKwkJCSAgICBicmVhazsJCQkJCSAgICAgIFwKKwkJICAgIH0JCQkJCQkJICAgICAgXAorCQl9CQkJCQkJCSAgICAgIFwKKwkgICAgfSB3aGlsZSgwKQorCisJICAgIENIT09TRV9CTElUKFJMRUJMSVQsIGFscGhhLCBmbXQpOworCisjdW5kZWYgUkxFQkxJVAorCX0KKworZG9uZToKKwkvKiBVbmxvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLworCWlmICggU0RMX01VU1RMT0NLKGRzdCkgKSB7CisJCVNETF9VbmxvY2tTdXJmYWNlKGRzdCk7CisJfQorCXJldHVybigwKTsKK30KKworI3VuZGVmIE9QQVFVRV9CTElUCisKKy8qCisgKiBQZXItcGl4ZWwgYmxpdHRpbmcgbWFjcm9zIGZvciB0cmFuc2x1Y2VudCBwaXhlbHM6CisgKiBUaGVzZSB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlcyBhcyB0aGUgcGVyLXN1cmZhY2UgYmxpdHRpbmcgbWFjcm9zCisgKi8KKworLyoKKyAqIEZvciAzMmJwcCBwaXhlbHMsIHdlIGhhdmUgbWFkZSBzdXJlIHRoZSBhbHBoYSBpcyBzdG9yZWQgaW4gdGhlIHRvcAorICogOCBiaXRzLCBzbyBwcm9jZWVkIGFzIHVzdWFsCisgKi8KKyNkZWZpbmUgQkxJVF9UUkFOU0xfODg4KHNyYywgZHN0KQkJCQlcCisgICAgZG8gewkJCQkJCQlcCisgICAgICAgIFVpbnQzMiBzID0gc3JjOwkJCQkJCVwKKwlVaW50MzIgZCA9IGRzdDsJCQkJCQlcCisJdW5zaWduZWQgYWxwaGEgPSBzID4+IDI0OwkJCQlcCisJVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOwkJCQlcCisJVWludDMyIGQxID0gZCAmIDB4ZmYwMGZmOwkJCQlcCisJZDEgPSAoZDEgKyAoKHMxIC0gZDEpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwZmY7CVwKKwlzICY9IDB4ZmYwMDsJCQkJCQlcCisJZCAmPSAweGZmMDA7CQkJCQkJXAorCWQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOwkJXAorCWRzdCA9IGQxIHwgZDsJCQkJCQlcCisgICAgfSB3aGlsZSgwKQorCisvKgorICogRm9yIDE2YnBwIHBpeGVscywgd2UgaGF2ZSBzdG9yZWQgdGhlIDUgbW9zdCBzaWduaWZpY2FudCBhbHBoYSBiaXRzIGluCisgKiBiaXRzIDUtMTAuIEFzIGJlZm9yZSwgd2UgY2FuIHByb2Nlc3MgYWxsIDMgUkdCIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KKyAqLworI2RlZmluZSBCTElUX1RSQU5TTF81NjUoc3JjLCBkc3QpCQlcCisgICAgZG8gewkJCQkJXAorCVVpbnQzMiBzID0gc3JjOwkJCQlcCisJVWludDMyIGQgPSBkc3Q7CQkJCVwKKwl1bnNpZ25lZCBhbHBoYSA9IChzICYgMHgzZTApID4+IDU7CVwKKwlzICY9IDB4MDdlMGY4MWY7CQkJXAorCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsJCVwKKwlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OwkJXAorCWQgJj0gMHgwN2UwZjgxZjsJCQlcCisJZHN0ID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOwkJCVwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQkxJVF9UUkFOU0xfNTU1KHNyYywgZHN0KQkJXAorICAgIGRvIHsJCQkJCVwKKwlVaW50MzIgcyA9IHNyYzsJCQkJXAorCVVpbnQzMiBkID0gZHN0OwkJCQlcCisJdW5zaWduZWQgYWxwaGEgPSAocyAmIDB4M2UwKSA+PiA1OwlcCisJcyAmPSAweDAzZTA3YzFmOwkJCVwKKwlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7CQlcCisJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsJCVwKKwlkICY9IDB4MDNlMDdjMWY7CQkJXAorCWRzdCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsJCQlcCisgICAgfSB3aGlsZSgwKQorCisvKiB1c2VkIHRvIHNhdmUgdGhlIGRlc3RpbmF0aW9uIGZvcm1hdCBpbiB0aGUgZW5jb2RpbmcuIERlc2lnbmVkIHRvIGJlCisgICBtYWNyby1jb21wYXRpYmxlIHdpdGggU0RMX1BpeGVsRm9ybWF0IGJ1dCB3aXRob3V0IHRoZSB1bm5lZWRlZCBmaWVsZHMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlVaW50OCAgQnl0ZXNQZXJQaXhlbDsKKwlVaW50OCAgUmxvc3M7CisJVWludDggIEdsb3NzOworCVVpbnQ4ICBCbG9zczsKKwlVaW50OCAgUnNoaWZ0OworCVVpbnQ4ICBHc2hpZnQ7CisJVWludDggIEJzaGlmdDsKKwlVaW50OCAgQXNoaWZ0OworCVVpbnQzMiBSbWFzazsKKwlVaW50MzIgR21hc2s7CisJVWludDMyIEJtYXNrOworCVVpbnQzMiBBbWFzazsKK30gUkxFRGVzdEZvcm1hdDsKKworLyogYmxpdCBhIHBpeGVsLWFscGhhIFJMRSBzdXJmYWNlIGNsaXBwZWQgYXQgdGhlIHJpZ2h0IGFuZC9vciBsZWZ0IGVkZ2VzICovCitzdGF0aWMgdm9pZCBSTEVBbHBoYUNsaXBCbGl0KGludCB3LCBVaW50OCAqc3JjYnVmLCBTRExfU3VyZmFjZSAqZHN0LAorCQkJICAgICBVaW50OCAqZHN0YnVmLCBTRExfUmVjdCAqc3JjcmVjdCkKK3sKKyAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gZHN0LT5mb3JtYXQ7CisgICAgLyoKKyAgICAgKiBjbGlwcGVkIGJsaXR0ZXI6IFB0eXBlIGlzIHRoZSBkZXN0aW5hdGlvbiBwaXhlbCB0eXBlLAorICAgICAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlIG1hY3JvCisgICAgICogdG8gYmxlbmQgb25lIHBpeGVsLgorICAgICAqLworI2RlZmluZSBSTEVBTFBIQUNMSVBCTElUKFB0eXBlLCBDdHlwZSwgZG9fYmxlbmQpCQkJICBcCisgICAgZG8gewkJCQkJCQkJICBcCisJaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7CQkJCQkgIFwKKwlpbnQgbGVmdCA9IHNyY3JlY3QtPng7CQkJCQkJICBcCisJaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7CQkJCQkgIFwKKwlkc3RidWYgLT0gbGVmdCAqIHNpemVvZihQdHlwZSk7CQkJCQkgIFwKKwlkbyB7CQkJCQkJCQkgIFwKKwkgICAgaW50IG9mcyA9IDA7CQkJCQkJICBcCisJICAgIC8qIGJsaXQgb3BhcXVlIHBpeGVscyBvbiBvbmUgbGluZSAqLwkJCSAgXAorCSAgICBkbyB7CQkJCQkJCSAgXAorCQl1bnNpZ25lZCBydW47CQkJCQkJICBcCisJCW9mcyArPSAoKEN0eXBlICopc3JjYnVmKVswXTsJCQkJICBcCisJCXJ1biA9ICgoQ3R5cGUgKilzcmNidWYpWzFdOwkJCQkgIFwKKwkJc3JjYnVmICs9IDIgKiBzaXplb2YoQ3R5cGUpOwkJCQkgIFwKKwkJaWYocnVuKSB7CQkJCQkJICBcCisJCSAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8JCSAgXAorCQkgICAgaW50IGNvZnMgPSBvZnM7CQkJCQkgIFwKKwkJICAgIGludCBjcnVuID0gcnVuOwkJCQkJICBcCisJCSAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsJCQkJICBcCisJCQljcnVuIC09IGxlZnQgLSBjb2ZzOwkJCQkgIFwKKwkJCWNvZnMgPSBsZWZ0OwkJCQkJICBcCisJCSAgICB9CQkJCQkJCSAgXAorCQkgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykJCQkJICBcCisJCQljcnVuID0gcmlnaHQgLSBjb2ZzOwkJCQkgIFwKKwkJICAgIGlmKGNydW4gPiAwKQkJCQkJICBcCisJCQlQSVhFTF9DT1BZKGRzdGJ1ZiArIGNvZnMgKiBzaXplb2YoUHR5cGUpLAkgIFwKKwkJCQkgICBzcmNidWYgKyAoY29mcyAtIG9mcykgKiBzaXplb2YoUHR5cGUpLCBcCisJCQkJICAgKHVuc2lnbmVkKWNydW4sIHNpemVvZihQdHlwZSkpOwkgIFwKKwkJICAgIHNyY2J1ZiArPSBydW4gKiBzaXplb2YoUHR5cGUpOwkJCSAgXAorCQkgICAgb2ZzICs9IHJ1bjsJCQkJCQkgIFwKKwkJfSBlbHNlIGlmKCFvZnMpCQkJCQkJICBcCisJCSAgICByZXR1cm47CQkJCQkJICBcCisJICAgIH0gd2hpbGUob2ZzIDwgdyk7CQkJCQkJICBcCisJICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8JCQkJICBcCisJICAgIGlmKHNpemVvZihQdHlwZSkgPT0gMikJCQkJCSAgXAorCQlzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOwkJCSAgXAorCSAgICAvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovCQkgIFwKKwkgICAgb2ZzID0gMDsJCQkJCQkJICBcCisJICAgIGRvIHsJCQkJCQkJICBcCisJCXVuc2lnbmVkIHJ1bjsJCQkJCQkgIFwKKwkJb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsJCQkJICBcCisJCXJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsJCQkJICBcCisJCXNyY2J1ZiArPSA0OwkJCQkJCSAgXAorCQlpZihydW4pIHsJCQkJCQkgIFwKKwkJICAgIC8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLwkJICBcCisJCSAgICBpbnQgY29mcyA9IG9mczsJCQkJCSAgXAorCQkgICAgaW50IGNydW4gPSBydW47CQkJCQkgIFwKKwkJICAgIGlmKGxlZnQgLSBjb2ZzID4gMCkgewkJCQkgIFwKKwkJCWNydW4gLT0gbGVmdCAtIGNvZnM7CQkJCSAgXAorCQkJY29mcyA9IGxlZnQ7CQkJCQkgIFwKKwkJICAgIH0JCQkJCQkJICBcCisJCSAgICBpZihjcnVuID4gcmlnaHQgLSBjb2ZzKQkJCQkgIFwKKwkJCWNydW4gPSByaWdodCAtIGNvZnM7CQkJCSAgXAorCQkgICAgaWYoY3J1biA+IDApIHsJCQkJCSAgXAorCQkJUHR5cGUgKmRzdCA9IChQdHlwZSAqKWRzdGJ1ZiArIGNvZnM7CQkgIFwKKwkJCVVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKXNyY2J1ZiArIChjb2ZzIC0gb2ZzKTsJICBcCisJCQlpbnQgaTsJCQkJCQkgIFwKKwkJCWZvcihpID0gMDsgaSA8IGNydW47IGkrKykJCQkgIFwKKwkJCSAgICBkb19ibGVuZChzcmNbaV0sIGRzdFtpXSk7CQkJICBcCisJCSAgICB9CQkJCQkJCSAgXAorCQkgICAgc3JjYnVmICs9IHJ1biAqIDQ7CQkJCQkgIFwKKwkJICAgIG9mcyArPSBydW47CQkJCQkJICBcCisJCX0JCQkJCQkJICBcCisJICAgIH0gd2hpbGUob2ZzIDwgdyk7CQkJCQkJICBcCisJICAgIGRzdGJ1ZiArPSBkc3QtPnBpdGNoOwkJCQkJICBcCisJfSB3aGlsZSgtLWxpbmVjb3VudCk7CQkJCQkJICBcCisgICAgfSB3aGlsZSgwKQorCisgICAgc3dpdGNoKGRmLT5CeXRlc1BlclBpeGVsKSB7CisgICAgY2FzZSAyOgorCWlmKGRmLT5HbWFzayA9PSAweDA3ZTAgfHwgZGYtPlJtYXNrID09IDB4MDdlMAorCSAgIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApCisJICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTY1KTsKKwllbHNlCisJICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTU1KTsKKwlicmVhazsKKyAgICBjYXNlIDQ6CisJUkxFQUxQSEFDTElQQkxJVChVaW50MzIsIFVpbnQxNiwgQkxJVF9UUkFOU0xfODg4KTsKKwlicmVhazsKKyAgICB9Cit9CisKKy8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSAqLworaW50IFNETF9STEVBbHBoYUJsaXQoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCisJCSAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50IHcgPSBzcmMtPnc7CisgICAgVWludDggKnNyY2J1ZiwgKmRzdGJ1ZjsKKyAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gZHN0LT5mb3JtYXQ7CisKKyAgICAvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoIFNETF9NVVNUTE9DSyhkc3QpICkgeworCWlmICggU0RMX0xvY2tTdXJmYWNlKGRzdCkgPCAwICkgeworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIHggPSBkc3RyZWN0LT54OworICAgIHkgPSBkc3RyZWN0LT55OworICAgIGRzdGJ1ZiA9IChVaW50OCAqKWRzdC0+cGl4ZWxzCisJICAgICArIHkgKiBkc3QtPnBpdGNoICsgeCAqIGRmLT5CeXRlc1BlclBpeGVsOworICAgIHNyY2J1ZiA9IChVaW50OCAqKXNyYy0+bWFwLT5zd19kYXRhLT5hdXhfZGF0YSArIHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKKworICAgIHsKKwkvKiBza2lwIGxpbmVzIGF0IHRoZSB0b3AgaWYgbmVjZXNzYXJ5ICovCisJaW50IHZza2lwID0gc3JjcmVjdC0+eTsKKwlpZih2c2tpcCkgeworCSAgICBpbnQgb2ZzOworCSAgICBpZihkZi0+Qnl0ZXNQZXJQaXhlbCA9PSAyKSB7CisJCS8qIHRoZSAxNi8zMiBpbnRlcmxlYXZlZCBmb3JtYXQgKi8KKwkJZG8geworCQkgICAgLyogc2tpcCBvcGFxdWUgbGluZSAqLworCQkgICAgb2ZzID0gMDsKKwkJICAgIGRvIHsKKwkJCWludCBydW47CisJCQlvZnMgKz0gc3JjYnVmWzBdOworCQkJcnVuID0gc3JjYnVmWzFdOworCQkJc3JjYnVmICs9IDI7CisJCQlpZihydW4pIHsKKwkJCSAgICBzcmNidWYgKz0gMiAqIHJ1bjsKKwkJCSAgICBvZnMgKz0gcnVuOworCQkJfSBlbHNlIGlmKCFvZnMpCisJCQkgICAgZ290byBkb25lOworCQkgICAgfSB3aGlsZShvZnMgPCB3KTsKKworCQkgICAgLyogc2tpcCBwYWRkaW5nICovCisJCSAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOworCisJCSAgICAvKiBza2lwIHRyYW5zbHVjZW50IGxpbmUgKi8KKwkJICAgIG9mcyA9IDA7CisJCSAgICBkbyB7CisJCQlpbnQgcnVuOworCQkJb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsKKwkJCXJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsKKwkJCXNyY2J1ZiArPSA0ICogKHJ1biArIDEpOworCQkJb2ZzICs9IHJ1bjsKKwkJICAgIH0gd2hpbGUob2ZzIDwgdyk7CisJCX0gd2hpbGUoLS12c2tpcCk7CisJICAgIH0gZWxzZSB7CisJCS8qIHRoZSAzMi8zMiBpbnRlcmxlYXZlZCBmb3JtYXQgKi8KKwkJdnNraXAgPDw9IDE7CS8qIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgaGF2ZSBzYW1lIGZvcm1hdCAqLworCQlkbyB7CisJCSAgICBvZnMgPSAwOworCQkgICAgZG8geworCQkJaW50IHJ1bjsKKwkJCW9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07CisJCQlydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07CisJCQlzcmNidWYgKz0gNDsKKwkJCWlmKHJ1bikgeworCQkJICAgIHNyY2J1ZiArPSA0ICogcnVuOworCQkJICAgIG9mcyArPSBydW47CisJCQl9IGVsc2UgaWYoIW9mcykKKwkJCSAgICBnb3RvIGRvbmU7CisJCSAgICB9IHdoaWxlKG9mcyA8IHcpOworCQl9IHdoaWxlKC0tdnNraXApOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIGlmIGxlZnQgb3IgcmlnaHQgZWRnZSBjbGlwcGluZyBuZWVkZWQsIGNhbGwgY2xpcCBibGl0ICovCisgICAgaWYoc3JjcmVjdC0+eCB8fCBzcmNyZWN0LT53ICE9IHNyYy0+dykgeworCVJMRUFscGhhQ2xpcEJsaXQodywgc3JjYnVmLCBkc3QsIGRzdGJ1Ziwgc3JjcmVjdCk7CisgICAgfSBlbHNlIHsKKworCS8qCisJICogbm9uLWNsaXBwZWQgYmxpdHRlci4gUHR5cGUgaXMgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHR5cGUsCisJICogQ3R5cGUgdGhlIHRyYW5zbHVjZW50IGNvdW50IHR5cGUsIGFuZCBkb19ibGVuZCB0aGUKKwkgKiBtYWNybyB0byBibGVuZCBvbmUgcGl4ZWwuCisJICovCisjZGVmaW5lIFJMRUFMUEhBQkxJVChQdHlwZSwgQ3R5cGUsIGRvX2JsZW5kKQkJCQkgXAorCWRvIHsJCQkJCQkJCSBcCisJICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOwkJCQkJIFwKKwkgICAgZG8gewkJCQkJCQkgXAorCQlpbnQgb2ZzID0gMDsJCQkJCQkgXAorCQkvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8JCQkgXAorCQlkbyB7CQkJCQkJCSBcCisJCSAgICB1bnNpZ25lZCBydW47CQkJCQkgXAorCQkgICAgb2ZzICs9ICgoQ3R5cGUgKilzcmNidWYpWzBdOwkJCSBcCisJCSAgICBydW4gPSAoKEN0eXBlICopc3JjYnVmKVsxXTsJCQkJIFwKKwkJICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKEN0eXBlKTsJCQkgXAorCQkgICAgaWYocnVuKSB7CQkJCQkJIFwKKwkJCVBJWEVMX0NPUFkoZHN0YnVmICsgb2ZzICogc2l6ZW9mKFB0eXBlKSwgc3JjYnVmLCBcCisJCQkJICAgcnVuLCBzaXplb2YoUHR5cGUpKTsJCQkgXAorCQkJc3JjYnVmICs9IHJ1biAqIHNpemVvZihQdHlwZSk7CQkJIFwKKwkJCW9mcyArPSBydW47CQkJCQkgXAorCQkgICAgfSBlbHNlIGlmKCFvZnMpCQkJCQkgXAorCQkJZ290byBkb25lOwkJCQkJIFwKKwkJfSB3aGlsZShvZnMgPCB3KTsJCQkJCSBcCisJCS8qIHNraXAgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8JCQkJIFwKKwkJaWYoc2l6ZW9mKFB0eXBlKSA9PSAyKQkJCQkJIFwKKwkJICAgIHNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7CQkgCSBcCisJCS8qIGJsaXQgdHJhbnNsdWNlbnQgcGl4ZWxzIG9uIHRoZSBzYW1lIGxpbmUgKi8JCSBcCisJCW9mcyA9IDA7CQkJCQkJIFwKKwkJZG8gewkJCQkJCQkgXAorCQkgICAgdW5zaWduZWQgcnVuOwkJCQkJIFwKKwkJICAgIG9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07CQkJIFwKKwkJICAgIHJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsJCQkgXAorCQkgICAgc3JjYnVmICs9IDQ7CQkJCQkgXAorCQkgICAgaWYocnVuKSB7CQkJCQkJIFwKKwkJCVB0eXBlICpkc3QgPSAoUHR5cGUgKilkc3RidWYgKyBvZnM7CQkgXAorCQkJdW5zaWduZWQgaTsJCQkJCSBcCisJCQlmb3IoaSA9IDA7IGkgPCBydW47IGkrKykgewkJCSBcCisJCQkgICAgVWludDMyIHNyYyA9ICooVWludDMyICopc3JjYnVmOwkJIFwKKwkJCSAgICBkb19ibGVuZChzcmMsICpkc3QpOwkJCSBcCisJCQkgICAgc3JjYnVmICs9IDQ7CQkJCSBcCisJCQkgICAgZHN0Kys7CQkJCQkgXAorCQkJfQkJCQkJCSBcCisJCQlvZnMgKz0gcnVuOwkJCQkJIFwKKwkJICAgIH0JCQkJCQkJIFwKKwkJfSB3aGlsZShvZnMgPCB3KTsJCQkJCSBcCisJCWRzdGJ1ZiArPSBkc3QtPnBpdGNoOwkJCQkJIFwKKwkgICAgfSB3aGlsZSgtLWxpbmVjb3VudCk7CQkJCQkgXAorCX0gd2hpbGUoMCkKKworCXN3aXRjaChkZi0+Qnl0ZXNQZXJQaXhlbCkgeworCWNhc2UgMjoKKwkgICAgaWYoZGYtPkdtYXNrID09IDB4MDdlMCB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwCisJICAgICAgIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApCisJCVJMRUFMUEhBQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NjUpOworCSAgICBlbHNlCisJCVJMRUFMUEhBQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NTUpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIFJMRUFMUEhBQkxJVChVaW50MzIsIFVpbnQxNiwgQkxJVF9UUkFOU0xfODg4KTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworIGRvbmU6CisgICAgLyogVW5sb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoIFNETF9NVVNUTE9DSyhkc3QpICkgeworCVNETF9VbmxvY2tTdXJmYWNlKGRzdCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogQXV4aWxpYXJ5IGZ1bmN0aW9uczoKKyAqIFRoZSBlbmNvZGluZyBmdW5jdGlvbnMgdGFrZSAzMmJwcCByZ2IgKyBhLCBhbmQKKyAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCisgKiBUaGUgZGVjb2RpbmcgZnVuY3Rpb25zIGNvcHkgdG8gMzJicHAgcmdiICsgYSwgYW5kCisgKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgZnJvbSB0aGUgc291cmNlLgorICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpbiB0aGUgZW5jb2RlciBhbmQgdW4tUkxFIGNvZGUgYW5kIGFyZSB0aGVyZWZvcmUgbm90CisgKiBoaWdobHkgb3B0aW1pc2VkLgorICovCisKKy8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMTZicHAgcmdiLCBsb3NpbmcgYWxwaGEgKi8KK3N0YXRpYyBpbnQgY29weV9vcGFxdWVfMTYodm9pZCAqZHN0LCBVaW50MzIgKnNyYywgaW50IG4sCisJCQkgIFNETF9QaXhlbEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQoreworICAgIGludCBpOworICAgIFVpbnQxNiAqZCA9IGRzdDsKKyAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwl1bnNpZ25lZCByLCBnLCBiOworCVJHQl9GUk9NX1BJWEVMKCpzcmMsIHNmbXQsIHIsIGcsIGIpOworCVBJWEVMX0ZST01fUkdCKCpkLCBkZm10LCByLCBnLCBiKTsKKwlzcmMrKzsKKwlkKys7CisgICAgfQorICAgIHJldHVybiBuICogMjsKK30KKworLyogZGVjb2RlIG9wYXF1ZSBwaXhlbHMgZnJvbSAxNmJwcCB0byAzMmJwcCByZ2IgKyBhICovCitzdGF0aWMgaW50IHVuY29weV9vcGFxdWVfMTYoVWludDMyICpkc3QsIHZvaWQgKnNyYywgaW50IG4sCisJCQkgICAgUkxFRGVzdEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQoreworICAgIGludCBpOworICAgIFVpbnQxNiAqcyA9IHNyYzsKKyAgICB1bnNpZ25lZCBhbHBoYSA9IGRmbXQtPkFtYXNrID8gMjU1IDogMDsKKyAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwl1bnNpZ25lZCByLCBnLCBiOworCVJHQl9GUk9NX1BJWEVMKCpzLCBzZm10LCByLCBnLCBiKTsKKwlQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYWxwaGEpOworCXMrKzsKKwlkc3QrKzsKKyAgICB9CisgICAgcmV0dXJuIG4gKiAyOworfQorCisKKworLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAzMmJwcCBHMFJBQiBmb3JtYXQgZm9yIGJsaXR0aW5nIGludG8gNTY1ICovCitzdGF0aWMgaW50IGNvcHlfdHJhbnNsXzU2NSh2b2lkICpkc3QsIFVpbnQzMiAqc3JjLCBpbnQgbiwKKwkJCSAgIFNETF9QaXhlbEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQoreworICAgIGludCBpOworICAgIFVpbnQzMiAqZCA9IGRzdDsKKyAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwl1bnNpZ25lZCByLCBnLCBiLCBhOworCVVpbnQxNiBwaXg7CisJUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CisJUElYRUxfRlJPTV9SR0IocGl4LCBkZm10LCByLCBnLCBiKTsKKwkqZCA9ICgocGl4ICYgMHg3ZTApIDw8IDE2KSB8IChwaXggJiAweGY4MWYpIHwgKChhIDw8IDIpICYgMHg3ZTApOworCXNyYysrOworCWQrKzsKKyAgICB9CisgICAgcmV0dXJuIG4gKiA0OworfQorCisvKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDMyYnBwIEcwUkFCIGZvcm1hdCBmb3IgYmxpdHRpbmcgaW50byA1NTUgKi8KK3N0YXRpYyBpbnQgY29weV90cmFuc2xfNTU1KHZvaWQgKmRzdCwgVWludDMyICpzcmMsIGludCBuLAorCQkJICAgU0RMX1BpeGVsRm9ybWF0ICpzZm10LCBTRExfUGl4ZWxGb3JtYXQgKmRmbXQpCit7CisgICAgaW50IGk7CisgICAgVWludDMyICpkID0gZHN0OworICAgIGZvcihpID0gMDsgaSA8IG47IGkrKykgeworCXVuc2lnbmVkIHIsIGcsIGIsIGE7CisJVWludDE2IHBpeDsKKwlSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKKwlQSVhFTF9GUk9NX1JHQihwaXgsIGRmbXQsIHIsIGcsIGIpOworCSpkID0gKChwaXggJiAweDNlMCkgPDwgMTYpIHwgKHBpeCAmIDB4ZmMxZikgfCAoKGEgPDwgMikgJiAweDNlMCk7CisJc3JjKys7CisJZCsrOworICAgIH0KKyAgICByZXR1cm4gbiAqIDQ7Cit9CisKKy8qIGRlY29kZSB0cmFuc2x1Y2VudCBwaXhlbHMgZnJvbSAzMmJwcCBHT1JBQiB0byAzMmJwcCByZ2IgKyBhICovCitzdGF0aWMgaW50IHVuY29weV90cmFuc2xfMTYoVWludDMyICpkc3QsIHZvaWQgKnNyYywgaW50IG4sCisJCQkgICAgUkxFRGVzdEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQoreworICAgIGludCBpOworICAgIFVpbnQzMiAqcyA9IHNyYzsKKyAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwl1bnNpZ25lZCByLCBnLCBiLCBhOworCVVpbnQzMiBwaXggPSAqcysrOworCWEgPSAocGl4ICYgMHgzZTApID4+IDI7CisJcGl4ID0gKHBpeCAmIH4weDNlMCkgfCBwaXggPj4gMTY7CisJUkdCX0ZST01fUElYRUwocGl4LCBzZm10LCByLCBnLCBiKTsKKwlQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYSk7CisJZHN0Kys7CisgICAgfQorICAgIHJldHVybiBuICogNDsKK30KKworLyogZW5jb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCitzdGF0aWMgaW50IGNvcHlfMzIodm9pZCAqZHN0LCBVaW50MzIgKnNyYywgaW50IG4sCisJCSAgIFNETF9QaXhlbEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQoreworICAgIGludCBpOworICAgIFVpbnQzMiAqZCA9IGRzdDsKKyAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwl1bnNpZ25lZCByLCBnLCBiLCBhOworCVVpbnQzMiBwaXhlbDsKKwlSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKKwlQSVhFTF9GUk9NX1JHQihwaXhlbCwgZGZtdCwgciwgZywgYik7CisJKmQrKyA9IHBpeGVsIHwgYSA8PCAyNDsKKwlzcmMrKzsKKyAgICB9CisgICAgcmV0dXJuIG4gKiA0OworfQorCisvKiBkZWNvZGUgMzJicHAgcmdiYSBpbnRvIDMyYnBwIHJnYmEsIGtlZXBpbmcgYWxwaGEgKGR1YWwgcHVycG9zZSkgKi8KK3N0YXRpYyBpbnQgdW5jb3B5XzMyKFVpbnQzMiAqZHN0LCB2b2lkICpzcmMsIGludCBuLAorCQkgICAgIFJMRURlc3RGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKK3sKKyAgICBpbnQgaTsKKyAgICBVaW50MzIgKnMgPSBzcmM7CisgICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJdW5zaWduZWQgciwgZywgYiwgYTsKKwlVaW50MzIgcGl4ZWwgPSAqcysrOworCVJHQl9GUk9NX1BJWEVMKHBpeGVsLCBzZm10LCByLCBnLCBiKTsKKwlhID0gcGl4ZWwgPj4gMjQ7CisJUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGEpOworCWRzdCsrOworICAgIH0KKyAgICByZXR1cm4gbiAqIDQ7Cit9CisKKyNkZWZpbmUgSVNPUEFRVUUocGl4ZWwsIGZtdCkgKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSA9PSAyNTUpCisKKyNkZWZpbmUgSVNUUkFOU0wocGl4ZWwsIGZtdCkJXAorICAgICgodW5zaWduZWQpKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSAtIDFVKSA8IDI1NFUpCisKKy8qIGNvbnZlcnQgc3VyZmFjZSB0byBiZSBxdWlja2x5IGFscGhhLWJsaXR0YWJsZSBvbnRvIGRlc3QsIGlmIHBvc3NpYmxlICovCitzdGF0aWMgaW50IFJMRUFscGhhU3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgICBTRExfU3VyZmFjZSAqZGVzdDsKKyAgICBTRExfUGl4ZWxGb3JtYXQgKmRmOworICAgIGludCBtYXhzaXplID0gMDsKKyAgICBpbnQgbWF4X29wYXF1ZV9ydW47CisgICAgaW50IG1heF90cmFuc2xfcnVuID0gNjU1MzU7CisgICAgdW5zaWduZWQgbWFza3N1bTsKKyAgICBVaW50OCAqcmxlYnVmLCAqZHN0OworICAgIGludCAoKmNvcHlfb3BhcXVlKSh2b2lkICosIFVpbnQzMiAqLCBpbnQsCisJCSAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOworICAgIGludCAoKmNvcHlfdHJhbnNsKSh2b2lkICosIFVpbnQzMiAqLCBpbnQsCisJCSAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOworCisgICAgZGVzdCA9IHN1cmZhY2UtPm1hcC0+ZHN0OworICAgIGlmKCFkZXN0KQorCXJldHVybiAtMTsKKyAgICBkZiA9IGRlc3QtPmZvcm1hdDsKKyAgICBpZihzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSAzMikKKwlyZXR1cm4gLTE7CQkvKiBvbmx5IDMyYnBwIHNvdXJjZSBzdXBwb3J0ZWQgKi8KKworICAgIC8qIGZpbmQgb3V0IHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIGlzIG9uZSB3ZSBzdXBwb3J0LAorICAgICAgIGFuZCBkZXRlcm1pbmUgdGhlIG1heCBzaXplIG9mIHRoZSBlbmNvZGVkIHJlc3VsdCAqLworICAgIG1hc2tzdW0gPSBkZi0+Um1hc2sgfCBkZi0+R21hc2sgfCBkZi0+Qm1hc2s7CisgICAgc3dpdGNoKGRmLT5CeXRlc1BlclBpeGVsKSB7CisgICAgY2FzZSAyOgorCS8qIDE2YnBwOiBvbmx5IHN1cHBvcnQgNTY1IGFuZCA1NTUgZm9ybWF0cyAqLworCXN3aXRjaChtYXNrc3VtKSB7CisJY2FzZSAweGZmZmY6CisJICAgIGlmKGRmLT5HbWFzayA9PSAweDA3ZTAKKwkgICAgICAgfHwgZGYtPlJtYXNrID09IDB4MDdlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKSB7CisJCWNvcHlfb3BhcXVlID0gY29weV9vcGFxdWVfMTY7CisJCWNvcHlfdHJhbnNsID0gY29weV90cmFuc2xfNTY1OworCSAgICB9IGVsc2UKKwkJcmV0dXJuIC0xOworCSAgICBicmVhazsKKwljYXNlIDB4N2ZmZjoKKwkgICAgaWYoZGYtPkdtYXNrID09IDB4MDNlMAorCSAgICAgICB8fCBkZi0+Um1hc2sgPT0gMHgwM2UwIHx8IGRmLT5CbWFzayA9PSAweDAzZTApIHsKKwkJY29weV9vcGFxdWUgPSBjb3B5X29wYXF1ZV8xNjsKKwkJY29weV90cmFuc2wgPSBjb3B5X3RyYW5zbF81NTU7CisJICAgIH0gZWxzZQorCQlyZXR1cm4gLTE7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHJldHVybiAtMTsKKwl9CisJbWF4X29wYXF1ZV9ydW4gPSAyNTU7CS8qIHJ1bnMgc3RvcmVkIGFzIGJ5dGVzICovCisKKwkvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgcGl4ZWxzLAorCSAgIHdpdGggcm9vbSBmb3IgYWxpZ25tZW50IHBhZGRpbmcgYmV0d2VlbiBsaW5lcyAqLworCW1heHNpemUgPSBzdXJmYWNlLT5oICogKDIgKyAoNCArIDIpICogKHN1cmZhY2UtPncgKyAxKSkgKyAyOworCWJyZWFrOworICAgIGNhc2UgNDoKKwlpZihtYXNrc3VtICE9IDB4MDBmZmZmZmYpCisJICAgIHJldHVybiAtMTsJCS8qIHJlcXVpcmVzIHVudXNlZCBoaWdoIGJ5dGUgKi8KKwljb3B5X29wYXF1ZSA9IGNvcHlfMzI7CisJY29weV90cmFuc2wgPSBjb3B5XzMyOworCW1heF9vcGFxdWVfcnVuID0gMjU1OwkvKiBydW5zIHN0b3JlZCBhcyBzaG9ydCBpbnRzICovCisKKwkvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgcGl4ZWxzICovCisJbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAyICogNCAqIChzdXJmYWNlLT53ICsgMSkgKyA0OworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIC0xOwkJLyogYW55dGhpbmcgZWxzZSB1bnN1cHBvcnRlZCByaWdodCBub3cgKi8KKyAgICB9CisKKyAgICBtYXhzaXplICs9IHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKKyAgICBybGVidWYgPSAoVWludDggKilTRExfbWFsbG9jKG1heHNpemUpOworICAgIGlmKCFybGVidWYpIHsKKwlTRExfT3V0T2ZNZW1vcnkoKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIHsKKwkvKiBzYXZlIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgc28gd2UgY2FuIHVuZG8gdGhlIGVuY29kaW5nIGxhdGVyICovCisJUkxFRGVzdEZvcm1hdCAqciA9IChSTEVEZXN0Rm9ybWF0ICopcmxlYnVmOworCXItPkJ5dGVzUGVyUGl4ZWwgPSBkZi0+Qnl0ZXNQZXJQaXhlbDsKKwlyLT5SbG9zcyA9IGRmLT5SbG9zczsKKwlyLT5HbG9zcyA9IGRmLT5HbG9zczsKKwlyLT5CbG9zcyA9IGRmLT5CbG9zczsKKwlyLT5Sc2hpZnQgPSBkZi0+UnNoaWZ0OworCXItPkdzaGlmdCA9IGRmLT5Hc2hpZnQ7CisJci0+QnNoaWZ0ID0gZGYtPkJzaGlmdDsKKwlyLT5Bc2hpZnQgPSBkZi0+QXNoaWZ0OworCXItPlJtYXNrID0gZGYtPlJtYXNrOworCXItPkdtYXNrID0gZGYtPkdtYXNrOworCXItPkJtYXNrID0gZGYtPkJtYXNrOworCXItPkFtYXNrID0gZGYtPkFtYXNrOworICAgIH0KKyAgICBkc3QgPSBybGVidWYgKyBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CisKKyAgICAvKiBEbyB0aGUgYWN0dWFsIGVuY29kaW5nICovCisgICAgeworCWludCB4LCB5OworCWludCBoID0gc3VyZmFjZS0+aCwgdyA9IHN1cmZhY2UtPnc7CisJU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKKwlVaW50MzIgKnNyYyA9IChVaW50MzIgKilzdXJmYWNlLT5waXhlbHM7CisJVWludDggKmxhc3RsaW5lID0gZHN0OwkvKiBlbmQgb2YgbGFzdCBub24tYmxhbmsgbGluZSAqLworCisJLyogb3BhcXVlIGNvdW50cyBhcmUgOCBvciAxNiBiaXRzLCBkZXBlbmRpbmcgb24gdGFyZ2V0IGRlcHRoICovCisjZGVmaW5lIEFERF9PUEFRVUVfQ09VTlRTKG4sIG0pCQkJXAorCWlmKGRmLT5CeXRlc1BlclBpeGVsID09IDQpIHsJCVwKKwkgICAgKChVaW50MTYgKilkc3QpWzBdID0gbjsJCVwKKwkgICAgKChVaW50MTYgKilkc3QpWzFdID0gbTsJCVwKKwkgICAgZHN0ICs9IDQ7CQkJCVwKKwl9IGVsc2UgewkJCQlcCisJICAgIGRzdFswXSA9IG47CQkJCVwKKwkgICAgZHN0WzFdID0gbTsJCQkJXAorCSAgICBkc3QgKz0gMjsJCQkJXAorCX0KKworCS8qIHRyYW5zbHVjZW50IGNvdW50cyBhcmUgYWx3YXlzIDE2IGJpdCAqLworI2RlZmluZSBBRERfVFJBTlNMX0NPVU5UUyhuLCBtKQkJXAorCSgoKFVpbnQxNiAqKWRzdClbMF0gPSBuLCAoKFVpbnQxNiAqKWRzdClbMV0gPSBtLCBkc3QgKz0gNCkKKworCWZvcih5ID0gMDsgeSA8IGg7IHkrKykgeworCSAgICBpbnQgcnVuc3RhcnQsIHNraXBzdGFydDsKKwkgICAgaW50IGJsYW5rbGluZSA9IDA7CisJICAgIC8qIEZpcnN0IGVuY29kZSBhbGwgb3BhcXVlIHBpeGVscyBvZiBhIHNjYW4gbGluZSAqLworCSAgICB4ID0gMDsKKwkgICAgZG8geworCQlpbnQgcnVuLCBza2lwLCBsZW47CisJCXNraXBzdGFydCA9IHg7CisJCXdoaWxlKHggPCB3ICYmICFJU09QQVFVRShzcmNbeF0sIHNmKSkKKwkJICAgIHgrKzsKKwkJcnVuc3RhcnQgPSB4OworCQl3aGlsZSh4IDwgdyAmJiBJU09QQVFVRShzcmNbeF0sIHNmKSkKKwkJICAgIHgrKzsKKwkJc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OworCQlpZihza2lwID09IHcpCisJCSAgICBibGFua2xpbmUgPSAxOworCQlydW4gPSB4IC0gcnVuc3RhcnQ7CisJCXdoaWxlKHNraXAgPiBtYXhfb3BhcXVlX3J1bikgeworCQkgICAgQUREX09QQVFVRV9DT1VOVFMobWF4X29wYXF1ZV9ydW4sIDApOworCQkgICAgc2tpcCAtPSBtYXhfb3BhcXVlX3J1bjsKKwkJfQorCQlsZW4gPSBNSU4ocnVuLCBtYXhfb3BhcXVlX3J1bik7CisJCUFERF9PUEFRVUVfQ09VTlRTKHNraXAsIGxlbik7CisJCWRzdCArPSBjb3B5X29wYXF1ZShkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CisJCXJ1bnN0YXJ0ICs9IGxlbjsKKwkJcnVuIC09IGxlbjsKKwkJd2hpbGUocnVuKSB7CisJCSAgICBsZW4gPSBNSU4ocnVuLCBtYXhfb3BhcXVlX3J1bik7CisJCSAgICBBRERfT1BBUVVFX0NPVU5UUygwLCBsZW4pOworCQkgICAgZHN0ICs9IGNvcHlfb3BhcXVlKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKKwkJICAgIHJ1bnN0YXJ0ICs9IGxlbjsKKwkJICAgIHJ1biAtPSBsZW47CisJCX0KKwkgICAgfSB3aGlsZSh4IDwgdyk7CisKKwkgICAgLyogTWFrZSBzdXJlIHRoZSBuZXh0IG91dHB1dCBhZGRyZXNzIGlzIDMyLWJpdCBhbGlnbmVkICovCisJICAgIGRzdCArPSAodWludHB0cl90KWRzdCAmIDI7CisKKwkgICAgLyogTmV4dCwgZW5jb2RlIGFsbCB0cmFuc2x1Y2VudCBwaXhlbHMgb2YgdGhlIHNhbWUgc2NhbiBsaW5lICovCisJICAgIHggPSAwOworCSAgICBkbyB7CisJCWludCBydW4sIHNraXAsIGxlbjsKKwkJc2tpcHN0YXJ0ID0geDsKKwkJd2hpbGUoeCA8IHcgJiYgIUlTVFJBTlNMKHNyY1t4XSwgc2YpKQorCQkgICAgeCsrOworCQlydW5zdGFydCA9IHg7CisJCXdoaWxlKHggPCB3ICYmIElTVFJBTlNMKHNyY1t4XSwgc2YpKQorCQkgICAgeCsrOworCQlza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CisJCWJsYW5rbGluZSAmPSAoc2tpcCA9PSB3KTsKKwkJcnVuID0geCAtIHJ1bnN0YXJ0OworCQl3aGlsZShza2lwID4gbWF4X3RyYW5zbF9ydW4pIHsKKwkJICAgIEFERF9UUkFOU0xfQ09VTlRTKG1heF90cmFuc2xfcnVuLCAwKTsKKwkJICAgIHNraXAgLT0gbWF4X3RyYW5zbF9ydW47CisJCX0KKwkJbGVuID0gTUlOKHJ1biwgbWF4X3RyYW5zbF9ydW4pOworCQlBRERfVFJBTlNMX0NPVU5UUyhza2lwLCBsZW4pOworCQlkc3QgKz0gY29weV90cmFuc2woZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOworCQlydW5zdGFydCArPSBsZW47CisJCXJ1biAtPSBsZW47CisJCXdoaWxlKHJ1bikgeworCQkgICAgbGVuID0gTUlOKHJ1biwgbWF4X3RyYW5zbF9ydW4pOworCQkgICAgQUREX1RSQU5TTF9DT1VOVFMoMCwgbGVuKTsKKwkJICAgIGRzdCArPSBjb3B5X3RyYW5zbChkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CisJCSAgICBydW5zdGFydCArPSBsZW47CisJCSAgICBydW4gLT0gbGVuOworCQl9CisJCWlmKCFibGFua2xpbmUpCisJCSAgICBsYXN0bGluZSA9IGRzdDsKKwkgICAgfSB3aGlsZSh4IDwgdyk7CisKKwkgICAgc3JjICs9IHN1cmZhY2UtPnBpdGNoID4+IDI7CisJfQorCWRzdCA9IGxhc3RsaW5lOwkJLyogYmFjayB1cCBwYXN0IHRyYWlsaW5nIGJsYW5rIGxpbmVzICovCisJQUREX09QQVFVRV9DT1VOVFMoMCwgMCk7CisgICAgfQorCisjdW5kZWYgQUREX09QQVFVRV9DT1VOVFMKKyN1bmRlZiBBRERfVFJBTlNMX0NPVU5UUworCisgICAgLyogTm93IHRoYXQgd2UgaGF2ZSBpdCBlbmNvZGVkLCByZWxlYXNlIHRoZSBvcmlnaW5hbCBwaXhlbHMgKi8KKyAgICBpZigoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpICE9IFNETF9QUkVBTExPQworICAgICAgICYmIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICE9IFNETF9IV1NVUkZBQ0UpIHsKKwlTRExfZnJlZSggc3VyZmFjZS0+cGl4ZWxzICk7CisJc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiByZWFsbG9jIHRoZSBidWZmZXIgdG8gcmVsZWFzZSB1bnVzZWQgbWVtb3J5ICovCisgICAgeworCVVpbnQ4ICpwID0gU0RMX3JlYWxsb2MocmxlYnVmLCBkc3QgLSBybGVidWYpOworCWlmKCFwKQorCSAgICBwID0gcmxlYnVmOworCXN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGEgPSBwOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgVWludDMyIGdldHBpeF84KFVpbnQ4ICpzcmNidWYpCit7CisgICAgcmV0dXJuICpzcmNidWY7Cit9CisKK3N0YXRpYyBVaW50MzIgZ2V0cGl4XzE2KFVpbnQ4ICpzcmNidWYpCit7CisgICAgcmV0dXJuICooVWludDE2ICopc3JjYnVmOworfQorCitzdGF0aWMgVWludDMyIGdldHBpeF8yNChVaW50OCAqc3JjYnVmKQoreworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KKyAgICByZXR1cm4gc3JjYnVmWzBdICsgKHNyY2J1ZlsxXSA8PCA4KSArIChzcmNidWZbMl0gPDwgMTYpOworI2Vsc2UKKyAgICByZXR1cm4gKHNyY2J1ZlswXSA8PCAxNikgKyAoc3JjYnVmWzFdIDw8IDgpICsgc3JjYnVmWzJdOworI2VuZGlmCit9CisKK3N0YXRpYyBVaW50MzIgZ2V0cGl4XzMyKFVpbnQ4ICpzcmNidWYpCit7CisgICAgcmV0dXJuICooVWludDMyICopc3JjYnVmOworfQorCit0eXBlZGVmIFVpbnQzMiAoKmdldHBpeF9mdW5jKShVaW50OCAqKTsKKworc3RhdGljIGdldHBpeF9mdW5jIGdldHBpeGVzWzRdID0geworICAgIGdldHBpeF84LCBnZXRwaXhfMTYsIGdldHBpeF8yNCwgZ2V0cGl4XzMyCit9OworCitzdGF0aWMgaW50IFJMRUNvbG9ya2V5U3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgICAgICAgVWludDggKnJsZWJ1ZiwgKmRzdDsKKwlpbnQgbWF4bjsKKwlpbnQgeTsKKwlVaW50OCAqc3JjYnVmLCAqbGFzdGxpbmU7CisJaW50IG1heHNpemUgPSAwOworCWludCBicHAgPSBzdXJmYWNlLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJZ2V0cGl4X2Z1bmMgZ2V0cGl4OworCVVpbnQzMiBja2V5LCByZ2JtYXNrOworCWludCB3LCBoOworCisJLyogY2FsY3VsYXRlIHRoZSB3b3JzdCBjYXNlIHNpemUgZm9yIHRoZSBjb21wcmVzc2VkIHN1cmZhY2UgKi8KKwlzd2l0Y2goYnBwKSB7CisJY2FzZSAxOgorCSAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgcGl4ZWxzLAorCSAgICAgICBzdGFydGluZyB3aXRoIGFuIG9wYXF1ZSBwaXhlbCAqLworCSAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqIDMgKiAoc3VyZmFjZS0+dyAvIDIgKyAxKSArIDI7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwljYXNlIDM6CisJICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCAyNTUgcGl4ZWxzIHdpZGUgKi8KKwkgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoMiAqIChzdXJmYWNlLT53IC8gMjU1ICsgMSkKKwkJCQkgICAgKyBzdXJmYWNlLT53ICogYnBwKSArIDI7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgLyogd29yc3QgY2FzZSBpcyBzb2xpZCBydW5zLCBhdCBtb3N0IDY1NTM1IHBpeGVscyB3aWRlICovCisJICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDQgKiAoc3VyZmFjZS0+dyAvIDY1NTM1ICsgMSkKKwkJCQkgICAgKyBzdXJmYWNlLT53ICogNCkgKyA0OworCSAgICBicmVhazsKKwl9CisKKwlybGVidWYgPSAoVWludDggKilTRExfbWFsbG9jKG1heHNpemUpOworCWlmICggcmxlYnVmID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFNldCB1cCB0aGUgY29udmVyc2lvbiAqLworCXNyY2J1ZiA9IChVaW50OCAqKXN1cmZhY2UtPnBpeGVsczsKKwltYXhuID0gYnBwID09IDQgPyA2NTUzNSA6IDI1NTsKKwlkc3QgPSBybGVidWY7CisJcmdibWFzayA9IH5zdXJmYWNlLT5mb3JtYXQtPkFtYXNrOworCWNrZXkgPSBzdXJmYWNlLT5mb3JtYXQtPmNvbG9ya2V5ICYgcmdibWFzazsKKwlsYXN0bGluZSA9IGRzdDsKKwlnZXRwaXggPSBnZXRwaXhlc1ticHAgLSAxXTsKKwl3ID0gc3VyZmFjZS0+dzsKKwloID0gc3VyZmFjZS0+aDsKKworI2RlZmluZSBBRERfQ09VTlRTKG4sIG0pCQkJXAorCWlmKGJwcCA9PSA0KSB7CQkJCVwKKwkgICAgKChVaW50MTYgKilkc3QpWzBdID0gbjsJCVwKKwkgICAgKChVaW50MTYgKilkc3QpWzFdID0gbTsJCVwKKwkgICAgZHN0ICs9IDQ7CQkJCVwKKwl9IGVsc2UgewkJCQlcCisJICAgIGRzdFswXSA9IG47CQkJCVwKKwkgICAgZHN0WzFdID0gbTsJCQkJXAorCSAgICBkc3QgKz0gMjsJCQkJXAorCX0KKworCWZvcih5ID0gMDsgeSA8IGg7IHkrKykgeworCSAgICBpbnQgeCA9IDA7CisJICAgIGludCBibGFua2xpbmUgPSAwOworCSAgICBkbyB7CisJCWludCBydW4sIHNraXAsIGxlbjsKKwkJaW50IHJ1bnN0YXJ0OworCQlpbnQgc2tpcHN0YXJ0ID0geDsKKworCQkvKiBmaW5kIHJ1biBvZiB0cmFuc3BhcmVudCwgdGhlbiBvcGFxdWUgcGl4ZWxzICovCisJCXdoaWxlKHggPCB3ICYmIChnZXRwaXgoc3JjYnVmICsgeCAqIGJwcCkgJiByZ2JtYXNrKSA9PSBja2V5KQorCQkgICAgeCsrOworCQlydW5zdGFydCA9IHg7CisJCXdoaWxlKHggPCB3ICYmIChnZXRwaXgoc3JjYnVmICsgeCAqIGJwcCkgJiByZ2JtYXNrKSAhPSBja2V5KQorCQkgICAgeCsrOworCQlza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CisJCWlmKHNraXAgPT0gdykKKwkJICAgIGJsYW5rbGluZSA9IDE7CisJCXJ1biA9IHggLSBydW5zdGFydDsKKworCQkvKiBlbmNvZGUgc2VnbWVudCAqLworCQl3aGlsZShza2lwID4gbWF4bikgeworCQkgICAgQUREX0NPVU5UUyhtYXhuLCAwKTsKKwkJICAgIHNraXAgLT0gbWF4bjsKKwkJfQorCQlsZW4gPSBNSU4ocnVuLCBtYXhuKTsKKwkJQUREX0NPVU5UUyhza2lwLCBsZW4pOworCQlTRExfbWVtY3B5KGRzdCwgc3JjYnVmICsgcnVuc3RhcnQgKiBicHAsIGxlbiAqIGJwcCk7CisJCWRzdCArPSBsZW4gKiBicHA7CisJCXJ1biAtPSBsZW47CisJCXJ1bnN0YXJ0ICs9IGxlbjsKKwkJd2hpbGUocnVuKSB7CisJCSAgICBsZW4gPSBNSU4ocnVuLCBtYXhuKTsKKwkJICAgIEFERF9DT1VOVFMoMCwgbGVuKTsKKwkJICAgIFNETF9tZW1jcHkoZHN0LCBzcmNidWYgKyBydW5zdGFydCAqIGJwcCwgbGVuICogYnBwKTsKKwkJICAgIGRzdCArPSBsZW4gKiBicHA7CisJCSAgICBydW5zdGFydCArPSBsZW47CisJCSAgICBydW4gLT0gbGVuOworCQl9CisJCWlmKCFibGFua2xpbmUpCisJCSAgICBsYXN0bGluZSA9IGRzdDsKKwkgICAgfSB3aGlsZSh4IDwgdyk7CisKKwkgICAgc3JjYnVmICs9IHN1cmZhY2UtPnBpdGNoOworCX0KKwlkc3QgPSBsYXN0bGluZTsJCS8qIGJhY2sgdXAgYmFzdCB0cmFpbGluZyBibGFuayBsaW5lcyAqLworCUFERF9DT1VOVFMoMCwgMCk7CisKKyN1bmRlZiBBRERfQ09VTlRTCisKKwkvKiBOb3cgdGhhdCB3ZSBoYXZlIGl0IGVuY29kZWQsIHJlbGVhc2UgdGhlIG9yaWdpbmFsIHBpeGVscyAqLworCWlmKChzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykgIT0gU0RMX1BSRUFMTE9DCisJICAgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gU0RMX0hXU1VSRkFDRSkgeworCSAgICBTRExfZnJlZSggc3VyZmFjZS0+cGl4ZWxzICk7CisJICAgIHN1cmZhY2UtPnBpeGVscyA9IE5VTEw7CisJfQorCisJLyogcmVhbGxvYyB0aGUgYnVmZmVyIHRvIHJlbGVhc2UgdW51c2VkIG1lbW9yeSAqLworCXsKKwkgICAgLyogSWYgcmVhbGxvYyByZXR1cm5zIE5VTEwsIHRoZSBvcmlnaW5hbCBibG9jayBpcyBsZWZ0IGludGFjdCAqLworCSAgICBVaW50OCAqcCA9IFNETF9yZWFsbG9jKHJsZWJ1ZiwgZHN0IC0gcmxlYnVmKTsKKwkgICAgaWYoIXApCisJCXAgPSBybGVidWY7CisJICAgIHN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGEgPSBwOworCX0KKworCXJldHVybigwKTsKK30KKworaW50IFNETF9STEVTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWludCByZXRjb2RlOworCisJLyogQ2xlYXIgYW55IHByZXZpb3VzIFJMRSBjb252ZXJzaW9uICovCisJaWYgKCAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwpID09IFNETF9STEVBQ0NFTCApIHsKKwkJU0RMX1VuUkxFU3VyZmFjZShzdXJmYWNlLCAxKTsKKwl9CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IFJMRSBlbmNvZGluZyBvZiBiaXRtYXBzICovCisJaWYgKCBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDggKSB7CisJCXJldHVybigtMSk7CisJfQorCisJLyogTG9jayB0aGUgc3VyZmFjZSBpZiBpdCdzIGluIGhhcmR3YXJlICovCisJaWYgKCBTRExfTVVTVExPQ0soc3VyZmFjZSkgKSB7CisJCWlmICggU0RMX0xvY2tTdXJmYWNlKHN1cmZhY2UpIDwgMCApIHsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisKKwkvKiBFbmNvZGUgKi8KKwlpZigoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSkgeworCSAgICByZXRjb2RlID0gUkxFQ29sb3JrZXlTdXJmYWNlKHN1cmZhY2UpOworCX0gZWxzZSB7CisJICAgIGlmKChzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBCisJICAgICAgICYmIHN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgIT0gMCkKKwkJcmV0Y29kZSA9IFJMRUFscGhhU3VyZmFjZShzdXJmYWNlKTsKKwkgICAgZWxzZQorCQlyZXRjb2RlID0gLTE7CS8qIG5vIFJMRSBmb3IgcGVyLXN1cmZhY2UgYWxwaGEgc2FucyBja2V5ICovCisJfQorCisJLyogVW5sb2NrIHRoZSBzdXJmYWNlIGlmIGl0J3MgaW4gaGFyZHdhcmUgKi8KKwlpZiAoIFNETF9NVVNUTE9DSyhzdXJmYWNlKSApIHsKKwkJU0RMX1VubG9ja1N1cmZhY2Uoc3VyZmFjZSk7CisJfQorCisJaWYocmV0Y29kZSA8IDApCisJICAgIHJldHVybiAtMTsKKworCS8qIFRoZSBzdXJmYWNlIGlzIG5vdyBhY2NlbGVyYXRlZCAqLworCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsKKworCXJldHVybigwKTsKK30KKworLyoKKyAqIFVuLVJMRSBhIHN1cmZhY2Ugd2l0aCBwaXhlbCBhbHBoYQorICogVGhpcyBtYXkgbm90IGdpdmUgYmFjayBleGFjdGx5IHRoZSBpbWFnZSBiZWZvcmUgUkxFLWVuY29kaW5nOyBhbGwKKyAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgcGl4ZWxzIHdpbGwgYmUgbG9zdCwgYW5kIGNvbG91ciBhbmQgYWxwaGEgZGVwdGgKKyAqIG1heSBoYXZlIGJlZW4gcmVkdWNlZCAod2hlbiBlbmNvZGluZyBmb3IgMTZicHAgdGFyZ2V0cykuCisgKi8KK3N0YXRpYyBTRExfYm9vbCBVblJMRUFscGhhKFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworICAgIFVpbnQ4ICpzcmNidWY7CisgICAgVWludDMyICpkc3Q7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKKyAgICBSTEVEZXN0Rm9ybWF0ICpkZiA9IHN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGE7CisgICAgaW50ICgqdW5jb3B5X29wYXF1ZSkoVWludDMyICosIHZvaWQgKiwgaW50LAorCQkJIFJMRURlc3RGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOworICAgIGludCAoKnVuY29weV90cmFuc2wpKFVpbnQzMiAqLCB2b2lkICosIGludCwKKwkJCSBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKKyAgICBpbnQgdyA9IHN1cmZhY2UtPnc7CisgICAgaW50IGJwcCA9IGRmLT5CeXRlc1BlclBpeGVsOworCisgICAgaWYoYnBwID09IDIpIHsKKwl1bmNvcHlfb3BhcXVlID0gdW5jb3B5X29wYXF1ZV8xNjsKKwl1bmNvcHlfdHJhbnNsID0gdW5jb3B5X3RyYW5zbF8xNjsKKyAgICB9IGVsc2UgeworCXVuY29weV9vcGFxdWUgPSB1bmNvcHlfdHJhbnNsID0gdW5jb3B5XzMyOworICAgIH0KKworICAgIHN1cmZhY2UtPnBpeGVscyA9IFNETF9tYWxsb2Moc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKKyAgICBpZiAoICFzdXJmYWNlLT5waXhlbHMgKSB7CisgICAgICAgIHJldHVybihTRExfRkFMU0UpOworICAgIH0KKyAgICAvKiBmaWxsIGJhY2tncm91bmQgd2l0aCB0cmFuc3BhcmVudCBwaXhlbHMgKi8KKyAgICBTRExfbWVtc2V0KHN1cmZhY2UtPnBpeGVscywgMCwgc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKKworICAgIGRzdCA9IHN1cmZhY2UtPnBpeGVsczsKKyAgICBzcmNidWYgPSAoVWludDggKikoZGYgKyAxKTsKKyAgICBmb3IoOzspIHsKKwkvKiBjb3B5IG9wYXF1ZSBwaXhlbHMgKi8KKwlpbnQgb2ZzID0gMDsKKwlkbyB7CisJICAgIHVuc2lnbmVkIHJ1bjsKKwkgICAgaWYoYnBwID09IDIpIHsKKwkJb2ZzICs9IHNyY2J1ZlswXTsKKwkJcnVuID0gc3JjYnVmWzFdOworCQlzcmNidWYgKz0gMjsKKwkgICAgfSBlbHNlIHsKKwkJb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsKKwkJcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOworCQlzcmNidWYgKz0gNDsKKwkgICAgfQorCSAgICBpZihydW4pIHsKKwkJc3JjYnVmICs9IHVuY29weV9vcGFxdWUoZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKKwkJb2ZzICs9IHJ1bjsKKwkgICAgfSBlbHNlIGlmKCFvZnMpCisJCXJldHVybihTRExfVFJVRSk7CisJfSB3aGlsZShvZnMgPCB3KTsKKworCS8qIHNraXAgcGFkZGluZyBpZiBuZWVkZWQgKi8KKwlpZihicHAgPT0gMikKKwkgICAgc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsKKwkKKwkvKiBjb3B5IHRyYW5zbHVjZW50IHBpeGVscyAqLworCW9mcyA9IDA7CisJZG8geworCSAgICB1bnNpZ25lZCBydW47CisJICAgIG9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07CisJICAgIHJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsKKwkgICAgc3JjYnVmICs9IDQ7CisJICAgIGlmKHJ1bikgeworCQlzcmNidWYgKz0gdW5jb3B5X3RyYW5zbChkc3QgKyBvZnMsIHNyY2J1ZiwgcnVuLCBkZiwgc2YpOworCQlvZnMgKz0gcnVuOworCSAgICB9CisJfSB3aGlsZShvZnMgPCB3KTsKKwlkc3QgKz0gc3VyZmFjZS0+cGl0Y2ggPj4gMjsKKyAgICB9CisgICAgLyogTWFrZSB0aGUgY29tcGlsZXIgaGFwcHkgKi8KKyAgICByZXR1cm4oU0RMX1RSVUUpOworfQorCit2b2lkIFNETF9VblJMRVN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCByZWNvZGUpCit7CisgICAgaWYgKCAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwpID09IFNETF9STEVBQ0NFTCApIHsKKwlzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1JMRUFDQ0VMOworCisJaWYocmVjb2RlICYmIChzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykgIT0gU0RMX1BSRUFMTE9DCisJICAgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gU0RMX0hXU1VSRkFDRSkgeworCSAgICBpZigoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSkgeworCQlTRExfUmVjdCBmdWxsOworCQl1bnNpZ25lZCBhbHBoYV9mbGFnOworCisJCS8qIHJlLWNyZWF0ZSB0aGUgb3JpZ2luYWwgc3VyZmFjZSAqLworCQlzdXJmYWNlLT5waXhlbHMgPSBTRExfbWFsbG9jKHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7CisJCWlmICggIXN1cmZhY2UtPnBpeGVscyApIHsKKwkJCS8qIE9oIGNyYXAuLi4gKi8KKwkJCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIGZpbGwgaXQgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvdXIgKi8KKwkJU0RMX0ZpbGxSZWN0KHN1cmZhY2UsIE5VTEwsIHN1cmZhY2UtPmZvcm1hdC0+Y29sb3JrZXkpOworCisJCS8qIG5vdyByZW5kZXIgdGhlIGVuY29kZWQgc3VyZmFjZSAqLworCQlmdWxsLnggPSBmdWxsLnkgPSAwOworCQlmdWxsLncgPSBzdXJmYWNlLT53OworCQlmdWxsLmggPSBzdXJmYWNlLT5oOworCQlhbHBoYV9mbGFnID0gc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQUxQSEE7CisJCXN1cmZhY2UtPmZsYWdzICY9IH5TRExfU1JDQUxQSEE7IC8qIG9wYXF1ZSBibGl0ICovCisJCVNETF9STEVCbGl0KHN1cmZhY2UsICZmdWxsLCBzdXJmYWNlLCAmZnVsbCk7CisJCXN1cmZhY2UtPmZsYWdzIHw9IGFscGhhX2ZsYWc7CisJICAgIH0gZWxzZSB7CisJCWlmICggIVVuUkxFQWxwaGEoc3VyZmFjZSkgKSB7CisJCSAgICAvKiBPaCBjcmFwLi4uICovCisJCSAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CisJCSAgICByZXR1cm47CisJCX0KKwkgICAgfQorCX0KKworCWlmICggc3VyZmFjZS0+bWFwICYmIHN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGEgKSB7CisJICAgIFNETF9mcmVlKHN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGEpOworCSAgICBzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhID0gTlVMTDsKKwl9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX1JMRWFjY2VsX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX1JMRWFjY2VsX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYwYzUzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfUkxFYWNjZWxfYy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBVc2VmdWwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZnJvbSBTRExfUkxFYWNjZWwuYyAqLworCitleHRlcm4gaW50IFNETF9STEVTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK2V4dGVybiBpbnQgU0RMX1JMRUJsaXQoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KTsKK2V4dGVybiBpbnQgU0RMX1JMRUFscGhhQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKwkJCSAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCk7CitleHRlcm4gdm9pZCBTRExfVW5STEVTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgcmVjb2RlKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX2JsaXQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX2JsaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2YxOTRhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfYmxpdC5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIlNETF9ibGl0LmgiCisjaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKKyNpbmNsdWRlICJTRExfcGl4ZWxzX2MuaCIKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKSAmJiBTRExfQVNTRU1CTFlfUk9VVElORVMKKyNkZWZpbmUgTU1YX0FTTUJMSVQKKyNpZiAoX19HTlVDX18gPiAyKSAgLyogU1NFIGluc3RydWN0aW9ucyBhcmVuJ3QgaW4gR0NDIDIuICovCisjZGVmaW5lIFNTRV9BU01CTElUCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNTVhfQVNNQkxJVCkKKyNpbmNsdWRlICJTRExfY3B1aW5mby5oIgorI2luY2x1ZGUgIm1teC5oIgorI2VuZGlmCisKKy8qIFRoZSBnZW5lcmFsIHB1cnBvc2Ugc29mdHdhcmUgYmxpdCByb3V0aW5lICovCitzdGF0aWMgaW50IFNETF9Tb2Z0QmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKwkJCVNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KQoreworCWludCBva2F5OworCWludCBzcmNfbG9ja2VkOworCWludCBkc3RfbG9ja2VkOworCisJLyogRXZlcnl0aGluZyBpcyBva2F5IGF0IHRoZSBiZWdpbm5pbmcuLi4gICovCisJb2theSA9IDE7CisKKwkvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCdzIGluIGhhcmR3YXJlICovCisJZHN0X2xvY2tlZCA9IDA7CisJaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKKwkJaWYgKCBTRExfTG9ja1N1cmZhY2UoZHN0KSA8IDAgKSB7CisJCQlva2F5ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWRzdF9sb2NrZWQgPSAxOworCQl9CisJfQorCS8qIExvY2sgdGhlIHNvdXJjZSBpZiBpdCdzIGluIGhhcmR3YXJlICovCisJc3JjX2xvY2tlZCA9IDA7CisJaWYgKCBTRExfTVVTVExPQ0soc3JjKSApIHsKKwkJaWYgKCBTRExfTG9ja1N1cmZhY2Uoc3JjKSA8IDAgKSB7CisJCQlva2F5ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNyY19sb2NrZWQgPSAxOworCQl9CisJfQorCisJLyogU2V0IHVwIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVyIHBvaW50ZXJzLCBhbmQgQkxJVCEgKi8KKwlpZiAoIG9rYXkgICYmIHNyY3JlY3QtPncgJiYgc3JjcmVjdC0+aCApIHsKKwkJU0RMX0JsaXRJbmZvIGluZm87CisJCVNETF9sb2JsaXQgUnVuQmxpdDsKKworCQkvKiBTZXQgdXAgdGhlIGJsaXQgaW5mb3JtYXRpb24gKi8KKwkJaW5mby5zX3BpeGVscyA9IChVaW50OCAqKXNyYy0+cGl4ZWxzICsKKwkJCQkoVWludDE2KXNyY3JlY3QtPnkqc3JjLT5waXRjaCArCisJCQkJKFVpbnQxNilzcmNyZWN0LT54KnNyYy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCQlpbmZvLnNfd2lkdGggPSBzcmNyZWN0LT53OworCQlpbmZvLnNfaGVpZ2h0ID0gc3JjcmVjdC0+aDsKKwkJaW5mby5zX3NraXA9c3JjLT5waXRjaC1pbmZvLnNfd2lkdGgqc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJCWluZm8uZF9waXhlbHMgPSAoVWludDggKilkc3QtPnBpeGVscyArCisJCQkJKFVpbnQxNilkc3RyZWN0LT55KmRzdC0+cGl0Y2ggKworCQkJCShVaW50MTYpZHN0cmVjdC0+eCpkc3QtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKKwkJaW5mby5kX3dpZHRoID0gZHN0cmVjdC0+dzsKKwkJaW5mby5kX2hlaWdodCA9IGRzdHJlY3QtPmg7CisJCWluZm8uZF9za2lwPWRzdC0+cGl0Y2gtaW5mby5kX3dpZHRoKmRzdC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCQlpbmZvLmF1eF9kYXRhID0gc3JjLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhOworCQlpbmZvLnNyYyA9IHNyYy0+Zm9ybWF0OworCQlpbmZvLnRhYmxlID0gc3JjLT5tYXAtPnRhYmxlOworCQlpbmZvLmRzdCA9IGRzdC0+Zm9ybWF0OworCQlSdW5CbGl0ID0gc3JjLT5tYXAtPnN3X2RhdGEtPmJsaXQ7CisKKwkJLyogUnVuIHRoZSBhY3R1YWwgc29mdHdhcmUgYmxpdCAqLworCQlSdW5CbGl0KCZpbmZvKTsKKwl9CisKKwkvKiBXZSBuZWVkIHRvIHVubG9jayB0aGUgc3VyZmFjZXMgaWYgdGhleSdyZSBsb2NrZWQgKi8KKwlpZiAoIGRzdF9sb2NrZWQgKSB7CisJCVNETF9VbmxvY2tTdXJmYWNlKGRzdCk7CisJfQorCWlmICggc3JjX2xvY2tlZCApIHsKKwkJU0RMX1VubG9ja1N1cmZhY2Uoc3JjKTsKKwl9CisJLyogQmxpdCBpcyBkb25lISAqLworCXJldHVybihva2F5ID8gMCA6IC0xKTsKK30KKworI2lmZGVmIE1NWF9BU01CTElUCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIFNETF9tZW1jcHlNTVgoVWludDggKnRvLCBjb25zdCBVaW50OCAqZnJvbSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGk8bGVuLzg7IGkrKykgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIJbW92cSAoJTApLCAlJW1tMFxuIgorCQkiCW1vdnEgJSVtbTAsICglMSlcbiIKKwkJOiA6ICJyIiAoZnJvbSksICJyIiAodG8pIDogIm1lbW9yeSIpOworCQlmcm9tKz04OworCQl0bys9ODsKKwl9CisJaWYgKGxlbiY3KQorCQlTRExfbWVtY3B5KHRvLCBmcm9tLCBsZW4mNyk7Cit9CisKKyNpZmRlZiBTU0VfQVNNQkxJVAorc3RhdGljIF9faW5saW5lX18gdm9pZCBTRExfbWVtY3B5U1NFKFVpbnQ4ICp0bywgY29uc3QgVWludDggKmZyb20sIGludCBsZW4pCit7CisJaW50IGk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJIglwcmVmZXRjaG50YSAoJTApXG4iCisJIglwcmVmZXRjaG50YSA2NCglMClcbiIKKwkiCXByZWZldGNobnRhIDEyOCglMClcbiIKKwkiCXByZWZldGNobnRhIDE5MiglMClcbiIKKwk6IDogInIiIChmcm9tKSApOworCisJZm9yKGk9MDsgaTxsZW4vODsgaSsrKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIglwcmVmZXRjaG50YSAyNTYoJTApXG4iCisJCSIJbW92cSAoJTApLCAlJW1tMFxuIgorCQkiCW1vdm50cSAlJW1tMCwgKCUxKVxuIgorCQk6IDogInIiIChmcm9tKSwgInIiICh0bykgOiAibWVtb3J5Iik7CisJCWZyb20rPTg7CisJCXRvKz04OworCX0KKwlpZiAobGVuJjcpCisJCVNETF9tZW1jcHkodG8sIGZyb20sIGxlbiY3KTsKK30KKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIFNETF9CbGl0Q29weShTRExfQmxpdEluZm8gKmluZm8pCit7CisJVWludDggKnNyYywgKmRzdDsKKwlpbnQgdywgaDsKKwlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKKworCXcgPSBpbmZvLT5kX3dpZHRoKmluZm8tPmRzdC0+Qnl0ZXNQZXJQaXhlbDsKKwloID0gaW5mby0+ZF9oZWlnaHQ7CisJc3JjID0gaW5mby0+c19waXhlbHM7CisJZHN0ID0gaW5mby0+ZF9waXhlbHM7CisJc3Jjc2tpcCA9IHcraW5mby0+c19za2lwOworCWRzdHNraXAgPSB3K2luZm8tPmRfc2tpcDsKKworI2lmZGVmIFNTRV9BU01CTElUCisJaWYoU0RMX0hhc1NTRSgpKQorCXsKKwkJd2hpbGUgKCBoLS0gKSB7CisJCQlTRExfbWVtY3B5U1NFKGRzdCwgc3JjLCB3KTsKKwkJCXNyYyArPSBzcmNza2lwOworCQkJZHN0ICs9IGRzdHNraXA7CisJCX0KKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiCWVtbXNcbiIKKwkJOjopOworCX0KKwllbHNlCisjZW5kaWYKKyNpZmRlZiBNTVhfQVNNQkxJVAorCWlmKFNETF9IYXNNTVgoKSkKKwl7CisJCXdoaWxlICggaC0tICkgeworCQkJU0RMX21lbWNweU1NWChkc3QsIHNyYywgdyk7CisJCQlzcmMgKz0gc3Jjc2tpcDsKKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIgllbW1zXG4iCisJCTo6KTsKKwl9CisJZWxzZQorI2VuZGlmCisJd2hpbGUgKCBoLS0gKSB7CisJCVNETF9tZW1jcHkoZHN0LCBzcmMsIHcpOworCQlzcmMgKz0gc3Jjc2tpcDsKKwkJZHN0ICs9IGRzdHNraXA7CisJfQorfQorCitzdGF0aWMgdm9pZCBTRExfQmxpdENvcHlPdmVybGFwKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlVaW50OCAqc3JjLCAqZHN0OworCWludCB3LCBoOworCWludCBzcmNza2lwLCBkc3Rza2lwOworCisJdyA9IGluZm8tPmRfd2lkdGgqaW5mby0+ZHN0LT5CeXRlc1BlclBpeGVsOworCWggPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlkc3QgPSBpbmZvLT5kX3BpeGVsczsKKwlzcmNza2lwID0gdytpbmZvLT5zX3NraXA7CisJZHN0c2tpcCA9IHcraW5mby0+ZF9za2lwOworCWlmICggZHN0IDwgc3JjICkgeworCQl3aGlsZSAoIGgtLSApIHsKKwkJCVNETF9tZW1tb3ZlKGRzdCwgc3JjLCB3KTsKKwkJCXNyYyArPSBzcmNza2lwOworCQkJZHN0ICs9IGRzdHNraXA7CisJCX0KKwl9IGVsc2UgeworCQlzcmMgKz0gKChoLTEpICogc3Jjc2tpcCk7CisJCWRzdCArPSAoKGgtMSkgKiBkc3Rza2lwKTsKKwkJd2hpbGUgKCBoLS0gKSB7CisJCQlTRExfcmV2Y3B5KGRzdCwgc3JjLCB3KTsKKwkJCXNyYyAtPSBzcmNza2lwOworCQkJZHN0IC09IGRzdHNraXA7CisJCX0KKwl9Cit9CisKKy8qIEZpZ3VyZSBvdXQgd2hpY2ggb2YgbWFueSBibGl0IHJvdXRpbmVzIHRvIHNldCB1cCBvbiBhIHN1cmZhY2UgKi8KK2ludCBTRExfQ2FsY3VsYXRlQmxpdChTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlpbnQgYmxpdF9pbmRleDsKKworCS8qIENsZWFuIGV2ZXJ5dGhpbmcgb3V0IHRvIHN0YXJ0ICovCisJaWYgKCAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwpID09IFNETF9STEVBQ0NFTCApIHsKKwkJU0RMX1VuUkxFU3VyZmFjZShzdXJmYWNlLCAxKTsKKwl9CisJc3VyZmFjZS0+bWFwLT5zd19ibGl0ID0gTlVMTDsKKworCS8qIEZpZ3VyZSBvdXQgaWYgYW4gYWNjZWxlcmF0ZWQgaGFyZHdhcmUgYmxpdCBpcyBwb3NzaWJsZSAqLworCXN1cmZhY2UtPmZsYWdzICY9IH5TRExfSFdBQ0NFTDsKKwlpZiAoIHN1cmZhY2UtPm1hcC0+aWRlbnRpdHkgKSB7CisJCWludCBod19ibGl0X29rOworCisJCWlmICggKHN1cmZhY2UtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX0hXU1VSRkFDRSApIHsKKwkJCS8qIFdlIG9ubHkgc3VwcG9ydCBhY2NlbGVyYXRlZCBibGl0dGluZyB0byBoYXJkd2FyZSAqLworCQkJaWYgKCBzdXJmYWNlLT5tYXAtPmRzdC0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFICkgeworCQkJCWh3X2JsaXRfb2sgPSBjdXJyZW50X3ZpZGVvLT5pbmZvLmJsaXRfaHc7CisJCQl9IGVsc2UgeworCQkJCWh3X2JsaXRfb2sgPSAwOworCQkJfQorCQkJaWYgKGh3X2JsaXRfb2sgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSkgeworCQkJCWh3X2JsaXRfb2sgPSBjdXJyZW50X3ZpZGVvLT5pbmZvLmJsaXRfaHdfQ0M7CisJCQl9CisJCQlpZiAoIGh3X2JsaXRfb2sgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0FMUEhBKSApIHsKKwkJCQlod19ibGl0X29rID0gY3VycmVudF92aWRlby0+aW5mby5ibGl0X2h3X0E7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBXZSBvbmx5IHN1cHBvcnQgYWNjZWxlcmF0ZWQgYmxpdHRpbmcgdG8gaGFyZHdhcmUgKi8KKwkJCWlmICggc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSApIHsKKwkJCQlod19ibGl0X29rID0gY3VycmVudF92aWRlby0+aW5mby5ibGl0X3N3OworCQkJfSBlbHNlIHsKKwkJCQlod19ibGl0X29rID0gMDsKKwkJCX0KKwkJCWlmIChod19ibGl0X29rICYmIChzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkpIHsKKwkJCQlod19ibGl0X29rID0gY3VycmVudF92aWRlby0+aW5mby5ibGl0X3N3X0NDOworCQkJfQorCQkJaWYgKCBod19ibGl0X29rICYmIChzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgKSB7CisJCQkJaHdfYmxpdF9vayA9IGN1cnJlbnRfdmlkZW8tPmluZm8uYmxpdF9zd19BOworCQkJfQorCQl9CisJCWlmICggaHdfYmxpdF9vayApIHsKKwkJCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCQkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CisJCQl2aWRlby0+Q2hlY2tIV0JsaXQodGhpcywgc3VyZmFjZSwgc3VyZmFjZS0+bWFwLT5kc3QpOworCQl9CisJfQorCQorCS8qIGlmIGFuIGFscGhhIHBpeGVsIGZvcm1hdCBpcyBzcGVjaWZpZWQsIHdlIGNhbiBhY2NlbGVyYXRlIGFscGhhIGJsaXRzICovCisJaWYgKCgoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkmJihjdXJyZW50X3ZpZGVvLT5kaXNwbGF5Zm9ybWF0YWxwaGFwaXhlbCkpIAorCXsKKwkJaWYgKCAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpICkgCisJCQlpZiAoIGN1cnJlbnRfdmlkZW8tPmluZm8uYmxpdF9od19BICkgeworCQkJCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCQkJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCQkJCXZpZGVvLT5DaGVja0hXQmxpdCh0aGlzLCBzdXJmYWNlLCBzdXJmYWNlLT5tYXAtPmRzdCk7CisJCQl9CisJfQorCisJLyogR2V0IHRoZSBibGl0IGZ1bmN0aW9uIGluZGV4LCBiYXNlZCBvbiBzdXJmYWNlIG1vZGUgKi8KKwkvKiB7IDAgPSBub3RoaW5nLCAxID0gY29sb3JrZXksIDIgPSBhbHBoYSwgMyA9IGNvbG9ya2V5K2FscGhhIH0gKi8KKwlibGl0X2luZGV4ID0gMDsKKwlibGl0X2luZGV4IHw9ICghIShzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkpICAgICAgPDwgMDsKKwlpZiAoIHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0FMUEhBCisJICAgICAmJiAoc3VyZmFjZS0+Zm9ybWF0LT5hbHBoYSAhPSBTRExfQUxQSEFfT1BBUVVFCisJCSB8fCBzdXJmYWNlLT5mb3JtYXQtPkFtYXNrKSApIHsKKwkgICAgICAgIGJsaXRfaW5kZXggfD0gMjsKKwl9CisKKwkvKiBDaGVjayBmb3Igc3BlY2lhbCAiaWRlbnRpdHkiIGNhc2UgLS0gY29weSBibGl0ICovCisJaWYgKCBzdXJmYWNlLT5tYXAtPmlkZW50aXR5ICYmIGJsaXRfaW5kZXggPT0gMCApIHsKKwkgICAgICAgIHN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YmxpdCA9IFNETF9CbGl0Q29weTsKKworCQkvKiBIYW5kbGUgb3ZlcmxhcHBpbmcgYmxpdHMgb24gdGhlIHNhbWUgc3VyZmFjZSAqLworCQlpZiAoIHN1cmZhY2UgPT0gc3VyZmFjZS0+bWFwLT5kc3QgKSB7CisJCSAgICAgICAgc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5ibGl0ID0gU0RMX0JsaXRDb3B5T3ZlcmxhcDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICggc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPCA4ICkgeworCQkJc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5ibGl0ID0KKwkJCSAgICBTRExfQ2FsY3VsYXRlQmxpdDAoc3VyZmFjZSwgYmxpdF9pbmRleCk7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKCBzdXJmYWNlLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgKSB7CisJCQkgICAgY2FzZSAxOgorCQkJCXN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YmxpdCA9CisJCQkJICAgIFNETF9DYWxjdWxhdGVCbGl0MShzdXJmYWNlLCBibGl0X2luZGV4KTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDI6CisJCQkgICAgY2FzZSAzOgorCQkJICAgIGNhc2UgNDoKKwkJCQlzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmJsaXQgPQorCQkJCSAgICBTRExfQ2FsY3VsYXRlQmxpdE4oc3VyZmFjZSwgYmxpdF9pbmRleCk7CisJCQkJYnJlYWs7CisJCQkgICAgZGVmYXVsdDoKKwkJCQlzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmJsaXQgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgYmxpdCBmdW5jdGlvbiAqLworCWlmICggc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5ibGl0ID09IE5VTEwgKSB7CisJCVNETF9JbnZhbGlkYXRlTWFwKHN1cmZhY2UtPm1hcCk7CisJCVNETF9TZXRFcnJvcigiQmxpdCBjb21iaW5hdGlvbiBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogQ2hvb3NlIHNvZnR3YXJlIGJsaXR0aW5nIGZ1bmN0aW9uICovCisJaWYoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUxPSworCSAgICYmIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV0FDQ0VMKSAhPSBTRExfSFdBQ0NFTCkgeworCisJICAgICAgICBpZihzdXJmYWNlLT5tYXAtPmlkZW50aXR5CisJCSAgICYmIChibGl0X2luZGV4ID09IDEKKwkJICAgICAgIHx8IChibGl0X2luZGV4ID09IDMgJiYgIXN1cmZhY2UtPmZvcm1hdC0+QW1hc2spKSkgeworCQkgICAgICAgIGlmICggU0RMX1JMRVN1cmZhY2Uoc3VyZmFjZSkgPT0gMCApCisJCQkgICAgICAgIHN1cmZhY2UtPm1hcC0+c3dfYmxpdCA9IFNETF9STEVCbGl0OworCQl9IGVsc2UgaWYoYmxpdF9pbmRleCA9PSAyICYmIHN1cmZhY2UtPmZvcm1hdC0+QW1hc2spIHsKKwkJICAgICAgICBpZiAoIFNETF9STEVTdXJmYWNlKHN1cmZhY2UpID09IDAgKQorCQkJICAgICAgICBzdXJmYWNlLT5tYXAtPnN3X2JsaXQgPSBTRExfUkxFQWxwaGFCbGl0OworCQl9CisJfQorCQorCWlmICggc3VyZmFjZS0+bWFwLT5zd19ibGl0ID09IE5VTEwgKSB7CisJCXN1cmZhY2UtPm1hcC0+c3dfYmxpdCA9IFNETF9Tb2Z0QmxpdDsKKwl9CisJcmV0dXJuKDApOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9ibGl0LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9ibGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0YzFlNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX2JsaXQuaApAQCAtMCwwICsxLDUyOCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9ibGl0X2gKKyNkZWZpbmUgX1NETF9ibGl0X2gKKworI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKKworLyogVGhlIHN0cnVjdHVyZSBwYXNzZWQgdG8gdGhlIGxvdyBsZXZlbCBibGl0IGZ1bmN0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVVpbnQ4ICpzX3BpeGVsczsKKwlpbnQgc193aWR0aDsKKwlpbnQgc19oZWlnaHQ7CisJaW50IHNfc2tpcDsKKwlVaW50OCAqZF9waXhlbHM7CisJaW50IGRfd2lkdGg7CisJaW50IGRfaGVpZ2h0OworCWludCBkX3NraXA7CisJdm9pZCAqYXV4X2RhdGE7CisJU0RMX1BpeGVsRm9ybWF0ICpzcmM7CisJVWludDggKnRhYmxlOworCVNETF9QaXhlbEZvcm1hdCAqZHN0OworfSBTRExfQmxpdEluZm87CisKKy8qIFRoZSB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBsb3cgbGV2ZWwgYmxpdCBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgdm9pZCAoKlNETF9sb2JsaXQpKFNETF9CbGl0SW5mbyAqaW5mbyk7CisKKy8qIFRoaXMgaXMgdGhlIHByaXZhdGUgaW5mbyBzdHJ1Y3R1cmUgZm9yIHNvZnR3YXJlIGFjY2VsZXJhdGVkIGJsaXRzICovCitzdHJ1Y3QgcHJpdmF0ZV9zd2FjY2VsIHsKKwlTRExfbG9ibGl0IGJsaXQ7CisJdm9pZCAqYXV4X2RhdGE7Cit9OworCisvKiBCbGl0IG1hcHBpbmcgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgU0RMX0JsaXRNYXAgeworCVNETF9TdXJmYWNlICpkc3Q7CisJaW50IGlkZW50aXR5OworCVVpbnQ4ICp0YWJsZTsKKwlTRExfYmxpdCBod19ibGl0OworCVNETF9ibGl0IHN3X2JsaXQ7CisJc3RydWN0IHByaXZhdGVfaHdhY2NlbCAqaHdfZGF0YTsKKwlzdHJ1Y3QgcHJpdmF0ZV9zd2FjY2VsICpzd19kYXRhOworCisJLyogdGhlIHZlcnNpb24gY291bnQgbWF0Y2hlcyB0aGUgZGVzdGluYXRpb247IG1pc21hdGNoIGluZGljYXRlcworCSAgIGFuIGludmFsaWQgbWFwcGluZyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0X3ZlcnNpb247Cit9IFNETF9CbGl0TWFwOworCisKKy8qIEZ1bmN0aW9ucyBmb3VuZCBpbiBTRExfYmxpdC5jICovCitleHRlcm4gaW50IFNETF9DYWxjdWxhdGVCbGl0KFNETF9TdXJmYWNlICpzdXJmYWNlKTsKKworLyogRnVuY3Rpb25zIGZvdW5kIGluIFNETF9ibGl0X3swLDEsTixBfS5jICovCitleHRlcm4gU0RMX2xvYmxpdCBTRExfQ2FsY3VsYXRlQmxpdDAoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCBjb21wbGV4KTsKK2V4dGVybiBTRExfbG9ibGl0IFNETF9DYWxjdWxhdGVCbGl0MShTRExfU3VyZmFjZSAqc3VyZmFjZSwgaW50IGNvbXBsZXgpOworZXh0ZXJuIFNETF9sb2JsaXQgU0RMX0NhbGN1bGF0ZUJsaXROKFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgY29tcGxleCk7CitleHRlcm4gU0RMX2xvYmxpdCBTRExfQ2FsY3VsYXRlQWxwaGFCbGl0KFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgY29tcGxleCk7CisKKy8qCisgKiBVc2VmdWwgbWFjcm9zIGZvciBibGl0dGluZyByb3V0aW5lcworICovCisKKyNkZWZpbmUgRk9STUFUX0VRVUFMKEEsIEIpCQkJCQkJXAorICAgICgoQSktPkJpdHNQZXJQaXhlbCA9PSAoQiktPkJpdHNQZXJQaXhlbAkJCQlcCisgICAgICYmICgoQSktPlJtYXNrID09IChCKS0+Um1hc2spICYmICgoQSktPkFtYXNrID09IChCKS0+QW1hc2spKQorCisvKiBMb2FkIHBpeGVsIG9mIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGZyb20gYSBidWZmZXIgYW5kIGdldCBpdHMgUi1HLUIgdmFsdWVzICovCisvKiBGSVhNRTogcmVzY2FsZSB2YWx1ZXMgdG8gMC4uMjU1IGhlcmU/ICovCisjZGVmaW5lIFJHQl9GUk9NX1BJWEVMKFBpeGVsLCBmbXQsIHIsIGcsIGIpCQkJCVwKK3sJCQkJCQkJCQlcCisJciA9ICgoKFBpeGVsJmZtdC0+Um1hc2spPj5mbXQtPlJzaGlmdCk8PGZtdC0+Umxvc3MpOyAJCVwKKwlnID0gKCgoUGl4ZWwmZm10LT5HbWFzayk+PmZtdC0+R3NoaWZ0KTw8Zm10LT5HbG9zcyk7IAkJXAorCWIgPSAoKChQaXhlbCZmbXQtPkJtYXNrKT4+Zm10LT5Cc2hpZnQpPDxmbXQtPkJsb3NzKTsgCQlcCit9CisjZGVmaW5lIFJHQl9GUk9NX1JHQjU2NShQaXhlbCwgciwgZywgYikJCQkJCVwKK3sJCQkJCQkJCQlcCisJciA9ICgoKFBpeGVsJjB4RjgwMCk+PjExKTw8Myk7CQkgCQkJXAorCWcgPSAoKChQaXhlbCYweDA3RTApPj41KTw8Mik7IAkJCQkJXAorCWIgPSAoKFBpeGVsJjB4MDAxRik8PDMpOyAJCQkJCVwKK30KKyNkZWZpbmUgUkdCX0ZST01fUkdCNTU1KFBpeGVsLCByLCBnLCBiKQkJCQkJXAorewkJCQkJCQkJCVwKKwlyID0gKCgoUGl4ZWwmMHg3QzAwKT4+MTApPDwzKTsJCSAJCQlcCisJZyA9ICgoKFBpeGVsJjB4MDNFMCk+PjUpPDwzKTsgCQkJCQlcCisJYiA9ICgoUGl4ZWwmMHgwMDFGKTw8Myk7IAkJCQkJXAorfQorI2RlZmluZSBSR0JfRlJPTV9SR0I4ODgoUGl4ZWwsIHIsIGcsIGIpCQkJCQlcCit7CQkJCQkJCQkJXAorCXIgPSAoKFBpeGVsJjB4RkYwMDAwKT4+MTYpOwkJIAkJCVwKKwlnID0gKChQaXhlbCYweEZGMDApPj44KTsJCSAJCQlcCisJYiA9IChQaXhlbCYweEZGKTsJCQkgCQkJXAorfQorI2RlZmluZSBSRVRSSUVWRV9SR0JfUElYRUwoYnVmLCBicHAsIFBpeGVsKQkJCQkgICBcCitkbyB7CQkJCQkJCQkJICAgXAorCXN3aXRjaCAoYnBwKSB7CQkJCQkJCSAgIFwKKwkJY2FzZSAyOgkJCQkJCQkgICBcCisJCQlQaXhlbCA9ICooKFVpbnQxNiAqKShidWYpKTsJCQkgICBcCisJCWJyZWFrOwkJCQkJCQkgICBcCisJCQkJCQkJCQkgICBcCisJCWNhc2UgMzogewkJCQkJCSAgIFwKKwkJICAgICAgICBVaW50OCAqQiA9IChVaW50OCAqKShidWYpOwkJCSAgIFwKKwkJCWlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCSAgIFwKKwkJCSAgICAgICAgUGl4ZWwgPSBCWzBdICsgKEJbMV0gPDwgOCkgKyAoQlsyXSA8PCAxNik7IFwKKwkJCX0gZWxzZSB7CQkJCQkgICBcCisJCQkgICAgICAgIFBpeGVsID0gKEJbMF0gPDwgMTYpICsgKEJbMV0gPDwgOCkgKyBCWzJdOyBcCisJCQl9CQkJCQkJICAgXAorCQl9CQkJCQkJCSAgIFwKKwkJYnJlYWs7CQkJCQkJCSAgIFwKKwkJCQkJCQkJCSAgIFwKKwkJY2FzZSA0OgkJCQkJCQkgICBcCisJCQlQaXhlbCA9ICooKFVpbnQzMiAqKShidWYpKTsJCQkgICBcCisJCWJyZWFrOwkJCQkJCQkgICBcCisJCQkJCQkJCQkgICBcCisJCWRlZmF1bHQ6CQkJCQkJICAgXAorCQkJUGl4ZWwgPSAwOyAvKiBhcHBlYXNlIGdjYyAqLwkJCSAgIFwKKwkJYnJlYWs7CQkJCQkJCSAgIFwKKwl9CQkJCQkJCQkgICBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgRElTRU1CTEVfUkdCKGJ1ZiwgYnBwLCBmbXQsIFBpeGVsLCByLCBnLCBiKQkJCSAgIFwKK2RvIHsJCQkJCQkJCQkgICBcCisJc3dpdGNoIChicHApIHsJCQkJCQkJICAgXAorCQljYXNlIDI6CQkJCQkJCSAgIFwKKwkJCVBpeGVsID0gKigoVWludDE2ICopKGJ1ZikpOwkJCSAgIFwKKwkJYnJlYWs7CQkJCQkJCSAgIFwKKwkJCQkJCQkJCSAgIFwKKwkJY2FzZSAzOiB7CQkJCQkJICAgXAorCQkgICAgICAgIFVpbnQ4ICpCID0gKFVpbnQ4ICopYnVmOwkJCSAgIFwKKwkJCWlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCSAgIFwKKwkJCSAgICAgICAgUGl4ZWwgPSBCWzBdICsgKEJbMV0gPDwgOCkgKyAoQlsyXSA8PCAxNik7IFwKKwkJCX0gZWxzZSB7CQkJCQkgICBcCisJCQkgICAgICAgIFBpeGVsID0gKEJbMF0gPDwgMTYpICsgKEJbMV0gPDwgOCkgKyBCWzJdOyBcCisJCQl9CQkJCQkJICAgXAorCQl9CQkJCQkJCSAgIFwKKwkJYnJlYWs7CQkJCQkJCSAgIFwKKwkJCQkJCQkJCSAgIFwKKwkJY2FzZSA0OgkJCQkJCQkgICBcCisJCQlQaXhlbCA9ICooKFVpbnQzMiAqKShidWYpKTsJCQkgICBcCisJCWJyZWFrOwkJCQkJCQkgICBcCisJCQkJCQkJCQkgICBcCisJICAgICAgICBkZWZhdWx0OgkJCQkJCSAgIFwKKwkJICAgICAgICBQaXhlbCA9IDA7CS8qIHByZXZlbnQgZ2NjIGZyb20gY29tcGxhaW5pbmcgKi8gXAorCQlicmVhazsJCQkJCQkJICAgXAorCX0JCQkJCQkJCSAgIFwKKwlSR0JfRlJPTV9QSVhFTChQaXhlbCwgZm10LCByLCBnLCBiKTsJCQkJICAgXAorfSB3aGlsZSgwKQorCisvKiBBc3NlbWJsZSBSLUctQiB2YWx1ZXMgaW50byBhIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQgYW5kIHN0b3JlIHRoZW0gKi8KKyNpZmRlZiBfX05EU19fIC8qIEZJWE1FICovCisjZGVmaW5lIFBJWEVMX0ZST01fUkdCKFBpeGVsLCBmbXQsIHIsIGcsIGIpCQkJCVwKK3sJCQkJCQkJCQlcCisJUGl4ZWwgPSAoKHI+PmZtdC0+Umxvc3MpPDxmbXQtPlJzaGlmdCl8CQkJCVwKKwkJKChnPj5mbXQtPkdsb3NzKTw8Zm10LT5Hc2hpZnQpfAkJCQlcCisJCSgoYj4+Zm10LT5CbG9zcyk8PGZtdC0+QnNoaWZ0KSB8ICgxPDwxNSk7CQkJCVwKK30KKyNlbHNlCisjZGVmaW5lIFBJWEVMX0ZST01fUkdCKFBpeGVsLCBmbXQsIHIsIGcsIGIpCQkJCVwKK3sJCQkJCQkJCQlcCisJUGl4ZWwgPSAoKHI+PmZtdC0+Umxvc3MpPDxmbXQtPlJzaGlmdCl8CQkJCVwKKwkJKChnPj5mbXQtPkdsb3NzKTw8Zm10LT5Hc2hpZnQpfAkJCQlcCisJCSgoYj4+Zm10LT5CbG9zcyk8PGZtdC0+QnNoaWZ0KTsJCQkJXAorfQorI2VuZGlmIC8qIF9fTkRTX18gRklYTUUgKi8KKyNkZWZpbmUgUkdCNTY1X0ZST01fUkdCKFBpeGVsLCByLCBnLCBiKQkJCQkJXAorewkJCQkJCQkJCVwKKwlQaXhlbCA9ICgocj4+Myk8PDExKXwoKGc+PjIpPDw1KXwoYj4+Myk7CQkJXAorfQorI2RlZmluZSBSR0I1NTVfRlJPTV9SR0IoUGl4ZWwsIHIsIGcsIGIpCQkJCQlcCit7CQkJCQkJCQkJXAorCVBpeGVsID0gKChyPj4zKTw8MTApfCgoZz4+Myk8PDUpfChiPj4zKTsJCQlcCit9CisjZGVmaW5lIFJHQjg4OF9GUk9NX1JHQihQaXhlbCwgciwgZywgYikJCQkJCVwKK3sJCQkJCQkJCQlcCisJUGl4ZWwgPSAocjw8MTYpfChnPDw4KXxiOwkJCQkJXAorfQorI2RlZmluZSBBU1NFTUJMRV9SR0IoYnVmLCBicHAsIGZtdCwgciwgZywgYikgCQkJCVwKK3sJCQkJCQkJCQlcCisJc3dpdGNoIChicHApIHsJCQkJCQkJXAorCQljYXNlIDI6IHsJCQkJCQlcCisJCQlVaW50MTYgUGl4ZWw7CQkJCQlcCisJCQkJCQkJCQlcCisJCQlQSVhFTF9GUk9NX1JHQihQaXhlbCwgZm10LCByLCBnLCBiKTsJCVwKKwkJCSooKFVpbnQxNiAqKShidWYpKSA9IFBpeGVsOwkJCVwKKwkJfQkJCQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJCWNhc2UgMzogewkJCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCVwKKwkJCSAgICAgICAgKigoYnVmKStmbXQtPlJzaGlmdC84KSA9IHI7CQlcCisJCQkJKigoYnVmKStmbXQtPkdzaGlmdC84KSA9IGc7CQlcCisJCQkJKigoYnVmKStmbXQtPkJzaGlmdC84KSA9IGI7CQlcCisJCQl9IGVsc2UgewkJCQkJXAorCQkJICAgICAgICAqKChidWYpKzItZm10LT5Sc2hpZnQvOCkgPSByOwkJXAorCQkJCSooKGJ1ZikrMi1mbXQtPkdzaGlmdC84KSA9IGc7CQlcCisJCQkJKigoYnVmKSsyLWZtdC0+QnNoaWZ0LzgpID0gYjsJCVwKKwkJCX0JCQkJCQlcCisJCX0JCQkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCQkJCQkJCQkJXAorCQljYXNlIDQ6IHsJCQkJCQlcCisJCQlVaW50MzIgUGl4ZWw7CQkJCQlcCisJCQkJCQkJCQlcCisJCQlQSVhFTF9GUk9NX1JHQihQaXhlbCwgZm10LCByLCBnLCBiKTsJCVwKKwkJCSooKFVpbnQzMiAqKShidWYpKSA9IFBpeGVsOwkJCVwKKwkJfQkJCQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorfQorI2RlZmluZSBBU1NFTUJMRV9SR0JfQU1BU0soYnVmLCBicHAsIGZtdCwgciwgZywgYiwgQW1hc2spCQlcCit7CQkJCQkJCQkJXAorCXN3aXRjaCAoYnBwKSB7CQkJCQkJCVwKKwkJY2FzZSAyOiB7CQkJCQkJXAorCQkJVWludDE2ICpidWZwOwkJCQkJXAorCQkJVWludDE2IFBpeGVsOwkJCQkJXAorCQkJCQkJCQkJXAorCQkJYnVmcCA9IChVaW50MTYgKilidWY7CQkJCVwKKwkJCVBJWEVMX0ZST01fUkdCKFBpeGVsLCBmbXQsIHIsIGcsIGIpOwkJXAorCQkJKmJ1ZnAgPSBQaXhlbCB8ICgqYnVmcCAmIEFtYXNrKTsJCVwKKwkJfQkJCQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJCWNhc2UgMzogewkJCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCVwKKwkJCSAgICAgICAgKigoYnVmKStmbXQtPlJzaGlmdC84KSA9IHI7CQlcCisJCQkJKigoYnVmKStmbXQtPkdzaGlmdC84KSA9IGc7CQlcCisJCQkJKigoYnVmKStmbXQtPkJzaGlmdC84KSA9IGI7CQlcCisJCQl9IGVsc2UgewkJCQkJXAorCQkJICAgICAgICAqKChidWYpKzItZm10LT5Sc2hpZnQvOCkgPSByOwkJXAorCQkJCSooKGJ1ZikrMi1mbXQtPkdzaGlmdC84KSA9IGc7CQlcCisJCQkJKigoYnVmKSsyLWZtdC0+QnNoaWZ0LzgpID0gYjsJCVwKKwkJCX0JCQkJCQlcCisJCX0JCQkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCQkJCQkJCQkJXAorCQljYXNlIDQ6IHsJCQkJCQlcCisJCQlVaW50MzIgKmJ1ZnA7CQkJCQlcCisJCQlVaW50MzIgUGl4ZWw7CQkJCQlcCisJCQkJCQkJCQlcCisJCQlidWZwID0gKFVpbnQzMiAqKWJ1ZjsJCQkJXAorCQkJUElYRUxfRlJPTV9SR0IoUGl4ZWwsIGZtdCwgciwgZywgYik7CQlcCisJCQkqYnVmcCA9IFBpeGVsIHwgKCpidWZwICYgQW1hc2spOwkJXAorCQl9CQkJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCit9CisKKy8qIEZJWE1FOiBTaG91bGQgd2UgcmVzY2FsZSBhbHBoYSBpbnRvIDAuLjI1NSBoZXJlPyAqLworI2RlZmluZSBSR0JBX0ZST01fUElYRUwoUGl4ZWwsIGZtdCwgciwgZywgYiwgYSkJCQkJXAorewkJCQkJCQkJCVwKKwlyID0gKChQaXhlbCZmbXQtPlJtYXNrKT4+Zm10LT5Sc2hpZnQpPDxmbXQtPlJsb3NzOyAJCVwKKwlnID0gKChQaXhlbCZmbXQtPkdtYXNrKT4+Zm10LT5Hc2hpZnQpPDxmbXQtPkdsb3NzOyAJCVwKKwliID0gKChQaXhlbCZmbXQtPkJtYXNrKT4+Zm10LT5Cc2hpZnQpPDxmbXQtPkJsb3NzOyAJCVwKKwlhID0gKChQaXhlbCZmbXQtPkFtYXNrKT4+Zm10LT5Bc2hpZnQpPDxmbXQtPkFsb3NzOwkgCVwKK30KKyNkZWZpbmUgUkdCQV9GUk9NXzg4ODgoUGl4ZWwsIGZtdCwgciwgZywgYiwgYSkJXAorewkJCQkJCVwKKwlyID0gKFBpeGVsJmZtdC0+Um1hc2spPj5mbXQtPlJzaGlmdDsJXAorCWcgPSAoUGl4ZWwmZm10LT5HbWFzayk+PmZtdC0+R3NoaWZ0OwlcCisJYiA9IChQaXhlbCZmbXQtPkJtYXNrKT4+Zm10LT5Cc2hpZnQ7CVwKKwlhID0gKFBpeGVsJmZtdC0+QW1hc2spPj5mbXQtPkFzaGlmdDsJXAorfQorI2RlZmluZSBSR0JBX0ZST01fUkdCQTg4ODgoUGl4ZWwsIHIsIGcsIGIsIGEpCQkJCVwKK3sJCQkJCQkJCQlcCisJciA9IChQaXhlbD4+MjQpOwkJCQkJCVwKKwlnID0gKChQaXhlbD4+MTYpJjB4RkYpOwkJCQkJCVwKKwliID0gKChQaXhlbD4+OCkmMHhGRik7CQkJCQkJXAorCWEgPSAoUGl4ZWwmMHhGRik7CQkJCQkJXAorfQorI2RlZmluZSBSR0JBX0ZST01fQVJHQjg4ODgoUGl4ZWwsIHIsIGcsIGIsIGEpCQkJCVwKK3sJCQkJCQkJCQlcCisJciA9ICgoUGl4ZWw+PjE2KSYweEZGKTsJCQkJCQlcCisJZyA9ICgoUGl4ZWw+PjgpJjB4RkYpOwkJCQkJCVwKKwliID0gKFBpeGVsJjB4RkYpOwkJCQkJCVwKKwlhID0gKFBpeGVsPj4yNCk7CQkJCQkJXAorfQorI2RlZmluZSBSR0JBX0ZST01fQUJHUjg4ODgoUGl4ZWwsIHIsIGcsIGIsIGEpCQkJCVwKK3sJCQkJCQkJCQlcCisJciA9IChQaXhlbCYweEZGKTsJCQkJCQlcCisJZyA9ICgoUGl4ZWw+PjgpJjB4RkYpOwkJCQkJCVwKKwliID0gKChQaXhlbD4+MTYpJjB4RkYpOwkJCQkJCVwKKwlhID0gKFBpeGVsPj4yNCk7CQkJCQkJXAorfQorI2RlZmluZSBESVNFTUJMRV9SR0JBKGJ1ZiwgYnBwLCBmbXQsIFBpeGVsLCByLCBnLCBiLCBhKQkJCSAgIFwKK2RvIHsJCQkJCQkJCQkgICBcCisJc3dpdGNoIChicHApIHsJCQkJCQkJICAgXAorCQljYXNlIDI6CQkJCQkJCSAgIFwKKwkJCVBpeGVsID0gKigoVWludDE2ICopKGJ1ZikpOwkJCSAgIFwKKwkJYnJlYWs7CQkJCQkJCSAgIFwKKwkJCQkJCQkJCSAgIFwKKwkJY2FzZSAzOgl7LyogRklYTUU6IGJyb2tlbiBjb2RlIChubyBhbHBoYSkgKi8JCSAgIFwKKwkJICAgICAgICBVaW50OCAqYiA9IChVaW50OCAqKWJ1ZjsJCQkgICBcCisJCQlpZihTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOKSB7CQkgICBcCisJCQkgICAgICAgIFBpeGVsID0gYlswXSArIChiWzFdIDw8IDgpICsgKGJbMl0gPDwgMTYpOyBcCisJCQl9IGVsc2UgewkJCQkJICAgXAorCQkJICAgICAgICBQaXhlbCA9IChiWzBdIDw8IDE2KSArIChiWzFdIDw8IDgpICsgYlsyXTsgXAorCQkJfQkJCQkJCSAgIFwKKwkJfQkJCQkJCQkgICBcCisJCWJyZWFrOwkJCQkJCQkgICBcCisJCQkJCQkJCQkgICBcCisJCWNhc2UgNDoJCQkJCQkJICAgXAorCQkJUGl4ZWwgPSAqKChVaW50MzIgKikoYnVmKSk7CQkJICAgXAorCQlicmVhazsJCQkJCQkJICAgXAorCQkJCQkJCQkJICAgXAorCQlkZWZhdWx0OgkJCQkJCSAgIFwKKwkJICAgICAgICBQaXhlbCA9IDA7IC8qIHN0b3AgZ2NjIGNvbXBsYWludHMgKi8JCSAgIFwKKwkJYnJlYWs7CQkJCQkJCSAgIFwKKwl9CQkJCQkJCQkgICBcCisJUkdCQV9GUk9NX1BJWEVMKFBpeGVsLCBmbXQsIHIsIGcsIGIsIGEpOwkJCSAgIFwKKwlQaXhlbCAmPSB+Zm10LT5BbWFzazsJCQkJCQkgICBcCit9IHdoaWxlKDApCisKKy8qIEZJWE1FOiB0aGlzIGlzbid0IGNvcnJlY3QsIGVzcGVjaWFsbHkgZm9yIEFscGhhIChtYXhpbXVtICE9IDI1NSkgKi8KKyNpZmRlZiBfX05EU19fIC8qIEZJWE1FICovCisjZGVmaW5lIFBJWEVMX0ZST01fUkdCQShQaXhlbCwgZm10LCByLCBnLCBiLCBhKQkJCQlcCit7CQkJCQkJCQkJXAorCVBpeGVsID0gKChyPj5mbXQtPlJsb3NzKTw8Zm10LT5Sc2hpZnQpfAkJCQlcCisJCSgoZz4+Zm10LT5HbG9zcyk8PGZtdC0+R3NoaWZ0KXwJCQkJXAorCQkoKGI+PmZtdC0+Qmxvc3MpPDxmbXQtPkJzaGlmdCl8CQkJCVwKKwkJKChhPj5mbXQtPkFsb3NzKTw8Zm10LT5Bc2hpZnQpIHwgKDE8PDE1KTsJCQkJXAorfQorI2Vsc2UKKyNkZWZpbmUgUElYRUxfRlJPTV9SR0JBKFBpeGVsLCBmbXQsIHIsIGcsIGIsIGEpCQkJCVwKK3sJCQkJCQkJCQlcCisJUGl4ZWwgPSAoKHI+PmZtdC0+Umxvc3MpPDxmbXQtPlJzaGlmdCl8CQkJCVwKKwkJKChnPj5mbXQtPkdsb3NzKTw8Zm10LT5Hc2hpZnQpfAkJCQlcCisJCSgoYj4+Zm10LT5CbG9zcyk8PGZtdC0+QnNoaWZ0KXwJCQkJXAorCQkoKGE+PmZtdC0+QWxvc3MpPDxmbXQtPkFzaGlmdCk7CQkJCVwKK30KKyNlbmRpZiAvKiBfX05EU19fIEZJWE1FICovCisjZGVmaW5lIEFTU0VNQkxFX1JHQkEoYnVmLCBicHAsIGZtdCwgciwgZywgYiwgYSkJCQlcCit7CQkJCQkJCQkJXAorCXN3aXRjaCAoYnBwKSB7CQkJCQkJCVwKKwkJY2FzZSAyOiB7CQkJCQkJXAorCQkJVWludDE2IFBpeGVsOwkJCQkJXAorCQkJCQkJCQkJXAorCQkJUElYRUxfRlJPTV9SR0JBKFBpeGVsLCBmbXQsIHIsIGcsIGIsIGEpOwlcCisJCQkqKChVaW50MTYgKikoYnVmKSkgPSBQaXhlbDsJCQlcCisJCX0JCQkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCQkJCQkJCQkJXAorCQljYXNlIDM6IHsgLyogRklYTUU6IGJyb2tlbiBjb2RlIChubyBhbHBoYSkgKi8JCVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4pIHsJCVwKKwkJCSAgICAgICAgKigoYnVmKStmbXQtPlJzaGlmdC84KSA9IHI7CQlcCisJCQkJKigoYnVmKStmbXQtPkdzaGlmdC84KSA9IGc7CQlcCisJCQkJKigoYnVmKStmbXQtPkJzaGlmdC84KSA9IGI7CQlcCisJCQl9IGVsc2UgewkJCQkJXAorCQkJICAgICAgICAqKChidWYpKzItZm10LT5Sc2hpZnQvOCkgPSByOwkJXAorCQkJCSooKGJ1ZikrMi1mbXQtPkdzaGlmdC84KSA9IGc7CQlcCisJCQkJKigoYnVmKSsyLWZtdC0+QnNoaWZ0LzgpID0gYjsJCVwKKwkJCX0JCQkJCQlcCisJCX0JCQkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCQkJCQkJCQkJXAorCQljYXNlIDQ6IHsJCQkJCQlcCisJCQlVaW50MzIgUGl4ZWw7CQkJCQlcCisJCQkJCQkJCQlcCisJCQlQSVhFTF9GUk9NX1JHQkEoUGl4ZWwsIGZtdCwgciwgZywgYiwgYSk7CVwKKwkJCSooKFVpbnQzMiAqKShidWYpKSA9IFBpeGVsOwkJCVwKKwkJfQkJCQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorfQorCisvKiBCbGVuZCB0aGUgUkdCIHZhbHVlcyBvZiB0d28gUGl4ZWxzIGJhc2VkIG9uIGEgc291cmNlIGFscGhhIHZhbHVlICovCisjZGVmaW5lIEFMUEhBX0JMRU5EKHNSLCBzRywgc0IsIEEsIGRSLCBkRywgZEIpCVwKK2RvIHsJCQkJCQlcCisJZFIgPSAoKChzUi1kUikqKEEpKzI1NSk+PjgpK2RSOwkJXAorCWRHID0gKCgoc0ctZEcpKihBKSsyNTUpPj44KStkRzsJCVwKKwlkQiA9ICgoKHNCLWRCKSooQSkrMjU1KT4+OCkrZEI7CQlcCit9IHdoaWxlKDApCisKKworLyogVGhpcyBpcyBhIHZlcnkgdXNlZnVsIGxvb3AgZm9yIG9wdGltaXppbmcgYmxpdHRlcnMgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPT0gMTMwMCkKKy8qIFRoZXJlJ3MgYSBidWcgaW4gdGhlIFZpc3VhbCBDKysgNyBvcHRpbWl6ZXIgd2hlbiBjb21waWxpbmcgdGhpcyBjb2RlICovCisjZWxzZQorI2RlZmluZSBVU0VfRFVGRlNfTE9PUAorI2VuZGlmCisjaWZkZWYgVVNFX0RVRkZTX0xPT1AKKworLyogOC10aW1lcyB1bnJvbGxlZCBsb29wICovCisjZGVmaW5lIERVRkZTX0xPT1A4KHBpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJCQlcCit7IGludCBuID0gKHdpZHRoKzcpLzg7CQkJCQkJCVwKKwlzd2l0Y2ggKHdpZHRoICYgNykgewkJCQkJCVwKKwljYXNlIDA6IGRvIHsJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKKwljYXNlIDc6CQlwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJXAorCWNhc2UgNjoJCXBpeGVsX2NvcHlfaW5jcmVtZW50OwkJCQlcCisJY2FzZSA1OgkJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKKwljYXNlIDQ6CQlwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJXAorCWNhc2UgMzoJCXBpeGVsX2NvcHlfaW5jcmVtZW50OwkJCQlcCisJY2FzZSAyOgkJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKKwljYXNlIDE6CQlwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJXAorCQl9IHdoaWxlICggLS1uID4gMCApOwkJCQkJXAorCX0JCQkJCQkJCVwKK30KKworLyogNC10aW1lcyB1bnJvbGxlZCBsb29wICovCisjZGVmaW5lIERVRkZTX0xPT1A0KHBpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJCQlcCit7IGludCBuID0gKHdpZHRoKzMpLzQ7CQkJCQkJCVwKKwlzd2l0Y2ggKHdpZHRoICYgMykgewkJCQkJCVwKKwljYXNlIDA6IGRvIHsJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKKwljYXNlIDM6CQlwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJXAorCWNhc2UgMjoJCXBpeGVsX2NvcHlfaW5jcmVtZW50OwkJCQlcCisJY2FzZSAxOgkJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCVwKKwkJfSB3aGlsZSAoIC0tbiA+IDAgKTsJCQkJCVwKKwl9CQkJCQkJCQlcCit9CisKKy8qIDIgLSB0aW1lcyB1bnJvbGxlZCBsb29wICovCisjZGVmaW5lIERVRkZTX0xPT1BfRE9VQkxFMihwaXhlbF9jb3B5X2luY3JlbWVudCwJCQlcCisJCQkJZG91YmxlX3BpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJXAoreyBpbnQgbiwgdyA9IHdpZHRoOwkJCQkJCQlcCisJaWYoIHcgJiAxICkgewkJCQkJCQlcCisJICAgIHBpeGVsX2NvcHlfaW5jcmVtZW50OwkJCQkJXAorCSAgICB3LS07CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKCB3ID4gMCApCXsJCQkJCQlcCisJICAgIG4gPSAoIHcgKyAyKSAvIDQ7CQkJCQkJXAorCSAgICBzd2l0Y2goIHcgJiAyICkgewkJCQkJCVwKKwkgICAgY2FzZSAwOiBkbyB7CWRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudDsJCVwKKwkgICAgY2FzZSAyOgkJZG91YmxlX3BpeGVsX2NvcHlfaW5jcmVtZW50OwkJXAorCQkgICAgfSB3aGlsZSAoIC0tbiA+IDAgKTsJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCX0JCQkJCQkJCVwKK30KKworLyogMiAtIHRpbWVzIHVucm9sbGVkIGxvb3AgNCBwaXhlbHMgKi8KKyNkZWZpbmUgRFVGRlNfTE9PUF9RVUFUUk8yKHBpeGVsX2NvcHlfaW5jcmVtZW50LAkJCVwKKwkJCQlkb3VibGVfcGl4ZWxfY29weV9pbmNyZW1lbnQsCQlcCisJCQkJcXVhdHJvX3BpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJXAoreyBpbnQgbiwgdyA9IHdpZHRoOwkJCQkJCQkJXAorICAgICAgICBpZih3ICYgMSkgewkJCQkJCQlcCisJICBwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCQlcCisJICB3LS07CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWlmKHcgJiAyKSB7CQkJCQkJCVwKKwkgIGRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCVwKKwkgIHcgLT0gMjsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlpZiAoIHcgPiAwICkgewkJCQkJCQlcCisJICAgIG4gPSAoIHcgKyA3ICkgLyA4OwkJCQkJCVwKKwkgICAgc3dpdGNoKCB3ICYgNCApIHsJCQkJCQlcCisJICAgIGNhc2UgMDogZG8gewlxdWF0cm9fcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQlcCisJICAgIGNhc2UgNDoJCXF1YXRyb19waXhlbF9jb3B5X2luY3JlbWVudDsJCVwKKwkJICAgIH0gd2hpbGUgKCAtLW4gPiAwICk7CQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwl9CQkJCQkJCQlcCit9CisKKy8qIFVzZSB0aGUgOC10aW1lcyB2ZXJzaW9uIG9mIHRoZSBsb29wIGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgRFVGRlNfTE9PUChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQkJCVwKKwlEVUZGU19MT09QOChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCisKKyNlbHNlCisKKy8qIERvbid0IHVzZSBEdWZmJ3MgZGV2aWNlIHRvIHVucm9sbCBsb29wcyAqLworI2RlZmluZSBEVUZGU19MT09QX0RPVUJMRTIocGl4ZWxfY29weV9pbmNyZW1lbnQsCQkJXAorCQkJIGRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQlcCit7IGludCBuID0gd2lkdGg7CQkJCQkJCQlcCisgICAgaWYoIG4gJiAxICkgewkJCQkJCQlcCisJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCQkJXAorCW4tLTsJCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICAgIG49bj4+MTsJCQkJCQkJCVwKKyAgICBmb3IoOyBuID4gMDsgLS1uKSB7ICAgCQkJCQkJXAorCWRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorfQorCisvKiBEb24ndCB1c2UgRHVmZidzIGRldmljZSB0byB1bnJvbGwgbG9vcHMgKi8KKyNkZWZpbmUgRFVGRlNfTE9PUF9RVUFUUk8yKHBpeGVsX2NvcHlfaW5jcmVtZW50LAkJCVwKKwkJCQlkb3VibGVfcGl4ZWxfY29weV9pbmNyZW1lbnQsCQlcCisJCQkJcXVhdHJvX3BpeGVsX2NvcHlfaW5jcmVtZW50LCB3aWR0aCkJXAoreyBpbnQgbiA9IHdpZHRoOwkJCQkJCQkJXAorICAgICAgICBpZihuICYgMSkgewkJCQkJCQlcCisJICBwaXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCQlcCisJICBuLS07CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWlmKG4gJiAyKSB7CQkJCQkJCVwKKwkgIGRvdWJsZV9waXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCVwKKwkgIG4gLT0gMjsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwluPW4+PjI7CQkJCQkJCQlcCisJZm9yKDsgbiA+IDA7IC0tbikgeyAgIAkJCQkJCVwKKwkgIHF1YXRyb19waXhlbF9jb3B5X2luY3JlbWVudDsJCQkJCVwKKyAgICAgICAgfQkJCQkJCQkJXAorfQorCisvKiBEb24ndCB1c2UgRHVmZidzIGRldmljZSB0byB1bnJvbGwgbG9vcHMgKi8KKyNkZWZpbmUgRFVGRlNfTE9PUChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQkJCVwKK3sgaW50IG47CQkJCQkJCQlcCisJZm9yICggbj13aWR0aDsgbiA+IDA7IC0tbiApIHsJCQkJCVwKKwkJcGl4ZWxfY29weV9pbmNyZW1lbnQ7CQkJCQlcCisJfQkJCQkJCQkJXAorfQorI2RlZmluZSBEVUZGU19MT09QOChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQkJXAorCURVRkZTX0xPT1AocGl4ZWxfY29weV9pbmNyZW1lbnQsIHdpZHRoKQorI2RlZmluZSBEVUZGU19MT09QNChwaXhlbF9jb3B5X2luY3JlbWVudCwgd2lkdGgpCQkJXAorCURVRkZTX0xPT1AocGl4ZWxfY29weV9pbmNyZW1lbnQsIHdpZHRoKQorCisjZW5kaWYgLyogVVNFX0RVRkZTX0xPT1AgKi8KKworLyogUHJldmVudCBWaXN1YWwgQysrIDYuMCBmcm9tIHByaW50aW5nIG91dCBzdHVwaWQgd2FybmluZ3MgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gNjAwKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ1NTApCisjZW5kaWYKKworI2VuZGlmIC8qIF9TRExfYmxpdF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9ibGl0XzAuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX2JsaXRfMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYmMwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9ibGl0XzAuYwpAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfYmxpdC5oIgorCisvKiBGdW5jdGlvbnMgdG8gYmxpdCBmcm9tIGJpdG1hcHMgdG8gb3RoZXIgc3VyZmFjZXMgKi8KKworc3RhdGljIHZvaWQgQmxpdEJ0bzEoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCBjOworCWludCB3aWR0aCwgaGVpZ2h0OworCVVpbnQ4ICpzcmMsICptYXAsICpkc3Q7CisJaW50IHNyY3NraXAsIGRzdHNraXA7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwl3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJc3JjID0gaW5mby0+c19waXhlbHM7CisJc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKwlkc3QgPSBpbmZvLT5kX3BpeGVsczsKKwlkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCW1hcCA9IGluZm8tPnRhYmxlOworCXNyY3NraXAgKz0gd2lkdGgtKHdpZHRoKzcpLzg7CisKKwlpZiAoIG1hcCApIHsKKwkJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkJICAgICAgICBVaW50OCBieXRlID0gMCwgYml0OworCSAgICAJCWZvciAoIGM9MDsgYzx3aWR0aDsgKytjICkgeworCQkJCWlmICggKGMmNykgPT0gMCApIHsKKwkJCQkJYnl0ZSA9ICpzcmMrKzsKKwkJCQl9CisJCQkJYml0ID0gKGJ5dGUmMHg4MCk+Pjc7CisJCQkJaWYgKCAxICkgeworCQkJCSAgKmRzdCA9IG1hcFtiaXRdOworCQkJCX0KKwkJCQlkc3QrKzsKKwkJCQlieXRlIDw8PSAxOworCQkJfQorCQkJc3JjICs9IHNyY3NraXA7CisJCQlkc3QgKz0gZHN0c2tpcDsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCSAgICAgICAgVWludDggYnl0ZSA9IDAsIGJpdDsKKwkgICAgCQlmb3IgKCBjPTA7IGM8d2lkdGg7ICsrYyApIHsKKwkJCQlpZiAoIChjJjcpID09IDAgKSB7CisJCQkJCWJ5dGUgPSAqc3JjKys7CisJCQkJfQorCQkJCWJpdCA9IChieXRlJjB4ODApPj43OworCQkJCWlmICggMSApIHsKKwkJCQkgICpkc3QgPSBiaXQ7CisJCQkJfQorCQkJCWRzdCsrOworCQkJCWJ5dGUgPDw9IDE7CisJCQl9CisJCQlzcmMgKz0gc3Jjc2tpcDsKKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJfQorfQorc3RhdGljIHZvaWQgQmxpdEJ0bzIoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCBjOworCWludCB3aWR0aCwgaGVpZ2h0OworCVVpbnQ4ICpzcmM7CisJVWludDE2ICptYXAsICpkc3Q7CisJaW50IHNyY3NraXAsIGRzdHNraXA7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwl3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJc3JjID0gaW5mby0+c19waXhlbHM7CisJc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKwlkc3QgPSAoVWludDE2ICopaW5mby0+ZF9waXhlbHM7CisJZHN0c2tpcCA9IGluZm8tPmRfc2tpcC8yOworCW1hcCA9IChVaW50MTYgKilpbmZvLT50YWJsZTsKKwlzcmNza2lwICs9IHdpZHRoLSh3aWR0aCs3KS84OworCisJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkgICAgICAgIFVpbnQ4IGJ5dGUgPSAwLCBiaXQ7CisJICAgIAlmb3IgKCBjPTA7IGM8d2lkdGg7ICsrYyApIHsKKwkJCWlmICggKGMmNykgPT0gMCApIHsKKwkJCQlieXRlID0gKnNyYysrOworCQkJfQorCQkJYml0ID0gKGJ5dGUmMHg4MCk+Pjc7CisJCQlpZiAoIDEgKSB7CisJCQkJKmRzdCA9IG1hcFtiaXRdOworCQkJfQorCQkJYnl0ZSA8PD0gMTsKKwkJCWRzdCsrOworCQl9CisJCXNyYyArPSBzcmNza2lwOworCQlkc3QgKz0gZHN0c2tpcDsKKwl9Cit9CitzdGF0aWMgdm9pZCBCbGl0QnRvMyhTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IGMsIG87CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJVWludDggKnNyYywgKm1hcCwgKmRzdDsKKwlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlzcmNza2lwID0gaW5mby0+c19za2lwOworCWRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJbWFwID0gaW5mby0+dGFibGU7CisJc3Jjc2tpcCArPSB3aWR0aC0od2lkdGgrNykvODsKKworCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJICAgICAgICBVaW50OCBieXRlID0gMCwgYml0OworCSAgICAJZm9yICggYz0wOyBjPHdpZHRoOyArK2MgKSB7CisJCQlpZiAoIChjJjcpID09IDAgKSB7CisJCQkJYnl0ZSA9ICpzcmMrKzsKKwkJCX0KKwkJCWJpdCA9IChieXRlJjB4ODApPj43OworCQkJaWYgKCAxICkgeworCQkJCW8gPSBiaXQgKiA0OworCQkJCWRzdFswXSA9IG1hcFtvKytdOworCQkJCWRzdFsxXSA9IG1hcFtvKytdOworCQkJCWRzdFsyXSA9IG1hcFtvKytdOworCQkJfQorCQkJYnl0ZSA8PD0gMTsKKwkJCWRzdCArPSAzOworCQl9CisJCXNyYyArPSBzcmNza2lwOworCQlkc3QgKz0gZHN0c2tpcDsKKwl9Cit9CitzdGF0aWMgdm9pZCBCbGl0QnRvNChTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJVWludDggKnNyYzsKKwlVaW50MzIgKm1hcCwgKmRzdDsKKwlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKKwlpbnQgYzsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlzcmNza2lwID0gaW5mby0+c19za2lwOworCWRzdCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKKwlkc3Rza2lwID0gaW5mby0+ZF9za2lwLzQ7CisJbWFwID0gKFVpbnQzMiAqKWluZm8tPnRhYmxlOworCXNyY3NraXAgKz0gd2lkdGgtKHdpZHRoKzcpLzg7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCSAgICAgICAgVWludDggYnl0ZSA9IDAsIGJpdDsKKwkgICAgCWZvciAoIGM9MDsgYzx3aWR0aDsgKytjICkgeworCQkJaWYgKCAoYyY3KSA9PSAwICkgeworCQkJCWJ5dGUgPSAqc3JjKys7CisJCQl9CisJCQliaXQgPSAoYnl0ZSYweDgwKT4+NzsKKwkJCWlmICggMSApIHsKKwkJCQkqZHN0ID0gbWFwW2JpdF07CisJCQl9CisJCQlieXRlIDw8PSAxOworCQkJZHN0Kys7CisJCX0KKwkJc3JjICs9IHNyY3NraXA7CisJCWRzdCArPSBkc3Rza2lwOworCX0KK30KKworc3RhdGljIHZvaWQgQmxpdEJ0bzFLZXkoU0RMX0JsaXRJbmZvICppbmZvKQoreworICAgICAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7CisJVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKKwlVaW50OCAqcGFsbWFwID0gaW5mby0+dGFibGU7CisJaW50IGM7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwlzcmNza2lwICs9IHdpZHRoLSh3aWR0aCs3KS84OworCisJaWYgKCBwYWxtYXAgKSB7CisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCSAgICAgICAgVWludDggIGJ5dGUgPSAwLCBiaXQ7CisJICAgIAkJZm9yICggYz0wOyBjPHdpZHRoOyArK2MgKSB7CisJCQkJaWYgKCAoYyY3KSA9PSAwICkgeworCQkJCQlieXRlID0gKnNyYysrOworCQkJCX0KKwkJCQliaXQgPSAoYnl0ZSYweDgwKT4+NzsKKwkJCQlpZiAoIGJpdCAhPSBja2V5ICkgeworCQkJCSAgKmRzdCA9IHBhbG1hcFtiaXRdOworCQkJCX0KKwkJCQlkc3QrKzsKKwkJCQlieXRlIDw8PSAxOworCQkJfQorCQkJc3JjICs9IHNyY3NraXA7CisJCQlkc3QgKz0gZHN0c2tpcDsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCSAgICAgICAgVWludDggIGJ5dGUgPSAwLCBiaXQ7CisJICAgIAkJZm9yICggYz0wOyBjPHdpZHRoOyArK2MgKSB7CisJCQkJaWYgKCAoYyY3KSA9PSAwICkgeworCQkJCQlieXRlID0gKnNyYysrOworCQkJCX0KKwkJCQliaXQgPSAoYnl0ZSYweDgwKT4+NzsKKwkJCQlpZiAoIGJpdCAhPSBja2V5ICkgeworCQkJCSAgKmRzdCA9IGJpdDsKKwkJCQl9CisJCQkJZHN0Kys7CisJCQkJYnl0ZSA8PD0gMTsKKwkJCX0KKwkJCXNyYyArPSBzcmNza2lwOworCQkJZHN0ICs9IGRzdHNraXA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIEJsaXRCdG8yS2V5KFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKyAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOworCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKKwlVaW50MzIgY2tleSA9IGluZm8tPnNyYy0+Y29sb3JrZXk7CisJVWludDggKnBhbG1hcCA9IGluZm8tPnRhYmxlOworCWludCBjOworCisJLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCisJc3Jjc2tpcCArPSB3aWR0aC0od2lkdGgrNykvODsKKwlkc3Rza2lwIC89IDI7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCSAgICAgICAgVWludDggYnl0ZSA9IDAsIGJpdDsKKwkgICAgCWZvciAoIGM9MDsgYzx3aWR0aDsgKytjICkgeworCQkJaWYgKCAoYyY3KSA9PSAwICkgeworCQkJCWJ5dGUgPSAqc3JjKys7CisJCQl9CisJCQliaXQgPSAoYnl0ZSYweDgwKT4+NzsKKwkJCWlmICggYml0ICE9IGNrZXkgKSB7CisJCQkJKmRzdHA9KChVaW50MTYgKilwYWxtYXApW2JpdF07CisJCQl9CisJCQlieXRlIDw8PSAxOworCQkJZHN0cCsrOworCQl9CisJCXNyYyArPSBzcmNza2lwOworCQlkc3RwICs9IGRzdHNraXA7CisJfQorfQorCitzdGF0aWMgdm9pZCBCbGl0QnRvM0tleShTRExfQmxpdEluZm8gKmluZm8pCit7CisgICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJVWludDMyIGNrZXkgPSBpbmZvLT5zcmMtPmNvbG9ya2V5OworCVVpbnQ4ICpwYWxtYXAgPSBpbmZvLT50YWJsZTsKKwlpbnQgYzsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXNyY3NraXAgKz0gd2lkdGgtKHdpZHRoKzcpLzg7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCSAgICAgICAgVWludDggIGJ5dGUgPSAwLCBiaXQ7CisJICAgIAlmb3IgKCBjPTA7IGM8d2lkdGg7ICsrYyApIHsKKwkJCWlmICggKGMmNykgPT0gMCApIHsKKwkJCQlieXRlID0gKnNyYysrOworCQkJfQorCQkJYml0ID0gKGJ5dGUmMHg4MCk+Pjc7CisJCQlpZiAoIGJpdCAhPSBja2V5ICkgeworCQkJCVNETF9tZW1jcHkoZHN0LCAmcGFsbWFwW2JpdCo0XSwgMyk7CisJCQl9CisJCQlieXRlIDw8PSAxOworCQkJZHN0ICs9IDM7CisJCX0KKwkJc3JjICs9IHNyY3NraXA7CisJCWRzdCArPSBkc3Rza2lwOworCX0KK30KKworc3RhdGljIHZvaWQgQmxpdEJ0bzRLZXkoU0RMX0JsaXRJbmZvICppbmZvKQoreworICAgICAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7CisJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKKwlVaW50OCAqcGFsbWFwID0gaW5mby0+dGFibGU7CisJaW50IGM7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwlzcmNza2lwICs9IHdpZHRoLSh3aWR0aCs3KS84OworCWRzdHNraXAgLz0gNDsKKworCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJICAgICAgICBVaW50OCBieXRlID0gMCwgYml0OworCSAgICAJZm9yICggYz0wOyBjPHdpZHRoOyArK2MgKSB7CisJCQlpZiAoIChjJjcpID09IDAgKSB7CisJCQkJYnl0ZSA9ICpzcmMrKzsKKwkJCX0KKwkJCWJpdCA9IChieXRlJjB4ODApPj43OworCQkJaWYgKCBiaXQgIT0gY2tleSApIHsKKwkJCQkqZHN0cD0oKFVpbnQzMiAqKXBhbG1hcClbYml0XTsKKwkJCX0KKwkJCWJ5dGUgPDw9IDE7CisJCQlkc3RwKys7CisJCX0KKwkJc3JjICs9IHNyY3NraXA7CisJCWRzdHAgKz0gZHN0c2tpcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEJsaXRCdG9OQWxwaGEoU0RMX0JsaXRJbmZvICppbmZvKQoreworICAgICAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7CisJVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCWNvbnN0IFNETF9Db2xvciAqc3JjcGFsCT0gaW5mby0+c3JjLT5wYWxldHRlLT5jb2xvcnM7CisJU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisJaW50ICBkc3RicHA7CisJaW50IGM7CisJY29uc3QgaW50IEEgPSBpbmZvLT5zcmMtPmFscGhhOworCisJLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCisJZHN0YnBwID0gZHN0Zm10LT5CeXRlc1BlclBpeGVsOworCXNyY3NraXAgKz0gd2lkdGgtKHdpZHRoKzcpLzg7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCSAgICAgICAgVWludDggYnl0ZSA9IDAsIGJpdDsKKwkgICAgCWZvciAoIGM9MDsgYzx3aWR0aDsgKytjICkgeworCQkJaWYgKCAoYyY3KSA9PSAwICkgeworCQkJCWJ5dGUgPSAqc3JjKys7CisJCQl9CisJCQliaXQgPSAoYnl0ZSYweDgwKT4+NzsKKwkJCWlmICggMSApIHsKKwkJCSAgICAgICAgVWludDMyIHBpeGVsOworCQkJICAgICAgICB1bnNpZ25lZCBzUiwgc0csIHNCOworCQkJCXVuc2lnbmVkIGRSLCBkRywgZEI7CisJCQkJc1IgPSBzcmNwYWxbYml0XS5yOworCQkJCXNHID0gc3JjcGFsW2JpdF0uZzsKKwkJCQlzQiA9IHNyY3BhbFtiaXRdLmI7CisJCQkJRElTRU1CTEVfUkdCKGRzdCwgZHN0YnBwLCBkc3RmbXQsCisJCQkJCQkJcGl4ZWwsIGRSLCBkRywgZEIpOworCQkJCUFMUEhBX0JMRU5EKHNSLCBzRywgc0IsIEEsIGRSLCBkRywgZEIpOworCQkJICAJQVNTRU1CTEVfUkdCKGRzdCwgZHN0YnBwLCBkc3RmbXQsIGRSLCBkRywgZEIpOworCQkJfQorCQkJYnl0ZSA8PD0gMTsKKwkJCWRzdCArPSBkc3RicHA7CisJCX0KKwkJc3JjICs9IHNyY3NraXA7CisJCWRzdCArPSBkc3Rza2lwOworCX0KK30KKworc3RhdGljIHZvaWQgQmxpdEJ0b05BbHBoYUtleShTRExfQmxpdEluZm8gKmluZm8pCit7CisgICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisJU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisJY29uc3QgU0RMX0NvbG9yICpzcmNwYWwJPSBzcmNmbXQtPnBhbGV0dGUtPmNvbG9yczsKKwlpbnQgZHN0YnBwOworCWludCBjOworCWNvbnN0IGludCBBID0gc3JjZm10LT5hbHBoYTsKKwlVaW50MzIgY2tleSA9IHNyY2ZtdC0+Y29sb3JrZXk7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwlkc3RicHAgPSBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWw7CisJc3Jjc2tpcCArPSB3aWR0aC0od2lkdGgrNykvODsKKworCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJICAgICAgICBVaW50OCAgYnl0ZSA9IDAsIGJpdDsKKwkgICAgCWZvciAoIGM9MDsgYzx3aWR0aDsgKytjICkgeworCQkJaWYgKCAoYyY3KSA9PSAwICkgeworCQkJCWJ5dGUgPSAqc3JjKys7CisJCQl9CisJCQliaXQgPSAoYnl0ZSYweDgwKT4+NzsKKwkJCWlmICggYml0ICE9IGNrZXkgKSB7CisJCQkgICAgICAgIGludCBzUiwgc0csIHNCOworCQkJCWludCBkUiwgZEcsIGRCOworCQkJCVVpbnQzMiBwaXhlbDsKKwkJCQlzUiA9IHNyY3BhbFtiaXRdLnI7CisJCQkJc0cgPSBzcmNwYWxbYml0XS5nOworCQkJCXNCID0gc3JjcGFsW2JpdF0uYjsKKwkJCQlESVNFTUJMRV9SR0IoZHN0LCBkc3RicHAsIGRzdGZtdCwKKwkJCQkJCQlwaXhlbCwgZFIsIGRHLCBkQik7CisJCQkJQUxQSEFfQkxFTkQoc1IsIHNHLCBzQiwgQSwgZFIsIGRHLCBkQik7CisJCQkgIAlBU1NFTUJMRV9SR0IoZHN0LCBkc3RicHAsIGRzdGZtdCwgZFIsIGRHLCBkQik7CisJCQl9CisJCQlieXRlIDw8PSAxOworCQkJZHN0ICs9IGRzdGJwcDsKKwkJfQorCQlzcmMgKz0gc3Jjc2tpcDsKKwkJZHN0ICs9IGRzdHNraXA7CisJfQorfQorCitzdGF0aWMgU0RMX2xvYmxpdCBiaXRtYXBfYmxpdFtdID0geworCU5VTEwsIEJsaXRCdG8xLCBCbGl0QnRvMiwgQmxpdEJ0bzMsIEJsaXRCdG80Cit9OworCitzdGF0aWMgU0RMX2xvYmxpdCBjb2xvcmtleV9ibGl0W10gPSB7CisgICAgTlVMTCwgQmxpdEJ0bzFLZXksIEJsaXRCdG8yS2V5LCBCbGl0QnRvM0tleSwgQmxpdEJ0bzRLZXkKK307CisKK1NETF9sb2JsaXQgU0RMX0NhbGN1bGF0ZUJsaXQwKFNETF9TdXJmYWNlICpzdXJmYWNlLCBpbnQgYmxpdF9pbmRleCkKK3sKKwlpbnQgd2hpY2g7CisKKwlpZiAoIHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsICE9IDEgKSB7CisJCS8qIFdlIGRvbid0IHN1cHBvcnQgc3ViIDgtYml0IHBhY2tlZCBwaXhlbCBtb2RlcyAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCBzdXJmYWNlLT5tYXAtPmRzdC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPCA4ICkgeworCQl3aGljaCA9IDA7CisJfSBlbHNlIHsKKwkJd2hpY2ggPSBzdXJmYWNlLT5tYXAtPmRzdC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCX0KKwlzd2l0Y2goYmxpdF9pbmRleCkgeworCWNhc2UgMDoJCQkvKiBjb3B5ICovCisJICAgIHJldHVybiBiaXRtYXBfYmxpdFt3aGljaF07CisKKwljYXNlIDE6CQkJLyogY29sb3JrZXkgKi8KKwkgICAgcmV0dXJuIGNvbG9ya2V5X2JsaXRbd2hpY2hdOworCisJY2FzZSAyOgkJCS8qIGFscGhhICovCisJICAgIHJldHVybiB3aGljaCA+PSAyID8gQmxpdEJ0b05BbHBoYSA6IE5VTEw7CisKKwljYXNlIDQ6CQkJLyogYWxwaGEgKyBjb2xvcmtleSAqLworCSAgICByZXR1cm4gd2hpY2ggPj0gMiA/IEJsaXRCdG9OQWxwaGFLZXkgOiBOVUxMOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfYmxpdF8xLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9ibGl0XzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjk1ZjViCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfYmxpdF8xLmMKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2JsaXQuaCIKKyNpbmNsdWRlICJTRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfZW5kaWFuLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBibGl0IGZyb20gOC1iaXQgc3VyZmFjZXMgdG8gb3RoZXIgc3VyZmFjZXMgKi8KKworc3RhdGljIHZvaWQgQmxpdDF0bzEoU0RMX0JsaXRJbmZvICppbmZvKQoreworI2lmbmRlZiBVU0VfRFVGRlNfTE9PUAorCWludCBjOworI2VuZGlmCisJaW50IHdpZHRoLCBoZWlnaHQ7CisJVWludDggKnNyYywgKm1hcCwgKmRzdDsKKwlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlzcmNza2lwID0gaW5mby0+c19za2lwOworCWRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJbWFwID0gaW5mby0+dGFibGU7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworI2lmZGVmIFVTRV9EVUZGU19MT09QCisJCURVRkZTX0xPT1AoCisJCQl7CisJCQkgICpkc3QgPSBtYXBbKnNyY107CisJCQl9CisJCQlkc3QrKzsKKwkJCXNyYysrOworCQksIHdpZHRoKTsKKyNlbHNlCisJCWZvciAoIGM9d2lkdGg7IGM7IC0tYyApIHsKKwkJICAgICAgICAqZHN0ID0gbWFwWypzcmNdOworCQkJZHN0Kys7CisJCQlzcmMrKzsKKwkJfQorI2VuZGlmCisJCXNyYyArPSBzcmNza2lwOworCQlkc3QgKz0gZHN0c2tpcDsKKwl9Cit9CisvKiBUaGlzIGlzIG5vdyBlbmRpYW4gZGVwZW5kZW50ICovCisjaWYgKCBTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOICkKKyNkZWZpbmUgSEkJMQorI2RlZmluZSBMTwkwCisjZWxzZSAvKiAoIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4gKSAqLworI2RlZmluZSBISQkwCisjZGVmaW5lIExPCTEKKyNlbmRpZgorc3RhdGljIHZvaWQgQmxpdDF0bzIoU0RMX0JsaXRJbmZvICppbmZvKQoreworI2lmbmRlZiBVU0VfRFVGRlNfTE9PUAorCWludCBjOworI2VuZGlmCisJaW50IHdpZHRoLCBoZWlnaHQ7CisJVWludDggKnNyYywgKmRzdDsKKwlVaW50MTYgKm1hcDsKKwlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlzcmNza2lwID0gaW5mby0+c19za2lwOworCWRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJbWFwID0gKFVpbnQxNiAqKWluZm8tPnRhYmxlOworCisjaWZkZWYgVVNFX0RVRkZTX0xPT1AKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCQlEVUZGU19MT09QKAorCQl7CisJCQkqKFVpbnQxNiAqKWRzdCA9IG1hcFsqc3JjKytdOworCQkJZHN0ICs9IDI7CisJCX0sCisJCXdpZHRoKTsKKwkJc3JjICs9IHNyY3NraXA7CisJCWRzdCArPSBkc3Rza2lwOworCX0KKyNlbHNlCisJLyogTWVtb3J5IGFsaWduIGF0IDQtYnl0ZSBib3VuZGFyeSwgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCAobG9uZylkc3QgJiAweDAzICkgeworCQkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3aWR0aCBpcyAwICovCisJCWlmICggd2lkdGggPT0gMCApIHsKKwkJCXJldHVybjsKKwkJfQorCQktLXdpZHRoOworCisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCQkvKiBQZXJmb3JtIGNvcHkgYWxpZ25tZW50ICovCisJCQkqKFVpbnQxNiAqKWRzdCA9IG1hcFsqc3JjKytdOworCQkJZHN0ICs9IDI7CisKKwkJCS8qIENvcHkgaW4gNCBwaXhlbCBjaHVua3MgKi8KKwkJCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgeworCQkJCSooVWludDMyICopZHN0ID0KKwkJCQkJKG1hcFtzcmNbSEldXTw8MTYpfChtYXBbc3JjW0xPXV0pOworCQkJCXNyYyArPSAyOworCQkJCWRzdCArPSA0OworCQkJCSooVWludDMyICopZHN0ID0KKwkJCQkJKG1hcFtzcmNbSEldXTw8MTYpfChtYXBbc3JjW0xPXV0pOworCQkJCXNyYyArPSAyOworCQkJCWRzdCArPSA0OworCQkJfQorCQkJLyogR2V0IGFueSBsZWZ0b3ZlcnMgKi8KKwkJCXN3aXRjaCAod2lkdGggJiAzKSB7CisJCQkJY2FzZSAzOgorCQkJCQkqKFVpbnQxNiAqKWRzdCA9IG1hcFsqc3JjKytdOworCQkJCQlkc3QgKz0gMjsKKwkJCQljYXNlIDI6CisJCQkJCSooVWludDMyICopZHN0ID0KKwkJCQkJICAobWFwW3NyY1tISV1dPDwxNil8KG1hcFtzcmNbTE9dXSk7CisJCQkJCXNyYyArPSAyOworCQkJCQlkc3QgKz0gNDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQkqKFVpbnQxNiAqKWRzdCA9IG1hcFsqc3JjKytdOworCQkJCQlkc3QgKz0gMjsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzcmMgKz0gc3Jjc2tpcDsKKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJfSBlbHNlIHsgCisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCQkvKiBDb3B5IGluIDQgcGl4ZWwgY2h1bmtzICovCisJCQlmb3IgKCBjPXdpZHRoLzQ7IGM7IC0tYyApIHsKKwkJCQkqKFVpbnQzMiAqKWRzdCA9CisJCQkJCShtYXBbc3JjW0hJXV08PDE2KXwobWFwW3NyY1tMT11dKTsKKwkJCQlzcmMgKz0gMjsKKwkJCQlkc3QgKz0gNDsKKwkJCQkqKFVpbnQzMiAqKWRzdCA9CisJCQkJCShtYXBbc3JjW0hJXV08PDE2KXwobWFwW3NyY1tMT11dKTsKKwkJCQlzcmMgKz0gMjsKKwkJCQlkc3QgKz0gNDsKKwkJCX0KKwkJCS8qIEdldCBhbnkgbGVmdG92ZXJzICovCisJCQlzd2l0Y2ggKHdpZHRoICYgMykgeworCQkJCWNhc2UgMzoKKwkJCQkJKihVaW50MTYgKilkc3QgPSBtYXBbKnNyYysrXTsKKwkJCQkJZHN0ICs9IDI7CisJCQkJY2FzZSAyOgorCQkJCQkqKFVpbnQzMiAqKWRzdCA9CisJCQkJCSAgKG1hcFtzcmNbSEldXTw8MTYpfChtYXBbc3JjW0xPXV0pOworCQkJCQlzcmMgKz0gMjsKKwkJCQkJZHN0ICs9IDQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMToKKwkJCQkJKihVaW50MTYgKilkc3QgPSBtYXBbKnNyYysrXTsKKwkJCQkJZHN0ICs9IDI7CisJCQkJCWJyZWFrOworCQkJfQorCQkJc3JjICs9IHNyY3NraXA7CisJCQlkc3QgKz0gZHN0c2tpcDsKKwkJfQorCX0KKyNlbmRpZiAvKiBVU0VfRFVGRlNfTE9PUCAqLworfQorc3RhdGljIHZvaWQgQmxpdDF0bzMoU0RMX0JsaXRJbmZvICppbmZvKQoreworI2lmbmRlZiBVU0VfRFVGRlNfTE9PUAorCWludCBjOworI2VuZGlmCisJaW50IG87CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJVWludDggKnNyYywgKm1hcCwgKmRzdDsKKwlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlzcmNza2lwID0gaW5mby0+c19za2lwOworCWRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJbWFwID0gaW5mby0+dGFibGU7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworI2lmZGVmIFVTRV9EVUZGU19MT09QCisJCURVRkZTX0xPT1AoCisJCQl7CisJCQkJbyA9ICpzcmMgKiA0OworCQkJCWRzdFswXSA9IG1hcFtvKytdOworCQkJCWRzdFsxXSA9IG1hcFtvKytdOworCQkJCWRzdFsyXSA9IG1hcFtvKytdOworCQkJfQorCQkJc3JjKys7CisJCQlkc3QgKz0gMzsKKwkJLCB3aWR0aCk7CisjZWxzZQorCQlmb3IgKCBjPXdpZHRoOyBjOyAtLWMgKSB7CisJCQlvID0gKnNyYyAqIDQ7CisJCQlkc3RbMF0gPSBtYXBbbysrXTsKKwkJCWRzdFsxXSA9IG1hcFtvKytdOworCQkJZHN0WzJdID0gbWFwW28rK107CisJCQlzcmMrKzsKKwkJCWRzdCArPSAzOworCQl9CisjZW5kaWYgLyogVVNFX0RVRkZTX0xPT1AgKi8KKwkJc3JjICs9IHNyY3NraXA7CisJCWRzdCArPSBkc3Rza2lwOworCX0KK30KK3N0YXRpYyB2b2lkIEJsaXQxdG80KFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKyNpZm5kZWYgVVNFX0RVRkZTX0xPT1AKKwlpbnQgYzsKKyNlbmRpZgorCWludCB3aWR0aCwgaGVpZ2h0OworCVVpbnQ4ICpzcmM7CisJVWludDMyICptYXAsICpkc3Q7CisJaW50IHNyY3NraXAsIGRzdHNraXA7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwl3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJc3JjID0gaW5mby0+c19waXhlbHM7CisJc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKwlkc3QgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7CisJZHN0c2tpcCA9IGluZm8tPmRfc2tpcC80OworCW1hcCA9IChVaW50MzIgKilpbmZvLT50YWJsZTsKKworCXdoaWxlICggaGVpZ2h0LS0gKSB7CisjaWZkZWYgVVNFX0RVRkZTX0xPT1AKKwkJRFVGRlNfTE9PUCgKKwkJCSpkc3QrKyA9IG1hcFsqc3JjKytdOworCQksIHdpZHRoKTsKKyNlbHNlCisJCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgeworCQkJKmRzdCsrID0gbWFwWypzcmMrK107CisJCQkqZHN0KysgPSBtYXBbKnNyYysrXTsKKwkJCSpkc3QrKyA9IG1hcFsqc3JjKytdOworCQkJKmRzdCsrID0gbWFwWypzcmMrK107CisJCX0KKwkJc3dpdGNoICggd2lkdGggJiAzICkgeworCQkJY2FzZSAzOgorCQkJCSpkc3QrKyA9IG1hcFsqc3JjKytdOworCQkJY2FzZSAyOgorCQkJCSpkc3QrKyA9IG1hcFsqc3JjKytdOworCQkJY2FzZSAxOgorCQkJCSpkc3QrKyA9IG1hcFsqc3JjKytdOworCQl9CisjZW5kaWYgLyogVVNFX0RVRkZTX0xPT1AgKi8KKwkJc3JjICs9IHNyY3NraXA7CisJCWRzdCArPSBkc3Rza2lwOworCX0KK30KKworc3RhdGljIHZvaWQgQmxpdDF0bzFLZXkoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKwlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7CisJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJVWludDggKnBhbG1hcCA9IGluZm8tPnRhYmxlOworCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKKyAgICAgICAgCisJaWYgKCBwYWxtYXAgKSB7CisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCQlEVUZGU19MT09QKAorCQkJeworCQkJCWlmICggKnNyYyAhPSBja2V5ICkgeworCQkJCSAgKmRzdCA9IHBhbG1hcFsqc3JjXTsKKwkJCQl9CisJCQkJZHN0Kys7CisJCQkJc3JjKys7CisJCQl9LAorCQkJd2lkdGgpOworCQkJc3JjICs9IHNyY3NraXA7CisJCQlkc3QgKz0gZHN0c2tpcDsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCQlEVUZGU19MT09QKAorCQkJeworCQkJCWlmICggKnNyYyAhPSBja2V5ICkgeworCQkJCSAgKmRzdCA9ICpzcmM7CisJCQkJfQorCQkJCWRzdCsrOworCQkJCXNyYysrOworCQkJfSwKKwkJCXdpZHRoKTsKKwkJCXNyYyArPSBzcmNza2lwOworCQkJZHN0ICs9IGRzdHNraXA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIEJsaXQxdG8yS2V5KFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVVpbnQxNiAqcGFsbWFwID0gKFVpbnQxNiAqKWluZm8tPnRhYmxlOworCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCWRzdHNraXAgLz0gMjsKKworCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCURVRkZTX0xPT1AoCisJCXsKKwkJCWlmICggKnNyYyAhPSBja2V5ICkgeworCQkJCSpkc3RwPXBhbG1hcFsqc3JjXTsKKwkJCX0KKwkJCXNyYysrOworCQkJZHN0cCsrOworCQl9LAorCQl3aWR0aCk7CisJCXNyYyArPSBzcmNza2lwOworCQlkc3RwICs9IGRzdHNraXA7CisJfQorfQorCitzdGF0aWMgdm9pZCBCbGl0MXRvM0tleShTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKKwlVaW50OCAqcGFsbWFwID0gaW5mby0+dGFibGU7CisJVWludDMyIGNrZXkgPSBpbmZvLT5zcmMtPmNvbG9ya2V5OworCWludCBvOworCisJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkJRFVGRlNfTE9PUCgKKwkJeworCQkJaWYgKCAqc3JjICE9IGNrZXkgKSB7CisJCQkJbyA9ICpzcmMgKiA0OworCQkJCWRzdFswXSA9IHBhbG1hcFtvKytdOworCQkJCWRzdFsxXSA9IHBhbG1hcFtvKytdOworCQkJCWRzdFsyXSA9IHBhbG1hcFtvKytdOworCQkJfQorCQkJc3JjKys7CisJCQlkc3QgKz0gMzsKKwkJfSwKKwkJd2lkdGgpOworCQlzcmMgKz0gc3Jjc2tpcDsKKwkJZHN0ICs9IGRzdHNraXA7CisJfQorfQorCitzdGF0aWMgdm9pZCBCbGl0MXRvNEtleShTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKKwlVaW50MzIgKnBhbG1hcCA9IChVaW50MzIgKilpbmZvLT50YWJsZTsKKwlVaW50MzIgY2tleSA9IGluZm8tPnNyYy0+Y29sb3JrZXk7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwlkc3Rza2lwIC89IDQ7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCQlEVUZGU19MT09QKAorCQl7CisJCQlpZiAoICpzcmMgIT0gY2tleSApIHsKKwkJCQkqZHN0cCA9IHBhbG1hcFsqc3JjXTsKKwkJCX0KKwkJCXNyYysrOworCQkJZHN0cCsrOworCQl9LAorCQl3aWR0aCk7CisJCXNyYyArPSBzcmNza2lwOworCQlkc3RwICs9IGRzdHNraXA7CisJfQorfQorCitzdGF0aWMgdm9pZCBCbGl0MXRvTkFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisJVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OworCWNvbnN0IFNETF9Db2xvciAqc3JjcGFsCT0gaW5mby0+c3JjLT5wYWxldHRlLT5jb2xvcnM7CisJaW50IGRzdGJwcDsKKwljb25zdCBpbnQgQSA9IGluZm8tPnNyYy0+YWxwaGE7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwlkc3RicHAgPSBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWw7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCSAgICAgICAgaW50IHNSLCBzRywgc0I7CisJCWludCBkUiwgZEcsIGRCOworCSAgICAJRFVGRlNfTE9PUDQoCisJCQl7CisJCQkgICAgICAgIFVpbnQzMiBwaXhlbDsKKwkJCQlzUiA9IHNyY3BhbFsqc3JjXS5yOworCQkJCXNHID0gc3JjcGFsWypzcmNdLmc7CisJCQkJc0IgPSBzcmNwYWxbKnNyY10uYjsKKwkJCQlESVNFTUJMRV9SR0IoZHN0LCBkc3RicHAsIGRzdGZtdCwKKwkJCQkJICAgICBwaXhlbCwgZFIsIGRHLCBkQik7CisJCQkJQUxQSEFfQkxFTkQoc1IsIHNHLCBzQiwgQSwgZFIsIGRHLCBkQik7CisJCQkgIAlBU1NFTUJMRV9SR0IoZHN0LCBkc3RicHAsIGRzdGZtdCwgZFIsIGRHLCBkQik7CisJCQkJc3JjKys7CisJCQkJZHN0ICs9IGRzdGJwcDsKKwkJCX0sCisJCQl3aWR0aCk7CisJCXNyYyArPSBzcmNza2lwOworCQlkc3QgKz0gZHN0c2tpcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEJsaXQxdG9OQWxwaGFLZXkoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKwlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7CisJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisJU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisJY29uc3QgU0RMX0NvbG9yICpzcmNwYWwJPSBpbmZvLT5zcmMtPnBhbGV0dGUtPmNvbG9yczsKKwlVaW50MzIgY2tleSA9IHNyY2ZtdC0+Y29sb3JrZXk7CisJaW50IGRzdGJwcDsKKwljb25zdCBpbnQgQSA9IHNyY2ZtdC0+YWxwaGE7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwlkc3RicHAgPSBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWw7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCSAgICAgICAgaW50IHNSLCBzRywgc0I7CisJCWludCBkUiwgZEcsIGRCOworCQlEVUZGU19MT09QKAorCQl7CisJCQlpZiAoICpzcmMgIT0gY2tleSApIHsKKwkJCSAgICAgICAgVWludDMyIHBpeGVsOworCQkJCXNSID0gc3JjcGFsWypzcmNdLnI7CisJCQkJc0cgPSBzcmNwYWxbKnNyY10uZzsKKwkJCQlzQiA9IHNyY3BhbFsqc3JjXS5iOworCQkJCURJU0VNQkxFX1JHQihkc3QsIGRzdGJwcCwgZHN0Zm10LAorCQkJCQkJCXBpeGVsLCBkUiwgZEcsIGRCKTsKKwkJCQlBTFBIQV9CTEVORChzUiwgc0csIHNCLCBBLCBkUiwgZEcsIGRCKTsKKwkJCSAgCUFTU0VNQkxFX1JHQihkc3QsIGRzdGJwcCwgZHN0Zm10LCBkUiwgZEcsIGRCKTsKKwkJCX0KKwkJCXNyYysrOworCQkJZHN0ICs9IGRzdGJwcDsKKwkJfSwKKwkJd2lkdGgpOworCQlzcmMgKz0gc3Jjc2tpcDsKKwkJZHN0ICs9IGRzdHNraXA7CisJfQorfQorCitzdGF0aWMgU0RMX2xvYmxpdCBvbmVfYmxpdFtdID0geworCU5VTEwsIEJsaXQxdG8xLCBCbGl0MXRvMiwgQmxpdDF0bzMsIEJsaXQxdG80Cit9OworCitzdGF0aWMgU0RMX2xvYmxpdCBvbmVfYmxpdGtleVtdID0geworICAgICAgICBOVUxMLCBCbGl0MXRvMUtleSwgQmxpdDF0bzJLZXksIEJsaXQxdG8zS2V5LCBCbGl0MXRvNEtleQorfTsKKworU0RMX2xvYmxpdCBTRExfQ2FsY3VsYXRlQmxpdDEoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCBibGl0X2luZGV4KQoreworCWludCB3aGljaDsKKwlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdDsKKworCWRzdGZtdCA9IHN1cmZhY2UtPm1hcC0+ZHN0LT5mb3JtYXQ7CisJaWYgKCBkc3RmbXQtPkJpdHNQZXJQaXhlbCA8IDggKSB7CisJCXdoaWNoID0gMDsKKwl9IGVsc2UgeworCQl3aGljaCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKKwl9CisJc3dpdGNoKGJsaXRfaW5kZXgpIHsKKwljYXNlIDA6CQkJLyogY29weSAqLworCSAgICByZXR1cm4gb25lX2JsaXRbd2hpY2hdOworCisJY2FzZSAxOgkJCS8qIGNvbG9ya2V5ICovCisJICAgIHJldHVybiBvbmVfYmxpdGtleVt3aGljaF07CisKKwljYXNlIDI6CQkJLyogYWxwaGEgKi8KKwkgICAgLyogU3VwcG9ydGluZyA4YnBwLT44YnBwIGFscGhhIGlzIGRvYWJsZSBidXQgcmVxdWlyZXMgbG90cyBvZgorCSAgICAgICB0YWJsZXMgd2hpY2ggY29uc3VtZSBzcGFjZSBhbmQgdGFrZXMgdGltZSB0byBwcmVjb21wdXRlLAorCSAgICAgICBzbyBpcyBiZXR0ZXIgbGVmdCB0byB0aGUgdXNlciAqLworCSAgICByZXR1cm4gd2hpY2ggPj0gMiA/IEJsaXQxdG9OQWxwaGEgOiBOVUxMOworCisJY2FzZSAzOgkJCS8qIGFscGhhICsgY29sb3JrZXkgKi8KKwkgICAgcmV0dXJuIHdoaWNoID49IDIgPyBCbGl0MXRvTkFscGhhS2V5IDogTlVMTDsKKworCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX2JsaXRfQS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfYmxpdF9BLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5Y2RjYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX2JsaXRfQS5jCkBAIC0wLDAgKzEsMjg3MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfYmxpdC5oIgorCisvKgorICBJbiBWaXN1YWwgQywgVkM2IGhhcyBtbWludHJpbi5oIGluIHRoZSAiUHJvY2Vzc29yIFBhY2siIGFkZC1vbi4KKyAgIENoZWNraW5nIGlmIF9tbV9mcmVlIGlzICNkZWZpbmVkIGluIG1hbGxvYy5oIGlzIGlzIHRoZSBvbmx5IHdheSB0bworICAgZGV0ZXJtaW5lIGlmIHRoZSBQcm9jZXNzb3IgUGFjayBpcyBpbnN0YWxsZWQsIGFzIGZhciBhcyBJIGNhbiB0ZWxsLgorKi8KKworI2lmIFNETF9BU1NFTUJMWV9ST1VUSU5FUworIyAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCisgICAgIC8qIGZvcmNlZCBNTVggdG8gMC4uLml0IGJyZWFrcyBvbiBtb3N0IGNvbXBpbGVycyBub3cuICAtLXJ5YW4uICovCisjICAgIGRlZmluZSBNTVhfQVNNQkxJVCAwCisjICAgIGRlZmluZSBHQ0NfQVNNQkxJVCAwCisjICBlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikKKyMgICAgaWYgKF9NU0NfVkVSIDw9IDEyMDApICAKKyMgICAgICBpbmNsdWRlIDxtYWxsb2MuaD4gICAKKyMgICAgICBpZiBkZWZpbmVkKF9tbV9mcmVlKQorIyAgICAgICAgICBkZWZpbmUgSEFWRV9NTUlOVFJJTl9IIDEKKyMgICAgICBlbmRpZgorIyAgICBlbHNlICAvKiBWaXN1YWwgU3R1ZGlvID4gVkM2IGFsd2F5cyBoYXMgbW1pbnRyaW4uaCAqLworIyAgICAgIGRlZmluZSBIQVZFX01NSU5UUklOX0ggMQorIyAgICBlbmRpZgorIyAgICBpZiBIQVZFX01NSU5UUklOX0gKKyMgICAgICBkZWZpbmUgTU1YX0FTTUJMSVQgMQorIyAgICAgIGRlZmluZSBNU1ZDX0FTTUJMSVQgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZiAvKiBTRExfQVNTRU1CTFlfUk9VVElORVMgKi8KKworLyogRnVuY3Rpb24gdG8gY2hlY2sgdGhlIENQVSBmbGFncyAqLworI2luY2x1ZGUgIlNETF9jcHVpbmZvLmgiCisjaWYgR0NDX0FTTUJMSVQKKyNpbmNsdWRlICJtbXguaCIKKyNlbGlmIE1TVkNfQVNNQkxJVAorI2luY2x1ZGUgPG1taW50cmluLmg+CisjaW5jbHVkZSA8bW0zZG5vdy5oPgorI2VuZGlmCisKKy8qIEZ1bmN0aW9ucyB0byBwZXJmb3JtIGFscGhhIGJsZW5kZWQgYmxpdHRpbmcgKi8KKworLyogTi0+MSBibGVuZGluZyB3aXRoIHBlci1zdXJmYWNlIGFscGhhICovCitzdGF0aWMgdm9pZCBCbGl0TnRvMVN1cmZhY2VBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKKwlVaW50OCAqcGFsbWFwID0gaW5mby0+dGFibGU7CisJU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisJU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisJaW50IHNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKKworCWNvbnN0IHVuc2lnbmVkIEEgPSBzcmNmbXQtPmFscGhhOworCisJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkgICAgRFVGRlNfTE9PUDQoCisJICAgIHsKKwkJVWludDMyIFBpeGVsOworCQl1bnNpZ25lZCBzUjsKKwkJdW5zaWduZWQgc0c7CisJCXVuc2lnbmVkIHNCOworCQl1bnNpZ25lZCBkUjsKKwkJdW5zaWduZWQgZEc7CisJCXVuc2lnbmVkIGRCOworCQlESVNFTUJMRV9SR0Ioc3JjLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsIHNSLCBzRywgc0IpOworCQlkUiA9IGRzdGZtdC0+cGFsZXR0ZS0+Y29sb3JzWypkc3RdLnI7CisJCWRHID0gZHN0Zm10LT5wYWxldHRlLT5jb2xvcnNbKmRzdF0uZzsKKwkJZEIgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5iOworCQlBTFBIQV9CTEVORChzUiwgc0csIHNCLCBBLCBkUiwgZEcsIGRCKTsKKwkJZFIgJj0gMHhmZjsKKwkJZEcgJj0gMHhmZjsKKwkJZEIgJj0gMHhmZjsKKwkJLyogUGFjayBSR0IgaW50byA4Yml0IHBpeGVsICovCisJCWlmICggcGFsbWFwID09IE5VTEwgKSB7CisJCSAgICAqZHN0ID0oKGRSPj41KTw8KDMrMikpfAorCQkJICAoKGRHPj41KTw8KDIpKXwKKwkJCSAgKChkQj4+Nik8PCgwKSk7CisJCX0gZWxzZSB7CisJCSAgICAqZHN0ID0gcGFsbWFwWygoZFI+PjUpPDwoMysyKSl8CisJCQkJICAoKGRHPj41KTw8KDIpKSAgfAorCQkJCSAgKChkQj4+Nik8PCgwKSldOworCQl9CisJCWRzdCsrOworCQlzcmMgKz0gc3JjYnBwOworCSAgICB9LAorCSAgICB3aWR0aCk7CisJICAgIHNyYyArPSBzcmNza2lwOworCSAgICBkc3QgKz0gZHN0c2tpcDsKKwl9Cit9CisKKy8qIE4tPjEgYmxlbmRpbmcgd2l0aCBwaXhlbCBhbHBoYSAqLworc3RhdGljIHZvaWQgQmxpdE50bzFQaXhlbEFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisJVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVVpbnQ4ICpwYWxtYXAgPSBpbmZvLT50YWJsZTsKKwlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKKwlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKKwlpbnQgc3JjYnBwID0gc3JjZm10LT5CeXRlc1BlclBpeGVsOworCisJLyogRklYTUU6IGZpeCBhbHBoYSBiaXQgZmllbGQgZXhwYW5zaW9uIGhlcmUgdG9vPyAqLworCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJICAgIERVRkZTX0xPT1A0KAorCSAgICB7CisJCVVpbnQzMiBQaXhlbDsKKwkJdW5zaWduZWQgc1I7CisJCXVuc2lnbmVkIHNHOworCQl1bnNpZ25lZCBzQjsKKwkJdW5zaWduZWQgc0E7CisJCXVuc2lnbmVkIGRSOworCQl1bnNpZ25lZCBkRzsKKwkJdW5zaWduZWQgZEI7CisJCURJU0VNQkxFX1JHQkEoc3JjLHNyY2JwcCxzcmNmbXQsUGl4ZWwsc1Isc0csc0Isc0EpOworCQlkUiA9IGRzdGZtdC0+cGFsZXR0ZS0+Y29sb3JzWypkc3RdLnI7CisJCWRHID0gZHN0Zm10LT5wYWxldHRlLT5jb2xvcnNbKmRzdF0uZzsKKwkJZEIgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5iOworCQlBTFBIQV9CTEVORChzUiwgc0csIHNCLCBzQSwgZFIsIGRHLCBkQik7CisJCWRSICY9IDB4ZmY7CisJCWRHICY9IDB4ZmY7CisJCWRCICY9IDB4ZmY7CisJCS8qIFBhY2sgUkdCIGludG8gOGJpdCBwaXhlbCAqLworCQlpZiAoIHBhbG1hcCA9PSBOVUxMICkgeworCQkgICAgKmRzdCA9KChkUj4+NSk8PCgzKzIpKXwKKwkJCSAgKChkRz4+NSk8PCgyKSl8CisJCQkgICgoZEI+PjYpPDwoMCkpOworCQl9IGVsc2UgeworCQkgICAgKmRzdCA9IHBhbG1hcFsoKGRSPj41KTw8KDMrMikpfAorCQkJCSAgKChkRz4+NSk8PCgyKSkgIHwKKwkJCQkgICgoZEI+PjYpPDwoMCkpICBdOworCQl9CisJCWRzdCsrOworCQlzcmMgKz0gc3JjYnBwOworCSAgICB9LAorCSAgICB3aWR0aCk7CisJICAgIHNyYyArPSBzcmNza2lwOworCSAgICBkc3QgKz0gZHN0c2tpcDsKKwl9Cit9CisKKy8qIGNvbG9ya2V5ZWQgTi0+MSBibGVuZGluZyB3aXRoIHBlci1zdXJmYWNlIGFscGhhICovCitzdGF0aWMgdm9pZCBCbGl0TnRvMVN1cmZhY2VBbHBoYUtleShTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKKwlVaW50OCAqcGFsbWFwID0gaW5mby0+dGFibGU7CisJU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisJU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisJaW50IHNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKKwlVaW50MzIgY2tleSA9IHNyY2ZtdC0+Y29sb3JrZXk7CisKKwljb25zdCBpbnQgQSA9IHNyY2ZtdC0+YWxwaGE7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCSAgICBEVUZGU19MT09QKAorCSAgICB7CisJCVVpbnQzMiBQaXhlbDsKKwkJdW5zaWduZWQgc1I7CisJCXVuc2lnbmVkIHNHOworCQl1bnNpZ25lZCBzQjsKKwkJdW5zaWduZWQgZFI7CisJCXVuc2lnbmVkIGRHOworCQl1bnNpZ25lZCBkQjsKKwkJRElTRU1CTEVfUkdCKHNyYywgc3JjYnBwLCBzcmNmbXQsIFBpeGVsLCBzUiwgc0csIHNCKTsKKwkJaWYgKCBQaXhlbCAhPSBja2V5ICkgeworCQkgICAgZFIgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5yOworCQkgICAgZEcgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5nOworCQkgICAgZEIgPSBkc3RmbXQtPnBhbGV0dGUtPmNvbG9yc1sqZHN0XS5iOworCQkgICAgQUxQSEFfQkxFTkQoc1IsIHNHLCBzQiwgQSwgZFIsIGRHLCBkQik7CisJCSAgICBkUiAmPSAweGZmOworCQkgICAgZEcgJj0gMHhmZjsKKwkJICAgIGRCICY9IDB4ZmY7CisJCSAgICAvKiBQYWNrIFJHQiBpbnRvIDhiaXQgcGl4ZWwgKi8KKwkJICAgIGlmICggcGFsbWFwID09IE5VTEwgKSB7CisJCQkqZHN0ID0oKGRSPj41KTw8KDMrMikpfAorCQkJICAgICAgKChkRz4+NSk8PCgyKSkgfAorCQkJICAgICAgKChkQj4+Nik8PCgwKSk7CisJCSAgICB9IGVsc2UgeworCQkJKmRzdCA9IHBhbG1hcFsoKGRSPj41KTw8KDMrMikpfAorCQkJCSAgICAgICgoZEc+PjUpPDwoMikpICB8CisJCQkJICAgICAgKChkQj4+Nik8PCgwKSkgIF07CisJCSAgICB9CisJCX0KKwkJZHN0Kys7CisJCXNyYyArPSBzcmNicHA7CisJICAgIH0sCisJICAgIHdpZHRoKTsKKwkgICAgc3JjICs9IHNyY3NraXA7CisJICAgIGRzdCArPSBkc3Rza2lwOworCX0KK30KKworI2lmIEdDQ19BU01CTElUCisvKiBmYXN0IFJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYT0xMjggc3BlY2lhbCBjYXNlICovCitzdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JTdXJmYWNlQWxwaGExMjhNTVgoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOworCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOworCVVpbnQzMiBkYWxwaGEgPSBpbmZvLT5kc3QtPkFtYXNrOworCVVpbnQ2NCBsb2FkOworCisJbG9hZCA9IDB4MDBmZWZlZmUwMGZlZmVmZVVMTDsvKiBhbHBoYTEyOCBtYXNrICovCisJbW92cV9tMnIobG9hZCwgbW00KTsgLyogYWxwaGExMjggbWFzayAtPiBtbTQgKi8KKwlsb2FkID0gMHgwMDAxMDEwMTAwMDEwMTAxVUxMOy8qICFhbHBoYTEyOCBtYXNrICovCisJbW92cV9tMnIobG9hZCwgbW0zKTsgLyogIWFscGhhMTI4IG1hc2sgLT4gbW0zICovCisJbW92ZF9tMnIoZGFscGhhLCBtbTcpOyAvKiBkc3QgYWxwaGEgbWFzayAqLworCXB1bnBja2xkcV9yMnIobW03LCBtbTcpOyAvKiBkc3QgYWxwaGEgbWFzayB8IGRzdCBhbHBoYSBtYXNrIC0+IG1tNyAqLworCXdoaWxlKGhlaWdodC0tKSB7CisJCURVRkZTX0xPT1BfRE9VQkxFMigKKwkJeworCQkJVWludDMyIHMgPSAqc3JjcCsrOworCQkJVWludDMyIGQgPSAqZHN0cDsKKwkJCSpkc3RwKysgPSAoKCgocyAmIDB4MDBmZWZlZmUpICsgKGQgJiAweDAwZmVmZWZlKSkgPj4gMSkKKwkJCQkgICArIChzICYgZCAmIDB4MDAwMTAxMDEpKSB8IGRhbHBoYTsKKwkJfSx7CisJCQltb3ZxX20ycigoKmRzdHApLCBtbTIpOy8qIDIgeCBkc3QgLT4gbW0yKEFSR0JBUkdCKSAqLworCQkJbW92cV9yMnIobW0yLCBtbTYpOyAvKiAyIHggZHN0IC0+IG1tNihBUkdCQVJHQikgKi8KKworCQkJbW92cV9tMnIoKCpzcmNwKSwgbW0xKTsvKiAyIHggc3JjIC0+IG1tMShBUkdCQVJHQikgKi8KKwkJCW1vdnFfcjJyKG1tMSwgbW01KTsgLyogMiB4IHNyYyAtPiBtbTUoQVJHQkFSR0IpICovCisKKwkJCXBhbmRfcjJyKG1tNCwgbW02KTsgLyogZHN0ICYgbWFzayAtPiBtbTYgKi8KKwkJCXBhbmRfcjJyKG1tNCwgbW01KTsgLyogc3JjICYgbWFzayAtPiBtbTUgKi8KKwkJCXBhZGRkX3IycihtbTYsIG1tNSk7IC8qIG1tNiArIG1tNSAtPiBtbTUgKi8KKwkJCXBhbmRfcjJyKG1tMSwgbW0yKTsgLyogc3JjICYgZHN0IC0+IG1tMiAqLworCQkJcHNybGRfaTJyKDEsIG1tNSk7IC8qIG1tNSA+PiAxIC0+IG1tNSAqLworCQkJcGFuZF9yMnIobW0zLCBtbTIpOyAvKiBtbTIgJiAhbWFzayAtPiBtbTIgKi8KKwkJCXBhZGRkX3IycihtbTUsIG1tMik7IC8qIG1tNSArIG1tMiAtPiBtbTIgKi8KKwkJCQorCQkJcG9yX3IycihtbTcsIG1tMik7IC8qIG1tNyhmdWxsIGFscGhhKSB8IG1tMiAtPiBtbTIgKi8KKwkJCW1vdnFfcjJtKG1tMiwgKCpkc3RwKSk7LyogbW0yIC0+IDIgeCBkc3QgcGl4ZWxzICovCisJCQlkc3RwICs9IDI7CisJCQlzcmNwICs9IDI7CisJCX0sIHdpZHRoKTsKKwkJc3JjcCArPSBzcmNza2lwOworCQlkc3RwICs9IGRzdHNraXA7CisJfQorCWVtbXMoKTsKK30KKworLyogZmFzdCBSR0I4ODgtPihBKVJHQjg4OCBibGVuZGluZyB3aXRoIHN1cmZhY2UgYWxwaGEgKi8KK3N0YXRpYyB2b2lkIEJsaXRSR0J0b1JHQlN1cmZhY2VBbHBoYU1NWChTRExfQmxpdEluZm8gKmluZm8pCit7CisJU0RMX1BpeGVsRm9ybWF0KiBkZiA9IGluZm8tPmRzdDsKKwl1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7CisKKwlpZiAoYWxwaGEgPT0gMTI4ICYmIChkZi0+Um1hc2sgfCBkZi0+R21hc2sgfCBkZi0+Qm1hc2spID09IDB4MDBGRkZGRkYpIHsKKwkJCS8qIG9ubHkgY2FsbCBhMTI4IHZlcnNpb24gd2hlbiBSLEcsQiBvY2N1cHkgbG93ZXIgYml0cyAqLworCQlCbGl0UkdCdG9SR0JTdXJmYWNlQWxwaGExMjhNTVgoaW5mbyk7CisJfSBlbHNlIHsKKwkJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwkJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7CisJCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7CisJCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKKwkJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKKworCQlweG9yX3IycihtbTUsIG1tNSk7IC8qIDAgLT4gbW01ICovCisJCS8qIGZvcm0gdGhlIGFscGhhIG11bHQgKi8KKwkJbW92ZF9tMnIoYWxwaGEsIG1tNCk7IC8qIDAwMDAwMDBBIC0+IG1tNCAqLworCQlwdW5wY2tsd2RfcjJyKG1tNCwgbW00KTsgLyogMDAwMDBBMEEgLT4gbW00ICovCisJCXB1bnBja2xkcV9yMnIobW00LCBtbTQpOyAvKiAwQTBBMEEwQSAtPiBtbTQgKi8KKwkJYWxwaGEgPSAoMHhmZiA8PCBkZi0+UnNoaWZ0KSB8ICgweGZmIDw8IGRmLT5Hc2hpZnQpIHwgKDB4ZmYgPDwgZGYtPkJzaGlmdCk7CisJCW1vdmRfbTJyKGFscGhhLCBtbTApOyAvKiAwMDAwMEZGRiAtPiBtbTAgKi8KKwkJcHVucGNrbGJ3X3IycihtbTAsIG1tMCk7IC8qIDAwRkZGRkZGIC0+IG1tMCAqLworCQlwYW5kX3IycihtbTAsIG1tNCk7IC8qIDBBMEEwQTBBIC0+IG1tNCwgbWludXMgMSBjaGFuICovCisJCQkvKiBhdCB0aGlzIHBvaW50IG1tNCBjYW4gYmUgMDAwQTBBMEEgb3IgMEEwQTBBMDAgb3IgYW5vdGhlciBjb21ibyAqLworCQltb3ZkX20ycihkZi0+QW1hc2ssIG1tNyk7IC8qIGRzdCBhbHBoYSBtYXNrICovCisJCXB1bnBja2xkcV9yMnIobW03LCBtbTcpOyAvKiBkc3QgYWxwaGEgbWFzayB8IGRzdCBhbHBoYSBtYXNrIC0+IG1tNyAqLworCQkKKwkJd2hpbGUoaGVpZ2h0LS0pIHsKKwkJCURVRkZTX0xPT1BfRE9VQkxFMih7CisJCQkJLyogT25lIFBpeGVsIEJsZW5kICovCisJCQkJbW92ZF9tMnIoKCpzcmNwKSwgbW0xKTsvKiBzcmMoQVJHQikgLT4gbW0xICgwMDAwQVJHQikqLworCQkJCW1vdmRfbTJyKCgqZHN0cCksIG1tMik7LyogZHN0KEFSR0IpIC0+IG1tMiAoMDAwMEFSR0IpKi8KKwkJCQlwdW5wY2tsYndfcjJyKG1tNSwgbW0xKTsgLyogMEEwUjBHMEIgLT4gbW0xKHNyYykgKi8KKwkJCQlwdW5wY2tsYndfcjJyKG1tNSwgbW0yKTsgLyogMEEwUjBHMEIgLT4gbW0yKGRzdCkgKi8KKworCQkJCXBzdWJ3X3IycihtbTIsIG1tMSk7Lyogc3JjIC0gZHN0IC0+IG1tMSAqLworCQkJCXBtdWxsd19yMnIobW00LCBtbTEpOyAvKiBtbTEgKiBhbHBoYSAtPiBtbTEgKi8KKwkJCQlwc3Jsd19pMnIoOCwgbW0xKTsgLyogbW0xID4+IDggLT4gbW0xICovCisJCQkJcGFkZGJfcjJyKG1tMSwgbW0yKTsgLyogbW0xICsgbW0yKGRzdCkgLT4gbW0yICovCisKKwkJCQlwYWNrdXN3Yl9yMnIobW01LCBtbTIpOyAgLyogQVJHQkFSR0IgLT4gbW0yICovCisJCQkJcG9yX3IycihtbTcsIG1tMik7IC8qIG1tNyhmdWxsIGFscGhhKSB8IG1tMiAtPiBtbTIgKi8KKwkJCQltb3ZkX3IybShtbTIsICpkc3RwKTsvKiBtbTIgLT4gcGl4ZWwgKi8KKwkJCQkrK3NyY3A7CisJCQkJKytkc3RwOworCQkJfSx7CisJCQkJLyogVHdvIFBpeGVscyBCbGVuZCAqLworCQkJCW1vdnFfbTJyKCgqc3JjcCksIG1tMCk7LyogMiB4IHNyYyAtPiBtbTAoQVJHQkFSR0IpKi8KKwkJCQltb3ZxX20ycigoKmRzdHApLCBtbTIpOy8qIDIgeCBkc3QgLT4gbW0yKEFSR0JBUkdCKSAqLworCQkJCW1vdnFfcjJyKG1tMCwgbW0xKTsgLyogMiB4IHNyYyAtPiBtbTEoQVJHQkFSR0IpICovCisJCQkJbW92cV9yMnIobW0yLCBtbTYpOyAvKiAyIHggZHN0IC0+IG1tNihBUkdCQVJHQikgKi8KKworCQkJCXB1bnBja2xid19yMnIobW01LCBtbTApOyAvKiBsb3cgLSAwQTBSMEcwQiAtPiBtbTAoc3JjMSkgKi8KKwkJCQlwdW5wY2toYndfcjJyKG1tNSwgbW0xKTsgLyogaGlnaCAtIDBBMFIwRzBCIC0+IG1tMShzcmMyKSAqLworCQkJCXB1bnBja2xid19yMnIobW01LCBtbTIpOyAvKiBsb3cgLSAwQTBSMEcwQiAtPiBtbTIoZHN0MSkgKi8KKwkJCQlwdW5wY2toYndfcjJyKG1tNSwgbW02KTsgLyogaGlnaCAtIDBBMFIwRzBCIC0+IG1tNihkc3QyKSAqLworCisJCQkJcHN1YndfcjJyKG1tMiwgbW0wKTsvKiBzcmMxIC0gZHN0MSAtPiBtbTAgKi8KKwkJCQlwbXVsbHdfcjJyKG1tNCwgbW0wKTsgLyogbW0wICogYWxwaGEgLT4gbW0wICovCisJCQkJcHNybHdfaTJyKDgsIG1tMCk7IC8qIG1tMCA+PiA4IC0+IG1tMSAqLworCQkJCXBhZGRiX3IycihtbTAsIG1tMik7IC8qIG1tMCArIG1tMihkc3QxKSAtPiBtbTIgKi8KKworCQkJCXBzdWJ3X3IycihtbTYsIG1tMSk7Lyogc3JjMiAtIGRzdDIgLT4gbW0xICovCisJCQkJcG11bGx3X3IycihtbTQsIG1tMSk7IC8qIG1tMSAqIGFscGhhIC0+IG1tMSAqLworCQkJCXBzcmx3X2kycig4LCBtbTEpOyAvKiBtbTEgPj4gOCAtPiBtbTEgKi8KKwkJCQlwYWRkYl9yMnIobW0xLCBtbTYpOyAvKiBtbTEgKyBtbTYoZHN0MikgLT4gbW02ICovCisKKwkJCQlwYWNrdXN3Yl9yMnIobW02LCBtbTIpOyAgLyogQVJHQkFSR0IgLT4gbW0yICovCisJCQkJcG9yX3IycihtbTcsIG1tMik7IC8qIG1tNyhkc3QgYWxwaGEpIHwgbW0yIC0+IG1tMiAqLworCQkJCQorCQkJCW1vdnFfcjJtKG1tMiwgKmRzdHApOy8qIG1tMiAtPiAyIHggcGl4ZWwgKi8KKworICAJCQkJc3JjcCArPSAyOworICAJCQkJZHN0cCArPSAyOworICAJCQl9LCB3aWR0aCk7CisJCQlzcmNwICs9IHNyY3NraXA7CisJCQlkc3RwICs9IGRzdHNraXA7CisJCX0KKwkJZW1tcygpOworCX0KK30KKworLyogZmFzdCBBUkdCODg4LT4oQSlSR0I4ODggYmxlbmRpbmcgd2l0aCBwaXhlbCBhbHBoYSAqLworc3RhdGljIHZvaWQgQmxpdFJHQnRvUkdCUGl4ZWxBbHBoYU1NWChTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7CisJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7CisJU0RMX1BpeGVsRm9ybWF0KiBzZiA9IGluZm8tPnNyYzsKKwlVaW50MzIgYW1hc2sgPSBzZi0+QW1hc2s7CisKKwlweG9yX3IycihtbTYsIG1tNik7IC8qIDAgLT4gbW02ICovCisJLyogZm9ybSBtdWx0aXBsaWNhdGlvbiBtYXNrICovCisJbW92ZF9tMnIoc2YtPkFtYXNrLCBtbTcpOyAvKiAwMDAwRjAwMCAtPiBtbTcgKi8KKwlwdW5wY2tsYndfcjJyKG1tNywgbW03KTsgLyogRkYwMDAwMDAgLT4gbW03ICovCisJcGNtcGVxYl9yMnIobW0wLCBtbTApOyAvKiBGRkZGRkZGRiAtPiBtbTAgKi8KKwltb3ZxX3IycihtbTAsIG1tMyk7IC8qIEZGRkZGRkZGIC0+IG1tMyAoZm9yIGxhdGVyKSAqLworCXB4b3JfcjJyKG1tMCwgbW03KTsgLyogMDBGRkZGRkYgLT4gbW03IChtdWx0IG1hc2spICovCisJLyogZm9ybSBjaGFubmVsIG1hc2tzICovCisJbW92cV9yMnIobW03LCBtbTApOyAvKiAwMEZGRkZGRiAtPiBtbTAgKi8KKwlwYWNrc3N3Yl9yMnIobW02LCBtbTApOyAvKiAwMDAwMEZGRiAtPiBtbTAgKGNoYW5uZWwgbWFzaykgKi8KKwlwYWNrc3N3Yl9yMnIobW02LCBtbTMpOyAvKiAwMDAwRkZGRiAtPiBtbTMgKi8KKwlweG9yX3IycihtbTAsIG1tMyk7IC8qIDAwMDBGMDAwIC0+IG1tMyAofmNoYW5uZWwgbWFzaykgKi8KKwkvKiBnZXQgYWxwaGEgY2hhbm5lbCBzaGlmdCAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIm1vdmQgJTAsICUlbW01IgorCQk6IDogInJtIiAoKFVpbnQzMikgc2YtPkFzaGlmdCkgKTsgLyogQXNoaWZ0IC0+IG1tNSAqLworCisJd2hpbGUoaGVpZ2h0LS0pIHsKKwkgICAgRFVGRlNfTE9PUDQoeworCQlVaW50MzIgYWxwaGEgPSAqc3JjcCAmIGFtYXNrOworCQkvKiBGSVhNRTogSGVyZSB3ZSBzcGVjaWFsLWNhc2Ugb3BhcXVlIGFscGhhIHNpbmNlIHRoZQorCQkJY29tcG9zaXRpb25pbmcgdXNlZCAoPj44IGluc3RlYWQgb2YgLzI1NSkgZG9lc24ndCBoYW5kbGUKKwkJCWl0IGNvcnJlY3RseS4gQWxzbyBzcGVjaWFsLWNhc2UgYWxwaGE9MCBmb3Igc3BlZWQ/CisJCQlCZW5jaG1hcmsgdGhpcyEgKi8KKwkJaWYoYWxwaGEgPT0gMCkgeworCQkJLyogZG8gbm90aGluZyAqLworCQl9IGVsc2UgaWYoYWxwaGEgPT0gYW1hc2spIHsKKwkJCS8qIG9wYXF1ZSBhbHBoYSAtLSBjb3B5IFJHQiwga2VlcCBkc3QgYWxwaGEgKi8KKwkJCS8qIHVzaW5nIE1NWCBoZXJlIHRvIGZyZWUgdXAgcmVndWxhciByZWdpc3RlcnMgZm9yIG90aGVyIHRoaW5ncyAqLworCQkJbW92ZF9tMnIoKCpzcmNwKSwgbW0xKTsvKiBzcmMoQVJHQikgLT4gbW0xICgwMDAwQVJHQikqLworCQkJbW92ZF9tMnIoKCpkc3RwKSwgbW0yKTsvKiBkc3QoQVJHQikgLT4gbW0yICgwMDAwQVJHQikqLworCQkJcGFuZF9yMnIobW0wLCBtbTEpOyAvKiBzcmMgJiBjaGFubWFzayAtPiBtbTEgKi8KKwkJCXBhbmRfcjJyKG1tMywgbW0yKTsgLyogZHN0ICYgfmNoYW5tYXNrIC0+IG1tMiAqLworCQkJcG9yX3IycihtbTEsIG1tMik7IC8qIHNyYyB8IGRzdCAtPiBtbTIgKi8KKwkJCW1vdmRfcjJtKG1tMiwgKCpkc3RwKSk7IC8qIG1tMiAtPiBkc3QgKi8KKwkJfSBlbHNlIHsKKwkJCW1vdmRfbTJyKCgqc3JjcCksIG1tMSk7Lyogc3JjKEFSR0IpIC0+IG1tMSAoMDAwMEFSR0IpKi8KKwkJCXB1bnBja2xid19yMnIobW02LCBtbTEpOyAvKiAwQTBSMEcwQiAtPiBtbTEgKi8KKworCQkJbW92ZF9tMnIoKCpkc3RwKSwgbW0yKTsvKiBkc3QoQVJHQikgLT4gbW0yICgwMDAwQVJHQikqLworCQkJcHVucGNrbGJ3X3IycihtbTYsIG1tMik7IC8qIDBBMFIwRzBCIC0+IG1tMiAqLworCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCQkJIm1vdmQgJTAsICUlbW00IgorCQkJCTogOiAiciIgKGFscGhhKSApOyAvKiAwMDAwQTAwMCAtPiBtbTQgKi8KKwkJCXBzcmxkX3IycihtbTUsIG1tNCk7IC8qIG1tNCA+PiBtbTUgLT4gbW00ICgwMDAwMDAwQSkgKi8KKwkJCXB1bnBja2x3ZF9yMnIobW00LCBtbTQpOyAvKiAwMDAwMEEwQSAtPiBtbTQgKi8KKwkJCXB1bnBja2x3ZF9yMnIobW00LCBtbTQpOyAvKiAwQTBBMEEwQSAtPiBtbTQgKi8KKwkJCXBhbmRfcjJyKG1tNywgbW00KTsgLyogMDAwQTBBMEEgLT4gbW00LCBwcmVzZXJ2ZSBkc3QgYWxwaGEgb24gYWRkICovCisKKwkJCS8qIGJsZW5kICovCQkgICAgCisJCQlwc3Vid19yMnIobW0yLCBtbTEpOy8qIHNyYyAtIGRzdCAtPiBtbTEgKi8KKwkJCXBtdWxsd19yMnIobW00LCBtbTEpOyAvKiBtbTEgKiBhbHBoYSAtPiBtbTEgKi8KKwkJCXBzcmx3X2kycig4LCBtbTEpOyAvKiBtbTEgPj4gOCAtPiBtbTEoMDAwUjBHMEIpICovCisJCQlwYWRkYl9yMnIobW0xLCBtbTIpOyAvKiBtbTEgKyBtbTIoZHN0KSAtPiBtbTIgKi8KKwkJCQorCQkJcGFja3Vzd2JfcjJyKG1tNiwgbW0yKTsgIC8qIDAwMDBBUkdCIC0+IG1tMiAqLworCQkJbW92ZF9yMm0obW0yLCAqZHN0cCk7LyogbW0yIC0+IGRzdCAqLworCQl9CisJCSsrc3JjcDsKKwkJKytkc3RwOworCSAgICB9LCB3aWR0aCk7CisJICAgIHNyY3AgKz0gc3Jjc2tpcDsKKwkgICAgZHN0cCArPSBkc3Rza2lwOworCX0KKwllbW1zKCk7Cit9CisvKiBFbmQgR0NDX0FTTUJMSVQgKi8KKworI2VsaWYgTVNWQ19BU01CTElUCisvKiBmYXN0IFJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYT0xMjggc3BlY2lhbCBjYXNlICovCitzdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JTdXJmYWNlQWxwaGExMjhNTVgoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOworCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOworCVVpbnQzMiBkYWxwaGEgPSBpbmZvLT5kc3QtPkFtYXNrOworCisJX19tNjQgc3JjMSwgc3JjMiwgZHN0MSwgZHN0MiwgbG1hc2ssIGhtYXNrLCBkc3RhOworCQorCWhtYXNrID0gX21tX3NldF9waTMyKDB4MDBmZWZlZmUsIDB4MDBmZWZlZmUpOyAvKiBhbHBoYTEyOCBtYXNrIC0+IGhtYXNrICovCisJbG1hc2sgPSBfbW1fc2V0X3BpMzIoMHgwMDAxMDEwMSwgMHgwMDAxMDEwMSk7IC8qICFhbHBoYTEyOCBtYXNrIC0+IGxtYXNrICovCisJZHN0YSA9IF9tbV9zZXRfcGkzMihkYWxwaGEsIGRhbHBoYSk7IC8qIGRzdCBhbHBoYSBtYXNrIC0+IGRzdGEgKi8KKworCXdoaWxlIChoZWlnaHQtLSkgeworCQlpbnQgbiA9IHdpZHRoOworCQlpZiAoIG4gJiAxICkgeworCQkJVWludDMyIHMgPSAqc3JjcCsrOworCQkJVWludDMyIGQgPSAqZHN0cDsKKwkJCSpkc3RwKysgPSAoKCgocyAmIDB4MDBmZWZlZmUpICsgKGQgJiAweDAwZmVmZWZlKSkgPj4gMSkKKwkJCQkgICArIChzICYgZCAmIDB4MDAwMTAxMDEpKSB8IGRhbHBoYTsKKwkJCW4tLTsKKwkJfQorCQkKKwkJZm9yIChuID4+PSAxOyBuID4gMDsgLS1uKSB7CisJCQlkc3QxID0gKihfX202NCopZHN0cDsgLyogMiB4IGRzdCAtPiBkc3QxKEFSR0JBUkdCKSAqLworCQkJZHN0MiA9IGRzdDE7ICAgLyogMiB4IGRzdCAtPiBkc3QyKEFSR0JBUkdCKSAqLworCisJCQlzcmMxID0gKihfX202NCopc3JjcDsgLyogMiB4IHNyYyAtPiBzcmMxKEFSR0JBUkdCKSAqLworCQkJc3JjMiA9IHNyYzE7IC8qIDIgeCBzcmMgLT4gc3JjMihBUkdCQVJHQikgKi8KKworCQkJZHN0MiA9IF9tbV9hbmRfc2k2NChkc3QyLCBobWFzayk7IC8qIGRzdCAmIG1hc2sgLT4gZHN0MiAqLworCQkJc3JjMiA9IF9tbV9hbmRfc2k2NChzcmMyLCBobWFzayk7IC8qIHNyYyAmIG1hc2sgLT4gc3JjMiAqLworCQkJc3JjMiA9IF9tbV9hZGRfcGkzMihzcmMyLCBkc3QyKTsgLyogZHN0MiArIHNyYzIgLT4gc3JjMiAqLworCQkJc3JjMiA9IF9tbV9zcmxpX3BpMzIoc3JjMiwgMSk7IC8qIHNyYzIgPj4gMSAtPiBzcmMyICovCisKKwkJCWRzdDEgPSBfbW1fYW5kX3NpNjQoZHN0MSwgc3JjMSk7IC8qIHNyYyAmIGRzdCAtPiBkc3QxICovCisJCQlkc3QxID0gX21tX2FuZF9zaTY0KGRzdDEsIGxtYXNrKTsgLyogZHN0MSAmICFtYXNrIC0+IGRzdDEgKi8KKwkJCWRzdDEgPSBfbW1fYWRkX3BpMzIoZHN0MSwgc3JjMik7IC8qIHNyYzIgKyBkc3QxIC0+IGRzdDEgKi8KKwkJCWRzdDEgPSBfbW1fb3Jfc2k2NChkc3QxLCBkc3RhKTsgLyogZHN0YShmdWxsIGFscGhhKSB8IGRzdDEgLT4gZHN0MSAqLworCQkJCisJCQkqKF9fbTY0Kilkc3RwID0gZHN0MTsgLyogZHN0MSAtPiAyIHggZHN0IHBpeGVscyAqLworCQkJZHN0cCArPSAyOworCQkJc3JjcCArPSAyOworCQl9CisJCQorCQlzcmNwICs9IHNyY3NraXA7CisJCWRzdHAgKz0gZHN0c2tpcDsKKwl9CisJX21tX2VtcHR5KCk7Cit9CisKKy8qIGZhc3QgUkdCODg4LT4oQSlSR0I4ODggYmxlbmRpbmcgd2l0aCBzdXJmYWNlIGFscGhhICovCitzdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JTdXJmYWNlQWxwaGFNTVgoU0RMX0JsaXRJbmZvICppbmZvKQoreworCVNETF9QaXhlbEZvcm1hdCogZGYgPSBpbmZvLT5kc3Q7CisJVWludDMyIGNoYW5tYXNrID0gZGYtPlJtYXNrIHwgZGYtPkdtYXNrIHwgZGYtPkJtYXNrOworCXVuc2lnbmVkIGFscGhhID0gaW5mby0+c3JjLT5hbHBoYTsKKworCWlmIChhbHBoYSA9PSAxMjggJiYgKGRmLT5SbWFzayB8IGRmLT5HbWFzayB8IGRmLT5CbWFzaykgPT0gMHgwMEZGRkZGRikgeworCQkJLyogb25seSBjYWxsIGExMjggdmVyc2lvbiB3aGVuIFIsRyxCIG9jY3VweSBsb3dlciBiaXRzICovCisJCUJsaXRSR0J0b1JHQlN1cmZhY2VBbHBoYTEyOE1NWChpbmZvKTsKKwl9IGVsc2UgeworCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKKwkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKKwkJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOworCQlVaW50MzIgZGFscGhhID0gZGYtPkFtYXNrOworCQlVaW50MzIgYW11bHQ7CisKKwkJX19tNjQgc3JjMSwgc3JjMiwgZHN0MSwgZHN0MiwgbW1fYWxwaGEsIG1tX3plcm8sIGRzdGE7CisJCQorCQltbV96ZXJvID0gX21tX3NldHplcm9fc2k2NCgpOyAvKiAwIC0+IG1tX3plcm8gKi8KKwkJLyogZm9ybSB0aGUgYWxwaGEgbXVsdCAqLworCQlhbXVsdCA9IGFscGhhIHwgKGFscGhhIDw8IDgpOworCQlhbXVsdCA9IGFtdWx0IHwgKGFtdWx0IDw8IDE2KTsKKwkJY2hhbm1hc2sgPSAoMHhmZiA8PCBkZi0+UnNoaWZ0KSB8ICgweGZmIDw8IGRmLT5Hc2hpZnQpIHwgKDB4ZmYgPDwgZGYtPkJzaGlmdCk7CisJCW1tX2FscGhhID0gX21tX3NldF9waTMyKDAsIGFtdWx0ICYgY2hhbm1hc2spOyAvKiAwMDAwQUFBQSAtPiBtbV9hbHBoYSwgbWludXMgMSBjaGFuICovCisJCW1tX2FscGhhID0gX21tX3VucGFja2xvX3BpOChtbV9hbHBoYSwgbW1femVybyk7IC8qIDBBMEEwQTBBIC0+IG1tX2FscGhhLCBtaW51cyAxIGNoYW4gKi8KKwkJCS8qIGF0IHRoaXMgcG9pbnQgbW1fYWxwaGEgY2FuIGJlIDAwMEEwQTBBIG9yIDBBMEEwQTAwIG9yIGFub3RoZXIgY29tYm8gKi8KKwkJZHN0YSA9IF9tbV9zZXRfcGkzMihkYWxwaGEsIGRhbHBoYSk7IC8qIGRzdCBhbHBoYSBtYXNrIC0+IGRzdGEgKi8KKwkJCisJCXdoaWxlIChoZWlnaHQtLSkgeworCQkJaW50IG4gPSB3aWR0aDsKKwkJCWlmIChuICYgMSkgeworCQkJCS8qIE9uZSBQaXhlbCBCbGVuZCAqLworCQkJCXNyYzIgPSBfbW1fY3Z0c2kzMl9zaTY0KCpzcmNwKTsgLyogc3JjKEFSR0IpIC0+IHNyYzIgKDAwMDBBUkdCKSovCisJCQkJc3JjMiA9IF9tbV91bnBhY2tsb19waTgoc3JjMiwgbW1femVybyk7IC8qIDBBMFIwRzBCIC0+IHNyYzIgKi8KKworCQkJCWRzdDEgPSBfbW1fY3Z0c2kzMl9zaTY0KCpkc3RwKTsgLyogZHN0KEFSR0IpIC0+IGRzdDEgKDAwMDBBUkdCKSovCisJCQkJZHN0MSA9IF9tbV91bnBhY2tsb19waTgoZHN0MSwgbW1femVybyk7IC8qIDBBMFIwRzBCIC0+IGRzdDEgKi8KKworCQkJCXNyYzIgPSBfbW1fc3ViX3BpMTYoc3JjMiwgZHN0MSk7IC8qIHNyYzIgLSBkc3QyIC0+IHNyYzIgKi8KKwkJCQlzcmMyID0gX21tX211bGxvX3BpMTYoc3JjMiwgbW1fYWxwaGEpOyAvKiBzcmMyICogYWxwaGEgLT4gc3JjMiAqLworCQkJCXNyYzIgPSBfbW1fc3JsaV9waTE2KHNyYzIsIDgpOyAvKiBzcmMyID4+IDggLT4gc3JjMiAqLworCQkJCWRzdDEgPSBfbW1fYWRkX3BpOChzcmMyLCBkc3QxKTsgLyogc3JjMiArIGRzdDEgLT4gZHN0MSAqLworCQkJCQorCQkJCWRzdDEgPSBfbW1fcGFja3NfcHUxNihkc3QxLCBtbV96ZXJvKTsgIC8qIDAwMDBBUkdCIC0+IGRzdDEgKi8KKwkJCQlkc3QxID0gX21tX29yX3NpNjQoZHN0MSwgZHN0YSk7IC8qIGRzdGEgfCBkc3QxIC0+IGRzdDEgKi8KKwkJCQkqZHN0cCA9IF9tbV9jdnRzaTY0X3NpMzIoZHN0MSk7IC8qIGRzdDEgLT4gcGl4ZWwgKi8KKworCQkJCSsrc3JjcDsKKwkJCQkrK2RzdHA7CisJCQkJCisJCQkJbi0tOworCQkJfQorCisJCQlmb3IgKG4gPj49IDE7IG4gPiAwOyAtLW4pIHsKKwkJCQkvKiBUd28gUGl4ZWxzIEJsZW5kICovCisJCQkJc3JjMSA9ICooX19tNjQqKXNyY3A7IC8qIDIgeCBzcmMgLT4gc3JjMShBUkdCQVJHQikqLworCQkJCXNyYzIgPSBzcmMxOyAvKiAyIHggc3JjIC0+IHNyYzIoQVJHQkFSR0IpICovCisJCQkJc3JjMSA9IF9tbV91bnBhY2tsb19waTgoc3JjMSwgbW1femVybyk7IC8qIGxvdyAtIDBBMFIwRzBCIC0+IHNyYzEgKi8KKwkJCQlzcmMyID0gX21tX3VucGFja2hpX3BpOChzcmMyLCBtbV96ZXJvKTsgLyogaGlnaCAtIDBBMFIwRzBCIC0+IHNyYzIgKi8KKworCQkJCWRzdDEgPSAqKF9fbTY0Kilkc3RwOy8qIDIgeCBkc3QgLT4gZHN0MShBUkdCQVJHQikgKi8KKwkJCQlkc3QyID0gZHN0MTsgLyogMiB4IGRzdCAtPiBkc3QyKEFSR0JBUkdCKSAqLworCQkJCWRzdDEgPSBfbW1fdW5wYWNrbG9fcGk4KGRzdDEsIG1tX3plcm8pOyAvKiBsb3cgLSAwQTBSMEcwQiAtPiBkc3QxICovCisJCQkJZHN0MiA9IF9tbV91bnBhY2toaV9waTgoZHN0MiwgbW1femVybyk7IC8qIGhpZ2ggLSAwQTBSMEcwQiAtPiBkc3QyICovCisKKwkJCQlzcmMxID0gX21tX3N1Yl9waTE2KHNyYzEsIGRzdDEpOy8qIHNyYzEgLSBkc3QxIC0+IHNyYzEgKi8KKwkJCQlzcmMxID0gX21tX211bGxvX3BpMTYoc3JjMSwgbW1fYWxwaGEpOyAvKiBzcmMxICogYWxwaGEgLT4gc3JjMSAqLworCQkJCXNyYzEgPSBfbW1fc3JsaV9waTE2KHNyYzEsIDgpOyAvKiBzcmMxID4+IDggLT4gc3JjMSAqLworCQkJCWRzdDEgPSBfbW1fYWRkX3BpOChzcmMxLCBkc3QxKTsgLyogc3JjMSArIGRzdDEoZHN0MSkgLT4gZHN0MSAqLworCisJCQkJc3JjMiA9IF9tbV9zdWJfcGkxNihzcmMyLCBkc3QyKTsvKiBzcmMyIC0gZHN0MiAtPiBzcmMyICovCisJCQkJc3JjMiA9IF9tbV9tdWxsb19waTE2KHNyYzIsIG1tX2FscGhhKTsgLyogc3JjMiAqIGFscGhhIC0+IHNyYzIgKi8KKwkJCQlzcmMyID0gX21tX3NybGlfcGkxNihzcmMyLCA4KTsgLyogc3JjMiA+PiA4IC0+IHNyYzIgKi8KKwkJCQlkc3QyID0gX21tX2FkZF9waTgoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyKGRzdDIpIC0+IGRzdDIgKi8KKwkJCQkKKwkJCQlkc3QxID0gX21tX3BhY2tzX3B1MTYoZHN0MSwgZHN0Mik7IC8qIDBBMFIwRzBCKHJlczEpLCAwQTBSMEcwQihyZXMyKSAtPiBkc3QxKEFSR0JBUkdCKSAqLworCQkJCWRzdDEgPSBfbW1fb3Jfc2k2NChkc3QxLCBkc3RhKTsgLyogZHN0YSB8IGRzdDEgLT4gZHN0MSAqLworCisJCQkJKihfX202NCopZHN0cCA9IGRzdDE7IC8qIGRzdDEgLT4gMiB4IHBpeGVsICovCisKKwkJCQlzcmNwICs9IDI7CisJCQkJZHN0cCArPSAyOworCQkJfQorCQkJc3JjcCArPSBzcmNza2lwOworCQkJZHN0cCArPSBkc3Rza2lwOworCQl9CisJCV9tbV9lbXB0eSgpOworCX0KK30KKworLyogZmFzdCBBUkdCODg4LT4oQSlSR0I4ODggYmxlbmRpbmcgd2l0aCBwaXhlbCBhbHBoYSAqLworc3RhdGljIHZvaWQgQmxpdFJHQnRvUkdCUGl4ZWxBbHBoYU1NWChTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7CisJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7CisJU0RMX1BpeGVsRm9ybWF0KiBzZiA9IGluZm8tPnNyYzsKKwlVaW50MzIgY2hhbm1hc2sgPSBzZi0+Um1hc2sgfCBzZi0+R21hc2sgfCBzZi0+Qm1hc2s7CisJVWludDMyIGFtYXNrID0gc2YtPkFtYXNrOworCVVpbnQzMiBhc2hpZnQgPSBzZi0+QXNoaWZ0OworCVVpbnQ2NCBtdWx0bWFzazsKKworCV9fbTY0IHNyYzEsIGRzdDEsIG1tX2FscGhhLCBtbV96ZXJvLCBkbWFzazsKKworCW1tX3plcm8gPSBfbW1fc2V0emVyb19zaTY0KCk7IC8qIDAgLT4gbW1femVybyAqLworCW11bHRtYXNrID0gfigweEZGRkZpNjQgPDwgKGFzaGlmdCAqIDIpKTsKKwlkbWFzayA9ICooX19tNjQqKSAmbXVsdG1hc2s7IC8qIGRzdCBhbHBoYSBtYXNrIC0+IGRtYXNrICovCisKKwl3aGlsZShoZWlnaHQtLSkgeworCQlEVUZGU19MT09QNCh7CisJCVVpbnQzMiBhbHBoYSA9ICpzcmNwICYgYW1hc2s7CisJCWlmIChhbHBoYSA9PSAwKSB7CisJCQkvKiBkbyBub3RoaW5nICovCisJCX0gZWxzZSBpZiAoYWxwaGEgPT0gYW1hc2spIHsKKwkJCS8qIG9wYXF1ZSBhbHBoYSAtLSBjb3B5IFJHQiwga2VlcCBkc3QgYWxwaGEgKi8KKwkJCSpkc3RwID0gKCpzcmNwICYgY2hhbm1hc2spIHwgKCpkc3RwICYgfmNoYW5tYXNrKTsKKwkJfSBlbHNlIHsKKwkJCXNyYzEgPSBfbW1fY3Z0c2kzMl9zaTY0KCpzcmNwKTsgLyogc3JjKEFSR0IpIC0+IHNyYzEgKDAwMDBBUkdCKSovCisJCQlzcmMxID0gX21tX3VucGFja2xvX3BpOChzcmMxLCBtbV96ZXJvKTsgLyogMEEwUjBHMEIgLT4gc3JjMSAqLworCisJCQlkc3QxID0gX21tX2N2dHNpMzJfc2k2NCgqZHN0cCk7IC8qIGRzdChBUkdCKSAtPiBkc3QxICgwMDAwQVJHQikqLworCQkJZHN0MSA9IF9tbV91bnBhY2tsb19waTgoZHN0MSwgbW1femVybyk7IC8qIDBBMFIwRzBCIC0+IGRzdDEgKi8KKworCQkJbW1fYWxwaGEgPSBfbW1fY3Z0c2kzMl9zaTY0KGFscGhhKTsgLyogYWxwaGEgLT4gbW1fYWxwaGEgKDAwMDAwMDBBKSAqLworCQkJbW1fYWxwaGEgPSBfbW1fc3JsaV9zaTY0KG1tX2FscGhhLCBhc2hpZnQpOyAvKiBtbV9hbHBoYSA+PiBhc2hpZnQgLT4gbW1fYWxwaGEoMDAwMDAwMEEpICovCisJCQltbV9hbHBoYSA9IF9tbV91bnBhY2tsb19waTE2KG1tX2FscGhhLCBtbV9hbHBoYSk7IC8qIDAwMDAwQTBBIC0+IG1tX2FscGhhICovCisJCQltbV9hbHBoYSA9IF9tbV91bnBhY2tsb19waTMyKG1tX2FscGhhLCBtbV9hbHBoYSk7IC8qIDBBMEEwQTBBIC0+IG1tX2FscGhhICovCisJCQltbV9hbHBoYSA9IF9tbV9hbmRfc2k2NChtbV9hbHBoYSwgZG1hc2spOyAvKiAwMDBBMEEwQSAtPiBtbV9hbHBoYSwgcHJlc2VydmUgZHN0IGFscGhhIG9uIGFkZCAqLworCisJCQkvKiBibGVuZCAqLwkJICAgIAorCQkJc3JjMSA9IF9tbV9zdWJfcGkxNihzcmMxLCBkc3QxKTsvKiBzcmMxIC0gZHN0MSAtPiBzcmMxICovCisJCQlzcmMxID0gX21tX211bGxvX3BpMTYoc3JjMSwgbW1fYWxwaGEpOyAvKiAoc3JjMSAtIGRzdDEpICogYWxwaGEgLT4gc3JjMSAqLworCQkJc3JjMSA9IF9tbV9zcmxpX3BpMTYoc3JjMSwgOCk7IC8qIHNyYzEgPj4gOCAtPiBzcmMxKDAwMFIwRzBCKSAqLworCQkJZHN0MSA9IF9tbV9hZGRfcGk4KHNyYzEsIGRzdDEpOyAvKiBzcmMxICsgZHN0MSAtPiBkc3QxKDBBMFIwRzBCKSAqLworCQkJZHN0MSA9IF9tbV9wYWNrc19wdTE2KGRzdDEsIG1tX3plcm8pOyAgLyogMDAwMEFSR0IgLT4gZHN0MSAqLworCQkJCisJCQkqZHN0cCA9IF9tbV9jdnRzaTY0X3NpMzIoZHN0MSk7IC8qIGRzdDEgLT4gcGl4ZWwgKi8KKwkJfQorCQkrK3NyY3A7CisJCSsrZHN0cDsKKwkgICAgfSwgd2lkdGgpOworCSAgICBzcmNwICs9IHNyY3NraXA7CisJICAgIGRzdHAgKz0gZHN0c2tpcDsKKwl9CisJX21tX2VtcHR5KCk7Cit9CisvKiBFbmQgTVNWQ19BU01CTElUICovCisKKyNlbmRpZiAvKiBHQ0NfQVNNQkxJVCwgTVNWQ19BU01CTElUICovCisKKyNpZiBTRExfQUxUSVZFQ19CTElUVEVSUworI2lmIF9fTVdFUktTX18KKyNwcmFnbWEgYWx0aXZlY19tb2RlbCBvbgorI2VuZGlmCisjaWYgSEFWRV9BTFRJVkVDX0gKKyNpbmNsdWRlIDxhbHRpdmVjLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2lmIChkZWZpbmVkKF9fTUFDT1NYX18pICYmIChfX0dOVUNfXyA8IDQpKQorICAgICNkZWZpbmUgVkVDVUlOVDhfTElURVJBTChhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwKSBcCisgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgKCBhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwICkKKyAgICAjZGVmaW5lIFZFQ1VJTlQxNl9MSVRFUkFMKGEsYixjLGQsZSxmLGcsaCkgXAorICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSAoIGEsYixjLGQsZSxmLGcsaCApCisjZWxzZQorICAgICNkZWZpbmUgVkVDVUlOVDhfTElURVJBTChhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwKSBcCisgICAgICAgICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgeyBhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwIH0KKyAgICAjZGVmaW5lIFZFQ1VJTlQxNl9MSVRFUkFMKGEsYixjLGQsZSxmLGcsaCkgXAorICAgICAgICAodmVjdG9yIHVuc2lnbmVkIHNob3J0KSB7IGEsYixjLGQsZSxmLGcsaCB9CisjZW5kaWYKKworI2RlZmluZSBVTkFMSUdORURfUFRSKHgpICgoKHNpemVfdCkgeCkgJiAweDAwMDAwMDBGKQorI2RlZmluZSBWRUNQUklOVChtc2csIHYpIGRvIHsgXAorICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgdG1wdmVjID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpKHYpOyBcCisgICAgdW5zaWduZWQgaW50ICp2cCA9ICh1bnNpZ25lZCBpbnQgKikmdG1wdmVjOyBcCisgICAgcHJpbnRmKCIlcyA9ICUwOFggJTA4WCAlMDhYICUwOFhcbiIsIG1zZywgdnBbMF0sIHZwWzFdLCB2cFsyXSwgdnBbM10pOyBcCit9IHdoaWxlICgwKQorCisvKiB0aGUgcGVybXVhdGlvbiB2ZWN0b3IgdGhhdCB0YWtlcyB0aGUgaGlnaCBieXRlcyBvdXQgb2YgYWxsIHRoZSBhcHByb3ByaWF0ZSBzaG9ydHMgCisgICAgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgKKyAgICAgICAgMHgwMCwgMHgxMCwgMHgwMiwgMHgxMiwKKyAgICAgICAgMHgwNCwgMHgxNCwgMHgwNiwgMHgxNiwKKyAgICAgICAgMHgwOCwgMHgxOCwgMHgwQSwgMHgxQSwKKyAgICAgICAgMHgwQywgMHgxQywgMHgwRSwgMHgxRSApOworKi8KKyNkZWZpbmUgVkVDX01FUkdFX1BFUk1VVEUoKSAodmVjX2FkZCh2ZWNfbHZzbCgwLCAoaW50KilOVUxMKSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19zcGxhdF91MTYoMHgwRikpKQorI2RlZmluZSBWRUNfVTMyXzI0KCkgKHZlY19hZGQodmVjX3NwbGF0X3UzMigxMiksIHZlY19zcGxhdF91MzIoMTIpKSkKKyNkZWZpbmUgVkVDX0FMUEhBX01BU0soKSAoKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19zbCgodmVjdG9yIHVuc2lnbmVkIGludCl2ZWNfc3BsYXRfczgoLTEpLCBWRUNfVTMyXzI0KCkpKQorI2RlZmluZSBWRUNfQUxJR05FUihzcmMpICgoVU5BTElHTkVEX1BUUihzcmMpKSBcCisgICAgPyB2ZWNfbHZzbCgwLCBzcmMpIFwKKyAgICA6IHZlY19hZGQodmVjX2x2c2woOCwgc3JjKSwgdmVjX3NwbGF0X3U4KDgpKSkKKworICAgCisjZGVmaW5lIFZFQ19NVUxUSVBMWV9BTFBIQSh2cywgdmQsIHZhbHBoYSwgbWVyZ2VQZXJtdXRlLCB2MV8xNiwgdjhfMTYpIGRvIHsgXAorICAgIC8qIHZ0ZW1wMSBjb250YWlucyBzb3VyY2UgQUFHR0FBR0dBQUdHQUFHRyAqLyBcCisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZ0ZW1wMSA9IHZlY19tdWxlKHZzLCB2YWxwaGEpOyBcCisgICAgLyogdnRlbXAyIGNvbnRhaW5zIHNvdXJjZSBSUkJCUlJCQlJSQkJSUkJCICovIFwKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdnRlbXAyID0gdmVjX211bG8odnMsIHZhbHBoYSk7IFwKKyAgICAvKiB2YWxwaGEyIGlzIDI1NS1hbHBoYSAqLyBcCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhMiA9IHZlY19ub3IodmFscGhhLCB2YWxwaGEpOyBcCisgICAgLyogdnRlbXAzIGNvbnRhaW5zIGRlc3QgQUFHR0FBR0dBQUdHQUFHRyAqLyBcCisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZ0ZW1wMyA9IHZlY19tdWxlKHZkLCB2YWxwaGEyKTsgXAorICAgIC8qIHZ0ZW1wNCBjb250YWlucyBkZXN0IFJSQkJSUkJCUlJCQlJSQkIgKi8gXAorICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2dGVtcDQgPSB2ZWNfbXVsbyh2ZCwgdmFscGhhMik7IFwKKyAgICAvKiBhZGQgc291cmNlIGFuZCBkZXN0ICovIFwKKyAgICB2dGVtcDEgPSB2ZWNfYWRkKHZ0ZW1wMSwgdnRlbXAzKTsgXAorICAgIHZ0ZW1wMiA9IHZlY19hZGQodnRlbXAyLCB2dGVtcDQpOyBcCisgICAgLyogdnRlbXAxID0gKHZ0ZW1wMSArIDEpICsgKCh2dGVtcDEgKyAxKSA+PiA4KSAqLyBcCisgICAgdnRlbXAxID0gdmVjX2FkZCh2dGVtcDEsIHYxXzE2KTsgXAorICAgIHZ0ZW1wMyA9IHZlY19zcih2dGVtcDEsIHY4XzE2KTsgXAorICAgIHZ0ZW1wMSA9IHZlY19hZGQodnRlbXAxLCB2dGVtcDMpOyBcCisgICAgLyogdnRlbXAyID0gKHZ0ZW1wMiArIDEpICsgKCh2dGVtcDIgKyAxKSA+PiA4KSAqLyBcCisgICAgdnRlbXAyID0gdmVjX2FkZCh2dGVtcDIsIHYxXzE2KTsgXAorICAgIHZ0ZW1wNCA9IHZlY19zcih2dGVtcDIsIHY4XzE2KTsgXAorICAgIHZ0ZW1wMiA9IHZlY19hZGQodnRlbXAyLCB2dGVtcDQpOyBcCisgICAgLyogKD4+OCkgYW5kIGdldCBBUkdCQVJHQkFSR0JBUkdCICovIFwKKyAgICB2ZCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfcGVybSh2dGVtcDEsIHZ0ZW1wMiwgbWVyZ2VQZXJtdXRlKTsgXAorfSB3aGlsZSAoMCkKKyAKKy8qIENhbGN1bGF0ZSB0aGUgcGVybXV0ZSB2ZWN0b3IgdXNlZCBmb3IgMzItPjMyIHN3aXp6bGluZyAqLworc3RhdGljIHZlY3RvciB1bnNpZ25lZCBjaGFyIGNhbGNfc3dpenpsZTMyKGNvbnN0IFNETF9QaXhlbEZvcm1hdCAqc3JjZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETF9QaXhlbEZvcm1hdCAqZHN0Zm10KQoreworICAgIC8qCisgICAgICogV2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgYml0cyB0aGF0IGFyZW4ndCB1c2VkIGJ5IG90aGVyCisgICAgICogIGNvbG9ycyBpcyBhbHBoYSwgYW5kIGl0J3Mgb25lIGNvbXBsZXRlIGJ5dGUsIHNpbmNlIHNvbWUgZm9ybWF0cworICAgICAqICBsZWF2ZSBhbHBoYSB3aXRoIGEgemVybyBtYXNrLCBidXQgd2Ugc2hvdWxkIHN0aWxsIHN3aXp6bGUgdGhlIGJpdHMuCisgICAgICovCisgICAgLyogQVJHQiAqLworICAgIGNvbnN0IHN0YXRpYyBzdHJ1Y3QgU0RMX1BpeGVsRm9ybWF0IGRlZmF1bHRfcGl4ZWxfZm9ybWF0ID0geworICAgICAgICBOVUxMLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAxNiwgOCwgMCwgMjQsCisgICAgICAgIDB4MDBGRjAwMDAsIDB4MDAwMEZGMDAsIDB4MDAwMDAwRkYsIDB4RkYwMDAwMDAsCisgICAgICAgIDAsIDB9OworICAgIGlmICghc3JjZm10KSB7CisgICAgICAgIHNyY2ZtdCA9ICZkZWZhdWx0X3BpeGVsX2Zvcm1hdDsKKyAgICB9CisgICAgaWYgKCFkc3RmbXQpIHsKKyAgICAgICAgZHN0Zm10ID0gJmRlZmF1bHRfcGl4ZWxfZm9ybWF0OworICAgIH0KKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBwbHVzID0gVkVDVUlOVDhfTElURVJBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4LCAweDA4LCAweDA4LCAweDA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMsIDB4MEMsIDB4MEMsIDB4MEMgKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c3dpejsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHNyY3ZlYzsKKyNkZWZpbmUgUkVTSElGVChYKSAoMyAtICgoWCkgPj4gMykpCisgICAgVWludDMyIHJtYXNrID0gUkVTSElGVChzcmNmbXQtPlJzaGlmdCkgPDwgKGRzdGZtdC0+UnNoaWZ0KTsKKyAgICBVaW50MzIgZ21hc2sgPSBSRVNISUZUKHNyY2ZtdC0+R3NoaWZ0KSA8PCAoZHN0Zm10LT5Hc2hpZnQpOworICAgIFVpbnQzMiBibWFzayA9IFJFU0hJRlQoc3JjZm10LT5Cc2hpZnQpIDw8IChkc3RmbXQtPkJzaGlmdCk7CisgICAgVWludDMyIGFtYXNrOworICAgIC8qIFVzZSB6ZXJvIGZvciBhbHBoYSBpZiBlaXRoZXIgc3VyZmFjZSBkb2Vzbid0IGhhdmUgYWxwaGEgKi8KKyAgICBpZiAoZHN0Zm10LT5BbWFzaykgeworICAgICAgICBhbWFzayA9ICgoc3JjZm10LT5BbWFzaykgPyBSRVNISUZUKHNyY2ZtdC0+QXNoaWZ0KSA6IDB4MTApIDw8IChkc3RmbXQtPkFzaGlmdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYW1hc2sgPSAweDEwMTAxMDEwICYgKChkc3RmbXQtPlJtYXNrIHwgZHN0Zm10LT5HbWFzayB8IGRzdGZtdC0+Qm1hc2spIF4gMHhGRkZGRkZGRik7CisgICAgfQorI3VuZGVmIFJFU0hJRlQgIAorICAgICgodW5zaWduZWQgaW50ICopKGNoYXIqKSZzcmN2ZWMpWzBdID0gKHJtYXNrIHwgZ21hc2sgfCBibWFzayB8IGFtYXNrKTsKKyAgICB2c3dpeiA9IHZlY19hZGQocGx1cywgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19zcGxhdChzcmN2ZWMsIDApKTsKKyAgICByZXR1cm4odnN3aXopOworfQorCitzdGF0aWMgdm9pZCBCbGl0MzJ0bzU2NVBpeGVsQWxwaGFBbHRpdmVjKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKyAgICBpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisgICAgVWludDggKnNyYyA9IChVaW50OCAqKWluZm8tPnNfcGl4ZWxzOworICAgIGludCBzcmNza2lwID0gaW5mby0+c19za2lwOworICAgIFVpbnQ4ICpkc3QgPSAoVWludDggKilpbmZvLT5kX3BpeGVsczsKKyAgICBpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKKyAgICBTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKKworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHYwID0gdmVjX3NwbGF0X3U4KDApOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2OF8xNiA9IHZlY19zcGxhdF91MTYoOCk7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYxXzE2ID0gdmVjX3NwbGF0X3UxNigxKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjJfMTYgPSB2ZWNfc3BsYXRfdTE2KDIpOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2M18xNiA9IHZlY19zcGxhdF91MTYoMyk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2OF8zMiA9IHZlY19zcGxhdF91MzIoOCk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2MTZfMzIgPSB2ZWNfYWRkKHY4XzMyLCB2OF8zMik7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYzZiA9IFZFQ1VJTlQxNl9MSVRFUkFMKAorICAgICAgICAweDAwM2YsIDB4MDAzZiwgMHgwMDNmLCAweDAwM2YsCisgICAgICAgIDB4MDAzZiwgMHgwMDNmLCAweDAwM2YsIDB4MDAzZik7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZmYyA9IFZFQ1VJTlQxNl9MSVRFUkFMKAorICAgICAgICAweDAwZmMsIDB4MDBmYywgMHgwMGZjLCAweDAwZmMsCisgICAgICAgIDB4MDBmYywgMHgwMGZjLCAweDAwZmMsIDB4MDBmYyk7CisKKyAgICAvKiAKKyAgICAgICAgMHgxMCAtIDB4MWYgaXMgdGhlIGFscGhhCisgICAgICAgIDB4MDAgLSAweDBlIGV2ZW5zIGFyZSB0aGUgcmVkCisgICAgICAgIDB4MDEgLSAweDBmIG9kZHMgYXJlIHplcm8KKyAgICAqLworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZyZWRhbHBoYTEgPSBWRUNVSU5UOF9MSVRFUkFMKAorICAgICAgICAweDEwLCAweDAwLCAweDAxLCAweDAxLAorICAgICAgICAweDEwLCAweDAyLCAweDAxLCAweDAxLAorICAgICAgICAweDEwLCAweDA0LCAweDAxLCAweDAxLAorICAgICAgICAweDEwLCAweDA2LCAweDAxLCAweDAxCisgICAgKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cmVkYWxwaGEyID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgKKyAgICAgICAgdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIGludCl2cmVkYWxwaGExLCB2ZWNfc2wodjhfMzIsIHYxNl8zMikpCisgICAgKTsKKyAgICAvKgorICAgICAgICAweDAwIC0gMHgwZiBpcyBBUnh4IEFSeHggQVJ4eCBBUnh4CisgICAgICAgIDB4MTEgLSAweDBmIG9kZHMgYXJlIGJsdWUKKyAgICAqLworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZibHVlMSA9IFZFQ1VJTlQ4X0xJVEVSQUwoCisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MTEsCisgICAgICAgIDB4MDQsIDB4MDUsIDB4MDYsIDB4MTMsCisgICAgICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MTUsCisgICAgICAgIDB4MGMsIDB4MGQsIDB4MGUsIDB4MTcKKyAgICApOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZibHVlMiA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoCisgICAgICAgIHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBpbnQpdmJsdWUxLCB2OF8zMikKKyAgICApOworICAgIC8qCisgICAgICAgIDB4MDAgLSAweDBmIGlzIEFSeEIgQVJ4QiBBUnhCIEFSeEIKKyAgICAgICAgMHgxMCAtIDB4MGUgZXZlbnMgYXJlIGdyZWVuCisgICAgKi8KKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Z3JlZW4xID0gVkVDVUlOVDhfTElURVJBTCgKKyAgICAgICAgMHgwMCwgMHgwMSwgMHgxMCwgMHgwMywKKyAgICAgICAgMHgwNCwgMHgwNSwgMHgxMiwgMHgwNywKKyAgICAgICAgMHgwOCwgMHgwOSwgMHgxNCwgMHgwYiwKKyAgICAgICAgMHgwYywgMHgwZCwgMHgxNiwgMHgwZgorICAgICk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmdyZWVuMiA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoCisgICAgICAgIHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBpbnQpdmdyZWVuMSwgdmVjX3NsKHY4XzMyLCB2OF8zMikpCisgICAgKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Z21lcmdlID0gVkVDVUlOVDhfTElURVJBTCgKKyAgICAgICAgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwKKyAgICAgICAgMHgwMCwgMHgwYSwgMHgwMCwgMHgwZSwKKyAgICAgICAgMHgwMCwgMHgxMiwgMHgwMCwgMHgxNiwKKyAgICAgICAgMHgwMCwgMHgxYSwgMHgwMCwgMHgxZSk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWVyZ2VQZXJtdXRlID0gVkVDX01FUkdFX1BFUk1VVEUoKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKHNyY2ZtdCwgTlVMTCk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhUGVybXV0ZSA9IHZlY19hbmQodmVjX2x2c2woMCwgKGludCAqKU5VTEwpLCB2ZWNfc3BsYXRfdTgoMHhDKSk7CisKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdmY4MDAgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19zcGxhdF91OCgtNyk7CisgICAgdmY4MDAgPSB2ZWNfc2wodmY4MDAsIHZlY19zcGxhdF91MTYoOCkpOworCisgICAgd2hpbGUoaGVpZ2h0LS0pIHsKKyAgICAgICAgaW50IGV4dHJhd2lkdGg7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c3JjOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2b3ZlcmZsb3c7CisgICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisKKyNkZWZpbmUgT05FX1BJWEVMX0JMRU5EKGNvbmRpdGlvbiwgd2lkdGh2YXIpIFwKKyAgICAgICAgd2hpbGUgKGNvbmRpdGlvbikgeyBcCisgICAgICAgICAgICBVaW50MzIgUGl4ZWw7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIHNSLCBzRywgc0IsIGRSLCBkRywgZEIsIHNBOyBcCisgICAgICAgICAgICBESVNFTUJMRV9SR0JBKHNyYywgNCwgc3JjZm10LCBQaXhlbCwgc1IsIHNHLCBzQiwgc0EpOyBcCisgICAgICAgICAgICBpZihzQSkgeyBcCisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZHN0cGl4ZWwgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKWRzdCk7IFwKKyAgICAgICAgICAgICAgICBkUiA9IChkc3RwaXhlbCA+PiA4KSAmIDB4Zjg7IFwKKyAgICAgICAgICAgICAgICBkRyA9IChkc3RwaXhlbCA+PiAzKSAmIDB4ZmM7IFwKKyAgICAgICAgICAgICAgICBkQiA9IChkc3RwaXhlbCA8PCAzKSAmIDB4Zjg7IFwKKyAgICAgICAgICAgICAgICBBTFBIQV9CTEVORChzUiwgc0csIHNCLCBzQSwgZFIsIGRHLCBkQik7IFwKKyAgICAgICAgICAgICAgICAqKCh1bnNpZ25lZCBzaG9ydCAqKWRzdCkgPSAoIFwKKyAgICAgICAgICAgICAgICAgICAgKChkUiAmIDB4ZjgpIDw8IDgpIHwgKChkRyAmIDB4ZmMpIDw8IDMpIHwgKGRCID4+IDMpIFwKKyAgICAgICAgICAgICAgICApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIHNyYyArPSA0OyBcCisgICAgICAgICAgICBkc3QgKz0gMjsgXAorICAgICAgICAgICAgd2lkdGh2YXItLTsgXAorICAgICAgICB9CisgICAgICAgIE9ORV9QSVhFTF9CTEVORCgoVU5BTElHTkVEX1BUUihkc3QpKSAmJiAod2lkdGgpLCB3aWR0aCk7CisgICAgICAgIGV4dHJhd2lkdGggPSAod2lkdGggJSA4KTsKKyAgICAgICAgdmFsaWduZXIgPSBWRUNfQUxJR05FUihzcmMpOworICAgICAgICB2c3JjID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgwLCBzcmMpOworICAgICAgICB3aWR0aCAtPSBleHRyYXdpZHRoOworICAgICAgICB3aGlsZSAod2lkdGgpIHsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzcmMxLCB2c3JjMjsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkc3QxLCB2ZHN0MjsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2UiwgdkcsIHZCOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZwaXhlbCwgdnJwaXhlbCwgdmdwaXhlbCwgdmJwaXhlbDsKKworICAgICAgICAgICAgLyogTG9hZCA4IHBpeGVscyBmcm9tIHNyYyBhcyBBUkdCICovCisgICAgICAgICAgICB2b3ZlcmZsb3cgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDE1LCBzcmMpOworICAgICAgICAgICAgdnNyYyA9IHZlY19wZXJtKHZzcmMsIHZvdmVyZmxvdywgdmFsaWduZXIpOworICAgICAgICAgICAgdnNyYzEgPSB2ZWNfcGVybSh2c3JjLCB2c3JjLCB2cGVybXV0ZSk7CisgICAgICAgICAgICBzcmMgKz0gMTY7CisgICAgICAgICAgICB2c3JjID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgxNSwgc3JjKTsKKyAgICAgICAgICAgIHZvdmVyZmxvdyA9IHZlY19wZXJtKHZvdmVyZmxvdywgdnNyYywgdmFsaWduZXIpOworICAgICAgICAgICAgdnNyYzIgPSB2ZWNfcGVybSh2b3ZlcmZsb3csIHZvdmVyZmxvdywgdnBlcm11dGUpOworICAgICAgICAgICAgc3JjICs9IDE2OworCisgICAgICAgICAgICAvKiBMb2FkIDggcGl4ZWxzIGZyb20gZHN0IGFzIFhSR0IgKi8KKyAgICAgICAgICAgIHZvdmVyZmxvdyA9IHZlY19sZCgwLCBkc3QpOworICAgICAgICAgICAgdlIgPSB2ZWNfYW5kKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdm92ZXJmbG93LCB2ZjgwMCk7CisgICAgICAgICAgICB2QiA9IHZlY19zbCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZvdmVyZmxvdywgdjNfMTYpOworICAgICAgICAgICAgdkcgPSB2ZWNfc2wodkIsIHYyXzE2KTsKKyAgICAgICAgICAgIHZkc3QxID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcil2UiwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZSLCB2cmVkYWxwaGExKTsKKyAgICAgICAgICAgIHZkc3QxID0gdmVjX3Blcm0odmRzdDEsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2QiwgdmJsdWUxKTsKKyAgICAgICAgICAgIHZkc3QxID0gdmVjX3Blcm0odmRzdDEsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2RywgdmdyZWVuMSk7CisgICAgICAgICAgICB2ZHN0MiA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfcGVybSgodmVjdG9yIHVuc2lnbmVkIGNoYXIpdlIsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2UiwgdnJlZGFscGhhMik7CisgICAgICAgICAgICB2ZHN0MiA9IHZlY19wZXJtKHZkc3QyLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdkIsIHZibHVlMik7CisgICAgICAgICAgICB2ZHN0MiA9IHZlY19wZXJtKHZkc3QyLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdkcsIHZncmVlbjIpOworCisgICAgICAgICAgICAvKiBBbHBoYSBibGVuZCA4IHBpeGVscyBhcyBBUkdCICovCisgICAgICAgICAgICB2YWxwaGEgPSB2ZWNfcGVybSh2c3JjMSwgdjAsIHZhbHBoYVBlcm11dGUpOworICAgICAgICAgICAgVkVDX01VTFRJUExZX0FMUEhBKHZzcmMxLCB2ZHN0MSwgdmFscGhhLCBtZXJnZVBlcm11dGUsIHYxXzE2LCB2OF8xNik7CisgICAgICAgICAgICB2YWxwaGEgPSB2ZWNfcGVybSh2c3JjMiwgdjAsIHZhbHBoYVBlcm11dGUpOworICAgICAgICAgICAgVkVDX01VTFRJUExZX0FMUEhBKHZzcmMyLCB2ZHN0MiwgdmFscGhhLCBtZXJnZVBlcm11dGUsIHYxXzE2LCB2OF8xNik7CisKKyAgICAgICAgICAgIC8qIENvbnZlcnQgOCBwaXhlbHMgdG8gNTY1ICovCisgICAgICAgICAgICB2cGl4ZWwgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19wYWNrcHgoKHZlY3RvciB1bnNpZ25lZCBpbnQpdmRzdDEsICh2ZWN0b3IgdW5zaWduZWQgaW50KXZkc3QyKTsKKyAgICAgICAgICAgIHZncGl4ZWwgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19wZXJtKHZkc3QxLCB2ZHN0MiwgdmdtZXJnZSk7CisgICAgICAgICAgICB2Z3BpeGVsID0gdmVjX2FuZCh2Z3BpeGVsLCB2ZmMpOworICAgICAgICAgICAgdmdwaXhlbCA9IHZlY19zbCh2Z3BpeGVsLCB2M18xNik7CisgICAgICAgICAgICB2cnBpeGVsID0gdmVjX3NsKHZwaXhlbCwgdjFfMTYpOworICAgICAgICAgICAgdnJwaXhlbCA9IHZlY19hbmQodnJwaXhlbCwgdmY4MDApOworICAgICAgICAgICAgdmJwaXhlbCA9IHZlY19hbmQodnBpeGVsLCB2M2YpOworICAgICAgICAgICAgdmRzdDEgPSB2ZWNfb3IoKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZycGl4ZWwsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2Z3BpeGVsKTsKKyAgICAgICAgICAgIHZkc3QxID0gdmVjX29yKHZkc3QxLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmJwaXhlbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFN0b3JlIDggcGl4ZWxzICovCisgICAgICAgICAgICB2ZWNfc3QodmRzdDEsIDAsIGRzdCk7CisKKyAgICAgICAgICAgIHdpZHRoIC09IDg7CisgICAgICAgICAgICBkc3QgKz0gMTY7CisgICAgICAgIH0KKyAgICAgICAgT05FX1BJWEVMX0JMRU5EKChleHRyYXdpZHRoKSwgZXh0cmF3aWR0aCk7CisjdW5kZWYgT05FX1BJWEVMX0JMRU5ECisgICAgICAgIHNyYyArPSBzcmNza2lwOworICAgICAgICBkc3QgKz0gZHN0c2tpcDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEJsaXQzMnRvMzJTdXJmYWNlQWxwaGFLZXlBbHRpdmVjKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKyAgICB1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7CisgICAgaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworICAgIFVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKKyAgICBpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOworICAgIFVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKKyAgICBpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOworICAgIFNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOworICAgIFNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OworICAgIHVuc2lnbmVkIHNBID0gc3JjZm10LT5hbHBoYTsKKyAgICB1bnNpZ25lZCBkQSA9IGRzdGZtdC0+QW1hc2sgPyBTRExfQUxQSEFfT1BBUVVFIDogMDsKKyAgICBVaW50MzIgcmdibWFzayA9IHNyY2ZtdC0+Um1hc2sgfCBzcmNmbXQtPkdtYXNrIHwgc3JjZm10LT5CbWFzazsKKyAgICBVaW50MzIgY2tleSA9IGluZm8tPnNyYy0+Y29sb3JrZXk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWVyZ2VQZXJtdXRlOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzcmNQZXJtdXRlOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkc3RQZXJtdXRlOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzZHN0UGVybXV0ZTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGE7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhbWFzazsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Yml0czsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2MDsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjE7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHY4OworICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgdmNrZXk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2cmdibWFzazsKKworICAgIG1lcmdlUGVybXV0ZSA9IFZFQ19NRVJHRV9QRVJNVVRFKCk7CisgICAgdjAgPSB2ZWNfc3BsYXRfdTgoMCk7CisgICAgdjEgPSB2ZWNfc3BsYXRfdTE2KDEpOworICAgIHY4ID0gdmVjX3NwbGF0X3UxNig4KTsKKworICAgIC8qIHNldCB0aGUgYWxwaGEgdG8gMjU1IG9uIHRoZSBkZXN0aW5hdGlvbiBzdXJmICovCisgICAgdmFscGhhbWFzayA9IFZFQ19BTFBIQV9NQVNLKCk7CisKKyAgICB2c3JjUGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKHNyY2ZtdCwgTlVMTCk7CisgICAgdmRzdFBlcm11dGUgPSBjYWxjX3N3aXp6bGUzMihOVUxMLCBkc3RmbXQpOworICAgIHZzZHN0UGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKGRzdGZtdCwgTlVMTCk7CisKKyAgICAvKiBzZXQgYSB2ZWN0b3IgZnVsbCBvZiBhbHBoYSBhbmQgMjU1LWFscGhhICovCisgICAgKCh1bnNpZ25lZCBjaGFyICopJnZhbHBoYSlbMF0gPSBhbHBoYTsKKyAgICB2YWxwaGEgPSB2ZWNfc3BsYXQodmFscGhhLCAwKTsKKyAgICB2Yml0cyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfc3BsYXRfczgoLTEpOworCisgICAgY2tleSAmPSByZ2JtYXNrOworICAgICgodW5zaWduZWQgaW50ICopKGNoYXIqKSZ2Y2tleSlbMF0gPSBja2V5OworICAgIHZja2V5ID0gdmVjX3NwbGF0KHZja2V5LCAwKTsKKyAgICAoKHVuc2lnbmVkIGludCAqKShjaGFyKikmdnJnYm1hc2spWzBdID0gcmdibWFzazsKKyAgICB2cmdibWFzayA9IHZlY19zcGxhdCh2cmdibWFzaywgMCk7CisKKyAgICB3aGlsZShoZWlnaHQtLSkgeworICAgICAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworI2RlZmluZSBPTkVfUElYRUxfQkxFTkQoY29uZGl0aW9uLCB3aWR0aHZhcikgXAorICAgICAgICB3aGlsZSAoY29uZGl0aW9uKSB7IFwKKyAgICAgICAgICAgIFVpbnQzMiBQaXhlbDsgXAorICAgICAgICAgICAgdW5zaWduZWQgc1IsIHNHLCBzQiwgZFIsIGRHLCBkQjsgXAorICAgICAgICAgICAgUkVUUklFVkVfUkdCX1BJWEVMKCgoVWludDggKilzcmNwKSwgNCwgUGl4ZWwpOyBcCisgICAgICAgICAgICBpZihzQSAmJiBQaXhlbCAhPSBja2V5KSB7IFwKKyAgICAgICAgICAgICAgICBSR0JfRlJPTV9QSVhFTChQaXhlbCwgc3JjZm10LCBzUiwgc0csIHNCKTsgXAorICAgICAgICAgICAgICAgIERJU0VNQkxFX1JHQigoKFVpbnQ4ICopZHN0cCksIDQsIGRzdGZtdCwgUGl4ZWwsIGRSLCBkRywgZEIpOyBcCisgICAgICAgICAgICAgICAgQUxQSEFfQkxFTkQoc1IsIHNHLCBzQiwgc0EsIGRSLCBkRywgZEIpOyBcCisgICAgICAgICAgICAgICAgQVNTRU1CTEVfUkdCQSgoKFVpbnQ4ICopZHN0cCksIDQsIGRzdGZtdCwgZFIsIGRHLCBkQiwgZEEpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGRzdHArKzsgXAorICAgICAgICAgICAgc3JjcCsrOyBcCisgICAgICAgICAgICB3aWR0aHZhci0tOyBcCisgICAgICAgIH0KKyAgICAgICAgT05FX1BJWEVMX0JMRU5EKChVTkFMSUdORURfUFRSKGRzdHApKSAmJiAod2lkdGgpLCB3aWR0aCk7CisgICAgICAgIGlmICh3aWR0aCA+IDApIHsKKyAgICAgICAgICAgIGludCBleHRyYXdpZHRoID0gKHdpZHRoICUgNCk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxpZ25lciA9IFZFQ19BTElHTkVSKHNyY3ApOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDAsIHNyY3ApOworICAgICAgICAgICAgd2lkdGggLT0gZXh0cmF3aWR0aDsKKyAgICAgICAgICAgIHdoaWxlICh3aWR0aCkgeworICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzZWw7CisgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdm92ZXJmbG93OworICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkOworICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkX29yaWc7CisKKyAgICAgICAgICAgICAgICAvKiBzID0gKnNyY3AgKi8KKyAgICAgICAgICAgICAgICB2b3ZlcmZsb3cgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDE1LCBzcmNwKTsKKyAgICAgICAgICAgICAgICB2cyA9IHZlY19wZXJtKHZzLCB2b3ZlcmZsb3csIHZhbGlnbmVyKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiB2c2VsIGlzIHNldCBmb3IgaXRlbXMgdGhhdCBtYXRjaCB0aGUga2V5ICovCisgICAgICAgICAgICAgICAgdnNlbCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfYW5kKCh2ZWN0b3IgdW5zaWduZWQgaW50KXZzLCB2cmdibWFzayk7CisgICAgICAgICAgICAgICAgdnNlbCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfY21wZXEoKHZlY3RvciB1bnNpZ25lZCBpbnQpdnNlbCwgdmNrZXkpOworCisgICAgICAgICAgICAgICAgLyogcGVybXV0ZSB0byBzb3VyY2UgZm9ybWF0ICovCisgICAgICAgICAgICAgICAgdnMgPSB2ZWNfcGVybSh2cywgdmFscGhhLCB2c3JjUGVybXV0ZSk7CisKKyAgICAgICAgICAgICAgICAvKiBkID0gKmRzdHAgKi8KKyAgICAgICAgICAgICAgICB2ZCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMCwgZHN0cCk7CisgICAgICAgICAgICAgICAgdmRfb3JpZyA9IHZkID0gdmVjX3Blcm0odmQsIHYwLCB2c2RzdFBlcm11dGUpOworCisgICAgICAgICAgICAgICAgVkVDX01VTFRJUExZX0FMUEhBKHZzLCB2ZCwgdmFscGhhLCBtZXJnZVBlcm11dGUsIHYxLCB2OCk7CisKKyAgICAgICAgICAgICAgICAvKiBzZXQgdGhlIGFscGhhIGNoYW5uZWwgdG8gZnVsbCBvbiAqLworICAgICAgICAgICAgICAgIHZkID0gdmVjX29yKHZkLCB2YWxwaGFtYXNrKTsKKworICAgICAgICAgICAgICAgIC8qIG1hc2sgb3V0IGNvbG9yIGtleSAqLworICAgICAgICAgICAgICAgIHZkID0gdmVjX3NlbCh2ZCwgdmRfb3JpZywgdnNlbCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogcGVybXV0ZSB0byBkZXN0IGZvcm1hdCAqLworICAgICAgICAgICAgICAgIHZkID0gdmVjX3Blcm0odmQsIHZiaXRzLCB2ZHN0UGVybXV0ZSk7CisKKyAgICAgICAgICAgICAgICAvKiAqZHN0cCA9IHJlcyAqLworICAgICAgICAgICAgICAgIHZlY19zdCgodmVjdG9yIHVuc2lnbmVkIGludCl2ZCwgMCwgZHN0cCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3JjcCArPSA0OworICAgICAgICAgICAgICAgIGRzdHAgKz0gNDsKKyAgICAgICAgICAgICAgICB3aWR0aCAtPSA0OworICAgICAgICAgICAgICAgIHZzID0gdm92ZXJmbG93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgT05FX1BJWEVMX0JMRU5EKChleHRyYXdpZHRoKSwgZXh0cmF3aWR0aCk7CisgICAgICAgIH0KKyN1bmRlZiBPTkVfUElYRUxfQkxFTkQKKyAKKyAgICAgICAgc3JjcCArPSBzcmNza2lwOworICAgICAgICBkc3RwICs9IGRzdHNraXA7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIEJsaXQzMnRvMzJQaXhlbEFscGhhQWx0aXZlYyhTRExfQmxpdEluZm8gKmluZm8pCit7CisgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisgICAgVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworICAgIGludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7CisgICAgVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWVyZ2VQZXJtdXRlOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYVBlcm11dGU7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnNyY1Blcm11dGU7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmRzdFBlcm11dGU7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnNkc3RQZXJtdXRlOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYW1hc2s7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnBpeGVsbWFzazsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2MDsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjE7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHY4OworCisgICAgdjAgPSB2ZWNfc3BsYXRfdTgoMCk7CisgICAgdjEgPSB2ZWNfc3BsYXRfdTE2KDEpOworICAgIHY4ID0gdmVjX3NwbGF0X3UxNig4KTsKKyAgICBtZXJnZVBlcm11dGUgPSBWRUNfTUVSR0VfUEVSTVVURSgpOworICAgIHZhbHBoYW1hc2sgPSBWRUNfQUxQSEFfTUFTSygpOworICAgIHZhbHBoYVBlcm11dGUgPSB2ZWNfYW5kKHZlY19sdnNsKDAsIChpbnQgKilOVUxMKSwgdmVjX3NwbGF0X3U4KDB4QykpOworICAgIHZwaXhlbG1hc2sgPSB2ZWNfbm9yKHZhbHBoYW1hc2ssIHYwKTsKKyAgICB2c3JjUGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKHNyY2ZtdCwgTlVMTCk7CisgICAgdmRzdFBlcm11dGUgPSBjYWxjX3N3aXp6bGUzMihOVUxMLCBkc3RmbXQpOworICAgIHZzZHN0UGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKGRzdGZtdCwgTlVMTCk7CisKKwl3aGlsZSAoIGhlaWdodC0tICkgeworICAgICAgICB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisjZGVmaW5lIE9ORV9QSVhFTF9CTEVORChjb25kaXRpb24sIHdpZHRodmFyKSB3aGlsZSAoKGNvbmRpdGlvbikpIHsgXAorICAgICAgICAgICAgVWludDMyIFBpeGVsOyBcCisgICAgICAgICAgICB1bnNpZ25lZCBzUiwgc0csIHNCLCBkUiwgZEcsIGRCLCBzQSwgZEE7IFwKKyAgICAgICAgICAgIERJU0VNQkxFX1JHQkEoKFVpbnQ4ICopc3JjcCwgNCwgc3JjZm10LCBQaXhlbCwgc1IsIHNHLCBzQiwgc0EpOyBcCisgICAgICAgICAgICBpZihzQSkgeyBcCisgICAgICAgICAgICAgIERJU0VNQkxFX1JHQkEoKFVpbnQ4ICopZHN0cCwgNCwgZHN0Zm10LCBQaXhlbCwgZFIsIGRHLCBkQiwgZEEpOyBcCisgICAgICAgICAgICAgIEFMUEhBX0JMRU5EKHNSLCBzRywgc0IsIHNBLCBkUiwgZEcsIGRCKTsgXAorICAgICAgICAgICAgICBBU1NFTUJMRV9SR0JBKChVaW50OCAqKWRzdHAsIDQsIGRzdGZtdCwgZFIsIGRHLCBkQiwgZEEpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICsrc3JjcDsgXAorICAgICAgICAgICAgKytkc3RwOyBcCisgICAgICAgICAgICB3aWR0aHZhci0tOyBcCisgICAgICAgIH0KKyAgICAgICAgT05FX1BJWEVMX0JMRU5EKChVTkFMSUdORURfUFRSKGRzdHApKSAmJiAod2lkdGgpLCB3aWR0aCk7CisgICAgICAgIGlmICh3aWR0aCA+IDApIHsKKyAgICAgICAgICAgIC8qIHZzcmNQZXJtdXRlICovCisgICAgICAgICAgICAvKiB2ZHN0UGVybXV0ZSAqLworICAgICAgICAgICAgaW50IGV4dHJhd2lkdGggPSAod2lkdGggJSA0KTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyID0gVkVDX0FMSUdORVIoc3JjcCk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMCwgc3JjcCk7CisgICAgICAgICAgICB3aWR0aCAtPSBleHRyYXdpZHRoOworICAgICAgICAgICAgd2hpbGUgKHdpZHRoKSB7CisgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdm92ZXJmbG93OworICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkOworICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZHN0YWxwaGE7CisgICAgICAgICAgICAgICAgLyogcyA9ICpzcmNwICovCisgICAgICAgICAgICAgICAgdm92ZXJmbG93ID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgxNSwgc3JjcCk7CisgICAgICAgICAgICAgICAgdnMgPSB2ZWNfcGVybSh2cywgdm92ZXJmbG93LCB2YWxpZ25lcik7CisgICAgICAgICAgICAgICAgdnMgPSB2ZWNfcGVybSh2cywgdjAsIHZzcmNQZXJtdXRlKTsKKworICAgICAgICAgICAgICAgIHZhbHBoYSA9IHZlY19wZXJtKHZzLCB2MCwgdmFscGhhUGVybXV0ZSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogZCA9ICpkc3RwICovCisgICAgICAgICAgICAgICAgdmQgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDAsIGRzdHApOworICAgICAgICAgICAgICAgIHZkID0gdmVjX3Blcm0odmQsIHYwLCB2c2RzdFBlcm11dGUpOworICAgICAgICAgICAgICAgIHZkc3RhbHBoYSA9IHZlY19hbmQodmQsIHZhbHBoYW1hc2spOworCisgICAgICAgICAgICAgICAgVkVDX01VTFRJUExZX0FMUEhBKHZzLCB2ZCwgdmFscGhhLCBtZXJnZVBlcm11dGUsIHYxLCB2OCk7CisKKyAgICAgICAgICAgICAgICAvKiBzZXQgdGhlIGFscGhhIHRvIHRoZSBkZXN0IGFscGhhICovCisgICAgICAgICAgICAgICAgdmQgPSB2ZWNfYW5kKHZkLCB2cGl4ZWxtYXNrKTsKKyAgICAgICAgICAgICAgICB2ZCA9IHZlY19vcih2ZCwgdmRzdGFscGhhKTsKKyAgICAgICAgICAgICAgICB2ZCA9IHZlY19wZXJtKHZkLCB2MCwgdmRzdFBlcm11dGUpOworCisgICAgICAgICAgICAgICAgLyogKmRzdHAgPSByZXMgKi8KKyAgICAgICAgICAgICAgICB2ZWNfc3QoKHZlY3RvciB1bnNpZ25lZCBpbnQpdmQsIDAsIGRzdHApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNyY3AgKz0gNDsKKyAgICAgICAgICAgICAgICBkc3RwICs9IDQ7CisgICAgICAgICAgICAgICAgd2lkdGggLT0gNDsKKyAgICAgICAgICAgICAgICB2cyA9IHZvdmVyZmxvdzsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgT05FX1BJWEVMX0JMRU5EKChleHRyYXdpZHRoKSwgZXh0cmF3aWR0aCk7CisgICAgICAgIH0KKwkgICAgc3JjcCArPSBzcmNza2lwOworCSAgICBkc3RwICs9IGRzdHNraXA7CisjdW5kZWYgT05FX1BJWEVMX0JMRU5ECisJfQorfQorCisvKiBmYXN0IEFSR0I4ODgtPihBKVJHQjg4OCBibGVuZGluZyB3aXRoIHBpeGVsIGFscGhhICovCitzdGF0aWMgdm9pZCBCbGl0UkdCdG9SR0JQaXhlbEFscGhhQWx0aXZlYyhTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7CisJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWVyZ2VQZXJtdXRlOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYVBlcm11dGU7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhbWFzazsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cGl4ZWxtYXNrOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHYwOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2MTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjg7CisgICAgdjAgPSB2ZWNfc3BsYXRfdTgoMCk7CisgICAgdjEgPSB2ZWNfc3BsYXRfdTE2KDEpOworICAgIHY4ID0gdmVjX3NwbGF0X3UxNig4KTsKKyAgICBtZXJnZVBlcm11dGUgPSBWRUNfTUVSR0VfUEVSTVVURSgpOworICAgIHZhbHBoYW1hc2sgPSBWRUNfQUxQSEFfTUFTSygpOworICAgIHZhbHBoYVBlcm11dGUgPSB2ZWNfYW5kKHZlY19sdnNsKDAsIChpbnQgKilOVUxMKSwgdmVjX3NwbGF0X3U4KDB4QykpOworICAgIAorIAorICAgIHZwaXhlbG1hc2sgPSB2ZWNfbm9yKHZhbHBoYW1hc2ssIHYwKTsKKwl3aGlsZShoZWlnaHQtLSkgeworICAgICAgICB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisjZGVmaW5lIE9ORV9QSVhFTF9CTEVORChjb25kaXRpb24sIHdpZHRodmFyKSBcCisgICAgICAgIHdoaWxlICgoY29uZGl0aW9uKSkgeyBcCisgICAgICAgICAgICBVaW50MzIgZGFscGhhOyBcCisgICAgICAgICAgICBVaW50MzIgZDsgXAorICAgICAgICAgICAgVWludDMyIHMxOyBcCisgICAgICAgICAgICBVaW50MzIgZDE7IFwKKyAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyY3A7IFwKKyAgICAgICAgICAgIFVpbnQzMiBhbHBoYSA9IHMgPj4gMjQ7IFwKKyAgICAgICAgICAgIGlmKGFscGhhKSB7IFwKKyAgICAgICAgICAgICAgaWYoYWxwaGEgPT0gU0RMX0FMUEhBX09QQVFVRSkgeyBcCisgICAgICAgICAgICAgICAgKmRzdHAgPSAocyAmIDB4MDBmZmZmZmYpIHwgKCpkc3RwICYgMHhmZjAwMDAwMCk7IFwKKyAgICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgIGQgPSAqZHN0cDsgXAorICAgICAgICAgICAgICAgIGRhbHBoYSA9IGQgJiAweGZmMDAwMDAwOyBcCisgICAgICAgICAgICAgICAgczEgPSBzICYgMHhmZjAwZmY7IFwKKyAgICAgICAgICAgICAgICBkMSA9IGQgJiAweGZmMDBmZjsgXAorICAgICAgICAgICAgICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOyBcCisgICAgICAgICAgICAgICAgcyAmPSAweGZmMDA7IFwKKyAgICAgICAgICAgICAgICBkICY9IDB4ZmYwMDsgXAorICAgICAgICAgICAgICAgIGQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOyBcCisgICAgICAgICAgICAgICAgKmRzdHAgPSBkMSB8IGQgfCBkYWxwaGE7IFwKKyAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICsrc3JjcDsgXAorICAgICAgICAgICAgKytkc3RwOyBcCisgICAgICAgICAgICB3aWR0aHZhci0tOyBcCisJICAgIH0KKyAgICAgICAgT05FX1BJWEVMX0JMRU5EKChVTkFMSUdORURfUFRSKGRzdHApKSAmJiAod2lkdGgpLCB3aWR0aCk7CisgICAgICAgIGlmICh3aWR0aCA+IDApIHsKKyAgICAgICAgICAgIGludCBleHRyYXdpZHRoID0gKHdpZHRoICUgNCk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxpZ25lciA9IFZFQ19BTElHTkVSKHNyY3ApOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDAsIHNyY3ApOworICAgICAgICAgICAgd2lkdGggLT0gZXh0cmF3aWR0aDsKKyAgICAgICAgICAgIHdoaWxlICh3aWR0aCkgeworICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZvdmVyZmxvdzsKKyAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZDsKKyAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGE7CisgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmRzdGFscGhhOworICAgICAgICAgICAgICAgIC8qIHMgPSAqc3JjcCAqLworICAgICAgICAgICAgICAgIHZvdmVyZmxvdyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMTUsIHNyY3ApOworICAgICAgICAgICAgICAgIHZzID0gdmVjX3Blcm0odnMsIHZvdmVyZmxvdywgdmFsaWduZXIpOworCisgICAgICAgICAgICAgICAgdmFscGhhID0gdmVjX3Blcm0odnMsIHYwLCB2YWxwaGFQZXJtdXRlKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBkID0gKmRzdHAgKi8KKyAgICAgICAgICAgICAgICB2ZCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMCwgZHN0cCk7CisgICAgICAgICAgICAgICAgdmRzdGFscGhhID0gdmVjX2FuZCh2ZCwgdmFscGhhbWFzayk7CisKKyAgICAgICAgICAgICAgICBWRUNfTVVMVElQTFlfQUxQSEEodnMsIHZkLCB2YWxwaGEsIG1lcmdlUGVybXV0ZSwgdjEsIHY4KTsKKworICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgYWxwaGEgdG8gdGhlIGRlc3QgYWxwaGEgKi8KKyAgICAgICAgICAgICAgICB2ZCA9IHZlY19hbmQodmQsIHZwaXhlbG1hc2spOworICAgICAgICAgICAgICAgIHZkID0gdmVjX29yKHZkLCB2ZHN0YWxwaGEpOworCisgICAgICAgICAgICAgICAgLyogKmRzdHAgPSByZXMgKi8KKyAgICAgICAgICAgICAgICB2ZWNfc3QoKHZlY3RvciB1bnNpZ25lZCBpbnQpdmQsIDAsIGRzdHApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNyY3AgKz0gNDsKKyAgICAgICAgICAgICAgICBkc3RwICs9IDQ7CisgICAgICAgICAgICAgICAgd2lkdGggLT0gNDsKKyAgICAgICAgICAgICAgICB2cyA9IHZvdmVyZmxvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9ORV9QSVhFTF9CTEVORCgoZXh0cmF3aWR0aCksIGV4dHJhd2lkdGgpOworICAgICAgICB9CisJICAgIHNyY3AgKz0gc3Jjc2tpcDsKKwkgICAgZHN0cCArPSBkc3Rza2lwOworCX0KKyN1bmRlZiBPTkVfUElYRUxfQkxFTkQKK30KKworc3RhdGljIHZvaWQgQmxpdDMydG8zMlN1cmZhY2VBbHBoYUFsdGl2ZWMoU0RMX0JsaXRJbmZvICppbmZvKQoreworICAgIC8qIFhYWCA6IDYgKi8KKwl1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7CisgICAgaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworICAgIFVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKKyAgICBpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOworICAgIFVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKKyAgICBpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAyOworICAgIFNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOworICAgIFNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OworCXVuc2lnbmVkIHNBID0gc3JjZm10LT5hbHBoYTsKKwl1bnNpZ25lZCBkQSA9IGRzdGZtdC0+QW1hc2sgPyBTRExfQUxQSEFfT1BBUVVFIDogMDsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtZXJnZVBlcm11dGU7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnNyY1Blcm11dGU7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmRzdFBlcm11dGU7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnNkc3RQZXJtdXRlOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGFtYXNrOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZiaXRzOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2MTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjg7CisKKyAgICBtZXJnZVBlcm11dGUgPSBWRUNfTUVSR0VfUEVSTVVURSgpOworICAgIHYxID0gdmVjX3NwbGF0X3UxNigxKTsKKyAgICB2OCA9IHZlY19zcGxhdF91MTYoOCk7CisKKyAgICAvKiBzZXQgdGhlIGFscGhhIHRvIDI1NSBvbiB0aGUgZGVzdGluYXRpb24gc3VyZiAqLworICAgIHZhbHBoYW1hc2sgPSBWRUNfQUxQSEFfTUFTSygpOworCisgICAgdnNyY1Blcm11dGUgPSBjYWxjX3N3aXp6bGUzMihzcmNmbXQsIE5VTEwpOworICAgIHZkc3RQZXJtdXRlID0gY2FsY19zd2l6emxlMzIoTlVMTCwgZHN0Zm10KTsKKyAgICB2c2RzdFBlcm11dGUgPSBjYWxjX3N3aXp6bGUzMihkc3RmbXQsIE5VTEwpOworCisgICAgLyogc2V0IGEgdmVjdG9yIGZ1bGwgb2YgYWxwaGEgYW5kIDI1NS1hbHBoYSAqLworICAgICgodW5zaWduZWQgY2hhciAqKSZ2YWxwaGEpWzBdID0gYWxwaGE7CisgICAgdmFscGhhID0gdmVjX3NwbGF0KHZhbHBoYSwgMCk7CisgICAgdmJpdHMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3NwbGF0X3M4KC0xKTsKKworICAgIHdoaWxlKGhlaWdodC0tKSB7CisgICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisjZGVmaW5lIE9ORV9QSVhFTF9CTEVORChjb25kaXRpb24sIHdpZHRodmFyKSB3aGlsZSAoKGNvbmRpdGlvbikpIHsgXAorICAgICAgICAgICAgVWludDMyIFBpeGVsOyBcCisgICAgICAgICAgICB1bnNpZ25lZCBzUiwgc0csIHNCLCBkUiwgZEcsIGRCOyBcCisgICAgICAgICAgICBESVNFTUJMRV9SR0IoKChVaW50OCAqKXNyY3ApLCA0LCBzcmNmbXQsIFBpeGVsLCBzUiwgc0csIHNCKTsgXAorICAgICAgICAgICAgRElTRU1CTEVfUkdCKCgoVWludDggKilkc3RwKSwgNCwgZHN0Zm10LCBQaXhlbCwgZFIsIGRHLCBkQik7IFwKKyAgICAgICAgICAgIEFMUEhBX0JMRU5EKHNSLCBzRywgc0IsIHNBLCBkUiwgZEcsIGRCKTsgXAorICAgICAgICAgICAgQVNTRU1CTEVfUkdCQSgoKFVpbnQ4ICopZHN0cCksIDQsIGRzdGZtdCwgZFIsIGRHLCBkQiwgZEEpOyBcCisgICAgICAgICAgICArK3NyY3A7IFwKKyAgICAgICAgICAgICsrZHN0cDsgXAorICAgICAgICAgICAgd2lkdGh2YXItLTsgXAorICAgICAgICB9CisgICAgICAgIE9ORV9QSVhFTF9CTEVORCgoVU5BTElHTkVEX1BUUihkc3RwKSkgJiYgKHdpZHRoKSwgd2lkdGgpOworICAgICAgICBpZiAod2lkdGggPiAwKSB7CisgICAgICAgICAgICBpbnQgZXh0cmF3aWR0aCA9ICh3aWR0aCAlIDQpOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFsaWduZXIgPSBWRUNfQUxJR05FUihzcmNwKTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgwLCBzcmNwKTsKKyAgICAgICAgICAgIHdpZHRoIC09IGV4dHJhd2lkdGg7CisgICAgICAgICAgICB3aGlsZSAod2lkdGgpIHsKKyAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2b3ZlcmZsb3c7CisgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmQ7CisKKyAgICAgICAgICAgICAgICAvKiBzID0gKnNyY3AgKi8KKyAgICAgICAgICAgICAgICB2b3ZlcmZsb3cgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDE1LCBzcmNwKTsKKyAgICAgICAgICAgICAgICB2cyA9IHZlY19wZXJtKHZzLCB2b3ZlcmZsb3csIHZhbGlnbmVyKTsKKyAgICAgICAgICAgICAgICB2cyA9IHZlY19wZXJtKHZzLCB2YWxwaGEsIHZzcmNQZXJtdXRlKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBkID0gKmRzdHAgKi8KKyAgICAgICAgICAgICAgICB2ZCA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMCwgZHN0cCk7CisgICAgICAgICAgICAgICAgdmQgPSB2ZWNfcGVybSh2ZCwgdmQsIHZzZHN0UGVybXV0ZSk7CisKKyAgICAgICAgICAgICAgICBWRUNfTVVMVElQTFlfQUxQSEEodnMsIHZkLCB2YWxwaGEsIG1lcmdlUGVybXV0ZSwgdjEsIHY4KTsKKworICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgYWxwaGEgY2hhbm5lbCB0byBmdWxsIG9uICovCisgICAgICAgICAgICAgICAgdmQgPSB2ZWNfb3IodmQsIHZhbHBoYW1hc2spOworICAgICAgICAgICAgICAgIHZkID0gdmVjX3Blcm0odmQsIHZiaXRzLCB2ZHN0UGVybXV0ZSk7CisKKyAgICAgICAgICAgICAgICAvKiAqZHN0cCA9IHJlcyAqLworICAgICAgICAgICAgICAgIHZlY19zdCgodmVjdG9yIHVuc2lnbmVkIGludCl2ZCwgMCwgZHN0cCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3JjcCArPSA0OworICAgICAgICAgICAgICAgIGRzdHAgKz0gNDsKKyAgICAgICAgICAgICAgICB3aWR0aCAtPSA0OworICAgICAgICAgICAgICAgIHZzID0gdm92ZXJmbG93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgT05FX1BJWEVMX0JMRU5EKChleHRyYXdpZHRoKSwgZXh0cmF3aWR0aCk7CisgICAgICAgIH0KKyN1bmRlZiBPTkVfUElYRUxfQkxFTkQKKyAKKyAgICAgICAgc3JjcCArPSBzcmNza2lwOworICAgICAgICBkc3RwICs9IGRzdHNraXA7CisgICAgfQorCit9CisKKworLyogZmFzdCBSR0I4ODgtPihBKVJHQjg4OCBibGVuZGluZyAqLworc3RhdGljIHZvaWQgQmxpdFJHQnRvUkdCU3VyZmFjZUFscGhhQWx0aXZlYyhTRExfQmxpdEluZm8gKmluZm8pCit7CisJdW5zaWduZWQgYWxwaGEgPSBpbmZvLT5zcmMtPmFscGhhOworICAgIGludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKyAgICBVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7CisgICAgaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKKyAgICBVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7CisgICAgaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBtZXJnZVBlcm11dGU7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYW1hc2s7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYxOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2ODsKKworICAgIG1lcmdlUGVybXV0ZSA9IFZFQ19NRVJHRV9QRVJNVVRFKCk7CisgICAgdjEgPSB2ZWNfc3BsYXRfdTE2KDEpOworICAgIHY4ID0gdmVjX3NwbGF0X3UxNig4KTsKKworICAgIC8qIHNldCB0aGUgYWxwaGEgdG8gMjU1IG9uIHRoZSBkZXN0aW5hdGlvbiBzdXJmICovCisgICAgdmFscGhhbWFzayA9IFZFQ19BTFBIQV9NQVNLKCk7CisKKyAgICAvKiBzZXQgYSB2ZWN0b3IgZnVsbCBvZiBhbHBoYSBhbmQgMjU1LWFscGhhICovCisgICAgKCh1bnNpZ25lZCBjaGFyICopJnZhbHBoYSlbMF0gPSBhbHBoYTsKKyAgICB2YWxwaGEgPSB2ZWNfc3BsYXQodmFscGhhLCAwKTsKKworICAgIHdoaWxlKGhlaWdodC0tKSB7CisgICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisjZGVmaW5lIE9ORV9QSVhFTF9CTEVORChjb25kaXRpb24sIHdpZHRodmFyKSB3aGlsZSAoKGNvbmRpdGlvbikpIHsgXAorICAgICAgICAgICAgVWludDMyIHMgPSAqc3JjcDsgXAorICAgICAgICAgICAgVWludDMyIGQgPSAqZHN0cDsgXAorICAgICAgICAgICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOyBcCisgICAgICAgICAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7IFwKKyAgICAgICAgICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSBcCisgICAgICAgICAgICAgICAgICYgMHhmZjAwZmY7IFwKKyAgICAgICAgICAgIHMgJj0gMHhmZjAwOyBcCisgICAgICAgICAgICBkICY9IDB4ZmYwMDsgXAorICAgICAgICAgICAgZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7IFwKKyAgICAgICAgICAgICpkc3RwID0gZDEgfCBkIHwgMHhmZjAwMDAwMDsgXAorICAgICAgICAgICAgKytzcmNwOyBcCisgICAgICAgICAgICArK2RzdHA7IFwKKyAgICAgICAgICAgIHdpZHRodmFyLS07IFwKKyAgICAgICAgfQorICAgICAgICBPTkVfUElYRUxfQkxFTkQoKFVOQUxJR05FRF9QVFIoZHN0cCkpICYmICh3aWR0aCksIHdpZHRoKTsKKyAgICAgICAgaWYgKHdpZHRoID4gMCkgeworICAgICAgICAgICAgaW50IGV4dHJhd2lkdGggPSAod2lkdGggJSA0KTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyID0gVkVDX0FMSUdORVIoc3JjcCk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfbGQoMCwgc3JjcCk7CisgICAgICAgICAgICB3aWR0aCAtPSBleHRyYXdpZHRoOworICAgICAgICAgICAgd2hpbGUgKHdpZHRoKSB7CisgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdm92ZXJmbG93OworICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkOworCisgICAgICAgICAgICAgICAgLyogcyA9ICpzcmNwICovCisgICAgICAgICAgICAgICAgdm92ZXJmbG93ID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19sZCgxNSwgc3JjcCk7CisgICAgICAgICAgICAgICAgdnMgPSB2ZWNfcGVybSh2cywgdm92ZXJmbG93LCB2YWxpZ25lcik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogZCA9ICpkc3RwICovCisgICAgICAgICAgICAgICAgdmQgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX2xkKDAsIGRzdHApOworCisgICAgICAgICAgICAgICAgVkVDX01VTFRJUExZX0FMUEhBKHZzLCB2ZCwgdmFscGhhLCBtZXJnZVBlcm11dGUsIHYxLCB2OCk7CisKKyAgICAgICAgICAgICAgICAvKiBzZXQgdGhlIGFscGhhIGNoYW5uZWwgdG8gZnVsbCBvbiAqLworICAgICAgICAgICAgICAgIHZkID0gdmVjX29yKHZkLCB2YWxwaGFtYXNrKTsKKworICAgICAgICAgICAgICAgIC8qICpkc3RwID0gcmVzICovCisgICAgICAgICAgICAgICAgdmVjX3N0KCh2ZWN0b3IgdW5zaWduZWQgaW50KXZkLCAwLCBkc3RwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzcmNwICs9IDQ7CisgICAgICAgICAgICAgICAgZHN0cCArPSA0OworICAgICAgICAgICAgICAgIHdpZHRoIC09IDQ7CisgICAgICAgICAgICAgICAgdnMgPSB2b3ZlcmZsb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPTkVfUElYRUxfQkxFTkQoKGV4dHJhd2lkdGgpLCBleHRyYXdpZHRoKTsKKyAgICAgICAgfQorI3VuZGVmIE9ORV9QSVhFTF9CTEVORAorIAorICAgICAgICBzcmNwICs9IHNyY3NraXA7CisgICAgICAgIGRzdHAgKz0gZHN0c2tpcDsKKyAgICB9Cit9CisjaWYgX19NV0VSS1NfXworI3ByYWdtYSBhbHRpdmVjX21vZGVsIG9mZgorI2VuZGlmCisjZW5kaWYgLyogU0RMX0FMVElWRUNfQkxJVFRFUlMgKi8KKworLyogZmFzdCBSR0I4ODgtPihBKVJHQjg4OCBibGVuZGluZyB3aXRoIHN1cmZhY2UgYWxwaGE9MTI4IHNwZWNpYWwgY2FzZSAqLworc3RhdGljIHZvaWQgQmxpdFJHQnRvUkdCU3VyZmFjZUFscGhhMTI4KFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKKwlVaW50MzIgKmRzdHAgPSAoVWludDMyICopaW5mby0+ZF9waXhlbHM7CisJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKKworCXdoaWxlKGhlaWdodC0tKSB7CisJICAgIERVRkZTX0xPT1A0KHsKKwkJICAgIFVpbnQzMiBzID0gKnNyY3ArKzsKKwkJICAgIFVpbnQzMiBkID0gKmRzdHA7CisJCSAgICAqZHN0cCsrID0gKCgoKHMgJiAweDAwZmVmZWZlKSArIChkICYgMHgwMGZlZmVmZSkpID4+IDEpCisJCQkgICAgICAgKyAocyAmIGQgJiAweDAwMDEwMTAxKSkgfCAweGZmMDAwMDAwOworCSAgICB9LCB3aWR0aCk7CisJICAgIHNyY3AgKz0gc3Jjc2tpcDsKKwkgICAgZHN0cCArPSBkc3Rza2lwOworCX0KK30KKworLyogZmFzdCBSR0I4ODgtPihBKVJHQjg4OCBibGVuZGluZyB3aXRoIHN1cmZhY2UgYWxwaGEgKi8KK3N0YXRpYyB2b2lkIEJsaXRSR0J0b1JHQlN1cmZhY2VBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCit7CisJdW5zaWduZWQgYWxwaGEgPSBpbmZvLT5zcmMtPmFscGhhOworCWlmKGFscGhhID09IDEyOCkgeworCQlCbGl0UkdCdG9SR0JTdXJmYWNlQWxwaGExMjgoaW5mbyk7CisJfSBlbHNlIHsKKwkJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwkJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCQlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7CisJCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7CisJCVVpbnQzMiAqZHN0cCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKKwkJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMjsKKwkJVWludDMyIHM7CisJCVVpbnQzMiBkOworCQlVaW50MzIgczE7CisJCVVpbnQzMiBkMTsKKworCQl3aGlsZShoZWlnaHQtLSkgeworCQkJRFVGRlNfTE9PUF9ET1VCTEUyKHsKKwkJCQkvKiBPbmUgUGl4ZWwgQmxlbmQgKi8KKwkJCQlzID0gKnNyY3A7CisJCQkJZCA9ICpkc3RwOworCQkJCXMxID0gcyAmIDB4ZmYwMGZmOworCQkJCWQxID0gZCAmIDB4ZmYwMGZmOworCQkJCWQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKQorCQkJCSAgICAgJiAweGZmMDBmZjsKKwkJCQlzICY9IDB4ZmYwMDsKKwkJCQlkICY9IDB4ZmYwMDsKKwkJCQlkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsKKwkJCQkqZHN0cCA9IGQxIHwgZCB8IDB4ZmYwMDAwMDA7CisJCQkJKytzcmNwOworCQkJCSsrZHN0cDsKKwkJCX0seworCQkJICAgICAgICAvKiBUd28gUGl4ZWxzIEJsZW5kICovCisJCQkJcyA9ICpzcmNwOworCQkJCWQgPSAqZHN0cDsKKwkJCQlzMSA9IHMgJiAweGZmMDBmZjsKKwkJCQlkMSA9IGQgJiAweGZmMDBmZjsKKwkJCQlkMSArPSAoczEgLSBkMSkgKiBhbHBoYSA+PiA4OworCQkJCWQxICY9IDB4ZmYwMGZmOworCQkJCSAgICAgCisJCQkJcyA9ICgocyAmIDB4ZmYwMCkgPj4gOCkgfCAKKwkJCQkJKChzcmNwWzFdICYgMHhmZjAwKSA8PCA4KTsKKwkJCQlkID0gKChkICYgMHhmZjAwKSA+PiA4KSB8CisJCQkJCSgoZHN0cFsxXSAmIDB4ZmYwMCkgPDwgOCk7CisJCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gODsKKwkJCQlkICY9IDB4MDBmZjAwZmY7CisJCQkJCisJCQkJKmRzdHArKyA9IGQxIHwgKChkIDw8IDgpICYgMHhmZjAwKSB8IDB4ZmYwMDAwMDA7CisJCQkJKytzcmNwOworCQkJCQorCQkJICAgICAgICBzMSA9ICpzcmNwOworCQkJCWQxID0gKmRzdHA7CisJCQkJczEgJj0gMHhmZjAwZmY7CisJCQkJZDEgJj0gMHhmZjAwZmY7CisJCQkJZDEgKz0gKHMxIC0gZDEpICogYWxwaGEgPj4gODsKKwkJCQlkMSAmPSAweGZmMDBmZjsKKwkJCQkKKwkJCQkqZHN0cCA9IGQxIHwgKChkID4+IDgpICYgMHhmZjAwKSB8IDB4ZmYwMDAwMDA7CisJCQkJKytzcmNwOworCQkJCSsrZHN0cDsKKwkJCX0sIHdpZHRoKTsKKwkJCXNyY3AgKz0gc3Jjc2tpcDsKKwkJCWRzdHAgKz0gZHN0c2tpcDsKKwkJfQorCX0KK30KKworLyogZmFzdCBBUkdCODg4LT4oQSlSR0I4ODggYmxlbmRpbmcgd2l0aCBwaXhlbCBhbHBoYSAqLworc3RhdGljIHZvaWQgQmxpdFJHQnRvUkdCUGl4ZWxBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7CisJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7CisKKwl3aGlsZShoZWlnaHQtLSkgeworCSAgICBEVUZGU19MT09QNCh7CisJCVVpbnQzMiBkYWxwaGE7CisJCVVpbnQzMiBkOworCQlVaW50MzIgczE7CisJCVVpbnQzMiBkMTsKKwkJVWludDMyIHMgPSAqc3JjcDsKKwkJVWludDMyIGFscGhhID0gcyA+PiAyNDsKKwkJLyogRklYTUU6IEhlcmUgd2Ugc3BlY2lhbC1jYXNlIG9wYXF1ZSBhbHBoYSBzaW5jZSB0aGUKKwkJICAgY29tcG9zaXRpb25pbmcgdXNlZCAoPj44IGluc3RlYWQgb2YgLzI1NSkgZG9lc24ndCBoYW5kbGUKKwkJICAgaXQgY29ycmVjdGx5LiBBbHNvIHNwZWNpYWwtY2FzZSBhbHBoYT0wIGZvciBzcGVlZD8KKwkJICAgQmVuY2htYXJrIHRoaXMhICovCisJCWlmKGFscGhhKSB7ICAgCisJCSAgaWYoYWxwaGEgPT0gU0RMX0FMUEhBX09QQVFVRSkgeworCQkgICAgKmRzdHAgPSAocyAmIDB4MDBmZmZmZmYpIHwgKCpkc3RwICYgMHhmZjAwMDAwMCk7CisJCSAgfSBlbHNlIHsKKwkJICAgIC8qCisJCSAgICAgKiB0YWtlIG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pLCBhbmQgcHJvY2VzcworCQkgICAgICogdGhlIG90aGVyIHR3byBpbiBwYXJhbGxlbC4gT25lIG11bHRpcGx5IGxlc3MuCisJCSAgICAgKi8KKwkJICAgIGQgPSAqZHN0cDsKKwkJICAgIGRhbHBoYSA9IGQgJiAweGZmMDAwMDAwOworCQkgICAgczEgPSBzICYgMHhmZjAwZmY7CisJCSAgICBkMSA9IGQgJiAweGZmMDBmZjsKKwkJICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOworCQkgICAgcyAmPSAweGZmMDA7CisJCSAgICBkICY9IDB4ZmYwMDsKKwkJICAgIGQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOworCQkgICAgKmRzdHAgPSBkMSB8IGQgfCBkYWxwaGE7CisJCSAgfQorCQl9CisJCSsrc3JjcDsKKwkJKytkc3RwOworCSAgICB9LCB3aWR0aCk7CisJICAgIHNyY3AgKz0gc3Jjc2tpcDsKKwkgICAgZHN0cCArPSBkc3Rza2lwOworCX0KK30KKworI2lmIEdDQ19BU01CTElUCisvKiBmYXN0IChhcyBpbiBNTVggd2l0aCBwcmVmZXRjaCkgQVJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nIHdpdGggcGl4ZWwgYWxwaGEgKi8KK3N0YXRpYyB2b2lkIEJsaXRSR0J0b1JHQlBpeGVsQWxwaGFNTVgzRE5PVyhTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7CisJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7CisJU0RMX1BpeGVsRm9ybWF0KiBzZiA9IGluZm8tPnNyYzsKKwlVaW50MzIgYW1hc2sgPSBzZi0+QW1hc2s7CisKKwlfX2FzbV9fICgKKwkvKiBtYWtlIG1tNiBhbGwgemVyb3MuICovCisJInB4b3IgICAgICAgJSVtbTYsICUlbW02XG4iCisJCisJLyogTWFrZSBhIG1hc2sgdG8gcHJlc2VydmUgdGhlIGFscGhhLiAqLworCSJtb3ZkICAgICAgJTAsICUlbW03XG5cdCIgICAgICAgICAgIC8qIDAwMDBGMDAwIC0+IG1tNyAqLworCSJwdW5wY2tsYncgJSVtbTcsICUlbW03XG5cdCIgICAgICAgIC8qIEZGMDAwMDAwIC0+IG1tNyAqLworCSJwY21wZXFiICAgJSVtbTQsICUlbW00XG5cdCIgICAgICAgIC8qIEZGRkZGRkZGIC0+IG1tNCAqLworCSJtb3ZxICAgICAgJSVtbTQsICUlbW0zXG5cdCIgICAgICAgIC8qIEZGRkZGRkZGIC0+IG1tMyAoZm9yIGxhdGVyKSAqLworCSJweG9yICAgICAgJSVtbTQsICUlbW03XG5cdCIgICAgICAgIC8qIDAwRkZGRkZGIC0+IG1tNyAobXVsdCBtYXNrKSAqLworCisJLyogZm9ybSBjaGFubmVsIG1hc2tzICovCisJIm1vdnEgICAgICAlJW1tNywgJSVtbTRcblx0IiAgICAgICAgLyogMDBGRkZGRkYgLT4gbW00ICovCisJInBhY2tzc3diICAlJW1tNiwgJSVtbTRcblx0IiAgICAgICAgLyogMDAwMDBGRkYgLT4gbW00IChjaGFubmVsIG1hc2spICovCisJInBhY2tzc3diICAlJW1tNiwgJSVtbTNcblx0IiAgICAgICAgLyogMDAwMEZGRkYgLT4gbW0zICovCisJInB4b3IgICAgICAlJW1tNCwgJSVtbTNcblx0IiAgICAgICAgLyogMDAwMEYwMDAgLT4gbW0zICh+Y2hhbm5lbCBtYXNrKSAqLworCQorCS8qIGdldCBhbHBoYSBjaGFubmVsIHNoaWZ0ICovCisJIm1vdmQgICAgICAlMSwgJSVtbTVcblx0IiAvKiBBc2hpZnQgLT4gbW01ICovCisKKwkgIDogLyogbm90aGluZyAqLyA6ICJybSIgKGFtYXNrKSwgInJtIiAoKFVpbnQzMikgc2YtPkFzaGlmdCkgKTsKKworCXdoaWxlKGhlaWdodC0tKSB7CisKKwkgICAgRFVGRlNfTE9PUDQoeworCQlVaW50MzIgYWxwaGE7CisKKwkJX19hc21fXyAoCisJCSJwcmVmZXRjaCA2NCglMClcbiIKKwkJInByZWZldGNoIDY0KCUxKVxuIgorCQkJOiA6ICJyIiAoc3JjcCksICJyIiAoZHN0cCkgKTsKKworCQlhbHBoYSA9ICpzcmNwICYgYW1hc2s7CisJCS8qIEZJWE1FOiBIZXJlIHdlIHNwZWNpYWwtY2FzZSBvcGFxdWUgYWxwaGEgc2luY2UgdGhlCisJCSAgIGNvbXBvc2l0aW9uaW5nIHVzZWQgKD4+OCBpbnN0ZWFkIG9mIC8yNTUpIGRvZXNuJ3QgaGFuZGxlCisJCSAgIGl0IGNvcnJlY3RseS4gQWxzbyBzcGVjaWFsLWNhc2UgYWxwaGE9MCBmb3Igc3BlZWQ/CisJCSAgIEJlbmNobWFyayB0aGlzISAqLworCQlpZihhbHBoYSA9PSAwKSB7CisJCSAgICAvKiBkbyBub3RoaW5nICovCisJCX0KKwkJZWxzZSBpZihhbHBoYSA9PSBhbWFzaykgeworCQkJLyogb3BhcXVlIGFscGhhIC0tIGNvcHkgUkdCLCBrZWVwIGRzdCBhbHBoYSAqLworCQkgICAgLyogdXNpbmcgTU1YIGhlcmUgdG8gZnJlZSB1cCByZWd1bGFyIHJlZ2lzdGVycyBmb3Igb3RoZXIgdGhpbmdzICovCisJCQkgICAgX19hc21fXyAoCisJCSAgICAibW92ZCAgICAgICglMCksICAlJW1tMFxuXHQiIC8qIHNyYyhBUkdCKSAtPiBtbTAgKDAwMDBBUkdCKSovCisJCSAgICAibW92ZCAgICAgICglMSksICAlJW1tMVxuXHQiIC8qIGRzdChBUkdCKSAtPiBtbTEgKDAwMDBBUkdCKSovCisJCSAgICAicGFuZCAgICAgICUlbW00LCAlJW1tMFxuXHQiIC8qIHNyYyAmIGNoYW5tYXNrIC0+IG1tMCAqLworCQkgICAgInBhbmQgICAgICAlJW1tMywgJSVtbTFcblx0IiAvKiBkc3QgJiB+Y2hhbm1hc2sgLT4gbW0yICovCisJCSAgICAicG9yICAgICAgICUlbW0wLCAlJW1tMVxuXHQiIC8qIHNyYyB8IGRzdCAtPiBtbTEgKi8KKwkJICAgICJtb3ZkICAgICAgJSVtbTEsICglMSkgXG5cdCIgLyogbW0xIC0+IGRzdCAqLworCisJCSAgICAgOiA6ICJyIiAoc3JjcCksICJyIiAoZHN0cCkgKTsKKwkJfSAKKworCQllbHNlIHsKKwkJCSAgICBfX2FzbV9fICgKKwkJICAgIC8qIGxvYWQgaW4gdGhlIHNvdXJjZSwgYW5kIGRzdC4gKi8KKwkJICAgICJtb3ZkICAgICAgKCUwKSwgJSVtbTBcbiIJCSAgICAvKiBtbTAocykgPSAwIDAgMCAwIHwgQXMgUnMgR3MgQnMgKi8KKwkJICAgICJtb3ZkICAgICAgKCUxKSwgJSVtbTFcbiIJCSAgICAvKiBtbTEoZCkgPSAwIDAgMCAwIHwgQWQgUmQgR2QgQmQgKi8KKworCQkgICAgLyogTW92ZSB0aGUgc3JjIGFscGhhIGludG8gbW0yICovCisKKwkJICAgIC8qIGlmIHN1cHBvcnRpbmcgcHNodWZ3ICovCisJCSAgICAvKiJwc2h1ZncgICAgICQweDU1LCAlJW1tMCwgJSVtbTJcbiIgKi8gLyogbW0yID0gMCBBcyAwIEFzIHwgIDAgQXMgIDAgIEFzICovCisJCSAgICAvKiJwc3JsdyAgICAgJDgsICUlbW0yXG4iICovCisJCSAgICAKKwkJICAgIC8qIGVsc2U6ICovCisJCSAgICAibW92ZCAgICAgICAlMiwgICAgJSVtbTJcbiIKKwkJICAgICJwc3JsZCAgICAgICUlbW01LCAlJW1tMlxuIiAgICAgICAgICAgICAgICAvKiBtbTIgPSAwIDAgMCAwIHwgMCAgMCAgMCAgQXMgKi8KKwkJICAgICJwdW5wY2tsd2QJJSVtbTIsICUlbW0yXG4iCSAgICAgICAgICAgIC8qIG1tMiA9IDAgMCAwIDAgfCAgMCBBcyAgMCAgQXMgKi8KKwkJICAgICJwdW5wY2tsZHEJJSVtbTIsICUlbW0yXG4iICAgICAgICAgICAgIC8qIG1tMiA9IDAgQXMgMCBBcyB8ICAwIEFzICAwICBBcyAqLworCQkgICAgInBhbmQgICAgICAgJSVtbTcsICUlbW0yXG4iICAgICAgICAgICAgICAvKiB0byBwcmVzZXJ2ZSBkZXN0IGFscGhhICovCisKKwkJICAgIC8qIG1vdmUgdGhlIGNvbG9ycyBpbnRvIHdvcmRzLiAqLworCQkgICAgInB1bnBja2xidyAlJW1tNiwgJSVtbTBcbiIJCSAgICAvKiBtbTAgPSAwIEFzIDAgUnMgfCAwIEdzIDAgQnMgKi8KKwkJICAgICJwdW5wY2tsYncgJSVtbTYsICUlbW0xXG4iICAgICAgICAgICAgICAvKiBtbTAgPSAwIEFkIDAgUmQgfCAwIEdkIDAgQmQgKi8KKworCQkgICAgLyogc3JjIC0gZHN0ICovCisJCSAgICAicHN1YncgICAgJSVtbTEsICUlbW0wXG4iCQkgICAgLyogbW0wID0gQXMtQWQgUnMtUmQgfCBHcy1HZCAgQnMtQmQgKi8KKworCQkgICAgLyogQSAqIChzcmMtZHN0KSAqLworCQkgICAgInBtdWxsdyAgICAlJW1tMiwgJSVtbTBcbiIJCSAgICAvKiBtbTAgPSAwKkFzLWQgQXMqUnMtZCB8IEFzKkdzLWQgIEFzKkJzLWQgKi8KKwkJICAgICJwc3JsdyAgICAgJDgsICAgICUlbW0wXG4iCQkgICAgLyogbW0wID0gMD4+OCBSYz4+OCB8IEdjPj44ICBCYz4+OCAqLworCQkgICAgInBhZGRiICAgICAlJW1tMSwgJSVtbTBcbiIJCSAgICAvKiBtbTAgPSAwK0FkIFJjK1JkIHwgR2MrR2QgIEJjK0JkICovCisKKwkJICAgICJwYWNrdXN3YiAgJSVtbTAsICUlbW0wXG4iICAgICAgICAgICAgICAvKiBtbTAgPSAgICAgICAgICAgICB8IEFjIFJjIEdjIEJjICovCisJCSAgICAKKwkJICAgICJtb3ZkICAgICAgJSVtbTAsICglMSlcbiIgICAgICAgICAgICAgICAvKiByZXN1bHQgaW4gbW0wICovCisKKwkJICAgICA6IDogInIiIChzcmNwKSwgInIiIChkc3RwKSwgInIiIChhbHBoYSkgKTsKKworCQl9CisJCSsrc3JjcDsKKwkJKytkc3RwOworCSAgICB9LCB3aWR0aCk7CisJICAgIHNyY3AgKz0gc3Jjc2tpcDsKKwkgICAgZHN0cCArPSBkc3Rza2lwOworCX0KKworCV9fYXNtX18gKAorCSJlbW1zXG4iCisJCTogICApOworfQorLyogRW5kIEdDQ19BU01CTElUKi8KKworI2VsaWYgTVNWQ19BU01CTElUCisvKiBmYXN0IChhcyBpbiBNTVggd2l0aCBwcmVmZXRjaCkgQVJHQjg4OC0+KEEpUkdCODg4IGJsZW5kaW5nIHdpdGggcGl4ZWwgYWxwaGEgKi8KK3N0YXRpYyB2b2lkIEJsaXRSR0J0b1JHQlBpeGVsQWxwaGFNTVgzRE5PVyhTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDI7CisJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDI7CisJU0RMX1BpeGVsRm9ybWF0KiBzZiA9IGluZm8tPnNyYzsKKwlVaW50MzIgY2hhbm1hc2sgPSBzZi0+Um1hc2sgfCBzZi0+R21hc2sgfCBzZi0+Qm1hc2s7CisJVWludDMyIGFtYXNrID0gc2YtPkFtYXNrOworCVVpbnQzMiBhc2hpZnQgPSBzZi0+QXNoaWZ0OworCVVpbnQ2NCBtdWx0bWFzazsKKwkKKwlfX202NCBzcmMxLCBkc3QxLCBtbV9hbHBoYSwgbW1femVybywgZG1hc2s7CisKKwltbV96ZXJvID0gX21tX3NldHplcm9fc2k2NCgpOyAvKiAwIC0+IG1tX3plcm8gKi8KKwltdWx0bWFzayA9IH4oMHhGRkZGaTY0IDw8IChhc2hpZnQgKiAyKSk7CisJZG1hc2sgPSAqKF9fbTY0KikgJm11bHRtYXNrOyAvKiBkc3QgYWxwaGEgbWFzayAtPiBkbWFzayAqLworCisJd2hpbGUoaGVpZ2h0LS0pIHsKKwkgICAgRFVGRlNfTE9PUDQoeworCQlVaW50MzIgYWxwaGE7CisKKwkJX21fcHJlZmV0Y2goc3JjcCArIDE2KTsKKwkJX21fcHJlZmV0Y2goZHN0cCArIDE2KTsKKworCQlhbHBoYSA9ICpzcmNwICYgYW1hc2s7CisJCWlmIChhbHBoYSA9PSAwKSB7CisJCQkvKiBkbyBub3RoaW5nICovCisJCX0gZWxzZSBpZiAoYWxwaGEgPT0gYW1hc2spIHsKKwkJCS8qIGNvcHkgUkdCLCBrZWVwIGRzdCBhbHBoYSAqLworCQkJKmRzdHAgPSAoKnNyY3AgJiBjaGFubWFzaykgfCAoKmRzdHAgJiB+Y2hhbm1hc2spOworCQl9IGVsc2UgeworCQkJc3JjMSA9IF9tbV9jdnRzaTMyX3NpNjQoKnNyY3ApOyAvKiBzcmMoQVJHQikgLT4gc3JjMSAoMDAwMEFSR0IpKi8KKwkJCXNyYzEgPSBfbW1fdW5wYWNrbG9fcGk4KHNyYzEsIG1tX3plcm8pOyAvKiAwQTBSMEcwQiAtPiBzcmMxICovCisKKwkJCWRzdDEgPSBfbW1fY3Z0c2kzMl9zaTY0KCpkc3RwKTsgLyogZHN0KEFSR0IpIC0+IGRzdDEgKDAwMDBBUkdCKSovCisJCQlkc3QxID0gX21tX3VucGFja2xvX3BpOChkc3QxLCBtbV96ZXJvKTsgLyogMEEwUjBHMEIgLT4gZHN0MSAqLworCisJCQltbV9hbHBoYSA9IF9tbV9jdnRzaTMyX3NpNjQoYWxwaGEpOyAvKiBhbHBoYSAtPiBtbV9hbHBoYSAoMDAwMDAwMEEpICovCisJCQltbV9hbHBoYSA9IF9tbV9zcmxpX3NpNjQobW1fYWxwaGEsIGFzaGlmdCk7IC8qIG1tX2FscGhhID4+IGFzaGlmdCAtPiBtbV9hbHBoYSgwMDAwMDAwQSkgKi8KKwkJCW1tX2FscGhhID0gX21tX3VucGFja2xvX3BpMTYobW1fYWxwaGEsIG1tX2FscGhhKTsgLyogMDAwMDBBMEEgLT4gbW1fYWxwaGEgKi8KKwkJCW1tX2FscGhhID0gX21tX3VucGFja2xvX3BpMzIobW1fYWxwaGEsIG1tX2FscGhhKTsgLyogMEEwQTBBMEEgLT4gbW1fYWxwaGEgKi8KKwkJCW1tX2FscGhhID0gX21tX2FuZF9zaTY0KG1tX2FscGhhLCBkbWFzayk7IC8qIDAwMEEwQTBBIC0+IG1tX2FscGhhLCBwcmVzZXJ2ZSBkc3QgYWxwaGEgb24gYWRkICovCisKKwkJCS8qIGJsZW5kICovCQkgICAgCisJCQlzcmMxID0gX21tX3N1Yl9waTE2KHNyYzEsIGRzdDEpOy8qIHNyYyAtIGRzdCAtPiBzcmMxICovCisJCQlzcmMxID0gX21tX211bGxvX3BpMTYoc3JjMSwgbW1fYWxwaGEpOyAvKiAoc3JjIC0gZHN0KSAqIGFscGhhIC0+IHNyYzEgKi8KKwkJCXNyYzEgPSBfbW1fc3JsaV9waTE2KHNyYzEsIDgpOyAvKiBzcmMxID4+IDggLT4gc3JjMSgwMDBSMEcwQikgKi8KKwkJCWRzdDEgPSBfbW1fYWRkX3BpOChzcmMxLCBkc3QxKTsgLyogc3JjMSArIGRzdDEoZHN0KSAtPiBkc3QxKDBBMFIwRzBCKSAqLworCQkJZHN0MSA9IF9tbV9wYWNrc19wdTE2KGRzdDEsIG1tX3plcm8pOyAgLyogMDAwMEFSR0IgLT4gZHN0MSAqLworCQkJCisJCQkqZHN0cCA9IF9tbV9jdnRzaTY0X3NpMzIoZHN0MSk7IC8qIGRzdDEgLT4gcGl4ZWwgKi8KKwkJfQorCQkrK3NyY3A7CisJCSsrZHN0cDsKKwkgICAgfSwgd2lkdGgpOworCSAgICBzcmNwICs9IHNyY3NraXA7CisJICAgIGRzdHAgKz0gZHN0c2tpcDsKKwl9CisJX21tX2VtcHR5KCk7Cit9CisvKiBFbmQgTVNWQ19BU01CTElUICovCisKKyNlbmRpZiAvKiBHQ0NfQVNNQkxJVCwgTVNWQ19BU01CTElUICovCisKKy8qIDE2YnBwIHNwZWNpYWwgY2FzZSBmb3IgcGVyLXN1cmZhY2UgYWxwaGE9NTAlOiBibGVuZCAyIHBpeGVscyBpbiBwYXJhbGxlbCAqLworCisvKiBibGVuZCBhIHNpbmdsZSAxNiBiaXQgcGl4ZWwgYXQgNTAlICovCisjZGVmaW5lIEJMRU5EMTZfNTAoZCwgcywgbWFzaykJCQkJCQlcCisJKCgoKHMgJiBtYXNrKSArIChkICYgbWFzaykpID4+IDEpICsgKHMgJiBkICYgKH5tYXNrICYgMHhmZmZmKSkpCisKKy8qIGJsZW5kIHR3byAxNiBiaXQgcGl4ZWxzIGF0IDUwJSAqLworI2RlZmluZSBCTEVORDJ4MTZfNTAoZCwgcywgbWFzaykJCQkJCSAgICAgXAorCSgoKHMgJiAobWFzayB8IG1hc2sgPDwgMTYpKSA+PiAxKSArICgoZCAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpIFwKKwkgKyAocyAmIGQgJiAofihtYXNrIHwgbWFzayA8PCAxNikpKSkKKworc3RhdGljIHZvaWQgQmxpdDE2dG8xNlN1cmZhY2VBbHBoYTEyOChTRExfQmxpdEluZm8gKmluZm8sIFVpbnQxNiBtYXNrKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKilpbmZvLT5zX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAxOworCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOworCisJd2hpbGUoaGVpZ2h0LS0pIHsKKwkJaWYoKCh1aW50cHRyX3Qpc3JjcCBeICh1aW50cHRyX3QpZHN0cCkgJiAyKSB7CisJCQkvKgorCQkJICogU291cmNlIGFuZCBkZXN0aW5hdGlvbiBub3QgYWxpZ25lZCwgcGlwZWxpbmUgaXQuCisJCQkgKiBUaGlzIGlzIG1vc3RseSBhIHdpbiBmb3IgYmlnIGJsaXRzIGJ1dCBubyBsb3NzIGZvcgorCQkJICogc21hbGwgb25lcworCQkJICovCisJCQlVaW50MzIgcHJldl9zdzsKKwkJCWludCB3ID0gd2lkdGg7CisKKwkJCS8qIGhhbmRsZSBvZGQgZGVzdGluYXRpb24gKi8KKwkJCWlmKCh1aW50cHRyX3QpZHN0cCAmIDIpIHsKKwkJCQlVaW50MTYgZCA9ICpkc3RwLCBzID0gKnNyY3A7CisJCQkJKmRzdHAgPSBCTEVORDE2XzUwKGQsIHMsIG1hc2spOworCQkJCWRzdHArKzsKKwkJCQlzcmNwKys7CisJCQkJdy0tOworCQkJfQorCQkJc3JjcCsrOwkvKiBzcmNwIGlzIG5vdyAzMi1iaXQgYWxpZ25lZCAqLworCisJCQkvKiBib290c3RyYXAgcGlwZWxpbmUgd2l0aCBmaXJzdCBoYWxmd29yZCAqLworCQkJcHJldl9zdyA9ICgoVWludDMyICopc3JjcClbLTFdOworCisJCQl3aGlsZSh3ID4gMSkgeworCQkJCVVpbnQzMiBzdywgZHcsIHM7CisJCQkJc3cgPSAqKFVpbnQzMiAqKXNyY3A7CisJCQkJZHcgPSAqKFVpbnQzMiAqKWRzdHA7CisjaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTgorCQkJCXMgPSAocHJldl9zdyA8PCAxNikgKyAoc3cgPj4gMTYpOworI2Vsc2UKKwkJCQlzID0gKHByZXZfc3cgPj4gMTYpICsgKHN3IDw8IDE2KTsKKyNlbmRpZgorCQkJCXByZXZfc3cgPSBzdzsKKwkJCQkqKFVpbnQzMiAqKWRzdHAgPSBCTEVORDJ4MTZfNTAoZHcsIHMsIG1hc2spOworCQkJCWRzdHAgKz0gMjsKKwkJCQlzcmNwICs9IDI7CisJCQkJdyAtPSAyOworCQkJfQorCisJCQkvKiBmaW5hbCBwaXhlbCBpZiBhbnkgKi8KKwkJCWlmKHcpIHsKKwkJCQlVaW50MTYgZCA9ICpkc3RwLCBzOworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KKwkJCQlzID0gKFVpbnQxNilwcmV2X3N3OworI2Vsc2UKKwkJCQlzID0gKFVpbnQxNikocHJldl9zdyA+PiAxNik7CisjZW5kaWYKKwkJCQkqZHN0cCA9IEJMRU5EMTZfNTAoZCwgcywgbWFzayk7CisJCQkJc3JjcCsrOworCQkJCWRzdHArKzsKKwkJCX0KKwkJCXNyY3AgKz0gc3Jjc2tpcCAtIDE7CisJCQlkc3RwICs9IGRzdHNraXA7CisJCX0gZWxzZSB7CisJCQkvKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBhbGlnbmVkICovCisJCQlpbnQgdyA9IHdpZHRoOworCisJCQkvKiBmaXJzdCBvZGQgcGl4ZWw/ICovCisJCQlpZigodWludHB0cl90KXNyY3AgJiAyKSB7CisJCQkJVWludDE2IGQgPSAqZHN0cCwgcyA9ICpzcmNwOworCQkJCSpkc3RwID0gQkxFTkQxNl81MChkLCBzLCBtYXNrKTsKKwkJCQlzcmNwKys7CisJCQkJZHN0cCsrOworCQkJCXctLTsKKwkJCX0KKwkJCS8qIHNyY3AgYW5kIGRzdHAgYXJlIG5vdyAzMi1iaXQgYWxpZ25lZCAqLworCisJCQl3aGlsZSh3ID4gMSkgeworCQkJCVVpbnQzMiBzdyA9ICooVWludDMyICopc3JjcDsKKwkJCQlVaW50MzIgZHcgPSAqKFVpbnQzMiAqKWRzdHA7CisJCQkJKihVaW50MzIgKilkc3RwID0gQkxFTkQyeDE2XzUwKGR3LCBzdywgbWFzayk7CisJCQkJc3JjcCArPSAyOworCQkJCWRzdHAgKz0gMjsKKwkJCQl3IC09IDI7CisJCQl9CisKKwkJCS8qIGxhc3Qgb2RkIHBpeGVsPyAqLworCQkJaWYodykgeworCQkJCVVpbnQxNiBkID0gKmRzdHAsIHMgPSAqc3JjcDsKKwkJCQkqZHN0cCA9IEJMRU5EMTZfNTAoZCwgcywgbWFzayk7CisJCQkJc3JjcCsrOworCQkJCWRzdHArKzsKKwkJCX0KKwkJCXNyY3AgKz0gc3Jjc2tpcDsKKwkJCWRzdHAgKz0gZHN0c2tpcDsKKwkJfQorCX0KK30KKworI2lmIEdDQ19BU01CTElUCisvKiBmYXN0IFJHQjU2NS0+UkdCNTY1IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYSAqLworc3RhdGljIHZvaWQgQmxpdDU2NXRvNTY1U3VyZmFjZUFscGhhTU1YKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7IC8qIGRvd25zY2FsZSBhbHBoYSB0byA1IGJpdHMgKi8KKwlpZihhbHBoYSA9PSAxMjgpIHsKKwkJQmxpdDE2dG8xNlN1cmZhY2VBbHBoYTEyOChpbmZvLCAweGY3ZGUpOworCX0gZWxzZSB7CisJCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwkJVWludDE2ICpzcmNwID0gKFVpbnQxNiAqKWluZm8tPnNfcGl4ZWxzOworCQlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAxOworCQlVaW50MTYgKmRzdHAgPSAoVWludDE2ICopaW5mby0+ZF9waXhlbHM7CisJCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwID4+IDE7CisJCVVpbnQzMiBzLCBkOworCQlVaW50NjQgbG9hZDsKKwkgIAorCQlhbHBoYSAmPSB+KDErMis0KTsJCS8qIGN1dCBhbHBoYSB0byBnZXQgdGhlIGV4YWN0IHNhbWUgYmVoYXZpb3VyICovCisJCWxvYWQgPSBhbHBoYTsKKwkJYWxwaGEgPj49IDM7CQkvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCisKKwkJbW92cV9tMnIobG9hZCwgbW0wKTsgLyogYWxwaGEoMDAwMDAwMEEpIC0+IG1tMCAqLworCQlwdW5wY2tsd2RfcjJyKG1tMCwgbW0wKTsgLyogMDAwMDBBMEEgLT4gbW0wICovCisJCXB1bnBja2x3ZF9yMnIobW0wLCBtbTApOyAvKiAwQTBBMEEwQSAtPiBtbTAgKi8KKwkJLyogcG9zaXRpb24gYWxwaGEgdG8gYWxsb3cgZm9yIG11bGxvIGFuZCBtdWxoaSBvbiBkaWZmIGNoYW5uZWxzCisJCSAgIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgKi8KKwkJcHNsbHFfaTJyKDMsIG1tMCk7CisJICAKKwkJLyogU2V0dXAgdGhlIDU2NSBjb2xvciBjaGFubmVsIG1hc2tzICovCisJCWxvYWQgPSAweDA3RTAwN0UwMDdFMDA3RTBVTEw7CisJCW1vdnFfbTJyKGxvYWQsIG1tNCk7IC8qIE1BU0tHUkVFTiAtPiBtbTQgKi8KKwkJbG9hZCA9IDB4MDAxRjAwMUYwMDFGMDAxRlVMTDsKKwkJbW92cV9tMnIobG9hZCwgbW03KTsgLyogTUFTS0JMVUUgLT4gbW03ICovCisJCXdoaWxlKGhlaWdodC0tKSB7CisJCQlEVUZGU19MT09QX1FVQVRSTzIoCisJCQl7CisJCQkJcyA9ICpzcmNwKys7CisJCQkJZCA9ICpkc3RwOworCQkJCS8qCisJCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KKwkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCisJCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgorCQkJCSAqLworCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsKKwkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7CisJCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKKwkJCQlkICY9IDB4MDdlMGY4MWY7CisJCQkJKmRzdHArKyA9IGQgfCBkID4+IDE2OworCQkJfSx7CisJCQkJcyA9ICpzcmNwKys7CisJCQkJZCA9ICpkc3RwOworCQkJCS8qCisJCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KKwkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCisJCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgorCQkJCSAqLworCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsKKwkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7CisJCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKKwkJCQlkICY9IDB4MDdlMGY4MWY7CisJCQkJKmRzdHArKyA9IGQgfCBkID4+IDE2OworCQkJCXMgPSAqc3JjcCsrOworCQkJCWQgPSAqZHN0cDsKKwkJCQkvKgorCQkJCSAqIHNoaWZ0IG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pIHRvCisJCQkJICogdGhlIGhpZ2ggMTYgYml0cywgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgorCQkJCSAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KKwkJCQkgKi8KKwkJCQlzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7CisJCQkJZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOworCQkJCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7CisJCQkJZCAmPSAweDA3ZTBmODFmOworCQkJCSpkc3RwKysgPSBkIHwgZCA+PiAxNjsKKwkJCX0seworCQkJCW1vdnFfbTJyKCgqc3JjcCksIG1tMik7LyogNCBzcmMgcGl4ZWxzIC0+IG1tMiAqLworCQkJCW1vdnFfbTJyKCgqZHN0cCksIG1tMyk7LyogNCBkc3QgcGl4ZWxzIC0+IG1tMyAqLworCisJCQkJLyogcmVkIC0tIGRvZXMgbm90IG5lZWQgYSBtYXNrIHNpbmNlIHRoZSByaWdodCBzaGlmdCBjbGVhcnMKKwkJCQkgICB0aGUgdW5pbnRlcmVzdGluZyBiaXRzICovCisJCQkJbW92cV9yMnIobW0yLCBtbTUpOyAvKiBzcmMgLT4gbW01ICovCisJCQkJbW92cV9yMnIobW0zLCBtbTYpOyAvKiBkc3QgLT4gbW02ICovCisJCQkJcHNybHdfaTJyKDExLCBtbTUpOyAvKiBtbTUgPj4gMTEgLT4gbW01IFswMDByIDAwMHIgMDAwciAwMDByXSAqLworCQkJCXBzcmx3X2kycigxMSwgbW02KTsgLyogbW02ID4+IDExIC0+IG1tNiBbMDAwciAwMDByIDAwMHIgMDAwcl0gKi8KKworCQkJCS8qIGJsZW5kICovCisJCQkJcHN1YndfcjJyKG1tNiwgbW01KTsvKiBzcmMgLSBkc3QgLT4gbW01ICovCisJCQkJcG11bGx3X3IycihtbTAsIG1tNSk7IC8qIG1tNSAqIGFscGhhIC0+IG1tNSAqLworCQkJCS8qIGFscGhhIHVzZWQgaXMgYWN0dWFsbHkgMTEgYml0cworCQkJCSAgIDExICsgNSA9IDE2IGJpdHMsIHNvIHRoZSBzaWduIGJpdHMgYXJlIGxvc3QgKi8KKwkJCQlwc3Jsd19pMnIoMTEsIG1tNSk7IC8qIG1tNSA+PiAxMSAtPiBtbTUgKi8KKwkJCQlwYWRkd19yMnIobW01LCBtbTYpOyAvKiBtbTUgKyBtbTYoZHN0KSAtPiBtbTYgKi8KKwkJCQlwc2xsd19pMnIoMTEsIG1tNik7IC8qIG1tNiA8PCAxMSAtPiBtbTYgKi8KKworCQkJCW1vdnFfcjJyKG1tNiwgbW0xKTsgLyogc2F2ZSBuZXcgcmVkcyBpbiBkc3RzICovCisKKwkJCQkvKiBncmVlbiAtLSBwcm9jZXNzIHRoZSBiaXRzIGluIHBsYWNlICovCisJCQkJbW92cV9yMnIobW0yLCBtbTUpOyAvKiBzcmMgLT4gbW01ICovCisJCQkJbW92cV9yMnIobW0zLCBtbTYpOyAvKiBkc3QgLT4gbW02ICovCisJCQkJcGFuZF9yMnIobW00LCBtbTUpOyAvKiBzcmMgJiBNQVNLR1JFRU4gLT4gbW01ICovCisJCQkJcGFuZF9yMnIobW00LCBtbTYpOyAvKiBkc3QgJiBNQVNLR1JFRU4gLT4gbW02ICovCisKKwkJCQkvKiBibGVuZCAqLworCQkJCXBzdWJ3X3IycihtbTYsIG1tNSk7Lyogc3JjIC0gZHN0IC0+IG1tNSAqLworCQkJCXBtdWxod19yMnIobW0wLCBtbTUpOyAvKiBtbTUgKiBhbHBoYSAtPiBtbTUgKi8KKwkJCQkvKiAxMSArIDExIC0gMTYgPSA2IGJpdHMsIHNvIGFsbCB0aGUgbG93ZXIgdW5pbnRlcmVzdGluZworCQkJCSAgIGJpdHMgYXJlIGdvbmUgYW5kIHRoZSBzaWduIGJpdHMgcHJlc2VudCAqLworCQkJCXBzbGx3X2kycig1LCBtbTUpOyAvKiBtbTUgPDwgNSAtPiBtbTUgKi8KKwkJCQlwYWRkd19yMnIobW01LCBtbTYpOyAvKiBtbTUgKyBtbTYoZHN0KSAtPiBtbTYgKi8KKworCQkJCXBvcl9yMnIobW02LCBtbTEpOyAvKiBzYXZlIG5ldyBncmVlbnMgaW4gZHN0cyAqLworCisJCQkJLyogYmx1ZSAqLworCQkJCW1vdnFfcjJyKG1tMiwgbW01KTsgLyogc3JjIC0+IG1tNSAqLworCQkJCW1vdnFfcjJyKG1tMywgbW02KTsgLyogZHN0IC0+IG1tNiAqLworCQkJCXBhbmRfcjJyKG1tNywgbW01KTsgLyogc3JjICYgTUFTS0JMVUUgLT4gbW01WzAwMGIgMDAwYiAwMDBiIDAwMGJdICovCisJCQkJcGFuZF9yMnIobW03LCBtbTYpOyAvKiBkc3QgJiBNQVNLQkxVRSAtPiBtbTZbMDAwYiAwMDBiIDAwMGIgMDAwYl0gKi8KKworCQkJCS8qIGJsZW5kICovCisJCQkJcHN1YndfcjJyKG1tNiwgbW01KTsvKiBzcmMgLSBkc3QgLT4gbW01ICovCisJCQkJcG11bGx3X3IycihtbTAsIG1tNSk7IC8qIG1tNSAqIGFscGhhIC0+IG1tNSAqLworCQkJCS8qIDExICsgNSA9IDE2IGJpdHMsIHNvIHRoZSBzaWduIGJpdHMgYXJlIGxvc3QgYW5kCisJCQkJICAgdGhlIGludGVyZXN0aW5nIGJpdHMgd2lsbCBuZWVkIHRvIGJlIE1BU0tlZCAqLworCQkJCXBzcmx3X2kycigxMSwgbW01KTsgLyogbW01ID4+IDExIC0+IG1tNSAqLworCQkJCXBhZGR3X3IycihtbTUsIG1tNik7IC8qIG1tNSArIG1tNihkc3QpIC0+IG1tNiAqLworCQkJCXBhbmRfcjJyKG1tNywgbW02KTsgLyogbW02ICYgTUFTS0JMVUUgLT4gbW02WzAwMGIgMDAwYiAwMDBiIDAwMGJdICovCisKKwkJCQlwb3JfcjJyKG1tNiwgbW0xKTsgLyogc2F2ZSBuZXcgYmx1ZXMgaW4gZHN0cyAqLworCisJCQkJbW92cV9yMm0obW0xLCAqZHN0cCk7IC8qIG1tMSAtPiA0IGRzdCBwaXhlbHMgKi8KKworCQkJCXNyY3AgKz0gNDsKKwkJCQlkc3RwICs9IDQ7CisJCQl9LCB3aWR0aCk7CQkJCisJCQlzcmNwICs9IHNyY3NraXA7CisJCQlkc3RwICs9IGRzdHNraXA7CisJCX0KKwkJZW1tcygpOworCX0KK30KKworLyogZmFzdCBSR0I1NTUtPlJHQjU1NSBibGVuZGluZyB3aXRoIHN1cmZhY2UgYWxwaGEgKi8KK3N0YXRpYyB2b2lkIEJsaXQ1NTV0bzU1NVN1cmZhY2VBbHBoYU1NWChTRExfQmxpdEluZm8gKmluZm8pCit7CisJdW5zaWduZWQgYWxwaGEgPSBpbmZvLT5zcmMtPmFscGhhOyAvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCisJaWYoYWxwaGEgPT0gMTI4KSB7CisJCUJsaXQxNnRvMTZTdXJmYWNlQWxwaGExMjgoaW5mbywgMHhmYmRlKTsKKwl9IGVsc2UgeworCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKilpbmZvLT5zX3BpeGVsczsKKwkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMTsKKwkJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOworCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOworCQlVaW50MzIgcywgZDsKKwkJVWludDY0IGxvYWQ7CisJICAKKwkJYWxwaGEgJj0gfigxKzIrNCk7CQkvKiBjdXQgYWxwaGEgdG8gZ2V0IHRoZSBleGFjdCBzYW1lIGJlaGF2aW91ciAqLworCQlsb2FkID0gYWxwaGE7CisJCWFscGhhID4+PSAzOwkJLyogZG93bnNjYWxlIGFscGhhIHRvIDUgYml0cyAqLworCisJCW1vdnFfbTJyKGxvYWQsIG1tMCk7IC8qIGFscGhhKDAwMDAwMDBBKSAtPiBtbTAgKi8KKwkJcHVucGNrbHdkX3IycihtbTAsIG1tMCk7IC8qIDAwMDAwQTBBIC0+IG1tMCAqLworCQlwdW5wY2tsd2RfcjJyKG1tMCwgbW0wKTsgLyogMEEwQTBBMEEgLT4gbW0wICovCisJCS8qIHBvc2l0aW9uIGFscGhhIHRvIGFsbG93IGZvciBtdWxsbyBhbmQgbXVsaGkgb24gZGlmZiBjaGFubmVscworCQkgICB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBvcGVyYXRpb25zICovCisJCXBzbGxxX2kycigzLCBtbTApOworCisJCS8qIFNldHVwIHRoZSA1NTUgY29sb3IgY2hhbm5lbCBtYXNrcyAqLworCQlsb2FkID0gMHgwM0UwMDNFMDAzRTAwM0UwVUxMOworCQltb3ZxX20ycihsb2FkLCBtbTQpOyAvKiBNQVNLR1JFRU4gLT4gbW00ICovCisJCWxvYWQgPSAweDAwMUYwMDFGMDAxRjAwMUZVTEw7CisJCW1vdnFfbTJyKGxvYWQsIG1tNyk7IC8qIE1BU0tCTFVFIC0+IG1tNyAqLworCQl3aGlsZShoZWlnaHQtLSkgeworCQkJRFVGRlNfTE9PUF9RVUFUUk8yKAorCQkJeworCQkJCXMgPSAqc3JjcCsrOworCQkJCWQgPSAqZHN0cDsKKwkJCQkvKgorCQkJCSAqIHNoaWZ0IG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pIHRvCisJCQkJICogdGhlIGhpZ2ggMTYgYml0cywgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgorCQkJCSAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KKwkJCQkgKi8KKwkJCQlzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDNlMDdjMWY7CisJCQkJZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOworCQkJCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7CisJCQkJZCAmPSAweDAzZTA3YzFmOworCQkJCSpkc3RwKysgPSBkIHwgZCA+PiAxNjsKKwkJCX0seworCQkJCXMgPSAqc3JjcCsrOworCQkJCWQgPSAqZHN0cDsKKwkJCQkvKgorCQkJCSAqIHNoaWZ0IG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pIHRvCisJCQkJICogdGhlIGhpZ2ggMTYgYml0cywgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgorCQkJCSAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KKwkJCQkgKi8KKwkJCQlzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDNlMDdjMWY7CisJCQkJZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOworCQkJCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7CisJCQkJZCAmPSAweDAzZTA3YzFmOworCQkJCSpkc3RwKysgPSBkIHwgZCA+PiAxNjsKKwkJCSAgICAgICAgcyA9ICpzcmNwKys7CisJCQkJZCA9ICpkc3RwOworCQkJCS8qCisJCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KKwkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCisJCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgorCQkJCSAqLworCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsKKwkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7CisJCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKKwkJCQlkICY9IDB4MDNlMDdjMWY7CisJCQkJKmRzdHArKyA9IGQgfCBkID4+IDE2OworCQkJfSx7CisJCQkJbW92cV9tMnIoKCpzcmNwKSwgbW0yKTsvKiA0IHNyYyBwaXhlbHMgLT4gbW0yICovCisJCQkJbW92cV9tMnIoKCpkc3RwKSwgbW0zKTsvKiA0IGRzdCBwaXhlbHMgLT4gbW0zICovCisKKwkJCQkvKiByZWQgLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLworCQkJCXBzbGxxX2kycig1LCBtbTQpOyAvKiB0dXJuIE1BU0tHUkVFTiBpbnRvIE1BU0tSRUQgKi8KKwkJCQkJLyogYnkgcmV1c2luZyB0aGUgR1JFRU4gbWFzayB3ZSBmcmVlIHVwIGFub3RoZXIgbW14CisJCQkJCSAgIHJlZ2lzdGVyIHRvIGFjY3VtdWxhdGUgdGhlIHJlc3VsdCAqLworCisJCQkJbW92cV9yMnIobW0yLCBtbTUpOyAvKiBzcmMgLT4gbW01ICovCisJCQkJbW92cV9yMnIobW0zLCBtbTYpOyAvKiBkc3QgLT4gbW02ICovCisJCQkJcGFuZF9yMnIobW00LCBtbTUpOyAvKiBzcmMgJiBNQVNLUkVEIC0+IG1tNSAqLworCQkJCXBhbmRfcjJyKG1tNCwgbW02KTsgLyogZHN0ICYgTUFTS1JFRCAtPiBtbTYgKi8KKworCQkJCS8qIGJsZW5kICovCisJCQkJcHN1YndfcjJyKG1tNiwgbW01KTsvKiBzcmMgLSBkc3QgLT4gbW01ICovCisJCQkJcG11bGh3X3IycihtbTAsIG1tNSk7IC8qIG1tNSAqIGFscGhhIC0+IG1tNSAqLworCQkJCS8qIDExICsgMTUgLSAxNiA9IDEwIGJpdHMsIHVuaW50ZXJlc3RpbmcgYml0cyB3aWxsIGJlCisJCQkJICAgY2xlYXJlZCBieSBhIE1BU0sgYmVsb3cgKi8KKwkJCQlwc2xsd19pMnIoNSwgbW01KTsgLyogbW01IDw8IDUgLT4gbW01ICovCisJCQkJcGFkZHdfcjJyKG1tNSwgbW02KTsgLyogbW01ICsgbW02KGRzdCkgLT4gbW02ICovCisJCQkJcGFuZF9yMnIobW00LCBtbTYpOyAvKiBtbTYgJiBNQVNLUkVEIC0+IG1tNiAqLworCisJCQkJcHNybHFfaTJyKDUsIG1tNCk7IC8qIHR1cm4gTUFTS1JFRCBiYWNrIGludG8gTUFTS0dSRUVOICovCisKKwkJCQltb3ZxX3IycihtbTYsIG1tMSk7IC8qIHNhdmUgbmV3IHJlZHMgaW4gZHN0cyAqLworCisJCQkJLyogZ3JlZW4gLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLworCQkJCW1vdnFfcjJyKG1tMiwgbW01KTsgLyogc3JjIC0+IG1tNSAqLworCQkJCW1vdnFfcjJyKG1tMywgbW02KTsgLyogZHN0IC0+IG1tNiAqLworCQkJCXBhbmRfcjJyKG1tNCwgbW01KTsgLyogc3JjICYgTUFTS0dSRUVOIC0+IG1tNSAqLworCQkJCXBhbmRfcjJyKG1tNCwgbW02KTsgLyogZHN0ICYgTUFTS0dSRUVOIC0+IG1tNiAqLworCisJCQkJLyogYmxlbmQgKi8KKwkJCQlwc3Vid19yMnIobW02LCBtbTUpOy8qIHNyYyAtIGRzdCAtPiBtbTUgKi8KKwkJCQlwbXVsaHdfcjJyKG1tMCwgbW01KTsgLyogbW01ICogYWxwaGEgLT4gbW01ICovCisJCQkJLyogMTEgKyAxMCAtIDE2ID0gNSBiaXRzLCAgc28gYWxsIHRoZSBsb3dlciB1bmludGVyZXN0aW5nCisJCQkJICAgYml0cyBhcmUgZ29uZSBhbmQgdGhlIHNpZ24gYml0cyBwcmVzZW50ICovCisJCQkJcHNsbHdfaTJyKDUsIG1tNSk7IC8qIG1tNSA8PCA1IC0+IG1tNSAqLworCQkJCXBhZGR3X3IycihtbTUsIG1tNik7IC8qIG1tNSArIG1tNihkc3QpIC0+IG1tNiAqLworCisJCQkJcG9yX3IycihtbTYsIG1tMSk7IC8qIHNhdmUgbmV3IGdyZWVucyBpbiBkc3RzICovCisKKwkJCQkvKiBibHVlICovCisJCQkJbW92cV9yMnIobW0yLCBtbTUpOyAvKiBzcmMgLT4gbW01ICovCisJCQkJbW92cV9yMnIobW0zLCBtbTYpOyAvKiBkc3QgLT4gbW02ICovCisJCQkJcGFuZF9yMnIobW03LCBtbTUpOyAvKiBzcmMgJiBNQVNLQkxVRSAtPiBtbTVbMDAwYiAwMDBiIDAwMGIgMDAwYl0gKi8KKwkJCQlwYW5kX3IycihtbTcsIG1tNik7IC8qIGRzdCAmIE1BU0tCTFVFIC0+IG1tNlswMDBiIDAwMGIgMDAwYiAwMDBiXSAqLworCisJCQkJLyogYmxlbmQgKi8KKwkJCQlwc3Vid19yMnIobW02LCBtbTUpOy8qIHNyYyAtIGRzdCAtPiBtbTUgKi8KKwkJCQlwbXVsbHdfcjJyKG1tMCwgbW01KTsgLyogbW01ICogYWxwaGEgLT4gbW01ICovCisJCQkJLyogMTEgKyA1ID0gMTYgYml0cywgc28gdGhlIHNpZ24gYml0cyBhcmUgbG9zdCBhbmQKKwkJCQkgICB0aGUgaW50ZXJlc3RpbmcgYml0cyB3aWxsIG5lZWQgdG8gYmUgTUFTS2VkICovCisJCQkJcHNybHdfaTJyKDExLCBtbTUpOyAvKiBtbTUgPj4gMTEgLT4gbW01ICovCisJCQkJcGFkZHdfcjJyKG1tNSwgbW02KTsgLyogbW01ICsgbW02KGRzdCkgLT4gbW02ICovCisJCQkJcGFuZF9yMnIobW03LCBtbTYpOyAvKiBtbTYgJiBNQVNLQkxVRSAtPiBtbTZbMDAwYiAwMDBiIDAwMGIgMDAwYl0gKi8KKworCQkJCXBvcl9yMnIobW02LCBtbTEpOyAvKiBzYXZlIG5ldyBibHVlcyBpbiBkc3RzICovCisKKwkJCQltb3ZxX3IybShtbTEsICpkc3RwKTsvKiBtbTEgLT4gNCBkc3QgcGl4ZWxzICovCisKKwkJCQlzcmNwICs9IDQ7CisJCQkJZHN0cCArPSA0OworCQkJfSwgd2lkdGgpOwkJCQorCQkJc3JjcCArPSBzcmNza2lwOworCQkJZHN0cCArPSBkc3Rza2lwOworCQl9CisJCWVtbXMoKTsKKwl9Cit9CisvKiBFbmQgR0NDX0FTTUJMSVQgKi8KKworI2VsaWYgTVNWQ19BU01CTElUCisvKiBmYXN0IFJHQjU2NS0+UkdCNTY1IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYSAqLworc3RhdGljIHZvaWQgQmxpdDU2NXRvNTY1U3VyZmFjZUFscGhhTU1YKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7CisJaWYoYWxwaGEgPT0gMTI4KSB7CisJCUJsaXQxNnRvMTZTdXJmYWNlQWxwaGExMjgoaW5mbywgMHhmN2RlKTsKKwl9IGVsc2UgeworCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKilpbmZvLT5zX3BpeGVsczsKKwkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMTsKKwkJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOworCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOworCQlVaW50MzIgcywgZDsKKwkgIAorCQlfX202NCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBnbWFzaywgYm1hc2ssIG1tX3JlcywgbW1fYWxwaGE7CisKKwkJYWxwaGEgJj0gfigxKzIrNCk7CQkvKiBjdXQgYWxwaGEgdG8gZ2V0IHRoZSBleGFjdCBzYW1lIGJlaGF2aW91ciAqLworCQltbV9hbHBoYSA9IF9tbV9zZXRfcGkzMigwLCBhbHBoYSk7IC8qIDAwMDAwMDBBIC0+IG1tX2FscGhhICovCisJCWFscGhhID4+PSAzOwkJLyogZG93bnNjYWxlIGFscGhhIHRvIDUgYml0cyAqLworCisJCW1tX2FscGhhID0gX21tX3VucGFja2xvX3BpMTYobW1fYWxwaGEsIG1tX2FscGhhKTsgLyogMDAwMDBBMEEgLT4gbW1fYWxwaGEgKi8KKwkJbW1fYWxwaGEgPSBfbW1fdW5wYWNrbG9fcGkzMihtbV9hbHBoYSwgbW1fYWxwaGEpOyAvKiAwQTBBMEEwQSAtPiBtbV9hbHBoYSAqLworCQkvKiBwb3NpdGlvbiBhbHBoYSB0byBhbGxvdyBmb3IgbXVsbG8gYW5kIG11bGhpIG9uIGRpZmYgY2hhbm5lbHMKKwkJICAgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyAqLworCQltbV9hbHBoYSA9IF9tbV9zbGxpX3NpNjQobW1fYWxwaGEsIDMpOworCSAgCisJCS8qIFNldHVwIHRoZSA1NjUgY29sb3IgY2hhbm5lbCBtYXNrcyAqLworCQlnbWFzayA9IF9tbV9zZXRfcGkzMigweDA3RTAwN0UwLCAweDA3RTAwN0UwKTsgLyogTUFTS0dSRUVOIC0+IGdtYXNrICovCisJCWJtYXNrID0gX21tX3NldF9waTMyKDB4MDAxRjAwMUYsIDB4MDAxRjAwMUYpOyAvKiBNQVNLQkxVRSAtPiBibWFzayAqLworCQkKKwkJd2hpbGUoaGVpZ2h0LS0pIHsKKwkJCURVRkZTX0xPT1BfUVVBVFJPMigKKwkJCXsKKwkJCQlzID0gKnNyY3ArKzsKKwkJCQlkID0gKmRzdHA7CisJCQkJLyoKKwkJCQkgKiBzaGlmdCBvdXQgdGhlIG1pZGRsZSBjb21wb25lbnQgKGdyZWVuKSB0bworCQkJCSAqIHRoZSBoaWdoIDE2IGJpdHMsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKKwkJCQkgKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCisJCQkJICovCisJCQkJcyA9IChzIHwgcyA8PCAxNikgJiAweDA3ZTBmODFmOworCQkJCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsKKwkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OworCQkJCWQgJj0gMHgwN2UwZjgxZjsKKwkJCQkqZHN0cCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOworCQkJfSx7CisJCQkJcyA9ICpzcmNwKys7CisJCQkJZCA9ICpkc3RwOworCQkJCS8qCisJCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KKwkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCisJCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgorCQkJCSAqLworCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsKKwkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7CisJCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKKwkJCQlkICY9IDB4MDdlMGY4MWY7CisJCQkJKmRzdHArKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKKwkJCQlzID0gKnNyY3ArKzsKKwkJCQlkID0gKmRzdHA7CisJCQkJLyoKKwkJCQkgKiBzaGlmdCBvdXQgdGhlIG1pZGRsZSBjb21wb25lbnQgKGdyZWVuKSB0bworCQkJCSAqIHRoZSBoaWdoIDE2IGJpdHMsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKKwkJCQkgKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCisJCQkJICovCisJCQkJcyA9IChzIHwgcyA8PCAxNikgJiAweDA3ZTBmODFmOworCQkJCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsKKwkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OworCQkJCWQgJj0gMHgwN2UwZjgxZjsKKwkJCQkqZHN0cCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOworCQkJfSx7CisJCQkJc3JjMSA9ICooX19tNjQqKXNyY3A7IC8qIDQgc3JjIHBpeGVscyAtPiBzcmMxICovCisJCQkJZHN0MSA9ICooX19tNjQqKWRzdHA7IC8qIDQgZHN0IHBpeGVscyAtPiBkc3QxICovCisKKwkJCQkvKiByZWQgKi8KKwkJCQlzcmMyID0gc3JjMTsKKwkJCQlzcmMyID0gX21tX3NybGlfcGkxNihzcmMyLCAxMSk7IC8qIHNyYzIgPj4gMTEgLT4gc3JjMiBbMDAwciAwMDByIDAwMHIgMDAwcl0gKi8KKworCQkJCWRzdDIgPSBkc3QxOworCQkJCWRzdDIgPSBfbW1fc3JsaV9waTE2KGRzdDIsIDExKTsgLyogZHN0MiA+PiAxMSAtPiBkc3QyIFswMDByIDAwMHIgMDAwciAwMDByXSAqLworCisJCQkJLyogYmxlbmQgKi8KKwkJCQlzcmMyID0gX21tX3N1Yl9waTE2KHNyYzIsIGRzdDIpOy8qIHNyYyAtIGRzdCAtPiBzcmMyICovCisJCQkJc3JjMiA9IF9tbV9tdWxsb19waTE2KHNyYzIsIG1tX2FscGhhKTsgLyogc3JjMiAqIGFscGhhIC0+IHNyYzIgKi8KKwkJCQlzcmMyID0gX21tX3NybGlfcGkxNihzcmMyLCAxMSk7IC8qIHNyYzIgPj4gMTEgLT4gc3JjMiAqLworCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KKwkJCQlkc3QyID0gX21tX3NsbGlfcGkxNihkc3QyLCAxMSk7IC8qIGRzdDIgPDwgMTEgLT4gZHN0MiAqLworCisJCQkJbW1fcmVzID0gZHN0MjsgLyogUkVEIC0+IG1tX3JlcyAqLworCisJCQkJLyogZ3JlZW4gLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLworCQkJCXNyYzIgPSBzcmMxOworCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgZ21hc2spOyAvKiBzcmMgJiBNQVNLR1JFRU4gLT4gc3JjMiAqLworCisJCQkJZHN0MiA9IGRzdDE7CisJCQkJZHN0MiA9IF9tbV9hbmRfc2k2NChkc3QyLCBnbWFzayk7IC8qIGRzdCAmIE1BU0tHUkVFTiAtPiBkc3QyICovCisKKwkJCQkvKiBibGVuZCAqLworCQkJCXNyYzIgPSBfbW1fc3ViX3BpMTYoc3JjMiwgZHN0Mik7Lyogc3JjIC0gZHN0IC0+IHNyYzIgKi8KKwkJCQlzcmMyID0gX21tX211bGhpX3BpMTYoc3JjMiwgbW1fYWxwaGEpOyAvKiBzcmMyICogYWxwaGEgLT4gc3JjMiAqLworCQkJCXNyYzIgPSBfbW1fc2xsaV9waTE2KHNyYzIsIDUpOyAvKiBzcmMyIDw8IDUgLT4gc3JjMiAqLworCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KKworCQkJCW1tX3JlcyA9IF9tbV9vcl9zaTY0KG1tX3JlcywgZHN0Mik7IC8qIFJFRCB8IEdSRUVOIC0+IG1tX3JlcyAqLworCisJCQkJLyogYmx1ZSAqLworCQkJCXNyYzIgPSBzcmMxOworCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgYm1hc2spOyAvKiBzcmMgJiBNQVNLQkxVRSAtPiBzcmMyWzAwMGIgMDAwYiAwMDBiIDAwMGJdICovCisKKwkJCQlkc3QyID0gZHN0MTsKKwkJCQlkc3QyID0gX21tX2FuZF9zaTY0KGRzdDIsIGJtYXNrKTsgLyogZHN0ICYgTUFTS0JMVUUgLT4gZHN0MlswMDBiIDAwMGIgMDAwYiAwMDBiXSAqLworCisJCQkJLyogYmxlbmQgKi8KKwkJCQlzcmMyID0gX21tX3N1Yl9waTE2KHNyYzIsIGRzdDIpOy8qIHNyYyAtIGRzdCAtPiBzcmMyICovCisJCQkJc3JjMiA9IF9tbV9tdWxsb19waTE2KHNyYzIsIG1tX2FscGhhKTsgLyogc3JjMiAqIGFscGhhIC0+IHNyYzIgKi8KKwkJCQlzcmMyID0gX21tX3NybGlfcGkxNihzcmMyLCAxMSk7IC8qIHNyYzIgPj4gMTEgLT4gc3JjMiAqLworCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KKwkJCQlkc3QyID0gX21tX2FuZF9zaTY0KGRzdDIsIGJtYXNrKTsgLyogZHN0MiAmIE1BU0tCTFVFIC0+IGRzdDIgKi8KKworCQkJCW1tX3JlcyA9IF9tbV9vcl9zaTY0KG1tX3JlcywgZHN0Mik7IC8qIFJFRCB8IEdSRUVOIHwgQkxVRSAtPiBtbV9yZXMgKi8KKworCQkJCSooX19tNjQqKWRzdHAgPSBtbV9yZXM7IC8qIG1tX3JlcyAtPiA0IGRzdCBwaXhlbHMgKi8KKworCQkJCXNyY3AgKz0gNDsKKwkJCQlkc3RwICs9IDQ7CisJCQl9LCB3aWR0aCk7CQkJCisJCQlzcmNwICs9IHNyY3NraXA7CisJCQlkc3RwICs9IGRzdHNraXA7CisJCX0KKwkJX21tX2VtcHR5KCk7CisJfQorfQorCisvKiBmYXN0IFJHQjU1NS0+UkdCNTU1IGJsZW5kaW5nIHdpdGggc3VyZmFjZSBhbHBoYSAqLworc3RhdGljIHZvaWQgQmxpdDU1NXRvNTU1U3VyZmFjZUFscGhhTU1YKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBhbHBoYSA9IGluZm8tPnNyYy0+YWxwaGE7CisJaWYoYWxwaGEgPT0gMTI4KSB7CisJCUJsaXQxNnRvMTZTdXJmYWNlQWxwaGExMjgoaW5mbywgMHhmYmRlKTsKKwl9IGVsc2UgeworCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKilpbmZvLT5zX3BpeGVsczsKKwkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMTsKKwkJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOworCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOworCQlVaW50MzIgcywgZDsKKwkgIAorCQlfX202NCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBybWFzaywgZ21hc2ssIGJtYXNrLCBtbV9yZXMsIG1tX2FscGhhOworCisJCWFscGhhICY9IH4oMSsyKzQpOwkJLyogY3V0IGFscGhhIHRvIGdldCB0aGUgZXhhY3Qgc2FtZSBiZWhhdmlvdXIgKi8KKwkJbW1fYWxwaGEgPSBfbW1fc2V0X3BpMzIoMCwgYWxwaGEpOyAvKiAwMDAwMDAwQSAtPiBtbV9hbHBoYSAqLworCQlhbHBoYSA+Pj0gMzsJCS8qIGRvd25zY2FsZSBhbHBoYSB0byA1IGJpdHMgKi8KKworCQltbV9hbHBoYSA9IF9tbV91bnBhY2tsb19waTE2KG1tX2FscGhhLCBtbV9hbHBoYSk7IC8qIDAwMDAwQTBBIC0+IG1tX2FscGhhICovCisJCW1tX2FscGhhID0gX21tX3VucGFja2xvX3BpMzIobW1fYWxwaGEsIG1tX2FscGhhKTsgLyogMEEwQTBBMEEgLT4gbW1fYWxwaGEgKi8KKwkJLyogcG9zaXRpb24gYWxwaGEgdG8gYWxsb3cgZm9yIG11bGxvIGFuZCBtdWxoaSBvbiBkaWZmIGNoYW5uZWxzCisJCSAgIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgKi8KKwkJbW1fYWxwaGEgPSBfbW1fc2xsaV9zaTY0KG1tX2FscGhhLCAzKTsKKwkgIAorCQkvKiBTZXR1cCB0aGUgNTU1IGNvbG9yIGNoYW5uZWwgbWFza3MgKi8KKwkJcm1hc2sgPSBfbW1fc2V0X3BpMzIoMHg3QzAwN0MwMCwgMHg3QzAwN0MwMCk7IC8qIE1BU0tSRUQgLT4gcm1hc2sgKi8KKwkJZ21hc2sgPSBfbW1fc2V0X3BpMzIoMHgwM0UwMDNFMCwgMHgwM0UwMDNFMCk7IC8qIE1BU0tHUkVFTiAtPiBnbWFzayAqLworCQlibWFzayA9IF9tbV9zZXRfcGkzMigweDAwMUYwMDFGLCAweDAwMUYwMDFGKTsgLyogTUFTS0JMVUUgLT4gYm1hc2sgKi8KKworCQl3aGlsZShoZWlnaHQtLSkgeworCQkJRFVGRlNfTE9PUF9RVUFUUk8yKAorCQkJeworCQkJCXMgPSAqc3JjcCsrOworCQkJCWQgPSAqZHN0cDsKKwkJCQkvKgorCQkJCSAqIHNoaWZ0IG91dCB0aGUgbWlkZGxlIGNvbXBvbmVudCAoZ3JlZW4pIHRvCisJCQkJICogdGhlIGhpZ2ggMTYgYml0cywgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgorCQkJCSAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KKwkJCQkgKi8KKwkJCQlzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDNlMDdjMWY7CisJCQkJZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOworCQkJCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7CisJCQkJZCAmPSAweDAzZTA3YzFmOworCQkJCSpkc3RwKysgPSAoVWludDE2KShkIHwgZCA+PiAxNik7CisJCQl9LHsKKwkJCQlzID0gKnNyY3ArKzsKKwkJCQlkID0gKmRzdHA7CisJCQkJLyoKKwkJCQkgKiBzaGlmdCBvdXQgdGhlIG1pZGRsZSBjb21wb25lbnQgKGdyZWVuKSB0bworCQkJCSAqIHRoZSBoaWdoIDE2IGJpdHMsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKKwkJCQkgKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCisJCQkJICovCisJCQkJcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOworCQkJCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsKKwkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OworCQkJCWQgJj0gMHgwM2UwN2MxZjsKKwkJCQkqZHN0cCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOworCQkJICAgICAgICBzID0gKnNyY3ArKzsKKwkJCQlkID0gKmRzdHA7CisJCQkJLyoKKwkJCQkgKiBzaGlmdCBvdXQgdGhlIG1pZGRsZSBjb21wb25lbnQgKGdyZWVuKSB0bworCQkJCSAqIHRoZSBoaWdoIDE2IGJpdHMsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKKwkJCQkgKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCisJCQkJICovCisJCQkJcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOworCQkJCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsKKwkJCQlkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OworCQkJCWQgJj0gMHgwM2UwN2MxZjsKKwkJCQkqZHN0cCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOworCQkJfSx7CisJCQkJc3JjMSA9ICooX19tNjQqKXNyY3A7IC8qIDQgc3JjIHBpeGVscyAtPiBzcmMxICovCisJCQkJZHN0MSA9ICooX19tNjQqKWRzdHA7IC8qIDQgZHN0IHBpeGVscyAtPiBkc3QxICovCisKKwkJCQkvKiByZWQgLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLworCQkJCXNyYzIgPSBzcmMxOworCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgcm1hc2spOyAvKiBzcmMgJiBNQVNLUkVEIC0+IHNyYzIgKi8KKworCQkJCWRzdDIgPSBkc3QxOworCQkJCWRzdDIgPSBfbW1fYW5kX3NpNjQoZHN0Miwgcm1hc2spOyAvKiBkc3QgJiBNQVNLUkVEIC0+IGRzdDIgKi8KKworCQkJCS8qIGJsZW5kICovCisJCQkJc3JjMiA9IF9tbV9zdWJfcGkxNihzcmMyLCBkc3QyKTsvKiBzcmMgLSBkc3QgLT4gc3JjMiAqLworCQkJCXNyYzIgPSBfbW1fbXVsaGlfcGkxNihzcmMyLCBtbV9hbHBoYSk7IC8qIHNyYzIgKiBhbHBoYSAtPiBzcmMyICovCisJCQkJc3JjMiA9IF9tbV9zbGxpX3BpMTYoc3JjMiwgNSk7IC8qIHNyYzIgPDwgNSAtPiBzcmMyICovCisJCQkJZHN0MiA9IF9tbV9hZGRfcGkxNihzcmMyLCBkc3QyKTsgLyogc3JjMiArIGRzdDIgLT4gZHN0MiAqLworCQkJCWRzdDIgPSBfbW1fYW5kX3NpNjQoZHN0Miwgcm1hc2spOyAvKiBkc3QyICYgTUFTS1JFRCAtPiBkc3QyICovCisKKwkJCQltbV9yZXMgPSBkc3QyOyAvKiBSRUQgLT4gbW1fcmVzICovCisJCQkJCisJCQkJLyogZ3JlZW4gLS0gcHJvY2VzcyB0aGUgYml0cyBpbiBwbGFjZSAqLworCQkJCXNyYzIgPSBzcmMxOworCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgZ21hc2spOyAvKiBzcmMgJiBNQVNLR1JFRU4gLT4gc3JjMiAqLworCisJCQkJZHN0MiA9IGRzdDE7CisJCQkJZHN0MiA9IF9tbV9hbmRfc2k2NChkc3QyLCBnbWFzayk7IC8qIGRzdCAmIE1BU0tHUkVFTiAtPiBkc3QyICovCisKKwkJCQkvKiBibGVuZCAqLworCQkJCXNyYzIgPSBfbW1fc3ViX3BpMTYoc3JjMiwgZHN0Mik7Lyogc3JjIC0gZHN0IC0+IHNyYzIgKi8KKwkJCQlzcmMyID0gX21tX211bGhpX3BpMTYoc3JjMiwgbW1fYWxwaGEpOyAvKiBzcmMyICogYWxwaGEgLT4gc3JjMiAqLworCQkJCXNyYzIgPSBfbW1fc2xsaV9waTE2KHNyYzIsIDUpOyAvKiBzcmMyIDw8IDUgLT4gc3JjMiAqLworCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KKworCQkJCW1tX3JlcyA9IF9tbV9vcl9zaTY0KG1tX3JlcywgZHN0Mik7IC8qIFJFRCB8IEdSRUVOIC0+IG1tX3JlcyAqLworCisJCQkJLyogYmx1ZSAqLworCQkJCXNyYzIgPSBzcmMxOyAvKiBzcmMgLT4gc3JjMiAqLworCQkJCXNyYzIgPSBfbW1fYW5kX3NpNjQoc3JjMiwgYm1hc2spOyAvKiBzcmMgJiBNQVNLQkxVRSAtPiBzcmMyWzAwMGIgMDAwYiAwMDBiIDAwMGJdICovCisKKwkJCQlkc3QyID0gZHN0MTsgLyogZHN0IC0+IGRzdDIgKi8KKwkJCQlkc3QyID0gX21tX2FuZF9zaTY0KGRzdDIsIGJtYXNrKTsgLyogZHN0ICYgTUFTS0JMVUUgLT4gZHN0MlswMDBiIDAwMGIgMDAwYiAwMDBiXSAqLworCisJCQkJLyogYmxlbmQgKi8KKwkJCQlzcmMyID0gX21tX3N1Yl9waTE2KHNyYzIsIGRzdDIpOy8qIHNyYyAtIGRzdCAtPiBzcmMyICovCisJCQkJc3JjMiA9IF9tbV9tdWxsb19waTE2KHNyYzIsIG1tX2FscGhhKTsgLyogc3JjMiAqIGFscGhhIC0+IHNyYzIgKi8KKwkJCQlzcmMyID0gX21tX3NybGlfcGkxNihzcmMyLCAxMSk7IC8qIHNyYzIgPj4gMTEgLT4gc3JjMiAqLworCQkJCWRzdDIgPSBfbW1fYWRkX3BpMTYoc3JjMiwgZHN0Mik7IC8qIHNyYzIgKyBkc3QyIC0+IGRzdDIgKi8KKwkJCQlkc3QyID0gX21tX2FuZF9zaTY0KGRzdDIsIGJtYXNrKTsgLyogZHN0MiAmIE1BU0tCTFVFIC0+IGRzdDIgKi8KKworCQkJCW1tX3JlcyA9IF9tbV9vcl9zaTY0KG1tX3JlcywgZHN0Mik7IC8qIFJFRCB8IEdSRUVOIHwgQkxVRSAtPiBtbV9yZXMgKi8KKworCQkJCSooX19tNjQqKWRzdHAgPSBtbV9yZXM7IC8qIG1tX3JlcyAtPiA0IGRzdCBwaXhlbHMgKi8KKworCQkJCXNyY3AgKz0gNDsKKwkJCQlkc3RwICs9IDQ7CisJCQl9LCB3aWR0aCk7CQkJCisJCQlzcmNwICs9IHNyY3NraXA7CisJCQlkc3RwICs9IGRzdHNraXA7CisJCX0KKwkJX21tX2VtcHR5KCk7CisJfQorfQorI2VuZGlmIC8qIEdDQ19BU01CTElULCBNU1ZDX0FTTUJMSVQgKi8KKworLyogZmFzdCBSR0I1NjUtPlJHQjU2NSBibGVuZGluZyB3aXRoIHN1cmZhY2UgYWxwaGEgKi8KK3N0YXRpYyB2b2lkIEJsaXQ1NjV0bzU2NVN1cmZhY2VBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCit7CisJdW5zaWduZWQgYWxwaGEgPSBpbmZvLT5zcmMtPmFscGhhOworCWlmKGFscGhhID09IDEyOCkgeworCQlCbGl0MTZ0bzE2U3VyZmFjZUFscGhhMTI4KGluZm8sIDB4ZjdkZSk7CisJfSBlbHNlIHsKKwkJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwkJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCQlVaW50MTYgKnNyY3AgPSAoVWludDE2ICopaW5mby0+c19waXhlbHM7CisJCWludCBzcmNza2lwID0gaW5mby0+c19za2lwID4+IDE7CisJCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKKwkJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMTsKKwkJYWxwaGEgPj49IDM7CS8qIGRvd25zY2FsZSBhbHBoYSB0byA1IGJpdHMgKi8KKworCQl3aGlsZShoZWlnaHQtLSkgeworCQkJRFVGRlNfTE9PUDQoeworCQkJCVVpbnQzMiBzID0gKnNyY3ArKzsKKwkJCQlVaW50MzIgZCA9ICpkc3RwOworCQkJCS8qCisJCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KKwkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCisJCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgorCQkJCSAqLworCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsKKwkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7CisJCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKKwkJCQlkICY9IDB4MDdlMGY4MWY7CisJCQkJKmRzdHArKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKKwkJCX0sIHdpZHRoKTsKKwkJCXNyY3AgKz0gc3Jjc2tpcDsKKwkJCWRzdHAgKz0gZHN0c2tpcDsKKwkJfQorCX0KK30KKworLyogZmFzdCBSR0I1NTUtPlJHQjU1NSBibGVuZGluZyB3aXRoIHN1cmZhY2UgYWxwaGEgKi8KK3N0YXRpYyB2b2lkIEJsaXQ1NTV0bzU1NVN1cmZhY2VBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCit7CisJdW5zaWduZWQgYWxwaGEgPSBpbmZvLT5zcmMtPmFscGhhOyAvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCisJaWYoYWxwaGEgPT0gMTI4KSB7CisJCUJsaXQxNnRvMTZTdXJmYWNlQWxwaGExMjgoaW5mbywgMHhmYmRlKTsKKwl9IGVsc2UgeworCQlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCQlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKilpbmZvLT5zX3BpeGVsczsKKwkJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMTsKKwkJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOworCQlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOworCQlhbHBoYSA+Pj0gMzsJCS8qIGRvd25zY2FsZSBhbHBoYSB0byA1IGJpdHMgKi8KKworCQl3aGlsZShoZWlnaHQtLSkgeworCQkJRFVGRlNfTE9PUDQoeworCQkJCVVpbnQzMiBzID0gKnNyY3ArKzsKKwkJCQlVaW50MzIgZCA9ICpkc3RwOworCQkJCS8qCisJCQkJICogc2hpZnQgb3V0IHRoZSBtaWRkbGUgY29tcG9uZW50IChncmVlbikgdG8KKwkJCQkgKiB0aGUgaGlnaCAxNiBiaXRzLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCisJCQkJICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgorCQkJCSAqLworCQkJCXMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsKKwkJCQlkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7CisJCQkJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsKKwkJCQlkICY9IDB4MDNlMDdjMWY7CisJCQkJKmRzdHArKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKKwkJCX0sIHdpZHRoKTsKKwkJCXNyY3AgKz0gc3Jjc2tpcDsKKwkJCWRzdHAgKz0gZHN0c2tpcDsKKwkJfQorCX0KK30KKworLyogZmFzdCBBUkdCODg4OC0+UkdCNTY1IGJsZW5kaW5nIHdpdGggcGl4ZWwgYWxwaGEgKi8KK3N0YXRpYyB2b2lkIEJsaXRBUkdCdG81NjVQaXhlbEFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50MzIgKnNyY3AgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXAgPj4gMjsKKwlVaW50MTYgKmRzdHAgPSAoVWludDE2ICopaW5mby0+ZF9waXhlbHM7CisJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXAgPj4gMTsKKworCXdoaWxlKGhlaWdodC0tKSB7CisJICAgIERVRkZTX0xPT1A0KHsKKwkJVWludDMyIHMgPSAqc3JjcDsKKwkJdW5zaWduZWQgYWxwaGEgPSBzID4+IDI3OyAvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCisJCS8qIEZJWE1FOiBIZXJlIHdlIHNwZWNpYWwtY2FzZSBvcGFxdWUgYWxwaGEgc2luY2UgdGhlCisJCSAgIGNvbXBvc2l0aW9uaW5nIHVzZWQgKD4+OCBpbnN0ZWFkIG9mIC8yNTUpIGRvZXNuJ3QgaGFuZGxlCisJCSAgIGl0IGNvcnJlY3RseS4gQWxzbyBzcGVjaWFsLWNhc2UgYWxwaGE9MCBmb3Igc3BlZWQ/CisJCSAgIEJlbmNobWFyayB0aGlzISAqLworCQlpZihhbHBoYSkgeyAgIAorCQkgIGlmKGFscGhhID09IChTRExfQUxQSEFfT1BBUVVFID4+IDMpKSB7CisJCSAgICAqZHN0cCA9IChVaW50MTYpKChzID4+IDggJiAweGY4MDApICsgKHMgPj4gNSAmIDB4N2UwKSArIChzID4+IDMgICYgMHgxZikpOworCQkgIH0gZWxzZSB7CisJCSAgICBVaW50MzIgZCA9ICpkc3RwOworCQkgICAgLyoKKwkJICAgICAqIGNvbnZlcnQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0byBHMFJBQjY1NTY1CisJCSAgICAgKiBhbmQgYmxlbmQgYWxsIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZQorCQkgICAgICovCisJCSAgICBzID0gKChzICYgMHhmYzAwKSA8PCAxMSkgKyAocyA+PiA4ICYgMHhmODAwKQorCQkgICAgICArIChzID4+IDMgJiAweDFmKTsKKwkJICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsKKwkJICAgIGQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7CisJCSAgICBkICY9IDB4MDdlMGY4MWY7CisJCSAgICAqZHN0cCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKKwkJICB9CisJCX0KKwkJc3JjcCsrOworCQlkc3RwKys7CisJICAgIH0sIHdpZHRoKTsKKwkgICAgc3JjcCArPSBzcmNza2lwOworCSAgICBkc3RwICs9IGRzdHNraXA7CisJfQorfQorCisvKiBmYXN0IEFSR0I4ODg4LT5SR0I1NTUgYmxlbmRpbmcgd2l0aCBwaXhlbCBhbHBoYSAqLworc3RhdGljIHZvaWQgQmxpdEFSR0J0bzU1NVBpeGVsQWxwaGEoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKilpbmZvLT5zX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcCA+PiAyOworCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcCA+PiAxOworCisJd2hpbGUoaGVpZ2h0LS0pIHsKKwkgICAgRFVGRlNfTE9PUDQoeworCQl1bnNpZ25lZCBhbHBoYTsKKwkJVWludDMyIHMgPSAqc3JjcDsKKwkJYWxwaGEgPSBzID4+IDI3OyAvKiBkb3duc2NhbGUgYWxwaGEgdG8gNSBiaXRzICovCisJCS8qIEZJWE1FOiBIZXJlIHdlIHNwZWNpYWwtY2FzZSBvcGFxdWUgYWxwaGEgc2luY2UgdGhlCisJCSAgIGNvbXBvc2l0aW9uaW5nIHVzZWQgKD4+OCBpbnN0ZWFkIG9mIC8yNTUpIGRvZXNuJ3QgaGFuZGxlCisJCSAgIGl0IGNvcnJlY3RseS4gQWxzbyBzcGVjaWFsLWNhc2UgYWxwaGE9MCBmb3Igc3BlZWQ/CisJCSAgIEJlbmNobWFyayB0aGlzISAqLworCQlpZihhbHBoYSkgeyAgIAorCQkgIGlmKGFscGhhID09IChTRExfQUxQSEFfT1BBUVVFID4+IDMpKSB7CisJCSAgICAqZHN0cCA9IChVaW50MTYpKChzID4+IDkgJiAweDdjMDApICsgKHMgPj4gNiAmIDB4M2UwKSArIChzID4+IDMgICYgMHgxZikpOworCQkgIH0gZWxzZSB7CisJCSAgICBVaW50MzIgZCA9ICpkc3RwOworCQkgICAgLyoKKwkJICAgICAqIGNvbnZlcnQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0byBHMFJBQjY1NTY1CisJCSAgICAgKiBhbmQgYmxlbmQgYWxsIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZQorCQkgICAgICovCisJCSAgICBzID0gKChzICYgMHhmODAwKSA8PCAxMCkgKyAocyA+PiA5ICYgMHg3YzAwKQorCQkgICAgICArIChzID4+IDMgJiAweDFmKTsKKwkJICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsKKwkJICAgIGQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7CisJCSAgICBkICY9IDB4MDNlMDdjMWY7CisJCSAgICAqZHN0cCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsKKwkJICB9CisJCX0KKwkJc3JjcCsrOworCQlkc3RwKys7CisJICAgIH0sIHdpZHRoKTsKKwkgICAgc3JjcCArPSBzcmNza2lwOworCSAgICBkc3RwICs9IGRzdHNraXA7CisJfQorfQorCisvKiBHZW5lcmFsIChzbG93KSBOLT5OIGJsZW5kaW5nIHdpdGggcGVyLXN1cmZhY2UgYWxwaGEgKi8KK3N0YXRpYyB2b2lkIEJsaXROdG9OU3VyZmFjZUFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisJVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOworCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OworCWludCBzcmNicHAgPSBzcmNmbXQtPkJ5dGVzUGVyUGl4ZWw7CisJaW50IGRzdGJwcCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKKwl1bnNpZ25lZCBzQSA9IHNyY2ZtdC0+YWxwaGE7CisJdW5zaWduZWQgZEEgPSBkc3RmbXQtPkFtYXNrID8gU0RMX0FMUEhBX09QQVFVRSA6IDA7CisKKwlpZihzQSkgeworCSAgd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkgICAgRFVGRlNfTE9PUDQoCisJICAgIHsKKwkJVWludDMyIFBpeGVsOworCQl1bnNpZ25lZCBzUjsKKwkJdW5zaWduZWQgc0c7CisJCXVuc2lnbmVkIHNCOworCQl1bnNpZ25lZCBkUjsKKwkJdW5zaWduZWQgZEc7CisJCXVuc2lnbmVkIGRCOworCQlESVNFTUJMRV9SR0Ioc3JjLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsIHNSLCBzRywgc0IpOworCQlESVNFTUJMRV9SR0IoZHN0LCBkc3RicHAsIGRzdGZtdCwgUGl4ZWwsIGRSLCBkRywgZEIpOworCQlBTFBIQV9CTEVORChzUiwgc0csIHNCLCBzQSwgZFIsIGRHLCBkQik7CisJCUFTU0VNQkxFX1JHQkEoZHN0LCBkc3RicHAsIGRzdGZtdCwgZFIsIGRHLCBkQiwgZEEpOworCQlzcmMgKz0gc3JjYnBwOworCQlkc3QgKz0gZHN0YnBwOworCSAgICB9LAorCSAgICB3aWR0aCk7CisJICAgIHNyYyArPSBzcmNza2lwOworCSAgICBkc3QgKz0gZHN0c2tpcDsKKwkgIH0KKwl9Cit9CisKKy8qIEdlbmVyYWwgKHNsb3cpIGNvbG9ya2V5ZWQgTi0+TiBibGVuZGluZyB3aXRoIHBlci1zdXJmYWNlIGFscGhhICovCitzdGF0aWMgdm9pZCBCbGl0TnRvTlN1cmZhY2VBbHBoYUtleShTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKKwlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKKwlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKKwlVaW50MzIgY2tleSA9IHNyY2ZtdC0+Y29sb3JrZXk7CisJaW50IHNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKKwlpbnQgZHN0YnBwID0gZHN0Zm10LT5CeXRlc1BlclBpeGVsOworCXVuc2lnbmVkIHNBID0gc3JjZm10LT5hbHBoYTsKKwl1bnNpZ25lZCBkQSA9IGRzdGZtdC0+QW1hc2sgPyBTRExfQUxQSEFfT1BBUVVFIDogMDsKKworCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJICAgIERVRkZTX0xPT1A0KAorCSAgICB7CisJCVVpbnQzMiBQaXhlbDsKKwkJdW5zaWduZWQgc1I7CisJCXVuc2lnbmVkIHNHOworCQl1bnNpZ25lZCBzQjsKKwkJdW5zaWduZWQgZFI7CisJCXVuc2lnbmVkIGRHOworCQl1bnNpZ25lZCBkQjsKKwkJUkVUUklFVkVfUkdCX1BJWEVMKHNyYywgc3JjYnBwLCBQaXhlbCk7CisJCWlmKHNBICYmIFBpeGVsICE9IGNrZXkpIHsKKwkJICAgIFJHQl9GUk9NX1BJWEVMKFBpeGVsLCBzcmNmbXQsIHNSLCBzRywgc0IpOworCQkgICAgRElTRU1CTEVfUkdCKGRzdCwgZHN0YnBwLCBkc3RmbXQsIFBpeGVsLCBkUiwgZEcsIGRCKTsKKwkJICAgIEFMUEhBX0JMRU5EKHNSLCBzRywgc0IsIHNBLCBkUiwgZEcsIGRCKTsKKwkJICAgIEFTU0VNQkxFX1JHQkEoZHN0LCBkc3RicHAsIGRzdGZtdCwgZFIsIGRHLCBkQiwgZEEpOworCQl9CisJCXNyYyArPSBzcmNicHA7CisJCWRzdCArPSBkc3RicHA7CisJICAgIH0sCisJICAgIHdpZHRoKTsKKwkgICAgc3JjICs9IHNyY3NraXA7CisJICAgIGRzdCArPSBkc3Rza2lwOworCX0KK30KKworLyogR2VuZXJhbCAoc2xvdykgTi0+TiBibGVuZGluZyB3aXRoIHBpeGVsIGFscGhhICovCitzdGF0aWMgdm9pZCBCbGl0TnRvTlBpeGVsQWxwaGEoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKwlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7CisJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisJU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisKKwlpbnQgIHNyY2JwcDsKKwlpbnQgIGRzdGJwcDsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKKwlkc3RicHAgPSBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWw7CisKKwkvKiBGSVhNRTogZm9yIDhicHAgc291cmNlIGFscGhhLCB0aGlzIGRvZXNuJ3QgZ2V0IG9wYXF1ZSB2YWx1ZXMKKwkgICBxdWl0ZSByaWdodC4gZm9yIDw4YnBwIHNvdXJjZSBhbHBoYSwgaXQgZ2V0cyB0aGVtIHZlcnkgd3JvbmcKKwkgICAoY2hlY2sgYWxsIG1hY3JvcyEpCisJICAgSXQgaXMgdW5jbGVhciB3aGV0aGVyIHRoZXJlIGlzIGEgZ29vZCBnZW5lcmFsIHNvbHV0aW9uIHRoYXQgZG9lc24ndAorCSAgIG5lZWQgYSBicmFuY2ggKG9yIGEgZGl2aWRlKS4gKi8KKwl3aGlsZSAoIGhlaWdodC0tICkgeworCSAgICBEVUZGU19MT09QNCgKKwkgICAgeworCQlVaW50MzIgUGl4ZWw7CisJCXVuc2lnbmVkIHNSOworCQl1bnNpZ25lZCBzRzsKKwkJdW5zaWduZWQgc0I7CisJCXVuc2lnbmVkIGRSOworCQl1bnNpZ25lZCBkRzsKKwkJdW5zaWduZWQgZEI7CisJCXVuc2lnbmVkIHNBOworCQl1bnNpZ25lZCBkQTsKKwkJRElTRU1CTEVfUkdCQShzcmMsIHNyY2JwcCwgc3JjZm10LCBQaXhlbCwgc1IsIHNHLCBzQiwgc0EpOworCQlpZihzQSkgeworCQkgIERJU0VNQkxFX1JHQkEoZHN0LCBkc3RicHAsIGRzdGZtdCwgUGl4ZWwsIGRSLCBkRywgZEIsIGRBKTsKKwkJICBBTFBIQV9CTEVORChzUiwgc0csIHNCLCBzQSwgZFIsIGRHLCBkQik7CisJCSAgQVNTRU1CTEVfUkdCQShkc3QsIGRzdGJwcCwgZHN0Zm10LCBkUiwgZEcsIGRCLCBkQSk7CisJCX0KKwkJc3JjICs9IHNyY2JwcDsKKwkJZHN0ICs9IGRzdGJwcDsKKwkgICAgfSwKKwkgICAgd2lkdGgpOworCSAgICBzcmMgKz0gc3Jjc2tpcDsKKwkgICAgZHN0ICs9IGRzdHNraXA7CisJfQorfQorCisKK1NETF9sb2JsaXQgU0RMX0NhbGN1bGF0ZUFscGhhQmxpdChTRExfU3VyZmFjZSAqc3VyZmFjZSwgaW50IGJsaXRfaW5kZXgpCit7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKKyAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gc3VyZmFjZS0+bWFwLT5kc3QtPmZvcm1hdDsKKworICAgIGlmKHNmLT5BbWFzayA9PSAwKSB7CisJaWYoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkpIHsKKwkgICAgaWYoZGYtPkJ5dGVzUGVyUGl4ZWwgPT0gMSkKKwkJcmV0dXJuIEJsaXROdG8xU3VyZmFjZUFscGhhS2V5OworCSAgICBlbHNlCisjaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMKKwlpZiAoc2YtPkJ5dGVzUGVyUGl4ZWwgPT0gNCAmJiBkZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0ICYmCisJICAgICEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgJiYgU0RMX0hhc0FsdGlWZWMoKSkKKyAgICAgICAgICAgIHJldHVybiBCbGl0MzJ0bzMyU3VyZmFjZUFscGhhS2V5QWx0aXZlYzsKKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gQmxpdE50b05TdXJmYWNlQWxwaGFLZXk7CisJfSBlbHNlIHsKKwkgICAgLyogUGVyLXN1cmZhY2UgYWxwaGEgYmxpdHMgKi8KKwkgICAgc3dpdGNoKGRmLT5CeXRlc1BlclBpeGVsKSB7CisJICAgIGNhc2UgMToKKwkJcmV0dXJuIEJsaXROdG8xU3VyZmFjZUFscGhhOworCisJICAgIGNhc2UgMjoKKwkJaWYoc3VyZmFjZS0+bWFwLT5pZGVudGl0eSkgeworCQkgICAgaWYoZGYtPkdtYXNrID09IDB4N2UwKQorCQkgICAgeworI2lmIE1NWF9BU01CTElUCisJCWlmKFNETF9IYXNNTVgoKSkKKwkJCXJldHVybiBCbGl0NTY1dG81NjVTdXJmYWNlQWxwaGFNTVg7CisJCWVsc2UKKyNlbmRpZgorCQkJcmV0dXJuIEJsaXQ1NjV0bzU2NVN1cmZhY2VBbHBoYTsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYoZGYtPkdtYXNrID09IDB4M2UwKQorCQkgICAgeworI2lmIE1NWF9BU01CTElUCisJCWlmKFNETF9IYXNNTVgoKSkKKwkJCXJldHVybiBCbGl0NTU1dG81NTVTdXJmYWNlQWxwaGFNTVg7CisJCWVsc2UKKyNlbmRpZgorCQkJcmV0dXJuIEJsaXQ1NTV0bzU1NVN1cmZhY2VBbHBoYTsKKwkJICAgIH0KKwkJfQorCQlyZXR1cm4gQmxpdE50b05TdXJmYWNlQWxwaGE7CisKKwkgICAgY2FzZSA0OgorCQlpZihzZi0+Um1hc2sgPT0gZGYtPlJtYXNrCisJCSAgICYmIHNmLT5HbWFzayA9PSBkZi0+R21hc2sKKwkJICAgJiYgc2YtPkJtYXNrID09IGRmLT5CbWFzaworCQkgICAmJiBzZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0KQorCQl7CisjaWYgTU1YX0FTTUJMSVQKKwkJCWlmKHNmLT5Sc2hpZnQgJSA4ID09IDAKKwkJCSAgICYmIHNmLT5Hc2hpZnQgJSA4ID09IDAKKwkJCSAgICYmIHNmLT5Cc2hpZnQgJSA4ID09IDAKKwkJCSAgICYmIFNETF9IYXNNTVgoKSkKKwkJCSAgICByZXR1cm4gQmxpdFJHQnRvUkdCU3VyZmFjZUFscGhhTU1YOworI2VuZGlmCisJCQlpZigoc2YtPlJtYXNrIHwgc2YtPkdtYXNrIHwgc2YtPkJtYXNrKSA9PSAweGZmZmZmZikKKwkJCXsKKyNpZiBTRExfQUxUSVZFQ19CTElUVEVSUworCQkJCWlmKCEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkKKwkJCQkJJiYgU0RMX0hhc0FsdGlWZWMoKSkKKwkJCQkJcmV0dXJuIEJsaXRSR0J0b1JHQlN1cmZhY2VBbHBoYUFsdGl2ZWM7CisjZW5kaWYKKwkJCQlyZXR1cm4gQmxpdFJHQnRvUkdCU3VyZmFjZUFscGhhOworCQkJfQorCQl9CisjaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMKKwkJaWYoKHNmLT5CeXRlc1BlclBpeGVsID09IDQpICYmCisJCSAgICEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgJiYgU0RMX0hhc0FsdGlWZWMoKSkKKwkJCXJldHVybiBCbGl0MzJ0bzMyU3VyZmFjZUFscGhhQWx0aXZlYzsKKwkJZWxzZQorI2VuZGlmCisJCQlyZXR1cm4gQmxpdE50b05TdXJmYWNlQWxwaGE7CisKKwkgICAgY2FzZSAzOgorCSAgICBkZWZhdWx0OgorCQlyZXR1cm4gQmxpdE50b05TdXJmYWNlQWxwaGE7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKwkvKiBQZXItcGl4ZWwgYWxwaGEgYmxpdHMgKi8KKwlzd2l0Y2goZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKKwljYXNlIDE6CisJICAgIHJldHVybiBCbGl0TnRvMVBpeGVsQWxwaGE7CisKKwljYXNlIDI6CisjaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMKKwlpZihzZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0ICYmICEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgJiYKKyAgICAgICAgICAgZGYtPkdtYXNrID09IDB4N2UwICYmCisJICAgZGYtPkJtYXNrID09IDB4MWYgJiYgU0RMX0hhc0FsdGlWZWMoKSkKKyAgICAgICAgICAgIHJldHVybiBCbGl0MzJ0bzU2NVBpeGVsQWxwaGFBbHRpdmVjOworICAgICAgICBlbHNlCisjZW5kaWYKKwkgICAgaWYoc2YtPkJ5dGVzUGVyUGl4ZWwgPT0gNCAmJiBzZi0+QW1hc2sgPT0gMHhmZjAwMDAwMAorCSAgICAgICAmJiBzZi0+R21hc2sgPT0gMHhmZjAwCisJICAgICAgICYmICgoc2YtPlJtYXNrID09IDB4ZmYgJiYgZGYtPlJtYXNrID09IDB4MWYpCisJCSAgIHx8IChzZi0+Qm1hc2sgPT0gMHhmZiAmJiBkZi0+Qm1hc2sgPT0gMHgxZikpKSB7CisJCWlmKGRmLT5HbWFzayA9PSAweDdlMCkKKwkJICAgIHJldHVybiBCbGl0QVJHQnRvNTY1UGl4ZWxBbHBoYTsKKwkJZWxzZSBpZihkZi0+R21hc2sgPT0gMHgzZTApCisJCSAgICByZXR1cm4gQmxpdEFSR0J0bzU1NVBpeGVsQWxwaGE7CisJICAgIH0KKwkgICAgcmV0dXJuIEJsaXROdG9OUGl4ZWxBbHBoYTsKKworCWNhc2UgNDoKKwkgICAgaWYoc2YtPlJtYXNrID09IGRmLT5SbWFzaworCSAgICAgICAmJiBzZi0+R21hc2sgPT0gZGYtPkdtYXNrCisJICAgICAgICYmIHNmLT5CbWFzayA9PSBkZi0+Qm1hc2sKKwkgICAgICAgJiYgc2YtPkJ5dGVzUGVyUGl4ZWwgPT0gNCkKKwkgICAgeworI2lmIE1NWF9BU01CTElUCisJCWlmKHNmLT5Sc2hpZnQgJSA4ID09IDAKKwkJICAgJiYgc2YtPkdzaGlmdCAlIDggPT0gMAorCQkgICAmJiBzZi0+QnNoaWZ0ICUgOCA9PSAwCisJCSAgICYmIHNmLT5Bc2hpZnQgJSA4ID09IDAKKwkJICAgJiYgc2YtPkFsb3NzID09IDApCisJCXsKKwkJCWlmKFNETF9IYXMzRE5vdygpKQorCQkJCXJldHVybiBCbGl0UkdCdG9SR0JQaXhlbEFscGhhTU1YM0ROT1c7CisJCQlpZihTRExfSGFzTU1YKCkpCisJCQkJcmV0dXJuIEJsaXRSR0J0b1JHQlBpeGVsQWxwaGFNTVg7CisJCX0KKyNlbmRpZgorCQlpZihzZi0+QW1hc2sgPT0gMHhmZjAwMDAwMCkKKwkJeworI2lmIFNETF9BTFRJVkVDX0JMSVRURVJTCisJCQlpZighKHN1cmZhY2UtPm1hcC0+ZHN0LT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpCisJCQkJJiYgU0RMX0hhc0FsdGlWZWMoKSkKKwkJCQlyZXR1cm4gQmxpdFJHQnRvUkdCUGl4ZWxBbHBoYUFsdGl2ZWM7CisjZW5kaWYKKwkJCXJldHVybiBCbGl0UkdCdG9SR0JQaXhlbEFscGhhOworCQl9CisJICAgIH0KKyNpZiBTRExfQUxUSVZFQ19CTElUVEVSUworCSAgICBpZiAoc2YtPkFtYXNrICYmIHNmLT5CeXRlc1BlclBpeGVsID09IDQgJiYKKwkgICAgICAgICEoc3VyZmFjZS0+bWFwLT5kc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgJiYgU0RMX0hhc0FsdGlWZWMoKSkKKwkJcmV0dXJuIEJsaXQzMnRvMzJQaXhlbEFscGhhQWx0aXZlYzsKKwkgICAgZWxzZQorI2VuZGlmCisJCXJldHVybiBCbGl0TnRvTlBpeGVsQWxwaGE7CisKKwljYXNlIDM6CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIEJsaXROdG9OUGl4ZWxBbHBoYTsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9ibGl0X04uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX2JsaXRfTi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OGNlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9ibGl0X04uYwpAQCAtMCwwICsxLDI0OTIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgorI2luY2x1ZGUgIlNETF9jcHVpbmZvLmgiCisjaW5jbHVkZSAiU0RMX2JsaXQuaCIKKworLyogRnVuY3Rpb25zIHRvIGJsaXQgZnJvbSBOLWJpdCBzdXJmYWNlcyB0byBvdGhlciBzdXJmYWNlcyAqLworCisjaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMKKyNpZiBfX01XRVJLU19fCisjcHJhZ21hIGFsdGl2ZWNfbW9kZWwgb24KKyNlbmRpZgorI2lmZGVmIEhBVkVfQUxUSVZFQ19ICisjaW5jbHVkZSA8YWx0aXZlYy5oPgorI2VuZGlmCisjZGVmaW5lIGFzc2VydChYKQorI2lmZGVmIF9fTUFDT1NYX18KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CitzdGF0aWMgc2l6ZV90IEdldEwzQ2FjaGVTaXplKCB2b2lkICkKK3sKKyAgICBjb25zdCBjaGFyIGtleVtdID0gImh3LmwzY2FjaGVzaXplIjsKKyAgICB1X2ludDY0X3QgcmVzdWx0ID0gMDsKKyAgICBzaXplX3QgdHlwZVNpemUgPSBzaXplb2YoIHJlc3VsdCApOworCisKKyAgICBpbnQgZXJyID0gc3lzY3RsYnluYW1lKCBrZXksICZyZXN1bHQsICZ0eXBlU2l6ZSwgTlVMTCwgMCApOworICAgIGlmKCAwICE9IGVyciApIHJldHVybiAwOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbHNlCitzdGF0aWMgc2l6ZV90IEdldEwzQ2FjaGVTaXplKCB2b2lkICkKK3sKKyAgICAvKiBYWFg6IEp1c3QgZ3Vlc3MgRzQgKi8KKyAgICByZXR1cm4gMjA5NzE1MjsKK30KKyNlbmRpZiAvKiBfX01BQ09TWF9fICovCisKKyNpZiAoZGVmaW5lZChfX01BQ09TWF9fKSAmJiAoX19HTlVDX18gPCA0KSkKKyAgICAjZGVmaW5lIFZFQ1VJTlQ4X0xJVEVSQUwoYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCkgXAorICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpICggYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCApCisgICAgI2RlZmluZSBWRUNVSU5UMTZfTElURVJBTChhLGIsYyxkLGUsZixnLGgpIFwKKyAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgKCBhLGIsYyxkLGUsZixnLGggKQorI2Vsc2UKKyAgICAjZGVmaW5lIFZFQ1VJTlQ4X0xJVEVSQUwoYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCkgXAorICAgICAgICAodmVjdG9yIHVuc2lnbmVkIGNoYXIpIHsgYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCB9CisgICAgI2RlZmluZSBWRUNVSU5UMTZfTElURVJBTChhLGIsYyxkLGUsZixnLGgpIFwKKyAgICAgICAgKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkgeyBhLGIsYyxkLGUsZixnLGggfQorI2VuZGlmCisKKyNkZWZpbmUgVU5BTElHTkVEX1BUUih4KSAoKChzaXplX3QpIHgpICYgMHgwMDAwMDAwRikKKyNkZWZpbmUgVlNXSVpaTEUzMihhLGIsYyxkKSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIDB4MDArYSwgMHgwMCtiLCAweDAwK2MsIDB4MDArZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCthLCAweDA0K2IsIDB4MDQrYywgMHgwNCtkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4K2EsIDB4MDgrYiwgMHgwOCtjLCAweDA4K2QsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMrYSwgMHgwQytiLCAweDBDK2MsIDB4MEMrZCApCisKKyNkZWZpbmUgTUFLRTg4ODgoZHN0Zm10LCByLCBnLCBiLCBhKSAgXAorICAgICggKChyPDxkc3RmbXQtPlJzaGlmdCkmZHN0Zm10LT5SbWFzaykgfCBcCisgICAgICAoKGc8PGRzdGZtdC0+R3NoaWZ0KSZkc3RmbXQtPkdtYXNrKSB8IFwKKyAgICAgICgoYjw8ZHN0Zm10LT5Cc2hpZnQpJmRzdGZtdC0+Qm1hc2spIHwgXAorICAgICAgKChhPDxkc3RmbXQtPkFzaGlmdCkmZHN0Zm10LT5BbWFzaykgKQorCisvKgorICogRGF0YSBTdHJlYW0gVG91Y2guLi5BbHRpdmVjIGNhY2hlIHByZWZldGNoaW5nLgorICoKKyAqICBEb24ndCB1c2UgdGhpcyBvbiBhIEc1Li4uaG93ZXZlciwgdGhlIHNwZWVkIGJvb3N0IGlzIHZlcnkgc2lnbmlmaWNhbnQKKyAqICAgb24gYSBHNC4KKyAqLworI2RlZmluZSBEU1RfQ0hBTl9TUkMgMQorI2RlZmluZSBEU1RfQ0hBTl9ERVNUIDIKKworLyogbWFjcm8gdG8gc2V0IERTVCBjb250cm9sIHdvcmQgdmFsdWUuLi4gKi8KKyNkZWZpbmUgRFNUX0NUUkwoc2l6ZSwgY291bnQsIHN0cmlkZSkgXAorICAgICgoKHNpemUpIDw8IDI0KSB8ICgoY291bnQpIDw8IDE2KSB8IChzdHJpZGUpKQorCisjZGVmaW5lIFZFQ19BTElHTkVSKHNyYykgKChVTkFMSUdORURfUFRSKHNyYykpIFwKKyAgICA/IHZlY19sdnNsKDAsIHNyYykgXAorICAgIDogdmVjX2FkZCh2ZWNfbHZzbCg4LCBzcmMpLCB2ZWNfc3BsYXRfdTgoOCkpKQorCisvKiBDYWxjdWxhdGUgdGhlIHBlcm11dGUgdmVjdG9yIHVzZWQgZm9yIDMyLT4zMiBzd2l6emxpbmcgKi8KK3N0YXRpYyB2ZWN0b3IgdW5zaWduZWQgY2hhciBjYWxjX3N3aXp6bGUzMihjb25zdCBTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCkKK3sKKyAgICAvKgorICAgICogV2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgYml0cyB0aGF0IGFyZW4ndCB1c2VkIGJ5IG90aGVyCisgICAgICogIGNvbG9ycyBpcyBhbHBoYSwgYW5kIGl0J3Mgb25lIGNvbXBsZXRlIGJ5dGUsIHNpbmNlIHNvbWUgZm9ybWF0cworICAgICAqICBsZWF2ZSBhbHBoYSB3aXRoIGEgemVybyBtYXNrLCBidXQgd2Ugc2hvdWxkIHN0aWxsIHN3aXp6bGUgdGhlIGJpdHMuCisgICAgICovCisgICAgLyogQVJHQiAqLworICAgIGNvbnN0IHN0YXRpYyBzdHJ1Y3QgU0RMX1BpeGVsRm9ybWF0IGRlZmF1bHRfcGl4ZWxfZm9ybWF0ID0geworICAgICAgICBOVUxMLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAxNiwgOCwgMCwgMjQsCisgICAgICAgIDB4MDBGRjAwMDAsIDB4MDAwMEZGMDAsIDB4MDAwMDAwRkYsIDB4RkYwMDAwMDAsCisgICAgICAgIDAsIDB9OworICAgIGlmICghc3JjZm10KSB7CisgICAgICAgIHNyY2ZtdCA9ICZkZWZhdWx0X3BpeGVsX2Zvcm1hdDsKKyAgICB9CisgICAgaWYgKCFkc3RmbXQpIHsKKyAgICAgICAgZHN0Zm10ID0gJmRlZmF1bHRfcGl4ZWxfZm9ybWF0OworICAgIH0KKyAgICBjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciBwbHVzID0gVkVDVUlOVDhfTElURVJBTCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQywgMHgwQywgMHgwQywgMHgwQyApOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzd2l6OworICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgc3JjdmVjOworI2RlZmluZSBSRVNISUZUKFgpICgzIC0gKChYKSA+PiAzKSkKKyAgICBVaW50MzIgcm1hc2sgPSBSRVNISUZUKHNyY2ZtdC0+UnNoaWZ0KSA8PCAoZHN0Zm10LT5Sc2hpZnQpOworICAgIFVpbnQzMiBnbWFzayA9IFJFU0hJRlQoc3JjZm10LT5Hc2hpZnQpIDw8IChkc3RmbXQtPkdzaGlmdCk7CisgICAgVWludDMyIGJtYXNrID0gUkVTSElGVChzcmNmbXQtPkJzaGlmdCkgPDwgKGRzdGZtdC0+QnNoaWZ0KTsKKyAgICBVaW50MzIgYW1hc2s7CisgICAgLyogVXNlIHplcm8gZm9yIGFscGhhIGlmIGVpdGhlciBzdXJmYWNlIGRvZXNuJ3QgaGF2ZSBhbHBoYSAqLworICAgIGlmIChkc3RmbXQtPkFtYXNrKSB7CisgICAgICAgIGFtYXNrID0gKChzcmNmbXQtPkFtYXNrKSA/IFJFU0hJRlQoc3JjZm10LT5Bc2hpZnQpIDogMHgxMCkgPDwgKGRzdGZtdC0+QXNoaWZ0KTsKKyAgICB9IGVsc2UgeyAgICAKKyAgICAgICAgYW1hc2sgPSAweDEwMTAxMDEwICYgKChkc3RmbXQtPlJtYXNrIHwgZHN0Zm10LT5HbWFzayB8IGRzdGZtdC0+Qm1hc2spIF4gMHhGRkZGRkZGRik7CisgICAgfSAgICAgICAgICAgCisjdW5kZWYgUkVTSElGVCAgCisgICAgKCh1bnNpZ25lZCBpbnQgKikoY2hhciopJnNyY3ZlYylbMF0gPSAocm1hc2sgfCBnbWFzayB8IGJtYXNrIHwgYW1hc2spOworICAgIHZzd2l6ID0gdmVjX2FkZChwbHVzLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3NwbGF0KHNyY3ZlYywgMCkpOworICAgIHJldHVybih2c3dpeik7Cit9CisKK3N0YXRpYyB2b2lkIEJsaXRfUkdCODg4X1JHQjU2NShTRExfQmxpdEluZm8gKmluZm8pOworc3RhdGljIHZvaWQgQmxpdF9SR0I4ODhfUkdCNTY1QWx0aXZlYyhTRExfQmxpdEluZm8gKmluZm8pIHsKKyAgICBpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisgICAgVWludDggKnNyYyA9IChVaW50OCAqKSBpbmZvLT5zX3BpeGVsczsKKyAgICBpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKyAgICBVaW50OCAqZHN0ID0gKFVpbnQ4ICopIGluZm8tPmRfcGl4ZWxzOworICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworICAgIFNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYSA9IHZlY19zcGxhdF91OCgwKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKHNyY2ZtdCwgTlVMTCk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmdtZXJnZSA9IFZFQ1VJTlQ4X0xJVEVSQUwoCisgICAgICAgIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDYsCisgICAgICAgIDB4MDAsIDB4MGEsIDB4MDAsIDB4MGUsCisgICAgICAgIDB4MDAsIDB4MTIsIDB4MDAsIDB4MTYsCisgICAgICAgIDB4MDAsIDB4MWEsIDB4MDAsIDB4MWUpOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2MSA9IHZlY19zcGxhdF91MTYoMSk7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHYzID0gdmVjX3NwbGF0X3UxNigzKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjNmID0gVkVDVUlOVDE2X0xJVEVSQUwoCisgICAgICAgIDB4MDAzZiwgMHgwMDNmLCAweDAwM2YsIDB4MDAzZiwKKyAgICAgICAgMHgwMDNmLCAweDAwM2YsIDB4MDAzZiwgMHgwMDNmKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdmZjID0gVkVDVUlOVDE2X0xJVEVSQUwoCisgICAgICAgIDB4MDBmYywgMHgwMGZjLCAweDAwZmMsIDB4MDBmYywKKyAgICAgICAgMHgwMGZjLCAweDAwZmMsIDB4MDBmYywgMHgwMGZjKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdmY4MDAgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19zcGxhdF91OCgtNyk7CisgICAgdmY4MDAgPSB2ZWNfc2wodmY4MDAsIHZlY19zcGxhdF91MTYoOCkpOworCisgICAgd2hpbGUgKGhlaWdodC0tKSB7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2b3ZlcmZsb3c7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzcmM7CisKKyAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKyAgICAgICAgaW50IGV4dHJhd2lkdGg7CisKKyAgICAgICAgLyogZG8gc2NhbGFyIHVudGlsIHdlIGNhbiBhbGlnbi4uLiAqLworI2RlZmluZSBPTkVfUElYRUxfQkxFTkQoY29uZGl0aW9uLCB3aWR0aHZhcikgXAorICAgICAgICB3aGlsZSAoY29uZGl0aW9uKSB7IFwKKyAgICAgICAgICAgIFVpbnQzMiBQaXhlbDsgXAorICAgICAgICAgICAgdW5zaWduZWQgc1IsIHNHLCBzQiwgc0E7IFwKKyAgICAgICAgICAgIERJU0VNQkxFX1JHQkEoKFVpbnQ4ICopc3JjLCA0LCBzcmNmbXQsIFBpeGVsLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNSLCBzRywgc0IsIHNBKTsgXAorICAgICAgICAgICAgKihVaW50MTYgKikoZHN0KSA9ICgoKHNSIDw8IDgpICYgMHgwMDAwRjgwMCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc0cgPDwgMykgJiAweDAwMDAwN0UwKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzQiA+PiAzKSAmIDB4MDAwMDAwMUYpKTsgXAorICAgICAgICAgICAgZHN0ICs9IDI7IFwKKyAgICAgICAgICAgIHNyYyArPSA0OyBcCisgICAgICAgICAgICB3aWR0aHZhci0tOyBcCisgICAgICAgIH0KKworICAgICAgICBPTkVfUElYRUxfQkxFTkQoKChVTkFMSUdORURfUFRSKGRzdCkpICYmICh3aWR0aCkpLCB3aWR0aCk7CisKKyAgICAgICAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgaGVyZSdzIHRoZSB2ZWN0b3IgcGFydCEgKi8KKyAgICAgICAgZXh0cmF3aWR0aCA9ICh3aWR0aCAlIDgpOyAgLyogdHJhaWxpbmcgdW5hbGlnbmVkIHN0b3JlcyAqLworICAgICAgICB3aWR0aCAtPSBleHRyYXdpZHRoOworICAgICAgICB2c3JjID0gdmVjX2xkKDAsIHNyYyk7CisgICAgICAgIHZhbGlnbmVyID0gVkVDX0FMSUdORVIoc3JjKTsKKworICAgICAgICB3aGlsZSAod2lkdGgpIHsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2cGl4ZWwsIHZycGl4ZWwsIHZncGl4ZWwsIHZicGl4ZWw7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZzcmMxLCB2c3JjMjsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkc3Q7CisKKyAgICAgICAgICAgIHZvdmVyZmxvdyA9IHZlY19sZCgxNSwgc3JjKTsKKyAgICAgICAgICAgIHZzcmMgPSB2ZWNfcGVybSh2c3JjLCB2b3ZlcmZsb3csIHZhbGlnbmVyKTsKKyAgICAgICAgICAgIHZzcmMxID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpdmVjX3Blcm0odnNyYywgdmFscGhhLCB2cGVybXV0ZSk7CisgICAgICAgICAgICBzcmMgKz0gMTY7CisgICAgICAgICAgICB2c3JjID0gdm92ZXJmbG93OworICAgICAgICAgICAgdm92ZXJmbG93ID0gdmVjX2xkKDE1LCBzcmMpOworICAgICAgICAgICAgdnNyYyA9IHZlY19wZXJtKHZzcmMsIHZvdmVyZmxvdywgdmFsaWduZXIpOworICAgICAgICAgICAgdnNyYzIgPSAodmVjdG9yIHVuc2lnbmVkIGludCl2ZWNfcGVybSh2c3JjLCB2YWxwaGEsIHZwZXJtdXRlKTsKKyAgICAgICAgICAgIC8qIDE1NTUgKi8KKyAgICAgICAgICAgIHZwaXhlbCA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX3BhY2tweCh2c3JjMSwgdnNyYzIpOworICAgICAgICAgICAgdmdwaXhlbCA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX3Blcm0odnNyYzEsIHZzcmMyLCB2Z21lcmdlKTsKKyAgICAgICAgICAgIHZncGl4ZWwgPSB2ZWNfYW5kKHZncGl4ZWwsIHZmYyk7CisgICAgICAgICAgICB2Z3BpeGVsID0gdmVjX3NsKHZncGl4ZWwsIHYzKTsKKyAgICAgICAgICAgIHZycGl4ZWwgPSB2ZWNfc2wodnBpeGVsLCB2MSk7CisgICAgICAgICAgICB2cnBpeGVsID0gdmVjX2FuZCh2cnBpeGVsLCB2ZjgwMCk7CisgICAgICAgICAgICB2YnBpeGVsID0gdmVjX2FuZCh2cGl4ZWwsIHYzZik7CisgICAgICAgICAgICB2ZHN0ID0gdmVjX29yKCh2ZWN0b3IgdW5zaWduZWQgY2hhcil2cnBpeGVsLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmdwaXhlbCk7CisgICAgICAgICAgICAvKiA1NjUgKi8KKyAgICAgICAgICAgIHZkc3QgPSB2ZWNfb3IodmRzdCwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZicGl4ZWwpOworICAgICAgICAgICAgdmVjX3N0KHZkc3QsIDAsIGRzdCk7CisKKyAgICAgICAgICAgIHdpZHRoIC09IDg7CisgICAgICAgICAgICBzcmMgKz0gMTY7CisgICAgICAgICAgICBkc3QgKz0gMTY7CisgICAgICAgICAgICB2c3JjID0gdm92ZXJmbG93OworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KHdpZHRoID09IDApOworCisgICAgICAgIC8qIGRvIHNjYWxhciB1bnRpbCB3ZSBjYW4gYWxpZ24uLi4gKi8KKyAgICAgICAgT05FX1BJWEVMX0JMRU5EKChleHRyYXdpZHRoKSwgZXh0cmF3aWR0aCk7CisjdW5kZWYgT05FX1BJWEVMX0JMRU5ECisKKyAgICAgICAgc3JjICs9IHNyY3NraXA7ICAvKiBtb3ZlIHRvIG5leHQgcm93LCBhY2NvdW50aW5nIGZvciBwaXRjaC4gKi8KKyAgICAgICAgZHN0ICs9IGRzdHNraXA7CisgICAgfQorCisKK30KKworc3RhdGljIHZvaWQgQmxpdF9SR0I1NjVfMzJBbHRpdmVjKFNETF9CbGl0SW5mbyAqaW5mbykgeworICAgIGludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKyAgICBVaW50OCAqc3JjID0gKFVpbnQ4ICopIGluZm8tPnNfcGl4ZWxzOworICAgIGludCBzcmNza2lwID0gaW5mby0+c19za2lwOworICAgIFVpbnQ4ICpkc3QgPSAoVWludDggKikgaW5mby0+ZF9waXhlbHM7CisgICAgaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisgICAgdW5zaWduZWQgYWxwaGE7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZwZXJtdXRlOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2ZjgwMDsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHY4ID0gdmVjX3NwbGF0X3UzMig4KTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHYxNiA9IHZlY19hZGQodjgsIHY4KTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjIgPSB2ZWNfc3BsYXRfdTE2KDIpOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2MyA9IHZlY19zcGxhdF91MTYoMyk7CisgICAgLyogCisgICAgICAgIDB4MTAgLSAweDFmIGlzIHRoZSBhbHBoYQorICAgICAgICAweDAwIC0gMHgwZSBldmVucyBhcmUgdGhlIHJlZAorICAgICAgICAweDAxIC0gMHgwZiBvZGRzIGFyZSB6ZXJvCisgICAgKi8KKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cmVkYWxwaGExID0gVkVDVUlOVDhfTElURVJBTCgKKyAgICAgICAgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMSwKKyAgICAgICAgMHgxMCwgMHgwMiwgMHgwMSwgMHgwMSwKKyAgICAgICAgMHgxMCwgMHgwNCwgMHgwMSwgMHgwMSwKKyAgICAgICAgMHgxMCwgMHgwNiwgMHgwMSwgMHgwMQorICAgICk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnJlZGFscGhhMiA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgKAorICAgICAgICB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgaW50KXZyZWRhbHBoYTEsIHZlY19zbCh2OCwgdjE2KSkKKyAgICApOworICAgIC8qCisgICAgICAgIDB4MDAgLSAweDBmIGlzIEFSeHggQVJ4eCBBUnh4IEFSeHgKKyAgICAgICAgMHgxMSAtIDB4MGYgb2RkcyBhcmUgYmx1ZQorICAgICovCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJsdWUxID0gVkVDVUlOVDhfTElURVJBTCgKKyAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgxMSwKKyAgICAgICAgMHgwNCwgMHgwNSwgMHgwNiwgMHgxMywKKyAgICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgxNSwKKyAgICAgICAgMHgwYywgMHgwZCwgMHgwZSwgMHgxNworICAgICk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmJsdWUyID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgKKyAgICAgICAgdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIGludCl2Ymx1ZTEsIHY4KQorICAgICk7CisgICAgLyoKKyAgICAgICAgMHgwMCAtIDB4MGYgaXMgQVJ4QiBBUnhCIEFSeEIgQVJ4QgorICAgICAgICAweDEwIC0gMHgwZSBldmVucyBhcmUgZ3JlZW4KKyAgICAqLworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZncmVlbjEgPSBWRUNVSU5UOF9MSVRFUkFMKAorICAgICAgICAweDAwLCAweDAxLCAweDEwLCAweDAzLAorICAgICAgICAweDA0LCAweDA1LCAweDEyLCAweDA3LAorICAgICAgICAweDA4LCAweDA5LCAweDE0LCAweDBiLAorICAgICAgICAweDBjLCAweDBkLCAweDE2LCAweDBmCisgICAgKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Z3JlZW4yID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgKKyAgICAgICAgdmVjX2FkZCgodmVjdG9yIHVuc2lnbmVkIGludCl2Z3JlZW4xLCB2ZWNfc2wodjgsIHY4KSkKKyAgICApOworICAgIAorCisgICAgYXNzZXJ0KHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbCA9PSAyKTsKKyAgICBhc3NlcnQoZHN0Zm10LT5CeXRlc1BlclBpeGVsID09IDQpOworCisgICAgdmY4MDAgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZlY19zcGxhdF91OCgtNyk7CisgICAgdmY4MDAgPSB2ZWNfc2wodmY4MDAsIHZlY19zcGxhdF91MTYoOCkpOworCisgICAgaWYgKGRzdGZtdC0+QW1hc2sgJiYgc3JjZm10LT5hbHBoYSkgeworICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikmdmFscGhhKVswXSA9IGFscGhhID0gc3JjZm10LT5hbHBoYTsKKyAgICAgICAgdmFscGhhID0gdmVjX3NwbGF0KHZhbHBoYSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWxwaGEgPSAwOworICAgICAgICB2YWxwaGEgPSB2ZWNfc3BsYXRfdTgoMCk7CisgICAgfQorCisgICAgdnBlcm11dGUgPSBjYWxjX3N3aXp6bGUzMihOVUxMLCBkc3RmbXQpOworICAgIHdoaWxlIChoZWlnaHQtLSkgeworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxpZ25lcjsKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdm92ZXJmbG93OworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2c3JjOworCisgICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisgICAgICAgIGludCBleHRyYXdpZHRoOworCisgICAgICAgIC8qIGRvIHNjYWxhciB1bnRpbCB3ZSBjYW4gYWxpZ24uLi4gKi8KKyNkZWZpbmUgT05FX1BJWEVMX0JMRU5EKGNvbmRpdGlvbiwgd2lkdGh2YXIpIFwKKyAgICAgICAgd2hpbGUgKGNvbmRpdGlvbikgeyBcCisgICAgICAgICAgICB1bnNpZ25lZCBzUiwgc0csIHNCOyBcCisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBQaXhlbCA9ICooKHVuc2lnbmVkIHNob3J0ICopc3JjKTsgXAorICAgICAgICAgICAgc1IgPSAoUGl4ZWwgPj4gOCkgJiAweGY4OyBcCisgICAgICAgICAgICBzRyA9IChQaXhlbCA+PiAzKSAmIDB4ZmM7IFwKKyAgICAgICAgICAgIHNCID0gKFBpeGVsIDw8IDMpICYgMHhmODsgXAorICAgICAgICAgICAgQVNTRU1CTEVfUkdCQShkc3QsIDQsIGRzdGZtdCwgc1IsIHNHLCBzQiwgYWxwaGEpOyBcCisgICAgICAgICAgICBzcmMgKz0gMjsgXAorICAgICAgICAgICAgZHN0ICs9IDQ7IFwKKyAgICAgICAgICAgIHdpZHRodmFyLS07IFwKKyAgICAgICAgfQorICAgICAgICBPTkVfUElYRUxfQkxFTkQoKChVTkFMSUdORURfUFRSKGRzdCkpICYmICh3aWR0aCkpLCB3aWR0aCk7CisKKyAgICAgICAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgaGVyZSdzIHRoZSB2ZWN0b3IgcGFydCEgKi8KKyAgICAgICAgZXh0cmF3aWR0aCA9ICh3aWR0aCAlIDgpOyAgLyogdHJhaWxpbmcgdW5hbGlnbmVkIHN0b3JlcyAqLworICAgICAgICB3aWR0aCAtPSBleHRyYXdpZHRoOworICAgICAgICB2c3JjID0gdmVjX2xkKDAsIHNyYyk7CisgICAgICAgIHZhbGlnbmVyID0gVkVDX0FMSUdORVIoc3JjKTsKKworICAgICAgICB3aGlsZSAod2lkdGgpIHsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2UiwgdkcsIHZCOworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmRzdDEsIHZkc3QyOworCisgICAgICAgICAgICB2b3ZlcmZsb3cgPSB2ZWNfbGQoMTUsIHNyYyk7CisgICAgICAgICAgICB2c3JjID0gdmVjX3Blcm0odnNyYywgdm92ZXJmbG93LCB2YWxpZ25lcik7CisKKyAgICAgICAgICAgIHZSID0gdmVjX2FuZCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZzcmMsIHZmODAwKTsKKyAgICAgICAgICAgIHZCID0gdmVjX3NsKCh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdnNyYywgdjMpOworICAgICAgICAgICAgdkcgPSB2ZWNfc2wodkIsIHYyKTsKKworICAgICAgICAgICAgdmRzdDEgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZSLCB2YWxwaGEsIHZyZWRhbHBoYTEpOworICAgICAgICAgICAgdmRzdDEgPSB2ZWNfcGVybSh2ZHN0MSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZCLCB2Ymx1ZTEpOworICAgICAgICAgICAgdmRzdDEgPSB2ZWNfcGVybSh2ZHN0MSwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZHLCB2Z3JlZW4xKTsKKyAgICAgICAgICAgIHZkc3QxID0gdmVjX3Blcm0odmRzdDEsIHZhbHBoYSwgdnBlcm11dGUpOworICAgICAgICAgICAgdmVjX3N0KHZkc3QxLCAwLCBkc3QpOworCisgICAgICAgICAgICB2ZHN0MiA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfcGVybSgodmVjdG9yIHVuc2lnbmVkIGNoYXIpdlIsIHZhbHBoYSwgdnJlZGFscGhhMik7CisgICAgICAgICAgICB2ZHN0MiA9IHZlY19wZXJtKHZkc3QyLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdkIsIHZibHVlMik7CisgICAgICAgICAgICB2ZHN0MiA9IHZlY19wZXJtKHZkc3QyLCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdkcsIHZncmVlbjIpOworICAgICAgICAgICAgdmRzdDIgPSB2ZWNfcGVybSh2ZHN0MiwgdmFscGhhLCB2cGVybXV0ZSk7CisgICAgICAgICAgICB2ZWNfc3QodmRzdDIsIDE2LCBkc3QpOworICAgICAgICAgICAgCisgICAgICAgICAgICB3aWR0aCAtPSA4OworICAgICAgICAgICAgZHN0ICs9IDMyOworICAgICAgICAgICAgc3JjICs9IDE2OworICAgICAgICAgICAgdnNyYyA9IHZvdmVyZmxvdzsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCh3aWR0aCA9PSAwKTsKKworCisgICAgICAgIC8qIGRvIHNjYWxhciB1bnRpbCB3ZSBjYW4gYWxpZ24uLi4gKi8KKyAgICAgICAgT05FX1BJWEVMX0JMRU5EKChleHRyYXdpZHRoKSwgZXh0cmF3aWR0aCk7CisjdW5kZWYgT05FX1BJWEVMX0JMRU5ECisKKyAgICAgICAgc3JjICs9IHNyY3NraXA7ICAvKiBtb3ZlIHRvIG5leHQgcm93LCBhY2NvdW50aW5nIGZvciBwaXRjaC4gKi8KKyAgICAgICAgZHN0ICs9IGRzdHNraXA7CisgICAgfQorCit9CisKKworc3RhdGljIHZvaWQgQmxpdF9SR0I1NTVfMzJBbHRpdmVjKFNETF9CbGl0SW5mbyAqaW5mbykgeworICAgIGludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKyAgICBVaW50OCAqc3JjID0gKFVpbnQ4ICopIGluZm8tPnNfcGl4ZWxzOworICAgIGludCBzcmNza2lwID0gaW5mby0+c19za2lwOworICAgIFVpbnQ4ICpkc3QgPSAoVWludDggKikgaW5mby0+ZF9waXhlbHM7CisgICAgaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisgICAgdW5zaWduZWQgYWxwaGE7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFscGhhOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZwZXJtdXRlOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2ZjgwMDsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHY4ID0gdmVjX3NwbGF0X3UzMig4KTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHYxNiA9IHZlY19hZGQodjgsIHY4KTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjEgPSB2ZWNfc3BsYXRfdTE2KDEpOworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2MyA9IHZlY19zcGxhdF91MTYoMyk7CisgICAgLyogCisgICAgICAgIDB4MTAgLSAweDFmIGlzIHRoZSBhbHBoYQorICAgICAgICAweDAwIC0gMHgwZSBldmVucyBhcmUgdGhlIHJlZAorICAgICAgICAweDAxIC0gMHgwZiBvZGRzIGFyZSB6ZXJvCisgICAgKi8KKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cmVkYWxwaGExID0gVkVDVUlOVDhfTElURVJBTCgKKyAgICAgICAgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMSwKKyAgICAgICAgMHgxMCwgMHgwMiwgMHgwMSwgMHgwMSwKKyAgICAgICAgMHgxMCwgMHgwNCwgMHgwMSwgMHgwMSwKKyAgICAgICAgMHgxMCwgMHgwNiwgMHgwMSwgMHgwMQorICAgICk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnJlZGFscGhhMiA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoCisgICAgICAgIHZlY19hZGQoKHZlY3RvciB1bnNpZ25lZCBpbnQpdnJlZGFscGhhMSwgdmVjX3NsKHY4LCB2MTYpKQorICAgICk7CisgICAgLyoKKyAgICAgICAgMHgwMCAtIDB4MGYgaXMgQVJ4eCBBUnh4IEFSeHggQVJ4eAorICAgICAgICAweDExIC0gMHgwZiBvZGRzIGFyZSBibHVlCisgICAgKi8KKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Ymx1ZTEgPSBWRUNVSU5UOF9MSVRFUkFMKAorICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDExLAorICAgICAgICAweDA0LCAweDA1LCAweDA2LCAweDEzLAorICAgICAgICAweDA4LCAweDA5LCAweDBhLCAweDE1LAorICAgICAgICAweDBjLCAweDBkLCAweDBlLCAweDE3CisgICAgKTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2Ymx1ZTIgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKAorICAgICAgICB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgaW50KXZibHVlMSwgdjgpCisgICAgKTsKKyAgICAvKgorICAgICAgICAweDAwIC0gMHgwZiBpcyBBUnhCIEFSeEIgQVJ4QiBBUnhCCisgICAgICAgIDB4MTAgLSAweDBlIGV2ZW5zIGFyZSBncmVlbgorICAgICovCisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmdyZWVuMSA9IFZFQ1VJTlQ4X0xJVEVSQUwoCisgICAgICAgIDB4MDAsIDB4MDEsIDB4MTAsIDB4MDMsCisgICAgICAgIDB4MDQsIDB4MDUsIDB4MTIsIDB4MDcsCisgICAgICAgIDB4MDgsIDB4MDksIDB4MTQsIDB4MGIsCisgICAgICAgIDB4MGMsIDB4MGQsIDB4MTYsIDB4MGYKKyAgICApOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZncmVlbjIgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKAorICAgICAgICB2ZWNfYWRkKCh2ZWN0b3IgdW5zaWduZWQgaW50KXZncmVlbjEsIHZlY19zbCh2OCwgdjgpKQorICAgICk7CisgICAgCisKKyAgICBhc3NlcnQoc3JjZm10LT5CeXRlc1BlclBpeGVsID09IDIpOworICAgIGFzc2VydChkc3RmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gNCk7CisKKyAgICB2ZjgwMCA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX3NwbGF0X3U4KC03KTsKKyAgICB2ZjgwMCA9IHZlY19zbCh2ZjgwMCwgdmVjX3NwbGF0X3UxNig4KSk7CisKKyAgICBpZiAoZHN0Zm10LT5BbWFzayAmJiBzcmNmbXQtPmFscGhhKSB7CisgICAgICAgICgodW5zaWduZWQgY2hhciAqKSZ2YWxwaGEpWzBdID0gYWxwaGEgPSBzcmNmbXQtPmFscGhhOworICAgICAgICB2YWxwaGEgPSB2ZWNfc3BsYXQodmFscGhhLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhbHBoYSA9IDA7CisgICAgICAgIHZhbHBoYSA9IHZlY19zcGxhdF91OCgwKTsKKyAgICB9CisKKyAgICB2cGVybXV0ZSA9IGNhbGNfc3dpenpsZTMyKE5VTEwsIGRzdGZtdCk7CisgICAgd2hpbGUgKGhlaWdodC0tKSB7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2b3ZlcmZsb3c7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzcmM7CisKKyAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKyAgICAgICAgaW50IGV4dHJhd2lkdGg7CisKKyAgICAgICAgLyogZG8gc2NhbGFyIHVudGlsIHdlIGNhbiBhbGlnbi4uLiAqLworI2RlZmluZSBPTkVfUElYRUxfQkxFTkQoY29uZGl0aW9uLCB3aWR0aHZhcikgXAorICAgICAgICB3aGlsZSAoY29uZGl0aW9uKSB7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIHNSLCBzRywgc0I7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IFBpeGVsID0gKigodW5zaWduZWQgc2hvcnQgKilzcmMpOyBcCisgICAgICAgICAgICBzUiA9IChQaXhlbCA+PiA3KSAmIDB4Zjg7IFwKKyAgICAgICAgICAgIHNHID0gKFBpeGVsID4+IDIpICYgMHhmODsgXAorICAgICAgICAgICAgc0IgPSAoUGl4ZWwgPDwgMykgJiAweGY4OyBcCisgICAgICAgICAgICBBU1NFTUJMRV9SR0JBKGRzdCwgNCwgZHN0Zm10LCBzUiwgc0csIHNCLCBhbHBoYSk7IFwKKyAgICAgICAgICAgIHNyYyArPSAyOyBcCisgICAgICAgICAgICBkc3QgKz0gNDsgXAorICAgICAgICAgICAgd2lkdGh2YXItLTsgXAorICAgICAgICB9CisgICAgICAgIE9ORV9QSVhFTF9CTEVORCgoKFVOQUxJR05FRF9QVFIoZHN0KSkgJiYgKHdpZHRoKSksIHdpZHRoKTsKKworICAgICAgICAvKiBBZnRlciBhbGwgdGhhdCB3b3JrLCBoZXJlJ3MgdGhlIHZlY3RvciBwYXJ0ISAqLworICAgICAgICBleHRyYXdpZHRoID0gKHdpZHRoICUgOCk7ICAvKiB0cmFpbGluZyB1bmFsaWduZWQgc3RvcmVzICovCisgICAgICAgIHdpZHRoIC09IGV4dHJhd2lkdGg7CisgICAgICAgIHZzcmMgPSB2ZWNfbGQoMCwgc3JjKTsKKyAgICAgICAgdmFsaWduZXIgPSBWRUNfQUxJR05FUihzcmMpOworCisgICAgICAgIHdoaWxlICh3aWR0aCkgeworICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHZSLCB2RywgdkI7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZHN0MSwgdmRzdDI7CisKKyAgICAgICAgICAgIHZvdmVyZmxvdyA9IHZlY19sZCgxNSwgc3JjKTsKKyAgICAgICAgICAgIHZzcmMgPSB2ZWNfcGVybSh2c3JjLCB2b3ZlcmZsb3csIHZhbGlnbmVyKTsKKworICAgICAgICAgICAgdlIgPSB2ZWNfYW5kKHZlY19zbCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZzcmMsdjEpLCB2ZjgwMCk7CisgICAgICAgICAgICB2QiA9IHZlY19zbCgodmVjdG9yIHVuc2lnbmVkIHNob3J0KXZzcmMsIHYzKTsKKyAgICAgICAgICAgIHZHID0gdmVjX3NsKHZCLCB2Myk7CisKKyAgICAgICAgICAgIHZkc3QxID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19wZXJtKCh2ZWN0b3IgdW5zaWduZWQgY2hhcil2UiwgdmFscGhhLCB2cmVkYWxwaGExKTsKKyAgICAgICAgICAgIHZkc3QxID0gdmVjX3Blcm0odmRzdDEsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2QiwgdmJsdWUxKTsKKyAgICAgICAgICAgIHZkc3QxID0gdmVjX3Blcm0odmRzdDEsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2RywgdmdyZWVuMSk7CisgICAgICAgICAgICB2ZHN0MSA9IHZlY19wZXJtKHZkc3QxLCB2YWxwaGEsIHZwZXJtdXRlKTsKKyAgICAgICAgICAgIHZlY19zdCh2ZHN0MSwgMCwgZHN0KTsKKworICAgICAgICAgICAgdmRzdDIgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3Blcm0oKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZSLCB2YWxwaGEsIHZyZWRhbHBoYTIpOworICAgICAgICAgICAgdmRzdDIgPSB2ZWNfcGVybSh2ZHN0MiwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZCLCB2Ymx1ZTIpOworICAgICAgICAgICAgdmRzdDIgPSB2ZWNfcGVybSh2ZHN0MiwgKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZHLCB2Z3JlZW4yKTsKKyAgICAgICAgICAgIHZkc3QyID0gdmVjX3Blcm0odmRzdDIsIHZhbHBoYSwgdnBlcm11dGUpOworICAgICAgICAgICAgdmVjX3N0KHZkc3QyLCAxNiwgZHN0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2lkdGggLT0gODsKKyAgICAgICAgICAgIGRzdCArPSAzMjsKKyAgICAgICAgICAgIHNyYyArPSAxNjsKKyAgICAgICAgICAgIHZzcmMgPSB2b3ZlcmZsb3c7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQod2lkdGggPT0gMCk7CisKKworICAgICAgICAvKiBkbyBzY2FsYXIgdW50aWwgd2UgY2FuIGFsaWduLi4uICovCisgICAgICAgIE9ORV9QSVhFTF9CTEVORCgoZXh0cmF3aWR0aCksIGV4dHJhd2lkdGgpOworI3VuZGVmIE9ORV9QSVhFTF9CTEVORAorCisgICAgICAgIHNyYyArPSBzcmNza2lwOyAgLyogbW92ZSB0byBuZXh0IHJvdywgYWNjb3VudGluZyBmb3IgcGl0Y2guICovCisgICAgICAgIGRzdCArPSBkc3Rza2lwOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZCBCbGl0TnRvTktleShTRExfQmxpdEluZm8gKmluZm8pOworc3RhdGljIHZvaWQgQmxpdE50b05LZXlDb3B5QWxwaGEoU0RMX0JsaXRJbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIEJsaXQzMnRvMzJLZXlBbHRpdmVjKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKyAgICBpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisgICAgVWludDMyICpzcmNwID0gKFVpbnQzMiAqKSBpbmZvLT5zX3BpeGVsczsKKyAgICBpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKyAgICBVaW50MzIgKmRzdHAgPSAoVWludDMyICopIGluZm8tPmRfcGl4ZWxzOworICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworICAgIFNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOworICAgIGludCBzcmNicHAgPSBzcmNmbXQtPkJ5dGVzUGVyUGl4ZWw7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisgICAgaW50IGRzdGJwcCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKKyAgICBpbnQgY29weV9hbHBoYSA9IChzcmNmbXQtPkFtYXNrICYmIGRzdGZtdC0+QW1hc2spOworCXVuc2lnbmVkIGFscGhhID0gZHN0Zm10LT5BbWFzayA/IHNyY2ZtdC0+YWxwaGEgOiAwOworICAgIFVpbnQzMiByZ2JtYXNrID0gc3JjZm10LT5SbWFzayB8IHNyY2ZtdC0+R21hc2sgfCBzcmNmbXQtPkJtYXNrOworCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZhbHBoYTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2cGVybXV0ZTsKKyAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2emVybzsKKyAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZja2V5OworICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgdnJnYm1hc2s7CisgICAgdnBlcm11dGUgPSBjYWxjX3N3aXp6bGUzMihzcmNmbXQsIGRzdGZtdCk7CisgICAgaWYgKGluZm8tPmRfd2lkdGggPCAxNikgeworICAgICAgICBpZihjb3B5X2FscGhhKSB7CisgICAgICAgICAgICBCbGl0TnRvTktleUNvcHlBbHBoYShpbmZvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJsaXROdG9OS2V5KGluZm8pOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdnplcm8gPSB2ZWNfc3BsYXRfdTgoMCk7CisgICAgaWYgKGFscGhhKSB7CisgICAgICAgICgodW5zaWduZWQgY2hhciAqKSZ2YWxwaGEpWzBdID0gKHVuc2lnbmVkIGNoYXIpYWxwaGE7CisgICAgICAgIHZhbHBoYSA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KXZlY19zcGxhdCgodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmFscGhhLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWxwaGEgPSAodmVjdG9yIHVuc2lnbmVkIGludCl2emVybzsKKyAgICB9CisgICAgY2tleSAmPSByZ2JtYXNrOworICAgICgodW5zaWduZWQgaW50ICopKGNoYXIqKSZ2Y2tleSlbMF0gPSBja2V5OworICAgIHZja2V5ID0gdmVjX3NwbGF0KHZja2V5LCAwKTsKKyAgICAoKHVuc2lnbmVkIGludCAqKShjaGFyKikmdnJnYm1hc2spWzBdID0gcmdibWFzazsKKyAgICB2cmdibWFzayA9IHZlY19zcGxhdCh2cmdibWFzaywgMCk7CisKKyAgICB3aGlsZSAoaGVpZ2h0LS0pIHsKKyNkZWZpbmUgT05FX1BJWEVMX0JMRU5EKGNvbmRpdGlvbiwgd2lkdGh2YXIpIFwKKyAgICAgICAgaWYgKGNvcHlfYWxwaGEpIHsgXAorICAgICAgICAgICAgd2hpbGUgKGNvbmRpdGlvbikgeyBcCisgICAgICAgICAgICAgICAgVWludDMyIFBpeGVsOyBcCisgICAgICAgICAgICAgICAgdW5zaWduZWQgc1IsIHNHLCBzQiwgc0E7IFwKKyAgICAgICAgICAgICAgICBESVNFTUJMRV9SR0JBKChVaW50OCAqKXNyY3AsIHNyY2JwcCwgc3JjZm10LCBQaXhlbCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzUiwgc0csIHNCLCBzQSk7IFwKKyAgICAgICAgICAgICAgICBpZiAoIChQaXhlbCAmIHJnYm1hc2spICE9IGNrZXkgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICBBU1NFTUJMRV9SR0JBKChVaW50OCAqKWRzdHAsIGRzdGJwcCwgZHN0Zm10LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1IsIHNHLCBzQiwgc0EpOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZHN0cCA9IChVaW50MzIgKikgKCgoVWludDggKikgZHN0cCkgKyBkc3RicHApOyBcCisgICAgICAgICAgICAgICAgc3JjcCA9IChVaW50MzIgKikgKCgoVWludDggKikgc3JjcCkgKyBzcmNicHApOyBcCisgICAgICAgICAgICAgICAgd2lkdGh2YXItLTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIHdoaWxlIChjb25kaXRpb24pIHsgXAorICAgICAgICAgICAgICAgIFVpbnQzMiBQaXhlbDsgXAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNSLCBzRywgc0I7IFwKKyAgICAgICAgICAgICAgICBSRVRSSUVWRV9SR0JfUElYRUwoKFVpbnQ4ICopc3JjcCwgc3JjYnBwLCBQaXhlbCk7IFwKKyAgICAgICAgICAgICAgICBpZiAoIFBpeGVsICE9IGNrZXkgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgUkdCX0ZST01fUElYRUwoUGl4ZWwsIHNyY2ZtdCwgc1IsIHNHLCBzQik7IFwKKyAgICAgICAgICAgICAgICAgICAgQVNTRU1CTEVfUkdCQSgoVWludDggKilkc3RwLCBkc3RicHAsIGRzdGZtdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1IsIHNHLCBzQiwgYWxwaGEpOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZHN0cCA9IChVaW50MzIgKikgKCgoVWludDggKilkc3RwKSArIGRzdGJwcCk7IFwKKyAgICAgICAgICAgICAgICBzcmNwID0gKFVpbnQzMiAqKSAoKChVaW50OCAqKXNyY3ApICsgc3JjYnBwKTsgXAorICAgICAgICAgICAgICAgIHdpZHRodmFyLS07IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9CisgICAgICAgIGludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisgICAgICAgIE9ORV9QSVhFTF9CTEVORCgoVU5BTElHTkVEX1BUUihkc3RwKSkgJiYgKHdpZHRoKSwgd2lkdGgpOworICAgICAgICBhc3NlcnQod2lkdGggPiAwKTsKKyAgICAgICAgaWYgKHdpZHRoID4gMCkgeworICAgICAgICAgICAgaW50IGV4dHJhd2lkdGggPSAod2lkdGggJSA0KTsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyID0gVkVDX0FMSUdORVIoc3JjcCk7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZzID0gdmVjX2xkKDAsIHNyY3ApOworICAgICAgICAgICAgd2lkdGggLT0gZXh0cmF3aWR0aDsKKyAgICAgICAgICAgIGFzc2VydCh3aWR0aCA+PSA0KTsKKyAgICAgICAgICAgIHdoaWxlICh3aWR0aCkgeworICAgICAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZzZWw7CisgICAgICAgICAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2ZDsKKyAgICAgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZvdmVyZmxvdyA9IHZlY19sZCgxNSwgc3JjcCk7CisgICAgICAgICAgICAgICAgLyogbG9hZCB0aGUgc291cmNlIHZlYyAqLworICAgICAgICAgICAgICAgIHZzID0gdmVjX3Blcm0odnMsIHZvdmVyZmxvdywgdmFsaWduZXIpOworICAgICAgICAgICAgICAgIC8qIHZzZWwgaXMgc2V0IGZvciBpdGVtcyB0aGF0IG1hdGNoIHRoZSBrZXkgKi8KKyAgICAgICAgICAgICAgICB2c2VsID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19hbmQodnMsIHZyZ2JtYXNrKTsKKyAgICAgICAgICAgICAgICB2c2VsID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19jbXBlcSh2cywgdmNrZXkpOworICAgICAgICAgICAgICAgIC8qIHBlcm11dGUgdGhlIHNyYyB2ZWMgdG8gdGhlIGRlc3QgZm9ybWF0ICovCisgICAgICAgICAgICAgICAgdnMgPSB2ZWNfcGVybSh2cywgdmFscGhhLCB2cGVybXV0ZSk7CisgICAgICAgICAgICAgICAgLyogbG9hZCB0aGUgZGVzdGluYXRpb24gdmVjICovCisgICAgICAgICAgICAgICAgdmQgPSB2ZWNfbGQoMCwgZHN0cCk7CisgICAgICAgICAgICAgICAgLyogc2VsZWN0IHRoZSBzb3VyY2UgYW5kIGRlc3QgaW50byB2cyAqLworICAgICAgICAgICAgICAgIHZkID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpdmVjX3NlbCgodmVjdG9yIHVuc2lnbmVkIGNoYXIpdnMsICh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZCwgdnNlbCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmVjX3N0KHZkLCAwLCBkc3RwKTsKKyAgICAgICAgICAgICAgICBzcmNwICs9IDQ7CisgICAgICAgICAgICAgICAgd2lkdGggLT0gNDsKKyAgICAgICAgICAgICAgICBkc3RwICs9IDQ7CisgICAgICAgICAgICAgICAgdnMgPSB2b3ZlcmZsb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPTkVfUElYRUxfQkxFTkQoKGV4dHJhd2lkdGgpLCBleHRyYXdpZHRoKTsKKyN1bmRlZiBPTkVfUElYRUxfQkxFTkQKKyAgICAgICAgICAgIHNyY3AgKz0gc3Jjc2tpcCA+PiAyOworICAgICAgICAgICAgZHN0cCArPSBkc3Rza2lwID4+IDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIEFsdGl2ZWMgY29kZSB0byBzd2l6emxlIG9uZSAzMi1iaXQgc3VyZmFjZSB0byBhIGRpZmZlcmVudCAzMi1iaXQgZm9ybWF0LiAqLworLyogVXNlIHRoaXMgb24gYSBHNSAqLworc3RhdGljIHZvaWQgQ29udmVydEFsdGl2ZWMzMnRvMzJfbm9wcmVmZXRjaChTRExfQmxpdEluZm8gKmluZm8pCit7CisgICAgaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKSBpbmZvLT5zX3BpeGVsczsKKyAgICBpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKyAgICBVaW50MzIgKmRzdCA9IChVaW50MzIgKikgaW5mby0+ZF9waXhlbHM7CisgICAgaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisgICAgU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisgICAgdmVjdG9yIHVuc2lnbmVkIGludCB2emVybyA9IHZlY19zcGxhdF91MzIoMCk7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnBlcm11dGUgPSBjYWxjX3N3aXp6bGUzMihzcmNmbXQsIGRzdGZtdCk7CisgICAgaWYgKGRzdGZtdC0+QW1hc2sgJiYgIXNyY2ZtdC0+QW1hc2spIHsKKyAgICAgICAgaWYgKHNyY2ZtdC0+YWxwaGEpIHsKKyAgICAgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbHBoYTsKKyAgICAgICAgICAgICgodW5zaWduZWQgY2hhciAqKSZ2YWxwaGEpWzBdID0gc3JjZm10LT5hbHBoYTsKKyAgICAgICAgICAgIHZ6ZXJvID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpdmVjX3NwbGF0KHZhbHBoYSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoc3JjZm10LT5CeXRlc1BlclBpeGVsID09IDQpOworICAgIGFzc2VydChkc3RmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gNCk7CisKKyAgICB3aGlsZSAoaGVpZ2h0LS0pIHsKKyAgICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmFsaWduZXI7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgdmJpdHM7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgdm92ZXJmbG93OworICAgICAgICBVaW50MzIgYml0czsKKyAgICAgICAgVWludDggciwgZywgYiwgYTsKKworICAgICAgICBpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworICAgICAgICBpbnQgZXh0cmF3aWR0aDsKKworICAgICAgICAvKiBkbyBzY2FsYXIgdW50aWwgd2UgY2FuIGFsaWduLi4uICovCisgICAgICAgIHdoaWxlICgoVU5BTElHTkVEX1BUUihkc3QpKSAmJiAod2lkdGgpKSB7CisgICAgICAgICAgICBiaXRzID0gKihzcmMrKyk7CisgICAgICAgICAgICBSR0JBX0ZST01fODg4OChiaXRzLCBzcmNmbXQsIHIsIGcsIGIsIGEpOworICAgICAgICAgICAgKihkc3QrKykgPSBNQUtFODg4OChkc3RmbXQsIHIsIGcsIGIsIGEpOworICAgICAgICAgICAgd2lkdGgtLTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFmdGVyIGFsbCB0aGF0IHdvcmssIGhlcmUncyB0aGUgdmVjdG9yIHBhcnQhICovCisgICAgICAgIGV4dHJhd2lkdGggPSAod2lkdGggJSA0KTsKKyAgICAgICAgd2lkdGggLT0gZXh0cmF3aWR0aDsKKyAgICAgICAgdmFsaWduZXIgPSBWRUNfQUxJR05FUihzcmMpOworICAgICAgICB2Yml0cyA9IHZlY19sZCgwLCBzcmMpOworCisgICAgICAgd2hpbGUgKHdpZHRoKSB7CisgICAgICAgICAgICB2b3ZlcmZsb3cgPSB2ZWNfbGQoMTUsIHNyYyk7CisgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgICAgIHdpZHRoIC09IDQ7CisgICAgICAgICAgICB2Yml0cyA9IHZlY19wZXJtKHZiaXRzLCB2b3ZlcmZsb3csIHZhbGlnbmVyKTsgIC8qIHNyYyBpcyByZWFkeS4gKi8KKyAgICAgICAgICAgIHZiaXRzID0gdmVjX3Blcm0odmJpdHMsIHZ6ZXJvLCB2cGVybXV0ZSk7ICAvKiBzd2l6emxlIGl0LiAqLworICAgICAgICAgICAgdmVjX3N0KHZiaXRzLCAwLCBkc3QpOyAgLyogc3RvcmUgaXQgYmFjayBvdXQuICovCisgICAgICAgICAgICBkc3QgKz0gNDsKKyAgICAgICAgICAgIHZiaXRzID0gdm92ZXJmbG93OworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KHdpZHRoID09IDApOworCisgICAgICAgIC8qIGNvdmVyIHBpeGVscyBhdCB0aGUgZW5kIG9mIHRoZSByb3cgdGhhdCBkaWRuJ3QgZml0IGluIDE2IGJ5dGVzLiAqLworICAgICAgICB3aGlsZSAoZXh0cmF3aWR0aCkgeworICAgICAgICAgICAgYml0cyA9ICooc3JjKyspOyAgLyogbWF4IDcgcGl4ZWxzLCBkb24ndCBib3RoZXIgd2l0aCBwcmVmZXRjaC4gKi8KKyAgICAgICAgICAgIFJHQkFfRlJPTV84ODg4KGJpdHMsIHNyY2ZtdCwgciwgZywgYiwgYSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9IE1BS0U4ODg4KGRzdGZtdCwgciwgZywgYiwgYSk7CisgICAgICAgICAgICBleHRyYXdpZHRoLS07CisgICAgICAgIH0KKworICAgICAgICBzcmMgKz0gc3Jjc2tpcCA+PiAyOyAgLyogbW92ZSB0byBuZXh0IHJvdywgYWNjb3VudGluZyBmb3IgcGl0Y2guICovCisgICAgICAgIGRzdCArPSBkc3Rza2lwID4+IDI7CisgICAgfQorCit9CisKKy8qIEFsdGl2ZWMgY29kZSB0byBzd2l6emxlIG9uZSAzMi1iaXQgc3VyZmFjZSB0byBhIGRpZmZlcmVudCAzMi1iaXQgZm9ybWF0LiAqLworLyogVXNlIHRoaXMgb24gYSBHNCAqLworc3RhdGljIHZvaWQgQ29udmVydEFsdGl2ZWMzMnRvMzJfcHJlZmV0Y2goU0RMX0JsaXRJbmZvICppbmZvKQoreworICAgIGNvbnN0IGludCBzY2FsYXJfZHN0X2xlYWQgPSBzaXplb2YgKFVpbnQzMikgKiA0OworICAgIGNvbnN0IGludCB2ZWN0b3JfZHN0X2xlYWQgPSBzaXplb2YgKFVpbnQzMikgKiAxNjsKKworICAgIGludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKyAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKikgaW5mby0+c19waXhlbHM7CisgICAgaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisgICAgVWludDMyICpkc3QgPSAoVWludDMyICopIGluZm8tPmRfcGl4ZWxzOworICAgIGludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworICAgIFNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOworICAgIFNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OworICAgIHZlY3RvciB1bnNpZ25lZCBpbnQgdnplcm8gPSB2ZWNfc3BsYXRfdTMyKDApOworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZwZXJtdXRlID0gY2FsY19zd2l6emxlMzIoc3JjZm10LCBkc3RmbXQpOworICAgIGlmIChkc3RmbXQtPkFtYXNrICYmICFzcmNmbXQtPkFtYXNrKSB7CisgICAgICAgIGlmIChzcmNmbXQtPmFscGhhKSB7CisgICAgICAgICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciB2YWxwaGE7CisgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikmdmFscGhhKVswXSA9IHNyY2ZtdC0+YWxwaGE7CisgICAgICAgICAgICB2emVybyA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KXZlY19zcGxhdCh2YWxwaGEsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbCA9PSA0KTsKKyAgICBhc3NlcnQoZHN0Zm10LT5CeXRlc1BlclBpeGVsID09IDQpOworCisgICAgd2hpbGUgKGhlaWdodC0tKSB7CisgICAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZhbGlnbmVyOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZiaXRzOworICAgICAgICB2ZWN0b3IgdW5zaWduZWQgaW50IHZvdmVyZmxvdzsKKyAgICAgICAgVWludDMyIGJpdHM7CisgICAgICAgIFVpbnQ4IHIsIGcsIGIsIGE7CisKKyAgICAgICAgaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKyAgICAgICAgaW50IGV4dHJhd2lkdGg7CisKKyAgICAgICAgLyogZG8gc2NhbGFyIHVudGlsIHdlIGNhbiBhbGlnbi4uLiAqLworICAgICAgICB3aGlsZSAoKFVOQUxJR05FRF9QVFIoZHN0KSkgJiYgKHdpZHRoKSkgeworICAgICAgICAgICAgdmVjX2RzdHQoc3JjK3NjYWxhcl9kc3RfbGVhZCwgRFNUX0NUUkwoMiwzMiwxMDI0KSwgRFNUX0NIQU5fU1JDKTsKKyAgICAgICAgICAgIHZlY19kc3RzdChkc3Qrc2NhbGFyX2RzdF9sZWFkLCBEU1RfQ1RSTCgyLDMyLDEwMjQpLCBEU1RfQ0hBTl9ERVNUKTsKKyAgICAgICAgICAgIGJpdHMgPSAqKHNyYysrKTsKKyAgICAgICAgICAgIFJHQkFfRlJPTV84ODg4KGJpdHMsIHNyY2ZtdCwgciwgZywgYiwgYSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9IE1BS0U4ODg4KGRzdGZtdCwgciwgZywgYiwgYSk7CisgICAgICAgICAgICB3aWR0aC0tOworICAgICAgICB9CisKKyAgICAgICAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgaGVyZSdzIHRoZSB2ZWN0b3IgcGFydCEgKi8KKyAgICAgICAgZXh0cmF3aWR0aCA9ICh3aWR0aCAlIDQpOworICAgICAgICB3aWR0aCAtPSBleHRyYXdpZHRoOworICAgICAgICB2YWxpZ25lciA9IFZFQ19BTElHTkVSKHNyYyk7CisgICAgICAgIHZiaXRzID0gdmVjX2xkKDAsIHNyYyk7CisKKyAgICAgICAgd2hpbGUgKHdpZHRoKSB7CisgICAgICAgICAgICB2ZWNfZHN0dChzcmMrdmVjdG9yX2RzdF9sZWFkLCBEU1RfQ1RSTCgyLDMyLDEwMjQpLCBEU1RfQ0hBTl9TUkMpOworICAgICAgICAgICAgdmVjX2RzdHN0KGRzdCt2ZWN0b3JfZHN0X2xlYWQsIERTVF9DVFJMKDIsMzIsMTAyNCksIERTVF9DSEFOX0RFU1QpOworICAgICAgICAgICAgdm92ZXJmbG93ID0gdmVjX2xkKDE1LCBzcmMpOworICAgICAgICAgICAgc3JjICs9IDQ7CisgICAgICAgICAgICB3aWR0aCAtPSA0OworICAgICAgICAgICAgdmJpdHMgPSB2ZWNfcGVybSh2Yml0cywgdm92ZXJmbG93LCB2YWxpZ25lcik7ICAvKiBzcmMgaXMgcmVhZHkuICovCisgICAgICAgICAgICB2Yml0cyA9IHZlY19wZXJtKHZiaXRzLCB2emVybywgdnBlcm11dGUpOyAgLyogc3dpenpsZSBpdC4gKi8KKyAgICAgICAgICAgIHZlY19zdCh2Yml0cywgMCwgZHN0KTsgIC8qIHN0b3JlIGl0IGJhY2sgb3V0LiAqLworICAgICAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgICAgICB2Yml0cyA9IHZvdmVyZmxvdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0KHdpZHRoID09IDApOworCisgICAgICAgIC8qIGNvdmVyIHBpeGVscyBhdCB0aGUgZW5kIG9mIHRoZSByb3cgdGhhdCBkaWRuJ3QgZml0IGluIDE2IGJ5dGVzLiAqLworICAgICAgICB3aGlsZSAoZXh0cmF3aWR0aCkgeworICAgICAgICAgICAgYml0cyA9ICooc3JjKyspOyAgLyogbWF4IDcgcGl4ZWxzLCBkb24ndCBib3RoZXIgd2l0aCBwcmVmZXRjaC4gKi8KKyAgICAgICAgICAgIFJHQkFfRlJPTV84ODg4KGJpdHMsIHNyY2ZtdCwgciwgZywgYiwgYSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9IE1BS0U4ODg4KGRzdGZtdCwgciwgZywgYiwgYSk7CisgICAgICAgICAgICBleHRyYXdpZHRoLS07CisgICAgICAgIH0KKworICAgICAgICBzcmMgKz0gc3Jjc2tpcCA+PiAyOyAgLyogbW92ZSB0byBuZXh0IHJvdywgYWNjb3VudGluZyBmb3IgcGl0Y2guICovCisgICAgICAgIGRzdCArPSBkc3Rza2lwID4+IDI7CisgICAgfQorCisgICAgdmVjX2RzcyhEU1RfQ0hBTl9TUkMpOworICAgIHZlY19kc3MoRFNUX0NIQU5fREVTVCk7Cit9CisKK3N0YXRpYyBVaW50MzIgR2V0QmxpdEZlYXR1cmVzKCB2b2lkICkKK3sKKyAgICBzdGF0aWMgVWludDMyIGZlYXR1cmVzID0gMHhmZmZmZmZmZjsKKyAgICBpZiAoZmVhdHVyZXMgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAvKiBQcm92aWRlIGFuIG92ZXJyaWRlIGZvciB0ZXN0aW5nIC4uICovCisgICAgICAgIGNoYXIgKm92ZXJyaWRlID0gU0RMX2dldGVudigiU0RMX0FMVElWRUNfQkxJVF9GRUFUVVJFUyIpOworICAgICAgICBpZiAob3ZlcnJpZGUpIHsKKyAgICAgICAgICAgIGZlYXR1cmVzID0gMDsKKyAgICAgICAgICAgIFNETF9zc2NhbmYob3ZlcnJpZGUsICIldSIsICZmZWF0dXJlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZWF0dXJlcyA9ICggMAorICAgICAgICAgICAgICAgIC8qIEZlYXR1cmUgMSBpcyBoYXMtTU1YICovCisgICAgICAgICAgICAgICAgfCAoKFNETF9IYXNNTVgoKSkgPyAxIDogMCkKKyAgICAgICAgICAgICAgICAvKiBGZWF0dXJlIDIgaXMgaGFzLUFsdGlWZWMgKi8KKyAgICAgICAgICAgICAgICB8ICgoU0RMX0hhc0FsdGlWZWMoKSkgPyAyIDogMCkKKyAgICAgICAgICAgICAgICAvKiBGZWF0dXJlIDQgaXMgZG9udC11c2UtcHJlZmV0Y2ggKi8KKyAgICAgICAgICAgICAgICAvKiAhISEhIEZJWE1FOiBDaGVjayBmb3IgRzUgb3IgbGF0ZXIsIG5vdCB0aGUgY2FjaGUgc2l6ZSEgQWx3YXlzIHByZWZldGNoIG9uIGEgRzQuICovCisgICAgICAgICAgICAgICAgfCAoKEdldEwzQ2FjaGVTaXplKCkgPT0gMCkgPyA0IDogMCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZlYXR1cmVzOworfQorI2lmIF9fTVdFUktTX18KKyNwcmFnbWEgYWx0aXZlY19tb2RlbCBvZmYKKyNlbmRpZgorI2Vsc2UKKy8qIEZlYXR1cmUgMSBpcyBoYXMtTU1YICovCisjZGVmaW5lIEdldEJsaXRGZWF0dXJlcygpICgoVWludDMyKShTRExfSGFzTU1YKCkgPyAxIDogMCkpCisjZW5kaWYKKworLyogVGhpcyBpcyBub3cgZW5kaWFuIGRlcGVuZGVudCAqLworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KKyNkZWZpbmUgSEkJMQorI2RlZmluZSBMTwkwCisjZWxzZSAvKiBTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOICovCisjZGVmaW5lIEhJCTAKKyNkZWZpbmUgTE8JMQorI2VuZGlmCisKKyNpZiBTRExfSEVSTUVTX0JMSVRURVJTCisKKy8qIEhlaGVoZWgsIHdlIGNvZXJjZSBIZXJtZXMgaW50byB1c2luZyBTREwgYmxpdCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBYODZfQVNTRU1CTEVSCisjZGVmaW5lIEhlcm1lc0NvbnZlcnRlckludGVyZmFjZQlTRExfQmxpdEluZm8KKyNkZWZpbmUgSGVybWVzQ2xlYXJJbnRlcmZhY2UJCXZvaWQKKyNkZWZpbmUgU1RBQ0tDQUxMCisKKyNpbmNsdWRlICIuLi9oZXJtZXMvSGVhZE1NWC5oIgorI2luY2x1ZGUgIi4uL2hlcm1lcy9IZWFkWDg2LmgiCisKKyNlbHNlCisKKy8qIFNwZWNpYWwgb3B0aW1pemVkIGJsaXQgZm9yIFJHQiA4LTgtOCAtLT4gUkdCIDMtMy0yICovCisjZGVmaW5lIFJHQjg4OF9SR0IzMzIoZHN0LCBzcmMpIHsgXAorCWRzdCA9IChVaW50OCkoKCgoc3JjKSYweDAwRTAwMDAwKT4+MTYpfCBcCisJICAgICAgICAgICAgICAoKChzcmMpJjB4MDAwMEUwMDApPj4xMSl8IFwKKwkgICAgICAgICAgICAgICgoKHNyYykmMHgwMDAwMDBDMCk+PjYpKTsgXAorfQorc3RhdGljIHZvaWQgQmxpdF9SR0I4ODhfaW5kZXg4KFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKyNpZm5kZWYgVVNFX0RVRkZTX0xPT1AKKwlpbnQgYzsKKyNlbmRpZgorCWludCB3aWR0aCwgaGVpZ2h0OworCVVpbnQzMiAqc3JjOworCWNvbnN0IFVpbnQ4ICptYXA7CisJVWludDggKmRzdDsKKwlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7CisJc3Jjc2tpcCA9IGluZm8tPnNfc2tpcC80OworCWRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJbWFwID0gaW5mby0+dGFibGU7CisKKwlpZiAoIG1hcCA9PSBOVUxMICkgeworCQl3aGlsZSAoIGhlaWdodC0tICkgeworI2lmZGVmIFVTRV9EVUZGU19MT09QCisJCQlEVUZGU19MT09QKAorCQkJCVJHQjg4OF9SR0IzMzIoKmRzdCsrLCAqc3JjKTsKKwkJCSwgd2lkdGgpOworI2Vsc2UKKwkJCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgeworCQkJCS8qIFBhY2sgUkdCIGludG8gOGJpdCBwaXhlbCAqLworCQkJCSsrc3JjOworCQkJCVJHQjg4OF9SR0IzMzIoKmRzdCsrLCAqc3JjKTsKKwkJCQkrK3NyYzsKKwkJCQlSR0I4ODhfUkdCMzMyKCpkc3QrKywgKnNyYyk7CisJCQkJKytzcmM7CisJCQkJUkdCODg4X1JHQjMzMigqZHN0KyssICpzcmMpOworCQkJCSsrc3JjOworCQkJfQorCQkJc3dpdGNoICggd2lkdGggJiAzICkgeworCQkJCWNhc2UgMzoKKwkJCQkJUkdCODg4X1JHQjMzMigqZHN0KyssICpzcmMpOworCQkJCQkrK3NyYzsKKwkJCQljYXNlIDI6CisJCQkJCVJHQjg4OF9SR0IzMzIoKmRzdCsrLCAqc3JjKTsKKwkJCQkJKytzcmM7CisJCQkJY2FzZSAxOgorCQkJCQlSR0I4ODhfUkdCMzMyKCpkc3QrKywgKnNyYyk7CisJCQkJCSsrc3JjOworCQkJfQorI2VuZGlmIC8qIFVTRV9EVUZGU19MT09QICovCisJCQlzcmMgKz0gc3Jjc2tpcDsKKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJfSBlbHNlIHsKKwkJaW50IFBpeGVsOworCisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisjaWZkZWYgVVNFX0RVRkZTX0xPT1AKKwkJCURVRkZTX0xPT1AoCisJCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7CisJCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKKwkJCQkrK3NyYzsKKwkJCSwgd2lkdGgpOworI2Vsc2UKKwkJCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgeworCQkJCS8qIFBhY2sgUkdCIGludG8gOGJpdCBwaXhlbCAqLworCQkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOworCQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07CisJCQkJKytzcmM7CisJCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7CisJCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKKwkJCQkrK3NyYzsKKwkJCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKKwkJCQkqZHN0KysgPSBtYXBbUGl4ZWxdOworCQkJCSsrc3JjOworCQkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOworCQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07CisJCQkJKytzcmM7CisJCQl9CisJCQlzd2l0Y2ggKCB3aWR0aCAmIDMgKSB7CisJCQkJY2FzZSAzOgorCQkJCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKKwkJCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKKwkJCQkJKytzcmM7CisJCQkJY2FzZSAyOgorCQkJCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKKwkJCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKKwkJCQkJKytzcmM7CisJCQkJY2FzZSAxOgorCQkJCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKKwkJCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKKwkJCQkJKytzcmM7CisJCQl9CisjZW5kaWYgLyogVVNFX0RVRkZTX0xPT1AgKi8KKwkJCXNyYyArPSBzcmNza2lwOworCQkJZHN0ICs9IGRzdHNraXA7CisJCX0KKwl9Cit9CisvKiBTcGVjaWFsIG9wdGltaXplZCBibGl0IGZvciBSR0IgOC04LTggLS0+IFJHQiA1LTUtNSAqLworI2RlZmluZSBSR0I4ODhfUkdCNTU1KGRzdCwgc3JjKSB7IFwKKwkqKFVpbnQxNiAqKShkc3QpID0gKFVpbnQxNikoKCgoKnNyYykmMHgwMEY4MDAwMCk+PjkpfCBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCpzcmMpJjB4MDAwMEY4MDApPj42KXwgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgqc3JjKSYweDAwMDAwMEY4KT4+MykpOyBcCit9CisjZGVmaW5lIFJHQjg4OF9SR0I1NTVfVFdPKGRzdCwgc3JjKSB7IFwKKwkqKFVpbnQzMiAqKShkc3QpID0gKCgoKChzcmNbSEldKSYweDAwRjgwMDAwKT4+OSl8IFwKKwkgICAgICAgICAgICAgICAgICAgICAoKChzcmNbSEldKSYweDAwMDBGODAwKT4+Nil8IFwKKwkgICAgICAgICAgICAgICAgICAgICAoKChzcmNbSEldKSYweDAwMDAwMEY4KT4+MykpPDwxNil8IFwKKwkgICAgICAgICAgICAgICAgICAgICAoKChzcmNbTE9dKSYweDAwRjgwMDAwKT4+OSl8IFwKKwkgICAgICAgICAgICAgICAgICAgICAoKChzcmNbTE9dKSYweDAwMDBGODAwKT4+Nil8IFwKKwkgICAgICAgICAgICAgICAgICAgICAoKChzcmNbTE9dKSYweDAwMDAwMEY4KT4+Myk7IFwKK30KK3N0YXRpYyB2b2lkIEJsaXRfUkdCODg4X1JHQjU1NShTRExfQmxpdEluZm8gKmluZm8pCit7CisjaWZuZGVmIFVTRV9EVUZGU19MT09QCisJaW50IGM7CisjZW5kaWYKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlVaW50MzIgKnNyYzsKKwlVaW50MTYgKmRzdDsKKwlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSAoVWludDMyICopaW5mby0+c19waXhlbHM7CisJc3Jjc2tpcCA9IGluZm8tPnNfc2tpcC80OworCWRzdCA9IChVaW50MTYgKilpbmZvLT5kX3BpeGVsczsKKwlkc3Rza2lwID0gaW5mby0+ZF9za2lwLzI7CisKKyNpZmRlZiBVU0VfRFVGRlNfTE9PUAorCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCURVRkZTX0xPT1AoCisJCQlSR0I4ODhfUkdCNTU1KGRzdCwgc3JjKTsKKwkJCSsrc3JjOworCQkJKytkc3Q7CisJCSwgd2lkdGgpOworCQlzcmMgKz0gc3Jjc2tpcDsKKwkJZHN0ICs9IGRzdHNraXA7CisJfQorI2Vsc2UKKwkvKiBNZW1vcnkgYWxpZ24gYXQgNC1ieXRlIGJvdW5kYXJ5LCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIChsb25nKWRzdCAmIDB4MDMgKSB7CisJCS8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdpZHRoIGlzIDAgKi8KKwkJaWYgKCB3aWR0aCA9PSAwICkgeworCQkJcmV0dXJuOworCQl9CisJCS0td2lkdGg7CisKKwkJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkJCS8qIFBlcmZvcm0gY29weSBhbGlnbm1lbnQgKi8KKwkJCVJHQjg4OF9SR0I1NTUoZHN0LCBzcmMpOworCQkJKytzcmM7CisJCQkrK2RzdDsKKworCQkJLyogQ29weSBpbiA0IHBpeGVsIGNodW5rcyAqLworCQkJZm9yICggYz13aWR0aC80OyBjOyAtLWMgKSB7CisJCQkJUkdCODg4X1JHQjU1NV9UV08oZHN0LCBzcmMpOworCQkJCXNyYyArPSAyOworCQkJCWRzdCArPSAyOworCQkJCVJHQjg4OF9SR0I1NTVfVFdPKGRzdCwgc3JjKTsKKwkJCQlzcmMgKz0gMjsKKwkJCQlkc3QgKz0gMjsKKwkJCX0KKwkJCS8qIEdldCBhbnkgbGVmdG92ZXJzICovCisJCQlzd2l0Y2ggKHdpZHRoICYgMykgeworCQkJCWNhc2UgMzoKKwkJCQkJUkdCODg4X1JHQjU1NShkc3QsIHNyYyk7CisJCQkJCSsrc3JjOworCQkJCQkrK2RzdDsKKwkJCQljYXNlIDI6CisJCQkJCVJHQjg4OF9SR0I1NTVfVFdPKGRzdCwgc3JjKTsKKwkJCQkJc3JjICs9IDI7CisJCQkJCWRzdCArPSAyOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCVJHQjg4OF9SR0I1NTUoZHN0LCBzcmMpOworCQkJCQkrK3NyYzsKKwkJCQkJKytkc3Q7CisJCQkJCWJyZWFrOworCQkJfQorCQkJc3JjICs9IHNyY3NraXA7CisJCQlkc3QgKz0gZHN0c2tpcDsKKwkJfQorCX0gZWxzZSB7IAorCQl3aGlsZSAoIGhlaWdodC0tICkgeworCQkJLyogQ29weSBpbiA0IHBpeGVsIGNodW5rcyAqLworCQkJZm9yICggYz13aWR0aC80OyBjOyAtLWMgKSB7CisJCQkJUkdCODg4X1JHQjU1NV9UV08oZHN0LCBzcmMpOworCQkJCXNyYyArPSAyOworCQkJCWRzdCArPSAyOworCQkJCVJHQjg4OF9SR0I1NTVfVFdPKGRzdCwgc3JjKTsKKwkJCQlzcmMgKz0gMjsKKwkJCQlkc3QgKz0gMjsKKwkJCX0KKwkJCS8qIEdldCBhbnkgbGVmdG92ZXJzICovCisJCQlzd2l0Y2ggKHdpZHRoICYgMykgeworCQkJCWNhc2UgMzoKKwkJCQkJUkdCODg4X1JHQjU1NShkc3QsIHNyYyk7CisJCQkJCSsrc3JjOworCQkJCQkrK2RzdDsKKwkJCQljYXNlIDI6CisJCQkJCVJHQjg4OF9SR0I1NTVfVFdPKGRzdCwgc3JjKTsKKwkJCQkJc3JjICs9IDI7CisJCQkJCWRzdCArPSAyOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCVJHQjg4OF9SR0I1NTUoZHN0LCBzcmMpOworCQkJCQkrK3NyYzsKKwkJCQkJKytkc3Q7CisJCQkJCWJyZWFrOworCQkJfQorCQkJc3JjICs9IHNyY3NraXA7CisJCQlkc3QgKz0gZHN0c2tpcDsKKwkJfQorCX0KKyNlbmRpZiAvKiBVU0VfRFVGRlNfTE9PUCAqLworfQorLyogU3BlY2lhbCBvcHRpbWl6ZWQgYmxpdCBmb3IgUkdCIDgtOC04IC0tPiBSR0IgNS02LTUgKi8KKyNkZWZpbmUgUkdCODg4X1JHQjU2NShkc3QsIHNyYykgeyBcCisJKihVaW50MTYgKikoZHN0KSA9IChVaW50MTYpKCgoKCpzcmMpJjB4MDBGODAwMDApPj44KXwgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgqc3JjKSYweDAwMDBGQzAwKT4+NSl8IFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKnNyYykmMHgwMDAwMDBGOCk+PjMpKTsgXAorfQorI2RlZmluZSBSR0I4ODhfUkdCNTY1X1RXTyhkc3QsIHNyYykgeyBcCisJKihVaW50MzIgKikoZHN0KSA9ICgoKCgoc3JjW0hJXSkmMHgwMEY4MDAwMCk+PjgpfCBcCisJICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0hJXSkmMHgwMDAwRkMwMCk+PjUpfCBcCisJICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0hJXSkmMHgwMDAwMDBGOCk+PjMpKTw8MTYpfCBcCisJICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0xPXSkmMHgwMEY4MDAwMCk+PjgpfCBcCisJICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0xPXSkmMHgwMDAwRkMwMCk+PjUpfCBcCisJICAgICAgICAgICAgICAgICAgICAgKCgoc3JjW0xPXSkmMHgwMDAwMDBGOCk+PjMpOyBcCit9CitzdGF0aWMgdm9pZCBCbGl0X1JHQjg4OF9SR0I1NjUoU0RMX0JsaXRJbmZvICppbmZvKQoreworI2lmbmRlZiBVU0VfRFVGRlNfTE9PUAorCWludCBjOworI2VuZGlmCisJaW50IHdpZHRoLCBoZWlnaHQ7CisJVWludDMyICpzcmM7CisJVWludDE2ICpkc3Q7CisJaW50IHNyY3NraXAsIGRzdHNraXA7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwl3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJc3JjID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworCXNyY3NraXAgPSBpbmZvLT5zX3NraXAvNDsKKwlkc3QgPSAoVWludDE2ICopaW5mby0+ZF9waXhlbHM7CisJZHN0c2tpcCA9IGluZm8tPmRfc2tpcC8yOworCisjaWZkZWYgVVNFX0RVRkZTX0xPT1AKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCQlEVUZGU19MT09QKAorCQkJUkdCODg4X1JHQjU2NShkc3QsIHNyYyk7CisJCQkrK3NyYzsKKwkJCSsrZHN0OworCQksIHdpZHRoKTsKKwkJc3JjICs9IHNyY3NraXA7CisJCWRzdCArPSBkc3Rza2lwOworCX0KKyNlbHNlCisJLyogTWVtb3J5IGFsaWduIGF0IDQtYnl0ZSBib3VuZGFyeSwgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCAobG9uZylkc3QgJiAweDAzICkgeworCQkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3aWR0aCBpcyAwICovCisJCWlmICggd2lkdGggPT0gMCApIHsKKwkJCXJldHVybjsKKwkJfQorCQktLXdpZHRoOworCisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCQkvKiBQZXJmb3JtIGNvcHkgYWxpZ25tZW50ICovCisJCQlSR0I4ODhfUkdCNTY1KGRzdCwgc3JjKTsKKwkJCSsrc3JjOworCQkJKytkc3Q7CisKKwkJCS8qIENvcHkgaW4gNCBwaXhlbCBjaHVua3MgKi8KKwkJCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgeworCQkJCVJHQjg4OF9SR0I1NjVfVFdPKGRzdCwgc3JjKTsKKwkJCQlzcmMgKz0gMjsKKwkJCQlkc3QgKz0gMjsKKwkJCQlSR0I4ODhfUkdCNTY1X1RXTyhkc3QsIHNyYyk7CisJCQkJc3JjICs9IDI7CisJCQkJZHN0ICs9IDI7CisJCQl9CisJCQkvKiBHZXQgYW55IGxlZnRvdmVycyAqLworCQkJc3dpdGNoICh3aWR0aCAmIDMpIHsKKwkJCQljYXNlIDM6CisJCQkJCVJHQjg4OF9SR0I1NjUoZHN0LCBzcmMpOworCQkJCQkrK3NyYzsKKwkJCQkJKytkc3Q7CisJCQkJY2FzZSAyOgorCQkJCQlSR0I4ODhfUkdCNTY1X1RXTyhkc3QsIHNyYyk7CisJCQkJCXNyYyArPSAyOworCQkJCQlkc3QgKz0gMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQlSR0I4ODhfUkdCNTY1KGRzdCwgc3JjKTsKKwkJCQkJKytzcmM7CisJCQkJCSsrZHN0OworCQkJCQlicmVhazsKKwkJCX0KKwkJCXNyYyArPSBzcmNza2lwOworCQkJZHN0ICs9IGRzdHNraXA7CisJCX0KKwl9IGVsc2UgeyAKKwkJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkJCS8qIENvcHkgaW4gNCBwaXhlbCBjaHVua3MgKi8KKwkJCWZvciAoIGM9d2lkdGgvNDsgYzsgLS1jICkgeworCQkJCVJHQjg4OF9SR0I1NjVfVFdPKGRzdCwgc3JjKTsKKwkJCQlzcmMgKz0gMjsKKwkJCQlkc3QgKz0gMjsKKwkJCQlSR0I4ODhfUkdCNTY1X1RXTyhkc3QsIHNyYyk7CisJCQkJc3JjICs9IDI7CisJCQkJZHN0ICs9IDI7CisJCQl9CisJCQkvKiBHZXQgYW55IGxlZnRvdmVycyAqLworCQkJc3dpdGNoICh3aWR0aCAmIDMpIHsKKwkJCQljYXNlIDM6CisJCQkJCVJHQjg4OF9SR0I1NjUoZHN0LCBzcmMpOworCQkJCQkrK3NyYzsKKwkJCQkJKytkc3Q7CisJCQkJY2FzZSAyOgorCQkJCQlSR0I4ODhfUkdCNTY1X1RXTyhkc3QsIHNyYyk7CisJCQkJCXNyYyArPSAyOworCQkJCQlkc3QgKz0gMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQlSR0I4ODhfUkdCNTY1KGRzdCwgc3JjKTsKKwkJCQkJKytzcmM7CisJCQkJCSsrZHN0OworCQkJCQlicmVhazsKKwkJCX0KKwkJCXNyYyArPSBzcmNza2lwOworCQkJZHN0ICs9IGRzdHNraXA7CisJCX0KKwl9CisjZW5kaWYgLyogVVNFX0RVRkZTX0xPT1AgKi8KK30KKworI2VuZGlmIC8qIFNETF9IRVJNRVNfQkxJVFRFUlMgKi8KKworCisvKiBTcGVjaWFsIG9wdGltaXplZCBibGl0IGZvciBSR0IgNS02LTUgLS0+IDMyLWJpdCBSR0Igc3VyZmFjZXMgKi8KKyNkZWZpbmUgUkdCNTY1XzMyKGRzdCwgc3JjLCBtYXApIChtYXBbc3JjW0xPXSoyXSArIG1hcFtzcmNbSEldKjIrMV0pCitzdGF0aWMgdm9pZCBCbGl0X1JHQjU2NV8zMihTRExfQmxpdEluZm8gKmluZm8sIGNvbnN0IFVpbnQzMiAqbWFwKQoreworI2lmbmRlZiBVU0VfRFVGRlNfTE9PUAorCWludCBjOworI2VuZGlmCisJaW50IHdpZHRoLCBoZWlnaHQ7CisJVWludDggKnNyYzsKKwlVaW50MzIgKmRzdDsKKwlpbnQgc3Jjc2tpcCwgZHN0c2tpcDsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSAoVWludDggKilpbmZvLT5zX3BpeGVsczsKKwlzcmNza2lwID0gaW5mby0+c19za2lwOworCWRzdCA9IChVaW50MzIgKilpbmZvLT5kX3BpeGVsczsKKwlkc3Rza2lwID0gaW5mby0+ZF9za2lwLzQ7CisKKyNpZmRlZiBVU0VfRFVGRlNfTE9PUAorCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCURVRkZTX0xPT1AoCisJCXsKKwkJCSpkc3QrKyA9IFJHQjU2NV8zMihkc3QsIHNyYywgbWFwKTsKKwkJCXNyYyArPSAyOworCQl9LAorCQl3aWR0aCk7CisJCXNyYyArPSBzcmNza2lwOworCQlkc3QgKz0gZHN0c2tpcDsKKwl9CisjZWxzZQorCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCS8qIENvcHkgaW4gNCBwaXhlbCBjaHVua3MgKi8KKwkJZm9yICggYz13aWR0aC80OyBjOyAtLWMgKSB7CisJCQkqZHN0KysgPSBSR0I1NjVfMzIoZHN0LCBzcmMsIG1hcCk7CisJCQlzcmMgKz0gMjsKKwkJCSpkc3QrKyA9IFJHQjU2NV8zMihkc3QsIHNyYywgbWFwKTsKKwkJCXNyYyArPSAyOworCQkJKmRzdCsrID0gUkdCNTY1XzMyKGRzdCwgc3JjLCBtYXApOworCQkJc3JjICs9IDI7CisJCQkqZHN0KysgPSBSR0I1NjVfMzIoZHN0LCBzcmMsIG1hcCk7CisJCQlzcmMgKz0gMjsKKwkJfQorCQkvKiBHZXQgYW55IGxlZnRvdmVycyAqLworCQlzd2l0Y2ggKHdpZHRoICYgMykgeworCQkJY2FzZSAzOgorCQkJCSpkc3QrKyA9IFJHQjU2NV8zMihkc3QsIHNyYywgbWFwKTsKKwkJCQlzcmMgKz0gMjsKKwkJCWNhc2UgMjoKKwkJCQkqZHN0KysgPSBSR0I1NjVfMzIoZHN0LCBzcmMsIG1hcCk7CisJCQkJc3JjICs9IDI7CisJCQljYXNlIDE6CisJCQkJKmRzdCsrID0gUkdCNTY1XzMyKGRzdCwgc3JjLCBtYXApOworCQkJCXNyYyArPSAyOworCQkJCWJyZWFrOworCQl9CisJCXNyYyArPSBzcmNza2lwOworCQlkc3QgKz0gZHN0c2tpcDsKKwl9CisjZW5kaWYgLyogVVNFX0RVRkZTX0xPT1AgKi8KK30KKworLyogU3BlY2lhbCBvcHRpbWl6ZWQgYmxpdCBmb3IgUkdCIDUtNi01IC0tPiBBUkdCIDgtOC04LTggKi8KK3N0YXRpYyBjb25zdCBVaW50MzIgUkdCNTY1X0FSR0I4ODg4X0xVVFs1MTJdID0geworCQkweDAwMDAwMDAwLCAweGZmMDAwMDAwLCAweDAwMDAwMDA4LCAweGZmMDAyMDAwLAorCQkweDAwMDAwMDEwLCAweGZmMDA0MDAwLCAweDAwMDAwMDE4LCAweGZmMDA2MTAwLAorCQkweDAwMDAwMDIwLCAweGZmMDA4MTAwLCAweDAwMDAwMDI5LCAweGZmMDBhMTAwLAorCQkweDAwMDAwMDMxLCAweGZmMDBjMjAwLCAweDAwMDAwMDM5LCAweGZmMDBlMjAwLAorCQkweDAwMDAwMDQxLCAweGZmMDgwMDAwLCAweDAwMDAwMDRhLCAweGZmMDgyMDAwLAorCQkweDAwMDAwMDUyLCAweGZmMDg0MDAwLCAweDAwMDAwMDVhLCAweGZmMDg2MTAwLAorCQkweDAwMDAwMDYyLCAweGZmMDg4MTAwLCAweDAwMDAwMDZhLCAweGZmMDhhMTAwLAorCQkweDAwMDAwMDczLCAweGZmMDhjMjAwLCAweDAwMDAwMDdiLCAweGZmMDhlMjAwLAorCQkweDAwMDAwMDgzLCAweGZmMTAwMDAwLCAweDAwMDAwMDhiLCAweGZmMTAyMDAwLAorCQkweDAwMDAwMDk0LCAweGZmMTA0MDAwLCAweDAwMDAwMDljLCAweGZmMTA2MTAwLAorCQkweDAwMDAwMGE0LCAweGZmMTA4MTAwLCAweDAwMDAwMGFjLCAweGZmMTBhMTAwLAorCQkweDAwMDAwMGI0LCAweGZmMTBjMjAwLCAweDAwMDAwMGJkLCAweGZmMTBlMjAwLAorCQkweDAwMDAwMGM1LCAweGZmMTgwMDAwLCAweDAwMDAwMGNkLCAweGZmMTgyMDAwLAorCQkweDAwMDAwMGQ1LCAweGZmMTg0MDAwLCAweDAwMDAwMGRlLCAweGZmMTg2MTAwLAorCQkweDAwMDAwMGU2LCAweGZmMTg4MTAwLCAweDAwMDAwMGVlLCAweGZmMThhMTAwLAorCQkweDAwMDAwMGY2LCAweGZmMThjMjAwLCAweDAwMDAwMGZmLCAweGZmMThlMjAwLAorCQkweDAwMDAwNDAwLCAweGZmMjAwMDAwLCAweDAwMDAwNDA4LCAweGZmMjAyMDAwLAorCQkweDAwMDAwNDEwLCAweGZmMjA0MDAwLCAweDAwMDAwNDE4LCAweGZmMjA2MTAwLAorCQkweDAwMDAwNDIwLCAweGZmMjA4MTAwLCAweDAwMDAwNDI5LCAweGZmMjBhMTAwLAorCQkweDAwMDAwNDMxLCAweGZmMjBjMjAwLCAweDAwMDAwNDM5LCAweGZmMjBlMjAwLAorCQkweDAwMDAwNDQxLCAweGZmMjkwMDAwLCAweDAwMDAwNDRhLCAweGZmMjkyMDAwLAorCQkweDAwMDAwNDUyLCAweGZmMjk0MDAwLCAweDAwMDAwNDVhLCAweGZmMjk2MTAwLAorCQkweDAwMDAwNDYyLCAweGZmMjk4MTAwLCAweDAwMDAwNDZhLCAweGZmMjlhMTAwLAorCQkweDAwMDAwNDczLCAweGZmMjljMjAwLCAweDAwMDAwNDdiLCAweGZmMjllMjAwLAorCQkweDAwMDAwNDgzLCAweGZmMzEwMDAwLCAweDAwMDAwNDhiLCAweGZmMzEyMDAwLAorCQkweDAwMDAwNDk0LCAweGZmMzE0MDAwLCAweDAwMDAwNDljLCAweGZmMzE2MTAwLAorCQkweDAwMDAwNGE0LCAweGZmMzE4MTAwLCAweDAwMDAwNGFjLCAweGZmMzFhMTAwLAorCQkweDAwMDAwNGI0LCAweGZmMzFjMjAwLCAweDAwMDAwNGJkLCAweGZmMzFlMjAwLAorCQkweDAwMDAwNGM1LCAweGZmMzkwMDAwLCAweDAwMDAwNGNkLCAweGZmMzkyMDAwLAorCQkweDAwMDAwNGQ1LCAweGZmMzk0MDAwLCAweDAwMDAwNGRlLCAweGZmMzk2MTAwLAorCQkweDAwMDAwNGU2LCAweGZmMzk4MTAwLCAweDAwMDAwNGVlLCAweGZmMzlhMTAwLAorCQkweDAwMDAwNGY2LCAweGZmMzljMjAwLCAweDAwMDAwNGZmLCAweGZmMzllMjAwLAorCQkweDAwMDAwODAwLCAweGZmNDEwMDAwLCAweDAwMDAwODA4LCAweGZmNDEyMDAwLAorCQkweDAwMDAwODEwLCAweGZmNDE0MDAwLCAweDAwMDAwODE4LCAweGZmNDE2MTAwLAorCQkweDAwMDAwODIwLCAweGZmNDE4MTAwLCAweDAwMDAwODI5LCAweGZmNDFhMTAwLAorCQkweDAwMDAwODMxLCAweGZmNDFjMjAwLCAweDAwMDAwODM5LCAweGZmNDFlMjAwLAorCQkweDAwMDAwODQxLCAweGZmNGEwMDAwLCAweDAwMDAwODRhLCAweGZmNGEyMDAwLAorCQkweDAwMDAwODUyLCAweGZmNGE0MDAwLCAweDAwMDAwODVhLCAweGZmNGE2MTAwLAorCQkweDAwMDAwODYyLCAweGZmNGE4MTAwLCAweDAwMDAwODZhLCAweGZmNGFhMTAwLAorCQkweDAwMDAwODczLCAweGZmNGFjMjAwLCAweDAwMDAwODdiLCAweGZmNGFlMjAwLAorCQkweDAwMDAwODgzLCAweGZmNTIwMDAwLCAweDAwMDAwODhiLCAweGZmNTIyMDAwLAorCQkweDAwMDAwODk0LCAweGZmNTI0MDAwLCAweDAwMDAwODljLCAweGZmNTI2MTAwLAorCQkweDAwMDAwOGE0LCAweGZmNTI4MTAwLCAweDAwMDAwOGFjLCAweGZmNTJhMTAwLAorCQkweDAwMDAwOGI0LCAweGZmNTJjMjAwLCAweDAwMDAwOGJkLCAweGZmNTJlMjAwLAorCQkweDAwMDAwOGM1LCAweGZmNWEwMDAwLCAweDAwMDAwOGNkLCAweGZmNWEyMDAwLAorCQkweDAwMDAwOGQ1LCAweGZmNWE0MDAwLCAweDAwMDAwOGRlLCAweGZmNWE2MTAwLAorCQkweDAwMDAwOGU2LCAweGZmNWE4MTAwLCAweDAwMDAwOGVlLCAweGZmNWFhMTAwLAorCQkweDAwMDAwOGY2LCAweGZmNWFjMjAwLCAweDAwMDAwOGZmLCAweGZmNWFlMjAwLAorCQkweDAwMDAwYzAwLCAweGZmNjIwMDAwLCAweDAwMDAwYzA4LCAweGZmNjIyMDAwLAorCQkweDAwMDAwYzEwLCAweGZmNjI0MDAwLCAweDAwMDAwYzE4LCAweGZmNjI2MTAwLAorCQkweDAwMDAwYzIwLCAweGZmNjI4MTAwLCAweDAwMDAwYzI5LCAweGZmNjJhMTAwLAorCQkweDAwMDAwYzMxLCAweGZmNjJjMjAwLCAweDAwMDAwYzM5LCAweGZmNjJlMjAwLAorCQkweDAwMDAwYzQxLCAweGZmNmEwMDAwLCAweDAwMDAwYzRhLCAweGZmNmEyMDAwLAorCQkweDAwMDAwYzUyLCAweGZmNmE0MDAwLCAweDAwMDAwYzVhLCAweGZmNmE2MTAwLAorCQkweDAwMDAwYzYyLCAweGZmNmE4MTAwLCAweDAwMDAwYzZhLCAweGZmNmFhMTAwLAorCQkweDAwMDAwYzczLCAweGZmNmFjMjAwLCAweDAwMDAwYzdiLCAweGZmNmFlMjAwLAorCQkweDAwMDAwYzgzLCAweGZmNzMwMDAwLCAweDAwMDAwYzhiLCAweGZmNzMyMDAwLAorCQkweDAwMDAwYzk0LCAweGZmNzM0MDAwLCAweDAwMDAwYzljLCAweGZmNzM2MTAwLAorCQkweDAwMDAwY2E0LCAweGZmNzM4MTAwLCAweDAwMDAwY2FjLCAweGZmNzNhMTAwLAorCQkweDAwMDAwY2I0LCAweGZmNzNjMjAwLCAweDAwMDAwY2JkLCAweGZmNzNlMjAwLAorCQkweDAwMDAwY2M1LCAweGZmN2IwMDAwLCAweDAwMDAwY2NkLCAweGZmN2IyMDAwLAorCQkweDAwMDAwY2Q1LCAweGZmN2I0MDAwLCAweDAwMDAwY2RlLCAweGZmN2I2MTAwLAorCQkweDAwMDAwY2U2LCAweGZmN2I4MTAwLCAweDAwMDAwY2VlLCAweGZmN2JhMTAwLAorCQkweDAwMDAwY2Y2LCAweGZmN2JjMjAwLCAweDAwMDAwY2ZmLCAweGZmN2JlMjAwLAorCQkweDAwMDAxMDAwLCAweGZmODMwMDAwLCAweDAwMDAxMDA4LCAweGZmODMyMDAwLAorCQkweDAwMDAxMDEwLCAweGZmODM0MDAwLCAweDAwMDAxMDE4LCAweGZmODM2MTAwLAorCQkweDAwMDAxMDIwLCAweGZmODM4MTAwLCAweDAwMDAxMDI5LCAweGZmODNhMTAwLAorCQkweDAwMDAxMDMxLCAweGZmODNjMjAwLCAweDAwMDAxMDM5LCAweGZmODNlMjAwLAorCQkweDAwMDAxMDQxLCAweGZmOGIwMDAwLCAweDAwMDAxMDRhLCAweGZmOGIyMDAwLAorCQkweDAwMDAxMDUyLCAweGZmOGI0MDAwLCAweDAwMDAxMDVhLCAweGZmOGI2MTAwLAorCQkweDAwMDAxMDYyLCAweGZmOGI4MTAwLCAweDAwMDAxMDZhLCAweGZmOGJhMTAwLAorCQkweDAwMDAxMDczLCAweGZmOGJjMjAwLCAweDAwMDAxMDdiLCAweGZmOGJlMjAwLAorCQkweDAwMDAxMDgzLCAweGZmOTQwMDAwLCAweDAwMDAxMDhiLCAweGZmOTQyMDAwLAorCQkweDAwMDAxMDk0LCAweGZmOTQ0MDAwLCAweDAwMDAxMDljLCAweGZmOTQ2MTAwLAorCQkweDAwMDAxMGE0LCAweGZmOTQ4MTAwLCAweDAwMDAxMGFjLCAweGZmOTRhMTAwLAorCQkweDAwMDAxMGI0LCAweGZmOTRjMjAwLCAweDAwMDAxMGJkLCAweGZmOTRlMjAwLAorCQkweDAwMDAxMGM1LCAweGZmOWMwMDAwLCAweDAwMDAxMGNkLCAweGZmOWMyMDAwLAorCQkweDAwMDAxMGQ1LCAweGZmOWM0MDAwLCAweDAwMDAxMGRlLCAweGZmOWM2MTAwLAorCQkweDAwMDAxMGU2LCAweGZmOWM4MTAwLCAweDAwMDAxMGVlLCAweGZmOWNhMTAwLAorCQkweDAwMDAxMGY2LCAweGZmOWNjMjAwLCAweDAwMDAxMGZmLCAweGZmOWNlMjAwLAorCQkweDAwMDAxNDAwLCAweGZmYTQwMDAwLCAweDAwMDAxNDA4LCAweGZmYTQyMDAwLAorCQkweDAwMDAxNDEwLCAweGZmYTQ0MDAwLCAweDAwMDAxNDE4LCAweGZmYTQ2MTAwLAorCQkweDAwMDAxNDIwLCAweGZmYTQ4MTAwLCAweDAwMDAxNDI5LCAweGZmYTRhMTAwLAorCQkweDAwMDAxNDMxLCAweGZmYTRjMjAwLCAweDAwMDAxNDM5LCAweGZmYTRlMjAwLAorCQkweDAwMDAxNDQxLCAweGZmYWMwMDAwLCAweDAwMDAxNDRhLCAweGZmYWMyMDAwLAorCQkweDAwMDAxNDUyLCAweGZmYWM0MDAwLCAweDAwMDAxNDVhLCAweGZmYWM2MTAwLAorCQkweDAwMDAxNDYyLCAweGZmYWM4MTAwLCAweDAwMDAxNDZhLCAweGZmYWNhMTAwLAorCQkweDAwMDAxNDczLCAweGZmYWNjMjAwLCAweDAwMDAxNDdiLCAweGZmYWNlMjAwLAorCQkweDAwMDAxNDgzLCAweGZmYjQwMDAwLCAweDAwMDAxNDhiLCAweGZmYjQyMDAwLAorCQkweDAwMDAxNDk0LCAweGZmYjQ0MDAwLCAweDAwMDAxNDljLCAweGZmYjQ2MTAwLAorCQkweDAwMDAxNGE0LCAweGZmYjQ4MTAwLCAweDAwMDAxNGFjLCAweGZmYjRhMTAwLAorCQkweDAwMDAxNGI0LCAweGZmYjRjMjAwLCAweDAwMDAxNGJkLCAweGZmYjRlMjAwLAorCQkweDAwMDAxNGM1LCAweGZmYmQwMDAwLCAweDAwMDAxNGNkLCAweGZmYmQyMDAwLAorCQkweDAwMDAxNGQ1LCAweGZmYmQ0MDAwLCAweDAwMDAxNGRlLCAweGZmYmQ2MTAwLAorCQkweDAwMDAxNGU2LCAweGZmYmQ4MTAwLCAweDAwMDAxNGVlLCAweGZmYmRhMTAwLAorCQkweDAwMDAxNGY2LCAweGZmYmRjMjAwLCAweDAwMDAxNGZmLCAweGZmYmRlMjAwLAorCQkweDAwMDAxODAwLCAweGZmYzUwMDAwLCAweDAwMDAxODA4LCAweGZmYzUyMDAwLAorCQkweDAwMDAxODEwLCAweGZmYzU0MDAwLCAweDAwMDAxODE4LCAweGZmYzU2MTAwLAorCQkweDAwMDAxODIwLCAweGZmYzU4MTAwLCAweDAwMDAxODI5LCAweGZmYzVhMTAwLAorCQkweDAwMDAxODMxLCAweGZmYzVjMjAwLCAweDAwMDAxODM5LCAweGZmYzVlMjAwLAorCQkweDAwMDAxODQxLCAweGZmY2QwMDAwLCAweDAwMDAxODRhLCAweGZmY2QyMDAwLAorCQkweDAwMDAxODUyLCAweGZmY2Q0MDAwLCAweDAwMDAxODVhLCAweGZmY2Q2MTAwLAorCQkweDAwMDAxODYyLCAweGZmY2Q4MTAwLCAweDAwMDAxODZhLCAweGZmY2RhMTAwLAorCQkweDAwMDAxODczLCAweGZmY2RjMjAwLCAweDAwMDAxODdiLCAweGZmY2RlMjAwLAorCQkweDAwMDAxODgzLCAweGZmZDUwMDAwLCAweDAwMDAxODhiLCAweGZmZDUyMDAwLAorCQkweDAwMDAxODk0LCAweGZmZDU0MDAwLCAweDAwMDAxODljLCAweGZmZDU2MTAwLAorCQkweDAwMDAxOGE0LCAweGZmZDU4MTAwLCAweDAwMDAxOGFjLCAweGZmZDVhMTAwLAorCQkweDAwMDAxOGI0LCAweGZmZDVjMjAwLCAweDAwMDAxOGJkLCAweGZmZDVlMjAwLAorCQkweDAwMDAxOGM1LCAweGZmZGUwMDAwLCAweDAwMDAxOGNkLCAweGZmZGUyMDAwLAorCQkweDAwMDAxOGQ1LCAweGZmZGU0MDAwLCAweDAwMDAxOGRlLCAweGZmZGU2MTAwLAorCQkweDAwMDAxOGU2LCAweGZmZGU4MTAwLCAweDAwMDAxOGVlLCAweGZmZGVhMTAwLAorCQkweDAwMDAxOGY2LCAweGZmZGVjMjAwLCAweDAwMDAxOGZmLCAweGZmZGVlMjAwLAorCQkweDAwMDAxYzAwLCAweGZmZTYwMDAwLCAweDAwMDAxYzA4LCAweGZmZTYyMDAwLAorCQkweDAwMDAxYzEwLCAweGZmZTY0MDAwLCAweDAwMDAxYzE4LCAweGZmZTY2MTAwLAorCQkweDAwMDAxYzIwLCAweGZmZTY4MTAwLCAweDAwMDAxYzI5LCAweGZmZTZhMTAwLAorCQkweDAwMDAxYzMxLCAweGZmZTZjMjAwLCAweDAwMDAxYzM5LCAweGZmZTZlMjAwLAorCQkweDAwMDAxYzQxLCAweGZmZWUwMDAwLCAweDAwMDAxYzRhLCAweGZmZWUyMDAwLAorCQkweDAwMDAxYzUyLCAweGZmZWU0MDAwLCAweDAwMDAxYzVhLCAweGZmZWU2MTAwLAorCQkweDAwMDAxYzYyLCAweGZmZWU4MTAwLCAweDAwMDAxYzZhLCAweGZmZWVhMTAwLAorCQkweDAwMDAxYzczLCAweGZmZWVjMjAwLCAweDAwMDAxYzdiLCAweGZmZWVlMjAwLAorCQkweDAwMDAxYzgzLCAweGZmZjYwMDAwLCAweDAwMDAxYzhiLCAweGZmZjYyMDAwLAorCQkweDAwMDAxYzk0LCAweGZmZjY0MDAwLCAweDAwMDAxYzljLCAweGZmZjY2MTAwLAorCQkweDAwMDAxY2E0LCAweGZmZjY4MTAwLCAweDAwMDAxY2FjLCAweGZmZjZhMTAwLAorCQkweDAwMDAxY2I0LCAweGZmZjZjMjAwLCAweDAwMDAxY2JkLCAweGZmZjZlMjAwLAorCQkweDAwMDAxY2M1LCAweGZmZmYwMDAwLCAweDAwMDAxY2NkLCAweGZmZmYyMDAwLAorCQkweDAwMDAxY2Q1LCAweGZmZmY0MDAwLCAweDAwMDAxY2RlLCAweGZmZmY2MTAwLAorCQkweDAwMDAxY2U2LCAweGZmZmY4MTAwLCAweDAwMDAxY2VlLCAweGZmZmZhMTAwLAorCQkweDAwMDAxY2Y2LCAweGZmZmZjMjAwLCAweDAwMDAxY2ZmLCAweGZmZmZlMjAwCit9Oworc3RhdGljIHZvaWQgQmxpdF9SR0I1NjVfQVJHQjg4ODgoU0RMX0JsaXRJbmZvICppbmZvKQoreworICAgIEJsaXRfUkdCNTY1XzMyKGluZm8sIFJHQjU2NV9BUkdCODg4OF9MVVQpOworfQorCisvKiBTcGVjaWFsIG9wdGltaXplZCBibGl0IGZvciBSR0IgNS02LTUgLS0+IEFCR1IgOC04LTgtOCAqLworc3RhdGljIGNvbnN0IFVpbnQzMiBSR0I1NjVfQUJHUjg4ODhfTFVUWzUxMl0gPSB7CisJCTB4ZmYwMDAwMDAsIDB4MDAwMDAwMDAsIDB4ZmYwODAwMDAsIDB4MDAwMDIwMDAsCisJCTB4ZmYxMDAwMDAsIDB4MDAwMDQwMDAsIDB4ZmYxODAwMDAsIDB4MDAwMDYxMDAsCisJCTB4ZmYyMDAwMDAsIDB4MDAwMDgxMDAsIDB4ZmYyOTAwMDAsIDB4MDAwMGExMDAsCisJCTB4ZmYzMTAwMDAsIDB4MDAwMGMyMDAsIDB4ZmYzOTAwMDAsIDB4MDAwMGUyMDAsCisJCTB4ZmY0MTAwMDAsIDB4MDAwMDAwMDgsIDB4ZmY0YTAwMDAsIDB4MDAwMDIwMDgsCisJCTB4ZmY1MjAwMDAsIDB4MDAwMDQwMDgsIDB4ZmY1YTAwMDAsIDB4MDAwMDYxMDgsCisJCTB4ZmY2MjAwMDAsIDB4MDAwMDgxMDgsIDB4ZmY2YTAwMDAsIDB4MDAwMGExMDgsCisJCTB4ZmY3MzAwMDAsIDB4MDAwMGMyMDgsIDB4ZmY3YjAwMDAsIDB4MDAwMGUyMDgsCisJCTB4ZmY4MzAwMDAsIDB4MDAwMDAwMTAsIDB4ZmY4YjAwMDAsIDB4MDAwMDIwMTAsCisJCTB4ZmY5NDAwMDAsIDB4MDAwMDQwMTAsIDB4ZmY5YzAwMDAsIDB4MDAwMDYxMTAsCisJCTB4ZmZhNDAwMDAsIDB4MDAwMDgxMTAsIDB4ZmZhYzAwMDAsIDB4MDAwMGExMTAsCisJCTB4ZmZiNDAwMDAsIDB4MDAwMGMyMTAsIDB4ZmZiZDAwMDAsIDB4MDAwMGUyMTAsCisJCTB4ZmZjNTAwMDAsIDB4MDAwMDAwMTgsIDB4ZmZjZDAwMDAsIDB4MDAwMDIwMTgsCisJCTB4ZmZkNTAwMDAsIDB4MDAwMDQwMTgsIDB4ZmZkZTAwMDAsIDB4MDAwMDYxMTgsCisJCTB4ZmZlNjAwMDAsIDB4MDAwMDgxMTgsIDB4ZmZlZTAwMDAsIDB4MDAwMGExMTgsCisJCTB4ZmZmNjAwMDAsIDB4MDAwMGMyMTgsIDB4ZmZmZjAwMDAsIDB4MDAwMGUyMTgsCisJCTB4ZmYwMDA0MDAsIDB4MDAwMDAwMjAsIDB4ZmYwODA0MDAsIDB4MDAwMDIwMjAsCisJCTB4ZmYxMDA0MDAsIDB4MDAwMDQwMjAsIDB4ZmYxODA0MDAsIDB4MDAwMDYxMjAsCisJCTB4ZmYyMDA0MDAsIDB4MDAwMDgxMjAsIDB4ZmYyOTA0MDAsIDB4MDAwMGExMjAsCisJCTB4ZmYzMTA0MDAsIDB4MDAwMGMyMjAsIDB4ZmYzOTA0MDAsIDB4MDAwMGUyMjAsCisJCTB4ZmY0MTA0MDAsIDB4MDAwMDAwMjksIDB4ZmY0YTA0MDAsIDB4MDAwMDIwMjksCisJCTB4ZmY1MjA0MDAsIDB4MDAwMDQwMjksIDB4ZmY1YTA0MDAsIDB4MDAwMDYxMjksCisJCTB4ZmY2MjA0MDAsIDB4MDAwMDgxMjksIDB4ZmY2YTA0MDAsIDB4MDAwMGExMjksCisJCTB4ZmY3MzA0MDAsIDB4MDAwMGMyMjksIDB4ZmY3YjA0MDAsIDB4MDAwMGUyMjksCisJCTB4ZmY4MzA0MDAsIDB4MDAwMDAwMzEsIDB4ZmY4YjA0MDAsIDB4MDAwMDIwMzEsCisJCTB4ZmY5NDA0MDAsIDB4MDAwMDQwMzEsIDB4ZmY5YzA0MDAsIDB4MDAwMDYxMzEsCisJCTB4ZmZhNDA0MDAsIDB4MDAwMDgxMzEsIDB4ZmZhYzA0MDAsIDB4MDAwMGExMzEsCisJCTB4ZmZiNDA0MDAsIDB4MDAwMGMyMzEsIDB4ZmZiZDA0MDAsIDB4MDAwMGUyMzEsCisJCTB4ZmZjNTA0MDAsIDB4MDAwMDAwMzksIDB4ZmZjZDA0MDAsIDB4MDAwMDIwMzksCisJCTB4ZmZkNTA0MDAsIDB4MDAwMDQwMzksIDB4ZmZkZTA0MDAsIDB4MDAwMDYxMzksCisJCTB4ZmZlNjA0MDAsIDB4MDAwMDgxMzksIDB4ZmZlZTA0MDAsIDB4MDAwMGExMzksCisJCTB4ZmZmNjA0MDAsIDB4MDAwMGMyMzksIDB4ZmZmZjA0MDAsIDB4MDAwMGUyMzksCisJCTB4ZmYwMDA4MDAsIDB4MDAwMDAwNDEsIDB4ZmYwODA4MDAsIDB4MDAwMDIwNDEsCisJCTB4ZmYxMDA4MDAsIDB4MDAwMDQwNDEsIDB4ZmYxODA4MDAsIDB4MDAwMDYxNDEsCisJCTB4ZmYyMDA4MDAsIDB4MDAwMDgxNDEsIDB4ZmYyOTA4MDAsIDB4MDAwMGExNDEsCisJCTB4ZmYzMTA4MDAsIDB4MDAwMGMyNDEsIDB4ZmYzOTA4MDAsIDB4MDAwMGUyNDEsCisJCTB4ZmY0MTA4MDAsIDB4MDAwMDAwNGEsIDB4ZmY0YTA4MDAsIDB4MDAwMDIwNGEsCisJCTB4ZmY1MjA4MDAsIDB4MDAwMDQwNGEsIDB4ZmY1YTA4MDAsIDB4MDAwMDYxNGEsCisJCTB4ZmY2MjA4MDAsIDB4MDAwMDgxNGEsIDB4ZmY2YTA4MDAsIDB4MDAwMGExNGEsCisJCTB4ZmY3MzA4MDAsIDB4MDAwMGMyNGEsIDB4ZmY3YjA4MDAsIDB4MDAwMGUyNGEsCisJCTB4ZmY4MzA4MDAsIDB4MDAwMDAwNTIsIDB4ZmY4YjA4MDAsIDB4MDAwMDIwNTIsCisJCTB4ZmY5NDA4MDAsIDB4MDAwMDQwNTIsIDB4ZmY5YzA4MDAsIDB4MDAwMDYxNTIsCisJCTB4ZmZhNDA4MDAsIDB4MDAwMDgxNTIsIDB4ZmZhYzA4MDAsIDB4MDAwMGExNTIsCisJCTB4ZmZiNDA4MDAsIDB4MDAwMGMyNTIsIDB4ZmZiZDA4MDAsIDB4MDAwMGUyNTIsCisJCTB4ZmZjNTA4MDAsIDB4MDAwMDAwNWEsIDB4ZmZjZDA4MDAsIDB4MDAwMDIwNWEsCisJCTB4ZmZkNTA4MDAsIDB4MDAwMDQwNWEsIDB4ZmZkZTA4MDAsIDB4MDAwMDYxNWEsCisJCTB4ZmZlNjA4MDAsIDB4MDAwMDgxNWEsIDB4ZmZlZTA4MDAsIDB4MDAwMGExNWEsCisJCTB4ZmZmNjA4MDAsIDB4MDAwMGMyNWEsIDB4ZmZmZjA4MDAsIDB4MDAwMGUyNWEsCisJCTB4ZmYwMDBjMDAsIDB4MDAwMDAwNjIsIDB4ZmYwODBjMDAsIDB4MDAwMDIwNjIsCisJCTB4ZmYxMDBjMDAsIDB4MDAwMDQwNjIsIDB4ZmYxODBjMDAsIDB4MDAwMDYxNjIsCisJCTB4ZmYyMDBjMDAsIDB4MDAwMDgxNjIsIDB4ZmYyOTBjMDAsIDB4MDAwMGExNjIsCisJCTB4ZmYzMTBjMDAsIDB4MDAwMGMyNjIsIDB4ZmYzOTBjMDAsIDB4MDAwMGUyNjIsCisJCTB4ZmY0MTBjMDAsIDB4MDAwMDAwNmEsIDB4ZmY0YTBjMDAsIDB4MDAwMDIwNmEsCisJCTB4ZmY1MjBjMDAsIDB4MDAwMDQwNmEsIDB4ZmY1YTBjMDAsIDB4MDAwMDYxNmEsCisJCTB4ZmY2MjBjMDAsIDB4MDAwMDgxNmEsIDB4ZmY2YTBjMDAsIDB4MDAwMGExNmEsCisJCTB4ZmY3MzBjMDAsIDB4MDAwMGMyNmEsIDB4ZmY3YjBjMDAsIDB4MDAwMGUyNmEsCisJCTB4ZmY4MzBjMDAsIDB4MDAwMDAwNzMsIDB4ZmY4YjBjMDAsIDB4MDAwMDIwNzMsCisJCTB4ZmY5NDBjMDAsIDB4MDAwMDQwNzMsIDB4ZmY5YzBjMDAsIDB4MDAwMDYxNzMsCisJCTB4ZmZhNDBjMDAsIDB4MDAwMDgxNzMsIDB4ZmZhYzBjMDAsIDB4MDAwMGExNzMsCisJCTB4ZmZiNDBjMDAsIDB4MDAwMGMyNzMsIDB4ZmZiZDBjMDAsIDB4MDAwMGUyNzMsCisJCTB4ZmZjNTBjMDAsIDB4MDAwMDAwN2IsIDB4ZmZjZDBjMDAsIDB4MDAwMDIwN2IsCisJCTB4ZmZkNTBjMDAsIDB4MDAwMDQwN2IsIDB4ZmZkZTBjMDAsIDB4MDAwMDYxN2IsCisJCTB4ZmZlNjBjMDAsIDB4MDAwMDgxN2IsIDB4ZmZlZTBjMDAsIDB4MDAwMGExN2IsCisJCTB4ZmZmNjBjMDAsIDB4MDAwMGMyN2IsIDB4ZmZmZjBjMDAsIDB4MDAwMGUyN2IsCisJCTB4ZmYwMDEwMDAsIDB4MDAwMDAwODMsIDB4ZmYwODEwMDAsIDB4MDAwMDIwODMsCisJCTB4ZmYxMDEwMDAsIDB4MDAwMDQwODMsIDB4ZmYxODEwMDAsIDB4MDAwMDYxODMsCisJCTB4ZmYyMDEwMDAsIDB4MDAwMDgxODMsIDB4ZmYyOTEwMDAsIDB4MDAwMGExODMsCisJCTB4ZmYzMTEwMDAsIDB4MDAwMGMyODMsIDB4ZmYzOTEwMDAsIDB4MDAwMGUyODMsCisJCTB4ZmY0MTEwMDAsIDB4MDAwMDAwOGIsIDB4ZmY0YTEwMDAsIDB4MDAwMDIwOGIsCisJCTB4ZmY1MjEwMDAsIDB4MDAwMDQwOGIsIDB4ZmY1YTEwMDAsIDB4MDAwMDYxOGIsCisJCTB4ZmY2MjEwMDAsIDB4MDAwMDgxOGIsIDB4ZmY2YTEwMDAsIDB4MDAwMGExOGIsCisJCTB4ZmY3MzEwMDAsIDB4MDAwMGMyOGIsIDB4ZmY3YjEwMDAsIDB4MDAwMGUyOGIsCisJCTB4ZmY4MzEwMDAsIDB4MDAwMDAwOTQsIDB4ZmY4YjEwMDAsIDB4MDAwMDIwOTQsCisJCTB4ZmY5NDEwMDAsIDB4MDAwMDQwOTQsIDB4ZmY5YzEwMDAsIDB4MDAwMDYxOTQsCisJCTB4ZmZhNDEwMDAsIDB4MDAwMDgxOTQsIDB4ZmZhYzEwMDAsIDB4MDAwMGExOTQsCisJCTB4ZmZiNDEwMDAsIDB4MDAwMGMyOTQsIDB4ZmZiZDEwMDAsIDB4MDAwMGUyOTQsCisJCTB4ZmZjNTEwMDAsIDB4MDAwMDAwOWMsIDB4ZmZjZDEwMDAsIDB4MDAwMDIwOWMsCisJCTB4ZmZkNTEwMDAsIDB4MDAwMDQwOWMsIDB4ZmZkZTEwMDAsIDB4MDAwMDYxOWMsCisJCTB4ZmZlNjEwMDAsIDB4MDAwMDgxOWMsIDB4ZmZlZTEwMDAsIDB4MDAwMGExOWMsCisJCTB4ZmZmNjEwMDAsIDB4MDAwMGMyOWMsIDB4ZmZmZjEwMDAsIDB4MDAwMGUyOWMsCisJCTB4ZmYwMDE0MDAsIDB4MDAwMDAwYTQsIDB4ZmYwODE0MDAsIDB4MDAwMDIwYTQsCisJCTB4ZmYxMDE0MDAsIDB4MDAwMDQwYTQsIDB4ZmYxODE0MDAsIDB4MDAwMDYxYTQsCisJCTB4ZmYyMDE0MDAsIDB4MDAwMDgxYTQsIDB4ZmYyOTE0MDAsIDB4MDAwMGExYTQsCisJCTB4ZmYzMTE0MDAsIDB4MDAwMGMyYTQsIDB4ZmYzOTE0MDAsIDB4MDAwMGUyYTQsCisJCTB4ZmY0MTE0MDAsIDB4MDAwMDAwYWMsIDB4ZmY0YTE0MDAsIDB4MDAwMDIwYWMsCisJCTB4ZmY1MjE0MDAsIDB4MDAwMDQwYWMsIDB4ZmY1YTE0MDAsIDB4MDAwMDYxYWMsCisJCTB4ZmY2MjE0MDAsIDB4MDAwMDgxYWMsIDB4ZmY2YTE0MDAsIDB4MDAwMGExYWMsCisJCTB4ZmY3MzE0MDAsIDB4MDAwMGMyYWMsIDB4ZmY3YjE0MDAsIDB4MDAwMGUyYWMsCisJCTB4ZmY4MzE0MDAsIDB4MDAwMDAwYjQsIDB4ZmY4YjE0MDAsIDB4MDAwMDIwYjQsCisJCTB4ZmY5NDE0MDAsIDB4MDAwMDQwYjQsIDB4ZmY5YzE0MDAsIDB4MDAwMDYxYjQsCisJCTB4ZmZhNDE0MDAsIDB4MDAwMDgxYjQsIDB4ZmZhYzE0MDAsIDB4MDAwMGExYjQsCisJCTB4ZmZiNDE0MDAsIDB4MDAwMGMyYjQsIDB4ZmZiZDE0MDAsIDB4MDAwMGUyYjQsCisJCTB4ZmZjNTE0MDAsIDB4MDAwMDAwYmQsIDB4ZmZjZDE0MDAsIDB4MDAwMDIwYmQsCisJCTB4ZmZkNTE0MDAsIDB4MDAwMDQwYmQsIDB4ZmZkZTE0MDAsIDB4MDAwMDYxYmQsCisJCTB4ZmZlNjE0MDAsIDB4MDAwMDgxYmQsIDB4ZmZlZTE0MDAsIDB4MDAwMGExYmQsCisJCTB4ZmZmNjE0MDAsIDB4MDAwMGMyYmQsIDB4ZmZmZjE0MDAsIDB4MDAwMGUyYmQsCisJCTB4ZmYwMDE4MDAsIDB4MDAwMDAwYzUsIDB4ZmYwODE4MDAsIDB4MDAwMDIwYzUsCisJCTB4ZmYxMDE4MDAsIDB4MDAwMDQwYzUsIDB4ZmYxODE4MDAsIDB4MDAwMDYxYzUsCisJCTB4ZmYyMDE4MDAsIDB4MDAwMDgxYzUsIDB4ZmYyOTE4MDAsIDB4MDAwMGExYzUsCisJCTB4ZmYzMTE4MDAsIDB4MDAwMGMyYzUsIDB4ZmYzOTE4MDAsIDB4MDAwMGUyYzUsCisJCTB4ZmY0MTE4MDAsIDB4MDAwMDAwY2QsIDB4ZmY0YTE4MDAsIDB4MDAwMDIwY2QsCisJCTB4ZmY1MjE4MDAsIDB4MDAwMDQwY2QsIDB4ZmY1YTE4MDAsIDB4MDAwMDYxY2QsCisJCTB4ZmY2MjE4MDAsIDB4MDAwMDgxY2QsIDB4ZmY2YTE4MDAsIDB4MDAwMGExY2QsCisJCTB4ZmY3MzE4MDAsIDB4MDAwMGMyY2QsIDB4ZmY3YjE4MDAsIDB4MDAwMGUyY2QsCisJCTB4ZmY4MzE4MDAsIDB4MDAwMDAwZDUsIDB4ZmY4YjE4MDAsIDB4MDAwMDIwZDUsCisJCTB4ZmY5NDE4MDAsIDB4MDAwMDQwZDUsIDB4ZmY5YzE4MDAsIDB4MDAwMDYxZDUsCisJCTB4ZmZhNDE4MDAsIDB4MDAwMDgxZDUsIDB4ZmZhYzE4MDAsIDB4MDAwMGExZDUsCisJCTB4ZmZiNDE4MDAsIDB4MDAwMGMyZDUsIDB4ZmZiZDE4MDAsIDB4MDAwMGUyZDUsCisJCTB4ZmZjNTE4MDAsIDB4MDAwMDAwZGUsIDB4ZmZjZDE4MDAsIDB4MDAwMDIwZGUsCisJCTB4ZmZkNTE4MDAsIDB4MDAwMDQwZGUsIDB4ZmZkZTE4MDAsIDB4MDAwMDYxZGUsCisJCTB4ZmZlNjE4MDAsIDB4MDAwMDgxZGUsIDB4ZmZlZTE4MDAsIDB4MDAwMGExZGUsCisJCTB4ZmZmNjE4MDAsIDB4MDAwMGMyZGUsIDB4ZmZmZjE4MDAsIDB4MDAwMGUyZGUsCisJCTB4ZmYwMDFjMDAsIDB4MDAwMDAwZTYsIDB4ZmYwODFjMDAsIDB4MDAwMDIwZTYsCisJCTB4ZmYxMDFjMDAsIDB4MDAwMDQwZTYsIDB4ZmYxODFjMDAsIDB4MDAwMDYxZTYsCisJCTB4ZmYyMDFjMDAsIDB4MDAwMDgxZTYsIDB4ZmYyOTFjMDAsIDB4MDAwMGExZTYsCisJCTB4ZmYzMTFjMDAsIDB4MDAwMGMyZTYsIDB4ZmYzOTFjMDAsIDB4MDAwMGUyZTYsCisJCTB4ZmY0MTFjMDAsIDB4MDAwMDAwZWUsIDB4ZmY0YTFjMDAsIDB4MDAwMDIwZWUsCisJCTB4ZmY1MjFjMDAsIDB4MDAwMDQwZWUsIDB4ZmY1YTFjMDAsIDB4MDAwMDYxZWUsCisJCTB4ZmY2MjFjMDAsIDB4MDAwMDgxZWUsIDB4ZmY2YTFjMDAsIDB4MDAwMGExZWUsCisJCTB4ZmY3MzFjMDAsIDB4MDAwMGMyZWUsIDB4ZmY3YjFjMDAsIDB4MDAwMGUyZWUsCisJCTB4ZmY4MzFjMDAsIDB4MDAwMDAwZjYsIDB4ZmY4YjFjMDAsIDB4MDAwMDIwZjYsCisJCTB4ZmY5NDFjMDAsIDB4MDAwMDQwZjYsIDB4ZmY5YzFjMDAsIDB4MDAwMDYxZjYsCisJCTB4ZmZhNDFjMDAsIDB4MDAwMDgxZjYsIDB4ZmZhYzFjMDAsIDB4MDAwMGExZjYsCisJCTB4ZmZiNDFjMDAsIDB4MDAwMGMyZjYsIDB4ZmZiZDFjMDAsIDB4MDAwMGUyZjYsCisJCTB4ZmZjNTFjMDAsIDB4MDAwMDAwZmYsIDB4ZmZjZDFjMDAsIDB4MDAwMDIwZmYsCisJCTB4ZmZkNTFjMDAsIDB4MDAwMDQwZmYsIDB4ZmZkZTFjMDAsIDB4MDAwMDYxZmYsCisJCTB4ZmZlNjFjMDAsIDB4MDAwMDgxZmYsIDB4ZmZlZTFjMDAsIDB4MDAwMGExZmYsCisJCTB4ZmZmNjFjMDAsIDB4MDAwMGMyZmYsIDB4ZmZmZjFjMDAsIDB4MDAwMGUyZmYKK307CitzdGF0aWMgdm9pZCBCbGl0X1JHQjU2NV9BQkdSODg4OChTRExfQmxpdEluZm8gKmluZm8pCit7CisgICAgQmxpdF9SR0I1NjVfMzIoaW5mbywgUkdCNTY1X0FCR1I4ODg4X0xVVCk7Cit9CisKKy8qIFNwZWNpYWwgb3B0aW1pemVkIGJsaXQgZm9yIFJHQiA1LTYtNSAtLT4gUkdCQSA4LTgtOC04ICovCitzdGF0aWMgY29uc3QgVWludDMyIFJHQjU2NV9SR0JBODg4OF9MVVRbNTEyXSA9IHsKKwkJMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDhmZiwgMHgwMDIwMDAwMCwKKwkJMHgwMDAwMTBmZiwgMHgwMDQwMDAwMCwgMHgwMDAwMThmZiwgMHgwMDYxMDAwMCwKKwkJMHgwMDAwMjBmZiwgMHgwMDgxMDAwMCwgMHgwMDAwMjlmZiwgMHgwMGExMDAwMCwKKwkJMHgwMDAwMzFmZiwgMHgwMGMyMDAwMCwgMHgwMDAwMzlmZiwgMHgwMGUyMDAwMCwKKwkJMHgwMDAwNDFmZiwgMHgwODAwMDAwMCwgMHgwMDAwNGFmZiwgMHgwODIwMDAwMCwKKwkJMHgwMDAwNTJmZiwgMHgwODQwMDAwMCwgMHgwMDAwNWFmZiwgMHgwODYxMDAwMCwKKwkJMHgwMDAwNjJmZiwgMHgwODgxMDAwMCwgMHgwMDAwNmFmZiwgMHgwOGExMDAwMCwKKwkJMHgwMDAwNzNmZiwgMHgwOGMyMDAwMCwgMHgwMDAwN2JmZiwgMHgwOGUyMDAwMCwKKwkJMHgwMDAwODNmZiwgMHgxMDAwMDAwMCwgMHgwMDAwOGJmZiwgMHgxMDIwMDAwMCwKKwkJMHgwMDAwOTRmZiwgMHgxMDQwMDAwMCwgMHgwMDAwOWNmZiwgMHgxMDYxMDAwMCwKKwkJMHgwMDAwYTRmZiwgMHgxMDgxMDAwMCwgMHgwMDAwYWNmZiwgMHgxMGExMDAwMCwKKwkJMHgwMDAwYjRmZiwgMHgxMGMyMDAwMCwgMHgwMDAwYmRmZiwgMHgxMGUyMDAwMCwKKwkJMHgwMDAwYzVmZiwgMHgxODAwMDAwMCwgMHgwMDAwY2RmZiwgMHgxODIwMDAwMCwKKwkJMHgwMDAwZDVmZiwgMHgxODQwMDAwMCwgMHgwMDAwZGVmZiwgMHgxODYxMDAwMCwKKwkJMHgwMDAwZTZmZiwgMHgxODgxMDAwMCwgMHgwMDAwZWVmZiwgMHgxOGExMDAwMCwKKwkJMHgwMDAwZjZmZiwgMHgxOGMyMDAwMCwgMHgwMDAwZmZmZiwgMHgxOGUyMDAwMCwKKwkJMHgwMDA0MDBmZiwgMHgyMDAwMDAwMCwgMHgwMDA0MDhmZiwgMHgyMDIwMDAwMCwKKwkJMHgwMDA0MTBmZiwgMHgyMDQwMDAwMCwgMHgwMDA0MThmZiwgMHgyMDYxMDAwMCwKKwkJMHgwMDA0MjBmZiwgMHgyMDgxMDAwMCwgMHgwMDA0MjlmZiwgMHgyMGExMDAwMCwKKwkJMHgwMDA0MzFmZiwgMHgyMGMyMDAwMCwgMHgwMDA0MzlmZiwgMHgyMGUyMDAwMCwKKwkJMHgwMDA0NDFmZiwgMHgyOTAwMDAwMCwgMHgwMDA0NGFmZiwgMHgyOTIwMDAwMCwKKwkJMHgwMDA0NTJmZiwgMHgyOTQwMDAwMCwgMHgwMDA0NWFmZiwgMHgyOTYxMDAwMCwKKwkJMHgwMDA0NjJmZiwgMHgyOTgxMDAwMCwgMHgwMDA0NmFmZiwgMHgyOWExMDAwMCwKKwkJMHgwMDA0NzNmZiwgMHgyOWMyMDAwMCwgMHgwMDA0N2JmZiwgMHgyOWUyMDAwMCwKKwkJMHgwMDA0ODNmZiwgMHgzMTAwMDAwMCwgMHgwMDA0OGJmZiwgMHgzMTIwMDAwMCwKKwkJMHgwMDA0OTRmZiwgMHgzMTQwMDAwMCwgMHgwMDA0OWNmZiwgMHgzMTYxMDAwMCwKKwkJMHgwMDA0YTRmZiwgMHgzMTgxMDAwMCwgMHgwMDA0YWNmZiwgMHgzMWExMDAwMCwKKwkJMHgwMDA0YjRmZiwgMHgzMWMyMDAwMCwgMHgwMDA0YmRmZiwgMHgzMWUyMDAwMCwKKwkJMHgwMDA0YzVmZiwgMHgzOTAwMDAwMCwgMHgwMDA0Y2RmZiwgMHgzOTIwMDAwMCwKKwkJMHgwMDA0ZDVmZiwgMHgzOTQwMDAwMCwgMHgwMDA0ZGVmZiwgMHgzOTYxMDAwMCwKKwkJMHgwMDA0ZTZmZiwgMHgzOTgxMDAwMCwgMHgwMDA0ZWVmZiwgMHgzOWExMDAwMCwKKwkJMHgwMDA0ZjZmZiwgMHgzOWMyMDAwMCwgMHgwMDA0ZmZmZiwgMHgzOWUyMDAwMCwKKwkJMHgwMDA4MDBmZiwgMHg0MTAwMDAwMCwgMHgwMDA4MDhmZiwgMHg0MTIwMDAwMCwKKwkJMHgwMDA4MTBmZiwgMHg0MTQwMDAwMCwgMHgwMDA4MThmZiwgMHg0MTYxMDAwMCwKKwkJMHgwMDA4MjBmZiwgMHg0MTgxMDAwMCwgMHgwMDA4MjlmZiwgMHg0MWExMDAwMCwKKwkJMHgwMDA4MzFmZiwgMHg0MWMyMDAwMCwgMHgwMDA4MzlmZiwgMHg0MWUyMDAwMCwKKwkJMHgwMDA4NDFmZiwgMHg0YTAwMDAwMCwgMHgwMDA4NGFmZiwgMHg0YTIwMDAwMCwKKwkJMHgwMDA4NTJmZiwgMHg0YTQwMDAwMCwgMHgwMDA4NWFmZiwgMHg0YTYxMDAwMCwKKwkJMHgwMDA4NjJmZiwgMHg0YTgxMDAwMCwgMHgwMDA4NmFmZiwgMHg0YWExMDAwMCwKKwkJMHgwMDA4NzNmZiwgMHg0YWMyMDAwMCwgMHgwMDA4N2JmZiwgMHg0YWUyMDAwMCwKKwkJMHgwMDA4ODNmZiwgMHg1MjAwMDAwMCwgMHgwMDA4OGJmZiwgMHg1MjIwMDAwMCwKKwkJMHgwMDA4OTRmZiwgMHg1MjQwMDAwMCwgMHgwMDA4OWNmZiwgMHg1MjYxMDAwMCwKKwkJMHgwMDA4YTRmZiwgMHg1MjgxMDAwMCwgMHgwMDA4YWNmZiwgMHg1MmExMDAwMCwKKwkJMHgwMDA4YjRmZiwgMHg1MmMyMDAwMCwgMHgwMDA4YmRmZiwgMHg1MmUyMDAwMCwKKwkJMHgwMDA4YzVmZiwgMHg1YTAwMDAwMCwgMHgwMDA4Y2RmZiwgMHg1YTIwMDAwMCwKKwkJMHgwMDA4ZDVmZiwgMHg1YTQwMDAwMCwgMHgwMDA4ZGVmZiwgMHg1YTYxMDAwMCwKKwkJMHgwMDA4ZTZmZiwgMHg1YTgxMDAwMCwgMHgwMDA4ZWVmZiwgMHg1YWExMDAwMCwKKwkJMHgwMDA4ZjZmZiwgMHg1YWMyMDAwMCwgMHgwMDA4ZmZmZiwgMHg1YWUyMDAwMCwKKwkJMHgwMDBjMDBmZiwgMHg2MjAwMDAwMCwgMHgwMDBjMDhmZiwgMHg2MjIwMDAwMCwKKwkJMHgwMDBjMTBmZiwgMHg2MjQwMDAwMCwgMHgwMDBjMThmZiwgMHg2MjYxMDAwMCwKKwkJMHgwMDBjMjBmZiwgMHg2MjgxMDAwMCwgMHgwMDBjMjlmZiwgMHg2MmExMDAwMCwKKwkJMHgwMDBjMzFmZiwgMHg2MmMyMDAwMCwgMHgwMDBjMzlmZiwgMHg2MmUyMDAwMCwKKwkJMHgwMDBjNDFmZiwgMHg2YTAwMDAwMCwgMHgwMDBjNGFmZiwgMHg2YTIwMDAwMCwKKwkJMHgwMDBjNTJmZiwgMHg2YTQwMDAwMCwgMHgwMDBjNWFmZiwgMHg2YTYxMDAwMCwKKwkJMHgwMDBjNjJmZiwgMHg2YTgxMDAwMCwgMHgwMDBjNmFmZiwgMHg2YWExMDAwMCwKKwkJMHgwMDBjNzNmZiwgMHg2YWMyMDAwMCwgMHgwMDBjN2JmZiwgMHg2YWUyMDAwMCwKKwkJMHgwMDBjODNmZiwgMHg3MzAwMDAwMCwgMHgwMDBjOGJmZiwgMHg3MzIwMDAwMCwKKwkJMHgwMDBjOTRmZiwgMHg3MzQwMDAwMCwgMHgwMDBjOWNmZiwgMHg3MzYxMDAwMCwKKwkJMHgwMDBjYTRmZiwgMHg3MzgxMDAwMCwgMHgwMDBjYWNmZiwgMHg3M2ExMDAwMCwKKwkJMHgwMDBjYjRmZiwgMHg3M2MyMDAwMCwgMHgwMDBjYmRmZiwgMHg3M2UyMDAwMCwKKwkJMHgwMDBjYzVmZiwgMHg3YjAwMDAwMCwgMHgwMDBjY2RmZiwgMHg3YjIwMDAwMCwKKwkJMHgwMDBjZDVmZiwgMHg3YjQwMDAwMCwgMHgwMDBjZGVmZiwgMHg3YjYxMDAwMCwKKwkJMHgwMDBjZTZmZiwgMHg3YjgxMDAwMCwgMHgwMDBjZWVmZiwgMHg3YmExMDAwMCwKKwkJMHgwMDBjZjZmZiwgMHg3YmMyMDAwMCwgMHgwMDBjZmZmZiwgMHg3YmUyMDAwMCwKKwkJMHgwMDEwMDBmZiwgMHg4MzAwMDAwMCwgMHgwMDEwMDhmZiwgMHg4MzIwMDAwMCwKKwkJMHgwMDEwMTBmZiwgMHg4MzQwMDAwMCwgMHgwMDEwMThmZiwgMHg4MzYxMDAwMCwKKwkJMHgwMDEwMjBmZiwgMHg4MzgxMDAwMCwgMHgwMDEwMjlmZiwgMHg4M2ExMDAwMCwKKwkJMHgwMDEwMzFmZiwgMHg4M2MyMDAwMCwgMHgwMDEwMzlmZiwgMHg4M2UyMDAwMCwKKwkJMHgwMDEwNDFmZiwgMHg4YjAwMDAwMCwgMHgwMDEwNGFmZiwgMHg4YjIwMDAwMCwKKwkJMHgwMDEwNTJmZiwgMHg4YjQwMDAwMCwgMHgwMDEwNWFmZiwgMHg4YjYxMDAwMCwKKwkJMHgwMDEwNjJmZiwgMHg4YjgxMDAwMCwgMHgwMDEwNmFmZiwgMHg4YmExMDAwMCwKKwkJMHgwMDEwNzNmZiwgMHg4YmMyMDAwMCwgMHgwMDEwN2JmZiwgMHg4YmUyMDAwMCwKKwkJMHgwMDEwODNmZiwgMHg5NDAwMDAwMCwgMHgwMDEwOGJmZiwgMHg5NDIwMDAwMCwKKwkJMHgwMDEwOTRmZiwgMHg5NDQwMDAwMCwgMHgwMDEwOWNmZiwgMHg5NDYxMDAwMCwKKwkJMHgwMDEwYTRmZiwgMHg5NDgxMDAwMCwgMHgwMDEwYWNmZiwgMHg5NGExMDAwMCwKKwkJMHgwMDEwYjRmZiwgMHg5NGMyMDAwMCwgMHgwMDEwYmRmZiwgMHg5NGUyMDAwMCwKKwkJMHgwMDEwYzVmZiwgMHg5YzAwMDAwMCwgMHgwMDEwY2RmZiwgMHg5YzIwMDAwMCwKKwkJMHgwMDEwZDVmZiwgMHg5YzQwMDAwMCwgMHgwMDEwZGVmZiwgMHg5YzYxMDAwMCwKKwkJMHgwMDEwZTZmZiwgMHg5YzgxMDAwMCwgMHgwMDEwZWVmZiwgMHg5Y2ExMDAwMCwKKwkJMHgwMDEwZjZmZiwgMHg5Y2MyMDAwMCwgMHgwMDEwZmZmZiwgMHg5Y2UyMDAwMCwKKwkJMHgwMDE0MDBmZiwgMHhhNDAwMDAwMCwgMHgwMDE0MDhmZiwgMHhhNDIwMDAwMCwKKwkJMHgwMDE0MTBmZiwgMHhhNDQwMDAwMCwgMHgwMDE0MThmZiwgMHhhNDYxMDAwMCwKKwkJMHgwMDE0MjBmZiwgMHhhNDgxMDAwMCwgMHgwMDE0MjlmZiwgMHhhNGExMDAwMCwKKwkJMHgwMDE0MzFmZiwgMHhhNGMyMDAwMCwgMHgwMDE0MzlmZiwgMHhhNGUyMDAwMCwKKwkJMHgwMDE0NDFmZiwgMHhhYzAwMDAwMCwgMHgwMDE0NGFmZiwgMHhhYzIwMDAwMCwKKwkJMHgwMDE0NTJmZiwgMHhhYzQwMDAwMCwgMHgwMDE0NWFmZiwgMHhhYzYxMDAwMCwKKwkJMHgwMDE0NjJmZiwgMHhhYzgxMDAwMCwgMHgwMDE0NmFmZiwgMHhhY2ExMDAwMCwKKwkJMHgwMDE0NzNmZiwgMHhhY2MyMDAwMCwgMHgwMDE0N2JmZiwgMHhhY2UyMDAwMCwKKwkJMHgwMDE0ODNmZiwgMHhiNDAwMDAwMCwgMHgwMDE0OGJmZiwgMHhiNDIwMDAwMCwKKwkJMHgwMDE0OTRmZiwgMHhiNDQwMDAwMCwgMHgwMDE0OWNmZiwgMHhiNDYxMDAwMCwKKwkJMHgwMDE0YTRmZiwgMHhiNDgxMDAwMCwgMHgwMDE0YWNmZiwgMHhiNGExMDAwMCwKKwkJMHgwMDE0YjRmZiwgMHhiNGMyMDAwMCwgMHgwMDE0YmRmZiwgMHhiNGUyMDAwMCwKKwkJMHgwMDE0YzVmZiwgMHhiZDAwMDAwMCwgMHgwMDE0Y2RmZiwgMHhiZDIwMDAwMCwKKwkJMHgwMDE0ZDVmZiwgMHhiZDQwMDAwMCwgMHgwMDE0ZGVmZiwgMHhiZDYxMDAwMCwKKwkJMHgwMDE0ZTZmZiwgMHhiZDgxMDAwMCwgMHgwMDE0ZWVmZiwgMHhiZGExMDAwMCwKKwkJMHgwMDE0ZjZmZiwgMHhiZGMyMDAwMCwgMHgwMDE0ZmZmZiwgMHhiZGUyMDAwMCwKKwkJMHgwMDE4MDBmZiwgMHhjNTAwMDAwMCwgMHgwMDE4MDhmZiwgMHhjNTIwMDAwMCwKKwkJMHgwMDE4MTBmZiwgMHhjNTQwMDAwMCwgMHgwMDE4MThmZiwgMHhjNTYxMDAwMCwKKwkJMHgwMDE4MjBmZiwgMHhjNTgxMDAwMCwgMHgwMDE4MjlmZiwgMHhjNWExMDAwMCwKKwkJMHgwMDE4MzFmZiwgMHhjNWMyMDAwMCwgMHgwMDE4MzlmZiwgMHhjNWUyMDAwMCwKKwkJMHgwMDE4NDFmZiwgMHhjZDAwMDAwMCwgMHgwMDE4NGFmZiwgMHhjZDIwMDAwMCwKKwkJMHgwMDE4NTJmZiwgMHhjZDQwMDAwMCwgMHgwMDE4NWFmZiwgMHhjZDYxMDAwMCwKKwkJMHgwMDE4NjJmZiwgMHhjZDgxMDAwMCwgMHgwMDE4NmFmZiwgMHhjZGExMDAwMCwKKwkJMHgwMDE4NzNmZiwgMHhjZGMyMDAwMCwgMHgwMDE4N2JmZiwgMHhjZGUyMDAwMCwKKwkJMHgwMDE4ODNmZiwgMHhkNTAwMDAwMCwgMHgwMDE4OGJmZiwgMHhkNTIwMDAwMCwKKwkJMHgwMDE4OTRmZiwgMHhkNTQwMDAwMCwgMHgwMDE4OWNmZiwgMHhkNTYxMDAwMCwKKwkJMHgwMDE4YTRmZiwgMHhkNTgxMDAwMCwgMHgwMDE4YWNmZiwgMHhkNWExMDAwMCwKKwkJMHgwMDE4YjRmZiwgMHhkNWMyMDAwMCwgMHgwMDE4YmRmZiwgMHhkNWUyMDAwMCwKKwkJMHgwMDE4YzVmZiwgMHhkZTAwMDAwMCwgMHgwMDE4Y2RmZiwgMHhkZTIwMDAwMCwKKwkJMHgwMDE4ZDVmZiwgMHhkZTQwMDAwMCwgMHgwMDE4ZGVmZiwgMHhkZTYxMDAwMCwKKwkJMHgwMDE4ZTZmZiwgMHhkZTgxMDAwMCwgMHgwMDE4ZWVmZiwgMHhkZWExMDAwMCwKKwkJMHgwMDE4ZjZmZiwgMHhkZWMyMDAwMCwgMHgwMDE4ZmZmZiwgMHhkZWUyMDAwMCwKKwkJMHgwMDFjMDBmZiwgMHhlNjAwMDAwMCwgMHgwMDFjMDhmZiwgMHhlNjIwMDAwMCwKKwkJMHgwMDFjMTBmZiwgMHhlNjQwMDAwMCwgMHgwMDFjMThmZiwgMHhlNjYxMDAwMCwKKwkJMHgwMDFjMjBmZiwgMHhlNjgxMDAwMCwgMHgwMDFjMjlmZiwgMHhlNmExMDAwMCwKKwkJMHgwMDFjMzFmZiwgMHhlNmMyMDAwMCwgMHgwMDFjMzlmZiwgMHhlNmUyMDAwMCwKKwkJMHgwMDFjNDFmZiwgMHhlZTAwMDAwMCwgMHgwMDFjNGFmZiwgMHhlZTIwMDAwMCwKKwkJMHgwMDFjNTJmZiwgMHhlZTQwMDAwMCwgMHgwMDFjNWFmZiwgMHhlZTYxMDAwMCwKKwkJMHgwMDFjNjJmZiwgMHhlZTgxMDAwMCwgMHgwMDFjNmFmZiwgMHhlZWExMDAwMCwKKwkJMHgwMDFjNzNmZiwgMHhlZWMyMDAwMCwgMHgwMDFjN2JmZiwgMHhlZWUyMDAwMCwKKwkJMHgwMDFjODNmZiwgMHhmNjAwMDAwMCwgMHgwMDFjOGJmZiwgMHhmNjIwMDAwMCwKKwkJMHgwMDFjOTRmZiwgMHhmNjQwMDAwMCwgMHgwMDFjOWNmZiwgMHhmNjYxMDAwMCwKKwkJMHgwMDFjYTRmZiwgMHhmNjgxMDAwMCwgMHgwMDFjYWNmZiwgMHhmNmExMDAwMCwKKwkJMHgwMDFjYjRmZiwgMHhmNmMyMDAwMCwgMHgwMDFjYmRmZiwgMHhmNmUyMDAwMCwKKwkJMHgwMDFjYzVmZiwgMHhmZjAwMDAwMCwgMHgwMDFjY2RmZiwgMHhmZjIwMDAwMCwKKwkJMHgwMDFjZDVmZiwgMHhmZjQwMDAwMCwgMHgwMDFjZGVmZiwgMHhmZjYxMDAwMCwKKwkJMHgwMDFjZTZmZiwgMHhmZjgxMDAwMCwgMHgwMDFjZWVmZiwgMHhmZmExMDAwMCwKKwkJMHgwMDFjZjZmZiwgMHhmZmMyMDAwMCwgMHgwMDFjZmZmZiwgMHhmZmUyMDAwMCwKK307CitzdGF0aWMgdm9pZCBCbGl0X1JHQjU2NV9SR0JBODg4OChTRExfQmxpdEluZm8gKmluZm8pCit7CisgICAgQmxpdF9SR0I1NjVfMzIoaW5mbywgUkdCNTY1X1JHQkE4ODg4X0xVVCk7Cit9CisKKy8qIFNwZWNpYWwgb3B0aW1pemVkIGJsaXQgZm9yIFJHQiA1LTYtNSAtLT4gQkdSQSA4LTgtOC04ICovCitzdGF0aWMgY29uc3QgVWludDMyIFJHQjU2NV9CR1JBODg4OF9MVVRbNTEyXSA9IHsKKwkJMHgwMDAwMDAwMCwgMHgwMDAwMDBmZiwgMHgwODAwMDAwMCwgMHgwMDIwMDBmZiwKKwkJMHgxMDAwMDAwMCwgMHgwMDQwMDBmZiwgMHgxODAwMDAwMCwgMHgwMDYxMDBmZiwKKwkJMHgyMDAwMDAwMCwgMHgwMDgxMDBmZiwgMHgyOTAwMDAwMCwgMHgwMGExMDBmZiwKKwkJMHgzMTAwMDAwMCwgMHgwMGMyMDBmZiwgMHgzOTAwMDAwMCwgMHgwMGUyMDBmZiwKKwkJMHg0MTAwMDAwMCwgMHgwMDAwMDhmZiwgMHg0YTAwMDAwMCwgMHgwMDIwMDhmZiwKKwkJMHg1MjAwMDAwMCwgMHgwMDQwMDhmZiwgMHg1YTAwMDAwMCwgMHgwMDYxMDhmZiwKKwkJMHg2MjAwMDAwMCwgMHgwMDgxMDhmZiwgMHg2YTAwMDAwMCwgMHgwMGExMDhmZiwKKwkJMHg3MzAwMDAwMCwgMHgwMGMyMDhmZiwgMHg3YjAwMDAwMCwgMHgwMGUyMDhmZiwKKwkJMHg4MzAwMDAwMCwgMHgwMDAwMTBmZiwgMHg4YjAwMDAwMCwgMHgwMDIwMTBmZiwKKwkJMHg5NDAwMDAwMCwgMHgwMDQwMTBmZiwgMHg5YzAwMDAwMCwgMHgwMDYxMTBmZiwKKwkJMHhhNDAwMDAwMCwgMHgwMDgxMTBmZiwgMHhhYzAwMDAwMCwgMHgwMGExMTBmZiwKKwkJMHhiNDAwMDAwMCwgMHgwMGMyMTBmZiwgMHhiZDAwMDAwMCwgMHgwMGUyMTBmZiwKKwkJMHhjNTAwMDAwMCwgMHgwMDAwMThmZiwgMHhjZDAwMDAwMCwgMHgwMDIwMThmZiwKKwkJMHhkNTAwMDAwMCwgMHgwMDQwMThmZiwgMHhkZTAwMDAwMCwgMHgwMDYxMThmZiwKKwkJMHhlNjAwMDAwMCwgMHgwMDgxMThmZiwgMHhlZTAwMDAwMCwgMHgwMGExMThmZiwKKwkJMHhmNjAwMDAwMCwgMHgwMGMyMThmZiwgMHhmZjAwMDAwMCwgMHgwMGUyMThmZiwKKwkJMHgwMDA0MDAwMCwgMHgwMDAwMjBmZiwgMHgwODA0MDAwMCwgMHgwMDIwMjBmZiwKKwkJMHgxMDA0MDAwMCwgMHgwMDQwMjBmZiwgMHgxODA0MDAwMCwgMHgwMDYxMjBmZiwKKwkJMHgyMDA0MDAwMCwgMHgwMDgxMjBmZiwgMHgyOTA0MDAwMCwgMHgwMGExMjBmZiwKKwkJMHgzMTA0MDAwMCwgMHgwMGMyMjBmZiwgMHgzOTA0MDAwMCwgMHgwMGUyMjBmZiwKKwkJMHg0MTA0MDAwMCwgMHgwMDAwMjlmZiwgMHg0YTA0MDAwMCwgMHgwMDIwMjlmZiwKKwkJMHg1MjA0MDAwMCwgMHgwMDQwMjlmZiwgMHg1YTA0MDAwMCwgMHgwMDYxMjlmZiwKKwkJMHg2MjA0MDAwMCwgMHgwMDgxMjlmZiwgMHg2YTA0MDAwMCwgMHgwMGExMjlmZiwKKwkJMHg3MzA0MDAwMCwgMHgwMGMyMjlmZiwgMHg3YjA0MDAwMCwgMHgwMGUyMjlmZiwKKwkJMHg4MzA0MDAwMCwgMHgwMDAwMzFmZiwgMHg4YjA0MDAwMCwgMHgwMDIwMzFmZiwKKwkJMHg5NDA0MDAwMCwgMHgwMDQwMzFmZiwgMHg5YzA0MDAwMCwgMHgwMDYxMzFmZiwKKwkJMHhhNDA0MDAwMCwgMHgwMDgxMzFmZiwgMHhhYzA0MDAwMCwgMHgwMGExMzFmZiwKKwkJMHhiNDA0MDAwMCwgMHgwMGMyMzFmZiwgMHhiZDA0MDAwMCwgMHgwMGUyMzFmZiwKKwkJMHhjNTA0MDAwMCwgMHgwMDAwMzlmZiwgMHhjZDA0MDAwMCwgMHgwMDIwMzlmZiwKKwkJMHhkNTA0MDAwMCwgMHgwMDQwMzlmZiwgMHhkZTA0MDAwMCwgMHgwMDYxMzlmZiwKKwkJMHhlNjA0MDAwMCwgMHgwMDgxMzlmZiwgMHhlZTA0MDAwMCwgMHgwMGExMzlmZiwKKwkJMHhmNjA0MDAwMCwgMHgwMGMyMzlmZiwgMHhmZjA0MDAwMCwgMHgwMGUyMzlmZiwKKwkJMHgwMDA4MDAwMCwgMHgwMDAwNDFmZiwgMHgwODA4MDAwMCwgMHgwMDIwNDFmZiwKKwkJMHgxMDA4MDAwMCwgMHgwMDQwNDFmZiwgMHgxODA4MDAwMCwgMHgwMDYxNDFmZiwKKwkJMHgyMDA4MDAwMCwgMHgwMDgxNDFmZiwgMHgyOTA4MDAwMCwgMHgwMGExNDFmZiwKKwkJMHgzMTA4MDAwMCwgMHgwMGMyNDFmZiwgMHgzOTA4MDAwMCwgMHgwMGUyNDFmZiwKKwkJMHg0MTA4MDAwMCwgMHgwMDAwNGFmZiwgMHg0YTA4MDAwMCwgMHgwMDIwNGFmZiwKKwkJMHg1MjA4MDAwMCwgMHgwMDQwNGFmZiwgMHg1YTA4MDAwMCwgMHgwMDYxNGFmZiwKKwkJMHg2MjA4MDAwMCwgMHgwMDgxNGFmZiwgMHg2YTA4MDAwMCwgMHgwMGExNGFmZiwKKwkJMHg3MzA4MDAwMCwgMHgwMGMyNGFmZiwgMHg3YjA4MDAwMCwgMHgwMGUyNGFmZiwKKwkJMHg4MzA4MDAwMCwgMHgwMDAwNTJmZiwgMHg4YjA4MDAwMCwgMHgwMDIwNTJmZiwKKwkJMHg5NDA4MDAwMCwgMHgwMDQwNTJmZiwgMHg5YzA4MDAwMCwgMHgwMDYxNTJmZiwKKwkJMHhhNDA4MDAwMCwgMHgwMDgxNTJmZiwgMHhhYzA4MDAwMCwgMHgwMGExNTJmZiwKKwkJMHhiNDA4MDAwMCwgMHgwMGMyNTJmZiwgMHhiZDA4MDAwMCwgMHgwMGUyNTJmZiwKKwkJMHhjNTA4MDAwMCwgMHgwMDAwNWFmZiwgMHhjZDA4MDAwMCwgMHgwMDIwNWFmZiwKKwkJMHhkNTA4MDAwMCwgMHgwMDQwNWFmZiwgMHhkZTA4MDAwMCwgMHgwMDYxNWFmZiwKKwkJMHhlNjA4MDAwMCwgMHgwMDgxNWFmZiwgMHhlZTA4MDAwMCwgMHgwMGExNWFmZiwKKwkJMHhmNjA4MDAwMCwgMHgwMGMyNWFmZiwgMHhmZjA4MDAwMCwgMHgwMGUyNWFmZiwKKwkJMHgwMDBjMDAwMCwgMHgwMDAwNjJmZiwgMHgwODBjMDAwMCwgMHgwMDIwNjJmZiwKKwkJMHgxMDBjMDAwMCwgMHgwMDQwNjJmZiwgMHgxODBjMDAwMCwgMHgwMDYxNjJmZiwKKwkJMHgyMDBjMDAwMCwgMHgwMDgxNjJmZiwgMHgyOTBjMDAwMCwgMHgwMGExNjJmZiwKKwkJMHgzMTBjMDAwMCwgMHgwMGMyNjJmZiwgMHgzOTBjMDAwMCwgMHgwMGUyNjJmZiwKKwkJMHg0MTBjMDAwMCwgMHgwMDAwNmFmZiwgMHg0YTBjMDAwMCwgMHgwMDIwNmFmZiwKKwkJMHg1MjBjMDAwMCwgMHgwMDQwNmFmZiwgMHg1YTBjMDAwMCwgMHgwMDYxNmFmZiwKKwkJMHg2MjBjMDAwMCwgMHgwMDgxNmFmZiwgMHg2YTBjMDAwMCwgMHgwMGExNmFmZiwKKwkJMHg3MzBjMDAwMCwgMHgwMGMyNmFmZiwgMHg3YjBjMDAwMCwgMHgwMGUyNmFmZiwKKwkJMHg4MzBjMDAwMCwgMHgwMDAwNzNmZiwgMHg4YjBjMDAwMCwgMHgwMDIwNzNmZiwKKwkJMHg5NDBjMDAwMCwgMHgwMDQwNzNmZiwgMHg5YzBjMDAwMCwgMHgwMDYxNzNmZiwKKwkJMHhhNDBjMDAwMCwgMHgwMDgxNzNmZiwgMHhhYzBjMDAwMCwgMHgwMGExNzNmZiwKKwkJMHhiNDBjMDAwMCwgMHgwMGMyNzNmZiwgMHhiZDBjMDAwMCwgMHgwMGUyNzNmZiwKKwkJMHhjNTBjMDAwMCwgMHgwMDAwN2JmZiwgMHhjZDBjMDAwMCwgMHgwMDIwN2JmZiwKKwkJMHhkNTBjMDAwMCwgMHgwMDQwN2JmZiwgMHhkZTBjMDAwMCwgMHgwMDYxN2JmZiwKKwkJMHhlNjBjMDAwMCwgMHgwMDgxN2JmZiwgMHhlZTBjMDAwMCwgMHgwMGExN2JmZiwKKwkJMHhmNjBjMDAwMCwgMHgwMGMyN2JmZiwgMHhmZjBjMDAwMCwgMHgwMGUyN2JmZiwKKwkJMHgwMDEwMDAwMCwgMHgwMDAwODNmZiwgMHgwODEwMDAwMCwgMHgwMDIwODNmZiwKKwkJMHgxMDEwMDAwMCwgMHgwMDQwODNmZiwgMHgxODEwMDAwMCwgMHgwMDYxODNmZiwKKwkJMHgyMDEwMDAwMCwgMHgwMDgxODNmZiwgMHgyOTEwMDAwMCwgMHgwMGExODNmZiwKKwkJMHgzMTEwMDAwMCwgMHgwMGMyODNmZiwgMHgzOTEwMDAwMCwgMHgwMGUyODNmZiwKKwkJMHg0MTEwMDAwMCwgMHgwMDAwOGJmZiwgMHg0YTEwMDAwMCwgMHgwMDIwOGJmZiwKKwkJMHg1MjEwMDAwMCwgMHgwMDQwOGJmZiwgMHg1YTEwMDAwMCwgMHgwMDYxOGJmZiwKKwkJMHg2MjEwMDAwMCwgMHgwMDgxOGJmZiwgMHg2YTEwMDAwMCwgMHgwMGExOGJmZiwKKwkJMHg3MzEwMDAwMCwgMHgwMGMyOGJmZiwgMHg3YjEwMDAwMCwgMHgwMGUyOGJmZiwKKwkJMHg4MzEwMDAwMCwgMHgwMDAwOTRmZiwgMHg4YjEwMDAwMCwgMHgwMDIwOTRmZiwKKwkJMHg5NDEwMDAwMCwgMHgwMDQwOTRmZiwgMHg5YzEwMDAwMCwgMHgwMDYxOTRmZiwKKwkJMHhhNDEwMDAwMCwgMHgwMDgxOTRmZiwgMHhhYzEwMDAwMCwgMHgwMGExOTRmZiwKKwkJMHhiNDEwMDAwMCwgMHgwMGMyOTRmZiwgMHhiZDEwMDAwMCwgMHgwMGUyOTRmZiwKKwkJMHhjNTEwMDAwMCwgMHgwMDAwOWNmZiwgMHhjZDEwMDAwMCwgMHgwMDIwOWNmZiwKKwkJMHhkNTEwMDAwMCwgMHgwMDQwOWNmZiwgMHhkZTEwMDAwMCwgMHgwMDYxOWNmZiwKKwkJMHhlNjEwMDAwMCwgMHgwMDgxOWNmZiwgMHhlZTEwMDAwMCwgMHgwMGExOWNmZiwKKwkJMHhmNjEwMDAwMCwgMHgwMGMyOWNmZiwgMHhmZjEwMDAwMCwgMHgwMGUyOWNmZiwKKwkJMHgwMDE0MDAwMCwgMHgwMDAwYTRmZiwgMHgwODE0MDAwMCwgMHgwMDIwYTRmZiwKKwkJMHgxMDE0MDAwMCwgMHgwMDQwYTRmZiwgMHgxODE0MDAwMCwgMHgwMDYxYTRmZiwKKwkJMHgyMDE0MDAwMCwgMHgwMDgxYTRmZiwgMHgyOTE0MDAwMCwgMHgwMGExYTRmZiwKKwkJMHgzMTE0MDAwMCwgMHgwMGMyYTRmZiwgMHgzOTE0MDAwMCwgMHgwMGUyYTRmZiwKKwkJMHg0MTE0MDAwMCwgMHgwMDAwYWNmZiwgMHg0YTE0MDAwMCwgMHgwMDIwYWNmZiwKKwkJMHg1MjE0MDAwMCwgMHgwMDQwYWNmZiwgMHg1YTE0MDAwMCwgMHgwMDYxYWNmZiwKKwkJMHg2MjE0MDAwMCwgMHgwMDgxYWNmZiwgMHg2YTE0MDAwMCwgMHgwMGExYWNmZiwKKwkJMHg3MzE0MDAwMCwgMHgwMGMyYWNmZiwgMHg3YjE0MDAwMCwgMHgwMGUyYWNmZiwKKwkJMHg4MzE0MDAwMCwgMHgwMDAwYjRmZiwgMHg4YjE0MDAwMCwgMHgwMDIwYjRmZiwKKwkJMHg5NDE0MDAwMCwgMHgwMDQwYjRmZiwgMHg5YzE0MDAwMCwgMHgwMDYxYjRmZiwKKwkJMHhhNDE0MDAwMCwgMHgwMDgxYjRmZiwgMHhhYzE0MDAwMCwgMHgwMGExYjRmZiwKKwkJMHhiNDE0MDAwMCwgMHgwMGMyYjRmZiwgMHhiZDE0MDAwMCwgMHgwMGUyYjRmZiwKKwkJMHhjNTE0MDAwMCwgMHgwMDAwYmRmZiwgMHhjZDE0MDAwMCwgMHgwMDIwYmRmZiwKKwkJMHhkNTE0MDAwMCwgMHgwMDQwYmRmZiwgMHhkZTE0MDAwMCwgMHgwMDYxYmRmZiwKKwkJMHhlNjE0MDAwMCwgMHgwMDgxYmRmZiwgMHhlZTE0MDAwMCwgMHgwMGExYmRmZiwKKwkJMHhmNjE0MDAwMCwgMHgwMGMyYmRmZiwgMHhmZjE0MDAwMCwgMHgwMGUyYmRmZiwKKwkJMHgwMDE4MDAwMCwgMHgwMDAwYzVmZiwgMHgwODE4MDAwMCwgMHgwMDIwYzVmZiwKKwkJMHgxMDE4MDAwMCwgMHgwMDQwYzVmZiwgMHgxODE4MDAwMCwgMHgwMDYxYzVmZiwKKwkJMHgyMDE4MDAwMCwgMHgwMDgxYzVmZiwgMHgyOTE4MDAwMCwgMHgwMGExYzVmZiwKKwkJMHgzMTE4MDAwMCwgMHgwMGMyYzVmZiwgMHgzOTE4MDAwMCwgMHgwMGUyYzVmZiwKKwkJMHg0MTE4MDAwMCwgMHgwMDAwY2RmZiwgMHg0YTE4MDAwMCwgMHgwMDIwY2RmZiwKKwkJMHg1MjE4MDAwMCwgMHgwMDQwY2RmZiwgMHg1YTE4MDAwMCwgMHgwMDYxY2RmZiwKKwkJMHg2MjE4MDAwMCwgMHgwMDgxY2RmZiwgMHg2YTE4MDAwMCwgMHgwMGExY2RmZiwKKwkJMHg3MzE4MDAwMCwgMHgwMGMyY2RmZiwgMHg3YjE4MDAwMCwgMHgwMGUyY2RmZiwKKwkJMHg4MzE4MDAwMCwgMHgwMDAwZDVmZiwgMHg4YjE4MDAwMCwgMHgwMDIwZDVmZiwKKwkJMHg5NDE4MDAwMCwgMHgwMDQwZDVmZiwgMHg5YzE4MDAwMCwgMHgwMDYxZDVmZiwKKwkJMHhhNDE4MDAwMCwgMHgwMDgxZDVmZiwgMHhhYzE4MDAwMCwgMHgwMGExZDVmZiwKKwkJMHhiNDE4MDAwMCwgMHgwMGMyZDVmZiwgMHhiZDE4MDAwMCwgMHgwMGUyZDVmZiwKKwkJMHhjNTE4MDAwMCwgMHgwMDAwZGVmZiwgMHhjZDE4MDAwMCwgMHgwMDIwZGVmZiwKKwkJMHhkNTE4MDAwMCwgMHgwMDQwZGVmZiwgMHhkZTE4MDAwMCwgMHgwMDYxZGVmZiwKKwkJMHhlNjE4MDAwMCwgMHgwMDgxZGVmZiwgMHhlZTE4MDAwMCwgMHgwMGExZGVmZiwKKwkJMHhmNjE4MDAwMCwgMHgwMGMyZGVmZiwgMHhmZjE4MDAwMCwgMHgwMGUyZGVmZiwKKwkJMHgwMDFjMDAwMCwgMHgwMDAwZTZmZiwgMHgwODFjMDAwMCwgMHgwMDIwZTZmZiwKKwkJMHgxMDFjMDAwMCwgMHgwMDQwZTZmZiwgMHgxODFjMDAwMCwgMHgwMDYxZTZmZiwKKwkJMHgyMDFjMDAwMCwgMHgwMDgxZTZmZiwgMHgyOTFjMDAwMCwgMHgwMGExZTZmZiwKKwkJMHgzMTFjMDAwMCwgMHgwMGMyZTZmZiwgMHgzOTFjMDAwMCwgMHgwMGUyZTZmZiwKKwkJMHg0MTFjMDAwMCwgMHgwMDAwZWVmZiwgMHg0YTFjMDAwMCwgMHgwMDIwZWVmZiwKKwkJMHg1MjFjMDAwMCwgMHgwMDQwZWVmZiwgMHg1YTFjMDAwMCwgMHgwMDYxZWVmZiwKKwkJMHg2MjFjMDAwMCwgMHgwMDgxZWVmZiwgMHg2YTFjMDAwMCwgMHgwMGExZWVmZiwKKwkJMHg3MzFjMDAwMCwgMHgwMGMyZWVmZiwgMHg3YjFjMDAwMCwgMHgwMGUyZWVmZiwKKwkJMHg4MzFjMDAwMCwgMHgwMDAwZjZmZiwgMHg4YjFjMDAwMCwgMHgwMDIwZjZmZiwKKwkJMHg5NDFjMDAwMCwgMHgwMDQwZjZmZiwgMHg5YzFjMDAwMCwgMHgwMDYxZjZmZiwKKwkJMHhhNDFjMDAwMCwgMHgwMDgxZjZmZiwgMHhhYzFjMDAwMCwgMHgwMGExZjZmZiwKKwkJMHhiNDFjMDAwMCwgMHgwMGMyZjZmZiwgMHhiZDFjMDAwMCwgMHgwMGUyZjZmZiwKKwkJMHhjNTFjMDAwMCwgMHgwMDAwZmZmZiwgMHhjZDFjMDAwMCwgMHgwMDIwZmZmZiwKKwkJMHhkNTFjMDAwMCwgMHgwMDQwZmZmZiwgMHhkZTFjMDAwMCwgMHgwMDYxZmZmZiwKKwkJMHhlNjFjMDAwMCwgMHgwMDgxZmZmZiwgMHhlZTFjMDAwMCwgMHgwMGExZmZmZiwKKwkJMHhmNjFjMDAwMCwgMHgwMGMyZmZmZiwgMHhmZjFjMDAwMCwgMHgwMGUyZmZmZgorfTsKK3N0YXRpYyB2b2lkIEJsaXRfUkdCNTY1X0JHUkE4ODg4KFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKyAgICBCbGl0X1JHQjU2NV8zMihpbmZvLCBSR0I1NjVfQkdSQTg4ODhfTFVUKTsKK30KKworLyogU3BlY2lhbCBvcHRpbWl6ZWQgYmxpdCBmb3IgUkdCIDgtOC04IC0tPiBSR0IgMy0zLTIgKi8KKyNpZm5kZWYgUkdCODg4X1JHQjMzMgorI2RlZmluZSBSR0I4ODhfUkdCMzMyKGRzdCwgc3JjKSB7IFwKKwlkc3QgPSAoKChzcmMpJjB4MDBFMDAwMDApPj4xNil8IFwKKwkgICAgICAoKChzcmMpJjB4MDAwMEUwMDApPj4xMSl8IFwKKwkgICAgICAoKChzcmMpJjB4MDAwMDAwQzApPj42KTsgXAorfQorI2VuZGlmCitzdGF0aWMgdm9pZCBCbGl0X1JHQjg4OF9pbmRleDhfbWFwKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKyNpZm5kZWYgVVNFX0RVRkZTX0xPT1AKKwlpbnQgYzsKKyNlbmRpZgorCWludCBQaXhlbDsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlVaW50MzIgKnNyYzsKKwljb25zdCBVaW50OCAqbWFwOworCVVpbnQ4ICpkc3Q7CisJaW50IHNyY3NraXAsIGRzdHNraXA7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwl3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJc3JjID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworCXNyY3NraXAgPSBpbmZvLT5zX3NraXAvNDsKKwlkc3QgPSBpbmZvLT5kX3BpeGVsczsKKwlkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCW1hcCA9IGluZm8tPnRhYmxlOworCisjaWZkZWYgVVNFX0RVRkZTX0xPT1AKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCQlEVUZGU19MT09QKAorCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7CisJCQkqZHN0KysgPSBtYXBbUGl4ZWxdOworCQkJKytzcmM7CisJCSwgd2lkdGgpOworCQlzcmMgKz0gc3Jjc2tpcDsKKwkJZHN0ICs9IGRzdHNraXA7CisJfQorI2Vsc2UKKwl3aGlsZSAoIGhlaWdodC0tICkgeworCQlmb3IgKCBjPXdpZHRoLzQ7IGM7IC0tYyApIHsKKwkJCS8qIFBhY2sgUkdCIGludG8gOGJpdCBwaXhlbCAqLworCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7CisJCQkqZHN0KysgPSBtYXBbUGl4ZWxdOworCQkJKytzcmM7CisJCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKKwkJCSpkc3QrKyA9IG1hcFtQaXhlbF07CisJCQkrK3NyYzsKKwkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOworCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKKwkJCSsrc3JjOworCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7CisJCQkqZHN0KysgPSBtYXBbUGl4ZWxdOworCQkJKytzcmM7CisJCX0KKwkJc3dpdGNoICggd2lkdGggJiAzICkgeworCQkJY2FzZSAzOgorCQkJCVJHQjg4OF9SR0IzMzIoUGl4ZWwsICpzcmMpOworCQkJCSpkc3QrKyA9IG1hcFtQaXhlbF07CisJCQkJKytzcmM7CisJCQljYXNlIDI6CisJCQkJUkdCODg4X1JHQjMzMihQaXhlbCwgKnNyYyk7CisJCQkJKmRzdCsrID0gbWFwW1BpeGVsXTsKKwkJCQkrK3NyYzsKKwkJCWNhc2UgMToKKwkJCQlSR0I4ODhfUkdCMzMyKFBpeGVsLCAqc3JjKTsKKwkJCQkqZHN0KysgPSBtYXBbUGl4ZWxdOworCQkJCSsrc3JjOworCQl9CisJCXNyYyArPSBzcmNza2lwOworCQlkc3QgKz0gZHN0c2tpcDsKKwl9CisjZW5kaWYgLyogVVNFX0RVRkZTX0xPT1AgKi8KK30KK3N0YXRpYyB2b2lkIEJsaXROdG8xKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKyNpZm5kZWYgVVNFX0RVRkZTX0xPT1AKKwlpbnQgYzsKKyNlbmRpZgorCWludCB3aWR0aCwgaGVpZ2h0OworCVVpbnQ4ICpzcmM7CisJY29uc3QgVWludDggKm1hcDsKKwlVaW50OCAqZHN0OworCWludCBzcmNza2lwLCBkc3Rza2lwOworCWludCBzcmNicHA7CisJVWludDMyIFBpeGVsOworCWludCAgc1IsIHNHLCBzQjsKKwlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdDsKKworCS8qIFNldCB1cCBzb21lIGJhc2ljIHZhcmlhYmxlcyAqLworCXdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwloZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlzcmNza2lwID0gaW5mby0+c19za2lwOworCWRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJbWFwID0gaW5mby0+dGFibGU7CisJc3JjZm10ID0gaW5mby0+c3JjOworCXNyY2JwcCA9IHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbDsKKworCWlmICggbWFwID09IE5VTEwgKSB7CisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisjaWZkZWYgVVNFX0RVRkZTX0xPT1AKKwkJCURVRkZTX0xPT1AoCisJCQkJRElTRU1CTEVfUkdCKHNyYywgc3JjYnBwLCBzcmNmbXQsIFBpeGVsLAorCQkJCQkJCQlzUiwgc0csIHNCKTsKKwkJCQlpZiAoIDEgKSB7CisJCQkJICAJLyogUGFjayBSR0IgaW50byA4Yml0IHBpeGVsICovCisJCQkJICAJKmRzdCA9ICgoc1I+PjUpPDwoMysyKSl8CisJCQkJCSAgICAgICAgKChzRz4+NSk8PCgyKSkgfAorCQkJCQkgICAgICAgICgoc0I+PjYpPDwoMCkpIDsKKwkJCQl9CisJCQkJZHN0Kys7CisJCQkJc3JjICs9IHNyY2JwcDsKKwkJCSwgd2lkdGgpOworI2Vsc2UKKwkJCWZvciAoIGM9d2lkdGg7IGM7IC0tYyApIHsKKwkJCQlESVNFTUJMRV9SR0Ioc3JjLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsCisJCQkJCQkJCXNSLCBzRywgc0IpOworCQkJCWlmICggMSApIHsKKwkJCQkgIAkvKiBQYWNrIFJHQiBpbnRvIDhiaXQgcGl4ZWwgKi8KKwkJCQkgIAkqZHN0ID0gKChzUj4+NSk8PCgzKzIpKXwKKwkJCQkJICAgICAgICAoKHNHPj41KTw8KDIpKSB8CisJCQkJCSAgICAgICAgKChzQj4+Nik8PCgwKSkgOworCQkJCX0KKwkJCQlkc3QrKzsKKwkJCQlzcmMgKz0gc3JjYnBwOworCQkJfQorI2VuZGlmCisJCQlzcmMgKz0gc3Jjc2tpcDsKKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKCBoZWlnaHQtLSApIHsKKyNpZmRlZiBVU0VfRFVGRlNfTE9PUAorCQkJRFVGRlNfTE9PUCgKKwkJCQlESVNFTUJMRV9SR0Ioc3JjLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsCisJCQkJCQkJCXNSLCBzRywgc0IpOworCQkJCWlmICggMSApIHsKKwkJCQkgIAkvKiBQYWNrIFJHQiBpbnRvIDhiaXQgcGl4ZWwgKi8KKwkJCQkgIAkqZHN0ID0gbWFwWygoc1I+PjUpPDwoMysyKSl8CisJCQkJCQkgICAoKHNHPj41KTw8KDIpKSAgfAorCQkJCQkJICAgKChzQj4+Nik8PCgwKSkgIF07CisJCQkJfQorCQkJCWRzdCsrOworCQkJCXNyYyArPSBzcmNicHA7CisJCQksIHdpZHRoKTsKKyNlbHNlCisJCQlmb3IgKCBjPXdpZHRoOyBjOyAtLWMgKSB7CisJCQkJRElTRU1CTEVfUkdCKHNyYywgc3JjYnBwLCBzcmNmbXQsIFBpeGVsLAorCQkJCQkJCQlzUiwgc0csIHNCKTsKKwkJCQlpZiAoIDEgKSB7CisJCQkJICAJLyogUGFjayBSR0IgaW50byA4Yml0IHBpeGVsICovCisJCQkJICAJKmRzdCA9IG1hcFsoKHNSPj41KTw8KDMrMikpfAorCQkJCQkJICAgKChzRz4+NSk8PCgyKSkgIHwKKwkJCQkJCSAgICgoc0I+PjYpPDwoMCkpICBdOworCQkJCX0KKwkJCQlkc3QrKzsKKwkJCQlzcmMgKz0gc3JjYnBwOworCQkJfQorI2VuZGlmIC8qIFVTRV9EVUZGU19MT09QICovCisJCQlzcmMgKz0gc3Jjc2tpcDsKKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJfQorfQorCisvKiBibGl0cyAzMiBiaXQgUkdCPC0+UkdCQSB3aXRoIGJvdGggc3VyZmFjZXMgaGF2aW5nIHRoZSBzYW1lIFIsRyxCIGZpZWxkcyAqLworc3RhdGljIHZvaWQgQmxpdDR0bzRNYXNrQWxwaGEoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKWluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCVVpbnQzMiAqZHN0ID0gKFVpbnQzMiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOworCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OworCisJaWYgKGRzdGZtdC0+QW1hc2spIHsKKwkJLyogUkdCLT5SR0JBLCBTRVRfQUxQSEEgKi8KKwkJVWludDMyIG1hc2sgPSAoc3JjZm10LT5hbHBoYSA+PiBkc3RmbXQtPkFsb3NzKSA8PCBkc3RmbXQtPkFzaGlmdDsKKworCQl3aGlsZSAoIGhlaWdodC0tICkgeworCQkJRFVGRlNfTE9PUCgKKwkJCXsKKwkJCQkqZHN0ID0gKnNyYyB8IG1hc2s7CisJCQkJKytkc3Q7CisJCQkJKytzcmM7CisJCQl9LAorCQkJd2lkdGgpOworCQkJc3JjID0gKFVpbnQzMiopKChVaW50OCopc3JjICsgc3Jjc2tpcCk7CisJCQlkc3QgPSAoVWludDMyKikoKFVpbnQ4Kilkc3QgKyBkc3Rza2lwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFJHQkEtPlJHQiwgTk9fQUxQSEEgKi8KKwkJVWludDMyIG1hc2sgPSBzcmNmbXQtPlJtYXNrIHwgc3JjZm10LT5HbWFzayB8IHNyY2ZtdC0+Qm1hc2s7CisKKwkJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkJCURVRkZTX0xPT1AoCisJCQl7CisJCQkJKmRzdCA9ICpzcmMgJiBtYXNrOworCQkJCSsrZHN0OworCQkJCSsrc3JjOworCQkJfSwKKwkJCXdpZHRoKTsKKwkJCXNyYyA9IChVaW50MzIqKSgoVWludDgqKXNyYyArIHNyY3NraXApOworCQkJZHN0ID0gKFVpbnQzMiopKChVaW50OCopZHN0ICsgZHN0c2tpcCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIEJsaXROdG9OKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisJVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOworCWludCBzcmNicHAgPSBzcmNmbXQtPkJ5dGVzUGVyUGl4ZWw7CisJU0RMX1BpeGVsRm9ybWF0ICpkc3RmbXQgPSBpbmZvLT5kc3Q7CisJaW50IGRzdGJwcCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKKwl1bnNpZ25lZCBhbHBoYSA9IGRzdGZtdC0+QW1hc2sgPyBzcmNmbXQtPmFscGhhIDogMDsKKworCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCURVRkZTX0xPT1AoCisJCXsKKwkJICAgICAgICBVaW50MzIgUGl4ZWw7CisJCQl1bnNpZ25lZCBzUjsKKwkJCXVuc2lnbmVkIHNHOworCQkJdW5zaWduZWQgc0I7CisJCQlESVNFTUJMRV9SR0Ioc3JjLCBzcmNicHAsIHNyY2ZtdCwgUGl4ZWwsIHNSLCBzRywgc0IpOworCQkJQVNTRU1CTEVfUkdCQShkc3QsIGRzdGJwcCwgZHN0Zm10LCBzUiwgc0csIHNCLCBhbHBoYSk7CisJCQlkc3QgKz0gZHN0YnBwOworCQkJc3JjICs9IHNyY2JwcDsKKwkJfSwKKwkJd2lkdGgpOworCQlzcmMgKz0gc3Jjc2tpcDsKKwkJZHN0ICs9IGRzdHNraXA7CisJfQorfQorCitzdGF0aWMgdm9pZCBCbGl0TnRvTkNvcHlBbHBoYShTRExfQmxpdEluZm8gKmluZm8pCit7CisJaW50IHdpZHRoID0gaW5mby0+ZF93aWR0aDsKKwlpbnQgaGVpZ2h0ID0gaW5mby0+ZF9oZWlnaHQ7CisJVWludDggKnNyYyA9IGluZm8tPnNfcGl4ZWxzOworCWludCBzcmNza2lwID0gaW5mby0+c19za2lwOworCVVpbnQ4ICpkc3QgPSBpbmZvLT5kX3BpeGVsczsKKwlpbnQgZHN0c2tpcCA9IGluZm8tPmRfc2tpcDsKKwlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKKwlpbnQgc3JjYnBwID0gc3JjZm10LT5CeXRlc1BlclBpeGVsOworCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OworCWludCBkc3RicHAgPSBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWw7CisJaW50IGM7CisKKwkvKiBGSVhNRTogc2hvdWxkIG1hcCBhbHBoYSB0byBbMC4uMjU1XSBjb3JyZWN0bHkhICovCisJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkJZm9yICggYz13aWR0aDsgYzsgLS1jICkgeworCQkgICAgICAgIFVpbnQzMiBQaXhlbDsKKwkJCXVuc2lnbmVkIHNSLCBzRywgc0IsIHNBOworCQkJRElTRU1CTEVfUkdCQShzcmMsIHNyY2JwcCwgc3JjZm10LCBQaXhlbCwKKwkJCQkgICAgICBzUiwgc0csIHNCLCBzQSk7CisJCQlBU1NFTUJMRV9SR0JBKGRzdCwgZHN0YnBwLCBkc3RmbXQsCisJCQkJICAgICAgc1IsIHNHLCBzQiwgc0EpOworCQkJZHN0ICs9IGRzdGJwcDsKKwkJCXNyYyArPSBzcmNicHA7CisJCX0KKwkJc3JjICs9IHNyY3NraXA7CisJCWRzdCArPSBkc3Rza2lwOworCX0KK30KKworc3RhdGljIHZvaWQgQmxpdE50bzFLZXkoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKwlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7CisJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJU0RMX1BpeGVsRm9ybWF0ICpzcmNmbXQgPSBpbmZvLT5zcmM7CisJY29uc3QgVWludDggKnBhbG1hcCA9IGluZm8tPnRhYmxlOworCVVpbnQzMiBja2V5ID0gc3JjZm10LT5jb2xvcmtleTsKKwlVaW50MzIgcmdibWFzayA9IH5zcmNmbXQtPkFtYXNrOworCWludCBzcmNicHA7CisJVWludDMyIFBpeGVsOworCXVuc2lnbmVkIHNSLCBzRywgc0I7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwlzcmNicHAgPSBzcmNmbXQtPkJ5dGVzUGVyUGl4ZWw7CisJY2tleSAmPSByZ2JtYXNrOworCisJaWYgKCBwYWxtYXAgPT0gTlVMTCApIHsKKwkJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkJCURVRkZTX0xPT1AoCisJCQl7CisJCQkJRElTRU1CTEVfUkdCKHNyYywgc3JjYnBwLCBzcmNmbXQsIFBpeGVsLAorCQkJCQkJCQlzUiwgc0csIHNCKTsKKwkJCQlpZiAoIChQaXhlbCAmIHJnYm1hc2spICE9IGNrZXkgKSB7CisJCQkJICAJLyogUGFjayBSR0IgaW50byA4Yml0IHBpeGVsICovCisJCQkJICAJKmRzdCA9IChVaW50OCkoKChzUj4+NSk8PCgzKzIpKXwKKwkJCQkJCSAgICAgICAgICAgKChzRz4+NSk8PCgyKSkgfAorCQkJCQkJICAgICAgICAgICAoKHNCPj42KTw8KDApKSk7CisJCQkJfQorCQkJCWRzdCsrOworCQkJCXNyYyArPSBzcmNicHA7CisJCQl9LAorCQkJd2lkdGgpOworCQkJc3JjICs9IHNyY3NraXA7CisJCQlkc3QgKz0gZHN0c2tpcDsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCQlEVUZGU19MT09QKAorCQkJeworCQkJCURJU0VNQkxFX1JHQihzcmMsIHNyY2JwcCwgc3JjZm10LCBQaXhlbCwKKwkJCQkJCQkJc1IsIHNHLCBzQik7CisJCQkJaWYgKCAoUGl4ZWwgJiByZ2JtYXNrKSAhPSBja2V5ICkgeworCQkJCSAgCS8qIFBhY2sgUkdCIGludG8gOGJpdCBwaXhlbCAqLworCQkJCSAgCSpkc3QgPSAoVWludDgpcGFsbWFwWygoc1I+PjUpPDwoMysyKSl8CisJCQkJCQkJICAgICAgICAgICAgICgoc0c+PjUpPDwoMikpICB8CisJCQkJCQkJICAgICAgICAgICAgICgoc0I+PjYpPDwoMCkpICBdOworCQkJCX0KKwkJCQlkc3QrKzsKKwkJCQlzcmMgKz0gc3JjYnBwOworCQkJfSwKKwkJCXdpZHRoKTsKKwkJCXNyYyArPSBzcmNza2lwOworCQkJZHN0ICs9IGRzdHNraXA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIEJsaXQydG8yS2V5KFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50MTYgKnNyY3AgPSAoVWludDE2ICopaW5mby0+c19waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKWluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKKwlVaW50MzIgcmdibWFzayA9IH5pbmZvLT5zcmMtPkFtYXNrOworCisJLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCisgICAgICAgIHNyY3NraXAgLz0gMjsKKyAgICAgICAgZHN0c2tpcCAvPSAyOworCWNrZXkgJj0gcmdibWFzazsKKworCXdoaWxlICggaGVpZ2h0LS0gKSB7CisJCURVRkZTX0xPT1AoCisJCXsKKwkJCWlmICggKCpzcmNwICYgcmdibWFzaykgIT0gY2tleSApIHsKKwkJCQkqZHN0cCA9ICpzcmNwOworCQkJfQorCQkJZHN0cCsrOworCQkJc3JjcCsrOworCQl9LAorCQl3aWR0aCk7CisJCXNyY3AgKz0gc3Jjc2tpcDsKKwkJZHN0cCArPSBkc3Rza2lwOworCX0KK30KKworc3RhdGljIHZvaWQgQmxpdE50b05LZXkoU0RMX0JsaXRJbmZvICppbmZvKQoreworCWludCB3aWR0aCA9IGluZm8tPmRfd2lkdGg7CisJaW50IGhlaWdodCA9IGluZm8tPmRfaGVpZ2h0OworCVVpbnQ4ICpzcmMgPSBpbmZvLT5zX3BpeGVsczsKKwlpbnQgc3Jjc2tpcCA9IGluZm8tPnNfc2tpcDsKKwlVaW50OCAqZHN0ID0gaW5mby0+ZF9waXhlbHM7CisJaW50IGRzdHNraXAgPSBpbmZvLT5kX3NraXA7CisJVWludDMyIGNrZXkgPSBpbmZvLT5zcmMtPmNvbG9ya2V5OworCVNETF9QaXhlbEZvcm1hdCAqc3JjZm10ID0gaW5mby0+c3JjOworCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10ID0gaW5mby0+ZHN0OworCWludCBzcmNicHAgPSBzcmNmbXQtPkJ5dGVzUGVyUGl4ZWw7CisJaW50IGRzdGJwcCA9IGRzdGZtdC0+Qnl0ZXNQZXJQaXhlbDsKKwl1bnNpZ25lZCBhbHBoYSA9IGRzdGZtdC0+QW1hc2sgPyBzcmNmbXQtPmFscGhhIDogMDsKKwlVaW50MzIgcmdibWFzayA9IH5zcmNmbXQtPkFtYXNrOworCisJLyogU2V0IHVwIHNvbWUgYmFzaWMgdmFyaWFibGVzICovCisJY2tleSAmPSByZ2JtYXNrOworCisJd2hpbGUgKCBoZWlnaHQtLSApIHsKKwkJRFVGRlNfTE9PUCgKKwkJeworCQkgICAgICAgIFVpbnQzMiBQaXhlbDsKKwkJCXVuc2lnbmVkIHNSOworCQkJdW5zaWduZWQgc0c7CisJCQl1bnNpZ25lZCBzQjsKKwkJCVJFVFJJRVZFX1JHQl9QSVhFTChzcmMsIHNyY2JwcCwgUGl4ZWwpOworCQkJaWYgKCAoUGl4ZWwgJiByZ2JtYXNrKSAhPSBja2V5ICkgeworCQkJICAgICAgICBSR0JfRlJPTV9QSVhFTChQaXhlbCwgc3JjZm10LCBzUiwgc0csIHNCKTsKKwkJCQlBU1NFTUJMRV9SR0JBKGRzdCwgZHN0YnBwLCBkc3RmbXQsCisJCQkJCSAgICAgIHNSLCBzRywgc0IsIGFscGhhKTsKKwkJCX0KKwkJCWRzdCArPSBkc3RicHA7CisJCQlzcmMgKz0gc3JjYnBwOworCQl9LAorCQl3aWR0aCk7CisJCXNyYyArPSBzcmNza2lwOworCQlkc3QgKz0gZHN0c2tpcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEJsaXROdG9OS2V5Q29weUFscGhhKFNETF9CbGl0SW5mbyAqaW5mbykKK3sKKwlpbnQgd2lkdGggPSBpbmZvLT5kX3dpZHRoOworCWludCBoZWlnaHQgPSBpbmZvLT5kX2hlaWdodDsKKwlVaW50OCAqc3JjID0gaW5mby0+c19waXhlbHM7CisJaW50IHNyY3NraXAgPSBpbmZvLT5zX3NraXA7CisJVWludDggKmRzdCA9IGluZm8tPmRfcGl4ZWxzOworCWludCBkc3Rza2lwID0gaW5mby0+ZF9za2lwOworCVVpbnQzMiBja2V5ID0gaW5mby0+c3JjLT5jb2xvcmtleTsKKwlTRExfUGl4ZWxGb3JtYXQgKnNyY2ZtdCA9IGluZm8tPnNyYzsKKwlTRExfUGl4ZWxGb3JtYXQgKmRzdGZtdCA9IGluZm8tPmRzdDsKKwlVaW50MzIgcmdibWFzayA9IH5zcmNmbXQtPkFtYXNrOworCisJVWludDggc3JjYnBwOworCVVpbnQ4IGRzdGJwcDsKKwlVaW50MzIgUGl4ZWw7CisJdW5zaWduZWQgc1IsIHNHLCBzQiwgc0E7CisKKwkvKiBTZXQgdXAgc29tZSBiYXNpYyB2YXJpYWJsZXMgKi8KKwlzcmNicHAgPSBzcmNmbXQtPkJ5dGVzUGVyUGl4ZWw7CisJZHN0YnBwID0gZHN0Zm10LT5CeXRlc1BlclBpeGVsOworCWNrZXkgJj0gcmdibWFzazsKKworCS8qIEZJWE1FOiBzaG91bGQgbWFwIGFscGhhIHRvIFswLi4yNTVdIGNvcnJlY3RseSEgKi8KKwl3aGlsZSAoIGhlaWdodC0tICkgeworCQlEVUZGU19MT09QKAorCQl7CisJCQlESVNFTUJMRV9SR0JBKHNyYywgc3JjYnBwLCBzcmNmbXQsIFBpeGVsLAorCQkJCSAgICAgIHNSLCBzRywgc0IsIHNBKTsKKwkJCWlmICggKFBpeGVsICYgcmdibWFzaykgIT0gY2tleSApIHsKKwkJCQkgIEFTU0VNQkxFX1JHQkEoZHN0LCBkc3RicHAsIGRzdGZtdCwKKwkJCQkJCXNSLCBzRywgc0IsIHNBKTsKKwkJCX0KKwkJCWRzdCArPSBkc3RicHA7CisJCQlzcmMgKz0gc3JjYnBwOworCQl9LAorCQl3aWR0aCk7CisJCXNyYyArPSBzcmNza2lwOworCQlkc3QgKz0gZHN0c2tpcDsKKwl9Cit9CisKKy8qIE5vcm1hbCBOIHRvIE4gb3B0aW1pemVkIGJsaXR0ZXJzICovCitzdHJ1Y3QgYmxpdF90YWJsZSB7CisJVWludDMyIHNyY1IsIHNyY0csIHNyY0I7CisJaW50IGRzdGJwcDsKKwlVaW50MzIgZHN0UiwgZHN0RywgZHN0QjsKKwlVaW50MzIgYmxpdF9mZWF0dXJlczsKKwl2b2lkICphdXhfZGF0YTsKKwlTRExfbG9ibGl0IGJsaXRmdW5jOworCWVudW0geyBOT19BTFBIQT0xLCBTRVRfQUxQSEE9MiwgQ09QWV9BTFBIQT00IH0gYWxwaGE7Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBibGl0X3RhYmxlIG5vcm1hbF9ibGl0XzFbXSA9IHsKKwkvKiBEZWZhdWx0IGZvciA4LWJpdCBSR0Igc291cmNlLCBhbiBpbnZhbGlkIGNvbWJpbmF0aW9uICovCisJeyAwLDAsMCwgMCwgMCwwLDAsIDAsIE5VTEwsIE5VTEwgfSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGJsaXRfdGFibGUgbm9ybWFsX2JsaXRfMltdID0geworI2lmIFNETF9IRVJNRVNfQkxJVFRFUlMKKyAgICB7IDB4MDAwMEY4MDAsMHgwMDAwMDdFMCwweDAwMDAwMDFGLCAyLCAweDAwMDAwMDFGLDB4MDAwMDA3RTAsMHgwMDAwRjgwMCwKKyAgICAgIDAsIENvbnZlcnRYODZwMTZfMTZCR1I1NjUsIENvbnZlcnRYODYsIE5PX0FMUEhBIH0sCisgICAgeyAweDAwMDBGODAwLDB4MDAwMDA3RTAsMHgwMDAwMDAxRiwgMiwgMHgwMDAwN0MwMCwweDAwMDAwM0UwLDB4MDAwMDAwMUYsCisgICAgICAwLCBDb252ZXJ0WDg2cDE2XzE2UkdCNTU1LCBDb252ZXJ0WDg2LCBOT19BTFBIQSB9LAorICAgIHsgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsIDIsIDB4MDAwMDAwMUYsMHgwMDAwMDNFMCwweDAwMDA3QzAwLAorICAgICAgMCwgQ29udmVydFg4NnAxNl8xNkJHUjU1NSwgQ29udmVydFg4NiwgTk9fQUxQSEEgfSwKKyNlbGlmIFNETF9BTFRJVkVDX0JMSVRURVJTCisgICAgLyogaGFzLWFsdGl2ZWMgKi8KKyAgICB7IDB4MDAwMEY4MDAsMHgwMDAwMDdFMCwweDAwMDAwMDFGLCA0LCAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAgIDIsIE5VTEwsIEJsaXRfUkdCNTY1XzMyQWx0aXZlYywgTk9fQUxQSEEgfCBDT1BZX0FMUEhBIHwgU0VUX0FMUEhBIH0sCisgICAgeyAweDAwMDA3QzAwLDB4MDAwMDAzRTAsMHgwMDAwMDAxRiwgNCwgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgICAyLCBOVUxMLCBCbGl0X1JHQjU1NV8zMkFsdGl2ZWMsIE5PX0FMUEhBIHwgQ09QWV9BTFBIQSB8IFNFVF9BTFBIQSB9LAorI2VuZGlmCisgICAgeyAweDAwMDBGODAwLDB4MDAwMDA3RTAsMHgwMDAwMDAxRiwgNCwgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsCisgICAgICAwLCBOVUxMLCBCbGl0X1JHQjU2NV9BUkdCODg4OCwgU0VUX0FMUEhBIH0sCisgICAgeyAweDAwMDBGODAwLDB4MDAwMDA3RTAsMHgwMDAwMDAxRiwgNCwgMHgwMDAwMDBGRiwweDAwMDBGRjAwLDB4MDBGRjAwMDAsCisgICAgICAwLCBOVUxMLCBCbGl0X1JHQjU2NV9BQkdSODg4OCwgU0VUX0FMUEhBIH0sCisgICAgeyAweDAwMDBGODAwLDB4MDAwMDA3RTAsMHgwMDAwMDAxRiwgNCwgMHhGRjAwMDAwMCwweDAwRkYwMDAwLDB4MDAwMEZGMDAsCisgICAgICAwLCBOVUxMLCBCbGl0X1JHQjU2NV9SR0JBODg4OCwgU0VUX0FMUEhBIH0sCisgICAgeyAweDAwMDBGODAwLDB4MDAwMDA3RTAsMHgwMDAwMDAxRiwgNCwgMHgwMDAwRkYwMCwweDAwRkYwMDAwLDB4RkYwMDAwMDAsCisgICAgICAwLCBOVUxMLCBCbGl0X1JHQjU2NV9CR1JBODg4OCwgU0VUX0FMUEhBIH0sCisKKyAgICAvKiBEZWZhdWx0IGZvciAxNi1iaXQgUkdCIHNvdXJjZSwgdXNlZCBpZiBubyBvdGhlciBibGl0dGVyIG1hdGNoZXMgKi8KKyAgICB7IDAsMCwwLCAwLCAwLDAsMCwgMCwgTlVMTCwgQmxpdE50b04sIDAgfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmxpdF90YWJsZSBub3JtYWxfYmxpdF8zW10gPSB7CisJLyogRGVmYXVsdCBmb3IgMjQtYml0IFJHQiBzb3VyY2UsIG5ldmVyIG9wdGltaXplZCAqLworICAgIHsgMCwwLDAsIDAsIDAsMCwwLCAwLCBOVUxMLCBCbGl0TnRvTiwgMCB9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBibGl0X3RhYmxlIG5vcm1hbF9ibGl0XzRbXSA9IHsKKyNpZiBTRExfSEVSTUVTX0JMSVRURVJTCisgICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgMiwgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsCisgICAgICAxLCBDb252ZXJ0TU1YcElJMzJfMTZSR0I1NjUsIENvbnZlcnRNTVgsIE5PX0FMUEhBIH0sCisgICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgMiwgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsCisgICAgICAwLCBDb252ZXJ0WDg2cDMyXzE2UkdCNTY1LCBDb252ZXJ0WDg2LCBOT19BTFBIQSB9LAorICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDIsIDB4MDAwMDAwMUYsMHgwMDAwMDdFMCwweDAwMDBGODAwLAorICAgICAgMSwgQ29udmVydE1NWHBJSTMyXzE2QkdSNTY1LCBDb252ZXJ0TU1YLCBOT19BTFBIQSB9LAorICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDIsIDB4MDAwMDAwMUYsMHgwMDAwMDdFMCwweDAwMDBGODAwLAorICAgICAgMCwgQ29udmVydFg4NnAzMl8xNkJHUjU2NSwgQ29udmVydFg4NiwgTk9fQUxQSEEgfSwKKyAgICB7IDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLCAyLCAweDAwMDA3QzAwLDB4MDAwMDAzRTAsMHgwMDAwMDAxRiwKKyAgICAgIDEsIENvbnZlcnRNTVhwSUkzMl8xNlJHQjU1NSwgQ29udmVydE1NWCwgTk9fQUxQSEEgfSwKKyAgICB7IDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLCAyLCAweDAwMDA3QzAwLDB4MDAwMDAzRTAsMHgwMDAwMDAxRiwKKyAgICAgIDAsIENvbnZlcnRYODZwMzJfMTZSR0I1NTUsIENvbnZlcnRYODYsIE5PX0FMUEhBIH0sCisgICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgMiwgMHgwMDAwMDAxRiwweDAwMDAwM0UwLDB4MDAwMDdDMDAsCisgICAgICAxLCBDb252ZXJ0TU1YcElJMzJfMTZCR1I1NTUsIENvbnZlcnRNTVgsIE5PX0FMUEhBIH0sCisgICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgMiwgMHgwMDAwMDAxRiwweDAwMDAwM0UwLDB4MDAwMDdDMDAsCisgICAgICAwLCBDb252ZXJ0WDg2cDMyXzE2QkdSNTU1LCBDb252ZXJ0WDg2LCBOT19BTFBIQSB9LAorICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDMsIDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLAorICAgICAgMSwgQ29udmVydE1NWHBJSTMyXzI0UkdCODg4LCBDb252ZXJ0TU1YLCBOT19BTFBIQSB9LAorICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDMsIDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLAorICAgICAgMCwgQ29udmVydFg4NnAzMl8yNFJHQjg4OCwgQ29udmVydFg4NiwgTk9fQUxQSEEgfSwKKyAgICB7IDB4MDBGRjAwMDAsMHgwMDAwRkYwMCwweDAwMDAwMEZGLCAzLCAweDAwMDAwMEZGLDB4MDAwMEZGMDAsMHgwMEZGMDAwMCwKKyAgICAgIDAsIENvbnZlcnRYODZwMzJfMjRCR1I4ODgsIENvbnZlcnRYODYsIE5PX0FMUEhBIH0sCisgICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgNCwgMHgwMDAwMDBGRiwweDAwMDBGRjAwLDB4MDBGRjAwMDAsCisgICAgICAwLCBDb252ZXJ0WDg2cDMyXzMyQkdSODg4LCBDb252ZXJ0WDg2LCBOT19BTFBIQSB9LAorICAgIHsgMHgwMEZGMDAwMCwweDAwMDBGRjAwLDB4MDAwMDAwRkYsIDQsIDB4RkYwMDAwMDAsMHgwMEZGMDAwMCwweDAwMDBGRjAwLAorICAgICAgMCwgQ29udmVydFg4NnAzMl8zMlJHQkE4ODgsIENvbnZlcnRYODYsIE5PX0FMUEhBIH0sCisgICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgNCwgMHgwMDAwRkYwMCwweDAwRkYwMDAwLDB4RkYwMDAwMDAsCisgICAgICAwLCBDb252ZXJ0WDg2cDMyXzMyQkdSQTg4OCwgQ29udmVydFg4NiwgTk9fQUxQSEEgfSwKKyNlbHNlCisjaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMKKyAgICAvKiBoYXMtYWx0aXZlYyB8IGRvbnQtdXNlLXByZWZldGNoICovCisgICAgeyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwgNCwgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgICA2LCBOVUxMLCBDb252ZXJ0QWx0aXZlYzMydG8zMl9ub3ByZWZldGNoLCBOT19BTFBIQSB8IENPUFlfQUxQSEEgfCBTRVRfQUxQSEEgfSwKKyAgICAvKiBoYXMtYWx0aXZlYyAqLworICAgIHsgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsIDQsIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgICAgMiwgTlVMTCwgQ29udmVydEFsdGl2ZWMzMnRvMzJfcHJlZmV0Y2gsIE5PX0FMUEhBIHwgQ09QWV9BTFBIQSB8IFNFVF9BTFBIQSB9LAorICAgIC8qIGhhcy1hbHRpdmVjICovCisgICAgeyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwgMiwgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsCisgICAgICAyLCBOVUxMLCBCbGl0X1JHQjg4OF9SR0I1NjVBbHRpdmVjLCBOT19BTFBIQSB9LAorI2VuZGlmCisgICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgMiwgMHgwMDAwRjgwMCwweDAwMDAwN0UwLDB4MDAwMDAwMUYsCisgICAgICAwLCBOVUxMLCBCbGl0X1JHQjg4OF9SR0I1NjUsIE5PX0FMUEhBIH0sCisgICAgeyAweDAwRkYwMDAwLDB4MDAwMEZGMDAsMHgwMDAwMDBGRiwgMiwgMHgwMDAwN0MwMCwweDAwMDAwM0UwLDB4MDAwMDAwMUYsCisgICAgICAwLCBOVUxMLCBCbGl0X1JHQjg4OF9SR0I1NTUsIE5PX0FMUEhBIH0sCisjZW5kaWYKKwkvKiBEZWZhdWx0IGZvciAzMi1iaXQgUkdCIHNvdXJjZSwgdXNlZCBpZiBubyBvdGhlciBibGl0dGVyIG1hdGNoZXMgKi8KKwl7IDAsMCwwLCAwLCAwLDAsMCwgMCwgTlVMTCwgQmxpdE50b04sIDAgfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmxpdF90YWJsZSAqbm9ybWFsX2JsaXRbXSA9IHsKKwlub3JtYWxfYmxpdF8xLCBub3JtYWxfYmxpdF8yLCBub3JtYWxfYmxpdF8zLCBub3JtYWxfYmxpdF80Cit9OworCisvKiBNYXNrIG1hdGNoZXMgdGFibGUsIG9yIHRhYmxlIGVudHJ5IGlzIHplcm8gKi8KKyNkZWZpbmUgTUFTS09LKHgsIHkpICgoKHgpID09ICh5KSkgfHwgKCh5KSA9PSAweDAwMDAwMDAwKSkKKworU0RMX2xvYmxpdCBTRExfQ2FsY3VsYXRlQmxpdE4oU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCBibGl0X2luZGV4KQoreworCXN0cnVjdCBwcml2YXRlX3N3YWNjZWwgKnNkYXRhOworCVNETF9QaXhlbEZvcm1hdCAqc3JjZm10OworCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10OworCWNvbnN0IHN0cnVjdCBibGl0X3RhYmxlICp0YWJsZTsKKwlpbnQgd2hpY2g7CisJU0RMX2xvYmxpdCBibGl0ZnVuOworCisJLyogU2V0IHVwIGRhdGEgZm9yIGNob29zaW5nIHRoZSBibGl0ICovCisJc2RhdGEgPSBzdXJmYWNlLT5tYXAtPnN3X2RhdGE7CisJc3JjZm10ID0gc3VyZmFjZS0+Zm9ybWF0OworCWRzdGZtdCA9IHN1cmZhY2UtPm1hcC0+ZHN0LT5mb3JtYXQ7CisKKwlpZiAoIGJsaXRfaW5kZXggJiAyICkgeworCSAgICAgICAgLyogYWxwaGEgb3IgYWxwaGErY29sb3JrZXkgKi8KKwkgICAgICAgIHJldHVybiBTRExfQ2FsY3VsYXRlQWxwaGFCbGl0KHN1cmZhY2UsIGJsaXRfaW5kZXgpOworCX0KKworCS8qIFdlIGRvbid0IHN1cHBvcnQgZGVzdGluYXRpb25zIGxlc3MgdGhhbiA4LWJpdHMgKi8KKwlpZiAoIGRzdGZtdC0+Qml0c1BlclBpeGVsIDwgOCApIHsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwkKKwlpZihibGl0X2luZGV4ID09IDEpIHsKKwkgICAgLyogY29sb3JrZXkgYmxpdDogSGVyZSB3ZSBkb24ndCBoYXZlIHRvbyBtYW55IG9wdGlvbnMsIG1vc3RseQorCSAgICAgICBiZWNhdXNlIFJMRSBpcyB0aGUgcHJlZmVycmVkIGZhc3Qgd2F5IHRvIGRlYWwgd2l0aCB0aGlzLgorCSAgICAgICBJZiBhIHBhcnRpY3VsYXIgY2FzZSB0dXJucyBvdXQgdG8gYmUgdXNlZnVsIHdlJ2xsIGFkZCBpdC4gKi8KKworCSAgICBpZihzcmNmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gMgorCSAgICAgICAmJiBzdXJmYWNlLT5tYXAtPmlkZW50aXR5KQorCQlyZXR1cm4gQmxpdDJ0bzJLZXk7CisJICAgIGVsc2UgaWYoZHN0Zm10LT5CeXRlc1BlclBpeGVsID09IDEpCisJCXJldHVybiBCbGl0TnRvMUtleTsKKwkgICAgZWxzZSB7CisjaWYgU0RMX0FMVElWRUNfQkxJVFRFUlMKKyAgICAgICAgaWYoKHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbCA9PSA0KSAmJiAoZHN0Zm10LT5CeXRlc1BlclBpeGVsID09IDQpICYmIFNETF9IYXNBbHRpVmVjKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCbGl0MzJ0bzMyS2V5QWx0aXZlYzsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKworCQlpZihzcmNmbXQtPkFtYXNrICYmIGRzdGZtdC0+QW1hc2spCisJCSAgICByZXR1cm4gQmxpdE50b05LZXlDb3B5QWxwaGE7CisJCWVsc2UKKwkJICAgIHJldHVybiBCbGl0TnRvTktleTsKKwkgICAgfQorCX0KKworCWJsaXRmdW4gPSBOVUxMOworCWlmICggZHN0Zm10LT5CaXRzUGVyUGl4ZWwgPT0gOCApIHsKKwkJLyogV2UgYXNzdW1lIDgtYml0IGRlc3RpbmF0aW9ucyBhcmUgcGFsZXR0aXplZCAqLworCQlpZiAoIChzcmNmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gNCkgJiYKKwkJICAgICAoc3JjZm10LT5SbWFzayA9PSAweDAwRkYwMDAwKSAmJgorCQkgICAgIChzcmNmbXQtPkdtYXNrID09IDB4MDAwMEZGMDApICYmCisJCSAgICAgKHNyY2ZtdC0+Qm1hc2sgPT0gMHgwMDAwMDBGRikgKSB7CisJCQlpZiAoIHN1cmZhY2UtPm1hcC0+dGFibGUgKSB7CisJCQkJYmxpdGZ1biA9IEJsaXRfUkdCODg4X2luZGV4OF9tYXA7CisJCQl9IGVsc2UgeworI2lmIFNETF9IRVJNRVNfQkxJVFRFUlMKKwkJCQlzZGF0YS0+YXV4X2RhdGEgPSBDb252ZXJ0WDg2cDMyXzhSR0IzMzI7CisJCQkJYmxpdGZ1biA9IENvbnZlcnRYODY7CisjZWxzZQorCQkJCWJsaXRmdW4gPSBCbGl0X1JHQjg4OF9pbmRleDg7CisjZW5kaWYKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJsaXRmdW4gPSBCbGl0TnRvMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5vdyB0aGUgbWVhdCwgY2hvb3NlIHRoZSBibGl0dGVyIHdlIHdhbnQgKi8KKwkJaW50IGFfbmVlZCA9IE5PX0FMUEhBOworCQlpZihkc3RmbXQtPkFtYXNrKQorCQkgICAgYV9uZWVkID0gc3JjZm10LT5BbWFzayA/IENPUFlfQUxQSEEgOiBTRVRfQUxQSEE7CisJCXRhYmxlID0gbm9ybWFsX2JsaXRbc3JjZm10LT5CeXRlc1BlclBpeGVsLTFdOworCQlmb3IgKCB3aGljaD0wOyB0YWJsZVt3aGljaF0uZHN0YnBwOyArK3doaWNoICkgeworCQkJaWYgKCBNQVNLT0soc3JjZm10LT5SbWFzaywgdGFibGVbd2hpY2hdLnNyY1IpICYmCisJCQkgICAgTUFTS09LKHNyY2ZtdC0+R21hc2ssIHRhYmxlW3doaWNoXS5zcmNHKSAmJgorCQkJICAgIE1BU0tPSyhzcmNmbXQtPkJtYXNrLCB0YWJsZVt3aGljaF0uc3JjQikgJiYKKwkJCSAgICBNQVNLT0soZHN0Zm10LT5SbWFzaywgdGFibGVbd2hpY2hdLmRzdFIpICYmCisJCQkgICAgTUFTS09LKGRzdGZtdC0+R21hc2ssIHRhYmxlW3doaWNoXS5kc3RHKSAmJgorCQkJICAgIE1BU0tPSyhkc3RmbXQtPkJtYXNrLCB0YWJsZVt3aGljaF0uZHN0QikgJiYKKwkJCSAgICBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gdGFibGVbd2hpY2hdLmRzdGJwcCAmJgorCQkJICAgIChhX25lZWQgJiB0YWJsZVt3aGljaF0uYWxwaGEpID09IGFfbmVlZCAmJgorCQkJICAgICgodGFibGVbd2hpY2hdLmJsaXRfZmVhdHVyZXMgJiBHZXRCbGl0RmVhdHVyZXMoKSkgPT0gdGFibGVbd2hpY2hdLmJsaXRfZmVhdHVyZXMpICkKKwkJCQlicmVhazsKKwkJfQorCQlzZGF0YS0+YXV4X2RhdGEgPSB0YWJsZVt3aGljaF0uYXV4X2RhdGE7CisJCWJsaXRmdW4gPSB0YWJsZVt3aGljaF0uYmxpdGZ1bmM7CisKKwkJaWYoYmxpdGZ1biA9PSBCbGl0TnRvTikgeyAgLyogZGVmYXVsdCBDIGZhbGxiYWNrIGNhdGNoLWFsbC4gU2xvdyEgKi8KKwkJCS8qIEZhc3RwYXRoIEMgZmFsbGJhY2s6IDMyYml0IFJHQjwtPlJHQkEgYmxpdCB3aXRoIG1hdGNoaW5nIFJHQiAqLworCQkJaWYgKCBzcmNmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gNCAmJiBkc3RmbXQtPkJ5dGVzUGVyUGl4ZWwgPT0gNCAmJgorCQkJICAgICBzcmNmbXQtPlJtYXNrID09IGRzdGZtdC0+Um1hc2sgJiYKKwkJCSAgICAgc3JjZm10LT5HbWFzayA9PSBkc3RmbXQtPkdtYXNrICYmCisJCQkgICAgIHNyY2ZtdC0+Qm1hc2sgPT0gZHN0Zm10LT5CbWFzayApIHsKKwkJCQlibGl0ZnVuID0gQmxpdDR0bzRNYXNrQWxwaGE7CisJCQl9IGVsc2UgaWYgKCBhX25lZWQgPT0gQ09QWV9BTFBIQSApIHsKKwkJCSAgICBibGl0ZnVuID0gQmxpdE50b05Db3B5QWxwaGE7CisJCQl9CisJCX0KKwl9CisKKyNpZmRlZiBERUJVR19BU00KKyNpZiBTRExfSEVSTUVTX0JMSVRURVJTCisJaWYgKCBibGl0ZnVuID09IENvbnZlcnRNTVggKQorCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIG1teCBibGl0XG4iKTsKKwllbHNlCisJaWYgKCBibGl0ZnVuID09IENvbnZlcnRYODYgKQorCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGFzbSBibGl0XG4iKTsKKwllbHNlCisjZW5kaWYKKwlpZiAoIChibGl0ZnVuID09IEJsaXROdG9OKSB8fCAoYmxpdGZ1biA9PSBCbGl0TnRvMSkgKQorCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIEMgYmxpdFxuIik7CisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIG9wdGltaXplZCBDIGJsaXRcbiIpOworI2VuZGlmIC8qIERFQlVHX0FTTSAqLworCisJcmV0dXJuKGJsaXRmdW4pOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfYm1wLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9ibXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTZjZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfYm1wLmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiAKKyAgIENvZGUgdG8gbG9hZCBhbmQgc2F2ZSBzdXJmYWNlcyBpbiBXaW5kb3dzIEJNUCBmb3JtYXQuCisKKyAgIFdoeSBzdXBwb3J0IEJNUCBmb3JtYXQ/ICBXZWxsLCBpdCdzIGEgbmF0aXZlIGZvcm1hdCBmb3IgV2luZG93cywgYW5kCisgICBtb3N0IGltYWdlIHByb2Nlc3NpbmcgcHJvZ3JhbXMgY2FuIHJlYWQgYW5kIHdyaXRlIGl0LiAgSXQgd291bGQgYmUgbmljZQorICAgdG8gYmUgYWJsZSB0byBoYXZlIGF0IGxlYXN0IG9uZSBpbWFnZSBmb3JtYXQgdGhhdCB3ZSBjYW4gbmF0aXZlbHkgbG9hZAorICAgYW5kIHNhdmUsIGFuZCBzaW5jZSBQTkcgaXMgc28gY29tcGxleCB0aGF0IGl0IHdvdWxkIGJsb2F0IHRoZSBsaWJyYXJ5LAorICAgQk1QIGlzIGEgZ29vZCBhbHRlcm5hdGl2ZS4gCisKKyAgIFRoaXMgY29kZSBjdXJyZW50bHkgc3VwcG9ydHMgV2luMzIgRElCcyBpbiB1bmNvbXByZXNzZWQgOCBhbmQgMjQgYnBwLgorKi8KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKKworLyogQ29tcHJlc3Npb24gZW5jb2RpbmdzIGZvciBCTVAgZmlsZXMgKi8KKyNpZm5kZWYgQklfUkdCCisjZGVmaW5lIEJJX1JHQgkJMAorI2RlZmluZSBCSV9STEU4CQkxCisjZGVmaW5lIEJJX1JMRTQJCTIKKyNkZWZpbmUgQklfQklURklFTERTCTMKKyNlbmRpZgorCisKK1NETF9TdXJmYWNlICogU0RMX0xvYWRCTVBfUlcgKFNETF9SV29wcyAqc3JjLCBpbnQgZnJlZXNyYykKK3sKKwlTRExfYm9vbCB3YXNfZXJyb3I7CisJbG9uZyBmcF9vZmZzZXQgPSAwOworCWludCBibXBQaXRjaDsKKwlpbnQgaSwgcGFkOworCVNETF9TdXJmYWNlICpzdXJmYWNlOworCVVpbnQzMiBSbWFzazsKKwlVaW50MzIgR21hc2s7CisJVWludDMyIEJtYXNrOworCVNETF9QYWxldHRlICpwYWxldHRlOworCVVpbnQ4ICpiaXRzOworCVVpbnQ4ICp0b3AsICplbmQ7CisJU0RMX2Jvb2wgdG9wRG93bjsKKwlpbnQgRXhwYW5kQk1QOworCisJLyogVGhlIFdpbjMyIEJNUCBmaWxlIGhlYWRlciAoMTQgYnl0ZXMpICovCisJY2hhciAgIG1hZ2ljWzJdOworCVVpbnQzMiBiZlNpemU7CisJVWludDE2IGJmUmVzZXJ2ZWQxOworCVVpbnQxNiBiZlJlc2VydmVkMjsKKwlVaW50MzIgYmZPZmZCaXRzOworCisJLyogVGhlIFdpbjMyIEJJVE1BUElORk9IRUFERVIgc3RydWN0ICg0MCBieXRlcykgKi8KKwlVaW50MzIgYmlTaXplOworCVNpbnQzMiBiaVdpZHRoOworCVNpbnQzMiBiaUhlaWdodDsKKwlVaW50MTYgYmlQbGFuZXM7CisJVWludDE2IGJpQml0Q291bnQ7CisJVWludDMyIGJpQ29tcHJlc3Npb247CisJVWludDMyIGJpU2l6ZUltYWdlOworCVNpbnQzMiBiaVhQZWxzUGVyTWV0ZXI7CisJU2ludDMyIGJpWVBlbHNQZXJNZXRlcjsKKwlVaW50MzIgYmlDbHJVc2VkOworCVVpbnQzMiBiaUNsckltcG9ydGFudDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgcGFzc2VkIGEgdmFsaWQgZGF0YSBzb3VyY2UgKi8KKwlzdXJmYWNlID0gTlVMTDsKKwl3YXNfZXJyb3IgPSBTRExfRkFMU0U7CisJaWYgKCBzcmMgPT0gTlVMTCApIHsKKwkJd2FzX2Vycm9yID0gU0RMX1RSVUU7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBSZWFkIGluIHRoZSBCTVAgZmlsZSBoZWFkZXIgKi8KKwlmcF9vZmZzZXQgPSBTRExfUld0ZWxsKHNyYyk7CisJU0RMX0NsZWFyRXJyb3IoKTsKKwlpZiAoIFNETF9SV3JlYWQoc3JjLCBtYWdpYywgMSwgMikgIT0gMiApIHsKKwkJU0RMX0Vycm9yKFNETF9FRlJFQUQpOworCQl3YXNfZXJyb3IgPSBTRExfVFJVRTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIFNETF9zdHJuY21wKG1hZ2ljLCAiQk0iLCAyKSAhPSAwICkgeworCQlTRExfU2V0RXJyb3IoIkZpbGUgaXMgbm90IGEgV2luZG93cyBCTVAgZmlsZSIpOworCQl3YXNfZXJyb3IgPSBTRExfVFJVRTsKKwkJZ290byBkb25lOworCX0KKwliZlNpemUJCT0gU0RMX1JlYWRMRTMyKHNyYyk7CisJYmZSZXNlcnZlZDEJPSBTRExfUmVhZExFMTYoc3JjKTsKKwliZlJlc2VydmVkMgk9IFNETF9SZWFkTEUxNihzcmMpOworCWJmT2ZmQml0cwk9IFNETF9SZWFkTEUzMihzcmMpOworCisJLyogUmVhZCB0aGUgV2luMzIgQklUTUFQSU5GT0hFQURFUiAqLworCWJpU2l6ZQkJPSBTRExfUmVhZExFMzIoc3JjKTsKKwlpZiAoIGJpU2l6ZSA9PSAxMiApIHsKKwkJYmlXaWR0aAkJPSAoVWludDMyKVNETF9SZWFkTEUxNihzcmMpOworCQliaUhlaWdodAk9IChVaW50MzIpU0RMX1JlYWRMRTE2KHNyYyk7CisJCWJpUGxhbmVzCT0gU0RMX1JlYWRMRTE2KHNyYyk7CisJCWJpQml0Q291bnQJPSBTRExfUmVhZExFMTYoc3JjKTsKKwkJYmlDb21wcmVzc2lvbgk9IEJJX1JHQjsKKwkJYmlTaXplSW1hZ2UJPSAwOworCQliaVhQZWxzUGVyTWV0ZXIJPSAwOworCQliaVlQZWxzUGVyTWV0ZXIJPSAwOworCQliaUNsclVzZWQJPSAwOworCQliaUNsckltcG9ydGFudAk9IDA7CisJfSBlbHNlIHsKKwkJYmlXaWR0aAkJPSBTRExfUmVhZExFMzIoc3JjKTsKKwkJYmlIZWlnaHQJPSBTRExfUmVhZExFMzIoc3JjKTsKKwkJYmlQbGFuZXMJPSBTRExfUmVhZExFMTYoc3JjKTsKKwkJYmlCaXRDb3VudAk9IFNETF9SZWFkTEUxNihzcmMpOworCQliaUNvbXByZXNzaW9uCT0gU0RMX1JlYWRMRTMyKHNyYyk7CisJCWJpU2l6ZUltYWdlCT0gU0RMX1JlYWRMRTMyKHNyYyk7CisJCWJpWFBlbHNQZXJNZXRlcgk9IFNETF9SZWFkTEUzMihzcmMpOworCQliaVlQZWxzUGVyTWV0ZXIJPSBTRExfUmVhZExFMzIoc3JjKTsKKwkJYmlDbHJVc2VkCT0gU0RMX1JlYWRMRTMyKHNyYyk7CisJCWJpQ2xySW1wb3J0YW50CT0gU0RMX1JlYWRMRTMyKHNyYyk7CisJfQorCisJLyogc3RvcCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCSh2b2lkKSBiZlNpemU7CisJKHZvaWQpIGJmUmVzZXJ2ZWQxOworCSh2b2lkKSBiZlJlc2VydmVkMjsKKwkodm9pZCkgYmlQbGFuZXM7CisJKHZvaWQpIGJpU2l6ZUltYWdlOworCSh2b2lkKSBiaVhQZWxzUGVyTWV0ZXI7CisJKHZvaWQpIGJpWVBlbHNQZXJNZXRlcjsKKwkodm9pZCkgYmlDbHJJbXBvcnRhbnQ7CisKKwlpZiAoYmlIZWlnaHQgPCAwKSB7CisJCXRvcERvd24gPSBTRExfVFJVRTsKKwkJYmlIZWlnaHQgPSAtYmlIZWlnaHQ7CisJfSBlbHNlIHsKKwkJdG9wRG93biA9IFNETF9GQUxTRTsKKwl9CisKKwkvKiBDaGVjayBmb3IgcmVhZCBlcnJvciAqLworCWlmICggU0RMX3N0cmNtcChTRExfR2V0RXJyb3IoKSwgIiIpICE9IDAgKSB7CisJCXdhc19lcnJvciA9IFNETF9UUlVFOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogRXhwYW5kIDEgYW5kIDQgYml0IGJpdG1hcHMgdG8gOCBiaXRzIHBlciBwaXhlbCAqLworCXN3aXRjaCAoYmlCaXRDb3VudCkgeworCQljYXNlIDE6CisJCWNhc2UgNDoKKwkJCUV4cGFuZEJNUCA9IGJpQml0Q291bnQ7CisJCQliaUJpdENvdW50ID0gODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRXhwYW5kQk1QID0gMDsKKwkJCWJyZWFrOworCX0KKworCS8qIFdlIGRvbid0IHN1cHBvcnQgYW55IEJNUCBjb21wcmVzc2lvbiByaWdodCBub3cgKi8KKwlSbWFzayA9IEdtYXNrID0gQm1hc2sgPSAwOworCXN3aXRjaCAoYmlDb21wcmVzc2lvbikgeworCQljYXNlIEJJX1JHQjoKKwkJCS8qIElmIHRoZXJlIGFyZSBubyBtYXNrcywgdXNlIHRoZSBkZWZhdWx0cyAqLworCQkJaWYgKCBiZk9mZkJpdHMgPT0gKDE0K2JpU2l6ZSkgKSB7CisJCQkJLyogRGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBCTVAgZm9ybWF0ICovCisJCQkJc3dpdGNoIChiaUJpdENvdW50KSB7CisJCQkJCWNhc2UgMTU6CisJCQkJCWNhc2UgMTY6CisJCQkJCQlSbWFzayA9IDB4N0MwMDsKKwkJCQkJCUdtYXNrID0gMHgwM0UwOworCQkJCQkJQm1hc2sgPSAweDAwMUY7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyNDoKKyNpZiBTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOCisJCQkJCSAgICAgICAgUm1hc2sgPSAweDAwMDAwMEZGOworCQkJCQkgICAgICAgIEdtYXNrID0gMHgwMDAwRkYwMDsKKwkJCQkJICAgICAgICBCbWFzayA9IDB4MDBGRjAwMDA7CisJCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCQljYXNlIDMyOgorCQkJCQkJUm1hc2sgPSAweDAwRkYwMDAwOworCQkJCQkJR21hc2sgPSAweDAwMDBGRjAwOworCQkJCQkJQm1hc2sgPSAweDAwMDAwMEZGOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGYWxsIHRocm91Z2ggLS0gcmVhZCB0aGUgUkdCIG1hc2tzICovCisKKwkJY2FzZSBCSV9CSVRGSUVMRFM6CisJCQlzd2l0Y2ggKGJpQml0Q291bnQpIHsKKwkJCQljYXNlIDE1OgorCQkJCWNhc2UgMTY6CisJCQkJY2FzZSAzMjoKKwkJCQkJUm1hc2sgPSBTRExfUmVhZExFMzIoc3JjKTsKKwkJCQkJR21hc2sgPSBTRExfUmVhZExFMzIoc3JjKTsKKwkJCQkJQm1hc2sgPSBTRExfUmVhZExFMzIoc3JjKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNETF9TZXRFcnJvcigiQ29tcHJlc3NlZCBCTVAgZmlsZXMgbm90IHN1cHBvcnRlZCIpOworCQkJd2FzX2Vycm9yID0gU0RMX1RSVUU7CisJCQlnb3RvIGRvbmU7CisJfQorCisJLyogQ3JlYXRlIGEgY29tcGF0aWJsZSBzdXJmYWNlLCBub3RlIHRoYXQgdGhlIGNvbG9ycyBhcmUgUkdCIG9yZGVyZWQgKi8KKwlzdXJmYWNlID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwKKwkJCWJpV2lkdGgsIGJpSGVpZ2h0LCBiaUJpdENvdW50LCBSbWFzaywgR21hc2ssIEJtYXNrLCAwKTsKKwlpZiAoIHN1cmZhY2UgPT0gTlVMTCApIHsKKwkJd2FzX2Vycm9yID0gU0RMX1RSVUU7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBMb2FkIHRoZSBwYWxldHRlLCBpZiBhbnkgKi8KKwlwYWxldHRlID0gKHN1cmZhY2UtPmZvcm1hdCktPnBhbGV0dGU7CisJaWYgKCBwYWxldHRlICkgeworCQlpZiAoIGJpQ2xyVXNlZCA9PSAwICkgeworCQkJYmlDbHJVc2VkID0gMSA8PCBiaUJpdENvdW50OworCQl9CisJCWlmICggYmlTaXplID09IDEyICkgeworCQkJZm9yICggaSA9IDA7IGkgPCAoaW50KWJpQ2xyVXNlZDsgKytpICkgeworCQkJCVNETF9SV3JlYWQoc3JjLCAmcGFsZXR0ZS0+Y29sb3JzW2ldLmIsIDEsIDEpOworCQkJCVNETF9SV3JlYWQoc3JjLCAmcGFsZXR0ZS0+Y29sb3JzW2ldLmcsIDEsIDEpOworCQkJCVNETF9SV3JlYWQoc3JjLCAmcGFsZXR0ZS0+Y29sb3JzW2ldLnIsIDEsIDEpOworCQkJCXBhbGV0dGUtPmNvbG9yc1tpXS51bnVzZWQgPSAwOworCQkJfQkKKwkJfSBlbHNlIHsKKwkJCWZvciAoIGkgPSAwOyBpIDwgKGludCliaUNsclVzZWQ7ICsraSApIHsKKwkJCQlTRExfUldyZWFkKHNyYywgJnBhbGV0dGUtPmNvbG9yc1tpXS5iLCAxLCAxKTsKKwkJCQlTRExfUldyZWFkKHNyYywgJnBhbGV0dGUtPmNvbG9yc1tpXS5nLCAxLCAxKTsKKwkJCQlTRExfUldyZWFkKHNyYywgJnBhbGV0dGUtPmNvbG9yc1tpXS5yLCAxLCAxKTsKKwkJCQlTRExfUldyZWFkKHNyYywgJnBhbGV0dGUtPmNvbG9yc1tpXS51bnVzZWQsIDEsIDEpOworCQkJfQkKKwkJfQorCQlwYWxldHRlLT5uY29sb3JzID0gYmlDbHJVc2VkOworCX0KKworCS8qIFJlYWQgdGhlIHN1cmZhY2UgcGl4ZWxzLiAgTm90ZSB0aGF0IHRoZSBibXAgaW1hZ2UgaXMgdXBzaWRlIGRvd24gKi8KKwlpZiAoIFNETF9SV3NlZWsoc3JjLCBmcF9vZmZzZXQrYmZPZmZCaXRzLCBSV19TRUVLX1NFVCkgPCAwICkgeworCQlTRExfRXJyb3IoU0RMX0VGU0VFSyk7CisJCXdhc19lcnJvciA9IFNETF9UUlVFOworCQlnb3RvIGRvbmU7CisJfQorCXRvcCA9IChVaW50OCAqKXN1cmZhY2UtPnBpeGVsczsKKwllbmQgPSAoVWludDggKilzdXJmYWNlLT5waXhlbHMrKHN1cmZhY2UtPmgqc3VyZmFjZS0+cGl0Y2gpOworCXN3aXRjaCAoRXhwYW5kQk1QKSB7CisJCWNhc2UgMToKKwkJCWJtcFBpdGNoID0gKGJpV2lkdGggKyA3KSA+PiAzOworCQkJcGFkICA9ICgoKGJtcFBpdGNoKSU0KSA/ICg0LSgoYm1wUGl0Y2gpJTQpKSA6IDApOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWJtcFBpdGNoID0gKGJpV2lkdGggKyAxKSA+PiAxOworCQkJcGFkICA9ICgoKGJtcFBpdGNoKSU0KSA/ICg0LSgoYm1wUGl0Y2gpJTQpKSA6IDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYWQgID0gKChzdXJmYWNlLT5waXRjaCU0KSA/CisJCQkJCSg0LShzdXJmYWNlLT5waXRjaCU0KSkgOiAwKTsKKwkJCWJyZWFrOworCX0KKwlpZiAoIHRvcERvd24gKSB7CisJCWJpdHMgPSB0b3A7CisJfSBlbHNlIHsKKwkJYml0cyA9IGVuZCAtIHN1cmZhY2UtPnBpdGNoOworCX0KKwl3aGlsZSAoIGJpdHMgPj0gdG9wICYmIGJpdHMgPCBlbmQgKSB7CisJCXN3aXRjaCAoRXhwYW5kQk1QKSB7CisJCQljYXNlIDE6CisJCQljYXNlIDQ6IHsKKwkJCVVpbnQ4IHBpeGVsID0gMDsKKwkJCWludCAgIHNoaWZ0ID0gKDgtRXhwYW5kQk1QKTsKKwkJCWZvciAoIGk9MDsgaTxzdXJmYWNlLT53OyArK2kgKSB7CisJCQkJaWYgKCBpJSg4L0V4cGFuZEJNUCkgPT0gMCApIHsKKwkJCQkJaWYgKCAhU0RMX1JXcmVhZChzcmMsICZwaXhlbCwgMSwgMSkgKSB7CisJCQkJCQlTRExfU2V0RXJyb3IoCisJCQkJCSJFcnJvciByZWFkaW5nIGZyb20gQk1QIik7CisJCQkJCQl3YXNfZXJyb3IgPSBTRExfVFJVRTsKKwkJCQkJCWdvdG8gZG9uZTsKKwkJCQkJfQorCQkJCX0KKwkJCQkqKGJpdHMraSkgPSAocGl4ZWw+PnNoaWZ0KTsKKwkJCQlwaXhlbCA8PD0gRXhwYW5kQk1QOworCQkJfSB9CisJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCWlmICggU0RMX1JXcmVhZChzcmMsIGJpdHMsIDEsIHN1cmZhY2UtPnBpdGNoKQorCQkJCQkJCSAhPSBzdXJmYWNlLT5waXRjaCApIHsKKwkJCQlTRExfRXJyb3IoU0RMX0VGUkVBRCk7CisJCQkJd2FzX2Vycm9yID0gU0RMX1RSVUU7CisJCQkJZ290byBkb25lOworCQkJfQorI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KKwkJCS8qIEJ5dGUtc3dhcCB0aGUgcGl4ZWxzIGlmIG5lZWRlZC4gTm90ZSB0aGF0IHRoZSAyNGJwcAorCQkJICAgY2FzZSBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YgYWJvdmUuICovCisJCQlzd2l0Y2goYmlCaXRDb3VudCkgeworCQkJCWNhc2UgMTU6CisJCQkJY2FzZSAxNjogeworCQkJCSAgICAgICAgVWludDE2ICpwaXggPSAoVWludDE2ICopYml0czsKKwkJCQkJZm9yKGkgPSAwOyBpIDwgc3VyZmFjZS0+dzsgaSsrKQorCQkJCQkgICAgICAgIHBpeFtpXSA9IFNETF9Td2FwMTYocGl4W2ldKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSAzMjogeworCQkJCSAgICAgICAgVWludDMyICpwaXggPSAoVWludDMyICopYml0czsKKwkJCQkJZm9yKGkgPSAwOyBpIDwgc3VyZmFjZS0+dzsgaSsrKQorCQkJCQkgICAgICAgIHBpeFtpXSA9IFNETF9Td2FwMzIocGl4W2ldKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQkvKiBTa2lwIHBhZGRpbmcgYnl0ZXMsIHVnaCAqLworCQlpZiAoIHBhZCApIHsKKwkJCVVpbnQ4IHBhZGJ5dGU7CisJCQlmb3IgKCBpPTA7IGk8cGFkOyArK2kgKSB7CisJCQkJU0RMX1JXcmVhZChzcmMsICZwYWRieXRlLCAxLCAxKTsKKwkJCX0KKwkJfQorCQlpZiAoIHRvcERvd24gKSB7CisJCQliaXRzICs9IHN1cmZhY2UtPnBpdGNoOworCQl9IGVsc2UgeworCQkJYml0cyAtPSBzdXJmYWNlLT5waXRjaDsKKwkJfQorCX0KK2RvbmU6CisJaWYgKCB3YXNfZXJyb3IgKSB7CisJCWlmICggc3JjICkgeworCQkJU0RMX1JXc2VlayhzcmMsIGZwX29mZnNldCwgUldfU0VFS19TRVQpOworCQl9CisJCWlmICggc3VyZmFjZSApIHsKKwkJCVNETF9GcmVlU3VyZmFjZShzdXJmYWNlKTsKKwkJfQorCQlzdXJmYWNlID0gTlVMTDsKKwl9CisJaWYgKCBmcmVlc3JjICYmIHNyYyApIHsKKwkJU0RMX1JXY2xvc2Uoc3JjKTsKKwl9CisJcmV0dXJuKHN1cmZhY2UpOworfQorCitpbnQgU0RMX1NhdmVCTVBfUlcgKFNETF9TdXJmYWNlICpzYXZlbWUsIFNETF9SV29wcyAqZHN0LCBpbnQgZnJlZWRzdCkKK3sKKwlsb25nIGZwX29mZnNldDsKKwlpbnQgaSwgcGFkOworCVNETF9TdXJmYWNlICpzdXJmYWNlOworCVVpbnQ4ICpiaXRzOworCisJLyogVGhlIFdpbjMyIEJNUCBmaWxlIGhlYWRlciAoMTQgYnl0ZXMpICovCisJY2hhciAgIG1hZ2ljWzJdID0geyAnQicsICdNJyB9OworCVVpbnQzMiBiZlNpemU7CisJVWludDE2IGJmUmVzZXJ2ZWQxOworCVVpbnQxNiBiZlJlc2VydmVkMjsKKwlVaW50MzIgYmZPZmZCaXRzOworCisJLyogVGhlIFdpbjMyIEJJVE1BUElORk9IRUFERVIgc3RydWN0ICg0MCBieXRlcykgKi8KKwlVaW50MzIgYmlTaXplOworCVNpbnQzMiBiaVdpZHRoOworCVNpbnQzMiBiaUhlaWdodDsKKwlVaW50MTYgYmlQbGFuZXM7CisJVWludDE2IGJpQml0Q291bnQ7CisJVWludDMyIGJpQ29tcHJlc3Npb247CisJVWludDMyIGJpU2l6ZUltYWdlOworCVNpbnQzMiBiaVhQZWxzUGVyTWV0ZXI7CisJU2ludDMyIGJpWVBlbHNQZXJNZXRlcjsKKwlVaW50MzIgYmlDbHJVc2VkOworCVVpbnQzMiBiaUNsckltcG9ydGFudDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV3aGVyZSB0byBzYXZlICovCisJc3VyZmFjZSA9IE5VTEw7CisJaWYgKCBkc3QgKSB7CisJCWlmICggc2F2ZW1lLT5mb3JtYXQtPnBhbGV0dGUgKSB7CisJCQlpZiAoIHNhdmVtZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gOCApIHsKKwkJCQlzdXJmYWNlID0gc2F2ZW1lOworCQkJfSBlbHNlIHsKKwkJCQlTRExfU2V0RXJyb3IoIiVkIGJwcCBCTVAgZmlsZXMgbm90IHN1cHBvcnRlZCIsCisJCQkJCQlzYXZlbWUtPmZvcm1hdC0+Qml0c1BlclBpeGVsKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggKHNhdmVtZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gMjQpICYmCisjaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgorCQkJCShzYXZlbWUtPmZvcm1hdC0+Um1hc2sgPT0gMHgwMEZGMDAwMCkgJiYKKwkJCQkoc2F2ZW1lLT5mb3JtYXQtPkdtYXNrID09IDB4MDAwMEZGMDApICYmCisJCQkJKHNhdmVtZS0+Zm9ybWF0LT5CbWFzayA9PSAweDAwMDAwMEZGKQorI2Vsc2UKKwkJCQkoc2F2ZW1lLT5mb3JtYXQtPlJtYXNrID09IDB4MDAwMDAwRkYpICYmCisJCQkJKHNhdmVtZS0+Zm9ybWF0LT5HbWFzayA9PSAweDAwMDBGRjAwKSAmJgorCQkJCShzYXZlbWUtPmZvcm1hdC0+Qm1hc2sgPT0gMHgwMEZGMDAwMCkKKyNlbmRpZgorCQkJICApIHsKKwkJCXN1cmZhY2UgPSBzYXZlbWU7CisJCX0gZWxzZSB7CisJCQlTRExfUmVjdCBib3VuZHM7CisKKwkJCS8qIENvbnZlcnQgdG8gMjQgYml0cyBwZXIgcGl4ZWwgKi8KKwkJCXN1cmZhY2UgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLAorCQkJCQlzYXZlbWUtPncsIHNhdmVtZS0+aCwgMjQsCisjaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgorCQkJCQkweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGLAorI2Vsc2UKKwkJCQkJMHgwMDAwMDBGRiwgMHgwMDAwRkYwMCwgMHgwMEZGMDAwMCwKKyNlbmRpZgorCQkJCQkwKTsKKwkJCWlmICggc3VyZmFjZSAhPSBOVUxMICkgeworCQkJCWJvdW5kcy54ID0gMDsKKwkJCQlib3VuZHMueSA9IDA7CisJCQkJYm91bmRzLncgPSBzYXZlbWUtPnc7CisJCQkJYm91bmRzLmggPSBzYXZlbWUtPmg7CisJCQkJaWYgKCBTRExfTG93ZXJCbGl0KHNhdmVtZSwgJmJvdW5kcywgc3VyZmFjZSwKKwkJCQkJCQkmYm91bmRzKSA8IDAgKSB7CisJCQkJCVNETF9GcmVlU3VyZmFjZShzdXJmYWNlKTsKKwkJCQkJU0RMX1NldEVycm9yKAorCQkJCQkiQ291bGRuJ3QgY29udmVydCBpbWFnZSB0byAyNCBicHAiKTsKKwkJCQkJc3VyZmFjZSA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKCBzdXJmYWNlICYmIChTRExfTG9ja1N1cmZhY2Uoc3VyZmFjZSkgPT0gMCkgKSB7CisJCWNvbnN0IGludCBidyA9IHN1cmZhY2UtPncqc3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCisJCS8qIFNldCB0aGUgQk1QIGZpbGUgaGVhZGVyIHZhbHVlcyAqLworCQliZlNpemUgPSAwOwkJIC8qIFdlJ2xsIHdyaXRlIHRoaXMgd2hlbiB3ZSdyZSBkb25lICovCisJCWJmUmVzZXJ2ZWQxID0gMDsKKwkJYmZSZXNlcnZlZDIgPSAwOworCQliZk9mZkJpdHMgPSAwOwkJLyogV2UnbGwgd3JpdGUgdGhpcyB3aGVuIHdlJ3JlIGRvbmUgKi8KKworCQkvKiBXcml0ZSB0aGUgQk1QIGZpbGUgaGVhZGVyIHZhbHVlcyAqLworCQlmcF9vZmZzZXQgPSBTRExfUld0ZWxsKGRzdCk7CisJCVNETF9DbGVhckVycm9yKCk7CisJCVNETF9SV3dyaXRlKGRzdCwgbWFnaWMsIDIsIDEpOworCQlTRExfV3JpdGVMRTMyKGRzdCwgYmZTaXplKTsKKwkJU0RMX1dyaXRlTEUxNihkc3QsIGJmUmVzZXJ2ZWQxKTsKKwkJU0RMX1dyaXRlTEUxNihkc3QsIGJmUmVzZXJ2ZWQyKTsKKwkJU0RMX1dyaXRlTEUzMihkc3QsIGJmT2ZmQml0cyk7CisKKwkJLyogU2V0IHRoZSBCTVAgaW5mbyB2YWx1ZXMgKi8KKwkJYmlTaXplID0gNDA7CisJCWJpV2lkdGggPSBzdXJmYWNlLT53OworCQliaUhlaWdodCA9IHN1cmZhY2UtPmg7CisJCWJpUGxhbmVzID0gMTsKKwkJYmlCaXRDb3VudCA9IHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsOworCQliaUNvbXByZXNzaW9uID0gQklfUkdCOworCQliaVNpemVJbWFnZSA9IHN1cmZhY2UtPmgqc3VyZmFjZS0+cGl0Y2g7CisJCWJpWFBlbHNQZXJNZXRlciA9IDA7CisJCWJpWVBlbHNQZXJNZXRlciA9IDA7CisJCWlmICggc3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlICkgeworCQkJYmlDbHJVc2VkID0gc3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5uY29sb3JzOworCQl9IGVsc2UgeworCQkJYmlDbHJVc2VkID0gMDsKKwkJfQorCQliaUNsckltcG9ydGFudCA9IDA7CisKKwkJLyogV3JpdGUgdGhlIEJNUCBpbmZvIHZhbHVlcyAqLworCQlTRExfV3JpdGVMRTMyKGRzdCwgYmlTaXplKTsKKwkJU0RMX1dyaXRlTEUzMihkc3QsIGJpV2lkdGgpOworCQlTRExfV3JpdGVMRTMyKGRzdCwgYmlIZWlnaHQpOworCQlTRExfV3JpdGVMRTE2KGRzdCwgYmlQbGFuZXMpOworCQlTRExfV3JpdGVMRTE2KGRzdCwgYmlCaXRDb3VudCk7CisJCVNETF9Xcml0ZUxFMzIoZHN0LCBiaUNvbXByZXNzaW9uKTsKKwkJU0RMX1dyaXRlTEUzMihkc3QsIGJpU2l6ZUltYWdlKTsKKwkJU0RMX1dyaXRlTEUzMihkc3QsIGJpWFBlbHNQZXJNZXRlcik7CisJCVNETF9Xcml0ZUxFMzIoZHN0LCBiaVlQZWxzUGVyTWV0ZXIpOworCQlTRExfV3JpdGVMRTMyKGRzdCwgYmlDbHJVc2VkKTsKKwkJU0RMX1dyaXRlTEUzMihkc3QsIGJpQ2xySW1wb3J0YW50KTsKKworCQkvKiBXcml0ZSB0aGUgcGFsZXR0ZSAoaW4gQkdSIGNvbG9yIG9yZGVyKSAqLworCQlpZiAoIHN1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZSApIHsKKwkJCVNETF9Db2xvciAqY29sb3JzOworCQkJaW50ICAgICAgIG5jb2xvcnM7CisKKwkJCWNvbG9ycyA9IHN1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzOworCQkJbmNvbG9ycyA9IHN1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsKKwkJCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7CisJCQkJU0RMX1JXd3JpdGUoZHN0LCAmY29sb3JzW2ldLmIsIDEsIDEpOworCQkJCVNETF9SV3dyaXRlKGRzdCwgJmNvbG9yc1tpXS5nLCAxLCAxKTsKKwkJCQlTRExfUld3cml0ZShkc3QsICZjb2xvcnNbaV0uciwgMSwgMSk7CisJCQkJU0RMX1JXd3JpdGUoZHN0LCAmY29sb3JzW2ldLnVudXNlZCwgMSwgMSk7CisJCQl9CisJCX0KKworCQkvKiBXcml0ZSB0aGUgYml0bWFwIG9mZnNldCAqLworCQliZk9mZkJpdHMgPSBTRExfUld0ZWxsKGRzdCktZnBfb2Zmc2V0OworCQlpZiAoIFNETF9SV3NlZWsoZHN0LCBmcF9vZmZzZXQrMTAsIFJXX1NFRUtfU0VUKSA8IDAgKSB7CisJCQlTRExfRXJyb3IoU0RMX0VGU0VFSyk7CisJCX0KKwkJU0RMX1dyaXRlTEUzMihkc3QsIGJmT2ZmQml0cyk7CisJCWlmICggU0RMX1JXc2Vlayhkc3QsIGZwX29mZnNldCtiZk9mZkJpdHMsIFJXX1NFRUtfU0VUKSA8IDAgKSB7CisJCQlTRExfRXJyb3IoU0RMX0VGU0VFSyk7CisJCX0KKworCQkvKiBXcml0ZSB0aGUgYml0bWFwIGltYWdlIHVwc2lkZSBkb3duICovCisJCWJpdHMgPSAoVWludDggKilzdXJmYWNlLT5waXhlbHMrKHN1cmZhY2UtPmgqc3VyZmFjZS0+cGl0Y2gpOworCQlwYWQgID0gKChidyU0KSA/ICg0LShidyU0KSkgOiAwKTsKKwkJd2hpbGUgKCBiaXRzID4gKFVpbnQ4ICopc3VyZmFjZS0+cGl4ZWxzICkgeworCQkJYml0cyAtPSBzdXJmYWNlLT5waXRjaDsKKwkJCWlmICggU0RMX1JXd3JpdGUoZHN0LCBiaXRzLCAxLCBidykgIT0gYncpIHsKKwkJCQlTRExfRXJyb3IoU0RMX0VGV1JJVEUpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCBwYWQgKSB7CisJCQkJY29uc3QgVWludDggcGFkYnl0ZSA9IDA7CisJCQkJZm9yICggaT0wOyBpPHBhZDsgKytpICkgeworCQkJCQlTRExfUld3cml0ZShkc3QsICZwYWRieXRlLCAxLCAxKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBXcml0ZSB0aGUgQk1QIGZpbGUgc2l6ZSAqLworCQliZlNpemUgPSBTRExfUld0ZWxsKGRzdCktZnBfb2Zmc2V0OworCQlpZiAoIFNETF9SV3NlZWsoZHN0LCBmcF9vZmZzZXQrMiwgUldfU0VFS19TRVQpIDwgMCApIHsKKwkJCVNETF9FcnJvcihTRExfRUZTRUVLKTsKKwkJfQorCQlTRExfV3JpdGVMRTMyKGRzdCwgYmZTaXplKTsKKwkJaWYgKCBTRExfUldzZWVrKGRzdCwgZnBfb2Zmc2V0K2JmU2l6ZSwgUldfU0VFS19TRVQpIDwgMCApIHsKKwkJCVNETF9FcnJvcihTRExfRUZTRUVLKTsKKwkJfQorCisJCS8qIENsb3NlIGl0IHVwLi4gKi8KKwkJU0RMX1VubG9ja1N1cmZhY2Uoc3VyZmFjZSk7CisJCWlmICggc3VyZmFjZSAhPSBzYXZlbWUgKSB7CisJCQlTRExfRnJlZVN1cmZhY2Uoc3VyZmFjZSk7CisJCX0KKwl9CisKKwlpZiAoIGZyZWVkc3QgJiYgZHN0ICkgeworCQlTRExfUldjbG9zZShkc3QpOworCX0KKwlyZXR1cm4oKFNETF9zdHJjbXAoU0RMX0dldEVycm9yKCksICIiKSA9PSAwKSA/IDAgOiAtMSk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9jdXJzb3IuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX2N1cnNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzQ3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9jdXJzb3IuYwpAQCAtMCwwICsxLDc1OCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEdlbmVyYWwgY3Vyc29yIGhhbmRsaW5nIGNvZGUgZm9yIFNETCAqLworCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiU0RMX2JsaXQuaCIKKyNpbmNsdWRlICJTRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfY3Vyc29yX2MuaCIKKyNpbmNsdWRlICJTRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICJkZWZhdWx0X2N1cnNvci5oIgorI2luY2x1ZGUgIi4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisvKiBUaGVzZSBhcmUgc3RhdGljIGZvciBvdXIgY3Vyc29yIGhhbmRsaW5nIGNvZGUgKi8KK3ZvbGF0aWxlIGludCBTRExfY3Vyc29yc3RhdGUgPSBDVVJTT1JfVklTSUJMRTsKK1NETF9DdXJzb3IgKlNETF9jdXJzb3IgPSBOVUxMOworc3RhdGljIFNETF9DdXJzb3IgKlNETF9kZWZjdXJzb3IgPSBOVUxMOworU0RMX211dGV4ICpTRExfY3Vyc29ybG9jayA9IE5VTEw7CisKKy8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KK3ZvaWQgU0RMX0N1cnNvclF1aXQodm9pZCkKK3sKKwlpZiAoIFNETF9jdXJzb3IgIT0gTlVMTCApIHsKKwkJU0RMX0N1cnNvciAqY3Vyc29yOworCisJCVNETF9jdXJzb3JzdGF0ZSAmPSB+Q1VSU09SX1ZJU0lCTEU7CisJCWlmICggU0RMX2N1cnNvciAhPSBTRExfZGVmY3Vyc29yICkgeworCQkJU0RMX0ZyZWVDdXJzb3IoU0RMX2N1cnNvcik7CisJCX0KKwkJU0RMX2N1cnNvciA9IE5VTEw7CisJCWlmICggU0RMX2RlZmN1cnNvciAhPSBOVUxMICkgeworCQkJY3Vyc29yID0gU0RMX2RlZmN1cnNvcjsKKwkJCVNETF9kZWZjdXJzb3IgPSBOVUxMOworCQkJU0RMX0ZyZWVDdXJzb3IoY3Vyc29yKTsKKwkJfQorCX0KKwlpZiAoIFNETF9jdXJzb3Jsb2NrICE9IE5VTEwgKSB7CisJCVNETF9EZXN0cm95TXV0ZXgoU0RMX2N1cnNvcmxvY2spOworCQlTRExfY3Vyc29ybG9jayA9IE5VTEw7CisJfQorfQoraW50IFNETF9DdXJzb3JJbml0KFVpbnQzMiBtdWx0aXRocmVhZGVkKQoreworCS8qIFdlIGRvbid0IGhhdmUgbW91c2UgZm9jdXMsIGFuZCB0aGUgY3Vyc29yIGlzbid0IGRyYXduIHlldCAqLworI2lmbmRlZiBJUE9ECisJU0RMX2N1cnNvcnN0YXRlID0gQ1VSU09SX1ZJU0lCTEU7CisjZW5kaWYKKworCS8qIENyZWF0ZSB0aGUgZGVmYXVsdCBjdXJzb3IgKi8KKwlpZiAoIFNETF9kZWZjdXJzb3IgPT0gTlVMTCApIHsKKwkJU0RMX2RlZmN1cnNvciA9IFNETF9DcmVhdGVDdXJzb3IoZGVmYXVsdF9jZGF0YSwgZGVmYXVsdF9jbWFzaywKKwkJCQkJREVGQVVMVF9DV0lEVEgsIERFRkFVTFRfQ0hFSUdIVCwKKwkJCQkJCURFRkFVTFRfQ0hPVFgsIERFRkFVTFRfQ0hPVFkpOworCQlTRExfU2V0Q3Vyc29yKFNETF9kZWZjdXJzb3IpOworCX0KKworCS8qIENyZWF0ZSBhIGxvY2sgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCBtdWx0aXRocmVhZGVkICkgeworCQlTRExfY3Vyc29ybG9jayA9IFNETF9DcmVhdGVNdXRleCgpOworCX0KKworCS8qIFRoYXQncyBpdCEgKi8KKwlyZXR1cm4oMCk7Cit9CisKKy8qIE11bHRpLXRocmVhZCBzdXBwb3J0IGZvciBjdXJzb3JzICovCisjaWZuZGVmIFNETF9Mb2NrQ3Vyc29yCit2b2lkIFNETF9Mb2NrQ3Vyc29yKHZvaWQpCit7CisJaWYgKCBTRExfY3Vyc29ybG9jayApIHsKKwkJU0RMX211dGV4UChTRExfY3Vyc29ybG9jayk7CisJfQorfQorI2VuZGlmCisjaWZuZGVmIFNETF9VbmxvY2tDdXJzb3IKK3ZvaWQgU0RMX1VubG9ja0N1cnNvcih2b2lkKQoreworCWlmICggU0RMX2N1cnNvcmxvY2sgKSB7CisJCVNETF9tdXRleFYoU0RMX2N1cnNvcmxvY2spOworCX0KK30KKyNlbmRpZgorCisvKiBTb2Z0d2FyZSBjdXJzb3IgZHJhd2luZyBzdXBwb3J0ICovCitTRExfQ3Vyc29yICogU0RMX0NyZWF0ZUN1cnNvciAoVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCAKKwkJCQkJaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlpbnQgc2F2ZWxlbjsKKwlpbnQgaTsKKwlTRExfQ3Vyc29yICpjdXJzb3I7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHdpZHRoIGlzIGEgbXVsdGlwbGUgb2YgOCAqLworCXcgPSAoKHcrNykmfjcpOworCisJLyogU2FuaXR5IGNoZWNrIHRoZSBob3Qgc3BvdCAqLworCWlmICggKGhvdF94IDwgMCkgfHwgKGhvdF95IDwgMCkgfHwgKGhvdF94ID49IHcpIHx8IChob3RfeSA+PSBoKSApIHsKKwkJU0RMX1NldEVycm9yKCJDdXJzb3IgaG90IHNwb3QgZG9lc24ndCBsaWUgd2l0aGluIGN1cnNvciIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgY3Vyc29yICovCisJY3Vyc29yID0gKFNETF9DdXJzb3IgKilTRExfbWFsbG9jKHNpemVvZiAqY3Vyc29yKTsKKwlpZiAoIGN1cnNvciA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlzYXZlbGVuID0gKHcqNCkqaDsKKwljdXJzb3ItPmFyZWEueCA9IDA7CisJY3Vyc29yLT5hcmVhLnkgPSAwOworCWN1cnNvci0+YXJlYS53ID0gdzsKKwljdXJzb3ItPmFyZWEuaCA9IGg7CisJY3Vyc29yLT5ob3RfeCA9IGhvdF94OworCWN1cnNvci0+aG90X3kgPSBob3RfeTsKKwljdXJzb3ItPmRhdGEgPSAoVWludDggKilTRExfbWFsbG9jKCh3LzgpKmgqMik7CisJY3Vyc29yLT5tYXNrID0gY3Vyc29yLT5kYXRhKygody84KSpoKTsKKwljdXJzb3ItPnNhdmVbMF0gPSAoVWludDggKilTRExfbWFsbG9jKHNhdmVsZW4qMik7CisJY3Vyc29yLT5zYXZlWzFdID0gY3Vyc29yLT5zYXZlWzBdICsgc2F2ZWxlbjsKKwljdXJzb3ItPndtX2N1cnNvciA9IE5VTEw7CisJaWYgKCAhIGN1cnNvci0+ZGF0YSB8fCAhIGN1cnNvci0+c2F2ZVswXSApIHsKKwkJU0RMX0ZyZWVDdXJzb3IoY3Vyc29yKTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJZm9yICggaT0oKHcvOCkqaCktMTsgaT49MDsgLS1pICkgeworCQljdXJzb3ItPmRhdGFbaV0gPSBkYXRhW2ldOworCQljdXJzb3ItPm1hc2tbaV0gPSBtYXNrW2ldIHwgZGF0YVtpXTsKKwl9CisJU0RMX21lbXNldChjdXJzb3ItPnNhdmVbMF0sIDAsIHNhdmVsZW4qMik7CisKKwkvKiBJZiB0aGUgd2luZG93IG1hbmFnZXIgZ2l2ZXMgdXMgYSBnb29kIGN1cnNvciwgd2UncmUgZG9uZSEgKi8KKwlpZiAoIHZpZGVvLT5DcmVhdGVXTUN1cnNvciApIHsKKwkJY3Vyc29yLT53bV9jdXJzb3IgPSB2aWRlby0+Q3JlYXRlV01DdXJzb3IodmlkZW8sIGRhdGEsIG1hc2ssCisJCQkJCQkJdywgaCwgaG90X3gsIGhvdF95KTsKKwl9IGVsc2UgeworCQljdXJzb3ItPndtX2N1cnNvciA9IE5VTEw7CisJfQorCXJldHVybihjdXJzb3IpOworfQorCisvKiBTRExfU2V0Q3Vyc29yKE5VTEwpIGNhbiBiZSB1c2VkIHRvIGZvcmNlIHRoZSBjdXJzb3IgcmVkcmF3LAorICAgaWYgdGhpcyBpcyBkZXNpcmVkIGZvciBhbnkgcmVhc29uLiAgVGhpcyBpcyB1c2VkIHdoZW4gc2V0dGluZworICAgdGhlIHZpZGVvIG1vZGUgYW5kIHdoZW4gdGhlIFNETCB3aW5kb3cgZ2FpbnMgdGhlIG1vdXNlIGZvY3VzLgorICovCit2b2lkIFNETF9TZXRDdXJzb3IgKFNETF9DdXJzb3IgKmN1cnNvcikKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSB2aWRlbyBzdWJzeXN0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKwlpZiAoICEgdmlkZW8gKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBQcmV2ZW50IHRoZSBldmVudCB0aHJlYWQgZnJvbSBtb3ZpbmcgdGhlIG1vdXNlICovCisJU0RMX0xvY2tDdXJzb3IoKTsKKworCS8qIFNldCB0aGUgbmV3IGN1cnNvciAqLworCWlmICggY3Vyc29yICYmIChjdXJzb3IgIT0gU0RMX2N1cnNvcikgKSB7CisJCS8qIEVyYXNlIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uICovCisJCWlmICggU0hPVUxEX0RSQVdDVVJTT1IoU0RMX2N1cnNvcnN0YXRlKSApIHsKKwkJCVNETF9FcmFzZUN1cnNvcihTRExfVmlkZW9TdXJmYWNlKTsKKwkJfSBlbHNlIGlmICggdmlkZW8tPk1vdmVXTUN1cnNvciApIHsKKwkJCS8qIElmIHRoZSB2aWRlbyBkcml2ZXIgaXMgbW92aW5nIHRoZSBjdXJzb3IgZGlyZWN0bHksCisJCQkgICBpdCBuZWVkcyB0byBoaWRlIHRoZSBvbGQgY3Vyc29yIGJlZm9yZSAocG9zc2libHkpCisJCQkgICBzaG93aW5nIHRoZSBuZXcgb25lLiAgKEJ1dCBkb24ndCBlcmFzZSBOVUxMIGN1cnNvcikKKwkJCSAqLworCQkJaWYgKCBTRExfY3Vyc29yICYmIHZpZGVvLT5TaG93V01DdXJzb3IgKSB7CisJCQkJdmlkZW8tPlNob3dXTUN1cnNvcih0aGlzLCBOVUxMKTsKKwkJCX0KKwkJfQorCQlTRExfY3Vyc29yID0gY3Vyc29yOworCX0KKworCS8qIERyYXcgdGhlIG5ldyBtb3VzZSBjdXJzb3IgKi8KKwlpZiAoIFNETF9jdXJzb3IgJiYgKFNETF9jdXJzb3JzdGF0ZSZDVVJTT1JfVklTSUJMRSkgKSB7CisJCS8qIFVzZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgaWYgcG9zc2libGUgKi8KKwkJaW50IHNob3dfd21fY3Vyc29yID0gMDsKKwkJaWYgKCBTRExfY3Vyc29yLT53bV9jdXJzb3IgJiYgdmlkZW8tPlNob3dXTUN1cnNvciApIHsKKwkJCXNob3dfd21fY3Vyc29yID0gdmlkZW8tPlNob3dXTUN1cnNvcih0aGlzLCBTRExfY3Vyc29yLT53bV9jdXJzb3IpOworCQl9CisJCWlmICggc2hvd193bV9jdXJzb3IgKSB7CisJCQlTRExfY3Vyc29yc3RhdGUgJj0gfkNVUlNPUl9VU0lOR1NXOworCQl9IGVsc2UgeworCQkJU0RMX2N1cnNvcnN0YXRlIHw9IENVUlNPUl9VU0lOR1NXOworCQkJaWYgKCB2aWRlby0+U2hvd1dNQ3Vyc29yICkgeworCQkJCXZpZGVvLT5TaG93V01DdXJzb3IodGhpcywgTlVMTCk7CisJCQl9CisJCQl7IGludCB4LCB5OworCQkJCVNETF9HZXRNb3VzZVN0YXRlKCZ4LCAmeSk7CisJCQkJU0RMX2N1cnNvci0+YXJlYS54ID0gKHggLSBTRExfY3Vyc29yLT5ob3RfeCk7CisJCQkJU0RMX2N1cnNvci0+YXJlYS55ID0gKHkgLSBTRExfY3Vyc29yLT5ob3RfeSk7CisJCQl9CisJCQlTRExfRHJhd0N1cnNvcihTRExfVmlkZW9TdXJmYWNlKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEVyYXNlIHdpbmRvdyBtYW5hZ2VyIG1vdXNlIChjdXJzb3Igbm90IHZpc2libGUpICovCisJCWlmICggU0RMX2N1cnNvciAmJiAoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1VTSU5HU1cpICkgeworCQkJU0RMX0VyYXNlQ3Vyc29yKFNETF9WaWRlb1N1cmZhY2UpOworCQl9IGVsc2UgeworCQkJaWYgKCB2aWRlbyApIHsKKwkJCQlpZiAoIHZpZGVvLT5TaG93V01DdXJzb3IgKSB7CisJCQkJCXZpZGVvLT5TaG93V01DdXJzb3IodGhpcywgTlVMTCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCVNETF9VbmxvY2tDdXJzb3IoKTsKK30KKworU0RMX0N1cnNvciAqIFNETF9HZXRDdXJzb3IgKHZvaWQpCit7CisJcmV0dXJuKFNETF9jdXJzb3IpOworfQorCit2b2lkIFNETF9GcmVlQ3Vyc29yIChTRExfQ3Vyc29yICpjdXJzb3IpCit7CisJaWYgKCBjdXJzb3IgKSB7CisJCWlmICggY3Vyc29yID09IFNETF9jdXJzb3IgKSB7CisJCQlTRExfU2V0Q3Vyc29yKFNETF9kZWZjdXJzb3IpOworCQl9CisJCWlmICggY3Vyc29yICE9IFNETF9kZWZjdXJzb3IgKSB7CisJCQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwkJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCisJCQlpZiAoIGN1cnNvci0+ZGF0YSApIHsKKwkJCQlTRExfZnJlZShjdXJzb3ItPmRhdGEpOworCQkJfQorCQkJaWYgKCBjdXJzb3ItPnNhdmVbMF0gKSB7CisJCQkJU0RMX2ZyZWUoY3Vyc29yLT5zYXZlWzBdKTsKKwkJCX0KKwkJCWlmICggdmlkZW8gJiYgY3Vyc29yLT53bV9jdXJzb3IgKSB7CisJCQkJaWYgKCB2aWRlby0+RnJlZVdNQ3Vyc29yICkgeworCQkJCQl2aWRlby0+RnJlZVdNQ3Vyc29yKHRoaXMsIGN1cnNvci0+d21fY3Vyc29yKTsKKwkJCQl9CisJCQl9CisJCQlTRExfZnJlZShjdXJzb3IpOworCQl9CisJfQorfQorCitpbnQgU0RMX1Nob3dDdXJzb3IgKGludCB0b2dnbGUpCit7CisJaW50IHNob3dpbmc7CisKKwlzaG93aW5nID0gKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9WSVNJQkxFKTsKKwlpZiAoIHRvZ2dsZSA+PSAwICkgeworCQlTRExfTG9ja0N1cnNvcigpOworCQlpZiAoIHRvZ2dsZSApIHsKKwkJCVNETF9jdXJzb3JzdGF0ZSB8PSBDVVJTT1JfVklTSUJMRTsKKwkJfSBlbHNlIHsKKwkJCVNETF9jdXJzb3JzdGF0ZSAmPSB+Q1VSU09SX1ZJU0lCTEU7CisJCX0KKwkJU0RMX1VubG9ja0N1cnNvcigpOworCQlpZiAoIChTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSkgIT0gc2hvd2luZyApIHsKKwkJCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCQkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CisKKwkJCVNETF9TZXRDdXJzb3IoTlVMTCk7CisJCQlpZiAoIHZpZGVvICYmIHZpZGVvLT5DaGVja01vdXNlTW9kZSApIHsKKwkJCQl2aWRlby0+Q2hlY2tNb3VzZU1vZGUodGhpcyk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBRdWVyeSBjdXJyZW50IHN0YXRlICovIDsKKwl9CisJcmV0dXJuKHNob3dpbmcgPyAxIDogMCk7Cit9CisKK3ZvaWQgU0RMX1dhcnBNb3VzZSAoVWludDE2IHgsIFVpbnQxNiB5KQoreworCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCisJaWYgKCAhdmlkZW8gfHwgIVNETF9QdWJsaWNTdXJmYWNlICkgeworCQlTRExfU2V0RXJyb3IoIkEgdmlkZW8gbW9kZSBtdXN0IGJlIHNldCBiZWZvcmUgd2FycGluZyBtb3VzZSIpOworCQlyZXR1cm47CisJfQorCisJLyogSWYgd2UgaGF2ZSBhbiBvZmZzZXQgdmlkZW8gbW9kZSwgb2Zmc2V0IHRoZSBtb3VzZSBjb29yZGluYXRlcyAqLworCWlmICh0aGlzLT5zY3JlZW4tPnBpdGNoID09IDApIHsKKwkJeCArPSB0aGlzLT5zY3JlZW4tPm9mZnNldCAvIHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCQl5ICs9IHRoaXMtPnNjcmVlbi0+b2Zmc2V0OworCX0gZWxzZSB7CisJCXggKz0gKHRoaXMtPnNjcmVlbi0+b2Zmc2V0ICUgdGhpcy0+c2NyZWVuLT5waXRjaCkgLworCQkgICAgICB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKKwkJeSArPSAodGhpcy0+c2NyZWVuLT5vZmZzZXQgLyB0aGlzLT5zY3JlZW4tPnBpdGNoKTsKKwl9CisKKwkvKiBUaGlzIGdlbmVyYXRlcyBhIG1vdXNlIG1vdGlvbiBldmVudCAqLworCWlmICggdmlkZW8tPldhcnBXTUN1cnNvciApIHsKKwkJdmlkZW8tPldhcnBXTUN1cnNvcih0aGlzLCB4LCB5KTsKKwl9IGVsc2UgeworCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHgsIHkpOworCX0KK30KKwordm9pZCBTRExfTW92ZUN1cnNvcihpbnQgeCwgaW50IHkpCit7CisJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisKKwkvKiBFcmFzZSBhbmQgdXBkYXRlIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uICovCisJaWYgKCBTSE9VTERfRFJBV0NVUlNPUihTRExfY3Vyc29yc3RhdGUpICkgeworCQkvKiBFcmFzZSBhbmQgcmVkcmF3IG1vdXNlIGN1cnNvciBpbiBuZXcgcG9zaXRpb24gKi8KKwkJU0RMX0xvY2tDdXJzb3IoKTsKKwkJU0RMX0VyYXNlQ3Vyc29yKFNETF9WaWRlb1N1cmZhY2UpOworCQlTRExfY3Vyc29yLT5hcmVhLnggPSAoeCAtIFNETF9jdXJzb3ItPmhvdF94KTsKKwkJU0RMX2N1cnNvci0+YXJlYS55ID0gKHkgLSBTRExfY3Vyc29yLT5ob3RfeSk7CisJCVNETF9EcmF3Q3Vyc29yKFNETF9WaWRlb1N1cmZhY2UpOworCQlTRExfVW5sb2NrQ3Vyc29yKCk7CisJfSBlbHNlIGlmICggdmlkZW8tPk1vdmVXTUN1cnNvciApIHsKKwkJdmlkZW8tPk1vdmVXTUN1cnNvcih2aWRlbywgeCwgeSk7CisJfQorfQorCisvKiBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGN1cnNvciBjb2xvcnMgKi8KK3N0YXRpYyBpbnQgcGFsZXR0ZV9jaGFuZ2VkID0gMTsKK3N0YXRpYyBVaW50OCBwaXhlbHM4WzJdOworCit2b2lkIFNETF9DdXJzb3JQYWxldHRlQ2hhbmdlZCh2b2lkKQoreworCXBhbGV0dGVfY2hhbmdlZCA9IDE7Cit9CisKK3ZvaWQgU0RMX01vdXNlUmVjdChTRExfUmVjdCAqYXJlYSkKK3sKKwlpbnQgY2xpcF9kaWZmOworCisJKmFyZWEgPSBTRExfY3Vyc29yLT5hcmVhOworCWlmICggYXJlYS0+eCA8IDAgKSB7CisJCWFyZWEtPncgKz0gYXJlYS0+eDsKKwkJYXJlYS0+eCA9IDA7CisJfQorCWlmICggYXJlYS0+eSA8IDAgKSB7CisJCWFyZWEtPmggKz0gYXJlYS0+eTsKKwkJYXJlYS0+eSA9IDA7CisJfQorCWNsaXBfZGlmZiA9IChhcmVhLT54K2FyZWEtPncpLVNETF9WaWRlb1N1cmZhY2UtPnc7CisJaWYgKCBjbGlwX2RpZmYgPiAwICkgeworCQlhcmVhLT53ID0gYXJlYS0+dyA8IGNsaXBfZGlmZiA/IDAgOiBhcmVhLT53LWNsaXBfZGlmZjsKKwl9CisJY2xpcF9kaWZmID0gKGFyZWEtPnkrYXJlYS0+aCktU0RMX1ZpZGVvU3VyZmFjZS0+aDsKKwlpZiAoIGNsaXBfZGlmZiA+IDAgKSB7CisJCWFyZWEtPmggPSBhcmVhLT5oIDwgY2xpcF9kaWZmID8gMCA6IGFyZWEtPmgtY2xpcF9kaWZmOworCX0KK30KKworc3RhdGljIHZvaWQgU0RMX0RyYXdDdXJzb3JGYXN0KFNETF9TdXJmYWNlICpzY3JlZW4sIFNETF9SZWN0ICphcmVhKQoreworCWNvbnN0IFVpbnQzMiBwaXhlbHNbMl0gPSB7IDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAgfTsKKwlpbnQgaSwgdywgaDsKKwlVaW50OCAqZGF0YSwgZGF0YWI7CisJVWludDggKm1hc2ssIG1hc2tiOworCisJZGF0YSA9IFNETF9jdXJzb3ItPmRhdGEgKyBhcmVhLT55ICogU0RMX2N1cnNvci0+YXJlYS53Lzg7CisJbWFzayA9IFNETF9jdXJzb3ItPm1hc2sgKyBhcmVhLT55ICogU0RMX2N1cnNvci0+YXJlYS53Lzg7CisJc3dpdGNoIChzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCkgeworCisJICAgIGNhc2UgMTogeworCQlVaW50OCAqZHN0OworCQlpbnQgZHN0c2tpcDsKKworCQlpZiAoIHBhbGV0dGVfY2hhbmdlZCApIHsKKwkJCXBpeGVsczhbMF0gPSAoVWludDgpU0RMX01hcFJHQihzY3JlZW4tPmZvcm1hdCwgMjU1LCAyNTUsIDI1NSk7CisJCQlwaXhlbHM4WzFdID0gKFVpbnQ4KVNETF9NYXBSR0Ioc2NyZWVuLT5mb3JtYXQsIDAsIDAsIDApOworCQkJcGFsZXR0ZV9jaGFuZ2VkID0gMDsKKwkJfQorCQlkc3QgPSAoVWludDggKilzY3JlZW4tPnBpeGVscyArCisgICAgICAgICAgICAgICAgICAgICAgIChTRExfY3Vyc29yLT5hcmVhLnkrYXJlYS0+eSkqc2NyZWVuLT5waXRjaCArCisgICAgICAgICAgICAgICAgICAgICAgIFNETF9jdXJzb3ItPmFyZWEueDsKKwkJZHN0c2tpcCA9IHNjcmVlbi0+cGl0Y2gtYXJlYS0+dzsKKworCQlmb3IgKCBoPWFyZWEtPmg7IGg7IGgtLSApIHsKKwkJCWZvciAoIHc9YXJlYS0+dy84OyB3OyB3LS0gKSB7CisJCQkJbWFza2IgPSAqbWFzaysrOworCQkJCWRhdGFiID0gKmRhdGErKzsKKwkJCQlmb3IgKCBpPTA7IGk8ODsgKytpICkgeworCQkJCQlpZiAoIG1hc2tiICYgMHg4MCApIHsKKwkJCQkJCSpkc3QgPSBwaXhlbHM4W2RhdGFiPj43XTsKKwkJCQkJfQorCQkJCQltYXNrYiA8PD0gMTsKKwkJCQkJZGF0YWIgPDw9IDE7CisJCQkJCWRzdCsrOworCQkJCX0KKwkJCX0KKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgY2FzZSAyOiB7CisJCVVpbnQxNiAqZHN0OworCQlpbnQgZHN0c2tpcDsKKworCQlkc3QgPSAoVWludDE2ICopc2NyZWVuLT5waXhlbHMgKworICAgICAgICAgICAgICAgICAgICAgICAoU0RMX2N1cnNvci0+YXJlYS55K2FyZWEtPnkpKnNjcmVlbi0+cGl0Y2gvMiArCisgICAgICAgICAgICAgICAgICAgICAgIFNETF9jdXJzb3ItPmFyZWEueDsKKwkJZHN0c2tpcCA9IChzY3JlZW4tPnBpdGNoLzIpLWFyZWEtPnc7CisKKwkJZm9yICggaD1hcmVhLT5oOyBoOyBoLS0gKSB7CisJCQlmb3IgKCB3PWFyZWEtPncvODsgdzsgdy0tICkgeworCQkJCW1hc2tiID0gKm1hc2srKzsKKwkJCQlkYXRhYiA9ICpkYXRhKys7CisJCQkJZm9yICggaT0wOyBpPDg7ICsraSApIHsKKwkJCQkJaWYgKCBtYXNrYiAmIDB4ODAgKSB7CisJCQkJCQkqZHN0ID0gKFVpbnQxNilwaXhlbHNbZGF0YWI+PjddOworCQkJCQl9CisJCQkJCW1hc2tiIDw8PSAxOworCQkJCQlkYXRhYiA8PD0gMTsKKwkJCQkJZHN0Kys7CisJCQkJfQorCQkJfQorCQkJZHN0ICs9IGRzdHNraXA7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCSAgICBjYXNlIDM6IHsKKwkJVWludDggKmRzdDsKKwkJaW50IGRzdHNraXA7CisKKwkJZHN0ID0gKFVpbnQ4ICopc2NyZWVuLT5waXhlbHMgKworICAgICAgICAgICAgICAgICAgICAgICAoU0RMX2N1cnNvci0+YXJlYS55K2FyZWEtPnkpKnNjcmVlbi0+cGl0Y2ggKworICAgICAgICAgICAgICAgICAgICAgICBTRExfY3Vyc29yLT5hcmVhLngqMzsKKwkJZHN0c2tpcCA9IHNjcmVlbi0+cGl0Y2gtYXJlYS0+dyozOworCisJCWZvciAoIGg9YXJlYS0+aDsgaDsgaC0tICkgeworCQkJZm9yICggdz1hcmVhLT53Lzg7IHc7IHctLSApIHsKKwkJCQltYXNrYiA9ICptYXNrKys7CisJCQkJZGF0YWIgPSAqZGF0YSsrOworCQkJCWZvciAoIGk9MDsgaTw4OyArK2kgKSB7CisJCQkJCWlmICggbWFza2IgJiAweDgwICkgeworCQkJCQkJU0RMX21lbXNldChkc3QscGl4ZWxzW2RhdGFiPj43XSwzKTsKKwkJCQkJfQorCQkJCQltYXNrYiA8PD0gMTsKKwkJCQkJZGF0YWIgPDw9IDE7CisJCQkJCWRzdCArPSAzOworCQkJCX0KKwkJCX0KKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgY2FzZSA0OiB7CisJCVVpbnQzMiAqZHN0OworCQlpbnQgZHN0c2tpcDsKKworCQlkc3QgPSAoVWludDMyICopc2NyZWVuLT5waXhlbHMgKworICAgICAgICAgICAgICAgICAgICAgICAoU0RMX2N1cnNvci0+YXJlYS55K2FyZWEtPnkpKnNjcmVlbi0+cGl0Y2gvNCArCisgICAgICAgICAgICAgICAgICAgICAgIFNETF9jdXJzb3ItPmFyZWEueDsKKwkJZHN0c2tpcCA9IChzY3JlZW4tPnBpdGNoLzQpLWFyZWEtPnc7CisKKwkJZm9yICggaD1hcmVhLT5oOyBoOyBoLS0gKSB7CisJCQlmb3IgKCB3PWFyZWEtPncvODsgdzsgdy0tICkgeworCQkJCW1hc2tiID0gKm1hc2srKzsKKwkJCQlkYXRhYiA9ICpkYXRhKys7CisJCQkJZm9yICggaT0wOyBpPDg7ICsraSApIHsKKwkJCQkJaWYgKCBtYXNrYiAmIDB4ODAgKSB7CisJCQkJCQkqZHN0ID0gcGl4ZWxzW2RhdGFiPj43XTsKKwkJCQkJfQorCQkJCQltYXNrYiA8PD0gMTsKKwkJCQkJZGF0YWIgPDw9IDE7CisJCQkJCWRzdCsrOworCQkJCX0KKwkJCX0KKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBTRExfRHJhd0N1cnNvclNsb3coU0RMX1N1cmZhY2UgKnNjcmVlbiwgU0RMX1JlY3QgKmFyZWEpCit7CisJY29uc3QgVWludDMyIHBpeGVsc1syXSA9IHsgMHhGRkZGRkYsIDB4MDAwMDAwIH07CisJaW50IGg7CisJaW50IHgsIG1pbngsIG1heHg7CisJVWludDggKmRhdGEsIGRhdGFiID0gMDsKKwlVaW50OCAqbWFzaywgbWFza2IgPSAwOworCVVpbnQ4ICpkc3Q7CisJaW50IGRzdGJwcCwgZHN0c2tpcDsKKworCWRhdGEgPSBTRExfY3Vyc29yLT5kYXRhICsgYXJlYS0+eSAqIFNETF9jdXJzb3ItPmFyZWEudy84OworCW1hc2sgPSBTRExfY3Vyc29yLT5tYXNrICsgYXJlYS0+eSAqIFNETF9jdXJzb3ItPmFyZWEudy84OworCWRzdGJwcCA9IHNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCWRzdCA9IChVaW50OCAqKXNjcmVlbi0+cGl4ZWxzICsKKyAgICAgICAgICAgICAgICAgICAgICAgKFNETF9jdXJzb3ItPmFyZWEueSthcmVhLT55KSpzY3JlZW4tPnBpdGNoICsKKyAgICAgICAgICAgICAgICAgICAgICAgU0RMX2N1cnNvci0+YXJlYS54KmRzdGJwcDsKKwlkc3Rza2lwID0gc2NyZWVuLT5waXRjaC1TRExfY3Vyc29yLT5hcmVhLncqZHN0YnBwOworCisJbWlueCA9IGFyZWEtPng7CisJbWF4eCA9IGFyZWEtPngrYXJlYS0+dzsKKwlpZiAoIHNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID09IDEgKSB7CisJCWlmICggcGFsZXR0ZV9jaGFuZ2VkICkgeworCQkJcGl4ZWxzOFswXSA9IChVaW50OClTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCAyNTUsIDI1NSwgMjU1KTsKKwkJCXBpeGVsczhbMV0gPSAoVWludDgpU0RMX01hcFJHQihzY3JlZW4tPmZvcm1hdCwgMCwgMCwgMCk7CisJCQlwYWxldHRlX2NoYW5nZWQgPSAwOworCQl9CisJCWZvciAoIGg9YXJlYS0+aDsgaDsgaC0tICkgeworCQkJZm9yICggeD0wOyB4PFNETF9jdXJzb3ItPmFyZWEudzsgKyt4ICkgeworCQkJCWlmICggKHglOCkgPT0gMCApIHsKKwkJCQkJbWFza2IgPSAqbWFzaysrOworCQkJCQlkYXRhYiA9ICpkYXRhKys7CisJCQkJfQorCQkJCWlmICggKHggPj0gbWlueCkgJiYgKHggPCBtYXh4KSApIHsKKwkJCQkJaWYgKCBtYXNrYiAmIDB4ODAgKSB7CisJCQkJCQlTRExfbWVtc2V0KGRzdCwgcGl4ZWxzOFtkYXRhYj4+N10sIGRzdGJwcCk7CisJCQkJCX0KKwkJCQl9CisJCQkJbWFza2IgPDw9IDE7CisJCQkJZGF0YWIgPDw9IDE7CisJCQkJZHN0ICs9IGRzdGJwcDsKKwkJCX0KKwkJCWRzdCArPSBkc3Rza2lwOworCQl9CisJfSBlbHNlIHsKKwkJZm9yICggaD1hcmVhLT5oOyBoOyBoLS0gKSB7CisJCQlmb3IgKCB4PTA7IHg8U0RMX2N1cnNvci0+YXJlYS53OyArK3ggKSB7CisJCQkJaWYgKCAoeCU4KSA9PSAwICkgeworCQkJCQltYXNrYiA9ICptYXNrKys7CisJCQkJCWRhdGFiID0gKmRhdGErKzsKKwkJCQl9CisJCQkJaWYgKCAoeCA+PSBtaW54KSAmJiAoeCA8IG1heHgpICkgeworCQkJCQlpZiAoIG1hc2tiICYgMHg4MCApIHsKKwkJCQkJCVNETF9tZW1zZXQoZHN0LCBwaXhlbHNbZGF0YWI+PjddLCBkc3RicHApOworCQkJCQl9CisJCQkJfQorCQkJCW1hc2tiIDw8PSAxOworCQkJCWRhdGFiIDw8PSAxOworCQkJCWRzdCArPSBkc3RicHA7CisJCQl9CisJCQlkc3QgKz0gZHN0c2tpcDsKKwkJfQorCX0KK30KKworLyogVGhpcyBoYW5kbGVzIHRoZSB1Z2x5IHdvcmsgb2YgY29udmVydGluZyB0aGUgc2F2ZWQgY3Vyc29yIGJhY2tncm91bmQgZnJvbQorICAgdGhlIHBpeGVsIGZvcm1hdCBvZiB0aGUgc2hhZG93IHN1cmZhY2UgdG8gdGhhdCBvZiB0aGUgdmlkZW8gc3VyZmFjZS4KKyAgIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBibGl0dGluZyBmcm9tIGEgc2hhZG93IHN1cmZhY2Ugb2YgYSBkaWZmZXJlbnQKKyAgIHBpeGVsIGZvcm1hdCB0aGFuIHRoZSB2aWRlbyBzdXJmYWNlLCBhbmQgdXNpbmcgYSBzb2Z0d2FyZSByZW5kZXJlZCBjdXJzb3IuCisqLworc3RhdGljIHZvaWQgU0RMX0NvbnZlcnRDdXJzb3JTYXZlKFNETF9TdXJmYWNlICpzY3JlZW4sIGludCB3LCBpbnQgaCkKK3sKKwlTRExfQmxpdEluZm8gaW5mbzsKKwlTRExfbG9ibGl0IFJ1bkJsaXQ7CisKKwkvKiBNYWtlIHN1cmUgd2UgY2FuIHN0ZWFsIHRoZSBibGl0IG1hcHBpbmcgKi8KKwlpZiAoIHNjcmVlbi0+bWFwLT5kc3QgIT0gU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJcmV0dXJuOworCX0KKworCS8qIFNldCB1cCB0aGUgYmxpdCBpbmZvcm1hdGlvbiAqLworCWluZm8uc19waXhlbHMgPSBTRExfY3Vyc29yLT5zYXZlWzFdOworCWluZm8uc193aWR0aCA9IHc7CisJaW5mby5zX2hlaWdodCA9IGg7CisJaW5mby5zX3NraXAgPSAwOworCWluZm8uZF9waXhlbHMgPSBTRExfY3Vyc29yLT5zYXZlWzBdOworCWluZm8uZF93aWR0aCA9IHc7CisJaW5mby5kX2hlaWdodCA9IGg7CisJaW5mby5kX3NraXAgPSAwOworCWluZm8uYXV4X2RhdGEgPSBzY3JlZW4tPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGE7CisJaW5mby5zcmMgPSBzY3JlZW4tPmZvcm1hdDsKKwlpbmZvLnRhYmxlID0gc2NyZWVuLT5tYXAtPnRhYmxlOworCWluZm8uZHN0ID0gU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0OworCVJ1bkJsaXQgPSBzY3JlZW4tPm1hcC0+c3dfZGF0YS0+YmxpdDsKKworCS8qIFJ1biB0aGUgYWN0dWFsIHNvZnR3YXJlIGJsaXQgKi8KKwlSdW5CbGl0KCZpbmZvKTsKK30KKwordm9pZCBTRExfRHJhd0N1cnNvck5vTG9jayhTRExfU3VyZmFjZSAqc2NyZWVuKQoreworCVNETF9SZWN0IGFyZWE7CisKKwkvKiBHZXQgdGhlIG1vdXNlIHJlY3RhbmdsZSwgY2xpcHBlZCB0byB0aGUgc2NyZWVuICovCisJU0RMX01vdXNlUmVjdCgmYXJlYSk7CisJaWYgKCAoYXJlYS53ID09IDApIHx8IChhcmVhLmggPT0gMCkgKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb3B5IG1vdXNlIGJhY2tncm91bmQgKi8KKwl7IGludCB3LCBoLCBzY3JlZW5icHA7CisJICBVaW50OCAqc3JjLCAqZHN0OworCisJICAvKiBTZXQgdXAgdGhlIGNvcHkgcG9pbnRlcnMgKi8KKwkgIHNjcmVlbmJwcCA9IHNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCSAgaWYgKCAoc2NyZWVuID09IFNETF9WaWRlb1N1cmZhY2UpIHx8CisJICAgICAgICAgIEZPUk1BVF9FUVVBTChzY3JlZW4tPmZvcm1hdCwgU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0KSApIHsKKwkJZHN0ID0gU0RMX2N1cnNvci0+c2F2ZVswXTsKKwkgIH0gZWxzZSB7CisJCWRzdCA9IFNETF9jdXJzb3ItPnNhdmVbMV07CisJICB9CisJICBzcmMgPSAoVWludDggKilzY3JlZW4tPnBpeGVscyArIGFyZWEueSAqIHNjcmVlbi0+cGl0Y2ggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS54ICogc2NyZWVuYnBwOworCisJICAvKiBQZXJmb3JtIHRoZSBjb3B5ICovCisJICB3ID0gYXJlYS53KnNjcmVlbmJwcDsKKwkgIGggPSBhcmVhLmg7CisJICB3aGlsZSAoIGgtLSApIHsKKwkJICBTRExfbWVtY3B5KGRzdCwgc3JjLCB3KTsKKwkJICBkc3QgKz0gdzsKKwkJICBzcmMgKz0gc2NyZWVuLT5waXRjaDsKKwkgIH0KKwl9CisKKwkvKiBEcmF3IHRoZSBtb3VzZSBjdXJzb3IgKi8KKwlhcmVhLnggLT0gU0RMX2N1cnNvci0+YXJlYS54OworCWFyZWEueSAtPSBTRExfY3Vyc29yLT5hcmVhLnk7CisJaWYgKCAoYXJlYS54ID09IDApICYmIChhcmVhLncgPT0gU0RMX2N1cnNvci0+YXJlYS53KSApIHsKKwkJU0RMX0RyYXdDdXJzb3JGYXN0KHNjcmVlbiwgJmFyZWEpOworCX0gZWxzZSB7CisJCVNETF9EcmF3Q3Vyc29yU2xvdyhzY3JlZW4sICZhcmVhKTsKKwl9Cit9CisKK3ZvaWQgU0RMX0RyYXdDdXJzb3IoU0RMX1N1cmZhY2UgKnNjcmVlbikKK3sKKwkvKiBMb2NrIHRoZSBzY3JlZW4gaWYgbmVjZXNzYXJ5ICovCisJaWYgKCBzY3JlZW4gPT0gTlVMTCApIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoIFNETF9NVVNUTE9DSyhzY3JlZW4pICkgeworCQlpZiAoIFNETF9Mb2NrU3VyZmFjZShzY3JlZW4pIDwgMCApIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCVNETF9EcmF3Q3Vyc29yTm9Mb2NrKHNjcmVlbik7CisKKwkvKiBVbmxvY2sgdGhlIHNjcmVlbiBhbmQgdXBkYXRlIGlmIG5lY2Vzc2FyeSAqLworCWlmICggU0RMX01VU1RMT0NLKHNjcmVlbikgKSB7CisJCVNETF9VbmxvY2tTdXJmYWNlKHNjcmVlbik7CisJfQorCWlmICggKHNjcmVlbiA9PSBTRExfVmlkZW9TdXJmYWNlKSAmJgorCSAgICAgKChzY3JlZW4tPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gU0RMX0hXU1VSRkFDRSkgKSB7CisJCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKKwkJU0RMX1JlY3QgYXJlYTsKKworCQlTRExfTW91c2VSZWN0KCZhcmVhKTsKKworCQkvKiBUaGlzIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGEgdmlkZW8gbW9kZSBpcyBzZXQgKi8KKwkJaWYgKCB2aWRlby0+VXBkYXRlUmVjdHMgKSB7CisJCQl2aWRlby0+VXBkYXRlUmVjdHModGhpcywgMSwgJmFyZWEpOworCQl9CisJfQorfQorCit2b2lkIFNETF9FcmFzZUN1cnNvck5vTG9jayhTRExfU3VyZmFjZSAqc2NyZWVuKQoreworCVNETF9SZWN0IGFyZWE7CisKKwkvKiBHZXQgdGhlIG1vdXNlIHJlY3RhbmdsZSwgY2xpcHBlZCB0byB0aGUgc2NyZWVuICovCisJU0RMX01vdXNlUmVjdCgmYXJlYSk7CisJaWYgKCAoYXJlYS53ID09IDApIHx8IChhcmVhLmggPT0gMCkgKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb3B5IG1vdXNlIGJhY2tncm91bmQgKi8KKwl7IGludCB3LCBoLCBzY3JlZW5icHA7CisJICBVaW50OCAqc3JjLCAqZHN0OworCisJICAvKiBTZXQgdXAgdGhlIGNvcHkgcG9pbnRlcnMgKi8KKwkgIHNjcmVlbmJwcCA9IHNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCSAgaWYgKCAoc2NyZWVuID09IFNETF9WaWRlb1N1cmZhY2UpIHx8CisJICAgICAgICAgIEZPUk1BVF9FUVVBTChzY3JlZW4tPmZvcm1hdCwgU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0KSApIHsKKwkJc3JjID0gU0RMX2N1cnNvci0+c2F2ZVswXTsKKwkgIH0gZWxzZSB7CisJCXNyYyA9IFNETF9jdXJzb3ItPnNhdmVbMV07CisJICB9CisJICBkc3QgPSAoVWludDggKilzY3JlZW4tPnBpeGVscyArIGFyZWEueSAqIHNjcmVlbi0+cGl0Y2ggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS54ICogc2NyZWVuYnBwOworCisJICAvKiBQZXJmb3JtIHRoZSBjb3B5ICovCisJICB3ID0gYXJlYS53KnNjcmVlbmJwcDsKKwkgIGggPSBhcmVhLmg7CisJICB3aGlsZSAoIGgtLSApIHsKKwkJICBTRExfbWVtY3B5KGRzdCwgc3JjLCB3KTsKKwkJICBzcmMgKz0gdzsKKwkJICBkc3QgKz0gc2NyZWVuLT5waXRjaDsKKwkgIH0KKworCSAgLyogUGVyZm9ybSBwaXhlbCBjb252ZXJzaW9uIG9uIGN1cnNvciBiYWNrZ3JvdW5kICovCisJICBpZiAoIHNyYyA+IFNETF9jdXJzb3ItPnNhdmVbMV0gKSB7CisJCVNETF9Db252ZXJ0Q3Vyc29yU2F2ZShzY3JlZW4sIGFyZWEudywgYXJlYS5oKTsKKwkgIH0KKwl9Cit9CisKK3ZvaWQgU0RMX0VyYXNlQ3Vyc29yKFNETF9TdXJmYWNlICpzY3JlZW4pCit7CisJLyogTG9jayB0aGUgc2NyZWVuIGlmIG5lY2Vzc2FyeSAqLworCWlmICggc2NyZWVuID09IE5VTEwgKSB7CisJCXJldHVybjsKKwl9CisJaWYgKCBTRExfTVVTVExPQ0soc2NyZWVuKSApIHsKKwkJaWYgKCBTRExfTG9ja1N1cmZhY2Uoc2NyZWVuKSA8IDAgKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlTRExfRXJhc2VDdXJzb3JOb0xvY2soc2NyZWVuKTsKKworCS8qIFVubG9jayB0aGUgc2NyZWVuIGFuZCB1cGRhdGUgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCBTRExfTVVTVExPQ0soc2NyZWVuKSApIHsKKwkJU0RMX1VubG9ja1N1cmZhY2Uoc2NyZWVuKTsKKwl9CisJaWYgKCAoc2NyZWVuID09IFNETF9WaWRlb1N1cmZhY2UpICYmCisJICAgICAoKHNjcmVlbi0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSAhPSBTRExfSFdTVVJGQUNFKSApIHsKKwkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCQlTRExfUmVjdCBhcmVhOworCisJCVNETF9Nb3VzZVJlY3QoJmFyZWEpOworCQlpZiAoIHZpZGVvLT5VcGRhdGVSZWN0cyApIHsKKwkJCXZpZGVvLT5VcGRhdGVSZWN0cyh0aGlzLCAxLCAmYXJlYSk7CisJCX0KKwl9Cit9CisKKy8qIFJlc2V0IHRoZSBjdXJzb3Igb24gdmlkZW8gbW9kZSBjaGFuZ2UKKyAgIEZJWE1FOiAgS2VlcCB0cmFjayBvZiBhbGwgY3Vyc29ycywgYW5kIHJlc2V0IHRoZW0gYWxsLgorICovCit2b2lkIFNETF9SZXNldEN1cnNvcih2b2lkKQoreworCWludCBzYXZlbGVuOworCisJaWYgKCBTRExfY3Vyc29yICkgeworCQlzYXZlbGVuID0gU0RMX2N1cnNvci0+YXJlYS53KjQqU0RMX2N1cnNvci0+YXJlYS5oOworCQlTRExfY3Vyc29yLT5hcmVhLnggPSAwOworCQlTRExfY3Vyc29yLT5hcmVhLnkgPSAwOworCQlTRExfbWVtc2V0KFNETF9jdXJzb3ItPnNhdmVbMF0sIDAsIHNhdmVsZW4pOworCX0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX2N1cnNvcl9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9jdXJzb3JfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZThkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9jdXJzb3JfYy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBVc2VmdWwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZnJvbSBTRExfY3Vyc29yLmMgKi8KKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKworZXh0ZXJuIGludCAgU0RMX0N1cnNvckluaXQoVWludDMyIGZsYWdzKTsKK2V4dGVybiB2b2lkIFNETF9DdXJzb3JQYWxldHRlQ2hhbmdlZCh2b2lkKTsKK2V4dGVybiB2b2lkIFNETF9EcmF3Q3Vyc29yKFNETF9TdXJmYWNlICpzY3JlZW4pOworZXh0ZXJuIHZvaWQgU0RMX0RyYXdDdXJzb3JOb0xvY2soU0RMX1N1cmZhY2UgKnNjcmVlbik7CitleHRlcm4gdm9pZCBTRExfRXJhc2VDdXJzb3IoU0RMX1N1cmZhY2UgKnNjcmVlbik7CitleHRlcm4gdm9pZCBTRExfRXJhc2VDdXJzb3JOb0xvY2soU0RMX1N1cmZhY2UgKnNjcmVlbik7CitleHRlcm4gdm9pZCBTRExfVXBkYXRlQ3Vyc29yKFNETF9TdXJmYWNlICpzY3JlZW4pOworZXh0ZXJuIHZvaWQgU0RMX1Jlc2V0Q3Vyc29yKHZvaWQpOworZXh0ZXJuIHZvaWQgU0RMX01vdmVDdXJzb3IoaW50IHgsIGludCB5KTsKK2V4dGVybiB2b2lkIFNETF9DdXJzb3JRdWl0KHZvaWQpOworCisjZGVmaW5lIElOTElORV9NT1VTRUxPQ0sKKyNpZmRlZiBJTkxJTkVfTU9VU0VMT0NLCisvKiBJbmxpbmUgKG1hY3JvKSB2ZXJzaW9ucyBvZiB0aGUgbW91c2UgbG9jayBmdW5jdGlvbnMgKi8KKyNpbmNsdWRlICJTRExfbXV0ZXguaCIKKworZXh0ZXJuIFNETF9tdXRleCAqU0RMX2N1cnNvcmxvY2s7CisKKyNkZWZpbmUgU0RMX0xvY2tDdXJzb3IoKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICggU0RMX2N1cnNvcmxvY2sgKSB7CQkJCQlcCisJCQlTRExfbXV0ZXhQKFNETF9jdXJzb3Jsb2NrKTsJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKCAwICkKKyNkZWZpbmUgU0RMX1VubG9ja0N1cnNvcigpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKCBTRExfY3Vyc29ybG9jayApIHsJCQkJCVwKKwkJCVNETF9tdXRleFYoU0RMX2N1cnNvcmxvY2spOwkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoIDAgKQorI2Vsc2UKK2V4dGVybiB2b2lkIFNETF9Mb2NrQ3Vyc29yKHZvaWQpOworZXh0ZXJuIHZvaWQgU0RMX1VubG9ja0N1cnNvcih2b2lkKTsKKyNlbmRpZiAvKiBJTkxJTkVfTU9VU0VMT0NLICovCisKKy8qIE9ubHkgZm9yIGxvdy1sZXZlbCBtb3VzZSBjdXJzb3IgZHJhd2luZyAqLworZXh0ZXJuIFNETF9DdXJzb3IgKlNETF9jdXJzb3I7CitleHRlcm4gdm9pZCBTRExfTW91c2VSZWN0KFNETF9SZWN0ICphcmVhKTsKKworLyogU3RhdGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBTREwgY3Vyc29yICovCisjZGVmaW5lIENVUlNPUl9WSVNJQkxFCTB4MDEKKyNkZWZpbmUgQ1VSU09SX1VTSU5HU1cJMHgxMAorI2RlZmluZSBTSE9VTERfRFJBV0NVUlNPUihYKSAJCQkJCQlcCisJCQkoKChYKSYoQ1VSU09SX1ZJU0lCTEV8Q1VSU09SX1VTSU5HU1cpKSA9PSAgCVwKKwkJCQkJKENVUlNPUl9WSVNJQkxFfENVUlNPUl9VU0lOR1NXKSkKKworZXh0ZXJuIHZvbGF0aWxlIGludCBTRExfY3Vyc29yc3RhdGU7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9nYW1tYS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfZ2FtbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQwMzcwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfZ2FtbWEuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEdhbW1hIGNvcnJlY3Rpb24gc3VwcG9ydCAqLworCisjaWZkZWYgSEFWRV9NQVRIX0gKKyNpbmNsdWRlIDxtYXRoLmg+CS8qIFVzZWQgZm9yIGNhbGN1bGF0aW5nIGdhbW1hIHJhbXBzICovCisjZWxzZQorLyogTWF0aCByb3V0aW5lcyBmcm9tIHVDbGliYzogaHR0cDovL3d3dy51Y2xpYmMub3JnICovCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisjaW5jbHVkZSAiZV9zcXJ0LmgiCisjaW5jbHVkZSAiZV9wb3cuaCIKKyNpbmNsdWRlICJlX2xvZy5oIgorI2RlZmluZSBwb3coeCwgeSkJX19pZWVlNzU0X3Bvdyh4LCB5KQorI2RlZmluZSBsb2coeCkJCV9faWVlZTc1NF9sb2coeCkKKyNlbmRpZgorCisjaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCisKKworc3RhdGljIHZvaWQgQ2FsY3VsYXRlR2FtbWFSYW1wKGZsb2F0IGdhbW1hLCBVaW50MTYgKnJhbXApCit7CisJaW50IGk7CisKKwkvKiAwLjAgZ2FtbWEgaXMgYWxsIGJsYWNrICovCisJaWYgKCBnYW1tYSA8PSAwLjBmICkgeworCQlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7CisJCQlyYW1wW2ldID0gMDsKKwkJfQorCQlyZXR1cm47CisJfSBlbHNlCisJLyogMS4wIGdhbW1hIGlzIGlkZW50aXR5ICovCisJaWYgKCBnYW1tYSA9PSAxLjBmICkgeworCQlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7CisJCQlyYW1wW2ldID0gKGkgPDwgOCkgfCBpOworCQl9CisJCXJldHVybjsKKwl9IGVsc2UKKwkvKiBDYWxjdWxhdGUgYSByZWFsIGdhbW1hIHJhbXAgKi8KKwl7IGludCB2YWx1ZTsKKwkJZ2FtbWEgPSAxLjBmIC8gZ2FtbWE7CisJCWZvciAoIGk9MDsgaTwyNTY7ICsraSApIHsKKwkJCXZhbHVlID0gKGludCkocG93KChkb3VibGUpaS8yNTYuMCwgZ2FtbWEpKjY1NTM1LjArMC41KTsKKwkJCWlmICggdmFsdWUgPiA2NTUzNSApIHsKKwkJCQl2YWx1ZSA9IDY1NTM1OworCQkJfQorCQkJcmFtcFtpXSA9IChVaW50MTYpdmFsdWU7CisJCX0KKwl9Cit9CitzdGF0aWMgdm9pZCBDYWxjdWxhdGVHYW1tYUZyb21SYW1wKGZsb2F0ICpnYW1tYSwgVWludDE2ICpyYW1wKQoreworCS8qIFRoZSBmb2xsb3dpbmcgaXMgYWRhcHRlZCBmcm9tIGEgcG9zdCBieSBHYXJyZXR0IEJhc3Mgb24gT3BlbkdMCisJICAgR2FtZWRldiBsaXN0LCBNYXJjaCA0LCAyMDAwLgorCSAqLworCWZsb2F0IHN1bSA9IDAuMGY7CisJaW50IGksIGNvdW50ID0gMDsKKworCSpnYW1tYSA9IDEuMDsKKwlmb3IgKCBpID0gMTsgaSA8IDI1NjsgKytpICkgeworCSAgICBpZiAoIChyYW1wW2ldICE9IDApICYmIChyYW1wW2ldICE9IDY1NTM1KSApIHsKKwkgICAgICAgIGRvdWJsZSBCID0gKGRvdWJsZSlpIC8gMjU2LjA7CisJICAgICAgICBkb3VibGUgQSA9IHJhbXBbaV0gLyA2NTUzNS4wOworCSAgICAgICAgc3VtICs9IChmbG9hdCkgKCBsb2coQSkgLyBsb2coQikgKTsKKwkgICAgICAgIGNvdW50Kys7CisJICAgIH0KKwl9CisJaWYgKCBjb3VudCAmJiBzdW0gPiAwLjBmICkgeworCQkqZ2FtbWEgPSAxLjBmIC8gKHN1bSAvIGNvdW50KTsKKwl9Cit9CisKK2ludCBTRExfU2V0R2FtbWEoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSkKK3sKKwlpbnQgc3VjY2VlZGVkOworCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOwkKKworCXN1Y2NlZWRlZCA9IC0xOworCS8qIFByZWZlciB1c2luZyBTZXRHYW1tYVJhbXAoKSwgYXMgaXQncyBtb3JlIGZsZXhpYmxlICovCisJeworCQlVaW50MTYgcmFtcFszXVsyNTZdOworCisJCUNhbGN1bGF0ZUdhbW1hUmFtcChyZWQsIHJhbXBbMF0pOworCQlDYWxjdWxhdGVHYW1tYVJhbXAoZ3JlZW4sIHJhbXBbMV0pOworCQlDYWxjdWxhdGVHYW1tYVJhbXAoYmx1ZSwgcmFtcFsyXSk7CisJCXN1Y2NlZWRlZCA9IFNETF9TZXRHYW1tYVJhbXAocmFtcFswXSwgcmFtcFsxXSwgcmFtcFsyXSk7CisJfQorCWlmICggKHN1Y2NlZWRlZCA8IDApICYmIHZpZGVvLT5TZXRHYW1tYSApIHsKKwkJU0RMX0NsZWFyRXJyb3IoKTsKKwkJc3VjY2VlZGVkID0gdmlkZW8tPlNldEdhbW1hKHRoaXMsIHJlZCwgZ3JlZW4sIGJsdWUpOworCX0KKwlyZXR1cm4gc3VjY2VlZGVkOworfQorCisvKiBDYWxjdWxhdGluZyB0aGUgZ2FtbWEgYnkgaW50ZWdyYXRpbmcgdGhlIGdhbW1hIHJhbXBzIGlzbid0IGV4YWN0LAorICAgc28gdGhpcyBmdW5jdGlvbiBpc24ndCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4KKyovCitpbnQgU0RMX0dldEdhbW1hKGZsb2F0ICpyZWQsIGZsb2F0ICpncmVlbiwgZmxvYXQgKmJsdWUpCit7CisJaW50IHN1Y2NlZWRlZDsKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsJCisKKwlzdWNjZWVkZWQgPSAtMTsKKwkvKiBQcmVmZXIgdXNpbmcgR2V0R2FtbWFSYW1wKCksIGFzIGl0J3MgbW9yZSBmbGV4aWJsZSAqLworCXsKKwkJVWludDE2IHJhbXBbM11bMjU2XTsKKworCQlzdWNjZWVkZWQgPSBTRExfR2V0R2FtbWFSYW1wKHJhbXBbMF0sIHJhbXBbMV0sIHJhbXBbMl0pOworCQlpZiAoIHN1Y2NlZWRlZCA+PSAwICkgeworCQkJQ2FsY3VsYXRlR2FtbWFGcm9tUmFtcChyZWQsIHJhbXBbMF0pOworCQkJQ2FsY3VsYXRlR2FtbWFGcm9tUmFtcChncmVlbiwgcmFtcFsxXSk7CisJCQlDYWxjdWxhdGVHYW1tYUZyb21SYW1wKGJsdWUsIHJhbXBbMl0pOworCQl9CisJfQorCWlmICggKHN1Y2NlZWRlZCA8IDApICYmIHZpZGVvLT5HZXRHYW1tYSApIHsKKwkJU0RMX0NsZWFyRXJyb3IoKTsKKwkJc3VjY2VlZGVkID0gdmlkZW8tPkdldEdhbW1hKHRoaXMsIHJlZCwgZ3JlZW4sIGJsdWUpOworCX0KKwlyZXR1cm4gc3VjY2VlZGVkOworfQorCitpbnQgU0RMX1NldEdhbW1hUmFtcChjb25zdCBVaW50MTYgKnJlZCwgY29uc3QgVWludDE2ICpncmVlbiwgY29uc3QgVWludDE2ICpibHVlKQoreworCWludCBzdWNjZWVkZWQ7CisJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CQorCVNETF9TdXJmYWNlICpzY3JlZW4gPSBTRExfUHVibGljU3VyZmFjZTsKKworCS8qIFZlcmlmeSB0aGUgc2NyZWVuIHBhcmFtZXRlciAqLworCWlmICggIXNjcmVlbiApIHsKKwkJU0RMX1NldEVycm9yKCJObyB2aWRlbyBtb2RlIGhhcyBiZWVuIHNldCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogTGF6aWx5IGFsbG9jYXRlIHRoZSBnYW1tYSB0YWJsZXMgKi8KKwlpZiAoICEgdmlkZW8tPmdhbW1hICkgeworCQlTRExfR2V0R2FtbWFSYW1wKDAsIDAsIDApOworCX0KKworCS8qIEZpbGwgdGhlIGdhbW1hIHRhYmxlIHdpdGggdGhlIG5ldyB2YWx1ZXMgKi8KKwlpZiAoIHJlZCApIHsKKwkJU0RMX21lbWNweSgmdmlkZW8tPmdhbW1hWzAqMjU2XSwgcmVkLCAyNTYqc2l6ZW9mKCp2aWRlby0+Z2FtbWEpKTsKKwl9CisJaWYgKCBncmVlbiApIHsKKwkJU0RMX21lbWNweSgmdmlkZW8tPmdhbW1hWzEqMjU2XSwgZ3JlZW4sIDI1NipzaXplb2YoKnZpZGVvLT5nYW1tYSkpOworCX0KKwlpZiAoIGJsdWUgKSB7CisJCVNETF9tZW1jcHkoJnZpZGVvLT5nYW1tYVsyKjI1Nl0sIGJsdWUsIDI1NipzaXplb2YoKnZpZGVvLT5nYW1tYSkpOworCX0KKworCS8qIEdhbW1hIGNvcnJlY3Rpb24gYWx3YXlzIHBvc3NpYmxlIG9uIHNwbGl0IHBhbGV0dGVzICovCisJaWYgKCAoc2NyZWVuLT5mbGFncyAmIFNETF9IV1BBTEVUVEUpID09IFNETF9IV1BBTEVUVEUgKSB7CisJCVNETF9QYWxldHRlICpwYWwgPSBzY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZTsKKworCQkvKiBJZiBwaHlzaWNhbCBwYWxldHRlIGhhcyBiZWVuIHNldCBpbmRlcGVuZGVudGx5LCB1c2UgaXQgKi8KKwkJaWYodmlkZW8tPnBoeXNwYWwpCisJCSAgICAgICAgcGFsID0gdmlkZW8tPnBoeXNwYWw7CisJCSAgICAgIAorCQlTRExfU2V0UGFsZXR0ZShzY3JlZW4sIFNETF9QSFlTUEFMLAorCQkJICAgICAgIHBhbC0+Y29sb3JzLCAwLCBwYWwtPm5jb2xvcnMpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgdG8gc2V0IHRoZSBnYW1tYSByYW1wIGluIHRoZSBkcml2ZXIgKi8KKwlzdWNjZWVkZWQgPSAtMTsKKwlpZiAoIHZpZGVvLT5TZXRHYW1tYVJhbXAgKSB7CisJCXN1Y2NlZWRlZCA9IHZpZGVvLT5TZXRHYW1tYVJhbXAodGhpcywgdmlkZW8tPmdhbW1hKTsKKwl9IGVsc2UgeworCQlTRExfU2V0RXJyb3IoIkdhbW1hIHJhbXAgbWFuaXB1bGF0aW9uIG5vdCBzdXBwb3J0ZWQiKTsKKwl9CisJcmV0dXJuIHN1Y2NlZWRlZDsKK30KKworaW50IFNETF9HZXRHYW1tYVJhbXAoVWludDE2ICpyZWQsIFVpbnQxNiAqZ3JlZW4sIFVpbnQxNiAqYmx1ZSkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsJCisKKwkvKiBMYXppbHkgYWxsb2NhdGUgdGhlIGdhbW1hIHRhYmxlICovCisJaWYgKCAhIHZpZGVvLT5nYW1tYSApIHsKKwkJdmlkZW8tPmdhbW1hID0gU0RMX21hbGxvYygzKjI1NipzaXplb2YoKnZpZGVvLT5nYW1tYSkpOworCQlpZiAoICEgdmlkZW8tPmdhbW1hICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKCB2aWRlby0+R2V0R2FtbWFSYW1wICkgeworCQkJLyogR2V0IHRoZSByZWFsIGhhcmR3YXJlIGdhbW1hICovCisJCQl2aWRlby0+R2V0R2FtbWFSYW1wKHRoaXMsIHZpZGVvLT5nYW1tYSk7CisJCX0gZWxzZSB7CisJCQkvKiBBc3N1bWUgYW4gaWRlbnRpdHkgZ2FtbWEgKi8KKwkJCWludCBpOworCQkJZm9yICggaT0wOyBpPDI1NjsgKytpICkgeworCQkJCXZpZGVvLT5nYW1tYVswKjI1NitpXSA9IChpIDw8IDgpIHwgaTsKKwkJCQl2aWRlby0+Z2FtbWFbMSoyNTYraV0gPSAoaSA8PCA4KSB8IGk7CisJCQkJdmlkZW8tPmdhbW1hWzIqMjU2K2ldID0gKGkgPDwgOCkgfCBpOworCQkJfQorCQl9CisJfQorCisJLyogSnVzdCBjb3B5IGZyb20gb3VyIGludGVybmFsIHRhYmxlICovCisJaWYgKCByZWQgKSB7CisJCVNETF9tZW1jcHkocmVkLCAmdmlkZW8tPmdhbW1hWzAqMjU2XSwgMjU2KnNpemVvZigqcmVkKSk7CisJfQorCWlmICggZ3JlZW4gKSB7CisJCVNETF9tZW1jcHkoZ3JlZW4sICZ2aWRlby0+Z2FtbWFbMSoyNTZdLCAyNTYqc2l6ZW9mKCpncmVlbikpOworCX0KKwlpZiAoIGJsdWUgKSB7CisJCVNETF9tZW1jcHkoYmx1ZSwgJnZpZGVvLT5nYW1tYVsyKjI1Nl0sIDI1NipzaXplb2YoKmJsdWUpKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1NETF9nbGZ1bmNzLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9nbGZ1bmNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vU0RMX2dsZnVuY3MuaApyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfZ2xmdW5jcy5oCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9sZWFrcy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfbGVha3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQ5NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfbGVha3MuaApAQCAtMCwwICsxLDMxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgc3VyZmFjZSBsZWFrIGRldGVjdGlvbiBjb2RlIGVuYWJsZWQgKi8KKy8qI2RlZmluZSBDSEVDS19MRUFLUyovCisKKy8qIEdsb2JhbCB2YXJpYWJsZXMgdXNlZCB0byBjaGVjayBsZWFrcyBpbiBjb2RlIHVzaW5nIFNETCAqLworCisjaWZkZWYgQ0hFQ0tfTEVBS1MKK2V4dGVybiBpbnQgc3VyZmFjZXNfYWxsb2NhdGVkOworI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9waXhlbHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3BpeGVscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhN2ZkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9waXhlbHMuYwpAQCAtMCwwICsxLDYyNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEdlbmVyYWwgKG1vc3RseSBpbnRlcm5hbCkgcGl4ZWwvY29sb3IgbWFuaXB1bGF0aW9uIHJvdXRpbmVzIGZvciBTREwgKi8KKworI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfYmxpdC5oIgorI2luY2x1ZGUgIlNETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIlNETF9STEVhY2NlbF9jLmgiCisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KKy8qCisgKiBBbGxvY2F0ZSBhIHBpeGVsIGZvcm1hdCBzdHJ1Y3R1cmUgYW5kIGZpbGwgaXQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBpbmZvLgorICovCitTRExfUGl4ZWxGb3JtYXQgKlNETF9BbGxvY0Zvcm1hdChpbnQgYnBwLAorCQkJVWludDMyIFJtYXNrLCBVaW50MzIgR21hc2ssIFVpbnQzMiBCbWFzaywgVWludDMyIEFtYXNrKQoreworCVNETF9QaXhlbEZvcm1hdCAqZm9ybWF0OworCVVpbnQzMiBtYXNrOworCisJLyogQWxsb2NhdGUgYW4gZW1wdHkgcGl4ZWwgZm9ybWF0IHN0cnVjdHVyZSAqLworCWZvcm1hdCA9IFNETF9tYWxsb2Moc2l6ZW9mKCpmb3JtYXQpKTsKKwlpZiAoIGZvcm1hdCA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlTRExfbWVtc2V0KGZvcm1hdCwgMCwgc2l6ZW9mKCpmb3JtYXQpKTsKKwlmb3JtYXQtPmFscGhhID0gU0RMX0FMUEhBX09QQVFVRTsKKworCS8qIFNldCB1cCB0aGUgZm9ybWF0ICovCisJZm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBicHA7CisJZm9ybWF0LT5CeXRlc1BlclBpeGVsID0gKGJwcCs3KS84OworCWlmICggUm1hc2sgfHwgQm1hc2sgfHwgR21hc2sgKSB7IC8qIFBhY2tlZCBwaXhlbHMgd2l0aCBjdXN0b20gbWFzayAqLworCQlmb3JtYXQtPnBhbGV0dGUgPSBOVUxMOworCQlmb3JtYXQtPlJzaGlmdCA9IDA7CisJCWZvcm1hdC0+Umxvc3MgPSA4OworCQlpZiAoIFJtYXNrICkgeworCQkJZm9yICggbWFzayA9IFJtYXNrOyAhKG1hc2smMHgwMSk7IG1hc2sgPj49IDEgKQorCQkJCSsrZm9ybWF0LT5Sc2hpZnQ7CisJCQlmb3IgKCA7IChtYXNrJjB4MDEpOyBtYXNrID4+PSAxICkKKwkJCQktLWZvcm1hdC0+Umxvc3M7CisJCX0KKwkJZm9ybWF0LT5Hc2hpZnQgPSAwOworCQlmb3JtYXQtPkdsb3NzID0gODsKKwkJaWYgKCBHbWFzayApIHsKKwkJCWZvciAoIG1hc2sgPSBHbWFzazsgIShtYXNrJjB4MDEpOyBtYXNrID4+PSAxICkKKwkJCQkrK2Zvcm1hdC0+R3NoaWZ0OworCQkJZm9yICggOyAobWFzayYweDAxKTsgbWFzayA+Pj0gMSApCisJCQkJLS1mb3JtYXQtPkdsb3NzOworCQl9CisJCWZvcm1hdC0+QnNoaWZ0ID0gMDsKKwkJZm9ybWF0LT5CbG9zcyA9IDg7CisJCWlmICggQm1hc2sgKSB7CisJCQlmb3IgKCBtYXNrID0gQm1hc2s7ICEobWFzayYweDAxKTsgbWFzayA+Pj0gMSApCisJCQkJKytmb3JtYXQtPkJzaGlmdDsKKwkJCWZvciAoIDsgKG1hc2smMHgwMSk7IG1hc2sgPj49IDEgKQorCQkJCS0tZm9ybWF0LT5CbG9zczsKKwkJfQorCQlmb3JtYXQtPkFzaGlmdCA9IDA7CisJCWZvcm1hdC0+QWxvc3MgPSA4OworCQlpZiAoIEFtYXNrICkgeworCQkJZm9yICggbWFzayA9IEFtYXNrOyAhKG1hc2smMHgwMSk7IG1hc2sgPj49IDEgKQorCQkJCSsrZm9ybWF0LT5Bc2hpZnQ7CisJCQlmb3IgKCA7IChtYXNrJjB4MDEpOyBtYXNrID4+PSAxICkKKwkJCQktLWZvcm1hdC0+QWxvc3M7CisJCX0KKwkJZm9ybWF0LT5SbWFzayA9IFJtYXNrOworCQlmb3JtYXQtPkdtYXNrID0gR21hc2s7CisJCWZvcm1hdC0+Qm1hc2sgPSBCbWFzazsKKwkJZm9ybWF0LT5BbWFzayA9IEFtYXNrOworCX0gZWxzZSBpZiAoIGJwcCA+IDggKSB7CQkvKiBQYWNrZWQgcGl4ZWxzIHdpdGggc3RhbmRhcmQgbWFzayAqLworCQkvKiBSLUctQiAqLworCQlpZiAoIGJwcCA+IDI0ICkKKwkJCWJwcCA9IDI0OworCQlmb3JtYXQtPlJsb3NzID0gOC0oYnBwLzMpOworCQlmb3JtYXQtPkdsb3NzID0gOC0oYnBwLzMpLShicHAlMyk7CisJCWZvcm1hdC0+Qmxvc3MgPSA4LShicHAvMyk7CisJCWZvcm1hdC0+UnNoaWZ0ID0gKChicHAvMykrKGJwcCUzKSkrKGJwcC8zKTsKKwkJZm9ybWF0LT5Hc2hpZnQgPSAoYnBwLzMpOworCQlmb3JtYXQtPkJzaGlmdCA9IDA7CisJCWZvcm1hdC0+Um1hc2sgPSAoKDB4RkY+PmZvcm1hdC0+Umxvc3MpPDxmb3JtYXQtPlJzaGlmdCk7CisJCWZvcm1hdC0+R21hc2sgPSAoKDB4RkY+PmZvcm1hdC0+R2xvc3MpPDxmb3JtYXQtPkdzaGlmdCk7CisJCWZvcm1hdC0+Qm1hc2sgPSAoKDB4RkY+PmZvcm1hdC0+Qmxvc3MpPDxmb3JtYXQtPkJzaGlmdCk7CisJfSBlbHNlIHsKKwkJLyogUGFsZXR0aXplZCBmb3JtYXRzIGhhdmUgbm8gbWFzayBpbmZvICovCisJCWZvcm1hdC0+Umxvc3MgPSA4OworCQlmb3JtYXQtPkdsb3NzID0gODsKKwkJZm9ybWF0LT5CbG9zcyA9IDg7CisJCWZvcm1hdC0+QWxvc3MgPSA4OworCQlmb3JtYXQtPlJzaGlmdCA9IDA7CisJCWZvcm1hdC0+R3NoaWZ0ID0gMDsKKwkJZm9ybWF0LT5Cc2hpZnQgPSAwOworCQlmb3JtYXQtPkFzaGlmdCA9IDA7CisJCWZvcm1hdC0+Um1hc2sgPSAwOworCQlmb3JtYXQtPkdtYXNrID0gMDsKKwkJZm9ybWF0LT5CbWFzayA9IDA7CisJCWZvcm1hdC0+QW1hc2sgPSAwOworCX0KKwlpZiAoIGJwcCA8PSA4ICkgewkJCS8qIFBhbGV0dGl6ZWQgbW9kZSAqLworCQlpbnQgbmNvbG9ycyA9IDE8PGJwcDsKKyNpZmRlZiBERUJVR19QQUxFVFRFCisJCWZwcmludGYoc3RkZXJyLCJicHA9JWQgbmNvbG9ycz0lZFxuIixicHAsbmNvbG9ycyk7CisjZW5kaWYKKwkJZm9ybWF0LT5wYWxldHRlID0gKFNETF9QYWxldHRlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1BhbGV0dGUpKTsKKwkJaWYgKCBmb3JtYXQtPnBhbGV0dGUgPT0gTlVMTCApIHsKKwkJCVNETF9GcmVlRm9ybWF0KGZvcm1hdCk7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCQkoZm9ybWF0LT5wYWxldHRlKS0+bmNvbG9ycyA9IG5jb2xvcnM7CisJCShmb3JtYXQtPnBhbGV0dGUpLT5jb2xvcnMgPSAoU0RMX0NvbG9yICopU0RMX21hbGxvYygKKwkJCQkoZm9ybWF0LT5wYWxldHRlKS0+bmNvbG9ycypzaXplb2YoU0RMX0NvbG9yKSk7CisJCWlmICggKGZvcm1hdC0+cGFsZXR0ZSktPmNvbG9ycyA9PSBOVUxMICkgeworCQkJU0RMX0ZyZWVGb3JtYXQoZm9ybWF0KTsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuKE5VTEwpOworCQl9CisJCWlmICggUm1hc2sgfHwgQm1hc2sgfHwgR21hc2sgKSB7CisJCQkvKiBjcmVhdGUgcGFsZXR0ZSBhY2NvcmRpbmcgdG8gbWFza3MgKi8KKwkJCWludCBpOworCQkJaW50IFJtPTAsR209MCxCbT0wOworCQkJaW50IFJ3PTAsR3c9MCxCdz0wOworI2lmZGVmIEVOQUJMRV9QQUxFVFRFX0FMUEhBCisJCQlpbnQgQW09MCxBdz0wOworI2VuZGlmCisJCQlpZihSbWFzaykKKwkJCXsKKwkJCQlSdz04LWZvcm1hdC0+Umxvc3M7CisJCQkJZm9yKGk9Zm9ybWF0LT5SbG9zcztpPjA7aS09UncpCisJCQkJCVJtfD0xPDxpOworCQkJfQorI2lmZGVmIERFQlVHX1BBTEVUVEUKKwkJCWZwcmludGYoc3RkZXJyLCJSdz0lZCBSbT0weCUwMlhcbiIsUncsUm0pOworI2VuZGlmCisJCQlpZihHbWFzaykKKwkJCXsKKwkJCQlHdz04LWZvcm1hdC0+R2xvc3M7CisJCQkJZm9yKGk9Zm9ybWF0LT5HbG9zcztpPjA7aS09R3cpCisJCQkJCUdtfD0xPDxpOworCQkJfQorI2lmZGVmIERFQlVHX1BBTEVUVEUKKwkJCWZwcmludGYoc3RkZXJyLCJHdz0lZCBHbT0weCUwMlhcbiIsR3csR20pOworI2VuZGlmCisJCQlpZihCbWFzaykKKwkJCXsKKwkJCQlCdz04LWZvcm1hdC0+Qmxvc3M7CisJCQkJZm9yKGk9Zm9ybWF0LT5CbG9zcztpPjA7aS09QncpCisJCQkJCUJtfD0xPDxpOworCQkJfQorI2lmZGVmIERFQlVHX1BBTEVUVEUKKwkJCWZwcmludGYoc3RkZXJyLCJCdz0lZCBCbT0weCUwMlhcbiIsQncsQm0pOworI2VuZGlmCisjaWZkZWYgRU5BQkxFX1BBTEVUVEVfQUxQSEEKKwkJCWlmKEFtYXNrKQorCQkJeworCQkJCUF3PTgtZm9ybWF0LT5BbG9zczsKKwkJCQlmb3IoaT1mb3JtYXQtPkFsb3NzO2k+MDtpLT1BdykKKwkJCQkJQW18PTE8PGk7CisJCQl9CisjIGlmZGVmIERFQlVHX1BBTEVUVEUKKwkJCWZwcmludGYoc3RkZXJyLCJBdz0lZCBBbT0weCUwMlhcbiIsQXcsQW0pOworIyBlbmRpZgorI2VuZGlmCisJCQlmb3IoaT0wOyBpIDwgbmNvbG9yczsgKytpKSB7CisJCQkJaW50IHIsZyxiOworCQkJCXI9KGkmUm1hc2spPj5mb3JtYXQtPlJzaGlmdDsKKwkJCQlyPShyPDxmb3JtYXQtPlJsb3NzKXwoKHIqUm0pPj5Sdyk7CisJCQkJZm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbaV0ucj1yOworCisJCQkJZz0oaSZHbWFzayk+PmZvcm1hdC0+R3NoaWZ0OworCQkJCWc9KGc8PGZvcm1hdC0+R2xvc3MpfCgoZypHbSk+Pkd3KTsKKwkJCQlmb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tpXS5nPWc7CisKKwkJCQliPShpJkJtYXNrKT4+Zm9ybWF0LT5Cc2hpZnQ7CisJCQkJYj0oYjw8Zm9ybWF0LT5CbG9zcyl8KChiKkJtKT4+QncpOworCQkJCWZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2ldLmI9YjsKKworI2lmZGVmIEVOQUJMRV9QQUxFVFRFX0FMUEhBCisJCQkJYT0oaSZBbWFzayk+PmZvcm1hdC0+QXNoaWZ0OworCQkJCWE9KGE8PGZvcm1hdC0+QWxvc3MpfCgoYSpBbSk+PkF3KTsKKwkJCQlmb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tpXS51bnVzZWQ9YTsKKyNlbHNlCisJCQkJZm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbaV0udW51c2VkPTA7CisjZW5kaWYKKwkJCX0KKwkJfSBlbHNlIGlmICggbmNvbG9ycyA9PSAyICkgeworCQkJLyogQ3JlYXRlIGEgYmxhY2sgYW5kIHdoaXRlIGJpdG1hcCBwYWxldHRlICovCisJCQlmb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1swXS5yID0gMHhGRjsKKwkJCWZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzWzBdLmcgPSAweEZGOworCQkJZm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbMF0uYiA9IDB4RkY7CisJCQlmb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1sxXS5yID0gMHgwMDsKKwkJCWZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzWzFdLmcgPSAweDAwOworCQkJZm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbMV0uYiA9IDB4MDA7CisJCX0gZWxzZSB7CisJCQkvKiBDcmVhdGUgYW4gZW1wdHkgcGFsZXR0ZSAqLworCQkJU0RMX21lbXNldCgoZm9ybWF0LT5wYWxldHRlKS0+Y29sb3JzLCAwLAorCQkJCShmb3JtYXQtPnBhbGV0dGUpLT5uY29sb3JzKnNpemVvZihTRExfQ29sb3IpKTsKKwkJfQorCX0KKwlyZXR1cm4oZm9ybWF0KTsKK30KK1NETF9QaXhlbEZvcm1hdCAqU0RMX1JlYWxsb2NGb3JtYXQoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCBicHAsCisJCQlVaW50MzIgUm1hc2ssIFVpbnQzMiBHbWFzaywgVWludDMyIEJtYXNrLCBVaW50MzIgQW1hc2spCit7CisJaWYgKCBzdXJmYWNlLT5mb3JtYXQgKSB7CisJCVNETF9GcmVlRm9ybWF0KHN1cmZhY2UtPmZvcm1hdCk7CisJCVNETF9Gb3JtYXRDaGFuZ2VkKHN1cmZhY2UpOworCX0KKwlzdXJmYWNlLT5mb3JtYXQgPSBTRExfQWxsb2NGb3JtYXQoYnBwLCBSbWFzaywgR21hc2ssIEJtYXNrLCBBbWFzayk7CisJcmV0dXJuIHN1cmZhY2UtPmZvcm1hdDsKK30KKworLyoKKyAqIENoYW5nZSBhbnkgcHJldmlvdXMgbWFwcGluZ3MgZnJvbS90byB0aGUgbmV3IHN1cmZhY2UgZm9ybWF0CisgKi8KK3ZvaWQgU0RMX0Zvcm1hdENoYW5nZWQoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJc3RhdGljIGludCBmb3JtYXRfdmVyc2lvbiA9IDA7CisJKytmb3JtYXRfdmVyc2lvbjsKKwlpZiAoIGZvcm1hdF92ZXJzaW9uIDwgMCApIHsgLyogSXQgd3JhcHBlZC4uLiAqLworCQlmb3JtYXRfdmVyc2lvbiA9IDE7CisJfQorCXN1cmZhY2UtPmZvcm1hdF92ZXJzaW9uID0gZm9ybWF0X3ZlcnNpb247CisJU0RMX0ludmFsaWRhdGVNYXAoc3VyZmFjZS0+bWFwKTsKK30KKy8qCisgKiBGcmVlIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgZm9ybWF0IHN0cnVjdHVyZQorICovCit2b2lkIFNETF9GcmVlRm9ybWF0KFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0KQoreworCWlmICggZm9ybWF0ICkgeworCQlpZiAoIGZvcm1hdC0+cGFsZXR0ZSApIHsKKwkJCWlmICggZm9ybWF0LT5wYWxldHRlLT5jb2xvcnMgKSB7CisJCQkJU0RMX2ZyZWUoZm9ybWF0LT5wYWxldHRlLT5jb2xvcnMpOworCQkJfQorCQkJU0RMX2ZyZWUoZm9ybWF0LT5wYWxldHRlKTsKKwkJfQorCQlTRExfZnJlZShmb3JtYXQpOworCX0KK30KKy8qCisgKiBDYWxjdWxhdGUgYW4gOC1iaXQgKDMgcmVkLCAzIGdyZWVuLCAyIGJsdWUpIGRpdGhlcmVkIHBhbGV0dGUgb2YgY29sb3JzCisgKi8KK3ZvaWQgU0RMX0RpdGhlckNvbG9ycyhTRExfQ29sb3IgKmNvbG9ycywgaW50IGJwcCkKK3sKKwlpbnQgaTsKKwlpZihicHAgIT0gOCkKKwkJcmV0dXJuOwkJLyogb25seSA4YnBwIHN1cHBvcnRlZCByaWdodCBub3cgKi8KKworCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWludCByLCBnLCBiOworCQkvKiBtYXAgZWFjaCBiaXQgZmllbGQgdG8gdGhlIGZ1bGwgWzAsIDI1NV0gaW50ZXJ2YWwsCisJCSAgIHNvIDAgaXMgbWFwcGVkIHRvICgwLCAwLCAwKSBhbmQgMjU1IHRvICgyNTUsIDI1NSwgMjU1KSAqLworCQlyID0gaSAmIDB4ZTA7CisJCXIgfD0gciA+PiAzIHwgciA+PiA2OworCQljb2xvcnNbaV0uciA9IHI7CisJCWcgPSAoaSA8PCAzKSAmIDB4ZTA7CisJCWcgfD0gZyA+PiAzIHwgZyA+PiA2OworCQljb2xvcnNbaV0uZyA9IGc7CisJCWIgPSBpICYgMHgzOworCQliIHw9IGIgPDwgMjsKKwkJYiB8PSBiIDw8IDQ7CisJCWNvbG9yc1tpXS5iID0gYjsKKwl9Cit9CisvKiAKKyAqIENhbGN1bGF0ZSB0aGUgcGFkLWFsaWduZWQgc2NhbmxpbmUgd2lkdGggb2YgYSBzdXJmYWNlCisgKi8KK1VpbnQxNiBTRExfQ2FsY3VsYXRlUGl0Y2goU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJVWludDE2IHBpdGNoOworCisJLyogU3VyZmFjZSBzaG91bGQgYmUgNC1ieXRlIGFsaWduZWQgZm9yIHNwZWVkICovCisJcGl0Y2ggPSBzdXJmYWNlLT53KnN1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKKwlzd2l0Y2ggKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSB7CisJCWNhc2UgMToKKwkJCXBpdGNoID0gKHBpdGNoKzcpLzg7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcGl0Y2ggPSAocGl0Y2grMSkvMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCXBpdGNoID0gKHBpdGNoICsgMykgJiB+MzsJLyogNC1ieXRlIGFsaWduaW5nICovCisJcmV0dXJuKHBpdGNoKTsKK30KKy8qCisgKiBNYXRjaCBhbiBSR0IgdmFsdWUgdG8gYSBwYXJ0aWN1bGFyIHBhbGV0dGUgaW5kZXgKKyAqLworVWludDggU0RMX0ZpbmRDb2xvcihTRExfUGFsZXR0ZSAqcGFsLCBVaW50OCByLCBVaW50OCBnLCBVaW50OCBiKQoreworCS8qIERvIGNvbG9yc3BhY2UgZGlzdGFuY2UgbWF0Y2hpbmcgKi8KKwl1bnNpZ25lZCBpbnQgc21hbGxlc3Q7CisJdW5zaWduZWQgaW50IGRpc3RhbmNlOworCWludCByZCwgZ2QsIGJkOworCWludCBpOworCVVpbnQ4IHBpeGVsPTA7CisJCQorCXNtYWxsZXN0ID0gfjA7CisJZm9yICggaT0wOyBpPHBhbC0+bmNvbG9yczsgKytpICkgeworCQlyZCA9IHBhbC0+Y29sb3JzW2ldLnIgLSByOworCQlnZCA9IHBhbC0+Y29sb3JzW2ldLmcgLSBnOworCQliZCA9IHBhbC0+Y29sb3JzW2ldLmIgLSBiOworCQlkaXN0YW5jZSA9IChyZCpyZCkrKGdkKmdkKSsoYmQqYmQpOworCQlpZiAoIGRpc3RhbmNlIDwgc21hbGxlc3QgKSB7CisJCQlwaXhlbCA9IGk7CisJCQlpZiAoIGRpc3RhbmNlID09IDAgKSB7IC8qIFBlcmZlY3QgbWF0Y2ghICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlzbWFsbGVzdCA9IGRpc3RhbmNlOworCQl9CisJfQorCXJldHVybihwaXhlbCk7Cit9CisKKy8qIEZpbmQgdGhlIG9wYXF1ZSBwaXhlbCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIFJHQiB0cmlwbGUgKi8KK1VpbnQzMiBTRExfTWFwUkdCCisoY29uc3QgU0RMX1BpeGVsRm9ybWF0ICogY29uc3QgZm9ybWF0LAorIGNvbnN0IFVpbnQ4IHIsIGNvbnN0IFVpbnQ4IGcsIGNvbnN0IFVpbnQ4IGIpCit7CisJaWYgKCBmb3JtYXQtPnBhbGV0dGUgPT0gTlVMTCApIHsKKwkJcmV0dXJuIChyID4+IGZvcm1hdC0+Umxvc3MpIDw8IGZvcm1hdC0+UnNoaWZ0CisJCSAgICAgICB8IChnID4+IGZvcm1hdC0+R2xvc3MpIDw8IGZvcm1hdC0+R3NoaWZ0CisJCSAgICAgICB8IChiID4+IGZvcm1hdC0+Qmxvc3MpIDw8IGZvcm1hdC0+QnNoaWZ0CisJCSAgICAgICB8IGZvcm1hdC0+QW1hc2s7CisJfSBlbHNlIHsKKwkJcmV0dXJuIFNETF9GaW5kQ29sb3IoZm9ybWF0LT5wYWxldHRlLCByLCBnLCBiKTsKKwl9Cit9CisKKy8qIEZpbmQgdGhlIHBpeGVsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gUkdCQSBxdWFkcnVwbGUgKi8KK1VpbnQzMiBTRExfTWFwUkdCQQorKGNvbnN0IFNETF9QaXhlbEZvcm1hdCAqIGNvbnN0IGZvcm1hdCwKKyBjb25zdCBVaW50OCByLCBjb25zdCBVaW50OCBnLCBjb25zdCBVaW50OCBiLCBjb25zdCBVaW50OCBhKQoreworCWlmICggZm9ybWF0LT5wYWxldHRlID09IE5VTEwgKSB7CisJICAgICAgICByZXR1cm4gKHIgPj4gZm9ybWF0LT5SbG9zcykgPDwgZm9ybWF0LT5Sc2hpZnQKKwkJICAgIHwgKGcgPj4gZm9ybWF0LT5HbG9zcykgPDwgZm9ybWF0LT5Hc2hpZnQKKwkJICAgIHwgKGIgPj4gZm9ybWF0LT5CbG9zcykgPDwgZm9ybWF0LT5Cc2hpZnQKKwkJICAgIHwgKChhID4+IGZvcm1hdC0+QWxvc3MpIDw8IGZvcm1hdC0+QXNoaWZ0ICYgZm9ybWF0LT5BbWFzayk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIFNETF9GaW5kQ29sb3IoZm9ybWF0LT5wYWxldHRlLCByLCBnLCBiKTsKKwl9Cit9CisKK3ZvaWQgU0RMX0dldFJHQkEoVWludDMyIHBpeGVsLCBjb25zdCBTRExfUGl4ZWxGb3JtYXQgKiBjb25zdCBmbXQsCisJCSBVaW50OCAqciwgVWludDggKmcsIFVpbnQ4ICpiLCBVaW50OCAqYSkKK3sKKwlpZiAoIGZtdC0+cGFsZXR0ZSA9PSBOVUxMICkgeworCSAgICAgICAgLyoKKwkJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIHJlc3VsdCBpcyBtYXBwZWQgdG8gdGhlCisJCSAqIGludGVydmFsIFswLi4yNTVdLCBhbmQgdGhlIG1heGltdW0gdmFsdWUgZm9yIGVhY2gKKwkJICogY29tcG9uZW50IGlzIDI1NS4gVGhpcyBpcyBpbXBvcnRhbnQgdG8gbWFrZSBzdXJlCisJCSAqIHRoYXQgd2hpdGUgaXMgaW5kZWVkIHJlcG9ydGVkIGFzICgyNTUsIDI1NSwgMjU1KSwKKwkJICogYW5kIHRoYXQgb3BhcXVlIGFscGhhIGlzIDI1NS4KKwkJICogVGhpcyBvbmx5IHdvcmtzIGZvciBSR0IgYml0IGZpZWxkcyBhdCBsZWFzdCA0IGJpdAorCQkgKiB3aWRlLCB3aGljaCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBjYXNlLgorCQkgKi8KKwkgICAgICAgIHVuc2lnbmVkIHY7CisJCXYgPSAocGl4ZWwgJiBmbXQtPlJtYXNrKSA+PiBmbXQtPlJzaGlmdDsKKwkJKnIgPSAodiA8PCBmbXQtPlJsb3NzKSArICh2ID4+ICg4IC0gKGZtdC0+Umxvc3MgPDwgMSkpKTsKKwkJdiA9IChwaXhlbCAmIGZtdC0+R21hc2spID4+IGZtdC0+R3NoaWZ0OworCQkqZyA9ICh2IDw8IGZtdC0+R2xvc3MpICsgKHYgPj4gKDggLSAoZm10LT5HbG9zcyA8PCAxKSkpOworCQl2ID0gKHBpeGVsICYgZm10LT5CbWFzaykgPj4gZm10LT5Cc2hpZnQ7CisJCSpiID0gKHYgPDwgZm10LT5CbG9zcykgKyAodiA+PiAoOCAtIChmbXQtPkJsb3NzIDw8IDEpKSk7CisJCWlmKGZtdC0+QW1hc2spIHsKKwkJICAgICAgICB2ID0gKHBpeGVsICYgZm10LT5BbWFzaykgPj4gZm10LT5Bc2hpZnQ7CisJCQkqYSA9ICh2IDw8IGZtdC0+QWxvc3MpICsgKHYgPj4gKDggLSAoZm10LT5BbG9zcyA8PCAxKSkpOworCQl9IGVsc2UgeworCQkgICAgICAgICphID0gU0RMX0FMUEhBX09QQVFVRTsKKyAgICAgICAgICAgICAgICB9CisJfSBlbHNlIHsKKwkJKnIgPSBmbXQtPnBhbGV0dGUtPmNvbG9yc1twaXhlbF0ucjsKKwkJKmcgPSBmbXQtPnBhbGV0dGUtPmNvbG9yc1twaXhlbF0uZzsKKwkJKmIgPSBmbXQtPnBhbGV0dGUtPmNvbG9yc1twaXhlbF0uYjsKKwkJKmEgPSBTRExfQUxQSEFfT1BBUVVFOworCX0KK30KKwordm9pZCBTRExfR2V0UkdCKFVpbnQzMiBwaXhlbCwgY29uc3QgU0RMX1BpeGVsRm9ybWF0ICogY29uc3QgZm10LAorICAgICAgICAgICAgICAgIFVpbnQ4ICpyLFVpbnQ4ICpnLFVpbnQ4ICpiKQoreworCWlmICggZm10LT5wYWxldHRlID09IE5VTEwgKSB7CisJICAgICAgICAvKiB0aGUgbm90ZSBmb3IgU0RMX0dldFJHQkEgYWJvdmUgYXBwbGllcyBoZXJlIHRvbyAqLworCSAgICAgICAgdW5zaWduZWQgdjsKKwkJdiA9IChwaXhlbCAmIGZtdC0+Um1hc2spID4+IGZtdC0+UnNoaWZ0OworCQkqciA9ICh2IDw8IGZtdC0+Umxvc3MpICsgKHYgPj4gKDggLSAoZm10LT5SbG9zcyA8PCAxKSkpOworCQl2ID0gKHBpeGVsICYgZm10LT5HbWFzaykgPj4gZm10LT5Hc2hpZnQ7CisJCSpnID0gKHYgPDwgZm10LT5HbG9zcykgKyAodiA+PiAoOCAtIChmbXQtPkdsb3NzIDw8IDEpKSk7CisJCXYgPSAocGl4ZWwgJiBmbXQtPkJtYXNrKSA+PiBmbXQtPkJzaGlmdDsKKwkJKmIgPSAodiA8PCBmbXQtPkJsb3NzKSArICh2ID4+ICg4IC0gKGZtdC0+Qmxvc3MgPDwgMSkpKTsKKwl9IGVsc2UgeworCQkqciA9IGZtdC0+cGFsZXR0ZS0+Y29sb3JzW3BpeGVsXS5yOworCQkqZyA9IGZtdC0+cGFsZXR0ZS0+Y29sb3JzW3BpeGVsXS5nOworCQkqYiA9IGZtdC0+cGFsZXR0ZS0+Y29sb3JzW3BpeGVsXS5iOworCX0KK30KKworLyogQXBwbHkgZ2FtbWEgdG8gYSBzZXQgb2YgY29sb3JzIC0gdGhpcyBpcyBlYXN5LiA6KSAqLwordm9pZCBTRExfQXBwbHlHYW1tYShVaW50MTYgKmdhbW1hLCBTRExfQ29sb3IgKmNvbG9ycywgU0RMX0NvbG9yICpvdXRwdXQsCisJCQkJCQkJaW50IG5jb2xvcnMpCit7CisJaW50IGk7CisKKwlmb3IgKCBpPTA7IGk8bmNvbG9yczsgKytpICkgeworCQlvdXRwdXRbaV0uciA9IGdhbW1hWzAqMjU2ICsgY29sb3JzW2ldLnJdID4+IDg7CisJCW91dHB1dFtpXS5nID0gZ2FtbWFbMSoyNTYgKyBjb2xvcnNbaV0uZ10gPj4gODsKKwkJb3V0cHV0W2ldLmIgPSBnYW1tYVsyKjI1NiArIGNvbG9yc1tpXS5iXSA+PiA4OworCX0KK30KKworLyogTWFwIGZyb20gUGFsZXR0ZSB0byBQYWxldHRlICovCitzdGF0aWMgVWludDggKk1hcDF0bzEoU0RMX1BhbGV0dGUgKnNyYywgU0RMX1BhbGV0dGUgKmRzdCwgaW50ICppZGVudGljYWwpCit7CisJVWludDggKm1hcDsKKwlpbnQgaTsKKworCWlmICggaWRlbnRpY2FsICkgeworCQlpZiAoIHNyYy0+bmNvbG9ycyA8PSBkc3QtPm5jb2xvcnMgKSB7CisJCQkvKiBJZiBhbiBpZGVudGljYWwgcGFsZXR0ZSwgbm8gbmVlZCB0byBtYXAgKi8KKwkJCWlmICggU0RMX21lbWNtcChzcmMtPmNvbG9ycywgZHN0LT5jb2xvcnMsIHNyYy0+bmNvbG9ycyoKKwkJCQkJCXNpemVvZihTRExfQ29sb3IpKSA9PSAwICkgeworCQkJCSppZGVudGljYWwgPSAxOworCQkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJfQorCQkqaWRlbnRpY2FsID0gMDsKKwl9CisJbWFwID0gKFVpbnQ4ICopU0RMX21hbGxvYyhzcmMtPm5jb2xvcnMpOworCWlmICggbWFwID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWZvciAoIGk9MDsgaTxzcmMtPm5jb2xvcnM7ICsraSApIHsKKwkJbWFwW2ldID0gU0RMX0ZpbmRDb2xvcihkc3QsCisJCQlzcmMtPmNvbG9yc1tpXS5yLCBzcmMtPmNvbG9yc1tpXS5nLCBzcmMtPmNvbG9yc1tpXS5iKTsKKwl9CisJcmV0dXJuKG1hcCk7Cit9CisvKiBNYXAgZnJvbSBQYWxldHRlIHRvIEJpdEZpZWxkICovCitzdGF0aWMgVWludDggKk1hcDF0b04oU0RMX1BpeGVsRm9ybWF0ICpzcmMsIFNETF9QaXhlbEZvcm1hdCAqZHN0KQoreworCVVpbnQ4ICptYXA7CisJaW50IGk7CisJaW50ICBicHA7CisJdW5zaWduZWQgYWxwaGE7CisJU0RMX1BhbGV0dGUgKnBhbCA9IHNyYy0+cGFsZXR0ZTsKKworCWJwcCA9ICgoZHN0LT5CeXRlc1BlclBpeGVsID09IDMpID8gNCA6IGRzdC0+Qnl0ZXNQZXJQaXhlbCk7CisJbWFwID0gKFVpbnQ4ICopU0RMX21hbGxvYyhwYWwtPm5jb2xvcnMqYnBwKTsKKwlpZiAoIG1hcCA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCWFscGhhID0gZHN0LT5BbWFzayA/IHNyYy0+YWxwaGEgOiAwOworCS8qIFdlIG1lbW9yeSBjb3B5IHRvIHRoZSBwaXhlbCBtYXAgc28gdGhlIGVuZGlhbm5lc3MgaXMgcHJlc2VydmVkICovCisJZm9yICggaT0wOyBpPHBhbC0+bmNvbG9yczsgKytpICkgeworCQlBU1NFTUJMRV9SR0JBKCZtYXBbaSpicHBdLCBkc3QtPkJ5dGVzUGVyUGl4ZWwsIGRzdCwKKwkJCSAgICAgIHBhbC0+Y29sb3JzW2ldLnIsIHBhbC0+Y29sb3JzW2ldLmcsCisJCQkgICAgICBwYWwtPmNvbG9yc1tpXS5iLCBhbHBoYSk7CisJfQorCXJldHVybihtYXApOworfQorLyogTWFwIGZyb20gQml0RmllbGQgdG8gRGl0aGVyZWQtUGFsZXR0ZSB0byBQYWxldHRlICovCitzdGF0aWMgVWludDggKk1hcE50bzEoU0RMX1BpeGVsRm9ybWF0ICpzcmMsIFNETF9QaXhlbEZvcm1hdCAqZHN0LCBpbnQgKmlkZW50aWNhbCkKK3sKKwkvKiBHZW5lcmF0ZSBhIDI1NiBjb2xvciBkaXRoZXIgcGFsZXR0ZSAqLworCVNETF9QYWxldHRlIGRpdGhlcmVkOworCVNETF9Db2xvciBjb2xvcnNbMjU2XTsKKwlTRExfUGFsZXR0ZSAqcGFsID0gZHN0LT5wYWxldHRlOworCQorCS8qIFNETF9EaXRoZXJDb2xvcnMgZG9lcyBub3QgaW5pdGlhbGl6ZSB0aGUgJ3VudXNlZCcgY29tcG9uZW50IG9mIGNvbG9ycywKKwkgICBidXQgTWFwMXRvMSBjb21wYXJlcyBpdCBhZ2FpbnN0IHBhbCwgc28gd2Ugc2hvdWxkIGluaXRpYWxpemUgaXQuICovICAKKwlTRExfbWVtc2V0KGNvbG9ycywgMCwgc2l6ZW9mKGNvbG9ycykpOworCisJZGl0aGVyZWQubmNvbG9ycyA9IDI1NjsKKwlTRExfRGl0aGVyQ29sb3JzKGNvbG9ycywgOCk7CisJZGl0aGVyZWQuY29sb3JzID0gY29sb3JzOworCXJldHVybihNYXAxdG8xKCZkaXRoZXJlZCwgcGFsLCBpZGVudGljYWwpKTsKK30KKworU0RMX0JsaXRNYXAgKlNETF9BbGxvY0JsaXRNYXAodm9pZCkKK3sKKwlTRExfQmxpdE1hcCAqbWFwOworCisJLyogQWxsb2NhdGUgdGhlIGVtcHR5IG1hcCAqLworCW1hcCA9IChTRExfQmxpdE1hcCAqKVNETF9tYWxsb2Moc2l6ZW9mKCptYXApKTsKKwlpZiAoIG1hcCA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlTRExfbWVtc2V0KG1hcCwgMCwgc2l6ZW9mKCptYXApKTsKKworCS8qIEFsbG9jYXRlIHRoZSBzb2Z0d2FyZSBibGl0IGRhdGEgKi8KKwltYXAtPnN3X2RhdGEgPSAoc3RydWN0IHByaXZhdGVfc3dhY2NlbCAqKVNETF9tYWxsb2Moc2l6ZW9mKCptYXAtPnN3X2RhdGEpKTsKKwlpZiAoIG1hcC0+c3dfZGF0YSA9PSBOVUxMICkgeworCQlTRExfRnJlZUJsaXRNYXAobWFwKTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJU0RMX21lbXNldChtYXAtPnN3X2RhdGEsIDAsIHNpemVvZigqbWFwLT5zd19kYXRhKSk7CisKKwkvKiBJdCdzIHJlYWR5IHRvIGdvICovCisJcmV0dXJuKG1hcCk7Cit9Cit2b2lkIFNETF9JbnZhbGlkYXRlTWFwKFNETF9CbGl0TWFwICptYXApCit7CisJaWYgKCAhIG1hcCApIHsKKwkJcmV0dXJuOworCX0KKwltYXAtPmRzdCA9IE5VTEw7CisJbWFwLT5mb3JtYXRfdmVyc2lvbiA9ICh1bnNpZ25lZCBpbnQpLTE7CisJaWYgKCBtYXAtPnRhYmxlICkgeworCQlTRExfZnJlZShtYXAtPnRhYmxlKTsKKwkJbWFwLT50YWJsZSA9IE5VTEw7CisJfQorfQoraW50IFNETF9NYXBTdXJmYWNlIChTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KQoreworCVNETF9QaXhlbEZvcm1hdCAqc3JjZm10OworCVNETF9QaXhlbEZvcm1hdCAqZHN0Zm10OworCVNETF9CbGl0TWFwICptYXA7CisKKwkvKiBDbGVhciBvdXQgYW55IHByZXZpb3VzIG1hcHBpbmcgKi8KKwltYXAgPSBzcmMtPm1hcDsKKwlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwgKSB7CisJCVNETF9VblJMRVN1cmZhY2Uoc3JjLCAxKTsKKwl9CisJU0RMX0ludmFsaWRhdGVNYXAobWFwKTsKKworCS8qIEZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIG1hcHBpbmcgd2UncmUgZG9pbmcgKi8KKwltYXAtPmlkZW50aXR5ID0gMDsKKwlzcmNmbXQgPSBzcmMtPmZvcm1hdDsKKwlkc3RmbXQgPSBkc3QtPmZvcm1hdDsKKwlzd2l0Y2ggKHNyY2ZtdC0+Qnl0ZXNQZXJQaXhlbCkgeworCSAgICBjYXNlIDE6CisJCXN3aXRjaCAoZHN0Zm10LT5CeXRlc1BlclBpeGVsKSB7CisJCSAgICBjYXNlIDE6CisJCQkvKiBQYWxldHRlIC0tPiBQYWxldHRlICovCisJCQkvKiBJZiBib3RoIFNETF9IV1NVUkZBQ0UsIGFzc3VtZSBoYXZlIHNhbWUgcGFsZXR0ZSAqLworCQkJaWYgKCAoKHNyYy0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFKSAmJgorCQkJICAgICAoKGRzdC0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFKSApIHsKKwkJCQltYXAtPmlkZW50aXR5ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJbWFwLT50YWJsZSA9IE1hcDF0bzEoc3JjZm10LT5wYWxldHRlLAorCQkJCQlkc3RmbXQtPnBhbGV0dGUsICZtYXAtPmlkZW50aXR5KTsKKwkJCX0KKwkJCWlmICggISBtYXAtPmlkZW50aXR5ICkgeworCQkJCWlmICggbWFwLT50YWJsZSA9PSBOVUxMICkgeworCQkJCQlyZXR1cm4oLTEpOworCQkJCX0KKwkJCX0KKwkJCWlmIChzcmNmbXQtPkJpdHNQZXJQaXhlbCE9ZHN0Zm10LT5CaXRzUGVyUGl4ZWwpCisJCQkJbWFwLT5pZGVudGl0eSA9IDA7CisJCQlicmVhazsKKworCQkgICAgZGVmYXVsdDoKKwkJCS8qIFBhbGV0dGUgLS0+IEJpdEZpZWxkICovCisJCQltYXAtPnRhYmxlID0gTWFwMXRvTihzcmNmbXQsIGRzdGZtdCk7CisJCQlpZiAoIG1hcC0+dGFibGUgPT0gTlVMTCApIHsKKwkJCQlyZXR1cm4oLTEpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3dpdGNoIChkc3RmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsKKwkJICAgIGNhc2UgMToKKwkJCS8qIEJpdEZpZWxkIC0tPiBQYWxldHRlICovCisJCQltYXAtPnRhYmxlID0gTWFwTnRvMShzcmNmbXQsIGRzdGZtdCwgJm1hcC0+aWRlbnRpdHkpOworCQkJaWYgKCAhIG1hcC0+aWRlbnRpdHkgKSB7CisJCQkJaWYgKCBtYXAtPnRhYmxlID09IE5VTEwgKSB7CisJCQkJCXJldHVybigtMSk7CisJCQkJfQorCQkJfQorCQkJbWFwLT5pZGVudGl0eSA9IDA7CS8qIERvbid0IG9wdGltaXplIHRvIGNvcHkgKi8KKwkJCWJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJCS8qIEJpdEZpZWxkIC0tPiBCaXRGaWVsZCAqLworCQkJaWYgKCBGT1JNQVRfRVFVQUwoc3JjZm10LCBkc3RmbXQpICkKKwkJCQltYXAtPmlkZW50aXR5ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCW1hcC0+ZHN0ID0gZHN0OworCW1hcC0+Zm9ybWF0X3ZlcnNpb24gPSBkc3QtPmZvcm1hdF92ZXJzaW9uOworCisJLyogQ2hvb3NlIHlvdXIgYmxpdHRlcnMgd2lzZWx5ICovCisJcmV0dXJuKFNETF9DYWxjdWxhdGVCbGl0KHNyYykpOworfQordm9pZCBTRExfRnJlZUJsaXRNYXAoU0RMX0JsaXRNYXAgKm1hcCkKK3sKKwlpZiAoIG1hcCApIHsKKwkJU0RMX0ludmFsaWRhdGVNYXAobWFwKTsKKwkJaWYgKCBtYXAtPnN3X2RhdGEgIT0gTlVMTCApIHsKKwkJCVNETF9mcmVlKG1hcC0+c3dfZGF0YSk7CisJCX0KKwkJU0RMX2ZyZWUobWFwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9waXhlbHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfcGl4ZWxzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc1OWUyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfcGl4ZWxzX2MuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVXNlZnVsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGZyb20gU0RMX3BpeGVsLmMgKi8KKworI2luY2x1ZGUgIlNETF9ibGl0LmgiCisKKy8qIFBpeGVsIGZvcm1hdCBmdW5jdGlvbnMgKi8KK2V4dGVybiBTRExfUGl4ZWxGb3JtYXQgKlNETF9BbGxvY0Zvcm1hdChpbnQgYnBwLAorCQlVaW50MzIgUm1hc2ssIFVpbnQzMiBHbWFzaywgVWludDMyIEJtYXNrLCBVaW50MzIgQW1hc2spOworZXh0ZXJuIFNETF9QaXhlbEZvcm1hdCAqU0RMX1JlYWxsb2NGb3JtYXQoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCBicHAsCisJCVVpbnQzMiBSbWFzaywgVWludDMyIEdtYXNrLCBVaW50MzIgQm1hc2ssIFVpbnQzMiBBbWFzayk7CitleHRlcm4gdm9pZCBTRExfRm9ybWF0Q2hhbmdlZChTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitleHRlcm4gdm9pZCBTRExfRnJlZUZvcm1hdChTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCk7CisKKy8qIEJsaXQgbWFwcGluZyBmdW5jdGlvbnMgKi8KK2V4dGVybiBTRExfQmxpdE1hcCAqU0RMX0FsbG9jQmxpdE1hcCh2b2lkKTsKK2V4dGVybiB2b2lkIFNETF9JbnZhbGlkYXRlTWFwKFNETF9CbGl0TWFwICptYXApOworZXh0ZXJuIGludCBTRExfTWFwU3VyZmFjZSAoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1N1cmZhY2UgKmRzdCk7CitleHRlcm4gdm9pZCBTRExfRnJlZUJsaXRNYXAoU0RMX0JsaXRNYXAgKm1hcCk7CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCitleHRlcm4gVWludDE2IFNETF9DYWxjdWxhdGVQaXRjaChTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitleHRlcm4gdm9pZCBTRExfRGl0aGVyQ29sb3JzKFNETF9Db2xvciAqY29sb3JzLCBpbnQgYnBwKTsKK2V4dGVybiBVaW50OCBTRExfRmluZENvbG9yKFNETF9QYWxldHRlICpwYWwsIFVpbnQ4IHIsIFVpbnQ4IGcsIFVpbnQ4IGIpOworZXh0ZXJuIHZvaWQgU0RMX0FwcGx5R2FtbWEoVWludDE2ICpnYW1tYSwgU0RMX0NvbG9yICpjb2xvcnMsIFNETF9Db2xvciAqb3V0cHV0LCBpbnQgbmNvbG9ycyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9zdHJldGNoLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9zdHJldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlNDAxZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3N0cmV0Y2guYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgYSBzdHJldGNoIGJsaXQgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gaWRlYXMgZ2l2ZW4gdG8gbWUgYnkKKyAgIFRvbWFzeiBDZWpuZXIgLSB0aGFua3MhIDopCisKKyAgIEFwcmlsIDI3LCAyMDAwIC0gU2FtIExhbnRpbmdhCisqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2JsaXQuaCIKKworLyogVGhpcyBpc24ndCByZWFkeSBmb3IgZ2VuZXJhbCBjb25zdW1wdGlvbiB5ZXQgLSBpdCBzaG91bGQgYmUgZm9sZGVkCisgICBpbnRvIHRoZSBnZW5lcmFsIGJsaXR0aW5nIG1lY2hhbmlzbS4KKyovCisKKyNpZiAoKGRlZmluZWQoX01GQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikvKiAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKSBzdGlsbCBuZWVkZWQ/ICovKSB8fCBcCisgICAgIGRlZmluZWQoX19XQVRDT01DX18pIHx8IFwKKyAgICAgKGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pKSkgJiYgU0RMX0FTU0VNQkxZX1JPVVRJTkVTCisvKiBUaGVyZSdzIGEgYnVnIHdpdGggZ2NjIDQuNC4xIGFuZCAtTzIgd2hlcmUgc3JjcCBkb2Vzbid0IGdldCB0aGUgY29ycmVjdAorICogdmFsdWUgYWZ0ZXIgdGhlIGZpcnN0IHNjYW5saW5lLiAgRklYTUU/ICovCisvKiNkZWZpbmUgVVNFX0FTTV9TVFJFVENIKi8KKyNlbmRpZgorCisjaWZkZWYgVVNFX0FTTV9TVFJFVENICisKKyNpZmRlZiBIQVZFX01QUk9URUNUCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFBBR0VfQUxJR05FRCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg0MDk2KSkpCisjZWxzZQorI2RlZmluZSBQQUdFX0FMSUdORUQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKGkzODYpCisjZGVmaW5lIFBSRUZJWDE2CTB4NjYKKyNkZWZpbmUgU1RPUkVfQllURQkweEFBCisjZGVmaW5lIFNUT1JFX1dPUkQJMHhBQgorI2RlZmluZSBMT0FEX0JZVEUJMHhBQworI2RlZmluZSBMT0FEX1dPUkQJMHhBRAorI2RlZmluZSBSRVRVUk4JCTB4QzMKKyNlbHNlCisjZXJyb3IgTmVlZCBhc3NlbWJseSBvcGNvZGVzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNvcHlfcm93WzQwOTZdIFBBR0VfQUxJR05FRDsKKworc3RhdGljIGludCBnZW5lcmF0ZV9yb3dieXRlcyhpbnQgc3JjX3csIGludCBkc3RfdywgaW50IGJwcCkKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJaW50IGJwcDsKKwkJaW50IHNyY193OworCQlpbnQgZHN0X3c7CisJCWludCBzdGF0dXM7CisJfSBsYXN0OworCisJaW50IGk7CisJaW50IHBvcywgaW5jOworCXVuc2lnbmVkIGNoYXIgKmVpcCwgKmZlbmNlOworCXVuc2lnbmVkIGNoYXIgbG9hZCwgc3RvcmU7CisKKwkvKiBTZWUgaWYgd2UgbmVlZCB0byByZWdlbmVyYXRlIHRoZSBjb3B5IGJ1ZmZlciAqLworCWlmICggKHNyY193ID09IGxhc3Quc3JjX3cpICYmCisJICAgICAoZHN0X3cgPT0gbGFzdC5kc3RfdykgJiYgKGJwcCA9PSBsYXN0LmJwcCkgKSB7CisJCXJldHVybihsYXN0LnN0YXR1cyk7CisJfQorCWxhc3QuYnBwID0gYnBwOworCWxhc3Quc3JjX3cgPSBzcmNfdzsKKwlsYXN0LmRzdF93ID0gZHN0X3c7CisJbGFzdC5zdGF0dXMgPSAtMTsKKworCXN3aXRjaCAoYnBwKSB7CisJICAgIGNhc2UgMToKKwkJbG9hZCA9IExPQURfQllURTsKKwkJc3RvcmUgPSBTVE9SRV9CWVRFOworCQlicmVhazsKKwkgICAgY2FzZSAyOgorCSAgICBjYXNlIDQ6CisJCWxvYWQgPSBMT0FEX1dPUkQ7CisJCXN0b3JlID0gU1RPUkVfV09SRDsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCVNETF9TZXRFcnJvcigiQVNNIHN0cmV0Y2ggb2YgJWQgYnl0ZXMgaXNuJ3Qgc3VwcG9ydGVkXG4iLCBicHApOworCQlyZXR1cm4oLTEpOworCX0KKyNpZmRlZiBIQVZFX01QUk9URUNUCisJLyogTWFrZSB0aGUgY29kZSB3cml0ZWFibGUgKi8KKwlpZiAoIG1wcm90ZWN0KGNvcHlfcm93LCBzaXplb2YoY29weV9yb3cpLCBQUk9UX1JFQUR8UFJPVF9XUklURSkgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IG1ha2UgY29weSBidWZmZXIgd3JpdGVhYmxlIik7CisJCXJldHVybigtMSk7CisJfQorI2VuZGlmCisJcG9zID0gMHgxMDAwMDsKKwlpbmMgPSAoc3JjX3cgPDwgMTYpIC8gZHN0X3c7CisJZWlwID0gY29weV9yb3c7CisJZmVuY2UgPSBjb3B5X3JvdytzaXplb2YoY29weV9yb3cpLTI7CisJZm9yICggaT0wOyBpPGRzdF93ICYmIGVpcCA8IGVuZDsgKytpICkgeworCQl3aGlsZSAoIHBvcyA+PSAweDEwMDAwTCApIHsKKwkJCWlmICggZWlwID09IGZlbmNlICkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmICggYnBwID09IDIgKSB7CisJCQkJKmVpcCsrID0gUFJFRklYMTY7CisJCQl9CisJCQkqZWlwKysgPSBsb2FkOworCQkJcG9zIC09IDB4MTAwMDBMOworCQl9CisJCWlmICggZWlwID09IGZlbmNlICkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICggYnBwID09IDIgKSB7CisJCQkqZWlwKysgPSBQUkVGSVgxNjsKKwkJfQorCQkqZWlwKysgPSBzdG9yZTsKKwkJcG9zICs9IGluYzsKKwl9CisJKmVpcCsrID0gUkVUVVJOOworCisjaWZkZWYgSEFWRV9NUFJPVEVDVAorCS8qIE1ha2UgdGhlIGNvZGUgZXhlY3V0YWJsZSBidXQgbm90IHdyaXRlYWJsZSAqLworCWlmICggbXByb3RlY3QoY29weV9yb3csIHNpemVvZihjb3B5X3JvdyksIFBST1RfUkVBRHxQUk9UX0VYRUMpIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBtYWtlIGNvcHkgYnVmZmVyIGV4ZWN1dGFibGUiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisjZW5kaWYKKwlsYXN0LnN0YXR1cyA9IDA7CisJcmV0dXJuKDApOworfQorCisjZW5kaWYgLyogVVNFX0FTTV9TVFJFVENIICovCisKKyNkZWZpbmUgREVGSU5FX0NPUFlfUk9XKG5hbWUsIHR5cGUpCQkJXAordm9pZCBuYW1lKHR5cGUgKnNyYywgaW50IHNyY193LCB0eXBlICpkc3QsIGludCBkc3RfdykJXAorewkJCQkJCQlcCisJaW50IGk7CQkJCQkJXAorCWludCBwb3MsIGluYzsJCQkJCVwKKwl0eXBlIHBpeGVsID0gMDsJCQkJCVwKKwkJCQkJCQlcCisJcG9zID0gMHgxMDAwMDsJCQkJCVwKKwlpbmMgPSAoc3JjX3cgPDwgMTYpIC8gZHN0X3c7CQkJXAorCWZvciAoIGk9ZHN0X3c7IGk+MDsgLS1pICkgewkJCVwKKwkJd2hpbGUgKCBwb3MgPj0gMHgxMDAwMEwgKSB7CQlcCisJCQlwaXhlbCA9ICpzcmMrKzsJCQlcCisJCQlwb3MgLT0gMHgxMDAwMEw7CQlcCisJCX0JCQkJCVwKKwkJKmRzdCsrID0gcGl4ZWw7CQkJCVwKKwkJcG9zICs9IGluYzsJCQkJXAorCX0JCQkJCQlcCit9CitERUZJTkVfQ09QWV9ST1coY29weV9yb3cxLCBVaW50OCkKK0RFRklORV9DT1BZX1JPVyhjb3B5X3JvdzIsIFVpbnQxNikKK0RFRklORV9DT1BZX1JPVyhjb3B5X3JvdzQsIFVpbnQzMikKKworLyogVGhlIEFTTSBjb2RlIGRvZXNuJ3QgaGFuZGxlIDI0LWJwcCBzdHJldGNoIGJsaXRzICovCit2b2lkIGNvcHlfcm93MyhVaW50OCAqc3JjLCBpbnQgc3JjX3csIFVpbnQ4ICpkc3QsIGludCBkc3RfdykKK3sKKwlpbnQgaTsKKwlpbnQgcG9zLCBpbmM7CisJVWludDggcGl4ZWxbM10gPSB7IDAsIDAsIDAgfTsKKworCXBvcyA9IDB4MTAwMDA7CisJaW5jID0gKHNyY193IDw8IDE2KSAvIGRzdF93OworCWZvciAoIGk9ZHN0X3c7IGk+MDsgLS1pICkgeworCQl3aGlsZSAoIHBvcyA+PSAweDEwMDAwTCApIHsKKwkJCXBpeGVsWzBdID0gKnNyYysrOworCQkJcGl4ZWxbMV0gPSAqc3JjKys7CisJCQlwaXhlbFsyXSA9ICpzcmMrKzsKKwkJCXBvcyAtPSAweDEwMDAwTDsKKwkJfQorCQkqZHN0KysgPSBwaXhlbFswXTsKKwkJKmRzdCsrID0gcGl4ZWxbMV07CisJCSpkc3QrKyA9IHBpeGVsWzJdOworCQlwb3MgKz0gaW5jOworCX0KK30KKworLyogUGVyZm9ybSBhIHN0cmV0Y2ggYmxpdCBiZXR3ZWVuIHR3byBzdXJmYWNlcyBvZiB0aGUgc2FtZSBmb3JtYXQuCisgICBOT1RFOiAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgc2FmZSB0byBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyEKKyovCitpbnQgU0RMX1NvZnRTdHJldGNoKFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAorICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCkKK3sKKwlpbnQgc3JjX2xvY2tlZDsKKwlpbnQgZHN0X2xvY2tlZDsKKwlpbnQgcG9zLCBpbmM7CisJaW50IGRzdF9tYXhyb3c7CisJaW50IHNyY19yb3csIGRzdF9yb3c7CisJVWludDggKnNyY3AgPSBOVUxMOworCVVpbnQ4ICpkc3RwOworCVNETF9SZWN0IGZ1bGxfc3JjOworCVNETF9SZWN0IGZ1bGxfZHN0OworI2lmZGVmIFVTRV9BU01fU1RSRVRDSAorCVNETF9ib29sIHVzZV9hc20gPSBTRExfVFJVRTsKKyNpZmRlZiBfX0dOVUNfXworCWludCB1MSwgdTI7CisjZW5kaWYKKyNlbmRpZiAvKiBVU0VfQVNNX1NUUkVUQ0ggKi8KKwljb25zdCBpbnQgYnBwID0gZHN0LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisKKwlpZiAoIHNyYy0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gZHN0LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCApIHsKKwkJU0RMX1NldEVycm9yKCJPbmx5IHdvcmtzIHdpdGggc2FtZSBmb3JtYXQgc3VyZmFjZXMiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBWZXJpZnkgdGhlIGJsaXQgcmVjdGFuZ2xlcyAqLworCWlmICggc3JjcmVjdCApIHsKKwkJaWYgKCAoc3JjcmVjdC0+eCA8IDApIHx8IChzcmNyZWN0LT55IDwgMCkgfHwKKwkJICAgICAoKHNyY3JlY3QtPngrc3JjcmVjdC0+dykgPiBzcmMtPncpIHx8CisJCSAgICAgKChzcmNyZWN0LT55K3NyY3JlY3QtPmgpID4gc3JjLT5oKSApIHsKKwkJCVNETF9TZXRFcnJvcigiSW52YWxpZCBzb3VyY2UgYmxpdCByZWN0YW5nbGUiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9IGVsc2UgeworCQlmdWxsX3NyYy54ID0gMDsKKwkJZnVsbF9zcmMueSA9IDA7CisJCWZ1bGxfc3JjLncgPSBzcmMtPnc7CisJCWZ1bGxfc3JjLmggPSBzcmMtPmg7CisJCXNyY3JlY3QgPSAmZnVsbF9zcmM7CisJfQorCWlmICggZHN0cmVjdCApIHsKKwkJaWYgKCAoZHN0cmVjdC0+eCA8IDApIHx8IChkc3RyZWN0LT55IDwgMCkgfHwKKwkJICAgICAoKGRzdHJlY3QtPngrZHN0cmVjdC0+dykgPiBkc3QtPncpIHx8CisJCSAgICAgKChkc3RyZWN0LT55K2RzdHJlY3QtPmgpID4gZHN0LT5oKSApIHsKKwkJCVNETF9TZXRFcnJvcigiSW52YWxpZCBkZXN0aW5hdGlvbiBibGl0IHJlY3RhbmdsZSIpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCX0gZWxzZSB7CisJCWZ1bGxfZHN0LnggPSAwOworCQlmdWxsX2RzdC55ID0gMDsKKwkJZnVsbF9kc3QudyA9IGRzdC0+dzsKKwkJZnVsbF9kc3QuaCA9IGRzdC0+aDsKKwkJZHN0cmVjdCA9ICZmdWxsX2RzdDsKKwl9CisKKwkvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCdzIGluIGhhcmR3YXJlICovCisJZHN0X2xvY2tlZCA9IDA7CisJaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKKwkJaWYgKCBTRExfTG9ja1N1cmZhY2UoZHN0KSA8IDAgKSB7CisJCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBsb2NrIGRlc3RpbmF0aW9uIHN1cmZhY2UiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJZHN0X2xvY2tlZCA9IDE7CisJfQorCS8qIExvY2sgdGhlIHNvdXJjZSBpZiBpdCdzIGluIGhhcmR3YXJlICovCisJc3JjX2xvY2tlZCA9IDA7CisJaWYgKCBTRExfTVVTVExPQ0soc3JjKSApIHsKKwkJaWYgKCBTRExfTG9ja1N1cmZhY2Uoc3JjKSA8IDAgKSB7CisJCQlpZiAoIGRzdF9sb2NrZWQgKSB7CisJCQkJU0RMX1VubG9ja1N1cmZhY2UoZHN0KTsKKwkJCX0KKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGxvY2sgc291cmNlIHN1cmZhY2UiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJc3JjX2xvY2tlZCA9IDE7CisJfQorCisJLyogU2V0IHVwIHRoZSBkYXRhLi4uICovCisJcG9zID0gMHgxMDAwMDsKKwlpbmMgPSAoc3JjcmVjdC0+aCA8PCAxNikgLyBkc3RyZWN0LT5oOworCXNyY19yb3cgPSBzcmNyZWN0LT55OworCWRzdF9yb3cgPSBkc3RyZWN0LT55OworCisjaWZkZWYgVVNFX0FTTV9TVFJFVENICisJLyogV3JpdGUgdGhlIG9wY29kZXMgZm9yIHRoaXMgc3RyZXRjaCAqLworCWlmICggKGJwcCA9PSAzKSB8fAorCSAgICAgKGdlbmVyYXRlX3Jvd2J5dGVzKHNyY3JlY3QtPncsIGRzdHJlY3QtPncsIGJwcCkgPCAwKSApIHsKKwkJdXNlX2FzbSA9IFNETF9GQUxTRTsKKwl9CisjZW5kaWYKKworCS8qIFBlcmZvcm0gdGhlIHN0cmV0Y2ggYmxpdCAqLworCWZvciAoIGRzdF9tYXhyb3cgPSBkc3Rfcm93K2RzdHJlY3QtPmg7IGRzdF9yb3c8ZHN0X21heHJvdzsgKytkc3Rfcm93ICkgeworCQlkc3RwID0gKFVpbnQ4ICopZHN0LT5waXhlbHMgKyAoZHN0X3Jvdypkc3QtPnBpdGNoKQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZHN0cmVjdC0+eCpicHApOworCQl3aGlsZSAoIHBvcyA+PSAweDEwMDAwTCApIHsKKwkJCXNyY3AgPSAoVWludDggKilzcmMtPnBpeGVscyArIChzcmNfcm93KnNyYy0+cGl0Y2gpCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc3JjcmVjdC0+eCpicHApOworCQkJKytzcmNfcm93OworCQkJcG9zIC09IDB4MTAwMDBMOworCQl9CisjaWZkZWYgVVNFX0FTTV9TVFJFVENICisJCWlmICh1c2VfYXNtKSB7CisjaWZkZWYgX19HTlVDX18KKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJCSJjYWxsIColNCIKKwkJCTogIj0mRCIgKHUxKSwgIj0mUyIgKHUyKQorCQkJOiAiMCIgKGRzdHApLCAiMSIgKHNyY3ApLCAiciIgKGNvcHlfcm93KQorCQkJOiAibWVtb3J5IiApOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX1dBVENPTUNfXykKKwkJeyB2b2lkICpjb2RlID0gY29weV9yb3c7CisJCQlfX2FzbSB7CisJCQkJcHVzaCBlZGkKKwkJCQlwdXNoIGVzaQorCQorCQkJCW1vdiBlZGksIGRzdHAKKwkJCQltb3YgZXNpLCBzcmNwCisJCQkJY2FsbCBkd29yZCBwdHIgY29kZQorCisJCQkJcG9wIGVzaQorCQkJCXBvcCBlZGkKKwkJCX0KKwkJfQorI2Vsc2UKKyNlcnJvciBOZWVkIGlubGluZSBhc3NlbWJseSBmb3IgdGhpcyBjb21waWxlcgorI2VuZGlmCisJCX0gZWxzZQorI2VuZGlmCisJCXN3aXRjaCAoYnBwKSB7CisJCSAgICBjYXNlIDE6CisJCQljb3B5X3JvdzEoc3JjcCwgc3JjcmVjdC0+dywgZHN0cCwgZHN0cmVjdC0+dyk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMjoKKwkJCWNvcHlfcm93MigoVWludDE2ICopc3JjcCwgc3JjcmVjdC0+dywKKwkJCSAgICAgICAgICAoVWludDE2ICopZHN0cCwgZHN0cmVjdC0+dyk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMzoKKwkJCWNvcHlfcm93MyhzcmNwLCBzcmNyZWN0LT53LCBkc3RwLCBkc3RyZWN0LT53KTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSA0OgorCQkJY29weV9yb3c0KChVaW50MzIgKilzcmNwLCBzcmNyZWN0LT53LAorCQkJICAgICAgICAgIChVaW50MzIgKilkc3RwLCBkc3RyZWN0LT53KTsKKwkJCWJyZWFrOworCQl9CisJCXBvcyArPSBpbmM7CisJfQorCisJLyogV2UgbmVlZCB0byB1bmxvY2sgdGhlIHN1cmZhY2VzIGlmIHRoZXkncmUgbG9ja2VkICovCisJaWYgKCBkc3RfbG9ja2VkICkgeworCQlTRExfVW5sb2NrU3VyZmFjZShkc3QpOworCX0KKwlpZiAoIHNyY19sb2NrZWQgKSB7CisJCVNETF9VbmxvY2tTdXJmYWNlKHNyYyk7CisJfQorCXJldHVybigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfc3RyZXRjaF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF9zdHJldGNoX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2M2YWNiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfc3RyZXRjaF9jLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFBlcmZvcm0gYSBzdHJldGNoIGJsaXQgYmV0d2VlbiB0d28gc3VyZmFjZXMgb2YgdGhlIHNhbWUgZm9ybWF0LgorICAgTk9URTogIFRoaXMgZnVuY3Rpb24gaXMgbm90IHNhZmUgdG8gY2FsbCBmcm9tIG11bHRpcGxlIHRocmVhZHMhCisqLworZXh0ZXJuIGludCBTRExfU29mdFN0cmV0Y2goU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCk7CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3N1cmZhY2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3N1cmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjNhZDEyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfc3VyZmFjZS5jCkBAIC0wLDAgKzEsOTQxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIlNETF9jdXJzb3JfYy5oIgorI2luY2x1ZGUgIlNETF9ibGl0LmgiCisjaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKKyNpbmNsdWRlICJTRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICJTRExfbGVha3MuaCIKKworCisvKiBQdWJsaWMgcm91dGluZXMgKi8KKy8qCisgKiBDcmVhdGUgYW4gZW1wdHkgUkdCIHN1cmZhY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIGRlcHRoCisgKi8KK1NETF9TdXJmYWNlICogU0RMX0NyZWF0ZVJHQlN1cmZhY2UgKFVpbnQzMiBmbGFncywKKwkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLAorCQkJVWludDMyIFJtYXNrLCBVaW50MzIgR21hc2ssIFVpbnQzMiBCbWFzaywgVWludDMyIEFtYXNrKQoreworCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCVNETF9TdXJmYWNlICpzY3JlZW47CisJU0RMX1N1cmZhY2UgKnN1cmZhY2U7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHNpemUgcmVxdWVzdGVkIGRvZXNuJ3Qgb3ZlcmZsb3cgb3VyIGRhdGF0eXBlcyAqLworCS8qIE5leHQgdGltZSBJIHdyaXRlIGEgbGlicmFyeSBsaWtlIFNETCwgSSdsbCB1c2UgaW50IGZvciBzaXplLiA6KSAqLworCWlmICggd2lkdGggPj0gMTYzODQgfHwgaGVpZ2h0ID49IDY1NTM2ICkgeworCQlTRExfU2V0RXJyb3IoIldpZHRoIG9yIGhlaWdodCBpcyB0b28gbGFyZ2UiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBkZXNpcmUgdGhlIHN1cmZhY2UgaW4gdmlkZW8gbWVtb3J5ICovCisJaWYgKCB2aWRlbyApIHsKKwkJc2NyZWVuID0gU0RMX1B1YmxpY1N1cmZhY2U7CisJfSBlbHNlIHsKKwkJc2NyZWVuID0gTlVMTDsKKwl9CisJaWYgKCBzY3JlZW4gJiYgKChzY3JlZW4tPmZsYWdzJlNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UpICkgeworCQlpZiAoIChmbGFncyYoU0RMX1NSQ0NPTE9SS0VZfFNETF9TUkNBTFBIQSkpICE9IDAgKSB7CisJCQlmbGFncyB8PSBTRExfSFdTVVJGQUNFOworCQl9CisJCWlmICggKGZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKSB7CisJCQlpZiAoICEgY3VycmVudF92aWRlby0+aW5mby5ibGl0X2h3X0NDICkgeworCQkJCWZsYWdzICY9IH5TRExfSFdTVVJGQUNFOworCQkJfQorCQl9CisJCWlmICggKGZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7CisJCQlpZiAoICEgY3VycmVudF92aWRlby0+aW5mby5ibGl0X2h3X0EgKSB7CisJCQkJZmxhZ3MgJj0gflNETF9IV1NVUkZBQ0U7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmbGFncyAmPSB+U0RMX0hXU1VSRkFDRTsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgc3VyZmFjZSAqLworCXN1cmZhY2UgPSAoU0RMX1N1cmZhY2UgKilTRExfbWFsbG9jKHNpemVvZigqc3VyZmFjZSkpOworCWlmICggc3VyZmFjZSA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlzdXJmYWNlLT5mbGFncyA9IFNETF9TV1NVUkZBQ0U7CisJaWYgKCAoZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgeworCQlpZiAoKEFtYXNrKSAmJiAodmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsKSkKKwkJeworCQkJZGVwdGggPSB2aWRlby0+ZGlzcGxheWZvcm1hdGFscGhhcGl4ZWwtPkJpdHNQZXJQaXhlbDsKKwkJCVJtYXNrID0gdmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsLT5SbWFzazsKKwkJCUdtYXNrID0gdmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsLT5HbWFzazsKKwkJCUJtYXNrID0gdmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsLT5CbWFzazsKKwkJCUFtYXNrID0gdmlkZW8tPmRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsLT5BbWFzazsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRlcHRoID0gc2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKKwkJCVJtYXNrID0gc2NyZWVuLT5mb3JtYXQtPlJtYXNrOworCQkJR21hc2sgPSBzY3JlZW4tPmZvcm1hdC0+R21hc2s7CisJCQlCbWFzayA9IHNjcmVlbi0+Zm9ybWF0LT5CbWFzazsKKwkJCUFtYXNrID0gc2NyZWVuLT5mb3JtYXQtPkFtYXNrOworCQl9CisJfQorCXN1cmZhY2UtPmZvcm1hdCA9IFNETF9BbGxvY0Zvcm1hdChkZXB0aCwgUm1hc2ssIEdtYXNrLCBCbWFzaywgQW1hc2spOworCWlmICggc3VyZmFjZS0+Zm9ybWF0ID09IE5VTEwgKSB7CisJCVNETF9mcmVlKHN1cmZhY2UpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWlmICggQW1hc2sgKSB7CisJCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9TUkNBTFBIQTsKKwl9CisJc3VyZmFjZS0+dyA9IHdpZHRoOworCXN1cmZhY2UtPmggPSBoZWlnaHQ7CisJc3VyZmFjZS0+cGl0Y2ggPSBTRExfQ2FsY3VsYXRlUGl0Y2goc3VyZmFjZSk7CisJc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKKwlzdXJmYWNlLT5vZmZzZXQgPSAwOworCXN1cmZhY2UtPmh3ZGF0YSA9IE5VTEw7CisJc3VyZmFjZS0+bG9ja2VkID0gMDsKKwlzdXJmYWNlLT5tYXAgPSBOVUxMOworCXN1cmZhY2UtPnVudXNlZDEgPSAwOworCVNETF9TZXRDbGlwUmVjdChzdXJmYWNlLCBOVUxMKTsKKwlTRExfRm9ybWF0Q2hhbmdlZChzdXJmYWNlKTsKKworCS8qIEdldCB0aGUgcGl4ZWxzICovCisJaWYgKCAoKGZsYWdzJlNETF9IV1NVUkZBQ0UpID09IFNETF9TV1NVUkZBQ0UpIHx8IAorCQkJCSh2aWRlby0+QWxsb2NIV1N1cmZhY2UodGhpcywgc3VyZmFjZSkgPCAwKSApIHsKKwkJaWYgKCBzdXJmYWNlLT53ICYmIHN1cmZhY2UtPmggKSB7CisJCQlzdXJmYWNlLT5waXhlbHMgPSBTRExfbWFsbG9jKHN1cmZhY2UtPmgqc3VyZmFjZS0+cGl0Y2gpOworCQkJaWYgKCBzdXJmYWNlLT5waXhlbHMgPT0gTlVMTCApIHsKKwkJCQlTRExfRnJlZVN1cmZhY2Uoc3VyZmFjZSk7CisJCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQkJLyogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGJpdG1hcHMgKi8KKwkJCVNETF9tZW1zZXQoc3VyZmFjZS0+cGl4ZWxzLCAwLCBzdXJmYWNlLT5oKnN1cmZhY2UtPnBpdGNoKTsKKwkJfQorCX0KKworCS8qIEFsbG9jYXRlIGFuIGVtcHR5IG1hcHBpbmcgKi8KKwlzdXJmYWNlLT5tYXAgPSBTRExfQWxsb2NCbGl0TWFwKCk7CisJaWYgKCBzdXJmYWNlLT5tYXAgPT0gTlVMTCApIHsKKwkJU0RMX0ZyZWVTdXJmYWNlKHN1cmZhY2UpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogVGhlIHN1cmZhY2UgaXMgcmVhZHkgdG8gZ28gKi8KKwlzdXJmYWNlLT5yZWZjb3VudCA9IDE7CisjaWZkZWYgQ0hFQ0tfTEVBS1MKKwkrK3N1cmZhY2VzX2FsbG9jYXRlZDsKKyNlbmRpZgorCXJldHVybihzdXJmYWNlKTsKK30KKy8qCisgKiBDcmVhdGUgYW4gUkdCIHN1cmZhY2UgZnJvbSBhbiBleGlzdGluZyBtZW1vcnkgYnVmZmVyCisgKi8KK1NETF9TdXJmYWNlICogU0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tICh2b2lkICpwaXhlbHMsCisJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHBpdGNoLAorCQkJVWludDMyIFJtYXNrLCBVaW50MzIgR21hc2ssIFVpbnQzMiBCbWFzaywgVWludDMyIEFtYXNrKQoreworCVNETF9TdXJmYWNlICpzdXJmYWNlOworCisJc3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsIDAsIDAsIGRlcHRoLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSbWFzaywgR21hc2ssIEJtYXNrLCBBbWFzayk7CisJaWYgKCBzdXJmYWNlICE9IE5VTEwgKSB7CisJCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9QUkVBTExPQzsKKwkJc3VyZmFjZS0+cGl4ZWxzID0gcGl4ZWxzOworCQlzdXJmYWNlLT53ID0gd2lkdGg7CisJCXN1cmZhY2UtPmggPSBoZWlnaHQ7CisJCXN1cmZhY2UtPnBpdGNoID0gcGl0Y2g7CisJCVNETF9TZXRDbGlwUmVjdChzdXJmYWNlLCBOVUxMKTsKKwl9CisJcmV0dXJuKHN1cmZhY2UpOworfQorLyoKKyAqIFNldCB0aGUgY29sb3Iga2V5IGluIGEgYmxpdHRhYmxlIHN1cmZhY2UKKyAqLworaW50IFNETF9TZXRDb2xvcktleSAoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBmbGFnLCBVaW50MzIga2V5KQoreworCS8qIFNhbml0eSBjaGVjayB0aGUgZmxhZyBhcyBpdCBnZXRzIHBhc3NlZCBpbiAqLworCWlmICggZmxhZyAmIFNETF9TUkNDT0xPUktFWSApIHsKKwkJaWYgKCBmbGFnICYgKFNETF9STEVBQ0NFTHxTRExfUkxFQUNDRUxPSykgKSB7CisJCQlmbGFnID0gKFNETF9TUkNDT0xPUktFWSB8IFNETF9STEVBQ0NFTE9LKTsKKwkJfSBlbHNlIHsKKwkJCWZsYWcgPSBTRExfU1JDQ09MT1JLRVk7CisJCX0KKwl9IGVsc2UgeworCQlmbGFnID0gMDsKKwl9CisKKwkvKiBPcHRpbWl6ZSBhd2F5IG9wZXJhdGlvbnMgdGhhdCBkb24ndCBjaGFuZ2UgYW55dGhpbmcgKi8KKwlpZiAoIChmbGFnID09IChzdXJmYWNlLT5mbGFncyAmIChTRExfU1JDQ09MT1JLRVl8U0RMX1JMRUFDQ0VMT0spKSkgJiYKKwkgICAgIChrZXkgPT0gc3VyZmFjZS0+Zm9ybWF0LT5jb2xvcmtleSkgKSB7CisJCXJldHVybigwKTsKKwl9CisKKwkvKiBVblJMRSBzdXJmYWNlcyBiZWZvcmUgd2UgY2hhbmdlIHRoZSBjb2xvcmtleSAqLworCWlmICggc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwgKSB7CisJICAgICAgICBTRExfVW5STEVTdXJmYWNlKHN1cmZhY2UsIDEpOworCX0KKworCWlmICggZmxhZyApIHsKKwkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCisKKwkJc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1NSQ0NPTE9SS0VZOworCQlzdXJmYWNlLT5mb3JtYXQtPmNvbG9ya2V5ID0ga2V5OworCQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV0FDQ0VMKSA9PSBTRExfSFdBQ0NFTCApIHsKKwkJCWlmICggKHZpZGVvLT5TZXRIV0NvbG9yS2V5ID09IE5VTEwpIHx8CisJCQkgICAgICh2aWRlby0+U2V0SFdDb2xvcktleSh0aGlzLCBzdXJmYWNlLCBrZXkpIDwgMCkgKSB7CisJCQkJc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOworCQkJfQorCQl9CisJCWlmICggZmxhZyAmIFNETF9STEVBQ0NFTE9LICkgeworCQkJc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMT0s7CisJCX0gZWxzZSB7CisJCQlzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1JMRUFDQ0VMT0s7CisJCX0KKwl9IGVsc2UgeworCQlzdXJmYWNlLT5mbGFncyAmPSB+KFNETF9TUkNDT0xPUktFWXxTRExfUkxFQUNDRUxPSyk7CisJCXN1cmZhY2UtPmZvcm1hdC0+Y29sb3JrZXkgPSAwOworCX0KKwlTRExfSW52YWxpZGF0ZU1hcChzdXJmYWNlLT5tYXApOworCXJldHVybigwKTsKK30KKy8qIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYWxwaGEgY2hhbm5lbCBvZiBhIHN1cmZhY2UgKi8KK2ludCBTRExfU2V0QWxwaGEgKFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIgZmxhZywgVWludDggdmFsdWUpCit7CisJVWludDMyIG9sZGZsYWdzID0gc3VyZmFjZS0+ZmxhZ3M7CisJVWludDMyIG9sZGFscGhhID0gc3VyZmFjZS0+Zm9ybWF0LT5hbHBoYTsKKworCS8qIFNhbml0eSBjaGVjayB0aGUgZmxhZyBhcyBpdCBnZXRzIHBhc3NlZCBpbiAqLworCWlmICggZmxhZyAmIFNETF9TUkNBTFBIQSApIHsKKwkJaWYgKCBmbGFnICYgKFNETF9STEVBQ0NFTHxTRExfUkxFQUNDRUxPSykgKSB7CisJCQlmbGFnID0gKFNETF9TUkNBTFBIQSB8IFNETF9STEVBQ0NFTE9LKTsKKwkJfSBlbHNlIHsKKwkJCWZsYWcgPSBTRExfU1JDQUxQSEE7CisJCX0KKwl9IGVsc2UgeworCQlmbGFnID0gMDsKKwl9CisKKwkvKiBPcHRpbWl6ZSBhd2F5IG9wZXJhdGlvbnMgdGhhdCBkb24ndCBjaGFuZ2UgYW55dGhpbmcgKi8KKwlpZiAoIChmbGFnID09IChzdXJmYWNlLT5mbGFncyAmIChTRExfU1JDQUxQSEF8U0RMX1JMRUFDQ0VMT0spKSkgJiYKKwkgICAgICghZmxhZyB8fCB2YWx1ZSA9PSBvbGRhbHBoYSkgKSB7CisJCXJldHVybigwKTsKKwl9CisKKwlpZighKGZsYWcgJiBTRExfUkxFQUNDRUxPSykgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSkKKwkJU0RMX1VuUkxFU3VyZmFjZShzdXJmYWNlLCAxKTsKKworCWlmICggZmxhZyApIHsKKwkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCisJCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9TUkNBTFBIQTsKKwkJc3VyZmFjZS0+Zm9ybWF0LT5hbHBoYSA9IHZhbHVlOworCQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV0FDQ0VMKSA9PSBTRExfSFdBQ0NFTCApIHsKKwkJCWlmICggKHZpZGVvLT5TZXRIV0FscGhhID09IE5VTEwpIHx8CisJCQkgICAgICh2aWRlby0+U2V0SFdBbHBoYSh0aGlzLCBzdXJmYWNlLCB2YWx1ZSkgPCAwKSApIHsKKwkJCQlzdXJmYWNlLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7CisJCQl9CisJCX0KKwkJaWYgKCBmbGFnICYgU0RMX1JMRUFDQ0VMT0sgKSB7CisJCSAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMT0s7CisJCX0gZWxzZSB7CisJCSAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9STEVBQ0NFTE9LOworCQl9CisJfSBlbHNlIHsKKwkJc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9TUkNBTFBIQTsKKwkJc3VyZmFjZS0+Zm9ybWF0LT5hbHBoYSA9IFNETF9BTFBIQV9PUEFRVUU7CisJfQorCS8qCisJICogVGhlIHJlcHJlc2VudGF0aW9uIGZvciBzb2Z0d2FyZSBzdXJmYWNlcyBpcyBpbmRlcGVuZGVudCBvZgorCSAqIHBlci1zdXJmYWNlIGFscGhhLCBzbyBubyBuZWVkIHRvIGludmFsaWRhdGUgdGhlIGJsaXQgbWFwcGluZworCSAqIGlmIGp1c3QgdGhlIGFscGhhIHZhbHVlIHdhcyBjaGFuZ2VkLiAoSWYgZWl0aGVyIGlzIDI1NSwgd2Ugc3RpbGwKKwkgKiBuZWVkIHRvIGludmFsaWRhdGUuKQorCSAqLworCWlmKChzdXJmYWNlLT5mbGFncyAmIFNETF9IV0FDQ0VMKSA9PSBTRExfSFdBQ0NFTAorCSAgIHx8IG9sZGZsYWdzICE9IHN1cmZhY2UtPmZsYWdzCisJICAgfHwgKCgob2xkYWxwaGEgKyAxKSBeICh2YWx1ZSArIDEpKSAmIDB4MTAwKSkKKwkJU0RMX0ludmFsaWRhdGVNYXAoc3VyZmFjZS0+bWFwKTsKKwlyZXR1cm4oMCk7Cit9CitpbnQgU0RMX1NldEFscGhhQ2hhbm5lbChTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDggdmFsdWUpCit7CisJaW50IHJvdywgY29sOworCWludCBvZmZzZXQ7CisJVWludDggKmJ1ZjsKKworCWlmICggKHN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgIT0gMHhGRjAwMDAwMCkgJiYKKwkgICAgIChzdXJmYWNlLT5mb3JtYXQtPkFtYXNrICE9IDB4MDAwMDAwRkYpICkgeworCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIHN1cmZhY2UgYWxwaGEgbWFzayBmb3JtYXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KKwlpZiAoIHN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgPT0gMHhGRjAwMDAwMCApIHsKKwkJCW9mZnNldCA9IDM7CisJfSBlbHNlIHsKKwkJCW9mZnNldCA9IDA7CisJfQorI2Vsc2UKKwlpZiAoIHN1cmZhY2UtPmZvcm1hdC0+QW1hc2sgPT0gMHhGRjAwMDAwMCApIHsKKwkJCW9mZnNldCA9IDA7CisJfSBlbHNlIHsKKwkJCW9mZnNldCA9IDM7CisJfQorI2VuZGlmIC8qIEJ5dGUgb3JkZXJpbmcgKi8KKworCS8qIFF1aWNrbHkgc2V0IHRoZSBhbHBoYSBjaGFubmVsIG9mIGFuIFJHQkEgb3IgQVJHQiBzdXJmYWNlICovCisJaWYgKCBTRExfTVVTVExPQ0soc3VyZmFjZSkgKSB7CisJCWlmICggU0RMX0xvY2tTdXJmYWNlKHN1cmZhY2UpIDwgMCApIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyb3cgPSBzdXJmYWNlLT5oOworCXdoaWxlIChyb3ctLSkgeworCQljb2wgPSBzdXJmYWNlLT53OworCQlidWYgPSAoVWludDggKilzdXJmYWNlLT5waXhlbHMgKyByb3cgKiBzdXJmYWNlLT5waXRjaCArIG9mZnNldDsKKwkJd2hpbGUoY29sLS0pIHsKKwkJCSpidWYgPSB2YWx1ZTsKKwkJCWJ1ZiArPSA0OworCQl9CisJfQorCWlmICggU0RMX01VU1RMT0NLKHN1cmZhY2UpICkgeworCQlTRExfVW5sb2NrU3VyZmFjZShzdXJmYWNlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byByZWN0YW5nbGVzOgorICogcmV0dXJuIHRydWUgaWYgdGhlIHJlY3RhbmdsZXMgaW50ZXJzZWN0LCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIF9faW5saW5lX18KK1NETF9ib29sIFNETF9JbnRlcnNlY3RSZWN0KGNvbnN0IFNETF9SZWN0ICpBLCBjb25zdCBTRExfUmVjdCAqQiwgU0RMX1JlY3QgKmludGVyc2VjdGlvbikKK3sKKwlpbnQgQW1pbiwgQW1heCwgQm1pbiwgQm1heDsKKworCS8qIEhvcml6b250YWwgaW50ZXJzZWN0aW9uICovCisJQW1pbiA9IEEtPng7CisJQW1heCA9IEFtaW4gKyBBLT53OworCUJtaW4gPSBCLT54OworCUJtYXggPSBCbWluICsgQi0+dzsKKwlpZihCbWluID4gQW1pbikKKwkgICAgICAgIEFtaW4gPSBCbWluOworCWludGVyc2VjdGlvbi0+eCA9IEFtaW47CisJaWYoQm1heCA8IEFtYXgpCisJICAgICAgICBBbWF4ID0gQm1heDsKKwlpbnRlcnNlY3Rpb24tPncgPSBBbWF4IC0gQW1pbiA+IDAgPyBBbWF4IC0gQW1pbiA6IDA7CisKKwkvKiBWZXJ0aWNhbCBpbnRlcnNlY3Rpb24gKi8KKwlBbWluID0gQS0+eTsKKwlBbWF4ID0gQW1pbiArIEEtPmg7CisJQm1pbiA9IEItPnk7CisJQm1heCA9IEJtaW4gKyBCLT5oOworCWlmKEJtaW4gPiBBbWluKQorCSAgICAgICAgQW1pbiA9IEJtaW47CisJaW50ZXJzZWN0aW9uLT55ID0gQW1pbjsKKwlpZihCbWF4IDwgQW1heCkKKwkgICAgICAgIEFtYXggPSBCbWF4OworCWludGVyc2VjdGlvbi0+aCA9IEFtYXggLSBBbWluID4gMCA/IEFtYXggLSBBbWluIDogMDsKKworCXJldHVybiAoaW50ZXJzZWN0aW9uLT53ICYmIGludGVyc2VjdGlvbi0+aCk7Cit9CisvKgorICogU2V0IHRoZSBjbGlwcGluZyByZWN0YW5nbGUgZm9yIGEgYmxpdHRhYmxlIHN1cmZhY2UKKyAqLworU0RMX2Jvb2wgU0RMX1NldENsaXBSZWN0KFNETF9TdXJmYWNlICpzdXJmYWNlLCBjb25zdCBTRExfUmVjdCAqcmVjdCkKK3sKKwlTRExfUmVjdCBmdWxsX3JlY3Q7CisKKwkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSdzIG5vIHN1cmZhY2UgdG8gYWN0IG9uICovCisJaWYgKCAhIHN1cmZhY2UgKSB7CisJCXJldHVybiBTRExfRkFMU0U7CisJfQorCisJLyogU2V0IHVwIHRoZSBmdWxsIHN1cmZhY2UgcmVjdGFuZ2xlICovCisJZnVsbF9yZWN0LnggPSAwOworCWZ1bGxfcmVjdC55ID0gMDsKKwlmdWxsX3JlY3QudyA9IHN1cmZhY2UtPnc7CisJZnVsbF9yZWN0LmggPSBzdXJmYWNlLT5oOworCisJLyogU2V0IHRoZSBjbGlwcGluZyByZWN0YW5nbGUgKi8KKwlpZiAoICEgcmVjdCApIHsKKwkJc3VyZmFjZS0+Y2xpcF9yZWN0ID0gZnVsbF9yZWN0OworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIFNETF9JbnRlcnNlY3RSZWN0KHJlY3QsICZmdWxsX3JlY3QsICZzdXJmYWNlLT5jbGlwX3JlY3QpOworfQordm9pZCBTRExfR2V0Q2xpcFJlY3QoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFNETF9SZWN0ICpyZWN0KQoreworCWlmICggc3VyZmFjZSAmJiByZWN0ICkgeworCQkqcmVjdCA9IHN1cmZhY2UtPmNsaXBfcmVjdDsKKwl9Cit9CisvKiAKKyAqIFNldCB1cCBhIGJsaXQgYmV0d2VlbiB0d28gc3VyZmFjZXMgLS0gc3BsaXQgaW50byB0aHJlZSBwYXJ0czoKKyAqIFRoZSB1cHBlciBwYXJ0LCBTRExfVXBwZXJCbGl0KCksIHBlcmZvcm1zIGNsaXBwaW5nIGFuZCByZWN0YW5nbGUgCisgKiB2ZXJpZmljYXRpb24uICBUaGUgbG93ZXIgcGFydCBpcyBhIHBvaW50ZXIgdG8gYSBsb3cgbGV2ZWwKKyAqIGFjY2VsZXJhdGVkIGJsaXR0aW5nIGZ1bmN0aW9uLgorICoKKyAqIFRoZXNlIHBhcnRzIGFyZSBzZXBhcmF0ZWQgb3V0IGFuZCBlYWNoIHVzZWQgaW50ZXJuYWxseSBieSB0aGlzIAorICogbGlicmFyeSBpbiB0aGUgb3B0aW1pbXVtIHBsYWNlcy4gIFRoZXkgYXJlIGV4cG9ydGVkIHNvIHRoYXQgaWYKKyAqIHlvdSBrbm93IGV4YWN0bHkgd2hhdCB5b3UgYXJlIGRvaW5nLCB5b3UgY2FuIG9wdGltaXplIHlvdXIgY29kZQorICogYnkgY2FsbGluZyB0aGUgb25lKHMpIHlvdSBuZWVkLgorICovCitpbnQgU0RMX0xvd2VyQmxpdCAoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCisJCQkJU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCit7CisJU0RMX2JsaXQgZG9fYmxpdDsKKwlTRExfUmVjdCBod19zcmNyZWN0OworCVNETF9SZWN0IGh3X2RzdHJlY3Q7CisKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGJsaXQgbWFwcGluZyBpcyB2YWxpZCAqLworCWlmICggKHNyYy0+bWFwLT5kc3QgIT0gZHN0KSB8fAorICAgICAgICAgICAgIChzcmMtPm1hcC0+ZHN0LT5mb3JtYXRfdmVyc2lvbiAhPSBzcmMtPm1hcC0+Zm9ybWF0X3ZlcnNpb24pICkgeworCQlpZiAoIFNETF9NYXBTdXJmYWNlKHNyYywgZHN0KSA8IDAgKSB7CisJCQlyZXR1cm4oLTEpOworCQl9CisJfQorCisJLyogRmlndXJlIG91dCB3aGljaCBibGl0dGVyIHRvIHVzZSAqLworCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfSFdBQ0NFTCkgPT0gU0RMX0hXQUNDRUwgKSB7CisJCWlmICggc3JjID09IFNETF9WaWRlb1N1cmZhY2UgKSB7CisJCQlod19zcmNyZWN0ID0gKnNyY3JlY3Q7CisJCQlod19zcmNyZWN0LnggKz0gY3VycmVudF92aWRlby0+b2Zmc2V0X3g7CisJCQlod19zcmNyZWN0LnkgKz0gY3VycmVudF92aWRlby0+b2Zmc2V0X3k7CisJCQlzcmNyZWN0ID0gJmh3X3NyY3JlY3Q7CisJCX0KKwkJaWYgKCBkc3QgPT0gU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJCWh3X2RzdHJlY3QgPSAqZHN0cmVjdDsKKwkJCWh3X2RzdHJlY3QueCArPSBjdXJyZW50X3ZpZGVvLT5vZmZzZXRfeDsKKwkJCWh3X2RzdHJlY3QueSArPSBjdXJyZW50X3ZpZGVvLT5vZmZzZXRfeTsKKwkJCWRzdHJlY3QgPSAmaHdfZHN0cmVjdDsKKwkJfQorCQlkb19ibGl0ID0gc3JjLT5tYXAtPmh3X2JsaXQ7CisJfSBlbHNlIHsKKwkJZG9fYmxpdCA9IHNyYy0+bWFwLT5zd19ibGl0OworCX0KKwlyZXR1cm4oZG9fYmxpdChzcmMsIHNyY3JlY3QsIGRzdCwgZHN0cmVjdCkpOworfQorCisKK2ludCBTRExfVXBwZXJCbGl0IChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKwkJICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCit7CisgICAgICAgIFNETF9SZWN0IGZ1bGxkc3Q7CisJaW50IHNyY3gsIHNyY3ksIHcsIGg7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHN1cmZhY2VzIGFyZW4ndCBsb2NrZWQgKi8KKwlpZiAoICEgc3JjIHx8ICEgZHN0ICkgeworCQlTRExfU2V0RXJyb3IoIlNETF9VcHBlckJsaXQ6IHBhc3NlZCBhIE5VTEwgc3VyZmFjZSIpOworCQlyZXR1cm4oLTEpOworCX0KKwlpZiAoIHNyYy0+bG9ja2VkIHx8IGRzdC0+bG9ja2VkICkgeworCQlTRExfU2V0RXJyb3IoIlN1cmZhY2VzIG11c3Qgbm90IGJlIGxvY2tlZCBkdXJpbmcgYmxpdCIpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIElmIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgaXMgTlVMTCwgdXNlIHRoZSBlbnRpcmUgZGVzdCBzdXJmYWNlICovCisJaWYgKCBkc3RyZWN0ID09IE5VTEwgKSB7CisJICAgICAgICBmdWxsZHN0LnggPSBmdWxsZHN0LnkgPSAwOworCQlkc3RyZWN0ID0gJmZ1bGxkc3Q7CisJfQorCisJLyogY2xpcCB0aGUgc291cmNlIHJlY3RhbmdsZSB0byB0aGUgc291cmNlIHN1cmZhY2UgKi8KKwlpZihzcmNyZWN0KSB7CisJICAgICAgICBpbnQgbWF4dywgbWF4aDsKKwkKKwkJc3JjeCA9IHNyY3JlY3QtPng7CisJCXcgPSBzcmNyZWN0LT53OworCQlpZihzcmN4IDwgMCkgeworCQkgICAgICAgIHcgKz0gc3JjeDsKKwkJCWRzdHJlY3QtPnggLT0gc3JjeDsKKwkJCXNyY3ggPSAwOworCQl9CisJCW1heHcgPSBzcmMtPncgLSBzcmN4OworCQlpZihtYXh3IDwgdykKKwkJCXcgPSBtYXh3OworCisJCXNyY3kgPSBzcmNyZWN0LT55OworCQloID0gc3JjcmVjdC0+aDsKKwkJaWYoc3JjeSA8IDApIHsKKwkJICAgICAgICBoICs9IHNyY3k7CisJCQlkc3RyZWN0LT55IC09IHNyY3k7CisJCQlzcmN5ID0gMDsKKwkJfQorCQltYXhoID0gc3JjLT5oIC0gc3JjeTsKKwkJaWYobWF4aCA8IGgpCisJCQloID0gbWF4aDsKKwkgICAgCisJfSBlbHNlIHsKKwkgICAgICAgIHNyY3ggPSBzcmN5ID0gMDsKKwkJdyA9IHNyYy0+dzsKKwkJaCA9IHNyYy0+aDsKKwl9CisKKwkvKiBjbGlwIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgYWdhaW5zdCB0aGUgY2xpcCByZWN0YW5nbGUgKi8KKwl7CisJICAgICAgICBTRExfUmVjdCAqY2xpcCA9ICZkc3QtPmNsaXBfcmVjdDsKKwkJaW50IGR4LCBkeTsKKworCQlkeCA9IGNsaXAtPnggLSBkc3RyZWN0LT54OworCQlpZihkeCA+IDApIHsKKwkJCXcgLT0gZHg7CisJCQlkc3RyZWN0LT54ICs9IGR4OworCQkJc3JjeCArPSBkeDsKKwkJfQorCQlkeCA9IGRzdHJlY3QtPnggKyB3IC0gY2xpcC0+eCAtIGNsaXAtPnc7CisJCWlmKGR4ID4gMCkKKwkJCXcgLT0gZHg7CisKKwkJZHkgPSBjbGlwLT55IC0gZHN0cmVjdC0+eTsKKwkJaWYoZHkgPiAwKSB7CisJCQloIC09IGR5OworCQkJZHN0cmVjdC0+eSArPSBkeTsKKwkJCXNyY3kgKz0gZHk7CisJCX0KKwkJZHkgPSBkc3RyZWN0LT55ICsgaCAtIGNsaXAtPnkgLSBjbGlwLT5oOworCQlpZihkeSA+IDApCisJCQloIC09IGR5OworCX0KKworCWlmKHcgPiAwICYmIGggPiAwKSB7CisJICAgICAgICBTRExfUmVjdCBzcjsKKwkgICAgICAgIHNyLnggPSBzcmN4OworCQlzci55ID0gc3JjeTsKKwkJc3IudyA9IGRzdHJlY3QtPncgPSB3OworCQlzci5oID0gZHN0cmVjdC0+aCA9IGg7CisJCXJldHVybiBTRExfTG93ZXJCbGl0KHNyYywgJnNyLCBkc3QsIGRzdHJlY3QpOworCX0KKwlkc3RyZWN0LT53ID0gZHN0cmVjdC0+aCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgU0RMX0ZpbGxSZWN0MShTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCwgVWludDMyIGNvbG9yKQoreworCS8qIEZJWE1FOiBXZSBoYXZlIHRvIHdvcnJ5IGFib3V0IHBhY2tpbmcgb3JkZXIuLiAqc2lnaCogKi8KKwlTRExfU2V0RXJyb3IoIjEtYnBwIHJlY3QgZmlsbCBub3QgeWV0IGltcGxlbWVudGVkIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IFNETF9GaWxsUmVjdDQoU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QsIFVpbnQzMiBjb2xvcikKK3sKKwkvKiBGSVhNRTogV2UgaGF2ZSB0byB3b3JyeSBhYm91dCBwYWNraW5nIG9yZGVyLi4gKnNpZ2gqICovCisJU0RMX1NldEVycm9yKCI0LWJwcCByZWN0IGZpbGwgbm90IHlldCBpbXBsZW1lbnRlZCIpOworCXJldHVybiAtMTsKK30KKworLyogCisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZmFzdCBmaWxsIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUgd2l0aCAnY29sb3InCisgKi8KK2ludCBTRExfRmlsbFJlY3QoU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QsIFVpbnQzMiBjb2xvcikKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKKwlpbnQgeCwgeTsKKwlVaW50OCAqcm93OworCisJLyogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHdvcmsgb24gc3VyZmFjZXMgPCA4IGJwcCAqLworCWlmICggZHN0LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDggKSB7CisJCXN3aXRjaChkc3QtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSB7CisJCSAgICBjYXNlIDE6CisJCQlyZXR1cm4gU0RMX0ZpbGxSZWN0MShkc3QsIGRzdHJlY3QsIGNvbG9yKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSA0OgorCQkJcmV0dXJuIFNETF9GaWxsUmVjdDQoZHN0LCBkc3RyZWN0LCBjb2xvcik7CisJCQlicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCQlTRExfU2V0RXJyb3IoIkZpbGwgcmVjdCBvbiB1bnN1cHBvcnRlZCBzdXJmYWNlIGZvcm1hdCIpOworCQkJcmV0dXJuKC0xKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSWYgJ2RzdHJlY3QnID09IE5VTEwsIHRoZW4gZmlsbCB0aGUgd2hvbGUgc3VyZmFjZSAqLworCWlmICggZHN0cmVjdCApIHsKKwkJLyogUGVyZm9ybSBjbGlwcGluZyAqLworCQlpZiAoICFTRExfSW50ZXJzZWN0UmVjdChkc3RyZWN0LCAmZHN0LT5jbGlwX3JlY3QsIGRzdHJlY3QpICkgeworCQkJcmV0dXJuKDApOworCQl9CisJfSBlbHNlIHsKKwkJZHN0cmVjdCA9ICZkc3QtPmNsaXBfcmVjdDsKKwl9CisKKwkvKiBDaGVjayBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uICovCisJaWYgKCAoKGRzdC0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFKSAmJgorCQkJCQl2aWRlby0+aW5mby5ibGl0X2ZpbGwgKSB7CisJCVNETF9SZWN0IGh3X3JlY3Q7CisJCWlmICggZHN0ID09IFNETF9WaWRlb1N1cmZhY2UgKSB7CisJCQlod19yZWN0ID0gKmRzdHJlY3Q7CisJCQlod19yZWN0LnggKz0gY3VycmVudF92aWRlby0+b2Zmc2V0X3g7CisJCQlod19yZWN0LnkgKz0gY3VycmVudF92aWRlby0+b2Zmc2V0X3k7CisJCQlkc3RyZWN0ID0gJmh3X3JlY3Q7CisJCX0KKwkJcmV0dXJuKHZpZGVvLT5GaWxsSFdSZWN0KHRoaXMsIGRzdCwgZHN0cmVjdCwgY29sb3IpKTsKKwl9CisKKwkvKiBQZXJmb3JtIHNvZnR3YXJlIGZpbGwgKi8KKwlpZiAoIFNETF9Mb2NrU3VyZmFjZShkc3QpICE9IDAgKSB7CisJCXJldHVybigtMSk7CisJfQorCXJvdyA9IChVaW50OCAqKWRzdC0+cGl4ZWxzK2RzdHJlY3QtPnkqZHN0LT5waXRjaCsKKwkJCWRzdHJlY3QtPngqZHN0LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJaWYgKCBkc3QtPmZvcm1hdC0+cGFsZXR0ZSB8fCAoY29sb3IgPT0gMCkgKSB7CisJCXggPSBkc3RyZWN0LT53KmRzdC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCQlpZiAoICFjb2xvciAmJiAhKCh1aW50cHRyX3Qpcm93JjMpICYmICEoeCYzKSAmJiAhKGRzdC0+cGl0Y2gmMykgKSB7CisJCQlpbnQgbiA9IHggPj4gMjsKKwkJCWZvciAoIHk9ZHN0cmVjdC0+aDsgeTsgLS15ICkgeworCQkJCVNETF9tZW1zZXQ0KHJvdywgMCwgbik7CisJCQkJcm93ICs9IGRzdC0+cGl0Y2g7CisJCQl9CisJCX0gZWxzZSB7CisjaWZkZWYgX19wb3dlcnBjX18KKwkJCS8qCisJCQkgKiBTRExfbWVtc2V0KCkgb24gUFBDIChib3RoIGdsaWJjIGFuZCBjb2Rld2FycmlvcikgdXNlcworCQkJICogdGhlIGRjYnogKERhdGEgQ2FjaGUgQmxvY2sgWmVybykgaW5zdHJ1Y3Rpb24sIHdoaWNoCisJCQkgKiBjYXVzZXMgYW4gYWxpZ25tZW50IGV4Y2VwdGlvbiBpZiB0aGUgZGVzdGluYXRpb24gaXMKKwkJCSAqIHVuY2FjaGFibGUsIHNvIG9ubHkgdXNlIGl0IG9uIHNvZnR3YXJlIHN1cmZhY2VzCisJCQkgKi8KKwkJCWlmKChkc3QtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX0hXU1VSRkFDRSkgeworCQkJCWlmKGRzdHJlY3QtPncgPj0gOCkgeworCQkJCQkvKgorCQkJCQkgKiA2NC1iaXQgc3RvcmVzIGFyZSBwcm9iYWJseSBtb3N0CisJCQkJCSAqIGVmZmljaWVudCB0byB1bmNhY2hlZCB2aWRlbyBtZW1vcnkKKwkJCQkJICovCisJCQkJCWRvdWJsZSBmaWxsOworCQkJCQlTRExfbWVtc2V0KCZmaWxsLCBjb2xvciwgKHNpemVvZiBmaWxsKSk7CisJCQkJCWZvcih5ID0gZHN0cmVjdC0+aDsgeTsgeS0tKSB7CisJCQkJCQlVaW50OCAqZCA9IHJvdzsKKwkJCQkJCXVuc2lnbmVkIG4gPSB4OworCQkJCQkJdW5zaWduZWQgbm47CisJCQkJCQlVaW50OCBjID0gY29sb3I7CisJCQkJCQlkb3VibGUgZiA9IGZpbGw7CisJCQkJCQl3aGlsZSgodW5zaWduZWQgbG9uZylkCisJCQkJCQkgICAgICAmIChzaXplb2YoZG91YmxlKSAtIDEpKSB7CisJCQkJCQkJKmQrKyA9IGM7CisJCQkJCQkJbi0tOworCQkJCQkJfQorCQkJCQkJbm4gPSBuIC8gKHNpemVvZihkb3VibGUpICogNCk7CisJCQkJCQl3aGlsZShubikgeworCQkJCQkJCSgoZG91YmxlICopZClbMF0gPSBmOworCQkJCQkJCSgoZG91YmxlICopZClbMV0gPSBmOworCQkJCQkJCSgoZG91YmxlICopZClbMl0gPSBmOworCQkJCQkJCSgoZG91YmxlICopZClbM10gPSBmOworCQkJCQkJCWQgKz0gNCpzaXplb2YoZG91YmxlKTsKKwkJCQkJCQlubi0tOworCQkJCQkJfQorCQkJCQkJbiAmPSB+KHNpemVvZihkb3VibGUpICogNCAtIDEpOworCQkJCQkJbm4gPSBuIC8gc2l6ZW9mKGRvdWJsZSk7CisJCQkJCQl3aGlsZShubikgeworCQkJCQkJCSooZG91YmxlICopZCA9IGY7CisJCQkJCQkJZCArPSBzaXplb2YoZG91YmxlKTsKKwkJCQkJCQlubi0tOworCQkJCQkJfQorCQkJCQkJbiAmPSB+KHNpemVvZihkb3VibGUpIC0gMSk7CisJCQkJCQl3aGlsZShuKSB7CisJCQkJCQkJKmQrKyA9IGM7CisJCQkJCQkJbi0tOworCQkJCQkJfQorCQkJCQkJcm93ICs9IGRzdC0+cGl0Y2g7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKiBuYXJyb3cgYm94ZXMgKi8KKwkJCQkJZm9yKHkgPSBkc3RyZWN0LT5oOyB5OyB5LS0pIHsKKwkJCQkJCVVpbnQ4ICpkID0gcm93OworCQkJCQkJVWludDggYyA9IGNvbG9yOworCQkJCQkJaW50IG4gPSB4OworCQkJCQkJd2hpbGUobikgeworCQkJCQkJCSpkKysgPSBjOworCQkJCQkJCW4tLTsKKwkJCQkJCX0KKwkJCQkJCXJvdyArPSBkc3QtPnBpdGNoOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlCisjZW5kaWYgLyogX19wb3dlcnBjX18gKi8KKwkJCXsKKwkJCQlmb3IoeSA9IGRzdHJlY3QtPmg7IHk7IHktLSkgeworCQkJCQlTRExfbWVtc2V0KHJvdywgY29sb3IsIHgpOworCQkJCQlyb3cgKz0gZHN0LT5waXRjaDsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGRzdC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7CisJCSAgICBjYXNlIDI6CisJCQlmb3IgKCB5PWRzdHJlY3QtPmg7IHk7IC0teSApIHsKKwkJCQlVaW50MTYgKnBpeGVscyA9IChVaW50MTYgKilyb3c7CisJCQkJVWludDE2IGMgPSAoVWludDE2KWNvbG9yOworCQkJCVVpbnQzMiBjYyA9IChVaW50MzIpYyA8PCAxNiB8IGM7CisJCQkJaW50IG4gPSBkc3RyZWN0LT53OworCQkJCWlmKCh1aW50cHRyX3QpcGl4ZWxzICYgMykgeworCQkJCQkqcGl4ZWxzKysgPSBjOworCQkJCQluLS07CisJCQkJfQorCQkJCWlmKG4gPj4gMSkKKwkJCQkJU0RMX21lbXNldDQocGl4ZWxzLCBjYywgbiA+PiAxKTsKKwkJCQlpZihuICYgMSkKKwkJCQkJcGl4ZWxzW24gLSAxXSA9IGM7CisJCQkJcm93ICs9IGRzdC0+cGl0Y2g7CisJCQl9CisJCQlicmVhazsKKworCQkgICAgY2FzZSAzOgorCQkJI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KKwkJCQljb2xvciA8PD0gODsKKwkJCSNlbmRpZgorCQkJZm9yICggeT1kc3RyZWN0LT5oOyB5OyAtLXkgKSB7CisJCQkJVWludDggKnBpeGVscyA9IHJvdzsKKwkJCQlmb3IgKCB4PWRzdHJlY3QtPnc7IHg7IC0teCApIHsKKwkJCQkJU0RMX21lbWNweShwaXhlbHMsICZjb2xvciwgMyk7CisJCQkJCXBpeGVscyArPSAzOworCQkJCX0KKwkJCQlyb3cgKz0gZHN0LT5waXRjaDsKKwkJCX0KKwkJCWJyZWFrOworCisJCSAgICBjYXNlIDQ6CisJCQlmb3IoeSA9IGRzdHJlY3QtPmg7IHk7IC0teSkgeworCQkJCVNETF9tZW1zZXQ0KHJvdywgY29sb3IsIGRzdHJlY3QtPncpOworCQkJCXJvdyArPSBkc3QtPnBpdGNoOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJU0RMX1VubG9ja1N1cmZhY2UoZHN0KTsKKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKDApOworfQorCisvKgorICogTG9jayBhIHN1cmZhY2UgdG8gZGlyZWN0bHkgYWNjZXNzIHRoZSBwaXhlbHMKKyAqLworaW50IFNETF9Mb2NrU3VyZmFjZSAoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaWYgKCAhIHN1cmZhY2UtPmxvY2tlZCApIHsKKwkJLyogUGVyZm9ybSB0aGUgbG9jayAqLworCQlpZiAoIHN1cmZhY2UtPmZsYWdzICYgKFNETF9IV1NVUkZBQ0V8U0RMX0FTWU5DQkxJVCkgKSB7CisJCQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwkJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCQkJaWYgKCB2aWRlby0+TG9ja0hXU3VyZmFjZSh0aGlzLCBzdXJmYWNlKSA8IDAgKSB7CisJCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJfQorCQlpZiAoIHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMICkgeworCQkJU0RMX1VuUkxFU3VyZmFjZShzdXJmYWNlLCAxKTsKKwkJCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsJLyogc2F2ZSBhY2NlbCdkIHN0YXRlICovCisJCX0KKwkJLyogVGhpcyBuZWVkcyB0byBiZSBkb25lIGhlcmUgaW4gY2FzZSBwaXhlbHMgY2hhbmdlcyB2YWx1ZSAqLworCQlzdXJmYWNlLT5waXhlbHMgPSAoVWludDggKilzdXJmYWNlLT5waXhlbHMgKyBzdXJmYWNlLT5vZmZzZXQ7CisJfQorCisJLyogSW5jcmVtZW50IHRoZSBzdXJmYWNlIGxvY2sgY291bnQsIGZvciByZWN1cnNpdmUgbG9ja3MgKi8KKwkrK3N1cmZhY2UtPmxvY2tlZDsKKworCS8qIFJlYWR5IHRvIGdvLi4gKi8KKwlyZXR1cm4oMCk7Cit9CisvKgorICogVW5sb2NrIGEgcHJldmlvdXNseSBsb2NrZWQgc3VyZmFjZQorICovCit2b2lkIFNETF9VbmxvY2tTdXJmYWNlIChTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwkvKiBPbmx5IHBlcmZvcm0gYW4gdW5sb2NrIGlmIHdlIGFyZSBsb2NrZWQgKi8KKwlpZiAoICEgc3VyZmFjZS0+bG9ja2VkIHx8ICgtLXN1cmZhY2UtPmxvY2tlZCA+IDApICkgeworCQlyZXR1cm47CisJfQorCisJLyogUGVyZm9ybSB0aGUgdW5sb2NrICovCisJc3VyZmFjZS0+cGl4ZWxzID0gKFVpbnQ4ICopc3VyZmFjZS0+cGl4ZWxzIC0gc3VyZmFjZS0+b2Zmc2V0OworCisJLyogVW5sb2NrIGhhcmR3YXJlIG9yIGFjY2VsZXJhdGVkIHN1cmZhY2VzICovCisJaWYgKCBzdXJmYWNlLT5mbGFncyAmIChTRExfSFdTVVJGQUNFfFNETF9BU1lOQ0JMSVQpICkgeworCQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CisJCXZpZGVvLT5VbmxvY2tIV1N1cmZhY2UodGhpcywgc3VyZmFjZSk7CisJfSBlbHNlIHsKKwkJLyogVXBkYXRlIFJMRSBlbmNvZGVkIHN1cmZhY2Ugd2l0aCBuZXcgZGF0YSAqLworCQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9STEVBQ0NFTCkgPT0gU0RMX1JMRUFDQ0VMICkgeworCQkgICAgICAgIHN1cmZhY2UtPmZsYWdzICY9IH5TRExfUkxFQUNDRUw7IC8qIHN0b3AgbHlpbmcgKi8KKwkJCVNETF9STEVTdXJmYWNlKHN1cmZhY2UpOworCQl9CisJfQorfQorCisvKiAKKyAqIENvbnZlcnQgYSBzdXJmYWNlIGludG8gdGhlIHNwZWNpZmllZCBwaXhlbCBmb3JtYXQuCisgKi8KK1NETF9TdXJmYWNlICogU0RMX0NvbnZlcnRTdXJmYWNlIChTRExfU3VyZmFjZSAqc3VyZmFjZSwKKwkJCQkJU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKwlTRExfU3VyZmFjZSAqY29udmVydDsKKwlVaW50MzIgY29sb3JrZXkgPSAwOworCVVpbnQ4IGFscGhhID0gMDsKKwlVaW50MzIgc3VyZmFjZV9mbGFnczsKKwlTRExfUmVjdCBib3VuZHM7CisKKwkvKiBDaGVjayBmb3IgZW1wdHkgZGVzdGluYXRpb24gcGFsZXR0ZSEgKHJlc3VsdHMgaW4gZW1wdHkgaW1hZ2UpICovCisJaWYgKCBmb3JtYXQtPnBhbGV0dGUgIT0gTlVMTCApIHsKKwkJaW50IGk7CisJCWZvciAoIGk9MDsgaTxmb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnM7ICsraSApIHsKKwkJCWlmICggKGZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2ldLnIgIT0gMCkgfHwKKwkJCSAgICAgKGZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2ldLmcgIT0gMCkgfHwKKwkJCSAgICAgKGZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2ldLmIgIT0gMCkgKQorCQkJCWJyZWFrOworCQl9CisJCWlmICggaSA9PSBmb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnMgKSB7CisJCQlTRExfU2V0RXJyb3IoIkVtcHR5IGRlc3RpbmF0aW9uIHBhbGV0dGUiKTsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCX0KKworCS8qIE9ubHkgY3JlYXRlIGh3IHN1cmZhY2VzIHdpdGggYWxwaGEgY2hhbm5lbCBpZiBodyBhbHBoYSBibGl0cworCSAgIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZihmb3JtYXQtPkFtYXNrICE9IDAgJiYgKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkpIHsKKwkJY29uc3QgU0RMX1ZpZGVvSW5mbyAqdmkgPSBTRExfR2V0VmlkZW9JbmZvKCk7CisJCWlmKCF2aSB8fCAhdmktPmJsaXRfaHdfQSkKKwkJCWZsYWdzICY9IH5TRExfSFdTVVJGQUNFOworCX0KKworCS8qIENyZWF0ZSBhIG5ldyBzdXJmYWNlIHdpdGggdGhlIGRlc2lyZWQgZm9ybWF0ICovCisJY29udmVydCA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKGZsYWdzLAorCQkJCXN1cmZhY2UtPncsIHN1cmZhY2UtPmgsIGZvcm1hdC0+Qml0c1BlclBpeGVsLAorCQlmb3JtYXQtPlJtYXNrLCBmb3JtYXQtPkdtYXNrLCBmb3JtYXQtPkJtYXNrLCBmb3JtYXQtPkFtYXNrKTsKKwlpZiAoIGNvbnZlcnQgPT0gTlVMTCApIHsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIENvcHkgdGhlIHBhbGV0dGUgaWYgYW55ICovCisJaWYgKCBmb3JtYXQtPnBhbGV0dGUgJiYgY29udmVydC0+Zm9ybWF0LT5wYWxldHRlICkgeworCQlTRExfbWVtY3B5KGNvbnZlcnQtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzLAorCQkJCWZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzLAorCQkJCWZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9ycypzaXplb2YoU0RMX0NvbG9yKSk7CisJCWNvbnZlcnQtPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9ycyA9IGZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsKKwl9CisKKwkvKiBTYXZlIHRoZSBvcmlnaW5hbCBzdXJmYWNlIGNvbG9yIGtleSBhbmQgYWxwaGEgKi8KKwlzdXJmYWNlX2ZsYWdzID0gc3VyZmFjZS0+ZmxhZ3M7CisJaWYgKCAoc3VyZmFjZV9mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgeworCQkvKiBDb252ZXJ0IGNvbG91cmtleWVkIHN1cmZhY2VzIHRvIFJHQkEgaWYgcmVxdWVzdGVkICovCisJCWlmKChmbGFncyAmIFNETF9TUkNDT0xPUktFWSkgIT0gU0RMX1NSQ0NPTE9SS0VZCisJCSAgICYmIGZvcm1hdC0+QW1hc2spIHsKKwkJCXN1cmZhY2VfZmxhZ3MgJj0gflNETF9TUkNDT0xPUktFWTsKKwkJfSBlbHNlIHsKKwkJCWNvbG9ya2V5ID0gc3VyZmFjZS0+Zm9ybWF0LT5jb2xvcmtleTsKKwkJCVNETF9TZXRDb2xvcktleShzdXJmYWNlLCAwLCAwKTsKKwkJfQorCX0KKwlpZiAoIChzdXJmYWNlX2ZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7CisJCS8qIENvcHkgb3ZlciB0aGUgYWxwaGEgY2hhbm5lbCB0byBSR0JBIGlmIHJlcXVlc3RlZCAqLworCQlpZiAoIGZvcm1hdC0+QW1hc2sgKSB7CisJCQlzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1NSQ0FMUEhBOworCQl9IGVsc2UgeworCQkJYWxwaGEgPSBzdXJmYWNlLT5mb3JtYXQtPmFscGhhOworCQkJU0RMX1NldEFscGhhKHN1cmZhY2UsIDAsIDApOworCQl9CisJfQorCisJLyogQ29weSBvdmVyIHRoZSBpbWFnZSBkYXRhICovCisJYm91bmRzLnggPSAwOworCWJvdW5kcy55ID0gMDsKKwlib3VuZHMudyA9IHN1cmZhY2UtPnc7CisJYm91bmRzLmggPSBzdXJmYWNlLT5oOworCVNETF9Mb3dlckJsaXQoc3VyZmFjZSwgJmJvdW5kcywgY29udmVydCwgJmJvdW5kcyk7CisKKwkvKiBDbGVhbiB1cCB0aGUgb3JpZ2luYWwgc3VyZmFjZSwgYW5kIHVwZGF0ZSBjb252ZXJ0ZWQgc3VyZmFjZSAqLworCWlmICggY29udmVydCAhPSBOVUxMICkgeworCQlTRExfU2V0Q2xpcFJlY3QoY29udmVydCwgJnN1cmZhY2UtPmNsaXBfcmVjdCk7CisJfQorCWlmICggKHN1cmZhY2VfZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSApIHsKKwkJVWludDMyIGNmbGFncyA9IHN1cmZhY2VfZmxhZ3MmKFNETF9TUkNDT0xPUktFWXxTRExfUkxFQUNDRUxPSyk7CisJCWlmICggY29udmVydCAhPSBOVUxMICkgeworCQkJVWludDgga2V5Uiwga2V5Rywga2V5QjsKKworCQkJU0RMX0dldFJHQihjb2xvcmtleSxzdXJmYWNlLT5mb3JtYXQsJmtleVIsJmtleUcsJmtleUIpOworCQkJU0RMX1NldENvbG9yS2V5KGNvbnZlcnQsIGNmbGFnc3woZmxhZ3MmU0RMX1JMRUFDQ0VMT0spLAorCQkJCVNETF9NYXBSR0IoY29udmVydC0+Zm9ybWF0LCBrZXlSLCBrZXlHLCBrZXlCKSk7CisJCX0KKwkJU0RMX1NldENvbG9yS2V5KHN1cmZhY2UsIGNmbGFncywgY29sb3JrZXkpOworCX0KKwlpZiAoIChzdXJmYWNlX2ZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7CisJCVVpbnQzMiBhZmxhZ3MgPSBzdXJmYWNlX2ZsYWdzJihTRExfU1JDQUxQSEF8U0RMX1JMRUFDQ0VMT0spOworCQlpZiAoIGNvbnZlcnQgIT0gTlVMTCApIHsKKwkJICAgICAgICBTRExfU2V0QWxwaGEoY29udmVydCwgYWZsYWdzfChmbGFncyZTRExfUkxFQUNDRUxPSyksCisJCQkJYWxwaGEpOworCQl9CisJCWlmICggZm9ybWF0LT5BbWFzayApIHsKKwkJCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9TUkNBTFBIQTsKKwkJfSBlbHNlIHsKKwkJCVNETF9TZXRBbHBoYShzdXJmYWNlLCBhZmxhZ3MsIGFscGhhKTsKKwkJfQorCX0KKworCS8qIFdlJ3JlIHJlYWR5IHRvIGdvISAqLworCXJldHVybihjb252ZXJ0KTsKK30KKworLyoKKyAqIEZyZWUgYSBzdXJmYWNlIGNyZWF0ZWQgYnkgdGhlIGFib3ZlIGZ1bmN0aW9uLgorICovCit2b2lkIFNETF9GcmVlU3VyZmFjZSAoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJLyogRnJlZSBhbnl0aGluZyB0aGF0J3Mgbm90IE5VTEwsIGFuZCBub3QgdGhlIHNjcmVlbiBzdXJmYWNlICovCisJaWYgKChzdXJmYWNlID09IE5VTEwpIHx8CisJICAgIChjdXJyZW50X3ZpZGVvICYmCisJICAgICgoc3VyZmFjZSA9PSBTRExfU2hhZG93U3VyZmFjZSl8fChzdXJmYWNlID09IFNETF9WaWRlb1N1cmZhY2UpKSkpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoIC0tc3VyZmFjZS0+cmVmY291bnQgPiAwICkgeworCQlyZXR1cm47CisJfQorCXdoaWxlICggc3VyZmFjZS0+bG9ja2VkID4gMCApIHsKKwkJU0RMX1VubG9ja1N1cmZhY2Uoc3VyZmFjZSk7CisJfQorCWlmICggKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwgKSB7CisJICAgICAgICBTRExfVW5STEVTdXJmYWNlKHN1cmZhY2UsIDApOworCX0KKwlpZiAoIHN1cmZhY2UtPmZvcm1hdCApIHsKKwkJU0RMX0ZyZWVGb3JtYXQoc3VyZmFjZS0+Zm9ybWF0KTsKKwkJc3VyZmFjZS0+Zm9ybWF0ID0gTlVMTDsKKwl9CisJaWYgKCBzdXJmYWNlLT5tYXAgIT0gTlVMTCApIHsKKwkJU0RMX0ZyZWVCbGl0TWFwKHN1cmZhY2UtPm1hcCk7CisJCXN1cmZhY2UtPm1hcCA9IE5VTEw7CisJfQorCWlmICggc3VyZmFjZS0+aHdkYXRhICkgeworCQlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CisJCXZpZGVvLT5GcmVlSFdTdXJmYWNlKHRoaXMsIHN1cmZhY2UpOworCX0KKwlpZiAoIHN1cmZhY2UtPnBpeGVscyAmJgorCSAgICAgKChzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykgIT0gU0RMX1BSRUFMTE9DKSApIHsKKwkJU0RMX2ZyZWUoc3VyZmFjZS0+cGl4ZWxzKTsKKwl9CisJU0RMX2ZyZWUoc3VyZmFjZSk7CisjaWZkZWYgQ0hFQ0tfTEVBS1MKKwktLXN1cmZhY2VzX2FsbG9jYXRlZDsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfc3lzdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3N5c3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyODdiNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3N5c3ZpZGVvLmgKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfc3lzdmlkZW9faAorI2RlZmluZSBfU0RMX3N5c3ZpZGVvX2gKKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2RlZmluZSBTRExfUFJPVE9UWVBFU19PTkxZCisjaW5jbHVkZSAiU0RMX3N5c3dtLmgiCisjdW5kZWYgU0RMX1BST1RPVFlQRVNfT05MWQorCisvKiBUaGlzIGZpbGUgcHJvdG90eXBlcyB0aGUgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uLgorICAgVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBlYXNpbHkgY29udmVydGVkIHRvIEMrKyBpbiB0aGUgZnV0dXJlLgorICovCisKKyNpZiBTRExfVklERU9fT1BFTkdMCisjaW5jbHVkZSAiU0RMX29wZW5nbC5oIgorI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KKworLyogVGhlIFNETCB2aWRlbyBkcml2ZXIgKi8KK3R5cGVkZWYgc3RydWN0IFNETF9WaWRlb0RldmljZSBTRExfVmlkZW9EZXZpY2U7CisKKy8qIERlZmluZSB0aGUgU0RMIHZpZGVvIGRyaXZlciBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICpfdGhpcworI2lmbmRlZiBfU1RBVFVTCisjZGVmaW5lIF9TVEFUVVMJU0RMX3N0YXR1cyAqc3RhdHVzCisjZW5kaWYKK3N0cnVjdCBTRExfVmlkZW9EZXZpY2UgeworCS8qICogKiAqLworCS8qIFRoZSBuYW1lIG9mIHRoaXMgdmlkZW8gZHJpdmVyICovCisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qICogKiAqLworCS8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSwgZmlsbGluZyAndmZvcm1hdCcgd2l0aCB0aGUgCisJICAgImJlc3QiIGRpc3BsYXkgcGl4ZWwgZm9ybWF0LCByZXR1cm5pbmcgMCBvciAtMSBpZiB0aGVyZSdzIGFuIGVycm9yLgorCSAqLworCWludCAoKlZpZGVvSW5pdCkoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CisKKwkvKiBMaXN0IHRoZSBhdmFpbGFibGUgdmlkZW8gbW9kZXMgZm9yIHRoZSBnaXZlbiBwaXhlbCBmb3JtYXQsIHNvcnRlZAorCSAgIGZyb20gbGFyZ2VzdCB0byBzbWFsbGVzdC4KKwkgKi8KKwlTRExfUmVjdCAqKigqTGlzdE1vZGVzKShfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CisKKwkvKiBTZXQgdGhlIHJlcXVlc3RlZCB2aWRlbyBtb2RlLCByZXR1cm5pbmcgYSBzdXJmYWNlIHdoaWNoIHdpbGwgYmUKKwkgICBzZXQgdG8gdGhlIFNETF9WaWRlb1N1cmZhY2UuICBUaGUgd2lkdGggYW5kIGhlaWdodCB3aWxsIGFscmVhZHkKKwkgICBiZSB2ZXJpZmllZCBieSBMaXN0TW9kZXMoKSwgYW5kIHRoZSB2aWRlbyBzdWJzeXN0ZW0gaXMgZnJlZSB0bworCSAgIHNldCB0aGUgbW9kZSB0byBhIHN1cHBvcnRlZCBiaXQgZGVwdGggZGlmZmVyZW50IGZyb20gdGhlIG9uZQorCSAgIHNwZWNpZmllZCAtLSB0aGUgZGVzaXJlZCBicHAgd2lsbCBiZSBlbXVsYXRlZCB3aXRoIGEgc2hhZG93CisJICAgc3VyZmFjZSBpZiBuZWNlc3NhcnkuICBJZiBhIG5ldyBtb2RlIGlzIHJldHVybmVkLCB0aGlzIGZ1bmN0aW9uCisJICAgc2hvdWxkIHRha2UgY2FyZSBvZiBjbGVhbmluZyB1cCB0aGUgY3VycmVudCBtb2RlLgorCSAqLworCVNETF9TdXJmYWNlICooKlNldFZpZGVvTW9kZSkoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAorCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKKworCS8qIFRvZ2dsZSB0aGUgZnVsbHNjcmVlbiBtb2RlICovCisJaW50ICgqVG9nZ2xlRnVsbFNjcmVlbikoX1RISVMsIGludCBvbik7CisKKwkvKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgdmlkZW8gbW9kZSBoYXMgYmVlbiBzZXQsIHRvIGdldCB0aGUKKwkgICBpbml0aWFsIG1vdXNlIHN0YXRlLiAgSXQgc2hvdWxkIHF1ZXVlIGV2ZW50cyBhcyBuZWNlc3NhcnkgdG8KKwkgICBwcm9wZXJseSByZXByZXNlbnQgdGhlIGN1cnJlbnQgbW91c2UgZm9jdXMgYW5kIHBvc2l0aW9uLgorCSAqLworCXZvaWQgKCpVcGRhdGVNb3VzZSkoX1RISVMpOworCisJLyogQ3JlYXRlIGEgWVVWIHZpZGVvIHN1cmZhY2UgKHBvc3NpYmx5IG92ZXJsYXkpIG9mIHRoZSBnaXZlbgorCSAgIGZvcm1hdC4gIFRoZSBoYXJkd2FyZSBzaG91bGQgYmUgYWJsZSB0byBwZXJmb3JtIGF0IGxlYXN0IDJ4CisJICAgc2NhbGluZyBvbiBkaXNwbGF5LgorCSAqLworCVNETF9PdmVybGF5ICooKkNyZWF0ZVlVVk92ZXJsYXkpKF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpOworCisgICAgICAgIC8qIFNldHMgdGhlIGNvbG9yIGVudHJpZXMgeyBmaXJzdGNvbG9yIC4uIChmaXJzdGNvbG9yK25jb2xvcnMtMSkgfQorCSAgIG9mIHRoZSBwaHlzaWNhbCBwYWxldHRlIHRvIHRob3NlIGluICdjb2xvcnMnLiBJZiB0aGUgZGV2aWNlIGlzCisJICAgdXNpbmcgYSBzb2Z0d2FyZSBwYWxldHRlIChTRExfSFdQQUxFVFRFIG5vdCBzZXQpLCB0aGVuIHRoZQorCSAgIGNoYW5nZXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgbG9naWNhbCBwYWxldHRlIG9mIHRoZSBzY3JlZW4KKwkgICBhcyB3ZWxsLgorCSAgIFRoZSByZXR1cm4gdmFsdWUgaXMgMSBpZiBhbGwgZW50cmllcyBjb3VsZCBiZSBzZXQgcHJvcGVybHkKKwkgICBvciAwIG90aGVyd2lzZS4KKwkqLworCWludCAoKlNldENvbG9ycykoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywKKwkJCSBTRExfQ29sb3IgKmNvbG9ycyk7CisKKwkvKiBUaGlzIHBvaW50ZXIgc2hvdWxkIGV4aXN0IGluIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIGFuZCBzaG91bGQKKwkgICBwb2ludCB0byBhbiBhcHByb3ByaWF0ZSB1cGRhdGUgZnVuY3Rpb24gZm9yIHRoZSBjdXJyZW50IHZpZGVvIG1vZGUKKwkgKi8KKwl2b2lkICgqVXBkYXRlUmVjdHMpKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKKwkvKiBSZXZlcnNlIHRoZSBlZmZlY3RzIFZpZGVvSW5pdCgpIC0tIGNhbGxlZCBpZiBWaWRlb0luaXQoKSBmYWlscworCSAgIG9yIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBzaHV0dGluZyBkb3duIHRoZSB2aWRlbyBzdWJzeXN0ZW0uCisJKi8KKwl2b2lkICgqVmlkZW9RdWl0KShfVEhJUyk7CisKKwkvKiAqICogKi8KKwkvKiBIYXJkd2FyZSBhY2NlbGVyYXRpb24gZnVuY3Rpb25zICovCisKKwkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gaGFyZHdhcmUgKi8KKwlTRExfVmlkZW9JbmZvIGluZm87CisKKwkvKiBUaGUgcGl4ZWwgZm9ybWF0IHVzZWQgd2hlbiBTRExfQ3JlYXRlUkdCU3VyZmFjZSBjcmVhdGVzIFNETF9IV1NVUkZBQ0VzIHdpdGggYWxwaGEgKi8KKwlTRExfUGl4ZWxGb3JtYXQqIGRpc3BsYXlmb3JtYXRhbHBoYXBpeGVsOworCQorCS8qIEFsbG9jYXRlcyBhIHN1cmZhY2UgaW4gdmlkZW8gbWVtb3J5ICovCisJaW50ICgqQWxsb2NIV1N1cmZhY2UpKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKKwkvKiBTZXRzIHRoZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCBibGl0IGZ1bmN0aW9uLCBpZiBhbnksIGJhc2VkCisJICAgb24gdGhlIGN1cnJlbnQgZmxhZ3Mgb2YgdGhlIHN1cmZhY2UgKGNvbG9ya2V5LCBhbHBoYSwgZXRjLikKKwkgKi8KKwlpbnQgKCpDaGVja0hXQmxpdCkoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkc3QpOworCisJLyogRmlsbHMgYSBzdXJmYWNlIHJlY3RhbmdsZSB3aXRoIHRoZSBnaXZlbiBjb2xvciAqLworCWludCAoKkZpbGxIV1JlY3QpKF9USElTLCBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqcmVjdCwgVWludDMyIGNvbG9yKTsKKworCS8qIFNldHMgdmlkZW8gbWVtIGNvbG9ya2V5IGFuZCBhY2NlbGVyYXRlZCBibGl0IGZ1bmN0aW9uICovCisJaW50ICgqU2V0SFdDb2xvcktleSkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIga2V5KTsKKworCS8qIFNldHMgcGVyIHN1cmZhY2UgaGFyZHdhcmUgYWxwaGEgdmFsdWUgKi8KKwlpbnQgKCpTZXRIV0FscGhhKShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQ4IHZhbHVlKTsKKworCS8qIFJldHVybnMgYSByZWFkYWJsZS93cml0YWJsZSBzdXJmYWNlICovCisJaW50ICgqTG9ja0hXU3VyZmFjZSkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKKwl2b2lkICgqVW5sb2NrSFdTdXJmYWNlKShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisJLyogUGVyZm9ybXMgaGFyZHdhcmUgZmxpcHBpbmcgKi8KKwlpbnQgKCpGbGlwSFdTdXJmYWNlKShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisJLyogRnJlZXMgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCB2aWRlbyBzdXJmYWNlICovCisJdm9pZCAoKkZyZWVIV1N1cmZhY2UpKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKKwkvKiAqICogKi8KKwkvKiBHYW1tYSBzdXBwb3J0ICovCisKKwlVaW50MTYgKmdhbW1hOworCisJLyogU2V0IHRoZSBnYW1tYSBjb3JyZWN0aW9uIGRpcmVjdGx5IChlbXVsYXRlZCB3aXRoIGdhbW1hIHJhbXBzKSAqLworCWludCAoKlNldEdhbW1hKShfVEhJUywgZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSk7CisKKwkvKiBHZXQgdGhlIGdhbW1hIGNvcnJlY3Rpb24gZGlyZWN0bHkgKGVtdWxhdGVkIHdpdGggZ2FtbWEgcmFtcHMpICovCisJaW50ICgqR2V0R2FtbWEpKF9USElTLCBmbG9hdCAqcmVkLCBmbG9hdCAqZ3JlZW4sIGZsb2F0ICpibHVlKTsKKworCS8qIFNldCB0aGUgZ2FtbWEgcmFtcCAqLworCWludCAoKlNldEdhbW1hUmFtcCkoX1RISVMsIFVpbnQxNiAqcmFtcCk7CisKKwkvKiBHZXQgdGhlIGdhbW1hIHJhbXAgKi8KKwlpbnQgKCpHZXRHYW1tYVJhbXApKF9USElTLCBVaW50MTYgKnJhbXApOworCisJLyogKiAqICovCisJLyogT3BlbkdMIHN1cHBvcnQgKi8KKworCS8qIFNldHMgdGhlIGRsbCB0byB1c2UgZm9yIE9wZW5HTCBhbmQgbG9hZHMgaXQgKi8KKwlpbnQgKCpHTF9Mb2FkTGlicmFyeSkoX1RISVMsIGNvbnN0IGNoYXIgKnBhdGgpOworCisJLyogUmV0cmlldmVzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gaW4gdGhlIGdsIGxpYnJhcnkgKi8KKwl2b2lkKiAoKkdMX0dldFByb2NBZGRyZXNzKShfVEhJUywgY29uc3QgY2hhciAqcHJvYyk7CisKKwkvKiBHZXQgYXR0cmlidXRlIGluZm9ybWF0aW9uIGZyb20gdGhlIHdpbmRvd2luZyBzeXN0ZW0uICovCisJaW50ICgqR0xfR2V0QXR0cmlidXRlKShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOworCisJLyogTWFrZSB0aGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBkcml2ZXIgY3VycmVudCAqLworCWludCAoKkdMX01ha2VDdXJyZW50KShfVEhJUyk7CisKKwkvKiBTd2FwIHRoZSBjdXJyZW50IGJ1ZmZlcnMgaW4gZG91YmxlIGJ1ZmZlciBtb2RlLiAqLworCXZvaWQgKCpHTF9Td2FwQnVmZmVycykoX1RISVMpOworCisgIAkvKiBPcGVuR0wgZnVuY3Rpb25zIGZvciBTRExfT1BFTkdMQkxJVCAqLworI2lmIFNETF9WSURFT19PUEVOR0wKKyNpZiAhZGVmaW5lZChfX1dJTjMyX18pCisjZGVmaW5lIFdJTkFQSQorI2VuZGlmCisjZGVmaW5lIFNETF9QUk9DKHJldCxmdW5jLHBhcmFtcykgcmV0IChXSU5BUEkgKmZ1bmMpIHBhcmFtczsKKyNpbmNsdWRlICJTRExfZ2xmdW5jcy5oIgorI3VuZGVmIFNETF9QUk9DCisKKwkvKiBUZXh0dXJlIGlkICovCisJR0x1aW50IHRleHR1cmU7CisjZW5kaWYKKwlpbnQgaXNfMzJiaXQ7CisgCisJLyogKiAqICovCisJLyogV2luZG93IG1hbmFnZXIgZnVuY3Rpb25zICovCisKKwkvKiBTZXQgdGhlIHRpdGxlIGFuZCBpY29uIHRleHQgKi8KKwl2b2lkICgqU2V0Q2FwdGlvbikoX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKKworCS8qIFNldCB0aGUgd2luZG93IGljb24gaW1hZ2UgKi8KKwl2b2lkICgqU2V0SWNvbikoX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzayk7CisKKwkvKiBJY29uaWZ5IHRoZSB3aW5kb3cuCisJICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlcmUgaXMgYSB3aW5kb3cgbWFuYWdlciBhbmQgdGhlCisJICAgd2luZG93IHdhcyBhY3R1YWxseSBpY29uaWZpZWQsIGl0IHJldHVybnMgMCBvdGhlcndpc2UuCisJKi8KKwlpbnQgKCpJY29uaWZ5V2luZG93KShfVEhJUyk7CisKKwkvKiBHcmFiIG9yIHVuZ3JhYiBrZXlib2FyZCBhbmQgbW91c2UgaW5wdXQgKi8KKwlTRExfR3JhYk1vZGUgKCpHcmFiSW5wdXQpKF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7CisKKwkvKiBHZXQgc29tZSBwbGF0Zm9ybSBkZXBlbmRlbnQgd2luZG93IGluZm9ybWF0aW9uICovCisJaW50ICgqR2V0V01JbmZvKShfVEhJUywgU0RMX1N5c1dNaW5mbyAqaW5mbyk7CisKKwkvKiBzZXQgd2luZG93IHBvc2l0aW9uICovCisJdm9pZCAoKlNldFdpbmRvd1BvcykoX1RISVMsIGludCB4LCBpbnQgeSk7CisKKwkvKiBnZXQgd2luZG93IHBvc2l0aW9uICovCisJdm9pZCAoKkdldFdpbmRvd1BvcykoX1RISVMsIGludCAqcHgsIGludCAqcHkpOworCisJLyogZGV0ZXJtaW5lIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHkgdmlzaWJsZSBvbiBzY3JlZW4gKi8KKwlpbnQgKCpJc1dpbmRvd1Zpc2libGUpKF9USElTLCBpbnQgcmVjZW50ZXIpOworCisJLyogZ2V0IG1haW4gbW9uaXRvcidzIHJlc29sdXRpb24gKi8KKwlpbnQgKCpHZXRNb25pdG9yRFBJKShfVEhJUywgaW50ICp4ZHBpLCBpbnQgKnlkcGkpOworCisJLyogZ2V0IG5lYXJlc3QgbW9uaXRvcidzIHJlY3RhbmdsZSAqLworCWludCAoKkdldE1vbml0b3JSZWN0KShfVEhJUywgU0RMX1JlY3QqIHJlY3QpOworCisJLyogKiAqICovCisJLyogQ3Vyc29yIG1hbmFnZXIgZnVuY3Rpb25zICovCisKKwkvKiBGcmVlIGEgd2luZG93IG1hbmFnZXIgY3Vyc29yCisJICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgTlVMTCBpZiBDcmVhdGVXTUN1cnNvciBpcyBhbHNvIE5VTEwuCisJICovCisJdm9pZCAoKkZyZWVXTUN1cnNvcikoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworCisJLyogSWYgbm90IE5VTEwsIGNyZWF0ZSBhIGJsYWNrL3doaXRlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLworCVdNY3Vyc29yICooKkNyZWF0ZVdNQ3Vyc29yKShfVEhJUywKKwkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKKworCS8qIFNob3cgdGhlIHNwZWNpZmllZCBjdXJzb3IsIG9yIGhpZGUgaWYgY3Vyc29yIGlzIE5VTEwgKi8KKwlpbnQgKCpTaG93V01DdXJzb3IpKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKKworCS8qIFdhcnAgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciB0byAoeCx5KQorCSAgIElmIE5VTEwsIGEgbW91c2UgbW90aW9uIGV2ZW50IGlzIHBvc3RlZCBpbnRlcm5hbGx5LgorCSAqLworCXZvaWQgKCpXYXJwV01DdXJzb3IpKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpOworCisJLyogSWYgbm90IE5VTEwsIHRoaXMgaXMgY2FsbGVkIHdoZW4gYSBtb3VzZSBtb3Rpb24gZXZlbnQgb2NjdXJzICovCisJdm9pZCAoKk1vdmVXTUN1cnNvcikoX1RISVMsIGludCB4LCBpbnQgeSk7CisKKwkvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgbW91c2Ugc2hvdWxkIGJlIGluIHJlbGF0aXZlIG1vZGUgb3Igbm90LgorCSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGlucHV0IGdyYWIgc3RhdGUgb3IgY3Vyc29yCisJICAgdmlzaWJpbGl0eSBzdGF0ZSBjaGFuZ2VzLgorCSAgIElmIHRoZSBjdXJzb3IgaXMgbm90IHZpc2libGUsIGFuZCB0aGUgaW5wdXQgaXMgZ3JhYmJlZCwgdGhlCisJICAgZHJpdmVyIGNhbiBwbGFjZSB0aGUgbW91c2UgaW4gcmVsYXRpdmUgbW9kZSwgd2hpY2ggbWF5IHJlc3VsdAorCSAgIGluIGhpZ2hlciBhY2N1cmFjeSBzYW1wbGluZyBvZiB0aGUgcG9pbnRlciBtb3Rpb24uCisJKi8KKwl2b2lkICgqQ2hlY2tNb3VzZU1vZGUpKF9USElTKTsKKworCS8qICogKiAqLworCS8qIEV2ZW50IG1hbmFnZXIgZnVuY3Rpb25zICovCisKKwkvKiBJbml0aWFsaXplIGtleWJvYXJkIG1hcHBpbmcgZm9yIHRoaXMgZHJpdmVyICovCisJdm9pZCAoKkluaXRPU0tleW1hcCkoX1RISVMpOworCisJLyogSGFuZGxlIGFueSBxdWV1ZWQgT1MgZXZlbnRzICovCisJdm9pZCAoKlB1bXBFdmVudHMpKF9USElTKTsKKworCS8qICogKiAqLworCS8qIERhdGEgY29tbW9uIHRvIGFsbCBkcml2ZXJzICovCisJU0RMX1N1cmZhY2UgKnNjcmVlbjsKKwlTRExfU3VyZmFjZSAqc2hhZG93OworCVNETF9TdXJmYWNlICp2aXNpYmxlOworICAgICAgICBTRExfUGFsZXR0ZSAqcGh5c3BhbDsJLyogcGh5c2ljYWwgcGFsZXR0ZSwgaWYgIT0gbG9naWNhbCBwYWxldHRlICovCisgICAgICAgIFNETF9Db2xvciAqZ2FtbWFjb2xzOwkvKiBnYW1tYS1jb3JyZWN0ZWQgY29sb3Vycywgb3IgTlVMTCAqLworCWNoYXIgKndtX3RpdGxlOworCWNoYXIgKndtX2ljb247CisJaW50IG9mZnNldF94OworCWludCBvZmZzZXRfeTsKKwlTRExfR3JhYk1vZGUgaW5wdXRfZ3JhYjsKKworCS8qIERyaXZlciBpbmZvcm1hdGlvbiBmbGFncyAqLworCWludCBoYW5kbGVzX2FueV9zaXplOwkvKiBEcml2ZXIgaGFuZGxlcyBhbnkgc2l6ZSB2aWRlbyBtb2RlICovCisKKwkvKiAqICogKi8KKwkvKiBEYXRhIHVzZWQgYnkgdGhlIEdMIGRyaXZlcnMgKi8KKwlzdHJ1Y3QgeworCQlpbnQgcmVkX3NpemU7CisJCWludCBncmVlbl9zaXplOworCQlpbnQgYmx1ZV9zaXplOworCQlpbnQgYWxwaGFfc2l6ZTsKKwkJaW50IGRlcHRoX3NpemU7CisJCWludCBidWZmZXJfc2l6ZTsKKwkJaW50IHN0ZW5jaWxfc2l6ZTsKKwkJaW50IGRvdWJsZV9idWZmZXI7CisJCWludCBhY2N1bV9yZWRfc2l6ZTsKKwkJaW50IGFjY3VtX2dyZWVuX3NpemU7CisJCWludCBhY2N1bV9ibHVlX3NpemU7CisJCWludCBhY2N1bV9hbHBoYV9zaXplOworCQlpbnQgc3RlcmVvOworCQlpbnQgbXVsdGlzYW1wbGVidWZmZXJzOworCQlpbnQgbXVsdGlzYW1wbGVzYW1wbGVzOworCQlpbnQgYWNjZWxlcmF0ZWQ7CisJCWludCBzd2FwX2NvbnRyb2w7CisJCWludCBkcml2ZXJfbG9hZGVkOworCQljaGFyIGRyaXZlcl9wYXRoWzI1Nl07CisJCXZvaWQqIGRsbF9oYW5kbGU7CisJfSBnbF9jb25maWc7CisKKwkvKiAqICogKi8KKwkvKiBEYXRhIHByaXZhdGUgdG8gdGhpcyBkcml2ZXIgKi8KKwlzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKmhpZGRlbjsKKwlzdHJ1Y3QgU0RMX1ByaXZhdGVHTERhdGEgKmdsX2RhdGE7CisKKwkvKiAqICogKi8KKwkvKiBUaGUgZnVuY3Rpb24gdXNlZCB0byBkaXNwb3NlIG9mIHRoaXMgc3RydWN0dXJlICovCisJdm9pZCAoKmZyZWUpKF9USElTKTsKK307CisjdW5kZWYgX1RISVMKKwordHlwZWRlZiBzdHJ1Y3QgVmlkZW9Cb290U3RyYXAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGVzYzsKKwlpbnQgKCphdmFpbGFibGUpKHZvaWQpOworCVNETF9WaWRlb0RldmljZSAqKCpjcmVhdGUpKGludCBkZXZpbmRleCk7Cit9IFZpZGVvQm9vdFN0cmFwOworCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9RVUFSVFoKK2V4dGVybiBWaWRlb0Jvb3RTdHJhcCBRWl9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMQorZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIFgxMV9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0RHQQorZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIERHQV9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX05BTk9YCitleHRlcm4gVmlkZW9Cb290U3RyYXAgTlhfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9JUE9ECitleHRlcm4gVmlkZW9Cb290U3RyYXAgaVBvZF9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1FUT1BJQQorZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIFF0b3BpYV9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1dTQ09OUworZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIFdTQ09OU19ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0ZCQ09OCitleHRlcm4gVmlkZW9Cb290U3RyYXAgRkJDT05fYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9ESVJFQ1RGQgorZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIERpcmVjdEZCX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfUFMyR1MKK2V4dGVybiBWaWRlb0Jvb3RTdHJhcCBQUzJHU19ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1BTMworZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIFBTM19ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0dHSQorZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIEdHSV9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1ZHTAorZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIFZHTF9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1NWR0FMSUIKK2V4dGVybiBWaWRlb0Jvb3RTdHJhcCBTVkdBTElCX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfR0FQSQorZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIEdBUElfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9XSU5ESUIKK2V4dGVybiBWaWRlb0Jvb3RTdHJhcCBXSU5ESUJfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9ERFJBVworZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIERJUkVDVFhfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9CV0lORE9XCitleHRlcm4gVmlkZW9Cb290U3RyYXAgQldJTkRPV19ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1RPT0xCT1gKK2V4dGVybiBWaWRlb0Jvb3RTdHJhcCBUT09MQk9YX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfRFJBV1NQUk9DS0VUCitleHRlcm4gVmlkZW9Cb290U3RyYXAgRFNwX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfUEhPVE9OCitleHRlcm4gVmlkZW9Cb290U3RyYXAgcGhfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9FUE9DCitleHRlcm4gVmlkZW9Cb290U3RyYXAgRVBPQ19ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1hCSU9TCitleHRlcm4gVmlkZW9Cb290U3RyYXAgWEJJT1NfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9HRU0KK2V4dGVybiBWaWRlb0Jvb3RTdHJhcCBHRU1fYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9QSUNPR1VJCitleHRlcm4gVmlkZW9Cb290U3RyYXAgUEdfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9EQworZXh0ZXJuIFZpZGVvQm9vdFN0cmFwIERDX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfTkRTCitleHRlcm4gVmlkZW9Cb290U3RyYXAgTkRTX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfUklTQ09TCitleHRlcm4gVmlkZW9Cb290U3RyYXAgUklTQ09TX2Jvb3RzdHJhcDsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfT1MyRlMKK2V4dGVybiBWaWRlb0Jvb3RTdHJhcCBPUzJGU0xpYl9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0FBTElCCitleHRlcm4gVmlkZW9Cb290U3RyYXAgQUFMSUJfYm9vdHN0cmFwOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9DQUNBCitleHRlcm4gVmlkZW9Cb290U3RyYXAgQ0FDQV9ib290c3RyYXA7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0RVTU1ZCitleHRlcm4gVmlkZW9Cb290U3RyYXAgRFVNTVlfYm9vdHN0cmFwOworI2VuZGlmCisKKy8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgdmlkZW8gZGV2aWNlICovCitleHRlcm4gU0RMX1ZpZGVvRGV2aWNlICpjdXJyZW50X3ZpZGVvOworCisjZGVmaW5lIFNETF9WaWRlb1N1cmZhY2UJKGN1cnJlbnRfdmlkZW8tPnNjcmVlbikKKyNkZWZpbmUgU0RMX1NoYWRvd1N1cmZhY2UJKGN1cnJlbnRfdmlkZW8tPnNoYWRvdykKKyNkZWZpbmUgU0RMX1B1YmxpY1N1cmZhY2UJKGN1cnJlbnRfdmlkZW8tPnZpc2libGUpCisKKyNlbmRpZiAvKiBfU0RMX3N5c3ZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3ZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF92aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjQ0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF92aWRlby5jCkBAIC0wLDAgKzEsMjA0MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoZSBoaWdoLWxldmVsIHZpZGVvIGRyaXZlciBzdWJzeXN0ZW0gKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIlNETF9ibGl0LmgiCisjaW5jbHVkZSAiU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiU0RMX2N1cnNvcl9jLmgiCisjaW5jbHVkZSAiLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisKKy8qIEF2YWlsYWJsZSB2aWRlbyBkcml2ZXJzICovCitzdGF0aWMgVmlkZW9Cb290U3RyYXAgKmJvb3RzdHJhcFtdID0geworI2lmIFNETF9WSURFT19EUklWRVJfUVVBUlRaCisJJlFaX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfWDExCisJJlgxMV9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0RHQQorCSZER0FfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9OQU5PWAorCSZOWF9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0lQT0QKKwkmaVBvZF9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1FUT1BJQQorCSZRdG9waWFfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9XU0NPTlMKKwkmV1NDT05TX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfRkJDT04KKwkmRkJDT05fYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9ESVJFQ1RGQgorCSZEaXJlY3RGQl9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1BTMkdTCisJJlBTMkdTX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfUFMzCisJJlBTM19ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0dHSQorCSZHR0lfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9WR0wKKwkmVkdMX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfU1ZHQUxJQgorCSZTVkdBTElCX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfR0FQSQorCSZHQVBJX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfV0lORElCCisJJldJTkRJQl9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0REUkFXCisJJkRJUkVDVFhfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9CV0lORE9XCisJJkJXSU5ET1dfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9UT09MQk9YCisJJlRPT0xCT1hfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9EUkFXU1BST0NLRVQKKwkmRFNwX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfUEhPVE9OCisJJnBoX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfRVBPQworCSZFUE9DX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfWEJJT1MKKwkmWEJJT1NfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9HRU0KKwkmR0VNX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfUElDT0dVSQorCSZQR19ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0RDCisJJkRDX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfTkRTCisJJk5EU19ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1JJU0NPUworCSZSSVNDT1NfYm9vdHN0cmFwLAorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9PUzJGUworCSZPUzJGU0xpYl9ib290c3RyYXAsCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX0FBTElCCisJJkFBTElCX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfQ0FDQQorCSZDQUNBX2Jvb3RzdHJhcCwKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfRFVNTVkKKwkmRFVNTVlfYm9vdHN0cmFwLAorI2VuZGlmCisJTlVMTAorfTsKKworU0RMX1ZpZGVvRGV2aWNlICpjdXJyZW50X3ZpZGVvID0gTlVMTDsKKworLyogVmFyaW91cyBsb2NhbCBmdW5jdGlvbnMgKi8KK2ludCBTRExfVmlkZW9Jbml0KGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lLCBVaW50MzIgZmxhZ3MpOwordm9pZCBTRExfVmlkZW9RdWl0KHZvaWQpOwordm9pZCBTRExfR0xfVXBkYXRlUmVjdHNMb2NrKFNETF9WaWRlb0RldmljZSogdGhpcywgaW50IG51bXJlY3RzLCBTRExfUmVjdCogcmVjdHMpOworCitzdGF0aWMgU0RMX0dyYWJNb2RlIFNETF9XTV9HcmFiSW5wdXRPZmYodm9pZCk7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorc3RhdGljIGludCBsb2NrX2NvdW50ID0gMDsKKyNlbmRpZgorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSB2aWRlbyBhbmQgZXZlbnQgc3Vic3lzdGVtcyAtLSBkZXRlcm1pbmUgbmF0aXZlIHBpeGVsIGZvcm1hdAorICovCitpbnQgU0RMX1ZpZGVvSW5pdCAoY29uc3QgY2hhciAqZHJpdmVyX25hbWUsIFVpbnQzMiBmbGFncykKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvOworCWludCBpbmRleDsKKwlpbnQgaTsKKwlTRExfUGl4ZWxGb3JtYXQgdmZvcm1hdDsKKwlVaW50MzIgdmlkZW9fZmxhZ3M7CisKKwkvKiBUb2dnbGUgdGhlIGV2ZW50IHRocmVhZCBmbGFncywgYmFzZWQgb24gT1MgcmVxdWlyZW1lbnRzICovCisjaWYgZGVmaW5lZChNVVNUX1RIUkVBRF9FVkVOVFMpCisJZmxhZ3MgfD0gU0RMX0lOSVRfRVZFTlRUSFJFQUQ7CisjZWxpZiBkZWZpbmVkKENBTlRfVEhSRUFEX0VWRU5UUykKKwlpZiAoIChmbGFncyAmIFNETF9JTklUX0VWRU5UVEhSRUFEKSA9PSBTRExfSU5JVF9FVkVOVFRIUkVBRCApIHsKKwkJU0RMX1NldEVycm9yKCJPUyBkb2Vzbid0IHN1cHBvcnQgdGhyZWFkZWQgZXZlbnRzIik7CisJCXJldHVybigtMSk7CisJfQorI2VuZGlmCisKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlICdjdXJyZW50X3ZpZGVvJyAqLworCWlmICggY3VycmVudF92aWRlbyAhPSBOVUxMICkgeworCQlTRExfVmlkZW9RdWl0KCk7CisJfQorCisJLyogU2VsZWN0IHRoZSBwcm9wZXIgdmlkZW8gZHJpdmVyICovCisJaW5kZXggPSAwOworCXZpZGVvID0gTlVMTDsKKwlpZiAoIGRyaXZlcl9uYW1lICE9IE5VTEwgKSB7CisjaWYgMAkvKiBUaGlzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhIGJldHRlciBkcml2ZXIgc2VsZWN0aW9uIEFQSSAqLworCQlpZiAoIFNETF9zdHJyY2hyKGRyaXZlcl9uYW1lLCAnOicpICE9IE5VTEwgKSB7CisJCQlpbmRleCA9IGF0b2koU0RMX3N0cnJjaHIoZHJpdmVyX25hbWUsICc6JykrMSk7CisJCX0KKyNlbmRpZgorCQlmb3IgKCBpPTA7IGJvb3RzdHJhcFtpXTsgKytpICkgeworCQkJaWYgKCBTRExfc3RyY2FzZWNtcChib290c3RyYXBbaV0tPm5hbWUsIGRyaXZlcl9uYW1lKSA9PSAwKSB7CisJCQkJaWYgKCBib290c3RyYXBbaV0tPmF2YWlsYWJsZSgpICkgeworCQkJCQl2aWRlbyA9IGJvb3RzdHJhcFtpXS0+Y3JlYXRlKGluZGV4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yICggaT0wOyBib290c3RyYXBbaV07ICsraSApIHsKKwkJCWlmICggYm9vdHN0cmFwW2ldLT5hdmFpbGFibGUoKSApIHsKKwkJCQl2aWRlbyA9IGJvb3RzdHJhcFtpXS0+Y3JlYXRlKGluZGV4KTsKKwkJCQlpZiAoIHZpZGVvICE9IE5VTEwgKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoIHZpZGVvID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiTm8gYXZhaWxhYmxlIHZpZGVvIGRldmljZSIpOworCQlyZXR1cm4oLTEpOworCX0KKwljdXJyZW50X3ZpZGVvID0gdmlkZW87CisJY3VycmVudF92aWRlby0+bmFtZSA9IGJvb3RzdHJhcFtpXS0+bmFtZTsKKworCS8qIERvIHNvbWUgYmFzaWMgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gKi8KKwl2aWRlby0+c2NyZWVuID0gTlVMTDsKKwl2aWRlby0+c2hhZG93ID0gTlVMTDsKKwl2aWRlby0+dmlzaWJsZSA9IE5VTEw7CisJdmlkZW8tPnBoeXNwYWwgPSBOVUxMOworCXZpZGVvLT5nYW1tYWNvbHMgPSBOVUxMOworCXZpZGVvLT5nYW1tYSA9IE5VTEw7CisJdmlkZW8tPndtX3RpdGxlID0gTlVMTDsKKwl2aWRlby0+d21faWNvbiAgPSBOVUxMOworCXZpZGVvLT5vZmZzZXRfeCA9IDA7CisJdmlkZW8tPm9mZnNldF95ID0gMDsKKwlTRExfbWVtc2V0KCZ2aWRlby0+aW5mbywgMCwgKHNpemVvZiB2aWRlby0+aW5mbykpOworCQorCXZpZGVvLT5kaXNwbGF5Zm9ybWF0YWxwaGFwaXhlbCA9IE5VTEw7CisKKwkvKiBTZXQgc29tZSB2ZXJ5IHNhbmUgR0wgZGVmYXVsdHMgKi8KKwl2aWRlby0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAwOworCXZpZGVvLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IE5VTEw7CisJdmlkZW8tPmdsX2NvbmZpZy5yZWRfc2l6ZSA9IDM7CisJdmlkZW8tPmdsX2NvbmZpZy5ncmVlbl9zaXplID0gMzsKKwl2aWRlby0+Z2xfY29uZmlnLmJsdWVfc2l6ZSA9IDI7CisJdmlkZW8tPmdsX2NvbmZpZy5hbHBoYV9zaXplID0gMDsKKwl2aWRlby0+Z2xfY29uZmlnLmJ1ZmZlcl9zaXplID0gMDsKKwl2aWRlby0+Z2xfY29uZmlnLmRlcHRoX3NpemUgPSAxNjsKKwl2aWRlby0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZSA9IDA7CisJdmlkZW8tPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyID0gMTsKKwl2aWRlby0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplID0gMDsKKwl2aWRlby0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemUgPSAwOworCXZpZGVvLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplID0gMDsKKwl2aWRlby0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemUgPSAwOworCXZpZGVvLT5nbF9jb25maWcuc3RlcmVvID0gMDsKKwl2aWRlby0+Z2xfY29uZmlnLm11bHRpc2FtcGxlYnVmZmVycyA9IDA7CisJdmlkZW8tPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXMgPSAwOworCXZpZGVvLT5nbF9jb25maWcuYWNjZWxlcmF0ZWQgPSAtMTsgLyogbm90IGtub3duLCBkb24ndCBzZXQgKi8KKwl2aWRlby0+Z2xfY29uZmlnLnN3YXBfY29udHJvbCA9IC0xOyAvKiBub3Qga25vd24sIGRvbid0IHNldCAqLworCQorCS8qIEluaXRpYWxpemUgdGhlIHZpZGVvIHN1YnN5c3RlbSAqLworCVNETF9tZW1zZXQoJnZmb3JtYXQsIDAsIHNpemVvZih2Zm9ybWF0KSk7CisJaWYgKCB2aWRlby0+VmlkZW9Jbml0KHZpZGVvLCAmdmZvcm1hdCkgPCAwICkgeworCQlTRExfVmlkZW9RdWl0KCk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogQ3JlYXRlIGEgemVybyBzaXplZCB2aWRlbyBzdXJmYWNlIG9mIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgKi8KKwl2aWRlb19mbGFncyA9IFNETF9TV1NVUkZBQ0U7CisJU0RMX1ZpZGVvU3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKHZpZGVvX2ZsYWdzLCAwLCAwLAorCQkJCXZmb3JtYXQuQml0c1BlclBpeGVsLAorCQkJCXZmb3JtYXQuUm1hc2ssIHZmb3JtYXQuR21hc2ssIHZmb3JtYXQuQm1hc2ssIDApOworCWlmICggU0RMX1ZpZGVvU3VyZmFjZSA9PSBOVUxMICkgeworCQlTRExfVmlkZW9RdWl0KCk7CisJCXJldHVybigtMSk7CisJfQorCVNETF9QdWJsaWNTdXJmYWNlID0gTlVMTDsJLyogVW50aWwgU0RMX1NldFZpZGVvTW9kZSgpICovCisKKyNpZiAwIC8qIERvbid0IGNoYW5nZSB0aGUgY3VycmVudCBwYWxldHRlIC0gbWF5IGJlIHVzZWQgYnkgb3RoZXIgcHJvZ3JhbXMuCisgICAgICAgKiBUaGUgYXBwbGljYXRpb24gY2FuJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgZGlzcGxheSBzdXJmYWNlIHVudGlsCisgICAgICAgKiBhIHZpZGVvIG1vZGUgaGFzIGJlZW4gc2V0IGFueXdheS4gOikKKyAgICAgICAqLworCS8qIElmIHdlIGhhdmUgYSBwYWxldHRpemVkIHN1cmZhY2UsIGNyZWF0ZSBhIGRlZmF1bHQgcGFsZXR0ZSAqLworCWlmICggU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlICkgeworCQlTRExfUGl4ZWxGb3JtYXQgKnZmID0gU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0OworCQlTRExfRGl0aGVyQ29sb3JzKHZmLT5wYWxldHRlLT5jb2xvcnMsIHZmLT5CaXRzUGVyUGl4ZWwpOworCQl2aWRlby0+U2V0Q29sb3JzKHZpZGVvLAorCQkJCSAwLCB2Zi0+cGFsZXR0ZS0+bmNvbG9ycywgdmYtPnBhbGV0dGUtPmNvbG9ycyk7CisJfQorI2VuZGlmCisJdmlkZW8tPmluZm8udmZtdCA9IFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdDsKKworCS8qIFN0YXJ0IHRoZSBldmVudCBsb29wICovCisJaWYgKCBTRExfU3RhcnRFdmVudExvb3AoZmxhZ3MpIDwgMCApIHsKKwkJU0RMX1ZpZGVvUXVpdCgpOworCQlyZXR1cm4oLTEpOworCX0KKwlTRExfQ3Vyc29ySW5pdChmbGFncyAmIFNETF9JTklUX0VWRU5UVEhSRUFEKTsKKworCS8qIFdlJ3JlIHJlYWR5IHRvIGdvISAqLworCXJldHVybigwKTsKK30KKworY2hhciAqU0RMX1ZpZGVvRHJpdmVyTmFtZShjaGFyICpuYW1lYnVmLCBpbnQgbWF4bGVuKQoreworCWlmICggY3VycmVudF92aWRlbyAhPSBOVUxMICkgeworCQlTRExfc3RybGNweShuYW1lYnVmLCBjdXJyZW50X3ZpZGVvLT5uYW1lLCBtYXhsZW4pOworCQlyZXR1cm4obmFtZWJ1Zik7CisJfQorCXJldHVybihOVUxMKTsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBkaXNwbGF5IHN1cmZhY2UKKyAqLworU0RMX1N1cmZhY2UgKlNETF9HZXRWaWRlb1N1cmZhY2Uodm9pZCkKK3sKKwlTRExfU3VyZmFjZSAqdmlzaWJsZTsKKworCXZpc2libGUgPSBOVUxMOworCWlmICggY3VycmVudF92aWRlbyApIHsKKwkJdmlzaWJsZSA9IGN1cnJlbnRfdmlkZW8tPnZpc2libGU7CisJfQorCXJldHVybih2aXNpYmxlKTsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gaGFyZHdhcmUKKyAqLworY29uc3QgU0RMX1ZpZGVvSW5mbyAqU0RMX0dldFZpZGVvSW5mbyh2b2lkKQoreworCWNvbnN0IFNETF9WaWRlb0luZm8gKmluZm87CisKKwlpbmZvID0gTlVMTDsKKwlpZiAoIGN1cnJlbnRfdmlkZW8gKSB7CisJCWluZm8gPSAmY3VycmVudF92aWRlby0+aW5mbzsKKwl9CisJcmV0dXJuKGluZm8pOworfQorCisvKgorICogUmV0dXJuIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdmFpbGFibGUgc2NyZWVuIGRpbWVuc2lvbnMgZm9yIHRoZQorICogZ2l2ZW4gZm9ybWF0LCBzb3J0ZWQgbGFyZ2VzdCB0byBzbWFsbGVzdC4gIFJldHVybnMgTlVMTCBpZiB0aGVyZSBhcmUKKyAqIG5vIGRpbWVuc2lvbnMgYXZhaWxhYmxlIGZvciBhIHBhcnRpY3VsYXIgZm9ybWF0LCBvciAoU0RMX1JlY3QgKiopLTEKKyAqIGlmIGFueSBkaW1lbnNpb24gaXMgb2theSBmb3IgdGhlIGdpdmVuIGZvcm1hdC4gIElmICdmb3JtYXQnIGlzIE5VTEwsCisgKiB0aGUgbW9kZSBsaXN0IHdpbGwgYmUgZm9yIHRoZSBmb3JtYXQgZ2l2ZW4gYnkgU0RMX0dldFZpZGVvSW5mbygpLT52Zm10CisgKi8KK1NETF9SZWN0ICoqIFNETF9MaXN0TW9kZXMgKFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCit7CisJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CisJU0RMX1JlY3QgKiptb2RlczsKKworCW1vZGVzID0gTlVMTDsKKwlpZiAoIFNETF9WaWRlb1N1cmZhY2UgKSB7CisJCWlmICggZm9ybWF0ID09IE5VTEwgKSB7CisJCQlmb3JtYXQgPSBTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQ7CisJCX0KKwkJbW9kZXMgPSB2aWRlby0+TGlzdE1vZGVzKHRoaXMsIGZvcm1hdCwgZmxhZ3MpOworCX0KKwlyZXR1cm4obW9kZXMpOworfQorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIGEgcGFydGljdWxhciB2aWRlbyBtb2RlIGlzIHN1cHBvcnRlZC4KKyAqIEl0IHJldHVybnMgMCBpZiB0aGUgcmVxdWVzdGVkIG1vZGUgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgYml0IGRlcHRoLAorICogb3IgcmV0dXJucyB0aGUgYml0cy1wZXItcGl4ZWwgb2YgdGhlIGNsb3Nlc3QgYXZhaWxhYmxlIG1vZGUgd2l0aCB0aGUKKyAqIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQuICBJZiB0aGlzIGJpdHMtcGVyLXBpeGVsIGlzIGRpZmZlcmVudCBmcm9tIHRoZQorICogb25lIHVzZWQgd2hlbiBzZXR0aW5nIHRoZSB2aWRlbyBtb2RlLCBTRExfU2V0VmlkZW9Nb2RlKCkgd2lsbCBzdWNjZWVkLAorICogYnV0IHdpbGwgZW11bGF0ZSB0aGUgcmVxdWVzdGVkIGJpdHMtcGVyLXBpeGVsIHdpdGggYSBzaGFkb3cgc3VyZmFjZS4KKyAqLworc3RhdGljIFVpbnQ4IFNETF9jbG9zZXN0X2RlcHRoc1s0XVs4XSA9IHsKKwkvKiA4IGJpdCBjbG9zZXN0IGRlcHRoIG9yZGVyaW5nICovCisJeyAwLCA4LCAxNiwgMTUsIDMyLCAyNCwgMCwgMCB9LAorCS8qIDE1LDE2IGJpdCBjbG9zZXN0IGRlcHRoIG9yZGVyaW5nICovCisJeyAwLCAxNiwgMTUsIDMyLCAyNCwgOCwgMCwgMCB9LAorCS8qIDI0IGJpdCBjbG9zZXN0IGRlcHRoIG9yZGVyaW5nICovCisJeyAwLCAyNCwgMzIsIDE2LCAxNSwgOCwgMCwgMCB9LAorCS8qIDMyIGJpdCBjbG9zZXN0IGRlcHRoIG9yZGVyaW5nICovCisJeyAwLCAzMiwgMTYsIDE1LCAyNCwgOCwgMCwgMCB9Cit9OworCisKKyNpZmRlZiBfX01BQ09TX18gLyogTVBXIG9wdGltaXphdGlvbiBidWc/ICovCisjZGVmaW5lIE5FR0FUSVZFX09ORSAweEZGRkZGRkZGCisjZWxzZQorI2RlZmluZSBORUdBVElWRV9PTkUgLTEKKyNlbmRpZgorCitpbnQgU0RMX1ZpZGVvTW9kZU9LIChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlpbnQgdGFibGUsIGIsIGk7CisJaW50IHN1cHBvcnRlZDsKKwlTRExfUGl4ZWxGb3JtYXQgZm9ybWF0OworCVNETF9SZWN0ICoqc2l6ZXM7CisKKwkvKiBDdXJyZW50bHkgMSBhbmQgNCBicHAgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoIGJwcCA8IDggfHwgYnBwID4gMzIgKSB7CisJCXJldHVybigwKTsKKwl9CisJaWYgKCAod2lkdGggPD0gMCkgfHwgKGhlaWdodCA8PSAwKSApIHsKKwkJcmV0dXJuKDApOworCX0KKworCS8qIFNlYXJjaCB0aHJvdWdoIHRoZSBsaXN0IHZhbGlkIG9mIG1vZGVzICovCisJU0RMX21lbXNldCgmZm9ybWF0LCAwLCBzaXplb2YoZm9ybWF0KSk7CisJc3VwcG9ydGVkID0gMDsKKwl0YWJsZSA9ICgoYnBwKzcpLzgpLTE7CisJU0RMX2Nsb3Nlc3RfZGVwdGhzW3RhYmxlXVswXSA9IGJwcDsKKwlTRExfY2xvc2VzdF9kZXB0aHNbdGFibGVdWzddID0gMDsKKwlmb3IgKCBiID0gMDsgIXN1cHBvcnRlZCAmJiBTRExfY2xvc2VzdF9kZXB0aHNbdGFibGVdW2JdOyArK2IgKSB7CisJCWZvcm1hdC5CaXRzUGVyUGl4ZWwgPSBTRExfY2xvc2VzdF9kZXB0aHNbdGFibGVdW2JdOworCQlzaXplcyA9IFNETF9MaXN0TW9kZXMoJmZvcm1hdCwgZmxhZ3MpOworCQlpZiAoIHNpemVzID09IChTRExfUmVjdCAqKikwICkgeworCQkJLyogTm8gc2l6ZXMgc3VwcG9ydGVkIGF0IHRoaXMgYml0LWRlcHRoICovCisJCQljb250aW51ZTsKKwkJfSBlbHNlIAorCQlpZiAoc2l6ZXMgPT0gKFNETF9SZWN0ICoqKU5FR0FUSVZFX09ORSkgeworCQkJLyogQW55IHNpemUgc3VwcG9ydGVkIGF0IHRoaXMgYml0LWRlcHRoICovCisJCQlzdXBwb3J0ZWQgPSAxOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoY3VycmVudF92aWRlby0+aGFuZGxlc19hbnlfc2l6ZSkgeworCQkJLyogRHJpdmVyIGNhbiBjZW50ZXIgYSBzbWFsbGVyIHN1cmZhY2UgdG8gc2ltdWxhdGUgZnVsbHNjcmVlbiAqLworCQkJZm9yICggaT0wOyBzaXplc1tpXTsgKytpICkgeworCQkJCWlmICgoc2l6ZXNbaV0tPncgPj0gd2lkdGgpICYmIChzaXplc1tpXS0+aCA+PSBoZWlnaHQpKSB7CisJCQkJCXN1cHBvcnRlZCA9IDE7IC8qIHRoaXMgbW9kZSBjYW4gZml0IHRoZSBjZW50ZXJlZCB3aW5kb3cuICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisJCWZvciAoIGk9MDsgc2l6ZXNbaV07ICsraSApIHsKKwkJCWlmICgoc2l6ZXNbaV0tPncgPT0gd2lkdGgpICYmIChzaXplc1tpXS0+aCA9PSBoZWlnaHQpKSB7CisJCQkJc3VwcG9ydGVkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIHN1cHBvcnRlZCApIHsKKwkJLS1iOworCQlyZXR1cm4oU0RMX2Nsb3Nlc3RfZGVwdGhzW3RhYmxlXVtiXSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuKDApOworCX0KK30KKworLyoKKyAqIEdldCB0aGUgY2xvc2VzdCBub24tZW11bGF0ZWQgdmlkZW8gbW9kZSB0byB0aGUgb25lIHJlcXVlc3RlZAorICovCitzdGF0aWMgaW50IFNETF9HZXRWaWRlb01vZGUgKGludCAqdywgaW50ICpoLCBpbnQgKkJpdHNQZXJQaXhlbCwgVWludDMyIGZsYWdzKQoreworCWludCB0YWJsZSwgYiwgaTsKKwlpbnQgc3VwcG9ydGVkOworCWludCBuYXRpdmVfYnBwOworCVNETF9QaXhlbEZvcm1hdCBmb3JtYXQ7CisJU0RMX1JlY3QgKipzaXplczsKKworCS8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKwlpZiAoICpCaXRzUGVyUGl4ZWwgPCA4IHx8ICpCaXRzUGVyUGl4ZWwgPiAzMiApIHsKKwkJU0RMX1NldEVycm9yKCJJbnZhbGlkIGJpdHMgcGVyIHBpeGVsIChyYW5nZSBpcyB7OC4uLjMyfSkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlpZiAoKCp3IDw9IDApIHx8ICgqaCA8PSAwKSkgeworCQlTRExfU2V0RXJyb3IoIkludmFsaWQgd2lkdGggb3IgaGVpZ2h0Iik7CisJCXJldHVybigwKTsKKwl9CisKKwkvKiBUcnkgdGhlIG9yaWdpbmFsIHZpZGVvIG1vZGUsIGdldCB0aGUgY2xvc2VzdCBkZXB0aCAqLworCW5hdGl2ZV9icHAgPSBTRExfVmlkZW9Nb2RlT0soKncsICpoLCAqQml0c1BlclBpeGVsLCBmbGFncyk7CisJaWYgKCBuYXRpdmVfYnBwID09ICpCaXRzUGVyUGl4ZWwgKSB7CisJCXJldHVybigxKTsKKwl9CisJaWYgKCBuYXRpdmVfYnBwID4gMCApIHsKKwkJKkJpdHNQZXJQaXhlbCA9IG5hdGl2ZV9icHA7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBObyBleGFjdCBzaXplIG1hdGNoIGF0IGFueSBkZXB0aCwgbG9vayBmb3IgY2xvc2VzdCBtYXRjaCAqLworCVNETF9tZW1zZXQoJmZvcm1hdCwgMCwgc2l6ZW9mKGZvcm1hdCkpOworCXN1cHBvcnRlZCA9IDA7CisJdGFibGUgPSAoKCpCaXRzUGVyUGl4ZWwrNykvOCktMTsKKwlTRExfY2xvc2VzdF9kZXB0aHNbdGFibGVdWzBdID0gKkJpdHNQZXJQaXhlbDsKKwlTRExfY2xvc2VzdF9kZXB0aHNbdGFibGVdWzddID0gU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisJZm9yICggYiA9IDA7ICFzdXBwb3J0ZWQgJiYgU0RMX2Nsb3Nlc3RfZGVwdGhzW3RhYmxlXVtiXTsgKytiICkgeworCQlpbnQgYmVzdDsKKworCQlmb3JtYXQuQml0c1BlclBpeGVsID0gU0RMX2Nsb3Nlc3RfZGVwdGhzW3RhYmxlXVtiXTsKKwkJc2l6ZXMgPSBTRExfTGlzdE1vZGVzKCZmb3JtYXQsIGZsYWdzKTsKKwkJaWYgKCBzaXplcyA9PSAoU0RMX1JlY3QgKiopMCApIHsKKwkJCS8qIE5vIHNpemVzIHN1cHBvcnRlZCBhdCB0aGlzIGJpdC1kZXB0aCAqLworCQkJY29udGludWU7CisJCX0KKwkJYmVzdD0wOworCQlmb3IgKCBpPTA7IHNpemVzW2ldOyArK2kgKSB7CisJCQkvKiBNb2RlIHdpdGggYm90aCBkaW1lbnNpb25zIGJpZ2dlciBvciBlcXVhbCB0aGFuIGFza2VkID8gKi8KKwkJCWlmICgoc2l6ZXNbaV0tPncgPj0gKncpICYmIChzaXplc1tpXS0+aCA+PSAqaCkpIHsKKwkJCQkvKiBNb2RlIHdpdGggYW55IGRpbWVuc2lvbiBzbWFsbGVyIG9yIGVxdWFsIHRoYW4gY3VycmVudCBiZXN0ID8gKi8KKwkJCQlpZiAoKHNpemVzW2ldLT53IDw9IHNpemVzW2Jlc3RdLT53KSB8fCAoc2l6ZXNbaV0tPmggPD0gc2l6ZXNbYmVzdF0tPmgpKSB7CisJCQkJCS8qIE5vdyBjaG9vc2UgdGhlIG1vZGUgdGhhdCBoYXMgbGVzcyBwaXhlbHMgKi8KKwkJCQkJaWYgKChzaXplc1tpXS0+dyAqIHNpemVzW2ldLT5oKSA8PSAoc2l6ZXNbYmVzdF0tPncgKiBzaXplc1tiZXN0XS0+aCkpIHsKKwkJCQkJCWJlc3Q9aTsKKwkJCQkJCXN1cHBvcnRlZCA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHN1cHBvcnRlZCkgeworCQkJKnc9c2l6ZXNbYmVzdF0tPnc7CisJCQkqaD1zaXplc1tiZXN0XS0+aDsKKwkJCSpCaXRzUGVyUGl4ZWwgPSBTRExfY2xvc2VzdF9kZXB0aHNbdGFibGVdW2JdOworCQl9CisJfQorCWlmICggISBzdXBwb3J0ZWQgKSB7CisJCVNETF9TZXRFcnJvcigiTm8gdmlkZW8gbW9kZSBsYXJnZSBlbm91Z2ggZm9yICVkeCVkIiwgKncsICpoKTsKKwl9CisJcmV0dXJuKHN1cHBvcnRlZCk7Cit9CisKKy8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGdvIHNvbWV3aGVyZSBlbHNlIC0tIGxpa2UgU0RMX3N1cmZhY2UuYyAqLworc3RhdGljIHZvaWQgU0RMX0NsZWFyU3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlVaW50MzIgYmxhY2s7CisKKwlibGFjayA9IFNETF9NYXBSR0Ioc3VyZmFjZS0+Zm9ybWF0LCAwLCAwLCAwKTsKKwlTRExfRmlsbFJlY3Qoc3VyZmFjZSwgTlVMTCwgYmxhY2spOworCWlmICgoc3VyZmFjZS0+ZmxhZ3MmU0RMX0hXU1VSRkFDRSkgJiYgKHN1cmZhY2UtPmZsYWdzJlNETF9ET1VCTEVCVUYpKSB7CisJCVNETF9GbGlwKHN1cmZhY2UpOworCQlTRExfRmlsbFJlY3Qoc3VyZmFjZSwgTlVMTCwgYmxhY2spOworCX0KKwlpZiAoc3VyZmFjZS0+ZmxhZ3MmU0RMX0ZVTExTQ1JFRU4pIHsKKwkJU0RMX0ZsaXAoc3VyZmFjZSk7CisJfQorfQorCisvKgorICogQ3JlYXRlIGEgc2hhZG93IHN1cmZhY2Ugc3VpdGFibGUgZm9yIGZvb2xpbmcgdGhlIGFwcC4gOi0pCisgKi8KK3N0YXRpYyB2b2lkIFNETF9DcmVhdGVTaGFkb3dTdXJmYWNlKGludCBkZXB0aCkKK3sKKwlVaW50MzIgUm1hc2ssIEdtYXNrLCBCbWFzazsKKworCS8qIEFsbG9jYXRlIHRoZSBzaGFkb3cgc3VyZmFjZSAqLworCWlmICggZGVwdGggPT0gKFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdCktPkJpdHNQZXJQaXhlbCApIHsKKwkJUm1hc2sgPSAoU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0KS0+Um1hc2s7CisJCUdtYXNrID0gKFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdCktPkdtYXNrOworCQlCbWFzayA9IChTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQpLT5CbWFzazsKKwl9IGVsc2UgeworCQlSbWFzayA9IEdtYXNrID0gQm1hc2sgPSAwOworCX0KKwlTRExfU2hhZG93U3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsCisJCQkJU0RMX1ZpZGVvU3VyZmFjZS0+dywgU0RMX1ZpZGVvU3VyZmFjZS0+aCwKKwkJCQkJCWRlcHRoLCBSbWFzaywgR21hc2ssIEJtYXNrLCAwKTsKKwlpZiAoIFNETF9TaGFkb3dTdXJmYWNlID09IE5VTEwgKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiA4LWJpdCBzaGFkb3cgc3VyZmFjZXMgcmVwb3J0IHRoYXQgdGhleSBoYXZlIGV4Y2x1c2l2ZSBwYWxldHRlICovCisJaWYgKCBTRExfU2hhZG93U3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlICkgeworCQlTRExfU2hhZG93U3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKKwkJaWYgKCBkZXB0aCA9PSAoU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0KS0+Qml0c1BlclBpeGVsICkgeworCQkJU0RMX21lbWNweShTRExfU2hhZG93U3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnMsCisJCQkJU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnMsCisJCQkJU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5uY29sb3JzKgorCQkJCQkJCXNpemVvZihTRExfQ29sb3IpKTsKKwkJfSBlbHNlIHsKKwkJCVNETF9EaXRoZXJDb2xvcnMoCisJCQlTRExfU2hhZG93U3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnMsIGRlcHRoKTsKKwkJfQorCX0KKworCS8qIElmIHRoZSB2aWRlbyBzdXJmYWNlIGlzIHJlc2l6YWJsZSwgdGhlIHNoYWRvdyBzaG91bGQgc2F5IHNvICovCisJaWYgKCAoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkVTSVpBQkxFKSA9PSBTRExfUkVTSVpBQkxFICkgeworCQlTRExfU2hhZG93U3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JFU0laQUJMRTsKKwl9CisJLyogSWYgdGhlIHZpZGVvIHN1cmZhY2UgaGFzIG5vIGZyYW1lLCB0aGUgc2hhZG93IHNob3VsZCBzYXkgc28gKi8KKwlpZiAoIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9OT0ZSQU1FKSA9PSBTRExfTk9GUkFNRSApIHsKKwkJU0RMX1NoYWRvd1N1cmZhY2UtPmZsYWdzIHw9IFNETF9OT0ZSQU1FOworCX0KKwkvKiBJZiB0aGUgdmlkZW8gc3VyZmFjZSBpcyBmdWxsc2NyZWVuLCB0aGUgc2hhZG93IHNob3VsZCBzYXkgc28gKi8KKwlpZiAoIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKKwkJU0RMX1NoYWRvd1N1cmZhY2UtPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworCX0KKwkvKiBJZiB0aGUgdmlkZW8gc3VyZmFjZSBpcyBmbGlwcGFibGUsIHRoZSBzaGFkb3cgc2hvdWxkIHNheSBzbyAqLworCWlmICggKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gU0RMX0RPVUJMRUJVRiApIHsKKwkJU0RMX1NoYWRvd1N1cmZhY2UtPmZsYWdzIHw9IFNETF9ET1VCTEVCVUY7CisJfQorCXJldHVybjsKK30KKworI2lmZGVmIF9fUU5YTlRPX18KKyAgICAjaW5jbHVkZSA8c3lzL25ldXRyaW5vLmg+CisjZW5kaWYgLyogX19RTlhOVE9fXyAqLworCisjaWZkZWYgV0lOMzIKKwlleHRlcm4gaW50IHN5c2V2ZW50c19tb3VzZV9wcmVzc2VkOworI2VuZGlmCisKKy8qCisgKiBTZXQgdGhlIHJlcXVlc3RlZCB2aWRlbyBtb2RlLCBhbGxvY2F0aW5nIGEgc2hhZG93IGJ1ZmZlciBpZiBuZWNlc3NhcnkuCisgKi8KK1NETF9TdXJmYWNlICogU0RMX1NldFZpZGVvTW9kZSAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbywgKnRoaXM7CisJU0RMX1N1cmZhY2UgKnByZXZfbW9kZSwgKm1vZGU7CisJaW50IHZpZGVvX3c7CisJaW50IHZpZGVvX2g7CisJaW50IHZpZGVvX2JwcDsKKwlpbnQgaXNfb3BlbmdsOworCVNETF9HcmFiTW9kZSBzYXZlZF9ncmFiOworCisJI2lmZGVmIFdJTjMyCisJCXN5c2V2ZW50c19tb3VzZV9wcmVzc2VkID0gMDsKKwkjZW5kaWYKKworCS8qIFN0YXJ0IHVwIHRoZSB2aWRlbyBkcml2ZXIsIGlmIG5lY2Vzc2FyeS4uCisJICAgV0FSTklORzogVGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiBwcm90ZWN0ZWQgdGhpcyB3YXkhCisJICovCisJaWYgKCAhIGN1cnJlbnRfdmlkZW8gKSB7CisJCWlmICggU0RMX0luaXQoU0RMX0lOSVRfVklERU98U0RMX0lOSVRfTk9QQVJBQ0hVVEUpIDwgMCApIHsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCX0KKwl0aGlzID0gdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCisJLyogRGVmYXVsdCB0byB0aGUgY3VycmVudCB3aWR0aCBhbmQgaGVpZ2h0ICovCisJaWYgKCB3aWR0aCA9PSAwICkgeworCQl3aWR0aCA9IHZpZGVvLT5pbmZvLmN1cnJlbnRfdzsKKwl9CisJaWYgKCBoZWlnaHQgPT0gMCApIHsKKwkJaGVpZ2h0ID0gdmlkZW8tPmluZm8uY3VycmVudF9oOworCX0KKwkvKiBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IHZpZGVvIGJwcCAqLworCWlmICggYnBwID09IDAgKSB7CisJCWZsYWdzIHw9IFNETF9BTllGT1JNQVQ7CisJCWJwcCA9IFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsOworCX0KKworCS8qIEdldCBhIGdvb2QgdmlkZW8gbW9kZSwgdGhlIGNsb3Nlc3Qgb25lIHBvc3NpYmxlICovCisJdmlkZW9fdyA9IHdpZHRoOworCXZpZGVvX2ggPSBoZWlnaHQ7CisJdmlkZW9fYnBwID0gYnBwOworCWlmICggISBTRExfR2V0VmlkZW9Nb2RlKCZ2aWRlb193LCAmdmlkZW9faCwgJnZpZGVvX2JwcCwgZmxhZ3MpICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogQ2hlY2sgdGhlIHJlcXVlc3RlZCBmbGFncyAqLworCS8qIFRoZXJlJ3Mgbm8gcGFsZXR0ZSBpbiA+IDggYml0cy1wZXItcGl4ZWwgbW9kZSAqLworCWlmICggdmlkZW9fYnBwID4gOCApIHsKKwkJZmxhZ3MgJj0gflNETF9IV1BBTEVUVEU7CisJfQorI2lmIDAKKwlpZiAoIChmbGFncyZTRExfRlVMTFNDUkVFTikgIT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisJCS8qIFRoZXJlJ3Mgbm8gd2luZG93ZWQgZG91YmxlLWJ1ZmZlcmluZyAqLworCQlmbGFncyAmPSB+U0RMX0RPVUJMRUJVRjsKKwl9CisjZW5kaWYKKwlpZiAoIChmbGFncyZTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGICkgeworCQkvKiBVc2UgaGFyZHdhcmUgc3VyZmFjZXMgd2hlbiBkb3VibGUtYnVmZmVyaW5nICovCisJCWZsYWdzIHw9IFNETF9IV1NVUkZBQ0U7CisJfQorCisJaXNfb3BlbmdsID0gKCAoIGZsYWdzICYgU0RMX09QRU5HTCApID09IFNETF9PUEVOR0wgKTsKKwlpZiAoIGlzX29wZW5nbCApIHsKKwkJLyogVGhlc2UgZmxhZ3MgYXJlIGZvciAyRCB2aWRlbyBtb2RlcyBvbmx5ICovCisJCWZsYWdzICY9IH4oU0RMX0hXU1VSRkFDRXxTRExfRE9VQkxFQlVGKTsKKwl9CisKKwkvKiBSZXNldCB0aGUga2V5Ym9hcmQgaGVyZSBzbyBldmVudCBjYWxsYmFja3MgY2FuIHJ1biAqLworCVNETF9SZXNldEtleWJvYXJkKCk7CisJU0RMX1Jlc2V0TW91c2UoKTsKKwlTRExfU2V0TW91c2VSYW5nZSh3aWR0aCwgaGVpZ2h0KTsKKwlTRExfY3Vyc29yc3RhdGUgJj0gfkNVUlNPUl9VU0lOR1NXOworCisJLyogQ2xlYW4gdXAgYW55IHByZXZpb3VzIHZpZGVvIG1vZGUgKi8KKwlpZiAoIFNETF9QdWJsaWNTdXJmYWNlICE9IE5VTEwgKSB7CisJCVNETF9QdWJsaWNTdXJmYWNlID0gTlVMTDsKKwl9CisJaWYgKCBTRExfU2hhZG93U3VyZmFjZSAhPSBOVUxMICkgeworCQlTRExfU3VyZmFjZSAqcmVhZHlfdG9fZ287CisJCXJlYWR5X3RvX2dvID0gU0RMX1NoYWRvd1N1cmZhY2U7CisJCVNETF9TaGFkb3dTdXJmYWNlID0gTlVMTDsKKwkJU0RMX0ZyZWVTdXJmYWNlKHJlYWR5X3RvX2dvKTsKKwl9CisJaWYgKCB2aWRlby0+cGh5c3BhbCApIHsKKwkJU0RMX2ZyZWUodmlkZW8tPnBoeXNwYWwtPmNvbG9ycyk7CisJCVNETF9mcmVlKHZpZGVvLT5waHlzcGFsKTsKKwkJdmlkZW8tPnBoeXNwYWwgPSBOVUxMOworCX0KKwlpZiggdmlkZW8tPmdhbW1hY29scykgeworCQlTRExfZnJlZSh2aWRlby0+Z2FtbWFjb2xzKTsKKwkJdmlkZW8tPmdhbW1hY29scyA9IE5VTEw7CisJfQorCisJLyogU2F2ZSB0aGUgcHJldmlvdXMgZ3JhYiBzdGF0ZSBhbmQgdHVybiBvZmYgZ3JhYiBmb3IgbW9kZSBzd2l0Y2ggKi8KKwlzYXZlZF9ncmFiID0gU0RMX1dNX0dyYWJJbnB1dE9mZigpOworCisJLyogVHJ5IHRvIHNldCB0aGUgdmlkZW8gbW9kZSwgYWxvbmcgd2l0aCBvZmZzZXQgYW5kIGNsaXBwaW5nICovCisJcHJldl9tb2RlID0gU0RMX1ZpZGVvU3VyZmFjZTsKKwlTRExfTG9ja0N1cnNvcigpOworCVNETF9WaWRlb1N1cmZhY2UgPSBOVUxMOwkvKiBJbiBjYXNlIGl0J3MgZnJlZWQgYnkgZHJpdmVyICovCisJbW9kZSA9IHZpZGVvLT5TZXRWaWRlb01vZGUodGhpcywgcHJldl9tb2RlLHZpZGVvX3csdmlkZW9faCx2aWRlb19icHAsZmxhZ3MpOworCWlmICggbW9kZSApIHsgLyogUHJldmVudCByZXNpemUgZXZlbnRzIGZyb20gbW9kZSBjaGFuZ2UgKi8KKyAgICAgICAgICAvKiBCdXQgbm90IG9uIE9TLzIgKi8KKyNpZm5kZWYgX19PUzJfXworCSAgICBTRExfUHJpdmF0ZVJlc2l6ZShtb2RlLT53LCBtb2RlLT5oKTsKKyNlbmRpZgorCisJICAgIC8qIFNhbSAtIElmIHdlIGFza2VkIGZvciBPcGVuR0wgbW9kZSwgYW5kIGRpZG4ndCBnZXQgaXQsIGZhaWwgKi8KKwkgICAgaWYgKCBpc19vcGVuZ2wgJiYgIShtb2RlLT5mbGFncyAmIFNETF9PUEVOR0wpICkgeworCQltb2RlID0gTlVMTDsKKwkJU0RMX1NldEVycm9yKCJPcGVuR0wgbm90IGF2YWlsYWJsZSIpOworCSAgICB9CisJfQorCS8qCisJICogcmNnMTEyOTIwMDAKKwkgKiBJZiB5b3UgdHJ5IHRvIHNldCBhbiBTRExfT1BFTkdMIHN1cmZhY2UsIGFuZCBmYWlsIHRvIGZpbmQgYQorCSAqIG1hdGNoaW5nICB2aXN1YWwsIHRoZW4gdGhlIG5leHQgY2FsbCB0byBTRExfU2V0VmlkZW9Nb2RlKCkKKwkgKiB3aWxsIHNlZ2ZhdWx0LCBzaW5jZSAgd2Ugbm8gbG9uZ2VyIHBvaW50IHRvIGEgZHVtbXkgc3VyZmFjZSwKKwkgKiBidXQgcmF0aGVyIE5VTEwuCisJICogU2FtIDExLzI5LzAwCisJICogV0FSTklORywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcHJldmlvdXMgbW9kZSBoYXNuJ3QKKwkgKiBhbHJlYWR5IGJlZW4gZnJlZWQgYnkgdGhlIHZpZGVvIGRyaXZlci4gIFdoYXQgZG8gd2UgZG8gaW4KKwkgKiB0aGF0IGNhc2U/ICBTaG91bGQgd2UgY2FsbCBTRExfVmlkZW9Jbml0KCkgYWdhaW4/CisJICovCisJU0RMX1ZpZGVvU3VyZmFjZSA9IChtb2RlICE9IE5VTEwpID8gbW9kZSA6IHByZXZfbW9kZTsKKworCWlmICggKG1vZGUgIT0gTlVMTCkgJiYgKCFpc19vcGVuZ2wpICkgeworCQkvKiBTYW5pdHkgY2hlY2sgKi8KKwkJaWYgKCAobW9kZS0+dyA8IHdpZHRoKSB8fCAobW9kZS0+aCA8IGhlaWdodCkgKSB7CisJCQlTRExfU2V0RXJyb3IoIlZpZGVvIG1vZGUgc21hbGxlciB0aGFuIHJlcXVlc3RlZCIpOworCQkJcmV0dXJuKE5VTEwpOworCQl9CisKKwkJLyogSWYgd2UgaGF2ZSBhIHBhbGV0dGl6ZWQgc3VyZmFjZSwgY3JlYXRlIGEgZGVmYXVsdCBwYWxldHRlICovCisJCWlmICggbW9kZS0+Zm9ybWF0LT5wYWxldHRlICkgeworCQkJU0RMX1BpeGVsRm9ybWF0ICp2ZiA9IG1vZGUtPmZvcm1hdDsKKwkJCVNETF9EaXRoZXJDb2xvcnModmYtPnBhbGV0dGUtPmNvbG9ycywgdmYtPkJpdHNQZXJQaXhlbCk7CisJCQl2aWRlby0+U2V0Q29sb3JzKHRoaXMsIDAsIHZmLT5wYWxldHRlLT5uY29sb3JzLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgdmYtPnBhbGV0dGUtPmNvbG9ycyk7CisJCX0KKworCQkvKiBDbGVhciB0aGUgc3VyZmFjZSB0byBibGFjayAqLworCQl2aWRlby0+b2Zmc2V0X3ggPSAwOworCQl2aWRlby0+b2Zmc2V0X3kgPSAwOworCQltb2RlLT5vZmZzZXQgPSAwOworCQlTRExfU2V0Q2xpcFJlY3QobW9kZSwgTlVMTCk7CisJCVNETF9DbGVhclN1cmZhY2UobW9kZSk7CisKKwkJLyogTm93IGFkanVzdCB0aGUgb2Zmc2V0cyB0byBtYXRjaCB0aGUgZGVzaXJlZCBtb2RlICovCisJCXZpZGVvLT5vZmZzZXRfeCA9IChtb2RlLT53LXdpZHRoKS8yOworCQl2aWRlby0+b2Zmc2V0X3kgPSAobW9kZS0+aC1oZWlnaHQpLzI7CisJCW1vZGUtPm9mZnNldCA9IHZpZGVvLT5vZmZzZXRfeSptb2RlLT5waXRjaCArCisJCQkJdmlkZW8tPm9mZnNldF94Km1vZGUtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKKyNpZmRlZiBERUJVR19WSURFTworICBmcHJpbnRmKHN0ZGVyciwKKwkiUmVxdWVzdGVkIG1vZGU6ICVkeCVkeCVkLCBvYnRhaW5lZCBtb2RlICVkeCVkeCVkIChvZmZzZXQgJWQpXG4iLAorCQl3aWR0aCwgaGVpZ2h0LCBicHAsCisJCW1vZGUtPncsIG1vZGUtPmgsIG1vZGUtPmZvcm1hdC0+Qml0c1BlclBpeGVsLCBtb2RlLT5vZmZzZXQpOworI2VuZGlmCisJCW1vZGUtPncgPSB3aWR0aDsKKwkJbW9kZS0+aCA9IGhlaWdodDsKKwkJU0RMX1NldENsaXBSZWN0KG1vZGUsIE5VTEwpOworCX0KKwlTRExfUmVzZXRDdXJzb3IoKTsKKwlTRExfVW5sb2NrQ3Vyc29yKCk7CisKKwkvKiBJZiB3ZSBmYWlsZWQgc2V0dGluZyBhIHZpZGVvIG1vZGUsIHJldHVybiBOVUxMLi4uIChVaCBPaCEpICovCisJaWYgKCBtb2RlID09IE5VTEwgKSB7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBJZiB0aGVyZSBpcyBubyB3aW5kb3cgbWFuYWdlciwgc2V0IHRoZSBTRExfTk9GUkFNRSBmbGFnICovCisJaWYgKCAhIHZpZGVvLT5pbmZvLndtX2F2YWlsYWJsZSApIHsKKwkJbW9kZS0+ZmxhZ3MgfD0gU0RMX05PRlJBTUU7CisJfQorCisJLyogUmVzZXQgdGhlIG1vdXNlIGN1cnNvciBhbmQgZ3JhYiBmb3IgbmV3IHZpZGVvIG1vZGUgKi8KKwlTRExfU2V0Q3Vyc29yKE5VTEwpOworCWlmICggdmlkZW8tPlVwZGF0ZU1vdXNlICkgeworCQl2aWRlby0+VXBkYXRlTW91c2UodGhpcyk7CisJfQorCVNETF9XTV9HcmFiSW5wdXQoc2F2ZWRfZ3JhYik7CisJU0RMX0dldFJlbGF0aXZlTW91c2VTdGF0ZShOVUxMLCBOVUxMKTsgLyogQ2xlYXIgZmlyc3QgbGFyZ2UgZGVsdGEgKi8KKworI2lmIFNETF9WSURFT19PUEVOR0wKKwkvKiBMb2FkIEdMIHN5bWJvbHMgKGJlZm9yZSBNYWtlQ3VycmVudCwgd2hlcmUgd2UgbmVlZCBnbEdldFN0cmluZykuICovCisJaWYgKCBmbGFncyAmIChTRExfT1BFTkdMIHwgU0RMX09QRU5HTEJMSVQpICkgeworCisjaWYgZGVmaW5lZChfX1FOWE5UT19fKSAmJiAoX05UT19WRVJTSU9OIDwgNjMwKQorI2RlZmluZSBfX1NETF9OT0dFVFBST0NBRERSX18KKyNlbGlmIGRlZmluZWQoX19NSU5UX18pCisjZGVmaW5lIF9fU0RMX05PR0VUUFJPQ0FERFJfXworI2VuZGlmCisjaWZkZWYgX19TRExfTk9HRVRQUk9DQUREUl9fCisgICAgI2RlZmluZSBTRExfUFJPQyhyZXQsZnVuYyxwYXJhbXMpIHZpZGVvLT5mdW5jPWZ1bmM7CisjZWxzZQorICAgICNkZWZpbmUgU0RMX1BST0MocmV0LGZ1bmMscGFyYW1zKSBcCisgICAgZG8geyBcCisgICAgICAgIHZpZGVvLT5mdW5jID0gU0RMX0dMX0dldFByb2NBZGRyZXNzKCNmdW5jKTsgXAorICAgICAgICBpZiAoICEgdmlkZW8tPmZ1bmMgKSB7IFwKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgbG9hZCBHTCBmdW5jdGlvbiAlczogJXNcbiIsICNmdW5jLCBTRExfR2V0RXJyb3IoKSk7IFwKKyAgICAgICAgcmV0dXJuKE5VTEwpOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKCAwICk7CisKKyNlbmRpZiAvKiBfX1NETF9OT0dFVFBST0NBRERSX18gKi8KKworI2luY2x1ZGUgIlNETF9nbGZ1bmNzLmgiCisjdW5kZWYgU0RMX1BST0MJCisJfQorI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KKworCS8qIElmIHdlJ3JlIHJ1bm5pbmcgT3BlbkdMLCBtYWtlIHRoZSBjb250ZXh0IGN1cnJlbnQgKi8KKwlpZiAoICh2aWRlby0+c2NyZWVuLT5mbGFncyAmIFNETF9PUEVOR0wpICYmCisJICAgICAgdmlkZW8tPkdMX01ha2VDdXJyZW50ICkgeworCQlpZiAoIHZpZGVvLT5HTF9NYWtlQ3VycmVudCh0aGlzKSA8IDAgKSB7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKwl9CisKKwkvKiBTZXQgdXAgYSBmYWtlIFNETCBzdXJmYWNlIGZvciBPcGVuR0wgImJsaXR0aW5nIiAqLworCWlmICggKGZsYWdzICYgU0RMX09QRU5HTEJMSVQpID09IFNETF9PUEVOR0xCTElUICkgeworCQkvKiBMb2FkIEdMIGZ1bmN0aW9ucyBmb3IgcGVyZm9ybWluZyB0aGUgdGV4dHVyZSB1cGRhdGVzICovCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCisJCS8qIENyZWF0ZSBhIHNvZnR3YXJlIHN1cmZhY2UgZm9yIGJsaXR0aW5nICovCisjaWZkZWYgR0xfVkVSU0lPTl8xXzIKKwkJLyogSWYgdGhlIGltcGxlbWVudGF0aW9uIGVpdGhlciBzdXBwb3J0cyB0aGUgcGFja2VkIHBpeGVscworCQkgICBleHRlbnNpb24sIG9yIGltcGxlbWVudHMgdGhlIGNvcmUgT3BlbkdMIDEuMiBBUEksIGl0IHdpbGwKKwkJICAgc3VwcG9ydCB0aGUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgdGV4dHVyZSBmb3JtYXQuCisJCSAqLworCQlpZiAoIChicHAgPT0gMTYpICYmCisJCSAgICAgKFNETF9zdHJzdHIoKGNvbnN0IGNoYXIgKil2aWRlby0+Z2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUyksICJHTF9FWFRfcGFja2VkX3BpeGVscyIpIHx8CisJCSAgICAgKFNETF9hdG9mKChjb25zdCBjaGFyICopdmlkZW8tPmdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pKSA+PSAxLjJmKSkKKwkJICAgKSB7CisJCQl2aWRlby0+aXNfMzJiaXQgPSAwOworCQkJU0RMX1ZpZGVvU3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKAorCQkJCWZsYWdzLCAKKwkJCQl3aWR0aCwgCisJCQkJaGVpZ2h0LCAgCisJCQkJMTYsCisJCQkJMzEgPDwgMTEsCisJCQkJNjMgPDwgNSwKKwkJCQkzMSwKKwkJCQkwCisJCQkJKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLyogT3BlbkdMIDEuMiAqLworCQl7CisJCQl2aWRlby0+aXNfMzJiaXQgPSAxOworCQkJU0RMX1ZpZGVvU3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKAorCQkJCWZsYWdzLCAKKwkJCQl3aWR0aCwgCisJCQkJaGVpZ2h0LCAKKwkJCQkzMiwgCisjaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgorCQkJCTB4MDAwMDAwRkYsCisJCQkJMHgwMDAwRkYwMCwKKwkJCQkweDAwRkYwMDAwLAorCQkJCTB4RkYwMDAwMDAKKyNlbHNlCisJCQkJMHhGRjAwMDAwMCwKKwkJCQkweDAwRkYwMDAwLAorCQkJCTB4MDAwMEZGMDAsCisJCQkJMHgwMDAwMDBGRgorI2VuZGlmCisJCQkJKTsKKwkJfQorCQlpZiAoICEgU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCQlTRExfVmlkZW9TdXJmYWNlLT5mbGFncyA9IG1vZGUtPmZsYWdzIHwgU0RMX09QRU5HTEJMSVQ7CisKKwkJLyogRnJlZSB0aGUgb3JpZ2luYWwgdmlkZW8gbW9kZSBzdXJmYWNlIChpcyB0aGlzIHNhZmU/KSAqLworCQlTRExfRnJlZVN1cmZhY2UobW9kZSk7CisKKwkJLyogU2V0IHRoZSBzdXJmYWNlIGNvbXBsZXRlbHkgb3BhcXVlICYgd2hpdGUgYnkgZGVmYXVsdCAqLworCQlTRExfbWVtc2V0KCBTRExfVmlkZW9TdXJmYWNlLT5waXhlbHMsIDI1NSwgU0RMX1ZpZGVvU3VyZmFjZS0+aCAqIFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoICk7CisJCXZpZGVvLT5nbEdlblRleHR1cmVzKCAxLCAmdmlkZW8tPnRleHR1cmUgKTsKKwkJdmlkZW8tPmdsQmluZFRleHR1cmUoIEdMX1RFWFRVUkVfMkQsIHZpZGVvLT50ZXh0dXJlICk7CisJCXZpZGVvLT5nbFRleEltYWdlMkQoCisJCQlHTF9URVhUVVJFXzJELAorCQkJMCwKKwkJCXZpZGVvLT5pc18zMmJpdCA/IEdMX1JHQkEgOiBHTF9SR0IsCisJCQkyNTYsCisJCQkyNTYsCisJCQkwLAorCQkJdmlkZW8tPmlzXzMyYml0ID8gR0xfUkdCQSA6IEdMX1JHQiwKKyNpZmRlZiBHTF9WRVJTSU9OXzFfMgorCQkJdmlkZW8tPmlzXzMyYml0ID8gR0xfVU5TSUdORURfQllURSA6IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LAorI2Vsc2UKKwkJCUdMX1VOU0lHTkVEX0JZVEUsCisjZW5kaWYKKwkJCU5VTEwpOworCisJCXZpZGVvLT5VcGRhdGVSZWN0cyA9IFNETF9HTF9VcGRhdGVSZWN0c0xvY2s7CisjZWxzZQorCQlTRExfU2V0RXJyb3IoIlNvbWVib2R5IGZvcmdvdCB0byAjZGVmaW5lIFNETF9WSURFT19PUEVOR0wiKTsKKwkJcmV0dXJuKE5VTEwpOworI2VuZGlmCisJfQorCisJLyogQ3JlYXRlIGEgc2hhZG93IHN1cmZhY2UgaWYgbmVjZXNzYXJ5ICovCisJLyogVGhlcmUgYXJlIHRocmVlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggd2UgY3JlYXRlIGEgc2hhZG93IHN1cmZhY2U6CisJCTEuICBXZSBuZWVkIGEgcGFydGljdWxhciBiaXRzLXBlci1waXhlbCB0aGF0IHdlIGRpZG4ndCBnZXQuCisJCTIuICBXZSBuZWVkIGEgaGFyZHdhcmUgcGFsZXR0ZSBhbmQgZGlkbid0IGdldCBvbmUuCisJCTMuICBXZSBuZWVkIGEgc29mdHdhcmUgc3VyZmFjZSBhbmQgZ290IGEgaGFyZHdhcmUgc3VyZmFjZS4KKwkqLworCWlmICggIShTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9PUEVOR0wpICYmCisJICAgICAoCisJICAgICAoICAhKGZsYWdzJlNETF9BTllGT1JNQVQpICYmCisJCQkoU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gYnBwKSkgfHwKKwkgICAgICggICAoZmxhZ3MmU0RMX0hXUEFMRVRURSkgJiYgCisJCQkJIShTRExfVmlkZW9TdXJmYWNlLT5mbGFncyZTRExfSFdQQUxFVFRFKSkgfHwKKwkJLyogSWYgdGhlIHN1cmZhY2UgaXMgaW4gaGFyZHdhcmUsIHZpZGVvIHdyaXRlcyBhcmUgdmlzaWJsZQorCQkgICBhcyBzb29uIGFzIHRoZXkgYXJlIHBlcmZvcm1lZCwgc28gd2UgbmVlZCB0byBidWZmZXIgdGhlbQorCQkgKi8KKwkgICAgICggICAoKGZsYWdzJlNETF9IV1NVUkZBQ0UpID09IFNETF9TV1NVUkZBQ0UpICYmCisJCQkJKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzJlNETF9IV1NVUkZBQ0UpKSB8fAorCSAgICAgKCAgIChmbGFncyZTRExfRE9VQkxFQlVGKSAmJgorCQkJCShTRExfVmlkZW9TdXJmYWNlLT5mbGFncyZTRExfSFdTVVJGQUNFKSAmJgorCQkJCSEoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MmU0RMX0RPVUJMRUJVRikpCisJICAgICApICkgeworCQlTRExfQ3JlYXRlU2hhZG93U3VyZmFjZShicHApOworCQlpZiAoIFNETF9TaGFkb3dTdXJmYWNlID09IE5VTEwgKSB7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBzaGFkb3cgc3VyZmFjZSIpOworCQkJcmV0dXJuKE5VTEwpOworCQl9CisJCVNETF9QdWJsaWNTdXJmYWNlID0gU0RMX1NoYWRvd1N1cmZhY2U7CisJfSBlbHNlIHsKKwkJU0RMX1B1YmxpY1N1cmZhY2UgPSBTRExfVmlkZW9TdXJmYWNlOworCX0KKwl2aWRlby0+aW5mby52Zm10ID0gU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0OworCXZpZGVvLT5pbmZvLmN1cnJlbnRfdyA9IFNETF9WaWRlb1N1cmZhY2UtPnc7CisJdmlkZW8tPmluZm8uY3VycmVudF9oID0gU0RMX1ZpZGVvU3VyZmFjZS0+aDsKKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKFNETF9QdWJsaWNTdXJmYWNlKTsKK30KKworLyogCisgKiBDb252ZXJ0IGEgc3VyZmFjZSBpbnRvIHRoZSB2aWRlbyBwaXhlbCBmb3JtYXQuCisgKi8KK1NETF9TdXJmYWNlICogU0RMX0Rpc3BsYXlGb3JtYXQgKFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCVVpbnQzMiBmbGFnczsKKworCWlmICggISBTRExfUHVibGljU3VyZmFjZSApIHsKKwkJU0RMX1NldEVycm9yKCJObyB2aWRlbyBtb2RlIGhhcyBiZWVuIHNldCIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCS8qIFNldCB0aGUgZmxhZ3MgYXBwcm9wcmlhdGUgZm9yIGNvcHlpbmcgdG8gZGlzcGxheSBzdXJmYWNlICovCisJaWYgKCgoU0RMX1B1YmxpY1N1cmZhY2UtPmZsYWdzJlNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UpICYmIGN1cnJlbnRfdmlkZW8tPmluZm8uYmxpdF9odykKKwkJZmxhZ3MgPSBTRExfSFdTVVJGQUNFOworCWVsc2UgCisJCWZsYWdzID0gU0RMX1NXU1VSRkFDRTsKKyNpZmRlZiBBVVRPUkxFX0RJU1BMQVlGT1JNQVQKKwlmbGFncyB8PSAoc3VyZmFjZS0+ZmxhZ3MgJiAoU0RMX1NSQ0NPTE9SS0VZfFNETF9TUkNBTFBIQSkpOworCWZsYWdzIHw9IFNETF9STEVBQ0NFTE9LOworI2Vsc2UKKwlmbGFncyB8PSBzdXJmYWNlLT5mbGFncyAmIChTRExfU1JDQ09MT1JLRVl8U0RMX1NSQ0FMUEhBfFNETF9STEVBQ0NFTE9LKTsKKyNlbmRpZgorCXJldHVybihTRExfQ29udmVydFN1cmZhY2Uoc3VyZmFjZSwgU0RMX1B1YmxpY1N1cmZhY2UtPmZvcm1hdCwgZmxhZ3MpKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBzdXJmYWNlIGludG8gYSBmb3JtYXQgdGhhdCdzIHN1aXRhYmxlIGZvciBibGl0dGluZyB0bworICogdGhlIHNjcmVlbiwgYnV0IGluY2x1ZGluZyBhbiBhbHBoYSBjaGFubmVsLgorICovCitTRExfU3VyZmFjZSAqU0RMX0Rpc3BsYXlGb3JtYXRBbHBoYShTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlTRExfUGl4ZWxGb3JtYXQgKnZmOworCVNETF9QaXhlbEZvcm1hdCAqZm9ybWF0OworCVNETF9TdXJmYWNlICpjb252ZXJ0ZWQ7CisJVWludDMyIGZsYWdzOworCS8qIGRlZmF1bHQgdG8gQVJHQjg4ODggKi8KKwlVaW50MzIgYW1hc2sgPSAweGZmMDAwMDAwOworCVVpbnQzMiBybWFzayA9IDB4MDBmZjAwMDA7CisJVWludDMyIGdtYXNrID0gMHgwMDAwZmYwMDsKKwlVaW50MzIgYm1hc2sgPSAweDAwMDAwMGZmOworCisJaWYgKCAhIFNETF9QdWJsaWNTdXJmYWNlICkgeworCQlTRExfU2V0RXJyb3IoIk5vIHZpZGVvIG1vZGUgaGFzIGJlZW4gc2V0Iik7CisJCXJldHVybihOVUxMKTsKKwl9CisJdmYgPSBTRExfUHVibGljU3VyZmFjZS0+Zm9ybWF0OworCisJc3dpdGNoKHZmLT5CeXRlc1BlclBpeGVsKSB7CisJICAgIGNhc2UgMjoKKwkJLyogRm9yIFhHWTVbNTZdNSwgdXNlLCBBWEdZODg4OCwgd2hlcmUge1gsIFl9ID0ge1IsIEJ9LgorCQkgICBGb3IgYW55dGhpbmcgZWxzZSAobGlrZSBBUkdCNDQ0NCkgaXQgZG9lc24ndCBtYXR0ZXIKKwkJICAgc2luY2Ugd2UgaGF2ZSBubyBzcGVjaWFsIGNvZGUgZm9yIGl0IGFueXdheSAqLworCQlpZiAoICh2Zi0+Um1hc2sgPT0gMHgxZikgJiYKKwkJICAgICAodmYtPkJtYXNrID09IDB4ZjgwMCB8fCB2Zi0+Qm1hc2sgPT0gMHg3YzAwKSkgeworCQkJcm1hc2sgPSAweGZmOworCQkJYm1hc2sgPSAweGZmMDAwMDsKKwkJfQorCQlicmVhazsKKworCSAgICBjYXNlIDM6CisJICAgIGNhc2UgNDoKKwkJLyogS2VlcCB0aGUgdmlkZW8gZm9ybWF0LCBhcyBsb25nIGFzIHRoZSBoaWdoIDggYml0cyBhcmUKKwkJICAgdW51c2VkIG9yIGFscGhhICovCisJCWlmICggKHZmLT5SbWFzayA9PSAweGZmKSAmJiAodmYtPkJtYXNrID09IDB4ZmYwMDAwKSApIHsKKwkJCXJtYXNrID0gMHhmZjsKKwkJCWJtYXNrID0gMHhmZjAwMDA7CisJCX0gZWxzZSBpZiAoIHZmLT5SbWFzayA9PSAweEZGMDAgJiYgKHZmLT5CbWFzayA9PSAweEZGMDAwMDAwKSApIHsKKwkJCWFtYXNrID0gMHgwMDAwMDBGRjsKKwkJCXJtYXNrID0gMHgwMDAwRkYwMDsKKwkJCWdtYXNrID0gMHgwMEZGMDAwMDsKKwkJCWJtYXNrID0gMHhGRjAwMDAwMDsKKwkJfQorCQlicmVhazsKKworCSAgICBkZWZhdWx0OgorCQkvKiBXZSBoYXZlIG5vIG90aGVyIG9wdGltaXNlZCBmb3JtYXRzIHJpZ2h0IG5vdy4gV2hlbi9pZiBhIG5ldworCQkgICBvcHRpbWlzZWQgYWxwaGEgZm9ybWF0IGlzIHdyaXR0ZW4sIGFkZCB0aGUgY29udmVydGVyIGhlcmUgKi8KKwkJYnJlYWs7CisJfQorCWZvcm1hdCA9IFNETF9BbGxvY0Zvcm1hdCgzMiwgcm1hc2ssIGdtYXNrLCBibWFzaywgYW1hc2spOworCWZsYWdzID0gU0RMX1B1YmxpY1N1cmZhY2UtPmZsYWdzICYgU0RMX0hXU1VSRkFDRTsKKwlmbGFncyB8PSBzdXJmYWNlLT5mbGFncyAmIChTRExfU1JDQUxQSEEgfCBTRExfUkxFQUNDRUxPSyk7CisJY29udmVydGVkID0gU0RMX0NvbnZlcnRTdXJmYWNlKHN1cmZhY2UsIGZvcm1hdCwgZmxhZ3MpOworCVNETF9GcmVlRm9ybWF0KGZvcm1hdCk7CisJcmV0dXJuKGNvbnZlcnRlZCk7Cit9CisKKy8qCisgKiBVcGRhdGUgYSBzcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBwaHlzaWNhbCBzY3JlZW4KKyAqLwordm9pZCBTRExfVXBkYXRlUmVjdChTRExfU3VyZmFjZSAqc2NyZWVuLCBTaW50MzIgeCwgU2ludDMyIHksIFVpbnQzMiB3LCBVaW50MzIgaCkKK3sKKwlpZiAoIHNjcmVlbiApIHsKKwkJU0RMX1JlY3QgcmVjdDsKKworCQkvKiBQZXJmb3JtIHNvbWUgY2hlY2tpbmcgKi8KKwkJaWYgKCB3ID09IDAgKQorCQkJdyA9IHNjcmVlbi0+dzsKKwkJaWYgKCBoID09IDAgKQorCQkJaCA9IHNjcmVlbi0+aDsKKwkJaWYgKCAoaW50KSh4K3cpID4gc2NyZWVuLT53ICkKKwkJCXJldHVybjsKKwkJaWYgKCAoaW50KSh5K2gpID4gc2NyZWVuLT5oICkKKwkJCXJldHVybjsKKworCQkvKiBGaWxsIHRoZSByZWN0YW5nbGUgKi8KKwkJcmVjdC54ID0gKFNpbnQxNil4OworCQlyZWN0LnkgPSAoU2ludDE2KXk7CisJCXJlY3QudyA9IChVaW50MTYpdzsKKwkJcmVjdC5oID0gKFVpbnQxNiloOworCQlTRExfVXBkYXRlUmVjdHMoc2NyZWVuLCAxLCAmcmVjdCk7CisJfQorfQordm9pZCBTRExfVXBkYXRlUmVjdHMgKFNETF9TdXJmYWNlICpzY3JlZW4sIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCWludCBpOworCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87CisKKwlpZiAoIChzY3JlZW4tPmZsYWdzICYgKFNETF9PUEVOR0wgfCBTRExfT1BFTkdMQkxJVCkpID09IFNETF9PUEVOR0wgKSB7CisJCVNETF9TZXRFcnJvcigiT3BlbkdMIGFjdGl2ZSwgdXNlIFNETF9HTF9Td2FwQnVmZmVycygpIik7CisJCXJldHVybjsKKwl9CisJaWYgKCBzY3JlZW4gPT0gU0RMX1NoYWRvd1N1cmZhY2UgKSB7CisJCS8qIEJsaXQgdGhlIHNoYWRvdyBzdXJmYWNlIHVzaW5nIHNhdmVkIG1hcHBpbmcgKi8KKwkJU0RMX1BhbGV0dGUgKnBhbCA9IHNjcmVlbi0+Zm9ybWF0LT5wYWxldHRlOworCQlTRExfQ29sb3IgKnNhdmVkX2NvbG9ycyA9IE5VTEw7CisJCWlmICggcGFsICYmICEoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFKSApIHsKKwkJCS8qIHNpbXVsYXRlZCA4YnBwLCB1c2UgY29ycmVjdCBwaHlzaWNhbCBwYWxldHRlICovCisJCQlzYXZlZF9jb2xvcnMgPSBwYWwtPmNvbG9yczsKKwkJCWlmICggdmlkZW8tPmdhbW1hY29scyApIHsKKwkJCQkvKiBnYW1tYS1jb3JyZWN0ZWQgcGFsZXR0ZSAqLworCQkJCXBhbC0+Y29sb3JzID0gdmlkZW8tPmdhbW1hY29sczsKKwkJCX0gZWxzZSBpZiAoIHZpZGVvLT5waHlzcGFsICkgeworCQkJCS8qIHBoeXNpY2FsIHBhbGV0dGUgZGlmZmVyZW50IGZyb20gbG9naWNhbCAqLworCQkJCXBhbC0+Y29sb3JzID0gdmlkZW8tPnBoeXNwYWwtPmNvbG9yczsKKwkJCX0KKwkJfQorCQlpZiAoIFNIT1VMRF9EUkFXQ1VSU09SKFNETF9jdXJzb3JzdGF0ZSkgKSB7CisJCQlTRExfTG9ja0N1cnNvcigpOworCQkJU0RMX0RyYXdDdXJzb3IoU0RMX1NoYWRvd1N1cmZhY2UpOworCQkJZm9yICggaT0wOyBpPG51bXJlY3RzOyArK2kgKSB7CisJCQkJU0RMX0xvd2VyQmxpdChTRExfU2hhZG93U3VyZmFjZSwgJnJlY3RzW2ldLCAKKwkJCQkJCVNETF9WaWRlb1N1cmZhY2UsICZyZWN0c1tpXSk7CisJCQl9CisJCQlTRExfRXJhc2VDdXJzb3IoU0RMX1NoYWRvd1N1cmZhY2UpOworCQkJU0RMX1VubG9ja0N1cnNvcigpOworCQl9IGVsc2UgeworCQkJZm9yICggaT0wOyBpPG51bXJlY3RzOyArK2kgKSB7CisJCQkJU0RMX0xvd2VyQmxpdChTRExfU2hhZG93U3VyZmFjZSwgJnJlY3RzW2ldLCAKKwkJCQkJCVNETF9WaWRlb1N1cmZhY2UsICZyZWN0c1tpXSk7CisJCQl9CisJCX0KKwkJaWYgKCBzYXZlZF9jb2xvcnMgKSB7CisJCQlwYWwtPmNvbG9ycyA9IHNhdmVkX2NvbG9yczsKKwkJfQorCisJCS8qIEZhbGwgdGhyb3VnaCB0byB2aWRlbyBzdXJmYWNlIHVwZGF0ZSAqLworCQlzY3JlZW4gPSBTRExfVmlkZW9TdXJmYWNlOworCX0KKwlpZiAoIHNjcmVlbiA9PSBTRExfVmlkZW9TdXJmYWNlICkgeworCQkvKiBVcGRhdGUgdGhlIHZpZGVvIHN1cmZhY2UgKi8KKwkJaWYgKCBzY3JlZW4tPm9mZnNldCApIHsKKwkJCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgeworCQkJCXJlY3RzW2ldLnggKz0gdmlkZW8tPm9mZnNldF94OworCQkJCXJlY3RzW2ldLnkgKz0gdmlkZW8tPm9mZnNldF95OworCQkJfQorCQkJdmlkZW8tPlVwZGF0ZVJlY3RzKHRoaXMsIG51bXJlY3RzLCByZWN0cyk7CisJCQlmb3IgKCBpPTA7IGk8bnVtcmVjdHM7ICsraSApIHsKKwkJCQlyZWN0c1tpXS54IC09IHZpZGVvLT5vZmZzZXRfeDsKKwkJCQlyZWN0c1tpXS55IC09IHZpZGVvLT5vZmZzZXRfeTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZpZGVvLT5VcGRhdGVSZWN0cyh0aGlzLCBudW1yZWN0cywgcmVjdHMpOworCQl9CisJfQorfQorCisvKgorICogUGVyZm9ybXMgaGFyZHdhcmUgZG91YmxlIGJ1ZmZlcmluZywgaWYgcG9zc2libGUsIG9yIGEgZnVsbCB1cGRhdGUgaWYgbm90LgorICovCitpbnQgU0RMX0ZsaXAoU0RMX1N1cmZhY2UgKnNjcmVlbikKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwkvKiBDb3B5IHRoZSBzaGFkb3cgc3VyZmFjZSB0byB0aGUgdmlkZW8gc3VyZmFjZSAqLworCWlmICggc2NyZWVuID09IFNETF9TaGFkb3dTdXJmYWNlICkgeworCQlTRExfUmVjdCByZWN0OworCQlTRExfUGFsZXR0ZSAqcGFsID0gc2NyZWVuLT5mb3JtYXQtPnBhbGV0dGU7CisJCVNETF9Db2xvciAqc2F2ZWRfY29sb3JzID0gTlVMTDsKKwkJaWYgKCBwYWwgJiYgIShTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9IV1BBTEVUVEUpICkgeworCQkJLyogc2ltdWxhdGVkIDhicHAsIHVzZSBjb3JyZWN0IHBoeXNpY2FsIHBhbGV0dGUgKi8KKwkJCXNhdmVkX2NvbG9ycyA9IHBhbC0+Y29sb3JzOworCQkJaWYgKCB2aWRlby0+Z2FtbWFjb2xzICkgeworCQkJCS8qIGdhbW1hLWNvcnJlY3RlZCBwYWxldHRlICovCisJCQkJcGFsLT5jb2xvcnMgPSB2aWRlby0+Z2FtbWFjb2xzOworCQkJfSBlbHNlIGlmICggdmlkZW8tPnBoeXNwYWwgKSB7CisJCQkJLyogcGh5c2ljYWwgcGFsZXR0ZSBkaWZmZXJlbnQgZnJvbSBsb2dpY2FsICovCisJCQkJcGFsLT5jb2xvcnMgPSB2aWRlby0+cGh5c3BhbC0+Y29sb3JzOworCQkJfQorCQl9CisKKwkJcmVjdC54ID0gMDsKKwkJcmVjdC55ID0gMDsKKwkJcmVjdC53ID0gc2NyZWVuLT53OworCQlyZWN0LmggPSBzY3JlZW4tPmg7CisJCWlmICggU0hPVUxEX0RSQVdDVVJTT1IoU0RMX2N1cnNvcnN0YXRlKSApIHsKKwkJCVNETF9Mb2NrQ3Vyc29yKCk7CisJCQlTRExfRHJhd0N1cnNvcihTRExfU2hhZG93U3VyZmFjZSk7CisJCQlTRExfTG93ZXJCbGl0KFNETF9TaGFkb3dTdXJmYWNlLCAmcmVjdCwKKwkJCQkJU0RMX1ZpZGVvU3VyZmFjZSwgJnJlY3QpOworCQkJU0RMX0VyYXNlQ3Vyc29yKFNETF9TaGFkb3dTdXJmYWNlKTsKKwkJCVNETF9VbmxvY2tDdXJzb3IoKTsKKwkJfSBlbHNlIHsKKwkJCVNETF9Mb3dlckJsaXQoU0RMX1NoYWRvd1N1cmZhY2UsICZyZWN0LAorCQkJCQlTRExfVmlkZW9TdXJmYWNlLCAmcmVjdCk7CisJCX0KKwkJaWYgKCBzYXZlZF9jb2xvcnMgKSB7CisJCQlwYWwtPmNvbG9ycyA9IHNhdmVkX2NvbG9yczsKKwkJfQorCisJCS8qIEZhbGwgdGhyb3VnaCB0byB2aWRlbyBzdXJmYWNlIHVwZGF0ZSAqLworCQlzY3JlZW4gPSBTRExfVmlkZW9TdXJmYWNlOworCX0KKwlpZiAoIChzY3JlZW4tPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gU0RMX0RPVUJMRUJVRiApIHsKKwkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CisJCXJldHVybih2aWRlby0+RmxpcEhXU3VyZmFjZSh0aGlzLCBTRExfVmlkZW9TdXJmYWNlKSk7CisJfSBlbHNlIHsKKwkJU0RMX1VwZGF0ZVJlY3Qoc2NyZWVuLCAwLCAwLCAwLCAwKTsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZCBTZXRQYWxldHRlX2xvZ2ljYWwoU0RMX1N1cmZhY2UgKnNjcmVlbiwgU0RMX0NvbG9yICpjb2xvcnMsCisJCQkgICAgICAgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzKQoreworCVNETF9QYWxldHRlICpwYWwgPSBzY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZTsKKwlTRExfUGFsZXR0ZSAqdmlkcGFsOworCisJaWYgKCBjb2xvcnMgIT0gKHBhbC0+Y29sb3JzICsgZmlyc3Rjb2xvcikgKSB7CisJCVNETF9tZW1jcHkocGFsLT5jb2xvcnMgKyBmaXJzdGNvbG9yLCBjb2xvcnMsCisJCSAgICAgICBuY29sb3JzICogc2l6ZW9mKCpjb2xvcnMpKTsKKwl9CisKKwlpZiAoIGN1cnJlbnRfdmlkZW8gJiYgU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJdmlkcGFsID0gU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlOworCQlpZiAoIChzY3JlZW4gPT0gU0RMX1NoYWRvd1N1cmZhY2UpICYmIHZpZHBhbCApIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgc2hhZG93IHN1cmZhY2UsIGFuZCB0aGUgcGh5c2ljYWwKKwkJCSAqIGZyYW1lYnVmZmVyIGlzIGFsc28gaW5kZXhlZC4gUHJvcGFnYXRlIHRoZQorCQkJICogY2hhbmdlcyB0byBpdHMgbG9naWNhbCBwYWxldHRlIHNvIHRoYXQKKwkJCSAqIHVwZGF0ZXMgYXJlIGFsd2F5cyBpZGVudGl0eSBibGl0cworCQkJICovCisJCQlTRExfbWVtY3B5KHZpZHBhbC0+Y29sb3JzICsgZmlyc3Rjb2xvciwgY29sb3JzLAorCQkJICAgICAgIG5jb2xvcnMgKiBzaXplb2YoKmNvbG9ycykpOworCQl9CisJfQorCVNETF9Gb3JtYXRDaGFuZ2VkKHNjcmVlbik7Cit9CisKK3N0YXRpYyBpbnQgU2V0UGFsZXR0ZV9waHlzaWNhbChTRExfU3VyZmFjZSAqc2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Db2xvciAqY29sb3JzLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMpCit7CisJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJaW50IGdvdGFsbCA9IDE7CisKKwlpZiAoIHZpZGVvLT5waHlzcGFsICkgeworCQkvKiBXZSBuZWVkIHRvIGNvcHkgdGhlIG5ldyBjb2xvcnMsIHNpbmNlIHdlIGhhdmVuJ3QKKwkJICogYWxyZWFkeSBkb25lIHRoZSBjb3B5IGluIHRoZSBsb2dpY2FsIHNldCBhYm92ZS4KKwkJICovCisJCVNETF9tZW1jcHkodmlkZW8tPnBoeXNwYWwtPmNvbG9ycyArIGZpcnN0Y29sb3IsCisJCSAgICAgICBjb2xvcnMsIG5jb2xvcnMgKiBzaXplb2YoKmNvbG9ycykpOworCX0KKwlpZiAoIHNjcmVlbiA9PSBTRExfU2hhZG93U3VyZmFjZSApIHsKKwkJaWYgKCBTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9IV1BBTEVUVEUgKSB7CisJCQkvKgorCQkJICogVGhlIHJlYWwgc2NyZWVuIGlzIGFsc28gaW5kZXhlZCAtIHNldCBpdHMgcGh5c2ljYWwKKwkJCSAqIHBhbGV0dGUuIFRoZSBwaHlzaWNhbCBwYWxldHRlIGRvZXMgbm90IGluY2x1ZGUgdGhlCisJCQkgKiBnYW1tYSBtb2RpZmljYXRpb24sIHdlIGFwcGx5IGl0IGRpcmVjdGx5IGluc3RlYWQsCisJCQkgKiBidXQgdGhpcyBvbmx5IGhhcHBlbnMgaWYgd2UgaGF2ZSBoYXJkd2FyZSBwYWxldHRlLgorCQkJICovCisJCQlzY3JlZW4gPSBTRExfVmlkZW9TdXJmYWNlOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSB2aWRlbyBzdXJmYWNlIGlzIG5vdCBpbmRleGVkIC0gaW52YWxpZGF0ZSBhbnkKKwkJCSAqIGFjdGl2ZSBzaGFkb3ctdG8tdmlkZW8gYmxpdCBtYXBwaW5ncy4KKwkJCSAqLworCQkJaWYgKCBzY3JlZW4tPm1hcC0+ZHN0ID09IFNETF9WaWRlb1N1cmZhY2UgKSB7CisJCQkJU0RMX0ludmFsaWRhdGVNYXAoc2NyZWVuLT5tYXApOworCQkJfQorCQkJaWYgKCB2aWRlby0+Z2FtbWEgKSB7CisJCQkJaWYoICEgdmlkZW8tPmdhbW1hY29scyApIHsKKwkJCQkJU0RMX1BhbGV0dGUgKnBwID0gdmlkZW8tPnBoeXNwYWw7CisJCQkJCWlmKCFwcCkKKwkJCQkJCXBwID0gc2NyZWVuLT5mb3JtYXQtPnBhbGV0dGU7CisJCQkJCXZpZGVvLT5nYW1tYWNvbHMgPSBTRExfbWFsbG9jKHBwLT5uY29sb3JzCisJCQkJCQkJICAqIHNpemVvZihTRExfQ29sb3IpKTsKKwkJCQkJU0RMX0FwcGx5R2FtbWEodmlkZW8tPmdhbW1hLAorCQkJCQkJICAgICAgIHBwLT5jb2xvcnMsCisJCQkJCQkgICAgICAgdmlkZW8tPmdhbW1hY29scywKKwkJCQkJCSAgICAgICBwcC0+bmNvbG9ycyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU0RMX0FwcGx5R2FtbWEodmlkZW8tPmdhbW1hLCBjb2xvcnMsCisJCQkJCQkgICAgICAgdmlkZW8tPmdhbW1hY29scworCQkJCQkJICAgICAgICsgZmlyc3Rjb2xvciwKKwkJCQkJCSAgICAgICBuY29sb3JzKTsKKwkJCQl9CisJCQl9CisJCQlTRExfVXBkYXRlUmVjdChzY3JlZW4sIDAsIDAsIDAsIDApOworCQl9CisJfQorCisJaWYgKCBzY3JlZW4gPT0gU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJU0RMX0NvbG9yIGdjb2xvcnNbMjU2XTsKKworCQlpZiAoIHZpZGVvLT5nYW1tYSApIHsKKwkJCVNETF9BcHBseUdhbW1hKHZpZGVvLT5nYW1tYSwgY29sb3JzLCBnY29sb3JzLCBuY29sb3JzKTsKKwkJCWNvbG9ycyA9IGdjb2xvcnM7CisJCX0KKwkJZ290YWxsID0gdmlkZW8tPlNldENvbG9ycyh2aWRlbywgZmlyc3Rjb2xvciwgbmNvbG9ycywgY29sb3JzKTsKKwkJaWYgKCAhIGdvdGFsbCApIHsKKwkJCS8qIFRoZSB2aWRlbyBmbGFncyBzaG91bGRuJ3QgaGF2ZSBTRExfSFdQQUxFVFRFLCBhbmQKKwkJCSAgIHRoZSB2aWRlbyBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIGNvcHlpbmcgYmFjayB0aGUKKwkJCSAgIGNvcnJlY3QgY29sb3JzIGludG8gdGhlIHZpZGVvIHN1cmZhY2UgcGFsZXR0ZS4KKwkJCSovCisJCQk7CisJCX0KKwkJU0RMX0N1cnNvclBhbGV0dGVDaGFuZ2VkKCk7CisJfQorCXJldHVybiBnb3RhbGw7Cit9CisKKy8qCisgKiBTZXQgdGhlIHBoeXNpY2FsIGFuZC9vciBsb2dpY2FsIGNvbG9ybWFwIG9mIGEgc3VyZmFjZToKKyAqIE9ubHkgdGhlIHNjcmVlbiBoYXMgYSBwaHlzaWNhbCBjb2xvcm1hcC4gSXQgZGV0ZXJtaW5lcyB3aGF0IGlzIGFjdHVhbGx5CisgKiBzZW50IHRvIHRoZSBkaXNwbGF5LgorICogVGhlIGxvZ2ljYWwgY29sb3JtYXAgaXMgdXNlZCB0byBtYXAgYmxpdHMgdG8vZnJvbSB0aGUgc3VyZmFjZS4KKyAqICd3aGljaCcgaXMgb25lIG9yIGJvdGggb2YgU0RMX0xPR1BBTCwgU0RMX1BIWVNQQUwKKyAqCisgKiBSZXR1cm4gbm9uemVybyBpZiBhbGwgY29sb3VycyB3ZXJlIHNldCBhcyByZXF1ZXN0ZWQsIG9yIDAgb3RoZXJ3aXNlLgorICovCitpbnQgU0RMX1NldFBhbGV0dGUoU0RMX1N1cmZhY2UgKnNjcmVlbiwgaW50IHdoaWNoLAorCQkgICBTRExfQ29sb3IgKmNvbG9ycywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzKQoreworCVNETF9QYWxldHRlICpwYWw7CisJaW50IGdvdGFsbDsKKwlpbnQgcGFsc2l6ZTsKKworCWlmICggIXNjcmVlbiApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICggIWN1cnJlbnRfdmlkZW8gfHwgc2NyZWVuICE9IFNETF9QdWJsaWNTdXJmYWNlICkgeworCQkvKiBvbmx5IHNjcmVlbnMgaGF2ZSBwaHlzaWNhbCBwYWxldHRlcyAqLworCQl3aGljaCAmPSB+U0RMX1BIWVNQQUw7CisJfSBlbHNlIGlmICggKHNjcmVlbi0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFKSAhPSBTRExfSFdQQUxFVFRFICkgeworCQkvKiBoYXJkd2FyZSBwYWxldHRlcyByZXF1aXJlZCBmb3Igc3BsaXQgY29sb3JtYXBzICovCisJCXdoaWNoIHw9IFNETF9QSFlTUEFMIHwgU0RMX0xPR1BBTDsKKwl9CisKKwkvKiBWZXJpZnkgdGhlIHBhcmFtZXRlcnMgKi8KKwlwYWwgPSBzY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZTsKKwlpZiggIXBhbCApIHsKKwkJcmV0dXJuIDA7CS8qIG5vdCBhIHBhbGV0dGl6ZWQgc3VyZmFjZSAqLworCX0KKwlnb3RhbGwgPSAxOworCXBhbHNpemUgPSAxIDw8IHNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisJaWYgKCBuY29sb3JzID4gKHBhbHNpemUgLSBmaXJzdGNvbG9yKSApIHsKKwkJbmNvbG9ycyA9IChwYWxzaXplIC0gZmlyc3Rjb2xvcik7CisJCWdvdGFsbCA9IDA7CisJfQorCisJaWYgKCB3aGljaCAmIFNETF9MT0dQQUwgKSB7CisJCS8qCisJCSAqIExvZ2ljYWwgcGFsZXR0ZSBjaGFuZ2U6IFRoZSBhY3R1YWwgc2NyZWVuIGlzbid0IGFmZmVjdGVkLAorCQkgKiBidXQgdGhlIGludGVybmFsIGNvbG9ybWFwIGlzIGFsdGVyZWQgc28gdGhhdCB0aGUKKwkJICogaW50ZXJwcmV0YXRpb24gb2YgdGhlIHBpeGVsIHZhbHVlcyAoZm9yIGJsaXRzIGV0YykgaXMKKwkJICogY2hhbmdlZC4KKwkJICovCisJCVNldFBhbGV0dGVfbG9naWNhbChzY3JlZW4sIGNvbG9ycywgZmlyc3Rjb2xvciwgbmNvbG9ycyk7CisJfQorCWlmICggd2hpY2ggJiBTRExfUEhZU1BBTCApIHsKKwkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJCS8qCisJCSAqIFBoeXNpY2FsIHBhbGV0dGUgY2hhbmdlOiBUaGlzIGRvZXNuJ3QgYWZmZWN0IHRoZQorCQkgKiBwcm9ncmFtJ3MgaWRlYSBvZiB3aGF0IHRoZSBzY3JlZW4gbG9va3MgbGlrZSwgYnV0IGNoYW5nZXMKKwkJICogaXRzIGFjdHVhbCBhcHBlYXJhbmNlLgorCQkgKi8KKwkJaWYgKCAhdmlkZW8tPnBoeXNwYWwgJiYgISh3aGljaCAmIFNETF9MT0dQQUwpICkgeworCQkJLyogTGF6eSBwaHlzaWNhbCBwYWxldHRlIGFsbG9jYXRpb24gKi8KKwkJCWludCBzaXplOworCQkJU0RMX1BhbGV0dGUgKnBwID0gU0RMX21hbGxvYyhzaXplb2YoKnBwKSk7CisJCQlpZiAoICFwcCApIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXZpZGVvLT5waHlzcGFsID0gcHA7CisJCQlwcC0+bmNvbG9ycyA9IHBhbC0+bmNvbG9yczsKKwkJCXNpemUgPSBwcC0+bmNvbG9ycyAqIHNpemVvZihTRExfQ29sb3IpOworCQkJcHAtPmNvbG9ycyA9IFNETF9tYWxsb2Moc2l6ZSk7CisJCQlpZiAoICFwcC0+Y29sb3JzICkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJU0RMX21lbWNweShwcC0+Y29sb3JzLCBwYWwtPmNvbG9ycywgc2l6ZSk7CisJCX0KKwkJaWYgKCAhIFNldFBhbGV0dGVfcGh5c2ljYWwoc2NyZWVuLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnMsIGZpcnN0Y29sb3IsIG5jb2xvcnMpICkgeworCQkJZ290YWxsID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gZ290YWxsOworfQorCitpbnQgU0RMX1NldENvbG9ycyhTRExfU3VyZmFjZSAqc2NyZWVuLCBTRExfQ29sb3IgKmNvbG9ycywgaW50IGZpcnN0Y29sb3IsCisJCSAgaW50IG5jb2xvcnMpCit7CisJcmV0dXJuIFNETF9TZXRQYWxldHRlKHNjcmVlbiwgU0RMX0xPR1BBTCB8IFNETF9QSFlTUEFMLAorCQkJICAgICAgY29sb3JzLCBmaXJzdGNvbG9yLCBuY29sb3JzKTsKK30KKworLyoKKyAqIENsZWFuIHVwIHRoZSB2aWRlbyBzdWJzeXN0ZW0KKyAqLwordm9pZCBTRExfVmlkZW9RdWl0ICh2b2lkKQoreworCVNETF9TdXJmYWNlICpyZWFkeV90b19nbzsKKworCWlmICggY3VycmVudF92aWRlbyApIHsKKwkJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCisJCS8qIEhhbHQgZXZlbnQgcHJvY2Vzc2luZyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZSAqLworCQlTRExfU3RvcEV2ZW50TG9vcCgpOworCisJCS8qIENsZWFuIHVwIGFsbG9jYXRlZCB3aW5kb3cgbWFuYWdlciBpdGVtcyAqLworCQlpZiAoIFNETF9QdWJsaWNTdXJmYWNlICkgeworCQkJU0RMX1B1YmxpY1N1cmZhY2UgPSBOVUxMOworCQl9CisJCVNETF9DdXJzb3JRdWl0KCk7CisKKwkJLyogSnVzdCBpbiBjYXNlLi4uICovCisJCVNETF9XTV9HcmFiSW5wdXRPZmYoKTsKKworCQkvKiBDbGVhbiB1cCB0aGUgc3lzdGVtIHZpZGVvICovCisJCXZpZGVvLT5WaWRlb1F1aXQodGhpcyk7CisKKwkJLyogRnJlZSBhbnkgbGluZ2VyaW5nIHN1cmZhY2VzICovCisJCXJlYWR5X3RvX2dvID0gU0RMX1NoYWRvd1N1cmZhY2U7CisJCVNETF9TaGFkb3dTdXJmYWNlID0gTlVMTDsKKwkJU0RMX0ZyZWVTdXJmYWNlKHJlYWR5X3RvX2dvKTsKKwkJaWYgKCBTRExfVmlkZW9TdXJmYWNlICE9IE5VTEwgKSB7CisJCQlyZWFkeV90b19nbyA9IFNETF9WaWRlb1N1cmZhY2U7CisJCQlTRExfVmlkZW9TdXJmYWNlID0gTlVMTDsKKwkJCVNETF9GcmVlU3VyZmFjZShyZWFkeV90b19nbyk7CisJCX0KKwkJU0RMX1B1YmxpY1N1cmZhY2UgPSBOVUxMOworCisJCS8qIENsZWFuIHVwIG1pc2NlbGxhbmVvdXMgbWVtb3J5ICovCisJCWlmICggdmlkZW8tPnBoeXNwYWwgKSB7CisJCQlTRExfZnJlZSh2aWRlby0+cGh5c3BhbC0+Y29sb3JzKTsKKwkJCVNETF9mcmVlKHZpZGVvLT5waHlzcGFsKTsKKwkJCXZpZGVvLT5waHlzcGFsID0gTlVMTDsKKwkJfQorCQlpZiAoIHZpZGVvLT5nYW1tYWNvbHMgKSB7CisJCQlTRExfZnJlZSh2aWRlby0+Z2FtbWFjb2xzKTsKKwkJCXZpZGVvLT5nYW1tYWNvbHMgPSBOVUxMOworCQl9CisJCWlmICggdmlkZW8tPmdhbW1hICkgeworCQkJU0RMX2ZyZWUodmlkZW8tPmdhbW1hKTsKKwkJCXZpZGVvLT5nYW1tYSA9IE5VTEw7CisJCX0KKwkJaWYgKCB2aWRlby0+d21fdGl0bGUgIT0gTlVMTCApIHsKKwkJCVNETF9mcmVlKHZpZGVvLT53bV90aXRsZSk7CisJCQl2aWRlby0+d21fdGl0bGUgPSBOVUxMOworCQl9CisJCWlmICggdmlkZW8tPndtX2ljb24gIT0gTlVMTCApIHsKKwkJCVNETF9mcmVlKHZpZGVvLT53bV9pY29uKTsKKwkJCXZpZGVvLT53bV9pY29uID0gTlVMTDsKKwkJfQorCisJCS8qIEZpbmlzaCBjbGVhbmluZyB1cCB2aWRlbyBzdWJzeXN0ZW0gKi8KKwkJdmlkZW8tPmZyZWUodGhpcyk7CisJCWN1cnJlbnRfdmlkZW8gPSBOVUxMOworCX0KKwlyZXR1cm47Cit9CisKKy8qIExvYWQgdGhlIEdMIGRyaXZlciBsaWJyYXJ5ICovCitpbnQgU0RMX0dMX0xvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpCit7CisJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gY3VycmVudF92aWRlbzsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gLTE7CisJaWYgKCB2aWRlbyA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlZpZGVvIHN1YnN5c3RlbSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKTsKKwl9IGVsc2UgeworCQlpZiAoIHZpZGVvLT5HTF9Mb2FkTGlicmFyeSApIHsKKwkJCXJldHZhbCA9IHZpZGVvLT5HTF9Mb2FkTGlicmFyeSh0aGlzLCBwYXRoKTsKKwkJfSBlbHNlIHsKKwkJCVNETF9TZXRFcnJvcigiTm8gZHluYW1pYyBHTCBzdXBwb3J0IGluIHZpZGVvIGRyaXZlciIpOworCQl9CisJfQorCXJldHVybihyZXR2YWwpOworfQorCit2b2lkICpTRExfR0xfR2V0UHJvY0FkZHJlc3MoY29uc3QgY2hhciogcHJvYykKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOworCXZvaWQgKmZ1bmM7CisKKwlmdW5jID0gTlVMTDsKKwlpZiAoIHZpZGVvLT5HTF9HZXRQcm9jQWRkcmVzcyApIHsKKwkJaWYgKCB2aWRlby0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgKSB7CisJCQlmdW5jID0gdmlkZW8tPkdMX0dldFByb2NBZGRyZXNzKHRoaXMsIHByb2MpOworCQl9IGVsc2UgeworCQkJU0RMX1NldEVycm9yKCJObyBHTCBkcml2ZXIgaGFzIGJlZW4gbG9hZGVkIik7CisJCX0KKwl9IGVsc2UgeworCQlTRExfU2V0RXJyb3IoIk5vIGR5bmFtaWMgR0wgc3VwcG9ydCBpbiB2aWRlbyBkcml2ZXIiKTsKKwl9CisJcmV0dXJuIGZ1bmM7Cit9CisKKy8qIFNldCB0aGUgc3BlY2lmaWVkIEdMIGF0dHJpYnV0ZSBmb3Igc2V0dGluZyB1cCBhIEdMIHZpZGVvIG1vZGUgKi8KK2ludCBTRExfR0xfU2V0QXR0cmlidXRlKCBTRExfR0xhdHRyIGF0dHIsIGludCB2YWx1ZSApCit7CisJaW50IHJldHZhbDsKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKworCXJldHZhbCA9IDA7CisJc3dpdGNoIChhdHRyKSB7CisJCWNhc2UgU0RMX0dMX1JFRF9TSVpFOgorCQkJdmlkZW8tPmdsX2NvbmZpZy5yZWRfc2l6ZSA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX0dMX0dSRUVOX1NJWkU6CisJCQl2aWRlby0+Z2xfY29uZmlnLmdyZWVuX3NpemUgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9CTFVFX1NJWkU6CisJCQl2aWRlby0+Z2xfY29uZmlnLmJsdWVfc2l6ZSA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX0dMX0FMUEhBX1NJWkU6CisJCQl2aWRlby0+Z2xfY29uZmlnLmFscGhhX3NpemUgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9ET1VCTEVCVUZGRVI6CisJCQl2aWRlby0+Z2xfY29uZmlnLmRvdWJsZV9idWZmZXIgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9CVUZGRVJfU0laRToKKwkJCXZpZGVvLT5nbF9jb25maWcuYnVmZmVyX3NpemUgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9ERVBUSF9TSVpFOgorCQkJdmlkZW8tPmdsX2NvbmZpZy5kZXB0aF9zaXplID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfU1RFTkNJTF9TSVpFOgorCQkJdmlkZW8tPmdsX2NvbmZpZy5zdGVuY2lsX3NpemUgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9BQ0NVTV9SRURfU0laRToKKwkJCXZpZGVvLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemUgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9BQ0NVTV9HUkVFTl9TSVpFOgorCQkJdmlkZW8tPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfQUNDVU1fQkxVRV9TSVpFOgorCQkJdmlkZW8tPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemUgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9BQ0NVTV9BTFBIQV9TSVpFOgorCQkJdmlkZW8tPmdsX2NvbmZpZy5hY2N1bV9hbHBoYV9zaXplID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfU1RFUkVPOgorCQkJdmlkZW8tPmdsX2NvbmZpZy5zdGVyZW8gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9NVUxUSVNBTVBMRUJVRkZFUlM6CisJCQl2aWRlby0+Z2xfY29uZmlnLm11bHRpc2FtcGxlYnVmZmVycyA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX0dMX01VTFRJU0FNUExFU0FNUExFUzoKKwkJCXZpZGVvLT5nbF9jb25maWcubXVsdGlzYW1wbGVzYW1wbGVzID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfQUNDRUxFUkFURURfVklTVUFMOgorCQkJdmlkZW8tPmdsX2NvbmZpZy5hY2NlbGVyYXRlZCA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX0dMX1NXQVBfQ09OVFJPTDoKKwkJCXZpZGVvLT5nbF9jb25maWcuc3dhcF9jb250cm9sID0gdmFsdWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNETF9TZXRFcnJvcigiVW5rbm93biBPcGVuR0wgYXR0cmlidXRlIik7CisJCQlyZXR2YWwgPSAtMTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyogUmV0cmlldmUgYW4gYXR0cmlidXRlIHZhbHVlIGZyb20gdGhlIHdpbmRvd2luZyBzeXN0ZW0uICovCitpbnQgU0RMX0dMX0dldEF0dHJpYnV0ZShTRExfR0xhdHRyIGF0dHIsIGludCogdmFsdWUpCit7CisJaW50IHJldHZhbCA9IC0xOworCVNETF9WaWRlb0RldmljZSogdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCVNETF9WaWRlb0RldmljZSogdGhpcyA9IGN1cnJlbnRfdmlkZW87CisKKwlpZiAoIHZpZGVvLT5HTF9HZXRBdHRyaWJ1dGUgKSB7CisJCXJldHZhbCA9IHRoaXMtPkdMX0dldEF0dHJpYnV0ZSh0aGlzLCBhdHRyLCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJKnZhbHVlID0gMDsKKwkJU0RMX1NldEVycm9yKCJHTF9HZXRBdHRyaWJ1dGUgbm90IHN1cHBvcnRlZCIpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBQZXJmb3JtIGEgR0wgYnVmZmVyIHN3YXAgb24gdGhlIGN1cnJlbnQgR0wgY29udGV4dCAqLwordm9pZCBTRExfR0xfU3dhcEJ1ZmZlcnModm9pZCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOworCisJaWYgKCB2aWRlby0+c2NyZWVuLT5mbGFncyAmIFNETF9PUEVOR0wgKSB7CisJCXZpZGVvLT5HTF9Td2FwQnVmZmVycyh0aGlzKTsKKwl9IGVsc2UgeworCQlTRExfU2V0RXJyb3IoIk9wZW5HTCB2aWRlbyBtb2RlIGhhcyBub3QgYmVlbiBzZXQiKTsKKwl9Cit9CisKKy8qIFVwZGF0ZSByZWN0cyB3aXRoIGxvY2tpbmcgKi8KK3ZvaWQgU0RMX0dMX1VwZGF0ZVJlY3RzTG9jayhTRExfVmlkZW9EZXZpY2UqIHRoaXMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCVNETF9HTF9Mb2NrKCk7CisgCVNETF9HTF9VcGRhdGVSZWN0cyhudW1yZWN0cywgcmVjdHMpOworCVNETF9HTF9VbmxvY2soKTsKK30KKworLyogVXBkYXRlIHJlY3RzIHdpdGhvdXQgc3RhdGUgc2V0dGluZyBhbmQgY2hhbmdpbmcgKHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGl0KSAqLwordm9pZCBTRExfR0xfVXBkYXRlUmVjdHMoaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87CisJU0RMX1JlY3QgdXBkYXRlLCB0bXA7CisJaW50IHgsIHksIGk7CisKKwlmb3IgKCBpID0gMDsgaSA8IG51bXJlY3RzOyBpKysgKQorCXsKKwkJdG1wLnkgPSByZWN0c1tpXS55OworCQl0bXAuaCA9IHJlY3RzW2ldLmg7CisJCWZvciAoIHkgPSAwOyB5IDw9IHJlY3RzW2ldLmggLyAyNTY7IHkrKyApCisJCXsKKwkJCXRtcC54ID0gcmVjdHNbaV0ueDsKKwkJCXRtcC53ID0gcmVjdHNbaV0udzsKKwkJCWZvciAoIHggPSAwOyB4IDw9IHJlY3RzW2ldLncgLyAyNTY7IHgrKyApCisJCQl7CisJCQkJdXBkYXRlLnggPSB0bXAueDsKKwkJCQl1cGRhdGUueSA9IHRtcC55OworCQkJCXVwZGF0ZS53ID0gdG1wLnc7CisJCQkJdXBkYXRlLmggPSB0bXAuaDsKKworCQkJCWlmICggdXBkYXRlLncgPiAyNTYgKQorCQkJCQl1cGRhdGUudyA9IDI1NjsKKworCQkJCWlmICggdXBkYXRlLmggPiAyNTYgKQorCQkJCQl1cGRhdGUuaCA9IDI1NjsKKwkJCQorCQkJCXRoaXMtPmdsRmx1c2goKTsKKwkJCQl0aGlzLT5nbFRleFN1YkltYWdlMkQoIAorCQkJCQlHTF9URVhUVVJFXzJELCAKKwkJCQkJMCwgCisJCQkJCTAsIAorCQkJCQkwLCAKKwkJCQkJdXBkYXRlLncsIAorCQkJCQl1cGRhdGUuaCwgCisJCQkJCXRoaXMtPmlzXzMyYml0PyBHTF9SR0JBIDogR0xfUkdCLAorI2lmZGVmIEdMX1ZFUlNJT05fMV8yCisJCQkJCXRoaXMtPmlzXzMyYml0ID8gR0xfVU5TSUdORURfQllURSA6IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LAorI2Vsc2UKKwkJCQkJR0xfVU5TSUdORURfQllURSwKKyNlbmRpZgorCQkJCQkoVWludDggKil0aGlzLT5zY3JlZW4tPnBpeGVscyArIAorCQkJCQkJdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgKiB1cGRhdGUueCArIAorCQkJCQkJdXBkYXRlLnkgKiB0aGlzLT5zY3JlZW4tPnBpdGNoICk7CisJCisJCQkJdGhpcy0+Z2xGbHVzaCgpOworCQkJCS8qCisJCQkJKiBOb3RlIHRoZSBwYXJlbnMgYXJvdW5kIHRoZSBmdW5jdGlvbiBuYW1lOgorCQkJCSogVGhpcyBpcyBiZWNhdXNlIHNvbWUgT3BlbkdMIGltcGxlbWVudGF0aW9ucyBkZWZpbmUgZ2xUZXhDb29yZCBldGMgCisJCQkJKiBhcyBtYWNyb3MsIGFuZCB3ZSBkb24ndCB3YW50IHRoZW0gZXhwYW5kZWQgaGVyZS4KKwkJCQkqLworCQkJCXRoaXMtPmdsQmVnaW4oR0xfVFJJQU5HTEVfU1RSSVApOworCQkJCQkodGhpcy0+Z2xUZXhDb29yZDJmKSggMC4wLCAwLjAgKTsJCisJCQkJCSh0aGlzLT5nbFZlcnRleDJpKSggdXBkYXRlLngsIHVwZGF0ZS55ICk7CisJCQkJCSh0aGlzLT5nbFRleENvb3JkMmYpKCAoZmxvYXQpKHVwZGF0ZS53IC8gMjU2LjApLCAwLjAgKTsJCisJCQkJCSh0aGlzLT5nbFZlcnRleDJpKSggdXBkYXRlLnggKyB1cGRhdGUudywgdXBkYXRlLnkgKTsKKwkJCQkJKHRoaXMtPmdsVGV4Q29vcmQyZikoIDAuMCwgKGZsb2F0KSh1cGRhdGUuaCAvIDI1Ni4wKSApOworCQkJCQkodGhpcy0+Z2xWZXJ0ZXgyaSkoIHVwZGF0ZS54LCB1cGRhdGUueSArIHVwZGF0ZS5oICk7CisJCQkJCSh0aGlzLT5nbFRleENvb3JkMmYpKCAoZmxvYXQpKHVwZGF0ZS53IC8gMjU2LjApLCAoZmxvYXQpKHVwZGF0ZS5oIC8gMjU2LjApICk7CQorCQkJCQkodGhpcy0+Z2xWZXJ0ZXgyaSkoIHVwZGF0ZS54ICsgdXBkYXRlLncJLCB1cGRhdGUueSArIHVwZGF0ZS5oICk7CisJCQkJdGhpcy0+Z2xFbmQoKTsJCisJCQkKKwkJCQl0bXAueCArPSAyNTY7CisJCQkJdG1wLncgLT0gMjU2OworCQkJfQorCQkJdG1wLnkgKz0gMjU2OworCQkJdG1wLmggLT0gMjU2OworCQl9CisJfQorI2VuZGlmCit9CisKKy8qIExvY2sgPT0gc2F2ZSBjdXJyZW50IHN0YXRlICovCit2b2lkIFNETF9HTF9Mb2NrKCkKK3sKKyNpZiBTRExfVklERU9fT1BFTkdMCisJbG9ja19jb3VudC0tOworCWlmIChsb2NrX2NvdW50PT0tMSkKKwl7CisJCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87CisKKwkJdGhpcy0+Z2xQdXNoQXR0cmliKCBHTF9BTExfQVRUUklCX0JJVFMgKTsJLyogVE9ETzogbmFycm93IHJhbmdlIG9mIHdoYXQgaXMgc2F2ZWQgKi8KKyNpZmRlZiBHTF9DTElFTlRfUElYRUxfU1RPUkVfQklUCisJCXRoaXMtPmdsUHVzaENsaWVudEF0dHJpYiggR0xfQ0xJRU5UX1BJWEVMX1NUT1JFX0JJVCApOworI2VuZGlmCisKKwkJdGhpcy0+Z2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisJCXRoaXMtPmdsRW5hYmxlKEdMX0JMRU5EKTsKKwkJdGhpcy0+Z2xEaXNhYmxlKEdMX0ZPRyk7CisJCXRoaXMtPmdsRGlzYWJsZShHTF9BTFBIQV9URVNUKTsKKwkJdGhpcy0+Z2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworCQl0aGlzLT5nbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsJCisJCXRoaXMtPmdsRGlzYWJsZShHTF9TVEVOQ0lMX1RFU1QpOworCQl0aGlzLT5nbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKworCQl0aGlzLT5nbEJpbmRUZXh0dXJlKCBHTF9URVhUVVJFXzJELCB0aGlzLT50ZXh0dXJlICk7CisJCXRoaXMtPmdsVGV4RW52ZiggR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX01PRFVMQVRFICk7CisJCXRoaXMtPmdsVGV4UGFyYW1ldGVyaSggR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUICk7CisJCXRoaXMtPmdsVGV4UGFyYW1ldGVyaSggR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUICk7CisJCXRoaXMtPmdsVGV4UGFyYW1ldGVyaSggR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCApOworCQl0aGlzLT5nbFRleFBhcmFtZXRlcmkoIEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQgKTsKKworCQl0aGlzLT5nbFBpeGVsU3RvcmVpKCBHTF9VTlBBQ0tfUk9XX0xFTkdUSCwgdGhpcy0+c2NyZWVuLT5waXRjaCAvIHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsICk7CisJCXRoaXMtPmdsQmxlbmRGdW5jKEdMX1NSQ19BTFBIQSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisJCSh0aGlzLT5nbENvbG9yNGYpKDEuMCwgMS4wLCAxLjAsIDEuMCk7CQkvKiBTb2xhcmlzIHdvcmthcm91bmQgKi8KKworCQl0aGlzLT5nbFZpZXdwb3J0KDAsIDAsIHRoaXMtPnNjcmVlbi0+dywgdGhpcy0+c2NyZWVuLT5oKTsKKwkJdGhpcy0+Z2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworCQl0aGlzLT5nbFB1c2hNYXRyaXgoKTsKKwkJdGhpcy0+Z2xMb2FkSWRlbnRpdHkoKTsKKworCQl0aGlzLT5nbE9ydGhvKDAuMCwgKEdMZG91YmxlKSB0aGlzLT5zY3JlZW4tPncsIChHTGRvdWJsZSkgdGhpcy0+c2NyZWVuLT5oLCAwLjAsIDAuMCwgMS4wKTsKKworCQl0aGlzLT5nbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKwkJdGhpcy0+Z2xQdXNoTWF0cml4KCk7CisJCXRoaXMtPmdsTG9hZElkZW50aXR5KCk7CisJfQorI2VuZGlmCit9CisKKy8qIFVubG9jayA9PSByZXN0b3JlIHNhdmVkIHN0YXRlICovCit2b2lkIFNETF9HTF9VbmxvY2soKQoreworI2lmIFNETF9WSURFT19PUEVOR0wKKwlsb2NrX2NvdW50Kys7CisJaWYgKGxvY2tfY291bnQ9PTApCisJeworCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOworCisJCXRoaXMtPmdsUG9wTWF0cml4KCk7CisJCXRoaXMtPmdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKwkJdGhpcy0+Z2xQb3BNYXRyaXgoKTsKKworCQl0aGlzLT5nbFBvcENsaWVudEF0dHJpYigpOworCQl0aGlzLT5nbFBvcEF0dHJpYigpOworCX0KKyNlbmRpZgorfQorCisjaWYgU0RMX0FVRElPX0RSSVZFUl9QVUxTRQordm9pZCBTRExfQXVkaW9fU2V0Q2FwdGlvbihjb25zdCBjaGFyICpjYXB0aW9uKTsKKyNlbmRpZgorCisvKgorICogU2V0cy9HZXRzIHRoZSB0aXRsZSBhbmQgaWNvbiB0ZXh0IG9mIHRoZSBkaXNwbGF5IHdpbmRvdywgaWYgYW55LgorICovCit2b2lkIFNETF9XTV9TZXRDYXB0aW9uIChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKKworCWlmICggdmlkZW8gKSB7CisJCWlmICggdGl0bGUgKSB7CisJCQlpZiAoIHZpZGVvLT53bV90aXRsZSApIHsKKwkJCQlTRExfZnJlZSh2aWRlby0+d21fdGl0bGUpOworCQkJfQorCQkJdmlkZW8tPndtX3RpdGxlID0gU0RMX3N0cmR1cCh0aXRsZSk7CisJCX0KKwkJaWYgKCBpY29uICkgeworCQkJaWYgKCB2aWRlby0+d21faWNvbiApIHsKKwkJCQlTRExfZnJlZSh2aWRlby0+d21faWNvbik7CisJCQl9CisJCQl2aWRlby0+d21faWNvbiA9IFNETF9zdHJkdXAoaWNvbik7CisJCX0KKwkJaWYgKCAodGl0bGUgfHwgaWNvbikgJiYgKHZpZGVvLT5TZXRDYXB0aW9uICE9IE5VTEwpICkgeworCQkJdmlkZW8tPlNldENhcHRpb24odGhpcywgdmlkZW8tPndtX3RpdGxlLHZpZGVvLT53bV9pY29uKTsKKwkJfQorCX0KKworI2lmIFNETF9BVURJT19EUklWRVJfUFVMU0UKKwkvKiBQdWxzZUF1ZGlvIGNhbiBtYWtlIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uLiAqLworCVNETF9BdWRpb19TZXRDYXB0aW9uKHRpdGxlKTsKKyNlbmRpZgorfQorCit2b2lkIFNETF9XTV9HZXRDYXB0aW9uIChjaGFyICoqdGl0bGUsIGNoYXIgKippY29uKQoreworCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCisJaWYgKCB2aWRlbyApIHsKKwkJaWYgKCB0aXRsZSApIHsKKwkJCSp0aXRsZSA9IHZpZGVvLT53bV90aXRsZTsKKwkJfQorCQlpZiAoIGljb24gKSB7CisJCQkqaWNvbiA9IHZpZGVvLT53bV9pY29uOworCQl9CisJfQorfQorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgU0RMX1dNX1NldEljb24oKTsKKyAqIGZsYWdzICYgMSBmb3IgY29sb3Iga2V5LCBmbGFncyAmIDIgZm9yIGFscGhhIGNoYW5uZWwuICovCitzdGF0aWMgdm9pZCBDcmVhdGVNYXNrRnJvbUNvbG9yS2V5T3JBbHBoYShTRExfU3VyZmFjZSAqaWNvbiwgVWludDggKm1hc2ssIGludCBmbGFncykKK3sKKwlpbnQgeCwgeTsKKwlVaW50MzIgY29sb3JrZXk7CisjZGVmaW5lIFNFVF9NQVNLQklUKGljb24sIHgsIHksIG1hc2spIFwKKwltYXNrWyh5KigoaWNvbi0+dys3KS84KSkrKHgvOCldICY9IH4oMHgwMTw8KDctKHglOCkpKQorCisJY29sb3JrZXkgPSBpY29uLT5mb3JtYXQtPmNvbG9ya2V5OworCXN3aXRjaCAoaWNvbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7CisJCWNhc2UgMTogeyBVaW50OCAqcGl4ZWxzOworCQkJZm9yICggeT0wOyB5PGljb24tPmg7ICsreSApIHsKKwkJCQlwaXhlbHMgPSAoVWludDggKilpY29uLT5waXhlbHMgKyB5Kmljb24tPnBpdGNoOworCQkJCWZvciAoIHg9MDsgeDxpY29uLT53OyArK3ggKSB7CisJCQkJCWlmICggKnBpeGVscysrID09IGNvbG9ya2V5ICkgeworCQkJCQkJU0VUX01BU0tCSVQoaWNvbiwgeCwgeSwgbWFzayk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSAyOiB7IFVpbnQxNiAqcGl4ZWxzOworCQkJZm9yICggeT0wOyB5PGljb24tPmg7ICsreSApIHsKKwkJCQlwaXhlbHMgPSAoVWludDE2ICopaWNvbi0+cGl4ZWxzICsKKwkJCQkgICAgICAgICAgICAgICAgICAgeSppY29uLT5waXRjaC8yOworCQkJCWZvciAoIHg9MDsgeDxpY29uLT53OyArK3ggKSB7CisJCQkJCWlmICggKGZsYWdzICYgMSkgJiYgKnBpeGVscyA9PSBjb2xvcmtleSApIHsKKwkJCQkJCVNFVF9NQVNLQklUKGljb24sIHgsIHksIG1hc2spOworCQkJCQl9IGVsc2UgaWYoKGZsYWdzICYgMikgJiYgKCpwaXhlbHMgJiBpY29uLT5mb3JtYXQtPkFtYXNrKSA9PSAwKSB7CisJCQkJCQlTRVRfTUFTS0JJVChpY29uLCB4LCB5LCBtYXNrKTsKKwkJCQkJfQorCQkJCQlwaXhlbHMrKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSA0OiB7IFVpbnQzMiAqcGl4ZWxzOworCQkJZm9yICggeT0wOyB5PGljb24tPmg7ICsreSApIHsKKwkJCQlwaXhlbHMgPSAoVWludDMyICopaWNvbi0+cGl4ZWxzICsKKwkJCQkgICAgICAgICAgICAgICAgICAgeSppY29uLT5waXRjaC80OworCQkJCWZvciAoIHg9MDsgeDxpY29uLT53OyArK3ggKSB7CisJCQkJCWlmICggKGZsYWdzICYgMSkgJiYgKnBpeGVscyA9PSBjb2xvcmtleSApIHsKKwkJCQkJCVNFVF9NQVNLQklUKGljb24sIHgsIHksIG1hc2spOworCQkJCQl9IGVsc2UgaWYoKGZsYWdzICYgMikgJiYgKCpwaXhlbHMgJiBpY29uLT5mb3JtYXQtPkFtYXNrKSA9PSAwKSB7CisJCQkJCQlTRVRfTUFTS0JJVChpY29uLCB4LCB5LCBtYXNrKTsKKwkJCQkJfQorCQkJCQlwaXhlbHMrKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorfQorCisvKgorICogU2V0cyB0aGUgd2luZG93IG1hbmFnZXIgaWNvbiBmb3IgdGhlIGRpc3BsYXkgd2luZG93LgorICovCit2b2lkIFNETF9XTV9TZXRJY29uIChTRExfU3VyZmFjZSAqaWNvbiwgVWludDggKm1hc2spCit7CisJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CisKKwlpZiAoIGljb24gJiYgdmlkZW8tPlNldEljb24gKSB7CisJCS8qIEdlbmVyYXRlIGEgbWFzayBpZiBuZWNlc3NhcnksIGFuZCBjcmVhdGUgdGhlIGljb24hICovCisJCWlmICggbWFzayA9PSBOVUxMICkgeworCQkJaW50IG1hc2tfbGVuID0gaWNvbi0+aCooaWNvbi0+dys3KS84OworCQkJaW50IGZsYWdzID0gMDsKKwkJCW1hc2sgPSAoVWludDggKilTRExfbWFsbG9jKG1hc2tfbGVuKTsKKwkJCWlmICggbWFzayA9PSBOVUxMICkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCVNETF9tZW1zZXQobWFzaywgfjAsIG1hc2tfbGVuKTsKKwkJCWlmICggaWNvbi0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkgKSBmbGFncyB8PSAxOworCQkJaWYgKCBpY29uLT5mbGFncyAmIFNETF9TUkNBTFBIQSApIGZsYWdzIHw9IDI7CisJCQlpZiggZmxhZ3MgKSB7CisJCQkJQ3JlYXRlTWFza0Zyb21Db2xvcktleU9yQWxwaGEoaWNvbiwgbWFzaywgZmxhZ3MpOworCQkJfQorCQkJdmlkZW8tPlNldEljb24odmlkZW8sIGljb24sIG1hc2spOworCQkJU0RMX2ZyZWUobWFzayk7CisJCX0gZWxzZSB7CisJCQl2aWRlby0+U2V0SWNvbih0aGlzLCBpY29uLCBtYXNrKTsKKwkJfQorCX0KK30KKworLyoKKyAqIEdyYWIgb3IgdW5ncmFiIHRoZSBrZXlib2FyZCBhbmQgbW91c2UgaW5wdXQuCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpbmFsIGdyYWIgbW9kZSBhZnRlciBjYWxsaW5nIHRoZQorICogZHJpdmVyIGRlcGVuZGVudCBmdW5jdGlvbi4KKyAqLworc3RhdGljIFNETF9HcmFiTW9kZSBTRExfV01fR3JhYklucHV0UmF3KFNETF9HcmFiTW9kZSBtb2RlKQoreworCVNETF9WaWRlb0RldmljZSAqdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCVNETF9WaWRlb0RldmljZSAqdGhpcyAgPSBjdXJyZW50X3ZpZGVvOworCisJLyogT25seSBkbyBzb21ldGhpbmcgaWYgd2UgaGF2ZSBzdXBwb3J0IGZvciBncmFicyAqLworCWlmICggdmlkZW8tPkdyYWJJbnB1dCA9PSBOVUxMICkgeworCQlyZXR1cm4odmlkZW8tPmlucHV0X2dyYWIpOworCX0KKworCS8qIElmIHRoZSBmaW5hbCBncmFiIG1vZGUgaWYgb2ZmLCBvbmx5IHRoZW4gZG8gd2UgYWN0dWFsbHkgZ3JhYiAqLworI2lmZGVmIERFQlVHX0dSQUIKKyAgcHJpbnRmKCJTRExfV01fR3JhYklucHV0UmF3KCVkKSAuLi4gIiwgbW9kZSk7CisjZW5kaWYKKwlpZiAoIG1vZGUgPT0gU0RMX0dSQUJfT0ZGICkgeworCQlpZiAoIHZpZGVvLT5pbnB1dF9ncmFiICE9IFNETF9HUkFCX09GRiApIHsKKwkJCW1vZGUgPSB2aWRlby0+R3JhYklucHV0KHRoaXMsIG1vZGUpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCB2aWRlby0+aW5wdXRfZ3JhYiA9PSBTRExfR1JBQl9PRkYgKSB7CisJCQltb2RlID0gdmlkZW8tPkdyYWJJbnB1dCh0aGlzLCBtb2RlKTsKKwkJfQorCX0KKwlpZiAoIG1vZGUgIT0gdmlkZW8tPmlucHV0X2dyYWIgKSB7CisJCXZpZGVvLT5pbnB1dF9ncmFiID0gbW9kZTsKKwkJaWYgKCB2aWRlby0+Q2hlY2tNb3VzZU1vZGUgKSB7CisJCQl2aWRlby0+Q2hlY2tNb3VzZU1vZGUodGhpcyk7CisJCX0KKwl9CisjaWZkZWYgREVCVUdfR1JBQgorICBwcmludGYoIkZpbmFsIG1vZGUgJWRcbiIsIHZpZGVvLT5pbnB1dF9ncmFiKTsKKyNlbmRpZgorCisJLyogUmV0dXJuIHRoZSBmaW5hbCBncmFiIHN0YXRlICovCisJaWYgKCBtb2RlID49IFNETF9HUkFCX0ZVTExTQ1JFRU4gKSB7CisJCW1vZGUgLT0gU0RMX0dSQUJfRlVMTFNDUkVFTjsKKwl9CisJcmV0dXJuKG1vZGUpOworfQorU0RMX0dyYWJNb2RlIFNETF9XTV9HcmFiSW5wdXQoU0RMX0dyYWJNb2RlIG1vZGUpCit7CisJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisKKwkvKiBJZiB0aGUgdmlkZW8gaXNuJ3QgaW5pdGlhbGl6ZWQgeWV0LCB3ZSBjYW4ndCBkbyBhbnl0aGluZyAqLworCWlmICggISB2aWRlbyApIHsKKwkJcmV0dXJuIFNETF9HUkFCX09GRjsKKwl9CisKKwkvKiBSZXR1cm4gdGhlIGN1cnJlbnQgbW9kZSBvbiBxdWVyeSAqLworCWlmICggbW9kZSA9PSBTRExfR1JBQl9RVUVSWSApIHsKKwkJbW9kZSA9IHZpZGVvLT5pbnB1dF9ncmFiOworCQlpZiAoIG1vZGUgPj0gU0RMX0dSQUJfRlVMTFNDUkVFTiApIHsKKwkJCW1vZGUgLT0gU0RMX0dSQUJfRlVMTFNDUkVFTjsKKwkJfQorCQlyZXR1cm4obW9kZSk7CisJfQorCisjaWZkZWYgREVCVUdfR1JBQgorICBwcmludGYoIlNETF9XTV9HcmFiSW5wdXQoJWQpIC4uLiAiLCBtb2RlKTsKKyNlbmRpZgorCS8qIElmIHRoZSB2aWRlbyBzdXJmYWNlIGlzIGZ1bGxzY3JlZW4sIHdlIGFsd2F5cyBncmFiICovCisJaWYgKCBtb2RlID49IFNETF9HUkFCX0ZVTExTQ1JFRU4gKSB7CisJCW1vZGUgLT0gU0RMX0dSQUJfRlVMTFNDUkVFTjsKKwl9CisJaWYgKCBTRExfVmlkZW9TdXJmYWNlICYmIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKKwkJbW9kZSArPSBTRExfR1JBQl9GVUxMU0NSRUVOOworCX0KKwlyZXR1cm4oU0RMX1dNX0dyYWJJbnB1dFJhdyhtb2RlKSk7Cit9CitzdGF0aWMgU0RMX0dyYWJNb2RlIFNETF9XTV9HcmFiSW5wdXRPZmYodm9pZCkKK3sKKwlTRExfR3JhYk1vZGUgbW9kZTsKKworCS8qIEZpcnN0IHF1ZXJ5IHRoZSBjdXJyZW50IGdyYWIgc3RhdGUgKi8KKwltb2RlID0gU0RMX1dNX0dyYWJJbnB1dChTRExfR1JBQl9RVUVSWSk7CisKKwkvKiBOb3cgZXhwbGljaXRseSB0dXJuIG9mZiBpbnB1dCBncmFiICovCisJU0RMX1dNX0dyYWJJbnB1dFJhdyhTRExfR1JBQl9PRkYpOworCisJLyogUmV0dXJuIHRoZSBvbGQgc3RhdGUgKi8KKwlyZXR1cm4obW9kZSk7Cit9CisKKy8qCisgKiBJY29uaWZ5IHRoZSB3aW5kb3cgaW4gd2luZG93IG1hbmFnZWQgZW52aXJvbm1lbnRzLgorICogQSBzdWNjZXNzZnVsIGljb25pZmljYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gU0RMX0FQUEFDVElWRSBsb3NzIGV2ZW50LgorICovCitpbnQgU0RMX1dNX0ljb25pZnlXaW5kb3codm9pZCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gMDsKKwlpZiAoIHZpZGVvLT5JY29uaWZ5V2luZG93ICkgeworCQlyZXR2YWwgPSB2aWRlby0+SWNvbmlmeVdpbmRvdyh0aGlzKTsKKwl9CisJcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qCisgKiBUb2dnbGUgZnVsbHNjcmVlbiBtb2RlCisgKi8KK2ludCBTRExfV01fVG9nZ2xlRnVsbFNjcmVlbihTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKKwlpbnQgdG9nZ2xlZDsKKworCXRvZ2dsZWQgPSAwOworCWlmICggU0RMX1B1YmxpY1N1cmZhY2UgJiYgKHN1cmZhY2UgPT0gU0RMX1B1YmxpY1N1cmZhY2UpICYmCisJICAgICB2aWRlby0+VG9nZ2xlRnVsbFNjcmVlbiApIHsKKwkJaWYgKCBzdXJmYWNlLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOICkgeworCQkJdG9nZ2xlZCA9IHZpZGVvLT5Ub2dnbGVGdWxsU2NyZWVuKHRoaXMsIDApOworCQkJaWYgKCB0b2dnbGVkICkgeworCQkJCVNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKKwkJCQlTRExfUHVibGljU3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9GVUxMU0NSRUVOOworCQkJfQorCQl9IGVsc2UgeworCQkJdG9nZ2xlZCA9IHZpZGVvLT5Ub2dnbGVGdWxsU2NyZWVuKHRoaXMsIDEpOworCQkJaWYgKCB0b2dnbGVkICkgeworCQkJCVNETF9WaWRlb1N1cmZhY2UtPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworCQkJCVNETF9QdWJsaWNTdXJmYWNlLT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKwkJCX0KKwkJfQorCQkvKiBEb3VibGUtY2hlY2sgdGhlIGdyYWIgc3RhdGUgaW5zaWRlIFNETF9XTV9HcmFiSW5wdXQoKSAqLworCQlpZiAoIHRvZ2dsZWQgKSB7CisJCQlTRExfV01fR3JhYklucHV0KHZpZGVvLT5pbnB1dF9ncmFiKTsKKwkJfQorCX0KKwlyZXR1cm4odG9nZ2xlZCk7Cit9CisKKy8qCisgKiAgU2V0IHdpbmRvdyBwb3NpdGlvbgorICovCit2b2lkICBTRExfV01fU2V0UG9zKGludCAgeCwgaW50ICB5KQoreworICAgIFNETF9WaWRlb0RldmljZSogIHZpZGVvID0gY3VycmVudF92aWRlbzsKKworICAgIGlmICh2aWRlbyAmJiB2aWRlby0+U2V0V2luZG93UG9zKQorICAgICAgICB2aWRlby0+U2V0V2luZG93UG9zKHZpZGVvLCB4LCB5KTsKK30KKworLyoKKyAqIEdldCB3aW5kb3cgcG9zaXRpb24KKyAqLwordm9pZCAgU0RMX1dNX0dldFBvcyhpbnQgICpweCwgaW50ICAqcHkpCit7CisgICAgU0RMX1ZpZGVvRGV2aWNlKiAgdmlkZW8gPSBjdXJyZW50X3ZpZGVvOworCisgICAgaWYgKHZpZGVvICYmIHZpZGVvLT5HZXRXaW5kb3dQb3MpCisgICAgICAgIHZpZGVvLT5HZXRXaW5kb3dQb3ModmlkZW8sIHB4LCBweSk7CisgICAgZWxzZSB7CisgICAgICAgICpweCA9IDEwMDsKKyAgICAgICAgKnB5ID0gMTAwOworICAgIH0KK30KKworaW50ICAgU0RMX1dNX0lzRnVsbHlWaXNpYmxlKCBpbnQgIHJlY2VudGVyICkKK3sKKyAgICBpbnQgIHJlc3VsdCA9IDE7CisKKyAgICBTRExfVmlkZW9EZXZpY2UqICB2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisKKyAgICBpZiAodmlkZW8gJiYgdmlkZW8tPklzV2luZG93VmlzaWJsZSkgeworICAgICAgICByZXN1bHQgPSB2aWRlby0+SXNXaW5kb3dWaXNpYmxlKHZpZGVvLCByZWNlbnRlcik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCAgIFNETF9XTV9HZXRNb25pdG9yRFBJKCBpbnQgICp4RHBpLCBpbnQgICp5RHBpICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICBTRExfVmlkZW9EZXZpY2UqICB2aWRlbyAgPSBjdXJyZW50X3ZpZGVvOworCisgICAgaWYgKHZpZGVvICYmIHZpZGVvLT5HZXRNb25pdG9yRFBJKSB7CisgICAgICAgIHJlc3VsdCA9IHZpZGVvLT5HZXRNb25pdG9yRFBJKHZpZGVvLCB4RHBpLCB5RHBpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50ICAgU0RMX1dNX0dldE1vbml0b3JSZWN0KCBTRExfUmVjdCAgKnJlY3QgKQoreworICAgIGludCAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgIFNETF9WaWRlb0RldmljZSogIHZpZGVvICA9IGN1cnJlbnRfdmlkZW87CisKKyAgICBpZiAodmlkZW8gJiYgdmlkZW8tPkdldE1vbml0b3JSZWN0KSB7CisgICAgICAgIHJlc3VsdCA9IHZpZGVvLT5HZXRNb25pdG9yUmVjdCh2aWRlbywgcmVjdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBHZXQgc29tZSBwbGF0Zm9ybSBkZXBlbmRlbnQgd2luZG93IG1hbmFnZXIgaW5mb3JtYXRpb24KKyAqLworaW50IFNETF9HZXRXTUluZm8gKFNETF9TeXNXTWluZm8gKmluZm8pCit7CisJU0RMX1ZpZGVvRGV2aWNlICp2aWRlbyA9IGN1cnJlbnRfdmlkZW87CisJU0RMX1ZpZGVvRGV2aWNlICp0aGlzICA9IGN1cnJlbnRfdmlkZW87CisKKwlpZiAoIHZpZGVvICYmIHZpZGVvLT5HZXRXTUluZm8gKSB7CisJCXJldHVybih2aWRlby0+R2V0V01JbmZvKHRoaXMsIGluZm8pKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfeXV2LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF95dXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWEzMzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfeXV2LmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgWVVWIHZpZGVvIHN1cmZhY2Ugc3VwcG9ydCAqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3l1dmZ1bmNzLmgiCisjaW5jbHVkZSAiU0RMX3l1dl9zd19jLmgiCisKKworU0RMX092ZXJsYXkgKlNETF9DcmVhdGVZVVZPdmVybGF5KGludCB3LCBpbnQgaCwgVWludDMyIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZGlzcGxheSkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnZpZGVvID0gY3VycmVudF92aWRlbzsKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgID0gY3VycmVudF92aWRlbzsKKwljb25zdCBjaGFyICp5dXZfaHdhY2NlbDsKKwlTRExfT3ZlcmxheSAqb3ZlcmxheTsKKworCWlmICggKGRpc3BsYXktPmZsYWdzICYgU0RMX09QRU5HTCkgPT0gU0RMX09QRU5HTCApIHsKKwkJU0RMX1NldEVycm9yKCJZVVYgb3ZlcmxheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gT3BlbkdMIG1vZGUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogRGlzcGxheSBkaXJlY3RseSBvbiB2aWRlbyBzdXJmYWNlLCBpZiBwb3NzaWJsZSAqLworCWlmICggU0RMX2dldGVudigiU0RMX1ZJREVPX1lVVl9ESVJFQ1QiKSApIHsKKwkJaWYgKCAoZGlzcGxheSA9PSBTRExfUHVibGljU3VyZmFjZSkgJiYKKwkJICAgICAoKFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9PSAyKSB8fAorCQkgICAgICAoU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID09IDQpKSApIHsKKwkJCWRpc3BsYXkgPSBTRExfVmlkZW9TdXJmYWNlOworCQl9CisJfQorCW92ZXJsYXkgPSBOVUxMOworICAgICAgICB5dXZfaHdhY2NlbCA9IFNETF9nZXRlbnYoIlNETF9WSURFT19ZVVZfSFdBQ0NFTCIpOworCWlmICggKChkaXNwbGF5ID09IFNETF9WaWRlb1N1cmZhY2UpICYmIHZpZGVvLT5DcmVhdGVZVVZPdmVybGF5KSAmJgorCSAgICAgKCF5dXZfaHdhY2NlbCB8fCAoU0RMX2F0b2koeXV2X2h3YWNjZWwpID4gMCkpICkgeworCQlvdmVybGF5ID0gdmlkZW8tPkNyZWF0ZVlVVk92ZXJsYXkodGhpcywgdywgaCwgZm9ybWF0LCBkaXNwbGF5KTsKKwl9CisJLyogSWYgaGFyZHdhcmUgWVVWIG92ZXJsYXkgZmFpbGVkIC4uLiAqLworCWlmICggb3ZlcmxheSA9PSBOVUxMICkgeworCQlvdmVybGF5ID0gU0RMX0NyZWF0ZVlVVl9TVyh0aGlzLCB3LCBoLCBmb3JtYXQsIGRpc3BsYXkpOworCX0KKwlyZXR1cm4gb3ZlcmxheTsKK30KKworaW50IFNETF9Mb2NrWVVWT3ZlcmxheShTRExfT3ZlcmxheSAqb3ZlcmxheSkKK3sKKwlpZiAoIG92ZXJsYXkgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgTlVMTCBvdmVybGF5Iik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIG92ZXJsYXktPmh3ZnVuY3MtPkxvY2soY3VycmVudF92aWRlbywgb3ZlcmxheSk7Cit9CisKK3ZvaWQgU0RMX1VubG9ja1lVVk92ZXJsYXkoU0RMX092ZXJsYXkgKm92ZXJsYXkpCit7CisJaWYgKCBvdmVybGF5ID09IE5VTEwgKSB7CisJCXJldHVybjsKKwl9CisJb3ZlcmxheS0+aHdmdW5jcy0+VW5sb2NrKGN1cnJlbnRfdmlkZW8sIG92ZXJsYXkpOworfQorCitpbnQgU0RMX0Rpc3BsYXlZVVZPdmVybGF5KFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqZHN0cmVjdCkKK3sKKwlTRExfUmVjdCBzcmMsIGRzdDsKKwlpbnQgc3JjeCwgc3JjeSwgc3Jjdywgc3JjaDsKKwlpbnQgZHN0eCwgZHN0eSwgZHN0dywgZHN0aDsKKworCWlmICggb3ZlcmxheSA9PSBOVUxMIHx8IGRzdHJlY3QgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJQYXNzZWQgTlVMTCBvdmVybGF5IG9yIGRzdHJlY3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENsaXAgdGhlIHJlY3RhbmdsZSB0byB0aGUgc2NyZWVuIGFyZWEgKi8KKwlzcmN4ID0gMDsKKwlzcmN5ID0gMDsKKwlzcmN3ID0gb3ZlcmxheS0+dzsKKwlzcmNoID0gb3ZlcmxheS0+aDsKKwlkc3R4ID0gZHN0cmVjdC0+eDsKKwlkc3R5ID0gZHN0cmVjdC0+eTsKKwlkc3R3ID0gZHN0cmVjdC0+dzsKKwlkc3RoID0gZHN0cmVjdC0+aDsKKwlpZiAoIGRzdHggPCAwICkgeworCQlzcmN3ICs9IChkc3R4ICogb3ZlcmxheS0+dykgLyBkc3RyZWN0LT53OworCQlkc3R3ICs9IGRzdHg7CisJCXNyY3ggLT0gKGRzdHggKiBvdmVybGF5LT53KSAvIGRzdHJlY3QtPnc7CisJCWRzdHggPSAwOworCX0KKwlpZiAoIChkc3R4K2RzdHcpID4gY3VycmVudF92aWRlby0+c2NyZWVuLT53ICkgeworCQlpbnQgZXh0cmEgPSAoZHN0eCtkc3R3IC0gY3VycmVudF92aWRlby0+c2NyZWVuLT53KTsKKwkJc3JjdyAtPSAoZXh0cmEgKiBvdmVybGF5LT53KSAvIGRzdHJlY3QtPnc7CisJCWRzdHcgLT0gZXh0cmE7CisJfQorCWlmICggZHN0eSA8IDAgKSB7CisJCXNyY2ggKz0gKGRzdHkgKiBvdmVybGF5LT5oKSAvIGRzdHJlY3QtPmg7CisJCWRzdGggKz0gZHN0eTsKKwkJc3JjeSAtPSAoZHN0eSAqIG92ZXJsYXktPmgpIC8gZHN0cmVjdC0+aDsKKwkJZHN0eSA9IDA7CisJfQorCWlmICggKGRzdHkrZHN0aCkgPiBjdXJyZW50X3ZpZGVvLT5zY3JlZW4tPmggKSB7CisJCWludCBleHRyYSA9IChkc3R5K2RzdGggLSBjdXJyZW50X3ZpZGVvLT5zY3JlZW4tPmgpOworCQlzcmNoIC09IChleHRyYSAqIG92ZXJsYXktPmgpIC8gZHN0cmVjdC0+aDsKKwkJZHN0aCAtPSBleHRyYTsKKwl9CisJaWYgKCBzcmN3IDw9IDAgfHwgc3JjaCA8PSAwIHx8CisJICAgICBzcmNoIDw9IDAgfHwgZHN0aCA8PSAwICkgeworCQlyZXR1cm4gMDsKKwl9CisJLyogVWdoLCBJIGNhbid0IHdhaXQgZm9yIFNETF9SZWN0IHRvIGJlIGludCB2YWx1ZXMgKi8KKwlzcmMueCA9IHNyY3g7CisJc3JjLnkgPSBzcmN5OworCXNyYy53ID0gc3JjdzsKKwlzcmMuaCA9IHNyY2g7CisJZHN0LnggPSBkc3R4OworCWRzdC55ID0gZHN0eTsKKwlkc3QudyA9IGRzdHc7CisJZHN0LmggPSBkc3RoOworCXJldHVybiBvdmVybGF5LT5od2Z1bmNzLT5EaXNwbGF5KGN1cnJlbnRfdmlkZW8sIG92ZXJsYXksICZzcmMsICZkc3QpOworfQorCit2b2lkIFNETF9GcmVlWVVWT3ZlcmxheShTRExfT3ZlcmxheSAqb3ZlcmxheSkKK3sKKwlpZiAoIG92ZXJsYXkgPT0gTlVMTCApIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoIG92ZXJsYXktPmh3ZnVuY3MgKSB7CisJCW92ZXJsYXktPmh3ZnVuY3MtPkZyZWVIVyhjdXJyZW50X3ZpZGVvLCBvdmVybGF5KTsKKwl9CisJU0RMX2ZyZWUob3ZlcmxheSk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF95dXZfbW14LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF95dXZfbW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExYzQzMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3l1dl9tbXguYwpAQCAtMCwwICsxLDQyOCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZiAoX19HTlVDX18gPiAyKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBfX09QVElNSVpFX18gJiYgU0RMX0FTU0VNQkxZX1JPVVRJTkVTCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisKKyNpbmNsdWRlICJtbXguaCIKKworLyogKklOREVOVC1PRkYqICovCisKK3N0YXRpYyBtbXhfdCBNTVhfMDA4MHcgICAgPSB7IC51ZCA9IHsweDAwODAwMDgwLCAweDAwODAwMDgwfSB9Oworc3RhdGljIG1teF90IE1NWF8wMEZGdyAgICA9IHsgLnVkID0gezB4MDBmZjAwZmYsIDB4MDBmZjAwZmZ9IH07CitzdGF0aWMgbW14X3QgTU1YX0ZGMDB3ICAgID0geyAudWQgPSB7MHhmZjAwZmYwMCwgMHhmZjAwZmYwMH0gfTsKKworc3RhdGljIG1teF90IE1NWF9ZY29lZmYgICA9IHsgLnV3ID0gezB4MDA0YSwgMHgwMDRhLCAweDAwNGEsIDB4MDA0YX0gfTsKKworc3RhdGljIG1teF90IE1NWF9VYmx1UkdCICA9IHsgLnV3ID0gezB4MDA3MiwgMHgwMDcyLCAweDAwNzIsIDB4MDA3Mn0gfTsKK3N0YXRpYyBtbXhfdCBNTVhfVnJlZFJHQiAgPSB7IC51dyA9IHsweDAwNTksIDB4MDA1OSwgMHgwMDU5LCAweDAwNTl9IH07CitzdGF0aWMgbW14X3QgTU1YX1Vncm5SR0IgID0geyAudXcgPSB7MHhmZmVhLCAweGZmZWEsIDB4ZmZlYSwgMHhmZmVhfSB9Oworc3RhdGljIG1teF90IE1NWF9WZ3JuUkdCICA9IHsgLnV3ID0gezB4ZmZkMiwgMHhmZmQyLCAweGZmZDIsIDB4ZmZkMn0gfTsKKworc3RhdGljIG1teF90IE1NWF9VYmx1NXg1ICA9IHsgLnV3ID0gezB4MDA4MSwgMHgwMDgxLCAweDAwODEsIDB4MDA4MX0gfTsKK3N0YXRpYyBtbXhfdCBNTVhfVnJlZDV4NSAgPSB7IC51dyA9IHsweDAwNjYsIDB4MDA2NiwgMHgwMDY2LCAweDAwNjZ9IH07CitzdGF0aWMgbW14X3QgTU1YX1Vncm41NjUgID0geyAudXcgPSB7MHhmZmU4LCAweGZmZTgsIDB4ZmZlOCwgMHhmZmU4fSB9Oworc3RhdGljIG1teF90IE1NWF9WZ3JuNTY1ICA9IHsgLnV3ID0gezB4ZmZjZCwgMHhmZmNkLCAweGZmY2QsIDB4ZmZjZH0gfTsKKworc3RhdGljIG1teF90IE1NWF9yZWQ1NjUgICA9IHsgLnV3ID0gezB4ZjgwMCwgMHhmODAwLCAweGY4MDAsIDB4ZjgwMH0gfTsKK3N0YXRpYyBtbXhfdCBNTVhfZ3JuNTY1ICAgPSB7IC51dyA9IHsweDA3ZTAsIDB4MDdlMCwgMHgwN2UwLCAweDA3ZTB9IH07CisKKy8qKgorICAgVGhpcyBNTVggYXNzZW1ibGVyIGlzIG15IGZpcnN0IGFzc2VtYmxlci9NTVggcHJvZ3JhbSBldmVyLgorICAgVGh1cyBpdCBtYXliZSBidWdneS4KKyAgIFNlbmQgcGF0Y2hlcyB0bzoKKyAgIG12b2d0QHJocmsudW5pLWtsLmRlCisKKyAgIEFmdGVyIGl0IHdvcmtlZCBmaW5lIEkgaGF2ZSAib2JmdXNjYXRlZCIgdGhlIGNvZGUgYSBiaXQgdG8gaGF2ZQorICAgbW9yZSBwYXJhbGxpc20gaW4gdGhlIE1NWCB1bml0cy4gVGhpcyBtZWFucyBJIG1vdmVkCisgICBpbml0aWxpc2F0aW9uIGFyb3VuZCBhbmQgZGVsYXllZCBvdGhlciBpbnN0cnVjdGlvbi4KKyAgIFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGRpZCBub3Qgc2hvdyB0aGF0IHRoaXMgYnJvdWdodCBhbnkgYWR2YW50YWdlCisgICBidXQgaW4gdGhlb3J5IGl0IF9zaG91bGRfIGJlIGZhc3RlciB0aGlzIHdheS4KKworICAgVGhlIG92ZXJhbGwgcGVyZm9ybWFudmUgZ2FpbiB0byB0aGUgQyBiYXNlZCBkaXRoZXIgd2FzIDMwJS00MCUuCisgICBUaGUgTU1YIHJvdXRpbmUgY2FsY3VsYXRlcyAyNTZiaXQ9OFJHQiB2YWx1ZXMgaW4gZWFjaCBjeWNsZQorICAgKDQgZm9yIHJvdzEgJiA0IGZvciByb3cyKQorCisgICBUaGUgcmVkL2dyZWVuL2JsdWUuLiBjb2VmZmljZW50cyBhcmUgdGFrZW4gZnJvbSB0aGUgbXBlZ19wbGF5IAorICAgcGxheWVyLiBUaGV5IGxvb2sgbmljZSwgYnV0IEkgZG9udCBrbm93IGlmIHlvdSBjYW4gaGF2ZQorICAgYmV0dGVyIHZhbHVlcywgdG8gYXZvaWQgaW50ZWdlciByb3VuZGluZyBlcnJvcnMuCisgICAKKworICAgSU1QT1JUQU5UOgorICAgPT09PT09PT09PQorCisgICBJdCBpcyBhIHJlcXVpcmVtZW50IHRoYXQgdGhlIGNyL2NiL2x1bSBhcmUgOCBieXRlIGFsaWduZWQgYW5kCisgICB0aGUgb3V0IGFyZSAxNmJ5dGUgYWxpZ25lZCBvciB5b3Ugd2lsbC9tYXkgZ2V0IHNlZ2ZhdWx0cworCisqLworCit2b2lkIENvbG9yUkdCRGl0aGVyWVYxMk1NWDFYKCBpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICkKK3sKKwlVaW50MzIgKnJvdzE7CisJVWludDMyICpyb3cyOworCisJdW5zaWduZWQgY2hhciogeSA9IGx1bSArY29scypyb3dzOyAgICAvLyBQb2ludGVyIHRvIHRoZSBlbmQKKwlpbnQgeCA9IDA7CisJcm93MSA9IChVaW50MzIgKilvdXQ7ICAgICAgICAgICAgICAgICAvLyAzMiBiaXQgdGFyZ2V0CisJcm93MiA9IChVaW50MzIgKilvdXQrY29scyttb2Q7ICAgICAgICAvLyBzdGFydCBvZiBzZWNvbmQgcm93CisJbW9kID0gKG1vZCtjb2xzK21vZCkqNDsgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgZm9yIHJvdzEgaW4gYnl0ZQorCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkvLyB0YXAgZGFuY2UgdG8gd29ya2Fyb3VuZCB0aGUgaW5hYmlsaXR5IHRvIHVzZSAlJWVieCBhdCB3aWxsLi4uCisJCS8vICBtb3ZlIG9uZSB0aGluZyB0byB0aGUgc3RhY2suLi4KKwkJInB1c2hsICQwXG4iICAvLyBzYXZlIGEgc2xvdCBvbiB0aGUgc3RhY2suCisJCSJwdXNobCAlJWVieFxuIiAgLy8gc2F2ZSAlJWVieC4KKwkJIm1vdmwgJTAsICUlZWJ4XG4iICAvLyBwdXQgdGhlIHRoaW5nIGluIGVieC4KKwkJIm1vdmwgJSVlYngsNCglJWVzcClcbiIgIC8vIHB1dCB0aGUgdGhpbmcgaW4gdGhlIHN0YWNrIHNsb3QuCisJCSJwb3BsICUlZWJ4XG4iICAvLyBnZXQgYmFjayAlJWVieCAodGhlIFBJQyByZWdpc3RlcikuCisKKwkJIi5hbGlnbiA4XG4iCisJCSIxOlxuIgorCisJCS8vIGNyZWF0ZSBDciAocmVzdWx0IGluIG1tMSkKKwkJInB1c2hsICUlZWJ4XG4iCisJCSJtb3ZsIDQoJSVlc3ApLCUlZWJ4XG4iCisJCSJtb3ZkICglJWVieCksJSVtbTFcbiIgICAvLyAgICAgICAgIDAgIDAgIDAgIDAgIHYzIHYyIHYxIHYwCisJCSJwb3BsICUlZWJ4XG4iCisJCSJweG9yICUlbW03LCUlbW03XG4iICAgICAgLy8gICAgICAgICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAorCQkibW92ZCAoJTIpLCAlJW1tMlxuIiAgICAgICAgICAgLy8gICAgMCAgMCAgMCAgMCBsMyBsMiBsMSBsMAorCQkicHVucGNrbGJ3ICUlbW03LCUlbW0xXG4iIC8vICAgICAgICAgMCAgdjMgMCAgdjIgMDAgdjEgMDAgdjAKKwkJInB1bnBja2xkcSAlJW1tMSwlJW1tMVxuIiAvLyAgICAgICAgIDAwIHYxIDAwIHYwIDAwIHYxIDAwIHYwCisJCSJwc3VidyAlOSwlJW1tMVxuIiAgICAgICAgLy8gbW0xLTEyODpyMSByMSByMCByMCByMSByMSByMCByMAorCisJCSAvLyBjcmVhdGUgQ3JfZyAocmVzdWx0IGluIG1tMCkKKwkJIm1vdnEgJSVtbTEsJSVtbTBcbiIgICAgICAgICAgIC8vIHIxIHIxIHIwIHIwIHIxIHIxIHIwIHIwCisJCSJwbXVsbHcgJTEwLCUlbW0wXG4iICAgICAgICAgICAvLyByZWQqLTQ2ZGVjPTAuNzEzNio2NAorCQkicG11bGx3ICUxMSwlJW1tMVxuIiAgICAgICAgICAgLy8gcmVkKjg5ZGVjPTEuNDAxMyo2NAorCQkicHNyYXcgICQ2LCAlJW1tMFxuIiAgICAgICAgICAgLy8gcmVkPXJlZC82NAorCQkicHNyYXcgICQ2LCAlJW1tMVxuIiAgICAgICAgICAgLy8gcmVkPXJlZC82NAorCisJCS8vIGNyZWF0ZSBMMSBMMiAocmVzdWx0IGluIG1tMixtbTQpCisJCS8vIEwyPWx1bStjb2xzCisJCSJtb3ZxICglMiwlNCksJSVtbTNcbiIgICAgICAgICAvLyAgICAwICAwICAwICAwIEwzIEwyIEwxIEwwCisJCSJwdW5wY2tsZHEgJSVtbTMsJSVtbTJcbiIgICAgICAvLyAgIEwzIEwyIEwxIEwwIGwzIGwyIGwxIGwwCisJCSJtb3ZxICUlbW0yLCUlbW00XG4iICAgICAgICAgICAvLyAgIEwzIEwyIEwxIEwwIGwzIGwyIGwxIGwwCisJCSJwYW5kICUxMiwlJW1tMlxuIiAgICAgICAgICAgICAvLyAgIEwzIDAgIEwxICAwIGwzICAwIGwxICAwCisJCSJwYW5kICUxMywlJW1tNFxuIiAgICAgICAgICAgICAvLyAgIDAgIEwyICAwIEwwICAwIGwyICAwIGwwCisJCSJwc3JsdyAkOCwlJW1tMlxuIiAgICAgICAgICAgICAvLyAgIDAgIEwzICAwIEwxICAwIGwzICAwIGwxCisKKwkJLy8gY3JlYXRlIFIgKHJlc3VsdCBpbiBtbTYpCisJCSJtb3ZxICUlbW0yLCUlbW01XG4iICAgICAgICAgICAvLyAgIDAgTDMgIDAgTDEgIDAgbDMgIDAgbDEKKwkJIm1vdnEgJSVtbTQsJSVtbTZcbiIgICAgICAgICAgIC8vICAgMCBMMiAgMCBMMCAgMCBsMiAgMCBsMAorCQkicGFkZHN3ICAlJW1tMSwgJSVtbTVcbiIgICAgICAgLy8gbHVtMStyZWQ6eCBSMyB4IFIxIHggcjMgeCByMQorCQkicGFkZHN3ICAlJW1tMSwgJSVtbTZcbiIgICAgICAgLy8gbHVtMStyZWQ6eCBSMiB4IFIwIHggcjIgeCByMAorCQkicGFja3Vzd2IgJSVtbTUsJSVtbTVcbiIgICAgICAgLy8gIFIzIFIxIHIzIHIxIFIzIFIxIHIzIHIxCisJCSJwYWNrdXN3YiAlJW1tNiwlJW1tNlxuIiAgICAgICAvLyAgUjIgUjAgcjIgcjAgUjIgUjAgcjIgcjAKKwkJInB4b3IgJSVtbTcsJSVtbTdcbiIgICAgICAvLyAgICAgICAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCisJCSJwdW5wY2tsYncgJSVtbTUsJSVtbTZcbiIgICAgICAvLyAgUjMgUjIgUjEgUjAgcjMgcjIgcjEgcjAKKworCQkvLyBjcmVhdGUgQ2IgKHJlc3VsdCBpbiBtbTEpCisJCSJtb3ZkICglMSksICUlbW0xXG4iICAgICAgLy8gICAgICAgICAwICAwICAwICAwICB1MyB1MiB1MSB1MAorCQkicHVucGNrbGJ3ICUlbW03LCUlbW0xXG4iIC8vICAgICAgICAgMCAgdTMgMCAgdTIgMDAgdTEgMDAgdTAKKwkJInB1bnBja2xkcSAlJW1tMSwlJW1tMVxuIiAvLyAgICAgICAgIDAwIHUxIDAwIHUwIDAwIHUxIDAwIHUwCisJCSJwc3VidyAlOSwlJW1tMVxuIiAgICAgICAgLy8gbW0xLTEyODp1MSB1MSB1MCB1MCB1MSB1MSB1MCB1MAorCQkvLyBjcmVhdGUgQ2JfZyAocmVzdWx0IGluIG1tNSkKKwkJIm1vdnEgJSVtbTEsJSVtbTVcbiIgICAgICAgICAgICAvLyB1MSB1MSB1MCB1MCB1MSB1MSB1MCB1MAorCQkicG11bGx3ICUxNCwlJW1tNVxuIiAgICAgICAgICAgIC8vIGJsdWUqLTEwOWRlYz0xLjcxMjkqNjQKKwkJInBtdWxsdyAlMTUsJSVtbTFcbiIgICAgICAgICAgICAvLyBibHVlKjExNGRlYz0xLjc4MTI1KjY0CisJCSJwc3JhdyAgJDYsICUlbW01XG4iICAgICAgICAgICAgLy8gYmx1ZT1yZWQvNjQKKwkJInBzcmF3ICAkNiwgJSVtbTFcbiIgICAgICAgICAgICAvLyBibHVlPWJsdWUvNjQKKworCQkvLyBjcmVhdGUgRyAocmVzdWx0IGluIG1tNykKKwkJIm1vdnEgJSVtbTIsJSVtbTNcbiIgICAgICAvLyAgIDAgIEwzICAwIEwxICAwIGwzICAwIGwxCisJCSJtb3ZxICUlbW00LCUlbW03XG4iICAgICAgLy8gICAwICBMMiAgMCBMMCAgMCBsMiAgMCBsMQorCQkicGFkZHN3ICAlJW1tNSwgJSVtbTNcbiIgIC8vIGx1bTErQ2JfZzp4IEczdCB4IEcxdCB4IGczdCB4IGcxdAorCQkicGFkZHN3ICAlJW1tNSwgJSVtbTdcbiIgIC8vIGx1bTErQ2JfZzp4IEcydCB4IEcwdCB4IGcydCB4IGcwdAorCQkicGFkZHN3ICAlJW1tMCwgJSVtbTNcbiIgIC8vIGx1bTErQ3JfZzp4IEczICB4IEcxICB4IGczICB4IGcxCisJCSJwYWRkc3cgICUlbW0wLCAlJW1tN1xuIiAgLy8gbHVtMStibHVlOnggRzIgIHggRzAgIHggZzIgIHggZzAKKwkJInBhY2t1c3diICUlbW0zLCUlbW0zXG4iICAvLyBHMyBHMSBnMyBnMSBHMyBHMSBnMyBnMQorCQkicGFja3Vzd2IgJSVtbTcsJSVtbTdcbiIgIC8vIEcyIEcwIGcyIGcwIEcyIEcwIGcyIGcwCisJCSJwdW5wY2tsYncgJSVtbTMsJSVtbTdcbiIgLy8gRzMgRzIgRzEgRzAgZzMgZzIgZzEgZzAKKworCQkvLyBjcmVhdGUgQiAocmVzdWx0IGluIG1tNSkKKwkJIm1vdnEgJSVtbTIsJSVtbTNcbiIgICAgICAgICAvLyAgIDAgIEwzICAwIEwxICAwIGwzICAwIGwxCisJCSJtb3ZxICUlbW00LCUlbW01XG4iICAgICAgICAgLy8gICAwICBMMiAgMCBMMCAgMCBsMiAgMCBsMQorCQkicGFkZHN3ICAlJW1tMSwgJSVtbTNcbiIgICAgIC8vIGx1bTErYmx1ZTp4IEIzIHggQjEgeCBiMyB4IGIxCisJCSJwYWRkc3cgICUlbW0xLCAlJW1tNVxuIiAgICAgLy8gbHVtMStibHVlOnggQjIgeCBCMCB4IGIyIHggYjAKKwkJInBhY2t1c3diICUlbW0zLCUlbW0zXG4iICAgICAvLyBCMyBCMSBiMyBiMSBCMyBCMSBiMyBiMQorCQkicGFja3Vzd2IgJSVtbTUsJSVtbTVcbiIgICAgIC8vIEIyIEIwIGIyIGIwIEIyIEIwIGIyIGIwCisJCSJwdW5wY2tsYncgJSVtbTMsJSVtbTVcbiIgICAgLy8gQjMgQjIgQjEgQjAgYjMgYjIgYjEgYjAKKworCQkvLyBmaWxsIGRlc3RpbmF0aW9uIHJvdzEgKG5lZWRlZCBhcmUgbW02PVJyLG1tNz1HZyxtbTU9QmIpCisKKwkJInB4b3IgJSVtbTIsJSVtbTJcbiIgICAgICAgICAgIC8vICAwICAwICAwICAwICAwICAwICAwICAwCisJCSJweG9yICUlbW00LCUlbW00XG4iICAgICAgICAgICAvLyAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMAorCQkibW92cSAlJW1tNiwlJW1tMVxuIiAgICAgICAgICAgLy8gUjMgUjIgUjEgUjAgcjMgcjIgcjEgcjAKKwkJIm1vdnEgJSVtbTUsJSVtbTNcbiIgICAgICAgICAgIC8vIEIzIEIyIEIxIEIwIGIzIGIyIGIxIGIwCisJCS8vIHByb2Nlc3MgbG93ZXIgbHVtCisJCSJwdW5wY2tsYncgJSVtbTQsJSVtbTFcbiIgICAgICAvLyAgMCByMyAgMCByMiAgMCByMSAgMCByMAorCQkicHVucGNrbGJ3ICUlbW00LCUlbW0zXG4iICAgICAgLy8gIDAgYjMgIDAgYjIgIDAgYjEgIDAgYjAKKwkJIm1vdnEgJSVtbTEsJSVtbTJcbiIgICAgICAgICAgIC8vICAwIHIzICAwIHIyICAwIHIxICAwIHIwCisJCSJtb3ZxICUlbW0zLCUlbW0wXG4iICAgICAgICAgICAvLyAgMCBiMyAgMCBiMiAgMCBiMSAgMCBiMAorCQkicHVucGNrbHdkICUlbW0xLCUlbW0zXG4iICAgICAgLy8gIDAgcjEgIDAgYjEgIDAgcjAgIDAgYjAKKwkJInB1bnBja2h3ZCAlJW1tMiwlJW1tMFxuIiAgICAgIC8vICAwIHIzICAwIGIzICAwIHIyICAwIGIyCisKKwkJInB4b3IgJSVtbTIsJSVtbTJcbiIgICAgICAgICAgIC8vICAwICAwICAwICAwICAwICAwICAwICAwCisJCSJtb3ZxICUlbW03LCUlbW0xXG4iICAgICAgICAgICAvLyBHMyBHMiBHMSBHMCBnMyBnMiBnMSBnMAorCQkicHVucGNrbGJ3ICUlbW0xLCUlbW0yXG4iICAgICAgLy8gZzMgIDAgZzIgIDAgZzEgIDAgZzAgIDAKKwkJInB1bnBja2x3ZCAlJW1tNCwlJW1tMlxuIiAgICAgIC8vICAwICAwIGcxICAwICAwICAwIGcwICAwCisJCSJwb3IgJSVtbTMsICUlbW0yXG4iICAgICAgICAgIC8vICAwIHIxIGcxIGIxICAwIHIwIGcwIGIwCisJCSJtb3ZxICUlbW0yLCglMylcbiIgICAgICAgICAgLy8gd3JvdGUgb3V0ICEgcm93MQorCisJCSJweG9yICUlbW0yLCUlbW0yXG4iICAgICAgICAgICAvLyAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMAorCQkicHVucGNrbGJ3ICUlbW0xLCUlbW00XG4iICAgICAgLy8gZzMgIDAgZzIgIDAgZzEgIDAgZzAgIDAKKwkJInB1bnBja2h3ZCAlJW1tMiwlJW1tNFxuIiAgICAgIC8vICAwICAwIGczICAwICAwICAwIGcyICAwCisJCSJwb3IgJSVtbTAsICUlbW00XG4iICAgICAgICAgIC8vICAwIHIzIGczIGIzICAwIHIyIGcyIGIyCisJCSJtb3ZxICUlbW00LDgoJTMpXG4iICAgICAgICAgLy8gd3JvdGUgb3V0ICEgcm93MQorCQkgCisJCS8vIGZpbGwgZGVzdGluYXRpb24gcm93MiAobmVlZGVkIGFyZSBtbTY9UnIsbW03PUdnLG1tNT1CYikKKwkJLy8gdGhpcyBjYW4gYmUgZG9uZSAiZGVzdHJ1Y3RpdmUiCisJCSJweG9yICUlbW0yLCUlbW0yXG4iICAgICAgICAgICAvLyAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMAorCQkicHVucGNraGJ3ICUlbW0yLCUlbW02XG4iICAgICAgLy8gIDAgUjMgIDAgUjIgIDAgUjEgIDAgUjAKKwkJInB1bnBja2hidyAlJW1tMSwlJW1tNVxuIiAgICAgIC8vIEczIEIzIEcyIEIyIEcxIEIxIEcwIEIwCisJCSJtb3ZxICUlbW01LCUlbW0xXG4iICAgICAgICAgICAvLyBHMyBCMyBHMiBCMiBHMSBCMSBHMCBCMAorCQkicHVucGNrbHdkICUlbW02LCUlbW0xXG4iICAgICAgLy8gIDAgUjEgRzEgQjEgIDAgUjAgRzAgQjAKKwkJIm1vdnEgJSVtbTEsKCU1KVxuIiAgICAgICAgICAvLyB3cm90ZSBvdXQgISByb3cyCisJCSJwdW5wY2tod2QgJSVtbTYsJSVtbTVcbiIgICAgICAvLyAgMCBSMyBHMyBCMyAgMCBSMiBHMiBCMgorCQkibW92cSAlJW1tNSw4KCU1KVxuIiAgICAgICAgIC8vIHdyb3RlIG91dCAhIHJvdzIKKwkJIAorCQkiYWRkbCAkNCwlMlxuIiAgICAgICAgICAgIC8vIGx1bSs0CisJCSJsZWFsIDE2KCUzKSwlM1xuIiAgICAgICAgLy8gcm93MSsxNgorCQkibGVhbCAxNiglNSksJTVcbiIgICAgICAgIC8vIHJvdzIrMTYKKwkJImFkZGwgJDIsKCUlZXNwKVxuIiAgICAgICAgLy8gY3IrMgorCQkiYWRkbCAkMiwlMVxuIiAgICAgICAgICAgLy8gY2IrMgorCisJCSJhZGRsICQ0LCU2XG4iICAgICAgICAgICAgLy8geCs0CisJCSJjbXBsICU0LCU2XG4iCisKKwkJImpsIDFiXG4iCisJCSJhZGRsICU0LCUyXG4iIC8vIGx1bSArPSBjb2xzCisJCSJhZGRsICU4LCUzXG4iIC8vIHJvdzErPSBtb2QKKwkJImFkZGwgJTgsJTVcbiIgLy8gcm93Mis9IG1vZAorCQkibW92bCAkMCwlNlxuIiAvLyB4PTAKKwkJImNtcGwgJTcsJTJcbiIKKwkJImpsIDFiXG4iCisKKwkJImFkZGwgJDQsJSVlc3BcbiIgIC8vIGdldCByaWQgb2YgdGhlIHN0YWNrIHNsb3Qgd2UgcmVzZXJ2ZWQuCisJCSJlbW1zXG4iICAvLyByZXNldCBNTVggcmVnaXN0ZXJzLgorCQk6CisJCTogIm0iIChjciksICJyIihjYiksInIiKGx1bSksCisJCSAgInIiKHJvdzEpLCJyIihjb2xzKSwiciIocm93MiksIm0iKHgpLCJtIih5KSwibSIobW9kKSwKKwkJICAibSIoTU1YXzAwODB3KSwibSIoTU1YX1Zncm5SR0IpLCJtIihNTVhfVnJlZFJHQiksCisJCSAgIm0iKE1NWF9GRjAwdyksIm0iKE1NWF8wMEZGdyksIm0iKE1NWF9VZ3JuUkdCKSwKKwkJICAibSIoTU1YX1VibHVSR0IpCisJKTsKK30KKwordm9pZCBDb2xvcjU2NURpdGhlcllWMTJNTVgxWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCit7CisJVWludDE2ICpyb3cxOworCVVpbnQxNiAqcm93MjsKKworCXVuc2lnbmVkIGNoYXIqIHkgPSBsdW0gK2NvbHMqcm93czsgICAgLyogUG9pbnRlciB0byB0aGUgZW5kICovCisJaW50IHggPSAwOworCXJvdzEgPSAoVWludDE2ICopb3V0OyAgICAgICAgICAgICAgICAgLyogMTYgYml0IHRhcmdldCAqLworCXJvdzIgPSAoVWludDE2ICopb3V0K2NvbHMrbW9kOyAgICAgICAgLyogc3RhcnQgb2Ygc2Vjb25kIHJvdyAgKi8KKwltb2QgPSAobW9kK2NvbHMrbW9kKSoyOyAgICAgICAgICAgICAgIC8qIGluY3JlbWVudCBmb3Igcm93MSBpbiBieXRlICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJLy8gdGFwIGRhbmNlIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSB0byB1c2UgJSVlYnggYXQgd2lsbC4uLgorCQkvLyAgbW92ZSBvbmUgdGhpbmcgdG8gdGhlIHN0YWNrLi4uCisJCSJwdXNobCAkMFxuIiAgLy8gc2F2ZSBhIHNsb3Qgb24gdGhlIHN0YWNrLgorCQkicHVzaGwgJSVlYnhcbiIgIC8vIHNhdmUgJSVlYnguCisJCSJtb3ZsICUwLCAlJWVieFxuIiAgLy8gcHV0IHRoZSB0aGluZyBpbiBlYnguCisJCSJtb3ZsICUlZWJ4LCA0KCUlZXNwKVxuIiAgLy8gcHV0IHRoZSB0aGluZyBpbiB0aGUgc3RhY2sgc2xvdC4KKwkJInBvcGwgJSVlYnhcbiIgIC8vIGdldCBiYWNrICUlZWJ4ICh0aGUgUElDIHJlZ2lzdGVyKS4KKworCQkiLmFsaWduIDhcbiIKKwkJIjE6XG4iCisJCSJtb3ZkICAgICAgICAgICAoJTEpLCAgICAgICAgICAgICAgICAgICAlJW1tMFxuIiAvLyA0IENiICAgICAgICAgMCAgMCAgMCAgMCB1MyB1MiB1MSB1MAorCQkicHhvciAgICAgICAgICAgJSVtbTcsICAgICAgICAgICAgICAgICAgJSVtbTdcbiIKKwkJInB1c2hsICUlZWJ4XG4iCisJCSJtb3ZsIDQoJSVlc3ApLCAlJWVieFxuIgorCQkibW92ZCAoJSVlYngpLCAlJW1tMVxuIiAgIC8vIDQgQ3IgICAgICAgICAgICAgICAgMCAgMCAgMCAgMCB2MyB2MiB2MSB2MAorCQkicG9wbCAlJWVieFxuIgorCisJCSJwdW5wY2tsYncgICAgICAlJW1tNywgICAgICAgICAgICAgICAgICAlJW1tMFxuIiAvLyA0IFcgY2IgICAwIHUzICAwIHUyICAwIHUxICAwIHUwCisJCSJwdW5wY2tsYncgICAgICAlJW1tNywgICAgICAgICAgICAgICAgICAlJW1tMVxuIiAvLyA0IFcgY3IgICAwIHYzICAwIHYyICAwIHYxICAwIHYwCisJCSJwc3VidyAgICAgICAgICAlOSwgICAgICAgICAgICAgICAgICAgICAlJW1tMFxuIgorCQkicHN1YncgICAgICAgICAgJTksICAgICAgICAgICAgICAgICAgICAgJSVtbTFcbiIKKwkJIm1vdnEgICAgICAgICAgICUlbW0wLCAgICAgICAgICAgICAgICAgICUlbW0yXG4iIC8vIENiICAgICAgICAgICAgICAgICAgIDAgdTMgIDAgdTIgIDAgdTEgIDAgdTAKKwkJIm1vdnEgICAgICAgICAgICUlbW0xLCAgICAgICAgICAgICAgICAgICUlbW0zXG4iIC8vIENyCisJCSJwbXVsbHcgICAgICAgICAlMTAsICAgICAgICAgICAgICAgICAgICAlJW1tMlxuIiAvLyBDYjJncmVlbiAwIFIzICAwIFIyICAwIFIxICAwIFIwCisJCSJtb3ZxICAgICAgICAgICAoJTIpLCAgICAgICAgICAgICAgICAgICAlJW1tNlxuIiAvLyBMMSAgICAgIGw3IEw2IEw1IEw0IEwzIEwyIEwxIEwwCisJCSJwbXVsbHcgICAgICAgICAlMTEsICAgICAgICAgICAgICAgICAgICAlJW1tMFxuIiAvLyBDYjJibHVlCisJCSJwYW5kICAgICAgICAgICAlMTIsICAgICAgICAgICAgICAgICAgICAlJW1tNlxuIiAvLyBMMSAgICAgIDAwIEw2IDAwIEw0IDAwIEwyIDAwIEwwCisJCSJwbXVsbHcgICAgICAgICAlMTMsICAgICAgICAgICAgICAgICAgICAlJW1tM1xuIiAvLyBDcjJncmVlbgorCQkibW92cSAgICAgICAgICAgKCUyKSwgICAgICAgICAgICAgICAgICAgJSVtbTdcbiIgLy8gTDIKKwkJInBtdWxsdyAgICAgICAgICUxNCwgICAgICAgICAgICAgICAgICAgICUlbW0xXG4iIC8vIENyMnJlZAorCQkicHNybHcgICAgICAgICAgJDgsICAgICAgICAgICAgICAgICAgICAgJSVtbTdcbiIgICAgICAgIC8vIEwyICAgICAgICAgICAwMCBMNyAwMCBMNSAwMCBMMyAwMCBMMQorCQkicG11bGx3ICAgICAgICAgJTE1LCAgICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gbHVtMQorCQkicGFkZHcgICAgICAgICAgJSVtbTMsICAgICAgICAgICAgICAgICAgJSVtbTJcbiIgLy8gQ2IyZ3JlZW4gKyBDcjJncmVlbiA9PSBncmVlbgorCQkicG11bGx3ICAgICAgICAgJTE1LCAgICAgICAgICAgICAgICAgICAgJSVtbTdcbiIgLy8gbHVtMgorCisJCSJtb3ZxICAgICAgICAgICAlJW1tNiwgICAgICAgICAgICAgICAgICAlJW1tNFxuIiAvLyBsdW0xCisJCSJwYWRkdyAgICAgICAgICAlJW1tMCwgICAgICAgICAgICAgICAgICAlJW1tNlxuIiAvLyBsdW0xICtibHVlIDAwIEI2IDAwIEI0IDAwIEIyIDAwIEIwCisJCSJtb3ZxICAgICAgICAgICAlJW1tNCwgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBsdW0xCisJCSJwYWRkdyAgICAgICAgICAlJW1tMSwgICAgICAgICAgICAgICAgICAlJW1tNFxuIiAvLyBsdW0xICtyZWQgIDAwIFI2IDAwIFI0IDAwIFIyIDAwIFIwCisJCSJwYWRkdyAgICAgICAgICAlJW1tMiwgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBsdW0xICtncmVlbiAwMCBHNiAwMCBHNCAwMCBHMiAwMCBHMAorCQkicHNyYXcgICAgICAgICAgJDYsICAgICAgICAgICAgICAgICAgICAgJSVtbTRcbiIgLy8gUjEgMCAuLiA2NAorCQkibW92cSAgICAgICAgICAgJSVtbTcsICAgICAgICAgICAgICAgICAgJSVtbTNcbiIgLy8gbHVtMiAgICAgICAgICAgICAgICAgICAgICAgMDAgTDcgMDAgTDUgMDAgTDMgMDAgTDEKKwkJInBzcmF3ICAgICAgICAgICQ2LCAgICAgICAgICAgICAgICAgICAgICUlbW01XG4iIC8vIEcxICAtIC4uICsKKwkJInBhZGR3ICAgICAgICAgICUlbW0wLCAgICAgICAgICAgICAgICAgICUlbW03XG4iIC8vIEx1bTIgK2JsdWUgMDAgQjcgMDAgQjUgMDAgQjMgMDAgQjEKKwkJInBzcmF3ICAgICAgICAgICQ2LCAgICAgICAgICAgICAgICAgICAgICUlbW02XG4iIC8vIEIxICAgICAgICAgMCAuLiA2NAorCQkicGFja3Vzd2IgICAgICAgJSVtbTQsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIgLy8gUjEgUjEKKwkJInBhY2t1c3diICAgICAgICUlbW01LCAgICAgICAgICAgICAgICAgICUlbW01XG4iIC8vIEcxIEcxCisJCSJwYWNrdXN3YiAgICAgICAlJW1tNiwgICAgICAgICAgICAgICAgICAlJW1tNlxuIiAvLyBCMSBCMQorCQkicHVucGNrbGJ3ICAgICAgJSVtbTQsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIKKwkJInB1bnBja2xidyAgICAgICUlbW01LCAgICAgICAgICAgICAgICAgICUlbW01XG4iCisKKwkJInBhbmQgICAgICAgICAgICUxNiwgICAgICAgICAgICAgICAgICAgICUlbW00XG4iCisJCSJwc2xsdyAgICAgICAgICAkMywgICAgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBHUkVFTiAgICAgICAxCisJCSJwdW5wY2tsYncgICAgICAlJW1tNiwgICAgICAgICAgICAgICAgICAlJW1tNlxuIgorCQkicGFuZCAgICAgICAgICAgJTE3LCAgICAgICAgICAgICAgICAgICAgJSVtbTVcbiIKKwkJInBhbmQgICAgICAgICAgICUxNiwgICAgICAgICAgICAgICAgICAgICUlbW02XG4iCisJCSJwb3IgICAgICAgICAgICAlJW1tNSwgICAgICAgICAgICAgICAgICAlJW1tNFxuIiAvLworCQkicHNybHcgICAgICAgICAgJDExLCAgICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gQkxVRSAgICAgICAgMQorCQkibW92cSAgICAgICAgICAgJSVtbTMsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIgLy8gbHVtMgorCQkicGFkZHcgICAgICAgICAgJSVtbTEsICAgICAgICAgICAgICAgICAgJSVtbTNcbiIgLy8gbHVtMiArcmVkICAgICAgMDAgUjcgMDAgUjUgMDAgUjMgMDAgUjEKKwkJInBhZGR3ICAgICAgICAgICUlbW0yLCAgICAgICAgICAgICAgICAgICUlbW01XG4iIC8vIGx1bTIgK2dyZWVuIDAwIEc3IDAwIEc1IDAwIEczIDAwIEcxCisJCSJwc3JhdyAgICAgICAgICAkNiwgICAgICAgICAgICAgICAgICAgICAlJW1tM1xuIiAvLyBSMgorCQkicG9yICAgICAgICAgICAgJSVtbTYsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIgLy8gTU00CisJCSJwc3JhdyAgICAgICAgICAkNiwgICAgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBHMgorCQkibW92cSAgICAgICAgICAgKCUyLCAlNCksICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gTDMgbG9hZCBsdW0yCisJCSJwc3JhdyAgICAgICAgICAkNiwgICAgICAgICAgICAgICAgICAgICAlJW1tN1xuIgorCQkicGFja3Vzd2IgICAgICAgJSVtbTMsICAgICAgICAgICAgICAgICAgJSVtbTNcbiIKKwkJInBhY2t1c3diICAgICAgICUlbW01LCAgICAgICAgICAgICAgICAgICUlbW01XG4iCisJCSJwYWNrdXN3YiAgICAgICAlJW1tNywgICAgICAgICAgICAgICAgICAlJW1tN1xuIgorCQkicGFuZCAgICAgICAgICAgJTEyLCAgICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gTDMKKwkJInB1bnBja2xidyAgICAgICUlbW0zLCAgICAgICAgICAgICAgICAgICUlbW0zXG4iCisJCSJwdW5wY2tsYncgICAgICAlJW1tNSwgICAgICAgICAgICAgICAgICAlJW1tNVxuIgorCQkicG11bGx3ICAgICAgICAgJTE1LCAgICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gbHVtMworCQkicHVucGNrbGJ3ICAgICAgJSVtbTcsICAgICAgICAgICAgICAgICAgJSVtbTdcbiIKKwkJInBzbGx3ICAgICAgICAgICQzLCAgICAgICAgICAgICAgICAgICAgICUlbW01XG4iIC8vIEdSRUVOIDIKKwkJInBhbmQgICAgICAgICAgICUxNiwgICAgICAgICAgICAgICAgICAgICUlbW03XG4iCisJCSJwYW5kICAgICAgICAgICAlMTYsICAgICAgICAgICAgICAgICAgICAlJW1tM1xuIgorCQkicHNybHcgICAgICAgICAgJDExLCAgICAgICAgICAgICAgICAgICAgJSVtbTdcbiIgLy8gQkxVRSAgMgorCQkicGFuZCAgICAgICAgICAgJTE3LCAgICAgICAgICAgICAgICAgICAgJSVtbTVcbiIKKwkJInBvciAgICAgICAgICAgICUlbW03LCAgICAgICAgICAgICAgICAgICUlbW0zXG4iCisJCSJtb3ZxICAgICAgICAgICAoJTIsJTQpLCAgICAgICAgICAgICAgICAlJW1tN1xuIiAvLyBMNCBsb2FkIGx1bTIKKwkJInBvciAgICAgICAgICAgICUlbW01LCAgICAgICAgICAgICAgICAgICUlbW0zXG4iIC8vCisJCSJwc3JsdyAgICAgICAgICAkOCwgICAgICAgICAgICAgICAgICAgICAlJW1tN1xuIiAvLyBMNAorCQkibW92cSAgICAgICAgICAgJSVtbTQsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIKKwkJInB1bnBja2x3ZCAgICAgICUlbW0zLCAgICAgICAgICAgICAgICAgICUlbW00XG4iCisJCSJwbXVsbHcgICAgICAgICAlMTUsICAgICAgICAgICAgICAgICAgICAlJW1tN1xuIiAvLyBsdW00CisJCSJwdW5wY2tod2QgICAgICAlJW1tMywgICAgICAgICAgICAgICAgICAlJW1tNVxuIgorCisJCSJtb3ZxICAgICAgICAgICAlJW1tNCwgICAgICAgICAgICAgICAgICAoJTMpXG4iICAvLyB3cml0ZSByb3cxCisJCSJtb3ZxICAgICAgICAgICAlJW1tNSwgICAgICAgICAgICAgICAgICA4KCUzKVxuIiAvLyB3cml0ZSByb3cxCisKKwkJIm1vdnEgICAgICAgICAgICUlbW02LCAgICAgICAgICAgICAgICAgICUlbW00XG4iIC8vIEx1bTMKKwkJInBhZGR3ICAgICAgICAgICUlbW0wLCAgICAgICAgICAgICAgICAgICUlbW02XG4iIC8vIEx1bTMgK2JsdWUKKworCQkibW92cSAgICAgICAgICAgJSVtbTQsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIgLy8gTHVtMworCQkicGFkZHcgICAgICAgICAgJSVtbTEsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIgLy8gTHVtMyArcmVkCisJCSJwYWRkdyAgICAgICAgICAlJW1tMiwgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBMdW0zICtncmVlbgorCQkicHNyYXcgICAgICAgICAgJDYsICAgICAgICAgICAgICAgICAgICAgJSVtbTRcbiIKKwkJIm1vdnEgICAgICAgICAgICUlbW03LCAgICAgICAgICAgICAgICAgICUlbW0zXG4iIC8vIEx1bTQKKwkJInBzcmF3ICAgICAgICAgICQ2LCAgICAgICAgICAgICAgICAgICAgICUlbW01XG4iCisJCSJwYWRkdyAgICAgICAgICAlJW1tMCwgICAgICAgICAgICAgICAgICAlJW1tN1xuIiAvLyBMdW00ICtibHVlCisJCSJwc3JhdyAgICAgICAgICAkNiwgICAgICAgICAgICAgICAgICAgICAlJW1tNlxuIiAvLyBMdW0zICtibHVlCisJCSJtb3ZxICAgICAgICAgICAlJW1tMywgICAgICAgICAgICAgICAgICAlJW1tMFxuIiAvLyBMdW00CisJCSJwYWNrdXN3YiAgICAgICAlJW1tNCwgICAgICAgICAgICAgICAgICAlJW1tNFxuIgorCQkicGFkZHcgICAgICAgICAgJSVtbTEsICAgICAgICAgICAgICAgICAgJSVtbTNcbiIgLy8gTHVtNCArcmVkCisJCSJwYWNrdXN3YiAgICAgICAlJW1tNSwgICAgICAgICAgICAgICAgICAlJW1tNVxuIgorCQkicGFkZHcgICAgICAgICAgJSVtbTIsICAgICAgICAgICAgICAgICAgJSVtbTBcbiIgLy8gTHVtNCArZ3JlZW4KKwkJInBhY2t1c3diICAgICAgICUlbW02LCAgICAgICAgICAgICAgICAgICUlbW02XG4iCisJCSJwdW5wY2tsYncgICAgICAlJW1tNCwgICAgICAgICAgICAgICAgICAlJW1tNFxuIgorCQkicHVucGNrbGJ3ICAgICAgJSVtbTUsICAgICAgICAgICAgICAgICAgJSVtbTVcbiIKKwkJInB1bnBja2xidyAgICAgICUlbW02LCAgICAgICAgICAgICAgICAgICUlbW02XG4iCisJCSJwc2xsdyAgICAgICAgICAkMywgICAgICAgICAgICAgICAgICAgICAlJW1tNVxuIiAvLyBHUkVFTiAzCisJCSJwYW5kICAgICAgICAgICAlMTYsICAgICAgICAgICAgICAgICAgICAlJW1tNFxuIgorCQkicHNyYXcgICAgICAgICAgJDYsICAgICAgICAgICAgICAgICAgICAgJSVtbTNcbiIgLy8gcHNyIDYKKwkJInBzcmF3ICAgICAgICAgICQ2LCAgICAgICAgICAgICAgICAgICAgICUlbW0wXG4iCisJCSJwYW5kICAgICAgICAgICAlMTYsICAgICAgICAgICAgICAgICAgICAlJW1tNlxuIiAvLyBCTFVFCisJCSJwYW5kICAgICAgICAgICAlMTcsICAgICAgICAgICAgICAgICAgICAlJW1tNVxuIgorCQkicHNybHcgICAgICAgICAgJDExLCAgICAgICAgICAgICAgICAgICAgJSVtbTZcbiIgLy8gQkxVRSAgMworCQkicG9yICAgICAgICAgICAgJSVtbTUsICAgICAgICAgICAgICAgICAgJSVtbTRcbiIKKwkJInBzcmF3ICAgICAgICAgICQ2LCAgICAgICAgICAgICAgICAgICAgICUlbW03XG4iCisJCSJwb3IgICAgICAgICAgICAlJW1tNiwgICAgICAgICAgICAgICAgICAlJW1tNFxuIgorCQkicGFja3Vzd2IgICAgICAgJSVtbTMsICAgICAgICAgICAgICAgICAgJSVtbTNcbiIKKwkJInBhY2t1c3diICAgICAgICUlbW0wLCAgICAgICAgICAgICAgICAgICUlbW0wXG4iCisJCSJwYWNrdXN3YiAgICAgICAlJW1tNywgICAgICAgICAgICAgICAgICAlJW1tN1xuIgorCQkicHVucGNrbGJ3ICAgICAgJSVtbTMsICAgICAgICAgICAgICAgICAgJSVtbTNcbiIKKwkJInB1bnBja2xidyAgICAgICUlbW0wLCAgICAgICAgICAgICAgICAgICUlbW0wXG4iCisJCSJwdW5wY2tsYncgICAgICAlJW1tNywgICAgICAgICAgICAgICAgICAlJW1tN1xuIgorCQkicGFuZCAgICAgICAgICAgJTE2LCAgICAgICAgICAgICAgICAgICAgJSVtbTNcbiIKKwkJInBhbmQgICAgICAgICAgICUxNiwgICAgICAgICAgICAgICAgICAgICUlbW03XG4iIC8vIEJMVUUKKwkJInBzbGx3ICAgICAgICAgICQzLCAgICAgICAgICAgICAgICAgICAgICUlbW0wXG4iIC8vIEdSRUVOIDQKKwkJInBzcmx3ICAgICAgICAgICQxMSwgICAgICAgICAgICAgICAgICAgICUlbW03XG4iCisJCSJwYW5kICAgICAgICAgICAlMTcsICAgICAgICAgICAgICAgICAgICAlJW1tMFxuIgorCQkicG9yICAgICAgICAgICAgJSVtbTcsICAgICAgICAgICAgICAgICAgJSVtbTNcbiIKKwkJInBvciAgICAgICAgICAgICUlbW0wLCAgICAgICAgICAgICAgICAgICUlbW0zXG4iCisKKwkJIm1vdnEgICAgICAgICAgICUlbW00LCAgICAgICAgICAgICAgICAgICUlbW01XG4iCisKKwkJInB1bnBja2x3ZCAgICAgICUlbW0zLCAgICAgICAgICAgICAgICAgICUlbW00XG4iCisJCSJwdW5wY2tod2QgICAgICAlJW1tMywgICAgICAgICAgICAgICAgICAlJW1tNVxuIgorCisJCSJtb3ZxICAgICAgICAgICAlJW1tNCwgICAgICAgICAgICAgICAgICAoJTUpXG4iCisJCSJtb3ZxICAgICAgICAgICAlJW1tNSwgICAgICAgICAgICAgICAgICA4KCU1KVxuIgorCisJCSJhZGRsICAgICAgICAgICAkOCwgICAgICAgICAgICAgICAgICAgICAlNlxuIgorCQkiYWRkbCAgICAgICAgICAgJDgsICAgICAgICAgICAgICAgICAgICAgJTJcbiIKKwkJImFkZGwgICAgICAgICAgICQ0LCAgICAgICAgICAgICAgICAgICAgICglJWVzcClcbiIKKwkJImFkZGwgICAgICAgICAgICQ0LCAgICAgICAgICAgICAgICAgICAgICUxXG4iCisJCSJjbXBsICAgICAgICAgICAlNCwgICAgICAgICAgICAgICAgICAgICAlNlxuIgorCQkibGVhbCAgICAgICAgICAgMTYoJTMpLCAgICAgICAgICAgICAgICAgJTNcbiIKKwkJImxlYWwgICAgICAgICAgIDE2KCU1KSwlNVxuIiAvLyByb3cyKzE2CisKKwkJImpsICAgICAgICAgICAgIDFiXG4iCisJCSJhZGRsICAgICAgICAgICAlNCwgICAgICUyXG4iIC8vIGx1bSArPSBjb2xzCisJCSJhZGRsICAgICAgICAgICAlOCwgICAgICUzXG4iIC8vIHJvdzErPSBtb2QKKwkJImFkZGwgICAgICAgICAgICU4LCAgICAgJTVcbiIgLy8gcm93Mis9IG1vZAorCQkibW92bCAgICAgICAgICAgJDAsICAgICAlNlxuIiAvLyB4PTAKKwkJImNtcGwgICAgICAgICAgICU3LCAgICAgJTJcbiIKKwkJImpsICAgICAgICAgICAgIDFiXG4iCisJCSJhZGRsICQ0LCAlJWVzcFxuIiAgLy8gZ2V0IHJpZCBvZiB0aGUgc3RhY2sgc2xvdCB3ZSByZXNlcnZlZC4KKwkJImVtbXNcbiIKKwkJOgorCQk6ICJtIiAoY3IpLCAiciIoY2IpLCJyIihsdW0pLAorCQkgICJyIihyb3cxKSwiciIoY29scyksInIiKHJvdzIpLCJtIih4KSwibSIoeSksIm0iKG1vZCksCisJCSAgIm0iKE1NWF8wMDgwdyksIm0iKE1NWF9VZ3JuNTY1KSwibSIoTU1YX1VibHU1eDUpLAorCQkgICJtIihNTVhfMDBGRncpLCJtIihNTVhfVmdybjU2NSksIm0iKE1NWF9WcmVkNXg1KSwKKwkJICAibSIoTU1YX1ljb2VmZiksIm0iKE1NWF9yZWQ1NjUpLCJtIihNTVhfZ3JuNTY1KQorCSk7Cit9CisKKy8qICpJTkRFTlQtT04qICovCisKKyNlbmRpZiAvKiBHQ0MzIGkzODYgaW5saW5lIGFzc2VtYmx5ICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3l1dl9zdy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfeXV2X3N3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1NWNlMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3l1dl9zdy5jCkBAIC0wLDAgKzEsMTI5OSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgaXMgdGhlIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBZVVYgdmlkZW8gb3ZlcmxheSBzdXBwb3J0ICovCisKKy8qIFRoaXMgY29kZSB3YXMgZGVyaXZlZCBmcm9tIGNvZGUgY2FycnlpbmcgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgbm90aWNlczoKKworICogQ29weXJpZ2h0IChjKSAxOTk1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgYW5kIHdpdGhvdXQgd3JpdHRlbiBhZ3JlZW1lbnQgaXMKKyAqIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nCisgKiB0d28gcGFyYWdyYXBocyBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGlzIHNvZnR3YXJlLgorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgVU5JVkVSU0lUWSBPRiBDQUxJRk9STklBIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SCisgKiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYgVEhFIFVOSVZFUlNJVFkgT0YKKyAqIENBTElGT1JOSUEgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRIRSBVTklWRVJTSVRZIE9GIENBTElGT1JOSUEgU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUworICogT04gQU4gIkFTIElTIiBCQVNJUywgQU5EIFRIRSBVTklWRVJTSVRZIE9GIENBTElGT1JOSUEgSEFTIE5PIE9CTElHQVRJT04gVE8KKyAqIFBST1ZJREUgTUFJTlRFTkFOQ0UsIFNVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywgT1IgTU9ESUZJQ0FUSU9OUy4KKworICogQ29weXJpZ2h0IChjKSAxOTk1IEVyaWsgQ29ycnkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBhbmQgd2l0aG91dCB3cml0dGVuIGFncmVlbWVudCBpcworICogaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcKKyAqIHR3byBwYXJhZ3JhcGhzIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoaXMgc29mdHdhcmUuCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIEVSSUsgQ09SUlkgQkUgTElBQkxFIFRPIEFOWSBQQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwKKyAqIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwgRVZFTiBJRiBFUklLIENPUlJZIEhBUyBCRUVOIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqIAorICogRVJJSyBDT1JSWSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTIE9OIEFOICJBUyBJUyIKKyAqIEJBU0lTLCBBTkQgRVJJSyBDT1JSWSBIQVMgTk8gT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULAorICogVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgorCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIENvcHlyaWdodCAoYykgMTk5NSBCcm93biBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIGFuZCB3aXRob3V0IHdyaXR0ZW4gYWdyZWVtZW50CisgKiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlCisgKiBmb2xsb3dpbmcgdHdvIHBhcmFncmFwaHMgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhpcyBzb2Z0d2FyZS4KKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgQlJPV04gVU5JVkVSU0lUWSBCRSBMSUFCTEUgVE8gQU5ZIFBBUlRZIEZPUgorICogRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLCBFVkVOIElGIEJST1dOCisgKiBVTklWRVJTSVRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogCisgKiBCUk9XTiBVTklWRVJTSVRZIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMgT04gQU4gIkFTIElTIgorICogQkFTSVMsIEFORCBCUk9XTiBVTklWRVJTSVRZIEhBUyBOTyBPQkxJR0FUSU9OIFRPIFBST1ZJREUgTUFJTlRFTkFOQ0UsCisgKiBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCisgKi8KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9jcHVpbmZvLmgiCisjaW5jbHVkZSAiU0RMX3N0cmV0Y2hfYy5oIgorI2luY2x1ZGUgIlNETF95dXZmdW5jcy5oIgorI2luY2x1ZGUgIlNETF95dXZfc3dfYy5oIgorCisvKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gbWFuaXB1bGF0ZSBzb2Z0d2FyZSB2aWRlbyBvdmVybGF5cyAqLworc3RhdGljIHN0cnVjdCBwcml2YXRlX3l1dmh3ZnVuY3Mgc3dfeXV2ZnVuY3MgPSB7CisJU0RMX0xvY2tZVVZfU1csCisJU0RMX1VubG9ja1lVVl9TVywKKwlTRExfRGlzcGxheVlVVl9TVywKKwlTRExfRnJlZVlVVl9TVworfTsKKworLyogUkdCIGNvbnZlcnNpb24gbG9va3VwIHRhYmxlcyAqLworc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhIHsKKwlTRExfU3VyZmFjZSAqc3RyZXRjaDsKKwlTRExfU3VyZmFjZSAqZGlzcGxheTsKKwlVaW50OCAqcGl4ZWxzOworCWludCAqY29sb3J0YWI7CisJVWludDMyICpyZ2JfMl9waXg7CisJdm9pZCAoKkRpc3BsYXkxWCkoaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApOworCXZvaWQgKCpEaXNwbGF5MlgpKGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAorCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApOworCisJLyogVGhlc2UgYXJlIGp1c3Qgc28gd2UgZG9uJ3QgaGF2ZSB0byBhbGxvY2F0ZSB0aGVtIHNlcGFyYXRlbHkgKi8KKwlVaW50MTYgcGl0Y2hlc1szXTsKKwlVaW50OCAqcGxhbmVzWzNdOworfTsKKworCisvKiBUaGUgY29sb3JzcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLworCisjaWYgKF9fR05VQ19fID4gMikgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgX19PUFRJTUlaRV9fICYmIFNETF9BU1NFTUJMWV9ST1VUSU5FUworZXh0ZXJuIHZvaWQgQ29sb3I1NjVEaXRoZXJZVjEyTU1YMVgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKTsKK2V4dGVybiB2b2lkIENvbG9yUkdCRGl0aGVyWVYxMk1NWDFYKCBpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICk7CisjZW5kaWYgCisKK3N0YXRpYyB2b2lkIENvbG9yMTZEaXRoZXJZVjEyTW9kMVgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKQoreworICAgIHVuc2lnbmVkIHNob3J0KiByb3cxOworICAgIHVuc2lnbmVkIHNob3J0KiByb3cyOworICAgIHVuc2lnbmVkIGNoYXIqIGx1bTI7CisgICAgaW50IHgsIHk7CisgICAgaW50IGNyX3I7CisgICAgaW50IGNyYl9nOworICAgIGludCBjYl9iOworICAgIGludCBjb2xzXzIgPSBjb2xzIC8gMjsKKworICAgIHJvdzEgPSAodW5zaWduZWQgc2hvcnQqKSBvdXQ7CisgICAgcm93MiA9IHJvdzEgKyBjb2xzICsgbW9kOworICAgIGx1bTIgPSBsdW0gKyBjb2xzOworCisgICAgbW9kICs9IGNvbHMgKyBtb2Q7CisKKyAgICB5ID0gcm93cyAvIDI7CisgICAgd2hpbGUoIHktLSApCisgICAgeworICAgICAgICB4ID0gY29sc18yOworICAgICAgICB3aGlsZSggeC0tICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7CisKKyAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOworICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOworICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07CisgICAgICAgICAgICArK2NyOyArK2NiOworCisgICAgICAgICAgICBMID0gKmx1bSsrOworICAgICAgICAgICAgKnJvdzErKyA9ICh1bnNpZ25lZCBzaG9ydCkocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKworICAgICAgICAgICAgTCA9ICpsdW0rKzsKKyAgICAgICAgICAgICpyb3cxKysgPSAodW5zaWduZWQgc2hvcnQpKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisKKworICAgICAgICAgICAgLyogTm93LCBkbyBzZWNvbmQgcm93LiAgKi8KKworICAgICAgICAgICAgTCA9ICpsdW0yKys7CisgICAgICAgICAgICAqcm93MisrID0gKHVuc2lnbmVkIHNob3J0KShyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworCisgICAgICAgICAgICBMID0gKmx1bTIrKzsKKyAgICAgICAgICAgICpyb3cyKysgPSAodW5zaWduZWQgc2hvcnQpKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUaGVzZSB2YWx1ZXMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLCAoZHVlCisgICAgICAgICAqIHRvIHRoZSArKydzIGFib3ZlKSxidXQgdGhleSBuZWVkIHRvIGJlIGF0IHRoZSBzdGFydAorICAgICAgICAgKiBvZiB0aGUgbGluZSBhZnRlciB0aGF0LgorICAgICAgICAgKi8KKyAgICAgICAgbHVtICArPSBjb2xzOworICAgICAgICBsdW0yICs9IGNvbHM7CisgICAgICAgIHJvdzEgKz0gbW9kOworICAgICAgICByb3cyICs9IG1vZDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbG9yMjREaXRoZXJZVjEyTW9kMVgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKQoreworICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKKyAgICB1bnNpZ25lZCBjaGFyKiByb3cxOworICAgIHVuc2lnbmVkIGNoYXIqIHJvdzI7CisgICAgdW5zaWduZWQgY2hhciogbHVtMjsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgY3JfcjsKKyAgICBpbnQgY3JiX2c7CisgICAgaW50IGNiX2I7CisgICAgaW50IGNvbHNfMiA9IGNvbHMgLyAyOworCisgICAgcm93MSA9IG91dDsKKyAgICByb3cyID0gcm93MSArIGNvbHMqMyArIG1vZCozOworICAgIGx1bTIgPSBsdW0gKyBjb2xzOworCisgICAgbW9kICs9IGNvbHMgKyBtb2Q7CisgICAgbW9kICo9IDM7CisKKyAgICB5ID0gcm93cyAvIDI7CisgICAgd2hpbGUoIHktLSApCisgICAgeworICAgICAgICB4ID0gY29sc18yOworICAgICAgICB3aGlsZSggeC0tICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7CisKKyAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOworICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOworICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07CisgICAgICAgICAgICArK2NyOyArK2NiOworCisgICAgICAgICAgICBMID0gKmx1bSsrOworICAgICAgICAgICAgdmFsdWUgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKKyAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKyAgICAgICAgICAgICpyb3cxKysgPSAodmFsdWUgICAgICApICYgMHhGRjsKKyAgICAgICAgICAgICpyb3cxKysgPSAodmFsdWUgPj4gIDgpICYgMHhGRjsKKyAgICAgICAgICAgICpyb3cxKysgPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKworICAgICAgICAgICAgTCA9ICpsdW0rKzsKKyAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgICAgICAqcm93MSsrID0gKHZhbHVlICAgICAgKSAmIDB4RkY7CisgICAgICAgICAgICAqcm93MSsrID0gKHZhbHVlID4+ICA4KSAmIDB4RkY7CisgICAgICAgICAgICAqcm93MSsrID0gKHZhbHVlID4+IDE2KSAmIDB4RkY7CisKKworICAgICAgICAgICAgLyogTm93LCBkbyBzZWNvbmQgcm93LiAgKi8KKworICAgICAgICAgICAgTCA9ICpsdW0yKys7CisgICAgICAgICAgICB2YWx1ZSA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAorICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworICAgICAgICAgICAgKnJvdzIrKyA9ICh2YWx1ZSAgICAgICkgJiAweEZGOworICAgICAgICAgICAgKnJvdzIrKyA9ICh2YWx1ZSA+PiAgOCkgJiAweEZGOworICAgICAgICAgICAgKnJvdzIrKyA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCisgICAgICAgICAgICBMID0gKmx1bTIrKzsKKyAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgICAgICAqcm93MisrID0gKHZhbHVlICAgICAgKSAmIDB4RkY7CisgICAgICAgICAgICAqcm93MisrID0gKHZhbHVlID4+ICA4KSAmIDB4RkY7CisgICAgICAgICAgICAqcm93MisrID0gKHZhbHVlID4+IDE2KSAmIDB4RkY7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUaGVzZSB2YWx1ZXMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLCAoZHVlCisgICAgICAgICAqIHRvIHRoZSArKydzIGFib3ZlKSxidXQgdGhleSBuZWVkIHRvIGJlIGF0IHRoZSBzdGFydAorICAgICAgICAgKiBvZiB0aGUgbGluZSBhZnRlciB0aGF0LgorICAgICAgICAgKi8KKyAgICAgICAgbHVtICArPSBjb2xzOworICAgICAgICBsdW0yICs9IGNvbHM7CisgICAgICAgIHJvdzEgKz0gbW9kOworICAgICAgICByb3cyICs9IG1vZDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbG9yMzJEaXRoZXJZVjEyTW9kMVgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKQoreworICAgIHVuc2lnbmVkIGludCogcm93MTsKKyAgICB1bnNpZ25lZCBpbnQqIHJvdzI7CisgICAgdW5zaWduZWQgY2hhciogbHVtMjsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgY3JfcjsKKyAgICBpbnQgY3JiX2c7CisgICAgaW50IGNiX2I7CisgICAgaW50IGNvbHNfMiA9IGNvbHMgLyAyOworCisgICAgcm93MSA9ICh1bnNpZ25lZCBpbnQqKSBvdXQ7CisgICAgcm93MiA9IHJvdzEgKyBjb2xzICsgbW9kOworICAgIGx1bTIgPSBsdW0gKyBjb2xzOworCisgICAgbW9kICs9IGNvbHMgKyBtb2Q7CisKKyAgICB5ID0gcm93cyAvIDI7CisgICAgd2hpbGUoIHktLSApCisgICAgeworICAgICAgICB4ID0gY29sc18yOworICAgICAgICB3aGlsZSggeC0tICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7CisKKyAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOworICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOworICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07CisgICAgICAgICAgICArK2NyOyArK2NiOworCisgICAgICAgICAgICBMID0gKmx1bSsrOworICAgICAgICAgICAgKnJvdzErKyA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAorICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKworICAgICAgICAgICAgTCA9ICpsdW0rKzsKKyAgICAgICAgICAgICpyb3cxKysgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisKKworICAgICAgICAgICAgLyogTm93LCBkbyBzZWNvbmQgcm93LiAgKi8KKworICAgICAgICAgICAgTCA9ICpsdW0yKys7CisgICAgICAgICAgICAqcm93MisrID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworCisgICAgICAgICAgICBMID0gKmx1bTIrKzsKKyAgICAgICAgICAgICpyb3cyKysgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUaGVzZSB2YWx1ZXMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLCAoZHVlCisgICAgICAgICAqIHRvIHRoZSArKydzIGFib3ZlKSxidXQgdGhleSBuZWVkIHRvIGJlIGF0IHRoZSBzdGFydAorICAgICAgICAgKiBvZiB0aGUgbGluZSBhZnRlciB0aGF0LgorICAgICAgICAgKi8KKyAgICAgICAgbHVtICArPSBjb2xzOworICAgICAgICBsdW0yICs9IGNvbHM7CisgICAgICAgIHJvdzEgKz0gbW9kOworICAgICAgICByb3cyICs9IG1vZDsKKyAgICB9Cit9CisKKy8qCisgKiBJbiB0aGlzIGZ1bmN0aW9uIEkgbWFrZSB1c2Ugb2YgYSBuYXN0eSB0cmljay4gVGhlIHRhYmxlcyBoYXZlIHRoZSBsb3dlcgorICogMTYgYml0cyByZXBsaWNhdGVkIGluIHRoZSB1cHBlciAxNi4gVGhpcyBtZWFucyBJIGNhbiB3cml0ZSBpbnRzIGFuZCBnZXQKKyAqIHRoZSBob3Jpc29udGFsIGRvdWJsaW5nIGZvciBmcmVlIChhbG1vc3QpLgorICovCitzdGF0aWMgdm9pZCBDb2xvcjE2RGl0aGVyWVYxMk1vZDJYKCBpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICkKK3sKKyAgICB1bnNpZ25lZCBpbnQqIHJvdzEgPSAodW5zaWduZWQgaW50Kikgb3V0OworICAgIGNvbnN0IGludCBuZXh0X3JvdyA9IGNvbHMrKG1vZC8yKTsKKyAgICB1bnNpZ25lZCBpbnQqIHJvdzIgPSByb3cxICsgMipuZXh0X3JvdzsKKyAgICB1bnNpZ25lZCBjaGFyKiBsdW0yOworICAgIGludCB4LCB5OworICAgIGludCBjcl9yOworICAgIGludCBjcmJfZzsKKyAgICBpbnQgY2JfYjsKKyAgICBpbnQgY29sc18yID0gY29scyAvIDI7CisKKyAgICBsdW0yID0gbHVtICsgY29sczsKKworICAgIG1vZCA9IChuZXh0X3JvdyAqIDMpICsgKG1vZC8yKTsKKworICAgIHkgPSByb3dzIC8gMjsKKyAgICB3aGlsZSggeS0tICkKKyAgICB7CisgICAgICAgIHggPSBjb2xzXzI7CisgICAgICAgIHdoaWxlKCB4LS0gKQorICAgICAgICB7CisgICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKKworICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07CisgICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07CisgICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKKyAgICAgICAgICAgICsrY3I7ICsrY2I7CisKKyAgICAgICAgICAgIEwgPSAqbHVtKys7CisgICAgICAgICAgICByb3cxWzBdID0gcm93MVtuZXh0X3Jvd10gPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworICAgICAgICAgICAgcm93MSsrOworCisgICAgICAgICAgICBMID0gKmx1bSsrOworICAgICAgICAgICAgcm93MVswXSA9IHJvdzFbbmV4dF9yb3ddID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKyAgICAgICAgICAgIHJvdzErKzsKKworCisgICAgICAgICAgICAvKiBOb3csIGRvIHNlY29uZCByb3cuICovCisKKyAgICAgICAgICAgIEwgPSAqbHVtMisrOworICAgICAgICAgICAgcm93MlswXSA9IHJvdzJbbmV4dF9yb3ddID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKyAgICAgICAgICAgIHJvdzIrKzsKKworICAgICAgICAgICAgTCA9ICpsdW0yKys7CisgICAgICAgICAgICByb3cyWzBdID0gcm93MltuZXh0X3Jvd10gPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworICAgICAgICAgICAgcm93MisrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlc2UgdmFsdWVzIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbGluZSwgKGR1ZQorICAgICAgICAgKiB0byB0aGUgKysncyBhYm92ZSksYnV0IHRoZXkgbmVlZCB0byBiZSBhdCB0aGUgc3RhcnQKKyAgICAgICAgICogb2YgdGhlIGxpbmUgYWZ0ZXIgdGhhdC4KKyAgICAgICAgICovCisgICAgICAgIGx1bSAgKz0gY29sczsKKyAgICAgICAgbHVtMiArPSBjb2xzOworICAgICAgICByb3cxICs9IG1vZDsKKyAgICAgICAgcm93MiArPSBtb2Q7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBDb2xvcjI0RGl0aGVyWVYxMk1vZDJYKCBpbnQgKmNvbG9ydGFiLCBVaW50MzIgKnJnYl8yX3BpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmx1bSwgdW5zaWduZWQgY2hhciAqY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjYiwgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgbW9kICkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdmFsdWU7CisgICAgdW5zaWduZWQgY2hhciogcm93MSA9IG91dDsKKyAgICBjb25zdCBpbnQgbmV4dF9yb3cgPSAoY29scyoyICsgbW9kKSAqIDM7CisgICAgdW5zaWduZWQgY2hhciogcm93MiA9IHJvdzEgKyAyKm5leHRfcm93OworICAgIHVuc2lnbmVkIGNoYXIqIGx1bTI7CisgICAgaW50IHgsIHk7CisgICAgaW50IGNyX3I7CisgICAgaW50IGNyYl9nOworICAgIGludCBjYl9iOworICAgIGludCBjb2xzXzIgPSBjb2xzIC8gMjsKKworICAgIGx1bTIgPSBsdW0gKyBjb2xzOworCisgICAgbW9kID0gbmV4dF9yb3cqMyArIG1vZCozOworCisgICAgeSA9IHJvd3MgLyAyOworICAgIHdoaWxlKCB5LS0gKQorICAgIHsKKyAgICAgICAgeCA9IGNvbHNfMjsKKyAgICAgICAgd2hpbGUoIHgtLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGludCBMOworCisgICAgICAgICAgICBjcl9yICAgPSAwKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMCoyNTYgXTsKKyAgICAgICAgICAgIGNyYl9nICA9IDEqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAxKjI1NiBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb2xvcnRhYlsgKmNiICsgMioyNTYgXTsKKyAgICAgICAgICAgIGNiX2IgICA9IDIqNzY4KzI1NiArIGNvbG9ydGFiWyAqY2IgKyAzKjI1NiBdOworICAgICAgICAgICAgKytjcjsgKytjYjsKKworICAgICAgICAgICAgTCA9ICpsdW0rKzsKKyAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgICAgICByb3cxWzArMF0gPSByb3cxWzMrMF0gPSByb3cxW25leHRfcm93KzBdID0gcm93MVtuZXh0X3JvdyszKzBdID0KKyAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAgICAgICkgJiAweEZGOworICAgICAgICAgICAgcm93MVswKzFdID0gcm93MVszKzFdID0gcm93MVtuZXh0X3JvdysxXSA9IHJvdzFbbmV4dF9yb3crMysxXSA9CisgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPj4gIDgpICYgMHhGRjsKKyAgICAgICAgICAgIHJvdzFbMCsyXSA9IHJvdzFbMysyXSA9IHJvdzFbbmV4dF9yb3crMl0gPSByb3cxW25leHRfcm93KzMrMl0gPQorICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICByb3cxICs9IDIqMzsKKworICAgICAgICAgICAgTCA9ICpsdW0rKzsKKyAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgICAgICByb3cxWzArMF0gPSByb3cxWzMrMF0gPSByb3cxW25leHRfcm93KzBdID0gcm93MVtuZXh0X3JvdyszKzBdID0KKyAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAgICAgICkgJiAweEZGOworICAgICAgICAgICAgcm93MVswKzFdID0gcm93MVszKzFdID0gcm93MVtuZXh0X3JvdysxXSA9IHJvdzFbbmV4dF9yb3crMysxXSA9CisgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPj4gIDgpICYgMHhGRjsKKyAgICAgICAgICAgIHJvdzFbMCsyXSA9IHJvdzFbMysyXSA9IHJvdzFbbmV4dF9yb3crMl0gPSByb3cxW25leHRfcm93KzMrMl0gPQorICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICByb3cxICs9IDIqMzsKKworCisgICAgICAgICAgICAvKiBOb3csIGRvIHNlY29uZCByb3cuICovCisKKyAgICAgICAgICAgIEwgPSAqbHVtMisrOworICAgICAgICAgICAgdmFsdWUgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKKyAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKyAgICAgICAgICAgIHJvdzJbMCswXSA9IHJvdzJbMyswXSA9IHJvdzJbbmV4dF9yb3crMF0gPSByb3cyW25leHRfcm93KzMrMF0gPQorICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICAgICAgKSAmIDB4RkY7CisgICAgICAgICAgICByb3cyWzArMV0gPSByb3cyWzMrMV0gPSByb3cyW25leHRfcm93KzFdID0gcm93MltuZXh0X3JvdyszKzFdID0KKyAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA+PiAgOCkgJiAweEZGOworICAgICAgICAgICAgcm93MlswKzJdID0gcm93MlszKzJdID0gcm93MltuZXh0X3JvdysyXSA9IHJvdzJbbmV4dF9yb3crMysyXSA9CisgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHJvdzIgKz0gMiozOworCisgICAgICAgICAgICBMID0gKmx1bTIrKzsKKyAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgICAgICByb3cyWzArMF0gPSByb3cyWzMrMF0gPSByb3cyW25leHRfcm93KzBdID0gcm93MltuZXh0X3JvdyszKzBdID0KKyAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAgICAgICkgJiAweEZGOworICAgICAgICAgICAgcm93MlswKzFdID0gcm93MlszKzFdID0gcm93MltuZXh0X3JvdysxXSA9IHJvdzJbbmV4dF9yb3crMysxXSA9CisgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPj4gIDgpICYgMHhGRjsKKyAgICAgICAgICAgIHJvdzJbMCsyXSA9IHJvdzJbMysyXSA9IHJvdzJbbmV4dF9yb3crMl0gPSByb3cyW25leHRfcm93KzMrMl0gPQorICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICByb3cyICs9IDIqMzsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZXNlIHZhbHVlcyBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUsIChkdWUKKyAgICAgICAgICogdG8gdGhlICsrJ3MgYWJvdmUpLGJ1dCB0aGV5IG5lZWQgdG8gYmUgYXQgdGhlIHN0YXJ0CisgICAgICAgICAqIG9mIHRoZSBsaW5lIGFmdGVyIHRoYXQuCisgICAgICAgICAqLworICAgICAgICBsdW0gICs9IGNvbHM7CisgICAgICAgIGx1bTIgKz0gY29sczsKKyAgICAgICAgcm93MSArPSBtb2Q7CisgICAgICAgIHJvdzIgKz0gbW9kOworICAgIH0KK30KKworc3RhdGljIHZvaWQgQ29sb3IzMkRpdGhlcllWMTJNb2QyWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCit7CisgICAgdW5zaWduZWQgaW50KiByb3cxID0gKHVuc2lnbmVkIGludCopIG91dDsKKyAgICBjb25zdCBpbnQgbmV4dF9yb3cgPSBjb2xzKjIrbW9kOworICAgIHVuc2lnbmVkIGludCogcm93MiA9IHJvdzEgKyAyKm5leHRfcm93OworICAgIHVuc2lnbmVkIGNoYXIqIGx1bTI7CisgICAgaW50IHgsIHk7CisgICAgaW50IGNyX3I7CisgICAgaW50IGNyYl9nOworICAgIGludCBjYl9iOworICAgIGludCBjb2xzXzIgPSBjb2xzIC8gMjsKKworICAgIGx1bTIgPSBsdW0gKyBjb2xzOworCisgICAgbW9kID0gKG5leHRfcm93ICogMykgKyBtb2Q7CisKKyAgICB5ID0gcm93cyAvIDI7CisgICAgd2hpbGUoIHktLSApCisgICAgeworICAgICAgICB4ID0gY29sc18yOworICAgICAgICB3aGlsZSggeC0tICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7CisKKyAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOworICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOworICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07CisgICAgICAgICAgICArK2NyOyArK2NiOworCisgICAgICAgICAgICBMID0gKmx1bSsrOworICAgICAgICAgICAgcm93MVswXSA9IHJvdzFbMV0gPSByb3cxW25leHRfcm93XSA9IHJvdzFbbmV4dF9yb3crMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKyAgICAgICAgICAgIHJvdzEgKz0gMjsKKworICAgICAgICAgICAgTCA9ICpsdW0rKzsKKyAgICAgICAgICAgIHJvdzFbMF0gPSByb3cxWzFdID0gcm93MVtuZXh0X3Jvd10gPSByb3cxW25leHRfcm93KzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgICAgICByb3cxICs9IDI7CisKKworICAgICAgICAgICAgLyogTm93LCBkbyBzZWNvbmQgcm93LiAqLworCisgICAgICAgICAgICBMID0gKmx1bTIrKzsKKyAgICAgICAgICAgIHJvdzJbMF0gPSByb3cyWzFdID0gcm93MltuZXh0X3Jvd10gPSByb3cyW25leHRfcm93KzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgICAgICByb3cyICs9IDI7CisKKyAgICAgICAgICAgIEwgPSAqbHVtMisrOworICAgICAgICAgICAgcm93MlswXSA9IHJvdzJbMV0gPSByb3cyW25leHRfcm93XSA9IHJvdzJbbmV4dF9yb3crMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKyAgICAgICAgICAgIHJvdzIgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZXNlIHZhbHVlcyBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUsIChkdWUKKyAgICAgICAgICogdG8gdGhlICsrJ3MgYWJvdmUpLGJ1dCB0aGV5IG5lZWQgdG8gYmUgYXQgdGhlIHN0YXJ0CisgICAgICAgICAqIG9mIHRoZSBsaW5lIGFmdGVyIHRoYXQuCisgICAgICAgICAqLworICAgICAgICBsdW0gICs9IGNvbHM7CisgICAgICAgIGx1bTIgKz0gY29sczsKKyAgICAgICAgcm93MSArPSBtb2Q7CisgICAgICAgIHJvdzIgKz0gbW9kOworICAgIH0KK30KKworc3RhdGljIHZvaWQgQ29sb3IxNkRpdGhlcllVWTJNb2QxWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCit7CisgICAgdW5zaWduZWQgc2hvcnQqIHJvdzsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgY3JfcjsKKyAgICBpbnQgY3JiX2c7CisgICAgaW50IGNiX2I7CisgICAgaW50IGNvbHNfMiA9IGNvbHMgLyAyOworCisgICAgcm93ID0gKHVuc2lnbmVkIHNob3J0Kikgb3V0OworCisgICAgeSA9IHJvd3M7CisgICAgd2hpbGUoIHktLSApCisgICAgeworICAgICAgICB4ID0gY29sc18yOworICAgICAgICB3aGlsZSggeC0tICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7CisKKyAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOworICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOworICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07CisgICAgICAgICAgICBjciArPSA0OyBjYiArPSA0OworCisgICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7CisgICAgICAgICAgICAqcm93KysgPSAodW5zaWduZWQgc2hvcnQpKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworCisgICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7CisgICAgICAgICAgICAqcm93KysgPSAodW5zaWduZWQgc2hvcnQpKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworCisgICAgICAgIH0KKworICAgICAgICByb3cgKz0gbW9kOworICAgIH0KK30KKworc3RhdGljIHZvaWQgQ29sb3IyNERpdGhlcllVWTJNb2QxWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCit7CisgICAgdW5zaWduZWQgaW50IHZhbHVlOworICAgIHVuc2lnbmVkIGNoYXIqIHJvdzsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgY3JfcjsKKyAgICBpbnQgY3JiX2c7CisgICAgaW50IGNiX2I7CisgICAgaW50IGNvbHNfMiA9IGNvbHMgLyAyOworCisgICAgcm93ID0gKHVuc2lnbmVkIGNoYXIqKSBvdXQ7CisgICAgbW9kICo9IDM7CisgICAgeSA9IHJvd3M7CisgICAgd2hpbGUoIHktLSApCisgICAgeworICAgICAgICB4ID0gY29sc18yOworICAgICAgICB3aGlsZSggeC0tICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7CisKKyAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOworICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOworICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07CisgICAgICAgICAgICBjciArPSA0OyBjYiArPSA0OworCisgICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7CisgICAgICAgICAgICB2YWx1ZSA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAorICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworICAgICAgICAgICAgKnJvdysrID0gKHZhbHVlICAgICAgKSAmIDB4RkY7CisgICAgICAgICAgICAqcm93KysgPSAodmFsdWUgPj4gIDgpICYgMHhGRjsKKyAgICAgICAgICAgICpyb3crKyA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCisgICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7CisgICAgICAgICAgICB2YWx1ZSA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAorICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworICAgICAgICAgICAgKnJvdysrID0gKHZhbHVlICAgICAgKSAmIDB4RkY7CisgICAgICAgICAgICAqcm93KysgPSAodmFsdWUgPj4gIDgpICYgMHhGRjsKKyAgICAgICAgICAgICpyb3crKyA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCisgICAgICAgIH0KKyAgICAgICAgcm93ICs9IG1vZDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbG9yMzJEaXRoZXJZVVkyTW9kMVgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKQoreworICAgIHVuc2lnbmVkIGludCogcm93OworICAgIGludCB4LCB5OworICAgIGludCBjcl9yOworICAgIGludCBjcmJfZzsKKyAgICBpbnQgY2JfYjsKKyAgICBpbnQgY29sc18yID0gY29scyAvIDI7CisKKyAgICByb3cgPSAodW5zaWduZWQgaW50Kikgb3V0OworICAgIHkgPSByb3dzOworICAgIHdoaWxlKCB5LS0gKQorICAgIHsKKyAgICAgICAgeCA9IGNvbHNfMjsKKyAgICAgICAgd2hpbGUoIHgtLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGludCBMOworCisgICAgICAgICAgICBjcl9yICAgPSAwKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMCoyNTYgXTsKKyAgICAgICAgICAgIGNyYl9nICA9IDEqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAxKjI1NiBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb2xvcnRhYlsgKmNiICsgMioyNTYgXTsKKyAgICAgICAgICAgIGNiX2IgICA9IDIqNzY4KzI1NiArIGNvbG9ydGFiWyAqY2IgKyAzKjI1NiBdOworICAgICAgICAgICAgY3IgKz0gNDsgY2IgKz0gNDsKKworICAgICAgICAgICAgTCA9ICpsdW07IGx1bSArPSAyOworICAgICAgICAgICAgKnJvdysrID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworCisgICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7CisgICAgICAgICAgICAqcm93KysgPSAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisKKworICAgICAgICB9CisgICAgICAgIHJvdyArPSBtb2Q7CisgICAgfQorfQorCisvKgorICogSW4gdGhpcyBmdW5jdGlvbiBJIG1ha2UgdXNlIG9mIGEgbmFzdHkgdHJpY2suIFRoZSB0YWJsZXMgaGF2ZSB0aGUgbG93ZXIKKyAqIDE2IGJpdHMgcmVwbGljYXRlZCBpbiB0aGUgdXBwZXIgMTYuIFRoaXMgbWVhbnMgSSBjYW4gd3JpdGUgaW50cyBhbmQgZ2V0CisgKiB0aGUgaG9yaXNvbnRhbCBkb3VibGluZyBmb3IgZnJlZSAoYWxtb3N0KS4KKyAqLworc3RhdGljIHZvaWQgQ29sb3IxNkRpdGhlcllVWTJNb2QyWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCit7CisgICAgdW5zaWduZWQgaW50KiByb3cgPSAodW5zaWduZWQgaW50Kikgb3V0OworICAgIGNvbnN0IGludCBuZXh0X3JvdyA9IGNvbHMrKG1vZC8yKTsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgY3JfcjsKKyAgICBpbnQgY3JiX2c7CisgICAgaW50IGNiX2I7CisgICAgaW50IGNvbHNfMiA9IGNvbHMgLyAyOworCisgICAgeSA9IHJvd3M7CisgICAgd2hpbGUoIHktLSApCisgICAgeworICAgICAgICB4ID0gY29sc18yOworICAgICAgICB3aGlsZSggeC0tICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7CisKKyAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOworICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOworICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07CisgICAgICAgICAgICBjciArPSA0OyBjYiArPSA0OworCisgICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7CisgICAgICAgICAgICByb3dbMF0gPSByb3dbbmV4dF9yb3ddID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKyAgICAgICAgICAgIHJvdysrOworCisgICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7CisgICAgICAgICAgICByb3dbMF0gPSByb3dbbmV4dF9yb3ddID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY2JfYiBdKTsKKyAgICAgICAgICAgIHJvdysrOworCisgICAgICAgIH0KKyAgICAgICAgcm93ICs9IG5leHRfcm93OworICAgIH0KK30KKworc3RhdGljIHZvaWQgQ29sb3IyNERpdGhlcllVWTJNb2QyWCggaW50ICpjb2xvcnRhYiwgVWludDMyICpyZ2JfMl9waXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW0sIHVuc2lnbmVkIGNoYXIgKmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2IsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgaW50IG1vZCApCit7CisgICAgdW5zaWduZWQgaW50IHZhbHVlOworICAgIHVuc2lnbmVkIGNoYXIqIHJvdyA9IG91dDsKKyAgICBjb25zdCBpbnQgbmV4dF9yb3cgPSAoY29scyoyICsgbW9kKSAqIDM7CisgICAgaW50IHgsIHk7CisgICAgaW50IGNyX3I7CisgICAgaW50IGNyYl9nOworICAgIGludCBjYl9iOworICAgIGludCBjb2xzXzIgPSBjb2xzIC8gMjsKKyAgICB5ID0gcm93czsKKyAgICB3aGlsZSggeS0tICkKKyAgICB7CisgICAgICAgIHggPSBjb2xzXzI7CisgICAgICAgIHdoaWxlKCB4LS0gKQorICAgICAgICB7CisgICAgICAgICAgICByZWdpc3RlciBpbnQgTDsKKworICAgICAgICAgICAgY3JfciAgID0gMCo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDAqMjU2IF07CisgICAgICAgICAgICBjcmJfZyAgPSAxKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNyICsgMSoyNTYgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3J0YWJbICpjYiArIDIqMjU2IF07CisgICAgICAgICAgICBjYl9iICAgPSAyKjc2OCsyNTYgKyBjb2xvcnRhYlsgKmNiICsgMyoyNTYgXTsKKyAgICAgICAgICAgIGNyICs9IDQ7IGNiICs9IDQ7CisKKyAgICAgICAgICAgIEwgPSAqbHVtOyBsdW0gKz0gMjsKKyAgICAgICAgICAgIHZhbHVlID0gKHJnYl8yX3BpeFsgTCArIGNyX3IgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgICAgICByb3dbMCswXSA9IHJvd1szKzBdID0gcm93W25leHRfcm93KzBdID0gcm93W25leHRfcm93KzMrMF0gPQorICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICAgICAgKSAmIDB4RkY7CisgICAgICAgICAgICByb3dbMCsxXSA9IHJvd1szKzFdID0gcm93W25leHRfcm93KzFdID0gcm93W25leHRfcm93KzMrMV0gPQorICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID4+ICA4KSAmIDB4RkY7CisgICAgICAgICAgICByb3dbMCsyXSA9IHJvd1szKzJdID0gcm93W25leHRfcm93KzJdID0gcm93W25leHRfcm93KzMrMl0gPQorICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICByb3cgKz0gMiozOworCisgICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7CisgICAgICAgICAgICB2YWx1ZSA9IChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAorICAgICAgICAgICAgICAgICAgICAgcmdiXzJfcGl4WyBMICsgY3JiX2cgXSB8CisgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworICAgICAgICAgICAgcm93WzArMF0gPSByb3dbMyswXSA9IHJvd1tuZXh0X3JvdyswXSA9IHJvd1tuZXh0X3JvdyszKzBdID0KKyAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAgICAgICkgJiAweEZGOworICAgICAgICAgICAgcm93WzArMV0gPSByb3dbMysxXSA9IHJvd1tuZXh0X3JvdysxXSA9IHJvd1tuZXh0X3JvdyszKzFdID0KKyAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA+PiAgOCkgJiAweEZGOworICAgICAgICAgICAgcm93WzArMl0gPSByb3dbMysyXSA9IHJvd1tuZXh0X3JvdysyXSA9IHJvd1tuZXh0X3JvdyszKzJdID0KKyAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgcm93ICs9IDIqMzsKKworICAgICAgICB9CisgICAgICAgIHJvdyArPSBuZXh0X3JvdzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbG9yMzJEaXRoZXJZVVkyTW9kMlgoIGludCAqY29sb3J0YWIsIFVpbnQzMiAqcmdiXzJfcGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbHVtLCB1bnNpZ25lZCBjaGFyICpjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNiLCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMsIGludCBtb2QgKQoreworICAgIHVuc2lnbmVkIGludCogcm93ID0gKHVuc2lnbmVkIGludCopIG91dDsKKyAgICBjb25zdCBpbnQgbmV4dF9yb3cgPSBjb2xzKjIrbW9kOworICAgIGludCB4LCB5OworICAgIGludCBjcl9yOworICAgIGludCBjcmJfZzsKKyAgICBpbnQgY2JfYjsKKyAgICBpbnQgY29sc18yID0gY29scyAvIDI7CisgICAgbW9kKz1tb2Q7CisgICAgeSA9IHJvd3M7CisgICAgd2hpbGUoIHktLSApCisgICAgeworICAgICAgICB4ID0gY29sc18yOworICAgICAgICB3aGlsZSggeC0tICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IEw7CisKKyAgICAgICAgICAgIGNyX3IgICA9IDAqNzY4KzI1NiArIGNvbG9ydGFiWyAqY3IgKyAwKjI1NiBdOworICAgICAgICAgICAgY3JiX2cgID0gMSo3NjgrMjU2ICsgY29sb3J0YWJbICpjciArIDEqMjU2IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbG9ydGFiWyAqY2IgKyAyKjI1NiBdOworICAgICAgICAgICAgY2JfYiAgID0gMio3NjgrMjU2ICsgY29sb3J0YWJbICpjYiArIDMqMjU2IF07CisgICAgICAgICAgICBjciArPSA0OyBjYiArPSA0OworCisgICAgICAgICAgICBMID0gKmx1bTsgbHVtICs9IDI7CisgICAgICAgICAgICByb3dbMF0gPSByb3dbMV0gPSByb3dbbmV4dF9yb3ddID0gcm93W25leHRfcm93KzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZ2JfMl9waXhbIEwgKyBjcl9yIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNyYl9nIF0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl8yX3BpeFsgTCArIGNiX2IgXSk7CisgICAgICAgICAgICByb3cgKz0gMjsKKworICAgICAgICAgICAgTCA9ICpsdW07IGx1bSArPSAyOworICAgICAgICAgICAgcm93WzBdID0gcm93WzFdID0gcm93W25leHRfcm93XSA9IHJvd1tuZXh0X3JvdysxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmdiXzJfcGl4WyBMICsgY3JfciBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjcmJfZyBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JfMl9waXhbIEwgKyBjYl9iIF0pOworICAgICAgICAgICAgcm93ICs9IDI7CisKKworICAgICAgICB9CisKKyAgICAgICAgcm93ICs9IG5leHRfcm93OworICAgIH0KK30KKworLyoKKyAqIEhvdyBtYW55IDEgYml0cyBhcmUgdGhlcmUgaW4gdGhlIFVpbnQzMi4KKyAqIExvdyBwZXJmb3JtYW5jZSwgZG8gbm90IGNhbGwgb2Z0ZW4uCisgKi8KK3N0YXRpYyBpbnQgbnVtYmVyX29mX2JpdHNfc2V0KCBVaW50MzIgYSApCit7CisgICAgaWYoIWEpIHJldHVybiAwOworICAgIGlmKGEgJiAxKSByZXR1cm4gMSArIG51bWJlcl9vZl9iaXRzX3NldChhID4+IDEpOworICAgIHJldHVybihudW1iZXJfb2ZfYml0c19zZXQoYSA+PiAxKSk7Cit9CisKKy8qCisgKiBIb3cgbWFueSAwIGJpdHMgYXJlIHRoZXJlIGF0IGxlYXN0IHNpZ25pZmljYW50IGVuZCBvZiBVaW50MzIuCisgKiBMb3cgcGVyZm9ybWFuY2UsIGRvIG5vdCBjYWxsIG9mdGVuLgorICovCitzdGF0aWMgaW50IGZyZWVfYml0c19hdF9ib3R0b20oIFVpbnQzMiBhICkKK3sKKyAgICAgIC8qIGFzc3VtZSBjaGFyIGlzIDggYml0cyAqLworICAgIGlmKCFhKSByZXR1cm4gc2l6ZW9mKFVpbnQzMikgKiA4OworICAgIGlmKCgoU2ludDMyKWEpICYgMWwpIHJldHVybiAwOworICAgIHJldHVybiAxICsgZnJlZV9iaXRzX2F0X2JvdHRvbSAoIGEgPj4gMSk7Cit9CisKKworU0RMX092ZXJsYXkgKlNETF9DcmVhdGVZVVZfU1coX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpCit7CisJU0RMX092ZXJsYXkgKm92ZXJsYXk7CisJc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICpzd2RhdGE7CisJaW50ICpDcl9yX3RhYjsKKwlpbnQgKkNyX2dfdGFiOworCWludCAqQ2JfZ190YWI7CisJaW50ICpDYl9iX3RhYjsKKwlVaW50MzIgKnJfMl9waXhfYWxsb2M7CisJVWludDMyICpnXzJfcGl4X2FsbG9jOworCVVpbnQzMiAqYl8yX3BpeF9hbGxvYzsKKwlpbnQgaTsKKwlpbnQgQ1IsIENCOworCVVpbnQzMiBSbWFzaywgR21hc2ssIEJtYXNrOworCisJLyogT25seSBSR0IgcGFja2VkIHBpeGVsIGNvbnZlcnNpb24gc3VwcG9ydGVkICovCisJaWYgKCAoZGlzcGxheS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsICE9IDIpICYmCisJICAgICAoZGlzcGxheS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsICE9IDMpICYmCisJICAgICAoZGlzcGxheS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsICE9IDQpICkgeworCQlTRExfU2V0RXJyb3IoIkNhbid0IHVzZSBZVVYgZGF0YSBvbiBub24gMTYvMjQvMzIgYml0IHN1cmZhY2VzIik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBWZXJpZnkgdGhhdCB3ZSBzdXBwb3J0IHRoZSBmb3JtYXQgKi8KKwlzd2l0Y2ggKGZvcm1hdCkgeworCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6CisJICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKKwkgICAgY2FzZSBTRExfWVVZMl9PVkVSTEFZOgorCSAgICBjYXNlIFNETF9VWVZZX09WRVJMQVk6CisJICAgIGNhc2UgU0RMX1lWWVVfT1ZFUkxBWToKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgWVVWIGZvcm1hdCIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogQ3JlYXRlIHRoZSBvdmVybGF5IHN0cnVjdHVyZSAqLworCW92ZXJsYXkgPSAoU0RMX092ZXJsYXkgKilTRExfbWFsbG9jKHNpemVvZiAqb3ZlcmxheSk7CisJaWYgKCBvdmVybGF5ID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCVNETF9tZW1zZXQob3ZlcmxheSwgMCwgKHNpemVvZiAqb3ZlcmxheSkpOworCisJLyogRmlsbCBpbiB0aGUgYmFzaWMgbWVtYmVycyAqLworCW92ZXJsYXktPmZvcm1hdCA9IGZvcm1hdDsKKwlvdmVybGF5LT53ID0gd2lkdGg7CisJb3ZlcmxheS0+aCA9IGhlaWdodDsKKworCS8qIFNldCB1cCB0aGUgWVVWIHN1cmZhY2UgZnVuY3Rpb24gc3RydWN0dXJlICovCisJb3ZlcmxheS0+aHdmdW5jcyA9ICZzd195dXZmdW5jczsKKworCS8qIENyZWF0ZSB0aGUgcGl4ZWwgZGF0YSBhbmQgbG9va3VwIHRhYmxlcyAqLworCXN3ZGF0YSA9IChzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKilTRExfbWFsbG9jKHNpemVvZiAqc3dkYXRhKTsKKwlvdmVybGF5LT5od2RhdGEgPSBzd2RhdGE7CisJaWYgKCBzd2RhdGEgPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlzd2RhdGEtPnN0cmV0Y2ggPSBOVUxMOworCXN3ZGF0YS0+ZGlzcGxheSA9IGRpc3BsYXk7CisJc3dkYXRhLT5waXhlbHMgPSAoVWludDggKikgU0RMX21hbGxvYyh3aWR0aCpoZWlnaHQqMik7CisJc3dkYXRhLT5jb2xvcnRhYiA9IChpbnQgKilTRExfbWFsbG9jKDQqMjU2KnNpemVvZihpbnQpKTsKKwlDcl9yX3RhYiA9ICZzd2RhdGEtPmNvbG9ydGFiWzAqMjU2XTsKKwlDcl9nX3RhYiA9ICZzd2RhdGEtPmNvbG9ydGFiWzEqMjU2XTsKKwlDYl9nX3RhYiA9ICZzd2RhdGEtPmNvbG9ydGFiWzIqMjU2XTsKKwlDYl9iX3RhYiA9ICZzd2RhdGEtPmNvbG9ydGFiWzMqMjU2XTsKKwlzd2RhdGEtPnJnYl8yX3BpeCA9IChVaW50MzIgKilTRExfbWFsbG9jKDMqNzY4KnNpemVvZihVaW50MzIpKTsKKwlyXzJfcGl4X2FsbG9jID0gJnN3ZGF0YS0+cmdiXzJfcGl4WzAqNzY4XTsKKwlnXzJfcGl4X2FsbG9jID0gJnN3ZGF0YS0+cmdiXzJfcGl4WzEqNzY4XTsKKwliXzJfcGl4X2FsbG9jID0gJnN3ZGF0YS0+cmdiXzJfcGl4WzIqNzY4XTsKKwlpZiAoICEgc3dkYXRhLT5waXhlbHMgfHwgISBzd2RhdGEtPmNvbG9ydGFiIHx8ICEgc3dkYXRhLT5yZ2JfMl9waXggKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBHZW5lcmF0ZSB0aGUgdGFibGVzIGZvciB0aGUgZGlzcGxheSBzdXJmYWNlICovCisJZm9yIChpPTA7IGk8MjU2OyBpKyspIHsKKwkJLyogR2FtbWEgY29ycmVjdGlvbiAobHVtaW5lc2NlbmNlIHRhYmxlKSBhbmQgY2hyb21hIGNvcnJlY3Rpb24KKwkJICAgd291bGQgYmUgZG9uZSBoZXJlLiAgU2VlIHRoZSBCZXJrZWxleSBtcGVnX3BsYXkgc291cmNlcy4KKwkJKi8KKwkJQ0IgPSBDUiA9IChpLTEyOCk7CisJCUNyX3JfdGFiW2ldID0gKGludCkgKCAoMC40MTkvMC4yOTkpICogQ1IpOworCQlDcl9nX3RhYltpXSA9IChpbnQpICgtKDAuMjk5LzAuNDE5KSAqIENSKTsKKwkJQ2JfZ190YWJbaV0gPSAoaW50KSAoLSgwLjExNC8wLjMzMSkgKiBDQik7IAorCQlDYl9iX3RhYltpXSA9IChpbnQpICggKDAuNTg3LzAuMzMxKSAqIENCKTsKKwl9CisKKwkvKiAKKwkgKiBTZXQgdXAgZW50cmllcyAwLTI1NSBpbiByZ2ItdG8tcGl4ZWwgdmFsdWUgdGFibGVzLgorCSAqLworCVJtYXNrID0gZGlzcGxheS0+Zm9ybWF0LT5SbWFzazsKKwlHbWFzayA9IGRpc3BsYXktPmZvcm1hdC0+R21hc2s7CisJQm1hc2sgPSBkaXNwbGF5LT5mb3JtYXQtPkJtYXNrOworCWZvciAoIGk9MDsgaTwyNTY7ICsraSApIHsKKwkJcl8yX3BpeF9hbGxvY1tpKzI1Nl0gPSBpID4+ICg4IC0gbnVtYmVyX29mX2JpdHNfc2V0KFJtYXNrKSk7CisJCXJfMl9waXhfYWxsb2NbaSsyNTZdIDw8PSBmcmVlX2JpdHNfYXRfYm90dG9tKFJtYXNrKTsKKwkJZ18yX3BpeF9hbGxvY1tpKzI1Nl0gPSBpID4+ICg4IC0gbnVtYmVyX29mX2JpdHNfc2V0KEdtYXNrKSk7CisJCWdfMl9waXhfYWxsb2NbaSsyNTZdIDw8PSBmcmVlX2JpdHNfYXRfYm90dG9tKEdtYXNrKTsKKwkJYl8yX3BpeF9hbGxvY1tpKzI1Nl0gPSBpID4+ICg4IC0gbnVtYmVyX29mX2JpdHNfc2V0KEJtYXNrKSk7CisJCWJfMl9waXhfYWxsb2NbaSsyNTZdIDw8PSBmcmVlX2JpdHNfYXRfYm90dG9tKEJtYXNrKTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgMTYtYml0IG91dHB1dCBkZXB0aCwgdGhlbiB3ZSBkb3VibGUgdGhlIHZhbHVlCisJICogaW4gdGhlIHRvcCB3b3JkLiBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIHdyaXRlIG91dCBib3RoCisJICogcGl4ZWxzIGluIHRoZSBwaXhlbCBkb3VibGluZyBtb2RlIHdpdGggb25lIG9wLiBJdCBpcyAKKwkgKiBoYXJtbGVzcyBpbiB0aGUgbm9ybWFsIGNhc2UgYXMgc3RvcmluZyBhIDMyLWJpdCB2YWx1ZQorCSAqIHRocm91Z2ggYSBzaG9ydCBwb2ludGVyIHdpbGwgbG9zZSB0aGUgdG9wIGJpdHMgYW55d2F5LgorCSAqLworCWlmKCBkaXNwbGF5LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPT0gMiApIHsKKwkJZm9yICggaT0wOyBpPDI1NjsgKytpICkgeworCQkJcl8yX3BpeF9hbGxvY1tpKzI1Nl0gfD0gKHJfMl9waXhfYWxsb2NbaSsyNTZdKSA8PCAxNjsKKwkJCWdfMl9waXhfYWxsb2NbaSsyNTZdIHw9IChnXzJfcGl4X2FsbG9jW2krMjU2XSkgPDwgMTY7CisJCQliXzJfcGl4X2FsbG9jW2krMjU2XSB8PSAoYl8yX3BpeF9hbGxvY1tpKzI1Nl0pIDw8IDE2OworCQl9CisJfQorCisJLyoKKwkgKiBTcHJlYWQgb3V0IHRoZSB2YWx1ZXMgd2UgaGF2ZSB0byB0aGUgcmVzdCBvZiB0aGUgYXJyYXkgc28gdGhhdAorCSAqIHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIGZvciBvdmVyZmxvdy4KKwkgKi8KKwlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7CisJCXJfMl9waXhfYWxsb2NbaV0gPSByXzJfcGl4X2FsbG9jWzI1Nl07CisJCXJfMl9waXhfYWxsb2NbaSs1MTJdID0gcl8yX3BpeF9hbGxvY1s1MTFdOworCQlnXzJfcGl4X2FsbG9jW2ldID0gZ18yX3BpeF9hbGxvY1syNTZdOworCQlnXzJfcGl4X2FsbG9jW2krNTEyXSA9IGdfMl9waXhfYWxsb2NbNTExXTsKKwkJYl8yX3BpeF9hbGxvY1tpXSA9IGJfMl9waXhfYWxsb2NbMjU2XTsKKwkJYl8yX3BpeF9hbGxvY1tpKzUxMl0gPSBiXzJfcGl4X2FsbG9jWzUxMV07CisJfQorCisJLyogWW91IGhhdmUgY2hvc2VuIHdpc2VseS4uLiAqLworCXN3aXRjaCAoZm9ybWF0KSB7CisJICAgIGNhc2UgU0RMX1lWMTJfT1ZFUkxBWToKKwkgICAgY2FzZSBTRExfSVlVVl9PVkVSTEFZOgorCQlpZiAoIGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9PSAyICkgeworI2lmIChfX0dOVUNfXyA+IDIpICYmIGRlZmluZWQoX19pMzg2X18pICYmIF9fT1BUSU1JWkVfXyAmJiBTRExfQVNTRU1CTFlfUk9VVElORVMKKwkJCS8qIGlubGluZSBhc3NlbWJseSBmdW5jdGlvbnMgKi8KKwkJCWlmICggU0RMX0hhc01NWCgpICYmIChSbWFzayA9PSAweEY4MDApICYmCisJCQkgICAgICAgICAgICAgICAgICAgICAoR21hc2sgPT0gMHgwN0UwKSAmJgorCQkJCSAgICAgICAgICAgICAoQm1hc2sgPT0gMHgwMDFGKSAmJgorCQkJICAgICAgICAgICAgICAgICAgICAgKHdpZHRoICYgMTUpID09IDApIHsKKy8qcHJpbnRmKCJVc2luZyBNTVggMTYtYml0IDU2NSBkaXRoZXJcbiIpOyovCisJCQkJc3dkYXRhLT5EaXNwbGF5MVggPSBDb2xvcjU2NURpdGhlcllWMTJNTVgxWDsKKwkJCX0gZWxzZSB7CisvKnByaW50ZigiVXNpbmcgQyAxNi1iaXQgZGl0aGVyXG4iKTsqLworCQkJCXN3ZGF0YS0+RGlzcGxheTFYID0gQ29sb3IxNkRpdGhlcllWMTJNb2QxWDsKKwkJCX0KKyNlbHNlCisJCQlzd2RhdGEtPkRpc3BsYXkxWCA9IENvbG9yMTZEaXRoZXJZVjEyTW9kMVg7CisjZW5kaWYKKwkJCXN3ZGF0YS0+RGlzcGxheTJYID0gQ29sb3IxNkRpdGhlcllWMTJNb2QyWDsKKwkJfQorCQlpZiAoIGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9PSAzICkgeworCQkJc3dkYXRhLT5EaXNwbGF5MVggPSBDb2xvcjI0RGl0aGVyWVYxMk1vZDFYOworCQkJc3dkYXRhLT5EaXNwbGF5MlggPSBDb2xvcjI0RGl0aGVyWVYxMk1vZDJYOworCQl9CisJCWlmICggZGlzcGxheS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID09IDQgKSB7CisjaWYgKF9fR05VQ19fID4gMikgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgX19PUFRJTUlaRV9fICYmIFNETF9BU1NFTUJMWV9ST1VUSU5FUworCQkJLyogaW5saW5lIGFzc2VtYmx5IGZ1bmN0aW9ucyAqLworCQkJaWYgKCBTRExfSGFzTU1YKCkgJiYgKFJtYXNrID09IDB4MDBGRjAwMDApICYmCisJCQkgICAgICAgICAgICAgICAgICAgICAoR21hc2sgPT0gMHgwMDAwRkYwMCkgJiYKKwkJCQkgICAgICAgICAgICAgKEJtYXNrID09IDB4MDAwMDAwRkYpICYmIAorCQkJICAgICAgICAgICAgICAgICAgICAgKHdpZHRoICYgMTUpID09IDApIHsKKy8qcHJpbnRmKCJVc2luZyBNTVggMzItYml0IGRpdGhlclxuIik7Ki8KKwkJCQlzd2RhdGEtPkRpc3BsYXkxWCA9IENvbG9yUkdCRGl0aGVyWVYxMk1NWDFYOworCQkJfSBlbHNlIHsKKy8qcHJpbnRmKCJVc2luZyBDIDMyLWJpdCBkaXRoZXJcbiIpOyovCisJCQkJc3dkYXRhLT5EaXNwbGF5MVggPSBDb2xvcjMyRGl0aGVyWVYxMk1vZDFYOworCQkJfQorI2Vsc2UKKwkJCXN3ZGF0YS0+RGlzcGxheTFYID0gQ29sb3IzMkRpdGhlcllWMTJNb2QxWDsKKyNlbmRpZgorCQkJc3dkYXRhLT5EaXNwbGF5MlggPSBDb2xvcjMyRGl0aGVyWVYxMk1vZDJYOworCQl9CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9ZVVkyX09WRVJMQVk6CisJICAgIGNhc2UgU0RMX1VZVllfT1ZFUkxBWToKKwkgICAgY2FzZSBTRExfWVZZVV9PVkVSTEFZOgorCQlpZiAoIGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9PSAyICkgeworCQkJc3dkYXRhLT5EaXNwbGF5MVggPSBDb2xvcjE2RGl0aGVyWVVZMk1vZDFYOworCQkJc3dkYXRhLT5EaXNwbGF5MlggPSBDb2xvcjE2RGl0aGVyWVVZMk1vZDJYOworCQl9CisJCWlmICggZGlzcGxheS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsID09IDMgKSB7CisJCQlzd2RhdGEtPkRpc3BsYXkxWCA9IENvbG9yMjREaXRoZXJZVVkyTW9kMVg7CisJCQlzd2RhdGEtPkRpc3BsYXkyWCA9IENvbG9yMjREaXRoZXJZVVkyTW9kMlg7CisJCX0KKwkJaWYgKCBkaXNwbGF5LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPT0gNCApIHsKKwkJCXN3ZGF0YS0+RGlzcGxheTFYID0gQ29sb3IzMkRpdGhlcllVWTJNb2QxWDsKKwkJCXN3ZGF0YS0+RGlzcGxheTJYID0gQ29sb3IzMkRpdGhlcllVWTJNb2QyWDsKKwkJfQorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlIChjYXVnaHQgYWJvdmUpICovCisJCWJyZWFrOworCX0KKworCS8qIEZpbmQgdGhlIHBpdGNoIGFuZCBvZmZzZXQgdmFsdWVzIGZvciB0aGUgb3ZlcmxheSAqLworCW92ZXJsYXktPnBpdGNoZXMgPSBzd2RhdGEtPnBpdGNoZXM7CisJb3ZlcmxheS0+cGl4ZWxzID0gc3dkYXRhLT5wbGFuZXM7CisJc3dpdGNoIChmb3JtYXQpIHsKKwkgICAgY2FzZSBTRExfWVYxMl9PVkVSTEFZOgorCSAgICBjYXNlIFNETF9JWVVWX09WRVJMQVk6CisJCW92ZXJsYXktPnBpdGNoZXNbMF0gPSBvdmVybGF5LT53OworCQlvdmVybGF5LT5waXRjaGVzWzFdID0gb3ZlcmxheS0+cGl0Y2hlc1swXSAvIDI7CisJCW92ZXJsYXktPnBpdGNoZXNbMl0gPSBvdmVybGF5LT5waXRjaGVzWzBdIC8gMjsKKwkgICAgICAgIG92ZXJsYXktPnBpeGVsc1swXSA9IHN3ZGF0YS0+cGl4ZWxzOworCSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzFdID0gb3ZlcmxheS0+cGl4ZWxzWzBdICsKKwkJICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS0+cGl0Y2hlc1swXSAqIG92ZXJsYXktPmg7CisJICAgICAgICBvdmVybGF5LT5waXhlbHNbMl0gPSBvdmVybGF5LT5waXhlbHNbMV0gKworCQkgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LT5waXRjaGVzWzFdICogb3ZlcmxheS0+aCAvIDI7CisJCW92ZXJsYXktPnBsYW5lcyA9IDM7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9ZVVkyX09WRVJMQVk6CisJICAgIGNhc2UgU0RMX1VZVllfT1ZFUkxBWToKKwkgICAgY2FzZSBTRExfWVZZVV9PVkVSTEFZOgorCQlvdmVybGF5LT5waXRjaGVzWzBdID0gb3ZlcmxheS0+dyoyOworCSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzBdID0gc3dkYXRhLT5waXhlbHM7CisJCW92ZXJsYXktPnBsYW5lcyA9IDE7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKGNhdWdodCBhYm92ZSkgKi8KKwkJYnJlYWs7CisJfQorCisJLyogV2UncmUgYWxsIGRvbmUuLiAqLworCXJldHVybihvdmVybGF5KTsKK30KKworaW50IFNETF9Mb2NrWVVWX1NXKF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSkKK3sKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgU0RMX1VubG9ja1lVVl9TVyhfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCit7CisJcmV0dXJuOworfQorCitpbnQgU0RMX0Rpc3BsYXlZVVZfU1coX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KQoreworCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqc3dkYXRhOworCWludCBzdHJldGNoOworCWludCBzY2FsZV8yeDsKKwlTRExfU3VyZmFjZSAqZGlzcGxheTsKKwlVaW50OCAqbHVtLCAqQ3IsICpDYjsKKwlVaW50OCAqZHN0cDsKKwlpbnQgbW9kOworCisJc3dkYXRhID0gb3ZlcmxheS0+aHdkYXRhOworCXN0cmV0Y2ggPSAwOworCXNjYWxlXzJ4ID0gMDsKKwlpZiAoIHNyYy0+eCB8fCBzcmMtPnkgfHwgc3JjLT53IDwgb3ZlcmxheS0+dyB8fCBzcmMtPmggPCBvdmVybGF5LT5oICkgeworCQkvKiBUaGUgc291cmNlIHJlY3RhbmdsZSBoYXMgYmVlbiBjbGlwcGVkLgorCQkgICBVc2luZyBhIHNjcmF0Y2ggc3VyZmFjZSBpcyBlYXNpZXIgdGhhbiBhZGRpbmcgY2xpcHBlZAorCQkgICBzb3VyY2Ugc3VwcG9ydCB0byBhbGwgdGhlIGJsaXR0ZXJzLCBwbHVzIHRoYXQgd291bGQKKwkJICAgc2xvdyB0aGVtIGRvd24gaW4gdGhlIGdlbmVyYWwgdW5jbGlwcGVkIGNhc2UuCisJCSovCisJCXN0cmV0Y2ggPSAxOworCX0gZWxzZSBpZiAoIChzcmMtPncgIT0gZHN0LT53KSB8fCAoc3JjLT5oICE9IGRzdC0+aCkgKSB7CisJCWlmICggKGRzdC0+dyA9PSAyKnNyYy0+dykgJiYKKwkJICAgICAoZHN0LT5oID09IDIqc3JjLT5oKSApIHsKKwkJCXNjYWxlXzJ4ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXN0cmV0Y2ggPSAxOworCQl9CisJfQorCWlmICggc3RyZXRjaCApIHsKKwkJaWYgKCAhIHN3ZGF0YS0+c3RyZXRjaCApIHsKKwkJCWRpc3BsYXkgPSBzd2RhdGEtPmRpc3BsYXk7CisJCQlzd2RhdGEtPnN0cmV0Y2ggPSBTRExfQ3JlYXRlUkdCU3VyZmFjZSgKKwkJCQlTRExfU1dTVVJGQUNFLAorCQkJCW92ZXJsYXktPncsIG92ZXJsYXktPmgsCisJCQkJZGlzcGxheS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwsCisJCQkJZGlzcGxheS0+Zm9ybWF0LT5SbWFzaywKKwkJCQlkaXNwbGF5LT5mb3JtYXQtPkdtYXNrLAorCQkJCWRpc3BsYXktPmZvcm1hdC0+Qm1hc2ssIDApOworCQkJaWYgKCAhIHN3ZGF0YS0+c3RyZXRjaCApIHsKKwkJCQlyZXR1cm4oLTEpOworCQkJfQorCQl9CisJCWRpc3BsYXkgPSBzd2RhdGEtPnN0cmV0Y2g7CisJfSBlbHNlIHsKKwkJZGlzcGxheSA9IHN3ZGF0YS0+ZGlzcGxheTsKKwl9CisJc3dpdGNoIChvdmVybGF5LT5mb3JtYXQpIHsKKwkgICAgY2FzZSBTRExfWVYxMl9PVkVSTEFZOgorCQlsdW0gPSBvdmVybGF5LT5waXhlbHNbMF07CisJCUNyID0gIG92ZXJsYXktPnBpeGVsc1sxXTsKKwkJQ2IgPSAgb3ZlcmxheS0+cGl4ZWxzWzJdOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfSVlVVl9PVkVSTEFZOgorCQlsdW0gPSBvdmVybGF5LT5waXhlbHNbMF07CisJCUNyID0gIG92ZXJsYXktPnBpeGVsc1syXTsKKwkJQ2IgPSAgb3ZlcmxheS0+cGl4ZWxzWzFdOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfWVVZMl9PVkVSTEFZOgorCQlsdW0gPSBvdmVybGF5LT5waXhlbHNbMF07CisJCUNyID0gbHVtICsgMzsKKwkJQ2IgPSBsdW0gKyAxOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfVVlWWV9PVkVSTEFZOgorCQlsdW0gPSBvdmVybGF5LT5waXhlbHNbMF0rMTsKKwkJQ3IgPSBsdW0gKyAxOworCQlDYiA9IGx1bSAtIDE7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9ZVllVX09WRVJMQVk6CisJCWx1bSA9IG92ZXJsYXktPnBpeGVsc1swXTsKKwkJQ3IgPSBsdW0gKyAxOworCQlDYiA9IGx1bSArIDM7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIFlVViBmb3JtYXQgaW4gYmxpdCIpOworCQlyZXR1cm4oLTEpOworCX0KKwlpZiAoIFNETF9NVVNUTE9DSyhkaXNwbGF5KSApIHsKKyAgICAgICAgCWlmICggU0RMX0xvY2tTdXJmYWNlKGRpc3BsYXkpIDwgMCApIHsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisJaWYgKCBzdHJldGNoICkgeworCQlkc3RwID0gKFVpbnQ4ICopc3dkYXRhLT5zdHJldGNoLT5waXhlbHM7CisJfSBlbHNlIHsKKwkJZHN0cCA9IChVaW50OCAqKWRpc3BsYXktPnBpeGVscworCQkJKyBkc3QtPnggKiBkaXNwbGF5LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwKKwkJCSsgZHN0LT55ICogZGlzcGxheS0+cGl0Y2g7CisJfQorCW1vZCA9IChkaXNwbGF5LT5waXRjaCAvIGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCk7CisKKwlpZiAoIHNjYWxlXzJ4ICkgeworCQltb2QgLT0gKG92ZXJsYXktPncgKiAyKTsKKwkJc3dkYXRhLT5EaXNwbGF5Mlgoc3dkYXRhLT5jb2xvcnRhYiwgc3dkYXRhLT5yZ2JfMl9waXgsCisJCSAgICAgICAgICAgICAgICAgIGx1bSwgQ3IsIENiLCBkc3RwLCBvdmVybGF5LT5oLCBvdmVybGF5LT53LCBtb2QpOworCX0gZWxzZSB7CisJCW1vZCAtPSBvdmVybGF5LT53OworCQlzd2RhdGEtPkRpc3BsYXkxWChzd2RhdGEtPmNvbG9ydGFiLCBzd2RhdGEtPnJnYl8yX3BpeCwKKwkJICAgICAgICAgICAgICAgICAgbHVtLCBDciwgQ2IsIGRzdHAsIG92ZXJsYXktPmgsIG92ZXJsYXktPncsIG1vZCk7CisJfQorCWlmICggU0RMX01VU1RMT0NLKGRpc3BsYXkpICkgeworCQlTRExfVW5sb2NrU3VyZmFjZShkaXNwbGF5KTsKKwl9CisJaWYgKCBzdHJldGNoICkgeworCQlkaXNwbGF5ID0gc3dkYXRhLT5kaXNwbGF5OworCQlTRExfU29mdFN0cmV0Y2goc3dkYXRhLT5zdHJldGNoLCBzcmMsIGRpc3BsYXksIGRzdCk7CisJfQorCVNETF9VcGRhdGVSZWN0cyhkaXNwbGF5LCAxLCBkc3QpOworCisJcmV0dXJuKDApOworfQorCit2b2lkIFNETF9GcmVlWVVWX1NXKF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSkKK3sKKwlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKnN3ZGF0YTsKKworCXN3ZGF0YSA9IG92ZXJsYXktPmh3ZGF0YTsKKwlpZiAoIHN3ZGF0YSApIHsKKwkJaWYgKCBzd2RhdGEtPnN0cmV0Y2ggKSB7CisJCQlTRExfRnJlZVN1cmZhY2Uoc3dkYXRhLT5zdHJldGNoKTsKKwkJfQorCQlpZiAoIHN3ZGF0YS0+cGl4ZWxzICkgeworCQkJU0RMX2ZyZWUoc3dkYXRhLT5waXhlbHMpOworCQl9CisJCWlmICggc3dkYXRhLT5jb2xvcnRhYiApIHsKKwkJCVNETF9mcmVlKHN3ZGF0YS0+Y29sb3J0YWIpOworCQl9CisJCWlmICggc3dkYXRhLT5yZ2JfMl9waXggKSB7CisJCQlTRExfZnJlZShzd2RhdGEtPnJnYl8yX3BpeCk7CisJCX0KKwkJU0RMX2ZyZWUoc3dkYXRhKTsKKwkJb3ZlcmxheS0+aHdkYXRhID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1NETF95dXZfc3dfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfeXV2X3N3X2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWVhM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfeXV2X3N3X2MuaApAQCAtMCwwICsxLDM3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9zeXN2aWRlby5oIgorCisvKiBUaGlzIGlzIHRoZSBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgWVVWIHZpZGVvIG92ZXJsYXkgc3VwcG9ydCAqLworCitleHRlcm4gU0RMX092ZXJsYXkgKlNETF9DcmVhdGVZVVZfU1coX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpOworCitleHRlcm4gaW50IFNETF9Mb2NrWVVWX1NXKF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7CisKK2V4dGVybiB2b2lkIFNETF9VbmxvY2tZVVZfU1coX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKKworZXh0ZXJuIGludCBTRExfRGlzcGxheVlVVl9TVyhfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXksIFNETF9SZWN0ICpzcmMsIFNETF9SZWN0ICpkc3QpOworCitleHRlcm4gdm9pZCBTRExfRnJlZVlVVl9TVyhfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9TRExfeXV2ZnVuY3MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3l1dmZ1bmNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0OTZiNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vU0RMX3l1dmZ1bmNzLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIFlVViB2aWRlbyBzdXJmYWNlIGZ1bmN0aW9uIHN0cnVjdHVyZSAqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCisKKyNpZm5kZWYgX1RISVMKKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICpfdGhpcworI2VuZGlmCitzdHJ1Y3QgcHJpdmF0ZV95dXZod2Z1bmNzIHsKKwlpbnQgKCpMb2NrKShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOworCXZvaWQgKCpVbmxvY2spKF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7CisJaW50ICgqRGlzcGxheSkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KTsKKwl2b2lkICgqRnJlZUhXKShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOworfTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9SRUFETUUgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvUkVBRE1FCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvUkVBRE1FCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvUkVBRE1FCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvWE1FL3htZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L1hNRS94bWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2VhZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L1hNRS94bWUuYwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLTIwMDEgYnkgWGkgR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGxlYXNlIHNlZSB0aGUgTElDRU5TRSBmaWxlIGFjY29tcGFueWluZyB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbGljZW5zaW5nIAorICogaW5mb3JtYXRpb24uIAorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgZml4ZXMgYW5kIG1vZGlmaWNhdGlvbnMgdG8gc3JjQHhpZy5jb20uCisgKgorICogJFhpR0lkOiB4bWUuYyx2IDEuMiAyMDAxLzExLzMwIDIxOjU2OjU5IGpvbiBFeHAgJAorICoKKyAqLworCisjZGVmaW5lIE5FRURfRVZFTlRTCisjZGVmaW5lIE5FRURfUkVQTElFUworCisvKiBBcHBhcmVudGx5IHNvbWUgWDExIHN5c3RlbXMgY2FuJ3QgaW5jbHVkZSB0aGlzIG11bHRpcGxlIHRpbWVzLi4uICovCisjaWZuZGVmIFNETF9JTkNMVURFRF9YTElCSU5UX0gKKyNkZWZpbmUgU0RMX0lOQ0xVREVEX1hMSUJJTlRfSCAxCisjaW5jbHVkZSA8WDExL1hsaWJpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8WDExL1h0aHJlYWRzLmg+CisjaW5jbHVkZSA8WDExL1htZC5oPgorI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4KKyNpbmNsdWRlICIuLi9leHRlbnNpb25zL1hleHQuaCIKKyNpbmNsdWRlICIuLi9leHRlbnNpb25zL2V4dHV0aWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUJWElHTUlTQ19QUk9UT0NPTF9OQU1FIAkJICAgICAiWGlHLVNVTkRSWS1OT05TVEFOREFSRCIKKyNkZWZpbmUgWElHTUlTQ19NQUpPUl9WRVJTSU9OCSAgICAgICAgICAgICAyCisjZGVmaW5lIFhJR01JU0NfTUlOT1JfVkVSU0lPTiAJICAgICAgICAgICAgIDAKKworI2RlZmluZSBYaUdNaXNjTnVtYmVyRXZlbnRzCSAgICAgICAgICAgICAwCisKKyNkZWZpbmUJWF9YaUdNaXNjUXVlcnlWZXJzaW9uCQkgICAgIDAKKyNkZWZpbmUJWF9YaUdNaXNjUXVlcnlWaWV3cwkJICAgICAxCisjZGVmaW5lIFhfWGlHTWlzY1F1ZXJ5UmVzb2x1dGlvbnMgICAgICAgICAgICAyCisjZGVmaW5lIFhfWGlHTWlzY0NoYW5nZVJlc29sdXRpb24gICAgICAgICAgICAzCisjZGVmaW5lIFhfWGlHTWlzY0Z1bGxTY3JlZW4gICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgc3pfeFhpR01pc2NRdWVyeVZlcnNpb25SZXEJICAgICA4CisjZGVmaW5lIHN6X3hYaUdNaXNjUXVlcnlWaWV3c1JlcQkgICAgIDgKKyNkZWZpbmUgc3pfeFhpR01pc2NRdWVyeVJlc29sdXRpb25zUmVxICAgICAgIDgKKyNkZWZpbmUgc3pfeFhpR01pc2NDaGFuZ2VSZXNvbHV0aW9uUmVxICAgICAgIDE2CisjZGVmaW5lIHN6X3hYaUdNaXNjRnVsbFNjcmVlblJlcSAgICAgICAgICAgICAxNgorCisjZGVmaW5lIHN6X3hYaUdNaXNjUXVlcnlWZXJzaW9uUmVwbHkJICAgICAzMgorI2RlZmluZSBzel94WGlHTWlzY1F1ZXJ5Vmlld3NSZXBseQkgICAgIDMyCisjZGVmaW5lIHN6X3hYaUdNaXNjUXVlcnlSZXNvbHV0aW9uc1JlcGx5ICAgICAzMgorI2RlZmluZSBzel94WGlHTWlzY1F1ZXJ5RnVsbFNjcmVlblJlcGx5ICAgICAgMzIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0FSRDggICAgICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAgICAgICAgKi8KKyAgQ0FSRDggICAgICAgICB4aWdtaXNjUmVxVHlwZTsgICAgICAgICAvKiBhbHdheXMgWF9YaUdNaXNjUXVlcnlWZXJzaW9uICAgICAgKi8KKyAgQ0FSRDE2ICAgICAgICBsZW5ndGg7CisgIENBUkQxNiAgICAgICAgbWFqb3I7CisgIENBUkQxNiAgICAgICAgbWlub3I7Cit9IHhYaUdNaXNjUXVlcnlWZXJzaW9uUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgIENBUkQ4ICAgICAgICAgcmVxVHlwZTsgICAgICAgICAgICAgICAgLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgICAgICAgICovCisgIENBUkQ4ICAgICAgICAgeGlnbWlzY1JlcVR5cGU7ICAgICAgICAgLyogYWx3YXlzIFhfWGlHTWlzY1F1ZXJ5Vmlld3MgICAgICAgICovCisgIENBUkQxNiAgICAgICAgbGVuZ3RoOworICBDQVJEOAkJc2NyZWVuOworICBDQVJEOAkJcGFkMDsKKyAgQ0FSRDE2CXBhZDE7Cit9IHhYaUdNaXNjUXVlcnlWaWV3c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDQVJEOCAgICAgICAgIHJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICAgICAgICAqLworICBDQVJEOCAgICAgICAgIHhpZ21pc2NSZXFUeXBlOyAgICAgICAgIC8qIGFsd2F5cyBYX1hpR01pc2NRdWVyeVJlc29sdXRpb25zICAqLworICBDQVJEMTYgICAgICAgIGxlbmd0aDsKKyAgQ0FSRDgJCXNjcmVlbjsKKyAgQ0FSRDgJCXZpZXc7CisgIENBUkQxNglwYWQwOworfSB4WGlHTWlzY1F1ZXJ5UmVzb2x1dGlvbnNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0FSRDggICAgICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAgICAgICAgKi8KKyAgQ0FSRDggICAgICAgICB4aWdtaXNjUmVxVHlwZTsgICAgICAgICAvKiBhbHdheXMgWF9YaUdNaXNjQ2hhbmdlUmVzb2x1dGlvbiAgKi8KKyAgQ0FSRDE2ICAgICAgICBsZW5ndGg7CisgIENBUkQ4CQlzY3JlZW47CisgIENBUkQ4CQl2aWV3OworICBDQVJEMTYJcGFkMDsKKyAgQ0FSRDE2ICAgICAgICB3aWR0aDsKKyAgQ0FSRDE2ICAgICAgICBoZWlnaHQ7CisgIElOVDMyICAgICAgICAgcmVmcmVzaDsKK30geFhpR01pc2NDaGFuZ2VSZXNvbHV0aW9uUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgIENBUkQ4ICAgICAgICAgcmVxVHlwZTsgICAgICAgICAgICAgICAgLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgICAgICAgICovCisgIENBUkQ4ICAgICAgICAgeGlnbWlzY1JlcVR5cGU7ICAgICAgICAgLyogYWx3YXlzIFhfWGlHTWlzY0Z1bGxTY3JlZW4gICAgICAgICovCisgIENBUkQxNiAgICAgICAgbGVuZ3RoOworICBDQVJEOAkJc2NyZWVuOworICBDQVJEOAkJcGFkMDsKKyAgQ0FSRDE2CXBhZDE7CisgIENBUkQzMgl3aW5kb3c7CisgIENBUkQzMgljbWFwOworfSB4WGlHTWlzY0Z1bGxTY3JlZW5SZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAKKyAgQllURSAgICAgICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiBYX1JlcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQ0FSRDggICAgICAgICBwYWQwOworICBDQVJEMTYgICAgICAgIHNlcXVlbmNlTnVtYmVyOworICBDQVJEMzIgICAgICAgIGxlbmd0aDsKKyAgQ0FSRDE2ICAgICAgICBtYWpvcjsKKyAgQ0FSRDE2ICAgICAgICBtaW5vcjsKKyAgQ0FSRDMyICAgICAgICBwYWQxOworICBDQVJEMzIgICAgICAgIHBhZDI7CisgIENBUkQzMiAgICAgICAgcGFkMzsKKyAgQ0FSRDMyICAgICAgICBwYWQ0OworICBDQVJEMzIgICAgICAgIHBhZDU7Cit9IHhYaUdNaXNjUXVlcnlWZXJzaW9uUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgIAorICBCWVRFICAgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFhfUmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBDQVJEOCAgICAgICAgIHBhZDA7CisgIENBUkQxNiAgICAgICAgc2VxdWVuY2VOdW1iZXI7CisgIENBUkQzMiAgICAgICAgbGVuZ3RoOworICBDQVJEMzIgICAgICAgIG52aWV3czsKKyAgQ0FSRDMyICAgICAgICBwYWQxOworICBDQVJEMzIgICAgICAgIHBhZDI7CisgIENBUkQzMiAgICAgICAgcGFkMzsKKyAgQ0FSRDMyICAgICAgICBwYWQ0OworICBDQVJEMzIgICAgICAgIHBhZDU7Cit9IHhYaUdNaXNjUXVlcnlWaWV3c1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAKKyAgQllURSAgICAgICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiBYX1JlcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQ0FSRDggICAgICAgICBwYWQwOworICBDQVJEMTYgICAgICAgIHNlcXVlbmNlTnVtYmVyOworICBDQVJEMzIgICAgICAgIGxlbmd0aDsKKyAgQ0FSRDE2ICAgICAgICBhY3RpdmU7CisgIENBUkQxNiAgICAgICAgbnJlc29sdXRpb25zOworICBDQVJEMzIgICAgICAgIHBhZDE7CisgIENBUkQzMiAgICAgICAgcGFkMjsKKyAgQ0FSRDMyICAgICAgICBwYWQzOworICBDQVJEMzIgICAgICAgIHBhZDQ7CisgIENBUkQzMiAgICAgICAgcGFkNTsKK30geFhpR01pc2NRdWVyeVJlc29sdXRpb25zUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgIAorICBCWVRFICAgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFhfUmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCT09MICAgICAgICAgIHN1Y2Nlc3M7CisgIENBUkQxNiAgICAgICAgc2VxdWVuY2VOdW1iZXI7CisgIENBUkQzMiAgICAgICAgbGVuZ3RoOworICBDQVJEMzIgICAgICAgIHBhZDE7CisgIENBUkQzMiAgICAgICAgcGFkMjsKKyAgQ0FSRDMyICAgICAgICBwYWQzOworICBDQVJEMzIgICAgICAgIHBhZDQ7CisgIENBUkQzMiAgICAgICAgcGFkNTsKKyAgQ0FSRDMyICAgICAgICBwYWQ2OworfSB4WGlHTWlzY0Z1bGxTY3JlZW5SZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgIAorICBJTlQxNgkJeDsKKyAgSU5UMTYJCXk7CisgIENBUkQxNgl3OworICBDQVJEMTYJaDsKK30gWGlHTWlzY1ZpZXdJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAKKyAgQ0FSRDE2ICAgICAgICB3aWR0aDsKKyAgQ0FSRDE2ICAgICAgICBoZWlnaHQ7CisgIElOVDMyICAgICAgICAgcmVmcmVzaDsKK30gWGlHTWlzY1Jlc29sdXRpb25JbmZvOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBYRXh0ZW5zaW9uSW5mbyAqeGlnbWlzY19pbmZvID0gTlVMTDsKK3N0YXRpYyBjaGFyICp4aWdtaXNjX2V4dGVuc2lvbl9uYW1lID0gWElHTUlTQ19QUk9UT0NPTF9OQU1FOworCisjZGVmaW5lIFhpR01pc2NDaGVja0V4dGVuc2lvbihkcHksaSx2YWwpIFwKKyAgWGV4dENoZWNrRXh0ZW5zaW9uIChkcHksIGksIHhpZ21pc2NfZXh0ZW5zaW9uX25hbWUsIHZhbCkKKyNkZWZpbmUgWGlHTWlzY1NpbXBsZUNoZWNrRXh0ZW5zaW9uKGRweSxpKSBcCisgIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpLCB4aWdtaXNjX2V4dGVuc2lvbl9uYW1lKQorCisjaWYgZGVmaW5lZChfX1NURENfXykgJiYgIWRlZmluZWQoVU5JWENQUCkKKyNkZWZpbmUgWGlHTWlzY0dldFJlcShuYW1lLHJlcSxpbmZvKSBHZXRSZXEgKG5hbWUsIHJlcSk7IFwKKyAgICAgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsgXAorICAgICAgICByZXEtPnhpZ21pc2NSZXFUeXBlID0gWF8jI25hbWU7CisKKyNkZWZpbmUgWGlHTWlzY0dldFJlcUV4dHJhKG5hbWUsbixyZXEsaW5mbykgR2V0UmVxRXh0cmEgKG5hbWUsIG4sIHJlcSk7IFwKKyAgICAgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsgXAorICAgICAgICByZXEtPnhpZ21pY1JlcVR5cGUgPSBYXyMjbmFtZTsKKyNlbHNlCisjZGVmaW5lIFhpR01pc2NHZXRSZXEobmFtZSxyZXEsaW5mbykgR2V0UmVxIChuYW1lLCByZXEpOyBcCisgICAgICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7IFwKKyAgICAgICAgcmVxLT54aWdtaXNjUmVxVHlwZSA9IFhfLyoqL25hbWU7CisjZGVmaW5lIFhpR01pc2NHZXRSZXFFeHRyYShuYW1lLG4scmVxLGluZm8pIEdldFJlcUV4dHJhIChuYW1lLCBuLCByZXEpOyBcCisgICAgICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7IFwKKyAgICAgICAgcmVxLT54aWdtaXNjUmVxVHlwZSA9IFhfLyoqL25hbWU7CisjZW5kaWYKKworCisKKy8qCisgKiBmaW5kX2Rpc3BsYXkgLSBsb2NhdGUgdGhlIGRpc3BsYXkgaW5mbyBibG9jaworICovCitzdGF0aWMgaW50IFhpR01pc2NDbG9zZURpc3BsYXkoKTsKKworc3RhdGljIFhFeHRlbnNpb25Ib29rcyB4aWdtaXNjX2V4dGVuc2lvbl9ob29rcyA9IHsKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGVfZ2MgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5X2djICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmx1c2hfZ2MgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVlX2djICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlX2ZvbnQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVlX2ZvbnQgKi8KKyAgICBYaUdNaXNjQ2xvc2VEaXNwbGF5LCAgICAgICAgICAgICAgICAvKiBjbG9zZV9kaXNwbGF5ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2lyZV90b19ldmVudCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW50X3RvX3dpcmUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yX3N0cmluZyAqLworfTsKKworCitzdGF0aWMgWEVYVF9HRU5FUkFURV9DTE9TRV9ESVNQTEFZIChYaUdNaXNjQ2xvc2VEaXNwbGF5LCB4aWdtaXNjX2luZm8pCisKK3N0YXRpYyBYRVhUX0dFTkVSQVRFX0ZJTkRfRElTUExBWSAoWGlHTWlzY0ZpbmREaXNwbGF5LCB4aWdtaXNjX2luZm8sCisJCQkJICAgeGlnbWlzY19leHRlbnNpb25fbmFtZSwgCisJCQkJICAgJnhpZ21pc2NfZXh0ZW5zaW9uX2hvb2tzLCBYaUdNaXNjTnVtYmVyRXZlbnRzLCBOVUxMKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQm9vbCBYaUdNaXNjUXVlcnlWZXJzaW9uKERpc3BsYXkgKmRweSwgaW50ICptYWpvciwgaW50ICptaW5vcikKK3sKKyAgaW50IG9wY29kZSwgZXZlbnQsIGVycm9yOworICB4WGlHTWlzY1F1ZXJ5VmVyc2lvblJlcSAqcmVxOworICB4WGlHTWlzY1F1ZXJ5VmVyc2lvblJlcGx5IHJlcDsKKyAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gWGlHTWlzY0ZpbmREaXNwbGF5KGRweSk7CisKKyAgaWYgKCFYUXVlcnlFeHRlbnNpb24oZHB5LCBYSUdNSVNDX1BST1RPQ09MX05BTUUsICZvcGNvZGUsICZldmVudCwgJmVycm9yKSkKKyAgICByZXR1cm4geEZhbHNlOworCisgIFhpR01pc2NDaGVja0V4dGVuc2lvbihkcHksIGluZm8sIHhGYWxzZSk7CisKKyAgTG9ja0Rpc3BsYXkgKGRweSk7CisgIFhpR01pc2NHZXRSZXEgKFhpR01pc2NRdWVyeVZlcnNpb24sIHJlcSwgaW5mbyk7CisKKyAgcmVxLT5tYWpvciA9IFhJR01JU0NfTUFKT1JfVkVSU0lPTjsKKyAgcmVxLT5taW5vciA9IFhJR01JU0NfTUlOT1JfVkVSU0lPTjsKKworICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhUcnVlKSkgeworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIHhGYWxzZTsKKyAgfQorCisgICptYWpvciA9IHJlcC5tYWpvcjsKKyAgKm1pbm9yID0gcmVwLm1pbm9yOworICBVbmxvY2tEaXNwbGF5KGRweSk7CisgIFN5bmNIYW5kbGUoKTsKKworICByZXR1cm4geFRydWU7Cit9CisKK2ludCBYaUdNaXNjUXVlcnlWaWV3cyhEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIFhpR01pc2NWaWV3SW5mbyAqKnB2aWV3cykKK3sKKyAgaW50IG4sIHNpemU7CisgIFhpR01pc2NWaWV3SW5mbyAqdmlld3M7CisgIHhYaUdNaXNjUXVlcnlWaWV3c1JlcSAqcmVxOworICB4WGlHTWlzY1F1ZXJ5Vmlld3NSZXBseSByZXA7CisgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFhpR01pc2NGaW5kRGlzcGxheShkcHkpOworICBYaUdNaXNjQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvLCAwKTsKKworICBMb2NrRGlzcGxheSAoZHB5KTsKKyAgWGlHTWlzY0dldFJlcSAoWGlHTWlzY1F1ZXJ5Vmlld3MsIHJlcSwgaW5mbyk7CisgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworCisgIGlmICghX1hSZXBseSAoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBuID0gcmVwLm52aWV3czsKKworICBpZiAobiA+IDApIHsKKyAgICBzaXplID0gc2l6ZW9mKFhpR01pc2NWaWV3SW5mbykgKiBuOworICAgIHZpZXdzID0gKFhpR01pc2NWaWV3SW5mbyopWG1hbGxvYyhzaXplKTsKKyAgICBpZiAoIXZpZXdzKSB7CisgICAgICBfWEVhdERhdGEoZHB5LCAodW5zaWduZWQgbG9uZylzaXplKTsKKyAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICAgIFN5bmNIYW5kbGUoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIF9YUmVhZFBhZChkcHksICh2b2lkKil2aWV3cywgc2l6ZSk7CisKKyAgICAqcHZpZXdzID0gdmlld3M7CisgIH0KKworICBVbmxvY2tEaXNwbGF5KGRweSk7CisgIFN5bmNIYW5kbGUoKTsKKworICByZXR1cm4gbjsKK30KKworaW50IFhpR01pc2NRdWVyeVJlc29sdXRpb25zKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50IHZpZXcsIGludCAqcGFjdGl2ZSwgWGlHTWlzY1Jlc29sdXRpb25JbmZvICoqcHJlc29sdXRpb25zKQoreworICBpbnQgbiwgc2l6ZTsKKyAgWGlHTWlzY1Jlc29sdXRpb25JbmZvICpyZXNvbHV0aW9uczsKKyAgeFhpR01pc2NRdWVyeVJlc29sdXRpb25zUmVxICpyZXE7CisgIHhYaUdNaXNjUXVlcnlSZXNvbHV0aW9uc1JlcGx5IHJlcDsKKyAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gWGlHTWlzY0ZpbmREaXNwbGF5KGRweSk7CisgIFhpR01pc2NDaGVja0V4dGVuc2lvbihkcHksIGluZm8sIDApOworCisgIExvY2tEaXNwbGF5IChkcHkpOworICBYaUdNaXNjR2V0UmVxIChYaUdNaXNjUXVlcnlSZXNvbHV0aW9ucywgcmVxLCBpbmZvKTsKKyAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgIHJlcS0+dmlldyAgID0gdmlldzsKKworICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiAwOworICB9CisKKyAgbiA9IHJlcC5ucmVzb2x1dGlvbnM7CisKKyAgaWYgKG4gPiAwKSB7CisgICAgc2l6ZSA9IHNpemVvZihYaUdNaXNjUmVzb2x1dGlvbkluZm8pICogbjsKKyAgICByZXNvbHV0aW9ucyA9IChYaUdNaXNjUmVzb2x1dGlvbkluZm8qKVhtYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFyZXNvbHV0aW9ucykgeworICAgICAgX1hFYXREYXRhKGRweSwgKHVuc2lnbmVkIGxvbmcpc2l6ZSk7CisgICAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgICBTeW5jSGFuZGxlKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBfWFJlYWRQYWQoZHB5LCAodm9pZCopcmVzb2x1dGlvbnMsIHNpemUpOworCisgICAgKnByZXNvbHV0aW9ucyA9IHJlc29sdXRpb25zOworICAgICpwYWN0aXZlID0gcmVwLmFjdGl2ZTsKKyAgfQorCisgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgU3luY0hhbmRsZSgpOworCisgIHJldHVybiBuOworfQorCit2b2lkIFhpR01pc2NDaGFuZ2VSZXNvbHV0aW9uKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHJlZnJlc2gpCit7CisgIHhYaUdNaXNjQ2hhbmdlUmVzb2x1dGlvblJlcSAqcmVxOworICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBYaUdNaXNjRmluZERpc3BsYXkoZHB5KTsKKworICBYaUdNaXNjU2ltcGxlQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvKTsKKworICBMb2NrRGlzcGxheSAoZHB5KTsKKyAgWGlHTWlzY0dldFJlcSAoWGlHTWlzY0NoYW5nZVJlc29sdXRpb24sIHJlcSwgaW5mbyk7CisgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICByZXEtPnZpZXcgPSB2aWV3OworICByZXEtPndpZHRoID0gd2lkdGg7CisgIHJlcS0+aGVpZ2h0ID0gaGVpZ2h0OworICByZXEtPnJlZnJlc2ggPSByZWZyZXNoOworCisgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgU3luY0hhbmRsZSgpOworfQorCisKK0Jvb2wgWGlHTWlzY0Z1bGxTY3JlZW4oRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBYSUQgd2luZG93LCBYSUQgY21hcCkKK3sKKyAgeFhpR01pc2NGdWxsU2NyZWVuUmVxICpyZXE7CisgIHhYaUdNaXNjRnVsbFNjcmVlblJlcGx5IHJlcDsKKyAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gWGlHTWlzY0ZpbmREaXNwbGF5KGRweSk7CisKKyAgWGlHTWlzY0NoZWNrRXh0ZW5zaW9uKGRweSwgaW5mbywgeEZhbHNlKTsKKworICBMb2NrRGlzcGxheSAoZHB5KTsKKyAgWGlHTWlzY0dldFJlcSAoWGlHTWlzY0Z1bGxTY3JlZW4sIHJlcSwgaW5mbyk7CisgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICByZXEtPnBhZDAgPSAwOworICByZXEtPnBhZDEgPSAwOworICByZXEtPndpbmRvdyA9IHdpbmRvdzsKKyAgcmVxLT5jbWFwID0gY21hcDsKKworICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhUcnVlKSkgeworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIHhGYWxzZTsKKyAgfQorCisgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgU3luY0hhbmRsZSgpOworCisgIHJldHVybiAocmVwLnN1Y2Nlc3MgPyB4VHJ1ZSA6IHhGYWxzZSk7Cit9CisKKworLyogU0RMIGFkZGl0aW9uIGZyb20gUnlhbjogZnJlZSBtZW1vcnkgdXNlZCBieSB4bWUuICovCit2b2lkIFhpR01pc2NEZXN0cm95KHZvaWQpCit7CisgICAgaWYgKHhpZ21pc2NfaW5mbykgeworICAgICAgICBYZXh0RGVzdHJveUV4dGVuc2lvbih4aWdtaXNjX2luZm8pOworICAgICAgICB4aWdtaXNjX2luZm8gPSBOVUxMOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L1hpbmVyYW1hL1hpbmVyYW1hLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvWGluZXJhbWEvWGluZXJhbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmY0MmViCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L1hpbmVyYW1hL1hpbmVyYW1hLmMKQEAgLTAsMCArMSwzMjQgQEAKKy8qICRYb3JnOiBYUGFub3JhbWlYLmMsdiAxLjQgMjAwMC8wOC8xNyAxOTo0NTo1MSBjcHFibGQgRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAxOTkxLCAxOTk3IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUuCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUywgSU5DTFVESU5HLAorQlVUIE5PVCBMSU1JVEVEIFRPIENPTlNFUVVFTlRJQUwgT1IgSU5DSURFTlRBTCBEQU1BR0VTLCBPUiBPVEhFUiBMSUFCSUxJVFksCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SCitJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbgorc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlcgorZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIERpZ2l0YWwKK0VxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9saWIvWGluZXJhbWEvWGluZXJhbWEuYyx2IDEuMiAyMDAxLzA3LzIzIDE3OjIwOjI4IGRhd2VzIEV4cCAkICovCisKKyNkZWZpbmUgTkVFRF9FVkVOVFMKKyNkZWZpbmUgTkVFRF9SRVBMSUVTCisKKy8qIEFwcGFyZW50bHkgc29tZSBYMTEgc3lzdGVtcyBjYW4ndCBpbmNsdWRlIHRoaXMgbXVsdGlwbGUgdGltZXMuLi4gKi8KKyNpZm5kZWYgU0RMX0lOQ0xVREVEX1hMSUJJTlRfSAorI2RlZmluZSBTRExfSU5DTFVERURfWExJQklOVF9IIDEKKyNpbmNsdWRlIDxYMTEvWGxpYmludC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNpbmNsdWRlICIuLi9leHRlbnNpb25zL1hleHQuaCIKKyNpbmNsdWRlICIuLi9leHRlbnNpb25zL2V4dHV0aWwuaCIJCQkvKiBpbiAuLi9pbmNsdWRlICovCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy9wYW5vcmFtaVhleHQuaCIKKyNpbmNsdWRlICIuLi9leHRlbnNpb25zL3Bhbm9yYW1pWHByb3RvLmgiCQkvKiBpbiAuLi9pbmNsdWRlICovCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy9YaW5lcmFtYS5oIgorCitzdGF0aWMgWEV4dGVuc2lvbkluZm8gX3Bhbm9yYW1pWF9leHRfaW5mb19kYXRhOworc3RhdGljIFhFeHRlbnNpb25JbmZvICpwYW5vcmFtaVhfZXh0X2luZm8gPSAmX3Bhbm9yYW1pWF9leHRfaW5mb19kYXRhOworc3RhdGljIC8qIGNvbnN0ICovIGNoYXIgKnBhbm9yYW1pWF9leHRlbnNpb25fbmFtZSA9IFBBTk9SQU1JWF9QUk9UT0NPTF9OQU1FOworCisjZGVmaW5lIFBhbm9yYW1pWENoZWNrRXh0ZW5zaW9uKGRweSxpLHZhbCkgXAorICBYZXh0Q2hlY2tFeHRlbnNpb24gKGRweSwgaSwgcGFub3JhbWlYX2V4dGVuc2lvbl9uYW1lLCB2YWwpCisjZGVmaW5lIFBhbm9yYW1pWFNpbXBsZUNoZWNrRXh0ZW5zaW9uKGRweSxpKSBcCisgIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpLCBwYW5vcmFtaVhfZXh0ZW5zaW9uX25hbWUpCisKK3N0YXRpYyBpbnQgY2xvc2VfZGlzcGxheSgpOworc3RhdGljIC8qIGNvbnN0ICovIFhFeHRlbnNpb25Ib29rcyBwYW5vcmFtaVhfZXh0ZW5zaW9uX2hvb2tzID0geworICAgIE5VTEwsCQkJCS8qIGNyZWF0ZV9nYyAqLworICAgIE5VTEwsCQkJCS8qIGNvcHlfZ2MgKi8KKyAgICBOVUxMLAkJCQkvKiBmbHVzaF9nYyAqLworICAgIE5VTEwsCQkJCS8qIGZyZWVfZ2MgKi8KKyAgICBOVUxMLAkJCQkvKiBjcmVhdGVfZm9udCAqLworICAgIE5VTEwsCQkJCS8qIGZyZWVfZm9udCAqLworICAgIGNsb3NlX2Rpc3BsYXksCQkJLyogY2xvc2VfZGlzcGxheSAqLworICAgIE5VTEwsCQkJCS8qIHdpcmVfdG9fZXZlbnQgKi8KKyAgICBOVUxMLAkJCQkvKiBldmVudF90b193aXJlICovCisgICAgTlVMTCwJCQkJLyogZXJyb3IgKi8KKyAgICBOVUxMLAkJCQkvKiBlcnJvcl9zdHJpbmcgKi8KK307CisKK3N0YXRpYyBYRVhUX0dFTkVSQVRFX0ZJTkRfRElTUExBWSAoZmluZF9kaXNwbGF5LCBwYW5vcmFtaVhfZXh0X2luZm8sCisJCQkJICAgcGFub3JhbWlYX2V4dGVuc2lvbl9uYW1lLCAKKwkJCQkgICAmcGFub3JhbWlYX2V4dGVuc2lvbl9ob29rcywKKwkJCQkgICAwLCBOVUxMKQorCitzdGF0aWMgWEVYVF9HRU5FUkFURV9DTE9TRV9ESVNQTEFZIChjbG9zZV9kaXNwbGF5LCBwYW5vcmFtaVhfZXh0X2luZm8pCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCQkJICAgIFBhbm9yYW1pWCBwdWJsaWMgaW50ZXJmYWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0Jvb2wgU0RMX05BTUUoWFBhbm9yYW1pWFF1ZXJ5RXh0ZW5zaW9uKSAoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCAqZXZlbnRfYmFzZXAsCisgICAgaW50ICplcnJvcl9iYXNlcAorKQoreworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKKworICAgIGlmIChYZXh0SGFzRXh0ZW5zaW9uKGluZm8pKSB7CisJKmV2ZW50X2Jhc2VwID0gaW5mby0+Y29kZXMtPmZpcnN0X2V2ZW50OworCSplcnJvcl9iYXNlcCA9IGluZm8tPmNvZGVzLT5maXJzdF9lcnJvcjsKKwlyZXR1cm4gVHJ1ZTsKKyAgICB9IGVsc2UgeworCXJldHVybiBGYWxzZTsKKyAgICB9Cit9CisKKworU3RhdHVzIFNETF9OQU1FKFhQYW5vcmFtaVhRdWVyeVZlcnNpb24pKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBpbnQJICAgICptYWpvcl92ZXJzaW9ucCwgCisgICAgaW50ICptaW5vcl92ZXJzaW9ucAorKQoreworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKKyAgICB4UGFub3JhbWlYUXVlcnlWZXJzaW9uUmVwbHkJICAgIHJlcDsKKyAgICByZWdpc3RlciB4UGFub3JhbWlYUXVlcnlWZXJzaW9uUmVxICAqcmVxOworCisgICAgUGFub3JhbWlYQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgMCk7CisKKyAgICBMb2NrRGlzcGxheSAoZHB5KTsKKyAgICBHZXRSZXEgKFBhbm9yYW1pWFF1ZXJ5VmVyc2lvbiwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+cGFub3JhbWlYUmVxVHlwZSA9IFhfUGFub3JhbWlYUXVlcnlWZXJzaW9uOworICAgIHJlcS0+Y2xpZW50TWFqb3IgPSBQQU5PUkFNSVhfTUFKT1JfVkVSU0lPTjsKKyAgICByZXEtPmNsaWVudE1pbm9yID0gUEFOT1JBTUlYX01JTk9SX1ZFUlNJT047CisgICAgaWYgKCFfWFJlcGx5IChkcHksICh4UmVwbHkgKikgJnJlcCwgMCwgeFRydWUpKSB7CisJVW5sb2NrRGlzcGxheSAoZHB5KTsKKwlTeW5jSGFuZGxlICgpOworCXJldHVybiAwOworICAgIH0KKyAgICAqbWFqb3JfdmVyc2lvbnAgPSByZXAubWFqb3JWZXJzaW9uOworICAgICptaW5vcl92ZXJzaW9ucCA9IHJlcC5taW5vclZlcnNpb247CisgICAgVW5sb2NrRGlzcGxheSAoZHB5KTsKKyAgICBTeW5jSGFuZGxlICgpOworICAgIHJldHVybiAxOworfQorCitTRExfTkFNRShYUGFub3JhbWlYSW5mbykgKlNETF9OQU1FKFhQYW5vcmFtaVhBbGxvY0luZm8pKHZvaWQpCit7CisJcmV0dXJuIChTRExfTkFNRShYUGFub3JhbWlYSW5mbykgKikgWG1hbGxvYyAoc2l6ZW9mIChTRExfTkFNRShYUGFub3JhbWlYSW5mbykpKTsKK30KKworU3RhdHVzIFNETF9OQU1FKFhQYW5vcmFtaVhHZXRTdGF0ZSkgKAorICAgIERpc3BsYXkJCSpkcHksCisgICAgRHJhd2FibGUJCWRyYXdhYmxlLAorICAgIFNETF9OQU1FKFhQYW5vcmFtaVhJbmZvKQkqcGFub3JhbWlYX2luZm8KKykKK3sKKyAgICBYRXh0RGlzcGxheUluZm8JCQkqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKKyAgICB4UGFub3JhbWlYR2V0U3RhdGVSZXBseQlyZXA7CisgICAgcmVnaXN0ZXIgeFBhbm9yYW1pWEdldFN0YXRlUmVxCSpyZXE7CisKKyAgICBQYW5vcmFtaVhDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCAwKTsKKworICAgIExvY2tEaXNwbGF5IChkcHkpOworICAgIEdldFJlcSAoUGFub3JhbWlYR2V0U3RhdGUsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPnBhbm9yYW1pWFJlcVR5cGUgPSBYX1Bhbm9yYW1pWEdldFN0YXRlOworICAgIHJlcS0+d2luZG93ID0gZHJhd2FibGU7CisgICAgaWYgKCFfWFJlcGx5IChkcHksICh4UmVwbHkgKikgJnJlcCwgMCwgeFRydWUpKSB7CisJVW5sb2NrRGlzcGxheSAoZHB5KTsKKwlTeW5jSGFuZGxlICgpOworCXJldHVybiAwOworICAgIH0KKyAgICBVbmxvY2tEaXNwbGF5IChkcHkpOworICAgIFN5bmNIYW5kbGUgKCk7CisgICAgcGFub3JhbWlYX2luZm8tPndpbmRvdyA9IHJlcC53aW5kb3c7CisgICAgcGFub3JhbWlYX2luZm8tPlN0YXRlID0gcmVwLnN0YXRlOworICAgIHJldHVybiAxOworfQorCitTdGF0dXMgU0RMX05BTUUoWFBhbm9yYW1pWEdldFNjcmVlbkNvdW50KSAoCisgICAgRGlzcGxheQkJKmRweSwKKyAgICBEcmF3YWJsZQkJZHJhd2FibGUsCisgICAgU0RMX05BTUUoWFBhbm9yYW1pWEluZm8pCSpwYW5vcmFtaVhfaW5mbworKQoreworICAgIFhFeHREaXNwbGF5SW5mbwkJCSppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOworICAgIHhQYW5vcmFtaVhHZXRTY3JlZW5Db3VudFJlcGx5CXJlcDsKKyAgICByZWdpc3RlciB4UGFub3JhbWlYR2V0U2NyZWVuQ291bnRSZXEJKnJlcTsKKworICAgIFBhbm9yYW1pWENoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIDApOworCisgICAgTG9ja0Rpc3BsYXkgKGRweSk7CisgICAgR2V0UmVxIChQYW5vcmFtaVhHZXRTY3JlZW5Db3VudCwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+cGFub3JhbWlYUmVxVHlwZSA9IFhfUGFub3JhbWlYR2V0U2NyZWVuQ291bnQ7CisgICAgcmVxLT53aW5kb3cgPSBkcmF3YWJsZTsKKyAgICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSAmcmVwLCAwLCB4VHJ1ZSkpIHsKKwlVbmxvY2tEaXNwbGF5IChkcHkpOworCVN5bmNIYW5kbGUgKCk7CisJcmV0dXJuIDA7CisgICAgfQorICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7CisgICAgU3luY0hhbmRsZSAoKTsKKyAgICBwYW5vcmFtaVhfaW5mby0+d2luZG93ID0gcmVwLndpbmRvdzsKKyAgICBwYW5vcmFtaVhfaW5mby0+U2NyZWVuQ291bnQgPSByZXAuU2NyZWVuQ291bnQ7CisgICAgcmV0dXJuIDE7Cit9CisKK1N0YXR1cyBTRExfTkFNRShYUGFub3JhbWlYR2V0U2NyZWVuU2l6ZSkgKAorICAgIERpc3BsYXkJCSpkcHksCisgICAgRHJhd2FibGUJCWRyYXdhYmxlLAorICAgIGludAkJCXNjcmVlbl9udW0sCisgICAgU0RMX05BTUUoWFBhbm9yYW1pWEluZm8pCSpwYW5vcmFtaVhfaW5mbworKQoreworICAgIFhFeHREaXNwbGF5SW5mbwkJCSppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOworICAgIHhQYW5vcmFtaVhHZXRTY3JlZW5TaXplUmVwbHkJcmVwOworICAgIHJlZ2lzdGVyIHhQYW5vcmFtaVhHZXRTY3JlZW5TaXplUmVxCSpyZXE7CisKKyAgICBQYW5vcmFtaVhDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCAwKTsKKworICAgIExvY2tEaXNwbGF5IChkcHkpOworICAgIEdldFJlcSAoUGFub3JhbWlYR2V0U2NyZWVuU2l6ZSwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+cGFub3JhbWlYUmVxVHlwZSA9IFhfUGFub3JhbWlYR2V0U2NyZWVuU2l6ZTsKKyAgICByZXEtPndpbmRvdyA9IGRyYXdhYmxlOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuX251bTsJCQkvKiBuZWVkIHRvIGRlZmluZSAqLyAKKyAgICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSAmcmVwLCAwLCB4VHJ1ZSkpIHsKKwlVbmxvY2tEaXNwbGF5IChkcHkpOworCVN5bmNIYW5kbGUgKCk7CisJcmV0dXJuIDA7CisgICAgfQorICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7CisgICAgU3luY0hhbmRsZSAoKTsKKyAgICBwYW5vcmFtaVhfaW5mby0+d2luZG93ID0gcmVwLndpbmRvdzsKKyAgICBwYW5vcmFtaVhfaW5mby0+c2NyZWVuID0gcmVwLnNjcmVlbjsKKyAgICBwYW5vcmFtaVhfaW5mby0+d2lkdGggPSAgcmVwLndpZHRoOworICAgIHBhbm9yYW1pWF9pbmZvLT5oZWlnaHQgPSByZXAuaGVpZ2h0OworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgQWx0ZXJuYXRlIGludGVyZmFjZSB0byBtYWtlIHVwIGZvciBzaG9ydGNvbWluZ3MgaW4gdGhlIG9yaWdpbmFsLAorICBuYW1lbHksIHRoZSBvbWlzc2lvbiBvZiB0aGUgc2NyZWVuIG9yaWdpbi4gIFRoZSBuZXcgaW50ZXJmYWNlIGlzCisgIGluIHRoZSAiWGluZXJhbWEiIG5hbWVzcGFjZSBpbnN0ZWFkIG9mICJQYW5vcmFtaVgiLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0Jvb2wgU0RMX05BTUUoWGluZXJhbWFRdWVyeUV4dGVuc2lvbikgKAorICAgRGlzcGxheSAqZHB5LAorICAgaW50ICAgICAqZXZlbnRfYmFzZSwKKyAgIGludCAgICAgKmVycm9yX2Jhc2UKKykKK3sKKyAgIHJldHVybiBTRExfTkFNRShYUGFub3JhbWlYUXVlcnlFeHRlbnNpb24pKGRweSwgZXZlbnRfYmFzZSwgZXJyb3JfYmFzZSk7Cit9CisKK1N0YXR1cyBTRExfTkFNRShYaW5lcmFtYVF1ZXJ5VmVyc2lvbikoCisgICBEaXNwbGF5ICpkcHksCisgICBpbnQgICAgICptYWpvciwKKyAgIGludCAgICAgKm1pbm9yCispCit7CisgICByZXR1cm4gU0RMX05BTUUoWFBhbm9yYW1pWFF1ZXJ5VmVyc2lvbikoZHB5LCBtYWpvciwgbWlub3IpOworfQorCitCb29sIFNETF9OQU1FKFhpbmVyYW1hSXNBY3RpdmUpKERpc3BsYXkgKmRweSkKK3sKKyAgICB4WGluZXJhbWFJc0FjdGl2ZVJlcGx5CXJlcDsKKyAgICB4WGluZXJhbWFJc0FjdGl2ZVJlcSAgCSpyZXE7CisgICAgWEV4dERpc3BsYXlJbmZvIAkJKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisKKyAgICBpZighWGV4dEhhc0V4dGVuc2lvbihpbmZvKSkKKwlyZXR1cm4gRmFsc2U7ICAvKiBzZXJ2ZXIgZG9lc24ndCBldmVuIGhhdmUgdGhlIGV4dGVuc2lvbiAqLworCisgICAgTG9ja0Rpc3BsYXkgKGRweSk7CisgICAgR2V0UmVxIChYaW5lcmFtYUlzQWN0aXZlLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5wYW5vcmFtaVhSZXFUeXBlID0gWF9YaW5lcmFtYUlzQWN0aXZlOworICAgIGlmICghX1hSZXBseSAoZHB5LCAoeFJlcGx5ICopICZyZXAsIDAsIHhUcnVlKSkgeworCVVubG9ja0Rpc3BsYXkgKGRweSk7CisJU3luY0hhbmRsZSAoKTsKKwlyZXR1cm4gRmFsc2U7CisgICAgfQorICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7CisgICAgU3luY0hhbmRsZSAoKTsKKyAgICByZXR1cm4gcmVwLnN0YXRlOworfQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworU0RMX05BTUUoWGluZXJhbWFTY3JlZW5JbmZvKSAqIAorU0RMX05BTUUoWGluZXJhbWFRdWVyeVNjcmVlbnMpKAorICAgRGlzcGxheSAqZHB5LAorICAgaW50ICAgICAqbnVtYmVyCispCit7CisgICAgWEV4dERpc3BsYXlJbmZvCQkqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKKyAgICB4WGluZXJhbWFRdWVyeVNjcmVlbnNSZXBseQlyZXA7CisgICAgeFhpbmVyYW1hUXVlcnlTY3JlZW5zUmVxCSpyZXE7CisgICAgU0RMX05BTUUoWGluZXJhbWFTY3JlZW5JbmZvKQkJKnNjcm5JbmZvID0gTlVMTDsKKworICAgIFBhbm9yYW1pWENoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIDApOworCisgICAgTG9ja0Rpc3BsYXkgKGRweSk7CisgICAgR2V0UmVxIChYaW5lcmFtYVF1ZXJ5U2NyZWVucywgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+cGFub3JhbWlYUmVxVHlwZSA9IFhfWGluZXJhbWFRdWVyeVNjcmVlbnM7CisgICAgaWYgKCFfWFJlcGx5IChkcHksICh4UmVwbHkgKikgJnJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkgKGRweSk7CisJU3luY0hhbmRsZSAoKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZihyZXAubnVtYmVyKSB7CisJaWYoKHNjcm5JbmZvID0gWG1hbGxvYyhzaXplb2YoU0RMX05BTUUoWGluZXJhbWFTY3JlZW5JbmZvKSkgKiByZXAubnVtYmVyKSkpIHsKKwkgICAgeFhpbmVyYW1hU2NyZWVuSW5mbyBzY3JhdGNoOworCSAgICBpbnQgaTsKKworCSAgICBmb3IoaSA9IDA7IGkgPCByZXAubnVtYmVyOyBpKyspIHsKKwkJX1hSZWFkKGRweSwgKGNoYXIqKSgmc2NyYXRjaCksIHN6X1hpbmVyYW1hU2NyZWVuSW5mbyk7CisJCXNjcm5JbmZvW2ldLnNjcmVlbl9udW1iZXIgPSBpOworCQlzY3JuSW5mb1tpXS54X29yZyAJICA9IHNjcmF0Y2gueF9vcmc7CisJCXNjcm5JbmZvW2ldLnlfb3JnIAkgID0gc2NyYXRjaC55X29yZzsKKwkJc2NybkluZm9baV0ud2lkdGggCSAgPSBzY3JhdGNoLndpZHRoOworCQlzY3JuSW5mb1tpXS5oZWlnaHQgCSAgPSBzY3JhdGNoLmhlaWdodDsKKwkgICAgfQorCisJICAgICpudW1iZXIgPSByZXAubnVtYmVyOworCX0gZWxzZQorCSAgICBfWEVhdERhdGEoZHB5LCByZXAubGVuZ3RoIDw8IDIpOworICAgIH0KKworICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7CisgICAgU3luY0hhbmRsZSAoKTsKKyAgICByZXR1cm4gc2NybkluZm87Cit9CisKKworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWHYvWHYuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9Ydi9Ydi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvWHYvWHYuYwpyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L1h2L1h2LmMKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9Ydi9YdmxpYmludC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L1h2L1h2bGliaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkZjcwNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9Ydi9YdmxpYmludC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IDE5ODcgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMsCithbmQgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIENhbWJyaWRnZSwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgRGlnaXRhbCBvciBNSVQgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAkWEZyZWU4NjogeGMvbGliL1h2L1h2bGliaW50LmgsdiAxLjUgMjAwMS8wNy8yNSAxNTowNDo1MyBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIFhWTElCSU5UX0gKKyNkZWZpbmUgWFZMSUJJTlRfSAorLyoKKyoqIEZpbGU6IAorKioKKyoqICAgWHZsaWJpbnQuaCAtLS0gWHYgbGlicmFyeSBpbnRlcm5hbCBoZWFkZXIgZmlsZQorKioKKyoqIEF1dGhvcjogCisqKgorKiogICBEYXZpZCBDYXJ2ZXIgKERpZ2l0YWwgV29ya3N0YXRpb24gRW5naW5lZXJpbmcvUHJvamVjdCBBdGhlbmEpCisqKgorKiogUmV2aXNpb25zOgorKioKKyoqICAgMDEuMjQuOTEgQ2FydmVyCisqKiAgICAgLSB2ZXJzaW9uIDEuNCB1cGdyYWRlCisqKgorKi8KKworI2RlZmluZSBORUVEX1JFUExJRVMKKworLyogQXBwYXJlbnRseSBzb21lIFgxMSBzeXN0ZW1zIGNhbid0IGluY2x1ZGUgdGhpcyBtdWx0aXBsZSB0aW1lcy4uLiAqLworI2lmbmRlZiBTRExfSU5DTFVERURfWExJQklOVF9ICisjZGVmaW5lIFNETF9JTkNMVURFRF9YTElCSU5UX0ggMQorI2luY2x1ZGUgPFgxMS9YbGliaW50Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMvWHZwcm90by5oIgorI2luY2x1ZGUgIi4uL2V4dGVuc2lvbnMvWHZsaWIuaCIKKworI2lmICFkZWZpbmVkKFVOSVhDUFApCisjZGVmaW5lIFh2R2V0UmVxKG5hbWUsIHJlcSkgXAorICAgICAgICBXT1JENjRBTElHTlwKKwlpZiAoKGRweS0+YnVmcHRyICsgU0laRU9GKHh2IyNuYW1lIyNSZXEpKSA+IGRweS0+YnVmbWF4KVwKKwkJX1hGbHVzaChkcHkpO1wKKwlyZXEgPSAoeHYjI25hbWUjI1JlcSAqKShkcHktPmxhc3RfcmVxID0gZHB5LT5idWZwdHIpO1wKKwlyZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlO1wKKyAgICAgICAgcmVxLT54dlJlcVR5cGUgPSB4dl8jI25hbWU7IFwKKyAgICAgICAgcmVxLT5sZW5ndGggPSAoU0laRU9GKHh2IyNuYW1lIyNSZXEpKT4+MjtcCisJZHB5LT5idWZwdHIgKz0gU0laRU9GKHh2IyNuYW1lIyNSZXEpO1wKKwlkcHktPnJlcXVlc3QrKworCisjZWxzZSAgLyogbm9uLUFOU0kgQyB1c2VzIGVtcHR5IGNvbW1lbnQgaW5zdGVhZCBvZiAiIyMiIGZvciB0b2tlbiBjb25jYXRlbmF0aW9uICovCisjZGVmaW5lIFh2R2V0UmVxKG5hbWUsIHJlcSkgXAorICAgICAgICBXT1JENjRBTElHTlwKKwlpZiAoKGRweS0+YnVmcHRyICsgU0laRU9GKHh2LyoqL25hbWUvKiovUmVxKSkgPiBkcHktPmJ1Zm1heClcCisJCV9YRmx1c2goZHB5KTtcCisJcmVxID0gKHh2LyoqL25hbWUvKiovUmVxICopKGRweS0+bGFzdF9yZXEgPSBkcHktPmJ1ZnB0cik7XAorCXJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7XAorCXJlcS0+eHZSZXFUeXBlID0geHZfLyoqL25hbWU7XAorCXJlcS0+bGVuZ3RoID0gKFNJWkVPRih4di8qKi9uYW1lLyoqL1JlcSkpPj4yO1wKKwlkcHktPmJ1ZnB0ciArPSBTSVpFT0YoeHYvKiovbmFtZS8qKi9SZXEpO1wKKwlkcHktPnJlcXVlc3QrKworI2VuZGlmCisKKworI2VuZGlmIC8qIFhWTElCSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9YeGY4NmRnYS9YRjg2REdBLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvWHhmODZkZ2EvWEY4NkRHQS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjEwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvWHhmODZkZ2EvWEY4NkRHQS5jCkBAIC0wLDAgKzEsNzIxIEBACisvKiAkWEZyZWU4NjogeGMvbGliL1h4Zjg2ZGdhL1hGODZER0EuYyx2IDMuMTkgMjAwMS8wOC8xOCAwMjo0MTozMCBkYXdlcyBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IChjKSAxOTk1ICBKb24gVG9tYnMKK0NvcHlyaWdodCAoYykgMTk5NSwxOTk2ICBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMKKworKi8KKworLyogVEhJUyBJUyBOT1QgQU4gWCBDT05TT1JUSVVNIFNUQU5EQVJEICovCisKKyNpZmRlZiBfX0VNWF9fIC8qIG5lZWRlZCBoZXJlIHRvIG92ZXJyaWRlIGNlcnRhaW4gY29uc3RhbnRzIGluIFggaGVhZGVycyAqLworI2RlZmluZSBJTkNMX0RPUworI2RlZmluZSBJTkNMX0RPU0lPQ1RMCisjaW5jbHVkZSA8b3MyLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQobGludXgpCisjZGVmaW5lIEhBU19NTUFQX0FOT04KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorLyojaW5jbHVkZSA8YXNtL3BhZ2UuaD4qLyAgIC8qIFBBR0VfU0laRSAqLworI2RlZmluZSBIQVNfU0NfUEFHRVNJWkUgLyogX1NDX1BBR0VTSVpFIG1heSBiZSBhbiBlbnVtIGZvciBMaW51eCAqLworI2RlZmluZSBIQVNfR0VUUEFHRVNJWkUKKyNlbmRpZiAvKiBsaW51eCAqLworCisjaWYgZGVmaW5lZChDU1JHX0JBU0VEKQorI2RlZmluZSBIQVNfTU1BUF9BTk9OCisjZGVmaW5lIEhBU19HRVRQQUdFU0laRQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYgLyogQ1NSR19CQVNFRCAqLworCisjaWYgZGVmaW5lZChER1VYKQorI2RlZmluZSBIQVNfR0VUUEFHRVNJWkUKKyNkZWZpbmUgTU1BUF9ERVZfWkVSTworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYgLyogREdVWCAqLworCisjaWYgZGVmaW5lZChTVlI0KSAmJiAhZGVmaW5lZChER1VYKQorI2RlZmluZSBNTUFQX0RFVl9aRVJPCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAvKiBTVlI0ICYmICFER1VYICovCisKKyNpZiBkZWZpbmVkKHN1bikgJiYgIWRlZmluZWQoU1ZSNCkgLyogU3VuT1MgKi8KKyNkZWZpbmUgTU1BUF9ERVZfWkVSTyAgIC8qIGRvZXNuJ3QgU3VuT1MgaGF2ZSBNQVBfQU5PTiA/PyAqLworI2RlZmluZSBIQVNfR0VUUEFHRVNJWkUKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2VuZGlmIC8qIHN1biAmJiAhU1ZSNCAqLworCisjaWZkZWYgWE5PX1NZU0NPTkYKKyN1bmRlZiBfU0NfUEFHRVNJWkUKKyNlbmRpZgorCisjZGVmaW5lIE5FRURfRVZFTlRTCisjZGVmaW5lIE5FRURfUkVQTElFUworCisvKiBBcHBhcmVudGx5IHNvbWUgWDExIHN5c3RlbXMgY2FuJ3QgaW5jbHVkZSB0aGlzIG11bHRpcGxlIHRpbWVzLi4uICovCisjaWZuZGVmIFNETF9JTkNMVURFRF9YTElCSU5UX0gKKyNkZWZpbmUgU0RMX0lOQ0xVREVEX1hMSUJJTlRfSCAxCisjaW5jbHVkZSA8WDExL1hsaWJpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy94Zjg2ZGdhLmgiCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy94Zjg2ZGdhc3RyLmgiCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy9YZXh0LmgiCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy9leHR1dGlsLmgiCisKK2V4dGVybiBYRXh0RGlzcGxheUluZm8qIFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KShEaXNwbGF5Kik7CitleHRlcm4gY2hhciAqU0RMX05BTUUoeGRnYV9leHRlbnNpb25fbmFtZSk7CisKKyNkZWZpbmUgWEY4NkRHQUNoZWNrRXh0ZW5zaW9uKGRweSxpLHZhbCkgXAorICBYZXh0Q2hlY2tFeHRlbnNpb24gKGRweSwgaSwgU0RMX05BTUUoeGRnYV9leHRlbnNpb25fbmFtZSksIHZhbCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCQkgICAgcHVibGljIFhGcmVlODYtREdBIEV4dGVuc2lvbiByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0Jvb2wgU0RMX05BTUUoWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uKSAoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCAqZXZlbnRfYmFzZXAsCisgICAgaW50ICplcnJvcl9iYXNlcAorKXsKKyAgICByZXR1cm4gU0RMX05BTUUoWERHQVF1ZXJ5RXh0ZW5zaW9uKShkcHksIGV2ZW50X2Jhc2VwLCBlcnJvcl9iYXNlcCk7Cit9CisKK0Jvb2wgU0RMX05BTUUoWEY4NkRHQVF1ZXJ5VmVyc2lvbikoCisgICAgRGlzcGxheSogZHB5LAorICAgIGludCogbWFqb3JWZXJzaW9uLCAKKyAgICBpbnQqIG1pbm9yVmVyc2lvbgorKXsKKyAgICByZXR1cm4gU0RMX05BTUUoWERHQVF1ZXJ5VmVyc2lvbikoZHB5LCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbik7Cit9CisKK0Jvb2wgU0RMX05BTUUoWEY4NkRHQUdldFZpZGVvTEwpKAorICAgIERpc3BsYXkqIGRweSwKKyAgICBpbnQgc2NyZWVuLAorICAgIGludCAqb2Zmc2V0LAorICAgIGludCAqd2lkdGgsIAorICAgIGludCAqYmFua19zaXplLCAKKyAgICBpbnQgKnJhbV9zaXplCispeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WEY4NkRHQUdldFZpZGVvTExSZXBseSByZXA7CisgICAgeFhGODZER0FHZXRWaWRlb0xMUmVxICpyZXE7CisKKyAgICBYRjg2REdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NkRHQUdldFZpZGVvTEwsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hGODZER0FHZXRWaWRlb0xMOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlyZXR1cm4gRmFsc2U7CisgICAgfQorCisgICAgKm9mZnNldCA9IC8qKGNoYXIgKikqL3JlcC5vZmZzZXQ7CisgICAgKndpZHRoID0gcmVwLndpZHRoOworICAgICpiYW5rX3NpemUgPSByZXAuYmFua19zaXplOworICAgICpyYW1fc2l6ZSA9IHJlcC5yYW1fc2l6ZTsKKwkKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBUcnVlOworfQorCisgICAgCitCb29sIFNETF9OQU1FKFhGODZER0FEaXJlY3RWaWRlb0xMKSgKKyAgICBEaXNwbGF5KiBkcHksCisgICAgaW50IHNjcmVlbiwKKyAgICBpbnQgZW5hYmxlCispeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WEY4NkRHQURpcmVjdFZpZGVvUmVxICpyZXE7CisKKyAgICBYRjg2REdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NkRHQURpcmVjdFZpZGVvLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YRjg2REdBRGlyZWN0VmlkZW87CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgcmVxLT5lbmFibGUgPSBlbmFibGU7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICBYU3luYyhkcHksRmFsc2UpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sIFNETF9OQU1FKFhGODZER0FHZXRWaWV3UG9ydFNpemUpKAorICAgIERpc3BsYXkqIGRweSwKKyAgICBpbnQgc2NyZWVuLAorICAgIGludCAqd2lkdGgsIAorICAgIGludCAqaGVpZ2h0CispeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WEY4NkRHQUdldFZpZXdQb3J0U2l6ZVJlcGx5IHJlcDsKKyAgICB4WEY4NkRHQUdldFZpZXdQb3J0U2l6ZVJlcSAqcmVxOworCisgICAgWEY4NkRHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhGODZER0FHZXRWaWV3UG9ydFNpemUsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hGODZER0FHZXRWaWV3UG9ydFNpemU7CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKKwlVbmxvY2tEaXNwbGF5KGRweSk7CisJU3luY0hhbmRsZSgpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisKKyAgICAqd2lkdGggPSByZXAud2lkdGg7CisgICAgKmhlaWdodCA9IHJlcC5oZWlnaHQ7CisJCisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKyAgICAKKyAgICAKK0Jvb2wgU0RMX05BTUUoWEY4NkRHQVNldFZpZXdQb3J0KSgKKyAgICBEaXNwbGF5KiBkcHksCisgICAgaW50IHNjcmVlbiwKKyAgICBpbnQgeCwgCisgICAgaW50IHkKKyl7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOworICAgIHhYRjg2REdBU2V0Vmlld1BvcnRSZXEgKnJlcTsKKworICAgIFhGODZER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2REdBU2V0Vmlld1BvcnQsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hGODZER0FTZXRWaWV3UG9ydDsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPnggPSB4OworICAgIHJlcS0+eSA9IHk7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICBYU3luYyhkcHksRmFsc2UpOworICAgIHJldHVybiBUcnVlOworfQorCisgICAgCitCb29sIFNETF9OQU1FKFhGODZER0FHZXRWaWRQYWdlKSgKKyAgICBEaXNwbGF5KiBkcHksCisgICAgaW50IHNjcmVlbiwKKyAgICBpbnQgKnZwYWdlCispeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WEY4NkRHQUdldFZpZFBhZ2VSZXBseSByZXA7CisgICAgeFhGODZER0FHZXRWaWRQYWdlUmVxICpyZXE7CisKKyAgICBYRjg2REdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NkRHQUdldFZpZFBhZ2UsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hGODZER0FHZXRWaWRQYWdlOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlyZXR1cm4gRmFsc2U7CisgICAgfQorCisgICAgKnZwYWdlID0gcmVwLnZwYWdlOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIFRydWU7Cit9CisKKyAgICAKK0Jvb2wgU0RMX05BTUUoWEY4NkRHQVNldFZpZFBhZ2UpKAorICAgIERpc3BsYXkqIGRweSwKKyAgICBpbnQgc2NyZWVuLAorICAgIGludCB2cGFnZQorKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisgICAgeFhGODZER0FTZXRWaWRQYWdlUmVxICpyZXE7CisKKyAgICBYRjg2REdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NkRHQVNldFZpZFBhZ2UsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hGODZER0FTZXRWaWRQYWdlOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+dnBhZ2UgPSB2cGFnZTsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIFhTeW5jKGRweSxGYWxzZSk7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wgU0RMX05BTUUoWEY4NkRHQUluc3RhbGxDb2xvcm1hcCkoCisgICAgRGlzcGxheSogZHB5LAorICAgIGludCBzY3JlZW4sCisgICAgQ29sb3JtYXAgY21hcAorKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisgICAgeFhGODZER0FJbnN0YWxsQ29sb3JtYXBSZXEgKnJlcTsKKworICAgIFhGODZER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2REdBSW5zdGFsbENvbG9ybWFwLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YRjg2REdBSW5zdGFsbENvbG9ybWFwOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+aWQgPSBjbWFwOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgWFN5bmMoZHB5LEZhbHNlKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbCBTRExfTkFNRShYRjg2REdBUXVlcnlEaXJlY3RWaWRlbykoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCBzY3JlZW4sCisgICAgaW50ICpmbGFncworKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisgICAgeFhGODZER0FRdWVyeURpcmVjdFZpZGVvUmVwbHkgcmVwOworICAgIHhYRjg2REdBUXVlcnlEaXJlY3RWaWRlb1JlcSAqcmVxOworCisgICAgWEY4NkRHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhGODZER0FRdWVyeURpcmVjdFZpZGVvLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YRjg2REdBUXVlcnlEaXJlY3RWaWRlbzsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKyAgICAqZmxhZ3MgPSByZXAuZmxhZ3M7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbCBTRExfTkFNRShYRjg2REdBVmlld1BvcnRDaGFuZ2VkKSgKKyAgICBEaXNwbGF5ICpkcHksCisgICAgaW50IHNjcmVlbiwKKyAgICBpbnQgbgorKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisgICAgeFhGODZER0FWaWV3UG9ydENoYW5nZWRSZXBseSByZXA7CisgICAgeFhGODZER0FWaWV3UG9ydENoYW5nZWRSZXEgKnJlcTsKKworICAgIFhGODZER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2REdBVmlld1BvcnRDaGFuZ2VkLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YRjg2REdBVmlld1BvcnRDaGFuZ2VkOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+biA9IG47CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKKwlVbmxvY2tEaXNwbGF5KGRweSk7CisJU3luY0hhbmRsZSgpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gcmVwLnJlc3VsdDsKK30KKworCisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KKworI2luY2x1ZGUgPFgxMS9YbWQuaD4KKyNpbmNsdWRlICIuLi9leHRlbnNpb25zL3hmODZkZ2EuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWYgZGVmaW5lZChJU0MpIAorIyBkZWZpbmUgSEFTX1NWUjNfTU1BUAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8ZXJybm8uaD4KKworIyBpbmNsdWRlIDxzeXMvYXRfYW5zaS5oPgorIyBpbmNsdWRlIDxzeXMva2QuaD4KKworIyBpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjIGluY2x1ZGUgPHN5cy9pbW11Lmg+CisjIGluY2x1ZGUgPHN5cy9yZWdpb24uaD4KKworIyBpbmNsdWRlIDxzeXMvbW1hcC5oPgorI2Vsc2UKKyMgaWYgIWRlZmluZWQoTHlueCkKKyMgIGlmICFkZWZpbmVkKF9fRU1YX18pCisjICAgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgIGVuZGlmCisjIGVsc2UKKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgIGluY2x1ZGUgPHNtZW0uaD4KKyMgZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZiBkZWZpbmVkKFNWUjQpICYmICFkZWZpbmVkKHN1bikgJiYgIWRlZmluZWQoU0NPMzI1KQorI2RlZmluZSBERVZfTUVNICIvZGV2L3BtZW0iCisjZWxpZiBkZWZpbmVkKFNWUjQpICYmIGRlZmluZWQoc3VuKQorI2RlZmluZSBERVZfTUVNICIvZGV2L3hzdmMiCisjZWxzZQorI2RlZmluZSBERVZfTUVNICIvZGV2L21lbSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgbG9uZyBwaHlzYWRkcjsJLyogYWN0dWFsIHJlcXVlc3RlZCBwaHlzaWNhbCBhZGRyZXNzICovCisgICAgdW5zaWduZWQgbG9uZyBzaXplOwkJLyogYWN0dWFsIHJlcXVlc3RlZCBtYXAgc2l6ZSAqLworICAgIHVuc2lnbmVkIGxvbmcgZGVsdGE7CS8qIGRlbHRhIHRvIGFjY291bnQgZm9yIHBhZ2UgYWxpZ25tZW50ICovCisgICAgdm9pZCAqCSAgdmFkZHI7CS8qIG1hcHBlZCBhZGRyZXNzLCB3aXRob3V0IHRoZSBkZWx0YSAqLworICAgIGludAkJICByZWZjb3VudDsJLyogcmVmZXJlbmNlIGNvdW50ICovCit9IE1hcFJlYywgKk1hcFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERpc3BsYXkgKglkaXNwbGF5OworICAgIGludAkJc2NyZWVuOworICAgIE1hcFB0cgltYXA7Cit9IFNjclJlYywgKlNjclB0cjsKKworc3RhdGljIGludCBtYXBGZCA9IC0xOworc3RhdGljIGludCBudW1NYXBzID0gMDsKK3N0YXRpYyBpbnQgbnVtU2NycyA9IDA7CitzdGF0aWMgTWFwUHRyICptYXBMaXN0ID0gTlVMTDsKK3N0YXRpYyBTY3JQdHIgKnNjckxpc3QgPSBOVUxMOworCitzdGF0aWMgTWFwUHRyCitBZGRNYXAodm9pZCkKK3sKKyAgICBNYXBQdHIgKm9sZDsKKworICAgIG9sZCA9IG1hcExpc3Q7CisgICAgbWFwTGlzdCA9IHJlYWxsb2MobWFwTGlzdCwgc2l6ZW9mKE1hcFB0cikgKiAobnVtTWFwcyArIDEpKTsKKyAgICBpZiAoIW1hcExpc3QpIHsKKwltYXBMaXN0ID0gb2xkOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICBtYXBMaXN0W251bU1hcHNdID0gbWFsbG9jKHNpemVvZihNYXBSZWMpKTsKKyAgICBpZiAoIW1hcExpc3RbbnVtTWFwc10pCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG1hcExpc3RbbnVtTWFwcysrXTsKK30KKworc3RhdGljIFNjclB0cgorQWRkU2NyKHZvaWQpCit7CisgICAgU2NyUHRyICpvbGQ7CisKKyAgICBvbGQgPSBzY3JMaXN0OworICAgIHNjckxpc3QgPSByZWFsbG9jKHNjckxpc3QsIHNpemVvZihTY3JQdHIpICogKG51bVNjcnMgKyAxKSk7CisgICAgaWYgKCFzY3JMaXN0KSB7CisJc2NyTGlzdCA9IG9sZDsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2NyTGlzdFtudW1TY3JzXSA9IG1hbGxvYyhzaXplb2YoU2NyUmVjKSk7CisgICAgaWYgKCFzY3JMaXN0W251bVNjcnNdKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiBzY3JMaXN0W251bVNjcnMrK107Cit9CisKK3N0YXRpYyBNYXBQdHIKK0ZpbmRNYXAodW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwczsgaSsrKSB7CisJaWYgKG1hcExpc3RbaV0tPnBoeXNhZGRyID09IGFkZHJlc3MgJiYKKwkgICAgbWFwTGlzdFtpXS0+c2l6ZSA9PSBzaXplKQorCSAgICByZXR1cm4gbWFwTGlzdFtpXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBTY3JQdHIKK0ZpbmRTY3IoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1TY3JzOyBpKyspIHsKKwlpZiAoc2NyTGlzdFtpXS0+ZGlzcGxheSA9PSBkaXNwbGF5ICYmCisJICAgIHNjckxpc3RbaV0tPnNjcmVlbiA9PSBzY3JlZW4pCisJICAgIHJldHVybiBzY3JMaXN0W2ldOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKgorTWFwUGh5c0FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGRlbHRhOworICAgIGludCBwYWdlc2l6ZSA9IC0xOworICAgIHZvaWQgKnZhZGRyOworICAgIE1hcFB0ciBtcDsKKyNpZiBkZWZpbmVkKElTQykgJiYgZGVmaW5lZChIQVNfU1ZSM19NTUFQKQorICAgIHN0cnVjdCBrZF9tZW1sb2MgbWxvYzsKKyNlbGlmIGRlZmluZWQoX19FTVhfXykKKyAgICBBUElSRVQgcmM7CisgICAgVUxPTkcgYWN0aW9uOworICAgIEhGSUxFIGhmZDsKKyNlbmRpZgorCisgICAgaWYgKChtcCA9IEZpbmRNYXAoYWRkcmVzcywgc2l6ZSkpKSB7CisJbXAtPnJlZmNvdW50Kys7CisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW1wLT52YWRkciArIG1wLT5kZWx0YSk7CisgICAgfQorCisjaWYgZGVmaW5lZChfU0NfUEFHRVNJWkUpICYmIGRlZmluZWQoSEFTX1NDX1BBR0VTSVpFKQorICAgIHBhZ2VzaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworI2VuZGlmCisjaWZkZWYgX1NDX1BBR0VfU0laRQorICAgIGlmIChwYWdlc2l6ZSA9PSAtMSkKKwlwYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisjZW5kaWYKKyNpZmRlZiBIQVNfR0VUUEFHRVNJWkUKKyAgICBpZiAocGFnZXNpemUgPT0gLTEpCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworI2VuZGlmCisjaWZkZWYgUEFHRV9TSVpFCisgICAgaWYgKHBhZ2VzaXplID09IC0xKQorCXBhZ2VzaXplID0gUEFHRV9TSVpFOworI2VuZGlmCisgICAgaWYgKHBhZ2VzaXplID09IC0xKQorCXBhZ2VzaXplID0gNDA5NjsKKworICAgZGVsdGEgPSBhZGRyZXNzICUgcGFnZXNpemU7CisgICBvZmZzZXQgPSBhZGRyZXNzIC0gZGVsdGE7CisKKyNpZiBkZWZpbmVkKElTQykgJiYgZGVmaW5lZChIQVNfU1ZSM19NTUFQKQorICAgIGlmIChtYXBGZCA8IDApIHsKKwlpZiAoKG1hcEZkID0gb3BlbigiL2Rldi9tbWFwIiwgT19SRFdSKSkgPCAwKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWxvYy52YWRkciA9IChjaGFyICopMDsKKyAgICBtbG9jLnBoeXNhZGRyID0gKGNoYXIgKilvZmZzZXQ7CisgICAgbWxvYy5sZW5ndGggPSBzaXplICsgZGVsdGE7CisgICAgbWxvYy5pb2ZsZz0xOworCisgICAgaWYgKCh2YWRkciA9ICh2b2lkICopaW9jdGwobWFwRmQsIE1BUCwgJm1sb2MpKSA9PSAodm9pZCAqKS0xKQorCXJldHVybiBOVUxMOworI2VsaWYgZGVmaW5lZCAoX19FTVhfXykKKyAgICAvKgorICAgICAqIERyYWdvbiB3YXJuaW5nIGhlcmUhIC9kZXYvcG1hcCQgaXMgbmV2ZXIgY2xvc2VkLCBleGNlcHQgb24gcHJvZ2FtIGV4aXQuCisgICAgICogQ29uc2VjdXRpdmUgY2FsbGluZyBvZiB0aGlzIHJvdXRpbmUgd2lsbCBtYWtlIFBNQVAkIGRyaXZlciBydW4gb3V0CisgICAgICogb2YgbWVtb3J5IGhhbmRsZXMuIFNvbWUgdW1hcC9jbG9zZSBtZWNoYW5pc20gc2hvdWxkIGJlIHByb3ZpZGVkCisgICAgICovCisKKyAgICByYyA9IERvc09wZW4oIi9kZXYvcG1hcCQiLCAmaGZkLCAmYWN0aW9uLCAwLCBGSUxFX05PUk1BTCwgRklMRV9PUEVOLAorCQkgT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgT1BFTl9TSEFSRV9ERU5ZTk9ORSwgKFBFQU9QMilOVUxMKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gTlVMTDsKKyAgICB7CisJc3RydWN0IG1hcF9pb2N0bCB7CisJCXVuaW9uIHsKKwkJCVVMT05HIHBoeXM7CisJCQl2b2lkKiB1c2VyOworCQl9IGE7CisJCVVMT05HIHNpemU7CisJfSBwbWFwLGRtYXA7CisJVUxPTkcgcGxlbixkbGVuOworI2RlZmluZSBYRlJFRTg2X1BNQVAJMHg3NgorI2RlZmluZSBQTUFQX01BUAkweDQ0CisKKwlwbWFwLmEucGh5cyA9IG9mZnNldDsKKwlwbWFwLnNpemUgPSBzaXplICsgZGVsdGE7CisJcmMgPSBEb3NEZXZJT0N0bChoZmQsIFhGUkVFODZfUE1BUCwgUE1BUF9NQVAsCisJCQkgKFBVTE9ORykmcG1hcCwgc2l6ZW9mKHBtYXApLCAmcGxlbiwKKwkJCSAoUFVMT05HKSZkbWFwLCBzaXplb2YoZG1hcCksICZkbGVuKTsKKwlpZiAocmMgPT0gMCkgeworCQl2YWRkciA9IGRtYXAuYS51c2VyOworCX0KKyAgIH0KKyAgIGlmIChyYyAhPSAwKQorCXJldHVybiBOVUxMOworI2VsaWYgZGVmaW5lZCAoTHlueCkKKyAgICB2YWRkciA9ICh2b2lkICopc21lbV9jcmVhdGUoIlhGODZER0EiLCAoY2hhciAqKW9mZnNldCwgCisJCQkJc2l6ZSArIGRlbHRhLCBTTV9SRUFEfFNNX1dSSVRFKTsKKyNlbHNlCisjaWZuZGVmIE1BUF9GSUxFCisjZGVmaW5lIE1BUF9GSUxFIDAKKyNlbmRpZgorICAgIGlmIChtYXBGZCA8IDApIHsKKwlpZiAoKG1hcEZkID0gb3BlbihERVZfTUVNLCBPX1JEV1IpKSA8IDApCisJICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2YWRkciA9ICh2b2lkICopbW1hcChOVUxMLCBzaXplICsgZGVsdGEsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICBNQVBfRklMRSB8IE1BUF9TSEFSRUQsIG1hcEZkLCAob2ZmX3Qpb2Zmc2V0KTsKKyAgICBpZiAodmFkZHIgPT0gKHZvaWQgKiktMSkKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCisgICAgaWYgKCF2YWRkcikgeworCWlmICghKG1wID0gQWRkTWFwKCkpKQorCSAgICByZXR1cm4gTlVMTDsKKwltcC0+cGh5c2FkZHIgPSBhZGRyZXNzOworCW1wLT5zaXplID0gc2l6ZTsKKwltcC0+ZGVsdGEgPSBkZWx0YTsKKwltcC0+dmFkZHIgPSB2YWRkcjsKKwltcC0+cmVmY291bnQgPSAxOworICAgIH0KKyAgICByZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdmFkZHIgKyBkZWx0YSk7Cit9CisKKy8qCisgKiBTdGlsbCBuZWVkIHRvIGZpbmQgYSBjbGVhbiB3YXkgb2YgZGV0ZWN0aW5nIHRoZSBkZWF0aCBvZiBhIERHQSBhcHAKKyAqIGFuZCByZXR1cm5pbmcgdGhpbmdzIHRvIG5vcm1hbCAtIEpvbgorICogVGhpcyBpcyBoZXJlIHRvIGhlbHAgZGVidWdnaW5nIHdpdGhvdXQgcmVib290aW5nLi4uIEFsc28gQy1BLUJTCisgKiBzaG91bGQgcmVzdG9yZSB0ZXh0IG1vZGUuCisgKi8KKworaW50CitTRExfTkFNRShYRjg2REdBRm9ya0FwcCkoaW50IHNjcmVlbikKK3sKKyAgICBwaWRfdCBwaWQ7CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgaTsKKworICAgICAvKiBmb3JrIHRoZSBhcHAsIHBhcmVudCBoYW5ncyBhcm91bmQgdG8gY2xlYW4gdXAgKi8KKyAgICBpZiAoKHBpZCA9IGZvcmsoKSkgPiAwKSB7CisJU2NyUHRyIHNwOworCisJd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCWZvciAoaSA9IDA7IGkgPCBudW1TY3JzOyBpKyspIHsKKwkgICAgc3AgPSBzY3JMaXN0W2ldOworCSAgICBTRExfTkFNRShYRjg2REdBRGlyZWN0VmlkZW9MTCkoc3AtPmRpc3BsYXksIHNwLT5zY3JlZW4sIDApOworCSAgICBYU3luYyhzcC0+ZGlzcGxheSwgRmFsc2UpOworCX0KKyAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisJICAgIGV4aXQoMCk7CisJZWxzZQorCSAgICBleGl0KC0xKTsKKyAgICB9CisgICAgcmV0dXJuIHBpZDsKK30KKworCitCb29sCitTRExfTkFNRShYRjg2REdBRGlyZWN0VmlkZW8pKAorICAgIERpc3BsYXkgKmRpcywKKyAgICBpbnQgc2NyZWVuLAorICAgIGludCBlbmFibGUKKyl7CisgICAgU2NyUHRyIHNwOworICAgIE1hcFB0ciBtcCA9IE5VTEw7CisKKyAgICBpZiAoKHNwID0gRmluZFNjcihkaXMsIHNjcmVlbikpKQorCW1wID0gc3AtPm1hcDsKKworICAgIGlmIChlbmFibGUgJiBYRjg2REdBRGlyZWN0R3JhcGhpY3MpIHsKKyNpZiAhZGVmaW5lZChJU0MpICYmICFkZWZpbmVkKEhBU19TVlIzX01NQVApICYmICFkZWZpbmVkKEx5bngpIFwKKwkmJiAhZGVmaW5lZChfX0VNWF9fKQorCWlmIChtcCAmJiBtcC0+dmFkZHIpCisJICAgIG1wcm90ZWN0KG1wLT52YWRkciwgbXAtPnNpemUgKyBtcC0+ZGVsdGEsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyNpZiAhZGVmaW5lZChJU0MpICYmICFkZWZpbmVkKEhBU19TVlIzX01NQVApICYmICFkZWZpbmVkKEx5bngpIFwKKwkmJiAhZGVmaW5lZChfX0VNWF9fKQorCWlmIChtcCAmJiBtcC0+dmFkZHIpCisJICAgIG1wcm90ZWN0KG1wLT52YWRkciwgbXAtPnNpemUgKyBtcC0+ZGVsdGEsIFBST1RfUkVBRCk7CisjZWxpZiBkZWZpbmVkKEx5bngpCisJLyogWFhYIHRoaXMgZG9lc24ndCBhbGxvdyBlbmFibGUgYWZ0ZXIgZGlzYWJsZSAqLworCXNtZW1fY3JlYXRlKE5VTEwsIG1wLT52YWRkciwgbXAtPnNpemUgKyBtcC0+ZGVsdGEsIFNNX0RFVEFDSCk7CisJc21lbV9yZW1vdmUoIlhGODZER0EiKTsKKyNlbmRpZgorICAgIH0KKworICAgIFNETF9OQU1FKFhGODZER0FEaXJlY3RWaWRlb0xMKShkaXMsIHNjcmVlbiwgZW5hYmxlKTsKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgdm9pZAorWEY4NmNsZWFudXAoaW50IHNpZykKK3sKKyAgICBTY3JQdHIgc3A7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNoYXIgYmVlbmhlcmUgPSAwOworCisgICAgaWYgKGJlZW5oZXJlKQorCSAgICBleGl0KDMpOworICAgIGJlZW5oZXJlID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1TY3JzOyBpKyspIHsKKwlzcCA9IHNjckxpc3RbaV07CisJU0RMX05BTUUoWEY4NkRHQURpcmVjdFZpZGVvKShzcC0+ZGlzcGxheSwgc3AtPnNjcmVlbiwgMCk7CisJWFN5bmMoc3AtPmRpc3BsYXksIEZhbHNlKTsKKyAgICB9CisgICAgZXhpdCgzKTsKK30KKworQm9vbAorU0RMX05BTUUoWEY4NkRHQUdldFZpZGVvKSgKKyAgICBEaXNwbGF5ICpkaXMsCisgICAgaW50IHNjcmVlbiwKKyAgICBjaGFyICoqYWRkciwKKyAgICBpbnQgKndpZHRoLCAKKyAgICBpbnQgKmJhbmssIAorICAgIGludCAqcmFtCispeworICAgIC8qdW5zaWduZWQgbG9uZyovIGludCBvZmZzZXQ7CisgICAgc3RhdGljIGludCBiZWVuSGVyZSA9IDA7CisgICAgU2NyUHRyIHNwOworICAgIE1hcFB0ciBtcDsKKworICAgIGlmICghKHNwID0gRmluZFNjcihkaXMsIHNjcmVlbikpKSB7CisJaWYgKCEoc3AgPSBBZGRTY3IoKSkpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJYRjg2REdBR2V0VmlkZW86IG1hbGxvYyBmYWlsdXJlXG4iKTsKKwkgICAgZXhpdCgtMik7CisJfQorCXNwLT5kaXNwbGF5ID0gZGlzOworCXNwLT5zY3JlZW4gPSBzY3JlZW47CisJc3AtPm1hcCA9IE5VTEw7CisgICAgfQorCisgICAgU0RMX05BTUUoWEY4NkRHQUdldFZpZGVvTEwpKGRpcywgc2NyZWVuICwgJm9mZnNldCwgd2lkdGgsIGJhbmssIHJhbSk7CisKKyAgICAqYWRkciA9IE1hcFBoeXNBZGRyZXNzKG9mZnNldCwgKmJhbmspOworICAgIGlmICgqYWRkciA9PSBOVUxMKSB7CisJZnByaW50ZihzdGRlcnIsICJYRjg2REdBR2V0VmlkZW86IGZhaWxlZCB0byBtYXAgdmlkZW8gbWVtb3J5ICglcylcbiIsCisJCXN0cmVycm9yKGVycm5vKSk7CisJZXhpdCgtMik7CisgICAgfQorCisgICAgaWYgKChtcCA9IEZpbmRNYXAob2Zmc2V0LCAqYmFuaykpKQorCXNwLT5tYXAgPSBtcDsKKworICAgIGlmICghYmVlbkhlcmUpIHsKKwliZWVuSGVyZSA9IDE7CisJYXRleGl0KCh2b2lkKCopKHZvaWQpKVhGODZjbGVhbnVwKTsKKwkvKiBvbmUgc2hvdCBYRjg2Y2xlYW51cCBhdHRlbXB0cyAqLworCXNpZ25hbChTSUdTRUdWLCBYRjg2Y2xlYW51cCk7CisjaWZkZWYgU0lHQlVTCisJc2lnbmFsKFNJR0JVUywgWEY4NmNsZWFudXApOworI2VuZGlmCisJc2lnbmFsKFNJR0hVUCwgWEY4NmNsZWFudXApOworCXNpZ25hbChTSUdGUEUsIFhGODZjbGVhbnVwKTsgIAorICAgIH0KKworICAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvWHhmODZkZ2EvWEY4NkRHQTIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9YeGY4NmRnYS9YRjg2REdBMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDRmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvWHhmODZkZ2EvWEY4NkRHQTIuYwpAQCAtMCwwICsxLDk5MyBAQAorLyogJFhGcmVlODY6IHhjL2xpYi9YeGY4NmRnYS9YRjg2REdBMi5jLHYgMS4xOCAyMDAxLzA4LzE3IDEzOjI3OjUxIGRhd2VzIEV4cCAkICovCisvKgorCitDb3B5cmlnaHQgKGMpIDE5OTUgIEpvbiBUb21icworQ29weXJpZ2h0IChjKSAxOTk1LDE5OTYgIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYworCisqLworCisvKiBUSElTIElTIE5PVCBBTiBYIENPTlNPUlRJVU0gU1RBTkRBUkQgKi8KKworI2lmZGVmIF9fRU1YX18gLyogbmVlZGVkIGhlcmUgdG8gb3ZlcnJpZGUgY2VydGFpbiBjb25zdGFudHMgaW4gWCBoZWFkZXJzICovCisjZGVmaW5lIElOQ0xfRE9TCisjZGVmaW5lIElOQ0xfRE9TSU9DVEwKKyNpbmNsdWRlIDxvczIuaD4KKyNlbmRpZgorCisjZGVmaW5lIE5FRURfRVZFTlRTCisjZGVmaW5lIE5FRURfUkVQTElFUworCisvKiBBcHBhcmVudGx5IHNvbWUgWDExIHN5c3RlbXMgY2FuJ3QgaW5jbHVkZSB0aGlzIG11bHRpcGxlIHRpbWVzLi4uICovCisjaWZuZGVmIFNETF9JTkNMVURFRF9YTElCSU5UX0gKKyNkZWZpbmUgU0RMX0lOQ0xVREVEX1hMSUJJTlRfSCAxCisjaW5jbHVkZSA8WDExL1hsaWJpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy94Zjg2ZGdhLmgiCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy94Zjg2ZGdhc3RyLmgiCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy9YZXh0LmgiCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy9leHR1dGlsLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmIGRlZmluZWQoRU5BQkxFX0ZCQ09OKSAgLyogTmVlZGVkIGZvciBmcmFtZWJ1ZmZlciBjb25zb2xlIHN1cHBvcnQgKi8KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2VuZGlmCisKKy8qIElmIHlvdSBjaGFuZ2UgdGhpcywgY2hhbmdlIHRoZSBCYXNlc1tdIGFycmF5IGJlbG93IGFzIHdlbGwgKi8KKyNkZWZpbmUgTUFYX0hFQURTIDE2CisKK2NoYXIgKlNETF9OQU1FKHhkZ2FfZXh0ZW5zaW9uX25hbWUpID0gWEY4NkRHQU5BTUU7CisKK3N0YXRpYyBYRXh0ZW5zaW9uSW5mbyBfeGRnYV9pbmZvX2RhdGE7CitzdGF0aWMgWEV4dGVuc2lvbkluZm8gKnhkZ2FfaW5mbyA9ICZfeGRnYV9pbmZvX2RhdGE7CisKKyAKK0Jvb2wgU0RMX05BTUUoWERHQU1hcEZyYW1lYnVmZmVyKShpbnQsIGNoYXIgKiwgdW5zaWduZWQgY2hhciosIENBUkQzMiwgQ0FSRDMyLCBDQVJEMzIpOwordm9pZCBTRExfTkFNRShYREdBVW5tYXBGcmFtZWJ1ZmZlcikoaW50KTsKK3Vuc2lnbmVkIGNoYXIqIFNETF9OQU1FKFhER0FHZXRNYXBwZWRNZW1vcnkpKGludCk7CisKKyNkZWZpbmUgWERHQUNoZWNrRXh0ZW5zaW9uKGRweSxpLHZhbCkgXAorICBYZXh0Q2hlY2tFeHRlbnNpb24gKGRweSwgaSwgU0RMX05BTUUoeGRnYV9leHRlbnNpb25fbmFtZSksIHZhbCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCQkJICAgcHJpdmF0ZSB1dGlsaXR5IHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB4ZGdhX2Nsb3NlX2Rpc3BsYXkoRGlzcGxheSAqZHB5LCBYRXh0Q29kZXMgKmNvZGVzKTsKK3N0YXRpYyBCb29sIHhkZ2Ffd2lyZV90b19ldmVudChEaXNwbGF5ICpkcHksIFhFdmVudCAqZXZlbnQsIHhFdmVudCAqd2lyZV9ldik7CitzdGF0aWMgU3RhdHVzIHhkZ2FfZXZlbnRfdG9fd2lyZShEaXNwbGF5ICpkcHksIFhFdmVudCAqZXZlbnQsIHhFdmVudCAqd2lyZV9ldik7CisKK3N0YXRpYyBYRXh0ZW5zaW9uSG9va3MgeGRnYV9leHRlbnNpb25faG9va3MgPSB7CisgICAgTlVMTCwJCQkJLyogY3JlYXRlX2djICovCisgICAgTlVMTCwJCQkJLyogY29weV9nYyAqLworICAgIE5VTEwsCQkJCS8qIGZsdXNoX2djICovCisgICAgTlVMTCwJCQkJLyogZnJlZV9nYyAqLworICAgIE5VTEwsCQkJCS8qIGNyZWF0ZV9mb250ICovCisgICAgTlVMTCwJCQkJLyogZnJlZV9mb250ICovCisgICAgeGRnYV9jbG9zZV9kaXNwbGF5LAkJCS8qIGNsb3NlX2Rpc3BsYXkgKi8KKyAgICB4ZGdhX3dpcmVfdG9fZXZlbnQsCQkJLyogd2lyZV90b19ldmVudCAqLworICAgIHhkZ2FfZXZlbnRfdG9fd2lyZSwJCQkvKiBldmVudF90b193aXJlICovCisgICAgTlVMTCwJCQkJLyogZXJyb3IgKi8KKyAgICBOVUxMLAkJCQkvKiBlcnJvcl9zdHJpbmcgKi8KK307CisKK3N0YXRpYyBYRVhUX0dFTkVSQVRFX0NMT1NFX0RJU1BMQVkgKHhkZ2FfY2xvc2VfZGlzcGxheSwgeGRnYV9pbmZvKQorCisKK1hFWFRfR0VORVJBVEVfRklORF9ESVNQTEFZIChTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSksIHhkZ2FfaW5mbywgCisJCQkJICAgIlhGcmVlODYtREdBIiwgCisJCQkJICAgJnhkZ2FfZXh0ZW5zaW9uX2hvb2tzLCAKKwkJCQkgICAwLCBOVUxMKQorCisKK3N0YXRpYyBTdGF0dXMKK3hkZ2FfZXZlbnRfdG9fd2lyZSgKKyAgRGlzcGxheSAqZHB5LAorICBYRXZlbnQgKmV2ZW50LAorICB4RXZlbnQgKndpcmVfZXYKKyl7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK3N0YXRpYyBCb29sCit4ZGdhX3dpcmVfdG9fZXZlbnQoCisgIERpc3BsYXkgKmRweSwKKyAgWEV2ZW50ICpldmVudCwKKyAgeEV2ZW50ICp3aXJlX2V2CispeworICBkZ2FFdmVudCAqd2lyZSA9IChkZ2FFdmVudCAqKSB3aXJlX2V2OworICBTRExfTkFNRShYREdBQnV0dG9uRXZlbnQpICpiZXZlbnQ7CisgIFNETF9OQU1FKFhER0FLZXlFdmVudCkgKmtldmVudDsKKyAgU0RMX05BTUUoWERHQU1vdGlvbkV2ZW50KSAqbWV2ZW50OworICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisKKyAgWERHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKKworICBzd2l0Y2goKHdpcmUtPnUudS50eXBlICYgMHg3ZikgLSBpbmZvLT5jb2Rlcy0+Zmlyc3RfZXZlbnQpIHsKKyAgY2FzZSBNb3Rpb25Ob3RpZnk6CisJbWV2ZW50ID0gKFNETF9OQU1FKFhER0FNb3Rpb25FdmVudCkqKWV2ZW50OworCW1ldmVudC0+dHlwZSA9IHdpcmUtPnUudS50eXBlICYgMHg3RjsKKwltZXZlbnQtPnNlcmlhbCA9IF9YU2V0TGFzdFJlcXVlc3RSZWFkKGRweSwgKHhHZW5lcmljUmVwbHkgKil3aXJlKTsKKwltZXZlbnQtPmRpc3BsYXkgPSBkcHk7CisJbWV2ZW50LT5zY3JlZW4gPSB3aXJlLT51LmV2ZW50LnNjcmVlbjsKKwltZXZlbnQtPnRpbWUgPSB3aXJlLT51LmV2ZW50LnRpbWU7CisJbWV2ZW50LT5zdGF0ZSA9IHdpcmUtPnUuZXZlbnQuc3RhdGU7CisJbWV2ZW50LT5keCA9IHdpcmUtPnUuZXZlbnQuZHg7CisJbWV2ZW50LT5keSA9IHdpcmUtPnUuZXZlbnQuZHk7CisJcmV0dXJuIFRydWU7CisgIGNhc2UgQnV0dG9uUHJlc3M6CisgIGNhc2UgQnV0dG9uUmVsZWFzZToKKwliZXZlbnQgPSAoU0RMX05BTUUoWERHQUJ1dHRvbkV2ZW50KSopZXZlbnQ7CisJYmV2ZW50LT50eXBlID0gd2lyZS0+dS51LnR5cGUgJiAweDdGOworCWJldmVudC0+c2VyaWFsID0gX1hTZXRMYXN0UmVxdWVzdFJlYWQoZHB5LCAoeEdlbmVyaWNSZXBseSAqKXdpcmUpOworCWJldmVudC0+ZGlzcGxheSA9IGRweTsKKwliZXZlbnQtPnNjcmVlbiA9IHdpcmUtPnUuZXZlbnQuc2NyZWVuOworCWJldmVudC0+dGltZSA9IHdpcmUtPnUuZXZlbnQudGltZTsKKwliZXZlbnQtPnN0YXRlID0gd2lyZS0+dS5ldmVudC5zdGF0ZTsKKwliZXZlbnQtPmJ1dHRvbiA9IHdpcmUtPnUudS5kZXRhaWw7CisJcmV0dXJuIFRydWU7CisgIGNhc2UgS2V5UHJlc3M6CisgIGNhc2UgS2V5UmVsZWFzZToKKwlrZXZlbnQgPSAoU0RMX05BTUUoWERHQUtleUV2ZW50KSopZXZlbnQ7CisJa2V2ZW50LT50eXBlID0gd2lyZS0+dS51LnR5cGUgJiAweDdGOworCWtldmVudC0+c2VyaWFsID0gX1hTZXRMYXN0UmVxdWVzdFJlYWQoZHB5LCAoeEdlbmVyaWNSZXBseSAqKXdpcmUpOworCWtldmVudC0+ZGlzcGxheSA9IGRweTsKKwlrZXZlbnQtPnNjcmVlbiA9IHdpcmUtPnUuZXZlbnQuc2NyZWVuOworCWtldmVudC0+dGltZSA9IHdpcmUtPnUuZXZlbnQudGltZTsKKwlrZXZlbnQtPnN0YXRlID0gd2lyZS0+dS5ldmVudC5zdGF0ZTsKKwlrZXZlbnQtPmtleWNvZGUgPSB3aXJlLT51LnUuZGV0YWlsOworCXJldHVybiBUcnVlOworICB9CisKKyAgcmV0dXJuIEZhbHNlOworfQorCisKK0Jvb2wgU0RMX05BTUUoWERHQVF1ZXJ5RXh0ZW5zaW9uKSAoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCAqZXZlbnRfYmFzZXAsCisgICAgaW50ICplcnJvcl9iYXNlcAorKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisKKyAgICBpZiAoWGV4dEhhc0V4dGVuc2lvbihpbmZvKSkgeworCSpldmVudF9iYXNlcCA9IGluZm8tPmNvZGVzLT5maXJzdF9ldmVudDsKKwkqZXJyb3JfYmFzZXAgPSBpbmZvLT5jb2Rlcy0+Zmlyc3RfZXJyb3I7CisJcmV0dXJuIFRydWU7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gRmFsc2U7CisgICAgfQorfQorCisKK0Jvb2wgU0RMX05BTUUoWERHQVF1ZXJ5VmVyc2lvbikoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCAqbWFqb3JWZXJzaW9uLCAKKyAgICBpbnQgKm1pbm9yVmVyc2lvbgorKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisgICAgeFhER0FRdWVyeVZlcnNpb25SZXBseSByZXA7CisgICAgeFhER0FRdWVyeVZlcnNpb25SZXEgKnJlcTsKKworICAgIFhER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYREdBUXVlcnlWZXJzaW9uLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBUXVlcnlWZXJzaW9uOworICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlyZXR1cm4gRmFsc2U7CisgICAgfQorICAgICptYWpvclZlcnNpb24gPSByZXAubWFqb3JWZXJzaW9uOworICAgICptaW5vclZlcnNpb24gPSByZXAubWlub3JWZXJzaW9uOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgaWYgKCptYWpvclZlcnNpb24gPj0gMikKKyAgICB7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwLCBqID0gaW5mby0+Y29kZXMtPmZpcnN0X2V2ZW50OworCSAgICAgaSA8IFhGODZER0FOdW1iZXJFdmVudHM7CisJICAgICBpKyssIGorKykgCisJeworCSAgICBYRVNldFdpcmVUb0V2ZW50KGRweSwgaiwgeGRnYV93aXJlX3RvX2V2ZW50KTsKKwkgICAgWEVTZXRFdmVudFRvV2lyZShkcHksIGosIHhkZ2FfZXZlbnRfdG9fd2lyZSk7CisJfQorCVNETF9OQU1FKFhER0FTZXRDbGllbnRWZXJzaW9uKShkcHkpOworICAgIH0KKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbCBTRExfTkFNRShYREdBU2V0Q2xpZW50VmVyc2lvbikoCisgICAgRGlzcGxheQkqZHB5CispeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WERHQVNldENsaWVudFZlcnNpb25SZXEgKnJlcTsKKworICAgIFhER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYREdBU2V0Q2xpZW50VmVyc2lvbiwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWERHQVNldENsaWVudFZlcnNpb247CisgICAgcmVxLT5tYWpvciA9IFhER0FfTUFKT1JfVkVSU0lPTjsKKyAgICByZXEtPm1pbm9yID0gWERHQV9NSU5PUl9WRVJTSU9OOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wgU0RMX05BTUUoWERHQU9wZW5GcmFtZWJ1ZmZlcikoCisgICAgRGlzcGxheQkqZHB5LAorICAgIGludCAJc2NyZWVuCispeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WERHQU9wZW5GcmFtZWJ1ZmZlclJlcGx5IHJlcDsKKyAgICB4WERHQU9wZW5GcmFtZWJ1ZmZlclJlcSAqcmVxOworICAgIGNoYXIgKmRldmljZU5hbWUgPSBOVUxMOworICAgIEJvb2wgcmV0OworCisgICAgWERHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhER0FPcGVuRnJhbWVidWZmZXIsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FPcGVuRnJhbWVidWZmZXI7CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKKwlVbmxvY2tEaXNwbGF5KGRweSk7CisJU3luY0hhbmRsZSgpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisKKyAgICBpZihyZXAubGVuZ3RoKSB7CisJZGV2aWNlTmFtZSA9IFhtYWxsb2MocmVwLmxlbmd0aCA8PCAyKTsKKwlfWFJlYWQoZHB5LCBkZXZpY2VOYW1lLCByZXAubGVuZ3RoIDw8IDIpOworICAgIH0KKworICAgIHJldCA9IFNETF9OQU1FKFhER0FNYXBGcmFtZWJ1ZmZlcikoc2NyZWVuLCBkZXZpY2VOYW1lLAorCQkJCSh1bnNpZ25lZCBjaGFyKikobG9uZylyZXAubWVtMSwgCisJCQkJcmVwLnNpemUsIHJlcC5vZmZzZXQsIHJlcC5leHRyYSk7CisKKyAgICBpZihkZXZpY2VOYW1lKQorCVhmcmVlKGRldmljZU5hbWUpOwkKKworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBTRExfTkFNRShYREdBQ2xvc2VGcmFtZWJ1ZmZlcikoCisgICAgRGlzcGxheQkqZHB5LAorICAgIGludAkJc2NyZWVuCispeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WERHQUNsb3NlRnJhbWVidWZmZXJSZXEgKnJlcTsKKworICAgIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBTRExfTkFNRSh4ZGdhX2V4dGVuc2lvbl9uYW1lKSk7CisKKyAgICBTRExfTkFNRShYREdBVW5tYXBGcmFtZWJ1ZmZlcikoc2NyZWVuKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhER0FDbG9zZUZyYW1lYnVmZmVyLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBQ2xvc2VGcmFtZWJ1ZmZlcjsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworfQorCisKKworU0RMX05BTUUoWERHQU1vZGUpKiBTRExfTkFNRShYREdBUXVlcnlNb2RlcykoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCBzY3JlZW4sCisgICAgaW50ICpudW0KKyl7CisgICAgWEV4dERpc3BsYXlJbmZvICpkaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WERHQVF1ZXJ5TW9kZXNSZXBseSByZXA7CisgICAgeFhER0FRdWVyeU1vZGVzUmVxICpyZXE7CisgICAgU0RMX05BTUUoWERHQU1vZGUpICptb2RlcyA9IE5VTEw7CisKKyAgICAqbnVtID0gMDsKKworICAgIFhER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBkaW5mbywgTlVMTCk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYREdBUXVlcnlNb2RlcywgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBkaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FRdWVyeU1vZGVzOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworCisgICAgaWYgKF9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworCWlmKHJlcC5sZW5ndGgpIHsKKwkgICB4WERHQU1vZGVJbmZvIGluZm87CisJICAgaW50IGksIHNpemU7CisJICAgY2hhciAqb2Zmc2V0OworCisJICAgc2l6ZSA9IHJlcC5sZW5ndGggPDwgMjsKKwkgICBzaXplIC09IHJlcC5udW1iZXIgKiBzel94WERHQU1vZGVJbmZvOyAvKiBmaW5kIHRleHQgc2l6ZSAqLworCSAgIG1vZGVzID0gKFNETF9OQU1FKFhER0FNb2RlKSopWG1hbGxvYygocmVwLm51bWJlciAqIHNpemVvZihTRExfTkFNRShYREdBTW9kZSkpKSArIHNpemUpOworCSAgIG9mZnNldCA9IChjaGFyKikoJm1vZGVzW3JlcC5udW1iZXJdKTsgLyogc3RhcnQgb2YgdGV4dCAqLworCisKKwkgICBpZihtb2RlcykgewkKKwkgICAgICBmb3IoaSA9IDA7IGkgPCByZXAubnVtYmVyOyBpKyspIHsKKwkJX1hSZWFkKGRweSwgKGNoYXIqKSgmaW5mbyksIHN6X3hYREdBTW9kZUluZm8pOworCisJCW1vZGVzW2ldLm51bSA9IGluZm8ubnVtOworCQltb2Rlc1tpXS52ZXJ0aWNhbFJlZnJlc2ggPSAKKwkJCShmbG9hdClpbmZvLnZzeW5jX251bSAvIChmbG9hdClpbmZvLnZzeW5jX2RlbjsKKwkJbW9kZXNbaV0uZmxhZ3MgPSBpbmZvLmZsYWdzOworCQltb2Rlc1tpXS5pbWFnZVdpZHRoID0gaW5mby5pbWFnZV93aWR0aDsKKwkJbW9kZXNbaV0uaW1hZ2VIZWlnaHQgPSBpbmZvLmltYWdlX2hlaWdodDsKKwkJbW9kZXNbaV0ucGl4bWFwV2lkdGggPSBpbmZvLnBpeG1hcF93aWR0aDsKKwkJbW9kZXNbaV0ucGl4bWFwSGVpZ2h0ID0gaW5mby5waXhtYXBfaGVpZ2h0OworCQltb2Rlc1tpXS5ieXRlc1BlclNjYW5saW5lID0gaW5mby5ieXRlc19wZXJfc2NhbmxpbmU7CisJCW1vZGVzW2ldLmJ5dGVPcmRlciA9IGluZm8uYnl0ZV9vcmRlcjsKKwkJbW9kZXNbaV0uZGVwdGggPSBpbmZvLmRlcHRoOworCQltb2Rlc1tpXS5iaXRzUGVyUGl4ZWwgPSBpbmZvLmJwcDsKKwkJbW9kZXNbaV0ucmVkTWFzayA9IGluZm8ucmVkX21hc2s7CisJCW1vZGVzW2ldLmdyZWVuTWFzayA9IGluZm8uZ3JlZW5fbWFzazsKKwkJbW9kZXNbaV0uYmx1ZU1hc2sgPSBpbmZvLmJsdWVfbWFzazsKKwkJbW9kZXNbaV0udmlzdWFsQ2xhc3MgPSBpbmZvLnZpc3VhbF9jbGFzczsKKwkJbW9kZXNbaV0udmlld3BvcnRXaWR0aCA9IGluZm8udmlld3BvcnRfd2lkdGg7CisJCW1vZGVzW2ldLnZpZXdwb3J0SGVpZ2h0ID0gaW5mby52aWV3cG9ydF9oZWlnaHQ7CisJCW1vZGVzW2ldLnhWaWV3cG9ydFN0ZXAgPSBpbmZvLnZpZXdwb3J0X3hzdGVwOworCQltb2Rlc1tpXS55Vmlld3BvcnRTdGVwID0gaW5mby52aWV3cG9ydF95c3RlcDsKKwkJbW9kZXNbaV0ubWF4Vmlld3BvcnRYID0gaW5mby52aWV3cG9ydF94bWF4OworCQltb2Rlc1tpXS5tYXhWaWV3cG9ydFkgPSBpbmZvLnZpZXdwb3J0X3ltYXg7CisJCW1vZGVzW2ldLnZpZXdwb3J0RmxhZ3MgPSBpbmZvLnZpZXdwb3J0X2ZsYWdzOworCQltb2Rlc1tpXS5yZXNlcnZlZDEgPSBpbmZvLnJlc2VydmVkMTsKKwkJbW9kZXNbaV0ucmVzZXJ2ZWQyID0gaW5mby5yZXNlcnZlZDI7CQorCisJCV9YUmVhZChkcHksIG9mZnNldCwgaW5mby5uYW1lX3NpemUpOworCQltb2Rlc1tpXS5uYW1lID0gb2Zmc2V0OworCQlvZmZzZXQgKz0gaW5mby5uYW1lX3NpemU7CisJICAgICAgfQorCSAgICAgICpudW0gPSByZXAubnVtYmVyOworCSAgIH0gZWxzZQorCQlfWEVhdERhdGEoZHB5LCByZXAubGVuZ3RoIDw8IDIpOworCX0KKyAgICB9CisKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworCisgICAgcmV0dXJuIG1vZGVzOworfQorCisKK1NETF9OQU1FKFhER0FEZXZpY2UpICogCitTRExfTkFNRShYREdBU2V0TW9kZSkoCisgICAgRGlzcGxheQkqZHB5LAorICAgIGludAkJc2NyZWVuLAorICAgIGludAkJbW9kZQorKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmRpbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOworICAgIHhYREdBU2V0TW9kZVJlcGx5IHJlcDsKKyAgICB4WERHQVNldE1vZGVSZXEgKnJlcTsKKyAgICBTRExfTkFNRShYREdBRGV2aWNlKSAqZGV2ID0gTlVMTDsKKyAgICBQaXhtYXAgcGlkOworCisgICAgWERHQUNoZWNrRXh0ZW5zaW9uIChkcHksIGRpbmZvLCBOVUxMKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhER0FTZXRNb2RlLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGRpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWERHQVNldE1vZGU7CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgcmVxLT5tb2RlID0gbW9kZTsKKyAgICByZXEtPnBpZCA9IHBpZCA9IFhBbGxvY0lEKGRweSk7CisgICAgCisgICAgaWYgKF9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworCWlmKHJlcC5sZW5ndGgpIHsKKwkgICB4WERHQU1vZGVJbmZvIGluZm87CisJICAgaW50IHNpemU7CisKKwkgICBzaXplID0gcmVwLmxlbmd0aCA8PCAyOworCSAgIHNpemUgLT0gc3pfeFhER0FNb2RlSW5mbzsgLyogZ2V0IHRleHQgc2l6ZSAqLworCisJICAgZGV2ID0gKFNETF9OQU1FKFhER0FEZXZpY2UpKilYbWFsbG9jKHNpemVvZihTRExfTkFNRShYREdBRGV2aWNlKSkgKyBzaXplKTsKKwkgICAgCisJICAgaWYoZGV2KSB7CisJCV9YUmVhZChkcHksIChjaGFyKikoJmluZm8pLCBzel94WERHQU1vZGVJbmZvKTsKKworCQlkZXYtPm1vZGUubnVtID0gaW5mby5udW07CisJCWRldi0+bW9kZS52ZXJ0aWNhbFJlZnJlc2ggPSAKKwkJCQkoZmxvYXQpaW5mby52c3luY19udW0gLyAoZmxvYXQpaW5mby52c3luY19kZW47CisJCWRldi0+bW9kZS5mbGFncyA9IGluZm8uZmxhZ3M7CisJCWRldi0+bW9kZS5pbWFnZVdpZHRoID0gaW5mby5pbWFnZV93aWR0aDsKKwkJZGV2LT5tb2RlLmltYWdlSGVpZ2h0ID0gaW5mby5pbWFnZV9oZWlnaHQ7CisJCWRldi0+bW9kZS5waXhtYXBXaWR0aCA9IGluZm8ucGl4bWFwX3dpZHRoOworCQlkZXYtPm1vZGUucGl4bWFwSGVpZ2h0ID0gaW5mby5waXhtYXBfaGVpZ2h0OworCQlkZXYtPm1vZGUuYnl0ZXNQZXJTY2FubGluZSA9IGluZm8uYnl0ZXNfcGVyX3NjYW5saW5lOworCQlkZXYtPm1vZGUuYnl0ZU9yZGVyID0gaW5mby5ieXRlX29yZGVyOworCQlkZXYtPm1vZGUuZGVwdGggPSBpbmZvLmRlcHRoOworCQlkZXYtPm1vZGUuYml0c1BlclBpeGVsID0gaW5mby5icHA7CisJCWRldi0+bW9kZS5yZWRNYXNrID0gaW5mby5yZWRfbWFzazsKKwkJZGV2LT5tb2RlLmdyZWVuTWFzayA9IGluZm8uZ3JlZW5fbWFzazsKKwkJZGV2LT5tb2RlLmJsdWVNYXNrID0gaW5mby5ibHVlX21hc2s7CisJCWRldi0+bW9kZS52aXN1YWxDbGFzcyA9IGluZm8udmlzdWFsX2NsYXNzOworCQlkZXYtPm1vZGUudmlld3BvcnRXaWR0aCA9IGluZm8udmlld3BvcnRfd2lkdGg7CisJCWRldi0+bW9kZS52aWV3cG9ydEhlaWdodCA9IGluZm8udmlld3BvcnRfaGVpZ2h0OworCQlkZXYtPm1vZGUueFZpZXdwb3J0U3RlcCA9IGluZm8udmlld3BvcnRfeHN0ZXA7CisJCWRldi0+bW9kZS55Vmlld3BvcnRTdGVwID0gaW5mby52aWV3cG9ydF95c3RlcDsKKwkJZGV2LT5tb2RlLm1heFZpZXdwb3J0WCA9IGluZm8udmlld3BvcnRfeG1heDsKKwkJZGV2LT5tb2RlLm1heFZpZXdwb3J0WSA9IGluZm8udmlld3BvcnRfeW1heDsKKwkJZGV2LT5tb2RlLnZpZXdwb3J0RmxhZ3MgPSBpbmZvLnZpZXdwb3J0X2ZsYWdzOworCQlkZXYtPm1vZGUucmVzZXJ2ZWQxID0gaW5mby5yZXNlcnZlZDE7CisJCWRldi0+bW9kZS5yZXNlcnZlZDIgPSBpbmZvLnJlc2VydmVkMjsKKworCQlkZXYtPm1vZGUubmFtZSA9IChjaGFyKikoJmRldlsxXSk7CQorCQlfWFJlYWQoZHB5LCBkZXYtPm1vZGUubmFtZSwgaW5mby5uYW1lX3NpemUpOworCisJCWRldi0+cGl4bWFwID0gKHJlcC5mbGFncyAmIFhER0FQaXhtYXApID8gcGlkIDogMDsKKwkJZGV2LT5kYXRhID0gU0RMX05BTUUoWERHQUdldE1hcHBlZE1lbW9yeSkoc2NyZWVuKTsKKworCQlpZihkZXYtPmRhdGEpCisJCSAgICBkZXYtPmRhdGEgKz0gcmVwLm9mZnNldDsKKwkgICB9IAorCSAgIC8qIG5vdCBzdXJlIHdoYXQgdG8gZG8gaWYgdGhlIGFsbG9jYXRpb24gZmFpbHMgKi8KKwl9CisgICAgfQorCisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKworICAgIHJldHVybiBkZXY7Cit9CisKKwordm9pZCBTRExfTkFNRShYREdBU2V0Vmlld3BvcnQpKAorICAgIERpc3BsYXkJKmRweSwKKyAgICBpbnQJCXNjcmVlbiwKKyAgICBpbnQJCXgsCisgICAgaW50CQl5LAorICAgIGludAkJZmxhZ3MKKyl7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOworICAgIHhYREdBU2V0Vmlld3BvcnRSZXEgKnJlcTsKKworICAgIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBTRExfTkFNRSh4ZGdhX2V4dGVuc2lvbl9uYW1lKSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYREdBU2V0Vmlld3BvcnQsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FTZXRWaWV3cG9ydDsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPnggPSB4OworICAgIHJlcS0+eSA9IHk7CisgICAgcmVxLT5mbGFncyA9IGZsYWdzOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7Cit9CisKKwordm9pZCBTRExfTkFNRShYREdBSW5zdGFsbENvbG9ybWFwKSgKKyAgICBEaXNwbGF5CSpkcHksCisgICAgaW50CQlzY3JlZW4sCisgICAgQ29sb3JtYXAJY21hcAorKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisgICAgeFhER0FJbnN0YWxsQ29sb3JtYXBSZXEgKnJlcTsKKworICAgIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBTRExfTkFNRSh4ZGdhX2V4dGVuc2lvbl9uYW1lKSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYREdBSW5zdGFsbENvbG9ybWFwLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBSW5zdGFsbENvbG9ybWFwOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+Y21hcCA9IGNtYXA7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKK30KKwordm9pZCBTRExfTkFNRShYREdBU2VsZWN0SW5wdXQpKAorICAgIERpc3BsYXkJKmRweSwKKyAgICBpbnQJCXNjcmVlbiwKKyAgICBsb25nCW1hc2sKKyl7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOworICAgIHhYREdBU2VsZWN0SW5wdXRSZXEgKnJlcTsKKworICAgIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBTRExfTkFNRSh4ZGdhX2V4dGVuc2lvbl9uYW1lKSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYREdBU2VsZWN0SW5wdXQsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FTZWxlY3RJbnB1dDsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPm1hc2sgPSBtYXNrOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7Cit9CisKK3ZvaWQgU0RMX05BTUUoWERHQUZpbGxSZWN0YW5nbGUpKAorICAgIERpc3BsYXkJKmRweSwKKyAgICBpbnQJCXNjcmVlbiwKKyAgICBpbnQJCXgsCisgICAgaW50CQl5LAorICAgIHVuc2lnbmVkIGludAl3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQJaGVpZ2h0LAorICAgIHVuc2lnbmVkIGxvbmcJY29sb3IKKyl7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOworICAgIHhYREdBRmlsbFJlY3RhbmdsZVJlcSAqcmVxOworCisgICAgWGV4dFNpbXBsZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIFNETF9OQU1FKHhkZ2FfZXh0ZW5zaW9uX25hbWUpKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhER0FGaWxsUmVjdGFuZ2xlLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBRmlsbFJlY3RhbmdsZTsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPnggPSB4OworICAgIHJlcS0+eSA9IHk7CisgICAgcmVxLT53aWR0aCA9IHdpZHRoOworICAgIHJlcS0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIHJlcS0+Y29sb3IgPSBjb2xvcjsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworfQorCit2b2lkIFNETF9OQU1FKFhER0FDb3B5QXJlYSkoCisgICAgRGlzcGxheQkqZHB5LAorICAgIGludAkJc2NyZWVuLAorICAgIGludAkJc3JjeCwKKyAgICBpbnQJCXNyY3ksCisgICAgdW5zaWduZWQgaW50CXdpZHRoLAorICAgIHVuc2lnbmVkIGludAloZWlnaHQsCisgICAgaW50CQlkc3R4LAorICAgIGludAkJZHN0eQorKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisgICAgeFhER0FDb3B5QXJlYVJlcSAqcmVxOworCisgICAgWGV4dFNpbXBsZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIFNETF9OQU1FKHhkZ2FfZXh0ZW5zaW9uX25hbWUpKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhER0FDb3B5QXJlYSwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZGdhUmVxVHlwZSA9IFhfWERHQUNvcHlBcmVhOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+c3JjeCA9IHNyY3g7CisgICAgcmVxLT5zcmN5ID0gc3JjeTsKKyAgICByZXEtPndpZHRoID0gd2lkdGg7CisgICAgcmVxLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgcmVxLT5kc3R4ID0gZHN0eDsKKyAgICByZXEtPmRzdHkgPSBkc3R5OworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7Cit9CisKK3ZvaWQgU0RMX05BTUUoWERHQUNvcHlUcmFuc3BhcmVudEFyZWEpKAorICAgIERpc3BsYXkJKmRweSwKKyAgICBpbnQJCXNjcmVlbiwKKyAgICBpbnQJCXNyY3gsCisgICAgaW50CQlzcmN5LAorICAgIHVuc2lnbmVkIGludAl3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQJaGVpZ2h0LAorICAgIGludAkJZHN0eCwKKyAgICBpbnQJCWRzdHksCisgICAgdW5zaWduZWQgbG9uZyBrZXkKKyl7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gU0RMX05BTUUoeGRnYV9maW5kX2Rpc3BsYXkpIChkcHkpOworICAgIHhYREdBQ29weVRyYW5zcGFyZW50QXJlYVJlcSAqcmVxOworCisgICAgWGV4dFNpbXBsZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIFNETF9OQU1FKHhkZ2FfZXh0ZW5zaW9uX25hbWUpKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhER0FDb3B5VHJhbnNwYXJlbnRBcmVhLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kZ2FSZXFUeXBlID0gWF9YREdBQ29weVRyYW5zcGFyZW50QXJlYTsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPnNyY3ggPSBzcmN4OworICAgIHJlcS0+c3JjeSA9IHNyY3k7CisgICAgcmVxLT53aWR0aCA9IHdpZHRoOworICAgIHJlcS0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIHJlcS0+ZHN0eCA9IGRzdHg7CisgICAgcmVxLT5kc3R5ID0gZHN0eTsKKyAgICByZXEtPmtleSA9IGtleTsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworfQorCisKK2ludCBTRExfTkFNRShYREdBR2V0Vmlld3BvcnRTdGF0dXMpKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBpbnQgc2NyZWVuIAorKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisgICAgeFhER0FHZXRWaWV3cG9ydFN0YXR1c1JlcGx5IHJlcDsKKyAgICB4WERHQUdldFZpZXdwb3J0U3RhdHVzUmVxICpyZXE7CisgICAgaW50IHN0YXR1cyA9IDA7CisKKyAgICBYREdBQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgMCk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYREdBR2V0Vmlld3BvcnRTdGF0dXMsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FHZXRWaWV3cG9ydFN0YXR1czsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkKKwlzdGF0dXMgPSByZXAuc3RhdHVzOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBTRExfTkFNRShYREdBU3luYykoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCBzY3JlZW4gCispeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WERHQVN5bmNSZXBseSByZXA7CisgICAgeFhER0FTeW5jUmVxICpyZXE7CisKKyAgICBYZXh0U2ltcGxlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgU0RMX05BTUUoeGRnYV9leHRlbnNpb25fbmFtZSkpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWERHQVN5bmMsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FTeW5jOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIF9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKTsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworfQorCisKK3ZvaWQgU0RMX05BTUUoWERHQUNoYW5nZVBpeG1hcE1vZGUpKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBpbnQgc2NyZWVuLAorICAgIGludCAqeCwKKyAgICBpbnQgKnksCisgICAgaW50IG1vZGUgCispeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IFNETF9OQU1FKHhkZ2FfZmluZF9kaXNwbGF5KSAoZHB5KTsKKyAgICB4WERHQUNoYW5nZVBpeG1hcE1vZGVSZXEgKnJlcTsKKyAgICB4WERHQUNoYW5nZVBpeG1hcE1vZGVSZXBseSByZXA7CisKKyAgICBYZXh0U2ltcGxlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgU0RMX05BTUUoeGRnYV9leHRlbnNpb25fbmFtZSkpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWERHQUNoYW5nZVBpeG1hcE1vZGUsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FDaGFuZ2VQaXhtYXBNb2RlOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+eCA9ICp4OworICAgIHJlcS0+eSA9ICp5OworICAgIHJlcS0+ZmxhZ3MgPSBtb2RlOworICAgIF9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKTsKKyAgICAqeCA9IHJlcC54OworICAgICp5ID0gcmVwLnk7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKK30KKworQ29sb3JtYXAgU0RMX05BTUUoWERHQUNyZWF0ZUNvbG9ybWFwKSgKKyAgICBEaXNwbGF5ICpkcHksCisgICAgaW50IHNjcmVlbiwKKyAgICBTRExfTkFNRShYREdBRGV2aWNlKSAqZGV2LAorICAgIGludAlhbGxvYworKXsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBTRExfTkFNRSh4ZGdhX2ZpbmRfZGlzcGxheSkgKGRweSk7CisgICAgeFhER0FDcmVhdGVDb2xvcm1hcFJlcSAqcmVxOworICAgIENvbG9ybWFwIGNpZDsKKworICAgIFhER0FDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCAtMSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYREdBQ3JlYXRlQ29sb3JtYXAsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRnYVJlcVR5cGUgPSBYX1hER0FDcmVhdGVDb2xvcm1hcDsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPm1vZGUgPSBkZXYtPm1vZGUubnVtOworICAgIHJlcS0+YWxsb2MgPSBhbGxvYzsKKyAgICBjaWQgPSByZXEtPmlkID0gWEFsbG9jSUQoZHB5KTsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworCisgICAgcmV0dXJuIGNpZDsKK30KKworCit2b2lkIFNETF9OQU1FKFhER0FLZXlFdmVudFRvWEtleUV2ZW50KSgKKyAgICBTRExfTkFNRShYREdBS2V5RXZlbnQpKiBkaywgCisgICAgWEtleUV2ZW50KiB4aworKXsKKyAgICB4ay0+dHlwZSA9IGRrLT50eXBlOworICAgIHhrLT5zZXJpYWwgPSBkay0+c2VyaWFsOworICAgIHhrLT5zZW5kX2V2ZW50ID0gRmFsc2U7CisgICAgeGstPmRpc3BsYXkgPSBkay0+ZGlzcGxheTsKKyAgICB4ay0+d2luZG93ID0gUm9vdFdpbmRvdyhkay0+ZGlzcGxheSwgZGstPnNjcmVlbik7CisgICAgeGstPnJvb3QgPSB4ay0+d2luZG93OworICAgIHhrLT5zdWJ3aW5kb3cgPSBOb25lOworICAgIHhrLT50aW1lID0gZGstPnRpbWU7CisgICAgeGstPnggPSB4ay0+eSA9IHhrLT54X3Jvb3QgPSB4ay0+eV9yb290ID0gMDsKKyAgICB4ay0+c3RhdGUgPSBkay0+c3RhdGU7CisgICAgeGstPmtleWNvZGUgPSBkay0+a2V5Y29kZTsKKyAgICB4ay0+c2FtZV9zY3JlZW4gPSBUcnVlOworfQorCisjaW5jbHVkZSA8WDExL1htZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZiBkZWZpbmVkKElTQykgCisjIGRlZmluZSBIQVNfU1ZSM19NTUFQCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxlcnJuby5oPgorCisjIGluY2x1ZGUgPHN5cy9hdF9hbnNpLmg+CisjIGluY2x1ZGUgPHN5cy9rZC5oPgorCisjIGluY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyMgaW5jbHVkZSA8c3lzL2ltbXUuaD4KKyMgaW5jbHVkZSA8c3lzL3JlZ2lvbi5oPgorCisjIGluY2x1ZGUgPHN5cy9tbWFwLmg+CisjZWxzZQorIyBpZiAhZGVmaW5lZChMeW54KQorIyAgaWYgIWRlZmluZWQoX19FTVhfXykKKyMgICBpbmNsdWRlIDxzeXMvbW1hbi5oPgorIyAgZW5kaWYKKyMgZWxzZQorIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICBpbmNsdWRlIDxlcnJuby5oPgorIyAgaW5jbHVkZSA8c21lbS5oPgorIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmIGRlZmluZWQoU1ZSNCkgJiYgIWRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChTQ08zMjUpCisjZGVmaW5lIERFVl9NRU0gIi9kZXYvcG1lbSIKKyNlbGlmIGRlZmluZWQoU1ZSNCkgJiYgZGVmaW5lZChzdW4pCisjZGVmaW5lIERFVl9NRU0gIi9kZXYveHN2YyIKKyNlbHNlCisjZGVmaW5lIERFVl9NRU0gIi9kZXYvbWVtIgorI2VuZGlmCisKKworCit0eXBlZGVmIHN0cnVjdCBfREdBTWFwUmVjeworICB1bnNpZ25lZCBjaGFyICpwaHlzaWNhbDsKKyAgdW5zaWduZWQgY2hhciAqdmlydHVhbDsKKyAgQ0FSRDMyIHNpemU7CisgIGludCBmZDsKKyAgaW50IHNjcmVlbjsKKyAgc3RydWN0IF9ER0FNYXBSZWMgKm5leHQ7Cit9IERHQU1hcFJlYywgKkRHQU1hcFB0cjsKKworc3RhdGljIEJvb2wKK0RHQU1hcFBoeXNpY2FsKGludCwgY2hhciosIHVuc2lnbmVkIGNoYXIqLCBDQVJEMzIsIENBUkQzMiwgQ0FSRDMyLCBER0FNYXBQdHIpOyAKK3N0YXRpYyB2b2lkIERHQVVubWFwUGh5c2ljYWwoREdBTWFwUHRyKTsKKworc3RhdGljIERHQU1hcFB0ciBfTWFwcyA9IE5VTEw7CisKKwordW5zaWduZWQgY2hhcioKK1NETF9OQU1FKFhER0FHZXRNYXBwZWRNZW1vcnkpKGludCBzY3JlZW4pCit7CisgICAgREdBTWFwUHRyIHBNYXAgPSBfTWFwczsKKyAgICB1bnNpZ25lZCBjaGFyICpwbnRyID0gTlVMTDsKKworICAgIHdoaWxlKHBNYXAgIT0gTlVMTCkgeworCWlmKHBNYXAtPnNjcmVlbiA9PSBzY3JlZW4pIHsKKwkgICAgcG50ciA9IHBNYXAtPnZpcnR1YWw7CisJICAgIGJyZWFrOworCX0KKwlwTWFwID0gcE1hcC0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gcG50cjsKK30KKworQm9vbAorU0RMX05BTUUoWERHQU1hcEZyYW1lYnVmZmVyKSgKKyAgIGludCBzY3JlZW4sCisgICBjaGFyICpuYW1lLAkJCS8qIG9wdGlvbmFsIGRldmljZSBuYW1lICovCisgICB1bnNpZ25lZCBjaGFyKiBiYXNlLAkJLyogcGh5c2ljYWwgbWVtb3J5ICovCisgICBDQVJEMzIgc2l6ZSwJCQkvKiBzaXplICovCisgICBDQVJEMzIgb2Zmc2V0LAkJLyogb3B0aW9uYWwgb2Zmc2V0ICovCisgICBDQVJEMzIgZXh0cmEJCQkvKiBvcHRpb25hbCBleHRyYSBkYXRhICovCispeworICAgREdBTWFwUHRyIHBNYXAgPSBfTWFwczsKKyAgIEJvb2wgcmVzdWx0OworICAgCisgICAvKiBpcyBpdCBhbHJlYWR5IG1hcHBlZCA/ICovCisgICB3aGlsZShwTWFwICE9IE5VTEwpIHsKKyAgICAgaWYocE1hcC0+c2NyZWVuID09IHNjcmVlbikKKwlyZXR1cm4gVHJ1ZTsKKyAgICAgcE1hcCA9IHBNYXAtPm5leHQ7CisgICB9CisKKyAgIGlmKGV4dHJhICYgWERHQU5lZWRSb290KSB7CisgICAgLyogd2Ugc2hvdWxkIHByb2JhYmx5IGNoZWNrIGlmIHdlIGhhdmUgcm9vdCBwZXJtaXNzaW9ucyBhbmQKKyAgICAgICByZXR1cm4gRmFsc2UgaGVyZSAqLworCisgICB9CisKKyAgIHBNYXAgPSAoREdBTWFwUHRyKVhtYWxsb2Moc2l6ZW9mKERHQU1hcFJlYykpOworCisgICByZXN1bHQgPSBER0FNYXBQaHlzaWNhbChzY3JlZW4sIG5hbWUsIGJhc2UsIHNpemUsIG9mZnNldCwgZXh0cmEsIHBNYXApOworCisgICBpZihyZXN1bHQpIHsKKyAgICAgIHBNYXAtPm5leHQgPSBfTWFwczsKKyAgICAgIF9NYXBzID0gcE1hcDsKKyAgIH0gZWxzZSAKKyAgICAgIFhmcmVlKHBNYXApOworICAgCisgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCitTRExfTkFNRShYREdBVW5tYXBGcmFtZWJ1ZmZlcikoaW50IHNjcmVlbikKK3sKKyAgIERHQU1hcFB0ciBwTWFwID0gX01hcHM7CisgICBER0FNYXBQdHIgcFByZXYgPSBOVUxMOworCisgICAvKiBpcyBpdCBhbHJlYWR5IG1hcHBlZCAqLworICAgIHdoaWxlKHBNYXAgIT0gTlVMTCkgeworCWlmKHBNYXAtPnNjcmVlbiA9PSBzY3JlZW4pCisJICAgIGJyZWFrOworCXBQcmV2ID0gcE1hcDsKKwlwTWFwID0gcE1hcC0+bmV4dDsKKyAgICB9CisKKyAgICBpZighcE1hcCkKKwlyZXR1cm47CisKKyAgICBER0FVbm1hcFBoeXNpY2FsKHBNYXApOworCisgICAgaWYoIXBQcmV2KQorCV9NYXBzID0gcE1hcC0+bmV4dDsKKyAgICBlbHNlCisJcFByZXYtPm5leHQgPSBwTWFwLT5uZXh0OworCisgICAgWGZyZWUocE1hcCk7Cit9CisKKworc3RhdGljIEJvb2wKK0RHQU1hcFBoeXNpY2FsKAorICAgaW50IHNjcmVlbiwKKyAgIGNoYXIgKm5hbWUsCQkJLyogb3B0aW9uYWwgZGV2aWNlIG5hbWUgKi8KKyAgIHVuc2lnbmVkIGNoYXIqIGJhc2UsCQkvKiBwaHlzaWNhbCBtZW1vcnkgKi8KKyAgIENBUkQzMiBzaXplLAkJCS8qIHNpemUgKi8KKyAgIENBUkQzMiBvZmZzZXQsCQkvKiBvcHRpb25hbCBvZmZzZXQgKi8KKyAgIENBUkQzMiBleHRyYSwJCS8qIG9wdGlvbmFsIGV4dHJhIGRhdGEgKi8KKyAgIERHQU1hcFB0ciBwTWFwCispIHsKKyNpZiBkZWZpbmVkKElTQykgJiYgZGVmaW5lZChIQVNfU1ZSM19NTUFQKQorICAgIHN0cnVjdCBrZF9tZW1sb2MgbWxvYzsKKyNlbGlmIGRlZmluZWQoX19FTVhfXykKKyAgICBBUElSRVQgcmM7CisgICAgVUxPTkcgYWN0aW9uOworICAgIEhGSUxFIGhmZDsKKyNlbmRpZgorICAKKyAgICBiYXNlICs9IG9mZnNldDsKKworICAgIHBNYXAtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICBwTWFwLT5waHlzaWNhbCA9IGJhc2U7CisgICAgcE1hcC0+c2l6ZSA9IHNpemU7CisKKyNpZiBkZWZpbmVkKElTQykgJiYgZGVmaW5lZChIQVNfU1ZSM19NTUFQKQorICAgIGlmICgocE1hcC0+ZmQgPSBvcGVuKCIvZGV2L21tYXAiLCBPX1JEV1IpKSA8IDApCisJcmV0dXJuIEZhbHNlOworICAgIG1sb2MudmFkZHIgPSAoY2hhciAqKTA7CisgICAgbWxvYy5waHlzYWRkciA9IChjaGFyICopYmFzZTsKKyAgICBtbG9jLmxlbmd0aCA9IHNpemU7CisgICAgbWxvYy5pb2ZsZz0xOworCisgICAgaWYgKChwTWFwLT52aXJ0dWFsID0gKHZvaWQgKilpb2N0bChwTWFwLT5mZCwgTUFQLCAmbWxvYykpID09ICh2b2lkICopLTEpCisJcmV0dXJuIEZhbHNlOworI2VsaWYgZGVmaW5lZCAoX19FTVhfXykKKyAgICAvKgorICAgICAqIERyYWdvbiB3YXJuaW5nIGhlcmUhIC9kZXYvcG1hcCQgaXMgbmV2ZXIgY2xvc2VkLCBleGNlcHQgb24gcHJvZ2FtIGV4aXQuCisgICAgICogQ29uc2VjdXRpdmUgY2FsbGluZyBvZiB0aGlzIHJvdXRpbmUgd2lsbCBtYWtlIFBNQVAkIGRyaXZlciBydW4gb3V0CisgICAgICogb2YgbWVtb3J5IGhhbmRsZXMuIFNvbWUgdW1hcC9jbG9zZSBtZWNoYW5pc20gc2hvdWxkIGJlIHByb3ZpZGVkCisgICAgICovCisKKyAgICByYyA9IERvc09wZW4oIi9kZXYvcG1hcCQiLCAmaGZkLCAmYWN0aW9uLCAwLCBGSUxFX05PUk1BTCwgRklMRV9PUEVOLAorCQkgT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgT1BFTl9TSEFSRV9ERU5ZTk9ORSwgKFBFQU9QMilOVUxMKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gRmFsc2U7CisgICAgeworCXN0cnVjdCBtYXBfaW9jdGwgeworCQl1bmlvbiB7CisJCQlVTE9ORyBwaHlzOworCQkJdm9pZCogdXNlcjsKKwkJfSBhOworCQlVTE9ORyBzaXplOworCX0gcG1hcCxkbWFwOworCVVMT05HIHBsZW4sZGxlbjsKKyNkZWZpbmUgWEZSRUU4Nl9QTUFQCTB4NzYKKyNkZWZpbmUgUE1BUF9NQVAJMHg0NAorCisJcG1hcC5hLnBoeXMgPSBiYXNlOworCXBtYXAuc2l6ZSA9IHNpemU7CisJcmMgPSBEb3NEZXZJT0N0bChoZmQsIFhGUkVFODZfUE1BUCwgUE1BUF9NQVAsCisJCQkgKFBVTE9ORykmcG1hcCwgc2l6ZW9mKHBtYXApLCAmcGxlbiwKKwkJCSAoUFVMT05HKSZkbWFwLCBzaXplb2YoZG1hcCksICZkbGVuKTsKKwlpZiAocmMgPT0gMCkgeworCQlwTWFwLT52aXJ0dWFsID0gZG1hcC5hLnVzZXI7CisJfQorICAgfQorICAgaWYgKHJjICE9IDApCisJcmV0dXJuIEZhbHNlOworI2VsaWYgZGVmaW5lZCAoTHlueCkKKyAgICBwTWFwLT52aXJ0dWFsID0gc21lbV9jcmVhdGUoIlhGODZER0EiLCAoY2hhciopYmFzZSwgc2l6ZSwgU01fUkVBRHxTTV9XUklURSk7CisjZWxzZQorI2lmbmRlZiBNQVBfRklMRQorI2RlZmluZSBNQVBfRklMRSAwCisjZW5kaWYKKyAgICBpZiAoIW5hbWUpCisJICAgIG5hbWUgPSBERVZfTUVNOworICAgIGlmICgocE1hcC0+ZmQgPSBvcGVuKG5hbWUsIE9fUkRXUikpIDwgMCkKKyNpZiBkZWZpbmVkKEVOQUJMRV9GQkNPTikKKyAgICB7IC8qIC9kZXYvZmIwIGZhbGxiYWNrIGFkZGVkIGJ5IFNhbSBMYW50aW5nYSA8aGVyY3VsZXNAbG9raWdhbWVzLmNvbT4gKi8KKyAgICAgICAgLyogVHJ5IHRvIGZhbGwgYmFjayB0byAvZGV2L2ZiIG9uIExpbnV4IC0gRklYTUU6IHZlcmlmeSB0aGUgZGV2aWNlICovCisgICAgICAgIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBmaW5mbzsKKworICAgICAgICBpZiAoKHBNYXAtPmZkID0gb3BlbigiL2Rldi9mYjAiLCBPX1JEV1IpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBGYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvKiBUaGUgdXNlYWJsZSBmcmFtZWJ1ZmZlciBjb25zb2xlIG1lbW9yeSBtYXkgbm90IGJlIHRoZSB3aG9sZQorICAgICAgICAgICBmcmFtZWJ1ZmZlciB0aGF0IFggaGFzIGFjY2VzcyB0by4gOi0oCisgICAgICAgICAqLworICAgICAgICBpZiAoIGlvY3RsKHBNYXAtPmZkLCBGQklPR0VUX0ZTQ1JFRU5JTkZPLCAmZmluZm8pIDwgMCApIHsKKyAgICAgICAgICAgIGNsb3NlKHBNYXAtPmZkKTsKKyAgICAgICAgICAgIHJldHVybiBGYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvKiBXYXJuaW5nOiBPbiBQUEMsIHRoZSBzaXplIGFuZCB2aXJ0dWFsIG5lZWQgdG8gYmUgb2Zmc2V0IGJ5OgorICAgICAgICAgICAoKChsb25nKWZpbmZvLnNtZW1fc3RhcnQpIC0KKyAgICAgICAgICAgKCgobG9uZylmaW5mby5zbWVtX3N0YXJ0KSZ+KFBBR0VfU0laRS0xKSkpCisgICAgICAgICAqLworICAgICAgICBiYXNlID0gMDsKKyAgICAgICAgc2l6ZSA9IHBNYXAtPnNpemUgPSBmaW5mby5zbWVtX2xlbjsKKyAgICB9CisjZWxzZQorCXJldHVybiBGYWxzZTsKKyNlbmRpZgorICAgIHBNYXAtPnZpcnR1YWwgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQlNQVBfRklMRSB8IE1BUF9TSEFSRUQsIHBNYXAtPmZkLCAob2ZmX3QpKChzaXplX3QpYmFzZSkpOworICAgIGlmIChwTWFwLT52aXJ0dWFsID09ICh2b2lkICopLTEpCisJcmV0dXJuIEZhbHNlOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChJU0MpICYmICFkZWZpbmVkKEhBU19TVlIzX01NQVApICYmICFkZWZpbmVkKEx5bngpIFwKKwkmJiAhZGVmaW5lZChfX0VNWF9fKQorICAgIG1wcm90ZWN0KHBNYXAtPnZpcnR1YWwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOworI2VuZGlmCisKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworCisKK3N0YXRpYyB2b2lkCitER0FVbm1hcFBoeXNpY2FsKERHQU1hcFB0ciBwTWFwKQoreworI2lmICFkZWZpbmVkKElTQykgJiYgIWRlZmluZWQoSEFTX1NWUjNfTU1BUCkgJiYgIWRlZmluZWQoTHlueCkgXAorCSYmICFkZWZpbmVkKF9fRU1YX18pCisgICAgbXByb3RlY3QocE1hcC0+dmlydHVhbCxwTWFwLT5zaXplLCBQUk9UX1JFQUQpOworI2VsaWYgZGVmaW5lZChMeW54KQorCS8qIFhYWCB0aGlzIGRvZXNuJ3QgYWxsb3cgZW5hYmxlIGFmdGVyIGRpc2FibGUgKi8KKyAgICBzbWVtX2NyZWF0ZShOVUxMLCBwTWFwLT52aXJ0dWFsLCBwTWFwLT5zaXplLCBTTV9ERVRBQ0gpOworICAgIHNtZW1fcmVtb3ZlKCJYRjg2REdBIik7CisjZW5kaWYKKworCisgICAvKiBXZSBuZWVkIHRvIHVubWFwIGFuZCBjbG9zZSB0b28gISEhISEhISEhISovCit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvWHhmODZ2bS9YRjg2Vk1vZGUuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9YeGY4NnZtL1hGODZWTW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjIxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvWHhmODZ2bS9YRjg2Vk1vZGUuYwpAQCAtMCwwICsxLDEyMjYgQEAKKy8qICRYQ29uc29ydGl1bTogWEY4NlZNb2RlLmMgL21haW4vMiAxOTk1LzExLzE0IDE4OjE3OjU4IGthbGViICQgKi8KKy8qICRYRnJlZTg2OiB4Yy9saWIvWHhmODZ2bS9YRjg2Vk1vZGUuYyx2IDMuMzIgMjAwMS8wNy8yNSAxNTowNDo1NCBkYXdlcyBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IChjKSAxOTk1ICBLYWxlYiBTLiBLRUlUSExFWQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgS2FsZWIgUy4gS0VJVEhMRVkgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgCitPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBLYWxlYiBTLiBLRUlUSExFWSAKK3NoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2UgCitvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIEthbGViIFMuIEtFSVRITEVZLgorCisqLworLyogJFhDb25zb3J0aXVtOiBYRjg2Vk1vZGUuYyAvbWFpbi80IDE5OTYvMDEvMTYgMDc6NTI6MjUga2FsZWIgQ0hFQ0tFRE9VVCAkICovCisKKy8qIFRISVMgSVMgTk9UIEFOIFggQ09OU09SVElVTSBTVEFOREFSRCAqLworCisjZGVmaW5lIE5FRURfRVZFTlRTCisjZGVmaW5lIE5FRURfUkVQTElFUworCisjaWZuZGVmIFhCVUlMRF9JTl9DTElFTlQKKy8qIEFwcGFyZW50bHkgc29tZSBYMTEgc3lzdGVtcyBjYW4ndCBpbmNsdWRlIHRoaXMgbXVsdGlwbGUgdGltZXMuLi4gKi8KKyNpZm5kZWYgU0RMX0lOQ0xVREVEX1hMSUJJTlRfSAorI2RlZmluZSBTRExfSU5DTFVERURfWExJQklOVF9IIDEKKyNpbmNsdWRlIDxYMTEvWGxpYmludC5oPgorI2VuZGlmCisjaW5jbHVkZSAiLi4vZXh0ZW5zaW9ucy94Zjg2dm1zdHIuaCIKKyNpbmNsdWRlICIuLi9leHRlbnNpb25zL1hleHQuaCIKKyNpbmNsdWRlICIuLi9leHRlbnNpb25zL2V4dHV0aWwuaCIKKyNlbHNlCisjaW5jbHVkZSAiaW5jbHVkZS9leHRlbnNpb25zL3hmODZ2bXN0ci5oIgorI2luY2x1ZGUgImluY2x1ZGUvZXh0ZW5zaW9ucy9YZXh0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9leHRlbnNpb25zL2V4dHV0aWwuaCIKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpZm5kZWYgTU9ERV9CQUQKKyNkZWZpbmUgTU9ERV9CQUQgMjU1CisjZW5kaWYKKworc3RhdGljIFhFeHRlbnNpb25JbmZvIF94Zjg2dmlkbW9kZV9pbmZvX2RhdGE7CitzdGF0aWMgWEV4dGVuc2lvbkluZm8gKnhmODZ2aWRtb2RlX2luZm8gPSAmX3hmODZ2aWRtb2RlX2luZm9fZGF0YTsKK3N0YXRpYyBjaGFyICp4Zjg2dmlkbW9kZV9leHRlbnNpb25fbmFtZSA9IFhGODZWSURNT0RFTkFNRTsKKworI2RlZmluZSBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uKGRweSxpLHZhbCkgXAorICBYZXh0Q2hlY2tFeHRlbnNpb24gKGRweSwgaSwgeGY4NnZpZG1vZGVfZXh0ZW5zaW9uX25hbWUsIHZhbCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCQkJICAgcHJpdmF0ZSB1dGlsaXR5IHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFhFWFRfQ0xPU0VfRElTUExBWV9QUk9UTyhjbG9zZV9kaXNwbGF5KTsKK3N0YXRpYyAvKiBjb25zdCAqLyBYRXh0ZW5zaW9uSG9va3MgeGY4NnZpZG1vZGVfZXh0ZW5zaW9uX2hvb2tzID0geworICAgIE5VTEwsCQkJCS8qIGNyZWF0ZV9nYyAqLworICAgIE5VTEwsCQkJCS8qIGNvcHlfZ2MgKi8KKyAgICBOVUxMLAkJCQkvKiBmbHVzaF9nYyAqLworICAgIE5VTEwsCQkJCS8qIGZyZWVfZ2MgKi8KKyAgICBOVUxMLAkJCQkvKiBjcmVhdGVfZm9udCAqLworICAgIE5VTEwsCQkJCS8qIGZyZWVfZm9udCAqLworICAgIGNsb3NlX2Rpc3BsYXksCQkJLyogY2xvc2VfZGlzcGxheSAqLworICAgIE5VTEwsCQkJCS8qIHdpcmVfdG9fZXZlbnQgKi8KKyAgICBOVUxMLAkJCQkvKiBldmVudF90b193aXJlICovCisgICAgTlVMTCwJCQkJLyogZXJyb3IgKi8KKyAgICBOVUxMLAkJCQkvKiBlcnJvcl9zdHJpbmcgKi8KK307CisKK3N0YXRpYyBYRVhUX0dFTkVSQVRFX0ZJTkRfRElTUExBWSAoZmluZF9kaXNwbGF5LCB4Zjg2dmlkbW9kZV9pbmZvLCAKKwkJCQkgICB4Zjg2dmlkbW9kZV9leHRlbnNpb25fbmFtZSwgCisJCQkJICAgJnhmODZ2aWRtb2RlX2V4dGVuc2lvbl9ob29rcywgCisJCQkJICAgMCwgTlVMTCkKKworc3RhdGljIFhFWFRfR0VORVJBVEVfQ0xPU0VfRElTUExBWSAoY2xvc2VfZGlzcGxheSwgeGY4NnZpZG1vZGVfaW5mbykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoJCSAgICBwdWJsaWMgWEZyZWU4Ni1WaWRNb2RlIEV4dGVuc2lvbiByb3V0aW5lcyAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQm9vbAorU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeUV4dGVuc2lvbikgKGRweSwgZXZlbnRfYmFzZXAsIGVycm9yX2Jhc2VwKQorICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgKmV2ZW50X2Jhc2VwLCAqZXJyb3JfYmFzZXA7Cit7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOworCisgICAgaWYgKFhleHRIYXNFeHRlbnNpb24oaW5mbykpIHsKKwkqZXZlbnRfYmFzZXAgPSBpbmZvLT5jb2Rlcy0+Zmlyc3RfZXZlbnQ7CisJKmVycm9yX2Jhc2VwID0gaW5mby0+Y29kZXMtPmZpcnN0X2Vycm9yOworCXJldHVybiBUcnVlOworICAgIH0gZWxzZSB7CisJcmV0dXJuIEZhbHNlOworICAgIH0KK30KKworQm9vbAorU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb24pCisgICAgRGlzcGxheSogZHB5OworICAgIGludCogbWFqb3JWZXJzaW9uOyAKKyAgICBpbnQqIG1pbm9yVmVyc2lvbjsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlUXVlcnlWZXJzaW9uUmVwbHkgcmVwOworICAgIHhYRjg2VmlkTW9kZVF1ZXJ5VmVyc2lvblJlcSAqcmVxOworCisgICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2VmlkTW9kZVF1ZXJ5VmVyc2lvbiwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZVF1ZXJ5VmVyc2lvbjsKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKyAgICAqbWFqb3JWZXJzaW9uID0gcmVwLm1ham9yVmVyc2lvbjsKKyAgICAqbWlub3JWZXJzaW9uID0gcmVwLm1pbm9yVmVyc2lvbjsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIGlmICgqbWFqb3JWZXJzaW9uID49IDIpCisJU0RMX05BTUUoWEY4NlZpZE1vZGVTZXRDbGllbnRWZXJzaW9uKShkcHkpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sCitTRExfTkFNRShYRjg2VmlkTW9kZVNldENsaWVudFZlcnNpb24pKERpc3BsYXkgKmRweSkKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkoZHB5KTsKKyAgICB4WEY4NlZpZE1vZGVTZXRDbGllbnRWZXJzaW9uUmVxICpyZXE7CisKKyAgICBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NlZpZE1vZGVTZXRDbGllbnRWZXJzaW9uLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlU2V0Q2xpZW50VmVyc2lvbjsKKyAgICByZXEtPm1ham9yID0gWEY4NlZJRE1PREVfTUFKT1JfVkVSU0lPTjsKKyAgICByZXEtPm1pbm9yID0gWEY4NlZJRE1PREVfTUlOT1JfVkVSU0lPTjsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sCitTRExfTkFNRShYRjg2VmlkTW9kZVNldEdhbW1hKShEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIFNETF9OQU1FKFhGODZWaWRNb2RlR2FtbWEpICpHYW1tYSkKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkoZHB5KTsKKyAgICB4WEY4NlZpZE1vZGVTZXRHYW1tYVJlcSAqcmVxOworCisgICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbihkcHksIGluZm8sIEZhbHNlKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhGODZWaWRNb2RlU2V0R2FtbWEsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVTZXRHYW1tYTsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPnJlZCA9IChDQVJEMzIpKEdhbW1hLT5yZWQgKiAxMDAwMC4pOworICAgIHJlcS0+Z3JlZW4gPSAoQ0FSRDMyKShHYW1tYS0+Z3JlZW4gKiAxMDAwMC4pOworICAgIHJlcS0+Ymx1ZSA9IChDQVJEMzIpKEdhbW1hLT5ibHVlICogMTAwMDAuKTsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sCitTRExfTkFNRShYRjg2VmlkTW9kZUdldEdhbW1hKShEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIFNETF9OQU1FKFhGODZWaWRNb2RlR2FtbWEpICpHYW1tYSkKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlR2V0R2FtbWFSZXBseSByZXA7CisgICAgeFhGODZWaWRNb2RlR2V0R2FtbWFSZXEgKnJlcTsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRHYW1tYSwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZUdldEdhbW1hOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlyZXR1cm4gRmFsc2U7CisgICAgfQorICAgIEdhbW1hLT5yZWQgPSAoKGZsb2F0KXJlcC5yZWQpIC8gMTAwMDAuOworICAgIEdhbW1hLT5ncmVlbiA9ICgoZmxvYXQpcmVwLmdyZWVuKSAvIDEwMDAwLjsKKyAgICBHYW1tYS0+Ymx1ZSA9ICgoZmxvYXQpcmVwLmJsdWUpIC8gMTAwMDAuOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wKK1NETF9OQU1FKFhGODZWaWRNb2RlR2V0TW9kZUxpbmUpKGRweSwgc2NyZWVuLCBkb3RjbG9jaywgbW9kZWxpbmUpCisgICAgRGlzcGxheSogZHB5OworICAgIGludCBzY3JlZW47CisgICAgaW50KiBkb3RjbG9jazsgCisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlTGluZSkqIG1vZGVsaW5lOworeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKKyAgICB4WEY4NlZpZE1vZGVHZXRNb2RlTGluZVJlcGx5IHJlcDsKKyAgICB4WEY4Nk9sZFZpZE1vZGVHZXRNb2RlTGluZVJlcGx5IG9sZHJlcDsKKyAgICB4WEY4NlZpZE1vZGVHZXRNb2RlTGluZVJlcSAqcmVxOworICAgIGludCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbjsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworICAgIFNETF9OQU1FKFhGODZWaWRNb2RlUXVlcnlWZXJzaW9uKShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRNb2RlTGluZSwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZUdldE1vZGVMaW5lOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIAorICAgIGlmIChtYWpvclZlcnNpb24gPCAyKSB7CisJaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZvbGRyZXAsIAorICAgICAgICAgICAgKFNJWkVPRih4WEY4Nk9sZFZpZE1vZGVHZXRNb2RlTGluZVJlcGx5KSAtIFNJWkVPRih4UmVwbHkpKSA+PiAyLCB4RmFsc2UpKSB7CisJICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKwkgICAgU3luY0hhbmRsZSgpOworCSAgICByZXR1cm4gRmFsc2U7CisJfQorCSpkb3RjbG9jayA9IG9sZHJlcC5kb3RjbG9jazsKKwltb2RlbGluZS0+aGRpc3BsYXkgICA9IG9sZHJlcC5oZGlzcGxheTsKKwltb2RlbGluZS0+aHN5bmNzdGFydCA9IG9sZHJlcC5oc3luY3N0YXJ0OworCW1vZGVsaW5lLT5oc3luY2VuZCAgID0gb2xkcmVwLmhzeW5jZW5kOworCW1vZGVsaW5lLT5odG90YWwgICAgID0gb2xkcmVwLmh0b3RhbDsKKwltb2RlbGluZS0+aHNrZXcgICAgICA9IDA7CisJbW9kZWxpbmUtPnZkaXNwbGF5ICAgPSBvbGRyZXAudmRpc3BsYXk7CisJbW9kZWxpbmUtPnZzeW5jc3RhcnQgPSBvbGRyZXAudnN5bmNzdGFydDsKKwltb2RlbGluZS0+dnN5bmNlbmQgICA9IG9sZHJlcC52c3luY2VuZDsKKwltb2RlbGluZS0+dnRvdGFsICAgICA9IG9sZHJlcC52dG90YWw7CisJbW9kZWxpbmUtPmZsYWdzICAgICAgPSBvbGRyZXAuZmxhZ3M7CisJbW9kZWxpbmUtPnByaXZzaXplICAgPSBvbGRyZXAucHJpdnNpemU7CisgICAgfSBlbHNlIHsKKwlpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgCisgICAgICAgICAgICAoU0laRU9GKHhYRjg2VmlkTW9kZUdldE1vZGVMaW5lUmVwbHkpIC0gU0laRU9GKHhSZXBseSkpID4+IDIsIHhGYWxzZSkpIHsKKwkgICAgVW5sb2NrRGlzcGxheShkcHkpOworCSAgICBTeW5jSGFuZGxlKCk7CisJICAgIHJldHVybiBGYWxzZTsKKwl9CisJKmRvdGNsb2NrID0gcmVwLmRvdGNsb2NrOworCW1vZGVsaW5lLT5oZGlzcGxheSAgID0gcmVwLmhkaXNwbGF5OworCW1vZGVsaW5lLT5oc3luY3N0YXJ0ID0gcmVwLmhzeW5jc3RhcnQ7CisJbW9kZWxpbmUtPmhzeW5jZW5kICAgPSByZXAuaHN5bmNlbmQ7CisJbW9kZWxpbmUtPmh0b3RhbCAgICAgPSByZXAuaHRvdGFsOworCW1vZGVsaW5lLT5oc2tldyAgICAgID0gcmVwLmhza2V3OworCW1vZGVsaW5lLT52ZGlzcGxheSAgID0gcmVwLnZkaXNwbGF5OworCW1vZGVsaW5lLT52c3luY3N0YXJ0ID0gcmVwLnZzeW5jc3RhcnQ7CisJbW9kZWxpbmUtPnZzeW5jZW5kICAgPSByZXAudnN5bmNlbmQ7CisJbW9kZWxpbmUtPnZ0b3RhbCAgICAgPSByZXAudnRvdGFsOworCW1vZGVsaW5lLT5mbGFncyAgICAgID0gcmVwLmZsYWdzOworCW1vZGVsaW5lLT5wcml2c2l6ZSAgID0gcmVwLnByaXZzaXplOworICAgIH0KKyAgICAKKyAgICBpZiAobW9kZWxpbmUtPnByaXZzaXplID4gMCkgeworCWlmICghKG1vZGVsaW5lLT5wcml2YXRlID0gWGNhbGxvYyhtb2RlbGluZS0+cHJpdnNpemUsIHNpemVvZihJTlQzMikpKSkgeworCSAgICBfWEVhdERhdGEoZHB5LCAobW9kZWxpbmUtPnByaXZzaXplKSAqIHNpemVvZihJTlQzMikpOworCSAgICBYZnJlZShtb2RlbGluZS0+cHJpdmF0ZSk7CisJICAgIHJldHVybiBGYWxzZTsKKwl9CisJX1hSZWFkKGRweSwgKGNoYXIqKW1vZGVsaW5lLT5wcml2YXRlLCBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKKyAgICB9IGVsc2UgeworCW1vZGVsaW5lLT5wcml2YXRlID0gTlVMTDsKKyAgICB9CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbAorU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXMpKGRweSwgc2NyZWVuLCBtb2RlY291bnQsIG1vZGVsaW5lc1B0cikKKyAgICBEaXNwbGF5KiBkcHk7CisgICAgaW50IHNjcmVlbjsKKyAgICBpbnQqIG1vZGVjb3VudDsgCisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKioqbW9kZWxpbmVzUHRyOworeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKKyAgICB4WEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXNSZXBseSByZXA7CisgICAgeFhGODZWaWRNb2RlR2V0QWxsTW9kZUxpbmVzUmVxICpyZXE7CisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKm1kaW5mcHRyLCAqKm1vZGVsaW5lczsKKyAgICB4WEY4NlZpZE1vZGVNb2RlSW5mbyB4bWRsaW5lOworICAgIHhYRjg2T2xkVmlkTW9kZU1vZGVJbmZvIG9sZHhtZGxpbmU7CisgICAgaW50IGk7CisgICAgaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOworICAgIEJvb2wgcHJvdG9jb2xCdWcgPSBGYWxzZTsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgLyoKKyAgICAgKiBOb3RlOiBUaGVyZSB3YXMgYSBidWcgaW4gdGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGluIHZlcnNpb25zCisgICAgICogMC54IHdpdGggeCA8IDggKHRoZSAucHJpdmF0ZSBmaWVsZCB3YXNuJ3QgYmVpbmcgcGFzc2VkIG92ZXIgdGhlIHdpcmUpLgorICAgICAqIENoZWNrIHRoZSBzZXJ2ZXIncyB2ZXJzaW9uLCBhbmQgYWNjZXB0IHRoZSBvbGQgZm9ybWF0IGlmIGFwcHJvcHJpYXRlLgorICAgICAqLworCisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgaWYgKG1ham9yVmVyc2lvbiA9PSAwICYmIG1pbm9yVmVyc2lvbiA8IDgpIHsKKwlwcm90b2NvbEJ1ZyA9IFRydWU7CisjaWZkZWYgREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIlhGODZWaWRNb2RlR2V0QWxsTW9kZUxpbmVzOiBXYXJuaW5nOiBYc2VydmVyIGlzIgorCQkicnVubmluZyBhbiBvbGQgdmVyc2lvbiAoJWQuJWQpXG4iLCBtYWpvclZlcnNpb24sCisJCW1pbm9yVmVyc2lvbik7CisjZW5kaWYKKyAgICB9CisgICAgCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXMsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXM7CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIAorICAgICAgICAoU0laRU9GKHhYRjg2VmlkTW9kZUdldEFsbE1vZGVMaW5lc1JlcGx5KSAtIFNJWkVPRih4UmVwbHkpKSA+PiAyLCB4RmFsc2UpKSB7CisgICAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKworICAgICptb2RlY291bnQgPSByZXAubW9kZWNvdW50OworCisgICAgaWYgKCEobW9kZWxpbmVzID0gKFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pICoqKSBYY2FsbG9jKHJlcC5tb2RlY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtzaXplb2YoU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykpKSkpIHsKKwlpZiAobWFqb3JWZXJzaW9uIDwgMikKKyAgICAgICAgICAgIF9YRWF0RGF0YShkcHksIChyZXAubW9kZWNvdW50KSAqIHNpemVvZih4WEY4Nk9sZFZpZE1vZGVNb2RlSW5mbykpOworCWVsc2UKKyAgICAgICAgICAgIF9YRWF0RGF0YShkcHksIChyZXAubW9kZWNvdW50KSAqIHNpemVvZih4WEY4NlZpZE1vZGVNb2RlSW5mbykpOworICAgICAgICBYZnJlZShtb2RlbGluZXMpOworICAgICAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgICAgIFN5bmNIYW5kbGUoKTsKKyAgICAgICAgcmV0dXJuIEZhbHNlOworICAgIH0KKyAgICBtZGluZnB0ciA9IChTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVJbmZvKSAqKSAoCisJCQkgICAgKGNoYXIgKikgbW9kZWxpbmVzCisJCQkgICAgKyByZXAubW9kZWNvdW50KnNpemVvZihTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVJbmZvKSAqKQorCQkgICAgKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCByZXAubW9kZWNvdW50OyBpKyspIHsKKyAgICAgICAgbW9kZWxpbmVzW2ldID0gbWRpbmZwdHIrKzsKKwlpZiAobWFqb3JWZXJzaW9uIDwgMikgeworICAgICAgICAgICAgX1hSZWFkKGRweSwgKGNoYXIqKSZvbGR4bWRsaW5lLCBzaXplb2YoeFhGODZPbGRWaWRNb2RlTW9kZUluZm8pKTsKKwkgICAgbW9kZWxpbmVzW2ldLT5kb3RjbG9jayAgID0gb2xkeG1kbGluZS5kb3RjbG9jazsKKwkgICAgbW9kZWxpbmVzW2ldLT5oZGlzcGxheSAgID0gb2xkeG1kbGluZS5oZGlzcGxheTsKKwkgICAgbW9kZWxpbmVzW2ldLT5oc3luY3N0YXJ0ID0gb2xkeG1kbGluZS5oc3luY3N0YXJ0OworCSAgICBtb2RlbGluZXNbaV0tPmhzeW5jZW5kICAgPSBvbGR4bWRsaW5lLmhzeW5jZW5kOworCSAgICBtb2RlbGluZXNbaV0tPmh0b3RhbCAgICAgPSBvbGR4bWRsaW5lLmh0b3RhbDsKKwkgICAgbW9kZWxpbmVzW2ldLT5oc2tldyAgICAgID0gMDsKKwkgICAgbW9kZWxpbmVzW2ldLT52ZGlzcGxheSAgID0gb2xkeG1kbGluZS52ZGlzcGxheTsKKwkgICAgbW9kZWxpbmVzW2ldLT52c3luY3N0YXJ0ID0gb2xkeG1kbGluZS52c3luY3N0YXJ0OworCSAgICBtb2RlbGluZXNbaV0tPnZzeW5jZW5kICAgPSBvbGR4bWRsaW5lLnZzeW5jZW5kOworCSAgICBtb2RlbGluZXNbaV0tPnZ0b3RhbCAgICAgPSBvbGR4bWRsaW5lLnZ0b3RhbDsKKwkgICAgbW9kZWxpbmVzW2ldLT5mbGFncyAgICAgID0gb2xkeG1kbGluZS5mbGFnczsKKwkgICAgaWYgKHByb3RvY29sQnVnKSB7CisJCW1vZGVsaW5lc1tpXS0+cHJpdnNpemUgPSAwOworCQltb2RlbGluZXNbaV0tPnByaXZhdGUgPSBOVUxMOworCSAgICB9IGVsc2UgeworCQltb2RlbGluZXNbaV0tPnByaXZzaXplICAgPSBvbGR4bWRsaW5lLnByaXZzaXplOworCQlpZiAob2xkeG1kbGluZS5wcml2c2l6ZSA+IDApIHsKKwkgICAgICAgICAgICBpZiAoIShtb2RlbGluZXNbaV0tPnByaXZhdGUgPQorCQkJICAgIFhjYWxsb2Mob2xkeG1kbGluZS5wcml2c2l6ZSwgc2l6ZW9mKElOVDMyKSkpKSB7CisJCQlfWEVhdERhdGEoZHB5LCAob2xkeG1kbGluZS5wcml2c2l6ZSkgKiBzaXplb2YoSU5UMzIpKTsKKwkJCVhmcmVlKG1vZGVsaW5lc1tpXS0+cHJpdmF0ZSk7CisJCSAgICB9IGVsc2UgeworCQkJX1hSZWFkKGRweSwgKGNoYXIqKW1vZGVsaW5lc1tpXS0+cHJpdmF0ZSwKKwkJCSAgICAgb2xkeG1kbGluZS5wcml2c2l6ZSAqIHNpemVvZihJTlQzMikpOworCQkgICAgfQorCQl9IGVsc2UgeworCQkgIG1vZGVsaW5lc1tpXS0+cHJpdmF0ZSA9IE5VTEw7CisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisgICAgICAgICAgICBfWFJlYWQoZHB5LCAoY2hhciopJnhtZGxpbmUsIHNpemVvZih4WEY4NlZpZE1vZGVNb2RlSW5mbykpOworCSAgICBtb2RlbGluZXNbaV0tPmRvdGNsb2NrICAgPSB4bWRsaW5lLmRvdGNsb2NrOworCSAgICBtb2RlbGluZXNbaV0tPmhkaXNwbGF5ICAgPSB4bWRsaW5lLmhkaXNwbGF5OworCSAgICBtb2RlbGluZXNbaV0tPmhzeW5jc3RhcnQgPSB4bWRsaW5lLmhzeW5jc3RhcnQ7CisJICAgIG1vZGVsaW5lc1tpXS0+aHN5bmNlbmQgICA9IHhtZGxpbmUuaHN5bmNlbmQ7CisJICAgIG1vZGVsaW5lc1tpXS0+aHRvdGFsICAgICA9IHhtZGxpbmUuaHRvdGFsOworCSAgICBtb2RlbGluZXNbaV0tPmhza2V3ICAgICAgPSB4bWRsaW5lLmhza2V3OworCSAgICBtb2RlbGluZXNbaV0tPnZkaXNwbGF5ICAgPSB4bWRsaW5lLnZkaXNwbGF5OworCSAgICBtb2RlbGluZXNbaV0tPnZzeW5jc3RhcnQgPSB4bWRsaW5lLnZzeW5jc3RhcnQ7CisJICAgIG1vZGVsaW5lc1tpXS0+dnN5bmNlbmQgICA9IHhtZGxpbmUudnN5bmNlbmQ7CisJICAgIG1vZGVsaW5lc1tpXS0+dnRvdGFsICAgICA9IHhtZGxpbmUudnRvdGFsOworCSAgICBtb2RlbGluZXNbaV0tPmZsYWdzICAgICAgPSB4bWRsaW5lLmZsYWdzOworCSAgICBpZiAocHJvdG9jb2xCdWcpIHsKKwkJbW9kZWxpbmVzW2ldLT5wcml2c2l6ZSA9IDA7CisJCW1vZGVsaW5lc1tpXS0+cHJpdmF0ZSA9IE5VTEw7CisJICAgIH0gZWxzZSB7CisJCW1vZGVsaW5lc1tpXS0+cHJpdnNpemUgICA9IHhtZGxpbmUucHJpdnNpemU7CisJCWlmICh4bWRsaW5lLnByaXZzaXplID4gMCkgeworCQkgICAgaWYgKCEobW9kZWxpbmVzW2ldLT5wcml2YXRlID0KKwkJCSAgICBYY2FsbG9jKHhtZGxpbmUucHJpdnNpemUsIHNpemVvZihJTlQzMikpKSkgeworCQkJX1hFYXREYXRhKGRweSwgKHhtZGxpbmUucHJpdnNpemUpICogc2l6ZW9mKElOVDMyKSk7CisJCQlYZnJlZShtb2RlbGluZXNbaV0tPnByaXZhdGUpOworCQkgICAgfSBlbHNlIHsKKwkJCV9YUmVhZChkcHksIChjaGFyKiltb2RlbGluZXNbaV0tPnByaXZhdGUsCisJCQkgICAgIHhtZGxpbmUucHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKKwkJICAgIH0KKwkJfSBlbHNlIHsKKwkJICAgIG1vZGVsaW5lc1tpXS0+cHJpdmF0ZSA9IE5VTEw7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgKm1vZGVsaW5lc1B0ciA9IG1vZGVsaW5lczsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBUcnVlOworfQorCisvKgorICogR2V0UmVxIHJlcGxhY2VtZW50IGZvciB1c2Ugd2l0aCBWaWRNb2RlIHByb3RvY29scyBlYXJsaWVyIHRoYW4gMi4wCisgKi8KKyNpZiAhZGVmaW5lZChVTklYQ1BQKSB8fCBkZWZpbmVkKEFOU0lDUFApCisjZGVmaW5lIEdldE9sZFJlcShuYW1lLCBvbGRuYW1lLCByZXEpIFwKKyAgICAgICAgV09SRDY0QUxJR05cCisJaWYgKChkcHktPmJ1ZnB0ciArIFNJWkVPRih4IyNvbGRuYW1lIyNSZXEpKSA+IGRweS0+YnVmbWF4KVwKKwkJX1hGbHVzaChkcHkpO1wKKwlyZXEgPSAoeCMjb2xkbmFtZSMjUmVxICopKGRweS0+bGFzdF9yZXEgPSBkcHktPmJ1ZnB0cik7XAorCXJlcS0+cmVxVHlwZSA9IFhfIyNuYW1lO1wKKwlyZXEtPmxlbmd0aCA9IChTSVpFT0YoeCMjb2xkbmFtZSMjUmVxKSk+PjI7XAorCWRweS0+YnVmcHRyICs9IFNJWkVPRih4IyNvbGRuYW1lIyNSZXEpO1wKKwlkcHktPnJlcXVlc3QrKworCisjZWxzZSAgLyogbm9uLUFOU0kgQyB1c2VzIGVtcHR5IGNvbW1lbnQgaW5zdGVhZCBvZiAiIyMiIGZvciB0b2tlbiBjb25jYXRlbmF0aW9uICovCisjZGVmaW5lIEdldE9sZFJlcShuYW1lLCBvbGRuYW1lLCByZXEpIFwKKyAgICAgICAgV09SRDY0QUxJR05cCisJaWYgKChkcHktPmJ1ZnB0ciArIFNJWkVPRih4LyoqL29sZG5hbWUvKiovUmVxKSkgPiBkcHktPmJ1Zm1heClcCisJCV9YRmx1c2goZHB5KTtcCisJcmVxID0gKHgvKiovb2xkbmFtZS8qKi9SZXEgKikoZHB5LT5sYXN0X3JlcSA9IGRweS0+YnVmcHRyKTtcCisJcmVxLT5yZXFUeXBlID0gWF8vKiovbmFtZTtcCisJcmVxLT5sZW5ndGggPSAoU0laRU9GKHgvKiovb2xkbmFtZS8qKi9SZXEpKT4+MjtcCisJZHB5LT5idWZwdHIgKz0gU0laRU9GKHgvKiovb2xkbmFtZS8qKi9SZXEpO1wKKwlkcHktPnJlcXVlc3QrKworI2VuZGlmCisKK0Jvb2wKK1NETF9OQU1FKFhGODZWaWRNb2RlQWRkTW9kZUxpbmUpIChkcHksIHNjcmVlbiwgbmV3bW9kZWxpbmUsIGFmdGVybW9kZWxpbmUpCisgICAgRGlzcGxheSAqZHB5OworICAgIGludCBzY3JlZW47CisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykqIG5ld21vZGVsaW5lOworICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiBhZnRlcm1vZGVsaW5lOworeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKKyAgICB4WEY4NlZpZE1vZGVBZGRNb2RlTGluZVJlcSAqcmVxOworICAgIHhYRjg2T2xkVmlkTW9kZUFkZE1vZGVMaW5lUmVxICpvbGRyZXE7CisgICAgaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOworCisgICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7CisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIGlmIChtYWpvclZlcnNpb24gPCAyKSB7CisJR2V0T2xkUmVxKFhGODZWaWRNb2RlQWRkTW9kZUxpbmUsIFhGODZPbGRWaWRNb2RlQWRkTW9kZUxpbmUsIG9sZHJlcSk7CisJb2xkcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKwlvbGRyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVBZGRNb2RlTGluZTsKKwlvbGRyZXEtPnNjcmVlbiA9IHNjcmVlbjsKKwlvbGRyZXEtPmRvdGNsb2NrID0JbmV3bW9kZWxpbmUtPmRvdGNsb2NrOworCW9sZHJlcS0+aGRpc3BsYXkgPQluZXdtb2RlbGluZS0+aGRpc3BsYXk7CisJb2xkcmVxLT5oc3luY3N0YXJ0ID0JbmV3bW9kZWxpbmUtPmhzeW5jc3RhcnQ7CisJb2xkcmVxLT5oc3luY2VuZCA9CW5ld21vZGVsaW5lLT5oc3luY2VuZDsKKwlvbGRyZXEtPmh0b3RhbCA9CW5ld21vZGVsaW5lLT5odG90YWw7CisJb2xkcmVxLT52ZGlzcGxheSA9CW5ld21vZGVsaW5lLT52ZGlzcGxheTsKKwlvbGRyZXEtPnZzeW5jc3RhcnQgPQluZXdtb2RlbGluZS0+dnN5bmNzdGFydDsKKwlvbGRyZXEtPnZzeW5jZW5kID0JbmV3bW9kZWxpbmUtPnZzeW5jZW5kOworCW9sZHJlcS0+dnRvdGFsID0JbmV3bW9kZWxpbmUtPnZ0b3RhbDsKKwlvbGRyZXEtPmZsYWdzID0JCW5ld21vZGVsaW5lLT5mbGFnczsKKwlvbGRyZXEtPnByaXZzaXplID0JbmV3bW9kZWxpbmUtPnByaXZzaXplOworCWlmIChhZnRlcm1vZGVsaW5lICE9IE5VTEwpIHsKKwkgICAgb2xkcmVxLT5hZnRlcl9kb3RjbG9jayA9CWFmdGVybW9kZWxpbmUtPmRvdGNsb2NrOworCSAgICBvbGRyZXEtPmFmdGVyX2hkaXNwbGF5ID0JYWZ0ZXJtb2RlbGluZS0+aGRpc3BsYXk7CisJICAgIG9sZHJlcS0+YWZ0ZXJfaHN5bmNzdGFydCA9CWFmdGVybW9kZWxpbmUtPmhzeW5jc3RhcnQ7CisJICAgIG9sZHJlcS0+YWZ0ZXJfaHN5bmNlbmQgPQlhZnRlcm1vZGVsaW5lLT5oc3luY2VuZDsKKwkgICAgb2xkcmVxLT5hZnRlcl9odG90YWwgPQlhZnRlcm1vZGVsaW5lLT5odG90YWw7CisJICAgIG9sZHJlcS0+YWZ0ZXJfdmRpc3BsYXkgPQlhZnRlcm1vZGVsaW5lLT52ZGlzcGxheTsKKwkgICAgb2xkcmVxLT5hZnRlcl92c3luY3N0YXJ0ID0JYWZ0ZXJtb2RlbGluZS0+dnN5bmNzdGFydDsKKwkgICAgb2xkcmVxLT5hZnRlcl92c3luY2VuZCA9CWFmdGVybW9kZWxpbmUtPnZzeW5jZW5kOworCSAgICBvbGRyZXEtPmFmdGVyX3Z0b3RhbCA9CWFmdGVybW9kZWxpbmUtPnZ0b3RhbDsKKwkgICAgb2xkcmVxLT5hZnRlcl9mbGFncyA9CWFmdGVybW9kZWxpbmUtPmZsYWdzOworCX0gZWxzZSB7CisJICAgIG9sZHJlcS0+YWZ0ZXJfZG90Y2xvY2sgPQkwOworCSAgICBvbGRyZXEtPmFmdGVyX2hkaXNwbGF5ID0JMDsKKwkgICAgb2xkcmVxLT5hZnRlcl9oc3luY3N0YXJ0ID0JMDsKKwkgICAgb2xkcmVxLT5hZnRlcl9oc3luY2VuZCA9CTA7CisJICAgIG9sZHJlcS0+YWZ0ZXJfaHRvdGFsID0JMDsKKwkgICAgb2xkcmVxLT5hZnRlcl92ZGlzcGxheSA9CTA7CisJICAgIG9sZHJlcS0+YWZ0ZXJfdnN5bmNzdGFydCA9CTA7CisJICAgIG9sZHJlcS0+YWZ0ZXJfdnN5bmNlbmQgPQkwOworCSAgICBvbGRyZXEtPmFmdGVyX3Z0b3RhbCA9CTA7CisJICAgIG9sZHJlcS0+YWZ0ZXJfZmxhZ3MgPQkwOworCX0KKwlpZiAobmV3bW9kZWxpbmUtPnByaXZzaXplKSB7CisJICAgIG9sZHJlcS0+bGVuZ3RoICs9IG5ld21vZGVsaW5lLT5wcml2c2l6ZTsKKwkgICAgRGF0YTMyKGRweSwgKGxvbmcgKikgbmV3bW9kZWxpbmUtPnByaXZhdGUsCisJICAgICAgIG5ld21vZGVsaW5lLT5wcml2c2l6ZSAqIHNpemVvZihJTlQzMikpOworCX0KKyAgICB9IGVsc2UgeworCUdldFJlcShYRjg2VmlkTW9kZUFkZE1vZGVMaW5lLCByZXEpOworCXJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisJcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlQWRkTW9kZUxpbmU7CisJcmVxLT5zY3JlZW4gPSBzY3JlZW47CisJcmVxLT5kb3RjbG9jayA9CQluZXdtb2RlbGluZS0+ZG90Y2xvY2s7CisJcmVxLT5oZGlzcGxheSA9CQluZXdtb2RlbGluZS0+aGRpc3BsYXk7CisJcmVxLT5oc3luY3N0YXJ0ID0JbmV3bW9kZWxpbmUtPmhzeW5jc3RhcnQ7CisJcmVxLT5oc3luY2VuZCA9CQluZXdtb2RlbGluZS0+aHN5bmNlbmQ7CisJcmVxLT5odG90YWwgPQkJbmV3bW9kZWxpbmUtPmh0b3RhbDsKKwlyZXEtPmhza2V3ID0JCW5ld21vZGVsaW5lLT5oc2tldzsKKwlyZXEtPnZkaXNwbGF5ID0JCW5ld21vZGVsaW5lLT52ZGlzcGxheTsKKwlyZXEtPnZzeW5jc3RhcnQgPQluZXdtb2RlbGluZS0+dnN5bmNzdGFydDsKKwlyZXEtPnZzeW5jZW5kID0JCW5ld21vZGVsaW5lLT52c3luY2VuZDsKKwlyZXEtPnZ0b3RhbCA9CQluZXdtb2RlbGluZS0+dnRvdGFsOworCXJlcS0+ZmxhZ3MgPQkJbmV3bW9kZWxpbmUtPmZsYWdzOworCXJlcS0+cHJpdnNpemUgPQkJbmV3bW9kZWxpbmUtPnByaXZzaXplOworCWlmIChhZnRlcm1vZGVsaW5lICE9IE5VTEwpIHsKKwkgICAgcmVxLT5hZnRlcl9kb3RjbG9jayA9CWFmdGVybW9kZWxpbmUtPmRvdGNsb2NrOworCSAgICByZXEtPmFmdGVyX2hkaXNwbGF5ID0JYWZ0ZXJtb2RlbGluZS0+aGRpc3BsYXk7CisJICAgIHJlcS0+YWZ0ZXJfaHN5bmNzdGFydCA9CWFmdGVybW9kZWxpbmUtPmhzeW5jc3RhcnQ7CisJICAgIHJlcS0+YWZ0ZXJfaHN5bmNlbmQgPQlhZnRlcm1vZGVsaW5lLT5oc3luY2VuZDsKKwkgICAgcmVxLT5hZnRlcl9odG90YWwgPQkJYWZ0ZXJtb2RlbGluZS0+aHRvdGFsOworCSAgICByZXEtPmFmdGVyX2hza2V3ID0JCWFmdGVybW9kZWxpbmUtPmhza2V3OworCSAgICByZXEtPmFmdGVyX3ZkaXNwbGF5ID0JYWZ0ZXJtb2RlbGluZS0+dmRpc3BsYXk7CisJICAgIHJlcS0+YWZ0ZXJfdnN5bmNzdGFydCA9CWFmdGVybW9kZWxpbmUtPnZzeW5jc3RhcnQ7CisJICAgIHJlcS0+YWZ0ZXJfdnN5bmNlbmQgPQlhZnRlcm1vZGVsaW5lLT52c3luY2VuZDsKKwkgICAgcmVxLT5hZnRlcl92dG90YWwgPQkJYWZ0ZXJtb2RlbGluZS0+dnRvdGFsOworCSAgICByZXEtPmFmdGVyX2ZsYWdzID0JCWFmdGVybW9kZWxpbmUtPmZsYWdzOworCX0gZWxzZSB7CisJICAgIHJlcS0+YWZ0ZXJfZG90Y2xvY2sgPQkwOworCSAgICByZXEtPmFmdGVyX2hkaXNwbGF5ID0JMDsKKwkgICAgcmVxLT5hZnRlcl9oc3luY3N0YXJ0ID0JMDsKKwkgICAgcmVxLT5hZnRlcl9oc3luY2VuZCA9CTA7CisJICAgIHJlcS0+YWZ0ZXJfaHRvdGFsID0JCTA7CisJICAgIHJlcS0+YWZ0ZXJfaHNrZXcgPQkJMDsKKwkgICAgcmVxLT5hZnRlcl92ZGlzcGxheSA9CTA7CisJICAgIHJlcS0+YWZ0ZXJfdnN5bmNzdGFydCA9CTA7CisJICAgIHJlcS0+YWZ0ZXJfdnN5bmNlbmQgPQkwOworCSAgICByZXEtPmFmdGVyX3Z0b3RhbCA9CQkwOworCSAgICByZXEtPmFmdGVyX2ZsYWdzID0JCTA7CisJfQorCWlmIChuZXdtb2RlbGluZS0+cHJpdnNpemUpIHsKKwkgICAgcmVxLT5sZW5ndGggKz0gbmV3bW9kZWxpbmUtPnByaXZzaXplOworCSAgICBEYXRhMzIoZHB5LCAobG9uZyAqKSBuZXdtb2RlbGluZS0+cHJpdmF0ZSwKKwkgICAgICAgbmV3bW9kZWxpbmUtPnByaXZzaXplICogc2l6ZW9mKElOVDMyKSk7CisJfQorICAgIH0KKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sCitTRExfTkFNRShYRjg2VmlkTW9kZURlbGV0ZU1vZGVMaW5lKSAoZHB5LCBzY3JlZW4sIG1vZGVsaW5lKQorICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgc2NyZWVuOworICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiBtb2RlbGluZTsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlRGVsZXRlTW9kZUxpbmVSZXEgKnJlcTsKKyAgICB4WEY4Nk9sZFZpZE1vZGVEZWxldGVNb2RlTGluZVJlcSAqb2xkcmVxOworICAgIGludCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbjsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgMCk7CisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIGlmIChtYWpvclZlcnNpb24gPCAyKSB7CisJR2V0T2xkUmVxKFhGODZWaWRNb2RlRGVsZXRlTW9kZUxpbmUsIFhGODZPbGRWaWRNb2RlRGVsZXRlTW9kZUxpbmUsIG9sZHJlcSk7CisJb2xkcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKwlvbGRyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVEZWxldGVNb2RlTGluZTsKKwlvbGRyZXEtPnNjcmVlbiA9IHNjcmVlbjsKKwlvbGRyZXEtPmRvdGNsb2NrID0JbW9kZWxpbmUtPmRvdGNsb2NrOworCW9sZHJlcS0+aGRpc3BsYXkgPQltb2RlbGluZS0+aGRpc3BsYXk7CisJb2xkcmVxLT5oc3luY3N0YXJ0ID0JbW9kZWxpbmUtPmhzeW5jc3RhcnQ7CisJb2xkcmVxLT5oc3luY2VuZCA9CW1vZGVsaW5lLT5oc3luY2VuZDsKKwlvbGRyZXEtPmh0b3RhbCA9CW1vZGVsaW5lLT5odG90YWw7CisJb2xkcmVxLT52ZGlzcGxheSA9CW1vZGVsaW5lLT52ZGlzcGxheTsKKwlvbGRyZXEtPnZzeW5jc3RhcnQgPQltb2RlbGluZS0+dnN5bmNzdGFydDsKKwlvbGRyZXEtPnZzeW5jZW5kID0JbW9kZWxpbmUtPnZzeW5jZW5kOworCW9sZHJlcS0+dnRvdGFsID0JbW9kZWxpbmUtPnZ0b3RhbDsKKwlvbGRyZXEtPmZsYWdzID0JCW1vZGVsaW5lLT5mbGFnczsKKwlvbGRyZXEtPnByaXZzaXplID0JbW9kZWxpbmUtPnByaXZzaXplOworCWlmIChtb2RlbGluZS0+cHJpdnNpemUpIHsKKwkgICAgb2xkcmVxLT5sZW5ndGggKz0gbW9kZWxpbmUtPnByaXZzaXplOworCSAgICBEYXRhMzIoZHB5LCAobG9uZyAqKSBtb2RlbGluZS0+cHJpdmF0ZSwKKwkgICAgICAgbW9kZWxpbmUtPnByaXZzaXplICogc2l6ZW9mKElOVDMyKSk7CisJfQorICAgIH0gZWxzZSB7CisJR2V0UmVxKFhGODZWaWRNb2RlRGVsZXRlTW9kZUxpbmUsIHJlcSk7CisJcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKwlyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVEZWxldGVNb2RlTGluZTsKKwlyZXEtPnNjcmVlbiA9IHNjcmVlbjsKKwlyZXEtPmRvdGNsb2NrID0JCW1vZGVsaW5lLT5kb3RjbG9jazsKKwlyZXEtPmhkaXNwbGF5ID0JCW1vZGVsaW5lLT5oZGlzcGxheTsKKwlyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKKwlyZXEtPmhzeW5jZW5kID0JCW1vZGVsaW5lLT5oc3luY2VuZDsKKwlyZXEtPmh0b3RhbCA9CQltb2RlbGluZS0+aHRvdGFsOworCXJlcS0+aHNrZXcgPQkJbW9kZWxpbmUtPmhza2V3OworCXJlcS0+dmRpc3BsYXkgPQkJbW9kZWxpbmUtPnZkaXNwbGF5OworCXJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OworCXJlcS0+dnN5bmNlbmQgPQkJbW9kZWxpbmUtPnZzeW5jZW5kOworCXJlcS0+dnRvdGFsID0JCW1vZGVsaW5lLT52dG90YWw7CisJcmVxLT5mbGFncyA9CQltb2RlbGluZS0+ZmxhZ3M7CisJcmVxLT5wcml2c2l6ZSA9CQltb2RlbGluZS0+cHJpdnNpemU7CisJaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgeworCSAgICByZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7CisJICAgIERhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAorCSAgICAgICBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKKwl9CisgICAgfQorICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wKK1NETF9OQU1FKFhGODZWaWRNb2RlTW9kTW9kZUxpbmUpIChkcHksIHNjcmVlbiwgbW9kZWxpbmUpCisgICAgRGlzcGxheSAqZHB5OworICAgIGludCBzY3JlZW47CisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlTGluZSkqIG1vZGVsaW5lOworeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKKyAgICB4WEY4NlZpZE1vZGVNb2RNb2RlTGluZVJlcSAqcmVxOworICAgIHhYRjg2T2xkVmlkTW9kZU1vZE1vZGVMaW5lUmVxICpvbGRyZXE7CisgICAgaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOworCisgICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCAwKTsKKyAgICBTRExfTkFNRShYRjg2VmlkTW9kZVF1ZXJ5VmVyc2lvbikoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgaWYgKG1ham9yVmVyc2lvbiA8IDIpIHsKKwlHZXRPbGRSZXEoWEY4NlZpZE1vZGVNb2RNb2RlTGluZSwgWEY4Nk9sZFZpZE1vZGVNb2RNb2RlTGluZSwgb2xkcmVxKTsKKwlvbGRyZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworCW9sZHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZU1vZE1vZGVMaW5lOworCW9sZHJlcS0+c2NyZWVuID0gc2NyZWVuOworCW9sZHJlcS0+aGRpc3BsYXkgPQltb2RlbGluZS0+aGRpc3BsYXk7CisJb2xkcmVxLT5oc3luY3N0YXJ0ID0JbW9kZWxpbmUtPmhzeW5jc3RhcnQ7CisJb2xkcmVxLT5oc3luY2VuZCA9CW1vZGVsaW5lLT5oc3luY2VuZDsKKwlvbGRyZXEtPmh0b3RhbCA9CW1vZGVsaW5lLT5odG90YWw7CisJb2xkcmVxLT52ZGlzcGxheSA9CW1vZGVsaW5lLT52ZGlzcGxheTsKKwlvbGRyZXEtPnZzeW5jc3RhcnQgPQltb2RlbGluZS0+dnN5bmNzdGFydDsKKwlvbGRyZXEtPnZzeW5jZW5kID0JbW9kZWxpbmUtPnZzeW5jZW5kOworCW9sZHJlcS0+dnRvdGFsID0JbW9kZWxpbmUtPnZ0b3RhbDsKKwlvbGRyZXEtPmZsYWdzID0JCW1vZGVsaW5lLT5mbGFnczsKKwlvbGRyZXEtPnByaXZzaXplID0JbW9kZWxpbmUtPnByaXZzaXplOworCWlmIChtb2RlbGluZS0+cHJpdnNpemUpIHsKKwkgICAgb2xkcmVxLT5sZW5ndGggKz0gbW9kZWxpbmUtPnByaXZzaXplOworCSAgICBEYXRhMzIoZHB5LCAobG9uZyAqKSBtb2RlbGluZS0+cHJpdmF0ZSwKKwkgICAgICAgbW9kZWxpbmUtPnByaXZzaXplICogc2l6ZW9mKElOVDMyKSk7CisJfQorICAgIH0gZWxzZSB7CisJR2V0UmVxKFhGODZWaWRNb2RlTW9kTW9kZUxpbmUsIHJlcSk7CisJcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKwlyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVNb2RNb2RlTGluZTsKKwlyZXEtPnNjcmVlbiA9IHNjcmVlbjsKKwlyZXEtPmhkaXNwbGF5ID0JCW1vZGVsaW5lLT5oZGlzcGxheTsKKwlyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKKwlyZXEtPmhzeW5jZW5kID0JCW1vZGVsaW5lLT5oc3luY2VuZDsKKwlyZXEtPmh0b3RhbCA9CQltb2RlbGluZS0+aHRvdGFsOworCXJlcS0+aHNrZXcgPQkJbW9kZWxpbmUtPmhza2V3OworCXJlcS0+dmRpc3BsYXkgPQkJbW9kZWxpbmUtPnZkaXNwbGF5OworCXJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OworCXJlcS0+dnN5bmNlbmQgPQkJbW9kZWxpbmUtPnZzeW5jZW5kOworCXJlcS0+dnRvdGFsID0JCW1vZGVsaW5lLT52dG90YWw7CisJcmVxLT5mbGFncyA9CQltb2RlbGluZS0+ZmxhZ3M7CisJcmVxLT5wcml2c2l6ZSA9CQltb2RlbGluZS0+cHJpdnNpemU7CisJaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgeworCSAgICByZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7CisJICAgIERhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAorCSAgICAgICBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKKwl9CisgICAgfQorICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK1N0YXR1cworU0RMX05BTUUoWEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lKSAoZHB5LCBzY3JlZW4sIG1vZGVsaW5lKQorICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgc2NyZWVuOworICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiBtb2RlbGluZTsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlVmFsaWRhdGVNb2RlTGluZVJlcSAqcmVxOworICAgIHhYRjg2T2xkVmlkTW9kZVZhbGlkYXRlTW9kZUxpbmVSZXEgKm9sZHJlcTsKKyAgICB4WEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lUmVwbHkgcmVwOworICAgIGludCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbjsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgMCk7CisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworCisgICAgaWYgKG1ham9yVmVyc2lvbiA8IDIpIHsKKwlHZXRPbGRSZXEoWEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lLCBYRjg2T2xkVmlkTW9kZVZhbGlkYXRlTW9kZUxpbmUsIG9sZHJlcSk7CisJb2xkcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKwlvbGRyZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lOworCW9sZHJlcS0+c2NyZWVuID0gc2NyZWVuOworCW9sZHJlcS0+ZG90Y2xvY2sgPQltb2RlbGluZS0+ZG90Y2xvY2s7CisJb2xkcmVxLT5oZGlzcGxheSA9CW1vZGVsaW5lLT5oZGlzcGxheTsKKwlvbGRyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKKwlvbGRyZXEtPmhzeW5jZW5kID0JbW9kZWxpbmUtPmhzeW5jZW5kOworCW9sZHJlcS0+aHRvdGFsID0JbW9kZWxpbmUtPmh0b3RhbDsKKwlvbGRyZXEtPnZkaXNwbGF5ID0JbW9kZWxpbmUtPnZkaXNwbGF5OworCW9sZHJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OworCW9sZHJlcS0+dnN5bmNlbmQgPQltb2RlbGluZS0+dnN5bmNlbmQ7CisJb2xkcmVxLT52dG90YWwgPQltb2RlbGluZS0+dnRvdGFsOworCW9sZHJlcS0+ZmxhZ3MgPQkJbW9kZWxpbmUtPmZsYWdzOworCW9sZHJlcS0+cHJpdnNpemUgPQltb2RlbGluZS0+cHJpdnNpemU7CisJaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgeworCSAgICBvbGRyZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7CisJICAgIERhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAorCSAgICAgICBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKKwl9CisgICAgfSBlbHNlIHsKKwlHZXRSZXEoWEY4NlZpZE1vZGVWYWxpZGF0ZU1vZGVMaW5lLCByZXEpOworCXJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisJcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlVmFsaWRhdGVNb2RlTGluZTsKKwlyZXEtPnNjcmVlbiA9IHNjcmVlbjsKKwlyZXEtPmRvdGNsb2NrID0JCW1vZGVsaW5lLT5kb3RjbG9jazsKKwlyZXEtPmhkaXNwbGF5ID0JCW1vZGVsaW5lLT5oZGlzcGxheTsKKwlyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKKwlyZXEtPmhzeW5jZW5kID0JCW1vZGVsaW5lLT5oc3luY2VuZDsKKwlyZXEtPmh0b3RhbCA9CQltb2RlbGluZS0+aHRvdGFsOworCXJlcS0+aHNrZXcgPQkJbW9kZWxpbmUtPmhza2V3OworCXJlcS0+dmRpc3BsYXkgPQkJbW9kZWxpbmUtPnZkaXNwbGF5OworCXJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OworCXJlcS0+dnN5bmNlbmQgPQkJbW9kZWxpbmUtPnZzeW5jZW5kOworCXJlcS0+dnRvdGFsID0JCW1vZGVsaW5lLT52dG90YWw7CisJcmVxLT5mbGFncyA9CQltb2RlbGluZS0+ZmxhZ3M7CisJcmVxLT5wcml2c2l6ZSA9CQltb2RlbGluZS0+cHJpdnNpemU7CisJaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgeworCSAgICByZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7CisJICAgIERhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAorCSAgICAgICBtb2RlbGluZS0+cHJpdnNpemUgKiBzaXplb2YoSU5UMzIpKTsKKwl9CisgICAgfQorICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlyZXR1cm4gTU9ERV9CQUQ7CisgICAgfQorICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIHJlcC5zdGF0dXM7Cit9CisKK0Jvb2wKK1NETF9OQU1FKFhGODZWaWRNb2RlU3dpdGNoTW9kZSkoZHB5LCBzY3JlZW4sIHpvb20pCisgICAgRGlzcGxheSogZHB5OworICAgIGludCBzY3JlZW47CisgICAgaW50IHpvb207Cit7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOworICAgIHhYRjg2VmlkTW9kZVN3aXRjaE1vZGVSZXEgKnJlcTsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NlZpZE1vZGVTd2l0Y2hNb2RlLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlU3dpdGNoTW9kZTsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPnpvb20gPSB6b29tOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIFRydWU7Cit9CisgICAgCitCb29sCitTRExfTkFNRShYRjg2VmlkTW9kZVN3aXRjaFRvTW9kZSkoZHB5LCBzY3JlZW4sIG1vZGVsaW5lKQorICAgIERpc3BsYXkqIGRweTsKKyAgICBpbnQgc2NyZWVuOworICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiBtb2RlbGluZTsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlU3dpdGNoVG9Nb2RlUmVxICpyZXE7CisgICAgeFhGODZPbGRWaWRNb2RlU3dpdGNoVG9Nb2RlUmVxICpvbGRyZXE7CisgICAgaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOworICAgIEJvb2wgcHJvdG9jb2xCdWcgPSBGYWxzZTsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgLyoKKyAgICAgKiBOb3RlOiBUaGVyZSB3YXMgYSBidWcgaW4gdGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGluIHZlcnNpb25zCisgICAgICogMC54IHdpdGggeCA8IDggKHRoZSAucHJpdmF0ZSBmaWVsZCB3YXNuJ3QgZXhwZWN0ZWQgdG8gYmUgc2VudCBvdmVyCisgICAgICogdGhlIHdpcmUpLiAgQ2hlY2sgdGhlIHNlcnZlcidzIHZlcnNpb24sIGFuZCBhY2NlcHQgdGhlIG9sZCBmb3JtYXQKKyAgICAgKiBpZiBhcHByb3ByaWF0ZS4KKyAgICAgKi8KKworICAgIFNETF9OQU1FKFhGODZWaWRNb2RlUXVlcnlWZXJzaW9uKShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgIGlmIChtYWpvclZlcnNpb24gPT0gMCAmJiBtaW5vclZlcnNpb24gPCA4KSB7CisJcHJvdG9jb2xCdWcgPSBUcnVlOworI2lmZGVmIERFQlVHCisJZnByaW50ZihzdGRlcnIsICJYRjg2VmlkTW9kZVN3aXRjaFRvTW9kZTogV2FybmluZzogWHNlcnZlciBpcyIKKwkJInJ1bm5pbmcgYW4gb2xkIHZlcnNpb24gKCVkLiVkKVxuIiwgbWFqb3JWZXJzaW9uLAorCQltaW5vclZlcnNpb24pOworI2VuZGlmCisgICAgfQorICAgIAorICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgaWYgKG1ham9yVmVyc2lvbiA8IDIpIHsKKwlHZXRPbGRSZXEoWEY4NlZpZE1vZGVTd2l0Y2hUb01vZGUsIFhGODZPbGRWaWRNb2RlU3dpdGNoVG9Nb2RlLCBvbGRyZXEpOworCW9sZHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisJb2xkcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlU3dpdGNoVG9Nb2RlOworCW9sZHJlcS0+c2NyZWVuID0gc2NyZWVuOworCW9sZHJlcS0+ZG90Y2xvY2sgPQltb2RlbGluZS0+ZG90Y2xvY2s7CisJb2xkcmVxLT5oZGlzcGxheSA9CW1vZGVsaW5lLT5oZGlzcGxheTsKKwlvbGRyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKKwlvbGRyZXEtPmhzeW5jZW5kID0JbW9kZWxpbmUtPmhzeW5jZW5kOworCW9sZHJlcS0+aHRvdGFsID0JbW9kZWxpbmUtPmh0b3RhbDsKKwlvbGRyZXEtPnZkaXNwbGF5ID0JbW9kZWxpbmUtPnZkaXNwbGF5OworCW9sZHJlcS0+dnN5bmNzdGFydCA9CW1vZGVsaW5lLT52c3luY3N0YXJ0OworCW9sZHJlcS0+dnN5bmNlbmQgPQltb2RlbGluZS0+dnN5bmNlbmQ7CisJb2xkcmVxLT52dG90YWwgPQltb2RlbGluZS0+dnRvdGFsOworCW9sZHJlcS0+ZmxhZ3MgPQltb2RlbGluZS0+ZmxhZ3M7CisJaWYgKHByb3RvY29sQnVnKSB7CisJICAgIG9sZHJlcS0+cHJpdnNpemUgPSAwOworCX0gZWxzZSB7CisJICAgIG9sZHJlcS0+cHJpdnNpemUgPQltb2RlbGluZS0+cHJpdnNpemU7CisJICAgIGlmIChtb2RlbGluZS0+cHJpdnNpemUpIHsKKwkJb2xkcmVxLT5sZW5ndGggKz0gbW9kZWxpbmUtPnByaXZzaXplOworCQlEYXRhMzIoZHB5LCAobG9uZyAqKSBtb2RlbGluZS0+cHJpdmF0ZSwKKwkgICAgICAgICAgIG1vZGVsaW5lLT5wcml2c2l6ZSAqIHNpemVvZihJTlQzMikpOworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisJR2V0UmVxKFhGODZWaWRNb2RlU3dpdGNoVG9Nb2RlLCByZXEpOworCXJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisJcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlU3dpdGNoVG9Nb2RlOworCXJlcS0+c2NyZWVuID0gc2NyZWVuOworCXJlcS0+ZG90Y2xvY2sgPQltb2RlbGluZS0+ZG90Y2xvY2s7CisJcmVxLT5oZGlzcGxheSA9CW1vZGVsaW5lLT5oZGlzcGxheTsKKwlyZXEtPmhzeW5jc3RhcnQgPQltb2RlbGluZS0+aHN5bmNzdGFydDsKKwlyZXEtPmhzeW5jZW5kID0JbW9kZWxpbmUtPmhzeW5jZW5kOworCXJlcS0+aHRvdGFsID0JbW9kZWxpbmUtPmh0b3RhbDsKKwlyZXEtPmhza2V3ID0JbW9kZWxpbmUtPmhza2V3OworCXJlcS0+dmRpc3BsYXkgPQltb2RlbGluZS0+dmRpc3BsYXk7CisJcmVxLT52c3luY3N0YXJ0ID0JbW9kZWxpbmUtPnZzeW5jc3RhcnQ7CisJcmVxLT52c3luY2VuZCA9CW1vZGVsaW5lLT52c3luY2VuZDsKKwlyZXEtPnZ0b3RhbCA9CW1vZGVsaW5lLT52dG90YWw7CisJcmVxLT5mbGFncyA9CW1vZGVsaW5lLT5mbGFnczsKKwlpZiAocHJvdG9jb2xCdWcpIHsKKwkgICAgcmVxLT5wcml2c2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkgICAgcmVxLT5wcml2c2l6ZSA9CW1vZGVsaW5lLT5wcml2c2l6ZTsKKwkgICAgaWYgKG1vZGVsaW5lLT5wcml2c2l6ZSkgeworCQlyZXEtPmxlbmd0aCArPSBtb2RlbGluZS0+cHJpdnNpemU7CisJCURhdGEzMihkcHksIChsb25nICopIG1vZGVsaW5lLT5wcml2YXRlLAorCSAgICAgICAgICAgbW9kZWxpbmUtPnByaXZzaXplICogc2l6ZW9mKElOVDMyKSk7CisJICAgIH0KKwl9CisgICAgfQorICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIFRydWU7Cit9CisgICAgCitCb29sCitTRExfTkFNRShYRjg2VmlkTW9kZUxvY2tNb2RlU3dpdGNoKShkcHksIHNjcmVlbiwgbG9jaykKKyAgICBEaXNwbGF5KiBkcHk7CisgICAgaW50IHNjcmVlbjsKKyAgICBpbnQgbG9jazsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlTG9ja01vZGVTd2l0Y2hSZXEgKnJlcTsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NlZpZE1vZGVMb2NrTW9kZVN3aXRjaCwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZUxvY2tNb2RlU3dpdGNoOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+bG9jayA9IGxvY2s7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKyAgICAKK0Jvb2wKK1NETF9OQU1FKFhGODZWaWRNb2RlR2V0TW9uaXRvcikoZHB5LCBzY3JlZW4sIG1vbml0b3IpCisgICAgRGlzcGxheSogZHB5OworICAgIGludCBzY3JlZW47CisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb25pdG9yKSogbW9uaXRvcjsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlR2V0TW9uaXRvclJlcGx5IHJlcDsKKyAgICB4WEY4NlZpZE1vZGVHZXRNb25pdG9yUmVxICpyZXE7CisgICAgQ0FSRDMyIHN5bmNyYW5nZTsKKyAgICBpbnQgaTsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRNb25pdG9yLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlR2V0TW9uaXRvcjsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKyAgICBtb25pdG9yLT5uaHN5bmMgPSByZXAubmhzeW5jOworICAgIG1vbml0b3ItPm52c3luYyA9IHJlcC5udnN5bmM7CisjaWYgMAorICAgIG1vbml0b3ItPmJhbmR3aWR0aCA9IChmbG9hdClyZXAuYmFuZHdpZHRoIC8gMWU2OworI2VuZGlmCisgICAgaWYgKHJlcC52ZW5kb3JMZW5ndGgpIHsKKwlpZiAoIShtb25pdG9yLT52ZW5kb3IgPSAoY2hhciAqKVhjYWxsb2MocmVwLnZlbmRvckxlbmd0aCArIDEsIDEpKSkgeworCSAgICBfWEVhdERhdGEoZHB5LCAocmVwLm5oc3luYyArIHJlcC5udnN5bmMpICogNCArCisJCSAgICAgICgocmVwLnZlbmRvckxlbmd0aCszKSAmIH4zKSArICgocmVwLm1vZGVsTGVuZ3RoKzMpICYgfjMpKTsKKyAgICAgICAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICAgICAgICAgIFN5bmNIYW5kbGUoKTsKKwkgICAgcmV0dXJuIEZhbHNlOworCX0KKyAgICB9IGVsc2UgeworCW1vbml0b3ItPnZlbmRvciA9IE5VTEw7CisgICAgfQorICAgIGlmIChyZXAubW9kZWxMZW5ndGgpIHsKKwlpZiAoIShtb25pdG9yLT5tb2RlbCA9IFhjYWxsb2MocmVwLm1vZGVsTGVuZ3RoICsgMSwgMSkpKSB7CisJICAgIF9YRWF0RGF0YShkcHksIChyZXAubmhzeW5jICsgcmVwLm52c3luYykgKiA0ICsKKwkJICAgICAgKChyZXAudmVuZG9yTGVuZ3RoKzMpICYgfjMpICsgKChyZXAubW9kZWxMZW5ndGgrMykgJiB+MykpOworCSAgICBpZiAobW9uaXRvci0+dmVuZG9yKQorCQlYZnJlZShtb25pdG9yLT52ZW5kb3IpOworICAgICAgICAgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgICAgICAgICAgU3luY0hhbmRsZSgpOworCSAgICByZXR1cm4gRmFsc2U7CisJfQorICAgIH0gZWxzZSB7CisJbW9uaXRvci0+bW9kZWwgPSBOVUxMOworICAgIH0KKyAgICBpZiAoIShtb25pdG9yLT5oc3luYyA9IFhjYWxsb2MocmVwLm5oc3luYywgc2l6ZW9mKFNETF9OQU1FKFhGODZWaWRNb2RlU3luY1JhbmdlKSkpKSkgeworCV9YRWF0RGF0YShkcHksIChyZXAubmhzeW5jICsgcmVwLm52c3luYykgKiA0ICsKKwkJICAoKHJlcC52ZW5kb3JMZW5ndGgrMykgJiB+MykgKyAoKHJlcC5tb2RlbExlbmd0aCszKSAmIH4zKSk7CisJCisJaWYgKG1vbml0b3ItPnZlbmRvcikKKwkgICAgWGZyZWUobW9uaXRvci0+dmVuZG9yKTsKKwlpZiAobW9uaXRvci0+bW9kZWwpCisJICAgIFhmcmVlKG1vbml0b3ItPm1vZGVsKTsKKyAgICAgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgICAgICBTeW5jSGFuZGxlKCk7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKyAgICBpZiAoIShtb25pdG9yLT52c3luYyA9IFhjYWxsb2MocmVwLm52c3luYywgc2l6ZW9mKFNETF9OQU1FKFhGODZWaWRNb2RlU3luY1JhbmdlKSkpKSkgeworCV9YRWF0RGF0YShkcHksIChyZXAubmhzeW5jICsgcmVwLm52c3luYykgKiA0ICsKKwkJICAoKHJlcC52ZW5kb3JMZW5ndGgrMykgJiB+MykgKyAoKHJlcC5tb2RlbExlbmd0aCszKSAmIH4zKSk7CisJaWYgKG1vbml0b3ItPnZlbmRvcikKKwkgICAgWGZyZWUobW9uaXRvci0+dmVuZG9yKTsKKwlpZiAobW9uaXRvci0+bW9kZWwpCisJICAgIFhmcmVlKG1vbml0b3ItPm1vZGVsKTsKKwlYZnJlZShtb25pdG9yLT5oc3luYyk7CisgICAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICAgICAgU3luY0hhbmRsZSgpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHJlcC5uaHN5bmM7IGkrKykgeworCV9YUmVhZChkcHksIChjaGFyICopJnN5bmNyYW5nZSwgNCk7CisJbW9uaXRvci0+aHN5bmNbaV0ubG8gPSAoZmxvYXQpKHN5bmNyYW5nZSAmIDB4RkZGRikgLyAxMDAuMDsKKwltb25pdG9yLT5oc3luY1tpXS5oaSA9IChmbG9hdCkoc3luY3JhbmdlID4+IDE2KSAvIDEwMC4wOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVwLm52c3luYzsgaSsrKSB7CisJX1hSZWFkKGRweSwgKGNoYXIgKikmc3luY3JhbmdlLCA0KTsKKwltb25pdG9yLT52c3luY1tpXS5sbyA9IChmbG9hdCkoc3luY3JhbmdlICYgMHhGRkZGKSAvIDEwMC4wOworCW1vbml0b3ItPnZzeW5jW2ldLmhpID0gKGZsb2F0KShzeW5jcmFuZ2UgPj4gMTYpIC8gMTAwLjA7CisgICAgfQorICAgIGlmIChyZXAudmVuZG9yTGVuZ3RoKQorCV9YUmVhZFBhZChkcHksIG1vbml0b3ItPnZlbmRvciwgcmVwLnZlbmRvckxlbmd0aCk7CisgICAgZWxzZQorCW1vbml0b3ItPnZlbmRvciA9ICIiOworICAgIGlmIChyZXAubW9kZWxMZW5ndGgpCisJX1hSZWFkUGFkKGRweSwgbW9uaXRvci0+bW9kZWwsIHJlcC5tb2RlbExlbmd0aCk7CisgICAgZWxzZQorCW1vbml0b3ItPm1vZGVsID0gIiI7CisJCisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbAorU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRWaWV3UG9ydCkoZHB5LCBzY3JlZW4sIHgsIHkpCisgICAgRGlzcGxheSogZHB5OworICAgIGludCBzY3JlZW47CisgICAgaW50ICp4LCAqeTsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlR2V0Vmlld1BvcnRSZXBseSByZXA7CisgICAgeFhGODZWaWRNb2RlR2V0Vmlld1BvcnRSZXEgKnJlcTsKKyAgICBpbnQgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb247CisgICAgQm9vbCBwcm90b2NvbEJ1ZyA9IEZhbHNlOworCisgICAgWEY4NlZpZE1vZGVDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICAvKgorICAgICAqIE5vdGU6IFRoZXJlIHdhcyBhIGJ1ZyBpbiB0aGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gaW4gdmVyc2lvbnMKKyAgICAgKiAwLnggd2l0aCB4IDwgOCAobm8gcmVwbHkgd2FzIHNlbnQsIHNvIHRoZSBjbGllbnQgd291bGQgaGFuZykKKyAgICAgKiBDaGVjayB0aGUgc2VydmVyJ3MgdmVyc2lvbiwgYW5kIGRvbid0IHdhaXQgZm9yIGEgcmVwbHkgd2l0aCBvbGRlcgorICAgICAqIHZlcnNpb25zLgorICAgICAqLworCisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24pKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgaWYgKG1ham9yVmVyc2lvbiA9PSAwICYmIG1pbm9yVmVyc2lvbiA8IDgpIHsKKwlwcm90b2NvbEJ1ZyA9IFRydWU7CisjaWZkZWYgREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIlhGODZWaWRNb2RlR2V0Vmlld1BvcnQ6IFdhcm5pbmc6IFhzZXJ2ZXIgaXMiCisJCSJydW5uaW5nIGFuIG9sZCB2ZXJzaW9uICglZC4lZClcbiIsIG1ham9yVmVyc2lvbiwKKwkJbWlub3JWZXJzaW9uKTsKKyNlbmRpZgorICAgIH0KKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2VmlkTW9kZUdldFZpZXdQb3J0LCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlR2V0Vmlld1BvcnQ7CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgaWYgKHByb3RvY29sQnVnKSB7CisJKnggPSAwOworCSp5ID0gMDsKKyAgICB9IGVsc2UgeworCWlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7CisJICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKwkgICAgU3luY0hhbmRsZSgpOworCSAgICByZXR1cm4gRmFsc2U7CisJfQorCSp4ID0gcmVwLng7CisJKnkgPSByZXAueTsKKyAgICB9CisKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sCitTRExfTkFNRShYRjg2VmlkTW9kZVNldFZpZXdQb3J0KShkcHksIHNjcmVlbiwgeCwgeSkKKyAgICBEaXNwbGF5KiBkcHk7CisgICAgaW50IHNjcmVlbjsKKyAgICBpbnQgeCwgeTsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlU2V0Vmlld1BvcnRSZXEgKnJlcTsKKworICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NlZpZE1vZGVTZXRWaWV3UG9ydCwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZVNldFZpZXdQb3J0OworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+eCA9IHg7CisgICAgcmVxLT55ID0geTsKKworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wKK1NETF9OQU1FKFhGODZWaWRNb2RlR2V0RG90Q2xvY2tzKShkcHksIHNjcmVlbiwKKwkgICAgZmxhZ3NQdHIsIG51bWNsb2Nrc1B0ciwgbWF4Y2xvY2tzUHRyLCBjbG9ja3NQdHIpCisgICAgRGlzcGxheSogZHB5OworICAgIGludCBzY3JlZW47CisgICAgaW50ICpmbGFnc1B0ciwgKm51bWNsb2Nrc1B0ciwgKm1heGNsb2Nrc1B0ciwgKmNsb2Nrc1B0cltdOyAKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlR2V0RG90Q2xvY2tzUmVwbHkgcmVwOworICAgIHhYRjg2VmlkTW9kZUdldERvdENsb2Nrc1JlcSAqcmVxOworICAgIGludCBpLCAqZG90Y2xvY2tzOworICAgIENBUkQzMiBkb3RjbGs7CisKKyAgICBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhGODZWaWRNb2RlR2V0RG90Q2xvY2tzLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT54Zjg2dmlkbW9kZVJlcVR5cGUgPSBYX1hGODZWaWRNb2RlR2V0RG90Q2xvY2tzOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAKKyAgICAgICAgKFNJWkVPRih4WEY4NlZpZE1vZGVHZXREb3RDbG9ja3NSZXBseSkgLSBTSVpFT0YoeFJlcGx5KSkgPj4gMiwgeEZhbHNlKSkKKyAgICB7CisgICAgICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICAgICAgU3luY0hhbmRsZSgpOworICAgICAgICByZXR1cm4gRmFsc2U7CisgICAgfQorICAgICpudW1jbG9ja3NQdHIgPSByZXAuY2xvY2tzOworICAgICptYXhjbG9ja3NQdHIgPSByZXAubWF4Y2xvY2tzOworICAgICpmbGFnc1B0ciAgICAgPSByZXAuZmxhZ3M7CisKKyAgICBpZiAoIShkb3RjbG9ja3MgPSAoaW50KikgWGNhbGxvYyhyZXAuY2xvY2tzLCBzaXplb2YoaW50KSkpKSB7CisgICAgICAgIF9YRWF0RGF0YShkcHksIChyZXAuY2xvY2tzKSAqIDQpOworICAgICAgICBYZnJlZShkb3RjbG9ja3MpOworICAgICAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgICAgIFN5bmNIYW5kbGUoKTsKKyAgICAgICAgcmV0dXJuIEZhbHNlOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCByZXAuY2xvY2tzOyBpKyspIHsKKyAgICAgICAgX1hSZWFkKGRweSwgKGNoYXIqKSZkb3RjbGssIDQpOworCWRvdGNsb2Nrc1tpXSA9IGRvdGNsazsKKyAgICB9CisgICAgKmNsb2Nrc1B0ciA9IGRvdGNsb2NrczsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sCitTRExfTkFNRShYRjg2VmlkTW9kZVNldEdhbW1hUmFtcCkgKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBpbnQgc2NyZWVuLAorICAgIGludCBzaXplLAorICAgIHVuc2lnbmVkIHNob3J0ICpyZWQsCisgICAgdW5zaWduZWQgc2hvcnQgKmdyZWVuLAorICAgIHVuc2lnbmVkIHNob3J0ICpibHVlCispCit7CisgICAgaW50IGxlbmd0aCA9IChzaXplICsgMSkgJiB+MTsKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CisgICAgeFhGODZWaWRNb2RlU2V0R2FtbWFSYW1wUmVxICpyZXE7CisKKyAgICBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2VmlkTW9kZVNldEdhbW1hUmFtcCwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZVNldEdhbW1hUmFtcDsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPmxlbmd0aCArPSAobGVuZ3RoID4+IDEpICogMzsKKyAgICByZXEtPnNpemUgPSBzaXplOworICAgIF9YU2VuZChkcHksIChjaGFyKilyZWQsIHNpemUgKiAyKTsKKyAgICBfWFNlbmQoZHB5LCAoY2hhciopZ3JlZW4sIHNpemUgKiAyKTsKKyAgICBfWFNlbmQoZHB5LCAoY2hhciopYmx1ZSwgc2l6ZSAqIDIpOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIFRydWU7Cit9CisKKworQm9vbAorU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRHYW1tYVJhbXApICgKKyAgICBEaXNwbGF5ICpkcHksCisgICAgaW50IHNjcmVlbiwKKyAgICBpbnQgc2l6ZSwKKyAgICB1bnNpZ25lZCBzaG9ydCAqcmVkLAorICAgIHVuc2lnbmVkIHNob3J0ICpncmVlbiwKKyAgICB1bnNpZ25lZCBzaG9ydCAqYmx1ZQorKQoreworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKKyAgICB4WEY4NlZpZE1vZGVHZXRHYW1tYVJhbXBSZXEgKnJlcTsKKyAgICB4WEY4NlZpZE1vZGVHZXRHYW1tYVJhbXBSZXBseSByZXA7CisgIAorICAgIFhGODZWaWRNb2RlQ2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NlZpZE1vZGVHZXRHYW1tYVJhbXAsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPnhmODZ2aWRtb2RlUmVxVHlwZSA9IFhfWEY4NlZpZE1vZGVHZXRHYW1tYVJhbXA7CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgcmVxLT5zaXplID0gc2l6ZTsKKyAgICBpZiAoIV9YUmVwbHkgKGRweSwgKHhSZXBseSAqKSAmcmVwLCAwLCB4RmFsc2UpKSB7CisgICAgICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7CisgICAgICAgIFN5bmNIYW5kbGUgKCk7CisgICAgICAgIHJldHVybiBGYWxzZTsKKyAgICB9CisgICAgaWYocmVwLnNpemUpIHsKKwlfWFJlYWQoZHB5LCAoY2hhciopcmVkLCByZXAuc2l6ZSA8PCAxKTsKKwlfWFJlYWQoZHB5LCAoY2hhciopZ3JlZW4sIHJlcC5zaXplIDw8IDEpOworCV9YUmVhZChkcHksIChjaGFyKilibHVlLCByZXAuc2l6ZSA8PCAxKTsKKyAgICB9CisKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sIFNETF9OQU1FKFhGODZWaWRNb2RlR2V0R2FtbWFSYW1wU2l6ZSkoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCBzY3JlZW4sCisgICAgaW50ICpzaXplCispCit7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gZmluZF9kaXNwbGF5IChkcHkpOworICAgIHhYRjg2VmlkTW9kZUdldEdhbW1hUmFtcFNpemVSZXEgKnJlcTsKKyAgICB4WEY4NlZpZE1vZGVHZXRHYW1tYVJhbXBTaXplUmVwbHkgcmVwOworICAKKyAgICAqc2l6ZSA9IDA7CisKKyAgICBYRjg2VmlkTW9kZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhGODZWaWRNb2RlR2V0R2FtbWFSYW1wU2l6ZSwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+eGY4NnZpZG1vZGVSZXFUeXBlID0gWF9YRjg2VmlkTW9kZUdldEdhbW1hUmFtcFNpemU7CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgaWYgKCFfWFJlcGx5IChkcHksICh4UmVwbHkgKikgJnJlcCwgMCwgeFRydWUpKSB7CisgICAgICAgIFVubG9ja0Rpc3BsYXkgKGRweSk7CisgICAgICAgIFN5bmNIYW5kbGUgKCk7CisgICAgICAgIHJldHVybiBGYWxzZTsgCisgICAgfQorICAgICpzaXplID0gcmVwLnNpemU7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvWGV4dC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvWGV4dC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy9YZXh0LmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL1hleHQuaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvWGluZXJhbWEuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL1hpbmVyYW1hLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL1hpbmVyYW1hLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL1hpbmVyYW1hLmgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL1h2LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy9Ydi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy9Ydi5oCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy9Ydi5oCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy9YdmxpYi5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvWHZsaWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvWHZsaWIuaApyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvWHZsaWIuaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvWHZwcm90by5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvWHZwcm90by5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy9YdnByb3RvLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL1h2cHJvdG8uaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvZXh0dXRpbC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvZXh0dXRpbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy9leHR1dGlsLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL2V4dHV0aWwuaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvcGFub3JhbWlYZXh0LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy9wYW5vcmFtaVhleHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvcGFub3JhbWlYZXh0LmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3Bhbm9yYW1pWGV4dC5oCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy9wYW5vcmFtaVhwcm90by5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvcGFub3JhbWlYcHJvdG8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvcGFub3JhbWlYcHJvdG8uaApyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMvcGFub3JhbWlYcHJvdG8uaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMveGY4NmRnYS5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMveGY4NmRnYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94Zjg2ZGdhLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3hmODZkZ2EuaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMveGY4NmRnYTEuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3hmODZkZ2ExLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3hmODZkZ2ExLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3hmODZkZ2ExLmgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3hmODZkZ2Exc3RyLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94Zjg2ZGdhMXN0ci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94Zjg2ZGdhMXN0ci5oCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94Zjg2ZGdhMXN0ci5oCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94Zjg2ZGdhc3RyLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94Zjg2ZGdhc3RyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3hmODZkZ2FzdHIuaApyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMveGY4NmRnYXN0ci5oCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94Zjg2dm1vZGUuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3hmODZ2bW9kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94Zjg2dm1vZGUuaApyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMveGY4NnZtb2RlLmgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3hmODZ2bXN0ci5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMveGY4NnZtc3RyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3hmODZ2bXN0ci5oCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94Zjg2dm1zdHIuaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMveG1lLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL1hleHQvZXh0ZW5zaW9ucy94bWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9YZXh0L2V4dGVuc2lvbnMveG1lLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vWGV4dC9leHRlbnNpb25zL3htZS5oCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2FhbGliL1NETF9hYWV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hYWxpYi9TRExfYWFldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZhYjJkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hYWxpYi9TRExfYWFldmVudHMuYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEhhbmRsZSB0aGUgZXZlbnQgc3RyZWFtLCBjb252ZXJ0aW5nIEFBIGV2ZW50cyBpbnRvIFNETCBldmVudHMgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhYWxpYi5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX2FhdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfYWFldmVudHNfYy5oIgorCisvKiBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBjb25zb2xlIHNjYW5jb2RlIHRvIGEgU0RMIGtleXN5bSAqLworc3RhdGljIFNETEtleSBrZXltYXBbNDAxXTsKKworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSk7CisKKwordm9pZCBBQV9QdW1wRXZlbnRzKF9USElTKQoreworCWludCBwb3N0ZWQgPSAwOworCWludCBtb3VzZV9idXR0b24sIG1vdXNlX3gsIG1vdXNlX3k7CisJaW50IGV2dDsKKwlTRExfa2V5c3ltIGtleXN5bTsKKworCXN0YXRpYyBpbnQgcHJldl9idXR0b24gPSAtMSwgcHJldl94ID0gLTEsIHByZXZfeSA9IC0xOworCisJaWYoICEgdGhpcy0+c2NyZWVuICkgLyogV2FpdCB0aWxsIHdlIGdvdCB0aGUgc2NyZWVuIGluaXRpYWxpemVkICovCisJICByZXR1cm47CisKKwlkbyB7CisJCXBvc3RlZCA9IDA7CisJCS8qIEdhdGhlciBldmVudHMgKi8KKworCQkvKiBHZXQgbW91c2Ugc3RhdHVzICovCisJCVNETF9tdXRleFAoQUFfbXV0ZXgpOworCQlhYV9nZXRtb3VzZSAoQUFfY29udGV4dCwgJm1vdXNlX3gsICZtb3VzZV95LCAmbW91c2VfYnV0dG9uKTsKKwkJU0RMX211dGV4VihBQV9tdXRleCk7CisJCW1vdXNlX3ggPSBtb3VzZV94ICogdGhpcy0+c2NyZWVuLT53IC8gYWFfc2Nyd2lkdGggKEFBX2NvbnRleHQpOworCQltb3VzZV95ID0gbW91c2VfeSAqIHRoaXMtPnNjcmVlbi0+aCAvIGFhX3NjcmhlaWdodCAoQUFfY29udGV4dCk7CisKKwkJLyogQ29tcGFyZSBhZ2FpbnN0IHByZXZpb3VzIHN0YXRlIGFuZCBnZW5lcmF0ZSBldmVudHMgKi8KKwkJaWYoIHByZXZfYnV0dG9uICE9IG1vdXNlX2J1dHRvbiApIHsKKwkJCWlmKCBtb3VzZV9idXR0b24gJiBBQV9CVVRUT04xICkgeworCQkJCWlmICggISAocHJldl9idXR0b24gJiBBQV9CVVRUT04xKSApIHsKKwkJCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIDEsIDAsIDApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCBwcmV2X2J1dHRvbiAmIEFBX0JVVFRPTjEgKSB7CisJCQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgMSwgMCwgMCk7CisJCQkJfQorCQkJfQorCQkJaWYoIG1vdXNlX2J1dHRvbiAmIEFBX0JVVFRPTjIgKSB7CisJCQkJaWYgKCAhIChwcmV2X2J1dHRvbiAmIEFBX0JVVFRPTjIpICkgeworCQkJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgMiwgMCwgMCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIHByZXZfYnV0dG9uICYgQUFfQlVUVE9OMiApIHsKKwkJCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCAyLCAwLCAwKTsKKwkJCQl9CisJCQl9CisJCQlpZiggbW91c2VfYnV0dG9uICYgQUFfQlVUVE9OMyApIHsKKwkJCQlpZiAoICEgKHByZXZfYnV0dG9uICYgQUFfQlVUVE9OMykgKSB7CisJCQkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCAzLCAwLCAwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICggcHJldl9idXR0b24gJiBBQV9CVVRUT04zICkgeworCQkJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIDMsIDAsIDApOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIHByZXZfeCAhPSBtb3VzZV94IHx8IHByZXZfeSAhPSBtb3VzZV95ICkgeworCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgbW91c2VfeCwgbW91c2VfeSk7CisJCX0KKworCQlwcmV2X2J1dHRvbiA9IG1vdXNlX2J1dHRvbjsKKwkJcHJldl94ID0gbW91c2VfeDsgcHJldl95ID0gbW91c2VfeTsKKworCQkvKiBHZXQga2V5Ym9hcmQgZXZlbnQgKi8KKwkJU0RMX211dGV4UChBQV9tdXRleCk7CisJCWV2dCA9IGFhX2dldGV2ZW50KEFBX2NvbnRleHQsIDApOworCQlTRExfbXV0ZXhWKEFBX211dGV4KTsKKwkJaWYgKCAoZXZ0ID4gQUFfTk9ORSkgJiYgKGV2dCA8IEFBX1JFTEVBU0UpICYmIChldnQgIT0gQUFfTU9VU0UpICYmIChldnQgIT0gQUFfUkVTSVpFKSApIHsKKwkJCS8qIEtleSBwcmVzc2VkICovCisvKiAgICAJCQlwcmludGYoIktleSBwcmVzc2VkOiAlZCAoJWMpXG4iLCBldnQsIGV2dCk7ICovCisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgVHJhbnNsYXRlS2V5KGV2dCwgJmtleXN5bSkpOworCQl9IGVsc2UgaWYgKCBldnQgPj0gQUFfUkVMRUFTRSApIHsKKwkJCS8qIEtleSByZWxlYXNlZCAqLworCQkJZXZ0ICY9IH5BQV9SRUxFQVNFOworLyogIAkJCXByaW50ZigiS2V5IHJlbGVhc2VkOiAlZCAoJWMpXG4iLCBldnQsIGV2dCk7ICovCisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsIFRyYW5zbGF0ZUtleShldnQsICZrZXlzeW0pKTsKKwkJfQorCX0gd2hpbGUgKCBwb3N0ZWQgKTsKK30KKwordm9pZCBBQV9Jbml0T1NLZXltYXAoX1RISVMpCit7CisJaW50IGk7CisJc3RhdGljIGNvbnN0IGNoYXIgKnN0ZF9rZXlzID0gIiAwMTIzNDU2Nzg5MCYjJygpXy18JCorLT0vXFw6Oy4sIT88Pnt9W11AfiVeXHg5IjsKKwljb25zdCBjaGFyICpzdGQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBBQWxpYiBrZXkgdHJhbnNsYXRpb24gdGFibGUgKi8KKwlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShrZXltYXApOyArK2kgKQorCQlrZXltYXBbaV0gPSBTRExLX1VOS05PV047CisKKwkvKiBBbHBoYWJldCBrZXlzICovCisJZm9yICggaSA9IDA7IGk8MjY7ICsraSApeworCQlrZXltYXBbJ2EnICsgaV0gPSBTRExLX2EraTsKKwkJa2V5bWFwWydBJyArIGldID0gU0RMS19hK2k7CisJfQorCS8qIEZ1bmN0aW9uIGtleXMgKi8KKwlmb3IgKCBpID0gMDsgaTwxMjsgKytpICl7CisJCWtleW1hcFszMzQgKyBpXSA9IFNETEtfRjEraTsKKwl9CisJLyogS2V5cyB0aGF0IGhhdmUgdGhlIHNhbWUgc3ltYm9scyBhbmQgZG9uJ3QgaGF2ZSB0byBiZSB0cmFuc2xhdGVkICovCisJZm9yKCBzdGQgPSBzdGRfa2V5czsgKnN0ZDsgc3RkICsrICkgeworCQlrZXltYXBbKnN0ZF0gPSAqc3RkOworCX0KKworCWtleW1hcFsxM10gPSBTRExLX1JFVFVSTjsKKwlrZXltYXBbQUFfQkFDS1NQQUNFXSA9IFNETEtfQkFDS1NQQUNFOworCisJa2V5bWFwWzM2OV0gPSBTRExLX0xTSElGVDsKKwlrZXltYXBbMzcwXSA9IFNETEtfUlNISUZUOworCWtleW1hcFszNzFdID0gU0RMS19MQ1RSTDsKKwlrZXltYXBbMzcyXSA9IFNETEtfUkNUUkw7CisJa2V5bWFwWzM3N10gPSBTRExLX0xBTFQ7CisJa2V5bWFwWzI3MF0gPSBTRExLX1JBTFQ7CisJa2V5bWFwWzI3MV0gPSBTRExLX05VTUxPQ0s7CisJa2V5bWFwWzM3M10gPSBTRExLX0NBUFNMT0NLOworCWtleW1hcFsxNjRdID0gU0RMS19TQ1JPTExPQ0s7CisKKwlrZXltYXBbMjQzXSA9IFNETEtfSU5TRVJUOworCWtleW1hcFszMDRdID0gU0RMS19ERUxFVEU7CisJa2V5bWFwWzIyNF0gPSBTRExLX0hPTUU7CisJa2V5bWFwWzIzMV0gPSBTRExLX0VORDsKKwlrZXltYXBbMjI5XSA9IFNETEtfUEFHRVVQOworCWtleW1hcFsyMzBdID0gU0RMS19QQUdFRE9XTjsKKworCWtleW1hcFsyNDFdID0gU0RMS19QUklOVDsKKwlrZXltYXBbMTYzXSA9IFNETEtfQlJFQUs7CisKKwlrZXltYXBbMzAyXSA9IFNETEtfS1AwOworCWtleW1hcFszMDBdID0gU0RMS19LUDE7CisJa2V5bWFwWzI5N10gPSBTRExLX0tQMjsKKwlrZXltYXBbMjk5XSA9IFNETEtfS1AzOworCWtleW1hcFsyOTRdID0gU0RMS19LUDQ7CisJa2V5bWFwWzMwMV0gPSBTRExLX0tQNTsKKwlrZXltYXBbMjk2XSA9IFNETEtfS1A2OworCWtleW1hcFsyOTNdID0gU0RMS19LUDc7CisJa2V5bWFwWzI5NV0gPSBTRExLX0tQODsKKwlrZXltYXBbMjk4XSA9IFNETEtfS1A5OworCisJa2V5bWFwW0FBX0VTQ10gPSBTRExLX0VTQ0FQRTsKKwlrZXltYXBbQUFfVVBdID0gU0RMS19VUDsKKwlrZXltYXBbQUFfRE9XTl0gPSBTRExLX0RPV047CisJa2V5bWFwW0FBX0xFRlRdID0gU0RMS19MRUZUOworCWtleW1hcFtBQV9SSUdIVF0gPSBTRExLX1JJR0hUOworfQorCitzdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQoreworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggc2NhbmNvZGUgPj0gU0RMX2FycmF5c2l6ZShrZXltYXApICkKKwkJc2NhbmNvZGUgPSBBQV9VTktOT1dOOworCisJLyogU2V0IHRoZSBrZXlzeW0gaW5mb3JtYXRpb24gKi8KKwlrZXlzeW0tPnNjYW5jb2RlID0gc2NhbmNvZGU7CisJa2V5c3ltLT5zeW0gPSBrZXltYXBbc2NhbmNvZGVdOworCWtleXN5bS0+bW9kID0gS01PRF9OT05FOworCisJLyogSWYgVU5JQ09ERSBpcyBvbiwgZ2V0IHRoZSBVTklDT0RFIHZhbHVlIGZvciB0aGUga2V5ICovCisJa2V5c3ltLT51bmljb2RlID0gMDsKKwlpZiAoIFNETF9UcmFuc2xhdGVVTklDT0RFICkgeworCQkvKiBQb3B1bGF0ZSB0aGUgdW5pY29kZSBmaWVsZCB3aXRoIHRoZSBBU0NJSSB2YWx1ZSAqLworCQlrZXlzeW0tPnVuaWNvZGUgPSBzY2FuY29kZTsKKwl9CisJcmV0dXJuKGtleXN5bSk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2FhbGliL1NETF9hYWV2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2FhbGliL1NETF9hYWV2ZW50c19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiYzlmNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhZXZlbnRzX2MuaApAQCAtMCwwICsxLDM1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9hYXZpZGVvLmgiCisKKy8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFNETF9zeXNldmVudHMuYyB0byBvdGhlciBwYXJ0cyAKKyAgIG9mIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIChTRExfc3lzdmlkZW8uYykKKyovCitleHRlcm4gdm9pZCBBQV9pbml0a2V5bWFwcyhpbnQgZmQpOworZXh0ZXJuIHZvaWQgQUFfbW91c2VjYWxsYmFjayhpbnQgYnV0dG9uLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1MSxpbnQgdTIsaW50IHUzLCBpbnQgdTQpOworZXh0ZXJuIHZvaWQgQUFfa2V5Ym9hcmRjYWxsYmFjayhpbnQgc2NhbmNvZGUsIGludCBwcmVzc2VkKTsKKworZXh0ZXJuIHZvaWQgQUFfSW5pdE9TS2V5bWFwKF9USElTKTsKK2V4dGVybiB2b2lkIEFBX1B1bXBFdmVudHMoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hYWxpYi9TRExfYWFtb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hYWxpYi9TRExfYWFtb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzg0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2FhbGliL1NETF9hYW1vdXNlLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX2FhbW91c2VfYy5oIgorCisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLworc3RydWN0IFdNY3Vyc29yIHsKKwlpbnQgdW51c2VkOworfTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hYWxpYi9TRExfYWFtb3VzZV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlM2Q5OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhbW91c2VfYy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX2FhdmlkZW8uaCIKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2FhbGliL1NETF9hYXZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2FhbGliL1NETF9hYXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkNWQzZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhdmlkZW8uYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEFBbGliIGJhc2VkIFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb24uCisqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX2FhdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfYWFldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9hYW1vdXNlX2MuaCIKKworI2luY2x1ZGUgPGFhbGliLmg+CisKKy8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBBQV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipBQV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworc3RhdGljIFNETF9TdXJmYWNlICpBQV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgaW50IEFBX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBBQV9WaWRlb1F1aXQoX1RISVMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBBQV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBBQV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IEFBX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIEFBX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgQUFfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKiBDYWNoZSB0aGUgVmlkZW9EZXZpY2Ugc3RydWN0ICovCitzdGF0aWMgc3RydWN0IFNETF9WaWRlb0RldmljZSAqbG9jYWxfdGhpczsKKworLyogQUFsaWIgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBBQV9BdmFpbGFibGUodm9pZCkKK3sKKwlyZXR1cm4gMTsgLyogQWx3YXlzIGF2YWlsYWJsZSAhICovCit9CisKK3N0YXRpYyB2b2lkIEFBX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqQUFfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggZGV2aWNlICkgeworCQkJU0RMX2ZyZWUoZGV2aWNlKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBBQV9WaWRlb0luaXQ7CisJZGV2aWNlLT5MaXN0TW9kZXMgPSBBQV9MaXN0TW9kZXM7CisJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBBQV9TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5DcmVhdGVZVVZPdmVybGF5ID0gTlVMTDsKKwlkZXZpY2UtPlNldENvbG9ycyA9IEFBX1NldENvbG9yczsKKwlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IEFBX1ZpZGVvUXVpdDsKKwlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gQUFfQWxsb2NIV1N1cmZhY2U7CisJZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7CisJZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOworCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7CisJZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gQUFfTG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IEFBX1VubG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOworCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IEFBX0ZyZWVIV1N1cmZhY2U7CisJZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKKwlkZXZpY2UtPlNldEljb24gPSBOVUxMOworCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7CisJZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOworCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKKwlkZXZpY2UtPkluaXRPU0tleW1hcCA9IEFBX0luaXRPU0tleW1hcDsKKwlkZXZpY2UtPlB1bXBFdmVudHMgPSBBQV9QdW1wRXZlbnRzOworCisJZGV2aWNlLT5mcmVlID0gQUFfRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIGRldmljZTsKK30KKworVmlkZW9Cb290U3RyYXAgQUFMSUJfYm9vdHN0cmFwID0geworCSJhYWxpYiIsICJBU0NJSSBBcnQgTGlicmFyeSIsCisJQUFfQXZhaWxhYmxlLCBBQV9DcmVhdGVEZXZpY2UKK307CisKK3N0YXRpYyB2b2lkIEFBX1Jlc2l6ZUhhbmRsZXIoYWFfY29udGV4dCAqKTsKKworaW50IEFBX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQoreworCWludCBrZXlib2FyZDsKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZm9yICggaT0wOyBpPFNETF9OVU1NT0RFUzsgKytpICkgeworCQlTRExfbW9kZWxpc3RbaV0gPSBTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpOworCQlTRExfbW9kZWxpc3RbaV0tPnggPSBTRExfbW9kZWxpc3RbaV0tPnkgPSAwOworCX0KKwkvKiBNb2RlcyBzb3J0ZWQgbGFyZ2VzdCB0byBzbWFsbGVzdCAqLworCVNETF9tb2RlbGlzdFswXS0+dyA9IDEwMjQ7IFNETF9tb2RlbGlzdFswXS0+aCA9IDc2ODsKKwlTRExfbW9kZWxpc3RbMV0tPncgPSA4MDA7IFNETF9tb2RlbGlzdFsxXS0+aCA9IDYwMDsKKwlTRExfbW9kZWxpc3RbMl0tPncgPSA2NDA7IFNETF9tb2RlbGlzdFsyXS0+aCA9IDQ4MDsKKwlTRExfbW9kZWxpc3RbM10tPncgPSAzMjA7IFNETF9tb2RlbGlzdFszXS0+aCA9IDQwMDsKKwlTRExfbW9kZWxpc3RbNF0tPncgPSAzMjA7IFNETF9tb2RlbGlzdFs0XS0+aCA9IDI0MDsKKwlTRExfbW9kZWxpc3RbNV0tPncgPSAzMjA7IFNETF9tb2RlbGlzdFs1XS0+aCA9IDIwMDsKKwlTRExfbW9kZWxpc3RbNl0gPSBOVUxMOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSAqLworCisJQUFfbXV0ZXggPSBTRExfQ3JlYXRlTXV0ZXgoKTsKKworCWFhX3BhcnNlb3B0aW9ucyAoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKwlBQV9jb250ZXh0ID0gYWFfYXV0b2luaXQoJmFhX2RlZnBhcmFtcyk7CisJaWYgKCAhIEFBX2NvbnRleHQgKSB7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUgQUFsaWIiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBFbmFibGUgbW91c2UgYW5kIGtleWJvYXJkIHN1cHBvcnQgKi8KKworCWlmICggISBhYV9hdXRvaW5pdGtiZCAoQUFfY29udGV4dCwgQUFfU0VORFJFTEVBU0UpICkgeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBpbml0aWFsaXplIEFBbGliIGtleWJvYXJkIik7CisJCXJldHVybigtMSk7CisJfQorCWlmICggISBhYV9hdXRvaW5pdG1vdXNlIChBQV9jb250ZXh0LCBBQV9TRU5EUkVMRUFTRSkgKSB7CisJCWZwcmludGYoc3RkZXJyLCJXYXJuaW5nOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBBQWxpYiBtb3VzZSIpOworCX0KKwlBQV9ycGFyYW1zID0gYWFfZ2V0cmVuZGVycGFyYW1zKCk7CisKKwlsb2NhbF90aGlzID0gdGhpczsKKworCWFhX3Jlc2l6ZWhhbmRsZXIoQUFfY29udGV4dCwgQUFfUmVzaXplSGFuZGxlcik7CisKKwlmcHJpbnRmKHN0ZGVyciwiVXNpbmcgQUFsaWIgZHJpdmVyOiAlcyAoJXMpXG4iLCBBQV9jb250ZXh0LT5kcml2ZXItPm5hbWUsIEFBX2NvbnRleHQtPmRyaXZlci0+c2hvcnRuYW1lKTsKKworCUFBX2luX3gxMSA9IChTRExfc3RyY21wKEFBX2NvbnRleHQtPmRyaXZlci0+c2hvcnRuYW1lLCJYMTEiKSA9PSAwKTsKKwkvKiBEZXRlcm1pbmUgdGhlIHNjcmVlbiBkZXB0aCAodXNlIGRlZmF1bHQgOC1iaXQgZGVwdGgpICovCisJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gODsKKwl2Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gMTsKKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKDApOworfQorCitTRExfUmVjdCAqKkFBX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKyAgICAgaWYoZm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gOCkKKyAJCXJldHVybiBOVUxMOworCisJIGlmICggZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKKwkJIHJldHVybiBTRExfbW9kZWxpc3Q7CisJIH0gZWxzZSB7CisJCSByZXR1cm4gKFNETF9SZWN0ICoqKSAtMTsKKwkgfQorfQorCisvKiBGcm9tIGFhdmdhLmMKKyAgIEFBbGliIGRvZXMgbm90IGdpdmUgdXMgdGhlIGNob2ljZSBvZiB0aGUgYWN0dWFsIHJlc29sdXRpb24sIHRodXMgd2UgaGF2ZSB0byBzaW11bGF0ZSBhZGRpdGlvbmFsCisgICByZXNvbHV0aW9uIGJ5IHNjYWxpbmcgZG93biBtYW51YWxseSBlYWNoIGZyYW1lCisqLworc3RhdGljIHZvaWQgZmFzdHNjYWxlIChyZWdpc3RlciBjaGFyICpiMSwgcmVnaXN0ZXIgY2hhciAqYjIsIGludCB4MSwgaW50IHgyLCBpbnQgeTEsIGludCB5MikKK3sKKwlyZWdpc3RlciBpbnQgZXgsIHNweCA9IDAsIGRkeCwgZGR4MTsKKwlpbnQgZGR5MSwgZGR5LCBzcHkgPSAwLCBleTsKKwlpbnQgeDsKKwljaGFyICpiYjEgPSBiMTsKKwlpZiAoIXgxIHx8ICF4MiB8fCAheTEgfHwgIXkyKQorCQlyZXR1cm47CisJZGR4ID0geDEgKyB4MTsKKwlkZHgxID0geDIgKyB4MjsKKwlpZiAoZGR4MSA8IGRkeCkKKwkJc3B4ID0gZGR4IC8gZGR4MSwgZGR4ICU9IGRkeDE7CisJZGR5ID0geTEgKyB5MTsKKwlkZHkxID0geTIgKyB5MjsKKwlpZiAoZGR5MSA8IGRkeSkKKwkJc3B5ID0gKGRkeSAvIGRkeTEpICogeDEsIGRkeSAlPSBkZHkxOworCWV5ID0gLWRkeTE7CisJZm9yICg7IHkyOyB5Mi0tKSB7CisJCWV4ID0gLWRkeDE7CisJCWZvciAoeCA9IHgyOyB4OyB4LS0pIHsKKwkJCSpiMiA9ICpiMTsKKwkJCWIyKys7CisJCQliMSArPSBzcHg7CisJCQlleCArPSBkZHg7CisJCQlpZiAoZXggPiAwKSB7CisJCQkJYjErKzsKKwkJCQlleCAtPSBkZHgxOworCQkJfQorCQl9CisJCWJiMSArPSBzcHk7CisJCWV5ICs9IGRkeTsKKwkJaWYgKGV5ID4gMCkgeworCQkJYmIxICs9IHgxOworCQkJZXkgLT0gZGR5MTsKKwkJfQorCQliMSA9IGJiMTsKKwl9Cit9CisKKy8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCitzdGF0aWMgdm9pZCBBQV9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKKworU0RMX1N1cmZhY2UgKkFBX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisJaW50IG1vZGU7CisKKwlpZiAoIEFBX2J1ZmZlciApIHsKKwkJU0RMX2ZyZWUoIEFBX2J1ZmZlciApOworCX0KKworCUFBX2J1ZmZlciA9IFNETF9tYWxsb2Mod2lkdGggKiBoZWlnaHQpOworCWlmICggISBBQV9idWZmZXIgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgYnVmZmVyIGZvciByZXF1ZXN0ZWQgbW9kZSIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisvKiAJcHJpbnRmKCJTZXR0aW5nIG1vZGUgJWR4JWRcbiIsIHdpZHRoLCBoZWlnaHQpOyAqLworCisJU0RMX21lbXNldChhYV9pbWFnZShBQV9jb250ZXh0KSwgMCwgYWFfaW1nd2lkdGgoQUFfY29udGV4dCkgKiBhYV9pbWdoZWlnaHQoQUFfY29udGV4dCkpOworCVNETF9tZW1zZXQoQUFfYnVmZmVyLCAwLCB3aWR0aCAqIGhlaWdodCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgdGhlIHNjcmVlbiAqLworCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCA4LCAwLCAwLCAwLCAwKSApIHsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KKwljdXJyZW50LT5mbGFncyA9IFNETF9GVUxMU0NSRUVOOworCUFBX3cgPSBjdXJyZW50LT53ID0gd2lkdGg7CisJQUFfaCA9IGN1cnJlbnQtPmggPSBoZWlnaHQ7CisJY3VycmVudC0+cGl0Y2ggPSBjdXJyZW50LT53OworCWN1cnJlbnQtPnBpeGVscyA9IEFBX2J1ZmZlcjsKKworCUFBX3hfcmF0aW8gPSAoKGRvdWJsZSlhYV9pbWd3aWR0aChBQV9jb250ZXh0KSkgLyAoKGRvdWJsZSl3aWR0aCk7CisJQUFfeV9yYXRpbyA9ICgoZG91YmxlKWFhX2ltZ2hlaWdodChBQV9jb250ZXh0KSkgLyAoKGRvdWJsZSloZWlnaHQpOworCisJLyogU2V0IHRoZSBibGl0IGZ1bmN0aW9uICovCisJdGhpcy0+VXBkYXRlUmVjdHMgPSBBQV9EaXJlY3RVcGRhdGU7CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCitzdGF0aWMgdm9pZCBBQV9SZXNpemVIYW5kbGVyKGFhX2NvbnRleHQgKmNvbnRleHQpCit7CisJYWFfcmVzaXplKGNvbnRleHQpOworCWxvY2FsX3RoaXMtPmhpZGRlbi0+eF9yYXRpbyA9ICgoZG91YmxlKWFhX2ltZ3dpZHRoKGNvbnRleHQpKSAvICgoZG91YmxlKWxvY2FsX3RoaXMtPnNjcmVlbi0+dyk7CisJbG9jYWxfdGhpcy0+aGlkZGVuLT55X3JhdGlvID0gKChkb3VibGUpYWFfaW1naGVpZ2h0KGNvbnRleHQpKSAvICgoZG91YmxlKWxvY2FsX3RoaXMtPnNjcmVlbi0+aCk7CisKKwlmYXN0c2NhbGUgKGxvY2FsX3RoaXMtPmhpZGRlbi0+YnVmZmVyLCBhYV9pbWFnZShjb250ZXh0KSwgbG9jYWxfdGhpcy0+aGlkZGVuLT53LCBhYV9pbWd3aWR0aCAoY29udGV4dCksIGxvY2FsX3RoaXMtPmhpZGRlbi0+aCwgYWFfaW1naGVpZ2h0IChjb250ZXh0KSk7CisJYWFfcmVuZGVycGFsZXR0ZShjb250ZXh0LCBsb2NhbF90aGlzLT5oaWRkZW4tPnBhbGV0dGUsIGxvY2FsX3RoaXMtPmhpZGRlbi0+cnBhcmFtcywgMCwgMCwgYWFfc2Nyd2lkdGgoY29udGV4dCksIGFhX3NjcmhlaWdodChjb250ZXh0KSk7CisJYWFfZmx1c2goY29udGV4dCk7Cit9CisKKy8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCitzdGF0aWMgaW50IEFBX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oLTEpOworfQorc3RhdGljIHZvaWQgQUFfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCisvKiBXZSBuZWVkIHRvIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2Ugb24gcGFnZSBmbGlwcGVkIGRpc3BsYXlzICovCitzdGF0aWMgaW50IEFBX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCS8qIFRPRE8gPyAqLworCXJldHVybigwKTsKK30KK3N0YXRpYyB2b2lkIEFBX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCisvKiBGSVhNRTogSG93IGlzIHRoaXMgZG9uZSB3aXRoIEFBbGliPyAqLworc3RhdGljIGludCBBQV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlTRExfbXV0ZXhQKEFBX211dGV4KTsKKwlhYV9mbHVzaChBQV9jb250ZXh0KTsKKwlTRExfbXV0ZXhWKEFBX211dGV4KTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIEFBX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisJaW50IGk7CisJU0RMX1JlY3QgKnJlY3Q7CisKKwlmYXN0c2NhbGUgKEFBX2J1ZmZlciwgYWFfaW1hZ2UoQUFfY29udGV4dCksIEFBX3csIGFhX2ltZ3dpZHRoIChBQV9jb250ZXh0KSwgQUFfaCwgYWFfaW1naGVpZ2h0IChBQV9jb250ZXh0KSk7CisjaWYgMQorCWFhX3JlbmRlcnBhbGV0dGUoQUFfY29udGV4dCwgQUFfcGFsZXR0ZSwgQUFfcnBhcmFtcywgMCwgMCwgYWFfc2Nyd2lkdGgoQUFfY29udGV4dCksIGFhX3NjcmhlaWdodChBQV9jb250ZXh0KSk7CisjZWxzZQorCS8qIFJlbmRlciBvbmx5IHRoZSByZWN0YW5nbGVzIGluIHRoZSBsaXN0ICovCisJcHJpbnRmKCJVcGRhdGUgcmVjdHMgOiAiKTsKKwlmb3IgKCBpPTA7IGkgPCBudW1yZWN0czsgKytpICkgeworCQlyZWN0ID0gJnJlY3RzW2ldOworCQlwcmludGYoIiglZCwlZC0lZCwlZCkiLCByZWN0LT54LCByZWN0LT55LCByZWN0LT53LCByZWN0LT5oKTsKKwkJYWFfcmVuZGVycGFsZXR0ZShBQV9jb250ZXh0LCBBQV9wYWxldHRlLCBBQV9ycGFyYW1zLCByZWN0LT54ICogQUFfeF9yYXRpbywgcmVjdC0+eSAqIEFBX3lfcmF0aW8sIHJlY3QtPncgKiBBQV94X3JhdGlvLCByZWN0LT5oICogQUFfeV9yYXRpbyk7CisJfQorCXByaW50ZigiXG4iKTsKKyNlbmRpZgorCVNETF9tdXRleFAoQUFfbXV0ZXgpOworCWFhX2ZsdXNoKEFBX2NvbnRleHQpOworCVNETF9tdXRleFYoQUFfbXV0ZXgpOworCXJldHVybjsKK30KKworaW50IEFBX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKK3sKKwlpbnQgaTsKKworCWZvciAoIGk9MDsgaSA8IG5jb2xvcnM7IGkrKyApIHsKKwkgICAgICAgIGFhX3NldHBhbGV0dGUoQUFfcGFsZXR0ZSwgZmlyc3Rjb2xvciArIGksCisJCQkgICAgICBjb2xvcnNbaV0ucj4+MiwKKwkJCSAgICAgIGNvbG9yc1tpXS5nPj4yLAorCQkJICAgICAgY29sb3JzW2ldLmI+PjIpOworCX0KKwlyZXR1cm4oMSk7Cit9CisKKy8qIE5vdGU6ICBJZiB3ZSBhcmUgdGVybWluYXRlZCwgdGhpcyBjb3VsZCBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZgorICAgYW5vdGhlciBTREwgdmlkZW8gcm91dGluZSAtLSBub3RhYmx5IFVwZGF0ZVJlY3RzLgorKi8KK3ZvaWQgQUFfVmlkZW9RdWl0KF9USElTKQoreworCWludCBpOworCisJYWFfdW5pbml0a2JkKEFBX2NvbnRleHQpOworCWFhX3VuaW5pdG1vdXNlKEFBX2NvbnRleHQpOworCisJLyogRnJlZSB2aWRlbyBtb2RlIGxpc3RzICovCisJZm9yICggaT0wOyBpPFNETF9OVU1NT0RFUzsgKytpICkgeworCQlpZiAoIFNETF9tb2RlbGlzdFtpXSAhPSBOVUxMICkgeworCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKKwkJCVNETF9tb2RlbGlzdFtpXSA9IE5VTEw7CisJCX0KKwl9CisJCisJYWFfY2xvc2UoQUFfY29udGV4dCk7CisKKwlTRExfRGVzdHJveU11dGV4KEFBX211dGV4KTsKKworCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsJCit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2FhbGliL1NETF9hYXZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2FhbGliL1NETF9hYXZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3ZWRjOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYWFsaWIvU0RMX2FhdmlkZW8uaApAQCAtMCwwICsxLDY2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2FhdmlkZW9faAorI2RlZmluZSBfU0RMX2FhdmlkZW9faAorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisKKyNpbmNsdWRlIDxhYWxpYi5oPgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKKyNkZWZpbmUgU0RMX05VTU1PREVTIDYKKworLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgKi8KK3N0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7CisJU0RMX1JlY3QgKlNETF9tb2RlbGlzdFtTRExfTlVNTU9ERVMrMV07CisJYWFfY29udGV4dCAqY29udGV4dDsKKwlhYV9wYWxldHRlIHBhbGV0dGU7CisJYWFfcmVuZGVycGFyYW1zICpycGFyYW1zOworCWRvdWJsZSB4X3JhdGlvLCB5X3JhdGlvOworICAgIGludCB3LCBoOworICAgIFNETF9tdXRleCAqbXV0ZXg7CisgICAgaW50IGluX3gxMTsKKyAgICB2b2lkICpidWZmZXI7Cit9OworCisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgU0RMX21vZGVsaXN0CQkodGhpcy0+aGlkZGVuLT5TRExfbW9kZWxpc3QpCisjZGVmaW5lIEFBX2NvbnRleHQJCSAgICAodGhpcy0+aGlkZGVuLT5jb250ZXh0KQorI2RlZmluZSBBQV9wYWxldHRlCQkgICAgKHRoaXMtPmhpZGRlbi0+cGFsZXR0ZSkKKyNkZWZpbmUgQUFfcnBhcmFtcwkJICAgICh0aGlzLT5oaWRkZW4tPnJwYXJhbXMpCisjZGVmaW5lIEFBX2J1ZmZlcgkJICAgICh0aGlzLT5oaWRkZW4tPmJ1ZmZlcikKKworI2RlZmluZSBBQV94X3JhdGlvCQkgICAgKHRoaXMtPmhpZGRlbi0+eF9yYXRpbykKKyNkZWZpbmUgQUFfeV9yYXRpbwkJICAgICh0aGlzLT5oaWRkZW4tPnlfcmF0aW8pCisKKyNkZWZpbmUgQUFfbXV0ZXgJCSAgICAodGhpcy0+aGlkZGVuLT5tdXRleCkKKyNkZWZpbmUgQUFfaW5feDExCQkgICAgKHRoaXMtPmhpZGRlbi0+aW5feDExKQorI2RlZmluZSBBQV93ICAgICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPncpCisjZGVmaW5lIEFBX2ggICAgICAgICAgICAgICAgKHRoaXMtPmhpZGRlbi0+aCkKKworI2VuZGlmIC8qIF9TRExfYWF2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWMycC5TIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmljMnAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2QxOTYxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmljMnAuUwpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoKKwlDaHVua3kgdG8gcGxhbmFyIGNvbnZlcnNpb24gcm91dGluZQorCTEgYnl0ZS9waXhlbCAtPiA0IG9yIDggYml0IHBsYW5lcworCisJUGF0cmljZSBNYW5kaW4KKwlYYXZpZXIgSm91YmVydAorCU1pa2FlbCBLYWxtcworKi8KKworCS5nbG9ibAlfU0RMX0F0YXJpX0MycENvbnZlcnQKKwkuZ2xvYmwJX1NETF9BdGFyaV9DMnBDb252ZXJ0OAorCS5nbG9ibAlfU0RMX0F0YXJpX0MycENvbnZlcnQ0CisJLmdsb2JsCV9TRExfQXRhcmlfQzJwQ29udmVydDRfcGFsCisKKy8qIC0tLS0tLS0tLS0tLQlDb252ZXJzaW9uIEMyUCwgOCBiaXRzIC0tLS0tLS0tLS0tLSAqLworCisJLnRleHQKK19TRExfQXRhcmlfQzJwQ29udmVydDg6CisjaWYgIWRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlbAlzcEAoNCksYzJwX3NvdXJjZQorCW1vdmVsCXNwQCg4KSxjMnBfZGVzdAorCW1vdmVsCXNwQCgxMiksYzJwX3dpZHRoCisJbW92ZWwJc3BAKDE2KSxjMnBfaGVpZ2h0CisJbW92ZWwJc3BAKDIwKSxjMnBfZGJsbGlnbmUKKwltb3ZlbAlzcEAoMjQpLGMycF9zcmNwaXRjaAorCW1vdmVsCXNwQCgyOCksYzJwX2RzdHBpdGNoCisKKwltb3ZlbWwJZDItZDcvYTItYTYsc3BALQorCisJbW92ZWwJYzJwX3NvdXJjZSxjMnBfY3Vyc3JjCisJbW92ZWwJYzJwX2Rlc3QsYzJwX2N1cmRzdAorCW1vdmVsCSMweDBmMGYwZjBmLGQ0CisJbW92ZWwJIzB4MDBmZjAwZmYsZDUKKwltb3ZlbAkjMHg1NTU1NTU1NSxkNgorCW1vdmV3CWMycF9oZWlnaHQrMixjMnBfcm93CisJbW92ZXcJYzJwX3dpZHRoKzIsZDAKKwlhbmR3CSMtOCxkMAorCW1vdmV3CWQwLGMycF9yb3dsZW4KKworU0RMX0F0YXJpX0MycDhfcm93bG9vcDoKKworCW1vdmVsCWMycF9jdXJzcmMsYTAKKwltb3ZlbAljMnBfY3VyZHN0LGExCisKKwltb3ZlbAlhMCxhMgorCWFkZHcJYzJwX3Jvd2xlbixhMgorCisJbW92ZWwJYTBAKyxkMAorCW1vdmVsCWEwQCssZDEKKwltb3ZlbAlhMEArLGQyCisJbW92ZWwJYTBAKyxkMworLyoKKwlkMCA9IGE3YTZhNWE0YTNhMmExYTAgYjdiNmI1YjRiM2IyYjFiMCBjN2M2YzVjNGMzYzJjMWMwIGQ3ZDZkNWQ0ZDNkMmQxZDAKKwlkMSA9IGU3ZTZlNWU0ZTNlMmUxZTAgZjdmNmY1ZjRmM2YyZjFmMCBnN2c2ZzVnNGczZzJnMWcwIGg3aDZoNWg0aDNoMmgxaDAKKwlkMiA9IGk3aTZpNWk0aTNpMmkxaTAgajdqNmo1ajRqM2oyajFqMCBrN2s2azVrNGszazJrMWswIGw3bDZsNWw0bDNsMmwxbDAKKwlkMyA9IG03bTZtNW00bTNtMm0xbTAgbjduNm41bjRuM24ybjFuMCBvN282bzVvNG8zbzJvMW8wIHA3cDZwNXA0cDNwMnAxcDAKKyovCisJbW92ZWwJZDEsZDcKKwlsc3JsCSM0LGQ3CisJZW9ybAlkMCxkNworCWFuZGwJZDQsZDcKKwllb3JsCWQ3LGQwCisJbHNsbAkjNCxkNworCWVvcmwJZDcsZDEKKworCW1vdmVsCWQzLGQ3CisJbHNybAkjNCxkNworCWVvcmwJZDIsZDcKKwlhbmRsCWQ0LGQ3CisJZW9ybAlkNyxkMgorCWxzbGwJIzQsZDcKKwllb3JsCWQ3LGQzCisKKwltb3ZlbAlkMixkNworCWxzcmwJIzgsZDcKKwllb3JsCWQwLGQ3CisgCWFuZGwJZDUsZDcKKwllb3JsCWQ3LGQwCisJbHNsbAkjOCxkNworCWVvcmwJZDcsZDIKKworCW1vdmVsCWQzLGQ3CisJbHNybAkjOCxkNworCWVvcmwJZDEsZDcKKyAJYW5kbAlkNSxkNworCWVvcmwJZDcsZDEKKwlsc2xsCSM4LGQ3CisJZW9ybAlkNyxkMworLyoKKwlkMCA9IGE3YTZhNWE0ZTdlNmU1ZTQgaTdpNmk1aTRtN202bTVtNCBjN2M2YzVjNGc3ZzZnNWc0IGs3azZrNWs0bzdvNm81bzQKKwlkMSA9IGEzYTJhMWEwZTNlMmUxZTAgaTNpMmkxaTBtM20ybTFtMCBjM2MyYzFjMGczZzJnMWcwIGszazJrMWswbzNvMm8xbzAKKwlkMiA9IGI3YjZiNWI0ZjdmNmY1ZjQgajdqNmo1ajRuN242bjVuNCBkN2Q2ZDVkNGg3aDZoNWg0IGw3bDZsNWw0cDdwNnA1cDQKKwlkMyA9IGIzYjJiMWIwZjNmMmYxZjAgajNqMmoxajBuM24ybjFuMCBkM2QyZDFkMGgzaDJoMWgwIGwzbDJsMWwwcDNwMnAxcDAKKyovCisJYnJhcwlTRExfQXRhcmlfQzJwOF9zdGFydAorCitTRExfQXRhcmlfQzJwOF9waXgxNjoKKworCW1vdmVsCWEwQCssZDAKKwltb3ZlbAlhMEArLGQxCisJbW92ZWwJYTBAKyxkMgorCW1vdmVsCWEwQCssZDMKKy8qCisJZDAgPSBhN2E2YTVhNGEzYTJhMWEwIGI3YjZiNWI0YjNiMmIxYjAgYzdjNmM1YzRjM2MyYzFjMCBkN2Q2ZDVkNGQzZDJkMWQwCisJZDEgPSBlN2U2ZTVlNGUzZTJlMWUwIGY3ZjZmNWY0ZjNmMmYxZjAgZzdnNmc1ZzRnM2cyZzFnMCBoN2g2aDVoNGgzaDJoMWgwCisJZDIgPSBpN2k2aTVpNGkzaTJpMWkwIGo3ajZqNWo0ajNqMmoxajAgazdrNms1azRrM2syazFrMCBsN2w2bDVsNGwzbDJsMWwwCisJZDMgPSBtN202bTVtNG0zbTJtMW0wIG43bjZuNW40bjNuMm4xbjAgbzdvNm81bzRvM28ybzFvMCBwN3A2cDVwNHAzcDJwMXAwCisqLworCW1vdmVsCWQxLGQ3CisJbHNybAkjNCxkNworCW1vdmVsCWEzLGExQCsKKwllb3JsCWQwLGQ3CisJYW5kbAlkNCxkNworCWVvcmwJZDcsZDAKKwlsc2xsCSM0LGQ3CisJZW9ybAlkNyxkMQorCisJbW92ZWwJZDMsZDcKKwlsc3JsCSM0LGQ3CisJZW9ybAlkMixkNworCWFuZGwJZDQsZDcKKwllb3JsCWQ3LGQyCisJbW92ZWwJYTQsYTFAKworCWxzbGwJIzQsZDcKKwllb3JsCWQ3LGQzCisKKwltb3ZlbAlkMixkNworCWxzcmwJIzgsZDcKKwllb3JsCWQwLGQ3CisJYW5kbAlkNSxkNworCWVvcmwJZDcsZDAKKwltb3ZlbAlhNSxhMUArCisJbHNsbAkjOCxkNworCWVvcmwJZDcsZDIKKworCW1vdmVsCWQzLGQ3CisJbHNybAkjOCxkNworCWVvcmwJZDEsZDcKKwlhbmRsCWQ1LGQ3CisJZW9ybAlkNyxkMQorCW1vdmVsCWE2LGExQCsKKwlsc2xsCSM4LGQ3CisJZW9ybAlkNyxkMworLyoKKwlkMCA9IGE3YTZhNWE0ZTdlNmU1ZTQgaTdpNmk1aTRtN202bTVtNCBjN2M2YzVjNGc3ZzZnNWc0IGs3azZrNWs0bzdvNm81bzQKKwlkMSA9IGEzYTJhMWEwZTNlMmUxZTAgaTNpMmkxaTBtM20ybTFtMCBjM2MyYzFjMGczZzJnMWcwIGszazJrMWswbzNvMm8xbzAKKwlkMiA9IGI3YjZiNWI0ZjdmNmY1ZjQgajdqNmo1ajRuN242bjVuNCBkN2Q2ZDVkNGg3aDZoNWg0IGw3bDZsNWw0cDdwNnA1cDQKKwlkMyA9IGIzYjJiMWIwZjNmMmYxZjAgajNqMmoxajBuM24ybjFuMCBkM2QyZDFkMGgzaDJoMWgwIGwzbDJsMWwwcDNwMnAxcDAKKyovCisKK1NETF9BdGFyaV9DMnA4X3N0YXJ0OgorCisJbW92ZWwJZDIsZDcKKwlsc3JsCSMxLGQ3CisJZW9ybAlkMCxkNworCWFuZGwJZDYsZDcKKwllb3JsCWQ3LGQwCisJYWRkbAlkNyxkNworCWVvcmwJZDcsZDIKKworCW1vdmVsCWQzLGQ3CisJbHNybAkjMSxkNworCWVvcmwJZDEsZDcKKwlhbmRsCWQ2LGQ3CisJZW9ybAlkNyxkMQorCWFkZGwJZDcsZDcKKwllb3JsCWQ3LGQzCisvKgorCWQwID0gYTdiN2E1YjVlN2Y3ZTVmNSBpN2o3aTVqNW03bjdtNW41IGM3ZDdjNWQ1ZzdoN2c1aDUgazdsN2s1bDVvN3A3bzVwNQorCWQxID0gYTNiM2ExYjFlM2YzZTFmMSBpM2ozaTFqMW0zbjNtMW4xIGMzZDNjMWQxZzNoM2cxaDEgazNsM2sxbDFvM3AzbzFwMQorCWQyID0gYTZiNmE0YjRlNmY2ZTRmNCBpNmo2aTRqNG02bjZtNG40IGM2ZDZjNGQ0ZzZoNmc0aDQgazZsNms0bDRvNnA2bzRwNAorCWQzID0gYTJiMmEwYjBlMmYyZTBmMCBpMmoyaTBqMG0ybjJtMG4wIGMyZDJjMGQwZzJoMmcwaDAgazJsMmswbDBvMnAybzBwMAorKi8KKwltb3ZldwlkMixkNworCW1vdmV3CWQwLGQyCisJc3dhcAlkMgorCW1vdmV3CWQyLGQwCisJbW92ZXcJZDcsZDIKKworCW1vdmV3CWQzLGQ3CisJbW92ZXcJZDEsZDMKKwlzd2FwCWQzCisJbW92ZXcJZDMsZDEKKwltb3ZldwlkNyxkMworLyoKKwlkMCA9IGE3YjdhNWI1ZTdmN2U1ZjUgaTdqN2k1ajVtN243bTVuNSBhNmI2YTRiNGU2ZjZlNGY0IGk2ajZpNGo0bTZuNm00bjQKKwlkMSA9IGEzYjNhMWIxZTNmM2UxZjEgaTNqM2kxajFtM24zbTFuMSBhMmIyYTBiMGUyZjJlMGYwIGkyajJpMGowbTJuMm0wbjAKKwlkMiA9IGM3ZDdjNWQ1ZzdoN2c1aDUgazdsN2s1bDVvN3A3bzVwNSBjNmQ2YzRkNGc2aDZnNGg0IGs2bDZrNGw0bzZwNm80cDQKKwlkMyA9IGMzZDNjMWQxZzNoM2cxaDEgazNsM2sxbDFvM3AzbzFwMSBjMmQyYzBkMGcyaDJnMGgwIGsybDJrMGwwbzJwMm8wcDAKKyovCisJbW92ZWwJZDIsZDcKKwlsc3JsCSMyLGQ3CisJZW9ybAlkMCxkNworCWFuZGwJIzB4MzMzMzMzMzMsZDcKKwllb3JsCWQ3LGQwCisJbHNsbAkjMixkNworCWVvcmwJZDcsZDIKKworCW1vdmVsCWQzLGQ3CisJbHNybAkjMixkNworCWVvcmwJZDEsZDcKKwlhbmRsCSMweDMzMzMzMzMzLGQ3CisJZW9ybAlkNyxkMQorCWxzbGwJIzIsZDcKKwllb3JsCWQ3LGQzCisvKgorCWQwID0gYTdiN2M3ZDdlN2Y3ZzdoNyBpN2o3azdsN203bjdvN3A3IGE2YjZjNmQ2ZTZmNmc2aDYgaTZqNms2bDZtNm42bzZwNgorCWQxID0gYTNiM2MzZDNlM2YzZzNoMyBpM2ozazNsM20zbjNvM3AzIGEyYjJjMmQyZTJmMmcyaDIgaTJqMmsybDJtMm4ybzJwMgorCWQyID0gYTViNWM1ZDVlNWY1ZzVoNSBpNWo1azVsNW01bjVvNXA1IGE0YjRjNGQ0ZTRmNGc0aDQgaTRqNGs0bDRtNG40bzRwNAorCWQzID0gYTFiMWMxZDFlMWYxZzFoMSBpMWoxazFsMW0xbjFvMXAxIGEwYjBjMGQwZTBmMGcwaDAgaTBqMGswbDBtMG4wbzBwMAorKi8KKwlzd2FwCWQwCisJc3dhcAlkMQorCXN3YXAJZDIKKwlzd2FwCWQzCisKKwltb3ZlbAlkMCxhNgorCW1vdmVsCWQyLGE1CisJbW92ZWwJZDEsYTQKKwltb3ZlbAlkMyxhMworCisJY21wbAlhMCxhMgorCWJndAkJU0RMX0F0YXJpX0MycDhfcGl4MTYKKworCW1vdmVsCWEzLGExQCsKKwltb3ZlbAlhNCxhMUArCisJbW92ZWwJYTUsYTFAKworCW1vdmVsCWE2LGExQCsKKworCS8qIERvdWJsZSB0aGUgbGluZSA/ICovCisKKwltb3ZlbAljMnBfc3JjcGl0Y2gsZDAKKwltb3ZlbAljMnBfZHN0cGl0Y2gsZDEKKworCXRzdGwJYzJwX2RibGxpZ25lCisJYmVxcwlTRExfQXRhcmlfQzJwOF9ub2RibGxpbmUKKworCW1vdmVsCWMycF9jdXJkc3QsYTAKKwltb3ZlbAlhMCxhMQorCWFkZGwJZDEsYTEKKworCW1vdmV3CWMycF93aWR0aCsyLGQ3CisJbHNydwkjNCxkNworCXN1YnFsCSMxLGQ3CitTRExfQXRhcmlfQzJwOF9kYmxsb29wOgorCW1vdmVsCWEwQCssYTFAKworCW1vdmVsCWEwQCssYTFAKworCW1vdmVsCWEwQCssYTFAKworCW1vdmVsCWEwQCssYTFAKworCWRicmEJZDcsU0RMX0F0YXJpX0MycDhfZGJsbG9vcAorCisJYWRkbAlkMSxjMnBfY3VyZHN0CisKK1NETF9BdGFyaV9DMnA4X25vZGJsbGluZToKKworCS8qIE5leHQgbGluZSAqLworCisJYWRkbAlkMCxjMnBfY3Vyc3JjCisJYWRkbAlkMSxjMnBfY3VyZHN0CisKKwlzdWJxdwkjMSxjMnBfcm93CisJYm5lCQlTRExfQXRhcmlfQzJwOF9yb3dsb29wCQorCisJbW92ZW1sCXNwQCssZDItZDcvYTItYTYKKyNlbmRpZgorCXJ0cworCisvKiAtLS0tLS0tLS0tLS0JQ29udmVyc2lvbiBDMlAsIDQgYml0cyAtLS0tLS0tLS0tLS0gKi8KKworX1NETF9BdGFyaV9DMnBDb252ZXJ0NDoKKyNpZiAhZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCW1vdmVsCXNwQCg0KSxjMnBfc291cmNlCisJbW92ZWwJc3BAKDgpLGMycF9kZXN0CisJbW92ZWwJc3BAKDEyKSxjMnBfd2lkdGgKKwltb3ZlbAlzcEAoMTYpLGMycF9oZWlnaHQKKwltb3ZlbAlzcEAoMjApLGMycF9kYmxsaWduZQorCW1vdmVsCXNwQCgyNCksYzJwX3NyY3BpdGNoCisJbW92ZWwJc3BAKDI4KSxjMnBfZHN0cGl0Y2gKKworCW1vdmVtbAlkMi1kNy9hMi1hNixzcEAtCisKKwltb3ZlbAljMnBfc291cmNlLGEwCisJbW92ZWwJYzJwX2Rlc3QsYTEKKwlsZWEJX1NETF9BdGFyaV90YWJsZV9jMnAsYTIKKwltb3ZlbAkjMHgwMDA3MDAwMSxkMworI2lmIGRlZmluZWQoX19tYzY4MDIwX18pCisJbW92ZXEJIzAsZDAKKyNlbmRpZgorCQorCW1vdmVsCWMycF9oZWlnaHQsZDcKKwlzdWJxbAkjMSxkNworYzJwNF9iY2x5OgorCW1vdmVsCWEwLGE0CXwgU2F2ZSBzdGFydCBhZGRyZXNzIG9mIHNvdXJjZQorCW1vdmVsCWExLGE1CXwgU2F2ZSBzdGFydCBhZGRyZXNzIG9mIGRlc3QKKworCXwgQ29udmVyc2lvbgorICAgICAgICAgICAgICAgICAJCQkKKwltb3ZlbAljMnBfd2lkdGgsZDYKKwlsc3J3CSM0LGQ2CisJc3VicWwJIzEsZDYKK2MycDRfYmNseDoKKwl8IE9jdGV0cyAwLTcKKwkKKwltb3ZlcQkjMCxkMQorCW1vdmVxCSM3LGQ1CitjMnA0X2JjbDA3OgorI2lmIGRlZmluZWQoX19tYzY4MDIwX18pCisJbW92ZWIJYTBAKyxkMAorCWxlYQkJYTJAKDAsZDA6dzo0KSxhMworI2Vsc2UKKwltb3ZlcQkjMCxkMAorCW1vdmViCWEwQCssZDAKKwlsc2x3CSMyLGQwCisJbGVhCQlhMkAoMCxkMDp3KSxhMworI2VuZGlmCisJbHNsbAkjMSxkMQorCW9ybAkJYTNALGQxCisJZGJyYQlkNSxjMnA0X2JjbDA3CisKKwltb3ZlcGwJZDEsYTFAKDApCisJYWRkdwlkMyxhMQorCXN3YXAJZDMKKwkKKwl8IE9jdGV0cyA4LTE1CisKKwltb3ZlcQkjMCxkMQorCW1vdmVxCSM3LGQ1CitjMnA0X2JjbDgxNToKKyNpZiBkZWZpbmVkKF9fbWM2ODAyMF9fKQorCW1vdmViCWEwQCssZDAKKwlsZWEJCWEyQCgwLGQwOnc6NCksYTMKKyNlbHNlCisJbW92ZXEJIzAsZDAKKwltb3ZlYglhMEArLGQwCisJbHNsdwkjMixkMAorCWxlYQkJYTJAKDAsZDA6dyksYTMKKyNlbmRpZgorCWxzbGwJIzEsZDEKKwlvcmwJCWEzQCxkMQorCWRicmEJZDUsYzJwNF9iY2w4MTUKKworCW1vdmVwbAlkMSxhMUAoMCkKKwlhZGR3CWQzLGExCisJc3dhcAlkMworCisJZGJyYQlkNixjMnA0X2JjbHgKKworCXwgRG91YmxlIGxpbmUgPworCisJdHN0bAljMnBfZGJsbGlnbmUKKwliZXFzCWMycDRfbm9kYmxsaWduZQorCisJbW92ZWwJYTUsYTYJCQl8IHNyYyBsaW5lCisJbW92ZWwJYTUsYTEJCQl8IGRlc3QgbGluZQorCWFkZGwJYzJwX2RzdHBpdGNoLGExCisKKwltb3ZlbAljMnBfd2lkdGgsZDYKKwlsc3J3CSMzLGQ2CisJc3VicWwJIzEsZDYKK2MycDRfY29weWRibDoKKwltb3ZlbAlhNkArLGExQCsKKwlkYnJhCWQ2LGMycDRfY29weWRibAorCisJYWRkbAljMnBfZHN0cGl0Y2gsYTUKK2MycDRfbm9kYmxsaWduZToKKworCXwgTmV4dCBsaW5lCisKKwltb3ZlbAlhNCxhMAkJCisJYWRkbAljMnBfc3JjcGl0Y2gsYTAKKwltb3ZlbAlhNSxhMQorCWFkZGwJYzJwX2RzdHBpdGNoLGExCisKKwlkYnJhCWQ3LGMycDRfYmNseQorCisJbW92ZW1sCXNwQCssZDItZDcvYTItYTYKKyNlbmRpZgorCXJ0cworCisvKiAtLS0tLS0tLS0tLS0JQ29udmVyc2lvbiBvZiBhIGxpZ2h0IHBhbGV0dGUgaW4gNCBiaXRzIC0tLS0tLS0tLS0tLSAqLworCitfU0RMX0F0YXJpX0MycENvbnZlcnQ0X3BhbDoKKyNpZiAhZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCS8qIGEwIGlzIGEgMjU2LXdvcmQgbGlnaHQgcGFsZXR0ZSAqLworCW1vdmVsCXNwQCg0KSxhMAorCisJbW92ZW1sCWQyLWQzLHNwQC0KKworCWxlYQkJX1NETF9BdGFyaV90YWJsZV9jMnAsYTEKKwltb3ZldwkjMjU1LGQzCitjMnBfcGFsX2luaXRiY2w6CisJbW92ZXcJYTBAKyxkMAorCWxzcncJIzQsZDAKKwlhbmR3CSMxNSxkMAorCisJbW92ZXEJIzMsZDEKK2MycF9wYWxfaW5pdGJ5dGU6CisJYnRzdAlkMSxkMAorCXNuZQkJZDIKKwluZWd3CWQyCisJbW92ZWIJZDIsYTFAKDAsZDE6dykKKworCWRicmEJZDEsYzJwX3BhbF9pbml0Ynl0ZQorCisJYWRkcWwJIzQsYTEKKwlkYnJhCWQzLGMycF9wYWxfaW5pdGJjbAorCisJbW92ZW1sCXNwQCssZDItZDMKKyNlbmRpZgorCXJ0cworCisvKiAtLS0tLS0tLS0tLS0JQnVmZmVycyAtLS0tLS0tLS0tLS0gKi8KKworCS5ic3MKKworCS5ldmVuCisJLmNvbW0JX1NETF9BdGFyaV9DMnBDb252ZXJ0LDQKKwkuY29tbQlfU0RMX0F0YXJpX3RhYmxlX2MycCwxMDI0CisKKwkuY29tbQljMnBfc291cmNlLDQJLyogU291cmNlIGZyYW1lYnVmZmVyICovCisJLmNvbW0JYzJwX2Rlc3QsNAkJLyogRGVzdGluYXRpb24gZnJhbWVidWZmZXIgKi8KKwkuY29tbQljMnBfd2lkdGgsNAkJLyogV2lkdGggb2Ygem9uZSB0byBjb252ZXJ0ICovCisJLmNvbW0JYzJwX2hlaWdodCw0CS8qIEhlaWdodCBvZiB6b25lIHRvIGNvbnZlcnQgKi8KKwkuY29tbQljMnBfZGJsbGlnbmUsNAkvKiBEb3VibGUgdGhlIGxpbmVzIHdoaWxlIGNvbnZlcnRpbmcgPyAqLworCS5jb21tCWMycF9zcmNwaXRjaCw0CS8qIFNvdXJjZSBwaXRjaCAqLworCS5jb21tCWMycF9kc3RwaXRjaCw0CS8qIERlc3RpbmF0aW9uIHBpdGNoICovCisJLmNvbW0JYzJwX2N1cnNyYyw0CS8qIEN1cnJlbnQgc291cmNlIGxpbmUgKi8KKwkuY29tbQljMnBfY3VyZHN0LDQJLyogQ3VycmVudCBkZXN0aW5hdGlvbiBsaW5lICovCisJLmNvbW0JYzJwX3Jvd2xlbiwyCS8qIExpbmUgbGVuZ3RoIGluIGJ5dGVzICovCisJLmNvbW0JYzJwX3JvdywyCQkvKiBDdXJyZW50IGxpbmUgbnVtYmVyICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWMycF9zLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWMycF9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiZGFlNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpYzJwX3MuaApAQCAtMCwwICsxLDc1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfQVRBUklfQzJQX2gKKyNkZWZpbmUgX0FUQVJJX0MyUF9oCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisKKy8qLS0tIEZ1bmN0aW9ucyBwb2ludGVycyAtLS0qLworCisvKiBDb252ZXJ0IGEgY2h1bmt5IHNjcmVlbiB0byBiaXRwbGFuZSBzY3JlZW4gKi8KKworZXh0ZXJuIHZvaWQgKCpTRExfQXRhcmlfQzJwQ29udmVydCkoCisJVWludDggKnNyYywJCQkvKiBTb3VyY2Ugc2NyZWVuIChvbmUgYnl0ZT1vbmUgcGl4ZWwpICovCisJVWludDggKmRlc3QsCQkvKiBEZXN0aW5hdGlvbiAoNC84IGJpdHMgcGxhbmVzKSAqLworCVVpbnQzMiB3aWR0aCwJCS8qIERpbWVuc2lvbnMgb2Ygc2NyZWVuIHRvIGNvbnZlcnQgKi8KKwlVaW50MzIgaGVpZ2h0LAorCVVpbnQzMiBkYmxsaWduZSwJLyogRG91YmxlIHRoZSBsaW5lcyB3aGVuIGNvbnZlcnRpbmcgPyAqLworCVVpbnQzMiBzcmNwaXRjaCwJLyogTGVuZ3RoIG9mIG9uZSBzb3VyY2UgbGluZSBpbiBieXRlcyAqLworCVVpbnQzMiBkc3RwaXRjaAkJLyogTGVuZ3RoIG9mIG9uZSBkZXN0aW5hdGlvbiBsaW5lIGluIGJ5dGVzICovCispOworCisvKi0tLSA4IGJpdHMgZnVuY3Rpb25zIC0tLSovCisKKy8qIENvbnZlcnQgYSBjaHVua3kgc2NyZWVuIHRvIGJpdHBsYW5lIHNjcmVlbiAqLworCit2b2lkIFNETF9BdGFyaV9DMnBDb252ZXJ0OCgKKwlVaW50OCAqc3JjLAkJCS8qIFNvdXJjZSBzY3JlZW4gKG9uZSBieXRlPW9uZSBwaXhlbCkgKi8KKwlVaW50OCAqZGVzdCwJCS8qIERlc3RpbmF0aW9uICg4IGJpdHMgcGxhbmVzKSAqLworCVVpbnQzMiB3aWR0aCwJCS8qIERpbWVuc2lvbnMgb2Ygc2NyZWVuIHRvIGNvbnZlcnQgKi8KKwlVaW50MzIgaGVpZ2h0LAorCVVpbnQzMiBkYmxsaWduZSwJLyogRG91YmxlIHRoZSBsaW5lcyB3aGVuIGNvbnZlcnRpbmcgPyAqLworCVVpbnQzMiBzcmNwaXRjaCwJLyogTGVuZ3RoIG9mIG9uZSBzb3VyY2UgbGluZSBpbiBieXRlcyAqLworCVVpbnQzMiBkc3RwaXRjaAkJLyogTGVuZ3RoIG9mIG9uZSBkZXN0aW5hdGlvbiBsaW5lIGluIGJ5dGVzICovCispOworCisvKi0tLSA0IGJpdHMgZnVuY3Rpb25zIC0tLSovCisKKy8qIENvbnZlcnQgYSBjaHVua3kgc2NyZWVuIHRvIGJpdHBsYW5lIHNjcmVlbiAqLworCit2b2lkIFNETF9BdGFyaV9DMnBDb252ZXJ0NCgKKwlVaW50OCAqc3JjLAkJCS8qIFNvdXJjZSBzY3JlZW4gKG9uZSBieXRlPW9uZSBwaXhlbCkgKi8KKwlVaW50OCAqZGVzdCwJCS8qIERlc3RpbmF0aW9uICg0IGJpdHMgcGxhbmVzKSAqLworCVVpbnQzMiB3aWR0aCwJCS8qIERpbWVuc2lvbnMgb2Ygc2NyZWVuIHRvIGNvbnZlcnQgKi8KKwlVaW50MzIgaGVpZ2h0LAorCVVpbnQzMiBkYmxsaWduZSwJLyogRG91YmxlIHRoZSBsaW5lcyB3aGVuIGNvbnZlcnRpbmcgPyAqLworCVVpbnQzMiBzcmNwaXRjaCwJLyogTGVuZ3RoIG9mIG9uZSBzb3VyY2UgbGluZSBpbiBieXRlcyAqLworCVVpbnQzMiBkc3RwaXRjaAkJLyogTGVuZ3RoIG9mIG9uZSBkZXN0aW5hdGlvbiBsaW5lIGluIGJ5dGVzICovCispOworCisvKiBDb252ZXJzaW9uIHBhbGV0dGUgKi8KKwordm9pZCBTRExfQXRhcmlfQzJwQ29udmVydDRfcGFsKFVpbnQxNiAqbGlnaHRwYWxldHRlKTsKKworI2VuZGlmIC8qIF9BVEFSSV9DMlBfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlkZXZtb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlkZXZtb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjczODAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWRldm1vdXNlLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCU1pTlQgL2Rldi9tb3VzZSBkcml2ZXIKKworCVBhdHJpY2UgTWFuZGluCisqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfYXRhcmlkZXZtb3VzZV9jLmgiCisKKy8qIERlZmluZXMgKi8KKworI2RlZmluZSBERVZJQ0VfTkFNRQkiL2Rldi9tb3VzZSIKKworLyogTG9jYWwgdmFyaWFibGVzICovCisKK3N0YXRpYyBpbnQgaGFuZGxlID0gLTE7CitzdGF0aWMgaW50IG1vdXNlYiwgcHJldl9tb3VzZWI7CisKKy8qIEZ1bmN0aW9ucyAqLworCitpbnQgU0RMX0F0YXJpRGV2TW91c2VfT3Blbih2b2lkKQoreworCWludCByOworCWNvbnN0IGNoYXIgKm1vdXNlZGV2OworCisJLyoKKwkJVE9ETzogRml4IHRoZSBNaU5UIGRldmljZSBkcml2ZXIsIHRoYXQgbG9ja3MgbW91c2UgZm9yIG90aGVyCisJCWFwcGxpY2F0aW9ucywgc28gdGhpcyBpcyBkaXNhYmxlZCB0aWxsIGZpeGVkCisJICovCisJcmV0dXJuIDA7CisKKwkvKiBGaXJzdCwgdHJ5IFNETF9NT1VTRURFViBkZXZpY2UgKi8KKwltb3VzZWRldiA9IFNETF9nZXRlbnYoIlNETF9NT1VTRURFViIpOworCWlmICghbW91c2VkZXYpIHsKKwkJaGFuZGxlID0gb3Blbihtb3VzZWRldiwgMCk7CisJfQorCisJLyogRmFpbGVkLCB0cnkgZGVmYXVsdCBkZXZpY2UgKi8KKwlpZiAoaGFuZGxlPDApIHsKKwkJaGFuZGxlID0gb3BlbihERVZJQ0VfTkFNRSwgMCk7CisJfQorCisJaWYgKGhhbmRsZTwwKSB7CisJCWhhbmRsZSA9IC0xOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTZXQgbm9uIGJsb2NraW5nIG1vZGUgKi8KKwlyID0gZmNudGwoaGFuZGxlLCBGX0dFVEZMLCAwKTsKKwlpZiAocjwwKSB7CisJCWNsb3NlKGhhbmRsZSk7CisJCWhhbmRsZSA9IC0xOworCQlyZXR1cm4gMDsKKwl9CisKKwlyIHw9IE9fTkRFTEFZOworCisJciA9IGZjbnRsKGhhbmRsZSwgRl9TRVRGTCwgcik7CisJaWYgKHI8MCkgeworCQljbG9zZShoYW5kbGUpOworCQloYW5kbGUgPSAtMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJldl9tb3VzZWIgPSA3OworCXJldHVybiAxOworfQorCit2b2lkIFNETF9BdGFyaURldk1vdXNlX0Nsb3NlKHZvaWQpCit7CisJaWYgKGhhbmRsZT4wKSB7CisJCWNsb3NlKGhhbmRsZSk7CisJCWhhbmRsZSA9IC0xOworCX0KK30KKworc3RhdGljIGludCBhdGFyaV9HZXRCdXR0b24oaW50IGJ1dHRvbikKK3sKKwlzd2l0Y2goYnV0dG9uKQorCXsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIFNETF9CVVRUT05fUklHSFQ7CisJCWNhc2UgMToKKwkJCXJldHVybiBTRExfQlVUVE9OX01JRERMRTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBTRExfQlVUVE9OX0xFRlQ7Cit9CisKK3ZvaWQgU0RMX0F0YXJpRGV2TW91c2VfUG9zdE1vdXNlRXZlbnRzKF9USElTLCBTRExfYm9vbCBidXR0b25FdmVudHMpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbM107CisJaW50IG1vdXNleCwgbW91c2V5OworCisJaWYgKGhhbmRsZTwwKSB7CisJCXJldHVybjsKKwl9CisKKwltb3VzZXggPSBtb3VzZXkgPSAwOworCXdoaWxlIChyZWFkKGhhbmRsZSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk9PXNpemVvZihidWZmZXIpKSB7CisJCW1vdXNlYiA9IGJ1ZmZlclswXSAmIDc7CisJCW1vdXNleCArPSAoY2hhcikgYnVmZmVyWzFdOworCQltb3VzZXkgKz0gKGNoYXIpIGJ1ZmZlclsyXTsKKworCQkvKiBNb3VzZSBidXR0b24gZXZlbnRzICovCisJCWlmIChidXR0b25FdmVudHMgJiYgKG1vdXNlYiAhPSBwcmV2X21vdXNlYikpIHsKKwkJCWludCBpOworCisJCQlmb3IgKGk9MDtpPDM7aSsrKSB7CisJCQkJaW50IGN1cmJ1dHRvbiwgcHJldmJ1dHRvbjsKKworCQkJCWN1cmJ1dHRvbiA9IG1vdXNlYiAmICgxPDxpKTsKKwkJCQlwcmV2YnV0dG9uID0gcHJldl9tb3VzZWIgJiAoMTw8aSk7CisJCQkKKwkJCQlpZiAoY3VyYnV0dG9uICYmICFwcmV2YnV0dG9uKSB7CisJCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBhdGFyaV9HZXRCdXR0b24oaSksIDAsIDApOworCQkJCX0KKwkJCQlpZiAoIWN1cmJ1dHRvbiAmJiBwcmV2YnV0dG9uKSB7CisJCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIGF0YXJpX0dldEJ1dHRvbihpKSwgMCwgMCk7CisJCQkJfQorCQkJfQorCisJCQlwcmV2X21vdXNlYiA9IG1vdXNlYjsKKwkJfQorCX0KKworCS8qIE1vdXNlIG1vdGlvbiBldmVudCAqLworCWlmIChtb3VzZXggfHwgbW91c2V5KSB7CisJCVNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgbW91c2V4LCAtbW91c2V5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWRldm1vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZGV2bW91c2VfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWUwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWRldm1vdXNlX2MuaApAQCAtMCwwICsxLDQyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKwlNaU5UIC9kZXYvbW91c2UgZHJpdmVyCisKKwlQYXRyaWNlIE1hbmRpbgorKi8KKworI2lmbmRlZiBfU0RMX0FUQVJJX0RFVk1PVVNFX0hfCisjZGVmaW5lIF9TRExfQVRBUklfREVWTU9VU0VfSF8KKworI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKK2V4dGVybiBpbnQgU0RMX0F0YXJpRGV2TW91c2VfT3Blbih2b2lkKTsKK2V4dGVybiB2b2lkIFNETF9BdGFyaURldk1vdXNlX0Nsb3NlKHZvaWQpOworZXh0ZXJuIHZvaWQgU0RMX0F0YXJpRGV2TW91c2VfUG9zdE1vdXNlRXZlbnRzKF9USElTLCBTRExfYm9vbCBidXR0b25FdmVudHMpOworCisjZW5kaWYgLyogX1NETF9BVEFSSV9ERVZNT1VTRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmllZGRpLlMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWVkZGkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGNiZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmllZGRpLlMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyoKKyAqCVJlYWQgRWRESSB2ZXJzaW9uCisgKgorICoJUGF0cmljZSBNYW5kaW4KKyAqLworCisJLnRleHQKKworCS5nbG9ibAlfQXRhcmlfZ2V0X0VkRElfdmVyc2lvbgorCisvKi0tLSBWZWN0b3IgaW5zdGFsbGVyIC0tLSovCisKK19BdGFyaV9nZXRfRWRESV92ZXJzaW9uOgorCW1vdmVsCXNwQCg0KSxhMAkvKiBWYWx1ZSBvZiBFZERJIGNvb2tpZSAqLworCisJLyogQ2FsbCBFZERJIGZ1bmN0aW9uICMwICovCisJY2xydwlkMAorCWpzcgkoYTApCisKKwlydHMKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZWRkaV9zLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWVkZGlfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkM2U1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWVkZGlfcy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfQXRhcmlfZWRkaV9zX2gKKyNkZWZpbmUgX1NETF9BdGFyaV9lZGRpX3NfaAorCisvKi0tLSBEZWZpbmVzIC0tLSovCisKKy8qIEVkREkgdmVyc2lvbnMgKi8KKworI2RlZmluZSBFRERJXzEwCSgweDAxMDApCisjZGVmaW5lIEVERElfMTEgKDB4MDExMCkKKworLyogU2NyZWVuIGZvcm1hdCAqLworCitlbnVtIHsKKwlWRElfRk9STUFUX1VOS05PV049LTEsCisJVkRJX0ZPUk1BVF9JTlRFUj0wLAkvKiBJbnRlcmxlYXZlZCBiaXRwbGFuZXMgKi8KKwlWRElfRk9STUFUX1ZEST0xLAkvKiBWREkgaW5kZXBlbmRlbnQgKi8KKwlWRElfRk9STUFUX1BBQ0s9MgkvKiBQYWNrZWQgcGl4ZWxzICovCit9OworCisvKiBDTFVUIHR5cGVzICovCitlbnVtIHsKKwlWRElfQ0xVVF9OT05FPTAsCS8qIE1vbm9jaHJvbWUgbW9kZSAqLworCVZESV9DTFVUX0hBUkRXQVJFLAkvKiA8MjU2IGNvbG91cnMgbW9kZSAqLworCVZESV9DTFVUX1NPRlRXQVJFCS8qIFRydWUgY29sb3VyIG1vZGUgKi8KK307CisKKy8qLS0tIEZ1bmN0aW9ucyAtLS0qLworCit1bnNpZ25lZCBsb25nIEF0YXJpX2dldF9FZERJX3ZlcnNpb24odm9pZCAqZnVuY3Rpb25fcG9pbnRlcik7CisKKyNlbmRpZiAvKiBfU0RMX0F0YXJpX2VkZGlfc19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMxMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlldmVudHMuYwpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgKglBdGFyaSBrZXlib2FyZCBldmVudHMgbWFuYWdlcgorICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKgorICoJVGhpcyByb3V0aW5lcyBjaG9vc2Ugd2hhdCB0aGUgZmluYWwgZXZlbnQgbWFuYWdlciB3aWxsIGJlCisgKi8KKworI2luY2x1ZGUgPG1pbnQvY29va2llLmg+CisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKworI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX2F0YXJpa2V5cy5oIgorI2luY2x1ZGUgIlNETF9hdGFyaWV2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX2Jpb3NldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9nZW1kb3NldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9pa2JkZXZlbnRzX2MuaCIKKworZW51bSB7CisJTUNIX1NUPTAsCisJTUNIX1NURSwKKwlNQ0hfVFQsCisJTUNIX0YzMCwKKwlNQ0hfQ0xPTkUsCisJTUNIX0FSQU5ZTQorfTsKKworLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlcyBmcm9tIGEgY29uc29sZSBzY2FuY29kZSB0byBhIFNETCBrZXlzeW0gKi8KK3N0YXRpYyBTRExLZXkga2V5bWFwW0FUQVJJQklPU19NQVhLRVlTXTsKK3N0YXRpYyBjaGFyICprZXl0YWJfbm9ybWFsOworCit2b2lkICgqQXRhcmlfU2h1dGRvd25FdmVudHMpKHZvaWQpOworCitzdGF0aWMgdm9pZCBBdGFyaV9Jbml0aWFsaXplRXZlbnRzKF9USElTKQoreworCWNvbnN0IGNoYXIgKmVudnI7CisJbG9uZyBjb29raWVfbWNoOworCisJLyogVGVzdCBpZiB3ZSBhcmUgb24gYW4gQXRhcmkgbWFjaGluZSBvciBub3QgKi8KKwlpZiAoR2V0Y29va2llKENfX01DSCwgJmNvb2tpZV9tY2gpID09IENfTk9URk9VTkQpIHsKKwkJY29va2llX21jaCA9IDA7CisJfQorCWNvb2tpZV9tY2ggPj49IDE2OworCisJLyogRGVmYXVsdCBpcyBJa2JkLCB0aGUgZmFzdGVyIGV4Y2VwdCBmb3IgY2xvbmVzICovCisJc3dpdGNoKGNvb2tpZV9tY2gpIHsKKwkJY2FzZSBNQ0hfU1Q6CisJCWNhc2UgTUNIX1NURToKKwkJY2FzZSBNQ0hfVFQ6CisJCWNhc2UgTUNIX0YzMDoKKwkJY2FzZSBNQ0hfQVJBTllNOgorCQkJdGhpcy0+SW5pdE9TS2V5bWFwPUF0YXJpSWtiZF9Jbml0T1NLZXltYXA7CisJCQl0aGlzLT5QdW1wRXZlbnRzPUF0YXJpSWtiZF9QdW1wRXZlbnRzOworCQkJQXRhcmlfU2h1dGRvd25FdmVudHM9QXRhcmlJa2JkX1NodXRkb3duRXZlbnRzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aGlzLT5Jbml0T1NLZXltYXA9QXRhcmlHZW1kb3NfSW5pdE9TS2V5bWFwOworCQkJdGhpcy0+UHVtcEV2ZW50cz1BdGFyaUdlbWRvc19QdW1wRXZlbnRzOworCQkJQXRhcmlfU2h1dGRvd25FdmVudHM9QXRhcmlHZW1kb3NfU2h1dGRvd25FdmVudHM7CisJCQlicmVhazsKKwl9CisKKwllbnZyID0gU0RMX2dldGVudigiU0RMX0FUQVJJX0VWRU5UU0RSSVZFUiIpOworCisgCWlmICghZW52cikgeworCQlyZXR1cm47CisJfQorCisJaWYgKFNETF9zdHJjbXAoZW52ciwgImlrYmQiKSA9PSAwKSB7CisJCXRoaXMtPkluaXRPU0tleW1hcD1BdGFyaUlrYmRfSW5pdE9TS2V5bWFwOworCQl0aGlzLT5QdW1wRXZlbnRzPUF0YXJpSWtiZF9QdW1wRXZlbnRzOworCQlBdGFyaV9TaHV0ZG93bkV2ZW50cz1BdGFyaUlrYmRfU2h1dGRvd25FdmVudHM7CisJfQorCisJaWYgKFNETF9zdHJjbXAoZW52ciwgImdlbWRvcyIpID09IDApIHsKKwkJdGhpcy0+SW5pdE9TS2V5bWFwPUF0YXJpR2VtZG9zX0luaXRPU0tleW1hcDsKKwkJdGhpcy0+UHVtcEV2ZW50cz1BdGFyaUdlbWRvc19QdW1wRXZlbnRzOworCQlBdGFyaV9TaHV0ZG93bkV2ZW50cz1BdGFyaUdlbWRvc19TaHV0ZG93bkV2ZW50czsKKwl9CisKKwlpZiAoU0RMX3N0cmNtcChlbnZyLCAiYmlvcyIpID09IDApIHsKKwkJdGhpcy0+SW5pdE9TS2V5bWFwPUF0YXJpQmlvc19Jbml0T1NLZXltYXA7CisJCXRoaXMtPlB1bXBFdmVudHM9QXRhcmlCaW9zX1B1bXBFdmVudHM7CisJCUF0YXJpX1NodXRkb3duRXZlbnRzPUF0YXJpQmlvc19TaHV0ZG93bkV2ZW50czsKKwl9Cit9CisKK3ZvaWQgQXRhcmlfSW5pdE9TS2V5bWFwKF9USElTKQoreworCUF0YXJpX0luaXRpYWxpemVFdmVudHModGhpcyk7CisKKwlTRExfQXRhcmlfSW5pdEludGVybmFsS2V5bWFwKHRoaXMpOworCisJLyogQ2FsbCBjaG9vc2VuIHJvdXRpbmUgKi8KKwl0aGlzLT5Jbml0T1NLZXltYXAodGhpcyk7Cit9CisKK3ZvaWQgU0RMX0F0YXJpX0luaXRJbnRlcm5hbEtleW1hcChfVEhJUykKK3sKKwlpbnQgaTsKKwlfS0VZVEFCICprZXlfdGFibGVzOworCisJLyogUmVhZCBzeXN0ZW0gdGFibGVzIGZvciBzY2FuY29kZSAtPiBhc2NpaSB0cmFuc2xhdGlvbiAqLworCWtleV90YWJsZXMgPSAoX0tFWVRBQiAqKSBLZXl0YmwoS1RfTk9DSEFOR0UsIEtUX05PQ0hBTkdFLCBLVF9OT0NIQU5HRSk7CisJa2V5dGFiX25vcm1hbCA9IGtleV90YWJsZXMtPnVuc2hpZnQ7CisKKwkvKiBJbml0aWFsaXplIGtleW1hcCAqLworCWZvciAoIGk9MDsgaTxBVEFSSUJJT1NfTUFYS0VZUzsgaSsrICkKKwkJa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOworCisJLyogRnVuY3Rpb25zIGtleXMgKi8KKwlmb3IgKCBpID0gMDsgaTwxMDsgaSsrICkKKwkJa2V5bWFwW1NDQU5DT0RFX0YxICsgaV0gPSBTRExLX0YxK2k7CisKKwkvKiBDdXJzb3Iga2V5cGFkICovCisJa2V5bWFwW1NDQU5DT0RFX0hFTFBdID0gU0RMS19IRUxQOworCWtleW1hcFtTQ0FOQ09ERV9VTkRPXSA9IFNETEtfVU5ETzsKKwlrZXltYXBbU0NBTkNPREVfSU5TRVJUXSA9IFNETEtfSU5TRVJUOworCWtleW1hcFtTQ0FOQ09ERV9DTFJIT01FXSA9IFNETEtfSE9NRTsKKwlrZXltYXBbU0NBTkNPREVfVVBdID0gU0RMS19VUDsKKwlrZXltYXBbU0NBTkNPREVfRE9XTl0gPSBTRExLX0RPV047CisJa2V5bWFwW1NDQU5DT0RFX1JJR0hUXSA9IFNETEtfUklHSFQ7CisJa2V5bWFwW1NDQU5DT0RFX0xFRlRdID0gU0RMS19MRUZUOworCisJLyogU3BlY2lhbCBrZXlzICovCisJa2V5bWFwW1NDQU5DT0RFX0VTQ0FQRV0gPSBTRExLX0VTQ0FQRTsKKwlrZXltYXBbU0NBTkNPREVfQkFDS1NQQUNFXSA9IFNETEtfQkFDS1NQQUNFOworCWtleW1hcFtTQ0FOQ09ERV9UQUJdID0gU0RMS19UQUI7CisJa2V5bWFwW1NDQU5DT0RFX0VOVEVSXSA9IFNETEtfUkVUVVJOOworCWtleW1hcFtTQ0FOQ09ERV9ERUxFVEVdID0gU0RMS19ERUxFVEU7CisJa2V5bWFwW1NDQU5DT0RFX0xFRlRDT05UUk9MXSA9IFNETEtfTENUUkw7CisJa2V5bWFwW1NDQU5DT0RFX0xFRlRTSElGVF0gPSBTRExLX0xTSElGVDsKKwlrZXltYXBbU0NBTkNPREVfUklHSFRTSElGVF0gPSBTRExLX1JTSElGVDsKKwlrZXltYXBbU0NBTkNPREVfTEVGVEFMVF0gPSBTRExLX0xBTFQ7CisJa2V5bWFwW1NDQU5DT0RFX0NBUFNMT0NLXSA9IFNETEtfQ0FQU0xPQ0s7Cit9CisKK3ZvaWQgQXRhcmlfUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlBdGFyaV9Jbml0aWFsaXplRXZlbnRzKHRoaXMpOworCisJLyogQ2FsbCBjaG9vc2VuIHJvdXRpbmUgKi8KKwl0aGlzLT5QdW1wRXZlbnRzKHRoaXMpOworfQorCisvKiBBdGFyaSB0byBVbmljb2RlIGNoYXJzZXQgdHJhbnNsYXRpb24gdGFibGUgKi8KKworVWludDE2IFNETF9BdGFyaVRvVW5pY29kZVRhYmxlWzI1Nl09eworCS8qIFN0YW5kYXJkIEFTQ0lJIGNoYXJhY3RlcnMgZnJvbSAweDAwIHRvIDB4N2UgKi8KKwkvKiBVbmljb2RlIHN0dWZmIGZyb20gMHg3ZiB0byAweGZmICovCisKKwkweDAwMDAsMHgwMDAxLDB4MDAwMiwweDAwMDMsMHgwMDA0LDB4MDAwNSwweDAwMDYsMHgwMDA3LAorCTB4MDAwOCwweDAwMDksMHgwMDBBLDB4MDAwQiwweDAwMEMsMHgwMDBELDB4MDAwRSwweDAwMEYsCisJMHgwMDEwLDB4MDAxMSwweDAwMTIsMHgwMDEzLDB4MDAxNCwweDAwMTUsMHgwMDE2LDB4MDAxNywKKwkweDAwMTgsMHgwMDE5LDB4MDAxQSwweDAwMUIsMHgwMDFDLDB4MDAxRCwweDAwMUUsMHgwMDFGLAorCTB4MDAyMCwweDAwMjEsMHgwMDIyLDB4MDAyMywweDAwMjQsMHgwMDI1LDB4MDAyNiwweDAwMjcsCisJMHgwMDI4LDB4MDAyOSwweDAwMkEsMHgwMDJCLDB4MDAyQywweDAwMkQsMHgwMDJFLDB4MDAyRiwKKwkweDAwMzAsMHgwMDMxLDB4MDAzMiwweDAwMzMsMHgwMDM0LDB4MDAzNSwweDAwMzYsMHgwMDM3LAorCTB4MDAzOCwweDAwMzksMHgwMDNBLDB4MDAzQiwweDAwM0MsMHgwMDNELDB4MDAzRSwweDAwM0YsCisKKwkweDAwNDAsMHgwMDQxLDB4MDA0MiwweDAwNDMsMHgwMDQ0LDB4MDA0NSwweDAwNDYsMHgwMDQ3LAorCTB4MDA0OCwweDAwNDksMHgwMDRBLDB4MDA0QiwweDAwNEMsMHgwMDRELDB4MDA0RSwweDAwNEYsCisJMHgwMDUwLDB4MDA1MSwweDAwNTIsMHgwMDUzLDB4MDA1NCwweDAwNTUsMHgwMDU2LDB4MDA1NywKKwkweDAwNTgsMHgwMDU5LDB4MDA1QSwweDAwNUIsMHgwMDVDLDB4MDA1RCwweDAwNUUsMHgwMDVGLAorCTB4MDA2MCwweDAwNjEsMHgwMDYyLDB4MDA2MywweDAwNjQsMHgwMDY1LDB4MDA2NiwweDAwNjcsCisJMHgwMDY4LDB4MDA2OSwweDAwNkEsMHgwMDZCLDB4MDA2QywweDAwNkQsMHgwMDZFLDB4MDA2RiwKKwkweDAwNzAsMHgwMDcxLDB4MDA3MiwweDAwNzMsMHgwMDc0LDB4MDA3NSwweDAwNzYsMHgwMDc3LAorCTB4MDA3OCwweDAwNzksMHgwMDdBLDB4MDA3QiwweDAwN0MsMHgwMDdELDB4MDA3RSwweDAzOTQsCisKKwkweDAwQzcsMHgwMEZDLDB4MDBFOSwweDAwRTIsMHgwMEU0LDB4MDBFMCwweDAwRTUsMHgwMEU3LAorCTB4MDBFQSwweDAwRUIsMHgwMEU4LDB4MDBFRiwweDAwRUUsMHgwMEVDLDB4MDBDNCwweDAwQzUsCisJMHgwMEM5LDB4MDBFNiwweDAwQzYsMHgwMEY0LDB4MDBGNiwweDAwRjIsMHgwMEZCLDB4MDBGOSwKKwkweDAwRkYsMHgwMEQ2LDB4MDBEQywweDAwQTIsMHgwMEEzLDB4MDBBNSwweDAwREYsMHgwMTkyLAorCTB4MDBFMSwweDAwRUQsMHgwMEYzLDB4MDBGQSwweDAwRjEsMHgwMEQxLDB4MDBBQSwweDAwQkEsCisJMHgwMEJGLDB4MjMxMCwweDAwQUMsMHgwMEJELDB4MDBCQywweDAwQTEsMHgwMEFCLDB4MDBCQiwKKwkweDAwQzMsMHgwMEY1LDB4MDBEOCwweDAwRjgsMHgwMTUzLDB4MDE1MiwweDAwQzAsMHgwMEMzLAorCTB4MDBENSwweDAwQTgsMHgwMEI0LDB4MjAyMCwweDAwQjYsMHgwMEE5LDB4MDBBRSwweDIxMjIsCisKKwkweDAxMzMsMHgwMTMyLDB4MDVEMCwweDA1RDEsMHgwNUQyLDB4MDVEMywweDA1RDQsMHgwNUQ1LAorCTB4MDVENiwweDA1RDcsMHgwNUQ4LDB4MDVEOSwweDA1REIsMHgwNURDLDB4MDVERSwweDA1RTAsCisJMHgwNUUxLDB4MDVFMiwweDA1RTQsMHgwNUU2LDB4MDVFNywweDA1RTgsMHgwNUU5LDB4MDVFQSwKKwkweDA1REYsMHgwNURBLDB4MDVERCwweDA1RTMsMHgwNUU1LDB4MDBBNywweDIwMzgsMHgyMjFFLAorCTB4MDNCMSwweDAzQjIsMHgwMzkzLDB4MDNDMCwweDAzQTMsMHgwM0MzLDB4MDBCNSwweDAzQzQsCisJMHgwM0E2LDB4MDM5OCwweDAzQTksMHgwM0I0LDB4MjIyRSwweDAzQzYsMHgyMjA4LDB4MjIyOSwKKwkweDIyNjEsMHgwMEIxLDB4MjI2NSwweDIyNjQsMHgyMzIwLDB4MjMyMSwweDAwRjcsMHgyMjQ4LAorCTB4MDBCMCwweDIwMjIsMHgwMEI3LDB4MjIxQSwweDIwN0YsMHgwMEIyLDB4MDBCMywweDAwQUYKK307CisKK1NETF9rZXlzeW0gKlNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0sCisJU0RMX2Jvb2wgcHJlc3NlZCkKK3sKKwlpbnQgYXNjaWljb2RlID0gMDsKKworCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCisJa2V5c3ltLT5zY2FuY29kZSA9IHNjYW5jb2RlOworCWtleXN5bS0+bW9kID0gS01PRF9OT05FOworCWtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKKwlrZXlzeW0tPnVuaWNvZGUgPSAwOworCisJaWYgKGtleXN5bS0+c3ltID09IFNETEtfVU5LTk9XTikgeworCQlrZXlzeW0tPnN5bSA9IGFzY2lpY29kZSA9IGtleXRhYl9ub3JtYWxbc2NhbmNvZGVdOwkJCisJfQorCisJaWYgKFNETF9UcmFuc2xhdGVVTklDT0RFICYmIHByZXNzZWQpIHsKKwkJa2V5c3ltLT51bmljb2RlID0gU0RMX0F0YXJpVG9Vbmljb2RlVGFibGVbYXNjaWljb2RlXTsKKwl9CisKKwlyZXR1cm4oa2V5c3ltKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2RkODgyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlldmVudHNfYy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICoJQXRhcmkga2V5Ym9hcmQgZXZlbnRzIG1hbmFnZXIKKyAqCisgKglQYXRyaWNlIE1hbmRpbgorICovCisKKyNpZm5kZWYgX1NETF9BVEFSSV9FVkVOVFNfSF8KKyNkZWZpbmUgX1NETF9BVEFSSV9FVkVOVFNfSF8KKworI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKKyNkZWZpbmUgQVRBUklCSU9TX01BWEtFWVMgMTI4CisKK2V4dGVybiB2b2lkICgqQXRhcmlfU2h1dGRvd25FdmVudHMpKHZvaWQpOworCitleHRlcm4gdm9pZCBBdGFyaV9Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgQXRhcmlfUHVtcEV2ZW50cyhfVEhJUyk7CisKK2V4dGVybiB2b2lkIFNETF9BdGFyaV9Jbml0SW50ZXJuYWxLZXltYXAoX1RISVMpOworCisvKiBBdGFyaSB0byBVbmljb2RlIGNoYXJzZXQgdHJhbnNsYXRpb24gdGFibGUgKi8KK2V4dGVybiBVaW50MTYgU0RMX0F0YXJpVG9Vbmljb2RlVGFibGVbMjU2XTsKK1NETF9rZXlzeW0gKlNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0sCisJU0RMX2Jvb2wgcHJlc3NlZCk7CisKKyNlbmRpZiAvKiBfU0RMX0FUQVJJX0VWRU5UU19IXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlnbC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlnbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjI2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWdsLmMKQEAgLTAsMCArMSwxMDg2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQXRhcmkgT1NNZXNhLmxkZyBpbXBsZW1lbnRhdGlvbiBvZiBTREwgT3BlbkdMIHN1cHBvcnQgKi8KKworLyotLS0gSW5jbHVkZXMgLS0tKi8KKworI2lmIFNETF9WSURFT19PUEVOR0wKKyNpbmNsdWRlIDxHTC9vc21lc2EuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKworI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfYXRhcmlnbF9jLmgiCisjaWYgU0RMX1ZJREVPX09QRU5HTF9PU01FU0FfRFlOQU1JQworI2luY2x1ZGUgIlNETF9sb2Fkc28uaCIKKyNlbmRpZgorCisvKi0tLSBEZWZpbmVzIC0tLSovCisKKyNkZWZpbmUgUEFUSF9PU01FU0FfTERHCSJvc21lc2EubGRnIgorI2RlZmluZSBQQVRIX01FU0FHTF9MREcJIm1lc2FfZ2wubGRnIgorI2RlZmluZSBQQVRIX1RJTllHTF9MREcJInRpbnlfZ2wubGRnIgorCisjZGVmaW5lIFZESV9SR0IJMHhmCisKKy8qLS0tIEZ1bmN0aW9ucyBwcm90b3R5cGVzIC0tLSovCisKKyNpZiBTRExfVklERU9fT1BFTkdMCitzdGF0aWMgdm9pZCBTRExfQXRhcmlHTF9VbmxvYWRMaWJyYXJ5KF9USElTKTsKKworc3RhdGljIHZvaWQgQ29weVNoYWRvd051bGwoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIENvcHlTaGFkb3dEaXJlY3QoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUbzU1NShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlRvNTY1KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBDb3B5U2hhZG93UkdCU3dhcChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlRvQVJHQihfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlRvQUJHUihfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlRvQkdSQShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlRvUkdCQShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgQ29weVNoYWRvdzg4ODhUbzU1NShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgQ29weVNoYWRvdzg4ODhUbzU2NShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCitzdGF0aWMgdm9pZCBDb252ZXJ0TnVsbChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgQ29udmVydDU2NVRvNTU1YmUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIENvbnZlcnQ1NjVUbzU1NWxlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBDb252ZXJ0NTY1bGUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9BQkdSKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKK3N0YXRpYyBpbnQgSW5pdE5ldyhfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQpOworc3RhdGljIGludCBJbml0T2xkKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCk7CisjZW5kaWYKKworLyotLS0gUHVibGljIGZ1bmN0aW9ucyAtLS0qLworCitpbnQgU0RMX0F0YXJpR0xfSW5pdChfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCWlmIChnbF9vbGRtZXNhKSB7CisJCWdsX2FjdGl2ZSA9IEluaXRPbGQodGhpcywgY3VycmVudCk7CQkKKwl9IGVsc2UgeworCQlnbF9hY3RpdmUgPSBJbml0TmV3KHRoaXMsIGN1cnJlbnQpOwkJCisJfQorI2VuZGlmCisKKwlyZXR1cm4gKGdsX2FjdGl2ZSk7Cit9CisKK3ZvaWQgU0RMX0F0YXJpR0xfUXVpdChfVEhJUywgU0RMX2Jvb2wgdW5sb2FkKQoreworI2lmIFNETF9WSURFT19PUEVOR0wKKwlpZiAoZ2xfb2xkbWVzYSkgeworCQkvKiBPbGQgbWVzYSBpbXBsZW1lbnRhdGlvbnMgKi8KKwkJaWYgKHRoaXMtPmdsX2RhdGEtPk9TTWVzYURlc3Ryb3lMREcpIHsKKwkJCXRoaXMtPmdsX2RhdGEtPk9TTWVzYURlc3Ryb3lMREcoKTsKKwkJfQorCQlpZiAoZ2xfc2hhZG93KSB7CisJCQlNZnJlZShnbF9zaGFkb3cpOworCQkJZ2xfc2hhZG93ID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5ldyBtZXNhIGltcGxlbWVudGF0aW9uICovCisJCWlmIChnbF9jdHgpIHsKKwkJCWlmICh0aGlzLT5nbF9kYXRhLT5PU01lc2FEZXN0cm95Q29udGV4dCkgeworCQkJCXRoaXMtPmdsX2RhdGEtPk9TTWVzYURlc3Ryb3lDb250ZXh0KGdsX2N0eCk7CisJCQl9CisJCQlnbF9jdHggPSBOVUxMOworCQl9CisJfQorCisJaWYgKHVubG9hZCkgeworCQlTRExfQXRhcmlHTF9VbmxvYWRMaWJyYXJ5KHRoaXMpOworCX0KKworI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KKwlnbF9hY3RpdmUgPSAwOworfQorCitpbnQgU0RMX0F0YXJpR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCisjaWYgU0RMX1ZJREVPX09QRU5HTF9PU01FU0FfRFlOQU1JQworCXZvaWQgKmhhbmRsZTsKKwlTRExfYm9vbCBjYW5jZWxfbG9hZDsKKworCWlmIChnbF9hY3RpdmUpIHsKKwkJU0RMX1NldEVycm9yKCJPcGVuR0wgY29udGV4dCBhbHJlYWR5IGNyZWF0ZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFVubG9hZCBwcmV2aW91cyBkcml2ZXIgKi8KKwlTRExfQXRhcmlHTF9VbmxvYWRMaWJyYXJ5KHRoaXMpOworCisJLyogTG9hZCBsaWJyYXJ5IGdpdmVuIGJ5IHBhdGggKi8KKwloYW5kbGUgPSBTRExfTG9hZE9iamVjdChwYXRoKTsKKwlpZiAoaGFuZGxlID09IE5VTEwpIHsKKwkJLyogVHJ5IHRvIGxvYWQgYW5vdGhlciBvbmUgKi8KKwkJcGF0aCA9IFNETF9nZXRlbnYoIlNETF9WSURFT19HTF9EUklWRVIiKTsKKwkJaWYgKCBwYXRoICE9IE5VTEwgKSB7CisJCQloYW5kbGUgPSBTRExfTG9hZE9iamVjdChwYXRoKTsKKwkJfQorCisJCS8qIElmIGl0IGRvZXMgbm90IHdvcmssIHRyeSBzb21lIG90aGVyICovCisJCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQkJcGF0aCA9IFBBVEhfT1NNRVNBX0xERzsKKwkJCWhhbmRsZSA9IFNETF9Mb2FkT2JqZWN0KHBhdGgpOworCQl9CisKKwkJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCQlwYXRoID0gUEFUSF9NRVNBR0xfTERHOworCQkJaGFuZGxlID0gU0RMX0xvYWRPYmplY3QocGF0aCk7CisJCX0KKworCQlpZiAoaGFuZGxlID09IE5VTEwpIHsKKwkJCXBhdGggPSBQQVRIX1RJTllHTF9MREc7CisJCQloYW5kbGUgPSBTRExfTG9hZE9iamVjdChwYXRoKTsKKwkJfQorCX0KKworCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCBsb2FkIE9wZW5HTCBsaWJyYXJ5Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwl0aGlzLT5nbF9kYXRhLT5nbEdldEludGVnZXJ2ID0gU0RMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJnbEdldEludGVnZXJ2Iik7CisJdGhpcy0+Z2xfZGF0YS0+Z2xGaW5pc2ggPSBTRExfTG9hZEZ1bmN0aW9uKGhhbmRsZSwgImdsRmluaXNoIik7CisJdGhpcy0+Z2xfZGF0YS0+Z2xGbHVzaCA9IFNETF9Mb2FkRnVuY3Rpb24oaGFuZGxlLCAiZ2xGbHVzaCIpOworCisJY2FuY2VsX2xvYWQgPSBTRExfRkFMU0U7CisJaWYgKHRoaXMtPmdsX2RhdGEtPmdsR2V0SW50ZWdlcnYgPT0gTlVMTCkgeworCQljYW5jZWxfbG9hZCA9IFNETF9UUlVFOworCX0gZWxzZSB7CisJCS8qIFdlIG5lZWQgZWl0aGVyIGdsRmluaXNoIChPU01lc2EpIG9yIGdsRmx1c2ggKFRpbnlHTCkgKi8KKwkJaWYgKCh0aGlzLT5nbF9kYXRhLT5nbEZpbmlzaCA9PSBOVUxMKSAmJgorCQkJKHRoaXMtPmdsX2RhdGEtPmdsRmx1c2ggPT0gTlVMTCkpIHsKKwkJCQljYW5jZWxfbG9hZCA9IFNETF9UUlVFOworCQl9CisJfQorCWlmIChjYW5jZWxfbG9hZCkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCByZXRyaWV2ZSBPcGVuR0wgZnVuY3Rpb25zIik7CisJCVNETF9VbmxvYWRPYmplY3QoaGFuZGxlKTsKKwkJLyogUmVzdG9yZSBwb2ludGVycyB0byBzdGF0aWMgbGlicmFyeSAqLworCQlTRExfQXRhcmlHTF9Jbml0UG9pbnRlcnModGhpcyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBMb2FkIGZ1bmN0aW9ucyBwb2ludGVycyAob3NtZXNhLmxkZykgKi8KKwl0aGlzLT5nbF9kYXRhLT5PU01lc2FDcmVhdGVDb250ZXh0RXh0ID0gU0RMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJPU01lc2FDcmVhdGVDb250ZXh0RXh0Iik7CisJdGhpcy0+Z2xfZGF0YS0+T1NNZXNhRGVzdHJveUNvbnRleHQgPSBTRExfTG9hZEZ1bmN0aW9uKGhhbmRsZSwgIk9TTWVzYURlc3Ryb3lDb250ZXh0Iik7CisJdGhpcy0+Z2xfZGF0YS0+T1NNZXNhTWFrZUN1cnJlbnQgPSBTRExfTG9hZEZ1bmN0aW9uKGhhbmRsZSwgIk9TTWVzYU1ha2VDdXJyZW50Iik7CisJdGhpcy0+Z2xfZGF0YS0+T1NNZXNhUGl4ZWxTdG9yZSA9IFNETF9Mb2FkRnVuY3Rpb24oaGFuZGxlLCAiT1NNZXNhUGl4ZWxTdG9yZSIpOworCXRoaXMtPmdsX2RhdGEtPk9TTWVzYUdldFByb2NBZGRyZXNzID0gU0RMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJPU01lc2FHZXRQcm9jQWRkcmVzcyIpOworCisJLyogTG9hZCBvbGQgZnVuY3Rpb25zIHBvaW50ZXJzIChtZXNhX2dsLmxkZywgdGlueV9nbC5sZGcpICovCisJdGhpcy0+Z2xfZGF0YS0+T1NNZXNhQ3JlYXRlTERHID0gU0RMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJPU01lc2FDcmVhdGVMREciKTsKKwl0aGlzLT5nbF9kYXRhLT5PU01lc2FEZXN0cm95TERHID0gU0RMX0xvYWRGdW5jdGlvbihoYW5kbGUsICJPU01lc2FEZXN0cm95TERHIik7CisKKwlnbF9vbGRtZXNhID0gMDsKKworCWlmICggKHRoaXMtPmdsX2RhdGEtPk9TTWVzYUNyZWF0ZUNvbnRleHRFeHQgPT0gTlVMTCkgfHwgCisJICAgICAodGhpcy0+Z2xfZGF0YS0+T1NNZXNhRGVzdHJveUNvbnRleHQgPT0gTlVMTCkgfHwKKwkgICAgICh0aGlzLT5nbF9kYXRhLT5PU01lc2FNYWtlQ3VycmVudCA9PSBOVUxMKSB8fAorCSAgICAgKHRoaXMtPmdsX2RhdGEtPk9TTWVzYVBpeGVsU3RvcmUgPT0gTlVMTCkgfHwKKwkgICAgICh0aGlzLT5nbF9kYXRhLT5PU01lc2FHZXRQcm9jQWRkcmVzcyA9PSBOVUxMKSkgeworCQkvKiBIdW0sIG1heWJlIG9sZCBsaWJyYXJ5ID8gKi8KKwkJaWYgKCAodGhpcy0+Z2xfZGF0YS0+T1NNZXNhQ3JlYXRlTERHID09IE5VTEwpIHx8IAorCQkgICAgICh0aGlzLT5nbF9kYXRhLT5PU01lc2FEZXN0cm95TERHID09IE5VTEwpKSB7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCByZXRyaWV2ZSBPU01lc2EgZnVuY3Rpb25zIik7CisJCQlTRExfVW5sb2FkT2JqZWN0KGhhbmRsZSk7CisJCQkvKiBSZXN0b3JlIHBvaW50ZXJzIHRvIHN0YXRpYyBsaWJyYXJ5ICovCisJCQlTRExfQXRhcmlHTF9Jbml0UG9pbnRlcnModGhpcyk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlnbF9vbGRtZXNhID0gMTsKKwkJfQorCX0KKworCXRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlID0gaGFuZGxlOworCWlmICggcGF0aCApIHsKKwkJU0RMX3N0cmxjcHkodGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoLCBwYXRoLAorCQkJU0RMX2FycmF5c2l6ZSh0aGlzLT5nbF9jb25maWcuZHJpdmVyX3BhdGgpKTsKKwl9IGVsc2UgeworCQkqdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoID0gJ1wwJzsKKwl9CisKKyNlbmRpZgorCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMTsKKworCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gLTE7CisjZW5kaWYKK30KKwordm9pZCAqU0RMX0F0YXJpR0xfR2V0UHJvY0FkZHJlc3MoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpCit7CisJdm9pZCAqZnVuYyA9IE5VTEw7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCisJaWYgKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKSB7CisJCWZ1bmMgPSBTRExfTG9hZEZ1bmN0aW9uKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlLCAodm9pZCAqKXByb2MpOworCX0gZWxzZSBpZiAodGhpcy0+Z2xfZGF0YS0+T1NNZXNhR2V0UHJvY0FkZHJlc3MpIHsKKwkJZnVuYyA9IHRoaXMtPmdsX2RhdGEtPk9TTWVzYUdldFByb2NBZGRyZXNzKHByb2MpOworCX0KKworI2VuZGlmCisJcmV0dXJuIGZ1bmM7Cit9CisKK2ludCBTRExfQXRhcmlHTF9HZXRBdHRyaWJ1dGUoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKQoreworI2lmIFNETF9WSURFT19PUEVOR0wKKwlHTGVudW0gbWVzYV9hdHRyaWI7CisJU0RMX1N1cmZhY2UgKnN1cmZhY2U7CisKKwlpZiAoIWdsX2FjdGl2ZSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJc3dpdGNoKGF0dHJpYikgeworCQljYXNlIFNETF9HTF9SRURfU0laRToKKwkJCW1lc2FfYXR0cmliID0gR0xfUkVEX0JJVFM7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfR1JFRU5fU0laRToKKwkJCW1lc2FfYXR0cmliID0gR0xfR1JFRU5fQklUUzsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9CTFVFX1NJWkU6CisJCQltZXNhX2F0dHJpYiA9IEdMX0JMVUVfQklUUzsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9BTFBIQV9TSVpFOgorCQkJbWVzYV9hdHRyaWIgPSBHTF9BTFBIQV9CSVRTOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX0dMX0RPVUJMRUJVRkZFUjoKKwkJCXN1cmZhY2UgPSB0aGlzLT5zY3JlZW47CisJCQkqdmFsdWUgPSAoKHN1cmZhY2UtPmZsYWdzICYgU0RMX0RPVUJMRUJVRik9PVNETF9ET1VCTEVCVUYpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgU0RMX0dMX0RFUFRIX1NJWkU6CisJCQltZXNhX2F0dHJpYiA9IEdMX0RFUFRIX0JJVFM7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfU1RFTkNJTF9TSVpFOgorCQkJbWVzYV9hdHRyaWIgPSBHTF9TVEVOQ0lMX0JJVFM7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfQUNDVU1fUkVEX1NJWkU6CisJCQltZXNhX2F0dHJpYiA9IEdMX0FDQ1VNX1JFRF9CSVRTOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkU6CisJCQltZXNhX2F0dHJpYiA9IEdMX0FDQ1VNX0dSRUVOX0JJVFM7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfQUNDVU1fQkxVRV9TSVpFOgorCQkJbWVzYV9hdHRyaWIgPSBHTF9BQ0NVTV9CTFVFX0JJVFM7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfQUNDVU1fQUxQSEFfU0laRToKKwkJCW1lc2FfYXR0cmliID0gR0xfQUNDVU1fQUxQSEFfQklUUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXJldHVybiAtMTsKKwl9CisKKwl0aGlzLT5nbF9kYXRhLT5nbEdldEludGVnZXJ2KG1lc2FfYXR0cmliLCB2YWx1ZSk7CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiAtMTsKKyNlbmRpZgorfQorCitpbnQgU0RMX0F0YXJpR0xfTWFrZUN1cnJlbnQoX1RISVMpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCVNETF9TdXJmYWNlICpzdXJmYWNlOworCUdMZW51bSB0eXBlOworCisJaWYgKGdsX29sZG1lc2EgJiYgZ2xfYWN0aXZlKSB7CisJCXJldHVybiAwOworCX0KKworCWlmICh0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSkgeworCQlpZiAoKHRoaXMtPmdsX2RhdGEtPk9TTWVzYU1ha2VDdXJyZW50ID09IE5VTEwpIHx8CisJCQkodGhpcy0+Z2xfZGF0YS0+T1NNZXNhUGl4ZWxTdG9yZSA9PSBOVUxMKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKCFnbF9hY3RpdmUpIHsKKwkJU0RMX1NldEVycm9yKCJJbnZhbGlkIE9wZW5HTCBjb250ZXh0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdXJmYWNlID0gdGhpcy0+c2NyZWVuOworCQorCWlmICgoc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gMTUpIHx8IChzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA9PSAxNikpIHsKKwkJdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OworCX0gZWxzZSB7CisJCXR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworCX0KKworCWlmICghKHRoaXMtPmdsX2RhdGEtPk9TTWVzYU1ha2VDdXJyZW50KGdsX2N0eCwgc3VyZmFjZS0+cGl4ZWxzLCB0eXBlLCBzdXJmYWNlLT53LCBzdXJmYWNlLT5oKSkpIHsKKwkJU0RMX1NldEVycm9yKCJDYW4gbm90IG1ha2UgT3BlbkdMIGNvbnRleHQgY3VycmVudCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogT1NNZXNhIGRyYXdzIHVwc2lkZSBkb3duICovCisJdGhpcy0+Z2xfZGF0YS0+T1NNZXNhUGl4ZWxTdG9yZShPU01FU0FfWV9VUCwgMCk7CisKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC0xOworI2VuZGlmCit9CisKK3ZvaWQgU0RMX0F0YXJpR0xfU3dhcEJ1ZmZlcnMoX1RISVMpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCWlmIChnbF9hY3RpdmUpIHsKKwkJaWYgKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKSB7CisJCQlpZiAodGhpcy0+Z2xfZGF0YS0+Z2xGaW5pc2gpIHsKKwkJCQl0aGlzLT5nbF9kYXRhLT5nbEZpbmlzaCgpOworCQkJfSBlbHNlIGlmICh0aGlzLT5nbF9kYXRhLT5nbEZsdXNoKSB7CisJCQkJdGhpcy0+Z2xfZGF0YS0+Z2xGbHVzaCgpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy0+Z2xfZGF0YS0+Z2xGaW5pc2goKTsKKwkJfQorCQlnbF9jb3B5c2hhZG93KHRoaXMsIHRoaXMtPnNjcmVlbik7CisJCWdsX2NvbnZlcnQodGhpcywgdGhpcy0+c2NyZWVuKTsKKwl9CisjZW5kaWYKK30KKwordm9pZCBTRExfQXRhcmlHTF9Jbml0UG9pbnRlcnMoX1RISVMpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCXRoaXMtPmdsX2RhdGEtPk9TTWVzYUNyZWF0ZUNvbnRleHRFeHQgPSBPU01lc2FDcmVhdGVDb250ZXh0RXh0OworCXRoaXMtPmdsX2RhdGEtPk9TTWVzYURlc3Ryb3lDb250ZXh0ID0gT1NNZXNhRGVzdHJveUNvbnRleHQ7CisJdGhpcy0+Z2xfZGF0YS0+T1NNZXNhTWFrZUN1cnJlbnQgPSBPU01lc2FNYWtlQ3VycmVudDsKKwl0aGlzLT5nbF9kYXRhLT5PU01lc2FQaXhlbFN0b3JlID0gT1NNZXNhUGl4ZWxTdG9yZTsKKwl0aGlzLT5nbF9kYXRhLT5PU01lc2FHZXRQcm9jQWRkcmVzcyA9IE9TTWVzYUdldFByb2NBZGRyZXNzOworCisJdGhpcy0+Z2xfZGF0YS0+Z2xHZXRJbnRlZ2VydiA9IGdsR2V0SW50ZWdlcnY7CisJdGhpcy0+Z2xfZGF0YS0+Z2xGaW5pc2ggPSBnbEZpbmlzaDsKKwl0aGlzLT5nbF9kYXRhLT5nbEZsdXNoID0gZ2xGbHVzaDsKKworCXRoaXMtPmdsX2RhdGEtPk9TTWVzYUNyZWF0ZUxERyA9IE5VTEw7CisJdGhpcy0+Z2xfZGF0YS0+T1NNZXNhRGVzdHJveUxERyA9IE5VTEw7CisjZW5kaWYKK30KKworLyotLS0gUHJpdmF0ZSBmdW5jdGlvbnMgLS0tKi8KKworI2lmIFNETF9WSURFT19PUEVOR0wKK3N0YXRpYyB2b2lkIFNETF9BdGFyaUdMX1VubG9hZExpYnJhcnkoX1RISVMpCit7CisJaWYgKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKSB7CisJCVNETF9VbmxvYWRPYmplY3QodGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUpOworCQl0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IE5VTEw7CisKKwkJLyogUmVzdG9yZSBwb2ludGVycyB0byBzdGF0aWMgbGlicmFyeSAqLworCQlTRExfQXRhcmlHTF9Jbml0UG9pbnRlcnModGhpcyk7CisJfQorfQorCisvKi0tLSBDcmVhdGlvbiBvZiBhbiBPcGVuR0wgY29udGV4dCB1c2luZyBuZXcvb2xkIGZ1bmN0aW9ucyAtLS0qLworCitzdGF0aWMgaW50IEluaXROZXcoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50KQoreworCUdMZW51bSBvc21lc2FfZm9ybWF0OworCVNETF9QaXhlbEZvcm1hdCAqcGl4ZWxfZm9ybWF0OworCVVpbnQzMglyZWRtYXNrOworCWludCByZWNyZWF0ZWNvbnRleHQ7CisJR0xpbnQgbmV3YWNjdW1zaXplOworCisJaWYgKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKSB7CisJCWlmICh0aGlzLT5nbF9kYXRhLT5PU01lc2FDcmVhdGVDb250ZXh0RXh0ID09IE5VTEwpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogSW5pdCBPcGVuR0wgY29udGV4dCB1c2luZyBPU01lc2EgKi8KKwlnbF9jb252ZXJ0ID0gQ29udmVydE51bGw7CisJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dOdWxsOworCWdsX3Vwc2lkZWRvd24gPSBTRExfRkFMU0U7CisKKwlwaXhlbF9mb3JtYXQgPSBjdXJyZW50LT5mb3JtYXQ7CisJcmVkbWFzayA9IHBpeGVsX2Zvcm1hdC0+Um1hc2s7CisJc3dpdGNoIChwaXhlbF9mb3JtYXQtPkJpdHNQZXJQaXhlbCkgeworCQljYXNlIDE1OgorCQkJLyogMTU1NSwgYmlnIGFuZCBsaXR0bGUgZW5kaWFuLCB1bnN1cHBvcnRlZCAqLworCQkJZ2xfcGl4ZWxzaXplID0gMjsKKwkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfUkdCXzU2NTsKKwkJCWlmIChyZWRtYXNrID09IDMxPDwxMCkgeworCQkJCWdsX2NvbnZlcnQgPSBDb252ZXJ0NTY1VG81NTViZTsKKwkJCX0gZWxzZSB7CisJCQkJZ2xfY29udmVydCA9IENvbnZlcnQ1NjVUbzU1NWxlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlnbF9waXhlbHNpemUgPSAyOworCQkJaWYgKHJlZG1hc2sgPT0gMzE8PDExKSB7CisJCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9SR0JfNTY1OworCQkJfSBlbHNlIHsKKwkJCQkvKiA1NjUsIGxpdHRsZSBlbmRpYW4sIHVuc3VwcG9ydGVkICovCisJCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9SR0JfNTY1OworCQkJCWdsX2NvbnZlcnQgPSBDb252ZXJ0NTY1bGU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCWdsX3BpeGVsc2l6ZSA9IDM7CisJCQlpZiAocmVkbWFzayA9PSAyNTU8PDE2KSB7CisJCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9SR0I7CisJCQl9IGVsc2UgeworCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfQkdSOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlnbF9waXhlbHNpemUgPSA0OworCQkJaWYgKHJlZG1hc2sgPT0gMjU1PDwxNikgeworCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfQVJHQjsKKwkJCX0gZWxzZSBpZiAocmVkbWFzayA9PSAyNTU8PDgpIHsKKwkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX0JHUkE7CisJCQl9IGVsc2UgaWYgKHJlZG1hc2sgPT0gMjU1PDwyNCkgeworCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfUkdCQTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQUJHUiBmb3JtYXQgdW5zdXBwb3J0ZWQgKi8KKwkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX0JHUkE7CisJCQkJZ2xfY29udmVydCA9IENvbnZlcnRCR1JBVG9BQkdSOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnbF9waXhlbHNpemUgPSAxOworCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9DT0xPUl9JTkRFWDsKKwkJCWJyZWFrOworCX0KKworCS8qIFRyeSB0byBrZWVwIGN1cnJlbnQgY29udGV4dCBpZiBwb3NzaWJsZSAqLworCW5ld2FjY3Vtc2l6ZSA9CisJCXRoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZSArCisJCXRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplICsKKwkJdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2JsdWVfc2l6ZSArCisJCXRoaXMtPmdsX2NvbmZpZy5hY2N1bV9hbHBoYV9zaXplOworCXJlY3JlYXRlY29udGV4dD0xOworCWlmIChnbF9jdHggJiYKKwkJKGdsX2N1cmZvcm1hdCA9PSBvc21lc2FfZm9ybWF0KSAmJgorCQkoZ2xfY3VyZGVwdGggPT0gdGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemUpICYmCisJCShnbF9jdXJzdGVuY2lsID09IHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemUpICYmCisJCShnbF9jdXJhY2N1bSA9PSBuZXdhY2N1bXNpemUpKSB7CisJCXJlY3JlYXRlY29udGV4dCA9IDA7CisJfQorCWlmIChyZWNyZWF0ZWNvbnRleHQpIHsKKwkJU0RMX0F0YXJpR0xfUXVpdCh0aGlzLCBTRExfRkFMU0UpOworCisJCWdsX2N0eCA9IHRoaXMtPmdsX2RhdGEtPk9TTWVzYUNyZWF0ZUNvbnRleHRFeHQoCisJCQlvc21lc2FfZm9ybWF0LCB0aGlzLT5nbF9jb25maWcuZGVwdGhfc2l6ZSwKKwkJCXRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemUsIG5ld2FjY3Vtc2l6ZSwgTlVMTCApOworCisJCWlmIChnbF9jdHgpIHsKKwkJCWdsX2N1cmZvcm1hdCA9IG9zbWVzYV9mb3JtYXQ7CisJCQlnbF9jdXJkZXB0aCA9IHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplOworCQkJZ2xfY3Vyc3RlbmNpbCA9IHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemU7CisJCQlnbF9jdXJhY2N1bSA9IG5ld2FjY3Vtc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWdsX2N1cmZvcm1hdCA9IDA7CisJCQlnbF9jdXJkZXB0aCA9IDA7CisJCQlnbF9jdXJzdGVuY2lsID0gMDsKKwkJCWdsX2N1cmFjY3VtID0gMDsKKwkJfQorCX0KKworCXJldHVybiAoZ2xfY3R4ICE9IE5VTEwpOworfQorCisKK3N0YXRpYyBpbnQgSW5pdE9sZChfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQpCit7CisJR0xlbnVtIG9zbWVzYV9mb3JtYXQ7CisJU0RMX1BpeGVsRm9ybWF0ICpwaXhlbF9mb3JtYXQ7CisJVWludDMyCXJlZG1hc2s7CisJaW50IHJlY3JlYXRlY29udGV4dCwgdGlueWdsX3ByZXNlbnQ7CisKKwlpZiAodGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUpIHsKKwkJaWYgKHRoaXMtPmdsX2RhdGEtPk9TTWVzYUNyZWF0ZUxERyA9PSBOVUxMKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIFRpbnlHTCBvbmx5IHN1cHBvcnRzIFZESV9SR0IgKE9TTUVTQV9SR0IpICovCisJdGlueWdsX3ByZXNlbnQ9MDsKKwlpZiAodGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUpIHsKKwkJaWYgKHRoaXMtPmdsX2RhdGEtPmdsRmluaXNoID09IE5VTEwpIHsKKwkJCXRpbnlnbF9wcmVzZW50PTE7CisJCX0KKwl9CisKKwkvKiBJbml0IE9wZW5HTCBjb250ZXh0IHVzaW5nIE9TTWVzYSAqLworCWdsX2NvbnZlcnQgPSBDb252ZXJ0TnVsbDsKKwlnbF9jb3B5c2hhZG93ID0gQ29weVNoYWRvd051bGw7CisJZ2xfdXBzaWRlZG93biA9IFNETF9GQUxTRTsKKworCXBpeGVsX2Zvcm1hdCA9IGN1cnJlbnQtPmZvcm1hdDsKKwlyZWRtYXNrID0gcGl4ZWxfZm9ybWF0LT5SbWFzazsKKwlzd2l0Y2ggKHBpeGVsX2Zvcm1hdC0+Qml0c1BlclBpeGVsKSB7CisJCWNhc2UgMTU6CisJCQkvKiAxNSBiaXRzIHVuc3VwcG9ydGVkICovCisJCQlpZiAodGlueWdsX3ByZXNlbnQpIHsKKwkJCQlnbF9waXhlbHNpemUgPSAzOworCQkJCW9zbWVzYV9mb3JtYXQgPSBWRElfUkdCOworCQkJCWlmIChyZWRtYXNrID09IDMxPDwxMCkgeworCQkJCQlnbF9jb3B5c2hhZG93ID0gQ29weVNoYWRvd1JHQlRvNTU1OworCQkJCX0gZWxzZSB7CisJCQkJCWdsX2NvcHlzaGFkb3cgPSBDb3B5U2hhZG93UkdCVG81NjU7CisJCQkJCWdsX2NvbnZlcnQgPSBDb252ZXJ0NTY1VG81NTVsZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWdsX3BpeGVsc2l6ZSA9IDQ7CisJCQkJZ2xfdXBzaWRlZG93biA9IFNETF9UUlVFOworCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfQVJHQjsKKwkJCQlpZiAocmVkbWFzayA9PSAzMTw8MTApIHsKKwkJCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3c4ODg4VG81NTU7CisJCQkJfSBlbHNlIHsKKwkJCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3c4ODg4VG81NjU7CisJCQkJCWdsX2NvbnZlcnQgPSBDb252ZXJ0NTY1VG81NTVsZTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCS8qIDE2IGJpdHMgdW5zdXBwb3J0ZWQgKi8KKwkJCWlmICh0aW55Z2xfcHJlc2VudCkgeworCQkJCWdsX3BpeGVsc2l6ZSA9IDM7CisJCQkJb3NtZXNhX2Zvcm1hdCA9IFZESV9SR0I7CisJCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dSR0JUbzU2NTsKKwkJCQlpZiAocmVkbWFzayAhPSAzMTw8MTEpIHsKKwkJCQkJLyogNTY1LCBsaXR0bGUgZW5kaWFuLCB1bnN1cHBvcnRlZCAqLworCQkJCQlnbF9jb252ZXJ0ID0gQ29udmVydDU2NWxlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZ2xfcGl4ZWxzaXplID0gNDsKKwkJCQlnbF91cHNpZGVkb3duID0gU0RMX1RSVUU7CisJCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9BUkdCOworCQkJCWdsX2NvcHlzaGFkb3cgPSBDb3B5U2hhZG93ODg4OFRvNTY1OworCQkJCWlmIChyZWRtYXNrICE9IDMxPDwxMSkgeworCQkJCQkvKiA1NjUsIGxpdHRsZSBlbmRpYW4sIHVuc3VwcG9ydGVkICovCisJCQkJCWdsX2NvbnZlcnQgPSBDb252ZXJ0NTY1bGU7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQlnbF9waXhlbHNpemUgPSAzOworCQkJaWYgKHRpbnlnbF9wcmVzZW50KSB7CisJCQkJb3NtZXNhX2Zvcm1hdCA9IFZESV9SR0I7CisJCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dEaXJlY3Q7CisJCQkJaWYgKHJlZG1hc2sgIT0gMjU1PDwxNikgeworCQkJCQlnbF9jb3B5c2hhZG93ID0gQ29weVNoYWRvd1JHQlN3YXA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlnbF9jb3B5c2hhZG93ID0gQ29weVNoYWRvd0RpcmVjdDsKKwkJCQlnbF91cHNpZGVkb3duID0gU0RMX1RSVUU7CisJCQkJaWYgKHJlZG1hc2sgPT0gMjU1PDwxNikgeworCQkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX1JHQjsKKwkJCQl9IGVsc2UgeworCQkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX0JHUjsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCWlmICh0aW55Z2xfcHJlc2VudCkgeworCQkJCWdsX3BpeGVsc2l6ZSA9IDM7CisJCQkJb3NtZXNhX2Zvcm1hdCA9IFZESV9SR0I7CisJCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dSR0JUb0FSR0I7CisJCQkJaWYgKHJlZG1hc2sgPT0gMjU1KSB7CisJCQkJCWdsX2NvbnZlcnQgPSBDb3B5U2hhZG93UkdCVG9BQkdSOworCQkJCX0gZWxzZSBpZiAocmVkbWFzayA9PSAyNTU8PDgpIHsKKwkJCQkJZ2xfY29udmVydCA9IENvcHlTaGFkb3dSR0JUb0JHUkE7CisJCQkJfSBlbHNlIGlmIChyZWRtYXNrID09IDI1NTw8MjQpIHsKKwkJCQkJZ2xfY29udmVydCA9IENvcHlTaGFkb3dSR0JUb1JHQkE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlnbF9waXhlbHNpemUgPSA0OworCQkJCWdsX3Vwc2lkZWRvd24gPSBTRExfVFJVRTsKKwkJCQlnbF9jb3B5c2hhZG93ID0gQ29weVNoYWRvd0RpcmVjdDsKKwkJCQlpZiAocmVkbWFzayA9PSAyNTU8PDE2KSB7CisJCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfQVJHQjsKKwkJCQl9IGVsc2UgaWYgKHJlZG1hc2sgPT0gMjU1PDw4KSB7CisJCQkJCW9zbWVzYV9mb3JtYXQgPSBPU01FU0FfQkdSQTsKKwkJCQl9IGVsc2UgaWYgKHJlZG1hc2sgPT0gMjU1PDwyNCkgeworCQkJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX1JHQkE7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogQUJHUiBmb3JtYXQgdW5zdXBwb3J0ZWQgKi8KKwkJCQkJb3NtZXNhX2Zvcm1hdCA9IE9TTUVTQV9CR1JBOworCQkJCQlnbF9jb252ZXJ0ID0gQ29udmVydEJHUkFUb0FCR1I7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAodGlueWdsX3ByZXNlbnQpIHsKKwkJCQlTRExfQXRhcmlHTF9RdWl0KHRoaXMsIFNETF9GQUxTRSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlnbF9waXhlbHNpemUgPSAxOworCQkJZ2xfY29weXNoYWRvdyA9IENvcHlTaGFkb3dEaXJlY3Q7CisJCQlvc21lc2FfZm9ybWF0ID0gT1NNRVNBX0NPTE9SX0lOREVYOworCQkJYnJlYWs7CisJfQorCisJLyogVHJ5IHRvIGtlZXAgY3VycmVudCBjb250ZXh0IGlmIHBvc3NpYmxlICovCisJcmVjcmVhdGVjb250ZXh0PTE7CisJaWYgKGdsX3NoYWRvdyAmJgorCQkoZ2xfY3VyZm9ybWF0ID09IG9zbWVzYV9mb3JtYXQpICYmCisJCShnbF9jdXJ3aWR0aCA9PSBjdXJyZW50LT53KSAmJgorCQkoZ2xfY3VyaGVpZ2h0ID09IGN1cnJlbnQtPmgpKSB7CisJCXJlY3JlYXRlY29udGV4dCA9IDA7CisJfQorCWlmIChyZWNyZWF0ZWNvbnRleHQpIHsKKwkJU0RMX0F0YXJpR0xfUXVpdCh0aGlzLCBTRExfRkFMU0UpOworCisJCWdsX3NoYWRvdyA9IHRoaXMtPmdsX2RhdGEtPk9TTWVzYUNyZWF0ZUxERygKKwkJCW9zbWVzYV9mb3JtYXQsIEdMX1VOU0lHTkVEX0JZVEUsIGN1cnJlbnQtPncsIGN1cnJlbnQtPmgKKwkJKTsKKworCQlpZiAoZ2xfc2hhZG93KSB7CisJCQlnbF9jdXJmb3JtYXQgPSBvc21lc2FfZm9ybWF0OworCQkJZ2xfY3Vyd2lkdGggPSBjdXJyZW50LT53OworCQkJZ2xfY3VyaGVpZ2h0ID0gY3VycmVudC0+aDsKKwkJfSBlbHNlIHsKKwkJCWdsX2N1cmZvcm1hdCA9IDA7CisJCQlnbF9jdXJ3aWR0aCA9IDA7CisJCQlnbF9jdXJoZWlnaHQgPSAwOworCQl9CisJfQorCisJcmV0dXJuIChnbF9zaGFkb3cgIT0gTlVMTCk7Cit9CisKKy8qLS0tIENvbnZlcnNpb25zIHJvdXRpbmVzIGZyb20gc2hhZG93IGJ1ZmZlciB0byB0aGUgc2NyZWVuIC0tLSovCisKK3N0YXRpYyB2b2lkIENvcHlTaGFkb3dOdWxsKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKK30KKworc3RhdGljIHZvaWQgQ29weVNoYWRvd0RpcmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaW50IHksIHNyY3BpdGNoLCBkc3RwaXRjaDsKKwlVaW50OCAqc3JjbGluZSwgKmRzdGxpbmU7CisKKwlzcmNsaW5lID0gZ2xfc2hhZG93OworCXNyY3BpdGNoID0gc3VyZmFjZS0+dyAqIGdsX3BpeGVsc2l6ZTsKKwlkc3RsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOworCWRzdHBpdGNoID0gc3VyZmFjZS0+cGl0Y2g7CisJaWYgKGdsX3Vwc2lkZWRvd24pIHsKKwkJc3JjbGluZSArPSAoc3VyZmFjZS0+aC0xKSpzcmNwaXRjaDsKKwkJc3JjcGl0Y2ggPSAtc3JjcGl0Y2g7CisJfQorCisJZm9yICh5PTA7IHk8c3VyZmFjZS0+aDsgeSsrKSB7CisJCVNETF9tZW1jcHkoZHN0bGluZSwgc3JjbGluZSwgc3JjcGl0Y2gpOworCisJCXNyY2xpbmUgKz0gc3JjcGl0Y2g7CisJCWRzdGxpbmUgKz0gZHN0cGl0Y2g7CisJfQorfQorCitzdGF0aWMgdm9pZCBDb3B5U2hhZG93UkdCVG81NTUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWludCB4LHksIHNyY3BpdGNoLCBkc3RwaXRjaDsKKwlVaW50MTYgKmRzdGxpbmUsICpkc3Rjb2w7CisJVWludDggKnNyY2xpbmUsICpzcmNjb2w7CisKKwlzcmNsaW5lID0gKFVpbnQ4ICopZ2xfc2hhZG93OworCXNyY3BpdGNoID0gc3VyZmFjZS0+dyAqIGdsX3BpeGVsc2l6ZTsKKwlkc3RsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOworCWRzdHBpdGNoID0gc3VyZmFjZS0+cGl0Y2ggPj4xOworCWlmIChnbF91cHNpZGVkb3duKSB7CisJCXNyY2xpbmUgKz0gKHN1cmZhY2UtPmgtMSkqc3JjcGl0Y2g7CisJCXNyY3BpdGNoID0gLXNyY3BpdGNoOworCX0KKworCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgeworCQlzcmNjb2wgPSBzcmNsaW5lOworCQlkc3Rjb2wgPSBkc3RsaW5lOworCQlmb3IgKHg9MDsgeDxzdXJmYWNlLT53OyB4KyspIHsKKwkJCVVpbnQxNiBkc3Rjb2xvcjsKKwkJCQorCQkJZHN0Y29sb3IgPSAoKCpzcmNjb2wrKyk8PDcpICYgKDMxPDwxMCk7CisJCQlkc3Rjb2xvciB8PSAoKCpzcmNjb2wrKyk8PDIpICYgKDMxPDw1KTsKKwkJCWRzdGNvbG9yIHw9ICgoKnNyY2NvbCsrKT4+MykgJiAzMTsKKwkJCSpkc3Rjb2wrKyA9IGRzdGNvbG9yOworCQl9CisKKwkJc3JjbGluZSArPSBzcmNwaXRjaDsKKwkJZHN0bGluZSArPSBkc3RwaXRjaDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUbzU2NShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaW50IHgseSwgc3JjcGl0Y2gsIGRzdHBpdGNoOworCVVpbnQxNiAqZHN0bGluZSwgKmRzdGNvbDsKKwlVaW50OCAqc3JjbGluZSwgKnNyY2NvbDsKKworCXNyY2xpbmUgPSAoVWludDggKilnbF9zaGFkb3c7CisJc3JjcGl0Y2ggPSBzdXJmYWNlLT53ICogZ2xfcGl4ZWxzaXplOworCWRzdGxpbmUgPSBzdXJmYWNlLT5waXhlbHM7CisJZHN0cGl0Y2ggPSBzdXJmYWNlLT5waXRjaCA+PjE7CisJaWYgKGdsX3Vwc2lkZWRvd24pIHsKKwkJc3JjbGluZSArPSAoc3VyZmFjZS0+aC0xKSpzcmNwaXRjaDsKKwkJc3JjcGl0Y2ggPSAtc3JjcGl0Y2g7CisJfQorCisJZm9yICh5PTA7IHk8c3VyZmFjZS0+aDsgeSsrKSB7CisJCXNyY2NvbCA9IHNyY2xpbmU7CisJCWRzdGNvbCA9IGRzdGxpbmU7CisKKwkJZm9yICh4PTA7IHg8c3VyZmFjZS0+dzsgeCsrKSB7CisJCQlVaW50MTYgZHN0Y29sb3I7CisJCQkKKwkJCWRzdGNvbG9yID0gKCgqc3JjY29sKyspPDw4KSAmICgzMTw8MTEpOworCQkJZHN0Y29sb3IgfD0gKCgqc3JjY29sKyspPDwzKSAmICg2Mzw8NSk7CisJCQlkc3Rjb2xvciB8PSAoKCpzcmNjb2wrKyk+PjMpICYgMzE7CisJCQkqZHN0Y29sKysgPSBkc3Rjb2xvcjsKKwkJfQorCisJCXNyY2xpbmUgKz0gc3JjcGl0Y2g7CisJCWRzdGxpbmUgKz0gZHN0cGl0Y2g7CisJfQorfQorCitzdGF0aWMgdm9pZCBDb3B5U2hhZG93UkdCU3dhcChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaW50IHgseSwgc3JjcGl0Y2gsIGRzdHBpdGNoOworCVVpbnQ4ICpkc3RsaW5lLCAqZHN0Y29sOworCVVpbnQ4ICpzcmNsaW5lLCAqc3JjY29sOworCisJc3JjbGluZSA9IChVaW50OCAqKWdsX3NoYWRvdzsKKwlzcmNwaXRjaCA9IHN1cmZhY2UtPncgKiBnbF9waXhlbHNpemU7CisJZHN0bGluZSA9IHN1cmZhY2UtPnBpeGVsczsKKwlkc3RwaXRjaCA9IHN1cmZhY2UtPnBpdGNoOworCWlmIChnbF91cHNpZGVkb3duKSB7CisJCXNyY2xpbmUgKz0gKHN1cmZhY2UtPmgtMSkqc3JjcGl0Y2g7CisJCXNyY3BpdGNoID0gLXNyY3BpdGNoOworCX0KKworCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgeworCQlzcmNjb2wgPSBzcmNsaW5lOworCQlkc3Rjb2wgPSBkc3RsaW5lOworCisJCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgeworCQkJKmRzdGNvbCsrID0gc3JjY29sWzJdOworCQkJKmRzdGNvbCsrID0gc3JjY29sWzFdOworCQkJKmRzdGNvbCsrID0gc3JjY29sWzBdOworCQkJc3JjY29sICs9IDM7CisJCX0KKworCQlzcmNsaW5lICs9IHNyY3BpdGNoOworCQlkc3RsaW5lICs9IGRzdHBpdGNoOworCX0KK30KKworc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlRvQVJHQihfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaW50IHgseSwgc3JjcGl0Y2gsIGRzdHBpdGNoOworCVVpbnQzMiAqZHN0bGluZSwgKmRzdGNvbDsKKwlVaW50OCAqc3JjbGluZSwgKnNyY2NvbDsKKworCXNyY2xpbmUgPSAoVWludDggKilnbF9zaGFkb3c7CisJc3JjcGl0Y2ggPSBzdXJmYWNlLT53ICogZ2xfcGl4ZWxzaXplOworCWRzdGxpbmUgPSBzdXJmYWNlLT5waXhlbHM7CisJZHN0cGl0Y2ggPSBzdXJmYWNlLT5waXRjaCA+PjI7CisJaWYgKGdsX3Vwc2lkZWRvd24pIHsKKwkJc3JjbGluZSArPSAoc3VyZmFjZS0+aC0xKSpzcmNwaXRjaDsKKwkJc3JjcGl0Y2ggPSAtc3JjcGl0Y2g7CisJfQorCisJZm9yICh5PTA7IHk8c3VyZmFjZS0+aDsgeSsrKSB7CisJCXNyY2NvbCA9IHNyY2xpbmU7CisJCWRzdGNvbCA9IGRzdGxpbmU7CisKKwkJZm9yICh4PTA7IHg8c3VyZmFjZS0+dzsgeCsrKSB7CisJCQlVaW50MzIJZHN0Y29sb3I7CisKKwkJCWRzdGNvbG9yID0gKCpzcmNjb2wrKyk8PDE2OworCQkJZHN0Y29sb3IgfD0gKCpzcmNjb2wrKyk8PDg7CisJCQlkc3Rjb2xvciB8PSAqc3JjY29sKys7CisKKwkJCSpkc3Rjb2wrKyA9IGRzdGNvbG9yOworCQl9CisKKwkJc3JjbGluZSArPSBzcmNwaXRjaDsKKwkJZHN0bGluZSArPSBkc3RwaXRjaDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIENvcHlTaGFkb3dSR0JUb0FCR1IoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWludCB4LHksIHNyY3BpdGNoLCBkc3RwaXRjaDsKKwlVaW50MzIgKmRzdGxpbmUsICpkc3Rjb2w7CisJVWludDggKnNyY2xpbmUsICpzcmNjb2w7CisKKwlzcmNsaW5lID0gKFVpbnQ4ICopZ2xfc2hhZG93OworCXNyY3BpdGNoID0gc3VyZmFjZS0+dyAqIGdsX3BpeGVsc2l6ZTsKKwlkc3RsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOworCWRzdHBpdGNoID0gc3VyZmFjZS0+cGl0Y2ggPj4yOworCWlmIChnbF91cHNpZGVkb3duKSB7CisJCXNyY2xpbmUgKz0gKHN1cmZhY2UtPmgtMSkqc3JjcGl0Y2g7CisJCXNyY3BpdGNoID0gLXNyY3BpdGNoOworCX0KKworCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgeworCQlzcmNjb2wgPSBzcmNsaW5lOworCQlkc3Rjb2wgPSBkc3RsaW5lOworCisJCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgeworCQkJVWludDMyCWRzdGNvbG9yOworCisJCQlkc3Rjb2xvciA9ICpzcmNjb2wrKzsKKwkJCWRzdGNvbG9yIHw9ICgqc3JjY29sKyspPDw4OworCQkJZHN0Y29sb3IgfD0gKCpzcmNjb2wrKyk8PDE2OworCisJCQkqZHN0Y29sKysgPSBkc3Rjb2xvcjsKKwkJfQorCisJCXNyY2xpbmUgKz0gc3JjcGl0Y2g7CisJCWRzdGxpbmUgKz0gZHN0cGl0Y2g7CisJfQorfQorCitzdGF0aWMgdm9pZCBDb3B5U2hhZG93UkdCVG9CR1JBKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlpbnQgeCx5LCBzcmNwaXRjaCwgZHN0cGl0Y2g7CisJVWludDMyICpkc3RsaW5lLCAqZHN0Y29sOworCVVpbnQ4ICpzcmNsaW5lLCAqc3JjY29sOworCisJc3JjbGluZSA9IChVaW50OCAqKWdsX3NoYWRvdzsKKwlzcmNwaXRjaCA9IHN1cmZhY2UtPncgKiBnbF9waXhlbHNpemU7CisJZHN0bGluZSA9IHN1cmZhY2UtPnBpeGVsczsKKwlkc3RwaXRjaCA9IHN1cmZhY2UtPnBpdGNoID4+MjsKKwlpZiAoZ2xfdXBzaWRlZG93bikgeworCQlzcmNsaW5lICs9IChzdXJmYWNlLT5oLTEpKnNyY3BpdGNoOworCQlzcmNwaXRjaCA9IC1zcmNwaXRjaDsKKwl9CisKKwlmb3IgKHk9MDsgeTxzdXJmYWNlLT5oOyB5KyspIHsKKwkJc3JjY29sID0gc3JjbGluZTsKKwkJZHN0Y29sID0gZHN0bGluZTsKKworCQlmb3IgKHg9MDsgeDxzdXJmYWNlLT53OyB4KyspIHsKKwkJCVVpbnQzMglkc3Rjb2xvcjsKKworCQkJZHN0Y29sb3IgPSAoKnNyY2NvbCsrKTw8ODsKKwkJCWRzdGNvbG9yIHw9ICgqc3JjY29sKyspPDwxNjsKKwkJCWRzdGNvbG9yIHw9ICgqc3JjY29sKyspPDwyNDsKKworCQkJKmRzdGNvbCsrID0gZHN0Y29sb3I7CisJCX0KKworCQlzcmNsaW5lICs9IHNyY3BpdGNoOworCQlkc3RsaW5lICs9IGRzdHBpdGNoOworCX0KK30KKworc3RhdGljIHZvaWQgQ29weVNoYWRvd1JHQlRvUkdCQShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaW50IHgseSwgc3JjcGl0Y2gsIGRzdHBpdGNoOworCVVpbnQzMiAqZHN0bGluZSwgKmRzdGNvbDsKKwlVaW50OCAqc3JjbGluZSwgKnNyY2NvbDsKKworCXNyY2xpbmUgPSAoVWludDggKilnbF9zaGFkb3c7CisJc3JjcGl0Y2ggPSBzdXJmYWNlLT53ICogZ2xfcGl4ZWxzaXplOworCWRzdGxpbmUgPSBzdXJmYWNlLT5waXhlbHM7CisJZHN0cGl0Y2ggPSBzdXJmYWNlLT5waXRjaCA+PjI7CisJaWYgKGdsX3Vwc2lkZWRvd24pIHsKKwkJc3JjbGluZSArPSAoc3VyZmFjZS0+aC0xKSpzcmNwaXRjaDsKKwkJc3JjcGl0Y2ggPSAtc3JjcGl0Y2g7CisJfQorCisJZm9yICh5PTA7IHk8c3VyZmFjZS0+aDsgeSsrKSB7CisJCXNyY2NvbCA9IHNyY2xpbmU7CisJCWRzdGNvbCA9IGRzdGxpbmU7CisKKwkJZm9yICh4PTA7IHg8c3VyZmFjZS0+dzsgeCsrKSB7CisJCQlVaW50MzIJZHN0Y29sb3I7CisKKwkJCWRzdGNvbG9yID0gKCpzcmNjb2wrKyk8PDI0OworCQkJZHN0Y29sb3IgfD0gKCpzcmNjb2wrKyk8PDE2OworCQkJZHN0Y29sb3IgfD0gKCpzcmNjb2wrKyk8PDg7CisKKwkJCSpkc3Rjb2wrKyA9IGRzdGNvbG9yOworCQl9CisKKwkJc3JjbGluZSArPSBzcmNwaXRjaDsKKwkJZHN0bGluZSArPSBkc3RwaXRjaDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIENvcHlTaGFkb3c4ODg4VG81NTUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWludCB4LHksIHNyY3BpdGNoLCBkc3RwaXRjaDsKKwlVaW50MTYgKmRzdGxpbmUsICpkc3Rjb2w7CisJVWludDMyICpzcmNsaW5lLCAqc3JjY29sOworCisJc3JjbGluZSA9IChVaW50MzIgKilnbF9zaGFkb3c7CisJc3JjcGl0Y2ggPSAoc3VyZmFjZS0+dyAqIGdsX3BpeGVsc2l6ZSkgPj4yOworCWRzdGxpbmUgPSBzdXJmYWNlLT5waXhlbHM7CisJZHN0cGl0Y2ggPSBzdXJmYWNlLT5waXRjaCA+PjE7CisJaWYgKGdsX3Vwc2lkZWRvd24pIHsKKwkJc3JjbGluZSArPSAoc3VyZmFjZS0+aC0xKSpzcmNwaXRjaDsKKwkJc3JjcGl0Y2ggPSAtc3JjcGl0Y2g7CisJfQorCisJZm9yICh5PTA7IHk8c3VyZmFjZS0+aDsgeSsrKSB7CisJCXNyY2NvbCA9IHNyY2xpbmU7CisJCWRzdGNvbCA9IGRzdGxpbmU7CisJCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgeworCQkJVWludDMyIHNyY2NvbG9yOworCQkJVWludDE2IGRzdGNvbG9yOworCQkJCisJCQlzcmNjb2xvciA9ICpzcmNjb2wrKzsKKwkJCWRzdGNvbG9yID0gKHNyY2NvbG9yPj45KSAmICgzMTw8MTApOworCQkJZHN0Y29sb3IgfD0gKHNyY2NvbG9yPj42KSAmICgzMTw8NSk7CisJCQlkc3Rjb2xvciB8PSAoc3JjY29sb3I+PjMpICYgMzE7CisJCQkqZHN0Y29sKysgPSBkc3Rjb2xvcjsKKwkJfQorCisJCXNyY2xpbmUgKz0gc3JjcGl0Y2g7CisJCWRzdGxpbmUgKz0gZHN0cGl0Y2g7CisJfQorfQorCitzdGF0aWMgdm9pZCBDb3B5U2hhZG93ODg4OFRvNTY1KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlpbnQgeCx5LCBzcmNwaXRjaCwgZHN0cGl0Y2g7CisJVWludDE2ICpkc3RsaW5lLCAqZHN0Y29sOworCVVpbnQzMiAqc3JjbGluZSwgKnNyY2NvbDsKKworCXNyY2xpbmUgPSAoVWludDMyICopZ2xfc2hhZG93OworCXNyY3BpdGNoID0gKHN1cmZhY2UtPncgKiBnbF9waXhlbHNpemUpID4+IDI7CisJZHN0bGluZSA9IHN1cmZhY2UtPnBpeGVsczsKKwlkc3RwaXRjaCA9IHN1cmZhY2UtPnBpdGNoID4+MTsKKwlpZiAoZ2xfdXBzaWRlZG93bikgeworCQlzcmNsaW5lICs9IChzdXJmYWNlLT5oLTEpKnNyY3BpdGNoOworCQlzcmNwaXRjaCA9IC1zcmNwaXRjaDsKKwl9CisKKwlmb3IgKHk9MDsgeTxzdXJmYWNlLT5oOyB5KyspIHsKKwkJc3JjY29sID0gc3JjbGluZTsKKwkJZHN0Y29sID0gZHN0bGluZTsKKworCQlmb3IgKHg9MDsgeDxzdXJmYWNlLT53OyB4KyspIHsKKwkJCVVpbnQzMiBzcmNjb2xvcjsKKwkJCVVpbnQxNiBkc3Rjb2xvcjsKKwkJCQorCQkJc3JjY29sb3IgPSAqc3JjY29sKys7CisJCQlkc3Rjb2xvciA9IChzcmNjb2xvcj4+OCkgJiAoMzE8PDExKTsKKwkJCWRzdGNvbG9yIHw9IChzcmNjb2xvcj4+NSkgJiAoNjM8PDUpOworCQkJZHN0Y29sb3IgfD0gKHNyY2NvbG9yPj4zKSAmIDMxOworCQkJKmRzdGNvbCsrID0gZHN0Y29sb3I7CisJCX0KKworCQlzcmNsaW5lICs9IHNyY3BpdGNoOworCQlkc3RsaW5lICs9IGRzdHBpdGNoOworCX0KK30KKworLyotLS0gQ29udmVyc2lvbnMgcm91dGluZXMgaW4gdGhlIHNjcmVlbiAtLS0qLworCitzdGF0aWMgdm9pZCBDb252ZXJ0TnVsbChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnQ1NjVUbzU1NWJlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlpbnQgeCx5LCBwaXRjaDsKKwl1bnNpZ25lZCBzaG9ydCAqbGluZSwgKnBpeGVsOworCisJbGluZSA9IHN1cmZhY2UtPnBpeGVsczsKKwlwaXRjaCA9IHN1cmZhY2UtPnBpdGNoID4+IDE7CisJZm9yICh5PTA7IHk8c3VyZmFjZS0+aDsgeSsrKSB7CisJCXBpeGVsID0gbGluZTsKKwkJZm9yICh4PTA7IHg8c3VyZmFjZS0+dzsgeCsrKSB7CisJCQl1bnNpZ25lZCBzaG9ydCBjb2xvciA9ICpwaXhlbDsKKworCQkJKnBpeGVsKysgPSAoY29sb3IgJiAweDFmKXwoKGNvbG9yPj4xKSAmIDB4ZmZlMCk7CisJCX0KKworCQlsaW5lICs9IHBpdGNoOworCX0KK30KKworc3RhdGljIHZvaWQgQ29udmVydDU2NVRvNTU1bGUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWludCB4LHksIHBpdGNoOworCXVuc2lnbmVkIHNob3J0ICpsaW5lLCAqcGl4ZWw7CisKKwlsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOworCXBpdGNoID0gc3VyZmFjZS0+cGl0Y2ggPj4xOworCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgeworCQlwaXhlbCA9IGxpbmU7CisJCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgeworCQkJdW5zaWduZWQgc2hvcnQgY29sb3IgPSAqcGl4ZWw7CisKKwkJCWNvbG9yID0gKGNvbG9yICYgMHgxZil8KChjb2xvcj4+MSkgJiAweGZmZTApOworCQkJKnBpeGVsKysgPSBTRExfU3dhcDE2KGNvbG9yKTsKKwkJfQorCisJCWxpbmUgKz0gcGl0Y2g7CisJfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0NTY1bGUoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWludCB4LHksIHBpdGNoOworCXVuc2lnbmVkIHNob3J0ICpsaW5lLCAqcGl4ZWw7CisKKwlsaW5lID0gc3VyZmFjZS0+cGl4ZWxzOworCXBpdGNoID0gc3VyZmFjZS0+cGl0Y2ggPj4xOworCWZvciAoeT0wOyB5PHN1cmZhY2UtPmg7IHkrKykgeworCQlwaXhlbCA9IGxpbmU7CisJCWZvciAoeD0wOyB4PHN1cmZhY2UtPnc7IHgrKykgeworCQkJdW5zaWduZWQgc2hvcnQgY29sb3IgPSAqcGl4ZWw7CisKKwkJCSpwaXhlbCsrID0gU0RMX1N3YXAxNihjb2xvcik7CisJCX0KKworCQlsaW5lICs9IHBpdGNoOworCX0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb0FCR1IoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWludCB4LHksIHBpdGNoOworCXVuc2lnbmVkIGxvbmcgKmxpbmUsICpwaXhlbDsKKworCWxpbmUgPSBzdXJmYWNlLT5waXhlbHM7CisJcGl0Y2ggPSBzdXJmYWNlLT5waXRjaCA+PjI7CisJZm9yICh5PTA7IHk8c3VyZmFjZS0+aDsgeSsrKSB7CisJCXBpeGVsID0gbGluZTsKKwkJZm9yICh4PTA7IHg8c3VyZmFjZS0+dzsgeCsrKSB7CisJCQl1bnNpZ25lZCBsb25nIGNvbG9yID0gKnBpeGVsOworCisJCQkqcGl4ZWwrKyA9IChjb2xvcjw8MjQpfChjb2xvcj4+OCk7CisJCX0KKworCQlsaW5lICs9IHBpdGNoOworCX0KK30KKworI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZ2xfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlnbF9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkY2YyYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpZ2xfYy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQXRhcmkgT1NNZXNhLmxkZyBpbXBsZW1lbnRhdGlvbiBvZiBTREwgT3BlbkdMIHN1cHBvcnQgKi8KKworI2lmbmRlZiBfU0RMX0FUQVJJR0xfSF8KKyNkZWZpbmUgX1NETF9BVEFSSUdMX0hfCisKKyNpZiBTRExfVklERU9fT1BFTkdMCisjaW5jbHVkZSA8R0wvb3NtZXNhLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMgICBTRExfVmlkZW9EZXZpY2UgKnRoaXMKKworc3RydWN0IFNETF9Qcml2YXRlR0xEYXRhIHsKKworICAgIGludCBnbF9hY3RpdmU7IAkvKiB0byBzdG9wIHN3aXRjaGluZyBkcml2ZXJzIHdoaWxlIHdlIGhhdmUgYSB2YWxpZCBjb250ZXh0ICovCisJCisJaW50IGdsX29sZG1lc2E7CS8qIE9sZCBPcGVuR0wgc3VwcG9ydCA/ICovCisKKwlpbnQJZ2xfcGl4ZWxzaXplOwkvKiBmb3IgQ29weVNoYWRvdyBmdW5jdGlvbnMgKi8KKworCVNETF9ib29sIGdsX3Vwc2lkZWRvd247IC8qIFNvbWUgaW1wbGVtZW50YXRpb25zIGRyYXcgdXBzaWRlIGRvd24gKi8KKworCVVpbnQ4ICpnbF9zaGFkb3c7CS8qIFNoYWRvdyBidWZmZXIgZm9yIG9sZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworCS8qIGZvciB1bnN1cHBvcnRlZCBPU01lc2EgYnVmZmVyIGZvcm1hdHMgKi8KKwl2b2lkICgqQ29udmVydFN1cmZhY2UpKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CQorCisJLyogdG8gY29udmVydCB0aGUgc2hhZG93IGJ1ZmZlciB0byB0aGUgc2NyZWVuIGZvcm1hdCAqLworCXZvaWQgKCpDb3B5U2hhZG93KShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwkKKworI2lmIFNETF9WSURFT19PUEVOR0wKKwlPU01lc2FDb250ZXh0CWN0eDsKKworCS8qIE9wZW5HTCBmdW5jdGlvbnMgKi8KKwl2b2lkICgqZ2xHZXRJbnRlZ2VydikoIEdMZW51bSBwbmFtZSwgR0xpbnQgKnZhbHVlICk7CisJdm9pZCAoKmdsRmluaXNoKSh2b2lkKTsKKwl2b2lkICgqZ2xGbHVzaCkodm9pZCk7CisKKwkvKiBvc21lc2EubGRnICovCisJT1NNZXNhQ29udGV4dCAoKk9TTWVzYUNyZWF0ZUNvbnRleHRFeHQpKCBHTGVudW0gZm9ybWF0LCBHTGludCBkZXB0aEJpdHMsIEdMaW50IHN0ZW5jaWxCaXRzLCBHTGludCBhY2N1bUJpdHMsIE9TTWVzYUNvbnRleHQgc2hhcmVsaXN0KTsKKwl2b2lkICgqT1NNZXNhRGVzdHJveUNvbnRleHQpKCBPU01lc2FDb250ZXh0IGN0eCApOworCUdMYm9vbGVhbiAoKk9TTWVzYU1ha2VDdXJyZW50KSggT1NNZXNhQ29udGV4dCBjdHgsIHZvaWQgKmJ1ZmZlciwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICk7CisJdm9pZCAoKk9TTWVzYVBpeGVsU3RvcmUpKCBHTGludCBwbmFtZSwgR0xpbnQgdmFsdWUgKTsKKwl2b2lkICogKCpPU01lc2FHZXRQcm9jQWRkcmVzcykoIGNvbnN0IGNoYXIgKmZ1bmNOYW1lICk7CisKKwkvKiBtZXNhX2dsLmxkZywgdGlueV9nbC5sZGcgKi8KKwl2b2lkICooKk9TTWVzYUNyZWF0ZUxERykoIGxvbmcgZm9ybWF0LCBsb25nIHR5cGUsIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0ICk7CisJdm9pZCAoKk9TTWVzYURlc3Ryb3lMREcpKHZvaWQpOworCisJLyogSW5mbyBuZWVkZWQgdG8gY29tcGFyZSBleGlzdGluZyBjb250ZXh0IHdpdGggbmV3IGFza2VkIG9uZSAqLworCWludCB3aWR0aCwgaGVpZ2h0OworCUdMZW51bSBmb3JtYXQ7CisJR0xpbnQgZGVwdGgsc3RlbmNpbCxhY2N1bTsKKyNlbmRpZgorfTsKKworLyogVmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgZ2xfYWN0aXZlCQkodGhpcy0+Z2xfZGF0YS0+Z2xfYWN0aXZlKQorI2RlZmluZSBnbF9jdHgJCQkodGhpcy0+Z2xfZGF0YS0+Y3R4KQorI2RlZmluZSBnbF9vbGRtZXNhCQkodGhpcy0+Z2xfZGF0YS0+Z2xfb2xkbWVzYSkKKyNkZWZpbmUgZ2xfcGl4ZWxzaXplCSh0aGlzLT5nbF9kYXRhLT5nbF9waXhlbHNpemUpCisjZGVmaW5lIGdsX3Vwc2lkZWRvd24JKHRoaXMtPmdsX2RhdGEtPmdsX3Vwc2lkZWRvd24pCisjZGVmaW5lIGdsX3NoYWRvdwkJKHRoaXMtPmdsX2RhdGEtPmdsX3NoYWRvdykKKyNkZWZpbmUgZ2xfY29udmVydAkJKHRoaXMtPmdsX2RhdGEtPkNvbnZlcnRTdXJmYWNlKQorI2RlZmluZSBnbF9jb3B5c2hhZG93CSh0aGlzLT5nbF9kYXRhLT5Db3B5U2hhZG93KQorI2RlZmluZSBnbF9jdXJmb3JtYXQJKHRoaXMtPmdsX2RhdGEtPmZvcm1hdCkKKyNkZWZpbmUgZ2xfY3VyZGVwdGgJCSh0aGlzLT5nbF9kYXRhLT5kZXB0aCkKKyNkZWZpbmUgZ2xfY3Vyc3RlbmNpbAkodGhpcy0+Z2xfZGF0YS0+c3RlbmNpbCkKKyNkZWZpbmUgZ2xfY3VyYWNjdW0JCSh0aGlzLT5nbF9kYXRhLT5hY2N1bSkKKyNkZWZpbmUgZ2xfY3Vyd2lkdGgJCSh0aGlzLT5nbF9kYXRhLT53aWR0aCkKKyNkZWZpbmUgZ2xfY3VyaGVpZ2h0CSh0aGlzLT5nbF9kYXRhLT5oZWlnaHQpCisKKy8qIE9wZW5HTCBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgU0RMX0F0YXJpR0xfSW5pdChfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQpOworZXh0ZXJuIHZvaWQgU0RMX0F0YXJpR0xfUXVpdChfVEhJUywgU0RMX2Jvb2wgdW5sb2FkKTsKK2V4dGVybiB2b2lkIFNETF9BdGFyaUdMX0luaXRQb2ludGVycyhfVEhJUyk7CisKK2V4dGVybiBpbnQgU0RMX0F0YXJpR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIgKnBhdGgpOworZXh0ZXJuIHZvaWQgKlNETF9BdGFyaUdMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyICpwcm9jKTsKK2V4dGVybiBpbnQgU0RMX0F0YXJpR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSk7CitleHRlcm4gaW50IFNETF9BdGFyaUdMX01ha2VDdXJyZW50KF9USElTKTsKK2V4dGVybiB2b2lkIFNETF9BdGFyaUdMX1N3YXBCdWZmZXJzKF9USElTKTsKKworI2VuZGlmIC8qIF9TRExfQVRBUklHTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlrZXlzLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaWtleXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWY3Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlrZXlzLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qCisgKglBdGFyaSBTY2FuY29kZSBkZWZpbml0aW9ucworICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2lmbmRlZiBfU0RMX0FUQVJJS0VZU19IXworI2RlZmluZSBfU0RMX0FUQVJJS0VZU19IXyAKKworLyogLS0tIEtleWJvYXJkIHNjYW5jb2RlcyAtLS0gKi8KKy8qIHRha2VuIGZyb20gc3ZnYWxpYi92Z2FrZXlib2FyZC5oICovCisKKyNkZWZpbmUgU0NBTkNPREVfRVNDQVBFCQkweDAxCisjZGVmaW5lIFNDQU5DT0RFXzEJCTB4MDIKKyNkZWZpbmUgU0NBTkNPREVfMgkJMHgwMworI2RlZmluZSBTQ0FOQ09ERV8zCQkweDA0CisjZGVmaW5lIFNDQU5DT0RFXzQJCTB4MDUKKyNkZWZpbmUgU0NBTkNPREVfNQkJMHgwNgorI2RlZmluZSBTQ0FOQ09ERV82CQkweDA3CisjZGVmaW5lIFNDQU5DT0RFXzcJCTB4MDgKKyNkZWZpbmUgU0NBTkNPREVfOAkJMHgwOQorI2RlZmluZSBTQ0FOQ09ERV85CQkweDBhCisjZGVmaW5lIFNDQU5DT0RFXzAJCTB4MGIKKyNkZWZpbmUgU0NBTkNPREVfTUlOVVMJCTB4MGMKKyNkZWZpbmUgU0NBTkNPREVfRVFVQUwJCTB4MGQKKyNkZWZpbmUgU0NBTkNPREVfQkFDS1NQQUNFCTB4MGUKKworI2RlZmluZSBTQ0FOQ09ERV9UQUIJCTB4MGYKKyNkZWZpbmUgU0NBTkNPREVfUQkJMHgxMAorI2RlZmluZSBTQ0FOQ09ERV9XCQkweDExCisjZGVmaW5lIFNDQU5DT0RFX0UJCTB4MTIKKyNkZWZpbmUgU0NBTkNPREVfUgkJMHgxMworI2RlZmluZSBTQ0FOQ09ERV9UCQkweDE0CisjZGVmaW5lIFNDQU5DT0RFX1kJCTB4MTUKKyNkZWZpbmUgU0NBTkNPREVfVQkJMHgxNgorI2RlZmluZSBTQ0FOQ09ERV9JCQkweDE3CisjZGVmaW5lIFNDQU5DT0RFX08JCTB4MTgKKyNkZWZpbmUgU0NBTkNPREVfUAkJMHgxOQorI2RlZmluZSBTQ0FOQ09ERV9CUkFDS0VUX0xFRlQJMHgxYQorI2RlZmluZSBTQ0FOQ09ERV9CUkFDS0VUX1JJR0hUCTB4MWIKKyNkZWZpbmUgU0NBTkNPREVfRU5URVIJCTB4MWMKKyNkZWZpbmUgU0NBTkNPREVfREVMRVRFCQkweDUzCisKKyNkZWZpbmUgU0NBTkNPREVfTEVGVENPTlRST0wJMHgxZAorI2RlZmluZSBTQ0FOQ09ERV9BCQkweDFlCisjZGVmaW5lIFNDQU5DT0RFX1MJCTB4MWYKKyNkZWZpbmUgU0NBTkNPREVfRAkJMHgyMAorI2RlZmluZSBTQ0FOQ09ERV9GCQkweDIxCisjZGVmaW5lIFNDQU5DT0RFX0cJCTB4MjIKKyNkZWZpbmUgU0NBTkNPREVfSAkJMHgyMworI2RlZmluZSBTQ0FOQ09ERV9KCQkweDI0CisjZGVmaW5lIFNDQU5DT0RFX0sJCTB4MjUKKyNkZWZpbmUgU0NBTkNPREVfTAkJMHgyNgorI2RlZmluZSBTQ0FOQ09ERV9TRU1JQ09MT04JMHgyNworI2RlZmluZSBTQ0FOQ09ERV9BUE9TVFJPUEhFCTB4MjgKKyNkZWZpbmUgU0NBTkNPREVfR1JBVkUJCTB4MjkKKworI2RlZmluZSBTQ0FOQ09ERV9MRUZUU0hJRlQJMHgyYQorI2RlZmluZSBTQ0FOQ09ERV9CQUNLU0xBU0gJMHgyYgorI2RlZmluZSBTQ0FOQ09ERV9aCQkweDJjCisjZGVmaW5lIFNDQU5DT0RFX1gJCTB4MmQKKyNkZWZpbmUgU0NBTkNPREVfQwkJMHgyZQorI2RlZmluZSBTQ0FOQ09ERV9WCQkweDJmCisjZGVmaW5lIFNDQU5DT0RFX0IJCTB4MzAKKyNkZWZpbmUgU0NBTkNPREVfTgkJMHgzMQorI2RlZmluZSBTQ0FOQ09ERV9NCQkweDMyCisjZGVmaW5lIFNDQU5DT0RFX0NPTU1BCQkweDMzCisjZGVmaW5lIFNDQU5DT0RFX1BFUklPRAkJMHgzNAorI2RlZmluZSBTQ0FOQ09ERV9TTEFTSAkJMHgzNQorI2RlZmluZSBTQ0FOQ09ERV9SSUdIVFNISUZUCTB4MzYKKworI2RlZmluZSBTQ0FOQ09ERV9MRUZUQUxUCTB4MzgKKyNkZWZpbmUgU0NBTkNPREVfU1BBQ0UJCTB4MzkKKyNkZWZpbmUgU0NBTkNPREVfQ0FQU0xPQ0sJMHgzYQorCisvKiBGdW5jdGlvbnMga2V5cyAqLworI2RlZmluZSBTQ0FOQ09ERV9GMQkJMHgzYgorI2RlZmluZSBTQ0FOQ09ERV9GMgkJMHgzYworI2RlZmluZSBTQ0FOQ09ERV9GMwkJMHgzZAorI2RlZmluZSBTQ0FOQ09ERV9GNAkJMHgzZQorI2RlZmluZSBTQ0FOQ09ERV9GNQkJMHgzZgorI2RlZmluZSBTQ0FOQ09ERV9GNgkJMHg0MAorI2RlZmluZSBTQ0FOQ09ERV9GNwkJMHg0MQorI2RlZmluZSBTQ0FOQ09ERV9GOAkJMHg0MgorI2RlZmluZSBTQ0FOQ09ERV9GOQkJMHg0MworI2RlZmluZSBTQ0FOQ09ERV9GMTAJMHg0NAorCisvKiBOdW1lcmljIGtleXBhZCAqLworI2RlZmluZSBTQ0FOQ09ERV9LUDAJCQkweDcwCisjZGVmaW5lIFNDQU5DT0RFX0tQMQkJCTB4NmQKKyNkZWZpbmUgU0NBTkNPREVfS1AyCQkJMHg2ZQorI2RlZmluZSBTQ0FOQ09ERV9LUDMJCQkweDZmCisjZGVmaW5lIFNDQU5DT0RFX0tQNAkJCTB4NmEKKyNkZWZpbmUgU0NBTkNPREVfS1A1CQkJMHg2YgorI2RlZmluZSBTQ0FOQ09ERV9LUDYJCQkweDZjCisjZGVmaW5lIFNDQU5DT0RFX0tQNwkJCTB4NjcKKyNkZWZpbmUgU0NBTkNPREVfS1A4CQkJMHg2OAorI2RlZmluZSBTQ0FOQ09ERV9LUDkJCQkweDY5CisjZGVmaW5lIFNDQU5DT0RFX0tQX1BFUklPRAkJMHg3MQorI2RlZmluZSBTQ0FOQ09ERV9LUF9ESVZJREUJCTB4NjUKKyNkZWZpbmUgU0NBTkNPREVfS1BfTVVMVElQTFkJMHg2NgorI2RlZmluZSBTQ0FOQ09ERV9LUF9NSU5VUwkJMHg0YQorI2RlZmluZSBTQ0FOQ09ERV9LUF9QTFVTCQkweDRlCisjZGVmaW5lIFNDQU5DT0RFX0tQX0VOVEVSCQkweDcyCisjZGVmaW5lIFNDQU5DT0RFX0tQX0xFRlRQQVJFTgkweDYzCisjZGVmaW5lIFNDQU5DT0RFX0tQX1JJR0hUUEFSRU4JMHg2NAorCisvKiBDdXJzb3Iga2V5cGFkICovCisjZGVmaW5lIFNDQU5DT0RFX0hFTFAJCTB4NjIKKyNkZWZpbmUgU0NBTkNPREVfVU5ETwkJMHg2MQorI2RlZmluZSBTQ0FOQ09ERV9JTlNFUlQJCTB4NTIKKyNkZWZpbmUgU0NBTkNPREVfQ0xSSE9NRQkweDQ3CisjZGVmaW5lIFNDQU5DT0RFX1VQCQkJMHg0OAorI2RlZmluZSBTQ0FOQ09ERV9ET1dOCQkweDUwCisjZGVmaW5lIFNDQU5DT0RFX1JJR0hUCQkweDRkCisjZGVmaW5lIFNDQU5DT0RFX0xFRlQJCTB4NGIKKworI2VuZGlmIC8qIF9TRExfQVRBUklLRVlTX0hfICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaW14YWxsb2MuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGJhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9hdGFyaW14YWxsb2MuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqCU1lbW9yeSBhbGxvY2F0aW9uCisgKgorICoJUGF0cmljZSBNYW5kaW4KKyAqLworCisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKworLyotLS0gVmFyaWFibGVzIC0tLSovCisKK3N0YXRpYyBpbnQgYXRhcmlfbXhhbGxvY19hdmFpbD0tMTsKKworLyotLS0gRnVuY3Rpb25zIC0tLSovCisKK3ZvaWQgKkF0YXJpX1N5c01hbGxvYyhVaW50MzIgc2l6ZSwgVWludDE2IGFsbG9jX3R5cGUpCit7CisJLyogVGVzdCBpZiBNeGFsbG9jKCkgYXZhaWxhYmxlICovCisJaWYgKGF0YXJpX214YWxsb2NfYXZhaWw8MCkgeworCQlhdGFyaV9teGFsbG9jX2F2YWlsID0gKChTdmVyc2lvbigpJjB4RkYpPj0weDAxKSB8IChTdmVyc2lvbigpPj0weDE5MDApOworCX0KKworCWlmIChhdGFyaV9teGFsbG9jX2F2YWlsKSB7CisJCXJldHVybiAodm9pZCAqKSBNeGFsbG9jKHNpemUsIGFsbG9jX3R5cGUpOworCX0gZWxzZSB7CisJCXJldHVybiAodm9pZCAqKSBNYWxsb2Moc2l6ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlteGFsbG9jX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvY19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3NDA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpbXhhbGxvY19jLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgKglNZW1vcnkgYWxsb2NhdGlvbgorICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2lmbmRlZiBfU0RMX0FUQVJJX01YQUxMT0NfSF8KKyNkZWZpbmUgX1NETF9BVEFSSV9NWEFMTE9DX0hfCisKKy8qLS0tIEZ1bmN0aW9ucyAtLS0qLworCitleHRlcm4gdm9pZCAqQXRhcmlfU3lzTWFsbG9jKFVpbnQzMiBzaXplLCBVaW50MTYgYWxsb2NfdHlwZSk7CisKKyNlbmRpZiAvKiBfU0RMX0FUQVJJX01YQUxMT0NfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpc3VwZXIuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2F0YXJpc3VwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI1YzdlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYXRhcmlzdXBlci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9BVEFSSV9TVVBFUl9oCisjZGVmaW5lIF9BVEFSSV9TVVBFUl9oCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisKKyNpZm5kZWYgU3VwZXJUb1VzZXIKKworLyoKKyAqIFNhZmUgYmluZGluZyB0byBzd2l0Y2ggYmFjayBmcm9tIHN1cGVydmlzb3IgdG8gdXNlciBtb2RlLgorICogT24gVE9TIG9yIEVtdVRPUywgaWYgdGhlIHN0YWNrIHBvaW50ZXIgaGFzIGNoYW5nZWQgYmV0d2VlbiBTdXBlcigwKQorICogYW5kIFN1cGVyKG9sZHNzcCksIHRoZSByZXN1bHRpbmcgdXNlciBzdGFjayBwb2ludGVyIGlzIHdyb25nLgorICogVGhpcyBidWcgZG9lcyBub3Qgb2NjdXIgd2l0aCBGcmVlTWlOVC4KKyAqIFNvIHRoZSBzYWZlIHdheSB0byByZXR1cm4gZnJvbSBzdXBlcnZpc29yIHRvIHVzZXIgbW9kZSBpcyB0byBiYWNrdXAKKyAqIHRoZSBzdGFjayBwb2ludGVyIHRoZW4gcmVzdG9yZSBpdCBhZnRlciB0aGUgdHJhcC4KKyAqIFNvbWV0aW1lcywgR0NDIG9wdGltaXplcyB0aGUgc3RhY2sgdXNhZ2UsIHNvIHRoaXMgbWF0dGVycy4KKyAqLworI2RlZmluZSBTdXBlclRvVXNlcihwdHIpCQkJCQkJXAorKHZvaWQpX19leHRlbnNpb25fXwkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwlyZWdpc3RlciBsb25nIHJldHZhbHVlIF9fYXNtX18oImQwIik7CQkJCVwKKwlyZWdpc3RlciBsb25nIHNwX2JhY2t1cDsJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIHZvbGF0aWxlCQkJCQkJXAorCSgJCQkJCQkJCVwKKwkJIm1vdmwJc3AsJTFcblx0IgkJCQkJXAorCQkibW92bAklMixzcEAtXG5cdCIJCQkJCVwKKwkJIm1vdncJIzB4MjAsc3BALVxuXHQiCQkJCQlcCisJCSJ0cmFwCSMxXG5cdCIJCQkJCQlcCisJCSJtb3ZsCSUxLHNwXG5cdCIJCQkJCVwKKwk6ICI9ciIocmV0dmFsdWUpLCAiPSZyIihzcF9iYWNrdXApCS8qIG91dHB1dHMgKi8JCVwKKwk6ICJnIigobG9uZykocHRyKSkgCQkJLyogaW5wdXRzICovCQlcCisJOiAiZDEiLCAiZDIiLCAiYTAiLCAiYTEiLCAiYTIiCQlcCisJKTsJCQkJCQkJCVwKK30pCisKKyNlbmRpZiAvKiBTdXBlclRvVXNlciAqLworCisjZW5kaWYgLyogX0FUQVJJX1NVUEVSX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2Jpb3NldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2Jpb3NldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDM2YjJiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfYmlvc2V2ZW50cy5jCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqCUF0YXJpIGtleWJvYXJkIGV2ZW50cyBtYW5hZ2VyLCB1c2luZyBCSU9TCisgKgorICoJUGF0cmljZSBNYW5kaW4KKyAqLworCisvKiBNaW50IGluY2x1ZGVzICovCisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKyNpbmNsdWRlIDxtaW50L2Nvb2tpZS5oPgorCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisKKyNpbmNsdWRlICJTRExfYXRhcmlrZXlzLmgiCisjaW5jbHVkZSAiU0RMX2F0YXJpZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfeGJpb3NldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9hdGFyaWRldm1vdXNlX2MuaCIKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYmlvc19jdXJyZW50a2V5Ym9hcmRbQVRBUklCSU9TX01BWEtFWVNdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYmlvc19wcmV2aW91c2tleWJvYXJkW0FUQVJJQklPU19NQVhLRVlTXTsKK3N0YXRpYyBTRExfYm9vbCB1c2VfZGV2X21vdXNlID0gU0RMX0ZBTFNFOworCitzdGF0aWMgdm9pZCBVcGRhdGVTcGVjaWFsS2V5cyhpbnQgc3BlY2lhbF9rZXlzX3N0YXRlKTsKKwordm9pZCBBdGFyaUJpb3NfSW5pdE9TS2V5bWFwKF9USElTKQoreworCWludCB2ZWN0b3JzX21hc2s7CisvKgl1bnNpZ25lZCBsb25nIGR1bW15OyovCisKKwlTRExfbWVtc2V0KGJpb3NfY3VycmVudGtleWJvYXJkLCAwLCBzaXplb2YoYmlvc19jdXJyZW50a2V5Ym9hcmQpKTsKKwlTRExfbWVtc2V0KGJpb3NfcHJldmlvdXNrZXlib2FyZCwgMCwgc2l6ZW9mKGJpb3NfcHJldmlvdXNrZXlib2FyZCkpOworCisJdXNlX2Rldl9tb3VzZSA9IChTRExfQXRhcmlEZXZNb3VzZV9PcGVuKCkhPTApID8gU0RMX1RSVUUgOiBTRExfRkFMU0U7CisKKwl2ZWN0b3JzX21hc2sgPSBBVEFSSV9YQklPU19KT1lTVElDS0VWRU5UUzsJLyogWEJJT1Mgam95c3RpY2sgZXZlbnRzICovCisJaWYgKCF1c2VfZGV2X21vdXNlKSB7CisJCXZlY3RvcnNfbWFzayB8PSBBVEFSSV9YQklPU19NT1VTRUVWRU5UUzsJLyogWEJJT1MgbW91c2UgZXZlbnRzICovCisJfQorLyoJaWYgKEdldGNvb2tpZShDX01pTlQsICZkdW1teSk9PUNfRk9VTkQpIHsKKwkJdmVjdG9yc19tYXNrID0gMDsKKwl9Ki8KKworCVNETF9BdGFyaVhiaW9zX0luc3RhbGxWZWN0b3JzKHZlY3RvcnNfbWFzayk7Cit9CisKK3ZvaWQgQXRhcmlCaW9zX1B1bXBFdmVudHMoX1RISVMpCit7CisJaW50IGk7CisJU0RMX2tleXN5bSBrZXlzeW07CisKKwkvKiBVcGRhdGUgcHJlc3NlZCBrZXlzICovCisJU0RMX21lbXNldChiaW9zX2N1cnJlbnRrZXlib2FyZCwgMCwgQVRBUklCSU9TX01BWEtFWVMpOworCisJd2hpbGUgKEJjb25zdGF0KF9DT04pKSB7CisJCXVuc2lnbmVkIGxvbmcga2V5X3ByZXNzZWQ7CisJCWtleV9wcmVzc2VkPUJjb25pbihfQ09OKTsKKwkJYmlvc19jdXJyZW50a2V5Ym9hcmRbKGtleV9wcmVzc2VkPj4xNikmKEFUQVJJQklPU19NQVhLRVlTLTEpXT0weEZGOworCX0KKworCS8qIFJlYWQgc3BlY2lhbCBrZXlzICovCisJVXBkYXRlU3BlY2lhbEtleXMoS2JzaGlmdCgtMSkpOworCisJLyogTm93IGdlbmVyYXRlIGV2ZW50cyAqLworCWZvciAoaT0wOyBpPEFUQVJJQklPU19NQVhLRVlTOyBpKyspIHsKKwkJLyogS2V5IHByZXNzZWQgPyAqLworCQlpZiAoYmlvc19jdXJyZW50a2V5Ym9hcmRbaV0gJiYgIWJpb3NfcHJldmlvdXNrZXlib2FyZFtpXSkKKwkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsCisJCQkJU0RMX0F0YXJpX1RyYW5zbGF0ZUtleShpLCAma2V5c3ltLCBTRExfVFJVRSkpOworCQkJCisJCS8qIEtleSB1bnByZXNzZWQgPyAqLworCQlpZiAoYmlvc19wcmV2aW91c2tleWJvYXJkW2ldICYmICFiaW9zX2N1cnJlbnRrZXlib2FyZFtpXSkKKwkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELAorCQkJCVNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaSwgJmtleXN5bSwgU0RMX0ZBTFNFKSk7CisJfQorCisJaWYgKHVzZV9kZXZfbW91c2UpIHsKKwkJU0RMX0F0YXJpRGV2TW91c2VfUG9zdE1vdXNlRXZlbnRzKHRoaXMsIFNETF9UUlVFKTsKKwl9IGVsc2UgeworCQlTRExfQXRhcmlYYmlvc19Qb3N0TW91c2VFdmVudHModGhpcywgU0RMX1RSVUUpOworCX0KKworCS8qIFdpbGwgYmUgcHJldmlvdXMgdGFibGUgKi8KKwlTRExfbWVtY3B5KGJpb3NfcHJldmlvdXNrZXlib2FyZCwgYmlvc19jdXJyZW50a2V5Ym9hcmQsIHNpemVvZihiaW9zX3ByZXZpb3Vza2V5Ym9hcmQpKTsKK30KKworc3RhdGljIHZvaWQgVXBkYXRlU3BlY2lhbEtleXMoaW50IHNwZWNpYWxfa2V5c19zdGF0ZSkKK3sKKyNkZWZpbmUgVVBEQVRFX1NQRUNJQUxfS0VZUyhudW1iaXQsc2NhbmNvZGUpIFwKKwl7CVwKKwkJaWYgKHNwZWNpYWxfa2V5c19zdGF0ZSAmICgxPDwobnVtYml0KSkpIHsgXAorCQkJYmlvc19jdXJyZW50a2V5Ym9hcmRbc2NhbmNvZGVdPTB4RkY7IFwKKwkJfQlcCisJfQorCisJVVBEQVRFX1NQRUNJQUxfS0VZUyhLX1JTSElGVCwgU0NBTkNPREVfUklHSFRTSElGVCk7CisJVVBEQVRFX1NQRUNJQUxfS0VZUyhLX0xTSElGVCwgU0NBTkNPREVfTEVGVFNISUZUKTsKKwlVUERBVEVfU1BFQ0lBTF9LRVlTKEtfQ1RSTCwgU0NBTkNPREVfTEVGVENPTlRST0wpOworCVVQREFURV9TUEVDSUFMX0tFWVMoS19BTFQsIFNDQU5DT0RFX0xFRlRBTFQpOworCVVQREFURV9TUEVDSUFMX0tFWVMoS19DQVBTTE9DSywgU0NBTkNPREVfQ0FQU0xPQ0spOworfQorCit2b2lkIEF0YXJpQmlvc19TaHV0ZG93bkV2ZW50cyh2b2lkKQoreworCVNETF9BdGFyaVhiaW9zX1Jlc3RvcmVWZWN0b3JzKCk7CisJaWYgKHVzZV9kZXZfbW91c2UpIHsKKwkJU0RMX0F0YXJpRGV2TW91c2VfQ2xvc2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9iaW9zZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2Jpb3NldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMTZlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9iaW9zZXZlbnRzX2MuaApAQCAtMCwwICsxLDQyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqCUF0YXJpIGtleWJvYXJkIGV2ZW50cyBtYW5hZ2VyLCB1c2luZyBCSU9TCisgKgorICoJUGF0cmljZSBNYW5kaW4KKyAqLworCisjaWZuZGVmIF9TRExfQVRBUklfQklPU0VWRU5UU19IXworI2RlZmluZSBfU0RMX0FUQVJJX0JJT1NFVkVOVFNfSF8KKworI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKK2V4dGVybiB2b2lkIEF0YXJpQmlvc19Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgQXRhcmlCaW9zX1B1bXBFdmVudHMoX1RISVMpOworZXh0ZXJuIHZvaWQgQXRhcmlCaW9zX1NodXRkb3duRXZlbnRzKHZvaWQpOworCisjZW5kaWYgLyogX1NETF9BVEFSSV9CSU9TRVZFTlRTX0hfICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9nZW1kb3NldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2dlbWRvc2V2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZWJhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9nZW1kb3NldmVudHMuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgKglBdGFyaSBrZXlib2FyZCBldmVudHMgbWFuYWdlciwgdXNpbmcgR2VtZG9zCisgKgorICoJUGF0cmljZSBNYW5kaW4KKyAqLworCisvKiBNaW50IGluY2x1ZGVzICovCisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKyNpbmNsdWRlIDxtaW50L2Nvb2tpZS5oPgorCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisKKyNpbmNsdWRlICJTRExfYXRhcmlrZXlzLmgiCisjaW5jbHVkZSAiU0RMX2F0YXJpZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfeGJpb3NldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9hdGFyaWRldm1vdXNlX2MuaCIKKworLyogVG8gc2F2ZSBzdGF0ZSBvZiBrZXlib2FyZCAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZW1kb3NfY3VycmVudGtleWJvYXJkW0FUQVJJQklPU19NQVhLRVlTXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdlbWRvc19wcmV2aW91c2tleWJvYXJkW0FUQVJJQklPU19NQVhLRVlTXTsKK3N0YXRpYyBTRExfYm9vbCB1c2VfZGV2X21vdXNlID0gU0RMX0ZBTFNFOworCitzdGF0aWMgdm9pZCBVcGRhdGVTcGVjaWFsS2V5cyhpbnQgc3BlY2lhbF9rZXlzX3N0YXRlKTsKKwordm9pZCBBdGFyaUdlbWRvc19Jbml0T1NLZXltYXAoX1RISVMpCit7CisJaW50IHZlY3RvcnNfbWFzazsKKy8qCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ki8KKworCVNETF9tZW1zZXQoZ2VtZG9zX2N1cnJlbnRrZXlib2FyZCwgMCwgc2l6ZW9mKGdlbWRvc19jdXJyZW50a2V5Ym9hcmQpKTsKKwlTRExfbWVtc2V0KGdlbWRvc19wcmV2aW91c2tleWJvYXJkLCAwLCBzaXplb2YoZ2VtZG9zX3ByZXZpb3Vza2V5Ym9hcmQpKTsKKworCXVzZV9kZXZfbW91c2UgPSAoU0RMX0F0YXJpRGV2TW91c2VfT3BlbigpIT0wKSA/IFNETF9UUlVFIDogU0RMX0ZBTFNFOworCisJdmVjdG9yc19tYXNrID0gQVRBUklfWEJJT1NfSk9ZU1RJQ0tFVkVOVFM7CS8qIFhCSU9TIGpveXN0aWNrIGV2ZW50cyAqLworCWlmICghdXNlX2Rldl9tb3VzZSkgeworCQl2ZWN0b3JzX21hc2sgfD0gQVRBUklfWEJJT1NfTU9VU0VFVkVOVFM7CS8qIFhCSU9TIG1vdXNlIGV2ZW50cyAqLworCX0KKy8qCWlmIChHZXRjb29raWUoQ19NaU5ULCAmZHVtbXkpPT1DX0ZPVU5EKSB7CisJCXZlY3RvcnNfbWFzayA9IDA7CisJfSovCisJU0RMX0F0YXJpWGJpb3NfSW5zdGFsbFZlY3RvcnModmVjdG9yc19tYXNrKTsKK30KKwordm9pZCBBdGFyaUdlbWRvc19QdW1wRXZlbnRzKF9USElTKQoreworCWludCBpOworCVNETF9rZXlzeW0ga2V5c3ltOworCisJLyogVXBkYXRlIHByZXNzZWQga2V5cyAqLworCVNETF9tZW1zZXQoZ2VtZG9zX2N1cnJlbnRrZXlib2FyZCwgMCwgQVRBUklCSU9TX01BWEtFWVMpOworCisJd2hpbGUgKENjb25pcygpIT1ERVZfQlVTWSkgeworCQl1bnNpZ25lZCBsb25nIGtleV9wcmVzc2VkOworCQlrZXlfcHJlc3NlZD1DbmVjaW4oKTsKKwkJZ2VtZG9zX2N1cnJlbnRrZXlib2FyZFsoa2V5X3ByZXNzZWQ+PjE2KSYoQVRBUklCSU9TX01BWEtFWVMtMSldPTB4RkY7CisJfQorCisJLyogUmVhZCBzcGVjaWFsIGtleXMgKi8KKwlVcGRhdGVTcGVjaWFsS2V5cyhLYnNoaWZ0KC0xKSk7CisKKwkvKiBOb3cgZ2VuZXJhdGUgZXZlbnRzICovCisJZm9yIChpPTA7IGk8QVRBUklCSU9TX01BWEtFWVM7IGkrKykgeworCQkvKiBLZXkgcHJlc3NlZCA/ICovCisJCWlmIChnZW1kb3NfY3VycmVudGtleWJvYXJkW2ldICYmICFnZW1kb3NfcHJldmlvdXNrZXlib2FyZFtpXSkKKwkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsCisJCQkJU0RMX0F0YXJpX1RyYW5zbGF0ZUtleShpLCAma2V5c3ltLCBTRExfVFJVRSkpOworCQkJCisJCS8qIEtleSB1bnByZXNzZWQgPyAqLworCQlpZiAoZ2VtZG9zX3ByZXZpb3Vza2V5Ym9hcmRbaV0gJiYgIWdlbWRvc19jdXJyZW50a2V5Ym9hcmRbaV0pCisJCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwKKwkJCQlTRExfQXRhcmlfVHJhbnNsYXRlS2V5KGksICZrZXlzeW0sIFNETF9GQUxTRSkpOworCX0KKworCWlmICh1c2VfZGV2X21vdXNlKSB7CisJCVNETF9BdGFyaURldk1vdXNlX1Bvc3RNb3VzZUV2ZW50cyh0aGlzLCBTRExfVFJVRSk7CisJfSBlbHNlIHsKKwkJU0RMX0F0YXJpWGJpb3NfUG9zdE1vdXNlRXZlbnRzKHRoaXMsIFNETF9UUlVFKTsKKwl9CisKKwkvKiBXaWxsIGJlIHByZXZpb3VzIHRhYmxlICovCisJU0RMX21lbWNweShnZW1kb3NfcHJldmlvdXNrZXlib2FyZCwgZ2VtZG9zX2N1cnJlbnRrZXlib2FyZCwgc2l6ZW9mKGdlbWRvc19wcmV2aW91c2tleWJvYXJkKSk7Cit9CisKK3N0YXRpYyB2b2lkIFVwZGF0ZVNwZWNpYWxLZXlzKGludCBzcGVjaWFsX2tleXNfc3RhdGUpCit7CisjZGVmaW5lIFVQREFURV9TUEVDSUFMX0tFWVMobnVtYml0LHNjYW5jb2RlKSBcCisJewlcCisJCWlmIChzcGVjaWFsX2tleXNfc3RhdGUgJiAoMTw8KG51bWJpdCkpKSB7IFwKKwkJCWdlbWRvc19jdXJyZW50a2V5Ym9hcmRbc2NhbmNvZGVdPTB4RkY7IFwKKwkJfQlcCisJfQorCisJVVBEQVRFX1NQRUNJQUxfS0VZUyhLX1JTSElGVCwgU0NBTkNPREVfUklHSFRTSElGVCk7CisJVVBEQVRFX1NQRUNJQUxfS0VZUyhLX0xTSElGVCwgU0NBTkNPREVfTEVGVFNISUZUKTsKKwlVUERBVEVfU1BFQ0lBTF9LRVlTKEtfQ1RSTCwgU0NBTkNPREVfTEVGVENPTlRST0wpOworCVVQREFURV9TUEVDSUFMX0tFWVMoS19BTFQsIFNDQU5DT0RFX0xFRlRBTFQpOworCVVQREFURV9TUEVDSUFMX0tFWVMoS19DQVBTTE9DSywgU0NBTkNPREVfQ0FQU0xPQ0spOworfQorCit2b2lkIEF0YXJpR2VtZG9zX1NodXRkb3duRXZlbnRzKHZvaWQpCit7CisJU0RMX0F0YXJpWGJpb3NfUmVzdG9yZVZlY3RvcnMoKTsKKwlpZiAodXNlX2Rldl9tb3VzZSkgeworCQlTRExfQXRhcmlEZXZNb3VzZV9DbG9zZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2dlbWRvc2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9nZW1kb3NldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTI0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9nZW1kb3NldmVudHNfYy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICoJQXRhcmkga2V5Ym9hcmQgZXZlbnRzIG1hbmFnZXIsIHVzaW5nIEdlbWRvcworICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2lmbmRlZiBfU0RMX0FUQVJJX0dFTURPU0VWRU5UU19IXworI2RlZmluZSBfU0RMX0FUQVJJX0dFTURPU0VWRU5UU19IXworCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKKworZXh0ZXJuIHZvaWQgQXRhcmlHZW1kb3NfSW5pdE9TS2V5bWFwKF9USElTKTsKK2V4dGVybiB2b2lkIEF0YXJpR2VtZG9zX1B1bXBFdmVudHMoX1RISVMpOworZXh0ZXJuIHZvaWQgQXRhcmlHZW1kb3NfU2h1dGRvd25FdmVudHModm9pZCk7CisKKyNlbmRpZiAvKiBfU0RMX0FUQVJJX0dFTURPU0VWRU5UU19IXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGV2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmM1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9pa2JkZXZlbnRzLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICoJQXRhcmkga2V5Ym9hcmQgZXZlbnRzIG1hbmFnZXIsIHVzaW5nIGhhcmR3YXJlIElLQkQKKyAqCisgKglQYXRyaWNlIE1hbmRpbgorICovCisKKy8qIE1pbnQgaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxtaW50L29zYmluZC5oPgorCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisKKyNpbmNsdWRlICJTRExfYXRhcmlrZXlzLmgiCisjaW5jbHVkZSAiU0RMX2F0YXJpZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfaWtiZGludGVycnVwdF9zLmgiCisKKyNkZWZpbmUgS0VZX1BSRVNTRUQJCTB4ZmYKKyNkZWZpbmUgS0VZX1VOREVGSU5FRAkweDgwCisjZGVmaW5lIEtFWV9SRUxFQVNFRAkweDAwCisKK3N0YXRpYyBVaW50MTYgYXRhcmlfcHJldm1vdXNlYjsJLyogc2F2ZSBzdGF0ZSBvZiBtb3VzZSBidXR0b25zICovCisKK3ZvaWQgQXRhcmlJa2JkX0luaXRPU0tleW1hcChfVEhJUykKK3sKKwlTRExfbWVtc2V0KCh2b2lkICopIFNETF9BdGFyaUlrYmRfa2V5Ym9hcmQsIEtFWV9VTkRFRklORUQsIHNpemVvZihTRExfQXRhcmlJa2JkX2tleWJvYXJkKSk7CisKKwkvKiBOb3cgaW5zdGFsbCBvdXIgaGFuZGxlciAqLworCVNETF9BdGFyaUlrYmRfbW91c2ViID0gU0RMX0F0YXJpSWtiZF9tb3VzZXggPSBTRExfQXRhcmlJa2JkX21vdXNleSA9IDA7CisJYXRhcmlfcHJldm1vdXNlYiA9IDA7CisKKwlTdXBleGVjKFNETF9BdGFyaUlrYmRJbnN0YWxsKTsKK30KKworc3RhdGljIGludCBhdGFyaV9HZXRCdXR0b24oaW50IGJ1dHRvbikKK3sKKwlzd2l0Y2goYnV0dG9uKQorCXsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIFNETF9CVVRUT05fUklHSFQ7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIFNETF9CVVRUT05fTEVGVDsKKwkJCWJyZWFrOworCX0KK30KKwordm9pZCBBdGFyaUlrYmRfUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlpbnQgaTsKKwlTRExfa2V5c3ltIGtleXN5bTsKKworCS8qLS0tIFNlbmQga2V5Ym9hcmQgZXZlbnRzIC0tLSovCisKKwlmb3IgKGk9MDsgaTxBVEFSSUJJT1NfTUFYS0VZUzsgaSsrKSB7CisJCS8qIEtleSBwcmVzc2VkID8gKi8KKwkJaWYgKFNETF9BdGFyaUlrYmRfa2V5Ym9hcmRbaV09PUtFWV9QUkVTU0VEKSB7CisJCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELAorCQkJCVNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaSwgJmtleXN5bSwgU0RMX1RSVUUpKTsKKwkJCVNETF9BdGFyaUlrYmRfa2V5Ym9hcmRbaV09S0VZX1VOREVGSU5FRDsKKwkJfQorCQkJCisJCS8qIEtleSByZWxlYXNlZCA/ICovCisJCWlmIChTRExfQXRhcmlJa2JkX2tleWJvYXJkW2ldPT1LRVlfUkVMRUFTRUQpIHsKKwkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELAorCQkJCVNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaSwgJmtleXN5bSwgU0RMX0ZBTFNFKSk7CisJCQlTRExfQXRhcmlJa2JkX2tleWJvYXJkW2ldPUtFWV9VTkRFRklORUQ7CisJCX0KKwl9CisKKwkvKi0tLSBTZW5kIG1vdXNlIGV2ZW50cyAtLS0qLworCisJLyogTW91c2UgbW90aW9uID8gKi8KKwlpZiAoU0RMX0F0YXJpSWtiZF9tb3VzZXggfHwgU0RMX0F0YXJpSWtiZF9tb3VzZXkpIHsKKwkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLCBTRExfQXRhcmlJa2JkX21vdXNleCwgU0RMX0F0YXJpSWtiZF9tb3VzZXkpOworCQlTRExfQXRhcmlJa2JkX21vdXNleCA9IFNETF9BdGFyaUlrYmRfbW91c2V5ID0gMDsKKwl9CisKKwkvKiBNb3VzZSBidXR0b24gPyAqLworCWlmIChTRExfQXRhcmlJa2JkX21vdXNlYiAhPSBhdGFyaV9wcmV2bW91c2ViKSB7CisJCWZvciAoaT0wO2k8MjtpKyspIHsKKwkJCWludCBjdXJidXR0b24sIHByZXZidXR0b247CisKKwkJCWN1cmJ1dHRvbiA9IFNETF9BdGFyaUlrYmRfbW91c2ViICYgKDE8PGkpOworCQkJcHJldmJ1dHRvbiA9IGF0YXJpX3ByZXZtb3VzZWIgJiAoMTw8aSk7CisKKwkJCWlmIChjdXJidXR0b24gJiYgIXByZXZidXR0b24pIHsKKwkJCQlTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBhdGFyaV9HZXRCdXR0b24oaSksIDAsIDApOworCQkJfQorCQkJaWYgKCFjdXJidXR0b24gJiYgcHJldmJ1dHRvbikgeworCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBhdGFyaV9HZXRCdXR0b24oaSksIDAsIDApOworCQkJfQorCQl9CisJCWF0YXJpX3ByZXZtb3VzZWIgPSBTRExfQXRhcmlJa2JkX21vdXNlYjsKKwl9Cit9CisKK3ZvaWQgQXRhcmlJa2JkX1NodXRkb3duRXZlbnRzKHZvaWQpCit7CisJU3VwZXhlYyhTRExfQXRhcmlJa2JkVW5pbnN0YWxsKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2lrYmRldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGV2ZW50c19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzZTc3NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2lrYmRldmVudHNfYy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICoJQXRhcmkga2V5Ym9hcmQgZXZlbnRzIG1hbmFnZXIsIHVzaW5nIGhhcmR3YXJlIElLQkQKKyAqCisgKglQYXRyaWNlIE1hbmRpbgorICovCisKKyNpZm5kZWYgX1NETF9BVEFSSV9JS0JERVZFTlRTX0hfCisjZGVmaW5lIF9TRExfQVRBUklfSUtCREVWRU5UU19IXworCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKKworZXh0ZXJuIHZvaWQgQXRhcmlJa2JkX0luaXRPU0tleW1hcChfVEhJUyk7CitleHRlcm4gdm9pZCBBdGFyaUlrYmRfUHVtcEV2ZW50cyhfVEhJUyk7CitleHRlcm4gdm9pZCBBdGFyaUlrYmRfU2h1dGRvd25FdmVudHModm9pZCk7CisKKyNlbmRpZiAvKiBfU0RMX0FUQVJJX0lLQkRFVkVOVFNfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2lrYmRpbnRlcnJ1cHQuUyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2lrYmRpbnRlcnJ1cHQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZhY2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfaWtiZGludGVycnVwdC5TCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKgorICoJSUtCRCA2MzAxIGludGVycnVwdCByb3V0aW5lCisgKgorICoJUGF0cmljZSBNYW5kaW4KKyAqLworCisJLnRleHQKKworCS5nbG9ibAlfU0RMX0F0YXJpSWtiZEluc3RhbGwKKwkuZ2xvYmwJX1NETF9BdGFyaUlrYmRVbmluc3RhbGwKKworCS5nbG9ibAlfU0RMX0F0YXJpSWtiZF9rZXlib2FyZAorCS5nbG9ibAlfU0RMX0F0YXJpSWtiZF9tb3VzZWIKKwkuZ2xvYmwJX1NETF9BdGFyaUlrYmRfbW91c2V4CisJLmdsb2JsCV9TRExfQXRhcmlJa2JkX21vdXNleQorCS5nbG9ibAlfU0RMX0F0YXJpSWtiZF9qb3lzdGljaworCisJLmdsb2JsCV9TRExfQXRhcmlJa2JkX2VuYWJsZWQKKworLyotLS0gSW5zdGFsbCBvdXIgSUtCRCB2ZWN0b3IgLS0tKi8KKworX1NETF9BdGFyaUlrYmRJbnN0YWxsOgorI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwlsZWEJc3BAKC0xNiksc3AKKwltb3ZlbWwJZDAtZDEvYTAtYTEsc3BACisjZWxzZQorCW1vdmVtbAlkMC1kMS9hMC1hMSxzcEAtCisjZW5kaWYKKworCXwgRGlzYWJsZSBpbnRlcnJ1cHRzCisKKwltb3ZldwkjMHgyNzAwLHNyCisKKwl8IFNhdmUgTUZQIHJlZ2lzdGVycyB1c2VkIGZvciBrZXlib2FyZAorCisJbGVhCTB4ZmZmZmZhMDA6dyxhMAorCWJ0c3QJIzYsYTBAKDB4MDkpCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCXNuZQlkMAorCW1vdmUuYglkMCxpa2JkX2llcmIKKyNlbHNlCisJc25lCWlrYmRfaWVyYgorI2VuZGlmCisJYnRzdAkjNixhMEAoMHgxNSkKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJc25lCWQwCisJbW92ZS5iCWQwLGlrYmRfaW1yYgorI2Vsc2UKKwlzbmUJaWtiZF9pbXJiCisjZW5kaWYKKworCXwgU2V0IG91ciByb3V0aW5lCisKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZWwJMHgxMTg6dyxkMAorCW1vdmVsCWQwLG9sZF9pa2JkCisJbGVhCWlrYmQsYTAKKwltb3ZlbAlhMCwweDExODp3CisJbW92ZXFsCSM2LGQwCisJYnNldAlkMCwweGZmZmZmYTA5OncJfCBJRVJCCisJYnNldAlkMCwweGZmZmZmYTE1OncJfCBJTVJCCisjZWxzZQorCW1vdmVsCTB4MTE4Oncsb2xkX2lrYmQKKwltb3ZlbAkjaWtiZCwweDExODp3CisJYnNldAkjNiwweGZmZmZmYTA5OncJfCBJRVJCCisJYnNldAkjNiwweGZmZmZmYTE1OncJfCBJTVJCCisjZW5kaWYKKworCXwgU2V0IG1vdXNlIHJlbGF0aXZlIG1vZGUKKworI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlcWwJIzgsZDAKKwltb3ZlYglkMCwweGZmZmZmYzAyOncKKyNlbHNlCisJbW92ZWIJIzgsMHhmZmZmZmMwMjp3CisjZW5kaWYKKworCXwgUmVlbmFibGUgaW50ZXJydXB0cworCisJbW92ZXcJIzB4MjMwMCxzcgorCisJfCBJbnRlcnJ1cHRzIGRvbmUKKworI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlbAkjMHhmZmZmLGQwCisJbW92ZXcJZDAsX1NETF9BdGFyaUlrYmRfZW5hYmxlZAorCisJbW92ZW1sCXNwQCxkMC1kMS9hMC1hMQorCWxlYQlzcEAoMTYpLHNwCisjZWxzZQorCW1vdmV3CSMweGZmZmYsX1NETF9BdGFyaUlrYmRfZW5hYmxlZAorCisJbW92ZW1sCXNwQCssZDAtZDEvYTAtYTEKKyNlbmRpZgorCXJ0cworCisvKi0tLSBVbmluc3RhbGwgb3VyIElLQkQgdmVjdG9yIC0tLSovCisKK19TRExfQXRhcmlJa2JkVW5pbnN0YWxsOgorCW1vdmVsCWEwLHNwQC0KKworCXwgRGlzYWJsZSBpbnRlcnJ1cHRzCisKKwltb3ZldwkjMHgyNzAwLHNyCisKKwl8IFJlc3RvcmUgcHJldmlvdXMgTUZQIHJlZ2lzdGVycworCisJbGVhCTB4ZmZmZmZhMDA6dyxhMAorCisJYmNscgkjNixhMEAoMHgwOSkKKwl0c3RiCWlrYmRfaWVyYgorCWJlcXMJaWtiZF9yZXN0b3JlaWVyYgorCWJzZXQJIzYsYTBAKDB4MDkpCitpa2JkX3Jlc3RvcmVpZXJiOgorCisJYmNscgkjNixhMEAoMHgxNSkKKwl0c3RiCWlrYmRfaW1yYgorCWJlcXMJaWtiZF9yZXN0b3JlaW1yYgorCWJzZXQJIzYsYTBAKDB4MTUpCitpa2JkX3Jlc3RvcmVpbXJiOgorCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCW1vdmVsCW9sZF9pa2JkLGEwCisJbW92ZWwJYTAsMHgxMTg6dworI2Vsc2UKKwltb3ZlbAlvbGRfaWtiZCwweDExODp3CisjZW5kaWYKKworCXwgQ2xlYXIga2V5Ym9hcmQgYnVmZmVyCisKKwlsZWEJMHhmZmZmZmMwMDp3LGEwCitpa2JkX3ZpZGVidWZmZXI6CisJYnRzdAkjMCxhMEAKKwliZXFzCWlrYmRfZmluYnVmZmVyCisJdHN0YglhMEAoMHgwMikKKwlicmFzCWlrYmRfdmlkZWJ1ZmZlcgoraWtiZF9maW5idWZmZXI6CisKKwl8IFJlZW5hYmxlIGludGVycnVwdHMKKworCW1vdmV3CSMweDIzMDAsc3IKKworCW1vdmVsCXNwQCssYTAKKwlydHMKKworCS5ic3MKKworCS5ldmVuCisJLmNvbW0JaWtiZF9pZXJiLDEKKwkuY29tbQlpa2JkX2ltcmIsMQorCisvKi0tLSBPdXIgY3VzdG9tIElLQkQgdmVjdG9yIC0tLSovCisKKwkudGV4dAorCS5ldmVuCisJLmFzY2lpCSJYQlJBIgorCS5hc2NpaQkiTFNETCIKKwkuY29tbQlvbGRfaWtiZCw0KjEKK2lrYmQ6CisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCWxlYQlzcEAoLTEyKSxzcAorCW1vdmVtbAlkMC1kMS9hMCxzcEAKKyNlbHNlCisJbW92ZW1sCWQwLWQxL2EwLHNwQC0KKyNlbmRpZgorCisJfCBDaGVjayBpZiBzb3VyY2UgaXMgSUtCRCBvciBNSURJCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCW1vdmVxbAkjMCxkMAorCWJ0c3QJZDAsMHhmZmZmZmMwMC53CisjZWxzZQorCWJ0c3QJIzAsMHhmZmZmZmMwMC53CisjZW5kaWYKKwliZXFzCWlrYmRfb2xkbWlkaQorCisJbW92ZWIJMHhmZmZmZmMwMjp3LGQwCisKKwl8IEpveXN0aWNrIHBhY2tldCA/CisJCisJY21wYgkjMHhmZixkMAorCWJlcXMJaWtiZF95ZXNfam95c3RpY2sKKworCXwgTW91c2UgcGFja2V0ID8KKworCWNtcGIJIzB4ZjgsZDAKKwlibWlzCWlrYmRfbm9fbW91c2UKKwljbXBiCSMweGZjLGQwCisJYnBscwlpa2JkX25vX21vdXNlCisKKwl8IE1vdXNlIHBhY2tldCwgYnl0ZSAjMQorCitpa2JkX3llc19tb3VzZToKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJYW5kbAkjMyxkMAorI2Vsc2UKKwlhbmR3CSMzLGQwCisjZW5kaWYKKwltb3ZldwlkMCxfU0RMX0F0YXJpSWtiZF9tb3VzZWIKKworI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlbAkjaWtiZF9tb3VzZXgsZDAKKwltb3ZlbAlkMCwweDExODp3CisjZWxzZQorCW1vdmVsCSNpa2JkX21vdXNleCwweDExODp3CisjZW5kaWYKKwlicmFzCWlrYmRfZW5kaXRfc3RhY2sKKworCXwgSm95c3RpY2sgcGFja2V0LCBieXRlICMxCisKK2lrYmRfeWVzX2pveXN0aWNrOgorI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlbAkjaWtiZF9qb3lzdGljayxkMAorCW1vdmVsCWQwLDB4MTE4OncKKyNlbHNlCisJbW92ZWwJI2lrYmRfam95c3RpY2ssMHgxMTg6dworI2VuZGlmCisJYnJhcwlpa2JkX2VuZGl0X3N0YWNrCisKKwl8IEtleWJvYXJkIHByZXNzL3JlbGVhc2UKKworaWtiZF9ub19tb3VzZToKKwltb3ZlYglkMCxkMQorCWxlYQkJX1NETF9BdGFyaUlrYmRfa2V5Ym9hcmQsYTAKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJYW5kbAkjMHg3ZixkMQorCWJ0c3QJIzcsZDAKKwlzcGwJZDAKKwltb3ZlYglkMCxhMEAoMCxkMTpsKQorI2Vsc2UKKwlhbmR3CSMweDdmLGQxCisJdGFzCWQwCisJc3BsCWEwQCgwLGQxOncpCisjZW5kaWYKKworCXwgRW5kIG9mIGludGVycnVwdAorCitpa2JkX2VuZGl0X3N0YWNrOgorI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlcWwJIzYsZDAKKwliY2xyCWQwLDB4ZmZmZmZhMTE6dworCisJbW92ZW1sCXNwQCxkMC1kMS9hMAorCWxlYQlzcEAoMTIpLHNwCisjZWxzZQorCW1vdmVtbAlzcEArLGQwLWQxL2EwCisKKwliY2xyCSM2LDB4ZmZmZmZhMTE6dworI2VuZGlmCisJcnRlCisKKwl8IENhbGwgb2xkIE1JREkgaW50ZXJydXB0CisKK2lrYmRfb2xkbWlkaToKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZW1sCXNwQCxkMC1kMS9hMAorCWxlYQlzcEAoMTIpLHNwCisjZWxzZQorCW1vdmVtbAlzcEArLGQwLWQxL2EwCisjZW5kaWYKKworCW1vdmVsCW9sZF9pa2JkLHNwQC0KKwlydHMKKworCXwgTW91c2UgcGFja2V0LCBieXRlICMyCisKK2lrYmRfbW91c2V4OgorI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwlsZWEJc3BAKC0xMiksc3AKKwltb3ZlbWwJZDAtZDEvYTAsc3BACisjZWxzZQorCW1vdmVtbAlkMC1kMS9hMCxzcEAtCisjZW5kaWYKKworCXwgQ2hlY2sgaWYgc291cmNlIGlzIElLQkQgb3IgTUlESQorI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZlcWwJIzAsZDAKKwlidHN0CWQwLDB4ZmZmZmZjMDAudworI2Vsc2UKKwlidHN0CSMwLDB4ZmZmZmZjMDAudworI2VuZGlmCisJYmVxcwlpa2JkX29sZG1pZGkKKworCW1vdmViCTB4ZmZmZmZjMDI6dyxkMAorCWV4dHcJZDAKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZXcJX1NETF9BdGFyaUlrYmRfbW91c2V4LGQxCisJYWRkbAlkMSxkMAorCW1vdmV3CWQwLF9TRExfQXRhcmlJa2JkX21vdXNleAorCisJbW92ZWwJI2lrYmRfbW91c2V5LGQwCisJbW92ZWwJZDAsMHgxMTg6dworI2Vsc2UKKwlhZGR3CWQwLF9TRExfQXRhcmlJa2JkX21vdXNleAorCisJbW92ZWwJI2lrYmRfbW91c2V5LDB4MTE4OncKKyNlbmRpZgorCWJyYXMJaWtiZF9lbmRpdF9zdGFjaworCisJfCBNb3VzZSBwYWNrZXQsIGJ5dGUgIzMKKworaWtiZF9tb3VzZXk6CisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCWxlYQlzcEAoLTEyKSxzcAorCW1vdmVtbAlkMC1kMS9hMCxzcEAKKyNlbHNlCisJbW92ZW1sCWQwLWQxL2EwLHNwQC0KKyNlbmRpZgorCisJfCBDaGVjayBpZiBzb3VyY2UgaXMgSUtCRCBvciBNSURJCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCW1vdmVxbAkjMCxkMAorCWJ0c3QJZDAsMHhmZmZmZmMwMC53CisjZWxzZQorCWJ0c3QJIzAsMHhmZmZmZmMwMC53CisjZW5kaWYKKwliZXFzCWlrYmRfb2xkbWlkaQorCisJbW92ZWIJMHhmZmZmZmMwMjp3LGQwCisJZXh0dwlkMAorI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZldwlfU0RMX0F0YXJpSWtiZF9tb3VzZXksZDEKKwlhZGRsCWQxLGQwCisJbW92ZXcJZDAsX1NETF9BdGFyaUlrYmRfbW91c2V5CisKKwltb3ZlbAkjaWtiZCxkMAorCW1vdmVsCWQwLDB4MTE4OncKKyNlbHNlCisJYWRkdwlkMCxfU0RMX0F0YXJpSWtiZF9tb3VzZXkKKworCW1vdmVsCSNpa2JkLDB4MTE4OncKKyNlbmRpZgorCWJyYXMJaWtiZF9lbmRpdF9zdGFjaworCisJfCBKb3lzdGljayBwYWNrZXQsIGJ5dGUgIzIKKworaWtiZF9qb3lzdGljazoKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbGVhCXNwQCgtMTIpLHNwCisJbW92ZW1sCWQwLWQxL2EwLHNwQAorI2Vsc2UKKwltb3ZlbWwJZDAtZDEvYTAsc3BALQorI2VuZGlmCisKKwl8IENoZWNrIGlmIHNvdXJjZSBpcyBJS0JEIG9yIE1JREkKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZXFsCSMwLGQwCisJYnRzdAlkMCwweGZmZmZmYzAwLncKKyNlbHNlCisJYnRzdAkjMCwweGZmZmZmYzAwLncKKyNlbmRpZgorCWJlcXMJaWtiZF9vbGRtaWRpCisKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZWIJMHhmZmZmZmMwMjp3LGQwCisJbW92ZWIJZDAsX1NETF9BdGFyaUlrYmRfam95c3RpY2srMQorCisJbW92ZWwJI2lrYmQsZDAKKwltb3ZlbAlkMCwweDExODp3CisKKwlicmEJaWtiZF9lbmRpdF9zdGFjaworI2Vsc2UKKwltb3ZlYgkweGZmZmZmYzAyOncsX1NETF9BdGFyaUlrYmRfam95c3RpY2srMQorCisJbW92ZWwJI2lrYmQsMHgxMTg6dworCisJYnJhcwlpa2JkX2VuZGl0X3N0YWNrCisjZW5kaWYKKworCS5kYXRhCisJCisJLmV2ZW4KK19TRExfQXRhcmlJa2JkX2VuYWJsZWQ6CisJLndvcmQJMAorCisJLmJzcworCisJLmV2ZW4KKwkuY29tbQlfU0RMX0F0YXJpSWtiZF9rZXlib2FyZCwxMjgKKwkuY29tbQlfU0RMX0F0YXJpSWtiZF9tb3VzZXgsMgorCS5jb21tCV9TRExfQXRhcmlJa2JkX21vdXNleSwyCisJLmNvbW0JX1NETF9BdGFyaUlrYmRfbW91c2ViLDIKKwkuY29tbQlfU0RMX0F0YXJpSWtiZF9qb3lzdGljaywyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9pa2JkaW50ZXJydXB0X3MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX2lrYmRpbnRlcnJ1cHRfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNTQ0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF9pa2JkaW50ZXJydXB0X3MuaApAQCAtMCwwICsxLDYxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqCU1vdXNlIHZlY3RvcgorICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2lmbmRlZiBfU0RMX0lLQkRJTlRFUlJVUFRfU19IXworI2RlZmluZSBfU0RMX0lLQkRJTlRFUlJVUFRfU19IXworCisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKworLyogQ29uc3QgKi8KKworI2RlZmluZSBJS0JEX0pPWV9VUAkJKDE8PDApCisjZGVmaW5lIElLQkRfSk9ZX0RPV04JKDE8PDEpCisjZGVmaW5lIElLQkRfSk9ZX0xFRlQJKDE8PDIpCisjZGVmaW5lIElLQkRfSk9ZX1JJR0hUCSgxPDwzKQorI2RlZmluZSBJS0JEX0pPWV9GSVJFCSgxPDw3KQorCisvKiBWYXJpYWJsZXMgKi8KKworZXh0ZXJuIHZvbGF0aWxlIFVpbnQ4ICBTRExfQXRhcmlJa2JkX2tleWJvYXJkWzEyOF07CS8qIEtleWJvYXJkIHRhYmxlICovCitleHRlcm4gdm9sYXRpbGUgVWludDE2IFNETF9BdGFyaUlrYmRfbW91c2ViOwkvKiBNb3VzZSBvbiBwb3J0IDAsIGJ1dHRvbnMgKi8KK2V4dGVybiB2b2xhdGlsZSBTaW50MTYgU0RMX0F0YXJpSWtiZF9tb3VzZXg7CS8qIE1vdXNlIFggcmVsYXRpdmUgbW90aW9uICovCitleHRlcm4gdm9sYXRpbGUgU2ludDE2IFNETF9BdGFyaUlrYmRfbW91c2V5OwkvKiBNb3VzZSBZIHJlbGF0aXZlIG1vdGlvbiAqLworZXh0ZXJuIHZvbGF0aWxlIFVpbnQxNiBTRExfQXRhcmlJa2JkX2pveXN0aWNrOwkvKiBKb3lzdGljayBvbiBwb3J0IDEgKi8KKworLyogRm9yIGpveXN0aWNrIGRyaXZlciB0byBrbm93IGlmIHRoaXMgaXMgdXNhYmxlICovCitleHRlcm4gVWludDE2IFNETF9BdGFyaUlrYmRfZW5hYmxlZDsKKwkJCQkJCQkJCQkKKy8qIEZ1bmN0aW9ucyAqLyAKKworZXh0ZXJuIHZvaWQgU0RMX0F0YXJpSWtiZEluc3RhbGwodm9pZCk7CitleHRlcm4gdm9pZCBTRExfQXRhcmlJa2JkVW5pbnN0YWxsKHZvaWQpOworCisjZW5kaWYgLyogX1NETF9JS0JESU5URVJSVVBUX1NfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2V2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMjUwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2V2ZW50cy5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqCVhCSU9TIG1vdXNlICYgam95c3RpY2sgdmVjdG9ycworICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+CisKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX2F0YXJpc3VwZXIuaCIKKyNpbmNsdWRlICJTRExfeGJpb3NldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF94Ymlvc2ludGVycnVwdF9zLmgiCisKKy8qIFZhcmlhYmxlcyAqLworCitpbnQgU0RMX0F0YXJpWGJpb3NfZW5hYmxlZD0wOworCisvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKworc3RhdGljIF9LQkRWRUNTICprYmR2ZWNzOwkJLyogUG9pbnRlciB0byBhY2Nlc3Mgc3lzdGVtIHZlY3RvcnMgKi8KK3N0YXRpYyBVaW50MTYgYXRhcmlfcHJldm1vdXNlYjsJLyogYnV0dG9ucyAqLworCisvKiBGdW5jdGlvbnMgKi8KKwordm9pZCBTRExfQXRhcmlYYmlvc19JbnN0YWxsVmVjdG9ycyhpbnQgdmVjdG9yc19tYXNrKQoreworCXZvaWQgKm9sZHBpbGU7CisKKwkvKiBDbGVhciB2YXJpYWJsZXMgKi8KKwlTRExfQXRhcmlYYmlvc19tb3VzZWxvY2sgPQorCQlTRExfQXRhcmlYYmlvc19tb3VzZWIgPQorCQlTRExfQXRhcmlYYmlvc19tb3VzZXggPQorCQlTRExfQXRhcmlYYmlvc19tb3VzZXkgPQorCQlTRExfQXRhcmlYYmlvc19qb3lzdGljayA9CisJCWF0YXJpX3ByZXZtb3VzZWIgPSAwOworCisJaWYgKHZlY3RvcnNfbWFzaz09MCkgeworCQlTRExfQXRhcmlYYmlvc19lbmFibGVkPTA7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZWFkIElLQkQgdmVjdG9ycyBiYXNlICovCisJa2JkdmVjcz1LYmR2YmFzZSgpOworCisJLyogR28gdG8gc3VwZXJ2aXNvciBtb2RlICovCisJb2xkcGlsZT0odm9pZCAqKVN1cGVyKDApOworCisJLyogSW5zdGFsbCBvdXIgdmVjdG9ycyAqLworCVNETF9BdGFyaVhiaW9zX0luc3RhbGwoCisJCWtiZHZlY3MsCisJCSh2ZWN0b3JzX21hc2sgJiBBVEFSSV9YQklPU19NT1VTRUVWRU5UUykgPyBTRExfQXRhcmlYYmlvc19Nb3VzZVZlY3RvciA6IE5VTEwsCisJCSh2ZWN0b3JzX21hc2sgJiBBVEFSSV9YQklPU19KT1lTVElDS0VWRU5UUykgPyBTRExfQXRhcmlYYmlvc19Kb3lzdGlja1ZlY3RvciA6IE5VTEwKKwkpOworCisJLyogQmFjayB0byB1c2VyIG1vZGUgKi8KKwlTdXBlclRvVXNlcihvbGRwaWxlKTsKKworCVNETF9BdGFyaVhiaW9zX2VuYWJsZWQ9MTsKK30KKwordm9pZCBTRExfQXRhcmlYYmlvc19SZXN0b3JlVmVjdG9ycyh2b2lkKQoreworCXZvaWQgKm9sZHBpbGU7CisKKwlpZiAoU0RMX0F0YXJpWGJpb3NfZW5hYmxlZD09MCkgeworCQlyZXR1cm47CisJfQorCisJLyogUmVhZCBJS0JEIHZlY3RvcnMgYmFzZSAqLworCWtiZHZlY3M9S2JkdmJhc2UoKTsKKworCS8qIEdvIHRvIHN1cGVydmlzb3IgbW9kZSAqLworCW9sZHBpbGU9KHZvaWQgKilTdXBlcihOVUxMKTsKKworCS8qIFJlaW5zdGFsbCBzeXN0ZW0gdmVjdG9yICovCisJU0RMX0F0YXJpWGJpb3NfUmVzdG9yZShrYmR2ZWNzKTsKKworCS8qIEJhY2sgdG8gdXNlciBtb2RlICovCisJU3VwZXJUb1VzZXIob2xkcGlsZSk7Cit9CisKK3N0YXRpYyBpbnQgYXRhcmlfR2V0QnV0dG9uKGludCBidXR0b24pCit7CisJc3dpdGNoKGJ1dHRvbikKKwl7CisJCWNhc2UgMDoKKwkJCXJldHVybiBTRExfQlVUVE9OX1JJR0hUOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBTRExfQlVUVE9OX0xFRlQ7CisJCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgU0RMX0F0YXJpWGJpb3NfUG9zdE1vdXNlRXZlbnRzKF9USElTLCBTRExfYm9vbCBidXR0b25FdmVudHMpCit7CisJaWYgKFNETF9BdGFyaVhiaW9zX2VuYWJsZWQ9PTApIHsKKwkJcmV0dXJuOworCX0KKworCS8qIE1vdXNlIG1vdGlvbiA/ICovCisJaWYgKFNETF9BdGFyaVhiaW9zX21vdXNleCB8fCBTRExfQXRhcmlYYmlvc19tb3VzZXkpIHsKKwkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLCBTRExfQXRhcmlYYmlvc19tb3VzZXgsIFNETF9BdGFyaVhiaW9zX21vdXNleSk7CisJCVNETF9BdGFyaVhiaW9zX21vdXNleCA9IFNETF9BdGFyaVhiaW9zX21vdXNleSA9IDA7CisJfQorCQorCS8qIE1vdXNlIGJ1dHRvbiA/ICovCisJaWYgKGJ1dHRvbkV2ZW50cyAmJiAoU0RMX0F0YXJpWGJpb3NfbW91c2ViICE9IGF0YXJpX3ByZXZtb3VzZWIpKSB7CisJCWludCBpOworCisJCWZvciAoaT0wO2k8MjtpKyspIHsKKwkJCWludCBjdXJidXR0b24sIHByZXZidXR0b247CisKKwkJCWN1cmJ1dHRvbiA9IFNETF9BdGFyaVhiaW9zX21vdXNlYiAmICgxPDxpKTsKKwkJCXByZXZidXR0b24gPSBhdGFyaV9wcmV2bW91c2ViICYgKDE8PGkpOworCisJCQlpZiAoY3VyYnV0dG9uICYmICFwcmV2YnV0dG9uKSB7CisJCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgYXRhcmlfR2V0QnV0dG9uKGkpLCAwLCAwKTsKKwkJCX0KKwkJCWlmICghY3VyYnV0dG9uICYmIHByZXZidXR0b24pIHsKKwkJCQlTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgYXRhcmlfR2V0QnV0dG9uKGkpLCAwLCAwKTsKKwkJCX0KKwkJfQorCQlhdGFyaV9wcmV2bW91c2ViID0gU0RMX0F0YXJpWGJpb3NfbW91c2ViOworCX0KK30KKwordm9pZCBTRExfQXRhcmlYYmlvc19Mb2NrTW91c2VQb3NpdGlvbihTRExfYm9vbCBsb2NrUG9zaXRpb24pCit7CisJU0RMX0F0YXJpWGJpb3NfbW91c2Vsb2NrID0gbG9ja1Bvc2l0aW9uOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfeGJpb3NldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9hdGFyaWNvbW1vbi9TRExfeGJpb3NldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NGIwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2V2ZW50c19jLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgKglYYmlvcyBtb3VzZSAmIGpveXN0aWNrIHZlY3RvcnMKKyAqCisgKglQYXRyaWNlIE1hbmRpbgorICovCisKKyNpZm5kZWYgX1NETF9BVEFSSV9YQklPU0VWRU5UU19IXworI2RlZmluZSBfU0RMX0FUQVJJX1hCSU9TRVZFTlRTX0hfCisKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcworCisjZGVmaW5lIEFUQVJJX1hCSU9TX01PVVNFRVZFTlRTICgxPDwwKQorI2RlZmluZSBBVEFSSV9YQklPU19KT1lTVElDS0VWRU5UUyAoMTw8MSkKKworZXh0ZXJuIGludCBTRExfQXRhcmlYYmlvc19lbmFibGVkOworCitleHRlcm4gdm9pZCBTRExfQXRhcmlYYmlvc19JbnN0YWxsVmVjdG9ycyhpbnQgdmVjdG9yc19tYXNrKTsKK2V4dGVybiB2b2lkIFNETF9BdGFyaVhiaW9zX1Jlc3RvcmVWZWN0b3JzKHZvaWQpOworZXh0ZXJuIHZvaWQgU0RMX0F0YXJpWGJpb3NfUG9zdE1vdXNlRXZlbnRzKF9USElTLCBTRExfYm9vbCBidXR0b25FdmVudHMpOworZXh0ZXJuIHZvaWQgU0RMX0F0YXJpWGJpb3NfTG9ja01vdXNlUG9zaXRpb24oU0RMX2Jvb2wgbG9ja1Bvc2l0aW9uKTsKKworI2VuZGlmIC8qIF9TRExfWEJJT1NFVkVOVFNfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zaW50ZXJydXB0LlMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2ludGVycnVwdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzFhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2ludGVycnVwdC5TCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisvKgorICoJWEJJT1MgbW91c2UgJiBqb3lzdGljayB2ZWN0b3JzCisgKgorICoJUGF0cmljZSBNYW5kaW4KKyAqLworCisJLnRleHQKKworCS5nbG9ibAlfU0RMX0F0YXJpWGJpb3NfSW5zdGFsbAorCS5nbG9ibAlfU0RMX0F0YXJpWGJpb3NfUmVzdG9yZQorCS5nbG9ibAlfU0RMX0F0YXJpWGJpb3NfTW91c2VWZWN0b3IKKwkuZ2xvYmwJX1NETF9BdGFyaVhiaW9zX0pveXN0aWNrVmVjdG9yCisKKwkuZ2xvYmwJX1NETF9BdGFyaVhiaW9zX21vdXNlbG9jaworCS5nbG9ibAlfU0RMX0F0YXJpWGJpb3NfbW91c2ViCisJLmdsb2JsCV9TRExfQXRhcmlYYmlvc19tb3VzZXgKKwkuZ2xvYmwJX1NETF9BdGFyaVhiaW9zX21vdXNleQorCS5nbG9ibAlfU0RMX0F0YXJpWGJpb3Nfam95c3RpY2sKKworLyotLS0gVmVjdG9yIGluc3RhbGxlciAtLS0qLworCitfU0RMX0F0YXJpWGJpb3NfSW5zdGFsbDoKKwltb3ZlbAlzcEAoNCksYTAKKworCS8qIFN0b3AgaW50ZXJydXB0cyAqLworCisJbW92ZXcJIzB4MjcwMCxzcgorCisJLyogU2F2ZSBvbGQgbW91c2UgdmVjdG9yLCBzZXQgb3VyIHJvdXRpbmUgKi8KKworCWNscmwJb2xkbW91c2V2ZWN0b3IKKwltb3ZlbAlzcEAoOCksZDAKKwliZXFzCW5vX25ld19tb3VzZV92ZWN0b3IKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZWwJYTBAKDE2KSxkMQorCW1vdmVsCWQxLG9sZG1vdXNldmVjdG9yCisjZWxzZQorCW1vdmVsCWEwQCgxNiksb2xkbW91c2V2ZWN0b3IKKyNlbmRpZgorCW1vdmVsCWQwLGEwQCgxNikKK25vX25ld19tb3VzZV92ZWN0b3I6CisKKwkvKiBTYXZlIG9sZCBqb3lzdGljayB2ZWN0b3IsIHNldCBvdXIgcm91dGluZSAqLworCisJY2xybAlvbGRqb3lzdGlja3ZlY3RvcgorCW1vdmVsCXNwQCgxMiksZDAKKwliZXFzCW5vX25ld19qb3lzdGlja192ZWN0b3IKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZWwJYTBAKDI0KSxkMQorCW1vdmVsCWQxLG9sZGpveXN0aWNrdmVjdG9yCisjZWxzZQorCW1vdmVsCWEwQCgyNCksb2xkam95c3RpY2t2ZWN0b3IKKyNlbmRpZgorCW1vdmVsCWQwLGEwQCgyNCkKK25vX25ld19qb3lzdGlja192ZWN0b3I6CisKKwkvKiBSZXN0YXJ0IGludGVycnVwdHMgKi8KKworCW1vdmV3CSMweDIzMDAsc3IKKworCXJ0cworCisvKi0tLSBWZWN0b3IgcmVzdG9yZXIgLS0tKi8KKworX1NETF9BdGFyaVhiaW9zX1Jlc3RvcmU6CisJbW92ZWwJc3BAKDQpLGEwCisKKwkvKiBTdG9wIGludGVycnVwdHMgKi8KKworCW1vdmV3CSMweDI3MDAsc3IKKworCS8qIFJlc3RvcmUgbW91c2UgdmVjdG9yICovCisKKwltb3ZlbAlvbGRtb3VzZXZlY3RvcixkMAorCWJlcXMJbm9fcmVzdG9yZV9tb3VzZQorCW1vdmVsCWQwLGEwQCgxNikKK25vX3Jlc3RvcmVfbW91c2U6CisKKwkvKiBSZXN0b3JlIGpveXN0aWNrIHZlY3RvciAqLworCisJbW92ZWwJb2xkam95c3RpY2t2ZWN0b3IsZDAKKwliZXFzCW5vX3Jlc3RvcmVfam95c3RpY2sKKwltb3ZlbAlkMCxhMEAoMjQpCitub19yZXN0b3JlX2pveXN0aWNrOgorCisJLyogUmVzdGFydCBpbnRlcnJ1cHRzICovCisKKwltb3ZldwkjMHgyMzAwLHNyCisKKwlydHMKKworLyotLS0gT3VyIG1vdXNlIHZlY3RvciAtLS0qLworCisJLnRleHQKKwkuZXZlbgorCS5hc2NpaSAiWEJSQSIKKwkuYXNjaWkgIkxTREwiCisJLmNvbW0Jb2xkbW91c2V2ZWN0b3IsNCoxCitfU0RMX0F0YXJpWGJpb3NfTW91c2VWZWN0b3I6CisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCWxlYQlzcEAoLTgpLHNwCisJbW92ZW1sCWQwLWQxLHNwQAorI2Vsc2UKKwltb3ZlbAlkMCxzcEAtCisjZW5kaWYKKworCS8qIE1vdXNlIGJ1dHRvbnMgKi8KKwltb3ZlYgkoYTApLGQwCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCWFuZGwJIzMsZDAKKyNlbHNlCisJYW5kdwkjMyxkMAorI2VuZGlmCisJbW92ZXcJZDAsX1NETF9BdGFyaVhiaW9zX21vdXNlYgorCisJLyogWCBtb3ZlbWVudCAqLworCW1vdmViCWEwQCgxKSxkMAorCWV4dHcJZDAKKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZXcJX1NETF9BdGFyaVhiaW9zX21vdXNleCxkMQorCWFkZGwJZDEsZDAKKwltb3ZldwlkMCxfU0RMX0F0YXJpWGJpb3NfbW91c2V4CisjZWxzZQorCWFkZHcJZDAsX1NETF9BdGFyaVhiaW9zX21vdXNleAorI2VuZGlmCisKKwkvKiBZIG1vdmVtZW50ICovCisJbW92ZWIJYTBAKDIpLGQwCisJZXh0dwlkMAorI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKKwltb3ZldwlfU0RMX0F0YXJpWGJpb3NfbW91c2V5LGQxCisJYWRkbAlkMSxkMAorCW1vdmV3CWQwLF9TRExfQXRhcmlYYmlvc19tb3VzZXkKKyNlbHNlCisJYWRkdwlkMCxfU0RMX0F0YXJpWGJpb3NfbW91c2V5CisjZW5kaWYKKworCS8qIExvY2sgbW91c2UgcG9zaXRpb24gPyAqLworCXRzdHcJX1NETF9BdGFyaVhiaW9zX21vdXNlbG9jaworCWJlcS5zCW5vX21vdXNlX2xvY2sKKwljbHJiCWEwQCgxKQorCWNscmIJYTBAKDIpCitub19tb3VzZV9sb2NrOgorCisJLyogSnVtcCB0aHJvdWdoIG9sZCB2ZWN0b3IgKi8KKyNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCisJbW92ZW1sCXNwQCxkMC1kMQorCWxlYQlzcEAoOCksc3AKKyNlbHNlCisJbW92ZWwJc3BAKyxkMAorI2VuZGlmCisKKwltb3ZlbAlvbGRtb3VzZXZlY3RvcixzcEAtCisJcnRzCisKKwkuZGF0YQorCS5ldmVuCisJLmNvbW0JX1NETF9BdGFyaVhiaW9zX21vdXNlbG9jaywyKjEKKwkuY29tbQlfU0RMX0F0YXJpWGJpb3NfbW91c2V4LDIqMQorCS5jb21tCV9TRExfQXRhcmlYYmlvc19tb3VzZXksMioxCisJLmNvbW0JX1NETF9BdGFyaVhiaW9zX21vdXNlYiwyKjEKKworLyotLS0gT3VyIGpveXN0aWNrIHZlY3RvciAtLS0qLworCisJLnRleHQKKwkuZXZlbgorCS5hc2NpaSAiWEJSQSIKKwkuYXNjaWkgIkxTREwiCisJLmNvbW0Jb2xkam95c3RpY2t2ZWN0b3IsNCoxCitfU0RMX0F0YXJpWGJpb3NfSm95c3RpY2tWZWN0b3I6CisJbW92ZWwJZDAsc3BALQorCisJLyogTmV3IGpveXN0aWNrIHN0YXRlICovCisJbW92ZWIJYTBAKDIpLGQwCisjaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQorCWFuZGwJIzB4OGYsZDAKKyNlbHNlCisJYW5kdwkjMHg4ZixkMAorI2VuZGlmCisJbW92ZXcJZDAsX1NETF9BdGFyaVhiaW9zX2pveXN0aWNrCisKKwkvKiBKdW1wIHRocm91Z2ggb2xkIHZlY3RvciAqLworCW1vdmVsCXNwQCssZDAKKworCW1vdmVsCW9sZGpveXN0aWNrdmVjdG9yLHNwQC0KKwlydHMKKworCS5kYXRhCisJLmV2ZW4KKwkuY29tbQlfU0RMX0F0YXJpWGJpb3Nfam95c3RpY2ssMioxCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2ludGVycnVwdF9zLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2F0YXJpY29tbW9uL1NETF94Ymlvc2ludGVycnVwdF9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiMzFjMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYXRhcmljb21tb24vU0RMX3hiaW9zaW50ZXJydXB0X3MuaApAQCAtMCwwICsxLDUyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqCU1vdXNlIHZlY3RvcgorICoKKyAqCVBhdHJpY2UgTWFuZGluCisgKi8KKworI2lmbmRlZiBfU0RMX1hCSU9TSU5URVJSVVBUX1NfSF8KKyNkZWZpbmUgX1NETF9YQklPU0lOVEVSUlVQVF9TX0hfCisKKyNpbmNsdWRlIDxtaW50L29zYmluZC5oPgorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorCisvKiBWYXJpYWJsZXMgKi8KKworZXh0ZXJuIHZvbGF0aWxlIFVpbnQxNiBTRExfQXRhcmlYYmlvc19tb3VzZWxvY2s7CS8qIG1vdXNlIGxvY2sgcG9zaXRpb24gKi8KK2V4dGVybiB2b2xhdGlsZSBVaW50MTYgU0RMX0F0YXJpWGJpb3NfbW91c2ViOwkvKiBidXR0b25zICovCitleHRlcm4gdm9sYXRpbGUgU2ludDE2IFNETF9BdGFyaVhiaW9zX21vdXNleDsJLyogWCByZWxhdGl2ZSBtb3Rpb24gKi8KK2V4dGVybiB2b2xhdGlsZSBTaW50MTYgU0RMX0F0YXJpWGJpb3NfbW91c2V5OwkvKiBZIHJlbGF0aXZlIG1vdGlvbiAqLworZXh0ZXJuIHZvbGF0aWxlIFVpbnQxNiBTRExfQXRhcmlYYmlvc19qb3lzdGljazsJLyogSm95c3RpY2sgKi8KKworLyogRnVuY3Rpb25zICovIAorCitleHRlcm4gdm9pZCBTRExfQXRhcmlYYmlvc19JbnN0YWxsKF9LQkRWRUNTICprYmR2ZWNzLHZvaWQgKm5ld21vdXNldmVjdG9yLHZvaWQgKm5ld2pveXN0aWNrdmVjdG9yKTsKK2V4dGVybiB2b2lkIFNETF9BdGFyaVhiaW9zX1Jlc3RvcmUoX0tCRFZFQ1MgKmtiZHZlY3MpOworZXh0ZXJuIHZvaWQgU0RMX0F0YXJpWGJpb3NfTW91c2VWZWN0b3Iodm9pZCAqYnVmKTsKK2V4dGVybiB2b2lkIFNETF9BdGFyaVhiaW9zX0pveXN0aWNrVmVjdG9yKHZvaWQgKmJ1Zik7CisKKyNlbmRpZiAvKiBfU0RMX1hCSU9TSU5URVJSVVBUX1NfSF8gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYmxhbmtfY3Vyc29yLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2JsYW5rX2N1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjk2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2JsYW5rX2N1cnNvci5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAKKyAqIEEgZGVmYXVsdCBibGFuayA4eDggY3Vyc29yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBCTEFOS19DV0lEVEgJOAorI2RlZmluZSBCTEFOS19DSEVJR0hUCTgKKyNkZWZpbmUgQkxBTktfQ0hPVFgJMAorI2RlZmluZSBCTEFOS19DSE9UWQkwCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJsYW5rX2NkYXRhWzhdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBibGFua19jbWFza1s4XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX0JWaWV3LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX0JWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhMmM4OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfQlZpZXcuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9CVmlld19oCisjZGVmaW5lIF9TRExfQlZpZXdfaAorCisvKiBUaGlzIGlzIHRoZSBldmVudCBoYW5kbGluZyBhbmQgZ3JhcGhpY3MgdXBkYXRlIHBvcnRpb24gb2YgU0RMX0JXaW4gKi8KKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorfTsKKworY2xhc3MgU0RMX0JWaWV3IDogcHVibGljIEJWaWV3Cit7CitwdWJsaWM6CisJU0RMX0JWaWV3KEJSZWN0IGZyYW1lKSA6IAorCQlCVmlldyhmcmFtZSwgIlNETCBWaWV3IiwgQl9GT0xMT1dfQUxMX1NJREVTLAorCQkJCQkoQl9XSUxMX0RSQVd8Ql9GUkFNRV9FVkVOVFMpKSB7CisJCWltYWdlID0gTlVMTDsKKwkJeG9mZiA9IHlvZmYgPSAwOworCQlTZXRWaWV3Q29sb3IoMCwwLDAsMCk7CisJCVNldEhpZ2hDb2xvcigwLDAsMCwwKTsKKwl9CisJdmlydHVhbCB+U0RMX0JWaWV3KCkgeworCQlTZXRCaXRtYXAoTlVMTCk7CisJfQorCS8qIFNldCBkcmF3aW5nIG9mZnNldHMgZm9yIGZ1bGxzY3JlZW4gbW9kZSAqLworCXZpcnR1YWwgdm9pZCBTZXRYWU9mZnNldChpbnQgeCwgaW50IHkpIHsKKwkJeG9mZiA9IHg7CisJCXlvZmYgPSB5OworCX0KKwl2aXJ0dWFsIHZvaWQgR2V0WFlPZmZzZXQoaW50ICZ4LCBpbnQgJnkpIHsKKwkJeCA9IHhvZmY7CisJCXkgPSB5b2ZmOworCX0KKwl2aXJ0dWFsIHZvaWQgR2V0WFlPZmZzZXQoZmxvYXQgJngsIGZsb2F0ICZ5KSB7CisJCXggPSAoZmxvYXQpeG9mZjsKKwkJeSA9IChmbG9hdCl5b2ZmOworCX0KKwkvKiBUaGUgdmlldyBjaGFuZ2VkIHNpemUuIElmIGl0IG1lYW5zIHdlJ3JlIGluIGZ1bGxzY3JlZW4sIHdlCisJICogZHJhdyBhIG5pY2UgYmxhY2sgYm94IGluIHRoZSBlbnRpcmUgdmlldyB0byBnZXQgYmxhY2sgYm9yZGVycy4KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgRnJhbWVSZXNpemVkKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKKwkJQlJlY3QgYm91bmRzOworCQlib3VuZHMudG9wID0gYm91bmRzLmxlZnQgPSAwOworCQlib3VuZHMucmlnaHQgPSB3aWR0aDsKKwkJYm91bmRzLmJvdHRvbSA9IGhlaWdodDsKKwkJLyogRmlsbCB0aGUgZW50aXJlIHZpZXcgd2l0aCBibGFjayAqLyAKKwkJRmlsbFJlY3QoYm91bmRzLCBCX1NPTElEX0hJR0gpOworCQkvKiBBbmQgaWYgdGhlcmUncyBhbiBpbWFnZSwgcmVkcmF3IGl0LiAqLworCQlpZiggaW1hZ2UgKSB7CisJCQlib3VuZHMgPSBpbWFnZS0+Qm91bmRzKCk7CisJCQlEcmF3KGJvdW5kcyk7CisJCX0KKwl9CisJCisJLyogRHJhd2luZyBwb3J0aW9uIG9mIHRoaXMgY29tcGxldGUgYnJlYWtmYXN0LiA6KSAqLworCXZpcnR1YWwgdm9pZCBTZXRCaXRtYXAoQkJpdG1hcCAqYml0bWFwKSB7CisJCWlmICggaW1hZ2UgKSB7CisJCQlkZWxldGUgaW1hZ2U7CisJCX0KKwkJaW1hZ2UgPSBiaXRtYXA7CisJfQorCXZpcnR1YWwgdm9pZCBEcmF3KEJSZWN0IHVwZGF0ZVJlY3QpIHsKKwkJaWYgKCBpbWFnZSApIHsKKwkJCWlmKHhvZmYgfHwgeW9mZikgewkKKwkJCQlCUmVjdCBkZXN0OworCQkJCWRlc3QudG9wICAgID0gdXBkYXRlUmVjdC50b3AgKyB5b2ZmOworCQkJCWRlc3QubGVmdCAgID0gdXBkYXRlUmVjdC5sZWZ0ICsgeG9mZjsKKwkJCQlkZXN0LmJvdHRvbSA9IHVwZGF0ZVJlY3QuYm90dG9tICsgeW9mZjsKKwkJCQlkZXN0LnJpZ2h0ICA9IHVwZGF0ZVJlY3QucmlnaHQgKyB4b2ZmOworCQkJCURyYXdCaXRtYXAoaW1hZ2UsIHVwZGF0ZVJlY3QsIGRlc3QpOworCQkJfSBlbHNlIHsKKwkJCQlEcmF3Qml0bWFwKGltYWdlLCB1cGRhdGVSZWN0LCB1cGRhdGVSZWN0KTsKKwkJCX0KKwkJfQorCX0KKwl2aXJ0dWFsIHZvaWQgRHJhd0FzeW5jKEJSZWN0IHVwZGF0ZVJlY3QpIHsKKwkJaWYoeG9mZiB8fCB5b2ZmKSB7CQorCQkJQlJlY3QgZGVzdDsKKwkJCWRlc3QudG9wICAgID0gdXBkYXRlUmVjdC50b3AgKyB5b2ZmOworCQkJZGVzdC5sZWZ0ICAgPSB1cGRhdGVSZWN0LmxlZnQgKyB4b2ZmOworCQkJZGVzdC5ib3R0b20gPSB1cGRhdGVSZWN0LmJvdHRvbSArIHlvZmY7CisJCQlkZXN0LnJpZ2h0ICA9IHVwZGF0ZVJlY3QucmlnaHQgKyB4b2ZmOzsKKwkJCURyYXdCaXRtYXBBc3luYyhpbWFnZSwgdXBkYXRlUmVjdCwgZGVzdCk7CisJCX0gZWxzZSB7CisJCQlEcmF3Qml0bWFwQXN5bmMoaW1hZ2UsIHVwZGF0ZVJlY3QsIHVwZGF0ZVJlY3QpOworCQl9CisJfQorCitwcml2YXRlOgorCUJCaXRtYXAgKmltYWdlOworCWludCB4b2ZmLCB5b2ZmOworfTsKKworI2VuZGlmIC8qIF9TRExfQlZpZXdfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9id2luZG93L1NETF9CV2luLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX0JXaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmIxOWEyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9id2luZG93L1NETF9CV2luLmgKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKyNpZm5kZWYgX1NETF9CV2luX2gKKyNkZWZpbmUgX1NETF9CV2luX2gKKworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8QXBwS2l0Lmg+CisjaW5jbHVkZSA8SW50ZXJmYWNlS2l0Lmg+CisjaW5jbHVkZSA8YmUvZ2FtZS9EaXJlY3RXaW5kb3cuaD4KKyNpZiBTRExfVklERU9fT1BFTkdMCisjaW5jbHVkZSAiU0RMX29wZW5nbC5oIgorI2luY2x1ZGUgPGJlL29wZW5nbC9HTFZpZXcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN1cHBvcnQvVVRGOC5oPgorCisjaW5jbHVkZSAiLi4vLi4vbWFpbi9iZW9zL1NETF9CZUFwcC5oIgorI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfQlZpZXcuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCitleHRlcm4gaW50IG1vdXNlX3JlbGF0aXZlOworfTsKKworY2xhc3MgU0RMX0JXaW4gOiBwdWJsaWMgQkRpcmVjdFdpbmRvdworeworcHVibGljOgorCVNETF9CV2luKEJSZWN0IGJvdW5kcykgOgorCQkJQkRpcmVjdFdpbmRvdyhib3VuZHMsICJVbnRpdGxlZCIsIEJfVElUTEVEX1dJTkRPVywgMCkgeworCQlsYXN0X2J1dHRvbnMgPSAwOworCQl0aGVfdmlldyA9IE5VTEw7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCQlTRExfR0xWaWV3ID0gTlVMTDsKKyNlbmRpZgorCQlTRExfVmlldyA9IE5VTEw7CisJCVVubG9jaygpOworCQlzaG93biA9IGZhbHNlOworCQlpbmhpYml0X3Jlc2l6ZSA9IGZhbHNlOworCX0KKworCXZpcnR1YWwgflNETF9CV2luKCkgeworCQlMb2NrKCk7CisJCWlmICggdGhlX3ZpZXcgKSB7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCQkJaWYgKCB0aGVfdmlldyA9PSBTRExfR0xWaWV3ICkgeworCQkJCVNETF9HTFZpZXctPlVubG9ja0dMKCk7CisJCQl9CisjZW5kaWYKKwkJCVJlbW92ZUNoaWxkKHRoZV92aWV3KTsKKwkJCXRoZV92aWV3ID0gTlVMTDsKKwkJfQorCQlVbmxvY2soKTsKKyNpZiBTRExfVklERU9fT1BFTkdMCisJCWlmICggU0RMX0dMVmlldyApIHsKKwkJCWRlbGV0ZSBTRExfR0xWaWV3OworCQl9CisjZW5kaWYKKwkJaWYgKCBTRExfVmlldyApIHsKKwkJCWRlbGV0ZSBTRExfVmlldzsKKwkJfQorCX0KKwkKKworCS8qIE92ZXJyaWRlIHRoZSBTaG93KCkgbWV0aG9kIHNvIHdlIGNhbiB0ZWxsIHdoZW4gd2UndmUgYmVlbiBzaG93biAqLworCXZpcnR1YWwgdm9pZCBTaG93KHZvaWQpIHsKKwkJQldpbmRvdzo6U2hvdygpOworCQlzaG93biA9IHRydWU7CisJfQorCXZpcnR1YWwgYm9vbCBTaG93bih2b2lkKSB7CisJCXJldHVybiAoc2hvd24pOworCX0KKwkvKiBJZiBjYWxsZWQsIHRoZSBuZXh0IHJlc2l6ZSBldmVudCB3aWxsIG5vdCBiZSBmb3J3YXJkZWQgdG8gU0RMLiAqLworCXZpcnR1YWwgdm9pZCBJbmhpYml0UmVzaXplKHZvaWQpIHsKKwkJaW5oaWJpdF9yZXNpemU9dHJ1ZTsKKwl9CisJLyogSGFuZGxlIHJlc2l6aW5nIG9mIHRoZSB3aW5kb3cgKi8KKwl2aXJ0dWFsIHZvaWQgRnJhbWVSZXNpemVkKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKKwkJaWYoaW5oaWJpdF9yZXNpemUpCisJCQlpbmhpYml0X3Jlc2l6ZSA9IGZhbHNlOworCQllbHNlIAorCQkJU0RMX1ByaXZhdGVSZXNpemUoKGludCl3aWR0aCwgKGludCloZWlnaHQpOworCX0KKwl2aXJ0dWFsIGludCBDcmVhdGVWaWV3KFVpbnQzMiBmbGFncywgVWludDMyIGdsX2ZsYWdzKSB7CisJCWludCByZXR2YWw7CisKKwkJcmV0dmFsID0gMDsKKwkJTG9jaygpOworCQlpZiAoIGZsYWdzICYgU0RMX09QRU5HTCApIHsKKyNpZiBTRExfVklERU9fT1BFTkdMCisJCQlpZiAoIFNETF9HTFZpZXcgPT0gTlVMTCApIHsKKwkJCQlTRExfR0xWaWV3ID0gbmV3IEJHTFZpZXcoQm91bmRzKCksICJTREwgR0xWaWV3IiwKKwkJCQkJIAlCX0ZPTExPV19BTExfU0lERVMsIChCX1dJTExfRFJBV3xCX0ZSQU1FX0VWRU5UUyksCisJCQkJCSAJZ2xfZmxhZ3N8QkdMX0RPVUJMRSk7CisJCQkJU0RMX0dMVmlldy0+RW5hYmxlRGlyZWN0TW9kZSh0cnVlKTsKKwkJCX0KKwkJCWlmICggdGhlX3ZpZXcgIT0gU0RMX0dMVmlldyApIHsKKwkJCQlpZiAoIHRoZV92aWV3ICkgeworCQkJCQlSZW1vdmVDaGlsZCh0aGVfdmlldyk7CisJCQkJfQorCQkJCUFkZENoaWxkKFNETF9HTFZpZXcpOworCQkJCVNETF9HTFZpZXctPkxvY2tHTCgpOworCQkJCXRoZV92aWV3ID0gU0RMX0dMVmlldzsKKwkJCX0KKyNlbHNlCisJCQlTRExfU2V0RXJyb3IoIk9wZW5HTCBzdXBwb3J0IG5vdCBlbmFibGVkIik7CisJCQlyZXR2YWwgPSAtMTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJaWYgKCBTRExfVmlldyA9PSBOVUxMICkgeworCQkJCVNETF9WaWV3ID0gbmV3IFNETF9CVmlldyhCb3VuZHMoKSk7CisJCQl9CisJCQlpZiAoIHRoZV92aWV3ICE9IFNETF9WaWV3ICkgeworCQkJCWlmICggdGhlX3ZpZXcgKSB7CisJCQkJCVJlbW92ZUNoaWxkKHRoZV92aWV3KTsKKwkJCQl9CisJCQkJQWRkQ2hpbGQoU0RMX1ZpZXcpOworCQkJCXRoZV92aWV3ID0gU0RMX1ZpZXc7CisJCQl9CisJCX0KKyNpZiBTRExfVklERU9fT1BFTkdMCisJCWlmICggdGhlX3ZpZXcgPT0gU0RMX0dMVmlldyApIHsKKwkJCVNETF9HTFZpZXctPlVubG9ja0dMKCk7CisJCX0KKyNlbmRpZgorCQlVbmxvY2soKTsKKwkJcmV0dXJuKHJldHZhbCk7CisJfQorCXZpcnR1YWwgdm9pZCBTZXRCaXRtYXAoQkJpdG1hcCAqYml0bWFwKSB7CisJCVNETF9WaWV3LT5TZXRCaXRtYXAoYml0bWFwKTsKKwl9CisJdmlydHVhbCB2b2lkIFNldFhZT2Zmc2V0KGludCB4LCBpbnQgeSkgeworI2lmIFNETF9WSURFT19PUEVOR0wKKwkJaWYgKCB0aGVfdmlldyA9PSBTRExfR0xWaWV3ICkgeworCQkJcmV0dXJuOworCQl9CisjZW5kaWYKKwkJU0RMX1ZpZXctPlNldFhZT2Zmc2V0KHgsIHkpOworCX0KKwl2aXJ0dWFsIHZvaWQgR2V0WFlPZmZzZXQoaW50ICZ4LCBpbnQgJnkpIHsKKyNpZiBTRExfVklERU9fT1BFTkdMCisJCWlmICggdGhlX3ZpZXcgPT0gU0RMX0dMVmlldyApIHsKKwkJCXggPSAwOworCQkJeSA9IDA7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZgorCQlTRExfVmlldy0+R2V0WFlPZmZzZXQoeCwgeSk7CisJfQorCXZpcnR1YWwgdm9pZCBHZXRYWU9mZnNldChmbG9hdCAmeCwgZmxvYXQgJnkpIHsKKyNpZiBTRExfVklERU9fT1BFTkdMCisJCWlmICggdGhlX3ZpZXcgPT0gU0RMX0dMVmlldyApIHsKKwkJCXggPSAwLjBmOworCQkJeSA9IDAuMGY7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZgorCQlTRExfVmlldy0+R2V0WFlPZmZzZXQoeCwgeSk7CisJfQorCXZpcnR1YWwgYm9vbCBCZWdpbkRyYXcodm9pZCkgeworCQlyZXR1cm4oTG9jaygpKTsKKwl9CisJdmlydHVhbCB2b2lkIERyYXdBc3luYyhCUmVjdCB1cGRhdGVSZWN0KSB7CisJCVNETF9WaWV3LT5EcmF3QXN5bmModXBkYXRlUmVjdCk7CisJfQorCXZpcnR1YWwgdm9pZCBFbmREcmF3KHZvaWQpIHsKKwkJU0RMX1ZpZXctPlN5bmMoKTsKKwkJVW5sb2NrKCk7CisJfQorI2lmIFNETF9WSURFT19PUEVOR0wKKwl2aXJ0dWFsIHZvaWQgU3dhcEJ1ZmZlcnModm9pZCkgeworCQlTRExfR0xWaWV3LT5VbmxvY2tHTCgpOworCQlTRExfR0xWaWV3LT5Td2FwQnVmZmVycygpOworCQlTRExfR0xWaWV3LT5Mb2NrR0woKTsKKwl9CisjZW5kaWYKKwl2aXJ0dWFsIEJWaWV3ICpWaWV3KHZvaWQpIHsKKwkJcmV0dXJuKHRoZV92aWV3KTsKKwl9CisKKwkvKiBIb29rIGZ1bmN0aW9ucyAtLSBvdmVycmlkZGVuICovCisJdmlydHVhbCB2b2lkIE1pbmltaXplKGJvb2wgbWluaW1pemUpIHsKKwkJLyogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIG1pbWltaXplZCwgbm90IHdoZW4gcmVzdG9yZWQgKi8KKwkJLy9TRExfUHJpdmF0ZUFwcEFjdGl2ZShtaW5pbWl6ZSwgU0RMX0FQUEFDVElWRSk7CisJCUJXaW5kb3c6Ok1pbmltaXplKG1pbmltaXplKTsKKwl9CisJdmlydHVhbCB2b2lkIFdpbmRvd0FjdGl2YXRlZChib29sIGFjdGl2ZSkgeworCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZShhY3RpdmUsIFNETF9BUFBJTlBVVEZPQ1VTKTsKKwl9CisJdmlydHVhbCBib29sIFF1aXRSZXF1ZXN0ZWQodm9pZCkgeworCQlpZiAoIFNETF9CZUFwcEFjdGl2ZSA+IDAgKSB7CisJCQlTRExfUHJpdmF0ZVF1aXQoKTsKKwkJCS8qIFdlIGRvbid0IGV2ZXIgYWN0dWFsbHkgY2xvc2UgdGhlIHdpbmRvdyBoZXJlIGJlY2F1c2UKKwkJCSAgIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmVzcG9uZCB0byB0aGUgcXVpdCByZXF1ZXN0LAorCQkJICAgb3IgaWdub3JlIGl0IGFzIGRlc2lyZWQuCisJCQkgKi8KKyNpZiBTRExfVklERU9fT1BFTkdMCisJCQlpZiAoIFNETF9HTFZpZXcgIT0gTlVMTCApIHsKKwkJCQlTRExfR0xWaWV3LT5FbmFibGVEaXJlY3RNb2RlKGZhbHNlKTsKKwkJCX0KKyNlbmRpZgorCQkJcmV0dXJuKGZhbHNlKTsKKwkJfQorCQlyZXR1cm4odHJ1ZSk7CS8qIENsb3NlIHRoZSBhcHAgd2luZG93ICovCisJfQorCXZpcnR1YWwgdm9pZCBRdWl0KCkgeworCQlpZiAoIUlzTG9ja2VkKCkpCisJCQlMb2NrKCk7CisJCUJEaXJlY3RXaW5kb3c6OlF1aXQoKTsKKwl9CisKKwl2aXJ0dWFsIGludDE2IFRyYW5zbGF0ZTJVbmljb2RlKGNvbnN0IGNoYXIgKmJ1ZikgeworCQlpbnQzMiBzdGF0ZSwgc3JjbGVuLCBkc3RsZW47CisJCXVuc2lnbmVkIGNoYXIgZGVzdGJ1ZlsyXTsKKwkJVWludDE2IHVuaWNvZGUgPSAwOworCisJCWlmICgodWNoYXIpYnVmWzBdID4gMTI3KSB7CisJCQlzdGF0ZSA9IDA7CisJCQlzcmNsZW4gPSBTRExfc3RybGVuKGJ1Zik7CisJCQlkc3RsZW4gPSBzaXplb2YoZGVzdGJ1Zik7CisJCQljb252ZXJ0X2Zyb21fdXRmOChCX1VOSUNPREVfQ09OVkVSU0lPTiwgYnVmLCAmc3JjbGVuLCAoY2hhciAqKWRlc3RidWYsICZkc3RsZW4sICZzdGF0ZSk7CisJCQl1bmljb2RlID0gZGVzdGJ1ZlswXTsKKwkJCXVuaWNvZGUgPDw9IDg7CisJCQl1bmljb2RlIHw9IGRlc3RidWZbMV07CisJCX0gZWxzZQorCQkJdW5pY29kZSA9IGJ1ZlswXTsKKworCQkvKiBGb3Igc29tZSByZWFzb24gZnVuY3Rpb24ga2V5cyBtYXAgdG8gY29udHJvbCBjaGFyYWN0ZXJzICovCisjIGRlZmluZSBDVFJMKFgpCSgoWCktJ0AnKQorCQlzd2l0Y2ggKHVuaWNvZGUpIHsKKwkJICAgIGNhc2UgQ1RSTCgnQScpOgorCQkgICAgY2FzZSBDVFJMKCdCJyk6CisJCSAgICBjYXNlIENUUkwoJ0MnKToKKwkJICAgIGNhc2UgQ1RSTCgnRCcpOgorCQkgICAgY2FzZSBDVFJMKCdFJyk6CisJCSAgICBjYXNlIENUUkwoJ0snKToKKwkJICAgIGNhc2UgQ1RSTCgnTCcpOgorCQkgICAgY2FzZSBDVFJMKCdQJyk6CisJCQlpZiAoICEgKFNETF9HZXRNb2RTdGF0ZSgpICYgS01PRF9DVFJMKSApCisJCQkJdW5pY29kZSA9IDA7CisJCQlicmVhazsKKwkJCS8qIEtleWJvYXJkIGlucHV0IG1hcHMgbmV3bGluZSB0byBjYXJyaWFnZSByZXR1cm4gKi8KKwkJCWNhc2UgJ1xuJzoKKwkJCQl1bmljb2RlID0gJ1xyJzsKKwkJCWJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIHVuaWNvZGU7CisJfQorCisJdmlydHVhbCB2b2lkIERpc3BhdGNoTWVzc2FnZShCTWVzc2FnZSAqbXNnLCBCSGFuZGxlciAqdGFyZ2V0KTsKKwkKKwl2aXJ0dWFsIHZvaWQgRGlyZWN0Q29ubmVjdGVkKGRpcmVjdF9idWZmZXJfaW5mbyAqaW5mbyk7CisKK3ByaXZhdGU6CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCUJHTFZpZXcgKlNETF9HTFZpZXc7CisjZW5kaWYKKwlTRExfQlZpZXcgKlNETF9WaWV3OworCUJWaWV3ICp0aGVfdmlldzsKKwlib29sIHNob3duOworCWJvb2wgaW5oaWJpdF9yZXNpemU7CisJaW50MzIgbGFzdF9idXR0b25zOworfTsKKworI2VuZGlmIC8qIF9TRExfQldpbl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX2xvd3ZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX2xvd3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxM2IyZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfbG93dmlkZW8uaApAQCAtMCwwICsxLDU4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2xvd3ZpZGVvX2gKKyNkZWZpbmUgX1NETF9sb3d2aWRlb19oCisKKyNpbmNsdWRlICJTRExfQldpbi5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICpfdGhpcworCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKKwkvKiBUaGUgbWFpbiB3aW5kb3cgKi8KKwlTRExfQldpbiAqU0RMX1dpbjsKKworCS8qIFRoZSBmdWxsc2NyZWVuIG1vZGUgbGlzdCAqLworCWRpc3BsYXlfbW9kZSBzYXZlZF9tb2RlOworI2RlZmluZSBOVU1fTU9ERUxJU1RTCTQJCS8qIDgsIDE2LCAyNCwgYW5kIDMyIGJpdHMtcGVyLXBpeGVsICovCisJaW50IFNETF9udW1tb2Rlc1tOVU1fTU9ERUxJU1RTXTsKKwlTRExfUmVjdCAqKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXTsKKworCS8qIEEgY29tcGxldGVseSBjbGVhciBjdXJzb3IgKi8KKwlXTWN1cnNvciAqQmxhbmtDdXJzb3I7CisKKwlTRExfT3ZlcmxheSAqb3ZlcmxheTsKK307CisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgU0RMX1dpbgkJKF90aGlzLT5oaWRkZW4tPlNETF9XaW4pCisjZGVmaW5lIHNhdmVkX21vZGUJKF90aGlzLT5oaWRkZW4tPnNhdmVkX21vZGUpCisjZGVmaW5lIFNETF9udW1tb2RlcwkoX3RoaXMtPmhpZGRlbi0+U0RMX251bW1vZGVzKQorI2RlZmluZSBTRExfbW9kZWxpc3QJKF90aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKKyNkZWZpbmUgU0RMX0JsYW5rQ3Vyc29yCShfdGhpcy0+aGlkZGVuLT5CbGFua0N1cnNvcikKKyNkZWZpbmUgY3VycmVudF9vdmVybGF5IChfdGhpcy0+aGlkZGVuLT5vdmVybGF5KQorCisjZW5kaWYgLyogX1NETF9sb3d2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c2V2ZW50cy5jYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzZXZlbnRzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTI3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c2V2ZW50cy5jYwpAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdXBwb3J0L1VURjguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfQldpbi5oIgorI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgorCitzdGF0aWMgU0RMS2V5IGtleW1hcFsxMjhdOworaW50IG1vdXNlX3JlbGF0aXZlID0gMDsKK2V4dGVybiAiQyIgeworCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3N5c2V2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vU0RMX2N1cnNvcl9jLmgiCisKK3ZvaWQgQkVfUHVtcEV2ZW50cyhfVEhJUykKK3sKK30KKwordm9pZCBCRV9Jbml0T1NLZXltYXAoX1RISVMpCit7CisJCWZvciAoIHVpbnQgaT0wOyBpPFNETF9UQUJMRVNJWkUoa2V5bWFwKTsgKytpICkKKwkJCWtleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKKworCQlrZXltYXBbMHgwMV0JCT0gU0RMS19FU0NBUEU7CisJCWtleW1hcFtCX0YxX0tFWV0JPSBTRExLX0YxOworCQlrZXltYXBbQl9GMl9LRVldCT0gU0RMS19GMjsKKwkJa2V5bWFwW0JfRjNfS0VZXQk9IFNETEtfRjM7CisJCWtleW1hcFtCX0Y0X0tFWV0JPSBTRExLX0Y0OworCQlrZXltYXBbQl9GNV9LRVldCT0gU0RMS19GNTsKKwkJa2V5bWFwW0JfRjZfS0VZXQk9IFNETEtfRjY7CisJCWtleW1hcFtCX0Y3X0tFWV0JPSBTRExLX0Y3OworCQlrZXltYXBbQl9GOF9LRVldCT0gU0RMS19GODsKKwkJa2V5bWFwW0JfRjlfS0VZXQk9IFNETEtfRjk7CisJCWtleW1hcFtCX0YxMF9LRVldCT0gU0RMS19GMTA7CisJCWtleW1hcFtCX0YxMV9LRVldCT0gU0RMS19GMTE7CisJCWtleW1hcFtCX0YxMl9LRVldCT0gU0RMS19GMTI7CisJCWtleW1hcFtCX1BSSU5UX0tFWV0JPSBTRExLX1BSSU5UOworCQlrZXltYXBbQl9TQ1JPTExfS0VZXQk9IFNETEtfU0NST0xMT0NLOworCQlrZXltYXBbQl9QQVVTRV9LRVldCT0gU0RMS19QQVVTRTsKKwkJa2V5bWFwWzB4MTFdCQk9IFNETEtfQkFDS1FVT1RFOworCQlrZXltYXBbMHgxMl0JCT0gU0RMS18xOworCQlrZXltYXBbMHgxM10JCT0gU0RMS18yOworCQlrZXltYXBbMHgxNF0JCT0gU0RMS18zOworCQlrZXltYXBbMHgxNV0JCT0gU0RMS180OworCQlrZXltYXBbMHgxNl0JCT0gU0RMS181OworCQlrZXltYXBbMHgxN10JCT0gU0RMS182OworCQlrZXltYXBbMHgxOF0JCT0gU0RMS183OworCQlrZXltYXBbMHgxOV0JCT0gU0RMS184OworCQlrZXltYXBbMHgxYV0JCT0gU0RMS185OworCQlrZXltYXBbMHgxYl0JCT0gU0RMS18wOworCQlrZXltYXBbMHgxY10JCT0gU0RMS19NSU5VUzsKKwkJa2V5bWFwWzB4MWRdCQk9IFNETEtfRVFVQUxTOworCQlrZXltYXBbMHgxZV0JCT0gU0RMS19CQUNLU1BBQ0U7CisJCWtleW1hcFsweDFmXQkJPSBTRExLX0lOU0VSVDsKKwkJa2V5bWFwWzB4MjBdCQk9IFNETEtfSE9NRTsKKwkJa2V5bWFwWzB4MjFdCQk9IFNETEtfUEFHRVVQOworCQlrZXltYXBbMHgyMl0JCT0gU0RMS19OVU1MT0NLOworCQlrZXltYXBbMHgyM10JCT0gU0RMS19LUF9ESVZJREU7CisJCWtleW1hcFsweDI0XQkJPSBTRExLX0tQX01VTFRJUExZOworCQlrZXltYXBbMHgyNV0JCT0gU0RMS19LUF9NSU5VUzsKKwkJa2V5bWFwWzB4MjZdCQk9IFNETEtfVEFCOworCQlrZXltYXBbMHgyN10JCT0gU0RMS19xOworCQlrZXltYXBbMHgyOF0JCT0gU0RMS193OworCQlrZXltYXBbMHgyOV0JCT0gU0RMS19lOworCQlrZXltYXBbMHgyYV0JCT0gU0RMS19yOworCQlrZXltYXBbMHgyYl0JCT0gU0RMS190OworCQlrZXltYXBbMHgyY10JCT0gU0RMS195OworCQlrZXltYXBbMHgyZF0JCT0gU0RMS191OworCQlrZXltYXBbMHgyZV0JCT0gU0RMS19pOworCQlrZXltYXBbMHgyZl0JCT0gU0RMS19vOworCQlrZXltYXBbMHgzMF0JCT0gU0RMS19wOworCQlrZXltYXBbMHgzMV0JCT0gU0RMS19MRUZUQlJBQ0tFVDsKKwkJa2V5bWFwWzB4MzJdCQk9IFNETEtfUklHSFRCUkFDS0VUOworCQlrZXltYXBbMHgzM10JCT0gU0RMS19CQUNLU0xBU0g7CisJCWtleW1hcFsweDM0XQkJPSBTRExLX0RFTEVURTsKKwkJa2V5bWFwWzB4MzVdCQk9IFNETEtfRU5EOworCQlrZXltYXBbMHgzNl0JCT0gU0RMS19QQUdFRE9XTjsKKwkJa2V5bWFwWzB4MzddCQk9IFNETEtfS1A3OworCQlrZXltYXBbMHgzOF0JCT0gU0RMS19LUDg7CisJCWtleW1hcFsweDM5XQkJPSBTRExLX0tQOTsKKwkJa2V5bWFwWzB4M2FdCQk9IFNETEtfS1BfUExVUzsKKwkJa2V5bWFwWzB4M2JdCQk9IFNETEtfQ0FQU0xPQ0s7CisJCWtleW1hcFsweDNjXQkJPSBTRExLX2E7CisJCWtleW1hcFsweDNkXQkJPSBTRExLX3M7CisJCWtleW1hcFsweDNlXQkJPSBTRExLX2Q7CisJCWtleW1hcFsweDNmXQkJPSBTRExLX2Y7CisJCWtleW1hcFsweDQwXQkJPSBTRExLX2c7CisJCWtleW1hcFsweDQxXQkJPSBTRExLX2g7CisJCWtleW1hcFsweDQyXQkJPSBTRExLX2o7CisJCWtleW1hcFsweDQzXQkJPSBTRExLX2s7CisJCWtleW1hcFsweDQ0XQkJPSBTRExLX2w7CisJCWtleW1hcFsweDQ1XQkJPSBTRExLX1NFTUlDT0xPTjsKKwkJa2V5bWFwWzB4NDZdCQk9IFNETEtfUVVPVEU7CisJCWtleW1hcFsweDQ3XQkJPSBTRExLX1JFVFVSTjsKKwkJa2V5bWFwWzB4NDhdCQk9IFNETEtfS1A0OworCQlrZXltYXBbMHg0OV0JCT0gU0RMS19LUDU7CisJCWtleW1hcFsweDRhXQkJPSBTRExLX0tQNjsKKwkJa2V5bWFwWzB4NGJdCQk9IFNETEtfTFNISUZUOworCQlrZXltYXBbMHg0Y10JCT0gU0RMS196OworCQlrZXltYXBbMHg0ZF0JCT0gU0RMS194OworCQlrZXltYXBbMHg0ZV0JCT0gU0RMS19jOworCQlrZXltYXBbMHg0Zl0JCT0gU0RMS192OworCQlrZXltYXBbMHg1MF0JCT0gU0RMS19iOworCQlrZXltYXBbMHg1MV0JCT0gU0RMS19uOworCQlrZXltYXBbMHg1Ml0JCT0gU0RMS19tOworCQlrZXltYXBbMHg1M10JCT0gU0RMS19DT01NQTsKKwkJa2V5bWFwWzB4NTRdCQk9IFNETEtfUEVSSU9EOworCQlrZXltYXBbMHg1NV0JCT0gU0RMS19TTEFTSDsKKwkJa2V5bWFwWzB4NTZdCQk9IFNETEtfUlNISUZUOworCQlrZXltYXBbMHg1N10JCT0gU0RMS19VUDsKKwkJa2V5bWFwWzB4NThdCQk9IFNETEtfS1AxOworCQlrZXltYXBbMHg1OV0JCT0gU0RMS19LUDI7CisJCWtleW1hcFsweDVhXQkJPSBTRExLX0tQMzsKKwkJa2V5bWFwWzB4NWJdCQk9IFNETEtfS1BfRU5URVI7CisJCWtleW1hcFsweDVjXQkJPSBTRExLX0xDVFJMOworCQlrZXltYXBbMHg1ZF0JCT0gU0RMS19MQUxUOworCQlrZXltYXBbMHg1ZV0JCT0gU0RMS19TUEFDRTsKKwkJa2V5bWFwWzB4NWZdCQk9IFNETEtfUkFMVDsKKwkJa2V5bWFwWzB4NjBdCQk9IFNETEtfUkNUUkw7CisJCWtleW1hcFsweDYxXQkJPSBTRExLX0xFRlQ7CisJCWtleW1hcFsweDYyXQkJPSBTRExLX0RPV047CisJCWtleW1hcFsweDYzXQkJPSBTRExLX1JJR0hUOworCQlrZXltYXBbMHg2NF0JCT0gU0RMS19LUDA7CisJCWtleW1hcFsweDY1XQkJPSBTRExLX0tQX1BFUklPRDsKKwkJa2V5bWFwWzB4NjZdCQk9IFNETEtfTE1FVEE7CisJCWtleW1hcFsweDY3XQkJPSBTRExLX1JNRVRBOworCQlrZXltYXBbMHg2OF0JCT0gU0RMS19NRU5VOworCQlrZXltYXBbMHg2OV0JCT0gU0RMS19FVVJPOworCQlrZXltYXBbMHg2YV0JCT0gU0RMS19LUF9FUVVBTFM7CisJCWtleW1hcFsweDZiXQkJPSBTRExLX1BPV0VSOworfQorCit9OyAvKiBFeHRlcm4gQyAqLworCit2b2lkIFNETF9CV2luOjpEaXNwYXRjaE1lc3NhZ2UoQk1lc3NhZ2UgKm1zZywgQkhhbmRsZXIgKnRhcmdldCkKK3sKKwlzd2l0Y2ggKG1zZy0+d2hhdCkgeworCQljYXNlIEJfTU9VU0VfTU9WRUQ6CisJCXsKKwkJCVNETF9WaWRlb0RldmljZSAqdmlldyA9IGN1cnJlbnRfdmlkZW87CisJCQlCUG9pbnQgd2hlcmU7CisJCQlpbnQzMiB0cmFuc2l0OworCQkJaWYgKG1zZy0+RmluZFBvaW50KCJ3aGVyZSIsICZ3aGVyZSkgPT0gQl9PSyAmJiBtc2ctPkZpbmRJbnQzMigiYmU6dHJhbnNpdCIsICZ0cmFuc2l0KSA9PSBCX09LKSB7CisJCQkJaW50IHgsIHk7CisKKwkJCQlHZXRYWU9mZnNldCh4LCB5KTsKKwkJCQl4ID0gKGludCl3aGVyZS54IC0geDsKKwkJCQl5ID0gKGludCl3aGVyZS55IC0geTsKKworCQkJCS8vQmVTbWFuOiBJIG5lZWQgYW5vdGhlciBtZXRob2QgZm9yIGN1cnNvciBjYXRjaGluZyAhISEKKwkJCQlpZiAodmlldy0+aW5wdXRfZ3JhYiAhPSBTRExfR1JBQl9PRkYpCisJCQkJeworCQkJCQlib29sIGNsaXBwZWQgPSBmYWxzZTsKKwkJCQkJaWYgKCB4IDwgMCApIHsKKwkJCQkJCXggPSAwOworCQkJCQkJY2xpcHBlZCA9IHRydWU7CisJCQkJCX0gZWxzZSBpZiAoIHggPj0gU0RMX1ZpZGVvU3VyZmFjZS0+dyApIHsKKwkJCQkJCXggPSAoU0RMX1ZpZGVvU3VyZmFjZS0+dy0xKTsKKwkJCQkJCWNsaXBwZWQgPSB0cnVlOworCQkJCQl9CisJCQkJCWlmICggeSA8IDAgKSB7CisJCQkJCQl5ID0gMDsKKwkJCQkJCWNsaXBwZWQgPSB0cnVlOworCQkJCQl9IGVsc2UgaWYgKCB5ID49IFNETF9WaWRlb1N1cmZhY2UtPmggKSB7CisJCQkJCQl5ID0gKFNETF9WaWRlb1N1cmZhY2UtPmgtMSk7CisJCQkJCQljbGlwcGVkID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlpZiAoIGNsaXBwZWQgKSB7CisJCQkJCQlCUG9pbnQgZWRnZTsKKwkJCQkJCUdldFhZT2Zmc2V0KGVkZ2UueCwgZWRnZS55KTsKKwkJCQkJCWVkZ2UueCArPSB4OworCQkJCQkJZWRnZS55ICs9IHk7CisJCQkJCQlDb252ZXJ0VG9TY3JlZW4oJmVkZ2UpOworCQkJCQkJc2V0X21vdXNlX3Bvc2l0aW9uKChpbnQpZWRnZS54LCAoaW50KWVkZ2UueSk7CisJCQkJCX0KKwkJCQkJdHJhbnNpdCA9IEJfSU5TSURFX1ZJRVc7CisJCQkJfQorCQkJCWlmICh0cmFuc2l0ID09IEJfRVhJVEVEX1ZJRVcpIHsKKwkJCQkJaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBNT1VTRUZPQ1VTICkgeworCQkJCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOworI2lmIFNETF9WSURFT19PUEVOR0wKKwkJCQkJLy8gZm9yIHNvbWUgcmVhc29uLCBTRExfRXJhc2VDdXJzb3IgZmFpbHMgZm9yIE9wZW5HTAorCQkJCQlpZiAodGhpcy0+dGhlX3ZpZXcgIT0gdGhpcy0+U0RMX0dMVmlldykKKyNlbmRpZgorCQkJCQkJCVNETF9FcmFzZUN1cnNvcihTRExfVmlkZW9TdXJmYWNlKTsKKwkJCQkJCWJlX2FwcC0+U2V0Q3Vyc29yKEJfSEFORF9DVVJTT1IpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCAhKFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUE1PVVNFRk9DVVMpICkgeworCQkJCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOworI2lmIFNETF9WSURFT19PUEVOR0wKKwkJCQkJLy8gZm9yIHNvbWUgcmVhc29uLCBTRExfRXJhc2VDdXJzb3IgZmFpbHMgZm9yIE9wZW5HTAorCQkJCQlpZiAodGhpcy0+dGhlX3ZpZXcgIT0gdGhpcy0+U0RMX0dMVmlldykKKyNlbmRpZgorCQkJCQkJCVNETF9FcmFzZUN1cnNvcihTRExfVmlkZW9TdXJmYWNlKTsKKwkJCQkJCVNETF9TZXRDdXJzb3IoTlVMTCk7CisJCQkJCX0KKworCQkJCQlpZiAoIG1vdXNlX3JlbGF0aXZlICkgeworCQkJCQkJaW50IGhhbGZfdyA9IChTRExfVmlkZW9TdXJmYWNlLT53LzIpOworCQkJCQkJaW50IGhhbGZfaCA9IChTRExfVmlkZW9TdXJmYWNlLT5oLzIpOworCQkJCQkJeCAtPSBoYWxmX3c7CisJCQkJCQl5IC09IGhhbGZfaDsKKwkJCQkJCWlmICggeCB8fCB5ICkgeworCQkJCQkJCUJQb2ludCBjZW50ZXI7CisJCQkJCQkJR2V0WFlPZmZzZXQoY2VudGVyLngsIGNlbnRlci55KTsKKwkJCQkJCQljZW50ZXIueCArPSBoYWxmX3c7CisJCQkJCQkJY2VudGVyLnkgKz0gaGFsZl9oOworCQkJCQkJCUNvbnZlcnRUb1NjcmVlbigmY2VudGVyKTsKKwkJCQkJCQlzZXRfbW91c2VfcG9zaXRpb24oKGludCljZW50ZXIueCwgKGludCljZW50ZXIueSk7CisJCQkJCQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLCB4LCB5KTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgeCwgeSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQl9NT1VTRV9ET1dOOgorCQl7CisJCQkvKglpdCBsb29rcyBsaWtlIG1vdXNlIGRvd24gaXMgc2VuZCBvbmx5IGZvciBmaXJzdCBjbGlja2VkCisJCQkJYnV0dG9uLCBlYWNoIG5leHQgaXMgbm90IHNlbmQgd2hpbGUgbGFzdCBvbmUgaXMgaG9sZGVkICovCisJCQlpbnQzMiBidXR0b25zOworCQkJaW50IHNkbF9idXR0b25zID0gMDsKKwkJCWlmIChtc2ctPkZpbmRJbnQzMigiYnV0dG9ucyIsICZidXR0b25zKSA9PSBCX09LKSB7CisJCQkJLyogQWRkIGFueSBtb3VzZSBidXR0b24gZXZlbnRzICovCisJCQkJaWYgKGJ1dHRvbnMgJiBCX1BSSU1BUllfTU9VU0VfQlVUVE9OKSB7CisJCQkJCXNkbF9idXR0b25zIHw9IFNETF9CVVRUT05fTEVGVDsKKwkJCQl9CisJCQkJaWYgKGJ1dHRvbnMgJiBCX1NFQ09OREFSWV9NT1VTRV9CVVRUT04pIHsKKwkJCQkJc2RsX2J1dHRvbnMgfD0gU0RMX0JVVFRPTl9SSUdIVDsKKwkJCQl9CisJCQkJaWYgKGJ1dHRvbnMgJiBCX1RFUlRJQVJZX01PVVNFX0JVVFRPTikgeworCQkJCQlzZGxfYnV0dG9ucyB8PSBTRExfQlVUVE9OX01JRERMRTsKKwkJCQl9CisJCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgc2RsX2J1dHRvbnMsIDAsIDApOworCisJCQkJbGFzdF9idXR0b25zID0gYnV0dG9uczsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBCX01PVVNFX1VQOgorCQl7CisJCQkvKgltb3VzZSB1cCBkb2Vzbid0IGdpdmUgd2hpY2ggYnV0dG9uIHdhcyByZWxlYXNlZCwKKwkJCQlvbmx5IHN0YXRlIG9mIGJ1dHRvbnMgKGFmdGVyIHJlbGVhc2UsIHNvIGl0J3MgYWx3YXlzID0gMCksCisJCQkJd2hpY2ggaXMgbm90IHdoYXQgd2UgbmVlZCA7XQorCQkJCVNvIHdlIG5lZWQgdG8gc3RvcmUgYnV0dG9uIGluIG1vdXNlIGRvd24sIGFuZCByZXN0b3JlCisJCQkJaW4gbW91c2UgdXAgOigKKwkJCQltb3VzZSB1cCBpcyAoc2ltaWxhcmx5IHRvIG1vdXNlIGRvd24pIHNlbmQgb25seSBmb3IKKwkJCQlmaXJzdCBidXR0b24gZG93biAoaWUuIGl0J3Mgbm8gc2VuZCBpZiB3ZSBjbGljayBhbm90aGVyIGJ1dHRvbgorCQkJCXdpdGhvdXQgcmVsZWFzaW5nIHByZXZpb3VzIG9uZSBmaXJzdCkgLSBidXQgdGhhdCdzIHByb2JhYmx5CisJCQkJYmVjYXVzZSBvZiBob3cgZHJpdmVycyBhcmUgd3JpdHRlbj8sIG5vdCBCZU9TIGl0c2VsZi4gKi8KKwkJCWludDMyIGJ1dHRvbnM7CisJCQlpbnQgc2RsX2J1dHRvbnMgPSAwOworCQkJaWYgKG1zZy0+RmluZEludDMyKCJidXR0b25zIiwgJmJ1dHRvbnMpID09IEJfT0spIHsKKwkJCQkvKiBBZGQgYW55IG1vdXNlIGJ1dHRvbiBldmVudHMgKi8KKwkJCQlpZiAoKGJ1dHRvbnMgXiBCX1BSSU1BUllfTU9VU0VfQlVUVE9OKSAmIGxhc3RfYnV0dG9ucykgeworCQkJCQlzZGxfYnV0dG9ucyB8PSBTRExfQlVUVE9OX0xFRlQ7CisJCQkJfQorCQkJCWlmICgoYnV0dG9ucyBeIEJfU0VDT05EQVJZX01PVVNFX0JVVFRPTikgJiBsYXN0X2J1dHRvbnMpIHsKKwkJCQkJc2RsX2J1dHRvbnMgfD0gU0RMX0JVVFRPTl9SSUdIVDsKKwkJCQl9CisJCQkJaWYgKChidXR0b25zIF4gQl9URVJUSUFSWV9NT1VTRV9CVVRUT04pICYgbGFzdF9idXR0b25zKSB7CisJCQkJCXNkbF9idXR0b25zIHw9IFNETF9CVVRUT05fTUlERExFOworCQkJCX0KKwkJCQlTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgc2RsX2J1dHRvbnMsIDAsIDApOworCisJCQkJbGFzdF9idXR0b25zID0gYnV0dG9uczsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBCX01PVVNFX1dIRUVMX0NIQU5HRUQ6CisJCXsKKwkJCWZsb2F0IHgsIHk7CisJCQl4ID0geSA9IDA7CisJCQlpZiAobXNnLT5GaW5kRmxvYXQoImJlOndoZWVsX2RlbHRhX3giLCAmeCkgPT0gQl9PSyAmJiBtc2ctPkZpbmRGbG9hdCgiYmU6d2hlZWxfZGVsdGFfeSIsICZ5KSA9PSBCX09LKSB7CisJCQkJaWYgKHggPCAwIHx8IHkgPCAwKSB7CisJCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIFNETF9CVVRUT05fV0hFRUxET1dOLCAwLCAwKTsKKwkJCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIFNETF9CVVRUT05fV0hFRUxET1dOLCAwLCAwKTsKKwkJCQl9IGVsc2UgaWYgKHggPiAwIHx8IHkgPiAwKSB7CisJCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIFNETF9CVVRUT05fV0hFRUxVUCwgMCwgMCk7CisJCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBTRExfQlVUVE9OX1dIRUVMVVAsIDAsIDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBCX0tFWV9ET1dOOgorCQljYXNlIEJfVU5NQVBQRURfS0VZX0RPV046IC8qIG1vZGlmaWVyIGtleXMgYXJlIHVubWFwcGVkICovCisJCXsKKwkJCWludDMyIGtleTsKKwkJCWludDMyIG1vZGlmaWVyczsKKwkJCWludDMyIGtleV9yZXBlYXQ7CisJCQkvKiBXb3JrYXJvdW5kIGZvciBTREwgbWVzc2FnZSBxdWV1ZSBiZWluZyBmaWxsZWQgdG9vIGZhc3QgYmVjYXVzZSBvZiBCZU9TIG93biBrZXktcmVwZWF0IG1lY2hhbmlzbSAqLworCQkJaWYgKG1zZy0+RmluZEludDMyKCJiZTprZXlfcmVwZWF0IiwgJmtleV9yZXBlYXQpID09IEJfT0sgJiYga2V5X3JlcGVhdCA+IDApCisJCQkJYnJlYWs7CisKKwkJCWlmIChtc2ctPkZpbmRJbnQzMigia2V5IiwgJmtleSkgPT0gQl9PSyAmJiBtc2ctPkZpbmRJbnQzMigibW9kaWZpZXJzIiwgJm1vZGlmaWVycykgPT0gQl9PSykgeworCQkJCVNETF9rZXlzeW0ga2V5c3ltOworCQkJCWtleXN5bS5zY2FuY29kZSA9IGtleTsKKwkJCQlpZiAoa2V5IDwgMTI4KSB7CisJCQkJCWtleXN5bS5zeW0gPSBrZXltYXBba2V5XTsKKwkJCQl9IGVsc2UgeworCQkJCQlrZXlzeW0uc3ltID0gU0RMS19VTktOT1dOOworCQkJCX0KKwkJCQkvKglGSVggVEhJUz8KKwkJCQkJaXQgc2VlbXMgU0RMX1ByaXZhdGVLZXlib2FyZCgpIGNoYW5nZXMgbW9kIHZhbHVlCisJCQkJCWFueXdheSwgYW5kIGRvZXNuJ3QgY2FyZSBhYm91dCB3aGF0IHdlIHNldHVwIGhlcmUgKi8KKwkJCQlrZXlzeW0ubW9kID0gS01PRF9OT05FOworCQkJCWtleXN5bS51bmljb2RlID0gMDsKKwkJCQlpZiAoU0RMX1RyYW5zbGF0ZVVOSUNPREUpIHsKKwkJCQkJY29uc3QgY2hhciAqYnl0ZXM7CisJCQkJCWlmIChtc2ctPkZpbmRTdHJpbmcoImJ5dGVzIiwgJmJ5dGVzKSA9PSBCX09LKSB7CisJCQkJCQkvKglGSVggVEhJUz8KKwkJCQkJCQl0aGlzIGNhcmVzIG9ubHkgYWJvdXQgZmlyc3QgImxldHRlciIsCisJCQkJCQkJc28gaWYgc29tZW9uZSBtYXBzIHNvbWUga2V5IHRvIHByaW50CisJCQkJCQkJIkJlT1MgcnVsZXohIiBvbmx5ICJCIiB3aWxsIGJlIHVzZWQuICovCisJCQkJCQlrZXlzeW0udW5pY29kZSA9IFRyYW5zbGF0ZTJVbmljb2RlKGJ5dGVzKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELCAma2V5c3ltKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBCX0tFWV9VUDoKKwkJY2FzZSBCX1VOTUFQUEVEX0tFWV9VUDogLyogbW9kaWZpZXIga2V5cyBhcmUgdW5tYXBwZWQgKi8KKwkJeworCQkJaW50MzIga2V5OworCQkJaW50MzIgbW9kaWZpZXJzOworCQkJaWYgKG1zZy0+RmluZEludDMyKCJrZXkiLCAma2V5KSA9PSBCX09LICYmIG1zZy0+RmluZEludDMyKCJtb2RpZmllcnMiLCAmbW9kaWZpZXJzKSA9PSBCX09LKSB7CisJCQkJU0RMX2tleXN5bSBrZXlzeW07CisJCQkJa2V5c3ltLnNjYW5jb2RlID0ga2V5OworCQkJCWlmIChrZXkgPCAxMjgpIHsKKwkJCQkJa2V5c3ltLnN5bSA9IGtleW1hcFtrZXldOworCQkJCX0gZWxzZSB7CisJCQkJCWtleXN5bS5zeW0gPSBTRExLX1VOS05PV047CisJCQkJfQorCQkJCWtleXN5bS5tb2QgPSBLTU9EX05PTkU7IC8qIEZJWCBUSElTPyAqLworCQkJCWtleXN5bS51bmljb2RlID0gMDsKKwkJCQlpZiAoU0RMX1RyYW5zbGF0ZVVOSUNPREUpIHsKKwkJCQkJY29uc3QgY2hhciAqYnl0ZXM7CisJCQkJCWlmIChtc2ctPkZpbmRTdHJpbmcoImJ5dGVzIiwgJmJ5dGVzKSA9PSBCX09LKSB7CisJCQkJCQlrZXlzeW0udW5pY29kZSA9IFRyYW5zbGF0ZTJVbmljb2RlKGJ5dGVzKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgJmtleXN5bSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCQkvKiBtb3ZlIGl0IGFmdGVyIHN3aXRjaHt9IHNvIGl0J3MgYWx3YXlzIGhhbmRsZWQKKwkJCQl0aGF0IHdheSB3ZSBrZWVwIEJlT1MgZmVhdXR1cmVzIGxpa2U6CisJCQkJLSBDVFJMK1EgdG8gY2xvc2Ugd2luZG93IChhbmQgb3RoZXIgc2hvcnRjdXRzKQorCQkJCS0gUHJpbnRTY3JlZW4gdG8gbWFrZSBzY3JlZW5zaG90IGludG8gL2Jvb3QvaG9tZQorCQkJCS0gZXRjLi4gKi8KKwkJCS8vQkRpcmVjdFdpbmRvdzo6RGlzcGF0Y2hNZXNzYWdlKG1zZywgdGFyZ2V0KTsKKwkJCWJyZWFrOworCX0KKwlCRGlyZWN0V2luZG93OjpEaXNwYXRjaE1lc3NhZ2UobXNnLCB0YXJnZXQpOworfQorCit2b2lkIFNETF9CV2luOjpEaXJlY3RDb25uZWN0ZWQoZGlyZWN0X2J1ZmZlcl9pbmZvICppbmZvKSB7CisJc3dpdGNoIChpbmZvLT5idWZmZXJfc3RhdGUgJiBCX0RJUkVDVF9NT0RFX01BU0spIHsKKwkJY2FzZSBCX0RJUkVDVF9TVEFSVDoKKwkJY2FzZSBCX0RJUkVDVF9NT0RJRlk6CisJCQl7CisJCQkJaW50MzIgd2lkdGggPSBpbmZvLT53aW5kb3dfYm91bmRzLnJpZ2h0IC0KKwkJCQkJaW5mby0+d2luZG93X2JvdW5kcy5sZWZ0OworCQkJCWludDMyIGhlaWdodCA9IGluZm8tPndpbmRvd19ib3VuZHMuYm90dG9tIC0KKwkJCQkJaW5mby0+d2luZG93X2JvdW5kcy50b3A7CisJCQkJU0RMX1ByaXZhdGVSZXNpemUod2lkdGgsIGhlaWdodCk7CisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCS8vIElmIGl0IGlzIGEgQkdMVmlldywgaXQgaXMgYXBwYXJlbnRseSByZXF1aXJlZCB0bworCS8vIGNhbGwgRGlyZWN0Q29ubmVjdGVkKCkgb24gaXQgYXMgd2VsbAorCWlmICh0aGlzLT50aGVfdmlldyA9PSB0aGlzLT5TRExfR0xWaWV3KQorCQl0aGlzLT5TRExfR0xWaWV3LT5EaXJlY3RDb25uZWN0ZWQoaW5mbyk7CisjZW5kaWYJCit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c2V2ZW50c19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjNTUzNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzZXZlbnRzX2MuaApAQCAtMCwwICsxLDMxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgorCisvKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfc3lzZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCisgICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX3N5c3ZpZGVvLmMpCisqLworCitleHRlcm4gdm9pZCBCRV9Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgQkVfUHVtcEV2ZW50cyhfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c21vdXNlLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9id2luZG93L1NETF9zeXNtb3VzZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTU1N2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9id2luZG93L1NETF9zeXNtb3VzZS5jYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxBcHBLaXQuaD4KKyNpbmNsdWRlIDxHYW1lS2l0Lmg+CisKKyNpbmNsdWRlICJTRExfQldpbi5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKKyNpbmNsdWRlICJTRExfc3lzbW91c2VfYy5oIgorCisvKiBDb252ZXJ0IGJpdHMgdG8gcGFkZGVkIGJ5dGVzICovCisjZGVmaW5lIFBBRERFRF9CSVRTKGJpdHMpICAoKGJpdHMrNykvOCkKKworLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCitzdHJ1Y3QgV01jdXJzb3IgeworCWNoYXIgKmJpdHM7Cit9OworCisvKiBDYW4gdGhpcyBiZSBkb25lIGluIHRoZSBCZU9TPyAqLworV01jdXJzb3IgKkJFX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAorCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpCit7CisJV01jdXJzb3IgKmN1cnNvcjsKKwlpbnQgYWxsb3dlZF94OworCWludCBhbGxvd2VkX3k7CisJaW50IHJ1biwgcGFkLCBpOworCWNoYXIgKmNwdHI7CisKKwlhbGxvd2VkX3ggPSAxNjsJLyogQmVPUyBsaW1pdGF0aW9uICovCisJYWxsb3dlZF95ID0gMTY7CS8qIEJlT1MgbGltaXRhdGlvbiAqLworCWlmICggKHcgPiBhbGxvd2VkX3gpIHx8IChoID4gYWxsb3dlZF95KSApIHsKKwkJU0RMX1NldEVycm9yKCJPbmx5IGN1cnNvcnMgb2YgZGltZW5zaW9uICglZHglZCkgYXJlIGFsbG93ZWQiLAorCQkJCQkJCWFsbG93ZWRfeCwgYWxsb3dlZF95KTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBjdXJzb3IgKi8KKwljdXJzb3IgPSAoV01jdXJzb3IgKilTRExfbWFsbG9jKHNpemVvZihXTWN1cnNvcikpOworCWlmICggY3Vyc29yID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWN1cnNvci0+Yml0cyA9IChjaGFyICopU0RMX21hbGxvYyg0KzIqKChhbGxvd2VkX3gvOCkqYWxsb3dlZF95KSk7CisJaWYgKCBjdXJzb3ItPmJpdHMgPT0gTlVMTCApIHsKKwkJU0RMX2ZyZWUoY3Vyc29yKTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJY3Vyc29yLT5iaXRzWzBdID0gYWxsb3dlZF95OwkJLyogU2l6ZSBvZiB0aGUgY3Vyc29yICovCisJY3Vyc29yLT5iaXRzWzFdID0gMTsJCQkvKiBCaXQgZGVwdGggb2YgY3Vyc29yICovCisJY3Vyc29yLT5iaXRzWzJdID0gaG90X3k7CisJY3Vyc29yLT5iaXRzWzNdID0gaG90X3g7CisJY3B0ciA9ICZjdXJzb3ItPmJpdHNbNF07CisKKwkvKiBQYWQgb3V0IHRvIHRoZSBub3JtYWwgY3Vyc29yIHNpemUgKi8KKwlydW4gPSBQQURERURfQklUUyh3KTsKKwlwYWQgPSBQQURERURfQklUUyhhbGxvd2VkX3gpLXJ1bjsKKwlmb3IgKCBpPTA7IGk8aDsgKytpICkgeworCQlTRExfbWVtY3B5KGNwdHIsIGRhdGEsIHJ1bik7CisJCVNETF9tZW1zZXQoY3B0citydW4sIDAsIHBhZCk7CisJCWRhdGEgKz0gcnVuOworCQljcHRyICs9IChydW4rcGFkKTsKKwl9CisJZm9yICggOyBpPGFsbG93ZWRfeTsgKytpICkgeworCQlTRExfbWVtc2V0KGNwdHIsIDAsIHJ1bitwYWQpOworCQljcHRyICs9IChydW4rcGFkKTsKKwl9CisJZm9yICggaT0wOyBpPGg7ICsraSApIHsKKwkJLyogRklYTUU6IFRoZSBtYXNrIHNob3VsZCBiZSBPUidkIHdpdGggdGhlIGRhdGEgdG8gdHVybiAKKwkJICAgaW52ZXJ0ZWQgY29sb3IgcGl4ZWxzIGJsYWNrLCBzaW5jZSBpbnZlcnRlZCBjb2xvciBwaXhlbHMKKwkJICAgYXJlbid0IHN1cHBvcnRlZCB1bmRlciBCZU9TLgorCQkgKi8KKwkJU0RMX21lbWNweShjcHRyLCBtYXNrLCBydW4pOworCQlTRExfbWVtc2V0KGNwdHIrcnVuLCAwLCBwYWQpOworCQltYXNrICs9IHJ1bjsKKwkJY3B0ciArPSAocnVuK3BhZCk7CisJfQorCWZvciAoIDsgaTxhbGxvd2VkX3k7ICsraSApIHsKKwkJU0RMX21lbXNldChjcHRyLCAwLCBydW4rcGFkKTsKKwkJY3B0ciArPSAocnVuK3BhZCk7CisJfQorCXJldHVybihjdXJzb3IpOworfQorCitpbnQgQkVfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQoreworCWlmICggYmVfYXBwLT5Mb2NrKCkgKSB7CisJCWlmICggY3Vyc29yID09IE5VTEwgKSB7CisJCQlpZiAoIFNETF9CbGFua0N1cnNvciAhPSBOVUxMICkgeworCQkJCWJlX2FwcC0+U2V0Q3Vyc29yKFNETF9CbGFua0N1cnNvci0+Yml0cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQliZV9hcHAtPlNldEN1cnNvcihjdXJzb3ItPmJpdHMpOworCQl9CisJCWJlX2FwcC0+VW5sb2NrKCk7CisJfQorCXJldHVybigxKTsKK30KKwordm9pZCBCRV9GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCit7CisJU0RMX2ZyZWUoY3Vyc29yLT5iaXRzKTsKKwlTRExfZnJlZShjdXJzb3IpOworfQorCisvKiBJbXBsZW1lbnRhdGlvbiBieSBDaHJpc3RpYW4gQmF1ZXIgPGNiYXVlckBzdHVkZW50LnBoeXNpay51bmktbWFpbnouZGU+ICovCit2b2lkIEJFX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KQoreworCUJQb2ludCBwdDsKKwlTRExfV2luLT5HZXRYWU9mZnNldChwdC54LCBwdC55KTsKKwlwdC54ICs9IHg7CisJcHQueSArPSB5OworCVNETF9XaW4tPkxvY2soKTsKKwlTRExfV2luLT5Db252ZXJ0VG9TY3JlZW4oJnB0KTsKKwlTRExfV2luLT5VbmxvY2soKTsKKwlzZXRfbW91c2VfcG9zaXRpb24oKGludDMyKXB0LngsIChpbnQzMilwdC55KTsKK30KKworLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZW50ZXIgb3IgbGVhdmUgbW91c2UgcmVsYXRpdmUgbW9kZSAqLwordm9pZCBCRV9DaGVja01vdXNlTW9kZShfVEhJUykKK3sKKyAgICAgICAgLyogSWYgdGhlIG1vdXNlIGlzIGhpZGRlbiBhbmQgaW5wdXQgaXMgZ3JhYmJlZCwgd2UgdXNlIHJlbGF0aXZlIG1vZGUgKi8KKyAgICAgICAgaWYgKCAhKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9WSVNJQkxFKSAmJgorICAgICAgICAgICAgIChfdGhpcy0+aW5wdXRfZ3JhYiAhPSBTRExfR1JBQl9PRkYpICkgeworICAgICAgICAgICAgICAgIG1vdXNlX3JlbGF0aXZlID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtb3VzZV9yZWxhdGl2ZSA9IDA7CisgICAgICAgIH0KK30KKworfTsgLyogRXh0ZXJuIEMgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9id2luZG93L1NETF9zeXNtb3VzZV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiM2IyYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzbW91c2VfYy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX2xvd3ZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgQkVfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKK2V4dGVybiBXTWN1cnNvciAqQkVfQ3JlYXRlV01DdXJzb3IoX1RISVMsCisJCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSk7CitleHRlcm4gaW50IEJFX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gdm9pZCBCRV9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7CitleHRlcm4gdm9pZCBCRV9DaGVja01vdXNlTW9kZShfVEhJUyk7CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzdmlkZW8uY2MgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3ZpZGVvLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmI2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3ZpZGVvLmNjCkBAIC0wLDAgKzEsODQxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogQldpbmRvdyBiYXNlZCBmcmFtZWJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJTRExfQldpbi5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorCitleHRlcm4gIkMiIHsKKworI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfc3lzZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfc3lzbW91c2VfYy5oIgorI2luY2x1ZGUgIlNETF9zeXN3bV9jLmgiCisjaW5jbHVkZSAiU0RMX2xvd3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3l1dmZ1bmNzLmgiCisjaW5jbHVkZSAiU0RMX3N5c3l1di5oIgorI2luY2x1ZGUgIi4uL2JsYW5rX2N1cnNvci5oIgorCisjZGVmaW5lIEJFT1NfSElEREVOX1NJWkUJMzIJLyogc3RhcnRpbmcgaGlkZGVuIHdpbmRvdyBzaXplICovCisKKy8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBCRV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipCRV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworc3RhdGljIFNETF9TdXJmYWNlICpCRV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgdm9pZCBCRV9VcGRhdGVNb3VzZShfVEhJUyk7CitzdGF0aWMgaW50IEJFX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBCRV9WaWRlb1F1aXQoX1RISVMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBCRV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBCRV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBCRV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIEJFX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKKworc3RhdGljIGludCBCRV9Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgZnVsbHNjcmVlbik7CisKKy8qIE9wZW5HTCBmdW5jdGlvbnMgKi8KKyNpZiBTRExfVklERU9fT1BFTkdMCitzdGF0aWMgaW50IEJFX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyB2b2lkKiBCRV9HTF9HZXRQcm9jQWRkcmVzcyhfVEhJUywgY29uc3QgY2hhciAqcHJvYyk7CitzdGF0aWMgaW50IEJFX0dMX0dldEF0dHJpYnV0ZShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOworc3RhdGljIGludCBCRV9HTF9NYWtlQ3VycmVudChfVEhJUyk7CitzdGF0aWMgdm9pZCBCRV9HTF9Td2FwQnVmZmVycyhfVEhJUyk7CisjZW5kaWYKKworLyogRkIgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBCRV9BdmFpbGFibGUodm9pZCkKK3sKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkIEJFX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqQkVfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggZGV2aWNlICkgeworCQkJU0RMX2ZyZWUoZGV2aWNlKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBCRV9WaWRlb0luaXQ7CisJZGV2aWNlLT5MaXN0TW9kZXMgPSBCRV9MaXN0TW9kZXM7CisJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBCRV9TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5Ub2dnbGVGdWxsU2NyZWVuID0gQkVfVG9nZ2xlRnVsbFNjcmVlbjsKKwlkZXZpY2UtPlVwZGF0ZU1vdXNlID0gQkVfVXBkYXRlTW91c2U7CisJZGV2aWNlLT5DcmVhdGVZVVZPdmVybGF5ID0gQkVfQ3JlYXRlWVVWT3ZlcmxheTsKKwlkZXZpY2UtPlNldENvbG9ycyA9IEJFX1NldENvbG9yczsKKwlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IEJFX1ZpZGVvUXVpdDsKKwkvKiBIYXJkd2FyZSBhY2NlbGVyYXRpb24gZnVuY3Rpb25zICovCisJZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IEJFX0FsbG9jSFdTdXJmYWNlOworCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOworCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IEJFX0xvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBCRV9VbmxvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gTlVMTDsKKwlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBCRV9GcmVlSFdTdXJmYWNlOworCS8qIEdhbW1hIHN1cHBvcnQgKi8KKyNpZiBTRExfVklERU9fT1BFTkdMCisJLyogT3BlbkdMIHN1cHBvcnQgKi8KKwlkZXZpY2UtPkdMX0xvYWRMaWJyYXJ5ID0gQkVfR0xfTG9hZExpYnJhcnk7CisJZGV2aWNlLT5HTF9HZXRQcm9jQWRkcmVzcyA9IEJFX0dMX0dldFByb2NBZGRyZXNzOworCWRldmljZS0+R0xfR2V0QXR0cmlidXRlID0gQkVfR0xfR2V0QXR0cmlidXRlOworCWRldmljZS0+R0xfTWFrZUN1cnJlbnQgPSBCRV9HTF9NYWtlQ3VycmVudDsKKwlkZXZpY2UtPkdMX1N3YXBCdWZmZXJzID0gQkVfR0xfU3dhcEJ1ZmZlcnM7CisjZW5kaWYKKwkvKiBXaW5kb3cgbWFuYWdlciBmdW5jdGlvbnMgKi8KKwlkZXZpY2UtPlNldENhcHRpb24gPSBCRV9TZXRXTUNhcHRpb247CisJZGV2aWNlLT5TZXRJY29uID0gTlVMTDsKKwlkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBCRV9JY29uaWZ5V2luZG93OworCWRldmljZS0+R3JhYklucHV0ID0gQkVfR3JhYklucHV0OworCWRldmljZS0+R2V0V01JbmZvID0gQkVfR2V0V01JbmZvOworCS8qIEN1cnNvciBtYW5hZ2VyIGZ1bmN0aW9ucyAqLworCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gQkVfRnJlZVdNQ3Vyc29yOworCWRldmljZS0+Q3JlYXRlV01DdXJzb3IgPSBCRV9DcmVhdGVXTUN1cnNvcjsKKwlkZXZpY2UtPlNob3dXTUN1cnNvciA9IEJFX1Nob3dXTUN1cnNvcjsKKwlkZXZpY2UtPldhcnBXTUN1cnNvciA9IEJFX1dhcnBXTUN1cnNvcjsKKwlkZXZpY2UtPk1vdmVXTUN1cnNvciA9IE5VTEw7CisJZGV2aWNlLT5DaGVja01vdXNlTW9kZSA9IEJFX0NoZWNrTW91c2VNb2RlOworCS8qIEV2ZW50IG1hbmFnZXIgZnVuY3Rpb25zICovCisJZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBCRV9Jbml0T1NLZXltYXA7CisJZGV2aWNlLT5QdW1wRXZlbnRzID0gQkVfUHVtcEV2ZW50czsKKworCWRldmljZS0+ZnJlZSA9IEJFX0RlbGV0ZURldmljZTsKKworCS8qIFNldCB0aGUgZHJpdmVyIGZsYWdzICovCisJZGV2aWNlLT5oYW5kbGVzX2FueV9zaXplID0gMTsKKwkKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBCV0lORE9XX2Jvb3RzdHJhcCA9IHsKKwkiYndpbmRvdyIsICJCRGlyZWN0V2luZG93IGdyYXBoaWNzIiwKKwlCRV9BdmFpbGFibGUsIEJFX0NyZWF0ZURldmljZQorfTsKKworc3RhdGljIGlubGluZSBpbnQgQ29sb3JTcGFjZVRvQml0c1BlclBpeGVsKHVpbnQzMiBjb2xvcnNwYWNlKQoreworCWludCBiaXRzcGVycGl4ZWw7CisKKwliaXRzcGVycGl4ZWwgPSAwOworCXN3aXRjaCAoY29sb3JzcGFjZSkgeworCSAgICBjYXNlIEJfQ01BUDg6CisJCWJpdHNwZXJwaXhlbCA9IDg7CisJCWJyZWFrOworCSAgICBjYXNlIEJfUkdCMTU6CisJICAgIGNhc2UgQl9SR0JBMTU6CisJICAgIGNhc2UgQl9SR0IxNV9CSUc6CisJICAgIGNhc2UgQl9SR0JBMTVfQklHOgorCQliaXRzcGVycGl4ZWwgPSAxNTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQl9SR0IxNjoKKwkgICAgY2FzZSBCX1JHQjE2X0JJRzoKKwkJYml0c3BlcnBpeGVsID0gMTY7CisJCWJyZWFrOworCSAgICBjYXNlIEJfUkdCMzI6CisJICAgIGNhc2UgQl9SR0JBMzI6CisJICAgIGNhc2UgQl9SR0IzMl9CSUc6CisJICAgIGNhc2UgQl9SR0JBMzJfQklHOgorCQliaXRzcGVycGl4ZWwgPSAzMjsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4oYml0c3BlcnBpeGVsKTsKK30KKworLyogRnVuY3Rpb24gdG8gc29ydCB0aGUgZGlzcGxheV9saXN0IGluIGJzY3JlZW4gKi8KK3N0YXRpYyBpbnQgQ29tcGFyZU1vZGVzKGNvbnN0IHZvaWQgKkEsIGNvbnN0IHZvaWQgKkIpCit7CisJY29uc3QgZGlzcGxheV9tb2RlICphID0gKGRpc3BsYXlfbW9kZSAqKUE7CisJY29uc3QgZGlzcGxheV9tb2RlICpiID0gKGRpc3BsYXlfbW9kZSAqKUI7CisKKwlpZiAoIGEtPnNwYWNlID09IGItPnNwYWNlICkgeworCQlyZXR1cm4oKGItPnZpcnR1YWxfd2lkdGgqYi0+dmlydHVhbF9oZWlnaHQpLQorCQkgICAgICAgKGEtPnZpcnR1YWxfd2lkdGgqYS0+dmlydHVhbF9oZWlnaHQpKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oQ29sb3JTcGFjZVRvQml0c1BlclBpeGVsKGItPnNwYWNlKS0KKwkJICAgICAgIENvbG9yU3BhY2VUb0JpdHNQZXJQaXhlbChhLT5zcGFjZSkpOworCX0KK30KKworLyogWWVzLCB0aGlzIGlzbid0IHRoZSBmYXN0ZXN0IGl0IGNvdWxkIGJlLCBidXQgaXQgd29ya3MgbmljZWx5ICovCitzdGF0aWMgaW50IEJFX0FkZE1vZGUoX1RISVMsIGludCBpbmRleCwgdW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoKQoreworCVNETF9SZWN0ICptb2RlOworCWludCBpOworCWludCBuZXh0X21vZGU7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbW9kZSAqLworCWlmICggU0RMX251bW1vZGVzW2luZGV4XSA+IDAgKSB7CisJCWZvciAoIGk9U0RMX251bW1vZGVzW2luZGV4XS0xOyBpID49IDA7IC0taSApIHsKKwkJCW1vZGUgPSBTRExfbW9kZWxpc3RbaW5kZXhdW2ldOworCQkJaWYgKCAobW9kZS0+dyA9PSB3KSAmJiAobW9kZS0+aCA9PSBoKSApIHsKKyNpZmRlZiBCV0lORE9XX0RFQlVHCisJCQkJZnByaW50ZihzdGRlcnIsICJXZSBhbHJlYWR5IGhhdmUgbW9kZSAlZHglZCBhdCAlZCBieXRlcyBwZXIgcGl4ZWxcbiIsIHcsIGgsIGluZGV4KzEpOworI2VuZGlmCisJCQkJcmV0dXJuKDApOworCQkJfQorCQl9CisJfQorCisJLyogU2V0IHVwIHRoZSBuZXcgdmlkZW8gbW9kZSByZWN0YW5nbGUgKi8KKwltb2RlID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YgKm1vZGUpOworCWlmICggbW9kZSA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJbW9kZS0+eCA9IDA7CisJbW9kZS0+eSA9IDA7CisJbW9kZS0+dyA9IHc7CisJbW9kZS0+aCA9IGg7CisjaWZkZWYgQldJTkRPV19ERUJVRworCWZwcmludGYoc3RkZXJyLCAiQWRkaW5nIG1vZGUgJWR4JWQgYXQgJWQgYnl0ZXMgcGVyIHBpeGVsXG4iLCB3LCBoLCBpbmRleCsxKTsKKyNlbmRpZgorCisJLyogQWxsb2NhdGUgdGhlIG5ldyBsaXN0IG9mIG1vZGVzLCBhbmQgZmlsbCBpbiB0aGUgbmV3IG1vZGUgKi8KKwluZXh0X21vZGUgPSBTRExfbnVtbW9kZXNbaW5kZXhdOworCVNETF9tb2RlbGlzdFtpbmRleF0gPSAoU0RMX1JlY3QgKiopCisJICAgICAgIFNETF9yZWFsbG9jKFNETF9tb2RlbGlzdFtpbmRleF0sICgxK25leHRfbW9kZSsxKSpzaXplb2YoU0RMX1JlY3QgKikpOworCWlmICggU0RMX21vZGVsaXN0W2luZGV4XSA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJU0RMX251bW1vZGVzW2luZGV4XSA9IDA7CisJCVNETF9mcmVlKG1vZGUpOworCQlyZXR1cm4oLTEpOworCX0KKwlTRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZV0gPSBtb2RlOworCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlKzFdID0gTlVMTDsKKwlTRExfbnVtbW9kZXNbaW5kZXhdKys7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBCRV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKwlkaXNwbGF5X21vZGUgKm1vZGVzOworCXVpbnQzMiBpLCBubW9kZXM7CisJaW50IGJwcDsKKwlCUmVjdCBib3VuZHM7CisKKwkvKiBJbml0aWFsaXplIHRoZSBCZSBBcHBsaWNhdGlvbiBmb3IgYXBwc2VydmVyIGludGVyYWN0aW9uICovCisJaWYgKCBTRExfSW5pdEJlQXBwKCkgPCAwICkgeworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgYmUgY3JlYXRlZCBhZnRlciBTRExfSW5pdEJlQXBwKCkgKi8KKwlCU2NyZWVuIGJzY3JlZW47CisKKwkvKiBTYXZlIHRoZSBjdXJyZW50IGRpc3BsYXkgbW9kZSAqLworCWJzY3JlZW4uR2V0TW9kZSgmc2F2ZWRfbW9kZSk7CisJX3RoaXMtPmluZm8uY3VycmVudF93ID0gc2F2ZWRfbW9kZS52aXJ0dWFsX3dpZHRoOworCV90aGlzLT5pbmZvLmN1cnJlbnRfaCA9IHNhdmVkX21vZGUudmlydHVhbF9oZWlnaHQ7CisKKwkvKiBEZXRlcm1pbmUgdGhlIHNjcmVlbiBkZXB0aCAqLworCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IENvbG9yU3BhY2VUb0JpdHNQZXJQaXhlbChic2NyZWVuLkNvbG9yU3BhY2UoKSk7CisJaWYgKCB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gMCApIHsKKwkJU0RMX1NldEVycm9yKCJVbmtub3duIEJTY3JlZW4gY29sb3JzcGFjZTogMHgleCIsCisJCQkJCQlic2NyZWVuLkNvbG9yU3BhY2UoKSk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogR2V0IHRoZSB2aWRlbyBtb2RlcyB3ZSBjYW4gc3dpdGNoIHRvIGluIGZ1bGxzY3JlZW4gbW9kZSAqLworCWJzY3JlZW4uR2V0TW9kZUxpc3QoJm1vZGVzLCAmbm1vZGVzKTsKKwlTRExfcXNvcnQobW9kZXMsIG5tb2Rlcywgc2l6ZW9mICptb2RlcywgQ29tcGFyZU1vZGVzKTsKKwlmb3IgKCBpPTA7IGk8bm1vZGVzOyArK2kgKSB7CisJCWJwcCA9IENvbG9yU3BhY2VUb0JpdHNQZXJQaXhlbChtb2Rlc1tpXS5zcGFjZSk7CisJCS8vaWYgKCBicHAgIT0gMCApIHsgLy8gVGhlcmUgYXJlIGJ1Z3MgaW4gY2hhbmdpbmcgY29sb3JzcGFjZQorCQlpZiAoIG1vZGVzW2ldLnNwYWNlID09IHNhdmVkX21vZGUuc3BhY2UgKSB7CisJCQlCRV9BZGRNb2RlKF90aGlzLCAoKGJwcCs3KS84KS0xLAorCQkJCW1vZGVzW2ldLnZpcnR1YWxfd2lkdGgsCisJCQkJbW9kZXNbaV0udmlydHVhbF9oZWlnaHQpOworCQl9CisJfQorCisJLyogQ3JlYXRlIHRoZSB3aW5kb3cgYW5kIHZpZXcgKi8KKwlib3VuZHMudG9wID0gMDsgYm91bmRzLmxlZnQgPSAwOworCWJvdW5kcy5yaWdodCA9IEJFT1NfSElEREVOX1NJWkU7CisJYm91bmRzLmJvdHRvbSA9IEJFT1NfSElEREVOX1NJWkU7CisJU0RMX1dpbiA9IG5ldyBTRExfQldpbihib3VuZHMpOworCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCS8qIHRlc3RnbCBhcHBsaWNhdGlvbiBkb2Vzbid0IGxvYWQgbGlicmFyeSwganVzdCB0cmllcyB0byBsb2FkIHN5bWJvbHMgKi8KKwkvKiBpcyBpdCBjb3JyZWN0PyBpZiBzbyB3ZSBoYXZlIHRvIGxvYWQgbGlicmFyeSBoZXJlICovCisJQkVfR0xfTG9hZExpYnJhcnkoX3RoaXMsIE5VTEwpOworI2VuZGlmCisKKwkvKiBDcmVhdGUgdGhlIGNsZWFyIGN1cnNvciAqLworCVNETF9CbGFua0N1cnNvciA9IEJFX0NyZWF0ZVdNQ3Vyc29yKF90aGlzLCBibGFua19jZGF0YSwgYmxhbmtfY21hc2ssCisJCQlCTEFOS19DV0lEVEgsIEJMQU5LX0NIRUlHSFQsIEJMQU5LX0NIT1RYLCBCTEFOS19DSE9UWSk7CisKKwkvKiBGaWxsIGluIHNvbWUgd2luZG93IG1hbmFnZXIgY2FwYWJpbGl0aWVzICovCisJX3RoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMTsKKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKDApOworfQorCisvKiBXZSBzdXBwb3J0IGFueSBkaW1lbnNpb24gYXQgb3VyIGJpdC1kZXB0aCAqLworU0RMX1JlY3QgKipCRV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCit7CisJU0RMX1JlY3QgKiptb2RlczsKKworCW1vZGVzID0gKChTRExfUmVjdCAqKikwKTsKKwlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKKwkJbW9kZXMgPSBTRExfbW9kZWxpc3RbKChmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xXTsKKwl9IGVsc2UgeworCQlpZiAoIGZvcm1hdC0+Qml0c1BlclBpeGVsID09CisJCQlfdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCApIHsKKwkJCW1vZGVzID0gKChTRExfUmVjdCAqKiktMSk7CisJCX0KKwl9CisJcmV0dXJuKG1vZGVzKTsKK30KKworLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KK3N0YXRpYyB2b2lkIEJFX05vcm1hbFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCisKKy8qIEZpbmQgdGhlIGNsb3Nlc3QgZGlzcGxheSBtb2RlIGZvciBmdWxsc2NyZWVuICovCitzdGF0aWMgYm9vbCBCRV9GaW5kQ2xvc2VzdEZTTW9kZShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLAorCQkJCQkgZGlzcGxheV9tb2RlICptb2RlKQoreworCUJTY3JlZW4gYnNjcmVlbjsKKwl1aW50MzIgaSwgbm1vZGVzOworCVNETF9SZWN0ICoqbW9kZXM7CisJZGlzcGxheV9tb2RlICpkbW9kZXM7CisJZGlzcGxheV9tb2RlIGN1cnJlbnQ7CisJZmxvYXQgY3VycmVudF9yZWZyZXNoOworCWJzY3JlZW4uR2V0TW9kZSgmY3VycmVudCk7CisJY3VycmVudF9yZWZyZXNoID0gKDEwMDAgKiBjdXJyZW50LnRpbWluZy5waXhlbF9jbG9jaykgLyAKKwkgICAgICAgICAgICAgICAgICAoY3VycmVudC50aW1pbmcuaF90b3RhbCAqIGN1cnJlbnQudGltaW5nLnZfdG90YWwpOworCisJbW9kZXMgPSBTRExfbW9kZWxpc3RbKChicHArNykvOCktMV07CisJCisJLy8gZmluZCBlbmQgb2YgbGlzdCAobG93ZXN0LXJlc29sdXRpb24gbW9kZTsgbW9kZXMgYXJlIG9yZGVyZWQKKwkvLyBoaWdoZXN0LXRvLWxvd2VzdCkuCisJaSA9IDA7IHdoaWxlKG1vZGVzW2ldKSBpKys7CisJaWYgKCFpKSByZXR1cm4gZmFsc2U7CQkvLyB3aGF0PyBubyBtb2RlcyBhdCBhbGw/CisJCisJLy8gZmluZCBmaXJzdCBtb2RlIHdpdGggcmVzb2x1dGlvbiA+PSByZXF1ZXN0ZWQgaW4gYm90aCBkaW1lbnNpb25zCisJZm9yICgtLWk7IGkgPj0gMDsgLS1pKQorCXsKKwkJaWYgKG1vZGVzW2ldLT53ID49IHdpZHRoICYmIG1vZGVzW2ldLT5oID49IGhlaWdodCkKKwkJCWJyZWFrOworCX0KKwkKKwkvLyB1bmFibGUgdG8gZmluZCBhbnkgbW9kZSB3aXRoIHRoYXQgaGlnaCBhIHJlc29sdXRpb24hCisJaWYgKGkgPCAwKQorCQlyZXR1cm4gZmFsc2U7CisJCisJd2lkdGggPSBtb2Rlc1tpXS0+dzsKKwloZWlnaHQgPSBtb2Rlc1tpXS0+aDsKKworCWJzY3JlZW4uR2V0TW9kZUxpc3QoJmRtb2RlcywgJm5tb2Rlcyk7CisJZm9yICggaSA9IDA7IGkgPCBubW9kZXM7ICsraSApIHsKKwkJaWYgKCAoYnBwID09IENvbG9yU3BhY2VUb0JpdHNQZXJQaXhlbChkbW9kZXNbaV0uc3BhY2UpKSAmJgorCQkgICAgICh3aWR0aCA9PSBkbW9kZXNbaV0udmlydHVhbF93aWR0aCkgJiYKKwkJICAgICAoaGVpZ2h0ID09IGRtb2Rlc1tpXS52aXJ0dWFsX2hlaWdodCkgKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIGkgIT0gbm1vZGVzICkgeworCQkqbW9kZSA9IGRtb2Rlc1tpXTsKKwkJaWYgKChtb2RlLT52aXJ0dWFsX3dpZHRoIDw9IGN1cnJlbnQudmlydHVhbF93aWR0aCkgJiYKKwkJICAgIChtb2RlLT52aXJ0dWFsX2hlaWdodCA8PSBjdXJyZW50LnZpcnR1YWxfaGVpZ2h0KSkgeworCQkJZmxvYXQgbmV3X3JlZnJlc2ggPSAoMTAwMCAqIG1vZGUtPnRpbWluZy5waXhlbF9jbG9jaykgLworCQkJICAgICAgICAgICAgICAgICAgICAobW9kZS0+dGltaW5nLmhfdG90YWwgKiBtb2RlLT50aW1pbmcudl90b3RhbCk7CisJCQlpZiAobmV3X3JlZnJlc2ggPCBjdXJyZW50X3JlZnJlc2gpIHsKKwkJCQltb2RlLT50aW1pbmcucGl4ZWxfY2xvY2sgPSAodWludDMyKSgobW9kZS0+dGltaW5nLmhfdG90YWwgKiBtb2RlLT50aW1pbmcudl90b3RhbCkKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGN1cnJlbnRfcmVmcmVzaCAvIDEwMDApOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9CQorfQorCitzdGF0aWMgaW50IEJFX1NldEZ1bGxTY3JlZW4oX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4sIGludCBmdWxsc2NyZWVuKQoreworCS8vIHByaW50ZigiU2V0RnVsbFNjcmVlbiglZClcbiIsIGZ1bGxzY3JlZW4pOworCUJTY3JlZW4gYnNjcmVlbjsKKworCS8vIFNldEZ1bGxTc2NyZWVuKCkgZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCBpZiBjYWxsZWQgaW4gYSB3aW5kb3cKKwkvLyB0aGF0IHdhcyBuZXZlciBzaG93bi4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiB0aGUgSGFpa3UgR2FtZSBLaXQgdGhhdCBuZWVkcworCS8vIHRvIGJlIGludmVzdGlnYXRlZC4JCisJaWYgKFNETF9XaW4tPkxvY2soKSkgeworCQkvLyBTaG93IG91ciB3aW5kb3cuCisJCVNETF9XaW4tPlNob3coKTsKKwl9CQorCQorCWlmIChTRExfV2luLT5Jc0xvY2tlZCgpKSB7CisJCS8vIFVubG9jayB0aGUgd2luZG93IGlmIGl0IHdhcyBsb2NrZWQuIFRoaXMgaXMgbmVlZGVkIGFzIG9ubHkgdGhlCisJCS8vIGZpcnN0IGNhbGwgdG8gU2hvdygpIHVubG9ja3MgdGhlIGxvb3Blci4gQWxsIG90aGVyIGNhbGxzIHRvIGl0CisJCS8vIHdpbGwgbm90LgorCQlTRExfV2luLT5VbmxvY2soKTsKKwl9CisKKwlpbnQgd2lkdGggPSBzY3JlZW4tPnc7CisJaW50IGhlaWdodCA9IHNjcmVlbi0+aDsKKwkKKwlpZiAoZnVsbHNjcmVlbikgeworCQkvLyBTZXQgcmVzb2x1dGlvbiB0byB0aGUgY2xvc2VzdCBhdmFpbGFibGUgb25lIHRoYXQgbWF0Y2hlcyB0aGUKKwkJLy8gY3VycmVudCBTREwgcmVzb2x1dGlvbi4KKwkJZGlzcGxheV9tb2RlIG1vZGU7CisJCWJzY3JlZW4uR2V0TW9kZSgmbW9kZSk7CisKKwkJaW50IGJwcCA9IHNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisJCWlmIChicHAgIT0gQ29sb3JTcGFjZVRvQml0c1BlclBpeGVsKG1vZGUuc3BhY2UpIHx8CisJCQl3aWR0aCAhPSBtb2RlLnZpcnR1YWxfd2lkdGggfHwgaGVpZ2h0ICE9IG1vZGUudmlydHVhbF9oZWlnaHQpIHsKKwkJCWlmKEJFX0ZpbmRDbG9zZXN0RlNNb2RlKF90aGlzLCB3aWR0aCwgaGVpZ2h0LCBicHAsICZtb2RlKSkgeworCQkJCWJzY3JlZW4uU2V0TW9kZSgmbW9kZSk7CisJCQl9IGVsc2UgeworCQkJCS8vIHByaW50ZigiQ291bGQgbm90IHNldCBuZXcgbW9kZS5cbiIpOworCQkJCXJldHVybigwKTsKKwkJCX0JCQkKKwkJfQorCX0gZWxzZSB7CisJCS8vIFJlc2V0IHRvIHRoZSBwcmV2aW91cyBrbm93biByZXNvbHV0aW9uIGFzIHdlIGFyZSBub3cgaW4gd2luZG93CisJCS8vIG1vZGUuCisJCWJzY3JlZW4uU2V0TW9kZSgmc2F2ZWRfbW9kZSk7CQorCX0KKwkKKwkvLyBFZmZlY3RpdmVsbHkgc2V0L3Jlc2V0IGZ1bGwgc2NyZWVuIG1vZGUuIElmIHdlIGFyZSBhbHJlYWR5IGluCisJLy8gZnVsbCBzY3JlZW4gbW9kZSwgd2UgcmVzZXQgYmFjayB0byB3aW5kb3dlZCBtb2RlIGZpcnN0IHNvIHRoZQorCS8vIHdpbmRvdyBjYW4gcmVzaXplIHdoZW4gZ29pbmcgZnVsbHNjcmVlbi4KKwkvLyBpZiAoZnVsbHNjcmVlbikKKwkJLy8gcHJpbnRmKCJHb2luZyBmdWxsc2NyZWVuXG4iKTsKKwkvLyBlbHNlCisJCS8vIHByaW50ZigiR29pbmcgd2luZG93ZWRcbiIpOyAKKwlTRExfV2luLT5TZXRGdWxsU2NyZWVuKGZ1bGxzY3JlZW4pOworCQorCS8vIENhbGN1bGF0ZSBvZmZzZXRzIGZvciBjZW50ZXJpbmcgdGhlIHdpbmRvdyAoaW4gd2luZG93IG1vZGUpIGFuZCBmb3IKKwkvLyBkZW50ZXJpbmcgdGhlIGJpdG1hcCAoaW4gZnVsbCBzY3JlZW4gbW9kZSkuCisJQlJlY3QgYm91bmRzID0gYnNjcmVlbi5GcmFtZSgpOworCWJvdW5kcy5QcmludFRvU3RyZWFtKCk7CisJaW50MzIgY3ggPSAoYm91bmRzLkludGVnZXJXaWR0aCgpIC0gd2lkdGgpLzI7CisJaW50MzIgY3kgPSAoYm91bmRzLkludGVnZXJIZWlnaHQoKSAtIGhlaWdodCkvMjsKKwkKKwkvLyBwcmludGYgKCJjeCA9ICVkLCBjeSA9ICVkXG4iLCBjeCwgY3kpOworCWlmICghU0RMX1dpbi0+SXNGdWxsU2NyZWVuKCkpIHsKKwkJLy8gcHJpbnRmKCJEb2luZyBub3QgZnVsbHNjcmVlbiBzdHVmZi5cbiIpOworCQkvLyBXZSBhcmUgbm90IGluIGZ1bGwgc2NyZWVuIG1vZGUsIHNvIHdlIHdhbnQgdG8gY2hhbmdlIHRoZSB3aW5kb3cKKwkJLy8gc2l6ZSB0byBtYXRjaCB0aGUgcmVzb2x1dGlvbiBpbiBTREwuCisJCVNETF9XaW4tPlJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpOworCQkKKwkJLy8gQW5kIGFsc28gY2VudGVyIHRoZSB3aW5kb3cgYW5kIHJlc2V0IHRoZSBkcmF3aW5nIG9mZnNldC4KKwkJU0RMX1dpbi0+TW92ZVRvKGN4LCBjeSk7CisJCVNETF9XaW4tPlNldFhZT2Zmc2V0KDAsIDApOworCX0gZWxzZSB7CisJCS8vIHByaW50ZigiRG9pbmcgZnVsbHNjcmVlbiBzdHVmZi4iKTsKKwkJLy8gQ2VudGVyIHRoZSBiaXRtYXAgd2hlbmV2ZXIgd2UgYXJlIGluIGZ1bGwgc2NyZWVuIG1vZGUuCisJCVNETF9XaW4tPlNldFhZT2Zmc2V0KGN4LCBjeSk7CisJfQorCQorCS8vIFNldCByZWxldmFudCBpbnRlcm5hbCBTREwgc2NyZWVuIGZsYWdzLgorCWlmIChTRExfV2luLT5Jc0Z1bGxTY3JlZW4oKSkgeworCQlzY3JlZW4tPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworCX0gZWxzZSB7CisJCXNjcmVlbi0+ZmxhZ3MgJj0gflNETF9GVUxMU0NSRUVOOyAKKwl9CisKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQgQkVfVG9nZ2xlRnVsbFNjcmVlbihfVEhJUywgaW50IGZ1bGxzY3JlZW4pCit7CisJcmV0dXJuIEJFX1NldEZ1bGxTY3JlZW4oX3RoaXMsIF90aGlzLT5zY3JlZW4sIGZ1bGxzY3JlZW4pOworfQorCisvKiBGSVhNRTogY2hlY2sgcmV0dXJuIHZhbHVlcyBhbmQgY2xlYW51cCBoZXJlICovCitTRExfU3VyZmFjZSAqQkVfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlCU2NyZWVuIGJzY3JlZW47CisJQkJpdG1hcCAqYmJpdG1hcDsKKwlCUmVjdCBib3VuZHM7CisJVWludDMyIGdsX2ZsYWdzID0gMDsKKworCS8qIE9ubHkgUkdCIHdvcmtzIG9uIHI1IGN1cnJlbnRseSAqLworCWdsX2ZsYWdzID0gQkdMX1JHQjsKKwlpZiAoX3RoaXMtPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyKQorCQlnbF9mbGFncyB8PSBCR0xfRE9VQkxFOworCWVsc2UKKwkJZ2xfZmxhZ3MgfD0gQkdMX1NJTkdMRTsKKwlpZiAoX3RoaXMtPmdsX2NvbmZpZy5hbHBoYV9zaXplID4gMCB8fCBicHAgPT0gMzIpCisJCWdsX2ZsYWdzIHw9IEJHTF9BTFBIQTsKKwlpZiAoX3RoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplID4gMCkKKwkJZ2xfZmxhZ3MgfD0gQkdMX0RFUFRIOworCWlmIChfdGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZSA+IDApCisJCWdsX2ZsYWdzIHw9IEJHTF9TVEVOQ0lMOworCWlmIChfdGhpcy0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplID4gMAorCQl8fCBfdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemUgPiAwCisJCXx8IF90aGlzLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplID4gMAorCQl8fCBfdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemUgPiAwKQorCQlnbF9mbGFncyB8PSBCR0xfQUNDVU07CisKKwkvKiBDcmVhdGUgdGhlIHZpZXcgZm9yIHRoaXMgd2luZG93LCB1c2luZyBmb3VuZCBmbGFncyAqLworCWlmICggU0RMX1dpbi0+Q3JlYXRlVmlldyhmbGFncywgZ2xfZmxhZ3MpIDwgMCApIHsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCWN1cnJlbnQtPmZsYWdzID0gMDsJCS8qIENsZWFyIGZsYWdzICovCisJY3VycmVudC0+dyA9IHdpZHRoOworCWN1cnJlbnQtPmggPSBoZWlnaHQ7CisJU0RMX1dpbi0+U2V0VHlwZShCX1RJVExFRF9XSU5ET1cpOworCWlmICggZmxhZ3MgJiBTRExfTk9GUkFNRSApIHsKKwkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX05PRlJBTUU7CisJCVNETF9XaW4tPlNldExvb2soQl9OT19CT1JERVJfV0lORE9XX0xPT0spOworCX0gZWxzZSB7CisJCWlmICggKGZsYWdzICYgU0RMX1JFU0laQUJMRSkgJiYgIShmbGFncyAmIFNETF9PUEVOR0wpICkgIHsKKwkJCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9SRVNJWkFCTEU7CisJCQkvKiBXZSBkb24ndCB3YW50IG9wYXF1ZSByZXNpemluZyAoVE0pLiA6LSkgKi8KKwkJCVNETF9XaW4tPlNldEZsYWdzKEJfT1VUTElORV9SRVNJWkUpOworCQl9IGVsc2UgeworCQkJU0RMX1dpbi0+U2V0RmxhZ3MoQl9OT1RfUkVTSVpBQkxFfEJfTk9UX1pPT01BQkxFKTsKKwkJfQorCX0KKworCWlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgeworCQljdXJyZW50LT5mbGFncyB8PSBTRExfT1BFTkdMOworCQljdXJyZW50LT5waXRjaCA9IDA7CisJCWN1cnJlbnQtPnBpeGVscyA9IE5VTEw7CisJCV90aGlzLT5VcGRhdGVSZWN0cyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogQ3JlYXRlIHRoZSBCQml0bWFwIGZyYW1lYnVmZmVyICovCisJCWJvdW5kcy50b3AgPSAwOyBib3VuZHMubGVmdCA9IDA7CisJCWJvdW5kcy5yaWdodCA9IHdpZHRoLTE7CisJCWJvdW5kcy5ib3R0b20gPSBoZWlnaHQtMTsKKwkJYmJpdG1hcCA9IG5ldyBCQml0bWFwKGJvdW5kcywgYnNjcmVlbi5Db2xvclNwYWNlKCkpOworCQlpZiAoICEgYmJpdG1hcC0+SXNWYWxpZCgpICkgeworCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgc2NyZWVuIGJpdG1hcCIpOworCQkJZGVsZXRlIGJiaXRtYXA7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKwkJY3VycmVudC0+cGl0Y2ggPSBiYml0bWFwLT5CeXRlc1BlclJvdygpOworCQljdXJyZW50LT5waXhlbHMgPSAodm9pZCAqKWJiaXRtYXAtPkJpdHMoKTsKKwkJU0RMX1dpbi0+U2V0Qml0bWFwKGJiaXRtYXApOworCQlfdGhpcy0+VXBkYXRlUmVjdHMgPSBCRV9Ob3JtYWxVcGRhdGU7CisJfQorCisJLyogU2V0IHRoZSBjb3JyZWN0IGZ1bGxzY3JlZW4gbW9kZSAqLworCUJFX1NldEZ1bGxTY3JlZW4oX3RoaXMsIGN1cnJlbnQsIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gPyAxIDogMCk7CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCisvKiBVcGRhdGUgdGhlIGN1cnJlbnQgbW91c2Ugc3RhdGUgYW5kIHBvc2l0aW9uICovCit2b2lkIEJFX1VwZGF0ZU1vdXNlKF9USElTKQoreworCUJQb2ludCBwb2ludDsKKwl1aW50MzIgYnV0dG9uczsKKworCWlmICggU0RMX1dpbi0+TG9jaygpICkgeworCQkvKiBHZXQgbmV3IGlucHV0IHN0YXRlLCBpZiBzdGlsbCBhY3RpdmUgKi8KKwkJaWYgKCBTRExfV2luLT5Jc0FjdGl2ZSgpICkgeworCQkJKFNETF9XaW4tPlZpZXcoKSktPkdldE1vdXNlKCZwb2ludCwgJmJ1dHRvbnMsIHRydWUpOworCQl9IGVsc2UgeworCQkJcG9pbnQueCA9IC0xOworCQkJcG9pbnQueSA9IC0xOworCQl9CisJCVNETF9XaW4tPlVubG9jaygpOworCisJCWlmICggKHBvaW50LnggPj0gMCkgJiYgKHBvaW50LnggPCBTRExfVmlkZW9TdXJmYWNlLT53KSAmJgorCQkgICAgIChwb2ludC55ID49IDApICYmIChwb2ludC55IDwgU0RMX1ZpZGVvU3VyZmFjZS0+aCkgKSB7CisJCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7CisJCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsCisJCQkJCShTaW50MTYpcG9pbnQueCwgKFNpbnQxNilwb2ludC55KTsKKwkJfSBlbHNlIHsKKwkJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKKwkJfQorCX0KK30KKworLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KK3N0YXRpYyBpbnQgQkVfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybigtMSk7Cit9CitzdGF0aWMgdm9pZCBCRV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW50IEJFX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybigwKTsKK30KK3N0YXRpYyB2b2lkIEJFX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBCRV9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCWlmICggU0RMX1dpbi0+QmVnaW5EcmF3KCkgKSB7CisJCWludCBpOworCisJCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgeworCQkJQlJlY3QgcmVjdDsKKworCQkJcmVjdC50b3AgPSByZWN0c1tpXS55OworCQkJcmVjdC5sZWZ0ID0gcmVjdHNbaV0ueDsKKwkJCXJlY3QuYm90dG9tID0gcmVjdC50b3ArcmVjdHNbaV0uaC0xOworCQkJcmVjdC5yaWdodCA9IHJlY3QubGVmdCtyZWN0c1tpXS53LTE7CisJCQlTRExfV2luLT5EcmF3QXN5bmMocmVjdCk7CisJCX0KKwkJU0RMX1dpbi0+RW5kRHJhdygpOworCX0KK30KKworI2lmIFNETF9WSURFT19PUEVOR0wKKy8qIFBhc3NpbmcgYSBOVUxMIHBhdGggbWVhbnMgbG9hZCBwb2ludGVycyBmcm9tIHRoZSBhcHBsaWNhdGlvbiAqLworaW50IEJFX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyICpwYXRoKQoreworCWlmIChwYXRoID09IE5VTEwpIHsKKwkJaWYgKF90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9PSBOVUxMKSB7CisJCQlpbWFnZV9pbmZvIGluZm87CisJCQlpbnQzMiBjb29raWUgPSAwOworCQkJd2hpbGUgKGdldF9uZXh0X2ltYWdlX2luZm8oMCwmY29va2llLCZpbmZvKSA9PSBCX09LKSB7CisJCQkJdm9pZCAqbG9jYXRpb24gPSBOVUxMOworI2lmZGVmIF9fSEFJS1VfXworCQkJCWlmIChnZXRfaW1hZ2Vfc3ltYm9sKGluZm8uaWQsImdsQmVnaW4iLEJfU1lNQk9MX1RZUEVfQU5ZLCZsb2NhdGlvbikgPT0gQl9PSykgeyAvLyBUaGlzIGlzIGhvdyBpdCBhY3R1YWxseSB3b3JrcyBpbiBIYWlrdQorI2Vsc2UKKwkJCQlpZiAoZ2V0X2ltYWdlX3N5bWJvbCgoaW1hZ2VfaWQpY29va2llLCJnbEJlZ2luIixCX1NZTUJPTF9UWVBFX0FOWSwmbG9jYXRpb24pID09IEJfT0spIHsgLy8gSSBkb24ndCBrbm93IGlmIHRoYXQgKmRpZCogd29yayBpbiBCZU9TCisjZW5kaWYKKwkJCQkJX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlID0gKHZvaWQqKWluZm8uaWQ7CisJCQkJCV90aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7CisJCQkJCVNETF9zdHJsY3B5KF90aGlzLT5nbF9jb25maWcuZHJpdmVyX3BhdGgsICJsaWJHTC5zbyIsIFNETF9hcnJheXNpemUoX3RoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCQlGSVhNRSBOb25lIG9mIEJlT1MgbGliR0wuc28gaW1wbGVtZW50YXRpb25zIGhhdmUgZXhwb3J0ZWQgZnVuY3Rpb25zIAorCQkJdG8gbG9hZCBCR0xWaWV3LCB3aGljaCBzaG91bGQgYmUgcmVsb2FkZWQgZnJvbSBuZXcgbGliLgorCQkJU28gZm9yIG5vdyBqdXN0ICJsb2FkIiBsaW5rZWQgbGliR0wuc28gOigKKwkJKi8KKwkJaWYgKF90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9PSBOVUxMKSB7CisJCQlyZXR1cm4gQkVfR0xfTG9hZExpYnJhcnkoX3RoaXMsIE5VTEwpOworCQl9CisKKwkJLyogVW5sb2FkIG9sZCBmaXJzdCAqLworCQkvKmlmIChfdGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUgIT0gTlVMTCkgeyovCisJCQkvKiBEbyBub3QgdHJ5IHRvIHVubG9hZCBhcHBsaWNhdGlvbiBpdHNlbGYgKGlmIExvYWRMaWJyYXJ5IHdhcyBjYWxsZWQgYmVmb3JlIHdpdGggTlVMTCA7KSAqLworCQkvKglpbWFnZV9pbmZvIGluZm87CisJCQlpZiAoZ2V0X2ltYWdlX2luZm8oKGltYWdlX2lkKV90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSwgJmluZm8pID09IEJfT0spIHsKKwkJCQlpZiAoaW5mby50eXBlICE9IEJfQVBQX0lNQUdFKSB7CisJCQkJCXVubG9hZF9hZGRfb24oKGltYWdlX2lkKV90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSk7CisJCQkJfQorCQkJfQorCQkJCisJCX0KKworCQlpZiAoKF90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9ICh2b2lkKilsb2FkX2FkZF9vbihwYXRoKSkgIT0gKHZvaWQqKUJfRVJST1IpIHsKKwkJCV90aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7CisJCQlTRExfc3RybGNweShfdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoLCBwYXRoLCBTRExfYXJyYXlzaXplKF90aGlzLT5nbF9jb25maWcuZHJpdmVyX3BhdGgpKTsKKwkJfSovCisJfQorCisJaWYgKF90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSAhPSBOVUxMKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCV90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IE5VTEw7CisJCV90aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDA7CisJCSpfdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoID0gJ1wwJzsKKwkJcmV0dXJuIC0xOworCX0KK30KKwordm9pZCogQkVfR0xfR2V0UHJvY0FkZHJlc3MoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpCit7CisJaWYgKF90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSAhPSBOVUxMKSB7CisJCXZvaWQgKmxvY2F0aW9uID0gTlVMTDsKKwkJc3RhdHVzX3QgZXJyOworCQlpZiAoKGVyciA9IGdldF9pbWFnZV9zeW1ib2woKGltYWdlX2lkKV90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSwgcHJvYywgQl9TWU1CT0xfVFlQRV9BTlksICZsb2NhdGlvbikpID09IEJfT0spIHsKKwkJCXJldHVybiBsb2NhdGlvbjsKKwkJfSBlbHNlIHsKKwkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCBPcGVuR0wgc3ltYm9sIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCVNETF9TZXRFcnJvcigiT3BlbkdMIGxpYnJhcnkgbm90IGxvYWRlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK2ludCBCRV9HTF9HZXRBdHRyaWJ1dGUoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKQoreworCS8qCisJCUZJWE1FPyBSaWdodCBub3cgQkVfR0xfR2V0QXR0cmlidXRlIHNob3VsZG4ndCBiZSBjYWxsZWQgYmV0d2VlbiBnbEJlZ2luKCkgYW5kIGdsRW5kKCkgLSBpdCBkb2Vzbid0IHVzZSAiY2FjaGVkIiB2YWx1ZXMKKwkqLworCXN3aXRjaCAoYXR0cmliKQorICAgIHsKKwkJY2FzZSBTRExfR0xfUkVEX1NJWkU6CisJCQlnbEdldEludGVnZXJ2KEdMX1JFRF9CSVRTLCAoR0xpbnQqKXZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9HUkVFTl9TSVpFOgorCQkJZ2xHZXRJbnRlZ2VydihHTF9HUkVFTl9CSVRTLCAoR0xpbnQqKXZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9CTFVFX1NJWkU6CisJCQlnbEdldEludGVnZXJ2KEdMX0JMVUVfQklUUywgKEdMaW50Kil2YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfQUxQSEFfU0laRToKKwkJCWdsR2V0SW50ZWdlcnYoR0xfQUxQSEFfQklUUywgKEdMaW50Kil2YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfRE9VQkxFQlVGRkVSOgorCQkJZ2xHZXRCb29sZWFudihHTF9ET1VCTEVCVUZGRVIsIChHTGJvb2xlYW4qKXZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9CVUZGRVJfU0laRToKKwkJCWludCB2OworCQkJZ2xHZXRJbnRlZ2VydihHTF9SRURfQklUUywgKEdMaW50Kikmdik7CisJCQkqdmFsdWUgPSB2OworCQkJZ2xHZXRJbnRlZ2VydihHTF9HUkVFTl9CSVRTLCAoR0xpbnQqKSZ2KTsKKwkJCSp2YWx1ZSArPSB2OworCQkJZ2xHZXRJbnRlZ2VydihHTF9CTFVFX0JJVFMsIChHTGludCopJnYpOworCQkJKnZhbHVlICs9IHY7CisJCQlnbEdldEludGVnZXJ2KEdMX0FMUEhBX0JJVFMsIChHTGludCopJnYpOworCQkJKnZhbHVlICs9IHY7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfREVQVEhfU0laRToKKwkJCWdsR2V0SW50ZWdlcnYoR0xfREVQVEhfQklUUywgKEdMaW50Kil2YWx1ZSk7IC8qIE1lc2EgY3JlYXRlcyAxNiBvbmx5PyByNSBhbHdheXMgMzIgKi8KKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9TVEVOQ0lMX1NJWkU6CisJCQlnbEdldEludGVnZXJ2KEdMX1NURU5DSUxfQklUUywgKEdMaW50Kil2YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfQUNDVU1fUkVEX1NJWkU6CisJCQlnbEdldEludGVnZXJ2KEdMX0FDQ1VNX1JFRF9CSVRTLCAoR0xpbnQqKXZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9BQ0NVTV9HUkVFTl9TSVpFOgorCQkJZ2xHZXRJbnRlZ2VydihHTF9BQ0NVTV9HUkVFTl9CSVRTLCAoR0xpbnQqKXZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9HTF9BQ0NVTV9CTFVFX1NJWkU6CisJCQlnbEdldEludGVnZXJ2KEdMX0FDQ1VNX0JMVUVfQklUUywgKEdMaW50Kil2YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfQUNDVU1fQUxQSEFfU0laRToKKwkJCWdsR2V0SW50ZWdlcnYoR0xfQUNDVU1fQUxQSEFfQklUUywgKEdMaW50Kil2YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBTRExfR0xfU1RFUkVPOgorCQljYXNlIFNETF9HTF9NVUxUSVNBTVBMRUJVRkZFUlM6CisJCWNhc2UgU0RMX0dMX01VTFRJU0FNUExFU0FNUExFUzoKKwkJZGVmYXVsdDoKKwkJCSp2YWx1ZT0wOworCQkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBCRV9HTF9NYWtlQ3VycmVudChfVEhJUykKK3sKKwkvKiBGSVhNRTogc2hvdWxkIHdlIGdsdmlldy0+dW5sb2NrIGFuZCB0aGVuIGdsdmlldy0+bG9jaygpPyAqLworCXJldHVybiAwOworfQorCit2b2lkIEJFX0dMX1N3YXBCdWZmZXJzKF9USElTKQoreworCVNETF9XaW4tPlN3YXBCdWZmZXJzKCk7Cit9CisjZW5kaWYKKworLyogSXMgdGhlIHN5c3RlbSBwYWxldHRlIHNldHRhYmxlPyAqLworaW50IEJFX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKK3sKKwlpbnQgaTsKKwlTRExfUGFsZXR0ZSAqcGFsZXR0ZTsKKwljb25zdCBjb2xvcl9tYXAgKmNtYXAgPSBCU2NyZWVuKCkuQ29sb3JNYXAoKTsKKworCS8qIEdldCB0aGUgc2NyZWVuIGNvbG9ybWFwICovCisJcGFsZXR0ZSA9IF90aGlzLT5zY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZTsKKwlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7CisJCXBhbGV0dGUtPmNvbG9yc1tpXS5yID0gY21hcC0+Y29sb3JfbGlzdFtpXS5yZWQ7CisJCXBhbGV0dGUtPmNvbG9yc1tpXS5nID0gY21hcC0+Y29sb3JfbGlzdFtpXS5ncmVlbjsKKwkJcGFsZXR0ZS0+Y29sb3JzW2ldLmIgPSBjbWFwLT5jb2xvcl9saXN0W2ldLmJsdWU7CisJfQorCXJldHVybigwKTsKK30KKwordm9pZCBCRV9WaWRlb1F1aXQoX1RISVMpCit7CisJaW50IGksIGo7CisKKwlTRExfV2luLT5RdWl0KCk7CisJU0RMX1dpbiA9IE5VTEw7CisKKwlpZiAoIFNETF9CbGFua0N1cnNvciAhPSBOVUxMICkgeworCQlCRV9GcmVlV01DdXJzb3IoX3RoaXMsIFNETF9CbGFua0N1cnNvcik7CisJCVNETF9CbGFua0N1cnNvciA9IE5VTEw7CisJfQorCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7CisJCWlmICggU0RMX21vZGVsaXN0W2ldICkgeworCQkJZm9yICggaj0wOyBTRExfbW9kZWxpc3RbaV1bal07ICsraiApIHsKKwkJCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV1bal0pOworCQkJfQorCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKKwkJCVNETF9tb2RlbGlzdFtpXSA9IE5VTEw7CisJCX0KKwl9CisJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgdmlkZW8gbW9kZSAqLworCWlmICggX3RoaXMtPnNjcmVlbiApIHsKKwkJaWYgKCAoX3RoaXMtPnNjcmVlbi0+ZmxhZ3MmU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgeworCQkJQlNjcmVlbiBic2NyZWVuOworCQkJYnNjcmVlbi5TZXRNb2RlKCZzYXZlZF9tb2RlKTsKKwkJfQorCQlfdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOworCX0KKworI2lmIFNETF9WSURFT19PUEVOR0wKKwlpZiAoX3RoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlICE9IE5VTEwpCisJCXVubG9hZF9hZGRfb24oKGltYWdlX2lkKV90aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSk7CisjZW5kaWYKKworCVNETF9RdWl0QmVBcHAoKTsKK30KKworfTsgLyogRXh0ZXJuIEMgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzd20uY2MgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3dtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODAxMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3dtLmNjCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX0JXaW4uaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiU0RMX3N5c3dtX2MuaCIKKyNpbmNsdWRlICJTRExfZXJyb3IuaCIKKyNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKKwordm9pZCBCRV9TZXRXTUNhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKQoreworCVNETF9XaW4tPlNldFRpdGxlKHRpdGxlKTsKK30KKworaW50IEJFX0ljb25pZnlXaW5kb3coX1RISVMpCit7CisJU0RMX1dpbi0+TWluaW1pemUodHJ1ZSk7CisJcmV0dXJuIDE7Cit9CisKK1NETF9HcmFiTW9kZSBCRV9HcmFiSW5wdXQoX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKQoreworCWlmICggbW9kZSA9PSBTRExfR1JBQl9PRkYgKSB7CisvLwkJYmVfYXBwLT5TaG93Q3Vyc29yKCk7CisJCWlmICggIShTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSkgKSB7CisJCS8qCUJlU21hbjogSmFuIDIsIDIwMDYKKwkJCW11c3QgYmUgbGVhdmluZyByZWxhdGl2ZSBtb2RlLCBtb3ZlIG1vdXNlIGZyb20KKwkJCWNlbnRlciBvZiB3aW5kb3cgdG8gd2hlcmUgaXQgYmVsb25ncyAuLi4gKi8KKwkJCUJQb2ludCBwdDsKKwkJCWludCB4LCB5OworCQkJU0RMX0dldE1vdXNlU3RhdGUoJngsJnkpOworCQkJcHQueCA9IHg7CisJCQlwdC55ID0geTsKKwkJCVNETF9XaW4tPkxvY2soKTsKKwkJCVNETF9XaW4tPkNvbnZlcnRUb1NjcmVlbigmcHQpOworCQkJU0RMX1dpbi0+VW5sb2NrKCk7CisJCQlzZXRfbW91c2VfcG9zaXRpb24oKGludClwdC54LCAoaW50KXB0LnkpOworCQl9CisJfSBlbHNlIHsKKy8vCQliZV9hcHAtPkhpZGVDdXJzb3IoKTsKKwkJaWYgKCAhKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9WSVNJQkxFKSApIHsKKwkJLyoJQmVTbWFuOiBKYW4gMiwgMjAwNgorCQkJbXVzdCBiZSBlbnRlcmluZyByZWxhdGl2ZSBtb2RlLCBnZXQgcmVhZHkgYnkKKwkJCW1vdmluZyBtb3VzZSB0bwljZW50ZXIgb2Ygd2luZG93IC4uLiAqLworCQkJQlBvaW50IHB0OworCQkJcHQueCA9IChTRExfVmlkZW9TdXJmYWNlLT53LzIpOworCQkJcHQueSA9IChTRExfVmlkZW9TdXJmYWNlLT5oLzIpOworCQkJU0RMX1dpbi0+TG9jaygpOworCQkJU0RMX1dpbi0+Q29udmVydFRvU2NyZWVuKCZwdCk7CisJCQlTRExfV2luLT5VbmxvY2soKTsKKwkJCXNldF9tb3VzZV9wb3NpdGlvbigoaW50KXB0LngsIChpbnQpcHQueSk7CisJCX0KKwl9CisJcmV0dXJuKG1vZGUpOworfQorCitpbnQgQkVfR2V0V01JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKQoreworICAgIGlmIChpbmZvLT52ZXJzaW9uLm1ham9yIDw9IFNETF9NQUpPUl9WRVJTSU9OKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigiQXBwbGljYXRpb24gbm90IGNvbXBpbGVkIHdpdGggU0RMICVkLiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIFNETF9NQUpPUl9WRVJTSU9OLCBTRExfTUlOT1JfVkVSU0lPTik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK307IC8qIEV4dGVybiBDICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3dtX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzd21fYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMjg1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3dtX2MuaApAQCAtMCwwICsxLDMyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9zeXN3bS5oIgorI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgorCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgQkVfU2V0V01DYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7CitleHRlcm4gaW50IEJFX0ljb25pZnlXaW5kb3coX1RISVMpOworZXh0ZXJuIGludCBCRV9HZXRXTUluZm8oX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pOworZXh0ZXJuIFNETF9HcmFiTW9kZSBCRV9HcmFiSW5wdXQoX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzeXV2LmNjIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9id2luZG93L1NETF9zeXN5dXYuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3MWIwMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzeXV2LmNjCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBpcyB0aGUgQmVPUyB2ZXJzaW9uIG9mIFNETCBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9zeXN5dXYuaCIKKyNpbmNsdWRlICIuLi9TRExfeXV2ZnVuY3MuaCIKKworZXh0ZXJuICJDIiB7CisKKy8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBtYW5pcHVsYXRlIHNvZnR3YXJlIHZpZGVvIG92ZXJsYXlzICovCitzdGF0aWMgc3RydWN0IHByaXZhdGVfeXV2aHdmdW5jcyBiZV95dXZmdW5jcyA9Cit7CisgICAgQkVfTG9ja1lVVk92ZXJsYXksCisgICAgQkVfVW5sb2NrWVVWT3ZlcmxheSwKKyAgICBCRV9EaXNwbGF5WVVWT3ZlcmxheSwKKyAgICBCRV9GcmVlWVVWT3ZlcmxheQorfTsKKworQkJpdG1hcCAqIEJFX0dldE92ZXJsYXlCaXRtYXAoQlJlY3QgYm91bmRzLCBjb2xvcl9zcGFjZSBjcykgeworCUJCaXRtYXAgKmJiaXRtYXA7CisJYmJpdG1hcCA9IG5ldyBCQml0bWFwKGJvdW5kcyxCX0JJVE1BUF9XSUxMX09WRVJMQVksY3MpOworCWlmICghYmJpdG1hcCB8fCBiYml0bWFwLT5Jbml0Q2hlY2soKSAhPSBCX09LKSB7CisJCWRlbGV0ZSBiYml0bWFwOworCQlyZXR1cm4gMDsKKwl9CisJb3ZlcmxheV9yZXN0cmljdGlvbnMgcjsKKwliYml0bWFwLT5HZXRPdmVybGF5UmVzdHJpY3Rpb25zKCZyKTsKKwl1aW50MzIgd2lkdGggPSBib3VuZHMuSW50ZWdlcldpZHRoKCkgKyAxOworCXVpbnQzMiBoZWlnaHQgPSBib3VuZHMuSW50ZWdlckhlaWdodCgpICsgMTsKKwl1aW50MzIgd2lkdGhfcGFkZGluZyA9IDA7CisJdWludDMyIGhlaWdodF9wYWRkaW5nID0gMDsKKwlpZiAoKHIuc291cmNlLmhvcml6b250YWxfYWxpZ25tZW50ICE9IDApIHx8CisJICAgIChyLnNvdXJjZS52ZXJ0aWNhbF9hbGlnbm1lbnQgIT0gMCkpIHsKKwkJZGVsZXRlIGJiaXRtYXA7CisJCXJldHVybiAwOworCX0KKwlpZiAoci5zb3VyY2Uud2lkdGhfYWxpZ25tZW50ICE9IDApIHsKKwkJdWludDMyIGFsaWduZWRfd2lkdGggPSByLnNvdXJjZS53aWR0aF9hbGlnbm1lbnQgKyAxOworCQlpZiAod2lkdGggJSBhbGlnbmVkX3dpZHRoID4gMCkgeworCQkJd2lkdGhfcGFkZGluZyA9IGFsaWduZWRfd2lkdGggLSB3aWR0aCAlIGFsaWduZWRfd2lkdGg7CisJCX0KKwl9CisJaWYgKHIuc291cmNlLmhlaWdodF9hbGlnbm1lbnQgIT0gMCkgeworCQl1aW50MzIgYWxpZ25lZF9oZWlnaHQgPSByLnNvdXJjZS5oZWlnaHRfYWxpZ25tZW50ICsgMTsKKwkJaWYgKGhlaWdodCAlIGFsaWduZWRfaGVpZ2h0ID4gMCkgeworCQkJZnByaW50ZihzdGRlcnIsIkdldE92ZXJsYXlCaXRtYXAgZmFpbGVkIGhlaWdodCBhbGlnbm1lbnRcbiIpOworCQkJZnByaW50ZihzdGRlcnIsIi0gaGVpZ2h0ID0gJWx1LCBhbGlnbmVkX2hlaWdodCA9ICVsdVxuIixoZWlnaHQsYWxpZ25lZF9oZWlnaHQpOworCQkJZGVsZXRlIGJiaXRtYXA7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoKHIuc291cmNlLm1pbl93aWR0aCA+IHdpZHRoKSB8fAorCSAgICAoci5zb3VyY2UubWluX2hlaWdodCA+IGhlaWdodCkgfHwKKwkgICAgKHIuc291cmNlLm1heF93aWR0aCA8IHdpZHRoKSB8fAorCSAgICAoci5zb3VyY2UubWF4X2hlaWdodCA8IGhlaWdodCkpIHsKKwkJZnByaW50ZihzdGRlcnIsIkdldE92ZXJsYXlCaXRtYXAgZmFpbGVkIGJvdW5kcyB0ZXN0c1xuIik7CisJICAgIGRlbGV0ZSBiYml0bWFwOworCSAgICByZXR1cm4gMDsKKwl9CisJaWYgKCh3aWR0aF9wYWRkaW5nICE9IDApIHx8IChoZWlnaHRfcGFkZGluZyAhPSAwKSkgeworCQlkZWxldGUgYmJpdG1hcDsKKwkJYm91bmRzLlNldChib3VuZHMubGVmdCxib3VuZHMudG9wLGJvdW5kcy5yaWdodCt3aWR0aF9wYWRkaW5nLGJvdW5kcy5ib3R0b20raGVpZ2h0X3BhZGRpbmcpOworCQliYml0bWFwID0gbmV3IEJCaXRtYXAoYm91bmRzLEJfQklUTUFQX1dJTExfT1ZFUkxBWSxjcyk7CisJCWlmICghYmJpdG1hcCB8fCBiYml0bWFwLT5Jbml0Q2hlY2soKSAhPSBCX09LKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwiR2V0T3ZlcmxheUJpdG1hcCBmYWlsZWQgbGF0ZVxuIik7CisJCQlkZWxldGUgYmJpdG1hcDsKKwkJCXJldHVybiAwOworCQl9CisJfQkJCisJcmV0dXJuIGJiaXRtYXA7CSAgICAKK30KKworLy8gU2VlIDxHcmFwaGljc0RlZnMuaD4gW2J0dzogQ2I9VSwgQ3I9Vl0KKy8vIFNlZSBhbHNvIGh0dHA6Ly93d3cuZm91cmNjLm9yZy9pbmRleHl1di5odG0KK2NvbG9yX3NwYWNlIGNvbnZlcnRfY29sb3Jfc3BhY2UoVWludDMyIGZvcm1hdCkgeworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBTRExfWVYxMl9PVkVSTEFZOgorCQlyZXR1cm4gQl9ZVVY5OworCWNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKKwkJcmV0dXJuIEJfWVVWMTI7CisJY2FzZSBTRExfWVVZMl9PVkVSTEFZOgorCQlyZXR1cm4gQl9ZQ2JDcjQyMjsKKwljYXNlIFNETF9VWVZZX09WRVJMQVk6CisJCXJldHVybiBCX1lVVjQyMjsKKwljYXNlIFNETF9ZVllVX09WRVJMQVk6IC8vIG5vdCBzdXBwb3J0ZWQgb24gYmVvcz8KKwkJcmV0dXJuIEJfTk9fQ09MT1JfU1BBQ0U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEJfTk9fQ09MT1JfU1BBQ0U7CisJfQorfQorCisvLyBTZWUgU0RMX3ZpZGVvLmgKK2ludCBjb3VudF9wbGFuZXMoVWludDMyIGZvcm1hdCkgeworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBTRExfWVYxMl9PVkVSTEFZOgorCWNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKKwkJcmV0dXJuIDM7CisJY2FzZSBTRExfWVVZMl9PVkVSTEFZOgorCWNhc2UgU0RMX1VZVllfT1ZFUkxBWToKKwljYXNlIFNETF9ZVllVX09WRVJMQVk6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30JCQorCitTRExfT3ZlcmxheSAqQkVfQ3JlYXRlWVVWT3ZlcmxheShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBVaW50MzIgZm9ybWF0LCBTRExfU3VyZmFjZSAqZGlzcGxheSkgeworCVNETF9PdmVybGF5KiBvdmVybGF5OworCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSogaHdkYXRhOworCUJCaXRtYXAgKmJiaXRtYXA7CisJaW50IHBsYW5lczsKKwlCUmVjdCBib3VuZHM7CisJY29sb3Jfc3BhY2UgY3M7CisJCisJLyogZmluZCB0aGUgYXBwcm9wcmlhdGUgQmVPUyBjb2xvcnNwYWNlIGRlc2NyaXB0b3IgKi8KKwljcyA9IGNvbnZlcnRfY29sb3Jfc3BhY2UoZm9ybWF0KTsKKwlpZiAoY3MgPT0gQl9OT19DT0xPUl9TUEFDRSkKKwl7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwkvKiBjb3VudCBwbGFuZXMgKi8KKwlwbGFuZXMgPSBjb3VudF9wbGFuZXMoZm9ybWF0KTsKKwlpZiAocGxhbmVzID09IDApCisJeworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogVE9ETzogZmlndXJlIG91dCBwbGFuYXIgbW9kZXMsIGlmIGFueW9uZSBjYXJlcyAqLworCWlmIChwbGFuZXMgPT0gMykKKwl7CisJCXJldHVybiBOVUxMOworCX0KKworICAgIC8qIENyZWF0ZSB0aGUgb3ZlcmxheSBzdHJ1Y3R1cmUgKi8KKyAgICBvdmVybGF5ID0gKFNETF9PdmVybGF5KilTRExfY2FsbG9jKDEsIHNpemVvZihTRExfT3ZlcmxheSkpOworCisgICAgaWYgKG92ZXJsYXkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBGaWxsIGluIHRoZSBiYXNpYyBtZW1iZXJzICovCisgICAgb3ZlcmxheS0+Zm9ybWF0ID0gZm9ybWF0OworICAgIG92ZXJsYXktPncgPSB3aWR0aDsKKyAgICBvdmVybGF5LT5oID0gaGVpZ2h0OworICAgIG92ZXJsYXktPmh3ZGF0YSA9IE5VTEw7CisJCisgICAgLyogU2V0IHVwIHRoZSBZVVYgc3VyZmFjZSBmdW5jdGlvbiBzdHJ1Y3R1cmUgKi8KKyAgICBvdmVybGF5LT5od2Z1bmNzID0gJmJlX3l1dmZ1bmNzOworCisgICAgLyogQ3JlYXRlIHRoZSBwaXhlbCBkYXRhIGFuZCBsb29rdXAgdGFibGVzICovCisgICAgaHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSopU0RMX2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhKSk7CisKKyAgICBpZiAoaHdkYXRhID09IE5VTEwpCisgICAgeworICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBvdmVybGF5LT5od2RhdGEgPSBod2RhdGE7CisJb3ZlcmxheS0+aHdkYXRhLT5kaXNwbGF5ID0gZGlzcGxheTsKKwlvdmVybGF5LT5od2RhdGEtPmJ2aWV3ID0gTlVMTDsKKwlvdmVybGF5LT5od2RhdGEtPmJiaXRtYXAgPSBOVUxMOworCW92ZXJsYXktPmh3ZGF0YS0+bG9ja2VkID0gMDsKKworCS8qIENyZWF0ZSB0aGUgQkJpdG1hcCBmcmFtZWJ1ZmZlciAqLworCWJvdW5kcy50b3AgPSAwOwlib3VuZHMubGVmdCA9IDA7CisJYm91bmRzLnJpZ2h0ID0gd2lkdGgtMTsKKwlib3VuZHMuYm90dG9tID0gaGVpZ2h0LTE7CisJCisJQlZpZXcgKiBidmlldyA9IG5ldyBCVmlldyhib3VuZHMsIm92ZXJsYXkiLEJfRk9MTE9XX05PTkUsQl9XSUxMX0RSQVcpOyAKKwlpZiAoIWJ2aWV3KSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisgICAgICAgIHJldHVybiBOVUxMOworCX0KKwlvdmVybGF5LT5od2RhdGEtPmJ2aWV3ID0gYnZpZXc7CisJb3ZlcmxheS0+aHdkYXRhLT5maXJzdF9kaXNwbGF5ID0gdHJ1ZTsKKwlidmlldy0+SGlkZSgpOworCQorCWJiaXRtYXAgPSBCRV9HZXRPdmVybGF5Qml0bWFwKGJvdW5kcyxjcyk7CisJaWYgKCFiYml0bWFwKSB7CisJCW92ZXJsYXktPmh3ZGF0YS0+YmJpdG1hcCA9IE5VTEw7CisJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW92ZXJsYXktPmh3ZGF0YS0+YmJpdG1hcCA9IGJiaXRtYXA7CisJCisJb3ZlcmxheS0+cGxhbmVzID0gcGxhbmVzOworCW92ZXJsYXktPnBpdGNoZXMgPSAoVWludDE2KilTRExfY2FsbG9jKG92ZXJsYXktPnBsYW5lcywgc2l6ZW9mKFVpbnQxNikpOworCW92ZXJsYXktPnBpeGVscyAgPSAoVWludDgqKilTRExfY2FsbG9jKG92ZXJsYXktPnBsYW5lcywgc2l6ZW9mKFVpbnQ4KikpOworCWlmICghb3ZlcmxheS0+cGl0Y2hlcyB8fCAhb3ZlcmxheS0+cGl4ZWxzKQorCXsKKyAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICAgIFNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKworICAgCW92ZXJsYXktPnBpdGNoZXNbMF0gPSBiYml0bWFwLT5CeXRlc1BlclJvdygpOworICAgCW92ZXJsYXktPnBpeGVsc1swXSAgPSAoVWludDggKiliYml0bWFwLT5CaXRzKCk7CisJb3ZlcmxheS0+aHdfb3ZlcmxheSA9IDE7CisJCisJaWYgKFNETF9XaW4tPkxvY2tXaXRoVGltZW91dCgxMDAwMDAwKSAhPSBCX09LKSB7CisgICAgICAgIFNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKwlCVmlldyAqIHZpZXcgPSBTRExfV2luLT5WaWV3KCk7CisgICAgdmlldy0+QWRkQ2hpbGQoYnZpZXcpOworICAgIHJnYl9jb2xvciBrZXk7CisgICAgYnZpZXctPlNldFZpZXdPdmVybGF5KGJiaXRtYXAsYm91bmRzLGJ2aWV3LT5Cb3VuZHMoKSwma2V5LEJfRk9MTE9XX0FMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCX09WRVJMQVlfRklMVEVSX0hPUklaT05UQUx8Ql9PVkVSTEFZX0ZJTFRFUl9WRVJUSUNBTCk7CisgICAgYnZpZXctPlNldFZpZXdDb2xvcihrZXkpOworICAgIGJ2aWV3LT5GbHVzaCgpOworCVNETF9XaW4tPlVubG9jaygpOworCQorCWN1cnJlbnRfb3ZlcmxheT1vdmVybGF5OworICAgICAgICAKKwlyZXR1cm4gb3ZlcmxheTsKK30KKworaW50IEJFX0xvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSogb3ZlcmxheSkKK3sKKyAgICBpZiAob3ZlcmxheSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQgPSAxOworICAgIHJldHVybiAwOworfQorCit2b2lkIEJFX1VubG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5KiBvdmVybGF5KQoreworICAgIGlmIChvdmVybGF5ID09IE5VTEwpCisgICAgeworICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG92ZXJsYXktPmh3ZGF0YS0+bG9ja2VkID0gMDsKK30KKworaW50IEJFX0Rpc3BsYXlZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSogb3ZlcmxheSwgU0RMX1JlY3QqIHNyYywgU0RMX1JlY3QgKmRzdCkKK3sKKyAgICBpZiAoKG92ZXJsYXkgPT0gTlVMTCkgfHwgKG92ZXJsYXktPmh3ZGF0YT09TlVMTCkKKyAgICAgICAgfHwgKG92ZXJsYXktPmh3ZGF0YS0+YnZpZXc9PU5VTEwpIHx8IChTRExfV2luLT5WaWV3KCkgPT0gTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChTRExfV2luLT5Mb2NrV2l0aFRpbWVvdXQoNTAwMDApICE9IEJfT0spIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEJWaWV3ICogYnZpZXcgPSBvdmVybGF5LT5od2RhdGEtPmJ2aWV3OworICAgIGlmIChTRExfV2luLT5Jc0Z1bGxTY3JlZW4oKSkgeworICAgIAlpbnQgbGVmdCx0b3A7CisgICAgCVNETF9XaW4tPkdldFhZT2Zmc2V0KGxlZnQsdG9wKTsKKwkgICAgYnZpZXctPk1vdmVUbyhsZWZ0K2RzdC0+eCx0b3ArZHN0LT55KTsKKyAgICB9IGVsc2UgeworCSAgICBidmlldy0+TW92ZVRvKGRzdC0+eCxkc3QtPnkpOworICAgIH0KKyAgICBidmlldy0+UmVzaXplVG8oZHN0LT53LGRzdC0+aCk7CisgICAgYnZpZXctPkZsdXNoKCk7CisJaWYgKG92ZXJsYXktPmh3ZGF0YS0+Zmlyc3RfZGlzcGxheSkgeworCQlidmlldy0+U2hvdygpOworCQlvdmVybGF5LT5od2RhdGEtPmZpcnN0X2Rpc3BsYXkgPSBmYWxzZTsKKwl9CisgICAgU0RMX1dpbi0+VW5sb2NrKCk7CisgICAgCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgQkVfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQoreworICAgIGlmIChvdmVybGF5ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG92ZXJsYXktPmh3ZGF0YSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGN1cnJlbnRfb3ZlcmxheT1OVUxMOworCisJZGVsZXRlIG92ZXJsYXktPmh3ZGF0YS0+YmJpdG1hcDsKKworICAgIFNETF9mcmVlKG92ZXJsYXktPmh3ZGF0YSk7Cit9CisKK307IC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vYndpbmRvdy9TRExfc3lzeXV2LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3l1di5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTk2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2J3aW5kb3cvU0RMX3N5c3l1di5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisKKyNpZm5kZWYgX19TRExfU1lTX1lVVl9IX18KKyNkZWZpbmUgX19TRExfU1lTX1lVVl9IX18KKworLyogVGhpcyBpcyB0aGUgQmVPUyBpbXBsZW1lbnRhdGlvbiBvZiBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgorCitleHRlcm4gIkMiIHsKKworc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhCit7CisvKiAgRlJBTUVEQVRBKiBDdXJyZW50RnJhbWVEYXRhOworICAgIEZSQU1FREFUQSogRnJhbWVEYXRhMDsKKyAgICBGUkFNRURBVEEqIEZyYW1lRGF0YTE7CisgICAgUGdTY2FsZXJQcm9wc190ICAgcHJvcHM7CisgICAgUGdTY2FsZXJDYXBzX3QgICAgY2FwczsKKyAgICBQZ1ZpZGVvQ2hhbm5lbF90KiBjaGFubmVsOworICAgIFBoQXJlYV90IEN1cnJlbnRWaWV3UG9ydDsKKyAgICBQaFBvaW50X3QgQ3VycmVudFdpbmRvd1BvczsKKyAgICBsb25nIGZvcm1hdDsKKyAgICBpbnQgc2NhbGVyX29uOworICAgIGludCBjdXJyZW50OworICAgIGxvbmcgWVN0cmlkZTsKKyAgICBsb25nIFZTdHJpZGU7CisgICAgbG9uZyBVU3RyaWRlOworICAgIGludCBpc2Nocm9tYWtleTsKKyAgICBsb25nIGNocm9tYWtleTsKKyAgICBpbnQgZm9yY2VkcmVkcmF3OworICAgIHVuc2lnbmVkIGxvbmcgU3RhdGU7CisgICAgbG9uZyBmbGFnczsKKyovCisJU0RMX1N1cmZhY2UgKmRpc3BsYXk7CisJQlZpZXcgKmJ2aWV3OworCWJvb2wgZmlyc3RfZGlzcGxheTsKKwlCQml0bWFwICpiYml0bWFwOworICAgIGludCBsb2NrZWQ7Cit9OworCitleHRlcm4gQkJpdG1hcCAqIEJFX0dldE92ZXJsYXlCaXRtYXAoQlJlY3QgYm91bmRzLCBjb2xvcl9zcGFjZSBjcyk7CitleHRlcm4gU0RMX092ZXJsYXkqIEJFX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UqIGRpc3BsYXkpOworZXh0ZXJuIGludCBCRV9Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXkpOworZXh0ZXJuIHZvaWQgQkVfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXkpOworZXh0ZXJuIGludCBCRV9EaXNwbGF5WVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXksIFNETF9SZWN0KiBzcmMsIFNETF9SZWN0KiBkc3QpOworZXh0ZXJuIHZvaWQgQkVfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5KiBvdmVybGF5KTsKKworfTsKKworI2VuZGlmIC8qIF9fU0RMX1BIX1lVVl9IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vY2FjYS9TRExfY2FjYWV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9jYWNhL1NETF9jYWNhZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzYjFkZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vY2FjYS9TRExfY2FjYWV2ZW50cy5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisjaWZkZWYgU0FWRV9SQ1NJRAorc3RhdGljIGNoYXIgcmNzaWQgPQorICJAKCMpICRJZDogbGlic2RsLTEuMi4xMS1saWJjYWNhLnBhdGNoLHYgMS4xIDIwMDYvMDkvMTggMTY6MDY6MDYgbXJfYm9uZXNfIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGNhY2EuaD4KKyNpZmRlZiBDQUNBX0FQSV9WRVJTSU9OXzEKKyNpbmNsdWRlIDxjYWNhMC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfY2FjYXZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2NhY2FldmVudHNfYy5oIgorCit2b2lkIENhY2FfUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlpbnQgcG9zdGVkID0gMDsKKwlpbnQgZXZlbnQ7CisJU0RMX2tleXN5bSBrZXlzeW07CisKKwlpZiggISB0aGlzLT5zY3JlZW4gKSAvKiBXYWl0IHRpbGwgd2UgZ290IHRoZSBzY3JlZW4gaW5pdGlhbGlzZWQgKi8KKwkgIHJldHVybjsKKworCWRvIHsKKwkJcG9zdGVkID0gMDsKKworCQkvKiBHZXQgbGliY2FjYSBldmVudCAqLworCQlTRExfbXV0ZXhQKENhY2FfbXV0ZXgpOworCQlldmVudCA9IGNhY2FfZ2V0X2V2ZW50KENBQ0FfRVZFTlRfQU5ZKTsKKwkJU0RMX211dGV4VihDYWNhX211dGV4KTsKKworCQlpZiAoIGV2ZW50ICYgKENBQ0FfRVZFTlRfS0VZX1BSRVNTIHwgQ0FDQV9FVkVOVF9LRVlfUkVMRUFTRSkpIHsKKwkJCWludCBrZXk7CisJCQlzd2l0Y2ggKCBldmVudCAmIDB4ZmZmZmZmICkKKwkJCXsKKwkJCQljYXNlIENBQ0FfS0VZX0xFRlQ6IGtleSA9IFNETEtfTEVGVDsgYnJlYWs7CisJCQkJY2FzZSBDQUNBX0tFWV9SSUdIVDoga2V5ID0gU0RMS19SSUdIVDsgYnJlYWs7CisJCQkJY2FzZSBDQUNBX0tFWV9VUDoga2V5ID0gU0RMS19VUDsgYnJlYWs7CisJCQkJY2FzZSBDQUNBX0tFWV9ET1dOOiBrZXkgPSBTRExLX0RPV047IGJyZWFrOworCQkJCWRlZmF1bHQ6IGtleSA9IGV2ZW50ICYgMHhmZjsgYnJlYWs7CisJCQl9CisJCQkvKiBLZXkgcHJlc3NlZCAqLworLyogICAgCQlwcmludGYoIktleSBwcmVzc2VkOiAlZCAoJWMpXG4iLCBrZXksIGtleSk7ICovCisJCQlrZXlzeW0uc2NhbmNvZGUgPSBrZXk7CisJCQlrZXlzeW0uc3ltID0ga2V5OworCQkJa2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsKKwkJCWtleXN5bS51bmljb2RlID0gMDsKKwkJCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSB7CisJCQkJa2V5c3ltLnVuaWNvZGUgPSBrZXk7CisJCQl9CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZCgoZXZlbnQgJiBDQUNBX0VWRU5UX0tFWV9QUkVTUykgPyBTRExfUFJFU1NFRCA6IFNETF9SRUxFQVNFRCwgJmtleXN5bSk7CisJCX0KKwkJZWxzZSBpZiAoIGV2ZW50ICYgKENBQ0FfRVZFTlRfTU9VU0VfUFJFU1MgfCBDQUNBX0VWRU5UX01PVVNFX1JFTEVBU0UpICkgeworCQkJLyogRklYTUU6IHdlIGN1cnJlbnRseSBpZ25vcmUgdGhlIGJ1dHRvbiB0eXBlISAqLworCQkJaW50IGJ1dHRvbiA9IGV2ZW50ICYgMHgwMGZmZmZmZjsKKwkJCWlmICggYnV0dG9uID4gMyApIHsKKwkJCQlidXR0b24gPSAxOworCQkJfQorCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oKGV2ZW50ICYgQ0FDQV9FVkVOVF9NT1VTRV9QUkVTUykgPyBTRExfUFJFU1NFRCA6IFNETF9SRUxFQVNFRCwgYnV0dG9uLCAwLCAwKTsKKwkJfQorCQllbHNlIGlmICggZXZlbnQgJiBDQUNBX0VWRU5UX01PVVNFX01PVElPTiApIHsKKwkJCWludCBuZXdfeCA9IDAsIG5ld195ID0gMDsKKwkJCW5ld194ID0gKChldmVudCAmIDB4MDBmZmYwMDApID4+IDEyKSAqIENhY2FfdyAvIGNhY2FfZ2V0X3dpZHRoKCk7CisJCQluZXdfeSA9ICgoZXZlbnQgJiAweDAwMDAwZmZmKSA+PiAwKSAqIENhY2FfaCAvIGNhY2FfZ2V0X2hlaWdodCgpOworCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgbmV3X3gsIG5ld195KTsKKwkJfQorCX0gd2hpbGUgKCBwb3N0ZWQgKTsKK30KKwordm9pZCBDYWNhX0luaXRPU0tleW1hcChfVEhJUykKK3sKKyAgICByZXR1cm47Cit9CisKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9jYWNhL1NETF9jYWNhZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vY2FjYS9TRExfY2FjYWV2ZW50c19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4YzNiNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vY2FjYS9TRExfY2FjYWV2ZW50c19jLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworI2lmZGVmIFNBVkVfUkNTSUQKK3N0YXRpYyBjaGFyIHJjc2lkID0KKyAiQCgjKSAkSWQ6IGxpYnNkbC0xLjIuMTEtbGliY2FjYS5wYXRjaCx2IDEuMSAyMDA2LzA5LzE4IDE2OjA2OjA2IG1yX2JvbmVzXyBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIlNETF9jYWNhdmlkZW8uaCIKKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzLgorICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQorKi8KK2V4dGVybiB2b2lkIENhY2FfUHVtcEV2ZW50cyhfVEhJUyk7CitleHRlcm4gdm9pZCBDYWNhX0luaXRPU0tleW1hcChfVEhJUyk7CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vY2FjYS9TRExfY2FjYXZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2NhY2EvU0RMX2NhY2F2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTA3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2NhY2EvU0RMX2NhY2F2aWRlby5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMjAwMyAgU2FtIEhvY2V2YXIKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBIb2NldmFyCisgICAgc2FtQHpveS5vcmcKKyovCisKKyNpZmRlZiBTQVZFX1JDU0lECitzdGF0aWMgY2hhciByY3NpZCA9CisgIkAoIykgJElkOiBsaWJzZGwtMS4yLjExLWxpYmNhY2EucGF0Y2gsdiAxLjEgMjAwNi8wOS8xOCAxNjowNjowNiBtcl9ib25lc18gRXhwICQiOworI2VuZGlmCisKKy8qIGxpYmNhY2EgYmFzZWQgU0RMIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKworI2luY2x1ZGUgIlNETF9jYWNhdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfY2FjYWV2ZW50c19jLmgiCisKKyNpbmNsdWRlIDxjYWNhLmg+CisjaWZkZWYgQ0FDQV9BUElfVkVSU0lPTl8xCisjaW5jbHVkZSA8Y2FjYTAuaD4KKyNlbmRpZgorCisvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgQ2FjYV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipDYWNhX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgU0RMX1N1cmZhY2UgKkNhY2FfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOworc3RhdGljIHZvaWQgQ2FjYV9WaWRlb1F1aXQoX1RISVMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBDYWNhX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IENhY2FfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBDYWNhX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIENhY2FfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBDYWNhX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKKworLyogQ2FjaGUgdGhlIFZpZGVvRGV2aWNlIHN0cnVjdCAqLworc3RhdGljIHN0cnVjdCBTRExfVmlkZW9EZXZpY2UgKmxvY2FsX3RoaXM7CisKKy8qIGxpYmNhY2EgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBDYWNhX0F2YWlsYWJsZSh2b2lkKQoreworCXJldHVybiAxOyAvKiBBbHdheXMgYXZhaWxhYmxlICEgKi8KK30KKworc3RhdGljIHZvaWQgQ2FjYV9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCit7CisJZnJlZShkZXZpY2UtPmhpZGRlbik7CisJZnJlZShkZXZpY2UpOworfQorc3RhdGljIFNETF9WaWRlb0RldmljZSAqQ2FjYV9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKwlpZiAoIGRldmljZSApIHsKKwkJbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCW1hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCX0KKwlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCBkZXZpY2UgKSB7CisJCQlmcmVlKGRldmljZSk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwltZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBDYWNhX1ZpZGVvSW5pdDsKKwlkZXZpY2UtPkxpc3RNb2RlcyA9IENhY2FfTGlzdE1vZGVzOworCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gQ2FjYV9TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5DcmVhdGVZVVZPdmVybGF5ID0gTlVMTDsKKwlkZXZpY2UtPlNldENvbG9ycyA9IE5VTEw7CisJZGV2aWNlLT5VcGRhdGVSZWN0cyA9IE5VTEw7CisJZGV2aWNlLT5WaWRlb1F1aXQgPSBDYWNhX1ZpZGVvUXVpdDsKKwlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gQ2FjYV9BbGxvY0hXU3VyZmFjZTsKKwlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gTlVMTDsKKwlkZXZpY2UtPkZpbGxIV1JlY3QgPSBOVUxMOworCWRldmljZS0+U2V0SFdDb2xvcktleSA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0FscGhhID0gTlVMTDsKKwlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBDYWNhX0xvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBDYWNhX1VubG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOworCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IENhY2FfRnJlZUhXU3VyZmFjZTsKKwlkZXZpY2UtPlNldENhcHRpb24gPSBOVUxMOworCWRldmljZS0+U2V0SWNvbiA9IE5VTEw7CisJZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKKwlkZXZpY2UtPkdyYWJJbnB1dCA9IE5VTEw7CisJZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOworCWRldmljZS0+SW5pdE9TS2V5bWFwID0gQ2FjYV9Jbml0T1NLZXltYXA7CisJZGV2aWNlLT5QdW1wRXZlbnRzID0gQ2FjYV9QdW1wRXZlbnRzOworCisJZGV2aWNlLT5mcmVlID0gQ2FjYV9EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBDQUNBX2Jvb3RzdHJhcCA9IHsKKwkiY2FjYSIsICJDb2xvciBBU0NJSSBBcnQgTGlicmFyeSIsCisJQ2FjYV9BdmFpbGFibGUsIENhY2FfQ3JlYXRlRGV2aWNlCit9OworCitpbnQgQ2FjYV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZm9yICggaT0wOyBpPFNETF9OVU1NT0RFUzsgKytpICkgeworCQlTRExfbW9kZWxpc3RbaV0gPSBtYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7CisJCVNETF9tb2RlbGlzdFtpXS0+eCA9IFNETF9tb2RlbGlzdFtpXS0+eSA9IDA7CisJfQorCS8qIE1vZGVzIHNvcnRlZCBsYXJnZXN0IHRvIHNtYWxsZXN0ICovCisJU0RMX21vZGVsaXN0WzBdLT53ID0gMTAyNDsgU0RMX21vZGVsaXN0WzBdLT5oID0gNzY4OworCVNETF9tb2RlbGlzdFsxXS0+dyA9IDgwMDsgU0RMX21vZGVsaXN0WzFdLT5oID0gNjAwOworCVNETF9tb2RlbGlzdFsyXS0+dyA9IDY0MDsgU0RMX21vZGVsaXN0WzJdLT5oID0gNDgwOworCVNETF9tb2RlbGlzdFszXS0+dyA9IDMyMDsgU0RMX21vZGVsaXN0WzNdLT5oID0gNDAwOworCVNETF9tb2RlbGlzdFs0XS0+dyA9IDMyMDsgU0RMX21vZGVsaXN0WzRdLT5oID0gMjQwOworCVNETF9tb2RlbGlzdFs1XS0+dyA9IDMyMDsgU0RMX21vZGVsaXN0WzVdLT5oID0gMjAwOworCVNETF9tb2RlbGlzdFs2XSA9IE5VTEw7CisKKwlDYWNhX211dGV4ID0gU0RMX0NyZWF0ZU11dGV4KCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBsaWJyYXJ5ICovCisJaWYgKCBjYWNhX2luaXQoKSAhPSAwICkgeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBpbml0aWFsaXplIGxpYmNhY2EiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHByaXZhdGUgdmFyaWFibGVzICovCisJQ2FjYV9sYXN0a2V5ID0gMDsKKwlDYWNhX2JpdG1hcCA9IE5VTEw7CisJQ2FjYV9idWZmZXIgPSBOVUxMOworCisJbG9jYWxfdGhpcyA9IHRoaXM7CisKKwkvKiBEZXRlcm1pbmUgdGhlIHNjcmVlbiBkZXB0aCAodXNlIGRlZmF1bHQgOC1iaXQgZGVwdGgpICovCisJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gODsKKwl2Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gMTsKKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKDApOworfQorCitTRExfUmVjdCAqKkNhY2FfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworICAgICBpZihmb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSA4KQorIAkJcmV0dXJuIE5VTEw7CisKKwkgaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgeworCQkgcmV0dXJuIFNETF9tb2RlbGlzdDsKKwkgfSBlbHNlIHsKKwkJIHJldHVybiAoU0RMX1JlY3QgKiopIC0xOworCSB9Cit9CisKKy8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCitzdGF0aWMgdm9pZCBDYWNhX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCitTRExfU3VyZmFjZSAqQ2FjYV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAorCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworCWlmICggQ2FjYV9idWZmZXIgKSB7CisJCWZyZWUoIENhY2FfYnVmZmVyICk7CisJCUNhY2FfYnVmZmVyID0gTlVMTDsKKwl9CisKKwlpZiAoIENhY2FfYml0bWFwICkgeworCQljYWNhX2ZyZWVfYml0bWFwKCBDYWNhX2JpdG1hcCApOworCQlDYWNhX2JpdG1hcCA9IE5VTEw7CisJfQorCisJQ2FjYV9idWZmZXIgPSBtYWxsb2MoMiAqICgod2lkdGggKyAxNSkgJiB+MTUpICogaGVpZ2h0KTsKKwlpZiAoICEgQ2FjYV9idWZmZXIgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgYnVmZmVyIGZvciByZXF1ZXN0ZWQgbW9kZSIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJbWVtc2V0KENhY2FfYnVmZmVyLCAwLCAyICogKCh3aWR0aCArIDE1KSAmIH4xNSkgKiBoZWlnaHQpOworCisJLyogQWxsb2NhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHRoZSBzY3JlZW4gKi8KKwlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgMTYsIDB4ZjgwMCwgMHgwN2UwLCAweDAwMWYsIDApICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLworCWN1cnJlbnQtPmZsYWdzID0gU0RMX0ZVTExTQ1JFRU47CisJQ2FjYV93ID0gY3VycmVudC0+dyA9IHdpZHRoOworCUNhY2FfaCA9IGN1cnJlbnQtPmggPSBoZWlnaHQ7CisJY3VycmVudC0+cGl0Y2ggPSAyICogKCh3aWR0aCArIDE1KSAmIH4xNSk7CisJY3VycmVudC0+cGl4ZWxzID0gQ2FjYV9idWZmZXI7CisKKwkvKiBDcmVhdGUgdGhlIGxpYmNhY2EgYml0bWFwICovCisJQ2FjYV9iaXRtYXAgPSBjYWNhX2NyZWF0ZV9iaXRtYXAoIDE2LCB3aWR0aCwgaGVpZ2h0LCBjdXJyZW50LT5waXRjaCwgMHhmODAwLCAweDA3ZTAsIDB4MDAxZiwgMHgwMDAwICk7CisJaWYgKCAhIENhY2FfYml0bWFwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGFsbG9jYXRlIGxpYmNhY2EgYml0bWFwIik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBTZXQgdGhlIGJsaXQgZnVuY3Rpb24gKi8KKwl0aGlzLT5VcGRhdGVSZWN0cyA9IENhY2FfRGlyZWN0VXBkYXRlOworCisJLyogV2UncmUgZG9uZSAqLworCXJldHVybihjdXJyZW50KTsKK30KKworLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KK3N0YXRpYyBpbnQgQ2FjYV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuKC0xKTsKK30KK3N0YXRpYyB2b2lkIENhY2FfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCisvKiBXZSBuZWVkIHRvIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2Ugb24gcGFnZSBmbGlwcGVkIGRpc3BsYXlzICovCitzdGF0aWMgaW50IENhY2FfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJLyogVE9ETyA/ICovCisJcmV0dXJuKDApOworfQorc3RhdGljIHZvaWQgQ2FjYV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybjsKK30KKworLyogRklYTUU6IEhvdyBpcyB0aGlzIGRvbmUgd2l0aCBsaWJjYWNhPyAqLworc3RhdGljIGludCBDYWNhX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCVNETF9tdXRleFAoQ2FjYV9tdXRleCk7CisJY2FjYV9yZWZyZXNoKCk7CisJU0RMX211dGV4VihDYWNhX211dGV4KTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIENhY2FfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKwlTRExfbXV0ZXhQKENhY2FfbXV0ZXgpOworCWNhY2FfZHJhd19iaXRtYXAoIDAsIDAsIGNhY2FfZ2V0X3dpZHRoKCkgLSAxLCBjYWNhX2dldF9oZWlnaHQoKSAtIDEsCisJCQkgIENhY2FfYml0bWFwLCBDYWNhX2J1ZmZlciApOworCWNhY2FfcmVmcmVzaCgpOworCVNETF9tdXRleFYoQ2FjYV9tdXRleCk7CisJcmV0dXJuOworfQorCisvKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKKyAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KKyovCit2b2lkIENhY2FfVmlkZW9RdWl0KF9USElTKQoreworCWludCBpOworCisJLyogRnJlZSB2aWRlbyBtb2RlIGxpc3RzICovCisJZm9yICggaT0wOyBpPFNETF9OVU1NT0RFUzsgKytpICkgeworCQlpZiAoIFNETF9tb2RlbGlzdFtpXSAhPSBOVUxMICkgeworCQkJZnJlZShTRExfbW9kZWxpc3RbaV0pOworCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKKwkJfQorCX0KKworCWlmICggQ2FjYV9iaXRtYXAgKSB7CisJCWNhY2FfZnJlZV9iaXRtYXAoIENhY2FfYml0bWFwICk7CisJCUNhY2FfYml0bWFwID0gTlVMTDsKKwl9CisKKwljYWNhX2VuZCgpOworCisJU0RMX0Rlc3Ryb3lNdXRleChDYWNhX211dGV4KTsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9jYWNhL1NETF9jYWNhdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vY2FjYS9TRExfY2FjYXZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmY2M4MQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vY2FjYS9TRExfY2FjYXZpZGVvLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMgIFNhbSBIb2NldmFyCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gSG9jZXZhcgorICAgIHNhbUB6b3kub3JnCisqLworCisjaWZkZWYgU0FWRV9SQ1NJRAorc3RhdGljIGNoYXIgcmNzaWQgPQorICJAKCMpICRJZDogbGlic2RsLTEuMi4xMS1saWJjYWNhLnBhdGNoLHYgMS4xIDIwMDYvMDkvMTggMTY6MDY6MDYgbXJfYm9uZXNfIEV4cCAkIjsKKyNlbmRpZgorCisjaWZuZGVmIF9TRExfY2FjYXZpZGVvX2gKKyNkZWZpbmUgX1NETF9jYWNhdmlkZW9faAorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGNhY2EuaD4KKyNpZmRlZiBDQUNBX0FQSV9WRVJTSU9OXzEKKyNpbmNsdWRlIDxjYWNhMC5oPgorI2VuZGlmCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKKworI2RlZmluZSBTRExfTlVNTU9ERVMgNgorCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKKwlTRExfUmVjdCAqU0RMX21vZGVsaXN0W1NETF9OVU1NT0RFUysxXTsKKwlTRExfbXV0ZXggKm11dGV4OworCisJc3RydWN0IGNhY2FfYml0bWFwICpiaXRtYXA7CisJdm9pZCAqYnVmZmVyOworCWludCB3LCBoOworCisJaW50IGxhc3RrZXk7CisJc3RydWN0IHRpbWV2YWwgbGFzdHRpbWU7Cit9OworCisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgU0RMX21vZGVsaXN0CQkodGhpcy0+aGlkZGVuLT5TRExfbW9kZWxpc3QpCisjZGVmaW5lIENhY2FfcGFsZXR0ZQkJICAgICh0aGlzLT5oaWRkZW4tPnBhbGV0dGUpCisjZGVmaW5lIENhY2FfYml0bWFwCQkgICAgKHRoaXMtPmhpZGRlbi0+Yml0bWFwKQorI2RlZmluZSBDYWNhX2J1ZmZlcgkJICAgICh0aGlzLT5oaWRkZW4tPmJ1ZmZlcikKKworI2RlZmluZSBDYWNhX3cJCSAgICAodGhpcy0+aGlkZGVuLT53KQorI2RlZmluZSBDYWNhX2gJCSAgICAodGhpcy0+aGlkZGVuLT5oKQorCisjZGVmaW5lIENhY2FfbGFzdGtleQkJICAgICh0aGlzLT5oaWRkZW4tPmxhc3RrZXkpCisjZGVmaW5lIENhY2FfbGFzdHRpbWUJCSAgICAodGhpcy0+aGlkZGVuLT5sYXN0dGltZSkKKworI2RlZmluZSBDYWNhX211dGV4CQkgICAgKHRoaXMtPmhpZGRlbi0+bXV0ZXgpCisKKyNlbmRpZiAvKiBfU0RMX2NhY2F2aWRlb19oICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGMvU0RMX2RjZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RjL1NETF9kY2V2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZGNjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RjL1NETF9kY2V2ZW50cy5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9kY3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2RjZXZlbnRzX2MuaCIKKworI2luY2x1ZGUgPGRjL21hcGxlLmg+CisjaW5jbHVkZSA8ZGMvbWFwbGUvbW91c2UuaD4KKyNpbmNsdWRlIDxkYy9tYXBsZS9rZXlib2FyZC5oPgorCitjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2RsX2tleVtdPSB7CisJLyowKi8JMCwgMCwgMCwgMCwgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywKKwkJJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsCisJCSd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsCisJLyoxZSovCScxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcwJywKKwkvKjI4Ki8JU0RMS19SRVRVUk4sIFNETEtfRVNDQVBFLCBTRExLX0JBQ0tTUEFDRSwgU0RMS19UQUIsIFNETEtfU1BBQ0UsIFNETEtfTUlOVVMsIFNETEtfUExVUywgU0RMS19MRUZUQlJBQ0tFVCwgCisJU0RMS19SSUdIVEJSQUNLRVQsIFNETEtfQkFDS1NMQVNIICwgMCwgU0RMS19TRU1JQ09MT04sIFNETEtfUVVPVEUsCisJLyozNSovCSd+JywgU0RMS19DT01NQSwgU0RMS19QRVJJT0QsIFNETEtfU0xBU0gsIFNETEtfQ0FQU0xPQ0ssIAorCVNETEtfRjEsIFNETEtfRjIsIFNETEtfRjMsIFNETEtfRjQsIFNETEtfRjUsIFNETEtfRjYsIFNETEtfRjcsIFNETEtfRjgsIFNETEtfRjksIFNETEtfRjEwLCBTRExLX0YxMSwgU0RMS19GMTIsCisJLyo0NiovCVNETEtfUFJJTlQsIFNETEtfU0NST0xMT0NLLCBTRExLX1BBVVNFLCBTRExLX0lOU0VSVCwgU0RMS19IT01FLCBTRExLX1BBR0VVUCwgU0RMS19ERUxFVEUsIFNETEtfRU5ELCBTRExLX1BBR0VET1dOLCBTRExLX1JJR0hULCBTRExLX0xFRlQsIFNETEtfRE9XTiwgU0RMS19VUCwKKwkvKjUzKi8JU0RMS19OVU1MT0NLLCBTRExLX0tQX0RJVklERSwgU0RMS19LUF9NVUxUSVBMWSwgU0RMS19LUF9NSU5VUywgU0RMS19LUF9QTFVTLCBTRExLX0tQX0VOVEVSLCAKKwlTRExLX0tQMSwgU0RMS19LUDIsIFNETEtfS1AzLCBTRExLX0tQNCwgU0RMS19LUDUsIFNETEtfS1A2LAorCS8qNWYqLwlTRExLX0tQNywgU0RMS19LUDgsIFNETEtfS1A5LCBTRExLX0tQMCwgU0RMS19LUF9QRVJJT0QsIDAgLyogUzMgKi8KK307CisKK2NvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzZGxfc2hpZnRbXSA9IHsKKwlTRExLX0xDVFJMLFNETEtfTFNISUZULFNETEtfTEFMVCwwIC8qIFMxICovLAorCVNETEtfUkNUUkwsU0RMS19SU0hJRlQsU0RMS19SQUxULDAgLyogUzIgKi8sCit9OworCisjZGVmaW5lCU1PVVNFX1dIRUVMVVAgCSgxPDw0KQorI2RlZmluZQlNT1VTRV9XSEVFTERPV04JKDE8PDUpCisKK3N0YXRpYyB2b2lkIG1vdXNlX3VwZGF0ZSh2b2lkKQoreworY29uc3QJc3RhdGljIGNoYXIgc2RsX21vdXNlYnRuW10gPSB7CisJTU9VU0VfTEVGVEJVVFRPTiwKKwlNT1VTRV9SSUdIVEJVVFRPTiwKKwlNT1VTRV9TSURFQlVUVE9OLAorCU1PVVNFX1dIRUVMVVAsCisJTU9VU0VfV0hFRUxET1dOCit9OworCisJdWludDggYWRkcjsKKwltb3VzZV9jb25kX3QJY29uZDsKKworCXN0YXRpYyBpbnQgcHJldl9idXR0b25zOworCWludCBidXR0b25zLGNoYW5nZWQ7CisJaW50IGk7CisKKwlpZiAoKGFkZHIgPSBtYXBsZV9maXJzdF9tb3VzZSgpKT09MCB8fCBtb3VzZV9nZXRfY29uZChhZGRyLCAmY29uZCk8MCkgcmV0dXJuOworCisJYnV0dG9ucyA9IGNvbmQuYnV0dG9uc14weGZmOworCWlmIChjb25kLmR6PDApIGJ1dHRvbnN8PU1PVVNFX1dIRUVMVVA7CisJaWYgKGNvbmQuZHo+MCkgYnV0dG9uc3w9TU9VU0VfV0hFRUxET1dOOworCisJaWYgKGNvbmQuZHh8fGNvbmQuZHkpIFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwxLGNvbmQuZHgsY29uZC5keSk7CisKKwljaGFuZ2VkID0gYnV0dG9uc15wcmV2X2J1dHRvbnM7CisJZm9yKGk9MDtpPHNpemVvZihzZGxfbW91c2VidG4pO2krKykgeworCQlpZiAoY2hhbmdlZCAmIHNkbF9tb3VzZWJ0bltpXSkgeworCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigoYnV0dG9ucyAmIHNkbF9tb3VzZWJ0bltpXSk/U0RMX1BSRVNTRUQ6U0RMX1JFTEVBU0VELGksMCwwKTsKKwkJfQorCX0KKwlwcmV2X2J1dHRvbnMgPSBidXR0b25zOworfQorCitzdGF0aWMgdm9pZCBrZXlib2FyZF91cGRhdGUodm9pZCkKK3sKKwlzdGF0aWMga2JkX3N0YXRlX3QJb2xkX3N0YXRlOworCXN0YXRpYyB1aW50OCBvbGRfYWRkcjsKKworCWtiZF9zdGF0ZV90CSpzdGF0ZTsKKwl1aW50OAlhZGRyOworCWludAlwb3J0LHVuaXQ7CisKKwlpbnQgc2hpZnRrZXlzOworCVNETF9rZXlzeW0ga2V5c3ltOworCisJaW50IGk7CisKKwlhZGRyID0gbWFwbGVfZmlyc3Rfa2IoKTsKKworCWlmIChhZGRyPT0wKSByZXR1cm47CisKKwlpZiAoYWRkciE9b2xkX2FkZHIpIHsKKwkJb2xkX2FkZHIgPSBhZGRyOworCQlTRExfbWVtc2V0KCZvbGRfc3RhdGUsMCxzaXplb2Yob2xkX3N0YXRlKSk7CisJfQorCisJbWFwbGVfcmFkZHIoYWRkciwmcG9ydCwmdW5pdCk7CisKKwlzdGF0ZSA9IG1hcGxlX2Rldl9zdGF0ZShwb3J0LHVuaXQpOworCWlmICghc3RhdGUpIHJldHVybjsKKworCXNoaWZ0a2V5cyA9IHN0YXRlLT5zaGlmdF9rZXlzIF4gb2xkX3N0YXRlLnNoaWZ0X2tleXM7CisJZm9yKGk9MDtpPHNpemVvZihzZGxfc2hpZnQpO2krKykgeworCQlpZiAoKHNoaWZ0a2V5cz4+aSkmMSkgeworCQkJa2V5c3ltLnN5bSA9IHNkbF9zaGlmdFtpXTsKKwkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoKChzdGF0ZS0+c2hpZnRfa2V5cz4+aSkmMSk/U0RMX1BSRVNTRUQ6U0RMX1JFTEVBU0VELCZrZXlzeW0pOworCQl9CisJfQorCisJZm9yKGk9MDtpPHNpemVvZihzZGxfa2V5KTtpKyspIHsKKwkJaWYgKHN0YXRlLT5tYXRyaXhbaV0hPW9sZF9zdGF0ZS5tYXRyaXhbaV0pIHsKKwkJCWludCBrZXkgPSBzZGxfa2V5W2ldOworCQkJaWYgKGtleSkgeworCQkJCWtleXN5bS5zeW0gPSBrZXk7CisJCQkJU0RMX1ByaXZhdGVLZXlib2FyZChzdGF0ZS0+bWF0cml4W2ldP1NETF9QUkVTU0VEOlNETF9SRUxFQVNFRCwma2V5c3ltKTsKKwkJCX0KKwkJfQorCX0KKworCW9sZF9zdGF0ZSA9ICpzdGF0ZTsKK30KKwordm9pZCBEQ19QdW1wRXZlbnRzKF9USElTKQoreworCWtleWJvYXJkX3VwZGF0ZSgpOworCW1vdXNlX3VwZGF0ZSgpOworfQorCit2b2lkIERDX0luaXRPU0tleW1hcChfVEhJUykKK3sKKwkvKiBkbyBub3RoaW5nLiAqLworfQorCisvKiBlbmQgb2YgU0RMX2RjZXZlbnRzLmMgLi4uICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGMvU0RMX2RjZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGMvU0RMX2RjZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTk2ZWFlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kYy9TRExfZGNldmVudHNfYy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX2RjdmlkZW8uaCIKKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAorICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQorKi8KK2V4dGVybiB2b2lkIERDX0luaXRPU0tleW1hcChfVEhJUyk7CitleHRlcm4gdm9pZCBEQ19QdW1wRXZlbnRzKF9USElTKTsKKworLyogZW5kIG9mIFNETF9kY2V2ZW50c19jLmggLi4uICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGMvU0RMX2RjbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGMvU0RMX2RjbW91c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWEwYmEwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kYy9TRExfZGNtb3VzZS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKworI2luY2x1ZGUgIlNETF9kY21vdXNlX2MuaCIKKworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK3N0cnVjdCBXTWN1cnNvciB7CisJaW50IHVudXNlZDsKK307CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RjL1NETF9kY21vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGMvU0RMX2RjbW91c2VfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDE4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RjL1NETF9kY21vdXNlX2MuaApAQCAtMCwwICsxLDI2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9kY3ZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kYy9TRExfZGN2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kYy9TRExfZGN2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzhhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RjL1NETF9kY3ZpZGVvLmMKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX2RjdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfZGNldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9kY21vdXNlX2MuaCIKKworI2luY2x1ZGUgPGRjL3ZpZGVvLmg+CisjaW5jbHVkZSA8ZGMvcHZyLmg+CisKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERDX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKkRDX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgU0RMX1N1cmZhY2UgKkRDX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgRENfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKK3N0YXRpYyB2b2lkIERDX1ZpZGVvUXVpdChfVEhJUyk7CisKKy8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERDX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IERDX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIERDX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgRENfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBEQ19GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKKy8qIGV0Yy4gKi8KK3N0YXRpYyB2b2lkIERDX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKKy8qIE9wZW5HTCAqLworI2lmIFNETF9WSURFT19PUEVOR0wKK3N0YXRpYyB2b2lkICpEQ19HTF9HZXRQcm9jQWRkcmVzcyhfVEhJUywgY29uc3QgY2hhciAqcHJvYyk7CitzdGF0aWMgaW50IERDX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyBpbnQgRENfR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSk7CitzdGF0aWMgdm9pZCBEQ19HTF9Td2FwQnVmZmVycyhfVEhJUyk7CisjZW5kaWYKKworLyogREMgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBEQ19BdmFpbGFibGUodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgRENfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKwlTRExfZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpEQ19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7CisJaWYgKCBkZXZpY2UgKSB7CisJCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKKwkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCisJCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCX0KKwlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCBkZXZpY2UgKSB7CisJCQlTRExfZnJlZShkZXZpY2UpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwlkZXZpY2UtPlZpZGVvSW5pdCA9IERDX1ZpZGVvSW5pdDsKKwlkZXZpY2UtPkxpc3RNb2RlcyA9IERDX0xpc3RNb2RlczsKKwlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IERDX1NldFZpZGVvTW9kZTsKKwlkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBOVUxMOworCWRldmljZS0+U2V0Q29sb3JzID0gRENfU2V0Q29sb3JzOworCWRldmljZS0+VXBkYXRlUmVjdHMgPSBEQ19VcGRhdGVSZWN0czsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IERDX1ZpZGVvUXVpdDsKKwlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gRENfQWxsb2NIV1N1cmZhY2U7CisJZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7CisJZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOworCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7CisJZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gRENfTG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IERDX1VubG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBEQ19GbGlwSFdTdXJmYWNlOworCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IERDX0ZyZWVIV1N1cmZhY2U7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCWRldmljZS0+R0xfTG9hZExpYnJhcnkgPSBEQ19HTF9Mb2FkTGlicmFyeTsKKwlkZXZpY2UtPkdMX0dldFByb2NBZGRyZXNzID0gRENfR0xfR2V0UHJvY0FkZHJlc3M7CisJZGV2aWNlLT5HTF9HZXRBdHRyaWJ1dGUgPSBEQ19HTF9HZXRBdHRyaWJ1dGU7CisJZGV2aWNlLT5HTF9NYWtlQ3VycmVudCA9IE5VTEw7CisJZGV2aWNlLT5HTF9Td2FwQnVmZmVycyA9IERDX0dMX1N3YXBCdWZmZXJzOworI2VuZGlmCisJZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKKwlkZXZpY2UtPlNldEljb24gPSBOVUxMOworCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7CisJZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOworCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKKwlkZXZpY2UtPkluaXRPU0tleW1hcCA9IERDX0luaXRPU0tleW1hcDsKKwlkZXZpY2UtPlB1bXBFdmVudHMgPSBEQ19QdW1wRXZlbnRzOworCisJZGV2aWNlLT5mcmVlID0gRENfRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIGRldmljZTsKK30KKworVmlkZW9Cb290U3RyYXAgRENfYm9vdHN0cmFwID0geworCSJkY3ZpZGVvIiwgIkRyZWFtY2FzdCBWaWRlbyIsCisJRENfQXZhaWxhYmxlLCBEQ19DcmVhdGVEZXZpY2UKK307CisKKworaW50IERDX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQoreworCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICh1c2UgZGVmYXVsdCAxNi1iaXQgZGVwdGgpICovCisJLyogd2UgY2hhbmdlIHRoaXMgZHVyaW5nIHRoZSBTRExfU2V0VmlkZW9Nb2RlIGltcGxlbWVudGF0aW9uLi4uICovCisJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gMTY7CisJdmZvcm1hdC0+Um1hc2sgPSAweDAwMDBmODAwOworCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDdlMDsKKwl2Zm9ybWF0LT5CbWFzayA9IDB4MDAwMDAwMWY7CisKKwkvKiBXZSdyZSBkb25lISAqLworCXJldHVybigwKTsKK30KKworY29uc3Qgc3RhdGljIFNETF9SZWN0CisJUkVDVF84MDB4NjAwID0gezAsMCw4MDAsNjAwfSwKKwlSRUNUXzY0MHg0ODAgPSB7MCwwLDY0MCw0ODB9LAorCVJFQ1RfMzIweDI0MCA9IHswLDAsMzIwLDI0MH07Citjb25zdCBzdGF0aWMgU0RMX1JlY3QgKnZpZF9tb2Rlc1tdID0geworCSZSRUNUXzgwMHg2MDAsCisJJlJFQ1RfNjQweDQ4MCwKKwkmUkVDVF8zMjB4MjQwLAorCU5VTEwKK307CisKK1NETF9SZWN0ICoqRENfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCXN3aXRjaChmb3JtYXQtPkJpdHNQZXJQaXhlbCkgeworCWNhc2UgMTU6CisJY2FzZSAxNjoKKwkJcmV0dXJuICZ2aWRfbW9kZXM7CisJY2FzZSAzMjoKKwkJaWYgKCEoZmxhZ3MgJiBTRExfT1BFTkdMKSkKKwkJcmV0dXJuICZ2aWRfbW9kZXM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorLy8JcmV0dXJuIChTRExfUmVjdCAqKikgLTE7Cit9CisKK3B2cl9pbml0X3BhcmFtc190IHBhcmFtcyA9IHsKKyAgICAgICAgLyogRW5hYmxlIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgcG9seWdvbnMgd2l0aCBzaXplIDE2ICovCisgICAgICAgIHsgUFZSX0JJTlNJWkVfMTYsIFBWUl9CSU5TSVpFXzAsIFBWUl9CSU5TSVpFXzE2LCBQVlJfQklOU0laRV8wLCBQVlJfQklOU0laRV8xNiB9LAorCisgICAgICAgIC8qIFZlcnRleCBidWZmZXIgc2l6ZSAqLworICAgICAgICA1MTIqMTAyNAorfTsKKworI2lmIFNETF9WSURFT19PUEVOR0wKK3N0YXRpYyBpbnQgcHZyX2luaXRlZDsKKyNlbmRpZgorCitTRExfU3VyZmFjZSAqRENfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlpbnQgZGlzcF9tb2RlLHBpeGVsX21vZGUscGl0Y2g7CisJVWludDMyIFJtYXNrLCBHbWFzaywgQm1hc2s7CisKKwlpZiAod2lkdGg9PTMyMCAmJiBoZWlnaHQ9PTI0MCkgZGlzcF9tb2RlPURNXzMyMHgyNDA7CisJZWxzZSBpZiAod2lkdGg9PTY0MCAmJiBoZWlnaHQ9PTQ4MCkgZGlzcF9tb2RlPURNXzY0MHg0ODA7CisJZWxzZSBpZiAod2lkdGg9PTgwMCAmJiBoZWlnaHQ9PTYwMCkgZGlzcF9tb2RlPURNXzgwMHg2MDg7CisJZWxzZSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZmluZCByZXF1ZXN0ZWQgbW9kZSBpbiBsaXN0Iik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwlzd2l0Y2goYnBwKSB7CisJY2FzZSAxNTogcGl4ZWxfbW9kZSA9IFBNX1JHQjU1NTsgcGl0Y2ggPSB3aWR0aCoyOworCQkvKiA1LTUtNSAqLworCQlSbWFzayA9IDB4MDAwMDdjMDA7CisJCUdtYXNrID0gMHgwMDAwMDNlMDsKKwkJQm1hc2sgPSAweDAwMDAwMDFmOworCQlicmVhazsKKwljYXNlIDE2OiBwaXhlbF9tb2RlID0gUE1fUkdCNTY1OyBwaXRjaCA9IHdpZHRoKjI7CisJCS8qIDUtNi01ICovCisJCVJtYXNrID0gMHgwMDAwZjgwMDsKKwkJR21hc2sgPSAweDAwMDAwN2UwOworCQlCbWFzayA9IDB4MDAwMDAwMWY7CisJCWJyZWFrOworCWNhc2UgMjQ6IGJwcCA9IDMyOworCWNhc2UgMzI6IHBpeGVsX21vZGUgPSBQTV9SR0I4ODg7IHBpdGNoID0gd2lkdGgqNDsKKwkJUm1hc2sgPSAweDAwZmYwMDAwOworCQlHbWFzayA9IDB4MDAwMGZmMDA7CisJCUJtYXNrID0gMHgwMDAwMDBmZjsKKyNpZiBTRExfVklERU9fT1BFTkdMCisJCWlmICghKGZsYWdzICYgU0RMX09QRU5HTCkpCisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBmaW5kIHJlcXVlc3RlZCBtb2RlIGluIGxpc3QiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworLy8gIGlmICggYnBwICE9IGN1cnJlbnQtPmZvcm1hdC0+Qml0c1BlclBpeGVsICkgeworCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBicHAsIFJtYXNrLCBHbWFzaywgQm1hc2ssIDApICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorLy8gIH0KKworCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KKwljdXJyZW50LT5mbGFncyA9IChTRExfRlVMTFNDUkVFTnxTRExfSFdTVVJGQUNFKTsKKwljdXJyZW50LT53ID0gd2lkdGg7CisJY3VycmVudC0+aCA9IGhlaWdodDsKKwljdXJyZW50LT5waXRjaCA9IHBpdGNoOworCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCWlmIChwdnJfaW5pdGVkKSB7CisJCXB2cl9pbml0ZWQgPSAwOworCQlwdnJfc2h1dGRvd24oKTsKKwl9CisjZW5kaWYKKworCXZpZF9zZXRfbW9kZShkaXNwX21vZGUscGl4ZWxfbW9kZSk7CisKKwljdXJyZW50LT5waXhlbHMgPSB2cmFtX3M7CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisJaWYgKGZsYWdzICYgU0RMX09QRU5HTCkgeworCQl0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7CisJCWN1cnJlbnQtPmZsYWdzID0gU0RMX0ZVTExTQ1JFRU4gfCBTRExfT1BFTkdMOworCQljdXJyZW50LT5waXhlbHMgPSBOVUxMOworCQlwdnJfaW5pdGVkID0gMTsKKwkJcHZyX2luaXQoJnBhcmFtcyk7CisJCWdsS29zSW5pdCgpOworCQlnbEtvc0JlZ2luRnJhbWUoKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmIChmbGFncyB8IFNETF9ET1VCTEVCVUYpIHsKKwkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0RPVUJMRUJVRjsKKwkJY3VycmVudC0+cGl4ZWxzID0gKHZvaWQqKSgoaW50KWN1cnJlbnQtPnBpeGVscyB8IDB4NDAwMDAwKTsKKwl9CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCisvKiBXZSBkb24ndCBhY3R1YWxseSBhbGxvdyBoYXJkd2FyZSBzdXJmYWNlcyBvdGhlciB0aGFuIHRoZSBtYWluIG9uZSAqLworc3RhdGljIGludCBEQ19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuKC0xKTsKK30KK3N0YXRpYyB2b2lkIERDX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybjsKK30KKworLyogV2UgbmVlZCB0byB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlIG9uIHBhZ2UgZmxpcHBlZCBkaXNwbGF5cyAqLworc3RhdGljIGludCBEQ19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIERDX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IERDX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWlmIChzdXJmYWNlLT5mbGFncyAmIFNETF9ET1VCTEVCVUYpIHsKKwkJdmlkX3NldF9zdGFydCgoaW50KXN1cmZhY2UtPnBpeGVscyAmIDB4ZmZmZmZmKTsKKwkJc3VyZmFjZS0+cGl4ZWxzID0gKHZvaWQqKSgoaW50KXN1cmZhY2UtPnBpeGVscyBeIDB4NDAwMDAwKTsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZCBEQ19VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisJLyogZG8gbm90aGluZy4gKi8KK30KKworc3RhdGljIGludCBEQ19TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisJLyogZG8gbm90aGluZyBvZiBub3RlLiAqLworCXJldHVybigxKTsKK30KKworLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCisgICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCisqLworc3RhdGljIHZvaWQgRENfVmlkZW9RdWl0KF9USElTKQoreworI2lmIFNETF9WSURFT19PUEVOR0wKKwlpZiAocHZyX2luaXRlZCkgeworCQlwdnJfaW5pdGVkID0gMDsKKwkJcHZyX3NodXRkb3duKCk7CisJfQorI2VuZGlmCit9CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisKK3ZvaWQgZG15ZnVuYyh2b2lkKSB7fQorCit0eXBlZGVmIHZvaWQgKCpmdW5jcHRyKSgpOworY29uc3Qgc3RhdGljIHN0cnVjdCB7CisJY2hhciAqbmFtZTsKKwlmdW5jcHRyIGFkZHI7Cit9IGdsZnVuY3NbXSA9IHsKKyNkZWZpbmUJREVGKGZ1bmMpCXsjZnVuYywmZnVuY30KKwlERUYoZ2xCZWdpbiksCisJREVGKGdsQmluZFRleHR1cmUpLAorCURFRihnbEJsZW5kRnVuYyksCisJREVGKGdsQ29sb3I0ZiksCisvLwlERUYoZ2xDb3B5SW1hZ2VJRCksCisJREVGKGdsRGlzYWJsZSksCisJREVGKGdsRW5hYmxlKSwKKwlERUYoZ2xFbmQpLAorCURFRihnbEZsdXNoKSwKKwlERUYoZ2xHZW5UZXh0dXJlcyksCisJREVGKGdsR2V0U3RyaW5nKSwKKwlERUYoZ2xMb2FkSWRlbnRpdHkpLAorCURFRihnbE1hdHJpeE1vZGUpLAorCURFRihnbE9ydGhvKSwKKwlERUYoZ2xQaXhlbFN0b3JlaSksCisvLwlERUYoZ2xQb3BBdHRyaWIpLAorLy8JREVGKGdsUG9wQ2xpZW50QXR0cmliKSwKKwl7ImdsUG9wQXR0cmliIiwmZG15ZnVuY30sCisJeyJnbFBvcENsaWVudEF0dHJpYiIsJmRteWZ1bmN9LAorCURFRihnbFBvcE1hdHJpeCksCisvLwlERUYoZ2xQdXNoQXR0cmliKSwKKy8vCURFRihnbFB1c2hDbGllbnRBdHRyaWIpLAorCXsiZ2xQdXNoQXR0cmliIiwmZG15ZnVuY30sCisJeyJnbFB1c2hDbGllbnRBdHRyaWIiLCZkbXlmdW5jfSwKKwlERUYoZ2xQdXNoTWF0cml4KSwKKwlERUYoZ2xUZXhDb29yZDJmKSwKKwlERUYoZ2xUZXhFbnZmKSwKKwlERUYoZ2xUZXhJbWFnZTJEKSwKKwlERUYoZ2xUZXhQYXJhbWV0ZXJpKSwKKwlERUYoZ2xUZXhTdWJJbWFnZTJEKSwKKwlERUYoZ2xWZXJ0ZXgyaSksCisJREVGKGdsVmlld3BvcnQpLAorI3VuZGVmCURFRgorfTsKKworc3RhdGljIHZvaWQgKkRDX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyICpwcm9jKQoreworCXZvaWQgKnJldDsKKwlpbnQgaTsKKworCXJldCA9IGdsS29zR2V0UHJvY0FkZHJlc3MocHJvYyk7CisJaWYgKHJldCkgcmV0dXJuIHJldDsKKworCWZvcihpPTA7aTxzaXplb2YoZ2xmdW5jcykvc2l6ZW9mKGdsZnVuY3NbMF0pO2krKykgeworCQlpZiAoU0RMX3N0cmNtcChwcm9jLGdsZnVuY3NbaV0ubmFtZSk9PTApIHJldHVybiBnbGZ1bmNzW2ldLmFkZHI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgRENfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRENfR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSkKK3sKKwlHTGVudW0gbWVzYV9hdHRyaWI7CisJaW50IHZhbDsKKworCXN3aXRjaChhdHRyaWIpIHsKKwljYXNlIFNETF9HTF9SRURfU0laRToKKwkJdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSBTRExfR0xfR1JFRU5fU0laRToKKwkJdmFsID0gNjsKKwkJYnJlYWs7CisJY2FzZSBTRExfR0xfQkxVRV9TSVpFOgorCQl2YWwgPSA1OworCQlicmVhazsKKwljYXNlIFNETF9HTF9BTFBIQV9TSVpFOgorCQl2YWwgPSAwOworCQlicmVhazsKKwljYXNlIFNETF9HTF9ET1VCTEVCVUZGRVI6CisJCXZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgU0RMX0dMX0RFUFRIX1NJWkU6CisJCXZhbCA9IDE2OyAvKiBvciAzMj8gKi8KKwkJYnJlYWs7CisJY2FzZSBTRExfR0xfU1RFTkNJTF9TSVpFOgorCQl2YWwgPSAwOworCQlicmVhazsKKwljYXNlIFNETF9HTF9BQ0NVTV9SRURfU0laRToKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTRExfR0xfQUNDVU1fR1JFRU5fU0laRToKKwkJdmFsID0gMDsKKwljYXNlIFNETF9HTF9BQ0NVTV9CTFVFX1NJWkU6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgU0RMX0dMX0FDQ1VNX0FMUEhBX1NJWkU6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQgOgorCQlyZXR1cm4gLTE7CisJfQorCSp2YWx1ZSA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgRENfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpCit7CisJZ2xLb3NGaW5pc2hGcmFtZSgpOworCWdsS29zQmVnaW5GcmFtZSgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RjL1NETF9kY3ZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RjL1NETF9kY3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3ZjAyOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGMvU0RMX2RjdmlkZW8uaApAQCAtMCwwICsxLDQyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2RjdmlkZW9faAorI2RlZmluZSBfU0RMX2RjdmlkZW9faAorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKKworCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgeworICAgIGludCB3LCBoOworICAgIHZvaWQgKmJ1ZmZlcjsKK307CisKKyNlbmRpZiAvKiBfU0RMX2RjdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kZWZhdWx0X2N1cnNvci5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kZWZhdWx0X2N1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MzcyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RlZmF1bHRfY3Vyc29yLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAKKyAqIERlZmF1bHQgY3Vyc29yIC0gaXQgaGFwcGVucyB0byBiZSB0aGUgTWFjIGN1cnNvciwgYnV0IGNvdWxkIGJlIGFueXRoaW5nICAgKi8KKworI2RlZmluZSBERUZBVUxUX0NXSURUSAkxNgorI2RlZmluZSBERUZBVUxUX0NIRUlHSFQJMTYKKyNkZWZpbmUgREVGQVVMVF9DSE9UWAkwCisjZGVmaW5lIERFRkFVTFRfQ0hPVFkJMAorCisvKiBBZGRlZCBhIHJlYWwgTWFjT1MgY3Vyc29yLCBhdCB0aGUgcmVxdWVzdCBvZiBMdWMtT2xpdmllciBkZSBDaGFycmnocmUgKi8KKyNkZWZpbmUgVVNFX01BQ09TX0NVUlNPUgorCisjaWZkZWYgVVNFX01BQ09TX0NVUlNPUgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBkZWZhdWx0X2NkYXRhW10gPQoreworIDB4MDAsMHgwMCwKKyAweDQwLDB4MDAsCisgMHg2MCwweDAwLAorIDB4NzAsMHgwMCwKKyAweDc4LDB4MDAsCisgMHg3QywweDAwLAorIDB4N0UsMHgwMCwKKyAweDdGLDB4MDAsCisgMHg3RiwweDgwLAorIDB4N0MsMHgwMCwKKyAweDZDLDB4MDAsCisgMHg0NiwweDAwLAorIDB4MDYsMHgwMCwKKyAweDAzLDB4MDAsCisgMHgwMywweDAwLAorIDB4MDAsMHgwMAorfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRlZmF1bHRfY21hc2tbXSA9Cit7CisgMHhDMCwweDAwLAorIDB4RTAsMHgwMCwKKyAweEYwLDB4MDAsCisgMHhGOCwweDAwLAorIDB4RkMsMHgwMCwKKyAweEZFLDB4MDAsCisgMHhGRiwweDAwLAorIDB4RkYsMHg4MCwKKyAweEZGLDB4QzAsCisgMHhGRiwweEUwLAorIDB4RkUsMHgwMCwKKyAweEVGLDB4MDAsCisgMHhDRiwweDAwLAorIDB4ODcsMHg4MCwKKyAweDA3LDB4ODAsCisgMHgwMywweDAwCit9OworCisjZWxzZQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBkZWZhdWx0X2NkYXRhW10gPQoreworIDB4MDAsMHgwMCwKKyAweDQwLDB4MDAsCisgMHg2MCwweDAwLAorIDB4NzAsMHgwMCwKKyAweDc4LDB4MDAsCisgMHg3QywweDAwLAorIDB4N0UsMHgwMCwKKyAweDdGLDB4MDAsCisgMHg3RiwweDgwLAorIDB4N0MsMHgwMCwKKyAweDZDLDB4MDAsCisgMHg0NiwweDAwLAorIDB4MDYsMHgwMCwKKyAweDAzLDB4MDAsCisgMHgwMywweDAwLAorIDB4MDAsMHgwMAorfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRlZmF1bHRfY21hc2tbXSA9Cit7CisgMHg0MCwweDAwLAorIDB4RTAsMHgwMCwKKyAweEYwLDB4MDAsCisgMHhGOCwweDAwLAorIDB4RkMsMHgwMCwKKyAweEZFLDB4MDAsCisgMHhGRiwweDAwLAorIDB4RkYsMHg4MCwKKyAweEZGLDB4QzAsCisgMHhGRiwweDgwLAorIDB4RkUsMHgwMCwKKyAweEVGLDB4MDAsCisgMHg0RiwweDAwLAorIDB4MDcsMHg4MCwKKyAweDA3LDB4ODAsCisgMHgwMywweDAwCit9OworCisjZW5kaWYgLyogVFJVRV9NQUNJTlRPU0hfQ1VSU09SICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RnYS9TRExfZGdhZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RnYS9TRExfZGdhZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2ZDVmMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGdhL1NETF9kZ2FldmVudHMuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEhhbmRsZSB0aGUgZXZlbnQgc3RyZWFtLCBjb252ZXJ0aW5nIERHQSBldmVudHMgaW50byBTREwgZXZlbnRzICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSAiLi4vWGV4dC9leHRlbnNpb25zL3hmODZkZ2EuaCIKKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfZGdhdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfZGdhZXZlbnRzX2MuaCIKKworLyogZ2V0IGZ1bmN0aW9uIHBvaW50ZXJzLi4uICovCisjaW5jbHVkZSAiLi4veDExL1NETF94MTFkeW4uaCIKKworLyogSGVoZWggd2UncmUgdXNpbmcgWDExIGV2ZW50IGNvZGUgKi8KK2V4dGVybiBpbnQgWDExX1BlbmRpbmcoRGlzcGxheSAqZGlzcGxheSk7CitleHRlcm4gdm9pZCBYMTFfSW5pdEtleW1hcCh2b2lkKTsKK2V4dGVybiBTRExLZXkgWDExX1RyYW5zbGF0ZUtleWNvZGUoRGlzcGxheSAqZGlzcGxheSwgS2V5Q29kZSBrYyk7CisKK3N0YXRpYyBpbnQgREdBX0Rpc3BhdGNoRXZlbnQoX1RISVMpCit7CisJaW50IHBvc3RlZDsKKwlTRExfTkFNRShYREdBRXZlbnQpIHhldmVudDsKKworCVhOZXh0RXZlbnQoREdBX0Rpc3BsYXksIChYRXZlbnQgKikmeGV2ZW50KTsKKworCXBvc3RlZCA9IDA7CisJeGV2ZW50LnR5cGUgLT0gREdBX2V2ZW50X2Jhc2U7CisJc3dpdGNoICh4ZXZlbnQudHlwZSkgeworCisJICAgIC8qIE1vdXNlIG1vdGlvbj8gKi8KKwkgICAgY2FzZSBNb3Rpb25Ob3RpZnk6IHsKKwkJaWYgKCBTRExfVmlkZW9TdXJmYWNlICkgeworCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLAorCQkJCQl4ZXZlbnQueG1vdGlvbi5keCwgeGV2ZW50Lnhtb3Rpb24uZHkpOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgLyogTW91c2UgYnV0dG9uIHByZXNzPyAqLworCSAgICBjYXNlIEJ1dHRvblByZXNzOiB7CisJCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIAorCQkJCQl4ZXZlbnQueGJ1dHRvbi5idXR0b24sIDAsIDApOworCSAgICB9CisJICAgIGJyZWFrOworCisJICAgIC8qIE1vdXNlIGJ1dHRvbiByZWxlYXNlPyAqLworCSAgICBjYXNlIEJ1dHRvblJlbGVhc2U6IHsKKwkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIAorCQkJCQl4ZXZlbnQueGJ1dHRvbi5idXR0b24sIDAsIDApOworCSAgICB9CisJICAgIGJyZWFrOworCisJICAgIC8qIEtleSBwcmVzcz8gKi8KKwkgICAgY2FzZSBLZXlQcmVzczogeworCQlTRExfa2V5c3ltIGtleXN5bTsKKwkJS2V5Q29kZSBrZXljb2RlOworCQlYS2V5RXZlbnQgeGtleTsKKworCQlTRExfTkFNRShYREdBS2V5RXZlbnRUb1hLZXlFdmVudCkoJnhldmVudC54a2V5LCAmeGtleSk7CisJCWtleWNvZGUgPSB4a2V5LmtleWNvZGU7CisjaWZkZWYgREVCVUdfWEVWRU5UUworcHJpbnRmKCJLZXlQcmVzcyAoWDExIGtleWNvZGUgPSAweCVYKVxuIiwgeGtleS5rZXljb2RlKTsKKyNlbmRpZgorCQkvKiBHZXQgdGhlIHRyYW5zbGF0ZWQgU0RMIHZpcnR1YWwga2V5c3ltICovCisJCWtleXN5bS5zY2FuY29kZSA9IGtleWNvZGU7CisJCWtleXN5bS5zeW0gPSBYMTFfVHJhbnNsYXRlS2V5Y29kZShER0FfRGlzcGxheSwga2V5Y29kZSk7CisJCWtleXN5bS5tb2QgPSBLTU9EX05PTkU7CisJCWtleXN5bS51bmljb2RlID0gMDsKKworCQkvKiBMb29rIHVwIHRoZSB0cmFuc2xhdGVkIHZhbHVlIGZvciB0aGUga2V5IGV2ZW50ICovCisJCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSB7CisJCQlzdGF0aWMgWENvbXBvc2VTdGF0dXMgc3RhdGU7CisJCQljaGFyIGtleWJ1ZlszMl07CisKKwkJCWlmICggWExvb2t1cFN0cmluZygmeGtleSwga2V5YnVmLCBzaXplb2Yoa2V5YnVmKSwgTlVMTCwgJnN0YXRlKSApIHsKKwkJCQkvKgorCQkJCSogRklYTUU6IFhMb29rdXBTdHJpbmcoKSBtYXkgeWllbGQgbW9yZSB0aGFuIG9uZQorCQkJCSogY2hhcmFjdGVyLCBzbyB3ZSBuZWVkIGEgbWVjaGFuaXNtIHRvIGFsbG93IGZvcgorCQkJCSogdGhpcyAocGVyaGFwcyBudWxsIGtleXByZXNzIGV2ZW50cyB3aXRoIGEKKwkJCQkqIHVuaWNvZGUgdmFsdWUpCisJCQkJKi8KKwkJCQlrZXlzeW0udW5pY29kZSA9IChVaW50OClrZXlidWZbMF07CisJCQl9CisJCX0KKwkJcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgJmtleXN5bSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgLyogS2V5IHJlbGVhc2U/ICovCisJICAgIGNhc2UgS2V5UmVsZWFzZTogeworCQlTRExfa2V5c3ltIGtleXN5bTsKKwkJS2V5Q29kZSBrZXljb2RlOworCQlYS2V5RXZlbnQgeGtleTsKKworCQlTRExfTkFNRShYREdBS2V5RXZlbnRUb1hLZXlFdmVudCkoJnhldmVudC54a2V5LCAmeGtleSk7CisJCWtleWNvZGUgPSB4a2V5LmtleWNvZGU7CisjaWZkZWYgREVCVUdfWEVWRU5UUworcHJpbnRmKCJLZXlSZWxlYXNlIChYMTEga2V5Y29kZSA9IDB4JVgpXG4iLCB4a2V5LmtleWNvZGUpOworI2VuZGlmCisJCS8qIEdldCB0aGUgdHJhbnNsYXRlZCBTREwgdmlydHVhbCBrZXlzeW0gKi8KKwkJa2V5c3ltLnNjYW5jb2RlID0ga2V5Y29kZTsKKwkJa2V5c3ltLnN5bSA9IFgxMV9UcmFuc2xhdGVLZXljb2RlKERHQV9EaXNwbGF5LCBrZXljb2RlKTsKKwkJa2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsKKwkJa2V5c3ltLnVuaWNvZGUgPSAwOworCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgJmtleXN5bSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCXJldHVybihwb3N0ZWQpOworfQorCit2b2lkIERHQV9QdW1wRXZlbnRzKF9USElTKQoreworCS8qIEtlZXAgcHJvY2Vzc2luZyBwZW5kaW5nIGV2ZW50cyAqLworCUxPQ0tfRElTUExBWSgpOworCisJLyogVXBkYXRlIGFjdGl2aXR5IGV2ZXJ5IGZpdmUgc2Vjb25kcyB0byBwcmV2ZW50IHNjcmVlbnNhdmVyLiAtLXJ5YW4uICovCisJaWYgKCFhbGxvd19zY3JlZW5zYXZlcikgeworCQlzdGF0aWMgVWludDMyIHNjcmVlbnNhdmVyVGlja3M7CisJCVVpbnQzMiBub3dUaWNrcyA9IFNETF9HZXRUaWNrcygpOworCQlpZiAoKG5vd1RpY2tzIC0gc2NyZWVuc2F2ZXJUaWNrcykgPiA1MDAwKSB7CisJCQlYUmVzZXRTY3JlZW5TYXZlcihER0FfRGlzcGxheSk7CisJCQlzY3JlZW5zYXZlclRpY2tzID0gbm93VGlja3M7CisJCX0KKwl9CisKKwl3aGlsZSAoIFgxMV9QZW5kaW5nKERHQV9EaXNwbGF5KSApIHsKKwkJREdBX0Rpc3BhdGNoRXZlbnQodGhpcyk7CisJfQorCisJVU5MT0NLX0RJU1BMQVkoKTsKK30KKwordm9pZCBER0FfSW5pdE9TS2V5bWFwKF9USElTKQoreworCVgxMV9Jbml0S2V5bWFwKCk7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGdhL1NETF9kZ2FldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kZ2EvU0RMX2RnYWV2ZW50c19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmOGNjNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGdhL1NETF9kZ2FldmVudHNfYy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX2RnYXZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgREdBX1B1bXBFdmVudHMoX1RISVMpOworZXh0ZXJuIHZvaWQgREdBX0luaXRPU0tleW1hcChfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RnYS9TRExfZGdhbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGdhL1NETF9kZ2Ftb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYmM1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RnYS9TRExfZGdhbW91c2UuYwpAQCAtMCwwICsxLDM1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX2RnYXZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2RnYW1vdXNlX2MuaCIKKworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK3N0cnVjdCBXTWN1cnNvciB7CisJaW50IHVudXNlZDsKK307CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RnYS9TRExfZGdhbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kZ2EvU0RMX2RnYW1vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE4YjIxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kZ2EvU0RMX2RnYW1vdXNlX2MuaApAQCAtMCwwICsxLDI2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9kZ2F2aWRlby5oIgorCisvKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGdhL1NETF9kZ2F2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kZ2EvU0RMX2RnYXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3ZDVjYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGdhL1NETF9kZ2F2aWRlby5jCkBAIC0wLDAgKzEsMTEwMSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIERHQSAyLjAgYmFzZWQgU0RMIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMveGY4NmRnYS5oIgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9kZ2F2aWRlby5oIgorI2luY2x1ZGUgIlNETF9kZ2Ftb3VzZV9jLmgiCisjaW5jbHVkZSAiU0RMX2RnYWV2ZW50c19jLmgiCisKKy8qIGdldCBmdW5jdGlvbiBwb2ludGVycy4uLiAqLworI2luY2x1ZGUgIi4uL3gxMS9TRExfeDExZHluLmgiCisKKy8qI2RlZmluZSBER0FfREVCVUcqLworCisvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgREdBX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKkRHQV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworc3RhdGljIFNETF9TdXJmYWNlICpER0FfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOworc3RhdGljIGludCBER0FfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsCisJCQkgU0RMX0NvbG9yICpjb2xvcnMpOworc3RhdGljIGludCBER0FfU2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApOworc3RhdGljIHZvaWQgREdBX1ZpZGVvUXVpdChfVEhJUyk7CisKKy8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERHQV9Jbml0SFdTdXJmYWNlcyhfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbiwgVWludDggKmJhc2UsIGludCBzaXplKTsKK3N0YXRpYyB2b2lkIERHQV9GcmVlSFdTdXJmYWNlcyhfVEhJUyk7CitzdGF0aWMgaW50IERHQV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBER0FfRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcik7CitzdGF0aWMgaW50IERHQV9DaGVja0hXQmxpdChfVEhJUywgU0RMX1N1cmZhY2UgKnNyYywgU0RMX1N1cmZhY2UgKmRzdCk7CitzdGF0aWMgaW50IERHQV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBER0FfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBER0FfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBER0FfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKiBER0EgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBER0FfQXZhaWxhYmxlKHZvaWQpCit7CisJY29uc3QgY2hhciAqZGlzcGxheSA9IE5VTEw7CisJRGlzcGxheSAqZHB5ID0gTlVMTDsKKwlpbnQgYXZhaWxhYmxlID0gMDsKKworCS8qIFRoZSBkcml2ZXIgaXMgYXZhaWxhYmxlIGlzIGF2YWlsYWJsZSBpZiB0aGUgZGlzcGxheSBpcyBsb2NhbAorCSAgIGFuZCB0aGUgREdBIDIuMCsgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSwgYW5kIHdlIGNhbiBtYXAgbWVtLgorCSovCisJaWYgKCBTRExfWDExX0xvYWRTeW1ib2xzKCkgKSB7CisJCWlmICggKFNETF9zdHJuY21wKFhEaXNwbGF5TmFtZShkaXNwbGF5KSwgIjoiLCAxKSA9PSAwKSB8fAorCQkgICAgIChTRExfc3RybmNtcChYRGlzcGxheU5hbWUoZGlzcGxheSksICJ1bml4OiIsIDUpID09IDApICkgeworCQkJZHB5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXkpOworCQkJaWYgKCBkcHkgKSB7CisJCQkJaW50IGV2ZW50cywgZXJyb3JzLCBtYWpvciwgbWlub3I7CisKKwkJCQlpZiAoIFNETF9OQU1FKFhER0FRdWVyeUV4dGVuc2lvbikoZHB5LCAmZXZlbnRzLCAmZXJyb3JzKSAmJgorCQkJCSAgICAgU0RMX05BTUUoWERHQVF1ZXJ5VmVyc2lvbikoZHB5LCAmbWFqb3IsICZtaW5vcikgKSB7CisJCQkJCWludCBzY3JlZW47CisKKwkJCQkJc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkcHkpOworCQkJCQlpZiAoIChtYWpvciA+PSAyKSAmJiAKKwkJCQkJICAgICBTRExfTkFNRShYREdBT3BlbkZyYW1lYnVmZmVyKShkcHksIHNjcmVlbikgKSB7CisJCQkJCQlhdmFpbGFibGUgPSAxOworCQkJCQkJU0RMX05BTUUoWERHQUNsb3NlRnJhbWVidWZmZXIpKGRweSwgc2NyZWVuKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlYQ2xvc2VEaXNwbGF5KGRweSk7CisJCQl9CisJCX0KKwkJU0RMX1gxMV9VbmxvYWRTeW1ib2xzKCk7CisJfQorCXJldHVybihhdmFpbGFibGUpOworfQorCitzdGF0aWMgdm9pZCBER0FfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCWlmIChkZXZpY2UgIT0gTlVMTCkgeworCQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJCVNETF9mcmVlKGRldmljZSk7CisJCVNETF9YMTFfVW5sb2FkU3ltYm9scygpOworCX0KK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqREdBX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UgPSBOVUxMOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlpZiAoU0RMX1gxMV9Mb2FkU3ltYm9scygpKSB7CisJCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKwkJaWYgKCBkZXZpY2UgKSB7CisJCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKKwkJCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCQl9CisJCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCWlmICggZGV2aWNlICkgeworCQkJCVNETF9mcmVlKGRldmljZSk7CisJCQl9CisJCQlTRExfWDExX1VubG9hZFN5bWJvbHMoKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCisJCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwkJZGV2aWNlLT5WaWRlb0luaXQgPSBER0FfVmlkZW9Jbml0OworCQlkZXZpY2UtPkxpc3RNb2RlcyA9IERHQV9MaXN0TW9kZXM7CisJCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gREdBX1NldFZpZGVvTW9kZTsKKwkJZGV2aWNlLT5TZXRDb2xvcnMgPSBER0FfU2V0Q29sb3JzOworCQlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKKwkJZGV2aWNlLT5WaWRlb1F1aXQgPSBER0FfVmlkZW9RdWl0OworCQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gREdBX0FsbG9jSFdTdXJmYWNlOworCQlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gREdBX0NoZWNrSFdCbGl0OworCQlkZXZpY2UtPkZpbGxIV1JlY3QgPSBER0FfRmlsbEhXUmVjdDsKKwkJZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwkJZGV2aWNlLT5TZXRIV0FscGhhID0gTlVMTDsKKwkJZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gREdBX0xvY2tIV1N1cmZhY2U7CisJCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gREdBX1VubG9ja0hXU3VyZmFjZTsKKwkJZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gREdBX0ZsaXBIV1N1cmZhY2U7CisJCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IERHQV9GcmVlSFdTdXJmYWNlOworCQlkZXZpY2UtPlNldEdhbW1hUmFtcCA9IERHQV9TZXRHYW1tYVJhbXA7CisJCWRldmljZS0+R2V0R2FtbWFSYW1wID0gTlVMTDsKKwkJZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKKwkJZGV2aWNlLT5TZXRJY29uID0gTlVMTDsKKwkJZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKKwkJZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOworCQlkZXZpY2UtPkdldFdNSW5mbyA9IE5VTEw7CisJCWRldmljZS0+SW5pdE9TS2V5bWFwID0gREdBX0luaXRPU0tleW1hcDsKKwkJZGV2aWNlLT5QdW1wRXZlbnRzID0gREdBX1B1bXBFdmVudHM7CisKKwkJZGV2aWNlLT5mcmVlID0gREdBX0RlbGV0ZURldmljZTsKKwl9CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBER0FfYm9vdHN0cmFwID0geworCSJkZ2EiLCAiWEZyZWU4NiBER0EgMi4wIiwKKwlER0FfQXZhaWxhYmxlLCBER0FfQ3JlYXRlRGV2aWNlCit9OworCitzdGF0aWMgaW50IERHQV9BZGRNb2RlKF9USElTLCBpbnQgYnBwLCBpbnQgdywgaW50IGgpCit7CisJU0RMX1JlY3QgKm1vZGU7CisJaW50IGluZGV4OworCWludCBuZXh0X21vZGU7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbW9kZSAqLworCWlmICggYnBwIDwgOCApIHsgIC8qIE5vdCBzdXBwb3J0ZWQgKi8KKwkJcmV0dXJuKDApOworCX0KKwlpbmRleCA9ICgoYnBwKzcpLzgpLTE7CisJaWYgKCBTRExfbnVtbW9kZXNbaW5kZXhdID4gMCApIHsKKwkJbW9kZSA9IFNETF9tb2RlbGlzdFtpbmRleF1bU0RMX251bW1vZGVzW2luZGV4XS0xXTsKKwkJaWYgKCAobW9kZS0+dyA9PSB3KSAmJiAobW9kZS0+aCA9PSBoKSApIHsKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKworCS8qIFNldCB1cCB0aGUgbmV3IHZpZGVvIG1vZGUgcmVjdGFuZ2xlICovCisJbW9kZSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mICptb2RlKTsKKwlpZiAoIG1vZGUgPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybigtMSk7CisJfQorCW1vZGUtPnggPSAwOworCW1vZGUtPnkgPSAwOworCW1vZGUtPncgPSB3OworCW1vZGUtPmggPSBoOworCisJLyogQWxsb2NhdGUgdGhlIG5ldyBsaXN0IG9mIG1vZGVzLCBhbmQgZmlsbCBpbiB0aGUgbmV3IG1vZGUgKi8KKwluZXh0X21vZGUgPSBTRExfbnVtbW9kZXNbaW5kZXhdOworCVNETF9tb2RlbGlzdFtpbmRleF0gPSAoU0RMX1JlY3QgKiopCisJICAgICAgIFNETF9yZWFsbG9jKFNETF9tb2RlbGlzdFtpbmRleF0sICgxK25leHRfbW9kZSsxKSpzaXplb2YoU0RMX1JlY3QgKikpOworCWlmICggU0RMX21vZGVsaXN0W2luZGV4XSA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJU0RMX251bW1vZGVzW2luZGV4XSA9IDA7CisJCVNETF9mcmVlKG1vZGUpOworCQlyZXR1cm4oLTEpOworCX0KKwlTRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZV0gPSBtb2RlOworCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlKzFdID0gTlVMTDsKKwlTRExfbnVtbW9kZXNbaW5kZXhdKys7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qIFRoaXMgd2hvbGUgZnVuY3Rpb24gaXMgYSBoYWNrLiA6KSAqLworc3RhdGljIFVpbnQzMiBnZXRfdmlkZW9fc2l6ZShfVEhJUykKK3sKKwkvKiBUaGlzIGlzIGEgbm9uLWV4cG9ydGVkIGZ1bmN0aW9uIGZyb20gbGliWHhmODZkZ2EuYSAqLworCWV4dGVybiB1bnNpZ25lZCBjaGFyICpTRExfTkFNRShYREdBR2V0TWFwcGVkTWVtb3J5KShpbnQgc2NyZWVuKTsKKwlGSUxFICpwcm9jOworCXVuc2lnbmVkIGxvbmcgbWVtOworCXVuc2lnbmVkIHN0YXJ0LCBzdG9wOworCWNoYXIgbGluZVtCVUZTSVpdOworCVVpbnQzMiBzaXplOworCisJbWVtID0gKHVuc2lnbmVkIGxvbmcpU0RMX05BTUUoWERHQUdldE1hcHBlZE1lbW9yeSkoREdBX1NjcmVlbik7CisJc2l6ZSA9IDA7CisJcHJvYyA9IGZvcGVuKCIvcHJvYy9zZWxmL21hcHMiLCAiciIpOworCWlmICggcHJvYyApIHsKKwkJd2hpbGUgKCBmZ2V0cyhsaW5lLCBzaXplb2YobGluZSktMSwgcHJvYykgKSB7CisJCQlTRExfc3NjYW5mKGxpbmUsICIleC0leCIsICZzdGFydCwgJnN0b3ApOworCQkJaWYgKCBzdGFydCA9PSBtZW0gKSB7CisJCQkJc2l6ZSA9IChVaW50MzIpKChzdG9wLXN0YXJ0KS8xMDI0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmY2xvc2UocHJvYyk7CisJfQorCXJldHVybihzaXplKTsKK30KKworI2lmZGVmIERHQV9ERUJVRworc3RhdGljIHZvaWQgUHJpbnRNb2RlKFNETF9OQU1FKFhER0FNb2RlKSAqbW9kZSkKK3sKKwlwcmludGYoIk1vZGU6ICVzICglZHglZCkgYXQgJWQgYnBwICglZiByZWZyZXNoLCAlZCBwaXRjaCkgbnVtOiAlZFxuIiwKKwkJbW9kZS0+bmFtZSwKKwkJbW9kZS0+dmlld3BvcnRXaWR0aCwgbW9kZS0+dmlld3BvcnRIZWlnaHQsCisJCW1vZGUtPmRlcHRoID09IDI0ID8gbW9kZS0+Yml0c1BlclBpeGVsIDogbW9kZS0+ZGVwdGgsCisJCW1vZGUtPnZlcnRpY2FsUmVmcmVzaCwgbW9kZS0+Ynl0ZXNQZXJTY2FubGluZSwgbW9kZS0+bnVtKTsKKwlwcmludGYoIlx0UkdCOiAweCU4Ljh4IDB4JTguOHggMHglOC44eCAoJWQgLSAlcylcbiIsCisJCW1vZGUtPnJlZE1hc2ssIG1vZGUtPmdyZWVuTWFzaywgbW9kZS0+Ymx1ZU1hc2ssCisJCW1vZGUtPnZpc3VhbENsYXNzLAorCQltb2RlLT52aXN1YWxDbGFzcyA9PSBUcnVlQ29sb3IgPyAidHJ1ZWNvbG9yIiA6CisJCW1vZGUtPnZpc3VhbENsYXNzID09IERpcmVjdENvbG9yID8gImRpcmVjdGNvbG9yIiA6CisJCW1vZGUtPnZpc3VhbENsYXNzID09IFBzZXVkb0NvbG9yID8gInBzZXVkb2NvbG9yIiA6ICJ1bmtub3duIik7CisJcHJpbnRmKCJcdEZsYWdzOiAiKTsKKwlpZiAoIG1vZGUtPmZsYWdzICYgWERHQUNvbmN1cnJlbnRBY2Nlc3MgKQorCQlwcmludGYoIiBYREdBQ29uY3VycmVudEFjY2VzcyIpOworCWlmICggbW9kZS0+ZmxhZ3MgJiBYREdBU29saWRGaWxsUmVjdCApCisJCXByaW50ZigiIFhER0FTb2xpZEZpbGxSZWN0Iik7CisJaWYgKCBtb2RlLT5mbGFncyAmIFhER0FCbGl0UmVjdCApCisJCXByaW50ZigiIFhER0FCbGl0UmVjdCIpOworCWlmICggbW9kZS0+ZmxhZ3MgJiBYREdBQmxpdFRyYW5zUmVjdCApCisJCXByaW50ZigiIFhER0FCbGl0VHJhbnNSZWN0Iik7CisJaWYgKCBtb2RlLT5mbGFncyAmIFhER0FQaXhtYXAgKQorCQlwcmludGYoIiBYREdBUGl4bWFwIik7CisJaWYgKCBtb2RlLT5mbGFncyAmIFhER0FJbnRlcmxhY2VkICkKKwkJcHJpbnRmKCIgWERHQUludGVybGFjZWQiKTsKKwlpZiAoIG1vZGUtPmZsYWdzICYgWERHQURvdWJsZXNjYW4gKQorCQlwcmludGYoIiBYREdBRG91Ymxlc2NhbiIpOworCWlmICggbW9kZS0+dmlld3BvcnRGbGFncyAmIFhER0FGbGlwUmV0cmFjZSApCisJCXByaW50ZigiIFhER0FGbGlwUmV0cmFjZSIpOworCWlmICggbW9kZS0+dmlld3BvcnRGbGFncyAmIFhER0FGbGlwSW1tZWRpYXRlICkKKwkJcHJpbnRmKCIgWERHQUZsaXBJbW1lZGlhdGUiKTsKKwlwcmludGYoIlxuIik7Cit9CisjZW5kaWYgLyogREdBX0RFQlVHICovCisKK3N0YXRpYyBpbnQgY21wbW9kZXMoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQoreworICAgIGNvbnN0IFNETF9OQU1FKFhER0FNb2RlKSAqYSA9IChjb25zdCBTRExfTkFNRShYREdBTW9kZSkgKil2YTsKKyAgICBjb25zdCBTRExfTkFNRShYREdBTW9kZSkgKmIgPSAoY29uc3QgU0RMX05BTUUoWERHQU1vZGUpICopdmI7CisKKyAgICBpZiAoIChhLT52aWV3cG9ydFdpZHRoID09IGItPnZpZXdwb3J0V2lkdGgpICYmCisgICAgICAgICAoYi0+dmlld3BvcnRIZWlnaHQgPT0gYS0+dmlld3BvcnRIZWlnaHQpICkgeworICAgICAgICAvKiBQcmVmZXIgMzIgYnBwIG92ZXIgMjQgYnBwLCAxNiBicHAgb3ZlciAxNSBicHAgKi8KKyAgICAgICAgaW50IGFfYnBwID0gYS0+ZGVwdGggPT0gMjQgPyBhLT5iaXRzUGVyUGl4ZWwgOiBhLT5kZXB0aDsKKyAgICAgICAgaW50IGJfYnBwID0gYi0+ZGVwdGggPT0gMjQgPyBiLT5iaXRzUGVyUGl4ZWwgOiBiLT5kZXB0aDsKKyAgICAgICAgaWYgKCBhX2JwcCAhPSBiX2JwcCApIHsKKyAgICAgICAgICAgIHJldHVybiBiX2JwcCAtIGFfYnBwOworICAgICAgICB9CisgICAgICAgIC8qIFByZWZlciBEaXJlY3RDb2xvciB2aXN1YWxzLCBmb3IgZ2FtbWEgc3VwcG9ydCAqLworICAgICAgICBpZiAoIGEtPnZpc3VhbENsYXNzID09IERpcmVjdENvbG9yICYmIGItPnZpc3VhbENsYXNzICE9IERpcmVjdENvbG9yICkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKCBiLT52aXN1YWxDbGFzcyA9PSBEaXJlY3RDb2xvciAmJiBhLT52aXN1YWxDbGFzcyAhPSBEaXJlY3RDb2xvciApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgLyogTWFpbnRhaW4gc2VydmVyIHJlZnJlc2ggcmF0ZSBzb3J0aW5nICovCisgICAgICAgIHJldHVybiBhLT5udW0gLSBiLT5udW07CisgICAgfSBlbHNlIGlmICggYS0+dmlld3BvcnRXaWR0aCA9PSBiLT52aWV3cG9ydFdpZHRoICkgeworICAgICAgICByZXR1cm4gYi0+dmlld3BvcnRIZWlnaHQgLSBhLT52aWV3cG9ydEhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYi0+dmlld3BvcnRXaWR0aCAtIGEtPnZpZXdwb3J0V2lkdGg7CisgICAgfQorfQorc3RhdGljIHZvaWQgVXBkYXRlSFdJbmZvKF9USElTLCBTRExfTkFNRShYREdBTW9kZSkgKm1vZGUpCit7CisJdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAwOworCXRoaXMtPmluZm8uaHdfYXZhaWxhYmxlID0gMTsKKwlpZiAoIG1vZGUtPmZsYWdzICYgWERHQUJsaXRSZWN0ICkgeworCQl0aGlzLT5pbmZvLmJsaXRfaHcgPSAxOworCX0gZWxzZSB7CisJCXRoaXMtPmluZm8uYmxpdF9odyA9IDA7CisJfQorCWlmICggbW9kZS0+ZmxhZ3MgJiBYREdBQmxpdFRyYW5zUmVjdCApIHsKKwkJdGhpcy0+aW5mby5ibGl0X2h3X0NDID0gMTsKKwl9IGVsc2UgeworCQl0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgPSAwOworCX0KKwlpZiAoIG1vZGUtPmZsYWdzICYgWERHQVNvbGlkRmlsbFJlY3QgKSB7CisJCXRoaXMtPmluZm8uYmxpdF9maWxsID0gMTsKKwl9IGVsc2UgeworCQl0aGlzLT5pbmZvLmJsaXRfZmlsbCA9IDA7CisJfQorCXRoaXMtPmluZm8udmlkZW9fbWVtID0gZ2V0X3ZpZGVvX3NpemUodGhpcyk7Cit9CisKK3N0YXRpYyBpbnQgREdBX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQoreworCWNvbnN0IGNoYXIgKmVudjsKKwljb25zdCBjaGFyICpkaXNwbGF5OworCWludCBldmVudF9iYXNlLCBlcnJvcl9iYXNlOworCWludCBtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uOworCVZpc3VhbCAqdmlzdWFsOworCVNETF9OQU1FKFhER0FNb2RlKSAqbW9kZXM7CisJaW50IGksIG51bV9tb2RlczsKKworCS8qIE9wZW4gdGhlIFgxMSBkaXNwbGF5ICovCisJZGlzcGxheSA9IE5VTEw7CQkvKiBHZXQgaXQgZnJvbSBESVNQTEFZIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKwlER0FfRGlzcGxheSA9IFhPcGVuRGlzcGxheShkaXNwbGF5KTsKKwlpZiAoIERHQV9EaXNwbGF5ID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiBYMTEgZGlzcGxheSIpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIENoZWNrIGZvciB0aGUgREdBIGV4dGVuc2lvbiAqLworCWlmICggISBTRExfTkFNRShYREdBUXVlcnlFeHRlbnNpb24pKERHQV9EaXNwbGF5LCAmZXZlbnRfYmFzZSwgJmVycm9yX2Jhc2UpIHx8CisJICAgICAhIFNETF9OQU1FKFhER0FRdWVyeVZlcnNpb24pKERHQV9EaXNwbGF5LCAmbWFqb3JfdmVyc2lvbiwgJm1pbm9yX3ZlcnNpb24pICkgeworCQlTRExfU2V0RXJyb3IoIkRHQSBleHRlbnNpb24gbm90IGF2YWlsYWJsZSIpOworCQlYQ2xvc2VEaXNwbGF5KERHQV9EaXNwbGF5KTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJaWYgKCBtYWpvcl92ZXJzaW9uIDwgMiApIHsKKwkJU0RMX1NldEVycm9yKCJER0EgZHJpdmVyIHJlcXVpcmVzIERHQSAyLjAgb3IgbmV3ZXIiKTsKKwkJWENsb3NlRGlzcGxheShER0FfRGlzcGxheSk7CisJCXJldHVybigtMSk7CisJfQorCURHQV9ldmVudF9iYXNlID0gZXZlbnRfYmFzZTsKKworCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLworCXRoaXMtPmluZm8uY3VycmVudF93ID0gRGlzcGxheVdpZHRoKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuKTsKKwl0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IERpc3BsYXlIZWlnaHQoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4pOworCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBkZXB0aCAqLworCXZpc3VhbCA9IERlZmF1bHRWaXN1YWwoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4pOworCXsKKwkJWFBpeG1hcEZvcm1hdFZhbHVlcyAqcGl4X2Zvcm1hdDsKKwkJaW50IGksIG51bV9mb3JtYXRzOworCisJCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IERlZmF1bHREZXB0aChER0FfRGlzcGxheSwgREdBX1NjcmVlbik7CisJCXBpeF9mb3JtYXQgPSBYTGlzdFBpeG1hcEZvcm1hdHMoREdBX0Rpc3BsYXksICZudW1fZm9ybWF0cyk7CisJCWlmICggcGl4X2Zvcm1hdCA9PSBOVUxMICkgeworCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBkZXRlcm1pbmUgc2NyZWVuIGZvcm1hdHMiKTsKKwkJCVhDbG9zZURpc3BsYXkoREdBX0Rpc3BsYXkpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlmb3IgKCBpPTA7IGk8bnVtX2Zvcm1hdHM7ICsraSApIHsKKwkJCWlmICggdmZvcm1hdC0+Qml0c1BlclBpeGVsID09IHBpeF9mb3JtYXRbaV0uZGVwdGggKQorCQkJCWJyZWFrOworCQl9CisJCWlmICggaSAhPSBudW1fZm9ybWF0cyApCisJCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBwaXhfZm9ybWF0W2ldLmJpdHNfcGVyX3BpeGVsOworCQlYRnJlZSgoY2hhciAqKXBpeF9mb3JtYXQpOworCX0KKwlpZiAoIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCA+IDggKSB7CisJCXZmb3JtYXQtPlJtYXNrID0gdmlzdWFsLT5yZWRfbWFzazsKKwkJdmZvcm1hdC0+R21hc2sgPSB2aXN1YWwtPmdyZWVuX21hc2s7CisJCXZmb3JtYXQtPkJtYXNrID0gdmlzdWFsLT5ibHVlX21hc2s7CisJfQorCisJLyogT3BlbiBhY2Nlc3MgdG8gdGhlIGZyYW1lYnVmZmVyICovCisJaWYgKCAhIFNETF9OQU1FKFhER0FPcGVuRnJhbWVidWZmZXIpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuKSApIHsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gbWFwIHRoZSB2aWRlbyBtZW1vcnkiKTsKKwkJWENsb3NlRGlzcGxheShER0FfRGlzcGxheSk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogQWxsb3cgZW52aXJvbm1lbnQgb3ZlcnJpZGUgb2Ygc2NyZWVuc2F2ZXIgZGlzYWJsZS4gKi8KKwllbnYgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fQUxMT1dfU0NSRUVOU0FWRVIiKTsKKwlpZiAoIGVudiApIHsKKwkJYWxsb3dfc2NyZWVuc2F2ZXIgPSBTRExfYXRvaShlbnYpOworCX0gZWxzZSB7CisjaWZkZWYgU0RMX1ZJREVPX0RJU0FCTEVfU0NSRUVOU0FWRVIKKwkJYWxsb3dfc2NyZWVuc2F2ZXIgPSAwOworI2Vsc2UKKwkJYWxsb3dfc2NyZWVuc2F2ZXIgPSAxOworI2VuZGlmCisJfQorCisJLyogUXVlcnkgZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB2aWRlbyBtb2RlcyAqLworCW1vZGVzID0gU0RMX05BTUUoWERHQVF1ZXJ5TW9kZXMpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuLCAmbnVtX21vZGVzKTsKKwlTRExfcXNvcnQobW9kZXMsIG51bV9tb2Rlcywgc2l6ZW9mICptb2RlcywgY21wbW9kZXMpOworCWZvciAoIGk9MDsgaTxudW1fbW9kZXM7ICsraSApIHsKKwkJaWYgKCAoKG1vZGVzW2ldLnZpc3VhbENsYXNzID09IFBzZXVkb0NvbG9yKSB8fAorCQkgICAgICAobW9kZXNbaV0udmlzdWFsQ2xhc3MgPT0gRGlyZWN0Q29sb3IpIHx8CisJCSAgICAgIChtb2Rlc1tpXS52aXN1YWxDbGFzcyA9PSBUcnVlQ29sb3IpKSAmJiAKKwkJICAgICAhKG1vZGVzW2ldLmZsYWdzICYgKFhER0FJbnRlcmxhY2VkfFhER0FEb3VibGVzY2FuKSkgKSB7CisjaWZkZWYgREdBX0RFQlVHCisJCQlQcmludE1vZGUoJm1vZGVzW2ldKTsKKyNlbmRpZgorCQkJREdBX0FkZE1vZGUodGhpcywgbW9kZXNbaV0uYml0c1BlclBpeGVsLAorCQkJICAgICAgICAgICAgbW9kZXNbaV0udmlld3BvcnRXaWR0aCwKKwkJCSAgICAgICAgICAgIG1vZGVzW2ldLnZpZXdwb3J0SGVpZ2h0KTsKKwkJfQorCX0KKwlVcGRhdGVIV0luZm8odGhpcywgbW9kZXMpOworCVhGcmVlKG1vZGVzKTsKKworCS8qIENyZWF0ZSB0aGUgaGFyZHdhcmUgc3VyZmFjZSBsb2NrIG11dGV4ICovCisJaHdfbG9jayA9IFNETF9DcmVhdGVNdXRleCgpOworCWlmICggaHdfbG9jayA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgbG9jayBtdXRleCIpOworCQlER0FfVmlkZW9RdWl0KHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKworI2lmZGVmIExPQ0tfREdBX0RJU1BMQVkKKwkvKiBDcmVhdGUgdGhlIGV2ZW50IGxvY2sgc28gd2UncmUgdGhyZWFkLXNhZmUuLiA6LS8gKi8KKwlldmVudF9sb2NrID0gU0RMX0NyZWF0ZU11dGV4KCk7CisjZW5kaWYgLyogTE9DS19ER0FfRElTUExBWSAqLworCisJLyogV2UncmUgZG9uZSEgKi8KKwlyZXR1cm4oMCk7Cit9CisKK1NETF9SZWN0ICoqREdBX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKwlyZXR1cm4oU0RMX21vZGVsaXN0WygoZm9ybWF0LT5CaXRzUGVyUGl4ZWwrNykvOCktMV0pOworfQorCisvKiBWYXJpb3VzIHNjcmVlbiB1cGRhdGUgZnVuY3Rpb25zIGF2YWlsYWJsZSAqLworc3RhdGljIHZvaWQgREdBX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCitTRExfU3VyZmFjZSAqREdBX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisJU0RMX05BTUUoWERHQU1vZGUpICptb2RlczsKKwlpbnQgaSwgbnVtX21vZGVzOworCVNETF9OQU1FKFhER0FEZXZpY2UpICptb2RlOworCWludCBzY3JlZW5fbGVuOworCVVpbnQ4ICpzdXJmYWNlc19tZW07CisJaW50IHN1cmZhY2VzX2xlbjsKKworCS8qIEZyZWUgYW55IHByZXZpb3VzIGNvbG9ybWFwICovCisJaWYgKCBER0FfY29sb3JtYXAgKSB7CisJCVhGcmVlQ29sb3JtYXAoREdBX0Rpc3BsYXksIERHQV9jb2xvcm1hcCk7CisJCURHQV9jb2xvcm1hcCA9IDA7CisJfQorCisJLyogU2VhcmNoIGZvciBhIG1hdGNoaW5nIHZpZGVvIG1vZGUgKi8KKwltb2RlcyA9IFNETF9OQU1FKFhER0FRdWVyeU1vZGVzKShER0FfRGlzcGxheSwgREdBX1NjcmVlbiwgJm51bV9tb2Rlcyk7CisJU0RMX3Fzb3J0KG1vZGVzLCBudW1fbW9kZXMsIHNpemVvZiAqbW9kZXMsIGNtcG1vZGVzKTsKKwlmb3IgKCBpPTA7IGk8bnVtX21vZGVzOyArK2kgKSB7CisJCWludCBkZXB0aDsKKworCQlkZXB0aCA9IG1vZGVzW2ldLmRlcHRoOworCQlpZiAoIGRlcHRoID09IDI0ICkgeyAvKiBEaXN0aW5ndWlzaCBiZXR3ZWVuIDI0IGFuZCAzMiBicHAgKi8KKwkJCWRlcHRoID0gbW9kZXNbaV0uYml0c1BlclBpeGVsOworCQl9CisJCWlmICggKGRlcHRoID09IGJwcCkgJiYKKwkJICAgICAobW9kZXNbaV0udmlld3BvcnRXaWR0aCA9PSB3aWR0aCkgJiYKKwkJICAgICAobW9kZXNbaV0udmlld3BvcnRIZWlnaHQgPT0gaGVpZ2h0KSAmJgorCQkgICAgICgobW9kZXNbaV0udmlzdWFsQ2xhc3MgPT0gUHNldWRvQ29sb3IpIHx8CisJCSAgICAgIChtb2Rlc1tpXS52aXN1YWxDbGFzcyA9PSBEaXJlY3RDb2xvcikgfHwKKwkJICAgICAgKG1vZGVzW2ldLnZpc3VhbENsYXNzID09IFRydWVDb2xvcikpICYmCisJCSAgICAgIShtb2Rlc1tpXS5mbGFncyAmIChYREdBSW50ZXJsYWNlZHxYREdBRG91Ymxlc2NhbikpICkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCBpID09IG51bV9tb2RlcyApIHsKKwkJU0RMX1NldEVycm9yKCJObyBtYXRjaGluZyB2aWRlbyBtb2RlIGZvdW5kIik7CisJCXJldHVybihOVUxMKTsKKwl9CisjaWZkZWYgREdBX0RFQlVHCisJUHJpbnRNb2RlKCZtb2Rlc1tpXSk7CisjZW5kaWYKKworCS8qIFNldCB0aGUgdmlkZW8gbW9kZSAqLworCW1vZGUgPSBTRExfTkFNRShYREdBU2V0TW9kZSkoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sIG1vZGVzW2ldLm51bSk7CisJWEZyZWUobW9kZXMpOworCWlmICggbW9kZSA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBzd2l0Y2ggdG8gcmVxdWVzdGVkIG1vZGUiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlER0FfdmlzdWFsQ2xhc3MgPSBtb2RlLT5tb2RlLnZpc3VhbENsYXNzOworCW1lbW9yeV9iYXNlID0gKFVpbnQ4ICopbW9kZS0+ZGF0YTsKKwltZW1vcnlfcGl0Y2ggPSBtb2RlLT5tb2RlLmJ5dGVzUGVyU2NhbmxpbmU7CisKKwkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCisJY3VycmVudC0+ZmxhZ3MgPSAoU0RMX0ZVTExTQ1JFRU58U0RMX0hXU1VSRkFDRSk7CisJY3VycmVudC0+dyA9IG1vZGUtPm1vZGUudmlld3BvcnRXaWR0aDsKKwljdXJyZW50LT5oID0gbW9kZS0+bW9kZS52aWV3cG9ydEhlaWdodDsKKwljdXJyZW50LT5waXRjaCA9IG1lbW9yeV9waXRjaDsKKwljdXJyZW50LT5waXhlbHMgPSBtZW1vcnlfYmFzZTsKKwlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgbW9kZS0+bW9kZS5iaXRzUGVyUGl4ZWwsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUtPm1vZGUucmVkTWFzaywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS0+bW9kZS5ncmVlbk1hc2ssCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUtPm1vZGUuYmx1ZU1hc2ssIDApICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorCXNjcmVlbl9sZW4gPSBjdXJyZW50LT5oKmN1cnJlbnQtPnBpdGNoOworCisJLyogQ3JlYXRlIGEgY29sb3JtYXAgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCAoREdBX3Zpc3VhbENsYXNzID09IFBzZXVkb0NvbG9yKSB8fAorICAgICAgICAgICAgIChER0FfdmlzdWFsQ2xhc3MgPT0gRGlyZWN0Q29sb3IpICkgeworCQlER0FfY29sb3JtYXAgPSBTRExfTkFNRShYREdBQ3JlYXRlQ29sb3JtYXApKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuLAorCQkJCQkJCW1vZGUsIEFsbG9jQWxsKTsKKwkJaWYgKCBER0FfdmlzdWFsQ2xhc3MgPT0gUHNldWRvQ29sb3IgKSB7CisJCQljdXJyZW50LT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOworCQl9IGVsc2UgeworCSAgICAJCS8qIEluaXRpYWxpemUgdGhlIGNvbG9ybWFwIHRvIHRoZSBpZGVudGl0eSBtYXBwaW5nICovCisJICAgIAkJU0RMX0dldEdhbW1hUmFtcCgwLCAwLCAwKTsKKwkgICAgCQl0aGlzLT5zY3JlZW4gPSBjdXJyZW50OworCSAgICAJCURHQV9TZXRHYW1tYVJhbXAodGhpcywgdGhpcy0+Z2FtbWEpOworCQkJdGhpcy0+c2NyZWVuID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCURHQV9jb2xvcm1hcCA9IFNETF9OQU1FKFhER0FDcmVhdGVDb2xvcm1hcCkoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sCisJCQkJCQkJbW9kZSwgQWxsb2NOb25lKTsKKwl9CisJU0RMX05BTUUoWERHQUluc3RhbGxDb2xvcm1hcCkoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sIERHQV9jb2xvcm1hcCk7CisKKwkvKiBVcGRhdGUgdGhlIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAqLworCVVwZGF0ZUhXSW5mbyh0aGlzLCAmbW9kZS0+bW9kZSk7CisKKwkvKiBTZXQgdXAgdGhlIGluZm9ybWF0aW9uIGZvciBoYXJkd2FyZSBzdXJmYWNlcyAqLworCXN1cmZhY2VzX21lbSA9IChVaW50OCAqKWN1cnJlbnQtPnBpeGVscyArIHNjcmVlbl9sZW47CisJc3VyZmFjZXNfbGVuID0gKG1vZGUtPm1vZGUuaW1hZ2VIZWlnaHQqY3VycmVudC0+cGl0Y2ggLSBzY3JlZW5fbGVuKTsKKworCS8qIFVwZGF0ZSBmb3IgZG91YmxlLWJ1ZmZlcmluZywgaWYgd2UgY2FuICovCisJU0RMX05BTUUoWERHQVNldFZpZXdwb3J0KShER0FfRGlzcGxheSwgREdBX1NjcmVlbiwgMCwgMCwgWERHQUZsaXBSZXRyYWNlKTsKKwlpZiAoIGZsYWdzICYgU0RMX0RPVUJMRUJVRiApIHsKKwkJaWYgKCBtb2RlLT5tb2RlLmltYWdlSGVpZ2h0ID49IChjdXJyZW50LT5oKjIpICkgeworCQkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0RPVUJMRUJVRjsKKwkJCWZsaXBfcGFnZSA9IDA7CisJCQlmbGlwX3lvZmZzZXRbMF0gPSAwOworCQkJZmxpcF95b2Zmc2V0WzFdID0gY3VycmVudC0+aDsKKwkJCWZsaXBfYWRkcmVzc1swXSA9IG1lbW9yeV9iYXNlOworCQkJZmxpcF9hZGRyZXNzWzFdID0gbWVtb3J5X2Jhc2Urc2NyZWVuX2xlbjsKKwkJCXN1cmZhY2VzX21lbSArPSBzY3JlZW5fbGVuOworCQkJc3VyZmFjZXNfbGVuIC09IHNjcmVlbl9sZW47CisJCX0KKwl9CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgdHJhY2tpbmcgZm9yIGhhcmR3YXJlIHN1cmZhY2VzICovCisJREdBX0ZyZWVIV1N1cmZhY2VzKHRoaXMpOworCWlmICggc3VyZmFjZXNfbGVuIDwgMCApIHsKKwkJc3VyZmFjZXNfbGVuID0gMDsKKwl9CisJREdBX0luaXRIV1N1cmZhY2VzKHRoaXMsIGN1cnJlbnQsIHN1cmZhY2VzX21lbSwgc3VyZmFjZXNfbGVuKTsKKworCS8qIEV4cG9zZSB0aGUgYmFjayBidWZmZXIgYXMgc3VyZmFjZSBtZW1vcnkgKi8KKwlpZiAoIGN1cnJlbnQtPmZsYWdzICYgU0RMX0RPVUJMRUJVRiApIHsKKwkJdGhpcy0+c2NyZWVuID0gY3VycmVudDsKKwkJREdBX0ZsaXBIV1N1cmZhY2UodGhpcywgY3VycmVudCk7CisJCXRoaXMtPnNjcmVlbiA9IE5VTEw7CisJfQorCisJLyogU2V0IHRoZSB1cGRhdGUgcmVjdGFuZ2xlIGZ1bmN0aW9uICovCisJdGhpcy0+VXBkYXRlUmVjdHMgPSBER0FfRGlyZWN0VXBkYXRlOworCisJLyogRW5hYmxlIG1vdXNlIGFuZCBrZXlib2FyZCBzdXBwb3J0ICovCisJeyBsb25nIGlucHV0X21hc2s7CisJICBpbnB1dF9tYXNrID0gKEtleVByZXNzTWFzayB8IEtleVJlbGVhc2VNYXNrKTsKKwkgIGlucHV0X21hc2sgfD0gKEJ1dHRvblByZXNzTWFzayB8IEJ1dHRvblJlbGVhc2VNYXNrKTsKKwkgIGlucHV0X21hc2sgfD0gUG9pbnRlck1vdGlvbk1hc2s7CisJICBTRExfTkFNRShYREdBU2VsZWN0SW5wdXQpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuLCBpbnB1dF9tYXNrKTsKKwl9CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCisjaWZkZWYgREdBX0RFQlVHCitzdGF0aWMgdm9pZCBER0FfRHVtcEhXU3VyZmFjZXMoX1RISVMpCit7CisJdmlkbWVtX2J1Y2tldCAqYnVja2V0OworCisJcHJpbnRmKCJNZW1vcnkgbGVmdDogJWQgKCVkIHRvdGFsKVxuIiwgc3VyZmFjZXNfbWVtbGVmdCwgc3VyZmFjZXNfbWVtdG90YWwpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoIiAgICAgICAgIEJhc2UgIFNpemVcbiIpOworCWZvciAoIGJ1Y2tldD0mc3VyZmFjZXM7IGJ1Y2tldDsgYnVja2V0PWJ1Y2tldC0+bmV4dCApIHsKKwkJcHJpbnRmKCJCdWNrZXQ6ICAlcCwgJWQgKCVzKVxuIiwgYnVja2V0LT5iYXNlLCBidWNrZXQtPnNpemUsIGJ1Y2tldC0+dXNlZCA/ICJ1c2VkIiA6ICJmcmVlIik7CisJCWlmICggYnVja2V0LT5wcmV2ICkgeworCQkJaWYgKCBidWNrZXQtPmJhc2UgIT0gYnVja2V0LT5wcmV2LT5iYXNlK2J1Y2tldC0+cHJldi0+c2l6ZSApIHsKKwkJCQlwcmludGYoIldhcm5pbmcsIGNvcnJ1cHQgYnVja2V0IGxpc3QhIChwcmV2KVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIGJ1Y2tldCAhPSAmc3VyZmFjZXMgKSB7CisJCQkJcHJpbnRmKCJXYXJuaW5nLCBjb3JydXB0IGJ1Y2tldCBsaXN0ISAoIXByZXYpXG4iKTsKKwkJCX0KKwkJfQorCQlpZiAoIGJ1Y2tldC0+bmV4dCApIHsKKwkJCWlmICggYnVja2V0LT5uZXh0LT5iYXNlICE9IGJ1Y2tldC0+YmFzZStidWNrZXQtPnNpemUgKSB7CisJCQkJcHJpbnRmKCJXYXJuaW5nLCBjb3JydXB0IGJ1Y2tldCBsaXN0ISAobmV4dClcbiIpOworCQkJfQorCQl9CisJfQorCXByaW50ZigiXG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IERHQV9Jbml0SFdTdXJmYWNlcyhfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbiwgVWludDggKmJhc2UsIGludCBzaXplKQoreworCXZpZG1lbV9idWNrZXQgKmJ1Y2tldDsKKworCXN1cmZhY2VzX21lbXRvdGFsID0gc2l6ZTsKKwlzdXJmYWNlc19tZW1sZWZ0ID0gc2l6ZTsKKworCWlmICggc3VyZmFjZXNfbWVtbGVmdCA+IDAgKSB7CisJCWJ1Y2tldCA9ICh2aWRtZW1fYnVja2V0ICopU0RMX21hbGxvYyhzaXplb2YoKmJ1Y2tldCkpOworCQlpZiAoIGJ1Y2tldCA9PSBOVUxMICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCWJ1Y2tldC0+cHJldiA9ICZzdXJmYWNlczsKKwkJYnVja2V0LT51c2VkID0gMDsKKwkJYnVja2V0LT5kaXJ0eSA9IDA7CisJCWJ1Y2tldC0+YmFzZSA9IGJhc2U7CisJCWJ1Y2tldC0+c2l6ZSA9IHNpemU7CisJCWJ1Y2tldC0+bmV4dCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJYnVja2V0ID0gTlVMTDsKKwl9CisKKwlzdXJmYWNlcy5wcmV2ID0gTlVMTDsKKwlzdXJmYWNlcy51c2VkID0gMTsKKwlzdXJmYWNlcy5kaXJ0eSA9IDA7CisJc3VyZmFjZXMuYmFzZSA9IHNjcmVlbi0+cGl4ZWxzOworCXN1cmZhY2VzLnNpemUgPSAodW5zaWduZWQgaW50KSgobG9uZyliYXNlIC0gKGxvbmcpc3VyZmFjZXMuYmFzZSk7CisJc3VyZmFjZXMubmV4dCA9IGJ1Y2tldDsKKwlzY3JlZW4tPmh3ZGF0YSA9IChzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgKikoKGNoYXIqKSZzdXJmYWNlcyk7CisJcmV0dXJuKDApOworfQorc3RhdGljIHZvaWQgREdBX0ZyZWVIV1N1cmZhY2VzKF9USElTKQoreworCXZpZG1lbV9idWNrZXQgKmJ1Y2tldCwgKmZyZWVhYmxlOworCisJYnVja2V0ID0gc3VyZmFjZXMubmV4dDsKKwl3aGlsZSAoIGJ1Y2tldCApIHsKKwkJZnJlZWFibGUgPSBidWNrZXQ7CisJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKKwkJU0RMX2ZyZWUoZnJlZWFibGUpOworCX0KKwlzdXJmYWNlcy5uZXh0ID0gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBER0FfQWRkQnVzeVN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJKCh2aWRtZW1fYnVja2V0ICopc3VyZmFjZS0+aHdkYXRhKS0+ZGlydHkgPSAxOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgREdBX0lzU3VyZmFjZUJ1c3koU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuICgodmlkbWVtX2J1Y2tldCAqKXN1cmZhY2UtPmh3ZGF0YSktPmRpcnR5OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIERHQV9XYWl0QnVzeVN1cmZhY2VzKF9USElTKQoreworCXZpZG1lbV9idWNrZXQgKmJ1Y2tldDsKKworCS8qIFdhaXQgZm9yIGdyYXBoaWMgb3BlcmF0aW9ucyB0byBjb21wbGV0ZSAqLworCVNETF9OQU1FKFhER0FTeW5jKShER0FfRGlzcGxheSwgREdBX1NjcmVlbik7CisKKwkvKiBDbGVhciBhbGwgc3VyZmFjZSBkaXJ0eSBiaXRzICovCisJZm9yICggYnVja2V0PSZzdXJmYWNlczsgYnVja2V0OyBidWNrZXQ9YnVja2V0LT5uZXh0ICkgeworCQlidWNrZXQtPmRpcnR5ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgREdBX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwl2aWRtZW1fYnVja2V0ICpidWNrZXQ7CisJaW50IHNpemU7CisJaW50IGV4dHJhOworCWludCByZXR2YWwgPSAwOworCisvKiBUZW1wb3JhcmlseSwgd2Ugb25seSBhbGxvdyBzdXJmYWNlcyB0aGUgc2FtZSB3aWR0aCBhcyBkaXNwbGF5LgorICAgU29tZSBibGl0dGVycyByZXF1aXJlIHRoZSBwaXRjaCBiZXR3ZWVuIHR3byBoYXJkd2FyZSBzdXJmYWNlcworICAgdG8gYmUgdGhlIHNhbWUuICBPdGhlcnMgaGF2ZSBpbnRlcmVzdGluZyBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLgorKi8KK2lmICggc3VyZmFjZS0+cGl0Y2ggPiBTRExfVmlkZW9TdXJmYWNlLT5waXRjaCApIHsKKwlTRExfU2V0RXJyb3IoIlN1cmZhY2UgcmVxdWVzdGVkIHdpZGVyIHRoYW4gc2NyZWVuIik7CisJcmV0dXJuKC0xKTsKK30KK3N1cmZhY2UtPnBpdGNoID0gU0RMX1ZpZGVvU3VyZmFjZS0+cGl0Y2g7CisJc2l6ZSA9IHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaDsKKyNpZmRlZiBER0FfREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRpbmcgYnVja2V0IG9mICVkIGJ5dGVzXG4iLCBzaXplKTsKKyNlbmRpZgorCUxPQ0tfRElTUExBWSgpOworCisJLyogUXVpY2sgY2hlY2sgZm9yIGF2YWlsYWJsZSBtZW0gKi8KKwlpZiAoIHNpemUgPiBzdXJmYWNlc19tZW1sZWZ0ICkgeworCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggdmlkZW8gbWVtb3J5Iik7CisJCXJldHZhbCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogU2VhcmNoIGZvciBhbiBlbXB0eSBidWNrZXQgYmlnIGVub3VnaCAqLworCWZvciAoIGJ1Y2tldD0mc3VyZmFjZXM7IGJ1Y2tldDsgYnVja2V0PWJ1Y2tldC0+bmV4dCApIHsKKwkJaWYgKCAhIGJ1Y2tldC0+dXNlZCAmJiAoc2l6ZSA8PSBidWNrZXQtPnNpemUpICkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCBidWNrZXQgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJWaWRlbyBtZW1vcnkgdG9vIGZyYWdtZW50ZWQiKTsKKwkJcmV0dmFsID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBDcmVhdGUgYSBuZXcgYnVja2V0IGZvciBsZWZ0LW92ZXIgbWVtb3J5ICovCisJZXh0cmEgPSAoYnVja2V0LT5zaXplIC0gc2l6ZSk7CisJaWYgKCBleHRyYSApIHsKKwkJdmlkbWVtX2J1Y2tldCAqbmV3YnVja2V0OworCisjaWZkZWYgREdBX0RFQlVHCisJZnByaW50ZihzdGRlcnIsICJBZGRpbmcgbmV3IGZyZWUgYnVja2V0IG9mICVkIGJ5dGVzXG4iLCBleHRyYSk7CisjZW5kaWYKKwkJbmV3YnVja2V0ID0gKHZpZG1lbV9idWNrZXQgKilTRExfbWFsbG9jKHNpemVvZigqbmV3YnVja2V0KSk7CisJCWlmICggbmV3YnVja2V0ID09IE5VTEwgKSB7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCXJldHZhbCA9IC0xOworCQkJZ290byBkb25lOworCQl9CisJCW5ld2J1Y2tldC0+cHJldiA9IGJ1Y2tldDsKKwkJbmV3YnVja2V0LT51c2VkID0gMDsKKwkJbmV3YnVja2V0LT5iYXNlID0gYnVja2V0LT5iYXNlK3NpemU7CisJCW5ld2J1Y2tldC0+c2l6ZSA9IGV4dHJhOworCQluZXdidWNrZXQtPm5leHQgPSBidWNrZXQtPm5leHQ7CisJCWlmICggYnVja2V0LT5uZXh0ICkgeworCQkJYnVja2V0LT5uZXh0LT5wcmV2ID0gbmV3YnVja2V0OworCQl9CisJCWJ1Y2tldC0+bmV4dCA9IG5ld2J1Y2tldDsKKwl9CisKKwkvKiBTZXQgdGhlIGN1cnJlbnQgYnVja2V0IHZhbHVlcyBhbmQgcmV0dXJuIGl0ISAqLworCWJ1Y2tldC0+dXNlZCA9IDE7CisJYnVja2V0LT5zaXplID0gc2l6ZTsKKwlidWNrZXQtPmRpcnR5ID0gMDsKKyNpZmRlZiBER0FfREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRlZCAlZCBieXRlcyBhdCAlcFxuIiwgYnVja2V0LT5zaXplLCBidWNrZXQtPmJhc2UpOworI2VuZGlmCisJc3VyZmFjZXNfbWVtbGVmdCAtPSBzaXplOworCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9IV1NVUkZBQ0U7CisJc3VyZmFjZS0+cGl4ZWxzID0gYnVja2V0LT5iYXNlOworCXN1cmZhY2UtPmh3ZGF0YSA9IChzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgKilidWNrZXQ7Citkb25lOgorCVVOTE9DS19ESVNQTEFZKCk7CisJcmV0dXJuKHJldHZhbCk7Cit9CitzdGF0aWMgdm9pZCBER0FfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJdmlkbWVtX2J1Y2tldCAqYnVja2V0LCAqZnJlZWFibGU7CisKKwkvKiBXYWl0IGZvciBhbnkgcGVuZGluZyBvcGVyYXRpb25zIGludm9sdmluZyB0aGlzIHN1cmZhY2UgKi8KKwlpZiAoIERHQV9Jc1N1cmZhY2VCdXN5KHN1cmZhY2UpICkgeworCQlMT0NLX0RJU1BMQVkoKTsKKwkJREdBX1dhaXRCdXN5U3VyZmFjZXModGhpcyk7CisJCVVOTE9DS19ESVNQTEFZKCk7CisJfQorCisJLyogTG9vayBmb3IgdGhlIGJ1Y2tldCBpbiB0aGUgY3VycmVudCBsaXN0ICovCisJZm9yICggYnVja2V0PSZzdXJmYWNlczsgYnVja2V0OyBidWNrZXQ9YnVja2V0LT5uZXh0ICkgeworCQlpZiAoIGJ1Y2tldCA9PSAodmlkbWVtX2J1Y2tldCAqKXN1cmZhY2UtPmh3ZGF0YSApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICggYnVja2V0ICYmIGJ1Y2tldC0+dXNlZCApIHsKKwkJLyogQWRkIHRoZSBtZW1vcnkgYmFjayB0byB0aGUgdG90YWwgKi8KKyNpZmRlZiBER0FfREVCVUcKKwlwcmludGYoIkZyZWVpbmcgYnVja2V0IG9mICVkIGJ5dGVzXG4iLCBidWNrZXQtPnNpemUpOworI2VuZGlmCisJCXN1cmZhY2VzX21lbWxlZnQgKz0gYnVja2V0LT5zaXplOworCisJCS8qIENhbiB3ZSBtZXJnZSB0aGUgc3BhY2Ugd2l0aCBzdXJyb3VuZGluZyBidWNrZXRzPyAqLworCQlidWNrZXQtPnVzZWQgPSAwOworCQlpZiAoIGJ1Y2tldC0+bmV4dCAmJiAhIGJ1Y2tldC0+bmV4dC0+dXNlZCApIHsKKyNpZmRlZiBER0FfREVCVUcKKwlwcmludGYoIk1lcmdpbmcgd2l0aCBuZXh0IGJ1Y2tldCwgZm9yICVkIHRvdGFsIGJ5dGVzXG4iLCBidWNrZXQtPnNpemUrYnVja2V0LT5uZXh0LT5zaXplKTsKKyNlbmRpZgorCQkJZnJlZWFibGUgPSBidWNrZXQtPm5leHQ7CisJCQlidWNrZXQtPnNpemUgKz0gYnVja2V0LT5uZXh0LT5zaXplOworCQkJYnVja2V0LT5uZXh0ID0gYnVja2V0LT5uZXh0LT5uZXh0OworCQkJaWYgKCBidWNrZXQtPm5leHQgKSB7CisJCQkJYnVja2V0LT5uZXh0LT5wcmV2ID0gYnVja2V0OworCQkJfQorCQkJU0RMX2ZyZWUoZnJlZWFibGUpOworCQl9CisJCWlmICggYnVja2V0LT5wcmV2ICYmICEgYnVja2V0LT5wcmV2LT51c2VkICkgeworI2lmZGVmIERHQV9ERUJVRworCXByaW50ZigiTWVyZ2luZyB3aXRoIHByZXZpb3VzIGJ1Y2tldCwgZm9yICVkIHRvdGFsIGJ5dGVzXG4iLCBidWNrZXQtPnByZXYtPnNpemUrYnVja2V0LT5zaXplKTsKKyNlbmRpZgorCQkJZnJlZWFibGUgPSBidWNrZXQ7CisJCQlidWNrZXQtPnByZXYtPnNpemUgKz0gYnVja2V0LT5zaXplOworCQkJYnVja2V0LT5wcmV2LT5uZXh0ID0gYnVja2V0LT5uZXh0OworCQkJaWYgKCBidWNrZXQtPm5leHQgKSB7CisJCQkJYnVja2V0LT5uZXh0LT5wcmV2ID0gYnVja2V0LT5wcmV2OworCQkJfQorCQkJU0RMX2ZyZWUoZnJlZWFibGUpOworCQl9CisJfQorCXN1cmZhY2UtPnBpeGVscyA9IE5VTEw7CisJc3VyZmFjZS0+aHdkYXRhID0gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBER0FfZHN0X3RvX3h5KF9USElTLCBTRExfU3VyZmFjZSAqZHN0LCBpbnQgKngsIGludCAqeSkKK3sKKwkqeCA9IChsb25nKSgoVWludDggKilkc3QtPnBpeGVscyAtIG1lbW9yeV9iYXNlKSVtZW1vcnlfcGl0Y2g7CisJKnkgPSAobG9uZykoKFVpbnQ4ICopZHN0LT5waXhlbHMgLSBtZW1vcnlfYmFzZSkvbWVtb3J5X3BpdGNoOworfQorCitzdGF0aWMgaW50IERHQV9GaWxsSFdSZWN0KF9USElTLCBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqcmVjdCwgVWludDMyIGNvbG9yKQoreworCWludCB4LCB5OworCXVuc2lnbmVkIGludCB3LCBoOworCisJLyogRG9uJ3QgZmlsbCB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSBzY3JlZW4sIHdhaXQgdW50aWwgZmxpcHBlZCAqLworCUxPQ0tfRElTUExBWSgpOworCWlmICggd2FzX2ZsaXBwZWQgJiYgKGRzdCA9PSB0aGlzLT5zY3JlZW4pICkgeworCQl3aGlsZSAoIFNETF9OQU1FKFhER0FHZXRWaWV3cG9ydFN0YXR1cykoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4pICkKKwkJCS8qIEtlZXAgd2FpdGluZyBmb3IgdGhlIGhhcmR3YXJlIC4uLiAqLyA7CisJCXdhc19mbGlwcGVkID0gMDsKKwl9CisJREdBX2RzdF90b194eSh0aGlzLCBkc3QsICZ4LCAmeSk7CisJeCArPSByZWN0LT54OworCXkgKz0gcmVjdC0+eTsKKwl3ID0gcmVjdC0+dzsKKwloID0gcmVjdC0+aDsKKyNpZiAwCisgIHByaW50ZigiSGFyZHdhcmUgYWNjZWxlcmF0ZWQgcmVjdGFuZ2xlIGZpbGw6ICVkeCVkIGF0ICVkLCVkXG4iLCB3LCBoLCB4LCB5KTsKKyNlbmRpZgorCVNETF9OQU1FKFhER0FGaWxsUmVjdGFuZ2xlKShER0FfRGlzcGxheSwgREdBX1NjcmVlbiwgeCwgeSwgdywgaCwgY29sb3IpOworCWlmICggISh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgKSB7CisJCVhGbHVzaChER0FfRGlzcGxheSk7CisJfQorCURHQV9BZGRCdXN5U3VyZmFjZShkc3QpOworCVVOTE9DS19ESVNQTEFZKCk7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IEhXQWNjZWxCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXM7CisJaW50IHNyY3gsIHNyY3k7CisJaW50IGRzdHgsIGRzdHk7CisJdW5zaWduZWQgaW50IHcsIGg7CisKKwl0aGlzID0gY3VycmVudF92aWRlbzsKKwkvKiBEb24ndCBibGl0IHRvIHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlIHNjcmVlbiwgd2FpdCB1bnRpbCBmbGlwcGVkICovCisJTE9DS19ESVNQTEFZKCk7CisJaWYgKCB3YXNfZmxpcHBlZCAmJiAoZHN0ID09IHRoaXMtPnNjcmVlbikgKSB7CisJCXdoaWxlICggU0RMX05BTUUoWERHQUdldFZpZXdwb3J0U3RhdHVzKShER0FfRGlzcGxheSwgREdBX1NjcmVlbikgKQorCQkJLyogS2VlcCB3YWl0aW5nIGZvciB0aGUgaGFyZHdhcmUgLi4uICovIDsKKwkJd2FzX2ZsaXBwZWQgPSAwOworCX0KKwlER0FfZHN0X3RvX3h5KHRoaXMsIHNyYywgJnNyY3gsICZzcmN5KTsKKwlzcmN4ICs9IHNyY3JlY3QtPng7CisJc3JjeSArPSBzcmNyZWN0LT55OworCURHQV9kc3RfdG9feHkodGhpcywgZHN0LCAmZHN0eCwgJmRzdHkpOworCWRzdHggKz0gZHN0cmVjdC0+eDsKKwlkc3R5ICs9IGRzdHJlY3QtPnk7CisJdyA9IHNyY3JlY3QtPnc7CisJaCA9IHNyY3JlY3QtPmg7CisjaWYgMAorICBwcmludGYoIkJsaXR0aW5nICVkeCVkIGZyb20gJWQsJWQgdG8gJWQsJWRcbiIsIHcsIGgsIHNyY3gsIHNyY3ksIGRzdHgsIGRzdHkpOworI2VuZGlmCisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgeworCQlTRExfTkFNRShYREdBQ29weVRyYW5zcGFyZW50QXJlYSkoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sCisJCQlzcmN4LCBzcmN5LCB3LCBoLCBkc3R4LCBkc3R5LCBzcmMtPmZvcm1hdC0+Y29sb3JrZXkpOworCX0gZWxzZSB7CisJCVNETF9OQU1FKFhER0FDb3B5QXJlYSkoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sCisJCQlzcmN4LCBzcmN5LCB3LCBoLCBkc3R4LCBkc3R5KTsKKwl9CisJaWYgKCAhKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSApIHsKKwkJWEZsdXNoKERHQV9EaXNwbGF5KTsKKwl9CisJREdBX0FkZEJ1c3lTdXJmYWNlKHNyYyk7CisJREdBX0FkZEJ1c3lTdXJmYWNlKGRzdCk7CisJVU5MT0NLX0RJU1BMQVkoKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgREdBX0NoZWNrSFdCbGl0KF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KQoreworCWludCBhY2NlbGVyYXRlZDsKKworCS8qIFNldCBpbml0aWFsIGFjY2VsZXJhdGlvbiBvbiAqLworCXNyYy0+ZmxhZ3MgfD0gU0RMX0hXQUNDRUw7CisKKwkvKiBTZXQgdGhlIHN1cmZhY2UgYXR0cmlidXRlcyAqLworCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSApIHsKKwkJaWYgKCAhIHRoaXMtPmluZm8uYmxpdF9od19BICkgeworCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7CisJCX0KKwl9CisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgeworCQlpZiAoICEgdGhpcy0+aW5mby5ibGl0X2h3X0NDICkgeworCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7CisJCX0KKwl9CisKKwkvKiBDaGVjayB0byBzZWUgaWYgZmluYWwgc3VyZmFjZSBibGl0IGlzIGFjY2VsZXJhdGVkICovCisJYWNjZWxlcmF0ZWQgPSAhIShzcmMtPmZsYWdzICYgU0RMX0hXQUNDRUwpOworCWlmICggYWNjZWxlcmF0ZWQgKSB7CisJCXNyYy0+bWFwLT5od19ibGl0ID0gSFdBY2NlbEJsaXQ7CisJfQorCXJldHVybihhY2NlbGVyYXRlZCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgREdBX1dhaXRGbGlwKF9USElTKQoreworCWlmICggd2FzX2ZsaXBwZWQgKSB7CisJCXdoaWxlICggU0RMX05BTUUoWERHQUdldFZpZXdwb3J0U3RhdHVzKShER0FfRGlzcGxheSwgREdBX1NjcmVlbikgKQorCQkJLyogS2VlcCB3YWl0aW5nIGZvciB0aGUgaGFyZHdhcmUgLi4uICovIDsKKwkJd2FzX2ZsaXBwZWQgPSAwOworCX0KK30KKworc3RhdGljIGludCBER0FfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaWYgKCBzdXJmYWNlID09IHRoaXMtPnNjcmVlbiApIHsKKwkJU0RMX211dGV4UChod19sb2NrKTsKKwkJTE9DS19ESVNQTEFZKCk7CisJCWlmICggREdBX0lzU3VyZmFjZUJ1c3koc3VyZmFjZSkgKSB7CisJCQlER0FfV2FpdEJ1c3lTdXJmYWNlcyh0aGlzKTsKKwkJfQorCQlER0FfV2FpdEZsaXAodGhpcyk7CisJCVVOTE9DS19ESVNQTEFZKCk7CisJfSBlbHNlIHsKKwkJaWYgKCBER0FfSXNTdXJmYWNlQnVzeShzdXJmYWNlKSApIHsKKwkJCUxPQ0tfRElTUExBWSgpOworCQkJREdBX1dhaXRCdXN5U3VyZmFjZXModGhpcyk7CisJCQlVTkxPQ0tfRElTUExBWSgpOworCQl9CisJfQorCXJldHVybigwKTsKK30KK3N0YXRpYyB2b2lkIERHQV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWlmICggc3VyZmFjZSA9PSB0aGlzLT5zY3JlZW4gKSB7CisJCVNETF9tdXRleFYoaHdfbG9jayk7CisJfQorfQorCitzdGF0aWMgaW50IERHQV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwkvKiBXYWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlIGFuZCB0aGVuIGZsaXAgZGlzcGxheSAqLworCUxPQ0tfRElTUExBWSgpOworCWlmICggREdBX0lzU3VyZmFjZUJ1c3kodGhpcy0+c2NyZWVuKSApIHsKKwkJREdBX1dhaXRCdXN5U3VyZmFjZXModGhpcyk7CisJfQorCURHQV9XYWl0RmxpcCh0aGlzKTsKKwlTRExfTkFNRShYREdBU2V0Vmlld3BvcnQpKERHQV9EaXNwbGF5LCBER0FfU2NyZWVuLAorCSAgICAgICAgICAgICAgICAwLCBmbGlwX3lvZmZzZXRbZmxpcF9wYWdlXSwgWERHQUZsaXBSZXRyYWNlKTsKKwlYRmx1c2goREdBX0Rpc3BsYXkpOworCVVOTE9DS19ESVNQTEFZKCk7CisJd2FzX2ZsaXBwZWQgPSAxOworCWZsaXBfcGFnZSA9ICFmbGlwX3BhZ2U7CisKKwlzdXJmYWNlLT5waXhlbHMgPSBmbGlwX2FkZHJlc3NbZmxpcF9wYWdlXTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIERHQV9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCS8qIFRoZSBhcHBsaWNhdGlvbiBpcyBhbHJlYWR5IHVwZGF0aW5nIHRoZSB2aXNpYmxlIHZpZGVvIG1lbW9yeSAqLworCXJldHVybjsKK30KKworc3RhdGljIGludCBER0FfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworICAgICAgICBpbnQgaTsKKwlYQ29sb3IgICp4Y21hcDsKKworCS8qIFRoaXMgaGFwcGVucyBvbiBpbml0aWFsaXphdGlvbiAqLworCWlmICggISBER0FfY29sb3JtYXAgKSB7CisJCXJldHVybigwKTsKKwl9CisJeGNtYXAgPSBTRExfc3RhY2tfYWxsb2MoWENvbG9yLCBuY29sb3JzKTsKKwlmb3IgKCBpPTA7IGk8bmNvbG9yczsgKytpICkgeworCQl4Y21hcFtpXS5waXhlbCA9IGZpcnN0Y29sb3IgKyBpOworCQl4Y21hcFtpXS5yZWQgICA9IChjb2xvcnNbaV0ucjw8OCl8Y29sb3JzW2ldLnI7CisJCXhjbWFwW2ldLmdyZWVuID0gKGNvbG9yc1tpXS5nPDw4KXxjb2xvcnNbaV0uZzsKKwkJeGNtYXBbaV0uYmx1ZSAgPSAoY29sb3JzW2ldLmI8PDgpfGNvbG9yc1tpXS5iOworCQl4Y21hcFtpXS5mbGFncyA9IChEb1JlZHxEb0dyZWVufERvQmx1ZSk7CisJfQorCUxPQ0tfRElTUExBWSgpOworCVhTdG9yZUNvbG9ycyhER0FfRGlzcGxheSwgREdBX2NvbG9ybWFwLCB4Y21hcCwgbmNvbG9ycyk7CisJWFN5bmMoREdBX0Rpc3BsYXksIEZhbHNlKTsKKwlVTkxPQ0tfRElTUExBWSgpOworCVNETF9zdGFja19mcmVlKHhjbWFwKTsKKworCS8qIFRoYXQgd2FzIGVhc3kuIDopICovCisJcmV0dXJuKDEpOworfQorCitpbnQgREdBX1NldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKQoreworCWludCBpLCBuY29sb3JzOworCVhDb2xvciB4Y21hcFsyNTZdOworCisJLyogU2VlIGlmIGFjdHVhbGx5IHNldHRpbmcgdGhlIGdhbW1hIGlzIHN1cHBvcnRlZCAqLworCWlmICggREdBX3Zpc3VhbENsYXNzICE9IERpcmVjdENvbG9yICkgeworCSAgICBTRExfU2V0RXJyb3IoIkdhbW1hIGNvcnJlY3Rpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHZpc3VhbCIpOworCSAgICByZXR1cm4oLTEpOworCX0KKworCS8qIENhbGN1bGF0ZSB0aGUgYXBwcm9wcmlhdGUgcGFsZXR0ZSBmb3IgdGhlIGdpdmVuIGdhbW1hIHJhbXAgKi8KKwlpZiAoIHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPD0gMTYgKSB7CisJCW5jb2xvcnMgPSA2NDsgLyogSXMgdGhpcyByaWdodD8gKi8KKwl9IGVsc2UgeworCQluY29sb3JzID0gMjU2OworCX0KKwlmb3IgKCBpPTA7IGk8bmNvbG9yczsgKytpICkgeworCQlVaW50OCBjID0gKDI1NiAqIGkgLyBuY29sb3JzKTsKKwkJeGNtYXBbaV0ucGl4ZWwgPSBTRExfTWFwUkdCKHRoaXMtPnNjcmVlbi0+Zm9ybWF0LCBjLCBjLCBjKTsKKwkJeGNtYXBbaV0ucmVkICAgPSByYW1wWzAqMjU2K2NdOworCQl4Y21hcFtpXS5ncmVlbiA9IHJhbXBbMSoyNTYrY107CisJCXhjbWFwW2ldLmJsdWUgID0gcmFtcFsyKjI1NitjXTsKKwkJeGNtYXBbaV0uZmxhZ3MgPSAoRG9SZWR8RG9HcmVlbnxEb0JsdWUpOworCX0KKwlMT0NLX0RJU1BMQVkoKTsKKwlYU3RvcmVDb2xvcnMoREdBX0Rpc3BsYXksIERHQV9jb2xvcm1hcCwgeGNtYXAsIG5jb2xvcnMpOworCVhTeW5jKERHQV9EaXNwbGF5LCBGYWxzZSk7CisJVU5MT0NLX0RJU1BMQVkoKTsKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgREdBX1ZpZGVvUXVpdChfVEhJUykKK3sKKwlpbnQgaSwgajsKKworCWlmICggREdBX0Rpc3BsYXkgKSB7CisJCS8qIEZyZWUgY29sb3JtYXAsIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoIERHQV9jb2xvcm1hcCApIHsKKwkJCVhGcmVlQ29sb3JtYXAoREdBX0Rpc3BsYXksIERHQV9jb2xvcm1hcCk7CisJCQlER0FfY29sb3JtYXAgPSAwOworCQl9CisKKwkJLyogVW5tYXAgbWVtb3J5IGFuZCByZXNldCB2aWRlbyBtb2RlICovCisJCVNETF9OQU1FKFhER0FDbG9zZUZyYW1lYnVmZmVyKShER0FfRGlzcGxheSwgREdBX1NjcmVlbik7CisJCWlmICggdGhpcy0+c2NyZWVuICkgeworCQkJLyogVGVsbCBTREwgbm90IHRvIGZyZWUgdGhlIHBpeGVscyAqLworCQkJREdBX0ZyZWVIV1N1cmZhY2UodGhpcywgdGhpcy0+c2NyZWVuKTsKKwkJfQorCQlTRExfTkFNRShYREdBU2V0TW9kZSkoREdBX0Rpc3BsYXksIERHQV9TY3JlZW4sIDApOworCisJCS8qIENsZWFyIHRoZSBsb2NrIG11dGV4ICovCisJCWlmICggaHdfbG9jayAhPSBOVUxMICkgeworCQkJU0RMX0Rlc3Ryb3lNdXRleChod19sb2NrKTsKKwkJCWh3X2xvY2sgPSBOVUxMOworCQl9CisjaWZkZWYgTE9DS19ER0FfRElTUExBWQorCQlpZiAoIGV2ZW50X2xvY2sgIT0gTlVMTCApIHsKKwkJCVNETF9EZXN0cm95TXV0ZXgoZXZlbnRfbG9jayk7CisJCQlldmVudF9sb2NrID0gTlVMTDsKKwkJfQorI2VuZGlmIC8qIExPQ0tfREdBX0RJU1BMQVkgKi8KKworCQkvKiBDbGVhbiB1cCBkZWZpbmVkIHZpZGVvIG1vZGVzICovCisJCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7CisJCQlpZiAoIFNETF9tb2RlbGlzdFtpXSAhPSBOVUxMICkgeworCQkJCWZvciAoIGo9MDsgU0RMX21vZGVsaXN0W2ldW2pdOyArK2ogKSB7CisJCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXVtqXSk7CisJCQkJfQorCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXSk7CisJCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCisJCS8qIENsZWFuIHVwIHRoZSBtZW1vcnkgYnVja2V0IGxpc3QgKi8KKwkJREdBX0ZyZWVIV1N1cmZhY2VzKHRoaXMpOworCisJCS8qIENsb3NlIHVwIHRoZSBkaXNwbGF5ICovCisJCVhDbG9zZURpc3BsYXkoREdBX0Rpc3BsYXkpOworCX0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGdhL1NETF9kZ2F2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kZ2EvU0RMX2RnYXZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyZWNiOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGdhL1NETF9kZ2F2aWRlby5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2RnYXZpZGVvX2gKKyNkZWZpbmUgX1NETF9kZ2F2aWRlb19oCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorCisvKiBBcHBhcmVudGx5IHNvbWUgWDExIHN5c3RlbXMgY2FuJ3QgaW5jbHVkZSB0aGlzIG11bHRpcGxlIHRpbWVzLi4uICovCisjaWZuZGVmIFNETF9JTkNMVURFRF9YTElCSU5UX0gKKyNkZWZpbmUgU0RMX0lOQ0xVREVEX1hMSUJJTlRfSCAxCisjaW5jbHVkZSA8WDExL1hsaWJpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8WDExL1hwcm90by5oPgorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IG5lZWQgdGhlIERHQSBkcml2ZXIgdG8gYmUgdGhyZWFkLXNhZmUgKi8KKyNkZWZpbmUgTE9DS19ER0FfRElTUExBWQorI2lmZGVmIExPQ0tfREdBX0RJU1BMQVkKKyNkZWZpbmUgTE9DS19ESVNQTEFZKCkJCVNETF9tdXRleFAoZXZlbnRfbG9jaykKKyNkZWZpbmUgVU5MT0NLX0RJU1BMQVkoKQlTRExfbXV0ZXhWKGV2ZW50X2xvY2spCisjZWxzZQorI2RlZmluZSBMT0NLX0RJU1BMQVkoKQorI2RlZmluZSBVTkxPQ0tfRElTUExBWSgpCisjZW5kaWYKKworCisvKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2UgdXNlIHRvIGtlZXAgdHJhY2sgb2YgdmlkZW8gbWVtb3J5ICovCit0eXBlZGVmIHN0cnVjdCB2aWRtZW1fYnVja2V0IHsKKwlzdHJ1Y3QgdmlkbWVtX2J1Y2tldCAqcHJldjsKKwlpbnQgdXNlZDsKKwlpbnQgZGlydHk7CisJVWludDggKmJhc2U7CisJdW5zaWduZWQgaW50IHNpemU7CisJc3RydWN0IHZpZG1lbV9idWNrZXQgKm5leHQ7Cit9IHZpZG1lbV9idWNrZXQ7CisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgeworCURpc3BsYXkgKkRHQV9EaXNwbGF5OworCUNvbG9ybWFwIERHQV9jb2xvcm1hcDsKKwlpbnQgdmlzdWFsQ2xhc3M7CisKKyNkZWZpbmUgTlVNX01PREVMSVNUUwk0CQkvKiA4LCAxNiwgMjQsIGFuZCAzMiBiaXRzLXBlci1waXhlbCAqLworCWludCBTRExfbnVtbW9kZXNbTlVNX01PREVMSVNUU107CisJU0RMX1JlY3QgKipTRExfbW9kZWxpc3RbTlVNX01PREVMSVNUU107CisKKwkvKiBJbmZvcm1hdGlvbiBmb3IgdGhlIHZpZGVvIHN1cmZhY2UgKi8KKwlVaW50OCAqbWVtb3J5X2Jhc2U7CisJaW50IG1lbW9yeV9waXRjaDsKKwlTRExfbXV0ZXggKmh3X2xvY2s7CisJaW50IHN5bmNfbmVlZGVkOworCWludCB3YXNfZmxpcHBlZDsKKworCS8qIEluZm9ybWF0aW9uIGZvciBoYXJkd2FyZSBzdXJmYWNlcyAqLworCXZpZG1lbV9idWNrZXQgc3VyZmFjZXM7CisJaW50IHN1cmZhY2VzX21lbXRvdGFsOworCWludCBzdXJmYWNlc19tZW1sZWZ0OworCisJLyogSW5mb3JtYXRpb24gZm9yIGRvdWJsZS1idWZmZXJpbmcgKi8KKwlpbnQgZmxpcF9wYWdlOworCWludCBmbGlwX3lvZmZzZXRbMl07CisJVWludDggKmZsaXBfYWRkcmVzc1syXTsKKworCS8qIFVzZWQgdG8gaGFuZGxlIERHQSBldmVudHMgKi8KKwlpbnQgZXZlbnRfYmFzZTsKKyNpZmRlZiBMT0NLX0RHQV9ESVNQTEFZCisJU0RMX211dGV4ICpldmVudF9sb2NrOworI2VuZGlmCisKKwkvKiBTY3JlZW5zYXZlciBzZXR0aW5ncyAqLworCWludCBhbGxvd19zY3JlZW5zYXZlcjsKK307CisKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBER0FfRGlzcGxheQkJKHRoaXMtPmhpZGRlbi0+REdBX0Rpc3BsYXkpCisjZGVmaW5lIERHQV9TY3JlZW4JCURlZmF1bHRTY3JlZW4oREdBX0Rpc3BsYXkpCisjZGVmaW5lIERHQV9jb2xvcm1hcAkJKHRoaXMtPmhpZGRlbi0+REdBX2NvbG9ybWFwKQorI2RlZmluZSBER0FfdmlzdWFsQ2xhc3MJCSh0aGlzLT5oaWRkZW4tPnZpc3VhbENsYXNzKQorI2RlZmluZSBtZW1vcnlfYmFzZQkJKHRoaXMtPmhpZGRlbi0+bWVtb3J5X2Jhc2UpCisjZGVmaW5lIG1lbW9yeV9waXRjaAkJKHRoaXMtPmhpZGRlbi0+bWVtb3J5X3BpdGNoKQorI2RlZmluZSBmbGlwX3BhZ2UJCSh0aGlzLT5oaWRkZW4tPmZsaXBfcGFnZSkKKyNkZWZpbmUgZmxpcF95b2Zmc2V0CQkodGhpcy0+aGlkZGVuLT5mbGlwX3lvZmZzZXQpCisjZGVmaW5lIGZsaXBfYWRkcmVzcwkJKHRoaXMtPmhpZGRlbi0+ZmxpcF9hZGRyZXNzKQorI2RlZmluZSBzeW5jX25lZWRlZAkJKHRoaXMtPmhpZGRlbi0+c3luY19uZWVkZWQpCisjZGVmaW5lIHdhc19mbGlwcGVkCQkodGhpcy0+aGlkZGVuLT53YXNfZmxpcHBlZCkKKyNkZWZpbmUgU0RMX251bW1vZGVzCQkodGhpcy0+aGlkZGVuLT5TRExfbnVtbW9kZXMpCisjZGVmaW5lIFNETF9tb2RlbGlzdAkJKHRoaXMtPmhpZGRlbi0+U0RMX21vZGVsaXN0KQorI2RlZmluZSBzdXJmYWNlcwkJKHRoaXMtPmhpZGRlbi0+c3VyZmFjZXMpCisjZGVmaW5lIHN1cmZhY2VzX21lbXRvdGFsCSh0aGlzLT5oaWRkZW4tPnN1cmZhY2VzX21lbXRvdGFsKQorI2RlZmluZSBzdXJmYWNlc19tZW1sZWZ0CSh0aGlzLT5oaWRkZW4tPnN1cmZhY2VzX21lbWxlZnQpCisjZGVmaW5lIGh3X2xvY2sJCQkodGhpcy0+aGlkZGVuLT5od19sb2NrKQorI2RlZmluZSBER0FfZXZlbnRfYmFzZQkJKHRoaXMtPmhpZGRlbi0+ZXZlbnRfYmFzZSkKKyNkZWZpbmUgZXZlbnRfbG9jawkJKHRoaXMtPmhpZGRlbi0+ZXZlbnRfbG9jaykKKyNkZWZpbmUgYWxsb3dfc2NyZWVuc2F2ZXIJKHRoaXMtPmhpZGRlbi0+YWxsb3dfc2NyZWVuc2F2ZXIpCisKKyNlbmRpZiAvKiBfU0RMX2RnYXZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2Yjc1YgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX2V2ZW50cy5jCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgRGlyZWN0RkIgaW5wdXQgZXZlbnRzIGludG8gU0RMIGV2ZW50cyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworI2luY2x1ZGUgPGRpcmVjdGZiLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfRGlyZWN0RkJfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfRGlyZWN0RkJfZXZlbnRzLmgiCisKKy8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZXMgZnJvbSBhIERpcmVjdEZCIGtleWNvZGUgdG8gYSBTREwga2V5c3ltICovCitzdGF0aWMgU0RMS2V5IGtleW1hcFsyNTZdOworc3RhdGljIFNETF9rZXlzeW0gKkRpcmVjdEZCX1RyYW5zbGF0ZUtleSAoREZCSW5wdXRFdmVudCAqZXYsIFNETF9rZXlzeW0gKmtleXN5bSk7CitzdGF0aWMgaW50IERpcmVjdEZCX1RyYW5zbGF0ZUJ1dHRvbiAoREZCSW5wdXRFdmVudCAqZXYpOworCitzdGF0aWMgaW50IHBvc3RlZCA9IDA7CisKKwordm9pZCBEaXJlY3RGQl9QdW1wRXZlbnRzIChfVEhJUykKK3sKKyAgREZCSW5wdXRFdmVudCBldnQ7CisKKyAgd2hpbGUgKEhJRERFTi0+ZXZlbnRidWZmZXItPkdldEV2ZW50IChISURERU4tPmV2ZW50YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERGQl9FVkVOVCAoJmV2dCkpID09IERGQl9PSykKKyAgICB7CisgICAgICBTRExfa2V5c3ltIGtleXN5bTsKKworICAgICAgc3dpdGNoIChldnQudHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIERJRVRfQlVUVE9OUFJFU1M6CisgICAgICAgICAgcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0RkJfVHJhbnNsYXRlQnV0dG9uICgmZXZ0KSwgMCwgMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElFVF9CVVRUT05SRUxFQVNFOgorICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RGQl9UcmFuc2xhdGVCdXR0b24gKCZldnQpLCAwLCAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBESUVUX0tFWVBSRVNTOgorICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELCBEaXJlY3RGQl9UcmFuc2xhdGVLZXkoJmV2dCwgJmtleXN5bSkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERJRVRfS0VZUkVMRUFTRToKKyAgICAgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsIERpcmVjdEZCX1RyYW5zbGF0ZUtleSgmZXZ0LCAma2V5c3ltKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElFVF9BWElTTU9USU9OOgorICAgICAgICAgIGlmIChldnQuZmxhZ3MgJiBESUVGX0FYSVNSRUwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChldnQuYXhpcyA9PSBESUFJX1gpCisgICAgICAgICAgICAgICAgcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgZXZ0LmF4aXNyZWwsIDApOworICAgICAgICAgICAgICBlbHNlIGlmIChldnQuYXhpcyA9PSBESUFJX1kpCisgICAgICAgICAgICAgICAgcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgMCwgZXZ0LmF4aXNyZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGV2dC5mbGFncyAmIERJRUZfQVhJU0FCUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3RhdGljIGludCBsYXN0X3gsIGxhc3RfeTsKKyAgICAgICAgICAgICAgaWYgKGV2dC5heGlzID09IERJQUlfWCkKKyAgICAgICAgICAgICAgICBsYXN0X3ggPSBldnQuYXhpc2FiczsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LmF4aXMgPT0gRElBSV9ZKQorICAgICAgICAgICAgICAgIGxhc3RfeSA9IGV2dC5heGlzYWJzOworICAgICAgICAgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCBsYXN0X3gsIGxhc3RfeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIERpcmVjdEZCX0luaXRPU0tleW1hcCAoX1RISVMpCit7CisgIGludCBpOworCQorICAvKiBJbml0aWFsaXplIHRoZSBEaXJlY3RGQiBrZXkgdHJhbnNsYXRpb24gdGFibGUgKi8KKyAgZm9yIChpPTA7IGk8U0RMX2FycmF5c2l6ZShrZXltYXApOyArK2kpCisgICAga2V5bWFwW2ldID0gU0RMS19VTktOT1dOOworCisgIGtleW1hcFtESUtJX0EgLSBESUtJX1VOS05PV05dID0gU0RMS19hOworICBrZXltYXBbRElLSV9CIC0gRElLSV9VTktOT1dOXSA9IFNETEtfYjsKKyAga2V5bWFwW0RJS0lfQyAtIERJS0lfVU5LTk9XTl0gPSBTRExLX2M7CisgIGtleW1hcFtESUtJX0QgLSBESUtJX1VOS05PV05dID0gU0RMS19kOworICBrZXltYXBbRElLSV9FIC0gRElLSV9VTktOT1dOXSA9IFNETEtfZTsKKyAga2V5bWFwW0RJS0lfRiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX2Y7CisgIGtleW1hcFtESUtJX0cgLSBESUtJX1VOS05PV05dID0gU0RMS19nOworICBrZXltYXBbRElLSV9IIC0gRElLSV9VTktOT1dOXSA9IFNETEtfaDsKKyAga2V5bWFwW0RJS0lfSSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX2k7CisgIGtleW1hcFtESUtJX0ogLSBESUtJX1VOS05PV05dID0gU0RMS19qOworICBrZXltYXBbRElLSV9LIC0gRElLSV9VTktOT1dOXSA9IFNETEtfazsKKyAga2V5bWFwW0RJS0lfTCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX2w7CisgIGtleW1hcFtESUtJX00gLSBESUtJX1VOS05PV05dID0gU0RMS19tOworICBrZXltYXBbRElLSV9OIC0gRElLSV9VTktOT1dOXSA9IFNETEtfbjsKKyAga2V5bWFwW0RJS0lfTyAtIERJS0lfVU5LTk9XTl0gPSBTRExLX287CisgIGtleW1hcFtESUtJX1AgLSBESUtJX1VOS05PV05dID0gU0RMS19wOworICBrZXltYXBbRElLSV9RIC0gRElLSV9VTktOT1dOXSA9IFNETEtfcTsKKyAga2V5bWFwW0RJS0lfUiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX3I7CisgIGtleW1hcFtESUtJX1MgLSBESUtJX1VOS05PV05dID0gU0RMS19zOworICBrZXltYXBbRElLSV9UIC0gRElLSV9VTktOT1dOXSA9IFNETEtfdDsKKyAga2V5bWFwW0RJS0lfVSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX3U7CisgIGtleW1hcFtESUtJX1YgLSBESUtJX1VOS05PV05dID0gU0RMS192OworICBrZXltYXBbRElLSV9XIC0gRElLSV9VTktOT1dOXSA9IFNETEtfdzsKKyAga2V5bWFwW0RJS0lfWCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX3g7CisgIGtleW1hcFtESUtJX1kgLSBESUtJX1VOS05PV05dID0gU0RMS195OworICBrZXltYXBbRElLSV9aIC0gRElLSV9VTktOT1dOXSA9IFNETEtfejsKKyAgCisgIGtleW1hcFtESUtJXzAgLSBESUtJX1VOS05PV05dID0gU0RMS18wOworICBrZXltYXBbRElLSV8xIC0gRElLSV9VTktOT1dOXSA9IFNETEtfMTsKKyAga2V5bWFwW0RJS0lfMiAtIERJS0lfVU5LTk9XTl0gPSBTRExLXzI7CisgIGtleW1hcFtESUtJXzMgLSBESUtJX1VOS05PV05dID0gU0RMS18zOworICBrZXltYXBbRElLSV80IC0gRElLSV9VTktOT1dOXSA9IFNETEtfNDsKKyAga2V5bWFwW0RJS0lfNSAtIERJS0lfVU5LTk9XTl0gPSBTRExLXzU7CisgIGtleW1hcFtESUtJXzYgLSBESUtJX1VOS05PV05dID0gU0RMS182OworICBrZXltYXBbRElLSV83IC0gRElLSV9VTktOT1dOXSA9IFNETEtfNzsKKyAga2V5bWFwW0RJS0lfOCAtIERJS0lfVU5LTk9XTl0gPSBTRExLXzg7CisgIGtleW1hcFtESUtJXzkgLSBESUtJX1VOS05PV05dID0gU0RMS185OworICAKKyAga2V5bWFwW0RJS0lfRjEgLSBESUtJX1VOS05PV05dID0gU0RMS19GMTsKKyAga2V5bWFwW0RJS0lfRjIgLSBESUtJX1VOS05PV05dID0gU0RMS19GMjsKKyAga2V5bWFwW0RJS0lfRjMgLSBESUtJX1VOS05PV05dID0gU0RMS19GMzsKKyAga2V5bWFwW0RJS0lfRjQgLSBESUtJX1VOS05PV05dID0gU0RMS19GNDsKKyAga2V5bWFwW0RJS0lfRjUgLSBESUtJX1VOS05PV05dID0gU0RMS19GNTsKKyAga2V5bWFwW0RJS0lfRjYgLSBESUtJX1VOS05PV05dID0gU0RMS19GNjsKKyAga2V5bWFwW0RJS0lfRjcgLSBESUtJX1VOS05PV05dID0gU0RMS19GNzsKKyAga2V5bWFwW0RJS0lfRjggLSBESUtJX1VOS05PV05dID0gU0RMS19GODsKKyAga2V5bWFwW0RJS0lfRjkgLSBESUtJX1VOS05PV05dID0gU0RMS19GOTsKKyAga2V5bWFwW0RJS0lfRjEwIC0gRElLSV9VTktOT1dOXSA9IFNETEtfRjEwOworICBrZXltYXBbRElLSV9GMTEgLSBESUtJX1VOS05PV05dID0gU0RMS19GMTE7CisgIGtleW1hcFtESUtJX0YxMiAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0YxMjsKKyAgCisgIGtleW1hcFtESUtJX0VTQ0FQRSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0VTQ0FQRTsKKyAga2V5bWFwW0RJS0lfTEVGVCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0xFRlQ7CisgIGtleW1hcFtESUtJX1JJR0hUIC0gRElLSV9VTktOT1dOXSA9IFNETEtfUklHSFQ7CisgIGtleW1hcFtESUtJX1VQIC0gRElLSV9VTktOT1dOXSA9IFNETEtfVVA7CisgIGtleW1hcFtESUtJX0RPV04gLSBESUtJX1VOS05PV05dID0gU0RMS19ET1dOOworICBrZXltYXBbRElLSV9DT05UUk9MX0wgLSBESUtJX1VOS05PV05dID0gU0RMS19MQ1RSTDsKKyAga2V5bWFwW0RJS0lfQ09OVFJPTF9SIC0gRElLSV9VTktOT1dOXSA9IFNETEtfUkNUUkw7CisgIGtleW1hcFtESUtJX1NISUZUX0wgLSBESUtJX1VOS05PV05dID0gU0RMS19MU0hJRlQ7CisgIGtleW1hcFtESUtJX1NISUZUX1IgLSBESUtJX1VOS05PV05dID0gU0RMS19SU0hJRlQ7CisgIGtleW1hcFtESUtJX0FMVF9MIC0gRElLSV9VTktOT1dOXSA9IFNETEtfTEFMVDsKKyAga2V5bWFwW0RJS0lfQUxUX1IgLSBESUtJX1VOS05PV05dID0gU0RMS19SQUxUOworICBrZXltYXBbRElLSV9UQUIgLSBESUtJX1VOS05PV05dID0gU0RMS19UQUI7CisgIGtleW1hcFtESUtJX0VOVEVSIC0gRElLSV9VTktOT1dOXSA9IFNETEtfUkVUVVJOOworICBrZXltYXBbRElLSV9TUEFDRSAtIERJS0lfVU5LTk9XTl0gPSBTRExLX1NQQUNFOworICBrZXltYXBbRElLSV9CQUNLU1BBQ0UgLSBESUtJX1VOS05PV05dID0gU0RMS19CQUNLU1BBQ0U7CisgIGtleW1hcFtESUtJX0lOU0VSVCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0lOU0VSVDsKKyAga2V5bWFwW0RJS0lfREVMRVRFIC0gRElLSV9VTktOT1dOXSA9IFNETEtfREVMRVRFOworICBrZXltYXBbRElLSV9IT01FIC0gRElLSV9VTktOT1dOXSA9IFNETEtfSE9NRTsKKyAga2V5bWFwW0RJS0lfRU5EIC0gRElLSV9VTktOT1dOXSA9IFNETEtfRU5EOworICBrZXltYXBbRElLSV9QQUdFX1VQIC0gRElLSV9VTktOT1dOXSA9IFNETEtfUEFHRVVQOworICBrZXltYXBbRElLSV9QQUdFX0RPV04gLSBESUtJX1VOS05PV05dID0gU0RMS19QQUdFRE9XTjsKKyAga2V5bWFwW0RJS0lfQ0FQU19MT0NLIC0gRElLSV9VTktOT1dOXSA9IFNETEtfQ0FQU0xPQ0s7CisgIGtleW1hcFtESUtJX05VTV9MT0NLIC0gRElLSV9VTktOT1dOXSA9IFNETEtfTlVNTE9DSzsKKyAga2V5bWFwW0RJS0lfU0NST0xMX0xPQ0sgLSBESUtJX1VOS05PV05dID0gU0RMS19TQ1JPTExPQ0s7CisgIGtleW1hcFtESUtJX1BSSU5UIC0gRElLSV9VTktOT1dOXSA9IFNETEtfUFJJTlQ7CisgIGtleW1hcFtESUtJX1BBVVNFIC0gRElLSV9VTktOT1dOXSA9IFNETEtfUEFVU0U7CisgIGtleW1hcFtESUtJX0tQX0RJViAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0tQX0RJVklERTsKKyAga2V5bWFwW0RJS0lfS1BfTVVMVCAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0tQX01VTFRJUExZOworICBrZXltYXBbRElLSV9LUF9NSU5VUyAtIERJS0lfVU5LTk9XTl0gPSBTRExLX0tQX01JTlVTOworICBrZXltYXBbRElLSV9LUF9QTFVTIC0gRElLSV9VTktOT1dOXSA9IFNETEtfS1BfUExVUzsKKyAga2V5bWFwW0RJS0lfS1BfRU5URVIgLSBESUtJX1VOS05PV05dID0gU0RMS19LUF9FTlRFUjsKK30KKworCitzdGF0aWMgU0RMX2tleXN5bSAqRGlyZWN0RkJfVHJhbnNsYXRlS2V5IChERkJJbnB1dEV2ZW50ICpldiwgU0RMX2tleXN5bSAqa2V5c3ltKQoreworICAvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLworICBrZXlzeW0tPnNjYW5jb2RlID0gZXYtPmtleV9pZDsKKyAga2V5c3ltLT5tb2QgPSBLTU9EX05PTkU7IC8qIEZJWE1FICovCisgIGtleXN5bS0+dW5pY29kZSA9IChERkJfS0VZX1RZUEUgKGV2LT5rZXlfc3ltYm9sKSA9PSBESUtUX1VOSUNPREUpID8gZXYtPmtleV9zeW1ib2wgOiAwOworCisgIGlmIChldi0+a2V5X3N5bWJvbCA+IDAgJiYgZXYtPmtleV9zeW1ib2wgPCAxMjgpCisgICAga2V5c3ltLT5zeW0gPSBldi0+a2V5X3N5bWJvbDsKKyAgZWxzZQorICAgIGtleXN5bS0+c3ltID0ga2V5bWFwW2V2LT5rZXlfaWQgLSBESUtJX1VOS05PV05dOworCisgIHJldHVybiBrZXlzeW07Cit9CisKK3N0YXRpYyBpbnQgRGlyZWN0RkJfVHJhbnNsYXRlQnV0dG9uIChERkJJbnB1dEV2ZW50ICpldikKK3sKKyAgc3dpdGNoIChldi0+YnV0dG9uKQorICAgIHsKKyAgICBjYXNlIERJQklfTEVGVDoKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgRElCSV9NSURETEU6CisgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIERJQklfUklHSFQ6CisgICAgICByZXR1cm4gMzsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfZXZlbnRzLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl9ldmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGYzOTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfZXZlbnRzLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfRGlyZWN0RkJfdmlkZW8uaCIKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCitleHRlcm4gdm9pZCBEaXJlY3RGQl9Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgRGlyZWN0RkJfUHVtcEV2ZW50cyhfVEhJUyk7CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX2tleXMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX2tleXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfa2V5cy5oCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl9rZXlzLmgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX3ZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl92aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjVlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl92aWRlby5jCkBAIC0wLDAgKzEsMTE3MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworCisJTUdBIENSVEMyIHN1cHBvcnQgYnkgVGhvbWFzIEphcm9zY2ggLSB0b21qQHNpbW9udi5jb20KKwlDUlRDMiBzdXBwb3J0IGlzIGluc3BpcmVkIGJ5IG1wbGF5ZXIncyBkZmJtZ2EgZHJpdmVyCisJd3JpdHRlbiBieSBWaWxsZSBTeXJq77+977+9PHN5cmphbGFAc2NpLmZpPgorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIERpcmVjdEZCIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlIDxkaXJlY3RmYi5oPgorI2luY2x1ZGUgPGRpcmVjdGZiX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfRGlyZWN0RkJfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfRGlyZWN0RkJfZXZlbnRzLmgiCisjaW5jbHVkZSAiU0RMX0RpcmVjdEZCX3l1di5oIgorCisvKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK3N0cnVjdCBXTWN1cnNvciB7CisJaW50IHVudXNlZDsKK307CisKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERpcmVjdEZCX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKkRpcmVjdEZCX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgU0RMX1N1cmZhY2UgKkRpcmVjdEZCX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgRGlyZWN0RkJfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsCisJCQkgU0RMX0NvbG9yICpjb2xvcnMpOworc3RhdGljIHZvaWQgRGlyZWN0RkJfVmlkZW9RdWl0KF9USElTKTsKKworLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgRGlyZWN0RkJfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgRGlyZWN0RkJfRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QsIFVpbnQzMiBjb2xvcik7CitzdGF0aWMgaW50IERpcmVjdEZCX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIERpcmVjdEZCX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgRGlyZWN0RkJfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBEaXJlY3RGQl9DaGVja0hXQmxpdChfVEhJUywgU0RMX1N1cmZhY2UgKnNyYywgU0RMX1N1cmZhY2UgKmRzdCk7CitzdGF0aWMgaW50IERpcmVjdEZCX0hXQWNjZWxCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCk7CitzdGF0aWMgaW50IERpcmVjdEZCX1NldEhXQ29sb3JLZXkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIga2V5KTsKK3N0YXRpYyBpbnQgRGlyZWN0RkJfU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQ4IGFscGhhKTsKK3N0YXRpYyBpbnQgRGlyZWN0RkJfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBEaXJlY3RGQl9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworCisvKiBWYXJpb3VzIHNjcmVlbiB1cGRhdGUgZnVuY3Rpb25zIGF2YWlsYWJsZSAqLworc3RhdGljIHZvaWQgRGlyZWN0RkJfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CitzdGF0aWMgdm9pZCBEaXJlY3RGQl9XaW5kb3dlZFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCisvKiBUaGlzIGlzIHRoZSByZWN0IEVudW1Nb2RlczIgdXNlcyAqLworc3RydWN0IERpcmVjdEZCRW51bVJlY3QgeworCVNETF9SZWN0IHI7CisJc3RydWN0IERpcmVjdEZCRW51bVJlY3QqIG5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IERpcmVjdEZCRW51bVJlY3QgKmVudW1saXN0ID0gTlVMTDsKKworCisvKiBEaXJlY3RGQiBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IERpcmVjdEZCX0F2YWlsYWJsZSh2b2lkKQoreworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgRGlyZWN0RkJfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisgIFNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKkRpcmVjdEZCX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisgIFNETF9WaWRlb0RldmljZSAqZGV2aWNlOworCisgIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisgIGRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKyAgaWYgKGRldmljZSkKKyAgICB7CisgICAgICBTRExfbWVtc2V0IChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOworICAgICAgZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopIG1hbGxvYyAoc2l6ZW9mICgqZGV2aWNlLT5oaWRkZW4pKTsKKyAgICB9CisgIGlmIChkZXZpY2UgPT0gTlVMTCAgfHwgIGRldmljZS0+aGlkZGVuID09IE5VTEwpCisgICAgeworICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICBpZiAoZGV2aWNlKQorICAgICAgICB7CisgICAgICAgICAgZnJlZSAoZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgU0RMX21lbXNldCAoZGV2aWNlLT5oaWRkZW4sIDAsIHNpemVvZiAoKmRldmljZS0+aGlkZGVuKSk7CisKKyAgLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworICBkZXZpY2UtPlZpZGVvSW5pdCA9IERpcmVjdEZCX1ZpZGVvSW5pdDsKKyAgZGV2aWNlLT5MaXN0TW9kZXMgPSBEaXJlY3RGQl9MaXN0TW9kZXM7CisgIGRldmljZS0+U2V0VmlkZW9Nb2RlID0gRGlyZWN0RkJfU2V0VmlkZW9Nb2RlOworICBkZXZpY2UtPlNldENvbG9ycyA9IERpcmVjdEZCX1NldENvbG9yczsKKyAgZGV2aWNlLT5VcGRhdGVSZWN0cyA9IE5VTEw7CisgIGRldmljZS0+Q3JlYXRlWVVWT3ZlcmxheSA9IERpcmVjdEZCX0NyZWF0ZVlVVk92ZXJsYXk7CisgIGRldmljZS0+VmlkZW9RdWl0ID0gRGlyZWN0RkJfVmlkZW9RdWl0OworICBkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gRGlyZWN0RkJfQWxsb2NIV1N1cmZhY2U7CisgIGRldmljZS0+Q2hlY2tIV0JsaXQgPSBEaXJlY3RGQl9DaGVja0hXQmxpdDsKKyAgZGV2aWNlLT5GaWxsSFdSZWN0ID0gRGlyZWN0RkJfRmlsbEhXUmVjdDsKKyAgZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gRGlyZWN0RkJfU2V0SFdDb2xvcktleTsKKyAgZGV2aWNlLT5TZXRIV0FscGhhID0gRGlyZWN0RkJfU2V0SFdBbHBoYTsKKyAgZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gRGlyZWN0RkJfTG9ja0hXU3VyZmFjZTsKKyAgZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBEaXJlY3RGQl9VbmxvY2tIV1N1cmZhY2U7CisgIGRldmljZS0+RmxpcEhXU3VyZmFjZSA9IERpcmVjdEZCX0ZsaXBIV1N1cmZhY2U7CisgIGRldmljZS0+RnJlZUhXU3VyZmFjZSA9IERpcmVjdEZCX0ZyZWVIV1N1cmZhY2U7CisgIGRldmljZS0+U2hvd1dNQ3Vyc29yID0gRGlyZWN0RkJfU2hvd1dNQ3Vyc29yOworICBkZXZpY2UtPlNldENhcHRpb24gPSBOVUxMOworICBkZXZpY2UtPlNldEljb24gPSBOVUxMOworICBkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBOVUxMOworICBkZXZpY2UtPkdyYWJJbnB1dCA9IE5VTEw7CisgIGRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKKyAgZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBEaXJlY3RGQl9Jbml0T1NLZXltYXA7CisgIGRldmljZS0+UHVtcEV2ZW50cyA9IERpcmVjdEZCX1B1bXBFdmVudHM7CisKKyAgZGV2aWNlLT5mcmVlID0gRGlyZWN0RkJfRGVsZXRlRGV2aWNlOworCisgIHJldHVybiBkZXZpY2U7Cit9CisKK1ZpZGVvQm9vdFN0cmFwIERpcmVjdEZCX2Jvb3RzdHJhcCA9IHsKKyAgImRpcmVjdGZiIiwgIkRpcmVjdEZCIiwKKyAgRGlyZWN0RkJfQXZhaWxhYmxlLCBEaXJlY3RGQl9DcmVhdGVEZXZpY2UKK307CisKK3N0YXRpYyBERkJTdXJmYWNlUGl4ZWxGb3JtYXQgR2V0Rm9ybWF0Rm9yQnBwIChpbnQgYnBwLCBJRGlyZWN0RkJEaXNwbGF5TGF5ZXIgKmxheWVyKQoreworICBERkJEaXNwbGF5TGF5ZXJDb25maWcgZGxjOworICBpbnQgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSAoYnBwICsgNykgLyA4OworCisgIGxheWVyLT5HZXRDb25maWd1cmF0aW9uIChsYXllciwgJmRsYyk7CisKKyAgaWYgKGJ5dGVzID09IERGQl9CWVRFU19QRVJfUElYRUwoZGxjLnBpeGVsZm9ybWF0KSAmJiBieXRlcyA+IDEpCisgICAgcmV0dXJuIGRsYy5waXhlbGZvcm1hdDsKKworICBzd2l0Y2ggKGJ5dGVzKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gRFNQRl9MVVQ4OworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiBEU1BGX1JHQjE2OworICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiBEU1BGX1JHQjI0OworICAgIGNhc2UgNDoKKyAgICAgIHJldHVybiBEU1BGX1JHQjMyOworICAgIH0KKworICByZXR1cm4gRFNQRl9VTktOT1dOOworfQorCitzdGF0aWMgREZCRW51bWVyYXRpb25SZXN1bHQgRW51bU1vZGVzQ2FsbGJhY2sgKGludCAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gKFNETF9WaWRlb0RldmljZSAqKWRhdGE7CisgIHN0cnVjdCBEaXJlY3RGQkVudW1SZWN0ICplbnVtcmVjdDsKKworICBISURERU4tPm51bW1vZGVzKys7CisKKyAgaWYgKGVudW1saXN0ICYmIGVudW1saXN0LT5yLncgPT0gd2lkdGggJiYgZW51bWxpc3QtPnIuaCA9PSBoZWlnaHQpCisgICAgcmV0dXJuIERGRU5VTV9PSzsKKworICBlbnVtcmVjdCA9IFNETF9jYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBEaXJlY3RGQkVudW1SZWN0KSk7CisgIGlmICghZW51bXJlY3QpCisgICAgeworICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICByZXR1cm4gREZFTlVNX0NBTkNFTDsKKyAgICB9CisKKyAgZW51bXJlY3QtPnIudyAgPSAoVWludDE2KXdpZHRoOworICBlbnVtcmVjdC0+ci5oICA9IChVaW50MTYpaGVpZ2h0OworICBlbnVtcmVjdC0+bmV4dCA9IGVudW1saXN0OworCisgIGVudW1saXN0ID0gZW51bXJlY3Q7CisKKyAgcmV0dXJuIERGRU5VTV9PSzsKK30KKworc3RydWN0IHByaXZhdGVfaHdkYXRhIHsKKyAgSURpcmVjdEZCU3VyZmFjZSAqc3VyZmFjZTsKKyAgSURpcmVjdEZCUGFsZXR0ZSAqcGFsZXR0ZTsKK307CisKK3ZvaWQgU2V0RGlyZWN0RkJlcnJvciAoY29uc3QgY2hhciAqZnVuY3Rpb24sIERGQlJlc3VsdCBjb2RlKQoreworICBjb25zdCBjaGFyICplcnJvciA9IERpcmVjdEZCRXJyb3JTdHJpbmcgKGNvZGUpOworCisgIGlmIChlcnJvcikKKyAgICBTRExfU2V0RXJyb3IoIiVzOiAlcyIsIGZ1bmN0aW9uLCBlcnJvcik7CisgIGVsc2UKKyAgICBTRExfU2V0RXJyb3IoIlVua25vd24gZXJyb3IgY29kZSBmcm9tICVzIiwgZnVuY3Rpb24pOworfQorCitzdGF0aWMgREZCU3VyZmFjZVBpeGVsRm9ybWF0IFNETFRvREZCUGl4ZWxGb3JtYXQgKFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0KQoreworICBpZiAoZm9ybWF0LT5SbWFzayAmJiBmb3JtYXQtPkdtYXNrICYmIGZvcm1hdC0+Qm1hc2spCisgICAgeworICAgICAgc3dpdGNoIChmb3JtYXQtPkJpdHNQZXJQaXhlbCkKKyAgICAgICAgeworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgcmV0dXJuIERTUEZfTFVUODsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICBpZiAoZm9ybWF0LT5SbWFzayA9PSAweEY4MDAgJiYKKyAgICAgICAgICAgICAgZm9ybWF0LT5HbWFzayA9PSAweDA3RTAgJiYKKyAgICAgICAgICAgICAgZm9ybWF0LT5CbWFzayA9PSAweDAwMUYpCisgICAgICAgICAgICByZXR1cm4gRFNQRl9SR0IxNjsKKyAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICBpZiAoZm9ybWF0LT5SbWFzayA9PSAweDdDMDAgJiYKKyAgICAgICAgICAgICAgZm9ybWF0LT5HbWFzayA9PSAweDAzRTAgJiYKKyAgICAgICAgICAgICAgZm9ybWF0LT5CbWFzayA9PSAweDAwMUYpCisgICAgICAgICAgICByZXR1cm4gRFNQRl9BUkdCMTU1NTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICBpZiAoZm9ybWF0LT5SbWFzayA9PSAweEZGMDAwMCAmJgorICAgICAgICAgICAgICBmb3JtYXQtPkdtYXNrID09IDB4MDBGRjAwICYmCisgICAgICAgICAgICAgIGZvcm1hdC0+Qm1hc2sgPT0gMHgwMDAwRkYpCisgICAgICAgICAgICByZXR1cm4gRFNQRl9SR0IyNDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDMyOgorICAgICAgICAgIGlmIChmb3JtYXQtPlJtYXNrID09IDB4RkYwMDAwICYmCisgICAgICAgICAgICAgIGZvcm1hdC0+R21hc2sgPT0gMHgwMEZGMDAgJiYKKyAgICAgICAgICAgICAgZm9ybWF0LT5CbWFzayA9PSAweDAwMDBGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+QW1hc2sgPT0gMHhGRjAwMDAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRFNQRl9BUkdCOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIERTUEZfUkdCMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKGZvcm1hdC0+Qml0c1BlclBpeGVsKQorCXsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgIHJldHVybiBEU1BGX0xVVDg7CisJY2FzZSAxNToKKwkgIHJldHVybiBEU1BGX0FSR0IxNTU1OworCWNhc2UgMTY6CisJICByZXR1cm4gRFNQRl9SR0IxNjsKKwljYXNlIDI0OgorCSAgcmV0dXJuIERTUEZfUkdCMjQ7CisJY2FzZSAzMjoKKwkgIHJldHVybiBEU1BGX1JHQjMyOworCX0KKyAgICB9CisKKyAgcmV0dXJuIERTUEZfVU5LTk9XTjsKK30KKworc3RhdGljIFNETF9QYWxldHRlICpBbGxvY2F0ZVBhbGV0dGUoaW50IHNpemUpCit7CisgIFNETF9QYWxldHRlICpwYWxldHRlOworICBTRExfQ29sb3IgICAqY29sb3JzOworCisgIHBhbGV0dGUgPSBTRExfY2FsbG9jICgxLCBzaXplb2YoU0RMX1BhbGV0dGUpKTsKKyAgaWYgKCFwYWxldHRlKQorICAgIHsKKyAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGNvbG9ycyA9IFNETF9jYWxsb2MgKHNpemUsIHNpemVvZihTRExfQ29sb3IpKTsKKyAgaWYgKCFjb2xvcnMpCisgICAgeworICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcGFsZXR0ZS0+bmNvbG9ycyA9IHNpemU7CisgIHBhbGV0dGUtPmNvbG9ycyAgPSBjb2xvcnM7CisKKyAgcmV0dXJuIHBhbGV0dGU7Cit9CisKK3N0YXRpYyBpbnQgREZCVG9TRExQaXhlbEZvcm1hdCAoREZCU3VyZmFjZVBpeGVsRm9ybWF0IHBpeGVsZm9ybWF0LCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCkKK3sKKyAgZm9ybWF0LT5BbWFzayA9IGZvcm1hdC0+Um1hc2sgPSBmb3JtYXQtPkdtYXNrID0gZm9ybWF0LT5CbWFzayA9IDA7CisgIGZvcm1hdC0+Qml0c1BlclBpeGVsID0gZm9ybWF0LT5CeXRlc1BlclBpeGVsID0gMDsKKworICBzd2l0Y2ggKHBpeGVsZm9ybWF0KQorICAgIHsKKyAgICBjYXNlIERTUEZfQTg6CisgICAgICBmb3JtYXQtPkFtYXNrID0gMHgwMDAwMDBGRjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEU1BGX0FSR0IxNTU1OgorICAgICAgZm9ybWF0LT5SbWFzayA9IDB4MDAwMDdDMDA7CisgICAgICBmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDNFMDsKKyAgICAgIGZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMDFGOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERTUEZfUkdCMTY6CisgICAgICBmb3JtYXQtPlJtYXNrID0gMHgwMDAwRjgwMDsKKyAgICAgIGZvcm1hdC0+R21hc2sgPSAweDAwMDAwN0UwOworICAgICAgZm9ybWF0LT5CbWFzayA9IDB4MDAwMDAwMUY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFNQRl9BUkdCOgorICAgICAgZm9ybWF0LT5BbWFzayA9IDA7IC8qIGFwcHMgZG9uJ3Qgc2VlbSB0byBsaWtlIHRoYXQ6ICAweEZGMDAwMDAwOyAqLworICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBEU1BGX1JHQjI0OgorICAgIGNhc2UgRFNQRl9SR0IzMjoKKyAgICAgIGZvcm1hdC0+Um1hc2sgPSAweDAwRkYwMDAwOworICAgICAgZm9ybWF0LT5HbWFzayA9IDB4MDAwMEZGMDA7CisgICAgICBmb3JtYXQtPkJtYXNrID0gMHgwMDAwMDBGRjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEU1BGX0xVVDg6CisgICAgICBmb3JtYXQtPlJtYXNrID0gMHgwMDAwMDBGRjsKKyAgICAgIGZvcm1hdC0+R21hc2sgPSAweDAwMDAwMEZGOworICAgICAgZm9ybWF0LT5CbWFzayA9IDB4MDAwMDAwRkY7CisKKyAgICAgIGlmICghZm9ybWF0LT5wYWxldHRlKQorICAgICAgICBmb3JtYXQtPnBhbGV0dGUgPSBBbGxvY2F0ZVBhbGV0dGUoMjU2KTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlNETF9EaXJlY3RGQjogVW5zdXBwb3J0ZWQgcGl4ZWxmb3JtYXQgKDB4JTA4eCkhXG4iLCBwaXhlbGZvcm1hdCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGZvcm1hdC0+Qml0c1BlclBpeGVsICA9IERGQl9CWVRFU19QRVJfUElYRUwocGl4ZWxmb3JtYXQpICogODsKKyAgZm9ybWF0LT5CeXRlc1BlclBpeGVsID0gREZCX0JZVEVTX1BFUl9QSVhFTChwaXhlbGZvcm1hdCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IERpcmVjdEZCX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQoreworICBpbnQgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgREZCUmVzdWx0ICAgICAgICAgICAgICAgIHJldDsKKyNpZiAoRElSRUNURkJfTUFKT1JfVkVSU0lPTiA9PSAwKSAmJiAoRElSRUNURkJfTUlOT1JfVkVSU0lPTiA9PSA5KSAmJiAoRElSRUNURkJfTUlDUk9fVkVSU0lPTiA8IDIzKQorICBERkJDYXJkQ2FwYWJpbGl0aWVzICAgICAgY2FwczsKKyNlbHNlCisgIERGQkdyYXBoaWNzRGV2aWNlRGVzY3JpcHRpb24gY2FwczsKKyNlbmRpZgorICBERkJEaXNwbGF5TGF5ZXJDb25maWcgICAgZGxjOworICBzdHJ1Y3QgRGlyZWN0RkJFbnVtUmVjdCAqcmVjdDsKKyAgSURpcmVjdEZCICAgICAgICAgICAgICAgKmRmYiAgICA9IE5VTEw7CisgIElEaXJlY3RGQkRpc3BsYXlMYXllciAgICpsYXllciAgPSBOVUxMOworICBJRGlyZWN0RkJFdmVudEJ1ZmZlciAgICAqZXZlbnRzID0gTlVMTDsKKworICBISURERU4tPmMybGF5ZXIgPSBOVUxMLCBISURERU4tPmMyZnJhbWUgPSBOVUxMOworICBISURERU4tPmVuYWJsZV9tZ2FfY3J0YzIgPSAwOworICBISURERU4tPm1nYV9jcnRjMl9zdHJldGNoX292ZXJzY2FuID0gMTsKKworICByZXQgPSBEaXJlY3RGQkluaXQgKE5VTEwsIE5VTEwpOworICBpZiAocmV0KQorICAgIHsKKyAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJEaXJlY3RGQkluaXQiLCByZXQpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgcmV0ID0gRGlyZWN0RkJDcmVhdGUgKCZkZmIpOworICBpZiAocmV0KQorICAgIHsKKyAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJEaXJlY3RGQkNyZWF0ZSIsIHJldCk7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICByZXQgPSBkZmItPkdldERpc3BsYXlMYXllciAoZGZiLCBETElEX1BSSU1BUlksICZsYXllcik7CisgIGlmIChyZXQpCisgICAgeworICAgICAgU2V0RGlyZWN0RkJlcnJvciAoImRmYi0+R2V0RGlzcGxheUxheWVyIiwgcmV0KTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIHJldCA9IGRmYi0+Q3JlYXRlSW5wdXRFdmVudEJ1ZmZlciAoZGZiLCBESUNBUFNfQUxMLCBERkJfRkFMU0UsICZldmVudHMpOworICBpZiAocmV0KQorICAgIHsKKyAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJkZmItPkNyZWF0ZUV2ZW50QnVmZmVyIiwgcmV0KTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAKKyAgbGF5ZXItPkVuYWJsZUN1cnNvciAobGF5ZXIsIDEpOworCisgIC8qIFF1ZXJ5IGxheWVyIGNvbmZpZ3VyYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IG1vZGUgYW5kIHBpeGVsZm9ybWF0ICovCisgIGxheWVyLT5HZXRDb25maWd1cmF0aW9uIChsYXllciwgJmRsYyk7CisKKyAgLyogSWYgY3VycmVudCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCB1c2UgTFVUOCBhcyB0aGUgZGVmYXVsdCAqLworICBpZiAoREZCVG9TRExQaXhlbEZvcm1hdCAoZGxjLnBpeGVsZm9ybWF0LCB2Zm9ybWF0KSkKKyAgICBERkJUb1NETFBpeGVsRm9ybWF0IChEU1BGX0xVVDgsIHZmb3JtYXQpOworCisgIC8qIEVudW1lcmF0ZSB0aGUgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZXMgKi8KKyAgcmV0ID0gZGZiLT5FbnVtVmlkZW9Nb2RlcyAoZGZiLCBFbnVtTW9kZXNDYWxsYmFjaywgdGhpcyk7CisgIGlmIChyZXQpCisgICAgeworICAgICAgU2V0RGlyZWN0RkJlcnJvciAoImRmYi0+RW51bVZpZGVvTW9kZXMiLCByZXQpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgSElEREVOLT5tb2RlbGlzdCA9IFNETF9jYWxsb2MgKEhJRERFTi0+bnVtbW9kZXMgKyAxLCBzaXplb2YoU0RMX1JlY3QgKikpOworICBpZiAoIUhJRERFTi0+bW9kZWxpc3QpCisgICAgeworICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICBmb3IgKGkgPSAwLCByZWN0ID0gZW51bWxpc3Q7IHJlY3Q7ICsraSwgcmVjdCA9IHJlY3QtPm5leHQgKQorICAgIHsKKyAgICAgIEhJRERFTi0+bW9kZWxpc3RbaV0gPSAmcmVjdC0+cjsKKyAgICB9CisKKyAgSElEREVOLT5tb2RlbGlzdFtpXSA9IE5VTEw7CisKKworICAvKiBRdWVyeSBjYXJkIGNhcGFiaWxpdGllcyB0byBnZXQgdGhlIHZpZGVvIG1lbW9yeSBzaXplICovCisjaWYgKERJUkVDVEZCX01BSk9SX1ZFUlNJT04gPT0gMCkgJiYgKERJUkVDVEZCX01JTk9SX1ZFUlNJT04gPT0gOSkgJiYgKERJUkVDVEZCX01JQ1JPX1ZFUlNJT04gPCAyMykKKyAgZGZiLT5HZXRDYXJkQ2FwYWJpbGl0aWVzIChkZmIsICZjYXBzKTsKKyNlbHNlCisgIGRmYi0+R2V0RGV2aWNlRGVzY3JpcHRpb24gKGRmYiwgJmNhcHMpOworI2VuZGlmCisKKyAgdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAxOworICB0aGlzLT5pbmZvLmh3X2F2YWlsYWJsZSA9IDE7CisgIHRoaXMtPmluZm8uYmxpdF9odyAgICAgID0gMTsKKyAgdGhpcy0+aW5mby5ibGl0X2h3X0NDICAgPSAxOworICB0aGlzLT5pbmZvLmJsaXRfaHdfQSAgICA9IDE7CisgIHRoaXMtPmluZm8uYmxpdF9maWxsICAgID0gMTsKKyAgdGhpcy0+aW5mby52aWRlb19tZW0gICAgPSBjYXBzLnZpZGVvX21lbW9yeSAvIDEwMjQ7CisgIHRoaXMtPmluZm8uY3VycmVudF93ICAgID0gZGxjLndpZHRoOyAgCisgIHRoaXMtPmluZm8uY3VycmVudF9oICAgID0gZGxjLmhlaWdodDsKKworICBISURERU4tPmluaXRpYWxpemVkID0gMTsKKyAgSElEREVOLT5kZmIgICAgICAgICA9IGRmYjsKKyAgSElEREVOLT5sYXllciAgICAgICA9IGxheWVyOworICBISURERU4tPmV2ZW50YnVmZmVyID0gZXZlbnRzOworCisgIGlmIChTRExfZ2V0ZW52KCJTRExfRElSRUNURkJfTUdBX0NSVEMyIikgIT0gTlVMTCkKKyAgICBISURERU4tPmVuYWJsZV9tZ2FfY3J0YzIgPSAxOworICAKKyAgaWYgKEhJRERFTi0+ZW5hYmxlX21nYV9jcnRjMikKKyAgICB7CisgICAgICBERkJEaXNwbGF5TGF5ZXJDb25maWcgICAgICBkbGM7CisgICAgICBERkJEaXNwbGF5TGF5ZXJDb25maWdGbGFncyBmYWlsZWQ7CisKKyAgICAgIHJldCA9IGRmYi0+R2V0RGlzcGxheUxheWVyIChkZmIsIDIsICZISURERU4tPmMybGF5ZXIpOworICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJkZmItPkdldERpc3BsYXlMYXllcihDUlRDMikiLCByZXQpOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgcmV0ID0gSElEREVOLT5sYXllci0+U2V0Q29vcGVyYXRpdmVMZXZlbChISURERU4tPmxheWVyLCBETFNDTF9FWENMVVNJVkUpOworICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJsYXllci0+U2V0Q29vcGVyYXRpdmVMZXZlbChDUlRDMiwgRVhDTFVTSVZFKSIsIHJldCk7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorIAorICAgICAgcmV0ID0gSElEREVOLT5jMmxheWVyLT5TZXRDb29wZXJhdGl2ZUxldmVsKEhJRERFTi0+YzJsYXllciwgRExTQ0xfRVhDTFVTSVZFKTsKKyAgICAgIGlmIChyZXQpCisgICAgICAgIHsKKyAgICAgICAgICBTZXREaXJlY3RGQmVycm9yICgiYzJsYXllci0+U2V0Q29vcGVyYXRpdmVMZXZlbChDUlRDMiwgRVhDTFVTSVZFKSIsIHJldCk7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICBISURERU4tPmMybGF5ZXItPlNldE9wYWNpdHkoSElEREVOLT5jMmxheWVyLCAweDApOworCisgICAgICAvKiBJbml0IHRoZSBzdXJmYWNlIGhlcmUgYXMgaXQgZ290IGEgZml4ZWQgc2l6ZSAqLworICAgICAgZGxjLmZsYWdzICAgICAgPSBETENPTkZfUElYRUxGT1JNQVQgfCBETENPTkZfQlVGRkVSTU9ERTsKKyAgICAgIGRsYy5idWZmZXJtb2RlID0gRExCTV9CQUNLVklERU87CisgICAgICBkbGMucGl4ZWxmb3JtYXQgPSBEU1BGX1JHQjMyOworICAgICAgCisgICAgICByZXQgPSBISURERU4tPmMybGF5ZXItPlRlc3RDb25maWd1cmF0aW9uKCBISURERU4tPmMybGF5ZXIsICZkbGMsICZmYWlsZWQgKTsKKyAgICAgIGlmIChyZXQpCisgICAgICAgIHsKKyAgICAgICAgICBTZXREaXJlY3RGQmVycm9yICgiYzJsYXllci0+VGVzdENvbmZpZ3VyYXRpb24iLCByZXQpOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAKKyAgICAgIHJldCA9IEhJRERFTi0+YzJsYXllci0+U2V0Q29uZmlndXJhdGlvbiggSElEREVOLT5jMmxheWVyLCAmZGxjICk7CisgICAgICBpZiAocmV0KQorICAgICAgICB7CisgICAgICAgICAgU2V0RGlyZWN0RkJlcnJvciAoImMybGF5ZXItPlNldENvbmZpZ3VyYXRpb24iLCByZXQpOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAKKyAgICAgIHJldCA9IEhJRERFTi0+YzJsYXllci0+R2V0U3VyZmFjZSggSElEREVOLT5jMmxheWVyLCAmSElEREVOLT5jMmZyYW1lICk7CisgICAgICBpZiAocmV0KQorICAgICAgICB7CisgICAgICAgICAgU2V0RGlyZWN0RkJlcnJvciAoImMybGF5ZXItPkdldFN1cmZhY2UiLCByZXQpOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgSElEREVOLT5jMmZyYW1lc2l6ZS54ID0gMDsKKyAgICAgIEhJRERFTi0+YzJmcmFtZXNpemUueSA9IDA7CisgICAgICBISURERU4tPmMyZnJhbWUtPkdldFNpemUoIEhJRERFTi0+YzJmcmFtZSwgJkhJRERFTi0+YzJmcmFtZXNpemUudywgJkhJRERFTi0+YzJmcmFtZXNpemUuaCk7CisKKyAgICAgIEhJRERFTi0+YzJmcmFtZS0+U2V0QmxpdHRpbmdGbGFncyggSElEREVOLT5jMmZyYW1lLCBEU0JMSVRfTk9GWCApOworICAgICAgSElEREVOLT5jMmZyYW1lLT5TZXRDb2xvciggSElEREVOLT5jMmZyYW1lLCAwLCAwLCAwLCAweGZmICk7CisgICAgCisgICAgICAvKiBDbGVhciBDUlRDMiAqLworICAgICAgSElEREVOLT5jMmZyYW1lLT5DbGVhcihISURERU4tPmMyZnJhbWUsIDAsIDAsIDAsIDB4ZmYgKTsKKyAgICAgIEhJRERFTi0+YzJmcmFtZS0+RmxpcChISURERU4tPmMyZnJhbWUsIE5VTEwsIDAgKTsKKyAgICAgIEhJRERFTi0+YzJmcmFtZS0+Q2xlYXIoSElEREVOLT5jMmZyYW1lLCAwLCAwLCAwLCAweGZmICk7CisgICAgICBISURERU4tPmMyZnJhbWUtPkZsaXAoSElEREVOLT5jMmZyYW1lLCBOVUxMLCAwICk7CisgICAgICBISURERU4tPmMyZnJhbWUtPkNsZWFyKEhJRERFTi0+YzJmcmFtZSwgMCwgMCwgMCwgMHhmZiApOworCisgICAgICBISURERU4tPmMybGF5ZXItPlNldE9wYWNpdHkoSElEREVOLT5jMmxheWVyLCAweEZGICk7CisgICAgCisgICAgICAvKiBDaGVjayBpZiBvdmVyc2NhbiBpcyBwb3NzaWJseSBzZXQgKi8KKyAgICAgIGlmIChTRExfZ2V0ZW52KCJTRExfRElSRUNURkJfTUdBX09WRVJTQ0FOIikgIT0gTlVMTCkKKyAgICAgICAgeworCSAgICBmbG9hdCBvdmVyc2NhbiA9IDA7CisJICAgIGlmIChTRExfc3NjYW5mKFNETF9nZXRlbnYoIlNETF9ESVJFQ1RGQl9NR0FfT1ZFUlNDQU4iKSwgIiVmIiwgJm92ZXJzY2FuKSA9PSAxKQorICAgICAgICAgICAgICAgaWYgKG92ZXJzY2FuID4gMCAmJiBvdmVyc2NhbiA8IDIpCisJCSAgSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaF9vdmVyc2NhbiA9IG92ZXJzY2FuOworCX0KKworICAgICAgI2lmZGVmIERJUkVDVEZCX0NSVEMyX0RFQlVHCisgICAgICBwcmludGYoIkNSVEMyIG92ZXJzY2FuOiAlZlxuIiwgSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaF9vdmVyc2Nhbik7CisgICAgICAjZW5kaWYKKyAgICB9CisKKyAgcmV0dXJuIDA7CisKKyBlcnJvcjoKKyAgaWYgKGV2ZW50cykKKyAgICBldmVudHMtPlJlbGVhc2UgKGV2ZW50cyk7CisgIAorICBpZiAoSElEREVOLT5jMmZyYW1lKQorICAgIEhJRERFTi0+YzJmcmFtZS0+UmVsZWFzZSAoSElEREVOLT5jMmZyYW1lKTsKKworICBpZiAoSElEREVOLT5jMmxheWVyKQorICAgIEhJRERFTi0+YzJsYXllci0+UmVsZWFzZSAoSElEREVOLT5jMmxheWVyKTsKKworICBpZiAobGF5ZXIpCisgICAgbGF5ZXItPlJlbGVhc2UgKGxheWVyKTsKKworICBpZiAoZGZiKQorICAgIGRmYi0+UmVsZWFzZSAoZGZiKTsKKworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBTRExfUmVjdCAqKkRpcmVjdEZCX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKyAgaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pCisgICAgcmV0dXJuIEhJRERFTi0+bW9kZWxpc3Q7CisgIGVsc2UKKyAgICBpZiAoU0RMVG9ERkJQaXhlbEZvcm1hdCAoZm9ybWF0KSAhPSBEU1BGX1VOS05PV04pCisgICAgICByZXR1cm4gKFNETF9SZWN0KiopIC0xOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgU0RMX1N1cmZhY2UgKkRpcmVjdEZCX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworICBERkJSZXN1bHQgICAgICAgICAgICAgIHJldDsKKyAgREZCU3VyZmFjZURlc2NyaXB0aW9uICBkc2M7CisgIERGQlN1cmZhY2VQaXhlbEZvcm1hdCAgcGl4ZWxmb3JtYXQ7CisgIElEaXJlY3RGQlN1cmZhY2UgICAgICAqc3VyZmFjZTsKKworICBmcHJpbnRmIChzdGRlcnIsICJTREwgRGlyZWN0RkJfU2V0VmlkZW9Nb2RlOiAlZHglZEAlZCwgZmxhZ3M6IDB4JTA4eFxuIiwKKyAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYnBwLCBmbGFncyk7CisKKyAgZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisKKyAgLyogUmVsZWFzZSBwcmV2aW91cyBwcmltYXJ5IHN1cmZhY2UgKi8KKyAgaWYgKGN1cnJlbnQtPmh3ZGF0YSAmJiBjdXJyZW50LT5od2RhdGEtPnN1cmZhY2UpCisgICAgeworICAgICAgY3VycmVudC0+aHdkYXRhLT5zdXJmYWNlLT5SZWxlYXNlIChjdXJyZW50LT5od2RhdGEtPnN1cmZhY2UpOworICAgICAgY3VycmVudC0+aHdkYXRhLT5zdXJmYWNlID0gTlVMTDsKKworICAgICAgLyogQW5kIGl0cyBwYWxldHRlIGlmIHByZXNlbnQgKi8KKyAgICAgIGlmIChjdXJyZW50LT5od2RhdGEtPnBhbGV0dGUpCisgICAgICAgIHsKKyAgICAgICAgICBjdXJyZW50LT5od2RhdGEtPnBhbGV0dGUtPlJlbGVhc2UgKGN1cnJlbnQtPmh3ZGF0YS0+cGFsZXR0ZSk7CisgICAgICAgICAgY3VycmVudC0+aHdkYXRhLT5wYWxldHRlID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoIWN1cnJlbnQtPmh3ZGF0YSkKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSB0aGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGRhdGEgKi8KKyAgICAgIGN1cnJlbnQtPmh3ZGF0YSA9IChzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgKikgU0RMX2NhbGxvYyAoMSwgc2l6ZW9mKCpjdXJyZW50LT5od2RhdGEpKTsKKyAgICAgIGlmICghY3VycmVudC0+aHdkYXRhKQorICAgICAgICB7CisgICAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAvKiBTZXQgY29vcGVyYXRpdmUgbGV2ZWwgZGVwZW5kaW5nIG9uIGZsYWcgU0RMX0ZVTExTQ1JFRU4gKi8KKyAgaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pCisgICAgeworICAgICAgcmV0ID0gSElEREVOLT5kZmItPlNldENvb3BlcmF0aXZlTGV2ZWwgKEhJRERFTi0+ZGZiLCBERlNDTF9GVUxMU0NSRUVOKTsKKyAgICAgIGlmIChyZXQgJiYgIUhJRERFTi0+ZW5hYmxlX21nYV9jcnRjMikKKyAgICAgICAgeworICAgICAgICAgIERpcmVjdEZCRXJyb3IgKCJkZmItPlNldENvb3BlcmF0aXZlTGV2ZWwiLCByZXQpOworICAgICAgICAgIGZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIEhJRERFTi0+ZGZiLT5TZXRDb29wZXJhdGl2ZUxldmVsIChISURERU4tPmRmYiwgREZTQ0xfTk9STUFMKTsKKworICAvKiBTZXQgdmlkZW8gbW9kZSAqLworICByZXQgPSBISURERU4tPmRmYi0+U2V0VmlkZW9Nb2RlIChISURERU4tPmRmYiwgd2lkdGgsIGhlaWdodCwgYnBwKTsKKyAgaWYgKHJldCkKKyAgICB7CisgICAgICBpZiAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikKKyAgICAgICAgeworICAgICAgICAgIGZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKKyAgICAgICAgICBISURERU4tPmRmYi0+U2V0Q29vcGVyYXRpdmVMZXZlbCAoSElEREVOLT5kZmIsIERGU0NMX05PUk1BTCk7CisgICAgICAgICAgcmV0ID0gSElEREVOLT5kZmItPlNldFZpZGVvTW9kZSAoSElEREVOLT5kZmIsIHdpZHRoLCBoZWlnaHQsIGJwcCk7CisgICAgICAgIH0KKworICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJkZmItPlNldFZpZGVvTW9kZSIsIHJldCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQ3JlYXRlIHByaW1hcnkgc3VyZmFjZSAqLworICBkc2MuZmxhZ3MgICAgICAgPSBEU0RFU0NfQ0FQUyB8IERTREVTQ19QSVhFTEZPUk1BVDsKKyAgZHNjLmNhcHMgICAgICAgID0gRFNDQVBTX1BSSU1BUlkgfCAoKGZsYWdzICYgU0RMX0RPVUJMRUJVRikgPyBEU0NBUFNfRkxJUFBJTkcgOiAwKTsKKyAgZHNjLnBpeGVsZm9ybWF0ID0gR2V0Rm9ybWF0Rm9yQnBwIChicHAsIEhJRERFTi0+bGF5ZXIpOworCisgIHJldCA9IEhJRERFTi0+ZGZiLT5DcmVhdGVTdXJmYWNlIChISURERU4tPmRmYiwgJmRzYywgJnN1cmZhY2UpOworICBpZiAocmV0ICYmIChmbGFncyAmIFNETF9ET1VCTEVCVUYpKQorICAgIHsKKyAgICAgIC8qIFRyeSB3aXRob3V0IGRvdWJsZSBidWZmZXJpbmcgKi8KKyAgICAgIGRzYy5jYXBzICY9IH5EU0NBUFNfRkxJUFBJTkc7CisgICAgICByZXQgPSBISURERU4tPmRmYi0+Q3JlYXRlU3VyZmFjZSAoSElEREVOLT5kZmIsICZkc2MsICZzdXJmYWNlKTsKKyAgICB9CisgIGlmIChyZXQpCisgICAgeworICAgICAgU2V0RGlyZWN0RkJlcnJvciAoImRmYi0+Q3JlYXRlU3VyZmFjZSIsIHJldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY3VycmVudC0+dyAgICAgPSB3aWR0aDsKKyAgY3VycmVudC0+aCAgICAgPSBoZWlnaHQ7CisgIGN1cnJlbnQtPmZsYWdzID0gU0RMX0hXU1VSRkFDRSB8IFNETF9QUkVBTExPQzsKKworICBpZiAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikKKyAgICB7CisgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKyAgICAgIHRoaXMtPlVwZGF0ZVJlY3RzID0gRGlyZWN0RkJfRGlyZWN0VXBkYXRlOworICAgIH0KKyAgZWxzZQorICAgIHRoaXMtPlVwZGF0ZVJlY3RzID0gRGlyZWN0RkJfV2luZG93ZWRVcGRhdGU7CisKKyAgaWYgKGRzYy5jYXBzICYgRFNDQVBTX0ZMSVBQSU5HKQorICAgIGN1cnJlbnQtPmZsYWdzIHw9IFNETF9ET1VCTEVCVUY7CisKKyAgc3VyZmFjZS0+R2V0UGl4ZWxGb3JtYXQgKHN1cmZhY2UsICZwaXhlbGZvcm1hdCk7CisKKyAgREZCVG9TRExQaXhlbEZvcm1hdCAocGl4ZWxmb3JtYXQsIGN1cnJlbnQtPmZvcm1hdCk7CisKKyAgLyogR2V0IHRoZSBzdXJmYWNlIHBhbGV0dGUgKGlmIHN1cHBvcnRlZCkgKi8KKyAgaWYgKERGQl9QSVhFTEZPUk1BVF9JU19JTkRFWEVEKCBwaXhlbGZvcm1hdCApKQorICAgIHsKKyAgICAgIHN1cmZhY2UtPkdldFBhbGV0dGUgKHN1cmZhY2UsICZjdXJyZW50LT5od2RhdGEtPnBhbGV0dGUpOworCisgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOworICAgIH0KKworICBjdXJyZW50LT5od2RhdGEtPnN1cmZhY2UgPSBzdXJmYWNlOworCisgIC8qIE1HQSBDUlRDMiBzdHVmZiAqLworICBpZiAoSElEREVOLT5lbmFibGVfbWdhX2NydGMyKQorICAgIHsKKyAgICAgIC8qIG5vIHN0cmV0Y2hpbmcgaWYgYzJzc2l6ZSA9PSBjMmZyYW1lc2l6ZSAqLworICAgICAgSElEREVOLT5jMnNzaXplLnggPSAwLCBISURERU4tPmMyc3NpemUueSA9IDA7CisgICAgICBISURERU4tPmMyc3NpemUudyA9IHdpZHRoOworICAgICAgSElEREVOLT5jMnNzaXplLmggPSBoZWlnaHQ7CisKKyAgICAgIEhJRERFTi0+YzJkc2l6ZS54ID0gMCwgSElEREVOLT5jMmRzaXplLnkgPSAwOworICAgICAgSElEREVOLT5jMmRzaXplLncgPSB3aWR0aDsKKyAgICAgIEhJRERFTi0+YzJkc2l6ZS5oID0gaGVpZ2h0OworCisgICAgICBISURERU4tPm1nYV9jcnRjMl9zdHJldGNoID0gMDsKKworICAgICAgaWYgKFNETF9nZXRlbnYoIlNETF9ESVJFQ1RGQl9NR0FfU1RSRVRDSCIpICE9IE5VTEwpCisgICAgICAgIHsKKwkgICAgLyogTm9ybWFsbHkgYXNzdW1lIGEgcGljdHVyZSBhc3BlY3QgcmF0aW8gb2YgNDozICovCisJICAgIGludCB6b29tX2FzcGVjdF94ID0gNCwgem9vbV9hc3BlY3RfeSA9IDMsIGksIGo7CisKKwkgICAgZm9yIChpID0gMTsgaSA8IDIwOyBpKyspCisJICAgICAgeworCQlmb3IgKGogPSAxOyBqIDwgMTA7IGorKykKKwkJICB7CisJCSAgICBpZiAoKGZsb2F0KXdpZHRoLyhmbG9hdClpKihmbG9hdClqID09IGhlaWdodCkgCisJCSAgICAgIHsKKwkJCXpvb21fYXNwZWN0X3ggPSBpOworCQkJem9vbV9hc3BlY3RfeSA9IGo7CisJCQkKKwkJCS8qIGJyZWFrIHRoZSBsb29wICovCisJCQlpID0gMjE7CisJCQlicmVhazsKKwkJICAgICAgfQorCQkgIH0KKwkgICAgICB9CisJCisgICAgICAgICAgICAjaWZkZWYgRElSRUNURkJfQ1JUQzJfREVCVUcKKyAgICAgICAgICAgIHByaW50ZigiU291cmNlIHJlc29sdXRpb246IFg6ICVkLCBZOiAlZCwgQXNwZWN0IHJhdGlvOiAlZDolZFxuIiwgd2lkdGgsIGhlaWdodCwgem9vbV9hc3BlY3RfeCwgem9vbV9hc3BlY3RfeSk7CisgICAgICAgICAgICBwcmludGYoIkNSVEMyIHJlc29sdXRpb246IFg6ICVkLCBZOiAlZFxuIiwgSElEREVOLT5jMmZyYW1lc2l6ZS53LCBISURERU4tPmMyZnJhbWVzaXplLmgpOworICAgICAgICAgICAgI2VuZGlmCisJCisgICAgICAgICAgLyogZG9uJ3Qgc3RyZXRjaCBvbmx5IHNsaWdodGx5IHNtYWxsZXIvbGFyZ2VyIGltYWdlcyAqLworICAgICAgICAgIGlmICgoZmxvYXQpd2lkdGggPCAoZmxvYXQpSElEREVOLT5jMmZyYW1lc2l6ZS53KjAuOTUgfHwgKGZsb2F0KWhlaWdodCA8IChmbG9hdClISURERU4tPmMyZnJhbWVzaXplLmgqMC45NSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgd2hpbGUgKChmbG9hdClISURERU4tPmMyZHNpemUudyA8IChmbG9hdClISURERU4tPmMyZnJhbWVzaXplLncqSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaF9vdmVyc2NhbiAmJiAoZmxvYXQpSElEREVOLT5jMmRzaXplLmggPCAoZmxvYXQpSElEREVOLT5jMmZyYW1lc2l6ZS5oKkhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2hfb3ZlcnNjYW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIEhJRERFTi0+YzJkc2l6ZS53Kz16b29tX2FzcGVjdF94OworICAgICAgICAgICAgICAgICAgIEhJRERFTi0+YzJkc2l6ZS5oKz16b29tX2FzcGVjdF95OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBvbmUgc3RlcCBkb3duICovCisgICAgICAgICAgICAgICAgSElEREVOLT5jMmRzaXplLnctPXpvb21fYXNwZWN0X3g7CisgICAgICAgICAgICAgICAgSElEREVOLT5jMmRzaXplLmgtPXpvb21fYXNwZWN0X3k7CisKKyAgICAgICAgICAgICAgI2lmZGVmIERJUkVDVEZCX0NSVEMyX0RFQlVHCisgICAgICAgICAgICAgIHByaW50ZigiU3RyZXRjaGVkIHJlc29sdXRpb246IFg6ICVkLCBZOiAlZFxuIiwgSElEREVOLT5jMmRzaXplLncsIEhJRERFTi0+YzJkc2l6ZS5oKTsKKyAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaCA9IDE7CisgICAgICAgICAgICB9IAorICAgICAgICAgIGVsc2UgaWYgKChmbG9hdCl3aWR0aCA+IChmbG9hdClISURERU4tPmMyZnJhbWVzaXplLncqMC45NSB8fCAoZmxvYXQpaGVpZ2h0ID4gKGZsb2F0KUhJRERFTi0+YzJmcmFtZXNpemUuaCowLjk1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgd2hpbGUgKChmbG9hdClISURERU4tPmMyZHNpemUudyA+IChmbG9hdClISURERU4tPmMyZnJhbWVzaXplLncqSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaF9vdmVyc2NhbiB8fCAoZmxvYXQpSElEREVOLT5jMmRzaXplLmggPiAoZmxvYXQpSElEREVOLT5jMmZyYW1lc2l6ZS5oKkhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2hfb3ZlcnNjYW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBISURERU4tPmMyZHNpemUudy09em9vbV9hc3BlY3RfeDsKKyAgICAgICAgICAgICAgSElEREVOLT5jMmRzaXplLmgtPXpvb21fYXNwZWN0X3k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgI2lmZGVmIERJUkVDVEZCX0NSVEMyX0RFQlVHCisgICAgICAgICAgICAgIHByaW50ZigiRG93bi1TdHJldGNoZWQgcmVzb2x1dGlvbjogWDogJWQsIFk6ICVkXG4iLCBISURERU4tPmMyZHNpemUudywgSElEREVOLT5jMmRzaXplLmgpOworICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICBISURERU4tPm1nYV9jcnRjMl9zdHJldGNoID0gMTsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICNpZmRlZiBESVJFQ1RGQl9DUlRDMl9ERUJVRworICAgICAgICAgIHByaW50ZigiTm90IHN0cmV0Y2hpbmcgaW1hZ2VcbiIpOworICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisKKyAgICAgIC8qIFBhbm5pbmcgKi8KKyAgICAgIGlmIChISURERU4tPmMyZnJhbWVzaXplLncgPiBISURERU4tPmMyZHNpemUudykKKyAgICAgICAgSElEREVOLT5jMmRzaXplLnggPSAoSElEREVOLT5jMmZyYW1lc2l6ZS53IC0gSElEREVOLT5jMmRzaXplLncpICAvIDI7CisgICAgICBlbHNlCisgICAgICAgIEhJRERFTi0+YzJkc2l6ZS54ID0gKEhJRERFTi0+YzJkc2l6ZS53IC0gSElEREVOLT5jMmZyYW1lc2l6ZS53KSAgLyAyOworCisgICAgICBpZiAoSElEREVOLT5jMmZyYW1lc2l6ZS5oID4gSElEREVOLT5jMmRzaXplLmgpCisgICAgICAgIEhJRERFTi0+YzJkc2l6ZS55ID0gKEhJRERFTi0+YzJmcmFtZXNpemUuaCAtIEhJRERFTi0+YzJkc2l6ZS5oKSAgLyAyOworICAgICAgZWxzZQorICAgICAgICBISURERU4tPmMyZHNpemUueSA9IChISURERU4tPmMyZHNpemUuaCAtIEhJRERFTi0+YzJmcmFtZXNpemUuaCkgIC8gMjsKKworICAgICAgI2lmZGVmIERJUkVDVEZCX0NSVEMyX0RFQlVHCisgICAgcHJpbnRmKCJDUlRDMiBwb3NpdGlvbiBYOiAlZCwgWTogJWRcbiIsIEhJRERFTi0+YzJkc2l6ZS54LCBISURERU4tPmMyZHNpemUueSk7CisgICAgICAjZW5kaWYKKyAgIH0KKyAgfQorCisgIHJldHVybiBjdXJyZW50OworfQorCitzdGF0aWMgaW50IERpcmVjdEZCX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgREZCUmVzdWx0ICAgICAgICAgICAgIHJldDsKKyAgREZCU3VyZmFjZURlc2NyaXB0aW9uIGRzYzsKKworICAvKiAgZnByaW50ZihzdGRlcnIsICJTREw6IERpcmVjdEZCX0FsbG9jSFdTdXJmYWNlICglZHglZEAlZCwgZmxhZ3M6IDB4JTA4eClcbiIsCisgICAgICBzdXJmYWNlLT53LCBzdXJmYWNlLT5oLCBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCwgc3VyZmFjZS0+ZmxhZ3MpOyovCisKKyAgaWYgKHN1cmZhY2UtPncgPCA4IHx8IHN1cmZhY2UtPmggPCA4KQorICAgIHJldHVybiAtMTsKKworICAvKiBmaWxsIHN1cmZhY2UgZGVzY3JpcHRpb24gKi8KKyAgZHNjLmZsYWdzICA9IERTREVTQ19XSURUSCB8IERTREVTQ19IRUlHSFQgfCBEU0RFU0NfUElYRUxGT1JNQVQgfCBEU0RFU0NfQ0FQUzsKKyAgZHNjLndpZHRoICA9IHN1cmZhY2UtPnc7CisgIGRzYy5oZWlnaHQgPSBzdXJmYWNlLT5oOworICBkc2MuY2FwcyAgID0gKHN1cmZhY2UtPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPyBEU0NBUFNfRkxJUFBJTkcgOiAwOworCisgIC8qIGZpbmQgdGhlIHJpZ2h0IHBpeGVsZm9ybWF0ICovCisgIGRzYy5waXhlbGZvcm1hdCA9IFNETFRvREZCUGl4ZWxGb3JtYXQgKHN1cmZhY2UtPmZvcm1hdCk7CisgIGlmIChkc2MucGl4ZWxmb3JtYXQgPT0gRFNQRl9VTktOT1dOKQorICAgIHJldHVybiAtMTsKKworICAvKiBBbGxvY2F0ZSB0aGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGRhdGEgKi8KKyAgc3VyZmFjZS0+aHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX2h3ZGF0YSAqKSBTRExfY2FsbG9jICgxLCBzaXplb2YoKnN1cmZhY2UtPmh3ZGF0YSkpOworICBpZiAoc3VyZmFjZS0+aHdkYXRhID09IE5VTEwpCisgICAgeworICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qIENyZWF0ZSB0aGUgc3VyZmFjZSAqLworICByZXQgPSBISURERU4tPmRmYi0+Q3JlYXRlU3VyZmFjZSAoSElEREVOLT5kZmIsICZkc2MsICZzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UpOworICBpZiAocmV0KQorICAgIHsKKyAgICAgIFNldERpcmVjdEZCZXJyb3IgKCJkZmItPkNyZWF0ZVN1cmZhY2UiLCByZXQpOworICAgICAgZnJlZSAoc3VyZmFjZS0+aHdkYXRhKTsKKyAgICAgIHN1cmZhY2UtPmh3ZGF0YSA9IE5VTEw7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHN1cmZhY2UtPmZsYWdzIHw9IFNETF9IV1NVUkZBQ0UgfCBTRExfUFJFQUxMT0M7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIERpcmVjdEZCX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworICBpZiAoc3VyZmFjZS0+aHdkYXRhICYmIEhJRERFTi0+aW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgc3VyZmFjZS0+aHdkYXRhLT5zdXJmYWNlLT5SZWxlYXNlIChzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UpOworICAgICAgZnJlZSAoc3VyZmFjZS0+aHdkYXRhKTsKKyAgICAgIHN1cmZhY2UtPmh3ZGF0YSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgaW50IERpcmVjdEZCX0NoZWNrSFdCbGl0KF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KQoreworICAvKiAgZnByaW50ZihzdGRlcnIsICJTREw6IERpcmVjdEZCX0NoZWNrSFdCbGl0IChzcmMtPmh3ZGF0YTogJXAsIGRzdC0+aHdkYXRhOiAlcClcbiIsCisgICAgICBzcmMtPmh3ZGF0YSwgZHN0LT5od2RhdGEpOyovCisKKyAgaWYgKCFzcmMtPmh3ZGF0YSB8fCAhZHN0LT5od2RhdGEpCisgICAgcmV0dXJuIDA7CisKKyAgc3JjLT5mbGFncyB8PSBTRExfSFdBQ0NFTDsKKyAgc3JjLT5tYXAtPmh3X2JsaXQgPSBEaXJlY3RGQl9IV0FjY2VsQmxpdDsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBEaXJlY3RGQl9IV0FjY2VsQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCit7CisgIERGQlN1cmZhY2VCbGl0dGluZ0ZsYWdzIGZsYWdzID0gRFNCTElUX05PRlg7CisKKyAgREZCUmVjdGFuZ2xlIHNyID0geyBzcmNyZWN0LT54LCBzcmNyZWN0LT55LCBzcmNyZWN0LT53LCBzcmNyZWN0LT5oIH07CisgIERGQlJlY3RhbmdsZSBkciA9IHsgZHN0cmVjdC0+eCwgZHN0cmVjdC0+eSwgZHN0cmVjdC0+dywgZHN0cmVjdC0+aCB9OworCisgIElEaXJlY3RGQlN1cmZhY2UgKnN1cmZhY2UgPSBkc3QtPmh3ZGF0YS0+c3VyZmFjZTsKKworICBpZiAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkKKyAgICB7CisgICAgICBmbGFncyB8PSBEU0JMSVRfU1JDX0NPTE9SS0VZOworICAgICAgRGlyZWN0RkJfU2V0SFdDb2xvcktleSAoTlVMTCwgc3JjLCBzcmMtPmZvcm1hdC0+Y29sb3JrZXkpOworICAgIH0KKworICBpZiAoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkKKyAgICB7CisgICAgICBmbGFncyB8PSBEU0JMSVRfQkxFTkRfQ09MT1JBTFBIQTsKKyAgICAgIHN1cmZhY2UtPlNldENvbG9yIChzdXJmYWNlLCAweGZmLCAweGZmLCAweGZmLCBzcmMtPmZvcm1hdC0+YWxwaGEpOworICAgIH0KKworICBzdXJmYWNlLT5TZXRCbGl0dGluZ0ZsYWdzIChzdXJmYWNlLCBmbGFncyk7CisKKyAgaWYgKHNyLncgPT0gZHIudyAmJiBzci5oID09IGRyLmgpCisgICAgc3VyZmFjZS0+QmxpdCAoc3VyZmFjZSwgc3JjLT5od2RhdGEtPnN1cmZhY2UsICZzciwgZHIueCwgZHIueSk7CisgIGVsc2UKKyAgICBzdXJmYWNlLT5TdHJldGNoQmxpdCAoc3VyZmFjZSwgc3JjLT5od2RhdGEtPnN1cmZhY2UsICZzciwgJmRyKTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBEaXJlY3RGQl9GaWxsSFdSZWN0KF9USElTLCBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCwgVWludDMyIGNvbG9yKQoreworICBTRExfUGl4ZWxGb3JtYXQgICpmbXQgICAgID0gZHN0LT5mb3JtYXQ7CisgIElEaXJlY3RGQlN1cmZhY2UgKnN1cmZhY2UgPSBkc3QtPmh3ZGF0YS0+c3VyZmFjZTsKKworICAvKiB1Z2x5ICovCisgIHN1cmZhY2UtPlNldENvbG9yIChzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgKGNvbG9yICYgZm10LT5SbWFzaykgPj4gKGZtdC0+UnNoaWZ0IC0gZm10LT5SbG9zcyksCisgICAgICAgICAgICAgICAgICAgICAoY29sb3IgJiBmbXQtPkdtYXNrKSA+PiAoZm10LT5Hc2hpZnQgLSBmbXQtPkdsb3NzKSwKKyAgICAgICAgICAgICAgICAgICAgIChjb2xvciAmIGZtdC0+Qm1hc2spIDw8IChmbXQtPkJsb3NzIC0gZm10LT5Cc2hpZnQpLCAweEZGKTsKKyAgc3VyZmFjZS0+RmlsbFJlY3RhbmdsZSAoc3VyZmFjZSwgZHN0cmVjdC0+eCwgZHN0cmVjdC0+eSwgZHN0cmVjdC0+dywgZHN0cmVjdC0+aCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRGlyZWN0RkJfU2V0SFdDb2xvcktleShfVEhJUywgU0RMX1N1cmZhY2UgKnNyYywgVWludDMyIGtleSkKK3sKKyAgU0RMX1BpeGVsRm9ybWF0ICAqZm10ICAgICA9IHNyYy0+Zm9ybWF0OworICBJRGlyZWN0RkJTdXJmYWNlICpzdXJmYWNlID0gc3JjLT5od2RhdGEtPnN1cmZhY2U7CisKKyAgaWYgKGZtdC0+Qml0c1BlclBpeGVsID09IDgpCisgICAgc3VyZmFjZS0+U2V0U3JjQ29sb3JLZXlJbmRleCAoc3VyZmFjZSwga2V5KTsKKyAgZWxzZQorICAgIC8qIHVnbHkgKi8KKyAgICBzdXJmYWNlLT5TZXRTcmNDb2xvcktleSAoc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleSAmIGZtdC0+Um1hc2spID4+IChmbXQtPlJzaGlmdCAtIGZtdC0+Umxvc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ICYgZm10LT5HbWFzaykgPj4gKGZtdC0+R3NoaWZ0IC0gZm10LT5HbG9zcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXkgJiBmbXQtPkJtYXNrKSA8PCAoZm10LT5CbG9zcyAtIGZtdC0+QnNoaWZ0KSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRGlyZWN0RkJfU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQ4IGFscGhhKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBEaXJlY3RGQl9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgaWYgKEhJRERFTi0+ZW5hYmxlX21nYV9jcnRjMikKKyAgICB7CisgICAgICAgaW50IHJ0biA9IHN1cmZhY2UtPmh3ZGF0YS0+c3VyZmFjZS0+RmxpcCAoc3VyZmFjZS0+aHdkYXRhLT5zdXJmYWNlLCBOVUxMLCAwKTsKKyAgICAgICBpZiAoSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaCkKKyAgICAgICAgIEhJRERFTi0+YzJmcmFtZS0+U3RyZXRjaEJsaXQoSElEREVOLT5jMmZyYW1lLCBzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UsICZISURERU4tPmMyc3NpemUsICZISURERU4tPmMyZHNpemUpOworICAgICAgIGVsc2UKKyAgICAgICAgIEhJRERFTi0+YzJmcmFtZS0+QmxpdChISURERU4tPmMyZnJhbWUsIHN1cmZhY2UtPmh3ZGF0YS0+c3VyZmFjZSwgTlVMTCwgSElEREVOLT5jMmRzaXplLngsIEhJRERFTi0+YzJkc2l6ZS55KTsKKyAgICAgCisgICAgICAgSElEREVOLT5jMmZyYW1lLT5GbGlwKEhJRERFTi0+YzJmcmFtZSwgTlVMTCwgRFNGTElQX1dBSVRGT1JTWU5DKTsKKyAgICAgICByZXR1cm4gcnRuOworICAgIH0gCisgIGVsc2UgCisgICAgIHJldHVybiBzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UtPkZsaXAgKHN1cmZhY2UtPmh3ZGF0YS0+c3VyZmFjZSwgTlVMTCwgRFNGTElQX1dBSVRGT1JTWU5DKTsKK30KKworc3RhdGljIGludCBEaXJlY3RGQl9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgREZCUmVzdWx0ICByZXQ7CisgIHZvaWQgICAgICAqZGF0YTsKKyAgaW50ICAgICAgICBwaXRjaDsKKworICByZXQgPSBzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UtPkxvY2sgKHN1cmZhY2UtPmh3ZGF0YS0+c3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0xGX1dSSVRFLCAmZGF0YSwgJnBpdGNoKTsKKyAgaWYgKHJldCkKKyAgICB7CisgICAgICBTZXREaXJlY3RGQmVycm9yICgic3VyZmFjZS0+TG9jayIsIHJldCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHN1cmZhY2UtPnBpeGVscyA9IGRhdGE7CisgIHN1cmZhY2UtPnBpdGNoICA9IHBpdGNoOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBEaXJlY3RGQl9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworICBzdXJmYWNlLT5od2RhdGEtPnN1cmZhY2UtPlVubG9jayAoc3VyZmFjZS0+aHdkYXRhLT5zdXJmYWNlKTsKKyAgc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgRGlyZWN0RkJfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKyAgaWYgKEhJRERFTi0+ZW5hYmxlX21nYV9jcnRjMikKKyAgICB7CisgICAgICAgaWYgKEhJRERFTi0+bWdhX2NydGMyX3N0cmV0Y2gpCisgICAgICAgICBISURERU4tPmMyZnJhbWUtPlN0cmV0Y2hCbGl0KEhJRERFTi0+YzJmcmFtZSwgdGhpcy0+c2NyZWVuLT5od2RhdGEtPnN1cmZhY2UsICZISURERU4tPmMyc3NpemUsICZISURERU4tPmMyZHNpemUpOyAKKyAgICAgICBlbHNlCisgICAgICAgICBISURERU4tPmMyZnJhbWUtPkJsaXQoSElEREVOLT5jMmZyYW1lLCB0aGlzLT5zY3JlZW4tPmh3ZGF0YS0+c3VyZmFjZSwgTlVMTCwgSElEREVOLT5jMmRzaXplLngsIEhJRERFTi0+YzJkc2l6ZS55KTsgCisKKyAgICAgICBISURERU4tPmMyZnJhbWUtPkZsaXAoSElEREVOLT5jMmZyYW1lLCBOVUxMLCBEU0ZMSVBfV0FJVEZPUlNZTkMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRGlyZWN0RkJfV2luZG93ZWRVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworICBERkJSZWdpb24gICAgICAgICByZWdpb247CisgIGludCAgICAgICAgICAgICAgIGk7CisgIGludCAgICAgICAgICAgICAgIHJlZ2lvbl92YWxpZCA9IDA7CisgIElEaXJlY3RGQlN1cmZhY2UgKnN1cmZhY2UgPSB0aGlzLT5zY3JlZW4tPmh3ZGF0YS0+c3VyZmFjZTsKKworICBmb3IgKGk9MDsgaTxudW1yZWN0czsgKytpKQorICAgIHsKKyAgICAgIGludCB4MiwgeTI7CisKKyAgICAgIGlmICggISByZWN0c1tpXS53ICkgLyogQ2xpcHBlZD8gKi8KKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHgyID0gcmVjdHNbaV0ueCArIHJlY3RzW2ldLncgLSAxOworICAgICAgeTIgPSByZWN0c1tpXS55ICsgcmVjdHNbaV0uaCAtIDE7CisKKyAgICAgIGlmIChyZWdpb25fdmFsaWQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocmVjdHNbaV0ueCA8IHJlZ2lvbi54MSkKKyAgICAgICAgICAgIHJlZ2lvbi54MSA9IHJlY3RzW2ldLng7CisKKyAgICAgICAgICBpZiAocmVjdHNbaV0ueSA8IHJlZ2lvbi55MSkKKyAgICAgICAgICAgIHJlZ2lvbi55MSA9IHJlY3RzW2ldLnk7CisKKyAgICAgICAgICBpZiAoeDIgPiByZWdpb24ueDIpCisgICAgICAgICAgICByZWdpb24ueDIgPSB4MjsKKworICAgICAgICAgIGlmICh5MiA+IHJlZ2lvbi55MikKKyAgICAgICAgICAgIHJlZ2lvbi55MiA9IHkyOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lvbi54MSA9IHJlY3RzW2ldLng7CisgICAgICAgICAgICByZWdpb24ueTEgPSByZWN0c1tpXS55OworICAgICAgICAgICAgcmVnaW9uLngyID0geDI7CisgICAgICAgICAgICByZWdpb24ueTIgPSB5MjsKKworICAgICAgICAgICAgcmVnaW9uX3ZhbGlkID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAocmVnaW9uX3ZhbGlkKQorICAgIHsKKyAgICAgIGlmIChISURERU4tPmVuYWJsZV9tZ2FfY3J0YzIpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoSElEREVOLT5tZ2FfY3J0YzJfc3RyZXRjaCkKKyAgICAgICAgICAgIEhJRERFTi0+YzJmcmFtZS0+U3RyZXRjaEJsaXQoSElEREVOLT5jMmZyYW1lLCBzdXJmYWNlLCAmSElEREVOLT5jMnNzaXplLCAmSElEREVOLT5jMmRzaXplKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBISURERU4tPmMyZnJhbWUtPkJsaXQoSElEREVOLT5jMmZyYW1lLCBzdXJmYWNlLCBOVUxMLCBISURERU4tPmMyZHNpemUueCwgSElEREVOLT5jMmRzaXplLnkpOyAKKyAgICAgIAorICAgICAgICAgIEhJRERFTi0+YzJmcmFtZS0+RmxpcChISURERU4tPmMyZnJhbWUsIE5VTEwsIERTRkxJUF9XQUlURk9SU1lOQyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgCisgICAgICAgIHN1cmZhY2UtPkZsaXAgKHN1cmZhY2UsICZyZWdpb24sIERTRkxJUF9XQUlURk9SU1lOQyk7CisgICAgfQorfQorCitpbnQgRGlyZWN0RkJfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworICBJRGlyZWN0RkJQYWxldHRlICpwYWxldHRlID0gdGhpcy0+c2NyZWVuLT5od2RhdGEtPnBhbGV0dGU7CisKKyAgaWYgKCFwYWxldHRlKQorICAgIHJldHVybiAwOworCisgIGlmIChmaXJzdGNvbG9yID4gMjU1KQorICAgIHJldHVybiAwOworCisgIGlmIChmaXJzdGNvbG9yICsgbmNvbG9ycyA+IDI1NikKKyAgICBuY29sb3JzID0gMjU2IC0gZmlyc3Rjb2xvcjsKKworICBpZiAobmNvbG9ycyA+IDApCisgICAgeworICAgICAgaW50ICAgICAgaTsKKyAgICAgIERGQkNvbG9yIGVudHJpZXNbbmNvbG9yc107CisKKyAgICAgIGZvciAoaT0wOyBpPG5jb2xvcnM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGVudHJpZXNbaV0uYSA9IDB4ZmY7CisgICAgICAgICAgZW50cmllc1tpXS5yID0gY29sb3JzW2ldLnI7CisgICAgICAgICAgZW50cmllc1tpXS5nID0gY29sb3JzW2ldLmc7CisgICAgICAgICAgZW50cmllc1tpXS5iID0gY29sb3JzW2ldLmI7CisgICAgICAgIH0KKworICAgICAgcGFsZXR0ZS0+U2V0RW50cmllcyAocGFsZXR0ZSwgZW50cmllcywgbmNvbG9ycywgZmlyc3Rjb2xvcik7CisgICAgfQorCisgIHJldHVybiAxOworfQorCQordm9pZCBEaXJlY3RGQl9WaWRlb1F1aXQoX1RISVMpCit7CisgIHN0cnVjdCBEaXJlY3RGQkVudW1SZWN0ICpyZWN0ICAgID0gZW51bWxpc3Q7CisKKyAgaWYgKHRoaXMtPnNjcmVlbiAmJiB0aGlzLT5zY3JlZW4tPmh3ZGF0YSkKKyAgICB7CisgICAgICBJRGlyZWN0RkJTdXJmYWNlICAgICAgICAqc3VyZmFjZSA9IHRoaXMtPnNjcmVlbi0+aHdkYXRhLT5zdXJmYWNlOworICAgICAgSURpcmVjdEZCUGFsZXR0ZSAgICAgICAgKnBhbGV0dGUgPSB0aGlzLT5zY3JlZW4tPmh3ZGF0YS0+cGFsZXR0ZTsKKworICAgICAgaWYgKHBhbGV0dGUpCisgICAgICAgIHBhbGV0dGUtPlJlbGVhc2UgKHBhbGV0dGUpOworCisgICAgICBpZiAoc3VyZmFjZSkKKyAgICAgICAgc3VyZmFjZS0+UmVsZWFzZSAoc3VyZmFjZSk7CisKKyAgICAgIHRoaXMtPnNjcmVlbi0+aHdkYXRhLT5zdXJmYWNlID0gTlVMTDsKKyAgICAgIHRoaXMtPnNjcmVlbi0+aHdkYXRhLT5wYWxldHRlID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKEhJRERFTi0+YzJmcmFtZSkKKyAgICB7CisgICAgICBISURERU4tPmMyZnJhbWUtPlJlbGVhc2UgKEhJRERFTi0+YzJmcmFtZSk7CisgICAgICBISURERU4tPmMyZnJhbWUgPSBOVUxMOworICAgIH0KKworICBpZiAoSElEREVOLT5ldmVudGJ1ZmZlcikKKyAgICB7CisgICAgICBISURERU4tPmV2ZW50YnVmZmVyLT5SZWxlYXNlIChISURERU4tPmV2ZW50YnVmZmVyKTsKKyAgICAgIEhJRERFTi0+ZXZlbnRidWZmZXIgPSBOVUxMOworICAgIH0KKworICBpZiAoSElEREVOLT5jMmxheWVyKQorICAgIHsKKyAgICAgIEhJRERFTi0+YzJsYXllci0+UmVsZWFzZSAoSElEREVOLT5jMmxheWVyKTsKKyAgICAgIEhJRERFTi0+YzJsYXllciA9IE5VTEw7CisgICAgfQorCisgIGlmIChISURERU4tPmxheWVyKQorICAgIHsKKyAgICAgIEhJRERFTi0+bGF5ZXItPlJlbGVhc2UgKEhJRERFTi0+bGF5ZXIpOworICAgICAgSElEREVOLT5sYXllciA9IE5VTEw7CisgICAgfQorCisgIGlmIChISURERU4tPmRmYikKKyAgICB7CisgICAgICBISURERU4tPmRmYi0+UmVsZWFzZSAoSElEREVOLT5kZmIpOworICAgICAgSElEREVOLT5kZmIgPSBOVUxMOworICAgIH0KKworICAvKiBGcmVlIHZpZGVvIG1vZGUgbGlzdCAqLworICBpZiAoSElEREVOLT5tb2RlbGlzdCkKKyAgICB7CisgICAgICBmcmVlIChISURERU4tPm1vZGVsaXN0KTsKKyAgICAgIEhJRERFTi0+bW9kZWxpc3QgPSBOVUxMOworICAgIH0KKworICAvKiBGcmVlIG1vZGUgZW51bWVyYXRpb24gbGlzdCAqLworICB3aGlsZSAocmVjdCkKKyAgICB7CisgICAgICBzdHJ1Y3QgRGlyZWN0RkJFbnVtUmVjdCAqbmV4dCA9IHJlY3QtPm5leHQ7CisgICAgICBmcmVlIChyZWN0KTsKKyAgICAgIHJlY3QgPSBuZXh0OworICAgIH0KKyAgZW51bWxpc3QgPSBOVUxMOworCisgIEhJRERFTi0+aW5pdGlhbGl6ZWQgPSAwOworfQorCisKK2ludCBEaXJlY3RGQl9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCit7CisgIC8qIFdlIGNhbiBvbmx5IGhpZGUgb3Igc2hvdyB0aGUgZGVmYXVsdCBjdXJzb3IgKi8KKyAgaWYgKCBjdXJzb3IgPT0gTlVMTCApCisgICAgeworICAgICAgSElEREVOLT5sYXllci0+U2V0Q3Vyc29yT3BhY2l0eShISURERU4tPmxheWVyLCAweDAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIEhJRERFTi0+bGF5ZXItPlNldEN1cnNvck9wYWNpdHkoSElEREVOLT5sYXllciwgMHhGRik7CisgICAgfQorICByZXR1cm4gMTsKK30KKwordm9pZCBEaXJlY3RGQl9GaW5hbFF1aXQodm9pZCkgCit7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl92aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZhMTJjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfdmlkZW8uaApAQCAtMCwwICsxLDYyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX0RpcmVjdEZCX3ZpZGVvX2gKKyNkZWZpbmUgX1NETF9EaXJlY3RGQl92aWRlb19oCisKKyNpbmNsdWRlIDxkaXJlY3RmYi5oPgorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisKKyNkZWZpbmUgX1RISVMgU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCisKK3N0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YQoreworICBpbnQgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkOworCisgIElEaXJlY3RGQiAgICAgICAgICAgICAqZGZiOworICBJRGlyZWN0RkJEaXNwbGF5TGF5ZXIgKmxheWVyOworICBJRGlyZWN0RkJFdmVudEJ1ZmZlciAgKmV2ZW50YnVmZmVyOworCisgIGludCBudW1tb2RlczsKKyAgU0RMX1JlY3QgKiptb2RlbGlzdDsKKworICAvKiBNR0EgQ1JUQzIgc3VwcG9ydCAqLworICBpbnQgZW5hYmxlX21nYV9jcnRjMjsKKyAgaW50IG1nYV9jcnRjMl9zdHJldGNoOworICBmbG9hdCBtZ2FfY3J0YzJfc3RyZXRjaF9vdmVyc2NhbjsKKyAgSURpcmVjdEZCRGlzcGxheUxheWVyICpjMmxheWVyOworICBJRGlyZWN0RkJTdXJmYWNlICpjMmZyYW1lOworICBERkJSZWN0YW5nbGUgYzJzc2l6ZTsJLyogUmVhbCBzY3JlZW4gc2l6ZSAqLworICBERkJSZWN0YW5nbGUgYzJkc2l6ZTsJLyogU3RyZXRjaGVkIHNjcmVlbiBzaXplICovCisgIERGQlJlY3RhbmdsZSBjMmZyYW1lc2l6ZTsgICAgLyogQ1JUQzIgc2NyZWVuIHNpemUgKi8KK307CisKKyNkZWZpbmUgSElEREVOICh0aGlzLT5oaWRkZW4pCisKK3ZvaWQgU2V0RGlyZWN0RkJlcnJvciAoY29uc3QgY2hhciAqZnVuY3Rpb24sIERGQlJlc3VsdCBjb2RlKTsKKworI2VuZGlmIC8qIF9TRExfRGlyZWN0RkJfdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfeXV2LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl95dXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDBjZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kaXJlY3RmYi9TRExfRGlyZWN0RkJfeXV2LmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaGlzIGlzIHRoZSBEaXJlY3RGQiBpbXBsZW1lbnRhdGlvbiBvZiBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9EaXJlY3RGQl95dXYuaCIKKyNpbmNsdWRlICIuLi9TRExfeXV2ZnVuY3MuaCIKKworCisvKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gbWFuaXB1bGF0ZSBzb2Z0d2FyZSB2aWRlbyBvdmVybGF5cyAqLworc3RhdGljIHN0cnVjdCBwcml2YXRlX3l1dmh3ZnVuY3MgZGlyZWN0ZmJfeXV2ZnVuY3MgPSB7CisgIERpcmVjdEZCX0xvY2tZVVZPdmVybGF5LAorICBEaXJlY3RGQl9VbmxvY2tZVVZPdmVybGF5LAorICBEaXJlY3RGQl9EaXNwbGF5WVVWT3ZlcmxheSwKKyAgRGlyZWN0RkJfRnJlZVlVVk92ZXJsYXkKK307CisKK3N0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSB7CisgIERGQkRpc3BsYXlMYXllcklEICAgICAgbGF5ZXJfaWQ7CisKKyAgSURpcmVjdEZCRGlzcGxheUxheWVyICpsYXllcjsKKyAgSURpcmVjdEZCU3VyZmFjZSAgICAgICpzdXJmYWNlOworCisgIC8qIFRoZXNlIGFyZSBqdXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgdGhlbSBzZXBhcmF0ZWx5ICovCisgIFVpbnQxNiBwaXRjaGVzWzNdOworICBVaW50OCAqcGxhbmVzWzNdOworfTsKKworc3RhdGljIERGQkVudW1lcmF0aW9uUmVzdWx0CitlbnVtX2xheWVyc19jYWxsYmFjayggREZCRGlzcGxheUxheWVySUQgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICBERkJEaXNwbGF5TGF5ZXJEZXNjcmlwdGlvbiAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhICkKK3sKKyAgc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICpod2RhdGEgPSAoc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICopIGRhdGE7CisKKyAgLyogd2UgZG9uJ3Qgd2FudCB0aGUgcHJpbWFyeSAqLworICBpZiAoaWQgPT0gRExJRF9QUklNQVJZKQorICAgIHJldHVybiBERkVOVU1fT0s7CisKKyAgLyogdGFrZSB0aGUgb25lIHdpdGggYSBzdXJmYWNlIGZvciB2aWRlbyAqLworICBpZiAoKGRlc2MuY2FwcyAmIERMQ0FQU19TVVJGQUNFKSAmJiAoZGVzYy50eXBlICYgRExURl9WSURFTykpCisgICAgeworICAgICAgaHdkYXRhLT5sYXllcl9pZCA9IGlkOworCisgICAgICByZXR1cm4gREZFTlVNX0NBTkNFTDsKKyAgICB9CisKKyAgcmV0dXJuIERGRU5VTV9PSzsKK30KKworCitzdGF0aWMgREZCUmVzdWx0IENyZWF0ZVlVVlN1cmZhY2UoX1RISVMsIHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCkKK3sKKyAgREZCUmVzdWx0ICAgICAgICAgICAgICByZXQ7CisgIElEaXJlY3RGQiAgICAgICAgICAgICAqZGZiID0gSElEREVOLT5kZmI7CisgIElEaXJlY3RGQkRpc3BsYXlMYXllciAqbGF5ZXI7CisgIERGQkRpc3BsYXlMYXllckNvbmZpZyAgY29uZjsKKworICByZXQgPSBkZmItPkVudW1EaXNwbGF5TGF5ZXJzIChkZmIsIGVudW1fbGF5ZXJzX2NhbGxiYWNrLCBod2RhdGEpOworICBpZiAocmV0KQorICAgIHsKKyAgICAgIFNldERpcmVjdEZCZXJyb3IoIklEaXJlY3RGQjo6RW51bURpc3BsYXlMYXllcnMiLCByZXQpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgaWYgKCFod2RhdGEtPmxheWVyX2lkKQorICAgIHJldHVybiBERkJfVU5TVVBQT1JURUQ7CisKKyAgcmV0ID0gZGZiLT5HZXREaXNwbGF5TGF5ZXIgKGRmYiwgaHdkYXRhLT5sYXllcl9pZCwgJmxheWVyKTsKKyAgaWYgKHJldCkKKyAgICB7CisgICAgICBTZXREaXJlY3RGQmVycm9yKCJJRGlyZWN0RkI6OkdldERpc3BsYXlMYXllciIsIHJldCk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICBjb25mLmZsYWdzID0gRExDT05GX1dJRFRIIHwgRExDT05GX0hFSUdIVCB8IERMQ09ORl9QSVhFTEZPUk1BVDsKKyAgY29uZi53aWR0aCA9IHdpZHRoOworICBjb25mLmhlaWdodCA9IGhlaWdodDsKKworICBzd2l0Y2ggKGZvcm1hdCkKKyAgICB7CisgICAgY2FzZSBTRExfWVYxMl9PVkVSTEFZOgorICAgICAgY29uZi5waXhlbGZvcm1hdCA9IERTUEZfWVYxMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKKyAgICAgIGNvbmYucGl4ZWxmb3JtYXQgPSBEU1BGX0k0MjA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNETF9ZVVkyX09WRVJMQVk6CisgICAgICBjb25mLnBpeGVsZm9ybWF0ID0gRFNQRl9ZVVkyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRExfVVlWWV9PVkVSTEFZOgorICAgICAgY29uZi5waXhlbGZvcm1hdCA9IERTUEZfVVlWWTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJTRExfRGlyZWN0RkI6IFVuc3VwcG9ydGVkIFlVViBmb3JtYXQgKDB4JTA4eCkhXG4iLCBmb3JtYXQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIE5lZWQgdG8gc2V0IGNvb3AgbGV2ZWwgb3IgbmV3ZXIgRGlyZWN0RkIgdmVyc2lvbnMgd2lsbCBmYWlsIGhlcmUuICovCisgIHJldCA9IGxheWVyLT5TZXRDb29wZXJhdGl2ZUxldmVsIChsYXllciwgRExTQ0xfQURNSU5JU1RSQVRJVkUpOworICBpZiAocmV0KQorICAgIHsKKyAgICAgIFNldERpcmVjdEZCZXJyb3IoIklEaXJlY3RGQkRpc3BsYXlMYXllcjo6U2V0Q29vcGVyYXRpdmVMZXZlbCgpIGZhaWxlZCIsIHJldCk7CisgICAgICBsYXllci0+UmVsZWFzZSAobGF5ZXIpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgcmV0ID0gbGF5ZXItPlNldENvbmZpZ3VyYXRpb24gKGxheWVyLCAmY29uZik7CisgIGlmIChyZXQpCisgICAgeworICAgICAgU2V0RGlyZWN0RkJlcnJvcigiSURpcmVjdEZCRGlzcGxheUxheWVyOjpTZXRDb25maWd1cmF0aW9uIiwgcmV0KTsKKyAgICAgIGxheWVyLT5SZWxlYXNlIChsYXllcik7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICByZXQgPSBsYXllci0+R2V0U3VyZmFjZSAobGF5ZXIsICZod2RhdGEtPnN1cmZhY2UpOworICBpZiAocmV0KQorICAgIHsKKyAgICAgIFNldERpcmVjdEZCZXJyb3IoIklEaXJlY3RGQkRpc3BsYXlMYXllcjo6R2V0U3VyZmFjZSIsIHJldCk7CisgICAgICBsYXllci0+UmVsZWFzZSAobGF5ZXIpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgaHdkYXRhLT5sYXllciA9IGxheWVyOworCisgIHJldHVybiBERkJfT0s7Cit9CisKK1NETF9PdmVybGF5ICpEaXJlY3RGQl9DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KQoreworICBTRExfT3ZlcmxheSAqb3ZlcmxheTsKKyAgc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICpod2RhdGE7CisKKyAgLyogQ3JlYXRlIHRoZSBvdmVybGF5IHN0cnVjdHVyZSAqLworICBvdmVybGF5ID0gU0RMX2NhbGxvYyAoMSwgc2l6ZW9mKFNETF9PdmVybGF5KSk7CisgIGlmICghb3ZlcmxheSkKKyAgICB7CisgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKyAgLyogRmlsbCBpbiB0aGUgYmFzaWMgbWVtYmVycyAqLworICBvdmVybGF5LT5mb3JtYXQgPSBmb3JtYXQ7CisgIG92ZXJsYXktPncgPSB3aWR0aDsKKyAgb3ZlcmxheS0+aCA9IGhlaWdodDsKKworICAvKiBTZXQgdXAgdGhlIFlVViBzdXJmYWNlIGZ1bmN0aW9uIHN0cnVjdHVyZSAqLworICBvdmVybGF5LT5od2Z1bmNzID0gJmRpcmVjdGZiX3l1dmZ1bmNzOworCisgIC8qIENyZWF0ZSB0aGUgcGl4ZWwgZGF0YSBhbmQgbG9va3VwIHRhYmxlcyAqLworICBod2RhdGEgPSBTRExfY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEpKTsKKyAgb3ZlcmxheS0+aHdkYXRhID0gaHdkYXRhOworICBpZiAoIWh3ZGF0YSkKKyAgICB7CisgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgIFNETF9GcmVlWVVWT3ZlcmxheSAob3ZlcmxheSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKENyZWF0ZVlVVlN1cmZhY2UgKHRoaXMsIGh3ZGF0YSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0KSkKKyAgICB7CisgICAgICBTRExfRnJlZVlVVk92ZXJsYXkgKG92ZXJsYXkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG92ZXJsYXktPmh3X292ZXJsYXkgPSAxOworCisgIC8qIFNldCB1cCB0aGUgcGxhbmUgcG9pbnRlcnMgKi8KKyAgb3ZlcmxheS0+cGl0Y2hlcyA9IGh3ZGF0YS0+cGl0Y2hlczsKKyAgb3ZlcmxheS0+cGl4ZWxzID0gaHdkYXRhLT5wbGFuZXM7CisgIHN3aXRjaCAoZm9ybWF0KQorICAgIHsKKyAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6CisgICAgY2FzZSBTRExfSVlVVl9PVkVSTEFZOgorICAgICAgb3ZlcmxheS0+cGxhbmVzID0gMzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBvdmVybGF5LT5wbGFuZXMgPSAxOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIFdlJ3JlIGFsbCBkb25lLi4gKi8KKyAgcmV0dXJuIG92ZXJsYXk7Cit9CisKK2ludCBEaXJlY3RGQl9Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCit7CisgIERGQlJlc3VsdCAgICAgICAgIHJldDsKKyAgdm9pZCAgICAgICAgICAgICAqZGF0YTsKKyAgaW50ICAgICAgICAgICAgICAgcGl0Y2g7CisgIElEaXJlY3RGQlN1cmZhY2UgKnN1cmZhY2UgPSBvdmVybGF5LT5od2RhdGEtPnN1cmZhY2U7CisKKyAgcmV0ID0gc3VyZmFjZS0+TG9jayAoc3VyZmFjZSwgRFNMRl9SRUFEIHwgRFNMRl9XUklURSwgJmRhdGEsICZwaXRjaCk7CisgIGlmIChyZXQpCisgICAgeworICAgICAgU2V0RGlyZWN0RkJlcnJvcigiSURpcmVjdEZCU3VyZmFjZTo6TG9jayIsIHJldCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qIEZpbmQgdGhlIHBpdGNoIGFuZCBvZmZzZXQgdmFsdWVzIGZvciB0aGUgb3ZlcmxheSAqLworICBvdmVybGF5LT5waXRjaGVzWzBdID0gKFVpbnQxNikgcGl0Y2g7CisgIG92ZXJsYXktPnBpeGVsc1swXSAgPSAoVWludDgqKSBkYXRhOworCisgIHN3aXRjaCAob3ZlcmxheS0+Zm9ybWF0KQorICAgIHsKKyAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6CisgICAgY2FzZSBTRExfSVlVVl9PVkVSTEFZOgorICAgICAgLyogQWRkIHRoZSB0d28gZXh0cmEgcGxhbmVzICovCisgICAgICBvdmVybGF5LT5waXRjaGVzWzFdID0gb3ZlcmxheS0+cGl0Y2hlc1swXSAvIDI7CisgICAgICBvdmVybGF5LT5waXRjaGVzWzJdID0gb3ZlcmxheS0+cGl0Y2hlc1swXSAvIDI7CisgICAgICBvdmVybGF5LT5waXhlbHNbMV0gID0gb3ZlcmxheS0+cGl4ZWxzWzBdICsgb3ZlcmxheS0+cGl0Y2hlc1swXSAqIG92ZXJsYXktPmg7CisgICAgICBvdmVybGF5LT5waXhlbHNbMl0gID0gb3ZlcmxheS0+cGl4ZWxzWzFdICsgb3ZlcmxheS0+cGl0Y2hlc1sxXSAqIG92ZXJsYXktPmggLyAyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIE9ubHkgb25lIHBsYW5lLCBubyB3b3JyaWVzICovCisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRGlyZWN0RkJfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCit7CisgIElEaXJlY3RGQlN1cmZhY2UgKnN1cmZhY2UgPSBvdmVybGF5LT5od2RhdGEtPnN1cmZhY2U7CisKKyAgb3ZlcmxheS0+cGl4ZWxzWzBdID0gb3ZlcmxheS0+cGl4ZWxzWzFdID0gb3ZlcmxheS0+cGl4ZWxzWzJdID0gTlVMTDsKKworICBzdXJmYWNlLT5VbmxvY2sgKHN1cmZhY2UpOworfQorCitpbnQgRGlyZWN0RkJfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KQoreworICBERkJSZXN1bHQgICAgICAgICAgICAgIHJldDsKKyAgREZCRGlzcGxheUxheWVyQ29uZmlnICBjb25mOworICBJRGlyZWN0RkJEaXNwbGF5TGF5ZXIgKnByaW1hcnkgPSBISURERU4tPmxheWVyOworICBJRGlyZWN0RkJEaXNwbGF5TGF5ZXIgKmxheWVyICAgPSBvdmVybGF5LT5od2RhdGEtPmxheWVyOworCisgIHByaW1hcnktPkdldENvbmZpZ3VyYXRpb24gKHByaW1hcnksICZjb25mKTsKKworICByZXQgPSBsYXllci0+U2V0U2NyZWVuTG9jYXRpb24gKGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+eCAvIChmbG9hdCkgY29uZi53aWR0aCwgZHN0LT55IC8gKGZsb2F0KSBjb25mLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPncgLyAoZmxvYXQpIGNvbmYud2lkdGgsIGRzdC0+aCAvIChmbG9hdCkgY29uZi5oZWlnaHQgKTsKKyAgaWYgKHJldCkKKyAgICB7CisgICAgICBTZXREaXJlY3RGQmVycm9yKCJJRGlyZWN0RkJEaXNwbGF5TGF5ZXI6OlNldFNjcmVlbkxvY2F0aW9uIiwgcmV0KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRGlyZWN0RkJfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQoreworICBzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKKworICBod2RhdGEgPSBvdmVybGF5LT5od2RhdGE7CisgIGlmIChod2RhdGEpCisgICAgeworICAgICAgaWYgKGh3ZGF0YS0+c3VyZmFjZSkKKyAgICAgICAgaHdkYXRhLT5zdXJmYWNlLT5SZWxlYXNlIChod2RhdGEtPnN1cmZhY2UpOworCisgICAgICBpZiAoaHdkYXRhLT5sYXllcikKKyAgICAgICAgaHdkYXRhLT5sYXllci0+UmVsZWFzZSAoaHdkYXRhLT5sYXllcik7CisKKyAgICAgIGZyZWUgKGh3ZGF0YSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl95dXYuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZGlyZWN0ZmIvU0RMX0RpcmVjdEZCX3l1di5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YmM4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2RpcmVjdGZiL1NETF9EaXJlY3RGQl95dXYuaApAQCAtMCwwICsxLDM4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBpcyB0aGUgRGlyZWN0RkIgaW1wbGVtZW50YXRpb24gb2YgWVVWIHZpZGVvIG92ZXJsYXlzICovCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfRGlyZWN0RkJfdmlkZW8uaCIKKworZXh0ZXJuIFNETF9PdmVybGF5ICpEaXJlY3RGQl9DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KTsKKworZXh0ZXJuIGludCBEaXJlY3RGQl9Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOworCitleHRlcm4gdm9pZCBEaXJlY3RGQl9VbmxvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7CisKK2V4dGVybiBpbnQgRGlyZWN0RkJfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KTsKKworZXh0ZXJuIHZvaWQgRGlyZWN0RkJfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kdW1teS9TRExfbnVsbGV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kdW1teS9TRExfbnVsbGV2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3N2ZjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsZXZlbnRzLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEJlaW5nIGEgbnVsbCBkcml2ZXIsIHRoZXJlJ3Mgbm8gZXZlbnQgc3RyZWFtLiBXZSBqdXN0IGRlZmluZSBzdHVicyBmb3IKKyAgIG1vc3Qgb2YgdGhlIEFQSS4gKi8KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX251bGx2aWRlby5oIgorI2luY2x1ZGUgIlNETF9udWxsZXZlbnRzX2MuaCIKKwordm9pZCBEVU1NWV9QdW1wRXZlbnRzKF9USElTKQoreworCS8qIGRvIG5vdGhpbmcuICovCit9CisKK3ZvaWQgRFVNTVlfSW5pdE9TS2V5bWFwKF9USElTKQoreworCS8qIGRvIG5vdGhpbmcuICovCit9CisKKy8qIGVuZCBvZiBTRExfbnVsbGV2ZW50cy5jIC4uLiAqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGxldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjU3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsZXZlbnRzX2MuaApAQCAtMCwwICsxLDMzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9udWxsdmlkZW8uaCIKKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAorICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQorKi8KK2V4dGVybiB2b2lkIERVTU1ZX0luaXRPU0tleW1hcChfVEhJUyk7CitleHRlcm4gdm9pZCBEVU1NWV9QdW1wRXZlbnRzKF9USElTKTsKKworLyogZW5kIG9mIFNETF9udWxsZXZlbnRzX2MuaCAuLi4gKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kdW1teS9TRExfbnVsbG1vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsbW91c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2RhZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kdW1teS9TRExfbnVsbG1vdXNlLmMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisKKyNpbmNsdWRlICJTRExfbnVsbG1vdXNlX2MuaCIKKworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK3N0cnVjdCBXTWN1cnNvciB7CisJaW50IHVudXNlZDsKK307CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kdW1teS9TRExfbnVsbG1vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzllYjBlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9kdW1teS9TRExfbnVsbG1vdXNlX2MuaApAQCAtMCwwICsxLDI2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9udWxsdmlkZW8uaCIKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGx2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDk2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsdmlkZW8uYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIER1bW15IFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb247IHRoaXMgaXMganVzdCBlbm91Z2ggdG8gbWFrZSBhbgorICogIFNETC1iYXNlZCBhcHBsaWNhdGlvbiBUSElOSyBpdCdzIGdvdCBhIHdvcmtpbmcgdmlkZW8gZHJpdmVyLCBmb3IKKyAqICBhcHBsaWNhdGlvbnMgdGhhdCBjYWxsIFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSB3aGVuIHRoZXkgZG9uJ3QgbmVlZCBpdCwKKyAqICBhbmQgYWxzbyBmb3IgdXNlIGFzIGEgY29sbGVjdGlvbiBvZiBzdHVicyB3aGVuIHBvcnRpbmcgU0RMIHRvIGEgbmV3CisgKiAgcGxhdGZvcm0gZm9yIHdoaWNoIHlvdSBoYXZlbid0IHlldCB3cml0dGVuIGEgdmFsaWQgdmlkZW8gZHJpdmVyLgorICoKKyAqIFRoaXMgaXMgYWxzbyBhIGdyZWF0IHdheSB0byBkZXRlcm1pbmUgYm90dGxlbmVja3M6IGlmIHlvdSB0aGluayB0aGF0IFNETAorICogIGlzIGEgcGVyZm9ybWFuY2UgcHJvYmxlbSBmb3IgYSBnaXZlbiBwbGF0Zm9ybSwgZW5hYmxlIHRoaXMgZHJpdmVyLCBhbmQKKyAqICB0aGVuIHNlZSBpZiB5b3VyIGFwcGxpY2F0aW9uIHJ1bnMgZmFzdGVyIHdpdGhvdXQgdmlkZW8gb3ZlcmhlYWQuCisgKgorICogSW5pdGlhbCB3b3JrIGJ5IFJ5YW4gQy4gR29yZG9uIChpY2N1bHVzQGljY3VsdXMub3JnKS4gQSBnb29kIHBvcnRpb24KKyAqICBvZiB0aGlzIHdhcyBjdXQtYW5kLXBhc3RlZCBmcm9tIFN0ZXBoYW5lIFBldGVyJ3Mgd29yayBpbiB0aGUgQUFsaWIKKyAqICBTREwgdmlkZW8gZHJpdmVyLiAgUmVuYW1lZCB0byAiRFVNTVkiIGJ5IFNhbSBMYW50aW5nYS4KKyAqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX251bGx2aWRlby5oIgorI2luY2x1ZGUgIlNETF9udWxsZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfbnVsbG1vdXNlX2MuaCIKKworI2RlZmluZSBEVU1NWVZJRF9EUklWRVJfTkFNRSAiZHVtbXkiCisKKy8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBEVU1NWV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipEVU1NWV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworc3RhdGljIFNETF9TdXJmYWNlICpEVU1NWV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgaW50IERVTU1ZX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBEVU1NWV9WaWRlb1F1aXQoX1RISVMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBEVU1NWV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBEVU1NWV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBEVU1NWV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIERVTU1ZX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKKworLyogZXRjLiAqLworc3RhdGljIHZvaWQgRFVNTVlfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKKworLyogRFVNTVkgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBEVU1NWV9BdmFpbGFibGUodm9pZCkKK3sKKwljb25zdCBjaGFyICplbnZyID0gU0RMX2dldGVudigiU0RMX1ZJREVPRFJJVkVSIik7CisJaWYgKChlbnZyKSAmJiAoU0RMX3N0cmNtcChlbnZyLCBEVU1NWVZJRF9EUklWRVJfTkFNRSkgPT0gMCkpIHsKKwkJcmV0dXJuKDEpOworCX0KKworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgRFVNTVlfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKwlTRExfZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpEVU1NWV9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7CisJaWYgKCBkZXZpY2UgKSB7CisJCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKKwkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCisJCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCX0KKwlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCBkZXZpY2UgKSB7CisJCQlTRExfZnJlZShkZXZpY2UpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwlkZXZpY2UtPlZpZGVvSW5pdCA9IERVTU1ZX1ZpZGVvSW5pdDsKKwlkZXZpY2UtPkxpc3RNb2RlcyA9IERVTU1ZX0xpc3RNb2RlczsKKwlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IERVTU1ZX1NldFZpZGVvTW9kZTsKKwlkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBOVUxMOworCWRldmljZS0+U2V0Q29sb3JzID0gRFVNTVlfU2V0Q29sb3JzOworCWRldmljZS0+VXBkYXRlUmVjdHMgPSBEVU1NWV9VcGRhdGVSZWN0czsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IERVTU1ZX1ZpZGVvUXVpdDsKKwlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gRFVNTVlfQWxsb2NIV1N1cmZhY2U7CisJZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7CisJZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOworCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7CisJZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gRFVNTVlfTG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IERVTU1ZX1VubG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOworCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IERVTU1ZX0ZyZWVIV1N1cmZhY2U7CisJZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKKwlkZXZpY2UtPlNldEljb24gPSBOVUxMOworCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7CisJZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOworCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKKwlkZXZpY2UtPkluaXRPU0tleW1hcCA9IERVTU1ZX0luaXRPU0tleW1hcDsKKwlkZXZpY2UtPlB1bXBFdmVudHMgPSBEVU1NWV9QdW1wRXZlbnRzOworCisJZGV2aWNlLT5mcmVlID0gRFVNTVlfRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIGRldmljZTsKK30KKworVmlkZW9Cb290U3RyYXAgRFVNTVlfYm9vdHN0cmFwID0geworCURVTU1ZVklEX0RSSVZFUl9OQU1FLCAiU0RMIGR1bW15IHZpZGVvIGRyaXZlciIsCisJRFVNTVlfQXZhaWxhYmxlLCBEVU1NWV9DcmVhdGVEZXZpY2UKK307CisKKworaW50IERVTU1ZX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQoreworCS8qCisJZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBZb3UgYXJlIHVzaW5nIHRoZSBTREwgZHVtbXkgdmlkZW8gZHJpdmVyIVxuIik7CisJKi8KKworCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICh1c2UgZGVmYXVsdCA4LWJpdCBkZXB0aCkgKi8KKwkvKiB3ZSBjaGFuZ2UgdGhpcyBkdXJpbmcgdGhlIFNETF9TZXRWaWRlb01vZGUgaW1wbGVtZW50YXRpb24uLi4gKi8KKwl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSA4OworCXZmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPSAxOworCisJLyogV2UncmUgZG9uZSEgKi8KKwlyZXR1cm4oMCk7Cit9CisKK1NETF9SZWN0ICoqRFVNTVlfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworICAgCSByZXR1cm4gKFNETF9SZWN0ICoqKSAtMTsKK30KKworU0RMX1N1cmZhY2UgKkRVTU1ZX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisJaWYgKCB0aGlzLT5oaWRkZW4tPmJ1ZmZlciApIHsKKwkJU0RMX2ZyZWUoIHRoaXMtPmhpZGRlbi0+YnVmZmVyICk7CisJfQorCisJdGhpcy0+aGlkZGVuLT5idWZmZXIgPSBTRExfbWFsbG9jKHdpZHRoICogaGVpZ2h0ICogKGJwcCAvIDgpKTsKKwlpZiAoICEgdGhpcy0+aGlkZGVuLT5idWZmZXIgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgYnVmZmVyIGZvciByZXF1ZXN0ZWQgbW9kZSIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisvKiAJcHJpbnRmKCJTZXR0aW5nIG1vZGUgJWR4JWRcbiIsIHdpZHRoLCBoZWlnaHQpOyAqLworCisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4tPmJ1ZmZlciwgMCwgd2lkdGggKiBoZWlnaHQgKiAoYnBwIC8gOCkpOworCisJLyogQWxsb2NhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHRoZSBzY3JlZW4gKi8KKwlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgYnBwLCAwLCAwLCAwLCAwKSApIHsKKwkJU0RMX2ZyZWUodGhpcy0+aGlkZGVuLT5idWZmZXIpOworCQl0aGlzLT5oaWRkZW4tPmJ1ZmZlciA9IE5VTEw7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgcmVxdWVzdGVkIG1vZGUiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KKwljdXJyZW50LT5mbGFncyA9IGZsYWdzICYgU0RMX0ZVTExTQ1JFRU47CisJdGhpcy0+aGlkZGVuLT53ID0gY3VycmVudC0+dyA9IHdpZHRoOworCXRoaXMtPmhpZGRlbi0+aCA9IGN1cnJlbnQtPmggPSBoZWlnaHQ7CisJY3VycmVudC0+cGl0Y2ggPSBjdXJyZW50LT53ICogKGJwcCAvIDgpOworCWN1cnJlbnQtPnBpeGVscyA9IHRoaXMtPmhpZGRlbi0+YnVmZmVyOworCisJLyogV2UncmUgZG9uZSAqLworCXJldHVybihjdXJyZW50KTsKK30KKworLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KK3N0YXRpYyBpbnQgRFVNTVlfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybigtMSk7Cit9CitzdGF0aWMgdm9pZCBEVU1NWV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKKy8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSBvbiBwYWdlIGZsaXBwZWQgZGlzcGxheXMgKi8KK3N0YXRpYyBpbnQgRFVNTVlfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZCBEVU1NWV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgRFVNTVlfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCS8qIGRvIG5vdGhpbmcuICovCit9CisKK2ludCBEVU1NWV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisJLyogZG8gbm90aGluZyBvZiBub3RlLiAqLworCXJldHVybigxKTsKK30KKworLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCisgICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCisqLwordm9pZCBEVU1NWV9WaWRlb1F1aXQoX1RISVMpCit7CisJaWYgKHRoaXMtPnNjcmVlbi0+cGl4ZWxzICE9IE5VTEwpCisJeworCQlTRExfZnJlZSh0aGlzLT5zY3JlZW4tPnBpeGVscyk7CisJCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZHVtbXkvU0RMX251bGx2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzE5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2R1bW15L1NETF9udWxsdmlkZW8uaApAQCAtMCwwICsxLDQwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX251bGx2aWRlb19oCisjZGVmaW5lIF9TRExfbnVsbHZpZGVvX2gKKworI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKKworLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgKi8KKworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKKyAgICBpbnQgdywgaDsKKyAgICB2b2lkICpidWZmZXI7Cit9OworCisjZW5kaWYgLyogX1NETF9udWxsdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9lX2xvZy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9lX2xvZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2VfbG9nLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZV9sb2cuaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9lX3Bvdy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9lX3Bvdy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2VfcG93LmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZV9wb3cuaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9lX3NxcnQuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZV9zcXJ0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZV9zcXJ0LmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZV9zcXJ0LmgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vM2RmeF9tbWlvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uLzNkZnhfbW1pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDE0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uLzNkZnhfbW1pby5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiAzRGZ4IHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlICIzZGZ4X3JlZ3MuaCIKKworLyogM0RmeCBjb250cm9sIG1hY3JvcyAqLworCisjZGVmaW5lIHRkZnhfaW44KHJlZykJCSoodm9sYXRpbGUgVWludDggICopKG1hcHBlZF9pbyArIChyZWcpKQorI2RlZmluZSB0ZGZ4X2luMzIocmVnKQkJKih2b2xhdGlsZSBVaW50MzIgKikobWFwcGVkX2lvICsgKHJlZykpCisKKyNkZWZpbmUgdGRmeF9vdXQ4KHJlZyx2KQkqKHZvbGF0aWxlIFVpbnQ4ICAqKShtYXBwZWRfaW8gKyAocmVnKSkgPSB2OworI2RlZmluZSB0ZGZ4X291dDMyKHJlZyx2KQkqKHZvbGF0aWxlIFVpbnQzMiAqKShtYXBwZWRfaW8gKyAocmVnKSkgPSB2OworCisKKy8qIFdhaXQgZm9yIGZpZm8gc3BhY2UgKi8KKyNkZWZpbmUgdGRmeF93YWl0KHNwYWNlKQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJd2hpbGUgKCAodGRmeF9pbjgoVERGWF9TVEFUVVMpICYgMHgxRikgPCBzcGFjZSApCQlcCisJCTsJCQkJCQkJXAorfQorCisKKy8qIFdhaXQgZm9yIGlkbGUgYWNjZWxlcmF0b3IgKi8KKyNkZWZpbmUgdGRmeF93YWl0aWRsZSgpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJaW50IGkgPSAwOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJdGRmeF93YWl0KDEpOwkJCQkJCQlcCisJdGRmeF9vdXQzMihDT01NQU5EXzNELCBDT01NQU5EXzNEX05PUCk7CQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWkgPSAodGRmeF9pbjMyKFRERlhfU1RBVFVTKSAmIFNUQVRVU19CVVNZKSA/IDAgOiBpICsgMTsJXAorCX0gd2hpbGUgKCBpICE9IDMgKTsJCQkJCQlcCit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vM2RmeF9yZWdzLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uLzNkZnhfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmY3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uLzNkZnhfcmVncy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF8zREZYX1JFR1NfSAorI2RlZmluZSBfM0RGWF9SRUdTX0gKKworLyogVGhpcyBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBwdWJsaWMgM0RmeCBzcGVjcyBmb3IgdGhlIFZvb2RvbyAzMDAwICovCisKKy8qIG1hcHBlZF9pbyByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIFRERlhfU1RBVFVTCTB4MDAKKworI2RlZmluZSBJTlRDVFJMCQkoMHgwMDEwMDAwMCArIDB4MDQpCisjZGVmaW5lIENMSVAwTUlOCSgweDAwMTAwMDAwICsgMHgwOCkKKyNkZWZpbmUgQ0xJUDBNQVgJKDB4MDAxMDAwMDAgKyAweDBjKQorI2RlZmluZSBEU1RCQVNFCQkoMHgwMDEwMDAwMCArIDB4MTApCisjZGVmaW5lIERTVEZPUk1BVAkoMHgwMDEwMDAwMCArIDB4MTQpCisjZGVmaW5lIFNSQ0NPTE9SS0VZTUlOCSgweDAwMTAwMDAwICsgMHgxOCkKKyNkZWZpbmUgU1JDQ09MT1JLRVlNQVgJKDB4MDAxMDAwMDAgKyAweDFjKQorI2RlZmluZSBEU1RDT0xPUktFWU1JTgkoMHgwMDEwMDAwMCArIDB4MjApCisjZGVmaW5lIERTVENPTE9SS0VZTUFYCSgweDAwMTAwMDAwICsgMHgyNCkKKyNkZWZpbmUgQlJFU0VSUk9SMAkoMHgwMDEwMDAwMCArIDB4MjgpCisjZGVmaW5lIEJSRVNFUlJPUjEJKDB4MDAxMDAwMDAgKyAweDJjKQorI2RlZmluZSBST1BfMkQJCSgweDAwMTAwMDAwICsgMHgzMCkKKyNkZWZpbmUgU1JDQkFTRQkJKDB4MDAxMDAwMDAgKyAweDM0KQorI2RlZmluZSBDT01NQU5ERVhUUkFfMkQJKDB4MDAxMDAwMDAgKyAweDM4KQorI2RlZmluZSBQQVRURVJOMAkoMHgwMDEwMDAwMCArIDB4NDQpCisjZGVmaW5lIFBBVFRFUk4xCSgweDAwMTAwMDAwICsgMHg0OCkKKyNkZWZpbmUgQ0xJUDFNSU4JKDB4MDAxMDAwMDAgKyAweDRjKQorI2RlZmluZSBDTElQMU1BWAkoMHgwMDEwMDAwMCArIDB4NTApCisjZGVmaW5lIFNSQ0ZPUk1BVAkoMHgwMDEwMDAwMCArIDB4NTQpCisjZGVmaW5lIFNSQ1NJWkUJCSgweDAwMTAwMDAwICsgMHg1OCkKKyNkZWZpbmUgU1JDWFkJCSgweDAwMTAwMDAwICsgMHg1YykKKyNkZWZpbmUgQ09MT1JCQUNLCSgweDAwMTAwMDAwICsgMHg2MCkKKyNkZWZpbmUgQ09MT1JGT1JFCSgweDAwMTAwMDAwICsgMHg2NCkKKyNkZWZpbmUgRFNUU0laRQkJKDB4MDAxMDAwMDAgKyAweDY4KQorI2RlZmluZSBEU1RYWQkJKDB4MDAxMDAwMDAgKyAweDZjKQorI2RlZmluZSBDT01NQU5EXzJECSgweDAwMTAwMDAwICsgMHg3MCkKKyNkZWZpbmUgTEFVTkNIXzJECSgweDAwMTAwMDAwICsgMHg4MCkKKyNkZWZpbmUgUEFUVEVSTkJBU0UJKDB4MDAxMDAwMDAgKyAweDEwMCkKKworI2RlZmluZSBDT01NQU5EXzNECSgweDAwMjAwMDAwICsgMHgxMjApCisKKy8qIHJlZ2lzdGVyIGJpdGZpZWxkcyAobm90IGFsbCwgb25seSBhcyBuZWVkZWQpICovCisKKyNkZWZpbmUgQklUKHgpICgxVUwgPDwgKHgpKQorCisjZGVmaW5lIENPTU1BTkRfMkRfQklUQkxUCQkweDAxCisjZGVmaW5lIENPTU1BTkRfMkRfRklMTFJFQ1QJCTB4MDUKKyNkZWZpbmUgQ09NTUFORF8yRF9MSU5FCQkJMHgwNgorI2RlZmluZSBDT01NQU5EXzJEX1BPTFlHT05fRklMTAkJMHgwOAorI2RlZmluZSBDT01NQU5EXzJEX0lOSVRJQVRFCQlCSVQoOCkKKyNkZWZpbmUgQ09NTUFORF8yRF9SRVZFUlNFTElORQkJQklUKDkpCisjZGVmaW5lIENPTU1BTkRfMkRfU1RJUFBMRUxJTkUJCUJJVCgxMikKKyNkZWZpbmUgQ09NTUFORF8yRF9NT05PQ0hST01FX1BBVFQJQklUKDEzKQorI2RlZmluZSBDT01NQU5EXzJEX01PTk9DSFJPTUVfVFJBTlNQICAgIEJJVCgxNikKKworI2RlZmluZSBDT01NQU5EXzNEX05PUAkJCTB4MDAKKworI2RlZmluZSBTVEFUVVNfUkVUUkFDRQkJCUJJVCg2KQorI2RlZmluZSBTVEFUVVNfQlVTWQkJCUJJVCg5KQorCisjZW5kaWYgLyogXzNERlhfUkVHU19IICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiM2RmeC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9TRExfZmIzZGZ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwODNiOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiM2RmeC5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9ibGl0LmgiCisjaW5jbHVkZSAiU0RMX2ZiM2RmeC5oIgorI2luY2x1ZGUgIjNkZnhfbW1pby5oIgorCisKKy8qIFdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UgKi8KK3N0YXRpYyB2b2lkIFdhaXRWQkwoX1RISVMpCit7CisJLyogZmluZCBzdGFydCBvZiByZXRyYWNlICovCisJdGRmeF93YWl0aWRsZSgpOworCXdoaWxlKCAodGRmeF9pbjMyKFRERlhfU1RBVFVTKSAmIFNUQVRVU19SRVRSQUNFKSA9PSBTVEFUVVNfUkVUUkFDRSApCisJCTsKKwkvKiB3YWl0IHVudGlsIHdlJ3JlIHBhc3QgdGhlIHN0YXJ0ICovCisJd2hpbGUoICh0ZGZ4X2luMzIoVERGWF9TVEFUVVMpICYgU1RBVFVTX1JFVFJBQ0UpID09IDAgKQorCQk7IAorfQorc3RhdGljIHZvaWQgV2FpdElkbGUoX1RISVMpCit7CisJdGRmeF93YWl0aWRsZSgpOworfQorCisvKiBTZXRzIHZpZGVvIG1lbSBjb2xvcmtleSBhbmQgYWNjZWxlcmF0ZWQgYmxpdCBmdW5jdGlvbiAqLworc3RhdGljIGludCBTZXRIV0NvbG9yS2V5KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDMyIGtleSkKK3sKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcikKK3sKKwlpbnQgYnBwOworCVVpbnQzMiBkc3RfYmFzZTsKKwlVaW50MzIgZm9ybWF0OworCWludCBkc3RYLCBkc3RZOworCisJLyogRG9uJ3QgYmxpdCB0byB0aGUgZGlzcGxheSBzdXJmYWNlIHdoZW4gc3dpdGNoZWQgYXdheSAqLworCWlmICggc3dpdGNoZWRfYXdheSApIHsKKwkJcmV0dXJuIC0yOyAvKiBubyBoYXJkd2FyZSBhY2Nlc3MgKi8KKwl9CisJaWYgKCBkc3QgPT0gdGhpcy0+c2NyZWVuICkgeworCQlTRExfbXV0ZXhQKGh3X2xvY2spOworCX0KKworCS8qIFNldCB0aGUgZGVzdGluYXRpb24gcGl4ZWwgZm9ybWF0ICovCisJZHN0X2Jhc2UgPSAoKGNoYXIgKilkc3QtPnBpeGVscyAtIG1hcHBlZF9tZW0pOworCWJwcCA9IGRzdC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisJZm9ybWF0ID0gZHN0LT5waXRjaCB8ICgoYnBwKygoYnBwPT04KSA/IDAgOiA4KSkgPDwgMTMpOworCisJLyogQ2FsY3VsYXRlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmFzZSBjb29yZGluYXRlcyAqLworCWRzdFggPSByZWN0LT54OworCWRzdFkgPSByZWN0LT55OworCisJLyogRXhlY3V0ZSB0aGUgZmlsbCBjb21tYW5kICovCisJdGRmeF93YWl0KDYpOworCXRkZnhfb3V0MzIoRFNUQkFTRSwgZHN0X2Jhc2UpOworCXRkZnhfb3V0MzIoRFNURk9STUFULCBmb3JtYXQpOworCXRkZnhfb3V0MzIoQ09MT1JGT1JFLCBjb2xvcik7CisJdGRmeF9vdXQzMihDT01NQU5EXzJELCBDT01NQU5EXzJEX0ZJTExSRUNUKTsKKwl0ZGZ4X291dDMyKERTVFNJWkUsIHJlY3QtPncgfCAocmVjdC0+aCA8PCAxNikpOworCXRkZnhfb3V0MzIoTEFVTkNIXzJELCBkc3RYIHwgKGRzdFkgPDwgMTYpKTsKKworCUZCX0FkZEJ1c3lTdXJmYWNlKGRzdCk7CisKKwlpZiAoIGRzdCA9PSB0aGlzLT5zY3JlZW4gKSB7CisJCVNETF9tdXRleFYoaHdfbG9jayk7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBIV0FjY2VsQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCit7CisJU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gY3VycmVudF92aWRlbzsKKwlpbnQgYnBwOworCVVpbnQzMiBzcmNfZm9ybWF0OworCVVpbnQzMiBzcmNfYmFzZTsKKwlVaW50MzIgZHN0X2Jhc2U7CisJaW50IHNyY1gsIHNyY1k7CisJaW50IGRzdFgsIGRzdFk7CisJVWludDMyIGJsaXRvcDsKKwlVaW50MzIgdXNlX2NvbG9ya2V5OworCisJLyogRG9uJ3QgYmxpdCB0byB0aGUgZGlzcGxheSBzdXJmYWNlIHdoZW4gc3dpdGNoZWQgYXdheSAqLworCWlmICggc3dpdGNoZWRfYXdheSApIHsKKwkJcmV0dXJuIC0yOyAvKiBubyBoYXJkd2FyZSBhY2Nlc3MgKi8KKwl9CisJaWYgKCBkc3QgPT0gdGhpcy0+c2NyZWVuICkgeworCQlTRExfbXV0ZXhQKGh3X2xvY2spOworCX0KKworCS8qIFNldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwaXhlbCBmb3JtYXQgKi8KKwlzcmNfYmFzZSA9ICgoY2hhciAqKXNyYy0+cGl4ZWxzIC0gbWFwcGVkX21lbSk7CisJYnBwID0gc3JjLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKKwlzcmNfZm9ybWF0ID0gc3JjLT5waXRjaCB8ICgoYnBwKygoYnBwPT04KSA/IDAgOiA4KSkgPDwgMTMpOworCWRzdF9iYXNlID0gKChjaGFyICopZHN0LT5waXhlbHMgLSBtYXBwZWRfbWVtKTsKKwlicHAgPSBkc3QtPmZvcm1hdC0+Qml0c1BlclBpeGVsOworCisJc3JjWCA9IHNyY3JlY3QtPng7CisJc3JjWSA9IHNyY3JlY3QtPnk7CisJZHN0WCA9IGRzdHJlY3QtPng7CisJZHN0WSA9IGRzdHJlY3QtPnk7CisKKwkvKiBBc3NlbWJsZSB0aGUgYmxpdCBvcGVyYXRpb24gKi8KKwlibGl0b3AgPSBDT01NQU5EXzJEX0JJVEJMVCB8ICgweENDIDw8IDI0KTsKKwlpZiAoIHNyY1ggPD0gZHN0WCApIHsKKwkJYmxpdG9wIHw9IEJJVCgxNCk7CisJCXNyY1ggKz0gKGRzdHJlY3QtPncgLSAxKTsKKwkJZHN0WCArPSAoZHN0cmVjdC0+dyAtIDEpOworCX0KKwlpZiAoIHNyY1kgPD0gZHN0WSApIHsKKwkJYmxpdG9wIHw9IEJJVCgxNSk7CisJCXNyY1kgKz0gKGRzdHJlY3QtPmggLSAxKTsKKwkJZHN0WSArPSAoZHN0cmVjdC0+aCAtIDEpOworCX0KKworCS8qIFBlcmZvcm0gdGhlIGJsaXQhICovCisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgeworICAgIAkJdGRmeF93YWl0KDMpOworICAgIAkJdGRmeF9vdXQzMihTUkNDT0xPUktFWU1JTiwgc3JjLT5mb3JtYXQtPmNvbG9ya2V5KTsKKyAgICAJCXRkZnhfb3V0MzIoU1JDQ09MT1JLRVlNQVgsIHNyYy0+Zm9ybWF0LT5jb2xvcmtleSk7CisgICAgCQl0ZGZ4X291dDMyKFJPUF8yRCwgMHhBQTAwKTsKKwkJdXNlX2NvbG9ya2V5ID0gMTsKKwl9IGVsc2UgeworCQl1c2VfY29sb3JrZXkgPSAwOworCX0KKwl0ZGZ4X3dhaXQoOSk7CisJdGRmeF9vdXQzMihTUkNCQVNFLCAoVWludDMyKXNyY19iYXNlKTsKKwl0ZGZ4X291dDMyKFNSQ0ZPUk1BVCwgc3JjX2Zvcm1hdCk7CisJdGRmeF9vdXQzMihEU1RCQVNFLCAoVWludDMyKWRzdF9iYXNlKTsKKwl0ZGZ4X291dDMyKERTVEZPUk1BVCwgc3JjX2Zvcm1hdCk7CisJdGRmeF9vdXQzMihDT01NQU5EXzJELCBibGl0b3ApOworCXRkZnhfb3V0MzIoQ09NTUFOREVYVFJBXzJELCB1c2VfY29sb3JrZXkpOworCXRkZnhfb3V0MzIoRFNUU0laRSwgZHN0cmVjdC0+dyB8IChkc3RyZWN0LT5oIDw8IDE2KSk7CisJdGRmeF9vdXQzMihEU1RYWSwgZHN0WCB8IChkc3RZIDw8IDE2KSk7CisJdGRmeF9vdXQzMihMQVVOQ0hfMkQsIHNyY1ggfCAoc3JjWSA8PCAxNikpOworCisJRkJfQWRkQnVzeVN1cmZhY2Uoc3JjKTsKKwlGQl9BZGRCdXN5U3VyZmFjZShkc3QpOworCisJaWYgKCBkc3QgPT0gdGhpcy0+c2NyZWVuICkgeworCQlTRExfbXV0ZXhWKGh3X2xvY2spOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkc3QpCit7CisJaW50IGFjY2VsZXJhdGVkOworCisJLyogU2V0IGluaXRpYWwgYWNjZWxlcmF0aW9uIG9uICovCisJc3JjLT5mbGFncyB8PSBTRExfSFdBQ0NFTDsKKworCS8qIFNldCB0aGUgc3VyZmFjZSBhdHRyaWJ1dGVzICovCisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBICkgeworCQlpZiAoICEgdGhpcy0+aW5mby5ibGl0X2h3X0EgKSB7CisJCQlzcmMtPmZsYWdzICY9IH5TRExfSFdBQ0NFTDsKKwkJfQorCX0KKwlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKSB7CisJCWlmICggISB0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgKSB7CisJCQlzcmMtPmZsYWdzICY9IH5TRExfSFdBQ0NFTDsKKwkJfQorCX0KKworCS8qIENoZWNrIHRvIHNlZSBpZiBmaW5hbCBzdXJmYWNlIGJsaXQgaXMgYWNjZWxlcmF0ZWQgKi8KKwlhY2NlbGVyYXRlZCA9ICEhKHNyYy0+ZmxhZ3MgJiBTRExfSFdBQ0NFTCk7CisJaWYgKCBhY2NlbGVyYXRlZCApIHsKKwkJc3JjLT5tYXAtPmh3X2JsaXQgPSBIV0FjY2VsQmxpdDsKKwl9CisJcmV0dXJuKGFjY2VsZXJhdGVkKTsKK30KKwordm9pZCBGQl8zRGZ4QWNjZWwoX1RISVMsIF9fdTMyIGNhcmQpCit7CisJLyogV2UgaGF2ZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCBzdXJmYWNlIGZ1bmN0aW9ucyAqLworCXRoaXMtPkNoZWNrSFdCbGl0ID0gQ2hlY2tIV0JsaXQ7CisJd2FpdF92YmwgPSBXYWl0VkJMOworCXdhaXRfaWRsZSA9IFdhaXRJZGxlOworCisJLyogUmVzZXQgdGhlIDNEZnggY29udHJvbGxlciAqLworCXRkZnhfb3V0MzIoQlJFU0VSUk9SMCwgMCk7CisJdGRmeF9vdXQzMihCUkVTRVJST1IxLCAwKTsKKworCS8qIFRoZSAzRGZ4IGhhcyBhbiBhY2NlbGVyYXRlZCBjb2xvciBmaWxsICovCisJdGhpcy0+aW5mby5ibGl0X2ZpbGwgPSAxOworCXRoaXMtPkZpbGxIV1JlY3QgPSBGaWxsSFdSZWN0OworCisJLyogVGhlIDNEZnggaGFzIGFjY2VsZXJhdGVkIG5vcm1hbCBhbmQgY29sb3JrZXkgYmxpdHMgKi8KKwl0aGlzLT5pbmZvLmJsaXRfaHcgPSAxOworCXRoaXMtPmluZm8uYmxpdF9od19DQyA9IDE7CisJdGhpcy0+U2V0SFdDb2xvcktleSA9IFNldEhXQ29sb3JLZXk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYjNkZnguaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiM2RmeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTlkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYjNkZnguaApAQCAtMCwwICsxLDI5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogM0RmeCBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZm9yIHRoZSBTREwgZnJhbWVidWZmZXIgY29uc29sZSBkcml2ZXIgKi8KKworI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCisKKy8qIFNldCB1cCB0aGUgZHJpdmVyIGZvciAzRGZ4IGFjY2VsZXJhdGlvbiAqLworZXh0ZXJuIHZvaWQgRkJfM0RmeEFjY2VsKF9USElTLCBfX3UzMiBjYXJkKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiZWxvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmVsby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGZmODcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmVsby5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKyNpbmNsdWRlICJTRExfZmJ2aWRlby5oIgorI2luY2x1ZGUgIlNETF9mYmVsby5oIgorCisvKgorCWNhbGlicmF0aW9uIGRlZmF1bHQgdmFsdWVzCisJdmFsdWVzIGFyZSByZWFkIGZyb20gdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisKKwlTRExfRUxPX01JTl9YCisJU0RMX0VMT19NQVhfWAorCVNETF9FTE9fTUlOX1kKKwlTRExfRUxPX01BWF9ZCisqLworCitzdGF0aWMgaW50IEVMT19NSU5fWCA9IDQwMDsKK3N0YXRpYyBpbnQgRUxPX01BWF9YID0gMzY3MDsKK3N0YXRpYyBpbnQgRUxPX01JTl9ZID0gNTAwOworc3RhdGljIGludCBFTE9fTUFYX1kgPSAzNTQwOworCisjZGVmaW5lIEVMT19TTkFQX1NJWkUgNgorI2RlZmluZSBFTE9fVE9VQ0hfQllURQkJJ1QnCQorI2RlZmluZSBFTE9fSUQJCQknSScKKyNkZWZpbmUgRUxPX01PREUJCSdNJworI2RlZmluZSBFTE9fUEFSQU1FVEVSCQknUCcKKyNkZWZpbmUgRUxPX1JFUE9SVAkJJ0InCisjZGVmaW5lIEVMT19BQ0sJCQknQScJCisKKyNkZWZpbmUgRUxPX0lOSVRfQ0hFQ0tTVU0JMHhBQQorCisjZGVmaW5lIEVMT19CVE5fUFJFU1MJCTB4MDEJCisjZGVmaW5lIEVMT19TVFJFQU0JCTB4MDIKKyNkZWZpbmUgRUxPX0JUTl9SRUxFQVNFCQkweDA0CisKKyNkZWZpbmUgRUxPX1RPVUNIX01PREUJCTB4MDEKKyNkZWZpbmUgRUxPX1NUUkVBTV9NT0RFCQkweDAyCisjZGVmaW5lIEVMT19VTlRPVUNIX01PREUJMHgwNAorI2RlZmluZSBFTE9fUkFOR0VfQ0hFQ0tfTU9ERQkweDQwCisjZGVmaW5lIEVMT19UUklNX01PREUJCTB4MDIKKyNkZWZpbmUgRUxPX0NBTElCX01PREUJCTB4MDQKKyNkZWZpbmUgRUxPX1NDQUxJTkdfTU9ERQkweDA4CisjZGVmaW5lIEVMT19UUkFDS0lOR19NT0RFCTB4NDAKKworI2RlZmluZSBFTE9fU0VSSUFMX01BU0sJCTB4RjgKKworI2RlZmluZSBFTE9fU0VSSUFMX0lPCQknMCcKKworI2RlZmluZSBFTE9fTUFYX1RSSUFMUwkzCisjZGVmaW5lIEVMT19NQVhfV0FJVAkJMTAwMDAwCisjZGVmaW5lIEVMT19VTlRPVUNIX0RFTEFZCTUKKyNkZWZpbmUgRUxPX1JFUE9SVF9ERUxBWQkxCisKKy8qCWVsb1BhcnNlUGFja2V0CisqLworaW50IGVsb1BhcnNlUGFja2V0KHVuc2lnbmVkIGNoYXIqIG1vdXNlYnVmLCBpbnQqIGR4LCBpbnQqIGR5LCBpbnQqIGJ1dHRvbl9zdGF0ZSkgeworCXN0YXRpYyBpbnQgZWxvX2J1dHRvbiA9IDA7CisJc3RhdGljIGludCBsYXN0X3ggPSAwOworCXN0YXRpYyBpbnQgbGFzdF95ID0gMDsKKwlpbnQgeCx5OworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIHRvdWNoIHBhY2tldCAqLworCWlmIChtb3VzZWJ1ZlsxXSAhPSBFTE9fVE9VQ0hfQllURSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwl4ID0gKChtb3VzZWJ1Zls0XSA8PCA4KSB8IG1vdXNlYnVmWzNdKTsKKwl5ID0gKChtb3VzZWJ1Zls2XSA8PCA4KSB8IG1vdXNlYnVmWzVdKTsKKworCWlmKChTRExfYWJzKHggLSBsYXN0X3gpID4gRUxPX1NOQVBfU0laRSkgfHwgKFNETF9hYnMoeSAtIGxhc3RfeSkgPiBFTE9fU05BUF9TSVpFKSkgeworCQkqZHggPSAoKG1vdXNlYnVmWzRdIDw8IDgpIHwgbW91c2VidWZbM10pOworCQkqZHkgPSAoKG1vdXNlYnVmWzZdIDw8IDgpIHwgbW91c2VidWZbNV0pOworCX0KKwllbHNlIHsKKwkJKmR4ID0gbGFzdF94OworCQkqZHkgPSBsYXN0X3k7CisJfQorCisJbGFzdF94ID0gKmR4OworCWxhc3RfeSA9ICpkeTsKKworCWlmICggKG1vdXNlYnVmWzJdICYgMHgwNykgPT0gRUxPX0JUTl9QUkVTUyApIHsKKwkJZWxvX2J1dHRvbiA9IDE7CisJfQorCWlmICggKG1vdXNlYnVmWzJdICYgMHgwNykgPT0gRUxPX0JUTl9SRUxFQVNFICkgeworCQllbG9fYnV0dG9uID0gMDsKKwl9CisKKwkqYnV0dG9uX3N0YXRlID0gZWxvX2J1dHRvbjsKKwlyZXR1cm4gMTsKK30KKworLyoJQ29udmVydCB0aGUgcmF3IGNvb3JkaW5hdGVzIGZyb20gdGhlIEVMTyBjb250cm9sbGVyCisJdG8gYSBzY3JlZW4gcG9zaXRpb24uCisqLwordm9pZCBlbG9Db252ZXJ0WFkoX1RISVMsIGludCAqZHgsICBpbnQgKmR5KSB7CisJaW50IGlucHV0X3ggPSAqZHg7CisJaW50IGlucHV0X3kgPSAqZHk7CisJaW50IHdpZHRoID0gRUxPX01BWF9YIC0gRUxPX01JTl9YOworCWludCBoZWlnaHQgPSBFTE9fTUFYX1kgLSBFTE9fTUlOX1k7CisKKwkqZHggPSAoKGludCljYWNoZV92aW5mby54cmVzIC0gKChpbnQpY2FjaGVfdmluZm8ueHJlcyAqIChpbnB1dF94IC0gRUxPX01JTl9YKSkgLyB3aWR0aCk7CisJKmR5ID0gKGNhY2hlX3ZpbmZvLnlyZXMgKiAoaW5wdXRfeSAtIEVMT19NSU5fWSkpIC8gaGVpZ2h0OworfQorCisKKy8qCWVsb0dldFBhY2tldAorKi8KK2ludCBlbG9HZXRQYWNrZXQodW5zaWduZWQgY2hhciogYnVmZmVyLCBpbnQqIGJ1ZmZlcl9wLCBpbnQqIGNoZWNrc3VtLCBpbnQgZmQpIHsKKwlpbnQgbnVtX2J5dGVzOworCWludCBvazsKKworCWlmKGZkID09IDApIHsKKwkJbnVtX2J5dGVzID0gRUxPX1BBQ0tFVF9TSVpFOworCX0KKwllbHNlIHsKKwkJbnVtX2J5dGVzID0gcmVhZChmZCwKKwkJCShjaGFyICopIChidWZmZXIgKyAqYnVmZmVyX3ApLAorCQkJRUxPX1BBQ0tFVF9TSVpFIC0gKmJ1ZmZlcl9wKTsKKwl9CisKKwlpZiAobnVtX2J5dGVzIDwgMCkgeworI2lmZGVmIERFQlVHX01PVVNFCisJCWZwcmludGYoc3RkZXJyLCAiU3lzdGVtIGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBFbG9ncmFwaGljcyB0b3VjaHNjcmVlbi5cbiIpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChudW1fYnl0ZXMpIHsKKwkJaWYgKCgqYnVmZmVyX3AgPT0gMCkgJiYgKGJ1ZmZlclswXSAhPSBFTE9fU1RBUlRfQllURSkpIHsKKwkJCVNETF9tZW1jcHkoJmJ1ZmZlclswXSwgJmJ1ZmZlclsxXSwgbnVtX2J5dGVzLTEpOworCQl9CisJCWVsc2UgeworCQkJaWYgKCpidWZmZXJfcCA8IEVMT19QQUNLRVRfU0laRS0xKSB7CisJCQkJKmNoZWNrc3VtID0gKmNoZWNrc3VtICsgYnVmZmVyWypidWZmZXJfcF07CisJCQkJKmNoZWNrc3VtID0gKmNoZWNrc3VtICUgMjU2OworCQkJfQorCQkJKCpidWZmZXJfcCkrKzsKKwkJfQorCQludW1fYnl0ZXMtLTsKKwl9CisKKwlpZiAoKmJ1ZmZlcl9wID09IEVMT19QQUNLRVRfU0laRSkgeworCQlvayA9ICgqY2hlY2tzdW0gPT0gYnVmZmVyW0VMT19QQUNLRVRfU0laRS0xXSk7CisJCSpjaGVja3N1bSA9IEVMT19JTklUX0NIRUNLU1VNOworCQkqYnVmZmVyX3AgPSAwOworCisJCWlmICghb2spIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qIGVsb1NlbmRQYWNrZXQKKyovCisKK2ludCBlbG9TZW5kUGFja2V0KHVuc2lnbmVkIGNoYXIqIHBhY2tldCwgaW50IGZkKQoreworCWludCBpLCByZXN1bHQ7CisJaW50IHN1bSA9IEVMT19JTklUX0NIRUNLU1VNOworCisJcGFja2V0WzBdID0gRUxPX1NUQVJUX0JZVEU7CisJZm9yIChpID0gMDsgaSA8IEVMT19QQUNLRVRfU0laRS0xOyBpKyspIHsKKwkJc3VtICs9IHBhY2tldFtpXTsKKwkJc3VtICY9IDB4RkY7CisJfQorCXBhY2tldFtFTE9fUEFDS0VUX1NJWkUtMV0gPSBzdW07CisKKwlyZXN1bHQgPSB3cml0ZShmZCwgcGFja2V0LCBFTE9fUEFDS0VUX1NJWkUpOworCisJaWYgKHJlc3VsdCAhPSBFTE9fUEFDS0VUX1NJWkUpIHsKKyNpZmRlZiBERUJVR19NT1VTRQorCQlwcmludGYoIlN5c3RlbSBlcnJvciB3aGlsZSBzZW5kaW5nIHRvIEVsb2dyYXBoaWNzIHRvdWNoc2NyZWVuLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgeworCQlyZXR1cm4gMTsKKwl9Cit9CisKKworLyoJZWxvV2FpdEZvcklucHV0CisgKi8KK2ludCBlbG9XYWl0Rm9ySW5wdXQoaW50IGZkLCBpbnQgdGltZW91dCkKK3sKKwlmZF9zZXQgcmVhZGZkczsKKwlzdHJ1Y3QgdGltZXZhbCB0bzsKKwlpbnQgcjsKKworCUZEX1pFUk8oJnJlYWRmZHMpOworCUZEX1NFVChmZCwgJnJlYWRmZHMpOworCXRvLnR2X3NlYyA9IDA7CisJdG8udHZfdXNlYyA9IHRpbWVvdXQ7CisKKwlyID0gc2VsZWN0KEZEX1NFVFNJWkUsICZyZWFkZmRzLCBOVUxMLCBOVUxMLCAmdG8pOworCXJldHVybiByOworfQorCisvKgllbG9XYWl0UmVwbHkKKyAqLworaW50IGVsb1dhaXRSZXBseSh1bnNpZ25lZCBjaGFyIHR5cGUsIHVuc2lnbmVkIGNoYXIgKnJlcGx5LCBpbnQgZmQpIHsKKwlpbnQgb2s7CisJaW50IGksIHJlc3VsdDsKKwlpbnQgcmVwbHlfcCA9IDA7CisJaW50IHN1bSA9IEVMT19JTklUX0NIRUNLU1VNOworCisJaSA9IEVMT19NQVhfVFJJQUxTOworCWRvIHsKKwkJb2sgPSAwOworCisJCXJlc3VsdCA9IGVsb1dhaXRGb3JJbnB1dChmZCwgRUxPX01BWF9XQUlUKTsKKworCQlpZiAocmVzdWx0ID4gMCkgeworCQkJb2sgPSBlbG9HZXRQYWNrZXQocmVwbHksICZyZXBseV9wLCAmc3VtLCBmZCk7CisKKwkJCWlmIChvayAmJiByZXBseVsxXSAhPSB0eXBlICYmIHR5cGUgIT0gRUxPX1BBUkFNRVRFUikgeworI2lmZGVmIERFQlVHX01PVVNFCisJCQkJZnByaW50ZihzdGRlcnIsICJXcm9uZyByZXBseSByZWNlaXZlZFxuIik7CisjZW5kaWYKKwkJCQlvayA9IDA7CisJCQl9CisJCX0KKwkJZWxzZSB7CisjaWZkZWYgREVCVUdfTU9VU0UKKwkJCWZwcmludGYoc3RkZXJyLCAiTm8gaW5wdXQhXG4iKTsKKyNlbmRpZgorCQl9CisKKwkJaWYgKHJlc3VsdCA9PSAwKSB7CisJCQlpLS07CisJCX0KKwl9IHdoaWxlKCFvayAmJiAoaT4wKSk7CisKKwlyZXR1cm4gb2s7Cit9CisKKworLyoJZWxvV2FpdEFjaworICovCisKK2ludCBlbG9XYWl0QWNrKGludCBmZCkgeworCXVuc2lnbmVkIGNoYXIgcGFja2V0W0VMT19QQUNLRVRfU0laRV07CisJaW50IGksIG5iX2Vycm9yczsKKworCWlmIChlbG9XYWl0UmVwbHkoRUxPX0FDSywgcGFja2V0LCBmZCkpIHsKKwkJZm9yIChpID0gMCwgbmJfZXJyb3JzID0gMDsgaSA8IDQ7IGkrKykgeworCQkJaWYgKHBhY2tldFsyICsgaV0gIT0gJzAnKSB7CisJCQkJbmJfZXJyb3JzKys7CisJCQl9CisJCX0KKworCQlpZiAobmJfZXJyb3JzICE9IDApIHsKKyNpZmRlZiBERUJVR19NT1VTRQorCQkJZnByaW50ZihzdGRlcnIsICJFbG9ncmFwaGljcyBhY2tub3dsZWRnZSBwYWNrZXQgcmVwb3J0cyAlZCBlcnJvcnNcbiIsIG5iX2Vycm9ycyk7CisjZW5kaWYKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworCisvKgllbG9TZW5kUXVlcnkgLS0KKyovCitpbnQgZWxvU2VuZFF1ZXJ5KHVuc2lnbmVkIGNoYXIgKnJlcXVlc3QsIHVuc2lnbmVkIGNoYXIqIHJlcGx5LCBpbnQgZmQpIHsKKwlpbnQgb2s7CisKKwlpZiAoZWxvU2VuZFBhY2tldChyZXF1ZXN0LCBmZCkpIHsKKwkJb2sgPSBlbG9XYWl0UmVwbHkodG91cHBlcihyZXF1ZXN0WzFdKSwgcmVwbHksIGZkKTsKKwkJaWYgKG9rKSB7CisJCQlvayA9IGVsb1dhaXRBY2soZmQpOworCQl9CisJCXJldHVybiBvazsKKwl9CisJZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworCisvKgllbG9TZW5kQ29udHJvbAorKi8KK2ludCBlbG9TZW5kQ29udHJvbCh1bnNpZ25lZCBjaGFyKiBjb250cm9sLCBpbnQgZmQpIHsKKwlpZiAoZWxvU2VuZFBhY2tldChjb250cm9sLCBmZCkpIHsKKwkJcmV0dXJuIGVsb1dhaXRBY2soZmQpOworCX0KKwllbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKgllbG9Jbml0Q29udHJvbGxlcgorKi8KK2ludCBlbG9Jbml0Q29udHJvbGxlcihpbnQgZmQpIHsKKwl1bnNpZ25lZCBjaGFyIHJlcVtFTE9fUEFDS0VUX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgcmVwbHlbRUxPX1BBQ0tFVF9TSVpFXTsKKwljb25zdCBjaGFyICpidWZmZXIgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCisJc3RydWN0IHRlcm1pb3MgbW91c2VfdGVybWlvczsKKworCS8qIHRyeSB0byByZWFkIHRoZSBjYWxpYnJhdGlvbiB2YWx1ZXMgKi8KKwlidWZmZXIgPSBTRExfZ2V0ZW52KCJTRExfRUxPX01JTl9YIik7CisJaWYoYnVmZmVyKSB7CisJCUVMT19NSU5fWCA9IFNETF9hdG9pKGJ1ZmZlcik7CisJfQorCWJ1ZmZlciA9IFNETF9nZXRlbnYoIlNETF9FTE9fTUFYX1giKTsKKwlpZihidWZmZXIpIHsKKwkJRUxPX01BWF9YID0gU0RMX2F0b2koYnVmZmVyKTsKKwl9CisJYnVmZmVyID0gU0RMX2dldGVudigiU0RMX0VMT19NSU5fWSIpOworCWlmKGJ1ZmZlcikgeworCQlFTE9fTUlOX1kgPSBTRExfYXRvaShidWZmZXIpOworCX0KKwlidWZmZXIgPSBTRExfZ2V0ZW52KCJTRExfRUxPX01BWF9ZIik7CisJaWYoYnVmZmVyKSB7CisJCUVMT19NQVhfWSA9IFNETF9hdG9pKGJ1ZmZlcik7CisJfQorCisjaWZkZWYgREVCVUdfTU9VU0UKKwlmcHJpbnRmKCBzdGRlcnIsICJFTE8gY2FsaWJyYXRpb24gdmFsdWVzOlxubWluX3g6ICVpXG5tYXhfeDogJWlcbm1pbl95OiAlaVxubWF4X3k6ICVpXG4iLAorCQlFTE9fTUlOX1gsCisJCUVMT19NQVhfWCwKKwkJRUxPX01JTl9ZLAorCQlFTE9fTUFYX1kpOworI2VuZGlmCisKKwkvKiBzZXQgY29tbSBwYXJhbXMgKi8KKwlTRExfbWVtc2V0KCZtb3VzZV90ZXJtaW9zLCAwLCBzaXplb2YobW91c2VfdGVybWlvcykpOworCW1vdXNlX3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBDTE9DQUw7CisJbW91c2VfdGVybWlvcy5jX2NjW1ZNSU5dID0gMTsKKwlyZXN1bHQgPSB0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZtb3VzZV90ZXJtaW9zKTsKKworCWlmIChyZXN1bHQgPCAwKSB7CisjaWZkZWYgREVCVUdfTU9VU0UKKwkJZnByaW50Ziggc3RkZXJyLCAiVW5hYmxlIHRvIGNvbmZpZ3VyZSBFbG9ncmFwaGljcyB0b3VjaHNjcmVlbiBwb3J0XG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwlTRExfbWVtc2V0KHJlcSwgMCwgRUxPX1BBQ0tFVF9TSVpFKTsKKwlyZXFbMV0gPSB0b2xvd2VyKEVMT19QQVJBTUVURVIpOworCWlmICghZWxvU2VuZFF1ZXJ5KHJlcSwgcmVwbHksIGZkKSkgeworI2lmZGVmIERFQlVHX01PVVNFCisJCWZwcmludGYoIHN0ZGVyciwgIk5vdCBhdCB0aGUgc3BlY2lmaWVkIHJhdGUgb3IgbW9kZWwgMjMxMCwgd2lsbCBjb250aW51ZVxuIik7CisjZW5kaWYKKwl9CisKKwlTRExfbWVtc2V0KHJlcSwgMCwgRUxPX1BBQ0tFVF9TSVpFKTsKKwlyZXFbMV0gPSB0b2xvd2VyKEVMT19JRCk7CisJaWYgKGVsb1NlbmRRdWVyeShyZXEsIHJlcGx5LCBmZCkpIHsKKyNpZmRlZiBERUJVR19NT1VTRQorCQlmcHJpbnRmKHN0ZGVyciwgIk9rLCBjb250cm9sbGVyIGNvbmZpZ3VyZWQhXG4iKTsKKyNlbmRpZgorCX0KKwllbHNlIHsKKyNpZmRlZiBERUJVR19NT1VTRQorCQlmcHJpbnRmKCBzdGRlcnIsICJVbmFibGUgdG8gYXNrIEVsb2dyYXBoaWNzIHRvdWNoc2NyZWVuIGlkZW50aWZpY2F0aW9uXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwlTRExfbWVtc2V0KHJlcSwgMCwgRUxPX1BBQ0tFVF9TSVpFKTsKKwlyZXFbMV0gPSBFTE9fTU9ERTsKKwlyZXFbM10gPSBFTE9fVE9VQ0hfTU9ERSB8IEVMT19TVFJFQU1fTU9ERSB8IEVMT19VTlRPVUNIX01PREU7CisJcmVxWzRdID0gRUxPX1RSQUNLSU5HX01PREU7CisJaWYgKCFlbG9TZW5kQ29udHJvbChyZXEsIGZkKSkgeworI2lmZGVmIERFQlVHX01PVVNFCisJCWZwcmludGYoIHN0ZGVyciwgIlVuYWJsZSB0byBjaGFuZ2UgRWxvZ3JhcGhpY3MgdG91Y2hzY3JlZW4gb3BlcmF0aW5nIG1vZGVcbiIpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCVNETF9tZW1zZXQocmVxLCAwLCBFTE9fUEFDS0VUX1NJWkUpOworCXJlcVsxXSA9IEVMT19SRVBPUlQ7CisJcmVxWzJdID0gRUxPX1VOVE9VQ0hfREVMQVk7CisJcmVxWzNdID0gRUxPX1JFUE9SVF9ERUxBWTsKKwlpZiAoIWVsb1NlbmRDb250cm9sKHJlcSwgZmQpKSB7CisjaWZkZWYgREVCVUdfTU9VU0UKKwkJZnByaW50Ziggc3RkZXJyLCAiVW5hYmxlIHRvIGNoYW5nZSBFbG9ncmFwaGljcyB0b3VjaHNjcmVlbiByZXBvcnRzIHRpbWluZ3NcbiIpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgZWxvUmVhZFBvc2l0aW9uKF9USElTLCBpbnQgZmQsIGludCogeCwgaW50KiB5LCBpbnQqIGJ1dHRvbl9zdGF0ZSwgaW50KiByZWFseCwgaW50KiByZWFseSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltFTE9fUEFDS0VUX1NJWkVdOworICAgICAgICBpbnQgcG9pbnRlciA9IDA7CisgICAgICAgIGludCBjaGVja3N1bSA9IEVMT19JTklUX0NIRUNLU1VNOworCisgICAgICAgIHdoaWxlKHBvaW50ZXIgPCBFTE9fUEFDS0VUX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBpZihlbG9HZXRQYWNrZXQoYnVmZmVyLCAmcG9pbnRlciwgJmNoZWNrc3VtLCBmZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCFlbG9QYXJzZVBhY2tldChidWZmZXIsIHJlYWx4LCByZWFseSwgYnV0dG9uX3N0YXRlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAqcmVhbHg7CisgICAgICAgICp5ID0gKnJlYWx5OworCisgICAgICAgIGVsb0NvbnZlcnRYWSh0aGlzLCB4LCB5KTsKKwkKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiZWxvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmVsby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmRlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmVsby5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIFNETF9mYmVsb19oCisjZGVmaW5lIFNETF9mYmVsb19oCisKKyNpbmNsdWRlICJTRExfZmJ2aWRlby5oIgorCisvKiBFTE8gKi8KKyNkZWZpbmUgRUxPX1BBQ0tFVF9TSVpFCTEwCisjZGVmaW5lIEVMT19TVEFSVF9CWVRFCQknVScKKworLyoJZWxvQ29udmVydFhZCisJQ29udmVydCB0aGUgcmF3IGNvb3JkaW5hdGVzIGZyb20gdGhlIEVMTyBjb250cm9sbGVyCisJdG8gYSBzY3JlZW4gcG9zaXRpb24uCisqLwordm9pZCBlbG9Db252ZXJ0WFkoX1RISVMsIGludCAqZHgsICBpbnQgKmR5KTsKKworLyoJZWxvSW5pdENvbnRyb2xsZXIoaW50IGZkKQorCUluaXRpYWxpemUgdGhlIEVMTyBzZXJpYWwgdG91Y2hzY3JlZW4gY29udHJvbGxlcgorKi8KK2ludCBlbG9Jbml0Q29udHJvbGxlcihpbnQgZmQpOworCisvKgllbG9QYXJzZVBhY2tldAorCWV4dHJhY3QgcG9zaXRpb24gYW5kIGJ1dHRvbiBzdGF0ZSBmcm9tIGEgcGFja2V0CisqLworaW50IGVsb1BhcnNlUGFja2V0KHVuc2lnbmVkIGNoYXIqIG1vdXNlYnVmLCBpbnQqIGR4LCBpbnQqIGR5LCBpbnQqIGJ1dHRvbl9zdGF0ZSk7CisKKy8qCWVsb1JlYWRQb3NpdGlvbgorCXJlYWQgYSBwYWNrZXQgYW5kIGdldCB0aGUgY3Vyc29yIHBvc2l0aW9uCisqLworCitpbnQgZWxvUmVhZFBvc2l0aW9uKF9USElTLCBpbnQgZmQsIGludCogeCwgaW50KiB5LCBpbnQqIGJ1dHRvbl9zdGF0ZSwgaW50KiByZWFseCwgaW50KiByZWFseSk7CisKKyNlbmRpZgkvKiBTRExfZmJlbG9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9TRExfZmJldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzNjlhNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiZXZlbnRzLmMKQEAgLTAsMCArMSwxMjU0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgY29uc29sZSBldmVudHMgaW50byBTREwgZXZlbnRzICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKiBGb3IgcGFyc2luZyAvcHJvYyAqLworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxsaW51eC92dC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2ZiZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfZmJrZXlzLmgiCisKKyNpbmNsdWRlICJTRExfZmJlbG8uaCIKKworI2lmbmRlZiBHUE1fTk9ERV9GSUZPCisjZGVmaW5lIEdQTV9OT0RFX0ZJRk8JIi9kZXYvZ3BtZGF0YSIKKyNlbmRpZgorCisvKiNkZWZpbmUgREVCVUdfS0VZQk9BUkQqLworLyojZGVmaW5lIERFQlVHX01PVVNFKi8KKworLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlcyBmcm9tIGEgY29uc29sZSBzY2FuY29kZSB0byBhIFNETCBrZXlzeW0gKi8KKyNkZWZpbmUgTlVNX1ZHQUtFWU1BUFMJKDE8PEtHX0NBUFNTSElGVCkKK3N0YXRpYyBVaW50MTYgdmdhX2tleW1hcFtOVU1fVkdBS0VZTUFQU11bTlJfS0VZU107CitzdGF0aWMgU0RMS2V5IGtleW1hcFsxMjhdOworc3RhdGljIFVpbnQxNiBrZXltYXBfdGVtcFsxMjhdOyAvKiBvbmx5IHVzZWQgYXQgc3RhcnR1cCAqLworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSk7CisKKy8qIFVnaCwgd2UgaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGtlcm5lbCdzIGtleXN5bSBtYXBwaW5nIGNvZGUuLi4KKyAgIE9oLCBpdCdzIG5vdCBzbyBiYWQuIDotKQorCisgICBGSVhNRTogQWRkIGtleWJvYXJkIExFRCBoYW5kbGluZyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIEZCX3ZnYWluaXRrZXltYXBzKGludCBmZCkKK3sKKwlzdHJ1Y3Qga2JlbnRyeSBlbnRyeTsKKwlpbnQgbWFwLCBpOworCisJLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgYXJlIHBhc3NlZCBhIGNsb3NlZCBrZXlib2FyZCAqLworCWlmICggZmQgPCAwICkgeworCQlyZXR1cm47CisJfQorCisJLyogTG9hZCBhbGwgdGhlIGtleXN5bSBtYXBwaW5ncyAqLworCWZvciAoIG1hcD0wOyBtYXA8TlVNX1ZHQUtFWU1BUFM7ICsrbWFwICkgeworCQlTRExfbWVtc2V0KHZnYV9rZXltYXBbbWFwXSwgMCwgTlJfS0VZUypzaXplb2YoVWludDE2KSk7CisJCWZvciAoIGk9MDsgaTxOUl9LRVlTOyArK2kgKSB7CisJCQllbnRyeS5rYl90YWJsZSA9IG1hcDsKKwkJCWVudHJ5LmtiX2luZGV4ID0gaTsKKwkJCWlmICggaW9jdGwoZmQsIEtER0tCRU5ULCAmZW50cnkpID09IDAgKSB7CisJCQkJLyogZmlsbCBrZXl0ZW1wLiBUaGlzIHJlcGxhY2VzIFNETF9mYmtleXMuaCAqLworCQkJCWlmICggKG1hcCA9PSAwKSAmJiAoaTwxMjgpICkgeworCQkJCQlrZXltYXBfdGVtcFtpXSA9IGVudHJ5LmtiX3ZhbHVlOworCQkJCX0KKwkJCQkvKiBUaGUgIkVudGVyIiBrZXkgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKwkJCQlpZiAoIGVudHJ5LmtiX3ZhbHVlID09IEtfRU5URVIgKSB7CisJCQkJCWVudHJ5LmtiX3ZhbHVlID0gSyhLVF9BU0NJSSwxMyk7CisJCQkJfQorCQkJCS8qIEhhbmRsZSBudW1wYWQgc3BlY2lhbGx5IGFzIHdlbGwgKi8KKwkJCQlpZiAoIEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX1BBRCApIHsKKwkJCQkJc3dpdGNoICggZW50cnkua2JfdmFsdWUgKSB7CisJCQkJCWNhc2UgS19QMDoKKwkJCQkJY2FzZSBLX1AxOgorCQkJCQljYXNlIEtfUDI6CisJCQkJCWNhc2UgS19QMzoKKwkJCQkJY2FzZSBLX1A0OgorCQkJCQljYXNlIEtfUDU6CisJCQkJCWNhc2UgS19QNjoKKwkJCQkJY2FzZSBLX1A3OgorCQkJCQljYXNlIEtfUDg6CisJCQkJCWNhc2UgS19QOToKKwkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1lbnRyeS5rYl92YWx1ZTsKKwkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXSs9ICcwJzsKKwkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgS19QUExVUzoKKwkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcrJyk7CisJCQkJCQlicmVhazsKKwkJCQkJCQkJCQljYXNlIEtfUE1JTlVTOgorCQkJCQkJdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJy0nKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgS19QU1RBUjoKKwkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcqJyk7CisJCQkJCQlicmVhazsKKwkJCQkJCQkJCQljYXNlIEtfUFNMQVNIOgorCQkJCQkJdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJy8nKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgS19QRU5URVI6CisJCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnXHInKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgS19QQ09NTUE6CisJCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLCcpOworCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJY2FzZSBLX1BET1Q6CisJCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLicpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBEbyB0aGUgbm9ybWFsIGtleSB0cmFuc2xhdGlvbiAqLworCQkJCWlmICggKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0xBVElOKSB8fAorCQkJCQkgKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0FTQ0lJKSB8fAorCQkJCQkgKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0xFVFRFUikgKSB7CisJCQkJCXZnYV9rZXltYXBbbWFwXVtpXSA9IGVudHJ5LmtiX3ZhbHVlOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworaW50IEZCX0luR3JhcGhpY3NNb2RlKF9USElTKQoreworCXJldHVybigoa2V5Ym9hcmRfZmQgPj0gMCkgJiYgKHNhdmVkX2tiZF9tb2RlID49IDApKTsKK30KKworaW50IEZCX0VudGVyR3JhcGhpY3NNb2RlKF9USElTKQoreworCXN0cnVjdCB0ZXJtaW9zIGtleWJvYXJkX3Rlcm1pb3M7CisKKwkvKiBTZXQgbWVkaXVtLXJhdyBrZXlib2FyZCBtb2RlICovCisJaWYgKCAoa2V5Ym9hcmRfZmQgPj0gMCkgJiYgIUZCX0luR3JhcGhpY3NNb2RlKHRoaXMpICkgeworCisJCS8qIFN3aXRjaCB0byB0aGUgY29ycmVjdCB2aXJ0dWFsIHRlcm1pbmFsICovCisJCWlmICggY3VycmVudF92dCA+IDAgKSB7CisJCQlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXRlOworCisJCQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBWVF9HRVRTVEFURSwgJnZ0c3RhdGUpID09IDAgKSB7CisJCQkJc2F2ZWRfdnQgPSB2dHN0YXRlLnZfYWN0aXZlOworCQkJfQorCQkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgVlRfQUNUSVZBVEUsIGN1cnJlbnRfdnQpID09IDAgKSB7CisJCQkJaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX1dBSVRBQ1RJVkUsIGN1cnJlbnRfdnQpOworCQkJfQorCQl9CisKKwkJLyogU2V0IHRoZSB0ZXJtaW5hbCBpbnB1dCBtb2RlICovCisJCWlmICggdGNnZXRhdHRyKGtleWJvYXJkX2ZkLCAmc2F2ZWRfa2JkX3Rlcm1pb3MpIDwgMCApIHsKKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGdldCB0ZXJtaW5hbCBhdHRyaWJ1dGVzIik7CisJCQlpZiAoIGtleWJvYXJkX2ZkID4gMCApIHsKKwkJCQljbG9zZShrZXlib2FyZF9mZCk7CisJCQl9CisJCQlrZXlib2FyZF9mZCA9IC0xOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBLREdLQk1PREUsICZzYXZlZF9rYmRfbW9kZSkgPCAwICkgeworCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gZ2V0IGN1cnJlbnQga2V5Ym9hcmQgbW9kZSIpOworCQkJaWYgKCBrZXlib2FyZF9mZCA+IDAgKSB7CisJCQkJY2xvc2Uoa2V5Ym9hcmRfZmQpOworCQkJfQorCQkJa2V5Ym9hcmRfZmQgPSAtMTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJa2V5Ym9hcmRfdGVybWlvcyA9IHNhdmVkX2tiZF90ZXJtaW9zOworCQlrZXlib2FyZF90ZXJtaW9zLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgSVNJRyk7CisJCWtleWJvYXJkX3Rlcm1pb3MuY19pZmxhZyAmPSB+KElTVFJJUCB8IElHTkNSIHwgSUNSTkwgfCBJTkxDUiB8IElYT0ZGIHwgSVhPTik7CisJCWtleWJvYXJkX3Rlcm1pb3MuY19jY1tWTUlOXSA9IDA7CisJCWtleWJvYXJkX3Rlcm1pb3MuY19jY1tWVElNRV0gPSAwOworCQlpZiAodGNzZXRhdHRyKGtleWJvYXJkX2ZkLCBUQ1NBRkxVU0gsICZrZXlib2FyZF90ZXJtaW9zKSA8IDApIHsKKwkJCUZCX0Nsb3NlS2V5Ym9hcmQodGhpcyk7CisJCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBzZXQgdGVybWluYWwgYXR0cmlidXRlcyIpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQkvKiBUaGlzIHdpbGwgZmFpbCBpZiB3ZSBhcmVuJ3Qgcm9vdCBvciB0aGlzIGlzbid0IG91ciB0dHkgKi8KKwkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgS0RTS0JNT0RFLCBLX01FRElVTVJBVykgPCAwICkgeworCQkJRkJfQ2xvc2VLZXlib2FyZCh0aGlzKTsKKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIHNldCBrZXlib2FyZCBpbiByYXcgbW9kZSIpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBLRFNFVE1PREUsIEtEX0dSQVBISUNTKSA8IDAgKSB7CisJCQlGQl9DbG9zZUtleWJvYXJkKHRoaXMpOworCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gc2V0IGtleWJvYXJkIGluIGdyYXBoaWNzIG1vZGUiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJLyogUHJldmVudCBzd2l0Y2hpbmcgdGhlIHZpcnR1YWwgdGVybWluYWwgKi8KKwkJaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX0xPQ0tTV0lUQ0gsIDEpOworCX0KKwlyZXR1cm4oa2V5Ym9hcmRfZmQpOworfQorCit2b2lkIEZCX0xlYXZlR3JhcGhpY3NNb2RlKF9USElTKQoreworCWlmICggRkJfSW5HcmFwaGljc01vZGUodGhpcykgKSB7CisJCWlvY3RsKGtleWJvYXJkX2ZkLCBLRFNFVE1PREUsIEtEX1RFWFQpOworCQlpb2N0bChrZXlib2FyZF9mZCwgS0RTS0JNT0RFLCBzYXZlZF9rYmRfbW9kZSk7CisJCXRjc2V0YXR0cihrZXlib2FyZF9mZCwgVENTQUZMVVNILCAmc2F2ZWRfa2JkX3Rlcm1pb3MpOworCQlzYXZlZF9rYmRfbW9kZSA9IC0xOworCisJCS8qIEhlYWQgYmFjayBvdmVyIHRvIHRoZSBvcmlnaW5hbCB2aXJ0dWFsIHRlcm1pbmFsICovCisJCWlvY3RsKGtleWJvYXJkX2ZkLCBWVF9VTkxPQ0tTV0lUQ0gsIDEpOworCQlpZiAoIHNhdmVkX3Z0ID4gMCApIHsKKwkJCWlvY3RsKGtleWJvYXJkX2ZkLCBWVF9BQ1RJVkFURSwgc2F2ZWRfdnQpOworCQl9CisJfQorfQorCit2b2lkIEZCX0Nsb3NlS2V5Ym9hcmQoX1RISVMpCit7CisJaWYgKCBrZXlib2FyZF9mZCA+PSAwICkgeworCQlGQl9MZWF2ZUdyYXBoaWNzTW9kZSh0aGlzKTsKKwkJaWYgKCBrZXlib2FyZF9mZCA+IDAgKSB7CisJCQljbG9zZShrZXlib2FyZF9mZCk7CisJCX0KKwl9CisJa2V5Ym9hcmRfZmQgPSAtMTsKK30KKworaW50IEZCX09wZW5LZXlib2FyZChfVEhJUykKK3sKKwkvKiBPcGVuIG9ubHkgaWYgbm90IGFscmVhZHkgb3BlbmVkICovCisgCWlmICgga2V5Ym9hcmRfZmQgPCAwICkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR0eTBbXSA9IHsgIi9kZXYvdHR5MCIsICIvZGV2L3ZjLzAiLCBOVUxMIH07CisJCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmNzW10gPSB7ICIvZGV2L3ZjLyVkIiwgIi9kZXYvdHR5JWQiLCBOVUxMIH07CisJCWludCBpLCB0dHkwX2ZkOworCisJCS8qIFRyeSB0byBxdWVyeSBmb3IgYSBmcmVlIHZpcnR1YWwgdGVybWluYWwgKi8KKwkJdHR5MF9mZCA9IC0xOworCQlmb3IgKCBpPTA7IHR0eTBbaV0gJiYgKHR0eTBfZmQgPCAwKTsgKytpICkgeworCQkJdHR5MF9mZCA9IG9wZW4odHR5MFtpXSwgT19XUk9OTFksIDApOworCQl9CisJCWlmICggdHR5MF9mZCA8IDAgKSB7CisJCQl0dHkwX2ZkID0gZHVwKDApOyAvKiBNYXliZSBzdGRpbiBpcyBhIFZUPyAqLworCQl9CisJCWlvY3RsKHR0eTBfZmQsIFZUX09QRU5RUlksICZjdXJyZW50X3Z0KTsKKwkJY2xvc2UodHR5MF9mZCk7CisJCWlmICggKGdldGV1aWQoKSA9PSAwKSAmJiAoY3VycmVudF92dCA+IDApICkgeworCQkJZm9yICggaT0wOyB2Y3NbaV0gJiYgKGtleWJvYXJkX2ZkIDwgMCk7ICsraSApIHsKKwkJCQljaGFyIHZ0cGF0aFsxMl07CisKKwkJCQlTRExfc25wcmludGYodnRwYXRoLCBTRExfYXJyYXlzaXplKHZ0cGF0aCksIHZjc1tpXSwgY3VycmVudF92dCk7CisJCQkJa2V5Ym9hcmRfZmQgPSBvcGVuKHZ0cGF0aCwgT19SRFdSLCAwKTsKKyNpZmRlZiBERUJVR19LRVlCT0FSRAorCQkJCWZwcmludGYoc3RkZXJyLCAidnRwYXRoID0gJXMsIGZkID0gJWRcbiIsCisJCQkJCXZ0cGF0aCwga2V5Ym9hcmRfZmQpOworI2VuZGlmIC8qIERFQlVHX0tFWUJPQVJEICovCisKKwkJCQkvKiBUaGlzIG5lZWRzIHRvIGJlIG91ciBjb250cm9sbGluZyB0dHkKKwkJCQkgICBzbyB0aGF0IHRoZSBrZXJuZWwgaW9jdGwoKSBjYWxscyB3b3JrCisJCQkJKi8KKwkJCQlpZiAoIGtleWJvYXJkX2ZkID49IDAgKSB7CisJCQkJCXR0eTBfZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUiwgMCk7CisJCQkJCWlmICggdHR5MF9mZCA+PSAwICkgeworCQkJCQkJaW9jdGwodHR5MF9mZCwgVElPQ05PVFRZLCAwKTsKKwkJCQkJCWNsb3NlKHR0eTBfZmQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisgCQlpZiAoIGtleWJvYXJkX2ZkIDwgMCApIHsKKwkJCS8qIExhc3QgcmVzb3J0LCBtYXliZSBvdXIgdHR5IGlzIGEgdXNhYmxlIFZUICovCisJCQlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXRlOworCisJCQlrZXlib2FyZF9mZCA9IG9wZW4oIi9kZXYvdHR5IiwgT19SRFdSKTsKKworCQkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgVlRfR0VUU1RBVEUsICZ2dHN0YXRlKSA9PSAwICkgeworCQkJCWN1cnJlbnRfdnQgPSB2dHN0YXRlLnZfYWN0aXZlOworCQkJfSBlbHNlIHsKKwkJCQljdXJyZW50X3Z0ID0gMDsKKwkJCX0KKyAJCX0KKyNpZmRlZiBERUJVR19LRVlCT0FSRAorCQlmcHJpbnRmKHN0ZGVyciwgIkN1cnJlbnQgVlQ6ICVkXG4iLCBjdXJyZW50X3Z0KTsKKyNlbmRpZgorIAkJc2F2ZWRfa2JkX21vZGUgPSAtMTsKKworCQkvKiBNYWtlIHN1cmUgdGhhdCBvdXIgaW5wdXQgaXMgYSBjb25zb2xlIHRlcm1pbmFsICovCisJCXsgaW50IGR1bW15OworCQkgIGlmICggaW9jdGwoa2V5Ym9hcmRfZmQsIEtER0tCTU9ERSwgJmR1bW15KSA8IDAgKSB7CisJCQljbG9zZShrZXlib2FyZF9mZCk7CisJCQlrZXlib2FyZF9mZCA9IC0xOworCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gb3BlbiBhIGNvbnNvbGUgdGVybWluYWwiKTsKKwkJICB9CisJCX0KKworCQkvKiBTZXQgdXAga2V5bWFwICovCisJCUZCX3ZnYWluaXRrZXltYXBzKGtleWJvYXJkX2ZkKTsKKyAJfQorIAlyZXR1cm4oa2V5Ym9hcmRfZmQpOworfQorCitzdGF0aWMgZW51bSB7CisJTU9VU0VfTk9ORSA9IC0xLAorCU1PVVNFX01TQywJLyogTm90ZTogR1BNIHVzZXMgdGhlIE1TQyBwcm90b2NvbCAqLworCU1PVVNFX1BTMiwKKwlNT1VTRV9JTVBTMiwKKwlNT1VTRV9NUywKKwlNT1VTRV9CTSwKKwlNT1VTRV9FTE8sCisJTU9VU0VfVFNMSUIsCisJTlVNX01PVVNFX0RSVlMKK30gbW91c2VfZHJ2ID0gTU9VU0VfTk9ORTsKKwordm9pZCBGQl9DbG9zZU1vdXNlKF9USElTKQoreworI2lmIFNETF9JTlBVVF9UU0xJQgorCWlmICh0c19kZXYgIT0gTlVMTCkgeworCQl0c19jbG9zZSh0c19kZXYpOworCQl0c19kZXYgPSBOVUxMOworCQltb3VzZV9mZCA9IC0xOworCX0KKyNlbmRpZiAvKiBTRExfSU5QVVRfVFNMSUIgKi8KKwlpZiAoIG1vdXNlX2ZkID4gMCApIHsKKwkJY2xvc2UobW91c2VfZmQpOworCX0KKwltb3VzZV9mZCA9IC0xOworfQorCisvKiBSZXR1cm5zIHByb2Nlc3NlcyBsaXN0ZWQgaW4gL3Byb2Mgd2l0aCB0aGUgZGVzaXJlZCBuYW1lICovCitzdGF0aWMgaW50IGZpbmRfcGlkKERJUiAqcHJvYywgY29uc3QgY2hhciAqd2FudGVkX25hbWUpCit7CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisJaW50IHBpZDsKKworCS8qIEZpcnN0IHNjYW4gcHJvYyBmb3IgdGhlIGdwbSBwcm9jZXNzICovCisJcGlkID0gMDsKKwl3aGlsZSAoIChwaWQgPT0gMCkgJiYgKChlbnRyeT1yZWFkZGlyKHByb2MpKSAhPSBOVUxMKSApIHsKKwkJaWYgKCBpc2RpZ2l0KGVudHJ5LT5kX25hbWVbMF0pICkgeworCQkJRklMRSAqc3RhdHVzOworCQkJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwkJCWNoYXIgbmFtZVtQQVRIX01BWF07CisKKwkJCVNETF9zbnByaW50ZihwYXRoLCBTRExfYXJyYXlzaXplKHBhdGgpLCAiL3Byb2MvJXMvc3RhdHVzIiwgZW50cnktPmRfbmFtZSk7CisJCQlzdGF0dXM9Zm9wZW4ocGF0aCwgInIiKTsKKwkJCWlmICggc3RhdHVzICkgeworCQkJCWludCBtYXRjaGVzID0gMDsKKwkJCQluYW1lWzBdID0gJ1wwJzsKKwkJCQltYXRjaGVzID0gZnNjYW5mKHN0YXR1cywgIk5hbWU6ICVzIiwgbmFtZSk7CisJCQkJaWYgKCAobWF0Y2hlcyA9PSAxKSAmJiAoU0RMX3N0cmNtcChuYW1lLCB3YW50ZWRfbmFtZSkgPT0gMCkgKSB7CisJCQkJCXBpZCA9IFNETF9hdG9pKGVudHJ5LT5kX25hbWUpOworCQkJCX0KKwkJCQlmY2xvc2Uoc3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcGlkOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgL2Rldi9ncG1kYXRhIGlzIGJlaW5nIHdyaXR0ZW4gdG8gYnkgZ3BtICovCitzdGF0aWMgaW50IGdwbV9hdmFpbGFibGUoY2hhciAqcHJvdG8sIHNpemVfdCBwcm90b2xlbikKK3sKKwlpbnQgYXZhaWxhYmxlOworCURJUiAqcHJvYzsKKwlpbnQgcGlkOworCWludCBjbWRsaW5lLCBsZW4sIGFyZ2xlbjsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNoYXIgYXJnc1tQQVRIX01BWF0sICphcmc7CisKKwkvKiBEb24ndCBib3RoZXIgbG9va2luZyBpZiB0aGUgZmlmbyBpc24ndCB0aGVyZSAqLworI2lmZGVmIERFQlVHX01PVVNFIAorCWZwcmludGYoc3RkZXJyLCJ0ZXN0aW5nIGdwbVxuIik7CisjZW5kaWYKKwlpZiAoIGFjY2VzcyhHUE1fTk9ERV9GSUZPLCBGX09LKSA8IDAgKSB7CisJCXJldHVybigwKTsKKwl9CisKKwlhdmFpbGFibGUgPSAwOworCXByb2MgPSBvcGVuZGlyKCIvcHJvYyIpOworCWlmICggcHJvYyApIHsKKwkJY2hhciByYXdfcHJvdG9bMTBdID0geyAnXDAnIH07CisJCWNoYXIgcmVwZWF0X3Byb3RvWzEwXSA9IHsgJ1wwJyB9OworCQl3aGlsZSAoICFhdmFpbGFibGUgJiYgKHBpZD1maW5kX3BpZChwcm9jLCAiZ3BtIikpID4gMCApIHsKKwkJCVNETF9zbnByaW50ZihwYXRoLCBTRExfYXJyYXlzaXplKHBhdGgpLCAiL3Byb2MvJWQvY21kbGluZSIsIHBpZCk7CisJCQljbWRsaW5lID0gb3BlbihwYXRoLCBPX1JET05MWSwgMCk7CisJCQlpZiAoIGNtZGxpbmUgPj0gMCApIHsKKwkJCQlsZW4gPSByZWFkKGNtZGxpbmUsIGFyZ3MsIHNpemVvZihhcmdzKSk7CisJCQkJYXJnID0gYXJnczsKKwkJCQl3aGlsZSAoIGxlbiA+IDAgKSB7CisJCQkJCWFyZ2xlbiA9IFNETF9zdHJsZW4oYXJnKSsxOworI2lmZGVmIERFQlVHX01PVVNFIAorCQkJCSAgICAgICAgZnByaW50ZihzdGRlcnIsImdwbSBhcmcgJXMgbGVuICVkXG4iLGFyZyxhcmdsZW4pOworI2VuZGlmCisJCQkJCWlmICggU0RMX3N0cmNtcChhcmcsICItdCIpID09IDApIHsKKwkJCQkJCS8qIHByb3RvY29sIHN0cmluZywga2VlcCBpdCBmb3IgbGF0ZXIgKi8KKwkJCQkJCWNoYXIgKnQsICpzOworCQkJCQkJdCA9IGFyZyArIGFyZ2xlbjsKKwkJCQkJCXMgPSBTRExfc3RyY2hyKHQsICcgJyk7CisJCQkJCQlpZiAocykgKnMgPSAwOworCQkJCQkJU0RMX3N0cmxjcHkocmF3X3Byb3RvLCB0LCBTRExfYXJyYXlzaXplKHJhd19wcm90bykpOworCQkJCQkJaWYgKHMpICpzID0gJyAnOworCQkJCQl9CisJCQkJCWlmICggU0RMX3N0cm5jbXAoYXJnLCAiLVIiLCAyKSA9PSAwICkgeworCQkJCQkJY2hhciAqdCwgKnM7CisJCQkJCQlhdmFpbGFibGUgPSAxOworCQkJCQkJdCA9IGFyZyArIDI7CisJCQkJCQlzID0gU0RMX3N0cmNocih0LCAnICcpOworCQkJCQkJaWYgKHMpICpzID0gMDsKKwkJCQkJCVNETF9zdHJsY3B5KHJlcGVhdF9wcm90bywgdCwgU0RMX2FycmF5c2l6ZShyZXBlYXRfcHJvdG8pKTsKKwkJCQkJCWlmIChzKSAqcyA9ICcgJzsKKwkJCQkJfQorCQkJCQlsZW4gLT0gYXJnbGVuOworCQkJCQlhcmcgKz0gYXJnbGVuOworCQkJCX0KKwkJCQljbG9zZShjbWRsaW5lKTsKKwkJCX0KKwkJfQorCQljbG9zZWRpcihwcm9jKTsKKworCQlpZiAoIGF2YWlsYWJsZSApIHsKKwkJCWlmICggU0RMX3N0cmNtcChyZXBlYXRfcHJvdG8sICJyYXciKSA9PSAwICkgeworCQkJCVNETF9zdHJsY3B5KHByb3RvLCByYXdfcHJvdG8sIHByb3RvbGVuKTsKKwkJCX0gZWxzZSBpZiAoICpyZXBlYXRfcHJvdG8gKSB7CisJCQkJU0RMX3N0cmxjcHkocHJvdG8sIHJlcGVhdF9wcm90bywgcHJvdG9sZW4pOworCQkJfSBlbHNlIHsKKwkJCQlTRExfc3RybGNweShwcm90bywgIm1zYyIsIHByb3RvbGVuKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gYXZhaWxhYmxlOworfQorCisKKy8qIHJjZzA2MTEyMDAxIFNldCB1cCBJTVBTLzIgbW9kZSwgaWYgcG9zc2libGUuIFRoaXMgZ2l2ZXMKKyAqICB1cyBhY2Nlc3MgdG8gdGhlIG1vdXNld2hlZWwsIGV0Yy4gUmV0dXJucyB6ZXJvIGlmCisgKiAgd3JpdGVzIHRvIGRldmljZSBmYWlsZWQsIGJ1dCB5b3Ugc3RpbGwgbmVlZCB0byBxdWVyeSB0aGUKKyAqICBkZXZpY2UgdG8gc2VlIHdoaWNoIG1vZGUgaXQncyBhY3R1YWxseSBpbi4KKyAqLworc3RhdGljIGludCBzZXRfaW1wczJfbW9kZShpbnQgZmQpCit7CisJLyogSWYgeW91IHdhbnRlZCB0byBjb250cm9sIHRoZSBtb3VzZSBtb2RlIChhbmQgd2UgZG8gOikgICkgLi4uCisJCVNldCBJTVBTLzIgcHJvdG9jb2w6CisJCQl7MHhmMywyMDAsMHhmMywxMDAsMHhmMyw4MH0KKwkJUmVzZXQgbW91c2UgZGV2aWNlOgorCQkJezB4RkZ9CisJKi8KKwlVaW50OCBzZXRfaW1wczJbXSA9IHsweGYzLCAyMDAsIDB4ZjMsIDEwMCwgMHhmMywgODB9OworCS8qVWludDggcmVzZXQgPSAweGZmOyovCisJZmRfc2V0IGZkc2V0OworCXN0cnVjdCB0aW1ldmFsIHR2OworCWludCByZXR2YWwgPSAwOworCisJaWYgKCB3cml0ZShmZCwgJnNldF9pbXBzMiwgc2l6ZW9mKHNldF9pbXBzMikpID09IHNpemVvZihzZXRfaW1wczIpICkgeworCQkvKiBEb24ndCByZXNldCBpdCwgdGhhdCdsbCBjbGVhciBJTVBTLzIgbW9kZSBvbiBzb21lIG1pY2UKKwkJaWYgKHdyaXRlKGZkLCAmcmVzZXQsIHNpemVvZiAocmVzZXQpKSA9PSBzaXplb2YgKHJlc2V0KSApIHsKKwkJCXJldHZhbCA9IDE7CisJCX0KKwkJKi8KKwl9CisKKwkvKiBHZXQgcmlkIG9mIGFueSBjaGF0dGVyIGZyb20gdGhlIGFib3ZlICovCisJRkRfWkVSTygmZmRzZXQpOworCUZEX1NFVChmZCwgJmZkc2V0KTsKKwl0di50dl9zZWMgPSAwOworCXR2LnR2X3VzZWMgPSAwOworCXdoaWxlICggc2VsZWN0KGZkKzEsICZmZHNldCwgMCwgMCwgJnR2KSA+IDAgKSB7CisJCWNoYXIgdGVtcFszMl07CisJCWlmIChyZWFkKGZkLCB0ZW1wLCBzaXplb2YodGVtcCkpIDw9IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vdXNlIHVzZXMgdGhlIElNUFMvMiBwcm90b2NvbCAqLworc3RhdGljIGludCBkZXRlY3RfaW1wczIoaW50IGZkKQoreworCWludCBpbXBzMjsKKworCWltcHMyID0gMDsKKworCWlmICggU0RMX2dldGVudigiU0RMX01PVVNFREVWX0lNUFMyIikgKSB7CisJCWltcHMyID0gMTsKKwl9CisJaWYgKCAhIGltcHMyICkgeworCQlVaW50OCBxdWVyeV9wczIgPSAweEYyOworCQlmZF9zZXQgZmRzZXQ7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCS8qIEdldCByaWQgb2YgYW55IG1vdXNlIG1vdGlvbiBub2lzZSAqLworCQlGRF9aRVJPKCZmZHNldCk7CisJCUZEX1NFVChmZCwgJmZkc2V0KTsKKwkJdHYudHZfc2VjID0gMDsKKwkJdHYudHZfdXNlYyA9IDA7CisJCXdoaWxlICggc2VsZWN0KGZkKzEsICZmZHNldCwgMCwgMCwgJnR2KSA+IDAgKSB7CisJCQljaGFyIHRlbXBbMzJdOworCQkJaWYgKHJlYWQoZmQsIHRlbXAsIHNpemVvZih0ZW1wKSkgPD0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogUXVlcnkgZm9yIHRoZSB0eXBlIG9mIG1vdXNlIHByb3RvY29sICovCisJCWlmICggd3JpdGUoZmQsICZxdWVyeV9wczIsIHNpemVvZiAocXVlcnlfcHMyKSkgPT0gc2l6ZW9mIChxdWVyeV9wczIpKSB7CisJCQlVaW50OCBjaCA9IDA7CisKKwkJCS8qIEdldCB0aGUgbW91c2UgcHJvdG9jb2wgcmVzcG9uc2UgKi8KKwkJCWRvIHsKKwkJCQlGRF9aRVJPKCZmZHNldCk7CisJCQkJRkRfU0VUKGZkLCAmZmRzZXQpOworCQkJCXR2LnR2X3NlYyA9IDE7CisJCQkJdHYudHZfdXNlYyA9IDA7CisJCQkJaWYgKCBzZWxlY3QoZmQrMSwgJmZkc2V0LCAwLCAwLCAmdHYpIDwgMSApIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSB3aGlsZSAoIChyZWFkKGZkLCAmY2gsIHNpemVvZiAoY2gpKSA9PSBzaXplb2YgKGNoKSkgJiYKKwkJCSAgICAgICAgICAoKGNoID09IDB4RkEpIHx8IChjaCA9PSAweEFBKSkgKTsKKworCQkJLyogRXhwZXJpbWVudGFsIHZhbHVlcyAoTG9naXRlY2ggd2hlZWxtb3VzZSkgKi8KKyNpZmRlZiBERUJVR19NT1VTRQorZnByaW50ZihzdGRlcnIsICJMYXN0IG1vdXNlIG1vZGU6IDB4JXhcbiIsIGNoKTsKKyNlbmRpZgorCQkJaWYgKCAoY2ggPT0gMykgfHwgKGNoID09IDQpICkgeworCQkJCWltcHMyID0gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gaW1wczI7Cit9CisKK2ludCBGQl9PcGVuTW91c2UoX1RISVMpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqbW91c2VkZXY7CisJY29uc3QgY2hhciAqbW91c2VkcnY7CisKKwltb3VzZWRydiA9IFNETF9nZXRlbnYoIlNETF9NT1VTRURSViIpOworCW1vdXNlZGV2ID0gU0RMX2dldGVudigiU0RMX01PVVNFREVWIik7CisJbW91c2VfZmQgPSAtMTsKKworI2lmIFNETF9JTlBVVF9UU0xJQgorCWlmICggbW91c2VkcnYgJiYgKFNETF9zdHJjbXAobW91c2VkcnYsICJUU0xJQiIpID09IDApICkgeworCQlpZiAobW91c2VkZXYgPT0gTlVMTCkgbW91c2VkZXYgPSBTRExfZ2V0ZW52KCJUU0xJQl9UU0RFVklDRSIpOworCQlpZiAobW91c2VkZXYgIT0gTlVMTCkgeworCQkJdHNfZGV2ID0gdHNfb3Blbihtb3VzZWRldiwgMSk7CisJCQlpZiAoKHRzX2RldiAhPSBOVUxMKSAmJiAodHNfY29uZmlnKHRzX2RldikgPj0gMCkpIHsKKyNpZmRlZiBERUJVR19NT1VTRQorCQkJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgdHNsaWIgdG91Y2hzY3JlZW5cbiIpOworI2VuZGlmCisJCQkJbW91c2VfZHJ2ID0gTU9VU0VfVFNMSUI7CisJCQkJbW91c2VfZmQgPSB0c19mZCh0c19kZXYpOworCQkJCXJldHVybiBtb3VzZV9mZDsKKwkJCX0KKwkJfQorCQltb3VzZV9kcnYgPSBNT1VTRV9OT05FOworCQlyZXR1cm4gbW91c2VfZmQ7CisJfQorI2VuZGlmIC8qIFNETF9JTlBVVF9UU0xJQiAqLworCisJLyogRUxPIFRPVUNIU0NSRUVOIFNVUFBPUlQgKi8KKworCWlmICggbW91c2VkcnYgJiYgKFNETF9zdHJjbXAobW91c2VkcnYsICJFTE8iKSA9PSAwKSApIHsKKwkJbW91c2VfZmQgPSBvcGVuKG1vdXNlZGV2LCBPX1JEV1IpOworCQlpZiAoIG1vdXNlX2ZkID49IDAgKSB7CisJCQlpZihlbG9Jbml0Q29udHJvbGxlcihtb3VzZV9mZCkpIHsKKyNpZmRlZiBERUJVR19NT1VTRQorZnByaW50ZihzdGRlcnIsICJVc2luZyBFTE8gdG91Y2hzY3JlZW5cbiIpOworI2VuZGlmCisgICAJCQkJbW91c2VfZHJ2ID0gTU9VU0VfRUxPOworCQkJfQorCisJCX0KKwkJZWxzZSBpZiAoIG1vdXNlX2ZkIDwgMCApIHsKKwkJCW1vdXNlX2RydiA9IE1PVVNFX05PTkU7CisJCX0KKworCQlyZXR1cm4obW91c2VfZmQpOworCX0KKworCS8qIFNURCBNSUNFICovCisKKwlpZiAoIG1vdXNlZGV2ID09IE5VTEwgKSB7CisJCS8qIEZJWE1FIHNvbWVkYXkuLi4gYWxsb3cgbXVsdGlwbGUgbWljZSBpbiB0aGlzIGRyaXZlciAqLworCQlzdGF0aWMgY29uc3QgY2hhciAqcHMybWljZVtdID0geworCQkgICAgIi9kZXYvaW5wdXQvbWljZSIsICIvZGV2L3VzYm1vdXNlIiwgIi9kZXYvcHNhdXgiLCBOVUxMCisJCX07CisJCS8qIEZpcnN0IHRyeSB0byB1c2UgR1BNIGluIHJlcGVhdGVyIG1vZGUgKi8KKwkJaWYgKCBtb3VzZV9mZCA8IDAgKSB7CisJCQljaGFyIHByb3RvWzEwXTsKKwkJCWlmICggZ3BtX2F2YWlsYWJsZShwcm90bywgU0RMX2FycmF5c2l6ZShwcm90bykpICkgeworCQkJCW1vdXNlX2ZkID0gb3BlbihHUE1fTk9ERV9GSUZPLCBPX1JET05MWSwgMCk7CisJCQkJaWYgKCBtb3VzZV9mZCA+PSAwICkgeworCQkJCQlpZiAoIFNETF9zdHJjbXAocHJvdG8sICJtc2MiKSA9PSAwICkgeworCQkJCQkJbW91c2VfZHJ2ID0gTU9VU0VfTVNDOworCQkJCQl9IGVsc2UgaWYgKCBTRExfc3RyY21wKHByb3RvLCAicHMyIikgPT0gMCApIHsKKwkJCQkJCW1vdXNlX2RydiA9IE1PVVNFX1BTMjsKKwkJCQkJfSBlbHNlIGlmICggU0RMX3N0cmNtcChwcm90bywgImltcHMyIikgPT0gMCApIHsKKwkJCQkJCW1vdXNlX2RydiA9IE1PVVNFX0lNUFMyOworCQkJCQl9IGVsc2UgaWYgKCBTRExfc3RyY21wKHByb3RvLCAibXMiKSA9PSAwIHx8CisJCQkJCSAgICAgICAgICAgIFNETF9zdHJjbXAocHJvdG8sICJiYXJlIikgPT0gMCApIHsKKwkJCQkJCW1vdXNlX2RydiA9IE1PVVNFX01TOworCQkJCQl9IGVsc2UgaWYgKCBTRExfc3RyY21wKHByb3RvLCAiYm0iKSA9PSAwICkgeworCQkJCQkJbW91c2VfZHJ2ID0gTU9VU0VfQk07CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBVbmtub3duIHByb3RvY29sLi4uICovCisjaWZkZWYgREVCVUdfTU9VU0UKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiR1BNIG1vdXNlIHVzaW5nIHVua25vd24gcHJvdG9jb2wgPSAlc1xuIiwgcHJvdG8pOworI2VuZGlmCisJCQkJCQljbG9zZShtb3VzZV9mZCk7CisJCQkJCQltb3VzZV9mZCA9IC0xOworCQkJCQl9CisJCQkJfQorI2lmZGVmIERFQlVHX01PVVNFCisJCQkJaWYgKCBtb3VzZV9mZCA+PSAwICkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIEdQTSBtb3VzZSwgcHJvdG9jb2wgPSAlc1xuIiwgcHJvdG8pOworCQkJCX0KKyNlbmRpZiAvKiBERUJVR19NT1VTRSAqLworCQkJfQorCQl9CisJCS8qIE5vdyB0cnkgdG8gdXNlIGEgbW9kZXJuIFBTLzIgbW91c2UgKi8KKwkJZm9yICggaT0wOyAobW91c2VfZmQgPCAwKSAmJiBwczJtaWNlW2ldOyArK2kgKSB7CisJCQltb3VzZV9mZCA9IG9wZW4ocHMybWljZVtpXSwgT19SRFdSLCAwKTsKKwkJCWlmIChtb3VzZV9mZCA8IDApIHsKKwkJCQltb3VzZV9mZCA9IG9wZW4ocHMybWljZVtpXSwgT19SRE9OTFksIDApOworCQkJfQorCQkJaWYgKG1vdXNlX2ZkID49IDApIHsKKwkJCQkvKiByY2cwNjExMjAwMSBBdHRlbXB0IHRvIHNldCBJTVBTLzIgbW9kZSAqLworCQkJCXNldF9pbXBzMl9tb2RlKG1vdXNlX2ZkKTsKKwkJCQlpZiAoZGV0ZWN0X2ltcHMyKG1vdXNlX2ZkKSkgeworI2lmZGVmIERFQlVHX01PVVNFCitmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIElNUFMyIG1vdXNlXG4iKTsKKyNlbmRpZgorCQkJCQltb3VzZV9kcnYgPSBNT1VTRV9JTVBTMjsKKwkJCQl9IGVsc2UgeworI2lmZGVmIERFQlVHX01PVVNFCitmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIFBTMiBtb3VzZVxuIik7CisjZW5kaWYKKwkJCQkJbW91c2VfZHJ2ID0gTU9VU0VfUFMyOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBOZXh0IHRyeSB0byB1c2UgYSBQUEMgQURCIHBvcnQgbW91c2UgKi8KKwkJaWYgKCBtb3VzZV9mZCA8IDAgKSB7CisJCQltb3VzZV9mZCA9IG9wZW4oIi9kZXYvYWRibW91c2UiLCBPX1JET05MWSwgMCk7CisJCQlpZiAoIG1vdXNlX2ZkID49IDAgKSB7CisjaWZkZWYgREVCVUdfTU9VU0UKK2ZwcmludGYoc3RkZXJyLCAiVXNpbmcgQURCIG1vdXNlXG4iKTsKKyNlbmRpZgorCQkJCW1vdXNlX2RydiA9IE1PVVNFX0JNOworCQkJfQorCQl9CisJfQorCS8qIERlZmF1bHQgdG8gYSBzZXJpYWwgTWljcm9zb2Z0IG1vdXNlICovCisJaWYgKCBtb3VzZV9mZCA8IDAgKSB7CisJCWlmICggbW91c2VkZXYgPT0gTlVMTCApIHsKKwkJCW1vdXNlZGV2ID0gIi9kZXYvbW91c2UiOworCQl9CisJCW1vdXNlX2ZkID0gb3Blbihtb3VzZWRldiwgT19SRE9OTFksIDApOworCQlpZiAoIG1vdXNlX2ZkID49IDAgKSB7CisJCQlzdHJ1Y3QgdGVybWlvcyBtb3VzZV90ZXJtaW9zOworCisJCQkvKiBTZXQgdGhlIHNhbXBsaW5nIHNwZWVkIHRvIDEyMDAgYmF1ZCAqLworCQkJdGNnZXRhdHRyKG1vdXNlX2ZkLCAmbW91c2VfdGVybWlvcyk7CisJCQltb3VzZV90ZXJtaW9zLmNfaWZsYWcgPSBJR05CUksgfCBJR05QQVI7CisJCQltb3VzZV90ZXJtaW9zLmNfb2ZsYWcgPSAwOworCQkJbW91c2VfdGVybWlvcy5jX2xmbGFnID0gMDsKKwkJCW1vdXNlX3Rlcm1pb3MuY19saW5lID0gMDsKKwkJCW1vdXNlX3Rlcm1pb3MuY19jY1tWVElNRV0gPSAwOworCQkJbW91c2VfdGVybWlvcy5jX2NjW1ZNSU5dID0gMTsKKwkJCW1vdXNlX3Rlcm1pb3MuY19jZmxhZyA9IENSRUFEIHwgQ0xPQ0FMIHwgSFVQQ0w7CisJCQltb3VzZV90ZXJtaW9zLmNfY2ZsYWcgfD0gQ1M4OworCQkJbW91c2VfdGVybWlvcy5jX2NmbGFnIHw9IEIxMjAwOworCQkJdGNzZXRhdHRyKG1vdXNlX2ZkLCBUQ1NBRkxVU0gsICZtb3VzZV90ZXJtaW9zKTsKKwkJCWlmICggbW91c2VkcnYgJiYgKFNETF9zdHJjbXAobW91c2VkcnYsICJQUzIiKSA9PSAwKSApIHsKKyNpZmRlZiBERUJVR19NT1VTRQorZnByaW50ZihzdGRlcnIsICJVc2luZyAodXNlciBzcGVjaWZpZWQpIFBTMiBtb3VzZSBvbiAlc1xuIiwgbW91c2VkZXYpOworI2VuZGlmCisJCQkJbW91c2VfZHJ2ID0gTU9VU0VfUFMyOworCQkJfSBlbHNlIHsKKyNpZmRlZiBERUJVR19NT1VTRQorZnByaW50ZihzdGRlcnIsICJVc2luZyAoZGVmYXVsdCkgTVMgbW91c2Ugb24gJXNcbiIsIG1vdXNlZGV2KTsKKyNlbmRpZgorCQkJCW1vdXNlX2RydiA9IE1PVVNFX01TOworCQkJfQorCQl9CisJfQorCWlmICggbW91c2VfZmQgPCAwICkgeworCQltb3VzZV9kcnYgPSBNT1VTRV9OT05FOworCX0KKwlyZXR1cm4obW91c2VfZmQpOworfQorCitzdGF0aWMgaW50IHBvc3RlZCA9IDA7CisKK3ZvaWQgRkJfdmdhbW91c2VjYWxsYmFjayhpbnQgYnV0dG9uLCBpbnQgcmVsYXRpdmUsIGludCBkeCwgaW50IGR5KQoreworCWludCBidXR0b25fMSwgYnV0dG9uXzM7CisJaW50IGJ1dHRvbl9zdGF0ZTsKKwlpbnQgc3RhdGVfY2hhbmdlZDsKKwlpbnQgaTsKKwlVaW50OCBzdGF0ZTsKKworCWlmICggZHggfHwgZHkgKSB7CisJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIHJlbGF0aXZlLCBkeCwgZHkpOworCX0KKworCS8qIFN3YXAgYnV0dG9uIDEgYW5kIDMgKi8KKwlidXR0b25fMSA9IChidXR0b24gJiAweDA0KSA+PiAyOworCWJ1dHRvbl8zID0gKGJ1dHRvbiAmIDB4MDEpIDw8IDI7CisJYnV0dG9uICY9IH4weDA1OworCWJ1dHRvbiB8PSAoYnV0dG9uXzF8YnV0dG9uXzMpOworCisJLyogU2VlIHdoYXQgY2hhbmdlZCAqLworCWJ1dHRvbl9zdGF0ZSA9IFNETF9HZXRNb3VzZVN0YXRlKE5VTEwsIE5VTEwpOworCXN0YXRlX2NoYW5nZWQgPSBidXR0b25fc3RhdGUgXiBidXR0b247CisJZm9yICggaT0wOyBpPDg7ICsraSApIHsKKwkJaWYgKCBzdGF0ZV9jaGFuZ2VkICYgKDE8PGkpICkgeworCQkJaWYgKCBidXR0b24gJiAoMTw8aSkgKSB7CisJCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdGUgPSBTRExfUkVMRUFTRUQ7CisJCQl9CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihzdGF0ZSwgaSsxLCAwLCAwKTsKKwkJfQorCX0KK30KKworLyogSGFuZGxlIGlucHV0IGZyb20gdHNsaWIgKi8KKyNpZiBTRExfSU5QVVRfVFNMSUIKK3N0YXRpYyB2b2lkIGhhbmRsZV90c2xpYihfVEhJUykKK3sKKwlzdHJ1Y3QgdHNfc2FtcGxlIHNhbXBsZTsKKwlpbnQgYnV0dG9uOworCisJd2hpbGUgKHRzX3JlYWQodHNfZGV2LCAmc2FtcGxlLCAxKSA+IDApIHsKKwkJYnV0dG9uID0gKHNhbXBsZS5wcmVzc3VyZSA+IDApID8gMSA6IDA7CisJCWJ1dHRvbiA8PD0gMjsJLyogbXVzdCByZXBvcnQgaXQgYXMgYnV0dG9uIDMgKi8KKwkJRkJfdmdhbW91c2VjYWxsYmFjayhidXR0b24sIDAsIHNhbXBsZS54LCBzYW1wbGUueSk7CisJfQorCXJldHVybjsKK30KKyNlbmRpZiAvKiBTRExfSU5QVVRfVFNMSUIgKi8KKworLyogRm9yIG5vdywgdXNlIE1TQywgUFMvMiwgYW5kIE1TIHByb3RvY29scworICAgRHJpdmVyIGFkYXB0ZWQgZnJvbSB0aGUgU1ZHQWxpYiBtb3VzZSBkcml2ZXIgY29kZSAodGFrZW4gZnJvbSBncG0sIGV0Yy4pCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9tb3VzZShfVEhJUykKK3sKKwlzdGF0aWMgaW50IHN0YXJ0ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtb3VzZWJ1ZltCVUZTSVpdOworCXN0YXRpYyBpbnQgcmVsYXRpdmUgPSAxOworCisJaW50IGksIG5yZWFkOworCWludCBidXR0b24gPSAwOworCWludCBkeCA9IDAsIGR5ID0gMDsKKwlpbnQgcGFja2V0c2l6ZSA9IDA7CisJaW50IHJlYWx4LCByZWFseTsKKwkKKwkvKiBGaWd1cmUgb3V0IHRoZSBtb3VzZSBwYWNrZXQgc2l6ZSAqLworCXN3aXRjaCAobW91c2VfZHJ2KSB7CisJCWNhc2UgTU9VU0VfTk9ORToKKwkJCWJyZWFrOyAgLyogY2Fycnkgb24gdG8gcmVhZCBmcm9tIGRldmljZSBhbmQgZGlzY2FyZCBpdC4gKi8KKwkJY2FzZSBNT1VTRV9NU0M6CisJCQlwYWNrZXRzaXplID0gNTsKKwkJCWJyZWFrOworCQljYXNlIE1PVVNFX0lNUFMyOgorCQkJcGFja2V0c2l6ZSA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSBNT1VTRV9QUzI6CisJCWNhc2UgTU9VU0VfTVM6CisJCWNhc2UgTU9VU0VfQk06CisJCQlwYWNrZXRzaXplID0gMzsKKwkJCWJyZWFrOworCQljYXNlIE1PVVNFX0VMTzoKKwkJCS8qIHRyeSB0byByZWFkIHRoZSBuZXh0IHBhY2tldCAqLworCQkJaWYoZWxvUmVhZFBvc2l0aW9uKHRoaXMsIG1vdXNlX2ZkLCAmZHgsICZkeSwgJmJ1dHRvbiwgJnJlYWx4LCAmcmVhbHkpKSB7CisJCQkJYnV0dG9uID0gKGJ1dHRvbiAmIDB4MDEpIDw8IDI7CisJCQkJRkJfdmdhbW91c2VjYWxsYmFjayhidXR0b24sIDAsIGR4LCBkeSk7CisJCQl9CisJCQlyZXR1cm47IC8qIG5vdGhpbmcgbGVmdCB0byBkbyAqLworCQljYXNlIE1PVVNFX1RTTElCOgorI2lmIFNETF9JTlBVVF9UU0xJQgorCQkJaGFuZGxlX3RzbGliKHRoaXMpOworI2VuZGlmCisJCQlyZXR1cm47IC8qIG5vdGhpbmcgbGVmdCB0byBkbyAqLworCQlkZWZhdWx0OgorCQkJLyogVWggb2guLiAqLworCQkJcGFja2V0c2l6ZSA9IDA7CisJCQlicmVhazsKKwl9CisKKwkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciB0aGUgcXVpdGUgc2Vuc2l0aXZlIEVMTyBjb250cm9sbGVyICovCisJaWYgKG1vdXNlX2RydiA9PSBNT1VTRV9FTE8pIHsKKwkKKwl9CisJCisJLyogUmVhZCBhcyBtYW55IHBhY2tldHMgYXMgcG9zc2libGUgKi8KKwlucmVhZCA9IHJlYWQobW91c2VfZmQsICZtb3VzZWJ1ZltzdGFydF0sIEJVRlNJWi1zdGFydCk7CisJaWYgKCBucmVhZCA8IDAgKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAobW91c2VfZHJ2ID09IE1PVVNFX05PTkUpIHsKKwkJcmV0dXJuOyAgLyogd2UncmUgZG9uZTsganVzdCBkcmFpbmluZyB0aGUgaW5wdXQgcXVldWUuICovCisJfQorCisJbnJlYWQgKz0gc3RhcnQ7CisjaWZkZWYgREVCVUdfTU9VU0UKKwlmcHJpbnRmKHN0ZGVyciwgIlJlYWQgJWQgYnl0ZXMgZnJvbSBtb3VzZSwgc3RhcnQgPSAlZFxuIiwgbnJlYWQsIHN0YXJ0KTsKKyNlbmRpZgorCisJZm9yICggaT0wOyBpPChucmVhZC0ocGFja2V0c2l6ZS0xKSk7IGkgKz0gcGFja2V0c2l6ZSApIHsKKwkJc3dpdGNoIChtb3VzZV9kcnYpIHsKKwkJCWNhc2UgTU9VU0VfTk9ORTogLyogc2hvdWxkbid0IGFjdHVhbGx5IGhpdCB0aGlzLiAqLworCQkJCWJyZWFrOyAgLyoganVzdCB0aHJvdyBldmVyeXRoaW5nIGF3YXkuICovCisJCQljYXNlIE1PVVNFX01TQzoKKwkJCQkvKiBNU0MgcHJvdG9jb2wgaGFzIDB4ODAgaW4gaGlnaCBieXRlICovCisJCQkJaWYgKCAobW91c2VidWZbaV0gJiAweEY4KSAhPSAweDgwICkgeworCQkJCQkvKiBHbyB0byBuZXh0IGJ5dGUgKi8KKwkJCQkJaSAtPSAocGFja2V0c2l6ZS0xKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIEdldCBjdXJyZW50IG1vdXNlIHN0YXRlICovCisJCQkJYnV0dG9uID0gKH5tb3VzZWJ1ZltpXSkgJiAweDA3OworCQkJCWR4ID0gICAoc2lnbmVkIGNoYXIpKG1vdXNlYnVmW2krMV0pICsKKwkJCQkgICAgICAgKHNpZ25lZCBjaGFyKShtb3VzZWJ1ZltpKzNdKTsKKwkJCQlkeSA9IC0oKHNpZ25lZCBjaGFyKShtb3VzZWJ1ZltpKzJdKSArCisJCQkJICAgICAgIChzaWduZWQgY2hhcikobW91c2VidWZbaSs0XSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBNT1VTRV9QUzI6CisJCQkJLyogUFMvMiBwcm90b2NvbCBoYXMgbm90aGluZyBpbiBoaWdoIGJ5dGUgKi8KKwkJCQlpZiAoIChtb3VzZWJ1ZltpXSAmIDB4QzApICE9IDAgKSB7CisJCQkJCS8qIEdvIHRvIG5leHQgYnl0ZSAqLworCQkJCQlpIC09IChwYWNrZXRzaXplLTEpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogR2V0IGN1cnJlbnQgbW91c2Ugc3RhdGUgKi8KKwkJCQlidXR0b24gPSAobW91c2VidWZbaV0gJiAweDA0KSA+PiAxIHwgLypNaWRkbGUqLworCQkgIAkJCSAobW91c2VidWZbaV0gJiAweDAyKSA+PiAxIHwgLypSaWdodCovCisJCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4MDEpIDw8IDI7ICAvKkxlZnQqLworCQkgIAkJZHggPSAobW91c2VidWZbaV0gJiAweDEwKSA/CisJCSAgCQkgICAgICBtb3VzZWJ1ZltpKzFdIC0gMjU2IDogbW91c2VidWZbaSsxXTsKKwkJICAJCWR5ID0gKG1vdXNlYnVmW2ldICYgMHgyMCkgPworCQkgIAkJICAgICAgLShtb3VzZWJ1ZltpKzJdIC0gMjU2KSA6IC1tb3VzZWJ1ZltpKzJdOworCQkJCWJyZWFrOworCQkJY2FzZSBNT1VTRV9JTVBTMjoKKwkJCQkvKiBHZXQgY3VycmVudCBtb3VzZSBzdGF0ZSAqLworCQkJCWJ1dHRvbiA9IChtb3VzZWJ1ZltpXSAmIDB4MDQpID4+IDEgfCAvKk1pZGRsZSovCisJCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4MDIpID4+IDEgfCAvKlJpZ2h0Ki8KKwkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHgwMSkgPDwgMiB8IC8qTGVmdCovCisJCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4NDApID4+IDMgfCAvKiA0ICovCisJCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4ODApID4+IDM7ICAvKiA1ICovCisJCSAgCQlkeCA9IChtb3VzZWJ1ZltpXSAmIDB4MTApID8KKwkJICAJCSAgICAgIG1vdXNlYnVmW2krMV0gLSAyNTYgOiBtb3VzZWJ1ZltpKzFdOworCQkgIAkJZHkgPSAobW91c2VidWZbaV0gJiAweDIwKSA/CisJCSAgCQkgICAgICAtKG1vdXNlYnVmW2krMl0gLSAyNTYpIDogLW1vdXNlYnVmW2krMl07CisJCQkJc3dpdGNoIChtb3VzZWJ1ZltpKzNdJjB4MEYpIHsKKwkJCQkgICAgY2FzZSAweDBFOiAvKiBEWCA9ICsxICovCisJCQkJICAgIGNhc2UgMHgwMjogLyogRFggPSAtMSAqLworCQkJCQlicmVhazsKKwkJCQkgICAgY2FzZSAweDBGOiAvKiBEWSA9ICsxIChtYXAgYnV0dG9uIDQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQl92Z2Ftb3VzZWNhbGxiYWNrKGJ1dHRvbiB8ICgxPDwzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMCk7CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIDB4MDE6IC8qIERZID0gLTEgKG1hcCBidXR0b24gNSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCX3ZnYW1vdXNlY2FsbGJhY2soYnV0dG9uIHwgKDE8PDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBNT1VTRV9NUzoKKwkJCQkvKiBNaWNyb3NvZnQgcHJvdG9jb2wgaGFzIDB4NDAgaW4gaGlnaCBieXRlICovCisJCQkJaWYgKCAobW91c2VidWZbaV0gJiAweDQwKSAhPSAweDQwICkgeworCQkJCQkvKiBHbyB0byBuZXh0IGJ5dGUgKi8KKwkJCQkJaSAtPSAocGFja2V0c2l6ZS0xKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIEdldCBjdXJyZW50IG1vdXNlIHN0YXRlICovCisJCQkJYnV0dG9uID0gKChtb3VzZWJ1ZltpXSAmIDB4MjApID4+IDMpIHwKKwkJCQkgICAgICAgICAoKG1vdXNlYnVmW2ldICYgMHgxMCkgPj4gNCk7CisJCQkJZHggPSAoc2lnbmVkIGNoYXIpKCgobW91c2VidWZbaV0gJiAweDAzKSA8PCA2KSB8CisJCQkJICAgICAgICAgICAgICAgICAgIChtb3VzZWJ1ZltpICsgMV0gJiAweDNGKSk7CisJCQkJZHkgPSAoc2lnbmVkIGNoYXIpKCgobW91c2VidWZbaV0gJiAweDBDKSA8PCA0KSB8CisJCQkJICAgICAgICAgICAgICAgICAgICAobW91c2VidWZbaSArIDJdICYgMHgzRikpOworCQkJCWJyZWFrOworCQkJY2FzZSBNT1VTRV9CTToKKwkJCQkvKiBCdXNNb3VzZSBwcm90b2NvbCBoYXMgMHhGOCBpbiBoaWdoIGJ5dGUgKi8KKwkJCQlpZiAoIChtb3VzZWJ1ZltpXSAmIDB4RjgpICE9IDB4ODAgKSB7CisJCQkJCS8qIEdvIHRvIG5leHQgYnl0ZSAqLworCQkJCQlpIC09IChwYWNrZXRzaXplLTEpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogR2V0IGN1cnJlbnQgbW91c2Ugc3RhdGUgKi8KKwkJCQlidXR0b24gPSAofm1vdXNlYnVmW2ldKSAmIDB4MDc7CisJCQkJZHggPSAgKHNpZ25lZCBjaGFyKW1vdXNlYnVmW2krMV07CisJCQkJZHkgPSAtKHNpZ25lZCBjaGFyKW1vdXNlYnVmW2krMl07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIFVoIG9oLi4gKi8KKwkJCQlkeCA9IDA7CisJCQkJZHkgPSAwOworCQkJCWJyZWFrOworCQl9CisJCUZCX3ZnYW1vdXNlY2FsbGJhY2soYnV0dG9uLCByZWxhdGl2ZSwgZHgsIGR5KTsKKwl9CisJaWYgKCBpIDwgbnJlYWQgKSB7CisJCVNETF9tZW1jcHkobW91c2VidWYsICZtb3VzZWJ1ZltpXSwgKG5yZWFkLWkpKTsKKwkJc3RhcnQgPSAobnJlYWQtaSk7CisJfSBlbHNlIHsKKwkJc3RhcnQgPSAwOworCX0KKwlyZXR1cm47Cit9CisKKy8qIEhhbmRsZSBzd2l0Y2hpbmcgdG8gYW5vdGhlciBWQywgcmV0dXJucyB3aGVuIG91ciBWQyBpcyBiYWNrICovCitzdGF0aWMgdm9pZCBzd2l0Y2hfdnRfcHJlcChfVEhJUykKK3sKKwlTRExfU3VyZmFjZSAqc2NyZWVuID0gU0RMX1ZpZGVvU3VyZmFjZTsKKworCVNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIChTRExfQVBQQUNUSVZFfFNETF9BUFBJTlBVVEZPQ1VTfFNETF9BUFBNT1VTRUZPQ1VTKSk7CisKKwkvKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgc2NyZWVuLCBhbmQgZ28gdG8gdGV4dCBtb2RlICovCisJd2FpdF9pZGxlKHRoaXMpOworCXNjcmVlbl9hcmVhbGVuID0gKChzY3JlZW4tPmggKyAoMip0aGlzLT5vZmZzZXRfeSkpICogc2NyZWVuLT5waXRjaCk7CisJc2NyZWVuX2NvbnRlbnRzID0gKFVpbnQ4ICopU0RMX21hbGxvYyhzY3JlZW5fYXJlYWxlbik7CisJaWYgKCBzY3JlZW5fY29udGVudHMgKSB7CisJCVNETF9tZW1jcHkoc2NyZWVuX2NvbnRlbnRzLCBzY3JlZW4tPnBpeGVscywgc2NyZWVuX2FyZWFsZW4pOworCX0KKwlGQl9TYXZlUGFsZXR0ZVRvKHRoaXMsIDI1Niwgc2NyZWVuX3BhbGV0dGUpOworCWlvY3RsKGNvbnNvbGVfZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZzY3JlZW5fdmluZm8pOworCWlvY3RsKGtleWJvYXJkX2ZkLCBLRFNFVE1PREUsIEtEX1RFWFQpOworCWlvY3RsKGtleWJvYXJkX2ZkLCBWVF9VTkxPQ0tTV0lUQ0gsIDEpOworfQorc3RhdGljIHZvaWQgc3dpdGNoX3Z0X2RvbmUoX1RISVMpCit7CisJU0RMX1N1cmZhY2UgKnNjcmVlbiA9IFNETF9WaWRlb1N1cmZhY2U7CisKKwkvKiBSZXN0b3JlIGdyYXBoaWNzIG1vZGUgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgc2NyZWVuICovCisJaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX0xPQ0tTV0lUQ0gsIDEpOworCWlvY3RsKGtleWJvYXJkX2ZkLCBLRFNFVE1PREUsIEtEX0dSQVBISUNTKTsKKwlpb2N0bChjb25zb2xlX2ZkLCBGQklPUFVUX1ZTQ1JFRU5JTkZPLCAmc2NyZWVuX3ZpbmZvKTsKKwlGQl9SZXN0b3JlUGFsZXR0ZUZyb20odGhpcywgMjU2LCBzY3JlZW5fcGFsZXR0ZSk7CisJaWYgKCBzY3JlZW5fY29udGVudHMgKSB7CisJCVNETF9tZW1jcHkoc2NyZWVuLT5waXhlbHMsIHNjcmVlbl9jb250ZW50cywgc2NyZWVuX2FyZWFsZW4pOworCQlTRExfZnJlZShzY3JlZW5fY29udGVudHMpOworCQlzY3JlZW5fY29udGVudHMgPSBOVUxMOworCX0KKworCS8qIEdldCB1cGRhdGVzIHRvIHRoZSBzaGFkb3cgc3VyZmFjZSB3aGlsZSBzd2l0Y2hlZCBhd2F5ICovCisJaWYgKCBTRExfU2hhZG93U3VyZmFjZSApIHsKKwkJU0RMX1VwZGF0ZVJlY3QoU0RMX1NoYWRvd1N1cmZhY2UsIDAsIDAsIDAsIDApOworCX0KKworCVNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIChTRExfQVBQQUNUSVZFfFNETF9BUFBJTlBVVEZPQ1VTfFNETF9BUFBNT1VTRUZPQ1VTKSk7Cit9CitzdGF0aWMgdm9pZCBzd2l0Y2hfdnQoX1RISVMsIHVuc2lnbmVkIHNob3J0IHdoaWNoKQoreworCXN0cnVjdCB2dF9zdGF0IHZ0c3RhdGU7CisKKwkvKiBGaWd1cmUgb3V0IHdoZXRoZXIgb3Igbm90IHdlJ3JlIHN3aXRjaGluZyB0byBhIG5ldyBjb25zb2xlICovCisJaWYgKCAoaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX0dFVFNUQVRFLCAmdnRzdGF0ZSkgPCAwKSB8fAorCSAgICAgKHdoaWNoID09IHZ0c3RhdGUudl9hY3RpdmUpICkgeworCQlyZXR1cm47CisJfQorCisJLyogTmV3IGNvbnNvbGUsIHN3aXRjaCB0byBpdCAqLworCVNETF9tdXRleFAoaHdfbG9jayk7CisJc3dpdGNoX3Z0X3ByZXAodGhpcyk7CisJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgVlRfQUNUSVZBVEUsIHdoaWNoKSA9PSAwICkgeworCQlpb2N0bChrZXlib2FyZF9mZCwgVlRfV0FJVEFDVElWRSwgd2hpY2gpOworCQlzd2l0Y2hlZF9hd2F5ID0gMTsKKwl9IGVsc2UgeworCQlzd2l0Y2hfdnRfZG9uZSh0aGlzKTsKKwl9CisJU0RMX211dGV4Vihod19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2tleWJvYXJkKF9USElTKQoreworCXVuc2lnbmVkIGNoYXIga2V5YnVmW0JVRlNJWl07CisJaW50IGksIG5yZWFkOworCWludCBwcmVzc2VkOworCWludCBzY2FuY29kZTsKKwlTRExfa2V5c3ltIGtleXN5bTsKKworCW5yZWFkID0gcmVhZChrZXlib2FyZF9mZCwga2V5YnVmLCBCVUZTSVopOworCWZvciAoIGk9MDsgaTxucmVhZDsgKytpICkgeworCQlzY2FuY29kZSA9IGtleWJ1ZltpXSAmIDB4N0Y7CisJCWlmICgga2V5YnVmW2ldICYgMHg4MCApIHsKKwkJCXByZXNzZWQgPSBTRExfUkVMRUFTRUQ7CisJCX0gZWxzZSB7CisJCQlwcmVzc2VkID0gU0RMX1BSRVNTRUQ7CisJCX0KKwkJVHJhbnNsYXRlS2V5KHNjYW5jb2RlLCAma2V5c3ltKTsKKwkJLyogSGFuZGxlIEN0cmwtQWx0LUZOIGZvciB2dCBzd2l0Y2ggKi8KKwkJc3dpdGNoIChrZXlzeW0uc3ltKSB7CisJCSAgICBjYXNlIFNETEtfRjE6CisJCSAgICBjYXNlIFNETEtfRjI6CisJCSAgICBjYXNlIFNETEtfRjM6CisJCSAgICBjYXNlIFNETEtfRjQ6CisJCSAgICBjYXNlIFNETEtfRjU6CisJCSAgICBjYXNlIFNETEtfRjY6CisJCSAgICBjYXNlIFNETEtfRjc6CisJCSAgICBjYXNlIFNETEtfRjg6CisJCSAgICBjYXNlIFNETEtfRjk6CisJCSAgICBjYXNlIFNETEtfRjEwOgorCQkgICAgY2FzZSBTRExLX0YxMToKKwkJICAgIGNhc2UgU0RMS19GMTI6CisJCQlpZiAoIChTRExfR2V0TW9kU3RhdGUoKSAmIEtNT0RfQ1RSTCkgJiYKKwkJCSAgICAgKFNETF9HZXRNb2RTdGF0ZSgpICYgS01PRF9BTFQpICkgeworCQkJCWlmICggcHJlc3NlZCApIHsKKwkJCQkJc3dpdGNoX3Z0KHRoaXMsIChrZXlzeW0uc3ltLVNETEtfRjEpKzEpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgcHJvY2Vzc2luZyAqLworCQkgICAgZGVmYXVsdDoKKwkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZUtleWJvYXJkKHByZXNzZWQsICZrZXlzeW0pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgRkJfUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlmZF9zZXQgZmRzZXQ7CisJaW50IG1heF9mZDsKKwlzdGF0aWMgc3RydWN0IHRpbWV2YWwgemVybzsKKworCWRvIHsKKwkJaWYgKCBzd2l0Y2hlZF9hd2F5ICkgeworCQkJc3RydWN0IHZ0X3N0YXQgdnRzdGF0ZTsKKworCQkJU0RMX211dGV4UChod19sb2NrKTsKKwkJCWlmICggKGlvY3RsKGtleWJvYXJkX2ZkLCBWVF9HRVRTVEFURSwgJnZ0c3RhdGUpID09IDApICYmCisJCQkgICAgIHZ0c3RhdGUudl9hY3RpdmUgPT0gY3VycmVudF92dCApIHsKKwkJCQlzd2l0Y2hlZF9hd2F5ID0gMDsKKwkJCQlzd2l0Y2hfdnRfZG9uZSh0aGlzKTsKKwkJCX0KKwkJCVNETF9tdXRleFYoaHdfbG9jayk7CisJCX0KKworCQlwb3N0ZWQgPSAwOworCisJCUZEX1pFUk8oJmZkc2V0KTsKKwkJbWF4X2ZkID0gMDsKKwkJaWYgKCBrZXlib2FyZF9mZCA+PSAwICkgeworCQkJRkRfU0VUKGtleWJvYXJkX2ZkLCAmZmRzZXQpOworCQkJaWYgKCBtYXhfZmQgPCBrZXlib2FyZF9mZCApIHsKKwkJCQltYXhfZmQgPSBrZXlib2FyZF9mZDsKKwkJCX0KKwkJfQorCQlpZiAoIG1vdXNlX2ZkID49IDAgKSB7CisJCQlGRF9TRVQobW91c2VfZmQsICZmZHNldCk7CisJCQlpZiAoIG1heF9mZCA8IG1vdXNlX2ZkICkgeworCQkJCW1heF9mZCA9IG1vdXNlX2ZkOworCQkJfQorCQl9CisJCWlmICggc2VsZWN0KG1heF9mZCsxLCAmZmRzZXQsIE5VTEwsIE5VTEwsICZ6ZXJvKSA+IDAgKSB7CisJCQlpZiAoIGtleWJvYXJkX2ZkID49IDAgKSB7CisJCQkJaWYgKCBGRF9JU1NFVChrZXlib2FyZF9mZCwgJmZkc2V0KSApIHsKKwkJCQkJaGFuZGxlX2tleWJvYXJkKHRoaXMpOworCQkJCX0KKwkJCX0KKwkJCWlmICggbW91c2VfZmQgPj0gMCApIHsKKwkJCQlpZiAoIEZEX0lTU0VUKG1vdXNlX2ZkLCAmZmRzZXQpICkgeworCQkJCQloYW5kbGVfbW91c2UodGhpcyk7CisJCQkJfQorCQkJfQorCQl9CisJfSB3aGlsZSAoIHBvc3RlZCApOworfQorCit2b2lkIEZCX0luaXRPU0tleW1hcChfVEhJUykKK3sKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgdGhlIExpbnV4IGtleSB0cmFuc2xhdGlvbiB0YWJsZSAqLworCisJLyogRmlyc3QgZ2V0IHRoZSBhc2NpaSBrZXlzIGFuZCBvdGhlcnMgbm90IHdlbGwgaGFuZGxlZCAqLworCWZvciAoaT0wOyBpPFNETF9hcnJheXNpemUoa2V5bWFwKTsgKytpKSB7CisJICBzd2l0Y2goaSkgeworCSAgLyogVGhlc2UgYXJlbid0IGhhbmRsZWQgYnkgdGhlIHg4NiBrZXJuZWwga2V5bWFwcGluZyAoPykgKi8KKwkgIGNhc2UgU0NBTkNPREVfUFJJTlRTQ1JFRU46CisJICAgIGtleW1hcFtpXSA9IFNETEtfUFJJTlQ7CisJICAgIGJyZWFrOworCSAgY2FzZSBTQ0FOQ09ERV9CUkVBSzoKKwkgICAga2V5bWFwW2ldID0gU0RMS19CUkVBSzsKKwkgICAgYnJlYWs7CisJICBjYXNlIFNDQU5DT0RFX0JSRUFLX0FMVEVSTkFUSVZFOgorCSAgICBrZXltYXBbaV0gPSBTRExLX1BBVVNFOworCSAgICBicmVhazsKKwkgIGNhc2UgU0NBTkNPREVfTEVGVFNISUZUOgorCSAgICBrZXltYXBbaV0gPSBTRExLX0xTSElGVDsKKwkgICAgYnJlYWs7CisJICBjYXNlIFNDQU5DT0RFX1JJR0hUU0hJRlQ6CisJICAgIGtleW1hcFtpXSA9IFNETEtfUlNISUZUOworCSAgICBicmVhazsKKwkgIGNhc2UgU0NBTkNPREVfTEVGVENPTlRST0w6CisJICAgIGtleW1hcFtpXSA9IFNETEtfTENUUkw7CisJICAgIGJyZWFrOworCSAgY2FzZSBTQ0FOQ09ERV9SSUdIVENPTlRST0w6CisJICAgIGtleW1hcFtpXSA9IFNETEtfUkNUUkw7CisJICAgIGJyZWFrOworCSAgY2FzZSBTQ0FOQ09ERV9SSUdIVFdJTjoKKwkgICAga2V5bWFwW2ldID0gU0RMS19SU1VQRVI7CisJICAgIGJyZWFrOworCSAgY2FzZSBTQ0FOQ09ERV9MRUZUV0lOOgorCSAgICBrZXltYXBbaV0gPSBTRExLX0xTVVBFUjsKKwkgICAgYnJlYWs7CisJICBjYXNlIFNDQU5DT0RFX0xFRlRBTFQ6CisJICAgIGtleW1hcFtpXSA9IFNETEtfTEFMVDsKKwkgICAgYnJlYWs7CisJICBjYXNlIFNDQU5DT0RFX1JJR0hUQUxUOgorCSAgICBrZXltYXBbaV0gPSBTRExLX1JBTFQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAxMjc6CisJICAgIGtleW1hcFtpXSA9IFNETEtfTUVOVTsKKwkgICAgYnJlYWs7CisJICAvKiB0aGlzIHNob3VsZCB0YWtlIGNhcmUgb2YgYWxsIHN0YW5kYXJkIGFzY2lpIGtleXMgKi8KKwkgIGRlZmF1bHQ6CisJICAgIGtleW1hcFtpXSA9IEtWQUwodmdhX2tleW1hcFswXVtpXSk7CisJICAgIGJyZWFrOworICAgICAgICAgIH0KKwl9CisJZm9yIChpPTA7IGk8U0RMX2FycmF5c2l6ZShrZXltYXApOyArK2kpIHsKKwkgIHN3aXRjaChrZXltYXBfdGVtcFtpXSkgeworCSAgICBjYXNlIEtfRjE6ICBrZXltYXBbaV0gPSBTRExLX0YxOyAgYnJlYWs7CisJICAgIGNhc2UgS19GMjogIGtleW1hcFtpXSA9IFNETEtfRjI7ICBicmVhazsKKwkgICAgY2FzZSBLX0YzOiAga2V5bWFwW2ldID0gU0RMS19GMzsgIGJyZWFrOworCSAgICBjYXNlIEtfRjQ6ICBrZXltYXBbaV0gPSBTRExLX0Y0OyAgYnJlYWs7CisJICAgIGNhc2UgS19GNTogIGtleW1hcFtpXSA9IFNETEtfRjU7ICBicmVhazsKKwkgICAgY2FzZSBLX0Y2OiAga2V5bWFwW2ldID0gU0RMS19GNjsgIGJyZWFrOworCSAgICBjYXNlIEtfRjc6ICBrZXltYXBbaV0gPSBTRExLX0Y3OyAgYnJlYWs7CisJICAgIGNhc2UgS19GODogIGtleW1hcFtpXSA9IFNETEtfRjg7ICBicmVhazsKKwkgICAgY2FzZSBLX0Y5OiAga2V5bWFwW2ldID0gU0RMS19GOTsgIGJyZWFrOworCSAgICBjYXNlIEtfRjEwOiBrZXltYXBbaV0gPSBTRExLX0YxMDsgYnJlYWs7CisJICAgIGNhc2UgS19GMTE6IGtleW1hcFtpXSA9IFNETEtfRjExOyBicmVhazsKKwkgICAgY2FzZSBLX0YxMjoga2V5bWFwW2ldID0gU0RMS19GMTI7IGJyZWFrOworCisJICAgIGNhc2UgS19ET1dOOiAga2V5bWFwW2ldID0gU0RMS19ET1dOOyAgYnJlYWs7CisJICAgIGNhc2UgS19MRUZUOiAga2V5bWFwW2ldID0gU0RMS19MRUZUOyAgYnJlYWs7CisJICAgIGNhc2UgS19SSUdIVDoga2V5bWFwW2ldID0gU0RMS19SSUdIVDsgYnJlYWs7CisJICAgIGNhc2UgS19VUDogICAga2V5bWFwW2ldID0gU0RMS19VUDsgICAgYnJlYWs7CisKKwkgICAgY2FzZSBLX1AwOiAgICAga2V5bWFwW2ldID0gU0RMS19LUDA7IGJyZWFrOworCSAgICBjYXNlIEtfUDE6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQMTsgYnJlYWs7CisJICAgIGNhc2UgS19QMjogICAgIGtleW1hcFtpXSA9IFNETEtfS1AyOyBicmVhazsKKwkgICAgY2FzZSBLX1AzOiAgICAga2V5bWFwW2ldID0gU0RMS19LUDM7IGJyZWFrOworCSAgICBjYXNlIEtfUDQ6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQNDsgYnJlYWs7CisJICAgIGNhc2UgS19QNTogICAgIGtleW1hcFtpXSA9IFNETEtfS1A1OyBicmVhazsKKwkgICAgY2FzZSBLX1A2OiAgICAga2V5bWFwW2ldID0gU0RMS19LUDY7IGJyZWFrOworCSAgICBjYXNlIEtfUDc6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQNzsgYnJlYWs7CisJICAgIGNhc2UgS19QODogICAgIGtleW1hcFtpXSA9IFNETEtfS1A4OyBicmVhazsKKwkgICAgY2FzZSBLX1A5OiAgICAga2V5bWFwW2ldID0gU0RMS19LUDk7IGJyZWFrOworCSAgICBjYXNlIEtfUFBMVVM6ICBrZXltYXBbaV0gPSBTRExLX0tQX1BMVVM7IGJyZWFrOworCSAgICBjYXNlIEtfUE1JTlVTOiBrZXltYXBbaV0gPSBTRExLX0tQX01JTlVTOyBicmVhazsKKwkgICAgY2FzZSBLX1BTVEFSOiAga2V5bWFwW2ldID0gU0RMS19LUF9NVUxUSVBMWTsgYnJlYWs7CisJICAgIGNhc2UgS19QU0xBU0g6IGtleW1hcFtpXSA9IFNETEtfS1BfRElWSURFOyBicmVhazsKKwkgICAgY2FzZSBLX1BFTlRFUjoga2V5bWFwW2ldID0gU0RMS19LUF9FTlRFUjsgYnJlYWs7CisJICAgIGNhc2UgS19QRE9UOiAgIGtleW1hcFtpXSA9IFNETEtfS1BfUEVSSU9EOyBicmVhazsKKworCSAgICBjYXNlIEtfU0hJRlQ6ICBpZiAoIGtleW1hcFtpXSAhPSBTRExLX1JTSElGVCApCisJICAgICAgICAgICAgICAgICAgICAga2V5bWFwW2ldID0gU0RMS19MU0hJRlQ7CisJICAgICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICBjYXNlIEtfU0hJRlRMOiBrZXltYXBbaV0gPSBTRExLX0xTSElGVDsgYnJlYWs7CisJICAgIGNhc2UgS19TSElGVFI6IGtleW1hcFtpXSA9IFNETEtfUlNISUZUOyBicmVhazsKKwkgICAgY2FzZSBLX0NUUkw6ICBpZiAoIGtleW1hcFtpXSAhPSBTRExLX1JDVFJMICkKKwkgICAgICAgICAgICAgICAgICAgICBrZXltYXBbaV0gPSBTRExLX0xDVFJMOworCSAgICAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBLX0NUUkxMOiAga2V5bWFwW2ldID0gU0RMS19MQ1RSTDsgIGJyZWFrOworCSAgICBjYXNlIEtfQ1RSTFI6ICBrZXltYXBbaV0gPSBTRExLX1JDVFJMOyAgYnJlYWs7CisJICAgIGNhc2UgS19BTFQ6ICAgIGtleW1hcFtpXSA9IFNETEtfTEFMVDsgICBicmVhazsKKwkgICAgY2FzZSBLX0FMVEdSOiAga2V5bWFwW2ldID0gU0RMS19SQUxUOyAgIGJyZWFrOworCisJICAgIGNhc2UgS19JTlNFUlQ6IGtleW1hcFtpXSA9IFNETEtfSU5TRVJUOyAgIGJyZWFrOworCSAgICBjYXNlIEtfUkVNT1ZFOiBrZXltYXBbaV0gPSBTRExLX0RFTEVURTsgICBicmVhazsKKwkgICAgY2FzZSBLX1BHVVA6ICAga2V5bWFwW2ldID0gU0RMS19QQUdFVVA7ICAgYnJlYWs7CisJICAgIGNhc2UgS19QR0ROOiAgIGtleW1hcFtpXSA9IFNETEtfUEFHRURPV047IGJyZWFrOworCSAgICBjYXNlIEtfRklORDogICBrZXltYXBbaV0gPSBTRExLX0hPTUU7ICAgICBicmVhazsKKwkgICAgY2FzZSBLX1NFTEVDVDoga2V5bWFwW2ldID0gU0RMS19FTkQ7ICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBLX05VTTogIGtleW1hcFtpXSA9IFNETEtfTlVNTE9DSzsgICBicmVhazsKKwkgICAgY2FzZSBLX0NBUFM6IGtleW1hcFtpXSA9IFNETEtfQ0FQU0xPQ0s7ICBicmVhazsKKworCSAgICBjYXNlIEtfRjEzOiAgIGtleW1hcFtpXSA9IFNETEtfUFJJTlQ7ICAgICBicmVhazsKKwkgICAgY2FzZSBLX0hPTEQ6ICBrZXltYXBbaV0gPSBTRExLX1NDUk9MTE9DSzsgYnJlYWs7CisJICAgIGNhc2UgS19QQVVTRToga2V5bWFwW2ldID0gU0RMS19QQVVTRTsgICAgIGJyZWFrOworCisJICAgIGNhc2UgMTI3OiBrZXltYXBbaV0gPSBTRExLX0JBQ0tTUEFDRTsgYnJlYWs7CisJICAgICAKKwkgICAgZGVmYXVsdDogYnJlYWs7CisJICB9CisJfQorfQorCitzdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQoreworCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCisJa2V5c3ltLT5zY2FuY29kZSA9IHNjYW5jb2RlOworCWtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKKwlrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKKworCS8qIElmIFVOSUNPREUgaXMgb24sIGdldCB0aGUgVU5JQ09ERSB2YWx1ZSBmb3IgdGhlIGtleSAqLworCWtleXN5bS0+dW5pY29kZSA9IDA7CisJaWYgKCBTRExfVHJhbnNsYXRlVU5JQ09ERSApIHsKKwkJaW50IG1hcDsKKwkJU0RMTW9kIG1vZHN0YXRlOworCisJCW1vZHN0YXRlID0gU0RMX0dldE1vZFN0YXRlKCk7CisJCW1hcCA9IDA7CisJCWlmICggbW9kc3RhdGUgJiBLTU9EX1NISUZUICkgeworCQkJbWFwIHw9ICgxPDxLR19TSElGVCk7CisJCX0KKwkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQ1RSTCApIHsKKwkJCW1hcCB8PSAoMTw8S0dfQ1RSTCk7CisJCX0KKwkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfTEFMVCApIHsKKwkJCW1hcCB8PSAoMTw8S0dfQUxUKTsKKwkJfQorCQlpZiAoIG1vZHN0YXRlICYgS01PRF9SQUxUICkgeworCQkJbWFwIHw9ICgxPDxLR19BTFRHUik7CisJCX0KKwkJaWYgKCBLVFlQKHZnYV9rZXltYXBbbWFwXVtzY2FuY29kZV0pID09IEtUX0xFVFRFUiApIHsKKwkJCWlmICggbW9kc3RhdGUgJiBLTU9EX0NBUFMgKSB7CisJCQkJbWFwIF49ICgxPDxLR19TSElGVCk7CisJCQl9CisJCX0KKwkJaWYgKCBLVFlQKHZnYV9rZXltYXBbbWFwXVtzY2FuY29kZV0pID09IEtUX1BBRCApIHsKKwkJCWlmICggbW9kc3RhdGUgJiBLTU9EX05VTSApIHsKKwkJCQlrZXlzeW0tPnVuaWNvZGU9S1ZBTCh2Z2Ffa2V5bWFwW21hcF1bc2NhbmNvZGVdKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWtleXN5bS0+dW5pY29kZSA9IEtWQUwodmdhX2tleW1hcFttYXBdW3NjYW5jb2RlXSk7CisJCX0KKwl9CisJcmV0dXJuKGtleXN5bSk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmV2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmV2ZW50c19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4YjA5YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZiZXZlbnRzX2MuaApAQCAtMCwwICsxLDM4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCisKKy8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFNETF9zeXNldmVudHMuYyB0byBvdGhlciBwYXJ0cyAKKyAgIG9mIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIChTRExfc3lzdmlkZW8uYykKKyovCitleHRlcm4gaW50IEZCX09wZW5LZXlib2FyZChfVEhJUyk7CitleHRlcm4gdm9pZCBGQl9DbG9zZUtleWJvYXJkKF9USElTKTsKK2V4dGVybiBpbnQgRkJfT3Blbk1vdXNlKF9USElTKTsKK2V4dGVybiB2b2lkIEZCX0Nsb3NlTW91c2UoX1RISVMpOworZXh0ZXJuIGludCBGQl9FbnRlckdyYXBoaWNzTW9kZShfVEhJUyk7CitleHRlcm4gaW50IEZCX0luR3JhcGhpY3NNb2RlKF9USElTKTsKK2V4dGVybiB2b2lkIEZCX0xlYXZlR3JhcGhpY3NNb2RlKF9USElTKTsKKworZXh0ZXJuIHZvaWQgRkJfSW5pdE9TS2V5bWFwKF9USElTKTsKK2V4dGVybiB2b2lkIEZCX1B1bXBFdmVudHMoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJrZXlzLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYmtleXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9TRExfZmJrZXlzLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2Zia2V5cy5oCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYm1hdHJveC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9TRExfZmJtYXRyb3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGI5MGIwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9TRExfZmJtYXRyb3guYwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYmxpdC5oIgorI2luY2x1ZGUgIlNETF9mYm1hdHJveC5oIgorI2luY2x1ZGUgIm1hdHJveF9tbWlvLmgiCisKKworLyogV2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSAtIHRha2VuIGZyb20gdGhlIFhGcmVlODYgTWF0cm94IGRyaXZlciAqLworc3RhdGljIHZvaWQgV2FpdFZCTChfVEhJUykKK3sKKwlpbnQgY291bnQ7CisKKwkvKiBmaW5kIHN0YXJ0IG9mIHJldHJhY2UgKi8KKwltZ2Ffd2FpdGlkbGUoKTsKKwl3aGlsZSAoICAobWdhX2luOCgweDFGREEpICYgMHgwOCkgKQorCQk7CisJd2hpbGUgKCAhKG1nYV9pbjgoMHgxRkRBKSAmIDB4MDgpICkKKwkJOyAKKwkvKiB3YWl0IHVudGlsIHdlJ3JlIHBhc3QgdGhlIHN0YXJ0ICovCisJY291bnQgPSBtZ2FfaW4zMigweDFFMjApICsgMjsKKwl3aGlsZSAoIG1nYV9pbjMyKDB4MUUyMCkgPCBjb3VudCApCisJCTsKK30KK3N0YXRpYyB2b2lkIFdhaXRJZGxlKF9USElTKQoreworCW1nYV93YWl0aWRsZSgpOworfQorCisvKiBTZXRzIHZpZGVvIG1lbSBjb2xvcmtleSBhbmQgYWNjZWxlcmF0ZWQgYmxpdCBmdW5jdGlvbiAqLworc3RhdGljIGludCBTZXRIV0NvbG9yS2V5KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDMyIGtleSkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qIFNldHMgcGVyIHN1cmZhY2UgaGFyZHdhcmUgYWxwaGEgdmFsdWUgKi8KKyNpZiAwCitzdGF0aWMgaW50IFNldEhXQWxwaGEoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50OCB2YWx1ZSkKK3sKKwlyZXR1cm4oMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBGaWxsSFdSZWN0KF9USElTLCBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqcmVjdCwgVWludDMyIGNvbG9yKQoreworCWludCBkc3RYLCBkc3RZOworCVVpbnQzMiBmeGJuZHJ5OworCVVpbnQzMiB5ZHN0bGVuOworCVVpbnQzMiBmaWxsb3A7CisKKwkvKiBEb24ndCBibGl0IHRvIHRoZSBkaXNwbGF5IHN1cmZhY2Ugd2hlbiBzd2l0Y2hlZCBhd2F5ICovCisJaWYgKCBzd2l0Y2hlZF9hd2F5ICkgeworCQlyZXR1cm4gLTI7IC8qIG5vIGhhcmR3YXJlIGFjY2VzcyAqLworCX0KKwlpZiAoIGRzdCA9PSB0aGlzLT5zY3JlZW4gKSB7CisJCVNETF9tdXRleFAoaHdfbG9jayk7CisJfQorCisJc3dpdGNoIChkc3QtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCkgeworCSAgICBjYXNlIDE6CisJCWNvbG9yIHw9IChjb2xvcjw8OCk7CisJICAgIGNhc2UgMjoKKwkJY29sb3IgfD0gKGNvbG9yPDwxNik7CisJCWJyZWFrOworCX0KKworCS8qIFNldCB1cCB0aGUgWC9ZIGJhc2UgY29vcmRpbmF0ZXMgKi8KKwlGQl9kc3RfdG9feHkodGhpcywgZHN0LCAmZHN0WCwgJmRzdFkpOworCisJLyogQWRqdXN0IGZvciB0aGUgY3VycmVudCByZWN0YW5nbGUgKi8KKwlkc3RYICs9IHJlY3QtPng7CisJZHN0WSArPSByZWN0LT55OworCisJLyogU2V0IHVwIHRoZSBYIGJvdW5kYXJpZXMgKi8KKwlmeGJuZHJ5ID0gKGRzdFggfCAoKGRzdFgrcmVjdC0+dykgPDwgMTYpKTsKKworCS8qIFNldCB1cCB0aGUgWSBib3VuZGFyaWVzICovCisJeWRzdGxlbiA9IChyZWN0LT5oIHwgKGRzdFkgPDwgMTYpKTsKKworCS8qIFNldCB1cCBmb3IgY29sb3IgZmlsbCBvcGVyYXRpb24gKi8KKwlmaWxsb3AgPSBNR0FEV0dfVFJBUCB8IE1HQURXR19TT0xJRCB8CisJICAgICAgICAgTUdBRFdHX0FSWkVSTyB8IE1HQURXR19TR05aRVJPIHwgTUdBRFdHX1NISUZUWkVSTzsKKworCS8qIEV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMhICovCisJbWdhX3dhaXQoNSk7CisJbWdhX291dDMyKE1HQVJFR19EV0dDVEwsIGZpbGxvcCB8IE1HQURXR19SRVBMQUNFKTsKKwltZ2Ffb3V0MzIoTUdBUkVHX0ZDT0wsIGNvbG9yKTsKKwltZ2Ffb3V0MzIoTUdBUkVHX0ZYQk5EUlksIGZ4Ym5kcnkpOworCW1nYV9vdXQzMihNR0FSRUdfWURTVExFTiArIE1HQVJFR19FWEVDLCB5ZHN0bGVuKTsKKworCUZCX0FkZEJ1c3lTdXJmYWNlKGRzdCk7CisKKwlpZiAoIGRzdCA9PSB0aGlzLT5zY3JlZW4gKSB7CisJCVNETF9tdXRleFYoaHdfbG9jayk7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBIV0FjY2VsQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCit7CisJU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gY3VycmVudF92aWRlbzsKKwlpbnQgcGl0Y2gsIHcsIGg7CisJaW50IHNyY1gsIHNyY1k7CisJaW50IGRzdFgsIGRzdFk7CisJVWludDMyIHNpZ247CisJVWludDMyIHN0YXJ0LCBzdG9wOworCWludCBza2lwOworCVVpbnQzMiBibGl0b3A7CisKKwkvKiBGSVhNRTogRm9yIG5vdywgb25seSBibGl0IHRvIGRpc3BsYXkgc3VyZmFjZSAqLworCWlmICggZHN0LT5waXRjaCAhPSBTRExfVmlkZW9TdXJmYWNlLT5waXRjaCApIHsKKwkJcmV0dXJuKHNyYy0+bWFwLT5zd19ibGl0KHNyYywgc3JjcmVjdCwgZHN0LCBkc3RyZWN0KSk7CisJfQorCisJLyogRG9uJ3QgYmxpdCB0byB0aGUgZGlzcGxheSBzdXJmYWNlIHdoZW4gc3dpdGNoZWQgYXdheSAqLworCWlmICggc3dpdGNoZWRfYXdheSApIHsKKwkJcmV0dXJuIC0yOyAvKiBubyBoYXJkd2FyZSBhY2Nlc3MgKi8KKwl9CisJaWYgKCBkc3QgPT0gdGhpcy0+c2NyZWVuICkgeworCQlTRExfbXV0ZXhQKGh3X2xvY2spOworCX0KKworCS8qIENhbGN1bGF0ZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJhc2UgY29vcmRpbmF0ZXMgKGluIHBpeGVscykgKi8KKwl3ID0gZHN0cmVjdC0+dzsKKwloID0gZHN0cmVjdC0+aDsKKwlGQl9kc3RfdG9feHkodGhpcywgc3JjLCAmc3JjWCwgJnNyY1kpOworCUZCX2RzdF90b194eSh0aGlzLCBkc3QsICZkc3RYLCAmZHN0WSk7CisKKwkvKiBBZGp1c3QgZm9yIHRoZSBjdXJyZW50IGJsaXQgcmVjdGFuZ2xlcyAqLworCXNyY1ggKz0gc3JjcmVjdC0+eDsKKwlzcmNZICs9IHNyY3JlY3QtPnk7CisJZHN0WCArPSBkc3RyZWN0LT54OworCWRzdFkgKz0gZHN0cmVjdC0+eTsKKwlwaXRjaCA9IGRzdC0+cGl0Y2gvZHN0LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisKKwkvKiBTZXQgdXAgdGhlIGJsaXQgZGlyZWN0aW9uIChzaWduKSBmbGFncyAqLworCXNpZ24gPSAwOworCWlmICggc3JjWCA8IGRzdFggKSB7CisJCXNpZ24gfD0gMTsKKwl9CisJaWYgKCBzcmNZIDwgZHN0WSApIHsKKwkJc2lnbiB8PSA0OworCQlzcmNZICs9IChoIC0gMSk7CisJCWRzdFkgKz0gKGggLSAxKTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIGJsaXQgc291cmNlIHJvdyBzdGFydCwgZW5kLCBhbmQgc2tpcCAoaW4gcGl4ZWxzKSAqLworCXN0b3AgPSBzdGFydCA9IChzcmNZICogcGl0Y2gpICsgc3JjWDsKKwlpZiAoIHNyY1ggPCBkc3RYICkgeworCQlzdGFydCArPSAodyAtIDEpOworCX0gZWxzZSB7CisJCXN0b3AgICs9ICh3IC0gMSk7CisJfQorCWlmICggc3JjWSA8IGRzdFkgKSB7CisJCXNraXAgPSAtcGl0Y2g7CisJfSBlbHNlIHsKKwkJc2tpcCA9IHBpdGNoOworCX0KKworCS8qIFNldCB1cCB0aGUgYmxpdCBvcGVyYXRpb24gKi8KKwlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKSB7CisJCVVpbnQzMiBjb2xvcmtleTsKKworCQlibGl0b3AgPSBNR0FEV0dfQkZDT0wgfCBNR0FEV0dfQklUQkxUIHwKKwkJICAgICAgICAgTUdBRFdHX1NISUZUWkVSTyB8IE1HQURXR19SU1RSIHwgKDB4MEMgPDwgMTYpIHwKKwkJICAgICAgICAgTUdBRFdHX1RSQU5TQzsKKworCQljb2xvcmtleSA9IHNyYy0+Zm9ybWF0LT5jb2xvcmtleTsKKwkJc3dpdGNoIChkc3QtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCkgeworCQkgICAgY2FzZSAxOgorCQkJY29sb3JrZXkgfD0gKGNvbG9ya2V5PDw4KTsKKwkJICAgIGNhc2UgMjoKKwkJCWNvbG9ya2V5IHw9IChjb2xvcmtleTw8MTYpOworCQkJYnJlYWs7CisJCX0KKwkJbWdhX3dhaXQoMik7CisJCW1nYV9vdXQzMihNR0FSRUdfRkNPTCwgY29sb3JrZXkpOworCQltZ2Ffb3V0MzIoTUdBUkVHX0JDT0wsIDB4RkZGRkZGRkYpOworCX0gZWxzZSB7CisJCWJsaXRvcCA9IE1HQURXR19CRkNPTCB8IE1HQURXR19CSVRCTFQgfAorCQkgICAgICAgICBNR0FEV0dfU0hJRlRaRVJPIHwgTUdBRFdHX1JTVFIgfCAoMHgwQyA8PCAxNik7CisJfQorCW1nYV93YWl0KDcpOworCW1nYV9vdXQzMihNR0FSRUdfU0dOLCBzaWduKTsKKwltZ2Ffb3V0MzIoTUdBUkVHX0FSMywgc3RhcnQpOworCW1nYV9vdXQzMihNR0FSRUdfQVIwLCBzdG9wKTsKKwltZ2Ffb3V0MzIoTUdBUkVHX0FSNSwgc2tpcCk7CisJbWdhX291dDMyKE1HQVJFR19GWEJORFJZLCAoZHN0WCB8ICgoZHN0WCArIHctMSkgPDwgMTYpKSk7CisJbWdhX291dDMyKE1HQVJFR19ZRFNUTEVOLCAoZHN0WSA8PCAxNikgfCBoKTsKKwltZ2Ffb3V0MzIoTUdBUkVHX0RXR0NUTCArIE1HQVJFR19FWEVDLCBibGl0b3ApOworCisJRkJfQWRkQnVzeVN1cmZhY2Uoc3JjKTsKKwlGQl9BZGRCdXN5U3VyZmFjZShkc3QpOworCisJaWYgKCBkc3QgPT0gdGhpcy0+c2NyZWVuICkgeworCQlTRExfbXV0ZXhWKGh3X2xvY2spOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkc3QpCit7CisJaW50IGFjY2VsZXJhdGVkOworCisJLyogU2V0IGluaXRpYWwgYWNjZWxlcmF0aW9uIG9uICovCisJc3JjLT5mbGFncyB8PSBTRExfSFdBQ0NFTDsKKworCS8qIFNldCB0aGUgc3VyZmFjZSBhdHRyaWJ1dGVzICovCisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBICkgeworCQlpZiAoICEgdGhpcy0+aW5mby5ibGl0X2h3X0EgKSB7CisJCQlzcmMtPmZsYWdzICY9IH5TRExfSFdBQ0NFTDsKKwkJfQorCX0KKwlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkgKSB7CisJCWlmICggISB0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgKSB7CisJCQlzcmMtPmZsYWdzICY9IH5TRExfSFdBQ0NFTDsKKwkJfQorCX0KKworCS8qIENoZWNrIHRvIHNlZSBpZiBmaW5hbCBzdXJmYWNlIGJsaXQgaXMgYWNjZWxlcmF0ZWQgKi8KKwlhY2NlbGVyYXRlZCA9ICEhKHNyYy0+ZmxhZ3MgJiBTRExfSFdBQ0NFTCk7CisJaWYgKCBhY2NlbGVyYXRlZCApIHsKKwkJc3JjLT5tYXAtPmh3X2JsaXQgPSBIV0FjY2VsQmxpdDsKKwl9CisJcmV0dXJuKGFjY2VsZXJhdGVkKTsKK30KKwordm9pZCBGQl9NYXRyb3hBY2NlbChfVEhJUywgX191MzIgY2FyZCkKK3sKKwkvKiBXZSBoYXZlIGhhcmR3YXJlIGFjY2VsZXJhdGVkIHN1cmZhY2UgZnVuY3Rpb25zICovCisJdGhpcy0+Q2hlY2tIV0JsaXQgPSBDaGVja0hXQmxpdDsKKwl3YWl0X3ZibCA9IFdhaXRWQkw7CisJd2FpdF9pZGxlID0gV2FpdElkbGU7CisKKwkvKiBUaGUgTWF0cm94IGhhcyBhbiBhY2NlbGVyYXRlZCBjb2xvciBmaWxsICovCisJdGhpcy0+aW5mby5ibGl0X2ZpbGwgPSAxOworCXRoaXMtPkZpbGxIV1JlY3QgPSBGaWxsSFdSZWN0OworCisJLyogVGhlIE1hdHJveCBoYXMgYWNjZWxlcmF0ZWQgbm9ybWFsIGFuZCBjb2xvcmtleSBibGl0cy4gKi8KKwl0aGlzLT5pbmZvLmJsaXRfaHcgPSAxOworCS8qIFRoZSBNaWxsZW5pdW0gSSBhcHBlYXJzIHRvIGRvIHRoZSBjb2xvcmtleSB0ZXN0IGEgd29yZAorCSAgIGF0IGEgdGltZSwgYW5kIHRoZSB0cmFuc3BhcmVuY3kgaXMgaW50dmVydGVkLiAoPykKKwkgKi8KKwlpZiAoIGNhcmQgIT0gRkJfQUNDRUxfTUFUUk9YX01HQTIwNjRXICkgeworCQl0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgPSAxOworCQl0aGlzLT5TZXRIV0NvbG9yS2V5ID0gU2V0SFdDb2xvcktleTsKKwl9CisKKyNpZiAwIC8qIE5vdCB5ZXQgaW1wbGVtZW50ZWQ/ICovCisJLyogVGhlIE1hdHJveCBHMjAwL0c0MDAgaGFzIGFuIGFjY2VsZXJhdGVkIGFscGhhIGJsaXQgKi8KKwlpZiAoIChjYXJkID09IEZCX0FDQ0VMX01BVFJPWF9NR0FHMjAwKQorCSAgfHwgKGNhcmQgPT0gRkJfQUNDRUxfTUFUUk9YX01HQUc0MDApCisJKSB7CisJCXRoaXMtPmluZm8uYmxpdF9od19BID0gMTsKKwkJdGhpcy0+U2V0SFdBbHBoYSA9IFNldEhXQWxwaGE7CisJfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYm1hdHJveC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9TRExfZmJtYXRyb3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q0MWIwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9TRExfZmJtYXRyb3guaApAQCAtMCwwICsxLDI5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogTWF0cm94IGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBmb3IgdGhlIFNETCBmcmFtZWJ1ZmZlciBjb25zb2xlIGRyaXZlciAqLworCisjaW5jbHVkZSAiU0RMX2ZidmlkZW8uaCIKKworLyogU2V0IHVwIHRoZSBkcml2ZXIgZm9yIE1hdHJveCBhY2NlbGVyYXRpb24gKi8KK2V4dGVybiB2b2lkIEZCX01hdHJveEFjY2VsKF9USElTLCBfX3UzMiBjYXJkKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibW91c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjVmMjdlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9TRExfZmJtb3VzZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2ZibW91c2VfYy5oIgorCisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLworc3RydWN0IFdNY3Vyc29yIHsKKwlpbnQgdW51c2VkOworfTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9TRExfZmJtb3VzZV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiMDMxZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZibW91c2VfYy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX2ZidmlkZW8uaCIKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYnJpdmEuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2Zicml2YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNGI3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYnJpdmEuYwpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYmxpdC5oIgorI2luY2x1ZGUgIlNETF9mYnJpdmEuaCIKKyNpbmNsdWRlICJyaXZhX21taW8uaCIKKyNpbmNsdWRlICJyaXZhX3JlZ3MuaCIKKworCitzdGF0aWMgaW50IEZpZm9FbXB0eUNvdW50ID0gMDsKK3N0YXRpYyBpbnQgRmlmb0ZyZWVDb3VudCA9IDA7CisKKy8qIFdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UgKi8KK3N0YXRpYyB2b2lkIFdhaXRWQkwoX1RISVMpCit7CisJdm9sYXRpbGUgVWludDggKnBvcnQgPSAoVWludDggKikobWFwcGVkX2lvICsgUENJT19PRkZTRVQgKyAweDNEQSk7CisKKwl3aGlsZSAoICAoKnBvcnQgJiAweDA4KSApCisJCTsKKwl3aGlsZSAoICEoKnBvcnQgJiAweDA4KSApCisJCTsKK30KK3N0YXRpYyB2b2lkIE5WM1dhaXRJZGxlKF9USElTKQoreworCVJpdmFSb3AgKlJvcCA9IChSaXZhUm9wICopKG1hcHBlZF9pbyArIFJPUF9PRkZTRVQpOworCXdoaWxlICggKFJvcC0+Rmlmb0ZyZWUgPCBGaWZvRW1wdHlDb3VudCkgfHwKKwkgICAgICAgICgqKG1hcHBlZF9pbyArIFBHUkFQSF9PRkZTRVQgKyAweDAwMDAwNkIwKSAmIDB4MDEpICkKKwkJOworfQorc3RhdGljIHZvaWQgTlY0V2FpdElkbGUoX1RISVMpCit7CisJUml2YVJvcCAqUm9wID0gKFJpdmFSb3AgKikobWFwcGVkX2lvICsgUk9QX09GRlNFVCk7CisJd2hpbGUgKCAoUm9wLT5GaWZvRnJlZSA8IEZpZm9FbXB0eUNvdW50KSB8fAorCSAgICAgICAgKCoobWFwcGVkX2lvICsgUEdSQVBIX09GRlNFVCArIDB4MDAwMDA3MDApICYgMHgwMSkgKQorCQk7Cit9CisKKyNpZiAwIC8qIE5vdCB5ZXQgaW1wbGVtZW50ZWQ/ICovCisvKiBTZXRzIHZpZGVvIG1lbSBjb2xvcmtleSBhbmQgYWNjZWxlcmF0ZWQgYmxpdCBmdW5jdGlvbiAqLworc3RhdGljIGludCBTZXRIV0NvbG9yS2V5KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDMyIGtleSkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qIFNldHMgcGVyIHN1cmZhY2UgaGFyZHdhcmUgYWxwaGEgdmFsdWUgKi8KK3N0YXRpYyBpbnQgU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQ4IHZhbHVlKQoreworCXJldHVybigwKTsKK30KKyNlbmRpZiAvKiBOb3QgeWV0IGltcGxlbWVudGVkICovCisKK3N0YXRpYyBpbnQgRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcikKK3sKKwlpbnQgZHN0WCwgZHN0WTsKKwlpbnQgZHN0VywgZHN0SDsKKwlSaXZhQml0bWFwICpCaXRtYXAgPSAoUml2YUJpdG1hcCAqKShtYXBwZWRfaW8gKyBCSVRNQVBfT0ZGU0VUKTsKKworCS8qIERvbid0IGJsaXQgdG8gdGhlIGRpc3BsYXkgc3VyZmFjZSB3aGVuIHN3aXRjaGVkIGF3YXkgKi8KKwlpZiAoIHN3aXRjaGVkX2F3YXkgKSB7CisJCXJldHVybiAtMjsgLyogbm8gaGFyZHdhcmUgYWNjZXNzICovCisJfQorCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKKwkJU0RMX211dGV4UChod19sb2NrKTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIFgvWSBiYXNlIGNvb3JkaW5hdGVzICovCisJZHN0VyA9IHJlY3QtPnc7CisJZHN0SCA9IHJlY3QtPmg7CisJRkJfZHN0X3RvX3h5KHRoaXMsIGRzdCwgJmRzdFgsICZkc3RZKTsKKworCS8qIEFkanVzdCBmb3IgdGhlIGN1cnJlbnQgcmVjdGFuZ2xlICovCisJZHN0WCArPSByZWN0LT54OworCWRzdFkgKz0gcmVjdC0+eTsKKworCVJJVkFfRklGT19GUkVFKEJpdG1hcCwgMSk7CisJQml0bWFwLT5Db2xvcjFBID0gY29sb3I7CisKKwlSSVZBX0ZJRk9fRlJFRShCaXRtYXAsIDIpOworCUJpdG1hcC0+VW5jbGlwcGVkUmVjdGFuZ2xlWzBdLlRvcExlZnQgICAgID0gKGRzdFggPDwgMTYpIHwgZHN0WTsgCisJQml0bWFwLT5VbmNsaXBwZWRSZWN0YW5nbGVbMF0uV2lkdGhIZWlnaHQgPSAoZHN0VyA8PCAxNikgfCBkc3RIOworCisJRkJfQWRkQnVzeVN1cmZhY2UoZHN0KTsKKworCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKKwkJU0RMX211dGV4Vihod19sb2NrKTsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IEhXQWNjZWxCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOworCWludCBzcmNYLCBzcmNZOworCWludCBkc3RYLCBkc3RZOworCWludCBkc3RXLCBkc3RIOworCVJpdmFTY3JlZW5CbHQgKkJsdCA9IChSaXZhU2NyZWVuQmx0ICopKG1hcHBlZF9pbyArIEJMVF9PRkZTRVQpOworCisJLyogRklYTUU6IEZvciBub3csIG9ubHkgYmxpdCB0byBkaXNwbGF5IHN1cmZhY2UgKi8KKwlpZiAoIGRzdC0+cGl0Y2ggIT0gU0RMX1ZpZGVvU3VyZmFjZS0+cGl0Y2ggKSB7CisJCXJldHVybihzcmMtPm1hcC0+c3dfYmxpdChzcmMsIHNyY3JlY3QsIGRzdCwgZHN0cmVjdCkpOworCX0KKworCS8qIERvbid0IGJsaXQgdG8gdGhlIGRpc3BsYXkgc3VyZmFjZSB3aGVuIHN3aXRjaGVkIGF3YXkgKi8KKwlpZiAoIHN3aXRjaGVkX2F3YXkgKSB7CisJCXJldHVybiAtMjsgLyogbm8gaGFyZHdhcmUgYWNjZXNzICovCisJfQorCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKKwkJU0RMX211dGV4UChod19sb2NrKTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBiYXNlIGNvb3JkaW5hdGVzIChpbiBwaXhlbHMpICovCisJZHN0VyA9IGRzdHJlY3QtPnc7CisJZHN0SCA9IGRzdHJlY3QtPmg7CisJRkJfZHN0X3RvX3h5KHRoaXMsIHNyYywgJnNyY1gsICZzcmNZKTsKKwlGQl9kc3RfdG9feHkodGhpcywgZHN0LCAmZHN0WCwgJmRzdFkpOworCisJLyogQWRqdXN0IGZvciB0aGUgY3VycmVudCBibGl0IHJlY3RhbmdsZXMgKi8KKwlzcmNYICs9IHNyY3JlY3QtPng7CisJc3JjWSArPSBzcmNyZWN0LT55OworCWRzdFggKz0gZHN0cmVjdC0+eDsKKwlkc3RZICs9IGRzdHJlY3QtPnk7CisKKwlSSVZBX0ZJRk9fRlJFRShCbHQsIDMpOworCUJsdC0+VG9wTGVmdFNyYyAgPSAoc3JjWSA8PCAxNikgfCBzcmNYOworCUJsdC0+VG9wTGVmdERzdCAgPSAoZHN0WSA8PCAxNikgfCBkc3RYOworCUJsdC0+V2lkdGhIZWlnaHQgPSAoZHN0SCAgPDwgMTYpIHwgZHN0VzsKKworCUZCX0FkZEJ1c3lTdXJmYWNlKHNyYyk7CisJRkJfQWRkQnVzeVN1cmZhY2UoZHN0KTsKKworCWlmICggZHN0ID09IHRoaXMtPnNjcmVlbiApIHsKKwkJU0RMX211dGV4Vihod19sb2NrKTsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IENoZWNrSFdCbGl0KF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KQoreworCWludCBhY2NlbGVyYXRlZDsKKworCS8qIFNldCBpbml0aWFsIGFjY2VsZXJhdGlvbiBvbiAqLworCXNyYy0+ZmxhZ3MgfD0gU0RMX0hXQUNDRUw7CisKKwkvKiBTZXQgdGhlIHN1cmZhY2UgYXR0cmlidXRlcyAqLworCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSApIHsKKwkJaWYgKCAhIHRoaXMtPmluZm8uYmxpdF9od19BICkgeworCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7CisJCX0KKwl9CisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgeworCQlpZiAoICEgdGhpcy0+aW5mby5ibGl0X2h3X0NDICkgeworCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7CisJCX0KKwl9CisKKwkvKiBDaGVjayB0byBzZWUgaWYgZmluYWwgc3VyZmFjZSBibGl0IGlzIGFjY2VsZXJhdGVkICovCisJYWNjZWxlcmF0ZWQgPSAhIShzcmMtPmZsYWdzICYgU0RMX0hXQUNDRUwpOworCWlmICggYWNjZWxlcmF0ZWQgKSB7CisJCXNyYy0+bWFwLT5od19ibGl0ID0gSFdBY2NlbEJsaXQ7CisJfQorCXJldHVybihhY2NlbGVyYXRlZCk7Cit9CisKK3ZvaWQgRkJfUml2YUFjY2VsKF9USElTLCBfX3UzMiBjYXJkKQoreworCVJpdmFSb3AgKlJvcCA9IChSaXZhUm9wICopKG1hcHBlZF9pbyArIFJPUF9PRkZTRVQpOworCisJLyogV2UgaGF2ZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCBzdXJmYWNlIGZ1bmN0aW9ucyAqLworCXRoaXMtPkNoZWNrSFdCbGl0ID0gQ2hlY2tIV0JsaXQ7CisJd2FpdF92YmwgPSBXYWl0VkJMOworCXN3aXRjaCAoY2FyZCkgeworCSAgICBjYXNlIEZCX0FDQ0VMX05WMzoKKwkJd2FpdF9pZGxlID0gTlYzV2FpdElkbGU7CisJCWJyZWFrOworCSAgICBjYXNlIEZCX0FDQ0VMX05WNDoKKwkJd2FpdF9pZGxlID0gTlY0V2FpdElkbGU7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQkvKiBIbW0uLi4gRklYTUUgKi8KKwkJYnJlYWs7CisJfQorCUZpZm9FbXB0eUNvdW50ID0gUm9wLT5GaWZvRnJlZTsKKworCS8qIFRoZSBSaXZhIGhhcyBhbiBhY2NlbGVyYXRlZCBjb2xvciBmaWxsICovCisJdGhpcy0+aW5mby5ibGl0X2ZpbGwgPSAxOworCXRoaXMtPkZpbGxIV1JlY3QgPSBGaWxsSFdSZWN0OworCisJLyogVGhlIFJpdmEgaGFzIGFjY2VsZXJhdGVkIG5vcm1hbCBhbmQgY29sb3JrZXkgYmxpdHMuICovCisJdGhpcy0+aW5mby5ibGl0X2h3ID0gMTsKKyNpZiAwIC8qIE5vdCB5ZXQgaW1wbGVtZW50ZWQ/ICovCisJdGhpcy0+aW5mby5ibGl0X2h3X0NDID0gMTsKKwl0aGlzLT5TZXRIV0NvbG9yS2V5ID0gU2V0SFdDb2xvcktleTsKKyNlbmRpZgorCisjaWYgMCAvKiBOb3QgeWV0IGltcGxlbWVudGVkPyAqLworCS8qIFRoZSBSaXZhIGhhcyBhbiBhY2NlbGVyYXRlZCBhbHBoYSBibGl0ICovCisJdGhpcy0+aW5mby5ibGl0X2h3X0EgPSAxOworCXRoaXMtPlNldEhXQWxwaGEgPSBTZXRIV0FscGhhOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYnJpdmEuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2Zicml2YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODY4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYnJpdmEuaApAQCAtMCwwICsxLDM2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogUml2YSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZm9yIHRoZSBTREwgZnJhbWVidWZmZXIgY29uc29sZSBkcml2ZXIgKi8KKworI2luY2x1ZGUgIlNETF9mYnZpZGVvLmgiCisKKyNpZm5kZWYgRkJfQUNDRUxfTlYzCisjZGVmaW5lIEZCX0FDQ0VMX05WMwkyNworI2VuZGlmCisjaWZuZGVmIEZCX0FDQ0VMX05WNAorI2RlZmluZSBGQl9BQ0NFTF9OVjQJMjgKKyNlbmRpZgorCisvKiBTZXQgdXAgdGhlIGRyaXZlciBmb3IgUml2YSBhY2NlbGVyYXRpb24gKi8KK2V4dGVybiB2b2lkIEZCX1JpdmFBY2NlbChfVEhJUywgX191MzIgY2FyZCk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYnZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL1NETF9mYnZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1ODgwOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZidmlkZW8uYwpAQCAtMCwwICsxLDE5ODIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBGcmFtZWJ1ZmZlciBjb25zb2xlIGJhc2VkIFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb24uCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkvKiBGb3IgZGVmaW5pdGlvbiBvZiBQQUdFX1NJWkUgKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvdnQuaD4KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfZmJ2aWRlby5oIgorI2luY2x1ZGUgIlNETF9mYm1vdXNlX2MuaCIKKyNpbmNsdWRlICJTRExfZmJldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9mYjNkZnguaCIKKyNpbmNsdWRlICJTRExfZmJtYXRyb3guaCIKKyNpbmNsdWRlICJTRExfZmJyaXZhLmgiCisKKy8qI2RlZmluZSBGQkNPTl9ERUJVRyovCisKKyNpZiBkZWZpbmVkKGkzODYpICYmIGRlZmluZWQoRkJfVFlQRV9WR0FfUExBTkVTKQorI2RlZmluZSBWR0ExNl9GQkNPTl9TVVBQT1JUCisjaW5jbHVkZSA8c3lzL2lvLmg+CQkvKiBGb3IgaW9wZXJtKCkgKi8KKyNpZm5kZWYgRkJfQVVYX1ZHQV9QTEFORVNfVkdBNAorI2RlZmluZSBGQl9BVVhfVkdBX1BMQU5FU19WR0E0CTAKKyNlbmRpZgorLyoKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRiICh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dGIgJWIwLCV3MSI6OiJhIiAodmFsdWUpLCAiTmQiIChwb3J0KSk7Cit9IAorKi8KKyNlbmRpZiAvKiBGQl9UWVBFX1ZHQV9QTEFORVMgKi8KKworLyogQSBsaXN0IG9mIHZpZGVvIHJlc29sdXRpb25zIHRoYXQgd2UgcXVlcnkgZm9yIChzb3J0ZWQgbGFyZ2VzdCB0byBzbWFsbGVzdCkgKi8KK3N0YXRpYyBjb25zdCBTRExfUmVjdCBjaGVja3Jlc1tdID0geworCXsgIDAsIDAsIDE2MDAsIDEyMDAgfSwJCS8qIDE2IGJwcDogMHgxMUUsIG9yIDI4NiAqLworCXsgIDAsIDAsIDE0MDgsIDEwNTYgfSwJCS8qIDE2IGJwcDogMHgxOUEsIG9yIDQxMCAqLworCXsgIDAsIDAsIDEyODAsIDEwMjQgfSwJCS8qIDE2IGJwcDogMHgxMUEsIG9yIDI4MiAqLworCXsgIDAsIDAsIDExNTIsICA4NjQgfSwJCS8qIDE2IGJwcDogMHgxOTIsIG9yIDQwMiAqLworCXsgIDAsIDAsIDEwMjQsICA3NjggfSwJCS8qIDE2IGJwcDogMHgxMTcsIG9yIDI3OSAqLworCXsgIDAsIDAsICA5NjAsICA3MjAgfSwJCS8qIDE2IGJwcDogMHgxOEEsIG9yIDM5NCAqLworCXsgIDAsIDAsICA4MDAsICA2MDAgfSwJCS8qIDE2IGJwcDogMHgxMTQsIG9yIDI3NiAqLworCXsgIDAsIDAsICA3NjgsICA1NzYgfSwJCS8qIDE2IGJwcDogMHgxODIsIG9yIDM4NiAqLworCXsgIDAsIDAsICA3MjAsICA1NzYgfSwJCS8qIFBBTCAqLworCXsgIDAsIDAsICA3MjAsICA0ODAgfSwJCS8qIE5UU0MgKi8KKwl7ICAwLCAwLCAgNjQwLCAgNDgwIH0sCQkvKiAxNiBicHA6IDB4MTExLCBvciAyNzMgKi8KKwl7ICAwLCAwLCAgNjQwLCAgNDAwIH0sCQkvKiAgOCBicHA6IDB4MTAwLCBvciAyNTYgKi8KKwl7ICAwLCAwLCAgNTEyLCAgMzg0IH0sCisJeyAgMCwgMCwgIDMyMCwgIDI0MCB9LAorCXsgIDAsIDAsICAzMjAsICAyMDAgfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCB4cmVzOworCWludCB5cmVzOworCWludCBwaXhjbG9jazsKKwlpbnQgbGVmdDsKKwlpbnQgcmlnaHQ7CisJaW50IHVwcGVyOworCWludCBsb3dlcjsKKwlpbnQgaHNsZW47CisJaW50IHZzbGVuOworCWludCBzeW5jOworCWludCB2bW9kZTsKK30gdmVzYV90aW1pbmdzW10gPSB7CisjaWZkZWYgVVNFX1ZFU0FfVElNSU5HUwkvKiBPbmx5IHRlc3RlZCBvbiBNYXRyb3ggTWlsbGVuaXVtIEkgKi8KKwl7ICA2NDAsICA0MDAsIDM5NzcxLCAgNDgsIDE2LCAzOSwgIDgsICA5NiwgMiwgMiwgMCB9LAkvKiA3MCBIeiAqLworCXsgIDY0MCwgIDQ4MCwgMzk2ODMsICA0OCwgMTYsIDMzLCAxMCwgIDk2LCAyLCAwLCAwIH0sCS8qIDYwIEh6ICovCisJeyAgNzY4LCAgNTc2LCAyNjEwMSwgMTQ0LCAxNiwgMjgsICA2LCAxMTIsIDQsIDAsIDAgfSwJLyogNjAgSHogKi8KKwl7ICA4MDAsICA2MDAsIDI0MDM4LCAxNDQsIDI0LCAyOCwgIDgsIDExMiwgNiwgMCwgMCB9LAkvKiA2MCBIeiAqLworCXsgIDk2MCwgIDcyMCwgMTc2ODYsIDE0NCwgMjQsIDI4LCAgOCwgMTEyLCA0LCAwLCAwIH0sCS8qIDYwIEh6ICovCisJeyAxMDI0LCAgNzY4LCAxNTM4NiwgMTYwLCAzMiwgMzAsICA0LCAxMjgsIDQsIDAsIDAgfSwJLyogNjAgSHogKi8KKwl7IDExNTIsICA4NjQsIDEyMjg2LCAxOTIsIDMyLCAzMCwgIDQsIDEyOCwgNCwgMCwgMCB9LAkvKiA2MCBIeiAqLworCXsgMTI4MCwgMTAyNCwgIDkzNjksIDIyNCwgMzIsIDMyLCAgNCwgMTM2LCA0LCAwLCAwIH0sCS8qIDYwIEh6ICovCisJeyAxNDA4LCAxMDU2LCAgODIxNCwgMjU2LCA0MCwgMzIsICA1LCAxNDQsIDUsIDAsIDAgfSwJLyogNjAgSHogKi8KKwl7IDE2MDAsIDEyMDAsLyo/Ki8wLCAyNzIsIDQ4LCAzMiwgIDUsIDE1MiwgNSwgMCwgMCB9LAkvKiA2MCBIeiAqLworI2Vsc2UKKwkvKiBZb3UgY2FuIGdlbmVyYXRlIHRoZXNlIHRpbWluZ3MgZnJvbSB5b3VyIFhGODZDb25maWcgZmlsZSB1c2luZworCSAgIHRoZSAnbW9kZWxpbmUyZmInIHBlcmwgc2NyaXB0IGluY2x1ZGVkIHdpdGggdGhlIGZic2V0IHBhY2thZ2UuCisJICAgVGhlc2UgdGltaW5ncyB3ZXJlIGdlbmVyYXRlZCBmb3IgTWF0cm94IE1pbGxlbml1bSBJLCAxNSIgbW9uaXRvci4KKwkqLworCXsgIDMyMCwgIDIwMCwgNzk0NDAsICAxNiwgMTYsIDIwLCAgNCwgIDQ4LCAxLCAwLCAyIH0sCS8qIDcwIEh6ICovCisJeyAgMzIwLCAgMjQwLCA2MzQ5MiwgIDE2LCAxNiwgMTYsICA0LCAgNDgsIDIsIDAsIDIgfSwJLyogNzIgSHogKi8KKwl7ICA1MTIsICAzODQsIDQ5NjAzLCAgNDgsIDE2LCAxNiwgIDEsICA2NCwgMywgMCwgMCB9LAkvKiA3OCBIeiAqLworCXsgIDY0MCwgIDQwMCwgMzE3NDYsICA5NiwgMzIsIDQxLCAgMSwgIDY0LCAzLCAyLCAwIH0sCS8qIDg1IEh6ICovCisJeyAgNjQwLCAgNDgwLCAzMTc0NiwgMTIwLCAxNiwgMTYsICAxLCAgNjQsIDMsIDAsIDAgfSwJLyogNzUgSHogKi8KKwl7ICA3NjgsICA1NzYsIDI2MTAxLCAxNDQsIDE2LCAyOCwgIDYsIDExMiwgNCwgMCwgMCB9LAkvKiA2MCBIeiAqLworCXsgIDgwMCwgIDYwMCwgMjAwMDAsICA2NCwgNTYsIDIzLCAzNywgMTIwLCA2LCAzLCAwIH0sCS8qIDcyIEh6ICovCisJeyAgOTYwLCAgNzIwLCAxNzY4NiwgMTQ0LCAyNCwgMjgsICA4LCAxMTIsIDQsIDAsIDAgfSwJLyogNjAgSHogKi8KKwl7IDEwMjQsICA3NjgsIDEzMzMzLCAxNDQsIDI0LCAyOSwgIDMsIDEzNiwgNiwgMCwgMCB9LAkvKiA3MCBIeiAqLworCXsgMTE1MiwgIDg2NCwgMTIyODYsIDE5MiwgMzIsIDMwLCAgNCwgMTI4LCA0LCAwLCAwIH0sCS8qIDYwIEh6ICovCisJeyAxMjgwLCAxMDI0LCAgOTM2OSwgMjI0LCAzMiwgMzIsICA0LCAxMzYsIDQsIDAsIDAgfSwJLyogNjAgSHogKi8KKwl7IDE0MDgsIDEwNTYsICA4MjE0LCAyNTYsIDQwLCAzMiwgIDUsIDE0NCwgNSwgMCwgMCB9LAkvKiA2MCBIeiAqLworCXsgMTYwMCwgMTIwMCwvKj8qLzAsIDI3MiwgNDgsIDMyLCAgNSwgMTUyLCA1LCAwLCAwIH0sCS8qIDYwIEh6ICovCisjZW5kaWYKK307CitlbnVtIHsKKwlGQkNPTl9ST1RBVEVfTk9ORSA9IDAsCisJRkJDT05fUk9UQVRFX0NDVyA9IDkwLAorCUZCQ09OX1JPVEFURV9VRCA9IDE4MCwKKwlGQkNPTl9ST1RBVEVfQ1cgPSAyNzAKK307CisKKyNkZWZpbmUgbWluKGEsYikgKChhKTwoYik/KGEpOihiKSkKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IEZCX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKkZCX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgU0RMX1N1cmZhY2UgKkZCX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKKyNpZmRlZiBWR0ExNl9GQkNPTl9TVVBQT1JUCitzdGF0aWMgU0RMX1N1cmZhY2UgKkZCX1NldFZHQTE2TW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKKyNlbmRpZgorc3RhdGljIGludCBGQl9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpOworc3RhdGljIHZvaWQgRkJfVmlkZW9RdWl0KF9USElTKTsKKworLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgRkJfSW5pdEhXU3VyZmFjZXMoX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4sIGNoYXIgKmJhc2UsIGludCBzaXplKTsKK3N0YXRpYyB2b2lkIEZCX0ZyZWVIV1N1cmZhY2VzKF9USElTKTsKK3N0YXRpYyBpbnQgRkJfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgRkJfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgRkJfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBGQl9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBGQl9XYWl0VkJMKF9USElTKTsKK3N0YXRpYyB2b2lkIEZCX1dhaXRJZGxlKF9USElTKTsKK3N0YXRpYyBpbnQgRkJfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKiBJbnRlcm5hbCBwYWxldHRlIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgRkJfU2F2ZVBhbGV0dGUoX1RISVMsIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2aW5mbyk7CitzdGF0aWMgdm9pZCBGQl9SZXN0b3JlUGFsZXR0ZShfVEhJUyk7CisKKy8qIFNoYWRvdyBidWZmZXIgZnVuY3Rpb25zICovCitzdGF0aWMgRkJfYml0QmxpdCBGQl9ibGl0MTY7CitzdGF0aWMgRkJfYml0QmxpdCBGQl9ibGl0MTZibG9ja2VkOworCitzdGF0aWMgaW50IFNETF9nZXRwYWdlc2l6ZSh2b2lkKQoreworI2lmZGVmIEhBVkVfR0VUUEFHRVNJWkUKKwlyZXR1cm4gZ2V0cGFnZXNpemUoKTsKKyNlbGlmIGRlZmluZWQoUEFHRV9TSVpFKQorCXJldHVybiBQQUdFX1NJWkU7CisjZWxzZQorI2Vycm9yIENhbiBub3QgZGV0ZXJtaW5lIHN5c3RlbSBwYWdlIHNpemUuCisJcmV0dXJuIDQwOTY7ICAvKiB0aGlzIGlzIHdoYXQgaXQgVVNFRCB0byBiZSBpbiBMaW51eC4uLiAqLworI2VuZGlmCit9CisKKworLyogU21hbGwgd3JhcHBlciBmb3IgbW1hcCgpIHNvIHdlIGNhbiBwbGF5IG5pY2VseSB3aXRoIG5vLW1tdSBob3N0cworICogKG5vbi1tbXUgaG9zdHMgZGlzYWxsb3cgdGhlIE1BUF9TSEFSRUQgZmxhZykgKi8KKworc3RhdGljIHZvaWQgKmRvX21tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgsIGludCBwcm90LCBpbnQgZmxhZ3MsIGludCBmZCwgb2ZmX3Qgb2Zmc2V0KQoreworCXZvaWQgKnJldDsKKwlyZXQgPSBtbWFwKHN0YXJ0LCBsZW5ndGgsIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0KTsKKwlpZiAoIHJldCA9PSAoY2hhciAqKS0xICYmIChmbGFncyAmIE1BUF9TSEFSRUQpICkgeworCQlyZXQgPSBtbWFwKHN0YXJ0LCBsZW5ndGgsIHByb3QsCisJCSAgICAgICAgICAgKGZsYWdzICYgfk1BUF9TSEFSRUQpIHwgTUFQX1BSSVZBVEUsIGZkLCBvZmZzZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBGQiBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IEZCX0F2YWlsYWJsZSh2b2lkKQoreworCWludCBjb25zb2xlID0gLTE7CisJLyogQWRkZWQgY2hlY2sgZm9yIC9mYi8wIChkZXZmcykgKi8KKwkvKiBidXQgLSB1c2UgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlyc3QuLi4gaWYgaXQgZmFpbHMsIHN0aWxsIGNoZWNrIGRlZmF1bHRzICovCisJaW50IGlkeCA9IDA7CisJY29uc3QgY2hhciAqU0RMX2ZiZGV2c1s0XSA9IHsgTlVMTCwgIi9kZXYvZmIwIiwgIi9kZXYvZmIvMCIsIE5VTEwgfTsKKworCVNETF9mYmRldnNbMF0gPSBTRExfZ2V0ZW52KCJTRExfRkJERVYiKTsKKwlpZiggIVNETF9mYmRldnNbMF0gKQorCQlpZHgrKzsKKwlmb3IoIDsgU0RMX2ZiZGV2c1tpZHhdOyBpZHgrKyApCisJeworCQljb25zb2xlID0gb3BlbihTRExfZmJkZXZzW2lkeF0sIE9fUkRXUiwgMCk7CisJCWlmICggY29uc29sZSA+PSAwICkgeworCQkJY2xvc2UoY29uc29sZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4oY29uc29sZSA+PSAwKTsKK30KKworc3RhdGljIHZvaWQgRkJfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKwlTRExfZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpGQl9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9WaWRlb0RldmljZSAqdGhpczsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJdGhpcyA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKwlpZiAoIHRoaXMgKSB7CisJCVNETF9tZW1zZXQodGhpcywgMCwgKHNpemVvZiAqdGhpcykpOworCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCisJCQkJU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAodGhpcyA9PSBOVUxMKSB8fCAodGhpcy0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCB0aGlzICkgeworCQkJU0RMX2ZyZWUodGhpcyk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJd2FpdF92YmwgPSBGQl9XYWl0VkJMOworCXdhaXRfaWRsZSA9IEZCX1dhaXRJZGxlOworCW1vdXNlX2ZkID0gLTE7CisJa2V5Ym9hcmRfZmQgPSAtMTsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwl0aGlzLT5WaWRlb0luaXQgPSBGQl9WaWRlb0luaXQ7CisJdGhpcy0+TGlzdE1vZGVzID0gRkJfTGlzdE1vZGVzOworCXRoaXMtPlNldFZpZGVvTW9kZSA9IEZCX1NldFZpZGVvTW9kZTsKKwl0aGlzLT5TZXRDb2xvcnMgPSBGQl9TZXRDb2xvcnM7CisJdGhpcy0+VXBkYXRlUmVjdHMgPSBOVUxMOworCXRoaXMtPlZpZGVvUXVpdCA9IEZCX1ZpZGVvUXVpdDsKKwl0aGlzLT5BbGxvY0hXU3VyZmFjZSA9IEZCX0FsbG9jSFdTdXJmYWNlOworCXRoaXMtPkNoZWNrSFdCbGl0ID0gTlVMTDsKKwl0aGlzLT5GaWxsSFdSZWN0ID0gTlVMTDsKKwl0aGlzLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwl0aGlzLT5TZXRIV0FscGhhID0gTlVMTDsKKwl0aGlzLT5Mb2NrSFdTdXJmYWNlID0gRkJfTG9ja0hXU3VyZmFjZTsKKwl0aGlzLT5VbmxvY2tIV1N1cmZhY2UgPSBGQl9VbmxvY2tIV1N1cmZhY2U7CisJdGhpcy0+RmxpcEhXU3VyZmFjZSA9IEZCX0ZsaXBIV1N1cmZhY2U7CisJdGhpcy0+RnJlZUhXU3VyZmFjZSA9IEZCX0ZyZWVIV1N1cmZhY2U7CisJdGhpcy0+U2V0Q2FwdGlvbiA9IE5VTEw7CisJdGhpcy0+U2V0SWNvbiA9IE5VTEw7CisJdGhpcy0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7CisJdGhpcy0+R3JhYklucHV0ID0gTlVMTDsKKwl0aGlzLT5HZXRXTUluZm8gPSBOVUxMOworCXRoaXMtPkluaXRPU0tleW1hcCA9IEZCX0luaXRPU0tleW1hcDsKKwl0aGlzLT5QdW1wRXZlbnRzID0gRkJfUHVtcEV2ZW50czsKKworCXRoaXMtPmZyZWUgPSBGQl9EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gdGhpczsKK30KKworVmlkZW9Cb290U3RyYXAgRkJDT05fYm9vdHN0cmFwID0geworCSJmYmNvbiIsICJMaW51eCBGcmFtZWJ1ZmZlciBDb25zb2xlIiwKKwlGQl9BdmFpbGFibGUsIEZCX0NyZWF0ZURldmljZQorfTsKKworI2RlZmluZSBGQl9NT0RFU19EQgkiL2V0Yy9mYi5tb2RlcyIKKworc3RhdGljIGludCByZWFkX2ZibW9kZXNfbGluZShGSUxFKmYsIGNoYXIqIGxpbmUsIGludCBsZW5ndGgpCit7CisJaW50IGJsYW5rOworCWNoYXIqIGM7CisJaW50IGk7CisJCisJYmxhbms9MDsKKwkvKiBmaW5kIGEgcmVsZXZhbnQgbGluZSAqLworCWRvCisJeworCQlpZiAoIWZnZXRzKGxpbmUsbGVuZ3RoLGYpKQorCQkJcmV0dXJuIDA7CisJCWM9bGluZTsKKwkJd2hpbGUoKCgqYz09J1x0Jyl8fCgqYz09JyAnKSkmJigqYyE9MCkpCisJCQljKys7CisJCQorCQlpZiAoKCpjPT0nXG4nKXx8KCpjPT0nIycpfHwoKmM9PTApKQorCQkJYmxhbms9MTsKKwkJZWxzZQorCQkJYmxhbms9MDsKKwl9CisJd2hpbGUoYmxhbmspOworCS8qIHJlbW92ZSB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgc3RyaW5nICovCisJaT0wOworCWRvCisJeworCQlsaW5lW2ldPWNbaV07CisJCWkrKzsKKwl9CisJd2hpbGUoY1tpXSE9MCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9mYm1vZGVzX21vZGUoRklMRSAqZiwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2aW5mbykKK3sKKwljaGFyIGxpbmVbMTAyNF07CisJY2hhciBvcHRpb25bMjU2XTsKKworCS8qIEZpbmQgYSAiZ2VvbWV0cnkiICovCisJZG8geworCQlpZiAocmVhZF9mYm1vZGVzX2xpbmUoZiwgbGluZSwgc2l6ZW9mKGxpbmUpKT09MCkKKwkJCXJldHVybiAwOworCQlpZiAoU0RMX3N0cm5jbXAobGluZSwiZ2VvbWV0cnkiLDgpPT0wKQorCQkJYnJlYWs7CisJfQorCXdoaWxlKDEpOworCisJU0RMX3NzY2FuZihsaW5lLCAiZ2VvbWV0cnkgJWQgJWQgJWQgJWQgJWQiLCAmdmluZm8tPnhyZXMsICZ2aW5mby0+eXJlcywgCisJCQkmdmluZm8tPnhyZXNfdmlydHVhbCwgJnZpbmZvLT55cmVzX3ZpcnR1YWwsICZ2aW5mby0+Yml0c19wZXJfcGl4ZWwpOworCWlmIChyZWFkX2ZibW9kZXNfbGluZShmLCBsaW5lLCBzaXplb2YobGluZSkpPT0wKQorCQlyZXR1cm4gMDsKKwkJCQorCVNETF9zc2NhbmYobGluZSwgInRpbWluZ3MgJWQgJWQgJWQgJWQgJWQgJWQgJWQiLCAmdmluZm8tPnBpeGNsb2NrLCAKKwkJCSZ2aW5mby0+bGVmdF9tYXJnaW4sICZ2aW5mby0+cmlnaHRfbWFyZ2luLCAmdmluZm8tPnVwcGVyX21hcmdpbiwgCisJCQkmdmluZm8tPmxvd2VyX21hcmdpbiwgJnZpbmZvLT5oc3luY19sZW4sICZ2aW5mby0+dnN5bmNfbGVuKTsKKwkJCisJdmluZm8tPnN5bmM9MDsKKwl2aW5mby0+dm1vZGU9RkJfVk1PREVfTk9OSU5URVJMQUNFRDsKKwkJCQkKKwkvKiBQYXJzZSBtaXNjIG9wdGlvbnMgKi8KKwlkbyB7CisJCWlmIChyZWFkX2ZibW9kZXNfbGluZShmLCBsaW5lLCBzaXplb2YobGluZSkpPT0wKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKFNETF9zdHJuY21wKGxpbmUsImhzeW5jIiw1KT09MCkgeworCQkJU0RMX3NzY2FuZihsaW5lLCJoc3luYyAlcyIsb3B0aW9uKTsKKwkJCWlmIChTRExfc3RybmNtcChvcHRpb24sImhpZ2giLDQpPT0wKQorCQkJCXZpbmZvLT5zeW5jIHw9IEZCX1NZTkNfSE9SX0hJR0hfQUNUOworCQl9CisJCWVsc2UgaWYgKFNETF9zdHJuY21wKGxpbmUsInZzeW5jIiw1KT09MCkgeworCQkJU0RMX3NzY2FuZihsaW5lLCJ2c3luYyAlcyIsb3B0aW9uKTsKKwkJCWlmIChTRExfc3RybmNtcChvcHRpb24sImhpZ2giLDQpPT0wKQorCQkJCXZpbmZvLT5zeW5jIHw9IEZCX1NZTkNfVkVSVF9ISUdIX0FDVDsKKwkJfQorCQllbHNlIGlmIChTRExfc3RybmNtcChsaW5lLCJjc3luYyIsNSk9PTApIHsKKwkJCVNETF9zc2NhbmYobGluZSwiY3N5bmMgJXMiLG9wdGlvbik7CisJCQlpZiAoU0RMX3N0cm5jbXAob3B0aW9uLCJoaWdoIiw0KT09MCkKKwkJCQl2aW5mby0+c3luYyB8PSBGQl9TWU5DX0NPTVBfSElHSF9BQ1Q7CisJCX0KKwkJZWxzZSBpZiAoU0RMX3N0cm5jbXAobGluZSwiZXh0c3luYyIsNSk9PTApIHsKKwkJCVNETF9zc2NhbmYobGluZSwiZXh0c3luYyAlcyIsb3B0aW9uKTsKKwkJCWlmIChTRExfc3RybmNtcChvcHRpb24sInRydWUiLDQpPT0wKQorCQkJCXZpbmZvLT5zeW5jIHw9IEZCX1NZTkNfRVhUOworCQl9CisJCWVsc2UgaWYgKFNETF9zdHJuY21wKGxpbmUsImxhY2VkIiw1KT09MCkgeworCQkJU0RMX3NzY2FuZihsaW5lLCJsYWNlZCAlcyIsb3B0aW9uKTsKKwkJCWlmIChTRExfc3RybmNtcChvcHRpb24sInRydWUiLDQpPT0wKQorCQkJCXZpbmZvLT52bW9kZSB8PSBGQl9WTU9ERV9JTlRFUkxBQ0VEOworCQl9CisJCWVsc2UgaWYgKFNETF9zdHJuY21wKGxpbmUsImRvdWJsZSIsNik9PTApIHsKKwkJCVNETF9zc2NhbmYobGluZSwiZG91YmxlICVzIixvcHRpb24pOworCQkJaWYgKFNETF9zdHJuY21wKG9wdGlvbiwidHJ1ZSIsNCk9PTApCisJCQkJdmluZm8tPnZtb2RlIHw9IEZCX1ZNT0RFX0RPVUJMRTsKKwkJfQorCX0KKwl3aGlsZShTRExfc3RybmNtcChsaW5lLCJlbmRtb2RlIiw3KSE9MCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBGQl9DaGVja01vZGUoX1RISVMsIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCAqdywgdW5zaWduZWQgaW50ICpoKQoreworCWludCBtb2RlX29rYXk7CisKKwltb2RlX29rYXkgPSAwOworCXZpbmZvLT5iaXRzX3Blcl9waXhlbCA9IChpbmRleCsxKSo4OworCXZpbmZvLT54cmVzID0gKnc7CisJdmluZm8tPnhyZXNfdmlydHVhbCA9ICp3OworCXZpbmZvLT55cmVzID0gKmg7CisJdmluZm8tPnlyZXNfdmlydHVhbCA9ICpoOworCXZpbmZvLT5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX1RFU1Q7CisJaWYgKCBpb2N0bChjb25zb2xlX2ZkLCBGQklPUFVUX1ZTQ1JFRU5JTkZPLCB2aW5mbykgPT0gMCApIHsKKyNpZmRlZiBGQkNPTl9ERUJVRworCQlmcHJpbnRmKHN0ZGVyciwgIkNoZWNrZWQgbW9kZSAlZHglZCBhdCAlZCBicHAsIGdvdCBtb2RlICVkeCVkIGF0ICVkIGJwcFxuIiwgKncsICpoLCAoaW5kZXgrMSkqOCwgdmluZm8tPnhyZXMsIHZpbmZvLT55cmVzLCB2aW5mby0+Yml0c19wZXJfcGl4ZWwpOworI2VuZGlmCisJCWlmICggKCgodmluZm8tPmJpdHNfcGVyX3BpeGVsKzcpLzgpLTEpID09IGluZGV4ICkgeworCQkJKncgPSB2aW5mby0+eHJlczsKKwkJCSpoID0gdmluZm8tPnlyZXM7CisJCQltb2RlX29rYXkgPSAxOworCQl9CisJfQorCXJldHVybiBtb2RlX29rYXk7Cit9CisKK3N0YXRpYyBpbnQgRkJfQWRkTW9kZShfVEhJUywgaW50IGluZGV4LCB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgsIGludCBjaGVja190aW1pbmdzKQoreworCVNETF9SZWN0ICptb2RlOworCWludCBpOworCWludCBuZXh0X21vZGU7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbW9kZSAqLworCWlmICggU0RMX251bW1vZGVzW2luZGV4XSA+IDAgKSB7CisJCW1vZGUgPSBTRExfbW9kZWxpc3RbaW5kZXhdW1NETF9udW1tb2Rlc1tpbmRleF0tMV07CisJCWlmICggKG1vZGUtPncgPT0gdykgJiYgKG1vZGUtPmggPT0gaCkgKSB7CisjaWZkZWYgRkJDT05fREVCVUcKKwkJCWZwcmludGYoc3RkZXJyLCAiV2UgYWxyZWFkeSBoYXZlIG1vZGUgJWR4JWQgYXQgJWQgYnl0ZXMgcGVyIHBpeGVsXG4iLCB3LCBoLCBpbmRleCsxKTsKKyNlbmRpZgorCQkJcmV0dXJuKDApOworCQl9CisJfQorCisJLyogT25seSBhbGxvdyBhIG1vZGUgaWYgd2UgaGF2ZSBhIHZhbGlkIHRpbWluZyBmb3IgaXQgKi8KKwlpZiAoIGNoZWNrX3RpbWluZ3MgKSB7CisJCWludCBmb3VuZF90aW1pbmcgPSAwOworCQlmb3IgKCBpPTA7IGk8KHNpemVvZih2ZXNhX3RpbWluZ3MpL3NpemVvZih2ZXNhX3RpbWluZ3NbMF0pKTsgKytpICkgeworCQkJaWYgKCAodyA9PSB2ZXNhX3RpbWluZ3NbaV0ueHJlcykgJiYKKwkJCSAgICAgKGggPT0gdmVzYV90aW1pbmdzW2ldLnlyZXMpICYmIHZlc2FfdGltaW5nc1tpXS5waXhjbG9jayApIHsKKwkJCQlmb3VuZF90aW1pbmcgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICggIWZvdW5kX3RpbWluZyApIHsKKyNpZmRlZiBGQkNPTl9ERUJVRworCQkJZnByaW50ZihzdGRlcnIsICJObyB2YWxpZCB0aW1pbmcgbGluZSBmb3IgbW9kZSAlZHglZFxuIiwgdywgaCk7CisjZW5kaWYKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKworCS8qIFNldCB1cCB0aGUgbmV3IHZpZGVvIG1vZGUgcmVjdGFuZ2xlICovCisJbW9kZSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mICptb2RlKTsKKwlpZiAoIG1vZGUgPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybigtMSk7CisJfQorCW1vZGUtPnggPSAwOworCW1vZGUtPnkgPSAwOworCW1vZGUtPncgPSB3OworCW1vZGUtPmggPSBoOworI2lmZGVmIEZCQ09OX0RFQlVHCisJZnByaW50ZihzdGRlcnIsICJBZGRpbmcgbW9kZSAlZHglZCBhdCAlZCBieXRlcyBwZXIgcGl4ZWxcbiIsIHcsIGgsIGluZGV4KzEpOworI2VuZGlmCisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IGxpc3Qgb2YgbW9kZXMsIGFuZCBmaWxsIGluIHRoZSBuZXcgbW9kZSAqLworCW5leHRfbW9kZSA9IFNETF9udW1tb2Rlc1tpbmRleF07CisJU0RMX21vZGVsaXN0W2luZGV4XSA9IChTRExfUmVjdCAqKikKKwkgICAgICAgU0RMX3JlYWxsb2MoU0RMX21vZGVsaXN0W2luZGV4XSwgKDErbmV4dF9tb2RlKzEpKnNpemVvZihTRExfUmVjdCAqKSk7CisJaWYgKCBTRExfbW9kZWxpc3RbaW5kZXhdID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlTRExfbnVtbW9kZXNbaW5kZXhdID0gMDsKKwkJU0RMX2ZyZWUobW9kZSk7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlXSA9IG1vZGU7CisJU0RMX21vZGVsaXN0W2luZGV4XVtuZXh0X21vZGUrMV0gPSBOVUxMOworCVNETF9udW1tb2Rlc1tpbmRleF0rKzsKKworCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBjbXBtb2Rlcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCit7CisgICAgY29uc3QgU0RMX1JlY3QgKmEgPSAqKGNvbnN0IFNETF9SZWN0KiopdmE7CisgICAgY29uc3QgU0RMX1JlY3QgKmIgPSAqKGNvbnN0IFNETF9SZWN0KiopdmI7CisgICAgaWYgKCBhLT5oID09IGItPmggKQorICAgICAgICByZXR1cm4gYi0+dyAtIGEtPnc7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYi0+aCAtIGEtPmg7Cit9CisKK3N0YXRpYyB2b2lkIEZCX1NvcnRNb2RlcyhfVEhJUykKK3sKKwlpbnQgaTsKKwlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgeworCQlpZiAoIFNETF9udW1tb2Rlc1tpXSA+IDAgKSB7CisJCQlTRExfcXNvcnQoU0RMX21vZGVsaXN0W2ldLCBTRExfbnVtbW9kZXNbaV0sIHNpemVvZiAqU0RMX21vZGVsaXN0W2ldLCBjbXBtb2Rlcyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgRkJfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisJY29uc3QgaW50IHBhZ2VzaXplID0gU0RMX2dldHBhZ2VzaXplKCk7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpbmZvOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2aW5mbzsKKwlpbnQgaSwgajsKKwlpbnQgY3VycmVudF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgY3VycmVudF93OworCXVuc2lnbmVkIGludCBjdXJyZW50X2g7CisJY29uc3QgY2hhciAqU0RMX2ZiZGV2OworCWNvbnN0IGNoYXIgKnJvdGF0aW9uOworCUZJTEUgKm1vZGVzZGI7CisKKwkvKiBJbml0aWFsaXplIHRoZSBsaWJyYXJ5ICovCisJU0RMX2ZiZGV2ID0gU0RMX2dldGVudigiU0RMX0ZCREVWIik7CisJaWYgKCBTRExfZmJkZXYgPT0gTlVMTCApIHsKKwkJU0RMX2ZiZGV2ID0gIi9kZXYvZmIwIjsKKwl9CisJY29uc29sZV9mZCA9IG9wZW4oU0RMX2ZiZGV2LCBPX1JEV1IsIDApOworCWlmICggY29uc29sZV9mZCA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gJXMiLCBTRExfZmJkZXYpOworCQlyZXR1cm4oLTEpOworCX0KKworI2lmICFTRExfVEhSRUFEU19ESVNBQkxFRAorCS8qIENyZWF0ZSB0aGUgaGFyZHdhcmUgc3VyZmFjZSBsb2NrIG11dGV4ICovCisJaHdfbG9jayA9IFNETF9DcmVhdGVNdXRleCgpOworCWlmICggaHdfbG9jayA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgbG9jayBtdXRleCIpOworCQlGQl9WaWRlb1F1aXQodGhpcyk7CisJCXJldHVybigtMSk7CisJfQorI2VuZGlmCisKKwkvKiBHZXQgdGhlIHR5cGUgb2YgdmlkZW8gaGFyZHdhcmUgKi8KKwlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sICZmaW5mbykgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBjb25zb2xlIGhhcmR3YXJlIGluZm8iKTsKKwkJRkJfVmlkZW9RdWl0KHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKwlzd2l0Y2ggKGZpbmZvLnR5cGUpIHsKKwkJY2FzZSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM6CisJCQkvKiBTdXBwb3J0ZWQsIG5vIHdvcnJpZXMuLiAqLworCQkJYnJlYWs7CisjaWZkZWYgVkdBMTZfRkJDT05fU1VQUE9SVAorCQljYXNlIEZCX1RZUEVfVkdBX1BMQU5FUzoKKwkJCS8qIFZHQTE2IGlzIHN1cHBvcnRlZCwgYnV0IHRoYXQncyBpdCAqLworCQkJaWYgKCBmaW5mby50eXBlX2F1eCA9PSBGQl9BVVhfVkdBX1BMQU5FU19WR0E0ICkgeworCQkJCWlmICggaW9wZXJtKDB4M2I0LCAweDNkZiAtIDB4M2I0ICsgMSwgMSkgPCAwICkgeworCQkJCQlTRExfU2V0RXJyb3IoIk5vIEkvTyBwb3J0IHBlcm1pc3Npb25zIik7CisJCQkJCUZCX1ZpZGVvUXVpdCh0aGlzKTsKKwkJCQkJcmV0dXJuKC0xKTsKKwkJCQl9CisJCQkJdGhpcy0+U2V0VmlkZW9Nb2RlID0gRkJfU2V0VkdBMTZNb2RlOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRmFsbCB0aHJvdWdoIHRvIHVuc3VwcG9ydGVkIGNhc2UgKi8KKyNlbmRpZiAvKiBWR0ExNl9GQkNPTl9TVVBQT1JUICovCisJCWRlZmF1bHQ6CisJCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGNvbnNvbGUgaGFyZHdhcmUiKTsKKwkJCUZCX1ZpZGVvUXVpdCh0aGlzKTsKKwkJCXJldHVybigtMSk7CisJfQorCXN3aXRjaCAoZmluZm8udmlzdWFsKSB7CisJCWNhc2UgRkJfVklTVUFMX1RSVUVDT0xPUjoKKwkJY2FzZSBGQl9WSVNVQUxfUFNFVURPQ09MT1I6CisJCWNhc2UgRkJfVklTVUFMX1NUQVRJQ19QU0VVRE9DT0xPUjoKKwkJY2FzZSBGQl9WSVNVQUxfRElSRUNUQ09MT1I6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgY29uc29sZSBoYXJkd2FyZSIpOworCQkJRkJfVmlkZW9RdWl0KHRoaXMpOworCQkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGUgdXNlciB3YW50cyB0byBkaXNhYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiAqLworCXsgY29uc3QgY2hhciAqZmJfYWNjZWw7CisJCWZiX2FjY2VsID0gU0RMX2dldGVudigiU0RMX0ZCQUNDRUwiKTsKKwkJaWYgKCBmYl9hY2NlbCApIHsKKwkJCWZpbmZvLmFjY2VsID0gU0RMX2F0b2koZmJfYWNjZWwpOworCQl9CisJfQorCisJLyogTWVtb3J5IG1hcCB0aGUgZGV2aWNlLCBjb21wZW5zYXRpbmcgZm9yIGJ1Z2d5IFBQQyBtbWFwKCkgKi8KKwltYXBwZWRfb2Zmc2V0ID0gKCgobG9uZylmaW5mby5zbWVtX3N0YXJ0KSAtCisJICAgICAgICAgICAgICAgICgoKGxvbmcpZmluZm8uc21lbV9zdGFydCkmfihwYWdlc2l6ZS0xKSkpOworCW1hcHBlZF9tZW1sZW4gPSBmaW5mby5zbWVtX2xlbittYXBwZWRfb2Zmc2V0OworCW1hcHBlZF9tZW0gPSBkb19tbWFwKE5VTEwsIG1hcHBlZF9tZW1sZW4sCisJICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGNvbnNvbGVfZmQsIDApOworCWlmICggbWFwcGVkX21lbSA9PSAoY2hhciAqKS0xICkgeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBtZW1vcnkgbWFwIHRoZSB2aWRlbyBoYXJkd2FyZSIpOworCQltYXBwZWRfbWVtID0gTlVMTDsKKwkJRkJfVmlkZW9RdWl0KHRoaXMpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gZGVwdGggKi8KKwlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2aW5mbykgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBjb25zb2xlIHBpeGVsIGZvcm1hdCIpOworCQlGQl9WaWRlb1F1aXQodGhpcyk7CisJCXJldHVybigtMSk7CisJfQorCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IHZpbmZvLmJpdHNfcGVyX3BpeGVsOworCWlmICggdmZvcm1hdC0+Qml0c1BlclBpeGVsIDwgOCApIHsKKwkJLyogQXNzdW1pbmcgVkdBMTYsIHdlIGhhbmRsZSB0aGlzIHZpYSBhIHNoYWRvdyBmcmFtZWJ1ZmZlciAqLworCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSA4OworCX0KKwlmb3IgKCBpPTA7IGk8dmluZm8ucmVkLmxlbmd0aDsgKytpICkgeworCQl2Zm9ybWF0LT5SbWFzayA8PD0gMTsKKwkJdmZvcm1hdC0+Um1hc2sgfD0gKDB4MDAwMDAwMDE8PHZpbmZvLnJlZC5vZmZzZXQpOworCX0KKwlmb3IgKCBpPTA7IGk8dmluZm8uZ3JlZW4ubGVuZ3RoOyArK2kgKSB7CisJCXZmb3JtYXQtPkdtYXNrIDw8PSAxOworCQl2Zm9ybWF0LT5HbWFzayB8PSAoMHgwMDAwMDAwMTw8dmluZm8uZ3JlZW4ub2Zmc2V0KTsKKwl9CisJZm9yICggaT0wOyBpPHZpbmZvLmJsdWUubGVuZ3RoOyArK2kgKSB7CisJCXZmb3JtYXQtPkJtYXNrIDw8PSAxOworCQl2Zm9ybWF0LT5CbWFzayB8PSAoMHgwMDAwMDAwMTw8dmluZm8uYmx1ZS5vZmZzZXQpOworCX0KKwlzYXZlZF92aW5mbyA9IHZpbmZvOworCisJLyogU2F2ZSBoYXJkd2FyZSBwYWxldHRlLCBpZiBuZWVkZWQgKi8KKwlGQl9TYXZlUGFsZXR0ZSh0aGlzLCAmZmluZm8sICZ2aW5mbyk7CisKKwkvKiBJZiB0aGUgSS9PIHJlZ2lzdGVycyBhcmUgYXZhaWxhYmxlLCBtZW1vcnkgbWFwIHRoZW0gc28gd2UKKwkgICBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgYW55IHN1cHBvcnRlZCBoYXJkd2FyZSBhY2NlbGVyYXRpb24uCisJICovCisJdmluZm8uYWNjZWxfZmxhZ3MgPSAwOwkvKiBUZW1wb3JhcmlseSByZXNlcnZlIHJlZ2lzdGVycyAqLworCWlvY3RsKGNvbnNvbGVfZmQsIEZCSU9QVVRfVlNDUkVFTklORk8sICZ2aW5mbyk7CisJaWYgKCBmaW5mby5hY2NlbCAmJiBmaW5mby5tbWlvX2xlbiApIHsKKwkJbWFwcGVkX2lvbGVuID0gZmluZm8ubW1pb19sZW47CisJCW1hcHBlZF9pbyA9IGRvX21tYXAoTlVMTCwgbWFwcGVkX2lvbGVuLCBQUk9UX1JFQUR8UFJPVF9XUklURSwKKwkJICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBjb25zb2xlX2ZkLCBtYXBwZWRfbWVtbGVuKTsKKwkJaWYgKCBtYXBwZWRfaW8gPT0gKGNoYXIgKiktMSApIHsKKwkJCS8qIEhtbSwgZmFpbGVkIHRvIG1lbW9yeSBtYXAgSS9PIHJlZ2lzdGVycyAqLworCQkJbWFwcGVkX2lvID0gTlVMTDsKKwkJfQorCX0KKworCXJvdGF0ZSA9IEZCQ09OX1JPVEFURV9OT05FOworCXJvdGF0aW9uID0gU0RMX2dldGVudigiU0RMX1ZJREVPX0ZCQ09OX1JPVEFUSU9OIik7CisJaWYgKHJvdGF0aW9uICE9IE5VTEwpIHsKKwkJaWYgKFNETF9zdHJsZW4ocm90YXRpb24pID09IDApIHsKKwkJCXNoYWRvd19mYiA9IDA7CisJCQlyb3RhdGUgPSBGQkNPTl9ST1RBVEVfTk9ORTsKKyNpZmRlZiBGQkNPTl9ERUJVRworCQkJcHJpbnRmKCJOb3Qgcm90YXRpbmcsIG5vIHNoYWRvd1xuIik7CisjZW5kaWYKKwkJfSBlbHNlIGlmICghU0RMX3N0cmNtcChyb3RhdGlvbiwgIk5PTkUiKSkgeworCQkJc2hhZG93X2ZiID0gMTsKKwkJCXJvdGF0ZSA9IEZCQ09OX1JPVEFURV9OT05FOworI2lmZGVmIEZCQ09OX0RFQlVHCisJCQlwcmludGYoIk5vdCByb3RhdGluZywgYnV0IHN0aWxsIHVzaW5nIHNoYWRvd1xuIik7CisjZW5kaWYKKwkJfSBlbHNlIGlmICghU0RMX3N0cmNtcChyb3RhdGlvbiwgIkNXIikpIHsKKwkJCXNoYWRvd19mYiA9IDE7CisJCQlyb3RhdGUgPSBGQkNPTl9ST1RBVEVfQ1c7CisjaWZkZWYgRkJDT05fREVCVUcKKwkJCXByaW50ZigiUm90YXRpbmcgc2NyZWVuIGNsb2Nrd2lzZVxuIik7CisjZW5kaWYKKwkJfSBlbHNlIGlmICghU0RMX3N0cmNtcChyb3RhdGlvbiwgIkNDVyIpKSB7CisJCQlzaGFkb3dfZmIgPSAxOworCQkJcm90YXRlID0gRkJDT05fUk9UQVRFX0NDVzsKKyNpZmRlZiBGQkNPTl9ERUJVRworCQkJcHJpbnRmKCJSb3RhdGluZyBzY3JlZW4gY291bnRlciBjbG9ja3dpc2VcbiIpOworI2VuZGlmCisJCX0gZWxzZSBpZiAoIVNETF9zdHJjbXAocm90YXRpb24sICJVRCIpKSB7CisJCQlzaGFkb3dfZmIgPSAxOworCQkJcm90YXRlID0gRkJDT05fUk9UQVRFX1VEOworI2lmZGVmIEZCQ09OX0RFQlVHCisJCQlwcmludGYoIlJvdGF0aW5nIHNjcmVlbiB1cHNpZGUgZG93blxuIik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCVNETF9TZXRFcnJvcigiXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAiCisJCQkJICJTRExfVklERU9fRkJDT05fUk9UQVRJT04iLCByb3RhdGlvbik7CisJCQlyZXR1cm4oLTEpOworCQl9CisJfQorCisJaWYgKHJvdGF0ZSA9PSBGQkNPTl9ST1RBVEVfQ1cgfHwgcm90YXRlID09IEZCQ09OX1JPVEFURV9DQ1cpIHsKKwkJY3VycmVudF93ID0gdmluZm8ueXJlczsKKwkJY3VycmVudF9oID0gdmluZm8ueHJlczsKKwl9IGVsc2UgeworCQljdXJyZW50X3cgPSB2aW5mby54cmVzOworCQljdXJyZW50X2ggPSB2aW5mby55cmVzOworCX0KKworCS8qIFF1ZXJ5IGZvciB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdmlkZW8gbW9kZXMgKi8KKwljdXJyZW50X2luZGV4ID0gKCh2aW5mby5iaXRzX3Blcl9waXhlbCs3KS84KS0xOworCW1vZGVzZGIgPSBmb3BlbihGQl9NT0RFU19EQiwgInIiKTsKKwlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgeworCQlTRExfbnVtbW9kZXNbaV0gPSAwOworCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOworCX0KKwlpZiAoIFNETF9nZXRlbnYoIlNETF9GQl9CUk9LRU5fTU9ERVMiKSAhPSBOVUxMICkgeworCQlGQl9BZGRNb2RlKHRoaXMsIGN1cnJlbnRfaW5kZXgsIGN1cnJlbnRfdywgY3VycmVudF9oLCAwKTsKKwl9IGVsc2UgaWYobW9kZXNkYikgeworCQl3aGlsZSAoIHJlYWRfZmJtb2Rlc19tb2RlKG1vZGVzZGIsICZ2aW5mbykgKSB7CisJCQlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgeworCQkJCXVuc2lnbmVkIGludCB3LCBoOworCisJCQkJaWYgKHJvdGF0ZSA9PSBGQkNPTl9ST1RBVEVfQ1cgfHwgcm90YXRlID09IEZCQ09OX1JPVEFURV9DQ1cpIHsKKwkJCQkJdyA9IHZpbmZvLnlyZXM7CisJCQkJCWggPSB2aW5mby54cmVzOworCQkJCX0gZWxzZSB7CisJCQkJCXcgPSB2aW5mby54cmVzOworCQkJCQloID0gdmluZm8ueXJlczsKKwkJCQl9CisJCQkJLyogU2VlIGlmIHdlIGFyZSBxdWVyeWluZyBmb3IgdGhlIGN1cnJlbnQgbW9kZSAqLworCQkJCWlmICggaSA9PSBjdXJyZW50X2luZGV4ICkgeworCQkJCQlpZiAoIChjdXJyZW50X3cgPiB3KSB8fCAoY3VycmVudF9oID4gaCkgKSB7CisJCQkJCQkvKiBPbmx5IGNoZWNrIG9uY2UgKi8KKwkJCQkJCUZCX0FkZE1vZGUodGhpcywgaSwgY3VycmVudF93LCBjdXJyZW50X2gsIDApOworCQkJCQkJY3VycmVudF9pbmRleCA9IC0xOworCQkJCQl9CisJCQkJfQorCQkJCWlmICggRkJfQ2hlY2tNb2RlKHRoaXMsICZ2aW5mbywgaSwgJncsICZoKSApIHsKKwkJCQkJRkJfQWRkTW9kZSh0aGlzLCBpLCB3LCBoLCAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZmNsb3NlKG1vZGVzZGIpOworCQlGQl9Tb3J0TW9kZXModGhpcyk7CisJfSBlbHNlIHsKKwkJZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKKwkJCWZvciAoIGo9MDsgajwoc2l6ZW9mKGNoZWNrcmVzKS9zaXplb2YoY2hlY2tyZXNbMF0pKTsgKytqICkgeworCQkJCXVuc2lnbmVkIGludCB3LCBoOworCisJCQkJaWYgKHJvdGF0ZSA9PSBGQkNPTl9ST1RBVEVfQ1cgfHwgcm90YXRlID09IEZCQ09OX1JPVEFURV9DQ1cpIHsKKwkJCQkJdyA9IGNoZWNrcmVzW2pdLmg7CisJCQkJCWggPSBjaGVja3Jlc1tqXS53OworCQkJCX0gZWxzZSB7CisJCQkJCXcgPSBjaGVja3Jlc1tqXS53OworCQkJCQloID0gY2hlY2tyZXNbal0uaDsKKwkJCQl9CisJCQkJLyogU2VlIGlmIHdlIGFyZSBxdWVyeWluZyBmb3IgdGhlIGN1cnJlbnQgbW9kZSAqLworCQkJCWlmICggaSA9PSBjdXJyZW50X2luZGV4ICkgeworCQkJCQlpZiAoIChjdXJyZW50X3cgPiB3KSB8fCAoY3VycmVudF9oID4gaCkgKSB7CisJCQkJCQkvKiBPbmx5IGNoZWNrIG9uY2UgKi8KKwkJCQkJCUZCX0FkZE1vZGUodGhpcywgaSwgY3VycmVudF93LCBjdXJyZW50X2gsIDApOworCQkJCQkJY3VycmVudF9pbmRleCA9IC0xOworCQkJCQl9CisJCQkJfQorCQkJCWlmICggRkJfQ2hlY2tNb2RlKHRoaXMsICZ2aW5mbywgaSwgJncsICZoKSApIHsKKwkJCQkJRkJfQWRkTW9kZSh0aGlzLCBpLCB3LCBoLCAxKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwl0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IGN1cnJlbnRfdzsKKwl0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IGN1cnJlbnRfaDsKKwl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDA7CisJdGhpcy0+aW5mby5od19hdmFpbGFibGUgPSAhc2hhZG93X2ZiOworCXRoaXMtPmluZm8udmlkZW9fbWVtID0gc2hhZG93X2ZiID8gMCA6IGZpbmZvLnNtZW1fbGVuLzEwMjQ7CisJLyogRmlsbCBpbiBvdXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGNhcGFiaWxpdGllcyAqLworCWlmICggbWFwcGVkX2lvICkgeworCQlzd2l0Y2ggKGZpbmZvLmFjY2VsKSB7CisJCSAgICBjYXNlIEZCX0FDQ0VMX01BVFJPWF9NR0EyMDY0VzoKKwkJICAgIGNhc2UgRkJfQUNDRUxfTUFUUk9YX01HQTEwNjRTRzoKKwkJICAgIGNhc2UgRkJfQUNDRUxfTUFUUk9YX01HQTIxNjRXOgorCQkgICAgY2FzZSBGQl9BQ0NFTF9NQVRST1hfTUdBMjE2NFdfQUdQOgorCQkgICAgY2FzZSBGQl9BQ0NFTF9NQVRST1hfTUdBRzEwMDoKKwkJICAgIC8qY2FzZSBGQl9BQ0NFTF9NQVRST1hfTUdBRzIwMDogRzIwMCBhY2NlbGVyYXRpb24gYnJva2VuISAqLworCQkgICAgY2FzZSBGQl9BQ0NFTF9NQVRST1hfTUdBRzQwMDoKKyNpZmRlZiBGQkFDQ0VMX0RFQlVHCisJCQlwcmludGYoIk1hdHJveCBoYXJkd2FyZSBhY2NlbGVyYXRvciFcbiIpOworI2VuZGlmCisJCQlGQl9NYXRyb3hBY2NlbCh0aGlzLCBmaW5mby5hY2NlbCk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgRkJfQUNDRUxfM0RGWF9CQU5TSEVFOgorI2lmZGVmIEZCQUNDRUxfREVCVUcKKwkJCXByaW50ZigiM0RGWCBoYXJkd2FyZSBhY2NlbGVyYXRvciFcbiIpOworI2VuZGlmCisJCQlGQl8zRGZ4QWNjZWwodGhpcywgZmluZm8uYWNjZWwpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIEZCX0FDQ0VMX05WMzoKKwkJICAgIGNhc2UgRkJfQUNDRUxfTlY0OgorI2lmZGVmIEZCQUNDRUxfREVCVUcKKwkJCXByaW50ZigiTlZpZGlhIGhhcmR3YXJlIGFjY2VsZXJhdG9yIVxuIik7CisjZW5kaWYKKwkJCUZCX1JpdmFBY2NlbCh0aGlzLCBmaW5mby5hY2NlbCk7CisJCQlicmVhazsKKwkJICAgIGRlZmF1bHQ6CisjaWZkZWYgRkJBQ0NFTF9ERUJVRworCQkJcHJpbnRmKCJVbmtub3duIGhhcmR3YXJlIGFjY2VsZXJhdG9yLlxuIik7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHNoYWRvd19mYikgeworCQlzaGFkb3dfbWVtID0gKGNoYXIgKilTRExfbWFsbG9jKG1hcHBlZF9tZW1sZW4pOworCQlpZiAoc2hhZG93X21lbSA9PSBOVUxMKSB7CisJCQlTRExfU2V0RXJyb3IoIk5vIG1lbW9yeSBmb3Igc2hhZG93Iik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfSAKKwl9CisKKwkvKiBFbmFibGUgbW91c2UgYW5kIGtleWJvYXJkIHN1cHBvcnQgKi8KKwlpZiAoIEZCX09wZW5LZXlib2FyZCh0aGlzKSA8IDAgKSB7CisJCUZCX1ZpZGVvUXVpdCh0aGlzKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJaWYgKCBGQl9PcGVuTW91c2UodGhpcykgPCAwICkgeworCQljb25zdCBjaGFyICpzZGxfbm9tb3VzZTsKKworCQlzZGxfbm9tb3VzZSA9IFNETF9nZXRlbnYoIlNETF9OT01PVVNFIik7CisJCWlmICggISBzZGxfbm9tb3VzZSApIHsKKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gbW91c2UiKTsKKwkJCUZCX1ZpZGVvUXVpdCh0aGlzKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisKKwkvKiBXZSdyZSBkb25lISAqLworCXJldHVybigwKTsKK30KKworc3RhdGljIFNETF9SZWN0ICoqRkJfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCXJldHVybihTRExfbW9kZWxpc3RbKChmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xXSk7Cit9CisKKy8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCitzdGF0aWMgdm9pZCBGQl9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKKyNpZmRlZiBWR0ExNl9GQkNPTl9TVVBQT1JUCitzdGF0aWMgdm9pZCBGQl9WR0ExNlVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworI2VuZGlmCisKKyNpZmRlZiBGQkNPTl9ERUJVRworc3RhdGljIHZvaWQgcHJpbnRfdmluZm8oc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2aW5mbykKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlByaW50aW5nIHZpbmZvOlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdHhyZXM6ICVkXG4iLCB2aW5mby0+eHJlcyk7CisJZnByaW50ZihzdGRlcnIsICJcdHlyZXM6ICVkXG4iLCB2aW5mby0+eXJlcyk7CisJZnByaW50ZihzdGRlcnIsICJcdHhyZXNfdmlydHVhbDogJWRcbiIsIHZpbmZvLT54cmVzX3ZpcnR1YWwpOworCWZwcmludGYoc3RkZXJyLCAiXHR5cmVzX3ZpcnR1YWw6ICVkXG4iLCB2aW5mby0+eXJlc192aXJ0dWFsKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0eG9mZnNldDogJWRcbiIsIHZpbmZvLT54b2Zmc2V0KTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0eW9mZnNldDogJWRcbiIsIHZpbmZvLT55b2Zmc2V0KTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0Yml0c19wZXJfcGl4ZWw6ICVkXG4iLCB2aW5mby0+Yml0c19wZXJfcGl4ZWwpOworCWZwcmludGYoc3RkZXJyLCAiXHRncmF5c2NhbGU6ICVkXG4iLCB2aW5mby0+Z3JheXNjYWxlKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0bm9uc3RkOiAlZFxuIiwgdmluZm8tPm5vbnN0ZCk7CisJZnByaW50ZihzdGRlcnIsICJcdGFjdGl2YXRlOiAlZFxuIiwgdmluZm8tPmFjdGl2YXRlKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0aGVpZ2h0OiAlZFxuIiwgdmluZm8tPmhlaWdodCk7CisJZnByaW50ZihzdGRlcnIsICJcdHdpZHRoOiAlZFxuIiwgdmluZm8tPndpZHRoKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0YWNjZWxfZmxhZ3M6ICVkXG4iLCB2aW5mby0+YWNjZWxfZmxhZ3MpOworCWZwcmludGYoc3RkZXJyLCAiXHRwaXhjbG9jazogJWRcbiIsIHZpbmZvLT5waXhjbG9jayk7CisJZnByaW50ZihzdGRlcnIsICJcdGxlZnRfbWFyZ2luOiAlZFxuIiwgdmluZm8tPmxlZnRfbWFyZ2luKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0cmlnaHRfbWFyZ2luOiAlZFxuIiwgdmluZm8tPnJpZ2h0X21hcmdpbik7CisJZnByaW50ZihzdGRlcnIsICJcdHVwcGVyX21hcmdpbjogJWRcbiIsIHZpbmZvLT51cHBlcl9tYXJnaW4pOworCWZwcmludGYoc3RkZXJyLCAiXHRsb3dlcl9tYXJnaW46ICVkXG4iLCB2aW5mby0+bG93ZXJfbWFyZ2luKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0aHN5bmNfbGVuOiAlZFxuIiwgdmluZm8tPmhzeW5jX2xlbik7CisJZnByaW50ZihzdGRlcnIsICJcdHZzeW5jX2xlbjogJWRcbiIsIHZpbmZvLT52c3luY19sZW4pOworCWZwcmludGYoc3RkZXJyLCAiXHRzeW5jOiAlZFxuIiwgdmluZm8tPnN5bmMpOworCWZwcmludGYoc3RkZXJyLCAiXHR2bW9kZTogJWRcbiIsIHZpbmZvLT52bW9kZSk7CisJZnByaW50ZihzdGRlcnIsICJcdHJlZDogJWQvJWRcbiIsIHZpbmZvLT5yZWQubGVuZ3RoLCB2aW5mby0+cmVkLm9mZnNldCk7CisJZnByaW50ZihzdGRlcnIsICJcdGdyZWVuOiAlZC8lZFxuIiwgdmluZm8tPmdyZWVuLmxlbmd0aCwgdmluZm8tPmdyZWVuLm9mZnNldCk7CisJZnByaW50ZihzdGRlcnIsICJcdGJsdWU6ICVkLyVkXG4iLCB2aW5mby0+Ymx1ZS5sZW5ndGgsIHZpbmZvLT5ibHVlLm9mZnNldCk7CisJZnByaW50ZihzdGRlcnIsICJcdGFscGhhOiAlZC8lZFxuIiwgdmluZm8tPnRyYW5zcC5sZW5ndGgsIHZpbmZvLT50cmFuc3Aub2Zmc2V0KTsKK30KK3N0YXRpYyB2b2lkIHByaW50X2ZpbmZvKHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZmluZm8pCit7CisJZnByaW50ZihzdGRlcnIsICJQcmludGluZyBmaW5mbzpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHRzbWVtX3N0YXJ0ID0gJXBcbiIsIChjaGFyICopZmluZm8tPnNtZW1fc3RhcnQpOworCWZwcmludGYoc3RkZXJyLCAiXHRzbWVtX2xlbiA9ICVkXG4iLCBmaW5mby0+c21lbV9sZW4pOworCWZwcmludGYoc3RkZXJyLCAiXHR0eXBlID0gJWRcbiIsIGZpbmZvLT50eXBlKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0dHlwZV9hdXggPSAlZFxuIiwgZmluZm8tPnR5cGVfYXV4KTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0dmlzdWFsID0gJWRcbiIsIGZpbmZvLT52aXN1YWwpOworCWZwcmludGYoc3RkZXJyLCAiXHR4cGFuc3RlcCA9ICVkXG4iLCBmaW5mby0+eHBhbnN0ZXApOworCWZwcmludGYoc3RkZXJyLCAiXHR5cGFuc3RlcCA9ICVkXG4iLCBmaW5mby0+eXBhbnN0ZXApOworCWZwcmludGYoc3RkZXJyLCAiXHR5d3JhcHN0ZXAgPSAlZFxuIiwgZmluZm8tPnl3cmFwc3RlcCk7CisJZnByaW50ZihzdGRlcnIsICJcdGxpbmVfbGVuZ3RoID0gJWRcbiIsIGZpbmZvLT5saW5lX2xlbmd0aCk7CisJZnByaW50ZihzdGRlcnIsICJcdG1taW9fc3RhcnQgPSAlcFxuIiwgKGNoYXIgKilmaW5mby0+bW1pb19zdGFydCk7CisJZnByaW50ZihzdGRlcnIsICJcdG1taW9fbGVuID0gJWRcbiIsIGZpbmZvLT5tbWlvX2xlbik7CisJZnByaW50ZihzdGRlcnIsICJcdGFjY2VsID0gJWRcbiIsIGZpbmZvLT5hY2NlbCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBjaG9vc2VfZmJtb2Rlc19tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmluZm8pCit7CisJaW50IG1hdGNoZWQ7CisJRklMRSAqbW9kZXNkYjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gY2luZm87CisKKwltYXRjaGVkID0gMDsKKwltb2Rlc2RiID0gZm9wZW4oRkJfTU9ERVNfREIsICJyIik7CisJaWYgKCBtb2Rlc2RiICkgeworCQkvKiBQYXJzZSB0aGUgbW9kZSBkZWZpbml0aW9uIGZpbGUgKi8KKwkJd2hpbGUgKCByZWFkX2ZibW9kZXNfbW9kZShtb2Rlc2RiLCAmY2luZm8pICkgeworCQkJaWYgKCAodmluZm8tPnhyZXMgPT0gY2luZm8ueHJlcyAmJiB2aW5mby0+eXJlcyA9PSBjaW5mby55cmVzKSAmJgorCQkJICAgICAoIW1hdGNoZWQgfHwgKHZpbmZvLT5iaXRzX3Blcl9waXhlbCA9PSBjaW5mby5iaXRzX3Blcl9waXhlbCkpICkgeworCQkJCXZpbmZvLT5waXhjbG9jayA9IGNpbmZvLnBpeGNsb2NrOworCQkJCXZpbmZvLT5sZWZ0X21hcmdpbiA9IGNpbmZvLmxlZnRfbWFyZ2luOworCQkJCXZpbmZvLT5yaWdodF9tYXJnaW4gPSBjaW5mby5yaWdodF9tYXJnaW47CisJCQkJdmluZm8tPnVwcGVyX21hcmdpbiA9IGNpbmZvLnVwcGVyX21hcmdpbjsKKwkJCQl2aW5mby0+bG93ZXJfbWFyZ2luID0gY2luZm8ubG93ZXJfbWFyZ2luOworCQkJCXZpbmZvLT5oc3luY19sZW4gPSBjaW5mby5oc3luY19sZW47CisJCQkJdmluZm8tPnZzeW5jX2xlbiA9IGNpbmZvLnZzeW5jX2xlbjsKKwkJCQlpZiAoIG1hdGNoZWQgKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltYXRjaGVkID0gMTsKKwkJCX0KKwkJfQorCQlmY2xvc2UobW9kZXNkYik7CisJfQorCXJldHVybihtYXRjaGVkKTsKK30KKworc3RhdGljIGludCBjaG9vc2VfdmVzYV9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmluZm8pCit7CisJaW50IG1hdGNoZWQ7CisJaW50IGk7CisKKwkvKiBDaGVjayBmb3IgVkVTQSB0aW1pbmdzICovCisJbWF0Y2hlZCA9IDA7CisJZm9yICggaT0wOyBpPChzaXplb2YodmVzYV90aW1pbmdzKS9zaXplb2YodmVzYV90aW1pbmdzWzBdKSk7ICsraSApIHsKKwkJaWYgKCAodmluZm8tPnhyZXMgPT0gdmVzYV90aW1pbmdzW2ldLnhyZXMpICYmCisJCSAgICAgKHZpbmZvLT55cmVzID09IHZlc2FfdGltaW5nc1tpXS55cmVzKSApIHsKKyNpZmRlZiBGQkNPTl9ERUJVRworCQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBWRVNBIHRpbWluZ3MgZm9yICVkeCVkXG4iLAorCQkJCQkJdmluZm8tPnhyZXMsIHZpbmZvLT55cmVzKTsKKyNlbmRpZgorCQkJaWYgKCB2ZXNhX3RpbWluZ3NbaV0ucGl4Y2xvY2sgKSB7CisJCQkJdmluZm8tPnBpeGNsb2NrID0gdmVzYV90aW1pbmdzW2ldLnBpeGNsb2NrOworCQkJfQorCQkJdmluZm8tPmxlZnRfbWFyZ2luID0gdmVzYV90aW1pbmdzW2ldLmxlZnQ7CisJCQl2aW5mby0+cmlnaHRfbWFyZ2luID0gdmVzYV90aW1pbmdzW2ldLnJpZ2h0OworCQkJdmluZm8tPnVwcGVyX21hcmdpbiA9IHZlc2FfdGltaW5nc1tpXS51cHBlcjsKKwkJCXZpbmZvLT5sb3dlcl9tYXJnaW4gPSB2ZXNhX3RpbWluZ3NbaV0ubG93ZXI7CisJCQl2aW5mby0+aHN5bmNfbGVuID0gdmVzYV90aW1pbmdzW2ldLmhzbGVuOworCQkJdmluZm8tPnZzeW5jX2xlbiA9IHZlc2FfdGltaW5nc1tpXS52c2xlbjsKKwkJCXZpbmZvLT5zeW5jID0gdmVzYV90aW1pbmdzW2ldLnN5bmM7CisJCQl2aW5mby0+dm1vZGUgPSB2ZXNhX3RpbWluZ3NbaV0udm1vZGU7CisJCQltYXRjaGVkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybihtYXRjaGVkKTsKK30KKworI2lmZGVmIFZHQTE2X0ZCQ09OX1NVUFBPUlQKK3N0YXRpYyBTRExfU3VyZmFjZSAqRkJfU2V0VkdBMTZNb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gZmluZm87CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZpbmZvOworCisJLyogU2V0IHRoZSB0ZXJtaW5hbCBpbnRvIGdyYXBoaWNzIG1vZGUgKi8KKwlpZiAoIEZCX0VudGVyR3JhcGhpY3NNb2RlKHRoaXMpIDwgMCApIHsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBhbGV0dGUgKi8KKwlGQl9SZXN0b3JlUGFsZXR0ZSh0aGlzKTsKKworCS8qIFNldCB0aGUgdmlkZW8gbW9kZSBhbmQgZ2V0IHRoZSBmaW5hbCBzY3JlZW4gZm9ybWF0ICovCisJaWYgKCBpb2N0bChjb25zb2xlX2ZkLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmdmluZm8pIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBnZXQgY29uc29sZSBzY3JlZW4gaW5mbyIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWNhY2hlX3ZpbmZvID0gdmluZm87CisjaWZkZWYgRkJDT05fREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIlByaW50aW5nIGFjdHVhbCB2aW5mbzpcbiIpOworCXByaW50X3ZpbmZvKCZ2aW5mbyk7CisjZW5kaWYKKwlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgYnBwLCAwLCAwLCAwLCAwKSApIHsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwljdXJyZW50LT5mb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnMgPSAxNjsKKworCS8qIEdldCB0aGUgZml4ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnNvbGUgaGFyZHdhcmUuCisJICAgVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgZmluZm8ubGluZV9sZW5ndGggY2hhbmdlcy4KKwkgKi8KKwlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sICZmaW5mbykgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBjb25zb2xlIGhhcmR3YXJlIGluZm8iKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKyNpZmRlZiBGQkNPTl9ERUJVRworCWZwcmludGYoc3RkZXJyLCAiUHJpbnRpbmcgYWN0dWFsIGZpbmZvOlxuIik7CisJcHJpbnRfZmluZm8oJmZpbmZvKTsKKyNlbmRpZgorCisJLyogU2F2ZSBoYXJkd2FyZSBwYWxldHRlLCBpZiBuZWVkZWQgKi8KKwlGQl9TYXZlUGFsZXR0ZSh0aGlzLCAmZmluZm8sICZ2aW5mbyk7CisKKwkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCisJY3VycmVudC0+ZmxhZ3MgPSBTRExfRlVMTFNDUkVFTjsKKwljdXJyZW50LT53ID0gdmluZm8ueHJlczsKKwljdXJyZW50LT5oID0gdmluZm8ueXJlczsKKwljdXJyZW50LT5waXRjaCA9IGN1cnJlbnQtPnc7CisJY3VycmVudC0+cGl4ZWxzID0gU0RMX21hbGxvYyhjdXJyZW50LT5oKmN1cnJlbnQtPnBpdGNoKTsKKworCS8qIFNldCB0aGUgdXBkYXRlIHJlY3RhbmdsZSBmdW5jdGlvbiAqLworCXRoaXMtPlVwZGF0ZVJlY3RzID0gRkJfVkdBMTZVcGRhdGU7CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorI2VuZGlmIC8qIFZHQTE2X0ZCQ09OX1NVUFBPUlQgKi8KKworc3RhdGljIFNETF9TdXJmYWNlICpGQl9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAorCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBmaW5mbzsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmluZm87CisJaW50IGk7CisJVWludDMyIFJtYXNrOworCVVpbnQzMiBHbWFzazsKKwlVaW50MzIgQm1hc2s7CisJY2hhciAqc3VyZmFjZXNfbWVtOworCWludCBzdXJmYWNlc19sZW47CisKKwkvKiBTZXQgdGhlIHRlcm1pbmFsIGludG8gZ3JhcGhpY3MgbW9kZSAqLworCWlmICggRkJfRW50ZXJHcmFwaGljc01vZGUodGhpcykgPCAwICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgcGFsZXR0ZSAqLworCUZCX1Jlc3RvcmVQYWxldHRlKHRoaXMpOworCisJLyogU2V0IHRoZSB2aWRlbyBtb2RlIGFuZCBnZXQgdGhlIGZpbmFsIHNjcmVlbiBmb3JtYXQgKi8KKwlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2aW5mbykgPCAwICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCBjb25zb2xlIHNjcmVlbiBpbmZvIik7CisJCXJldHVybihOVUxMKTsKKwl9CisjaWZkZWYgRkJDT05fREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIlByaW50aW5nIG9yaWdpbmFsIHZpbmZvOlxuIik7CisJcHJpbnRfdmluZm8oJnZpbmZvKTsKKyNlbmRpZgorCS8qIERvIG5vdCB1c2UgZG91YmxlIGJ1ZmZlcmluZyB3aXRoIHNoYWRvdyBidWZmZXIgKi8KKwlpZiAoc2hhZG93X2ZiKSB7CisJCWZsYWdzICY9IH5TRExfRE9VQkxFQlVGOworCX0KKworCWlmICggKHZpbmZvLnhyZXMgIT0gd2lkdGgpIHx8ICh2aW5mby55cmVzICE9IGhlaWdodCkgfHwKKwkgICAgICh2aW5mby5iaXRzX3Blcl9waXhlbCAhPSBicHApIHx8IChmbGFncyAmIFNETF9ET1VCTEVCVUYpICkgeworCQl2aW5mby5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKKwkJdmluZm8uYWNjZWxfZmxhZ3MgPSAwOworCQl2aW5mby5iaXRzX3Blcl9waXhlbCA9IGJwcDsKKwkJdmluZm8ueHJlcyA9IHdpZHRoOworCQl2aW5mby54cmVzX3ZpcnR1YWwgPSB3aWR0aDsKKwkJdmluZm8ueXJlcyA9IGhlaWdodDsKKwkJaWYgKCBmbGFncyAmIFNETF9ET1VCTEVCVUYgKSB7CisJCQl2aW5mby55cmVzX3ZpcnR1YWwgPSBoZWlnaHQqMjsKKwkJfSBlbHNlIHsKKwkJCXZpbmZvLnlyZXNfdmlydHVhbCA9IGhlaWdodDsKKwkJfQorCQl2aW5mby54b2Zmc2V0ID0gMDsKKwkJdmluZm8ueW9mZnNldCA9IDA7CisJCXZpbmZvLnJlZC5sZW5ndGggPSB2aW5mby5yZWQub2Zmc2V0ID0gMDsKKwkJdmluZm8uZ3JlZW4ubGVuZ3RoID0gdmluZm8uZ3JlZW4ub2Zmc2V0ID0gMDsKKwkJdmluZm8uYmx1ZS5sZW5ndGggPSB2aW5mby5ibHVlLm9mZnNldCA9IDA7CisJCXZpbmZvLnRyYW5zcC5sZW5ndGggPSB2aW5mby50cmFuc3Aub2Zmc2V0ID0gMDsKKwkJaWYgKCAhIGNob29zZV9mYm1vZGVzX21vZGUoJnZpbmZvKSApIHsKKwkJCWNob29zZV92ZXNhX21vZGUoJnZpbmZvKTsKKwkJfQorI2lmZGVmIEZCQ09OX0RFQlVHCisJCWZwcmludGYoc3RkZXJyLCAiUHJpbnRpbmcgd2FudGVkIHZpbmZvOlxuIik7CisJCXByaW50X3ZpbmZvKCZ2aW5mbyk7CisjZW5kaWYKKwkJaWYgKCAhc2hhZG93X2ZiICYmCisJCQkJaW9jdGwoY29uc29sZV9mZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgJnZpbmZvKSA8IDAgKSB7CisJCQl2aW5mby55cmVzX3ZpcnR1YWwgPSBoZWlnaHQ7CisJCQlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9QVVRfVlNDUkVFTklORk8sICZ2aW5mbykgPCAwICkgeworCQkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IGNvbnNvbGUgc2NyZWVuIGluZm8iKTsKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpbnQgbWF4aGVpZ2h0OworCisJCS8qIEZpZ3VyZSBvdXQgaG93IG11Y2ggdmlkZW8gbWVtb3J5IGlzIGF2YWlsYWJsZSAqLworCQlpZiAoIGZsYWdzICYgU0RMX0RPVUJMRUJVRiApIHsKKwkJCW1heGhlaWdodCA9IGhlaWdodCoyOworCQl9IGVsc2UgeworCQkJbWF4aGVpZ2h0ID0gaGVpZ2h0OworCQl9CisJCWlmICggdmluZm8ueXJlc192aXJ0dWFsID4gbWF4aGVpZ2h0ICkgeworCQkJdmluZm8ueXJlc192aXJ0dWFsID0gbWF4aGVpZ2h0OworCQl9CisJfQorCWNhY2hlX3ZpbmZvID0gdmluZm87CisjaWZkZWYgRkJDT05fREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIlByaW50aW5nIGFjdHVhbCB2aW5mbzpcbiIpOworCXByaW50X3ZpbmZvKCZ2aW5mbyk7CisjZW5kaWYKKwlSbWFzayA9IDA7CisJZm9yICggaT0wOyBpPHZpbmZvLnJlZC5sZW5ndGg7ICsraSApIHsKKwkJUm1hc2sgPDw9IDE7CisJCVJtYXNrIHw9ICgweDAwMDAwMDAxPDx2aW5mby5yZWQub2Zmc2V0KTsKKwl9CisJR21hc2sgPSAwOworCWZvciAoIGk9MDsgaTx2aW5mby5ncmVlbi5sZW5ndGg7ICsraSApIHsKKwkJR21hc2sgPDw9IDE7CisJCUdtYXNrIHw9ICgweDAwMDAwMDAxPDx2aW5mby5ncmVlbi5vZmZzZXQpOworCX0KKwlCbWFzayA9IDA7CisJZm9yICggaT0wOyBpPHZpbmZvLmJsdWUubGVuZ3RoOyArK2kgKSB7CisJCUJtYXNrIDw8PSAxOworCQlCbWFzayB8PSAoMHgwMDAwMDAwMTw8dmluZm8uYmx1ZS5vZmZzZXQpOworCX0KKwlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgdmluZm8uYml0c19wZXJfcGl4ZWwsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJtYXNrLCBHbWFzaywgQm1hc2ssIDApICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogR2V0IHRoZSBmaXhlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29uc29sZSBoYXJkd2FyZS4KKwkgICBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSBmaW5mby5saW5lX2xlbmd0aCBjaGFuZ2VzLgorCSAqLworCWlmICggaW9jdGwoY29uc29sZV9mZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywgJmZpbmZvKSA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IGNvbnNvbGUgaGFyZHdhcmUgaW5mbyIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogU2F2ZSBoYXJkd2FyZSBwYWxldHRlLCBpZiBuZWVkZWQgKi8KKwlGQl9TYXZlUGFsZXR0ZSh0aGlzLCAmZmluZm8sICZ2aW5mbyk7CisKKwlpZiAoc2hhZG93X2ZiKSB7CisJCWlmICh2aW5mby5iaXRzX3Blcl9waXhlbCA9PSAxNikgeworCQkJYmxpdEZ1bmMgPSAocm90YXRlID09IEZCQ09OX1JPVEFURV9OT05FIHx8CisJCQkJCXJvdGF0ZSA9PSBGQkNPTl9ST1RBVEVfVUQpID8KKwkJCQlGQl9ibGl0MTYgOiBGQl9ibGl0MTZibG9ja2VkOworCQl9IGVsc2UgeworI2lmZGVmIEZCQ09OX0RFQlVHCisJCQlmcHJpbnRmKHN0ZGVyciwgIkluaXQgdmluZm86XG4iKTsKKwkJCXByaW50X3ZpbmZvKCZ2aW5mbyk7CisjZW5kaWYKKwkJCVNETF9TZXRFcnJvcigiVXNpbmcgc29mdHdhcmUgYnVmZmVyLCBidXQgbm8gYmxpdHRlciAiCisJCQkJCSJmdW5jdGlvbiBpcyBhdmFpbGFibGUgZm9yICVkIGJwcC4iLAorCQkJCQl2aW5mby5iaXRzX3Blcl9waXhlbCk7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKwl9CisKKwkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCisJY3VycmVudC0+ZmxhZ3MgJj0gU0RMX0ZVTExTQ1JFRU47CisJaWYgKHNoYWRvd19mYikgeworCQljdXJyZW50LT5mbGFncyB8PSBTRExfU1dTVVJGQUNFOworCX0gZWxzZSB7CisJCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9IV1NVUkZBQ0U7CisJfQorCWN1cnJlbnQtPncgPSB2aW5mby54cmVzOworCWN1cnJlbnQtPmggPSB2aW5mby55cmVzOworCWlmIChzaGFkb3dfZmIpIHsKKwkJY3VycmVudC0+cGl0Y2ggPSBjdXJyZW50LT53ICogKCh2aW5mby5iaXRzX3Blcl9waXhlbCArIDcpIC8gOCk7CisJCWN1cnJlbnQtPnBpeGVscyA9IHNoYWRvd19tZW07CisJCXBoeXNsaW5lYnl0ZXMgPSBmaW5mby5saW5lX2xlbmd0aDsKKwl9IGVsc2UgeworCQljdXJyZW50LT5waXRjaCA9IGZpbmZvLmxpbmVfbGVuZ3RoOworCQljdXJyZW50LT5waXhlbHMgPSBtYXBwZWRfbWVtK21hcHBlZF9vZmZzZXQ7CisJfQorCisJLyogU2V0IHVwIHRoZSBpbmZvcm1hdGlvbiBmb3IgaGFyZHdhcmUgc3VyZmFjZXMgKi8KKwlzdXJmYWNlc19tZW0gPSAoY2hhciAqKWN1cnJlbnQtPnBpeGVscyArCisJCXZpbmZvLnlyZXNfdmlydHVhbCpjdXJyZW50LT5waXRjaDsKKwlzdXJmYWNlc19sZW4gPSAoc2hhZG93X2ZiKSA/CisJCTAgOiAobWFwcGVkX21lbWxlbi0oc3VyZmFjZXNfbWVtLW1hcHBlZF9tZW0pKTsKKworCUZCX0ZyZWVIV1N1cmZhY2VzKHRoaXMpOworCUZCX0luaXRIV1N1cmZhY2VzKHRoaXMsIGN1cnJlbnQsIHN1cmZhY2VzX21lbSwgc3VyZmFjZXNfbGVuKTsKKworCS8qIExldCB0aGUgYXBwbGljYXRpb24ga25vdyB3ZSBoYXZlIGEgaGFyZHdhcmUgcGFsZXR0ZSAqLworCXN3aXRjaCAoZmluZm8udmlzdWFsKSB7CisJCWNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgorCQljdXJyZW50LT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOworCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogVXBkYXRlIGZvciBkb3VibGUtYnVmZmVyaW5nLCBpZiB3ZSBjYW4gKi8KKwlpZiAoIGZsYWdzICYgU0RMX0RPVUJMRUJVRiApIHsKKwkJaWYgKCB2aW5mby55cmVzX3ZpcnR1YWwgPT0gKGhlaWdodCoyKSApIHsKKwkJCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9ET1VCTEVCVUY7CisJCQlmbGlwX3BhZ2UgPSAwOworCQkJZmxpcF9hZGRyZXNzWzBdID0gKGNoYXIgKiljdXJyZW50LT5waXhlbHM7CisJCQlmbGlwX2FkZHJlc3NbMV0gPSAoY2hhciAqKWN1cnJlbnQtPnBpeGVscysKKwkJCQljdXJyZW50LT5oKmN1cnJlbnQtPnBpdGNoOworCQkJdGhpcy0+c2NyZWVuID0gY3VycmVudDsKKwkJCUZCX0ZsaXBIV1N1cmZhY2UodGhpcywgY3VycmVudCk7CisJCQl0aGlzLT5zY3JlZW4gPSBOVUxMOworCQl9CisJfQorCisJLyogU2V0IHRoZSB1cGRhdGUgcmVjdGFuZ2xlIGZ1bmN0aW9uICovCisJdGhpcy0+VXBkYXRlUmVjdHMgPSBGQl9EaXJlY3RVcGRhdGU7CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCisjaWZkZWYgRkJDT05fREVCVUcKK3ZvaWQgRkJfRHVtcEhXU3VyZmFjZXMoX1RISVMpCit7CisJdmlkbWVtX2J1Y2tldCAqYnVja2V0OworCisJcHJpbnRmKCJNZW1vcnkgbGVmdDogJWQgKCVkIHRvdGFsKVxuIiwgc3VyZmFjZXNfbWVtbGVmdCwgc3VyZmFjZXNfbWVtdG90YWwpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoIiAgICAgICAgIEJhc2UgIFNpemVcbiIpOworCWZvciAoIGJ1Y2tldD0mc3VyZmFjZXM7IGJ1Y2tldDsgYnVja2V0PWJ1Y2tldC0+bmV4dCApIHsKKwkJcHJpbnRmKCJCdWNrZXQ6ICAlcCwgJWQgKCVzKVxuIiwgYnVja2V0LT5iYXNlLCBidWNrZXQtPnNpemUsIGJ1Y2tldC0+dXNlZCA/ICJ1c2VkIiA6ICJmcmVlIik7CisJCWlmICggYnVja2V0LT5wcmV2ICkgeworCQkJaWYgKCBidWNrZXQtPmJhc2UgIT0gYnVja2V0LT5wcmV2LT5iYXNlK2J1Y2tldC0+cHJldi0+c2l6ZSApIHsKKwkJCQlwcmludGYoIldhcm5pbmcsIGNvcnJ1cHQgYnVja2V0IGxpc3QhIChwcmV2KVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIGJ1Y2tldCAhPSAmc3VyZmFjZXMgKSB7CisJCQkJcHJpbnRmKCJXYXJuaW5nLCBjb3JydXB0IGJ1Y2tldCBsaXN0ISAoIXByZXYpXG4iKTsKKwkJCX0KKwkJfQorCQlpZiAoIGJ1Y2tldC0+bmV4dCApIHsKKwkJCWlmICggYnVja2V0LT5uZXh0LT5iYXNlICE9IGJ1Y2tldC0+YmFzZStidWNrZXQtPnNpemUgKSB7CisJCQkJcHJpbnRmKCJXYXJuaW5nLCBjb3JydXB0IGJ1Y2tldCBsaXN0ISAobmV4dClcbiIpOworCQkJfQorCQl9CisJfQorCXByaW50ZigiXG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IEZCX0luaXRIV1N1cmZhY2VzKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuLCBjaGFyICpiYXNlLCBpbnQgc2l6ZSkKK3sKKwl2aWRtZW1fYnVja2V0ICpidWNrZXQ7CisKKwlzdXJmYWNlc19tZW10b3RhbCA9IHNpemU7CisJc3VyZmFjZXNfbWVtbGVmdCA9IHNpemU7CisKKwlpZiAoIHN1cmZhY2VzX21lbWxlZnQgPiAwICkgeworCQlidWNrZXQgPSAodmlkbWVtX2J1Y2tldCAqKVNETF9tYWxsb2Moc2l6ZW9mKCpidWNrZXQpKTsKKwkJaWYgKCBidWNrZXQgPT0gTlVMTCApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlidWNrZXQtPnByZXYgPSAmc3VyZmFjZXM7CisJCWJ1Y2tldC0+dXNlZCA9IDA7CisJCWJ1Y2tldC0+ZGlydHkgPSAwOworCQlidWNrZXQtPmJhc2UgPSBiYXNlOworCQlidWNrZXQtPnNpemUgPSBzaXplOworCQlidWNrZXQtPm5leHQgPSBOVUxMOworCX0gZWxzZSB7CisJCWJ1Y2tldCA9IE5VTEw7CisJfQorCisJc3VyZmFjZXMucHJldiA9IE5VTEw7CisJc3VyZmFjZXMudXNlZCA9IDE7CisJc3VyZmFjZXMuZGlydHkgPSAwOworCXN1cmZhY2VzLmJhc2UgPSBzY3JlZW4tPnBpeGVsczsKKwlzdXJmYWNlcy5zaXplID0gKHVuc2lnbmVkIGludCkoKGxvbmcpYmFzZSAtIChsb25nKXN1cmZhY2VzLmJhc2UpOworCXN1cmZhY2VzLm5leHQgPSBidWNrZXQ7CisJc2NyZWVuLT5od2RhdGEgPSAoc3RydWN0IHByaXZhdGVfaHdkYXRhICopJnN1cmZhY2VzOworCXJldHVybigwKTsKK30KK3N0YXRpYyB2b2lkIEZCX0ZyZWVIV1N1cmZhY2VzKF9USElTKQoreworCXZpZG1lbV9idWNrZXQgKmJ1Y2tldCwgKmZyZWVhYmxlOworCisJYnVja2V0ID0gc3VyZmFjZXMubmV4dDsKKwl3aGlsZSAoIGJ1Y2tldCApIHsKKwkJZnJlZWFibGUgPSBidWNrZXQ7CisJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKKwkJU0RMX2ZyZWUoZnJlZWFibGUpOworCX0KKwlzdXJmYWNlcy5uZXh0ID0gTlVMTDsKK30KKworc3RhdGljIGludCBGQl9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJdmlkbWVtX2J1Y2tldCAqYnVja2V0OworCWludCBzaXplOworCWludCBleHRyYTsKKworLyogVGVtcG9yYXJpbHksIHdlIG9ubHkgYWxsb3cgc3VyZmFjZXMgdGhlIHNhbWUgd2lkdGggYXMgZGlzcGxheS4KKyAgIFNvbWUgYmxpdHRlcnMgcmVxdWlyZSB0aGUgcGl0Y2ggYmV0d2VlbiB0d28gaGFyZHdhcmUgc3VyZmFjZXMKKyAgIHRvIGJlIHRoZSBzYW1lLiAgT3RoZXJzIGhhdmUgaW50ZXJlc3RpbmcgYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4KKyAgIFVudGlsIHNvbWVvbmUgd2hvIGtub3dzIHRoZXNlIGRldGFpbHMgbG9va3MgYXQgdGhlIGNvZGUuLi4KKyovCitpZiAoIHN1cmZhY2UtPnBpdGNoID4gU0RMX1ZpZGVvU3VyZmFjZS0+cGl0Y2ggKSB7CisJU0RMX1NldEVycm9yKCJTdXJmYWNlIHJlcXVlc3RlZCB3aWRlciB0aGFuIHNjcmVlbiIpOworCXJldHVybigtMSk7Cit9CitzdXJmYWNlLT5waXRjaCA9IFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoOworCXNpemUgPSBzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2g7CisjaWZkZWYgRkJDT05fREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRpbmcgYnVja2V0IG9mICVkIGJ5dGVzXG4iLCBzaXplKTsKKyNlbmRpZgorCisJLyogUXVpY2sgY2hlY2sgZm9yIGF2YWlsYWJsZSBtZW0gKi8KKwlpZiAoIHNpemUgPiBzdXJmYWNlc19tZW1sZWZ0ICkgeworCQlTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggdmlkZW8gbWVtb3J5Iik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogU2VhcmNoIGZvciBhbiBlbXB0eSBidWNrZXQgYmlnIGVub3VnaCAqLworCWZvciAoIGJ1Y2tldD0mc3VyZmFjZXM7IGJ1Y2tldDsgYnVja2V0PWJ1Y2tldC0+bmV4dCApIHsKKwkJaWYgKCAhIGJ1Y2tldC0+dXNlZCAmJiAoc2l6ZSA8PSBidWNrZXQtPnNpemUpICkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCBidWNrZXQgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJWaWRlbyBtZW1vcnkgdG9vIGZyYWdtZW50ZWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBDcmVhdGUgYSBuZXcgYnVja2V0IGZvciBsZWZ0LW92ZXIgbWVtb3J5ICovCisJZXh0cmEgPSAoYnVja2V0LT5zaXplIC0gc2l6ZSk7CisJaWYgKCBleHRyYSApIHsKKwkJdmlkbWVtX2J1Y2tldCAqbmV3YnVja2V0OworCisjaWZkZWYgRkJDT05fREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIkFkZGluZyBuZXcgZnJlZSBidWNrZXQgb2YgJWQgYnl0ZXNcbiIsIGV4dHJhKTsKKyNlbmRpZgorCQluZXdidWNrZXQgPSAodmlkbWVtX2J1Y2tldCAqKVNETF9tYWxsb2Moc2l6ZW9mKCpuZXdidWNrZXQpKTsKKwkJaWYgKCBuZXdidWNrZXQgPT0gTlVMTCApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQluZXdidWNrZXQtPnByZXYgPSBidWNrZXQ7CisJCW5ld2J1Y2tldC0+dXNlZCA9IDA7CisJCW5ld2J1Y2tldC0+YmFzZSA9IGJ1Y2tldC0+YmFzZStzaXplOworCQluZXdidWNrZXQtPnNpemUgPSBleHRyYTsKKwkJbmV3YnVja2V0LT5uZXh0ID0gYnVja2V0LT5uZXh0OworCQlpZiAoIGJ1Y2tldC0+bmV4dCApIHsKKwkJCWJ1Y2tldC0+bmV4dC0+cHJldiA9IG5ld2J1Y2tldDsKKwkJfQorCQlidWNrZXQtPm5leHQgPSBuZXdidWNrZXQ7CisJfQorCisJLyogU2V0IHRoZSBjdXJyZW50IGJ1Y2tldCB2YWx1ZXMgYW5kIHJldHVybiBpdCEgKi8KKwlidWNrZXQtPnVzZWQgPSAxOworCWJ1Y2tldC0+c2l6ZSA9IHNpemU7CisJYnVja2V0LT5kaXJ0eSA9IDA7CisjaWZkZWYgRkJDT05fREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRlZCAlZCBieXRlcyBhdCAlcFxuIiwgYnVja2V0LT5zaXplLCBidWNrZXQtPmJhc2UpOworI2VuZGlmCisJc3VyZmFjZXNfbWVtbGVmdCAtPSBzaXplOworCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9IV1NVUkZBQ0U7CisJc3VyZmFjZS0+cGl4ZWxzID0gYnVja2V0LT5iYXNlOworCXN1cmZhY2UtPmh3ZGF0YSA9IChzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgKilidWNrZXQ7CisJcmV0dXJuKDApOworfQorc3RhdGljIHZvaWQgRkJfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJdmlkbWVtX2J1Y2tldCAqYnVja2V0LCAqZnJlZWFibGU7CisKKwkvKiBMb29rIGZvciB0aGUgYnVja2V0IGluIHRoZSBjdXJyZW50IGxpc3QgKi8KKwlmb3IgKCBidWNrZXQ9JnN1cmZhY2VzOyBidWNrZXQ7IGJ1Y2tldD1idWNrZXQtPm5leHQgKSB7CisJCWlmICggYnVja2V0ID09ICh2aWRtZW1fYnVja2V0ICopc3VyZmFjZS0+aHdkYXRhICkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCBidWNrZXQgJiYgYnVja2V0LT51c2VkICkgeworCQkvKiBBZGQgdGhlIG1lbW9yeSBiYWNrIHRvIHRoZSB0b3RhbCAqLworI2lmZGVmIERHQV9ERUJVRworCXByaW50ZigiRnJlZWluZyBidWNrZXQgb2YgJWQgYnl0ZXNcbiIsIGJ1Y2tldC0+c2l6ZSk7CisjZW5kaWYKKwkJc3VyZmFjZXNfbWVtbGVmdCArPSBidWNrZXQtPnNpemU7CisKKwkJLyogQ2FuIHdlIG1lcmdlIHRoZSBzcGFjZSB3aXRoIHN1cnJvdW5kaW5nIGJ1Y2tldHM/ICovCisJCWJ1Y2tldC0+dXNlZCA9IDA7CisJCWlmICggYnVja2V0LT5uZXh0ICYmICEgYnVja2V0LT5uZXh0LT51c2VkICkgeworI2lmZGVmIERHQV9ERUJVRworCXByaW50ZigiTWVyZ2luZyB3aXRoIG5leHQgYnVja2V0LCBmb3IgJWQgdG90YWwgYnl0ZXNcbiIsIGJ1Y2tldC0+c2l6ZStidWNrZXQtPm5leHQtPnNpemUpOworI2VuZGlmCisJCQlmcmVlYWJsZSA9IGJ1Y2tldC0+bmV4dDsKKwkJCWJ1Y2tldC0+c2l6ZSArPSBidWNrZXQtPm5leHQtPnNpemU7CisJCQlidWNrZXQtPm5leHQgPSBidWNrZXQtPm5leHQtPm5leHQ7CisJCQlpZiAoIGJ1Y2tldC0+bmV4dCApIHsKKwkJCQlidWNrZXQtPm5leHQtPnByZXYgPSBidWNrZXQ7CisJCQl9CisJCQlTRExfZnJlZShmcmVlYWJsZSk7CisJCX0KKwkJaWYgKCBidWNrZXQtPnByZXYgJiYgISBidWNrZXQtPnByZXYtPnVzZWQgKSB7CisjaWZkZWYgREdBX0RFQlVHCisJcHJpbnRmKCJNZXJnaW5nIHdpdGggcHJldmlvdXMgYnVja2V0LCBmb3IgJWQgdG90YWwgYnl0ZXNcbiIsIGJ1Y2tldC0+cHJldi0+c2l6ZStidWNrZXQtPnNpemUpOworI2VuZGlmCisJCQlmcmVlYWJsZSA9IGJ1Y2tldDsKKwkJCWJ1Y2tldC0+cHJldi0+c2l6ZSArPSBidWNrZXQtPnNpemU7CisJCQlidWNrZXQtPnByZXYtPm5leHQgPSBidWNrZXQtPm5leHQ7CisJCQlpZiAoIGJ1Y2tldC0+bmV4dCApIHsKKwkJCQlidWNrZXQtPm5leHQtPnByZXYgPSBidWNrZXQtPnByZXY7CisJCQl9CisJCQlTRExfZnJlZShmcmVlYWJsZSk7CisJCX0KKwl9CisJc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKKwlzdXJmYWNlLT5od2RhdGEgPSBOVUxMOworfQorCitzdGF0aWMgaW50IEZCX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWlmICggc3dpdGNoZWRfYXdheSApIHsKKwkJcmV0dXJuIC0yOyAvKiBubyBoYXJkd2FyZSBhY2Nlc3MgKi8KKwl9CisJaWYgKCBzdXJmYWNlID09IHRoaXMtPnNjcmVlbiApIHsKKwkJU0RMX211dGV4UChod19sb2NrKTsKKwkJaWYgKCBGQl9Jc1N1cmZhY2VCdXN5KHN1cmZhY2UpICkgeworCQkJRkJfV2FpdEJ1c3lTdXJmYWNlcyh0aGlzKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICggRkJfSXNTdXJmYWNlQnVzeShzdXJmYWNlKSApIHsKKwkJCUZCX1dhaXRCdXN5U3VyZmFjZXModGhpcyk7CisJCX0KKwl9CisJcmV0dXJuKDApOworfQorc3RhdGljIHZvaWQgRkJfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlpZiAoIHN1cmZhY2UgPT0gdGhpcy0+c2NyZWVuICkgeworCQlTRExfbXV0ZXhWKGh3X2xvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgRkJfV2FpdFZCTChfVEhJUykKK3sKKyNpZmRlZiBGQklPV0FJVFJFVFJBQ0UgLyogSGVoZWgsIHRoaXMgZGlkbid0IG1ha2UgaXQgaW50byB0aGUgbWFpbiBrZXJuZWwgKi8KKwlpb2N0bChjb25zb2xlX2ZkLCBGQklPV0FJVFJFVFJBQ0UsIDApOworI2VuZGlmCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBGQl9XYWl0SWRsZShfVEhJUykKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgRkJfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaWYgKCBzd2l0Y2hlZF9hd2F5ICkgeworCQlyZXR1cm4gLTI7IC8qIG5vIGhhcmR3YXJlIGFjY2VzcyAqLworCX0KKworCS8qIFdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UgYW5kIHRoZW4gZmxpcCBkaXNwbGF5ICovCisJY2FjaGVfdmluZm8ueW9mZnNldCA9IGZsaXBfcGFnZSpzdXJmYWNlLT5oOworCWlmICggRkJfSXNTdXJmYWNlQnVzeSh0aGlzLT5zY3JlZW4pICkgeworCQlGQl9XYWl0QnVzeVN1cmZhY2VzKHRoaXMpOworCX0KKwl3YWl0X3ZibCh0aGlzKTsKKwlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9QQU5fRElTUExBWSwgJmNhY2hlX3ZpbmZvKSA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiaW9jdGwoRkJJT1BBTl9ESVNQTEFZKSBmYWlsZWQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJZmxpcF9wYWdlID0gIWZsaXBfcGFnZTsKKworCXN1cmZhY2UtPnBpeGVscyA9IGZsaXBfYWRkcmVzc1tmbGlwX3BhZ2VdOworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgRkJfYmxpdDE2KFVpbnQ4ICpieXRlX3NyY19wb3MsIGludCBzcmNfcmlnaHRfZGVsdGEsIGludCBzcmNfZG93bl9kZWx0YSwKKwkJVWludDggKmJ5dGVfZHN0X3BvcywgaW50IGRzdF9saW5lYnl0ZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlpbnQgdzsKKwlVaW50MTYgKnNyY19wb3MgPSAoVWludDE2ICopYnl0ZV9zcmNfcG9zOworCVVpbnQxNiAqZHN0X3BvcyA9IChVaW50MTYgKilieXRlX2RzdF9wb3M7CisKKwl3aGlsZSAoaGVpZ2h0KSB7CisJCVVpbnQxNiAqc3JjID0gc3JjX3BvczsKKwkJVWludDE2ICpkc3QgPSBkc3RfcG9zOworCQlmb3IgKHcgPSB3aWR0aDsgdyAhPSAwOyB3LS0pIHsKKwkJCSpkc3QgPSAqc3JjOworCQkJc3JjICs9IHNyY19yaWdodF9kZWx0YTsKKwkJCWRzdCsrOworCQl9CisJCWRzdF9wb3MgPSAoVWludDE2ICopKChVaW50OCAqKWRzdF9wb3MgKyBkc3RfbGluZWJ5dGVzKTsKKwkJc3JjX3BvcyArPSBzcmNfZG93bl9kZWx0YTsKKwkJaGVpZ2h0LS07CisJfQorfQorCisjZGVmaW5lIEJMT0NLU0laRV9XIDMyCisjZGVmaW5lIEJMT0NLU0laRV9IIDMyCisKK3N0YXRpYyB2b2lkIEZCX2JsaXQxNmJsb2NrZWQoVWludDggKmJ5dGVfc3JjX3BvcywgaW50IHNyY19yaWdodF9kZWx0YSwgaW50IHNyY19kb3duX2RlbHRhLCAKKwkJVWludDggKmJ5dGVfZHN0X3BvcywgaW50IGRzdF9saW5lYnl0ZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlpbnQgdzsKKwlVaW50MTYgKnNyY19wb3MgPSAoVWludDE2ICopYnl0ZV9zcmNfcG9zOworCVVpbnQxNiAqZHN0X3BvcyA9IChVaW50MTYgKilieXRlX2RzdF9wb3M7CisKKwl3aGlsZSAoaGVpZ2h0ID4gMCkgeworCQlVaW50MTYgKnNyYyA9IHNyY19wb3M7CisJCVVpbnQxNiAqZHN0ID0gZHN0X3BvczsKKwkJZm9yICh3ID0gd2lkdGg7IHcgPiAwOyB3IC09IEJMT0NLU0laRV9XKSB7CisJCQlGQl9ibGl0MTYoKFVpbnQ4ICopc3JjLAorCQkJCQlzcmNfcmlnaHRfZGVsdGEsCisJCQkJCXNyY19kb3duX2RlbHRhLAorCQkJCQkoVWludDggKilkc3QsCisJCQkJCWRzdF9saW5lYnl0ZXMsCisJCQkJCW1pbih3LCBCTE9DS1NJWkVfVyksCisJCQkJCW1pbihoZWlnaHQsIEJMT0NLU0laRV9IKSk7CisJCQlzcmMgKz0gc3JjX3JpZ2h0X2RlbHRhICogQkxPQ0tTSVpFX1c7CisJCQlkc3QgKz0gQkxPQ0tTSVpFX1c7CisJCX0KKwkJZHN0X3BvcyA9IChVaW50MTYgKikoKFVpbnQ4ICopZHN0X3BvcyArIGRzdF9saW5lYnl0ZXMgKiBCTE9DS1NJWkVfSCk7CisJCXNyY19wb3MgKz0gc3JjX2Rvd25fZGVsdGEgKiBCTE9DS1NJWkVfSDsKKwkJaGVpZ2h0IC09IEJMT0NLU0laRV9IOworCX0KK30KKworc3RhdGljIHZvaWQgRkJfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKwlpbnQgd2lkdGggPSBjYWNoZV92aW5mby54cmVzOworCWludCBoZWlnaHQgPSBjYWNoZV92aW5mby55cmVzOworCWludCBieXRlc19wZXJfcGl4ZWwgPSAoY2FjaGVfdmluZm8uYml0c19wZXJfcGl4ZWwgKyA3KSAvIDg7CisJaW50IGk7CisKKwlpZiAoIXNoYWRvd19mYikgeworCQkvKiBUaGUgYXBwbGljYXRpb24gaXMgYWxyZWFkeSB1cGRhdGluZyB0aGUgdmlzaWJsZSB2aWRlbyBtZW1vcnkgKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChjYWNoZV92aW5mby5iaXRzX3Blcl9waXhlbCAhPSAxNikgeworCQlTRExfU2V0RXJyb3IoIlNoYWRvdyBjb3B5IG9ubHkgaW1wbGVtZW50ZWQgZm9yIDE2IGJwcCIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bXJlY3RzOyBpKyspIHsKKwkJaW50IHgxLCB5MSwgeDIsIHkyOworCQlpbnQgc2NyX3gxLCBzY3JfeTEsIHNjcl94Miwgc2NyX3kyOworCQlpbnQgc2hhX3gxLCBzaGFfeTE7CisJCWludCBzaGFkb3dfcmlnaHRfZGVsdGE7ICAvKiBBZGRyZXNzIGNoYW5nZSB3aGVuIG1vdmluZyByaWdodCBpbiBkZXN0ICovCisJCWludCBzaGFkb3dfZG93bl9kZWx0YTsgICAvKiBBZGRyZXNzIGNoYW5nZSB3aGVuIG1vdmluZyBkb3duIGluIGRlc3QgKi8KKwkJY2hhciAqc3JjX3N0YXJ0OworCQljaGFyICpkc3Rfc3RhcnQ7CisKKwkJeDEgPSByZWN0c1tpXS54OyAKKwkJeTEgPSByZWN0c1tpXS55OworCQl4MiA9IHgxICsgcmVjdHNbaV0udzsgCisJCXkyID0geTEgKyByZWN0c1tpXS5oOworCisJCWlmICh4MSA8IDApIHsKKwkJCXgxID0gMDsKKwkJfSBlbHNlIGlmICh4MSA+IHdpZHRoKSB7CisJCQl4MSA9IHdpZHRoOworCQl9CisJCWlmICh4MiA8IDApIHsKKwkJCXgyID0gMDsKKwkJfSBlbHNlIGlmICh4MiA+IHdpZHRoKSB7CisJCQl4MiA9IHdpZHRoOworCQl9CisJCWlmICh5MSA8IDApIHsKKwkJCXkxID0gMDsKKwkJfSBlbHNlIGlmICh5MSA+IGhlaWdodCkgeworCQkJeTEgPSBoZWlnaHQ7CisJCX0KKwkJaWYgKHkyIDwgMCkgeworCQkJeTIgPSAwOworCQl9IGVsc2UgaWYgKHkyID4gaGVpZ2h0KSB7CisJCQl5MiA9IGhlaWdodDsKKwkJfQorCQlpZiAoeDIgPD0geDEgfHwgeTIgPD0geTEpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChyb3RhdGUpIHsKKwkJCWNhc2UgRkJDT05fUk9UQVRFX05PTkU6CisJCQkJc2hhX3gxID0gc2NyX3gxID0geDE7CisJCQkJc2hhX3kxID0gc2NyX3kxID0geTE7CisJCQkJc2NyX3gyID0geDI7CisJCQkJc2NyX3kyID0geTI7CisJCQkJc2hhZG93X3JpZ2h0X2RlbHRhID0gMTsKKwkJCQlzaGFkb3dfZG93bl9kZWx0YSA9IHdpZHRoOworCQkJCWJyZWFrOworCQkJY2FzZSBGQkNPTl9ST1RBVEVfQ0NXOgorCQkJCXNjcl94MSA9IHkxOworCQkJCXNjcl95MSA9IHdpZHRoIC0geDI7CisJCQkJc2NyX3gyID0geTI7CisJCQkJc2NyX3kyID0gd2lkdGggLSB4MTsKKwkJCQlzaGFfeDEgPSB4MiAtIDE7CisJCQkJc2hhX3kxID0geTE7CisJCQkJc2hhZG93X3JpZ2h0X2RlbHRhID0gd2lkdGg7CisJCQkJc2hhZG93X2Rvd25fZGVsdGEgPSAtMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkJDT05fUk9UQVRFX1VEOgorCQkJCXNjcl94MSA9IHdpZHRoIC0geDI7CisJCQkJc2NyX3kxID0gaGVpZ2h0IC0geTI7CisJCQkJc2NyX3gyID0gd2lkdGggLSB4MTsKKwkJCQlzY3JfeTIgPSBoZWlnaHQgLSB5MTsKKwkJCQlzaGFfeDEgPSB4MiAtIDE7CisJCQkJc2hhX3kxID0geTIgLSAxOworCQkJCXNoYWRvd19yaWdodF9kZWx0YSA9IC0xOworCQkJCXNoYWRvd19kb3duX2RlbHRhID0gLXdpZHRoOworCQkJCWJyZWFrOworCQkJY2FzZSBGQkNPTl9ST1RBVEVfQ1c6CisJCQkJc2NyX3gxID0gaGVpZ2h0IC0geTI7CisJCQkJc2NyX3kxID0geDE7CisJCQkJc2NyX3gyID0gaGVpZ2h0IC0geTE7CisJCQkJc2NyX3kyID0geDI7CisJCQkJc2hhX3gxID0geDE7CisJCQkJc2hhX3kxID0geTIgLSAxOworCQkJCXNoYWRvd19yaWdodF9kZWx0YSA9IC13aWR0aDsKKwkJCQlzaGFkb3dfZG93bl9kZWx0YSA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVNETF9TZXRFcnJvcigiVW5rbm93biByb3RhdGlvbiIpOworCQkJCXJldHVybjsKKwkJfQorCisJCXNyY19zdGFydCA9IHNoYWRvd19tZW0gKworCQkJKHNoYV95MSAqIHdpZHRoICsgc2hhX3gxKSAqIGJ5dGVzX3Blcl9waXhlbDsKKwkJZHN0X3N0YXJ0ID0gbWFwcGVkX21lbSArIG1hcHBlZF9vZmZzZXQgKyBzY3JfeTEgKiBwaHlzbGluZWJ5dGVzICsgCisJCQlzY3JfeDEgKiBieXRlc19wZXJfcGl4ZWw7CisKKwkJYmxpdEZ1bmMoKFVpbnQ4ICopIHNyY19zdGFydCwKKwkJCQlzaGFkb3dfcmlnaHRfZGVsdGEsIAorCQkJCXNoYWRvd19kb3duX2RlbHRhLCAKKwkJCQkoVWludDggKikgZHN0X3N0YXJ0LAorCQkJCXBoeXNsaW5lYnl0ZXMsCisJCQkJc2NyX3gyIC0gc2NyX3gxLAorCQkJCXNjcl95MiAtIHNjcl95MSk7CisJfQorfQorCisjaWZkZWYgVkdBMTZfRkJDT05fU1VQUE9SVAorLyogQ29kZSBhZGFwdGVkIHdpdGggdGhhbmtzIGZyb20gdGhlIFhGcmVlODYgVkdBMTYgZHJpdmVyISA6KSAqLworI2RlZmluZSB3cml0ZUdyKGluZGV4LCB2YWx1ZSkgXAorb3V0YihpbmRleCwgMHgzQ0UpOyAgICAgICAgICAgXAorb3V0Yih2YWx1ZSwgMHgzQ0YpOworI2RlZmluZSB3cml0ZVNlcShpbmRleCwgdmFsdWUpIFwKK291dGIoaW5kZXgsIDB4M0M0KTsgICAgICAgICAgICBcCitvdXRiKHZhbHVlLCAweDNDNSk7CisKK3N0YXRpYyB2b2lkIEZCX1ZHQTE2VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKyAgICBTRExfU3VyZmFjZSAqc2NyZWVuOworICAgIGludCB3aWR0aCwgaGVpZ2h0LCBGQlBpdGNoLCBsZWZ0LCBpLCBqLCBTUkNQaXRjaCwgcGhhc2U7CisgICAgcmVnaXN0ZXIgVWludDMyIG07CisgICAgVWludDggIHMxLCBzMiwgczMsIHM0OworICAgIFVpbnQzMiAqc3JjLCAqc3JjUHRyOworICAgIFVpbnQ4ICAqZHN0LCAqZHN0UHRyOworCisgICAgaWYgKCBzd2l0Y2hlZF9hd2F5ICkgeworICAgICAgICByZXR1cm47IC8qIG5vIGhhcmR3YXJlIGFjY2VzcyAqLworICAgIH0KKworICAgIHNjcmVlbiA9IHRoaXMtPnNjcmVlbjsKKyAgICBGQlBpdGNoID0gc2NyZWVuLT53ID4+IDM7CisgICAgU1JDUGl0Y2ggPSBzY3JlZW4tPnBpdGNoID4+IDI7CisKKyAgICB3cml0ZUdyKDB4MDMsIDB4MDApOworICAgIHdyaXRlR3IoMHgwNSwgMHgwMCk7CisgICAgd3JpdGVHcigweDAxLCAweDAwKTsKKyAgICB3cml0ZUdyKDB4MDgsIDB4RkYpOworCisgICAgd2hpbGUobnVtcmVjdHMtLSkgeworCWxlZnQgPSByZWN0cy0+eCAmIH43OworICAgICAgICB3aWR0aCA9IChyZWN0cy0+dyArIDcpID4+IDM7CisgICAgICAgIGhlaWdodCA9IHJlY3RzLT5oOworICAgICAgICBzcmMgPSAoVWludDMyKilzY3JlZW4tPnBpeGVscyArIChyZWN0cy0+eSAqIFNSQ1BpdGNoKSArIChsZWZ0ID4+IDIpOyAKKyAgICAgICAgZHN0ID0gKFVpbnQ4KiltYXBwZWRfbWVtICsgKHJlY3RzLT55ICogRkJQaXRjaCkgKyAobGVmdCA+PiAzKTsKKworCWlmKChwaGFzZSA9IChsb25nKWRzdCAmIDNMKSkgeworCSAgICBwaGFzZSA9IDQgLSBwaGFzZTsKKwkgICAgaWYocGhhc2UgPiB3aWR0aCkgcGhhc2UgPSB3aWR0aDsKKwkgICAgd2lkdGggLT0gcGhhc2U7CisJfQorCisgICAgICAgIHdoaWxlKGhlaWdodC0tKSB7CisJICAgIHdyaXRlU2VxKDB4MDIsIDEgPDwgMCk7CisJICAgIGRzdFB0ciA9IGRzdDsKKwkgICAgc3JjUHRyID0gc3JjOworCSAgICBpID0gd2lkdGg7CisJICAgIGogPSBwaGFzZTsKKwkgICAgd2hpbGUoai0tKSB7CisJCW0gPSAoc3JjUHRyWzFdICYgMHgwMTAxMDEwMSkgfCAoKHNyY1B0clswXSAmIDB4MDEwMTAxMDEpIDw8IDQpOworIAkJKmRzdFB0cisrID0gKG0gPj4gMjQpIHwgKG0gPj4gMTUpIHwgKG0gPj4gNikgfCAobSA8PCAzKTsKKwkJc3JjUHRyICs9IDI7CisJICAgIH0KKwkgICAgd2hpbGUoaSA+PSA0KSB7CisJCW0gPSAoc3JjUHRyWzFdICYgMHgwMTAxMDEwMSkgfCAoKHNyY1B0clswXSAmIDB4MDEwMTAxMDEpIDw8IDQpOworIAkJczEgPSAobSA+PiAyNCkgfCAobSA+PiAxNSkgfCAobSA+PiA2KSB8IChtIDw8IDMpOworCQltID0gKHNyY1B0clszXSAmIDB4MDEwMTAxMDEpIHwgKChzcmNQdHJbMl0gJiAweDAxMDEwMTAxKSA8PCA0KTsKKyAJCXMyID0gKG0gPj4gMjQpIHwgKG0gPj4gMTUpIHwgKG0gPj4gNikgfCAobSA8PCAzKTsKKwkJbSA9IChzcmNQdHJbNV0gJiAweDAxMDEwMTAxKSB8ICgoc3JjUHRyWzRdICYgMHgwMTAxMDEwMSkgPDwgNCk7CisgCQlzMyA9IChtID4+IDI0KSB8IChtID4+IDE1KSB8IChtID4+IDYpIHwgKG0gPDwgMyk7CisJCW0gPSAoc3JjUHRyWzddICYgMHgwMTAxMDEwMSkgfCAoKHNyY1B0cls2XSAmIDB4MDEwMTAxMDEpIDw8IDQpOworIAkJczQgPSAobSA+PiAyNCkgfCAobSA+PiAxNSkgfCAobSA+PiA2KSB8IChtIDw8IDMpOworCQkqKChVaW50MzIqKWRzdFB0cikgPSBzMSB8IChzMiA8PCA4KSB8IChzMyA8PCAxNikgfCAoczQgPDwgMjQpOworCQlzcmNQdHIgKz0gODsKKwkJZHN0UHRyICs9IDQ7CisJCWkgLT0gNDsKKwkgICAgfQorCSAgICB3aGlsZShpLS0pIHsKKwkJbSA9IChzcmNQdHJbMV0gJiAweDAxMDEwMTAxKSB8ICgoc3JjUHRyWzBdICYgMHgwMTAxMDEwMSkgPDwgNCk7CisgCQkqZHN0UHRyKysgPSAobSA+PiAyNCkgfCAobSA+PiAxNSkgfCAobSA+PiA2KSB8IChtIDw8IDMpOworCQlzcmNQdHIgKz0gMjsKKwkgICAgfQorCisJICAgIHdyaXRlU2VxKDB4MDIsIDEgPDwgMSk7CisJICAgIGRzdFB0ciA9IGRzdDsKKwkgICAgc3JjUHRyID0gc3JjOworCSAgICBpID0gd2lkdGg7CisJICAgIGogPSBwaGFzZTsKKwkgICAgd2hpbGUoai0tKSB7CisJCW0gPSAoc3JjUHRyWzFdICYgMHgwMjAyMDIwMikgfCAoKHNyY1B0clswXSAmIDB4MDIwMjAyMDIpIDw8IDQpOworIAkJKmRzdFB0cisrID0gKG0gPj4gMjUpIHwgKG0gPj4gMTYpIHwgKG0gPj4gNykgfCAobSA8PCAyKTsKKwkJc3JjUHRyICs9IDI7CisJICAgIH0KKwkgICAgd2hpbGUoaSA+PSA0KSB7CisJCW0gPSAoc3JjUHRyWzFdICYgMHgwMjAyMDIwMikgfCAoKHNyY1B0clswXSAmIDB4MDIwMjAyMDIpIDw8IDQpOworIAkJczEgPSAobSA+PiAyNSkgfCAobSA+PiAxNikgfCAobSA+PiA3KSB8IChtIDw8IDIpOworCQltID0gKHNyY1B0clszXSAmIDB4MDIwMjAyMDIpIHwgKChzcmNQdHJbMl0gJiAweDAyMDIwMjAyKSA8PCA0KTsKKyAJCXMyID0gKG0gPj4gMjUpIHwgKG0gPj4gMTYpIHwgKG0gPj4gNykgfCAobSA8PCAyKTsKKwkJbSA9IChzcmNQdHJbNV0gJiAweDAyMDIwMjAyKSB8ICgoc3JjUHRyWzRdICYgMHgwMjAyMDIwMikgPDwgNCk7CisgCQlzMyA9IChtID4+IDI1KSB8IChtID4+IDE2KSB8IChtID4+IDcpIHwgKG0gPDwgMik7CisJCW0gPSAoc3JjUHRyWzddICYgMHgwMjAyMDIwMikgfCAoKHNyY1B0cls2XSAmIDB4MDIwMjAyMDIpIDw8IDQpOworIAkJczQgPSAobSA+PiAyNSkgfCAobSA+PiAxNikgfCAobSA+PiA3KSB8IChtIDw8IDIpOworCQkqKChVaW50MzIqKWRzdFB0cikgPSBzMSB8IChzMiA8PCA4KSB8IChzMyA8PCAxNikgfCAoczQgPDwgMjQpOworCQlzcmNQdHIgKz0gODsKKwkJZHN0UHRyICs9IDQ7CisJCWkgLT0gNDsKKwkgICAgfQorCSAgICB3aGlsZShpLS0pIHsKKwkJbSA9IChzcmNQdHJbMV0gJiAweDAyMDIwMjAyKSB8ICgoc3JjUHRyWzBdICYgMHgwMjAyMDIwMikgPDwgNCk7CisgCQkqZHN0UHRyKysgPSAobSA+PiAyNSkgfCAobSA+PiAxNikgfCAobSA+PiA3KSB8IChtIDw8IDIpOworCQlzcmNQdHIgKz0gMjsKKwkgICAgfQorCisJICAgIHdyaXRlU2VxKDB4MDIsIDEgPDwgMik7CisJICAgIGRzdFB0ciA9IGRzdDsKKwkgICAgc3JjUHRyID0gc3JjOworCSAgICBpID0gd2lkdGg7CisJICAgIGogPSBwaGFzZTsKKwkgICAgd2hpbGUoai0tKSB7CisJCW0gPSAoc3JjUHRyWzFdICYgMHgwNDA0MDQwNCkgfCAoKHNyY1B0clswXSAmIDB4MDQwNDA0MDQpIDw8IDQpOworIAkJKmRzdFB0cisrID0gKG0gPj4gMjYpIHwgKG0gPj4gMTcpIHwgKG0gPj4gOCkgfCAobSA8PCAxKTsKKwkJc3JjUHRyICs9IDI7CisJICAgIH0KKwkgICAgd2hpbGUoaSA+PSA0KSB7CisJCW0gPSAoc3JjUHRyWzFdICYgMHgwNDA0MDQwNCkgfCAoKHNyY1B0clswXSAmIDB4MDQwNDA0MDQpIDw8IDQpOworIAkJczEgPSAobSA+PiAyNikgfCAobSA+PiAxNykgfCAobSA+PiA4KSB8IChtIDw8IDEpOworCQltID0gKHNyY1B0clszXSAmIDB4MDQwNDA0MDQpIHwgKChzcmNQdHJbMl0gJiAweDA0MDQwNDA0KSA8PCA0KTsKKyAJCXMyID0gKG0gPj4gMjYpIHwgKG0gPj4gMTcpIHwgKG0gPj4gOCkgfCAobSA8PCAxKTsKKwkJbSA9IChzcmNQdHJbNV0gJiAweDA0MDQwNDA0KSB8ICgoc3JjUHRyWzRdICYgMHgwNDA0MDQwNCkgPDwgNCk7CisgCQlzMyA9IChtID4+IDI2KSB8IChtID4+IDE3KSB8IChtID4+IDgpIHwgKG0gPDwgMSk7CisJCW0gPSAoc3JjUHRyWzddICYgMHgwNDA0MDQwNCkgfCAoKHNyY1B0cls2XSAmIDB4MDQwNDA0MDQpIDw8IDQpOworIAkJczQgPSAobSA+PiAyNikgfCAobSA+PiAxNykgfCAobSA+PiA4KSB8IChtIDw8IDEpOworCQkqKChVaW50MzIqKWRzdFB0cikgPSBzMSB8IChzMiA8PCA4KSB8IChzMyA8PCAxNikgfCAoczQgPDwgMjQpOworCQlzcmNQdHIgKz0gODsKKwkJZHN0UHRyICs9IDQ7CisJCWkgLT0gNDsKKwkgICAgfQorCSAgICB3aGlsZShpLS0pIHsKKwkJbSA9IChzcmNQdHJbMV0gJiAweDA0MDQwNDA0KSB8ICgoc3JjUHRyWzBdICYgMHgwNDA0MDQwNCkgPDwgNCk7CisgCQkqZHN0UHRyKysgPSAobSA+PiAyNikgfCAobSA+PiAxNykgfCAobSA+PiA4KSB8IChtIDw8IDEpOworCQlzcmNQdHIgKz0gMjsKKwkgICAgfQorCSAgICAKKwkgICAgd3JpdGVTZXEoMHgwMiwgMSA8PCAzKTsKKwkgICAgZHN0UHRyID0gZHN0OworCSAgICBzcmNQdHIgPSBzcmM7CisJICAgIGkgPSB3aWR0aDsKKwkgICAgaiA9IHBoYXNlOworCSAgICB3aGlsZShqLS0pIHsKKwkJbSA9IChzcmNQdHJbMV0gJiAweDA4MDgwODA4KSB8ICgoc3JjUHRyWzBdICYgMHgwODA4MDgwOCkgPDwgNCk7CisgCQkqZHN0UHRyKysgPSAobSA+PiAyNykgfCAobSA+PiAxOCkgfCAobSA+PiA5KSB8IG07CisJCXNyY1B0ciArPSAyOworCSAgICB9CisJICAgIHdoaWxlKGkgPj0gNCkgeworCQltID0gKHNyY1B0clsxXSAmIDB4MDgwODA4MDgpIHwgKChzcmNQdHJbMF0gJiAweDA4MDgwODA4KSA8PCA0KTsKKyAJCXMxID0gKG0gPj4gMjcpIHwgKG0gPj4gMTgpIHwgKG0gPj4gOSkgfCBtOworCQltID0gKHNyY1B0clszXSAmIDB4MDgwODA4MDgpIHwgKChzcmNQdHJbMl0gJiAweDA4MDgwODA4KSA8PCA0KTsKKyAJCXMyID0gKG0gPj4gMjcpIHwgKG0gPj4gMTgpIHwgKG0gPj4gOSkgfCBtOworCQltID0gKHNyY1B0cls1XSAmIDB4MDgwODA4MDgpIHwgKChzcmNQdHJbNF0gJiAweDA4MDgwODA4KSA8PCA0KTsKKyAJCXMzID0gKG0gPj4gMjcpIHwgKG0gPj4gMTgpIHwgKG0gPj4gOSkgfCBtOworCQltID0gKHNyY1B0cls3XSAmIDB4MDgwODA4MDgpIHwgKChzcmNQdHJbNl0gJiAweDA4MDgwODA4KSA8PCA0KTsKKyAJCXM0ID0gKG0gPj4gMjcpIHwgKG0gPj4gMTgpIHwgKG0gPj4gOSkgfCBtOworCQkqKChVaW50MzIqKWRzdFB0cikgPSBzMSB8IChzMiA8PCA4KSB8IChzMyA8PCAxNikgfCAoczQgPDwgMjQpOworCQlzcmNQdHIgKz0gODsKKwkJZHN0UHRyICs9IDQ7CisJCWkgLT0gNDsKKwkgICAgfQorCSAgICB3aGlsZShpLS0pIHsKKwkJbSA9IChzcmNQdHJbMV0gJiAweDA4MDgwODA4KSB8ICgoc3JjUHRyWzBdICYgMHgwODA4MDgwOCkgPDwgNCk7CisgCQkqZHN0UHRyKysgPSAobSA+PiAyNykgfCAobSA+PiAxOCkgfCAobSA+PiA5KSB8IG07CisJCXNyY1B0ciArPSAyOworCSAgICB9CisKKyAgICAgICAgICAgIGRzdCArPSBGQlBpdGNoOworICAgICAgICAgICAgc3JjICs9IFNSQ1BpdGNoOworICAgICAgICB9CisgICAgICAgIHJlY3RzKys7CisgICAgfQorfQorI2VuZGlmIC8qIFZHQTE2X0ZCQ09OX1NVUFBPUlQgKi8KKwordm9pZCBGQl9TYXZlUGFsZXR0ZVRvKF9USElTLCBpbnQgcGFsZXR0ZV9sZW4sIF9fdTE2ICphcmVhKQoreworCXN0cnVjdCBmYl9jbWFwIGNtYXA7CisKKwljbWFwLnN0YXJ0ID0gMDsKKwljbWFwLmxlbiA9IHBhbGV0dGVfbGVuOworCWNtYXAucmVkID0gJmFyZWFbMCpwYWxldHRlX2xlbl07CisJY21hcC5ncmVlbiA9ICZhcmVhWzEqcGFsZXR0ZV9sZW5dOworCWNtYXAuYmx1ZSA9ICZhcmVhWzIqcGFsZXR0ZV9sZW5dOworCWNtYXAudHJhbnNwID0gTlVMTDsKKwlpb2N0bChjb25zb2xlX2ZkLCBGQklPR0VUQ01BUCwgJmNtYXApOworfQorCit2b2lkIEZCX1Jlc3RvcmVQYWxldHRlRnJvbShfVEhJUywgaW50IHBhbGV0dGVfbGVuLCBfX3UxNiAqYXJlYSkKK3sKKwlzdHJ1Y3QgZmJfY21hcCBjbWFwOworCisJY21hcC5zdGFydCA9IDA7CisJY21hcC5sZW4gPSBwYWxldHRlX2xlbjsKKwljbWFwLnJlZCA9ICZhcmVhWzAqcGFsZXR0ZV9sZW5dOworCWNtYXAuZ3JlZW4gPSAmYXJlYVsxKnBhbGV0dGVfbGVuXTsKKwljbWFwLmJsdWUgPSAmYXJlYVsyKnBhbGV0dGVfbGVuXTsKKwljbWFwLnRyYW5zcCA9IE5VTEw7CisJaW9jdGwoY29uc29sZV9mZCwgRkJJT1BVVENNQVAsICZjbWFwKTsKK30KKworc3RhdGljIHZvaWQgRkJfU2F2ZVBhbGV0dGUoX1RISVMsIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2aW5mbykKK3sKKwlpbnQgaTsKKworCS8qIFNhdmUgaGFyZHdhcmUgcGFsZXR0ZSwgaWYgbmVlZGVkICovCisJaWYgKCBmaW5mby0+dmlzdWFsID09IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiApIHsKKwkJc2F2ZWRfY21hcGxlbiA9IDE8PHZpbmZvLT5iaXRzX3Blcl9waXhlbDsKKwkJc2F2ZWRfY21hcD0oX191MTYgKilTRExfbWFsbG9jKDMqc2F2ZWRfY21hcGxlbipzaXplb2YoKnNhdmVkX2NtYXApKTsKKwkJaWYgKCBzYXZlZF9jbWFwICE9IE5VTEwgKSB7CisJCQlGQl9TYXZlUGFsZXR0ZVRvKHRoaXMsIHNhdmVkX2NtYXBsZW4sIHNhdmVkX2NtYXApOworCQl9CisJfQorCisJLyogQWRkZWQgc3VwcG9ydCBmb3IgRkJfVklTVUFMX0RJUkVDVENPTE9SLgorCSAgIFdpdGggdGhpcyBtb2RlIHBpeGVsIGluZm9ybWF0aW9uIGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBwYWxldHRlLi4uCisJICAgTmVhdCBmYWRpbmcgYW5kIGdhbW1hIGNvcnJlY3Rpb24gZWZmZWN0cyBjYW4gYmUgaGFkIGJ5IHNpbXBseQorCSAgIGZvb2xpbmcgYXJvdW5kIHdpdGggdGhlIHBhbGV0dGUgaW5zdGVhZCBvZiBjaGFuZ2luZyB0aGUgcGl4ZWwKKwkgICB2YWx1ZXMgdGhlbXNlbHZlcy4uLiBWZXJ5IG5lYXQhCisKKwkgICBBZGFtIE1leWVyb3dpdHogMS8xOS8yMDAwCisJICAgYW1leWVyb3dAb3B0b25saW5lLmNvbQorCSovCisJaWYgKCBmaW5mby0+dmlzdWFsID09IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUiApIHsKKwkJX191MTYgbmV3X2VudHJpZXNbMyoyNTZdOworCisJCS8qIFNhdmUgdGhlIGNvbG9ybWFwICovCisJCXNhdmVkX2NtYXBsZW4gPSAyNTY7CisJCXNhdmVkX2NtYXA9KF9fdTE2ICopU0RMX21hbGxvYygzKnNhdmVkX2NtYXBsZW4qc2l6ZW9mKCpzYXZlZF9jbWFwKSk7CisJCWlmICggc2F2ZWRfY21hcCAhPSBOVUxMICkgeworCQkJRkJfU2F2ZVBhbGV0dGVUbyh0aGlzLCBzYXZlZF9jbWFwbGVuLCBzYXZlZF9jbWFwKTsKKwkJfQorCisJCS8qIEFsbG9jYXRlIG5ldyBpZGVudGl0eSBjb2xvcm1hcCAqLworCQlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7CisJICAgICAgCQluZXdfZW50cmllc1soMCoyNTYpK2ldID0KKwkJCW5ld19lbnRyaWVzWygxKjI1NikraV0gPQorCQkJbmV3X2VudHJpZXNbKDIqMjU2KStpXSA9IChpPDw4KXxpOworCQl9CisJCUZCX1Jlc3RvcmVQYWxldHRlRnJvbSh0aGlzLCAyNTYsIG5ld19lbnRyaWVzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEZCX1Jlc3RvcmVQYWxldHRlKF9USElTKQoreworCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBhbGV0dGUgKi8KKwlpZiAoIHNhdmVkX2NtYXAgKSB7CisJCUZCX1Jlc3RvcmVQYWxldHRlRnJvbSh0aGlzLCBzYXZlZF9jbWFwbGVuLCBzYXZlZF9jbWFwKTsKKwkJU0RMX2ZyZWUoc2F2ZWRfY21hcCk7CisJCXNhdmVkX2NtYXAgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBGQl9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisJaW50IGk7CisJX191MTYgclsyNTZdOworCV9fdTE2IGdbMjU2XTsKKwlfX3UxNiBiWzI1Nl07CisJc3RydWN0IGZiX2NtYXAgY21hcDsKKworCS8qIFNldCB1cCB0aGUgY29sb3JtYXAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7CisJCXJbaV0gPSBjb2xvcnNbaV0uciA8PCA4OworCQlnW2ldID0gY29sb3JzW2ldLmcgPDwgODsKKwkJYltpXSA9IGNvbG9yc1tpXS5iIDw8IDg7CisJfQorCWNtYXAuc3RhcnQgPSBmaXJzdGNvbG9yOworCWNtYXAubGVuID0gbmNvbG9yczsKKwljbWFwLnJlZCA9IHI7CisJY21hcC5ncmVlbiA9IGc7CisJY21hcC5ibHVlID0gYjsKKwljbWFwLnRyYW5zcCA9IE5VTEw7CisKKwlpZiggKGlvY3RsKGNvbnNvbGVfZmQsIEZCSU9QVVRDTUFQLCAmY21hcCkgPCAwKSB8fAorCSAgICAhKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFKSApIHsKKwkgICAgICAgIGNvbG9ycyA9IHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnM7CisJCW5jb2xvcnMgPSB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsKKwkJY21hcC5zdGFydCA9IDA7CisJCWNtYXAubGVuID0gbmNvbG9yczsKKwkJU0RMX21lbXNldChyLCAwLCBzaXplb2YocikpOworCQlTRExfbWVtc2V0KGcsIDAsIHNpemVvZihnKSk7CisJCVNETF9tZW1zZXQoYiwgMCwgc2l6ZW9mKGIpKTsKKwkJaWYgKCBpb2N0bChjb25zb2xlX2ZkLCBGQklPR0VUQ01BUCwgJmNtYXApID09IDAgKSB7CisJCQlmb3IgKCBpPW5jb2xvcnMtMTsgaT49MDsgLS1pICkgeworCQkJCWNvbG9yc1tpXS5yID0gKHJbaV0+PjgpOworCQkJCWNvbG9yc1tpXS5nID0gKGdbaV0+PjgpOworCQkJCWNvbG9yc1tpXS5iID0gKGJbaV0+PjgpOworCQkJfQorCQl9CisJCXJldHVybigwKTsKKwl9CisJcmV0dXJuKDEpOworfQorCisvKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKKyAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KKyovCitzdGF0aWMgdm9pZCBGQl9WaWRlb1F1aXQoX1RISVMpCit7CisJaW50IGksIGo7CisKKwlpZiAoIHRoaXMtPnNjcmVlbiApIHsKKwkJLyogQ2xlYXIgc2NyZWVuIGFuZCB0ZWxsIFNETCBub3QgdG8gZnJlZSB0aGUgcGl4ZWxzICovCisKKwkJY29uc3QgY2hhciAqZG9udENsZWFyUGl4ZWxzID0gU0RMX2dldGVudigiU0RMX0ZCQ09OX0RPTlRfQ0xFQVIiKTsKKworCQkvKiBJZiB0aGUgZnJhbWVidWZmZXIgaXMgbm90IHRvIGJlIGNsZWFyZWQsIG1ha2Ugc3VyZSB0aGF0IHdlIHdvbid0CisJCSAqIGRpc3BsYXkgdGhlIHByZXZpb3VzIGZyYW1lIHdoZW4gZGlzYWJsaW5nIGRvdWJsZSBidWZmZXJpbmcuICovCisJCWlmICggZG9udENsZWFyUGl4ZWxzICYmIGZsaXBfcGFnZSA9PSAwICkgeworCQkJU0RMX21lbWNweShmbGlwX2FkZHJlc3NbMF0sIGZsaXBfYWRkcmVzc1sxXSwgdGhpcy0+c2NyZWVuLT5waXRjaCAqIHRoaXMtPnNjcmVlbi0+aCk7CisJCX0KKworCQlpZiAoICFkb250Q2xlYXJQaXhlbHMgJiYgdGhpcy0+c2NyZWVuLT5waXhlbHMgJiYgRkJfSW5HcmFwaGljc01vZGUodGhpcykgKSB7CisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX2lhNjRfXykJLyogU0lHQlVTIHdoZW4gdXNpbmcgU0RMX21lbXNldCgpID8/ICovCisJCQlVaW50OCAqcm93cCA9IChVaW50OCAqKXRoaXMtPnNjcmVlbi0+cGl4ZWxzOworCQkJaW50IGxlZnQgPSB0aGlzLT5zY3JlZW4tPnBpdGNoKnRoaXMtPnNjcmVlbi0+aDsKKwkJCXdoaWxlICggbGVmdC0tICkgeyAqcm93cCsrID0gMDsgfQorI2Vsc2UKKwkJCVNETF9tZW1zZXQodGhpcy0+c2NyZWVuLT5waXhlbHMsMCx0aGlzLT5zY3JlZW4tPmgqdGhpcy0+c2NyZWVuLT5waXRjaCk7CisjZW5kaWYKKwkJfQorCQkvKiBUaGlzIHRlc3QgZmFpbHMgd2hlbiB1c2luZyB0aGUgVkdBMTYgc2hhZG93IG1lbW9yeSAqLworCQlpZiAoICgoY2hhciAqKXRoaXMtPnNjcmVlbi0+cGl4ZWxzID49IG1hcHBlZF9tZW0pICYmCisJCSAgICAgKChjaGFyICopdGhpcy0+c2NyZWVuLT5waXhlbHMgPCAobWFwcGVkX21lbSttYXBwZWRfbWVtbGVuKSkgKSB7CisJCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBDbGVhciB0aGUgbG9jayBtdXRleCAqLworCWlmICggaHdfbG9jayApIHsKKwkJU0RMX0Rlc3Ryb3lNdXRleChod19sb2NrKTsKKwkJaHdfbG9jayA9IE5VTEw7CisJfQorCisJLyogQ2xlYW4gdXAgZGVmaW5lZCB2aWRlbyBtb2RlcyAqLworCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7CisJCWlmICggU0RMX21vZGVsaXN0W2ldICE9IE5VTEwgKSB7CisJCQlmb3IgKCBqPTA7IFNETF9tb2RlbGlzdFtpXVtqXTsgKytqICkgeworCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXVtqXSk7CisJCQl9CisJCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOworCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKKwkJfQorCX0KKworCS8qIENsZWFuIHVwIHRoZSBtZW1vcnkgYnVja2V0IGxpc3QgKi8KKwlGQl9GcmVlSFdTdXJmYWNlcyh0aGlzKTsKKworCS8qIENsb3NlIGNvbnNvbGUgYW5kIGlucHV0IGZpbGUgZGVzY3JpcHRvcnMgKi8KKwlpZiAoIGNvbnNvbGVfZmQgPiAwICkgeworCQkvKiBVbm1hcCB0aGUgdmlkZW8gZnJhbWVidWZmZXIgYW5kIEkvTyByZWdpc3RlcnMgKi8KKwkJaWYgKCBtYXBwZWRfbWVtICkgeworCQkJbXVubWFwKG1hcHBlZF9tZW0sIG1hcHBlZF9tZW1sZW4pOworCQkJbWFwcGVkX21lbSA9IE5VTEw7CisJCX0KKwkJaWYgKCBtYXBwZWRfaW8gKSB7CisJCQltdW5tYXAobWFwcGVkX2lvLCBtYXBwZWRfaW9sZW4pOworCQkJbWFwcGVkX2lvID0gTlVMTDsKKwkJfQorCisJCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHZpZGVvIG1vZGUgYW5kIHBhbGV0dGUgKi8KKwkJaWYgKCBGQl9JbkdyYXBoaWNzTW9kZSh0aGlzKSApIHsKKwkJCUZCX1Jlc3RvcmVQYWxldHRlKHRoaXMpOworCQkJaW9jdGwoY29uc29sZV9mZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgJnNhdmVkX3ZpbmZvKTsKKwkJfQorCisJCS8qIFdlJ3JlIGFsbCBkb25lIHdpdGggdGhlIGZyYW1lYnVmZmVyICovCisJCWNsb3NlKGNvbnNvbGVfZmQpOworCQljb25zb2xlX2ZkID0gLTE7CisJfQorCUZCX0Nsb3NlTW91c2UodGhpcyk7CisJRkJfQ2xvc2VLZXlib2FyZCh0aGlzKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZidmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vU0RMX2ZidmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQzZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9TRExfZmJ2aWRlby5oCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2ZidmlkZW9faAorI2RlZmluZSBfU0RMX2ZidmlkZW9faAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICJTRExfbXV0ZXguaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpZiBTRExfSU5QVVRfVFNMSUIKKyNpbmNsdWRlICJ0c2xpYi5oIgorI2VuZGlmCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKKwordHlwZWRlZiB2b2lkIEZCX2JpdEJsaXQoCisJCVVpbnQ4ICpzcmNfcG9zLAorCQlpbnQgc3JjX3JpZ2h0X2RlbHRhLAkvKiBwaXhlbHMsIG5vdCBieXRlcyAqLworCQlpbnQgc3JjX2Rvd25fZGVsdGEsCQkvKiBwaXhlbHMsIG5vdCBieXRlcyAqLworCQlVaW50OCAqZHN0X3BvcywKKwkJaW50IGRzdF9saW5lYnl0ZXMsCisJCWludCB3aWR0aCwKKwkJaW50IGhlaWdodCk7CisKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3ZSB1c2UgdG8ga2VlcCB0cmFjayBvZiB2aWRlbyBtZW1vcnkgKi8KK3R5cGVkZWYgc3RydWN0IHZpZG1lbV9idWNrZXQgeworCXN0cnVjdCB2aWRtZW1fYnVja2V0ICpwcmV2OworCWludCB1c2VkOworCWludCBkaXJ0eTsKKwljaGFyICpiYXNlOworCXVuc2lnbmVkIGludCBzaXplOworCXN0cnVjdCB2aWRtZW1fYnVja2V0ICpuZXh0OworfSB2aWRtZW1fYnVja2V0OworCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKKwlpbnQgY29uc29sZV9mZDsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gY2FjaGVfdmluZm87CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHNhdmVkX3ZpbmZvOworCWludCBzYXZlZF9jbWFwbGVuOworCV9fdTE2ICpzYXZlZF9jbWFwOworCisJaW50IGN1cnJlbnRfdnQ7CisJaW50IHNhdmVkX3Z0OworCWludCBrZXlib2FyZF9mZDsKKwlpbnQgc2F2ZWRfa2JkX21vZGU7CisJc3RydWN0IHRlcm1pb3Mgc2F2ZWRfa2JkX3Rlcm1pb3M7CisKKwlpbnQgbW91c2VfZmQ7CisjaWYgU0RMX0lOUFVUX1RTTElCCisJc3RydWN0IHRzZGV2ICp0c19kZXY7CisjZW5kaWYKKworCWNoYXIgKm1hcHBlZF9tZW07CisJY2hhciAqc2hhZG93X21lbTsKKwlpbnQgbWFwcGVkX21lbWxlbjsKKwlpbnQgbWFwcGVkX29mZnNldDsKKwljaGFyICptYXBwZWRfaW87CisJbG9uZyBtYXBwZWRfaW9sZW47CisJaW50IGZsaXBfcGFnZTsKKwljaGFyICpmbGlwX2FkZHJlc3NbMl07CisJaW50IHJvdGF0ZTsKKwlpbnQgc2hhZG93X2ZiOwkJCQkvKiBUZWxscyB3aGV0aGVyIGEgc2hhZG93IGlzIGJlaW5nIHVzZWQuICovCisJRkJfYml0QmxpdCAqYmxpdEZ1bmM7CisJaW50IHBoeXNsaW5lYnl0ZXM7CQkJLyogTGVuZ3RoIG9mIGEgbGluZSBpbiBieXRlcyBpbiBwaHlzaWNhbCBmYiAqLworCisjZGVmaW5lIE5VTV9NT0RFTElTVFMJNAkJLyogOCwgMTYsIDI0LCBhbmQgMzIgYml0cy1wZXItcGl4ZWwgKi8KKwlpbnQgU0RMX251bW1vZGVzW05VTV9NT0RFTElTVFNdOworCVNETF9SZWN0ICoqU0RMX21vZGVsaXN0W05VTV9NT0RFTElTVFNdOworCisJdmlkbWVtX2J1Y2tldCBzdXJmYWNlczsKKwlpbnQgc3VyZmFjZXNfbWVtdG90YWw7CisJaW50IHN1cmZhY2VzX21lbWxlZnQ7CisKKwlTRExfbXV0ZXggKmh3X2xvY2s7CisJaW50IHN3aXRjaGVkX2F3YXk7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHNjcmVlbl92aW5mbzsKKwlVaW50MzIgc2NyZWVuX2FyZWFsZW47CisJVWludDggKnNjcmVlbl9jb250ZW50czsKKwlfX3UxNiAgc2NyZWVuX3BhbGV0dGVbMyoyNTZdOworCisJdm9pZCAoKndhaXRfdmJsKShfVEhJUyk7CisJdm9pZCAoKndhaXRfaWRsZSkoX1RISVMpOworfTsKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBjb25zb2xlX2ZkCQkodGhpcy0+aGlkZGVuLT5jb25zb2xlX2ZkKQorI2RlZmluZSBjdXJyZW50X3Z0CQkodGhpcy0+aGlkZGVuLT5jdXJyZW50X3Z0KQorI2RlZmluZSBzYXZlZF92dAkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfdnQpCisjZGVmaW5lIGtleWJvYXJkX2ZkCQkodGhpcy0+aGlkZGVuLT5rZXlib2FyZF9mZCkKKyNkZWZpbmUgc2F2ZWRfa2JkX21vZGUJCSh0aGlzLT5oaWRkZW4tPnNhdmVkX2tiZF9tb2RlKQorI2RlZmluZSBzYXZlZF9rYmRfdGVybWlvcwkodGhpcy0+aGlkZGVuLT5zYXZlZF9rYmRfdGVybWlvcykKKyNkZWZpbmUgbW91c2VfZmQJCSh0aGlzLT5oaWRkZW4tPm1vdXNlX2ZkKQorI2lmIFNETF9JTlBVVF9UU0xJQgorI2RlZmluZSB0c19kZXYJCQkodGhpcy0+aGlkZGVuLT50c19kZXYpCisjZW5kaWYKKyNkZWZpbmUgY2FjaGVfdmluZm8JCSh0aGlzLT5oaWRkZW4tPmNhY2hlX3ZpbmZvKQorI2RlZmluZSBzYXZlZF92aW5mbwkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfdmluZm8pCisjZGVmaW5lIHNhdmVkX2NtYXBsZW4JCSh0aGlzLT5oaWRkZW4tPnNhdmVkX2NtYXBsZW4pCisjZGVmaW5lIHNhdmVkX2NtYXAJCSh0aGlzLT5oaWRkZW4tPnNhdmVkX2NtYXApCisjZGVmaW5lIG1hcHBlZF9tZW0JCSh0aGlzLT5oaWRkZW4tPm1hcHBlZF9tZW0pCisjZGVmaW5lIHNoYWRvd19tZW0JCSh0aGlzLT5oaWRkZW4tPnNoYWRvd19tZW0pCisjZGVmaW5lIG1hcHBlZF9tZW1sZW4JCSh0aGlzLT5oaWRkZW4tPm1hcHBlZF9tZW1sZW4pCisjZGVmaW5lIG1hcHBlZF9vZmZzZXQJCSh0aGlzLT5oaWRkZW4tPm1hcHBlZF9vZmZzZXQpCisjZGVmaW5lIG1hcHBlZF9pbwkJKHRoaXMtPmhpZGRlbi0+bWFwcGVkX2lvKQorI2RlZmluZSBtYXBwZWRfaW9sZW4JCSh0aGlzLT5oaWRkZW4tPm1hcHBlZF9pb2xlbikKKyNkZWZpbmUgZmxpcF9wYWdlCQkodGhpcy0+aGlkZGVuLT5mbGlwX3BhZ2UpCisjZGVmaW5lIGZsaXBfYWRkcmVzcwkJKHRoaXMtPmhpZGRlbi0+ZmxpcF9hZGRyZXNzKQorI2RlZmluZSByb3RhdGUJCQkodGhpcy0+aGlkZGVuLT5yb3RhdGUpCisjZGVmaW5lIHNoYWRvd19mYgkJKHRoaXMtPmhpZGRlbi0+c2hhZG93X2ZiKQorI2RlZmluZSBibGl0RnVuYwkJKHRoaXMtPmhpZGRlbi0+YmxpdEZ1bmMpCisjZGVmaW5lIHBoeXNsaW5lYnl0ZXMJCSh0aGlzLT5oaWRkZW4tPnBoeXNsaW5lYnl0ZXMpCisjZGVmaW5lIFNETF9udW1tb2RlcwkJKHRoaXMtPmhpZGRlbi0+U0RMX251bW1vZGVzKQorI2RlZmluZSBTRExfbW9kZWxpc3QJCSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKKyNkZWZpbmUgc3VyZmFjZXMJCSh0aGlzLT5oaWRkZW4tPnN1cmZhY2VzKQorI2RlZmluZSBzdXJmYWNlc19tZW10b3RhbAkodGhpcy0+aGlkZGVuLT5zdXJmYWNlc19tZW10b3RhbCkKKyNkZWZpbmUgc3VyZmFjZXNfbWVtbGVmdAkodGhpcy0+aGlkZGVuLT5zdXJmYWNlc19tZW1sZWZ0KQorI2RlZmluZSBod19sb2NrCQkJKHRoaXMtPmhpZGRlbi0+aHdfbG9jaykKKyNkZWZpbmUgc3dpdGNoZWRfYXdheQkJKHRoaXMtPmhpZGRlbi0+c3dpdGNoZWRfYXdheSkKKyNkZWZpbmUgc2NyZWVuX3ZpbmZvCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5fdmluZm8pCisjZGVmaW5lIHNjcmVlbl9hcmVhbGVuCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5fYXJlYWxlbikKKyNkZWZpbmUgc2NyZWVuX2NvbnRlbnRzCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5fY29udGVudHMpCisjZGVmaW5lIHNjcmVlbl9wYWxldHRlCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5fcGFsZXR0ZSkKKyNkZWZpbmUgd2FpdF92YmwJCSh0aGlzLT5oaWRkZW4tPndhaXRfdmJsKQorI2RlZmluZSB3YWl0X2lkbGUJCSh0aGlzLT5oaWRkZW4tPndhaXRfaWRsZSkKKworLyogQWNjZWxlcmF0b3IgdHlwZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIsIGJ1dCBhcmUgbm90CisgICBuZWNlc3NhcmlseSBpbiB0aGUga2VybmVsIGhlYWRlcnMgb24gdGhlIHN5c3RlbSB3ZSBjb21waWxlIG9uLgorKi8KKyNpZm5kZWYgRkJfQUNDRUxfTUFUUk9YX01HQUc0MDAKKyNkZWZpbmUgRkJfQUNDRUxfTUFUUk9YX01HQUc0MDAJMjYJLyogTWF0cm94IEc0MDAJCQkqLworI2VuZGlmCisjaWZuZGVmIEZCX0FDQ0VMXzNERlhfQkFOU0hFRQorI2RlZmluZSBGQl9BQ0NFTF8zREZYX0JBTlNIRUUJMzEJLyogM0RmeCBCYW5zaGVlCQkJKi8KKyNlbmRpZgorCisvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gU0RMX2ZidmlkZW8uYyAqLworZXh0ZXJuIHZvaWQgRkJfU2F2ZVBhbGV0dGVUbyhfVEhJUywgaW50IHBhbGV0dGVfbGVuLCBfX3UxNiAqYXJlYSk7CitleHRlcm4gdm9pZCBGQl9SZXN0b3JlUGFsZXR0ZUZyb20oX1RISVMsIGludCBwYWxldHRlX2xlbiwgX191MTYgKmFyZWEpOworCisvKiBUaGVzZSBhcmUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB2aWRlbyBzdXJmYWNlcyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIEZCX0FkZEJ1c3lTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCSgodmlkbWVtX2J1Y2tldCAqKXN1cmZhY2UtPmh3ZGF0YSktPmRpcnR5ID0gMTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IEZCX0lzU3VyZmFjZUJ1c3koU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuICgodmlkbWVtX2J1Y2tldCAqKXN1cmZhY2UtPmh3ZGF0YSktPmRpcnR5OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIEZCX1dhaXRCdXN5U3VyZmFjZXMoX1RISVMpCit7CisJdmlkbWVtX2J1Y2tldCAqYnVja2V0OworCisJLyogV2FpdCBmb3IgZ3JhcGhpYyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlICovCisJd2FpdF9pZGxlKHRoaXMpOworCisJLyogQ2xlYXIgYWxsIHN1cmZhY2UgZGlydHkgYml0cyAqLworCWZvciAoIGJ1Y2tldD0mc3VyZmFjZXM7IGJ1Y2tldDsgYnVja2V0PWJ1Y2tldC0+bmV4dCApIHsKKwkJYnVja2V0LT5kaXJ0eSA9IDA7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIEZCX2RzdF90b194eShfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgaW50ICp4LCBpbnQgKnkpCit7CisJKnggPSAobG9uZykoKGNoYXIgKilkc3QtPnBpeGVscyAtIG1hcHBlZF9tZW0pJXRoaXMtPnNjcmVlbi0+cGl0Y2g7CisJKnkgPSAobG9uZykoKGNoYXIgKilkc3QtPnBpeGVscyAtIG1hcHBlZF9tZW0pL3RoaXMtPnNjcmVlbi0+cGl0Y2g7CisJaWYgKCBkc3QgPT0gdGhpcy0+c2NyZWVuICkgeworCQkqeCArPSB0aGlzLT5vZmZzZXRfeDsKKwkJKnkgKz0gdGhpcy0+b2Zmc2V0X3k7CisJfQorfQorCisjZW5kaWYgLyogX1NETF9mYnZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vbWF0cm94X21taW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vbWF0cm94X21taW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWNmMjAzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9tYXRyb3hfbW1pby5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBNR0EgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2luY2x1ZGUgIm1hdHJveF9yZWdzLmgiCisKKy8qIE1HQSBjb250cm9sIG1hY3JvcyAqLworCisjZGVmaW5lIG1nYV9pbjgocmVnKQkJKih2b2xhdGlsZSBVaW50OCAgKikobWFwcGVkX2lvICsgKHJlZykpCisjZGVmaW5lIG1nYV9pbjMyKHJlZykJCSoodm9sYXRpbGUgVWludDMyICopKG1hcHBlZF9pbyArIChyZWcpKQorCisjZGVmaW5lIG1nYV9vdXQ4KHJlZyx2KQkJKih2b2xhdGlsZSBVaW50OCAgKikobWFwcGVkX2lvICsgKHJlZykpID0gdjsKKyNkZWZpbmUgbWdhX291dDMyKHJlZyx2KQkqKHZvbGF0aWxlIFVpbnQzMiAqKShtYXBwZWRfaW8gKyAocmVnKSkgPSB2OworCisKKy8qIFdhaXQgZm9yIGZpZm8gc3BhY2UgKi8KKyNkZWZpbmUgbWdhX3dhaXQoc3BhY2UpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJd2hpbGUgKCBtZ2FfaW44KE1HQVJFR19GSUZPU1RBVFVTKSA8IHNwYWNlICkJCQlcCisJCTsJCQkJCQkJXAorfQorCisKKy8qIFdhaXQgZm9yIGlkbGUgYWNjZWxlcmF0b3IgKi8KKyNkZWZpbmUgbWdhX3dhaXRpZGxlKCkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwl3aGlsZSAoIG1nYV9pbjMyKE1HQVJFR19TVEFUVVMpICYgMHgxMDAwMCApCQkJXAorCQk7CQkJCQkJCVwKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9tYXRyb3hfcmVncy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9mYmNvbi9tYXRyb3hfcmVncy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2ZiY29uL21hdHJveF9yZWdzLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vbWF0cm94X3JlZ3MuaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9mYmNvbi9yaXZhX21taW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vcml2YV9tbWlvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vZmJjb24vcml2YV9tbWlvLmgKcmVuYW1lIHRvIGRpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vcml2YV9tbWlvLmgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZmJjb24vcml2YV9yZWdzLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL3JpdmFfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjQ1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2ZiY29uL3JpdmFfcmVncy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9SSVZBX1JFR1NfSAorI2RlZmluZSBfUklWQV9SRUdTX0gKKworLyogVGhpcyBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBYRnJlZTg2IE5WaWRpYSBoYXJkd2FyZSBkcml2ZXIgKi8KKworLyogbWFwcGVkX2lvIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgUEdSQVBIX09GRlNFVAkweDAwNDAwMDAwCisjZGVmaW5lIEZJRk9fT0ZGU0VUCTB4MDA4MDAwMDAKKyNkZWZpbmUgUk9QX09GRlNFVAlGSUZPX09GRlNFVCsweDAwMDAwMDAwCisjZGVmaW5lIENMSVBfT0ZGU0VUCUZJRk9fT0ZGU0VUKzB4MDAwMDIwMDAKKyNkZWZpbmUgUEFUVF9PRkZTRVQJRklGT19PRkZTRVQrMHgwMDAwNDAwMAorI2RlZmluZSBQSVhNQVBfT0ZGU0VUCUZJRk9fT0ZGU0VUKzB4MDAwMDYwMDAKKyNkZWZpbmUgQkxUX09GRlNFVAlGSUZPX09GRlNFVCsweDAwMDA4MDAwCisjZGVmaW5lIEJJVE1BUF9PRkZTRVQJRklGT19PRkZTRVQrMHgwMDAwQTAwMAorI2RlZmluZSBMSU5FX09GRlNFVAlGSUZPX09GRlNFVCsweDAwMDBDMDAwCisjZGVmaW5lIFRSSTAzX09GRlNFVAlGSUZPX09GRlNFVCsweDAwMDBFMDAwCisjZGVmaW5lIFBDSU9fT0ZGU0VUCTB4MDA2MDEwMDAKKworI2VuZGlmIC8qIF9SSVZBX1JFR1NfSCAqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dhcGkvU0RMX2dhcGl2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nYXBpL1NETF9nYXBpdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmRlYWRjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nYXBpL1NETF9nYXBpdmlkZW8uYwpAQCAtMCwwICsxLDEyODcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBQb2NrZXQgUEMgR0FQSSBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uOworSW1wbGVtZW50ZWQgYnkgRG1pdHJ5IFlha2ltb3YgLSBzdXBwb3J0QGFjdGl2ZWtpdHRlbi5jb20KK0luc3BpcmVkIGJ5IGh0dHA6Ly9hcmlzbWUuZnJlZS5mci9wb3J0cy9TREwucGhwCisqLworCisvLyBUT0RPOiBjb3B5IHN1cmZhY2Ugb24gd2luZG93IHdoZW4gbG9zdCBmb2N1cworLy8gVE9ETzogdGVzdCBidXR0b25zIHJvdGF0aW9uCisvLyBUT0RPOiB0ZXN0IG9uIGJlMzAwIGFuZCBIUEMgKCBjaGVjayBXaW5EaWIgZnVsbHNjcmVlbiBrZXlzIGNhdGNoaW5nICkKKy8vIFRPRE86IHRlc3Qgb24gc21hcnRwaG9uZXMKKy8vIFRPRE86IHdpbmRpYiBvbiBTSDMgUFBDMjAwMCBsYW5kc2NhcGUgdGVzdAorLy8gVE9ETzogb3B0aW1pemUgOGJwcCBsYW5kc2NhcGUgbW9kZQorCisvLyB0aGVyZSBpcyBzb21lIHByb2JsZW1zIGluIHJ1bm5pbmdzIGFwcHMgZnJvbSBhIGRldmljZSBsYW5kc2NhcGUgbW9kZQorLy8gZHVlIHRvIFdpbkNFIGJ1Z3MuIFNvbWUgd29ya3MgYW5kIHNvbWUgLSBkb2VzIG5vdC4KKy8vIFRPRE86IGZpbmlzaCBBeGltIERlbGwgWDMwIGFuZCB1c2VyIGxhbmRzY2FwZSBtb2RlLCBkZXZpY2UgbGFuZHNjYXBlIG1vZGUKKy8vIFRPRE86IGZpbmlzaCBBeGltIERlbGwgWDMwIHVzZXIgcG9ydHJhaXQsIGRldmljZSBsYW5kc2NhcGUgc3R5bHVzIGNvbnZlcnNpb24KKy8vIFRPRE86IGZpeCBydW5uaW5nIEdBUEkgYXBwcyBmcm9tIGxhbmRzY2FwZSBtb2RlIC0gCisvLyAgICAgICB3aW5jZSBnb2VzIHRvIHBvcnRyYWl0IG1vZGUsIGJ1dCBkb2VzIG5vdCB1cGRhdGUgdmlkZW8gbWVtb3J5CisKKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICIuLi93aW5jb21tb24vU0RMX3N5c3dtX2MuaCIKKyNpbmNsdWRlICIuLi93aW5jb21tb24vU0RMX3N5c21vdXNlX2MuaCIKKyNpbmNsdWRlICIuLi93aW5kaWIvU0RMX2RpYmV2ZW50c19jLmgiIAorCisjaW5jbHVkZSAiLi4vd2luZGliL1NETF9nYXBpZGlidmlkZW8uaCIKKyNpbmNsdWRlICJTRExfZ2FwaXZpZGVvLmgiCisKKyNkZWZpbmUgZ2FwaSB0aGlzLT5oaWRkZW4tPmdhcGlJbmZvCisKKyNkZWZpbmUgR0FQSVZJRF9EUklWRVJfTkFNRSAiZ2FwaSIKKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQgKF9ERUJVRykgfHwgZGVmaW5lZChOREVCVUcpCisjZGVmaW5lIFJFUE9SVF9WSURFT19JTkZPIDEKKyNlbHNlCisjZGVmaW5lIFJFUE9SVF9WSURFT19JTkZPIDAKKyNlbmRpZgorCisvLyBmb3IgdGVzdGluZyB3aXRoIEdhcGlFbXUKKyNkZWZpbmUgVVNFX0dBUElfRU1VIDAKKyNkZWZpbmUgRU1VTEFURV9BWElNX1gzMCAwCisjZGVmaW5lIFdJVEhPVVRfR0FQSSAwCisKKyNpZiBVU0VfR0FQSV9FTVUgJiYgIVJFUE9SVF9WSURFT19JTkZPCisjcHJhZ21hIG1lc3NhZ2UoIldhcm5pbmc6IFVzaW5nIEdhcGlFbXUgaW4gcmVsZWFzZSBidWlsZC4gSSBhc3N1bWUgeW91J2QgbGlrZSB0byBzZXQgVVNFX0dBUElfRU1VIHRvIHplcm8uIikKKyNlbmRpZgorCisjaWZuZGVmIF9UCisjZGVmaW5lIF9UKHgpIEwjI3gKKyNlbmRpZgorCisjaWZuZGVmIEFTU0VSVAorI2RlZmluZSBBU1NFUlQoeCkKKyNlbmRpZgorCisvLyBkZWZpbmVkIGFuZCB1c2VkIGluIFNETF9zeXNldmVudHMuYworZXh0ZXJuIEhJTlNUQU5DRSBheWdzaGVsbDsKK2V4dGVybiB2b2lkIFNETF9VbnJlZ2lzdGVyQXBwKCk7CitleHRlcm4gaW50IERJQl9BZGRNb2RlKF9USElTLCBpbnQgYnBwLCBpbnQgdywgaW50IGgpOworCisvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgR0FQSV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipHQVBJX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgU0RMX1N1cmZhY2UgKkdBUElfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOworc3RhdGljIGludCBHQVBJX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBHQVBJX1ZpZGVvUXVpdChfVEhJUyk7CisKKy8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IEdBUElfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgR0FQSV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBHQVBJX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgR0FQSV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKKy8qIFdpbmRvd3MgbWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMsIHdpbGwgbm90IGJlIHByb2Nlc3NlZCAqLworc3RhdGljIHZvaWQgR0FQSV9BY3RpdmF0ZShfVEhJUywgQk9PTCBhY3RpdmUsIEJPT0wgbWluaW1pemVkKTsKK3N0YXRpYyB2b2lkIEdBUElfUmVhbGl6ZVBhbGV0dGUoX1RISVMpOworc3RhdGljIHZvaWQgR0FQSV9QYWxldHRlQ2hhbmdlZChfVEhJUywgSFdORCB3aW5kb3cpOworc3RhdGljIHZvaWQgR0FQSV9XaW5QQUlOVChfVEhJUywgSERDIGhkYyk7IAorCisvKiBldGMuICovCitzdGF0aWMgdm9pZCBHQVBJX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKK3N0YXRpYyBITU9EVUxFIGdfaEdhcGlMaWIgPSAwOworI2RlZmluZSBMSU5LKHR5cGUsbmFtZSxpbXBvcnQpIFwKKwlpZiggZ19oR2FwaUxpYiApIFwKKwkJbmFtZSA9IChQRk4jI3R5cGUpR2V0UHJvY0FkZHJlc3MoIGdfaEdhcGlMaWIsIF9UKGltcG9ydCkgKTsgCisKK3N0YXRpYyBjaGFyIGdfYlJhd0J1ZmZlckF2YWlsYWJsZSA9IDA7CisKKy8qIEdBUEkgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworLyogaGkgcmVzIGRlZmluaXRpb25zICovCit0eXBlZGVmIHN0cnVjdCBfUmF3RnJhbWVCdWZmZXJJbmZvCit7CisgICBXT1JEIHdGb3JtYXQ7CisgICBXT1JEIHdCUFA7CisgICBWT0lEICpwRnJhbWVQb2ludGVyOworICAgaW50ICBjeFN0cmlkZTsKKyAgIGludCAgY3lTdHJpZGU7CisgICBpbnQgIGN4UGl4ZWxzOworICAgaW50ICBjeVBpeGVsczsKK30gUmF3RnJhbWVCdWZmZXJJbmZvOyAKKworc3RhdGljIHN0cnVjdCBfUmF3RnJhbWVCdWZmZXJJbmZvIGdfUmF3RnJhbWVCdWZmZXJJbmZvID0gezB9OworCisjZGVmaW5lIEdFVFJBV0ZSQU1FQlVGRkVSICAgMHgwMDAyMDAwMQorCisjZGVmaW5lIEZPUk1BVF81NjUgMQorI2RlZmluZSBGT1JNQVRfNTU1IDIKKyNkZWZpbmUgRk9STUFUX09USEVSIDMKKworLyogRGVsbCBBeGltIHgzMCBoYW5ncyB3aGVuIHdlIHVzZSBHQVBJIGZyb20gbGFuZHNjYXBlLAorICAgc28gbGV0cyBhdm9pZCB1c2luZyBHeE9wZW5EaXNwbGF5IHRoZXJlIHZpYSBHRVRHWElORk8gdHJpY2sgCisgICBJdCBzZWVtcyB0aGF0IEdBUEkgc3Vic3lzdGVtIHVzZSB0aGUgc2FtZSBFeHRFc2NhcGUgY29kZS4KKyovCisjZGVmaW5lIEdFVEdYSU5GTyAweDAwMDIwMDAwCisKK3R5cGVkZWYgc3RydWN0IEdYRGV2aWNlSW5mbworeworbG9uZyBWZXJzaW9uOyAvLzAwIChzaG91bGQgZmlsbGVkIHdpdGggMTAwIGJlZm9yZSBjYWxsaW5nIEV4dEVzY2FwZSkKK3ZvaWQgKiBwdkZyYW1lQnVmZmVyOyAvLzA0Cit1bnNpZ25lZCBsb25nIGNiU3RyaWRlOyAvLzA4Cit1bnNpZ25lZCBsb25nIGN4V2lkdGg7IC8vMGMKK3Vuc2lnbmVkIGxvbmcgY3lIZWlnaHQ7IC8vMTAKK3Vuc2lnbmVkIGxvbmcgY0JQUDsgLy8xNAordW5zaWduZWQgbG9uZyBmZkZvcm1hdDsgLy8xOAorY2hhciBVbnVzZWRbMHg4NC03KjRdOworfSBHWERldmljZUluZm87IAorCitzdGF0aWMgaW50IEdBUElfQXZhaWxhYmxlKHZvaWQpCit7CisJLy8gdHJ5IHRvIHVzZSBWR0EgZGlzcGxheSwgZXZlbiBvbiBlbXVsYXRvcgorCUhEQyBoZGMgPSBHZXREQyhOVUxMKTsgCisJaW50IHJlc3VsdCA9IEV4dEVzY2FwZShoZGMsIEdFVFJBV0ZSQU1FQlVGRkVSLCAwLCBOVUxMLCBzaXplb2YoUmF3RnJhbWVCdWZmZXJJbmZvKSwgKGNoYXIgKikmZ19SYXdGcmFtZUJ1ZmZlckluZm8pOworCVJlbGVhc2VEQyhOVUxMLCBoZGMpOworCWdfYlJhd0J1ZmZlckF2YWlsYWJsZSA9IHJlc3VsdCA+IDA7CisKKwkvL015IEFzdXMgTXlQQUwgNjk2IHJlcG9ydHMgdGhlIFJBV0ZSQU1FQlVGRkVSIGFzIGF2YWlsYWJsZSwgYnV0IHdpdGggYSBzaXplIG9mIDAgeCAwCisJaWYoZ19SYXdGcmFtZUJ1ZmZlckluZm8uY3hQaXhlbHMgPD0gMCB8fCBnX1Jhd0ZyYW1lQnVmZmVySW5mby5jeVBpeGVscyA8PSAwKXsKKwkJZ19iUmF3QnVmZmVyQXZhaWxhYmxlID0gMDsKKwl9CisKKyNpZiBXSVRIT1VUX0dBUEkKKwlyZXR1cm4gZ19iUmF3QnVmZmVyQXZhaWxhYmxlOworI2VuZGlmCisKKyNpZiBVU0VfR0FQSV9FTVUKKwlnX2hHYXBpTGliID0gTG9hZExpYnJhcnkoX1QoIkdBUElfRW11LmRsbCIpKTsKKwlpZiggIWdfaEdhcGlMaWIgKQorCXsKKwkJU0RMX1NldEVycm9yKCJHYXBpIEVtdSBub3QgZm91bmQhIik7CisJfQorCXJldHVybiBnX2hHYXBpTGliICE9IDA7CisjZW5kaWYKKworCS8vIHRyeSB0byBmaW5kIGd4LmRsbAorCWdfaEdhcGlMaWIgPSBMb2FkTGlicmFyeShfVCgiXFxXaW5kb3dzXFxneC5kbGwiKSk7CisJaWYoICFnX2hHYXBpTGliICkKKwl7CisJCWdfaEdhcGlMaWIgPSBMb2FkTGlicmFyeShfVCgiZ3guZGxsIikpOworCQlpZiggIWdfaEdhcGlMaWIgKSByZXR1cm4gZ19iUmF3QnVmZmVyQXZhaWxhYmxlOworCX0KKworCXJldHVybigxKTsKK30KKworc3RhdGljIGludCBjbXBtb2Rlcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCit7CisgICAgU0RMX1JlY3QgKmEgPSAqKFNETF9SZWN0ICoqKXZhOworICAgIFNETF9SZWN0ICpiID0gKihTRExfUmVjdCAqKil2YjsKKyAgICBpZiAoIGEtPncgPT0gYi0+dyApCisgICAgICAgIHJldHVybiBiLT5oIC0gYS0+aDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBiLT53IC0gYS0+dzsKK30KKworc3RhdGljIGludCBHQVBJX0FkZE1vZGUoX1RISVMsIGludCBicHAsIGludCB3LCBpbnQgaCkKK3sKKwlTRExfUmVjdCAqbW9kZTsKKwlpbnQgaSwgaW5kZXg7CisJaW50IG5leHRfbW9kZTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBtb2RlICovCisJaWYgKCBicHAgPCA4ICkgeyAgLyogTm90IHN1cHBvcnRlZCAqLworCQlyZXR1cm4oMCk7CisJfQorCWluZGV4ID0gKChicHArNykvOCktMTsKKwlmb3IgKCBpPTA7IGk8Z2FwaS0+U0RMX251bW1vZGVzW2luZGV4XTsgKytpICkgeworCQltb2RlID0gZ2FwaS0+U0RMX21vZGVsaXN0W2luZGV4XVtpXTsKKwkJaWYgKCAobW9kZS0+dyA9PSB3KSAmJiAobW9kZS0+aCA9PSBoKSApIHsKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKworCS8qIFNldCB1cCB0aGUgbmV3IHZpZGVvIG1vZGUgcmVjdGFuZ2xlICovCisJbW9kZSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mICptb2RlKTsKKwlpZiAoIG1vZGUgPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybigtMSk7CisJfQorCW1vZGUtPnggPSAwOworCW1vZGUtPnkgPSAwOworCW1vZGUtPncgPSB3OworCW1vZGUtPmggPSBoOworCisJLyogQWxsb2NhdGUgdGhlIG5ldyBsaXN0IG9mIG1vZGVzLCBhbmQgZmlsbCBpbiB0aGUgbmV3IG1vZGUgKi8KKwluZXh0X21vZGUgPSBnYXBpLT5TRExfbnVtbW9kZXNbaW5kZXhdOworCWdhcGktPlNETF9tb2RlbGlzdFtpbmRleF0gPSAoU0RMX1JlY3QgKiopCisJICAgICAgIFNETF9yZWFsbG9jKGdhcGktPlNETF9tb2RlbGlzdFtpbmRleF0sICgxK25leHRfbW9kZSsxKSpzaXplb2YoU0RMX1JlY3QgKikpOworCWlmICggZ2FwaS0+U0RMX21vZGVsaXN0W2luZGV4XSA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJZ2FwaS0+U0RMX251bW1vZGVzW2luZGV4XSA9IDA7CisJCVNETF9mcmVlKG1vZGUpOworCQlyZXR1cm4oLTEpOworCX0KKwlnYXBpLT5TRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZV0gPSBtb2RlOworCWdhcGktPlNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlKzFdID0gTlVMTDsKKwlnYXBpLT5TRExfbnVtbW9kZXNbaW5kZXhdKys7CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIEdBUElfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCWlmKCBnX2hHYXBpTGliICkKKwl7CisJCUZyZWVMaWJyYXJ5KGdfaEdhcGlMaWIpOworCQlnX2hHYXBpTGliID0gMDsKKwl9CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4tPmdhcGlJbmZvKTsKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqR0FQSV9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOworCisJaWYoICFnX2hHYXBpTGliICYmICFnX2JSYXdCdWZmZXJBdmFpbGFibGUpCisJeworCQlpZiggIUdBUElfQXZhaWxhYmxlKCkgKQorCQl7CisJCQlTRExfU2V0RXJyb3IoIkdBUEkgZGxsIGlzIG5vdCBmb3VuZCBhbmQgVkdBIG1vZGUgaXMgbm90IGF2YWlsYWJsZSEiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7CisJaWYgKCBkZXZpY2UgKSB7CisJCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKKwkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCisJCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCQlpZihkZXZpY2UtPmhpZGRlbil7CisJCQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCQkJZGV2aWNlLT5oaWRkZW4tPmdhcGlJbmZvID0gKEdhcGlJbmZvICopU0RMX21hbGxvYygoc2l6ZW9mKEdhcGlJbmZvKSkpOworCQkJaWYoZGV2aWNlLT5oaWRkZW4tPmdhcGlJbmZvID09IE5VTEwpCisJCQl7CisJCQkJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCQkJCWRldmljZS0+aGlkZGVuID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCBkZXZpY2UgKSB7CisJCQlTRExfZnJlZShkZXZpY2UpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbi0+Z2FwaUluZm8sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuLT5nYXBpSW5mbykpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCWRldmljZS0+VmlkZW9Jbml0ID0gR0FQSV9WaWRlb0luaXQ7CisJZGV2aWNlLT5MaXN0TW9kZXMgPSBHQVBJX0xpc3RNb2RlczsKKwlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IEdBUElfU2V0VmlkZW9Nb2RlOworCWRldmljZS0+VXBkYXRlTW91c2UgPSBXSU5fVXBkYXRlTW91c2U7IAorCWRldmljZS0+Q3JlYXRlWVVWT3ZlcmxheSA9IE5VTEw7CisJZGV2aWNlLT5TZXRDb2xvcnMgPSBHQVBJX1NldENvbG9yczsKKwlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gR0FQSV9VcGRhdGVSZWN0czsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IEdBUElfVmlkZW9RdWl0OworCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBHQVBJX0FsbG9jSFdTdXJmYWNlOworCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOworCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IEdBUElfTG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IEdBUElfVW5sb2NrSFdTdXJmYWNlOworCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IE5VTEw7CisJZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gR0FQSV9GcmVlSFdTdXJmYWNlOworCWRldmljZS0+U2V0Q2FwdGlvbiA9IFdJTl9TZXRXTUNhcHRpb247CisJZGV2aWNlLT5TZXRJY29uID0gV0lOX1NldFdNSWNvbjsKKwlkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBXSU5fSWNvbmlmeVdpbmRvdzsKKwlkZXZpY2UtPkdyYWJJbnB1dCA9IFdJTl9HcmFiSW5wdXQ7CisJZGV2aWNlLT5HZXRXTUluZm8gPSBXSU5fR2V0V01JbmZvOworCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gV0lOX0ZyZWVXTUN1cnNvcjsKKwlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gV0lOX0NyZWF0ZVdNQ3Vyc29yOyAKKwlkZXZpY2UtPlNob3dXTUN1cnNvciA9IFdJTl9TaG93V01DdXJzb3I7CQorCWRldmljZS0+V2FycFdNQ3Vyc29yID0gV0lOX1dhcnBXTUN1cnNvcjsgCisgICAgZGV2aWNlLT5DaGVja01vdXNlTW9kZSA9IFdJTl9DaGVja01vdXNlTW9kZTsKKwlkZXZpY2UtPkluaXRPU0tleW1hcCA9IERJQl9Jbml0T1NLZXltYXA7CisJZGV2aWNlLT5QdW1wRXZlbnRzID0gRElCX1B1bXBFdmVudHM7CisKKwkvKiBTZXQgdXAgdGhlIHdpbmRvd3MgbWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMgKi8KKwlXSU5fQWN0aXZhdGUgPSBHQVBJX0FjdGl2YXRlOworCVdJTl9SZWFsaXplUGFsZXR0ZSA9IEdBUElfUmVhbGl6ZVBhbGV0dGU7CisJV0lOX1BhbGV0dGVDaGFuZ2VkID0gR0FQSV9QYWxldHRlQ2hhbmdlZDsKKwlXSU5fV2luUEFJTlQgPSBHQVBJX1dpblBBSU5UOworCUhhbmRsZU1lc3NhZ2UgPSBESUJfSGFuZGxlTWVzc2FnZTsgCisKKwlkZXZpY2UtPmZyZWUgPSBHQVBJX0RlbGV0ZURldmljZTsKKworCS8qIExvYWQgZ2FwaSBsaWJyYXJ5ICovCisjZGVmaW5lIGd4IGRldmljZS0+aGlkZGVuLT5nYXBpSW5mby0+Z3hGdW5jCisKKyAgICBMSU5LKCBHWE9wZW5EaXNwbGF5LCBneC5HWE9wZW5EaXNwbGF5LCAgICAgICAgICI/R1hPcGVuRGlzcGxheUBAWUFIUEFVSFdORF9fQEBLQFoiICkKKyAgICBMSU5LKCBHWENsb3NlRGlzcGxheSwgZ3guR1hDbG9zZURpc3BsYXksICAgICAgICAiP0dYQ2xvc2VEaXNwbGF5QEBZQUhYWiIgKQorICAgIExJTksoIEdYQmVnaW5EcmF3LCBneC5HWEJlZ2luRHJhdywgICAgICAgICAgICI/R1hCZWdpbkRyYXdAQFlBUEFYWFoiICkKKyAgICBMSU5LKCBHWEVuZERyYXcsIGd4LkdYRW5kRHJhdywgICAgICAgICAgICAgIj9HWEVuZERyYXdAQFlBSFhaIiApCisgICAgTElOSyggR1hPcGVuSW5wdXQsIGd4LkdYT3BlbklucHV0LCAgICAgICAgICAgIj9HWE9wZW5JbnB1dEBAWUFIWFoiICkKKyAgICBMSU5LKCBHWENsb3NlSW5wdXQsIGd4LkdYQ2xvc2VJbnB1dCwgICAgICAgICAgIj9HWENsb3NlSW5wdXRAQFlBSFhaIiApCisgICAgTElOSyggR1hHZXREaXNwbGF5UHJvcGVydGllcywgZ3guR1hHZXREaXNwbGF5UHJvcGVydGllcywiP0dYR2V0RGlzcGxheVByb3BlcnRpZXNAQFlBP0FVR1hEaXNwbGF5UHJvcGVydGllc0BAWFoiICkKKyAgICBMSU5LKCBHWEdldERlZmF1bHRLZXlzLCBneC5HWEdldERlZmF1bHRLZXlzLCAgICAgICI/R1hHZXREZWZhdWx0S2V5c0BAWUE/QVVHWEtleUxpc3RAQEhAWiIgKQorICAgIExJTksoIEdYU3VzcGVuZCwgZ3guR1hTdXNwZW5kLCAgICAgICAgICAgICAiP0dYU3VzcGVuZEBAWUFIWFoiICkKKyAgICBMSU5LKCBHWFJlc3VtZSwgZ3guR1hSZXN1bWUsICAgICAgICAgICAgICAiP0dYUmVzdW1lQEBZQUhYWiIgKQorICAgIExJTksoIEdYU2V0Vmlld3BvcnQsIGd4LkdYU2V0Vmlld3BvcnQsICAgICAgICAgIj9HWFNldFZpZXdwb3J0QEBZQUhLS0tLQFoiICkKKyAgICBMSU5LKCBHWElzRGlzcGxheURSQU1CdWZmZXIsIGd4LkdYSXNEaXNwbGF5RFJBTUJ1ZmZlciwgIj9HWElzRGlzcGxheURSQU1CdWZmZXJAQFlBSFhaIiApCisKKwkvKiB3cm9uZyBnYXBpLmRsbCAqLworCWlmKCAhZ3guR1hPcGVuRGlzcGxheSApCisJeworCQlpZiggZ19oR2FwaUxpYiApIAorCQl7CisJCQlGcmVlTGlicmFyeShnX2hHYXBpTGliKTsKKwkJCWdfaEdhcGlMaWIgPSAwOworCQl9CisJfQorCQorCWlmKCAhZ3guR1hPcGVuRGlzcGxheSAmJiAhZ19iUmF3QnVmZmVyQXZhaWxhYmxlKQorCXsKKwkJU0RMX1NldEVycm9yKCJFcnJvcjogZGFtYWdlZCBvciB1bmtub3duIGdhcGkuZGxsIVxuIik7CisJCUdBUElfRGVsZXRlRGV2aWNlKGRldmljZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBkZXZpY2U7Cit9CisKK1ZpZGVvQm9vdFN0cmFwIEdBUElfYm9vdHN0cmFwID0geworCUdBUElWSURfRFJJVkVSX05BTUUsICJXaW5DRSBHQVBJIHZpZGVvIGRyaXZlciIsCisJR0FQSV9BdmFpbGFibGUsIEdBUElfQ3JlYXRlRGV2aWNlCit9OworCitzdGF0aWMgdm9pZCBGaWxsU3RydWN0cyhfVEhJUywgQk9PTCB1c2VWZ2EpCit7CisjaWZkZWYgX0FSTV8KKwlXQ0hBUiBvZW1zdHJbMTAwXTsKKyNlbmRpZgorCS8qIGZpbGwgYSBkZXZpY2UgcHJvcGVydGllcyAqLworCisJaWYoICF1c2VWZ2EgKQorCXsKKwkJZ2FwaS0+Z3hQcm9wZXJ0aWVzID0gZ2FwaS0+Z3hGdW5jLkdYR2V0RGlzcGxheVByb3BlcnRpZXMoKTsKKwkJZ2FwaS0+bmVlZFVwZGF0ZSA9IDE7CisJCWdhcGktPmhpcmVzRml4ID0gMDsKKwkJZ2FwaS0+dXNlVmdhID0gMDsKKwkJZ2FwaS0+dXNlR1hPcGVuRGlzcGxheSA9IDE7CisKKyNpZmRlZiBfQVJNXworCQkvKiBjaGVjayBzb21lIGRldmljZXMgYW5kIGV4dHJhY3QgYWRkaXRpb24gaW5mbyAqLworCQlTeXN0ZW1QYXJhbWV0ZXJzSW5mbyggU1BJX0dFVE9FTUlORk8sIHNpemVvZiggb2Vtc3RyICksIG9lbXN0ciwgMCApOworCisJCS8vIGJ1Z2d5IGlQYXEzOHh4CisJCWlmICgob2Vtc3RyWzEyXSA9PSAnSCcpICYmIChvZW1zdHJbMTNdID09ICczJykgJiYgKG9lbXN0clsxNF0gPT0gJzgnKSAmJiAoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieFBpdGNoID4gMCkpIAorCQl7CisJCQlnYXBpLT52aWRlb01lbSA9IChQSVhFTCopMHhhYzA3NTVhMDsKKwkJCWdhcGktPmd4UHJvcGVydGllcy5jYnhQaXRjaCA9IC02NDA7CisJCQlnYXBpLT5neFByb3BlcnRpZXMuY2J5UGl0Y2ggPSAyOworCQkJZ2FwaS0+bmVlZFVwZGF0ZSA9IDA7CisJCX0KKyNpZiAoRU1VTEFURV9BWElNX1gzMCA9PSAwKQorCQkvLyBidWdneSBEZWxsIEF4aW0gWDMwCisJCWlmKCBfdGNzbmNtcChvZW1zdHIsIEwiRGVsbCBBeGltIFgzMCIsIDEzKSA9PSAwICkKKyNlbmRpZgorCQl7CisJCQlHWERldmljZUluZm8gZ3hJbmZvID0gezB9OworCQkJSERDIGhkYyA9IEdldERDKE5VTEwpOworCQkJaW50IHJlc3VsdDsKKworCQkJZ3hJbmZvLlZlcnNpb24gPSAxMDA7CisJCQlyZXN1bHQgPSBFeHRFc2NhcGUoaGRjLCBHRVRHWElORk8sIDAsIE5VTEwsIHNpemVvZihneEluZm8pLCAoY2hhciAqKSZneEluZm8pOworCQkJaWYoIHJlc3VsdCA+IDAgKQorCQkJeworCQkJCWdhcGktPnVzZUdYT3BlbkRpc3BsYXkgPSAwOworCQkJCWdhcGktPnZpZGVvTWVtID0gZ3hJbmZvLnB2RnJhbWVCdWZmZXI7CisJCQkJZ2FwaS0+bmVlZFVwZGF0ZSA9IDA7CisJCQkJZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieFBpdGNoID0gMjsKKwkJCQlnYXBpLT5neFByb3BlcnRpZXMuY2J5UGl0Y2ggPSA0ODA7CisJCQkJZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGggPSBneEluZm8uY3hXaWR0aDsKKwkJCQlnYXBpLT5neFByb3BlcnRpZXMuY3lIZWlnaHQgPSBneEluZm8uY3lIZWlnaHQ7CisJCQkJZ2FwaS0+Z3hQcm9wZXJ0aWVzLmZmRm9ybWF0ID0gZ3hJbmZvLmZmRm9ybWF0OworCQkJfQorCQl9CisjZW5kaWYKKwl9IGVsc2UKKwl7CisJCWdhcGktPm5lZWRVcGRhdGUgPSAwOwkJCisJCWdhcGktPmhpcmVzRml4ID0gMDsKKwkJZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFAgPSBnX1Jhd0ZyYW1lQnVmZmVySW5mby53QlBQOworCQlnYXBpLT5neFByb3BlcnRpZXMuY2J4UGl0Y2ggPSBnX1Jhd0ZyYW1lQnVmZmVySW5mby5jeFN0cmlkZTsKKwkJZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieVBpdGNoID0gZ19SYXdGcmFtZUJ1ZmZlckluZm8uY3lTdHJpZGU7CisJCWdhcGktPmd4UHJvcGVydGllcy5jeFdpZHRoID0gZ19SYXdGcmFtZUJ1ZmZlckluZm8uY3hQaXhlbHM7CisJCWdhcGktPmd4UHJvcGVydGllcy5jeUhlaWdodCA9IGdfUmF3RnJhbWVCdWZmZXJJbmZvLmN5UGl4ZWxzOworCQlnYXBpLT52aWRlb01lbSA9IGdfUmF3RnJhbWVCdWZmZXJJbmZvLnBGcmFtZVBvaW50ZXI7CisJCWdhcGktPnVzZVZnYSA9IDE7CisKKwkJc3dpdGNoKCBnX1Jhd0ZyYW1lQnVmZmVySW5mby53Rm9ybWF0ICkKKwkJeworCQljYXNlIEZPUk1BVF81NjU6CisJCQlnYXBpLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgPSBrZkRpcmVjdDU2NTsKKwkJCWJyZWFrOworCQljYXNlIEZPUk1BVF81NTU6CisJCQlnYXBpLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgPSBrZkRpcmVjdDU1NTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogdW5rbm93biBwaXhlbCBmb3JtYXQsIHRyeSBkZWZpbmUgYnkgQlBQISAqLworCQkJc3dpdGNoKCBnX1Jhd0ZyYW1lQnVmZmVySW5mby53QlBQICkKKwkJCXsKKwkJCWNhc2UgNDoKKwkJCWNhc2UgODoKKwkJCQlnYXBpLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgPSBrZkRpcmVjdDsKKwkJCWNhc2UgMTY6CisJCQkJZ2FwaS0+Z3hQcm9wZXJ0aWVzLmZmRm9ybWF0ID0ga2ZEaXJlY3Q1NjU7CisJCQlkZWZhdWx0OgorCQkJCWdhcGktPmd4UHJvcGVydGllcy5mZkZvcm1hdCA9IGtmRGlyZWN0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYoIGdhcGktPmd4UHJvcGVydGllcy5jQlBQICE9IDE2ICkKKwl7CisJCWdhcGktPmdhcGlPcmllbnRhdGlvbiA9IFNETF9PUklFTlRBVElPTl9VUDsKKwl9IGVsc2UKKwlpZiggKGdhcGktPmd4UHJvcGVydGllcy5jYnhQaXRjaCA+IDApICYmIChnYXBpLT5neFByb3BlcnRpZXMuY2J5UGl0Y2ggPiAwICkpCisJeworCQlnYXBpLT5nYXBpT3JpZW50YXRpb24gPSBTRExfT1JJRU5UQVRJT05fVVA7CisJfSBlbHNlCisJaWYoIChnYXBpLT5neFByb3BlcnRpZXMuY2J4UGl0Y2ggPiAwKSAmJiAoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieVBpdGNoIDwgMCApKQorCXsKKwkJZ2FwaS0+Z2FwaU9yaWVudGF0aW9uID0gU0RMX09SSUVOVEFUSU9OX1JJR0hUOyAvLyBpcGFxIDM2NjAKKwl9IGVsc2UKKwlpZiggKGdhcGktPmd4UHJvcGVydGllcy5jYnhQaXRjaCA8IDApICYmIChnYXBpLT5neFByb3BlcnRpZXMuY2J5UGl0Y2ggPiAwICkpCisJeworCQlnYXBpLT5nYXBpT3JpZW50YXRpb24gPSBTRExfT1JJRU5UQVRJT05fTEVGVDsgLy8gaXBhcSAzODAwCisJfQorfQorCitzdGF0aWMgdm9pZCBHQVBJX0NyZWF0ZVBhbGV0dGUoaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworICAvLyBTZXR1cCBhIGN1c3RvbSBjb2xvciBwYWxldHRlCisgICBCWVRFIGJ1ZmZlclsgc2l6ZW9mKExPR1BBTEVUVEUpICsgMjU1ICogc2l6ZW9mKFBBTEVUVEVFTlRSWSkgXTsKKyAgIGludCBpOworICAgTE9HUEFMRVRURSogICBwTG9naWNhbCA9IChMT0dQQUxFVFRFKilidWZmZXI7CisgICBQQUxFVFRFRU5UUlkqIGVudHJpZXMgID0gcExvZ2ljYWwtPnBhbFBhbEVudHJ5OworICAgSFBBTEVUVEUgaFBhbGV0dGU7CisgICBIREMgaGRjOworCisgICBmb3IgKGkgPSAwOyBpIDwgbmNvbG9yczsgKytpKQorICAgeworICAgICAgLy8gRmluZCBpbnRlbnNpdHkgYnkgcmVwbGljYXRpbmcgdGhlIGJpdCBwYXR0ZXJucyBvdmVyIGEgYnl0ZQorICAgICAgZW50cmllc1tpXS5wZVJlZCAgID0gY29sb3JzW2ldLnI7CisgICAgICBlbnRyaWVzW2ldLnBlR3JlZW4gPSBjb2xvcnNbaV0uZzsKKyAgICAgIGVudHJpZXNbaV0ucGVCbHVlICA9IGNvbG9yc1tpXS5iOworICAgICAgZW50cmllc1tpXS5wZUZsYWdzID0gMDsKKyAgIH0KKworICAgLy8gQ3JlYXRlIHRoZSBHREkgcGFsZXR0ZSBvYmplY3QKKyAgIHBMb2dpY2FsLT5wYWxWZXJzaW9uICAgID0gMHgwMzAwOworICAgcExvZ2ljYWwtPnBhbE51bUVudHJpZXMgPSBuY29sb3JzOworCisgICBoUGFsZXR0ZSA9IENyZWF0ZVBhbGV0dGUoIHBMb2dpY2FsICk7CisgICBBU1NFUlQoaFBhbGV0dGUpOworCQorCisgICAvLyBSZWFsaXplIHRoZSBwYWxldHRlCisgICBoZGMgPSBHZXREQygwKTsKKworICAgU2VsZWN0UGFsZXR0ZSggaGRjLCBoUGFsZXR0ZSwgRkFMU0UgKTsKKyAgIFJlYWxpemVQYWxldHRlKCBoZGMgKTsKKworICAgUmVsZWFzZURDKCAwLCBoZGMgKTsKKyAgIERlbGV0ZU9iamVjdCggaFBhbGV0dGUgKTsKK30KKworaW50IEdBUElfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisJaW50IGksYnBwOworCisJLyogQ3JlYXRlIHRoZSB3aW5kb3cgKi8KKwlpZiAoIERJQl9DcmVhdGVXaW5kb3codGhpcykgPCAwICkgeworCQlyZXR1cm4oLTEpOworCX0KKworCWlmKCBnX2hHYXBpTGliICkKKwl7CisJCUZpbGxTdHJ1Y3RzKHRoaXMsIDApOworCisJCS8vIFNETCBkb2VzIG5vdCBzdXBwb3J0cyAyLzRicHAgbW9kZSwgc28gdXNlIDE2IGJwcAorCQlicHAgPSBnYXBpLT5neFByb3BlcnRpZXMuY0JQUCA8IDggPyAxNiA6IGdhcGktPmd4UHJvcGVydGllcy5jQlBQOworCQkKKwkJLyogc2V0IHVwIG5vcm1hbCBhbmQgbGFuZHNjYXBlIG1vZGUgKi8KKwkJR0FQSV9BZGRNb2RlKHRoaXMsIGJwcCwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN5SGVpZ2h0LCBnYXBpLT5neFByb3BlcnRpZXMuY3hXaWR0aCk7CQorCQlHQVBJX0FkZE1vZGUodGhpcywgYnBwLCBnYXBpLT5neFByb3BlcnRpZXMuY3hXaWR0aCwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN5SGVpZ2h0KTsJCisJfQorCisJLyogYWRkIGhpLXJlcyBtb2RlICovCisJaWYoIGdfYlJhd0J1ZmZlckF2YWlsYWJsZSAmJiAKKwkJISgoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGggPT0gKHVuc2lnbmVkKWdfUmF3RnJhbWVCdWZmZXJJbmZvLmN4UGl4ZWxzKSAmJiAoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN5SGVpZ2h0ID09ICh1bnNpZ25lZClnX1Jhd0ZyYW1lQnVmZmVySW5mby5jeVBpeGVscykpKQorCXsKKwkJRmlsbFN0cnVjdHModGhpcywgMSk7CisKKwkJLy8gU0RMIGRvZXMgbm90IHN1cHBvcnRzIDIvNGJwcCBtb2RlLCBzbyB1c2UgMTYgYnBwCisJCWJwcCA9IGdhcGktPmd4UHJvcGVydGllcy5jQlBQIDwgOCA/IDE2IDogZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFA7CisKKwkJLyogc2V0IHVwIG5vcm1hbCBhbmQgbGFuZHNjYXBlIG1vZGUgKi8KKwkJR0FQSV9BZGRNb2RlKHRoaXMsIGJwcCwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN5SGVpZ2h0LCBnYXBpLT5neFByb3BlcnRpZXMuY3hXaWR0aCk7CQorCQlHQVBJX0FkZE1vZGUodGhpcywgYnBwLCBnYXBpLT5neFByb3BlcnRpZXMuY3hXaWR0aCwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN5SGVpZ2h0KTsJCisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLgorCSAqIFRoaXMgaXMgTk9UIG5lY2Vzc2FyaWx5IHRoZSBzaXplIG9mIHRoZSBGcmFtZWJ1ZmZlciBvciBHQVBJLCBhcyB0aGV5IHJldHVybgorCSAqIHRoZSBkaXNwbGF5c2l6ZSBpbiBPUklFTlRBVElPTl9VUCAqLworCXRoaXMtPmluZm8uY3VycmVudF93ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CisJdGhpcy0+aW5mby5jdXJyZW50X2ggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKKworCS8qIFNvcnQgdGhlIG1vZGUgbGlzdHMgKi8KKwlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgeworCQlpZiAoIGdhcGktPlNETF9udW1tb2Rlc1tpXSA+IDAgKSB7CisJCQlTRExfcXNvcnQoZ2FwaS0+U0RMX21vZGVsaXN0W2ldLCBnYXBpLT5TRExfbnVtbW9kZXNbaV0sIHNpemVvZiAqZ2FwaS0+U0RMX21vZGVsaXN0W2ldLCBjbXBtb2Rlcyk7CisJCX0KKwl9CisKKwl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBnYXBpLT5neFByb3BlcnRpZXMuY0JQUCA8IDggPyAxNiA6ICh1bnNpZ25lZCBjaGFyKWdhcGktPmd4UHJvcGVydGllcy5jQlBQOworCisJLy8gR2V0IGNvbG9yIG1hc2sKKwlpZiAoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmZmRm9ybWF0ICYga2ZEaXJlY3Q1NjUpIHsKKwkJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gMTY7CisJCXZmb3JtYXQtPlJtYXNrID0gMHgwMDAwZjgwMDsKKwkJdmZvcm1hdC0+R21hc2sgPSAweDAwMDAwN2UwOworCQl2Zm9ybWF0LT5CbWFzayA9IDB4MDAwMDAwMWY7CisJCWdhcGktPnZpZGVvTW9kZSA9IEdBUElfRElSRUNUXzU2NTsKKwl9CisJZWxzZQorCWlmIChnYXBpLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgJiBrZkRpcmVjdDU1NSkgeworCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSAxNjsKKwkJdmZvcm1hdC0+Um1hc2sgPSAweDAwMDA3YzAwOworCQl2Zm9ybWF0LT5HbWFzayA9IDB4MDAwMDAzZTA7CisJCXZmb3JtYXQtPkJtYXNrID0gMHgwMDAwMDAxZjsKKwkJZ2FwaS0+dmlkZW9Nb2RlID0gR0FQSV9ESVJFQ1RfNTU1OworCX0KKwllbHNlCisJaWYgKChnYXBpLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgJiBrZkRpcmVjdCkgJiYgKGdhcGktPmd4UHJvcGVydGllcy5jQlBQIDwgOCkpIHsKKwkJLy8gV2UnbGwgcGVyZm9ybSB0aGUgY29udmVyc2lvbgorCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSAxNjsKKwkJdmZvcm1hdC0+Um1hc2sgPSAweDAwMDBmODAwOyAvLyAxNiBiaXQgNTY1CisJCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDdlMDsKKwkJdmZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMDFmOworCQlpZiAoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmZmRm9ybWF0ICYga2ZEaXJlY3RJbnZlcnRlZCkKKwkJCWdhcGktPmludmVydCA9ICgxIDw8IGdhcGktPmd4UHJvcGVydGllcy5jQlBQKSAtIDE7CisJCWdhcGktPmNvbG9yc2NhbGUgPSBnYXBpLT5neFByb3BlcnRpZXMuY0JQUCA8IDggPyA4IC0gZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFAgOiAwOworCQlnYXBpLT52aWRlb01vZGUgPSBHQVBJX01PTk87CisJfQorCWVsc2UKKwlpZiAoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmZmRm9ybWF0ICYga2ZQYWxldHRlKSB7CisJCWdhcGktPnZpZGVvTW9kZSA9IEdBUElfUEFMRVRURTsKKwl9IAorCisJLyogV2UncmUgZG9uZSEgKi8KKwlyZXR1cm4oMCk7Cit9CisKK1NETF9SZWN0ICoqR0FQSV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCit7CisJcmV0dXJuKGdhcGktPlNETF9tb2RlbGlzdFsoKGZvcm1hdC0+Qml0c1BlclBpeGVsKzcpLzgpLTFdKTsKKy8vICAJIHJldHVybiAoU0RMX1JlY3QgKiopIC0xOworfQorCitTRExfU3VyZmFjZSAqR0FQSV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAorCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworCVNETF9TdXJmYWNlICp2aWRlbzsgCisJVWludDMyIFJtYXNrLCBHbWFzaywgQm1hc2s7IAorCURXT1JEIHN0eWxlOyAKKwlTRExfUmVjdCBhbGxTY3JlZW47CisKKwlpZiggYnBwIDwgNCApCisJeworCQlTRExfU2V0RXJyb3IoIjEgYnBwIGFuZCAyIGJwcCBtb2RlcyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSZWNhbGN1bGF0ZSBiaXRtYXNrcyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoYnBwID09IGN1cnJlbnQtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSB7CisJCXZpZGVvID0gY3VycmVudDsKKwl9CisJZWxzZSB7CisJCXN3aXRjaChicHApIHsKKwkJCWNhc2UgODoKKwkJCQlSbWFzayA9IDA7CisJCQkJR21hc2sgPSAwOworCQkJCUJtYXNrID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTU6CQkJCQorCQkJY2FzZSAxNjoKKwkJCQkvKiBEZWZhdWx0IGlzIDU2NSB1bmxlc3MgdGhlIGRpc3BsYXkgaXMgc3BlY2lmaWNhbGx5IDU1NSAqLworCQkJCWlmIChnYXBpLT5neFByb3BlcnRpZXMuZmZGb3JtYXQgJiBrZkRpcmVjdDU1NSkgeworCQkJCQlSbWFzayA9IDB4MDAwMDdjMDA7CisJCQkJCUdtYXNrID0gMHgwMDAwMDNlMDsKKwkJCQkJQm1hc2sgPSAweDAwMDAwMDFmOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJUm1hc2sgPSAweDAwMDBmODAwOworCQkJCQlHbWFzayA9IDB4MDAwMDA3ZTA7CisJCQkJCUJtYXNrID0gMHgwMDAwMDAxZjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDI0OgorCQkJY2FzZSAzMjoKKwkJCQlSbWFzayA9IDB4MDBmZjAwMDA7CisJCQkJR21hc2sgPSAweDAwMDBmZjAwOworCQkJCUJtYXNrID0gMHgwMDAwMDBmZjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBCaXRzIFBlciBQaXhlbCBmb3JtYXQgcmVxdWVzdGVkIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdmlkZW8gPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLAorCQkJCQkwLCAwLCBicHAsIFJtYXNrLCBHbWFzaywgQm1hc2ssIDApOworCQlpZiAoIHZpZGVvID09IE5VTEwgKSB7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCX0KKworCWdhcGktPnVzZXJPcmllbnRhdGlvbiA9IFNETF9PUklFTlRBVElPTl9VUDsKKwlnYXBpLT5zeXN0ZW1PcmllbnRhdGlvbiA9IFNETF9PUklFTlRBVElPTl9VUDsKKwl2aWRlby0+ZmxhZ3MgPSBTRExfRlVMTFNDUkVFTjsJLyogQ2xlYXIgZmxhZ3MsIEdBUEkgc3VwcG9ydHMgZnVsbHNjcmVlbiBvbmx5ICovCisKKwkvKiBHQVBJIG9yIFZHQT8gKi8KKwlpZiggZ19oR2FwaUxpYiApCisJeworCQlGaWxsU3RydWN0cyh0aGlzLCAwKTsKKwkJaWYoICgoKHVuc2lnbmVkKXdpZHRoICE9IGdhcGktPmd4UHJvcGVydGllcy5jeFdpZHRoKSB8fCAoKHVuc2lnbmVkKWhlaWdodCAhPSBnYXBpLT5neFByb3BlcnRpZXMuY3lIZWlnaHQpKQorCQkJJiYgKCgodW5zaWduZWQpd2lkdGggIT0gZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN5SGVpZ2h0KSB8fCAoKHVuc2lnbmVkKWhlaWdodCAhPSBnYXBpLT5neFByb3BlcnRpZXMuY3hXaWR0aCkpKQorCQkJRmlsbFN0cnVjdHModGhpcywgMSk7IC8vIGdhcGkgaXMgZm91bmQgYnV0IHdlIHVzZSBWR0EgcmVzb2x1dGlvbgkJCQorCX0gZWxzZQorCQlGaWxsU3RydWN0cyh0aGlzLCAxKTsKKworCWlmICggIWdhcGktPm5lZWRVcGRhdGUgJiYgIWdhcGktPnZpZGVvTWVtKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IGFkZHJlc3Mgb2YgdmlkZW8gbWVtb3J5LCBtYXkgYmUgdW5zdXBwb3J0ZWQgZGV2aWNlIG9yIGJ1ZyIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogZGV0ZWN0IHVzZXIgbGFuZHNjYXBlIG1vZGUgKi8KKyAgICAgICBpZiggKHdpZHRoID4gaGVpZ2h0KSAmJiAoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGggPCBnYXBpLT5neFByb3BlcnRpZXMuY3lIZWlnaHQpKQorCQlnYXBpLT51c2VyT3JpZW50YXRpb24gPSBTRExfT1JJRU5UQVRJT05fUklHSFQ7CisKKyAgICAgICBpZihHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKSA8IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pKQorCQlnYXBpLT5zeXN0ZW1PcmllbnRhdGlvbiA9IFNETF9PUklFTlRBVElPTl9SSUdIVDsKKworCWdhcGktPmhpcmVzRml4ID0gMDsKKworCS8qIGNoZWNrIGhpcmVzICovCisJaWYoR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTikgPCB3aWR0aCAmJiBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKSA8IGhlaWdodCkKKwl7CisJICAgIGdhcGktPmhpcmVzRml4ID0gMTsKKwl9CisKKwlzd2l0Y2goIGdhcGktPnVzZXJPcmllbnRhdGlvbiApCisJeworCWNhc2UgU0RMX09SSUVOVEFUSU9OX1VQOgorCQlnYXBpLT5zdGFydE9mZnNldCA9IDA7CisJCWdhcGktPmRzdExpbmVTdGVwID0gZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieVBpdGNoOworCQlnYXBpLT5kc3RQaXhlbFN0ZXAgPSBnYXBpLT5neFByb3BlcnRpZXMuY2J4UGl0Y2g7CisJCWJyZWFrOworCWNhc2UgU0RMX09SSUVOVEFUSU9OX1JJR0hUOgorCQlzd2l0Y2goIGdhcGktPmdhcGlPcmllbnRhdGlvbiApCisJCXsKKwkJY2FzZSBTRExfT1JJRU5UQVRJT05fVVA6CisJCWNhc2UgU0RMX09SSUVOVEFUSU9OX1JJR0hUOgorCQljYXNlIFNETF9PUklFTlRBVElPTl9MRUZUOgorCQkJaWYoIChnYXBpLT52aWRlb01vZGUgPT0gR0FQSV9NT05PKSApCisJCQkJZ2FwaS0+c3RhcnRPZmZzZXQgPSAtZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieFBpdGNoICsgMTsgLy8gbW9ub2Nocm9tZSBtb2RlCisJCQllbHNlCisJCQkJZ2FwaS0+c3RhcnRPZmZzZXQgPSBnYXBpLT5neFByb3BlcnRpZXMuY2J5UGl0Y2ggKiAoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN5SGVpZ2h0IC0gMSk7CisJCQkJCisJCQlnYXBpLT5kc3RMaW5lU3RlcCA9IGdhcGktPmd4UHJvcGVydGllcy5jYnhQaXRjaDsKKwkJCWdhcGktPmRzdFBpeGVsU3RlcCA9IC1nYXBpLT5neFByb3BlcnRpZXMuY2J5UGl0Y2g7CisJCQlicmVhazsKKwkJfQorCX0KKworCXZpZGVvLT53ID0gZ2FwaS0+dyA9IHdpZHRoOworCXZpZGVvLT5oID0gZ2FwaS0+aCA9IGhlaWdodDsKKwl2aWRlby0+cGl0Y2ggPSBTRExfQ2FsY3VsYXRlUGl0Y2godmlkZW8pOyAKKworCS8qIFNtYWxsIGZpeCBmb3IgV2luQ0UvV2luMzIgLSB3aGVuIGFjdGl2YXRpbmcgd2luZG93CisJICAgU0RMX1ZpZGVvU3VyZmFjZSBpcyBlcXVhbCB0byB6ZXJvLCBzbyBhY3RpdmF0aW5nIGNvZGUKKwkgICBpcyBub3QgY2FsbGVkIHByb3Blcmx5IGZvciBmdWxsc2NyZWVuIHdpbmRvd3MgYmVjYXVzZQorCSAgIG1hY3JvcyBXSU5ESUJfRlVMTFNDUkVFTiB1c2VzIFNETF9WaWRlb1N1cmZhY2UKKwkqLworCVNETF9WaWRlb1N1cmZhY2UgPSB2aWRlbzsKKworCS8qIEdBUEkgaXMgYWx3YXlzIGZ1bGxzY3JlZW4sIHRpdGxlIGJhciBpcyB1c2VsZXNzICovCisJc3R5bGUgPSAwOworCisJaWYgKCFTRExfd2luZG93aWQpCisJCVNldFdpbmRvd0xvbmcoU0RMX1dpbmRvdywgR1dMX1NUWUxFLCBzdHlsZSk7CisKKwkvKiBBbGxvY2F0ZSBiaXRtYXAgKi8KKwlpZiggZ2FwaS0+YnVmZmVyICkgCisJeworCQlTRExfZnJlZSggZ2FwaS0+YnVmZmVyICk7CisJCWdhcGktPmJ1ZmZlciA9IE5VTEw7CisJfQorCWdhcGktPmJ1ZmZlciA9IFNETF9tYWxsb2ModmlkZW8tPmggKiB2aWRlby0+cGl0Y2gpOworCXZpZGVvLT5waXhlbHMgPSBnYXBpLT5idWZmZXI7IAorCisJaWYgKCAhIGdhcGktPmJ1ZmZlciApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBidWZmZXIgZm9yIHJlcXVlc3RlZCBtb2RlIik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwlTRExfbWVtc2V0KGdhcGktPmJ1ZmZlciwgMjU1LCB2aWRlby0+aCAqIHZpZGVvLT5waXRjaCk7CisJTW92ZVdpbmRvdyhTRExfV2luZG93LCAwLCAwLCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKSwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTiksIEZBTFNFKTsKKwlTaG93V2luZG93KFNETF9XaW5kb3csIFNXX1NIT1cpOworCVNldEZvcmVncm91bmRXaW5kb3coU0RMX1dpbmRvdyk7CisKKwkvKiBKQyAxNCBNYXIgMjAwNgorCQlGbHVzaCB0aGUgbWVzc2FnZSBsb29wIG9yIHRoaXMgY2FuIGNhdXNlIGJpZyBwcm9ibGVtcyBsYXRlcgorCQlFc3BlY2lhbGx5IGlmIHRoZSB1c2VyIGRlY2lkZXMgdG8gdXNlIGRpYWxvZyBib3hlcyBvciBhc3NlcnQoKSEKKwkqLworCVdJTl9GbHVzaE1lc3NhZ2VRdWV1ZSgpOworCisgICAgICAgLyogT3BlbiBHQVBJIGRpc3BsYXkgKi8KKyAgICAgICBpZiggIWdhcGktPnVzZVZnYSAmJiBnYXBpLT51c2VHWE9wZW5EaXNwbGF5ICYmICFnYXBpLT5hbHJlYWR5R1hPcGVuZWQgKQorICAgICAgIHsKKyNpZiBSRVBPUlRfVklERU9fSU5GTworICAgICAgICAgICAgICAgcHJpbnRmKCJzeXN0ZW0gZGlzcGxheSB3aWR0aCAgKG9yaWcpOiAlZFxuIiwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTikpOworICAgICAgICAgICAgICAgcHJpbnRmKCJzeXN0ZW0gZGlzcGxheSBoZWlnaHQgKG9yaWcpOiAlZFxuIiwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTikpOworI2VuZGlmCisgICAgICAgICAgICAgICBnYXBpLT5hbHJlYWR5R1hPcGVuZWQgPSAxOworCQlpZiggIWdhcGktPmd4RnVuYy5HWE9wZW5EaXNwbGF5KFNETF9XaW5kb3csIEdYX0ZVTExTQ1JFRU4pICkKKwkJeworCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBpbml0aWFsaXplIEdBUEkiKTsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorICAgICAgIH0KKworCWlmKGdhcGktPnVzZVZnYSkKKwkJZ2FwaS0+Y29vcmRpbmF0ZVRyYW5zZm9ybSA9ICg0IC0gZ2FwaS0+c3lzdGVtT3JpZW50YXRpb24gKyBnYXBpLT51c2VyT3JpZW50YXRpb24pICUgNDsKKwllbHNlCisJCWdhcGktPmNvb3JkaW5hdGVUcmFuc2Zvcm0gPSBnYXBpLT51c2VyT3JpZW50YXRpb247CisKKyNpZiBSRVBPUlRfVklERU9fSU5GTworCXByaW50ZigiVmlkZW8gcHJvcGVydGllczpcbiIpOworCXByaW50ZigiZGlzcGxheSBicHA6ICVkXG4iLCBnYXBpLT5neFByb3BlcnRpZXMuY0JQUCk7CisJcHJpbnRmKCJkaXNwbGF5IHdpZHRoOiAlZFxuIiwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmN4V2lkdGgpOworCXByaW50ZigiZGlzcGxheSBoZWlnaHQ6ICVkXG4iLCBnYXBpLT5neFByb3BlcnRpZXMuY3lIZWlnaHQpOworICAgICAgIHByaW50Zigic3lzdGVtIGRpc3BsYXkgd2lkdGg6ICVkXG4iLCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKSk7CisgICAgICAgcHJpbnRmKCJzeXN0ZW0gZGlzcGxheSBoZWlnaHQ6ICVkXG4iLCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKSk7CisJcHJpbnRmKCJ4IHBpdGNoOiAlZFxuIiwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNieFBpdGNoKTsKKwlwcmludGYoInkgcGl0Y2g6ICVkXG4iLCBnYXBpLT5neFByb3BlcnRpZXMuY2J5UGl0Y2gpOworCXByaW50ZigiZ2FwaSBmbGFnczogMHgleFxuIiwgZ2FwaS0+Z3hQcm9wZXJ0aWVzLmZmRm9ybWF0KTsKKyAgICAgICBwcmludGYoInVzZXIgb3JpZW50YXRpb246ICVkXG4iLCBnYXBpLT51c2VyT3JpZW50YXRpb24pOworCXByaW50Zigic3lzdGVtIG9yaWVudGF0aW9uOiAlZFxuIiwgZ2FwaS0+c3lzdGVtT3JpZW50YXRpb24pOworICAgICAgIHByaW50ZigiZ2FwaSBvcmllbnRhdGlvbjogJWRcbiIsIGdhcGktPmdhcGlPcmllbnRhdGlvbik7CisKKworCWlmKCAhZ2FwaS0+dXNlVmdhICYmIGdhcGktPnVzZUdYT3BlbkRpc3BsYXkgJiYgZ2FwaS0+bmVlZFVwZGF0ZSkKKwl7CisJCWdhcGktPnZpZGVvTWVtID0gZ2FwaS0+Z3hGdW5jLkdYQmVnaW5EcmF3KCk7IAorCQlnYXBpLT5neEZ1bmMuR1hFbmREcmF3KCk7CisJfQorCisJcHJpbnRmKCJ2aWRlbyBtZW1vcnk6IDB4JXhcbiIsIGdhcGktPnZpZGVvTWVtKTsKKwlwcmludGYoIm5lZWQgdXBkYXRlOiAlZFxuIiwgZ2FwaS0+bmVlZFVwZGF0ZSk7CisJcHJpbnRmKCJoaS1yZXMgZml4OiAlZFxuIiwgZ2FwaS0+aGlyZXNGaXgpOworCXByaW50ZigiVkdBIGlzIGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlOiAlZFxuIiwgZ19iUmF3QnVmZmVyQXZhaWxhYmxlKTsKKwlwcmludGYoInVzZSByYXcgZnJhbWVidWZmZXI6ICVkXG4iLCBnYXBpLT51c2VWZ2EpOworCXByaW50ZigidmlkZW8gc3VyZmFjZSBicHA6ICVkXG4iLCB2aWRlby0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpOworCXByaW50ZigidmlkZW8gc3VyZmFjZSB3aWR0aDogJWRcbiIsIHZpZGVvLT53KTsKKwlwcmludGYoInZpZGVvIHN1cmZhY2UgaGVpZ2h0OiAlZFxuIiwgdmlkZW8tPmgpOworCXByaW50ZigibW91c2UvYXJyb3dzIHRyYW5zZm9ybWF0aW9uIGFuZ2xlOiAlZFxuIiwgZ2FwaS0+Y29vcmRpbmF0ZVRyYW5zZm9ybSk7CisjZW5kaWYKKworCisJLyogQmxhbmsgc2NyZWVuICovCisJYWxsU2NyZWVuLnggPSBhbGxTY3JlZW4ueSA9IDA7CisJYWxsU2NyZWVuLncgPSB2aWRlby0+dyAtIDE7CisJYWxsU2NyZWVuLmggPSB2aWRlby0+aCAtIDE7CisJR0FQSV9VcGRhdGVSZWN0cyh0aGlzLCAxLCAmYWxsU2NyZWVuKTsKKworCS8qIFdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4odmlkZW8pOworfQorCisvKiBXZSBkb24ndCBhY3R1YWxseSBhbGxvdyBoYXJkd2FyZSBzdXJmYWNlcyBvdGhlciB0aGFuIHRoZSBtYWluIG9uZSAqLworc3RhdGljIGludCBHQVBJX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oLTEpOworfQorc3RhdGljIHZvaWQgR0FQSV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKKy8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSBvbiBwYWdlIGZsaXBwZWQgZGlzcGxheXMgKi8KK3N0YXRpYyBpbnQgR0FQSV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIEdBUElfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlTGluZTh0bzgoX1RISVMsIHVuc2lnbmVkIGNoYXIgKnNyY1BvaW50ZXIsIHVuc2lnbmVkIGNoYXIgKmRlc3RQb2ludGVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBsaW5lcykKK3sKKwlpZiggZ2FwaS0+ZHN0UGl4ZWxTdGVwID09IDEpIC8qIG9wdGltaXplZCBibGl0dGluZyBvbiBtb3N0IGRldmljZXMgKi8KKwl7CisJCVNETF9tZW1jcHkoZGVzdFBvaW50ZXIsIHNyY1BvaW50ZXIsIHdpZHRoKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlCisJeworCQkvLyBUT0RPOiByZWFkIDQgcGl4ZWxzLCB3cml0ZSBEV09SRAorCQlpbnQgc3RlcCA9IGdhcGktPmRzdFBpeGVsU3RlcDsKKwkJd2hpbGUod2lkdGgtLSkKKwkJeworCQkJKmRlc3RQb2ludGVyID0gKnNyY1BvaW50ZXIrKzsKKwkJCWRlc3RQb2ludGVyICs9IHN0ZXA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIFZpZGVvIG1lbW9yeSBpcyB2ZXJ5IHNsb3cgc28gbGV0cyBvcHRpbWl6ZSBhcyBtdWNoIGFzIHBvc3NpYmxlICovCitzdGF0aWMgaW50IHVwZGF0ZUxpbmUxNnRvMTYoX1RISVMsIFBJWEVMICpzcmNQb2ludGVyLCBQSVhFTCAqZGVzdFBvaW50ZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxpbmVzKQoreworCVBJWEVMICpsaW5lMSwgKmxpbmUyOworCWludCBzdGVwID0gZ2FwaS0+ZHN0UGl4ZWxTdGVwIC8gMjsKKworCWlmKCBzdGVwID09IDEgKSAvKiBvcHRpbWl6ZWQgYmxpdHRpbmcgb24gbW9zdCBkZXZpY2VzICovCisJeworCQlTRExfbWVtY3B5KGRlc3RQb2ludGVyLCBzcmNQb2ludGVyLCB3aWR0aCAqIHNpemVvZihQSVhFTCkpOworCQlyZXR1cm4gMTsKKwl9CisJZWxzZQorCXsKKwkJaWYoIChnYXBpLT5nYXBpT3JpZW50YXRpb24gIT0gU0RMX09SSUVOVEFUSU9OX1VQKSAmJgorCQkJKGdhcGktPnVzZXJPcmllbnRhdGlvbiA9PSBTRExfT1JJRU5UQVRJT05fVVAgKSkgLy8gaVBhcSAzNjYwLzM4MDAgYW5kIHVzZXIgb3JpZW50YXRpb24gdXAKKwkJewkKKwkJCS8vIHRvIHByZXZlbnQgZGF0YSBtaXNhbGlnbm1lbnQgY29weSBvbmx5IG9uZSBsaW5lCisJCQlpZiggKCgoKHVuc2lnbmVkKWRlc3RQb2ludGVyICYgMykgIT0gMCkgJiYgKGdhcGktPmdhcGlPcmllbnRhdGlvbiA9PSBTRExfT1JJRU5UQVRJT05fTEVGVCkpIAorCQkJCXx8ICgoKCh1bnNpZ25lZClkZXN0UG9pbnRlciAmIDMpID09IDApICYmIChnYXBpLT5nYXBpT3JpZW50YXRpb24gIT0gU0RMX09SSUVOVEFUSU9OX0xFRlQpKQorCQkJCXx8IChsaW5lcyA9PSAxKSApIAorCQkJeworCQkJCXdoaWxlKHdpZHRoLS0pCisJCQkJeworCQkJCQkqZGVzdFBvaW50ZXIgPSAqc3JjUG9pbnRlcisrOworCQkJCQlkZXN0UG9pbnRlciArPSBzdGVwOworCQkJCX0KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJLyogcmVhZCB0d28gbGluZXMgYXQgdGhlIHNhbWUgdGltZSwgd3JpdGUgRFdPUkQgKi8KKwkJCWxpbmUxID0gc3JjUG9pbnRlcjsKKwkJCWxpbmUyID0gc3JjUG9pbnRlciArIFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoIC8gMjsKKworCQkJaWYoIGdhcGktPmdhcGlPcmllbnRhdGlvbiA9PSBTRExfT1JJRU5UQVRJT05fTEVGVCApCisJCQkJd2hpbGUod2lkdGgtLSkgLy8gaVBhcSAzODAwCisJCQkJeworCQkJCQkqKERXT1JEKilkZXN0UG9pbnRlciA9KCpsaW5lMisrIDw8IDE2KSB8ICpsaW5lMSsrOworCQkJCQlkZXN0UG9pbnRlciArPSBzdGVwOworCQkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkZXN0UG9pbnRlciArPSBnYXBpLT5neFByb3BlcnRpZXMuY2J5UGl0Y2ggLyAyOworCisJCQkJd2hpbGUod2lkdGgtLSkgLy8gaVBhcSAzNjYwCisJCQkJeworCQkJCQkqKERXT1JEKilkZXN0UG9pbnRlciA9KCpsaW5lMSsrIDw8IDE2KSB8ICpsaW5lMisrOworCQkJCQlkZXN0UG9pbnRlciArPSBzdGVwOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiAyOworCQl9IGVsc2UKKwkJeworCQkJLy8gaVBhcSAzODAwIGFuZCB1c2VyIG9yaWVudGF0aW9uIGxhbmRzY2FwZQorCQkJaWYoIGdhcGktPmdhcGlPcmllbnRhdGlvbiA9PSBTRExfT1JJRU5UQVRJT05fTEVGVCApCisJCQl7CisJCQkJaW50IHcxOworCisJCQkJLy8gdG8gcHJldmVudCBkYXRhIG1pc2FsaWdubWVudCBjb3B5IG9ubHkgb25lIHBpeGVsCisJCQkJaWYoICgoKHVuc2lnbmVkKWRlc3RQb2ludGVyICYgMykgPT0gMCkgJiYgKHdpZHRoID4gMCkpIAorCQkJCXsKKwkJCQkJKmRlc3RQb2ludGVyLS0gPSAqc3JjUG9pbnRlcisrOworCQkJCQl3aWR0aC0tOworCQkJCX0KKworCQkJCWRlc3RQb2ludGVyLS07CisKKwkJCQl3MSA9IHdpZHRoIC8gMjsKKworCQkJCXdoaWxlKHcxLS0pCisJCQkJeworCQkJCQlEV09SRCBwID0gKihEV09SRCopc3JjUG9pbnRlcjsKKwkJCQkJKigoRFdPUkQqKWRlc3RQb2ludGVyKSA9IChwIDw8IDE2KSB8IChwID4+IDE2KTsKKwkJCQkJZGVzdFBvaW50ZXIgLT0gMjsKKwkJCQkJc3JjUG9pbnRlciArPSAyOworCQkJCX0KKworCQkJCWlmKCB3aWR0aCAmIDEgKSAvLyBjb3B5IHRoZSBsYXN0IHBpeGVsCisJCQkJeworCQkJCQlkZXN0UG9pbnRlcisrOworCQkJCQkqZGVzdFBvaW50ZXIgPSAqc3JjUG9pbnRlcjsKKwkJCQl9CisKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJLy8gbW9kZXJuIGlQYXFzIGFuZCB1c2VyIG9yaWVudGF0aW9uIGxhbmRzY2FwZQorCQkJLy8gcmVhZCB0d28gcGl4ZWxzLCB3cml0ZSBEV09SRAorCisJCQlsaW5lMSA9IHNyY1BvaW50ZXI7CisJCQlsaW5lMiA9IHNyY1BvaW50ZXIgKyBTRExfVmlkZW9TdXJmYWNlLT5waXRjaCAvIDI7CisKKwkJCWlmKCAoKCh1bnNpZ25lZClkZXN0UG9pbnRlciAmIDMpICE9IDApIHx8IChsaW5lcyA9PSAxKSApIAorCQkJeworCQkJCXdoaWxlKHdpZHRoLS0pCisJCQkJeworCQkJCQkqZGVzdFBvaW50ZXIgPSAqc3JjUG9pbnRlcisrOworCQkJCQlkZXN0UG9pbnRlciArPSBzdGVwOworCQkJCX0KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCQorCQkJd2hpbGUod2lkdGgtLSkKKwkJCXsKKwkJCQkqKERXT1JEKilkZXN0UG9pbnRlciA9KCpsaW5lMisrIDw8IDE2KSB8ICpsaW5lMSsrOworCQkJCWRlc3RQb2ludGVyIC09IGdhcGktPmd4UHJvcGVydGllcy5jYnlQaXRjaCAvIDI7CisJCQl9CisJCQlyZXR1cm4gMjsKKwkJfQorCX0KK30KKworLy8gQ29sb3IgY29tcG9uZW50IG1hc2tzIGZvciA1NjUKKyNkZWZpbmUgUkVETUFTSyAoMzE8PDExKQorI2RlZmluZSBHUkVFTk1BU0sgKDYzPDw1KQorI2RlZmluZSBCTFVFTUFTSyAoMzEpCisKKworc3RhdGljIGludCB1cGRhdGVMaW5lMTZ0bzQoX1RISVMsIFBJWEVMICpzcmNQb2ludGVyLCB1bnNpZ25lZCBjaGFyICpkZXN0UG9pbnRlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbGluZXMsIGludCB5TmliYmxlLCBpbnQgeE5pYmJsZSkKK3sKKwlQSVhFTCAqbGluZTEsICpsaW5lMjsKKwlpbnQgc3RlcCA9IGdhcGktPmRzdFBpeGVsU3RlcDsKKworCWlmKCBnYXBpLT51c2VyT3JpZW50YXRpb24gPT0gU0RMX09SSUVOVEFUSU9OX1VQICkKKwl7CisJCWlmKCB5TmliYmxlICkgLy8gY29weSBib3R0b20gaGFsZiBvZiBhIGxpbmUKKwkJeworCQkJd2hpbGUod2lkdGgtLSkKKwkJCXsKKwkJCQlQSVhFTCBjMSA9ICpzcmNQb2ludGVyKys7CisJCQkJYzEgPSAoKGMxICYgUkVETUFTSykgPj4gMTEpICsgKChjMSAmIEdSRUVOTUFTSykgPj4gNSkgKyAoYzEgJiBCTFVFTUFTSyk7CQkJCisJCQkJKmRlc3RQb2ludGVyID0gKCpkZXN0UG9pbnRlciAmIDB4MEYpIHwgKCh+KGMxID4+IDMpIDw8IDQpKTsKKwkJCQlkZXN0UG9pbnRlciArPSBzdGVwOworCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKworCQkvLyBlaXRoZXIgMSBwaXhlbCBwaWN0dXJlIG9yIHRhaWwsIGFueXdheSB0aGlzIGlzIHRoZSBsYXN0IGxpbmUKKwkJaWYoIGxpbmVzID09IDEgKQorCQl7CisJCQl3aGlsZSh3aWR0aC0tKQorCQkJeworCQkJCVBJWEVMIGMxID0gKnNyY1BvaW50ZXIrKzsKKwkJCQljMSA9ICgoYzEgJiBSRURNQVNLKSA+PiAxMSkgKyAoKGMxICYgR1JFRU5NQVNLKSA+PiA1KSArIChjMSAmIEJMVUVNQVNLKTsJCQkKKwkJCQkqZGVzdFBvaW50ZXIgPSAoKmRlc3RQb2ludGVyICYgMHhGMCkgfCAoKH4oYzEgPj4gMykgJiAweEYpKTsKKwkJCQlkZXN0UG9pbnRlciArPSBzdGVwOworCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKworCQlsaW5lMSA9IHNyY1BvaW50ZXI7CisJCWxpbmUyID0gc3JjUG9pbnRlciArIFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoIC8gMjsKKworCQl3aGlsZSh3aWR0aC0tKQorCQl7CisJCQlQSVhFTCBjMSA9ICpsaW5lMSsrOworCQkJUElYRUwgYzIgPSAqbGluZTIrKzsKKwkJCWMxID0gKChjMSAmIFJFRE1BU0spID4+IDExKSArICgoYzEgJiBHUkVFTk1BU0spID4+IDUpICsgKGMxICYgQkxVRU1BU0spOworCQkJYzIgPSAoKGMyICYgUkVETUFTSykgPj4gMTEpICsgKChjMiAmIEdSRUVOTUFTSykgPj4gNSkgKyAoYzIgJiBCTFVFTUFTSyk7CisJCQkqZGVzdFBvaW50ZXIgPSB+KChjMSA+PiAzKSArICgoYzIgPj4gMykgPDwgNCkpOworCQkJZGVzdFBvaW50ZXIgKz0gc3RlcDsKKwkJfQorCQlyZXR1cm4gMjsKKwl9IGVsc2UKKwl7CisJCWludCB3MTsKKwkJdzEgPSB3aWR0aCAvIDI7CisKKwkJaWYoIHhOaWJibGUgKQorCQl7CisJCQkvLyBjb3B5IG9uZSBwaXhlbAorCQkJUElYRUwgYzEgPSAqc3JjUG9pbnRlcisrOworCQkJYzEgPSAoKGMxICYgUkVETUFTSykgPj4gMTEpICsgKChjMSAmIEdSRUVOTUFTSykgPj4gNSkgKyAoYzEgJiBCTFVFTUFTSyk7CQkJCisJCQkqZGVzdFBvaW50ZXIgPSAoKmRlc3RQb2ludGVyICYgMHhGMCkgfCAoKH4oYzEgPj4gMykgJiAweEYpKTsKKwkJCWRlc3RQb2ludGVyKys7CisJCX0KKworCQl3aGlsZSh3MS0tKQorCQl7CisJCQlQSVhFTCBjMSA9ICpzcmNQb2ludGVyOworCQkJUElYRUwgYzIgPSAqKHNyY1BvaW50ZXIgKyAxKTsKKwkJCWMxID0gKChjMSAmIFJFRE1BU0spID4+IDExKSArICgoYzEgJiBHUkVFTk1BU0spID4+IDUpICsgKGMxICYgQkxVRU1BU0spOworCQkJYzIgPSAoKGMyICYgUkVETUFTSykgPj4gMTEpICsgKChjMiAmIEdSRUVOTUFTSykgPj4gNSkgKyAoYzIgJiBCTFVFTUFTSyk7CisJCQkqZGVzdFBvaW50ZXIrKyA9IH4oKGMyID4+IDMpICsgKChjMSA+PiAzKSA8PCA0KSk7CisJCQlzcmNQb2ludGVyICs9IDI7CisJCX0KKworCQkvLyBjb3B5IHRhaWwKKwkJaWYoICh3aWR0aCAmIDEpICYmICF4TmliYmxlICkKKwkJeworCQkJUElYRUwgYzEgPSAqc3JjUG9pbnRlcjsKKwkJCWMxID0gKChjMSAmIFJFRE1BU0spID4+IDExKSArICgoYzEgJiBHUkVFTk1BU0spID4+IDUpICsgKGMxICYgQkxVRU1BU0spOwkJCQorCQkJKmRlc3RQb2ludGVyID0gKCpkZXN0UG9pbnRlciAmIDB4MEYpIHwgKCh+KGMxID4+IDMpIDw8IDQpKTsKKwkJfQorCisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIHZvaWQgR0FQSV9VcGRhdGVSZWN0c01vbm8oX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCWludCBpLCBoZWlnaHQ7CisJaW50IGxpbmVzUHJvY2Vzc2VkOworCWludCB4TmliYmxlLCB5TmliYmxlOworCisJZm9yIChpPTA7IGk8bnVtcmVjdHM7IGkrKykKKwl7CisJCXVuc2lnbmVkIGNoYXIgKmRlc3RQb2ludGVyOworCQl1bnNpZ25lZCBjaGFyICpzcmNQb2ludGVyOworCisJCWlmKCBnYXBpLT51c2VyT3JpZW50YXRpb24gPT0gU0RMX09SSUVOVEFUSU9OX1VQICkKKwkJCWRlc3RQb2ludGVyID0gKHVuc2lnbmVkIGNoYXIqKSBnYXBpLT52aWRlb01lbSArIGdhcGktPnN0YXJ0T2Zmc2V0IC0gcmVjdHNbaV0ueSAqIGdhcGktPmd4UHJvcGVydGllcy5jQlBQIC8gOCArIHJlY3RzW2ldLnggKiBnYXBpLT5kc3RQaXhlbFN0ZXA7CisJCWVsc2UKKwkJCWRlc3RQb2ludGVyID0gKHVuc2lnbmVkIGNoYXIqKSBnYXBpLT52aWRlb01lbSArIGdhcGktPnN0YXJ0T2Zmc2V0ICsgcmVjdHNbaV0ueCAqIGdhcGktPmd4UHJvcGVydGllcy5jQlBQIC8gOCArIHJlY3RzW2ldLnkgKiBnYXBpLT5kc3RMaW5lU3RlcDsKKworCQlzcmNQb2ludGVyID0gKCh1bnNpZ25lZCBjaGFyKikgU0RMX1ZpZGVvU3VyZmFjZS0+cGl4ZWxzKSArIHJlY3RzW2ldLnkgKiBTRExfVmlkZW9TdXJmYWNlLT5waXRjaCArIHJlY3RzW2ldLnggKiAyOworCQl5TmliYmxlID0gcmVjdHNbaV0ueSAmIDE7IC8vIFRPRE86IG9ubHkgZm9yIDQgYnBwCisJCXhOaWJibGUgPSByZWN0c1tpXS54ICYgMTsKKwkJaGVpZ2h0ID0gcmVjdHNbaV0uaDsKKwkJd2hpbGUgKGhlaWdodCA+IDApCisJCXsKKwkJCXN3aXRjaChnYXBpLT5neFByb3BlcnRpZXMuY0JQUCkKKwkJCXsKKwkJCWNhc2UgMjogLy8gVE9ETworCQkJY2FzZSA0OgorCQkJCQlsaW5lc1Byb2Nlc3NlZCA9IHVwZGF0ZUxpbmUxNnRvNCh0aGlzLCAoUElYRUwqKSBzcmNQb2ludGVyLCBkZXN0UG9pbnRlciwgcmVjdHNbaV0udywgcmVjdHNbaV0uaCwgaGVpZ2h0LCB5TmliYmxlLCB4TmliYmxlKTsKKwkJCQkJeU5pYmJsZSA9IDA7CisJCQl9CisJCQloZWlnaHQgLT0gbGluZXNQcm9jZXNzZWQ7CisJCQlpZiggZ2FwaS0+dXNlck9yaWVudGF0aW9uID09IFNETF9PUklFTlRBVElPTl9VUCApCisJCQkJZGVzdFBvaW50ZXItLTsgLy8gYWx3YXlzIGZpbGwgMSBieXRlCisJCQllbHNlIGRlc3RQb2ludGVyICs9IGdhcGktPmRzdExpbmVTdGVwOworCQkJc3JjUG9pbnRlciArPSBTRExfVmlkZW9TdXJmYWNlLT5waXRjaCAqIGxpbmVzUHJvY2Vzc2VkOyAvLyBwaXRjaCBpbiBieXRlcworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBHQVBJX1VwZGF0ZVJlY3RzQ29sb3IoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCWludCBpLCBoZWlnaHQ7CisJaW50IGJ5dGVzUGVyUGl4ZWwgPSAoZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFAgKyAxKSAvIDg7CisJaW50IGxpbmVzUHJvY2Vzc2VkOworCWZvciAoaT0wOyBpPG51bXJlY3RzOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciAqZGVzdFBvaW50ZXIgPSAodW5zaWduZWQgY2hhciopIGdhcGktPnZpZGVvTWVtICsgZ2FwaS0+c3RhcnRPZmZzZXQgKyByZWN0c1tpXS55ICogZ2FwaS0+ZHN0TGluZVN0ZXAgKyByZWN0c1tpXS54ICogZ2FwaS0+ZHN0UGl4ZWxTdGVwOworCQl1bnNpZ25lZCBjaGFyICpzcmNQb2ludGVyID0gKCh1bnNpZ25lZCBjaGFyKikgU0RMX1ZpZGVvU3VyZmFjZS0+cGl4ZWxzKSArIHJlY3RzW2ldLnkgKiBTRExfVmlkZW9TdXJmYWNlLT5waXRjaCArIHJlY3RzW2ldLnggKiBieXRlc1BlclBpeGVsOworCQloZWlnaHQgPSByZWN0c1tpXS5oOworCisvLwkJZnByaW50ZihzdGRlcnIsICJTdGFydGluZyByZWN0ICVkeCVkLCBkc3Q9MHgleCwgdyA9ICVkLCBoID0gJWRcbiIsIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgsZGVzdFBvaW50ZXIscmVjdHNbaV0udyxyZWN0c1tpXS5oKTsKKy8vCQlmZmx1c2goc3RkZXJyKTsKKwkJbGluZXNQcm9jZXNzZWQgPSBoZWlnaHQ7CisKKwkJd2hpbGUgKGhlaWdodCA+IDApIHsKKwkJCXN3aXRjaChieXRlc1BlclBpeGVsKQorCQkJeworCQkJY2FzZSAxOgorCQkJCWxpbmVzUHJvY2Vzc2VkID0gdXBkYXRlTGluZTh0bzgodGhpcywgc3JjUG9pbnRlciwgKHVuc2lnbmVkIGNoYXIgKikgZGVzdFBvaW50ZXIsIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgsIGhlaWdodCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDEzMykKKwkJCQlsaW5lc1Byb2Nlc3NlZCA9IHVwZGF0ZUxpbmUxNnRvMTYodGhpcywgKFBJWEVMKikgc3JjUG9pbnRlciwgZGVzdFBvaW50ZXIsIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgsIGhlaWdodCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQloZWlnaHQgLT0gbGluZXNQcm9jZXNzZWQ7CisJCQlkZXN0UG9pbnRlciArPSBnYXBpLT5kc3RMaW5lU3RlcCAqIGxpbmVzUHJvY2Vzc2VkOworCQkJc3JjUG9pbnRlciArPSBTRExfVmlkZW9TdXJmYWNlLT5waXRjaCAqIGxpbmVzUHJvY2Vzc2VkOyAvLyBwaXRjaCBpbiBieXRlcworCQl9CisvLwkJZnByaW50ZihzdGRlcnIsICJFbmQgb2YgcmVjdFxuIik7CisvLwkJZmZsdXNoKHN0ZGVycik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIEdBUElfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCS8vIHdlIGRvIG5vdCB3YW50IHRvIGNvcnJ1cHQgdmlkZW8gbWVtb3J5CisJaWYoIGdhcGktPnN1c3BlbmRlZCApIHJldHVybjsKKworCWlmKCBnYXBpLT5uZWVkVXBkYXRlICkKKwkJZ2FwaS0+dmlkZW9NZW0gPSBnYXBpLT5neEZ1bmMuR1hCZWdpbkRyYXcoKTsgCisKKwlpZiggZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFAgPCA4ICkKKwkJR0FQSV9VcGRhdGVSZWN0c01vbm8odGhpcywgbnVtcmVjdHMsIHJlY3RzKTsKKwllbHNlCisJCUdBUElfVXBkYXRlUmVjdHNDb2xvcih0aGlzLCBudW1yZWN0cywgcmVjdHMpOworCisJaWYoIGdhcGktPm5lZWRVcGRhdGUgKQorCQlnYXBpLT5neEZ1bmMuR1hFbmREcmF3KCk7Cit9CisKKy8qIE5vdGU6ICBJZiB3ZSBhcmUgdGVybWluYXRlZCwgdGhpcyBjb3VsZCBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZgorICAgYW5vdGhlciBTREwgdmlkZW8gcm91dGluZSAtLSBub3RhYmx5IFVwZGF0ZVJlY3RzLgorKi8KK3ZvaWQgR0FQSV9WaWRlb1F1aXQoX1RISVMpCit7CisJaW50IGksIGo7CisJLyogRGVzdHJveSB0aGUgd2luZG93IGFuZCBldmVyeXRoaW5nIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworCWlmICggU0RMX1dpbmRvdyApIAorCXsKKwkgICAgaWYgKChnX2hHYXBpTGliICE9IDApICYmIHRoaXMgJiYgZ2FwaSAmJiBnYXBpLT5neEZ1bmMuR1hDbG9zZURpc3BsYXkgJiYgIWdhcGktPnVzZVZnYSkKKwkJCWdhcGktPmd4RnVuYy5HWENsb3NlRGlzcGxheSgpOyAKKworCQlpZiAodGhpcy0+c2NyZWVuLT5waXhlbHMgIT0gTlVMTCkKKwkJeworCQkJU0RMX2ZyZWUodGhpcy0+c2NyZWVuLT5waXhlbHMpOworCQkJdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOworCQl9CisJCWlmICggc2NyZWVuX2ljbiApIHsKKwkJCURlc3Ryb3lJY29uKHNjcmVlbl9pY24pOworCQkJc2NyZWVuX2ljbiA9IE5VTEw7CisJCX0KKworCQlESUJfRGVzdHJveVdpbmRvdyh0aGlzKTsKKwkJU0RMX1VucmVnaXN0ZXJBcHAoKTsKKworCQlTRExfV2luZG93ID0gTlVMTDsKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisKKy8vIFVubG9hZCB3aW5jZSBheWdzaGVsbCBsaWJyYXJ5IHRvIHByZXZlbnQgbGVhaworCQlpZiggYXlnc2hlbGwgKSAKKwkJeworCQkJRnJlZUxpYnJhcnkoYXlnc2hlbGwpOworCQkJYXlnc2hlbGwgPSBOVUxMOworCQl9CisjZW5kaWYKKworCS8qIEZyZWUgdmlkZW8gbW9kZSBsaXN0cyAqLworCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7CisJCWlmICggZ2FwaS0+U0RMX21vZGVsaXN0W2ldICE9IE5VTEwgKSB7CisJCQlmb3IgKCBqPTA7IGdhcGktPlNETF9tb2RlbGlzdFtpXVtqXTsgKytqICkKKwkJCQlTRExfZnJlZShnYXBpLT5TRExfbW9kZWxpc3RbaV1bal0pOworCQkJU0RMX2ZyZWUoZ2FwaS0+U0RMX21vZGVsaXN0W2ldKTsKKwkJCWdhcGktPlNETF9tb2RlbGlzdFtpXSA9IE5VTEw7CisJCX0KKwl9CisKKwl9CisKK30KKworc3RhdGljIHZvaWQgR0FQSV9BY3RpdmF0ZShfVEhJUywgQk9PTCBhY3RpdmUsIEJPT0wgbWluaW1pemVkKQoreworCS8vTm90aGluZyB0byBkbyBoZXJlIChhcyBmYXIgYXMgSSBrbm93KQorfQorCitzdGF0aWMgdm9pZCBHQVBJX1JlYWxpemVQYWxldHRlKF9USElTKQoreworCU91dHB1dERlYnVnU3RyaW5nKFRFWFQoIkdBUElfUmVhbGl6ZVBhbGV0dGUgTk9UIElNUExFTUVOVEVEICFcclxuIikpOworfQorCitzdGF0aWMgdm9pZCBHQVBJX1BhbGV0dGVDaGFuZ2VkKF9USElTLCBIV05EIHdpbmRvdykKK3sKKwlPdXRwdXREZWJ1Z1N0cmluZyhURVhUKCJHQVBJX1BhbGV0dGVDaGFuZ2VkIE5PVCBJTVBMRU1FTlRFRCAhXHJcbiIpKTsKK30KKworc3RhdGljIHZvaWQgR0FQSV9XaW5QQUlOVChfVEhJUywgSERDIGhkYykKK3sKKwkvLyBkcmF3IGN1cnJlbnQgb2Zmc2NyZWVuIGJ1ZmZlciBvbiBoZGMKKworCWludCBicHAgPSAxNjsgLy8gd2UgYWx3YXlzIHVzZSBlaXRoZXIgOCBvciAxNiBicHAgaW50ZXJuYWxseQorCUhHRElPQkogcHJldk9iamVjdDsKKwl1bnNpZ25lZCBzaG9ydCAqYml0bWFwRGF0YTsKKwlIQklUTUFQIGhiOworCUhEQyBzcmNEQzsKKworICAgIC8vIENyZWF0ZSBhIERJQgorICAgIEJZVEUgYnVmZmVyW3NpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIDMgKiBzaXplb2YoUkdCUVVBRCldID0gezB9OworICAgIEJJVE1BUElORk8qICAgICAgIHBCTUkgICAgPSAoQklUTUFQSU5GTyopYnVmZmVyOworICAgIEJJVE1BUElORk9IRUFERVIqIHBIZWFkZXIgPSAmcEJNSS0+Ym1pSGVhZGVyOworICAgIERXT1JEKiAgICAgICAgICAgIHBDb2xvcnMgPSAoRFdPUkQqKSZwQk1JLT5ibWlDb2xvcnM7ICAgCisKKwkvLyBDcmVhdGVESUJTZWN0aW9uIGRvZXMgbm90IHN1cHBvcnQgMzMyIHBpeGVsIGZvcm1hdCBvbiB3Y2UKKwlpZiggZ2FwaS0+Z3hQcm9wZXJ0aWVzLmNCUFAgPT0gOCApIHJldHVybjsKKworICAgIC8vIERJQiBIZWFkZXIKKyAgICBwSGVhZGVyLT5iaVNpemUgICAgICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICBwSGVhZGVyLT5iaVdpZHRoICAgICAgICAgICA9IGdhcGktPnc7CisgICAgcEhlYWRlci0+YmlIZWlnaHQgICAgICAgICAgPSAtZ2FwaS0+aDsKKyAgICBwSGVhZGVyLT5iaVBsYW5lcyAgICAgICAgICA9IDE7CisgICAgcEhlYWRlci0+YmlCaXRDb3VudCAgICAgICAgPSBicHA7CisgICAgcEhlYWRlci0+YmlDb21wcmVzc2lvbiAgICAgPSBCSV9SR0I7CisgICAgcEhlYWRlci0+YmlTaXplSW1hZ2UgICAgICAgPSAoZ2FwaS0+dyAqIGdhcGktPmggKiBicHApIC8gODsKKwkKKyAgICAvLyBDb2xvciBtYXNrcworCWlmKCBicHAgPT0gMTYgKQorCXsKKwkJcENvbG9yc1swXSA9IFJFRE1BU0s7CisJCXBDb2xvcnNbMV0gPSBHUkVFTk1BU0s7CisJCXBDb2xvcnNbMl0gPSBCTFVFTUFTSzsKKwkJcEhlYWRlci0+YmlDb21wcmVzc2lvbiA9IEJJX0JJVEZJRUxEUzsKKwl9CisgICAgLy8gQ3JlYXRlIHRoZSBESUIKKyAgICBoYiA9ICBDcmVhdGVESUJTZWN0aW9uKCAwLCBwQk1JLCBESUJfUkdCX0NPTE9SUywgKHZvaWQqKikmYml0bWFwRGF0YSwgMCwgMCApOworCisJLy8gY29weSBkYXRhCisJLy8gRklYTUU6IHByZXZlbnQgbWlzYWxpZ25tZW50LCBidXQgSSd2ZSBuZXZlciBzZWVuIG5vbiBhbGlnbmVkIHdpZHRoIG9mIHNjcmVlbgorCW1lbWNweShiaXRtYXBEYXRhLCBnYXBpLT5idWZmZXIsIHBIZWFkZXItPmJpU2l6ZUltYWdlKTsKKwlzcmNEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpOworCXByZXZPYmplY3QgPSBTZWxlY3RPYmplY3Qoc3JjREMsIGhiKTsKKworCUJpdEJsdChoZGMsIDAsIDAsIGdhcGktPncsIGdhcGktPmgsIHNyY0RDLCAwLCAwLCBTUkNDT1BZKTsKKworCVNlbGVjdE9iamVjdChzcmNEQywgcHJldk9iamVjdCk7CisJRGVsZXRlT2JqZWN0KGhiKTsKKwlEZWxldGVEQyhzcmNEQyk7Cit9CisKK2ludCBHQVBJX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykgCit7CisJR0FQSV9DcmVhdGVQYWxldHRlKG5jb2xvcnMsIGNvbG9ycyk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dhcGkvU0RMX2dhcGl2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nYXBpL1NETF9nYXBpdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDJkMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nYXBpL1NETF9nYXBpdmlkZW8uaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9nYXBpdmlkZW9faAorI2RlZmluZSBfU0RMX2dhcGl2aWRlb19oCisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICJTRExfbXV0ZXguaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi93aW5kaWIvU0RMX2dhcGlkaWJ2aWRlby5oIgorCisvKiBGcm9tIGd4LmgsIHNpbmNlIGl0J3Mgbm90IHJlYWxseSBDIGNvbXBsaWFudCAqLworCitzdHJ1Y3QgR1hEaXNwbGF5UHJvcGVydGllcyB7CisgICAgRFdPUkQgY3hXaWR0aDsKKyAgICBEV09SRCBjeUhlaWdodDsgICAgICAgICAvLyBub3RpY2UgbGFjayBvZiAndGgnIGluIHRoZSB3b3JkIGhlaWdodC4KKyAgICBsb25nIGNieFBpdGNoOyAgICAgICAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZSByaWdodCBvbmUgeCBwaXhlbCAtIGNhbiBiZSBuZWdhdGl2ZS4KKyAgICBsb25nIGNieVBpdGNoOyAgICAgICAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZSBkb3duIG9uZSB5IHBpeGVsIC0gY2FuIGJlIG5lZ2F0aXZlLgorICAgIGxvbmcgY0JQUDsgICAgICAgICAgICAgIC8vICMgb2YgYml0cyBpbiBlYWNoIHBpeGVsCisgICAgRFdPUkQgZmZGb3JtYXQ7ICAgICAgICAgLy8gZm9ybWF0IGZsYWdzLgorfTsKKworc3RydWN0IEdYS2V5TGlzdCB7CisgICAgc2hvcnQgdmtVcDsgICAgICAgICAgICAgLy8ga2V5IGZvciB1cAorICAgIFBPSU5UIHB0VXA7ICAgICAgICAgICAgIC8vIHgseSBwb3NpdGlvbiBvZiBrZXkvYnV0dG9uLiAgTm90IG9uIHNjcmVlbiBidXQgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLgorICAgIHNob3J0IHZrRG93bjsKKyAgICBQT0lOVCBwdERvd247CisgICAgc2hvcnQgdmtMZWZ0OworICAgIFBPSU5UIHB0TGVmdDsKKyAgICBzaG9ydCB2a1JpZ2h0OworICAgIFBPSU5UIHB0UmlnaHQ7CisgICAgc2hvcnQgdmtBOworICAgIFBPSU5UIHB0QTsKKyAgICBzaG9ydCB2a0I7CisgICAgUE9JTlQgcHRCOworICAgIHNob3J0IHZrQzsKKyAgICBQT0lOVCBwdEM7CisgICAgc2hvcnQgdmtTdGFydDsKKyAgICBQT0lOVCBwdFN0YXJ0OworfTsKKwordHlwZWRlZiBpbnQgICAoKlBGTkdYT3BlbkRpc3BsYXkpKEhXTkQgaFduZCwgRFdPUkQgZHdGbGFncyk7Cit0eXBlZGVmIGludCAgICgqUEZOR1hDbG9zZURpc3BsYXkpKCk7Cit0eXBlZGVmIHZvaWQqICgqUEZOR1hCZWdpbkRyYXcpKCk7Cit0eXBlZGVmIGludCAgICgqUEZOR1hFbmREcmF3KSgpOwordHlwZWRlZiBpbnQgICAoKlBGTkdYT3BlbklucHV0KSgpOwordHlwZWRlZiBpbnQgICAoKlBGTkdYQ2xvc2VJbnB1dCkoKTsKK3R5cGVkZWYgc3RydWN0IEdYRGlzcGxheVByb3BlcnRpZXMgKCpQRk5HWEdldERpc3BsYXlQcm9wZXJ0aWVzKSgpOwordHlwZWRlZiBzdHJ1Y3QgR1hLZXlMaXN0ICgqUEZOR1hHZXREZWZhdWx0S2V5cykoaW50IGlPcHRpb25zKTsKK3R5cGVkZWYgaW50ICAgKCpQRk5HWFN1c3BlbmQpKCk7Cit0eXBlZGVmIGludCAgICgqUEZOR1hSZXN1bWUpKCk7Cit0eXBlZGVmIGludCAgICgqUEZOR1hTZXRWaWV3cG9ydCkoIERXT1JEIGR3VG9wLCBEV09SRCBkd0hlaWdodCwgRFdPUkQgZHdSZXNlcnZlZDEsIERXT1JEIGR3UmVzZXJ2ZWQyICk7Cit0eXBlZGVmIEJPT0wgICgqUEZOR1hJc0Rpc3BsYXlEUkFNQnVmZmVyKSgpOworCitzdHJ1Y3QgR2FwaUZ1bmMKK3sKKyAgICBQRk5HWE9wZW5EaXNwbGF5ICAgICAgICAgIEdYT3BlbkRpc3BsYXk7CisgICAgUEZOR1hDbG9zZURpc3BsYXkgICAgICAgICBHWENsb3NlRGlzcGxheTsKKyAgICBQRk5HWEJlZ2luRHJhdyAgICAgICAgICAgIEdYQmVnaW5EcmF3OworICAgIFBGTkdYRW5kRHJhdyAgICAgICAgICAgICAgR1hFbmREcmF3OworICAgIFBGTkdYT3BlbklucHV0ICAgICAgICAgICAgR1hPcGVuSW5wdXQ7CisgICAgUEZOR1hDbG9zZUlucHV0ICAgICAgICAgICBHWENsb3NlSW5wdXQ7CisgICAgUEZOR1hHZXREaXNwbGF5UHJvcGVydGllcyBHWEdldERpc3BsYXlQcm9wZXJ0aWVzOworICAgIFBGTkdYR2V0RGVmYXVsdEtleXMgICAgICAgR1hHZXREZWZhdWx0S2V5czsKKyAgICBQRk5HWFN1c3BlbmQgICAgICAgICAgICAgIEdYU3VzcGVuZDsKKyAgICBQRk5HWFJlc3VtZSAgICAgICAgICAgICAgIEdYUmVzdW1lOworICAgIFBGTkdYU2V0Vmlld3BvcnQgICAgICAgICAgR1hTZXRWaWV3cG9ydDsKKyAgICBQRk5HWElzRGlzcGxheURSQU1CdWZmZXIgIEdYSXNEaXNwbGF5RFJBTUJ1ZmZlcjsKK307CisKKyNkZWZpbmUga2ZMYW5kc2NhcGUJMHg4CQkJLy8gU2NyZWVuIGlzIHJvdGF0ZWQgMjcwIGRlZ3JlZXMKKyNkZWZpbmUga2ZQYWxldHRlCTB4MTAJCS8vIFBpeGVsIHZhbHVlcyBhcmUgaW5kZXhlcyBpbnRvIGEgcGFsZXR0ZQorI2RlZmluZSBrZkRpcmVjdAkweDIwCQkvLyBQaXhlbCB2YWx1ZXMgY29udGFpbiBhY3R1YWwgbGV2ZWwgaW5mb3JtYXRpb24KKyNkZWZpbmUga2ZEaXJlY3Q1NTUJMHg0MAkJLy8gNSBiaXRzIGVhY2ggZm9yIHJlZCwgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzIGluIGEgcGl4ZWwuCisjZGVmaW5lIGtmRGlyZWN0NTY1CTB4ODAJCS8vIDUgcmVkIGJpdHMsIDYgZ3JlZW4gYml0cyBhbmQgNSBibHVlIGJpdHMgcGVyIHBpeGVsCisjZGVmaW5lIGtmRGlyZWN0ODg4CTB4MTAwCQkvLyA4IGJpdHMgZWFjaCBmb3IgcmVkLCBncmVlbiBhbmQgYmx1ZSB2YWx1ZXMgaW4gYSBwaXhlbC4KKyNkZWZpbmUga2ZEaXJlY3Q0NDQJMHgyMDAJCS8vIDQgcmVkLCA0IGdyZWVuLCA0IGJsdWUKKyNkZWZpbmUga2ZEaXJlY3RJbnZlcnRlZCAweDQwMAorCisjZGVmaW5lIEdYX0ZVTExTQ1JFRU4JMHgwMQkJLy8gZm9yIE9wZW5EaXNwbGF5KCkgCisjZGVmaW5lIEdYX05PUk1BTEtFWVMgICAweDAyCisjZGVmaW5lIEdYX0xBTkRTQ0FQRUtFWVMgICAgICAgIDB4MDMKKworCisvKiBHQVBJIHZpZGVvIG1vZGUgKi8KK3R5cGVkZWYgZW51bSB7CisJR0FQSV9OT05FID0gMCwKKwlHQVBJX0RJUkVDVF81NjUsCisJR0FQSV9ESVJFQ1RfNTU1LAorCUdBUElfTU9OTywKKwlHQVBJX1BBTEVUVEUKK30gR0FQSVZpZGVvTW9kZTsgCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUElYRUw7CisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhIAorICAgYmVnaW4gd2l0aCBESUIgcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gYWxsb3cgRElCIGV2ZW50cyBjb2RlIHNoYXJpbmcKKyovCitzdHJ1Y3QgR2FwaUluZm8geworCS8qIFJvdGF0aW9uIHdoaWNoIGhhcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBrZXkgKGFycm93IGtleXMpIGFuZCBtb3VzZSBldmVudHMgbWVhc3VyZWQgaW4gcXVhcnRlcnMgb2YgYSBjaXJjbGUKKwkgKiBjb3VudGVyIGNsb2Nrd2lzZSAqLworCWludCBjb29yZGluYXRlVHJhbnNmb3JtOyAKKwljaGFyIGhpcmVzRml4OyAvKiB1c2luZyBoaXJlcyBtb2RlIHdpdGhvdXQgZGVmaW5pbmcgaGlyZXMgcmVzb3VyY2UgKi8KKwlpbnQgaW52ZXJ0OyAvL1RPRE8gdGhpcyBpcyBvbmx5IHdyaXR0ZW4gYnV0IG5ldmVyIHJlYWQsIHNvIGl0IHNob3VsZCBiZSByZW1vdmVkCisKKyNkZWZpbmUgTlVNX01PREVMSVNUUwk0CQkvKiA4LCAxNiwgMjQsIGFuZCAzMiBiaXRzLXBlci1waXhlbCAqLworCWludCBTRExfbnVtbW9kZXNbTlVNX01PREVMSVNUU107CisJU0RMX1JlY3QgKipTRExfbW9kZWxpc3RbTlVNX01PREVMSVNUU107CisJCisKKwkvLyBUaGUgb3JpZW50YXRpb24gb2YgdGhlIHZpZGVvIG1vZGUgdXNlciB3YW50cyB0byBnZXQKKwkvLyBQcm9iYWJseSByZXN0cmljdGVkIHRvIFVQIGFuZCBSSUdIVAorCVNETF9TY3JlZW5PcmllbnRhdGlvbiB1c2VyT3JpZW50YXRpb247CisJU0RMX1NjcmVlbk9yaWVudGF0aW9uIHN5c3RlbU9yaWVudGF0aW9uOworLy8gLS0tLS0tLS0tLS0tLS0KKwlpbnQgdXNlR1hPcGVuRGlzcGxheTsgLyogdXNlIEdYT3BlbkRpc3BwbGF5ICovCisJaW50IGFscmVhZHlHWE9wZW5lZDsKKwlpbnQgdywgaDsKKwkvLyBUaGUgb3JpZW50YXRpb24gb2YgR0FQSSBmcmFtZWJ1ZmZlci4KKwkvLyBOZXZlciBjaGFuZ2VzIG9uIHRoZSBzYW1lIGRldmljZS4KKwlTRExfU2NyZWVuT3JpZW50YXRpb24gZ2FwaU9yaWVudGF0aW9uOworCisJdm9pZCAqYnVmZmVyOyAvLyBtYXkgYmUgOCwgMTYsIDI0LCAzMiBicHAKKwlQSVhFTCAqdmlkZW9NZW07CisJQk9PTCBuZWVkVXBkYXRlOworCXN0cnVjdCBHWEtleUxpc3Qga2V5TGlzdDsKKwlzdHJ1Y3QgR2FwaUZ1bmMgZ3hGdW5jOworCXN0cnVjdCBHWERpc3BsYXlQcm9wZXJ0aWVzIGd4UHJvcGVydGllczsKKwlHQVBJVmlkZW9Nb2RlIHZpZGVvTW9kZTsKKwlpbnQgY29sb3JzY2FsZTsKKwlpbnQgZHN0TGluZVN0ZXA7ICAvLyBpbiBieXRlcworCWludCBkc3RQaXhlbFN0ZXA7IC8vIGluIGJ5dGVzCisJaW50IHN0YXJ0T2Zmc2V0OyAvLyBpbiBieXRlcworCWludCB1c2VWZ2E7CisJaW50IHN1c3BlbmRlZDsgLy8gZG8gbm90IHB1IGFueXRoaW5nIGludG8gdmlkZW8gbWVtb3J5Cit9OworCisKKworI2VuZGlmIC8qIF9TRExfZ2FwaXZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2VtL1NETF9nZW1ldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2VtL1NETF9nZW1ldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWE1MDVkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZW0vU0RMX2dlbWV2ZW50cy5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqIEdFTSBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uCisgKiBpbnNwaXJlZCBmcm9tIHRoZSBEdW1teSBTREwgZHJpdmVyCisgKiAKKyAqIFBhdHJpY2UgTWFuZGluCisgKiBhbmQgd29yayBmcm9tCisgKiBPbGl2aWVyIExhbmRlbWFycmUsIEpvaGFuIEtsb2NrYXJzLCBYYXZpZXIgSm91YmVydCwgQ2xhdWRlIEF0dGFyZAorICovCisKKyNpbmNsdWRlIDxnZW0uaD4KKworI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9nZW12aWRlby5oIgorI2luY2x1ZGUgIlNETF9nZW1ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9nZW1tb3VzZV9jLmgiCisjaW5jbHVkZSAiLi4vYXRhcmljb21tb24vU0RMX2F0YXJpa2V5cy5oIgkvKiBmb3Iga2V5Ym9hcmQgc2NhbmNvZGVzICovCisjaW5jbHVkZSAiLi4vYXRhcmljb21tb24vU0RMX2F0YXJpZXZlbnRzX2MuaCIKKyNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfeGJpb3NldmVudHNfYy5oIgorI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaWRldm1vdXNlX2MuaCIKKworLyogVmFyaWFibGVzICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdlbV9jdXJyZW50a2V5Ym9hcmRbQVRBUklCSU9TX01BWEtFWVNdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2VtX3ByZXZpb3Vza2V5Ym9hcmRbQVRBUklCSU9TX01BWEtFWVNdOworCisvKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAqLworCitzdGF0aWMgaW50IGRvX21lc3NhZ2VzKF9USElTLCBzaG9ydCAqbWVzc2FnZSk7CitzdGF0aWMgdm9pZCBkb19rZXlib2FyZChzaG9ydCBrYywgc2hvcnQga3MpOworc3RhdGljIHZvaWQgZG9fbW91c2UoX1RISVMsIHNob3J0IG14LCBzaG9ydCBteSwgc2hvcnQgbWIsIHNob3J0IGtzKTsKKworLyogRnVuY3Rpb25zICovCisKK3ZvaWQgR0VNX0luaXRPU0tleW1hcChfVEhJUykKK3sKKwlTRExfbWVtc2V0KGdlbV9jdXJyZW50a2V5Ym9hcmQsIDAsIHNpemVvZihnZW1fY3VycmVudGtleWJvYXJkKSk7CisJU0RMX21lbXNldChnZW1fcHJldmlvdXNrZXlib2FyZCwgMCwgc2l6ZW9mKGdlbV9wcmV2aW91c2tleWJvYXJkKSk7CisKKwkvKiBNb3VzZSBpbml0ICovCisJR0VNX21vdXNlX3JlbGF0aXZlID0gU0RMX0ZBTFNFOworCisJU0RMX0F0YXJpX0luaXRJbnRlcm5hbEtleW1hcCh0aGlzKTsKK30KKwordm9pZCBHRU1fUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlzaG9ydCBwcmV2a2MsIHByZXZrczsKKwlzdGF0aWMgc2hvcnQgbWFza21vdXNlYj0wOworCWludCBpOworCVNETF9rZXlzeW0Ja2V5c3ltOworCisJU0RMX21lbXNldChnZW1fY3VycmVudGtleWJvYXJkLDAsc2l6ZW9mKGdlbV9jdXJyZW50a2V5Ym9hcmQpKTsKKwlwcmV2a2MgPSBwcmV2a3MgPSAwOworCisJZm9yICg7OykKKwl7CisJCWludCBxdWl0LCByZXN1bHRhdCwgZXZlbnRfbWFzaywgbW91c2VfZXZlbnQ7CisJCXNob3J0IGJ1ZmZlcls4XSwga2M7CisJCXNob3J0IHgyLHkyLHcyLGgyOworCQlzaG9ydCBtb3VzZXgsIG1vdXNleSwgbW91c2ViLCBkdW1teTsKKwkJc2hvcnQga3N0YXRlOworCisJCXF1aXQgPQorCQkJbW91c2VfZXZlbnQgPQorCQkJeDI9eTI9dzI9aDIgPSAwOworCisJCWV2ZW50X21hc2sgPSBNVV9NRVNBR3xNVV9USU1FUnxNVV9LRVlCRHxNVV9CVVRUT047CisJCWlmICghR0VNX2Z1bGxzY3JlZW4gJiYgKEdFTV9oYW5kbGU+PTApKSB7CisJCQl3aW5kX2dldCAoR0VNX2hhbmRsZSwgV0ZfV09SS1hZV0gsICZ4MiwgJnkyLCAmdzIsICZoMik7CisJCQlldmVudF9tYXNrIHw9IE1VX00xOworCQkJbW91c2VfZXZlbnQgPSAoIChTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBNT1VTRUZPQ1VTKQorCQkJCT09IFNETF9BUFBNT1VTRUZPQ1VTKSA/IE1PX0xFQVZFIDogTU9fRU5URVI7CisJCX0KKworCQlyZXN1bHRhdCA9IGV2bnRfbXVsdGkoCisJCQlldmVudF9tYXNrLAorCQkJMHgxMDEsNyxtYXNrbW91c2ViLAorCQkJbW91c2VfZXZlbnQseDIseTIsdzIsaDIsCisJCQkwLDAsMCwwLDAsCisJCQlidWZmZXIsCisJCQkxMCwKKwkJCSZtb3VzZXgsJm1vdXNleSwmbW91c2ViLCZrc3RhdGUsJmtjLCZkdW1teQorCQkpOworCisJCS8qIE1lc3NhZ2UgZXZlbnQgPyAqLworCQlpZiAocmVzdWx0YXQgJiBNVV9NRVNBRykKKwkJCXF1aXQgPSBkb19tZXNzYWdlcyh0aGlzLCBidWZmZXIpOworCisJCS8qIEtleWJvYXJkIGV2ZW50ID8gKi8KKwkJaWYgKHJlc3VsdGF0ICYgTVVfS0VZQkQpIHsKKwkJCWlmICgocHJldmtjICE9IGtjKSB8fCAocHJldmtzICE9IGtzdGF0ZSkpIHsKKwkJCQlkb19rZXlib2FyZChrYyxrc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBdm9pZCBsb29waW5nLCBpZiByZXBlYXRpbmcgc2FtZSBrZXkgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIE1vdXNlIGVudGVyaW5nL2xlYXZpbmcgd2luZG93ICovCisJCWlmIChyZXN1bHRhdCAmIE1VX00xKSB7CisJCQlpZiAodGhpcy0+aW5wdXRfZ3JhYiA9PSBTRExfR1JBQl9PRkYpIHsKKwkJCQkvKiBTd2l0Y2ggbW91c2UgZm9jdXMgc3RhdGUgKi8KKwkJCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgobW91c2VfZXZlbnQgPT0gTU9fRU5URVIpLAorCQkJCQlTRExfQVBQTU9VU0VGT0NVUyk7CisJCQl9CisJCQlHRU1fQ2hlY2tNb3VzZU1vZGUodGhpcyk7CisJCX0KKworCQkvKiBNb3VzZSBidXR0b24gZXZlbnQgPyAqLworCQlpZiAocmVzdWx0YXQgJiBNVV9CVVRUT04pIHsKKwkJCWRvX21vdXNlKHRoaXMsIG1vdXNleCwgbW91c2V5LCBtb3VzZWIsIGtzdGF0ZSk7CisJCQltYXNrbW91c2ViID0gbW91c2ViICYgNzsKKwkJfQorCisJCS8qIFRpbWVyIGV2ZW50ID8gKi8KKwkJaWYgKChyZXN1bHRhdCAmIE1VX1RJTUVSKSB8fCBxdWl0KQorCQkJYnJlYWs7CisJfQorCisJLyogTm93IGdlbmVyYXRlIGtleWJvYXJkIGV2ZW50cyAqLworCWZvciAoaT0wOyBpPEFUQVJJQklPU19NQVhLRVlTOyBpKyspIHsKKwkJLyogS2V5IHByZXNzZWQgPyAqLworCQlpZiAoZ2VtX2N1cnJlbnRrZXlib2FyZFtpXSAmJiAhZ2VtX3ByZXZpb3Vza2V5Ym9hcmRbaV0pCisJCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELAorCQkJCVNETF9BdGFyaV9UcmFuc2xhdGVLZXkoaSwgJmtleXN5bSwgU0RMX1RSVUUpKTsKKwkJCQorCQkvKiBLZXkgdW5wcmVzc2VkID8gKi8KKwkJaWYgKGdlbV9wcmV2aW91c2tleWJvYXJkW2ldICYmICFnZW1fY3VycmVudGtleWJvYXJkW2ldKQorCQkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsCisJCQkJU0RMX0F0YXJpX1RyYW5zbGF0ZUtleShpLCAma2V5c3ltLCBTRExfRkFMU0UpKTsKKwl9CisKKwlTRExfbWVtY3B5KGdlbV9wcmV2aW91c2tleWJvYXJkLGdlbV9jdXJyZW50a2V5Ym9hcmQsc2l6ZW9mKGdlbV9wcmV2aW91c2tleWJvYXJkKSk7CisKKwkvKiBSZWZyZXNoIHdpbmRvdyBuYW1lID8gKi8KKwlpZiAoR0VNX3JlZnJlc2hfbmFtZSkgeworCQljb25zdCBjaGFyICp3aW5kb3dfbmFtZSA9CisJCQkoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQQUNUSVZFKQorCQkJPyBHRU1fdGl0bGVfbmFtZSA6IEdFTV9pY29uX25hbWU7CisJCWlmICh3aW5kb3dfbmFtZSkgeworCQkJd2luZF9zZXQoR0VNX2hhbmRsZSxXRl9OQU1FLAorCQkJCShzaG9ydCkoKCh1bnNpZ25lZCBsb25nKXdpbmRvd19uYW1lKT4+MTYpLAorCQkJCShzaG9ydCkoKCh1bnNpZ25lZCBsb25nKXdpbmRvd19uYW1lKSAmIDB4ZmZmZiksCisJCQkJMCwwKTsKKwkJfQorCQlHRU1fcmVmcmVzaF9uYW1lID0gU0RMX0ZBTFNFOworCX0KK30KKworc3RhdGljIGludCBkb19tZXNzYWdlcyhfVEhJUywgc2hvcnQgKm1lc3NhZ2UpCit7CisJaW50IHF1aXQsIGNoZWNrX21vdXNlX21vZGU7CisJc2hvcnQgeDIseTIsdzIsaDI7CisKKwlxdWl0ID0gY2hlY2tfbW91c2VfbW9kZSA9IDA7CisJc3dpdGNoIChtZXNzYWdlWzBdKSB7CisJCWNhc2UgV01fQ0xPU0VEOgorCQljYXNlIEFQX1RFUk06ICAgIAorCQkJU0RMX1ByaXZhdGVRdWl0KCk7CisJCQlxdWl0PTE7CisJCQlicmVhazsKKwkJY2FzZSBXTV9NT1ZFRDoKKwkJCXdpbmRfc2V0KG1lc3NhZ2VbM10sV0ZfQ1VSUlhZV0gsbWVzc2FnZVs0XSxtZXNzYWdlWzVdLG1lc3NhZ2VbNl0sbWVzc2FnZVs3XSk7CisJCQlicmVhazsKKwkJY2FzZSBXTV9UT1BQRUQ6CisJCQl3aW5kX3NldChtZXNzYWdlWzNdLFdGX1RPUCxtZXNzYWdlWzRdLDAsMCwwKTsKKwkJCS8qIENvbnRpbnVlIHdpdGggVE9QIGV2ZW50IHByb2Nlc3NpbmcgKi8KKwkJY2FzZSBXTV9PTlRPUDoKKwkJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBJTlBVVEZPQ1VTKTsKKwkJCWlmIChWRElfc2V0cGFsZXR0ZSkgeworCQkJCVZESV9zZXRwYWxldHRlKHRoaXMsIFZESV9jdXJwYWxldHRlKTsKKwkJCX0KKwkJCWNoZWNrX21vdXNlX21vZGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgV01fUkVEUkFXOgorCQkJaWYgKCFHRU1fbG9ja19yZWRyYXcpIHsKKwkJCQlHRU1fd2luZF9yZWRyYXcodGhpcywgbWVzc2FnZVszXSwmbWVzc2FnZVs0XSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXTV9JQ09OSUZZOgorCQljYXNlIFdNX0FMTElDT05JRlk6CisJCQl3aW5kX3NldChtZXNzYWdlWzNdLFdGX0lDT05JRlksbWVzc2FnZVs0XSxtZXNzYWdlWzVdLG1lc3NhZ2VbNl0sbWVzc2FnZVs3XSk7CisJCQkvKiBJZiB3ZSdyZSBhY3RpdmUsIG1ha2Ugb3Vyc2VsdmVzIGluYWN0aXZlICovCisJCQlpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUEFDVElWRSApIHsKKwkJCQkvKiBTZW5kIGFuIGludGVybmFsIGRlYWN0aXZhdGUgZXZlbnQgKi8KKwkJCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQQUNUSVZFKTsKKwkJCX0KKwkJCS8qIFVwZGF0ZSB3aW5kb3cgdGl0bGUgKi8KKwkJCWlmIChHRU1fcmVmcmVzaF9uYW1lICYmIEdFTV9pY29uX25hbWUpIHsKKwkJCQl3aW5kX3NldChHRU1faGFuZGxlLFdGX05BTUUsKHNob3J0KSgoKHVuc2lnbmVkIGxvbmcpR0VNX2ljb25fbmFtZSk+PjE2KSwoc2hvcnQpKCgodW5zaWduZWQgbG9uZylHRU1faWNvbl9uYW1lKSAmIDB4ZmZmZiksMCwwKTsKKwkJCQlHRU1fcmVmcmVzaF9uYW1lID0gU0RMX0ZBTFNFOworCQkJfQorCQkJY2hlY2tfbW91c2VfbW9kZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBXTV9VTklDT05JRlk6CisJCQl3aW5kX3NldChtZXNzYWdlWzNdLFdGX1VOSUNPTklGWSxtZXNzYWdlWzRdLG1lc3NhZ2VbNV0sbWVzc2FnZVs2XSxtZXNzYWdlWzddKTsKKwkJCS8qIElmIHdlJ3JlIG5vdCBhY3RpdmUsIG1ha2Ugb3Vyc2VsdmVzIGFjdGl2ZSAqLworCQkJaWYgKCAhKFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUEFDVElWRSkgKSB7CisJCQkJLyogU2VuZCBhbiBpbnRlcm5hbCBhY3RpdmF0ZSBldmVudCAqLworCQkJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBBQ1RJVkUpOworCQkJfQorCQkJaWYgKEdFTV9yZWZyZXNoX25hbWUgJiYgR0VNX3RpdGxlX25hbWUpIHsKKwkJCQl3aW5kX3NldChHRU1faGFuZGxlLFdGX05BTUUsKHNob3J0KSgoKHVuc2lnbmVkIGxvbmcpR0VNX3RpdGxlX25hbWUpPj4xNiksKHNob3J0KSgoKHVuc2lnbmVkIGxvbmcpR0VNX3RpdGxlX25hbWUpICYgMHhmZmZmKSwwLDApOworCQkJCUdFTV9yZWZyZXNoX25hbWUgPSBTRExfRkFMU0U7CisJCQl9CisJCQljaGVja19tb3VzZV9tb2RlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFdNX1NJWkVEOgorCQkJd2luZF9zZXQgKG1lc3NhZ2VbM10sIFdGX0NVUlJYWVdILCBtZXNzYWdlWzRdLCBtZXNzYWdlWzVdLCBtZXNzYWdlWzZdLCBtZXNzYWdlWzddKTsKKwkJCXdpbmRfZ2V0IChtZXNzYWdlWzNdLCBXRl9XT1JLWFlXSCwgJngyLCAmeTIsICZ3MiwgJmgyKTsKKwkJCUdFTV93aW5fZnVsbGVkID0gU0RMX0ZBTFNFOwkJLyogQ2FuY2VsIG1heGltaXplZCBmbGFnICovCisJCQlHRU1fbG9ja19yZWRyYXcgPSBTRExfVFJVRTsJCS8qIFByZXZlbnQgcmVkcmF3IHRpbGwgYnVmZmVycyByZXNpemVkICovCisJCQlTRExfUHJpdmF0ZVJlc2l6ZSh3MiwgaDIpOworCQkJYnJlYWs7CisJCWNhc2UgV01fRlVMTEVEOgorCQkJeworCQkJCXNob3J0IHgseSx3LGg7CisKKwkJCQlpZiAoR0VNX3dpbl9mdWxsZWQpIHsKKwkJCQkJd2luZF9nZXQgKG1lc3NhZ2VbM10sIFdGX1BSRVZYWVdILCAmeCwgJnksICZ3LCAmaCk7CisJCQkJCUdFTV93aW5fZnVsbGVkID0gU0RMX0ZBTFNFOworCQkJCX0gZWxzZSB7CisJCQkJCXggPSBHRU1fZGVza194OworCQkJCQl5ID0gR0VNX2Rlc2tfeTsKKwkJCQkJdyA9IEdFTV9kZXNrX3c7CisJCQkJCWggPSBHRU1fZGVza19oOworCQkJCQlHRU1fd2luX2Z1bGxlZCA9IFNETF9UUlVFOworCQkJCX0KKwkJCQl3aW5kX3NldCAobWVzc2FnZVszXSwgV0ZfQ1VSUlhZV0gsIHgsIHksIHcsIGgpOworCQkJCXdpbmRfZ2V0IChtZXNzYWdlWzNdLCBXRl9XT1JLWFlXSCwgJngyLCAmeTIsICZ3MiwgJmgyKTsKKwkJCQlHRU1fbG9ja19yZWRyYXcgPSBTRExfVFJVRTsJCS8qIFByZXZlbnQgcmVkcmF3IHRpbGwgYnVmZmVycyByZXNpemVkICovCisJCQkJU0RMX1ByaXZhdGVSZXNpemUodzIsIGgyKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdNX0JPVFRPTUVEOgorCQkJd2luZF9zZXQobWVzc2FnZVszXSxXRl9CT1RUT00sMCwwLDAsMCk7CisJCQkvKiBDb250aW51ZSB3aXRoIEJPVFRPTSBldmVudCBwcm9jZXNzaW5nICovCisJCWNhc2UgV01fVU5UT1BQRUQ6CisJCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQSU5QVVRGT0NVUyk7CisJCQlpZiAoVkRJX3NldHBhbGV0dGUpIHsKKwkJCQlWRElfc2V0cGFsZXR0ZSh0aGlzLCBWRElfb2xkcGFsZXR0ZSk7CisJCQl9CisJCQljaGVja19tb3VzZV9tb2RlID0gMTsKKwkJCWJyZWFrOworCX0KKworCWlmIChjaGVja19tb3VzZV9tb2RlKSB7CisJCUdFTV9DaGVja01vdXNlTW9kZSh0aGlzKTsKKwl9CisJCisJcmV0dXJuIHF1aXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2tleWJvYXJkKHNob3J0IGtjLCBzaG9ydCBrcykKK3sKKwlpbnQgc2NhbmNvZGU7CisKKwlpZiAoa2MpIHsKKwkJc2NhbmNvZGU9KGtjPj44KSAmIChBVEFSSUJJT1NfTUFYS0VZUy0xKTsKKwkJZ2VtX2N1cnJlbnRrZXlib2FyZFtzY2FuY29kZV09MHhGRjsKKwl9CisKKwkvKiBSZWFkIHNwZWNpYWwga2V5cyAqLworCWlmIChrcyAmIEtfUlNISUZUKQorCQlnZW1fY3VycmVudGtleWJvYXJkW1NDQU5DT0RFX1JJR0hUU0hJRlRdPTB4RkY7CisJaWYgKGtzICYgS19MU0hJRlQpCisJCWdlbV9jdXJyZW50a2V5Ym9hcmRbU0NBTkNPREVfTEVGVFNISUZUXT0weEZGOworCWlmIChrcyAmIEtfQ1RSTCkKKwkJZ2VtX2N1cnJlbnRrZXlib2FyZFtTQ0FOQ09ERV9MRUZUQ09OVFJPTF09MHhGRjsKKwlpZiAoa3MgJiBLX0FMVCkKKwkJZ2VtX2N1cnJlbnRrZXlib2FyZFtTQ0FOQ09ERV9MRUZUQUxUXT0weEZGOworfQorCitzdGF0aWMgdm9pZCBkb19tb3VzZShfVEhJUywgc2hvcnQgbXgsIHNob3J0IG15LCBzaG9ydCBtYiwgc2hvcnQga3MpCit7CisJc3RhdGljIHNob3J0IHByZXZtb3VzZXg9MCwgcHJldm1vdXNleT0wLCBwcmV2bW91c2ViPTA7CisJc2hvcnQgeDIsIHkyLCB3MiwgaDI7CisKKwkvKiBEb24ndCByZXR1cm4gbW91c2UgZXZlbnRzIGlmIG91dCBvZiB3aW5kb3cgKi8KKwlpZiAoKFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUE1PVVNFRk9DVVMpPT0wKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZXRyaWV2ZSB3aW5kb3cgY29vcmRzLCBhbmQgZ2VuZXJhdGUgbW91c2UgZXZlbnRzIGFjY29yZGluZ2x5ICovCisJeDIgPSB5MiA9IDA7CisJdzIgPSBWRElfdzsKKwloMiA9IFZESV9oOworCWlmICgoIUdFTV9mdWxsc2NyZWVuKSAmJiAoR0VNX2hhbmRsZT49MCkpIHsKKwkJd2luZF9nZXQgKEdFTV9oYW5kbGUsIFdGX1dPUktYWVdILCAmeDIsICZ5MiwgJncyLCAmaDIpOworCisJCS8qIERvIG5vdCBnZW5lcmF0ZSBtb3VzZSBidXR0b24gZXZlbnQgaWYgb3V0IG9mIHdpbmRvdyB3b3JraW5nIGFyZWEgKi8KKwkJaWYgKChteDx4MikgfHwgKG14Pj14Mit3MikgfHwgKG15PHkyKSB8fCAobXk+PXkyK2gyKSkgeworCQkJbWI9cHJldm1vdXNlYjsKKwkJfQorCX0KKworCS8qIE1vdXNlIG1vdGlvbiA/ICovCisJaWYgKEdFTV9tb3VzZV9yZWxhdGl2ZSkgeworCQlpZiAoR0VNX3VzZWRldm1vdXNlKSB7CisJCQlTRExfQXRhcmlEZXZNb3VzZV9Qb3N0TW91c2VFdmVudHModGhpcywgU0RMX0ZBTFNFKTsKKwkJfSBlbHNlIHsKKwkJCVNETF9BdGFyaVhiaW9zX1Bvc3RNb3VzZUV2ZW50cyh0aGlzLCBTRExfRkFMU0UpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChwcmV2bW91c2V4IT1teCkgfHwgKHByZXZtb3VzZXkhPW15KSkgeworCQkJaW50IHBvc3gsIHBvc3k7CisKKwkJCS8qIEdpdmUgbW91c2UgcG9zaXRpb24gcmVsYXRpdmUgdG8gd2luZG93IHBvc2l0aW9uICovCisJCQlwb3N4ID0gbXggLSB4MjsKKwkJCWlmIChwb3N4PDApIHBvc3ggPSAwOworCQkJaWYgKHBvc3g+dzIpIHBvc3ggPSB3Mi0xOworCQkJcG9zeSA9IG15IC0geTI7CisJCQlpZiAocG9zeTwwKSBwb3N5ID0gMDsKKwkJCWlmIChwb3N5PmgyKSBwb3N5ID0gaDItMTsKKworCQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCBwb3N4LCBwb3N5KTsKKwkJfQorCQlwcmV2bW91c2V4ID0gbXg7CisJCXByZXZtb3VzZXkgPSBteTsKKwl9CisKKwkvKiBNb3VzZSBidXR0b24gPyAqLworCWlmIChwcmV2bW91c2ViIT1tYikgeworCQlpbnQgaTsKKworCQlmb3IgKGk9MDtpPDM7aSsrKSB7CisJCQlpbnQgY3VyYnV0dG9uLCBwcmV2YnV0dG9uOworCQkKKwkJCWN1cmJ1dHRvbiA9IG1iICYgKDE8PGkpOworCQkJcHJldmJ1dHRvbiA9IHByZXZtb3VzZWIgJiAoMTw8aSk7CisJCQorCQkJaWYgKGN1cmJ1dHRvbiAmJiAhcHJldmJ1dHRvbikgeworCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIGkrMSwgMCwgMCk7CisJCQl9CisJCQlpZiAoIWN1cmJ1dHRvbiAmJiBwcmV2YnV0dG9uKSB7CisJCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIGkrMSwgMCwgMCk7CisJCQl9CisJCX0KKwkJcHJldm1vdXNlYiA9IG1iOworCX0KKworCS8qIFJlYWQgc3BlY2lhbCBrZXlzICovCisJaWYgKGtzICYgS19SU0hJRlQpCisJCWdlbV9jdXJyZW50a2V5Ym9hcmRbU0NBTkNPREVfUklHSFRTSElGVF09MHhGRjsKKwlpZiAoa3MgJiBLX0xTSElGVCkKKwkJZ2VtX2N1cnJlbnRrZXlib2FyZFtTQ0FOQ09ERV9MRUZUU0hJRlRdPTB4RkY7CisJaWYgKGtzICYgS19DVFJMKQorCQlnZW1fY3VycmVudGtleWJvYXJkW1NDQU5DT0RFX0xFRlRDT05UUk9MXT0weEZGOworCWlmIChrcyAmIEtfQUxUKQorCQlnZW1fY3VycmVudGtleWJvYXJkW1NDQU5DT0RFX0xFRlRBTFRdPTB4RkY7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2VtL1NETF9nZW1ldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNWQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtZXZlbnRzX2MuaApAQCAtMCwwICsxLDMzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9nZW12aWRlby5oIgorCisvKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfc3lzZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCisgICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX3N5c3ZpZGVvLmMpICovCisKK2V4dGVybiB2b2lkIEdFTV9Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgR0VNX1B1bXBFdmVudHMoX1RISVMpOworCisvKiBlbmQgb2YgU0RMX2dlbWV2ZW50c19jLmggKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZW0vU0RMX2dlbW1vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtbW91c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODc2Y2ZmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZW0vU0RMX2dlbW1vdXNlLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICoJR0VNIE1vdXNlIG1hbmFnZXIKKyAqCisgKglQYXRyaWNlIE1hbmRpbgorICovCisKKyNpbmNsdWRlIDxnZW0uaD4KKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKKyNpbmNsdWRlICJTRExfZ2VtbW91c2VfYy5oIgorI2luY2x1ZGUgIlNETF9nZW12aWRlby5oIgorI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF94Ymlvc2V2ZW50c19jLmgiCisKKy8qIERlZmluZXMgKi8KKworLyojZGVmaW5lIERFQlVHX1ZJREVPX0dFTSAxKi8KKworI2RlZmluZSBNQVhDVVJXSURUSCAxNgorI2RlZmluZSBNQVhDVVJIRUlHSFQgMTYKKwordm9pZCBHRU1fRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQoreworI2lmZGVmIERFQlVHX1ZJREVPX0dFTQorCXByaW50Zigic2RsOnZpZGVvOmdlbTogZnJlZSBjdXJzb3JcbiIpOworI2VuZGlmCisKKwlpZiAoY3Vyc29yID09IE5VTEwpCisJCXJldHVybjsKKwkKKwlncmFmX21vdXNlKEFSUk9XLCBOVUxMKTsKKworCWlmIChjdXJzb3ItPm1mb3JtX3AgIT0gTlVMTCkKKwkJU0RMX2ZyZWUoY3Vyc29yLT5tZm9ybV9wKTsKKworCVNETF9mcmVlKGN1cnNvcik7Cit9CisKK1dNY3Vyc29yICpHRU1fQ3JlYXRlV01DdXJzb3IoX1RISVMsCisJCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKK3sKKwlXTWN1cnNvciAqY3Vyc29yOworCU1GT1JNICpuZXdfbWZvcm07CisJaW50IGk7CisKKyNpZmRlZiBERUJVR19WSURFT19HRU0KKwlVaW50MTYgKmRhdGExLCAqbWFzazE7CisKKwlwcmludGYoInNkbDp2aWRlbzpnZW06IGNyZWF0ZSBjdXJzb3JcbiIpOworI2VuZGlmCisKKwkvKiBDaGVjayB0aGUgc2l6ZSAqLworCWlmICggKHcgPiBNQVhDVVJXSURUSCkgfHwgKGggPiBNQVhDVVJIRUlHSFQpICkgeworCQlTRExfU2V0RXJyb3IoIk9ubHkgY3Vyc29ycyBvZiBkaW1lbnNpb24gKCVkeCVkKSBhcmUgYWxsb3dlZCIsCisJCQkJCQkJTUFYQ1VSV0lEVEgsIE1BWENVUkhFSUdIVCk7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgY3Vyc29yIG1lbW9yeSAqLworCWN1cnNvciA9IChXTWN1cnNvciAqKVNETF9tYWxsb2Moc2l6ZW9mKFdNY3Vyc29yKSk7CisJaWYgKCBjdXJzb3IgPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtZm9ybSAqLworCW5ld19tZm9ybSA9IChNRk9STSAqKVNETF9tYWxsb2Moc2l6ZW9mKE1GT1JNKSk7CQkKKwlpZiAobmV3X21mb3JtID09IE5VTEwpIHsKKwkJU0RMX2ZyZWUoY3Vyc29yKTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwljdXJzb3ItPm1mb3JtX3AgPSBuZXdfbWZvcm07CisKKwluZXdfbWZvcm0tPm1mX3hob3QgPSBob3RfeDsKKwluZXdfbWZvcm0tPm1mX3lob3QgPSBob3RfeTsKKwluZXdfbWZvcm0tPm1mX25wbGFuZXMgPSAxOworCW5ld19tZm9ybS0+bWZfZmcgPSAwOworCW5ld19tZm9ybS0+bWZfYmcgPSAxOworCisJZm9yIChpPTA7aTxNQVhDVVJIRUlHSFQ7aSsrKSB7CisJCW5ld19tZm9ybS0+bWZfbWFza1tpXT0wOworCQluZXdfbWZvcm0tPm1mX2RhdGFbaV09MDsKKyNpZmRlZiBERUJVR19WSURFT19HRU0KKwkJZGF0YTEgPSAoVWludDE2ICopICZkYXRhW2k8PDFdOworCQltYXNrMSA9IChVaW50MTYgKikgJm1hc2tbaTw8MV07CisJCXByaW50Zigic2RsOnZpZGVvOmdlbTogc291cmNlOiBsaW5lICVkOiBkYXRhPTB4JTA0eCwgbWFzaz0weCUwNHhcbiIsCisJCQlpLCBkYXRhMVtpXSwgbWFzazFbaV0pOworI2VuZGlmCisJfQorCisJaWYgKHc8PTgpIHsKKwkJZm9yIChpPTA7aTxoO2krKykgeworCQkJbmV3X21mb3JtLT5tZl9tYXNrW2ldPSBtYXNrW2ldPDw4OworCQkJbmV3X21mb3JtLT5tZl9kYXRhW2ldPSBkYXRhW2ldPDw4OworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpPTA7aTxoO2krKykgeworCQkJbmV3X21mb3JtLT5tZl9tYXNrW2ldPSAobWFza1tpPDwxXTw8OCkgfCBtYXNrWyhpPDwxKSsxXTsKKwkJCW5ld19tZm9ybS0+bWZfZGF0YVtpXT0gKGRhdGFbaTw8MV08PDgpIHwgZGF0YVsoaTw8MSkrMV07CisJCX0KKwl9CisKKyNpZmRlZiBERUJVR19WSURFT19HRU0KKwlmb3IgKGk9MDsgaTxoIDtpKyspIHsKKwkJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBjdXJzb3I6IGxpbmUgJWQ6IGRhdGE9MHglMDR4LCBtYXNrPTB4JTA0eFxuIiwKKwkJCWksIG5ld19tZm9ybS0+bWZfZGF0YVtpXSwgbmV3X21mb3JtLT5tZl9tYXNrW2ldKTsKKwl9CisKKwlwcmludGYoInNkbDp2aWRlbzpnZW06IENyZWF0ZVdNQ3Vyc29yKCk6IGRvbmVcbiIpOworI2VuZGlmCisKKwlyZXR1cm4gY3Vyc29yOworfQorCitpbnQgR0VNX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKK3sKKwlHRU1fY3Vyc29yID0gY3Vyc29yOworCisJR0VNX0NoZWNrTW91c2VNb2RlKHRoaXMpOworCisjaWZkZWYgREVCVUdfVklERU9fR0VNCisJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBTaG93V01DdXJzb3IoMHglMDh4KVxuIiwgKGxvbmcpIGN1cnNvcik7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCisjaWYgMAordm9pZCBHRU1fV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCit7CisJLyogVGhpcyBzZWVtcyB0byB3b3JrIG9ubHkgb24gQUVTIDMuNCAoRmFsY29uKSAqLworCisJRVZOVFJFQwl3YXJwZXZlbnQ7CisJCisJd2FycGV2ZW50LmFwX2V2ZW50ID0gQVBQRVZOVF9NT1VTRTsgCisJd2FycGV2ZW50LmFwX3ZhbHVlID0gKHggPDwgMTYpIHwgeTsKKworCWFwcGxfdHBsYXkoJndhcnBldmVudCwgMSwgMTAwMCk7Cit9CisjZW5kaWYKKwordm9pZCBHRU1fQ2hlY2tNb3VzZU1vZGUoX1RISVMpCit7CisJY29uc3QgVWludDggZnVsbF9mb2N1cyA9IChTRExfQVBQQUNUSVZFfFNETF9BUFBJTlBVVEZPQ1VTfFNETF9BUFBNT1VTRUZPQ1VTKTsKKwlpbnQgc2V0X3N5c3RlbV9jdXJzb3IgPSAxLCBzaG93X3N5c3RlbV9jdXJzb3IgPSAxOworCisjaWZkZWYgREVCVUdfVklERU9fR0VNCisJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBjaGVjayBtb3VzZSBtb2RlXG4iKTsKKyNlbmRpZgorCisJLyogSWYgdGhlIG1vdXNlIGlzIGhpZGRlbiBhbmQgaW5wdXQgaXMgZ3JhYmJlZCwgd2UgdXNlIHJlbGF0aXZlIG1vZGUgKi8KKwlHRU1fbW91c2VfcmVsYXRpdmUgPSAoIShTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSkpCisJCSYmICh0aGlzLT5pbnB1dF9ncmFiICE9IFNETF9HUkFCX09GRikKKwkJJiYgKFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUEFDVElWRSk7CisJU0RMX0F0YXJpWGJpb3NfTG9ja01vdXNlUG9zaXRpb24oR0VNX21vdXNlX3JlbGF0aXZlKTsKKworCWlmIChTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSkgeworCQkvKiBBcHBsaWNhdGlvbiBkZWZpbmVkIGN1cnNvciBvbmx5IG92ZXIgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdyAqLworCQlpZiAoKFNETF9HZXRBcHBTdGF0ZSgpICYgZnVsbF9mb2N1cykgPT0gZnVsbF9mb2N1cykgeworCQkJaWYgKEdFTV9jdXJzb3IpIHsKKwkJCQlncmFmX21vdXNlKFVTRVJfREVGLCBHRU1fY3Vyc29yLT5tZm9ybV9wKTsKKwkJCQlzZXRfc3lzdGVtX2N1cnNvciA9IDA7CisJCQl9IGVsc2UgeworCQkJCXNob3dfc3lzdGVtX2N1cnNvciA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBNb3VzZSBjdXJzb3IgaGlkZGVuIG9ubHkgb3ZlciB0aGUgYXBwbGljYXRpb24gd2luZG93ICovCisJCWlmICgoU0RMX0dldEFwcFN0YXRlKCkgJiBmdWxsX2ZvY3VzKSA9PSBmdWxsX2ZvY3VzKSB7CisJCQlzZXRfc3lzdGVtX2N1cnNvciA9IDA7CisJCQlzaG93X3N5c3RlbV9jdXJzb3IgPSAwOworCQl9CisJfQorCisJZ3JhZl9tb3VzZShzaG93X3N5c3RlbV9jdXJzb3IgPyBNX09OIDogTV9PRkYsIE5VTEwpOworCWlmIChzZXRfc3lzdGVtX2N1cnNvcikgeworCQlncmFmX21vdXNlKEFSUk9XLCBOVUxMKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZW0vU0RMX2dlbW1vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmY5MGJhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZW0vU0RMX2dlbW1vdXNlX2MuaApAQCAtMCwwICsxLDM0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9nZW12aWRlby5oIgorCisvKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KK2V4dGVybiB2b2lkIEdFTV9GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworZXh0ZXJuIFdNY3Vyc29yICpHRU1fQ3JlYXRlV01DdXJzb3IoX1RISVMsCisJCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSk7CitleHRlcm4gaW50IEdFTV9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworI2lmIDAKK2V4dGVybiB2b2lkIEdFTV9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7CisjZW5kaWYKK2V4dGVybiB2b2lkIEdFTV9DaGVja01vdXNlTW9kZShfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2VtL1NETF9nZW12aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTkxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtdmlkZW8uYwpAQCAtMCwwICsxLDEzMzcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCUdFTSB2aWRlbyBkcml2ZXIKKworCVBhdHJpY2UgTWFuZGluCisJYW5kIHdvcmsgZnJvbQorCU9saXZpZXIgTGFuZGVtYXJyZSwgSm9oYW4gS2xvY2thcnMsIFhhdmllciBKb3ViZXJ0LCBDbGF1ZGUgQXR0YXJkCisqLworCisvKiBNaW50IGluY2x1ZGVzICovCisjaW5jbHVkZSA8Z2VtLmg+CisjaW5jbHVkZSA8Z2VteC5oPgorI2luY2x1ZGUgPG1pbnQvb3NiaW5kLmg+CisjaW5jbHVkZSA8bWludC9jb29raWUuaD4KKworI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vU0RMX2N1cnNvcl9jLmgiCisKKyNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfYXRhcmljMnBfcy5oIgorI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaWVkZGlfcy5oIgorI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaW14YWxsb2NfYy5oIgorI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaWdsX2MuaCIKKworI2luY2x1ZGUgIlNETF9nZW12aWRlby5oIgorI2luY2x1ZGUgIlNETF9nZW1ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9nZW1tb3VzZV9jLmgiCisjaW5jbHVkZSAiU0RMX2dlbXdtX2MuaCIKKyNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfeGJpb3NldmVudHNfYy5oIgorI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaWRldm1vdXNlX2MuaCIKKworLyogRGVmaW5lcyAqLworCisvKiNkZWZpbmUgREVCVUdfVklERU9fR0VNCTEqLworCisjZGVmaW5lIEdFTV9WSURfRFJJVkVSX05BTUUgImdlbSIKKworI3VuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKSAoKChhKTwoYikpID8gKGEpIDogKGIpKQorI3VuZGVmIE1BWAorI2RlZmluZSBNQVgoYSxiKSAoKChhKT4oYikpID8gKGEpIDogKGIpKQorCisvKiBWYXJpYWJsZXMgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdmRpX2luZGV4WzI1Nl0gPSB7CisJMCwgIDIsICAzLCAgNiwgIDQsICA3LCAgNSwgICA4LAorCTksIDEwLCAxMSwgMTQsIDEyLCAxNSwgMTMsIDI1NQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgZW1wdHlfbmFtZVtdPSIiOworCisvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgR0VNX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKkdFTV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworc3RhdGljIFNETF9TdXJmYWNlICpHRU1fU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOworc3RhdGljIGludCBHRU1fU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKK3N0YXRpYyB2b2lkIEdFTV9WaWRlb1F1aXQoX1RISVMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBHRU1fQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgR0VNX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgR0VNX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIEdFTV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIEdFTV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBHRU1fVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKKyNpZiAwCitzdGF0aWMgaW50IEdFTV9Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgb24pOworI2VuZGlmCisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgR0VNX0ZyZWVCdWZmZXJzKF9USElTKTsKK3N0YXRpYyB2b2lkIEdFTV9DbGVhclNjcmVlbihfVEhJUyk7CitzdGF0aWMgdm9pZCBHRU1fQ2xlYXJSZWN0KF9USElTLCBzaG9ydCAqcmVjdCk7CitzdGF0aWMgdm9pZCBHRU1fU2V0TmV3UGFsZXR0ZShfVEhJUywgVWludDE2IG5ld3BhbFsyNTZdWzNdKTsKK3N0YXRpYyB2b2lkIEdFTV9Mb2NrU2NyZWVuKF9USElTKTsKK3N0YXRpYyB2b2lkIEdFTV9VbmxvY2tTY3JlZW4oX1RISVMpOworc3RhdGljIHZvaWQgcmVmcmVzaF93aW5kb3coX1RISVMsIGludCB3aW5oYW5kbGUsIHNob3J0ICpyZWN0KTsKKworI2lmIFNETF9WSURFT19PUEVOR0wKKy8qIE9wZW5HTCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIEdFTV9HTF9Td2FwQnVmZmVycyhfVEhJUyk7CisjZW5kaWYKKworLyogR0VNIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgR0VNX0F2YWlsYWJsZSh2b2lkKQoreworCS8qIFRlc3QgaWYgQUVTIGF2YWlsYWJsZSAqLworCWlmIChhcHBsX2luaXQoKSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlhcHBsX2V4aXQoKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgR0VNX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqR0VNX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7CisJaW50IHZlY3RvcnNfbWFzazsKKy8qCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ki8KKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwkJZGV2aWNlLT5nbF9kYXRhID0gKHN0cnVjdCBTRExfUHJpdmF0ZUdMRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5nbF9kYXRhKSk7CisJfQorCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIGRldmljZSApIHsKKwkJCVNETF9mcmVlKGRldmljZSk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCVNETF9tZW1zZXQoZGV2aWNlLT5nbF9kYXRhLCAwLCBzaXplb2YoKmRldmljZS0+Z2xfZGF0YSkpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCWRldmljZS0+VmlkZW9Jbml0ID0gR0VNX1ZpZGVvSW5pdDsKKwlkZXZpY2UtPkxpc3RNb2RlcyA9IEdFTV9MaXN0TW9kZXM7CisJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBHRU1fU2V0VmlkZW9Nb2RlOworCWRldmljZS0+U2V0Q29sb3JzID0gR0VNX1NldENvbG9yczsKKwlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTCAvKkdFTV9VcGRhdGVSZWN0cyovOworCWRldmljZS0+VmlkZW9RdWl0ID0gR0VNX1ZpZGVvUXVpdDsKKwlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gR0VNX0FsbG9jSFdTdXJmYWNlOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IEdFTV9Mb2NrSFdTdXJmYWNlOworCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gR0VNX1VubG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBHRU1fRmxpcEhXU3VyZmFjZTsKKwlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBHRU1fRnJlZUhXU3VyZmFjZTsKKwlkZXZpY2UtPlRvZ2dsZUZ1bGxTY3JlZW4gPSBOVUxMIC8qR0VNX1RvZ2dsZUZ1bGxTY3JlZW4qLzsKKworCS8qIFdpbmRvdyBtYW5hZ2VyICovCisJZGV2aWNlLT5TZXRDYXB0aW9uID0gR0VNX1NldENhcHRpb247CisJZGV2aWNlLT5TZXRJY29uID0gR0VNX1NldEljb247CisJZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gR0VNX0ljb25pZnlXaW5kb3c7CisJZGV2aWNlLT5HcmFiSW5wdXQgPSBHRU1fR3JhYklucHV0OworCisJLyogRXZlbnRzICovCisJZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBHRU1fSW5pdE9TS2V5bWFwOworCWRldmljZS0+UHVtcEV2ZW50cyA9IEdFTV9QdW1wRXZlbnRzOworCisJLyogTW91c2UgKi8KKwlkZXZpY2UtPkZyZWVXTUN1cnNvciA9IEdFTV9GcmVlV01DdXJzb3I7CisJZGV2aWNlLT5DcmVhdGVXTUN1cnNvciA9IEdFTV9DcmVhdGVXTUN1cnNvcjsKKwlkZXZpY2UtPlNob3dXTUN1cnNvciA9IEdFTV9TaG93V01DdXJzb3I7CisJZGV2aWNlLT5XYXJwV01DdXJzb3IgPSBOVUxMIC8qR0VNX1dhcnBXTUN1cnNvciovOworCWRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBHRU1fQ2hlY2tNb3VzZU1vZGU7CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisJLyogT3BlbkdMIGZ1bmN0aW9ucyAqLworCWRldmljZS0+R0xfTG9hZExpYnJhcnkgPSBTRExfQXRhcmlHTF9Mb2FkTGlicmFyeTsKKwlkZXZpY2UtPkdMX0dldFByb2NBZGRyZXNzID0gU0RMX0F0YXJpR0xfR2V0UHJvY0FkZHJlc3M7CisJZGV2aWNlLT5HTF9HZXRBdHRyaWJ1dGUgPSBTRExfQXRhcmlHTF9HZXRBdHRyaWJ1dGU7CisJZGV2aWNlLT5HTF9NYWtlQ3VycmVudCA9IFNETF9BdGFyaUdMX01ha2VDdXJyZW50OworCWRldmljZS0+R0xfU3dhcEJ1ZmZlcnMgPSBHRU1fR0xfU3dhcEJ1ZmZlcnM7CisjZW5kaWYKKworCWRldmljZS0+aGlkZGVuLT51c2VfZGV2X21vdXNlID0KKwkJKFNETF9BdGFyaURldk1vdXNlX09wZW4oKSE9MCkgPyBTRExfVFJVRSA6IFNETF9GQUxTRTsKKworCXZlY3RvcnNfbWFzayA9IEFUQVJJX1hCSU9TX0pPWVNUSUNLRVZFTlRTOwkvKiBYQklPUyBqb3lzdGljayBldmVudHMgKi8KKwlpZiAoIShkZXZpY2UtPmhpZGRlbi0+dXNlX2Rldl9tb3VzZSkpIHsKKwkJdmVjdG9yc19tYXNrIHw9IEFUQVJJX1hCSU9TX01PVVNFRVZFTlRTOwkvKiBYQklPUyBtb3VzZSBldmVudHMgKi8KKwl9CisvKglpZiAoR2V0Y29va2llKENfTWlOVCwgJmR1bW15KT09Q19GT1VORCkgeworCQl2ZWN0b3JzX21hc2sgPSAwOworCX0qLworCisJU0RMX0F0YXJpWGJpb3NfSW5zdGFsbFZlY3RvcnModmVjdG9yc19tYXNrKTsKKworCWRldmljZS0+ZnJlZSA9IEdFTV9EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBHRU1fYm9vdHN0cmFwID0geworCUdFTV9WSURfRFJJVkVSX05BTUUsICJBdGFyaSBHRU0gdmlkZW8gZHJpdmVyIiwKKwlHRU1fQXZhaWxhYmxlLCBHRU1fQ3JlYXRlRGV2aWNlCit9OworCitzdGF0aWMgdm9pZCBWRElfUmVhZEV4dEluZm8oX1RISVMsIHNob3J0ICp3b3JrX291dCkKK3sKKwl1bnNpZ25lZCBsb25nIEVkRElfdmVyc2lvbjsKKwlsb25nIGNvb2tpZV9FZERJOworCVVpbnQxNiBjbHV0X3R5cGU7CisKKwkvKiBSZWFkIEVkREkgaW5mb3JtYXRpb25zICovCisJaWYgIChHZXRjb29raWUoQ19FZERJLCAmY29va2llX0VkREkpID09IENfTk9URk9VTkQpIHsKKwkJcmV0dXJuOworCX0KKwkKKwlFZERJX3ZlcnNpb24gPSBBdGFyaV9nZXRfRWRESV92ZXJzaW9uKCAodm9pZCAqKWNvb2tpZV9FZERJKTsKKworCXZxX3Njcm5pbmZvKFZESV9oYW5kbGUsIHdvcmtfb3V0KTsKKworCVZESV9mb3JtYXQgPSB3b3JrX291dFswXTsKKwljbHV0X3R5cGUgPSB3b3JrX291dFsxXTsKKworCS8qIFdpdGggRWREST49MS4xLCB3ZSBjYW4gaGF2ZSBzY3JlZW4gcGl0Y2gsIGFkZHJlc3MgYW5kIGZvcm1hdAorCSAqIHNvIHdlIGNhbiBkaXJlY3RseSB3cml0ZSB0byBzY3JlZW4gd2l0aG91dCB1c2luZyB2cm9fY3B5Zm0KKwkgKi8KKwlpZiAoRWRESV92ZXJzaW9uID49IEVERElfMTEpIHsKKwkJVkRJX3BpdGNoID0gd29ya19vdXRbNV07CisJCVZESV9zY3JlZW4gPSAodm9pZCAqKSAqKCh1bnNpZ25lZCBsb25nICopICZ3b3JrX291dFs2XSk7CisJfQorCisJc3dpdGNoKGNsdXRfdHlwZSkgeworCQljYXNlIFZESV9DTFVUX0hBUkRXQVJFOgorCQkJeworCQkJCWludCBpOworCQkJCVVpbnQxNiAqdG1wX3A7CisKKwkJCQl0bXBfcCA9IChVaW50MTYgKikmd29ya19vdXRbMTZdOworCisJCQkJZm9yIChpPTA7aTwyNTY7aSsrKSB7CisJCQkJCXZkaV9pbmRleFsqdG1wX3ArK10gPSBpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFZESV9DTFVUX1NPRlRXQVJFOgorCQkJeworCQkJCWludCBjb21wb25lbnQ7IC8qIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhLCBvdmVybGF5ICovCisJCQkJaW50IG51bV9iaXQ7CisJCQkJdW5zaWduZWQgc2hvcnQgKnRtcF9wOworCisJCQkJLyogV2UgY2FuIGJ1aWxkIG1hc2tzIHdpdGggaW5mbyBoZXJlICovCisJCQkJdG1wX3AgPSAodW5zaWduZWQgc2hvcnQgKikgJndvcmtfb3V0WzE2XTsKKwkJCQlmb3IgKGNvbXBvbmVudD0wO2NvbXBvbmVudDw1O2NvbXBvbmVudCsrKSB7CisJCQkJCWZvciAobnVtX2JpdD0wO251bV9iaXQ8MTY7bnVtX2JpdCsrKSB7CisJCQkJCQl1bnNpZ25lZCBzaG9ydCB2YWxldXI7CisKKwkJCQkJCXZhbGV1ciA9ICp0bXBfcCsrOworCisJCQkJCQlpZiAodmFsZXVyID09IDB4ZmZmZikgeworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCisJCQkJCQlzd2l0Y2goY29tcG9uZW50KSB7CisJCQkJCQkJY2FzZSAwOgorCQkJCQkJCQlWRElfcmVkbWFzayB8PSAxPDwgdmFsZXVyOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCVZESV9ncmVlbm1hc2sgfD0gMTw8IHZhbGV1cjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlWRElfYmx1ZW1hc2sgfD0gMTw8IHZhbGV1cjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQlWRElfYWxwaGFtYXNrIHw9IDE8PCB2YWxldXI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvKiBSZW1vdmUgbG93ZXIgZ3JlZW4gYml0cyBmb3IgSW50ZWwgZW5kaWFuIHNjcmVlbiAqLworCQkJaWYgKChWRElfZ3JlZW5tYXNrID09ICgoNzw8MTMpfDMpKSB8fCAoVkRJX2dyZWVubWFzayA9PSAoKDc8PDEzKXw3KSkpIHsKKwkJCQlWRElfZ3JlZW5tYXNrICY9IH4oNzw8MTMpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVkRJX0NMVVRfTk9ORToKKwkJCWJyZWFrOworCX0KK30KKworaW50IEdFTV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKwlpbnQgaSwgbWVudWJhcl9zaXplOworCXNob3J0IHdvcmtfaW5bMTJdLCB3b3JrX291dFsyNzJdLCBkdW1teTsKKworCS8qIE9wZW4gQUVTIChBcHBsaWNhdGlvbiBFbnZpcm9ubWVudCBTZXJ2aWNlcykgKi8KKwlpZiAoYXBwbF9pbml0KCkgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsIkNhbiBub3Qgb3BlbiBBRVNcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBSZWFkIHZlcnNpb24gYW5kIGZlYXR1cmVzICovCisJR0VNX3ZlcnNpb24gPSBhZXNfZ2xvYmFsWzBdOworCWlmIChHRU1fdmVyc2lvbiA+PSAweDA0MTApIHsKKwkJc2hvcnQgYXBfZ291dFs0XSwgZXJyb3Jjb2RlOworCQkKKwkJR0VNX3dmZWF0dXJlcz0wOworCQllcnJvcmNvZGU9YXBwbF9nZXRpbmZvKEFFU19XSU5ET1csICZhcF9nb3V0WzBdLCAmYXBfZ291dFsxXSwgJmFwX2dvdXRbMl0sICZhcF9nb3V0WzNdKTsKKworCQlpZiAoZXJyb3Jjb2RlPT0wKSB7CisJCQlHRU1fd2ZlYXR1cmVzPWFwX2dvdXRbMF07CQkJCisJCX0KKwl9CQorCisJLyogQXNrIFZESSBwaHlzaWNhbCB3b3Jrc3RhdGlvbiBoYW5kbGUgb3BlbmVkIGJ5IEFFUyAqLworCVZESV9oYW5kbGUgPSBncmFmX2hhbmRsZSgmZHVtbXksICZkdW1teSwgJmR1bW15LCAmZHVtbXkpOworCWlmIChWRElfaGFuZGxlPDEpIHsKKwkJZnByaW50ZihzdGRlcnIsIldyb25nIFZESSBoYW5kbGUgJWQgcmV0dXJuZWQgYnkgQUVTXG4iLFZESV9oYW5kbGUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBPcGVuIHZpcnR1YWwgVkRJIHdvcmtzdGF0aW9uICovCisJd29ya19pblswXT1HZXRyZXooKSsyOworCWZvcihpID0gMTsgaSA8IDEwOyBpKyspCisJCXdvcmtfaW5baV0gPSAxOworCXdvcmtfaW5bMTBdID0gMjsKKworCXZfb3BudndrKHdvcmtfaW4sICZWRElfaGFuZGxlLCB3b3JrX291dCk7CisJaWYgKFZESV9oYW5kbGUgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwiQ2FuIG5vdCBvcGVuIFZESSB2aXJ0dWFsIHdvcmtzdGF0aW9uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogUmVhZCBmdWxsc2NyZWVuIHNpemUgKi8KKwlWRElfdyA9IHdvcmtfb3V0WzBdICsgMTsKKwlWRElfaCA9IHdvcmtfb3V0WzFdICsgMTsKKworCS8qIFJlYWQgZGVza3RvcCBzaXplIGFuZCBwb3NpdGlvbiAqLworCWlmICghd2luZF9nZXQoREVTS1RPUF9IQU5ETEUsIFdGX1dPUktYWVdILCAmR0VNX2Rlc2tfeCwgJkdFTV9kZXNrX3ksICZHRU1fZGVza193LCAmR0VNX2Rlc2tfaCkpIHsKKwkJZnByaW50ZihzdGRlcnIsIkNhbiBub3QgcmVhZCBkZXNrdG9wIHByb3BlcnRpZXNcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBSZWFkIGJpdCBkZXB0aCAqLworCXZxX2V4dG5kKFZESV9oYW5kbGUsIDEsIHdvcmtfb3V0KTsKKwlWRElfYnBwID0gd29ya19vdXRbNF07CisJVkRJX29sZG51bWNvbG9ycz0wOworCisJc3dpdGNoKFZESV9icHApIHsKKwkJY2FzZSA4OgorCQkJVkRJX3BpeGVsc2l6ZT0xOworCQkJYnJlYWs7CisJCWNhc2UgMTU6CisJCWNhc2UgMTY6CisJCQlWRElfcGl4ZWxzaXplPTI7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCVZESV9waXhlbHNpemU9MzsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJVkRJX3BpeGVsc2l6ZT00OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwiJWQgYml0cyBjb2xvdXIgZGVwdGggbm90IHN1cHBvcnRlZFxuIixWRElfYnBwKTsKKwkJCXJldHVybiAxOworCX0KKworCS8qIFNldHVwIGhhcmR3YXJlIC0+IFZESSBwYWxldHRlIG1hcHBpbmcgKi8KKwlmb3IoaSA9IDE2OyBpIDwgMjU1OyBpKyspIHsKKwkJdmRpX2luZGV4W2ldID0gaTsKKwl9CisJdmRpX2luZGV4WzI1NV0gPSAxOworCisJLyogU2F2ZSBjdXJyZW50IHBhbGV0dGUgKi8KKwlpZiAoVkRJX2JwcD44KSB7CisJCVZESV9vbGRudW1jb2xvcnM9MTw8ODsKKwl9IGVsc2UgeworCQlWRElfb2xkbnVtY29sb3JzPTE8PFZESV9icHA7CisJfQorCQorCWZvcihpID0gMDsgaSA8IFZESV9vbGRudW1jb2xvcnM7IGkrKykgeworCQlzaG9ydCByZ2JbM107CisKKwkJdnFfY29sb3IoVkRJX2hhbmRsZSwgaSwgMCwgcmdiKTsKKworCQlWRElfb2xkcGFsZXR0ZVtpXVswXSA9IHJnYlswXTsKKwkJVkRJX29sZHBhbGV0dGVbaV1bMV0gPSByZ2JbMV07CisJCVZESV9vbGRwYWxldHRlW2ldWzJdID0gcmdiWzJdOworCX0KKwlWRElfc2V0cGFsZXR0ZSA9IEdFTV9TZXROZXdQYWxldHRlOworCVNETF9tZW1jcHkoVkRJX2N1cnBhbGV0dGUsVkRJX29sZHBhbGV0dGUsc2l6ZW9mKFZESV9jdXJwYWxldHRlKSk7CisKKwkvKiBTZXR1cCBzY3JlZW4gaW5mbyAqLworCUdFTV90aXRsZV9uYW1lID0gZW1wdHlfbmFtZTsKKwlHRU1faWNvbl9uYW1lID0gZW1wdHlfbmFtZTsKKworCUdFTV9oYW5kbGUgPSAtMTsKKwlHRU1fbG9ja2VkID0gU0RMX0ZBTFNFOworCUdFTV93aW5fZnVsbGVkID0gU0RMX0ZBTFNFOworCUdFTV9mdWxsc2NyZWVuID0gU0RMX0ZBTFNFOworCUdFTV9sb2NrX3JlZHJhdyA9IFNETF9UUlVFOwkvKiBQcmV2ZW50IHJlZHJhdyB0aWxsIGJ1ZmZlcnMgYXJlIHNldHVwICovCisKKwlWRElfc2NyZWVuID0gTlVMTDsKKwlWRElfcGl0Y2ggPSBWRElfdyAqIFZESV9waXhlbHNpemU7CisJVkRJX2Zvcm1hdCA9ICggKFZESV9icHAgPD0gOCkgPyBWRElfRk9STUFUX0lOVEVSIDogVkRJX0ZPUk1BVF9QQUNLKTsKKwlWRElfcmVkbWFzayA9IFZESV9ncmVlbm1hc2sgPSBWRElfYmx1ZW1hc2sgPSBWRElfYWxwaGFtYXNrID0gMDsKKwlWRElfUmVhZEV4dEluZm8odGhpcywgd29ya19vdXQpOworCisjaWZkZWYgREVCVUdfVklERU9fR0VNCisJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBzY3JlZW46IGFkZHJlc3M9MHglMDh4LCBwaXRjaD0lZFxuIiwgVkRJX3NjcmVlbiwgVkRJX3BpdGNoKTsKKwlwcmludGYoInNkbDp2aWRlbzpnZW06IGZvcm1hdD0lZFxuIiwgVkRJX2Zvcm1hdCk7CisJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBtYXNrczogMHglMDh4LCAweCUwOHgsIDB4JTA4eCwgMHglMDh4XG4iLAorCQlWRElfYWxwaGFtYXNrLCBWRElfcmVkbWFzaywgVkRJX2dyZWVubWFzaywgVkRJX2JsdWVtYXNrCisJKTsKKyNlbmRpZgorCisJLyogU2V0dXAgZGVzdGluYXRpb24gbWZkYiAqLworCVZESV9kc3RfbWZkYi5mZF9hZGRyID0gTlVMTDsKKworCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLworCXRoaXMtPmluZm8uY3VycmVudF93ID0gVkRJX3c7CisJdGhpcy0+aW5mby5jdXJyZW50X2ggPSBWRElfaDsKKworCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICovCisJLyogd2UgY2hhbmdlIHRoaXMgZHVyaW5nIHRoZSBTRExfU2V0VmlkZW9Nb2RlIGltcGxlbWVudGF0aW9uLi4uICovCisJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gVkRJX2JwcDsKKworCS8qIFNldCBtb3VzZSBjdXJzb3IgdG8gYXJyb3cgKi8KKwlncmFmX21vdXNlKEFSUk9XLCBOVUxMKTsKKwlHRU1fY3Vyc29yID0gTlVMTDsKKworCS8qIEluaXQgY2h1bmt5IHRvIHBsYW5hciByb3V0aW5lICovCisJU0RMX0F0YXJpX0MycENvbnZlcnQgPSBTRExfQXRhcmlfQzJwQ29udmVydDg7CisKKwkvKiBTZXR1cCBWREkgZmlsbCBmdW5jdGlvbnMgKi8KKwl2c2ZfY29sb3IoVkRJX2hhbmRsZSwwKTsKKwl2c2ZfaW50ZXJpb3IoVkRJX2hhbmRsZSwxKTsKKwl2c2ZfcGVyaW1ldGVyKFZESV9oYW5kbGUsMCk7CisKKwkvKiBNZW51IGJhciBzYXZlIGJ1ZmZlciAqLworCW1lbnViYXJfc2l6ZSA9IEdFTV9kZXNrX3cgKiBHRU1fZGVza195ICogVkRJX3BpeGVsc2l6ZTsKKwlHRU1fbWVudWJhcj1BdGFyaV9TeXNNYWxsb2MobWVudWJhcl9zaXplLE1YX1BSRUZUVFJBTSk7CisKKwkvKiBGaWxsIHZpZGVvIG1vZGVzIGxpc3QgKi8KKwlTRExfbW9kZWxpc3RbMF0gPSBTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpOworCVNETF9tb2RlbGlzdFswXS0+eCA9IDA7CisJU0RMX21vZGVsaXN0WzBdLT55ID0gMDsKKwlTRExfbW9kZWxpc3RbMF0tPncgPSBWRElfdzsKKwlTRExfbW9kZWxpc3RbMF0tPmggPSBWRElfaDsKKworCVNETF9tb2RlbGlzdFsxXSA9IE5VTEw7CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisJU0RMX0F0YXJpR0xfSW5pdFBvaW50ZXJzKHRoaXMpOworI2VuZGlmCisKKwl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDE7CisKKwkvKiBXZSdyZSBkb25lISAqLworCXJldHVybigwKTsKK30KKworU0RMX1JlY3QgKipHRU1fTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCWlmIChmb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSBWRElfYnBwKSB7CisJCXJldHVybiAoKFNETF9SZWN0ICoqKU5VTEwpOworCX0KKworCWlmIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSB7CisJCXJldHVybiAoU0RMX21vZGVsaXN0KTsKKwl9CisKKwlyZXR1cm4oKFNETF9SZWN0ICoqKS0xKTsKK30KKworc3RhdGljIHZvaWQgR0VNX0ZyZWVCdWZmZXJzKF9USElTKQoreworCS8qIFJlbGVhc2UgYnVmZmVyICovCisJaWYgKCBHRU1fYnVmZmVyMiApIHsKKwkJTWZyZWUoIEdFTV9idWZmZXIyICk7CisJCUdFTV9idWZmZXIyPU5VTEw7CisJfQorCisJaWYgKCBHRU1fYnVmZmVyMSApIHsKKwkJTWZyZWUoIEdFTV9idWZmZXIxICk7CisJCUdFTV9idWZmZXIxPU5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBHRU1fQ2xlYXJSZWN0KF9USElTLCBzaG9ydCAqcmVjdCkKK3sKKwlzaG9ydCBvbGRyZ2JbM10sIHJnYlszXT17MCwwLDB9OworCisJdnFfY29sb3IoVkRJX2hhbmRsZSwgdmRpX2luZGV4WzBdLCAwLCBvbGRyZ2IpOworCXZzX2NvbG9yKFZESV9oYW5kbGUsIHZkaV9pbmRleFswXSwgcmdiKTsKKworCXZzZl9jb2xvcihWRElfaGFuZGxlLDApOworCXZzZl9pbnRlcmlvcihWRElfaGFuZGxlLDEpOworCXZzZl9wZXJpbWV0ZXIoVkRJX2hhbmRsZSwwKTsKKwl2X2JhcihWRElfaGFuZGxlLCByZWN0KTsKKworCXZzX2NvbG9yKFZESV9oYW5kbGUsIHZkaV9pbmRleFswXSwgb2xkcmdiKTsKK30KKworc3RhdGljIHZvaWQgR0VNX0NsZWFyU2NyZWVuKF9USElTKQoreworCXNob3J0IHB4eVs0XTsKKworCXZfaGlkZV9jKFZESV9oYW5kbGUpOworCisJcHh5WzBdID0gcHh5WzFdID0gMDsKKwlweHlbMl0gPSBWRElfdyAtIDE7CisJcHh5WzNdID0gVkRJX2ggLSAxOworCUdFTV9DbGVhclJlY3QodGhpcywgcHh5KTsKKworCXZfc2hvd19jKFZESV9oYW5kbGUsIDEpOworfQorCitzdGF0aWMgdm9pZCBHRU1fU2V0TmV3UGFsZXR0ZShfVEhJUywgVWludDE2IG5ld3BhbFsyNTZdWzNdKQoreworCWludCBpOworCXNob3J0IHJnYlszXTsKKworCWlmIChWRElfb2xkbnVtY29sb3JzPT0wKQorCQlyZXR1cm47CisKKwlmb3IoaSA9IDA7IGkgPCBWRElfb2xkbnVtY29sb3JzOyBpKyspIHsKKwkJcmdiWzBdID0gbmV3cGFsW2ldWzBdOworCQlyZ2JbMV0gPSBuZXdwYWxbaV1bMV07CisJCXJnYlsyXSA9IG5ld3BhbFtpXVsyXTsKKworCQl2c19jb2xvcihWRElfaGFuZGxlLCBpLCByZ2IpOworCX0KK30KKworc3RhdGljIHZvaWQgR0VNX0xvY2tTY3JlZW4oX1RISVMpCit7CisJaWYgKCFHRU1fbG9ja2VkKSB7CisJCS8qIExvY2sgQUVTICovCisJCXdpbmRfdXBkYXRlKEJFR19VUERBVEUpOworCQl3aW5kX3VwZGF0ZShCRUdfTUNUUkwpOworCQkvKiBSZXNlcnZlIG1lbW9yeSBzcGFjZSwgdXNlZCB0byBiZSBzdXJlIG9mIGNvbXBhdGliaWxpdHkgKi8KKwkJZm9ybV9kaWFsKCBGTURfU1RBUlQsIDAsMCwwLDAsIDAsMCxWRElfdyxWRElfaCk7CisKKwkJLyogU2F2ZSBtZW51IGJhciAqLworCQlpZiAoR0VNX21lbnViYXIpIHsKKwkJCU1GREIgbWZkYl9zcmM7CisJCQlzaG9ydCBibGl0Y29vcmRzWzhdOworCisJCQltZmRiX3NyYy5mZF9hZGRyPUdFTV9tZW51YmFyOworCQkJbWZkYl9zcmMuZmRfdz1HRU1fZGVza193OworCQkJbWZkYl9zcmMuZmRfaD1HRU1fZGVza195OworCQkJbWZkYl9zcmMuZmRfd2R3aWR0aD1HRU1fZGVza193Pj40OworCQkJbWZkYl9zcmMuZmRfbnBsYW5lcz1WRElfYnBwOworCQkJbWZkYl9zcmMuZmRfc3RhbmQ9CisJCQkJbWZkYl9zcmMuZmRfcjE9CisJCQkJbWZkYl9zcmMuZmRfcjI9CisJCQkJbWZkYl9zcmMuZmRfcjM9IDA7CisKKwkJCWJsaXRjb29yZHNbMF0gPSBibGl0Y29vcmRzWzRdID0gMDsKKwkJCWJsaXRjb29yZHNbMV0gPSBibGl0Y29vcmRzWzVdID0gMDsKKwkJCWJsaXRjb29yZHNbMl0gPSBibGl0Y29vcmRzWzZdID0gR0VNX2Rlc2tfdy0xOworCQkJYmxpdGNvb3Jkc1szXSA9IGJsaXRjb29yZHNbN10gPSBHRU1fZGVza195LTE7CisKKwkJCXZyb19jcHlmbShWRElfaGFuZGxlLCBTX09OTFksIGJsaXRjb29yZHMsICZWRElfZHN0X21mZGIsICZtZmRiX3NyYyk7CisJCX0KKworCQlHRU1fbG9ja2VkPVNETF9UUlVFOworCX0KK30KKworc3RhdGljIHZvaWQgR0VNX1VubG9ja1NjcmVlbihfVEhJUykKK3sKKwlpZiAoR0VNX2xvY2tlZCkgeworCQkvKiBSZXN0b3JlIG1lbnUgYmFyICovCisJCWlmIChHRU1fbWVudWJhcikgeworCQkJTUZEQiBtZmRiX3NyYzsKKwkJCXNob3J0IGJsaXRjb29yZHNbOF07CisKKwkJCW1mZGJfc3JjLmZkX2FkZHI9R0VNX21lbnViYXI7CisJCQltZmRiX3NyYy5mZF93PUdFTV9kZXNrX3c7CisJCQltZmRiX3NyYy5mZF9oPUdFTV9kZXNrX3k7CisJCQltZmRiX3NyYy5mZF93ZHdpZHRoPUdFTV9kZXNrX3c+PjQ7CisJCQltZmRiX3NyYy5mZF9ucGxhbmVzPVZESV9icHA7CisJCQltZmRiX3NyYy5mZF9zdGFuZD0KKwkJCQltZmRiX3NyYy5mZF9yMT0KKwkJCQltZmRiX3NyYy5mZF9yMj0KKwkJCQltZmRiX3NyYy5mZF9yMz0gMDsKKworCQkJYmxpdGNvb3Jkc1swXSA9IGJsaXRjb29yZHNbNF0gPSAwOworCQkJYmxpdGNvb3Jkc1sxXSA9IGJsaXRjb29yZHNbNV0gPSAwOworCQkJYmxpdGNvb3Jkc1syXSA9IGJsaXRjb29yZHNbNl0gPSBHRU1fZGVza193LTE7CisJCQlibGl0Y29vcmRzWzNdID0gYmxpdGNvb3Jkc1s3XSA9IEdFTV9kZXNrX3ktMTsKKworCQkJdnJvX2NweWZtKFZESV9oYW5kbGUsIFNfT05MWSwgYmxpdGNvb3JkcywgJm1mZGJfc3JjLCAmVkRJX2RzdF9tZmRiKTsKKwkJfQorCisJCS8qIFJlc3RvcmUgc2NyZWVuIG1lbW9yeSwgYW5kIHNlbmQgUkVEUkFXIHRvIGFsbCBhcHBzICovCisJCWZvcm1fZGlhbCggRk1EX0ZJTklTSCwgMCwwLDAsMCwgMCwwLFZESV93LFZESV9oKTsKKwkJLyogVW5sb2NrIEFFUyAqLworCQl3aW5kX3VwZGF0ZShFTkRfTUNUUkwpOworCQl3aW5kX3VwZGF0ZShFTkRfVVBEQVRFKTsKKworCQlHRU1fbG9ja2VkPVNETF9GQUxTRTsKKwl9Cit9CisKK1NETF9TdXJmYWNlICpHRU1fU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlVaW50MzIgbW9kZWZsYWdzLCBzY3JlZW5zaXplOworCVNETF9ib29sIHVzZV9zaGFkb3cxLCB1c2Vfc2hhZG93MjsKKworCS8qIHdpZHRoIG11c3QgYmUgbXVsdGlwbGUgb2YgMTYsIGZvciB2cm9fY3B5Zm0oKSBhbmQgYzJwX2NvbnZlcnQoKSAqLworCWlmICgod2lkdGggJiAxNSkgIT0gMCkgeworCQl3aWR0aCA9ICh3aWR0aCB8IDE1KSArMTsKKwl9CisKKwkvKi0tLSBWZXJpZnkgaWYgYXNrZWQgbW9kZSBjYW4gYmUgdXNlZCAtLS0qLworCWlmIChWRElfYnBwICE9IGJwcCkgeworCQlTRExfU2V0RXJyb3IoIiVkIGJwcCBtb2RlIG5vdCBzdXBwb3J0ZWQiLCBicHApOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pIHsKKwkJaWYgKChWRElfdyA8IHdpZHRoKSB8fCAoVkRJX2ggPCBoZWlnaHQpKSB7CisJCQlTRExfU2V0RXJyb3IoIiVkeCVkIG1vZGUgaXMgdG9vIGxhcmdlIiwgd2lkdGgsIGhlaWdodCk7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKwl9CisKKwkvKi0tLSBBbGxvY2F0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgdGhlIHNjcmVlbiAtLS0qLworCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBWRElfYnBwLCBWRElfcmVkbWFzaywgVkRJX2dyZWVubWFzaywgVkRJX2JsdWVtYXNrLCBWRElfYWxwaGFtYXNrKSApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciByZXF1ZXN0ZWQgbW9kZSIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJc2NyZWVuc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogVkRJX3BpeGVsc2l6ZTsKKworI2lmZGVmIERFQlVHX1ZJREVPX0dFTQorCXByaW50Zigic2RsOnZpZGVvOmdlbTogc2V0dmlkZW9tb2RlKCk6ICVkeCVkeCVkID0gJWRcbiIsIHdpZHRoLCBoZWlnaHQsIGJwcCwgc2NyZWVuc2l6ZSk7CisjZW5kaWYKKworCS8qLS0tIEFsbG9jYXRlIHNoYWRvdyBidWZmZXJzIGlmIG5lZWRlZCwgYW5kIGNvbnZlcnNpb24gb3BlcmF0aW9ucyAtLS0qLworCUdFTV9GcmVlQnVmZmVycyh0aGlzKTsKKworCUdFTV9idWZvcHM9MDsKKwl1c2Vfc2hhZG93MT11c2Vfc2hhZG93Mj1TRExfRkFMU0U7CisJaWYgKFZESV9zY3JlZW4gJiYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pKSB7CisJCWlmIChWRElfZm9ybWF0PT1WRElfRk9STUFUX0lOVEVSKSB7CisJCQl1c2Vfc2hhZG93MT1TRExfVFJVRTsKKwkJCUdFTV9idWZvcHMgPSBCMlNfQzJQXzFUT1M7CisJCX0KKwl9IGVsc2UgeworCQl1c2Vfc2hhZG93MT1TRExfVFJVRTsKKwkJaWYgKFZESV9mb3JtYXQ9PVZESV9GT1JNQVRfUEFDSykgeworCQkJR0VNX2J1Zm9wcyA9IEIyU19WUk9DUFlGTV8xVE9TOworCQl9IGVsc2UgeworCQkJdXNlX3NoYWRvdzI9U0RMX1RSVUU7CisJCQlHRU1fYnVmb3BzID0gQjJTX0MyUF8xVE8yfEIyU19WUk9DUFlGTV8yVE9TOworCQl9CisJfQorCisJaWYgKHVzZV9zaGFkb3cxKSB7CisJCUdFTV9idWZmZXIxID0gQXRhcmlfU3lzTWFsbG9jKHNjcmVlbnNpemUsIE1YX1BSRUZUVFJBTSk7CisJCWlmIChHRU1fYnVmZmVyMT09TlVMTCkgeworCQkJU0RMX1NldEVycm9yKCJDYW4gbm90IGFsbG9jYXRlICVkIEtCIGZvciBmcmFtZSBidWZmZXIiLCBzY3JlZW5zaXplPj4xMCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlTRExfbWVtc2V0KEdFTV9idWZmZXIxLCAwLCBzY3JlZW5zaXplKTsKKyNpZmRlZiBERUJVR19WSURFT19HRU0KKwkJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBzZXR2aWRlb21vZGUoKTogYWxsb2NhdGVkIGJ1ZmZlciAxXG4iKTsKKyNlbmRpZgorCX0KKworCWlmICh1c2Vfc2hhZG93MikgeworCQlHRU1fYnVmZmVyMiA9IEF0YXJpX1N5c01hbGxvYyhzY3JlZW5zaXplLCBNWF9QUkVGVFRSQU0pOworCQlpZiAoR0VNX2J1ZmZlcjI9PU5VTEwpIHsKKwkJCVNETF9TZXRFcnJvcigiQ2FuIG5vdCBhbGxvY2F0ZSAlZCBLQiBmb3Igc2hhZG93IGJ1ZmZlciIsIHNjcmVlbnNpemU+PjEwKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCVNETF9tZW1zZXQoR0VNX2J1ZmZlcjIsIDAsIHNjcmVlbnNpemUpOworI2lmZGVmIERFQlVHX1ZJREVPX0dFTQorCQlwcmludGYoInNkbDp2aWRlbzpnZW06IHNldHZpZGVvbW9kZSgpOiBhbGxvY2F0ZWQgYnVmZmVyIDJcbiIpOworI2VuZGlmCisJfQorCisJLyotLS0gSW5pdGlhbGl6ZSBzY3JlZW4gLS0tKi8KKwltb2RlZmxhZ3MgPSBTRExfUFJFQUxMT0M7CisJaWYgKFZESV9icHAgPT0gOCkgeworCQltb2RlZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgeworCQlHRU1fTG9ja1NjcmVlbih0aGlzKTsKKworCQlHRU1fQ2xlYXJTY3JlZW4odGhpcyk7CisKKwkJbW9kZWZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworCQlpZiAoVkRJX3NjcmVlbiAmJiAoVkRJX2Zvcm1hdD09VkRJX0ZPUk1BVF9QQUNLKSAmJiAhdXNlX3NoYWRvdzEpIHsKKwkJCW1vZGVmbGFncyB8PSBTRExfSFdTVVJGQUNFOworCQl9IGVsc2UgeworCQkJbW9kZWZsYWdzIHw9IFNETF9TV1NVUkZBQ0U7CisJCX0KKworCQlHRU1fZnVsbHNjcmVlbiA9IFNETF9UUlVFOworCX0gZWxzZSB7CisJCWludCBvbGRfd2luX3R5cGU7CisJCXNob3J0IHgyLHkyLHcyLGgyOworCisJCUdFTV9VbmxvY2tTY3JlZW4odGhpcyk7CisKKwkJLyogU2V0IHdpbmRvdyBnYWRnZXRzICovCisJCW9sZF93aW5fdHlwZSA9IEdFTV93aW5fdHlwZTsKKwkJaWYgKCEoZmxhZ3MgJiBTRExfTk9GUkFNRSkpIHsKKwkJCUdFTV93aW5fdHlwZT1OQU1FfE1PVkVSfENMT1NFUnxTTUFMTEVSOworCQkJaWYgKGZsYWdzICYgU0RMX1JFU0laQUJMRSkgeworCQkJCUdFTV93aW5fdHlwZSB8PSBGVUxMRVJ8U0laRVI7CisJCQkJbW9kZWZsYWdzIHw9IFNETF9SRVNJWkFCTEU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlHRU1fd2luX3R5cGU9MDsKKwkJCW1vZGVmbGFncyB8PSBTRExfTk9GUkFNRTsKKwkJfQorCQltb2RlZmxhZ3MgfD0gU0RMX1NXU1VSRkFDRTsKKworCQkvKiBSZWNyZWF0ZSB3aW5kb3cgPyBvbmx5IGZvciBkaWZmZXJlbnQgd2lkZ2V0IG9yIG5vbi1jcmVhdGVkIHdpbmRvdyAqLworCQlpZiAoKG9sZF93aW5fdHlwZSAhPSBHRU1fd2luX3R5cGUpIHx8IChHRU1faGFuZGxlIDwgMCkpIHsKKwkJCS8qIENhbGN1bGF0ZSB3aW5kb3cgc2l6ZSAqLworCQkJaWYgKCF3aW5kX2NhbGMoV0NfQk9SREVSLCBHRU1fd2luX3R5cGUsIDAsMCx3aWR0aCxoZWlnaHQsICZ4MiwmeTIsJncyLCZoMikpIHsKKwkJCQlHRU1fRnJlZUJ1ZmZlcnModGhpcyk7CisJCQkJU0RMX1NldEVycm9yKCJDYW4gbm90IGNhbGN1bGF0ZSB3aW5kb3cgYXR0cmlidXRlcyIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisJCQkvKiBDZW50ZXIgd2luZG93ICovCisJCQl4MiA9IChHRU1fZGVza193LXcyKT4+MTsKKwkJCXkyID0gKEdFTV9kZXNrX2gtaDIpPj4xOworCQkJaWYgKHgyPDApIHsKKwkJCQl4MiA9IDA7CisJCQl9CisJCQlpZiAoeTI8MCkgeworCQkJCXkyID0gMDsKKwkJCX0KKwkJCXgyICs9IEdFTV9kZXNrX3g7CisJCQl5MiArPSBHRU1fZGVza195OworCisJCQkvKiBEZXN0cm95IGV4aXN0aW5nIHdpbmRvdyAqLworCQkJaWYgKEdFTV9oYW5kbGUgPj0gMCkgeworCQkJCXdpbmRfY2xvc2UoR0VNX2hhbmRsZSk7CisJCQkJd2luZF9kZWxldGUoR0VNX2hhbmRsZSk7CisJCQl9CisKKwkJCS8qIENyZWF0ZSB3aW5kb3cgKi8KKwkJCUdFTV9oYW5kbGU9d2luZF9jcmVhdGUoR0VNX3dpbl90eXBlLCB4Mix5Mix3MixoMik7CisJCQlpZiAoR0VNX2hhbmRsZTwwKSB7CisJCQkJR0VNX0ZyZWVCdWZmZXJzKHRoaXMpOworCQkJCVNETF9TZXRFcnJvcigiQ2FuIG5vdCBjcmVhdGUgd2luZG93Iik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKyNpZmRlZiBERUJVR19WSURFT19HRU0KKwkJCXByaW50Zigic2RsOnZpZGVvOmdlbTogaGFuZGxlPSVkXG4iLCBHRU1faGFuZGxlKTsKKyNlbmRpZgorCisJCQkvKiBTZXR1cCB3aW5kb3cgbmFtZSAqLworCQkJd2luZF9zZXQoR0VNX2hhbmRsZSxXRl9OQU1FLChzaG9ydCkoKCh1bnNpZ25lZCBsb25nKUdFTV90aXRsZV9uYW1lKT4+MTYpLChzaG9ydCkoKCh1bnNpZ25lZCBsb25nKUdFTV90aXRsZV9uYW1lKSAmIDB4ZmZmZiksMCwwKTsKKwkJCUdFTV9yZWZyZXNoX25hbWUgPSBTRExfRkFMU0U7CisKKwkJCS8qIE9wZW4gdGhlIHdpbmRvdyAqLworCQkJd2luZF9vcGVuKEdFTV9oYW5kbGUseDIseTIsdzIsaDIpOworCQl9IGVsc2UgeworCQkJLyogUmVzaXplIHdpbmRvdyB0byBmaXQgYXNrZWQgdmlkZW8gbW9kZSAqLworCQkJd2luZF9nZXQgKEdFTV9oYW5kbGUsIFdGX1dPUktYWVdILCAmeDIsJnkyLCZ3MiwmaDIpOworCQkJaWYgKHdpbmRfY2FsYyhXQ19CT1JERVIsIEdFTV93aW5fdHlwZSwgeDIseTIsd2lkdGgsaGVpZ2h0LCAmeDIsJnkyLCZ3MiwmaDIpKSB7CisJCQkJd2luZF9zZXQgKEdFTV9oYW5kbGUsIFdGX0NVUlJYWVdILCB4Mix5Mix3MixoMik7CisJCQl9CisJCX0KKworCQlHRU1fZnVsbHNjcmVlbiA9IFNETF9GQUxTRTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCisJY3VycmVudC0+dyA9IHdpZHRoOworCWN1cnJlbnQtPmggPSBoZWlnaHQ7CisJaWYgKHVzZV9zaGFkb3cxKSB7CisJCWN1cnJlbnQtPnBpeGVscyA9IEdFTV9idWZmZXIxOworCQljdXJyZW50LT5waXRjaCA9IHdpZHRoICogVkRJX3BpeGVsc2l6ZTsKKwl9IGVsc2UgeworCQljdXJyZW50LT5waXhlbHMgPSBWRElfc2NyZWVuOworCQljdXJyZW50LT5waXRjaCA9IFZESV9waXRjaDsKKwl9CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisJaWYgKGZsYWdzICYgU0RMX09QRU5HTCkgeworCQlpZiAoIVNETF9BdGFyaUdMX0luaXQodGhpcywgY3VycmVudCkpIHsKKwkJCUdFTV9GcmVlQnVmZmVycyh0aGlzKTsKKwkJCVNETF9TZXRFcnJvcigiQ2FuIG5vdCBjcmVhdGUgT3BlbkdMIGNvbnRleHQiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbW9kZWZsYWdzIHw9IFNETF9PUEVOR0w7CisJfQorI2VuZGlmCisKKwljdXJyZW50LT5mbGFncyA9IG1vZGVmbGFnczsKKworI2lmZGVmIERFQlVHX1ZJREVPX0dFTQorCXByaW50Zigic2RsOnZpZGVvOmdlbTogc3VyZmFjZTogJWR4JWRcbiIsIGN1cnJlbnQtPncsIGN1cnJlbnQtPmgpOworI2VuZGlmCisKKwl0aGlzLT5VcGRhdGVSZWN0cyA9IEdFTV9VcGRhdGVSZWN0czsKKwlHRU1fbG9ja19yZWRyYXcgPSBTRExfRkFMU0U7CS8qIEVuYWJsZSByZWRyYXcgKi8KKworCS8qIFdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4oY3VycmVudCk7Cit9CisKK3N0YXRpYyBpbnQgR0VNX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIEdFTV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgR0VNX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgR0VNX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBHRU1fVXBkYXRlUmVjdHNGdWxsc2NyZWVuKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKwlTRExfU3VyZmFjZSAqc3VyZmFjZTsKKwlpbnQgaSwgc3VyZl93aWR0aDsKKworCXN1cmZhY2UgPSB0aGlzLT5zY3JlZW47CisJLyogTmVlZCB0byBiZSBhIG11bHRpcGxlIG9mIDE2IHBpeGVscyAqLworCXN1cmZfd2lkdGg9c3VyZmFjZS0+dzsKKwlpZiAoKHN1cmZfd2lkdGggJiAxNSkgIT0gMCkgeworCQlzdXJmX3dpZHRoID0gKHN1cmZfd2lkdGggfCAxNSkgKyAxOworCX0KKworCWlmIChHRU1fYnVmb3BzICYgKEIyU19DMlBfMVRPMnxCMlNfQzJQXzFUT1MpKSB7CisJCXZvaWQgKmRlc3RzY3I7CisJCWludCBkZXN0cGl0Y2g7CisKKwkJaWYgKEdFTV9idWZvcHMgJiBCMlNfQzJQXzFUT1MpIHsKKwkJCWRlc3RzY3IgPSBWRElfc2NyZWVuOworCQkJZGVzdHBpdGNoID0gVkRJX3BpdGNoOworCQl9IGVsc2UgeworCQkJZGVzdHNjciA9IEdFTV9idWZmZXIyOworCQkJZGVzdHBpdGNoID0gc3VyZmFjZS0+cGl0Y2g7CisJCX0KKworCQlmb3IgKGk9MDtpPG51bXJlY3RzO2krKykgeworCQkJdm9pZCAqc291cmNlLCpkZXN0aW5hdGlvbjsKKwkJCWludCB4MSx4MjsKKworCQkJeDEgPSByZWN0c1tpXS54ICYgfjE1OworCQkJeDIgPSByZWN0c1tpXS54K3JlY3RzW2ldLnc7CisJCQlpZiAoeDIgJiAxNSkgeworCQkJCXgyID0gKHgyIHwgMTUpICsxOworCQkJfQorCisJCQlzb3VyY2UgPSBzdXJmYWNlLT5waXhlbHM7CisJCQlzb3VyY2UgKz0gc3VyZmFjZS0+cGl0Y2ggKiByZWN0c1tpXS55OworCQkJc291cmNlICs9IHgxOworCisJCQlkZXN0aW5hdGlvbiA9IGRlc3RzY3I7CisJCQlkZXN0aW5hdGlvbiArPSBkZXN0cGl0Y2ggKiByZWN0c1tpXS55OworCQkJZGVzdGluYXRpb24gKz0geDE7CisKKwkJCVNETF9BdGFyaV9DMnBDb252ZXJ0KAorCQkJCXNvdXJjZSwgZGVzdGluYXRpb24sCisJCQkJeDIteDEsIHJlY3RzW2ldLmgsCisJCQkJU0RMX0ZBTFNFLAorCQkJCXN1cmZhY2UtPnBpdGNoLCBkZXN0cGl0Y2gKKwkJCSk7CisJCX0KKwl9CisKKwlpZiAoR0VNX2J1Zm9wcyAmIChCMlNfVlJPQ1BZRk1fMVRPU3xCMlNfVlJPQ1BZRk1fMlRPUykpIHsKKwkJTUZEQiBtZmRiX3NyYzsKKwkJc2hvcnQgYmxpdGNvb3Jkc1s4XTsKKworCQltZmRiX3NyYy5mZF9hZGRyPXN1cmZhY2UtPnBpeGVsczsKKwkJbWZkYl9zcmMuZmRfdz1zdXJmX3dpZHRoOworCQltZmRiX3NyYy5mZF9oPXN1cmZhY2UtPmg7CisJCW1mZGJfc3JjLmZkX3dkd2lkdGg9IChzdXJmYWNlLT5waXRjaC9WRElfcGl4ZWxzaXplKSA+PiA0OworCQltZmRiX3NyYy5mZF9ucGxhbmVzPXN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsOworCQltZmRiX3NyYy5mZF9zdGFuZD0KKwkJCW1mZGJfc3JjLmZkX3IxPQorCQkJbWZkYl9zcmMuZmRfcjI9CisJCQltZmRiX3NyYy5mZF9yMz0gMDsKKwkJaWYgKEdFTV9idWZvcHMgJiBCMlNfVlJPQ1BZRk1fMlRPUykgeworCQkJbWZkYl9zcmMuZmRfYWRkcj1HRU1fYnVmZmVyMjsKKwkJfQorCisJCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgeworCQkJYmxpdGNvb3Jkc1swXSA9IGJsaXRjb29yZHNbNF0gPSByZWN0c1tpXS54OworCQkJYmxpdGNvb3Jkc1sxXSA9IGJsaXRjb29yZHNbNV0gPSByZWN0c1tpXS55OworCQkJYmxpdGNvb3Jkc1syXSA9IGJsaXRjb29yZHNbNl0gPSByZWN0c1tpXS54ICsgcmVjdHNbaV0udyAtIDE7CisJCQlibGl0Y29vcmRzWzNdID0gYmxpdGNvb3Jkc1s3XSA9IHJlY3RzW2ldLnkgKyByZWN0c1tpXS5oIC0gMTsKKworCQkJdnJvX2NweWZtKFZESV9oYW5kbGUsIFNfT05MWSwgYmxpdGNvb3JkcywgJm1mZGJfc3JjLCAmVkRJX2RzdF9tZmRiKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgR0VNX1VwZGF0ZVJlY3RzV2luZG93ZWQoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCXNob3J0IHB4eVs0XSwgd2luZF9weHlbNF07CisJaW50IGk7CisKKwlpZiAod2luZF9nZXQoR0VNX2hhbmRsZSwgV0ZfV09SS1hZV0gsICZ3aW5kX3B4eVswXSwgJndpbmRfcHh5WzFdLCAmd2luZF9weHlbMl0sICZ3aW5kX3B4eVszXSk9PTApIHsKKwkJcmV0dXJuOworCX0KKworCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgeworCQlweHlbMF0gPSB3aW5kX3B4eVswXSArIHJlY3RzW2ldLng7CisJCXB4eVsxXSA9IHdpbmRfcHh5WzFdICsgcmVjdHNbaV0ueTsKKwkJcHh5WzJdID0gcmVjdHNbaV0udzsKKwkJcHh5WzNdID0gcmVjdHNbaV0uaDsKKworCQlHRU1fd2luZF9yZWRyYXcodGhpcywgR0VNX2hhbmRsZSwgcHh5KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEdFTV9VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisJU0RMX1N1cmZhY2UgKnN1cmZhY2U7CisKKwlpZiAoR0VNX2xvY2tfcmVkcmF3KSB7CisJCXJldHVybjsKKwl9CisKKwlzdXJmYWNlID0gdGhpcy0+c2NyZWVuOworCisJaWYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pIHsKKwkJR0VNX1VwZGF0ZVJlY3RzRnVsbHNjcmVlbih0aGlzLCBudW1yZWN0cywgcmVjdHMpOworCX0gZWxzZSB7CisJCUdFTV9VcGRhdGVSZWN0c1dpbmRvd2VkKHRoaXMsIG51bXJlY3RzLCByZWN0cyk7CisJfQorfQorCitzdGF0aWMgaW50IEdFTV9GbGlwSFdTdXJmYWNlRnVsbHNjcmVlbihfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaW50IHN1cmZfd2lkdGg7CisKKwkvKiBOZWVkIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYgcGl4ZWxzICovCisJc3VyZl93aWR0aD1zdXJmYWNlLT53OworCWlmICgoc3VyZl93aWR0aCAmIDE1KSAhPSAwKSB7CisJCXN1cmZfd2lkdGggPSAoc3VyZl93aWR0aCB8IDE1KSArIDE7CisJfQorCisJaWYgKEdFTV9idWZvcHMgJiAoQjJTX0MyUF8xVE8yfEIyU19DMlBfMVRPUykpIHsKKwkJdm9pZCAqZGVzdHNjcjsKKwkJaW50IGRlc3RwaXRjaDsKKworCQlpZiAoR0VNX2J1Zm9wcyAmIEIyU19DMlBfMVRPUykgeworCQkJZGVzdHNjciA9IFZESV9zY3JlZW47CisJCQlkZXN0cGl0Y2ggPSBWRElfcGl0Y2g7CisJCX0gZWxzZSB7CisJCQlkZXN0c2NyID0gR0VNX2J1ZmZlcjI7CisJCQlkZXN0cGl0Y2ggPSBzdXJmYWNlLT5waXRjaDsKKwkJfQorCisJCVNETF9BdGFyaV9DMnBDb252ZXJ0KAorCQkJc3VyZmFjZS0+cGl4ZWxzLCBkZXN0c2NyLAorCQkJc3VyZl93aWR0aCwgc3VyZmFjZS0+aCwKKwkJCVNETF9GQUxTRSwKKwkJCXN1cmZhY2UtPnBpdGNoLCBkZXN0cGl0Y2gKKwkJKTsKKwl9CisKKwlpZiAoR0VNX2J1Zm9wcyAmIChCMlNfVlJPQ1BZRk1fMVRPU3xCMlNfVlJPQ1BZRk1fMlRPUykpIHsKKwkJTUZEQiBtZmRiX3NyYzsKKwkJc2hvcnQgYmxpdGNvb3Jkc1s4XTsKKworCQltZmRiX3NyYy5mZF93PXN1cmZfd2lkdGg7CisJCW1mZGJfc3JjLmZkX2g9c3VyZmFjZS0+aDsKKwkJbWZkYl9zcmMuZmRfd2R3aWR0aD1tZmRiX3NyYy5mZF93ID4+IDQ7CisJCW1mZGJfc3JjLmZkX25wbGFuZXM9c3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisJCW1mZGJfc3JjLmZkX3N0YW5kPQorCQkJbWZkYl9zcmMuZmRfcjE9CisJCQltZmRiX3NyYy5mZF9yMj0KKwkJCW1mZGJfc3JjLmZkX3IzPSAwOworCQlpZiAoR0VNX2J1Zm9wcyAmIEIyU19WUk9DUFlGTV8xVE9TKSB7CisJCQltZmRiX3NyYy5mZF9hZGRyPXN1cmZhY2UtPnBpeGVsczsKKwkJfSBlbHNlIHsKKwkJCW1mZGJfc3JjLmZkX2FkZHI9R0VNX2J1ZmZlcjI7CisJCX0KKworCQlibGl0Y29vcmRzWzBdID0gYmxpdGNvb3Jkc1s0XSA9IDA7CisJCWJsaXRjb29yZHNbMV0gPSBibGl0Y29vcmRzWzVdID0gMDsKKwkJYmxpdGNvb3Jkc1syXSA9IGJsaXRjb29yZHNbNl0gPSBzdXJmYWNlLT53IC0gMTsKKwkJYmxpdGNvb3Jkc1szXSA9IGJsaXRjb29yZHNbN10gPSBzdXJmYWNlLT5oIC0gMTsKKworCQl2cm9fY3B5Zm0oVkRJX2hhbmRsZSwgU19PTkxZLCBibGl0Y29vcmRzLCAmbWZkYl9zcmMsICZWRElfZHN0X21mZGIpOworCX0KKworCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBHRU1fRmxpcEhXU3VyZmFjZVdpbmRvd2VkKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlzaG9ydAlweHlbOF07CisKKwkvKiBVcGRhdGUgdGhlIHdob2xlIHdpbmRvdyAqLworCXdpbmRfZ2V0KEdFTV9oYW5kbGUsIFdGX1dPUktYWVdILCAmcHh5WzBdLCAmcHh5WzFdLCAmcHh5WzJdLCAmcHh5WzNdKTsKKworCUdFTV93aW5kX3JlZHJhdyh0aGlzLCBHRU1faGFuZGxlLCBweHkpOworCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IEdFTV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlpZiAoR0VNX2xvY2tfcmVkcmF3KSB7CisJCXJldHVybigwKTsKKwl9CisKKwlpZiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgeworCQlyZXR1cm4gR0VNX0ZsaXBIV1N1cmZhY2VGdWxsc2NyZWVuKHRoaXMsIHN1cmZhY2UpOworCX0gZWxzZSB7CisJCXJldHVybiBHRU1fRmxpcEhXU3VyZmFjZVdpbmRvd2VkKHRoaXMsIHN1cmZhY2UpOworCX0KK30KKworc3RhdGljIGludCBHRU1fU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworCWludCBpOworCVNETF9TdXJmYWNlICpzdXJmYWNlOworCisjaWZkZWYgREVCVUdfVklERU9fR0VNCisJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiBzZXRjb2xvcnMoKVxuIik7CisjZW5kaWYKKworCS8qIERvIG5vdCBjaGFuZ2UgcGFsZXR0ZSBpbiBUcnVlIENvbG91ciAqLworCXN1cmZhY2UgPSB0aGlzLT5zY3JlZW47CisJaWYgKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsID4gOCkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspCisJeworCQlpbnQJCXIsIGcsIGI7CisJCXNob3J0CXJnYlszXTsKKworCQlyID0gY29sb3JzW2ldLnI7CisJCWcgPSBjb2xvcnNbaV0uZzsKKwkJYiA9IGNvbG9yc1tpXS5iOworCisJCXJnYlswXSA9IFZESV9jdXJwYWxldHRlW2ldWzBdID0gKDEwMDAgKiByKSAvIDI1NTsKKwkJcmdiWzFdID0gVkRJX2N1cnBhbGV0dGVbaV1bMV0gPSgxMDAwICogZykgLyAyNTU7CisJCXJnYlsyXSA9IFZESV9jdXJwYWxldHRlW2ldWzJdID0oMTAwMCAqIGIpIC8gMjU1OworCisJCXZzX2NvbG9yKFZESV9oYW5kbGUsIHZkaV9pbmRleFtmaXJzdGNvbG9yK2ldLCByZ2IpOworCX0KKworCXJldHVybigxKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgR0VNX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBvbikKK3sKKwlpZiAob24pIHsKKwkJR0VNX0xvY2tTY3JlZW4odGhpcyk7CisJfSBlbHNlIHsKKwkJR0VNX1VubG9ja1NjcmVlbih0aGlzKTsKKwl9CisKKwlyZXR1cm4oMSk7Cit9CisjZW5kaWYKKworLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCisgICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCisqLwordm9pZCBHRU1fVmlkZW9RdWl0KF9USElTKQoreworCVNETF9BdGFyaVhiaW9zX1Jlc3RvcmVWZWN0b3JzKCk7CisJaWYgKEdFTV91c2VkZXZtb3VzZSkgeworCQlTRExfQXRhcmlEZXZNb3VzZV9DbG9zZSgpOworCX0KKworCUdFTV9GcmVlQnVmZmVycyh0aGlzKTsKKworI2lmIFNETF9WSURFT19PUEVOR0wKKwlpZiAoZ2xfYWN0aXZlKSB7CisJCVNETF9BdGFyaUdMX1F1aXQodGhpcywgU0RMX1RSVUUpOworCX0KKyNlbmRpZgorCisJLyogRGVzdHJveSB3aW5kb3cgKi8KKwlpZiAoR0VNX2hhbmRsZT49MCkgeworCQl3aW5kX2Nsb3NlKEdFTV9oYW5kbGUpOworCQl3aW5kX2RlbGV0ZShHRU1faGFuZGxlKTsKKwkJR0VNX2hhbmRsZT0tMTsKKwl9CisKKwlHRU1fVW5sb2NrU2NyZWVuKHRoaXMpOworCWlmIChHRU1fbWVudWJhcikgeworCQlNZnJlZShHRU1fbWVudWJhcik7CisJCUdFTV9tZW51YmFyPU5VTEw7CisJfQorCisJYXBwbF9leGl0KCk7CisKKwlHRU1fU2V0TmV3UGFsZXR0ZSh0aGlzLCBWRElfb2xkcGFsZXR0ZSk7CisKKwkvKiBDbG9zZSBWREkgd29ya3N0YXRpb24gKi8KKwlpZiAoVkRJX2hhbmRsZSkgeworCQl2X2Nsc3Z3ayhWRElfaGFuZGxlKTsKKwl9CisKKwkvKiBGcmVlIG1vZGUgbGlzdCAqLworCWlmIChTRExfbW9kZWxpc3RbMF0pIHsKKwkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0WzBdKTsKKwkJU0RMX21vZGVsaXN0WzBdPU5VTEw7CisJfQorCisJdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOwkKK30KKwordm9pZCBHRU1fd2luZF9yZWRyYXcoX1RISVMsIGludCB3aW5oYW5kbGUsIHNob3J0ICppbnNpZGUpCit7CisJc2hvcnQgdG9kb1s0XTsKKworCS8qIFRlbGwgQUVTIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgKi8KKwl3aW5kX3VwZGF0ZShCRUdfVVBEQVRFKTsKKworCXZfaGlkZV9jKFZESV9oYW5kbGUpOworCisJLyogQnJvd3NlIHRoZSByZWN0YW5nbGUgbGlzdCB0byByZWRyYXcgKi8KKwlpZiAod2luZF9nZXQod2luaGFuZGxlLCBXRl9GSVJTVFhZV0gsICZ0b2RvWzBdLCAmdG9kb1sxXSwgJnRvZG9bMl0sICZ0b2RvWzNdKSE9MCkgeworCisJCXdoaWxlICh0b2RvWzJdICYmIHRvZG9bM10pIHsKKworCQkJaWYgKHJjX2ludGVyc2VjdCgoR1JFQ1QgKilpbnNpZGUsKEdSRUNUICopdG9kbykpIHsKKwkJCQl0b2RvWzJdICs9IHRvZG9bMF0tMTsKKwkJCQl0b2RvWzNdICs9IHRvZG9bMV0tMTsKKwkJCQlyZWZyZXNoX3dpbmRvdyh0aGlzLCB3aW5oYW5kbGUsIHRvZG8pOworCQkJfQorCisJCQlpZiAod2luZF9nZXQod2luaGFuZGxlLCBXRl9ORVhUWFlXSCwgJnRvZG9bMF0sICZ0b2RvWzFdLCAmdG9kb1syXSwgJnRvZG9bM10pPT0wKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCX0KKworCS8qIFVwZGF0ZSBmaW5pc2hlZCAqLworCXdpbmRfdXBkYXRlKEVORF9VUERBVEUpOworCisJdl9zaG93X2MoVkRJX2hhbmRsZSwxKTsKK30KKworc3RhdGljIHZvaWQgcmVmcmVzaF93aW5kb3coX1RISVMsIGludCB3aW5oYW5kbGUsIHNob3J0ICpyZWN0KQoreworCU1GREIgbWZkYl9zcmM7CisJc2hvcnQgcHh5WzhdLHdpbmRfcHh5WzhdOworCVNETF9TdXJmYWNlICpzdXJmYWNlOworCWludCBpY29uaWZpZWQ7CisKKwkvKiBJcyB3aW5kb3cgaWNvbmlmaWVkID8gKi8KKwlpY29uaWZpZWQgPSAwOworLyoJaWYgKEdFTV93ZmVhdHVyZXMgJiAoMTw8V0ZfSUNPTklGWSkpKi8geworCQlpZiAod2luZF9nZXQod2luaGFuZGxlLCBXRl9JQ09OSUZZLCAmd2luZF9weHlbMF0sICZ3aW5kX3B4eVsxXSwgJndpbmRfcHh5WzJdLCAmd2luZF9weHlbM10pIT0wKSB7CisJCQlpY29uaWZpZWQgPSB3aW5kX3B4eVswXTsKKwkJfQorCX0KKworCWlmICh3aW5kX2dldCh3aW5oYW5kbGUsIFdGX1dPUktYWVdILCAmd2luZF9weHlbMF0sICZ3aW5kX3B4eVsxXSwgJndpbmRfcHh5WzJdLCAmd2luZF9weHlbM10pPT0wKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaWNvbmlmaWVkICYmIEdFTV9pY29uKSB7CisJCXNob3J0IGljb25fcmVjdFs0XSwgZHN0X3JlY3RbNF07CisJCXNob3J0IGljb254LGljb255OworCQkKKwkJc3VyZmFjZSA9IEdFTV9pY29uOworCisJCUdFTV9DbGVhclJlY3QodGhpcywgcmVjdCk7CisKKwkJLyogQ2FsY3VsYXRlIGNlbnRlcmVkIGljb24oeCx5LHcsaCkgcmVsYXRpdmUgdG8gd2luZG93ICovCisJCWljb254ID0gKHdpbmRfcHh5WzJdLXN1cmZhY2UtPncpPj4xOworCQlpY29ueSA9ICh3aW5kX3B4eVszXS1zdXJmYWNlLT5oKT4+MTsKKworCQlpY29uX3JlY3RbMF0gPSBpY29ueDsKKwkJaWNvbl9yZWN0WzFdID0gaWNvbnk7CisJCWljb25fcmVjdFsyXSA9IHN1cmZhY2UtPnc7CisJCWljb25fcmVjdFszXSA9IHN1cmZhY2UtPmg7CisKKwkJLyogQ2FsY3VsYXRlIHJlZHJhdyByZWN0YW5nbGUoeCx5LHcsaCkgcmVsYXRpdmUgdG8gd2luZG93ICovCisJCWRzdF9yZWN0WzBdID0gcmVjdFswXS13aW5kX3B4eVswXTsKKwkJZHN0X3JlY3RbMV0gPSByZWN0WzFdLXdpbmRfcHh5WzFdOworCQlkc3RfcmVjdFsyXSA9IHJlY3RbMl0tcmVjdFswXSsxOworCQlkc3RfcmVjdFszXSA9IHJlY3RbM10tcmVjdFsxXSsxOworCisJCS8qIERvZXMgdGhlIGljb24gcmVjdGFuZ2xlIG11c3QgYmUgcmVkcmF3biA/ICovCisJCWlmICghcmNfaW50ZXJzZWN0KChHUkVDVCAqKWljb25fcmVjdCwgKEdSRUNUICopZHN0X3JlY3QpKSB7CisJCQlyZXR1cm47CisJCX0KKworI2lmIERFQlVHX1ZJREVPX0dFTQorCQlwcmludGYoInNkbDp2aWRlbzpnZW06ICBjbGlwKDAsMCwlZCwlZCkgdG8gKCVkLCVkLCVkLCVkKVxuIiwKKwkJCXN1cmZhY2UtPnctMSxzdXJmYWNlLT5oLTEsIGRzdF9yZWN0WzBdLGRzdF9yZWN0WzFdLGRzdF9yZWN0WzJdLGRzdF9yZWN0WzNdKTsKKwkJcHJpbnRmKCJzZGw6dmlkZW86Z2VtOiAgaWNvbiglZCwlZCwlZCwlZClcbiIsCisJCQlpY29uX3JlY3RbMF0sIGljb25fcmVjdFsxXSwgaWNvbl9yZWN0WzJdLCBpY29uX3JlY3RbM10pOworCQlwcmludGYoInNkbDp2aWRlbzpnZW06IHJlZnJlc2hfd2luZG93KCk6IGRyYXcgaWNvblxuIik7CisjZW5kaWYKKworCQkvKiBDYWxjdWxhdGUgaWNvbih4MSx5MSx4Mix5MikgcmVsYXRpdmUgdG8gc2NyZWVuICovCisJCWljb25fcmVjdFswXSArPSB3aW5kX3B4eVswXTsKKwkJaWNvbl9yZWN0WzFdICs9IHdpbmRfcHh5WzFdOworCQlpY29uX3JlY3RbMl0gKz0gaWNvbl9yZWN0WzBdLTE7CisJCWljb25fcmVjdFszXSArPSBpY29uX3JlY3RbMV0tMTsKKworCQkvKiBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uIHJlY3RhbmdsZSB0byByZWRyYXcgKi8KKwkJcHh5WzRdPXB4eVswXT1NQVgoaWNvbl9yZWN0WzBdLHJlY3RbMF0pOworCQlweHlbNV09cHh5WzFdPU1BWChpY29uX3JlY3RbMV0scmVjdFsxXSk7CisgCQlweHlbNl09cHh5WzJdPU1JTihpY29uX3JlY3RbMl0scmVjdFsyXSk7CisJIAlweHlbN109cHh5WzNdPU1JTihpY29uX3JlY3RbM10scmVjdFszXSk7CisKKwkJLyogQ2FsY3VsYXRlIGljb24gc291cmNlIGltYWdlIHBvcyByZWxhdGl2ZSB0byB3aW5kb3cgKi8KKwkJcHh5WzBdIC09IHdpbmRfcHh5WzBdK2ljb254OworCQlweHlbMV0gLT0gd2luZF9weHlbMV0raWNvbnk7CisJCXB4eVsyXSAtPSB3aW5kX3B4eVswXStpY29ueDsKKwkJcHh5WzNdIC09IHdpbmRfcHh5WzFdK2ljb255OworCisJfSBlbHNlIHsKKwkJc3VyZmFjZSA9IHRoaXMtPnNjcmVlbjsKKworI2lmIERFQlVHX1ZJREVPX0dFTQorCQlwcmludGYoInNkbDp2aWRlbzpnZW06IHJlZnJlc2hfd2luZG93KCk6IGRyYXcgZnJhbWUgYnVmZmVyXG4iKTsKKyNlbmRpZgorCisJCS8qIFJlZHJhdyBhbGwgd2luZG93IGNvbnRlbnQgKi8KKwkJcHh5WzBdID0gcmVjdFswXS13aW5kX3B4eVswXTsKKwkJcHh5WzFdID0gcmVjdFsxXS13aW5kX3B4eVsxXTsKKwkgCXB4eVsyXSA9IHJlY3RbMl0td2luZF9weHlbMF07ICAgCisJIAlweHlbM10gPSByZWN0WzNdLXdpbmRfcHh5WzFdOyAgCisKKwkJcHh5WzRdID0gcmVjdFswXTsKKwkJcHh5WzVdID0gcmVjdFsxXTsKKwkJcHh5WzZdID0gcmVjdFsyXTsgIAorCQlweHlbN10gPSByZWN0WzNdOworCX0KKworCWlmIChHRU1fYnVmb3BzICYgQjJTX0MyUF8xVE8yKSB7CisJCXZvaWQgKnNyYywgKmRlc3Q7CisJCWludCB4MSx4MjsKKworCQl4MSA9IChyZWN0WzBdLXdpbmRfcHh5WzBdKSAmIH4xNTsKKwkJeDIgPSByZWN0WzJdLXdpbmRfcHh5WzBdOworCQlpZiAoeDIgJiAxNSkgeworCQkJeDIgPSAoeDIgfCAxNSkgKzE7CisJCX0KKworCQlzcmMgPSBzdXJmYWNlLT5waXhlbHM7CisJCXNyYyArPSBzdXJmYWNlLT5waXRjaCAqIChyZWN0WzFdLXdpbmRfcHh5WzFdKTsKKwkJc3JjICs9IHgxOworCisJCWRlc3QgPSBHRU1fYnVmZmVyMjsKKwkJZGVzdCArPSBzdXJmYWNlLT5waXRjaCAqIChyZWN0WzFdLXdpbmRfcHh5WzFdKTsKKwkJZGVzdCArPSB4MTsKKworCQlTRExfQXRhcmlfQzJwQ29udmVydCgKKwkJCXNyYywgZGVzdCwKKwkJCXgyLXgxLCByZWN0WzNdLXJlY3RbMV0rMSwKKwkJCVNETF9GQUxTRSwKKwkJCXN1cmZhY2UtPnBpdGNoLCBzdXJmYWNlLT5waXRjaAorCQkpOworCX0KKworCW1mZGJfc3JjLmZkX2FkZHI9c3VyZmFjZS0+cGl4ZWxzOworCXsKKwkJaW50IHdpZHRoOworCisJCS8qIE5lZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNiBwaXhlbHMgKi8KKwkJd2lkdGg9c3VyZmFjZS0+dzsKKwkJaWYgKCh3aWR0aCAmIDE1KSAhPSAwKSB7CisJCQl3aWR0aCA9ICh3aWR0aCB8IDE1KSArIDE7CisJCX0KKwkJbWZkYl9zcmMuZmRfdz13aWR0aDsKKwl9CisJbWZkYl9zcmMuZmRfaD1zdXJmYWNlLT5oOworICAJbWZkYl9zcmMuZmRfbnBsYW5lcz1zdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKKwltZmRiX3NyYy5mZF93ZHdpZHRoPW1mZGJfc3JjLmZkX3c+PjQ7CisJbWZkYl9zcmMuZmRfc3RhbmQ9CisJCW1mZGJfc3JjLmZkX3IxPQorICAJCW1mZGJfc3JjLmZkX3IyPQorCSAgCW1mZGJfc3JjLmZkX3IzPSAwOworCisJaWYgKEdFTV9idWZvcHMgJiBCMlNfVlJPQ1BZRk1fMlRPUykgeworCQltZmRiX3NyYy5mZF9hZGRyPUdFTV9idWZmZXIyOworCX0KKworI2lmIERFQlVHX1ZJREVPX0dFTQorCXByaW50Zigic2RsOnZpZGVvOmdlbTogcmVkcmF3ICVkeCVkOiAoJWQsJWQsJWQsJWQpIHRvICglZCwlZCwlZCwlZClcbiIsCisJCXN1cmZhY2UtPncsIHN1cmZhY2UtPmgsCisJCXB4eVswXSxweHlbMV0scHh5WzJdLHB4eVszXSwKKwkJcHh5WzRdLHB4eVs1XSxweHlbNl0scHh5WzddCisJKTsKKyNlbmRpZgorCisJdnJvX2NweWZtKCBWRElfaGFuZGxlLCBTX09OTFksIHB4eSwgJm1mZGJfc3JjLCAmVkRJX2RzdF9tZmRiKTsKK30KKworI2lmIFNETF9WSURFT19PUEVOR0wKKworc3RhdGljIHZvaWQgR0VNX0dMX1N3YXBCdWZmZXJzKF9USElTKQoreworCVNETF9BdGFyaUdMX1N3YXBCdWZmZXJzKHRoaXMpOworCUdFTV9GbGlwSFdTdXJmYWNlKHRoaXMsIHRoaXMtPnNjcmVlbik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZW0vU0RMX2dlbXZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dlbS9TRExfZ2VtdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2ExOTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZW0vU0RMX2dlbXZpZGVvLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfZ2VtdmlkZW9faAorI2RlZmluZSBfU0RMX2dlbXZpZGVvX2gKKworI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK3N0cnVjdCBXTWN1cnNvciB7CisJTUZPUk0gKm1mb3JtX3A7Cit9OworCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKKy8qIEZ1bmN0aW9ucyBwcm90b3R5cGVzICovCit2b2lkIEdFTV93aW5kX3JlZHJhdyhfVEhJUywgaW50IHdpbmhhbmRsZSwgc2hvcnQgKmluc2lkZSk7CisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCisKKyNkZWZpbmUgQjJTX0MyUF8xVE8yCQkoMTw8MCkJLyogQzJQIGNvbnZlcnQgYnVmZmVyIDEgdG8gYnVmZmVyIDIgKi8KKyNkZWZpbmUgQjJTX0MyUF8xVE9TCQkoMTw8MSkJLyogQzJQIGNvbnZlcnQgYnVmZmVyIDEgdG8gc2NyZWVuICovCisjZGVmaW5lIEIyU19WUk9DUFlGTV8xVE9TCSgxPDwyKQkvKiB2cm9fY3B5Zm0oKSBidWZmZXIgMSB0byBzY3JlZW4gKi8KKyNkZWZpbmUgQjJTX1ZST0NQWUZNXzJUT1MJKDE8PDMpCS8qIHZyb19jcHlmbSgpIGJ1ZmZlciAyIHRvIHNjcmVlbiAqLworCisjZGVmaW5lIFNETF9OVU1NT0RFUwkxCQkvKiBGdWxsc2NyZWVuICovCisKK3N0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7CisJVWludDE2CWJ1ZjJzY3Jfb3BzOwkJLyogT3BlcmF0aW9ucyB0byBnZXQgYnVmZmVyIHRvIHNjcmVlbiAqLworCXZvaWQgKmJ1ZmZlcjE7CQkJCS8qIE91ciBzaGFkb3cgYnVmZmVycyAqLworCXZvaWQgKmJ1ZmZlcjI7CisKKwkvKiBWREkgaW5mb3MgKi8KKwlzaG9ydCB2ZGlfaGFuZGxlOwkJCS8qIFZESSBoYW5kbGUgKi8KKwlzaG9ydCBmdWxsX3csIGZ1bGxfaDsJCS8qIEZ1bGxzY3JlZW4gc2l6ZSAqLworCXNob3J0IGJwcDsJCQkJCS8qIENvbG91ciBkZXB0aCAqLworCXNob3J0IHBpeGVsc2l6ZTsJCQkvKiBCeXRlcyBwZXIgcGl4ZWwgKi8KKwlzaG9ydCBvbGRfbnVtY29sb3JzOwkJLyogTnVtYmVyIG9mIGNvbG9ycyBpbiBzYXZlZCBwYWxldHRlICovCisJVWludDE2IHBpdGNoOwkJCQkvKiBMaW5lIGxlbmd0aCAqLworCVVpbnQxNiBmb3JtYXQ7CQkJCS8qIFNjcmVlbiBmb3JtYXQgKi8KKwl2b2lkICpzY3JlZW47CQkJCS8qIFNjcmVlbiBhZGRyZXNzICovCisJVWludDMyIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwkvKiBTY3JlZW4gY29tcG9uZW50cyAqLworCVVpbnQzMiBzY3JlZW5zaXplOworCXNob3J0CWJsaXRfY29vcmRzWzhdOwkJLyogQ29vcmRpbmF0ZXMgZm9yIGJpdGJsdCAqLworCU1GREIJc3JjX21mZGIsIGRzdF9tZmRiOwkvKiBWREkgTUZEQiBmb3IgYml0Ymx0ICovCisJVWludDE2IG9sZF9wYWxldHRlWzI1Nl1bM107CS8qIFNhdmVkIGN1cnJlbnQgcGFsZXR0ZSAqLworCVVpbnQxNiBjdXJfcGFsZXR0ZVsyNTZdWzNdOwkvKiBTREwgYXBwbGljYXRpb24gcGFsZXR0ZSAqLworCQkJCQkJCQkvKiBGdW5jdGlvbiB0byBzZXQvcmVzdG9yZSBwYWxldHRlICovCisJdm9pZCAoKnNldHBhbGV0dGUpKF9USElTLCBVaW50MTYgbmV3cGFsWzI1Nl1bM10pOworCisJLyogR0VNIGluZm9zICovCisJc2hvcnQgZGVza194LCBkZXNrX3k7CQkvKiBEZXNrdG9wIHByb3BlcnRpZXMgKi8KKwlzaG9ydCBkZXNrX3csIGRlc2tfaDsKKwlzaG9ydCB3aW5faGFuZGxlOwkJCS8qIE91ciB3aW5kb3cgaGFuZGxlICovCisJaW50IHdpbmRvd190eXBlOwkJCS8qIFdpbmRvdyB0eXBlICovCisJY29uc3QgY2hhciAqdGl0bGVfbmFtZTsJCS8qIFdpbmRvdyB0aXRsZSAqLworCWNvbnN0IGNoYXIgKmljb25fbmFtZTsJCS8qIEljb24gdGl0bGUgKi8KKwlzaG9ydCB2ZXJzaW9uOwkJCQkvKiBBRVMgdmVyc2lvbiAqLworCXNob3J0IHdmZWF0dXJlczsJCQkvKiBBRVMgd2luZG93IGZlYXR1cmVzICovCisJU0RMX2Jvb2wgcmVmcmVzaF9uYW1lOwkJLyogQ2hhbmdlIHdpbmRvdyB0aXRsZSA/ICovCisJU0RMX2Jvb2wgd2luZG93X2Z1bGxlZDsJCS8qIFdpbmRvdyBtYXhpbWl6ZWQgPyAqLworCVNETF9ib29sIG1vdXNlX3JlbGF0aXZlOwkvKiBSZXBvcnQgcmVsYXRpdmUgbW91c2UgbW92ZW1lbnQgKi8KKwlTRExfYm9vbCBsb2NrZWQ7CQkJLyogQUVTIGxvY2tlZCBmb3IgZnVsbHNjcmVlbiA/ICovCisJU0RMX2Jvb2wgbG9ja19yZWRyYXc7CQkvKiBQcmV2ZW50IHJlZHJhdyB0aWxsIGJ1ZmZlcnMgYXJlIHNldHVwICovCisJc2hvcnQgbWVzc2FnZVs4XTsJCQkvKiBUbyBzZWxmLXNlbmQgYW4gQUVTIG1lc3NhZ2UgKi8KKwl2b2lkICptZW51YmFyOwkJCQkvKiBNZW51IGJhciBzYXZlIGJ1ZmZlciB3aGVuIGdvaW5nIGZ1bGxzY3JlZW4gKi8KKwlTRExfYm9vbCB1c2VfZGV2X21vdXNlOwkJLyogVXNlIC9kZXYvbW91c2UgPyAqLworCVdNY3Vyc29yICpjdXJzb3I7CQkJLyogVG8gcmVzdG9yZSBjdXJzb3Igd2hlbiBsZWF2aW5nL2VudGVyaW5nIHdpbmRvdyAqLworCisJU0RMX2Jvb2wgZnVsbHNjcmVlbjsJCS8qIEZ1bGxzY3JlZW4gb3Igd2luZG93ZWQgbW9kZSA/ICovCisJU0RMX1JlY3QgKlNETF9tb2RlbGlzdFtTRExfTlVNTU9ERVMrMV07CS8qIE1vZGUgbGlzdCAqLworCVNETF9TdXJmYWNlICppY29uOwkJCS8qIFRoZSBpY29uICovCit9OworCisvKiBIaWRkZW4gc3RydWN0dXJlIC0+IHZhcmlhYmxlcyBuYW1lcyAqLworI2RlZmluZSBWRElfaGFuZGxlCQkJKHRoaXMtPmhpZGRlbi0+dmRpX2hhbmRsZSkKKyNkZWZpbmUgVkRJX3cJCQkJKHRoaXMtPmhpZGRlbi0+ZnVsbF93KQorI2RlZmluZSBWRElfaAkJCQkodGhpcy0+aGlkZGVuLT5mdWxsX2gpCisjZGVmaW5lIFZESV9icHAJCQkJKHRoaXMtPmhpZGRlbi0+YnBwKQorI2RlZmluZSBWRElfcGl4ZWxzaXplCQkodGhpcy0+aGlkZGVuLT5waXhlbHNpemUpCisjZGVmaW5lIFZESV9vbGRudW1jb2xvcnMJKHRoaXMtPmhpZGRlbi0+b2xkX251bWNvbG9ycykKKyNkZWZpbmUgVkRJX29sZHBhbGV0dGUJCSh0aGlzLT5oaWRkZW4tPm9sZF9wYWxldHRlKQorI2RlZmluZSBWRElfY3VycGFsZXR0ZQkJKHRoaXMtPmhpZGRlbi0+Y3VyX3BhbGV0dGUpCisjZGVmaW5lIFZESV9zZXRwYWxldHRlCQkodGhpcy0+aGlkZGVuLT5zZXRwYWxldHRlKQorI2RlZmluZSBWRElfcGl0Y2gJCQkodGhpcy0+aGlkZGVuLT5waXRjaCkKKyNkZWZpbmUgVkRJX2Zvcm1hdAkJCSh0aGlzLT5oaWRkZW4tPmZvcm1hdCkKKyNkZWZpbmUgVkRJX3NjcmVlbgkJCSh0aGlzLT5oaWRkZW4tPnNjcmVlbikKKyNkZWZpbmUgVkRJX3JlZG1hc2sJCQkodGhpcy0+aGlkZGVuLT5yZWQpCisjZGVmaW5lIFZESV9ncmVlbm1hc2sJCSh0aGlzLT5oaWRkZW4tPmdyZWVuKQorI2RlZmluZSBWRElfYmx1ZW1hc2sJCSh0aGlzLT5oaWRkZW4tPmJsdWUpCisjZGVmaW5lIFZESV9hbHBoYW1hc2sJCSh0aGlzLT5oaWRkZW4tPmFscGhhKQorI2RlZmluZSBWRElfc2NyZWVuc2l6ZQkJKHRoaXMtPmhpZGRlbi0+c2NyZWVuc2l6ZSkKKyNkZWZpbmUgVkRJX3NyY19tZmRiCQkodGhpcy0+aGlkZGVuLT5zcmNfbWZkYikKKyNkZWZpbmUgVkRJX2RzdF9tZmRiCQkodGhpcy0+aGlkZGVuLT5kc3RfbWZkYikKKyNkZWZpbmUgVkRJX2JsaXRfY29vcmRzCQkodGhpcy0+aGlkZGVuLT5ibGl0X2Nvb3JkcykKKworI2RlZmluZSBHRU1fZGVza194CQkJKHRoaXMtPmhpZGRlbi0+ZGVza194KQorI2RlZmluZSBHRU1fZGVza195CQkJKHRoaXMtPmhpZGRlbi0+ZGVza195KQorI2RlZmluZSBHRU1fZGVza193CQkJKHRoaXMtPmhpZGRlbi0+ZGVza193KQorI2RlZmluZSBHRU1fZGVza19oCQkJKHRoaXMtPmhpZGRlbi0+ZGVza19oKQorI2RlZmluZSBHRU1faGFuZGxlCQkJKHRoaXMtPmhpZGRlbi0+d2luX2hhbmRsZSkKKyNkZWZpbmUgR0VNX3dpbl90eXBlCQkodGhpcy0+aGlkZGVuLT53aW5kb3dfdHlwZSkKKyNkZWZpbmUgR0VNX3RpdGxlX25hbWUJCSh0aGlzLT5oaWRkZW4tPnRpdGxlX25hbWUpCisjZGVmaW5lIEdFTV9pY29uX25hbWUJCSh0aGlzLT5oaWRkZW4tPmljb25fbmFtZSkKKyNkZWZpbmUgR0VNX3JlZnJlc2hfbmFtZQkodGhpcy0+aGlkZGVuLT5yZWZyZXNoX25hbWUpCisjZGVmaW5lIEdFTV92ZXJzaW9uCQkJKHRoaXMtPmhpZGRlbi0+dmVyc2lvbikKKyNkZWZpbmUgR0VNX3dmZWF0dXJlcwkJKHRoaXMtPmhpZGRlbi0+d2ZlYXR1cmVzKQorI2RlZmluZSBHRU1fd2luX2Z1bGxlZAkJKHRoaXMtPmhpZGRlbi0+d2luZG93X2Z1bGxlZCkKKyNkZWZpbmUgR0VNX21vdXNlX3JlbGF0aXZlCSh0aGlzLT5oaWRkZW4tPm1vdXNlX3JlbGF0aXZlKQorI2RlZmluZSBHRU1fbG9ja2VkCQkJKHRoaXMtPmhpZGRlbi0+bG9ja2VkKQorI2RlZmluZSBHRU1fbG9ja19yZWRyYXcJCSh0aGlzLT5oaWRkZW4tPmxvY2tfcmVkcmF3KQorI2RlZmluZSBHRU1fbWVzc2FnZQkJCSh0aGlzLT5oaWRkZW4tPm1lc3NhZ2UpCisjZGVmaW5lIFNETF9tb2RlbGlzdAkJKHRoaXMtPmhpZGRlbi0+U0RMX21vZGVsaXN0KQorI2RlZmluZSBHRU1faWNvbgkJCSh0aGlzLT5oaWRkZW4tPmljb24pCisjZGVmaW5lIEdFTV9mdWxsc2NyZWVuCQkodGhpcy0+aGlkZGVuLT5mdWxsc2NyZWVuKQorI2RlZmluZSBHRU1fbWVudWJhcgkJCSh0aGlzLT5oaWRkZW4tPm1lbnViYXIpCisjZGVmaW5lIEdFTV91c2VkZXZtb3VzZQkJKHRoaXMtPmhpZGRlbi0+dXNlX2Rldl9tb3VzZSkKKyNkZWZpbmUgR0VNX2N1cnNvcgkJCSh0aGlzLT5oaWRkZW4tPmN1cnNvcikKKworI2RlZmluZSBHRU1fYnVmZmVyMQkJCSh0aGlzLT5oaWRkZW4tPmJ1ZmZlcjEpCisjZGVmaW5lIEdFTV9idWZmZXIyCQkJKHRoaXMtPmhpZGRlbi0+YnVmZmVyMikKKyNkZWZpbmUgR0VNX2J1Zm9wcwkJCSh0aGlzLT5oaWRkZW4tPmJ1ZjJzY3Jfb3BzKQorCisjZGVmaW5lIFZESV9GQk1BU0soYW1hc2ssIHJtYXNrLCBnbWFzaywgYm1hc2spIFwKKwlWRElfYWxwaGFtYXNrID0gKGFtYXNrKTsgXAorCVZESV9yZWRtYXNrID0gKHJtYXNrKTsgXAorCVZESV9ncmVlbm1hc2sgPSAoZ21hc2spOyBcCisJVkRJX2JsdWVtYXNrID0gKGJtYXNrKTsKKworLyoKKwlQb3NzaWJsZSBidWZmZXIgdG8gc2NyZWVuIG9wZXJhdGlvbnM6CisKKwlUQzogOCAoY2h1bmt5KSwxNSwxNiwyNCwzMiBicHAKKwk4STogOCBicHAgcGxhbmVzCisJRkI6IHNjcmVlbiBmcmFtZWJ1ZmZlciBhZGRyZXNzIGF2YWlsYWJsZQorCUZTOiBmdWxsc2NyZWVuCisKKwlUQywgRkIsIEZTOgorCQktIGRyYXcgdG8gc2NyZWVuCisJOEksIEZCLCBGUzoKKwkJLSBkcmF3IHRvIGJ1ZmZlciAxCisJCS0gQzJQIGZyb20gYnVmZmVyIDEgdG8gc2NyZWVuCisKKwlUQywgIUZCLCBGUzoKKwkJLSBkcmF3IHRvIGJ1ZmZlciAxCisJCS0gdnJvX2NweWZtKCkgZnJvbSBidWZmZXIgMSB0byBzY3JlZW4KKwk4SSwgIUZCLCBGUzoKKwkJLSBkcmF3IHRvIGJ1ZmZlciAxCisJCS0gQzJQIGZyb20gYnVmZmVyIDEgdG8gYnVmZmVyIDIKKwkJLSB2cm9fY3B5Zm0oKSBmcm9tIGJ1ZmZlciAyIHRvIHNjcmVlbgorCisJVEMsIEZCLCAhRlM6CisJCS0gZHJhdyB0byBidWZmZXIgMQorCQktIHZyb19jcHlmbSgpIGZyb20gYnVmZmVyIDEgdG8gc2NyZWVuCisJOEksIEZCLCAhRlM6CisJCS0gZHJhdyB0byBidWZmZXIgMQorCQktIEMyUCBmcm9tIGJ1ZmZlciAxIHRvIGJ1ZmZlciAyCisJCS0gdnJvX2NweWZtKCkgZnJvbSBidWZmZXIgMiB0byBzY3JlZW4KKworCVRDLCAhRkIsICFGUzoKKwkJLSBkcmF3IHRvIGJ1ZmZlciAxCisJCS0gdnJvX2NweWZtKCkgZnJvbSBidWZmZXIgMSB0byBzY3JlZW4KKwk4SSwgIUZCLCAhRlM6CisJCS0gZHJhdyB0byBidWZmZXIgMQorCQktIEMyUCBmcm9tIGJ1ZmZlciAxIHRvIGJ1ZmZlciAyCisJCS0gdnJvX2NweWZtKCkgZnJvbSBidWZmZXIgMiB0byBzY3JlZW4KKyovCisKKyNlbmRpZiAvKiBfU0RMX2dlbXZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2VtL1NETF9nZW13bS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZW0vU0RMX2dlbXdtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3NzZmZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2VtL1NETF9nZW13bS5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKwlHRU0gU0RMIHZpZGVvIGRyaXZlcgorCVdpbmRvdyBtYW5hZ2VyIGZ1bmN0aW9ucworCisJUGF0cmljZSBNYW5kaW4KKyovCisKKy8qIE1pbnQgaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxnZW0uaD4KKworI2luY2x1ZGUgIlNETF9nZW13bV9jLmgiCisKKy8qIERlZmluZXMgKi8KKworI2RlZmluZSBJQ09OV0lEVEggNjQKKyNkZWZpbmUgSUNPTkhFSUdIVCA2NAorCisvKiBGdW5jdGlvbnMgKi8KKwordm9pZCBHRU1fU2V0Q2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pCit7CisJaWYgKHRpdGxlKSB7CisJCUdFTV90aXRsZV9uYW1lID0gdGl0bGU7CisJCUdFTV9yZWZyZXNoX25hbWUgPSBTRExfVFJVRTsKKwl9CisKKwlpZiAoaWNvbikgeworCQlHRU1faWNvbl9uYW1lID0gaWNvbjsKKwkJR0VNX3JlZnJlc2hfbmFtZSA9IFNETF9UUlVFOworCX0KK30KKwordm9pZCBHRU1fU2V0SWNvbihfVEhJUywgU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKQoreworCVNETF9TdXJmYWNlICpzaWNvbjsKKwlTRExfUmVjdCBib3VuZHM7CisKKyNpZiAwCisJaWYgKChHRU1fd2ZlYXR1cmVzICYgKDE8PFdGX0lDT05JRlkpKT09MCkgeworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlpZiAoaWNvbiA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisJCisJLyogQ29udmVydCBpY29uIHRvIHRoZSBzY3JlZW4gZm9ybWF0ICovCisJc2ljb24gPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLCBpY29uLT53LCBpY29uLT5oLAorCQlWRElfYnBwLCBWRElfcmVkbWFzaywgVkRJX2dyZWVubWFzaywgVkRJX2JsdWVtYXNrLCAwKTsKKwlpZiAoIHNpY29uID09IE5VTEwgKSB7CisJCXJldHVybjsKKwl9CisKKwlib3VuZHMueCA9IDA7CisJYm91bmRzLnkgPSAwOworCWJvdW5kcy53ID0gaWNvbi0+dzsKKwlib3VuZHMuaCA9IGljb24tPmg7CisJaWYgKCBTRExfTG93ZXJCbGl0KGljb24sICZib3VuZHMsIHNpY29uLCAmYm91bmRzKSA8IDAgKSB7CisJCVNETF9GcmVlU3VyZmFjZShzaWNvbik7CisJCXJldHVybjsKKwl9CisKKwlHRU1faWNvbiA9IHNpY29uOworfQorCitpbnQgR0VNX0ljb25pZnlXaW5kb3coX1RISVMpCit7CisJaWYgKChHRU1fd2ZlYXR1cmVzICYgKDE8PFdGX0lDT05JRlkpKT09MCkKKwkJcmV0dXJuIDA7CisKKwlHRU1fbWVzc2FnZVswXSA9IFdNX0lDT05JRlk7CisJR0VNX21lc3NhZ2VbMV0gPSBnbF9hcGlkOworCUdFTV9tZXNzYWdlWzJdID0gMDsKKwlHRU1fbWVzc2FnZVszXSA9IEdFTV9oYW5kbGU7CisJR0VNX21lc3NhZ2VbNF0gPSAwOworCUdFTV9tZXNzYWdlWzVdID0gR0VNX2Rlc2tfaC1JQ09OSEVJR0hUOworCUdFTV9tZXNzYWdlWzZdID0gSUNPTldJRFRIOworCUdFTV9tZXNzYWdlWzddID0gSUNPTkhFSUdIVDsKKworCWFwcGxfd3JpdGUoZ2xfYXBpZCwgc2l6ZW9mKEdFTV9tZXNzYWdlKSwgR0VNX21lc3NhZ2UpOworCisJcmV0dXJuIDE7Cit9CisKK1NETF9HcmFiTW9kZSBHRU1fR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSkKK3sKKwlpZiAodGhpcy0+c2NyZWVuID09IE5VTEwpIHsKKwkJcmV0dXJuIFNETF9HUkFCX09GRjsKKwl9CisKKwlyZXR1cm4gbW9kZTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2VtL1NETF9nZW13bV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dlbS9TRExfZ2Vtd21fYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODI4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dlbS9TRExfZ2Vtd21fYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICoJR0VNIFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb24KKyAqCVdpbmRvdyBtYW5hZ2VyIGZ1bmN0aW9ucworICogCisgKglQYXRyaWNlIE1hbmRpbgorICovCisKKyNpbmNsdWRlICJTRExfZ2VtdmlkZW8uaCIKKworLyogRnVuY3Rpb25zIHByb3RvdHlwZXMgKi8KK2V4dGVybiB2b2lkIEdFTV9TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7CitleHRlcm4gdm9pZCBHRU1fU2V0SWNvbihfVEhJUywgU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKTsKK2V4dGVybiBpbnQgR0VNX0ljb25pZnlXaW5kb3coX1RISVMpOworZXh0ZXJuIFNETF9HcmFiTW9kZSBHRU1fR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2M2ZlMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2dpL1NETF9nZ2lldmVudHMuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEhhbmRsZSB0aGUgZXZlbnQgc3RyZWFtLCBjb252ZXJ0aW5nIEdHSSBldmVudHMgaW50byBTREwgZXZlbnRzICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorCisjaW5jbHVkZSA8Z2dpL2tleWJvYXJkLmg+CisKKyNpbmNsdWRlICJTRExfZ2dpa2V5cy5oIgorCisjaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX2dnaXZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2dnaWV2ZW50c19jLmgiCisKKy8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZXMgZnJvbSBhIEdHSSBrZXljb2RlIHRvIGEgU0RMIGtleXN5bSAqLworc3RhdGljIFNETEtleSBrZXltYXBbMTI4XTsKK3N0YXRpYyBTRExfa2V5c3ltICpHR0lfVHJhbnNsYXRlS2V5KGdnaV9ldmVudCAqZXYsIFNETF9rZXlzeW0gKmtleXN5bSk7CisKK3N0YXRpYyBpbnQgcG9zdGVkID0gMDsKKwordm9pZCBHR0lfUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlzdHJ1Y3QgdGltZXZhbCAqdHZwLCB0diA9IHsgMCwgMCB9OworCWdnaV9ldmVudCBldjsKKworCXR2cCA9ICZ0djsKKwkKKy8qCWdnaUZsdXNoKFZJUyk7ICovCisJCisJd2hpbGUgKGdnaUV2ZW50UG9sbChWSVMsIGVtQWxsLCB0dnApKQorLyoJd2hpbGUgKGdnaUV2ZW50UG9sbChWSVMsIChlbUtleWJvYXJkIHwgZW1Qb2ludGVyIHwgZW1Db21tYW5kKSwgdHZwKSkgKi8KKwl7CisJCWludCBxdWV1ZWV2ZW50X21vdXNlID0gMCwgcXVldWVldmVudF9rYmQgPSAwOworCQlzdGF0aWMgaW50IGJ1dHRvbnMgPSAwOworCQlzdGF0aWMgaW50IG1vdXNlX3ggPSAwLCBtb3VzZV95ID0gMCwgbW91c2VfeiA9IDA7CisJCWludCB4ID0gMCwgeSA9IDAsIHogPSAwLCByeCA9IDAsIHJ5ID0gMCwgcnogPSAwOworCQlpbnQgcHJlc3NlZF9tb3VzZSwgcHJlc3NlZF9rYmQ7CisJCVNETF9rZXlzeW0ga2V5c3ltOworCQkKKwkJcG9zdGVkID0gMDsKKworCQkvKiBGSVhNRTogV2UgZG8gbm90IGFjdHVhbGx5IHdhbnQgYWxsIGV2ZW50cywgb25seQorCQkgKiBtb3VzZSBhbmQga2V5Ym9hcmQgZXZlbnRzLiAgSGF2aW5nIHRvIGhhbmRsZSBhbGwKKyAgICAgICAgICAgICAgICAgKiBldmVudHMgd2lsbCBzbG93IHRoaW5ncyBkb3duLiAgKi8KKworCQlnZ2lFdmVudFJlYWQoVklTLCAmZXYsIGVtQWxsKTsKKy8qCQlnZ2lFdmVudFJlYWQoVklTLCAmZXYsIChlbUtleWJvYXJkIHwgZW1Qb2ludGVyIHwgZW1Db21tYW5kKSk7ICovCisJCQorCQlzd2l0Y2ggKGV2LmFueS50eXBlKQorCQl7CisJCQljYXNlIGV2UHRyUmVsYXRpdmU6CisJCQl4ID0gZXYucG1vdmUueDsKKwkJCXkgPSBldi5wbW92ZS55OworCQkJeiA9IGV2LnBtb3ZlLndoZWVsOworCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgeCwgeSk7CisJCQlicmVhazsKKwkJCWNhc2UgZXZQdHJBYnNvbHV0ZToKKwkJCWlmIChtb3VzZV94ICE9IGV2LnBtb3ZlLnggfHwgbW91c2VfeSAhPSBldi5wbW92ZS55IHx8IG1vdXNlX3ogIT0gZXYucG1vdmUud2hlZWwpCisJCQl7CisJCQkJeCA9IGV2LnBtb3ZlLnggLSBtb3VzZV94OworCQkJCXkgPSBldi5wbW92ZS55IC0gbW91c2VfeTsKKwkJCQl6ID0gZXYucG1vdmUud2hlZWwgLSBtb3VzZV96OworCQkJCW1vdXNlX3ggPSBldi5wbW92ZS54OworCQkJCW1vdXNlX3kgPSBldi5wbW92ZS55OworCQkJCW1vdXNlX3ogPSBldi5wbW92ZS53aGVlbDsKKwkJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLCB4LCB5KTsKKwkJCX0gCisJCQlicmVhazsKKwkJCWNhc2UgZXZQdHJCdXR0b25QcmVzczoKKwkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBldi5wYnV0dG9uLmJ1dHRvbiwgMCwgMCk7CisJCQlicmVhazsKKwkJCWNhc2UgZXZQdHJCdXR0b25SZWxlYXNlOgorCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBldi5wYnV0dG9uLmJ1dHRvbiwgMCwgMCk7CisJCQlicmVhazsKKwkJCWNhc2UgZXZLZXlQcmVzczoKKwkJCWNhc2UgZXZLZXlSZXBlYXQ6CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgR0dJX1RyYW5zbGF0ZUtleSgmZXYsICZrZXlzeW0pKTsKKwkJCWJyZWFrOworCQkJY2FzZSBldktleVJlbGVhc2U6CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsIEdHSV9UcmFuc2xhdGVLZXkoJmV2LCAma2V5c3ltKSk7CisJCQlicmVhazsKKwkJCWNhc2UgZXZDb21tYW5kOgorCQkJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIGV2ZW50ICV4IHJlY2lldmVkXG4iLCBldi5jbWQuY29kZSk7CisJCQlicmVhazsKKyAJCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJVbmhhbmRsZWQgZXZlbnQgdHlwZSAlZFxuIiwgZXYuYW55LnR5cGUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK30KKwordm9pZCBHR0lfSW5pdE9TS2V5bWFwKF9USElTKQoreworCWludCBpOworCQorCS8qIEluaXRpYWxpemUgdGhlIEdHSSBrZXkgdHJhbnNsYXRpb24gdGFibGUgKi8KKwlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShrZXltYXApOyArK2kgKQorCQlrZXltYXBbaV0gPSBTRExLX1VOS05PV047CisJCisJa2V5bWFwW1NDQU5DT0RFX0VTQ0FQRV0gPSBTRExLX0VTQ0FQRTsKKwlrZXltYXBbU0NBTkNPREVfMV0gPSBTRExLXzE7CisJa2V5bWFwW1NDQU5DT0RFXzJdID0gU0RMS18yOworCWtleW1hcFtTQ0FOQ09ERV8zXSA9IFNETEtfMzsKKwlrZXltYXBbU0NBTkNPREVfNF0gPSBTRExLXzQ7CisJa2V5bWFwW1NDQU5DT0RFXzVdID0gU0RMS181OworCWtleW1hcFtTQ0FOQ09ERV82XSA9IFNETEtfNjsKKwlrZXltYXBbU0NBTkNPREVfN10gPSBTRExLXzc7CisJa2V5bWFwW1NDQU5DT0RFXzhdID0gU0RMS184OworCWtleW1hcFtTQ0FOQ09ERV85XSA9IFNETEtfOTsKKwlrZXltYXBbU0NBTkNPREVfMF0gPSBTRExLXzA7CisJa2V5bWFwW1NDQU5DT0RFX01JTlVTXSA9IFNETEtfTUlOVVM7CisJa2V5bWFwW1NDQU5DT0RFX0VRVUFMXSA9IFNETEtfRVFVQUxTOworCWtleW1hcFtTQ0FOQ09ERV9CQUNLU1BBQ0VdID0gU0RMS19CQUNLU1BBQ0U7CisJa2V5bWFwW1NDQU5DT0RFX1RBQl0gPSBTRExLX1RBQjsKKwlrZXltYXBbU0NBTkNPREVfUV0gPSBTRExLX3E7CisJa2V5bWFwW1NDQU5DT0RFX1ddID0gU0RMS193OworCWtleW1hcFtTQ0FOQ09ERV9FXSA9IFNETEtfZTsKKwlrZXltYXBbU0NBTkNPREVfUl0gPSBTRExLX3I7CisJa2V5bWFwW1NDQU5DT0RFX1RdID0gU0RMS190OworCWtleW1hcFtTQ0FOQ09ERV9ZXSA9IFNETEtfeTsKKwlrZXltYXBbU0NBTkNPREVfVV0gPSBTRExLX3U7CisJa2V5bWFwW1NDQU5DT0RFX0ldID0gU0RMS19pOworCWtleW1hcFtTQ0FOQ09ERV9PXSA9IFNETEtfbzsKKwlrZXltYXBbU0NBTkNPREVfUF0gPSBTRExLX3A7CisJa2V5bWFwW1NDQU5DT0RFX0JSQUNLRVRfTEVGVF0gPSBTRExLX0xFRlRCUkFDS0VUOworCWtleW1hcFtTQ0FOQ09ERV9CUkFDS0VUX1JJR0hUXSA9IFNETEtfUklHSFRCUkFDS0VUOworCWtleW1hcFtTQ0FOQ09ERV9FTlRFUl0gPSBTRExLX1JFVFVSTjsKKwlrZXltYXBbU0NBTkNPREVfTEVGVENPTlRST0xdID0gU0RMS19MQ1RSTDsKKwlrZXltYXBbU0NBTkNPREVfQV0gPSBTRExLX2E7CisJa2V5bWFwW1NDQU5DT0RFX1NdID0gU0RMS19zOworCWtleW1hcFtTQ0FOQ09ERV9EXSA9IFNETEtfZDsKKwlrZXltYXBbU0NBTkNPREVfRl0gPSBTRExLX2Y7CisJa2V5bWFwW1NDQU5DT0RFX0ddID0gU0RMS19nOworCWtleW1hcFtTQ0FOQ09ERV9IXSA9IFNETEtfaDsKKwlrZXltYXBbU0NBTkNPREVfSl0gPSBTRExLX2o7CisJa2V5bWFwW1NDQU5DT0RFX0tdID0gU0RMS19rOworCWtleW1hcFtTQ0FOQ09ERV9MXSA9IFNETEtfbDsKKwlrZXltYXBbU0NBTkNPREVfU0VNSUNPTE9OXSA9IFNETEtfU0VNSUNPTE9OOworCWtleW1hcFtTQ0FOQ09ERV9BUE9TVFJPUEhFXSA9IFNETEtfUVVPVEU7CisJa2V5bWFwW1NDQU5DT0RFX0dSQVZFXSA9IFNETEtfQkFDS1FVT1RFOworCWtleW1hcFtTQ0FOQ09ERV9MRUZUU0hJRlRdID0gU0RMS19MU0hJRlQ7CisJa2V5bWFwW1NDQU5DT0RFX0JBQ0tTTEFTSF0gPSBTRExLX0JBQ0tTTEFTSDsKKwlrZXltYXBbU0NBTkNPREVfWl0gPSBTRExLX3o7CisJa2V5bWFwW1NDQU5DT0RFX1hdID0gU0RMS194OworCWtleW1hcFtTQ0FOQ09ERV9DXSA9IFNETEtfYzsKKwlrZXltYXBbU0NBTkNPREVfVl0gPSBTRExLX3Y7CisJa2V5bWFwW1NDQU5DT0RFX0JdID0gU0RMS19iOworCWtleW1hcFtTQ0FOQ09ERV9OXSA9IFNETEtfbjsKKwlrZXltYXBbU0NBTkNPREVfTV0gPSBTRExLX207CisJa2V5bWFwW1NDQU5DT0RFX0NPTU1BXSA9IFNETEtfQ09NTUE7CisJa2V5bWFwW1NDQU5DT0RFX1BFUklPRF0gPSBTRExLX1BFUklPRDsKKwlrZXltYXBbU0NBTkNPREVfU0xBU0hdID0gU0RMS19TTEFTSDsKKwlrZXltYXBbU0NBTkNPREVfUklHSFRTSElGVF0gPSBTRExLX1JTSElGVDsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFETVVMVElQTFldID0gU0RMS19LUF9NVUxUSVBMWTsKKwlrZXltYXBbU0NBTkNPREVfTEVGVEFMVF0gPSBTRExLX0xBTFQ7CisJa2V5bWFwW1NDQU5DT0RFX1NQQUNFXSA9IFNETEtfU1BBQ0U7CisJa2V5bWFwW1NDQU5DT0RFX0NBUFNMT0NLXSA9IFNETEtfQ0FQU0xPQ0s7CisJa2V5bWFwW1NDQU5DT0RFX0YxXSA9IFNETEtfRjE7CisJa2V5bWFwW1NDQU5DT0RFX0YyXSA9IFNETEtfRjI7CisJa2V5bWFwW1NDQU5DT0RFX0YzXSA9IFNETEtfRjM7CisJa2V5bWFwW1NDQU5DT0RFX0Y0XSA9IFNETEtfRjQ7CisJa2V5bWFwW1NDQU5DT0RFX0Y1XSA9IFNETEtfRjU7CisJa2V5bWFwW1NDQU5DT0RFX0Y2XSA9IFNETEtfRjY7CisJa2V5bWFwW1NDQU5DT0RFX0Y3XSA9IFNETEtfRjc7CisJa2V5bWFwW1NDQU5DT0RFX0Y4XSA9IFNETEtfRjg7CisJa2V5bWFwW1NDQU5DT0RFX0Y5XSA9IFNETEtfRjk7CisJa2V5bWFwW1NDQU5DT0RFX0YxMF0gPSBTRExLX0YxMDsKKwlrZXltYXBbU0NBTkNPREVfTlVNTE9DS10gPSBTRExLX05VTUxPQ0s7CisJa2V5bWFwW1NDQU5DT0RFX1NDUk9MTExPQ0tdID0gU0RMS19TQ1JPTExPQ0s7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDddID0gU0RMS19LUDc7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUlVQTEVGVF0gPSBTRExLX0tQNzsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEOF0gPSBTRExLX0tQODsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SVVBdID0gU0RMS19LUDg7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDldID0gU0RMS19LUDk7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUlVQUklHSFRdID0gU0RMS19LUDk7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRE1JTlVTXSA9IFNETEtfS1BfTUlOVVM7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDRdID0gU0RMS19LUDQ7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUkxFRlRdID0gU0RMS19LUDQ7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDVdID0gU0RMS19LUDU7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDZdID0gU0RMS19LUDY7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUlJJR0hUXSA9IFNETEtfS1A2OworCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURQTFVTXSA9IFNETEtfS1BfUExVUzsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEMV0gPSBTRExLX0tQMTsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SRE9XTkxFRlRdID0gU0RMS19LUDE7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDJdID0gU0RMS19LUDI7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUkRPV05dID0gU0RMS19LUDI7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDNdID0gU0RMS19LUDM7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUkRPV05SSUdIVF0gPSBTRExLX0tQMzsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEMF0gPSBTRExLX0tQMDsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEUEVSSU9EXSA9IFNETEtfS1BfUEVSSU9EOworCWtleW1hcFtTQ0FOQ09ERV9MRVNTXSA9IFNETEtfTEVTUzsKKwlrZXltYXBbU0NBTkNPREVfRjExXSA9IFNETEtfRjExOworCWtleW1hcFtTQ0FOQ09ERV9GMTJdID0gU0RMS19GMTI7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBREVOVEVSXSA9IFNETEtfS1BfRU5URVI7CisJa2V5bWFwW1NDQU5DT0RFX1JJR0hUQ09OVFJPTF0gPSBTRExLX1JDVFJMOworCWtleW1hcFtTQ0FOQ09ERV9DT05UUk9MXSA9IFNETEtfUkNUUkw7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRERJVklERV0gPSBTRExLX0tQX0RJVklERTsKKwlrZXltYXBbU0NBTkNPREVfUFJJTlRTQ1JFRU5dID0gU0RMS19QUklOVDsKKwlrZXltYXBbU0NBTkNPREVfUklHSFRBTFRdID0gU0RMS19SQUxUOworCWtleW1hcFtTQ0FOQ09ERV9CUkVBS10gPSBTRExLX0JSRUFLOworCWtleW1hcFtTQ0FOQ09ERV9CUkVBS19BTFRFUk5BVElWRV0gPSBTRExLX1VOS05PV047CisJa2V5bWFwW1NDQU5DT0RFX0hPTUVdID0gU0RMS19IT01FOworCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JCTE9DS1VQXSA9IFNETEtfVVA7CisJa2V5bWFwW1NDQU5DT0RFX1BBR0VVUF0gPSBTRExLX1BBR0VVUDsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SQkxPQ0tMRUZUXSA9IFNETEtfTEVGVDsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SQkxPQ0tSSUdIVF0gPSBTRExLX1JJR0hUOworCWtleW1hcFtTQ0FOQ09ERV9FTkRdID0gU0RMS19FTkQ7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUkJMT0NLRE9XTl0gPSBTRExLX0RPV047CisJa2V5bWFwW1NDQU5DT0RFX1BBR0VET1dOXSA9IFNETEtfUEFHRURPV047CisJa2V5bWFwW1NDQU5DT0RFX0lOU0VSVF0gPSBTRExLX0lOU0VSVDsKKwlrZXltYXBbU0NBTkNPREVfUkVNT1ZFXSA9IFNETEtfREVMRVRFOworCWtleW1hcFsxMTldID0gU0RMS19QQVVTRTsKKwlrZXltYXBbU0NBTkNPREVfUklHSFRXSU5dID0gU0RMS19SU1VQRVI7CisJa2V5bWFwW1NDQU5DT0RFX0xFRlRXSU5dID0gU0RMS19MU1VQRVI7CisJa2V5bWFwWzEyN10gPSBTRExLX01FTlU7Cit9CisKKworCitzdGF0aWMgU0RMX2tleXN5bSAqR0dJX1RyYW5zbGF0ZUtleShnaWlfZXZlbnQgKmV2LCBTRExfa2V5c3ltICprZXlzeW0pCit7CisJLyogU2V0IHRoZSBrZXlzeW0gaW5mb3JtYXRpb24gKi8KKwlrZXlzeW0tPnNjYW5jb2RlID0gZXYtPmtleS5idXR0b247CisJa2V5c3ltLT5zeW0gPSBrZXltYXBbZXYtPmtleS5idXR0b25dOworCWtleXN5bS0+bW9kID0gS01PRF9OT05FOworCisJLyogSWYgVU5JQ09ERSBpcyBvbiwgZ2V0IHRoZSBVTklDT0RFIHZhbHVlIGZvciB0aGUga2V5ICovCisJa2V5c3ltLT51bmljb2RlID0gMDsKKwlpZiAoU0RMX1RyYW5zbGF0ZVVOSUNPREUpIAorCXsKKwkJa2V5c3ltLT51bmljb2RlID0gR0lJX1VOSUNPREUoZXYtPmtleS5zeW0pOworCX0KKworCXJldHVybiBrZXlzeW07Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2dpL1NETF9nZ2lldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJjNjYxMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpZXZlbnRzX2MuaApAQCAtMCwwICsxLDI5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9nZ2l2aWRlby5oIgorCisvKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KK2V4dGVybiB2b2lkIEdHSV9Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgR0dJX1B1bXBFdmVudHMoX1RISVMpOworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpa2V5cy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZ2kvU0RMX2dnaWtleXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGlzdHJpYi9zZGwtMS4yLjEyL3NyYy92aWRlby9nZ2kvU0RMX2dnaWtleXMuaApyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZ2kvU0RMX2dnaWtleXMuaApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZ2kvU0RMX2dnaW1vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpbW91c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmM1MzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZ2kvU0RMX2dnaW1vdXNlLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX2dnaW1vdXNlX2MuaCIKKworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK3N0cnVjdCBXTWN1cnNvciB7CisJaW50IHVudXNlZDsKK307CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2dnaS9TRExfZ2dpbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZ2kvU0RMX2dnaW1vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMGNlMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZ2kvU0RMX2dnaW1vdXNlX2MuaApAQCAtMCwwICsxLDI2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9nZ2l2aWRlby5oIgorCisvKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2dpL1NETF9nZ2l2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZ2kvU0RMX2dnaXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjZTQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2dpL1NETF9nZ2l2aWRlby5jCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogR0dJLWJhc2VkIFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb24uCisqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSA8Z2dpL2dnaS5oPgorI2luY2x1ZGUgPGdnaS9naWkuaD4KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfZ2dpdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfZ2dpbW91c2VfYy5oIgorI2luY2x1ZGUgIlNETF9nZ2lldmVudHNfYy5oIgorCisKK3N0cnVjdCBwcml2YXRlX2h3ZGF0YQoreworCWdnaV92aXN1YWxfdCB2aXM7Cit9OworCitnZ2lfdmlzdWFsX3QgVklTOworCisvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgR0dJX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKkdHSV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworc3RhdGljIFNETF9TdXJmYWNlICpHR0lfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOworc3RhdGljIGludCBHR0lfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsCisJCQkgU0RMX0NvbG9yICpjb2xvcnMpOworc3RhdGljIHZvaWQgR0dJX1ZpZGVvUXVpdChfVEhJUyk7CisKKy8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IEdHSV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBHR0lfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgR0dJX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgR0dJX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKKworLyogR0dJIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgR0dJX0F2YWlsYWJsZSh2b2lkKQoreworCWdnaV92aXN1YWxfdCAqdmlzOworCisJdmlzID0gTlVMTDsKKwlpZiAoZ2dpSW5pdCgpID09IDApIHsKKwkJdmlzID0gZ2dpT3BlbihOVUxMKTsKKwkJaWYgKHZpcyAhPSBOVUxMKSB7CisJCQlnZ2lDbG9zZSh2aXMpOworCQl9CisJfQorCXJldHVybiAodmlzICE9IE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBHR0lfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKwlTRExfZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpHR0lfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggZGV2aWNlICkgeworCQkJU0RMX2ZyZWUoZGV2aWNlKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBHR0lfVmlkZW9Jbml0OworCWRldmljZS0+TGlzdE1vZGVzID0gR0dJX0xpc3RNb2RlczsKKwlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IEdHSV9TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5TZXRDb2xvcnMgPSBHR0lfU2V0Q29sb3JzOworCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOworCWRldmljZS0+VmlkZW9RdWl0ID0gR0dJX1ZpZGVvUXVpdDsKKwlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gR0dJX0FsbG9jSFdTdXJmYWNlOworCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOworCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IEdHSV9Mb2NrSFdTdXJmYWNlOworCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gR0dJX1VubG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOworCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IEdHSV9GcmVlSFdTdXJmYWNlOworCWRldmljZS0+U2V0Q2FwdGlvbiA9IE5VTEw7CisJZGV2aWNlLT5TZXRJY29uID0gTlVMTDsKKwlkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBOVUxMOworCWRldmljZS0+R3JhYklucHV0ID0gTlVMTDsKKwlkZXZpY2UtPkdldFdNSW5mbyA9IE5VTEw7CisJZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBHR0lfSW5pdE9TS2V5bWFwOworCWRldmljZS0+UHVtcEV2ZW50cyA9IEdHSV9QdW1wRXZlbnRzOworCisJZGV2aWNlLT5mcmVlID0gR0dJX0RlbGV0ZURldmljZTsKKworCXJldHVybiBkZXZpY2U7Cit9CisKK1ZpZGVvQm9vdFN0cmFwIEdHSV9ib290c3RyYXAgPSB7CisJImdnaSIsICJHZW5lcmFsIEdyYXBoaWNzIEludGVyZmFjZSAoR0dJKSIsCisJR0dJX0F2YWlsYWJsZSwgR0dJX0NyZWF0ZURldmljZQorfTsKKworCitzdGF0aWMgU0RMX1JlY3QgdmlkZW9fbW9kZTsKK3N0YXRpYyBTRExfUmVjdCAqU0RMX21vZGVsaXN0WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisKK2ludCBHR0lfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisJZ2dpX21vZGUgbW9kZSA9CisJeworCQkxLAorCQl7IEdHSV9BVVRPLCBHR0lfQVVUTyB9LAorCQl7IEdHSV9BVVRPLCBHR0lfQVVUTyB9LAorCQl7IDAsIDAgfSwKKwkJR1RfQVVUTywKKwkJeyBHR0lfQVVUTywgR0dJX0FVVE8gfQorCX07CQorCXN0cnVjdCBwcml2YXRlX2h3ZGF0YSAqcHJpdjsKKwlnZ2lfY29sb3IgcGFsWzI1Nl0sIG1hcFsyNTZdOworCWNvbnN0IGdnaV9kaXJlY3RidWZmZXIgKmRiOworCWludCBlcnIsIG51bV9idWZzOworCWdnaV9waXhlbCB3aGl0ZSwgYmxhY2s7CisJCisJcHJpdiA9IFNETF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcml2YXRlX2h3ZGF0YSkpOworCWlmIChwcml2ID09IE5VTEwpCisJeworCQlTRExfU2V0RXJyb3IoIlVuaGFuZGxlZCBHR0kgbW9kZSB0eXBlIVxuIik7CisJCUdHSV9WaWRlb1F1aXQoTlVMTCk7CisJfQorCQorCWlmIChnZ2lJbml0KCkgIT0gMCkKKwl7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUgR0dJIVxuIik7CisJCUdHSV9WaWRlb1F1aXQoTlVMTCk7CisJfQorCQorCVZJUyA9IGdnaU9wZW4oTlVMTCk7CisJaWYgKFZJUyA9PSBOVUxMKQorCXsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gb3BlbiBkZWZhdWx0IEdHSSB2aXN1YWwhXG4iKTsKKwkJZ2dpRXhpdCgpOworCQlHR0lfVmlkZW9RdWl0KE5VTEwpOworCX0KKwkKKwlnZ2lTZXRGbGFncyhWSVMsIEdHSUZMQUdfQVNZTkMpOworCQorCS8qIFZhbGlkYXRlIG1vZGUsIGF1dG9kZXRlY3RpbmcgYW55IEdHSV9BVVRPIG9yIEdUX0FVVE8gZmllbGRzICovCisJZ2dpQ2hlY2tNb2RlKFZJUywgJm1vZGUpOworCQorCS8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBtb2RlIC0gdHJ5IHRvIHNldCBpdCAqLworCWVyciA9IGdnaVNldE1vZGUoVklTLCAmbW9kZSk7CisJCisJLyogSWYgd2UgY291bGRuJ3Qgc2V0IF9hbnlfIG1vZGVzLCBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZyAqLworCWlmIChlcnIpCisJeworCQlTRExfU2V0RXJyb3IoIkNhbid0IHNldCBhIG1vZGUhXG4iKTsKKwkJZ2dpQ2xvc2UoVklTKTsKKwkJZ2dpRXhpdCgpOworCQlHR0lfVmlkZW9RdWl0KE5VTEwpOworCX0KKworCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLworCXRoaXMtPmluZm8uY3VycmVudF93ID0gbW9kZS52aXJ0Lng7CisJdGhpcy0+aW5mby5jdXJyZW50X2ggPSBtb2RlLnZpcnQueTsKKworCS8qIFNldCBhIHBhbGV0dGUgZm9yIHBhbGxldGl6ZWQgbW9kZXMgKi8KKwlpZiAoR1RfU0NIRU1FKG1vZGUuZ3JhcGh0eXBlKSA9PSBHVF9QQUxFVFRFKQorCXsKKwkJZ2dpU2V0Q29sb3JmdWxQYWxldHRlKFZJUyk7CisJCWdnaUdldFBhbGV0dGUoVklTLCAwLCAxIDw8IHZmb3JtYXQtPkJpdHNQZXJQaXhlbCwgcGFsKTsKKwl9CisJCisJLyogTm93IHdlIHRyeSB0byBnZXQgdGhlIERpcmVjdEJ1ZmZlciBpbmZvLCB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIKKwkgKiBTREwgY2FuIGFjY2VzcyBoYXJkd2FyZSBzdXJmYWNlcyBkaXJlY3RseS4gKi8KKwkKKwludW1fYnVmcyA9IGdnaURCR2V0TnVtQnVmZmVycyhWSVMpOworCisJaWYgKG51bV9idWZzID4gMCkKKwl7CisJCWRiID0gZ2dpREJHZXRCdWZmZXIoVklTLCAwKTsgLyogT25seSBoYW5kbGUgb25lIERCIGZvciBub3cgKi8KKwkJCisJCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IGRiLT5idWZmZXIucGxiLnBpeGVsZm9ybWF0LT5kZXB0aDsKKwkJCisJCXZmb3JtYXQtPlJtYXNrID0gZGItPmJ1ZmZlci5wbGIucGl4ZWxmb3JtYXQtPnJlZF9tYXNrOworCQl2Zm9ybWF0LT5HbWFzayA9IGRiLT5idWZmZXIucGxiLnBpeGVsZm9ybWF0LT5ncmVlbl9tYXNrOworCQl2Zm9ybWF0LT5CbWFzayA9IGRiLT5idWZmZXIucGxiLnBpeGVsZm9ybWF0LT5ibHVlX21hc2s7CisJCQorCQkvKiBGaWxsIGluIG91ciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gY2FwYWJpbGl0aWVzICovCisJCisJCXRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMDsKKwkJdGhpcy0+aW5mby5od19hdmFpbGFibGUgPSAxOworCQl0aGlzLT5pbmZvLnZpZGVvX21lbSA9IGRiLT5idWZmZXIucGxiLnN0cmlkZSAqIG1vZGUudmlydC55OworCX0KKworCXZpZGVvX21vZGUueCA9IDA7CisJdmlkZW9fbW9kZS55ID0gMDsKKwl2aWRlb19tb2RlLncgPSBtb2RlLnZpcnQueDsKKwl2aWRlb19tb2RlLmggPSBtb2RlLnZpcnQueTsKKwlTRExfbW9kZWxpc3RbKCh2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgKyA3KSAvIDgpIC0gMV0gPSAmdmlkZW9fbW9kZTsKKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgU0RMX1JlY3QgKipHR0lfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCXJldHVybigmU0RMX21vZGVsaXN0WygoZm9ybWF0LT5CaXRzUGVyUGl4ZWwgKyA3KSAvIDgpIC0gMV0pOworfQorCisvKiBWYXJpb3VzIHNjcmVlbiB1cGRhdGUgZnVuY3Rpb25zIGF2YWlsYWJsZSAqLworc3RhdGljIHZvaWQgR0dJX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCitTRExfU3VyZmFjZSAqR0dJX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworCWdnaV9tb2RlIG1vZGUgPQorCXsKKwkJMSwKKwkJeyBHR0lfQVVUTywgR0dJX0FVVE8gfSwKKwkJeyBHR0lfQVVUTywgR0dJX0FVVE8gfSwKKwkJeyAwLCAwIH0sCisJCUdUX0FVVE8sCisJCXsgR0dJX0FVVE8sIEdHSV9BVVRPIH0KKwl9OworICAgICAgICBjb25zdCBnZ2lfZGlyZWN0YnVmZmVyICpkYjsKKwlnZ2lfY29sb3IgcGFsWzI1Nl07CisJaW50IGVycjsKKworCWZwcmludGYoc3RkZXJyLCAiR0dJX1NldFZpZGVvTW9kZSgpXG4iKTsKKwkKKwltb2RlLnZpc2libGUueCA9IG1vZGUudmlydC54ID0gd2lkdGg7CisJbW9kZS52aXNpYmxlLnkgPSBtb2RlLnZpcnQueSA9IGhlaWdodDsKKwkKKwkvKiBUcmFuc2xhdGUgcmVxdWVzdGVkIFNETCBiaXQgZGVwdGggaW50byBhIEdHSSBtb2RlICovCQorCXN3aXRjaCAoYnBwKQorCXsKKwkJY2FzZSAxOiAgbW9kZS5ncmFwaHR5cGUgPSBHVF8xQklUOyAgYnJlYWs7CisJCWNhc2UgMjogIG1vZGUuZ3JhcGh0eXBlID0gR1RfMkJJVDsgIGJyZWFrOworCQljYXNlIDQ6ICBtb2RlLmdyYXBodHlwZSA9IEdUXzRCSVQ7ICBicmVhazsKKwkJY2FzZSA4OiAgbW9kZS5ncmFwaHR5cGUgPSBHVF84QklUOyAgYnJlYWs7CisJCWNhc2UgMTU6IG1vZGUuZ3JhcGh0eXBlID0gR1RfMTVCSVQ7IGJyZWFrOworCQljYXNlIDE2OiBtb2RlLmdyYXBodHlwZSA9IEdUXzE2QklUOyBicmVhazsKKwkJY2FzZSAyNDogbW9kZS5ncmFwaHR5cGUgPSBHVF8yNEJJVDsgYnJlYWs7CisJCWNhc2UgMzI6IG1vZGUuZ3JhcGh0eXBlID0gR1RfMzJCSVQ7IGJyZWFrOworCQlkZWZhdWx0OgorCQlTRExfU2V0RXJyb3IoIlVua25vd24gU0RMIGJpdCBkZXB0aCwgdXNpbmcgR1RfQVVUTy4uLi5cbiIpOworCQltb2RlLmdyYXBodHlwZSA9IEdUX0FVVE87CisJfQorCQorCS8qIFZhbGlkYXRlIG1vZGUsIGF1dG9kZXRlY3RpbmcgYW55IEdHSV9BVVRPIG9yIEdUX0FVVE8gZmllbGRzICovCisJZ2dpQ2hlY2tNb2RlKFZJUywgJm1vZGUpOworCQorCS8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBtb2RlIC0gdHJ5IHRvIHNldCBpdCAqLworCWVyciA9IGdnaVNldE1vZGUoVklTLCAmbW9kZSk7CisKKwkvKiBJZiB3ZSBjb3VsZG4ndCBzZXQgX2FueV8gbW9kZXMsIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nICovCisJaWYgKGVycikKKwl7CisJCVNETF9TZXRFcnJvcigiQ2FuJ3Qgc2V0IGEgbW9kZSFcbiIpOworCQlnZ2lDbG9zZShWSVMpOworCQlnZ2lFeGl0KCk7CisJCUdHSV9WaWRlb1F1aXQoTlVMTCk7CisJfQorCQorCS8qIFNldCBhIHBhbGV0dGUgZm9yIHBhbGxldGl6ZWQgbW9kZXMgKi8KKwlpZiAoR1RfU0NIRU1FKG1vZGUuZ3JhcGh0eXBlKSA9PSBHVF9QQUxFVFRFKQorCXsKKwkJZ2dpU2V0Q29sb3JmdWxQYWxldHRlKFZJUyk7CisJCWdnaUdldFBhbGV0dGUoVklTLCAwLCAxIDw8IGJwcCwgcGFsKTsKKwl9CisJCisJZGIgPSBnZ2lEQkdldEJ1ZmZlcihWSVMsIDApOworCQorCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KKwljdXJyZW50LT5mbGFncyA9IChTRExfRlVMTFNDUkVFTiB8IFNETF9IV1NVUkZBQ0UpOworCWN1cnJlbnQtPncgPSBtb2RlLnZpcnQueDsKKwljdXJyZW50LT5oID0gbW9kZS52aXJ0Lnk7CisJY3VycmVudC0+cGl0Y2ggPSBkYi0+YnVmZmVyLnBsYi5zdHJpZGU7CisJY3VycmVudC0+cGl4ZWxzID0gZGItPnJlYWQ7CisKKwkvKiBTZXQgdGhlIGJsaXQgZnVuY3Rpb24gKi8KKwl0aGlzLT5VcGRhdGVSZWN0cyA9IEdHSV9EaXJlY3RVcGRhdGU7CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCitzdGF0aWMgaW50IEdHSV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuKC0xKTsKK30KK3N0YXRpYyB2b2lkIEdHSV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW50IEdHSV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oMCk7Cit9CitzdGF0aWMgdm9pZCBHR0lfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIEdHSV9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCWludCBpOworCQorLyoJZ2dpRmx1c2goVklTKTsgKi8KKwkKKwlmb3IgKGkgPSAwOyBpIDwgbnVtcmVjdHM7IGkrKykKKwl7CisJCWdnaUZsdXNoUmVnaW9uKFZJUywgcmVjdHNbaV0ueCwgcmVjdHNbaV0ueSwgcmVjdHNbaV0udywgcmVjdHNbaV0uaCk7CisJfQorCXJldHVybjsKK30KKworaW50IEdHSV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisJaW50IGk7CisJZ2dpX2NvbG9yIHBhbFsyNTZdOworCisJLyogU2V0IHVwIHRoZSBjb2xvcm1hcCAqLworCWZvciAoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspCisJeworCQlwYWxbaV0uciA9IChjb2xvcnNbaV0uciA8PCA4KSB8IGNvbG9yc1tpXS5yOworCQlwYWxbaV0uZyA9IChjb2xvcnNbaV0uZyA8PCA4KSB8IGNvbG9yc1tpXS5nOworCQlwYWxbaV0uYiA9IChjb2xvcnNbaV0uYiA8PCA4KSB8IGNvbG9yc1tpXS5iOworCX0KKwkKKwlnZ2lTZXRQYWxldHRlKFZJUywgZmlyc3Rjb2xvciwgbmNvbG9ycywgcGFsKTsKKwkKKwlyZXR1cm4gMTsKK30KKwkKK3ZvaWQgR0dJX1ZpZGVvUXVpdChfVEhJUykKK3sKK30KK3ZvaWQgR0dJX0ZpbmFsUXVpdCh2b2lkKSAKK3sKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2dpL1NETF9nZ2l2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9nZ2kvU0RMX2dnaXZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ZGQwOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vZ2dpL1NETF9nZ2l2aWRlby5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfZ2dpdmlkZW9faAorI2RlZmluZSBfU0RMX2dnaXZpZGVvX2gKKworI2luY2x1ZGUgPGdnaS9nZ2kuaD4KKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisjZGVmaW5lIF9USElTIFNETF9WaWRlb0RldmljZSAqdGhpcworCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEKK3sKKwlnZ2lfdmlzdWFsX3QgKmdnaXZpczsKK307CisKK2V4dGVybiBnZ2lfdmlzdWFsX3QgVklTOyAvKiBGSVhNRTogdXNlIHRoZSBwcml2YXRlIGRhdGEgc3RydWN0ICovCisKK2V4dGVybiBpbnQgU0RMX09wZW5LZXlib2FyZCh2b2lkKTsKK2V4dGVybiB2b2lkIFNETF9DbG9zZUtleWJvYXJkKHZvaWQpOworZXh0ZXJuIGludCBTRExfT3Blbk1vdXNlKHZvaWQpOworZXh0ZXJuIHZvaWQgU0RMX0Nsb3NlTW91c2Uodm9pZCk7CisKKyNlbmRpZiAvKiBfU0RMX2dnaXZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vaXBvZC9TRExfaXBvZHZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2lwb2QvU0RMX2lwb2R2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjNkYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2lwb2QvU0RMX2lwb2R2aWRlby5jCkBAIC0wLDAgKzEsNzMzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+CisjaW5jbHVkZSA8bGludXgva2QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXlib2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3N5c2V2ZW50cy5oIgorI2luY2x1ZGUgIlNETF9pcG9kdmlkZW8uaCIKKworI2RlZmluZSBfVEhJUyBTRExfVmlkZW9EZXZpY2UgKnRoaXMKKworc3RhdGljIGludCBpUG9kX1ZpZGVvSW5pdCAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKippUG9kX0xpc3RNb2RlcyAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworc3RhdGljIFNETF9TdXJmYWNlICppUG9kX1NldFZpZGVvTW9kZSAoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgaW50IGlQb2RfU2V0Q29sb3JzIChfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBpUG9kX1VwZGF0ZVJlY3RzIChfVEhJUywgaW50IG5yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKK3N0YXRpYyB2b2lkIGlQb2RfVmlkZW9RdWl0IChfVEhJUyk7CitzdGF0aWMgdm9pZCBpUG9kX1B1bXBFdmVudHMgKF9USElTKTsKKworc3RhdGljIGxvbmcgaVBvZF9HZXRHZW5lcmF0aW9uKCk7CisKK3N0YXRpYyBpbnQgaW5pdGQgPSAwOworc3RhdGljIGludCBrYmZkID0gLTE7CitzdGF0aWMgaW50IGZiZmQgPSAtMTsKK3N0YXRpYyBpbnQgb2xkdnQgPSAtMTsKK3N0YXRpYyBpbnQgY3VydnQgPSAtMTsKK3N0YXRpYyBpbnQgb2xkX2tibW9kZSA9IC0xOworc3RhdGljIGxvbmcgZ2VuZXJhdGlvbiA9IDA7CitzdGF0aWMgc3RydWN0IHRlcm1pb3Mgb2xkX3Rlcm1pb3MsIGN1cl90ZXJtaW9zOworCitGSUxFICpkYmdvdXQ7CisKKyNkZWZpbmUgTENEX0RBVEEgICAgICAgICAgMHgxMAorI2RlZmluZSBMQ0RfQ01EICAgICAgICAgICAweDA4CisjZGVmaW5lIElQT0RfT0xEX0xDRF9CQVNFIDB4YzAwMDEwMDAKKyNkZWZpbmUgSVBPRF9PTERfTENEX1JUQyAgMHhjZjAwMTExMAorI2RlZmluZSBJUE9EX05FV19MQ0RfQkFTRSAweDcwMDAzMDAwCisjZGVmaW5lIElQT0RfTkVXX0xDRF9SVEMgIDB4NjAwMDUwMTAKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGNkX2Jhc2UsIGxjZF9ydGMsIGxjZF93aWR0aCwgbGNkX2hlaWdodDsKKworc3RhdGljIGxvbmcgaVBvZF9HZXRHZW5lcmF0aW9uKCkgCit7CisgICAgaW50IGk7CisgICAgY2hhciBjcHVpbmZvWzI1Nl07CisgICAgY2hhciAqcHRyOworICAgIEZJTEUgKmZpbGU7CisgICAgCisgICAgaWYgKChmaWxlID0gZm9wZW4oIi9wcm9jL2NwdWluZm8iLCAiciIpKSAhPSBOVUxMKSB7CisJd2hpbGUgKGZnZXRzKGNwdWluZm8sIHNpemVvZihjcHVpbmZvKSwgZmlsZSkgIT0gTlVMTCkKKwkgICAgaWYgKFNETF9zdHJuY21wKGNwdWluZm8sICJSZXZpc2lvbiIsIDgpID09IDApCisJCWJyZWFrOworCWZjbG9zZShmaWxlKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgIWlzc3BhY2UoY3B1aW5mb1tpXSk7IGkrKyk7CisgICAgZm9yICg7IGlzc3BhY2UoY3B1aW5mb1tpXSk7IGkrKyk7CisgICAgcHRyID0gY3B1aW5mbyArIGkgKyAyOworICAgIAorICAgIHJldHVybiBTRExfc3RydG9sKHB0ciwgTlVMTCwgMTApOworfQorCitzdGF0aWMgaW50IGlQb2RfQXZhaWxhYmxlKCkgCit7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGlQb2RfRGVsZXRlRGV2aWNlIChTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKK3sKKyAgICBmcmVlIChkZXZpY2UtPmhpZGRlbik7CisgICAgZnJlZSAoZGV2aWNlKTsKK30KKwordm9pZCBpUG9kX0luaXRPU0tleW1hcCAoX1RISVMpIHt9CisKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKmlQb2RfQ3JlYXRlRGV2aWNlIChpbnQgZGV2aW5kZXgpCit7CisgICAgU0RMX1ZpZGVvRGV2aWNlICp0aGlzOworICAgIAorICAgIHRoaXMgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyAoc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworICAgIGlmICh0aGlzKSB7CisJbWVtc2V0ICh0aGlzLCAwLCBzaXplb2YgKnRoaXMpOworCXRoaXMtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikgU0RMX21hbGxvYyAoc2l6ZW9mKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSkpOworICAgIH0KKyAgICBpZiAoIXRoaXMgfHwgIXRoaXMtPmhpZGRlbikgeworCVNETF9PdXRPZk1lbW9yeSgpOworCWlmICh0aGlzKQorCSAgICBTRExfZnJlZSAodGhpcyk7CisJcmV0dXJuIDA7CisgICAgfQorICAgIG1lbXNldCAodGhpcy0+aGlkZGVuLCAwLCBzaXplb2Yoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhKSk7CisgICAgCisgICAgZ2VuZXJhdGlvbiA9IGlQb2RfR2V0R2VuZXJhdGlvbigpOworCisgICAgdGhpcy0+VmlkZW9Jbml0ID0gaVBvZF9WaWRlb0luaXQ7CisgICAgdGhpcy0+TGlzdE1vZGVzID0gaVBvZF9MaXN0TW9kZXM7CisgICAgdGhpcy0+U2V0VmlkZW9Nb2RlID0gaVBvZF9TZXRWaWRlb01vZGU7CisgICAgdGhpcy0+U2V0Q29sb3JzID0gaVBvZF9TZXRDb2xvcnM7CisgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBpUG9kX1VwZGF0ZVJlY3RzOworICAgIHRoaXMtPlZpZGVvUXVpdCA9IGlQb2RfVmlkZW9RdWl0OworICAgIHRoaXMtPkFsbG9jSFdTdXJmYWNlID0gMDsKKyAgICB0aGlzLT5DaGVja0hXQmxpdCA9IDA7CisgICAgdGhpcy0+RmlsbEhXUmVjdCA9IDA7CisgICAgdGhpcy0+U2V0SFdDb2xvcktleSA9IDA7CisgICAgdGhpcy0+U2V0SFdBbHBoYSA9IDA7CisgICAgdGhpcy0+TG9ja0hXU3VyZmFjZSA9IDA7CisgICAgdGhpcy0+VW5sb2NrSFdTdXJmYWNlID0gMDsKKyAgICB0aGlzLT5GbGlwSFdTdXJmYWNlID0gMDsKKyAgICB0aGlzLT5GcmVlSFdTdXJmYWNlID0gMDsKKyAgICB0aGlzLT5TZXRDYXB0aW9uID0gMDsKKyAgICB0aGlzLT5TZXRJY29uID0gMDsKKyAgICB0aGlzLT5JY29uaWZ5V2luZG93ID0gMDsKKyAgICB0aGlzLT5HcmFiSW5wdXQgPSAwOworICAgIHRoaXMtPkdldFdNSW5mbyA9IDA7CisgICAgdGhpcy0+SW5pdE9TS2V5bWFwID0gaVBvZF9Jbml0T1NLZXltYXA7CisgICAgdGhpcy0+UHVtcEV2ZW50cyA9IGlQb2RfUHVtcEV2ZW50czsKKyAgICB0aGlzLT5mcmVlID0gaVBvZF9EZWxldGVEZXZpY2U7CisKKyAgICByZXR1cm4gdGhpczsKK30KKworVmlkZW9Cb290U3RyYXAgaVBvZF9ib290c3RyYXAgPSB7CisgICAgImlwb2QiLCAiaVBvZCBGcmFtZWJ1ZmZlciBEcml2ZXIiLAorICAgIGlQb2RfQXZhaWxhYmxlLCBpUG9kX0NyZWF0ZURldmljZQorfTsKKworLy8tLS8vCisKK3N0YXRpYyBpbnQgaVBvZF9WaWRlb0luaXQgKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisgICAgaWYgKCFpbml0ZCkgeworCS8qKiogQ29kZSBhZGFwdGVkL2NvcGllZCBmcm9tIFNETCBmYmNvbiBkcml2ZXIuICoqKi8KKworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHR5MFtdID0geyAiL2Rldi90dHkwIiwgIi9kZXYvdmMvMCIsIDAgfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZjc1tdID0geyAiL2Rldi92Yy8lZCIsICIvZGV2L3R0eSVkIiwgMCB9OworCWludCBpLCB0dHkwX2ZkOworCisJZGJnb3V0ID0gZmRvcGVuIChvcGVuICgiL2V0Yy9zZGxwb2QubG9nIiwgT19XUk9OTFkgfCBPX1NZTkMgfCBPX0FQUEVORCksICJhIik7CisJaWYgKGRiZ291dCkgeworCSAgICBzZXRidWYgKGRiZ291dCwgMCk7CisJICAgIGZwcmludGYgKGRiZ291dCwgIi0tPiBTdGFydGVkIFNETCA8LS1cbiIpOworCX0KKworCS8vIFRyeSB0byBxdWVyeSBmb3IgYSBmcmVlIFZUCisJdHR5MF9mZCA9IC0xOworCWZvciAoIGk9MDsgdHR5MFtpXSAmJiAodHR5MF9mZCA8IDApOyArK2kgKSB7CisJICAgIHR0eTBfZmQgPSBvcGVuKHR0eTBbaV0sIE9fV1JPTkxZLCAwKTsKKwl9CisJaWYgKCB0dHkwX2ZkIDwgMCApIHsKKwkgICAgdHR5MF9mZCA9IGR1cCgwKTsgLyogTWF5YmUgc3RkaW4gaXMgYSBWVD8gKi8KKwl9CisJaW9jdGwodHR5MF9mZCwgVlRfT1BFTlFSWSwgJmN1cnZ0KTsKKwljbG9zZSh0dHkwX2ZkKTsKKworCXR0eTBfZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUiwgMCk7CisJaWYgKCB0dHkwX2ZkID49IDAgKSB7CisJICAgIGlvY3RsKHR0eTBfZmQsIFRJT0NOT1RUWSwgMCk7CisJICAgIGNsb3NlKHR0eTBfZmQpOworCX0KKworCWlmICggKGdldGV1aWQoKSA9PSAwKSAmJiAoY3VydnQgPiAwKSApIHsKKwkgICAgZm9yICggaT0wOyB2Y3NbaV0gJiYgKGtiZmQgPCAwKTsgKytpICkgeworCQljaGFyIHZ0cGF0aFsxMl07CisJCQorCQlTRExfc25wcmludGYodnRwYXRoLCBTRExfYXJyYXlzaXplKHZ0cGF0aCksIHZjc1tpXSwgY3VydnQpOworCQlrYmZkID0gb3Blbih2dHBhdGgsIE9fUkRXUik7CisJICAgIH0KKwl9CisJaWYgKCBrYmZkIDwgMCApIHsKKwkgICAgaWYgKGRiZ291dCkgZnByaW50ZiAoZGJnb3V0LCAiQ291bGRuJ3Qgb3BlbiBhbnkgVkNcbiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWlmIChkYmdvdXQpIGZwcmludGYgKHN0ZGVyciwgIkN1cnJlbnQgVlQ6ICVkXG4iLCBjdXJ2dCk7CisKKwlpZiAoa2JmZCA+PSAwKSB7CisJICAgIC8qIFN3aXRjaCB0byB0aGUgY29ycmVjdCB2aXJ0dWFsIHRlcm1pbmFsICovCisJICAgIGlmICggY3VydnQgPiAwICkgeworCQlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXRlOworCQkKKwkJaWYgKCBpb2N0bChrYmZkLCBWVF9HRVRTVEFURSwgJnZ0c3RhdGUpID09IDAgKSB7CisJCSAgICBvbGR2dCA9IHZ0c3RhdGUudl9hY3RpdmU7CisJCX0KKwkJaWYgKCBpb2N0bChrYmZkLCBWVF9BQ1RJVkFURSwgY3VydnQpID09IDAgKSB7CisJCSAgICBpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJXYWl0aW5nIGZvciBzd2l0Y2ggdG8gdGhpcyBWVC4uLiAiKTsKKwkJICAgIGlvY3RsKGtiZmQsIFZUX1dBSVRBQ1RJVkUsIGN1cnZ0KTsKKwkJICAgIGlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgImRvbmUhXG4iKTsKKwkJfQorCSAgICB9CisKKwkgICAgLy8gU2V0IHRlcm1pbmFsIGlucHV0IG1vZGUKKwkgICAgaWYgKHRjZ2V0YXR0ciAoa2JmZCwgJm9sZF90ZXJtaW9zKSA8IDApIHsKKwkJaWYgKGRiZ291dCkgZnByaW50ZiAoZGJnb3V0LCAiQ2FuJ3QgZ2V0IHRlcm1pb3NcbiIpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgY3VyX3Rlcm1pb3MgPSBvbGRfdGVybWlvczsKKwkgICAgLy8JICAgIGN1cl90ZXJtaW9zLmNfaWZsYWcgJj0gfihJQ1JOTCB8IElOUENLIHwgSVNUUklQIHwgSVhPTik7CisJICAgIC8vCSAgICBjdXJfdGVybWlvcy5jX2lmbGFnIHw9IChCUktJTlQpOworCSAgICAvLwkgICAgY3VyX3Rlcm1pb3MuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBJU0lHIHwgSUVYVEVOKTsKKwkgICAgLy8JICAgIGN1cl90ZXJtaW9zLmNfb2ZsYWcgJj0gfihPUE9TVCk7CisJICAgIC8vCSAgICBjdXJfdGVybWlvcy5jX29mbGFnIHw9IChPTk9DUiB8IE9OTFJFVCk7CisJICAgIGN1cl90ZXJtaW9zLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgSVNJRyk7CisJICAgIGN1cl90ZXJtaW9zLmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJR05DUiB8IElDUk5MIHwgSU5MQ1IgfCBJWE9GRiB8IElYT04pOworCSAgICBjdXJfdGVybWlvcy5jX2NjW1ZNSU5dID0gMDsKKwkgICAgY3VyX3Rlcm1pb3MuY19jY1tWVElNRV0gPSAwOworCSAgICAKKwkgICAgaWYgKHRjc2V0YXR0ciAoa2JmZCwgVENTQUZMVVNILCAmY3VyX3Rlcm1pb3MpIDwgMCkgeworCQlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJDYW4ndCBzZXQgdGVybWlvc1xuIik7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBpZiAoaW9jdGwgKGtiZmQsIEtEU0tCTU9ERSwgS19NRURJVU1SQVcpIDwgMCkgeworCQlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJDYW4ndCBzZXQgbWVkaXVtLXJhdyBtb2RlXG4iKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgIGlmIChpb2N0bCAoa2JmZCwgS0RTRVRNT0RFLCBLRF9HUkFQSElDUykgPCAwKSB7CisJCWlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgIkNhbid0IHNldCBncmFwaGljc1xuIik7CisJCXJldHVybiAtMTsKKwkgICAgfQorCX0KKworCS8vIE9wZW4gdGhlIGZyYW1lYnVmZmVyCisJaWYgKChmYmZkID0gb3BlbiAoIi9kZXYvZmIwIiwgT19SRFdSKSkgPCAwKSB7CisJICAgIGlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgIkNhbid0IG9wZW4gZnJhbWVidWZmZXJcbiIpOworCSAgICByZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZpbmZvOworCisJICAgIGlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgIkdlbmVyYXRpb246ICVsZFxuIiwgZ2VuZXJhdGlvbik7CisKKwkgICAgaWYgKGdlbmVyYXRpb24gPj0gNDAwMDApIHsKKwkJbGNkX2Jhc2UgPSBJUE9EX05FV19MQ0RfQkFTRTsKKwkgICAgfSBlbHNlIHsKKwkJbGNkX2Jhc2UgPSBJUE9EX09MRF9MQ0RfQkFTRTsKKwkgICAgfQorCSAgICAKKwkgICAgaW9jdGwgKGZiZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2aW5mbyk7CisJICAgIGNsb3NlIChmYmZkKTsKKworCSAgICBpZiAobGNkX2Jhc2UgPT0gSVBPRF9PTERfTENEX0JBU0UpCisJCWxjZF9ydGMgPSBJUE9EX09MRF9MQ0RfUlRDOworCSAgICBlbHNlIGlmIChsY2RfYmFzZSA9PSBJUE9EX05FV19MQ0RfQkFTRSkKKwkJbGNkX3J0YyA9IElQT0RfTkVXX0xDRF9SVEM7CisJICAgIGVsc2UgeworCQlTRExfU2V0RXJyb3IgKCJVbmtub3duIGlQb2QgdmVyc2lvbiIpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKworCSAgICBsY2Rfd2lkdGggPSB2aW5mby54cmVzOworCSAgICBsY2RfaGVpZ2h0ID0gdmluZm8ueXJlczsKKworCSAgICBpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJMQ0QgaXMgJWR4JWRcbiIsIGxjZF93aWR0aCwgbGNkX2hlaWdodCk7CisJfQorCisJZmNudGwgKGtiZmQsIEZfU0VURkwsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOworCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCisJdGhpcy0+aW5mby5jdXJyZW50X3cgPSBsY2Rfd2lkdGg7CisJdGhpcy0+aW5mby5jdXJyZW50X2ggPSBsY2RfaGVpZ2h0OworCisJaWYgKChnZW5lcmF0aW9uID49IDYwMDAwKSAmJiAoZ2VuZXJhdGlvbiA8IDcwMDAwKSkgeworCSAgICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSAxNjsKKwkgICAgdmZvcm1hdC0+Um1hc2sgPSAweEY4MDA7CisJICAgIHZmb3JtYXQtPkdtYXNrID0gMHgwN0UwOworCSAgICB2Zm9ybWF0LT5CbWFzayA9IDB4MDAxRjsKKwl9IGVsc2UgeworCSAgICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSA4OworCSAgICB2Zm9ybWF0LT5SbWFzayA9IHZmb3JtYXQtPkdtYXNrID0gdmZvcm1hdC0+Qm1hc2sgPSAwOworCX0KKworCWluaXRkID0gMTsKKwlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJJbml0aWFsaXplZC5cblxuIik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgU0RMX1JlY3QgKippUG9kX0xpc3RNb2RlcyAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCit7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIGZkOworICAgIHN0YXRpYyBTRExfUmVjdCByOworICAgIHN0YXRpYyBTRExfUmVjdCAqcnNbMl0gPSB7ICZyLCAwIH07CisKKyAgICBpZiAoKGZkID0gb3BlbiAoIi9kZXYvZmIwIiwgT19SRFdSKSkgPCAwKSB7CisJcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmluZm87CisJCisJaW9jdGwgKGZiZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2aW5mbyk7CisJY2xvc2UgKGZiZmQpOworCQorCXdpZHRoID0gdmluZm8ueHJlczsKKwloZWlnaHQgPSB2aW5mby55cmVzOworICAgIH0KKyAgICByLnggPSByLnkgPSAwOworICAgIHIudyA9IHdpZHRoOworICAgIHIuaCA9IGhlaWdodDsKKyAgICByZXR1cm4gcnM7Cit9CisKKworc3RhdGljIFNETF9TdXJmYWNlICppUG9kX1NldFZpZGVvTW9kZSAoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsCisJCQkJICAgICAgIFVpbnQzMiBmbGFncykKK3sKKyAgICBVaW50MzIgUm1hc2ssIEdtYXNrLCBCbWFzazsKKyAgICBpZiAoYnBwID4gOCkgeworCVJtYXNrID0gMHhGODAwOworCUdtYXNrID0gMHgwN0UwOworCUJtYXNrID0gMHgwMDFGOwkKKyAgICB9IGVsc2UgeworCVJtYXNrID0gR21hc2sgPSBCbWFzayA9IDA7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmhpZGRlbi0+YnVmZmVyKSBTRExfZnJlZSAodGhpcy0+aGlkZGVuLT5idWZmZXIpOworICAgIHRoaXMtPmhpZGRlbi0+YnVmZmVyID0gU0RMX21hbGxvYyAod2lkdGggKiBoZWlnaHQgKiAoYnBwIC8gOCkpOworICAgIGlmICghdGhpcy0+aGlkZGVuLT5idWZmZXIpIHsKKwlTRExfU2V0RXJyb3IgKCJDb3VsZG4ndCBhbGxvY2F0ZSBidWZmZXIgZm9yIHJlcXVlc3RlZCBtb2RlIik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgbWVtc2V0ICh0aGlzLT5oaWRkZW4tPmJ1ZmZlciwgMCwgd2lkdGggKiBoZWlnaHQgKiAoYnBwIC8gOCkpOworCisgICAgaWYgKCFTRExfUmVhbGxvY0Zvcm1hdCAoY3VycmVudCwgYnBwLCBSbWFzaywgR21hc2ssIEJtYXNrLCAwKSkgeworCVNETF9TZXRFcnJvciAoIkNvdWxkbid0IGFsbG9jYXRlIG5ldyBwaXhlbCBmb3JtYXQiKTsKKwlTRExfZnJlZSAodGhpcy0+aGlkZGVuLT5idWZmZXIpOworCXRoaXMtPmhpZGRlbi0+YnVmZmVyID0gMDsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoYnBwIDw9IDgpIHsKKwlpbnQgaSwgajsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDQpIHsKKwkgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQljdXJyZW50LT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tpK2pdLnIgPSA4NSAqIGo7CisJCWN1cnJlbnQtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2kral0uZyA9IDg1ICogajsKKwkJY3VycmVudC0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbaStqXS5iID0gODUgKiBqOworCSAgICB9CisJfQorICAgIH0KKworICAgIGN1cnJlbnQtPmZsYWdzID0gZmxhZ3MgJiBTRExfRlVMTFNDUkVFTjsKKyAgICB0aGlzLT5oaWRkZW4tPncgPSBjdXJyZW50LT53ID0gd2lkdGg7CisgICAgdGhpcy0+aGlkZGVuLT5oID0gY3VycmVudC0+aCA9IGhlaWdodDsKKyAgICBjdXJyZW50LT5waXRjaCA9IGN1cnJlbnQtPncgKiAoYnBwIC8gOCk7CisgICAgY3VycmVudC0+cGl4ZWxzID0gdGhpcy0+aGlkZGVuLT5idWZmZXI7CisKKyAgICByZXR1cm4gY3VycmVudDsKK30KKworc3RhdGljIGludCBpUG9kX1NldENvbG9ycyAoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisgICAgaWYgKFNETF9WaWRlb1N1cmZhY2UgJiYgU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0ICYmIFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZSkgeworCWludCBpLCBqOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gNCkgeworCSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCVNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2kral0uciA9IDg1ICogajsKKwkJU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbaStqXS5nID0gODUgKiBqOworCQlTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tpK2pdLmIgPSA4NSAqIGo7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpUG9kX1ZpZGVvUXVpdCAoX1RISVMpCit7CisgICAgaW9jdGwgKGtiZmQsIEtEU0VUTU9ERSwgS0RfVEVYVCk7CisgICAgdGNzZXRhdHRyIChrYmZkLCBUQ1NBRkxVU0gsICZvbGRfdGVybWlvcyk7CisgICAgb2xkX2tibW9kZSA9IC0xOworCisgICAgaWYgKG9sZHZ0ID4gMCkKKwlpb2N0bCAoa2JmZCwgVlRfQUNUSVZBVEUsIG9sZHZ0KTsKKyAgICAKKyAgICBpZiAoa2JmZCA+IDApCisJY2xvc2UgKGtiZmQpOworCisgICAgaWYgKGRiZ291dCkgeworCWZwcmludGYgKGRiZ291dCwgIjwtLSBFbmRlZCBTREwgLS0+XG4iKTsKKwlmY2xvc2UgKGRiZ291dCk7CisgICAgfQorICAgIAorICAgIGtiZmQgPSAtMTsKK30KKworc3RhdGljIGNoYXIgaVBvZF9TQ19rZXltYXBbXSA9IHsKKyAgICAwLAkJCQkvKiAwIC0gbm8ga2V5ICovCisgICAgJ1snIC0gMHg0MCwJCQkvKiBFU0MgKEN0cmwrWykgKi8KKyAgICAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorICAgICctJywgJz0nLAorICAgICdcYicsICdcdCcsCQkJLyogQmFja3NwYWNlLCBUYWIgKEN0cmwrSCxDdHJsK0kpICovCisgICAgJ3EnLCAndycsICdlJywgJ3InLCAndCcsICd5JywgJ3UnLCAnaScsICdvJywgJ3AnLCAnWycsICddJywKKyAgICAnXG4nLCAwLAkJCS8qIEVudGVyLCBMZWZ0IENUUkwgKi8KKyAgICAnYScsICdzJywgJ2QnLCAnZicsICdnJywgJ2gnLCAnaicsICdrJywgJ2wnLCAnOycsICdcJycsICdgJywKKyAgICAwLCAnXFwnLAkJCS8qIGxlZnQgc2hpZnQsIGJhY2tzbGFzaCAqLworICAgICd6JywgJ3gnLCAnYycsICd2JywgJ2InLCAnbicsICdtJywgJywnLCAnLicsICcvJywKKyAgICAwLCAnKicsIDAsICcgJywgMCwJCS8qIHJpZ2h0IHNoaWZ0LCBLUCBtdWwsIGxlZnQgYWx0LCBzcGFjZSwgY2Fwc2xvY2sgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvKiBGMS0xMCAqLworICAgIDAsIDAsCQkJLyogbnVtbG9jaywgc2Nyb2xsb2NrICovCisgICAgJzcnLCAnOCcsICc5JywgJy0nLCAnNCcsICc1JywgJzYnLCAnKycsICcxJywgJzInLCAnMycsICcwJywgJy4nLCAvKiBudW1lcmljIGtleXBhZCAqLworICAgIDAsIDAsCQkJLyogcGFkZGluZyAqLworICAgIDAsIDAsIDAsCQkJLyogImxlc3MiICg/KSwgRjExLCBGMTIgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiBwYWRkaW5nICovCisgICAgJ1xuJywgMCwgJy8nLCAwLCAwLAkvKiBLUCBlbnRlciwgUmN0cmwsIEN0cmwsIEtQIGRpdiwgUHJ0U2MsIFJBbHQgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiBCcmVhaywgSG9tZSwgVXAsIFBnVXAsIExlZnQsIFJpZ2h0LCBFbmQsIERvd24sIFBnRG4gKi8KKyAgICAwLCAwLAkJCS8qIElucywgRGVsICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLyogcGFkZGluZyAqLworICAgIDAsIDAsCQkJLyogUldpbiwgTFdpbiAqLworICAgIDAJCQkJLyogbm8ga2V5ICovCit9OworICAgIAorCitzdGF0aWMgdm9pZCBpUG9kX2tleWJvYXJkKCkgCit7CisgICAgdW5zaWduZWQgY2hhciBrZXlidWZbMTI4XTsKKyAgICBpbnQgaSwgbnJlYWQ7CisgICAgU0RMX2tleXN5bSBrZXlzeW07CisgICAgU0RMX0V2ZW50IGV2OworCisgICAga2V5c3ltLm1vZCA9IDA7CisgICAga2V5c3ltLnNjYW5jb2RlID0gMHhmZjsKKyAgICBtZW1zZXQgKCZldiwgMCwgc2l6ZW9mKFNETF9FdmVudCkpOworCisgICAgbnJlYWQgPSByZWFkIChrYmZkLCBrZXlidWYsIDEyOCk7CisgICAgZm9yIChpID0gMDsgaSA8IG5yZWFkOyBpKyspIHsKKwljaGFyIGFzY2lpID0gaVBvZF9TQ19rZXltYXBba2V5YnVmW2ldICYgMHg3Zl07CisKKwlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJLZXkhICUwMnggaXMgJWMgJXMiLCBrZXlidWZbaV0sIGFzY2lpLCAoa2V5YnVmW2ldICYgMHg4MCk/ICJ1cCIgOiAiZG93biIpOworCisJa2V5c3ltLnN5bSA9IGtleXN5bS51bmljb2RlID0gYXNjaWk7CisJZXYudHlwZSA9IChrZXlidWZbaV0gJiAweDgwKT8gU0RMX0tFWVVQIDogU0RMX0tFWURPV047CisJZXYua2V5LnN0YXRlID0gMDsKKwlldi5rZXkua2V5c3ltID0ga2V5c3ltOworCVNETF9QdXNoRXZlbnQgKCZldik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpUG9kX1B1bXBFdmVudHMgKF9USElTKSAKK3sKKyAgICBmZF9zZXQgZmRzZXQ7CisgICAgaW50IG1heF9mZCA9IDA7CisgICAgc3RhdGljIHN0cnVjdCB0aW1ldmFsIHplcm87CisgICAgaW50IHBvc3RlZDsKKworICAgIGRvIHsKKwlwb3N0ZWQgPSAwOworCisJRkRfWkVSTyAoJmZkc2V0KTsKKwlpZiAoa2JmZCA+PSAwKSB7CisJICAgIEZEX1NFVCAoa2JmZCwgJmZkc2V0KTsKKwkgICAgbWF4X2ZkID0ga2JmZDsKKwl9CisJaWYgKGRiZ291dCkgZnByaW50ZiAoZGJnb3V0LCAiU2VsZWN0aW5nIik7CisJaWYgKHNlbGVjdCAobWF4X2ZkICsgMSwgJmZkc2V0LCAwLCAwLCAmemVybykgPiAwKSB7CisJICAgIGlmIChkYmdvdXQpIGZwcmludGYgKGRiZ291dCwgIiAtPiBtYXRjaCFcbiIpOworCSAgICBpUG9kX2tleWJvYXJkKCk7CisJICAgIHBvc3RlZCsrOworCX0KKwlpZiAoZGJnb3V0KSBmcHJpbnRmIChkYmdvdXQsICJcbiIpOworICAgIH0gd2hpbGUgKHBvc3RlZCk7Cit9CisKKy8vIGVub3VnaCBzcGFjZSBmb3IgMTYweDEyOHgyCitzdGF0aWMgY2hhciBpcG9kX3NjclsxNjAgKiAoMTI4LzQpXTsKKworI2RlZmluZSBvdXRsKGRhdHVtLGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoYWRkcikgPSAoZGF0dW0pKQorI2RlZmluZSBpbmwoYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShhZGRyKSkKKworLyoqKiBUaGUgZm9sbG93aW5nIExDRCBjb2RlIGlzIHRha2VuIGZyb20gTGludXgga2VybmVsIHVjbGludXgtMi40LjI0LXVjMC1pcG9kMiwKKyAgICAgZmlsZSBhcmNoL2FybW5vbW11L21hY2gtaXBvZC9mYi5jLiBBIGZldyBtb2RpZmljYXRpb25zIGhhdmUgYmVlbiBtYWRlLiAqKiovCisKKy8qIGdldCBjdXJyZW50IHVzZWMgY291bnRlciAqLworc3RhdGljIGludCBNX3RpbWVyX2dldF9jdXJyZW50KHZvaWQpCit7CisJcmV0dXJuIGlubChsY2RfcnRjKTsKK30KKworLyogY2hlY2sgaWYgbnVtYmVyIG9mIHVzZWNvbmRzIGhhcyBwYXN0ICovCitzdGF0aWMgaW50IE1fdGltZXJfY2hlY2soaW50IGNsb2NrX3N0YXJ0LCBpbnQgdXNlY3MpCit7CisJdW5zaWduZWQgbG9uZyBjbG9jazsKKwljbG9jayA9IGlubChsY2RfcnRjKTsKKwkKKwlpZiAoIChjbG9jayAtIGNsb2NrX3N0YXJ0KSA+PSB1c2VjcyApIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiB3YWl0IGZvciBMQ0Qgd2l0aCB0aW1lb3V0ICovCitzdGF0aWMgdm9pZCBNX2xjZF93YWl0X3dyaXRlKHZvaWQpCit7CisJaWYgKCAoaW5sKGxjZF9iYXNlKSAmIDB4ODAwMCkgIT0gMCApIHsKKwkJaW50IHN0YXJ0ID0gTV90aW1lcl9nZXRfY3VycmVudCgpOworCQkJCisJCWRvIHsKKwkJCWlmICggKGlubChsY2RfYmFzZSkgJiAodW5zaWduZWQgaW50KTB4ODAwMCkgPT0gMCApIAorCQkJCWJyZWFrOworCQl9IHdoaWxlICggTV90aW1lcl9jaGVjayhzdGFydCwgMTAwMCkgPT0gMCApOworCX0KK30KKworCisvKiBzZW5kIExDRCBkYXRhICovCitzdGF0aWMgdm9pZCBNX2xjZF9zZW5kX2RhdGEoaW50IGRhdGFfbG8sIGludCBkYXRhX2hpKQoreworCU1fbGNkX3dhaXRfd3JpdGUoKTsKKwkKKwlvdXRsKGRhdGFfbG8sIGxjZF9iYXNlICsgTENEX0RBVEEpOworCQkKKwlNX2xjZF93YWl0X3dyaXRlKCk7CisJCisJb3V0bChkYXRhX2hpLCBsY2RfYmFzZSArIExDRF9EQVRBKTsKKworfQorCisvKiBzZW5kIExDRCBjb21tYW5kICovCitzdGF0aWMgdm9pZAorTV9sY2RfcHJlcGFyZV9jbWQoaW50IGNtZCkKK3sKKwlNX2xjZF93YWl0X3dyaXRlKCk7CisKKwlvdXRsKDB4MCwgbGNkX2Jhc2UgKyBMQ0RfQ01EKTsKKworCU1fbGNkX3dhaXRfd3JpdGUoKTsKKwkKKwlvdXRsKGNtZCwgbGNkX2Jhc2UgKyBMQ0RfQ01EKTsKKwkKK30KKworLyogc2VuZCBMQ0QgY29tbWFuZCBhbmQgZGF0YSAqLworc3RhdGljIHZvaWQgTV9sY2RfY21kX2FuZF9kYXRhKGludCBjbWQsIGludCBkYXRhX2xvLCBpbnQgZGF0YV9oaSkKK3sKKwlNX2xjZF9wcmVwYXJlX2NtZChjbWQpOworCisJTV9sY2Rfc2VuZF9kYXRhKGRhdGFfbG8sIGRhdGFfaGkpOworfQorCisvLyBDb3BpZWQgZnJvbSB1Vworc3RhdGljIHZvaWQgTV91cGRhdGVfZGlzcGxheShpbnQgc3gsIGludCBzeSwgaW50IG14LCBpbnQgbXkpCit7CisJaW50IHk7CisJdW5zaWduZWQgc2hvcnQgY3Vyc29yX3BvczsKKworCXN4ID4+PSAzOworCW14ID4+PSAzOworCisJY3Vyc29yX3BvcyA9IHN4ICsgKHN5IDw8IDUpOworCisJZm9yICggeSA9IHN5OyB5IDw9IG15OyB5KysgKSB7CisJCXVuc2lnbmVkIGNoYXIgKmltZ19kYXRhOworCQlpbnQgeDsKKworCQkvKiBtb3ZlIHRoZSBjdXJzb3IgKi8KKwkJTV9sY2RfY21kX2FuZF9kYXRhKDB4MTEsIGN1cnNvcl9wb3MgPj4gOCwgY3Vyc29yX3BvcyAmIDB4ZmYpOworCisJCS8qIHNldHVwIGZvciBwcmludGluZyAqLworCQlNX2xjZF9wcmVwYXJlX2NtZCgweDEyKTsKKworCQlpbWdfZGF0YSA9IGlwb2Rfc2NyICsgKHN4IDw8IDEpICsgKHkgKiAobGNkX3dpZHRoLzQpKTsKKworCQkvKiBsb29wcyB1cCB0byAxNjAgdGltZXMgKi8KKwkJZm9yICggeCA9IHN4OyB4IDw9IG14OyB4KysgKSB7CisJCSAgICAgICAgLyogZGlzcGxheSBlaWdodCBwaXhlbHMgKi8KKwkJCU1fbGNkX3NlbmRfZGF0YSgqKGltZ19kYXRhICsgMSksICppbWdfZGF0YSk7CisKKwkJCWltZ19kYXRhICs9IDI7CisJCX0KKworCQkvKiB1cGRhdGUgY3Vyc29yIHBvcyBjb3VudGVyICovCisJCWN1cnNvcl9wb3MgKz0gMHgyMDsKKwl9Cit9CisKKy8qIGdldCBjdXJyZW50IHVzZWMgY291bnRlciAqLworc3RhdGljIGludCBDX3RpbWVyX2dldF9jdXJyZW50KHZvaWQpCit7CisJcmV0dXJuIGlubCgweDYwMDA1MDEwKTsKK30KKworLyogY2hlY2sgaWYgbnVtYmVyIG9mIHVzZWNvbmRzIGhhcyBwYXN0ICovCitzdGF0aWMgaW50IENfdGltZXJfY2hlY2soaW50IGNsb2NrX3N0YXJ0LCBpbnQgdXNlY3MpCit7CisJdW5zaWduZWQgbG9uZyBjbG9jazsKKwljbG9jayA9IGlubCgweDYwMDA1MDEwKTsKKwkKKwlpZiAoIChjbG9jayAtIGNsb2NrX3N0YXJ0KSA+PSB1c2VjcyApIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiB3YWl0IGZvciBMQ0Qgd2l0aCB0aW1lb3V0ICovCitzdGF0aWMgdm9pZCBDX2xjZF93YWl0X3dyaXRlKHZvaWQpCit7CisJaWYgKChpbmwoMHg3MDAwOEEwQykgJiAweDgwMDAwMDAwKSAhPSAwKSB7CisJCWludCBzdGFydCA9IENfdGltZXJfZ2V0X2N1cnJlbnQoKTsKKwkJCQorCQlkbyB7CisJCQlpZiAoKGlubCgweDcwMDA4QTBDKSAmIDB4ODAwMDAwMDApID09IDApIAorCQkJCWJyZWFrOworCQl9IHdoaWxlIChDX3RpbWVyX2NoZWNrKHN0YXJ0LCAxMDAwKSA9PSAwKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBDX2xjZF9jbWRfZGF0YShpbnQgY21kLCBpbnQgZGF0YSkKK3sKKwlDX2xjZF93YWl0X3dyaXRlKCk7CisJb3V0bChjbWQgfCAweDgwMDAwMDAwLCAweDcwMDA4QTBDKTsKKworCUNfbGNkX3dhaXRfd3JpdGUoKTsKKwlvdXRsKGRhdGEgfCAweDgwMDAwMDAwLCAweDcwMDA4QTBDKTsKK30KKworc3RhdGljIHZvaWQgQ191cGRhdGVfZGlzcGxheShpbnQgc3gsIGludCBzeSwgaW50IG14LCBpbnQgbXkpCit7CisJaW50IGhlaWdodCA9IChteSAtIHN5KSArIDE7CisJaW50IHdpZHRoID0gKG14IC0gc3gpICsgMTsKKworCWNoYXIgKmFkZHIgPSBTRExfVmlkZW9TdXJmYWNlLT5waXhlbHM7CisKKwlpZiAod2lkdGggJiAxKSB3aWR0aCsrOworCisJLyogc3RhcnQgWCBhbmQgWSAqLworCUNfbGNkX2NtZF9kYXRhKDB4MTIsIChzeSAmIDB4ZmYpKTsKKwlDX2xjZF9jbWRfZGF0YSgweDEzLCAoKChTRExfVmlkZW9TdXJmYWNlLT53IC0gMSkgLSBzeCkgJiAweGZmKSk7CisKKwkvKiBtYXggWCBhbmQgWSAqLworCUNfbGNkX2NtZF9kYXRhKDB4MTUsICgoKHN5ICsgaGVpZ2h0KSAtIDEpICYgMHhmZikpOworCUNfbGNkX2NtZF9kYXRhKDB4MTYsICgoKCgoU0RMX1ZpZGVvU3VyZmFjZS0+dyAtIDEpIC0gc3gpIC0gd2lkdGgpICsgMSkgJiAweGZmKSk7CisKKwlhZGRyICs9IHN4ICsgc3kgKiBTRExfVmlkZW9TdXJmYWNlLT5waXRjaDsKKworCXdoaWxlIChoZWlnaHQgPiAwKSB7CisJCWludCBoLCB4LCB5LCBwaXhlbHNfdG9fd3JpdGU7CisKKwkJcGl4ZWxzX3RvX3dyaXRlID0gKHdpZHRoICogaGVpZ2h0KSAqIDI7CisKKwkJLyogY2FsY3VsYXRlIGhvdyBtdWNoIHdlIGNhbiBkbyBpbiBvbmUgZ28gKi8KKwkJaCA9IGhlaWdodDsKKwkJaWYgKHBpeGVsc190b193cml0ZSA+IDY0MDAwKSB7CisJCQloID0gKDY0MDAwLzIpIC8gd2lkdGg7CisJCQlwaXhlbHNfdG9fd3JpdGUgPSAod2lkdGggKiBoKSAqIDI7CisJCX0KKworCQlvdXRsKDB4MTAwMDAwODAsIDB4NzAwMDhBMjApOworCQlvdXRsKChwaXhlbHNfdG9fd3JpdGUgLSAxKSB8IDB4QzAwMTAwMDAsIDB4NzAwMDhBMjQpOworCQlvdXRsKDB4MzQwMDAwMDAsIDB4NzAwMDhBMjApOworCisJCS8qIGZvciBlYWNoIHJvdyAqLworCQlmb3IgKHggPSAwOyB4IDwgaDsgeCsrKQorCQl7CisJCQkvKiBmb3IgZWFjaCBjb2x1bW4gKi8KKwkJCWZvciAoeSA9IDA7IHkgPCB3aWR0aDsgeSArPSAyKSB7CisJCQkJdW5zaWduZWQgdHdvX3BpeGVsczsKKworCQkJCXR3b19waXhlbHMgPSBhZGRyWzBdIHwgKGFkZHJbMV0gPDwgMTYpOworCQkJCWFkZHIgKz0gMjsKKworCQkJCXdoaWxlICgoaW5sKDB4NzAwMDhBMjApICYgMHgxMDAwMDAwKSA9PSAwKTsKKworCQkJCS8qIG91dHB1dCAyIHBpeGVscyAqLworCQkJCW91dGwodHdvX3BpeGVscywgMHg3MDAwOEIwMCk7CisJCQl9CisKKwkJCWFkZHIgKz0gU0RMX1ZpZGVvU3VyZmFjZS0+dyAtIHdpZHRoOworCQl9CisKKwkJd2hpbGUgKChpbmwoMHg3MDAwOEEyMCkgJiAweDQwMDAwMDApID09IDApOworCisJCW91dGwoMHgwLCAweDcwMDA4QTI0KTsKKworCQloZWlnaHQgPSBoZWlnaHQgLSBoOworCX0KK30KKworLy8gU2hvdWxkIHdvcmsgd2l0aCBwaG90by4gSG93ZXZlciwgSSBkb24ndCBoYXZlIG9uZSwgc28gSSdtIG5vdCBzdXJlLgorc3RhdGljIHZvaWQgaVBvZF9VcGRhdGVSZWN0cyAoX1RISVMsIGludCBucmVjdHMsIFNETF9SZWN0ICpyZWN0cykgCit7CisgICAgaWYgKFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsID09IDE2KSB7CisJQ191cGRhdGVfZGlzcGxheSAoMCwgMCwgbGNkX3dpZHRoLCBsY2RfaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworCWludCBpLCB5LCB4OworCWZvciAoaSA9IDA7IGkgPCBucmVjdHM7IGkrKykgeworCSAgICBTRExfUmVjdCAqciA9IHJlY3RzICsgaTsKKwkgICAgaWYgKCFyKSB7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIAorCSAgICBmb3IgKHkgPSByLT55OyAoeSA8IHItPnkgKyByLT5oKSAmJiB5IDwgbGNkX2hlaWdodDsgeSsrKSB7CisJCWZvciAoeCA9IHItPng7ICh4IDwgci0+eCArIHItPncpICYmIHggPCBsY2Rfd2lkdGg7IHgrKykgeworCQkgICAgaXBvZF9zY3JbeSoobGNkX3dpZHRoLzQpICsgeC80XSAmPSB+KDMgPDwgKDIgKiAoeCU0KSkpOworCQkgICAgaXBvZF9zY3JbeSoobGNkX3dpZHRoLzQpICsgeC80XSB8PQorCQkJKCgoVWludDgqKShTRExfVmlkZW9TdXJmYWNlLT5waXhlbHMpKVsgeSpTRExfVmlkZW9TdXJmYWNlLT5waXRjaCArIHggXSAmIDMpIDw8ICgyICogKHglNCkpOworCQl9CisJICAgIH0KKwl9CisJCisJTV91cGRhdGVfZGlzcGxheSAoMCwgMCwgbGNkX3dpZHRoLCBsY2RfaGVpZ2h0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL2lwb2QvU0RMX2lwb2R2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9pcG9kL1NETF9pcG9kdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjFlZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9pcG9kL1NETF9pcG9kdmlkZW8uaApAQCAtMCwwICsxLDM4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogaVBvZCBTREwgZnJhbWVidWZmZXIgZHJpdmVyCisgKiBKb3NodWEgT3JlbWFuCisgKiBNYWluIGhlYWRlciBmaWxlCisgKi8KKworI2lmbmRlZiBfU0RMX2lwb2R2aWRlb19oCisjZGVmaW5lIF9TRExfaXBvZHZpZGVvX2gKKworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKKyAgICBjaGFyICpidWZmZXI7CisgICAgaW50IHcsIGg7Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX2xvd3ZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbG93dmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RhYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX2xvd3ZpZGVvLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfbG93dmlkZW9faAorI2RlZmluZSBfU0RMX2xvd3ZpZGVvX2gKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKyNlbGlmIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAmJiAoVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+IDB4MDMzNSkKKyNpbmNsdWRlIDxDYXJib24uaD4KKyNlbHNlCisjaW5jbHVkZSA8UXVpY2tkcmF3Lmg+CisjaW5jbHVkZSA8UGFsZXR0ZXMuaD4KKyNpbmNsdWRlIDxNZW51cy5oPgorI2luY2x1ZGUgPERyYXdTcHJvY2tldC5oPgorI2VuZGlmCisKKyNpZiBTRExfVklERU9fT1BFTkdMCit0eXBlZGVmIHN0cnVjdCBfX0FHTENvbnRleHRSZWMgKkFHTENvbnRleHQ7CisjZW5kaWYKKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKKyNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICAvKiBub3QgYXZhaWxhYmxlIGluIE9TIFggKG9yIG1vcmUgYWNjdXJhdGVseSwgQ2FyYm9uKSAqLworLyogR2xvYmFsIFF1aWNrRHJhdyBkYXRhICovCitleHRlcm4gUURHbG9iYWxzICp0aGVRRDsKKyNlbmRpZgorCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKKwlHRGV2aWNlICoqU0RMX0Rpc3BsYXk7CisJV2luZG93UmVmIFNETF9XaW5kb3c7CisJU0RMX1JlY3QgKipTRExfbW9kZWxpc3Q7CisJQ1RhYkhhbmRsZSBTRExfQ1RhYjsKKwlQYWxldHRlSGFuZGxlIFNETF9DUGFsOworCisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisJLyogRm9yIGVudGVyaW5nIGFuZCBsZWF2aW5nIGZ1bGxzY3JlZW4gbW9kZSAqLworCVB0ciBmdWxsc2NyZWVuX2N0eDsKKyNlbmRpZgorCisJLyogVGhlIGN1cnJlbnQgd2luZG93IGRvY3VtZW50IHN0eWxlICovCisJaW50IGN1cnJlbnRfc3R5bGU7CisKKwkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBjdXJzb3IgcG9zaXRpb24gKi8KKwlQb2ludCBsYXN0X3doZXJlOworCisJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qga2V5cyBkb3duICovCisJRXZlbnRNb2RpZmllcnMgbGFzdF9tb2RzOworCUtleU1hcCBsYXN0X2tleXM7CisKKwkvKiBBIGhhbmRsZSB0byB0aGUgQXBwbGUgTWVudSAqLworCU1lbnVSZWYgYXBwbGVfbWVudTsKKworCS8qIEluZm9ybWF0aW9uIHVzZWQgYnkgRHJhd1Nwcm9ja2V0IGRyaXZlciAqLworCXN0cnVjdCBEU3BJbmZvICpkc3BpbmZvOworCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCUFHTENvbnRleHQgYXBwbGVHTENvbnRleHQ7CisKKwl2b2lkICpsaWJyYXJ5SGFuZGxlOworI2VuZGlmCit9OworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIFNETF9EaXNwbGF5CQkodGhpcy0+aGlkZGVuLT5TRExfRGlzcGxheSkKKyNkZWZpbmUgU0RMX1dpbmRvdwkJKHRoaXMtPmhpZGRlbi0+U0RMX1dpbmRvdykKKyNkZWZpbmUgU0RMX21vZGVsaXN0CQkodGhpcy0+aGlkZGVuLT5TRExfbW9kZWxpc3QpCisjZGVmaW5lIFNETF9DVGFiCQkodGhpcy0+aGlkZGVuLT5TRExfQ1RhYikKKyNkZWZpbmUgU0RMX0NQYWwJCSh0aGlzLT5oaWRkZW4tPlNETF9DUGFsKQorI2RlZmluZSBmdWxsc2NyZWVuX2N0eAkJKHRoaXMtPmhpZGRlbi0+ZnVsbHNjcmVlbl9jdHgpCisjZGVmaW5lIGN1cnJlbnRfc3R5bGUJCSh0aGlzLT5oaWRkZW4tPmN1cnJlbnRfc3R5bGUpCisjZGVmaW5lIGxhc3Rfd2hlcmUJCSh0aGlzLT5oaWRkZW4tPmxhc3Rfd2hlcmUpCisjZGVmaW5lIGxhc3RfbW9kcwkJKHRoaXMtPmhpZGRlbi0+bGFzdF9tb2RzKQorI2RlZmluZSBsYXN0X2tleXMJCSh0aGlzLT5oaWRkZW4tPmxhc3Rfa2V5cykKKyNkZWZpbmUgYXBwbGVfbWVudQkJKHRoaXMtPmhpZGRlbi0+YXBwbGVfbWVudSkKKyNkZWZpbmUgZ2xDb250ZXh0CQkodGhpcy0+aGlkZGVuLT5hcHBsZUdMQ29udGV4dCkKKworI2VuZGlmIC8qIF9TRExfbG93dmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2V2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlM2ZlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjZXZlbnRzLmMKQEAgLTAsMCArMSw3NDYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKyNlbGlmIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAmJiAoVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+IDB4MDMzNSkKKyNpbmNsdWRlIDxDYXJib24uaD4KKyNlbHNlCisjaW5jbHVkZSA8U2NyaXB0Lmg+CisjaW5jbHVkZSA8TG93TWVtLmg+CisjaW5jbHVkZSA8RGV2aWNlcy5oPgorI2luY2x1ZGUgPERpc2tJbml0Lmg+CisjaW5jbHVkZSA8VG9vbFV0aWxzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfc3lzd20uaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKKyNpbmNsdWRlICJTRExfbWFjZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfbWFja2V5cy5oIgorI2luY2x1ZGUgIlNETF9tYWNtb3VzZV9jLmgiCisKKy8qIERlZmluZSB0aGlzIHRvIGJlIGFibGUgdG8gY29sbGFwc2UgU0RMIHdpbmRvd3MuCisjZGVmaW5lIFVTRV9BUFBFQVJBTkNFX01BTkFHRVIKKyAqLworCisvKiBNYWNpbnRvc2ggcmVzb3VyY2UgY29uc3RhbnRzICovCisjZGVmaW5lIG1BcHBsZQkxMjgJCQkvKiBBcHBsZSBtZW51IHJlc291cmNlICovCisjZGVmaW5lIGlBYm91dAkxCQkJLyogQWJvdXQgbWVudSBpdGVtICovCisKKy8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIEFib3V0IG1lbnUgKi8KK3N0YXRpYyB2b2lkIE1hY19Eb0FwcGxlTWVudShfVEhJUywgbG9uZyBpdGVtKTsKKworLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gYSBtYWNpbnRvc2gga2V5IHNjYW5jb2RlIHRvIGEgU0RMIGtleXN5bSAqLworc3RhdGljIFNETEtleSBNQUNfa2V5bWFwWzI1Nl07CitzdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgaW50IG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgcHJlc3NlZCk7CisKKy8qIEhhbmRsZSBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24gIC0tIHJldHVybnMgd2hldGhlciBhbiBldmVudCB3YXMgcG9zdGVkICovCitzdGF0aWMgaW50IE1hY19IYW5kbGVBY3RpdmF0ZShpbnQgYWN0aXZhdGUpCit7CisJaWYgKCBhY3RpdmF0ZSApIHsKKwkJLyogU2hvdyB0aGUgY3VycmVudCBTREwgYXBwbGljYXRpb24gY3Vyc29yICovCisJCVNETF9TZXRDdXJzb3IoTlVMTCk7CisKKwkJLyogcHV0IG91ciBtYXNrIGJhY2sgY2FzZSBpdCBjaGFuZ2VkIGR1cmluZyBjb250ZXh0IHN3aXRjaCAqLworCQlTZXRFdmVudE1hc2soZXZlcnlFdmVudCAmIH5hdXRvS2V5TWFzayk7CisJfSBlbHNlIHsKKyNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKwkJeyBDdXJzb3IgY3Vyc29yOworCQkJU2V0Q3Vyc29yKEdldFFER2xvYmFsc0Fycm93KCZjdXJzb3IpKTsKKwkJfQorI2Vsc2UKKwkJU2V0Q3Vyc29yKCZ0aGVRRC0+YXJyb3cpOworI2VuZGlmCisJCWlmICggISBNYWNfY3Vyc29yX3Nob3dpbmcgKSB7CisJCQlTaG93Q3Vyc29yKCk7CisJCQlNYWNfY3Vyc29yX3Nob3dpbmcgPSAxOworCQl9CisJfQorCXJldHVybihTRExfUHJpdmF0ZUFwcEFjdGl2ZShhY3RpdmF0ZSwgU0RMX0FQUElOUFVURk9DVVMpKTsKK30KKworc3RhdGljIHZvaWQgbXlHbG9iYWxUb0xvY2FsKF9USElTLCBQb2ludCAqcHQpCit7CisJaWYgKCBTRExfVmlkZW9TdXJmYWNlICYmICEoU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MmU0RMX0ZVTExTQ1JFRU4pICkgeworCQlHcmFmUHRyIHNhdmVwb3J0OworCQlHZXRQb3J0KCZzYXZlcG9ydCk7CisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisJCVNldFBvcnQoR2V0V2luZG93UG9ydChTRExfV2luZG93KSk7CisjZWxzZQorCQlTZXRQb3J0KFNETF9XaW5kb3cpOworI2VuZGlmCisJCUdsb2JhbFRvTG9jYWwocHQpOworCQlTZXRQb3J0KHNhdmVwb3J0KTsKKwl9Cit9CisKKy8qIFRoZSBtYWluIE1hY09TIGV2ZW50IGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgTWFjX0hhbmRsZUV2ZW50cyhfVEhJUywgaW50IHdhaXQ0aXQpCit7CisJc3RhdGljIGludCBtb3VzZV9idXR0b24gPSAxOworCWludCBpOworCUV2ZW50UmVjb3JkIGV2ZW50OworCisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisJLyogVGhlcmUncyBubyBHZXRPU0V2ZW50KCkgaW4gdGhlIENhcmJvbiBBUEkuICpzaWdoKiAqLworI2RlZmluZSBjb29wZXJhdGl2ZV9tdWx0aXRhc2tpbmcgMQorI2Vsc2UKKwlpbnQgY29vcGVyYXRpdmVfbXVsdGl0YXNraW5nOworCS8qIElmIHdlJ3JlIHJ1bm5pbmcgZnVsbHNjcmVlbiwgd2UgY2FuIGhvZyB0aGUgTWFjT1MgZXZlbnRzLAorCSAgIG90aGVyd2lzZSB3ZSBoYWQgYmV0dGVyIHBsYXkgbmljZWx5IHdpdGggdGhlIG90aGVyIGFwcHMuCisJKi8KKwlpZiAoIHRoaXMtPnNjcmVlbiAmJiAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKKwkJY29vcGVyYXRpdmVfbXVsdGl0YXNraW5nID0gMDsKKwl9IGVsc2UgeworCQljb29wZXJhdGl2ZV9tdWx0aXRhc2tpbmcgPSAxOworCX0KKyNlbmRpZgorCisJLyogSWYgd2UgY2FsbCBXYWl0TmV4dEV2ZW50KCksIE1hY09TIHdpbGwgY2hlY2sgb3RoZXIgcHJvY2Vzc2VzCisJICogYW5kIGFsbG93IHRoZW0gdG8gcnVuLCBhbmQgcGVyZm9ybSBvdGhlciBoaWdoLWxldmVsIHByb2Nlc3NpbmcuCisJICovCisJaWYgKCBjb29wZXJhdGl2ZV9tdWx0aXRhc2tpbmcgfHwgd2FpdDRpdCApIHsKKwkJVUludDMyIHdhaXRfdGltZTsKKworCQkvKiBBcmUgd2UgcG9sbGluZyBvciBub3Q/ICovCisJCWlmICggd2FpdDRpdCApIHsKKwkJCXdhaXRfdGltZSA9IDIxNDc0ODM2NDc7CisJCX0gZWxzZSB7CisJCQl3YWl0X3RpbWUgPSAwOworCQl9CisJCVdhaXROZXh0RXZlbnQoZXZlcnlFdmVudCwgJmV2ZW50LCB3YWl0X3RpbWUsIG5pbCk7CisJfSBlbHNlIHsKKyNpZiAhIFRBUkdFVF9BUElfTUFDX0NBUkJPTgorCQlHZXRPU0V2ZW50KGV2ZXJ5RXZlbnQsICZldmVudCk7CisjZW5kaWYKKwl9CisKKyNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKwkvKiBmb3Igc29tZSByZWFzb24sIGV2ZW50LndoZXJlIGlzbid0IHNldCA/ICovCisJR2V0R2xvYmFsTW91c2UgKCAmZXZlbnQud2hlcmUgKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgZm9yIG1vdXNlIG1vdGlvbiAqLworCWlmICggKGV2ZW50LndoZXJlLmggIT0gbGFzdF93aGVyZS5oKSB8fAorCSAgICAgKGV2ZW50LndoZXJlLnYgIT0gbGFzdF93aGVyZS52KSApIHsKKwkJUG9pbnQgcHQ7CisJCXB0ID0gbGFzdF93aGVyZSA9IGV2ZW50LndoZXJlOworCQlteUdsb2JhbFRvTG9jYWwodGhpcywgJnB0KTsKKwkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCBwdC5oLCBwdC52KTsKKwl9CisKKwkvKiBDaGVjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQgKi8KKwlpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUElOUFVURk9DVVMgKSB7CisJCUtleU1hcCBrZXlzOworCQljb25zdCBVaW50MzIgKmtleXNwdHIgPSAoVWludDMyICopICZrZXlzOworCQljb25zdCBVaW50MzIgKmxhc3Rfa2V5c3B0ciA9IChVaW50MzIgKikgJmxhc3Rfa2V5czsKKworCQkvKiBDaGVjayBmb3Igc3BlY2lhbCBub24tZXZlbnQga2V5cyAqLworCQlpZiAoIGV2ZW50Lm1vZGlmaWVycyAhPSBsYXN0X21vZHMgKSB7CisJCQlzdGF0aWMgc3RydWN0IHsKKwkJCQlFdmVudE1vZGlmaWVycyBtYXNrOworCQkJCVNETEtleSBrZXk7CisJCQl9IG1vZHNbXSA9IHsKKwkJCQl7IGFscGhhTG9jaywJCVNETEtfQ0FQU0xPQ0sgfSwKKyNpZiAwIC8qIFRoZXNlIGFyZSBoYW5kbGVkIGJlbG93IGluIHRoZSBHZXRLZXlzKCkgY29kZSAqLworCQkJCXsgY21kS2V5LAkJU0RMS19MTUVUQSB9LAorCQkJCXsgc2hpZnRLZXksCQlTRExLX0xTSElGVCB9LAorCQkJCXsgcmlnaHRTaGlmdEtleSwJU0RMS19SU0hJRlQgfSwKKwkJCQl7IG9wdGlvbktleSwJCVNETEtfTEFMVCB9LAorCQkJCXsgcmlnaHRPcHRpb25LZXksCVNETEtfUkFMVCB9LAorCQkJCXsgY29udHJvbEtleSwJCVNETEtfTENUUkwgfSwKKwkJCQl7IHJpZ2h0Q29udHJvbEtleSwJU0RMS19SQ1RSTCB9LAorI2VuZGlmIC8qIDAgKi8KKwkJCQl7IDAsCQkJMCB9CisJCQl9OworCQkJU0RMX2tleXN5bSBrZXlzeW07CisJCQlVaW50OCBtb2RlOworCQkJRXZlbnRNb2RpZmllcnMgbW9kLCBtYXNrOworCQkKKworCQkJLyogU2V0IHVwIHRoZSBrZXlib2FyZCBldmVudCAqLworCQkJa2V5c3ltLnNjYW5jb2RlID0gMDsKKwkJCWtleXN5bS5zeW0gPSBTRExLX1VOS05PV047CisJCQlrZXlzeW0ubW9kID0gS01PRF9OT05FOworCQkJa2V5c3ltLnVuaWNvZGUgPSAwOworCisJCQkvKiBTZWUgd2hhdCBoYXMgY2hhbmdlZCwgYW5kIGdlbmVyYXRlIGV2ZW50cyAqLworCQkJbW9kID0gZXZlbnQubW9kaWZpZXJzOworCQkJZm9yICggaT0wOyBtb2RzW2ldLm1hc2s7ICsraSApIHsKKwkJCQltYXNrID0gbW9kc1tpXS5tYXNrOworCQkJCWlmICggKG1vZCZtYXNrKSAhPSAobGFzdF9tb2RzJm1hc2spICkgeworCQkJCQlrZXlzeW0uc3ltID0gbW9kc1tpXS5rZXk7CisJCQkJCWlmICggKG1vZCZtYXNrKSB8fAorCQkJCQkgICAgIChtb2RzW2ldLmtleSA9PSBTRExLX0NBUFNMT0NLKSApIHsKKwkJCQkJCW1vZGUgPSBTRExfUFJFU1NFRDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW1vZGUgPSBTRExfUkVMRUFTRUQ7CisJCQkJCX0KKwkJCQkJU0RMX1ByaXZhdGVLZXlib2FyZChtb2RlLCAma2V5c3ltKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFNhdmUgc3RhdGUgZm9yIG5leHQgdGltZSAqLworCQkJbGFzdF9tb2RzID0gbW9kOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIG5vcm1hbCBldmVudCBrZXlzLCBidXQgd2UgaGF2ZSB0byBzY2FuIHRoZQorCQkgICBhY3R1YWwga2V5Ym9hcmQgc3RhdGUgYmVjYXVzZSBvbiBNYWMgT1MgWCBhIGtleWRvd24gZXZlbnQKKwkJICAgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBrZXl1cCBldmVudC4KKwkJKi8KKwkJR2V0S2V5cyhrZXlzKTsKKwkJaWYgKCAoa2V5c3B0clswXSAhPSBsYXN0X2tleXNwdHJbMF0pIHx8CisJCSAgICAgKGtleXNwdHJbMV0gIT0gbGFzdF9rZXlzcHRyWzFdKSB8fAorCQkgICAgIChrZXlzcHRyWzJdICE9IGxhc3Rfa2V5c3B0clsyXSkgfHwKKwkJICAgICAoa2V5c3B0clszXSAhPSBsYXN0X2tleXNwdHJbM10pICkgeworCQkJU0RMX2tleXN5bSBrZXlzeW07CisJCQlpbnQgb2xkX2JpdCwgbmV3X2JpdDsKKworI2lmZGVmIERFQlVHX0tFWUJPQVJECisJCQlmcHJpbnRmKHN0ZXJyLCAiTmV3IGtleXM6IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCisJCQkJbmV3X2tleXNbMF0sIG5ld19rZXlzWzFdLAorCQkJCW5ld19rZXlzWzJdLCBuZXdfa2V5c1szXSk7CisjZW5kaWYKKwkJCWZvciAoIGk9MDsgaTwxMjg7ICsraSApIHsKKwkJCQlvbGRfYml0ID0gKCgoVWludDggKilsYXN0X2tleXMpW2kvOF0+PihpJTgpKSAmIDB4MDE7CisJCQkJbmV3X2JpdCA9ICgoKFVpbnQ4ICopa2V5cylbaS84XT4+KGklOCkpICYgMHgwMTsKKwkJCQlpZiAoIG9sZF9iaXQgIT0gbmV3X2JpdCApIHsKKwkJCQkJLyogUG9zdCB0aGUga2V5Ym9hcmQgZXZlbnQgKi8KKyNpZmRlZiBERUJVR19LRVlCT0FSRAorCQkJCQlmcHJpbnRmKHN0ZGVyciwiU2NhbmNvZGU6IDB4JTIuMlhcbiIsaSk7CisjZW5kaWYKKwkJCQkJU0RMX1ByaXZhdGVLZXlib2FyZChuZXdfYml0LAorCQkJCSAgICAgICAgICAgIFRyYW5zbGF0ZUtleShpLCBldmVudC5tb2RpZmllcnMsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlzeW0sIG5ld19iaXQpKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFNhdmUgc3RhdGUgZm9yIG5leHQgdGltZSAqLworCQkJbGFzdF9rZXlzWzBdID0ga2V5c1swXTsKKwkJCWxhc3Rfa2V5c1sxXSA9IGtleXNbMV07CisJCQlsYXN0X2tleXNbMl0gPSBrZXlzWzJdOworCQkJbGFzdF9rZXlzWzNdID0ga2V5c1szXTsKKwkJfQorCX0KKworCS8qIEhhbmRsZSBub3JtYWwgZXZlbnRzICovCisJc3dpdGNoIChldmVudC53aGF0KSB7CisJICBjYXNlIG1vdXNlRG93bjogeworCQlXaW5kb3dSZWYgd2luOworCQlzaG9ydCBhcmVhOworCQkJCQorCQlhcmVhID0gRmluZFdpbmRvdyhldmVudC53aGVyZSwgJndpbik7CisJCS8qIFN1cHBvcnQgc3dpdGNoaW5nIGJldHdlZW4gdGhlIFNJT1VYIGNvbnNvbGUKKwkJICAgYW5kIFNETF9XaW5kb3cgYnkgY2xpY2tpbmcgaW4gdGhlIHdpbmRvdy4KKwkJICovCisJCWlmICggd2luICYmICh3aW4gIT0gRnJvbnRXaW5kb3coKSkgKSB7CisJCQlTZWxlY3RXaW5kb3cod2luKTsKKwkJfSAKKwkJc3dpdGNoIChhcmVhKSB7CisJCSAgY2FzZSBpbk1lbnVCYXI6IC8qIE9ubHkgdGhlIGFwcGxlIG1lbnUgZXhpc3RzICovCisJCQlNYWNfRG9BcHBsZU1lbnUodGhpcywgTWVudVNlbGVjdChldmVudC53aGVyZSkpOworCQkJSGlsaXRlTWVudSgwKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgaW5EcmFnOgorI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgorCQkJRHJhZ1dpbmRvdyh3aW4sIGV2ZW50LndoZXJlLCBOVUxMKTsKKyNlbHNlCisJCQlEcmFnV2luZG93KHdpbiwgZXZlbnQud2hlcmUsICZ0aGVRRC0+c2NyZWVuQml0cy5ib3VuZHMpOworI2VuZGlmCisJCQlicmVhazsKKwkJICBjYXNlIGluR29Bd2F5OgorCQkJaWYgKCBUcmFja0dvQXdheSh3aW4sIGV2ZW50LndoZXJlKSApIHsKKwkJCQlTRExfUHJpdmF0ZVF1aXQoKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgIGNhc2UgaW5Db250ZW50OgorCQkJbXlHbG9iYWxUb0xvY2FsKHRoaXMsICZldmVudC53aGVyZSk7CisJCQkvKiBUcmVhdCBjb21tYW5kLWNsaWNrIGFzIHJpZ2h0IG1vdXNlIGJ1dHRvbiAqLworCQkJaWYgKCBldmVudC5tb2RpZmllcnMgJiBvcHRpb25LZXkgKSB7CisJCQkJbW91c2VfYnV0dG9uID0gMjsKKwkJCX0gZWxzZSBpZiAoIGV2ZW50Lm1vZGlmaWVycyAmIGNtZEtleSApIHsKKwkJCQltb3VzZV9idXR0b24gPSAzOworCQkJfSBlbHNlIHsKKwkJCQltb3VzZV9idXR0b24gPSAxOworCQkJfQorCQkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwKKwkJCQltb3VzZV9idXR0b24sIGV2ZW50LndoZXJlLmgsIGV2ZW50LndoZXJlLnYpOworCQkJYnJlYWs7CisJCSAgY2FzZSBpbkdyb3c6IHsKKwkJCWludCBuZXdTaXplOworCisJCQkvKiBEb24ndCBhbGxvdyByZXNpemUgaWYgdmlkZW8gbW9kZSBpc24ndCByZXNpemFibGUgKi8KKwkJCWlmICggISBTRExfUHVibGljU3VyZmFjZSB8fAorCQkJICAgICAhIChTRExfUHVibGljU3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkVTSVpBQkxFKSApIHsKKwkJCQlicmVhazsKKwkJCX0KKyNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKwkJCW5ld1NpemUgPSBHcm93V2luZG93KHdpbiwgZXZlbnQud2hlcmUsIE5VTEwpOworI2Vsc2UKKwkJCW5ld1NpemUgPSBHcm93V2luZG93KHdpbiwgZXZlbnQud2hlcmUsICZ0aGVRRC0+c2NyZWVuQml0cy5ib3VuZHMpOworI2VuZGlmCisJCQlpZiAoIG5ld1NpemUgKSB7CisjaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgorCQkJCUVyYXNlUmVjdCAoICZ0aGVRRC0+c2NyZWVuQml0cy5ib3VuZHMgKTsKKyNlbmRpZgorCQkJCVNpemVXaW5kb3cgKCB3aW4sIExvV29yZCAobmV3U2l6ZSksIEhpV29yZCAobmV3U2l6ZSksIDEgKTsKKwkJCQlTRExfUHJpdmF0ZVJlc2l6ZSAoIExvV29yZCAobmV3U2l6ZSksIEhpV29yZCAobmV3U2l6ZSkgKTsKKwkJCX0KKwkJICAJfSBicmVhazsKKwkJICBjYXNlIGluWm9vbUluOgorCQkgIGNhc2UgaW5ab29tT3V0OgorCQkJaWYgKCBUcmFja0JveCAod2luLCBldmVudC53aGVyZSwgYXJlYSApKSB7CisJCQkJUmVjdCByZWN0OworI2lmICFUQVJHRVRfQVBJX01BQ19DQVJCT04KKwkJCQlFcmFzZVJlY3QgKCAmdGhlUUQtPnNjcmVlbkJpdHMuYm91bmRzICk7CisjZW5kaWYKKwkJCQlab29tV2luZG93ICggd2luLCBhcmVhLCAwKTsKKwkJCQlpZiAoIGFyZWEgPT0gaW5ab29tSW4gKSB7CisJCQkJCUdldFdpbmRvd1VzZXJTdGF0ZShTRExfV2luZG93LCAmcmVjdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJR2V0V2luZG93U3RhbmRhcmRTdGF0ZShTRExfV2luZG93LCAmcmVjdCk7CisJCQkJfQorCQkJCVNETF9Qcml2YXRlUmVzaXplIChyZWN0LnJpZ2h0LXJlY3QubGVmdCwKKwkJCQkgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20tcmVjdC50b3ApOworCQkJfQorCQkJYnJlYWs7CisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisJCSAgY2FzZSBpbkNvbGxhcHNlQm94OgorCQkJaWYgKCBUcmFja0JveCAod2luLCBldmVudC53aGVyZSwgYXJlYSApKSB7CisJCQkJaWYgKCBJc1dpbmRvd0NvbGxhcHNhYmxlKHdpbikgKSB7CisJCQkJCUNvbGxhcHNlV2luZG93ICh3aW4sICFJc1dpbmRvd0NvbGxhcHNlZCh3aW4pKTsKKwkJCQkJLyogVGhlcmUgc2hvdWxkIGJlIHNvbWV0aGluZyBkb25lIGxpa2UgaW4gaW5Hcm93IGNhc2UsIGJ1dC4uLiAqLworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8qIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAqLworCQkgIGNhc2UgaW5TeXNXaW5kb3c6CisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisJCQkvKiBOZXZlciBoYXBwZW5zIGluIENhcmJvbj8gKi8KKyNlbHNlCisJCQlTeXN0ZW1DbGljaygmZXZlbnQsIHdpbik7CisjZW5kaWYKKwkJCWJyZWFrOworCQkgIGRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCSAgfQorCSAgYnJlYWs7CisJICBjYXNlIG1vdXNlVXA6IHsKKwkJbXlHbG9iYWxUb0xvY2FsKHRoaXMsICZldmVudC53aGVyZSk7CisJCS8qIFJlbGVhc2UgdGhlIG1vdXNlIGJ1dHRvbiB3ZSBzaW11bGF0ZWQgaW4gdGhlIGxhc3QgcHJlc3MuCisJCSAgIFRoZSBkcmF3YmFjayBvZiB0aGlzIG1ldGhvcyBpcyB3ZSBjYW5ub3QgcHJlc3MgbW9yZSB0aGFuCisJCSAgIG9uZSBidXR0b24uIEhvd2V2ZXIsIHRoaXMgZG9lc24ndCBtYXR0ZXIsIHNpbmNlIHRoZXJlIGlzCisJCSAgIG9ubHkgYSBzaW5nbGUgbG9naWNhbCBtb3VzZSBidXR0b24sIGV2ZW4gaWYgeW91IGhhdmUgYQorCQkgICBtdWx0aS1idXR0b24gbW91c2UsIHRoaXMgZG9lc24ndCBtYXR0ZXIgYXQgYWxsLgorCQkgKi8KKwkJU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsCisJCQltb3VzZV9idXR0b24sIGV2ZW50LndoZXJlLmgsIGV2ZW50LndoZXJlLnYpOworCSAgfQorCSAgYnJlYWs7CisjaWYgMCAvKiBIYW5kbGVkIGFib3ZlIHRoZSBzd2l0Y2ggc3RhdGVtZW50ICovCisJICBjYXNlIGtleURvd246IHsKKwkJU0RMX2tleXN5bSBrZXlzeW07CisKKwkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwKKwkJCVRyYW5zbGF0ZUtleSgoZXZlbnQubWVzc2FnZSZrZXlDb2RlTWFzayk+PjgKKwkJICAgICAgICAgICAgICAgICAgICAgZXZlbnQubW9kaWZpZXJzLCAma2V5c3ltLCAxKSk7CisJICB9CisJICBicmVhazsKKwkgIGNhc2Uga2V5VXA6IHsKKwkJU0RMX2tleXN5bSBrZXlzeW07CisKKwkJU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsCisJCQlUcmFuc2xhdGVLZXkoKGV2ZW50Lm1lc3NhZ2Uma2V5Q29kZU1hc2spPj44CisJCSAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm1vZGlmaWVycywgJmtleXN5bSwgMCkpOworCSAgfQorCSAgYnJlYWs7CisjZW5kaWYKKwkgIGNhc2UgdXBkYXRlRXZ0OiB7CisJCUJlZ2luVXBkYXRlKFNETF9XaW5kb3cpOworCSNpZiBTRExfVklERU9fT1BFTkdMCisJCWlmIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9PUEVOR0wpCisJCQlTRExfR0xfU3dhcEJ1ZmZlcnMoKTsKKwkJZWxzZQorCSNlbmRpZgorCQlpZiAoIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09CisJCQkJCQlTRExfU1dTVVJGQUNFICkgeworCQkJU0RMX1VwZGF0ZVJlY3QoU0RMX1ZpZGVvU3VyZmFjZSwgMCwgMCwgMCwgMCk7CisJCX0KKwkJRW5kVXBkYXRlKFNETF9XaW5kb3cpOworCSAgfQorCSAgLyogSWYgdGhpcyB3YXMgYW4gdXBkYXRlIGV2ZW50IGZvciB0aGUgU0lPVVggY29uc29sZSwgd2UgcmV0dXJuIDAKKyAgICAgICAgICAgICBpbiBvcmRlciB0byBzdG9wIGFuIGVuZGxlc3Mgc2VyaWVzIG9mIHVwZGF0ZXMgYmVpbmcgdHJpZ2dlcmVkLgorCSAgKi8KKwkgIGlmICggKFdpbmRvd1JlZikgZXZlbnQubWVzc2FnZSAhPSBTRExfV2luZG93ICkgeworCQlyZXR1cm4gMDsKKwkgIH0KKwkgIGJyZWFrOworCSAgY2FzZSBhY3RpdmF0ZUV2dDogeworCQlNYWNfSGFuZGxlQWN0aXZhdGUoISEoZXZlbnQubW9kaWZpZXJzICYgYWN0aXZlRmxhZykpOworCSAgfQorCSAgYnJlYWs7CisJICBjYXNlIGRpc2tFdnQ6IHsKKyNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKwkJLyogV2hhdCBhcmUgd2Ugc3VwcG9zZWQgdG8gZG8/ICovOworI2Vsc2UKKwkJaWYgKCAoKGV2ZW50Lm1lc3NhZ2U+PjE2KSYweEZGRkYpICE9IG5vRXJyICkgeworCQkJUG9pbnQgc3BvdDsKKwkJCVNldFB0KCZzcG90LCAweDAwNzAsIDB4MDA1MCk7CisJCQlESUJhZE1vdW50KHNwb3QsIGV2ZW50Lm1lc3NhZ2UpOworCQl9CisjZW5kaWYKKwkgIH0KKwkgIGJyZWFrOworCSAgY2FzZSBvc0V2dDogeworCQlzd2l0Y2ggKChldmVudC5tZXNzYWdlPj4yNCkgJiAweEZGKSB7CisjaWYgMCAvKiBIYW5kbGVkIGFib3ZlIHRoZSBzd2l0Y2ggc3RhdGVtZW50ICovCisJCSAgY2FzZSBtb3VzZU1vdmVkTWVzc2FnZTogeworCQkJbXlHbG9iYWxUb0xvY2FsKHRoaXMsICZldmVudC53aGVyZSk7CisJCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsCisJCQkJCWV2ZW50LndoZXJlLmgsIGV2ZW50LndoZXJlLnYpOworCQkgIH0KKwkJICBicmVhazsKKyNlbmRpZiAvKiAwICovCisJCSAgY2FzZSBzdXNwZW5kUmVzdW1lTWVzc2FnZTogeworCQkJTWFjX0hhbmRsZUFjdGl2YXRlKCEhKGV2ZW50Lm1lc3NhZ2UgJiByZXN1bWVGbGFnKSk7CisJCSAgfQorCQkgIGJyZWFrOworCQl9CisJICB9CisJICBicmVhazsKKwkgIGRlZmF1bHQ6IHsKKwkJOworCSAgfQorCSAgYnJlYWs7CisJfQorCXJldHVybiAoZXZlbnQud2hhdCAhPSBudWxsRXZlbnQpOworfQorCisKK3ZvaWQgTWFjX1B1bXBFdmVudHMoX1RISVMpCit7CisJLyogUHJvY2VzcyBwZW5kaW5nIE1hY09TIGV2ZW50cyAqLworCXdoaWxlICggTWFjX0hhbmRsZUV2ZW50cyh0aGlzLCAwKSApIHsKKwkJLyogTG9vcCBhbmQgY2hlY2sgYWdhaW4gKi87CisJfQorfQorCit2b2lkIE1hY19Jbml0T1NLZXltYXAoX1RISVMpCit7CisJY29uc3Qgdm9pZCAqS0NIUlB0cjsKKwlVSW50MzIgc3RhdGU7CisJVUludDMyIHZhbHVlOworCWludCBpOworCWludCB3b3JsZCA9IFNETEtfV09STERfMDsKKworCS8qIE1hcCB0aGUgTUFDIGtleXN5bXMgKi8KKwlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShNQUNfa2V5bWFwKTsgKytpICkKKwkJTUFDX2tleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKKworCS8qIERlZmluZWQgTUFDXyogY29uc3RhbnRzICovCisJTUFDX2tleW1hcFtNS19FU0NBUEVdID0gU0RMS19FU0NBUEU7CisJTUFDX2tleW1hcFtNS19GMV0gPSBTRExLX0YxOworCU1BQ19rZXltYXBbTUtfRjJdID0gU0RMS19GMjsKKwlNQUNfa2V5bWFwW01LX0YzXSA9IFNETEtfRjM7CisJTUFDX2tleW1hcFtNS19GNF0gPSBTRExLX0Y0OworCU1BQ19rZXltYXBbTUtfRjVdID0gU0RMS19GNTsKKwlNQUNfa2V5bWFwW01LX0Y2XSA9IFNETEtfRjY7CisJTUFDX2tleW1hcFtNS19GN10gPSBTRExLX0Y3OworCU1BQ19rZXltYXBbTUtfRjhdID0gU0RMS19GODsKKwlNQUNfa2V5bWFwW01LX0Y5XSA9IFNETEtfRjk7CisJTUFDX2tleW1hcFtNS19GMTBdID0gU0RMS19GMTA7CisJTUFDX2tleW1hcFtNS19GMTFdID0gU0RMS19GMTE7CisJTUFDX2tleW1hcFtNS19GMTJdID0gU0RMS19GMTI7CisJTUFDX2tleW1hcFtNS19QUklOVF0gPSBTRExLX1BSSU5UOworCU1BQ19rZXltYXBbTUtfU0NST0xMT0NLXSA9IFNETEtfU0NST0xMT0NLOworCU1BQ19rZXltYXBbTUtfUEFVU0VdID0gU0RMS19QQVVTRTsKKwlNQUNfa2V5bWFwW01LX1BPV0VSXSA9IFNETEtfUE9XRVI7CisJTUFDX2tleW1hcFtNS19CQUNLUVVPVEVdID0gU0RMS19CQUNLUVVPVEU7CisJTUFDX2tleW1hcFtNS18xXSA9IFNETEtfMTsKKwlNQUNfa2V5bWFwW01LXzJdID0gU0RMS18yOworCU1BQ19rZXltYXBbTUtfM10gPSBTRExLXzM7CisJTUFDX2tleW1hcFtNS180XSA9IFNETEtfNDsKKwlNQUNfa2V5bWFwW01LXzVdID0gU0RMS181OworCU1BQ19rZXltYXBbTUtfNl0gPSBTRExLXzY7CisJTUFDX2tleW1hcFtNS183XSA9IFNETEtfNzsKKwlNQUNfa2V5bWFwW01LXzhdID0gU0RMS184OworCU1BQ19rZXltYXBbTUtfOV0gPSBTRExLXzk7CisJTUFDX2tleW1hcFtNS18wXSA9IFNETEtfMDsKKwlNQUNfa2V5bWFwW01LX01JTlVTXSA9IFNETEtfTUlOVVM7CisJTUFDX2tleW1hcFtNS19FUVVBTFNdID0gU0RMS19FUVVBTFM7CisJTUFDX2tleW1hcFtNS19CQUNLU1BBQ0VdID0gU0RMS19CQUNLU1BBQ0U7CisJTUFDX2tleW1hcFtNS19JTlNFUlRdID0gU0RMS19JTlNFUlQ7CisJTUFDX2tleW1hcFtNS19IT01FXSA9IFNETEtfSE9NRTsKKwlNQUNfa2V5bWFwW01LX1BBR0VVUF0gPSBTRExLX1BBR0VVUDsKKwlNQUNfa2V5bWFwW01LX05VTUxPQ0tdID0gU0RMS19OVU1MT0NLOworCU1BQ19rZXltYXBbTUtfS1BfRVFVQUxTXSA9IFNETEtfS1BfRVFVQUxTOworCU1BQ19rZXltYXBbTUtfS1BfRElWSURFXSA9IFNETEtfS1BfRElWSURFOworCU1BQ19rZXltYXBbTUtfS1BfTVVMVElQTFldID0gU0RMS19LUF9NVUxUSVBMWTsKKwlNQUNfa2V5bWFwW01LX1RBQl0gPSBTRExLX1RBQjsKKwlNQUNfa2V5bWFwW01LX3FdID0gU0RMS19xOworCU1BQ19rZXltYXBbTUtfd10gPSBTRExLX3c7CisJTUFDX2tleW1hcFtNS19lXSA9IFNETEtfZTsKKwlNQUNfa2V5bWFwW01LX3JdID0gU0RMS19yOworCU1BQ19rZXltYXBbTUtfdF0gPSBTRExLX3Q7CisJTUFDX2tleW1hcFtNS195XSA9IFNETEtfeTsKKwlNQUNfa2V5bWFwW01LX3VdID0gU0RMS191OworCU1BQ19rZXltYXBbTUtfaV0gPSBTRExLX2k7CisJTUFDX2tleW1hcFtNS19vXSA9IFNETEtfbzsKKwlNQUNfa2V5bWFwW01LX3BdID0gU0RMS19wOworCU1BQ19rZXltYXBbTUtfTEVGVEJSQUNLRVRdID0gU0RMS19MRUZUQlJBQ0tFVDsKKwlNQUNfa2V5bWFwW01LX1JJR0hUQlJBQ0tFVF0gPSBTRExLX1JJR0hUQlJBQ0tFVDsKKwlNQUNfa2V5bWFwW01LX0JBQ0tTTEFTSF0gPSBTRExLX0JBQ0tTTEFTSDsKKwlNQUNfa2V5bWFwW01LX0RFTEVURV0gPSBTRExLX0RFTEVURTsKKwlNQUNfa2V5bWFwW01LX0VORF0gPSBTRExLX0VORDsKKwlNQUNfa2V5bWFwW01LX1BBR0VET1dOXSA9IFNETEtfUEFHRURPV047CisJTUFDX2tleW1hcFtNS19LUDddID0gU0RMS19LUDc7CisJTUFDX2tleW1hcFtNS19LUDhdID0gU0RMS19LUDg7CisJTUFDX2tleW1hcFtNS19LUDldID0gU0RMS19LUDk7CisJTUFDX2tleW1hcFtNS19LUF9NSU5VU10gPSBTRExLX0tQX01JTlVTOworCU1BQ19rZXltYXBbTUtfQ0FQU0xPQ0tdID0gU0RMS19DQVBTTE9DSzsKKwlNQUNfa2V5bWFwW01LX2FdID0gU0RMS19hOworCU1BQ19rZXltYXBbTUtfc10gPSBTRExLX3M7CisJTUFDX2tleW1hcFtNS19kXSA9IFNETEtfZDsKKwlNQUNfa2V5bWFwW01LX2ZdID0gU0RMS19mOworCU1BQ19rZXltYXBbTUtfZ10gPSBTRExLX2c7CisJTUFDX2tleW1hcFtNS19oXSA9IFNETEtfaDsKKwlNQUNfa2V5bWFwW01LX2pdID0gU0RMS19qOworCU1BQ19rZXltYXBbTUtfa10gPSBTRExLX2s7CisJTUFDX2tleW1hcFtNS19sXSA9IFNETEtfbDsKKwlNQUNfa2V5bWFwW01LX1NFTUlDT0xPTl0gPSBTRExLX1NFTUlDT0xPTjsKKwlNQUNfa2V5bWFwW01LX1FVT1RFXSA9IFNETEtfUVVPVEU7CisJTUFDX2tleW1hcFtNS19SRVRVUk5dID0gU0RMS19SRVRVUk47CisJTUFDX2tleW1hcFtNS19LUDRdID0gU0RMS19LUDQ7CisJTUFDX2tleW1hcFtNS19LUDVdID0gU0RMS19LUDU7CisJTUFDX2tleW1hcFtNS19LUDZdID0gU0RMS19LUDY7CisJTUFDX2tleW1hcFtNS19LUF9QTFVTXSA9IFNETEtfS1BfUExVUzsKKwlNQUNfa2V5bWFwW01LX0xTSElGVF0gPSBTRExLX0xTSElGVDsKKwlNQUNfa2V5bWFwW01LX3pdID0gU0RMS196OworCU1BQ19rZXltYXBbTUtfeF0gPSBTRExLX3g7CisJTUFDX2tleW1hcFtNS19jXSA9IFNETEtfYzsKKwlNQUNfa2V5bWFwW01LX3ZdID0gU0RMS192OworCU1BQ19rZXltYXBbTUtfYl0gPSBTRExLX2I7CisJTUFDX2tleW1hcFtNS19uXSA9IFNETEtfbjsKKwlNQUNfa2V5bWFwW01LX21dID0gU0RMS19tOworCU1BQ19rZXltYXBbTUtfQ09NTUFdID0gU0RMS19DT01NQTsKKwlNQUNfa2V5bWFwW01LX1BFUklPRF0gPSBTRExLX1BFUklPRDsKKwlNQUNfa2V5bWFwW01LX1NMQVNIXSA9IFNETEtfU0xBU0g7CisjaWYgMAkvKiBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgdGhlIGxlZnQgdmVyc2lvbnMgLSB1c2UgbGVmdCBieSBkZWZhdWx0ICovCisJTUFDX2tleW1hcFtNS19SU0hJRlRdID0gU0RMS19SU0hJRlQ7CisjZW5kaWYKKwlNQUNfa2V5bWFwW01LX1VQXSA9IFNETEtfVVA7CisJTUFDX2tleW1hcFtNS19LUDFdID0gU0RMS19LUDE7CisJTUFDX2tleW1hcFtNS19LUDJdID0gU0RMS19LUDI7CisJTUFDX2tleW1hcFtNS19LUDNdID0gU0RMS19LUDM7CisJTUFDX2tleW1hcFtNS19LUF9FTlRFUl0gPSBTRExLX0tQX0VOVEVSOworCU1BQ19rZXltYXBbTUtfTENUUkxdID0gU0RMS19MQ1RSTDsKKwlNQUNfa2V5bWFwW01LX0xBTFRdID0gU0RMS19MQUxUOworCU1BQ19rZXltYXBbTUtfTE1FVEFdID0gU0RMS19MTUVUQTsKKwlNQUNfa2V5bWFwW01LX1NQQUNFXSA9IFNETEtfU1BBQ0U7CisjaWYgMAkvKiBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgdGhlIGxlZnQgdmVyc2lvbnMgLSB1c2UgbGVmdCBieSBkZWZhdWx0ICovCisJTUFDX2tleW1hcFtNS19STUVUQV0gPSBTRExLX1JNRVRBOworCU1BQ19rZXltYXBbTUtfUkFMVF0gPSBTRExLX1JBTFQ7CisJTUFDX2tleW1hcFtNS19SQ1RSTF0gPSBTRExLX1JDVFJMOworI2VuZGlmCisJTUFDX2tleW1hcFtNS19MRUZUXSA9IFNETEtfTEVGVDsKKwlNQUNfa2V5bWFwW01LX0RPV05dID0gU0RMS19ET1dOOworCU1BQ19rZXltYXBbTUtfUklHSFRdID0gU0RMS19SSUdIVDsKKwlNQUNfa2V5bWFwW01LX0tQMF0gPSBTRExLX0tQMDsKKwlNQUNfa2V5bWFwW01LX0tQX1BFUklPRF0gPSBTRExLX0tQX1BFUklPRDsKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQorCS8qIFdpZXJkLCB0aGVzZSBrZXlzIGFyZSBvbiBteSBpQm9vayB1bmRlciBNYWMgT1MgWAorCSAgIE5vdGUgdGhhdCB0aGUgbGVmdCBhcnJvdyBrZXlzeW0gaXMgdGhlIHNhbWUgYXMgbGVmdCBjdHJsIT8KKwkgKi8KKwlNQUNfa2V5bWFwW01LX0lCT09LX0VOVEVSXSA9IFNETEtfS1BfRU5URVI7CisJTUFDX2tleW1hcFtNS19JQk9PS19SSUdIVF0gPSBTRExLX1JJR0hUOworCU1BQ19rZXltYXBbTUtfSUJPT0tfRE9XTl0gPSBTRExLX0RPV047CisJTUFDX2tleW1hcFtNS19JQk9PS19VUF0gPSBTRExLX1VQOworCU1BQ19rZXltYXBbTUtfSUJPT0tfTEVGVF0gPSBTRExLX0xFRlQ7CisjZW5kaWYgLyogTWFjIE9TIFggKi8KKworCS8qIFVwIHRoZXJlIHdlIHNldHVwIGEgc3RhdGljIHNjYW5jb2RlLT5rZXlzeW0gbWFwLiBIb3dldmVyLCBpdCB3aWxsIG5vdAorCSAqIHdvcmsgdmVyeSB3ZWxsIG9uIGludGVybmF0aW9uYWwga2V5Ym9hcmQuIEhlbmNlIHdlIG5vdyBxdWVyeSBNYWNPUworCSAqIGZvciBpdHMgb3duIGtleW1hcCB0byBhZGp1c3Qgb3VyIG93biBtYXBwaW5nIHRhYmxlLiBIb3dldmVyLCB0aGlzIGlzCisJICogYmFzY2lhbGx5IG9ubHkgdXNlZnVsIGZvciBhc2NpaSBjaGFyIGtleXMuIFRoaXMgaXMgYWxzbyB0aGUgcmVhc29uCisJICogd2h5IHdlIGtlZXAgdGhlIHN0YXRpYyB0YWJsZSwgdG9vLgorCSAqLworCQorCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIHN5c3RlbXMgY2FjaGVkIEtDSFIgKi8KKwlLQ0hSUHRyID0gKHZvaWQgKilHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21LQ0hSQ2FjaGUpOworCWlmIChLQ0hSUHRyKQorCXsKKwkJLyogTG9vcCBvdmVyIGFsbCAxMjcgcG9zc2libGUgc2NhbiBjb2RlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMHg3RjsgaSsrKQorCQl7CisJCQkvKiBXZSBwcmV0ZW5kIGEgY2xlYW4gc3RhcnQgdG8gYmVnaW4gd2l0aCAoaS5lLiBubyBkZWFkIGtleXMgYWN0aXZlICovCisJCQlzdGF0ZSA9IDA7CisJCQkKKwkJCS8qIE5vdyB0cmFuc2xhdGUgdGhlIGtleSBjb2RlIHRvIGEga2V5IHZhbHVlICovCisJCQl2YWx1ZSA9IEtleVRyYW5zbGF0ZShLQ0hSUHRyLCBpLCAmc3RhdGUpICYgMHhmZjsKKwkJCQorCQkJLyogSWYgdGhlIHN0YXRlIGJlY29tZSAwLCBpdCB3YXMgYSBkZWFkIGtleS4gV2UgbmVlZCB0byB0cmFuc2xhdGUgYWdhaW4sCisJCQlwYXNzaW5nIGluIHRoZSBuZXcgc3RhdGUsIHRvIGdldCB0aGUgYWN0dWFsIGtleSB2YWx1ZSAqLworCQkJaWYgKHN0YXRlICE9IDApCisJCQkJdmFsdWUgPSBLZXlUcmFuc2xhdGUoS0NIUlB0ciwgaSwgJnN0YXRlKSAmIDB4ZmY7CisJCQkKKwkJCS8qIE5vdyB3ZSBzaG91bGQgaGF2ZSBhbiBhc2NpaSB2YWx1ZSwgb3IgMC4gVHJ5IHRvIGZpZ3VyZSBvdXQgdG8gd2hpY2ggU0RMIHN5bWJvbCBpdCBtYXBzICovCisJCQlpZiAodmFsdWUgPj0gMTI4KQkgLyogU29tZSBub24tQVNDSUkgY2hhciwgbWFwIGl0IHRvIFNETEtfV09STERfKiAqLworCQkJCU1BQ19rZXltYXBbaV0gPSB3b3JsZCsrOworCQkJZWxzZSBpZiAodmFsdWUgPj0gMzIpCSAvKiBub24tY29udHJvbCBBU0NJSSBjaGFyICovCisJCQkJTUFDX2tleW1hcFtpXSA9IHZhbHVlOworCQl9CisJfQorCQorCS8qIFRoZSBrZXlwYWQgY29kZXMgYXJlIHJlLXNldHVwIGhlcmUsIGJlY2F1c2UgdGhlIGxvb3AgYWJvdmUgY2Fubm90CisJICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGtleSBvbiB0aGUga2V5cGFkIGFuZCBhIHJlZ3VsYXIga2V5LiBXZSBtYXliZQorCSAqIGNvdWxkIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIGluIGFub3RoZXIgZmFzaGlvbjogTlNFdmVudCdzIGZsYWdzCisJICogaW5jbHVkZSBhICJOU051bWVyaWNQYWRLZXlNYXNrIiBiaXQ7IHdlIGNvdWxkIGNoZWNrIHRoYXQgYW5kIG1vZGlmeQorCSAqIHRoZSBzeW1ib2wgd2UgcmV0dXJuIG9uIHRoZSBmbHkuIEhvd2V2ZXIsIHRoaXMgZmxhZyBzZWVtcyB0byBleGhpYml0CisJICogc29tZSB3ZWlyZCBiZWhhdmlvdXIgcmVsYXRlZCB0byB0aGUgbnVtIGxvY2sga2V5CisJICovCisJTUFDX2tleW1hcFtNS19LUDBdID0gU0RMS19LUDA7CisJTUFDX2tleW1hcFtNS19LUDFdID0gU0RMS19LUDE7CisJTUFDX2tleW1hcFtNS19LUDJdID0gU0RMS19LUDI7CisJTUFDX2tleW1hcFtNS19LUDNdID0gU0RMS19LUDM7CisJTUFDX2tleW1hcFtNS19LUDRdID0gU0RMS19LUDQ7CisJTUFDX2tleW1hcFtNS19LUDVdID0gU0RMS19LUDU7CisJTUFDX2tleW1hcFtNS19LUDZdID0gU0RMS19LUDY7CisJTUFDX2tleW1hcFtNS19LUDddID0gU0RMS19LUDc7CisJTUFDX2tleW1hcFtNS19LUDhdID0gU0RMS19LUDg7CisJTUFDX2tleW1hcFtNS19LUDldID0gU0RMS19LUDk7CisJTUFDX2tleW1hcFtNS19LUF9NSU5VU10gPSBTRExLX0tQX01JTlVTOworCU1BQ19rZXltYXBbTUtfS1BfUExVU10gPSBTRExLX0tQX1BMVVM7CisJTUFDX2tleW1hcFtNS19LUF9QRVJJT0RdID0gU0RMS19LUF9QRVJJT0Q7CisJTUFDX2tleW1hcFtNS19LUF9FUVVBTFNdID0gU0RMS19LUF9FUVVBTFM7CisJTUFDX2tleW1hcFtNS19LUF9ESVZJREVdID0gU0RMS19LUF9ESVZJREU7CisJTUFDX2tleW1hcFtNS19LUF9NVUxUSVBMWV0gPSBTRExLX0tQX01VTFRJUExZOworCU1BQ19rZXltYXBbTUtfS1BfRU5URVJdID0gU0RMS19LUF9FTlRFUjsKK30KKworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIGludCBtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9rZXlzeW0gKmtleXN5bSwgaW50IHByZXNzZWQpCit7CisJLyogU2V0IHRoZSBrZXlzeW0gaW5mb3JtYXRpb24gKi8KKwlrZXlzeW0tPnNjYW5jb2RlID0gc2NhbmNvZGU7CisJa2V5c3ltLT5zeW0gPSBNQUNfa2V5bWFwW2tleXN5bS0+c2NhbmNvZGVdOworCWtleXN5bS0+bW9kID0gS01PRF9OT05FOworCWtleXN5bS0+dW5pY29kZSA9IDA7CisJaWYgKCBwcmVzc2VkICYmIFNETF9UcmFuc2xhdGVVTklDT0RFICkgeworCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGF0ZSA9IDA7CisJCXN0YXRpYyBQdHIga2V5bWFwID0gbmlsOworCQlQdHIgbmV3X2tleW1hcDsKKworCQkvKiBHZXQgdGhlIGN1cnJlbnQga2V5Ym9hcmQgbWFwIHJlc291cmNlICovCisJCW5ld19rZXltYXAgPSAoUHRyKUdldFNjcmlwdE1hbmFnZXJWYXJpYWJsZShzbUtDSFJDYWNoZSk7CisJCWlmICggbmV3X2tleW1hcCAhPSBrZXltYXAgKSB7CisJCQlrZXltYXAgPSBuZXdfa2V5bWFwOworCQkJc3RhdGUgPSAwOworCQl9CisJCWtleXN5bS0+dW5pY29kZSA9IEtleVRyYW5zbGF0ZShrZXltYXAsCisJCQlrZXlzeW0tPnNjYW5jb2RlfG1vZGlmaWVycywgJnN0YXRlKSAmIDB4RkZGRjsKKwl9CisJcmV0dXJuKGtleXN5bSk7Cit9CisKK3ZvaWQgTWFjX0luaXRFdmVudHMoX1RISVMpCit7CisJLyogQ3JlYXRlIGFwcGxlIG1lbnUgYmFyICovCisJYXBwbGVfbWVudSA9IEdldE1lbnUobUFwcGxlKTsKKwlpZiAoIGFwcGxlX21lbnUgIT0gbmlsICkgeworCQlBcHBlbmRSZXNNZW51KGFwcGxlX21lbnUsICdEUlZSJyk7CisJCUluc2VydE1lbnUoYXBwbGVfbWVudSwgMCk7CisJfQorCURyYXdNZW51QmFyKCk7CisKKwkvKiBHZXQgcmlkIG9mIHNwdXJpb3VzIGV2ZW50cyBhdCBzdGFydHVwICovCisJRmx1c2hFdmVudHMoZXZlcnlFdmVudCwgMCk7CisJCisJLyogQWxsb3cgZXZlcnkgZXZlbnQgYnV0IGtleXJlcGVhdCAqLworCVNldEV2ZW50TWFzayhldmVyeUV2ZW50ICYgfmF1dG9LZXlNYXNrKTsKK30KKwordm9pZCBNYWNfUXVpdEV2ZW50cyhfVEhJUykKK3sKKwlDbGVhck1lbnVCYXIoKTsKKwlpZiAoIGFwcGxlX21lbnUgIT0gbmlsICkgeworCQlSZWxlYXNlUmVzb3VyY2UoKGNoYXIgKiopYXBwbGVfbWVudSk7CisJfQorCisJLyogQ2xlYW4gdXAgcGVuZGluZyBldmVudHMgKi8KKwlGbHVzaEV2ZW50cyhldmVyeUV2ZW50LCAwKTsKK30KKworc3RhdGljIHZvaWQgTWFjX0RvQXBwbGVNZW51KF9USElTLCBsb25nIGNob2ljZSkKK3sKKyNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICAvKiBObyBBcHBsZSBtZW51IGluIE9TIFggKi8KKwlzaG9ydCBtZW51LCBpdGVtOworCisJaXRlbSA9IChjaG9pY2UmMHhGRkZGKTsKKwljaG9pY2UgPj49IDE2OworCW1lbnUgPSAoY2hvaWNlJjB4RkZGRik7CisJCisJc3dpdGNoIChtZW51KSB7CisJCWNhc2UgbUFwcGxlOiB7CisJCQlzd2l0Y2ggKGl0ZW0pIHsKKwkJCQljYXNlIGlBYm91dDogeworCQkJCQkvKiBSdW4gdGhlIGFib3V0IGJveCAqLzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDogeworCQkJCQlTdHIyNTUgbmFtZTsKKwkJCQkJCisJCQkJCUdldE1lbnVJdGVtVGV4dChhcHBsZV9tZW51LCBpdGVtLCBuYW1lKTsKKwkJCQkJT3BlbkRlc2tBY2MobmFtZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCQlkZWZhdWx0OiB7CisJCQkvKiBJZ25vcmUgb3RoZXIgbWVudXMgKi87CisJCX0KKwl9CisjZW5kaWYgLyogIVRBUkdFVF9BUElfTUFDX0NBUkJPTiAqLworfQorCisjaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgorLyogU2luY2Ugd2UgZG9uJ3QgaW5pdGlhbGl6ZSBRdWlja0RyYXcsIHdlIG5lZWQgdG8gZ2V0IGEgcG9pbnRlciB0byBxZCAqLworc3RydWN0IFFER2xvYmFscyAqdGhlUUQgPSBOVUxMOworI2VuZGlmCisKKy8qIEV4cG9ydGVkIHRvIHRoZSBtYWNtYWluIGNvZGUgKi8KK3ZvaWQgU0RMX0luaXRRdWlja0RyYXcoc3RydWN0IFFER2xvYmFscyAqdGhlX3FkKQoreworI2lmICFUQVJHRVRfQVBJX01BQ19DQVJCT04KKwl0aGVRRCA9IHRoZV9xZDsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE5ODNiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2V2ZW50c19jLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICIuLi9tYWNyb20vU0RMX3JvbXZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfbWFjZXZlbnRzLmMgZm9yIHRoZSB2aWRlbyBzdWJzeXN0ZW0KKyovCitleHRlcm4gdm9pZCBNYWNfSW5pdEV2ZW50cyhfVEhJUyk7CitleHRlcm4gdm9pZCBNYWNfUXVpdEV2ZW50cyhfVEhJUyk7CisKK2V4dGVybiB2b2lkIE1hY19Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgTWFjX1B1bXBFdmVudHMoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2dsLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjZ2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RlZDliCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2dsLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBBR0wgaW1wbGVtZW50YXRpb24gb2YgU0RMIE9wZW5HTCBzdXBwb3J0ICovCisKKyNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKKyNpbmNsdWRlICJTRExfbWFjZ2xfYy5oIgorI2luY2x1ZGUgIlNETF9sb2Fkc28uaCIKKworCisvKiBrcmF0OiBhZGRpbmcgT3BlbkdMIHN1cHBvcnQgKi8KK2ludCBNYWNfR0xfSW5pdChfVEhJUykKK3sKKyNpZiBTRExfVklERU9fT1BFTkdMCisJQUdMUGl4ZWxGb3JtYXQgZm9ybWF0OworICAgCWludCBpID0gMDsKKwlHTGludCBhdHRyaWJ1dGVzIFsgMjYgXTsgLyogMjYgaXMgbWF4IHBvc3NpYmxlIGluIHRoaXMgc2V0dXAgKi8KKwlHTGJvb2xlYW4gbm9lcnI7CisgICAKKwkvKiBsb2FkIHRoZSBnbCBkcml2ZXIgZnJvbSBhIGRlZmF1bHQgcGF0aCAqLworCWlmICggISB0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCApIHsKKwkJLyogbm8gZHJpdmVyIGhhcyBiZWVuIGxvYWRlZCwgdXNlIGRlZmF1bHQgKG91cnNlbHZlcykgKi8KKwkJaWYgKCBNYWNfR0xfTG9hZExpYnJhcnkodGhpcywgTlVMTCkgPCAwICkgeworCQkJcmV0dXJuKC0xKTsKKwkJfQorCX0KKworCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9SR0JBOworCWlmICggdGhpcy0+Z2xfY29uZmlnLnJlZF9zaXplICAgIT0gMCAmJgorCSAgICAgdGhpcy0+Z2xfY29uZmlnLmJsdWVfc2l6ZSAgIT0gMCAmJgorCSAgICAgdGhpcy0+Z2xfY29uZmlnLmdyZWVuX3NpemUgIT0gMCApIHsKKwkJYXR0cmlidXRlc1tpKytdID0gQUdMX1JFRF9TSVpFOworCQlhdHRyaWJ1dGVzW2krK10gPSB0aGlzLT5nbF9jb25maWcucmVkX3NpemU7CisJCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9HUkVFTl9TSVpFOworCQlhdHRyaWJ1dGVzW2krK10gPSB0aGlzLT5nbF9jb25maWcuZ3JlZW5fc2l6ZTsKKwkJYXR0cmlidXRlc1tpKytdID0gQUdMX0JMVUVfU0laRTsKKwkJYXR0cmlidXRlc1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmJsdWVfc2l6ZTsKKwkJYXR0cmlidXRlc1tpKytdID0gQUdMX0FMUEhBX1NJWkU7CisJCWF0dHJpYnV0ZXNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5hbHBoYV9zaXplOworCX0KKwlpZiAoIHRoaXMtPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyICkgeworCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfRE9VQkxFQlVGRkVSOworCX0KKwlpZiAoIHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplICE9IDAgKSB7CisJCWF0dHJpYnV0ZXNbaSsrXSA9IEFHTF9ERVBUSF9TSVpFOworCQlhdHRyaWJ1dGVzW2krK10gPSB0aGlzLT5nbF9jb25maWcuZGVwdGhfc2l6ZTsKKwl9CQorCWlmICggdGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZSAhPSAwICkgeworCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfU1RFTkNJTF9TSVpFOworCQlhdHRyaWJ1dGVzW2krK10gPSB0aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplOworCX0KKwlpZiAoIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZSAgICE9IDAgJiYKKwkgICAgIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemUgICE9IDAgJiYKKwkgICAgIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplICE9IDAgKSB7CisJCQorCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfQUNDVU1fUkVEX1NJWkU7CisJCWF0dHJpYnV0ZXNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZTsKKwkJYXR0cmlidXRlc1tpKytdID0gQUdMX0FDQ1VNX0dSRUVOX1NJWkU7CisJCWF0dHJpYnV0ZXNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplOworCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfQUNDVU1fQkxVRV9TSVpFOworCQlhdHRyaWJ1dGVzW2krK10gPSB0aGlzLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplOworCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfQUNDVU1fQUxQSEFfU0laRTsKKwkJYXR0cmlidXRlc1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemU7CisJfQorCWlmICggdGhpcy0+Z2xfY29uZmlnLnN0ZXJlbyApIHsKKwkJYXR0cmlidXRlc1tpKytdID0gQUdMX1NURVJFTzsKKwl9CisjaWYgZGVmaW5lZChBR0xfU0FNUExFX0JVRkZFUlNfQVJCKSAmJiBkZWZpbmVkKEFHTF9TQU1QTEVTX0FSQikKKwlpZiAoIHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZWJ1ZmZlcnMgIT0gMCApIHsKKwkJYXR0cmlidXRlc1tpKytdID0gQUdMX1NBTVBMRV9CVUZGRVJTX0FSQjsKKwkJYXR0cmlidXRlc1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLm11bHRpc2FtcGxlYnVmZmVyczsKKwl9CQorCWlmICggdGhpcy0+Z2xfY29uZmlnLm11bHRpc2FtcGxlc2FtcGxlcyAhPSAwICkgeworCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfU0FNUExFU19BUkI7CisJCWF0dHJpYnV0ZXNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXM7CisJfQkKKyNlbmRpZgorCWlmICggdGhpcy0+Z2xfY29uZmlnLmFjY2VsZXJhdGVkID4gMCApIHsKKwkJYXR0cmlidXRlc1tpKytdID0gQUdMX0FDQ0VMRVJBVEVEOworCQlhdHRyaWJ1dGVzW2krK10gPSBBR0xfTk9fUkVDT1ZFUlk7CisJfQorCisJYXR0cmlidXRlc1tpKytdID0gQUdMX0FMTF9SRU5ERVJFUlM7CisJYXR0cmlidXRlc1tpXQk9IEFHTF9OT05FOworCisJZm9ybWF0ID0gYWdsQ2hvb3NlUGl4ZWxGb3JtYXQoTlVMTCwgMCwgYXR0cmlidXRlcyk7CisJaWYgKCBmb3JtYXQgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBtYXRjaCBPcGVuR0wgZGVzaXJlZCBmb3JtYXQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwlnbENvbnRleHQgPSBhZ2xDcmVhdGVDb250ZXh0KGZvcm1hdCwgTlVMTCk7CisJaWYgKCBnbENvbnRleHQgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgT3BlbkdMIGNvbnRleHQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJYWdsRGVzdHJveVBpeGVsRm9ybWF0KGZvcm1hdCk7CisKKyAgICAjaWYgIFRBUkdFVF9BUElfTUFDX0NBUkJPTgorCW5vZXJyID0gYWdsU2V0RHJhd2FibGUoZ2xDb250ZXh0LCBHZXRXaW5kb3dQb3J0KFNETF9XaW5kb3cpKTsKKyAgICAjZWxzZQorCW5vZXJyID0gYWdsU2V0RHJhd2FibGUoZ2xDb250ZXh0LCAoQUdMRHJhd2FibGUpU0RMX1dpbmRvdyk7CisgICAgI2VuZGlmCisgICAgCisJaWYoIW5vZXJyKSB7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGJpbmQgR0wgY29udGV4dCB0byB3aW5kb3ciKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKDApOworI2Vsc2UKKwlTRExfU2V0RXJyb3IoIk9wZW5HTCBzdXBwb3J0IG5vdCBjb25maWd1cmVkIik7CisJcmV0dXJuKC0xKTsKKyNlbmRpZgorfQorCit2b2lkIE1hY19HTF9RdWl0KF9USElTKQoreworI2lmIFNETF9WSURFT19PUEVOR0wKKwlpZiAoIGdsQ29udGV4dCAhPSBOVUxMICkgeworCQlhZ2xTZXRDdXJyZW50Q29udGV4dChOVUxMKTsKKwkJYWdsU2V0RHJhd2FibGUoZ2xDb250ZXh0LCBOVUxMKTsKKwkJYWdsRGVzdHJveUNvbnRleHQoZ2xDb250ZXh0KTsJCQorCQlnbENvbnRleHQgPSBOVUxMOworCX0KKyNlbmRpZgorfQorCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCisvKiBNYWtlIHRoZSBjdXJyZW50IGNvbnRleHQgYWN0aXZlICovCitpbnQgTWFjX0dMX01ha2VDdXJyZW50KF9USElTKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSAwOworCWlmKCAhIGFnbFNldEN1cnJlbnRDb250ZXh0KGdsQ29udGV4dCkgKSB7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG1ha2UgR0wgY29udGV4dCBjdXJyZW50Iik7CisJCXJldHZhbCA9IC0xOworCX0KKwlyZXR1cm4ocmV0dmFsKTsKK30KKwordm9pZCBNYWNfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpCit7CisJYWdsU3dhcEJ1ZmZlcnMoZ2xDb250ZXh0KTsKK30KKworaW50IE1hY19HTF9Mb2FkTGlicmFyeShfVEhJUywgY29uc3QgY2hhciAqbG9jYXRpb24pCit7CisJaWYgKGxvY2F0aW9uID09IE5VTEwpCisjaWYgX19NQUNIX18KKwkJbG9jYXRpb24gPSAiL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvT3BlbkdMLmZyYW1ld29yay9PcGVuR0wiOworI2Vsc2UKKwkJbG9jYXRpb24gPSAiT3BlbkdMTGlicmFyeSI7CisjZW5kaWYKKworCXRoaXMtPmhpZGRlbi0+bGlicmFyeUhhbmRsZSA9IFNETF9Mb2FkT2JqZWN0KGxvY2F0aW9uKTsKKworCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMTsKKwlyZXR1cm4gKHRoaXMtPmhpZGRlbi0+bGlicmFyeUhhbmRsZSAhPSBOVUxMKSA/IDAgOiAtMTsKK30KKwordm9pZCBNYWNfR0xfVW5sb2FkTGlicmFyeShfVEhJUykKK3sKKwlTRExfVW5sb2FkT2JqZWN0KHRoaXMtPmhpZGRlbi0+bGlicmFyeUhhbmRsZSk7CisKKwl0aGlzLT5oaWRkZW4tPmxpYnJhcnlIYW5kbGUgPSBOVUxMOworCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMDsKK30KKwordm9pZCogTWFjX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyICpwcm9jKQoreworCXJldHVybiBTRExfTG9hZEZ1bmN0aW9uKCB0aGlzLT5oaWRkZW4tPmxpYnJhcnlIYW5kbGUsIHByb2MgKTsKK30KKworI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2dsX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWNnbF9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjZDcwZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWNnbF9jLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyogQUdMIGltcGxlbWVudGF0aW9uIG9mIFNETCBPcGVuR0wgc3VwcG9ydCAqLworCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWYgU0RMX1ZJREVPX09QRU5HTAorI2luY2x1ZGUgIlNETF9vcGVuZ2wuaCIKKyNpZiBfX01BQ09TWF9fCisjaW5jbHVkZSA8QUdML2FnbC5oPiAgIC8qIEFHTC5mcmFtZXdvcmsgKi8KKyNlbHNlCisjaW5jbHVkZSA8YWdsLmg+CisjZW5kaWYKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCisKKy8qIE9wZW5HTCBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgTWFjX0dMX0luaXQoX1RISVMpOworZXh0ZXJuIHZvaWQgTWFjX0dMX1F1aXQoX1RISVMpOworI2lmIFNETF9WSURFT19PUEVOR0wKK2V4dGVybiBpbnQgTWFjX0dMX01ha2VDdXJyZW50KF9USElTKTsKK2V4dGVybiBpbnQgTWFjX0dMX0dldEF0dHJpYnV0ZShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOworZXh0ZXJuIHZvaWQgTWFjX0dMX1N3YXBCdWZmZXJzKF9USElTKTsKK2V4dGVybiBpbnQgTWFjX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyICpsb2NhdGlvbik7CitleHRlcm4gdm9pZCBNYWNfR0xfVW5sb2FkTGlicmFyeShfVEhJUyk7CitleHRlcm4gdm9pZCogTWFjX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyICpwcm9jKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFja2V5cy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2tleXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVkMzBkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY2tleXMuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworLyogVGhlc2UgYXJlIHRoZSBNYWNpbnRvc2gga2V5IHNjYW5jb2RlIGNvbnN0YW50cyAtLSBmcm9tIEluc2lkZSBNYWNpbnRvc2ggKi8KKworI2RlZmluZSBNS19FU0NBUEUJCTB4MzUKKyNkZWZpbmUgTUtfRjEJCQkweDdBCisjZGVmaW5lIE1LX0YyCQkJMHg3OAorI2RlZmluZSBNS19GMwkJCTB4NjMKKyNkZWZpbmUgTUtfRjQJCQkweDc2CisjZGVmaW5lIE1LX0Y1CQkJMHg2MAorI2RlZmluZSBNS19GNgkJCTB4NjEKKyNkZWZpbmUgTUtfRjcJCQkweDYyCisjZGVmaW5lIE1LX0Y4CQkJMHg2NAorI2RlZmluZSBNS19GOQkJCTB4NjUKKyNkZWZpbmUgTUtfRjEwCQkJMHg2RAorI2RlZmluZSBNS19GMTEJCQkweDY3CisjZGVmaW5lIE1LX0YxMgkJCTB4NkYKKyNkZWZpbmUgTUtfUFJJTlQJCTB4NjkKKyNkZWZpbmUgTUtfU0NST0xMT0NLCQkweDZCCisjZGVmaW5lIE1LX1BBVVNFCQkweDcxCisjZGVmaW5lIE1LX1BPV0VSCQkweDdGCisjZGVmaW5lIE1LX0JBQ0tRVU9URQkJMHgzMgorI2RlZmluZSBNS18xCQkJMHgxMgorI2RlZmluZSBNS18yCQkJMHgxMworI2RlZmluZSBNS18zCQkJMHgxNAorI2RlZmluZSBNS180CQkJMHgxNQorI2RlZmluZSBNS181CQkJMHgxNworI2RlZmluZSBNS182CQkJMHgxNgorI2RlZmluZSBNS183CQkJMHgxQQorI2RlZmluZSBNS184CQkJMHgxQworI2RlZmluZSBNS185CQkJMHgxOQorI2RlZmluZSBNS18wCQkJMHgxRAorI2RlZmluZSBNS19NSU5VUwkJMHgxQgorI2RlZmluZSBNS19FUVVBTFMJCTB4MTgKKyNkZWZpbmUgTUtfQkFDS1NQQUNFCQkweDMzCisjZGVmaW5lIE1LX0lOU0VSVAkJMHg3MgorI2RlZmluZSBNS19IT01FCQkJMHg3MworI2RlZmluZSBNS19QQUdFVVAJCTB4NzQKKyNkZWZpbmUgTUtfTlVNTE9DSwkJMHg0NworI2RlZmluZSBNS19LUF9FUVVBTFMJCTB4NTEKKyNkZWZpbmUgTUtfS1BfRElWSURFCQkweDRCCisjZGVmaW5lIE1LX0tQX01VTFRJUExZCQkweDQzCisjZGVmaW5lIE1LX1RBQgkJCTB4MzAKKyNkZWZpbmUgTUtfcQkJCTB4MEMKKyNkZWZpbmUgTUtfdwkJCTB4MEQKKyNkZWZpbmUgTUtfZQkJCTB4MEUKKyNkZWZpbmUgTUtfcgkJCTB4MEYKKyNkZWZpbmUgTUtfdAkJCTB4MTEKKyNkZWZpbmUgTUtfeQkJCTB4MTAKKyNkZWZpbmUgTUtfdQkJCTB4MjAKKyNkZWZpbmUgTUtfaQkJCTB4MjIKKyNkZWZpbmUgTUtfbwkJCTB4MUYKKyNkZWZpbmUgTUtfcAkJCTB4MjMKKyNkZWZpbmUgTUtfTEVGVEJSQUNLRVQJCTB4MjEKKyNkZWZpbmUgTUtfUklHSFRCUkFDS0VUCQkweDFFCisjZGVmaW5lIE1LX0JBQ0tTTEFTSAkJMHgyQQorI2RlZmluZSBNS19ERUxFVEUJCTB4NzUKKyNkZWZpbmUgTUtfRU5ECQkJMHg3NworI2RlZmluZSBNS19QQUdFRE9XTgkJMHg3OQorI2RlZmluZSBNS19LUDcJCQkweDU5CisjZGVmaW5lIE1LX0tQOAkJCTB4NUIKKyNkZWZpbmUgTUtfS1A5CQkJMHg1QworI2RlZmluZSBNS19LUF9NSU5VUwkJMHg0RQorI2RlZmluZSBNS19DQVBTTE9DSwkJMHgzOQorI2RlZmluZSBNS19hCQkJMHgwMAorI2RlZmluZSBNS19zCQkJMHgwMQorI2RlZmluZSBNS19kCQkJMHgwMgorI2RlZmluZSBNS19mCQkJMHgwMworI2RlZmluZSBNS19nCQkJMHgwNQorI2RlZmluZSBNS19oCQkJMHgwNAorI2RlZmluZSBNS19qCQkJMHgyNgorI2RlZmluZSBNS19rCQkJMHgyOAorI2RlZmluZSBNS19sCQkJMHgyNQorI2RlZmluZSBNS19TRU1JQ09MT04JCTB4MjkKKyNkZWZpbmUgTUtfUVVPVEUJCTB4MjcKKyNkZWZpbmUgTUtfUkVUVVJOCQkweDI0CisjZGVmaW5lIE1LX0tQNAkJCTB4NTYKKyNkZWZpbmUgTUtfS1A1CQkJMHg1NworI2RlZmluZSBNS19LUDYJCQkweDU4CisjZGVmaW5lIE1LX0tQX1BMVVMJCTB4NDUKKyNkZWZpbmUgTUtfTFNISUZUCQkweDM4CisjZGVmaW5lIE1LX3oJCQkweDA2CisjZGVmaW5lIE1LX3gJCQkweDA3CisjZGVmaW5lIE1LX2MJCQkweDA4CisjZGVmaW5lIE1LX3YJCQkweDA5CisjZGVmaW5lIE1LX2IJCQkweDBCCisjZGVmaW5lIE1LX24JCQkweDJECisjZGVmaW5lIE1LX20JCQkweDJFCisjZGVmaW5lIE1LX0NPTU1BCQkweDJCCisjZGVmaW5lIE1LX1BFUklPRAkJMHgyRgorI2RlZmluZSBNS19TTEFTSAkJMHgyQworI2lmIDAJLyogVGhlc2UgYXJlIHRoZSBzYW1lIGFzIHRoZSBsZWZ0IHZlcnNpb25zIC0gdXNlIGxlZnQgYnkgZGVmYXVsdCAqLworI2RlZmluZSBNS19SU0hJRlQJCTB4MzgKKyNlbmRpZgorI2RlZmluZSBNS19VUAkJCTB4N0UKKyNkZWZpbmUgTUtfS1AxCQkJMHg1MworI2RlZmluZSBNS19LUDIJCQkweDU0CisjZGVmaW5lIE1LX0tQMwkJCTB4NTUKKyNkZWZpbmUgTUtfS1BfRU5URVIJCTB4NEMKKyNkZWZpbmUgTUtfTENUUkwJCTB4M0IKKyNkZWZpbmUgTUtfTEFMVAkJCTB4M0EKKyNkZWZpbmUgTUtfTE1FVEEJCTB4MzcKKyNkZWZpbmUgTUtfU1BBQ0UJCTB4MzEKKyNpZiAwCS8qIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyB0aGUgbGVmdCB2ZXJzaW9ucyAtIHVzZSBsZWZ0IGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgTUtfUk1FVEEJCTB4MzcKKyNkZWZpbmUgTUtfUkFMVAkJCTB4M0EKKyNkZWZpbmUgTUtfUkNUUkwJCTB4M0IKKyNlbmRpZgorI2RlZmluZSBNS19MRUZUCQkJMHg3QgorI2RlZmluZSBNS19ET1dOCQkJMHg3RAorI2RlZmluZSBNS19SSUdIVAkJMHg3QworI2RlZmluZSBNS19LUDAJCQkweDUyCisjZGVmaW5lIE1LX0tQX1BFUklPRAkJMHg0MQorCisvKiBXaWVyZCwgdGhlc2Uga2V5cyBhcmUgb24gbXkgaUJvb2sgdW5kZXIgTWFjIE9TIFggKi8KKyNkZWZpbmUgTUtfSUJPT0tfRU5URVIJCTB4MzQKKyNkZWZpbmUgTUtfSUJPT0tfTEVGVAkJMHgzQgorI2RlZmluZSBNS19JQk9PS19SSUdIVAkJMHgzQworI2RlZmluZSBNS19JQk9PS19ET1dOCQkweDNECisjZGVmaW5lIE1LX0lCT09LX1VQCQkweDNFCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWNtb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOWFkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjbW91c2UuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKKyNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CisjZWxpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgKFVOSVZFUlNBTF9JTlRFUkZBQ0VTX1ZFUlNJT04gPiAweDAzMzUpCisjaW5jbHVkZSA8Q2FyYm9uLmg+CisjZWxzZQorI2luY2x1ZGUgPFF1aWNrZHJhdy5oPgorI2VuZGlmCisKKy8qIFJvdXRpbmVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENhcmJvbiBBUEkuLi4gKi8KKyNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisjaW5jbHVkZSA8Q3Vyc29yRGV2aWNlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICJTRExfbWFjbW91c2VfYy5oIgorCisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLworc3RydWN0IFdNY3Vyc29yIHsKKwlDdXJzb3IgY3VyczsKK307CisKKwordm9pZCBNYWNfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQoreworCVNETF9mcmVlKGN1cnNvcik7Cit9CisKK1dNY3Vyc29yICpNYWNfQ3JlYXRlV01DdXJzb3IoX1RISVMsCisJCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKK3sKKwlXTWN1cnNvciAqY3Vyc29yOworCWludCByb3csIGJ5dGVzOworCQkKKwkvKiBBbGxvY2F0ZSB0aGUgY3Vyc29yIG1lbW9yeSAqLworCWN1cnNvciA9IChXTWN1cnNvciAqKVNETF9tYWxsb2Moc2l6ZW9mKFdNY3Vyc29yKSk7CisJaWYgKCBjdXJzb3IgPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJU0RMX21lbXNldChjdXJzb3IsIDAsIHNpemVvZigqY3Vyc29yKSk7CisgICAgCisgICAgaWYgKHcgPiAxNikKKyAgICAgICAgdyA9IDE2OworICAgIAorICAgIGlmIChoID4gMTYpCisgICAgICAgIGggPSAxNjsKKyAgICAKKwlieXRlcyA9ICh3KzcpLzg7CisKKwlmb3IgKCByb3c9MDsgcm93PGg7ICsrcm93ICkgeworCQlTRExfbWVtY3B5KCZjdXJzb3ItPmN1cnMuZGF0YVtyb3ddLCBkYXRhLCBieXRlcyk7CisJCWRhdGEgKz0gYnl0ZXM7CisJfQorCWZvciAoIHJvdz0wOyByb3c8aDsgKytyb3cgKSB7CisJCVNETF9tZW1jcHkoJmN1cnNvci0+Y3Vycy5tYXNrW3Jvd10sIG1hc2ssIGJ5dGVzKTsKKwkJbWFzayArPSBieXRlczsKKwl9CisJY3Vyc29yLT5jdXJzLmhvdFNwb3QuaCA9IGhvdF94OworCWN1cnNvci0+Y3Vycy5ob3RTcG90LnYgPSBob3RfeTsKKworCS8qIFRoYXQgd2FzIGVhc3kuIDopICovCisJcmV0dXJuKGN1cnNvcik7Cit9CisKK2ludCBNYWNfY3Vyc29yX3Nob3dpbmcgPSAxOworCitpbnQgTWFjX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKK3sKKwlpZiAoIGN1cnNvciA9PSBOVUxMICkgeworCQlpZiAoIE1hY19jdXJzb3Jfc2hvd2luZyApIHsKKwkJCUhpZGVDdXJzb3IoKTsKKwkJCU1hY19jdXJzb3Jfc2hvd2luZyA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlTZXRDdXJzb3IoJmN1cnNvci0+Y3Vycyk7CisJCWlmICggISBNYWNfY3Vyc29yX3Nob3dpbmcgKSB7CisJCQlTaG93Q3Vyc29yKCk7CisJCQlNYWNfY3Vyc29yX3Nob3dpbmcgPSAxOworCQl9CisJfQorCXJldHVybigxKTsKK30KKwordm9pZCBNYWNfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCit7CisjaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgorCUN1cnNvckRldmljZSAqY3Vyc29yZGV2aWNlOworCisJY3Vyc29yZGV2aWNlID0gbmlsOworCUN1cnNvckRldmljZU5leHREZXZpY2UoJmN1cnNvcmRldmljZSk7CisJaWYgKCBjdXJzb3JkZXZpY2UgIT0gbmlsICkgeworCQlXaW5kb3dQdHIgc2F2ZXBvcnQ7CisJCVBvaW50IHdoZXJlOworCisJCUdldFBvcnQoJnNhdmVwb3J0KTsKKwkJU2V0UG9ydChTRExfV2luZG93KTsKKwkJd2hlcmUuaCA9IHg7CisJCXdoZXJlLnYgPSB5OworCQlMb2NhbFRvR2xvYmFsKCZ3aGVyZSk7CisJCVNldFBvcnQoc2F2ZXBvcnQpOworCQlDdXJzb3JEZXZpY2VNb3ZlVG8oY3Vyc29yZGV2aWNlLCB3aGVyZS5oLCB3aGVyZS52KTsKKwl9CisjZW5kaWYgLyogIVRBUkdFVF9BUElfTUFDX0NBUkJPTiAqLworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY21vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGZiNDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY21vdXNlX2MuaApAQCAtMCwwICsxLDM0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIi4uL21hY3JvbS9TRExfcm9tdmlkZW8uaCIKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCitleHRlcm4gdm9pZCBNYWNfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKK2V4dGVybiBXTWN1cnNvciAqTWFjX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAorCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOworZXh0ZXJuIGludCBNYWNfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKK2V4dGVybiB2b2lkIE1hY19XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7CisKKy8qIERhdGEgdG8gYmUgZXhwb3J0ZWQgKi8KK2V4dGVybiBpbnQgTWFjX2N1cnNvcl9zaG93aW5nOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY3dtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2NvbW1vbi9TRExfbWFjd20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQ4NWEzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY3dtLmMKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCisjaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgorI2VsaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OICYmIChVTklWRVJTQUxfSU5URVJGQUNFU19WRVJTSU9OID4gMHgwMzM1KQorI2luY2x1ZGUgPENhcmJvbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisjaW5jbHVkZSA8U3RyaW5ncy5oPgorI2VuZGlmCisKKyNpZiBTRExfTUFDQ0xBU1NJQ19HQU1NQV9TVVBQT1JUCisjaW5jbHVkZSA8RGV2aWNlcy5oPgorI2luY2x1ZGUgPEZpbGVzLmg+CisjaW5jbHVkZSA8TWFjVHlwZXMuaD4KKyNpbmNsdWRlIDxRRE9mZnNjcmVlbi5oPgorI2luY2x1ZGUgPFF1aWNrZHJhdy5oPgorI2luY2x1ZGUgPFZpZGVvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKyNpbmNsdWRlICJTRExfbWFjd21fYy5oIgorCit2b2lkIE1hY19TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKK3sKKwkvKiBEb24ndCBjb252ZXJ0IEMgdG8gUCBzdHJpbmcgaW4gcGxhY2UsIGJlY2F1c2UgaXQgbWF5IGJlIHJlYWQtb25seSAqLworCVN0cjI1NQkJcHRpdGxlOyAvKiBNSlMgKi8KKwlwdGl0bGVbMF0gPSBzdHJsZW4gKHRpdGxlKTsKKwlTRExfbWVtY3B5KHB0aXRsZSsxLCB0aXRsZSwgcHRpdGxlWzBdKTsgLyogTUpTICovCisJaWYgKFNETF9XaW5kb3cpCisJCVNldFdUaXRsZShTRExfV2luZG93LCBwdGl0bGUpOyAvKiBNSlMgKi8KK30KKworI2lmIFNETF9NQUNDTEFTU0lDX0dBTU1BX1NVUFBPUlQKKy8qCisgKiBBREMgR2FtbWEgUmFtcCBzdXBwb3J0Li4uCisgKgorICogTWFjIEdhbW1hIFJhbXAgY29kZSB3YXMgb3JpZ2luYWxseSBmcm9tIHNhbXBsZSBjb2RlIHByb3ZpZGVkIGJ5CisgKiAgQXBwbGUgRGV2ZWxvcGVyIENvbm5lY3Rpb24sIGFuZCBub3Qgd3JpdHRlbiBzcGVjaWZpY2FsbHkgZm9yIFNETDoKKyAqICJDb250YWluczogRnVuY3Rpb25zIHRvIGVuYWJsZSBNYWMgT1MgZGV2aWNlIGdhbW1hIGFkanVzdG1lbnRzIHVzaW5nIDMgY2hhbm5lbCAyNTYgZWxlbWVudCA4IGJpdCBnYW1tYSByYW1wcworICogIFdyaXR0ZW4gYnk6IEdlb2ZmIFN0YWhsIChnZ3MpCisgKiAgQ29weXJpZ2h0OiBDb3B5cmlnaHQgKGMpIDE5OTkgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICBEaXNjbGFpbWVyOiBZb3UgbWF5IGluY29ycG9yYXRlIHRoaXMgc2FtcGxlIGNvZGUgaW50byB5b3VyIGFwcGxpY2F0aW9ucyB3aXRob3V0CisgKiAgICAgICAgICAgICAgcmVzdHJpY3Rpb24sIHRob3VnaCB0aGUgc2FtcGxlIGNvZGUgaGFzIGJlZW4gcHJvdmlkZWQgIkFTIElTIiBhbmQgdGhlCisgKiAgICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvcGVyYXRpb24gaXMgMTAwJSB5b3Vycy4gIEhvd2V2ZXIsIHdoYXQgeW91IGFyZQorICogICAgICAgICAgICAgIG5vdCBwZXJtaXR0ZWQgdG8gZG8gaXMgdG8gcmVkaXN0cmlidXRlIHRoZSBzb3VyY2UgYXMgIkRTQyBTYW1wbGUgQ29kZSIKKyAqICAgICAgICAgICAgICBhZnRlciBoYXZpbmcgbWFkZSBjaGFuZ2VzLiBJZiB5b3UncmUgZ29pbmcgdG8gcmUtZGlzdHJpYnV0ZSB0aGUgc291cmNlLAorICogICAgICAgICAgICAgIHdlIHJlcXVpcmUgdGhhdCB5b3UgbWFrZSBpdCBjbGVhciBpbiB0aGUgc291cmNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiAgICAgICAgICAgICAgZGVzY2VuZGVkIGZyb20gQXBwbGUgU2FtcGxlIENvZGUsIGJ1dCB0aGF0IHlvdSd2ZSBtYWRlIGNoYW5nZXMuIgorICogKFRoZSBzYW1wbGUgY29kZSBoYXMgYmVlbiBpbnRlZ3JhdGVkIGludG8gdGhpcyBmaWxlLCBhbmQgdGh1cyBpcyBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbCBBcHBsZSBzb3VyY2VzLikKKyAqLworCit0eXBlZGVmIHN0cnVjdCByZWNEZXZpY2VHYW1tYQkJCQkJCQkJCQkJLyogc3RvcmFnZSBmb3IgZGV2aWNlIGhhbmRsZSBhbmQgZ2FtbWEgdGFibGUgKi8KK3sKKwlHREhhbmRsZSBoR0Q7CQkJCQkJCQkJCQkJLyogaGFuZGxlIHRvIGRldmljZSAqLworCUdhbW1hVGJsUHRyIHBEZXZpY2VHYW1tYTsJCQkJCQkJCQkvKiBwb2ludGVyIHRvIGRldmljZSBnYW1tYSB0YWJsZSAqLworfSByZWNEZXZpY2VHYW1tYTsKK3R5cGVkZWYgcmVjRGV2aWNlR2FtbWEgKiBwcmVjRGV2aWNlR2FtbWE7CisKK3R5cGVkZWYgc3RydWN0IHJlY1N5c3RlbUdhbW1hCQkJCQkJCQkJCQkvKiBzdG9yYWdlIGZvciBzeXN0ZW0gZGV2aWNlcyBhbmQgZ2FtbWEgdGFibGVzICovCit7CisJc2hvcnQgbnVtRGV2aWNlczsJCQkJCQkJCQkJCS8qIG51bWJlciBvZiBkZXZpY2VzICovCisJcHJlY0RldmljZUdhbW1hICogZGV2R2FtbWE7CQkJCQkJCQkJLyogYXJyYXkgb2YgcG9pbnRlcnMgdG8gZGV2aWNlIGdhbW1hIHJlY29yZHMgKi8KK30gcmVjU3lzdGVtR2FtbWE7Cit0eXBlZGVmIHJlY1N5c3RlbUdhbW1hICogcHJlY1N5c3RlbUdhbW1hOworCitzdGF0aWMgUHRyIENvcHlHYW1tYVRhYmxlIChHYW1tYVRibFB0ciBwVGFibGVHYW1tYUluKQoreworCUdhbW1hVGJsUHRyCQlwVGFibGVHYW1tYU91dCA9IE5VTEw7CisJc2hvcnQJCQl0YWJsZVNpemUsIGRhdGFXaWR0aDsKKworCWlmIChwVGFibGVHYW1tYUluKQkJCQkJCQkJCQkJCS8qIGlmIHRoZXJlIGlzIGEgdGFibGUgdG8gY29weSAgKi8KKwl7CisJCWRhdGFXaWR0aCA9IChwVGFibGVHYW1tYUluLT5nRGF0YVdpZHRoICsgNykgLyA4OwkJCS8qIG51bWJlciBvZiBieXRlcyBwZXIgZW50cnkgKi8KKwkJdGFibGVTaXplID0gc2l6ZW9mIChHYW1tYVRibCkgKyBwVGFibGVHYW1tYUluLT5nRm9ybXVsYVNpemUgKworCQkJCQkocFRhYmxlR2FtbWFJbi0+Z0NoYW5DbnQgKiBwVGFibGVHYW1tYUluLT5nRGF0YUNudCAqIGRhdGFXaWR0aCk7CisJCXBUYWJsZUdhbW1hT3V0ID0gKEdhbW1hVGJsUHRyKSBOZXdQdHIgKHRhYmxlU2l6ZSk7CQkJLyogYWxsb2NhdGUgbmV3IHRhYmxlICovCisJCWlmIChwVGFibGVHYW1tYU91dCkJCQkJCQkJCQkJCQorCQkJQmxvY2tNb3ZlKCAoUHRyKXBUYWJsZUdhbW1hSW4sIChQdHIpcFRhYmxlR2FtbWFPdXQsIHRhYmxlU2l6ZSk7CS8qIG1vdmUgZXZlcnl0aGluZyAqLworCX0KKwlyZXR1cm4gKFB0cilwVGFibGVHYW1tYU91dDsJCQkJCQkJCQkJLyogcmV0dXJuIHdoYXRldmVyIHdlIGFsbG9jYXRlZCwgY291bGQgYmUgTlVMTCAqLworfQorCitzdGF0aWMgT1NFcnIgR2V0R2FtbWFUYWJsZSAoR0RIYW5kbGUgaEdELCBHYW1tYVRibFB0ciAqIHBwVGFibGVHYW1tYU91dCkKK3sKKwlWREdhbW1hUmVjb3JkICAgRGV2aWNlR2FtbWFSZWM7CisJQ250cmxQYXJhbQkJY1BhcmFtOworCU9TRXJyCQkJZXJyOworCQorCWNQYXJhbS5pb0NvbXBsZXRpb24gPSBOVUxMOwkJCQkJCQkJCQkvKiBzZXQgdXAgY29udHJvbCBwYXJhbXMgKi8KKwljUGFyYW0uaW9OYW1lUHRyID0gTlVMTDsKKwljUGFyYW0uaW9WUmVmTnVtID0gMDsKKwljUGFyYW0uaW9DUmVmTnVtID0gKCoqaEdEKS5nZFJlZk51bTsKKwljUGFyYW0uY3NDb2RlID0gY3NjR2V0R2FtbWE7CQkJCQkJCQkJLyogR2V0IEdhbW1hIGNvbW1uZCB0byBkZXZpY2UgKi8KKwkqKFB0ciAqKWNQYXJhbS5jc1BhcmFtID0gKFB0cikgJkRldmljZUdhbW1hUmVjOwkJCQkJLyogcmVjb3JkIGZvciBnYW1tYSAqLworCisJZXJyID0gUEJTdGF0dXNTeW5jKCAoUGFybUJsa1B0cikmY1BhcmFtICk7CQkJCQkJLyogZ2V0IGdhbW1hICovCisJCisJKnBwVGFibGVHYW1tYU91dCA9IChHYW1tYVRibFB0cikoRGV2aWNlR2FtbWFSZWMuY3NHVGFibGUpOwkJLyogcHVsbCB0YWJsZSBvdXQgb2YgcmVjb3JkICovCisJCisJcmV0dXJuIGVycjsJCit9CisKK3N0YXRpYyBQdHIgR2V0RGV2aWNlR2FtbWEgKEdESGFuZGxlIGhHRCkKK3sKKwlHYW1tYVRibFB0cgkJcFRhYmxlR2FtbWFEZXZpY2UgPSBOVUxMOworCUdhbW1hVGJsUHRyCQlwVGFibGVHYW1tYVJldHVybiA9IE5VTEw7CQorCU9TRXJyCQkJZXJyOworCQorCWVyciA9IEdldEdhbW1hVGFibGUgKGhHRCwgJnBUYWJsZUdhbW1hRGV2aWNlKTsJCQkJCS8qIGdldCBhIHBvaW50ZXIgdG8gdGhlIGRldmljZXMgdGFibGUgKi8KKwlpZiAoKG5vRXJyID09IGVycikgJiYgcFRhYmxlR2FtbWFEZXZpY2UpCQkJCQkJLyogaWYgc3VjY2VzZnVsICovCisJCXBUYWJsZUdhbW1hUmV0dXJuID0gKEdhbW1hVGJsUHRyKSBDb3B5R2FtbWFUYWJsZSAocFRhYmxlR2FtbWFEZXZpY2UpOyAvKiBjb3B5IHRvIGdsb2JhbCAqLworCisJcmV0dXJuIChQdHIpIHBUYWJsZUdhbW1hUmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBEaXNwb3NlR2FtbWFUYWJsZSAoUHRyIHBHYW1tYSkKK3sKKwlpZiAocEdhbW1hKQorCQlEaXNwb3NlUHRyKChQdHIpIHBHYW1tYSk7CQkJCQkJCQkJLyogZ2V0IHJpZCBvZiBpdCAqLworfQorCitzdGF0aWMgdm9pZCBEaXNwb3NlU3lzdGVtR2FtbWFzIChQdHIqIHBwU3lzdGVtR2FtbWFzKQoreworCXByZWNTeXN0ZW1HYW1tYSBwU3lzR2FtbWFJbjsKKwlpZiAocHBTeXN0ZW1HYW1tYXMpCisJeworCQlwU3lzR2FtbWFJbiA9IChwcmVjU3lzdGVtR2FtbWEpICpwcFN5c3RlbUdhbW1hczsKKwkJaWYgKHBTeXNHYW1tYUluKQorCQl7CisJCQlzaG9ydCBpOworCQkJZm9yIChpID0gMDsgaSA8IHBTeXNHYW1tYUluLT5udW1EZXZpY2VzOyBpKyspCQkvKiBmb3IgYWxsIGRldmljZXMgKi8KKwkJCQlpZiAocFN5c0dhbW1hSW4tPmRldkdhbW1hIFtpXSkJCQkJCQkvKiBpZiBwb2ludGVyIGlzIHZhbGlkICovCisJCQkJeworCQkJCQlEaXNwb3NlR2FtbWFUYWJsZSAoKFB0cikgcFN5c0dhbW1hSW4tPmRldkdhbW1hIFtpXS0+cERldmljZUdhbW1hKTsgLyogZHVtcCBnYW1tYSB0YWJsZSAqLworCQkJCQlEaXNwb3NlUHRyICgoUHRyKSBwU3lzR2FtbWFJbi0+ZGV2R2FtbWEgW2ldKTsJCQkJCSAgIC8qIGR1bXAgZGV2aWNlIGluZm8gKi8KKwkJCQl9CisJCQlEaXNwb3NlUHRyICgoUHRyKSBwU3lzR2FtbWFJbi0+ZGV2R2FtbWEpOwkJCQkvKiBkdW1wIGRldmljZSBwb2ludGVyIGFycmF5CQkgKi8KKwkJCURpc3Bvc2VQdHIgKChQdHIpIHBTeXNHYW1tYUluKTsJCQkJCQkJLyogZHVtcCBzeXN0ZW0gc3RydWN0dXJlICovCisJCQkqcHBTeXN0ZW1HYW1tYXMgPSBOVUxMOworCQl9CQorCX0KK30KKworc3RhdGljIEJvb2xlYW4gR2V0RGV2aWNlR2FtbWFSYW1wR0QgKEdESGFuZGxlIGhHRCwgUHRyIHBSYW1wKQoreworCUdhbW1hVGJsUHRyCQlwVGFibGVHYW1tYVRlbXAgPSBOVUxMOworCWxvbmcgCQkJaW5kZXhDaGFuLCBpbmRleEVudHJ5OworCU9TRXJyCQkJZXJyOworCQorCWlmIChwUmFtcCkJCQkJCQkJCQkJCQkJCQkvKiBlbnN1cmUgcFJhbXAgaXMgYWxsb2NhdGVkICovCisJeworCQllcnIgPSBHZXRHYW1tYVRhYmxlIChoR0QsICZwVGFibGVHYW1tYVRlbXApOwkJCQkJLyogZ2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBnYW1tYSAqLworCQlpZiAoKG5vRXJyID09IGVycikgJiYgcFRhYmxlR2FtbWFUZW1wKQkJCQkJCQkvKiBpZiBzdWNjZXNzZnVsICovCisJCXsJCQkJCQkJCQkJCQkJCQkKKwkJCS8qIGZpbGwgcmFtcCAqLworCQkJdW5zaWduZWQgY2hhciAqIHBFbnRyeSA9ICh1bnNpZ25lZCBjaGFyICopICZwVGFibGVHYW1tYVRlbXAtPmdGb3JtdWxhRGF0YSArIHBUYWJsZUdhbW1hVGVtcC0+Z0Zvcm11bGFTaXplOyAvKiBiYXNlIG9mIHRhYmxlICovCisJCQlzaG9ydCBieXRlc1BlckVudHJ5ID0gKHBUYWJsZUdhbW1hVGVtcC0+Z0RhdGFXaWR0aCArIDcpIC8gODsgLyogc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBkZXZpY2UgdGFibGUgZW50cmllcyAqLworCQkJc2hvcnQgc2hpZnRSaWdodFZhbHVlID0gcFRhYmxlR2FtbWFUZW1wLT5nRGF0YVdpZHRoIC0gODsgCSAvKiBudW1iZXIgb2YgcmlnaHQgc2hpZnRzIGRldmljZSAtPiByYW1wICovCisJCQlzaG9ydCBjaGFubmVscyA9IHBUYWJsZUdhbW1hVGVtcC0+Z0NoYW5DbnQ7CQorCQkJc2hvcnQgZW50cmllcyA9IHBUYWJsZUdhbW1hVGVtcC0+Z0RhdGFDbnQ7CQkJCQkJCQkJCisJCQlpZiAoMyA9PSBjaGFubmVscykJCQkJCQkJCQkJCS8qIFJHQiBmb3JtYXQgKi8KKwkJCXsJCQkJCQkJCQkJCQkJCQkvKiBub3RlLCB0aGlzIHdpbGwgY3JlYXRlIHJ1bnMgb2YgZW50cmllcyBpZiBkZXN0LiBpcyBiaWdnZXIgKG5vdCBsaW5lYXIgaW50ZXJwb2xhdGUpICovCisJCQkJZm9yIChpbmRleENoYW4gPSAwOyBpbmRleENoYW4gPCBjaGFubmVsczsgaW5kZXhDaGFuKyspCisJCQkJCWZvciAoaW5kZXhFbnRyeSA9IDA7IGluZGV4RW50cnkgPCAyNTY7IGluZGV4RW50cnkrKykKKwkJCQkJCSooKHVuc2lnbmVkIGNoYXIgKikgcFJhbXAgKyAoaW5kZXhDaGFuICogMjU2KSArIGluZGV4RW50cnkpID0gCisJCQkJCQkgICoocEVudHJ5ICsgaW5kZXhDaGFuICogZW50cmllcyAqIGJ5dGVzUGVyRW50cnkgKyBpbmRleEVudHJ5ICogZW50cmllcyAqIGJ5dGVzUGVyRW50cnkgLyAyNTYpID4+IHNoaWZ0UmlnaHRWYWx1ZTsKKwkJCX0KKwkJCWVsc2UJCQkJCQkJCQkJCQkJCS8qIHNpbmdsZSBjaGFubmVsIGZvcm1hdCAqLworCQkJeworCQkJCWZvciAoaW5kZXhDaGFuID0gMDsgaW5kZXhDaGFuIDwgNzY4OyBpbmRleENoYW4gKz0gMjU2KQkvKiByZXBlYXQgZm9yIGFsbCAzIGNoYW5uZWxzIChzdGVwIGJ5IHJhbXAgc2l6ZSkgKi8KKwkJCQkJZm9yIChpbmRleEVudHJ5ID0gMDsgaW5kZXhFbnRyeSA8IDI1NjsgaW5kZXhFbnRyeSsrKSAvKiBmb3IgYWxsIGVudHJpZXMgc2V0IHZyYW1wIHZhbHVlICovCisJCQkJCQkqKCh1bnNpZ25lZCBjaGFyICopIHBSYW1wICsgaW5kZXhDaGFuICsgaW5kZXhFbnRyeSkgPSAKKwkJCQkJCSAgKihwRW50cnkgKyBpbmRleEVudHJ5ICogZW50cmllcyAqIGJ5dGVzUGVyRW50cnkgLyAyNTYpID4+IHNoaWZ0UmlnaHRWYWx1ZTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIFB0ciBHZXRTeXN0ZW1HYW1tYXMgKHZvaWQpCit7CisJcHJlY1N5c3RlbUdhbW1hIHBTeXNHYW1tYU91dDsJCQkJCQkJCQkvKiByZXR1cm4gcG9pbnRlciB0byBzeXN0ZW0gZGV2aWNlIGdhbW1hIGluZm8gKi8KKwlzaG9ydCBkZXZDb3VudCA9IDA7CQkJCQkJCQkJCQkJLyogbnVtYmVyIG9mIGRldmljZXMgYXR0YWNoZWQgKi8KKwlCb29sZWFuIGZhaWwgPSBmYWxzZTsKKwlHREhhbmRsZSBoR0RldmljZTsKKwkKKwlwU3lzR2FtbWFPdXQgPSAocHJlY1N5c3RlbUdhbW1hKSBOZXdQdHIgKHNpemVvZiAocmVjU3lzdGVtR2FtbWEpKTsgLyogYWxsb2NhdGUgZm9yIHN0cnVjdHVyZSAqLworCQorCWhHRGV2aWNlID0gR2V0RGV2aWNlTGlzdCAoKTsJCQkJCQkJLyogdG9wIG9mIGRldmljZSBsaXN0ICovCisJZG8JCQkJCQkJCQkJCQkJCQkJLyogaXRlcmF0ZSAqLworCXsKKwkJZGV2Q291bnQrKzsJCQkJCQkJCQkJCQkJLyogY291bnQgZGV2aWNlcwkJCQkJICovCisJCWhHRGV2aWNlID0gR2V0TmV4dERldmljZSAoaEdEZXZpY2UpOwkJCQkJCS8qIG5leHQgZGV2aWNlICovCisJfSB3aGlsZSAoaEdEZXZpY2UpOworCQorCXBTeXNHYW1tYU91dC0+ZGV2R2FtbWEgPSAocHJlY0RldmljZUdhbW1hICopIE5ld1B0ciAoc2l6ZW9mIChwcmVjRGV2aWNlR2FtbWEpICogZGV2Q291bnQpOyAvKiBhbGxvY2F0ZSBmb3IgYXJyYXkgb2YgcG9pbnRlcnMgdG8gZGV2aWNlIHJlY29yZHMgKi8KKwlpZiAocFN5c0dhbW1hT3V0KQorCXsKKwkJcFN5c0dhbW1hT3V0LT5udW1EZXZpY2VzID0gZGV2Q291bnQ7CQkJCQkJLyogc3R1ZmYgY291bnQgKi8KKwkJCisJCWRldkNvdW50ID0gMDsJCQkJCQkJCQkJCQkvKiByZXNldCBpdGVyYXRpb24gKi8KKwkJaEdEZXZpY2UgPSBHZXREZXZpY2VMaXN0ICgpOworCQlkbworCQl7CisJCQlwU3lzR2FtbWFPdXQtPmRldkdhbW1hIFtkZXZDb3VudF0gPSAocHJlY0RldmljZUdhbW1hKSBOZXdQdHIgKHNpemVvZiAocmVjRGV2aWNlR2FtbWEpKTsJICAvKiBuZXcgZGV2aWNlIHJlY29yZCAqLworCQkJaWYgKHBTeXNHYW1tYU91dC0+ZGV2R2FtbWEgW2RldkNvdW50XSkJCQkJCS8qIGlmIHdlIGFjdHVhbGx5IGFsbG9jYXRlZCBtZW1vcnkgKi8KKwkJCXsKKwkJCQlwU3lzR2FtbWFPdXQtPmRldkdhbW1hIFtkZXZDb3VudF0tPmhHRCA9IGhHRGV2aWNlOwkJCQkJCQkJCQkgIC8qIHN0dWZmIGhhbmRsZSAqLworCQkJCXBTeXNHYW1tYU91dC0+ZGV2R2FtbWEgW2RldkNvdW50XS0+cERldmljZUdhbW1hID0gKEdhbW1hVGJsUHRyKUdldERldmljZUdhbW1hIChoR0RldmljZSk7IC8qIGNvcHkgZ2FtbWEgdGFibGUgKi8KKwkJCX0KKwkJCWVsc2UJCQkJCQkJCQkJCQkJLyogb3RoZXJ3aXNlIGR1bXAgcmVjb3JkIG9uIGV4aXQgKi8KKwkJCSBmYWlsID0gdHJ1ZTsKKwkJCWRldkNvdW50Kys7CQkJCQkJCQkJCQkJLyogbmV4dCBkZXZpY2UgKi8KKwkJCWhHRGV2aWNlID0gR2V0TmV4dERldmljZSAoaEdEZXZpY2UpOwkJCQkJCQorCQl9IHdoaWxlIChoR0RldmljZSk7CisJfQorCWlmICghZmFpbCkJCQkJCQkJCQkJCQkJCS8qIGlmIHdlIGRpZCBub3QgZmFpbCAqLworCQlyZXR1cm4gKFB0cikgcFN5c0dhbW1hT3V0OwkJCQkJCQkJCS8qIHJldHVybiBwb2ludGVyIHRvIHN0cnVjdHVyZSAqLworCWVsc2UKKwl7CisJCURpc3Bvc2VTeXN0ZW1HYW1tYXMgKChQdHIgKikgJnBTeXNHYW1tYU91dCk7CQkJCQkvKiBvdGhlcndpc2UgZHVtcCB0aGUgY3VycmVudCBzdHJ1Y3R1cmVzIChkaXNwb3NlIGRvZXMgZXJyb3IgY2hlY2tpbmcpICovCisJCXJldHVybiBOVUxMOwkJCQkJCQkJCQkJCS8qIGNvdWxkIG5vdCBjb21wbGV0ZSAqLworCX0KK30KKworc3RhdGljIHZvaWQgUmVzdG9yZURldmljZUdhbW1hIChHREhhbmRsZSBoR0QsIFB0ciBwR2FtbWFUYWJsZSkKK3sKKwlWRFNldEVudHJ5UmVjb3JkIHNldEVudHJpZXNSZWM7CisJVkRHYW1tYVJlY29yZAlnYW1lUmVjUmVzdG9yZTsKKwlDVGFiSGFuZGxlICAgICAgaENUYWJEZXZpY2VDb2xvcnM7CisJUHRyCQkJCWNzUHRyOworCU9TRXJyCQkJZXJyID0gbm9FcnI7CisJCisJaWYgKHBHYW1tYVRhYmxlKQkJCQkJCQkJCQkJCS8qIGlmIHdlIGhhdmUgYSB0YWJsZSB0byByZXN0b3JlCQkJCQkJCQkgKi8KKwl7CisJCWdhbWVSZWNSZXN0b3JlLmNzR1RhYmxlID0gcEdhbW1hVGFibGU7CQkJCQkJLyogc2V0dXAgcmVzdG9yZSByZWNvcmQgKi8KKwkJY3NQdHIgPSAoUHRyKSAmZ2FtZVJlY1Jlc3RvcmU7CisJCWVyciA9IENvbnRyb2woKCoqaEdEKS5nZFJlZk51bSwgY3NjU2V0R2FtbWEsIChQdHIpICZjc1B0cik7CS8qIHJlc3RvcmUgZ2FtbWEgKi8KKworCQlpZiAoKG5vRXJyID09IGVycikgJiYgKDggPT0gKCoqKCoqaEdEKS5nZFBNYXApLnBpeGVsU2l6ZSkpCS8qIGlmIHN1Y2Nlc3NmdWwgYW5kIG9uIGFuIDggYml0IGRldmljZSAqLworCQl7CisJCQloQ1RhYkRldmljZUNvbG9ycyA9ICgqKigqKmhHRCkuZ2RQTWFwKS5wbVRhYmxlOwkJCS8qIGRvIFNldEVudHJpZXMgdG8gZm9yY2UgQ0xVVCB1cGRhdGUgKi8KKwkJCXNldEVudHJpZXNSZWMuY3NUYWJsZSA9IChDb2xvclNwZWMgKikgJigqKmhDVGFiRGV2aWNlQ29sb3JzKS5jdFRhYmxlOworCQkJc2V0RW50cmllc1JlYy5jc1N0YXJ0ID0gMDsKKwkJCXNldEVudHJpZXNSZWMuY3NDb3VudCA9ICgqKmhDVGFiRGV2aWNlQ29sb3JzKS5jdFNpemU7CisJCQljc1B0ciA9IChQdHIpICZzZXRFbnRyaWVzUmVjOworCQkJCisJCQllcnIgPSBDb250cm9sKCgqKmhHRCkuZ2RSZWZOdW0sIGNzY1NldEVudHJpZXMsIChQdHIpICZjc1B0cik7IC8qIFNldEVudHJpZXMgaW4gQ0xVVCAqLworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBSZXN0b3JlU3lzdGVtR2FtbWFzIChQdHIgcFN5c3RlbUdhbW1hcykKK3sKKwlzaG9ydCBpOworCXByZWNTeXN0ZW1HYW1tYSBwU3lzR2FtbWFJbiA9IChwcmVjU3lzdGVtR2FtbWEpIHBTeXN0ZW1HYW1tYXM7CisJaWYgKHBTeXNHYW1tYUluKQorCQlmb3IgKGkgPSAwOyBpIDwgcFN5c0dhbW1hSW4tPm51bURldmljZXM7IGkrKykJCQkvKiBmb3IgYWxsIGRldmljZXMgKi8KKwkJCVJlc3RvcmVEZXZpY2VHYW1tYSAocFN5c0dhbW1hSW4tPmRldkdhbW1hIFtpXS0+aEdELCAoUHRyKSBwU3lzR2FtbWFJbi0+ZGV2R2FtbWEgW2ldLT5wRGV2aWNlR2FtbWEpOwkvKiByZXN0b3JlIGdhbW1hICovCit9CisKK3N0YXRpYyBQdHIgQ3JlYXRlRW1wdHlHYW1tYVRhYmxlIChzaG9ydCBjaGFubmVscywgc2hvcnQgZW50cmllcywgc2hvcnQgYml0cykKK3sKKwlHYW1tYVRibFB0cgkJcFRhYmxlR2FtbWFPdXQgPSBOVUxMOworCXNob3J0CQkJdGFibGVTaXplLCBkYXRhV2lkdGg7CisKKwlkYXRhV2lkdGggPSAoYml0cyArIDcpIC8gODsJCQkJCQkJCQkJLyogbnVtYmVyIG9mIGJ5dGVzIHBlciBlbnRyeSAqLworCXRhYmxlU2l6ZSA9IHNpemVvZiAoR2FtbWFUYmwpICsgKGNoYW5uZWxzICogZW50cmllcyAqIGRhdGFXaWR0aCk7CisJcFRhYmxlR2FtbWFPdXQgPSAoR2FtbWFUYmxQdHIpIE5ld1B0ckNsZWFyICh0YWJsZVNpemUpOwkJCS8qIGFsbG9jYXRlIG5ldyB0YWJlbCAqLworCisJaWYgKHBUYWJsZUdhbW1hT3V0KQkJCQkJCQkJCQkJCS8qIGlmIHdlIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgKi8KKwl7CisJCXBUYWJsZUdhbW1hT3V0LT5nVmVyc2lvbiA9IDA7CQkJCQkJCQkvKiBzZXQgcGFyYW1ldGVycyBiYXNlZCBvbiBpbnB1dCAqLworCQlwVGFibGVHYW1tYU91dC0+Z1R5cGUgPSAwOworCQlwVGFibGVHYW1tYU91dC0+Z0Zvcm11bGFTaXplID0gMDsKKwkJcFRhYmxlR2FtbWFPdXQtPmdDaGFuQ250ID0gY2hhbm5lbHM7CisJCXBUYWJsZUdhbW1hT3V0LT5nRGF0YUNudCA9IGVudHJpZXM7CisJCXBUYWJsZUdhbW1hT3V0LT5nRGF0YVdpZHRoID0gYml0czsKKwl9CisJcmV0dXJuIChQdHIpcFRhYmxlR2FtbWFPdXQ7CQkJCQkJCQkJCS8qIHJldHVybiB3aGF0ZXZlciB3ZSBhbGxvY2F0ZWQgKi8KK30KKworc3RhdGljIEJvb2xlYW4gU2V0RGV2aWNlR2FtbWFSYW1wR0QgKEdESGFuZGxlIGhHRCwgUHRyIHBSYW1wKQoreworCVZEU2V0RW50cnlSZWNvcmQgc2V0RW50cmllc1JlYzsKKwlWREdhbW1hUmVjb3JkCWdhbWVSZWNSZXN0b3JlOworCUdhbW1hVGJsUHRyCQlwVGFibGVHYW1tYU5ldzsKKwlHYW1tYVRibFB0cgkJcFRhYmxlR2FtbWFDdXJyZW50ID0gTlVMTDsKKwlDVGFiSGFuZGxlICAgICAgaENUYWJEZXZpY2VDb2xvcnM7CisJUHRyCQkJCWNzUHRyOworCU9TRXJyCQkJZXJyOworCXNob3J0IAkJCWRhdGFCaXRzLCBlbnRyaWVzLCBjaGFubmVscyA9IDM7CQkJCQkJLyogZm9yY2UgdGhyZWUgY2hhbm5lbHMgaW4gdGhlIGdhbW1hIHRhYmxlICovCisJCisJaWYgKHBSYW1wKQkJCQkJCQkJCQkJCQkJCQkvKiBlbnN1cmUgcFJhbXAgaXMgYWxsb2NhdGVkICovCisJeworCQllcnI9IEdldEdhbW1hVGFibGUgKGhHRCwgJnBUYWJsZUdhbW1hQ3VycmVudCk7CQkJCQkJLyogZ2V0IHBvaW50ZXIgdG8gY3VycmVudCB0YWJsZSAqLworCQlpZiAoKG5vRXJyID09IGVycikgJiYgcFRhYmxlR2FtbWFDdXJyZW50KQorCQl7CisJCQlkYXRhQml0cyA9IHBUYWJsZUdhbW1hQ3VycmVudC0+Z0RhdGFXaWR0aDsJCQkJCQkvKiB0YWJsZSBtdXN0IGhhdmUgc2FtZSBkYXRhIHdpZHRoICovCisJCQllbnRyaWVzID0gcFRhYmxlR2FtbWFDdXJyZW50LT5nRGF0YUNudDsJCQkJCQkJLyogdGFibGUgbXVzdCBiZSBzYW1lIHNpemUgKi8KKwkJCXBUYWJsZUdhbW1hTmV3ID0gKEdhbW1hVGJsUHRyKSBDcmVhdGVFbXB0eUdhbW1hVGFibGUgKGNoYW5uZWxzLCBlbnRyaWVzLCBkYXRhQml0cyk7IC8qIG91ciBuZXcgdGFibGUgKi8KKwkJCWlmIChwVGFibGVHYW1tYU5ldykJCQkJCQkJCQkJCQkvKiBpZiBzdWNjZXNzZnVsIGZpbGwgdGFibGUgKi8KKwkJCXsJCisJCQkJdW5zaWduZWQgY2hhciAqIHBHYW1tYUJhc2UgPSAodW5zaWduZWQgY2hhciAqKSAmcFRhYmxlR2FtbWFOZXctPmdGb3JtdWxhRGF0YSArIHBUYWJsZUdhbW1hTmV3LT5nRm9ybXVsYVNpemU7IC8qIGJhc2Ugb2YgdGFibGUgKi8KKwkJCQlpZiAoKDI1NiA9PSBlbnRyaWVzKSAmJiAoOCA9PSBkYXRhQml0cykpIAkJCQkJCS8qIHNpbXBsZSBjYXNlOiBkaXJlY3QgbWFwcGluZyAqLworCQkJCQlCbG9ja01vdmUgKChQdHIpcFJhbXAsIChQdHIpcEdhbW1hQmFzZSwgY2hhbm5lbHMgKiBlbnRyaWVzKTsgLyogbW92ZSBldmVyeXRoaW5nICovCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJLyogdG91Z2ggY2FzZSBoYW5kbGUgZW50cnksIGNoYW5uZWwgYW5kIGRhdGEgc2l6ZSBkaXNwYXJpdGllcyAqLworCQkJCXsKKwkJCQkJc2hvcnQgaW5kZXhDaGFuLCBpbmRleEVudHJ5OworCQkJCQlzaG9ydCBieXRlc1BlckVudHJ5ID0gKGRhdGFCaXRzICsgNykgLyA4OyAJCQkJLyogc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBkZXZpY2UgdGFibGUgZW50cmllcyAqLworCQkJCQlzaG9ydCBzaGlmdFJpZ2h0VmFsdWUgPSA4IC0gZGF0YUJpdHM7CQkJCQkvKiBudW1iZXIgb2YgcmlnaHQgc2hpZnRzIHJhbXAgLT4gZGV2aWNlICovCisJCQkJCXNoaWZ0UmlnaHRWYWx1ZSArPSAoKGJ5dGVzUGVyRW50cnkgLSAxKSAqIDgpOyAgCQkJLyogbXVsdGlieXRlIGVudHJpZXMgYW5kIHRoZSBuZWVkIHRvIG1hcCBhIGJ5dGUgYXQgYSB0aW1lIG1vc3Qgc2lnLiB0byBsZWFzdCBzaWcuICovCisJCQkJCWZvciAoaW5kZXhDaGFuID0gMDsgaW5kZXhDaGFuIDwgY2hhbm5lbHM7IGluZGV4Q2hhbisrKSAvKiBmb3IgYWxsIHRoZSBjaGFubmVscyAqLworCQkJCQkJZm9yIChpbmRleEVudHJ5ID0gMDsgaW5kZXhFbnRyeSA8IGVudHJpZXM7IGluZGV4RW50cnkrKykgLyogZm9yIGFsbCB0aGUgZW50cmllcyAqLworCQkJCQkJeworCQkJCQkJCXNob3J0IGN1cnJlbnRTaGlmdCA9IHNoaWZ0UmlnaHRWYWx1ZTsJCQkvKiByZXNldCBjdXJyZW50IGJpdCBzaGlmdCAqLworCQkJCQkJCWxvbmcgdGVtcCA9ICooKHVuc2lnbmVkIGNoYXIgKilwUmFtcCArIChpbmRleENoYW4gPDwgOCkgKyAoaW5kZXhFbnRyeSA8PCA4KSAvIGVudHJpZXMpOyAvKiBnZXQgZGF0YSBmcm9tIHJhbXAgKi8KKwkJCQkJCQlzaG9ydCBpbmRleEJ5dGU7CisJCQkJCQkJZm9yIChpbmRleEJ5dGUgPSAwOyBpbmRleEJ5dGUgPCBieXRlc1BlckVudHJ5OyBpbmRleEJ5dGUrKykgLyogZm9yIGFsbCBieXRlcyAqLworCQkJCQkJCXsKKwkJCQkJCQkJaWYgKGN1cnJlbnRTaGlmdCA8IDApCQkJCQkJLyogc2hpZnQgZGF0YSBjb3JyZWN0bHkgZm9yIGN1cnJlbnQgYnl0ZSAqLworCQkJCQkJCQkJKihwR2FtbWFCYXNlKyspID0gdGVtcCA8PCAtY3VycmVudFNoaWZ0OworCQkJCQkJCQllbHNlCisJCQkJCQkJCQkqKHBHYW1tYUJhc2UrKykgPSB0ZW1wID4+IGN1cnJlbnRTaGlmdDsKKwkJCQkJCQkJY3VycmVudFNoaWZ0IC09IDg7CQkJCQkJCS8qIGluY3JlbWVudCBzaGlmdCB0byBhbGlnbiB0byBuZXh0IGxlc3Mgc2lnLiBieXRlICovCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQkvKiBzZXQgZ2FtbWEgKi8KKwkJCQlnYW1lUmVjUmVzdG9yZS5jc0dUYWJsZSA9IChQdHIpIHBUYWJsZUdhbW1hTmV3OwkJCQkvKiBzZXR1cCByZXN0b3JlIHJlY29yZCAqLworCQkJCWNzUHRyID0gKFB0cikgJmdhbWVSZWNSZXN0b3JlOworCQkJCWVyciA9IENvbnRyb2woKCoqaEdEKS5nZFJlZk51bSwgY3NjU2V0R2FtbWEsIChQdHIpICZjc1B0cik7CS8qIHJlc3RvcmUgZ2FtbWEgKG5vdGUsIGRpc3BsYXkgZHJpdmVycyBtYXkgZGVsYXkgcmV0dXJuaW5nIGZyb20gdGhpcyB1bnRpbCBWQkwpICovCisJCQkJCisJCQkJaWYgKCg4ID09ICgqKigqKmhHRCkuZ2RQTWFwKS5waXhlbFNpemUpICYmIChub0VyciA9PSBlcnIpKQkvKiBpZiBzdWNjZXNzZnVsIGFuZCBvbiBhbiA4IGJpdCBkZXZpY2UgKi8KKwkJCQl7CisJCQkJCWhDVGFiRGV2aWNlQ29sb3JzID0gKCoqKCoqaEdEKS5nZFBNYXApLnBtVGFibGU7CQkJLyogZG8gU2V0RW50cmllcyB0byBmb3JjZSBDTFVUIHVwZGF0ZSAqLworCQkJCQlzZXRFbnRyaWVzUmVjLmNzVGFibGUgPSAoQ29sb3JTcGVjICopICYoKipoQ1RhYkRldmljZUNvbG9ycykuY3RUYWJsZTsKKwkJCQkJc2V0RW50cmllc1JlYy5jc1N0YXJ0ID0gMDsKKwkJCQkJc2V0RW50cmllc1JlYy5jc0NvdW50ID0gKCoqaENUYWJEZXZpY2VDb2xvcnMpLmN0U2l6ZTsKKwkJCQkJY3NQdHIgPSAoUHRyKSAmc2V0RW50cmllc1JlYzsKKwkJCQkJZXJyID0gQ29udHJvbCgoKipoR0QpLmdkUmVmTnVtLCBjc2NTZXRFbnRyaWVzLCAoUHRyKSAmY3NQdHIpOwkvKiBTZXRFbnRyaWVzIGluIENMVVQgKi8KKwkJCQl9CisJCQkJRGlzcG9zZUdhbW1hVGFibGUgKChQdHIpIHBUYWJsZUdhbW1hTmV3KTsJCQkJCS8qIGR1bXAgdGFibGUgKi8KKwkJCQlpZiAobm9FcnIgPT0gZXJyKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCQkJCQkJCQkJCQkJCQkJCQkvKiBzZXQgTlVMTCBnYW1tYSAtPiByZXN1bHRzIGluIGxpbmVhciBtYXAgKi8KKwl7CisJCWdhbWVSZWNSZXN0b3JlLmNzR1RhYmxlID0gKFB0cikgTlVMTDsJCQkJCQkJCS8qIHNldHVwIHJlc3RvcmUgcmVjb3JkICovCisJCWNzUHRyID0gKFB0cikgJmdhbWVSZWNSZXN0b3JlOworCQllcnIgPSBDb250cm9sKCgqKmhHRCkuZ2RSZWZOdW0sIGNzY1NldEdhbW1hLCAoUHRyKSAmY3NQdHIpOwkJCS8qIHJlc3RvcmUgZ2FtbWEgKi8KKwkJCisJCWlmICgoOCA9PSAoKiooKipoR0QpLmdkUE1hcCkucGl4ZWxTaXplKSAmJiAobm9FcnIgPT0gZXJyKSkJCQkvKiBpZiBzdWNjZXNzZnVsIGFuZCBvbiBhbiA4IGJpdCBkZXZpY2UgKi8KKwkJeworCQkJaENUYWJEZXZpY2VDb2xvcnMgPSAoKiooKipoR0QpLmdkUE1hcCkucG1UYWJsZTsJCQkJCS8qIGRvIFNldEVudHJpZXMgdG8gZm9yY2UgQ0xVVCB1cGRhdGUgKi8KKwkJCXNldEVudHJpZXNSZWMuY3NUYWJsZSA9IChDb2xvclNwZWMgKikgJigqKmhDVGFiRGV2aWNlQ29sb3JzKS5jdFRhYmxlOworCQkJc2V0RW50cmllc1JlYy5jc1N0YXJ0ID0gMDsKKwkJCXNldEVudHJpZXNSZWMuY3NDb3VudCA9ICgqKmhDVGFiRGV2aWNlQ29sb3JzKS5jdFNpemU7CisJCQljc1B0ciA9IChQdHIpICZzZXRFbnRyaWVzUmVjOworCQkJZXJyID0gQ29udHJvbCgoKipoR0QpLmdkUmVmTnVtLCBjc2NTZXRFbnRyaWVzLCAoUHRyKSAmY3NQdHIpOwkvKiBTZXRFbnRyaWVzIGluIENMVVQgKi8KKwkJfQorCQlpZiAobm9FcnIgPT0gZXJyKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsJCQkJCQkJCQkJCQkJCQkvKiBtZW1vcnkgYWxsb2NhdGlvbiBvciBkZXZpY2UgY29udHJvbCBmYWlsZWQgaWYgd2UgZ2V0IGhlcmUgKi8KK30KKworLyogZW5kIG9mIEFEQyBHYW1tYSBSYW1wIHN1cHBvcnQgY29kZS4uLiAqLworCitzdGF0aWMgUHRyIHN5c3RlbUdhbW1hUHRyOworCit2b2lkIE1hY19RdWl0R2FtbWEoX1RISVMpCit7CisJaWYgKHN5c3RlbUdhbW1hUHRyKQorCXsKKwkJUmVzdG9yZVN5c3RlbUdhbW1hcyhzeXN0ZW1HYW1tYVB0cik7CisJCURpc3Bvc2VTeXN0ZW1HYW1tYXMoJnN5c3RlbUdhbW1hUHRyKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNoaWZ0ZWRSYW1wWzMgKiAyNTZdOworCitpbnQgTWFjX1NldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKQoreworCWludCBpOworCWlmICghc3lzdGVtR2FtbWFQdHIpCisJCXN5c3RlbUdhbW1hUHRyID0gR2V0U3lzdGVtR2FtbWFzKCk7CisJZm9yIChpID0gMDsgaSA8IDMgKiAyNTY7IGkrKykKKwl7CisJCXNoaWZ0ZWRSYW1wW2ldID0gcmFtcFtpXSA+PiA4OworCX0KKworCWlmIChTZXREZXZpY2VHYW1tYVJhbXBHRChHZXRNYWluRGV2aWNlKCksIChQdHIpIHNoaWZ0ZWRSYW1wKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKK2ludCBNYWNfR2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApCit7CisJaWYgKEdldERldmljZUdhbW1hUmFtcEdEKEdldE1haW5EZXZpY2UoKSwgKFB0cikgc2hpZnRlZFJhbXApKQorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCAzICogMjU2OyBpKyspCisJCXsKKwkJCXJhbXBbaV0gPSBzaGlmdGVkUmFtcFtpXSA8PCA4OworCQl9CisJCXJldHVybiAwOworCX0KKwllbHNlCisJCXJldHVybiAtMTsKK30KKworI2VuZGlmICAvKiBTRExfTUFDQ0xBU1NJQ19HQU1NQV9TVVBQT1JUICovCisKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNjb21tb24vU0RMX21hY3dtX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWN3bV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1NTRkMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjY29tbW9uL1NETF9tYWN3bV9jLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICIuLi9tYWNyb20vU0RMX3JvbXZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgTWFjX1NldENhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKKworLyoKKyAqIFRoZXJlJ3Mgbm8gQ2FyYm9uaXplZCBnYW1tYSBzdXBwb3J0IGluIE1hYyBPUyBYLCBzaW5jZSBQQlN0YXR1c1N5bmMoKSBhbmQKKyAqICBDb250cm9sKCkgYXJlbid0IHN1cHBvcnRlZCBpbiBPUyBYJ3MgQ2FyYm9ubGliLiBVc2UgdGhlIFF1YXJ0eiBkcml2ZXIKKyAqICBpbnN0ZWFkLgorICovCisjZGVmaW5lIFNETF9NQUNDTEFTU0lDX0dBTU1BX1NVUFBPUlQgKChkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykpID09IDApCisKKyNpZiBTRExfTUFDQ0xBU1NJQ19HQU1NQV9TVVBQT1JUCitleHRlcm4gdm9pZCBNYWNfUXVpdEdhbW1hKF9USElTKTsKK2V4dGVybiBpbnQgTWFjX1NldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKK2V4dGVybiBpbnQgTWFjX0dldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2RzcC9TRExfZHNwdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjZHNwL1NETF9kc3B2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzExMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2RzcC9TRExfZHNwdmlkZW8uYwpAQCAtMCwwICsxLDE0MjIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorIFdyaXR0ZW4gYnkgRGFycmVsbCBXYWxpc3NlciA8ZHdhbGlzczFAcHVyZHVlLmVkdT4KKworIEltcGxlbWVudGF0aW9uIG5vdGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIEEgYml0IG9uIEdXb3JsZHMgaW4gVlJBTSBmcm9tIHRlY2hub3RlIDExODI6CisKKyBUaGVyZSBhcmUgdHdvIGltcG9ydGFudCB0aGluZ3MgdG8gbm90ZSBhYm91dCBHV29ybGQncyBhbGxvY2F0ZWQgaW4KKyBWUkFNLiBGaXJzdCwgdGhlIGJhc2UgYWRkcmVzcyByZXRyaWV2ZWQgdGhyb3VnaCBHZXRQaXhCYXNlQWRkciBvcgorIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgUGl4TWFwIHN0cnVjdHVyZSBjYW4gYmVjb21lIGludmFsaWQgYW55dGltZQorIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gVlJBTS4gVGhpcyBjYW4gb2NjdXIgZWl0aGVyIGJ5IGV4cGxpY2l0CisgYWxsb2NhdGlvbnMsIHN1Y2ggYXMgY2FsbHMgdG8gTmV3R1dvcmxkLCBvciBieSBpbXBsaWNpdCBvbmVzLCBzdWNoIGFzCisgdGhvc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnRlcm5hbCB0ZXh0dXJlIGFsbG9jYXRpb24gb2YgT3BlbkdMLiBUaGUKKyBzdG9yZWQgcGl4ZWwgaW1hZ2VzIHRoZW1zZWx2ZXMgd2lsbCBzdGlsbCBiZSB2YWxpZCBidXQgbWF5IGhhdmUgYmVlbgorIG1vdmVkIGluIFZSQU0sIHRodXMgcmVuZGVyaW5nIGFueSBzdG9yZWQgYmFzZSBhZGRyZXNzZXMgaW52YWxpZC4KKyBZb3Ugc2hvdWxkIG5ldmVyIHN0b3JlIGFuIGltYWdlJ3MgYmFzZSBhZGRyZXNzIGZvciBsb25nZXIgdGhhbiBpcworIG5lY2Vzc2FyeSBhbmQgZXNwZWNpYWxseSBuZXZlciBhY3Jvc3MgY2FsbHMgdG8gTmV3R1dvcmxkIG9yCisgdGV4dHVyZS1jcmVhdGlvbiByb3V0aW5lcy4gCisKKyBTZWNvbmRseSwgYW4gb2Zmc2NyZWVuIHBpeGVsIGltYWdlIGFsbG9jYXRlZCBpbiBWUkFNIGNhbiBiZQorIHB1cmdlZCBhdCBzeXN0ZW0gdGFzayB0aW1lIGJ5IHRoZSBkaXNwbGF5IGRyaXZlci4gVGhpcyBtZWFucyBhbnkKKyB0aW1lIHlvdXIgYXBwbGljYXRpb24geWllbGRzIHRpbWUgc3VjaCBieSBjYWxsaW5nIFdhaXROZXh0RXZlbnQgb3IKKyBTeXN0ZW1UYXNrIHlvdSBjYW4gbG9zZSB5b3VyIFZSQU0gR1dvcmxkIGNvbnRlbnRzLiBXaGlsZSB0aGlzCisgaGFwcGVucyBpbmZyZXF1ZW50bHksIHVzdWFsbHkgYXNzb2NpYXRlZCB3aXRoIGRpc3BsYXkgcmVzb2x1dGlvbiBvcgorIHBpeGVsIGRlcHRoIGNoYW5nZXMgeW91IG11c3QgY29kZSBmb3IgdGhpcyBldmVudHVhbGl0eS4gVGhpcyBwdXJnZQorIGNhbiBvY2N1ciB3aGV0aGVyIG9yIG5vdCB0aGUgR1dvcmxkIGlzIGxvY2tlZCBvciBub3QuIEEgcmV0dXJuIHZhbHVlCisgb2YgZmFsc2UgZnJvbSBMb2NrUGl4ZWxzLCBhIE5VTEwgcmV0dXJuIHZhbHVlIGZyb20gR2V0UGl4QmFzZUFkZHIKKyBvciBOVUxMIGluIHRoZSBiYXNlQWRkciBmaWVsZCBvZiB0aGUgUGl4TWFwIG1lYW4gdGhhdCB0aGUgcGl4ZWwKKyBpbWFnZSBoYXMgYmVlbiBwdXJnZWQuIFRvIHJlYWxsb2NhdGUgaXQgeW91IGNhbiBlaXRoZXIgY2FsbAorIFVwZGF0ZUdXb3JsZCBvciBEaXNwb3NlIHlvdXIgY3VycmVudCBHV29ybGQgdGhyb3VnaAorIERpc3Bvc2VHV29ybGQgYW5kIHJlYWxsb2NhdGUgaXQgdmlhIE5ld0dXb3JsZC4gRWl0aGVyIHdheSB5b3UgbXVzdAorIHRoZW4gcmVidWlsZCB0aGUgcGl4ZWwgaW1hZ2UuIAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBDdXJyZW50bHksIEkgZG9uJ3QgYWNjb3VudCBmb3IgKDEpLiBJbiBteSB0ZXN0aW5nLCBOZXdHV29ybGQgbmV2ZXIgaW52YWxpZGF0ZWQKKyAgb3RoZXIgZXhpc3RpbmcgR1dvcmxkcyBpbiBWUkFNLiBIb3dldmVyLCBJIGRvIGhhdmUgcHJvdGVjdGlvbiBmb3IgKDIpLgorICBOYW1lbHksIEkgYW0gdXNpbmcgR2V0T1NFdmVudCgpIGluc3RlYWQgb2YgV2FpdE5leHRFdmVudCgpIHNvIHRoYXQgdGhlcmUgYXJlIG5vCisgIGNvbnRleHQgc3dpdGNoZXMgKHRoZSBhcHAgaG9ncyB0aGUgQ1BVKS4gRXZlbnR1YWxseSBhIGJvb2sta2VlcGluZyBzeXN0ZW0gc2hvdWxkCisgIGJlIGNvZGVkIHRvIHRha2UgY2FyZSBvZiAoMSkgYW5kICgyKS4KKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBTeXN0ZW0gcmVxdWlyZW1lbnRzICgqIGRlbm90ZXMgb3B0aW9uYWwpOgorICAKKyAgMS4gRHJhd1Nwcm9ja2V0IDEuNy4zCisgIDIuICpNYWNPUyA5IG9yIGxhdGVyIChidXQgKm5vdCogTWFjIE9TIFgpIGZvciBoYXJkd2FyZSBhY2NlbGVyYXRlZCBibGl0IC8gZmlsbAorICAzLiAqTWF5IGFsc28gcmVxdWlyZSBjZXJ0YWluIGdyYXBoaWNzIGhhcmR3YXJlIGZvciAoMikuIEkgdHJ1c3QgdGhhdCBhbGwgQXBwbGUgT0VNCisgICAgIGhhcmR3YXJlIHdpbGwgd29yay4gVGhpcmQgcGFydHkgYWNjZWxlcmF0b3JzIG1heSB3b3JrIGlmIHRoZXkgaGF2ZSBRdWlja0RyYXcKKyAgICAgYWNjZWxlcmF0aW9uIGluIHRoZSBkcml2ZXJzIGFuZCB0aGUgZHJpdmVycyBoYXZlIGJlZW4gdXBkYXRlZCBmb3IgT1MgOS4gVGhlIGN1cnJlbnQKKyAgICAgVm9vZG9vIDMgZHJpdmVycyAoMS4wYjEyKSBkbyBub3Qgd29yay4KKyAgCisgIENvZGluZyBzdWdnZXN0aW9uczoKKyAgCisgIDEuIFVzZSBTRExfVXBkYXRlUmVjdHMgIQorICAKKyAgICBJZiBubyBRdWlja0RyYXcgYWNjZWxlcmF0aW9uIGlzIHByZXNlbnQsIGRvdWJsZS1idWZmZXJlZCBzdXJmYWNlcyB3aWxsIHVzZSBhIGJhY2sgYnVmZmVyCisgICAgaW4gU3lzdGVtIG1lbW9yeS4gSSByZWNvbW1lbmQgeW91IHVzZSBTRExfVXBkYXRlUmVjdHMgd2l0aCBkb3VibGUtYnVmZmVyZWQgc3VyZmFjZXMKKyAgICBmb3IgYmVzdCBwZXJmb3JtYW5jZSBvbiB0aGVzZSBjYXJkcywgc2luY2UgdGhlIG92ZXJoZWFkIGlzIG5lYXJseSB6ZXJvIGZvciBWUkFNIGJhY2sgYnVmZmVyLgorICAgIAorICAyLiBMb2FkIG1vc3QtcmVzaWRlbnQgc3VyZmFjZXMgZmlyc3QuCisgIAorICAgIElmIHlvdSBmaWxsIHVwIFZSQU0gb3IgQUdQIG1lbW9yeSwgdGhlcmUgaXMgbm8gY29udGluZ2VuY3kgZm9yIHB1cmdpbmcgdG8gbWFrZSByb29tIGZvciB0aGUgbmV4dCBvbmUuCisgICAgVGhlcmVmb3JlLCB5b3Ugc2hvdWxkIGxvYWQgdGhlIHN1cmZhY2VzIHlvdSBwbGFuIHRvIHVzZSB0aGUgbW9zdCBmcmVxdWVudGx5IGZpcnN0LgorICAgIFNvb25lciBvciBsYXRlciwgSSB3aWxsIGNvZGUgTFJVIHJlcGxhY2VtZW50IHRvIGhlbHAgdGhpcy4KKyAgCisgIFRPRE86CisgIFNvbWUga2luZCBvZiBwb3N0ZXJpemVkIG1vZGUgZm9yIHJlc29sdXRpb25zIDwgNjQweDQ4MC4KKyAgV2luZG93IHN1cHBvcnQgLyBmdWxsc2NyZWVuIHRvZ2dsZS4KKyAgRmlndXJlIG91dCBob3cgbXVjaCBWUkFNIGlzIGF2YWlsYWJsZS4gUHV0IGluIHZpZGVvLT5pbmZvLT52aWRlb19tZW0uCisgIFRyYWNrIFZSQU0gdXNhZ2UuCisgIAorICBCVUdTOgorICBJIGNhbid0IGNyZWF0ZSBhIGhhcmR3YXJlIHN1cmZhY2UgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgc2NyZWVuPyEgSG93IHRvIGZpeD8KKyAgCisgIAorCisgICBDT01QSUxFIE9QVElPTlM6CisgICAKKyAgIERTUF9UUllfQ0NfQU5EX0FBIC0gRGVmaW5lIGlmIHlvdSB3YW50IHRvIHRyeSBIV0EgY29sb3Ita2V5IGFuZCBhbHBoYSBibGl0dGVycworICAgICAgICAgICAgICAgICAgICAgICBIVyBjb2xvci1rZXkgYmxpdHRpbmcgZ2l2ZXMgc3Vic3RhbnRpYWwgaW1wcm92ZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBidXQgaHcgYWxwaGEgaXMgbmVjay1hbmQtbmVjayB3aXRoIFNETCdzIHNvZnQgYml0dGVyLgorCisgICBEU1BfTk9fU1lOQ19WQkwgICAtIERlZmluZSBmb3IgSFdBIGRvdWJsZS1idWZmZXJlZCBzdXJmYWNlczogZG9uJ3Qgc3luYworICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG8tZmxpcCB0byBtb25pdG9yIHJlZHJhdy4KKworICAgRFNQX05PX1NZTkNfT1BFTkdMIC0gRGVmaW5lIGZvciBPcGVuR0wgc3VyZmFjZXM6IGRvbid0IHN5bmMgYnVmZmVyIHN3YXAuIFN5bmNoaW5nIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgc3dhcCBtYXkgcmVzdWx0IGluIHJlZHVjZWQgcGVyZm9ybWFuY2UsIGJ1dCBjYW4gZWxpbWluYXRlIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJpbmcgYXJ0aWZhY3RzLgorICAgQ0hBTkdFTE9HOgorICAgMDkvMTcvMDAgTG90cyBvZiBsaXR0bGUgdHdlYWtzLiBCdWlsZCBtb2RlbGlzdCBpbiByZXZlcnNlIG9yZGVyIHNvIGxhcmdlc3QgY29udGV4dHMKKyAgICAgICAgICAgIGxpc3QgZmlyc3QuIENvbXBhcmVkIHZhcmlvdXMgbWV0aG9kcyB3aXRoIFJPTSBtZXRob2RzIGFuZCBmaXhlZCByZXogc3dpdGNoCisgICAgICAgICAgICBjcmFzaGluZyBidWcgaW4gR0wgVHJvbi4gKFdvb2hvbyEpCisqLworCisjZGVmaW5lIERTUF9UUllfQ0NfQU5EX0FBCisKKy8qICNkZWZpbmUgRFNQX05PX1NZTkNfVkJMICovCisKKyNkZWZpbmUgRFNQX05PX1NZTkNfT1BFTkdMCisKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKyNpbmNsdWRlIDxEcmF3U3Byb2NrZXQvRHJhd1Nwcm9ja2V0Lmg+CisjZWxpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgKFVOSVZFUlNBTF9JTlRFUkZBQ0VTX1ZFUlNJT04gPiAweDAzMzUpCisjaW5jbHVkZSA8Q2FyYm9uLmg+CisjaW5jbHVkZSA8RHJhd1Nwcm9ja2V0Lmg+CisjZWxzZQorI2luY2x1ZGUgPExvd01lbS5oPgorI2luY2x1ZGUgPEdlc3RhbHQuaD4KKyNpbmNsdWRlIDxEZXZpY2VzLmg+CisjaW5jbHVkZSA8RGlza0luaXQuaD4KKyNpbmNsdWRlIDxRRE9mZnNjcmVlbi5oPgorI2luY2x1ZGUgPERyYXdTcHJvY2tldC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfc3lzd20uaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYmxpdC5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIlNETF9kc3B2aWRlby5oIgorI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjZ2xfYy5oIgorI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjd21fYy5oIgorI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjbW91c2VfYy5oIgorI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjZXZlbnRzX2MuaCIKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERTcF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipEU3BfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBTRExfU3VyZmFjZSAqRFNwX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgRFNwX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAorCQkJIFNETF9Db2xvciAqY29sb3JzKTsKK3N0YXRpYyBpbnQgRFNwX0NyZWF0ZVBhbGV0dGUoX1RISVMpOworc3RhdGljIGludCBEU3BfRGVzdHJveVBhbGV0dGUoX1RISVMpOworc3RhdGljIHZvaWQgRFNwX1ZpZGVvUXVpdChfVEhJUyk7CisKK3N0YXRpYyBpbnQgRFNwX0dldE1haW5EZXZpY2UgKF9USElTLCBHREhhbmRsZSAqZGV2aWNlKTsKK3N0YXRpYyB2b2lkIERTcF9Jc0hXQXZhaWxhYmxlIChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyB2b2lkIERTcF9EU3BVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnNkbF9yZWN0cyk7CitzdGF0aWMgdm9pZCBEU3BfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpzZGxfcmVjdHMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBEU3BfU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVJbnQ4IGFscGhhKTsKK3N0YXRpYyBpbnQgRFNwX1NldEhXQ29sb3JLZXkoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCBVaW50MzIga2V5KTsKK3N0YXRpYyBpbnQgRFNwX05ld0hXU3VyZmFjZShfVEhJUywgQ0dyYWZQdHIgKnBvcnQsIGludCBkZXB0aCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK3N0YXRpYyBpbnQgRFNwX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IERTcF9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBEU3BfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBEU3BfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBEU3BfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBEU3BfQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkZXN0KTsKK3N0YXRpYyBpbnQgRFNwX0hXQWNjZWxCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpOworc3RhdGljIGludCBEU3BfRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKnJlY3QsIFVpbnQzMiBjb2xvcik7CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisgICBzdGF0aWMgdm9pZCBEU3BfR0xfU3dhcEJ1ZmZlcnMgKF9USElTKTsKKyNlbmRpZgorCisjaWYgISBUQVJHRVRfQVBJX01BQ19DQVJCT04KKworICAgICNkZWZpbmUgR2V0UG9ydFBpeFJvd0J5dGVzKHgpICAoICgqKHgtPnBvcnRQaXhNYXApKS0+cm93Qnl0ZXMgKQorICAgI2RlZmluZSBHZXRHRGV2UGl4TWFwKHgpICgoKiooeCkpLmdkUE1hcCkgICAKKyAgICNkZWZpbmUgR2V0UG9ydFBpeE1hcCh4KSAoKCooeCkpLnBvcnRQaXhNYXApCisgICAKKyAgICNkZWZpbmUgR2V0UGl4RGVwdGgoeSkgICAgKCgqKih5KSkucGl4ZWxTaXplKQorICAgLy8jZGVmaW5lIEdldFBpeFJvd0J5dGVzKHkpICgoKiooeSkpLnJvd0J5dGVzKQorICAgLy8jZGVmaW5lIEdldFBpeEJhc2VBZGRyKHkpICgoKiooeSkpLmJhc2VBZGRyKQorICAgI2RlZmluZSBHZXRQaXhDVGFiKHkpICAgICAoKCoqKHkpKS5wbVRhYmxlKQorICAgICNkZWZpbmUgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHgpICgmKCgoR3JhZlB0cikoeCkpLT5wb3J0Qml0cykpCisgICAKKyNlbHNlCisgICAgI2RlZmluZSBHZXRQb3J0UGl4Um93Qnl0ZXMoeCkgKEdldFBpeFJvd0J5dGVzKEdldFBvcnRQaXhNYXAoeCkpICkKKyAgICAjZGVmaW5lIEdldEdEZXZQaXhNYXAoeCkgKCgqKih4KSkuZ2RQTWFwKQorCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgeworCisgIEdXb3JsZFB0ciBvZmZzY3JlZW47ICAgIC8vIG9mZnNjcmVlbiBnd29ybGQgaW4gVlJBTSBvciBBR1AKKyAgCisgICNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQQorICAgIEdXb3JsZFB0ciBtYXNrOyAgICAgICAgIC8vIHRyYW5zcGFyZW50IG1hc2sKKyAgICBSR0JDb2xvciAgYWxwaGE7ICAgICAgICAvLyBhbHBoYSBjb2xvcgorICAgIFJHQkNvbG9yICB0cmFuczsgICAgICAgIC8vIHRyYW5zcGFyZW50IGNvbG9yCisgICNlbmRpZgorICAKK30gcHJpdmF0ZV9od2RhdGE7CisKK3R5cGVkZWYgcHJpdmF0ZV9od2RhdGEgcHJpdmF0ZV9zd2RhdGEgOyAvKiBoYXZlIHNhbWUgZmllbGRzICovCisKKy8qIE1hY2ludG9zaCB0b29sYm94IGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgRFNwX0F2YWlsYWJsZSh2b2lkKQoreworCS8qIENoZWNrIGZvciBEcmF3U3Byb2NrZXQgKi8KKyNpZiAhIFRBUkdFVF9BUElfTUFDX09TWAorCS8qIFRoaXMgY2hlY2sgaXMgb25seSBtZWFuaW5nZnVsIGlmIHlvdSB3ZWFrLWxpbmsgRHJhd1Nwcm9ja2V0TGliICovICAKKwlyZXR1cm4gKChQdHIpRFNwU3RhcnR1cCAhPSAoUHRyKWtVbnJlc29sdmVkQ0ZyYWdTeW1ib2xBZGRyZXNzKTsKKyNlbHNlCisJcmV0dXJuIDE7IC8vIERyYXdTcHJvY2tldC5mcmFtZXdvcmsgZG9lc24ndCBoYXZlIGl0IGFsbCwgYnV0IGl0J3MgdGhlcmUKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBEU3BfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCS8qIC1kdy0gdGFraW5nIG5vIGNoYW5jZXMgd2l0aCBudWxsIHBvaW50ZXJzICovCisJaWYgKGRldmljZSkgeworCQkKKyAgIAlpZiAoZGV2aWNlLT5oaWRkZW4pIHsKKyAgIAkgICAKKyAgIAkgICBpZiAoZGV2aWNlLT5oaWRkZW4tPmRzcGluZm8pCisJICAgICAgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4tPmRzcGluZm8pOworICAgCSAgIAorICAgCSAgIFNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKyAgIAl9CisJICAgU0RMX2ZyZWUoZGV2aWNlKTsJCisJfQorfQorCitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpEU3BfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgc2l6ZW9mICgqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwkgICAgaWYgKGRldmljZS0+aGlkZGVuKQorCSAgICAgICAgU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgc2l6ZW9mICggKihkZXZpY2UtPmhpZGRlbikgKSApOworCX0KKwlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCQorCQlpZiAoIGRldmljZSApIHsKKwkJCQorCQkJaWYgKGRldmljZS0+aGlkZGVuKQorCQkJCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsJCQkKKwkJCQorCQkJU0RMX2ZyZWUoZGV2aWNlKTsKKwkJfQorCQkKKwkJcmV0dXJuKE5VTEwpOworCX0KKwkKKwkvKiBBbGxvY2F0ZSBEcmF3U3Byb2NrZXQgaW5mb3JtYXRpb24gKi8KKwlkZXZpY2UtPmhpZGRlbi0+ZHNwaW5mbyA9IChzdHJ1Y3QgRFNwSW5mbyAqKVNETF9tYWxsb2MoCisJCQkJCShzaXplb2YgKmRldmljZS0+aGlkZGVuLT5kc3BpbmZvKSk7CisJaWYgKCBkZXZpY2UtPmhpZGRlbi0+ZHNwaW5mbyA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCQlTRExfZnJlZShkZXZpY2UpOworCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4tPmRzcGluZm8sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuLT5kc3BpbmZvKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgICAgICAgPSBEU3BfVmlkZW9Jbml0OworCWRldmljZS0+TGlzdE1vZGVzICAgICAgID0gRFNwX0xpc3RNb2RlczsKKwlkZXZpY2UtPlNldFZpZGVvTW9kZSAgICA9IERTcF9TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5TZXRDb2xvcnMgICAgICAgPSBEU3BfU2V0Q29sb3JzOworCWRldmljZS0+VXBkYXRlUmVjdHMgICAgID0gTlVMTDsKKwlkZXZpY2UtPlZpZGVvUXVpdCAgICAgICA9IERTcF9WaWRlb1F1aXQ7CisJZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSAgPSBEU3BfQWxsb2NIV1N1cmZhY2U7CisJZGV2aWNlLT5DaGVja0hXQmxpdCAgICAgPSBOVUxMOworCWRldmljZS0+RmlsbEhXUmVjdCAgICAgID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQ29sb3JLZXkgICA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0FscGhhICAgICAgPSBOVUxMOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSAgID0gRFNwX0xvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBEU3BfVW5sb2NrSFdTdXJmYWNlOworCWRldmljZS0+RmxpcEhXU3VyZmFjZSAgID0gRFNwX0ZsaXBIV1N1cmZhY2U7CisJZGV2aWNlLT5GcmVlSFdTdXJmYWNlICAgPSBEU3BfRnJlZUhXU3VyZmFjZTsKKyNpZiBTRExfTUFDQ0xBU1NJQ19HQU1NQV9TVVBQT1JUCisJZGV2aWNlLT5TZXRHYW1tYVJhbXAgICAgPSBNYWNfU2V0R2FtbWFSYW1wOworCWRldmljZS0+R2V0R2FtbWFSYW1wICAgID0gTWFjX0dldEdhbW1hUmFtcDsKKyNlbmRpZgorI2lmIFNETF9WSURFT19PUEVOR0wKKwlkZXZpY2UtPkdMX01ha2VDdXJyZW50ICA9IE1hY19HTF9NYWtlQ3VycmVudDsKKwlkZXZpY2UtPkdMX1N3YXBCdWZmZXJzICA9IERTcF9HTF9Td2FwQnVmZmVyczsKKwlkZXZpY2UtPkdMX0xvYWRMaWJyYXJ5ID0gTWFjX0dMX0xvYWRMaWJyYXJ5OworCWRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBNYWNfR0xfR2V0UHJvY0FkZHJlc3M7CisjZW5kaWYKKwlkZXZpY2UtPlNldENhcHRpb24gPSBOVUxMOworCWRldmljZS0+U2V0SWNvbiA9IE5VTEw7CisJZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gTlVMTDsKKwlkZXZpY2UtPkdyYWJJbnB1dCA9IE5VTEw7CisJZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOworCWRldmljZS0+RnJlZVdNQ3Vyc29yICAgID0gTWFjX0ZyZWVXTUN1cnNvcjsKKwlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yICA9IE1hY19DcmVhdGVXTUN1cnNvcjsKKwlkZXZpY2UtPlNob3dXTUN1cnNvciAgICA9IE1hY19TaG93V01DdXJzb3I7CisJZGV2aWNlLT5XYXJwV01DdXJzb3IgICAgPSBNYWNfV2FycFdNQ3Vyc29yOworCWRldmljZS0+SW5pdE9TS2V5bWFwICAgID0gTWFjX0luaXRPU0tleW1hcDsKKwlkZXZpY2UtPlB1bXBFdmVudHMgICAgICA9IE1hY19QdW1wRXZlbnRzOworCQorCWRldmljZS0+R3JhYklucHV0ICAgICAgPSBOVUxMOworCWRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBOVUxMOworCQorCWRldmljZS0+ZnJlZSA9IERTcF9EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBEU3BfYm9vdHN0cmFwID0geworCSJEU3AiLCAiTWFjT1MgRHJhd1Nwcm9ja2V0IiwKKwlEU3BfQXZhaWxhYmxlLCBEU3BfQ3JlYXRlRGV2aWNlCit9OworCisvKiBVc2UgRFNwL0Rpc3BsYXkgTWFuYWdlciB0byBidWlsZCBtb2RlIGxpc3QgZm9yIGdpdmVuIHNjcmVlbiAqLworc3RhdGljIFNETF9SZWN0KiogIERTcF9CdWlsZE1vZGVMaXN0IChjb25zdCBHREhhbmRsZSBnRGV2aWNlLCBpbnQgKmRpc3BsYXlXaWR0aCwgaW50ICpkaXNwbGF5SGVpZ2h0KQoreworCURTcENvbnRleHRBdHRyaWJ1dGVzICBhdHRyaWJ1dGVzOworCURTcENvbnRleHRSZWZlcmVuY2UgICBjb250ZXh0OworCURpc3BsYXlJRFR5cGUgICAgICAgICBkaXNwbGF5SUQ7CisJU0RMX1JlY3QgdGVtcF9saXN0IFsxNl07CisJU0RMX1JlY3QgKiptb2RlX2xpc3Q7CisJaW50IHdpZHRoLCBoZWlnaHQsIGksIGo7CisgICAgICAgIAorICAgICAgICAjaWYgVEFSR0VUX0FQSV9NQUNfT1NYCQkKKwkKKyAgICAgICAgZGlzcGxheUlEID0gMDsKKyAgICAgICAgCisgICAgICAgICNlbHNlCisgICAgICAgIC8qIEFzayBEaXNwbGF5IE1hbmFnZXIgZm9yIGludGVnZXIgaWQgb2Ygc2NyZWVuIGRldmljZSAqLworCWlmICggRE1HZXREaXNwbGF5SURCeUdEZXZpY2UgKGdEZXZpY2UsICZkaXNwbGF5SUQsIFNETF9UUlVFKSAhPSBub0VyciApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSNlbmRpZgorCS8qIEdldCB0aGUgZmlyc3QgcG9zc2libGUgRFNwIGNvbnRleHQgb24gdGhpcyBkZXZpY2UgKi8KKwlpZiAoIERTcEdldEZpcnN0Q29udGV4dCAoZGlzcGxheUlELCAmY29udGV4dCkgIT0gbm9FcnIgKSB7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlpZiAoIERTcENvbnRleHRfR2V0QXR0cmlidXRlcyAoY29udGV4dCwgJmF0dHJpYnV0ZXMpICE9IG5vRXJyICkKKwkJcmV0dXJuIE5VTEw7CisKKwkqZGlzcGxheVdpZHRoID0gYXR0cmlidXRlcy5kaXNwbGF5V2lkdGg7CisJKmRpc3BsYXlIZWlnaHQgPSBhdHRyaWJ1dGVzLmRpc3BsYXlIZWlnaHQ7CisJCQkKKwlmb3IgKCBpID0gMDsgaSA8IFNETF9hcnJheXNpemUodGVtcF9saXN0KTsgaSsrICkgeworCQl3aWR0aCAgPSBhdHRyaWJ1dGVzLmRpc3BsYXlXaWR0aDsKKwkJaGVpZ2h0ID0gYXR0cmlidXRlcy5kaXNwbGF5SGVpZ2h0OworCQkKKwkJdGVtcF9saXN0IFtpXS54ID0gMCB8IGF0dHJpYnV0ZXMuZGlzcGxheUJlc3REZXB0aDsKKwkJdGVtcF9saXN0IFtpXS55ID0gMDsKKwkJdGVtcF9saXN0IFtpXS53ID0gd2lkdGg7CisJCXRlbXBfbGlzdCBbaV0uaCA9IGhlaWdodDsKKwkKKwkJLyogRFNwIHdpbGwgcmVwb3J0IG1hbnkgZGlmZmVyZW50IGNvbnRleHRzIHdpdGggdGhlIHNhbWUgd2lkdGggYW5kIGhlaWdodC4gKi8KKwkJLyogVGhleSB3aWxsIGRpZmZlciBpbiBiaXQgZGVwdGggYW5kIHJlZnJlc2ggcmF0ZS4gKi8KKwkJLyogV2Ugd2lsbCBpZ25vcmUgdGhlbSB1bnRpbCB3ZSByZWFjaCBvbmUgd2l0aCBhIGRpZmZlcmVudCB3aWR0aC9oZWlnaHQgKi8KKwkJLyogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjb250ZXh0cyB0byBsb29rIGF0LCB3ZSB3aWxsIHF1aXQgYnVpbGRpbmcgdGhlIGxpc3QqLworCQl3aGlsZSAoIHdpZHRoID09IGF0dHJpYnV0ZXMuZGlzcGxheVdpZHRoICYmIGhlaWdodCA9PSBhdHRyaWJ1dGVzLmRpc3BsYXlIZWlnaHQgKSB7CisJCQorCQkJT1NTdGF0dXMgZXJyID0gRFNwR2V0TmV4dENvbnRleHQgKGNvbnRleHQsICZjb250ZXh0KTsKKwkJCWlmIChlcnIgIT0gbm9FcnIpCisJCQkJaWYgKGVyciA9PSBrRFNwQ29udGV4dE5vdEZvdW5kRXJyKQorCQkJCQlnb3RvIGRvbmU7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gTlVMTDsJCQorCQkJCisJCQlpZiAoIERTcENvbnRleHRfR2V0QXR0cmlidXRlcyAoY29udGV4dCwgJmF0dHJpYnV0ZXMpICE9IG5vRXJyICkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCQkKKwkJCXRlbXBfbGlzdCBbaV0ueCB8PSBhdHRyaWJ1dGVzLmRpc3BsYXlCZXN0RGVwdGg7CisJCX0KKwl9Citkb25lOgorCWkrKzsgICAgICAgICAgLyogaSB3YXMgbm90IGluY3JlbWVudGVkIGJlZm9yZSBraWNraW5nIG91dCBvZiB0aGUgbG9vcCAqLworCQorCW1vZGVfbGlzdCA9IChTRExfUmVjdCoqKSBTRExfbWFsbG9jIChzaXplb2YgKFNETF9SZWN0KikgKiAoaSsxKSk7CisJaWYgKG1vZGVfbGlzdCkgeworCQorCSAgIC8qIC1kdy0gbmV3IHN0dWZmOiBidWlsZCBpbiByZXZlcnNlIG9yZGVyIHNvIGxhcmdlc3Qgc2l6ZXMgbGlzdCBmaXJzdCAqLworCQlmb3IgKGogPSBpLTE7IGogPj0gMDsgai0tKSB7CisJCQltb2RlX2xpc3QgW2pdID0gKFNETF9SZWN0KikgU0RMX21hbGxvYyAoc2l6ZW9mIChTRExfUmVjdCkpOwkKKwkJCWlmIChtb2RlX2xpc3QgW2pdKQorCQkJCVNETF9tZW1jcHkgKG1vZGVfbGlzdCBbal0sICYodGVtcF9saXN0IFtqXSksIHNpemVvZiAoU0RMX1JlY3QpKTsKKwkJCWVsc2UgeworCQkJCVNETF9PdXRPZk1lbW9yeSAoKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQltb2RlX2xpc3QgW2ldID0gTlVMTDsJCS8qIGFwcGVuZCBudWxsIHRvIHRoZSBlbmQgKi8KKwl9CisJZWxzZSB7CisJCVNETF9PdXRPZk1lbW9yeSAoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQkKKwlyZXR1cm4gbW9kZV9saXN0OworfQorCitzdGF0aWMgdm9pZCBEU3BfSXNIV0F2YWlsYWJsZSAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKyAgLyogCisgICAgIFZSQU0gR1dvcmxkcyBhcmUgb25seSBhdmFpbGFibGUgb24gT1MgOSBvciBsYXRlci4KKyAgICAgRXZlbiB3aXRoIE9TIDksIHNvbWUgZGlzcGxheSBkcml2ZXJzIHdvbid0IHN1cHBvcnQgaXQsIAorICAgICBzbyB3ZSBjcmVhdGUgYSB0ZXN0IEdXb3JsZCBhbmQgY2hlY2sgZm9yIGVycm9ycy4gCisgICovCisKKyAgbG9uZyB2ZXJzaW9uU3lzdGVtOworCisgIGRzcF92cmFtX2F2YWlsYWJsZSA9IFNETF9GQUxTRTsKKyAgZHNwX2FncF9hdmFpbGFibGUgID0gU0RMX0ZBTFNFOworICAKKyAgR2VzdGFsdCAoJ3N5c3YnLCAmdmVyc2lvblN5c3RlbSk7CisgIGlmICgweDAwMDAwODYwIDwgKHZlcnNpb25TeXN0ZW0gJiAweDAwMDBGRkZGKSkgeworICAgIAorICAgIEdXb3JsZFB0ciBvZmZzY3JlZW47CisgICAgT1NTdGF0dXMgIGVycjsKKyAgICBSZWN0ICAgICAgYm91bmRzOworICAgIAorICAgIFNldFJlY3QgKCZib3VuZHMsIDAsIDAsIDMyMCwgMjQwKTsKKyAgICAKKyNpZiB1c2VEaXN0YW50SGR3ck1lbSAmJiB1c2VMb2NhbEhkd3JNZW0KKyAgICBlcnIgPSBOZXdHV29ybGQgKCZvZmZzY3JlZW4sIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCwgJmJvdW5kcywgTlVMTCwgU0RMX0Rpc3BsYXksIHVzZURpc3RhbnRIZHdyTWVtIHwgbm9OZXdEZXZpY2UpOworICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgIGRzcF92cmFtX2F2YWlsYWJsZSA9IFNETF9UUlVFOworICAgICAgRGlzcG9zZUdXb3JsZCAob2Zmc2NyZWVuKTsKKyAgICB9CisJCisgICAgZXJyID0gTmV3R1dvcmxkICgmb2Zmc2NyZWVuLCB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwsICZib3VuZHMsIE5VTEwsIFNETF9EaXNwbGF5LCB1c2VMb2NhbEhkd3JNZW0gfCBub05ld0RldmljZSk7CisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgRGlzcG9zZUdXb3JsZCAob2Zmc2NyZWVuKTsKKyAgICAgIGRzcF9hZ3BfYXZhaWxhYmxlID0gU0RMX1RSVUU7CisgICAgfQorI2VuZGlmCisgIH0KK30KKworc3RhdGljIGludCBEU3BfR2V0TWFpbkRldmljZSAoX1RISVMsIEdESGFuZGxlICpkZXZpY2UpCit7CisgICAgCisjaWYgVEFSR0VUX0FQSV9NQUNfT1NYCisgICAgICAgIC8qIERTcFVzZXJTZWxlY3RDb250ZXh0IG5vdCBhdmFpbGFibGUgb24gT1MgWCAqLworICAgICAgICAqZGV2aWNlID0gR2V0TWFpbkRldmljZSgpOworICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAgIAorCURTcENvbnRleHRBdHRyaWJ1dGVzIGF0dHJpYjsKKwlEU3BDb250ZXh0UmVmZXJlbmNlICBjb250ZXh0OworCURpc3BsYXlJRFR5cGUgICAgICAgIGRpc3BsYXlfaWQ7CisJR0RIYW5kbGUgICAgICAgICAgICAgbWFpbl9kZXZpY2U7CisJR0RIYW5kbGUgICAgICAgICAgICAgZGV2aWNlX2xpc3Q7CisJCisJZGV2aWNlX2xpc3QgPSBHZXREZXZpY2VMaXN0ICgpOworCW1haW5fZGV2aWNlID0gR2V0TWFpbkRldmljZSAoKTsKKwkKKwkvKiBRdWljayBjaGVjayB0byBhdm9pZCBzbG93ZXIgbWV0aG9kIHdoZW4gb25seSBvbmUgZGlzcGxheSBleGlzdHMgKi8KKwlpZiAoICgqKmRldmljZV9saXN0KS5nZE5leHRHRCA9PSBOVUxMICkgeworCSAgKmRldmljZSA9IG1haW5fZGV2aWNlOworCSAgcmV0dXJuIDA7CisJfQorCQkKKwlTRExfbWVtc2V0ICgmYXR0cmliLCAwLCBzaXplb2YgKERTcENvbnRleHRBdHRyaWJ1dGVzKSk7CisKKwkvKiBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBob3BlZnVsbHkgc3VwcG9ydGVkIG9uIGFsbCBkZXZpY2VzLi4uKi8KKwlhdHRyaWIuZGlzcGxheVdpZHRoICAgICAgICAgPSA2NDA7CisJYXR0cmliLmRpc3BsYXlIZWlnaHQgICAgICAgID0gNDgwOworCWF0dHJpYi5kaXNwbGF5QmVzdERlcHRoICAgICA9IDg7CisJYXR0cmliLmJhY2tCdWZmZXJCZXN0RGVwdGggID0gODsKKwlhdHRyaWIuZGlzcGxheURlcHRoTWFzayAgICAgPSBrRFNwRGVwdGhNYXNrX0FsbDsKKwlhdHRyaWIuYmFja0J1ZmZlckRlcHRoTWFzayAgPSBrRFNwRGVwdGhNYXNrX0FsbDsKKwlhdHRyaWIuY29sb3JOZWVkcyAgICAgICAgICAgPSBrRFNwQ29sb3JOZWVkc19SZXF1aXJlOworCWF0dHJpYi5wYWdlQ291bnQgICAgICAgICAgICA9IDE7CisJCQkgCisJaWYgKG5vRXJyICE9IERNR2V0RGlzcGxheUlEQnlHRGV2aWNlIChtYWluX2RldmljZSwgJmRpc3BsYXlfaWQsIFNETF9GQUxTRSkpIHsKKwkJU0RMX1NldEVycm9yICgiRGlzcGxheSBNYW5hZ2VyIGNvdWxkbid0IGFzc29jaWF0ZSBHRGV2aWNlIHdpdGggYSBEaXNwbGF5IElEIik7CisJCXJldHVybiAoLTEpOworCX0KKwkKKwkvKiBQdXQgdXAgZGlhbG9nIG9uIG1haW4gZGlzcGxheSB0byBzZWxlY3Qgd2hpY2ggZGlzcGxheSB0byB1c2UgKi8KKwlpZiAobm9FcnIgIT0gRFNwVXNlclNlbGVjdENvbnRleHQgKCZhdHRyaWIsIGRpc3BsYXlfaWQsIE5VTEwsICZjb250ZXh0KSkgeworCQlTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGRuJ3QgY3JlYXRlIGEgY29udGV4dCIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisgICAgICAgICAKKwlpZiAobm9FcnIgIT0gRFNwQ29udGV4dF9HZXREaXNwbGF5SUQgKGNvbnRleHQsICZkaXNwbGF5X2lkKSkgeworCQlTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGRuJ3QgZ2V0IGRpc3BsYXkgSUQiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorICAKKwlpZiAobm9FcnIgIT0gRE1HZXRHRGV2aWNlQnlEaXNwbGF5SUQgIChkaXNwbGF5X2lkLCAmbWFpbl9kZXZpY2UsIFNETF9GQUxTRSkpIHsKKwkJU0RMX1NldEVycm9yICgiRGlzcGxheSBNYW5hZ2VyIGNvdWxkbid0IGFzc29jaWF0ZSBEaXNwbGF5IElEIHdpdGggR0RldmljZSIpOworCQlyZXR1cm4gKC0xKTsgIAorCX0KKworCSpkZXZpY2UgPSBtYWluX2RldmljZTsKKwlyZXR1cm4gKDApOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgRFNwX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQoreworCU51bVZlcnNpb24gZHNwX3ZlcnNpb24gPSB7IDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkKKyNpZiBVTklWRVJTQUxfSU5URVJGQUNFU19WRVJTSU9OID4gMHgwMzIwCisJZHNwX3ZlcnNpb24gPSBEU3BHZXRWZXJzaW9uICgpOworI2VuZGlmCisJCisJaWYgKCAgKGRzcF92ZXJzaW9uLm1ham9yUmV2ID09IDEgJiYgZHNwX3ZlcnNpb24ubWlub3JBbmRCdWdSZXYgPCAweDczKSB8fAorCSAgICAgIChkc3BfdmVyc2lvbi5tYWpvclJldiA8IDEpICApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAgICAKKwkgICAvKiBTdGFuZGFyZEFsZXJ0IChrQWxlcnRTdG9wQWxlcnQsICJccEVycm9yISIsIAorCSAgICAgICAgICAgICAgICAiXHBJIG5lZWQgRHJhd1Nwcm9ja2V0IDEuNy4zIG9yIGxhdGVyIVxuIgorCSAgICAgICAgICAgICAgICAgICJZb3UgY2FuIGZpbmQgYSBuZXdlciB2ZXJzaW9uIGF0IGh0dHA6Ly93d3cuYXBwbGUuY29tL3N3dXBkYXRlcy4iLAorCSAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKwkgICAgKi8gICAgICAgICAgICAgIAorCSAgICBTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgdmVyc2lvbiBpcyB0b28gb2xkLiBOZWVkIDEuNy4zIG9yIGxhdGVyLiIpOworCSAgICByZXR1cm4gKC0xKTsKKwl9CisJCisJaWYgKCBEU3BTdGFydHVwICgpICE9IG5vRXJyICkgeworCQlTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGRuJ3Qgc3RhcnR1cCIpOworCQlyZXR1cm4oLTEpOworCX0KKwkKKwkvKiBTdGFydCBEU3BpbnRvc2ggZXZlbnRzICovCisJTWFjX0luaXRFdmVudHModGhpcyk7CisKKwkvKiBHZXQgYSBoYW5kbGUgdG8gdGhlIG1haW4gbW9uaXRvciwgb3IgY2hvb3NlIG9uZSBvbiBtdWx0aXBsZSBtb25pdG9yIHNldHVwcyAqLworCWlmICggRFNwX0dldE1haW5EZXZpY2UodGhpcywgJlNETF9EaXNwbGF5KSA8ICAwKQorCQlyZXR1cm4gKC0xKTsKKworCS8qIERldGVybWluZSBwaXhlbCBmb3JtYXQgKi8KKyAgICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBHZXRQaXhEZXB0aCAoICgqKlNETF9EaXNwbGF5KS5nZFBNYXAgKTsKKwlkc3Bfb2xkX2RlcHRoID0gdmZvcm1hdC0+Qml0c1BlclBpeGVsOworCQkKKwlzd2l0Y2ggKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCkgeworCQljYXNlIDE2OgkKKwkJCXZmb3JtYXQtPlJtYXNrID0gMHgwMDAwN2MwMDsKKwkJCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDNlMDsKKwkJCXZmb3JtYXQtPkJtYXNrID0gMHgwMDAwMDAxZjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorICAgCisJaWYgKCBEU3BfQ3JlYXRlUGFsZXR0ZSAodGhpcykgPCAwICkgeworCQlTRExfU2V0RXJyb3IgKCJDb3VsZCBub3QgY3JlYXRlIHBhbGV0dGUiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorICAgCisJLyogR2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgZnVsbHNjcmVlbiBtb2RlcyAqLworCVNETF9tb2RlbGlzdCA9IERTcF9CdWlsZE1vZGVMaXN0IChTRExfRGlzcGxheSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoaXMtPmluZm8uY3VycmVudF93LCAmdGhpcy0+aW5mby5jdXJyZW50X2gpOworCWlmIChTRExfbW9kZWxpc3QgPT0gTlVMTCkgeworCQlTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGQgbm90IGJ1aWxkIGEgbW9kZSBsaXN0Iik7CisJCXJldHVybiAoLTEpOworCX0KKwkKKwkvKiBDaGVjayBmb3IgVlJBTSBhbmQgQUdQIEdXb3JsZHMgZm9yIEhXIEJsaXR0aW5nICovCisJRFNwX0lzSFdBdmFpbGFibGUgKHRoaXMsIHZmb3JtYXQpOworCQorCXRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMDsKKworCWlmIChkc3BfdnJhbV9hdmFpbGFibGUgfHwgZHNwX2FncF9hdmFpbGFibGUpIHsKKyAgICAKKwkgIHRoaXMtPmluZm8uaHdfYXZhaWxhYmxlID0gU0RMX1RSVUU7CisJICAKKwkgIHRoaXMtPkNoZWNrSFdCbGl0ICA9IERTcF9DaGVja0hXQmxpdDsKKwkgIHRoaXMtPmluZm8uYmxpdF9odyA9IFNETF9UUlVFOyAKKyAgCisJICB0aGlzLT5GaWxsSFdSZWN0ICAgICA9IERTcF9GaWxsSFdSZWN0OworCSAgdGhpcy0+aW5mby5ibGl0X2ZpbGwgPSBTRExfVFJVRTsKKwkgIAorCSNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQSAgCisJICB0aGlzLT5TZXRIV0NvbG9yS2V5ICAgPSBEU3BfU2V0SFdDb2xvcktleTsKKwkgIHRoaXMtPmluZm8uYmxpdF9od19DQyA9IFNETF9UUlVFOworCSAgCisJICB0aGlzLT5TZXRIV0FscGhhICAgICAgPSBEU3BfU2V0SFdBbHBoYTsKKwkgIHRoaXMtPmluZm8uYmxpdF9od19BICA9IFNETF9UUlVFOworCSNlbmRpZgorCQorCX0gIAorICAgIAorCXJldHVybigwKTsKK30KKworc3RhdGljIFNETF9SZWN0ICoqRFNwX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKwlzdGF0aWMgU0RMX1JlY3QgKmRzcF9tb2Rlc1sxNl07CisJaW50IGkgPSAwLCBqID0gMDsKKwkKKwlpZiAoIGZvcm1hdC0+Qml0c1BlclBpeGVsID09IDAgKQorCSAgIHJldHVybiAoIChTRExfUmVjdCoqKSBOVUxMICk7CisJCisJd2hpbGUgKFNETF9tb2RlbGlzdFtpXSAhPSBOVUxMKSB7CisJCisJICAgaWYgKFNETF9tb2RlbGlzdFtpXS0+eCAmIGZvcm1hdC0+Qml0c1BlclBpeGVsKSB7CisJICAgICAgZHNwX21vZGVzW2pdID0gU0RMX21vZGVsaXN0W2ldOworCSAgICAgIGorKzsKKwkgICB9CisJICAgaSsrOworCX0KKwkKKwlkc3BfbW9kZXNbal0gPSBOVUxMOworCisJcmV0dXJuIGRzcF9tb2RlczsKK30KKworLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KK3N0YXRpYyB2b2lkIERTcF9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKKworI2lmICEgVEFSR0VUX0FQSV9NQUNfT1NYCisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcmV0cmFjZV9jb3VudCA9IDA7IC8qIC1kdy0gbmVlZCB2b2xhdGlsZSBiZWNhdXNlIGl0IHVwZGF0ZXMgYXN5Y2hyb25vdXNseSAqLworCitCb29sZWFuIERTcF9WQkxQcm9jICggRFNwQ29udGV4dFJlZmVyZW5jZSBjb250ZXh0LCB2b2lkICpyZWZfY29uICkKK3sKKwlyZXRyYWNlX2NvdW50Kys7CisJCisJcmV0dXJuIDE7IC8qIERhcnJlbGwsIGlzIHRoaXMgcmlnaHQ/ICovCit9CisKK3N0YXRpYyB2b2lkIERTcF9TZXRIV0Vycm9yIChPU1N0YXR1cyBlcnIsIGludCBpc19hZ3ApCit7CisJY2hhciBtZXNzYWdlWzEwMjRdOworCWNvbnN0IGNoYXIgKmZtdCwgKm1lbTsKKworCWlmICggaXNfYWdwICkgeworCQltZW0gPSAiQUdQIE1lbW9yeSI7CisJfSBlbHNlIHsKKwkJbWVtID0gIlZSQU0iOworCX0KKwlzd2l0Y2goZXJyKSB7CisJICAgIGNhc2UgbWVtRnVsbEVycjoKKwkJZm10ID0gIkhhcmR3YXJlIHN1cmZhY2UgcG9zc2libGUgYnV0IG5vdCBlbm91Z2ggJXMgYXZhaWxhYmxlIjsKKwkJYnJlYWs7CisJICAgIGNhc2UgY0RlcHRoRXJyOgorCQlmbXQgPSAiSGFyZHdhcmUgc3VyZmFjZSBwb3NzaWJsZSBidXQgaW52YWxpZCBjb2xvciBkZXB0aCI7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlmbXQgPSAiSGFyZHdhcmUgc3VyZmFjZSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIGluICVzIC0gdW5rbm93biBlcnJvciI7CisJCWJyZWFrOworCX0KKwlTRExfc25wcmludGYobWVzc2FnZSwgU0RMX2FycmF5c2l6ZShtZXNzYWdlKSwgZm10LCBtZW0pOworCVNETF9TZXRFcnJvcihtZXNzYWdlKTsKK30KKyNlbmRpZiAvLyBUQVJHRVRfQVBJX01BQ19PU1gKKworLyogcHV0IHVwIGEgZGlhbG9nIHRvIHZlcmlmeSBkaXNwbGF5IGNoYW5nZSAqLworc3RhdGljIGludCBEU3BfQ29uZmlybVN3aXRjaCAoKSB7CisKKyAgLyogcmVzb3VyY2UgaWQncyBmb3IgZGlhbG9nICovCisgIGNvbnN0IGludCByRGlhbG9nID0gMTAwMjsKKyAgY29uc3QgaW50IGJDYW5jZWwgPSAxOworICBjb25zdCBpbnQgYk9LICAgICA9IDI7CisgIAorICBEaWFsb2dQdHIgZGlhbG9nOworICBPU1N0YXR1cyAgZXJyOworICBTSW50MzIgICAgcmVzcG9uc2U7CisgIERpYWxvZ0l0ZW1JbmRleCAgICAgICBpdGVtID0gMDsKKyAgR3JhZlB0ciAgIHNhdmVQb3J0OworICAgIAorICBHZXRQb3J0ICgmc2F2ZVBvcnQpOworICAKKyAgZGlhbG9nID0gR2V0TmV3RGlhbG9nIChyRGlhbG9nLCBOVUxMLCAoV2luZG93UHRyKSAtMSk7CisgIGlmIChkaWFsb2cgPT0gTlVMTCkKKwkgcmV0dXJuICgwKTsKKyAgCisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisgIFNldFBvcnQgKEdldERpYWxvZ1BvcnQoZGlhbG9nKSk7CisjZWxzZQorICBTZXRQb3J0ICgoV2luZG93UHRyKSBkaWFsb2cpOworI2VuZGlmCisgIAorICBTZXREaWFsb2dEZWZhdWx0SXRlbSAoZGlhbG9nLCBiQ2FuY2VsKTsKKyAgU2V0RGlhbG9nQ2FuY2VsSXRlbSAgKGRpYWxvZywgYkNhbmNlbCk7CisgIAorICBTZXRFdmVudE1hc2sgKGV2ZXJ5RXZlbnQpOyAgCisgIEZsdXNoRXZlbnRzIChldmVyeUV2ZW50LCAwKTsKKyAgIAorICAgLyogT24gTWFjT1MgOC41IG9yIGxhdGVyLCB3ZSBjYW4gbWFrZSB0aGUgZGlhbG9nIGdvIGF3YXkgYWZ0ZXIgMTUgc2Vjb25kcyAqLworICAgLyogVGhpcyBpcyBnb29kIHNpbmNlIGl0J3MgcG9zc2libGUgdXNlciBjYW4ndCBldmVuIHNlZSB0aGUgZGlhbG9nISAqLworICAgLyogUmVxdWlyZXMgbGlua2luZyB0byBEaWFsb2dzTGliICovCisgICBlcnIgPSBHZXN0YWx0KGdlc3RhbHRTeXN0ZW1WZXJzaW9uLCZyZXNwb25zZSk7CisgICBpZiAoZXJyID09IG5vRXJyICYmIHJlc3BvbnNlID49IDB4MDAwMDA4NTApIHsKKyAgIAlTZXREaWFsb2dUaW1lb3V0KGRpYWxvZywgYkNhbmNlbCwgMTUpOworICAgfQorCisgICBkbyB7ICAgICAgCisgICAgCisgICAgTW9kYWxEaWFsb2cgKCBOVUxMLCAmaXRlbSApOyAgCisKKyAgIH0gd2hpbGUgKCBpdGVtICE9IGJDYW5jZWwgJiYgaXRlbSAhPSBiT0sgJiYgZXJyICE9IG5vRXJyKTsKKworCisgIERpc3Bvc2VEaWFsb2cgKGRpYWxvZyk7CisgIFNldFBvcnQgKHNhdmVQb3J0KTsKKyAgCisgIFNldEV2ZW50TWFzayhldmVyeUV2ZW50IC0gYXV0b0tleU1hc2spOworICBGbHVzaEV2ZW50cyhldmVyeUV2ZW50LCAwKTsKKyAgIAorICByZXR1cm4gKGl0ZW0gLSAxKTsKK30KKworc3RhdGljIHZvaWQgRFNwX1Vuc2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCkKK3sKKwkJCQorCQkKKwkgaWYgKCBjdXJyZW50LT5mbGFncyAmIFNETF9PUEVOR0wgKSAgeyAKKwkgICBNYWNfR0xfUXVpdCAodGhpcyk7CSAgIAkKKwl9CisJCQorCWlmIChkc3BfY29udGV4dCAhPSBOVUxMKSB7CisJCQorCQlHV29ybGRQdHIgZnJvbnQ7CisJCURTcENvbnRleHRfR2V0RnJvbnRCdWZmZXIgKGRzcF9jb250ZXh0LCAmZnJvbnQpOworCQkKKwkJaWYgKGZyb250ICE9IGRzcF9iYWNrX2J1ZmZlcikKKwkJICAgRGlzcG9zZUdXb3JsZCAoZHNwX2JhY2tfYnVmZmVyKTsKKwkJCisJCWlmIChjdXJyZW50LT5od2RhdGEpCisJCSAgIFNETF9mcmVlKGN1cnJlbnQtPmh3ZGF0YSk7CisJCSAgIAorCQlEU3BDb250ZXh0X1NldFN0YXRlIChkc3BfY29udGV4dCwga0RTcENvbnRleHRTdGF0ZV9JbmFjdGl2ZSApOworCQlEU3BDb250ZXh0X1JlbGVhc2UgIChkc3BfY29udGV4dCk7CisJCQorCQlkc3BfY29udGV4dCA9IE5VTEw7CisJfQorICAgIAkKKyAgICBpZiAoU0RMX1dpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgIERpc3Bvc2VXaW5kb3cgKFNETF9XaW5kb3cpOworICAgICAgICBTRExfV2luZG93ID0gTlVMTDsKKyAgICB9ICAgIAorICAgIAorICAgIGN1cnJlbnQtPnBpeGVscyA9IE5VTEw7CisgICAgY3VycmVudC0+ZmxhZ3MgID0gMDsKK30KKworc3RhdGljIFNETF9TdXJmYWNlICpEU3BfU2V0VmlkZW9Nb2RlKF9USElTLAorCVNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwkKKyNpZiAhVEFSR0VUX0FQSV9NQUNfT1NYCisgICAgRGlzcGxheUlEVHlwZSAgICAgICAgZGlzcGxheV9pZDsKKwlGaXhlZCBmcmVxOworI2VuZGlmCisJRFNwQ29udGV4dEF0dHJpYnV0ZXMgYXR0cmliOworCU9TU3RhdHVzIGVycjsKKwlVSW50MzIgcm1hc2sgPSAwLCBnbWFzayA9IDAsIGJtYXNrID0gMDsKKwkJCisJaW50ICAgcGFnZV9jb3VudDsKKwlpbnQgICBkb3VibGVfYnVmOworCWludCAgIGh3X3N1cmZhY2U7CisJaW50ICAgdXNlX2RzcF9iYWNrX2J1ZmZlcjsKKyAgICAgCisJRFNwX1Vuc2V0VmlkZW9Nb2RlICh0aGlzLCBjdXJyZW50KTsKKyAgICAgICAKKyAgICBpZiAoYnBwICE9IGRzcF9vbGRfZGVwdGgpCisgICAgICAgIERTcF9EZXN0cm95UGFsZXR0ZSAodGhpcyk7CisgICAKKwlkb3VibGVfYnVmID0gKGZsYWdzICYgU0RMX0RPVUJMRUJVRikgIT0gMDsKKwlod19zdXJmYWNlID0gKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gMDsKKwl1c2VfZHNwX2JhY2tfYnVmZmVyID0gIWRzcF92cmFtX2F2YWlsYWJsZSB8fCAhaHdfc3VyZmFjZSA7CisJCisJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisKK3JlYnVpbGQ6ICAKKyAgCisJaWYgKCBkb3VibGVfYnVmICYmIHVzZV9kc3BfYmFja19idWZmZXIgKSB7CisJCXBhZ2VfY291bnQgPSAyOworCX0gZWxzZSB7CisJCXBhZ2VfY291bnQgPSAxOworCX0KKworCVNETF9tZW1zZXQgKCZhdHRyaWIsIDAsIHNpemVvZiAoRFNwQ29udGV4dEF0dHJpYnV0ZXMpKTsKKwlhdHRyaWIuZGlzcGxheVdpZHRoICAgICAgICAgPSB3aWR0aDsKKwlhdHRyaWIuZGlzcGxheUhlaWdodCAgICAgICAgPSBoZWlnaHQ7CisJYXR0cmliLmRpc3BsYXlCZXN0RGVwdGggICAgID0gYnBwOworCWF0dHJpYi5iYWNrQnVmZmVyQmVzdERlcHRoICA9IGJwcDsKKwlhdHRyaWIuZGlzcGxheURlcHRoTWFzayAgICAgPSBrRFNwRGVwdGhNYXNrX0FsbDsKKwlhdHRyaWIuYmFja0J1ZmZlckRlcHRoTWFzayAgPSBrRFNwRGVwdGhNYXNrX0FsbDsKKwlhdHRyaWIuY29sb3JOZWVkcyAgICAgICAgICAgPSBrRFNwQ29sb3JOZWVkc19SZXF1aXJlOworCWF0dHJpYi5jb2xvclRhYmxlICAgICAgICAgICA9IDA7CisJYXR0cmliLnBhZ2VDb3VudCAgICAgICAgICAgID0gcGFnZV9jb3VudDsKKyAgICAgICAgI2lmIFRBUkdFVF9BUElfTUFDX09TWCB8fCBVTklWRVJTQUxfSU5URVJGQUNFU19WRVJTSU9OID09IDB4MDMyMAorICAgICAgICAKKyAgICAgICAgaWYgKCBEU3BGaW5kQmVzdENvbnRleHQgKCZhdHRyaWIsICZkc3BfY29udGV4dCkgIT0gbm9FcnIgKSB7CisgICAgICAgICAgICBTRExfU2V0RXJyb3IgKCJEcmF3U3Byb2NrZXQgY291bGRuJ3QgZmluZCBhIGNvbnRleHQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAjZWxzZQorCWlmICggbm9FcnIgIT0gRE1HZXREaXNwbGF5SURCeUdEZXZpY2UgKFNETF9EaXNwbGF5LCAmZGlzcGxheV9pZCwgU0RMX0ZBTFNFKSApIHsKKwkJU0RMX1NldEVycm9yICgiRGlzcGxheSBNYW5hZ2VyIGNvdWxkbid0IGFzc29jaWF0ZSBHRGV2aWNlIHdpdGggZGlzcGxheV9pZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CQorCWlmICggRFNwRmluZEJlc3RDb250ZXh0T25EaXNwbGF5SUQoJmF0dHJpYiwgJmRzcF9jb250ZXh0LCBkaXNwbGF5X2lkKSAhPSBub0VyciApIHsKKwkJU0RMX1NldEVycm9yICgiRHJhd1Nwcm9ja2V0IGNvdWxkbid0IGZpbmQgYSBzdWl0YWJsZSBjb250ZXh0IG9uIGdpdmVuIGRpc3BsYXkiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorICAgICAgICAjZW5kaWYJCQorCWlmICggRFNwQ29udGV4dF9SZXNlcnZlIChkc3BfY29udGV4dCwgJmF0dHJpYikgIT0gbm9FcnIgKSB7CisJCVNETF9TZXRFcnJvciAoIkRyYXdTcHJvY2tldCBjb3VsZG4ndCBnZXQgdGhlIG5lZWRlZCByZXNvdXJjZXMgdG8gYnVpbGQgdGhlIGRpc3BsYXkiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCWlmICggKGVyciA9IERTcENvbnRleHRfU2V0U3RhdGUgKGRzcF9jb250ZXh0LCBrRFNwQ29udGV4dFN0YXRlX0FjdGl2ZSkpICE9IG5vRXJyICkgeworCQkKKwkJaWYgKGVyciA9PSBrRFNwQ29uZmlybVN3aXRjaFdhcm5pbmcpIHsgICAgIAorCQkgIAorCQkgICBpZiAoICEgRFNwX0NvbmZpcm1Td2l0Y2ggKCkgKSB7CisJCSAgIAorCQkgICAgICBEU3BDb250ZXh0X1JlbGVhc2UgKGRzcF9jb250ZXh0KTsKKwkJICAgICAgZHNwX2NvbnRleHQgPSBOVUxMOworCQkgICAgICBTRExfU2V0RXJyb3IgKCJVc2VyIGNhbmNlbGxlZCBkaXNwbGF5IHN3aXRjaCIpOworCQkgICAgICByZXR1cm4gTlVMTDsKKwkJICAgfQorCQkgICBlbHNlCisJCSAgICAgLyogSGF2ZSB0byByZWFjdGl2YXRlIGNvbnRleHQuIFdoeT8gKi8KKwkJICAgICBEU3BDb250ZXh0X1NldFN0YXRlIChkc3BfY29udGV4dCwga0RTcENvbnRleHRTdGF0ZV9BY3RpdmUpOworCQkgICAgICAKKwkgICB9CisJICAgZWxzZSB7CisJICAgICAgU0RMX1NldEVycm9yICgiRHJhd1Nwcm9ja2V0IGNvdWxkbid0IGFjdGl2YXRlIHRoZSBjb250ZXh0Iik7CisJCSAgcmV0dXJuIE5VTEw7CisJICAgfQorCX0KKyAgIAorICAgCisJaWYgKGJwcCAhPSBkc3Bfb2xkX2RlcHRoKSB7CisgICAJCisgICAJICAgIERTcF9DcmVhdGVQYWxldHRlICAodGhpcyk7CisgICAKKyAgICAgICAJLyogdXBkYXRlIGZvcm1hdCBpZiBkaXNwbGF5IGRlcHRoIGNoYW5nZWQgKi8KKyAgICAgICAJaWYgKGJwcCA9PSAxNikgeworICAgICAgIAkKKyAgICAgICAJICAgcm1hc2sgPSAweDAwMDA3YzAwOworICAgICAgIAkgICBnbWFzayA9IDB4MDAwMDAzZTA7CisgICAgICAgCSAgIGJtYXNrID0gMHgwMDAwMDAxZjsKKyAgICAgICAJfQorICAgICAgIAlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQgKGN1cnJlbnQsIGJwcCwgcm1hc2ssIGdtYXNrLCBibWFzaywgMCApICkgeworICAgICAgIAkJCisgICAgICAgCSAgIFNETF9TZXRFcnJvciAoIkNvdWxkIG5vdCByZWFsbG9jYXRlIHZpZGVvIGZvcm1hdC4iKTsKKyAgICAgICAJICAgcmV0dXJuKE5VTEwpOworICAgICAgIAl9CisJfQorCQorCWlmICghZG91YmxlX2J1ZikgeworCQkKKwkJLyogc2luZ2xlLWJ1ZmZlciBjb250ZXh0ICovCisJCURTcENvbnRleHRfR2V0RnJvbnRCdWZmZXIgKGRzcF9jb250ZXh0LCAmZHNwX2JhY2tfYnVmZmVyKTsKKwkJCQorCQljdXJyZW50LT5od2RhdGEgICA9IChwcml2YXRlX2h3ZGF0YSopIFNETF9tYWxsb2MgKHNpemVvZiAocHJpdmF0ZV9od2RhdGEpKTsKKwkJaWYgKGN1cnJlbnQgLT5od2RhdGEgPT0gTlVMTCkgeworCQkJU0RMX091dE9mTWVtb3J5ICgpOworCSAgCQlyZXR1cm4gTlVMTDsJCSAgCisJCX0KKwkJY3VycmVudC0+aHdkYXRhLT5vZmZzY3JlZW4gPSBkc3BfYmFja19idWZmZXI7CisJICAgIGN1cnJlbnQtPmZsYWdzICAgfD0gU0RMX0hXU1VSRkFDRTsKKwkgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBEU3BfRGlyZWN0VXBkYXRlOworCX0gCisJZWxzZSBpZiAoIHVzZV9kc3BfYmFja19idWZmZXIgKSB7CisJCisJCURTcENvbnRleHRfR2V0QmFja0J1ZmZlciAgKGRzcF9jb250ZXh0LCBrRFNwQnVmZmVyS2luZF9Ob3JtYWwsICZkc3BfYmFja19idWZmZXIpOworCQkKKwkJY3VycmVudC0+ZmxhZ3MgICB8PSBTRExfRE9VQkxFQlVGIHwgU0RMX1NXU1VSRkFDRTsgLyogb25seSBmcm9udCBidWZmZXIgaXMgaW4gVlJBTSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBEU3BfRFNwVXBkYXRlOwkKKwl9IAorCWVsc2UgaWYgKCBEU3BfTmV3SFdTdXJmYWNlKHRoaXMsICZkc3BfYmFja19idWZmZXIsIGJwcCwgd2lkdGgtMSwgaGVpZ2h0LTEpID09IDAgKSB7CisgICAgICAKKyAgICAgIGN1cnJlbnQtPmh3ZGF0YSA9IChwcml2YXRlX2h3ZGF0YSopIFNETF9tYWxsb2MgKHNpemVvZiAocHJpdmF0ZV9od2RhdGEpKTsKKyAgICAgIGlmIChjdXJyZW50IC0+aHdkYXRhID09IE5VTEwpIHsKKyAgICAgIAlTRExfT3V0T2ZNZW1vcnkgKCk7CisgICAgICAJcmV0dXJuIE5VTEw7CQkgIAorICAgICAgfQorICAgICAgCisgICAgICBTRExfbWVtc2V0IChjdXJyZW50LT5od2RhdGEsIDAsIHNpemVvZiAocHJpdmF0ZV9od2RhdGEpKTsKKyAgICAgIGN1cnJlbnQtPmh3ZGF0YS0+b2Zmc2NyZWVuID0gZHNwX2JhY2tfYnVmZmVyOworICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0RPVUJMRUJVRiB8IFNETF9IV1NVUkZBQ0U7IAorICAgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBEU3BfRGlyZWN0VXBkYXRlOyAvKiBoYXJkd2FyZSBkb2Vzbid0IGRvIHVwZGF0ZSByZWN0cywgbXVzdCBiZSBwYWdlLWZsaXBwZWQgKi8JICAgCisgICB9ICAJCisgICBlbHNlIHsKKworCSAgIERTcENvbnRleHRfUmVsZWFzZSAoZHNwX2NvbnRleHQpOwkKKwkgICB1c2VfZHNwX2JhY2tfYnVmZmVyID0gU0RMX1RSVUU7CisJICAgZ290byAgcmVidWlsZDsKKyAgICB9CisJICAgCQorICAgIGN1cnJlbnQtPnBpdGNoICA9IEdldFBvcnRQaXhSb3dCeXRlcyhkc3BfYmFja19idWZmZXIpICYgMHgzRkZGOworCWN1cnJlbnQtPnBpeGVscyA9IEdldFBpeEJhc2VBZGRyKEdldFBvcnRQaXhNYXAoZHNwX2JhY2tfYnVmZmVyKSk7CisJCisJY3VycmVudC0+dyA9IHdpZHRoOworCWN1cnJlbnQtPmggPSBoZWlnaHQ7CisJCisgICAgI2lmICEgVEFSR0VUX0FQSV9NQUNfT1NYCisgICAgICAgIAorCWlmICh1c2VfZHNwX2JhY2tfYnVmZmVyKSB7CisJICAgCisJICAgRFNwQ29udGV4dF9HZXRNb25pdG9yRnJlcXVlbmN5IChkc3BfY29udGV4dCwgJmZyZXEpOworCSAgIERTcENvbnRleHRfU2V0TWF4RnJhbWVSYXRlICAgICAoZHNwX2NvbnRleHQsIGZyZXEgPj4gMTYpOworCX0KKwkKKyAgICAKKwlpZiAoIChjdXJyZW50LT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpIHx8IChjdXJyZW50LT5mbGFncyAmIFNETF9PUEVOR0wpICkKKwkJRFNwQ29udGV4dF9TZXRWQkxQcm9jIChkc3BfY29udGV4dCwgRFNwX1ZCTFByb2MsIE5VTEwpOworICAgICNlbmRpZgorCQorCWlmIChicHAgPT0gOCkJCisJICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKKwkKKwlpZiAoZmxhZ3MgJiBTRExfT1BFTkdMKSB7CisJCSAgIAorCSAgIFJlY3QgcmVjdDsKKwkgICBSR0JDb2xvciByZ2IgPSB7IDAuMCwgMC4wLCAwLjAgfTsKKwkgICBHcmFmUHRyIHNhdmVfcG9ydDsKKwkgICAKKwkgICBTZXRSZWN0ICgmcmVjdCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisJICAgU0RMX1dpbmRvdyA9IE5ld0NXaW5kb3cobmlsLCAmKCAoKipTRExfRGlzcGxheSkuZ2RSZWN0KSwgIlxwIiwgU0RMX1RSVUUsIHBsYWluREJveCwgKFdpbmRvd1B0ciktMSwgU0RMX0ZBTFNFLCAwKTsKKwkJICAgCisJICAgaWYgKFNETF9XaW5kb3cgPT0gTlVMTCkgeworCQkgCisJCSAgIFNETF9TZXRFcnJvciAoIkRTcF9TZXRWaWRlb01vZGUgOiBPcGVuR0wgd2luZG93IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIpOworCQkgICByZXR1cm4gTlVMTDsgIAkJCSAgIAkKKwkgICB9CisJICAgCisJICAgLyogU2V0IHdpbmRvdyBjb2xvciB0byBibGFjayB0byBhdm9pZCB3aGl0ZSBmbGFzaCovCisJICAgR2V0UG9ydCAoJnNhdmVfcG9ydCk7CisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisJCVNldFBvcnQgKEdldFdpbmRvd1BvcnQoU0RMX1dpbmRvdykpOworI2Vsc2UKKwkgICBTZXRQb3J0IChTRExfV2luZG93KTsKKyNlbmRpZgorCSAgICAgIFJHQkZvcmVDb2xvciAoJnJnYik7CisJICAgICAgUGFpbnRSZWN0ICAgICgmcmVjdCk7CQorCSAgIFNldFBvcnQgKHNhdmVfcG9ydCk7CisJICAgCisJICAgU2V0UG9ydFdpbmRvd1BvcnQgKFNETF9XaW5kb3cpOworCSAgIFNlbGVjdFdpbmRvdyAgKFNETF9XaW5kb3cpOworCSAgICAgCisJICAgaWYgKCBNYWNfR0xfSW5pdCAodGhpcykgPCAwICkgeworCSAgIAorCSAgICAgIFNETF9TZXRFcnJvciAoIkRTcF9TZXRWaWRlb01vZGUgOiBjb3VsZCBub3QgY3JlYXRlIE9wZW5HTCBjb250ZXh0LiIpOworCSAgICAgIHJldHVybiBOVUxMOworCSAgIH0KKwkgICAJICAgCSAgIAkgICAKKwkgICBjdXJyZW50LT5mbGFncyB8PSBTRExfT1BFTkdMOwkKKwl9CisJCisJcmV0dXJuIGN1cnJlbnQ7IAorfQorCisjaWZkZWYgRFNQX1RSWV9DQ19BTkRfQUEKKworc3RhdGljIGludCBEU3BfTWFrZUhXTWFzayAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworICAgIEdESGFuZGxlIHNhdmVfZGV2aWNlOworICAgIENHcmFmUHRyIHNhdmVfcG9ydDsKKyAgICBHV29ybGRQdHIgdGVtcDsKKyAgICBSR0JDb2xvciBibGFjayA9IHsgMCwgMCwgMCB9OworICAgIFJHQkNvbG9yIHdoaXRlID0geyAweEZGRkYsIDB4RkZGRiwgMHhGRkZGIH07CisgICAgUmVjdCAgICAgcmVjdDsKKyAgICAKKyAgICBVaW50MzIgZGVwdGggPSBHZXRQaXhEZXB0aCAoIEdldEdEZXZQaXhNYXAgKFNETF9EaXNwbGF5KSApOworICAgIAorICAgIFNldFJlY3QgKCZyZWN0LCAwLCAwLCBzdXJmYWNlLT53LCBzdXJmYWNlLT5oKTsKKyAgICAKKyAgICBpZiAoIG5vRXJyICE9IE5ld0dXb3JsZCAoJihzdXJmYWNlLT5od2RhdGEtPm1hc2spLCBkZXB0aCwgJnJlY3QsIDAsIFNETF9EaXNwbGF5LCAwICkgPCAwICkgeworICAgIAorICAgICAgICBTRExfT3V0T2ZNZW1vcnkgKCk7CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0gICAKKyAgICAKKyAgICBpZiAoIG5vRXJyICE9IE5ld0dXb3JsZCAoJnRlbXAsIGRlcHRoLCAmcmVjdCwgMCAsIFNETF9EaXNwbGF5LCAwICkgKSB7CisgICAgCisgICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgCisgICAgR2V0R1dvcmxkICgmc2F2ZV9wb3J0LCAmc2F2ZV9kZXZpY2UpOworICAgIFNldEdXb3JsZCAoc3VyZmFjZS0+aHdkYXRhLT5tYXNrLCBTRExfRGlzcGxheSk7CisgICAgCisgICAgUkdCRm9yZUNvbG9yICgmd2hpdGUpOworICAgIFBhaW50UmVjdCAgICAoJnJlY3QpOworICAgICAgICAgICAgICAgICAKKyAgICBSR0JCYWNrQ29sb3IgKCYoc3VyZmFjZS0+aHdkYXRhLT50cmFucykpOworICAgIAorICAgIENvcHlCaXRzICggR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuKSwKKyAgICAgICAgICAgICAgICAgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHN1cmZhY2UtPmh3ZGF0YS0+bWFzayksCisgICAgCSAgICAgICAmcmVjdCwgJnJlY3QsIHRyYW5zcGFyZW50LCBOVUxMICk7CisgICAgICAgIAorICAgIFNldEdXb3JsZCAoc3VyZmFjZS0+aHdkYXRhLT5tYXNrLCBTRExfRGlzcGxheSk7ICAgIAorICAgIFNldEdXb3JsZCAoc2F2ZV9wb3J0LCBzYXZlX2RldmljZSk7ICAgICAKKyAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IERTcF9TZXRIV0FscGhhKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVUludDggYWxwaGEpCit7CisgICAgc3VyZmFjZS0+aHdkYXRhLT5hbHBoYS5yZWQgICA9IChhbHBoYSAvIDI1NS4wKSAqIDY1NTM1OworICAgIHN1cmZhY2UtPmh3ZGF0YS0+YWxwaGEuYmx1ZSAgPSAoYWxwaGEgLyAyNTUuMCkgKiA2NTUzNTsKKyAgICBzdXJmYWNlLT5od2RhdGEtPmFscGhhLmdyZWVuID0gKGFscGhhIC8gMjU1LjApICogNjU1MzU7CisKKyAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfU1JDQUxQSEE7CisKKyAgICBpZiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpIHsKKyAgICAgICAgcmV0dXJuKERTcF9NYWtlSFdNYXNrICh0aGlzLCBzdXJmYWNlKSk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworc3RhdGljIGludCBEU3BfU2V0SFdDb2xvcktleShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBrZXkpCit7CisgICAgQ0dyYWZQdHIgc2F2ZV9wb3J0OworICAgIEdESGFuZGxlIHNhdmVfZGV2aWNlOworICAgIAorICAgIEdldEdXb3JsZCAoJnNhdmVfcG9ydCwgJnNhdmVfZGV2aWNlKTsKKyAgICBTZXRHV29ybGQgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuLCBOVUxMKTsKKyAgICAKKyAgICBJbmRleDJDb2xvciAoa2V5LCAmKHN1cmZhY2UtPmh3ZGF0YS0+dHJhbnMpKTsKKyAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfU1JDQ09MT1JLRVk7ICAgIAorICAgIAorICAgIFNldEdXb3JsZCAoc2F2ZV9wb3J0LCBzYXZlX2RldmljZSk7CisgICAgCisgICAgaWYgKCBzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNBTFBIQSApIHsKKyAgICAgICAgcmV0dXJuKERTcF9NYWtlSFdNYXNrICh0aGlzLCBzdXJmYWNlKSk7ICAgIAorICAgIH0gCisgICAgcmV0dXJuKDApOworfQorCisjZW5kaWYgLyogRFNQX1RSWV9DQ19BTkRfQUEgKi8KKworc3RhdGljIGludCBEU3BfTmV3SFdTdXJmYWNlKF9USElTLCBDR3JhZlB0ciAqcG9ydCwgaW50IGRlcHRoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgIAorICAgT1NTdGF0dXMgZXJyOworICAgUmVjdCAgICAgYm91bmRzOworCQkKKwlTZXRSZWN0ICgmYm91bmRzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgIAorICNpZiB1c2VEaXN0YW50SGR3ck1lbSAmJiB1c2VMb2NhbEhkd3JNZW0KKyAgICBpZiAoZHNwX3ZyYW1fYXZhaWxhYmxlKSB7CisJICAgLyogdHJ5IFZSQU0gKi8KKyAgIAkgIGVyciA9IE5ld0dXb3JsZCAocG9ydCwgZGVwdGgsICZib3VuZHMsIDAgLCBTRExfRGlzcGxheSwgdXNlRGlzdGFudEhkd3JNZW0gfCBub05ld0RldmljZSApOworICAgICAgaWYgKGVyciAhPSBub0VycikKKyAgICAgICAgIERTcF9TZXRIV0Vycm9yIChlcnIsIFNETF9GQUxTRSk7ICAgICAgICAKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiAoMCk7ICAgICAgCisgICAgfQorICAgIAorICAgIGlmIChkc3BfYWdwX2F2YWlsYWJsZSkgeworICAgICAgLyogdHJ5IEFHUCAqLworICAgICAgZXJyID0gTmV3R1dvcmxkIChwb3J0LCBkZXB0aCwgJmJvdW5kcywgMCAsIFNETF9EaXNwbGF5LCB1c2VMb2NhbEhkd3JNZW0gfCBub05ld0RldmljZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGlmIChlcnIgIT0gbm9FcnIpCisgICAgICAgICBEU3BfU2V0SFdFcnJvciAoZXJyLCBTRExfVFJVRSk7CisgICAgICBlbHNlICAgCisgICAgICAgICByZXR1cm4gKDApOyAgICAgCisgICAgIH0gIAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAKKyAgIHJldHVybiAoLTEpOyAgCit9CisKK3N0YXRpYyBpbnQgRFNwX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlHV29ybGRQdHIgdGVtcDsKKwkgCSAKKwlpZiAoIERTcF9OZXdIV1N1cmZhY2UgKHRoaXMsICZ0ZW1wLCBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCwgc3VyZmFjZS0+dywgc3VyZmFjZS0+aCkgPCAwICkKKwkgICByZXR1cm4gKC0xKTsKKwkJCQorCXN1cmZhY2UtPmh3ZGF0YSA9IChwcml2YXRlX2h3ZGF0YSopIFNETF9tYWxsb2MgKHNpemVvZiAocHJpdmF0ZV9od2RhdGEpKTsKKwlpZiAoc3VyZmFjZS0+aHdkYXRhID09IE5VTEwpIHsKKwkJU0RMX091dE9mTWVtb3J5ICgpOworCQlyZXR1cm4gLTE7CisJfQorCQorCVNETF9tZW1zZXQgKHN1cmZhY2UtPmh3ZGF0YSwgMCwgc2l6ZW9mKHByaXZhdGVfaHdkYXRhKSk7CisJc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW4gPSB0ZW1wOworCXN1cmZhY2UtPnBpdGNoCSA9IEdldFBpeFJvd0J5dGVzIChHZXRQb3J0UGl4TWFwICh0ZW1wKSkgJiAweDNGRkY7CisJc3VyZmFjZS0+cGl4ZWxzICA9IEdldFBpeEJhc2VBZGRyIChHZXRQb3J0UGl4TWFwICh0ZW1wKSk7CisJc3VyZmFjZS0+ZmxhZ3MJfD0gU0RMX0hXU1VSRkFDRTsKKyNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQQkKKwlzdXJmYWNlLT5mbGFncyAgfD0gU0RMX0hXQUNDRUw7CisjZW5kaWYJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIERTcF9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sJCisJaWYgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuICE9IE5VTEwpCisJCURpc3Bvc2VHV29ybGQgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuKTsKKwlTRExfZnJlZShzdXJmYWNlLT5od2RhdGEpOworCisgICAgc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKK30KKworc3RhdGljIGludCBEU3BfQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkZXN0KQoreworCWludCBhY2NlbGVyYXRlZDsKKworCS8qIFNldCBpbml0aWFsIGFjY2VsZXJhdGlvbiBvbiAqLworCXNyYy0+ZmxhZ3MgfD0gU0RMX0hXQUNDRUw7CisKKwkvKiBTZXQgdGhlIHN1cmZhY2UgYXR0cmlidXRlcyAqLworCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSApIHsKKwkJaWYgKCAhIHRoaXMtPmluZm8uYmxpdF9od19BICkgeworCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7CisJCX0KKwl9CisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgeworCQlpZiAoICEgdGhpcy0+aW5mby5ibGl0X2h3X0NDICkgeworCQkJc3JjLT5mbGFncyAmPSB+U0RMX0hXQUNDRUw7CisJCX0KKwl9CisKKwkvKiBDaGVjayB0byBzZWUgaWYgZmluYWwgc3VyZmFjZSBibGl0IGlzIGFjY2VsZXJhdGVkICovCisJYWNjZWxlcmF0ZWQgPSAhIShzcmMtPmZsYWdzICYgU0RMX0hXQUNDRUwpOworCWlmICggYWNjZWxlcmF0ZWQgKSB7CisJCXNyYy0+bWFwLT5od19ibGl0ID0gRFNwX0hXQWNjZWxCbGl0OworCX0KKwlyZXR1cm4oYWNjZWxlcmF0ZWQpOworfQorCitzdGF0aWMgaW50IERTcF9IV0FjY2VsQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KQoreworCUNHcmFmUHRyIHNhdmVfcG9ydDsKKwlHREhhbmRsZSBzYXZlX2RldmljZTsKKwlSZWN0IHNyY19yZWN0LCBkc3RfcmVjdDsKKyAgICBSR0JDb2xvciBibGFjayA9IHsgMCwgMCwgMCB9OworICAgIFJHQkNvbG9yIHdoaXRlID0geyAweEZGRkYsIDB4RkZGRiwgMHhGRkZGIH07CisKKyNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQQkJCisJVUludDMyIG1vZGU7CQorI2VuZGlmCisJCisJU2V0UmVjdCAoJnNyY19yZWN0LCBzcmNyZWN0LT54LCBzcmNyZWN0LT55LCBzcmNyZWN0LT54ICsgc3JjcmVjdC0+dywgc3JjcmVjdC0+eSArIHNyY3JlY3QtPmgpOworCVNldFJlY3QgKCZkc3RfcmVjdCwgZHN0cmVjdC0+eCwgZHN0cmVjdC0+eSwgZHN0cmVjdC0+eCArIGRzdHJlY3QtPncsIGRzdHJlY3QtPnkgKyBkc3RyZWN0LT5oKTsKKwkKKwlHZXRHV29ybGQgKCZzYXZlX3BvcnQsICZzYXZlX2RldmljZSk7CisJU2V0R1dvcmxkIChkc3QtPmh3ZGF0YS0+b2Zmc2NyZWVuLCBOVUxMKTsJCQorCQkKKwlSR0JGb3JlQ29sb3IgKCZibGFjayk7CisJUkdCQmFja0NvbG9yICgmd2hpdGUpOworCQkKKyNpZmRlZiBEU1BfVFJZX0NDX0FORF9BQQorCQorCWlmICggKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpICYmCisJICAgICAoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgICkgeworCSAgICAgCisJICAgICBPcENvbG9yICgmKHNyYy0+aHdkYXRhLT5hbHBoYSkpOwkgICAgICAgICAgIAorICAgIAorICAgICAgICAgQ29weURlZXBNYXNrICggR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHNyYy0+aHdkYXRhLT5vZmZzY3JlZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKHNyYy0+aHdkYXRhLT5tYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyhkc3QtPmh3ZGF0YS0+b2Zmc2NyZWVuKSwKKwkgICAgICAgICAgICAgICAgICAgICZzcmNfcmVjdCwgJnNyY19yZWN0LCAmZHN0X3JlY3QsCisJICAgICAgICAgICAgICAgICAgICBibGVuZCwKKwkgICAgICAgICAgICAgICAgICAgIE5VTEwgKTsgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCisJfQorCWVsc2UgeworICAgIAkKKyAgICAJaWYgKCBzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSB7CQkgICAgCSAgICAJICAgIAorICAgIAkgICAgUkdCQmFja0NvbG9yICgmKHNyYy0+aHdkYXRhLT50cmFucykgKTsJICAgIAorICAgIAkgICAgbW9kZSA9IHRyYW5zcGFyZW50OworICAgIAl9CisgICAgCWVsc2UgaWYgKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpIHsKKyAgICAJCisgICAgCSAgICBPcENvbG9yICgmKHNyYy0+aHdkYXRhLT5hbHBoYSkpOworICAgIAkgICAgbW9kZSA9IGJsZW5kOworICAgIAl9ICAgIAkKKyAgICAJZWxzZSB7CisgICAgCQorICAgIAkgICAgbW9kZSA9IHNyY0NvcHk7ICAgCSAgICAKKyAgICAJfSAgICAgICAgICAgIAorICAgIAkKKyAgICAgICAgQ29weUJpdHMgKCBHZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMoc3JjLT5od2RhdGEtPm9mZnNjcmVlbiksCisgICAgICAgICAgICAgICAgICAgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKGRzdC0+aHdkYXRhLT5vZmZzY3JlZW4pLAorICAgIAkgICAgICAgICAgICZzcmNfcmVjdCwgJmRzdF9yZWN0LCBtb2RlLCBOVUxMICk7CisgICAgfQkKKyNlbHNlCisgICAgCisgICAgQ29weUJpdHMgKCAmKCgoR3JhZlB0cikoc3JjLT5od2RhdGEtPm9mZnNjcmVlbikpLT5wb3J0Qml0cyksCisgICAgCSAgICAgICAgICAgJigoKEdyYWZQdHIpKGRzdC0+aHdkYXRhLT5vZmZzY3JlZW4pKS0+cG9ydEJpdHMpLAorICAgIAkgICAgICAgICAgICZzcmNfcmVjdCwgJmRzdF9yZWN0LCBzcmNDb3B5LCBOVUxMICk7CisKKyNlbmRpZiAvKiBEU1BfVFJZX0NDX0FORF9BQSAqLyAgICAgICAgICAgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlTZXRHV29ybGQgKHNhdmVfcG9ydCwgc2F2ZV9kZXZpY2UpOworCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IERTcF9GaWxsSFdSZWN0KF9USElTLCBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqcmVjdCwgVWludDMyIGNvbG9yKQoreworCUNHcmFmUHRyIHNhdmVfcG9ydDsKKwlHREhhbmRsZSBzYXZlX2RldmljZTsKKwlSZWN0ICAgICBmaWxsX3JlY3Q7CisJUkdCQ29sb3IgcmdiOworCQkKKwlTZXRSZWN0ICgmZmlsbF9yZWN0LCByZWN0LT54LCByZWN0LT55LCByZWN0LT54ICsgcmVjdC0+dywgcmVjdC0+eSArIHJlY3QtPmgpOworCQorCUdldEdXb3JsZCAoJnNhdmVfcG9ydCwgJnNhdmVfZGV2aWNlKTsKKwlTZXRHV29ybGQgKGRzdC0+aHdkYXRhLT5vZmZzY3JlZW4sIE5VTEwpOworCisgICAgSW5kZXgyQ29sb3IgKGNvbG9yLCAmcmdiKTsKKyAgICAKKwlSR0JGb3JlQ29sb3IgKCZyZ2IpOworCVBhaW50UmVjdCAoJmZpbGxfcmVjdCk7CisKKwlTZXRHV29ybGQgKHNhdmVfcG9ydCwgc2F2ZV9kZXZpY2UpOyAgICAKKworCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBEU3BfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJICBpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICkgeworCQlDR3JhZlB0ciBkc3BfZnJvbnRfYnVmZmVyLCBzYXZlX3BvcnQ7CisJCVJlY3QgcmVjdDsKKwkJCisgICAgI2lmICEgVEFSR0VUX0FQSV9NQUNfT1NYCisJCXVuc2lnbmVkIGludCBvbGRfY291bnQ7CisJI2VuZGlmCisgICAgCQorCQkvKiBwc2V1ZG8gcGFnZSBmbGlwcGluZyBmb3IgVlJBTSBiYWNrIGJ1ZmZlciovIAorCQlEU3BDb250ZXh0X0dldEZyb250QnVmZmVyIChkc3BfY29udGV4dCwgJmRzcF9mcm9udF9idWZmZXIpOworCQlTZXRSZWN0ICgmcmVjdCwgMCwgMCwgc3VyZmFjZS0+dy0xLCBzdXJmYWNlLT5oLTEpOyAgCQorICAJCQorICAJCUdldFBvcnQgKChHcmFmUHRyICopJnNhdmVfcG9ydCk7CisgIAkJU2V0UG9ydCAoKEdyYWZQdHIpZHNwX2Zyb250X2J1ZmZlcik7CisgIAkJCisgIAkJLyogd2FpdCBmb3IgcmV0cmFjZSAqLworICAJCS8qIEkgaGF2ZSB0cmllZCBkb2luZyB0aGUgc3dhcCBpbiBpbnRlcnJ1cHQgcm91dGluZSAoVkJMIFByb2MpIHRvIGRvICovCisgIAkJLyogaXQgYXN5bmNocm9ub3VzbHksIGJ1dCBhcHBhcmVudGx5IENvcHlCaXRzIGlzbid0IGludGVycnVwdCBzYWZlICAqLwkJICAgCisgICAgICAgIAorICAgICAgICAgICAgI2lmICEgVEFSR0VUX0FQSV9NQUNfT1NYCisJCSNpZm5kZWYgRFNQX05PX1NZTkNfVkJMCisgICAgCQlvbGRfY291bnQgPSByZXRyYWNlX2NvdW50OworICAgIAkJd2hpbGUgKG9sZF9jb3VudCA9PSByZXRyYWNlX2NvdW50KQorICAgIAkJCSAgOworCQkjZW5kaWYJCQkJICAKKyAgICAgICAgICAgICNlbmRpZgorICAJCQorICAgICAgICAgIENvcHlCaXRzICggR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKGRzcF9iYWNrX2J1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKGRzcF9mcm9udF9idWZmZXIpLAorICAJCQkgICAmcmVjdCwgJnJlY3QsIHNyY0NvcHksIE5VTEwgKTsKKyAgCQorICAJCVNldFBvcnQgKChHcmFmUHRyKXNhdmVfcG9ydCk7CisgIAkJCisJfSBlbHNlIHsKKwkJLyogbm90IHJlYWxseSBwYWdlIGZsaXBwaW5nIGF0IGFsbDogRFNwIGp1c3QgYmxpdHMgdGhlIGRpcnR5IHJlY3RhbmdsZXMgZnJvbSBEU3BfVXBkYXRlUmVjdHMgKi8JICAgIAorCQlCb29sZWFuIGJ1c3lfZmxhZzsKKwkJRFNwQ29udGV4dF9Td2FwQnVmZmVycyAoZHNwX2NvbnRleHQsIE5VTEwsICZidXN5X2ZsYWcpOyAvKiB0aGlzICB3YWl0cyBmb3IgVkJMICovCisJCURTcENvbnRleHRfR2V0QmFja0J1ZmZlciAoZHNwX2NvbnRleHQsIGtEU3BCdWZmZXJLaW5kX05vcm1hbCwgJmRzcF9iYWNrX2J1ZmZlcik7CisgICAgICAgIHN1cmZhY2UtPnBpeGVscyA9ICBHZXRQaXhCYXNlQWRkciggR2V0UG9ydFBpeE1hcChkc3BfYmFja19idWZmZXIpICk7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBEU3BfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaWYgKCBMb2NrUGl4ZWxzIChHZXRHV29ybGRQaXhNYXAgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuKSkgKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgRFNwX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJVW5sb2NrUGl4ZWxzIChHZXRHV29ybGRQaXhNYXAgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuKSk7Cit9CisKK3N0YXRpYyB2b2lkIERTcF9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnNkbF9yZWN0cykKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIERTcF9EU3BVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnNkbF9yZWN0cykKK3sKKyNpZiAhIFRBUkdFVF9BUElfTUFDX09TWCAvKiBVbnN1cHBvcnRlZCBEU3AgaW4gaGVyZSAqLworCWludCBpOworCVJlY3QgcmVjdDsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgbnVtcmVjdHM7IGkrKykgeworCQorCQlyZWN0LnRvcCAgICA9IHNkbF9yZWN0c1tpXS55OworCQlyZWN0LmxlZnQgICA9IHNkbF9yZWN0c1tpXS54OworCQlyZWN0LmJvdHRvbSA9IHNkbF9yZWN0c1tpXS5oICsgc2RsX3JlY3RzW2ldLnk7CisJCXJlY3QucmlnaHQgID0gc2RsX3JlY3RzW2ldLncgKyBzZGxfcmVjdHNbaV0ueDsKKwkJCisJCURTcENvbnRleHRfSW52YWxCYWNrQnVmZmVyUmVjdCAoZHNwX2NvbnRleHQsICZyZWN0KTsJCQorCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW50IERTcF9DcmVhdGVQYWxldHRlKF9USElTKSB7CisKKworCS8qIENyZWF0ZSBvdXIgcGFsZXR0ZSAqLworCVNETF9DVGFiID0gKENUYWJIYW5kbGUpTmV3SGFuZGxlKHNpemVvZihDb2xvclNwZWMpKjI1NiArIDgpOworCWlmICggU0RMX0NUYWIgPT0gbmlsICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJKCoqU0RMX0NUYWIpLmN0U2VlZCA9IEdldENUU2VlZCgpOworCSgqKlNETF9DVGFiKS5jdEZsYWdzID0gMDsKKwkoKipTRExfQ1RhYikuY3RTaXplID0gMjU1OworCUNUYWJDaGFuZ2VkKFNETF9DVGFiKTsKKwlTRExfQ1BhbCA9IE5ld1BhbGV0dGUoMjU2LCBTRExfQ1RhYiwgcG1FeHBsaWNpdCtwbVRvbGVyYW50LCAwKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBEU3BfRGVzdHJveVBhbGV0dGUoX1RISVMpIHsKKworCS8qIEZyZWUgcGFsZXR0ZSBhbmQgcmVzdG9yZSBvcmlnaW5hbCBvbmUgKi8KKwlpZiAoIFNETF9DVGFiICE9IG5pbCApIHsKKwkJRGlzcG9zZUhhbmRsZSgoSGFuZGxlKVNETF9DVGFiKTsKKwkJU0RMX0NUYWIgPSBuaWw7CisJfQorCWlmICggU0RMX0NQYWwgIT0gbmlsICkgeworCQlEaXNwb3NlUGFsZXR0ZShTRExfQ1BhbCk7CisJCVNETF9DUGFsID0gbmlsOworCX0KKwlSZXN0b3JlRGV2aWNlQ2x1dChTRExfRGlzcGxheSk7CisJCisgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IERTcF9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisJQ1RhYkhhbmRsZSAgIGNUYWI7CisJCisJaW50IGk7CisKKwljVGFiID0gU0RMX0NUYWI7CisJCisJLyogVmVyaWZ5IHRoZSByYW5nZSBvZiBjb2xvcnMgKi8KKwlpZiAoIChmaXJzdGNvbG9yK25jb2xvcnMpID4gKCgqKmNUYWIpLmN0U2l6ZSsxKSApIHsKKwkJcmV0dXJuKDApOworCX0KKwkKKwkvKiBTZXQgdGhlIHNjcmVlbiBwYWxldHRlIGFuZCB1cGRhdGUgdGhlIGRpc3BsYXkgKi8KKwlmb3IoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspIHsKKwkgICAgICAgIGludCBqID0gZmlyc3Rjb2xvciArIGk7CisJICAgICAgICAoKipjVGFiKS5jdFRhYmxlW2pdLnZhbHVlID0gajsKKwkJKCoqY1RhYikuY3RUYWJsZVtqXS5yZ2IucmVkID0gY29sb3JzW2ldLnIgPDwgOCB8IGNvbG9yc1tpXS5yOworCQkoKipjVGFiKS5jdFRhYmxlW2pdLnJnYi5ncmVlbiA9IGNvbG9yc1tpXS5nIDw8IDggfCBjb2xvcnNbaV0uZzsKKwkJKCoqY1RhYikuY3RUYWJsZVtqXS5yZ2IuYmx1ZSA9IGNvbG9yc1tpXS5iIDw8IDggfCBjb2xvcnNbaV0uYjsKKwl9CisJCisJU2V0R0RldmljZShTRExfRGlzcGxheSk7CisJU2V0RW50cmllcygwLCAoKipjVGFiKS5jdFNpemUsIChDb2xvclNwZWMgKikmKCoqY1RhYikuY3RUYWJsZSk7CisKKwlyZXR1cm4oMSk7Cit9CisKK3ZvaWQgRFNwX1ZpZGVvUXVpdChfVEhJUykKK3sKKwlpbnQgaTsKKwkKKwkvKiBGcmVlIGN1cnJlbnQgdmlkZW8gbW9kZSAqLworCURTcF9VbnNldFZpZGVvTW9kZSh0aGlzLCB0aGlzLT5zY3JlZW4pOworCisJLyogRnJlZSBQYWxldHRlIGFuZCByZXN0b3JlIG9yaWdpbmFsICovCisJRFNwX0Rlc3Ryb3lQYWxldHRlICh0aGlzKTsKKworI2lmIFNETF9NQUNDTEFTU0lDX0dBTU1BX1NVUFBPUlQKKwlNYWNfUXVpdEdhbW1hKHRoaXMpOworI2VuZGlmCisKKwkvKiBGcmVlIGxpc3Qgb2YgdmlkZW8gbW9kZXMgKi8KKwlpZiAoIFNETF9tb2RlbGlzdCAhPSBOVUxMICkgeworCQlmb3IgKCBpPTA7IFNETF9tb2RlbGlzdFtpXTsgaSsrICkgeworCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKKwkJfQorCQlTRExfZnJlZShTRExfbW9kZWxpc3QpOworCQlTRExfbW9kZWxpc3QgPSBOVUxMOworCX0KKwkKKwkvKiBVbmxvYWQgRHJhd1Nwcm9ja2V0ICovCisJRFNwU2h1dGRvd24gKCk7Cit9CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisKKy8qIHN3YXAgYnVmZmVycyB3aXRoIHYtc3luYyAqLworc3RhdGljIHZvaWQgRFNwX0dMX1N3YXBCdWZmZXJzIChfVEhJUykgeworCisgICAjaWZuZGVmIERTUF9OT19TWU5DX09QRU5HTAorICAgCisgICAgICAgdW5zaWduZWQgaW50IG9sZF9jb3VudDsKKyAgICAgICAgICAKKyAgICAgICBvbGRfY291bnQgPSByZXRyYWNlX2NvdW50OworICAgICAgIHdoaWxlIChvbGRfY291bnQgPT0gcmV0cmFjZV9jb3VudCkKKyAgICAgICAgICA7CisgICAjZW5kaWYKKyAgICAgIAorICAgYWdsU3dhcEJ1ZmZlcnMgKGdsQ29udGV4dCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNkc3AvU0RMX2RzcHZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21hY2RzcC9TRExfZHNwdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmMwODk2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNkc3AvU0RMX2RzcHZpZGVvLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9kc3B2aWRlb19oCisjZGVmaW5lIF9TRExfZHNwdmlkZW9faAorCisjaWYgVEFSR0VUX0FQSV9NQUNfT1NYCisjICBpbmNsdWRlIDxEcmF3U3Byb2NrZXQvRHJhd1Nwcm9ja2V0Lmg+IC8qIERyYXdzcHJvY2tldC5mcmFtZXdvcmsgKi8KKyNlbHNlCisjaW5jbHVkZSA8RHJhd1Nwcm9ja2V0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbG93dmlkZW8uaCIKKworLyogRHJhd1Nwcm9ja2V0IHNwZWNpZmljIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgRFNwSW5mbyB7CisJRFNwQ29udGV4dFJlZmVyZW5jZSBkc3BfY29udGV4dDsKKwlDR3JhZlB0ciAgICAgICAgICAgIGRzcF9iYWNrX2J1ZmZlcjsKKyAgIGludCAgICAgICAgICAgICAgICAgZHNwX29sZF9kZXB0aDsKKyAgIAorCS8qIEZsYWdzIGZvciBodyBhY2NlbGVyYXRpb24gKi8KKwlpbnQgZHNwX3ZyYW1fYXZhaWxhYmxlOworCWludCBkc3BfYWdwX2F2YWlsYWJsZTsKKwkKKwkKK307IAorLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIGRzcF9jb250ZXh0ICh0aGlzLT5oaWRkZW4tPmRzcGluZm8tPmRzcF9jb250ZXh0KQorI2RlZmluZSBkc3BfYmFja19idWZmZXIgKHRoaXMtPmhpZGRlbi0+ZHNwaW5mby0+ZHNwX2JhY2tfYnVmZmVyKQorI2RlZmluZSBkc3Bfb2xkX2RlcHRoICAgKHRoaXMtPmhpZGRlbi0+ZHNwaW5mby0+ZHNwX29sZF9kZXB0aCkKKyNkZWZpbmUgZHNwX3ZyYW1fYXZhaWxhYmxlICh0aGlzLT5oaWRkZW4tPmRzcGluZm8tPmRzcF92cmFtX2F2YWlsYWJsZSkKKyNkZWZpbmUgZHNwX2FncF9hdmFpbGFibGUgKHRoaXMtPmhpZGRlbi0+ZHNwaW5mby0+ZHNwX2FncF9hdmFpbGFibGUpCisKKyNlbmRpZiAvKiBfU0RMX2RzcHZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjcm9tL1NETF9yb212aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNyb20vU0RMX3JvbXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0ODg4MQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjcm9tL1NETF9yb212aWRlby5jCkBAIC0wLDAgKzEsNzQ1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKyNpZiBVU0VfUVVJQ0tUSU1FCisjaW5jbHVkZSA8UXVpY2tUaW1lL01vdmllcy5oPgorI2VuZGlmCisjZWxpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgKFVOSVZFUlNBTF9JTlRFUkZBQ0VTX1ZFUlNJT04gPiAweDAzMzUpCisjaW5jbHVkZSA8Q2FyYm9uLmg+CisvKiBUaGUgZnVsbHNjcmVlbiBjb2RlIHJlcXVpcmVzIHRoZSBRdWlja1RpbWUgZnJhbWV3b3JrLCBhbmQgdGhlIHdpbmRvdworICAgaXMgc3RpbGwgYXQgdGhlIGJhY2sgb24gTWFjIE9TIFgsIHdoaWNoIGlzIHdoZXJlIHRoaXMgY29kZSBpcyBuZWVkZWQuCisgKi8KKyNpZiBVU0VfUVVJQ0tUSU1FCisjaW5jbHVkZSA8TW92aWVzLmg+CisjZW5kaWYKKyNlbHNlCisjaW5jbHVkZSA8UXVpY2tkcmF3Lmg+CisjaW5jbHVkZSA8TG93TWVtLmg+CisjaW5jbHVkZSA8R2VzdGFsdC5oPgorI2luY2x1ZGUgPERldmljZXMuaD4KKyNpbmNsdWRlIDxEaXNrSW5pdC5oPgorI2luY2x1ZGUgPFFET2Zmc2NyZWVuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9zeXN3bS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIlNETF9yb212aWRlby5oIgorI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjZ2xfYy5oIgorI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjd21fYy5oIgorI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjbW91c2VfYy5oIgorI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbWFjZXZlbnRzX2MuaCIKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IFJPTV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipST01fTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBTRExfU3VyZmFjZSAqUk9NX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgUk9NX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAorCQkJIFNETF9Db2xvciAqY29sb3JzKTsKK3N0YXRpYyB2b2lkIFJPTV9WaWRlb1F1aXQoX1RISVMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBST01fQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgUk9NX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIFJPTV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIFJPTV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKKyNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OIC8qIFRoaXMgc2VlbXMgbm90IHRvIGJlIGF2YWlsYWJsZT8gLXN0cyBBdWcgMjAwMCAqLworLyogU2F2ZWQgc3RhdGUgZm9yIHRoZSBtZW51IGJhciAqLworc3RhdGljIFJnbkhhbmRsZQlnU2F2ZUdyYXlSZ24gPSBuaWw7CitzdGF0aWMgc2hvcnQJCWdTYXZlTWVudUJhciA9IDA7CitzdGF0aWMgQm9vbGVhbgkJZ1NhdmVDU1ZpcyA9IHRydWU7CisKKyNpZiBwb3dlcmMKKy8qIE1peGVkIG1vZGUgZ2x1ZSB0byBhY3RpdmF0ZSB0aGUgNjhLIGVtdWxhdG9yIGFuZCB0d2lkZGxlIGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT05FV09SRFNUVUIocDEpIFwKKwkJeyAweDQxRkEsIDB4MDAxMCwgMHgyMDlGLCAocDEpLCAweDQxRkEsIFwKKwkJICAweDAwMDgsIDB4MkYxMCwgMHg0RTc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0KKworI2RlZmluZSBUV09XT1JEU1RVQihwMSxwMikgXAorCQl7IDB4NDFGQSwgMHgwMDEyLCAweDIwOUYsIChwMSksIChwMiksIDB4NDFGQSwgXAorCQkgIDB4MDAwOCwgMHgyRjEwLCAweDRFNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfQorCisjZGVmaW5lIFRIUkVFV09SRFNUVUIocDEscDIscDMpIFwKKwkJeyAweDQxRkEsIDB4MDAxNCwgMHgyMDlGLCAocDEpLCAocDIpLCAocDMpLCAweDQxRkEsIFwKKwkJICAweDAwMDgsIDB4MkYxMCwgMHg0RTc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0KKworLyogQ29udHJvbFN0cmlwIGlubGluZSBnbHVlIGZvciBQb3dlclBDICovCitzdGF0aWMgcGFzY2FsIEJvb2xlYW4gU0JJc0NvbnRyb2xTdHJpcFZpc2libGUodm9pZCkKK3sKKwlzdGF0aWMgc2hvcnQgcHJvY0RhdGFbXSA9IFRXT1dPUkRTVFVCKDB4NzAwMCwgMHhBQUYyKTsKKwlQcm9jSW5mb1R5cGUgcHJvY0luZm8gPSBrRDBEaXNwYXRjaGVkUGFzY2FsU3RhY2tCYXNlZAorCQkJCXwgUkVTVUxUX1NJWkUoU0laRV9DT0RFKHNpemVvZihCb29sZWFuKSkpCisgICAgICAgICAgICAJfCBESVNQQVRDSEVEX1NUQUNLX1JPVVRJTkVfU0VMRUNUT1JfU0laRShrRm91ckJ5dGVDb2RlKTsKKyAgICAgICAgICAgIAkJCQkKKwlyZXR1cm4oKEJvb2xlYW4pIENhbGxVbml2ZXJzYWxQcm9jKChVbml2ZXJzYWxQcm9jUHRyKSBwcm9jRGF0YSwgcHJvY0luZm8sIDB4MDApKTsKK30KKworc3RhdGljIHBhc2NhbCB2b2lkIFNCU2hvd0hpZGVDb250cm9sU3RyaXAoQm9vbGVhbiBzaG93SXQpCit7CisJc3RhdGljIHNob3J0IHByb2NEYXRhW10gPSBUSFJFRVdPUkRTVFVCKDB4MzAzQywgMHgwMTAxLCAweEFBRjIpOworCVByb2NJbmZvVHlwZSBwcm9jSW5mbyA9IGtEMERpc3BhdGNoZWRQYXNjYWxTdGFja0Jhc2VkCisJCQkJfCBESVNQQVRDSEVEX1NUQUNLX1JPVVRJTkVfU0VMRUNUT1JfU0laRShrRm91ckJ5dGVDb2RlKQorCQkJCXwgRElTUEFUQ0hFRF9TVEFDS19ST1VUSU5FX1BBUkFNRVRFUigxLCBTSVpFX0NPREUoc2l6ZW9mKEJvb2xlYW4pKSk7CisKKwlDYWxsVW5pdmVyc2FsUHJvYygoVW5pdmVyc2FsUHJvY1B0cikgcHJvY0RhdGEsIHByb2NJbmZvLCAweDAxLCBzaG93SXQpOworfQorI2VuZGlmIC8qIHBvd2VyYyAqLworI2VuZGlmIC8qICFUQVJHRVRfQVBJX01BQ19DQVJCT04gKi8KKworLyogTWFjaW50b3NoIHRvb2xib3ggZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBST01fQXZhaWxhYmxlKHZvaWQpCit7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgdm9pZCBST01fRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKwlTRExfZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpST01fQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggZGV2aWNlICkgeworCQkJU0RMX2ZyZWUoZGV2aWNlKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBST01fVmlkZW9Jbml0OworCWRldmljZS0+TGlzdE1vZGVzID0gUk9NX0xpc3RNb2RlczsKKwlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IFJPTV9TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5TZXRDb2xvcnMgPSBST01fU2V0Q29sb3JzOworCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOworCWRldmljZS0+VmlkZW9RdWl0ID0gUk9NX1ZpZGVvUXVpdDsKKwlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gUk9NX0FsbG9jSFdTdXJmYWNlOworCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOworCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IFJPTV9Mb2NrSFdTdXJmYWNlOworCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gUk9NX1VubG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOworCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IFJPTV9GcmVlSFdTdXJmYWNlOworI2lmIFNETF9NQUNDTEFTU0lDX0dBTU1BX1NVUFBPUlQKKwlkZXZpY2UtPlNldEdhbW1hUmFtcCA9IE1hY19TZXRHYW1tYVJhbXA7CisJZGV2aWNlLT5HZXRHYW1tYVJhbXAgPSBNYWNfR2V0R2FtbWFSYW1wOworI2VuZGlmCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCWRldmljZS0+R0xfTWFrZUN1cnJlbnQgPSBNYWNfR0xfTWFrZUN1cnJlbnQ7CisJZGV2aWNlLT5HTF9Td2FwQnVmZmVycyA9IE1hY19HTF9Td2FwQnVmZmVyczsKKwlkZXZpY2UtPkdMX0xvYWRMaWJyYXJ5ID0gTWFjX0dMX0xvYWRMaWJyYXJ5OworCWRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBNYWNfR0xfR2V0UHJvY0FkZHJlc3M7CisjZW5kaWYJLyogSGF2ZSBPcGVuR0wgKi8KKwlkZXZpY2UtPlNldENhcHRpb24gPSBNYWNfU2V0Q2FwdGlvbjsKKwlkZXZpY2UtPlNldEljb24gPSBOVUxMOworCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7CisJZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOworCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKKwlkZXZpY2UtPkZyZWVXTUN1cnNvciA9IE1hY19GcmVlV01DdXJzb3I7CisJZGV2aWNlLT5DcmVhdGVXTUN1cnNvciA9IE1hY19DcmVhdGVXTUN1cnNvcjsKKwlkZXZpY2UtPlNob3dXTUN1cnNvciA9IE1hY19TaG93V01DdXJzb3I7CisJZGV2aWNlLT5XYXJwV01DdXJzb3IgPSBNYWNfV2FycFdNQ3Vyc29yOworCWRldmljZS0+SW5pdE9TS2V5bWFwID0gTWFjX0luaXRPU0tleW1hcDsKKwlkZXZpY2UtPlB1bXBFdmVudHMgPSBNYWNfUHVtcEV2ZW50czsKKworCWRldmljZS0+ZnJlZSA9IFJPTV9EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBUT09MQk9YX2Jvb3RzdHJhcCA9IHsKKwkidG9vbGJveCIsICJNYWNPUyBST00gVG9vbGJveCIsCisJUk9NX0F2YWlsYWJsZSwgUk9NX0NyZWF0ZURldmljZQorfTsKKworCitzdGF0aWMgaW50IFJPTV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKwlsb25nIGluZm87CisJCisJLyogQ2hlY2sgb3V0IHNvbWUgdGhpbmdzIGFib3V0IHRoZSBzeXN0ZW0gKi8KKwlHZXN0YWx0KGdlc3RhbHRRdWlja2RyYXdWZXJzaW9uLCAmaW5mbyk7CisJaWYgKCBpbmZvID09IGdlc3RhbHRPcmlnaW5hbFFEICkgeworCQlTRExfU2V0RXJyb3IoIkNvbG9yIFF1aWNrZHJhdyBub3QgYXZhaWxhYmxlIik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogU3RhcnQgUk9NaW50b3NoIGV2ZW50cyAqLworCU1hY19Jbml0RXZlbnRzKHRoaXMpOworCisJLyogR2V0IGEgaGFuZGxlIHRvIHRoZSBtYWluIG1vbml0b3IgKi8KKwlTRExfRGlzcGxheSA9IEdldE1haW5EZXZpY2UoKTsKKworCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLworCXRoaXMtPmluZm8uY3VycmVudF93ID0gKCoqU0RMX0Rpc3BsYXkpLmdkUmVjdC5yaWdodDsKKwl0aGlzLT5pbmZvLmN1cnJlbnRfaCA9ICgqKlNETF9EaXNwbGF5KS5nZFJlY3QuYm90dG9tOworCisJLyogRGV0ZXJtaW5lIHBpeGVsIGZvcm1hdCAqLworCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9ICgqKigqKlNETF9EaXNwbGF5KS5nZFBNYXApLnBpeGVsU2l6ZTsKKwlzd2l0Y2ggKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCkgeworCQljYXNlIDE2OgkvKiA1LTUtNSBSR0IgKi8KKwkJCXZmb3JtYXQtPlJtYXNrID0gMHgwMDAwN2MwMDsKKwkJCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDNlMDsKKwkJCXZmb3JtYXQtPkJtYXNrID0gMHgwMDAwMDAxZjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJLyogQ3JlYXRlIG91ciBwYWxldHRlICovCisJU0RMX0NUYWIgPSAoQ1RhYkhhbmRsZSlOZXdIYW5kbGUoc2l6ZW9mKENvbG9yU3BlYykqMjU2ICsgOCk7CisJaWYgKCBTRExfQ1RhYiA9PSBuaWwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oLTEpOworCX0KKwkoKipTRExfQ1RhYikuY3RTZWVkID0gR2V0Q1RTZWVkKCk7CisJKCoqU0RMX0NUYWIpLmN0RmxhZ3MgPSAwOworCSgqKlNETF9DVGFiKS5jdFNpemUgPSAyNTU7CisJQ1RhYkNoYW5nZWQoU0RMX0NUYWIpOworCVNETF9DUGFsID0gTmV3UGFsZXR0ZSgyNTYsIFNETF9DVGFiLCBwbUV4cGxpY2l0K3BtVG9sZXJhbnQsIDApOworCisJLyogR2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgZnVsbHNjcmVlbiBtb2RlcyAqLworCVNETF9tb2RlbGlzdCA9IChTRExfUmVjdCAqKilTRExfbWFsbG9jKCgxKzEpKnNpemVvZihTRExfUmVjdCAqKSk7CisJaWYgKCBTRExfbW9kZWxpc3QgKSB7CisJCVNETF9tb2RlbGlzdFswXSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7CisJCWlmICggU0RMX21vZGVsaXN0WzBdICkgeworCQkJU0RMX21vZGVsaXN0WzBdLT54ID0gMDsKKwkJCVNETF9tb2RlbGlzdFswXS0+eSA9IDA7CisJCQlTRExfbW9kZWxpc3RbMF0tPncgPSAoKipTRExfRGlzcGxheSkuZ2RSZWN0LnJpZ2h0OworCQkJU0RMX21vZGVsaXN0WzBdLT5oID0gKCoqU0RMX0Rpc3BsYXkpLmdkUmVjdC5ib3R0b207CisJCX0KKwkJU0RMX21vZGVsaXN0WzFdID0gTlVMTDsKKwl9CisKKwkvKiBGaWxsIGluIHNvbWUgd2luZG93IG1hbmFnZXIgY2FwYWJpbGl0aWVzICovCisJdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAxOworCisJLyogV2UncmUgZG9uZSEgKi8KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBTRExfUmVjdCAqKlJPTV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCit7CisJaWYgKCB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsID09IGZvcm1hdC0+Qml0c1BlclBpeGVsICkgeworCQlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKKwkJCXJldHVybihTRExfbW9kZWxpc3QpOworCQl9IGVsc2UgeworCQkJcmV0dXJuKChTRExfUmVjdCAqKiktMSk7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4oKFNETF9SZWN0ICoqKTApOworCX0KK30KKworc3RhdGljIHZvaWQgUk9NX0hpZGVNZW51QmFyKF9USElTKQoreworI2lmICFUQVJHRVRfQVBJX01BQ19DQVJCT04gLyogVGhpcyBzZWVtcyBub3QgdG8gYmUgYXZhaWxhYmxlPyAtc3RzIEF1ZyAyMDAwICovCisJUmduSGFuZGxlCQlkcmF3UmduID0gbmlsOworCVJnbkhhbmRsZQkJdGVtcFJnbiA9IG5pbDsKKwlSZ25IYW5kbGUJCWdyYXlSZ24gPSBuaWw7CisJV2luZG93UHRyCQl3aW5kb3cgPSBuaWw7CisJR0RIYW5kbGUJCWdkID0gbmlsOworCUdyYWZQdHIJCQlzYXZlUG9ydDsKKwlsb25nCQkJcmVzcG9uc2U7CisJc2hvcnQJCQloZWlnaHQ7CisJRXZlbnRSZWNvcmQJCXRoZUV2ZW50OworCisJaGVpZ2h0ID0gR2V0TUJhckhlaWdodCgpOworCQorCWlmICggaGVpZ2h0ID4gMCApIHsKKwkJdGVtcFJnbiA9IE5ld1JnbigpOworCQlkcmF3UmduID0gTmV3UmduKCk7CisJCWdTYXZlR3JheVJnbiA9IE5ld1JnbigpOworCQlpZiAoICEgdGVtcFJnbiB8fCAhIGRyYXdSZ24gfHwgISBnU2F2ZUdyYXlSZ24gKSB7CisJCQlnb3RvIENMRUFOVVA7CisJCX0KKwkJZ3JheVJnbiA9IEdldEdyYXlSZ24oKTsgLyogTm8gbmVlZCB0byBjaGVjayBmb3IgdGhpcyAqLworCQorCQlHZXRQb3J0KCZzYXZlUG9ydCk7CisKKwkJLyogSGlkZSB0aGUgY29udHJvbCBzdHJpcCBpZiBpdCdzIHByZXNlbnQsIGFuZCByZWNvcmQgaXRzIAorCQkgICBwcmV2aW91cyBwb3NpdGlvbiBpbnRvIHRoZSBkaXJ0eSByZWdpb24gZm9yIHJlZHJhd2luZy4gCisJCSAgIFRoaXMgaXNuJ3QgbmVjZXNzYXJ5LCBidXQgbWF5IGhlbHAgY2F0Y2ggc3RyYXkgYml0cy4gKi8KKwkJQ29weVJnbihncmF5UmduLCB0ZW1wUmduKTsKKwkJaWYgKCFHZXN0YWx0KGdlc3RhbHRDb250cm9sU3RyaXBBdHRyLCAmcmVzcG9uc2UpICYmIAorCQkJKHJlc3BvbnNlICYgKDFMIDw8IGdlc3RhbHRDb250cm9sU3RyaXBFeGlzdHMpKSkgeworCQkJZ1NhdmVDU1ZpcyA9IFNCSXNDb250cm9sU3RyaXBWaXNpYmxlKCk7CisJCQlpZiAoZ1NhdmVDU1ZpcykKKwkJCQlTQlNob3dIaWRlQ29udHJvbFN0cmlwKGZhbHNlKTsKKwkJfQorCQlEaWZmUmduKGdyYXlSZ24sIHRlbXBSZ24sIGRyYXdSZ24pOworCisJCS8qIFNhdmUgdGhlIGdyYXkgcmVnaW9uIG9uY2UgdGhlIGNvbnRyb2wgc3RyaXAgaXMgaGlkZGVuKi8KKwkJQ29weVJnbihncmF5UmduLCBnU2F2ZUdyYXlSZ24pOworCisJCS8qIENoYW5nZSB0aGUgbWVudSBoZWlnaHQgaW4gbG93bWVtICovCisJCWdTYXZlTWVudUJhciA9IGhlaWdodDsKKwkJTE1TZXRNQmFySGVpZ2h0KDApOworCQkKKwkJLyogV2FsayB0aGUgbW9uaXRvciByZWN0YW5nbGVzLCBhbmQgY29tYmluZSBhbnkgcGllY2VzIHRoYXQKKwkJICAgYXJlbid0IGluIEdyYXlSZ246IG1lbnViYXIsIHJvdW5kIGNvcm5lcnMsIGZha2UgZmxvYXRlcnMuICovCisJCWZvcihnZCA9IEdldERldmljZUxpc3QoKTsgZ2Q7IGdkID0gR2V0TmV4dERldmljZShnZCkpIAorCQkJeworCQkJaWYgKCFUZXN0RGV2aWNlQXR0cmlidXRlKGdkLCBzY3JlZW5EZXZpY2UpKSBjb250aW51ZTsKKwkJCWlmICghVGVzdERldmljZUF0dHJpYnV0ZShnZCwgc2NyZWVuQWN0aXZlKSkgY29udGludWU7CisKKwkJCVJlY3RSZ24odGVtcFJnbiwgJigqZ2QpLT5nZFJlY3QpOwkvKiBHZXQgdGhlIHdob2xlIHNjcmVlbiAqLworCQkJRGlmZlJnbih0ZW1wUmduLCBncmF5UmduLCB0ZW1wUmduKTsgLyogU3VidHJhY3Qgb3V0IEdyYXlSZ24gKi8KKwkJCVVuaW9uUmduKHRlbXBSZ24sIGRyYXdSZ24sIGRyYXdSZ24pOy8qIENvbWJpbmUgYWxsIHRoZSBiaXRzICovCisJCQl9CisJCQkKKwkJLyogQWRkIHRoZSBiaXRzIGludG8gdGhlIEdyYXlSZ24gKi8KKwkJVW5pb25SZ24oZHJhd1JnbiwgZ3JheVJnbiwgZ3JheVJnbik7CisKKwkJLyogTW9kaWZ5IHRoZSB2aXMgcmVnaW9ucyBvZiBleHBvc2VkIHdpbmRvd3MgKi8KKwkJd2luZG93ID0gKEZyb250V2luZG93KCkpID8gRnJvbnRXaW5kb3coKSA6IChXaW5kb3dQdHIpIC0xTDsKKwkJUGFpbnRCZWhpbmQod2luZG93LCBkcmF3UmduKTsKKwkJQ2FsY1Zpc0JlaGluZCh3aW5kb3csIGRyYXdSZ24pOworCisJCVNldFBvcnQoc2F2ZVBvcnQpOworCQkKKwkJLyogWWllbGQgdGltZSBzbyB0aGF0IGZsb2F0ZXJzIGNhbiBjYXRjaCB1cCAqLworCQlFdmVudEF2YWlsKDAsICZ0aGVFdmVudCk7CisJCUV2ZW50QXZhaWwoMCwgJnRoZUV2ZW50KTsKKwkJRXZlbnRBdmFpbCgwLCAmdGhlRXZlbnQpOworCQlFdmVudEF2YWlsKDAsICZ0aGVFdmVudCk7CisJCX0KKworQ0xFQU5VUDoKKworCWlmICh0ZW1wUmduKSBEaXNwb3NlUmduKHRlbXBSZ24pOworCWlmIChkcmF3UmduKSBEaXNwb3NlUmduKGRyYXdSZ24pOworI2VuZGlmIC8qICFUQVJHRVRfQVBJX01BQ19DQVJCT04gKi8KK30KKwkKK3N0YXRpYyB2b2lkIFJPTV9TaG93TWVudUJhcihfVEhJUykKK3sKKyNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OIC8qIFRoaXMgc2VlbXMgbm90IHRvIGJlIGF2YWlsYWJsZT8gLXN0cyBBdWcgMjAwMCAqLworCVJnbkhhbmRsZQkJZHJhd1JnbiA9IG5pbDsKKwlSZ25IYW5kbGUJCW1lbnVSZ24gPSBuaWw7CisJUmduSGFuZGxlCQl0ZW1wUmduID0gbmlsOworCVJnbkhhbmRsZQkJZ3JheVJnbiA9IG5pbDsKKwlXaW5kb3dQdHIJCXdpbmRvdyA9IG5pbDsKKwlHcmFmUHRyCQkJd01nclBvcnQ7CisJR3JhZlB0cgkJCXNhdmVQb3J0OworCVJlY3QJCQltZW51UmVjdDsKKwlsb25nCQkJcmVzcG9uc2U7CisJc2hvcnQJCQloZWlnaHQ7CisJRXZlbnRSZWNvcmQJCXRoZUV2ZW50OworCVJHQkNvbG9yCQlzYXZlUkdCOworCVJHQkNvbG9yCQlibGFja1JHQiA9IHsgMCwgMCwgMCB9OworCisJaGVpZ2h0ID0gR2V0TUJhckhlaWdodCgpOworCQorCWlmICgoaGVpZ2h0IDw9IDApICYmIChnU2F2ZU1lbnVCYXIgPiAwKSkgeworCQlkcmF3UmduID0gTmV3UmduKCk7CisJCW1lbnVSZ24gPSBOZXdSZ24oKTsKKwkJdGVtcFJnbiA9IE5ld1JnbigpOworCQlpZiAoICEgdGVtcFJnbiB8fCAhIGRyYXdSZ24gfHwgISBnU2F2ZUdyYXlSZ24gKSB7CisJCQlnb3RvIENMRUFOVVA7CisJCX0KKwkJZ3JheVJnbiA9IEdldEdyYXlSZ24oKTsgLyogTm8gbmVlZCB0byBjaGVjayBmb3IgdGhpcyAqLworCQorCQlHZXRQb3J0KCZzYXZlUG9ydCk7CisJCUdldFdNZ3JQb3J0KCZ3TWdyUG9ydCk7CisKKwkJLyogU2V0IHRoZSBoZWlnaHQgcHJvcGVybHkgKi8KKwkJTE1TZXRNQmFySGVpZ2h0KGdTYXZlTWVudUJhcik7CisKKwkJLyogUmVzdG9yZSB0aGUgb2xkIEdyYXlSZ246IHJvdW5kZWQgY29ybmVycywgZXRjLCBidXQgbm90CisJCSAgIHRoZSBtZW51YmFyIC0tIHN1YnRyYWN0IHRoYXQgb3V0IGZpcnN0ISAqLworCQlpZiAoZ1NhdmVHcmF5UmduKQorCQkJeworCQkJbWVudVJlY3QgPSAoKkdldE1haW5EZXZpY2UoKSktPmdkUmVjdDsKKwkJCW1lbnVSZWN0LmJvdHRvbSA9IG1lbnVSZWN0LnRvcCArIGdTYXZlTWVudUJhcjsKKwkJCVJlY3RSZ24obWVudVJnbiwgJm1lbnVSZWN0KTsKKworCQkJRGlmZlJnbihncmF5UmduLCBnU2F2ZUdyYXlSZ24sIGRyYXdSZ24pOyAJLyogV2hhdCBkbyB3ZSBpbnZhbD8gKi8KKwkJCURpZmZSZ24oZHJhd1JnbiwgbWVudVJnbiwgZHJhd1Jnbik7CQkJLyogQ2xpcCBvdXQgdGhlIG1lbnUgKi8KKwkJCQorCQkJLyogTm93IHJlZHJhdyB0aGUgY29ybmVycyBhbmQgb3RoZXIgYml0cyBibGFjayAqLworCQkJU2V0UG9ydCh3TWdyUG9ydCk7CisJCQlHZXRDbGlwKHRlbXBSZ24pOworCQkJU2V0Q2xpcChkcmF3UmduKTsKKwkJCUdldEZvcmVDb2xvcigmc2F2ZVJHQik7CisJCQlSR0JGb3JlQ29sb3IoJmJsYWNrUkdCKTsKKwkJCVBhaW50UmduKGRyYXdSZ24pOworCQkJUkdCRm9yZUNvbG9yKCZzYXZlUkdCKTsKKwkJCVNldENsaXAodGVtcFJnbik7CisJCQlTZXRQb3J0KHNhdmVQb3J0KTsKKwkJCQorCQkJVW5pb25SZ24oZHJhd1JnbiwgbWVudVJnbiwgZHJhd1Jnbik7CQkvKiBQdXQgYmFjayB0aGUgbWVudSAqLworCisJCQkvKiBOb3cgYWN0dWFsbHkgcmVzdG9yZSB0aGUgR3JheVJnbiAqLworCQkJQ29weVJnbihnU2F2ZUdyYXlSZ24sIGdyYXlSZ24pOworCQkJRGlzcG9zZVJnbihnU2F2ZUdyYXlSZ24pOworCQkJZ1NhdmVHcmF5UmduID0gbmlsOworCQkJfQorCisJCS8qIE1vZGlmeSB0aGUgdmlzIHJlZ2lvbnMgb2YgZXhwb3NlZCB3aW5kb3dzIGFuZCBkcmF3IG1lbnViYXIgKi8KKwkJd2luZG93ID0gKEZyb250V2luZG93KCkpID8gRnJvbnRXaW5kb3coKSA6IChXaW5kb3dQdHIpIC0xTDsKKwkJUGFpbnRCZWhpbmQod2luZG93LCBkcmF3UmduKTsKKwkJQ2FsY1Zpc0JlaGluZCh3aW5kb3csIGRyYXdSZ24pOworCQlEcmF3TWVudUJhcigpOworCisJCVNldFBvcnQoc2F2ZVBvcnQpOworCQlnU2F2ZU1lbnVCYXIgPSAwOworCisJCS8qIE5vdyBzaG93IHRoZSBjb250cm9sIHN0cmlwIGlmIGl0J3MgcHJlc2VudCAqLworCQlpZiAoIUdlc3RhbHQoZ2VzdGFsdENvbnRyb2xTdHJpcEF0dHIsICZyZXNwb25zZSkgJiYgCisJCQkJKHJlc3BvbnNlICYgKDFMIDw8IGdlc3RhbHRDb250cm9sU3RyaXBFeGlzdHMpKSkKKwkJCXsKKwkJCWlmIChnU2F2ZUNTVmlzICYmICFTQklzQ29udHJvbFN0cmlwVmlzaWJsZSgpKQorCQkJCVNCU2hvd0hpZGVDb250cm9sU3RyaXAodHJ1ZSk7CisJCQlnU2F2ZUNTVmlzID0gdHJ1ZTsKKwkJCX0KKworCQkvKiBZaWVsZCB0aW1lIHNvIHRoYXQgZmxvYXRlcnMgY2FuIGNhdGNoIHVwICovCisJCUV2ZW50QXZhaWwoMCwgJnRoZUV2ZW50KTsKKwkJRXZlbnRBdmFpbCgwLCAmdGhlRXZlbnQpOworCQlFdmVudEF2YWlsKDAsICZ0aGVFdmVudCk7CisJCUV2ZW50QXZhaWwoMCwgJnRoZUV2ZW50KTsKKwkJfQorCitDTEVBTlVQOgorCisJaWYgKGRyYXdSZ24pIERpc3Bvc2VSZ24oZHJhd1Jnbik7CisJaWYgKG1lbnVSZ24pIERpc3Bvc2VSZ24obWVudVJnbik7CisJaWYgKHRlbXBSZ24pIERpc3Bvc2VSZ24odGVtcFJnbik7CisjZW5kaWYgLyogIVRBUkdFVF9BUElfTUFDX0NBUkJPTiAqLworfQorCisvKiBWYXJpb3VzIHNjcmVlbiB1cGRhdGUgZnVuY3Rpb25zIGF2YWlsYWJsZSAqLworc3RhdGljIHZvaWQgUk9NX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworc3RhdGljIHZvaWQgUk9NX1dpbmRvd1VwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCitzdGF0aWMgdm9pZCBST01fVW5zZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50KQoreworCS8qIEZyZWUgdGhlIGN1cnJlbnQgd2luZG93LCBpZiBhbnkgKi8KKwlpZiAoIFNETF9XaW5kb3cgIT0gbmlsICkgeworCQlHV29ybGRQdHIgbWVtd29ybGQ7CisJCQorCQkvKiBIYW5kbGUgT3BlbkdMIHN1cHBvcnQgKi8KKwkJTWFjX0dMX1F1aXQodGhpcyk7CisKKwkJbWVtd29ybGQgPSAoR1dvcmxkUHRyKUdldFdSZWZDb24oU0RMX1dpbmRvdyk7CisJCWlmICggbWVtd29ybGQgIT0gbmlsICkgeworCQkJVW5sb2NrUGl4ZWxzKEdldEdXb3JsZFBpeE1hcChtZW13b3JsZCkpOworCQkJRGlzcG9zZUdXb3JsZChtZW13b3JsZCk7CisJCX0KKwkJaWYgKCAoY3VycmVudC0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisjaWYgVVNFX1FVSUNLVElNRQorCQkJRW5kRnVsbFNjcmVlbihmdWxsc2NyZWVuX2N0eCwgbmlsKTsKKwkJCVNETF9XaW5kb3cgPSBuaWw7CisjZWxzZQorCQkJUk9NX1Nob3dNZW51QmFyKHRoaXMpOworI2VuZGlmCisJCX0KKwl9CisJY3VycmVudC0+cGl4ZWxzID0gTlVMTDsKKwljdXJyZW50LT5mbGFncyAmPSB+KFNETF9IV1NVUkZBQ0V8U0RMX0ZVTExTQ1JFRU4pOworfQorCitzdGF0aWMgU0RMX1N1cmZhY2UgKlJPTV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAorCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworCVJlY3Qgd3JlY3QsIG9yZWN0OworI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgorCVJlY3QgdG1wcmVjdDsKKyNlbmRpZgorCisJLyogRnJlZSBhbnkgcHJldmlvdXMgdmlkZW8gbW9kZSAqLworCVJPTV9VbnNldFZpZGVvTW9kZSh0aGlzLCBjdXJyZW50KTsKKworCS8qIENyZWF0ZSB0aGUgUk9NIHdpbmRvdyBhbmQgU0RMIHZpZGVvIHN1cmZhY2UgKi8KKwljdXJyZW50LT5mbGFncyA9IDA7CQkvKiBDbGVhciBmbGFncyAqLworCWN1cnJlbnQtPncgPSB3aWR0aDsKKwljdXJyZW50LT5oID0gaGVpZ2h0OworCVNldFJlY3QoJndyZWN0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKwlpZiAoIFNETF9XaW5kb3cgKSB7CisJCS8qIElmIHdlIHJlY3JlYXRlIHRoZSB3aW5kb3csIGRvbid0IG1vdmUgaXQgYXJvdW5kICovCisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisJCW9yZWN0ID0gKkdldFdpbmRvd1BvcnRCb3VuZHMoU0RMX1dpbmRvdywgJnRtcHJlY3QpOworI2Vsc2UKKwkJb3JlY3QgPSBTRExfV2luZG93LT5wb3J0UmVjdDsKKyNlbmRpZgorCQlPZmZzZXRSZWN0KCZ3cmVjdCwgb3JlY3QubGVmdCwgb3JlY3QudG9wKTsKKwl9IGVsc2UgeworCQkvKiBDZW50ZXIgdGhlIHdpbmRvdyB0aGUgZmlyc3QgdGltZSB3ZSBzaG93IGl0ICovCisJCU9mZnNldFJlY3QoJndyZWN0LAorCQkoU0RMX21vZGVsaXN0WzBdLT53LXdpZHRoKS8yLCAoU0RMX21vZGVsaXN0WzBdLT5oLWhlaWdodCkvMik7CisJfQorCisjaWYgZGVmaW5lZChfX01BQ09TWF9fKSAmJiAhVVNFX1FVSUNLVElNRQorCS8qIEh1bS4uIGZ1bGxzY3JlZW4gbW9kZSBpcyBicm9rZW4gKi8KKwlmbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47CisjZW5kaWYKKwlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKKwkJLyogQ3JlYXRlIHRoZSBmdWxsc2NyZWVuIHdpbmRvdyBhbmQgdXNlIHNjcmVlbiBiaXRzICovCisJCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9IV1NVUkZBQ0V8U0RMX0ZVTExTQ1JFRU47CisJCWlmICggU0RMX1dpbmRvdyApIHsKKwkJCURpc3Bvc2VXaW5kb3coU0RMX1dpbmRvdyk7CisJCX0KKyNpZiBVU0VfUVVJQ0tUSU1FCisJCUJlZ2luRnVsbFNjcmVlbigmZnVsbHNjcmVlbl9jdHgsIG5pbCwgMCwwLCAmU0RMX1dpbmRvdywgbmlsLCAwKTsKKyNlbHNlCisJCVNETF9XaW5kb3cgPSBOZXdDV2luZG93KG5pbCwgJndyZWN0LCAiXHAiLCB0cnVlLCBwbGFpbkRCb3gsCisJCQkJCQkoV2luZG93UHRyKS0xLCBmYWxzZSwgMCk7CisJCVJPTV9IaWRlTWVudUJhcih0aGlzKTsKKyNlbmRpZgorCQljdXJyZW50LT5waXRjaCA9ICgqKigqKlNETF9EaXNwbGF5KS5nZFBNYXApLnJvd0J5dGVzICYgMHgzRkZGOworCQljdXJyZW50LT5waXhlbHMgPSAoKiooKipTRExfRGlzcGxheSkuZ2RQTWFwKS5iYXNlQWRkcjsKKwkJdGhpcy0+VXBkYXRlUmVjdHMgPSBST01fRGlyZWN0VXBkYXRlOworCX0gZWxzZSB7CisJCUdXb3JsZFB0ciBtZW13b3JsZDsKKwkJUGl4TWFwSGFuZGxlIHBpeG1hcDsKKwkJaW50IHN0eWxlOworCisJCXN0eWxlID0gbm9Hcm93RG9jUHJvYzsKKwkJaWYgKCBmbGFncyAmIFNETF9OT0ZSQU1FICkgeworCQkJc3R5bGUgPSBwbGFpbkRCb3g7CisJCQljdXJyZW50LT5mbGFncyB8PSBTRExfTk9GUkFNRTsKKwkJfSBlbHNlCisJCWlmICggZmxhZ3MgJiBTRExfUkVTSVpBQkxFICkgeworCQkJc3R5bGUgPSB6b29tRG9jUHJvYzsKKwkJCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9SRVNJWkFCTEU7CisJCX0KKwkJaWYgKCBTRExfV2luZG93ICYmIChzdHlsZSA9PSBjdXJyZW50X3N0eWxlKSApIHsKKwkJCS8qIFJlc2l6ZSBleGlzdGluZyB3aW5kb3csIGlmIG5lY2Vzc2FyeSAqLworCQkJaWYgKCAoKG9yZWN0LnJpZ2h0LW9yZWN0LmxlZnQpICE9IHdpZHRoKSB8fAorCQkJICAgICAoKG9yZWN0LmJvdHRvbS1vcmVjdC50b3ApICE9IGhlaWdodCkgKSB7CisJCQkJU2l6ZVdpbmRvdyhTRExfV2luZG93LCB3aWR0aCwgaGVpZ2h0LCBmYWxzZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBSZWNyZWF0ZSB0aGUgd2luZG93IGluIHRoZSBuZXcgc3R5bGUgKi8KKwkJCWlmICggU0RMX1dpbmRvdyApIHsKKwkJCQlEaXNwb3NlV2luZG93KFNETF9XaW5kb3cpOworCQkJfQorCQkJU0RMX1dpbmRvdyA9IE5ld0NXaW5kb3cobmlsLCAmd3JlY3QsICJccCIsIHRydWUsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwgKFdpbmRvd1B0ciktMSwgdHJ1ZSwgMCk7CisKKwkJCS8qIFNldCB0aGUgd2luZG93IHRpdGxlLCBpZiBhbnkgKi8KKwkJCXsgY2hhciAqdGl0bGU7CisJCQkJU0RMX1dNX0dldENhcHRpb24oJnRpdGxlLCBOVUxMKTsKKwkJCQlpZiAoIHRpdGxlICkgeworCQkJCQlNYWNfU2V0Q2FwdGlvbih0aGlzLCB0aXRsZSwgTlVMTCk7CisJCQkJfQorCQkJfQorCQl9CisJCWN1cnJlbnRfc3R5bGUgPSBzdHlsZTsKKwkJU2V0UGFsZXR0ZShTRExfV2luZG93LCBTRExfQ1BhbCwgZmFsc2UpOworCQlBY3RpdmF0ZVBhbGV0dGUoU0RMX1dpbmRvdyk7CisJCWlmICggTmV3R1dvcmxkKCZtZW13b3JsZCwgMCwKKyNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKwkJCSAgICAgICBHZXRXaW5kb3dQb3J0Qm91bmRzKFNETF9XaW5kb3csICZ0bXByZWN0KSwKKyNlbHNlCisJCQkgICAgICAgJlNETF9XaW5kb3ctPnBvcnRSZWN0LAorI2VuZGlmCisJCQkgICAgICAgU0RMX0NUYWIsIG5pbCwgMCkgIT0gbm9FcnIgKSB7CisJCQlTRExfU2V0RXJyb3IoIk5ld0dXb3JsZCgpIGZhaWxlZCIpOworCQkJcmV0dXJuKE5VTEwpOworCQl9CisJCVNldFdSZWZDb24oU0RMX1dpbmRvdywgKGxvbmcpbWVtd29ybGQpOworCQlwaXhtYXAgPSBHZXRHV29ybGRQaXhNYXAobWVtd29ybGQpOworCQlMb2NrUGl4ZWxzKHBpeG1hcCk7CisJCWN1cnJlbnQtPnBpdGNoID0gKCoqcGl4bWFwKS5yb3dCeXRlcyAmIDB4M0ZGRjsKKwkJY3VycmVudC0+cGl4ZWxzID0gR2V0UGl4QmFzZUFkZHIocGl4bWFwKTsKKwkJdGhpcy0+VXBkYXRlUmVjdHMgPSBST01fV2luZG93VXBkYXRlOworCX0KKwlTZXRQb3J0V2luZG93UG9ydChTRExfV2luZG93KTsKKwlTZWxlY3RXaW5kb3coU0RMX1dpbmRvdyk7CisKKwkvKiBIYW5kbGUgT3BlbkdMIHN1cHBvcnQgKi8KKwlpZiAoIGZsYWdzICYgU0RMX09QRU5HTCApIHsKKwkJaWYgKCBNYWNfR0xfSW5pdCh0aGlzKSA9PSAwICkgeworCQkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX09QRU5HTDsKKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnQgPSBOVUxMOworCQl9CisJfQorCQorCWlmICggKGZsYWdzICYgU0RMX0hXUEFMRVRURSkgJiYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkKKwkgICBjdXJyZW50LT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOworCSAgIAorCS8qIFdlJ3JlIGxpdmUhICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCisvKiBXZSBkb24ndCBhY3R1YWxseSBhbGxvdyBoYXJkd2FyZSBzdXJmYWNlcyBvdGhlciB0aGFuIHRoZSBtYWluIG9uZSAqLworc3RhdGljIGludCBST01fQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybigtMSk7Cit9CitzdGF0aWMgdm9pZCBST01fRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorc3RhdGljIGludCBST01fTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuKDApOworfQorc3RhdGljIHZvaWQgUk9NX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBST01fRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKwkvKiBUaGUgYXBwbGljYXRpb24gaXMgYWxyZWFkeSB1cGRhdGluZyB0aGUgdmlzaWJsZSB2aWRlbyBtZW1vcnkgKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIFJPTV9XaW5kb3dVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCUdXb3JsZFB0ciBtZW13b3JsZDsKKwlHcmFmUHRyIHNhdmVwb3J0OworCUNHcmFmUHRyIHRoZVBvcnQ7CisJY29uc3QgQml0TWFwICptZW1CaXRzOworCWNvbnN0IEJpdE1hcCAqd2luQml0czsKKwlpbnQgaTsKKwlSZWN0IHVwZGF0ZTsKKwkKKwkvKiBDb3B5IGZyb20gdGhlIG9mZnNjcmVlbiBHV29ybGQgdG8gdGhlIHdpbmRvdyBwb3J0ICovCisJR2V0UG9ydCgmc2F2ZXBvcnQpOworCVNldFBvcnRXaW5kb3dQb3J0KFNETF9XaW5kb3cpOworCXRoZVBvcnQgPSBHZXRXaW5kb3dQb3J0KFNETF9XaW5kb3cpOworCW1lbXdvcmxkID0gKEdXb3JsZFB0cilHZXRXUmVmQ29uKFNETF9XaW5kb3cpOworI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAmJiBBQ0NFU1NPUl9DQUxMU19BUkVfRlVOQ1RJT05TCisJbWVtQml0cyA9IEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cygoQ0dyYWZQdHIpIG1lbXdvcmxkKTsKKyNlbHNlCisJbWVtQml0cyA9ICYoKEdyYWZQdHIpbWVtd29ybGQpLT5wb3J0Qml0czsKKyNlbmRpZgorI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTiAmJiBBQ0NFU1NPUl9DQUxMU19BUkVfRlVOQ1RJT05TCisJd2luQml0cyA9IEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyh0aGVQb3J0KTsKKyNlbHNlCisJd2luQml0cyA9ICZTRExfV2luZG93LT5wb3J0Qml0czsKKyNlbmRpZgorCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgeworCQl1cGRhdGUubGVmdCA9IHJlY3RzW2ldLng7CisJCXVwZGF0ZS5yaWdodCA9IHJlY3RzW2ldLngrcmVjdHNbaV0udzsKKwkJdXBkYXRlLnRvcCA9IHJlY3RzW2ldLnk7CisJCXVwZGF0ZS5ib3R0b20gPSByZWN0c1tpXS55K3JlY3RzW2ldLmg7CisJCUNvcHlCaXRzKG1lbUJpdHMsIHdpbkJpdHMsCisJCQkgJnVwZGF0ZSwgJnVwZGF0ZSwgc3JjQ29weSwgbmlsKTsKKwl9CisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisJaWYgKCBRRElzUG9ydEJ1ZmZlcmVkKHRoZVBvcnQpICkgeworCQlRREZsdXNoUG9ydEJ1ZmZlcih0aGVQb3J0LCBOVUxMKTsKKwl9CisjZW5kaWYKKwlTZXRQb3J0KHNhdmVwb3J0KTsKK30KKworc3RhdGljIGludCBST01fU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworCUNUYWJIYW5kbGUgY1RhYjsKKwlpbnQgaTsKKworCS8qIEdldCB0aGUgY29sb3J0YWJsZSBmcm9tIHRoZSBlaXRoZXIgdGhlIGRpc3BsYXkgb3Igd2luZG93ICovCisJaWYgKCAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKKwkJY1RhYiA9ICgqKigqKlNETF9EaXNwbGF5KS5nZFBNYXApLnBtVGFibGU7CisJfSBlbHNlIHsKKwkJY1RhYiA9IFNETF9DVGFiOworCX0KKworCS8qIFZlcmlmeSB0aGUgcmFuZ2Ugb2YgY29sb3JzICovCisJaWYgKCAoZmlyc3Rjb2xvcituY29sb3JzKSA+ICgoKipjVGFiKS5jdFNpemUrMSkgKSB7CisJCXJldHVybigwKTsKKwl9CisJCisJLyogU2V0IHRoZSBzY3JlZW4gcGFsZXR0ZSBhbmQgdXBkYXRlIHRoZSBkaXNwbGF5ICovCisJZm9yICggaT0wOyBpPCBuY29sb3JzOyArK2kgKSB7CisJICAgICAgICBpbnQgaiA9IGZpcnN0Y29sb3IgKyBpOworCQkoKipjVGFiKS5jdFRhYmxlW2pdLnZhbHVlID0gajsKKwkJKCoqY1RhYikuY3RUYWJsZVtqXS5yZ2IucmVkID0gY29sb3JzW2ldLnIgPDwgOCB8IGNvbG9yc1tpXS5yOworCQkoKipjVGFiKS5jdFRhYmxlW2pdLnJnYi5ncmVlbiA9IGNvbG9yc1tpXS5nIDw8IDggfCBjb2xvcnNbaV0uZzsKKwkJKCoqY1RhYikuY3RUYWJsZVtqXS5yZ2IuYmx1ZSA9IGNvbG9yc1tpXS5iIDw8IDggfCBjb2xvcnNbaV0uYjsKKwl9CisKKyNpZiAwCisJaWYgKCAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApCisjZW5kaWYKKwl7CisJCUdEZXZpY2UgKipvZGlzcGxheTsKKwkJb2Rpc3BsYXkgPSBHZXRHRGV2aWNlKCk7CisJCVNldEdEZXZpY2UoU0RMX0Rpc3BsYXkpOworCQlTZXRFbnRyaWVzKDAsICgqKmNUYWIpLmN0U2l6ZSwgKENvbG9yU3BlYyAqKSYoKipjVGFiKS5jdFRhYmxlKTsKKwkJU2V0R0RldmljZShvZGlzcGxheSk7CisJfQorCXJldHVybigxKTsKK30KKwordm9pZCBST01fVmlkZW9RdWl0KF9USElTKQoreworCWludCBpOworCisJLyogRnJlZSBjdXJyZW50IHZpZGVvIG1vZGUgKi8KKwlST01fVW5zZXRWaWRlb01vZGUodGhpcywgdGhpcy0+c2NyZWVuKTsKKwlpZiAoIFNETF9XaW5kb3cgKSB7CisJCURpc3Bvc2VXaW5kb3coU0RMX1dpbmRvdyk7CisJCVNETF9XaW5kb3cgPSBuaWw7CisJfQorCisJLyogRnJlZSBwYWxldHRlIGFuZCByZXN0b3JlIG9yaWdpbmFsIG9uZSAqLworCWlmICggU0RMX0NUYWIgIT0gbmlsICkgeworCQlEaXNwb3NlSGFuZGxlKChIYW5kbGUpU0RMX0NUYWIpOworCQlTRExfQ1RhYiA9IG5pbDsKKwl9CisJaWYgKCBTRExfQ1BhbCAhPSBuaWwgKSB7CisJCURpc3Bvc2VQYWxldHRlKFNETF9DUGFsKTsKKwkJU0RMX0NQYWwgPSBuaWw7CisJfQorCVJlc3RvcmVEZXZpY2VDbHV0KEdldE1haW5EZXZpY2UoKSk7CisKKyNpZiBTRExfTUFDQ0xBU1NJQ19HQU1NQV9TVVBQT1JUCisJTWFjX1F1aXRHYW1tYSh0aGlzKTsKKyNlbmRpZgorCisJLyogRnJlZSBsaXN0IG9mIHZpZGVvIG1vZGVzICovCisJaWYgKCBTRExfbW9kZWxpc3QgIT0gTlVMTCApIHsKKwkJZm9yICggaT0wOyBTRExfbW9kZWxpc3RbaV07ICsraSApIHsKKwkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXSk7CisJCX0KKwkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0KTsKKwkJU0RMX21vZGVsaXN0ID0gTlVMTDsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjcm9tL1NETF9yb212aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYWNyb20vU0RMX3JvbXZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4MGY5MQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWFjcm9tL1NETF9yb212aWRlby5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfcm9tdmlkZW9faAorI2RlZmluZSBfU0RMX3JvbXZpZGVvX2gKKworI2luY2x1ZGUgIi4uL21hY2NvbW1vbi9TRExfbG93dmlkZW8uaCIKKworI2VuZGlmIC8qIF9TRExfcm9tdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tYXRoX3ByaXZhdGUuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWF0aF9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4N2Q3ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbWF0aF9wcml2YXRlLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqIGZyb206IEAoIylmZGxpYm0uaCA1LjEgOTMvMDkvMjQKKyAqICRJZCQKKyAqLworCisjaWZuZGVmIF9NQVRIX1BSSVZBVEVfSF8KKyNkZWZpbmUgX01BVEhfUFJJVkFURV9IXworCisjaW5jbHVkZSAiU0RMX25hbWUuaCIKKyNpbmNsdWRlICJTRExfZW5kaWFuLmgiCisKKyNkZWZpbmUgaHVnZQkJcmVhbGx5X2JpZyAvKiBodWdlIGlzIGEgcmVzZXJ2ZWQga2V5d29yZCBpbiBWQysrIDYuMCAqLworI2RlZmluZSB1X2ludDMyX3QJdWludDMyX3QKKworLyogVGhlIG9yaWdpbmFsIGZkbGlibSBjb2RlIHVzZWQgc3RhdGVtZW50cyBsaWtlOgorCW4wID0gKCgqKGludCopJm9uZSk+PjI5KV4xOwkJKiBpbmRleCBvZiBoaWdoIHdvcmQgKgorCWl4MCA9ICoobjArKGludCopJngpOwkJCSogaGlnaCB3b3JkIG9mIHggKgorCWl4MSA9ICooKDEtbjApKyhpbnQqKSZ4KTsJCSogbG93IHdvcmQgb2YgeCAqCisgICB0byBkaWcgdHdvIDMyIGJpdCB3b3JkcyBvdXQgb2YgdGhlIDY0IGJpdCBJRUVFIGZsb2F0aW5nIHBvaW50CisgICB2YWx1ZS4gIFRoYXQgaXMgbm9uLUFOU0ksIGFuZCwgbW9yZW92ZXIsIHRoZSBnY2MgaW5zdHJ1Y3Rpb24KKyAgIHNjaGVkdWxlciBnZXRzIGl0IHdyb25nLiAgV2UgaW5zdGVhZCB1c2UgdGhlIGZvbGxvd2luZyBtYWNyb3MuCisgICBVbmxpa2UgdGhlIG9yaWdpbmFsIGNvZGUsIHdlIGRldGVybWluZSB0aGUgZW5kaWFubmVzcyBhdCBjb21waWxlCisgICB0aW1lLCBub3QgYXQgcnVuIHRpbWU7IEkgZG9uJ3Qgc2VlIG11Y2ggYmVuZWZpdCB0byBzZWxlY3RpbmcKKyAgIGVuZGlhbm5lc3MgYXQgcnVuIHRpbWUuICAqLworCisvKiBBIHVuaW9uIHdoaWNoIHBlcm1pdHMgdXMgdG8gY29udmVydCBiZXR3ZWVuIGEgZG91YmxlIGFuZCB0d28gMzIgYml0CisgICBpbnRzLiAgKi8KKworLyoKKyAqIE1hdGggb24gYXJtIGlzIHNwZWNpYWw6CisgKiBGb3IgRlBBLCBmbG9hdCB3b3JkcyBhcmUgYWx3YXlzIGJpZy1lbmRpYW4uCisgKiBGb3IgVkZQLCBmbG9hdHMgd29yZHMgZm9sbG93IHRoZSBtZW1vcnkgc3lzdGVtIG1vZGUuCisgKi8KKworI2lmIChTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB8fCBcCisgICAgKCFkZWZpbmVkKF9fVkZQX0ZQX18pICYmIChkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX190aHVtYl9fKSkpCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgZG91YmxlIHZhbHVlOworICBzdHJ1Y3QKKyAgeworICAgIHVfaW50MzJfdCBtc3c7CisgICAgdV9pbnQzMl90IGxzdzsKKyAgfSBwYXJ0czsKK30gaWVlZV9kb3VibGVfc2hhcGVfdHlwZTsKKworI2Vsc2UKKwordHlwZWRlZiB1bmlvbgoreworICBkb3VibGUgdmFsdWU7CisgIHN0cnVjdAorICB7CisgICAgdV9pbnQzMl90IGxzdzsKKyAgICB1X2ludDMyX3QgbXN3OworICB9IHBhcnRzOworfSBpZWVlX2RvdWJsZV9zaGFwZV90eXBlOworCisjZW5kaWYKKworLyogR2V0IHR3byAzMiBiaXQgaW50cyBmcm9tIGEgZG91YmxlLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1dPUkRTKGl4MCxpeDEsZCkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIGV3X3U7CQkJCQlcCisgIGV3X3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICAoaXgwKSA9IGV3X3UucGFydHMubXN3OwkJCQkJXAorICAoaXgxKSA9IGV3X3UucGFydHMubHN3OwkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogR2V0IHRoZSBtb3JlIHNpZ25pZmljYW50IDMyIGJpdCBpbnQgZnJvbSBhIGRvdWJsZS4gICovCisKKyNkZWZpbmUgR0VUX0hJR0hfV09SRChpLGQpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgZ2hfdTsJCQkJCVwKKyAgZ2hfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIChpKSA9IGdoX3UucGFydHMubXN3OwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIEdldCB0aGUgbGVzcyBzaWduaWZpY2FudCAzMiBiaXQgaW50IGZyb20gYSBkb3VibGUuICAqLworCisjZGVmaW5lIEdFVF9MT1dfV09SRChpLGQpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgZ2xfdTsJCQkJCVwKKyAgZ2xfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIChpKSA9IGdsX3UucGFydHMubHN3OwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCBhIGRvdWJsZSBmcm9tIHR3byAzMiBiaXQgaW50cy4gICovCisKKyNkZWZpbmUgSU5TRVJUX1dPUkRTKGQsaXgwLGl4MSkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBpd191OwkJCQkJXAorICBpd191LnBhcnRzLm1zdyA9IChpeDApOwkJCQkJXAorICBpd191LnBhcnRzLmxzdyA9IChpeDEpOwkJCQkJXAorICAoZCkgPSBpd191LnZhbHVlOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCB0aGUgbW9yZSBzaWduaWZpY2FudCAzMiBiaXRzIG9mIGEgZG91YmxlIGZyb20gYW4gaW50LiAgKi8KKworI2RlZmluZSBTRVRfSElHSF9XT1JEKGQsdikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBzaF91OwkJCQkJXAorICBzaF91LnZhbHVlID0gKGQpOwkJCQkJCVwKKyAgc2hfdS5wYXJ0cy5tc3cgPSAodik7CQkJCQkJXAorICAoZCkgPSBzaF91LnZhbHVlOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCB0aGUgbGVzcyBzaWduaWZpY2FudCAzMiBiaXRzIG9mIGEgZG91YmxlIGZyb20gYW4gaW50LiAgKi8KKworI2RlZmluZSBTRVRfTE9XX1dPUkQoZCx2KQkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIHNsX3U7CQkJCQlcCisgIHNsX3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICBzbF91LnBhcnRzLmxzdyA9ICh2KTsJCQkJCQlcCisgIChkKSA9IHNsX3UudmFsdWU7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogQSB1bmlvbiB3aGljaCBwZXJtaXRzIHVzIHRvIGNvbnZlcnQgYmV0d2VlbiBhIGZsb2F0IGFuZCBhIDMyIGJpdAorICAgaW50LiAgKi8KKwordHlwZWRlZiB1bmlvbgoreworICBmbG9hdCB2YWx1ZTsKKyAgdV9pbnQzMl90IHdvcmQ7Cit9IGllZWVfZmxvYXRfc2hhcGVfdHlwZTsKKworLyogR2V0IGEgMzIgYml0IGludCBmcm9tIGEgZmxvYXQuICAqLworCisjZGVmaW5lIEdFVF9GTE9BVF9XT1JEKGksZCkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9mbG9hdF9zaGFwZV90eXBlIGdmX3U7CQkJCQlcCisgIGdmX3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICAoaSkgPSBnZl91LndvcmQ7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogU2V0IGEgZmxvYXQgZnJvbSBhIDMyIGJpdCBpbnQuICAqLworCisjZGVmaW5lIFNFVF9GTE9BVF9XT1JEKGQsaSkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9mbG9hdF9zaGFwZV90eXBlIHNmX3U7CQkJCQlcCisgIHNmX3Uud29yZCA9IChpKTsJCQkJCQlcCisgIChkKSA9IHNmX3UudmFsdWU7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCisjaWZkZWYgX19TVERDX18KK3N0YXRpYyBjb25zdCBkb3VibGUKKyNlbHNlCitzdGF0aWMgZG91YmxlCisjZW5kaWYKK3plcm8gICAgPSAgMC4wLAorb25lCT0gIDEuMCwKK3R3bwk9ICAyLjAsCit0d281Mwk9ICA5MDA3MTk5MjU0NzQwOTkyLjAsCS8qIDB4NDM0MDAwMDAsIDB4MDAwMDAwMDAgKi8KK3R3bzU0ICAgPSAgMS44MDE0Mzk4NTA5NDgxOTg0MDAwMGUrMTYsIC8qIDB4NDM1MDAwMDAsIDB4MDAwMDAwMDAgKi8KK3R3b201NCAgPSAgNS41NTExMTUxMjMxMjU3ODI3MDIxMmUtMTcsIC8qIDB4M0M5MDAwMDAsIDB4MDAwMDAwMDAgKi8KK2h1Z2UgICA9IDEuMGUrMzAwLAordGlueSAgID0gMS4wZS0zMDA7CisKKyNlbmRpZiAvKiBfTUFUSF9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL21teC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tbXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2VlN2IwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9tbXguaApAQCAtMCwwICsxLDcwNCBAQAorLyoJbW14LmgKKworCU11bHRpTWVkaWEgZVh0ZW5zaW9ucyBHQ0MgaW50ZXJmYWNlIGxpYnJhcnkgZm9yIElBMzIuCisKKwlUbyB1c2UgdGhpcyBsaWJyYXJ5LCBzaW1wbHkgaW5jbHVkZSB0aGlzIGhlYWRlciBmaWxlCisJYW5kIGNvbXBpbGUgd2l0aCBHQ0MuICBZb3UgTVVTVCBoYXZlIGlubGluaW5nIGVuYWJsZWQKKwlpbiBvcmRlciBmb3IgbW14X29rKCkgdG8gd29yazsgdGhpcyBjYW4gYmUgZG9uZSBieQorCXNpbXBseSB1c2luZyAtTyBvbiB0aGUgR0NDIGNvbW1hbmQgbGluZS4KKworCUNvbXBpbGluZyB3aXRoIC1ETU1YX1RSQUNFIHdpbGwgY2F1c2UgZGV0YWlsZWQgdHJhY2UKKwlvdXRwdXQgdG8gYmUgc2VudCB0byBzdGRlcnIgZm9yIGVhY2ggbW14IG9wZXJhdGlvbi4KKwlUaGlzIGFkZHMgbG90cyBvZiBjb2RlLCBhbmQgb2J2aW91c2x5IHNsb3dzIGV4ZWN1dGlvbiB0bworCWEgY3Jhd2wsIGJ1dCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworCVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWQorCUVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKwlMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorCUFORCBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorCisJMTk5Ny05OSBieSBILiBEaWV0eiBhbmQgUi4gRmlzaGVyCisKKyBOb3RlczoKKwlJdCBhcHBlYXJzIHRoYXQgdGhlIGxhdGVzdCBnYXMgaGFzIHRoZSBwYW5kIHByb2JsZW0gZml4ZWQsIHRoZXJlZm9yZQorCSAgSSdsbCB1bmRlZmluZSBCUk9LRU5fUEFORCBieSBkZWZhdWx0LgorKi8KKworI2lmbmRlZiBfTU1YX0gKKyNkZWZpbmUgX01NWF9ICisKKworLyoJV2FybmluZzogIGF0IHRoaXMgd3JpdGluZywgdGhlIHZlcnNpb24gb2YgR0FTIHBhY2thZ2VkCisJd2l0aCBtb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMgZG9lcyBub3QgaGFuZGxlIHRoZQorCXBhcmFsbGVsIEFORCBvcGVyYXRpb24gbW5lbW9uaWMgY29ycmVjdGx5LiAgSWYgdGhlCisJc3ltYm9sIEJST0tFTl9QQU5EIGlzIGRlZmluZWQsIGEgc2xvd2VyIGFsdGVybmF0aXZlCisJY29kaW5nIHdpbGwgYmUgdXNlZC4gIElmIGV4ZWN1dGlvbiBvZiBtbXh0ZXN0IHJlc3VsdHMKKwlpbiBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIGZhdWx0LCBkZWZpbmUgdGhpcyBzeW1ib2wuCisqLworI3VuZGVmCUJST0tFTl9QQU5ECisKKworLyoJVGhlIHR5cGUgb2YgYW4gdmFsdWUgdGhhdCBmaXRzIGluIGFuIE1NWCByZWdpc3RlcgorCShub3RlIHRoYXQgbG9uZyBsb25nIGNvbnN0YW50IHZhbHVlcyBNVVNUIGJlIHN1ZmZpeGVkCisJIGJ5IExMIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWVzIGJ5IFVMTCwgbGVzdAorCSB0aGV5IGJlIHRydW5jYXRlZCBieSB0aGUgY29tcGlsZXIpCisqLwordHlwZWRlZgl1bmlvbiB7CisJbG9uZyBsb25nCQlxOwkvKiBRdWFkd29yZCAoNjQtYml0KSB2YWx1ZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZwl1cTsJLyogVW5zaWduZWQgUXVhZHdvcmQgKi8KKwlpbnQJCQlkWzJdOwkvKiAyIERvdWJsZXdvcmQgKDMyLWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgaW50CQl1ZFsyXTsJLyogMiBVbnNpZ25lZCBEb3VibGV3b3JkICovCisJc2hvcnQJCQl3WzRdOwkvKiA0IFdvcmQgKDE2LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgc2hvcnQJCXV3WzRdOwkvKiA0IFVuc2lnbmVkIFdvcmQgKi8KKwljaGFyCQkJYls4XTsJLyogOCBCeXRlICg4LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgY2hhcgkJdWJbOF07CS8qIDggVW5zaWduZWQgQnl0ZSAqLworCWZsb2F0CQkJc1syXTsJLyogU2luZ2xlLXByZWNpc2lvbiAoMzItYml0KSB2YWx1ZSAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKSBtbXhfdDsJLyogT24gYW4gOC1ieXRlICg2NC1iaXQpIGJvdW5kYXJ5ICovCisKKworI2lmIDAKKy8qCUZ1bmN0aW9uIHRvIHRlc3QgaWYgbXVsdGltZWRpYSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZC4uLgorKi8KK2lubGluZSBleHRlcm4gaW50CittbV9zdXBwb3J0KHZvaWQpCit7CisJLyogUmV0dXJucyAxIGlmIE1NWCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwKKwkgICAzIGlmIEN5cml4IE1NWCBhbmQgRXh0ZW5kZWQgTU1YIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkCisJICAgNSBpZiBBTUQgTU1YIGFuZCAzRE5vdyEgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQKKwkgICAwIGlmIGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgYW55IG9mIHRoZXNlCisJKi8KKwlyZWdpc3RlciBpbnQgcnZhbCA9IDA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCS8qIFNlZSBpZiBDUFVJRCBpbnN0cnVjdGlvbiBpcyBzdXBwb3J0ZWQgLi4uICovCisJCS8qIC4uLiBHZXQgY29waWVzIG9mIEVGTEFHUyBpbnRvIGVheCBhbmQgZWN4ICovCisJCSJwdXNoZlxuXHQiCisJCSJwb3BsICUlZWF4XG5cdCIKKwkJIm1vdmwgJSVlYXgsICUlZWN4XG5cdCIKKworCQkvKiAuLi4gVG9nZ2xlIHRoZSBJRCBiaXQgaW4gb25lIGNvcHkgYW5kIHN0b3JlICovCisJCS8qICAgICB0byB0aGUgRUZMQUdTIHJlZyAqLworCQkieG9ybCAkMHgyMDAwMDAsICUlZWF4XG5cdCIKKwkJInB1c2ggJSVlYXhcblx0IgorCQkicG9wZlxuXHQiCisKKwkJLyogLi4uIEdldCB0aGUgKGhvcGVmdWxseSBtb2RpZmllZCkgRUZMQUdTICovCisJCSJwdXNoZlxuXHQiCisJCSJwb3BsICUlZWF4XG5cdCIKKworCQkvKiAuLi4gQ29tcGFyZSBhbmQgdGVzdCByZXN1bHQgKi8KKwkJInhvcmwgJSVlYXgsICUlZWN4XG5cdCIKKwkJInRlc3RsICQweDIwMDAwMCwgJSVlY3hcblx0IgorCQkianogTm90U3VwcG9ydGVkMVxuXHQiCQkvKiBDUFVJRCBub3Qgc3VwcG9ydGVkICovCisKKworCQkvKiBHZXQgc3RhbmRhcmQgQ1BVSUQgaW5mb3JtYXRpb24sIGFuZAorCQkgICAgICAgZ28gdG8gYSBzcGVjaWZpYyB2ZW5kb3Igc2VjdGlvbiAqLworCQkibW92bCAkMCwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCisJCS8qIENoZWNrIGZvciBJbnRlbCAqLworCQkiY21wbCAkMHg3NTZlNjU0NywgJSVlYnhcblx0IgorCQkiam5lIFRyeUFNRFxuXHQiCisJCSJjbXBsICQweDQ5NjU2ZTY5LCAlJWVkeFxuXHQiCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImNtcGwgJDB4NmM2NTc0NmUsICUlZWN4XG4iCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImptcCBJbnRlbFxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIEFNRCAqLworCQkiXG5UcnlBTUQ6XG5cdCIKKwkJImNtcGwgJDB4Njg3NDc1NDEsICUlZWJ4XG5cdCIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJjbXBsICQweDY5NzQ2ZTY1LCAlJWVkeFxuXHQiCisJCSJqbmUgVHJ5Q3lyaXhcblx0IgorCQkiY21wbCAkMHg0NDRkNDE2MywgJSVlY3hcbiIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJqbXAgQU1EXG5cdCIKKworCQkvKiBDaGVjayBmb3IgQ3lyaXggKi8KKwkJIlxuVHJ5Q3lyaXg6XG5cdCIKKwkJImNtcGwgJDB4Njk3Mjc5NDMsICUlZWJ4XG5cdCIKKwkJImpuZSBOb3RTdXBwb3J0ZWQyXG5cdCIKKwkJImNtcGwgJDB4NzM2ZTQ5NzgsICUlZWR4XG5cdCIKKwkJImpuZSBOb3RTdXBwb3J0ZWQzXG5cdCIKKwkJImNtcGwgJDB4NjQ2MTY1NzQsICUlZWN4XG5cdCIKKwkJImpuZSBOb3RTdXBwb3J0ZWQ0XG5cdCIKKwkJLyogRHJvcCB0aHJvdWdoIHRvIEN5cml4Li4uICovCisKKworCQkvKiBDeXJpeCBTZWN0aW9uICovCisJCS8qIFNlZSBpZiBleHRlbmRlZCBDUFVJRCBsZXZlbCA4MDAwMDAwMSBpcyBzdXBwb3J0ZWQgKi8KKwkJLyogVGhlIHZhbHVlIG9mIENQVUlELzgwMDAwMDAxIGZvciB0aGUgNng4Nk1YIGlzIHVuZGVmaW5lZAorCQkgICBhY2NvcmRpbmcgdG8gdGhlIEN5cml4IENQVSBEZXRlY3Rpb24gR3VpZGUgKFByZWxpbWluYXJ5CisJCSAgIFJldi4gMS4wMSB0YWJsZSAxKSwgc28gd2UnbGwgY2hlY2sgdGhlIHZhbHVlIG9mIGVheCBmb3IKKwkJICAgQ1BVSUQvMCB0byBzZWUgaWYgc3RhbmRhcmQgQ1BVSUQgbGV2ZWwgMiBpcyBzdXBwb3J0ZWQuCisJCSAgIEFjY29yZGluZyB0byB0aGUgdGFibGUsIHRoZSBvbmx5IENQVSB3aGljaCBzdXBwb3J0cyBsZXZlbAorCQkgICAyIGlzIGFsc28gdGhlIG9ubHkgb25lIHdoaWNoIHN1cHBvcnRzIGV4dGVuZGVkIENQVUlEIGxldmVscy4KKwkJKi8KKwkJImNtcGwgJDB4MiwgJSVlYXhcblx0IgorCQkiam5lIE1NWHRlc3Rcblx0IgkvKiBVc2Ugc3RhbmRhcmQgQ1BVSUQgaW5zdGVhZCAqLworCisJCS8qIEV4dGVuZGVkIENQVUlEIHN1cHBvcnRlZCAoaW4gdGhlb3J5KSwgc28gZ2V0IGV4dGVuZGVkCisJCSAgIGZlYXR1cmVzICovCisJCSJtb3ZsICQweDgwMDAwMDAxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlYXhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDVcblx0IgkJLyogTU1YIG5vdCBzdXBwb3J0ZWQgKi8KKwkJInRlc3RsICQweDAxMDAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIEV4dCdkIE1NWCAqLworCQkiam56IEVNTVhTdXBwb3J0ZWRcblx0IgorCQkibW92bCAkMSwgJTA6XG5cblx0IgkJLyogTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXG4iCisJCSJFTU1YU3VwcG9ydGVkOlxuXHQiCisJCSJtb3ZsICQzLCAlMDpcblxuXHQiCQkvKiBFTU1YIGFuZCBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCisJCS8qIEFNRCBTZWN0aW9uICovCisJCSJBTUQ6XG5cdCIKKworCQkvKiBTZWUgaWYgZXh0ZW5kZWQgQ1BVSUQgaXMgc3VwcG9ydGVkICovCisJCSJtb3ZsICQweDgwMDAwMDAwLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJjbXBsICQweDgwMDAwMDAwLCAlJWVheFxuXHQiCisJCSJqbCBNTVh0ZXN0XG5cdCIJLyogVXNlIHN0YW5kYXJkIENQVUlEIGluc3RlYWQgKi8KKworCQkvKiBFeHRlbmRlZCBDUFVJRCBzdXBwb3J0ZWQsIHNvIGdldCBleHRlbmRlZCBmZWF0dXJlcyAqLworCQkibW92bCAkMHg4MDAwMDAwMSwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkidGVzdGwgJDB4MDA4MDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgTU1YICovCisJCSJqeiBOb3RTdXBwb3J0ZWQ2XG5cdCIJCS8qIE1NWCBub3Qgc3VwcG9ydGVkICovCisJCSJ0ZXN0bCAkMHg4MDAwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciAzRE5vdyEgKi8KKwkJImpueiBUaHJlZUROb3dTdXBwb3J0ZWRcblx0IgorCQkibW92bCAkMSwgJTA6XG5cblx0IgkJLyogTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXG4iCisJCSJUaHJlZUROb3dTdXBwb3J0ZWQ6XG5cdCIKKwkJIm1vdmwgJDUsICUwOlxuXG5cdCIJCS8qIDNETm93ISBhbmQgTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXHQiCisKKworCQkvKiBJbnRlbCBTZWN0aW9uICovCisJCSJJbnRlbDpcblx0IgorCisJCS8qIENoZWNrIGZvciBNTVggKi8KKwkJIk1NWHRlc3Q6XG5cdCIKKwkJIm1vdmwgJDEsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJInRlc3RsICQweDAwODAwMDAwLCAlJWVkeFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLworCQkianogTm90U3VwcG9ydGVkN1xuXHQiCQkvKiBNTVggTm90IHN1cHBvcnRlZCAqLworCQkibW92bCAkMSwgJTA6XG5cblx0IgkJLyogTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXHQiCisKKwkJLyogTm90aGluZyBzdXBwb3J0ZWQgKi8KKwkJIlxuTm90U3VwcG9ydGVkMTpcblx0IgorCQkiI21vdmwgJDEwMSwgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQyOlxuXHQiCisJCSIjbW92bCAkMTAyLCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDM6XG5cdCIKKwkJIiNtb3ZsICQxMDMsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNDpcblx0IgorCQkiI21vdmwgJDEwNCwgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ1OlxuXHQiCisJCSIjbW92bCAkMTA1LCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDY6XG5cdCIKKwkJIiNtb3ZsICQxMDYsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNzpcblx0IgorCQkiI21vdmwgJDEwNywgJTA6XG5cblx0IgorCQkibW92bCAkMCwgJTA6XG5cblx0IgorCisJCSJSZXR1cm46XG5cdCIKKwkJOiAiPWEiIChydmFsKQorCQk6IC8qIG5vIGlucHV0ICovCisJCTogImVheCIsICJlYngiLCAiZWN4IiwgImVkeCIKKwkpOworCisJLyogUmV0dXJuICovCisJcmV0dXJuKHJ2YWwpOworfQorCisvKglGdW5jdGlvbiB0byB0ZXN0IGlmIG1teCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZC4uLgorKi8KK2lubGluZSBleHRlcm4gaW50CittbXhfb2sodm9pZCkKK3sKKwkvKiBSZXR1cm5zIDEgaWYgTU1YIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLCAwIG90aGVyd2lzZSAqLworCXJldHVybiAoIG1tX3N1cHBvcnQoKSAmIDB4MSApOworfQorI2VuZGlmCisKKy8qCUhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBpbnN0cnVjdGlvbiBtYWNyb3MgdGhhdCBmb2xsb3cuLi4KKwkobm90ZSB0aGF0IG1lbW9yeS10by1yZWdpc3RlciwgbTJyLCBpbnN0cnVjdGlvbnMgYXJlIG5lYXJseQorCSBhcyBlZmZpY2llbnQgYXMgcmVnaXN0ZXItdG8tcmVnaXN0ZXIsIHIyciwgaW5zdHJ1Y3Rpb25zOworCSBob3dldmVyLCBtZW1vcnktdG8tbWVtb3J5IGluc3RydWN0aW9ucyBhcmUgcmVhbGx5IHNpbXVsYXRlZAorCSBhcyBhIGNvbnZlbmllbmNlLCBhbmQgYXJlIG9ubHkgMS8zIGFzIGVmZmljaWVudCkKKyovCisjaWZkZWYJTU1YX1RSQUNFCisKKy8qCUluY2x1ZGUgdGhlIHN0dWZmIGZvciBwcmludGluZyBhIHRyYWNlIHRvIHN0ZGVyci4uLgorKi8KKworI2RlZmluZQltbXhfaTJyKG9wLCBpbW0sIHJlZykgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJbW14X3RyYWNlLnVxID0gKGltbSk7IFwKKwkJcHJpbnRmKCNvcCAiX2kycigiICNpbW0gIj0weCUwOHglMDh4LCAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj15IiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJcHJpbnRmKCNyZWcgIj0weCUwOHglMDh4KSA9PiAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlMCwgJSUiICNyZWcgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkJICAgICAgOiAieSIgKGltbSkpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj15IiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJcHJpbnRmKCNyZWcgIj0weCUwOHglMDh4XG4iLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJfQorCisjZGVmaW5lCW1teF9tMnIob3AsIG1lbSwgcmVnKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQltbXhfdHJhY2UgPSAobWVtKTsgXAorCQlwcmludGYoI29wICJfbTJyKCIgI21lbSAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPXkiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI3JlZyAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCQkgICAgICA6ICJ5IiAobWVtKSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPXkiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI3JlZyAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X3IybShvcCwgcmVnLCBtZW0pIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj15IiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJcHJpbnRmKCNvcCAiX3IybSgiICNyZWcgIj0weCUwOHglMDh4LCAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCW1teF90cmFjZSA9IChtZW0pOyBcCisJCXByaW50ZigjbWVtICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9eSIgKG1lbSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCW1teF90cmFjZSA9IChtZW0pOyBcCisJCXByaW50ZigjbWVtICI9MHglMDh4JTA4eFxuIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCX0KKworI2RlZmluZQltbXhfcjJyKG9wLCByZWdzLCByZWdkKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWdzICIsICUwIiBcCisJCQkJICAgICAgOiAiPXkiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI29wICJfcjJyKCIgI3JlZ3MgIj0weCUwOHglMDh4LCAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9eSIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCXByaW50ZigjcmVnZCAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUiICNyZWdzICIsICUiICNyZWdkKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWdkICIsICUwIiBcCisJCQkJICAgICAgOiAiPXkiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI3JlZ2QgIj0weCUwOHglMDh4XG4iLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJfQorCisjZGVmaW5lCW1teF9tMm0ob3AsIG1lbXMsIG1lbWQpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCW1teF90cmFjZSA9IChtZW1zKTsgXAorCQlwcmludGYoI29wICJfbTJtKCIgI21lbXMgIj0weCUwOHglMDh4LCAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCW1teF90cmFjZSA9IChtZW1kKTsgXAorCQlwcmludGYoI21lbWQgIj0weCUwOHglMDh4KSA9PiAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlMCwgJSVtbTBcblx0IiBcCisJCQkJICAgICAgI29wICIgJTEsICUlbW0wXG5cdCIgXAorCQkJCSAgICAgICJtb3ZxICUlbW0wLCAlMCIgXAorCQkJCSAgICAgIDogIj15IiAobWVtZCkgXAorCQkJCSAgICAgIDogInkiIChtZW1zKSk7IFwKKwkJbW14X3RyYWNlID0gKG1lbWQpOyBcCisJCXByaW50ZigjbWVtZCAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNlbHNlCisKKy8qCVRoZXNlIG1hY3JvcyBhcmUgYSBsb3Qgc2ltcGxlciB3aXRob3V0IHRoZSB0cmFjaW5nLi4uCisqLworCisjZGVmaW5lCW1teF9pMnIob3AsIGltbSwgcmVnKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAieSIgKGltbSkgKQorCisjZGVmaW5lCW1teF9tMnIob3AsIG1lbSwgcmVnKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAibSIgKG1lbSkpCisKKyNkZWZpbmUJbW14X3IybShvcCwgcmVnLCBtZW0pIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSUiICNyZWcgIiwgJTAiIFwKKwkJCSAgICAgIDogIj1tIiAobWVtKSBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKQorCisjZGVmaW5lCW1teF9yMnIob3AsIHJlZ3MsIHJlZ2QpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpCisKKyNkZWZpbmUJbW14X20ybShvcCwgbWVtcywgbWVtZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlMCwgJSVtbTBcblx0IiBcCisJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCisJCQkgICAgICAibW92cSAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj15IiAobWVtZCkgXAorCQkJICAgICAgOiAieSIgKG1lbXMpKQorCisjZW5kaWYKKworCisvKgkxeDY0IE1PVmUgUXVhZHdvcmQKKwkodGhpcyBpcyBib3RoIGEgbG9hZCBhbmQgYSBzdG9yZS4uLgorCSBpbiBmYWN0LCBpdCBpcyB0aGUgb25seSB3YXkgdG8gc3RvcmUpCisqLworI2RlZmluZQltb3ZxX20ycih2YXIsIHJlZykJbW14X20ycihtb3ZxLCB2YXIsIHJlZykKKyNkZWZpbmUJbW92cV9yMm0ocmVnLCB2YXIpCW1teF9yMm0obW92cSwgcmVnLCB2YXIpCisjZGVmaW5lCW1vdnFfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIobW92cSwgcmVncywgcmVnZCkKKyNkZWZpbmUJbW92cSh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZxICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPXkiICh2YXJkKSBcCisJCQkgICAgICA6ICJ5IiAodmFycykpCisKKworLyoJMXgzMiBNT1ZlIERvdWJsZXdvcmQKKwkobGlrZSBtb3ZxLCB0aGlzIGlzIGJvdGggbG9hZCBhbmQgc3RvcmUuLi4KKwkgYnV0IGlzIG1vc3QgdXNlZnVsIGZvciBtb3ZpbmcgdGhpbmdzIGJldHdlZW4KKwkgbW14IHJlZ2lzdGVycyBhbmQgb3JkaW5hcnkgcmVnaXN0ZXJzKQorKi8KKyNkZWZpbmUJbW92ZF9tMnIodmFyLCByZWcpCW1teF9tMnIobW92ZCwgdmFyLCByZWcpCisjZGVmaW5lCW1vdmRfcjJtKHJlZywgdmFyKQltbXhfcjJtKG1vdmQsIHJlZywgdmFyKQorI2RlZmluZQltb3ZkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKG1vdmQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW1vdmQodmFycywgdmFyZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZCAlMSwgJSVtbTBcblx0IiBcCisJCQkgICAgICAibW92ZCAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj15IiAodmFyZCkgXAorCQkJICAgICAgOiAieSIgKHZhcnMpKQorCisKKy8qCTJ4MzIsIDR4MTYsIGFuZCA4eDggUGFyYWxsZWwgQUREcworKi8KKyNkZWZpbmUJcGFkZGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhZGRkLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZGRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZGQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhZGRkKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZGQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGFkZHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhZGR3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZHdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhZGR3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHcsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGFkZGJfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhZGRiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZGJfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZGIsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhZGRiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZGIsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNiBhbmQgOHg4IFBhcmFsbGVsIEFERHMgdXNpbmcgU2F0dXJhdGlvbiBhcml0aG1ldGljCisqLworI2RlZmluZQlwYWRkc3dfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhZGRzdywgdmFyLCByZWcpCisjZGVmaW5lCXBhZGRzd19yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkc3csIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhZGRzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGRzdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWRkc2JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhZGRzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBhZGRzYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkc2IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhZGRzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGRzYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgQUREcyB1c2luZyBVbnNpZ25lZCBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBhZGR1c3dfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhZGR1c3csIHZhciwgcmVnKQorI2RlZmluZQlwYWRkdXN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGR1c3csIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhZGR1c3codmFycywgdmFyZCkJbW14X20ybShwYWRkdXN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBhZGR1c2JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhZGR1c2IsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkdXNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGR1c2IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhZGR1c2IodmFycywgdmFyZCkJbW14X20ybShwYWRkdXNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTJ4MzIsIDR4MTYsIGFuZCA4eDggUGFyYWxsZWwgU1VCcworKi8KKyNkZWZpbmUJcHN1YmRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzdWJkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YmRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YmQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzdWJkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YmQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHN1YndfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzdWJ3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YndfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YncsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzdWJ3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YncsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHN1YmJfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzdWJiLCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YmJfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YmIsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzdWJiKHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YmIsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNiBhbmQgOHg4IFBhcmFsbGVsIFNVQnMgdXNpbmcgU2F0dXJhdGlvbiBhcml0aG1ldGljCisqLworI2RlZmluZQlwc3Vic3dfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzdWJzdywgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJzd19yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3Vic3csIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzdWJzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJzdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3Vic2JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzdWJzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJzYl9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3Vic2IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzdWJzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJzYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgU1VCcyB1c2luZyBVbnNpZ25lZCBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBzdWJ1c3dfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzdWJ1c3csIHZhciwgcmVnKQorI2RlZmluZQlwc3VidXN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJ1c3csIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzdWJ1c3codmFycywgdmFyZCkJbW14X20ybShwc3VidXN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzdWJ1c2JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzdWJ1c2IsIHZhciwgcmVnKQorI2RlZmluZQlwc3VidXNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJ1c2IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzdWJ1c2IodmFycywgdmFyZCkJbW14X20ybShwc3VidXNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgUGFyYWxsZWwgTVVMcyBnaXZpbmcgTG93IDR4MTYgcG9ydGlvbnMgb2YgcmVzdWx0cworKi8KKyNkZWZpbmUJcG11bGx3X20ycih2YXIsIHJlZykJbW14X20ycihwbXVsbHcsIHZhciwgcmVnKQorI2RlZmluZQlwbXVsbHdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocG11bGx3LCByZWdzLCByZWdkKQorI2RlZmluZQlwbXVsbHcodmFycywgdmFyZCkJbW14X20ybShwbXVsbHcsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNiBQYXJhbGxlbCBNVUxzIGdpdmluZyBIaWdoIDR4MTYgcG9ydGlvbnMgb2YgcmVzdWx0cworKi8KKyNkZWZpbmUJcG11bGh3X20ycih2YXIsIHJlZykJbW14X20ycihwbXVsaHcsIHZhciwgcmVnKQorI2RlZmluZQlwbXVsaHdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocG11bGh3LCByZWdzLCByZWdkKQorI2RlZmluZQlwbXVsaHcodmFycywgdmFyZCkJbW14X20ybShwbXVsaHcsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNi0+MngzMiBQYXJhbGxlbCBNdWwtQURECisJKG11bHMgbGlrZSBwbXVsbHcsIHRoZW4gYWRkcyBhZGphY2VudCAxNi1iaXQgZmllbGRzCisJIGluIHRoZSBtdWx0aXBseSByZXN1bHQgdG8gbWFrZSB0aGUgZmluYWwgMngzMiByZXN1bHQpCisqLworI2RlZmluZQlwbWFkZHdkX20ycih2YXIsIHJlZykJbW14X20ycihwbWFkZHdkLCB2YXIsIHJlZykKKyNkZWZpbmUJcG1hZGR3ZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwbWFkZHdkLCByZWdzLCByZWdkKQorI2RlZmluZQlwbWFkZHdkKHZhcnMsIHZhcmQpCW1teF9tMm0ocG1hZGR3ZCwgdmFycywgdmFyZCkKKworCisvKgkxeDY0IGJpdHdpc2UgQU5ECisqLworI2lmZGVmCUJST0tFTl9QQU5ECisjZGVmaW5lCXBhbmRfbTJyKHZhciwgcmVnKSBcCisJeyBcCisJCW1teF9tMnIocGFuZG4sIChtbXhfdCkgLTFMTCwgcmVnKTsgXAorCQltbXhfbTJyKHBhbmRuLCB2YXIsIHJlZyk7IFwKKwl9CisjZGVmaW5lCXBhbmRfcjJyKHJlZ3MsIHJlZ2QpIFwKKwl7IFwKKwkJbW14X20ycihwYW5kbiwgKG1teF90KSAtMUxMLCByZWdkKTsgXAorCQltbXhfcjJyKHBhbmRuLCByZWdzLCByZWdkKSBcCisJfQorI2RlZmluZQlwYW5kKHZhcnMsIHZhcmQpIFwKKwl7IFwKKwkJbW92cV9tMnIodmFyZCwgbW0wKTsgXAorCQltbXhfbTJyKHBhbmRuLCAobW14X3QpIC0xTEwsIG1tMCk7IFwKKwkJbW14X20ycihwYW5kbiwgdmFycywgbW0wKTsgXAorCQltb3ZxX3IybShtbTAsIHZhcmQpOyBcCisJfQorI2Vsc2UKKyNkZWZpbmUJcGFuZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGFuZCwgdmFyLCByZWcpCisjZGVmaW5lCXBhbmRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFuZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFuZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBhbmQsIHZhcnMsIHZhcmQpCisjZW5kaWYKKworCisvKgkxeDY0IGJpdHdpc2UgQU5EIHdpdGggTm90IHRoZSBkZXN0aW5hdGlvbgorKi8KKyNkZWZpbmUJcGFuZG5fbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhbmRuLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFuZG5fcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFuZG4sIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhbmRuKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFuZG4sIHZhcnMsIHZhcmQpCisKKworLyoJMXg2NCBiaXR3aXNlIE9SCisqLworI2RlZmluZQlwb3JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBvciwgdmFyLCByZWcpCisjZGVmaW5lCXBvcl9yMnIocmVncywgcmVnZCkJbW14X3Iycihwb3IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBvcih2YXJzLCB2YXJkKQltbXhfbTJtKHBvciwgdmFycywgdmFyZCkKKworCisvKgkxeDY0IGJpdHdpc2UgZVhjbHVzaXZlIE9SCisqLworI2RlZmluZQlweG9yX20ycih2YXIsIHJlZykJbW14X20ycihweG9yLCB2YXIsIHJlZykKKyNkZWZpbmUJcHhvcl9yMnIocmVncywgcmVnZCkJbW14X3IycihweG9yLCByZWdzLCByZWdkKQorI2RlZmluZQlweG9yKHZhcnMsIHZhcmQpCW1teF9tMm0ocHhvciwgdmFycywgdmFyZCkKKworCisvKgkyeDMyLCA0eDE2LCBhbmQgOHg4IFBhcmFsbGVsIENvTVBhcmUgZm9yIEVRdWFsaXR5CisJKHJlc3VsdGluZyBmaWVsZHMgYXJlIGVpdGhlciAwIG9yIC0xKQorKi8KKyNkZWZpbmUJcGNtcGVxZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGNtcGVxZCwgdmFyLCByZWcpCisjZGVmaW5lCXBjbXBlcWRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGNtcGVxZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGNtcGVxZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBjbXBlcWQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGNtcGVxd19tMnIodmFyLCByZWcpCW1teF9tMnIocGNtcGVxdywgdmFyLCByZWcpCisjZGVmaW5lCXBjbXBlcXdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGNtcGVxdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGNtcGVxdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBjbXBlcXcsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGNtcGVxYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGNtcGVxYiwgdmFyLCByZWcpCisjZGVmaW5lCXBjbXBlcWJfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGNtcGVxYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGNtcGVxYih2YXJzLCB2YXJkKQltbXhfbTJtKHBjbXBlcWIsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBDb01QYXJlIGZvciBHcmVhdGVyIFRoYW4KKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQlwY21wZ3RkX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZ3RkLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGd0ZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZ3RkLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZ3RkKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGd0ZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZ3R3X20ycih2YXIsIHJlZykJbW14X20ycihwY21wZ3R3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGd0d19yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZ3R3LCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZ3R3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGd0dywgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZ3RiX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZ3RiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGd0Yl9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZ3RiLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZ3RiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGd0YiwgdmFycywgdmFyZCkKKworCisvKgkxeDY0LCAyeDMyLCBhbmQgNHgxNiBQYXJhbGxlbCBTaGlmdCBMZWZ0IExvZ2ljYWwKKyovCisjZGVmaW5lCXBzbGxxX2kycihpbW0sIHJlZykJbW14X2kycihwc2xscSwgaW1tLCByZWcpCisjZGVmaW5lCXBzbGxxX20ycih2YXIsIHJlZykJbW14X20ycihwc2xscSwgdmFyLCByZWcpCisjZGVmaW5lCXBzbGxxX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzbGxxLCByZWdzLCByZWdkKQorI2RlZmluZQlwc2xscSh2YXJzLCB2YXJkKQltbXhfbTJtKHBzbGxxLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzbGxkX2kycihpbW0sIHJlZykJbW14X2kycihwc2xsZCwgaW1tLCByZWcpCisjZGVmaW5lCXBzbGxkX20ycih2YXIsIHJlZykJbW14X20ycihwc2xsZCwgdmFyLCByZWcpCisjZGVmaW5lCXBzbGxkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzbGxkLCByZWdzLCByZWdkKQorI2RlZmluZQlwc2xsZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBzbGxkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzbGx3X2kycihpbW0sIHJlZykJbW14X2kycihwc2xsdywgaW1tLCByZWcpCisjZGVmaW5lCXBzbGx3X20ycih2YXIsIHJlZykJbW14X20ycihwc2xsdywgdmFyLCByZWcpCisjZGVmaW5lCXBzbGx3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzbGx3LCByZWdzLCByZWdkKQorI2RlZmluZQlwc2xsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzbGx3LCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQsIDJ4MzIsIGFuZCA0eDE2IFBhcmFsbGVsIFNoaWZ0IFJpZ2h0IExvZ2ljYWwKKyovCisjZGVmaW5lCXBzcmxxX2kycihpbW0sIHJlZykJbW14X2kycihwc3JscSwgaW1tLCByZWcpCisjZGVmaW5lCXBzcmxxX20ycih2YXIsIHJlZykJbW14X20ycihwc3JscSwgdmFyLCByZWcpCisjZGVmaW5lCXBzcmxxX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzcmxxLCByZWdzLCByZWdkKQorI2RlZmluZQlwc3JscSh2YXJzLCB2YXJkKQltbXhfbTJtKHBzcmxxLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzcmxkX2kycihpbW0sIHJlZykJbW14X2kycihwc3JsZCwgaW1tLCByZWcpCisjZGVmaW5lCXBzcmxkX20ycih2YXIsIHJlZykJbW14X20ycihwc3JsZCwgdmFyLCByZWcpCisjZGVmaW5lCXBzcmxkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzcmxkLCByZWdzLCByZWdkKQorI2RlZmluZQlwc3JsZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBzcmxkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzcmx3X2kycihpbW0sIHJlZykJbW14X2kycihwc3JsdywgaW1tLCByZWcpCisjZGVmaW5lCXBzcmx3X20ycih2YXIsIHJlZykJbW14X20ycihwc3JsdywgdmFyLCByZWcpCisjZGVmaW5lCXBzcmx3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzcmx3LCByZWdzLCByZWdkKQorI2RlZmluZQlwc3Jsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzcmx3LCB2YXJzLCB2YXJkKQorCisKKy8qCTJ4MzIgYW5kIDR4MTYgUGFyYWxsZWwgU2hpZnQgUmlnaHQgQXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcHNyYWRfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmFkLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNyYWRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmFkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNyYWRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNyYWQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmFkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNyYWQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNyYXdfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmF3LCBpbW0sIHJlZykKKyNkZWZpbmUJcHNyYXdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmF3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHNyYXdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNyYXcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmF3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHNyYXcsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMi0+NHgxNiBhbmQgNHgxNi0+OHg4IFBBQ0sgYW5kIFNpZ25lZCBTYXR1cmF0ZQorCShwYWNrcyBzb3VyY2UgYW5kIGRlc3QgZmllbGRzIGludG8gZGVzdCBpbiB0aGF0IG9yZGVyKQorKi8KKyNkZWZpbmUJcGFja3NzZHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhY2tzc2R3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGFja3NzZHdfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocGFja3NzZHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhY2tzc2R3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGFja3NzZHcsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGFja3Nzd2JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhY2tzc3diLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFja3Nzd2JfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocGFja3Nzd2IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhY2tzc3diKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFja3Nzd2IsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNi0+OHg4IFBBQ0sgYW5kIFVuc2lnbmVkIFNhdHVyYXRlCisJKHBhY2tzIHNvdXJjZSBhbmQgZGVzdCBmaWVsZHMgaW50byBkZXN0IGluIHRoYXQgb3JkZXIpCisqLworI2RlZmluZQlwYWNrdXN3Yl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFja3Vzd2IsIHZhciwgcmVnKQorI2RlZmluZQlwYWNrdXN3Yl9yMnIocmVncywgcmVnZCkgbW14X3IycihwYWNrdXN3YiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFja3Vzd2IodmFycywgdmFyZCkJbW14X20ybShwYWNrdXN3YiwgdmFycywgdmFyZCkKKworCisvKgkyeDMyLT4xeDY0LCA0eDE2LT4yeDMyLCBhbmQgOHg4LT40eDE2IFVOUGFDSyBMb3cKKwkoaW50ZXJsZWF2ZXMgbG93IGhhbGYgb2YgZGVzdCB3aXRoIGxvdyBoYWxmIG9mIHNvdXJjZQorCSBhcyBwYWRkaW5nIGluIGVhY2ggcmVzdWx0IGZpZWxkKQorKi8KKyNkZWZpbmUJcHVucGNrbGRxX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tsZHEsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tsZHFfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNrbGRxLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tsZHEodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tsZHEsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNrbHdkX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tsd2QsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tsd2RfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNrbHdkLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tsd2QodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tsd2QsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNrbGJ3X20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tsYncsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tsYndfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNrbGJ3LCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tsYncodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tsYncsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMi0+MXg2NCwgNHgxNi0+MngzMiwgYW5kIDh4OC0+NHgxNiBVTlBhQ0sgSGlnaAorCShpbnRlcmxlYXZlcyBoaWdoIGhhbGYgb2YgZGVzdCB3aXRoIGhpZ2ggaGFsZiBvZiBzb3VyY2UKKwkgYXMgcGFkZGluZyBpbiBlYWNoIHJlc3VsdCBmaWVsZCkKKyovCisjZGVmaW5lCXB1bnBja2hkcV9tMnIodmFyLCByZWcpCW1teF9tMnIocHVucGNraGRxLCB2YXIsIHJlZykKKyNkZWZpbmUJcHVucGNraGRxX3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHB1bnBja2hkcSwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHVucGNraGRxKHZhcnMsIHZhcmQpCW1teF9tMm0ocHVucGNraGRxLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXB1bnBja2h3ZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHVucGNraHdkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHVucGNraHdkX3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHB1bnBja2h3ZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHVucGNraHdkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHVucGNraHdkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXB1bnBja2hid19tMnIodmFyLCByZWcpCW1teF9tMnIocHVucGNraGJ3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHVucGNraGJ3X3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHB1bnBja2hidywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHVucGNraGJ3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHVucGNraGJ3LCB2YXJzLCB2YXJkKQorCisKKy8qCUVtcHR5IE1NeCBTdGF0ZQorCSh1c2VkIHRvIGNsZWFuLXVwIHdoZW4gZ29pbmcgZnJvbSBtbXggdG8gZmxvYXQgdXNlCisJIG9mIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgc2hhcmVkIGJ5IGJvdGg7IG5vdGUgdGhhdAorCSB0aGVyZSBpcyBubyBmbG9hdC10by1tbXggb3BlcmF0aW9uIG5lZWRlZCwgYmVjYXVzZQorCSBvbmx5IHRoZSBmbG9hdCB0YWcgd29yZCBpbmZvIGlzIGNvcnJ1cHRpYmxlKQorKi8KKyNpZmRlZglNTVhfVFJBQ0UKKworI2RlZmluZQllbW1zKCkgXAorCXsgXAorCQlwcmludGYoImVtbXMoKVxuIik7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIik7IFwKKwl9CisKKyNlbHNlCisKKyNkZWZpbmUJZW1tcygpCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIikKKworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25hbm94L1NETF9ueGV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODhjNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhldmVudHMuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEhzaWVoLUZ1IFRzYWkKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgIEdyZWcgSGFlcnIgPGdyZWdAY2Vuc29mdC5jb20+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyAgICAKKyAgICBIc2llaC1GdSBUc2FpCisgICAgY2xhcmVAc2V0YWJveC5jb20KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX2tleXN5bS5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKworI2luY2x1ZGUgIlNETF9ueGV2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX254aW1hZ2VfYy5oIgorCisvLyBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBuYW5veCBrZXlzeW0gdG8gYSBTREwga2V5c3ltCitzdGF0aWMgU0RMS2V5IE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfTEFTVCArIDFdIDsKKwordm9pZCBOWF9Jbml0T1NLZXltYXAgKF9USElTKQoreworICAgIGludCBpIDsKKworICAgIERwcmludGYgKCJlbnRlciBOWF9Jbml0T1NLZXltYXBcbiIpIDsKKworICAgIC8vIE1hcCB0aGUgbmFub3ggc2NhbmNvZGVzIHRvIFNETCBrZXlzeW1zCisgICAgZm9yIChpID0gMDsgaSA8IFNETF9hcnJheXNpemUgKE5YX05PTkFTQ0lJX2tleW1hcCk7ICsrIGkpCisgICAgICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbaV0gPSBTRExLX1VOS05PV04gOworCisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9MRUZUICAgICAgICAmIDB4RkZdID0gU0RMS19MRUZUIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1JJR0hUICAgICAgICYgMHhGRl0gPSBTRExLX1JJR0hUIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1VQICAgICAgICAgICYgMHhGRl0gPSBTRExLX1VQIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0RPV04gICAgICAgICYgMHhGRl0gPSBTRExLX0RPV04gOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfSU5TRVJUICAgICAgJiAweEZGXSA9IFNETEtfSU5TRVJUIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0RFTEVURSAgICAgICYgMHhGRl0gPSBTRExLX0RFTEVURSA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9IT01FICAgICAgICAmIDB4RkZdID0gU0RMS19IT01FIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0VORCAgICAgICAgICYgMHhGRl0gPSBTRExLX0VORCA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9QQUdFVVAgICAgICAmIDB4RkZdID0gU0RMS19QQUdFVVAgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfUEFHRURPV04gICAgJiAweEZGXSA9IFNETEtfUEFHRURPV04gOworCisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUDAgICAgICAgICAmIDB4RkZdID0gU0RMS19LUDAgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfS1AxICAgICAgICAgJiAweEZGXSA9IFNETEtfS1AxIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQMiAgICAgICAgICYgMHhGRl0gPSBTRExLX0tQMiA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUDMgICAgICAgICAmIDB4RkZdID0gU0RMS19LUDMgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfS1A0ICAgICAgICAgJiAweEZGXSA9IFNETEtfS1A0IDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQNSAgICAgICAgICYgMHhGRl0gPSBTRExLX0tQNSA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUDYgICAgICAgICAmIDB4RkZdID0gU0RMS19LUDYgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfS1A3ICAgICAgICAgJiAweEZGXSA9IFNETEtfS1A3IDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQOCAgICAgICAgICYgMHhGRl0gPSBTRExLX0tQOCA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUDkgICAgICAgICAmIDB4RkZdID0gU0RMS19LUDkgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfS1BfUEVSSU9EICAgJiAweEZGXSA9IFNETEtfS1BfUEVSSU9EIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQX0RJVklERSAgICYgMHhGRl0gPSBTRExLX0tQX0RJVklERSA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUF9NVUxUSVBMWSAmIDB4RkZdID0gU0RMS19LUF9NVUxUSVBMWSA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUF9NSU5VUyAgICAmIDB4RkZdID0gU0RMS19LUF9NSU5VUyA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9LUF9QTFVTICAgICAmIDB4RkZdID0gU0RMS19LUF9QTFVTIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQX0VOVEVSICAgICYgMHhGRl0gPSBTRExLX0tQX0VOVEVSIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0tQX0VRVUFMUyAgICYgMHhGRl0gPSBTRExLX0tQX0VRVUFMUyA7CisKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0YxICAgICAgICAgICYgMHhGRl0gPSBTRExLX0YxIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0YyICAgICAgICAgICYgMHhGRl0gPSBTRExLX0YyIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0YzICAgICAgICAgICYgMHhGRl0gPSBTRExLX0YzIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y0ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y0IDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y1ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y1IDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y2ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y2IDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y3ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y3IDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y4ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y4IDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0Y5ICAgICAgICAgICYgMHhGRl0gPSBTRExLX0Y5IDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX0YxMCAgICAgICAgICYgMHhGRl0gPSBTRExLX0YxMCA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9GMTEgICAgICAgICAmIDB4RkZdID0gU0RMS19GMTEgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfRjEyICAgICAgICAgJiAweEZGXSA9IFNETEtfRjEyIDsKKworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfTlVNTE9DSyAgICAgJiAweEZGXSA9IFNETEtfTlVNTE9DSyA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9DQVBTTE9DSyAgICAmIDB4RkZdID0gU0RMS19DQVBTTE9DSyA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9TQ1JPTExPQ0sgICAmIDB4RkZdID0gU0RMS19TQ1JPTExPQ0sgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfTFNISUZUICAgICAgJiAweEZGXSA9IFNETEtfTFNISUZUIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1JTSElGVCAgICAgICYgMHhGRl0gPSBTRExLX1JTSElGVCA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9MQ1RSTCAgICAgICAmIDB4RkZdID0gU0RMS19MQ1RSTCA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9SQ1RSTCAgICAgICAmIDB4RkZdID0gU0RMS19SQ1RSTCA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9MQUxUICAgICAgICAmIDB4RkZdID0gU0RMS19MQUxUIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1JBTFQgICAgICAgICYgMHhGRl0gPSBTRExLX1JBTFQgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfTE1FVEEgICAgICAgJiAweEZGXSA9IFNETEtfTE1FVEEgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfUk1FVEEgICAgICAgJiAweEZGXSA9IFNETEtfUk1FVEEgOworICAgIE5YX05PTkFTQ0lJX2tleW1hcCBbTVdLRVlfQUxUR1IgICAgICAgJiAweEZGXSA9IFNETEtfTU9ERSA7CisKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1BSSU5UICAgICAgICYgMHhGRl0gPSBTRExLX1BSSU5UIDsKKyAgICBOWF9OT05BU0NJSV9rZXltYXAgW01XS0VZX1NZU1JFUSAgICAgICYgMHhGRl0gPSBTRExLX1NZU1JFUSA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9QQVVTRSAgICAgICAmIDB4RkZdID0gU0RMS19QQVVTRSA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9CUkVBSyAgICAgICAmIDB4RkZdID0gU0RMS19CUkVBSyA7CisgICAgTlhfTk9OQVNDSUlfa2V5bWFwIFtNV0tFWV9NRU5VICAgICAgICAmIDB4RkZdID0gU0RMS19NRU5VIDsKKworICAgIERwcmludGYgKCJsZWF2ZSBOWF9Jbml0T1NLZXltYXBcbiIpIDsKK30KKworU0RMX2tleXN5bSAqIE5YX1RyYW5zbGF0ZUtleSAoR1JfRVZFTlRfS0VZU1RST0tFICoga2V5c3Ryb2tlLCBTRExfa2V5c3ltICoga2V5c3ltKQoreworICAgIEdSX0tFWSBjaCA9IGtleXN0cm9rZSAtPiBjaCA7CisKKyAgICBEcHJpbnRmICgiZW50ZXIgTlhfVHJhbnNsYXRlS2V5XG4iKSA7CisKKyAgICBrZXlzeW0gLT4gc2NhbmNvZGUgPSBrZXlzdHJva2UgLT4gc2NhbmNvZGUgOworICAgIGtleXN5bSAtPiBzeW0gPSBTRExLX1VOS05PV04gOworCisgICAgaWYgKGNoICYgTVdLRVlfTk9OQVNDSUlfTUFTSykgeworICAgICAgICBrZXlzeW0gLT4gc3ltID0gTlhfTk9OQVNDSUlfa2V5bWFwIFtjaCAmIDB4RkZdIDsKKyAgICB9IGVsc2UgeworICAgICAgICBrZXlzeW0gLT4gc3ltID0gY2ggJiAweDdGIDsKKyAgICB9CisKKyAgICBrZXlzeW0gLT4gbW9kID0gS01PRF9OT05FIDsKKyAgICAKKyNpZiAxICAgLy8gICBSZXRyaWV2ZSBtb3JlIG1vZGUgaW5mb3JtYXRpb24KKyAgICB7CisgICAgICAgIEdSX0tFWU1PRCAgIG1vZCA9IGtleXN0cm9rZSAtPiBtb2RpZmllcnMgOworCisgICAgICAgIGlmIChtb2QgJiBNV0tNT0RfTFNISUZUKQorICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX0xTSElGVCA7CisgICAgICAgIGlmIChtb2QgJiBNV0tNT0RfUlNISUZUKQorICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX1JTSElGVCA7CisgICAgICAgIGlmIChtb2QgJiBNV0tNT0RfTENUUkwpCisgICAgICAgICAgICBrZXlzeW0gLT4gbW9kIHw9IEtNT0RfTENUUkwgOworICAgICAgICBpZiAobW9kICYgTVdLTU9EX1JDVFJMKQorICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX1JDVFJMIDsKKyAgICAgICAgaWYgKG1vZCAmIE1XS01PRF9MQUxUKQorICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX0xBTFQgOworICAgICAgICBpZiAobW9kICYgTVdLTU9EX1JBTFQpCisgICAgICAgICAgICBrZXlzeW0gLT4gbW9kIHw9IEtNT0RfUkFMVCA7CisgICAgICAgIGlmIChtb2QgJiBNV0tNT0RfTE1FVEEpCisgICAgICAgICAgICBrZXlzeW0gLT4gbW9kIHw9IEtNT0RfTE1FVEEgOworICAgICAgICBpZiAobW9kICYgTVdLTU9EX1JNRVRBKQorICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX1JNRVRBIDsKKyAgICAgICAgaWYgKG1vZCAmIE1XS01PRF9OVU0pCisgICAgICAgICAgICBrZXlzeW0gLT4gbW9kIHw9IEtNT0RfTlVNIDsKKyAgICAgICAgaWYgKG1vZCAmIE1XS01PRF9DQVBTKQorICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX0NBUFMgOworICAgICAgICBpZiAobW9kICYgTVdLTU9EX0FMVEdSKQorICAgICAgICAgICAga2V5c3ltIC0+IG1vZCB8PSBLTU9EX01PREUgOworICAgIH0KKyNlbmRpZgorCisgICAga2V5c3ltIC0+IHVuaWNvZGUgPSBjaCA7CisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfVHJhbnNsYXRlS2V5XG4iKSA7CisgICAgcmV0dXJuIGtleXN5bSA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYm91bmRhcnkgKF9USElTLCBpbnQgeCwgaW50IHkpCit7CisgICAgaWYgKHggPCBPZmZzZXRYIHx8IHkgPCBPZmZzZXRZIHx8IHggPiBPZmZzZXRYICsgdGhpcyAtPiBzY3JlZW4gLT4gdyB8fAorICAgICAgICB5ID4gT2Zmc2V0WSArIHRoaXMgLT4gc2NyZWVuIC0+IGgpCisgICAgICAgIHJldHVybiAwIDsKKyAgICAgICAgICAgIAorICAgIHJldHVybiAxIDsKK30KKwordm9pZCBOWF9QdW1wRXZlbnRzIChfVEhJUykKK3sKKyAgICBHUl9FVkVOVCAgICAgICAgIGV2ZW50IDsKKyAgICBzdGF0aWMgR1JfQlVUVE9OIGxhc3RfYnV0dG9uX2Rvd24gPSAwIDsKKworICAgIEdyQ2hlY2tOZXh0RXZlbnQgKCYgZXZlbnQpIDsKKyAgICB3aGlsZSAoZXZlbnQudHlwZSAhPSBHUl9FVkVOVF9UWVBFX05PTkUpIHsKKworICAgICAgICAvLyBkaXNwYXRjaCBldmVudAorICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9NT1VTRV9FTlRFUiA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRHByaW50ZiAoIm1vdXNlIGVudGVyXG4iKSA7CisgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBNT1VTRUZPQ1VTKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfTU9VU0VfRVhJVCA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRHByaW50ZiAoIm1vdXNlIGV4aXRcbiIpIDsKKyAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMCwgU0RMX0FQUE1PVVNFRk9DVVMpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9GT0NVU19JTiA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRHByaW50ZiAoImZvY3VzIGluXG4iKSA7CisgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBJTlBVVEZPQ1VTKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfRk9DVVNfT1VUIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEcHJpbnRmICgiZm9jdXMgb3V0XG4iKSA7CisgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDAsIFNETF9BUFBJTlBVVEZPQ1VTKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfTU9VU0VfTU9USU9OIDoKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBEcHJpbnRmICgibW91c2UgbW90aW9uXG4iKSA7CisKKyAgICAgICAgICAgICAgICBpZiAoU0RMX1ZpZGVvU3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja19ib3VuZGFyeSAodGhpcywgZXZlbnQuYnV0dG9uLngsIGV2ZW50LmJ1dHRvbi55KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24gKDAsIDAsIGV2ZW50LmJ1dHRvbi54IC0gT2Zmc2V0WCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmJ1dHRvbi55IC0gT2Zmc2V0WSkgOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbiAoMCwgMCwgZXZlbnQuYnV0dG9uLngsIGV2ZW50LmJ1dHRvbi55KSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfQlVUVE9OX0RPV04gOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBidXR0b24gPSBldmVudC5idXR0b24uYnV0dG9ucyA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRHByaW50ZiAoImJ1dHRvbiBkb3duXG4iKSA7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGJ1dHRvbikgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE1XQlVUVE9OX0wgOgorICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uID0gMSA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTVdCVVRUT05fTSA6CisgICAgICAgICAgICAgICAgICAgICAgICBidXR0b24gPSAyIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNV0JVVFRPTl9SIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IDMgOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IDAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0X2J1dHRvbl9kb3duID0gYnV0dG9uIDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrX2JvdW5kYXJ5ICh0aGlzLCBldmVudC5idXR0b24ueCwgZXZlbnQuYnV0dG9uLnkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uIChTRExfUFJFU1NFRCwgYnV0dG9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5idXR0b24ueCAtIE9mZnNldFgsIGV2ZW50LmJ1dHRvbi55IC0gT2Zmc2V0WSkgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbiAoU0RMX1BSRVNTRUQsIGJ1dHRvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5idXR0b24ueCwgZXZlbnQuYnV0dG9uLnkpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkbyBub3Qga29udyB3aGljaCBidXR0b24gaXMgcmVsZWFzZWQKKyAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9CVVRUT05fVVAgOgorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIERwcmludGYgKCJidXR0b24gdXBcbiIpIDsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50bHlfZnVsbHNjcmVlbikgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tfYm91bmRhcnkgKHRoaXMsIGV2ZW50LmJ1dHRvbi54LCBldmVudC5idXR0b24ueSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24gKFNETF9SRUxFQVNFRCwgbGFzdF9idXR0b25fZG93biwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuYnV0dG9uLnggLSBPZmZzZXRYLCBldmVudC5idXR0b24ueSAtIE9mZnNldFkpIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24gKFNETF9SRUxFQVNFRCwgbGFzdF9idXR0b25fZG93biwgCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5idXR0b24ueCwgZXZlbnQuYnV0dG9uLnkpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF9idXR0b25fZG93biA9IDAgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBHUl9FVkVOVF9UWVBFX0tFWV9ET1dOIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRExfa2V5c3ltIGtleXN5bSA7CisKKyAgICAgICAgICAgICAgICBEcHJpbnRmICgia2V5IGRvd25cbiIpIDsKKyAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUFJFU1NFRCwKKyAgICAgICAgICAgICAgICAgICAgTlhfVHJhbnNsYXRlS2V5ICgmIGV2ZW50LmtleXN0cm9rZSwgJiBrZXlzeW0pKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdSX0VWRU5UX1RZUEVfS0VZX1VQIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRExfa2V5c3ltIGtleXN5bSA7CisKKyAgICAgICAgICAgICAgICBEcHJpbnRmICgia2V5IHVwXG4iKSA7CisgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1JFTEVBU0VELAorICAgICAgICAgICAgICAgICAgICBOWF9UcmFuc2xhdGVLZXkgKCYgZXZlbnQua2V5c3Ryb2tlLCAmIGtleXN5bSkpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9DTE9TRV9SRVEgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERwcmludGYgKCJjbG9zZSByZXF1aXJlXG4iKSA7CisgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVRdWl0ICgpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgR1JfRVZFTlRfVFlQRV9FWFBPU1VSRSA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRHByaW50ZiAoImV2ZW50X3R5cGVfZXhwb3N1cmVcbiIpIDsKKyAgICAgICAgICAgICAgICBpZiAoU0RMX1ZpZGVvU3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICBOWF9SZWZyZXNoRGlzcGxheSAodGhpcykgOy8vLCAmIGV2ZW50LmV4cG9zdXJlKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBHUl9FVkVOVF9UWVBFX1VQREFURSA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC51cGRhdGUudXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHUl9VUERBVEVfTUFQIDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRHByaW50ZiAoIkdSX1VQREFURV9NQVBcbiIpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhY3RpdmUsIG1ha2Ugb3Vyc2VsdmVzIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoU0RMX0dldEFwcFN0YXRlICgpICYgU0RMX0FQUEFDVElWRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGFuIGludGVybmFsIGFjdGl2YXRlIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBBQ1RJVkUpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTRExfVmlkZW9TdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlhfUmVmcmVzaERpc3BsYXkgKHRoaXMpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHUl9VUERBVEVfVU5NQVAgOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEdSX1VQREFURV9VTk1BUFRFTVAgOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEcHJpbnRmICgiR1JfVVBEQVRFX1VOTUFQIG9yIEdSX1VQREFURV9VTk1BUFRFTVBcbiIpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIGFjdGl2ZSwgbWFrZSBvdXJzZWx2ZXMgaW5hY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTRExfR2V0QXBwU3RhdGUgKCkgJiBTRExfQVBQQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBhbiBpbnRlcm5hbCBkZWFjdGl2YXRlIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDAsIFNETF9BUFBBQ1RJVkUgfCBTRExfQVBQSU5QVVRGT0NVUykgOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHUl9VUERBVEVfU0laRSA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERwcmludGYgKCJHUl9VUERBVEVfU0laRVxuIikgOworICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVSZXNpemUgKGV2ZW50LnVwZGF0ZS53aWR0aCwgZXZlbnQudXBkYXRlLmhlaWdodCkgOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgR1JfVVBEQVRFX01PVkUgOgorCQkgICAgY2FzZSBHUl9VUERBVEVfUkVQQVJFTlQgOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEcHJpbnRmICgiR1JfVVBEQVRFX01PVkUgb3IgR1JfVVBEQVRFX1JFUEFSRU5UXG4iKSA7CisjaWZkZWYgRU5BQkxFX05BTk9YX0RJUkVDVF9GQgorCQkJaWYgKENsaWVudGZiKSB7CisJCQkgICAgLyogR2V0IGN1cnJlbnQgd2luZG93IHBvc2l0aW9uIGFuZCBmYiBwb2ludGVyKi8KKwkJCSAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pIAorCQkJCUdyR2V0V2luZG93RkJJbmZvKEZTd2luZG93LCAmZmJpbmZvKTsKKwkJCSAgICBlbHNlCisJCQkJR3JHZXRXaW5kb3dGQkluZm8oU0RMX1dpbmRvdywgJmZiaW5mbyk7CisJCQl9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgRHByaW50ZiAoInVua25vd24gR1JfRVZFTlRfVFlQRV9VUERBVEVcbiIpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrIDsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEcHJpbnRmICgicHVtcCBldmVudCBkZWZhdWx0XG4iKSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBHckNoZWNrTmV4dEV2ZW50ICgmIGV2ZW50KSA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjRmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25hbm94L1NETF9ueGV2ZW50c19jLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEhzaWVoLUZ1IFRzYWkKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworICAgIAorICAgIEhzaWVoLUZ1IFRzYWkKKyAgICBjbGFyZUBzZXRhYm94LmNvbQorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbnh2aWRlby5oIgorCisvLyBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQKK2V4dGVybiB2b2lkIE5YX0luaXRPU0tleW1hcCAoX1RISVMpIDsKK2V4dGVybiB2b2lkIE5YX1B1bXBFdmVudHMgKF9USElTKSA7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25hbm94L1NETF9ueGltYWdlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25hbm94L1NETF9ueGltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkMzE1NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254aW1hZ2UuYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEhzaWVoLUZ1IFRzYWkKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgIEdyZWcgSGFlcnIgPGdyZWdAY2Vuc29mdC5jb20+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyAgICAKKyAgICBIc2llaC1GdSBUc2FpCisgICAgY2xhcmVAc2V0YWJveC5jb20KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX254aW1hZ2VfYy5oIgorCit2b2lkIE5YX05vcm1hbFVwZGF0ZSAoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKiByZWN0cykKK3sKKyAgICBpbnQgICAgICAgICAgIGksIGosIHhpbmMsIHlpbmMsIGRlc3RpbmMsIHJvd2luYyA7CisgICAgaW50ICAgICAgICAgICB4LCB5LCB3LCBoIDsKKyAgICB1bnNpZ25lZCBjaGFyICogc3JjID0gTlVMTCwgKiBkZXN0ID0gTlVMTCA7CisKKyAgICBEcHJpbnRmICgiZW50ZXIgTlhfTm9ybWFsVXBkYXRlXG4iKSA7CisgICAgCisgICAgLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZSBpbmNvbWluZyBpbWFnZSAqLworICAgIHhpbmMgPSB0aGlzIC0+IHNjcmVlbiAtPiBmb3JtYXQgLT4gQnl0ZXNQZXJQaXhlbCA7CisgICAgeWluYyA9IHRoaXMgLT4gc2NyZWVuIC0+IHBpdGNoIDsKKyAgICAgICAgCisgICAgZm9yIChpID0gMDsgaSA8IG51bXJlY3RzOyArKyBpKSB7CisgICAgICAgIHggPSByZWN0cyBbaV0ueCwgeSA9IHJlY3RzIFtpXS55IDsKKyAgICAgICAgdyA9IHJlY3RzIFtpXS53LCBoID0gcmVjdHMgW2ldLmggOworICAgICAgICBzcmMgPSBTRExfSW1hZ2UgKyB5ICogeWluYyArIHggKiB4aW5jIDsKKyNpZmRlZiBFTkFCTEVfTkFOT1hfRElSRUNUX0ZCCisgICAgICAgIGlmIChDbGllbnRmYikgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRseV9mdWxsc2NyZWVuKQorICAgICAgICAgICAgICAgIGRlc3QgPSBmYmluZm8ud2lucGl4ZWxzICsgKCgoeStPZmZzZXRZKSAqIGZiaW5mby5waXRjaCkgKworICAgICAgICAgICAgICAgICAgICAoKHgrT2Zmc2V0WCkgKiBmYmluZm8uYnl0ZXNwcCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRlc3QgPSBmYmluZm8ud2lucGl4ZWxzICsgKCh5ICogZmJpbmZvLnBpdGNoKSArICh4ICogZmJpbmZvLmJ5dGVzcHApKTsKKyAgICAgICAgICAgIGRlc3RpbmMgPSBmYmluZm8ucGl0Y2g7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QgPSBJbWFnZV9idWZmIDsKKyAgICAgICAgICAgIGRlc3RpbmMgPSB3ICogeGluYyA7CisgICAgICAgIH0KKyAgICAgICAgcm93aW5jID0gdyAqIHhpbmM7CisKKyAgICAgICAgLy8gYXBwbHkgR2FtbWFSYW1wIHRhYmxlCisgICAgICAgIGlmICgocGl4ZWxfdHlwZSA9PSBNV1BGX1RSVUVDT0xPUjA4ODggfHwgcGl4ZWxfdHlwZSA9PSBNV1BGX1RSVUVDT0xPUjg4OCkKKyAgICAgICAgICAmJiBHYW1tYVJhbXBfUiAmJiBHYW1tYVJhbXBfRyAmJiBHYW1tYVJhbXBfQikgeworICAgICAgICAgICAgVWludDggKiBwdHJzcmMgOworICAgICAgICAgICAgVWludDggKiBwdHJkc3QgOworICAgICAgICAgICAgaW50ICAgayA7CisKKyAgICAgICAgICAgIGZvciAoaiA9IGg7IGogPiAwOyAtLSBqLCBzcmMgKz0geWluYywgZGVzdCArPSBkZXN0aW5jKSB7CisgICAgICAgICAgICAgICAgcHRyc3JjID0gc3JjIDsKKyAgICAgICAgICAgICAgICBwdHJkc3QgPSBkZXN0IDsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSB3OyBrID4gMDsgLS0gaykgeworICAgICAgICAgICAgICAgICAgICAqcHRyZHN0KysgPSBHYW1tYVJhbXBfQiBbKnB0cnNyYysrXSA+PiA4OworICAgICAgICAgICAgICAgICAgICAqcHRyZHN0KysgPSBHYW1tYVJhbXBfRyBbKnB0cnNyYysrXSA+PiA4OworICAgICAgICAgICAgICAgICAgICAqcHRyZHN0KysgPSBHYW1tYVJhbXBfUiBbKnB0cnNyYysrXSA+PiA4OworICAgICAgICAgICAgICAgICAgICAqcHRyZHN0KysgPSAwOworICAgICAgICAgICAgICAgICAgICArK3B0cnNyYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiAxIC8qIFRoaXMgaXMgbmVlZGVkIGZvciBtaWNyb3dpbmRvd3MgMC45MCBvciBvbGRlciAqLworICAgICAgICBlbHNlIGlmIChwaXhlbF90eXBlID09IE1XUEZfVFJVRUNPTE9SMDg4OCB8fCBwaXhlbF90eXBlID09IE1XUEZfVFJVRUNPTE9SODg4KSB7CisgICAgICAgICAgICBVaW50OCAqIHB0cnNyYyA7CisgICAgICAgICAgICBVaW50OCAqIHB0cmRzdCA7CisgICAgICAgICAgICBpbnQgICBrIDsKKworICAgICAgICAgICAgZm9yIChqID0gaDsgaiA+IDA7IC0tIGosIHNyYyArPSB5aW5jLCBkZXN0ICs9IGRlc3RpbmMpIHsKKyAgICAgICAgICAgICAgICBwdHJzcmMgPSBzcmMgOworICAgICAgICAgICAgICAgIHB0cmRzdCA9IGRlc3QgOworICAgICAgICAgICAgICAgIGZvciAoayA9IHc7IGsgPiAwOyAtLSBrKSB7CisgICAgICAgICAgICAgICAgICAgICpwdHJkc3QrKyA9ICpwdHJzcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgKnB0cmRzdCsrID0gKnB0cnNyYysrOworICAgICAgICAgICAgICAgICAgICAqcHRyZHN0KysgPSAqcHRyc3JjKys7CisgICAgICAgICAgICAgICAgICAgICpwdHJkc3QrKyA9IDA7CisgICAgICAgICAgICAgICAgICAgICsrcHRyc3JjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gaDsgaiA+IDA7IC0tIGosIHNyYyArPSB5aW5jLCBkZXN0ICs9IGRlc3RpbmMpCisgICAgICAgICAgICAgICAgU0RMX21lbWNweSAoZGVzdCwgc3JjLCByb3dpbmMpIDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUNsaWVudGZiKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pIHsKKyAgICAgICAgICAgICAgICBHckFyZWEgKEZTd2luZG93LCBTRExfR0MsIHggKyBPZmZzZXRYLCB5ICsgT2Zmc2V0WSwgdywgaCwgSW1hZ2VfYnVmZiwgCisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3R5cGUpIDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgR3JBcmVhIChTRExfV2luZG93LCBTRExfR0MsIHgsIHksIHcsIGgsIEltYWdlX2J1ZmYsIHBpeGVsX3R5cGUpIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBHckZsdXNoKCk7CisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfTm9ybWFsVXBkYXRlXG4iKSA7Cit9CisKK2ludCBOWF9TZXR1cEltYWdlIChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4pCit7CisgICAgaW50IHNpemUgPSBzY3JlZW4gLT4gaCAqIHNjcmVlbiAtPiBwaXRjaCA7CisgICAgCisgICAgRHByaW50ZiAoImVudGVyIE5YX1NldHVwSW1hZ2VcbiIpIDsKKworICAgIHNjcmVlbiAtPiBwaXhlbHMgPSAodm9pZCAqKSBTRExfbWFsbG9jIChzaXplKSA7CisKKyAgICBpZiAoIUNsaWVudGZiKSB7CisgICAgICAgIEltYWdlX2J1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBTRExfbWFsbG9jIChzaXplKSA7CisgICAgICAgIGlmIChzY3JlZW4gLT4gcGl4ZWxzID09IE5VTEwgfHwgSW1hZ2VfYnVmZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBTRExfZnJlZSAoc2NyZWVuIC0+IHBpeGVscykgOworICAgICAgICAgICAgU0RMX2ZyZWUgKEltYWdlX2J1ZmYpIDsKKyAgICAgICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKSA7CisgICAgICAgICAgICByZXR1cm4gLTEgOworICAgICAgICB9CisgICAgfQorCisgICAgU0RMX0ltYWdlID0gKHVuc2lnbmVkIGNoYXIgKikgc2NyZWVuIC0+IHBpeGVscyA7CisKKyAgICB0aGlzIC0+IFVwZGF0ZVJlY3RzID0gTlhfTm9ybWFsVXBkYXRlIDsKKworICAgIERwcmludGYgKCJsZWF2ZSBOWF9TZXR1cEltYWdlXG4iKSA7CisgICAgcmV0dXJuIDAgOworfQorCit2b2lkIE5YX0Rlc3Ryb3lJbWFnZSAoX1RISVMsIFNETF9TdXJmYWNlICogc2NyZWVuKQoreworICAgIERwcmludGYgKCJlbnRlciBOWF9EZXN0cm95SW1hZ2VcbiIpIDsKKyAgICAKKyAgICBpZiAoU0RMX0ltYWdlKSBTRExfZnJlZSAoU0RMX0ltYWdlKSA7CisgICAgaWYgKEltYWdlX2J1ZmYpIFNETF9mcmVlIChJbWFnZV9idWZmKSA7CisgICAgaWYgKHNjcmVlbikgc2NyZWVuIC0+IHBpeGVscyA9IE5VTEwgOworICAgIAorICAgIERwcmludGYgKCJsZWF2ZSBOWF9EZXN0cm95SW1hZ2VcbiIpIDsKK30KKworaW50IE5YX1Jlc2l6ZUltYWdlIChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4sIFVpbnQzMiBmbGFncykKK3sKKyAgICBpbnQgICAgICAgICAgICByZXR2YWwgOworICAgIEdSX1NDUkVFTl9JTkZPIHNpIDsKKworICAgIERwcmludGYgKCJlbnRlciBOWF9SZXNpemVJbWFnZVxuIikgOworCisgICAgTlhfRGVzdHJveUltYWdlICh0aGlzLCBzY3JlZW4pIDsKKyAgICByZXR2YWwgPSBOWF9TZXR1cEltYWdlICh0aGlzLCBzY3JlZW4pIDsKKworICAgIEdyR2V0U2NyZWVuSW5mbyAoJiBzaSkgOworICAgIE9mZnNldFggPSAoc2kuY29scyAtIHNjcmVlbiAtPiB3KSAvIDIgOworICAgIE9mZnNldFkgPSAoc2kucm93cyAtIHNjcmVlbiAtPiBoKSAvIDIgOworCisjaWZkZWYgRU5BQkxFX05BTk9YX0RJUkVDVF9GQgorICAgIGlmIChDbGllbnRmYikgeworICAgICAgICAvKiBHZXQgY3VycmVudCB3aW5kb3cgcG9zaXRpb24gYW5kIGZiIHBvaW50ZXIqLworICAgICAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pIAorICAgICAgICAgICAgR3JHZXRXaW5kb3dGQkluZm8oRlN3aW5kb3csICZmYmluZm8pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBHckdldFdpbmRvd0ZCSW5mbyhTRExfV2luZG93LCAmZmJpbmZvKTsKKyAgICB9CisjZW5kaWYKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfUmVzaXplSW1hZ2VcbiIpIDsKKyAgICByZXR1cm4gcmV0dmFsIDsKK30KKwordm9pZCBOWF9SZWZyZXNoRGlzcGxheSAoX1RISVMpCit7CisgICAgRHByaW50ZiAoImVudGVyIE5YX1JlZnJlc2hEaXNwbGF5XG4iKSA7CisKKyAgICAvLyBEb24ndCByZWZyZXNoIGEgZGlzcGxheSB0aGF0IGRvZXNuJ3QgaGF2ZSBhbiBpbWFnZSAobGlrZSBHTCkKKyAgICBpZiAoISBTRExfSW1hZ2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEVOQUJMRV9OQU5PWF9ESVJFQ1RfRkIKKyAgICBpZiAoQ2xpZW50ZmIpIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGNoYXIgKnNyYywgKmRlc3QgPSBOVUxMOworICAgICAgICBpbnQgeGluYywgeWluYywgcm93aW5jOworCisgICAgICAgIEdyR2V0V2luZG93RkJJbmZvKFNETF9XaW5kb3csICZmYmluZm8pOworCisgICAgICAgIHhpbmMgPSB0aGlzIC0+IHNjcmVlbiAtPiBmb3JtYXQgLT4gQnl0ZXNQZXJQaXhlbCA7IAorICAgICAgICB5aW5jID0gdGhpcyAtPiBzY3JlZW4gLT4gcGl0Y2ggOyAgICAgICAgICAgCisKKyAgICAgICAgc3JjID0gU0RMX0ltYWdlOworICAgICAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pCisgICAgICAgICAgICBkZXN0ID0gZmJpbmZvLndpbnBpeGVscyArICgoT2Zmc2V0WSAqIGZiaW5mby5waXRjaCkgKworICAgICAgICAgICAgICAgIChPZmZzZXRYICogZmJpbmZvLmJ5dGVzcHApKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVzdCA9IGZiaW5mby53aW5waXhlbHM7CisgICAgICAgIHJvd2luYyA9IHhpbmMgKiB0aGlzIC0+IHNjcmVlbiAtPiB3OworCisgICAgICAgIGZvciAoaiA9IHRoaXMgLT4gc2NyZWVuIC0+IGg7IGogPiAwOyAtLSBqLCBzcmMgKz0geWluYywgZGVzdCArPSBmYmluZm8ucGl0Y2gpCisgICAgICAgICAgICBTRExfbWVtY3B5IChkZXN0LCBzcmMsIHJvd2luYykgOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIGlmIChjdXJyZW50bHlfZnVsbHNjcmVlbikgeworICAgICAgICAgICAgR3JBcmVhIChGU3dpbmRvdywgU0RMX0dDLCBPZmZzZXRYLCBPZmZzZXRZLCB0aGlzIC0+IHNjcmVlbiAtPiB3LCAKKyAgICAgICAgICAgICAgICB0aGlzIC0+IHNjcmVlbiAtPiBoLCBTRExfSW1hZ2UsIHBpeGVsX3R5cGUpIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdyQXJlYSAoU0RMX1dpbmRvdywgU0RMX0dDLCAwLCAwLCB0aGlzIC0+IHNjcmVlbiAtPiB3LCAKKyAgICAgICAgICAgICAgICB0aGlzIC0+IHNjcmVlbiAtPiBoLCBTRExfSW1hZ2UsIHBpeGVsX3R5cGUpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBHckZsdXNoKCk7CisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfUmVmcmVzaERpc3BsYXlcbiIpIDsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254aW1hZ2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhpbWFnZV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmMjllNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254aW1hZ2VfYy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisgICAgQ29weXJpZ2h0IChDKSAyMDAxICBIc2llaC1GdSBUc2FpCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyAgICAKKyAgICBIc2llaC1GdSBUc2FpCisgICAgY2xhcmVAc2V0YWJveC5jb20KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX254dmlkZW8uaCIKKworZXh0ZXJuIGludCBOWF9TZXR1cEltYWdlIChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4pIDsKK2V4dGVybiB2b2lkIE5YX0Rlc3Ryb3lJbWFnZSAoX1RISVMsIFNETF9TdXJmYWNlICogc2NyZWVuKSA7CitleHRlcm4gaW50IE5YX1Jlc2l6ZUltYWdlIChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4sIFVpbnQzMiBmbGFncykgOworCitleHRlcm4gdm9pZCBOWF9Ob3JtYWxVcGRhdGUgKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICogcmVjdHMpIDsKK2V4dGVybiB2b2lkIE5YX1JlZnJlc2hEaXNwbGF5IChfVEhJUykgOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhtb2Rlcy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhtb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjc0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25hbm94L1NETF9ueG1vZGVzLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEhzaWVoLUZ1IFRzYWkKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworICAgIAorICAgIEhzaWVoLUZ1IFRzYWkKKyAgICBjbGFyZUBzZXRhYm94LmNvbQorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfc3RkaW5jLmgiCisjaW5jbHVkZSAiU0RMX254bW9kZXNfYy5oIgorCitTRExfUmVjdCAqKiBOWF9MaXN0TW9kZXMgKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKiBmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKyAgICBpZiAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikKKyAgICAgICAgcmV0dXJuIFNETF9tb2RlbGlzdCA7CisKKyAgICBpZiAoU0RMX1Zpc3VhbC5icHAgPT0gZm9ybWF0IC0+IEJpdHNQZXJQaXhlbCkgeworICAgICAgICByZXR1cm4gKChTRExfUmVjdCAqKikgLTEpIDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKChTRExfUmVjdCAqKikgMCkgOworICAgIH0KK30KKwordm9pZCBOWF9GcmVlVmlkZW9Nb2RlcyAoX1RISVMpCit7CisgICAgaW50IGkgOworCisgICAgaWYgKFNETF9tb2RlbGlzdCkgeworICAgICAgICBmb3IgKGkgPSAwOyBTRExfbW9kZWxpc3QgW2ldOyArKyBpKSB7CisgICAgICAgICAgICBTRExfZnJlZSAoU0RMX21vZGVsaXN0IFtpXSkgOworICAgICAgICB9CisgICAgICAgIFNETF9mcmVlIChTRExfbW9kZWxpc3QpIDsKKyAgICAgICAgU0RMX21vZGVsaXN0ID0gTlVMTDsKKyAgICB9Cit9CisKK2ludCBOWF9FbnRlckZ1bGxTY3JlZW4gKF9USElTKQoreworICAgIGlmICghIGN1cnJlbnRseV9mdWxsc2NyZWVuKSB7CisgICAgICAgIEdSX1NDUkVFTl9JTkZPIHNpIDsKKworICAgICAgICBHckdldFNjcmVlbkluZm8gKCYgc2kpIDsKKyAgICAgICAgR3JSZXNpemVXaW5kb3cgKEZTd2luZG93LCBzaS5jb2xzLCBzaS5yb3dzKSA7CisgICAgICAgIEdyVW5tYXBXaW5kb3cgKFNETF9XaW5kb3cpIDsKKyAgICAgICAgR3JNYXBXaW5kb3cgKEZTd2luZG93KSA7CisgICAgICAgIEdyUmFpc2VXaW5kb3cgKEZTd2luZG93KSA7CisgICAgICAgIEdyU2V0Rm9jdXMgKEZTd2luZG93KSA7CisgICAgICAgIGN1cnJlbnRseV9mdWxsc2NyZWVuID0gMSA7ICAgICAgCisgICAgfQorCisgICAgcmV0dXJuIDEgOworfQorCitpbnQgTlhfTGVhdmVGdWxsU2NyZWVuIChfVEhJUykKK3sKKyAgICBpZiAoY3VycmVudGx5X2Z1bGxzY3JlZW4pIHsKKyAgICAgICAgR3JVbm1hcFdpbmRvdyAoRlN3aW5kb3cpIDsKKyAgICAgICAgR3JNYXBXaW5kb3cgKFNETF9XaW5kb3cpIDsKKyAgICAgICAgR3JSYWlzZVdpbmRvdyAoU0RMX1dpbmRvdykgOworICAgICAgICBHclNldEZvY3VzIChTRExfV2luZG93KSA7CisgICAgICAgIGN1cnJlbnRseV9mdWxsc2NyZWVuID0gMCA7CisgICAgfQorCisgICAgcmV0dXJuIDAgOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhtb2Rlc19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25hbm94L1NETF9ueG1vZGVzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTJlNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhtb2Rlc19jLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEhzaWVoLUZ1IFRzYWkKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworICAgIAorICAgIEhzaWVoLUZ1IFRzYWkKKyAgICBjbGFyZUBzZXRhYm94LmNvbQorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbnh2aWRlby5oIgorI2luY2x1ZGUgPFNETC5oPgorCitleHRlcm4gU0RMX1JlY3QgKiogTlhfTGlzdE1vZGVzIChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICogZm9ybWF0LCBVaW50MzIgZmxhZ3MpIDsKK2V4dGVybiB2b2lkIE5YX0ZyZWVWaWRlb01vZGVzIChfVEhJUykgOworZXh0ZXJuIGludCBOWF9FbnRlckZ1bGxTY3JlZW4gKF9USElTKSA7CitleHRlcm4gaW50IE5YX0xlYXZlRnVsbFNjcmVlbiAoX1RISVMpIDsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254bW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254bW91c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhmMzgyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhtb3VzZS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisgICAgQ29weXJpZ2h0IChDKSAyMDAxICBIc2llaC1GdSBUc2FpCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyAgICAKKyAgICBIc2llaC1GdSBUc2FpCisgICAgY2xhcmVAc2V0YWJveC5jb20KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX254bW91c2VfYy5oIgorCisvLyBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IKK3N0cnVjdCBXTWN1cnNvciB7CisgICAgaW50IHVudXNlZCA7Cit9IDsKKworV01jdXJzb3IgKiBOWF9DcmVhdGVXTUN1cnNvciAoX1RISVMsCisgICAgICAgIFVpbnQ4ICogZGF0YSwgVWludDggKiBtYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KQoreworICAgIFdNY3Vyc29yICogY3Vyc29yIDsKKworICAgIERwcmludGYgKCJlbnRlciBOWF9DcmVhdGVXTUN1cnNvclxuIikgOworCisgICAgY3Vyc29yID0gKFdNY3Vyc29yICopIFNETF9tYWxsb2MgKHNpemVvZiAoV01jdXJzb3IpKSA7CisgICAgaWYgKGN1cnNvciA9PSBOVUxMKSB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKSA7CisgICAgICAgIHJldHVybiBOVUxMIDsKKyAgICB9CisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfQ3JlYXRlV01DdXJzb3JcbiIpIDsKKyAgICByZXR1cm4gY3Vyc29yIDsKK30KKwordm9pZCBOWF9GcmVlV01DdXJzb3IgKF9USElTLCBXTWN1cnNvciAqIGN1cnNvcikKK3sKKyAgICBEcHJpbnRmICgiTlhfRnJlZVdNQ3Vyc29yXG4iKSA7CisgICAgU0RMX2ZyZWUgKGN1cnNvcikgOworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgTlhfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCit7CisgICAgR1JfV0lORE9XX0lORk8gaW5mbyA7CisKKyAgICBEcHJpbnRmICgiZW50ZXIgTlhfV2FycFdNQ3Vyc29yXG4iKSA7CisgICAgU0RMX0xvY2tfRXZlbnRUaHJlYWQgKCkgOworICAgIAorICAgIEdyR2V0V2luZG93SW5mbyAoU0RMX1dpbmRvdywgJiBpbmZvKSA7CisgICAgR3JNb3ZlQ3Vyc29yIChpbmZvLnggKyB4LCBpbmZvLnkgKyB5KSA7CisKKyAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkICgpIDsKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfV2FycFdNQ3Vyc29yXG4iKSA7Cit9CisKK2ludCBOWF9TaG93V01DdXJzb3IgKF9USElTLCBXTWN1cnNvciAqIGN1cnNvcikKK3sKKyAgICBEcHJpbnRmICgiTlhfU2hvd1dNQ3Vyc29yXG4iKSA7CisgICAgcmV0dXJuIDEgOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhtb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25hbm94L1NETF9ueG1vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2ZlZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnhtb3VzZV9jLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbnh2aWRlby5oIgorCitleHRlcm4gV01jdXJzb3IgKiBOWF9DcmVhdGVXTUN1cnNvciAoX1RISVMsIFVpbnQ4ICogZGF0YSwgVWludDggKiBtYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KSA7Cit2b2lkIE5YX0ZyZWVXTUN1cnNvciAoX1RISVMsIFdNY3Vyc29yICogY3Vyc29yKSA7CitleHRlcm4gdm9pZCBOWF9XYXJwV01DdXJzb3IgKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpIDsKK2V4dGVybiBpbnQgTlhfU2hvd1dNQ3Vyc29yIChfVEhJUywgV01jdXJzb3IgKiBjdXJzb3IpIDsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254dmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254dmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTg4ZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnh2aWRlby5jCkBAIC0wLDAgKzEsNTQ0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorICAgIENvcHlyaWdodCAoQykgMjAwMSAgSHNpZWgtRnUgVHNhaQorICAgIENvcHlyaWdodCAoQykgMjAwMiAgR3JlZyBIYWVyciA8Z3JlZ0BjZW5zb2Z0LmNvbT4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworICAgIAorICAgIEhzaWVoLUZ1IFRzYWkKKyAgICBjbGFyZUBzZXRhYm94LmNvbQorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjZGVmaW5lIE1XSU5DTFVERUNPTE9SUworI2luY2x1ZGUgIlNETF9ueHZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX254bW9kZXNfYy5oIgorI2luY2x1ZGUgIlNETF9ueHdtX2MuaCIKKyNpbmNsdWRlICJTRExfbnhtb3VzZV9jLmgiCisjaW5jbHVkZSAiU0RMX254aW1hZ2VfYy5oIgorI2luY2x1ZGUgIlNETF9ueGV2ZW50c19jLmgiCisKKy8vIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucworc3RhdGljIGludCBOWF9WaWRlb0luaXQgKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKiB2Zm9ybWF0KSA7CitzdGF0aWMgU0RMX1N1cmZhY2UgKiBOWF9TZXRWaWRlb01vZGUgKF9USElTLCBTRExfU3VyZmFjZSAqIGN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKSA7CitzdGF0aWMgaW50IE5YX1NldENvbG9ycyAoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICogY29sb3JzKSA7CitzdGF0aWMgdm9pZCBOWF9WaWRlb1F1aXQgKF9USElTKSA7CitzdGF0aWMgdm9pZCBOWF9EZXN0cm95V2luZG93IChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4pIDsKK3N0YXRpYyBpbnQgTlhfVG9nZ2xlRnVsbFNjcmVlbiAoX1RISVMsIGludCBvbikgOworc3RhdGljIHZvaWQgTlhfVXBkYXRlTW91c2UgKF9USElTKSA7CitzdGF0aWMgaW50IE5YX1NldEdhbW1hUmFtcCAoX1RISVMsIFVpbnQxNiAqIHJhbXApIDsKK3N0YXRpYyBpbnQgTlhfR2V0R2FtbWFSYW1wIChfVEhJUywgVWludDE2ICogcmFtcCkgOworCisvLyBNaWNyb3dpbiBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucworc3RhdGljIGludCBOWF9BdmFpbGFibGUgKCkKK3sKKyAgICBEcHJpbnRmICgiZW50ZXIgTlhfQXZhaWxhYmxlXG4iKSA7CisKKyAgICBpZiAoR3JPcGVuICgpIDwgMCkgcmV0dXJuIDAgOworICAgICAgICBHckNsb3NlICgpIDsKKyAgICAKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfQXZhaWxhYmxlXG4iKSA7CisgICAgcmV0dXJuIDEgOworfQorCitzdGF0aWMgdm9pZCBOWF9EZWxldGVEZXZpY2UgKFNETF9WaWRlb0RldmljZSAqIGRldmljZSkKK3sKKyAgICBEcHJpbnRmICgiZW50ZXIgTlhfRGVsZXRlRGV2aWNlXG4iKSA7CisKKyAgICBpZiAoZGV2aWNlKSB7CisgICAgICAgIGlmIChkZXZpY2UgLT4gaGlkZGVuKSBTRExfZnJlZSAoZGV2aWNlIC0+IGhpZGRlbikgOworICAgICAgICBpZiAoZGV2aWNlIC0+IGdsX2RhdGEpIFNETF9mcmVlIChkZXZpY2UgLT4gZ2xfZGF0YSkgOworICAgICAgICAgICAgU0RMX2ZyZWUgKGRldmljZSkgOworICAgIH0KKworICAgIERwcmludGYgKCJsZWF2ZSBOWF9EZWxldGVEZXZpY2VcbiIpIDsKK30KKyAgICAKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKiBOWF9DcmVhdGVEZXZpY2UgKGludCBkZXZpbmRleCkKK3sKKyAgICBTRExfVmlkZW9EZXZpY2UgKiBkZXZpY2UgOworCisgICAgRHByaW50ZiAoImVudGVyIE5YX0NyZWF0ZURldmljZVxuIikgOworCisgICAgLy8gSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24KKyAgICBkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopIFNETF9tYWxsb2MgKHNpemVvZiAoU0RMX1ZpZGVvRGV2aWNlKSkgOworICAgIGlmIChkZXZpY2UpIHsKKyAgICAgICAgU0RMX21lbXNldCAoZGV2aWNlLCAwLCAoc2l6ZW9mICogZGV2aWNlKSkgOworICAgICAgICBkZXZpY2UgLT4gaGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorICAgICAgICAgICAgICAgIFNETF9tYWxsb2MgKChzaXplb2YgKiBkZXZpY2UgLT4gaGlkZGVuKSkgOworICAgICAgICBkZXZpY2UgLT4gZ2xfZGF0YSA9IE5VTEwgOworICAgIH0KKyAgICBpZiAoKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlIC0+IGhpZGRlbiA9PSBOVUxMKSkgeworICAgICAgICBTRExfT3V0T2ZNZW1vcnkgKCkgOworICAgICAgICBOWF9EZWxldGVEZXZpY2UgKGRldmljZSkgOworICAgICAgICByZXR1cm4gMCA7CisgICAgfQorICAgIFNETF9tZW1zZXQgKGRldmljZSAtPiBoaWRkZW4sIDAsIChzaXplb2YgKiBkZXZpY2UgLT4gaGlkZGVuKSkgOworCisgICAgLy8gU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycworICAgIGRldmljZSAtPiBWaWRlb0luaXQgPSBOWF9WaWRlb0luaXQgOworICAgIGRldmljZSAtPiBMaXN0TW9kZXMgPSBOWF9MaXN0TW9kZXMgOworICAgIGRldmljZSAtPiBTZXRWaWRlb01vZGUgPSBOWF9TZXRWaWRlb01vZGUgOworICAgIGRldmljZSAtPiBUb2dnbGVGdWxsU2NyZWVuID0gTlhfVG9nZ2xlRnVsbFNjcmVlbiA7CisgICAgZGV2aWNlIC0+IFVwZGF0ZU1vdXNlID0gTlhfVXBkYXRlTW91c2UgOworICAgIGRldmljZSAtPiBDcmVhdGVZVVZPdmVybGF5ID0gTlVMTCA7CisgICAgZGV2aWNlIC0+IFNldENvbG9ycyA9IE5YX1NldENvbG9ycyA7CisgICAgZGV2aWNlIC0+IFVwZGF0ZVJlY3RzID0gTlVMTCA7CisgICAgZGV2aWNlIC0+IFZpZGVvUXVpdCA9IE5YX1ZpZGVvUXVpdDsKKyAgICBkZXZpY2UgLT4gQWxsb2NIV1N1cmZhY2UgPSBOVUxMIDsKKyAgICBkZXZpY2UgLT4gQ2hlY2tIV0JsaXQgPSBOVUxMIDsKKyAgICBkZXZpY2UgLT4gRmlsbEhXUmVjdCA9IE5VTEwgOworICAgIGRldmljZSAtPiBTZXRIV0NvbG9yS2V5ID0gTlVMTCA7CisgICAgZGV2aWNlIC0+IFNldEhXQWxwaGEgPSBOVUxMIDsKKyAgICBkZXZpY2UgLT4gTG9ja0hXU3VyZmFjZSA9IE5VTEwgOworICAgIGRldmljZSAtPiBVbmxvY2tIV1N1cmZhY2UgPSBOVUxMIDsKKyAgICBkZXZpY2UgLT4gRmxpcEhXU3VyZmFjZSA9IE5VTEwgOworICAgIGRldmljZSAtPiBGcmVlSFdTdXJmYWNlID0gTlVMTCA7CisgICAgZGV2aWNlIC0+IFNldEdhbW1hID0gTlVMTCA7CisgICAgZGV2aWNlIC0+IEdldEdhbW1hID0gTlVMTCA7CisgICAgZGV2aWNlIC0+IFNldEdhbW1hUmFtcCA9IE5YX1NldEdhbW1hUmFtcCA7CisgICAgZGV2aWNlIC0+IEdldEdhbW1hUmFtcCA9IE5YX0dldEdhbW1hUmFtcCA7CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisgICAgZGV2aWNlIC0+IEdMX0xvYWRMaWJyYXJ5ID0gTlVMTCA7CisgICAgZGV2aWNlIC0+IEdMX0dldFByb2NBZGRyZXNzID0gTlVMTCA7CisgICAgZGV2aWNlIC0+IEdMX0dldEF0dHJpYnV0ZSA9IE5VTEwgOworICAgIGRldmljZSAtPiBHTF9NYWtlQ3VycmVudCA9IE5VTEwgOworICAgIGRldmljZSAtPiBHTF9Td2FwQnVmZmVycyA9IE5VTEwgOworI2VuZGlmCisKKyAgICBkZXZpY2UgLT4gU2V0SWNvbiA9IE5VTEwgOworICAgIGRldmljZSAtPiBTZXRDYXB0aW9uID0gTlhfU2V0Q2FwdGlvbjsKKyAgICBkZXZpY2UgLT4gSWNvbmlmeVdpbmRvdyA9IE5VTEwgOworICAgIGRldmljZSAtPiBHcmFiSW5wdXQgPSBOVUxMIDsKKyAgICBkZXZpY2UgLT4gR2V0V01JbmZvID0gTlhfR2V0V01JbmZvIDsKKyAgICBkZXZpY2UgLT4gRnJlZVdNQ3Vyc29yID0gIE5YX0ZyZWVXTUN1cnNvciA7CisgICAgZGV2aWNlIC0+IENyZWF0ZVdNQ3Vyc29yID0gTlhfQ3JlYXRlV01DdXJzb3IgOworICAgIGRldmljZSAtPiBTaG93V01DdXJzb3IgPSBOWF9TaG93V01DdXJzb3IgOworICAgIGRldmljZSAtPiBXYXJwV01DdXJzb3IgPSBOWF9XYXJwV01DdXJzb3IgOworICAgIGRldmljZSAtPiBDaGVja01vdXNlTW9kZSA9IE5VTEwgOworICAgIGRldmljZSAtPiBJbml0T1NLZXltYXAgPSBOWF9Jbml0T1NLZXltYXAgOworICAgIGRldmljZSAtPiBQdW1wRXZlbnRzID0gTlhfUHVtcEV2ZW50cyA7CisKKyAgICBkZXZpY2UgLT4gZnJlZSA9IE5YX0RlbGV0ZURldmljZSA7CisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfQ3JlYXRlRGV2aWNlXG4iKSA7CisgICAgcmV0dXJuIGRldmljZSA7Cit9CisKK1ZpZGVvQm9vdFN0cmFwIE5YX2Jvb3RzdHJhcCA9IHsKKyAgICAibmFub3giLCAibmFub3giLCBOWF9BdmFpbGFibGUsIE5YX0NyZWF0ZURldmljZQorfSA7CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9hdXhfd2luZG93cyAoX1RISVMpCit7CisgICAgR1JfV01fUFJPUEVSVElFUyBwcm9wcyA7CisKKyAgICBEcHJpbnRmICgiZW50ZXIgY3JlYXRlX2F1eF93aW5kb3dzXG4iKSA7CisKKyAgICAvLyBEb24ndCBjcmVhdGUgYW55IGV4dHJhIHdpbmRvd3MgaWYgd2UgYXJlIGJlaW5nIG1hbmFnZWQKKyAgICBpZiAoU0RMX3dpbmRvd2lkKSB7CisgICAgICAgIEZTd2luZG93ID0gMCA7CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIAorICAgIGlmIChGU3dpbmRvdyAmJiBGU3dpbmRvdyAhPSBHUl9ST09UX1dJTkRPV19JRCkgeworICAgICAgICBHckRlc3Ryb3lXaW5kb3cgKEZTd2luZG93KSA7CisgICAgfQorICAgIAorICAgIEZTd2luZG93ID0gR3JOZXdXaW5kb3cgKEdSX1JPT1RfV0lORE9XX0lELCAwLCAwLCAxLCAxLCAwLCBCTEFDSywgQkxBQ0spIDsKKyAgICBwcm9wcy5mbGFncyA9IEdSX1dNX0ZMQUdTX1BST1BTIDsKKyAgICBwcm9wcy5wcm9wcyA9IEdSX1dNX1BST1BTX05PREVDT1JBVEUgOworICAgIEdyU2V0V01Qcm9wZXJ0aWVzIChGU3dpbmRvdywgJiBwcm9wcykgOworCisgICAgR3JTZWxlY3RFdmVudHMgKEZTd2luZG93LCAoR1JfRVZFTlRfTUFTS19FWFBPU1VSRSAgICAgICAgIHwKKyAgICAgICAgR1JfRVZFTlRfTUFTS19CVVRUT05fRE9XTiAgfCBHUl9FVkVOVF9NQVNLX0JVVFRPTl9VUCAgfAorICAgICAgICBHUl9FVkVOVF9NQVNLX0ZPQ1VTX0lOICAgICB8IEdSX0VWRU5UX01BU0tfRk9DVVNfT1VUICB8CisgICAgICAgIEdSX0VWRU5UX01BU0tfS0VZX0RPV04gICAgIHwgR1JfRVZFTlRfTUFTS19LRVlfVVAgICAgIHwKKyAgICAgICAgR1JfRVZFTlRfTUFTS19NT1VTRV9FTlRFUiAgfCBHUl9FVkVOVF9NQVNLX01PVVNFX0VYSVQgfAorICAgICAgICBHUl9FVkVOVF9NQVNLX01PVVNFX01PVElPTiB8IEdSX0VWRU5UX01BU0tfVVBEQVRFICAgICB8CisgICAgICAgIEdSX0VWRU5UX01BU0tfQ0xPU0VfUkVRKSkgOworCisgICAgRHByaW50ZiAoImxlYXZlIGNyZWF0ZV9hdXhfd2luZG93c1xuIikgOworfQorCitpbnQgTlhfVmlkZW9Jbml0IChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICogdmZvcm1hdCkKK3sKKyAgICBHUl9TQ1JFRU5fSU5GTyBzaSA7CisKKyAgICBEcHJpbnRmICgiZW50ZXIgTlhfVmlkZW9Jbml0XG4iKSA7CisgICAgCisgICAgaWYgKEdyT3BlbiAoKSA8IDApIHsKKyAgICAgICAgU0RMX1NldEVycm9yICgiR3JPcGVuKCkgZmFpbCIpIDsKKyAgICAgICAgcmV0dXJuIC0xIDsKKyAgICB9CisKKyAgICAvLyB1c2Ugc2hhcmUgbWVtb3J5IHRvIHNwZWVkIHVwCisjaWZkZWYgTkFOT1hfU0hBUkVfTUVNT1JZCisgICAgR3JSZXFTaG1DbWRzICgweEZGRkYpOworI2VuZGlmCisKKyAgICBTRExfV2luZG93ID0gMCA7CisgICAgRlN3aW5kb3cgPSAwIDsKKworICAgIEdhbW1hUmFtcF9SID0gTlVMTCA7CisgICAgR2FtbWFSYW1wX0cgPSBOVUxMIDsKKyAgICBHYW1tYVJhbXBfQiA9IE5VTEwgOyAgICAKKworICAgIEdyR2V0U2NyZWVuSW5mbyAoJiBzaSkgOworICAgIFNETF9WaXN1YWwuYnBwID0gc2kuYnBwIDsKKworICAgIC8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLworICAgIHRoaXMtPmluZm8uY3VycmVudF93ID0gc2kuY29scyA7CisgICAgdGhpcy0+aW5mby5jdXJyZW50X2ggPSBzaS5yb3dzIDsKKworICAgIC8vIEdldFZpZGVvTW9kZQorICAgIFNETF9tb2RlbGlzdCA9IChTRExfUmVjdCAqKikgU0RMX21hbGxvYyAoc2l6ZW9mIChTRExfUmVjdCAqKSAqIDIpIDsKKyAgICBpZiAoU0RMX21vZGVsaXN0KSB7CisgICAgICAgIFNETF9tb2RlbGlzdCBbMF0gPSAoU0RMX1JlY3QgKikgU0RMX21hbGxvYyAoc2l6ZW9mKFNETF9SZWN0KSkgOworICAgICAgICBpZiAoU0RMX21vZGVsaXN0IFswXSkgeworICAgICAgICAgICAgU0RMX21vZGVsaXN0IFswXSAtPiB4ID0gMCA7CisgICAgICAgICAgICBTRExfbW9kZWxpc3QgWzBdIC0+IHkgPSAwIDsKKyAgICAgICAgICAgIFNETF9tb2RlbGlzdCBbMF0gLT4gdyA9IHNpLmNvbHMgOworICAgICAgICAgICAgU0RMX21vZGVsaXN0IFswXSAtPiBoID0gc2kucm93cyA7CisgICAgICAgIH0KKyAgICAgICAgU0RMX21vZGVsaXN0IFsxXSA9IE5VTEwgOworICAgIH0KKworICAgIHBpeGVsX3R5cGUgPSBzaS5waXh0eXBlOworICAgIFNETF9WaXN1YWwucmVkX21hc2sgPSBzaS5ybWFzazsKKyAgICBTRExfVmlzdWFsLmdyZWVuX21hc2sgPSBzaS5nbWFzazsKKyAgICBTRExfVmlzdWFsLmJsdWVfbWFzayA9IHNpLmJtYXNrOworCisgICAgdmZvcm1hdCAtPiBCaXRzUGVyUGl4ZWwgPSBTRExfVmlzdWFsLmJwcCA7CisgICAgaWYgKHZmb3JtYXQgLT4gQml0c1BlclBpeGVsID4gOCkgeworICAgICAgICB2Zm9ybWF0IC0+IFJtYXNrID0gU0RMX1Zpc3VhbC5yZWRfbWFzayA7CisgICAgICAgIHZmb3JtYXQgLT4gR21hc2sgPSBTRExfVmlzdWFsLmdyZWVuX21hc2sgOworICAgICAgICB2Zm9ybWF0IC0+IEJtYXNrID0gU0RMX1Zpc3VhbC5ibHVlX21hc2sgOworICAgIH0KKworICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGJlZW4gcGFzc2VkIGEgd2luZG93IHRvIHVzZQorICAgIFNETF93aW5kb3dpZCA9IGdldGVudiAoIlNETF9XSU5ET1dJRCIpIDsKKyAgICAKKyAgICAvLyBDcmVhdGUgdGhlIGZ1bGxzY3JlZW4gKGFuZCBtYW5hZ2VkIHdpbmRvd3MgOiBubyBpbXBsZW1lbnQpCisgICAgY3JlYXRlX2F1eF93aW5kb3dzICh0aGlzKSA7CisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfVmlkZW9Jbml0XG4iKSA7CisgICAgcmV0dXJuIDAgOworfQorCit2b2lkIE5YX1ZpZGVvUXVpdCAoX1RISVMpCit7CisgICAgRHByaW50ZiAoImVudGVyIE5YX1ZpZGVvUXVpdFxuIikgOworCisgICAgLy8gU3RhcnQgc2h1dHRpbmcgZG93biB0aGUgd2luZG93cworICAgIE5YX0Rlc3Ryb3lJbWFnZSAodGhpcywgdGhpcyAtPiBzY3JlZW4pIDsKKyAgICBOWF9EZXN0cm95V2luZG93ICh0aGlzLCB0aGlzIC0+IHNjcmVlbikgOworICAgIGlmIChGU3dpbmRvdyAmJiBGU3dpbmRvdyAhPSBHUl9ST09UX1dJTkRPV19JRCkgeworICAgICAgICBHckRlc3Ryb3lXaW5kb3cgKEZTd2luZG93KSA7CisgICAgfQorICAgIE5YX0ZyZWVWaWRlb01vZGVzICh0aGlzKSA7CisgICAgU0RMX2ZyZWUgKEdhbW1hUmFtcF9SKSA7CisgICAgU0RMX2ZyZWUgKEdhbW1hUmFtcF9HKSA7CisgICAgU0RMX2ZyZWUgKEdhbW1hUmFtcF9CKSA7CisKKyNpZmRlZiBFTkFCTEVfTkFOT1hfRElSRUNUX0ZCCisgICAgaWYgKENsaWVudGZiKQorICAgICAgICBHckNsb3NlQ2xpZW50RnJhbWVidWZmZXIoKTsKKyNlbmRpZgorICAgIEdyQ2xvc2UgKCkgOworCisgICAgRHByaW50ZiAoImxlYXZlIE5YX1ZpZGVvUXVpdFxuIikgOworfQorCitzdGF0aWMgdm9pZCBOWF9EZXN0cm95V2luZG93IChfVEhJUywgU0RMX1N1cmZhY2UgKiBzY3JlZW4pCit7CisgICAgRHByaW50ZiAoImVudGVyIE5YX0Rlc3Ryb3lXaW5kb3dcbiIpIDsKKworICAgIGlmICghIFNETF93aW5kb3dpZCkgeworICAgICAgICBpZiAoc2NyZWVuICYmIChzY3JlZW4gLT4gZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikpIHsKKyAgICAgICAgICAgIHNjcmVlbiAtPiBmbGFncyAmPSB+IFNETF9GVUxMU0NSRUVOIDsKKyAgICAgICAgICAgIE5YX0xlYXZlRnVsbFNjcmVlbiAodGhpcykgOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgb3V0cHV0IHdpbmRvdworICAgICAgICBpZiAoU0RMX1dpbmRvdyAmJiBTRExfV2luZG93ICE9IEdSX1JPT1RfV0lORE9XX0lEKSB7CisgICAgICAgICAgICBHckRlc3Ryb3lXaW5kb3cgKFNETF9XaW5kb3cpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBGcmVlIHRoZSBncmFwaGljcyBjb250ZXh0CisgICAgaWYgKCEgU0RMX0dDKSB7CisgICAgICAgIEdyRGVzdHJveUdDIChTRExfR0MpIDsKKyAgICAgICAgU0RMX0dDID0gMDsKKyAgICB9CisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfRGVzdHJveVdpbmRvd1xuIikgOworfQorCitzdGF0aWMgaW50IE5YX0NyZWF0ZVdpbmRvdyAoX1RISVMsIFNETF9TdXJmYWNlICogc2NyZWVuLAorICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworICAgIERwcmludGYgKCJlbnRlciBOWF9DcmVhdGVXaW5kb3dcbiIpIDsKKworICAgIC8vIElmIGEgd2luZG93IGlzIGFscmVhZHkgcHJlc2VudCwgZGVzdHJveSBpdCBhbmQgc3RhcnQgZnJlc2gKKyAgICBpZiAoU0RMX1dpbmRvdyAmJiBTRExfV2luZG93ICE9IEdSX1JPT1RfV0lORE9XX0lEKSB7CisgICAgICAgIE5YX0Rlc3Ryb3lXaW5kb3cgKHRoaXMsIHNjcmVlbikgOworICAgIH0KKworICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYSB3aW5kb3cgaWQKKyAgICBpZiAoU0RMX3dpbmRvd2lkKSB7CisgICAgICAgIFNETF9XaW5kb3cgPSBTRExfc3RydG9sIChTRExfd2luZG93aWQsIE5VTEwsIDApIDsKKyAgICB9IGVsc2UgeworICAgICAgICBTRExfV2luZG93ID0gMCA7CisgICAgfQorICAgIAorICAgIGlmICggISBTRExfUmVhbGxvY0Zvcm1hdCAoc2NyZWVuLCBicHAsIFNETF9WaXN1YWwucmVkX21hc2ssIAorICAgICAgICBTRExfVmlzdWFsLmdyZWVuX21hc2ssIFNETF9WaXN1YWwuYmx1ZV9tYXNrLCAwKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gQ3JlYXRlIChvciB1c2UpIHRoZSBuYW5veCBkaXNwbGF5IHdpbmRvdworICAgIGlmICghIFNETF93aW5kb3dpZCkgeworCisgICAgICAgIFNETF9XaW5kb3cgPSBHck5ld1dpbmRvdyAoR1JfUk9PVF9XSU5ET1dfSUQsIDAsIDAsIHcsIGgsIDAsIEJMQUNLLCBXSElURSkgOworCisgICAgICAgIEdyU2VsZWN0RXZlbnRzIChTRExfV2luZG93LCAoR1JfRVZFTlRfTUFTS19FWFBPU1VSRSAgICAgICB8CisgICAgICAgICAgICBHUl9FVkVOVF9NQVNLX0JVVFRPTl9ET1dOICB8IEdSX0VWRU5UX01BU0tfQlVUVE9OX1VQICB8CisgICAgICAgICAgICBHUl9FVkVOVF9NQVNLX0ZPQ1VTX0lOICAgICB8IEdSX0VWRU5UX01BU0tfRk9DVVNfT1VUICB8CisgICAgICAgICAgICBHUl9FVkVOVF9NQVNLX0tFWV9ET1dOICAgICB8IEdSX0VWRU5UX01BU0tfS0VZX1VQICAgICB8CisgICAgICAgICAgICBHUl9FVkVOVF9NQVNLX01PVVNFX0VOVEVSICB8IEdSX0VWRU5UX01BU0tfTU9VU0VfRVhJVCB8CisgICAgICAgICAgICBHUl9FVkVOVF9NQVNLX01PVVNFX01PVElPTiB8IEdSX0VWRU5UX01BU0tfVVBEQVRFICAgICB8CisgICAgICAgICAgICBHUl9FVkVOVF9NQVNLX0NMT1NFX1JFUSkpIDsKKyAgICB9CisgICAgCisgICAgLyogQ3JlYXRlIHRoZSBncmFwaGljcyBjb250ZXh0IGhlcmUsIG9uY2Ugd2UgaGF2ZSBhIHdpbmRvdyAqLworICAgIFNETF9HQyA9IEdyTmV3R0MgKCkgOworICAgIGlmIChTRExfR0MgPT0gMCkgeworICAgICAgICBTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBncmFwaGljcyBjb250ZXh0Iik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLy8gTWFwIHRoZW0gYm90aCBhbmQgZ28gZnVsbHNjcmVlbiwgaWYgcmVxdWVzdGVkCisgICAgaWYgKCEgU0RMX3dpbmRvd2lkKSB7CisgICAgICAgIEdyTWFwV2luZG93IChTRExfV2luZG93KSA7CisgICAgICAgIGlmIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSB7CisgICAgICAgICAgICBzY3JlZW4gLT4gZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU4gOworICAgICAgICAgICAgTlhfRW50ZXJGdWxsU2NyZWVuICh0aGlzKSA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzY3JlZW4gLT4gZmxhZ3MgJj0gfiBTRExfRlVMTFNDUkVFTiA7CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBFTkFCTEVfTkFOT1hfRElSRUNUX0ZCCisgICAgLyogYXR0ZW1wdCBhbGxvY2F0aW5nIHRoZSBjbGllbnQgc2lkZSBmcmFtZWJ1ZmZlciAqLworICAgIENsaWVudGZiID0gR3JPcGVuQ2xpZW50RnJhbWVidWZmZXIoKTsKKyAgICAvKiBOVUxMIHJldHVybiB3aWxsIGRlZmF1bHQgdG8gdXNpbmcgR3JBcmVhKCkqLworI2VuZGlmCisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfQ3JlYXRlV2luZG93XG4iKSA7CisgICAgcmV0dXJuIDAgOworfQorCitTRExfU3VyZmFjZSAqIE5YX1NldFZpZGVvTW9kZSAoX1RISVMsIFNETF9TdXJmYWNlICogY3VycmVudCwKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKyAgICBEcHJpbnRmICgiZW50ZXIgTlhfU2V0VmlkZW9Nb2RlXG4iKSA7CisKKyAgICAvLyBMb2NrIHRoZSBldmVudCB0aHJlYWQsIGluIG11bHRpLXRocmVhZGluZyBlbnZpcm9ubWVudHMKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCAoKSA7CisKKyAgICBicHAgPSBTRExfVmlzdWFsLmJwcCA7CisgICAgaWYgKE5YX0NyZWF0ZVdpbmRvdyAodGhpcywgY3VycmVudCwgd2lkdGgsIGhlaWdodCwgYnBwLCBmbGFncykgPCAwKSB7CisgICAgICAgIGN1cnJlbnQgPSBOVUxMOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnQgLT4gdyAhPSB3aWR0aCB8fCBjdXJyZW50IC0+IGggIT0gaGVpZ2h0KSB7CisgICAgICAgIGN1cnJlbnQgLT4gdyA9IHdpZHRoIDsKKyAgICAgICAgY3VycmVudCAtPiBoID0gaGVpZ2h0IDsKKyAgICAgICAgY3VycmVudCAtPiBwaXRjaCA9IFNETF9DYWxjdWxhdGVQaXRjaCAoY3VycmVudCkgOworICAgICAgICBOWF9SZXNpemVJbWFnZSAodGhpcywgY3VycmVudCwgZmxhZ3MpIDsKKyAgICB9CisKKyAgICAvKiBDbGVhciB0aGVzZSBmbGFncyBhbmQgc2V0IHRoZW0gb25seSBpZiB0aGV5IGFyZSBpbiB0aGUgbmV3IHNldC4gKi8KKyAgICBjdXJyZW50IC0+IGZsYWdzICY9IH4oU0RMX1JFU0laQUJMRXxTRExfTk9GUkFNRSk7CisgICAgY3VycmVudCAtPiBmbGFncyB8PSAoZmxhZ3MgJiAoU0RMX1JFU0laQUJMRSB8IFNETF9OT0ZSQU1FKSkgOworCisgIGRvbmU6CisgICAgU0RMX1VubG9ja19FdmVudFRocmVhZCAoKSA7CisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfU2V0VmlkZW9Nb2RlXG4iKSA7CisKKyAgICAvLyBXZSdyZSBkb25lIQorICAgIHJldHVybiBjdXJyZW50IDsKK30KKworLy8gbmNvbG9ycyA8PSAyNTYKK2ludCBOWF9TZXRDb2xvcnMgKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqIGNvbG9ycykKK3sKKyAgICBpbnQgICAgICAgIGkgOworICAgIEdSX1BBTEVUVEUgcGFsIDsKKworICAgIERwcmludGYgKCJlbnRlciBOWF9TZXRDb2xvcnNcbiIpIDsKKworICAgIGlmIChuY29sb3JzID4gMjU2KSByZXR1cm4gMCA7CisgICAgCisgICAgcGFsLmNvdW50ID0gbmNvbG9ycyA7CisgICAgZm9yIChpID0gMDsgaSA8IG5jb2xvcnM7ICsrIGkpIHsKKyAgICAgICAgcGFsLnBhbGV0dGUgW2ldLnIgPSBjb2xvcnMgW2ldLnIgOworICAgICAgICBwYWwucGFsZXR0ZSBbaV0uZyA9IGNvbG9ycyBbaV0uZyA7CisgICAgICAgIHBhbC5wYWxldHRlIFtpXS5iID0gY29sb3JzIFtpXS5iIDsKKyAgICB9CisgICAgR3JTZXRTeXN0ZW1QYWxldHRlIChmaXJzdGNvbG9yLCAmIHBhbCkgOworCisgICAgRHByaW50ZiAoImxlYXZlIE5YX1NldENvbG9yc1xuIikgOworICAgIHJldHVybiAxIDsKK30KKworc3RhdGljIGludCBOWF9Ub2dnbGVGdWxsU2NyZWVuIChfVEhJUywgaW50IG9uKQoreworICAgIFNETF9SZWN0IHJlY3QgOworICAgIFVpbnQzMiAgIGV2ZW50X3RocmVhZCA7CisgICAgCisgICAgRHByaW50ZiAoImVudGVyIE5YX1RvZ2dsZUZ1bGxTY3JlZW5cbiIpIDsKKworICAgIC8vIERvbid0IHN3aXRjaCBpZiB3ZSBkb24ndCBvd24gdGhlIHdpbmRvdworICAgIGlmIChTRExfd2luZG93aWQpIHJldHVybiAwIDsKKyAgICAKKyAgICAvLyBEb24ndCBsb2NrIGlmIHdlIGFyZSB0aGUgZXZlbnQgdGhyZWFkCisgICAgZXZlbnRfdGhyZWFkID0gU0RMX0V2ZW50VGhyZWFkSUQgKCkgOworICAgIGlmIChldmVudF90aHJlYWQgJiYgKFNETF9UaHJlYWRJRCAoKSA9PSBldmVudF90aHJlYWQpKSB7CisgICAgICAgIGV2ZW50X3RocmVhZCA9IDAgOworICAgIH0KKyAgICBpZiAoZXZlbnRfdGhyZWFkKSB7CisgICAgICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCkgOworICAgIH0KKyAgICAKKyAgICBpZiAob24pIHsKKyAgICAgICAgTlhfRW50ZXJGdWxsU2NyZWVuICh0aGlzKSA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcyAtPiBzY3JlZW4gLT4gZmxhZ3MgJj0gfiBTRExfRlVMTFNDUkVFTiA7CisgICAgICAgIE5YX0xlYXZlRnVsbFNjcmVlbiAodGhpcykgOworICAgIH0KKworICAgIHJlY3QueCA9IHJlY3QueSA9IDAgOworICAgIHJlY3QudyA9IHRoaXMgLT4gc2NyZWVuIC0+IHcsIHJlY3QuaCA9IHRoaXMgLT4gc2NyZWVuIC0+IGggOworICAgIE5YX05vcm1hbFVwZGF0ZSAodGhpcywgMSwgJiByZWN0KSA7CisKKyAgICBpZiAoZXZlbnRfdGhyZWFkKSB7CisgICAgICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQgKCkgOworICAgIH0KKyAgICAKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfVG9nZ2xlRnVsbFNjcmVlblxuIikgOworICAgIHJldHVybiAxIDsKK30KKworLy8gVXBkYXRlIHRoZSBjdXJyZW50IG1vdXNlIHN0YXRlIGFuZCBwb3NpdGlvbgorc3RhdGljIHZvaWQgTlhfVXBkYXRlTW91c2UgKF9USElTKQoreworICAgIGludCAgICAgICAgICAgIHgsIHkgOworICAgIEdSX1dJTkRPV19JTkZPIGluZm8gOworICAgIEdSX1NDUkVFTl9JTkZPIHNpIDsKKworCisgICAgRHByaW50ZiAoImVudGVyIE5YX1VwZGF0ZU1vdXNlXG4iKSA7CisKKyAgICAvLyBMb2NrIHRoZSBldmVudCB0aHJlYWQsIGluIG11bHRpLXRocmVhZGluZyBlbnZpcm9ubWVudHMKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCAoKSA7CisgICAgCisgICAgR3JHZXRTY3JlZW5JbmZvICgmIHNpKSA7CisgICAgR3JHZXRXaW5kb3dJbmZvIChTRExfV2luZG93LCAmIGluZm8pIDsKKyAgICB4ID0gc2kueHBvcyAtIGluZm8ueCA7CisgICAgeSA9IHNpLnlwb3MgLSBpbmZvLnkgOworICAgIGlmICh4ID49IDAgJiYgeCA8PSBpbmZvLndpZHRoICYmIHkgPj0gMCAmJiB5IDw9IGluZm8uaGVpZ2h0KSB7CisgICAgICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlICgxLCBTRExfQVBQTU9VU0VGT0NVUykgOworICAgICAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uICgwLCAwLCB4LCB5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMCwgU0RMX0FQUE1PVVNFRk9DVVMpIDsKKyAgICB9CisKKyAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkICgpIDsKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfVXBkYXRlTW91c2VcbiIpIDsKK30KKworc3RhdGljIGludCBOWF9TZXRHYW1tYVJhbXAgKF9USElTLCBVaW50MTYgKiByYW1wKQoreworICAgIGludCBpIDsKKyAgICBVaW50MTYgKiByZWQsICogZ3JlZW4sICogYmx1ZSA7CisgICAgCisgICAgRHByaW50ZiAoImVudGVyIE5YX1NldEdhbW1hUmFtcFxuIikgOworICAgIAorICAgIGlmIChTRExfVmlzdWFsLmJwcCAhPSAzMiAmJiBTRExfVmlzdWFsLmJwcCAhPSAyNCkgcmV0dXJuIC0xIDsKKworICAgIGlmICghIEdhbW1hUmFtcF9SKSBHYW1tYVJhbXBfUiA9IChVaW50MTYgKikgU0RMX21hbGxvYyAoc2l6ZW9mIChVaW50MTYpICogQ0lfU0laRSkgOworICAgIGlmICghIEdhbW1hUmFtcF9HKSBHYW1tYVJhbXBfRyA9IChVaW50MTYgKikgU0RMX21hbGxvYyAoc2l6ZW9mIChVaW50MTYpICogQ0lfU0laRSkgOworICAgIGlmICghIEdhbW1hUmFtcF9CKSBHYW1tYVJhbXBfQiA9IChVaW50MTYgKikgU0RMX21hbGxvYyAoc2l6ZW9mIChVaW50MTYpICogQ0lfU0laRSkgOworICAgIGlmICgoISBHYW1tYVJhbXBfUikgfHwgKCEgR2FtbWFSYW1wX0cpIHx8ICghIEdhbW1hUmFtcF9CKSkgeworICAgICAgICBTRExfT3V0T2ZNZW1vcnkgKCkgOworICAgICAgICByZXR1cm4gLTEgOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBDSV9TSVpFOyArKyBpKQorICAgICAgICBHYW1tYVJhbXBfUiBbaV0gPSBHYW1tYVJhbXBfRyBbaV0gPSBHYW1tYVJhbXBfQiBbaV0gPSBpIDsKKworICAgIHJlZCAgID0gcmFtcCA7CisgICAgZ3JlZW4gPSByYW1wICsgQ0lfU0laRSA7CisgICAgYmx1ZSAgPSBncmVlbiArIENJX1NJWkUgOworICAgICAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0lfU0laRTsgKysgaSkgeworICAgICAgICBHYW1tYVJhbXBfUiBbaV0gPSByZWQgICBbaV0gOworICAgICAgICBHYW1tYVJhbXBfRyBbaV0gPSBncmVlbiBbaV0gOworICAgICAgICBHYW1tYVJhbXBfQiBbaV0gPSBibHVlICBbaV0gOworICAgIH0KKyAgICBTRExfVXBkYXRlUmVjdCh0aGlzLT5zY3JlZW4sIDAsIDAsIDAsIDApOworCisgICAgRHByaW50ZiAoImxlYXZlIE5YX1NldEdhbW1hUmFtcFxuIikgOyAgIAorICAgIHJldHVybiAwIDsKK30KKworc3RhdGljIGludCBOWF9HZXRHYW1tYVJhbXAgKF9USElTLCBVaW50MTYgKiByYW1wKQoreworICAgIGludCBpIDsKKyAgICBVaW50MTYgKiByZWQsICogZ3JlZW4sICogYmx1ZSA7CisKKyAgICBEcHJpbnRmICgiZW50ZXIgTlhfR2V0R2FtbWFSYW1wXG4iKSA7ICAgCisKKyAgICBpZiAoU0RMX1Zpc3VhbC5icHAgIT0gMzIgJiYgU0RMX1Zpc3VhbC5icHAgIT0gMjQpIHJldHVybiAtMSA7CisgICAgcmVkICAgPSByYW1wIDsKKyAgICBncmVlbiA9IHJhbXAgICsgQ0lfU0laRSA7CisgICAgYmx1ZSAgPSBncmVlbiArIENJX1NJWkUgOworICAgIGlmIChHYW1tYVJhbXBfUiAmJiBHYW1tYVJhbXBfRyAmJiBHYW1tYVJhbXBfQikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQ0lfU0laRTsgKysgaSkgeworICAgICAgICAgICAgcmVkICAgW2ldID0gR2FtbWFSYW1wX1IgW2ldIDsKKyAgICAgICAgICAgIGdyZWVuIFtpXSA9IEdhbW1hUmFtcF9HIFtpXSA7CisgICAgICAgICAgICBibHVlICBbaV0gPSBHYW1tYVJhbXBfQiBbaV0gOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENJX1NJWkU7ICsrIGkpCisgICAgICAgICAgICByZWQgW2ldID0gZ3JlZW4gW2ldID0gYmx1ZSBbaV0gPSBpIDsKKyAgICB9CisKKyAgICBEcHJpbnRmICgibGVhdmUgTlhfR2V0R2FtbWFSYW1wXG4iKSA7CisgICAgcmV0dXJuIDAgOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnh2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnh2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODU4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25hbm94L1NETF9ueHZpZGVvLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEhzaWVoLUZ1IFRzYWkKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworICAgIAorICAgIEhzaWVoLUZ1IFRzYWkKKyAgICBjbGFyZUBzZXRhYm94LmNvbQorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9ueHZpZGVvX2gKKyNkZWZpbmUgX1NETF9ueHZpZGVvX2gKKworI2luY2x1ZGUgPG1pY3Jvd2luL25hbm8tWC5oPgorCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisKKyNpZmRlZiBFTkFCTEVfTkFOT1hfREVCVUcKKyNkZWZpbmUgRHByaW50ZiBwcmludGYKKyNlbHNlCisjZGVmaW5lIERwcmludGYoaWdub3JlLi4uKQorI2VuZGlmCisKKy8vIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucworI2RlZmluZSBfVEhJUyAgIFNETF9WaWRlb0RldmljZSAqIHRoaXMKKworLy8gUHJpdmF0ZSBkaXNwbGF5IGRhdGEKK3R5cGVkZWYgc3RydWN0IE5YX1NETF9WSVNVQUwgeworICAgIGludCAgICBicHAgOworICAgIFVpbnQzMiByZWRfbWFzayA7CisgICAgVWludDMyIGdyZWVuX21hc2sgOworICAgIFVpbnQzMiBibHVlX21hc2sgOworfSBueF9zZGxfdmlzdWFsX3QgOworCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgeworICAgIEdSX1dJTkRPV19JRCAgICBTRExfV2luZG93IDsKKyAgICBHUl9XSU5ET1dfSUQgICAgRlN3aW5kb3cgOworICAgIC8vIEZsYWc6IHRydWUgaWYgd2UgaGF2ZSBiZWVuIHBhc3NlZCBhIHdpbmRvdworICAgIGNoYXIgICAgICAgICAgICAqIFNETF93aW5kb3dpZCA7CisgICAgR1JfR0NfSUQgICAgICAgIEdDIDsKKyAgICB1bnNpZ25lZCBjaGFyICAgKiBJbWFnZSA7CisgICAgdW5zaWduZWQgY2hhciAgICogSW1hZ2VfYnVmZiA7CS8qIGZvciBHckFyZWEqLworICAgIHVuc2lnbmVkIGNoYXIgICAqIENsaWVudGZiOwkJLyogZm9yIERpcmVjdEZCKi8KKyAgICBueF9zZGxfdmlzdWFsX3QgU0RMX1Zpc3VhbCA7CisgICAgLy8gVGhlIGN1cnJlbnQgbGlzdCBvZiBhdmFpbGFibGUgdmlkZW8gbW9kZXMKKyAgICBTRExfUmVjdCAgICAgICAgKiogbW9kZWxpc3QgOworICAgIGludCAgICAgICAgICAgICBjdXJyZW50bHlfZnVsbHNjcmVlbiA7CisgICAgLy8gZm9yIGZ1bGxzY3JlZW4KKyAgICBpbnQgICAgICAgICAgICAgT2Zmc2V0WCwgT2Zmc2V0WSA7CisgICAgLy8gZm9yIEdhbW1hUmFtcAorICAgIFVpbnQxNiAgICAgICAgICAqIEdhbW1hUmFtcF9SLCAqIEdhbW1hUmFtcF9HLCAqIEdhbW1hUmFtcF9CIDsKKyAgICAvLyBmb3IgR3JBcmVhLCByX21hc2ssIGdfbWFzaywgYl9tYXNrCisgICAgaW50ICAgICAgICAgICAgIHBpeGVsX3R5cGUgOworI2lmZGVmIEVOQUJMRV9OQU5PWF9ESVJFQ1RfRkIKKyAgICBHUl9XSU5ET1dfRkJfSU5GTyBmYmluZm87CisjZW5kaWYKK30gOworCisjZGVmaW5lIFNETF9XaW5kb3cgICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBTRExfV2luZG93KQorI2RlZmluZSBGU3dpbmRvdyAgICAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gRlN3aW5kb3cpCisjZGVmaW5lIFNETF93aW5kb3dpZCAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBTRExfd2luZG93aWQpCisjZGVmaW5lIFNETF9HQyAgICAgICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBHQykKKyNkZWZpbmUgU0RMX0ltYWdlICAgICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IEltYWdlKQorI2RlZmluZSBJbWFnZV9idWZmICAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gSW1hZ2VfYnVmZikKKyNkZWZpbmUgQ2xpZW50ZmIgICAgICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IENsaWVudGZiKQorI2RlZmluZSBTRExfVmlzdWFsICAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gU0RMX1Zpc3VhbCkKKyNkZWZpbmUgU0RMX21vZGVsaXN0ICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IG1vZGVsaXN0KQorI2RlZmluZSBjdXJyZW50bHlfZnVsbHNjcmVlbiAodGhpcyAtPiBoaWRkZW4gLT4gY3VycmVudGx5X2Z1bGxzY3JlZW4pCisjZGVmaW5lIE9mZnNldFggICAgICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBPZmZzZXRYKQorI2RlZmluZSBPZmZzZXRZICAgICAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gT2Zmc2V0WSkKKyNkZWZpbmUgR2FtbWFSYW1wX1IgICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IEdhbW1hUmFtcF9SKQorI2RlZmluZSBHYW1tYVJhbXBfRyAgICAgICAgICAodGhpcyAtPiBoaWRkZW4gLT4gR2FtbWFSYW1wX0cpCisjZGVmaW5lIEdhbW1hUmFtcF9CICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBHYW1tYVJhbXBfQikKKyNkZWZpbmUgcGl4ZWxfdHlwZSAgICAgICAgICAgKHRoaXMgLT4gaGlkZGVuIC0+IHBpeGVsX3R5cGUpCisjZGVmaW5lIGZiaW5mbyAgICAgICAgICAgICAgICh0aGlzIC0+IGhpZGRlbiAtPiBmYmluZm8pCisKKyNkZWZpbmUgQ0lfU0laRSAyNTYgICAvLyBjb2xvciBpbmRleCBzaXplCisKKyNlbmRpZiAgLy8gX1NETF9ueHZpZGVvX2gKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254d20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254d20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjBlYmIwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnh3bS5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisgICAgQ29weXJpZ2h0IChDKSAyMDAxICBIc2llaC1GdSBUc2FpCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyAgICAKKyAgICBIc2llaC1GdSBUc2FpCisgICAgY2xhcmVAc2V0YWJveC5jb20KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3N5c3dtLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX254d21fYy5oIgorCit2b2lkIE5YX1NldENhcHRpb24gKF9USElTLCBjb25zdCBjaGFyICogdGl0bGUsIGNvbnN0IGNoYXIgKiBpY29uKQoreworICAgIERwcmludGYgKCJlbnRlciBOWF9TZXRDYXB0aW9uXG4iKSA7CisKKyAgICAvLyBMb2NrIHRoZSBldmVudCB0aHJlYWQsIGluIG11bHRpLXRocmVhZGluZyBlbnZpcm9ubWVudHMKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCAoKSA7CisgICAgCisgICAgaWYgKFNETF9XaW5kb3cpIAorICAgICAgICBHclNldFdpbmRvd1RpdGxlIChTRExfV2luZG93LCB0aXRsZSkgOworICAgIAorICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQgKCkgOworICAgIERwcmludGYgKCJsZWF2ZSBOWF9TZXRDYXB0aW9uXG4iKSA7Cit9CisKK2ludCBOWF9HZXRXTUluZm8gKF9USElTLCBTRExfU3lzV01pbmZvICogaW5mbykKK3sKKyAgICBEcHJpbnRmICgiZW50ZXIgTlhfR2V0V01JbmZvXG4iKSA7CisKKyAgICBpZiAoaW5mbyAtPiB2ZXJzaW9uLm1ham9yIDw9IFNETF9NQUpPUl9WRVJTSU9OKSB7CisgICAgICAgIGluZm8gLT4gd2luZG93ID0gU0RMX1dpbmRvdyA7CisgICAgICAgIHJldHVybiAxIDsKKyAgICB9IGVsc2UgeworICAgICAgICBTRExfU2V0RXJyb3IoIkFwcGxpY2F0aW9uIG5vdCBjb21waWxlZCB3aXRoIFNETCAlZC4lZFxuIiwKKyAgICAgICAgICAgIFNETF9NQUpPUl9WRVJTSU9OLCBTRExfTUlOT1JfVkVSU0lPTikgOworICAgICAgICByZXR1cm4gLTEgOworICAgIH0KKworICAgIERwcmludGYgKCJsZWF2ZSBOWF9HZXRXTUluZm9cbiIpIDsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254d21fYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uYW5veC9TRExfbnh3bV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiZTc5NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmFub3gvU0RMX254d21fYy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisgICAgQ29weXJpZ2h0IChDKSAyMDAxICBIc2llaC1GdSBUc2FpCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyAgICAKKyAgICBIc2llaC1GdSBUc2FpCisgICAgY2xhcmVAc2V0YWJveC5jb20KKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX254dmlkZW8uaCIKKworLy8gRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkCitleHRlcm4gdm9pZCBOWF9TZXRDYXB0aW9uIChfVEhJUywgY29uc3QgY2hhciAqIHRpdGxlLCBjb25zdCBjaGFyICogaWNvbikgOworZXh0ZXJuIGludCBOWF9HZXRXTUluZm8gKF9USElTLCBTRExfU3lzV01pbmZvICogaW5mbykgOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uZHMvU0RMX25kc2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uZHMvU0RMX25kc2V2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjBmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25kcy9TRExfbmRzZXZlbnRzLmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEJlaW5nIGEgbmRzIGRyaXZlciwgdGhlcmUncyBubyBldmVudCBzdHJlYW0uIFdlIGp1c3QgZGVmaW5lIHN0dWJzIGZvcgorICAgbW9zdCBvZiB0aGUgQVBJLiAqLworI2luY2x1ZGUgPG5kcy5oPgorI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9uZHN2aWRlby5oIgorI2luY2x1ZGUgIlNETF9uZHNldmVudHNfYy5oIgorCitzdGF0aWMgU0RMS2V5IGtleW1hcFtORFNfTlVNS0VZU107CitjaGFyIGtleW1lbVtORFNfTlVNS0VZU107CS8qIG1lbW9yaXplIHN0YXRlcyBvZiBidXR0b25zICovCisKK3ZvaWQgTkRTX1B1bXBFdmVudHMoX1RISVMpCit7CisJc2NhbktleXMoKTsKKwlpbnQgaTsKKwlTRExfa2V5c3ltIGtleXN5bTsKKwlrZXlzeW0ubW9kPUtNT0RfTk9ORTsKKwlmb3IoaT0wO2k8TkRTX05VTUtFWVM7aSsrKQorCXsKKwkJa2V5c3ltLnNjYW5jb2RlPWk7CisJCWtleXN5bS5zeW09a2V5bWFwW2ldOworCQlpZihrZXlzSGVsZCgpJigxPDxpKSAmJiAha2V5bWVtW2ldKQorCQl7CisJCQlrZXltZW1baV09MTsKKwkJCS8vcHJpbnRmKCJrZXkgcmVsZWFzZWQgJWRcbiIsaSk7CisJCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgJmtleXN5bSk7CisJCX0KKwkJaWYoIShrZXlzSGVsZCgpJigxPDxpKSkgJiYga2V5bWVtW2ldKQorCQl7CisJCQlrZXltZW1baV09MDsKKwkJCS8vcHJpbnRmKCJrZXkgcHJlc3NlZCAlZFxuIixpKTsKKwkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsICZrZXlzeW0pOworCQl9CisJfQorCS8vdG91Y2hQb3NpdGlvbiB0b3VjaDsKKwkvL3RvdWNoPXRvdWNoUmVhZFhZKCk7CisJLy9pZiAodG91Y2gucHghPTAgfHwgdG91Y2gucHkhPTApCisJLy8JU0RMX1ByaXZhdGVNb3VzZU1vdGlvbihTRExfUFJFU1NFRCwgMCwgdG91Y2gucHgsIHRvdWNoLnB5KTsKK30KKwordm9pZCBORFNfSW5pdE9TS2V5bWFwKF9USElTKQoreworCVNETF9tZW1zZXQoa2V5bWVtLDEsTkRTX05VTUtFWVMpOworCWtleW1hcFtLRVlfQV09U0RMS19hOworCWtleW1hcFtLRVlfQl09U0RMS19zOworCWtleW1hcFtLRVlfWF09U0RMS193OworCWtleW1hcFtLRVlfWV09U0RMS19kOworCWtleW1hcFtLRVlfTF09U0RMS19xOworCWtleW1hcFtLRVlfUl09U0RMS19lOworCWtleW1hcFtLRVlfVVBdPVNETEtfVVA7CisJa2V5bWFwW0tFWV9ET1dOXT1TRExLX0RPV047CisJa2V5bWFwW0tFWV9MRUZUXT1TRExLX0xFRlQ7CisJa2V5bWFwW0tFWV9SSUdIVF09U0RMS19SSUdIVDsKKwlrZXltYXBbS0VZX1NFTEVDVF09U0RMS19TUEFDRTsKKwlrZXltYXBbS0VZX1NUQVJUXT1TRExLX1JFVFVSTjsKK30KKworLyogZW5kIG9mIFNETF9nYmFldmVudHMuYyAuLi4gKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uZHMvU0RMX25kc2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25kcy9TRExfbmRzZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2QwZWYyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uZHMvU0RMX25kc2V2ZW50c19jLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbmRzdmlkZW8uaCIKKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAorICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQorKi8KK2V4dGVybiB2b2lkIE5EU19Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgTkRTX1B1bXBFdmVudHMoX1RISVMpOworCisjZGVmaW5lIE5EU19OVU1LRVlTIDEyCisKKy8qCisjZGVmaW5lIE5EU19KT1lQQURSRUcgMHg0MDAwMTMwCisjZGVmaW5lIE5EU19KT1lQQUQgKCoodm9sYXRpbGUgVWludDE2KilORFNfSk9ZUEFEUkVHKQorCisjZGVmaW5lIE5EU19OVU1LRVlTIDEwCisjZGVmaW5lIE5EU19LRVlBICgwKQorI2RlZmluZSBORFNfS0VZQiAoMSkKKyNkZWZpbmUgTkRTX0tFWVNFTCAoMikKKyNkZWZpbmUgTkRTX0tFWVNUQVJUICgzKQorI2RlZmluZSBORFNfS0VZUklHSFQgKDQpCisjZGVmaW5lIE5EU19LRVlMRUZUICg1KQorI2RlZmluZSBORFNfS0VZVVAgKDYpCisjZGVmaW5lIE5EU19LRVlET1dOICg3KQorI2RlZmluZSBORFNfS0VZUiAoOCkKKyNkZWZpbmUgTkRTX0tFWUwgKDkpCisqLworLyogZW5kIG9mIFNETF9ORFNldmVudHNfYy5oIC4uLiAqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25kcy9TRExfbmRzbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmRzL1NETF9uZHNtb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYTE0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25kcy9TRExfbmRzbW91c2UuYwpAQCAtMCwwICsxLDM0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKworI2luY2x1ZGUgIlNETF9uZHNtb3VzZV9jLmgiCisKKworLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCitzdHJ1Y3QgV01jdXJzb3IgeworCWludCB1bnVzZWQ7Cit9OwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uZHMvU0RMX25kc21vdXNlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmRzL1NETF9uZHNtb3VzZV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhZGYwMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmRzL1NETF9uZHNtb3VzZV9jLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbmRzdmlkZW8uaCIKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25kcy9TRExfbmRzdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmRzL1NETF9uZHN2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZWU4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL25kcy9TRExfbmRzdmlkZW8uYwpAQCAtMCwwICsxLDUwMCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxuZHMuaD4KKyNpbmNsdWRlIDxuZHMvcmVnaXN0ZXJzX2FsdC5oPgorI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKworI2luY2x1ZGUgIlNETF9uZHN2aWRlby5oIgorI2luY2x1ZGUgIlNETF9uZHNldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9uZHNtb3VzZV9jLmgiCisKKyNkZWZpbmUgTkRTVklEX0RSSVZFUl9OQU1FICJuZHMiCisKKy8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBORFNfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOworc3RhdGljIFNETF9SZWN0ICoqTkRTX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgU0RMX1N1cmZhY2UgKk5EU19TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgaW50IE5EU19TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpOworc3RhdGljIHZvaWQgTkRTX1ZpZGVvUXVpdChfVEhJUyk7CisKKy8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IE5EU19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBORFNfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBORFNfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgTkRTX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgTkRTX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKKworLyogZXRjLiAqLworc3RhdGljIHZvaWQgTkRTX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKKy8qIE5EUyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IE5EU19BdmFpbGFibGUodm9pZCkKK3sKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkIE5EU19EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCit7CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCVNETF9mcmVlKGRldmljZSk7Cit9CisKK3ZvaWQgb25faXJxX3ZibGFuaygpIAorewkKKyAgLy8gRGlzYWJsZSBpbnRlcnJ1cHRzCisgIC8vUkVHX0lNRSA9IDA7CisgIHNjYW5LZXlzKCk7CisKKyAgLy8gIFZCTEFOS19JTlRSX1dBSVRfRkxBR1MgfD0gSVJRX1ZCTEFOSzsgCisgIC8vICBSRUdfSUYgfD0gSVJRX1ZCTEFOSzsgCisgIC8vUkVHX0lGID0gUkVHX0lGOworCisgIC8vIEVuYWJsZSBpbnRlcnJ1cHRzCisgIC8vUkVHX0lNRSA9IDE7Cit9CisKK3N0YXRpYyBpbnQgSFdBY2NlbEJsaXQoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCkKKyB7CisJcmV0dXJuIDA7CisgfQorIAorc3RhdGljIGludCBDaGVja0hXQmxpdChfVEhJUywgU0RMX1N1cmZhY2UgKnNyYywgU0RMX1N1cmZhY2UgKmRzdCkKK3sKKyAJaWYgKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpIHJldHVybiBmYWxzZTsKKyAJaWYgKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpIHJldHVybiBmYWxzZTsKKyAJaWYgKHNyYy0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFICkgcmV0dXJuIGZhbHNlOworIAlpZiAoZHN0LT5mbGFncyAmIFNETF9TUkNBTFBIQSkgcmV0dXJuIGZhbHNlOworIAlpZiAoZHN0LT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgcmV0dXJuIGZhbHNlOworIAlpZiAoZHN0LT5mbGFncyAmIFNETF9IV1BBTEVUVEUgKSByZXR1cm4gZmFsc2U7CisKKyAJaWYgKHNyYy0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gZHN0LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCkgcmV0dXJuIGZhbHNlOworIAlpZiAoc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgIT0gZHN0LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpIHJldHVybiBmYWxzZTsKKyAJCQorICAgICAgICBzcmMtPm1hcC0+aHdfYmxpdCA9IEhXQWNjZWxCbGl0OworICAgICAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqTkRTX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U9MDsKKworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7CisJaWYgKCBkZXZpY2UgKSB7CisJCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKKwkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCisJCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCX0KKwlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCBkZXZpY2UgKSB7CisJCQlTRExfZnJlZShkZXZpY2UpOworCQl9CisJCXJldHVybigwKTsKKwl9IAorCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBORFNfVmlkZW9Jbml0OworCWRldmljZS0+TGlzdE1vZGVzID0gTkRTX0xpc3RNb2RlczsKKwlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IE5EU19TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5DcmVhdGVZVVZPdmVybGF5ID0gTlVMTDsKKwlkZXZpY2UtPlNldENvbG9ycyA9IE5EU19TZXRDb2xvcnM7CisJZGV2aWNlLT5VcGRhdGVSZWN0cyA9IE5EU19VcGRhdGVSZWN0czsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IE5EU19WaWRlb1F1aXQ7CisJZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IE5EU19BbGxvY0hXU3VyZmFjZTsKKwlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gQ2hlY2tIV0JsaXQ7CisJZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOworCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7CisJZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gTkRTX0xvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBORFNfVW5sb2NrSFdTdXJmYWNlOworCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IE5EU19GbGlwSFdTdXJmYWNlOworCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IE5EU19GcmVlSFdTdXJmYWNlOworCWRldmljZS0+U2V0Q2FwdGlvbiA9IE5VTEw7CisJZGV2aWNlLT5TZXRJY29uID0gTlVMTDsKKwlkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBOVUxMOworCWRldmljZS0+R3JhYklucHV0ID0gTlVMTDsKKwlkZXZpY2UtPkdldFdNSW5mbyA9IE5VTEw7CisJZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBORFNfSW5pdE9TS2V5bWFwOworCWRldmljZS0+UHVtcEV2ZW50cyA9IE5EU19QdW1wRXZlbnRzOworCWRldmljZS0+aW5mby5ibGl0X2h3PTE7CisKKwlkZXZpY2UtPmZyZWUgPSBORFNfRGVsZXRlRGV2aWNlOworCXJldHVybiBkZXZpY2U7Cit9CisKK1ZpZGVvQm9vdFN0cmFwIE5EU19ib290c3RyYXAgPSB7CisJTkRTVklEX0RSSVZFUl9OQU1FLCAiU0RMIE5EUyB2aWRlbyBkcml2ZXIiLAorCU5EU19BdmFpbGFibGUsIE5EU19DcmVhdGVEZXZpY2UKK307CisKKwl1MTYqIGZyb250QnVmZmVyOy8vID0gKHUxNiopKDB4MDYwMDAwMDApOworCXUxNiogYmFja0J1ZmZlcjsvLyA9ICAodTE2KikoMHgwNjAwMDAwMCArIDI1NiAqIDI1NiAqIDIpOyAKK2ludCBORFNfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisJLy9wcmludGYoIldBUk5JTkc6IFlvdSBhcmUgdXNpbmcgdGhlIFNETCBORFMgdmlkZW8gZHJpdmVyIVxuIik7CisKKwkvKiBEZXRlcm1pbmUgdGhlIHNjcmVlbiBkZXB0aCAodXNlIGRlZmF1bHQgOC1iaXQgZGVwdGgpICovCisJLyogd2UgY2hhbmdlIHRoaXMgZHVyaW5nIHRoZSBTRExfU2V0VmlkZW9Nb2RlIGltcGxlbWVudGF0aW9uLi4uICovCisJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gMTY7CS8vIG1vZGUgMworCXZmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPSAyOworCXZmb3JtYXQtPlJtYXNrID0gMHgwMDAwZjgwMDsKKwl2Zm9ybWF0LT5HbWFzayA9IDB4MDAwMDA3ZTA7CisJdmZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMDFmOyAKKyAgICBwb3dlck9OKFBPV0VSX0FMTCk7CisJaXJxSW5pdCgpOworCWlycVNldChJUlFfVkJMQU5LLCBvbl9pcnFfdmJsYW5rKTsgCisJaXJxRW5hYmxlKElSUV9WQkxBTkspOworCisgICAgLy9zZXQgdGhlIG1vZGUgZm9yIDIgdGV4dCBsYXllcnMgYW5kIHR3byBleHRlbmRlZCBiYWNrZ3JvdW5kIGxheWVycworCS8vdmlkZW9TZXRNb2RlKE1PREVfNV8yRCB8IERJU1BMQVlfQkczX0FDVElWRSk7IAorCXZpZGVvU2V0TW9kZShNT0RFXzZfMkR8IERJU1BMQVlfQkcyX0FDVElWRSk7IAorCQorCS8vc2V0IHRoZSBzdWIgYmFja2dyb3VuZCB1cCBmb3IgdGV4dCBkaXNwbGF5ICh3ZSBjb3VsZCBqdXN0IHByaW50IHRvIG9uZQorCS8vb2YgdGhlIG1haW4gZGlzcGxheSB0ZXh0IGJhY2tncm91bmRzIGp1c3QgYXMgZWFzaWx5CisJdmlkZW9TZXRNb2RlU3ViKE1PREVfMF8yRCB8IERJU1BMQVlfQkcwX0FDVElWRSk7IC8vc3ViIGJnIDAgd2lsbCBiZSB1c2VkIHRvIHByaW50IHRleHQKKwkKKyAgICAvL3NldCB0aGUgZmlyc3QgdHdvIGJhbmtzIGFzIGJhY2tncm91bmQgbWVtb3J5IGFuZCB0aGUgdGhpcmQgYXMgc3ViIGJhY2tncm91bmQgbWVtb3J5CisgICAgLy9EIGlzIG5vdCB1c2VkLi5pZiB5b3UgbmVlZCBhIGJpZ2dlciBiYWNrZ3JvdW5kIHRoZW4geW91IHdpbGwgbmVlZCB0byBtYXAKKyAgICAvL21vcmUgdnJhbSBiYW5rcyBjb25zZWN1dGl2bHkgKFZSQU0gQS1EIGFyZSBhbGwgMHgyMDAwMCBieXRlcyBpbiBzaXplKQorICAgIC8vdnJhbVNldE1haW5CYW5rcyhWUkFNX0FfTUFJTl9CR18weDYwMDAwMDAsIFZSQU1fQl9NQUlOX0JHXzB4NjAyMDAwMCxWUkFNX0NfU1VCX0JHICwgVlJBTV9EX0xDRCk7IAorCXZyYW1TZXRNYWluQmFua3MoVlJBTV9BX01BSU5fQkcsVlJBTV9CX01BSU5fQkcsVlJBTV9DX01BSU5fQkcsVlJBTV9EX01BSU5fQkcpOworCS8vdnJhbVNldEJhbmtBKFZSQU1fQV9NQUlOX0JHKTsKKwkvL3ZyYW1TZXRCYW5rQihWUkFNX0JfTUFJTl9CRyk7CisJLy92cmFtU2V0QmFua0MoVlJBTV9DX01BSU5fQkcpOworCS8vdnJhbVNldEJhbmtEKFZSQU1fRF9NQUlOX0JHKTsKKwkvL3ZyYW1TZXRCYW5rRShWUkFNX0VfTUFJTl9CRyk7CisJLy92cmFtU2V0QmFua0YoVlJBTV9GX01BSU5fQkcpOworCS8vdnJhbVNldEJhbmtHKFZSQU1fR19NQUlOX0JHKTsKKwl2cmFtU2V0QmFua0goVlJBTV9IX1NVQl9CRyk7CisJdnJhbVNldEJhbmtJKFZSQU1fSV9MQ0QpOworICAgIAorCS8vLy8vLy8vLy8vLy8vLy9zZXQgdXAgdGV4dCBiYWNrZ3JvdW5kIGZvciB0ZXh0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgU1VCX0JHMF9DUiA9IEJHX01BUF9CQVNFKDgpOworCQorCUJHX1BBTEVUVEVfU1VCWzI1NV0gPSBSR0IxNSgzMSwzMSwzMSk7Ly9ieSBkZWZhdWx0IGZvbnQgd2lsbCBiZSByZW5kZXJlZCB3aXRoIGNvbG9yIDI1NQorCS8vLy8vLy8vLy8vLy8vL3NldCB1cCBvdXIgYml0bWFwIGJhY2tncm91bmQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLy9CRzNfQ1IgPSBCR19CTVAxNl81MTJ4NTEyOworCQorCS8vdGhlc2UgYXJlIHJvdGF0aW9uIGJhY2tncm91bmRzIHNvIHlvdSBtdXN0IHNldCB0aGUgcm90YXRpb24gYXR0cmlidXRlczoKKyAgICAvL3RoZXNlIGFyZSBmaXhlZCBwb2ludCBudW1iZXJzIHdpdGggdGhlIGxvdyA4IGJpdHMgdGhlIGZyYWN0aW9uYWwgcGFydAorICAgIC8vdGhpcyBiYXNpY2FseSBnaXZlcyBpdCBhIDE6MSB0cmFuc2xhdGlvbiBpbiB4IGFuZCB5IHNvIHlvdSBnZXQgYSBuaWNlIGZsYXQgYml0bWFwCisgICAgICAvKiAgQkczX1hEWCA9IDE8PDg7CisgICAgICAgIEJHM19YRFkgPSAwOyAKKyAgICAgICAgQkczX1lEWCA9IDA7CisgICAgICAgIEJHM19ZRFkgPSAxPDw4OworICAgIC8vb3VyIGJpdG1hcCBsb29rcyBhIGJpdCBiZXR0ZXIgaWYgd2UgY2VudGVyIGl0IHNvIHNjcm9sbCBkb3duICgyNTYgLSAxOTIpIC8gMiAKKyAgICAgICAgQkczX0NYID0gMDsKKyAgICAgICAgQkczX0NZID0gMDsgCQorCQkqLworCS8vY29uc29sZUluaXQoKSBpcyBhIGxvdCBtb3JlIGZsZXhpYmxlIGJ1dCB0aGlzIGdldHMgeW91IHVwIGFuZCBydW5uaW5nIHF1aWNrCisJY29uc29sZUluaXREZWZhdWx0KCh1MTYqKVNDUkVFTl9CQVNFX0JMT0NLX1NVQig4KSwgKHUxNiopQ0hBUl9CQVNFX0JMT0NLX1NVQigwKSwgMTYpOyAKKwkKKworCWZyb250QnVmZmVyID0odTE2KikoMHgwNjAwMDAwMCk7CisJLy9iYWNrQnVmZmVyICA9KHUxNiopKDB4MDYwMDAwMDAgKyAxMDI0ICogNTEyKjIpOyAKKworCS8vbGNkU3dhcCgpOworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKDApOyAKK30KKworU0RMX1JlY3QgKipORFNfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCXJldHVybiAoU0RMX1JlY3QgKiopIC0xOworfQorCitTRExfU3VyZmFjZSAqTkRTX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisJVWludDMyIFJtYXNrLCBHbWFzaywgQm1hc2ssIEFtYXNrOyAKKworCS8vaWYod2lkdGggPiAxMDI0IHx8IGhlaWdodCA+IDUxMiB8fCBicHAgPiAxNikKKwkvLwlyZXR1cm4oTlVMTCk7CisKKwlpZihicHAgPjgpIHsKKwkJYnBwPTE2OworIAkJUm1hc2sgPSAweDAwMDAwMDFGOworCQlHbWFzayA9IDB4MDAwMDAzRTA7CisJCUJtYXNrID0gMHgwMDAwN0MwMDsKKwkJQW1hc2sgPSAweDAwMDA4MDAwOworCisJCXZpZGVvU2V0TW9kZShNT0RFXzVfMkR8IERJU1BMQVlfQkcyX0FDVElWRSk7IAorCisJCXZyYW1TZXRNYWluQmFua3MoVlJBTV9BX01BSU5fQkcsVlJBTV9CX01BSU5fQkcsVlJBTV9DX01BSU5fQkcsVlJBTV9EX01BSU5fQkcpOworCisJCUJHMl9DUiA9IEJHX0JNUDE2XzUxMng1MTI7CisJICAgIEJHMl9YRFggPSAoKHdpZHRoIC8gMjU2KSA8PCA4KSB8ICh3aWR0aCAlIDI1NikgOyAKKyAgICAgICAgQkcyX1hEWSA9IDA7IAorICAgICAgICBCRzJfWURYID0gMDsJCisgICAgICAgIEJHMl9ZRFkgPSAoKGhlaWdodCAvIDE5MikgPDwgOCkgfCAoKGhlaWdodCAlIDE5MikgKyAoaGVpZ2h0ICUgMTkyKSAvIDMpIDsKKyAgICAgICAgQkcyX0NYID0gMDsKKyAgICAgICAgQkcyX0NZID0gMDsgCisvLyAgICAgICAgZm9yIChpPTA7aTwyNTYqMTkyO2krKykKKy8vCSAgICAgICAgZnJvbnRCdWZmZXJbaV0gPSBSR0IxNSgzMSwwLDApfEJJVCgxNSk7CisJfQorCWVsc2UKKwlpZihicHAgPD0gOCkgeworCQlicHA9ODsKKwkJUm1hc2sgPSAweDAwMDAwMDAwOworCQlHbWFzayA9IDB4MDAwMDAwMDA7IAorCQlCbWFzayA9IDB4MDAwMDAwMDA7CisJCUJHMl9DUiA9IEJHX0JNUDhfMTAyNHg1MTI7CisgICAgICAgIEJHMl9YRFggPSAoKHdpZHRoIC8gMjU2KSA8PCA4KSB8ICh3aWR0aCAlIDI1NikgOworICAgICAgICBCRzJfWERZID0gMDsgCisgICAgICAgIEJHMl9ZRFggPSAwOworICAgICAgICBCRzJfWURZID0gKChoZWlnaHQgLyAxOTIpIDw8IDgpIHwgKChoZWlnaHQgJSAxOTIpICsgKGhlaWdodCAlIDE5MikgLyAzKSA7CisKKwl9CisJZWxzZQorCQlpZihicHAgPCAxNSkgYnBwPTE1OworCWlmKHdpZHRoPD0yNTYpIHdpZHRoPTI1NjsKKwllbHNlCisJCWlmKHdpZHRoPDI1Nikgd2lkdGg9MjU2OworCWlmKGhlaWdodDw9MTkyKSBoZWlnaHQ9MTkyOworCWVsc2UKKwkJaWYoaGVpZ2h0PDE5MikgaGVpZ2h0PTE5MjsKKwkKKwlpZihicHA9PTgpCisJeworCQlpZih3aWR0aDwyNTYpIHdpZHRoPTI1NjsKKwkJaWYoaGVpZ2h0PDE5MikgaGVpZ2h0PTE5MjsKKwkJdGhpcy0+aGlkZGVuLT5uZHNtb2RlPTQ7CisJfQorCQorCWlmKGJwcD09MTUpCisJeworCQlpZih3aWR0aDwyNTYpIHRoaXMtPmhpZGRlbi0+bmRzbW9kZT01OworCQllbHNlIHRoaXMtPmhpZGRlbi0+bmRzbW9kZT0zOyAKKwl9CisKKwl0aGlzLT5oaWRkZW4tPmJ1ZmZlcj0gZnJvbnRCdWZmZXI7Ly9ORFNfVlJBTV9CQVNFOworCQorCS8vTkRTX0RJU1BDTlQgPSBORFNfRElTUF9NT0RFKHRoaXMtPmhpZGRlbi0+bmRzbW9kZSl8TkRTX0RJU1BfQkcyOworCQorIAkvL2ZwcmludGYoc3RkZXJyLCJTZXR0aW5nIG1vZGUgJWR4JWQgKG5kc21vZGUgJWQpXG4iLCB3aWR0aCwgaGVpZ2h0LHRoaXMtPmhpZGRlbi0+bmRzbW9kZSk7CisKKwkvLyBGSVhNRTogSG93IGRvIEkgdGVsbCB0aGF0IDE1IGJpdHMgbW9kZSBpcyA1NTU/CisKKwlTRExfbWVtc2V0KHRoaXMtPmhpZGRlbi0+YnVmZmVyLCAwLCAxMDI0ICogNTEyKiAoKHRoaXMtPmhpZGRlbi0+bmRzbW9kZT09NCB8fCB0aGlzLT5oaWRkZW4tPm5kc21vZGU9PTUpID8gMiA6IDEgKSAqICgoYnBwKzcpIC8gOCkpOworCisJLyogQWxsb2NhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHRoZSBzY3JlZW4gKi8KKwlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgYnBwLCBSbWFzaywgR21hc2ssIEJtYXNrLCBBbWFzaykgKSB7CisJCXRoaXMtPmhpZGRlbi0+YnVmZmVyID0gTlVMTDsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciByZXF1ZXN0ZWQgbW9kZSIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLworCWN1cnJlbnQtPmZsYWdzID0gZmxhZ3MgfCBTRExfRlVMTFNDUkVFTiB8IFNETF9IV1NVUkZBQ0UgfCAodGhpcy0+aGlkZGVuLT5uZHNtb2RlID4gMCA/IFNETF9ET1VCTEVCVUYgOiAwKTsKKwl0aGlzLT5oaWRkZW4tPncgPSBjdXJyZW50LT53ID0gd2lkdGg7CisJdGhpcy0+aGlkZGVuLT5oID0gY3VycmVudC0+aCA9IGhlaWdodDsKKwljdXJyZW50LT5waXhlbHMgPSBmcm9udEJ1ZmZlcjsKKworCWlmIChmbGFncyAmIFNETF9ET1VCTEVCVUYpIHsgCisJCXRoaXMtPmhpZGRlbi0+c2Vjb25kYnVmZmVyYWxsb2NkPTE7CisJCWJhY2tCdWZmZXI9KHUxNiopU0RMX21hbGxvYygxMDI0KjUxMioyKTsKKwkJY3VycmVudC0+cGl4ZWxzID0gYmFja0J1ZmZlcjsgCisJfQorCWlmKGJwcD09OCkKKwkJY3VycmVudC0+cGl0Y2ggPTEwMjQ7CisJZWxzZQorCQljdXJyZW50LT5waXRjaCA9NTEyKjI7CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCitzdGF0aWMgaW50IE5EU19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaWYodGhpcy0+aGlkZGVuLT5zZWNvbmRidWZmZXJhbGxvY2QpIHsKKwkJLy9wcmludGYoImRvdWJsZSBkb3VibGUgYnVmZmVyIGFsbG9jXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvL2lmKHRoaXMtPmhpZGRlbi0+bmRzbW9kZT09MykKKwkvL3sKKwkvLwlwcmludGYoIm5vIDJuZCBidWZmZXIgaW4gbW9kZTNcbiIpOworCS8vCXJldHVybiAtMTsKKwkvL30KKwkvL3ByaW50Zigic2Vjb25kIGJ1ZmZlclxuIik7CisJLy90aGlzLT5oaWRkZW4tPnNlY29uZGJ1ZmZlcmFsbG9jZD0xOworCS8vYmFja0J1ZmZlcj0odTE2KiltYWxsb2MoMTAyNCo1MTIqMik7CisJLy9zdXJmYWNlLT5waXhlbHMgPSBiYWNrQnVmZmVyOyAKKworCXJldHVybigwKTsKK30KK3N0YXRpYyB2b2lkIE5EU19GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwkvL2ZyZWUoYmFja0J1ZmZlcik7CisJdGhpcy0+aGlkZGVuLT5zZWNvbmRidWZmZXJhbGxvY2Q9MDsKK30KK2ludCB6PTA7CisvKiBXZSBuZWVkIHRvIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2Ugb24gcGFnZSBmbGlwcGVkIGRpc3BsYXlzICovCitzdGF0aWMgaW50IE5EU19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKy8qCisJdWludDgqIGEgPSBzdXJmYWNlLT5waXhlbHM7CisgIGludCBpLGo7CisgIGEgKz0gNSAqIFNDUkVFTl9XSURUSCArIDU7CisgIGZvciggaSA9IDA7IGkgPCAxOTU7ICsraSkgeworICAgIHVpbnQxNiogbGluZSA9IGEgKyAoU0NSRUVOX1dJRFRIICogaSk7CisgICAgZm9yKCBqID0gMDsgaiA8IDE1ODsgKytqKSB7CisgICAgICAqbGluZSsrID0gUkdCMTUoMTU1LDE1NSwyNSk7CisgICAgfQorICB9CisqLworCS8vaWYgKHogPDI1NikKKwkvLyBCR19QQUxFVFRFW3orK109UkdCMTUoMjU1LXoseiwyNTUteik7CisKKyAKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIE5EU19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybjsKK30KKworc3RhdGljIGludCBORFNfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaWYodGhpcy0+aGlkZGVuLT5zZWNvbmRidWZmZXJhbGxvY2QpeworCQl3aGlsZShESVNQX1khPTE5Mik7CisJICAgIHdoaWxlKERJU1BfWT09MTkyKTsgCisJCS8vcHJpbnRmKCJmbGlwIik7CisKKwkJZG1hQ29weUFzeW5jaChiYWNrQnVmZmVyLGZyb250QnVmZmVyLDEwMjQqNTEyKTsKKwl9CisJCS8vcHJpbnRmKCJmbGlwXG4iKTsKKyAgICAgICAgLy91MTYqIHRlbXAgPSBzdXJmYWNlLT5waXhlbHM7CisgICAgICAgIC8vc3VyZmFjZS0+cGl4ZWxzID0gZnJvbnRCdWZmZXI7CisgICAgICAgIC8vZnJvbnRCdWZmZXIgPSB0ZW1wOworCS8qCXU4KiB2cmFtPUJHX0dGWDsKKwlpbnQgeCx5OworCWZvcih5ID0gMDsgeSA8IDUxMjsgeSsrKQorCQlkbWFDb3B5KCZmcm9udEJ1ZmZlclt5KnJlY3RzLT53XSwgJnZyYW1beSo1MTJdLDUxMik7CisJLy91bnNpZ25lZCBjaGFyIGJ1ZjsKKwkKKwkvL3ByaW50ZigiTkRTX0ZsaXBIV1N1cmZhY2VcbiIpOworCS8vcHJpbnRmKCJwdHIgbm93OiAweCV4XG4iLHN1cmZhY2UtPnBpeGVscyk7CisKKwkgICAgd2hpbGUoRElTUF9ZIT0xOTIpOworCSAgICB3aGlsZShESVNQX1k9PTE5Mik7IAorICAgICAgICAvL3N3YXAKKyAgICAgICAgdTE2KiB0ZW1wID0gZnJvbnRCdWZmZXI7CisgICAgICAgIGZyb250QnVmZmVyID0gYmFja0J1ZmZlcjsKKyAgICAgICAgYmFja0J1ZmZlciA9IHRlbXA7CisgICAgICAgIAorICAgICAgICAvL2ZsaXAgCisgICAgICAgIC8vYmFzZSBpcyAxNktCIGFuZCBzY3JlZW4gc2l6ZSBpcyAyNTZ4MjU2eDIgKDEyOEtCKQorICAgICAgICBCRzJfQ1IgXj0gQkdfQk1QX0JBU0UoIDUxMiAvIDE2ICk7ICovCisvKgorCWlmKHN1cmZhY2UtPnBpeGVscyA9PSBmcm9udEJ1ZmZlcikvL05EU19WUkFNX0JBU0UpCisJeworCQkJd2hpbGUoRElTUF9ZIT0xOTIpOworCXdoaWxlKERJU1BfWT09MTkyKTsgCisgICAgICAgIC8vc3dhcAorICAgICAgICB1MTYqIHRlbXAgPSBiYWNrQnVmZmVyOworICAgICAgICBiYWNrQnVmZmVyID0gZnJvbnRCdWZmZXI7CisgICAgICAgIGZyb250QnVmZmVyID0gdGVtcDsKKyAgICAgICAgCisgICAgICAgIC8vZmxpcCAKKyAgICAgICAgLy9iYXNlIGlzIDE2S0IgYW5kIHNjcmVlbiBzaXplIGlzIDI1NngyNTZ4MiAoMTI4S0IpCisgICAgICAgIEJHM19DUiBePSBCR19CTVBfQkFTRSggMTI4IC8gMTYgKTsgCisJfQorCWVsc2UKKwl7CisKKwkJd2hpbGUoRElTUF9ZIT0xOTIpOworCXdoaWxlKERJU1BfWT09MTkyKTsgCisgICAgICAgIC8vc3dhcAorICAgICAgICB1MTYqIHRlbXAgPSBmcm9udEJ1ZmZlcjsKKyAgICAgICAgZnJvbnRCdWZmZXIgPSBiYWNrQnVmZmVyOworICAgICAgICBiYWNrQnVmZmVyID0gdGVtcDsKKyAgICAgICAgCisgICAgICAgIC8vZmxpcCAKKyAgICAgICAgLy9iYXNlIGlzIDE2S0IgYW5kIHNjcmVlbiBzaXplIGlzIDI1NngyNTZ4MiAoMTI4S0IpCisgICAgICAgIEJHM19DUiBePSBCR19CTVBfQkFTRSggMTI4IC8gMTYgKTsgCisJCQorCX0KKwkqLworCS8vcHJpbnRmKCJwdHIgdGhlbjogMHgleFxuIixzdXJmYWNlLT5waXhlbHMpOworCisJLy9wcmludGYoInNldHRpbmcgZGlzcGNudCB0byAweCV4XG4iLE5EU19ESVNQQ05UID0gTkRTX0RJU1BfTU9ERSh0aGlzLT5oaWRkZW4tPm5kc21vZGUpfE5EU19ESVNQX0JHMnwgYnVmKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIE5EU19VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisJLy9mcHJpbnRmKHN0ZGVyciwidXBkYXRlXG4iKTsKKwkvKiBkbyBub3RoaW5nLiAqLworCS8vZG1hQ29weShmcm9udEJ1ZmZlcixCR19HRlgsNTEyKjUxMik7CisJIC8qCisJdTgqIHZyYW09KHU4KilCR19HRlg7CisJaW50IHgseTsKKwlmb3IoeSA9IDA7IHkgPCA1MTI7IHkrKykKKwkJZG1hQ29weSgmZnJvbnRCdWZmZXJbeSpyZWN0cy0+d10sICZ2cmFtW3kqNTEyXSw1MTIpOworCSAqLworCit9CisKK2ludCBORFNfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworCS8vcHJpbnRmKCJTZXRDb2xvcnNcbiIpOworCXNob3J0IHIsZyxiOworCQorCWlmKHRoaXMtPmhpZGRlbi0+bmRzbW9kZSAhPSA0KQorCXsKKwkJcHJpbnRmKCJUaGlzIGlzIG5vdCBhIHBhbGV0dGl6ZWQgbW9kZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpbnQgaSxqPWZpcnN0Y29sb3IrbmNvbG9yczsKKwlmb3IoaT1maXJzdGNvbG9yO2k8ajtpKyspCisJeworCQlyPWNvbG9yc1tpXS5yPj4zOworCQlnPWNvbG9yc1tpXS5nPj4zOworCQliPWNvbG9yc1tpXS5iPj4zOworCQlCR19QQUxFVFRFW2ldPVJHQjE1KHIsIGcsIGIpOworCX0gCisKKwlyZXR1cm4oMCk7Cit9CisKKy8qIE5vdGU6ICBJZiB3ZSBhcmUgdGVybWluYXRlZCwgdGhpcyBjb3VsZCBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZgorICAgYW5vdGhlciBTREwgdmlkZW8gcm91dGluZSAtLSBub3RhYmx5IFVwZGF0ZVJlY3RzLgorKi8KK3ZvaWQgTkRTX1ZpZGVvUXVpdChfVEhJUykKK3sKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmRzL1NETF9uZHN2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9uZHMvU0RMX25kc3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1ZjY1NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vbmRzL1NETF9uZHN2aWRlby5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfbmRzdmlkZW9faAorI2RlZmluZSBfU0RMX25kc3ZpZGVvX2gKKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKKworLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgKi8KKworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKKyAgICBpbnQgdywgaDsKKyAgICB2b2lkICpidWZmZXI7CisgICAgc2hvcnQgbmRzbW9kZTsKKyAgICBzaG9ydCBzZWNvbmRidWZmZXJhbGxvY2Q7Cit9OworCisvKgorI2RlZmluZSBORFNfVklEQ19CQVNFIDB4NDAwMDAwMAorI2RlZmluZSBORFNfRElTUENOVCAoKih2b2xhdGlsZSBVaW50MzIqKShORFNfVklEQ19CQVNFKSkKKyNkZWZpbmUgTkRTX1ZJRENfU0NBTkxJTkUgKE5EU19WSURDX0JBU0UrNikKKyNkZWZpbmUgTkRTX1NDQU5MSU5FICgqKHZvbGF0aWxlIFVpbnQ4KikoTkRTX1ZJRENfU0NBTkxJTkUpKQorCisjZGVmaW5lIE5EU19ESVNQX01PREUobikgKG4mNykKKyNkZWZpbmUgTkRTX0RJU1BfQkcyIDB4NDAwCisjZGVmaW5lIE5EU19ESVNQX0ZCIDB4MTAKKworI2RlZmluZSBORFNfUEFMX0JBU0UgMHg1MDAwMDAwCisjZGVmaW5lIE5EU19CR1BBTCAoKHZvbGF0aWxlIFVpbnQxNiopKE5EU19QQUxfQkFTRSkpCisjZGVmaW5lIE5EU19PQkpQQUwgKCh2b2xhdGlsZSBVaW50MTYqKShORFNfUEFMX0JBU0UrMHgyMDApKQorCisjZGVmaW5lIE5EU19WUkFNX0JBU0UgMHg2MDAwMDAwCisjZGVmaW5lIE5EU19WUkFNXzJOREJVRiAweDYwMGEwMDAKKyNkZWZpbmUgTkRTX1ZSQU0gPSAoKHZvbGF0aWxlIFVpbnQxNiogKU5EU19WUkFNX0JBU0UpCisqLworI2VuZGlmIC8qIF9TRExfbmRzdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9vczJmc2xpYi9TRExfb3MyZnNsaWIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vb3MyZnNsaWIvU0RMX29zMmZzbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwMmQxZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vb3MyZnNsaWIvU0RMX29zMmZzbGliLmMKQEAgLTAsMCArMSwzMDE4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2RlZmluZSBfVUxTX0NBTExDT05WXworI2RlZmluZSBDQUxMQ09OViBfU3lzdGVtCisjaW5jbHVkZSA8dW5pZGVmLmg+ICAgICAgICAgICAgICAgICAgICAvLyBVbmljb2RlIEFQSQorI2luY2x1ZGUgPHVjb252Lmg+ICAgICAgICAgICAgICAgICAgICAgLy8gVW5pY29kZSBBUEkgKGNvZGVwYWdlIGNvbnZlcnNpb24pCisKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX29zMmZzbGliLmgiCisKK3N0YXRpYyBVTE9ORyB1bEZDRlRvVXNlID0KKyAgICAgICAgRkNGX1RJVExFQkFSIHwKKyAgICAgICAgRkNGX1NZU01FTlUgfAorICAgICAgICBGQ0ZfTUlOQlVUVE9OIHwKKyAgICAgICAgRkNGX01BWEJVVFRPTiB8CisgICAgICAgIEZDRl9OT0JZVEVBTElHTiB8CisgICAgICAgIEZDRl9TSVpFQk9SREVSIHwKKyAgICAgICAgRkNGX1RBU0tMSVNUOworCitzdGF0aWMgaW50IGJNb3VzZUNhcHR1cmVkICAgPSAwOworc3RhdGljIGludCBiTW91c2VDYXB0dXJhYmxlID0gMDsKK3N0YXRpYyBIUE9JTlRFUiBocHRyR2xvYmFsUG9pbnRlciA9IE5VTEw7CitzdGF0aWMgSFBPSU5URVIgaHB0ckN1cnJlbnRJY29uID0gTlVMTDsKK3N0YXRpYyBpbnQgaVdpbmRvd1NpemVYID0gMzIwOworc3RhdGljIGludCBpV2luZG93U2l6ZVkgPSAyMDA7CitzdGF0aWMgaW50IGJXaW5kb3dSZXNpemVkID0gMDsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBCTVBJTkZPCit7CisgICBCSVRNQVBJTkZPOworICAgUkdCICBjbHI7Cit9IEJNUElORk8sICpQQk1QSU5GTzsKKyNwcmFnbWEgcGFjaygpCisKKworLy8gQmFja2Rvb3JzOgorREVDTFNQRUMgdm9pZCBTRExDQUxMIFNETF9PUzJGU0xJQl9TZXRGQ0ZUb1VzZShVTE9ORyB1bEZDRikKK3sKKyAgdWxGQ0ZUb1VzZSA9IHVsRkNGOworfQorCisvLyBDb25maWd1cmF0aW9uIGRlZmluZXM6CisKKy8vIFdlIGhhdmUgdG8gcmVwb3J0IGVtcHR5IGFscGhhIG1hc2ssIG90aGVyd2lzZSBTREwgd2lsbCBzZWxlY3QKKy8vIGFscGhhIGJsaXR0ZXJzLCBhbmQgdGhpcyB3aWxsIGhhdmUgdW53YW50ZWQgcmVzdWx0cywgYXMgd2UgZG9uJ3QKKy8vIHN1cHBvcnQgYWxwaGEgY2hhbm5lbCBpbiBGU0xpYiB5ZXQuCisjZGVmaW5lIFJFUE9SVF9FTVBUWV9BTFBIQV9NQVNLCisKKy8vIEV4cGVyaW1lbnRhbDogTW92ZSBldmVyeSBGU0xpYl9CaXRCbHQoKSBjYWxsIGludG8gd2luZG93IG1lc3NhZ2UKKy8vIHByb2Nlc3NpbmcgZnVuY3Rpb24uCisvLyBUaGlzIG1heSBmaXggZGlydCBsZWZ0IG9uIGRlc2t0b3AuIE9yIG5vdC4KKy8vI2RlZmluZSBCSVRCTFRfSU5fV0lOTUVTU0FHRVBST0MKKworLy8gRXhwZXJpbWVudGFsLTI6IFVzZSBXaW5Mb2NrV2luZG93VXBkYXRlKCkgaW4gYXJvdW5kIGJpdGJsdHMhCisvLyBUaGlzIGlzIG5vdCBlbmFibGVkLCBiZWNhdXNlIGl0IHNlZW1zIHRvIGNhdXNlIG1vcmUgcHJvYmxlbXMKKy8vIHRoYW4gZ29vZC4KKy8vI2RlZmluZSBVU0VfV0lOTE9DS1dJTkRPV1VQREFURV9BUk9VTkRfQklUQkxUUworCisvLyBVc2UgdGhlIGZvbGxvd2luZyB0byBzaG93IHJlc2l6ZWQgaW1hZ2UgaW5zdGVhZCBvZiBibGFjayBzdHVmZgorLy8gZXZlbiBpZiB0aGUgc3VyZmFjZSBpcyByZXNpemFibGUuCisvLyNkZWZpbmUgUkVTSVpFX0VWRU5fSUZfUkVTSVpBQkxFCisKKy8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZSBmcm9tIGEgVksga2V5c3ltIHRvIGEgU0RMIGtleXN5bSAqLworc3RhdGljIFNETEtleSBIV1NjYW5LZXlNYXBbMjU2XTsKK3N0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IHZrZXksIGludCBjaGNvZGUsIGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgaVByZXNzZWQpOworc3RhdGljIGludCAgaVNoaWZ0SXNQcmVzc2VkOworCisjaWZkZWYgQklUQkxUX0lOX1dJTk1FU1NBR0VQUk9DCisjZGVmaW5lIFdNX1VQREFURVJFQ1RTUkVRVUVTVCAgIFdNX1VTRVIrNTAKKyNlbmRpZgorCisjaWZkZWYgVVNFX1dJTkxPQ0tXSU5ET1dVUERBVEVfQVJPVU5EX0JJVEJMVFMKKyNkZWZpbmUgRlNMSUJfQklUQkxUKGh3bmQsIGJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KSBcCisgICAgeyBcCisgICAgICBXaW5Mb2NrV2luZG93VXBkYXRlKEhXTkRfREVTS1RPUCwgSFdORF9ERVNLVE9QKTsgXAorICAgICAgRlNMaWJfQml0Qmx0KGh3bmQsIGJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KTsgXAorICAgICAgV2luTG9ja1dpbmRvd1VwZGF0ZShIV05EX0RFU0tUT1AsIE5VTEwpOyBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgRlNMSUJfQklUQkxUKGh3bmQsIGJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KSBcCisgICAgRlNMaWJfQml0Qmx0KGh3bmQsIGJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KTsKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBTZXRBY2Nlc3NhYmxlV2luZG93UG9zCisvLworLy8gU2FtZSBhcyBXaW5TZXRXaW5kb3dQb3MoKSwgYnV0IHRha2VzIGNhcmUgZm9yIHRoZSB3aW5kb3cgdG8gYmUKKy8vIGFsd2F5cyBvbiB0aGUgc2NyZWVuLCB0aGUgdGl0bGViYXIgd2lsbCBiZSBhY2Nlc3NhYmxlIGV2ZXJ5dGltZS4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBCT09MIFNldEFjY2Vzc2FibGVXaW5kb3dQb3MoSFdORCBod25kLCBIV05EIGh3bmRJbnNlcnRCZWhpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcgeCwgTE9ORyB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HIGN4LCBMT05HIGN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBmbCkKK3sKKyAgU1dQIHN3cERlc2t0b3AsIHN3cDsKKyAgLy8gR2V0IGRlc2t0b3AgYXJlYQorICBXaW5RdWVyeVdpbmRvd1BvcyhIV05EX0RFU0tUT1AsICZzd3BEZXNrdG9wKTsKKworICBpZiAoKGZsICYgU1dQX01PVkUpICYmIChmbCAmIFNXUF9TSVpFKSkKKyAgeworICAgIC8vIElmIGJvdGggbW92aW5nIGFuZCBzaXppbmcsIHRoZW4gY2hhbmdlIHNpemUgYW5kIHBvcyBub3chIQorICAgIGlmICh4K2N4PnN3cERlc2t0b3AuY3gpCisgICAgICB4ID0gc3dwRGVza3RvcC5jeCAtIGN4OworICAgIGlmICh4PDApCisgICAgICB4ID0gMDsKKyAgICBpZiAoeTwwKQorICAgICAgeSA9IDA7CisgICAgaWYgKHkrY3k+c3dwRGVza3RvcC5jeSkKKyAgICAgIHkgPSBzd3BEZXNrdG9wLmN5IC0gY3k7CisgICAgcmV0dXJuIFdpblNldFdpbmRvd1Bvcyhod25kLCBod25kSW5zZXJ0QmVoaW5kLCB4LCB5LCBjeCwgY3ksIGZsKTsKKyAgfSBlbHNlCisgIGlmIChmbCAmIFNXUF9NT1ZFKQorICB7CisgICAgLy8gSnVzdCBtb3ZpbmcKKyAgICBXaW5RdWVyeVdpbmRvd1Bvcyhod25kLCAmc3dwKTsKKyAgICBpZiAoeCtzd3AuY3g+c3dwRGVza3RvcC5jeCkKKyAgICAgIHggPSBzd3BEZXNrdG9wLmN4IC0gc3dwLmN4OworICAgIGlmICh4PDApCisgICAgICB4ID0gMDsKKyAgICBpZiAoeTwwKQorICAgICAgeSA9IDA7CisgICAgaWYgKHkrc3dwLmN5PnN3cERlc2t0b3AuY3kpCisgICAgICB5ID0gc3dwRGVza3RvcC5jeSAtIHN3cC5jeTsKKyAgICByZXR1cm4gV2luU2V0V2luZG93UG9zKGh3bmQsIGh3bmRJbnNlcnRCZWhpbmQsIHgsIHksIGN4LCBjeSwgZmwpOworICB9IGVsc2UKKyAgaWYgKGZsICYgU1dQX1NJWkUpCisgIHsKKyAgICAvLyBKdXN0IHNpemluZworICAgIFdpblF1ZXJ5V2luZG93UG9zKGh3bmQsICZzd3ApOworICAgIHggPSBzd3AueDsKKyAgICB5ID0gc3dwLnk7CisgICAgaWYgKHgrY3g+c3dwRGVza3RvcC5jeCkKKyAgICAgIHggPSBzd3BEZXNrdG9wLmN4IC0gY3g7CisgICAgaWYgKHg8MCkKKyAgICAgIHggPSAwOworICAgIGlmICh5PDApCisgICAgICB5ID0gMDsKKyAgICBpZiAoeStjeT5zd3BEZXNrdG9wLmN5KQorICAgICAgeSA9IHN3cERlc2t0b3AuY3kgLSBjeTsKKyAgICByZXR1cm4gV2luU2V0V2luZG93UG9zKGh3bmQsIGh3bmRJbnNlcnRCZWhpbmQsIHgsIHksIGN4LCBjeSwgZmwgfCBTV1BfTU9WRSk7CisgIH0gZWxzZQorICByZXR1cm4gV2luU2V0V2luZG93UG9zKGh3bmQsIGh3bmRJbnNlcnRCZWhpbmQsIHgsIHksIGN4LCBjeSwgZmwpOworfQorCitzdGF0aWMgVW5pQ2hhciBOYXRpdmVDaGFyVG9VbmlDaGFyKGludCBjaGNvZGUpCit7CisgIFVuaUNoYXIgdWNSZXN1bHQgPSAoVW5pQ2hhcikgY2hjb2RlOworICBpbnQgcmM7CisgIFVjb252T2JqZWN0IHVjb1RlbXA7CisgIGNoYXIgICAgIGFjaEZyb21bMl07CisgIGNoYXIgICAgICpwY2hGcm9tOworICBzaXplX3QgICBpRnJvbUNvdW50OworICBVbmlDaGFyICBhdWNUb1sxMF07CisgIFVuaUNoYXIgICpwdWNUbzsKKyAgc2l6ZV90ICAgaVRvQ291bnQ7CisgIHNpemVfdCAgIGlOb25JZGVudGljYWw7CisKKyAgLy8gQ3JlYXRlIHVuaWNvZGUgY29udmVydCBvYmplY3QKKyAgcmMgPSBVbmlDcmVhdGVVY29udk9iamVjdChMIiIsICZ1Y29UZW1wKTsKKyAgaWYgKHJjIT1VTFNfU1VDQ0VTUykKKyAgeworICAgIC8vIENvdWxkIG5vdCBjcmVhdGUgY29udmVydCBvYmplY3QhCisgICAgcmV0dXJuIHVjUmVzdWx0OworICB9CisKKyAgLy8gQ29udmVydCBsYW5ndWFnZSBjb2RlIHN0cmluZyB0byB1bmljb2RlIHN0cmluZworICBhY2hGcm9tWzBdID0gKGNoYXIpIGNoY29kZTsKKyAgYWNoRnJvbVsxXSA9IDA7CisgIGlGcm9tQ291bnQgPSBzaXplb2YoY2hhcikgKiAyOworICBpVG9Db3VudCA9IHNpemVvZihVbmlDaGFyKSAqIDI7CisgIHB1Y1RvID0gJihhdWNUb1swXSk7CisgIHBjaEZyb20gPSAmKGFjaEZyb21bMF0pOworCisgIHJjID0gVW5pVWNvbnZUb1Vjcyh1Y29UZW1wLAorICAgICAgICAgICAgICAgICAgICAgJnBjaEZyb20sCisgICAgICAgICAgICAgICAgICAgICAmaUZyb21Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICZwdWNUbywKKyAgICAgICAgICAgICAgICAgICAgICZpVG9Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICZpTm9uSWRlbnRpY2FsKTsKKworICBpZiAocmMhPVVMU19TVUNDRVNTKQorICB7CisgICAgLy8gQ291bGQgbm90IGNvbnZlcnQgbGFuZ3VhZ2UgY29kZSB0byBVQ1Mgc3RyaW5nIQorICAgIFVuaUZyZWVVY29udk9iamVjdCh1Y29UZW1wKTsKKyAgICByZXR1cm4gdWNSZXN1bHQ7CisgIH0KKworICBVbmlGcmVlVWNvbnZPYmplY3QodWNvVGVtcCk7CisKKyNpZmRlZiBERUJVR19CVUlMRAorICBwcmludGYoIiUwMnggY29udmVydGVkIHRvICUwMnhcbiIsIChpbnQpIGNoY29kZSwgKGludCkgKGF1Y1RvWzBdKSk7CisjZW5kaWYKKworICByZXR1cm4gYXVjVG9bMF07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFRyYW5zbGF0ZUtleQorLy8KKy8vIFRoaXMgY3JlYXRlcyBTREwgS2V5Y29kZXMgZnJvbSBWS18gYW5kIGhhcmR3YXJlIHNjYW4gY29kZXMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IHZrZXksIGludCBjaGNvZGUsIGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgaVByZXNzZWQpCit7CisgIGtleXN5bS0+c2NhbmNvZGUgPSAodW5zaWduZWQgY2hhcikgc2NhbmNvZGU7CisgIGtleXN5bS0+bW9kID0gS01PRF9OT05FOworICBrZXlzeW0tPnVuaWNvZGUgPSAwOworCisgIGlmIChpUHJlc3NlZCAmJiBTRExfVHJhbnNsYXRlVU5JQ09ERSkKKyAgeworICAgIGlmIChjaGNvZGUpCisgICAgICBrZXlzeW0tPnVuaWNvZGUgPSBOYXRpdmVDaGFyVG9VbmlDaGFyKGNoY29kZSk7CisgICAgZWxzZQorICAgICAga2V5c3ltLT51bmljb2RlID0gdmtleTsKKyAgfQorCisgIGtleXN5bS0+c3ltID0gSFdTY2FuS2V5TWFwW3NjYW5jb2RlXTsKKworICAvLyBOb3cgc3R1ZmZzIGJhc2VkIG9uIHN0YXRlIG9mIHNoaWZ0IGtleShzKSEKKyAgaWYgKHZrZXkgPT0gVktfU0hJRlQpCisgIHsKKyAgICBpU2hpZnRJc1ByZXNzZWQgPSBpUHJlc3NlZDsKKyAgfQorCisgIGlmICgoaVNoaWZ0SXNQcmVzc2VkKSAmJiAoU0RMX1RyYW5zbGF0ZVVOSUNPREUpKQorICB7CisgICAgLy8gQ2hhbmdlIHN5bXMsIGlmIFVuaWNvZGUgc3R1ZmYgaXMgcmVxdWlyZWQKKyAgICAvLyBJIHRoaW5rIGl0J3Mgc2lsbHksIGJ1dCBpdCdzIFNETC4uLgorICAgIHN3aXRjaCAoa2V5c3ltLT5zeW0pCisgICAgeworICAgICAgY2FzZSBTRExLX0JBQ0tRVU9URToKKyAgICAgICAga2V5c3ltLT5zeW0gPSAnfic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTRExLXzE6CisgICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19FWENMQUlNOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0RMS18yOgorICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfQVQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTRExLXzM6CisgICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19IQVNIOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0RMS180OgorICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfRE9MTEFSOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0RMS181OgorICAgICAgICBrZXlzeW0tPnN5bSA9ICclJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNETEtfNjoKKyAgICAgICAga2V5c3ltLT5zeW0gPSBTRExLX0NBUkVUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0RMS183OgorICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfQU1QRVJTQU5EOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0RMS184OgorICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfQVNURVJJU0s7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTRExLXzk6CisgICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19MRUZUUEFSRU47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTRExLXzA6CisgICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19SSUdIVFBBUkVOOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0RMS19NSU5VUzoKKyAgICAgICAga2V5c3ltLT5zeW0gPSBTRExLX1VOREVSU0NPUkU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTRExLX1BMVVM6CisgICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19FUVVBTFM7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNETEtfTEVGVEJSQUNLRVQ6CisgICAgICAgIGtleXN5bS0+c3ltID0gJ3snOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0RMS19SSUdIVEJSQUNLRVQ6CisgICAgICAgIGtleXN5bS0+c3ltID0gJ30nOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTRExLX1NFTUlDT0xPTjoKKyAgICAgICAga2V5c3ltLT5zeW0gPSBTRExLX0NPTE9OOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0RMS19RVU9URToKKyAgICAgICAga2V5c3ltLT5zeW0gPSBTRExLX1FVT1RFREJMOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0RMS19CQUNLU0xBU0g6CisgICAgICAgIGtleXN5bS0+c3ltID0gJ3wnOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTRExLX0NPTU1BOgorICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfTEVTUzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNETEtfUEVSSU9EOgorICAgICAgICBrZXlzeW0tPnN5bSA9IFNETEtfR1JFQVRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNETEtfU0xBU0g6CisgICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19RVUVTVElPTjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4ga2V5c3ltOworfQorCisjZGVmaW5lIENPTlZFUlRNT1VTRVBPU0lUSU9OKCkgIFwKKyAgICAgICAgLyogV2UgaGF2ZSB0byBpbnZlcnNlIHRoZSBtb3VzZSBwb3NpdGlvbiwgYmVjYXVzZSBldmVyeSBub24tb3MvMiBzeXN0ZW0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIGhhcyBhIGNvb3JkaW5hdGUgc3lzdGVtIHdoZXJlIHRoZSAoMDswKSBpcyB0aGUgdG9wLWxlZnQgY29ybmVyLCAgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiB3aGlsZSBvbiBvcy8yIGl0J3MgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKEZTTGliX1F1ZXJ5RlNNb2RlKGh3bmQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIC8qIFdlJ3JlIGluIEZTIG1vZGUhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAvKiBJbiBGUyBtb2RlIG91ciB3aW5kb3cgaXMgYXMgYmlnIGFzIGZ1bGxzY3JlZW4gbW9kZSwgYnV0IG5vdCBuZWNlc3NhcnkgYXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgLyogYmlnIGFzIHRoZSBzb3VyY2UgYnVmZmVyIChjYW4gYmUgYmlnZ2VyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIC8qIFNvLCBsaW1pdCBtb3VzZSBwb3MgdG8gc291cmNlIGJ1ZmZlciBzaXplISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZiAocHB0cy0+eDwwKSBwcHRzLT54ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaWYgKHBwdHMtPnk8MCkgcHB0cy0+eSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGlmIChwcHRzLT54Pj1wVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uKSBwcHRzLT54ID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbi0xOyAgICAgIFwKKyAgICAgICAgICBpZiAocHB0cy0+eT49cFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbikgcHB0cy0+eSA9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24tMTsgICAgICBcCisgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHB0bC54ID0gcHB0cy0+eDsgcHRsLnkgPSBwcHRzLT55OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBXaW5NYXBXaW5kb3dQb2ludHMocFZpZGVvLT5oaWRkZW4tPmh3bmRDbGllbnQsIEhXTkRfREVTS1RPUCwgJnB0bCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgV2luU2V0UG9pbnRlclBvcyhIV05EX0RFU0tUT1AsIHB0bC54LCBwdGwueSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIC8qIFRoZW4gY29udmVydCBPUy8yIHBvc2l0aW9uIHRvIFNETCBwb3NpdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBwcHRzLT55ID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAtIHBwdHMtPnkgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBTV1Agc3dwQ2xpZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgLyogV2UncmUgaW4gd2luZG93ZWQgbW9kZSEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAvKiBDb252ZXJ0IE9TLzIgbW91c2UgcG9zaXRpb24gdG8gU0RMIHBvc2l0aW9uLCBhbmQgYWxzbyBzY2FsZSBpdCEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHBwdHMtPngpID0gKHBwdHMtPngpICogcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbiAvIHN3cENsaWVudC5jeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHBwdHMtPnkpID0gKHBwdHMtPnkpICogcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAvIHN3cENsaWVudC5jeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHBwdHMtPnkpID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAtIChwcHRzLT55KSAgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFduZFByb2MKKy8vCisvLyBUaGlzIGlzIHRoZSBtZXNzYWdlIHByb2Nlc3Npbmcgd2luZG93IHByb2NlZHVyZSBmb3IgdGhlCisvLyBTRExXaW5kb3dDbGFzcywgd2hpY2ggaXMgdGhlIGNsaWVudCB3aW5kb3cgaW4gb3VyIGFwcGxpY2F0aW9uLgorLy8gSXQgaGFuZGxlcyBzd2l0Y2hpbmcgYmFjayBhbmQgYXdheSBmcm9tIHRoZSBhcHAgKHRha2luZyBjYXJlIG9mCisvLyBnb2luZyBvdXQgYW5kIGJhY2sgdG8gYW5kIGZyb20gZnVsbHNjcmVlbiBtb2RlKSwgc2VuZGluZyBrZXlzdHJva2VzCisvLyBhbmQgbW91c2UgZXZlbnRzIHRvIHdoZXJlIGl0IGhhcyB0byBiZSBzZW50LCBldGMuLi4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBNUkVTVUxUIEVYUEVOVFJZIFduZFByb2MoIEhXTkQgaHduZCwgVUxPTkcgbXNnLCBNUEFSQU0gbXAxLCBNUEFSQU0gbXAyKQoreworICBIUFMgcHM7CisgIFJFQ1RMIHJjbDsKKyAgU0RMX1ZpZGVvRGV2aWNlICpwVmlkZW8gPSBOVUxMOworCisgIHN3aXRjaCAobXNnKQorICB7CisgICAgY2FzZSBXTV9DSEFSOiAgLy8gS2V5cHJlc3Mgbm90aWZpY2F0aW9uCisjaWZkZWYgREVCVUdfQlVJTEQKKy8vICAgICAgcHJpbnRmKCJXTV9DSEFSXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgIHBWaWRlbyA9IFdpblF1ZXJ5V2luZG93UHRyKGh3bmQsIDApOworICAgICAgaWYgKHBWaWRlbykKKyAgICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgLy8gV2Ugc2tpcCByZXBlYXRlZCBrZXlzOgorICAgICAgICBpZiAoQ0hBUk1TRygmbXNnKS0+Y1JlcGVhdD4xKQorICAgICAgICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKy8vICAgICAgICAgIHByaW50ZigiUmVwZWF0ZWQga2V5ICglZCksIHNraXBwaW5nLi4uXG4iLCBDSEFSTVNHKCZtc2cpLT5jUmVwZWF0KTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgICAgICByZXR1cm4gKE1SRVNVTFQpIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBJZiBpdCdzIG5vdCByZXBlYXRlZCwgdGhlbiBsZXQncyBzZWUgaWYgaXRzIHByZXNzZWQgb3IgcmVsZWFzZWQhCisgICAgICAgIGlmIChTSE9SVDFGUk9NTVAobXAxKSAmIEtDX0tFWVVQKQorICAgICAgICB7CisgICAgICAgICAgLy8gQSBrZXkgaGFzIGJlZW4gcmVsZWFzZWQKKyAgICAgICAgICBTRExfa2V5c3ltIGtleXN5bTsKKworI2lmZGVmIERFQlVHX0JVSUxECisvLyAgICAgICAgICBwcmludGYoIldNX0NIQVIsIGtleXVwLCBjb2RlIGlzIFsweCUweF1cbiIsIENIQVI0RlJPTU1QKG1wMSkpOyAvLyBIVyBzY2FuIGNvZGUKKyNlbmRpZgorCisgICAgICAgICAgLy8gT25lIHByb2JsZW0gaXMgd2l0aCBGMSwgd2hpY2ggZ2V0cyBvbmx5IHRoZSBrZXl1cCBtZXNzYWdlIGJlY2F1c2UKKyAgICAgICAgICAvLyBpdCBpcyBhIHN5c3RlbSBrZXkuCisgICAgICAgICAgLy8gU28sIHdoZW4gd2UgZ2V0IGtleXVwIG1lc3NhZ2UsIHdlIHNpbXVsYXRlIGtleWRvd24gdG9vIQorICAgICAgICAgIC8vIFVQREFURToKKyAgICAgICAgICAvLyAgVGhpcyBwcm9ibGVtIHNob3VsZCBiZSBzb2x2ZWQgbm93LCB0aGF0IHRoZSBhY2NlbGVyYXRvciBrZXlzIGFyZQorICAgICAgICAgIC8vICBkaXNhYmxlZCBmb3IgdGhpcyB3aW5kb3chCisgICAgICAgICAgLyoKKyAgICAgICAgICBpZiAoU0hPUlQyRlJPTU1QKG1wMik9PVZLX0YxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsIFRyYW5zbGF0ZUtleShTSE9SVDJGUk9NTVAobXAyKSwgLy8gVktfIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQxRlJPTU1QKG1wMiksIC8vIENoYXJhY3RlciBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVI0RlJPTU1QKG1wMSksICAvLyBIVyBTY2FuIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleXN5bSwwKSk7CisgICAgICAgICAgfSovCisKKyAgICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgVHJhbnNsYXRlS2V5KFNIT1JUMkZST01NUChtcDIpLCAvLyBWS18gY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQxRlJPTU1QKG1wMiksIC8vIENoYXJhY3RlciBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSNEZST01NUChtcDEpLCAgLy8gSFcgU2NhbiBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5c3ltLDApKTsKKyAgICAgICAgICAKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBBIGtleSBoYXMgYmVlbiBwcmVzc2VkCisgICAgICAgICAgU0RMX2tleXN5bSBrZXlzeW07CisKKyNpZmRlZiBERUJVR19CVUlMRAorLy8gICAgICAgICAgcHJpbnRmKCJXTV9DSEFSLCBrZXlkb3duLCBjb2RlIGlzIFsweCUweF1cbiIsIENIQVI0RlJPTU1QKG1wMSkpOyAvLyBIVyBzY2FuIGNvZGUKKyNlbmRpZgorICAgICAgICAgIC8vIENoZWNrIGZvciBmYXN0a2V5czogQUxUK0hPTUUgdG8gdG9nZ2xlIEZTIG1vZGUKKyAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIEFMVCtFTkQgdG8gY2xvc2UgYXBwCisgICAgICAgICAgaWYgKChTSE9SVDFGUk9NTVAobXAxKSAmIEtDX0FMVCkgJiYKKyAgICAgICAgICAgICAgKFNIT1JUMkZST01NUChtcDIpID09IFZLX0hPTUUpKQorICAgICAgICAgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgICAgICAgcHJpbnRmKCIgUHJlc3NlZCBBTFQrSE9NRSFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gT25seSBzd2l0Y2ggYmV0d2VlbiBmdWxsc2NyZWVuIGFuZCBiYWNrIGlmIGl0J3Mgbm90CisgICAgICAgICAgICAvLyBhIHJlc2l6YWJsZSBtb2RlIQorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICghcFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSB8fAorICAgICAgICAgICAgICAgICgocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKQorICAgICAgICAgICAgICAgICAmJiAoKHBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkVTSVpBQkxFKT09MCkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgIEZTTGliX1RvZ2dsZUZTTW9kZShod25kLCAhRlNMaWJfUXVlcnlGU01vZGUoaHduZCkpOworI2lmZGVmIERFQlVHX0JVSUxECisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiIFJlc2l6YWJsZSBtb2RlLCBzbyBkaXNjYXJkaW5nIEFMVCtIT01FIVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgaWYgKChTSE9SVDFGUk9NTVAobXAxKSAmIEtDX0FMVCkgJiYKKyAgICAgICAgICAgICAgKFNIT1JUMkZST01NUChtcDIpID09IFZLX0VORCkpCisgICAgICAgICAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgICAgICAgICBwcmludGYoIiBQcmVzc2VkIEFMVCtFTkQhXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIENsb3NlIHdpbmRvdywgYW5kIGdldCBvdXQgb2YgbG9vcCEKKyAgICAgICAgICAgIC8vIEFsc28gc2VuZCBldmVudCB0byBTREwgYXBwbGljYXRpb24sIGJ1dCB3ZSB3b24ndAorICAgICAgICAgICAgLy8gd2FpdCBmb3IgaXQgdG8gYmUgcHJvY2Vzc2VkIQorICAgICAgICAgICAgU0RMX1ByaXZhdGVRdWl0KCk7CisgICAgICAgICAgICBXaW5Qb3N0TXNnKGh3bmQsIFdNX1FVSVQsIDAsIDApOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgVHJhbnNsYXRlS2V5KFNIT1JUMkZST01NUChtcDIpLCAvLyBWS18gY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUMUZST01NUChtcDIpLCAvLyBDaGFyYWN0ZXIgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVI0RlJPTU1QKG1wMSksICAvLyBIVyBTY2FuIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5c3ltLDEpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIChNUkVTVUxUKSBUUlVFOworCisgICAgY2FzZSBXTV9UUkFOU0xBVEVBQ0NFTDoKKyAgICAgIHsKKyAgICAgICAgUFFNU0cgcHFtc2c7CisgICAgICAgIHBxbXNnID0gKFBRTVNHKSBtcDE7CisgICAgICAgIGlmIChtcDEpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocHFtc2ctPm1zZyA9PSBXTV9DSEFSKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdNX0NIQVIgbWVzc2FnZSEKKyAgICAgICAgICAgIC8vIExldCdzIGZpbHRlciB0aGUgQUxUIGtleXByZXNzIGFuZCBhbGwgb3RoZXIgYWNjZWxlcmF0aW9uIGtleXMhCisgICAgICAgICAgICByZXR1cm4gKE1SRVNVTFQpIEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsgLy8gRGVmYXVsdCBwcm9jZXNzaW5nIChwYXNzIHRvIHBhcmVudCB1bnRpbCBmcmFtZSBjb250cm9sKQorICAgICAgfQorCisgICAgY2FzZSBXTV9QQUlOVDogIC8vIFdpbmRvdyByZWRyYXchCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiV01fUEFJTlQgKDB4JXgpXG4iLCBod25kKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgIHBzID0gV2luQmVnaW5QYWludChod25kLDAsJnJjbCk7CisgICAgICBwVmlkZW8gPSBGU0xpYl9HZXRVc2VyUGFybShod25kKTsKKyAgICAgIGlmIChwVmlkZW8pCisgICAgICB7CisgICAgICAgIGlmICghcFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKQorICAgICAgICB7CisgICAgICAgICAgUkVDVEwgcmNsUmVjdDsKKyAgICAgICAgICAvLyBTbywgZG9uJ3QgYmxpdCBub3chCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgICAgICBwcmludGYoIldNX1BBSU5UIDogU2tpcHBpbmcgYmxpdCB3aGlsZSByZXNpemluZyAoUHJlISkhXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgICAgICBXaW5RdWVyeVdpbmRvd1JlY3QoaHduZCwgJnJjbFJlY3QpOworICAgICAgICAgIC8vIEZpbGwgd2l0aCBibGFjaworICAgICAgICAgIFdpbkZpbGxSZWN0KHBzLCAmcmNsUmVjdCwgQ0xSX0JMQUNLKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoRG9zUmVxdWVzdE11dGV4U2VtKHBWaWRlby0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyLCAxMDAwKT09Tk9fRVJST1IpCisgICAgICAgICAgeworICAgICAgICAgICAgaW50IGlUb3AsIGlMZWZ0LCBpV2lkdGgsIGlIZWlnaHQ7CisgICAgICAgICAgICBpbnQgaVhTY2FsZUVycm9yLCBpWVNjYWxlRXJyb3I7CisgICAgICAgICAgICBpbnQgaVhTY2FsZUVycm9yMiwgaVlTY2FsZUVycm9yMjsKKyAgICAgICAgICAgIFNXUCBzd3A7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJlLWJsaXQgdGhlIG1vZGlmaWVkIGFyZWEhCisgICAgICAgICAgICAvLyBGb3IgdGhpcywgd2UgaGF2ZSB0byBjYWxjdWxhdGUgdGhlIHBvaW50cywgc2NhbGVkIQorICAgICAgICAgICAgV2luUXVlcnlXaW5kb3dQb3MoaHduZCwgJnN3cCk7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgICAgICAgIHByaW50ZigiV01fUEFJTlQgOiBXaW5TaXplOiAlZCAlZCwgQnVmU2l6ZTogJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc3dwLmN4LAorICAgICAgICAgICAgICAgICAgIHN3cC5jeSwKKyAgICAgICAgICAgICAgICAgICBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24KKyAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisjaWZuZGVmIFJFU0laRV9FVkVOX0lGX1JFU0laQUJMRQorICAgICAgICAgICAgLy8gQnV0IG9ubHkgYmxpdCBpZiB0aGUgd2luZG93IGlzIG5vdCByZXNpemFibGUsIG9yIGlmCisgICAgICAgICAgICAvLyB0aGUgd2luZG93IGlzIHJlc2l6YWJsZSBhbmQgdGhlIHNvdXJjZSBidWZmZXIgc2l6ZSBpcyB0aGUKKyAgICAgICAgICAgIC8vIHNhbWUgYXMgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBzaXplIQorICAgICAgICAgICAgaWYgKCghcFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSB8fAorICAgICAgICAgICAgICAgICgocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSAmJgorICAgICAgICAgICAgICAgICAocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlLT5mbGFncyAmIFNETF9SRVNJWkFCTEUpICYmCisgICAgICAgICAgICAgICAgICgoc3dwLmN4ICE9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24pIHx8CisgICAgICAgICAgICAgICAgICAoc3dwLmN5ICE9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24pCisgICAgICAgICAgICAgICAgICkgJiYKKyAgICAgICAgICAgICAgICAgKCFGU0xpYl9RdWVyeUZTTW9kZShod25kKSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFJFQ1RMIHJjbFJlY3Q7CisgICAgICAgICAgICAgIC8vIFJlc2l6YWJsZSBzdXJmYWNlIGFuZCBpbiByZXNpemluZyEKKyAgICAgICAgICAgICAgLy8gU28sIGRvbid0IGJsaXQgbm93IQorI2lmZGVmIERFQlVHX0JVSUxECisgICAgICAgICAgICAgIHByaW50ZigiV01fUEFJTlQgOiBTa2lwcGluZyBibGl0IHdoaWxlIHJlc2l6aW5nIVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UmVjdChod25kLCAmcmNsUmVjdCk7CisgICAgICAgICAgICAgIC8vIEZpbGwgd2l0aCBibGFjaworICAgICAgICAgICAgICBXaW5GaWxsUmVjdChwcywgJnJjbFJlY3QsIENMUl9CTEFDSyk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAKKyAgICAgICAgICAgICAgaVhTY2FsZUVycm9yID0gKHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24tMSkgLyBzd3AuY3g7CisgICAgICAgICAgICAgIGlZU2NhbGVFcnJvciA9IChwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uLTEpIC8gc3dwLmN5OworICAgICAgICAgICAgICBpZiAoaVhTY2FsZUVycm9yPDApIGlYU2NhbGVFcnJvciA9IDA7CisgICAgICAgICAgICAgIGlmIChpWVNjYWxlRXJyb3I8MCkgaVlTY2FsZUVycm9yID0gMDsKKyAgICAgICAgICAgICAgaVhTY2FsZUVycm9yMiA9IChzd3AuY3gtMSkvKHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24pOworICAgICAgICAgICAgICBpWVNjYWxlRXJyb3IyID0gKHN3cC5jeS0xKS8ocFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbik7CisgICAgICAgICAgICAgIGlmIChpWFNjYWxlRXJyb3IyPDApIGlYU2NhbGVFcnJvcjIgPSAwOworICAgICAgICAgICAgICBpZiAoaVlTY2FsZUVycm9yMjwwKSBpWVNjYWxlRXJyb3IyID0gMDsKKyAgICAgIAorICAgICAgICAgICAgICBpVG9wID0gKHN3cC5jeSAtIHJjbC55VG9wKSAqIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24gLyBzd3AuY3kgLSBpWVNjYWxlRXJyb3I7CisgICAgICAgICAgICAgIGlMZWZ0ID0gcmNsLnhMZWZ0ICogcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbiAvIHN3cC5jeCAtIGlYU2NhbGVFcnJvcjsKKyAgICAgICAgICAgICAgaVdpZHRoID0gKChyY2wueFJpZ2h0LXJjbC54TGVmdCkgKiBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uICsgc3dwLmN4LTEpCisgICAgICAgICAgICAgICAgLyBzd3AuY3ggKyAyKmlYU2NhbGVFcnJvcjsKKyAgICAgICAgICAgICAgaUhlaWdodCA9ICgocmNsLnlUb3AtcmNsLnlCb3R0b20pICogcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiArIHN3cC5jeS0xKQorICAgICAgICAgICAgICAgIC8gc3dwLmN5ICsgMippWVNjYWxlRXJyb3I7CisgICAgICAKKyAgICAgICAgICAgICAgaVdpZHRoKz1pWFNjYWxlRXJyb3IyOworICAgICAgICAgICAgICBpSGVpZ2h0Kz1pWVNjYWxlRXJyb3IyOworICAgICAgCisgICAgICAgICAgICAgIGlmIChpVG9wPDApIGlUb3AgPSAwOworICAgICAgICAgICAgICBpZiAoaUxlZnQ8MCkgaUxlZnQgPSAwOworICAgICAgICAgICAgICBpZiAoaVRvcCtpSGVpZ2h0PnBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24pIGlIZWlnaHQgPSBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uLWlUb3A7CisgICAgICAgICAgICAgIGlmIChpTGVmdCtpV2lkdGg+cFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbikgaVdpZHRoID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbi1pTGVmdDsKKyAgICAKKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgICAgICAgICBwcmludGYoIldNX1BBSU5UIDogQml0Qmx0OiAlZCAlZCAtPiAlZCAlZCAoQnVmICVkIHggJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgaVRvcCwgaUxlZnQsIGlXaWR0aCwgaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBGU0xJQl9CSVRCTFQoaHduZCwgcFZpZGVvLT5oaWRkZW4tPnBjaFNyY0J1ZmZlciwgaVRvcCwgaUxlZnQsIGlXaWR0aCwgaUhlaWdodCk7CisgICAgICAgICAgICB9CisgIAorICAgICAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKHBWaWRlby0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmludGYoIldNX1BBSU5UIDogTm8gcFZpZGVvIVxuIik7IGZmbHVzaChzdGRvdXQpOworICAgICAgfQorI2VuZGlmCisgICAgICBXaW5FbmRQYWludChwcyk7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiV01fUEFJTlQgOiBEb25lLlxuIik7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX1NJWkU6CisgICAgICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgICAgcHJpbnRmKCJXTV9TSVpFIDogKCVkICVkKVxuIiwKKyAgICAgICAgICAgICAgIFNIT1JUMUZST01NUChtcDIpLCBTSE9SVDJGUk9NTVAobXAyKSk7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgICAgIGlXaW5kb3dTaXplWCA9IFNIT1JUMUZST01NUChtcDIpOworICAgICAgICBpV2luZG93U2l6ZVkgPSBTSE9SVDJGUk9NTVAobXAyKTsKKyAgICAgICAgYldpbmRvd1Jlc2l6ZWQgPSAxOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgd2luZG93IHdpbGwgYmUgcmVkcmF3bgorICAgICAgICBXaW5JbnZhbGlkYXRlUmVnaW9uKGh3bmQsIE5VTEwsIFRSVUUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdNX0ZTTElCTk9USUZJQ0FUSU9OOgorI2lmZGVmIERFQlVHX0JVSUxECisgICAgICAgIHByaW50ZigiV01fRlNMSUJOT1RJRklDQVRJT05cbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgaWYgKChpbnQpbXAxID09IEZTTE5fVE9HR0xFRlNNT0RFKQorICAgICAgeworICAgICAgICAvLyBGUyBtb2RlIGNoYW5nZWQsIHJlYmxpdCBpbWFnZSEKKyAgICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7CisgICAgICAgIGlmIChwVmlkZW8pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIXBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBSZXNpemFibGUgc3VyZmFjZSBhbmQgaW4gcmVzaXppbmchCisgICAgICAgICAgICAvLyBTbywgZG9uJ3QgYmxpdCBub3chCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgICAgICAgIHByaW50ZigiV01fRlNMSUJOT1RJRklDQVRJT04gOiBDYW4gbm90IGJsaXQgaWYgdGhlcmUgaXMgbm8gc3VyZmFjZSwgZG9pbmcgbm90aGluZy5cbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgICAgIH0gZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChEb3NSZXF1ZXN0TXV0ZXhTZW0ocFZpZGVvLT5oaWRkZW4tPmhtdHhVc2VTcmNCdWZmZXIsIDEwMDApPT1OT19FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZSkKKyAgICAgICAgICAgICAgeworI2lmbmRlZiBSRVNJWkVfRVZFTl9JRl9SRVNJWkFCTEUKKyAgICAgICAgICAgICAgICBTV1Agc3dwOworCisgICAgICAgICAgICAgICAgLy8gQnV0IG9ubHkgYmxpdCBpZiB0aGUgd2luZG93IGlzIG5vdCByZXNpemFibGUsIG9yIGlmCisgICAgICAgICAgICAgICAgLy8gdGhlIHdpbmRvdyBpcyByZXNpemFibGUgYW5kIHRoZSBzb3VyY2UgYnVmZmVyIHNpemUgaXMgdGhlCisgICAgICAgICAgICAgICAgLy8gc2FtZSBhcyB0aGUgZGVzdGluYXRpb24gYnVmZmVyIHNpemUhCisgICAgICAgICAgICAgICAgV2luUXVlcnlXaW5kb3dQb3MoaHduZCwgJnN3cCk7CisgICAgICAgICAgICAgICAgaWYgKCghcFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSB8fAorICAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkVTSVpBQkxFKSAmJgorICAgICAgICAgICAgICAgICAgICAgKChzd3AuY3ggIT0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoc3dwLmN5ICE9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24pCisgICAgICAgICAgICAgICAgICAgICApICYmCisgICAgICAgICAgICAgICAgICAgICAoIUZTTGliX1F1ZXJ5RlNNb2RlKGh3bmQpKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vIFJlc2l6YWJsZSBzdXJmYWNlIGFuZCBpbiByZXNpemluZyEKKyAgICAgICAgICAgICAgICAgIC8vIFNvLCBkb24ndCBibGl0IG5vdyEKKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJXTV9GU0xJQk5PVElGSUNBVElPTiA6IENhbm5vdCBibGl0IHdoaWxlIHJlc2l6aW5nLCBkb2luZyBub3RoaW5nLlxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiV01fRlNMSUJOT1RJRklDQVRJT04gOiBCbGl0dGluZyFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgRlNMSUJfQklUQkxUKGh3bmQsIHBWaWRlby0+aGlkZGVuLT5wY2hTcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2lmZGVmIERFQlVHX0JVSUxECisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIldNX0ZTTElCTk9USUZJQ0FUSU9OIDogTm8gcHVibGljIHN1cmZhY2UhXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgCisgICAgICAgICAgICAgIERvc1JlbGVhc2VNdXRleFNlbShwVmlkZW8tPmhpZGRlbi0+aG10eFVzZVNyY0J1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gKE1QQVJBTSkgMTsKKworICAgIGNhc2UgV01fQUNUSVZBVEU6CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiV01fQUNUSVZBVEVcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisgICAgICBwVmlkZW8gPSBGU0xpYl9HZXRVc2VyUGFybShod25kKTsKKyAgICAgIGlmIChwVmlkZW8pCisgICAgICB7CisgICAgICAgIHBWaWRlby0+aGlkZGVuLT5mSW5Gb2N1cyA9IChpbnQpIG1wMTsKKyAgICAgICAgaWYgKHBWaWRlby0+aGlkZGVuLT5mSW5Gb2N1cykKKyAgICAgICAgeworICAgICAgICAgIC8vIFdlbnQgaW50byBmb2N1cworICAgICAgICAgIGlmICgocFZpZGVvLT5oaWRkZW4tPmlNb3VzZVZpc2libGUpICYmICghYk1vdXNlQ2FwdHVyZWQpKQorICAgICAgICAgICAgV2luU2V0UG9pbnRlcihIV05EX0RFU0tUT1AsIFdpblF1ZXJ5U3lzUG9pbnRlcihIV05EX0RFU0tUT1AsIFNQVFJfQVJST1csIEZBTFNFKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgV2luU2V0UG9pbnRlcihIV05EX0RFU0tUT1AsIE5VTEwpOworCisgICAgICAgICAgaWYgKGJNb3VzZUNhcHR1cmFibGUpCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gUmUtY2FwdHVyZSB0aGUgbW91c2UsIGlmIHdlIGNhcHR1cmVkIGl0IGJlZm9yZSEKKyAgICAgICAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBod25kKTsKKyAgICAgICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKKyAgICAgICAgICAgICAgUE9JTlRMIHB0bDsKKyAgICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCisgICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKKyAgICAgICAgICAgICAgcHRsLnggPSAwOyBwdGwueSA9IDA7CisgICAgICAgICAgICAgIFdpbk1hcFdpbmRvd1BvaW50cyhwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgSFdORF9ERVNLVE9QLCAmcHRsLCAxKTsKKyAgICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLworICAgICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBXZW50IG91dCBvZiBmb2N1cworICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBXaW5RdWVyeVN5c1BvaW50ZXIoSFdORF9ERVNLVE9QLCBTUFRSX0FSUk9XLCBGQUxTRSkpOworCisgICAgICAgICAgaWYgKGJNb3VzZUNhcHR1cmVkKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIG1vdXNlCisgICAgICAgICAgICBXaW5TZXRDYXB0dXJlKEhXTkRfREVTS1RPUCwgaHduZCk7CisgICAgICAgICAgICBiTW91c2VDYXB0dXJlZCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiV01fQUNUSVZBVEUgZG9uZVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTV9CVVRUT04xRE9XTjoKKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgcHJpbnRmKCJXTV9CVVRUT04xRE9XTlxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICAgIHBWaWRlbyA9IEZTTGliX0dldFVzZXJQYXJtKGh3bmQpOworICAgICAgaWYgKHBWaWRlbykKKyAgICAgIHsKKyAgICAgICAgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfQlVUVE9OX0xFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7IC8vIERvbid0IHJlcG9ydCBtb3VzZSBtb3ZlbWVudCEKKworICAgICAgICBpZiAoYk1vdXNlQ2FwdHVyYWJsZSkKKyAgICAgICAgeworICAgICAgICAgIC8vIFdlIHNob3VsZCBjYXB0dXJlIHRoZSBtb3VzZSEKKyAgICAgICAgICBpZiAoIWJNb3VzZUNhcHR1cmVkKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBod25kKTsKKyAgICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBOVUxMKTsKKyAgICAgICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKKyAgICAgICAgICAgICAgUE9JTlRMIHB0bDsKKyAgICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCisgICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKKyAgICAgICAgICAgICAgcHRsLnggPSAwOyBwdGwueSA9IDA7CisgICAgICAgICAgICAgIFdpbk1hcFdpbmRvd1BvaW50cyhwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgSFdORF9ERVNLVE9QLCAmcHRsLCAxKTsKKyAgICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLworICAgICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9CVVRUT04xVVA6CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiV01fQlVUVE9OMVVQXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfQlVUVE9OX0xFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOyAvLyBEb24ndCByZXBvcnQgbW91c2UgbW92ZW1lbnQhCisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX0JVVFRPTjJET1dOOgorI2lmZGVmIERFQlVHX0JVSUxECisgICAgICBwcmludGYoIldNX0JVVFRPTjJET1dOXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7CisgICAgICBpZiAocFZpZGVvKQorICAgICAgeworICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9CVVRUT05fUklHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7IC8vIERvbid0IHJlcG9ydCBtb3VzZSBtb3ZlbWVudCEKKworICAgICAgICBpZiAoYk1vdXNlQ2FwdHVyYWJsZSkKKyAgICAgICAgeworICAgICAgICAgIC8vIFdlIHNob3VsZCBjYXB0dXJlIHRoZSBtb3VzZSEKKyAgICAgICAgICBpZiAoIWJNb3VzZUNhcHR1cmVkKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBod25kKTsKKyAgICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBOVUxMKTsKKyAgICAgICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKKyAgICAgICAgICAgICAgUE9JTlRMIHB0bDsKKyAgICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCisgICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKKyAgICAgICAgICAgICAgcHRsLnggPSAwOyBwdGwueSA9IDA7CisgICAgICAgICAgICAgIFdpbk1hcFdpbmRvd1BvaW50cyhwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgSFdORF9ERVNLVE9QLCAmcHRsLCAxKTsKKyAgICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLworICAgICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX0JVVFRPTjJVUDoKKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgcHJpbnRmKCJXTV9CVVRUT04yVVBcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9CVVRUT05fUklHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOyAvLyBEb24ndCByZXBvcnQgbW91c2UgbW92ZW1lbnQhCisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX0JVVFRPTjNET1dOOgorI2lmZGVmIERFQlVHX0JVSUxECisgICAgICBwcmludGYoIldNX0JVVFRPTjNET1dOXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7CisgICAgICBpZiAocFZpZGVvKQorICAgICAgeworICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9CVVRUT05fTUlERExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOyAvLyBEb24ndCByZXBvcnQgbW91c2UgbW92ZW1lbnQhCisgICAgICAgIAorICAgICAgICBpZiAoYk1vdXNlQ2FwdHVyYWJsZSkKKyAgICAgICAgeworICAgICAgICAgIC8vIFdlIHNob3VsZCBjYXB0dXJlIHRoZSBtb3VzZSEKKyAgICAgICAgICBpZiAoIWJNb3VzZUNhcHR1cmVkKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBod25kKTsKKyAgICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBOVUxMKTsKKyAgICAgICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKKyAgICAgICAgICAgICAgUE9JTlRMIHB0bDsKKyAgICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCisgICAgICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKKyAgICAgICAgICAgICAgcHRsLnggPSAwOyBwdGwueSA9IDA7CisgICAgICAgICAgICAgIFdpbk1hcFdpbmRvd1BvaW50cyhwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgSFdORF9ERVNLVE9QLCAmcHRsLCAxKTsKKyAgICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLworICAgICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9CVVRUT04zVVA6CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiV01fQlVUVE9OM1VQXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfQlVUVE9OX01JRERMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7IC8vIERvbid0IHJlcG9ydCBtb3VzZSBtb3ZlbWVudCEKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fTU9VU0VNT1ZFOgorI2lmZGVmIERFQlVHX0JVSUxECisvLyAgICAgIHByaW50ZigiV01fTU9VU0VNT1ZFXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7CisgICAgICBpZiAocFZpZGVvKQorICAgICAgeworICAgICAgICBpZiAocFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUpCisgICAgICAgIHsKKyAgICAgICAgICBwVmlkZW8tPmhpZGRlbi0+aVNraXBXTU1PVVNFTU9WRS0tOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFBPSU5UUyAqcHB0cyA9IChQT0lOVFMgKikgKCZtcDEpOworICAgICAgICAgIFBPSU5UTCBwdGw7CisKKyAgICAgICAgICBpZiAoYk1vdXNlQ2FwdHVyZWQpCisgICAgICAgICAgeworICAgICAgICAgICAgU1dQIHN3cENsaWVudDsKKworICAgICAgICAgICAgV2luUXVlcnlXaW5kb3dQb3MocFZpZGVvLT5oaWRkZW4tPmh3bmRDbGllbnQsICZzd3BDbGllbnQpOworCisgICAgICAgICAgICAvLyBTZW5kIHJlbGF0aXZlIG1vdXNlIHBvc2l0aW9uLCBhbmQgcmUtY2VudGVyIHRoZSBtb3VzZQorICAgICAgICAgICAgLy8gUmVwb3NpdGlvbiB0aGUgbW91c2UgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuL3dpbmRvdworICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAvLyBCdXR0b25zIG5vdCBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8vIFJlbGF0aXZlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwdHMtPnggLSAoc3dwQ2xpZW50LmN4LzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3dwQ2xpZW50LmN5LzIpIC0gcHB0cy0+eSk7CisKKyAgICAgICAgICAgIHB0bC54ID0gMDsgcHRsLnkgPSAwOworICAgICAgICAgICAgV2luTWFwV2luZG93UG9pbnRzKHBWaWRlby0+aGlkZGVuLT5od25kQ2xpZW50LCBIV05EX0RFU0tUT1AsICZwdGwsIDEpOworICAgICAgICAgICAgcFZpZGVvLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLworICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCisgICAgICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRsLnggKyBzd3BDbGllbnQuY3gvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRsLnkgKyBzd3BDbGllbnQuY3kvMik7CisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgQ09OVkVSVE1PVVNFUE9TSVRJT04oKTsKKworICAgICAgICAgICAgLy8gU2VuZCBhYnNvbHV0ZSBtb3VzZSBwb3NpdGlvbgorICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAvLyBCdXR0b25zIG5vdCBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIEFic29sdXRlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwdHMtPngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwdHMtPnkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKHBWaWRlby0+aGlkZGVuLT5pTW91c2VWaXNpYmxlKSAmJiAoIWJNb3VzZUNhcHR1cmVkKSkKKyAgICAgICAgeworI2lmZGVmIERFQlVHX0JVSUxECisvLyAgICAgICAgICBwcmludGYoIldNX01PVVNFTU9WRSA6IHB0ciA9ICVwXG4iLCBocHRyR2xvYmFsUG9pbnRlcik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICAgICAgICBpZiAoaHB0ckdsb2JhbFBvaW50ZXIpCisgICAgICAgICAgICBXaW5TZXRQb2ludGVyKEhXTkRfREVTS1RPUCwgaHB0ckdsb2JhbFBvaW50ZXIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBXaW5RdWVyeVN5c1BvaW50ZXIoSFdORF9ERVNLVE9QLCBTUFRSX0FSUk9XLCBGQUxTRSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorI2lmZGVmIERFQlVHX0JVSUxECisvLyAgICAgIHByaW50ZigiV01fTU9VU0VNT1ZFIGRvbmVcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisgICAgICByZXR1cm4gKE1SRVNVTFQpIEZBTFNFOworICAgIGNhc2UgV01fQ0xPU0U6IC8vIFdpbmRvdyBjbG9zZQorI2lmZGVmIERFQlVHX0JVSUxECisgICAgICBwcmludGYoIldNX0NMT1NFXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7CisgICAgICBpZiAocFZpZGVvKQorICAgICAgeworICAgICAgICAvLyBTZW5kIFF1aXQgbWVzc2FnZSB0byB0aGUgU0RMIGFwcGxpY2F0aW9uIQorICAgICAgICBTRExfUHJpdmF0ZVF1aXQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBicmVhazsKKworI2lmZGVmIEJJVEJMVF9JTl9XSU5NRVNTQUdFUFJPQworICAgIGNhc2UgV01fVVBEQVRFUkVDVFNSRVFVRVNUOgorICAgICAgcFZpZGVvID0gRlNMaWJfR2V0VXNlclBhcm0oaHduZCk7CisgICAgICBpZiAoKHBWaWRlbykgJiYgKHBWaWRlby0+aGlkZGVuLT5wU0RMU3VyZmFjZSkpCisgICAgICB7CisgICAgICAgIGlmIChEb3NSZXF1ZXN0TXV0ZXhTZW0ocFZpZGVvLT5oaWRkZW4tPmhtdHhVc2VTcmNCdWZmZXIsIFNFTV9JTkRFRklOSVRFX1dBSVQpPT1OT19FUlJPUikKKyAgICAgICAgeworICAgICAgICAgIGludCBudW1yZWN0czsKKyAgICAgICAgICBTRExfUmVjdCAqcmVjdHM7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgU1dQIHN3cDsKKworICAgICAgICAgIG51bXJlY3RzID0gKGludCkgbXAxOworICAgICAgICAgIHJlY3RzID0gKFNETF9SZWN0ICopIG1wMjsKKworICAgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKGh3bmQsICZzd3ApOworI2lmbmRlZiBSRVNJWkVfRVZFTl9JRl9SRVNJWkFCTEUKKyAgICAgICAgICBpZiAoKCFwVmlkZW8tPmhpZGRlbi0+cFNETFN1cmZhY2UpIHx8CisgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgIChwVmlkZW8tPmhpZGRlbi0+cFNETFN1cmZhY2UpICYmCisgICAgICAgICAgICAgICAocFZpZGVvLT5oaWRkZW4tPnBTRExTdXJmYWNlLT5mbGFncyAmIFNETF9SRVNJWkFCTEUpICYmCisgICAgICAgICAgICAgICAoKHN3cC5jeCAhPSBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uKSB8fAorICAgICAgICAgICAgICAgIChzd3AuY3kgIT0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbikKKyAgICAgICAgICAgICAgICkgJiYKKyAgICAgICAgICAgICAgICghRlNMaWJfUXVlcnlGU01vZGUoaHduZCkpCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICApCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gUmVzaXphYmxlIHN1cmZhY2UgYW5kIGluIHJlc2l6aW5nIQorICAgICAgICAgICAgLy8gU28sIGRvbid0IGJsaXQgbm93IQorI2lmZGVmIERFQlVHX0JVSUxECisgICAgICAgICAgICBwcmludGYoIltXTV9VUERBVEVSRUNUU1JFUVVFU1RdIDogU2tpcHBpbmcgYmxpdCB3aGlsZSByZXNpemluZyFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgICAgICAgICBwcmludGYoIltXTV9VUERBVEVSRUNUU1JFUVVFU1RdIDogQmxpdHRpbmchXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEJsaXQgdGhlIGNoYW5nZWQgYXJlYXMKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPG51bXJlY3RzOyBpKyspCisgICAgICAgICAgICAgIEZTTElCX0JJVEJMVChod25kLCBwVmlkZW8tPmhpZGRlbi0+cGNoU3JjQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdHNbaV0ueSwgcmVjdHNbaV0ueCwgcmVjdHNbaV0udywgcmVjdHNbaV0uaCk7CisgICAgICAgICAgfQorICAgICAgICAgIERvc1JlbGVhc2VNdXRleFNlbShwVmlkZW8tPmhpZGRlbi0+aG10eFVzZVNyY0J1ZmZlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworI2VuZGlmCisKKyAgICBkZWZhdWx0OgorI2lmZGVmIERFQlVHX0JVSUxECisgICAgICBwcmludGYoIlVuaGFuZGxlZDogJXhcbiIsIG1zZyk7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICAgIGJyZWFrOworICB9CisgIC8vIFJ1biB0aGUgZGVmYXVsdCB3aW5kb3cgcHJvY2VkdXJlIGZvciB1bmhhbmRsZWQgc3R1ZmZzCisgIHJldHVybiBXaW5EZWZXaW5kb3dQcm9jKGh3bmQsIG1zZywgbXAxLCBtcDIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBGcmFtZVduZFByb2MKKy8vCisvLyBUaGlzIGlzIHRoZSBtZXNzYWdlIHByb2Nlc3Npbmcgd2luZG93IHByb2NlZHVyZSBmb3IgdGhlCisvLyBmcmFtZSB3aW5kb3cgb2YgU0RMV2luZG93Q2xhc3MuCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdGF0aWMgTVJFU1VMVCBFWFBFTlRSWSBGcmFtZVduZFByb2MoIEhXTkQgaHduZCwgVUxPTkcgbXNnLCBNUEFSQU0gbXAxLCBNUEFSQU0gbXAyKQoreworICBQRk5XUCBwT2xkRnJhbWVQcm9jOworICBNUkVTVUxUIHJlc3VsdDsKKyAgUFRSQUNLSU5GTyB0aTsKKyAgaW50IGN4LCBjeSwgbmN4LCBuY3k7CisgIFJFQ1RMIHJjbFRlbXA7CisgIFBTV1AgcHN3cFRlbXA7CisKKyAgU0RMX1ZpZGVvRGV2aWNlICpwVmlkZW8gPSBOVUxMOworCisgIHBWaWRlbyA9IChTRExfVmlkZW9EZXZpY2UgKikgV2luUXVlcnlXaW5kb3dVTG9uZyhod25kLCBRV0xfVVNFUik7CisKKyAgcE9sZEZyYW1lUHJvYyA9IHBWaWRlby0+aGlkZGVuLT5wZm5PbGRGcmFtZVByb2M7CisKKyAgaWYgKChwVmlkZW8tPmhpZGRlbi0+YlByb3BvcnRpb25hbFJlc2l6ZSkgJiYKKyAgICAgIChtc2c9PVdNX0FESlVTVFdJTkRPV1BPUykgJiYKKyAgICAgICghRlNMaWJfUXVlcnlGU01vZGUocFZpZGVvLT5oaWRkZW4tPmh3bmRDbGllbnQpKQorICAgICApCisgIHsKKyAgICBwc3dwVGVtcCA9IChQU1dQKSBtcDE7CisKKyAgICAvKiBSZXNpemluZz8gKi8KKyAgICBpZiAocHN3cFRlbXAtPmZsICYgU1dQX1NJWkUpCisgICAgeworICAgICAgLyogQ2FsY3VsYXRlIGNsaWVudCBzaXplICovCisgICAgICByY2xUZW1wLnhMZWZ0ID0gcHN3cFRlbXAtPng7CisgICAgICByY2xUZW1wLnhSaWdodCA9IHBzd3BUZW1wLT54ICsgcHN3cFRlbXAtPmN4OworICAgICAgcmNsVGVtcC55Qm90dG9tID0gcHN3cFRlbXAtPnk7CisgICAgICByY2xUZW1wLnlUb3AgPSBwc3dwVGVtcC0+eSArIHBzd3BUZW1wLT5jeTsKKyAgICAgIFdpbkNhbGNGcmFtZVJlY3QoaHduZCwgJnJjbFRlbXAsIFRSVUUpOworCisgICAgICBuY3ggPSBjeCA9IHJjbFRlbXAueFJpZ2h0IC0gcmNsVGVtcC54TGVmdDsKKyAgICAgIG5jeSA9IGN5ID0gcmNsVGVtcC55VG9wIC0gcmNsVGVtcC55Qm90dG9tOworCisgICAgICAvKiBDYWxjdWxhdGUgbmV3IHNpemUgdG8ga2VlcCBpdCBwcm9wb3J0aW9uYWwgKi8KKworICAgICAgaWYgKChwVmlkZW8tPmhpZGRlbi0+dWxSZXNpemluZ0ZsYWcgJiBURl9MRUZUKSB8fCAocFZpZGVvLT5oaWRkZW4tPnVsUmVzaXppbmdGbGFnICYgVEZfUklHSFQpKQorICAgICAgeworICAgICAgICAvKiBUaGUgd2luZG93IGlzIHJlc2l6ZWQgaG9yaXpvbnRhbGx5ICovCisgICAgICAgIG5jeSA9IHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24gKiBjeCAvIHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb247CisgICAgICB9IGVsc2UKKyAgICAgIGlmICgocFZpZGVvLT5oaWRkZW4tPnVsUmVzaXppbmdGbGFnICYgVEZfVE9QKSB8fCAocFZpZGVvLT5oaWRkZW4tPnVsUmVzaXppbmdGbGFnICYgVEZfQk9UVE9NKSkKKyAgICAgIHsKKyAgICAgICAgLyogVGhlIHdpbmRvdyBpcyByZXNpemVkIHZlcnRpY2FsbHkgKi8KKyAgICAgICAgbmN4ID0gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbiAqIGN5IC8gcFZpZGVvLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbjsKKyAgICAgIH0KKworICAgICAgLyogQ2FsY3VsYXRlIGJhY2sgZnJhbWUgY29vcmRpbmF0ZXMgKi8KKyAgICAgIHJjbFRlbXAueExlZnQgPSBwc3dwVGVtcC0+eDsKKyAgICAgIHJjbFRlbXAueFJpZ2h0ID0gcHN3cFRlbXAtPnggKyBuY3g7CisgICAgICByY2xUZW1wLnlCb3R0b20gPSBwc3dwVGVtcC0+eTsKKyAgICAgIHJjbFRlbXAueVRvcCA9IHBzd3BUZW1wLT55ICsgbmN5OworICAgICAgV2luQ2FsY0ZyYW1lUmVjdChod25kLCAmcmNsVGVtcCwgRkFMU0UpOworCisgICAgICAvKiBTdG9yZSBuZXcgc2l6ZS9wb3NpdGlvbiBpbmZvICovCisgICAgICBwc3dwVGVtcC0+Y3ggPSByY2xUZW1wLnhSaWdodCAtIHJjbFRlbXAueExlZnQ7CisKKyAgICAgIGlmICghKHBWaWRlby0+aGlkZGVuLT51bFJlc2l6aW5nRmxhZyAmIFRGX1RPUCkpCisgICAgICB7CisgICAgICAgIHBzd3BUZW1wLT55ID0gcHN3cFRlbXAtPnkgKyBwc3dwVGVtcC0+Y3kgLSAocmNsVGVtcC55VG9wIC0gcmNsVGVtcC55Qm90dG9tKTsKKyAgICAgICAgcHN3cFRlbXAtPmN5ID0gcmNsVGVtcC55VG9wIC0gcmNsVGVtcC55Qm90dG9tOworICAgICAgfSBlbHNlCisgICAgICB7CisgICAgICAgIHBzd3BUZW1wLT5jeSA9IHJjbFRlbXAueVRvcCAtIHJjbFRlbXAueUJvdHRvbTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXN1bHQgPSAoKnBPbGRGcmFtZVByb2MpKGh3bmQsIG1zZywgbXAxLCBtcDIpOworCisgIGlmICgocFZpZGVvLT5oaWRkZW4tPmJQcm9wb3J0aW9uYWxSZXNpemUpICYmIChtc2c9PVdNX1FVRVJZVFJBQ0tJTkZPKSkKKyAgeworICAgIHRpID0gKFBUUkFDS0lORk8pIG1wMjsKKworICAgIC8qIFN0b3JlIHRoZSBkaXJlY3Rpb24gb2YgcmVzaXppbmcgKi8KKyAgICBpZiAoKHRpLT5mcyAmIFRGX0xFRlQpIHx8ICh0aS0+ZnMgJiBURl9SSUdIVCkgfHwKKyAgICAgICAgKHRpLT5mcyAmIFRGX1RPUCkgfHwgKHRpLT5mcyAmIFRGX0JPVFRPTSkpCisgICAgICBwVmlkZW8tPmhpZGRlbi0+dWxSZXNpemluZ0ZsYWcgPSB0aS0+ZnM7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBQTVRocmVhZEZ1bmMKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIFBNLVRocmVhZCwgd2hpY2ggaW5pdGlhbGl6ZXMgdGhlCisvLyBhcHBsaWNhdGlvbiB3aW5kb3cgaXRzZWxmLCB0aGUgRElWRSwgYW5kIHN0YXJ0IG1lc3NhZ2UgcHJvY2Vzc2luZy4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2ludCBpTnVtT2ZQTVRocmVhZEluc3RhbmNlcyA9IDA7IC8vIEdsb2JhbCEKK3N0YXRpYyB2b2lkIFBNVGhyZWFkRnVuYyh2b2lkICpwUGFybSkKK3sKKyAgU0RMX1ZpZGVvRGV2aWNlICpwVmlkZW8gPSBwUGFybTsKKyAgSEFCIGhhYjsKKyAgSE1RIGhtcTsKKyAgUU1TRyBtc2c7CisgIFVMT05HIGZjZjsKKworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBTdGFydGluZ1xuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgaU51bU9mUE1UaHJlYWRJbnN0YW5jZXMrKzsKKworICAvLyBJbml0aWFsaXplIFBNLCBjcmVhdGUgYSBtZXNzYWdlIHF1ZXVlLgorCisgIGhhYj1XaW5Jbml0aWFsaXplKDApOworICBobXE9V2luQ3JlYXRlTXNnUXVldWUoaGFiLDApOworICBpZiAoaG1xPT0wKQorICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogQ291bGQgbm90IGNyZWF0ZSBtZXNzYWdlIHF1ZXVlIVxuIik7CisgICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgIEl0IG1pZ2h0IGJlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIFNETCBpcyBub3QgYSBQTSBhcHAhXG4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgIHBWaWRlby0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMgPSAyOworICB9IGVsc2UKKyAgeworICAgIGludCByYzsKKyAgICBSRUNUTCByZWN0bDsKKworICAgIGZjZiA9IHVsRkNGVG9Vc2U7IC8vIEdldCBmcm9tIGdsb2JhbCBzZXR0aW5nCisKKyNpZmRlZiBERUJVR19CVUlMRAorICAgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBGU0xpYl9DcmVhdGVXaW5kb3coKSFcbiIpOworICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICByYyA9IEZTTGliX0NyZWF0ZVdpbmRvdyhIV05EX0RFU0tUT1AsIDAsICZmY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNETCBBcHBsaWNhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTEhBTkRMRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBWaWRlby0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXbmRQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFZpZGVvLT5oaWRkZW4tPmh3bmRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFZpZGVvLT5oaWRkZW4tPmh3bmRGcmFtZSkpOworCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogRlNMaWJfQ3JlYXRlV2luZG93KCkgcmMgPSAlZFxuIiwgcmMpOworICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICBpZiAoIXJjKQorICAgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgcHJpbnRmKCJbUE1UaHJlYWRGdW5jXSA6IENvdWxkIG5vdCBjcmVhdGUgRlNMaWIgd2luZG93IVxuIik7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgcFZpZGVvLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyA9IDM7CisgICAgfSBlbHNlCisgICAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogRlNMaWJfQWRkVXNlclBhcm0oKSFcbiIpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgICAgLy8gU3RvcmUgcFZpZGVvIHBvaW50ZXIgaW4gd2luZG93IGRhdGEgZm9yIGNsaWVudCB3aW5kb3csIHNvCisgICAgICAvLyBpdCB3aWxsIGtub3cgdGhlIGluc3RhbmNlIHRvIHdoaWNoIGl0IGJlbG9uZ3MgdG8uCisgICAgICBGU0xpYl9BZGRVc2VyUGFybShwVmlkZW8tPmhpZGRlbi0+aHduZENsaWVudCwgcFZpZGVvKTsKKworICAgICAgLy8gTm93IHNldCBkZWZhdWx0IGltYWdlIHdpZHRoIGhlaWdodCBhbmQgZm91cmNjIQorI2lmZGVmIERFQlVHX0JVSUxECisgICAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogU2V0V2luZG93UG9zKCkhXG4iKTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICAgIC8vIFNldCB0aGUgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIG1haW4gd2luZG93LAorICAgICAgLy8gYW5kIG1ha2UgaXQgdmlzaWJsZSEKKyAgICAgIC8vIENhbGN1bGF0ZSBmcmFtZSB3aW5kb3cgc2l6ZSBmcm9tIGNsaWVudCB3aW5kb3cgc2l6ZQorICAgICAgcmVjdGwueExlZnQgPSAwOworICAgICAgcmVjdGwueUJvdHRvbSA9IDA7CisgICAgICByZWN0bC54UmlnaHQgPSBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uOyAvLyBOb25pbmNsdXNpdmUKKyAgICAgIHJlY3RsLnlUb3AgPSBwVmlkZW8tPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uOyAvLyBOb25pbmNsdXNpdmUKKyAgICAgIFdpbkNhbGNGcmFtZVJlY3QocFZpZGVvLT5oaWRkZW4tPmh3bmRGcmFtZSwgJnJlY3RsLCBGQUxTRSk7CisKKyAgICAgIFNldEFjY2Vzc2FibGVXaW5kb3dQb3MocFZpZGVvLT5oaWRkZW4tPmh3bmRGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORF9UT1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaW5RdWVyeVN5c1ZhbHVlIChIV05EX0RFU0tUT1AsIFNWX0NYU0NSRUVOKSAtIChyZWN0bC54UmlnaHQtcmVjdGwueExlZnQpKSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaW5RdWVyeVN5c1ZhbHVlIChIV05EX0RFU0tUT1AsIFNWX0NZU0NSRUVOKSAtIChyZWN0bC55VG9wLXJlY3RsLnlCb3R0b20pKSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWN0bC54UmlnaHQtcmVjdGwueExlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVjdGwueVRvcC1yZWN0bC55Qm90dG9tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX1NJWkUgfCBTV1BfQUNUSVZBVEUgfCBTV1BfU0hPVyB8IFNXUF9NT1ZFKTsKKworICAgICAgLy8gU3ViY2xhc3MgZnJhbWUgcHJvY2VkdXJlIGFuZCBzdG9yZSBvbGQgd2luZG93IHByb2MgYWRkcmVzcworICAgICAgcFZpZGVvLT5oaWRkZW4tPnBmbk9sZEZyYW1lUHJvYyA9CisgICAgICAgIFdpblN1YmNsYXNzV2luZG93KHBWaWRlby0+aGlkZGVuLT5od25kRnJhbWUsIEZyYW1lV25kUHJvYyk7CisgICAgICBXaW5TZXRXaW5kb3dVTG9uZyhwVmlkZW8tPmhpZGRlbi0+aHduZEZyYW1lLCBRV0xfVVNFUiwgKFVMT05HKSBwVmlkZW8pOworCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBFbnRlcmluZyBtZXNzYWdlIGxvb3BcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgcFZpZGVvLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyA9IDE7CisgIAorICAgICAgd2hpbGUgKFdpbkdldE1zZyhoYWIsIChQUU1TRykmbXNnLCAwLCAwLCAwKSkKKyAgICAgICAgV2luRGlzcGF0Y2hNc2coaGFiLCAoUFFNU0cpICZtc2cpOworCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBMZWF2aW5nIG1lc3NhZ2UgbG9vcFxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgICAvLyBXZSBzaG91bGQgcmVsZWFzZSB0aGUgY2FwdHVyZWQgdGhlIG1vdXNlIQorICAgICAgaWYgKGJNb3VzZUNhcHR1cmVkKQorICAgICAgeworICAgICAgICBXaW5TZXRDYXB0dXJlKEhXTkRfREVTS1RPUCwgTlVMTEhBTkRMRSk7CisgICAgICAgIGJNb3VzZUNhcHR1cmVkID0gMDsKKyAgICAgIH0KKyAgICAgIC8vIERlc3Ryb3kgb3VyIHdpbmRvdworICAgICAgV2luRGVzdHJveVdpbmRvdyhwVmlkZW8tPmhpZGRlbi0+aHduZEZyYW1lKTsgcFZpZGVvLT5oaWRkZW4tPmh3bmRGcmFtZT1OVUxMOworICAgICAgLy8gU2hvdyBwb2ludGVyIHRvIG1ha2Ugc3VyZSBpdCB3aWxsIG5vdCBiZSBsZWZ0IGhpZGRlbi4KKyAgICAgIFdpblNldFBvaW50ZXIoSFdORF9ERVNLVE9QLCBXaW5RdWVyeVN5c1BvaW50ZXIoSFdORF9ERVNLVE9QLCBTUFRSX0FSUk9XLCBGQUxTRSkpOworICAgICAgV2luU2hvd1BvaW50ZXIoSFdORF9ERVNLVE9QLCBUUlVFKTsKKyAgICB9CisgICAgLy8gVW5pbml0aWFsaXplIFBNCisgICAgV2luRGVzdHJveU1zZ1F1ZXVlKGhtcSk7CisgICAgLy8gQWxsIGRvbmUhCisgICAgcFZpZGVvLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyA9IDA7CisgIH0KKyAgV2luVGVybWluYXRlKGhhYik7CisgIC8qIENvbW1lbnRlZCBvdXQsIHNob3VsZCBub3QgYmUgbmVlZGVkIGFueW1vcmUsIGJlY2F1c2Ugd2Ugc2VuZCBpdAorICAgICBmcm9tIFdNX0NMT1NFLgorICAvLyBOb3RpZnkgU0RMIHRoYXQgaXQgc2hvdWxkIHJlYWxseSBkaWUgbm93Li4uCisgIFNETF9Qcml2YXRlUXVpdCgpOyBTRExfUHJpdmF0ZVF1aXQoKTsgU0RMX1ByaXZhdGVRdWl0KCk7IC8vLi4uIDopKQorICAqLworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBFbmQsIHN0YXR1cyBpcyAlZCFcbiIsIHBWaWRlby0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisgIGlOdW1PZlBNVGhyZWFkSW5zdGFuY2VzLS07CisKKyAgLy8gSEFDSyB0byBwcmV2ZW50IHpvbWJpZSBhbmQgaGFuZ2luZyBTREwgYXBwbGljYXRpb25zLCB3aGljaCBkb2VzIG5vdCB0YWtlCisgIC8vIGNhcmUgb2YgY2xvc2luZyB0aGUgd2luZG93IGZvciBzb21lIHJlYXNvbjoKKyAgLy8gVGhlcmUgYXJlIHNvbWUgYXBwcyB3aGljaCBkbyBub3QgcHJvY2VzcyBtZXNzYWdlcywgc28gZG8gYSBsb3Qgb2YgdGhpbmdzCisgIC8vIHdpdGhvdXQgbm90aWNpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGNsb3NlLiBUbyBjbG9zZSB0aGVzZSwKKyAgLy8gSSd2ZSB0aG91Z2h0IGFib3V0IHRoZSBmb2xsb3dpbmc6CisgIC8vIElmIHRoZSB3aW5kb3cgaXMgY2xvc2VkICh0aGUgZXhlY3V0aW9uIGNhbWUgaGVyZSksIEkgd2FpdCBhIGJpdCB0bworICAvLyBnaXZlIHRpbWUgdG8gdGhlIGFwcCB0byBmaW5pc2ggaXRzIGV4ZWN1dGlvbi4gSWYgaXQgZG9lcyBub3QsIEkga2lsbCBpdAorICAvLyB1c2luZyBEb3NFeGl0KCkuIEJydXRlIGZvcmNlLCBidXQgc2hvdWxkIHdvcmsuCisgIGlmIChwVmlkZW8tPmhpZGRlbi0+aVBNVGhyZWFkU3RhdHVzPT0wKQorICB7CisgICAgRG9zU2xlZXAoNTAwMCk7IC8vIFdhaXQgNSBzZWNzCisgICAgLy8gSWYgYSBuZXcgUE0gdGhyZWFkIGhhcyBiZWVuIHNwYXduZWQgKHJlaW5pdGlhbGl6aW5nIHZpZGVvIG1vZGUpLCB0aGVuIGFsbCByaWdodC4KKyAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgYSBwcm9ibGVtLCB0aGUgYXBwIGRvZXNuJ3Qgd2FudCB0byBzdG9wLiBLaWxsIQorICAgIGlmIChpTnVtT2ZQTVRocmVhZEluc3RhbmNlcz09MCkKKyAgICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiW1BNVGhyZWFkRnVuY10gOiBJdCBzZWVtcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBoYXZlbid0IHRlcm1pbmF0ZWQgaXRzZWxmXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgICBwcmludGYoIltQTVRocmVhZEZ1bmNdIDogaW4gdGhlIGxhc3QgNSBzZWNvbmRzLCBzbyB3ZSBnbyBiZXJzZXJrLlxuIik7IGZmbHVzaChzdGRvdXQpOworICAgICAgcHJpbnRmKCJbUE1UaHJlYWRGdW5jXSA6IEJydXRlIGZvcmNlIG1vZGUuIDopIEtpbGxpbmcgcHJvY2VzcyEgRGllZWVlZS4uLlxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgICBEb3NFeGl0KEVYSVRfUFJPQ0VTUywgLTEpOworICAgIH0KKyAgfQorICBfZW5kdGhyZWFkKCk7Cit9CisKK3N0cnVjdCBXTWN1cnNvcgoreworICBIQklUTUFQIGhibTsKKyAgSFBPSU5URVIgaHB0cjsKKyAgY2hhciAqcGNoRGF0YTsKK307CisKKy8qIEZyZWUgYSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK3ZvaWQgb3MyZnNsaWJfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQoreworICBpZiAoY3Vyc29yKQorICB7CisgICAgR3BpRGVsZXRlQml0bWFwKGN1cnNvci0+aGJtKTsKKyAgICBXaW5EZXN0cm95UG9pbnRlcihjdXJzb3ItPmhwdHIpOworICAgIFNETF9mcmVlKGN1cnNvci0+cGNoRGF0YSk7CisgICAgU0RMX2ZyZWUoY3Vyc29yKTsKKyAgfQorfQorCisvKiBMb2NhbCBmdW5jdGlvbnMgdG8gY29udmVydCB0aGUgU0RMIGN1cnNvciBtYXNrIGludG8gT1MvMiBmb3JtYXQgKi8KK3N0YXRpYyB2b2lkIG1lbW5vdChVaW50OCAqZHN0LCBVaW50OCAqc3JjLCBpbnQgbGVuKQoreworICB3aGlsZSAoIGxlbi0tID4gMCApCisgICAgKmRzdCsrID0gfipzcmMrKzsKK30KK3N0YXRpYyB2b2lkIG1lbXhvcihVaW50OCAqZHN0LCBVaW50OCAqc3JjMSwgVWludDggKnNyYzIsIGludCBsZW4pCit7CisgIHdoaWxlICggbGVuLS0gPiAwICkKKyAgICAqZHN0KysgPSAoKnNyYzErKyleKCpzcmMyKyspOworfQorCisvKiBDcmVhdGUgYSBibGFjay93aGl0ZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK1dNY3Vyc29yICpvczJmc2xpYl9DcmVhdGVXTUN1cnNvcl9XaW4oX1RISVMsIFVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKK3sKKyAgSFBPSU5URVIgaHB0cjsKKyAgSEJJVE1BUCBoYm07CisgIEJJVE1BUElORk9IRUFERVIgYm1paDsKKyAgQk1QSU5GTyAgICAgICAgICBibWk7CisgIEhQUyAgICAgICAgICAgICAgaHBzOworICBjaGFyICpwY2hUZW1wOworICBjaGFyICp4cHRyLCAqYXB0cjsKKyAgaW50IG1heHgsIG1heHk7CisgIGludCBpLCBydW4sIHBhZDsKKyAgV01jdXJzb3IgKnBSZXN1bHQ7CisKKyAgbWF4eCA9IFdpblF1ZXJ5U3lzVmFsdWUoSFdORF9ERVNLVE9QLCBTVl9DWFBPSU5URVIpOworICBtYXh5ID0gV2luUXVlcnlTeXNWYWx1ZShIV05EX0RFU0tUT1AsIFNWX0NZUE9JTlRFUik7CisKKyAgLy8gQ2hlY2sgZm9yIG1heCBzaXplIQorICBpZiAoKHc+bWF4eCkgfHwgKGg+bWF4eSkpCisgICAgcmV0dXJuIChXTWN1cnNvciAqKSBOVUxMOworCisgIHBSZXN1bHQgPSAoV01jdXJzb3IgKikgU0RMX21hbGxvYyhzaXplb2YoV01jdXJzb3IpKTsKKyAgaWYgKCFwUmVzdWx0KSByZXR1cm4gKFdNY3Vyc29yICopIE5VTEw7CisKKyAgcGNoVGVtcCA9IChjaGFyICopIFNETF9tYWxsb2MoKG1heHggKyA3KS84ICogbWF4eSoyKTsKKyAgaWYgKCFwY2hUZW1wKQorICB7CisgICAgU0RMX2ZyZWUocFJlc3VsdCk7CisgICAgcmV0dXJuIChXTWN1cnNvciAqKSBOVUxMOworICB9CisKKyAgU0RMX21lbXNldChwY2hUZW1wLCAwLCAobWF4eCArIDcpLzggKiBtYXh5KjIpOworCisgIGhwcyA9IFdpbkdldFBTKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQpOworCisgIGJtaS5jYkZpeCA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgYm1pLmN4ID0gbWF4eDsKKyAgYm1pLmN5ID0gMiptYXh5OworICBibWkuY1BsYW5lcyA9IDE7CisgIGJtaS5jQml0Q291bnQgPSAxOworICBibWkuYXJnYkNvbG9yWzBdLmJCbHVlID0gMHgwMDsKKyAgYm1pLmFyZ2JDb2xvclswXS5iR3JlZW4gPSAweDAwOworICBibWkuYXJnYkNvbG9yWzBdLmJSZWQgPSAweDAwOworICBibWkuYXJnYkNvbG9yWzFdLmJCbHVlID0gMHgwMDsKKyAgYm1pLmFyZ2JDb2xvclsxXS5iR3JlZW4gPSAweDAwOworICBibWkuYXJnYkNvbG9yWzFdLmJSZWQgPSAweGZmOworCisgIFNETF9tZW1zZXQoJmJtaWgsIDAsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7CisgIGJtaWguY2JGaXggPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CisgIGJtaWguY3ggPSBtYXh4OworICBibWloLmN5ID0gMiptYXh5OworICBibWloLmNQbGFuZXMgPSAxOworICBibWloLmNCaXRDb3VudCA9IDE7CisKKyAgcnVuID0gKHcrNykvODsKKyAgcGFkID0gKG1heHgrNykvOCAtIHJ1bjsKKworICBmb3IgKGk9MDsgaTxoOyBpKyspCisgIHsKKyAgICB4cHRyID0gcGNoVGVtcCArIChtYXh4KzcpLzggKiAobWF4eS0xLWkpOworICAgIGFwdHIgPSBwY2hUZW1wICsgKG1heHgrNykvOCAqIChtYXh5K21heHktMS1pKTsKKyAgICBtZW14b3IoeHB0ciwgZGF0YSwgbWFzaywgcnVuKTsKKyAgICB4cHRyICs9IHJ1bjsKKyAgICBkYXRhICs9IHJ1bjsKKyAgICBtZW1ub3QoYXB0ciwgbWFzaywgcnVuKTsKKyAgICBtYXNrICs9IHJ1bjsKKyAgICBhcHRyICs9IHJ1bjsKKyAgICBTRExfbWVtc2V0KHhwdHIsICAwLCBwYWQpOworICAgIHhwdHIgKz0gcGFkOworICAgIFNETF9tZW1zZXQoYXB0ciwgfjAsIHBhZCk7CisgICAgYXB0ciArPSBwYWQ7CisgIH0KKyAgcGFkICs9IHJ1bjsKKyAgZm9yIChpPWggOyBpPG1heHk7IGkrKyApCisgIHsKKyAgICB4cHRyID0gcGNoVGVtcCArIChtYXh4KzcpLzggKiAobWF4eS0xLWkpOworICAgIGFwdHIgPSBwY2hUZW1wICsgKG1heHgrNykvOCAqIChtYXh5K21heHktMS1pKTsKKworICAgIFNETF9tZW1zZXQoeHB0ciwgIDAsIChtYXh4KzcpLzgpOworICAgIHhwdHIgKz0gKG1heHgrNykvODsKKyAgICBTRExfbWVtc2V0KGFwdHIsIH4wLCAobWF4eCs3KS84KTsKKyAgICBhcHRyICs9IChtYXh4KzcpLzg7CisgIH0KKworICBoYm0gPSBHcGlDcmVhdGVCaXRtYXAoaHBzLCAoUEJJVE1BUElORk9IRUFERVIyKSZibWloLCBDQk1fSU5JVCwgKFBCWVRFKSBwY2hUZW1wLCAoUEJJVE1BUElORk8yKSZibWkpOworICBocHRyID0gV2luQ3JlYXRlUG9pbnRlcihIV05EX0RFU0tUT1AsIGhibSwgVFJVRSwgaG90X3gsIG1heHkgLSBob3RfeSAtIDEpOworCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgcHJpbnRmKCJIb3RTcG90ICAgICAgICAgIDogJWQgOyAlZFxuIiwgaG90X3gsIGhvdF95KTsKKyAgcHJpbnRmKCJIUFMgcmV0dXJuZWQgICAgIDogJXhcbiIsIChVTE9ORylocHMpOworICBwcmludGYoIkhCSVRNQVAgcmV0dXJuZWQgOiAleFxuIiwgKFVMT05HKWhibSk7CisgIHByaW50ZigiSFBPSU5URVIgcmV0dXJuZWQ6ICV4XG4iLCAoVUxPTkcpaHB0cik7CisjZW5kaWYKKworICBXaW5SZWxlYXNlUFMoaHBzKTsKKworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW0NyZWF0ZVdNQ3Vyc29yXSA6IHB0ciA9ICVwXG4iLCBocHRyKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICBwUmVzdWx0LT5ocHRyID0gaHB0cjsKKyAgcFJlc3VsdC0+aGJtID0gaGJtOworICBwUmVzdWx0LT5wY2hEYXRhID0gcGNoVGVtcDsKKworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW0NyZWF0ZVdNQ3Vyc29yXSA6IHB0ciA9ICVwIHJldHVybi5cbiIsIGhwdHIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisgIHJldHVybiAoV01jdXJzb3IgKikgcFJlc3VsdDsKK30KKworV01jdXJzb3IgKm9zMmZzbGliX0NyZWF0ZVdNQ3Vyc29yX0ZTKF9USElTLCBVaW50OCAqZGF0YSwgVWludDggKm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKK3sKKyNpZmRlZiBERUJVR19CVUlMRAorICBwcmludGYoIltDcmVhdGVXTUN1cnNvcl9GU10gOiByZXR1cm5pbmcgcG9pbnRlciBOVUxMXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAvLyBJbiBGUyBtb2RlIHdlJ2xsIHVzZSBzb2Z0d2FyZSBjdXJzb3IKKyAgcmV0dXJuIChXTWN1cnNvciAqKSBOVUxMOworfQorCisvKiBTaG93IHRoZSBzcGVjaWZpZWQgY3Vyc29yLCBvciBoaWRlIGlmIGN1cnNvciBpcyBOVUxMICovCitpbnQgb3MyZnNsaWJfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQoreworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW1Nob3dXTUN1cnNvcl0gOiBwdHIgPSAlcFxuIiwgY3Vyc29yKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICBpZiAoY3Vyc29yKQorICB7CisgICAgV2luU2V0UG9pbnRlcihIV05EX0RFU0tUT1AsIGN1cnNvci0+aHB0cik7CisgICAgaHB0ckdsb2JhbFBvaW50ZXIgPSBjdXJzb3ItPmhwdHI7CisgICAgX3RoaXMtPmhpZGRlbi0+aU1vdXNlVmlzaWJsZSA9IDE7CisgIH0KKyAgZWxzZQorICB7CisgICAgV2luU2V0UG9pbnRlcihIV05EX0RFU0tUT1AsIEZBTFNFKTsKKyAgICBocHRyR2xvYmFsUG9pbnRlciA9IE5VTEw7CisgICAgX3RoaXMtPmhpZGRlbi0+aU1vdXNlVmlzaWJsZSA9IDA7CisgIH0KKworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW1Nob3dXTUN1cnNvcl0gOiBwdHIgPSAlcCwgRE9ORVxuIiwgY3Vyc29yKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICByZXR1cm4gMTsKK30KKworLyogV2FycCB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yIHRvICh4LHkpCisgSWYgTlVMTCwgYSBtb3VzZSBtb3Rpb24gZXZlbnQgaXMgcG9zdGVkIGludGVybmFsbHkuCisgKi8KK3ZvaWQgb3MyZnNsaWJfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCit7CisgIExPTkcgbHgsIGx5OworICBTV1Agc3dwQ2xpZW50OworICBQT0lOVEwgcHRsUG9pbnRzOworICBXaW5RdWVyeVdpbmRvd1BvcyhfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCAmc3dwQ2xpZW50KTsKKyAgcHRsUG9pbnRzLnggPSBzd3BDbGllbnQueDsKKyAgcHRsUG9pbnRzLnkgPSBzd3BDbGllbnQueTsKKyAgV2luTWFwV2luZG93UG9pbnRzKF90aGlzLT5oaWRkZW4tPmh3bmRGcmFtZSwgSFdORF9ERVNLVE9QLCAmcHRsUG9pbnRzLCAxKTsKKyAgbHggPSBwdGxQb2ludHMueCArICh4KnN3cENsaWVudC5jeCkgLyBfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb247CisgIGx5ID0gcHRsUG9pbnRzLnkgKyBzd3BDbGllbnQuY3kgLSAoKHkqc3dwQ2xpZW50LmN5KSAvIF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbikgLSAxOworCisgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgLy8gQnV0dG9ucyBub3QgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIEFic29sdXRlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKKworICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwgbHgsIGx5KTsKKworfQorCisvKiBJZiBub3QgTlVMTCwgdGhpcyBpcyBjYWxsZWQgd2hlbiBhIG1vdXNlIG1vdGlvbiBldmVudCBvY2N1cnMgKi8KK3ZvaWQgb3MyZnNsaWJfTW92ZVdNQ3Vyc29yKF9USElTLCBpbnQgeCwgaW50IHkpCit7CisgIC8qCisgIFNETF9SZWN0IHJlY3Q7CisKKyNpZmRlZiBERUJVR19CVUlMRAorICBwcmludGYoIltNb3ZlV01DdXJzb3JdIDogYXQgJWQgOyAlZFxuIiwgeCwgeSk7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgcmVjdC54ID0geDsKKyAgcmVjdC55ID0geTsKKyAgcmVjdC53ID0gMzI7CisgIHJlY3QuaCA9IDMyOworICBvczJmc2xpYl9VcGRhdGVSZWN0cyhfdGhpcywgMSwgJnJlY3QpOworICAvLyBUT0RPIQorICAqLworfQorCisvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgbW91c2Ugc2hvdWxkIGJlIGluIHJlbGF0aXZlIG1vZGUgb3Igbm90LgorIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGlucHV0IGdyYWIgc3RhdGUgb3IgY3Vyc29yCisgdmlzaWJpbGl0eSBzdGF0ZSBjaGFuZ2VzLgorIElmIHRoZSBjdXJzb3IgaXMgbm90IHZpc2libGUsIGFuZCB0aGUgaW5wdXQgaXMgZ3JhYmJlZCwgdGhlCisgZHJpdmVyIGNhbiBwbGFjZSB0aGUgbW91c2UgaW4gcmVsYXRpdmUgbW9kZSwgd2hpY2ggbWF5IHJlc3VsdAorIGluIGhpZ2hlciBhY2N1cmFjeSBzYW1wbGluZyBvZiB0aGUgcG9pbnRlciBtb3Rpb24uCisgKi8KK3ZvaWQgb3MyZnNsaWJfQ2hlY2tNb3VzZU1vZGUoX1RISVMpCit7Cit9CisKK3N0YXRpYyB2b2lkIG9zMmZzbGliX1B1bXBFdmVudHMoX1RISVMpCit7CisgIC8vIE5vdGlmeSBTREwgdGhhdCBpZiB3aW5kb3cgaGFzIGJlZW4gcmVzaXplZCEKKyAgaWYgKAorICAgICAgKF90aGlzLT5oaWRkZW4tPnBTRExTdXJmYWNlKSAmJgorICAgICAgKF90aGlzLT5oaWRkZW4tPnBTRExTdXJmYWNlLT5mbGFncyAmIFNETF9SRVNJWkFCTEUpICYmCisgICAgICAoCisgICAgICAgKF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlYUmVzb2x1dGlvbiE9aVdpbmRvd1NpemVYKSB8fAorICAgICAgIChfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWVJlc29sdXRpb24hPWlXaW5kb3dTaXplWSkKKyAgICAgICkgJiYKKyAgICAgIChpV2luZG93U2l6ZVg+MCkgJiYKKyAgICAgIChpV2luZG93U2l6ZVk+MCkKKyAgICAgKQorICB7CisgICAgc3RhdGljIHRpbWVfdCBwcmV2X3RpbWU7CisgICAgdGltZV90IGN1cnJfdGltZTsKKworICAgIGN1cnJfdGltZSA9IHRpbWUoTlVMTCk7CisgICAgaWYgKChkaWZmdGltZShjdXJyX3RpbWUsIHByZXZfdGltZSk+PTAuMjUpIHx8CisgICAgICAgIChiV2luZG93UmVzaXplZCkpCisgICAgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIHdvbid0IGZsb29kIHRoZSBldmVudCBxdWV1ZSB3aXRoIHJlc2l6ZSBldmVudHMsCisgICAgICAvLyBvbmx5IHNlbmQgdGhlbSBhdCAyNTAgbXNlY3MhCisgICAgICAvLyAob3Igd2hlbiB0aGUgd2luZG93IGlzIHJlc2l6ZWQpCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiW29zMmZzbGliX1B1bXBFdmVudHNdIDogQ2FsbGluZyBQcml2YXRlUmVzaXplICglZCAlZCkuXG4iLAorICAgICAgICAgICAgIGlXaW5kb3dTaXplWCwgaVdpbmRvd1NpemVZKTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgICAvLyBUZWxsIFNETCB0aGUgbmV3IHNpemUKKyAgICAgIFNETF9Qcml2YXRlUmVzaXplKGlXaW5kb3dTaXplWCwgaVdpbmRvd1NpemVZKTsKKyAgICAgIHByZXZfdGltZSA9IGN1cnJfdGltZTsKKyAgICAgIGJXaW5kb3dSZXNpemVkID0gMDsKKyAgICB9CisgIH0KK30KKworLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KK3N0YXRpYyBpbnQgb3MyZnNsaWJfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworICByZXR1cm4oLTEpOworfQorc3RhdGljIHZvaWQgb3MyZnNsaWJfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisgIHJldHVybjsKK30KKworLyogV2UgbmVlZCB0byB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlIG9uIHBhZ2UgZmxpcHBlZCBkaXNwbGF5cyAqLworc3RhdGljIGludCBvczJmc2xpYl9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZCBvczJmc2xpYl9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgb3MyZnNsaWJfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworICBwcmludGYoIltvczJmc2xpYl9TZXRDb2xvcnNdIDogVE9ETyFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyAgLy8gVE9ETzogSW1wbGVtZW50IHBhbGV0dGVkIG1vZGVzCisgIHJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQgb3MyZnNsaWJfRGVzdHJveUljb24oSFdORCBod25kRnJhbWUpCit7CisgIGlmIChocHRyQ3VycmVudEljb24pCisgIHsKKyAgICBXaW5EZXN0cm95UG9pbnRlcihocHRyQ3VycmVudEljb24pOworICAgIGhwdHJDdXJyZW50SWNvbiA9IE5VTEw7CisKKyAgICBXaW5TZW5kTXNnKGh3bmRGcmFtZSwKKyAgICAgICAgICAgICAgIFdNX1NFVElDT04sCisgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgTlVMTCk7CisgIH0KKworfQorCisvKiBTZXQgdGhlIHdpbmRvdyBpY29uIGltYWdlICovCit2b2lkIG9zMmZzbGliX1NldEljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzaykKK3sKKyAgSFdORCBod25kRnJhbWU7CisgIFNETF9TdXJmYWNlICppY29uX3JnYjsKKyAgSFBPSU5URVIgaHB0ckljb247CisgIEhCSVRNQVAgaGJtOworICBCSVRNQVBJTkZPSEVBREVSIGJtaWg7CisgIEJNUElORk8gICAgICAgICAgYm1pOworICBIUFMgICAgICAgICAgICAgIGhwczsKKyAgY2hhciAqcGNoVGVtcDsKKyAgY2hhciAqcHB0ciwgKm1wdHIsICpkcHRyLCAqZG1wdHI7CisgIGludCBtYXh4LCBtYXh5LCB3LCBoLCB4LCB5OworICBTRExfUmVjdCBib3VuZHM7CisKKyNpZmRlZiBERUJVR19CVUlMRAorICBwcmludGYoIltvczJmc2xpYl9TZXRJY29uXSA6IENyZWF0aW5nIGFuZCBzZXR0aW5nIG5ldyBpY29uXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICBod25kRnJhbWUgPSBXaW5RdWVyeVdpbmRvdyhfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCBRV19QQVJFTlQpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgb2xkIGljb24gcmVzb3VyY2Ugd2lsbCBiZSBmcmVlJ2QhCisgIG9zMmZzbGliX0Rlc3Ryb3lJY29uKGh3bmRGcmFtZSk7CisKKyAgaWYgKCghaWNvbikgfHwgKCFtYXNrKSkKKyAgICByZXR1cm47CisKKyAgdyA9IGljb24tPnc7CisgIGggPSBpY29uLT5oOworCisgIG1heHggPSBXaW5RdWVyeVN5c1ZhbHVlKEhXTkRfREVTS1RPUCwgU1ZfQ1hJQ09OKTsKKyAgbWF4eSA9IFdpblF1ZXJ5U3lzVmFsdWUoSFdORF9ERVNLVE9QLCBTVl9DWUlDT04pOworCisgIC8vIENoZWNrIGZvciBtYXggc2l6ZSEKKyAgaWYgKCh3Pm1heHgpIHx8IChoPm1heHkpKQorICAgIHJldHVybjsKKworICBwY2hUZW1wID0gKGNoYXIgKikgU0RMX21hbGxvYyh3ICogaCoyICogNCk7CisgIGlmICghcGNoVGVtcCkKKyAgICByZXR1cm47CisKKyAgU0RMX21lbXNldChwY2hUZW1wLCAwLCB3ICogaCoyICogNCk7CisKKyAgLy8gQ29udmVydCBzdXJmYWNlIHRvIFJHQiwgaWYgaXQncyBub3QgUkdCIHlldCEKKyAgaWNvbl9yZ2IgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLCBpY29uLT53LCBpY29uLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLCAwLCAwLCAwLCAwKTsKKyAgaWYgKCBpY29uX3JnYiA9PSBOVUxMICkKKyAgeworICAgIFNETF9mcmVlKHBjaFRlbXApOworICAgIHJldHVybjsKKyAgfQorICBib3VuZHMueCA9IDA7CisgIGJvdW5kcy55ID0gMDsKKyAgYm91bmRzLncgPSBpY29uLT53OworICBib3VuZHMuaCA9IGljb24tPmg7CisgIGlmICggU0RMX0xvd2VyQmxpdChpY29uLCAmYm91bmRzLCBpY29uX3JnYiwgJmJvdW5kcykgPCAwICkKKyAgeworICAgIFNETF9GcmVlU3VyZmFjZShpY29uX3JnYik7CisgICAgU0RMX2ZyZWUocGNoVGVtcCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQ29weSBwaXhlbHMgdXBzaWRlLWRvd24gZnJvbSBSR0Igc3VyZmFjZSBpbnRvIEJNUCwgbWFza2VkIHdpdGggdGhlIGljb24gbWFzayAqLworCisgIC8vIFBpeGVscworICBwcHRyID0gKGNoYXIgKikgKGljb25fcmdiLT5waXhlbHMpOworICAvLyBNYXNrCisgIG1wdHIgPSBtYXNrOworCisgIGZvciAoeT0wOyB5PGg7IHkrKykKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgdWNoTWFza0J5dGU7CisKKyAgICAvLyBEZXN0aW5hdGlvbgorICAgIGRwdHIgPSBwY2hUZW1wICsgdyo0ICogKGgteS0xKTsKKyAgICAvLyBEZXN0aW5hdGlvbiBtYXNrCisgICAgZG1wdHIgPSBwY2hUZW1wICsgdypoKjQgKyB3KjQgKiAoaC15LTEpOworCisgICAgZm9yICh4PTA7IHg8dzsgeCsrKQorICAgIHsKKyAgICAgIGlmICh4JTg9PTApCisgICAgICB7CisgICAgICAgIHVjaE1hc2tCeXRlID0gKHVuc2lnbmVkIGNoYXIpICgqbXB0cik7CisgICAgICAgIG1wdHIrKzsKKyAgICAgIH0gZWxzZQorICAgICAgICB1Y2hNYXNrQnl0ZSA8PD0gMTsKKworICAgICAgaWYgKHVjaE1hc2tCeXRlICYgMHg4MCkKKyAgICAgIHsKKyAgICAgICAgLy8gQ29weSBSR0IKKyAgICAgICAgKmRwdHIrKyA9ICpwcHRyKys7CisgICAgICAgICpkcHRyKysgPSAqcHB0cisrOworICAgICAgICAqZHB0cisrID0gKnBwdHIrKzsKKyAgICAgICAgKmRwdHIrKyA9ICpwcHRyKys7CisKKyAgICAgICAgKmRtcHRyKysgPSAwOworICAgICAgICAqZG1wdHIrKyA9IDA7CisgICAgICAgICpkbXB0cisrID0gMDsKKyAgICAgICAgKmRtcHRyKysgPSAwOworICAgICAgfSBlbHNlCisgICAgICB7CisgICAgICAgIC8vIFNldCBwaXhlbHMgdG8gZnVsbHkgdHJhbnNwYXJlbnQKKyAgICAgICAgKmRwdHIrKyA9IDA7IHBwdHIrKzsKKyAgICAgICAgKmRwdHIrKyA9IDA7IHBwdHIrKzsKKyAgICAgICAgKmRwdHIrKyA9IDA7IHBwdHIrKzsKKyAgICAgICAgKmRwdHIrKyA9IDA7IHBwdHIrKzsKKworICAgICAgICAqZG1wdHIrKyA9IDI1NTsKKyAgICAgICAgKmRtcHRyKysgPSAyNTU7CisgICAgICAgICpkbXB0cisrID0gMjU1OworICAgICAgICAqZG1wdHIrKyA9IDI1NTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBUaGVyZSBpcyBubyBtb3JlIG5lZWQgZm9yIHRoZSBSR0Igc3VyZmFjZQorICBTRExfRnJlZVN1cmZhY2UoaWNvbl9yZ2IpOworCisgIGhwcyA9IFdpbkdldFBTKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQpOworCisgIGJtaS5jYkZpeCA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgYm1pLmN4ID0gdzsKKyAgYm1pLmN5ID0gMipoOworICBibWkuY1BsYW5lcyA9IDE7CisgIGJtaS5jQml0Q291bnQgPSAzMjsKKworICBTRExfbWVtc2V0KCZibWloLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworICBibWloLmNiRml4ID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICBibWloLmN4ID0gdzsKKyAgYm1paC5jeSA9IDIqaDsKKyAgYm1paC5jUGxhbmVzID0gMTsKKyAgYm1paC5jQml0Q291bnQgPSAzMjsKKworICBoYm0gPSBHcGlDcmVhdGVCaXRtYXAoaHBzLCAoUEJJVE1BUElORk9IRUFERVIyKSZibWloLCBDQk1fSU5JVCwgKFBCWVRFKSBwY2hUZW1wLCAoUEJJVE1BUElORk8yKSZibWkpOworICBocHRySWNvbiA9IFdpbkNyZWF0ZVBvaW50ZXIoSFdORF9ERVNLVE9QLCBoYm0sIEZBTFNFLCAwLCAwKTsKKworICBXaW5SZWxlYXNlUFMoaHBzKTsKKworICAvLyBGcmVlIHBpeGVsIGFycmF5CisgIFNETF9mcmVlKHBjaFRlbXApOworCisgIC8vIENoYW5nZSBpY29uIGluIGZyYW1lIHdpbmRvdworICBXaW5TZW5kTXNnKGh3bmRGcmFtZSwKKyAgICAgICAgICAgICBXTV9TRVRJQ09OLAorICAgICAgICAgICAgIChNUEFSQU0pIGhwdHJJY29uLAorICAgICAgICAgICAgIE5VTEwpOworCisgIC8qCisgIC8vIENoYW5nZSBpY29uIGluIHN3aXRjaGxpc3QKKyAgLy8gU2VlbXMgbGlrZSBpdCdzIG5vdCBuZWVkZWQsIHRoZSBXTV9TRVRJQ09OIGFscmVhZHkgZG9lcyBpdC4KKyAgeworICAgIFBJRCBwaWRGcmFtZTsKKyAgICBIU1dJVENIIGhzd2l0Y2hGcmFtZTsKKyAgICBTV0NOVFJMIHN3Y3RsOworCisgICAgV2luUXVlcnlXaW5kb3dQcm9jZXNzKGh3bmRGcmFtZSwgJnBpZEZyYW1lLCBOVUxMKTsKKyAgICBoc3dpdGNoRnJhbWUgPSBXaW5RdWVyeVN3aXRjaEhhbmRsZShod25kRnJhbWUsIHBpZEZyYW1lKTsKKyAgICBXaW5RdWVyeVN3aXRjaEVudHJ5KGhzd2l0Y2hGcmFtZSwgJnN3Y3RsKTsKKworICAgIHN3Y3RsLmh3bmRJY29uID0gaHB0ckljb247CisKKyAgICBXaW5DaGFuZ2VTd2l0Y2hFbnRyeShoc3dpdGNoRnJhbWUsICZzd2N0bCk7CisgIH0KKyAgKi8KKworICAvLyBTdG9yZSBpY29uIGhhbmRsZSBpbiBnbG9iYWwgdmFyaWFibGUKKyAgaHB0ckN1cnJlbnRJY29uID0gaHB0ckljb247Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSRUFMIEZVTkNUSU9OUyAtLS0tLS0tLS0tLS0tLS0tLQorCisKK3N0YXRpYyB2b2lkIG9zMmZzbGliX1NldEN1cnNvck1hbmFnZW1lbnRGdW5jdGlvbnMoX1RISVMsIGludCBpRm9yV2luZG93ZWRNb2RlKQoreworICBpZiAoaUZvcldpbmRvd2VkTW9kZSkKKyAgeworICAgIF90aGlzLT5GcmVlV01DdXJzb3IgPSBvczJmc2xpYl9GcmVlV01DdXJzb3I7CisgICAgX3RoaXMtPkNyZWF0ZVdNQ3Vyc29yID0gb3MyZnNsaWJfQ3JlYXRlV01DdXJzb3JfV2luOworICAgIF90aGlzLT5TaG93V01DdXJzb3IgPSBvczJmc2xpYl9TaG93V01DdXJzb3I7CisgICAgX3RoaXMtPldhcnBXTUN1cnNvciA9IG9zMmZzbGliX1dhcnBXTUN1cnNvcjsKKyAgICBfdGhpcy0+TW92ZVdNQ3Vyc29yID0gb3MyZnNsaWJfTW92ZVdNQ3Vyc29yOworICAgIF90aGlzLT5DaGVja01vdXNlTW9kZSA9IE5VTEw7Ly9vczJmc2xpYl9DaGVja01vdXNlTW9kZTsKKyAgfSBlbHNlCisgIHsKKyAgICAvLyBXZSdsbCBoYXZlIHNvZnR3YXJlIG1vdXNlIGN1cnNvciBpbiBGUyBtb2RlIQorICAgIF90aGlzLT5GcmVlV01DdXJzb3IgPSBvczJmc2xpYl9GcmVlV01DdXJzb3I7CisgICAgX3RoaXMtPkNyZWF0ZVdNQ3Vyc29yID0gb3MyZnNsaWJfQ3JlYXRlV01DdXJzb3JfRlM7CisgICAgX3RoaXMtPlNob3dXTUN1cnNvciA9IG9zMmZzbGliX1Nob3dXTUN1cnNvcjsKKyAgICBfdGhpcy0+V2FycFdNQ3Vyc29yID0gb3MyZnNsaWJfV2FycFdNQ3Vyc29yOworICAgIF90aGlzLT5Nb3ZlV01DdXJzb3IgPSBvczJmc2xpYl9Nb3ZlV01DdXJzb3I7CisgICAgX3RoaXMtPkNoZWNrTW91c2VNb2RlID0gTlVMTDsvL29zMmZzbGliX0NoZWNrTW91c2VNb2RlOworICB9Cit9CisKK3N0YXRpYyB2b2lkIG9zMmZzbGliX0luaXRPU0tleW1hcChfVEhJUykKK3sKKyAgaW50IGk7CisKKyAgaVNoaWZ0SXNQcmVzc2VkID0gMDsKKworICAvKiBNYXAgdGhlIFZLIGFuZCBDSCBrZXlzeW1zICovCisgIGZvciAoIGk9MDsgaTw9MjU1OyArK2kgKQorICAgIEhXU2NhbktleU1hcFtpXSA9IFNETEtfVU5LTk9XTjsKKworICAvLyBGaXJzdCBsaW5lIG9mIGtleWJvYXJkOgorICBIV1NjYW5LZXlNYXBbMHgxXSA9IFNETEtfRVNDQVBFOworICBIV1NjYW5LZXlNYXBbMHgzYl0gPSBTRExLX0YxOworICBIV1NjYW5LZXlNYXBbMHgzY10gPSBTRExLX0YyOworICBIV1NjYW5LZXlNYXBbMHgzZF0gPSBTRExLX0YzOworICBIV1NjYW5LZXlNYXBbMHgzZV0gPSBTRExLX0Y0OworICBIV1NjYW5LZXlNYXBbMHgzZl0gPSBTRExLX0Y1OworICBIV1NjYW5LZXlNYXBbMHg0MF0gPSBTRExLX0Y2OworICBIV1NjYW5LZXlNYXBbMHg0MV0gPSBTRExLX0Y3OworICBIV1NjYW5LZXlNYXBbMHg0Ml0gPSBTRExLX0Y4OworICBIV1NjYW5LZXlNYXBbMHg0M10gPSBTRExLX0Y5OworICBIV1NjYW5LZXlNYXBbMHg0NF0gPSBTRExLX0YxMDsKKyAgSFdTY2FuS2V5TWFwWzB4NTddID0gU0RMS19GMTE7CisgIEhXU2NhbktleU1hcFsweDU4XSA9IFNETEtfRjEyOworICBIV1NjYW5LZXlNYXBbMHg1ZF0gPSBTRExLX1BSSU5UOworICBIV1NjYW5LZXlNYXBbMHg0Nl0gPSBTRExLX1NDUk9MTE9DSzsKKyAgSFdTY2FuS2V5TWFwWzB4NWZdID0gU0RMS19QQVVTRTsKKworICAvLyBTZWNvbmQgbGluZSBvZiBrZXlib2FyZDoKKyAgSFdTY2FuS2V5TWFwWzB4MjldID0gU0RMS19CQUNLUVVPVEU7CisgIEhXU2NhbktleU1hcFsweDJdID0gU0RMS18xOworICBIV1NjYW5LZXlNYXBbMHgzXSA9IFNETEtfMjsKKyAgSFdTY2FuS2V5TWFwWzB4NF0gPSBTRExLXzM7CisgIEhXU2NhbktleU1hcFsweDVdID0gU0RMS180OworICBIV1NjYW5LZXlNYXBbMHg2XSA9IFNETEtfNTsKKyAgSFdTY2FuS2V5TWFwWzB4N10gPSBTRExLXzY7CisgIEhXU2NhbktleU1hcFsweDhdID0gU0RMS183OworICBIV1NjYW5LZXlNYXBbMHg5XSA9IFNETEtfODsKKyAgSFdTY2FuS2V5TWFwWzB4YV0gPSBTRExLXzk7CisgIEhXU2NhbktleU1hcFsweGJdID0gU0RMS18wOworICBIV1NjYW5LZXlNYXBbMHhjXSA9IFNETEtfTUlOVVM7CisgIEhXU2NhbktleU1hcFsweGRdID0gU0RMS19FUVVBTFM7CisgIEhXU2NhbktleU1hcFsweGVdID0gU0RMS19CQUNLU1BBQ0U7CisgIEhXU2NhbktleU1hcFsweDY4XSA9IFNETEtfSU5TRVJUOworICBIV1NjYW5LZXlNYXBbMHg2MF0gPSBTRExLX0hPTUU7CisgIEhXU2NhbktleU1hcFsweDYyXSA9IFNETEtfUEFHRVVQOworICBIV1NjYW5LZXlNYXBbMHg0NV0gPSBTRExLX05VTUxPQ0s7CisgIEhXU2NhbktleU1hcFsweDVjXSA9IFNETEtfS1BfRElWSURFOworICBIV1NjYW5LZXlNYXBbMHgzN10gPSBTRExLX0tQX01VTFRJUExZOworICBIV1NjYW5LZXlNYXBbMHg0YV0gPSBTRExLX0tQX01JTlVTOworCisgIC8vIFRoaXJkIGxpbmUgb2Yga2V5Ym9hcmQ6CisgIEhXU2NhbktleU1hcFsweGZdID0gU0RMS19UQUI7CisgIEhXU2NhbktleU1hcFsweDEwXSA9IFNETEtfcTsKKyAgSFdTY2FuS2V5TWFwWzB4MTFdID0gU0RMS193OworICBIV1NjYW5LZXlNYXBbMHgxMl0gPSBTRExLX2U7CisgIEhXU2NhbktleU1hcFsweDEzXSA9IFNETEtfcjsKKyAgSFdTY2FuS2V5TWFwWzB4MTRdID0gU0RMS190OworICBIV1NjYW5LZXlNYXBbMHgxNV0gPSBTRExLX3k7CisgIEhXU2NhbktleU1hcFsweDE2XSA9IFNETEtfdTsKKyAgSFdTY2FuS2V5TWFwWzB4MTddID0gU0RMS19pOworICBIV1NjYW5LZXlNYXBbMHgxOF0gPSBTRExLX287CisgIEhXU2NhbktleU1hcFsweDE5XSA9IFNETEtfcDsKKyAgSFdTY2FuS2V5TWFwWzB4MWFdID0gU0RMS19MRUZUQlJBQ0tFVDsKKyAgSFdTY2FuS2V5TWFwWzB4MWJdID0gU0RMS19SSUdIVEJSQUNLRVQ7CisgIEhXU2NhbktleU1hcFsweDFjXSA9IFNETEtfUkVUVVJOOworICBIV1NjYW5LZXlNYXBbMHg2OV0gPSBTRExLX0RFTEVURTsKKyAgSFdTY2FuS2V5TWFwWzB4NjVdID0gU0RMS19FTkQ7CisgIEhXU2NhbktleU1hcFsweDY3XSA9IFNETEtfUEFHRURPV047CisgIEhXU2NhbktleU1hcFsweDQ3XSA9IFNETEtfS1A3OworICBIV1NjYW5LZXlNYXBbMHg0OF0gPSBTRExLX0tQODsKKyAgSFdTY2FuS2V5TWFwWzB4NDldID0gU0RMS19LUDk7CisgIEhXU2NhbktleU1hcFsweDRlXSA9IFNETEtfS1BfUExVUzsKKworICAvLyBGb3VydGggbGluZSBvZiBrZXlib2FyZDoKKyAgSFdTY2FuS2V5TWFwWzB4M2FdID0gU0RMS19DQVBTTE9DSzsKKyAgSFdTY2FuS2V5TWFwWzB4MWVdID0gU0RMS19hOworICBIV1NjYW5LZXlNYXBbMHgxZl0gPSBTRExLX3M7CisgIEhXU2NhbktleU1hcFsweDIwXSA9IFNETEtfZDsKKyAgSFdTY2FuS2V5TWFwWzB4MjFdID0gU0RMS19mOworICBIV1NjYW5LZXlNYXBbMHgyMl0gPSBTRExLX2c7CisgIEhXU2NhbktleU1hcFsweDIzXSA9IFNETEtfaDsKKyAgSFdTY2FuS2V5TWFwWzB4MjRdID0gU0RMS19qOworICBIV1NjYW5LZXlNYXBbMHgyNV0gPSBTRExLX2s7CisgIEhXU2NhbktleU1hcFsweDI2XSA9IFNETEtfbDsKKyAgSFdTY2FuS2V5TWFwWzB4MjddID0gU0RMS19TRU1JQ09MT047CisgIEhXU2NhbktleU1hcFsweDI4XSA9IFNETEtfUVVPVEU7CisgIEhXU2NhbktleU1hcFsweDJiXSA9IFNETEtfQkFDS1NMQVNIOworICBIV1NjYW5LZXlNYXBbMHg0Yl0gPSBTRExLX0tQNDsKKyAgSFdTY2FuS2V5TWFwWzB4NGNdID0gU0RMS19LUDU7CisgIEhXU2NhbktleU1hcFsweDRkXSA9IFNETEtfS1A2OworCisgIC8vIEZpZnRoIGxpbmUgb2Yga2V5Ym9hcmQ6CisgIEhXU2NhbktleU1hcFsweDJhXSA9IFNETEtfTFNISUZUOworICBIV1NjYW5LZXlNYXBbMHg1Nl0gPSBTRExLX1dPUkxEXzE7IC8vIENvZGUgMTYxLCBsZXR0ZXIgaScgb24gaHVuZ2FyaWFuIGtleWJvYXJkCisgIEhXU2NhbktleU1hcFsweDJjXSA9IFNETEtfejsKKyAgSFdTY2FuS2V5TWFwWzB4MmRdID0gU0RMS194OworICBIV1NjYW5LZXlNYXBbMHgyZV0gPSBTRExLX2M7CisgIEhXU2NhbktleU1hcFsweDJmXSA9IFNETEtfdjsKKyAgSFdTY2FuS2V5TWFwWzB4MzBdID0gU0RMS19iOworICBIV1NjYW5LZXlNYXBbMHgzMV0gPSBTRExLX247CisgIEhXU2NhbktleU1hcFsweDMyXSA9IFNETEtfbTsKKyAgSFdTY2FuS2V5TWFwWzB4MzNdID0gU0RMS19DT01NQTsKKyAgSFdTY2FuS2V5TWFwWzB4MzRdID0gU0RMS19QRVJJT0Q7CisgIEhXU2NhbktleU1hcFsweDM1XSA9IFNETEtfU0xBU0g7CisgIEhXU2NhbktleU1hcFsweDM2XSA9IFNETEtfUlNISUZUOworICBIV1NjYW5LZXlNYXBbMHg2MV0gPSBTRExLX1VQOworICBIV1NjYW5LZXlNYXBbMHg0Zl0gPSBTRExLX0tQMTsKKyAgSFdTY2FuS2V5TWFwWzB4NTBdID0gU0RMS19LUDI7CisgIEhXU2NhbktleU1hcFsweDUxXSA9IFNETEtfS1AzOworICBIV1NjYW5LZXlNYXBbMHg1YV0gPSBTRExLX0tQX0VOVEVSOworCisgIC8vIFNpeHRoIGxpbmUgb2Yga2V5Ym9hcmQ6CisgIEhXU2NhbktleU1hcFsweDFkXSA9IFNETEtfTENUUkw7CisgIEhXU2NhbktleU1hcFsweDdlXSA9IFNETEtfTFNVUEVSOyAvLyBXaW5kb3dzIGtleQorICBIV1NjYW5LZXlNYXBbMHgzOF0gPSBTRExLX0xBTFQ7CisgIEhXU2NhbktleU1hcFsweDM5XSA9IFNETEtfU1BBQ0U7CisgIEhXU2NhbktleU1hcFsweDVlXSA9IFNETEtfUkFMVDsvLyBBY3R1YWxseSwgYWx0Z3Igb24gbXkga2V5Ym9hcmQuLi4KKyAgSFdTY2FuS2V5TWFwWzB4N2ZdID0gU0RMS19SU1VQRVI7CisgIEhXU2NhbktleU1hcFsweDdjXSA9IFNETEtfTUVOVTsKKyAgSFdTY2FuS2V5TWFwWzB4NWJdID0gU0RMS19SQ1RSTDsKKyAgSFdTY2FuS2V5TWFwWzB4NjNdID0gU0RMS19MRUZUOworICBIV1NjYW5LZXlNYXBbMHg2Nl0gPSBTRExLX0RPV047CisgIEhXU2NhbktleU1hcFsweDY0XSA9IFNETEtfUklHSFQ7CisgIEhXU2NhbktleU1hcFsweDUyXSA9IFNETEtfS1AwOworICBIV1NjYW5LZXlNYXBbMHg1M10gPSBTRExLX0tQX1BFUklPRDsKK30KKworCisvKiBJY29uaWZ5IHRoZSB3aW5kb3cuCisgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlcmUgaXMgYSB3aW5kb3cgbWFuYWdlciBhbmQgdGhlCisgd2luZG93IHdhcyBhY3R1YWxseSBpY29uaWZpZWQsIGl0IHJldHVybnMgMCBvdGhlcndpc2UuCisgKi8KK2ludCBvczJmc2xpYl9JY29uaWZ5V2luZG93KF9USElTKQoreworICBIQUIgaGFiOworICBITVEgaG1xOworICBFUlJPUklEIGhtcWVycm9yOworCisgIC8vIElmIHRoZXJlIGlzIG5vIG1vcmUgd2luZG93LCBub3RoaW5nIHdlIGNhbiBkbyEKKyAgaWYgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyE9MSkgcmV0dXJuIDA7CisKKyAgLy8gQ2Fubm90IGRvIGFueXRoaW5nIGluIGZ1bGxzY3JlZW4gbW9kZSEKKyAgaWYgKEZTTGliX1F1ZXJ5RlNNb2RlKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQpKQorICAgIHJldHVybiAwOworCisgIC8vIE1ha2Ugc3VyZSB0aGlzIHRocmVhZCBpcyBwcmVwYXJlZCBmb3IgdXNpbmcgdGhlIFByZXNlbnRhdGlvbiBNYW5hZ2VyIQorICBoYWIgPSBXaW5Jbml0aWFsaXplKDApOworICBobXEgPSBXaW5DcmVhdGVNc2dRdWV1ZShoYWIsMCk7CisgIC8vIFJlbWVtYmVyIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBhdCBXaW5DcmVhdGVNc2dRdWV1ZSgpLCBiZWNhdXNlIHdlIGRvbid0CisgIC8vIHdhbnQgdG8gZGVzdHJveSBzb21lYm9keSBlbHNlJ3MgcXVldWUgbGF0ZXIuIDopCisgIGhtcWVycm9yID0gV2luR2V0TGFzdEVycm9yKGhhYik7CisKKyAgV2luU2V0V2luZG93UG9zKF90aGlzLT5oaWRkZW4tPmh3bmRGcmFtZSwgSFdORF9UT1AsCisgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIFNXUF9NSU5JTUlaRSk7CisKKyAgLy8gTm93IGRlc3Ryb3kgdGhlIG1lc3NhZ2UgcXVldWUsIGlmIHdlJ3ZlIGNyZWF0ZWQgaXQhCisgIGlmIChFUlJPUklERVJST1IoaG1xZXJyb3IpPT0wKQorICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgU0RMX0dyYWJNb2RlIG9zMmZzbGliX0dyYWJJbnB1dChfVEhJUywgU0RMX0dyYWJNb2RlIG1vZGUpCit7CisgIEhBQiBoYWI7CisgIEhNUSBobXE7CisgIEVSUk9SSUQgaG1xZXJyb3I7CisKKworICAvLyBJZiB0aGVyZSBpcyBubyBtb3JlIHdpbmRvdywgbm90aGluZyB3ZSBjYW4gZG8hCisgIGlmIChfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMhPTEpCisgICAgcmV0dXJuIFNETF9HUkFCX09GRjsKKworICAvLyBNYWtlIHN1cmUgdGhpcyB0aHJlYWQgaXMgcHJlcGFyZWQgZm9yIHVzaW5nIHRoZSBQcmVzZW50YXRpb24gTWFuYWdlciEKKyAgaGFiID0gV2luSW5pdGlhbGl6ZSgwKTsKKyAgaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLDApOworICAvLyBSZW1lbWJlciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgYXQgV2luQ3JlYXRlTXNnUXVldWUoKSwgYmVjYXVzZSB3ZSBkb24ndAorICAvLyB3YW50IHRvIGRlc3Ryb3kgc29tZWJvZHkgZWxzZSdzIHF1ZXVlIGxhdGVyLiA6KQorICBobXFlcnJvciA9IFdpbkdldExhc3RFcnJvcihoYWIpOworCisKKyAgaWYgKG1vZGUgPT0gU0RMX0dSQUJfT0ZGKQorICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICBwcmludGYoIltvczJmc2xpYl9HcmFiSW5wdXRdIDogUmVsZWFzaW5nIG1vdXNlXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgIC8vIFJlbGVhc2UgdGhlIG1vdXNlCisgICAgYk1vdXNlQ2FwdHVyYWJsZSA9IDA7CisgICAgaWYgKGJNb3VzZUNhcHR1cmVkKQorICAgIHsKKyAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBOVUxMSEFORExFKTsKKyAgICAgIGJNb3VzZUNhcHR1cmVkID0gMDsKKyAgICB9CisgIH0gZWxzZQorICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICBwcmludGYoIltvczJmc2xpYl9HcmFiSW5wdXRdIDogQ2FwdHVyaW5nIG1vdXNlXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgIC8vIENhcHR1cmUgdGhlIG1vdXNlCisgICAgYk1vdXNlQ2FwdHVyYWJsZSA9IDE7CisgICAgaWYgKFdpblF1ZXJ5Rm9jdXMoSFdORF9ERVNLVE9QKSA9PSBfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50KQorICAgIHsKKyAgICAgIFdpblNldENhcHR1cmUoSFdORF9ERVNLVE9QLCBfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50KTsKKyAgICAgIGJNb3VzZUNhcHR1cmVkID0gMTsKKyAgICAgIHsKKyAgICAgICAgU1dQIHN3cENsaWVudDsKKyAgICAgICAgUE9JTlRMIHB0bDsKKyAgICAgICAgLy8gQ2VudGVyIHRoZSBtb3VzZSB0byB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3chCisgICAgICAgIFdpblF1ZXJ5V2luZG93UG9zKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsICZzd3BDbGllbnQpOworICAgICAgICBwdGwueCA9IDA7IHB0bC55ID0gMDsKKyAgICAgICAgV2luTWFwV2luZG93UG9pbnRzKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsIEhXTkRfREVTS1RPUCwgJnB0bCwgMSk7CisgICAgICAgIF90aGlzLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUrKzsgLyogRG9uJ3QgdGFrZSBuZXh0IFdNX01PVVNFTU9WRSBpbnRvIGFjY291bnQhICAqLworICAgICAgICBXaW5TZXRQb2ludGVyUG9zKEhXTkRfREVTS1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdGwueCArIHN3cENsaWVudC5jeC8yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0bC55ICsgc3dwQ2xpZW50LmN5LzIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE5vdyBkZXN0cm95IHRoZSBtZXNzYWdlIHF1ZXVlLCBpZiB3ZSd2ZSBjcmVhdGVkIGl0IQorICBpZiAoRVJST1JJREVSUk9SKGhtcWVycm9yKT09MCkKKyAgICBXaW5EZXN0cm95TXNnUXVldWUoaG1xKTsKKworICByZXR1cm4gbW9kZTsKK30KKworLyogU2V0IHRoZSB0aXRsZSBhbmQgaWNvbiB0ZXh0ICovCitzdGF0aWMgdm9pZCBvczJmc2xpYl9TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKK3sKKyAgSEFCIGhhYjsKKyAgSE1RIGhtcTsKKyAgRVJST1JJRCBobXFlcnJvcjsKKworICAvLyBJZiB0aGVyZSBpcyBubyBtb3JlIHdpbmRvdywgbm90aGluZyB3ZSBjYW4gZG8hCisgIGlmIChfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMhPTEpIHJldHVybjsKKworICAvLyBNYWtlIHN1cmUgdGhpcyB0aHJlYWQgaXMgcHJlcGFyZWQgZm9yIHVzaW5nIHRoZSBQcmVzZW50YXRpb24gTWFuYWdlciEKKyAgaGFiID0gV2luSW5pdGlhbGl6ZSgwKTsKKyAgaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLDApOworICAvLyBSZW1lbWJlciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgYXQgV2luQ3JlYXRlTXNnUXVldWUoKSwgYmVjYXVzZSB3ZSBkb24ndAorICAvLyB3YW50IHRvIGRlc3Ryb3kgc29tZWJvZHkgZWxzZSdzIHF1ZXVlIGxhdGVyLiA6KQorICBobXFlcnJvciA9IFdpbkdldExhc3RFcnJvcihoYWIpOworCisgIFdpblNldFdpbmRvd1RleHQoX3RoaXMtPmhpZGRlbi0+aHduZEZyYW1lLCAoY2hhciAqKSB0aXRsZSk7CisKKyAgLy8gTm93IGRlc3Ryb3kgdGhlIG1lc3NhZ2UgcXVldWUsIGlmIHdlJ3ZlIGNyZWF0ZWQgaXQhCisgIGlmIChFUlJPUklERVJST1IoaG1xZXJyb3IpPT0wKQorICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOworfQorCitzdGF0aWMgaW50IG9zMmZzbGliX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBvbikKK3sKKyNpZmRlZiBERUJVR19CVUlMRAorICBwcmludGYoIltvczJmc2xpYl9Ub2dnbGVGdWxsU2NyZWVuXSA6ICVkXG4iLCBvbik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgIC8vIElmIHRoZXJlIGlzIG5vIG1vcmUgd2luZG93LCBub3RoaW5nIHdlIGNhbiBkbyEKKyAgaWYgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyE9MSkgcmV0dXJuIDA7CisKKyAgRlNMaWJfVG9nZ2xlRlNNb2RlKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsIG9uKTsKKyAgLyogQ3Vyc29yIG1hbmFnZXIgZnVuY3Rpb25zIHRvIFdpbmRvd2VkL0ZTIG1vZGUqLworICBvczJmc2xpYl9TZXRDdXJzb3JNYW5hZ2VtZW50RnVuY3Rpb25zKF90aGlzLCAhb24pOworICByZXR1cm4gMTsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHZpZGVvIG1vZGUgaGFzIGJlZW4gc2V0LCB0byBnZXQgdGhlCisgaW5pdGlhbCBtb3VzZSBzdGF0ZS4gIEl0IHNob3VsZCBxdWV1ZSBldmVudHMgYXMgbmVjZXNzYXJ5IHRvCisgcHJvcGVybHkgcmVwcmVzZW50IHRoZSBjdXJyZW50IG1vdXNlIGZvY3VzIGFuZCBwb3NpdGlvbi4KKyAqLworc3RhdGljIHZvaWQgb3MyZnNsaWJfVXBkYXRlTW91c2UoX1RISVMpCit7CisgIFBPSU5UTCBwdGw7CisgIEhBQiBoYWI7CisgIEhNUSBobXE7CisgIEVSUk9SSUQgaG1xZXJyb3I7CisgIFNXUCBzd3BDbGllbnQ7CisKKyAgLy8gSWYgdGhlcmUgaXMgbm8gbW9yZSB3aW5kb3csIG5vdGhpbmcgd2UgY2FuIGRvIQorICBpZiAoX3RoaXMtPmhpZGRlbi0+aVBNVGhyZWFkU3RhdHVzIT0xKSByZXR1cm47CisKKworICAvLyBNYWtlIHN1cmUgdGhpcyB0aHJlYWQgaXMgcHJlcGFyZWQgZm9yIHVzaW5nIHRoZSBQcmVzZW50YXRpb24gTWFuYWdlciEKKyAgaGFiID0gV2luSW5pdGlhbGl6ZSgwKTsKKyAgaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLDApOworICAvLyBSZW1lbWJlciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgYXQgV2luQ3JlYXRlTXNnUXVldWUoKSwgYmVjYXVzZSB3ZSBkb24ndAorICAvLyB3YW50IHRvIGRlc3Ryb3kgc29tZWJvZHkgZWxzZSdzIHF1ZXVlIGxhdGVyLiA6KQorICBobXFlcnJvciA9IFdpbkdldExhc3RFcnJvcihoYWIpOworCisgIAorCisgIGlmIChfdGhpcy0+aGlkZGVuLT5mSW5Gb2N1cykKKyAgeworICAgIC8vIElmIG91ciBhcHAgaXMgaW4gZm9jdXMKKyAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7CisgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUElOUFVURk9DVVMpOworICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBBQ1RJVkUpOworICAgIFdpblF1ZXJ5UG9pbnRlclBvcyhIV05EX0RFU0tUT1AsICZwdGwpOworICAgIFdpbk1hcFdpbmRvd1BvaW50cyhIV05EX0RFU0tUT1AsIF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsICZwdGwsIDEpOworICAgIFdpblF1ZXJ5V2luZG93UG9zKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsICZzd3BDbGllbnQpOworICAgIC8vIENvbnZlcnQgT1MvMiBtb3VzZSBwb3NpdGlvbiB0byBTREwgcG9zaXRpb24sIGFuZCBhbHNvIHNjYWxlIGl0IQorICAgIHB0bC54ID0gcHRsLnggKiBfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24gLyBzd3BDbGllbnQuY3g7CisgICAgcHRsLnkgPSBwdGwueSAqIF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAvIHN3cENsaWVudC5jeTsKKyAgICBwdGwueSA9IF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MudWlZUmVzb2x1dGlvbiAtIHB0bC55IC0gMTsKKyAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIChTaW50MTYpIChwdGwueCksIChTaW50MTYpIChwdGwueSkpOworICB9IGVsc2UKKyAgeworICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBmb2N1cworICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKKyAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQSU5QVVRGT0NVUyk7CisgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUEFDVElWRSk7CisgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCAoU2ludDE2KSAtMSwgKFNpbnQxNikgLTEpOworICB9CisKKyAgLy8gTm93IGRlc3Ryb3kgdGhlIG1lc3NhZ2UgcXVldWUsIGlmIHdlJ3ZlIGNyZWF0ZWQgaXQhCisgIGlmIChFUlJPUklERVJST1IoaG1xZXJyb3IpPT0wKQorICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOworCit9CisKKy8qIFRoaXMgcG9pbnRlciBzaG91bGQgZXhpc3QgaW4gdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gYW5kIHNob3VsZAorIHBvaW50IHRvIGFuIGFwcHJvcHJpYXRlIHVwZGF0ZSBmdW5jdGlvbiBmb3IgdGhlIGN1cnJlbnQgdmlkZW8gbW9kZQorICovCitzdGF0aWMgdm9pZCBvczJmc2xpYl9VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisgIC8vIElmIHRoZXJlIGlzIG5vIG1vcmUgd2luZG93LCBub3RoaW5nIHdlIGNhbiBkbyEKKyAgaWYgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyE9MSkgcmV0dXJuOworCisjaWZkZWYgQklUQkxUX0lOX1dJTk1FU1NBR0VQUk9DCisgIFdpblNlbmRNc2coX3RoaXMtPmhpZGRlbi0+aHduZENsaWVudCwKKyAgICAgICAgICAgICAgICAgV01fVVBEQVRFUkVDVFNSRVFVRVNULAorICAgICAgICAgICAgICAgICAoTVBBUkFNKSBudW1yZWN0cywKKyAgICAgICAgICAgICAgICAgKE1QQVJBTSkgcmVjdHMpOworI2Vsc2UKKyAgaWYgKERvc1JlcXVlc3RNdXRleFNlbShfdGhpcy0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyLCBTRU1fSU5ERUZJTklURV9XQUlUKT09Tk9fRVJST1IpCisgIHsKKyAgICBpbnQgaTsKKworICAgIGlmIChfdGhpcy0+aGlkZGVuLT5wU0RMU3VyZmFjZSkKKyAgICB7CisjaWZuZGVmIFJFU0laRV9FVkVOX0lGX1JFU0laQUJMRQorICAgICAgU1dQIHN3cDsKKyAgICAgIC8vIEJ1dCBvbmx5IGJsaXQgaWYgdGhlIHdpbmRvdyBpcyBub3QgcmVzaXphYmxlLCBvciBpZgorICAgICAgLy8gdGhlIHdpbmRvdyBpcyByZXNpemFibGUgYW5kIHRoZSBzb3VyY2UgYnVmZmVyIHNpemUgaXMgdGhlCisgICAgICAvLyBzYW1lIGFzIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgc2l6ZSEKKyAgICAgIFdpblF1ZXJ5V2luZG93UG9zKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQsICZzd3ApOworICAgICAgaWYgKChfdGhpcy0+aGlkZGVuLT5wU0RMU3VyZmFjZSkgJiYKKyAgICAgICAgICAoX3RoaXMtPmhpZGRlbi0+cFNETFN1cmZhY2UtPmZsYWdzICYgU0RMX1JFU0laQUJMRSkgJiYKKyAgICAgICAgICAoKHN3cC5jeCAhPSBfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjLnVpWFJlc29sdXRpb24pIHx8CisgICAgICAgICAgIChzd3AuY3kgIT0gX3RoaXMtPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uKQorICAgICAgICAgICkgJiYKKyAgICAgICAgICAoIUZTTGliX1F1ZXJ5RlNNb2RlKF90aGlzLT5oaWRkZW4tPmh3bmRDbGllbnQpKQorICAgICAgICAgKQorICAgICAgeworICAgICAgICAvLyBSZXNpemFibGUgc3VyZmFjZSBhbmQgaW4gcmVzaXppbmchCisgICAgICAgIC8vIFNvLCBkb24ndCBibGl0IG5vdyEKKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgICBwcmludGYoIltVcGRhdGVSZWN0c10gOiBTa2lwcGluZyBibGl0IHdoaWxlIHJlc2l6aW5nIVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgeworICAgICAgLyoKKyAgICAgICAgLy8gQmxpdCB0aGUgd2hvbGUgd2luZG93CisgICAgICAgIEZTTElCX0JJVEJMVChfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCBfdGhpcy0+aGlkZGVuLT5wY2hTcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgX3RoaXMtPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVhSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgX3RoaXMtPmhpZGRlbi0+U3JjQnVmZmVyRGVzYy51aVlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgICAgICBwcmludGYoIltvczJmc2xpYl9VcGRhdGVSZWN0c10gOiBCbGl0dGluZyFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAKKyAgICAgICAgLy8gQmxpdCB0aGUgY2hhbmdlZCBhcmVhcworICAgICAgICBmb3IgKGk9MDsgaTxudW1yZWN0czsgaSsrKQorICAgICAgICAgIEZTTElCX0JJVEJMVChfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCBfdGhpcy0+aGlkZGVuLT5wY2hTcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHJlY3RzW2ldLnksIHJlY3RzW2ldLngsIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgpOworICAgICAgfQorICAgIH0KKyNpZmRlZiBERUJVR19CVUlMRAorICAgICBlbHNlCisgICAgICAgcHJpbnRmKCJbb3MyZnNsaWJfVXBkYXRlUmVjdHNdIDogTm8gcHVibGljIHN1cmZhY2UhXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oX3RoaXMtPmhpZGRlbi0+aG10eFVzZVNyY0J1ZmZlcik7CisgIH0KKyNpZmRlZiBERUJVR19CVUlMRAorICBlbHNlCisgICAgcHJpbnRmKCJbb3MyZnNsaWJfVXBkYXRlUmVjdHNdIDogRXJyb3IgaW4gbXV0ZXghXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyNlbmRpZgorfQorCisKKy8qIFJldmVyc2UgdGhlIGVmZmVjdHMgVmlkZW9Jbml0KCkgLS0gY2FsbGVkIGlmIFZpZGVvSW5pdCgpIGZhaWxzCisgb3IgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHNodXR0aW5nIGRvd24gdGhlIHZpZGVvIHN1YnN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgb3MyZnNsaWJfVmlkZW9RdWl0KF9USElTKQoreworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvUXVpdF1cbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAvLyBDbG9zZSBQTSBzdHVmZiBpZiBydW5uaW5nIQorICBpZiAoX3RoaXMtPmhpZGRlbi0+aVBNVGhyZWFkU3RhdHVzID09IDEpCisgIHsKKyAgICBpbnQgaVRpbWVvdXQ7CisgICAgV2luUG9zdE1zZyhfdGhpcy0+aGlkZGVuLT5od25kRnJhbWUsIFdNX1FVSVQsIChNUEFSQU0pIDAsIChNUEFSQU0pIDApOworICAgIC8vIEhBQ0s6IFdlIGhhZCB0aGlzIGxpbmUgYmVmb3JlOgorICAgIC8vRG9zV2FpdFRocmVhZCgoVElEICopICYoX3RoaXMtPmhpZGRlbi0+dGlkUE1UaHJlYWQpLCBEQ1dXX1dBSVQpOworICAgIC8vIFdlIGRvbid0IHVzZSBpdCwgYmVjYXVzZSB0aGUgUE1UaHJlYWQgd2lsbCBuZXZlciBzdG9wLCBvciBpZiBpdCBzdG9wcywKKyAgICAvLyBpdCB3aWxsIGtpbGwgdGhlIHdob2xlIHByb2Nlc3MgYXMgYSBlbWVyZ2VuY3kgZmFsbGJhY2suCisgICAgLy8gU28sIHdlIG9ubHkgY2hlY2sgZm9yIHRoZSBpUE1UaHJlYWRTdGF0dXMgc3R1ZmYhCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICBwcmludGYoIltvczJmc2xpYl9WaWRlb1F1aXRdIDogV2FpdGluZyBmb3IgUE0gdGhyZWFkIHRvIGRpZVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICBpVGltZW91dD0wOworICAgIHdoaWxlICgoX3RoaXMtPmhpZGRlbi0+aVBNVGhyZWFkU3RhdHVzID09IDEpICYmIChpVGltZW91dDwxMDApKQorICAgIHsKKyAgICAgIGlUaW1lb3V0Kys7CisgICAgICBEb3NTbGVlcCg2NCk7CisgICAgfQorCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICBwcmludGYoIltvczJmc2xpYl9WaWRlb1F1aXRdIDogRW5kIG9mIHdhaXQuXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgIGlmIChfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMgPT0gMSkKKyAgICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvUXVpdF0gOiBLaWxsaW5nIFBNIHRocmVhZCFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgCisgICAgICBfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMgPSAwOworICAgICAgRG9zS2lsbFRocmVhZChfdGhpcy0+aGlkZGVuLT50aWRQTVRocmVhZCk7CisKKyAgICAgIGlmIChfdGhpcy0+aGlkZGVuLT5od25kRnJhbWUpCisgICAgICB7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgICAgcHJpbnRmKCJbb3MyZnNsaWJfVmlkZW9RdWl0XSA6IERlc3Ryb3lpbmcgUE0gd2luZG93IVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICAgICAgV2luRGVzdHJveVdpbmRvdyhfdGhpcy0+aGlkZGVuLT5od25kRnJhbWUpOyBfdGhpcy0+aGlkZGVuLT5od25kRnJhbWU9TlVMTDsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIC8vIEZyZWUgcmVzdWx0IG9mIGFuIG9sZCBMaXN0TW9kZXMoKSBjYWxsLCBiZWNhdXNlIHRoZXJlIGlzCisgIC8vIG5vIEZyZWVMaXN0TW9kZXMoKSBjYWxsIGluIFNETCEKKyAgaWYgKF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQpCisgIHsKKyAgICBTRExfZnJlZShfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0KTsgX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdCA9IE5VTEw7CisgIH0KKworICAvLyBGcmVlIGxpc3Qgb2YgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZXMKKyAgaWYgKF90aGlzLT5oaWRkZW4tPnBBdmFpbGFibGVGU0xpYlZpZGVvTW9kZXMpCisgIHsKKyAgICBGU0xpYl9GcmVlVmlkZW9Nb2RlTGlzdChfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzKTsKKyAgICBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzID0gTlVMTDsKKyAgfQorCisgIC8vIEZyZWUgYXBwbGljYXRpb24gaWNvbiBpZiB3ZSBoYWQgb25lCisgIGlmIChocHRyQ3VycmVudEljb24pCisgIHsKKyAgICBXaW5EZXN0cm95UG9pbnRlcihocHRyQ3VycmVudEljb24pOworICAgIGhwdHJDdXJyZW50SWNvbiA9IE5VTEw7CisgIH0KK30KKworLyogU2V0IHRoZSByZXF1ZXN0ZWQgdmlkZW8gbW9kZSwgcmV0dXJuaW5nIGEgc3VyZmFjZSB3aGljaCB3aWxsIGJlCisgc2V0IHRvIHRoZSBTRExfVmlkZW9TdXJmYWNlLiAgVGhlIHdpZHRoIGFuZCBoZWlnaHQgd2lsbCBhbHJlYWR5CisgYmUgdmVyaWZpZWQgYnkgTGlzdE1vZGVzKCksIGFuZCB0aGUgdmlkZW8gc3Vic3lzdGVtIGlzIGZyZWUgdG8KKyBzZXQgdGhlIG1vZGUgdG8gYSBzdXBwb3J0ZWQgYml0IGRlcHRoIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUKKyBzcGVjaWZpZWQgLS0gdGhlIGRlc2lyZWQgYnBwIHdpbGwgYmUgZW11bGF0ZWQgd2l0aCBhIHNoYWRvdworIHN1cmZhY2UgaWYgbmVjZXNzYXJ5LiAgSWYgYSBuZXcgbW9kZSBpcyByZXR1cm5lZCwgdGhpcyBmdW5jdGlvbgorIHNob3VsZCB0YWtlIGNhcmUgb2YgY2xlYW5pbmcgdXAgdGhlIGN1cnJlbnQgbW9kZS4KKyAqLworc3RhdGljIFNETF9TdXJmYWNlICpvczJmc2xpYl9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisgIHN0YXRpYyBpbnQgYkZpcnN0Q2FsbCA9IDE7CisgIEZTTGliX1ZpZGVvTW9kZV9wIHBNb2RlSW5mbywgcE1vZGVJbmZvRm91bmQ7CisgIEZTTGliX1ZpZGVvTW9kZSBUZW1wTW9kZUluZm87CisgIEhBQiBoYWI7CisgIEhNUSBobXE7CisgIEVSUk9SSUQgaG1xZXJyb3I7CisgIFJFQ1RMIHJlY3RsOworICBTRExfU3VyZmFjZSAqcFJlc3VsdDsKKworICAvLyBJZiB0aGVyZSBpcyBubyBtb3JlIHdpbmRvdywgbm90aGluZyB3ZSBjYW4gZG8hCisgIGlmIChfdGhpcy0+aGlkZGVuLT5pUE1UaHJlYWRTdGF0dXMhPTEpIHJldHVybiBOVUxMOworCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IFJlcXVlc3QgZm9yICVkeCVkIEAgJWRCUFAsIGZsYWdzPTB4JXhcbiIsIHdpZHRoLCBoZWlnaHQsIGJwcCwgZmxhZ3MpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisgIC8vIFdlIGRvbid0IHN1cHBvcnQgcGFsZXR0ZSBtb2RlcyEKKyAgaWYgKGJwcD09OCkgYnBwPTMyOworCisgIC8vIEFsc28sIHdlIGRvbid0IHN1cHBvcnQgcmVzaXphYmxlIG1vZGVzIGluIGZ1bGxzY3JlZW4gbW9kZS4KKyAgaWYgKGZsYWdzICYgU0RMX1JFU0laQUJMRSkKKyAgICBmbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47CisKKyAgLy8gTm8gZG91YmxlIGJ1ZmZlcmVkIG1vZGUKKyAgaWYgKGZsYWdzICYgU0RMX0RPVUJMRUJVRikKKyAgICBmbGFncyAmPSB+U0RMX0RPVUJMRUJVRjsKKworICAvLyBBbmQsIHdlIGRvbid0IHN1cHBvcnQgSFdTVVJGQUNFIHlldC4KKyAgaWYgKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkKKyAgeworICAgIGZsYWdzICY9IH5TRExfSFdTVVJGQUNFOworICAgIGZsYWdzIHw9IFNETF9TV1NVUkZBQ0U7CisgIH0KKworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBDaGFuZ2VkIHJlcXVlc3QgdG8gJWR4JWQgQCAlZEJQUCwgZmxhZ3M9MHgleFxuIiwgd2lkdGgsIGhlaWdodCwgYnBwLCBmbGFncyk7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgc3VjaCBhIHZpZGVvIG1vZGUgdGhleSB3YW50IQorICBwTW9kZUluZm9Gb3VuZCA9IE5VTEw7CisKKyAgLy8gRm9yIGZ1bGxzY3JlZW4gbW9kZSB3ZSBkb24ndCBzdXBwb3J0IGV2ZXJ5IHJlc29sdXRpb24hCisgIC8vIFNvLCBnbyB0aHJvdWdoIHRoZSB2aWRlbyBtb2RlcywgYW5kIGNoZWNrIGZvciBzdWNoIGEgcmVzb2x1dGlvbiEKKyAgcE1vZGVJbmZvRm91bmQgPSBOVUxMOworICBwTW9kZUluZm8gPSBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzOworCisgIHdoaWxlIChwTW9kZUluZm8pCisgIHsKKyAgICAvLyBDaGVjayBhbGwgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZXMgZm9yIHRoaXMgcmVzb2x1dGlvbgorICAgIGlmICgocE1vZGVJbmZvLT51aVhSZXNvbHV0aW9uID09IHdpZHRoKSAmJgorICAgICAgICAocE1vZGVJbmZvLT51aVlSZXNvbHV0aW9uID09IGhlaWdodCkgJiYKKyAgICAgICAgKHBNb2RlSW5mby0+dWlCUFAhPTgpKSAvLyBwYWxldHRpemVkIG1vZGVzIG5vdCB5ZXQgc3VwcG9ydGVkCisgICAgeworICAgICAgLy8gSWYgZ29vZCByZXNvbHV0aW9uLCB0cnkgdG8gZmluZCB0aGUgZXhhY3QgQlBQLCBvciBhdCBsZWFzdAorICAgICAgLy8gc29tZXRoaW5nIHNpbWlsYXIuLi4KKyAgICAgIGlmICghcE1vZGVJbmZvRm91bmQpCisgICAgICAgIHBNb2RlSW5mb0ZvdW5kID0gcE1vZGVJbmZvOworICAgICAgZWxzZQorICAgICAgaWYgKChwTW9kZUluZm9Gb3VuZC0+dWlCUFAhPWJwcCkgJiYKKyAgICAgICAgICAocE1vZGVJbmZvRm91bmQtPnVpQlBQPHBNb2RlSW5mby0+dWlCUFApKQorICAgICAgICBwTW9kZUluZm9Gb3VuZCA9IHBNb2RlSW5mbzsKKyAgICB9CisgICAgcE1vZGVJbmZvID0gcE1vZGVJbmZvLT5wTmV4dDsKKyAgfQorCisgIC8vIElmIHdlIGRpZCBub3QgZmluZCBhIGdvb2QgZnVsbHNjcmVlbiBtb2RlLCB0aGVuIHRyeSBhIHNpbWlsYXIKKyAgaWYgKCFwTW9kZUluZm9Gb3VuZCkKKyAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IFJlcXVlc3RlZCB2aWRlbyBtb2RlIG5vdCBmb3VuZCwgbG9va2luZyBmb3IgYSBzaW1pbGFyIG9uZSFcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgIC8vIEdvIHRocm91Z2ggdGhlIHZpZGVvIG1vZGVzIGFnYWluLCBhbmQgZmluZCBhIHNpbWlsYXIgcmVzb2x1dGlvbiEKKyAgICBwTW9kZUluZm8gPSBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzOworICAgIHdoaWxlIChwTW9kZUluZm8pCisgICAgeworICAgICAgLy8gQ2hlY2sgYWxsIGF2YWlsYWJsZSBmdWxsc2NyZWVuIG1vZGVzIGZvciB0aGlzIHJlc29sdXRpb24KKyAgICAgIGlmICgocE1vZGVJbmZvLT51aVhSZXNvbHV0aW9uID49IHdpZHRoKSAmJgorICAgICAgICAgIChwTW9kZUluZm8tPnVpWVJlc29sdXRpb24gPj0gaGVpZ2h0KSAmJgorICAgICAgICAgIChwTW9kZUluZm8tPnVpQlBQID09IGJwcCkpCisgICAgICB7CisgICAgICAgIGlmICghcE1vZGVJbmZvRm91bmQpCisgICAgICAgICAgcE1vZGVJbmZvRm91bmQgPSBwTW9kZUluZm87CisgICAgICAgIGVsc2UKKyAgICAgICAgaWYgKCgocE1vZGVJbmZvRm91bmQtPnVpWFJlc29sdXRpb24td2lkdGgpKihwTW9kZUluZm9Gb3VuZC0+dWlZUmVzb2x1dGlvbi1oZWlnaHQpKT4KKyAgICAgICAgICAgICgocE1vZGVJbmZvLT51aVhSZXNvbHV0aW9uLXdpZHRoKSoocE1vZGVJbmZvLT51aVlSZXNvbHV0aW9uLWhlaWdodCkpKQorICAgICAgICB7CisgICAgICAgICAgLy8gRm91bmQgYSBtb2RlIHdoaWNoIGlzIGNsb3NlciB0aGFuIHRoZSBjdXJyZW50IG9uZQorICAgICAgICAgIHBNb2RlSW5mb0ZvdW5kID0gcE1vZGVJbmZvOworICAgICAgICB9CisgICAgICB9CisgICAgICBwTW9kZUluZm8gPSBwTW9kZUluZm8tPnBOZXh0OworICAgIH0KKyAgfQorCisgIC8vIElmIHdlIGRpZCBub3QgZmluZCBhIGdvb2QgZnVsbHNjcmVlbiBtb2RlLCB0aGVuIHJldHVybiBOVUxMCisgIGlmICghcE1vZGVJbmZvRm91bmQpCisgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBSZXF1ZXN0ZWQgdmlkZW8gbW9kZSBub3QgZm91bmQhXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IEZvdW5kIG1vZGUhXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAvLyBXZSdsbCBwb3NzaWJseSBhZGp1c3QgdGhlIHN0cnVjdHVyZSwgc28gY29weSBvdXQgdGhlIHZhbHVlcworICAvLyBpbnRvIFRlbXBNb2RlSW5mbyEKKyAgU0RMX21lbWNweSgmVGVtcE1vZGVJbmZvLCBwTW9kZUluZm9Gb3VuZCwgc2l6ZW9mKFRlbXBNb2RlSW5mbykpOworICBwTW9kZUluZm9Gb3VuZCA9ICZUZW1wTW9kZUluZm87CisKKyAgaWYgKGZsYWdzICYgU0RMX1JFU0laQUJMRSkKKyAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IFJlcXVlc3RlZCBtb2RlIGlzIHJlc2l6YWJsZSwgY2hhbmdpbmcgd2lkdGgvaGVpZ2h0XG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAvLyBDaGFuZ2Ugd2lkdGggYW5kIGhlaWdodCB0byByZXF1ZXN0ZWQgb25lIQorICAgIFRlbXBNb2RlSW5mby51aVhSZXNvbHV0aW9uID0gd2lkdGg7CisgICAgVGVtcE1vZGVJbmZvLnVpWVJlc29sdXRpb24gPSBoZWlnaHQ7CisgICAgVGVtcE1vZGVJbmZvLnVpU2NhbkxpbmVTaXplID0gd2lkdGggKiAoKFRlbXBNb2RlSW5mby51aUJQUCs3KS84KTsKKyAgfQorCisgIC8vIFdlIGNhbiB0cnkgY3JlYXRlIG5ldyBzdXJmYWNlIQorCisgIC8vIE1ha2Ugc3VyZSB0aGlzIHRocmVhZCBpcyBwcmVwYXJlZCBmb3IgdXNpbmcgdGhlIFByZXNlbnRhdGlvbiBNYW5hZ2VyIQorICBoYWIgPSBXaW5Jbml0aWFsaXplKDApOworICBobXEgPSBXaW5DcmVhdGVNc2dRdWV1ZShoYWIsMCk7CisgIC8vIFJlbWVtYmVyIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBhdCBXaW5DcmVhdGVNc2dRdWV1ZSgpLCBiZWNhdXNlIHdlIGRvbid0CisgIC8vIHdhbnQgdG8gZGVzdHJveSBzb21lYm9keSBlbHNlJ3MgcXVldWUgbGF0ZXIuIDopCisgIGhtcWVycm9yID0gV2luR2V0TGFzdEVycm9yKGhhYik7CisKKyAgCisKKyAgaWYgKERvc1JlcXVlc3RNdXRleFNlbShfdGhpcy0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyLCBTRU1fSU5ERUZJTklURV9XQUlUKT09Tk9fRVJST1IpCisgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBDcmVhdGluZyBuZXcgU1cgc3VyZmFjZVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICAvLyBDcmVhdGUgbmV3IHNvZnR3YXJlIHN1cmZhY2UhCisgICAgcFJlc3VsdCA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlSW5mb0ZvdW5kLT51aVhSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9kZUluZm9Gb3VuZC0+dWlZUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZGVJbmZvRm91bmQtPnVpQlBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGludCkgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjUmVkTWFzaykgPDwgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjUmVkUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgaW50KSBwTW9kZUluZm9Gb3VuZC0+UGl4ZWxGb3JtYXQudWNHcmVlbk1hc2spIDw8IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0dyZWVuUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgaW50KSBwTW9kZUluZm9Gb3VuZC0+UGl4ZWxGb3JtYXQudWNCbHVlTWFzaykgPDwgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQmx1ZVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGludCkgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQWxwaGFNYXNrKSA8PCBwTW9kZUluZm9Gb3VuZC0+UGl4ZWxGb3JtYXQudWNBbHBoYVBvc2l0aW9uKTsKKworICAgIGlmIChwUmVzdWx0ID09IE5VTEwpCisgICAgeworICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKF90aGlzLT5oaWRkZW4tPmhtdHhVc2VTcmNCdWZmZXIpOworICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyNpZmRlZiBERUJVR19CVUlMRAorICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBBZGp1c3RpbmcgcGl4ZWwgZm9ybWF0XG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgIC8vIEFkanVzdCBwaXhlbCBmb3JtYXQgbWFzayEKKyAgICBwUmVzdWx0LT5mb3JtYXQtPlJtYXNrID0gKCh1bnNpZ25lZCBpbnQpIHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y1JlZE1hc2spIDw8IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y1JlZFBvc2l0aW9uOworICAgIHBSZXN1bHQtPmZvcm1hdC0+UnNoaWZ0ID0gcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjUmVkUG9zaXRpb247CisgICAgcFJlc3VsdC0+Zm9ybWF0LT5SbG9zcyA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y1JlZEFkanVzdDsKKyAgICBwUmVzdWx0LT5mb3JtYXQtPkdtYXNrID0gKCh1bnNpZ25lZCBpbnQpIHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0dyZWVuTWFzaykgPDwgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjR3JlZW5Qb3NpdGlvbjsKKyAgICBwUmVzdWx0LT5mb3JtYXQtPkdzaGlmdCA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0dyZWVuUG9zaXRpb247CisgICAgcFJlc3VsdC0+Zm9ybWF0LT5HbG9zcyA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0dyZWVuQWRqdXN0OworICAgIHBSZXN1bHQtPmZvcm1hdC0+Qm1hc2sgPSAoKHVuc2lnbmVkIGludCkgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQmx1ZU1hc2spIDw8IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0JsdWVQb3NpdGlvbjsKKyAgICBwUmVzdWx0LT5mb3JtYXQtPkJzaGlmdCA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0JsdWVQb3NpdGlvbjsKKyAgICBwUmVzdWx0LT5mb3JtYXQtPkJsb3NzID0gcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQmx1ZUFkanVzdDsKKyAgICBwUmVzdWx0LT5mb3JtYXQtPkFtYXNrID0gKCh1bnNpZ25lZCBpbnQpIHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0FscGhhTWFzaykgPDwgcE1vZGVJbmZvRm91bmQtPlBpeGVsRm9ybWF0LnVjQWxwaGFQb3NpdGlvbjsKKyAgICBwUmVzdWx0LT5mb3JtYXQtPkFzaGlmdCA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0FscGhhUG9zaXRpb247CisgICAgcFJlc3VsdC0+Zm9ybWF0LT5BbG9zcyA9IHBNb2RlSW5mb0ZvdW5kLT5QaXhlbEZvcm1hdC51Y0FscGhhQWRqdXN0OworCisjaWZkZWYgUkVQT1JUX0VNUFRZX0FMUEhBX01BU0sKKyAgICBwUmVzdWx0LT5mb3JtYXQtPkFtYXNrID0KKyAgICAgICAgcFJlc3VsdC0+Zm9ybWF0LT5Bc2hpZnQgPQorICAgICAgICBwUmVzdWx0LT5mb3JtYXQtPkFsb3NzID0gMDsKKyNlbmRpZgorCisgICAgLy8gQWRqdXN0IHN1cmZhY2UgZmxhZ3MKKyAgICBwUmVzdWx0LT5mbGFncyB8PSAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTik7CisgICAgcFJlc3VsdC0+ZmxhZ3MgfD0gKGZsYWdzICYgU0RMX1JFU0laQUJMRSk7CisKKyAgICAvLyBJdCBtaWdodCBiZSB0aGF0IHRoZSBzb2Z0d2FyZSBzdXJmYWNlIHBpdGNoIGlzIG5vdCB0aGUgc2FtZSBhcworICAgIC8vIHRoZSBwaXRjaCB3ZSBoYXZlLCBzbyBhZGp1c3QgdGhhdCEKKyAgICBwTW9kZUluZm9Gb3VuZC0+dWlTY2FuTGluZVNpemUgPSBwUmVzdWx0LT5waXRjaDsKKworICAgIC8vIFN0b3JlIG5ldyBzb3VyY2UgYnVmZmVyIHBhcmFtZXRlcnMhCisgICAgU0RMX21lbWNweSgmKF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MpLCBwTW9kZUluZm9Gb3VuZCwgc2l6ZW9mKCpwTW9kZUluZm9Gb3VuZCkpOworICAgIF90aGlzLT5oaWRkZW4tPnBjaFNyY0J1ZmZlciA9IHBSZXN1bHQtPnBpeGVsczsKKworI2lmZGVmIERFQlVHX0JVSUxECisgICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IFRlbGxpbmcgRlNMaWIgdGhlIHN0dWZmc1xuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICAvLyBUZWxsIHRoZSBGU0xpYiB3aW5kb3cgdGhlIG5ldyBzb3VyY2UgaW1hZ2UgZm9ybWF0CisgICAgRlNMaWJfU2V0U3JjQnVmZmVyRGVzYyhfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCAmKF90aGlzLT5oaWRkZW4tPlNyY0J1ZmZlckRlc2MpKTsKKworICAgIGlmICgKKyAgICAgICAgKChmbGFncyAmIFNETF9SRVNJWkFCTEUpPT0wKSB8fAorICAgICAgICAoYkZpcnN0Q2FsbCkKKyAgICAgICApCisgICAgeworICAgICAgYkZpcnN0Q2FsbCA9IDA7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBNb2RpZnlpbmcgd2luZG93IHNpemVcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisgICAgICAvLyBDYWxjdWxhdGUgZnJhbWUgd2luZG93IHNpemUgZnJvbSBjbGllbnQgd2luZG93IHNpemUKKyAgICAgIHJlY3RsLnhMZWZ0ID0gMDsKKyAgICAgIHJlY3RsLnlCb3R0b20gPSAwOworICAgICAgcmVjdGwueFJpZ2h0ID0gcE1vZGVJbmZvRm91bmQtPnVpWFJlc29sdXRpb247IC8vIE5vbmluY2x1c2l2ZQorICAgICAgcmVjdGwueVRvcCA9IHBNb2RlSW5mb0ZvdW5kLT51aVlSZXNvbHV0aW9uOyAvLyBOb25pbmNsdXNpdmUKKyAgICAgIFdpbkNhbGNGcmFtZVJlY3QoX3RoaXMtPmhpZGRlbi0+aHduZEZyYW1lLCAmcmVjdGwsIEZBTFNFKTsKKworICAgICAgLy8gU2V0IHRoZSBuZXcgc2l6ZSBvZiB0aGUgbWFpbiB3aW5kb3cKKyAgICAgIFNldEFjY2Vzc2FibGVXaW5kb3dQb3MoX3RoaXMtPmhpZGRlbi0+aHduZEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EX1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlY3RsLnhSaWdodC1yZWN0bC54TGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWN0bC55VG9wLXJlY3RsLnlCb3R0b20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfU0laRSB8IFNXUF9BQ1RJVkFURSB8IFNXUF9TSE9XKTsKKyAgICB9CisKKyAgICAvLyBTZXQgZnVsbHNjcmVlbiBtb2RlIGZsYWcsIGFuZCBzd2l0Y2ggdG8gZnVsbHNjcmVlbiBpZiBuZWVkZWQhCisgICAgaWYgKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pCisgICAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgICBwcmludGYoIltvczJmc2xpYl9TZXRWaWRlb01vZGVdIDogQWxzbyB0cnlpbmcgdG8gc3dpdGNoIHRvIGZ1bGxzY3JlZW5cbiIpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgIEZTTGliX1RvZ2dsZUZTTW9kZShfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCAxKTsKKyAgICAgIC8qIEN1cnNvciBtYW5hZ2VyIGZ1bmN0aW9ucyB0byBGUyBtb2RlKi8KKyAgICAgIG9zMmZzbGliX1NldEN1cnNvck1hbmFnZW1lbnRGdW5jdGlvbnMoX3RoaXMsIDApOworICAgIH0gZWxzZQorICAgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IEFsc28gdHJ5aW5nIHRvIHN3aXRjaCB0byBkZXNrdG9wIG1vZGVcbiIpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAgIEZTTGliX1RvZ2dsZUZTTW9kZShfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCAwKTsKKyAgICAgIC8qIEN1cnNvciBtYW5hZ2VyIGZ1bmN0aW9ucyB0byBXaW5kb3dlZCBtb2RlKi8KKyAgICAgIG9zMmZzbGliX1NldEN1cnNvck1hbmFnZW1lbnRGdW5jdGlvbnMoX3RoaXMsIDEpOworICAgIH0KKworICAgIF90aGlzLT5oaWRkZW4tPnBTRExTdXJmYWNlID0gcFJlc3VsdDsKKworICAgIERvc1JlbGVhc2VNdXRleFNlbShfdGhpcy0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyKTsKKyAgfSBlbHNlCisgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBDb3VsZCBub3QgZ2V0IGhtdHhVc2VTcmNCdWZmZXIhXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICAKKyAgICBwUmVzdWx0ID0gTlVMTDsKKyAgfQorCisgIC8vIEFzIHdlIGhhdmUgdGhlIG5ldyBzdXJmYWNlLCB3ZSBkb24ndCBuZWVkIHRoZSBjdXJyZW50IG9uZSBhbnltb3JlIQorICBpZiAoKHBSZXN1bHQpICYmIChjdXJyZW50KSkKKyAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgcHJpbnRmKCJbb3MyZnNsaWJfU2V0VmlkZW9Nb2RlXSA6IEZyZWVpbmcgb2xkIHN1cmZhY2VcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgIFNETF9GcmVlU3VyZmFjZShjdXJyZW50KTsKKyAgfQorCisgIC8vIFJlZHJhdyB3aW5kb3cKKyAgV2luSW52YWxpZGF0ZVJlZ2lvbihfdGhpcy0+aGlkZGVuLT5od25kQ2xpZW50LCBOVUxMLCBUUlVFKTsKKworICAvLyBOb3cgZGVzdHJveSB0aGUgbWVzc2FnZSBxdWV1ZSwgaWYgd2UndmUgY3JlYXRlZCBpdCEKKyAgaWYgKEVSUk9SSURFUlJPUihobXFlcnJvcik9PTApCisgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgIHByaW50ZigiW29zMmZzbGliX1NldFZpZGVvTW9kZV0gOiBEZXN0cm95aW5nIG1lc3NhZ2UgcXVldWVcbiIpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOworICB9CisKKyNpZmRlZiBERUJVR19CVUlMRAorICBwcmludGYoIltvczJmc2xpYl9TZXRWaWRlb01vZGVdIDogRG9uZVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgLyogV2UncmUgZG9uZSAqLworCisgIC8vIFJldHVybiB3aXRoIHRoZSBuZXcgc3VyZmFjZSEKKyAgcmV0dXJuIHBSZXN1bHQ7Cit9CisKKy8qIExpc3QgdGhlIGF2YWlsYWJsZSB2aWRlbyBtb2RlcyBmb3IgdGhlIGdpdmVuIHBpeGVsIGZvcm1hdCwgc29ydGVkCisgZnJvbSBsYXJnZXN0IHRvIHNtYWxsZXN0LgorICovCitzdGF0aWMgU0RMX1JlY3QgKipvczJmc2xpYl9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCit7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgcHJpbnRmKCJbb3MyZnNsaWJfTGlzdE1vZGVzXSA6IExpc3RNb2RlcyBvZiAlZCBCcHBcbiIsIGZvcm1hdC0+Qml0c1BlclBpeGVsKTsKKyNlbmRpZgorICAvLyBEZXN0cm95IHJlc3VsdCBvZiBwcmV2aW91cyBjYWxsLCBpZiB0aGVyZSBpcyBhbnkKKyAgaWYgKF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQpCisgIHsKKyAgICBTRExfZnJlZShfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0KTsgX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdCA9IE5VTEw7CisgIH0KKworICAvLyBGb3IgcmVzaXphYmxlIGFuZCB3aW5kb3dlZCBtb2RlIHdlIHN1cHBvcnQgZXZlcnkgcmVzb2x1dGlvbiEKKyAgaWYgKChmbGFncyAmIFNETF9SRVNJWkFCTEUpICYmICgoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gMCkpCisgICAgcmV0dXJuIChTRExfUmVjdCAqKiktMTsKKworICAvLyBDaGVjayBpZiB0aGV5IG5lZWQgZnVsbHNjcmVlbiBvciBub24tZnVsbHNjcmVlbiB2aWRlbyBtb2RlcyEKKyAgaWYgKChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSAwKQorCisgIHsKKyAgICAvLyBGb3Igd2luZG93ZWQgbW9kZSB3ZSBzdXBwb3J0IGV2ZXJ5IHJlc29sdXRpb24hCisgICAgcmV0dXJuIChTRExfUmVjdCAqKiktMTsKKyAgfSBlbHNlCisgIHsKKyAgICBGU0xpYl9WaWRlb01vZGVfcCBwRlNNb2RlOworICAgIC8vIEZvciBmdWxsc2NyZWVuIG1vZGUgd2UgZG9uJ3Qgc3VwcG9ydCBldmVyeSByZXNvbHV0aW9uIQorICAgIC8vIE5vdyBjcmVhdGUgYSBuZXcgbGlzdAorICAgIHBGU01vZGUgPSBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzOworICAgIHdoaWxlIChwRlNNb2RlKQorICAgIHsKKyAgICAgIGlmIChwRlNNb2RlLT51aUJQUCA9PSBmb3JtYXQtPkJpdHNQZXJQaXhlbCkKKyAgICAgIHsKKyAgICAgICAgU0RMX1JlY3QgKnBSZWN0ID0gKFNETF9SZWN0ICopIFNETF9tYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7CisgICAgICAgIGlmIChwUmVjdCkKKyAgICAgICAgeworICAgICAgICAgIC8vIEZpbGwgZGVzY3JpcHRpb24KKyAgICAgICAgICBwUmVjdC0+eCA9IDA7CisgICAgICAgICAgcFJlY3QtPnkgPSAwOworICAgICAgICAgIHBSZWN0LT53ID0gcEZTTW9kZS0+dWlYUmVzb2x1dGlvbjsKKyAgICAgICAgICBwUmVjdC0+aCA9IHBGU01vZGUtPnVpWVJlc29sdXRpb247CisjaWZkZWYgREVCVUdfQlVJTEQKKy8vICAgICAgICAgIHByaW50ZigiISEhIFNlZW1zIHRvIGJlIGdvb2QhXG4iKTsKKy8vICAgICAgICBwcmludGYoIkY6ICVkeCVkXG4iLCBwUmVjdC0+dywgcFJlY3QtPmgpOworI2VuZGlmCisgICAgICAgICAgLy8gQW5kIGluc2VydCBpbnRvIGxpc3Qgb2YgcFJlY3RzCisgICAgICAgICAgaWYgKCEoX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdCkpCisgICAgICAgICAgeworI2lmZGVmIERFQlVHX0JVSUxECisvLyAgICAgICAgICAgIHByaW50ZigiISEhIEluc2VydGluZyB0byBiZWdpbm5pbmdcbiIpOworI2VuZGlmCisKKyAgICAgICAgICAgIC8vIFdlJ3JlIHRoZSBmaXJzdCBvbmUgdG8gYmUgaW5zZXJ0ZWQhCisgICAgICAgICAgICBfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0ID0gKFNETF9SZWN0KiopIFNETF9tYWxsb2MoMipzaXplb2YoU0RMX1JlY3QqKSk7CisgICAgICAgICAgICBpZiAoX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdFswXSA9IHBSZWN0OworICAgICAgICAgICAgICBfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0WzFdID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBTRExfZnJlZShwUmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gV2UncmUgbm90IHRoZSBmaXJzdCBvbmVzLCBzbyBmaW5kIHRoZSBwbGFjZSB3aGVyZSB3ZQorICAgICAgICAgICAgLy8gaGF2ZSB0byBpbnNlcnQgb3Vyc2VsdmVzCisgICAgICAgICAgICBTRExfUmVjdCAqKnBOZXdMaXN0OworICAgICAgICAgICAgaW50IGlQbGFjZSwgaU51bU9mU2xvdHMsIGk7CisKKyNpZmRlZiBERUJVR19CVUlMRAorLy8gICAgICAgICAgICBwcmludGYoIiEhISBTZWFyY2hpbmcgd2hlcmUgdG8gaW5zZXJ0XG4iKTsKKyNlbmRpZgorCisgICAgICAgICAgICBpUGxhY2UgPSAtMTsgaU51bU9mU2xvdHMgPSAxOyAvLyBDb3VudCB0aGUgbGFzdCBOVUxMIHRvbyEKKyAgICAgICAgICAgIGZvciAoaT0wOyBfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0W2ldOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlOdW1PZlNsb3RzKys7CisgICAgICAgICAgICAgIGlmIChpUGxhY2U9PS0xKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0W2ldLT53Kl90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHRbaV0tPmgpPAorICAgICAgICAgICAgICAgICAgICAocFJlY3QtPncqcFJlY3QtPmgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlQbGFjZSA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaVBsYWNlPT0tMSkgaVBsYWNlID0gaU51bU9mU2xvdHMtMTsKKworI2lmZGVmIERFQlVHX0JVSUxECisvLyAgICAgICAgICAgIHByaW50ZigiISEhIEZyb20gJWQgc2xvdHMsIGl0IHdpbGwgYmUgYXQgJWRcbiIsIGlOdW1PZlNsb3RzLCBpUGxhY2UpOworI2VuZGlmCisKKyAgICAgICAgICAgIHBOZXdMaXN0ID0gKFNETF9SZWN0KiopIFNETF9yZWFsbG9jKF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQsIChpTnVtT2ZTbG90cysxKSpzaXplb2YoU0RMX1JlY3QqKSk7CisgICAgICAgICAgICBpZiAocE5ld0xpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvciAoaT1pTnVtT2ZTbG90cztpPmlQbGFjZTtpLS0pCisgICAgICAgICAgICAgICAgcE5ld0xpc3RbaV0gPSBwTmV3TGlzdFtpLTFdOworICAgICAgICAgICAgICBwTmV3TGlzdFtpUGxhY2VdID0gcFJlY3Q7CisgICAgICAgICAgICAgIF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQgPSBwTmV3TGlzdDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBTRExfZnJlZShwUmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBwRlNNb2RlID0gcEZTTW9kZS0+cE5leHQ7CisgICAgfQorICB9CisjaWZkZWYgREVCVUdfQlVJTEQKKy8vICBwcmludGYoIlJldHVybmluZyBsaXN0XG4iKTsKKyNlbmRpZgorICByZXR1cm4gX3RoaXMtPmhpZGRlbi0+cExpc3RNb2Rlc1Jlc3VsdDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSwgZmlsbGluZyAndmZvcm1hdCcgd2l0aCB0aGUKKyAiYmVzdCIgZGlzcGxheSBwaXhlbCBmb3JtYXQsIHJldHVybmluZyAwIG9yIC0xIGlmIHRoZXJlJ3MgYW4gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgb3MyZnNsaWJfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisgIEZTTGliX1ZpZGVvTW9kZV9wIHBEZXNrdG9wTW9kZTsKKworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvSW5pdF0gOiBFbnRlclxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgLy8gUmVwb3J0IHRoZSBiZXN0IHBpeGVsIGZvcm1hdC4gRm9yIHRoaXMsCisgIC8vIHdlJ2xsIHVzZSB0aGUgY3VycmVudCBkZXNrdG9wIGZvcm1hdC4KKyAgcERlc2t0b3BNb2RlID0gRlNMaWJfR2V0RGVza3RvcFZpZGVvTW9kZSgpOworICBpZiAoIXBEZXNrdG9wTW9kZSkKKyAgeworICAgIFNETF9TZXRFcnJvcigiQ291bGQgbm90IHF1ZXJ5IGRlc2t0b3AgdmlkZW8gbW9kZSEiKTsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvSW5pdF0gOiBDb3VsZCBub3QgcXVlcnkgZGVza3RvcCB2aWRlbyBtb2RlIVxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUgKi8KKyAgX3RoaXMtPmluZm8uY3VycmVudF93ID0gcERlc2t0b3BNb2RlLT51aVhSZXNvbHV0aW9uOworICBfdGhpcy0+aW5mby5jdXJyZW50X2ggPSBwRGVza3RvcE1vZGUtPnVpWVJlc29sdXRpb247CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBzY3JlZW4gZGVwdGggKi8KKyAgdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gcERlc2t0b3BNb2RlLT51aUJQUDsKKyAgdmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9ICh2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwrNykvODsKKworICB2Zm9ybWF0LT5SbWFzayA9ICgodW5zaWduZWQgaW50KSBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjUmVkTWFzaykgPDwgcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y1JlZFBvc2l0aW9uOworICB2Zm9ybWF0LT5Sc2hpZnQgPSBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjUmVkUG9zaXRpb247CisgIHZmb3JtYXQtPlJsb3NzID0gcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y1JlZEFkanVzdDsKKyAgdmZvcm1hdC0+R21hc2sgPSAoKHVuc2lnbmVkIGludCkgcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0dyZWVuTWFzaykgPDwgcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0dyZWVuUG9zaXRpb247CisgIHZmb3JtYXQtPkdzaGlmdCA9IHBEZXNrdG9wTW9kZS0+UGl4ZWxGb3JtYXQudWNHcmVlblBvc2l0aW9uOworICB2Zm9ybWF0LT5HbG9zcyA9IHBEZXNrdG9wTW9kZS0+UGl4ZWxGb3JtYXQudWNHcmVlbkFkanVzdDsKKyAgdmZvcm1hdC0+Qm1hc2sgPSAoKHVuc2lnbmVkIGludCkgcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0JsdWVNYXNrKSA8PCBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjQmx1ZVBvc2l0aW9uOworICB2Zm9ybWF0LT5Cc2hpZnQgPSBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjQmx1ZVBvc2l0aW9uOworICB2Zm9ybWF0LT5CbG9zcyA9IHBEZXNrdG9wTW9kZS0+UGl4ZWxGb3JtYXQudWNCbHVlQWRqdXN0OworICB2Zm9ybWF0LT5BbWFzayA9ICgodW5zaWduZWQgaW50KSBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjQWxwaGFNYXNrKSA8PCBwRGVza3RvcE1vZGUtPlBpeGVsRm9ybWF0LnVjQWxwaGFQb3NpdGlvbjsKKyAgdmZvcm1hdC0+QXNoaWZ0ID0gcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0FscGhhUG9zaXRpb247CisgIHZmb3JtYXQtPkFsb3NzID0gcERlc2t0b3BNb2RlLT5QaXhlbEZvcm1hdC51Y0FscGhhQWRqdXN0OworCisjaWZkZWYgUkVQT1JUX0VNUFRZX0FMUEhBX01BU0sKKyAgdmZvcm1hdC0+QW1hc2sgPQorICAgICAgdmZvcm1hdC0+QXNoaWZ0ID0KKyAgICAgIHZmb3JtYXQtPkFsb3NzID0gMDsKKyNlbmRpZgorCisgIC8vIEZpbGwgaW4gc29tZSB3aW5kb3cgbWFuYWdlciBjYXBhYmlsaXRpZXMKKyAgX3RoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMTsKKworICAvLyBJbml0aWFsaXplIHNvbWUgaW50ZXJuYWwgdmFyaWFibGVzCisgIF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQgPSBOVUxMOworICBfdGhpcy0+aGlkZGVuLT5mSW5Gb2N1cyA9IDA7CisgIF90aGlzLT5oaWRkZW4tPmlTa2lwV01NT1VTRU1PVkUgPSAwOworICBfdGhpcy0+aGlkZGVuLT5pTW91c2VWaXNpYmxlID0gMTsKKworICBpZiAoZ2V0ZW52KCJTRExfVVNFX1BST1BPUlRJT05BTF9XSU5ET1ciKSkKKyAgICBfdGhpcy0+aGlkZGVuLT5iUHJvcG9ydGlvbmFsUmVzaXplID0gMTsKKyAgZWxzZQorICB7CisgICAgUFBJQiBwaWI7CisgICAgUFRJQiB0aWI7CisgICAgY2hhciAqcGNoRmlsZU5hbWUsICpwY2hUZW1wOworICAgIGNoYXIgYWNoQ29uZmlnRmlsZVtDQ0hNQVhQQVRIXTsKKyAgICBGSUxFICpoRmlsZTsKKworICAgIC8qIE5vIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGhhdmUgcHJvcG9ydGlvbmFsIHdpbmRvdy4KKyAgICAgKiBPaywgbGV0J3MgY2hlY2sgaWYgdGhpcyBleGVjdXRhYmxlIGlzIGluIGNvbmZpZyBmaWxlIQorICAgICAqLworICAgIF90aGlzLT5oaWRkZW4tPmJQcm9wb3J0aW9uYWxSZXNpemUgPSAwOworCisgICAgRG9zR2V0SW5mb0Jsb2NrcygmdGliLCAmcGliKTsKKyAgICBwY2hUZW1wID0gcGNoRmlsZU5hbWUgPSBwaWItPnBpYl9wY2hjbWQ7CisgICAgd2hpbGUgKCpwY2hUZW1wKQorICAgIHsKKyAgICAgIGlmICgqcGNoVGVtcD09J1xcJykKKyAgICAgICAgcGNoRmlsZU5hbWUgPSBwY2hUZW1wKzE7CisgICAgICBwY2hUZW1wKys7CisgICAgfQorICAgIGlmIChnZXRlbnYoIkhPTUUiKSkKKyAgICB7CisgICAgICBzcHJpbnRmKGFjaENvbmZpZ0ZpbGUsICIlc1xcLnNkbC5wcm9wb3J0aW9uYWxzIiwgZ2V0ZW52KCJIT01FIikpOworICAgICAgaEZpbGUgPSBmb3BlbihhY2hDb25maWdGaWxlLCAicnQiKTsKKyAgICAgIGlmICghaEZpbGUpCisgICAgICB7CisgICAgICAgIC8qIFNlZW1zIGxpa2UgdGhlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCBvciBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICogTGV0J3MgdHJ5IHRvIGNyZWF0ZSBpdCB3aXRoIGRlZmF1bHRzIQorICAgICAgICAgKi8KKyAgICAgICAgaEZpbGUgPSBmb3BlbihhY2hDb25maWdGaWxlLCAid3QiKTsKKyAgICAgICAgaWYgKGhGaWxlKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZihoRmlsZSwgIjsgVGhpcyBmaWxlIGlzIGEgY29uZmlnIGZpbGUgb2YgU0RMLzIsIGNvbnRhaW5pbmdcbiIpOworICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7IHRoZSBsaXN0IG9mIGV4ZWN1dGFibGVzIHRoYXQgbXVzdCBoYXZlIHByb3BvcnRpb25hbFxuIik7CisgICAgICAgICAgZnByaW50ZihoRmlsZSwgIjsgd2luZG93cy5cbiIpOworICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7XG4iKTsKKyAgICAgICAgICBmcHJpbnRmKGhGaWxlLCAiOyBZb3UgY2FuIGFkZCBleGVjdXRhYmxlIGZpbGVuYW1lcyBpbnRvIHRoaXMgZmlsZSxcbiIpOworICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7IG9uZSB1bmRlciB0aGUgb3RoZXIuIElmIFNETCBmaW5kcyB0aGF0IGEgZ2l2ZW5cbiIpOworICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7IHByb2dyYW0gaXMgaW4gdGhpcyBsaXN0LCB0aGVuIHRoYXQgYXBwbGljYXRpb25cbiIpOworICAgICAgICAgIGZwcmludGYoaEZpbGUsICI7IHdpbGwgaGF2ZSBwcm9wb3J0aW9uYWwgd2luZG93cywganVzdCBsaWtlIGlmXG4iKTsKKyAgICAgICAgICBmcHJpbnRmKGhGaWxlLCAiOyB0aGUgU0VUIFNETF9VU0VfUFJPUE9SVElPTkFMX1dJTkRPVyBlbnYuIHZhcmlhYmxlXG4iKTsKKyAgICAgICAgICBmcHJpbnRmKGhGaWxlLCAiOyB3b3VsZCBoYXZlIGJlZW4gc2V0IGZvciB0aGF0IHByb2Nlc3MuXG4iKTsKKyAgICAgICAgICBmcHJpbnRmKGhGaWxlLCAiO1xuIik7CisgICAgICAgICAgZnByaW50ZihoRmlsZSwgIlxuIik7CisgICAgICAgICAgZnByaW50ZihoRmlsZSwgImRvc2JveC5leGVcbiIpOworICAgICAgICAgIGZjbG9zZShoRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBoRmlsZSA9IGZvcGVuKGFjaENvbmZpZ0ZpbGUsICJydCIpOworICAgICAgfQorCisgICAgICBpZiAoaEZpbGUpCisgICAgICB7CisgICAgICAgIHdoaWxlIChmZ2V0cyhhY2hDb25maWdGaWxlLCBzaXplb2YoYWNoQ29uZmlnRmlsZSksIGhGaWxlKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEN1dCBcbiBmcm9tIGVuZCBvZiBzdHJpbmcgKi8KKworICAgICAgICAgIHdoaWxlIChhY2hDb25maWdGaWxlW3N0cmxlbihhY2hDb25maWdGaWxlKS0xXSA9PSAnXG4nKQorICAgICAgICAgICAgYWNoQ29uZmlnRmlsZVtzdHJsZW4oYWNoQ29uZmlnRmlsZSktMV0gPSAwOworCisgICAgICAgICAgLyogQ29tcGFyZS4uLiAqLworICAgICAgICAgIGlmIChzdHJpY21wKGFjaENvbmZpZ0ZpbGUsIHBjaEZpbGVOYW1lKT09MCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBGb3VuZCBpdCBpbiBjb25maWcgZmlsZSEgKi8KKyAgICAgICAgICAgIF90aGlzLT5oaWRkZW4tPmJQcm9wb3J0aW9uYWxSZXNpemUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZjbG9zZShoRmlsZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwgJihfdGhpcy0+aGlkZGVuLT5obXR4VXNlU3JjQnVmZmVyKSwgMCwgRkFMU0UpOworCisgIC8vIE5vdyBjcmVhdGUgb3VyIHdpbmRvdyB3aXRoIGEgZGVmYXVsdCBzaXplCisKKyAgLy8gRm9yIHRoaXMsIHdlIHNlbGVjdCB0aGUgZmlyc3QgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZSBhcworICAvLyBjdXJyZW50IHdpbmRvdyBzaXplIQorICBTRExfbWVtY3B5KCYoX3RoaXMtPmhpZGRlbi0+U3JjQnVmZmVyRGVzYyksIF90aGlzLT5oaWRkZW4tPnBBdmFpbGFibGVGU0xpYlZpZGVvTW9kZXMsIHNpemVvZihfdGhpcy0+aGlkZGVuLT5TcmNCdWZmZXJEZXNjKSk7CisgIC8vIEFsbG9jYXRlIG5ldyB2aWRlbyBidWZmZXIhCisgIF90aGlzLT5oaWRkZW4tPnBjaFNyY0J1ZmZlciA9IChjaGFyICopIFNETF9tYWxsb2MoX3RoaXMtPmhpZGRlbi0+cEF2YWlsYWJsZUZTTGliVmlkZW9Nb2Rlcy0+dWlTY2FuTGluZVNpemUgKiBfdGhpcy0+aGlkZGVuLT5wQXZhaWxhYmxlRlNMaWJWaWRlb01vZGVzLT51aVlSZXNvbHV0aW9uKTsKKyAgaWYgKCFfdGhpcy0+aGlkZGVuLT5wY2hTcmNCdWZmZXIpCisgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvSW5pdF0gOiBZaWtlcywgbm90IGVub3VnaCBtZW1vcnkgZm9yIG5ldyB2aWRlbyBidWZmZXIhXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKyAgICBTRExfU2V0RXJyb3IoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBuZXcgdmlkZW8gYnVmZmVyIVxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8gRm9yIHRoaXMsIHdlIG5lZWQgYSBtZXNzYWdlIHByb2Nlc3NpbmcgdGhyZWFkLgorICAvLyBXZSdsbCBjcmVhdGUgYSBuZXcgdGhyZWFkIGZvciB0aGlzLCB3aGljaCB3aWxsIGRvIGV2ZXJ5dGhpbmcKKyAgLy8gd2hhdCBpcyByZWxhdGVkIHRvIFBNCisgIF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyA9IDA7CisgIF90aGlzLT5oaWRkZW4tPnRpZFBNVGhyZWFkID0gX2JlZ2ludGhyZWFkKFBNVGhyZWFkRnVuYywgTlVMTCwgNjU1MzYsICh2b2lkICopIF90aGlzKTsKKyAgaWYgKF90aGlzLT5oaWRkZW4tPnRpZFBNVGhyZWFkIDw9IDApCisgIHsKKyNpZmRlZiBERUJVR19CVUlMRAorICAgIHByaW50ZigiW29zMmZzbGliX1ZpZGVvSW5pdF0gOiBDb3VsZCBub3QgY3JlYXRlIFBNIHRocmVhZCFcbiIpOworI2VuZGlmCisgICAgU0RMX1NldEVycm9yKCJDb3VsZCBub3QgY3JlYXRlIFBNIHRocmVhZCIpOworICAgIHJldHVybiAtMTsKKyAgfQorI2lmZGVmIFVTRV9ET1NTRVRQUklPUklUWQorICAvLyBCdXJzdCB0aGUgcHJpb3JpdHkgb2YgUE0gVGhyZWFkIQorICBEb3NTZXRQcmlvcml0eShQUlRZU19USFJFQUQsIFBSVFlDX1RJTUVDUklUSUNBTCwgMCwgX3RoaXMtPmhpZGRlbi0+dGlkUE1UaHJlYWQpOworI2VuZGlmCisgIC8vIFdhaXQgZm9yIHRoZSBQTSB0aHJlYWQgdG8gaW5pdGlhbGl6ZSEKKyAgd2hpbGUgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cz09MCkKKyAgICBEb3NTbGVlcCgzMik7CisgIC8vIElmIHRoZSBQTSB0aHJlYWQgY291bGQgbm90IHNldCB1cCBldmVyeXRoaW5nLCB0aGVuCisgIC8vIHJlcG9ydCBhbiBlcnJvciEKKyAgaWYgKF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyE9MSkKKyAgeworI2lmZGVmIERFQlVHX0JVSUxECisgICAgcHJpbnRmKCJbb3MyZnNsaWJfVmlkZW9Jbml0XSA6IFBNVGhyZWFkIHJlcG9ydGVkIGFuIGVycm9yIDogJWRcbiIsIF90aGlzLT5oaWRkZW4tPmlQTVRocmVhZFN0YXR1cyk7CisjZW5kaWYKKyAgICBTRExfU2V0RXJyb3IoIkVycm9yIGluaXRpYWxpemluZyBQTSB0aHJlYWQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBvczJmc2xpYl9EZWxldGVEZXZpY2UoX1RISVMpCit7CisjaWZkZWYgREVCVUdfQlVJTEQKKyAgcHJpbnRmKCJbb3MyZnNsaWJfRGVsZXRlRGV2aWNlXVxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgIC8vIEZyZWUgdXNlZCBtZW1vcnkKKyAgRlNMaWJfRnJlZVZpZGVvTW9kZUxpc3QoX3RoaXMtPmhpZGRlbi0+cEF2YWlsYWJsZUZTTGliVmlkZW9Nb2Rlcyk7CisgIGlmIChfdGhpcy0+aGlkZGVuLT5wTGlzdE1vZGVzUmVzdWx0KQorICAgIFNETF9mcmVlKF90aGlzLT5oaWRkZW4tPnBMaXN0TW9kZXNSZXN1bHQpOworICBpZiAoX3RoaXMtPmhpZGRlbi0+cGNoU3JjQnVmZmVyKQorICAgIFNETF9mcmVlKF90aGlzLT5oaWRkZW4tPnBjaFNyY0J1ZmZlcik7CisgIERvc0Nsb3NlTXV0ZXhTZW0oX3RoaXMtPmhpZGRlbi0+aG10eFVzZVNyY0J1ZmZlcik7CisgIFNETF9mcmVlKF90aGlzLT5oaWRkZW4pOworICBTRExfZnJlZShfdGhpcyk7CisgIEZTTGliX1VuaW5pdGlhbGl6ZSgpOworfQorCitzdGF0aWMgaW50IG9zMmZzbGliX0F2YWlsYWJsZSh2b2lkKQoreworCisgIC8vIElmIHdlIGNhbiBydW4sIGl0IG1lYW5zIHRoYXQgd2UgY291bGQgbG9hZCBGU0xpYiwKKyAgLy8gc28gd2UgYXNzdW1lIHRoYXQgaXQncyBhdmFpbGFibGUgdGhlbiEKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG9zMmZzbGliX01vcnBoVG9QTSgpCit7CisgIFBQSUIgcGliOworICBQVElCIHRpYjsKKworICBEb3NHZXRJbmZvQmxvY2tzKCZ0aWIsICZwaWIpOworCisgIC8vIENoYW5nZSBmbGFnIGZyb20gVklPIHRvIFBNOgorICBpZiAocGliLT5waWJfdWx0eXBlPT0yKSBwaWItPnBpYl91bHR5cGUgPSAzOworfQorCitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpvczJmc2xpYl9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworICBTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworI2lmZGVmIERFQlVHX0JVSUxECisgIHByaW50ZigiW29zMmZzbGliX0NyZWF0ZURldmljZV0gOiBFbnRlclxuIik7IGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKyAgZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworICBpZiAoIGRldmljZSApCisgIHsKKyAgICBTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisgICAgLy8gQWxzbyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHByaXZhdGUgZGF0YQorICAgIGRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKSBTRExfbWFsbG9jKChzaXplb2Yoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhKSkpOworICB9CisgIGlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKQorICB7CisgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgaWYgKCBkZXZpY2UgKQorICAgICAgU0RMX2ZyZWUoZGV2aWNlKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCisgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyNpZmRlZiBERUJVR19CVUlMRAorICBwcmludGYoIltvczJmc2xpYl9DcmVhdGVEZXZpY2VdIDogVmlkZW9Jbml0IGlzICVwXG4iLCBvczJmc2xpYl9WaWRlb0luaXQpOyBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisgIC8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworICBkZXZpY2UtPlZpZGVvSW5pdCA9IG9zMmZzbGliX1ZpZGVvSW5pdDsKKyAgZGV2aWNlLT5MaXN0TW9kZXMgPSBvczJmc2xpYl9MaXN0TW9kZXM7CisgIGRldmljZS0+U2V0VmlkZW9Nb2RlID0gb3MyZnNsaWJfU2V0VmlkZW9Nb2RlOworICBkZXZpY2UtPlRvZ2dsZUZ1bGxTY3JlZW4gPSBvczJmc2xpYl9Ub2dnbGVGdWxsU2NyZWVuOworICBkZXZpY2UtPlVwZGF0ZU1vdXNlID0gb3MyZnNsaWJfVXBkYXRlTW91c2U7CisgIGRldmljZS0+Q3JlYXRlWVVWT3ZlcmxheSA9IE5VTEw7CisgIGRldmljZS0+U2V0Q29sb3JzID0gb3MyZnNsaWJfU2V0Q29sb3JzOworICBkZXZpY2UtPlVwZGF0ZVJlY3RzID0gb3MyZnNsaWJfVXBkYXRlUmVjdHM7CisgIGRldmljZS0+VmlkZW9RdWl0ID0gb3MyZnNsaWJfVmlkZW9RdWl0OworICAvKiBIYXJkd2FyZSBhY2NlbGVyYXRpb24gZnVuY3Rpb25zICovCisgIGRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBvczJmc2xpYl9BbGxvY0hXU3VyZmFjZTsKKyAgZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7CisgIGRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7CisgIGRldmljZS0+U2V0SFdDb2xvcktleSA9IE5VTEw7CisgIGRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7CisgIGRldmljZS0+TG9ja0hXU3VyZmFjZSA9IG9zMmZzbGliX0xvY2tIV1N1cmZhY2U7CisgIGRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gb3MyZnNsaWJfVW5sb2NrSFdTdXJmYWNlOworICBkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOworICBkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBvczJmc2xpYl9GcmVlSFdTdXJmYWNlOworICAvKiBXaW5kb3cgbWFuYWdlciBmdW5jdGlvbnMgKi8KKyAgZGV2aWNlLT5TZXRDYXB0aW9uID0gb3MyZnNsaWJfU2V0Q2FwdGlvbjsKKyAgZGV2aWNlLT5TZXRJY29uID0gb3MyZnNsaWJfU2V0SWNvbjsKKyAgZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gb3MyZnNsaWJfSWNvbmlmeVdpbmRvdzsKKyAgZGV2aWNlLT5HcmFiSW5wdXQgPSBvczJmc2xpYl9HcmFiSW5wdXQ7CisgIGRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKKyAgLyogQ3Vyc29yIG1hbmFnZXIgZnVuY3Rpb25zIHRvIFdpbmRvd2VkIG1vZGUqLworICBvczJmc2xpYl9TZXRDdXJzb3JNYW5hZ2VtZW50RnVuY3Rpb25zKGRldmljZSwgMSk7CisgIC8qIEV2ZW50IG1hbmFnZXIgZnVuY3Rpb25zICovCisgIGRldmljZS0+SW5pdE9TS2V5bWFwID0gb3MyZnNsaWJfSW5pdE9TS2V5bWFwOworICBkZXZpY2UtPlB1bXBFdmVudHMgPSBvczJmc2xpYl9QdW1wRXZlbnRzOworICAvKiBUaGUgZnVuY3Rpb24gdXNlZCB0byBkaXNwb3NlIG9mIHRoaXMgc3RydWN0dXJlICovCisgIGRldmljZS0+ZnJlZSA9IG9zMmZzbGliX0RlbGV0ZURldmljZTsKKworICAvLyBNYWtlIHN1cmUgd2UnbGwgYmUgYWJsZSB0byB1c2UgV2luKiBBUEkgZXZlbiBpZiB0aGUgYXBwbGljYXRpb24KKyAgLy8gd2FzIGxpbmtlZCB0byBiZSBhIFZJTyBhcHBsaWNhdGlvbiEKKyAgb3MyZnNsaWJfTW9ycGhUb1BNKCk7CisKKyAgLy8gTm93IGluaXRpYWxpemUgRlNMaWIsIGFuZCBxdWVyeSBhdmFpbGFibGUgdmlkZW8gbW9kZXMhCisgIGlmICghRlNMaWJfSW5pdGlhbGl6ZSgpKQorICB7CisgICAgLy8gQ291bGQgbm90IGluaXRpYWxpemUgRlNMaWIhCisjaWZkZWYgREVCVUdfQlVJTEQKKyAgICBwcmludGYoIltvczJmc2xpYl9DcmVhdGVEZXZpY2VdIDogQ291bGQgbm90IGluaXRpYWxpemUgRlNMaWIhXG4iKTsKKyNlbmRpZgorICAgIFNETF9TZXRFcnJvcigiQ291bGQgbm90IGluaXRpYWxpemUgRlNMaWIhIik7CisgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworICAgIFNETF9mcmVlKGRldmljZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZGV2aWNlLT5oaWRkZW4tPnBBdmFpbGFibGVGU0xpYlZpZGVvTW9kZXMgPQorICAgIEZTTGliX0dldFZpZGVvTW9kZUxpc3QoKTsKKworICByZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBPUzJGU0xpYl9ib290c3RyYXAgPSB7CisgICAgICAgICJvczJmc2xpYiIsICJPUy8yIFZpZGVvIE91dHB1dCB1c2luZyBGU0xpYiIsCisgICAgICAgIG9zMmZzbGliX0F2YWlsYWJsZSwgb3MyZnNsaWJfQ3JlYXRlRGV2aWNlCit9OworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL29zMmZzbGliL1NETF9vczJmc2xpYi5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9vczJmc2xpYi9TRExfb3MyZnNsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDU4YmFmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9vczJmc2xpYi9TRExfb3MyZnNsaWIuaApAQCAtMCwwICsxLDcxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX29zMmZzbGliX2gKKyNkZWZpbmUgX1NETF9vczJmc2xpYl9oCisKKworLy8gT1MyIHNwZWNpZmljIGluY2x1ZGVzCisjZGVmaW5lIElOQ0xfVFlQRVMKKyNkZWZpbmUgSU5DTF9ET1MKKyNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKKyNkZWZpbmUgSU5DTF9ET1NQUk9DRVNTCisjZGVmaW5lIElOQ0xfV0lOCisjZGVmaW5lIElOQ0xfR1BJCisjaW5jbHVkZSA8b3MyLmg+CisKKyNpbmNsdWRlIDxGU0xpYi5oPgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICpfdGhpcworCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhCit7CisgIEZTTGliX1ZpZGVvTW9kZV9wICAgcEF2YWlsYWJsZUZTTGliVmlkZW9Nb2RlczsKKyAgU0RMX1JlY3QgICAgICAgICAgKipwTGlzdE1vZGVzUmVzdWx0OyAvLyBBbGxvY2F0ZWQgbWVtb3J5IHRvIHJldHVybiBsaXN0IG9mIG1vZGVzIGZvciBvczJmc2xpYl9MaXN0TW9kZXMoKSBBUEkKKworICBGU0xpYl9WaWRlb01vZGUgICAgIFNyY0J1ZmZlckRlc2M7ICAgIC8vIERlc2NyaXB0aW9uIG9mIGN1cnJlbnQgc291cmNlIGltYWdlIGJ1ZmZlcgorICBjaGFyICAgICAgICAgICAgICAgKnBjaFNyY0J1ZmZlcjsgICAgIC8vIFRoZSBzb3VyY2UgaW1hZ2UgYnVmZmVyIGl0c2VsZgorICBTRExfU3VyZmFjZSAgICAgICAgKnBTRExTdXJmYWNlOyAgICAgIC8vIFRoZSBTREwgc3VyZmFjZSBkZXNjcmliaW5nIHRoZSBidWZmZXIKKyAgSE1UWCAgICAgICAgICAgICAgICBobXR4VXNlU3JjQnVmZmVyOyAvLyBNdXRleCBzZW1hcGhvcmUgdG8gbWFuaXB1bGF0ZSBzcmMgYnVmZmVyCisgIEhXTkQgICAgICAgICAgICAgICAgaHduZEZyYW1lLCBod25kQ2xpZW50OyAgLy8gV2luZG93IGhhbmRsZSBvZiBmcmFtZSBhbmQgY2xpZW50CisgIGludCAgICAgICAgICAgICAgICAgaVBNVGhyZWFkU3RhdHVzOyAgLy8gMDogTm90IHJ1bm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOiBSdW5uaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXI6IE5vdCBydW5uaW5nLCBoYWQgYW4gZXJyb3IKKyAgaW50ICAgICAgICAgICAgICAgICB0aWRQTVRocmVhZDsgICAgICAvLyBUaHJlYWQgSUQgb2YgUE0gVGhyZWFkCisgIGludCAgICAgICAgICAgICAgICAgZkluRm9jdXM7ICAgICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSBpbiBmb2N1cyEKKyAgaW50ICAgICAgICAgICAgICAgICBpU2tpcFdNTU9VU0VNT1ZFOyAvLyBOdW1iZXIgb2YgV01fTU9VU0VNT1ZFIG1lc3NhZ2VzIHRvIHNraXAhCisgIGludCAgICAgICAgICAgICAgICAgaU1vdXNlVmlzaWJsZTsgICAgLy8KKworICBQRk5XUCAgICAgICAgICAgICAgIHBmbk9sZEZyYW1lUHJvYzsgIC8vIE9sZCB3aW5kb3cgZnJhbWUgcHJvY2VkdXJlCisgIGludCAgICAgICAgICAgICAgICAgYlByb3BvcnRpb25hbFJlc2l6ZTsgLy8gMDogTm8gcHJvcG9ydGlvbmFsIHJlc2l6aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTogRG8gcHJvcG9ydGlvbmFsIHJlc2l6aW5nCisgIFVMT05HICAgICAgICAgICAgICAgdWxSZXNpemluZ0ZsYWc7ICAgLy8gRmlyc3QgcmVzaXppbmcgZmxhZyB2YWx1ZQorfTsKKworLyogT1MvMiBzcGVjaWZpYyBiYWNrZG9vciBmdW5jdGlvbiB0byBiZSBhYmxlIHRvIHNldCBGcmFtZUNvbnRyb2xGbGFncyBvZiAqLworLyogdGhlIFNETCB3aW5kb3cgYmVmb3JlIGNyZWF0aW5nIGl0LiAqLworZXh0ZXJuIERFQ0xTUEVDIHZvaWQgU0RMQ0FMTCBTRExfT1MyRlNMSUJfU2V0RkNGVG9Vc2UoVUxPTkcgdWxGQ0YpOworCisjZW5kaWYgLyogX1NETF9vczJmc2xpYl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL29zMmZzbGliL1NETF92a2V5cy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9vczJmc2xpYi9TRExfdmtleXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM4MGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9vczJmc2xpYi9TRExfdmtleXMuaApAQCAtMCwwICsxLDc0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCisjaWZuZGVmIFZLXzAKKyNkZWZpbmUgVktfMAknMCcKKyNkZWZpbmUgVktfMQknMScKKyNkZWZpbmUgVktfMgknMicKKyNkZWZpbmUgVktfMwknMycKKyNkZWZpbmUgVktfNAknNCcKKyNkZWZpbmUgVktfNQknNScKKyNkZWZpbmUgVktfNgknNicKKyNkZWZpbmUgVktfNwknNycKKyNkZWZpbmUgVktfOAknOCcKKyNkZWZpbmUgVktfOQknOScKKyNkZWZpbmUgVktfQQknQScKKyNkZWZpbmUgVktfQgknQicKKyNkZWZpbmUgVktfQwknQycKKyNkZWZpbmUgVktfRAknRCcKKyNkZWZpbmUgVktfRQknRScKKyNkZWZpbmUgVktfRgknRicKKyNkZWZpbmUgVktfRwknRycKKyNkZWZpbmUgVktfSAknSCcKKyNkZWZpbmUgVktfSQknSScKKyNkZWZpbmUgVktfSgknSicKKyNkZWZpbmUgVktfSwknSycKKyNkZWZpbmUgVktfTAknTCcKKyNkZWZpbmUgVktfTQknTScKKyNkZWZpbmUgVktfTgknTicKKyNkZWZpbmUgVktfTwknTycKKyNkZWZpbmUgVktfUAknUCcKKyNkZWZpbmUgVktfUQknUScKKyNkZWZpbmUgVktfUgknUicKKyNkZWZpbmUgVktfUwknUycKKyNkZWZpbmUgVktfVAknVCcKKyNkZWZpbmUgVktfVQknVScKKyNkZWZpbmUgVktfVgknVicKKyNkZWZpbmUgVktfVwknVycKKyNkZWZpbmUgVktfWAknWCcKKyNkZWZpbmUgVktfWQknWScKKyNkZWZpbmUgVktfWgknWicKKyNlbmRpZiAvKiBWS18wICovCisKKy8qIFRoZXNlIGtleXMgaGF2ZW4ndCBiZWVuIGRlZmluZWQsIGJ1dCB3ZXJlIGV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQgKi8KKyNkZWZpbmUgVktfU0VNSUNPTE9OCTB4QkEKKyNkZWZpbmUgVktfRVFVQUxTCTB4QkIKKyNkZWZpbmUgVktfQ09NTUEJMHhCQworI2RlZmluZSBWS19NSU5VUwkweEJECisjZGVmaW5lIFZLX1BFUklPRAkweEJFCisjZGVmaW5lIFZLX1NMQVNICTB4QkYKKyNkZWZpbmUgVktfR1JBVkUJMHhDMAorI2RlZmluZSBWS19MQlJBQ0tFVAkweERCCisjZGVmaW5lIFZLX0JBQ0tTTEFTSAkweERDCisjZGVmaW5lIFZLX1JCUkFDS0VUCTB4REQKKyNkZWZpbmUgVktfQVBPU1RST1BIRQkweERFCisjZGVmaW5lIFZLX0JBQ0tUSUNLCTB4REYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9ldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9ldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjc1MzhjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoX2V2ZW50cy5jCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgcGhvdG9uIGV2ZW50cyBpbnRvIFNETCBldmVudHMgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPFBoLmg+CisjaW5jbHVkZSA8cGhvdG9uL1BrS2V5RGVmLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfc3lzd20uaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfcGhfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfcGhfbW9kZXNfYy5oIgorI2luY2x1ZGUgIlNETF9waF9pbWFnZV9jLmgiCisjaW5jbHVkZSAiU0RMX3BoX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3BoeXV2X2MuaCIKKworLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlcyBmcm9tIGEgcGhvdG9uIGtleXN5bSB0byBhIFNETCBrZXlzeW0gKi8KK3N0YXRpYyBTRExLZXkgT0REX2tleW1hcFsyNTZdOworc3RhdGljIFNETEtleSBNSVNDX2tleW1hcFsweEZGICsgMV07CitTRExfa2V5c3ltICpwaF9UcmFuc2xhdGVLZXkoUGhLZXlFdmVudF90ICprZXksIFNETF9rZXlzeW0gKmtleXN5bSk7CisKKy8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgcmVwZWF0ZWQga2V5LgorICAgKGlkZWEgc2hhbWVsZXNzbHkgbGlmdGVkIGZyb20gR0lJIC0tIHRoYW5rcyBndXlzISA6KSAqLworc3RhdGljIGludCBwaF9XYXJwZWRNb3Rpb24oX1RISVMsIFBoRXZlbnRfdCAqd2luRXZlbnQpCit7CisgICAgUGhSZWN0X3QgKnJlY3QgPSBQaEdldFJlY3RzKCB3aW5FdmVudCApOworCisgICAgaW50IGNlbnRyZV94LCBjZW50cmVfeTsKKyAgICBpbnQgZHgsIGR5OworICAgIHNob3J0IGFic194LCBhYnNfeTsKKyAgICBpbnQgcG9zdGVkOworCisgICAgY2VudHJlX3ggPSBTRExfVmlkZW9TdXJmYWNlLT53IC8gMjsKKyAgICBjZW50cmVfeSA9IFNETF9WaWRlb1N1cmZhY2UtPmggLyAyOworCisgICAgZHggPSByZWN0LT51bC54IC0gY2VudHJlX3g7CisgICAgZHkgPSByZWN0LT51bC55IC0gY2VudHJlX3k7CisKKyAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKCAwLCAxLCBkeCwgZHkgKTsKKworICAgIC8qIE1vdmUgbW91c2UgY3Vyc29yIHRvIG1pZGRsZSBvZiB0aGUgd2luZG93ICovCisgICAgUHRHZXRBYnNQb3NpdGlvbiggd2luZG93LCAmYWJzX3gsICZhYnNfeSApOworICAgIFBoTW92ZUN1cnNvckFicyhQaElucHV0R3JvdXAoTlVMTCksIGFic194ICsgY2VudHJlX3gsIGFic195ICsgY2VudHJlX3kpOworCisgICAgcmV0dXJuIChwb3N0ZWQpOworfQorCisvKiBDb250cm9sIHdoaWNoIG1vdGlvbiBmbGFncyB0aGUgd2luZG93IGhhcyBzZXQsIGEgZmxhZ3MgdmFsdWUgb2YgLTEgc2V0cworICogTU9USU9OX0JVVFRPTiBhbmQgTU9USU9OX05PQlVUVE9OICovCisKK3N0YXRpYyB2b2lkIHNldF9tb3Rpb25fc2Vuc2l0aXZpdHkoX1RISVMsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgICBpbnQgcmlkOworICAgIGludCBmaWVsZHMgPSBQaF9FVl9QVFJfTU9USU9OX0JVVFRPTiB8IFBoX0VWX1BUUl9NT1RJT05fTk9CVVRUT047CisgICAgUGhSZWdpb25fdCByZWdpb247CisKKyAgICBpZiggd2luZG93ICkKKyAgICB7CisgICAgICAgIHJpZCA9IFB0V2lkZ2V0UmlkKHdpbmRvdyk7CisgICAgICAgIGlmKCByaWQgIT0gMCAmJiBQaFJlZ2lvblF1ZXJ5KHJpZCwgJnJlZ2lvbiwgTlVMTCwgTlVMTCwgMCkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lvbi5ldmVudHNfc2Vuc2U9KHJlZ2lvbi5ldmVudHNfc2Vuc2UgJiB+ZmllbGRzKXwoZmxhZ3MgJiBmaWVsZHMpOworICAgICAgICAgICAgUGhSZWdpb25DaGFuZ2UoUGhfUkVHSU9OX0VWX1NFTlNFLCAwLCAmcmVnaW9uLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ29udmVydCB0aGUgcGhvdG9uIGJ1dHRvbiBzdGF0ZSB2YWx1ZSB0byBhbiBTREwgdmFsdWUgKi8KK3N0YXRpYyBVaW50OCBwaDJzZGxfbW91c2VidXR0b24odW5zaWduZWQgc2hvcnQgYnV0dG9uX3N0YXRlKQoreworICAgIFVpbnQ4IG1vdXNlX2J1dHRvbiA9IDA7CisKKyAgICBpZiAoYnV0dG9uX3N0YXRlICYgUGhfQlVUVE9OX1NFTEVDVCkKKyAgICAgICAgbW91c2VfYnV0dG9uIHw9IFNETF9CVVRUT05fTEVGVDsKKyAgICBpZiAoYnV0dG9uX3N0YXRlICYgUGhfQlVUVE9OX01FTlUpCisgICAgICAgIG1vdXNlX2J1dHRvbiB8PSBTRExfQlVUVE9OX1JJR0hUOworICAgIGlmIChidXR0b25fc3RhdGUgJiBQaF9CVVRUT05fQURKVVNUKQorICAgICAgICBtb3VzZV9idXR0b24gfD0gU0RMX0JVVFRPTl9NSURETEU7CisKKyAgICByZXR1cm4gKG1vdXNlX2J1dHRvbik7Cit9CisKK3N0YXRpYyBpbnQgcGhfRGlzcGF0Y2hFdmVudChfVEhJUykKK3sKKyAgICBpbnQgcG9zdGVkOworICAgIFBoUmVjdF90KiByZWN0OworICAgIFBoUG9pbnRlckV2ZW50X3QqIHBvaW50ZXJFdmVudDsKKyAgICBQaEtleUV2ZW50X3QqIGtleUV2ZW50OworICAgIFBoV2luZG93RXZlbnRfdCogd2luRXZlbnQ7CisgICAgaW50IGksIGJ1dHRvbnM7CisgICAgU0RMX1JlY3Qgc2RscmVjdHNbUEhfU0RMX01BWF9SRUNUU107CisJCisgICAgcG9zdGVkID0gMDsKKwkKKyAgICBzd2l0Y2ggKHBoZXZlbnQtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIFBoX0VWX0JPVU5EQVJZOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGhldmVudC0+c3VidHlwZSA9PSBQaF9FVl9QVFJfRU5URVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGhldmVudC0+c3VidHlwZSA9PVBoX0VWX1BUUl9MRUFWRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQTU9VU0VGT0NVUyk7CQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUGhfRVZfUFRSX01PVElPTl9CVVRUT046CisgICAgICAgIGNhc2UgUGhfRVZfUFRSX01PVElPTl9OT0JVVFRPTjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFNETF9WaWRlb1N1cmZhY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50ID0gUGhHZXREYXRhKHBoZXZlbnQpOworICAgICAgICAgICAgICAgIHJlY3QgPSBQaEdldFJlY3RzKHBoZXZlbnQpOworCisgICAgICAgICAgICAgICAgaWYgKG1vdXNlX3JlbGF0aXZlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zdGVkID0gcGhfV2FycGVkTW90aW9uKHRoaXMsIHBoZXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHJlY3QtPnVsLngsIHJlY3QtPnVsLnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBoX0VWX0JVVF9QUkVTUzoKKyAgICAgICAgeworICAgICAgICAgICAgcG9pbnRlckV2ZW50ID0gUGhHZXREYXRhKHBoZXZlbnQpOworICAgICAgICAgICAgYnV0dG9ucyA9IHBoMnNkbF9tb3VzZWJ1dHRvbihwb2ludGVyRXZlbnQtPmJ1dHRvbnMpOworICAgICAgICAgICAgaWYgKGJ1dHRvbnMgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBidXR0b25zLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBoX0VWX0JVVF9SRUxFQVNFOgorICAgICAgICB7CisgICAgICAgICAgICBwb2ludGVyRXZlbnQgPSBQaEdldERhdGEocGhldmVudCk7CisgICAgICAgICAgICBidXR0b25zID0gcGgyc2RsX21vdXNlYnV0dG9uKHBvaW50ZXJFdmVudC0+YnV0dG9ucyk7CisgICAgICAgICAgICBpZiAocGhldmVudC0+c3VidHlwZSA9PSBQaF9FVl9SRUxFQVNFX1JFQUwgJiYgYnV0dG9ucyAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBidXR0b25zLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYocGhldmVudC0+c3VidHlwZSA9PSBQaF9FVl9SRUxFQVNFX1BIQU5UT00pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSWYgdGhlIG1vdXNlIGlzIG91dHNpZGUgdGhlIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgKiBvbmx5IGEgcGhhbnRvbSByZWxlYXNlIGV2ZW50IGlzIHNlbnQsIHNvCisgICAgICAgICAgICAgICAgICogY2hlY2sgaWYgdGhlIHdpbmRvdyBkb2Vzbid0IGhhdmUgbW91c2UgZm9jdXMuCisgICAgICAgICAgICAgICAgICogTm90IHBlcmZlY3QsIG1heWJlIGNoZWNraW5nIHRoZSBtb3VzZSBidXR0b24KKyAgICAgICAgICAgICAgICAgKiBzdGF0ZSBmb3IgUGhfRVZfQk9VTkRBUlkgZXZlbnRzIHdvdWxkIGJlCisgICAgICAgICAgICAgICAgICogYmV0dGVyLiAqLworICAgICAgICAgICAgICAgIGlmICgoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUykgPT0gMCkKKwkJeworICAgICAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgYnV0dG9ucywgMCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUGhfRVZfV006CisgICAgICAgIHsKKyAgICAgICAgICAgIHdpbkV2ZW50ID0gUGhHZXREYXRhKHBoZXZlbnQpOworCisgICAgICAgICAgICAvKiBsb3NpbmcgZm9jdXMgKi8KKyAgICAgICAgICAgIGlmICgod2luRXZlbnQtPmV2ZW50X2Y9PVBoX1dNX0ZPQ1VTKSAmJiAod2luRXZlbnQtPmV2ZW50X3N0YXRlPT1QaF9XTV9FVlNUQVRFX0ZPQ1VTTE9TVCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0X21vdGlvbl9zZW5zaXRpdml0eSh0aGlzLCBQaF9FVl9QVFJfTU9USU9OX0JVVFRPTik7CisgICAgICAgICAgICAgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUElOUFVURk9DVVMpOwkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGdhaW5pbmcgZm9jdXMgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKCh3aW5FdmVudC0+ZXZlbnRfZj09UGhfV01fRk9DVVMpICYmICh3aW5FdmVudC0+ZXZlbnRfc3RhdGU9PVBoX1dNX0VWU1RBVEVfRk9DVVMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldF9tb3Rpb25fc2Vuc2l0aXZpdHkodGhpcywgLTEpOworICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBJTlBVVEZPQ1VTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHJlcXVlc3QgcXVpdCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2luRXZlbnQtPmV2ZW50X2Y9PVBoX1dNX0NMT1NFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlUXVpdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogcmVxdWVzdCBoaWRlL3VuaGlkZSAqLworICAgICAgICAgICAgZWxzZSBpZiAod2luRXZlbnQtPmV2ZW50X2Y9PVBoX1dNX0hJREUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRseV9oaWRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgLyogZ290IHVuaGlkZSB3aW5kb3cgZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgLyogVE9ETzogcmVzdG9yZSBhcHBsaWNhdGlvbidzIHBhbGV0dGUgaWYgaW4gcGFsZXR0ZSBtb2RlICovCisgICAgICAgICAgICAgICAgICAgY3VycmVudGx5X2hpZGVkPTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgLyogZ290IGhpZGUgd2luZG93IGV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgLyogVE9ETzogcmVzdG9yZSBvcmlnaW5hbCBwYWxldHRlIGlmIGluIHBhbGV0dGUgbW9kZSAgICAgICovCisgICAgICAgICAgICAgICAgICAgY3VycmVudGx5X2hpZGVkPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogcmVxdWVzdCB0byByZXNpemUgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKHdpbkV2ZW50LT5ldmVudF9mPT1QaF9XTV9SRVNJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudGx5X21heGltaXplZD0wOworICAgICAgICAgICAgICAgICNpZiAoX05UT19WRVJTSU9OIDwgNjMwKQorICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlUmVzaXplKHdpbkV2ZW50LT5zaXplLncrMSwgd2luRXZlbnQtPnNpemUuaCsxKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgIC8qIFFOWCA2LjMuMCBoYXZlIHRoaXMgYnVnIGZpeGVkICovCisgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVSZXNpemUod2luRXZlbnQtPnNpemUudywgd2luRXZlbnQtPnNpemUuaCk7CisgICAgICAgICAgICAgICAgI2VuZGlmIC8qIF9OVE9fVkVSU0lPTiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogcmVxdWVzdCB0byBtb3ZlICovCisgICAgICAgICAgICBlbHNlIGlmICh3aW5FdmVudC0+ZXZlbnRfZj09UGhfV01fTU9WRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9vdmVybGF5IT1OVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBpbnQgbG9ja2Vkc3RhdGU9Y3VycmVudF9vdmVybGF5LT5od2RhdGEtPmxvY2tlZDsKKyAgICAgICAgICAgICAgICAgICBpbnQgY2hyb21hc3RhdGU9Y3VycmVudF9vdmVybGF5LT5od2RhdGEtPmlzY2hyb21ha2V5OworICAgICAgICAgICAgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICBTRExfUmVjdCBzcmMsIGRzdDsKKworICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQ9MTsKKyAgICAgICAgICAgICAgICAgICBzcmMueCA9IDA7CisgICAgICAgICAgICAgICAgICAgc3JjLnkgPSAwOworICAgICAgICAgICAgICAgICAgIHNyYy53ID0gY3VycmVudF9vdmVybGF5LT53OworICAgICAgICAgICAgICAgICAgIHNyYy55ID0gY3VycmVudF9vdmVybGF5LT5oOworICAgICAgICAgICAgICAgICAgIGRzdC54PWN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQucG9zLng7CisgICAgICAgICAgICAgICAgICAgZHN0Lnk9Y3VycmVudF9vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueTsKKyAgICAgICAgICAgICAgICAgICBkc3Qudz1jdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnNpemUudzsKKyAgICAgICAgICAgICAgICAgICBkc3QuaD1jdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnNpemUuaDsKKyAgICAgICAgICAgICAgICAgICBjdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+aXNjaHJvbWFrZXk9MDsKKyAgICAgICAgICAgICAgICAgICBlcnJvcj1waF9EaXNwbGF5WVVWT3ZlcmxheSh0aGlzLCBjdXJyZW50X292ZXJsYXksICZzcmMsICZkc3QpOworICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3IpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+aXNjaHJvbWFrZXk9Y2hyb21hc3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQ9bG9ja2Vkc3RhdGU7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIG1heGltaXplIHJlcXVlc3QgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKHdpbkV2ZW50LT5ldmVudF9mPT1QaF9XTV9NQVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd2luZG93IGFscmVhZHkgbW92ZWQgYW5kIHJlc2l6ZWQgaGVyZSAqLworICAgICAgICAgICAgICAgIGN1cnJlbnRseV9tYXhpbWl6ZWQ9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHJlc3RvcmUgcmVxdWVzdCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2luRXZlbnQtPmV2ZW50X2Y9PVBoX1dNX1JFU1RPUkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd2luZG93IGFscmVhZHkgbW92ZWQgYW5kIHJlc2l6ZWQgaGVyZSAqLworICAgICAgICAgICAgICAgIGN1cnJlbnRseV9tYXhpbWl6ZWQ9MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvKiB3aW5kb3cgaGFzIGJlZW4gcmVzaXplZCwgbW92ZWQgb3IgcmVtb3ZlZCAqLworICAgICAgICBjYXNlIFBoX0VWX0VYUE9TRToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBoZXZlbnQtPm51bV9yZWN0cyE9MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtcmVjdHM7CisKKyAgICAgICAgICAgICAgICBpZiAoU0RMX1ZpZGVvU3VyZmFjZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlY3QgPSBQaEdldFJlY3RzKHBoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAocGhldmVudC0+bnVtX3JlY3RzPlBIX1NETF9NQVhfUkVDVFMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogc29ycnksIGJ1ZmZlcnMgdW5kZXJydW4sIHdlJ2xsIHVwZGF0ZSBvbmx5IGZpcnN0IFBIX1NETF9NQVhfUkVDVFMgcmVjdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgbnVtcmVjdHM9UEhfU0RMX01BWF9SRUNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8cGhldmVudC0+bnVtX3JlY3RzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNkbHJlY3RzW2ldLnggPSByZWN0W2ldLnVsLng7CisgICAgICAgICAgICAgICAgICAgICAgICBzZGxyZWN0c1tpXS55ID0gcmVjdFtpXS51bC55OworICAgICAgICAgICAgICAgICAgICAgICAgc2RscmVjdHNbaV0udyA9IHJlY3RbaV0ubHIueCAtIHJlY3RbaV0udWwueCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzZGxyZWN0c1tpXS5oID0gcmVjdFtpXS5sci55IC0gcmVjdFtpXS51bC55ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRoaXMtPlVwZGF0ZVJlY3RzKHRoaXMsIHBoZXZlbnQtPm51bV9yZWN0cywgc2RscmVjdHMpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X292ZXJsYXkhPU5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NrZWRzdGF0ZT1jdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+bG9ja2VkOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1JlY3Qgc3JjLCBkc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy54ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy55ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy53ID0gY3VycmVudF9vdmVybGF5LT53OworICAgICAgICAgICAgICAgICAgICAgICAgc3JjLnkgPSBjdXJyZW50X292ZXJsYXktPmg7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3QueD1jdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy54OworICAgICAgICAgICAgICAgICAgICAgICAgZHN0Lnk9Y3VycmVudF9vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdC53PWN1cnJlbnRfb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS53OworICAgICAgICAgICAgICAgICAgICAgICAgZHN0Lmg9Y3VycmVudF9vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5zaXplLmg7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+Zm9yY2VkcmVkcmF3PTE7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcj1waF9EaXNwbGF5WVVWT3ZlcmxheSh0aGlzLCBjdXJyZW50X292ZXJsYXksICZzcmMsICZkc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X292ZXJsYXktPmh3ZGF0YS0+Zm9yY2VkcmVkcmF3PTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9vdmVybGF5LT5od2RhdGEtPmxvY2tlZD1sb2NrZWRzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWJyZWFrOworCisgICAgICAgIGNhc2UgUGhfRVZfS0VZOgorICAgICAgICB7CisgICAgICAgICAgICBTRExfa2V5c3ltIGtleXN5bTsKKworICAgICAgICAgICAgcG9zdGVkID0gMDsKKworICAgICAgICAgICAga2V5RXZlbnQgPSBQaEdldERhdGEocGhldmVudCk7CisKKyAgICAgICAgICAgIGlmIChQa19LRl9LZXlfRG93biAmIGtleUV2ZW50LT5rZXlfZmxhZ3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc3BsaXQgdGhlIHdoZWVsIGV2ZW50cyBmcm9tIHJlYWwga2V5IGV2ZW50cyAqLworICAgICAgICAgICAgICAgIGlmICgoa2V5RXZlbnQtPmtleV9jYXA9PVBrX1VwKSAmJiAoa2V5RXZlbnQtPmtleV9zY2FuPT0wKSAmJiAoKGtleUV2ZW50LT5rZXlfZmxhZ3MgJiBQa19LRl9TY2FuX1ZhbGlkKT09UGtfS0ZfU2Nhbl9WYWxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIFNETF9CVVRUT05fV0hFRUxVUCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoa2V5RXZlbnQtPmtleV9jYXA9PVBrX0Rvd24pICYmIChrZXlFdmVudC0+a2V5X3NjYW49PTApICYmICgoa2V5RXZlbnQtPmtleV9mbGFncyAmIFBrX0tGX1NjYW5fVmFsaWQpPT1Qa19LRl9TY2FuX1ZhbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgU0RMX0JVVFRPTl9XSEVFTERPV04sIDAsIDApOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELCBwaF9UcmFuc2xhdGVLZXkoa2V5RXZlbnQsICZrZXlzeW0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogbXVzdCBiZSBrZXkgcmVsZWFzZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNwbGl0IHRoZSB3aGVlbCBldmVudHMgZnJvbSByZWFsIGtleSBldmVudHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGtleUV2ZW50LT5rZXlfY2FwPT1Qa19VcCkgJiYgKGtleUV2ZW50LT5rZXlfc2Nhbj09MCkgJiYgKChrZXlFdmVudC0+a2V5X2ZsYWdzICYgUGtfS0ZfU2Nhbl9WYWxpZCk9PVBrX0tGX1NjYW5fVmFsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgU0RMX0JVVFRPTl9XSEVFTFVQLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChrZXlFdmVudC0+a2V5X2NhcD09UGtfRG93bikgJiYgKGtleUV2ZW50LT5rZXlfc2Nhbj09MCkgJiYgKChrZXlFdmVudC0+a2V5X2ZsYWdzICYgUGtfS0ZfU2Nhbl9WYWxpZCk9PVBrX0tGX1NjYW5fVmFsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgU0RMX0JVVFRPTl9XSEVFTERPV04sIDAsIDApOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgcGhfVHJhbnNsYXRlS2V5KCBrZXlFdmVudCwgJmtleXN5bSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSBQaF9FVl9JTkZPOgorICAgICAgICB7CisgICAgICAgICAgIGlmIChwaGV2ZW50LT5zdWJ0eXBlPT1QaF9PRkZTQ1JFRU5fSU5WQUxJRCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKiBFdkluZm9EYXRhOworCisgICAgICAgICAgICAgIEV2SW5mb0RhdGE9KHVuc2lnbmVkIGxvbmcqKVBoR2V0RGF0YShwaGV2ZW50KTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKCpFdkluZm9EYXRhKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGNhc2UgUGdfVklERU9fTU9ERV9TV0lUQ0hFRDoKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICBjYXNlIFBnX0VOVEVSRURfRElSRUNUOgorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIGNhc2UgUGdfRVhJVEVEX0RJUkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICBjYXNlIFBnX0RSSVZFUl9TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybihwb3N0ZWQpOworfQorCisvKiBwZXJmb3JtIGEgYmxvY2tpbmcgcmVhZCBpZiBubyBldmVudHMgYXZhaWxhYmxlICovCitpbnQgcGhfUGVuZGluZyhfVEhJUykKK3sKKyAgICAvKiBGbHVzaCB0aGUgZGlzcGxheSBjb25uZWN0aW9uIGFuZCBsb29rIHRvIHNlZSBpZiBldmVudHMgYXJlIHF1ZXVlZCAqLworICAgIFBnRmx1c2goKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgc3dpdGNoKFBoRXZlbnRQZWVrKHBoZXZlbnQsIEVWRU5UX1NJWkUpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFBoX0VWRU5UX01TRzoKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX1BlbmRpbmcoKTogUGhFdmVudE5leHQgZmFpbGVkLlxuIik7CisgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBPaCB3ZWxsLCBub3RoaW5nIGlzIHJlYWR5IC4uICovCisgICAgcmV0dXJuKDApOworfQorCit2b2lkIHBoX1B1bXBFdmVudHMoX1RISVMpCit7CisgICAgLyogRmx1c2ggdGhlIGRpc3BsYXkgY29ubmVjdGlvbiBhbmQgbG9vayB0byBzZWUgaWYgZXZlbnRzIGFyZSBxdWV1ZWQgKi8KKyAgICBQZ0ZsdXNoKCk7CisKKyAgICB3aGlsZSAocGhfUGVuZGluZyh0aGlzKSkKKyAgICB7CisgICAgICAgIFB0RXZlbnRIYW5kbGVyKHBoZXZlbnQpOworICAgICAgICBwaF9EaXNwYXRjaEV2ZW50KHRoaXMpOworICAgIH0KK30KKwordm9pZCBwaF9Jbml0S2V5bWFwKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBPZGQga2V5cyB1c2VkIGluIGludGVybmF0aW9uYWwga2V5Ym9hcmRzICovCisgICAgZm9yIChpPTA7IGk8U0RMX2FycmF5c2l6ZShPRERfa2V5bWFwKTsgKytpKQorICAgIHsKKyAgICAgICAgT0REX2tleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKKyAgICB9CisKKyAgICAvKiBNYXAgdGhlIG1pc2NlbGxhbmVvdXMga2V5cyAqLworICAgIGZvciAoaT0wOyBpPFNETF9hcnJheXNpemUoTUlTQ19rZXltYXApOyArK2kpCisgICAgeworICAgICAgICBNSVNDX2tleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKKyAgICB9CisKKyAgICBNSVNDX2tleW1hcFtQa19CYWNrU3BhY2UmMHhGRl0gPSBTRExLX0JBQ0tTUEFDRTsKKyAgICBNSVNDX2tleW1hcFtQa19UYWImMHhGRl0gPSBTRExLX1RBQjsKKyAgICBNSVNDX2tleW1hcFtQa19DbGVhciYweEZGXSA9IFNETEtfQ0xFQVI7CisgICAgTUlTQ19rZXltYXBbUGtfUmV0dXJuJjB4RkZdID0gU0RMS19SRVRVUk47CisgICAgTUlTQ19rZXltYXBbUGtfUGF1c2UmMHhGRl0gPSBTRExLX1BBVVNFOworICAgIE1JU0Nfa2V5bWFwW1BrX0VzY2FwZSYweEZGXSA9IFNETEtfRVNDQVBFOworICAgIE1JU0Nfa2V5bWFwW1BrX0RlbGV0ZSYweEZGXSA9IFNETEtfREVMRVRFOworCisgICAgTUlTQ19rZXltYXBbUGtfS1BfMCYweEZGXSA9IFNETEtfS1AwOworICAgIE1JU0Nfa2V5bWFwW1BrX0tQXzEmMHhGRl0gPSBTRExLX0tQMTsKKyAgICBNSVNDX2tleW1hcFtQa19LUF8yJjB4RkZdID0gU0RMS19LUDI7CisgICAgTUlTQ19rZXltYXBbUGtfS1BfMyYweEZGXSA9IFNETEtfS1AzOworICAgIE1JU0Nfa2V5bWFwW1BrX0tQXzQmMHhGRl0gPSBTRExLX0tQNDsKKyAgICBNSVNDX2tleW1hcFtQa19LUF81JjB4RkZdID0gU0RMS19LUDU7CisgICAgTUlTQ19rZXltYXBbUGtfS1BfNiYweEZGXSA9IFNETEtfS1A2OworICAgIE1JU0Nfa2V5bWFwW1BrX0tQXzcmMHhGRl0gPSBTRExLX0tQNzsKKyAgICBNSVNDX2tleW1hcFtQa19LUF84JjB4RkZdID0gU0RMS19LUDg7CisgICAgTUlTQ19rZXltYXBbUGtfS1BfOSYweEZGXSA9IFNETEtfS1A5OworCisgICAgTUlTQ19rZXltYXBbUGtfS1BfRGVjaW1hbCYweEZGXSA9IFNETEtfS1BfUEVSSU9EOworICAgIE1JU0Nfa2V5bWFwW1BrX0tQX0RpdmlkZSYweEZGXSA9IFNETEtfS1BfRElWSURFOworICAgIE1JU0Nfa2V5bWFwW1BrX0tQX011bHRpcGx5JjB4RkZdID0gU0RMS19LUF9NVUxUSVBMWTsKKyAgICBNSVNDX2tleW1hcFtQa19LUF9TdWJ0cmFjdCYweEZGXSA9IFNETEtfS1BfTUlOVVM7CisgICAgTUlTQ19rZXltYXBbUGtfS1BfQWRkJjB4RkZdID0gU0RMS19LUF9QTFVTOworICAgIE1JU0Nfa2V5bWFwW1BrX0tQX0VudGVyJjB4RkZdID0gU0RMS19LUF9FTlRFUjsKKyAgICBNSVNDX2tleW1hcFtQa19LUF9FcXVhbCYweEZGXSA9IFNETEtfS1BfRVFVQUxTOworCisgICAgTUlTQ19rZXltYXBbUGtfVXAmMHhGRl0gPSBTRExLX1VQOworICAgIE1JU0Nfa2V5bWFwW1BrX0Rvd24mMHhGRl0gPSBTRExLX0RPV047CisgICAgTUlTQ19rZXltYXBbUGtfUmlnaHQmMHhGRl0gPSBTRExLX1JJR0hUOworICAgIE1JU0Nfa2V5bWFwW1BrX0xlZnQmMHhGRl0gPSBTRExLX0xFRlQ7CisgICAgTUlTQ19rZXltYXBbUGtfSW5zZXJ0JjB4RkZdID0gU0RMS19JTlNFUlQ7CisgICAgTUlTQ19rZXltYXBbUGtfSG9tZSYweEZGXSA9IFNETEtfSE9NRTsKKyAgICBNSVNDX2tleW1hcFtQa19FbmQmMHhGRl0gPSBTRExLX0VORDsKKyAgICBNSVNDX2tleW1hcFtQa19QZ19VcCYweEZGXSA9IFNETEtfUEFHRVVQOworICAgIE1JU0Nfa2V5bWFwW1BrX1BnX0Rvd24mMHhGRl0gPSBTRExLX1BBR0VET1dOOworCisgICAgTUlTQ19rZXltYXBbUGtfRjEmMHhGRl0gPSBTRExLX0YxOworICAgIE1JU0Nfa2V5bWFwW1BrX0YyJjB4RkZdID0gU0RMS19GMjsKKyAgICBNSVNDX2tleW1hcFtQa19GMyYweEZGXSA9IFNETEtfRjM7CisgICAgTUlTQ19rZXltYXBbUGtfRjQmMHhGRl0gPSBTRExLX0Y0OworICAgIE1JU0Nfa2V5bWFwW1BrX0Y1JjB4RkZdID0gU0RMS19GNTsKKyAgICBNSVNDX2tleW1hcFtQa19GNiYweEZGXSA9IFNETEtfRjY7CisgICAgTUlTQ19rZXltYXBbUGtfRjcmMHhGRl0gPSBTRExLX0Y3OworICAgIE1JU0Nfa2V5bWFwW1BrX0Y4JjB4RkZdID0gU0RMS19GODsKKyAgICBNSVNDX2tleW1hcFtQa19GOSYweEZGXSA9IFNETEtfRjk7CisgICAgTUlTQ19rZXltYXBbUGtfRjEwJjB4RkZdID0gU0RMS19GMTA7CisgICAgTUlTQ19rZXltYXBbUGtfRjExJjB4RkZdID0gU0RMS19GMTE7CisgICAgTUlTQ19rZXltYXBbUGtfRjEyJjB4RkZdID0gU0RMS19GMTI7CisgICAgTUlTQ19rZXltYXBbUGtfRjEzJjB4RkZdID0gU0RMS19GMTM7CisgICAgTUlTQ19rZXltYXBbUGtfRjE0JjB4RkZdID0gU0RMS19GMTQ7CisgICAgTUlTQ19rZXltYXBbUGtfRjE1JjB4RkZdID0gU0RMS19GMTU7CisKKyAgICBNSVNDX2tleW1hcFtQa19OdW1fTG9jayYweEZGXSA9IFNETEtfTlVNTE9DSzsKKyAgICBNSVNDX2tleW1hcFtQa19DYXBzX0xvY2smMHhGRl0gPSBTRExLX0NBUFNMT0NLOworICAgIE1JU0Nfa2V5bWFwW1BrX1Njcm9sbF9Mb2NrJjB4RkZdID0gU0RMS19TQ1JPTExPQ0s7CisgICAgTUlTQ19rZXltYXBbUGtfU2hpZnRfUiYweEZGXSA9IFNETEtfUlNISUZUOworICAgIE1JU0Nfa2V5bWFwW1BrX1NoaWZ0X0wmMHhGRl0gPSBTRExLX0xTSElGVDsKKyAgICBNSVNDX2tleW1hcFtQa19Db250cm9sX1ImMHhGRl0gPSBTRExLX1JDVFJMOworICAgIE1JU0Nfa2V5bWFwW1BrX0NvbnRyb2xfTCYweEZGXSA9IFNETEtfTENUUkw7CisgICAgTUlTQ19rZXltYXBbUGtfQWx0X1ImMHhGRl0gPSBTRExLX1JBTFQ7CisgICAgTUlTQ19rZXltYXBbUGtfQWx0X0wmMHhGRl0gPSBTRExLX0xBTFQ7CisgICAgTUlTQ19rZXltYXBbUGtfTWV0YV9SJjB4RkZdID0gU0RMS19STUVUQTsKKyAgICBNSVNDX2tleW1hcFtQa19NZXRhX0wmMHhGRl0gPSBTRExLX0xNRVRBOworICAgIE1JU0Nfa2V5bWFwW1BrX1N1cGVyX0wmMHhGRl0gPSBTRExLX0xTVVBFUjsKKyAgICBNSVNDX2tleW1hcFtQa19TdXBlcl9SJjB4RkZdID0gU0RMS19SU1VQRVI7CisgICAgTUlTQ19rZXltYXBbUGtfTW9kZV9zd2l0Y2gmMHhGRl0gPSBTRExLX01PREU7IC8qICJBbHQgR3IiIGtleSAgICAqLworCisgICAgTUlTQ19rZXltYXBbUGtfSGVscCYweEZGXSA9IFNETEtfSEVMUDsKKyAgICBNSVNDX2tleW1hcFtQa19QcmludCYweEZGXSA9IFNETEtfUFJJTlQ7CisgICAgTUlTQ19rZXltYXBbUGtfQnJlYWsmMHhGRl0gPSBTRExLX0JSRUFLOworICAgIE1JU0Nfa2V5bWFwW1BrX01lbnUmMHhGRl0gPSBTRExLX01FTlU7ICAgICAgICAvKiBXaW5kb3dzICJNZW51IiBrZXkgKi8KKworICAgIE1JU0Nfa2V5bWFwW1BrX0h5cGVyX1ImMHhGRl0gPSBTRExLX1JTVVBFUjsgICAvKiBSaWdodCAiV2luZG93cyIgKi8KKworICAgIC8qIExlZnQgIldpbmRvd3MiIGtleSwgYnV0IGl0IGNhbid0IGJlIGNhdGNoZWQgYnkgYXBwbGljYXRpb24gKi8KKyAgICBNSVNDX2tleW1hcFtQa19IeXBlcl9MJjB4RkZdID0gU0RMS19MU1VQRVI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhcDsKKworU0RMX2tleXN5bSAqcGhfVHJhbnNsYXRlS2V5KFBoS2V5RXZlbnRfdCAqa2V5LCBTRExfa2V5c3ltICprZXlzeW0pCit7CisgICAgLyogJ3N5bScgaXMgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUga2V5IHdpdGggbW9kaWZpZXJzIGFwcGxpZWQgdG8gaXQuCisgICAgICAgVGhpcyBtZW1iZXIgaXMgdmFsaWQgb25seSBpZiBQa19LRl9TeW1fVmFsaWQgaXMgc2V0IGluIHRoZSBrZXlfZmxhZ3MuCisgICAgICAgV2Ugd2lsbCBhc3N1bWUgaXQgaXMgdmFsaWQuICovCisKKyAgICAvKiBGSVhNRTogVGhpcyBuZWVkcyB0byBjaGVjayB3aGV0aGVyIHRoZSBjYXAgJiBzY2FuY29kZSBpcyB2YWxpZCAqLworCisgICAgY2FwID0ga2V5LT5rZXlfY2FwOworCisgICAgc3dpdGNoIChjYXA+PjgpCisgICAgeworICAgICAgICBjYXNlIDB4MDA6ICAvKiBMYXRpbiAxICovCisgICAgICAgIGNhc2UgMHgwMTogIC8qIExhdGluIDIgKi8KKyAgICAgICAgY2FzZSAweDAyOiAgLyogTGF0aW4gMyAqLworICAgICAgICBjYXNlIDB4MDM6ICAvKiBMYXRpbiA0ICovCisgICAgICAgIGNhc2UgMHgwNDogIC8qIEthdGFrYW5hICovCisgICAgICAgIGNhc2UgMHgwNTogIC8qIEFyYWJpYyAqLworICAgICAgICBjYXNlIDB4MDY6ICAvKiBDeXJpbGxpYyAqLworICAgICAgICBjYXNlIDB4MDc6ICAvKiBHcmVlayAqLworICAgICAgICBjYXNlIDB4MDg6ICAvKiBUZWNobmljYWwgKi8KKyAgICAgICAgY2FzZSAweDBBOiAgLyogUHVibGlzaGluZyAqLworICAgICAgICBjYXNlIDB4MEM6ICAvKiBIZWJyZXcgKi8KKyAgICAgICAgY2FzZSAweDBEOiAgLyogVGhhaSAqLworICAgICAgICAgICAgICAgICAgIGtleXN5bS0+c3ltID0gKFNETEtleSkoY2FwJjB4RkYpOworICAgICAgICAgICAgICAgICAgIC8qIE1hcCBjYXBpdGFsIGxldHRlciBzeW1zIHRvIGxvd2VyY2FzZSAqLworICAgICAgICAgICAgICAgICAgIGlmICgoa2V5c3ltLT5zeW0gPj0gJ0EnKSYmKGtleXN5bS0+c3ltIDw9ICdaJykpCisgICAgICAgICAgICAgICAgICAgICAgIGtleXN5bS0+c3ltICs9ICgnYSctJ0EnKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweEYwOgorICAgICAgICAgICAgICAgICAgIGtleXN5bS0+c3ltID0gTUlTQ19rZXltYXBbY2FwJjB4RkZdOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgIGtleXN5bS0+c3ltID0gU0RMS19VTktOT1dOOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBrZXlzeW0tPnNjYW5jb2RlID0ga2V5LT5rZXlfc2NhbjsKKyAgICBrZXlzeW0tPnVuaWNvZGUgPSAwOworCisgICAgaWYgKFNETF9UcmFuc2xhdGVVTklDT0RFKQorICAgIHsKKyAgICAgICAgY2hhciB1dGY4W01CX0NVUl9NQVhdOworICAgICAgICBpbnQgdXRmOGxlbjsKKyAgICAgICAgd2NoYXJfdCB1bmljb2RlOworCisgICAgICAgIHN3aXRjaCAoa2V5c3ltLT5zY2FuY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAvKiBFc2Mga2V5ICovCisgICAgICAgICAgIGNhc2UgMHgwMToga2V5c3ltLT51bmljb2RlID0gMjc7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIC8qIEJhY2tTcGFjZSBrZXkgKi8KKyAgICAgICAgICAgY2FzZSAweDBFOiBrZXlzeW0tPnVuaWNvZGUgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIC8qIEVudGVyIGtleSAqLworICAgICAgICAgICBjYXNlIDB4MUM6IGtleXN5bS0+dW5pY29kZSA9IDEwOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgIHV0ZjhsZW4gPSBQaEtleVRvTWIodXRmOCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAodXRmOGxlbiA+IDApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjhsZW4gPSBtYnRvd2MoJnVuaWNvZGUsIHV0ZjgsIHV0ZjhsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGY4bGVuID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN5bS0+dW5pY29kZSA9IHVuaWNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIChrZXlzeW0pOworfQorCit2b2lkIHBoX0luaXRPU0tleW1hcChfVEhJUykKK3sKKyAgICBwaF9Jbml0S2V5bWFwKCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9ldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYTkzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZXZlbnRzX2MuaApAQCAtMCwwICsxLDM3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfX1NETF9QSF9FVkVOVFNfSF9fCisjZGVmaW5lIF9fU0RMX1BIX0VWRU5UU19IX18KKworI2luY2x1ZGUgIlNETF9waF92aWRlby5oIgorCisjZGVmaW5lIFBIX1NETF9NQVhfUkVDVFMgMjU2CisjZGVmaW5lIFBIX0VWRU5UX1NBRkVUWV9QT09MIDUxMgorI2RlZmluZSBFVkVOVF9TSVpFIChzaXplb2YoUGhFdmVudF90KSArIDEwMDAgKyBQSF9FVkVOVF9TQUZFVFlfUE9PTCkKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCitleHRlcm4gdm9pZCBwaF9Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgcGhfUHVtcEV2ZW50cyhfVEhJUyk7CisKKyNlbmRpZiAvKiBfX1NETF9QSF9FVkVOVFNfSF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZ2wuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9nbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMjE3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZ2wuYwpAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9waF9nbC5oIgorCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCisjaWYgKF9OVE9fVkVSU0lPTiA+PSA2MzApCisgICAgLyogUGhvdG9uR0wgZnVuY3Rpb25zICovCisgICAgR0xQSF9ERUNMQVJFX0ZVTkNTOworI2VuZGlmIC8qIDYuMy4wICovCisKKyNpZiAoX05UT19WRVJTSU9OIDwgNjMwKQordm9pZCBwaF9HTF9Td2FwQnVmZmVycyhfVEhJUykKK3sKKyAgICBQZ1NldFJlZ2lvbihQdFdpZGdldFJpZCh3aW5kb3cpKTsKKyAgICBQZE9wZW5HTENvbnRleHRTd2FwQnVmZmVycyhvZ2xjdHgpOworfQorI2Vsc2UKK3ZvaWQgcGhfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpCit7CisgICAgcW54Z2xfc3dhcF9idWZmZXJzKG9nbGJ1ZmZlcnMpOworfQorI2VuZGlmIC8qIDYuMy4wICovCisKK2ludCBwaF9HTF9HZXRBdHRyaWJ1dGUoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKQoreworICAgIHN3aXRjaCAoYXR0cmliKQorICAgIHsKKyAgICAgICAgY2FzZSBTRExfR0xfRE9VQkxFQlVGRkVSOgorICAgICAgICAgICAgICp2YWx1ZT10aGlzLT5nbF9jb25maWcuZG91YmxlX2J1ZmZlcjsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRExfR0xfU1RFTkNJTF9TSVpFOgorICAgICAgICAgICAgICp2YWx1ZT10aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNETF9HTF9ERVBUSF9TSVpFOgorICAgICAgICAgICAgICp2YWx1ZT10aGlzLT5nbF9jb25maWcuZGVwdGhfc2l6ZTsKKyAgICAgICAgICAgICBicmVhazsKKyNpZiAoX05UT19WRVJTSU9OID49IDYzMCkKKyAgICAgICAgY2FzZSBTRExfR0xfUkVEX1NJWkU6CisgICAgICAgICAgICAgKnZhbHVlPXRoaXMtPmdsX2NvbmZpZy5yZWRfc2l6ZTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRExfR0xfR1JFRU5fU0laRToKKyAgICAgICAgICAgICAqdmFsdWU9dGhpcy0+Z2xfY29uZmlnLmdyZWVuX3NpemU7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX0JMVUVfU0laRToKKyAgICAgICAgICAgICAqdmFsdWU9dGhpcy0+Z2xfY29uZmlnLmJsdWVfc2l6ZTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRExfR0xfQUxQSEFfU0laRToKKyAgICAgICAgICAgICAqdmFsdWU9dGhpcy0+Z2xfY29uZmlnLmFscGhhX3NpemU7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX0FDQ1VNX1JFRF9TSVpFOgorICAgICAgICAgICAgICp2YWx1ZT10aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemU7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0dSRUVOX1NJWkU6CisgICAgICAgICAgICAgKnZhbHVlPXRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ncmVlbl9zaXplOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNETF9HTF9BQ0NVTV9CTFVFX1NJWkU6CisgICAgICAgICAgICAgKnZhbHVlPXRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemU7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0FMUEhBX1NJWkU6CisgICAgICAgICAgICAgKnZhbHVlPXRoaXMtPmdsX2NvbmZpZy5hY2N1bV9hbHBoYV9zaXplOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNETF9HTF9TVEVSRU86CisgICAgICAgICAgICAgKnZhbHVlPXRoaXMtPmdsX2NvbmZpZy5zdGVyZW87CisgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogNi4zLjAgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAqdmFsdWU9MDsKKyAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmIChfTlRPX1ZFUlNJT04gPCA2MzApCitpbnQgcGhfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIqIHBhdGgpCit7CisgICAgLyogaWYgY29kZSBjb21waWxlZCB3aXRoIFNETF9WSURFT19PUEVOR0wsIHRoYXQgbWVhbiB0aGF0IGxpYnJhcnkgYWxyZWFkeSBsaW5rZWQgKi8KKyAgICB0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbHNlCitpbnQgcGhfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIqIHBhdGgpCit7CisgICAgdm9pZCogaGFuZGxlOworICAgIGludCBkbG9wZW5fZmxhZ3M9UlRMRF9XT1JMRCB8IFJUTERfR1JPVVA7CisKKyAgICBpZiAodGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUhPU5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBoYW5kbGUgPSBkbG9wZW4ocGF0aCwgZGxvcGVuX2ZsYWdzKTsKKworICAgIGlmIChoYW5kbGU9PU5VTEwpCisgICAgeworICAgICAgICBTRExfU2V0RXJyb3IoInBoX0dMX0xvYWRMaWJyYXJ5KCk6IENvdWxkIG5vdCBsb2FkIE9wZW5HTCBsaWJyYXJ5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IGhhbmRsZTsKKyAgICB0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7CisKKyAgICBTRExfc3RybGNweSh0aGlzLT5nbF9jb25maWcuZHJpdmVyX3BhdGgsIHBhdGgsIFNETF9hcnJheXNpemUodGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoKSk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiA2LjMuMCAqLworCisjaWYgKF9OVE9fVkVSU0lPTiA8IDYzMCkKK3ZvaWQqIHBoX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyKiBwcm9jKQoreworICAgIHJldHVybiBOVUxMOworfQorI2Vsc2UKK3ZvaWQqIHBoX0dMX0dldFByb2NBZGRyZXNzKF9USElTLCBjb25zdCBjaGFyKiBwcm9jKQoreworICAgIHZvaWQqIGZ1bmN0aW9uOworCisgICAgaWYgKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlPT1OVUxMKQorICAgIHsKKyAgICAgICAgcGhfR0xfTG9hZExpYnJhcnkodGhpcywgREVGQVVMVF9PUEVOR0wpOworICAgICAgICBpZiAodGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGU9PU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgCisgICAgZnVuY3Rpb249cW54Z2xfZ2V0X2Z1bmMocHJvYywgb2dsY3R4LCAwKTsKKyAgICBpZiAoZnVuY3Rpb249PU5VTEwpCisgICAgeworICAgICAgICBmdW5jdGlvbj1kbHN5bSh0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSwgcHJvYyk7CisgICAgfQorCisgICAgcmV0dXJuIGZ1bmN0aW9uOworfQorI2VuZGlmIC8qIDYuMy4wICovCisKKyNpZiAoX05UT19WRVJTSU9OIDwgNjMwKQoraW50IHBoX0dMX01ha2VDdXJyZW50KF9USElTKQoreworICAgIFBnU2V0UmVnaW9uKFB0V2lkZ2V0UmlkKHdpbmRvdykpOworCisgICAgaWYgKG9nbGN0eCE9TlVMTCkKKyAgICB7CisgICAgICAgIFBoRENTZXRDdXJyZW50KG9nbGN0eCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZWxzZQoraW50IHBoX0dMX01ha2VDdXJyZW50KF9USElTKQoreworICAgIFBnU2V0UmVnaW9uKFB0V2lkZ2V0UmlkKHdpbmRvdykpOworCisgICAgaWYgKG9nbGN0eCE9TlVMTCkKKyAgICB7CisgICAgICAgIGlmIChxbnhnbF9zZXRfY3VycmVudChvZ2xjdHgpID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIDYuMy4wICovCisKKyNpZiAoX05UT19WRVJTSU9OIDwgNjMwKQorCisvKiBUaGlzIGNvZGUgaXMgYWN0dWFsIGZvciB0aGUgUGhvdG9uM0QgUnVudGltZSB3aGljaCB3YXMgYXZhaWxhYmxlIHByaW9yIHRvIDYuMyBvbmx5ICovCisKK2ludCBwaF9TZXR1cE9wZW5HTENvbnRleHQoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworICAgIFBoRGltX3QgZGltOworICAgIHVpbnQ2NF90IE9HTEF0dHJpYltQSF9PR0xfTUFYX0FUVFJJQlNdOworICAgIGludCBleHBvc2Vwb3N0PTA7CisgICAgaW50IE9HTGFyZ2M7CisKKyAgICBkaW0udz13aWR0aDsKKyAgICBkaW0uaD1oZWlnaHQ7CisgICAgCisgICAgaWYgKChvZ2xjdHghPU5VTEwpICYmIChvZ2xmbGFncz09ZmxhZ3MpICYmIChvZ2xicHA9PWJwcCkpCisgICAgeworICAgICAgIFBkT3BlbkdMQ29udGV4dFJlc2l6ZShvZ2xjdHgsICZkaW0pOworICAgICAgIFBoRENTZXRDdXJyZW50KG9nbGN0eCk7CisgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgaWYgKG9nbGN0eCE9TlVMTCkKKyAgICAgICB7CisgICAgICAgICAgUGhEQ1NldEN1cnJlbnQoTlVMTCk7CisgICAgICAgICAgUGhEQ1JlbGVhc2Uob2dsY3R4KTsKKyAgICAgICAgICBvZ2xjdHg9TlVMTDsKKyAgICAgICAgICBleHBvc2Vwb3N0PTE7CisgICAgICAgfQorICAgIH0KKworICAgIE9HTGFyZ2M9MDsKKyAgICBpZiAodGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemUpCisgICAgeworICAgICAgICBPR0xBdHRyaWJbT0dMYXJnYysrXT1QSE9HTF9BVFRSSUJfREVQVEhfQklUUzsKKyAgICAgICAgT0dMQXR0cmliW09HTGFyZ2MrK109dGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemU7CisgICAgfQorICAgIGlmICh0aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplKQorICAgIHsKKyAgICAgICAgT0dMQXR0cmliW09HTGFyZ2MrK109UEhPR0xfQVRUUklCX1NURU5DSUxfQklUUzsKKyAgICAgICAgT0dMQXR0cmliW09HTGFyZ2MrK109dGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZTsKKyAgICB9CisgICAgT0dMQXR0cmliW09HTGFyZ2MrK109UEhPR0xfQVRUUklCX0ZPUkNFX1NXOworICAgIGlmIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKQorICAgIHsKKyAgICAgICAgT0dMQXR0cmliW09HTGFyZ2MrK109UEhPR0xfQVRUUklCX0ZVTExTQ1JFRU47CisgICAgICAgIE9HTEF0dHJpYltPR0xhcmdjKytdPVBIT0dMX0FUVFJJQl9ESVJFQ1Q7CisgICAgICAgIE9HTEF0dHJpYltPR0xhcmdjKytdPVBIT0dMX0FUVFJJQl9GVUxMU0NSRUVOX0JFU1Q7CisgICAgICAgIE9HTEF0dHJpYltPR0xhcmdjKytdPVBIT0dMX0FUVFJJQl9GVUxMU0NSRUVOX0NFTlRFUjsKKyAgICB9CisgICAgT0dMQXR0cmliW09HTGFyZ2MrK109UEhPR0xfQVRUUklCX05PTkU7CisKKyAgICBpZiAodGhpcy0+Z2xfY29uZmlnLmRvdWJsZV9idWZmZXIpCisgICAgeworICAgICAgICBvZ2xjdHg9UGRDcmVhdGVPcGVuR0xDb250ZXh0KDIsICZkaW0sIDAsIE9HTEF0dHJpYik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG9nbGN0eD1QZENyZWF0ZU9wZW5HTENvbnRleHQoMSwgJmRpbSwgMCwgT0dMQXR0cmliKTsKKyAgICB9CisKKyAgICBpZiAob2dsY3R4PT1OVUxMKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cE9wZW5HTENvbnRleHQoKTogY2Fubm90IGNyZWF0ZSBPcGVuR0wgY29udGV4dCAhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFBoRENTZXRDdXJyZW50KG9nbGN0eCk7CisKKyAgICBQdEZsdXNoKCk7CisKKyAgICBvZ2xmbGFncz1mbGFnczsKKyAgICBvZ2xicHA9YnBwOworCisgICAgaWYgKGV4cG9zZXBvc3QhPTApCisgICAgeworICAgICAgICAvKiBPcGVuR0wgY29udGV4dCBoYXMgYmVlbiByZWNyZWF0ZWQsIHNvIHJlcG9ydCBhYm91dCB0aGlzIGZhY3QgKi8KKyAgICAgICAgU0RMX1ByaXZhdGVFeHBvc2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogX05UT19WRVJTSU9OICovCisKKy8qIFRoaXMgY29kZSBpcyBhY3R1YWwgZm9yIHRoZSBidWlsdC1pbiBQaEdMIHN1cHBvcnQsIHdoaWNoIGJlY2FtZSBhdmFpbGFibGUgc2luY2UgNi4zICovCisKK2ludCBwaF9TZXR1cE9wZW5HTENvbnRleHQoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworICAgIHFueGdsX2J1Zl9hdHRyaWJfdCBxbnhnbF9hdHRyaWJzW1BIX09HTF9NQVhfQVRUUklCU107CisgICAgcW54Z2xfYnVmX2F0dHJpYl90KiBxbnhnbF9hdHRyaWJzX3NsaWRlOworICAgIGludCBudW1faW50ZXJmYWNlcyA9IDA7CisgICAgaW50IG51bV9idWZmZXJzID0gMDsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIE9wZW5HTCBzdWJzeXN0ZW0gKi8KKworICAgIG51bV9pbnRlcmZhY2VzID0gcW54Z2xfaW5pdChOVUxMLCBOVUxMLCAwKTsKKworICAgIGlmIChudW1faW50ZXJmYWNlcyA8IDApCisgICAgeworICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldHVwT3BlbkdMQ29udGV4dCgpOiBjYW5ub3QgaW5pdGlhbGl6ZSBPcGVuR0wgc3Vic3lzdGVtICFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChudW1faW50ZXJmYWNlcyA9PSAwKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cE9wZW5HTENvbnRleHQoKTogdGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBPcGVuR0wgcmVuZGVyZXJzIHdhcyBmb3VuZCAhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIERyaXZlciBpcyBsaW5rZWQgKi8KKyAgICB0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZD0xOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgT3BlbkdMIGNvbnRleHQgYXR0cmlidXRlcyAqLworICAgIHFueGdsX2F0dHJpYnNfc2xpZGU9cW54Z2xfYXR0cmliczsKKworICAgIC8qIERlcHRoIHNpemUgKi8KKyAgICBpZiAodGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemUpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNldHRlZCBkZXB0aCBzaXplICVkXG4iLCB0aGlzLT5nbF9jb25maWcuZGVwdGhfc2l6ZSk7CisgICAgICAgIHFueGdsX2F0dHJpYnNfc2xpZGUgPSBxbnhnbF9hdHRyaWJfc2V0X2RlcHRoKHFueGdsX2F0dHJpYnNfc2xpZGUsIHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplKTsKKyAgICB9CisKKyAgICAvKiBTdGVuY2lsIHNpemUgKi8KKyAgICBpZiAodGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZSkKKyAgICB7CisgICAgICAgIHFueGdsX2F0dHJpYnNfc2xpZGUgPSBxbnhnbF9hdHRyaWJfc2V0X3N0ZW5jaWwocW54Z2xfYXR0cmlic19zbGlkZSwgdGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZSk7CisgICAgfQorCisgICAgLyogVGhlIHN1bSBvZiB0aGUgYWNjdW0gYml0cyBvZiBlYWNoIGNoYW5uZWwgKi8KKyAgICBpZiAoKHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZSAhPSAwKSAmJiAodGhpcy0+Z2xfY29uZmlnLmFjY3VtX2JsdWVfc2l6ZSAhPSAwKSAmJgorICAgICAgICAodGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemUgIT0gMCkpCisgICAgeworICAgICAgICBxbnhnbF9hdHRyaWJzX3NsaWRlID0gcW54Z2xfYXR0cmliX3NldF9hY2N1bShxbnhnbF9hdHRyaWJzX3NsaWRlLAorICAgICAgICAgICB0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemUgKyB0aGlzLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplICsKKyAgICAgICAgICAgdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemUgKyB0aGlzLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZSk7CisgICAgfQorICAgIAorICAgIC8qIFN0ZXJlbyBtb2RlICovCisgICAgaWYgKHRoaXMtPmdsX2NvbmZpZy5zdGVyZW8pCisgICAgeworICAgICAgICBxbnhnbF9hdHRyaWJzX3NsaWRlID0gcW54Z2xfYXR0cmliX3NldF9zdGVyZW8ocW54Z2xfYXR0cmlic19zbGlkZSk7CisgICAgfQorCisgICAgLyogRnVsbHNjcmVlbiBtb2RlICovCisgICAgaWYgKChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTikKKyAgICB7CisgICAgICAgIHFueGdsX2F0dHJpYnNfc2xpZGUgPSBxbnhnbF9hdHRyaWJfc2V0X2hpbnRfZnVsbHNjcmVlbihxbnhnbF9hdHRyaWJzX3NsaWRlKTsKKyAgICB9CisgICAgCisgICAgLyogRG91YmxlIGJ1ZmZlcmluZyBtb2RlICovCisgICAgaWYgKHRoaXMtPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyKQorICAgIHsKKyAgICAgICAgbnVtX2J1ZmZlcnM9MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbnVtX2J1ZmZlcnM9MTsKKyAgICB9CisKKyAgICAvKiBMb2FkaW5nIHRoZSBmdW5jdGlvbiBwb2ludGVycyBzbyB3ZSBjYW4gdXNlIHRoZSBleHRlbnNpb25zICovCisgICAgR0xQSF9MT0FEX0ZVTkNTX0dDKG9nbGN0eCk7CisKKyAgICAvKiBTZXQgdGhlIGJ1ZmZlcnMgcmVnaW9uIHRvIGJlIHRoYXQgb2Ygb3VyIHdpbmRvdydzIHJlZ2lvbiAqLworICAgIHFueGdsX2F0dHJpYnNfc2xpZGUgPSBnbHBoX2F0dHJpYl9zZXRfcmVnaW9uKHFueGdsX2F0dHJpYnNfc2xpZGUsIFB0V2lkZ2V0UmlkKHdpbmRvdykpOworCisgICAgLyogRW5kIG9mIHRoZSBhdHRyaWJ1dGVzIGFycmF5ICovCisgICAgcW54Z2xfYXR0cmlic19zbGlkZSA9IHFueGdsX2F0dHJpYl9zZXRfZW5kKHFueGdsX2F0dHJpYnNfc2xpZGUpOworICAgIAorICAgIC8qIENyZWF0ZSB0aGUgYnVmZmVycyB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IgbW9kZWwgKi8KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFSR0I6ICVkLCAlZCwgJWQsICVkXG4iLCB0aGlzLT5nbF9jb25maWcuYWxwaGFfc2l6ZSwgdGhpcy0+Z2xfY29uZmlnLnJlZF9zaXplLCB0aGlzLT5nbF9jb25maWcuZ3JlZW5fc2l6ZSwgdGhpcy0+Z2xfY29uZmlnLmJsdWVfc2l6ZSk7CisgICAgb2dsYnVmZmVycyA9IHFueGdsX2J1ZmZlcnNfY3JlYXRlKAorICAgICAgICAgICAgICAgICAgIFFOWEdMX0ZPUk1BVF9CRVNUX1JHQiwKKy8qICAgICAgICAgICAgICAgICBfX1FOWEdMX0JVSUxEX0ZPUk1BVCgwLCBfX1FOWEdMX0NPTE9SX01PREVMX1JHQiwgdGhpcy0+Z2xfY29uZmlnLmFscGhhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB0aGlzLT5nbF9jb25maWcucmVkX3NpemUsIHRoaXMtPmdsX2NvbmZpZy5ncmVlbl9zaXplLCB0aGlzLT5nbF9jb25maWcuYmx1ZV9zaXplKSwgKi8KKyAgICAgICAgICAgICAgICAgbnVtX2J1ZmZlcnMsIHdpZHRoLCBoZWlnaHQsIHFueGdsX2F0dHJpYnMsIC0xKTsKKworCisgICAgaWYgKG9nbGJ1ZmZlcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBPcGVuR0xDb250ZXh0KCk6IGZhaWxlZCB0byBjcmVhdGUgT3BlbkdMIGJ1ZmZlcnMgIVxuIik7CisgICAgICAgIHFueGdsX2ZpbmlzaCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQ3JlYXRlIGEgUU5YR0wgY29udGV4dCBmb3IgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBidWZmZXIgKi8KKyAgICBvZ2xjdHggPSBxbnhnbF9jb250ZXh0X2NyZWF0ZShvZ2xidWZmZXJzLCBOVUxMKTsKKworICAgIGlmIChvZ2xjdHggPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBPcGVuR0xDb250ZXh0KCk6IGZhaWxlZCB0byBjcmVhdGUgT3BlbkdMIGNvbnRleHQgIVxuIik7CisgICAgICAgIHFueGdsX2J1ZmZlcnNfZGVzdHJveShvZ2xidWZmZXJzKTsKKyAgICAgICAgcW54Z2xfZmluaXNoKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBBdHRlbXB0IHRvIG1ha2UgdGhlIGNvbnRleHQgY3VycmVudCBzbyB3ZSBjYW4gdXNlIE9wZW5HTCBjb21tYW5kcyAqLworICAgIGlmIChxbnhnbF9zZXRfY3VycmVudChvZ2xjdHgpID09IC0xKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cE9wZW5HTENvbnRleHQoKTogZmFpbGVkIHRvIG1ha2UgdGhlIE9wZW5HTCBjb250ZXh0IGN1cnJlbnQgIVxuIik7CisgICAgICAgIHFueGdsX2NvbnRleHRfZGVzdHJveShvZ2xjdHgpOworICAgICAgICBxbnhnbF9idWZmZXJzX2Rlc3Ryb3kob2dsYnVmZmVycyk7CisgICAgICAgIHFueGdsX2ZpbmlzaCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgUHRGbHVzaCgpOworCisgICAgb2dsZmxhZ3M9ZmxhZ3M7CisgICAgb2dsYnBwPWJwcDsKKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogX05UT19WRVJTSU9OICovCisKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZ2wuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9nbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYjEzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfZ2wuaApAQCAtMCwwICsxLDQxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfX1NETF9QSF9HTF9IX18KKyNkZWZpbmUgX19TRExfUEhfR0xfSF9fCisKKyNpbmNsdWRlICJTRExfcGhfdmlkZW8uaCIKKworI2RlZmluZSBERUZBVUxUX09QRU5HTCAiL3Vzci9saWIvbGliR0wuc28iCisKKyNpZiBTRExfVklERU9fT1BFTkdMCisgICAgdm9pZCAgcGhfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpOworICAgIGludCAgIHBoX0dMX0dldEF0dHJpYnV0ZShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOworICAgIGludCAgIHBoX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyKiBwYXRoKTsKKyAgICB2b2lkKiBwaF9HTF9HZXRQcm9jQWRkcmVzcyhfVEhJUywgY29uc3QgY2hhciogcHJvYyk7CisgICAgaW50ICAgcGhfR0xfTWFrZUN1cnJlbnQoX1RISVMpOworCisgICAgaW50ICAgcGhfU2V0dXBPcGVuR0xDb250ZXh0KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CisjZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTCAqLworCisjZW5kaWYgLyogX19TRExfUEhfR0xfSF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfaW1hZ2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9pbWFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjQ5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfaW1hZ2UuYwpAQCAtMCwwICsxLDEwNTkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8UGguaD4KKyNpbmNsdWRlIDxwaG90b24vUGcuaD4KKworI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICJTRExfcGhfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfcGhfaW1hZ2VfYy5oIgorI2luY2x1ZGUgIlNETF9waF9tb2Rlc19jLmgiCisjaW5jbHVkZSAiU0RMX3BoX2dsLmgiCisKK2ludCBwaF9TZXR1cEltYWdlKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKQoreworICAgIFBnQ29sb3JfdCogcGFsZXR0ZT1OVUxMOworICAgIGludCB0eXBlPTA7CisgICAgaW50IGJwcDsKKyAgICAKKyAgICBicHA9c2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKKworICAgIC8qIERldGVybWluZSBpbWFnZSB0eXBlICovCisgICAgc3dpdGNoKGJwcCkKKyAgICB7CisgICAgICAgIGNhc2UgODp7CisgICAgICAgICAgICB0eXBlID0gUGdfSU1BR0VfUEFMRVRURV9CWVRFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE1OnsKKyAgICAgICAgICAgIHR5cGUgPSBQZ19JTUFHRV9ESVJFQ1RfNTU1OyAKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjp7CisgICAgICAgICAgICB0eXBlID0gUGdfSU1BR0VfRElSRUNUXzU2NTsgCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjQ6eworICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX0RJUkVDVF84ODg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzI6eworICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX0RJUkVDVF84ODg4OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OnsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBJbWFnZSgpOiB1bnN1cHBvcnRlZCBicHA9JWQgIVxuIiwgYnBwKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBwYWxldHRlIGVtdWxhdGlvbiBjb2RlICovCisgICAgaWYgKChicHA9PTgpICYmIChkZXNrdG9wcGFsPT1TRExQSF9QQUxfRU1VTEFURSkpCisgICAgeworICAgICAgICAvKiBjcmVhdGluZyBpbWFnZSBwYWxldHRlICovCisgICAgICAgIHBhbGV0dGU9U0RMX21hbGxvYyhfUGdfTUFYX1BBTEVUVEUqc2l6ZW9mKFBnQ29sb3JfdCkpOworICAgICAgICBpZiAocGFsZXR0ZT09TlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cEltYWdlKCk6IGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcGFsZXR0ZSAhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQZ0dldFBhbGV0dGUocGFsZXR0ZSk7CisKKyAgICAgICAgLyogdXNpbmcgc2hhcmVkIG1lbW9yeSBmb3Igc3BlZWQgKHNldCBsYXN0IHBhcmFtIHRvIDEpICovCisgICAgICAgIGlmICgoU0RMX0ltYWdlID0gUGhDcmVhdGVJbWFnZShOVUxMLCBzY3JlZW4tPncsIHNjcmVlbi0+aCwgdHlwZSwgcGFsZXR0ZSwgX1BnX01BWF9QQUxFVFRFLCAxKSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cEltYWdlKCk6IFBoQ3JlYXRlSW1hZ2UoKSBmYWlsZWQgZm9yIGJwcD04ICFcbiIpOworICAgICAgICAgICAgU0RMX2ZyZWUocGFsZXR0ZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogdXNpbmcgc2hhcmVkIG1lbW9yeSBmb3Igc3BlZWQgKHNldCBsYXN0IHBhcmFtIHRvIDEpICovCisgICAgICAgIGlmICgoU0RMX0ltYWdlID0gUGhDcmVhdGVJbWFnZShOVUxMLCBzY3JlZW4tPncsIHNjcmVlbi0+aCwgdHlwZSwgTlVMTCwgMCwgMSkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBJbWFnZSgpOiBQaENyZWF0ZUltYWdlKCkgZmFpbGVkIGZvciBicHA9JWQgIVxuIiwgYnBwKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNjcmVlbi0+cGl4ZWxzID0gU0RMX0ltYWdlLT5pbWFnZTsKKyAgICBzY3JlZW4tPnBpdGNoID0gU0RMX0ltYWdlLT5icGw7CisKKyAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IHBoX05vcm1hbFVwZGF0ZTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgcGhfU2V0dXBPQ0ltYWdlKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKQoreworICAgIGludCB0eXBlID0gMDsKKyAgICBpbnQgYnBwOworCisgICAgT0NJbWFnZS5mbGFncyA9IHNjcmVlbi0+ZmxhZ3M7CisgICAgCisgICAgYnBwPXNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisKKyAgICAvKiBEZXRlcm1pbmUgaW1hZ2UgdHlwZSAqLworICAgIHN3aXRjaChicHApCisgICAgeworICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX1BBTEVUVEVfQllURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTU6eworICAgICAgICAgICAgICAgICAgICB0eXBlID0gUGdfSU1BR0VfRElSRUNUXzU1NTsgCisJCX0KKwkJYnJlYWs7CisgICAgICAgIGNhc2UgMTY6eworICAgICAgICAgICAgICAgICAgICB0eXBlID0gUGdfSU1BR0VfRElSRUNUXzU2NTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI0OnsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX0RJUkVDVF84ODg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMyOnsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBnX0lNQUdFX0RJUkVDVF84ODg4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDp7CisgICAgICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBPQ0ltYWdlKCk6IHVuc3VwcG9ydGVkIGJwcD0lZCAhXG4iLCBicHApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEN1cnJlbnRseSBvZmZzY3JlZW4gY29udGV4dHMgd2l0aCB0aGUgc2FtZSBiaXQgZGVwdGggYXMgZGlzcGxheSBicHAgb25seSBjYW4gYmUgY3JlYXRlZCAqLworICAgIE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQgPSBQZENyZWF0ZU9mZnNjcmVlbkNvbnRleHQoMCwgc2NyZWVuLT53LCBzY3JlZW4tPmgsIFBnX09TQ19NRU1fUEFHRV9BTElHTik7CisKKyAgICBpZiAoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cE9DSW1hZ2UoKTogUGRDcmVhdGVPZmZzY3JlZW5Db250ZXh0KCkgZnVuY3Rpb24gZmFpbGVkICFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc2NyZWVuLT5waXRjaCA9IE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQtPnBpdGNoOworCisgICAgT0NJbWFnZS5kY19wdHIgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0KTsKKworICAgIGlmIChPQ0ltYWdlLmRjX3B0ciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9TZXR1cE9DSW1hZ2UoKTogUGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgUGhEQ1JlbGVhc2UoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBPQ0ltYWdlLkZyYW1lRGF0YTAgPSBPQ0ltYWdlLmRjX3B0cjsKKyAgICBPQ0ltYWdlLkN1cnJlbnRGcmFtZURhdGEgPSBPQ0ltYWdlLkZyYW1lRGF0YTA7CisgICAgT0NJbWFnZS5jdXJyZW50ID0gMDsKKworICAgIFBoRENTZXRDdXJyZW50KE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQpOworCisgICAgc2NyZWVuLT5waXhlbHMgPSBPQ0ltYWdlLkN1cnJlbnRGcmFtZURhdGE7CisKKyAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IHBoX09DVXBkYXRlOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBwaF9TZXR1cEZ1bGxTY3JlZW5JbWFnZShfVEhJUywgU0RMX1N1cmZhY2UqIHNjcmVlbikKK3sKKyAgICBPQ0ltYWdlLmZsYWdzID0gc2NyZWVuLT5mbGFnczsKKworICAgIC8qIEJlZ2luIGRpcmVjdCBhbmQgZnVsbHNjcmVlbiBtb2RlICovCisgICAgaWYgKCFwaF9FbnRlckZ1bGxTY3JlZW4odGhpcywgc2NyZWVuLCBQSF9FTlRFUl9ESVJFQ1RNT0RFKSkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBzdG9yZSBwYWxldHRlIGZvciBmdWxsc2NyZWVuICovCisgICAgaWYgKChzY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsPT04KSAmJiAoZGVza3RvcGJwcCE9OCkpCisgICAgeworICAgICAgICBQZ0dldFBhbGV0dGUoc2F2ZWRwYWwpOworICAgICAgICBQZ0dldFBhbGV0dGUoc3lzcGFscGgpOworICAgIH0KKworICAgIE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQgPSBQZENyZWF0ZU9mZnNjcmVlbkNvbnRleHQoMCwgMCwgMCwgUGdfT1NDX01BSU5fRElTUExBWSB8IFBnX09TQ19NRU1fUEFHRV9BTElHTiB8IFBnX09TQ19DUlRDX1NBRkUpOworICAgIGlmIChPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldHVwRnVsbFNjcmVlbkltYWdlKCk6IFBkQ3JlYXRlT2Zmc2NyZWVuQ29udGV4dCgpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBpZiAoKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGKQorICAgIHsKKyAgICAgICAgT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQgPSBQZER1cE9mZnNjcmVlbkNvbnRleHQoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCwgUGdfT1NDX01FTV9QQUdFX0FMSUdOIHwgUGdfT1NDX0NSVENfU0FGRSk7CisgICAgICAgIGlmIChPQ0ltYWdlLm9mZnNjcmVlbl9iYWNrY29udGV4dCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldHVwRnVsbFNjcmVlbkltYWdlKCk6IFBkQ3JlYXRlT2Zmc2NyZWVuQ29udGV4dChiYWNrKSBmdW5jdGlvbiBmYWlsZWQgIVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPQ0ltYWdlLkZyYW1lRGF0YTAgPSAodW5zaWduZWQgY2hhciAqKVBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cihPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0KTsKKyAgICBpZiAoT0NJbWFnZS5GcmFtZURhdGEwID09IE5VTEwpCisgICAgeworICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldHVwRnVsbFNjcmVlbkltYWdlKCk6IFBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cigpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgcGhfRGVzdHJveUltYWdlKHRoaXMsIHNjcmVlbik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGKQorICAgIHsKKyAgICAgICAgT0NJbWFnZS5GcmFtZURhdGExID0gKHVuc2lnbmVkIGNoYXIgKilQZEdldE9mZnNjcmVlbkNvbnRleHRQdHIoT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQpOworICAgICAgICBpZiAoT0NJbWFnZS5GcmFtZURhdGExID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfU2V0dXBGdWxsU2NyZWVuSW1hZ2UoYmFjayk6IFBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cigpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgICAgIHBoX0Rlc3Ryb3lJbWFnZSh0aGlzLCBzY3JlZW4pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogd2FpdCBmb3IgdGhlIGhhcmR3YXJlICovCisgICAgUGdGbHVzaCgpOworICAgIFBnV2FpdEhXSWRsZSgpOworCisgICAgaWYgKChzY3JlZW4tPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gU0RMX0RPVUJMRUJVRikKKyAgICB7CisgICAgICAgIE9DSW1hZ2UuY3VycmVudCA9IDA7CisgICAgICAgIFBoRENTZXRDdXJyZW50KE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQpOworICAgICAgICBzY3JlZW4tPnBpdGNoID0gT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dC0+cGl0Y2g7CisgICAgICAgIHNjcmVlbi0+cGl4ZWxzID0gT0NJbWFnZS5GcmFtZURhdGEwOworICAgICAgICAKKyAgICAgICAgLyogZW11bGF0ZSA2NDB4NDAwIHZpZGVvbW9kZSAqLworICAgICAgICBpZiAodmlkZW9tb2RlX2VtdWxhdGVtb2RlPT0xKQorICAgICAgICB7CisgICAgICAgICAgIGludCBpOworICAgICAgICAgICAKKyAgICAgICAgICAgZm9yIChpPTA7IGk8NDA7IGkrKykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBTRExfbWVtc2V0KHNjcmVlbi0+cGl4ZWxzK3NjcmVlbi0+cGl0Y2gqaSwgMHgwMCwgc2NyZWVuLT5waXRjaCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZm9yIChpPTQ0MDsgaTw0ODA7IGkrKykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBTRExfbWVtc2V0KHNjcmVlbi0+cGl4ZWxzK3NjcmVlbi0+cGl0Y2gqaSwgMHgwMCwgc2NyZWVuLT5waXRjaCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgc2NyZWVuLT5waXhlbHMrPXNjcmVlbi0+cGl0Y2gqNDA7CisgICAgICAgIH0KKyAgICAgICAgUGdTd2FwRGlzcGxheShPQ0ltYWdlLm9mZnNjcmVlbl9iYWNrY29udGV4dCwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE9DSW1hZ2UuY3VycmVudCA9IDA7CisgICAgICAgIFBoRENTZXRDdXJyZW50KE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQpOworICAgICAgICBzY3JlZW4tPnBpdGNoID0gT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dC0+cGl0Y2g7CisgICAgICAgIHNjcmVlbi0+cGl4ZWxzID0gT0NJbWFnZS5GcmFtZURhdGEwOworCisgICAgICAgIC8qIGVtdWxhdGUgNjQweDQwMCB2aWRlb21vZGUgKi8KKyAgICAgICAgaWYgKHZpZGVvbW9kZV9lbXVsYXRlbW9kZT09MSkKKyAgICAgICAgeworICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgCisgICAgICAgICAgIGZvciAoaT0wOyBpPDQwOyBpKyspCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU0RMX21lbXNldChzY3JlZW4tPnBpeGVscytzY3JlZW4tPnBpdGNoKmksIDB4MDAsIHNjcmVlbi0+cGl0Y2gpOworICAgICAgICAgICB9CisgICAgICAgICAgIGZvciAoaT00NDA7IGk8NDgwOyBpKyspCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU0RMX21lbXNldChzY3JlZW4tPnBpeGVscytzY3JlZW4tPnBpdGNoKmksIDB4MDAsIHNjcmVlbi0+cGl0Y2gpOworICAgICAgICAgICB9CisgICAgICAgICAgIHNjcmVlbi0+cGl4ZWxzKz1zY3JlZW4tPnBpdGNoKjQwOworICAgICAgICB9CisgICAgfQorCisgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBwaF9PQ0RDVXBkYXRlOworCisgICAgLyogd2FpdCBmb3IgdGhlIGhhcmR3YXJlICovCisgICAgUGdGbHVzaCgpOworICAgIFBnV2FpdEhXSWRsZSgpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisKK2ludCBwaF9TZXR1cE9wZW5HTEltYWdlKF9USElTLCBTRExfU3VyZmFjZSogc2NyZWVuKQoreworICAgIHRoaXMtPlVwZGF0ZVJlY3RzID0gcGhfT3BlbkdMVXBkYXRlOworICAgIHNjcmVlbi0+cGl4ZWxzPU5VTEw7CisgICAgc2NyZWVuLT5waXRjaD1OVUxMOworCisgICAgI2lmIChfTlRPX1ZFUlNJT04gPj0gNjMwKQorICAgICAgICBpZiAoKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghcGhfRW50ZXJGdWxsU2NyZWVuKHRoaXMsIHNjcmVlbiwgUEhfSUdOT1JFX0RJUkVDVE1PREUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjcmVlbi0+ZmxhZ3MgJj0gflNETF9GVUxMU0NSRUVOOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICNlbmRpZiAvKiA2LjMuMCAqLworCisgICAgaWYgKHBoX1NldHVwT3BlbkdMQ29udGV4dCh0aGlzLCBzY3JlZW4tPncsIHNjcmVlbi0+aCwgc2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCwgc2NyZWVuLT5mbGFncykhPTApCisgICAgeworICAgICAgICBzY3JlZW4tPmZsYWdzICY9IH5TRExfT1BFTkdMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCisKK3ZvaWQgcGhfRGVzdHJveUltYWdlKF9USElTLCBTRExfU3VyZmFjZSogc2NyZWVuKQoreworCisjaWYgU0RMX1ZJREVPX09QRU5HTAorICAgIGlmICgoc2NyZWVuLT5mbGFncyAmIFNETF9PUEVOR0wpPT1TRExfT1BFTkdMKQorICAgIHsKKyAgICAgICAgaWYgKG9nbGN0eCkKKyAgICAgICAgeworICAgICAgICAgICAgI2lmIChfTlRPX1ZFUlNJT04gPCA2MzApCisgICAgICAgICAgICAgICAgUGhEQ1NldEN1cnJlbnQoTlVMTCk7CisgICAgICAgICAgICAgICAgUGhEQ1JlbGVhc2Uob2dsY3R4KTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgcW54Z2xfY29udGV4dF9kZXN0cm95KG9nbGN0eCk7CisgICAgICAgICAgICAgICAgcW54Z2xfYnVmZmVyc19kZXN0cm95KG9nbGJ1ZmZlcnMpOworICAgICAgICAgICAgICAgIHFueGdsX2ZpbmlzaCgpOworICAgICAgICAgICAgI2VuZGlmIC8qIDYuMy4wICovCisgICAgICAgICAgICBvZ2xjdHg9TlVMTDsKKyAgICAgICAgICAgIG9nbGJ1ZmZlcnM9TlVMTDsKKyAgICAgICAgICAgIG9nbGZsYWdzPTA7CisgICAgICAgICAgICBvZ2xicHA9MDsKKyAgICAgICAgfQorCisgICAgICAgICNpZiAoX05UT19WRVJTSU9OID49IDYzMCkKKyAgICAgICAgICAgIGlmIChjdXJyZW50bHlfZnVsbHNjcmVlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaF9MZWF2ZUZ1bGxTY3JlZW4odGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZiAvKiA2LjMuMCAqLworCisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTCAqLworCisgICAgaWYgKGN1cnJlbnRseV9mdWxsc2NyZWVuKQorICAgIHsKKyAgICAgICAgLyogaWYgd2UgcmlnaHQgbm93IGluIDhicHAgZnVsbHNjcmVlbiB3ZSBtdXN0IHJlbGVhc2UgcGFsZXR0ZSAqLworICAgICAgICBpZiAoKHNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw9PTgpICYmIChkZXNrdG9wYnBwIT04KSkKKyAgICAgICAgeworICAgICAgICAgICAgUGdTZXRQYWxldHRlKHN5c3BhbHBoLCAwLCAtMSwgMCwgMCwgMCk7CisgICAgICAgICAgICBQZ1NldFBhbGV0dGUoc2F2ZWRwYWwsIDAsIDAsIF9QZ19NQVhfUEFMRVRURSwgUGdfUEFMU0VUX0dMT0JBTCB8IFBnX1BBTFNFVF9GT1JDRV9FWFBPU0UsIDApOworICAgICAgICAgICAgUGdGbHVzaCgpOworICAgICAgICB9CisgICAgICAgIHBoX0xlYXZlRnVsbFNjcmVlbih0aGlzKTsKKyAgICB9CisKKyAgICBpZiAoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUGhEQ1JlbGVhc2UoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCk7CisgICAgICAgIE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQgPSBOVUxMOworICAgICAgICBPQ0ltYWdlLkZyYW1lRGF0YTAgPSBOVUxMOworICAgIH0KKyAgICBpZiAoT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBoRENSZWxlYXNlKE9DSW1hZ2Uub2Zmc2NyZWVuX2JhY2tjb250ZXh0KTsKKyAgICAgICAgT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQgPSBOVUxMOworICAgICAgICBPQ0ltYWdlLkZyYW1lRGF0YTEgPSBOVUxMOworICAgIH0KKyAgICBPQ0ltYWdlLkN1cnJlbnRGcmFtZURhdGEgPSBOVUxMOworCisgICAgaWYgKFNETF9JbWFnZSkKKyAgICB7CisgICAgICAgIC8qIGlmIHBhbGV0dGUgYWxsb2NhdGVkLCBmcmVlIGl0ICovCisgICAgICAgIGlmIChTRExfSW1hZ2UtPnBhbGV0dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9mcmVlKFNETF9JbWFnZS0+cGFsZXR0ZSk7CisgICAgICAgIH0KKyAgICAgICAgUGdTaG1lbURlc3Ryb3koU0RMX0ltYWdlLT5pbWFnZSk7CisgICAgICAgIFNETF9mcmVlKFNETF9JbWFnZSk7CisgICAgfQorCisgICAgLyogTXVzdCBiZSB6ZXJvZWQgZXZlcnl0aW1lICovCisgICAgU0RMX0ltYWdlID0gTlVMTDsKKworICAgIGlmIChzY3JlZW4pCisgICAgeworICAgICAgICBzY3JlZW4tPnBpeGVscyA9IE5VTEw7CisgICAgfQorfQorCitpbnQgcGhfVXBkYXRlSFdJbmZvKF9USElTKQoreworICAgIFBnVmlkZW9Nb2RlSW5mb190IHZtb2RlOworICAgIFBnSFdDYXBzX3QgaHdjYXBzOworCisgICAgLyogVXBkYXRlIHZpZGVvIHJhbSBhbW91bnQgKi8KKyAgICBpZiAoUGdHZXRHcmFwaGljc0hXQ2FwcygmaHdjYXBzKSA8IDApCisgICAgeworICAgICAgICBTRExfU2V0RXJyb3IoInBoX1VwZGF0ZUhXSW5mbygpOiBHZXRHcmFwaGljc0hXQ2FwcygpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB0aGlzLT5pbmZvLnZpZGVvX21lbT1od2NhcHMuY3VycmVudGx5X2F2YWlsYWJsZV92aWRlb19yYW0vMTAyNDsKKworICAgIC8qIG9idGFpbiBjdXJyZW50IG1vZGUgY2FwYWJpbGl0aWVzICovCisgICAgaWYgKFBnR2V0VmlkZW9Nb2RlSW5mbyhod2NhcHMuY3VycmVudF92aWRlb19tb2RlLCAmdm1vZGUpIDwgMCkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigicGhfVXBkYXRlSFdJbmZvKCk6IEdldFZpZGVvTW9kZUluZm8oKSBmdW5jdGlvbiBmYWlsZWQgIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKHZtb2RlLm1vZGVfY2FwYWJpbGl0aWVzMSAmIFBnVk1fTU9ERV9DQVAxX09GRlNDUkVFTikgPT0gUGdWTV9NT0RFX0NBUDFfT0ZGU0NSRUVOKQorICAgIHsKKyAgICAgICAgLyogdGhpcyBpcyBhIHNwZWNpYWwgdGVzdCBmb3IgZHJpdmVycyB3aGljaCB0cmllcyB0byBsaWUgYWJvdXQgb2Zmc2NyZWVuIGNhcGFiaWxpdHkgKi8KKyAgICAgICAgaWYgKGh3Y2Fwcy5jdXJyZW50bHlfYXZhaWxhYmxlX3ZpZGVvX3JhbSE9MCkKKyAgICAgICAgeworICAgICAgICAgICB0aGlzLT5pbmZvLmh3X2F2YWlsYWJsZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgIHRoaXMtPmluZm8uaHdfYXZhaWxhYmxlID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0aGlzLT5pbmZvLmh3X2F2YWlsYWJsZSA9IDA7CisgICAgfQorCisgICAgaWYgKCh2bW9kZS5tb2RlX2NhcGFiaWxpdGllczIgJiBQZ1ZNX01PREVfQ0FQMl9SRUNUQU5HTEUpID09IFBnVk1fTU9ERV9DQVAyX1JFQ1RBTkdMRSkKKyAgICB7CisgICAgICAgIHRoaXMtPmluZm8uYmxpdF9maWxsID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGhpcy0+aW5mby5ibGl0X2ZpbGwgPSAwOworICAgIH0KKworICAgIGlmICgodm1vZGUubW9kZV9jYXBhYmlsaXRpZXMyICYgUGdWTV9NT0RFX0NBUDJfQklUQkxUKSA9PSBQZ1ZNX01PREVfQ0FQMl9CSVRCTFQpCisgICAgeworICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHcgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHcgPSAwOworICAgIH0KKworICAgIGlmICgodm1vZGUubW9kZV9jYXBhYmlsaXRpZXMyICYgUGdWTV9NT0RFX0NBUDJfQUxQSEFfQkxFTkQpID09IFBnVk1fTU9ERV9DQVAyX0FMUEhBX0JMRU5EKQorICAgIHsKKyAgICAgICAgdGhpcy0+aW5mby5ibGl0X2h3X0EgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHdfQSA9IDA7CisgICAgfQorICAgIAorICAgIGlmICgodm1vZGUubW9kZV9jYXBhYmlsaXRpZXMyICYgUGdWTV9NT0RFX0NBUDJfQ0hST01BKSA9PSBQZ1ZNX01PREVfQ0FQMl9DSFJPTUEpCisgICAgeworICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgPSAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworaW50IHBoX1NldHVwVXBkYXRlRnVuY3Rpb24oX1RISVMsIFNETF9TdXJmYWNlKiBzY3JlZW4sIFVpbnQzMiBmbGFncykKK3sKKyAgICBpbnQgc2V0dXByZXN1bHQ9LTE7CisKKyAgICBwaF9EZXN0cm95SW1hZ2UodGhpcywgc2NyZWVuKTsKKyAgICAKKyNpZiBTRExfVklERU9fT1BFTkdMCisgICAgaWYgKChmbGFncyAmIFNETF9PUEVOR0wpPT1TRExfT1BFTkdMKQorICAgIHsKKyAgICAgICAgc2V0dXByZXN1bHQ9cGhfU2V0dXBPcGVuR0xJbWFnZSh0aGlzLCBzY3JlZW4pOworICAgIH0KKyAgICBlbHNlCisgICAgeworI2VuZGlmCisgICAgICAgaWYgKChmbGFncyAmIFNETF9GVUxMU0NSRUVOKT09U0RMX0ZVTExTQ1JFRU4pCisgICAgICAgeworICAgICAgICAgICBzZXR1cHJlc3VsdD1waF9TZXR1cEZ1bGxTY3JlZW5JbWFnZSh0aGlzLCBzY3JlZW4pOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgIGlmICgoZmxhZ3MgJiBTRExfSFdTVVJGQUNFKT09U0RMX0hXU1VSRkFDRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHNldHVwcmVzdWx0PXBoX1NldHVwT0NJbWFnZSh0aGlzLCBzY3JlZW4pOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgICBzZXR1cHJlc3VsdD1waF9TZXR1cEltYWdlKHRoaXMsIHNjcmVlbik7CisgICAgICAgICAgfQorICAgICAgIH0KKyNpZiBTRExfVklERU9fT1BFTkdMCisgICAgfQorI2VuZGlmCisgICAgaWYgKHNldHVwcmVzdWx0IT0tMSkKKyAgICB7CisgICAgICAgcGhfVXBkYXRlSFdJbmZvKHRoaXMpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc2V0dXByZXN1bHQ7Cit9CisKK2ludCBwaF9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpCit7CisgICAgUGdIV0NhcHNfdCBod2NhcHM7CisKKyAgICBpZiAoc3VyZmFjZS0+aHdkYXRhIT1OVUxMKQorICAgIHsKKyAgICAgICBTRExfU2V0RXJyb3IoInBoX0FsbG9jSFdTdXJmYWNlKCk6IGh3ZGF0YSBhbHJlYWR5IGV4aXN0cyFcbiIpOworICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3VyZmFjZS0+aHdkYXRhPVNETF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcml2YXRlX2h3ZGF0YSkpOworICAgIFNETF9tZW1zZXQoc3VyZmFjZS0+aHdkYXRhLCAweDAwLCBzaXplb2Yoc3RydWN0IHByaXZhdGVfaHdkYXRhKSk7CisgICAgc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW5jdHg9UGRDcmVhdGVPZmZzY3JlZW5Db250ZXh0KDAsIHN1cmZhY2UtPncsIHN1cmZhY2UtPmgsIFBnX09TQ19NRU1fUEFHRV9BTElHTik7CisgICAgaWYgKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4ID09IE5VTEwpCisgICAgeworICAgICAgICBTRExfU2V0RXJyb3IoInBoX0FsbG9jSFdTdXJmYWNlKCk6IFBkQ3JlYXRlT2Zmc2NyZWVuQ29udGV4dCgpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdXJmYWNlLT5waXhlbHM9UGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKKyAgICBpZiAoc3VyZmFjZS0+cGl4ZWxzPT1OVUxMKQorICAgIHsKKyAgICAgICAgUGhEQ1JlbGVhc2Uoc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW5jdHgpOworICAgICAgICBTRExfU2V0RXJyb3IoInBoX0FsbG9jSFdTdXJmYWNlKCk6IFBkR2V0T2Zmc2NyZWVuQ29udGV4dFB0cigpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdXJmYWNlLT5waXRjaD1zdXJmYWNlLT5od2RhdGEtPm9mZnNjcmVlbmN0eC0+cGl0Y2g7CisgICAgc3VyZmFjZS0+ZmxhZ3N8PVNETF9IV1NVUkZBQ0U7CisgICAgc3VyZmFjZS0+ZmxhZ3N8PVNETF9QUkVBTExPQzsKKyAgICAKKyNpZiAwIC8qIEZJWE1FICovCisgICAgLyogY3JlYXRlIHNpbXBsZSBvZmZzY3JlZW4gbG9jayAqLworICAgIHN1cmZhY2UtPmh3ZGF0YS0+Y3Jsb2NrcGFyYW0uZmxhZ3M9MDsKKyAgICBpZiAoUGRDcmVhdGVPZmZzY3JlZW5Mb2NrKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4LCAmc3VyZmFjZS0+aHdkYXRhLT5jcmxvY2twYXJhbSkhPUVPSykKKyAgICB7CisgICAgICAgIFBoRENSZWxlYXNlKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9BbGxvY0hXU3VyZmFjZSgpOiBDYW4ndCBjcmVhdGUgb2Zmc2NyZWVuIGxvY2sgIVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZW5kaWYgLyogMCAqLworCisgICAgLyogVXBkYXRlIHZpZGVvIHJhbSBhbW91bnQgKi8KKyAgICBpZiAoUGdHZXRHcmFwaGljc0hXQ2FwcygmaHdjYXBzKSA8IDApCisgICAgeworICAgICAgICBQZERlc3Ryb3lPZmZzY3JlZW5Mb2NrKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKKyAgICAgICAgUGhEQ1JlbGVhc2Uoc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW5jdHgpOworICAgICAgICBTRExfU2V0RXJyb3IoInBoX0FsbG9jSFdTdXJmYWNlKCk6IEdldEdyYXBoaWNzSFdDYXBzKCkgZnVuY3Rpb24gZmFpbGVkICFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHRoaXMtPmluZm8udmlkZW9fbWVtPWh3Y2Fwcy5jdXJyZW50bHlfYXZhaWxhYmxlX3ZpZGVvX3JhbS8xMDI0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcGhfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpCit7CisgICAgUGdIV0NhcHNfdCBod2NhcHM7CisKKyAgICBpZiAoc3VyZmFjZS0+aHdkYXRhPT1OVUxMKQorICAgIHsKKyAgICAgICBTRExfU2V0RXJyb3IoInBoX0ZyZWVIV1N1cmZhY2UoKTogbm8gaHdkYXRhIVxuIik7CisgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc3VyZmFjZS0+aHdkYXRhLT5vZmZzY3JlZW5jdHggPT0gTlVMTCkKKyAgICB7CisgICAgICAgU0RMX1NldEVycm9yKCJwaF9GcmVlSFdTdXJmYWNlKCk6IG5vIG9mZnNjcmVlbiBjb250ZXh0IHRvIGRlbGV0ZSFcbiIpOworICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiAwIC8qIEZJWE1FICovCisgICAgLyogdW5sb2NrIHRoZSBvZmZzY3JlZW4gY29udGV4dCBpZiBpdCBoYXMgYmVlbiBsb2NrZWQgYmVmb3JlIGRlc3Ryb3kgaXQgKi8KKyAgICBpZiAoUGRJc09mZnNjcmVlbkxvY2tlZChzdXJmYWNlLT5od2RhdGEtPm9mZnNjcmVlbmN0eCk9PVBnX09TQ19MT0NLRUQpCisgICAgeworICAgICAgIFBkVW5sb2NrT2Zmc2NyZWVuKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKKyAgICB9CisKKyAgICBQZERlc3Ryb3lPZmZzY3JlZW5Mb2NrKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KTsKKyNlbmRpZiAvKiAwICovCisKKyAgICBQaERDUmVsZWFzZShzdXJmYWNlLT5od2RhdGEtPm9mZnNjcmVlbmN0eCk7CisgICAgCisgICAgU0RMX2ZyZWUoc3VyZmFjZS0+aHdkYXRhKTsKKyAgICBzdXJmYWNlLT5od2RhdGE9TlVMTDsKKworICAgIC8qIFVwZGF0ZSB2aWRlbyByYW0gYW1vdW50ICovCisgICAgaWYgKFBnR2V0R3JhcGhpY3NIV0NhcHMoJmh3Y2FwcykgPCAwKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9GcmVlSFdTdXJmYWNlKCk6IEdldEdyYXBoaWNzSFdDYXBzKCkgZnVuY3Rpb24gZmFpbGVkICFcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHRoaXMtPmluZm8udmlkZW9fbWVtPWh3Y2Fwcy5jdXJyZW50bHlfYXZhaWxhYmxlX3ZpZGVvX3JhbS8xMDI0OworCisgICAgcmV0dXJuOworfQorCitpbnQgcGhfQ2hlY2tIV0JsaXQoX1RISVMsIFNETF9TdXJmYWNlICpzcmMsIFNETF9TdXJmYWNlICpkc3QpCit7CisgICBpZiAoKHNyYy0+aHdkYXRhPT1OVUxMKSAmJiAoc3JjICE9IHRoaXMtPnNjcmVlbikpCisgICB7CisgICAgICBTRExfU2V0RXJyb3IoInBoX0NoZWNrSFdCbGl0KCk6IFNvdXJjZSBzdXJmYWNlIGhhdmVuJ3QgaGFyZHdhcmUgc3BlY2lmaWMgZGF0YS5cbiIpOworICAgICAgc3JjLT5mbGFncyY9flNETF9IV0FDQ0VMOworICAgICAgcmV0dXJuIC0xOworICAgfQorICAgaWYgKChzcmMtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gU0RMX0hXU1VSRkFDRSkKKyAgIHsKKyAgICAgIFNETF9TZXRFcnJvcigicGhfQ2hlY2tIV0JsaXQoKTogU291cmNlIHN1cmZhY2UgaXNuJ3QgYSBoYXJkd2FyZSBzdXJmYWNlLlxuIik7CisgICAgICBzcmMtPmZsYWdzJj1+U0RMX0hXQUNDRUw7CisgICAgICByZXR1cm4gLTE7CisgICB9CisKKyAgIGlmICgoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZKQorICAgeworICAgICAgIGlmICh0aGlzLT5pbmZvLmJsaXRfaHdfQ0MhPTEpCisgICAgICAgeworICAgICAgICAgICBzcmMtPmZsYWdzJj1+U0RMX0hXQUNDRUw7CisgICAgICAgICAgIHNyYy0+bWFwLT5od19ibGl0PU5VTEw7CisgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICB9CisgICB9CisKKyAgIGlmICgoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBKQorICAgeworICAgICAgIGlmICh0aGlzLT5pbmZvLmJsaXRfaHdfQSE9MSkKKyAgICAgICB7CisgICAgICAgICAgIHNyYy0+ZmxhZ3MmPX5TRExfSFdBQ0NFTDsKKyAgICAgICAgICAgc3JjLT5tYXAtPmh3X2JsaXQ9TlVMTDsKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgIH0KKyAgIH0KKworICAgc3JjLT5mbGFnc3w9U0RMX0hXQUNDRUw7CisgICBzcmMtPm1hcC0+aHdfYmxpdCA9IHBoX0hXQWNjZWxCbGl0OworCisgICByZXR1cm4gMTsKK30KKworUGdDb2xvcl90IHBoX0V4cGFuZENvbG9yKF9USElTLCBTRExfU3VyZmFjZSogc3VyZmFjZSwgVWludDMyIGNvbG9yKQoreworICAgIFVpbnQzMiB0cnVlY29sb3I7CisKKyAgICAvKiBQaG90b24gQVBJIGFjY2VwdHMgdHJ1ZSBjb2xvcnMgb25seSBkdXJpbmcgaHcgZmlsbGluZyBvcGVyYXRpb25zICovCisgICAgc3dpdGNoKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsKQorICAgIHsKKyAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUpICYmIChjb2xvcjw9c3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5uY29sb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRydWVjb2xvcj1QZ1JHQihzdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1tjb2xvcl0uciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzW2NvbG9yXS5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbY29sb3JdLmIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX0V4cGFuZENvbG9yKCk6IENvbG9yIG91dCBvZiByYW5nZSBmb3IgdGhlIDhicHAgbW9kZSAhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIDE1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnVlY29sb3IgPSAoKGNvbG9yICYgMHgwMDAwN0MwMFVMKSA8PCA5KSB8ICAgLyogUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDAwMDAwM0UwVUwpIDw8IDYpIHwgICAvKiBHICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb2xvciAmIDB4MDAwMDAwMUZVTCkgPDwgMykgfCAgIC8qIEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHgwMDAwNzAwMFVMKSA8PCA0KSB8ICAgLyogUiBjb21wZW5zYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHgwMDAwMDM4MFVMKSA8PCAxKSB8ICAgLyogRyBjb21wZW5zYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHgwMDAwMDAxQ1VMKSA+PiAyKTsgICAgLyogQiBjb21wZW5zYXRpb24gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgMTY6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRydWVjb2xvciA9ICgoY29sb3IgJiAweDAwMDBGODAwVUwpIDw8IDgpIHwgICAvKiBSICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb2xvciAmIDB4MDAwMDA3RTBVTCkgPDwgNSkgfCAgIC8qIEcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHgwMDAwMDAxRlVMKSA8PCAzKSB8ICAgLyogQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDAwMDBFMDAwVUwpIDw8IDMpIHwgICAvKiBSIGNvbXBlbnNhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDAwMDAwNjAwVUwpID4+IDEpIHwgICAvKiBHIGNvbXBlbnNhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDAwMDAwMDFDVUwpID4+IDIpOyAgICAvKiBCIGNvbXBlbnNhdGlvbiAqLworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIDI0OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnVlY29sb3I9Y29sb3IgJiAweDAwRkZGRkZGVUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIDMyOiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnVlY29sb3I9Y29sb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfRXhwYW5kQ29sb3IoKTogVW5zdXBwb3J0ZWQgZGVwdGggZm9yIHRoZSBoYXJkd2FyZSBvcGVyYXRpb25zICFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAweEZGRkZGRkZGVUw7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWVjb2xvcjsKK30KKworaW50IHBoX0ZpbGxIV1JlY3QoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlLCBTRExfUmVjdCogcmVjdCwgVWludDMyIGNvbG9yKQoreworICAgIFBnQ29sb3JfdCBvbGRjb2xvcjsKKyAgICBVaW50MzIgdHJ1ZWNvbG9yOworICAgIGludCB5ZGlzcD0wOworCisgICAgaWYgKHRoaXMtPmluZm8uYmxpdF9maWxsIT0xKQorICAgIHsKKyAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdHJ1ZWNvbG9yPXBoX0V4cGFuZENvbG9yKHRoaXMsIHN1cmZhY2UsIGNvbG9yKTsKKyAgICBpZiAodHJ1ZWNvbG9yPT0weEZGRkZGRkZGVUwpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgb2xkY29sb3I9UGdTZXRGaWxsQ29sb3IodHJ1ZWNvbG9yKTsKKworICAgIC8qIDY0MHg0MDAgdmlkZW9tb2RlIGVtdWxhdGlvbiAqLworICAgIGlmICh2aWRlb21vZGVfZW11bGF0ZW1vZGU9PTEpCisgICAgeworICAgICAgICB5ZGlzcCs9NDA7CisgICAgfQorCisgICAgUGdEcmF3SVJlY3QocmVjdC0+eCwgcmVjdC0+eSt5ZGlzcCwgcmVjdC0+dytyZWN0LT54LTEsIHJlY3QtPmgrcmVjdC0+eSt5ZGlzcC0xLCBQZ19EUkFXX0ZJTEwpOworICAgIFBnU2V0RmlsbENvbG9yKG9sZGNvbG9yKTsKKyAgICBQZ0ZsdXNoKCk7CisgICAgUGdXYWl0SFdJZGxlKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHBoX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlKiBzY3JlZW4pCit7CisgICAgUGhBcmVhX3QgZmFyZWE7CisKKyAgICBpZiAoKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4pCisgICAgeworICAgICAgICAvKiBmbHVzaCBhbGwgZHJhd2luZyBvcHMgYmVmb3JlIGJsaXR0aW5nICovCisgICAgICAgIFBnRmx1c2goKTsKKyAgICAgICAgUGdXYWl0SFdJZGxlKCk7CisKKyAgICAgICAgZmFyZWEucG9zLng9MDsKKyAgICAgICAgZmFyZWEucG9zLnk9MDsKKyAgICAgICAgZmFyZWEuc2l6ZS53PXNjcmVlbi0+dzsKKyAgICAgICAgZmFyZWEuc2l6ZS5oPXNjcmVlbi0+aDsKKworICAgICAgICAvKiBlbXVsYXRlIDY0MHg0MDAgdmlkZW9tb2RlICovCisgICAgICAgIGlmICh2aWRlb21vZGVfZW11bGF0ZW1vZGU9PTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhcmVhLnBvcy55Kz00MDsKKyAgICAgICAgfQorCisgICAgICAgIFBnQ29udGV4dEJsaXRBcmVhKE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQsICZmYXJlYSwgT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQsICZmYXJlYSk7CisKKyAgICAgICAgLyogZmx1c2ggdGhlIGJsaXR0aW5nICovCisgICAgICAgIFBnRmx1c2goKTsKKyAgICAgICAgUGdXYWl0SFdJZGxlKCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgcGhfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpCit7CisKKyNpZiAwIC8qIEZJWE1FICovCisgICAgaW50IGxvY2tyZXN1bHQ7CisKKyAgICBpZiAoc3VyZmFjZS0+aHdkYXRhID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3VyZmFjZS0+aHdkYXRhLT5sb2NrcGFyYW0uZmxhZ3M9MDsKKyAgICBzdXJmYWNlLT5od2RhdGEtPmxvY2twYXJhbS50aW1lX291dD1OVUxMOworICAgIGxvY2tyZXN1bHQ9UGRMb2NrT2Zmc2NyZWVuKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4LCAmc3VyZmFjZS0+aHdkYXRhLT5sb2NrcGFyYW0pOworCisgICAgc3dpdGNoIChsb2NrcmVzdWx0KQorICAgIHsKKyAgICAgICBjYXNlIEVPSzoKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBQZ19PU0NfTE9DS19ERUFETE9DSzogCisgICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfTG9ja0hXU3VyZmFjZSgpOiBEZWFkbG9jayBkZXRlY3RlZCAhXG4iKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgIGNhc2UgUGdfT1NDX0xPQ0tfSU5WQUxJRDoKKyAgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9Mb2NrSFdTdXJmYWNlKCk6IExvY2sgaW52YWxpZCAhXG4iKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfTG9ja0hXU3VyZmFjZSgpOiBDYW4ndCBsb2NrIHRoZSBzdXJmYWNlICFcbiIpOworICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2VuZGlmIC8qIDAgKi8KKworICAgIHJldHVybiAwOworfQorCit2b2lkIHBoX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpCit7CisKKyNpZiAwIC8qIEZJWE1FICovCisgICAgaW50IHVubG9ja3Jlc3VsdDsKKworICAgIGlmICgoc3VyZmFjZSA9PSBOVUxMKSB8fCAoc3VyZmFjZS0+aHdkYXRhID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChQZElzT2Zmc2NyZWVuTG9ja2VkKHN1cmZhY2UtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4KT09UGdfT1NDX0xPQ0tFRCkKKyAgICB7CisgICAgICAgIHVubG9ja3Jlc3VsdD1QZFVubG9ja09mZnNjcmVlbihzdXJmYWNlLT5od2RhdGEtPm9mZnNjcmVlbmN0eCk7CisgICAgfQorI2VuZGlmIC8qIDAgKi8KKworICAgIHJldHVybjsKK30KKworaW50IHBoX0hXQWNjZWxCbGl0KFNETF9TdXJmYWNlKiBzcmMsIFNETF9SZWN0KiBzcmNyZWN0LCBTRExfU3VyZmFjZSogZHN0LCBTRExfUmVjdCogZHN0cmVjdCkKK3sKKyAgICBTRExfVmlkZW9EZXZpY2UqIHRoaXM9Y3VycmVudF92aWRlbzsKKyAgICBQaEFyZWFfdCBzcmNhcmVhOworICAgIFBoQXJlYV90IGRzdGFyZWE7CisgICAgaW50IHlkaXNwPTA7CisKKyAgICAvKiA2NDB4NDAwIHZpZGVvbW9kZSBlbXVsYXRpb24gKi8KKyAgICBpZiAodmlkZW9tb2RlX2VtdWxhdGVtb2RlPT0xKQorICAgIHsKKyAgICAgICB5ZGlzcCs9NDA7CisgICAgfQorCisgICAgc3JjYXJlYS5wb3MueD1zcmNyZWN0LT54OworICAgIHNyY2FyZWEucG9zLnk9c3JjcmVjdC0+eTsKKyAgICBzcmNhcmVhLnNpemUudz1zcmNyZWN0LT53OworICAgIHNyY2FyZWEuc2l6ZS5oPXNyY3JlY3QtPmg7CisKKyAgICBkc3RhcmVhLnBvcy54PWRzdHJlY3QtPng7CisgICAgZHN0YXJlYS5wb3MueT1kc3RyZWN0LT55OworICAgIGRzdGFyZWEuc2l6ZS53PWRzdHJlY3QtPnc7CisgICAgZHN0YXJlYS5zaXplLmg9ZHN0cmVjdC0+aDsKKworICAgIGlmICgoKHNyYyA9PSB0aGlzLT5zY3JlZW4pIHx8IChzcmMtPmh3ZGF0YSE9TlVMTCkpICYmICgoZHN0ID09IHRoaXMtPnNjcmVlbikgfHwgKGRzdC0+aHdkYXRhIT1OVUxMKSkpCisgICAgeworICAgICAgICBpZiAoKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSkKKyAgICAgICAgeworICAgICAgICAgICAgcGhfU2V0SFdDb2xvcktleSh0aGlzLCBzcmMsIHNyYy0+Zm9ybWF0LT5jb2xvcmtleSk7CisgICAgICAgICAgICBQZ0Nocm9tYU9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSkKKyAgICAgICAgeworICAgICAgICAgICAgcGhfU2V0SFdBbHBoYSh0aGlzLCBzcmMsIHNyYy0+Zm9ybWF0LT5hbHBoYSk7CisgICAgICAgICAgICBQZ0FscGhhT24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkc3QgPT0gdGhpcy0+c2NyZWVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IHRoaXMtPnNjcmVlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBibGl0dGluZyBmcm9tIG1haW4gc2NyZWVuIHRvIG1haW4gc2NyZWVuICovCisgICAgICAgICAgICAgICAgZHN0YXJlYS5wb3MueSs9eWRpc3A7CisgICAgICAgICAgICAgICAgc3JjYXJlYS5wb3MueSs9eWRpc3A7CisgICAgICAgICAgICAgICAgUGdDb250ZXh0QmxpdEFyZWEoT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCwgJnNyY2FyZWEsIE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQsICZkc3RhcmVhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBibGl0dGluZyBmcm9tIG9mZnNjcmVlbiB0byBtYWluIHNjcmVlbiAqLworICAgICAgICAgICAgICAgIGRzdGFyZWEucG9zLnkrPXlkaXNwOworICAgICAgICAgICAgICAgIFBnQ29udGV4dEJsaXRBcmVhKHNyYy0+aHdkYXRhLT5vZmZzY3JlZW5jdHgsICZzcmNhcmVhLCBPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0LCAmZHN0YXJlYSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IHRoaXMtPnNjcmVlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBibGl0dGluZyBmcm9tIG1haW4gc2NyZWVuIHRvIG9mZnNjcmVlbiAqLworICAgICAgICAgICAgICAgIHNyY2FyZWEucG9zLnkrPXlkaXNwOworICAgICAgICAgICAgICAgIFBnQ29udGV4dEJsaXRBcmVhKE9DSW1hZ2Uub2Zmc2NyZWVuX2NvbnRleHQsICZzcmNhcmVhLCBkc3QtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4LCAmZHN0YXJlYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYmxpdHRpbmcgb2Zmc2NyZWVuIHRvIG9mZnNjcmVlbiAqLworICAgICAgICAgICAgICAgIFBnQ29udGV4dEJsaXRBcmVhKHNyYy0+aHdkYXRhLT5vZmZzY3JlZW5jdHgsICZzcmNhcmVhLCBkc3QtPmh3ZGF0YS0+b2Zmc2NyZWVuY3R4LCAmZHN0YXJlYSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpID09IFNETF9TUkNBTFBIQSkKKyAgICAgICAgeworICAgICAgICAgICAgUGdBbHBoYU9mZigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzcmMtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBnQ2hyb21hT2ZmKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9IV0FjY2VsQmxpdCgpOiBTb3VyY2Ugb3IgdGFyZ2V0IHN1cmZhY2UgaXMgbm90IGEgaGFyZHdhcmUgc3VyZmFjZSAhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFBnRmx1c2goKTsKKyAgICBQZ1dhaXRIV0lkbGUoKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgcGhfU2V0SFdDb2xvcktleShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBrZXkpCit7CisgICAgaWYgKHRoaXMtPmluZm8uYmxpdF9od19DQyE9MSkKKyAgICB7CisgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzdXJmYWNlLT5od2RhdGEhPU5VTEwpCisgICAgeworICAgICAgICBzdXJmYWNlLT5od2RhdGEtPmNvbG9ya2V5PXBoX0V4cGFuZENvbG9yKHRoaXMsIHN1cmZhY2UsIGtleSk7CisgICAgICAgIGlmIChzdXJmYWNlLT5od2RhdGEtPmNvbG9ya2V5PT0weEZGRkZGRkZGVUwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQZ1NldENocm9tYShzdXJmYWNlLT5od2RhdGEtPmNvbG9ya2V5LCBQZ19DSFJPTUFfU1JDX01BVENIIHwgUGdfQ0hST01BX05PRFJBVyk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHBoX1NldEhXQWxwaGEoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlLCBVaW50OCBhbHBoYSkKK3sKKyAgICBpZiAodGhpcy0+aW5mby5ibGl0X2h3X0EhPTEpCisgICAgeworICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBQZ1NldEFscGhhQmxlbmQoTlVMTCwgYWxwaGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBTRExfVklERU9fT1BFTkdMCit2b2lkIHBoX09wZW5HTFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCogcmVjdHMpCit7CisgICB0aGlzLT5HTF9Td2FwQnVmZmVycyh0aGlzKTsKKyAgIAorICAgcmV0dXJuOworfQorI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KKwordm9pZCBwaF9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworICAgIFBoUG9pbnRfdCBwaF9wb3M7CisgICAgUGhSZWN0X3QgcGhfcmVjdDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT0wOyBpPG51bXJlY3RzOyArK2kpIAorICAgIHsKKyAgICAJaWYgKHJlY3RzW2ldLnc9PTApIC8qIENsaXBwZWQ/IGR1bm5vIHdoeSBidXQgdGhpcyBvY2N1cnMgc29tZXRpbWUuICovCisgICAgICAgIHsgCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgCWlmIChyZWN0c1tpXS5oPT0wKSAvKiBDbGlwcGVkPyBkdW5ubyB3aHkgYnV0IHRoaXMgb2NjdXJzIHNvbWV0aW1lLiAqLworICAgICAgICB7IAorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBwaF9wb3MueCA9IHJlY3RzW2ldLng7CisgICAgICAgIHBoX3Bvcy55ID0gcmVjdHNbaV0ueTsKKyAgICAgICAgcGhfcmVjdC51bC54ID0gcmVjdHNbaV0ueDsKKyAgICAgICAgcGhfcmVjdC51bC55ID0gcmVjdHNbaV0ueTsKKyAgICAgICAgcGhfcmVjdC5sci54ID0gcmVjdHNbaV0ueCArIHJlY3RzW2ldLnc7CisgICAgICAgIHBoX3JlY3QubHIueSA9IHJlY3RzW2ldLnkgKyByZWN0c1tpXS5oOworCisgICAgICAgIGlmIChQZ0RyYXdQaEltYWdlUmVjdG14KCZwaF9wb3MsIFNETF9JbWFnZSwgJnBoX3JlY3QsIDApIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9Ob3JtYWxVcGRhdGUoKTogUGdEcmF3UGhJbWFnZVJlY3RteCBmYWlsZWQhXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChQZ0ZsdXNoKCkgPCAwKQorICAgIHsKKyAgICAJU0RMX1NldEVycm9yKCJwaF9Ob3JtYWxVcGRhdGUoKTogUGdGbHVzaCgpIGZ1bmN0aW9uIGZhaWxlZCFcbiIpOworICAgIH0KK30KKwordm9pZCBwaF9PQ1VwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisgICAgaW50IGk7CisKKyAgICBQaFBvaW50X3QgemVybyA9IHswLCAwfTsKKyAgICBQaEFyZWFfdCBzcmNfcmVjdDsKKyAgICBQaEFyZWFfdCBkZXN0X3JlY3Q7CisKKyAgICBQZ1NldFRyYW5zbGF0aW9uKCZ6ZXJvLCAwKTsKKyAgICBQZ1NldFJlZ2lvbihQdFdpZGdldFJpZCh3aW5kb3cpKTsKKyAgICBQZ1NldENsaXBwaW5nKDAsIE5VTEwpOworCisgICAgUGdGbHVzaCgpOworICAgIFBnV2FpdEhXSWRsZSgpOworCisgICAgZm9yIChpPTA7IGk8bnVtcmVjdHM7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChyZWN0c1tpXS53ID09IDApICAvKiBDbGlwcGVkPyAqLworICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWN0c1tpXS5oID09IDApICAvKiBDbGlwcGVkPyAqLworICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3JjX3JlY3QucG9zLng9cmVjdHNbaV0ueDsKKyAgICAgICAgc3JjX3JlY3QucG9zLnk9cmVjdHNbaV0ueTsKKyAgICAgICAgZGVzdF9yZWN0LnBvcy54PXJlY3RzW2ldLng7CisgICAgICAgIGRlc3RfcmVjdC5wb3MueT1yZWN0c1tpXS55OworCisgICAgICAgIHNyY19yZWN0LnNpemUudz1yZWN0c1tpXS53OworICAgICAgICBzcmNfcmVjdC5zaXplLmg9cmVjdHNbaV0uaDsKKyAgICAgICAgZGVzdF9yZWN0LnNpemUudz1yZWN0c1tpXS53OworICAgICAgICBkZXN0X3JlY3Quc2l6ZS5oPXJlY3RzW2ldLmg7CisgICAgICAgIAorICAgICAgICBQZ0NvbnRleHRCbGl0QXJlYShPQ0ltYWdlLm9mZnNjcmVlbl9jb250ZXh0LCAmc3JjX3JlY3QsIE5VTEwsICZkZXN0X3JlY3QpOworICAgIH0KKworICAgIGlmIChQZ0ZsdXNoKCkgPCAwKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9PQ1VwZGF0ZSgpOiBQZ0ZsdXNoIGZhaWxlZC5cbiIpOworICAgIH0KK30KKwordm9pZCBwaF9PQ0RDVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKyAgICBQZ1dhaXRIV0lkbGUoKTsKKworICAgIGlmIChQZ0ZsdXNoKCkgPCAwKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9PQ0RDVXBkYXRlKCk6IFBnRmx1c2ggZmFpbGVkLlxuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoX2ltYWdlX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9pbWFnZV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkOTY2OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9pbWFnZV9jLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX19TRExfUEhfSU1BR0VfSF9fCisjZGVmaW5lIF9fU0RMX1BIX0lNQUdFX0hfXworCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9waF92aWRlby5oIgorCitzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEKK3sKKyAgIFBkT2Zmc2NyZWVuQ29udGV4dF90KiBvZmZzY3JlZW5jdHg7CisgICBQZE9TQ0NyZWF0ZUxvY2tQYXJhbXNfdCBjcmxvY2twYXJhbTsKKyAgIFBkT1NDTG9ja1BhcmFtc190IGxvY2twYXJhbTsKKyAgIFVpbnQzMiBjb2xvcmtleTsKK307CisKK2V4dGVybiBpbnQgcGhfU2V0dXBJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UqIHNjcmVlbik7CitleHRlcm4gdm9pZCBwaF9EZXN0cm95SW1hZ2UoX1RISVMsIFNETF9TdXJmYWNlKiBzY3JlZW4pOworZXh0ZXJuIGludCBwaF9TZXR1cFVwZGF0ZUZ1bmN0aW9uKF9USElTLCBTRExfU3VyZmFjZSogc2NyZWVuLCBVaW50MzIgZmxhZ3MpOworCitleHRlcm4gaW50IHBoX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSogc3VyZmFjZSk7CitleHRlcm4gdm9pZCBwaF9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSogc3VyZmFjZSk7CitleHRlcm4gaW50IHBoX0NoZWNrSFdCbGl0KF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KTsKK2V4dGVybiBpbnQgcGhfRmlsbEhXUmVjdChfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UsIFNETF9SZWN0KiByZWN0LCBVaW50MzIgY29sb3IpOworZXh0ZXJuIGludCBwaF9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSogc3VyZmFjZSk7CitleHRlcm4gdm9pZCBwaF9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlKTsKK2V4dGVybiBpbnQgcGhfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIHN1cmZhY2UpOworZXh0ZXJuIGludCBwaF9TZXRIV0NvbG9yS2V5KF9USElTLCBTRExfU3VyZmFjZSogc3VyZmFjZSwgVWludDMyIGtleSk7CitleHRlcm4gaW50IHBoX1NldEhXQWxwaGEoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlLCBVaW50OCBhbHBoYSk7CitleHRlcm4gaW50IHBoX0hXQWNjZWxCbGl0KFNETF9TdXJmYWNlKiBzcmMsIFNETF9SZWN0ICpzcmNyZWN0LCBTRExfU3VyZmFjZSogZHN0LCBTRExfUmVjdCogZHN0cmVjdCk7CitleHRlcm4gaW50IHBoX1VwZGF0ZUhXSW5mbyhfVEhJUyk7CisKK2V4dGVybiB2b2lkIHBoX05vcm1hbFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCogcmVjdHMpOworZXh0ZXJuIHZvaWQgcGhfT0NVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QqIHJlY3RzKTsKK2V4dGVybiB2b2lkIHBoX09DRENVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QqIHJlY3RzKTsKK2V4dGVybiB2b2lkIHBoX09wZW5HTFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCogcmVjdHMpOworCisjZW5kaWYgLyogX19TRExfUEhfSU1BR0VfSF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW9kZXMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9tb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMmJmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW9kZXMuYwpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfcGhfbW9kZXNfYy5oIgorCitzdGF0aWMgUGdWaWRlb01vZGVJbmZvX3QgbW9kZV9pbmZvOworc3RhdGljIFBnVmlkZW9Nb2Rlc190IG1vZGVfbGlzdDsKKworLyogVGhlIGN1cnJlbnQgbGlzdCBvZiBhdmFpbGFibGUgdmlkZW8gbW9kZXMgKi8KK1NETF9SZWN0ICBTRExfbW9kZWxpc3RbUEhfTUFYX1ZJREVPTU9ERVNdOworU0RMX1JlY3QqIFNETF9tb2RlYXJyYXlbUEhfTUFYX1ZJREVPTU9ERVNdOworCitzdGF0aWMgaW50IGNvbXBhcmVfbW9kZXNfYnlfcmVzKGNvbnN0IHZvaWQqIG1vZGUxLCBjb25zdCB2b2lkKiBtb2RlMikKK3sKKyAgICBQZ1ZpZGVvTW9kZUluZm9fdCBtb2RlMV9pbmZvOworICAgIFBnVmlkZW9Nb2RlSW5mb190IG1vZGUyX2luZm87CisKKyAgICBpZiAoUGdHZXRWaWRlb01vZGVJbmZvKCoodW5zaWduZWQgc2hvcnQqKW1vZGUxLCAmbW9kZTFfaW5mbykgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKFBnR2V0VmlkZW9Nb2RlSW5mbygqKHVuc2lnbmVkIHNob3J0Kiltb2RlMiwgJm1vZGUyX2luZm8pIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChtb2RlMV9pbmZvLndpZHRoID09IG1vZGUyX2luZm8ud2lkdGgpCisgICAgeworICAgICAgICByZXR1cm4gbW9kZTJfaW5mby5oZWlnaHQgLSBtb2RlMV9pbmZvLmhlaWdodDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1vZGUyX2luZm8ud2lkdGggLSBtb2RlMV9pbmZvLndpZHRoOworICAgIH0KK30KKworU0RMX1JlY3QgKipwaF9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCit7CisgICAgaW50IGkgPSAwOworICAgIGludCBqID0gMDsKKyAgICBTRExfUmVjdCBBbW9kZWxpc3RbUEhfTUFYX1ZJREVPTU9ERVNdOworCisgICAgZm9yIChpPTA7IGk8UEhfTUFYX1ZJREVPTU9ERVM7IGkrKykKKyAgICB7CisgICAgICAgIFNETF9tb2RlYXJyYXlbaV09JlNETF9tb2RlbGlzdFtpXTsKKyAgICB9CisKKyAgICBpZiAoUGdHZXRWaWRlb01vZGVMaXN0KCZtb2RlX2xpc3QpIDwgMCkKKyAgICB7CisgICAgICAgU0RMX1NldEVycm9yKCJwaF9MaXN0TW9kZXMoKTogUGdHZXRWaWRlb01vZGVMaXN0KCkgZnVuY3Rpb24gZmFpbGVkICFcbiIpOworICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1vZGVfaW5mby5iaXRzX3Blcl9waXhlbCA9IDA7CisKKyAgICBmb3IgKGk9MDsgaSA8IG1vZGVfbGlzdC5udW1fbW9kZXM7IGkrKykgCisgICAgeworICAgICAgICBpZiAoUGdHZXRWaWRlb01vZGVJbmZvKG1vZGVfbGlzdC5tb2Rlc1tpXSwgJm1vZGVfaW5mbykgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX0xpc3RNb2RlcygpOiBQZ0dldFZpZGVvTW9kZUluZm8oKSBmdW5jdGlvbiBmYWlsZWQgb24gbW9kZTogMHglWC5cbiIsIG1vZGVfbGlzdC5tb2Rlc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZihtb2RlX2luZm8uYml0c19wZXJfcGl4ZWwgPT0gZm9ybWF0LT5CaXRzUGVyUGl4ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFtb2RlbGlzdFtqXS53ID0gbW9kZV9pbmZvLndpZHRoOworICAgICAgICAgICAgQW1vZGVsaXN0W2pdLmggPSBtb2RlX2luZm8uaGVpZ2h0OworICAgICAgICAgICAgQW1vZGVsaXN0W2pdLnggPSAwOworICAgICAgICAgICAgQW1vZGVsaXN0W2pdLnkgPSAwOworICAgICAgICAgICAgaisrOwkKKyAgICAgICAgfQorICAgIH0KKwkKKyAgICAvKiByZW9yZGVyIGJpZ2dlc3QgZm9yIHNtYWxsZXN0LCBhc3N1bWUgd2lkdGggZG9taW5hdGVzICovCisKKyAgICBmb3IoaT0wOyBpPGo7IGkrKykKKyAgICB7CisgICAgICAgIFNETF9tb2RlbGlzdFtpXS53ID0gQW1vZGVsaXN0W2ogLSBpIC0gMV0udzsKKyAgICAgICAgU0RMX21vZGVsaXN0W2ldLmggPSBBbW9kZWxpc3RbaiAtIGkgLSAxXS5oOworICAgICAgICBTRExfbW9kZWxpc3RbaV0ueCA9IEFtb2RlbGlzdFtqIC0gaSAtIDFdLng7CisgICAgICAgIFNETF9tb2RlbGlzdFtpXS55ID0gQW1vZGVsaXN0W2ogLSBpIC0gMV0ueTsKKyAgICB9CisgICAgU0RMX21vZGVhcnJheVtqXT1OVUxMOworCQorICAgIHJldHVybiBTRExfbW9kZWFycmF5OworfQorCit2b2lkIHBoX0ZyZWVWaWRlb01vZGVzKF9USElTKQoreworICAgcmV0dXJuOworfQorCisvKiByZXR1cm4gdGhlIG1vZGUgYXNzb2NpYXRlZCB3aXRoIHdpZHRoLCBoZWlnaHQgYW5kIGJwcCAqLworLyogaWYgdGhlcmUgaXMgbm8gbW9kZSB0aGVuIHplcm8gaXMgcmV0dXJuZWQgICAgICAgICAgICAgKi8KK2ludCBwaF9HZXRWaWRlb01vZGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwKQoreworICAgIGludCBpOworICAgIGludCBtb2Rlc3RhZ2U9MDsKKyAgICBpbnQgY2xvc2VzdG1vZGU9MDsKKworICAgIGlmIChQZ0dldFZpZGVvTW9kZUxpc3QoJm1vZGVfbGlzdCkgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgdGhlIGRvdWJsZS1zaXplZCAzMjB4MjAwIG1vZGUgKi8KKyAgICBpZiAoKHdpZHRoPT02NDApICYmIChoZWlnaHQ9PTQwMCkpCisgICAgeworICAgICAgIG1vZGVzdGFnZT0xOworICAgIH0KKworICAgIC8qIHNlYXJjaCBsaXN0IGZvciBleGFjdCBtYXRjaCAqLworICAgIGZvciAoaT0wOyBpPG1vZGVfbGlzdC5udW1fbW9kZXM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChQZ0dldFZpZGVvTW9kZUluZm8obW9kZV9saXN0Lm1vZGVzW2ldLCAmbW9kZV9pbmZvKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtb2RlX2luZm8ud2lkdGggPT0gd2lkdGgpICYmIChtb2RlX2luZm8uaGVpZ2h0ID09IGhlaWdodCkgJiYgCisgICAgICAgICAgICAobW9kZV9pbmZvLmJpdHNfcGVyX3BpeGVsID09IGJwcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtb2RlX2xpc3QubW9kZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgIGlmICgobW9kZXN0YWdlKSAmJiAobW9kZV9pbmZvLndpZHRoID09IHdpZHRoKSAmJiAobW9kZV9pbmZvLmhlaWdodCA9PSBoZWlnaHQrODApICYmIAorICAgICAgICAgICAgICAgKG1vZGVfaW5mby5iaXRzX3Blcl9waXhlbCA9PSBicHApKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1vZGVzdGFnZT0yOworICAgICAgICAgICAgICBjbG9zZXN0bW9kZT1tb2RlX2xpc3QubW9kZXNbaV07CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIHdlIGFyZSBoZXJlLCB0aGVuIG5vIDY0MHg0MDB4YnBwIG1vZGUgZm91bmQgYW5kIHdlJ2xsIGVtdWxhdGUgaXQgdmlhIDY0MHg0ODB4YnBwIG1vZGUgKi8KKyAgICBpZiAobW9kZXN0YWdlPT0yKQorICAgIHsKKyAgICAgICByZXR1cm4gY2xvc2VzdG1vZGU7CisgICAgfQorCisgICAgcmV0dXJuIChpID09IG1vZGVfbGlzdC5udW1fbW9kZXMpID8gMCA6IG1vZGVfbGlzdC5tb2Rlc1tpXTsKK30KKworLyogcmV0dXJuIHRoZSBtb2RlIGFzc29jaWF0ZWQgd2l0aCB3aWR0aCwgaGVpZ2h0IGFuZCBicHAgICAgICAgICAgICAgICAqLworLyogaWYgcmVxdWVzdGVkIGJwcCBpcyBub3QgZm91bmQgdGhlIG1vZGUgd2l0aCBjbG9zZXN0IGJwcCBpcyByZXR1cm5lZCAqLworaW50IGdldF9tb2RlX2FueV9mb3JtYXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwKQoreworICAgIGludCBpLCBjbG9zZXN0LCBkZWx0YSwgbWluX2RlbHRhOworCisgICAgaWYgKFBnR2V0VmlkZW9Nb2RlTGlzdCgmbW9kZV9saXN0KSA8IDApCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgU0RMX3Fzb3J0KG1vZGVfbGlzdC5tb2RlcywgbW9kZV9saXN0Lm51bV9tb2Rlcywgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgY29tcGFyZV9tb2Rlc19ieV9yZXMpOworCisgICAgZm9yKGk9MDtpPG1vZGVfbGlzdC5udW1fbW9kZXM7aSsrKQorICAgIHsKKyAgICAgICAgaWYgKFBnR2V0VmlkZW9Nb2RlSW5mbyhtb2RlX2xpc3QubW9kZXNbaV0sICZtb2RlX2luZm8pIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtb2RlX2luZm8ud2lkdGggPT0gd2lkdGgpICYmIChtb2RlX2luZm8uaGVpZ2h0ID09IGhlaWdodCkpCisgICAgICAgIHsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaTxtb2RlX2xpc3QubnVtX21vZGVzKQorICAgIHsKKyAgICAgICAgLyogZ2V0IGNsb3Nlc3QgYnBwICovCisgICAgICAgIGNsb3Nlc3QgPSBpKys7CisgICAgICAgIGlmIChtb2RlX2luZm8uYml0c19wZXJfcGl4ZWwgPT0gYnBwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbW9kZV9saXN0Lm1vZGVzW2Nsb3Nlc3RdOworICAgICAgICB9CisKKyAgICAgICAgbWluX2RlbHRhID0gYWJzKG1vZGVfaW5mby5iaXRzX3Blcl9waXhlbCAtIGJwcCk7CisKKyAgICAgICAgd2hpbGUoMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFBnR2V0VmlkZW9Nb2RlSW5mbyhtb2RlX2xpc3QubW9kZXNbaV0sICZtb2RlX2luZm8pIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChtb2RlX2luZm8ud2lkdGggIT0gd2lkdGgpIHx8IChtb2RlX2luZm8uaGVpZ2h0ICE9IGhlaWdodCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVfaW5mby5iaXRzX3Blcl9waXhlbCA9PSBicHApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbG9zZXN0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gYWJzKG1vZGVfaW5mby5iaXRzX3Blcl9waXhlbCAtIGJwcCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IG1pbl9kZWx0YSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZGVsdGEgPSBkZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtb2RlX2xpc3QubW9kZXNbY2xvc2VzdF07CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBwaF9Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgb24pCit7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgcGhfRW50ZXJGdWxsU2NyZWVuKF9USElTLCBTRExfU3VyZmFjZSogc2NyZWVuLCBpbnQgZm1vZGUpCit7CisgICAgUGdEaXNwbGF5U2V0dGluZ3NfdCBzZXR0aW5nczsKKyAgICBpbnQgbW9kZTsKKyAgICBjaGFyKiByZWZyZXNocmF0ZTsKKyAgICBpbnQgcmVmcmVzaHJhdGVudW07CisKKyAgICBpZiAoIWN1cnJlbnRseV9mdWxsc2NyZWVuKQorICAgIHsKKyAgICAgICAgLyogR2V0IHRoZSB2aWRlbyBtb2RlIGFuZCBzZXQgaXQgKi8KKyAgICAgICAgaWYgKHNjcmVlbi0+ZmxhZ3MgJiBTRExfQU5ZRk9STUFUKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1vZGUgPSBnZXRfbW9kZV9hbnlfZm9ybWF0KHNjcmVlbi0+dywgc2NyZWVuLT5oLCBzY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsKSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX0VudGVyRnVsbFNjcmVlbigpOiBjYW4ndCBmaW5kIGFwcHJvcHJpYXRlIHZpZGVvIG1vZGUgIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1vZGUgPSBwaF9HZXRWaWRlb01vZGUoc2NyZWVuLT53LCBzY3JlZW4tPmgsIHNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfRW50ZXJGdWxsU2NyZWVuKCk6IGNhbid0IGZpbmQgYXBwcm9wcmlhdGUgdmlkZW8gbW9kZSAhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQZ0dldFZpZGVvTW9kZUluZm8obW9kZSwgJm1vZGVfaW5mbykgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfRW50ZXJGdWxsU2NyZWVuKCk6IGNhbid0IGdldCB2aWRlbyBtb2RlIGNhcGFiaWxpdGllcyAhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb2RlX2luZm8uaGVpZ2h0ICE9IHNjcmVlbi0+aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmICgobW9kZV9pbmZvLmhlaWdodD09NDgwKSAmJiAoc2NyZWVuLT5oPT00MDApKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgdmlkZW9tb2RlX2VtdWxhdGVtb2RlPTE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB2aWRlb21vZGVfZW11bGF0ZW1vZGU9MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHNhdmUgb2xkIHZpZGVvIG1vZGUgY2FwcyAqLworICAgICAgICBQZ0dldFZpZGVvTW9kZSgmc2V0dGluZ3MpOworICAgICAgICBvbGRfdmlkZW9fbW9kZT1zZXR0aW5ncy5tb2RlOworICAgICAgICBvbGRfcmVmcmVzaF9yYXRlPXNldHRpbmdzLnJlZnJlc2g7CisKKyAgICAgICAgLyogc2V0dXAgbmV3IHZpZGVvIG1vZGUgKi8KKyAgICAgICAgc2V0dGluZ3MubW9kZSA9IG1vZGU7CisgICAgICAgIHNldHRpbmdzLnJlZnJlc2ggPSAwOworICAgICAgICBzZXR0aW5ncy5mbGFncyA9IDA7CisKKyAgICAgICAgcmVmcmVzaHJhdGU9U0RMX2dldGVudigiU0RMX1BIT1RPTl9GVUxMU0NSRUVOX1JFRlJFU0giKTsKKyAgICAgICAgaWYgKHJlZnJlc2hyYXRlIT1OVUxMKQorICAgICAgICB7CisgICAgICAgICAgIGlmIChTRExfc3NjYW5mKHJlZnJlc2hyYXRlLCAiJWQiLCAmcmVmcmVzaHJhdGVudW0pPT0xKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzZXR0aW5ncy5yZWZyZXNoID0gcmVmcmVzaHJhdGVudW07CisgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChQZ1NldFZpZGVvTW9kZSgmc2V0dGluZ3MpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9FbnRlckZ1bGxTY3JlZW4oKTogUGdTZXRWaWRlb01vZGUoKSBjYWxsIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPnNjcmVlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX09QRU5HTCk9PVNETF9PUEVOR0wpCisgICAgICAgICAgICB7CisjaWYgIVNETF9WSURFT19PUEVOR0wgfHwgKF9OVE9fVkVSU0lPTiA8IDYzMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogNi4zLjAgKi8KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZtb2RlPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoT0NJbWFnZS5kaXJlY3RfY29udGV4dD09TlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPQ0ltYWdlLmRpcmVjdF9jb250ZXh0PShQZERpcmVjdENvbnRleHRfdCopUGRDcmVhdGVEaXJlY3RDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFPQ0ltYWdlLmRpcmVjdF9jb250ZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yKCJwaF9FbnRlckZ1bGxTY3JlZW4oKTogQ2FuJ3QgY3JlYXRlIGRpcmVjdCBjb250ZXh0ICFcbiIpOworICAgICAgICAgICAgICAgICAgICBwaF9MZWF2ZUZ1bGxTY3JlZW4odGhpcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9DSW1hZ2Uub2xkREM9UGREaXJlY3RTdGFydChPQ0ltYWdlLmRpcmVjdF9jb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRseV9mdWxsc2NyZWVuID0gMTsKKyAgICB9CisgICAgUGdGbHVzaCgpOworCisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBwaF9MZWF2ZUZ1bGxTY3JlZW4oX1RISVMpCit7CisgICAgUGdEaXNwbGF5U2V0dGluZ3NfdCBvbGRtb2RlX3NldHRpbmdzOworICAgICAgIAorICAgIGlmIChjdXJyZW50bHlfZnVsbHNjcmVlbikKKyAgICB7CisgICAgICAgIGlmICgodGhpcy0+c2NyZWVuKSAmJiAoKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfT1BFTkdMKT09U0RMX09QRU5HTCkpCisgICAgICAgIHsKKyNpZiAhU0RMX1ZJREVPX09QRU5HTCB8fCAoX05UT19WRVJTSU9OIDwgNjMwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlbGVhc2Ugcm91dGluZXMgc3RhcnRzIGhlcmUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE9DSW1hZ2UuZGlyZWN0X2NvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGREaXJlY3RTdG9wKE9DSW1hZ2UuZGlyZWN0X2NvbnRleHQpOworICAgICAgICAgICAgICAgIFBkUmVsZWFzZURpcmVjdENvbnRleHQoT0NJbWFnZS5kaXJlY3RfY29udGV4dCk7CisgICAgICAgICAgICAgICAgT0NJbWFnZS5kaXJlY3RfY29udGV4dD1OVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE9DSW1hZ2Uub2xkREMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGhEQ1NldEN1cnJlbnQoT0NJbWFnZS5vbGREQyk7CisgICAgICAgICAgICAgICAgT0NJbWFnZS5vbGREQz1OVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyZW50bHlfZnVsbHNjcmVlbj0wOworCisgICAgICAgICAgICAvKiBSZXN0b3JlIG9sZCB2aWRlbyBtb2RlICovCisgICAgICAgICAgICBpZiAob2xkX3ZpZGVvX21vZGUgIT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2xkbW9kZV9zZXR0aW5ncy5tb2RlID0gKHVuc2lnbmVkIHNob3J0KSBvbGRfdmlkZW9fbW9kZTsKKyAgICAgICAgICAgICAgICBvbGRtb2RlX3NldHRpbmdzLnJlZnJlc2ggPSAodW5zaWduZWQgc2hvcnQpIG9sZF9yZWZyZXNoX3JhdGU7CisgICAgICAgICAgICAgICAgb2xkbW9kZV9zZXR0aW5ncy5mbGFncyA9IDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKFBnU2V0VmlkZW9Nb2RlKCZvbGRtb2RlX3NldHRpbmdzKSA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIlBoX0xlYXZlRnVsbFNjcmVlbigpOiBQZ1NldFZpZGVvTW9kZSgpIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvbGRfdmlkZW9fbW9kZT0tMTsKKyAgICAgICAgICAgIG9sZF9yZWZyZXNoX3JhdGU9LTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW9kZXNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoX21vZGVzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTdjNWEzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoX21vZGVzX2MuaApAQCAtMCwwICsxLDQzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfX1NETF9QSF9NT0RFU19IX18KKyNkZWZpbmUgX19TRExfUEhfTU9ERVNfSF9fCisKKyNpbmNsdWRlICJTRExfcGhfdmlkZW8uaCIKKworI2RlZmluZSBQSF9NQVhfVklERU9NT0RFUyAxMjcKKworI2RlZmluZSBQSF9FTlRFUl9ESVJFQ1RNT0RFICAwCisjZGVmaW5lIFBIX0lHTk9SRV9ESVJFQ1RNT0RFIDEKKworZXh0ZXJuIFNETF9SZWN0ICoqcGhfTGlzdE1vZGVzKF9USElTLFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworZXh0ZXJuIHZvaWQgcGhfRnJlZVZpZGVvTW9kZXMoX1RISVMpOworZXh0ZXJuIGludCBwaF9SZXNpemVGdWxsU2NyZWVuKF9USElTKTsKK2V4dGVybiBpbnQgcGhfRW50ZXJGdWxsU2NyZWVuKF9USElTLCBTRExfU3VyZmFjZSogc2NyZWVuLCBpbnQgZm1vZGUpOworZXh0ZXJuIGludCBwaF9MZWF2ZUZ1bGxTY3JlZW4oX1RISVMpOworZXh0ZXJuIGludCBwaF9HZXRWaWRlb01vZGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwKTsKK2V4dGVybiBpbnQgZ2V0X21vZGVfYW55X2Zvcm1hdChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApOworZXh0ZXJuIGludCBwaF9Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgb24pOworCisjZW5kaWYgLyogX19TRExfUEhfTU9ERVNfSF9fICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF9tb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNWFhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW91c2UuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vU0RMX2N1cnNvcl9jLmgiCisjaW5jbHVkZSAiU0RMX3BoX21vdXNlX2MuaCIKKworc3RydWN0IFdNY3Vyc29yCit7CisgICAgUGhDdXJzb3JEZWZfdCAqcGhfY3Vyc29yIDsKK307CisKK3ZvaWQgcGhfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQoreworICAgIGlmICh3aW5kb3cgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7CisKKyAgICAgICAgaWYgKFB0U2V0UmVzb3VyY2Uod2luZG93LCBQdF9BUkdfQ1VSU09SX1RZUEUsIFBoX0NVUlNPUl9JTkhFUklULCAwKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRPRE86IG91dHB1dCBlcnJvciBtc2cgKi8KKyAgICAgICAgfQorCisgICAgICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKKyAgICB9CQorCisgICAgU0RMX2ZyZWUoY3Vyc29yKTsKK30KKworV01jdXJzb3IgKnBoX0NyZWF0ZVdNQ3Vyc29yKF9USElTLCBVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpCit7CisgICAgV01jdXJzb3IqIGN1cnNvcjsKKyAgICBpbnQgY2xlbiwgaTsKKyAgICB1bnNpZ25lZCBjaGFyIGJpdCwgZGF0YWJpdCwgbWFza2JpdDsKKworICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBjdXJzb3IgbWVtb3J5ICovCisgICAgaWYgKChjdXJzb3IgPSAoV01jdXJzb3IqKVNETF9tYWxsb2Moc2l6ZW9mKFdNY3Vyc29yKSkpID09IE5VTEwpCisgICAgeworICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBTRExfbWVtc2V0KGN1cnNvciwwLHNpemVvZihXTWN1cnNvcikpOworCisgICAgY3Vyc29yLT5waF9jdXJzb3IgPSAoUGhDdXJzb3JEZWZfdCAqKSBTRExfbWFsbG9jKHNpemVvZihQaEN1cnNvckRlZl90KSArIDMyKjQqMik7CisKKyAgICBpZiAoY3Vyc29yLT5waF9jdXJzb3IgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigicGhfQ3JlYXRlV01DdXJzb3IoKTogY3Vyc29yIG1hbGxvYyBmYWlsZWQgIVxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFNETF9tZW1zZXQoY3Vyc29yLT5waF9jdXJzb3IsMCwoc2l6ZW9mKFBoQ3Vyc29yRGVmX3QpICsgMzIqNCoyKSk7CisKKyAgICBjdXJzb3ItPnBoX2N1cnNvci0+aGRyLnR5cGUgPVBoX1JEQVRBX0NVUlNPUjsgICAKKyAgICBjdXJzb3ItPnBoX2N1cnNvci0+c2l6ZTEueCA9IChzaG9ydCl3OworICAgIGN1cnNvci0+cGhfY3Vyc29yLT5zaXplMS55ID0gKHNob3J0KWg7CisgICAgY3Vyc29yLT5waF9jdXJzb3ItPm9mZnNldDEueCA9IChzaG9ydClob3RfeDsKKyAgICBjdXJzb3ItPnBoX2N1cnNvci0+b2Zmc2V0MS55ID0gKHNob3J0KWhvdF95OworICAgIGN1cnNvci0+cGhfY3Vyc29yLT5ieXRlc3BlcmxpbmUxID0gKGNoYXIpdy84OworICAgIGN1cnNvci0+cGhfY3Vyc29yLT5jb2xvcjEgPSBQZ19XSElURTsKKyAgICBjdXJzb3ItPnBoX2N1cnNvci0+c2l6ZTIueCA9IChzaG9ydCl3OworICAgIGN1cnNvci0+cGhfY3Vyc29yLT5zaXplMi55ID0gKHNob3J0KWg7CisgICAgY3Vyc29yLT5waF9jdXJzb3ItPm9mZnNldDIueCA9IChzaG9ydClob3RfeDsKKyAgICBjdXJzb3ItPnBoX2N1cnNvci0+b2Zmc2V0Mi55ID0gKHNob3J0KWhvdF95OworICAgIGN1cnNvci0+cGhfY3Vyc29yLT5ieXRlc3BlcmxpbmUyID0gKGNoYXIpdy84OworICAgIGN1cnNvci0+cGhfY3Vyc29yLT5jb2xvcjIgPSBQZ19CTEFDSzsKKworICAgIGNsZW4gPSAody84KSpoOworCisgICAgLyogQ29weSB0aGUgbWFzayBhbmQgdGhlIGRhdGEgdG8gZGlmZmVyZW50IGJpdG1hcCBwbGFuZXMgKi8KKyAgICBmb3IgKGk9MDsgaTxjbGVuOyArK2kpCisgICAgeworICAgICAgICBmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhYml0ID0gZGF0YVtpXSAmICgxIDw8IGJpdCk7CisgICAgICAgICAgICBtYXNrYml0ID0gbWFza1tpXSAmICgxIDw8IGJpdCk7CisKKyAgICAgICAgICAgIGN1cnNvci0+cGhfY3Vyc29yLT5pbWFnZXNbaV0gfD0gKGRhdGFiaXQgPT0gMCkgPyBtYXNrYml0IDogMDsKKyAgICAgICAgICAgIC8qIElmIHRoZSBkYXRhYml0ICE9IDAsIHRyZWF0IGl0IGFzIGEgYmxhY2sgcGl4ZWwgYW5kCisgICAgICAgICAgICAgKiBpZ25vcmUgdGhlIG1hc2tiaXQgKGNhbid0IGRvIGFuIGludmVydGVkIGNvbG9yKSAqLworICAgICAgICAgICAgY3Vyc29yLT5waF9jdXJzb3ItPmltYWdlc1tpK2NsZW5dIHw9IGRhdGFiaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAjYnl0ZXMgZm9sbG93aW5nIHRoZSBoZHIgc3RydWN0ICovCisgICAgY3Vyc29yLT5waF9jdXJzb3ItPmhkci5sZW4gPXNpemVvZihQaEN1cnNvckRlZl90KSArIGNsZW4qMiAtIHNpemVvZihQaFJlZ2lvbkRhdGFIZHJfdCk7IAorCisgICAgcmV0dXJuIChjdXJzb3IpOworfQorCitQaEN1cnNvckRlZl90IHBoX0dldFdNUGhDdXJzb3IoV01jdXJzb3IgKmN1cnNvcikKK3sKKyAgICByZXR1cm4gKCpjdXJzb3ItPnBoX2N1cnNvcik7Cit9CisKK2ludCBwaF9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yKiBjdXJzb3IpCit7CisgICAgUHRBcmdfdCBhcmdzWzNdOworICAgIGludCBuYXJncyA9IDA7CisKKyAgICAvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgZGlzcGxheSBpcyBnb25lICovCisgICAgaWYgKHdpbmRvdyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICAvKiBsb29rcyBsaWtlIHBob3RvbiBjYW4ndCBkcmF3IG1vdXNlIGN1cnNvciBpbiBkaXJlY3QgbW9kZSAqLworICAgIGlmICgodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTikKKyAgICB7CisgICAgICAgICAvKiBkaXNhYmxlIHRoZSBmYWtlIG1vdXNlIGluIHRoZSBmdWxsc2NyZWVuIE9wZW5HTCBtb2RlICovCisgICAgICAgICBpZiAoKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfT1BFTkdMKSA9PSBTRExfT1BFTkdMKQorICAgICAgICAgeworICAgICAgICAgICAgIGN1cnNvcj1OVUxMOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHRoZSBwaG90b24gY3Vyc29yLCBvciBibGFuayBpZiBjdXJzb3IgaXMgTlVMTCAqLworICAgIGlmIChjdXJzb3IhPU5VTEwpCisgICAgeworICAgICAgICBQdFNldEFyZygmYXJnc1swXSwgUHRfQVJHX0NVUlNPUl9UWVBFLCBQaF9DVVJTT1JfQklUTUFQLCAwKTsKKyAgICAgICAgLyogQ291bGQgc2V0IG5leHQgdG8gYW55IFBnQ29sb3JfdCB2YWx1ZSAqLworICAgICAgICBQdFNldEFyZygmYXJnc1sxXSwgUHRfQVJHX0NVUlNPUl9DT0xPUiwgUGhfQ1VSU09SX0RFRkFVTFRfQ09MT1IgLCAwKTsKKyAgICAgICAgUHRTZXRBcmcoJmFyZ3NbMl0sIFB0X0FSR19CSVRNQVBfQ1VSU09SLCBjdXJzb3ItPnBoX2N1cnNvciwgKGN1cnNvci0+cGhfY3Vyc29yLT5oZHIubGVuICsgc2l6ZW9mKFBoUmVnaW9uRGF0YUhkcl90KSkpOworICAgICAgICBuYXJncyA9IDM7CisgICAgfQorICAgIGVsc2UgLyogUGhfQ1VSU09SX05PTkUgKi8KKyAgICB7CisgICAgICAgIFB0U2V0QXJnKCZhcmdzWzBdLCBQdF9BUkdfQ1VSU09SX1RZUEUsIFBoX0NVUlNPUl9OT05FLCAwKTsKKyAgICAgICAgbmFyZ3MgPSAxOworICAgIH0KKworICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7CisKKyAgICBpZiAoUHRTZXRSZXNvdXJjZXMod2luZG93LCBuYXJncywgYXJncykgPCAwICkKKyAgICB7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQkKKworICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKKworICAgIHJldHVybiAoMSk7Cit9CisKKwordm9pZCBwaF9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSkKK3sKKyAgICBzaG9ydCBhYnNfeCwgYWJzX3k7CisKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOworICAgIFB0R2V0QWJzUG9zaXRpb24oIHdpbmRvdywgJmFic194LCAmYWJzX3kgKTsKKyAgICBQaE1vdmVDdXJzb3JBYnMoIFBoSW5wdXRHcm91cChOVUxMKSwgeCArIGFic194LCB5ICsgYWJzX3kgKTsKKyAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Cit9CisKKwordm9pZCBwaF9DaGVja01vdXNlTW9kZShfVEhJUykKK3sKKyAgICAvKiBJZiB0aGUgbW91c2UgaXMgaGlkZGVuIGFuZCBpbnB1dCBpcyBncmFiYmVkLCB3ZSB1c2UgcmVsYXRpdmUgbW9kZSAqLworICAgIGlmICggIShTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSkgJiYgKHRoaXMtPmlucHV0X2dyYWIgIT0gU0RMX0dSQUJfT0ZGKSkKKyAgICB7CisgICAgICAgIG1vdXNlX3JlbGF0aXZlID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbW91c2VfcmVsYXRpdmUgPSAwOworICAgIH0KK30KKworCit2b2lkIHBoX1VwZGF0ZU1vdXNlKF9USElTKQoreworICAgIFBoQ3Vyc29ySW5mb190IHBoY3Vyc29yOworICAgIHNob3J0IGFic194OworICAgIHNob3J0IGFic195OworCisgICAgLyogTG9jayB0aGUgZXZlbnQgdGhyZWFkLCBpbiBtdWx0aS10aHJlYWRpbmcgZW52aXJvbm1lbnRzICovCisgICAgU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKKworICAgIC8qIHN5bmNocm9uaXppbmcgcGhvdG9uIG1vdXNlIGN1cnNvciBwb3NpdGlvbiBhbmQgU0RMIG1vdXNlIHBvc2l0aW9uLCBpZiBjdXJzb3IgYXBwZWFycyBvdmVyIHdpbmRvdy4gKi8KKyAgICBQdEdldEFic1Bvc2l0aW9uKHdpbmRvdywgJmFic194LCAmYWJzX3kpOworICAgIFBoUXVlcnlDdXJzb3IoUGhJbnB1dEdyb3VwKE5VTEwpLCAmcGhjdXJzb3IpOworICAgIGlmICgoKHBoY3Vyc29yLnBvcy54ID49IGFic194KSAmJiAocGhjdXJzb3IucG9zLnggPD0gYWJzX3ggKyB0aGlzLT5zY3JlZW4tPncpKSAmJgorICAgICAgICAoKHBoY3Vyc29yLnBvcy55ID49IGFic195KSAmJiAocGhjdXJzb3IucG9zLnkgPD0gYWJzX3kgKyB0aGlzLT5zY3JlZW4tPmgpKSkKKyAgICB7CisgICAgICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBNT1VTRUZPQ1VTKTsKKyAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCBwaGN1cnNvci5wb3MueC1hYnNfeCwgcGhjdXJzb3IucG9zLnktYWJzX3kpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQTU9VU0VGT0NVUyk7CisgICAgfQorCisgICAgLyogVW5sb2NrIHRoZSBldmVudCB0aHJlYWQsIGluIG11bHRpLXRocmVhZGluZyBlbnZpcm9ubWVudHMgKi8KKyAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoX21vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWE5MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoX21vdXNlX2MuaApAQCAtMCwwICsxLDM5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfX1NETF9QSF9NT1VTRV9IX18KKyNkZWZpbmUgX19TRExfUEhfTU9VU0VfSF9fCisKKyNpbmNsdWRlICJTRExfcGhfdmlkZW8uaCIKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCitleHRlcm4gdm9pZCBwaF9GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworZXh0ZXJuIFdNY3Vyc29yICpwaF9DcmVhdGVXTUN1cnNvcihfVEhJUywKKwkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKK2V4dGVybiBQaEN1cnNvckRlZl90IHBoX0dldFdNUGhDdXJzb3IoV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gaW50IHBoX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gdm9pZCBwaF9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7CitleHRlcm4gdm9pZCBwaF9DaGVja01vdXNlTW9kZShfVEhJUyk7CitleHRlcm4gdm9pZCBwaF9VcGRhdGVNb3VzZShfVEhJUyk7CisKKyNlbmRpZiAvKiBfX1NETF9QSF9NT1VTRV9IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF92aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoX3ZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxYTgyYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF92aWRlby5jCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3BoX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3BoX21vZGVzX2MuaCIKKyNpbmNsdWRlICJTRExfcGhfaW1hZ2VfYy5oIgorI2luY2x1ZGUgIlNETF9waF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9waF9tb3VzZV9jLmgiCisjaW5jbHVkZSAiU0RMX3BoX3dtX2MuaCIKKyNpbmNsdWRlICJTRExfcGhfZ2wuaCIKKyNpbmNsdWRlICJTRExfcGh5dXZfYy5oIgorI2luY2x1ZGUgIi4uL2JsYW5rX2N1cnNvci5oIgorCitzdGF0aWMgaW50ICBwaF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1N1cmZhY2UgKnBoX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgIHBoX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBwaF9WaWRlb1F1aXQoX1RISVMpOworc3RhdGljIHZvaWQgcGhfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKTsKKworc3RhdGljIGludCBwaHN0YXR1cz0tMTsKKworc3RhdGljIGludCBwaF9BdmFpbGFibGUodm9pZCkKK3sKKyAgICBpZiAocGhzdGF0dXMhPTApCisgICAgeworICAgICAgICBwaHN0YXR1cz1QdEluaXQoTlVMTCk7CisgICAgICAgIGlmIChwaHN0YXR1cz09MCkKKyAgICAgICAgeworICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UqIHBoX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisgICAgU0RMX1ZpZGVvRGV2aWNlKiBkZXZpY2U7CisKKyAgICAvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworICAgIGRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKyAgICBpZiAoZGV2aWNlKQorICAgIHsKKyAgICAgICAgU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOworICAgICAgICBkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEqKVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKyAgICAgICAgZGV2aWNlLT5nbF9kYXRhID0gTlVMTDsKKyAgICB9CisgICAgaWYgKChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICAgIHBoX0RlbGV0ZURldmljZShkZXZpY2UpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKworICAgIC8qIFNldCB0aGUgZHJpdmVyIGZsYWdzICovCisgICAgZGV2aWNlLT5oYW5kbGVzX2FueV9zaXplID0gMTsKKworICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBkZXZpY2UtPkNyZWF0ZVlVVk92ZXJsYXkgPSBwaF9DcmVhdGVZVVZPdmVybGF5OworICAgIGRldmljZS0+VmlkZW9Jbml0ID0gcGhfVmlkZW9Jbml0OworICAgIGRldmljZS0+TGlzdE1vZGVzID0gcGhfTGlzdE1vZGVzOworICAgIGRldmljZS0+U2V0VmlkZW9Nb2RlID0gcGhfU2V0VmlkZW9Nb2RlOworICAgIGRldmljZS0+VG9nZ2xlRnVsbFNjcmVlbiA9IHBoX1RvZ2dsZUZ1bGxTY3JlZW47CisgICAgZGV2aWNlLT5VcGRhdGVNb3VzZSA9IHBoX1VwZGF0ZU1vdXNlOworICAgIGRldmljZS0+U2V0Q29sb3JzID0gcGhfU2V0Q29sb3JzOworICAgIGRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB1cCBpbiBwaF9TZXR1cFVwZGF0ZUZ1bmN0aW9uICovCisgICAgZGV2aWNlLT5WaWRlb1F1aXQgPSBwaF9WaWRlb1F1aXQ7CisgICAgZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IHBoX0FsbG9jSFdTdXJmYWNlOworICAgIGRldmljZS0+Q2hlY2tIV0JsaXQgPSBwaF9DaGVja0hXQmxpdDsKKyAgICBkZXZpY2UtPkZpbGxIV1JlY3QgPSBwaF9GaWxsSFdSZWN0OworICAgIGRldmljZS0+U2V0SFdDb2xvcktleSA9IHBoX1NldEhXQ29sb3JLZXk7CisgICAgZGV2aWNlLT5TZXRIV0FscGhhID0gcGhfU2V0SFdBbHBoYTsKKyAgICBkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBwaF9Mb2NrSFdTdXJmYWNlOworICAgIGRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gcGhfVW5sb2NrSFdTdXJmYWNlOworICAgIGRldmljZS0+RmxpcEhXU3VyZmFjZSA9IHBoX0ZsaXBIV1N1cmZhY2U7CisgICAgZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gcGhfRnJlZUhXU3VyZmFjZTsKKyAgICBkZXZpY2UtPlNldENhcHRpb24gPSBwaF9TZXRDYXB0aW9uOworICAgIGRldmljZS0+U2V0SWNvbiA9IE5VTEw7CisgICAgZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gcGhfSWNvbmlmeVdpbmRvdzsKKyAgICBkZXZpY2UtPkdyYWJJbnB1dCA9IHBoX0dyYWJJbnB1dDsKKyAgICBkZXZpY2UtPkdldFdNSW5mbyA9IHBoX0dldFdNSW5mbzsKKyAgICBkZXZpY2UtPkZyZWVXTUN1cnNvciA9IHBoX0ZyZWVXTUN1cnNvcjsKKyAgICBkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gcGhfQ3JlYXRlV01DdXJzb3I7CisgICAgZGV2aWNlLT5TaG93V01DdXJzb3IgPSBwaF9TaG93V01DdXJzb3I7CisgICAgZGV2aWNlLT5XYXJwV01DdXJzb3IgPSBwaF9XYXJwV01DdXJzb3I7CisgICAgZGV2aWNlLT5Nb3ZlV01DdXJzb3IgPSBOVUxMOworICAgIGRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBwaF9DaGVja01vdXNlTW9kZTsKKyAgICBkZXZpY2UtPkluaXRPU0tleW1hcCA9IHBoX0luaXRPU0tleW1hcDsKKyAgICBkZXZpY2UtPlB1bXBFdmVudHMgPSBwaF9QdW1wRXZlbnRzOworCisgICAgLyogT3BlbkdMIHN1cHBvcnQuICovCisjaWYgU0RMX1ZJREVPX09QRU5HTAorICAgIGRldmljZS0+R0xfTWFrZUN1cnJlbnQgPSBwaF9HTF9NYWtlQ3VycmVudDsKKyAgICBkZXZpY2UtPkdMX1N3YXBCdWZmZXJzID0gcGhfR0xfU3dhcEJ1ZmZlcnM7CisgICAgZGV2aWNlLT5HTF9HZXRBdHRyaWJ1dGUgPSBwaF9HTF9HZXRBdHRyaWJ1dGU7CisgICAgZGV2aWNlLT5HTF9Mb2FkTGlicmFyeSA9IHBoX0dMX0xvYWRMaWJyYXJ5OworICAgIGRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBwaF9HTF9HZXRQcm9jQWRkcmVzczsKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCisKKyAgICBkZXZpY2UtPmZyZWUgPSBwaF9EZWxldGVEZXZpY2U7CisgICAgCisgICAgcmV0dXJuIGRldmljZTsKK30KKworVmlkZW9Cb290U3RyYXAgcGhfYm9vdHN0cmFwID0geworICAgICJwaG90b24iLCAiUU5YIFBob3RvbiB2aWRlbyBvdXRwdXQiLAorICAgIHBoX0F2YWlsYWJsZSwgcGhfQ3JlYXRlRGV2aWNlCit9OworCitzdGF0aWMgdm9pZCBwaF9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCit7CisgICAgaWYgKGRldmljZSkKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2UtPmhpZGRlbikKKyAgICAgICAgeworICAgICAgICAgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworICAgICAgICAgICAgZGV2aWNlLT5oaWRkZW4gPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UtPmdsX2RhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9mcmVlKGRldmljZS0+Z2xfZGF0YSk7CisgICAgICAgICAgICBkZXZpY2UtPmdsX2RhdGEgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIFNETF9mcmVlKGRldmljZSk7CisgICAgICAgIGRldmljZSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgUHRXaWRnZXRfdCAqcGhfQ3JlYXRlV2luZG93KF9USElTKQoreworICAgIFB0V2lkZ2V0X3QgKndpZGdldDsKKyAgICAKKyAgICB3aWRnZXQgPSBQdENyZWF0ZVdpZGdldChQdFdpbmRvdywgTlVMTCwgMCwgTlVMTCk7CisKKyAgICByZXR1cm4gd2lkZ2V0OworfQorCitzdGF0aWMgaW50IHBoX1NldHVwV2luZG93KF9USElTLCBpbnQgdywgaW50IGgsIGludCBmbGFncykKK3sKKyAgICBQdEFyZ190ICAgICBhcmdzWzMyXTsKKyAgICBQaFBvaW50X3QgICBwb3MgPSB7MCwgMH07CisgICAgUGhEaW1fdCogICAgb2xkZGltOworICAgIFBoRGltX3QgICAgIGRpbSA9IHt3LCBofTsKKyAgICBQaFJlY3RfdCAgICBkZXNrdG9wZXh0ZW50OworICAgIGludCAgICAgICAgIG5hcmdzID0gMDsKKyAgICBjb25zdCBjaGFyKiB3aW5kb3dwb3M7CisgICAgY29uc3QgY2hhciogaXNjZW50ZXJlZDsKKyAgICBpbnQgICAgICAgICB4LCB5OworCisgICAgLyogY2hlY2sgaWYgd2luZG93IHNpemUgaGFzIGJlZW4gY2hhbmdlZCBieSBXaW5kb3cgTWFuYWdlciAqLworICAgIFB0R2V0UmVzb3VyY2Uod2luZG93LCBQdF9BUkdfRElNLCAmb2xkZGltLCAwKTsKKyAgICBpZiAoKG9sZGRpbS0+dyE9dykgfHwgKG9sZGRpbS0+aCE9aCkpCisgICAgeworICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfRElNLCAmZGltLCAwKTsKKyAgICB9CisKKyAgICBpZiAoKGZsYWdzICYgU0RMX1JFU0laQUJMRSkgPT0gU0RMX1JFU0laQUJMRSkKKyAgICB7CisgICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfV0lORE9XX01BTkFHRURfRkxBR1MsIFB0X0ZBTFNFLCBQaF9XTV9DTE9TRSk7CisgICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfV0lORE9XX01BTkFHRURfRkxBR1MsIFB0X1RSVUUsIFBoX1dNX01BWCB8IFBoX1dNX1JFU1RPUkUgfCBQaF9XTV9SRVNJWkUpOworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19OT1RJRllfRkxBR1MsIFB0X1RSVUUsIFBoX1dNX1JFU0laRSB8IFBoX1dNX01PVkUgfCBQaF9XTV9DTE9TRSB8IFBoX1dNX01BWCB8IFBoX1dNX1JFU1RPUkUpOworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19SRU5ERVJfRkxBR1MsIFB0X1RSVUUsIFBoX1dNX1JFTkRFUl9SRVNJWkUgfCBQaF9XTV9SRU5ERVJfTUFYIHwgUGhfV01fUkVOREVSX0NPTExBUFNFIHwgUGhfV01fUkVOREVSX1JFVFVSTik7CisgICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfUkVTSVpFX0ZMQUdTLCBQdF9UUlVFLCBQdF9SRVNJWkVfWFlfQVNfUkVRVUlSRUQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19NQU5BR0VEX0ZMQUdTLCBQdF9GQUxTRSwgUGhfV01fUkVTSVpFIHwgUGhfV01fTUFYIHwgUGhfV01fUkVTVE9SRSB8IFBoX1dNX0NMT1NFKTsKKyAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfTk9USUZZX0ZMQUdTLCBQdF9GQUxTRSwgUGhfV01fUkVTSVpFIHwgUGhfV01fTUFYIHwgUGhfV01fUkVTVE9SRSk7CisgICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfV0lORE9XX05PVElGWV9GTEFHUywgUHRfVFJVRSwgUGhfV01fTU9WRSB8IFBoX1dNX0NMT1NFKTsKKyAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfUkVOREVSX0ZMQUdTLCBQdF9GQUxTRSwgUGhfV01fUkVOREVSX1JFU0laRSB8IFBoX1dNX1JFTkRFUl9NQVggfCBQaF9XTV9SRU5ERVJfQ09MTEFQU0UgfCBQaF9XTV9SRU5ERVJfUkVUVVJOKTsKKyAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19SRVNJWkVfRkxBR1MsIFB0X0ZBTFNFLCBQdF9SRVNJWkVfWFlfQVNfUkVRVUlSRUQpOworICAgIH0KKworICAgIGlmICgoKGZsYWdzICYgU0RMX05PRlJBTUUpPT1TRExfTk9GUkFNRSkgfHwgKChmbGFncyAmIFNETF9GVUxMU0NSRUVOKT09U0RMX0ZVTExTQ1JFRU4pKQorICAgIHsKKyAgICAgICBpZiAoKGZsYWdzICYgU0RMX1JFU0laQUJMRSkgIT0gU0RMX1JFU0laQUJMRSkKKyAgICAgICB7CisgICAgICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfV0lORE9XX1JFTkRFUl9GTEFHUywgUHRfRkFMU0UsIFB0X1RSVUUpOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19SRU5ERVJfRkxBR1MsIFB0X0ZBTFNFLCBQdF9UUlVFKTsKKyAgICAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfUkVOREVSX0ZMQUdTLCBQdF9UUlVFLCBQaF9XTV9SRU5ERVJfUkVTSVpFIHwgUGhfV01fUkVOREVSX0JPUkRFUik7CisgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19SRU5ERVJfRkxBR1MsIFB0X1RSVUUsIFBoX1dNX1JFTkRFUl9CT1JERVIgfCBQaF9XTV9SRU5ERVJfVElUTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhfV01fUkVOREVSX0NMT1NFIHwgUGhfV01fUkVOREVSX01FTlUgfCBQaF9XTV9SRU5ERVJfTUlOKTsKKyAgICB9CisKKyAgICBpZiAoKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOKQorICAgIHsKKyAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19QT1MsICZwb3MsIDApOworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX0JBU0lDX0ZMQUdTLCBQdF9UUlVFLCBQdF9CQVNJQ19QUkVWRU5UX0ZJTEwpOworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19NQU5BR0VEX0ZMQUdTLCBQdF9UUlVFLCBQaF9XTV9GRlJPTlQgfCBQaF9XTV9NQVggfCBQaF9XTV9UT0ZST05UIHwgUGhfV01fQ09OU1dJVENIKTsKKyAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X1RSVUUsIFBoX1dNX1NUQVRFX0lTRlJPTlQgfCBQaF9XTV9TVEFURV9JU0ZPQ1VTIHwgUGhfV01fU1RBVEVfSVNBTFRLRVkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19NQU5BR0VEX0ZMQUdTLCBQdF9GQUxTRSwgUGhfV01fRkZST05UIHwgUGhfV01fQ09OU1dJVENIKTsKKyAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X0ZBTFNFLCBQaF9XTV9TVEFURV9JU0ZST05UKTsKKyAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X1RSVUUsIFBoX1dNX1NUQVRFX0lTQUxUS0VZKTsKKworICAgICAgICBpZiAoKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX0hXU1VSRkFDRSkKKyAgICAgICAgeworICAgICAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19CQVNJQ19GTEFHUywgUHRfVFJVRSwgUHRfQkFTSUNfUFJFVkVOVF9GSUxMKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFB0U2V0QXJnKCZhcmdzW25hcmdzKytdLCBQdF9BUkdfRklMTF9DT0xPUiwgUGdfQkxBQ0ssIDApOworICAgICAgICB9CisgICAgICAgIGlmICghY3VycmVudGx5X21heGltaXplZCkKKyAgICAgICAgeworICAgICAgICAgICAgd2luZG93cG9zID0gU0RMX2dldGVudigiU0RMX1ZJREVPX1dJTkRPV19QT1MiKTsKKyAgICAgICAgICAgIGlzY2VudGVyZWQgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fQ0VOVEVSRUQiKTsKKworICAgICAgICAgICAgaWYgKChpc2NlbnRlcmVkKSB8fCAoKHdpbmRvd3BvcykgJiYgKFNETF9zdHJjbXAod2luZG93cG9zLCAiY2VudGVyIik9PTApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQaFdpbmRvd1F1ZXJ5VmlzaWJsZShQaF9RVUVSWV9DT05TT0xFLCAwLCAwLCAmZGVza3RvcGV4dGVudCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2t0b3BfbW9kZS53aWR0aD53KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zLnggPSAoZGVza3RvcF9tb2RlLndpZHRoIC0gdykvMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlc2t0b3BfbW9kZS5oZWlnaHQ+aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvcy55ID0gKGRlc2t0b3BfbW9kZS5oZWlnaHQgLSBoKS8yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBvcy54Kz1kZXNrdG9wZXh0ZW50LnVsLng7CisgICAgICAgICAgICAgICAgcG9zLnkrPWRlc2t0b3BleHRlbnQudWwueTsKKyAgICAgICAgICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1BPUywgJnBvcywgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdpbmRvd3BvcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTRExfc3NjYW5mKHdpbmRvd3BvcywgIiVkLCVkIiwgJngsICZ5KSA9PSAyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHg8ZGVza3RvcF9tb2RlLndpZHRoKSAmJiAoeTxkZXNrdG9wX21vZGUuaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaFdpbmRvd1F1ZXJ5VmlzaWJsZShQaF9RVUVSWV9DT05TT0xFLCAwLCAwLCAmZGVza3RvcGV4dGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLng9eCtkZXNrdG9wZXh0ZW50LnVsLng7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLnk9eStkZXNrdG9wZXh0ZW50LnVsLnk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1BPUywgJnBvcywgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiB3aW5kb3cgaXMgbWF4aW1pemVkIHJlbmRlciBpdCBhcyBtYXhpbWl6ZWQgKi8KKyAgICAgICAgaWYgKGN1cnJlbnRseV9tYXhpbWl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X1RSVUUsIFBoX1dNX1NUQVRFX0lTTUFYKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfU1RBVEUsIFB0X0ZBTFNFLCBQaF9XTV9TVEFURV9JU01BWCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBkbyBub3QgZ3JhYiB0aGUga2V5Ym9hcmQgYnkgZGVmYXVsdCAqLworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19TVEFURSwgUHRfRkFMU0UsIFBoX1dNX1NUQVRFX0lTQUxUS0VZKTsKKworICAgICAgICAvKiBicmluZyB0aGUgZm9jdXMgdG8gdGhlIHdpbmRvdyAqLworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19TVEFURSwgUHRfVFJVRSwgUGhfV01fU1RBVEVfSVNGT0NVUyk7CisKKyAgICAgICAgLyogYWxsb3cgdG8gY2F0Y2ggaGlkZSBldmVudCAqLworICAgICAgICBQdFNldEFyZygmYXJnc1tuYXJncysrXSwgUHRfQVJHX1dJTkRPV19NQU5BR0VEX0ZMQUdTLCBQdF9UUlVFLCBQaF9XTV9ISURFKTsKKyAgICAgICAgUHRTZXRBcmcoJmFyZ3NbbmFyZ3MrK10sIFB0X0FSR19XSU5ET1dfTk9USUZZX0ZMQUdTLCBQdF9UUlVFLCBQaF9XTV9ISURFKTsKKyAgICB9CisKKyAgICBQdFNldFJlc291cmNlcyh3aW5kb3csIG5hcmdzLCBhcmdzKTsKKyAgICBQdFJlYWxpemVXaWRnZXQod2luZG93KTsKKyAgICBQdFdpbmRvd1RvRnJvbnQod2luZG93KTsKKworI2lmIDAgLyogRklYTUUgKi8KKyAgICBQdEdldFJlc291cmNlKHdpbmRvdywgUHRfQVJHX1BPUywgJm9sZGRpbSwgMCk7CisgICAgZnByaW50ZihzdGRlcnIsICJQT1NJVElPTjogJWQsICVkXG4iLCBvbGRkaW0tPncsIG9sZGRpbS0+aCk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IENvbG91ck1hc2tzKiBwaF9HZXRDb2xvdXJNYXNrcyhpbnQgYnBwKQoreworICAgIC8qIFRoZSBhbHBoYSBtYXNrIGRvZXNuJ3QgYXBwZWFycyB0byBiZSBuZWVkZWQgKi8KKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IENvbG91ck1hc2tzIHBoQ29sb3JNYXNrc1s1XSA9IHsKKyAgICAgICAgLyogIDggYml0ICAgICAgKi8gIHswLCAwLCAwLCAwLCA4fSwKKyAgICAgICAgLyogMTUgYml0IEFSR0IgKi8gIHsweDdDMDAsIDB4MDNFMCwgMHgwMDFGLCAweDgwMDAsIDE1fSwKKyAgICAgICAgLyogMTYgYml0ICBSR0IgKi8gIHsweEY4MDAsIDB4MDdFMCwgMHgwMDFGLCAweDAwMDAsIDE2fSwKKyAgICAgICAgLyogMjQgYml0ICBSR0IgKi8gIHsweEZGMDAwMCwgMHgwMEZGMDAsIDB4MDAwMEZGLCAweDAwMDAwMCwgMjR9LAorICAgICAgICAvKiAzMiBiaXQgQVJHQiAqLyAgezB4MDBGRjAwMDAsIDB4MDAwMEZGMDAsIDB4MDAwMDAwRkYsIDB4RkYwMDAwMDAsIDMyfSwKKyAgICB9OworCisgICAgc3dpdGNoIChicHApCisgICAgeworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbMF07CisgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbMV07CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbMl07CisgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbM107CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgcmV0dXJuICZwaENvbG9yTWFza3NbNF07CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHBoX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0KiB2Zm9ybWF0KQoreworICAgIFBnSFdDYXBzX3QgaHdjYXBzOworICAgIGludCBpOworCisgICAgd2luZG93PU5VTEw7CisgICAgZGVza3RvcHBhbD1TRExQSF9QQUxfTk9ORTsKKworI2lmIFNETF9WSURFT19PUEVOR0wKKyAgICBvZ2xjdHg9TlVMTDsKKyAgICBvZ2xidWZmZXJzPU5VTEw7CisgICAgb2dsZmxhZ3M9MDsKKyAgICBvZ2xicHA9MDsKKyNlbmRpZgorICAgIAorICAgIG9sZF92aWRlb19tb2RlPS0xOworICAgIG9sZF9yZWZyZXNoX3JhdGU9LTE7CisJCisgICAgaWYgKE5VTEwgPT0gKHBoZXZlbnQgPSBTRExfbWFsbG9jKEVWRU5UX1NJWkUpKSkKKyAgICB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFNETF9tZW1zZXQocGhldmVudCwgMHgwMCwgRVZFTlRfU0laRSk7CisKKyAgICB3aW5kb3cgPSBwaF9DcmVhdGVXaW5kb3codGhpcyk7CisgICAgaWYgKHdpbmRvdyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJwaF9WaWRlb0luaXQoKTogQ291bGRuJ3QgY3JlYXRlIHZpZGVvIHdpbmRvdyAhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIENyZWF0ZSB0aGUgYmxhbmsgY3Vyc29yICovCisgICAgU0RMX0JsYW5rQ3Vyc29yID0gdGhpcy0+Q3JlYXRlV01DdXJzb3IodGhpcywgYmxhbmtfY2RhdGEsIGJsYW5rX2NtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClCTEFOS19DV0lEVEgsIChpbnQpQkxBTktfQ0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpQkxBTktfQ0hPVFgsIChpbnQpQkxBTktfQ0hPVFkpOworCisgICAgaWYgKFNETF9CbGFua0N1cnNvciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChQZ0dldEdyYXBoaWNzSFdDYXBzKCZod2NhcHMpIDwgMCkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigicGhfVmlkZW9Jbml0KCk6IEdldEdyYXBoaWNzSFdDYXBzIGZ1bmN0aW9uIGZhaWxlZCAhXG4iKTsKKyAgICAgICAgdGhpcy0+RnJlZVdNQ3Vyc29yKHRoaXMsIFNETF9CbGFua0N1cnNvcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoUGdHZXRWaWRlb01vZGVJbmZvKGh3Y2Fwcy5jdXJyZW50X3ZpZGVvX21vZGUsICZkZXNrdG9wX21vZGUpIDwgMCkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigicGhfVmlkZW9Jbml0KCk6IFBnR2V0VmlkZW9Nb2RlSW5mbyBmdW5jdGlvbiBmYWlsZWQgIVxuIik7CisgICAgICAgIHRoaXMtPkZyZWVXTUN1cnNvcih0aGlzLCBTRExfQmxhbmtDdXJzb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUgKi8KKyAgIHRoaXMtPmluZm8uY3VycmVudF93ID0gZGVza3RvcF9tb2RlLndpZHRoOworICAgdGhpcy0+aW5mby5jdXJyZW50X2ggPSBkZXNrdG9wX21vZGUuaGVpZ2h0OworCisgICAgLyogV2UgbmVlZCB0byByZXR1cm4gQnl0ZXNQZXJQaXhlbCBhcyBpdCBpbiB1c2VkIGJ5IENyZWF0ZVJHQnN1cmZhY2UgKi8KKyAgICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBkZXNrdG9wX21vZGUuYml0c19wZXJfcGl4ZWw7CisgICAgdmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9IGRlc2t0b3BfbW9kZS5ieXRlc19wZXJfc2NhbmxpbmUvZGVza3RvcF9tb2RlLndpZHRoOworICAgIGRlc2t0b3BicHAgPSBkZXNrdG9wX21vZGUuYml0c19wZXJfcGl4ZWw7CisgICAgCisgICAgLyogc2F2ZSBjdXJyZW50IHBhbGV0dGUgKi8KKyAgICBpZiAoZGVza3RvcGJwcD09OCkKKyAgICB7CisgICAgICAgIFBnR2V0UGFsZXR0ZShzYXZlZHBhbCk7CisgICAgICAgIFBnR2V0UGFsZXR0ZShzeXNwYWxwaCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvcihpPTA7IGk8X1BnX01BWF9QQUxFVFRFOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNhdmVkcGFsW2ldPVBnUkdCKDAsIDAsIDApOworICAgICAgICAgICAgc3lzcGFscGhbaV09UGdSR0IoMCwgMCwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgICAKKyAgICBjdXJyZW50bHlfZnVsbHNjcmVlbiA9IDA7CisgICAgY3VycmVudGx5X2hpZGVkID0gMDsKKyAgICBjdXJyZW50bHlfbWF4aW1pemVkID0gMDsKKyAgICBjdXJyZW50X292ZXJsYXkgPSBOVUxMOworCisgICAgT0NJbWFnZS5kaXJlY3RfY29udGV4dCA9IE5VTEw7CisgICAgT0NJbWFnZS5vZmZzY3JlZW5fY29udGV4dCA9IE5VTEw7CisgICAgT0NJbWFnZS5vZmZzY3JlZW5fYmFja2NvbnRleHQgPSBOVUxMOworICAgIE9DSW1hZ2Uub2xkREMgPSBOVUxMOworICAgIE9DSW1hZ2UuQ3VycmVudEZyYW1lRGF0YSA9IE5VTEw7CisgICAgT0NJbWFnZS5GcmFtZURhdGEwID0gTlVMTDsKKyAgICBPQ0ltYWdlLkZyYW1lRGF0YTEgPSBOVUxMOworICAgIHZpZGVvbW9kZV9lbXVsYXRlbW9kZSA9IDA7CisgICAgCisgICAgdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAxOworCisgICAgcGhfVXBkYXRlSFdJbmZvKHRoaXMpOworICAgIAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgU0RMX1N1cmZhY2UqIHBoX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworICAgIGNvbnN0IHN0cnVjdCBDb2xvdXJNYXNrcyogbWFzazsKKworICAgIC8qIExvY2sgdGhlIGV2ZW50IHRocmVhZCwgaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50cyAqLworICAgIFNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7CisKKyAgICBjdXJyZW50LT5mbGFncyA9IGZsYWdzOworCisgICAgLyogaWYgd2UgZG8gbm90IGhhdmUgZGVzaXJlZCBmdWxsc2NyZWVuIG1vZGUsIHRoZW4gZmFsbGJhY2sgaW50byB3aW5kb3cgbW9kZSAqLworICAgIGlmICgoKGN1cnJlbnQtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOKSAmJiAocGhfR2V0VmlkZW9Nb2RlKHdpZHRoLCBoZWlnaHQsIGJwcCk9PTApKQorICAgIHsKKyAgICAgICBjdXJyZW50LT5mbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47CisgICAgICAgY3VycmVudC0+ZmxhZ3MgJj0gflNETF9OT0ZSQU1FOworICAgICAgIGN1cnJlbnQtPmZsYWdzICY9IH5TRExfUkVTSVpBQkxFOworICAgIH0KKworICAgIHBoX1NldHVwV2luZG93KHRoaXMsIHdpZHRoLCBoZWlnaHQsIGN1cnJlbnQtPmZsYWdzKTsKKworICAgIG1hc2sgPSBwaF9HZXRDb2xvdXJNYXNrcyhicHApOworICAgIGlmIChtYXNrICE9IE5VTEwpCisgICAgeworICAgICAgICBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBtYXNrLT5icHAsIG1hc2stPnJlZCwgbWFzay0+Z3JlZW4sIG1hc2stPmJsdWUsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldFZpZGVvTW9kZSgpOiBkZXNpcmVkIGJwcCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHBob3RvbiAhXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNETF9PUEVOR0wpPT1TRExfT1BFTkdMKQorICAgIHsKKyNpZiAhU0RMX1ZJREVPX09QRU5HTAorICAgICAgICAvKiBpZiBubyBidWlsdC1pbiBPcGVuR0wgc3VwcG9ydCAqLworICAgICAgICBTRExfU2V0RXJyb3IoInBoX1NldFZpZGVvTW9kZSgpOiBubyBPcGVuR0wgc3VwcG9ydCwgeW91IG5lZWQgdG8gcmVjb21waWxlIFNETC5cbiIpOworICAgICAgICBjdXJyZW50LT5mbGFncyAmPSB+U0RMX09QRU5HTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBJbml0aWFsaXplIGludGVybmFsIHZhcmlhYmxlcyAqLworICAgICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnBwPT04KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZGVza3RvcHBhbD1TRExQSF9QQUxfU1lTVEVNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyZW50LT5mbGFncyAmPSB+U0RMX1JFU0laQUJMRTsgLyogbm8gcmVzaXplIGZvciBEaXJlY3QgQ29udGV4dCAqLworICAgICAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHJlbW92ZSB0aGlzIGlmIHdlJ2xsIGhhdmUgc3VwcG9ydCBmb3IgdGhlIG5vbi1mdWxsc2NyZWVuIHN3L2h3K2RvdWJsZWJ1ZiBvbmUgZGF5ICovCisgICAgICAgICAgICBjdXJyZW50LT5mbGFncyAmPSB+U0RMX0RPVUJMRUJVRjsKKworICAgICAgICAgICAgLyogVXNlIG9mZnNjcmVlbiBtZW1vcnkgaWYgU0RMX0hXU1VSRkFDRSBmbGFnIGlzIHNldCAqLworICAgICAgICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRlc2t0b3BicHAhPWJwcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgY3VycmVudC0+ZmxhZ3MgJj0gflNETF9IV1NVUkZBQ0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1c2luZyBwYWxldHRlIGVtdWxhdGlvbiBjb2RlIGluIHdpbmRvdyBtb2RlICovCisgICAgICAgICAgICBpZiAoYnBwPT04KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkZXNrdG9wYnBwPj0xNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlc2t0b3BwYWwgPSBTRExQSF9QQUxfRU1VTEFURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGVza3RvcHBhbCA9IFNETFBIX1BBTF9TWVNURU07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZGVza3RvcHBhbCA9IFNETFBIX1BBTF9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY3VycmVudC0+dyA9IHdpZHRoOworICAgIGN1cnJlbnQtPmggPSBoZWlnaHQ7CisKKyAgICBpZiAoZGVza3RvcHBhbD09U0RMUEhfUEFMX1NZU1RFTSkKKyAgICB7CisgICAgICAgY3VycmVudC0+ZmxhZ3N8PVNETF9IV1BBTEVUVEU7CisgICAgfQorCisgICAgLyogTXVzdCBjYWxsIGF0IGxlYXN0IG9uY2UgZm9yIHNldHVwIGltYWdlIHBsYW5lcyAqLworICAgIGlmIChwaF9TZXR1cFVwZGF0ZUZ1bmN0aW9uKHRoaXMsIGN1cnJlbnQsIGN1cnJlbnQtPmZsYWdzKT09LTEpCisgICAgeworICAgICAgICAvKiBFcnJvciBzdHJpbmcgd2FzIGZpbGxlZCBpbiB0aGUgcGhfU2V0dXBVcGRhdGVGdW5jdGlvbigpICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGZpbmlzaCB3aW5kb3cgZHJhd2luZywgaWYgd2UgYXJlIG5vdCBpbiBmdWxsc2NyZWVuLCBvZiBjb3Vyc2UgKi8KKyAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICE9IFNETF9GVUxMU0NSRUVOKQorICAgIHsKKyAgICAgICBQdEZsdXNoKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgUGdGbHVzaCgpOworICAgIH0KKworICAgIHZpc3VhbGJwcD1icHA7CisKKyAgICBwaF9VcGRhdGVIV0luZm8odGhpcyk7CisKKyAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7CisKKyAgICAvKiBXZSd2ZSBkb25lISAqLworICAgIHJldHVybiAoY3VycmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHBoX1ZpZGVvUXVpdChfVEhJUykKK3sKKyAgICAvKiByZXN0b3JlIHBhbGV0dGUgKi8KKyAgICBpZiAoZGVza3RvcGJwcD09OCkKKyAgICB7CisgICAgICAgIFBnU2V0UGFsZXR0ZShzeXNwYWxwaCwgMCwgLTEsIDAsIDAsIDApOworICAgICAgICBQZ1NldFBhbGV0dGUoc2F2ZWRwYWwsIDAsIDAsIF9QZ19NQVhfUEFMRVRURSwgUGdfUEFMU0VUX0dMT0JBTCB8IFBnX1BBTFNFVF9GT1JDRV9FWFBPU0UsIDApOworICAgICAgICBQZ0ZsdXNoKCk7CisgICAgfQorCisgICAgcGhfRGVzdHJveUltYWdlKHRoaXMsIFNETF9WaWRlb1N1cmZhY2UpOyAKKworICAgIGlmICh3aW5kb3cpCisgICAgeworICAgICAgICBQdFVucmVhbGl6ZVdpZGdldCh3aW5kb3cpOworICAgICAgICBQdERlc3Ryb3lXaWRnZXQod2luZG93KTsKKyAgICAgICAgd2luZG93PU5VTEw7CisgICAgfQorCisgICAgaWYgKHBoZXZlbnQhPU5VTEwpCisgICAgeworICAgICAgICBTRExfZnJlZShwaGV2ZW50KTsKKyAgICAgICAgcGhldmVudD1OVUxMOworICAgIH0KK30KKworc3RhdGljIGludCBwaF9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisgICAgaW50IGk7CisgICAgU0RMX1JlY3QgdXBkYXRlcmVjdDsKKworICAgIHVwZGF0ZXJlY3QueCA9IHVwZGF0ZXJlY3QueSA9IDA7CisgICAgdXBkYXRlcmVjdC53ID0gdGhpcy0+c2NyZWVuLT53OworICAgIHVwZGF0ZXJlY3QuaCA9IHRoaXMtPnNjcmVlbi0+aDsKKworICAgIC8qIHBhbGV0dGUgZW11bGF0aW9uIGNvZGUsIHVzaW5nIHBhbGV0dGUgb2YgdGhlIFBoSW1hZ2VfdCBzdHJ1Y3QgKi8KKyAgICBpZiAoZGVza3RvcHBhbD09U0RMUEhfUEFMX0VNVUxBVEUpCisgICAgeworICAgICAgICBpZiAoKFNETF9JbWFnZSkgJiYgKFNETF9JbWFnZS0+cGFsZXR0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT1maXJzdGNvbG9yOyBpPGZpcnN0Y29sb3IrbmNvbG9yczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5c3BhbHBoW2ldID0gUGdSR0IoY29sb3JzW2ktZmlyc3Rjb2xvcl0uciwgY29sb3JzW2ktZmlyc3Rjb2xvcl0uZywgY29sb3JzW2ktZmlyc3Rjb2xvcl0uYik7CisgICAgICAgICAgICAgICAgU0RMX0ltYWdlLT5wYWxldHRlW2ldID0gc3lzcGFscGhbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGltYWdlIG5lZWRzIHRvIGJlIHJlZHJhd24gKi8KKyAgICAgICAgICAgIHRoaXMtPlVwZGF0ZVJlY3RzKHRoaXMsIDEsICZ1cGRhdGVyZWN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZGVza3RvcHBhbD09U0RMUEhfUEFMX1NZU1RFTSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPWZpcnN0Y29sb3I7IGk8Zmlyc3Rjb2xvcituY29sb3JzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3lzcGFscGhbaV0gPSBQZ1JHQihjb2xvcnNbaS1maXJzdGNvbG9yXS5yLCBjb2xvcnNbaS1maXJzdGNvbG9yXS5nLCBjb2xvcnNbaS1maXJzdGNvbG9yXS5iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICE9IFNETF9GVUxMU0NSRUVOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgbW9kZSBtdXN0IHVzZSBzb2Z0IHBhbGV0dGUgKi8KKyAgICAgICAgICAgICAgICBQZ1NldFBhbGV0dGUoJnN5c3BhbHBoW2ZpcnN0Y29sb3JdLCAwLCBmaXJzdGNvbG9yLCBuY29sb3JzLCBQZ19QQUxTRVRfR0xPQkFMLCAwKTsKKyAgICAgICAgICAgICAgICAvKiBpbWFnZSBuZWVkcyB0byBiZSByZWRyYXduICovCisgICAgICAgICAgICAgICAgdGhpcy0+VXBkYXRlUmVjdHModGhpcywgMSwgJnVwZGF0ZXJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGZ1bGxzY3JlZW4gbW9kZSBtdXN0IHVzZSBoYXJkd2FyZSBwYWxldHRlICovCisgICAgICAgICAgICAgICAgUGdTZXRQYWxldHRlKCZzeXNwYWxwaFtmaXJzdGNvbG9yXSwgMCwgZmlyc3Rjb2xvciwgbmNvbG9ycywgUGdfUEFMU0VUX0dMT0JBTCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTRExQSF9QQUxfTk9ORSBkbyBub3RoaW5nICovCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF92aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoX3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5NWQzNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF92aWRlby5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfX1NETF9QSF9WSURFT19IX18KKyNkZWZpbmUgX19TRExfUEhfVklERU9fSF9fCisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKworI2luY2x1ZGUgPHN5cy9uZXV0cmluby5oPgorCisjaW5jbHVkZSA8UGguaD4KKyNpbmNsdWRlIDxQdC5oPgorI2luY2x1ZGUgPHBob3Rvbi9QZy5oPgorI2luY2x1ZGUgPHBob3Rvbi9QZERpcmVjdC5oPgorCisjaWYgU0RMX1ZJREVPX09QRU5HTAorICAgICNpZiAoX05UT19WRVJTSU9OIDwgNjMwKQorICAgICAgICAjaW5jbHVkZSA8cGhvdG9uL1BkR0wuaD4KKyAgICAjZWxzZQorICAgICAgICAjaW5jbHVkZSA8R0wvcW54Z2wuaD4KKyAgICAgICAgI2luY2x1ZGUgPEdML0dMUGguaD4KKyAgICAjZW5kaWYgLyogNi4zLjAgKi8KKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UqIHRoaXMKKworI2RlZmluZSBQSF9PR0xfTUFYX0FUVFJJQlMgMzIKKworI2RlZmluZSBTRExQSF9QQUxfTk9ORSAgICAweDAwMDAwMDAwTAorI2RlZmluZSBTRExQSF9QQUxfRU1VTEFURSAweDAwMDAwMDAxTAorI2RlZmluZSBTRExQSF9QQUxfU1lTVEVNICAweDAwMDAwMDAyTAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGNoYXIqIFk7CisgICAgdW5zaWduZWQgY2hhciogVjsKKyAgICB1bnNpZ25lZCBjaGFyKiBVOworfSBGUkFNRURBVEE7CisKKy8qIE1hc2sgdmFsdWVzIGZvciBTRExfUmVhbGxvY0Zvcm1hdCgpICovCitzdHJ1Y3QgQ29sb3VyTWFza3MKK3sKKyAgICBVaW50MzIgcmVkOworICAgIFVpbnQzMiBncmVlbjsKKyAgICBVaW50MzIgYmx1ZTsKKyAgICBVaW50MzIgYWxwaGE7CisgICAgVWludDMyIGJwcDsKK307CisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEKK3sKKyAgICBQZ0Rpc3BsYXlTZXR0aW5nc190IG1vZGVfc2V0dGluZ3M7CQorICAgIFB0V2lkZ2V0X3QgKldpbmRvdzsgICAgICAgICAgICAgICAgICAvKiB1c2VkIHRvIGhhbmRsZSBpbnB1dCBldmVudHMgKi8KKyAgICBQaEltYWdlX3QgKmltYWdlOwkgICAgICAgICAgICAgICAgIC8qIHVzZWQgdG8gZGlzcGxheSBpbWFnZSAgICAgICAqLworI2lmIFNETF9WSURFT19PUEVOR0wKKyAgICAjaWYgKF9OVE9fVkVSU0lPTiA8IDYzMCkKKyAgICAgICAgUGRPcGVuR0xDb250ZXh0X3QqIE9HTENvbnRleHQ7ICAgLyogT3BlbkdMIGNvbnRleHQgICAgICAgICAgICAgICovCisgICAgICAgIHZvaWQqIE9HTEJ1ZmZlcnM7ICAgICAgICAgICAgICAgIC8qIE9wZW5HTCBidWZmZXJzICh1bnVzZWQpICAgICAqLworICAgICNlbHNlCisgICAgICAgIHFueGdsY190KiBPR0xDb250ZXh0OyAgICAgICAgICAgIC8qIE9wZW5HTCBjb250ZXh0IGZvciB0aGUgNi4zICAqLworICAgICAgICBxbnhnbF9idWZzX3QqIE9HTEJ1ZmZlcnM7ICAgICAgICAvKiBPcGVuR0wgYnVmZmVycyBmb3IgdGhlIDYuMyAgKi8KKyAgICAjZW5kaWYgLyogNjMwICovCisKKyAgICBVaW50MzIgT0dMRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgLyogT3BlbkdMIGZsYWdzICAgICAgICAgICAgICAgICovCisgICAgVWludDMyIE9HTEJQUDsgICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW5HTCBicHAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0wgKi8KKyAgICBQZ0NvbG9yX3Qgc2F2ZWRwYWxbX1BnX01BWF9QQUxFVFRFXTsKKyAgICBQZ0NvbG9yX3Qgc3lzcGFscGhbX1BnX01BWF9QQUxFVFRFXTsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgUGREaXJlY3RDb250ZXh0X3QqICAgIGRpcmVjdF9jb250ZXh0OworICAgICAgICBQZE9mZnNjcmVlbkNvbnRleHRfdCogb2Zmc2NyZWVuX2NvbnRleHQ7CisgICAgICAgIFBkT2Zmc2NyZWVuQ29udGV4dF90KiBvZmZzY3JlZW5fYmFja2NvbnRleHQ7CisgICAgICAgIFBoRHJhd0NvbnRleHRfdCogICAgICBvbGREQzsKKyAgICAgICAgdWludDhfdCogICAgICAgICAgICAgIGRjX3B0cjsKKyAgICAgICAgdW5zaWduZWQgY2hhciogICAgICAgIEN1cnJlbnRGcmFtZURhdGE7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqICAgICAgICBGcmFtZURhdGEwOworICAgICAgICB1bnNpZ25lZCBjaGFyKiAgICAgICAgRnJhbWVEYXRhMTsKKyAgICAgICAgVWludDMyICAgICAgICAgICAgICAgIGN1cnJlbnQ7CisgICAgICAgIFVpbnQzMiAgICAgICAgICAgICAgICBmbGFnczsKKyAgICB9IG9jaW1hZ2U7CisKKyAgICBQZ0hXQ2Fwc190IGdyYXBoaWNzX2NhcmRfY2FwczsgIC8qIEdyYXBoaWNzIGNhcmQgY2FwcyBhdCB0aGUgbW9tZW50IG9mIHN0YXJ0ICAgKi8KKyAgICBQZ1ZpZGVvTW9kZUluZm9fdCBkZXNrdG9wX21vZGU7IC8qIEN1cnJlbnQgZGVza3RvcCB2aWRlbyBtb2RlIGluZm9ybWF0aW9uICAgICAgKi8KKyAgICBpbnQgb2xkX3ZpZGVvX21vZGU7ICAgICAgICAgICAgIC8qIFN0b3JlZCBtb2RlIGJlZm9yZSBmdWxsc2NyZWVuIHN3aXRjaCAgICAgICAgKi8KKyAgICBpbnQgb2xkX3JlZnJlc2hfcmF0ZTsgICAgICAgICAgIC8qIFN0b3JlZCByZWZyZXNoIHJhdGUgYmVmb3IgZnVsbHNjcmVlbiBzd2l0Y2ggKi8KKworICAgIGludCBtb3VzZV9yZWxhdGl2ZTsKKyAgICBXTWN1cnNvciogQmxhbmtDdXJzb3I7CisgICAgdWludDMyX3QgdmlkZW9tb2RlX2VtdWxhdGVtb2RlOworCisgICAgVWludDMyIHZpc3VhbGJwcDsJICAgICAgICAgICAgLyogY3VycmVudCB2aXN1YWwgYnBwICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVpbnQzMiBkZXNrdG9wYnBwOyAgICAgICAgICAgICAgLyogYnBwIG9mIGRlc2t0b3AgYXQgdGhlIG1vbWVudCBvZiBzdGFydCAgICAgICAqLworICAgIFVpbnQzMiBkZXNrdG9wcGFsOyAgICAgICAgICAgICAgLyogcGFsZXR0ZSBtb2RlIGVtdWxhdGlvbiBvciBzeXN0ZW0gICAgICAgICAgICAqLworCisgICAgaW50IGN1cnJlbnRseV9mdWxsc2NyZWVuOworICAgIGludCBjdXJyZW50bHlfaGlkZWQ7ICAgICAgICAgICAgLyogMSAtIHdpbmRvdyBoaWRlZCAobWluaW1hemVkKSwgMCAtIG5vcm1hbCAgICAqLworICAgIGludCBjdXJyZW50bHlfbWF4aW1pemVkOyAgICAgICAgLyogMSAtIHdpbmRvdyBoaWRlZCAobWluaW1hemVkKSwgMCAtIG5vcm1hbCAgICAqLworCisgICAgUGhFdmVudF90KiBldmVudDsKKyAgICBTRExfT3ZlcmxheSogb3ZlcmxheTsKK307CisKKyNkZWZpbmUgbW9kZV9zZXR0aW5ncyAgICAgICAgICh0aGlzLT5oaWRkZW4tPm1vZGVfc2V0dGluZ3MpCisjZGVmaW5lIHdpbmRvdwkgICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPldpbmRvdykKKyNkZWZpbmUgU0RMX0ltYWdlICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPmltYWdlKQorI2RlZmluZSBPQ0ltYWdlICAgICAgICAgICAgICAgKHRoaXMtPmhpZGRlbi0+b2NpbWFnZSkKKyNkZWZpbmUgb2xkX3ZpZGVvX21vZGUgICAgICAgICh0aGlzLT5oaWRkZW4tPm9sZF92aWRlb19tb2RlKQorI2RlZmluZSBvbGRfcmVmcmVzaF9yYXRlICAgICAgKHRoaXMtPmhpZGRlbi0+b2xkX3JlZnJlc2hfcmF0ZSkKKyNkZWZpbmUgZ3JhcGhpY3NfY2FyZF9jYXBzICAgICh0aGlzLT5oaWRkZW4tPmdyYXBoaWNzX2NhcmRfY2FwcykKKyNkZWZpbmUgZGVza3RvcGJwcCAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPmRlc2t0b3BicHApCisjZGVmaW5lIHZpc3VhbGJwcCAgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT52aXN1YWxicHApCisjZGVmaW5lIGRlc2t0b3BwYWwgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT5kZXNrdG9wcGFsKQorI2RlZmluZSBzYXZlZHBhbCAgICAgICAgICAgICAgKHRoaXMtPmhpZGRlbi0+c2F2ZWRwYWwpCisjZGVmaW5lIHN5c3BhbHBoICAgICAgICAgICAgICAodGhpcy0+aGlkZGVuLT5zeXNwYWxwaCkKKyNkZWZpbmUgY3VycmVudGx5X2Z1bGxzY3JlZW4gICh0aGlzLT5oaWRkZW4tPmN1cnJlbnRseV9mdWxsc2NyZWVuKQorI2RlZmluZSBjdXJyZW50bHlfaGlkZWQgICAgICAgKHRoaXMtPmhpZGRlbi0+Y3VycmVudGx5X2hpZGVkKQorI2RlZmluZSBjdXJyZW50bHlfbWF4aW1pemVkICAgKHRoaXMtPmhpZGRlbi0+Y3VycmVudGx5X21heGltaXplZCkKKyNkZWZpbmUgcGhldmVudCAgICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPmV2ZW50KQorI2RlZmluZSBjdXJyZW50X292ZXJsYXkgICAgICAgKHRoaXMtPmhpZGRlbi0+b3ZlcmxheSkKKyNkZWZpbmUgZGVza3RvcF9tb2RlICAgICAgICAgICh0aGlzLT5oaWRkZW4tPmRlc2t0b3BfbW9kZSkKKyNkZWZpbmUgbW91c2VfcmVsYXRpdmUgICAgICAgICh0aGlzLT5oaWRkZW4tPm1vdXNlX3JlbGF0aXZlKQorI2RlZmluZSBTRExfQmxhbmtDdXJzb3IgICAgICAgKHRoaXMtPmhpZGRlbi0+QmxhbmtDdXJzb3IpCisjZGVmaW5lIHZpZGVvbW9kZV9lbXVsYXRlbW9kZSAodGhpcy0+aGlkZGVuLT52aWRlb21vZGVfZW11bGF0ZW1vZGUpCisKKyNpZiBTRExfVklERU9fT1BFTkdMCisgICAgICNkZWZpbmUgb2dsY3R4ICAgICAgICAgICAgICAgKHRoaXMtPmhpZGRlbi0+T0dMQ29udGV4dCkKKyAgICAgI2RlZmluZSBvZ2xidWZmZXJzICAgICAgICAgICAodGhpcy0+aGlkZGVuLT5PR0xCdWZmZXJzKQorICAgICAjZGVmaW5lIG9nbGZsYWdzICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPk9HTEZsYWdzKQorICAgICAjZGVmaW5lIG9nbGJwcCAgICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPk9HTEJQUCkKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCisKKyNlbmRpZiAvKiBfX1NETF9QSF9WSURFT19IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF93bS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoX3dtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3NWQwYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF93bS5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPFBoLmg+CisjaW5jbHVkZSA8cGhvdG9uL1BwUHJvdG8uaD4KKyNpbmNsdWRlIDxwaG90b24vUGhXbS5oPgorI2luY2x1ZGUgPHBob3Rvbi93bWFwaS5oPgorCisjaW5jbHVkZSAiU0RMX3ZlcnNpb24uaCIKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfc3lzd20uaCIKKyNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3BoX21vZGVzX2MuaCIKKyNpbmNsdWRlICJTRExfcGhfd21fYy5oIgorCit2b2lkIHBoX1NldEljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzaykKK3sKKyAgICByZXR1cm47Cit9CisKKy8qIFNldCB3aW5kb3cgY2FwdGlvbiAqLwordm9pZCBwaF9TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKK3sKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOworCisgICAgLyogc2FuaXR5IGNoZWNrIGZvciBzZXQgY2FwdGlvbiBjYWxsIGJlZm9yZSB3aW5kb3cgaW5pdCAqLworICAgIGlmICh3aW5kb3chPU5VTEwpCisgICAgeworICAgICAgICBQdFNldFJlc291cmNlKHdpbmRvdywgUHRfQVJHX1dJTkRPV19USVRMRSwgdGl0bGUsIDApOworICAgIH0KKworICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKK30KKworLyogSWNvbmlmeSBjdXJyZW50IHdpbmRvdyAqLworaW50IHBoX0ljb25pZnlXaW5kb3coX1RISVMpCit7CisgICAgUGhXaW5kb3dFdmVudF90IHdpbmRvd2V2ZW50OworCisgICAgU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKKworICAgIFNETF9tZW1zZXQoJndpbmRvd2V2ZW50LCAwLCBzaXplb2Yod2luZG93ZXZlbnQpKTsKKyAgICB3aW5kb3dldmVudC5ldmVudF9mID0gUGhfV01fSElERTsKKyAgICB3aW5kb3dldmVudC5ldmVudF9zdGF0ZSA9IFBoX1dNX0VWU1RBVEVfSElERTsKKyAgICB3aW5kb3dldmVudC5yaWQgPSBQdFdpZGdldFJpZCh3aW5kb3cpOworICAgIFB0Rm9yd2FyZFdpbmRvd0V2ZW50KCZ3aW5kb3dldmVudCk7CisKKyAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworU0RMX0dyYWJNb2RlIHBoX0dyYWJJbnB1dE5vTG9jayhfVEhJUywgU0RMX0dyYWJNb2RlIG1vZGUpCit7CisgICAgc2hvcnQgYWJzX3gsIGFic195OworCisgICAgaWYoIG1vZGUgPT0gU0RMX0dSQUJfT0ZGICkKKyAgICB7CisgICAgICAgIFB0U2V0UmVzb3VyY2Uod2luZG93LCBQdF9BUkdfV0lORE9XX1NUQVRFLCBQdF9GQUxTRSwgUGhfV01fU1RBVEVfSVNBTFRLRVkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQdFNldFJlc291cmNlKHdpbmRvdywgUHRfQVJHX1dJTkRPV19TVEFURSwgUHRfVFJVRSwgUGhfV01fU1RBVEVfSVNBTFRLRVkpOworCisgICAgICAgIFB0R2V0QWJzUG9zaXRpb24od2luZG93LCAmYWJzX3gsICZhYnNfeSk7CisgICAgICAgIFBoTW92ZUN1cnNvckFicyhQaElucHV0R3JvdXAoTlVMTCksIGFic194ICsgU0RMX1ZpZGVvU3VyZmFjZS0+dy8yLCBhYnNfeSArIFNETF9WaWRlb1N1cmZhY2UtPmgvMik7CisgICAgfQorCisgICAgU0RMX1VubG9ja19FdmVudFRocmVhZCgpOworCisgICAgcmV0dXJuKG1vZGUpOworfQorCitTRExfR3JhYk1vZGUgcGhfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSkKK3sKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOworICAgIG1vZGUgPSBwaF9HcmFiSW5wdXROb0xvY2sodGhpcywgbW9kZSk7CisgICAgU0RMX1VubG9ja19FdmVudFRocmVhZCgpOworCisgICAgcmV0dXJuKG1vZGUpOworfQorCisKK2ludCBwaF9HZXRXTUluZm8oX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pCit7CisgICAgaWYgKGluZm8tPnZlcnNpb24ubWFqb3IgPD0gU0RMX01BSk9SX1ZFUlNJT04pCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJBcHBsaWNhdGlvbiBub3QgY29tcGlsZWQgd2l0aCBTREwgJWQuJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgU0RMX01BSk9SX1ZFUlNJT04sIFNETF9NSU5PUl9WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waF93bV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfd21fYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYmJmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Bob3Rvbi9TRExfcGhfd21fYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9fU0RMX1BIX1dNX0hfXworI2RlZmluZSBfX1NETF9QSF9XTV9IX18KKworI2luY2x1ZGUgIlNETF9waF92aWRlby5oIgorCisvKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KK2V4dGVybiB2b2lkIHBoX1NldENhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKK2V4dGVybiB2b2lkIHBoX1NldEljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzayk7CitleHRlcm4gaW50IHBoX0ljb25pZnlXaW5kb3coX1RISVMpOworZXh0ZXJuIFNETF9HcmFiTW9kZSBwaF9HcmFiSW5wdXROb0xvY2soX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKTsKK2V4dGVybiBTRExfR3JhYk1vZGUgcGhfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7CitleHRlcm4gaW50IHBoX0dldFdNSW5mbyhfVEhJUywgU0RMX1N5c1dNaW5mbyAqaW5mbyk7CisKKyNlbmRpZiAvKiBfX1NETF9QSF9XTV9IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waHl1di5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoeXV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjNzJmZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waHl1di5jCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBpcyB0aGUgUU5YIFJlYWx0aW1lIFBsYXRmb3JtIHZlcnNpb24gb2YgU0RMIFlVViB2aWRlbyBvdmVybGF5cyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPFBoLmg+CisjaW5jbHVkZSA8UHQuaD4KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9waHl1dl9jLmgiCisjaW5jbHVkZSAiLi4vU0RMX3l1dmZ1bmNzLmgiCisKKyNkZWZpbmUgT1ZFUkxBWV9TVEFURV9VTklOSVQgMAorI2RlZmluZSBPVkVSTEFZX1NUQVRFX0FDVElWRSAxCisKKy8qIFRoZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBzb2Z0d2FyZSB2aWRlbyBvdmVybGF5cyAqLworc3RhdGljIHN0cnVjdCBwcml2YXRlX3l1dmh3ZnVuY3MgcGhfeXV2ZnVuY3MgPQoreworICAgIHBoX0xvY2tZVVZPdmVybGF5LAorICAgIHBoX1VubG9ja1lVVk92ZXJsYXksCisgICAgcGhfRGlzcGxheVlVVk92ZXJsYXksCisgICAgcGhfRnJlZVlVVk92ZXJsYXkKK307CisKK2ludCBncmFiX3B0cnMyKFBnVmlkZW9DaGFubmVsX3QqIGNoYW5uZWwsIEZSQU1FREFUQSogRnJhbWUwLCBGUkFNRURBVEEqIEZyYW1lMSkKK3sKKyAgICBpbnQgcGxhbmVzID0gMDsKKworICAgIC8qIEJ1ZmZlcnMgaGF2ZSBtb3ZlZDsgcmUtb2J0YWluIHRoZSBwb2ludGVycyAqLworICAgIEZyYW1lMC0+WSA9ICh1bnNpZ25lZCBjaGFyICopUGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyKGNoYW5uZWwtPnlwbGFuZTEpOworICAgIEZyYW1lMS0+WSA9ICh1bnNpZ25lZCBjaGFyICopUGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyKGNoYW5uZWwtPnlwbGFuZTIpOworICAgIEZyYW1lMC0+VSA9ICh1bnNpZ25lZCBjaGFyICopUGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyKGNoYW5uZWwtPnZwbGFuZTEpOworICAgIEZyYW1lMS0+VSA9ICh1bnNpZ25lZCBjaGFyICopUGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyKGNoYW5uZWwtPnZwbGFuZTIpOworICAgIEZyYW1lMC0+ViA9ICh1bnNpZ25lZCBjaGFyICopUGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyKGNoYW5uZWwtPnVwbGFuZTEpOworICAgIEZyYW1lMS0+ViA9ICh1bnNpZ25lZCBjaGFyICopUGRHZXRPZmZzY3JlZW5Db250ZXh0UHRyKGNoYW5uZWwtPnVwbGFuZTIpOworCisgICAgaWYgKEZyYW1lMC0+WSkKKyAgICAgICAgcGxhbmVzKys7CisKKyAgICBpZiAoRnJhbWUwLT5VKQorICAgICAgICBwbGFuZXMrKzsKKworICAgIGlmIChGcmFtZTAtPlYpCisgICAgICAgIHBsYW5lcysrOworCisgICAgcmV0dXJuIHBsYW5lczsKK30KKworU0RMX092ZXJsYXkqIHBoX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UqIGRpc3BsYXkpCit7CisgICAgU0RMX092ZXJsYXkqIG92ZXJsYXk7CisgICAgc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhKiBod2RhdGE7CisgICAgaW50IHZpZHBvcnQ7CisgICAgaW50IHJ0bmNvZGU7CisgICAgaW50IHBsYW5lczsKKyAgICBpbnQgaT0wOworICAgIFBoUG9pbnRfdCBwb3M7CisKKyAgICAvKiBDcmVhdGUgdGhlIG92ZXJsYXkgc3RydWN0dXJlICovCisgICAgb3ZlcmxheSA9IFNETF9jYWxsb2MoMSwgc2l6ZW9mKFNETF9PdmVybGF5KSk7CisKKyAgICBpZiAob3ZlcmxheSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gdGhlIGJhc2ljIG1lbWJlcnMgKi8KKyAgICBvdmVybGF5LT5mb3JtYXQgPSBmb3JtYXQ7CisgICAgb3ZlcmxheS0+dyA9IHdpZHRoOworICAgIG92ZXJsYXktPmggPSBoZWlnaHQ7CisgICAgb3ZlcmxheS0+aHdkYXRhID0gTlVMTDsKKwkKKyAgICAvKiBTZXQgdXAgdGhlIFlVViBzdXJmYWNlIGZ1bmN0aW9uIHN0cnVjdHVyZSAqLworICAgIG92ZXJsYXktPmh3ZnVuY3MgPSAmcGhfeXV2ZnVuY3M7CisKKyAgICAvKiBDcmVhdGUgdGhlIHBpeGVsIGRhdGEgYW5kIGxvb2t1cCB0YWJsZXMgKi8KKyAgICBod2RhdGEgPSBTRExfY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEpKTsKKworICAgIGlmIChod2RhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG92ZXJsYXktPmh3ZGF0YSA9IGh3ZGF0YTsKKworICAgIFBoRENTZXRDdXJyZW50KDApOworICAgIGlmIChvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmICgob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsID0gUGdDcmVhdGVWaWRlb0NoYW5uZWwoUGdfVklERU9fQ0hBTk5FTF9TQ0FMRVIsIDApKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBTRExfU2V0RXJyb3IoInBoX0NyZWF0ZVlVVk92ZXJsYXkoKTogQ3JlYXRlIGNoYW5uZWwgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIFNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdmVybGF5LT5od2RhdGEtPmZvcmNlZHJlZHJhdz0wOworCisgICAgUHRHZXRBYnNQb3NpdGlvbih3aW5kb3csICZwb3MueCwgJnBvcy55KTsKKyAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRXaW5kb3dQb3MueCA9IHBvcy54OworICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFdpbmRvd1Bvcy55ID0gcG9zLnk7CisgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQucG9zLnggPSAwOworICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy55ID0gMDsKKyAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5zaXplLncgPSB3aWR0aDsKKyAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5zaXplLmggPSBoZWlnaHQ7CisgICAgb3ZlcmxheS0+aHdkYXRhLT5TdGF0ZSA9IE9WRVJMQVlfU1RBVEVfVU5JTklUOworICAgIG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMCA9IChGUkFNRURBVEEgKikgU0RMX2NhbGxvYygxLCBzaXplb2YoRlJBTUVEQVRBKSk7CisgICAgb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGExID0gKEZSQU1FREFUQSAqKSBTRExfY2FsbG9jKDEsIHNpemVvZihGUkFNRURBVEEpKTsKKworICAgIHZpZHBvcnQgPSAtMTsKKyAgICBpPTA7CisgICAgCisgICAgb3ZlcmxheS0+aHdkYXRhLT5pc2Nocm9tYWtleT0wOworCisgICAgZG8geworICAgICAgICBTRExfbWVtc2V0KCZvdmVybGF5LT5od2RhdGEtPmNhcHMsIDB4MDAsIHNpemVvZihQZ1NjYWxlckNhcHNfdCkpOworICAgICAgICBvdmVybGF5LT5od2RhdGEtPmNhcHMuc2l6ZSA9IHNpemVvZihQZ1NjYWxlckNhcHNfdCk7CisgICAgICAgIHJ0bmNvZGUgPSBQZ0dldFNjYWxlckNhcGFiaWxpdGllcyhvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwsIGksICZvdmVybGF5LT5od2RhdGEtPmNhcHMpOworICAgICAgICBpZiAocnRuY29kZT09MCkKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGlmIChvdmVybGF5LT5od2RhdGEtPmNhcHMuZm9ybWF0PT1mb3JtYXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoKG92ZXJsYXktPmh3ZGF0YS0+Y2Fwcy5mbGFncyAmIFBnX1NDQUxFUl9DQVBfRFNUX0NIUk9NQV9LRVkpID09IFBnX1NDQUxFUl9DQVBfRFNUX0NIUk9NQV9LRVkpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5pc2Nocm9tYWtleT0xOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgdmlkcG9ydD0xOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICB9IHdoaWxlKDEpOworCisKKyAgICBpZiAodmlkcG9ydCA9PSAtMSkKKyAgICB7CisgICAgICAgIFNETF9TZXRFcnJvcigiTm8gYXZhaWxhYmxlIHZpZGVvIHBvcnRzIGZvciByZXF1ZXN0ZWQgZm9ybWF0XG4iKTsKKyAgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBvdmVybGF5LT5od2RhdGEtPmZvcm1hdCA9IGZvcm1hdDsKKyAgICBvdmVybGF5LT5od2RhdGEtPnByb3BzLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBvdmVybGF5LT5od2RhdGEtPnByb3BzLnNpemUgPSBzaXplb2YoUGdTY2FsZXJQcm9wc190KTsKKyAgICBvdmVybGF5LT5od2RhdGEtPnByb3BzLnNyY19kaW0udyA9IHdpZHRoOworICAgIG92ZXJsYXktPmh3ZGF0YS0+cHJvcHMuc3JjX2RpbS5oID0gaGVpZ2h0OworCisgICAgLyogb3ZlcmxheS0+aHdkYXRhLT5jaHJvbWFrZXkgPSBQZ0dldE92ZXJsYXlDaHJvbWFDb2xvcigpOyAqLworICAgIG92ZXJsYXktPmh3ZGF0YS0+Y2hyb21ha2V5ID0gUGdSR0IoMTIsIDYsIDEyKTsgLyogdmVyeSBkYXJrIHBpbmsgY29sb3IgKi8KKyAgICBvdmVybGF5LT5od2RhdGEtPnByb3BzLmNvbG9yX2tleSA9IG92ZXJsYXktPmh3ZGF0YS0+Y2hyb21ha2V5OworCisgICAgUGhBcmVhVG9SZWN0KCZvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydCwgJm92ZXJsYXktPmh3ZGF0YS0+cHJvcHMudmlld3BvcnQpOworCisgICAgb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy5mbGFncyA9IFBnX1NDQUxFUl9QUk9QX0RPVUJMRV9CVUZGRVI7CisKKyAgICBpZiAoKG92ZXJsYXktPmh3ZGF0YS0+aXNjaHJvbWFrZXkpJiYob3ZlcmxheS0+aHdkYXRhLT5jaHJvbWFrZXkpKQorICAgIHsKKyAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy5mbGFncyB8PSBQZ19TQ0FMRVJfUFJPUF9DSFJPTUFfRU5BQkxFOworICAgICAgICBvdmVybGF5LT5od2RhdGEtPnByb3BzLmZsYWdzIHw9IFBnX1NDQUxFUl9QUk9QX0NIUk9NQV9TUEVDSUZZX0tFWV9NQVNLOworICAgIH0gCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy5mbGFncyAmPSB+UGdfU0NBTEVSX1BST1BfQ0hST01BX0VOQUJMRTsKKyAgICB9CisKKyAgICBydG5jb2RlID0gUGdDb25maWdTY2FsZXJDaGFubmVsKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCwgJm92ZXJsYXktPmh3ZGF0YS0+cHJvcHMpOworCisgICAgc3dpdGNoKHJ0bmNvZGUpCisgICAgeworICAgICAgICBjYXNlIC0xOiBTRExfU2V0RXJyb3IoIlBnQ29uZmlnU2NhbGVyQ2hhbm5lbCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcGxhbmVzID0gZ3JhYl9wdHJzMihvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwsIG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMCwgb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGExKTsKKworICAgIGlmKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+eXBsYW5lMSAhPSBOVUxMKQorICAgICAgICBvdmVybGF5LT5od2RhdGEtPllTdHJpZGUgPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnlwbGFuZTEtPnBpdGNoOworICAgIGlmKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+dnBsYW5lMSAhPSBOVUxMKQorICAgICAgICBvdmVybGF5LT5od2RhdGEtPlVTdHJpZGUgPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnZwbGFuZTEtPnBpdGNoOworICAgIGlmKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+dXBsYW5lMSAhPSBOVUxMKQorICAgICAgICBvdmVybGF5LT5od2RhdGEtPlZTdHJpZGUgPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnVwbGFuZTEtPnBpdGNoOworCisgICAgLyogY2hlY2sgZm9yIHRoZSB2YWxpZG5lc3Mgb2YgYWxsIHBsYW5lcyAqLworICAgIGlmICgob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT55cGxhbmUxID09IE5VTEwpICYmCisgICAgICAgIChvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnVwbGFuZTEgPT0gTlVMTCkgJiYKKyAgICAgICAgKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+dnBsYW5lMSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOworICAgICAgIFNETF9TZXRFcnJvcigiUGdDb25maWdTY2FsZXIoKSByZXR1cm5zIGFsbCBwbGFuZXMgZXF1YWwgTlVMTFxuIik7CisgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorLyoKKyAgICBvdmVybGF5LT5od2RhdGEtPmN1cnJlbnQgPSBQZ05leHRWaWRlb0ZyYW1lKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCk7CisKKyAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5jdXJyZW50PT0wKQorICAgIHsKKyAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhID0gb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGEwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRGcmFtZURhdGEgPSBvdmVybGF5LT5od2RhdGEtPkZyYW1lRGF0YTE7CisgICAgfQorKi8KKyAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRGcmFtZURhdGEgPSBvdmVybGF5LT5od2RhdGEtPkZyYW1lRGF0YTA7CisKKy8qCisgICAgb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQgPSAxOworKi8KKworICAgIC8qIEZpbmQgdGhlIHBpdGNoIGFuZCBvZmZzZXQgdmFsdWVzIGZvciB0aGUgb3ZlcmxheSAqLworICAgIG92ZXJsYXktPnBsYW5lcyA9IHBsYW5lczsKKyAgICBvdmVybGF5LT5waXRjaGVzID0gU0RMX2NhbGxvYyhvdmVybGF5LT5wbGFuZXMsIHNpemVvZihVaW50MTYpKTsKKyAgICBvdmVybGF5LT5waXhlbHMgID0gU0RMX2NhbGxvYyhvdmVybGF5LT5wbGFuZXMsIHNpemVvZihVaW50OCopKTsKKyAgICBpZiAoIW92ZXJsYXktPnBpdGNoZXMgfHwgIW92ZXJsYXktPnBpeGVscykKKyAgICB7CisgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICB9CisKKyAgICBpZiAob3ZlcmxheS0+cGxhbmVzID4gMCkKKyAgICB7CisgICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMF0gPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnlwbGFuZTEtPnBpdGNoOworICAgICAgICBvdmVybGF5LT5waXhlbHNbMF0gID0gb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhLT5ZOworICAgIH0KKyAgICBpZiAob3ZlcmxheS0+cGxhbmVzID4gMSkKKyAgICB7CisgICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMV0gPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnZwbGFuZTEtPnBpdGNoOworICAgICAgICBvdmVybGF5LT5waXhlbHNbMV0gID0gb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhLT5VOworICAgIH0KKyAgICBpZiAob3ZlcmxheS0+cGxhbmVzID4gMikKKyAgICB7CisgICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMl0gPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnVwbGFuZTEtPnBpdGNoOworICAgICAgICBvdmVybGF5LT5waXhlbHNbMl0gID0gb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhLT5WOworICAgIH0KKworICAgIG92ZXJsYXktPmh3ZGF0YS0+U3RhdGUgPSBPVkVSTEFZX1NUQVRFX0FDVElWRTsKKyAgICBvdmVybGF5LT5od2RhdGEtPnNjYWxlcl9vbiA9IDA7CisgICAgb3ZlcmxheS0+aHdfb3ZlcmxheSA9IDE7CisKKyAgICBjdXJyZW50X292ZXJsYXk9b3ZlcmxheTsKKworICAgIHJldHVybiBvdmVybGF5OworfQorCitpbnQgcGhfTG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5KiBvdmVybGF5KQoreworICAgIGlmIChvdmVybGF5ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQgPSAxOworCisvKiAgb3ZlcmxheS0+aHdkYXRhLT5jdXJyZW50ID0gUGdOZXh0VmlkZW9GcmFtZShvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwpOworICAgIGlmIChvdmVybGF5LT5od2RhdGEtPmN1cnJlbnQgPT0gLTEpCisgICAgeworICAgICAgICBTRExfU2V0RXJyb3IoInBoX0xvY2tZVVZPdmVybGF5OiBQZ05leHRGcmFtZSgpIGZhaWxlZCwgYmFpbGluZyBvdXRcbiIpOworICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChvdmVybGF5LT5od2RhdGEtPmN1cnJlbnQgPT0gMCkKKyAgICB7CisgICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YSA9IG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhID0gb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGExOworICAgIH0KKworICAgIGlmIChvdmVybGF5LT5wbGFuZXMgPiAwKQorICAgIHsKKyAgICAgICAgb3ZlcmxheS0+cGl0Y2hlc1swXSA9IG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+eXBsYW5lMS0+cGl0Y2g7CisgICAgICAgIG92ZXJsYXktPnBpeGVsc1swXSAgPSBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRGcmFtZURhdGEtPlk7CisgICAgfQorICAgIGlmIChvdmVybGF5LT5wbGFuZXMgPiAxKQorICAgIHsKKyAgICAgICAgb3ZlcmxheS0+cGl0Y2hlc1sxXSA9IG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+dXBsYW5lMS0+cGl0Y2g7CisgICAgICAgIG92ZXJsYXktPnBpeGVsc1sxXSAgPSBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRGcmFtZURhdGEtPlU7CisgICAgfQorICAgIGlmIChvdmVybGF5LT5wbGFuZXMgPiAyKQorICAgIHsKKyAgICAgICAgb3ZlcmxheS0+cGl0Y2hlc1syXSA9IG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+dnBsYW5lMS0+cGl0Y2g7CisgICAgICAgIG92ZXJsYXktPnBpeGVsc1syXSAgPSBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRGcmFtZURhdGEtPlY7CisgICAgfQorKi8KKworICAgIHJldHVybigwKTsKK30KKwordm9pZCBwaF9VbmxvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSogb3ZlcmxheSkKK3sKKyAgICBpZiAob3ZlcmxheSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG92ZXJsYXktPmh3ZGF0YS0+bG9ja2VkID0gMDsKK30KKworaW50IHBoX0Rpc3BsYXlZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSogb3ZlcmxheSwgU0RMX1JlY3QqIHNyYywgU0RMX1JlY3QqIGRzdCkKK3sKKyAgICBpbnQgcnRuY29kZTsKKyAgICBQaFBvaW50X3QgcG9zOworICAgIFNETF9SZWN0IGJhY2tyZWN0OworICAgIFBoUmVjdF90IHdpbmRvd2V4dGVudDsKKyAgICBpbnQgd2luY2hhbmdlZD0wOworCisgICAgaWYgKChvdmVybGF5ID09IE5VTEwpIHx8IChvdmVybGF5LT5od2RhdGE9PU5VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChvdmVybGF5LT5od2RhdGEtPlN0YXRlID09IE9WRVJMQVlfU1RBVEVfVU5JTklUKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB0R2V0QWJzUG9zaXRpb24od2luZG93LCAmcG9zLngsICZwb3MueSk7CisgICAgaWYgKChwb3MueCE9b3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50V2luZG93UG9zLngpIHx8CisgICAgICAgIChwb3MueSE9b3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50V2luZG93UG9zLnkpKQorICAgIHsKKyAgICAgICB3aW5jaGFuZ2VkPTE7CisgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50V2luZG93UG9zLng9cG9zLng7CisgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50V2luZG93UG9zLnk9cG9zLnk7CisgICAgfQorCisgICAgLyogSWYgQ3VycmVudFZpZXdQb3J0IHBvc2l0aW9uL3NpemUgaGFzIGJlZW4gY2hhbmdlZCwgdGhlbiBtb3ZlL3Jlc2l6ZSB0aGUgdmlld3BvcnQgKi8KKyAgICBpZiAoKG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy54ICE9IGRzdC0+eCkgfHwKKyAgICAgICAgKG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy55ICE9IGRzdC0+eSkgfHwKKyAgICAgICAgKG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnNpemUudyAhPSBkc3QtPncpIHx8CisgICAgICAgIChvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5zaXplLmggIT0gZHN0LT5oKSB8fAorICAgICAgICAob3ZlcmxheS0+aHdkYXRhLT5zY2FsZXJfb249PTApIHx8ICh3aW5jaGFuZ2VkPT0xKSB8fAorICAgICAgICAob3ZlcmxheS0+aHdkYXRhLT5mb3JjZWRyZWRyYXc9PTEpKQorICAgIHsKKworICAgICAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5pc2Nocm9tYWtleT09MSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogcmVzdG9yZSBzY3JlZW4gYmVoaW5kIHRoZSBvdmVybGF5L2Nocm9tYSBjb2xvci4gKi8KKyAgICAgICAgICAgIGJhY2tyZWN0Lng9b3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQucG9zLng7CisgICAgICAgICAgICBiYWNrcmVjdC55PW92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy55OworICAgICAgICAgICAgYmFja3JlY3Qudz1vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5zaXplLnc7CisgICAgICAgICAgICBiYWNrcmVjdC5oPW92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnNpemUuaDsKKyAgICAgICAgICAgIHRoaXMtPlVwZGF0ZVJlY3RzKHRoaXMsIDEsICZiYWNrcmVjdCk7CisKKyAgICAgICAgICAgIC8qIERyYXcgdGhlIG5ldyByZWN0YW5nbGUgb2YgdGhlIGNocm9tYSBjb2xvciBhdCB0aGUgdmlld3BvcnQgcG9zaXRpb24gKi8KKyAgICAgICAgICAgIFBnU2V0RmlsbENvbG9yKG92ZXJsYXktPmh3ZGF0YS0+Y2hyb21ha2V5KTsKKyAgICAgICAgICAgIFBnRHJhd0lSZWN0KGRzdC0+eCwgZHN0LT55LCBkc3QtPngrZHN0LT53LTEsIGRzdC0+eStkc3QtPmgtMSwgUGdfRFJBV19GSUxMKTsKKyAgICAgICAgICAgIFBnRmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+cHJvcHMuZmxhZ3MgfD0gUGdfU0NBTEVSX1BST1BfU0NBTEVSX0VOQUJMRTsKKyAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5zY2FsZXJfb24gPSAxOworCisgICAgICAgIFBoV2luZG93UXVlcnlWaXNpYmxlKFBoX1FVRVJZX0NPTlNPTEUsIDAsIFB0V2lkZ2V0UmlkKHdpbmRvdyksICZ3aW5kb3dleHRlbnQpOworICAgICAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueCA9IHBvcy54LXdpbmRvd2V4dGVudC51bC54K2RzdC0+eDsKKyAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQucG9zLnkgPSBwb3MueS13aW5kb3dleHRlbnQudWwueStkc3QtPnk7CisgICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnNpemUudyA9IGRzdC0+dzsKKyAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS5oID0gZHN0LT5oOworICAgICAgICBQaEFyZWFUb1JlY3QoJm92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LCAmb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy52aWV3cG9ydCk7CisgICAgICAgIG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy54ID0gZHN0LT54OworICAgICAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueSA9IGRzdC0+eTsKKworICAgICAgICBydG5jb2RlID0gUGdDb25maWdTY2FsZXJDaGFubmVsKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCwgJihvdmVybGF5LT5od2RhdGEtPnByb3BzKSk7CisKKyAgICAgICAgc3dpdGNoKHJ0bmNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IoIlBnQ29uZmlnU2NhbGVyQ2hhbm5lbCgpIGZ1bmN0aW9uIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICBncmFiX3B0cnMyKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCwgb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGEwLCBvdmVybGF5LT5od2RhdGEtPkZyYW1lRGF0YTEpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKworLyoKKyAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQ9PTApCisgICAgeworICAgICAgICBvdmVybGF5LT5od2RhdGEtPmN1cnJlbnQgPSBQZ05leHRWaWRlb0ZyYW1lKG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbCk7CisgICAgICAgIGlmIChvdmVybGF5LT5od2RhdGEtPmN1cnJlbnQgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigicGhfTG9ja1lVVk92ZXJsYXk6IFBnTmV4dEZyYW1lKCkgZmFpbGVkLCBiYWlsaW5nIG91dFxuIik7CisgICAgICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdmVybGF5LT5od2RhdGEtPmN1cnJlbnQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhID0gb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGEwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhID0gb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGExOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG92ZXJsYXktPnBsYW5lcyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG92ZXJsYXktPnBpdGNoZXNbMF0gPSBvdmVybGF5LT5od2RhdGEtPmNoYW5uZWwtPnlwbGFuZTEtPnBpdGNoOworICAgICAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzBdICA9IG92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudEZyYW1lRGF0YS0+WTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3ZlcmxheS0+cGxhbmVzID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgb3ZlcmxheS0+cGl0Y2hlc1sxXSA9IG92ZXJsYXktPmh3ZGF0YS0+Y2hhbm5lbC0+dXBsYW5lMS0+cGl0Y2g7CisgICAgICAgICAgICBvdmVybGF5LT5waXhlbHNbMV0gID0gb3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50RnJhbWVEYXRhLT5VOworICAgICAgICB9CisgICAgICAgIGlmIChvdmVybGF5LT5wbGFuZXMgPiAyKQorICAgICAgICB7CisgICAgICAgICAgICBvdmVybGF5LT5waXRjaGVzWzJdID0gb3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLT52cGxhbmUxLT5waXRjaDsKKyAgICAgICAgICAgIG92ZXJsYXktPnBpeGVsc1syXSAgPSBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRGcmFtZURhdGEtPlY7CisgICAgICAgIH0KKyAgICB9CisqLworICAgICAgICAKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBwaF9GcmVlWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCit7CisgICAgU0RMX1JlY3QgYmFja3JlY3Q7CisKKyAgICBpZiAob3ZlcmxheSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChvdmVybGF5LT5od2RhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjdXJyZW50X292ZXJsYXk9TlVMTDsKKworICAgIC8qIHJlc3RvcmUgc2NyZWVuIGJlaGluZCB0aGUgb3ZlcmxheS9jaHJvbWEgY29sb3IuICovCisgICAgYmFja3JlY3QueD1vdmVybGF5LT5od2RhdGEtPkN1cnJlbnRWaWV3UG9ydC5wb3MueDsKKyAgICBiYWNrcmVjdC55PW92ZXJsYXktPmh3ZGF0YS0+Q3VycmVudFZpZXdQb3J0LnBvcy55OworICAgIGJhY2tyZWN0Lnc9b3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS53OworICAgIGJhY2tyZWN0Lmg9b3ZlcmxheS0+aHdkYXRhLT5DdXJyZW50Vmlld1BvcnQuc2l6ZS5oOworICAgIHRoaXMtPlVwZGF0ZVJlY3RzKHRoaXMsIDEsICZiYWNrcmVjdCk7CisKKyAgICAvKiBpdCBpcyBuZWVkIGZvciBzb21lIGJ1Z2d5IGRyaXZlcnMsIHRoYXQgY2FuJ3QgaGlkZSBvdmVybGF5IGJlZm9yZSAqLworICAgIC8qIGZyZWVpbmcgYnVmZmVyLCBzbyB3ZSBnb3QgdHJhc2ggb24gdGhlIHNyY2VlbiAgICAgICAgICAgICAgICAgICAgICovCisgICAgb3ZlcmxheS0+aHdkYXRhLT5wcm9wcy5mbGFncyAmPSB+UGdfU0NBTEVSX1BST1BfU0NBTEVSX0VOQUJMRTsKKyAgICBQZ0NvbmZpZ1NjYWxlckNoYW5uZWwob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsLCAmKG92ZXJsYXktPmh3ZGF0YS0+cHJvcHMpKTsKKworICAgIG92ZXJsYXktPmh3ZGF0YS0+c2NhbGVyX29uID0gMDsKKyAgICBvdmVybGF5LT5od2RhdGEtPlN0YXRlID0gT1ZFUkxBWV9TVEFURV9VTklOSVQ7CisKKyAgICBpZiAob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsICE9IE5VTEwpCisgICAgeworICAgICAgICBQZ0Rlc3Ryb3lWaWRlb0NoYW5uZWwob3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsKTsKKyAgICAgICAgb3ZlcmxheS0+aHdkYXRhLT5jaGFubmVsID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0JCisKKyAgICBvdmVybGF5LT5od2RhdGEtPkN1cnJlbnRGcmFtZURhdGEgPSBOVUxMOyAgCisJCisgICAgU0RMX2ZyZWUob3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGEwKTsKKyAgICBTRExfZnJlZShvdmVybGF5LT5od2RhdGEtPkZyYW1lRGF0YTEpOworICAgIG92ZXJsYXktPmh3ZGF0YS0+RnJhbWVEYXRhMCA9IE5VTEw7CisgICAgb3ZlcmxheS0+aHdkYXRhLT5GcmFtZURhdGExID0gTlVMTDsKKyAgICBTRExfZnJlZShvdmVybGF5LT5od2RhdGEpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waG90b24vU0RMX3BoeXV2X2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waHl1dl9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmNzNmZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGhvdG9uL1NETF9waHl1dl9jLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX19TRExfUEhfWVVWX0hfXworI2RlZmluZSBfX1NETF9QSF9ZVVZfSF9fCisKKy8qIFRoaXMgaXMgdGhlIHBob3RvbiBpbXBsZW1lbnRhdGlvbiBvZiBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9waF92aWRlby5oIgorCitzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEKK3sKKyAgICBGUkFNRURBVEEqIEN1cnJlbnRGcmFtZURhdGE7CisgICAgRlJBTUVEQVRBKiBGcmFtZURhdGEwOworICAgIEZSQU1FREFUQSogRnJhbWVEYXRhMTsKKyAgICBQZ1NjYWxlclByb3BzX3QgICBwcm9wczsKKyAgICBQZ1NjYWxlckNhcHNfdCAgICBjYXBzOworICAgIFBnVmlkZW9DaGFubmVsX3QqIGNoYW5uZWw7CisgICAgUGhBcmVhX3QgQ3VycmVudFZpZXdQb3J0OworICAgIFBoUG9pbnRfdCBDdXJyZW50V2luZG93UG9zOworICAgIGxvbmcgZm9ybWF0OworICAgIGludCBzY2FsZXJfb247CisgICAgaW50IGN1cnJlbnQ7CisgICAgbG9uZyBZU3RyaWRlOworICAgIGxvbmcgVlN0cmlkZTsKKyAgICBsb25nIFVTdHJpZGU7CisgICAgaW50IGlzY2hyb21ha2V5OworICAgIGxvbmcgY2hyb21ha2V5OworICAgIGludCBmb3JjZWRyZWRyYXc7CisgICAgdW5zaWduZWQgbG9uZyBTdGF0ZTsKKyAgICBsb25nIGZsYWdzOworICAgIGludCBsb2NrZWQ7Cit9OworCitleHRlcm4gU0RMX092ZXJsYXkqIHBoX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UqIGRpc3BsYXkpOworZXh0ZXJuIGludCBwaF9Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXkpOworZXh0ZXJuIHZvaWQgcGhfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXkpOworZXh0ZXJuIGludCBwaF9EaXNwbGF5WVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkqIG92ZXJsYXksIFNETF9SZWN0KiBzcmMsIFNETF9SZWN0KiBkc3QpOworZXh0ZXJuIHZvaWQgcGhfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5KiBvdmVybGF5KTsKKworI2VuZGlmIC8qIF9fU0RMX1BIX1lVVl9IX18gKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGljb2d1aS9TRExfcGdldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGljb2d1aS9TRExfcGdldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDA2YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waWNvZ3VpL1NETF9wZ2V2ZW50cy5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisKKyAgICBNaWNhaCBEb3d0eQorICAgIG1pY2FoamRAdXNlcnMuc291cmNlZm9yZ2UubmV0CisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9wZ3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3BnZXZlbnRzX2MuaCIKKworaW50IFBHX0hhbmRsZUNsb3NlKHN0cnVjdCBwZ0V2ZW50ICpldnQpCit7CisgICAgICAgIFNETF9Qcml2YXRlUXVpdCgpOworCXJldHVybiAxOyAgICAgICAgICAgICAgIC8qIEludGVyY2VwdCB0aGUgZXZlbnQncyBub3JtYWwgcXVpdCBoYW5kbGluZyAqLworfQorCitpbnQgUEdfSGFuZGxlUmVzaXplKHN0cnVjdCBwZ0V2ZW50ICpldnQpCit7CisgICAgICAgIFNETF9Qcml2YXRlUmVzaXplKGV2dC0+ZS5zaXplLncsIGV2dC0+ZS5zaXplLmgpOworCXJldHVybiAwOworfQorCitpbnQgUEdfSGFuZGxlS2V5KHN0cnVjdCBwZ0V2ZW50ICpldnQpCit7CisgICAgICAgIFNETF9rZXlzeW0gc3ltOworCVNETF9tZW1zZXQoJnN5bSwwLHNpemVvZihzeW0pKTsKKwlzeW0uc3ltID0gZXZ0LT5lLmtiZC5rZXk7CisJc3ltLm1vZCA9IGV2dC0+ZS5rYmQubW9kczsKKyAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZChldnQtPnR5cGUgPT0gUEdfV0VfS0JEX0tFWURPV04sICZzeW0pOworCXJldHVybiAwOworfQorCitpbnQgUEdfSGFuZGxlQ2hhcihzdHJ1Y3QgcGdFdmVudCAqZXZ0KQoreworICAgICAgICBTRExfa2V5c3ltIHN5bTsKKwlTRExfbWVtc2V0KCZzeW0sMCxzaXplb2Yoc3ltKSk7CisJc3ltLnVuaWNvZGUgPSBldnQtPmUua2JkLmtleTsKKwlzeW0ubW9kID0gZXZ0LT5lLmtiZC5tb2RzOworICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkKGV2dC0+dHlwZSA9PSBQR19XRV9LQkRfS0VZRE9XTiwgJnN5bSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBQR19IYW5kbGVNb3VzZUJ1dHRvbihzdHJ1Y3QgcGdFdmVudCAqZXZ0KQoreyAgICAgICAgCisgICAgICAgIC8qIFdlIG5lZWQgdG8gZm9jdXMgdGhlIGNhbnZhcyB3aGVuIGl0J3MgY2xpY2tlZCAqLworICAgICAgICBpZiAoZXZ0LT5leHRyYSkgeworCSAgICAgICAgU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gKFNETF9WaWRlb0RldmljZSAqKSBldnQtPmV4dHJhOworCQlwZ0ZvY3VzKHRoaXMtPmhpZGRlbi0+d0NhbnZhcyk7CisJfQorICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKGV2dC0+dHlwZSA9PSBQR19XRV9QTlRSX0RPV04sIGV2dC0+ZS5wbnRyLmNoYnRuLAorCQkJICAgICAgIGV2dC0+ZS5wbnRyLngsIGV2dC0+ZS5wbnRyLnkpOworCXJldHVybiAwOworfQorCitpbnQgUEdfSGFuZGxlTW91c2VNb3Rpb24oc3RydWN0IHBnRXZlbnQgKmV2dCkKK3sKKyAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbihldnQtPmUucG50ci5idG4sMCxldnQtPmUucG50ci54LCBldnQtPmUucG50ci55KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBQR19QdW1wRXZlbnRzKF9USElTKQoreworICAgICAgICAvKiBQcm9jZXNzIGFsbCBwZW5kaW5nIGV2ZW50cyAqLworICAgICAgICBwZ0V2ZW50UG9sbCgpOworfQorCit2b2lkIFBHX0luaXRPU0tleW1hcChfVEhJUykKK3sKKyAgICAgICAgLyogV2UgbmVlZCBubyBrZXltYXAgKi8KK30KKwordm9pZCBQR19Jbml0RXZlbnRzKF9USElTKQoreworICAgICAgICAvKiBUdXJuIG9uIGFsbCB0aGUgbW91c2UgYW5kIGtleWJvYXJkIHRyaWdnZXJzIGZvciBvdXIgY2FudmFzLCBub3JtYWxseSBsZXNzIGltcG9ydGFudAorCSAqIGV2ZW50cyBsaWtlIG1vdXNlIG1vdmVtZW50IGFyZSBpZ25vcmVkIHRvIHNhdmUgYmFuZHdpZHRoLiAqLworICAgICAgICBwZ1NldFdpZGdldCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHX1dQX1RSSUdHRVJNQVNLLCAKKwkJICAgIHBnR2V0V2lkZ2V0KHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdfV1BfVFJJR0dFUk1BU0spIHwKKwkJICAgIFBHX1RSSUdHRVJfVVAgfCBQR19UUklHR0VSX0RPV04gfCBQR19UUklHR0VSX01PVkUgfAorCQkgICAgUEdfVFJJR0dFUl9LRVlVUCB8IFBHX1RSSUdHRVJfS0VZRE9XTiB8IFBHX1RSSUdHRVJfQ0hBUiwwKTsKKworCS8qIFN0YXJ0IG91ciBjYW52YXMgb3V0IGZvY3VzZWQsIHNvIHdlIGdldCBrZXlib2FyZCBpbnB1dCAqLworCXBnRm9jdXModGhpcy0+aGlkZGVuLT53Q2FudmFzKTsKKworICAgICAgICAvKiBTZXQgdXAgYmluZGluZ3MgZm9yIGFsbCB0aGUgYWJvdmUgZXZlbnQgaGFuZGxlcnMgKi8KKyAgICAgICAgcGdCaW5kKHRoaXMtPmhpZGRlbi0+d0FwcCwgICAgUEdfV0VfQ0xPU0UsICZQR19IYW5kbGVDbG9zZSwgTlVMTCk7CisgICAgICAgIHBnQmluZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHX1dFX0JVSUxELCAmUEdfSGFuZGxlUmVzaXplLCBOVUxMKTsKKyAgICAgICAgcGdCaW5kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdfV0VfS0JEX0NIQVIsICZQR19IYW5kbGVDaGFyLCBOVUxMKTsKKyAgICAgICAgcGdCaW5kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdfV0VfS0JEX0tFWVVQLCAmUEdfSGFuZGxlS2V5LCBOVUxMKTsKKyAgICAgICAgcGdCaW5kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdfV0VfS0JEX0tFWURPV04sICZQR19IYW5kbGVLZXksIE5VTEwpOworICAgICAgICBwZ0JpbmQodGhpcy0+aGlkZGVuLT53Q2FudmFzLCBQR19XRV9QTlRSX01PVkUsICZQR19IYW5kbGVNb3VzZU1vdGlvbiwgTlVMTCk7CisgICAgICAgIHBnQmluZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHX1dFX1BOVFJfVVAsICZQR19IYW5kbGVNb3VzZUJ1dHRvbiwgTlVMTCk7CisgICAgICAgIHBnQmluZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHX1dFX1BOVFJfRE9XTiwgJlBHX0hhbmRsZU1vdXNlQnV0dG9uLCB0aGlzKTsKK30KKworLyogZW5kIG9mIFNETF9wZ2V2ZW50cy5jIC4uLiAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waWNvZ3VpL1NETF9wZ2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BpY29ndWkvU0RMX3BnZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTRlMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waWNvZ3VpL1NETF9wZ2V2ZW50c19jLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworCisgICAgTWljYWggRG93dHkKKyAgICBtaWNhaGpkQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfcGd2aWRlby5oIgorCisvKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfc3lzZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCisgICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX3N5c3ZpZGVvLmMpCisqLworZXh0ZXJuIHZvaWQgUEdfUHVtcEV2ZW50cyhfVEhJUyk7CitleHRlcm4gdm9pZCBQR19Jbml0RXZlbnRzKF9USElTKTsKK2V4dGVybiB2b2lkIFBHX0luaXRPU0tleW1hcChfVEhJUyk7CisKKy8qIGVuZCBvZiBTRExfcGdldmVudHNfYy5oIC4uLiAqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BpY29ndWkvU0RMX3BndmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcGljb2d1aS9TRExfcGd2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjNmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BpY29ndWkvU0RMX3BndmlkZW8uYwpAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworCisgICAgTWljYWggRG93dHkKKyAgICBtaWNhaGpkQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisKKyNpbmNsdWRlICJTRExfcGd2aWRlby5oIgorI2luY2x1ZGUgIlNETF9wZ2V2ZW50c19jLmgiCisKKyNkZWZpbmUgUEdWSURfRFJJVkVSX05BTUUgInBpY29ndWkiCisKKy8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBQR19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipQR19MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworc3RhdGljIFNETF9TdXJmYWNlICpQR19TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgaW50IFBHX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBQR19WaWRlb1F1aXQoX1RISVMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBQR19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBQR19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBQR19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIFBHX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKKworLyogZXRjLiAqLworc3RhdGljIHZvaWQgUEdfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKKworLy8gVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yCitzdHJ1Y3QgV01jdXJzb3IgeworICAvKiBPdXIgY3Vyc29yIGlzIGEgUGljb0dVSSB0aGVtZSAqLworICBwZ2hhbmRsZSB0aGVtZTsKK30gOworCisvKiBXTSBmdW5jdGlvbnMgKi8KK3ZvaWQgUEdfU2V0Q2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pOworV01jdXJzb3IgKiBQR19DcmVhdGVXTUN1cnNvciAoX1RISVMsVWludDggKiBkYXRhLCBVaW50OCAqIG1hc2ssIAorCQkJICAgICAgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSk7Cit2b2lkIFBHX0ZyZWVXTUN1cnNvciAoX1RISVMsIFdNY3Vyc29yICogY3Vyc29yKTsKK3ZvaWQgUEdfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpOworaW50IFBHX1Nob3dXTUN1cnNvciAoX1RISVMsIFdNY3Vyc29yICogY3Vyc29yKTsKKworLyogUGljb0dVSSBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IFBHX0F2YWlsYWJsZSh2b2lkKQoreworICAgICAgICAvKiBGSVhNRTogVGhlIGN1cnJlbnQgY2xpZW50IGxpYiBkb2Vzbid0IGdpdmUgYSB3YXkgdG8gc2VlIGlmIHRoZSBwaWNvZ3VpCisJICogICAgICAgIHNlcnZlciBpcyByZWFjaGFibGUgd2l0aG91dCBjYXVzaW5nIGEgZmF0YWwgZXJyb3IgaWYgaXQgaXNuJ3QuCisJICogICAgICAgIFRoaXMgc2hvdWxkIGJlIGZpeGVkIGluIGNsaV9jMiwgYnV0IHVudGlsIHRoZW4gYXNzdW1lIHdlIGNhbgorCSAqICAgICAgICBjb25uZWN0LiBTaW5jZSBtb3JlIGNvbW1vbiBkcml2ZXJzIGxpa2UgWDExIGFyZSBwcm9iZWQgZmlyc3QgYW55d2F5LAorCSAqICAgICAgICB0aGlzIHNob3VsZG4ndCBiZSBhIGh1Z2UgcHJvYmxlbS4KKwkgKi8KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkIFBHX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqUEdfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggZGV2aWNlICkgeworCQkJU0RMX2ZyZWUoZGV2aWNlKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBQR19WaWRlb0luaXQ7CisJZGV2aWNlLT5MaXN0TW9kZXMgPSBQR19MaXN0TW9kZXM7CisJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBQR19TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5DcmVhdGVZVVZPdmVybGF5ID0gTlVMTDsKKwlkZXZpY2UtPlNldENvbG9ycyA9IFBHX1NldENvbG9yczsKKwlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gUEdfVXBkYXRlUmVjdHM7CisJZGV2aWNlLT5WaWRlb1F1aXQgPSBQR19WaWRlb1F1aXQ7CisJZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IFBHX0FsbG9jSFdTdXJmYWNlOworCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOworCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IFBHX0xvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBQR19VbmxvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gTlVMTDsKKwlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBQR19GcmVlSFdTdXJmYWNlOworCWRldmljZS0+U2V0Q2FwdGlvbiA9IFBHX1NldENhcHRpb247CisJZGV2aWNlLT5TZXRJY29uID0gTlVMTDsKKwlkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBOVUxMOworCWRldmljZS0+R3JhYklucHV0ID0gTlVMTDsKKworCWRldmljZS0+UHVtcEV2ZW50cyA9IFBHX1B1bXBFdmVudHM7CisJZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBQR19Jbml0T1NLZXltYXA7CisKKwlkZXZpY2UtPlNob3dXTUN1cnNvciA9IFBHX1Nob3dXTUN1cnNvcjsKKwlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gUEdfQ3JlYXRlV01DdXJzb3I7CisJZGV2aWNlLT5GcmVlV01DdXJzb3IgPSBQR19GcmVlV01DdXJzb3I7CisJZGV2aWNlLT5XYXJwV01DdXJzb3IgPSBQR19XYXJwV01DdXJzb3I7CisKKwlkZXZpY2UtPmZyZWUgPSBQR19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBQR19ib290c3RyYXAgPSB7CisJUEdWSURfRFJJVkVSX05BTUUsICJQaWNvR1VJIFNETCBkcml2ZXIiLAorCVBHX0F2YWlsYWJsZSwgUEdfQ3JlYXRlRGV2aWNlCit9OworCisKK2ludCBQR19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKyAgICAgICAgLyogQ29ubmVjdCB0byB0aGUgUGljb0dVSSBzZXJ2ZXIuIE5vIHdheSB0byBwcm9jZXNzIGNvbW1hbmQgbGluZSBhcmdzIHlldCwKKwkgKiBidXQgc2luY2UgdGhpcyBpcyBiYXNlZCBvbiBTSE0gaXQncyBub3QgaW1wb3J0YW50IHRvIGJlIGFibGUgdG8gc3BlY2lmeQorCSAqIGEgcmVtb3RlIFBpY29HVUkgc2VydmVyLgorCSAqCisJICogRklYTUU6IEFub3RoZXIgbml0cGljayBhYm91dCB0aGUgY3VycmVudCBjbGllbnQgbGliIGlzIHRoZXJlJ3Mgbm8KKwkgKiAgICAgICAgY2xlYW4gd2F5IHRvIGluZGljYXRlIHRoYXQgY29tbWFuZCBsaW5lIGFyZ3MgYXJlIG5vdCBhdmFpbGFibGUuCisJICovCisgICAgICAgIHBnSW5pdCgwLChjaGFyKiopIiIpOworCXRoaXMtPmhpZGRlbi0+bWkgPSAqcGdHZXRWaWRlb01vZGUoKTsKKworCS8qIENyZWF0ZSBhIHBpY29ndWkgYXBwbGljYXRpb24gYW5kIGNhbnZhcy4gV2UnbGwgcG9wdWxhdGUgdGhlIGNhbnZhcyBsYXRlci4gKi8KKwl0aGlzLT5oaWRkZW4tPndBcHAgPSBwZ1JlZ2lzdGVyQXBwKFBHX0FQUF9OT1JNQUwsIlNETCIsMCk7CisJdGhpcy0+aGlkZGVuLT53Q2FudmFzID0gcGdOZXdXaWRnZXQoUEdfV0lER0VUX0NBTlZBUywwLDApOworCXBnU2V0V2lkZ2V0KFBHREVGQVVMVCwKKwkJICAgIFBHX1dQX1NJREUsIFBHX1NfQUxMLAorCQkgICAgMCk7CisKKwlQR19Jbml0RXZlbnRzKHRoaXMpOworCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCisJdGhpcy0+aW5mby5jdXJyZW50X3cgPSB0aGlzLT5oaWRkZW4tPm1pLmx4cmVzOworCXRoaXMtPmluZm8uY3VycmVudF9oID0gdGhpcy0+aGlkZGVuLT5taS5seXJlczsKKworCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoLgorCSAqIFdlIGNoYW5nZSB0aGlzIGR1cmluZyB0aGUgU0RMX1NldFZpZGVvTW9kZSBpbXBsZW1lbnRhdGlvbi4uLiAKKwkgKiBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBCeXRlcyBwZXIgcGl4ZWwKKwkgKi8KKwl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSB0aGlzLT5oaWRkZW4tPm1pLmJwcDsKKwl2Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gdGhpcy0+aGlkZGVuLT5taS5icHAgPj4gMzsKKwlpZiAodGhpcy0+aGlkZGVuLT5taS5icHAgJiA3KQorCSAgdmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCsrOworCisJLyogV2UncmUgZG9uZSEgKi8KKwlyZXR1cm4oMCk7Cit9CisKK1NETF9SZWN0ICoqUEdfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworICAgCSByZXR1cm4gKFNETF9SZWN0ICoqKSAtMTsKK30KKworU0RMX1N1cmZhY2UgKlBHX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisJaWYgKCB0aGlzLT5oaWRkZW4tPmJpdG1hcCApIHsKKwkgIC8qIEZyZWUgb2xkIGJpdG1hcCAqLworCSAgaWYgKGN1cnJlbnQtPnBpeGVscykgeworCSAgICBzaG1kdChjdXJyZW50LT5waXhlbHMpOworCSAgICBjdXJyZW50LT5waXhlbHMgPSBOVUxMOworCSAgfQorCSAgcGdEZWxldGUodGhpcy0+aGlkZGVuLT5iaXRtYXApOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciB0aGUgc2NyZWVuICovCisJaWYgKCAhIFNETF9SZWFsbG9jRm9ybWF0KGN1cnJlbnQsIGJwcCwgMCwgMCwgMCwgMCkgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgcmVxdWVzdGVkIG1vZGUiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIENyZWF0ZSBhIG5ldyBwaWNvZ3VpIGJpdG1hcCAqLworCXRoaXMtPmhpZGRlbi0+Yml0bWFwID0gcGdDcmVhdGVCaXRtYXAod2lkdGgsaGVpZ2h0KTsKKwl0aGlzLT5oaWRkZW4tPnNobSA9ICpwZ01ha2VTSE1CaXRtYXAodGhpcy0+aGlkZGVuLT5iaXRtYXApOworCWN1cnJlbnQtPnBpeGVscyA9IHNobWF0KHNobWdldCh0aGlzLT5oaWRkZW4tPnNobS5zaG1fa2V5LAorCQkJCSAgICAgICB0aGlzLT5oaWRkZW4tPnNobS5zaG1fbGVuZ3RoLDApLE5VTEwsMCk7CisKKwkvKiBSZXNldCB0aGUgY2FudmFzLCBhbmQgZHJhdyBwZXJzaXN0ZW50IGFuZCBpbmNyZW1lbnRhbCBncm9wcy4KKwkgKiBVc2UgbWFwcGluZyBhbmQgb2Zmc2V0cyB0byBjZW50ZXIgaXQuCisJICovCisKKwlwZ1dyaXRlQ21kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdDQU5WQVNfTlVLRSwgMCk7CisKKwkvKiAwLiBTZXQgdGhlIHNvdXJjZSBwb3NpdGlvbiBkdXJpbmcgaW5jcmVtZW50YWwgcmVuZGVyaW5nCisJICovCisJcGdXcml0ZUNtZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHQ0FOVkFTX0dST1AsIDUsIFBHX0dST1BfU0VUU1JDLDAsMCwwLDApOworCXBnV3JpdGVDbWQodGhpcy0+aGlkZGVuLT53Q2FudmFzLCBQR0NBTlZBU19HUk9QRkxBR1MsIDEsIFBHX0dST1BGX0lOQ1JFTUVOVEFMKTsKKworCS8qIDEuIEluY3JlbWVudGFsIGJpdG1hcCByZW5kZXJpbmcKKwkgKi8KKwlwZ1dyaXRlQ21kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdDQU5WQVNfR1JPUCwgNiwgUEdfR1JPUF9CSVRNQVAsCisJCSAgIDAsMCwwLDAsdGhpcy0+aGlkZGVuLT5iaXRtYXApOworCXBnV3JpdGVDbWQodGhpcy0+aGlkZGVuLT53Q2FudmFzLCBQR0NBTlZBU19HUk9QRkxBR1MsIDEsIFBHX0dST1BGX0lOQ1JFTUVOVEFMKTsKKworCS8qIDIuIE5vcm1hbCBiaXRtYXAgcmVuZGVyaW5nCisJICovCisJcGdXcml0ZUNtZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHQ0FOVkFTX0dST1AsIDYsIFBHX0dST1BfQklUTUFQLAorCQkgICAwLDAsdGhpcy0+aGlkZGVuLT5zaG0ud2lkdGgsdGhpcy0+aGlkZGVuLT5zaG0uaGVpZ2h0LHRoaXMtPmhpZGRlbi0+Yml0bWFwKTsKKyAgICAgCisJLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLworCWN1cnJlbnQtPmZsYWdzID0gMDsKKwljdXJyZW50LT53ID0gdGhpcy0+aGlkZGVuLT5zaG0ud2lkdGg7CisJY3VycmVudC0+aCA9IHRoaXMtPmhpZGRlbi0+c2htLmhlaWdodDsKKwljdXJyZW50LT5waXRjaCA9IHRoaXMtPmhpZGRlbi0+c2htLnBpdGNoOworCisJLyogU2V0IHVwIHBpeGVsIGZvcm1hdCAqLworCWN1cnJlbnQtPmZvcm1hdC0+Qml0c1BlclBpeGVsID0gdGhpcy0+aGlkZGVuLT5zaG0uYnBwOworCWN1cnJlbnQtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9IHRoaXMtPmhpZGRlbi0+c2htLmJwcCA+PiAzOworCWlmICh0aGlzLT5oaWRkZW4tPnNobS5icHAgJiA3KQorCSAgY3VycmVudC0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKys7CisJY3VycmVudC0+Zm9ybWF0LT5wYWxldHRlID0gTlVMTDsKKwljdXJyZW50LT5mb3JtYXQtPlJtYXNrID0gdGhpcy0+aGlkZGVuLT5zaG0ucmVkX21hc2s7CisJY3VycmVudC0+Zm9ybWF0LT5HbWFzayA9IHRoaXMtPmhpZGRlbi0+c2htLmdyZWVuX21hc2s7CisJY3VycmVudC0+Zm9ybWF0LT5CbWFzayA9IHRoaXMtPmhpZGRlbi0+c2htLmJsdWVfbWFzazsKKwljdXJyZW50LT5mb3JtYXQtPkFtYXNrID0gdGhpcy0+aGlkZGVuLT5zaG0uYWxwaGFfbWFzazsKKwljdXJyZW50LT5mb3JtYXQtPlJzaGlmdCA9IHRoaXMtPmhpZGRlbi0+c2htLnJlZF9zaGlmdDsKKwljdXJyZW50LT5mb3JtYXQtPkdzaGlmdCA9IHRoaXMtPmhpZGRlbi0+c2htLmdyZWVuX3NoaWZ0OworCWN1cnJlbnQtPmZvcm1hdC0+QnNoaWZ0ID0gdGhpcy0+aGlkZGVuLT5zaG0uYmx1ZV9zaGlmdDsKKwljdXJyZW50LT5mb3JtYXQtPkFzaGlmdCA9IHRoaXMtPmhpZGRlbi0+c2htLmFscGhhX3NoaWZ0OworCWN1cnJlbnQtPmZvcm1hdC0+Umxvc3MgPSA4IC0gdGhpcy0+aGlkZGVuLT5zaG0ucmVkX2xlbmd0aDsKKwljdXJyZW50LT5mb3JtYXQtPkdsb3NzID0gOCAtIHRoaXMtPmhpZGRlbi0+c2htLmdyZWVuX2xlbmd0aDsKKwljdXJyZW50LT5mb3JtYXQtPkJsb3NzID0gOCAtIHRoaXMtPmhpZGRlbi0+c2htLmJsdWVfbGVuZ3RoOworCWN1cnJlbnQtPmZvcm1hdC0+QWxvc3MgPSA4IC0gdGhpcy0+aGlkZGVuLT5zaG0uYWxwaGFfbGVuZ3RoOworCisJLyogRHJhdyB0aGUgYXBwICovCisJcGdVcGRhdGUoKTsKKworCS8qIFdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4oY3VycmVudCk7Cit9CisKKy8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCitzdGF0aWMgaW50IFBHX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oLTEpOworfQorc3RhdGljIHZvaWQgUEdfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCisvKiBXZSBuZWVkIHRvIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2Ugb24gcGFnZSBmbGlwcGVkIGRpc3BsYXlzICovCitzdGF0aWMgaW50IFBHX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgUEdfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIFBHX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKyAgICAgICAgaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IG51bXJlY3RzOyBpKyspIHsKKwkgICAgICAgIGlmIChyZWN0c1tpXS53IDw9IDAgfHwgcmVjdHNbaV0uaCA8PSAwKQorCQkgIGNvbnRpbnVlOworCisJCS8qIFNjaGVkdWxlIGFuIGluY3JlbWVudGFsIHVwZGF0ZSBmb3IgdGhpcyByZWN0YW5nbGUsIHVzaW5nCisJCSAqIHRoZSBjYW52YXMgZ3JvcG5vZGVzIHdlJ3ZlIGxvYWRlZCBiZWZvcmVoYW5kLgorCQkgKi8KKwkJcGdXcml0ZUNtZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHQ0FOVkFTX0ZJTkRHUk9QLCAxLCAwKTsKKwkJcGdXcml0ZUNtZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHQ0FOVkFTX01PVkVHUk9QLCA0LCAKKwkJCSAgIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksCisJCQkgICByZWN0c1tpXS53LCByZWN0c1tpXS5oKTsKKwkJcGdXcml0ZUNtZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHQ0FOVkFTX0ZJTkRHUk9QLCAxLCAxKTsKKwkJcGdXcml0ZUNtZCh0aGlzLT5oaWRkZW4tPndDYW52YXMsIFBHQ0FOVkFTX01PVkVHUk9QLCA0LCAKKwkJCSAgIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksCisJCQkgICByZWN0c1tpXS53LCByZWN0c1tpXS5oKTsKKwkJCisJCS8qIEdvIHBlcmZvcm0gdGhlIHVwZGF0ZSAqLworCQlwZ1dyaXRlQ21kKHRoaXMtPmhpZGRlbi0+d0NhbnZhcywgUEdDQU5WQVNfSU5DUkVNRU5UQUwsIDApOworCQlwZ1N1YlVwZGF0ZSh0aGlzLT5oaWRkZW4tPndDYW52YXMpOworCX0KK30KKworaW50IFBHX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKK3sKKwkvKiBkbyBub3RoaW5nIG9mIG5vdGUuICovCisJcmV0dXJuKDEpOworfQorCisvKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKKyAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KKyovCit2b2lkIFBHX1ZpZGVvUXVpdChfVEhJUykKK3sKKwlpZiAodGhpcy0+c2NyZWVuLT5waXhlbHMgIT0gTlVMTCkKKwl7CisJCXNobWR0KHRoaXMtPnNjcmVlbi0+cGl4ZWxzKTsKKwkJdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOworCQlwZ0RlbGV0ZSh0aGlzLT5oaWRkZW4tPmJpdG1hcCk7CisJfQorCXBnRGVsZXRlKHRoaXMtPmhpZGRlbi0+d0NhbnZhcyk7CisJcGdEZWxldGUodGhpcy0+aGlkZGVuLT53QXBwKTsKK30KKwordm9pZCBQR19TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKK3sKKyAgICAgICAgaWYgKHRpdGxlICE9IE5VTEwpCisJICBwZ1JlcGxhY2VUZXh0KHRoaXMtPmhpZGRlbi0+d0FwcCwgdGl0bGUpOworCXBnVXBkYXRlKCk7Cit9CisKKy8qIEZJWE1FOiBUaGUgY3Vyc29yIHN0dWZmIGlzbid0IGltcGxlbWVudGVkIHlldCEgKi8KKworV01jdXJzb3IgKiBQR19DcmVhdGVXTUN1cnNvciAoX1RISVMsVWludDggKiBkYXRhLCBVaW50OCAqIG1hc2ssIAorCQkJICAgICAgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKK3sKKyAgICAgICAgc3RhdGljIFdNY3Vyc29yIGR1bW15OworICAgICAgICByZXR1cm4gJmR1bW15OworfQorCit2b2lkIFBHX0ZyZWVXTUN1cnNvciAoX1RISVMsIFdNY3Vyc29yICogY3Vyc29yKQoreworfQorCit2b2lkIFBHX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KQoreworfQorCitpbnQgUEdfU2hvd1dNQ3Vyc29yIChfVEhJUywgV01jdXJzb3IgKiBjdXJzb3IpCit7CisgICAgICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waWNvZ3VpL1NETF9wZ3ZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BpY29ndWkvU0RMX3BndmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTVmODZiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9waWNvZ3VpL1NETF9wZ3ZpZGVvLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworCisgICAgTWljYWggRG93dHkKKyAgICBtaWNhaGpkQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9wZ3ZpZGVvX2gKKyNkZWZpbmUgX1NETF9wZ3ZpZGVvX2gKKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisjaW5jbHVkZSA8cGljb2d1aS5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcworCisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCisKK3N0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7CisgIHBnaGFuZGxlIHdBcHAsIHdDYW52YXM7ICAgICAgICAvKiBQaWNvR1VJIHdpZGdldHMgKi8KKyAgcGdoYW5kbGUgYml0bWFwOworICBzdHJ1Y3QgcGdzaG1iaXRtYXAgc2htOyAgICAgICAgLyogc2hhcmVkIG1lbW9yeSBpbmZvICovCisgIHN0cnVjdCBwZ21vZGVpbmZvIG1pOyAgICAgICAgICAvKiBQaWNvR1VJIHZpZGVvIG1vZGUgaW5mbyBzdHJ1Y3R1cmUgKi8KK307CisKKyNlbmRpZiAvKiBfU0RMX3BndmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3NldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4NDJhZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzZXZlbnRzLmMKQEAgLTAsMCArMSw5NzcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBIYW5kbGUgdGhlIGV2ZW50IHN0cmVhbSwgY29udmVydGluZyBjb25zb2xlIGV2ZW50cyBpbnRvIFNETCBldmVudHMgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKiBGb3IgcGFyc2luZyAvcHJvYyAqLworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxsaW51eC92dC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KKworI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9nc3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2dzZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfZ3NrZXlzLmgiCisKKyNpZm5kZWYgR1BNX05PREVfRklGTworI2RlZmluZSBHUE1fTk9ERV9GSUZPCSIvZGV2L2dwbWRhdGEiCisjZW5kaWYKKworLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlcyBmcm9tIGEgY29uc29sZSBzY2FuY29kZSB0byBhIFNETCBrZXlzeW0gKi8KKyNkZWZpbmUgTlVNX1ZHQUtFWU1BUFMJKDE8PEtHX0NBUFNTSElGVCkKK3N0YXRpYyBVaW50MTYgdmdhX2tleW1hcFtOVU1fVkdBS0VZTUFQU11bTlJfS0VZU107CitzdGF0aWMgU0RMS2V5IGtleW1hcFsxMjhdOworc3RhdGljIFVpbnQxNiBrZXltYXBfdGVtcFsxMjhdOyAvKiBvbmx5IHVzZWQgYXQgc3RhcnR1cCAqLworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSk7CisKKy8qIFVnaCwgd2UgaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGtlcm5lbCdzIGtleXN5bSBtYXBwaW5nIGNvZGUuLi4KKyAgIE9oLCBpdCdzIG5vdCBzbyBiYWQuIDotKQorCisgICBGSVhNRTogQWRkIGtleWJvYXJkIExFRCBoYW5kbGluZyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIEdTX3ZnYWluaXRrZXltYXBzKGludCBmZCkKK3sKKwlzdHJ1Y3Qga2JlbnRyeSBlbnRyeTsKKwlpbnQgbWFwLCBpOworCisJLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgYXJlIHBhc3NlZCBhIGNsb3NlZCBrZXlib2FyZCAqLworCWlmICggZmQgPCAwICkgeworCQlyZXR1cm47CisJfQorCisJLyogTG9hZCBhbGwgdGhlIGtleXN5bSBtYXBwaW5ncyAqLworCWZvciAoIG1hcD0wOyBtYXA8TlVNX1ZHQUtFWU1BUFM7ICsrbWFwICkgeworCQlTRExfbWVtc2V0KHZnYV9rZXltYXBbbWFwXSwgMCwgTlJfS0VZUypzaXplb2YoVWludDE2KSk7CisJCWZvciAoIGk9MDsgaTxOUl9LRVlTOyArK2kgKSB7CisJCQllbnRyeS5rYl90YWJsZSA9IG1hcDsKKwkJCWVudHJ5LmtiX2luZGV4ID0gaTsKKwkJCWlmICggaW9jdGwoZmQsIEtER0tCRU5ULCAmZW50cnkpID09IDAgKSB7CisJCQkJLyogZmlsbCBrZXl0ZW1wLiBUaGlzIHJlcGxhY2VzIFNETF9mYmtleXMuaCAqLworCQkJCWlmICggKG1hcCA9PSAwKSAmJiAoaTwxMjgpICkgeworCQkJCQlrZXltYXBfdGVtcFtpXSA9IGVudHJ5LmtiX3ZhbHVlOworCQkJCX0KKwkJCQkvKiBUaGUgIkVudGVyIiBrZXkgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKwkJCQlpZiAoIGVudHJ5LmtiX3ZhbHVlID09IEtfRU5URVIgKSB7CisJCQkJCWVudHJ5LmtiX3ZhbHVlID0gSyhLVF9BU0NJSSwxMyk7CisJCQkJfQorCQkJCS8qIEhhbmRsZSBudW1wYWQgc3BlY2lhbGx5IGFzIHdlbGwgKi8KKwkJCQlpZiAoIEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX1BBRCApIHsKKwkJCQkJc3dpdGNoICggZW50cnkua2JfdmFsdWUgKSB7CisJCQkJCWNhc2UgS19QMDoKKwkJCQkJY2FzZSBLX1AxOgorCQkJCQljYXNlIEtfUDI6CisJCQkJCWNhc2UgS19QMzoKKwkJCQkJY2FzZSBLX1A0OgorCQkJCQljYXNlIEtfUDU6CisJCQkJCWNhc2UgS19QNjoKKwkJCQkJY2FzZSBLX1A3OgorCQkJCQljYXNlIEtfUDg6CisJCQkJCWNhc2UgS19QOToKKwkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1lbnRyeS5rYl92YWx1ZTsKKwkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXSs9ICcwJzsKKwkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgS19QUExVUzoKKwkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcrJyk7CisJCQkJCQlicmVhazsKKwkJCQkJCQkJCQljYXNlIEtfUE1JTlVTOgorCQkJCQkJdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJy0nKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgS19QU1RBUjoKKwkJCQkJCXZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcqJyk7CisJCQkJCQlicmVhazsKKwkJCQkJCQkJCQljYXNlIEtfUFNMQVNIOgorCQkJCQkJdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJy8nKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgS19QRU5URVI6CisJCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnXHInKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgS19QQ09NTUE6CisJCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLCcpOworCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJY2FzZSBLX1BET1Q6CisJCQkJCQl2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLicpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBEbyB0aGUgbm9ybWFsIGtleSB0cmFuc2xhdGlvbiAqLworCQkJCWlmICggKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0xBVElOKSB8fAorCQkJCQkgKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0FTQ0lJKSB8fAorCQkJCQkgKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0xFVFRFUikgKSB7CisJCQkJCXZnYV9rZXltYXBbbWFwXVtpXSA9IGVudHJ5LmtiX3ZhbHVlOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworaW50IEdTX0luR3JhcGhpY3NNb2RlKF9USElTKQoreworCXJldHVybigoa2V5Ym9hcmRfZmQgPj0gMCkgJiYgKHNhdmVkX2tiZF9tb2RlID49IDApKTsKK30KKworaW50IEdTX0VudGVyR3JhcGhpY3NNb2RlKF9USElTKQoreworCXN0cnVjdCB0ZXJtaW9zIGtleWJvYXJkX3Rlcm1pb3M7CisKKwkvKiBTZXQgbWVkaXVtLXJhdyBrZXlib2FyZCBtb2RlICovCisJaWYgKCAoa2V5Ym9hcmRfZmQgPj0gMCkgJiYgIUdTX0luR3JhcGhpY3NNb2RlKHRoaXMpICkgeworCisJCS8qIFN3aXRjaCB0byB0aGUgY29ycmVjdCB2aXJ0dWFsIHRlcm1pbmFsICovCisJCWlmICggY3VycmVudF92dCA+IDAgKSB7CisJCQlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXRlOworCisJCQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBWVF9HRVRTVEFURSwgJnZ0c3RhdGUpID09IDAgKSB7CisJCQkJc2F2ZWRfdnQgPSB2dHN0YXRlLnZfYWN0aXZlOworCQkJfQorCQkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgVlRfQUNUSVZBVEUsIGN1cnJlbnRfdnQpID09IDAgKSB7CisJCQkJaW9jdGwoa2V5Ym9hcmRfZmQsIFZUX1dBSVRBQ1RJVkUsIGN1cnJlbnRfdnQpOworCQkJfQorCQl9CisKKwkJLyogU2V0IHRoZSB0ZXJtaW5hbCBpbnB1dCBtb2RlICovCisJCWlmICggdGNnZXRhdHRyKGtleWJvYXJkX2ZkLCAmc2F2ZWRfa2JkX3Rlcm1pb3MpIDwgMCApIHsKKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGdldCB0ZXJtaW5hbCBhdHRyaWJ1dGVzIik7CisJCQlpZiAoIGtleWJvYXJkX2ZkID4gMCApIHsKKwkJCQljbG9zZShrZXlib2FyZF9mZCk7CisJCQl9CisJCQlrZXlib2FyZF9mZCA9IC0xOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBLREdLQk1PREUsICZzYXZlZF9rYmRfbW9kZSkgPCAwICkgeworCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gZ2V0IGN1cnJlbnQga2V5Ym9hcmQgbW9kZSIpOworCQkJaWYgKCBrZXlib2FyZF9mZCA+IDAgKSB7CisJCQkJY2xvc2Uoa2V5Ym9hcmRfZmQpOworCQkJfQorCQkJa2V5Ym9hcmRfZmQgPSAtMTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJa2V5Ym9hcmRfdGVybWlvcyA9IHNhdmVkX2tiZF90ZXJtaW9zOworCQlrZXlib2FyZF90ZXJtaW9zLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgSVNJRyk7CisJCWtleWJvYXJkX3Rlcm1pb3MuY19pZmxhZyAmPSB+KElTVFJJUCB8IElHTkNSIHwgSUNSTkwgfCBJTkxDUiB8IElYT0ZGIHwgSVhPTik7CisJCWtleWJvYXJkX3Rlcm1pb3MuY19jY1tWTUlOXSA9IDA7CisJCWtleWJvYXJkX3Rlcm1pb3MuY19jY1tWVElNRV0gPSAwOworCQlpZiAodGNzZXRhdHRyKGtleWJvYXJkX2ZkLCBUQ1NBRkxVU0gsICZrZXlib2FyZF90ZXJtaW9zKSA8IDApIHsKKwkJCUdTX0Nsb3NlS2V5Ym9hcmQodGhpcyk7CisJCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBzZXQgdGVybWluYWwgYXR0cmlidXRlcyIpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQkvKiBUaGlzIHdpbGwgZmFpbCBpZiB3ZSBhcmVuJ3Qgcm9vdCBvciB0aGlzIGlzbid0IG91ciB0dHkgKi8KKwkJaWYgKCBpb2N0bChrZXlib2FyZF9mZCwgS0RTS0JNT0RFLCBLX01FRElVTVJBVykgPCAwICkgeworCQkJR1NfQ2xvc2VLZXlib2FyZCh0aGlzKTsKKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIHNldCBrZXlib2FyZCBpbiByYXcgbW9kZSIpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBLRFNFVE1PREUsIEtEX0dSQVBISUNTKSA8IDAgKSB7CisJCQlHU19DbG9zZUtleWJvYXJkKHRoaXMpOworCQkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gc2V0IGtleWJvYXJkIGluIGdyYXBoaWNzIG1vZGUiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisJcmV0dXJuKGtleWJvYXJkX2ZkKTsKK30KKwordm9pZCBHU19MZWF2ZUdyYXBoaWNzTW9kZShfVEhJUykKK3sKKwlpZiAoIEdTX0luR3JhcGhpY3NNb2RlKHRoaXMpICkgeworCQlpb2N0bChrZXlib2FyZF9mZCwgS0RTRVRNT0RFLCBLRF9URVhUKTsKKwkJaW9jdGwoa2V5Ym9hcmRfZmQsIEtEU0tCTU9ERSwgc2F2ZWRfa2JkX21vZGUpOworCQl0Y3NldGF0dHIoa2V5Ym9hcmRfZmQsIFRDU0FGTFVTSCwgJnNhdmVkX2tiZF90ZXJtaW9zKTsKKwkJc2F2ZWRfa2JkX21vZGUgPSAtMTsKKworCQkvKiBIZWFkIGJhY2sgb3ZlciB0byB0aGUgb3JpZ2luYWwgdmlydHVhbCB0ZXJtaW5hbCAqLworCQlpZiAoIHNhdmVkX3Z0ID4gMCApIHsKKwkJCWlvY3RsKGtleWJvYXJkX2ZkLCBWVF9BQ1RJVkFURSwgc2F2ZWRfdnQpOworCQl9CisJfQorfQorCit2b2lkIEdTX0Nsb3NlS2V5Ym9hcmQoX1RISVMpCit7CisJaWYgKCBrZXlib2FyZF9mZCA+PSAwICkgeworCQlHU19MZWF2ZUdyYXBoaWNzTW9kZSh0aGlzKTsKKwkJaWYgKCBrZXlib2FyZF9mZCA+IDAgKSB7CisJCQljbG9zZShrZXlib2FyZF9mZCk7CisJCX0KKwl9CisJa2V5Ym9hcmRfZmQgPSAtMTsKK30KKworaW50IEdTX09wZW5LZXlib2FyZChfVEhJUykKK3sKKwkvKiBPcGVuIG9ubHkgaWYgbm90IGFscmVhZHkgb3BlbmVkICovCisgCWlmICgga2V5Ym9hcmRfZmQgPCAwICkgeworCQljaGFyICp0dHkwW10gPSB7ICIvZGV2L3R0eTAiLCAiL2Rldi92Yy8wIiwgTlVMTCB9OworCQljaGFyICp2Y3NbXSA9IHsgIi9kZXYvdmMvJWQiLCAiL2Rldi90dHklZCIsIE5VTEwgfTsKKwkJaW50IGksIHR0eTBfZmQ7CisKKwkJLyogVHJ5IHRvIHF1ZXJ5IGZvciBhIGZyZWUgdmlydHVhbCB0ZXJtaW5hbCAqLworCQl0dHkwX2ZkID0gLTE7CisJCWZvciAoIGk9MDsgdHR5MFtpXSAmJiAodHR5MF9mZCA8IDApOyArK2kgKSB7CisJCQl0dHkwX2ZkID0gb3Blbih0dHkwW2ldLCBPX1dST05MWSwgMCk7CisJCX0KKwkJaWYgKCB0dHkwX2ZkIDwgMCApIHsKKwkJCXR0eTBfZmQgPSBkdXAoMCk7IC8qIE1heWJlIHN0ZGluIGlzIGEgVlQ/ICovCisJCX0KKwkJaW9jdGwodHR5MF9mZCwgVlRfT1BFTlFSWSwgJmN1cnJlbnRfdnQpOworCQljbG9zZSh0dHkwX2ZkKTsKKwkJaWYgKCAoZ2V0ZXVpZCgpID09IDApICYmIChjdXJyZW50X3Z0ID4gMCkgKSB7CisJCQlmb3IgKCBpPTA7IHZjc1tpXSAmJiAoa2V5Ym9hcmRfZmQgPCAwKTsgKytpICkgeworCQkJCWNoYXIgdnRwYXRoWzEyXTsKKworCQkJCVNETF9zbnByaW50Zih2dHBhdGgsIFNETF9hcnJheXNpemUodnRwYXRoKSwgdmNzW2ldLCBjdXJyZW50X3Z0KTsKKwkJCQlrZXlib2FyZF9mZCA9IG9wZW4odnRwYXRoLCBPX1JEV1IsIDApOworI2lmZGVmIERFQlVHX0tFWUJPQVJECisJCQkJZnByaW50ZihzdGRlcnIsICJ2dHBhdGggPSAlcywgZmQgPSAlZFxuIiwKKwkJCQkJdnRwYXRoLCBrZXlib2FyZF9mZCk7CisjZW5kaWYgLyogREVCVUdfS0VZQk9BUkQgKi8KKworCQkJCS8qIFRoaXMgbmVlZHMgdG8gYmUgb3VyIGNvbnRyb2xsaW5nIHR0eQorCQkJCSAgIHNvIHRoYXQgdGhlIGtlcm5lbCBpb2N0bCgpIGNhbGxzIHdvcmsKKwkJCQkqLworCQkJCWlmICgga2V5Ym9hcmRfZmQgPj0gMCApIHsKKwkJCQkJdHR5MF9mZCA9IG9wZW4oIi9kZXYvdHR5IiwgT19SRFdSLCAwKTsKKwkJCQkJaWYgKCB0dHkwX2ZkID49IDAgKSB7CisJCQkJCQlpb2N0bCh0dHkwX2ZkLCBUSU9DTk9UVFksIDApOworCQkJCQkJY2xvc2UodHR5MF9mZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKyAJCWlmICgga2V5Ym9hcmRfZmQgPCAwICkgeworCQkJLyogTGFzdCByZXNvcnQsIG1heWJlIG91ciB0dHkgaXMgYSB1c2FibGUgVlQgKi8KKwkJCWN1cnJlbnRfdnQgPSAwOworCQkJa2V5Ym9hcmRfZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUik7CisgCQl9CisjaWZkZWYgREVCVUdfS0VZQk9BUkQKKwkJZnByaW50ZihzdGRlcnIsICJDdXJyZW50IFZUOiAlZFxuIiwgY3VycmVudF92dCk7CisjZW5kaWYKKyAJCXNhdmVkX2tiZF9tb2RlID0gLTE7CisKKwkJLyogTWFrZSBzdXJlIHRoYXQgb3VyIGlucHV0IGlzIGEgY29uc29sZSB0ZXJtaW5hbCAqLworCQl7IGludCBkdW1teTsKKwkJICBpZiAoIGlvY3RsKGtleWJvYXJkX2ZkLCBLREdLQk1PREUsICZkdW1teSkgPCAwICkgeworCQkJY2xvc2Uoa2V5Ym9hcmRfZmQpOworCQkJa2V5Ym9hcmRfZmQgPSAtMTsKKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gYSBjb25zb2xlIHRlcm1pbmFsIik7CisJCSAgfQorCQl9CisKKwkJLyogU2V0IHVwIGtleW1hcCAqLworCQlHU192Z2Fpbml0a2V5bWFwcyhrZXlib2FyZF9mZCk7CisgCX0KKyAJcmV0dXJuKGtleWJvYXJkX2ZkKTsKK30KKworc3RhdGljIGVudW0geworCU1PVVNFX05PTkUgPSAtMSwKKwlNT1VTRV9HUE0sCS8qIE5vdGU6IEdQTSB1c2VzIHRoZSBNU0MgcHJvdG9jb2wgKi8KKwlNT1VTRV9QUzIsCisJTU9VU0VfSU1QUzIsCisJTU9VU0VfTVMsCisJTU9VU0VfQk0sCisJTlVNX01PVVNFX0RSVlMKK30gbW91c2VfZHJ2ID0gTU9VU0VfTk9ORTsKKwordm9pZCBHU19DbG9zZU1vdXNlKF9USElTKQoreworCWlmICggbW91c2VfZmQgPiAwICkgeworCQljbG9zZShtb3VzZV9mZCk7CisJfQorCW1vdXNlX2ZkID0gLTE7Cit9CisKKy8qIFJldHVybnMgcHJvY2Vzc2VzIGxpc3RlZCBpbiAvcHJvYyB3aXRoIHRoZSBkZXNpcmVkIG5hbWUgKi8KK3N0YXRpYyBpbnQgZmluZF9waWQoRElSICpwcm9jLCBjb25zdCBjaGFyICp3YW50ZWRfbmFtZSkKK3sKKwlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwlpbnQgcGlkOworCisJLyogRmlyc3Qgc2NhbiBwcm9jIGZvciB0aGUgZ3BtIHByb2Nlc3MgKi8KKwlwaWQgPSAwOworCXdoaWxlICggKHBpZCA9PSAwKSAmJiAoKGVudHJ5PXJlYWRkaXIocHJvYykpICE9IE5VTEwpICkgeworCQlpZiAoIGlzZGlnaXQoZW50cnktPmRfbmFtZVswXSkgKSB7CisJCQlGSUxFICpzdGF0dXM7CisJCQljaGFyIHBhdGhbUEFUSF9NQVhdOworCQkJY2hhciBuYW1lW1BBVEhfTUFYXTsKKworCQkJU0RMX3NucHJpbnRmKHBhdGgsIFNETF9hcnJheXNpemUocGF0aCksICIvcHJvYy8lcy9zdGF0dXMiLCBlbnRyeS0+ZF9uYW1lKTsKKwkJCXN0YXR1cz1mb3BlbihwYXRoLCAiciIpOworCQkJaWYgKCBzdGF0dXMgKSB7CisJCQkJbmFtZVswXSA9ICdcMCc7CisJCQkJZnNjYW5mKHN0YXR1cywgIk5hbWU6ICVzIiwgbmFtZSk7CisJCQkJaWYgKCBTRExfc3RyY21wKG5hbWUsIHdhbnRlZF9uYW1lKSA9PSAwICkgeworCQkJCQlwaWQgPSBhdG9pKGVudHJ5LT5kX25hbWUpOworCQkJCX0KKwkJCQlmY2xvc2Uoc3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcGlkOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgL2Rldi9ncG1kYXRhIGlzIGJlaW5nIHdyaXR0ZW4gdG8gYnkgZ3BtICovCitzdGF0aWMgaW50IGdwbV9hdmFpbGFibGUodm9pZCkKK3sKKwlpbnQgYXZhaWxhYmxlOworCURJUiAqcHJvYzsKKwlpbnQgcGlkOworCWludCBjbWRsaW5lLCBsZW4sIGFyZ2xlbjsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNoYXIgYXJnc1tQQVRIX01BWF0sICphcmc7CisKKwkvKiBEb24ndCBib3RoZXIgbG9va2luZyBpZiB0aGUgZmlmbyBpc24ndCB0aGVyZSAqLworCWlmICggYWNjZXNzKEdQTV9OT0RFX0ZJRk8sIEZfT0spIDwgMCApIHsKKwkJcmV0dXJuKDApOworCX0KKworCWF2YWlsYWJsZSA9IDA7CisJcHJvYyA9IG9wZW5kaXIoIi9wcm9jIik7CisJaWYgKCBwcm9jICkgeworCQl3aGlsZSAoIChwaWQ9ZmluZF9waWQocHJvYywgImdwbSIpKSA+IDAgKSB7CisJCQlTRExfc25wcmludGYocGF0aCwgU0RMX2FycmF5c2l6ZShwYXRoKSwgIi9wcm9jLyVkL2NtZGxpbmUiLCBwaWQpOworCQkJY21kbGluZSA9IG9wZW4ocGF0aCwgT19SRE9OTFksIDApOworCQkJaWYgKCBjbWRsaW5lID49IDAgKSB7CisJCQkJbGVuID0gcmVhZChjbWRsaW5lLCBhcmdzLCBzaXplb2YoYXJncykpOworCQkJCWFyZyA9IGFyZ3M7CisJCQkJd2hpbGUgKCBsZW4gPiAwICkgeworCQkJCQlpZiAoIFNETF9zdHJjbXAoYXJnLCAiLVIiKSA9PSAwICkgeworCQkJCQkJYXZhaWxhYmxlID0gMTsKKwkJCQkJfQorCQkJCQlhcmdsZW4gPSBTRExfc3RybGVuKGFyZykrMTsKKwkJCQkJbGVuIC09IGFyZ2xlbjsKKwkJCQkJYXJnICs9IGFyZ2xlbjsKKwkJCQl9CisJCQkJY2xvc2UoY21kbGluZSk7CisJCQl9CisJCX0KKwkJY2xvc2VkaXIocHJvYyk7CisJfQorCXJldHVybiBhdmFpbGFibGU7Cit9CisKKworLyogcmNnMDYxMTIwMDEgU2V0IHVwIElNUFMvMiBtb2RlLCBpZiBwb3NzaWJsZS4gVGhpcyBnaXZlcworICogIHVzIGFjY2VzcyB0byB0aGUgbW91c2V3aGVlbCwgZXRjLiBSZXR1cm5zIHplcm8gaWYKKyAqICB3cml0ZXMgdG8gZGV2aWNlIGZhaWxlZCwgYnV0IHlvdSBzdGlsbCBuZWVkIHRvIHF1ZXJ5IHRoZQorICogIGRldmljZSB0byBzZWUgd2hpY2ggbW9kZSBpdCdzIGFjdHVhbGx5IGluLgorICovCitzdGF0aWMgaW50IHNldF9pbXBzMl9tb2RlKGludCBmZCkKK3sKKwkvKiBJZiB5b3Ugd2FudGVkIHRvIGNvbnRyb2wgdGhlIG1vdXNlIG1vZGUgKGFuZCB3ZSBkbyA6KSAgKSAuLi4KKwkJU2V0IElNUFMvMiBwcm90b2NvbDoKKwkJCXsweGYzLDIwMCwweGYzLDEwMCwweGYzLDgwfQorCQlSZXNldCBtb3VzZSBkZXZpY2U6CisJCQl7MHhGRn0KKwkqLworCVVpbnQ4IHNldF9pbXBzMltdID0gezB4ZjMsIDIwMCwgMHhmMywgMTAwLCAweGYzLCA4MH07CisJVWludDggcmVzZXQgPSAweGZmOworCWZkX3NldCBmZHNldDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICggd3JpdGUoZmQsICZzZXRfaW1wczIsIHNpemVvZihzZXRfaW1wczIpKSA9PSBzaXplb2Yoc2V0X2ltcHMyKSApIHsKKwkJaWYgKHdyaXRlKGZkLCAmcmVzZXQsIHNpemVvZiAocmVzZXQpKSA9PSBzaXplb2YgKHJlc2V0KSApIHsKKwkJCXJldHZhbCA9IDE7CisJCX0KKwl9CisKKwkvKiBHZXQgcmlkIG9mIGFueSBjaGF0dGVyIGZyb20gdGhlIGFib3ZlICovCisJRkRfWkVSTygmZmRzZXQpOworCUZEX1NFVChmZCwgJmZkc2V0KTsKKwl0di50dl9zZWMgPSAwOworCXR2LnR2X3VzZWMgPSAwOworCXdoaWxlICggc2VsZWN0KGZkKzEsICZmZHNldCwgMCwgMCwgJnR2KSA+IDAgKSB7CisJCWNoYXIgdGVtcFszMl07CisJCXJlYWQoZmQsIHRlbXAsIHNpemVvZih0ZW1wKSk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vdXNlIHVzZXMgdGhlIElNUFMvMiBwcm90b2NvbCAqLworc3RhdGljIGludCBkZXRlY3RfaW1wczIoaW50IGZkKQoreworCWludCBpbXBzMjsKKworCWltcHMyID0gMDsKKworCWlmICggU0RMX2dldGVudigiU0RMX01PVVNFREVWX0lNUFMyIikgKSB7CisJCWltcHMyID0gMTsKKwl9CisJaWYgKCAhIGltcHMyICkgeworCQlVaW50OCBxdWVyeV9wczIgPSAweEYyOworCQlmZF9zZXQgZmRzZXQ7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCS8qIEdldCByaWQgb2YgYW55IG1vdXNlIG1vdGlvbiBub2lzZSAqLworCQlGRF9aRVJPKCZmZHNldCk7CisJCUZEX1NFVChmZCwgJmZkc2V0KTsKKwkJdHYudHZfc2VjID0gMDsKKwkJdHYudHZfdXNlYyA9IDA7CisJCXdoaWxlICggc2VsZWN0KGZkKzEsICZmZHNldCwgMCwgMCwgJnR2KSA+IDAgKSB7CisJCQljaGFyIHRlbXBbMzJdOworCQkJcmVhZChmZCwgdGVtcCwgc2l6ZW9mKHRlbXApKTsKKwkJfQorCisgICAJCS8qIFF1ZXJ5IGZvciB0aGUgdHlwZSBvZiBtb3VzZSBwcm90b2NvbCAqLworICAgCQlpZiAoIHdyaXRlKGZkLCAmcXVlcnlfcHMyLCBzaXplb2YgKHF1ZXJ5X3BzMikpID09IHNpemVvZiAocXVlcnlfcHMyKSkgeworICAgCQkJVWludDggY2ggPSAwOworCisJCQkvKiBHZXQgdGhlIG1vdXNlIHByb3RvY29sIHJlc3BvbnNlICovCisJCQlkbyB7CisJCQkJRkRfWkVSTygmZmRzZXQpOworCQkJCUZEX1NFVChmZCwgJmZkc2V0KTsKKwkJCQl0di50dl9zZWMgPSAxOworCQkJCXR2LnR2X3VzZWMgPSAwOworCQkJCWlmICggc2VsZWN0KGZkKzEsICZmZHNldCwgMCwgMCwgJnR2KSA8IDEgKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gd2hpbGUgKCAocmVhZChmZCwgJmNoLCBzaXplb2YgKGNoKSkgPT0gc2l6ZW9mIChjaCkpICYmCisJCQkgICAgICAgICAgKChjaCA9PSAweEZBKSB8fCAoY2ggPT0gMHhBQSkpICk7CisKKwkJCS8qIEV4cGVyaW1lbnRhbCB2YWx1ZXMgKExvZ2l0ZWNoIHdoZWVsbW91c2UpICovCisjaWZkZWYgREVCVUdfTU9VU0UKK2ZwcmludGYoc3RkZXJyLCAiTGFzdCBtb3VzZSBtb2RlOiAweCV4XG4iLCBjaCk7CisjZW5kaWYKKwkJCWlmICggY2ggPT0gMyApIHsKKwkJCQlpbXBzMiA9IDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGltcHMyOworfQorCitpbnQgR1NfT3Blbk1vdXNlKF9USElTKQoreworCWludCBpOworCWNvbnN0IGNoYXIgKm1vdXNlZGV2OworCWNvbnN0IGNoYXIgKm1vdXNlZHJ2OworCisJbW91c2VkcnYgPSBTRExfZ2V0ZW52KCJTRExfTU9VU0VEUlYiKTsKKwltb3VzZWRldiA9IFNETF9nZXRlbnYoIlNETF9NT1VTRURFViIpOworCW1vdXNlX2ZkID0gLTE7CisKKwkvKiBTVEQgTUlDRSAqLworCisJaWYgKCBtb3VzZWRldiA9PSBOVUxMICkgeworCQkvKiBGSVhNRSBzb21lZGF5Li4uIGFsbG93IG11bHRpcGxlIG1pY2UgaW4gdGhpcyBkcml2ZXIgKi8KKwkJY2hhciAqcHMybWljZVtdID0geworCQkgICAgIi9kZXYvaW5wdXQvbWljZSIsICIvZGV2L3VzYm1vdXNlIiwgIi9kZXYvcHNhdXgiLCBOVUxMCisJCX07CisJCS8qIEZpcnN0IHRyeSB0byB1c2UgR1BNIGluIHJlcGVhdGVyIG1vZGUgKi8KKwkJaWYgKCBtb3VzZV9mZCA8IDAgKSB7CisJCQlpZiAoIGdwbV9hdmFpbGFibGUoKSApIHsKKwkJCQltb3VzZV9mZCA9IG9wZW4oR1BNX05PREVfRklGTywgT19SRE9OTFksIDApOworCQkJCWlmICggbW91c2VfZmQgPj0gMCApIHsKKyNpZmRlZiBERUJVR19NT1VTRQorZnByaW50ZihzdGRlcnIsICJVc2luZyBHUE0gbW91c2VcbiIpOworI2VuZGlmCisJCQkJCW1vdXNlX2RydiA9IE1PVVNFX0dQTTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogTm93IHRyeSB0byB1c2UgYSBtb2Rlcm4gUFMvMiBtb3VzZSAqLworCQlmb3IgKCBpPTA7IChtb3VzZV9mZCA8IDApICYmIHBzMm1pY2VbaV07ICsraSApIHsKKwkJCW1vdXNlX2ZkID0gb3BlbihwczJtaWNlW2ldLCBPX1JEV1IsIDApOworCQkJaWYgKG1vdXNlX2ZkIDwgMCkgeworCQkJCW1vdXNlX2ZkID0gb3BlbihwczJtaWNlW2ldLCBPX1JET05MWSwgMCk7CisJCQl9CisJCQlpZiAobW91c2VfZmQgPj0gMCkgeworCQkJCS8qIHJjZzA2MTEyMDAxIEF0dGVtcHQgdG8gc2V0IElNUFMvMiBtb2RlICovCisJCQkJaWYgKCBpID09IDAgKSB7CisJCQkJCXNldF9pbXBzMl9tb2RlKG1vdXNlX2ZkKTsKKwkJCQl9CisJCQkJaWYgKGRldGVjdF9pbXBzMihtb3VzZV9mZCkpIHsKKyNpZmRlZiBERUJVR19NT1VTRQorZnByaW50ZihzdGRlcnIsICJVc2luZyBJTVBTMiBtb3VzZVxuIik7CisjZW5kaWYKKwkJCQkJbW91c2VfZHJ2ID0gTU9VU0VfSU1QUzI7CisJCQkJfSBlbHNlIHsKKwkJCQkJbW91c2VfZHJ2ID0gTU9VU0VfUFMyOworI2lmZGVmIERFQlVHX01PVVNFCitmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIFBTMiBtb3VzZVxuIik7CisjZW5kaWYKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogTmV4dCB0cnkgdG8gdXNlIGEgUFBDIEFEQiBwb3J0IG1vdXNlICovCisJCWlmICggbW91c2VfZmQgPCAwICkgeworCQkJbW91c2VfZmQgPSBvcGVuKCIvZGV2L2FkYm1vdXNlIiwgT19SRE9OTFksIDApOworCQkJaWYgKCBtb3VzZV9mZCA+PSAwICkgeworI2lmZGVmIERFQlVHX01PVVNFCitmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIEFEQiBtb3VzZVxuIik7CisjZW5kaWYKKwkJCQltb3VzZV9kcnYgPSBNT1VTRV9CTTsKKwkJCX0KKwkJfQorCX0KKwkvKiBEZWZhdWx0IHRvIGEgc2VyaWFsIE1pY3Jvc29mdCBtb3VzZSAqLworCWlmICggbW91c2VfZmQgPCAwICkgeworCQlpZiAoIG1vdXNlZGV2ID09IE5VTEwgKSB7CisJCQltb3VzZWRldiA9ICIvZGV2L21vdXNlIjsKKwkJfQorCQltb3VzZV9mZCA9IG9wZW4obW91c2VkZXYsIE9fUkRPTkxZLCAwKTsKKwkJaWYgKCBtb3VzZV9mZCA+PSAwICkgeworCQkJc3RydWN0IHRlcm1pb3MgbW91c2VfdGVybWlvczsKKworCQkJLyogU2V0IHRoZSBzYW1wbGluZyBzcGVlZCB0byAxMjAwIGJhdWQgKi8KKwkJCXRjZ2V0YXR0cihtb3VzZV9mZCwgJm1vdXNlX3Rlcm1pb3MpOworCQkJbW91c2VfdGVybWlvcy5jX2lmbGFnID0gSUdOQlJLIHwgSUdOUEFSOworCQkJbW91c2VfdGVybWlvcy5jX29mbGFnID0gMDsKKwkJCW1vdXNlX3Rlcm1pb3MuY19sZmxhZyA9IDA7CisJCQltb3VzZV90ZXJtaW9zLmNfbGluZSA9IDA7CisJCQltb3VzZV90ZXJtaW9zLmNfY2NbVlRJTUVdID0gMDsKKwkJCW1vdXNlX3Rlcm1pb3MuY19jY1tWTUlOXSA9IDE7CisJCQltb3VzZV90ZXJtaW9zLmNfY2ZsYWcgPSBDUkVBRCB8IENMT0NBTCB8IEhVUENMOworCQkJbW91c2VfdGVybWlvcy5jX2NmbGFnIHw9IENTODsKKwkJCW1vdXNlX3Rlcm1pb3MuY19jZmxhZyB8PSBCMTIwMDsKKwkJCXRjc2V0YXR0cihtb3VzZV9mZCwgVENTQUZMVVNILCAmbW91c2VfdGVybWlvcyk7CisjaWZkZWYgREVCVUdfTU9VU0UKK2ZwcmludGYoc3RkZXJyLCAiVXNpbmcgTWljcm9zb2Z0IG1vdXNlIG9uICVzXG4iLCBtb3VzZWRldik7CisjZW5kaWYKKwkJCW1vdXNlX2RydiA9IE1PVVNFX01TOworCQl9CisJfQorCWlmICggbW91c2VfZmQgPCAwICkgeworCQltb3VzZV9kcnYgPSBNT1VTRV9OT05FOworCX0KKwlyZXR1cm4obW91c2VfZmQpOworfQorCitzdGF0aWMgaW50IHBvc3RlZCA9IDA7CisKK3ZvaWQgR1NfdmdhbW91c2VjYWxsYmFjayhpbnQgYnV0dG9uLCBpbnQgZHgsIGludCBkeSkKK3sKKwlpbnQgYnV0dG9uXzEsIGJ1dHRvbl8zOworCWludCBidXR0b25fc3RhdGU7CisJaW50IHN0YXRlX2NoYW5nZWQ7CisJaW50IGk7CisJVWludDggc3RhdGU7CisKKwlpZiAoIGR4IHx8IGR5ICkgeworCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLCBkeCwgZHkpOworCX0KKworCS8qIFN3YXAgYnV0dG9uIDEgYW5kIDMgKi8KKwlidXR0b25fMSA9IChidXR0b24gJiAweDA0KSA+PiAyOworCWJ1dHRvbl8zID0gKGJ1dHRvbiAmIDB4MDEpIDw8IDI7CisJYnV0dG9uICY9IH4weDA1OworCWJ1dHRvbiB8PSAoYnV0dG9uXzF8YnV0dG9uXzMpOworCisJLyogU2VlIHdoYXQgY2hhbmdlZCAqLworCWJ1dHRvbl9zdGF0ZSA9IFNETF9HZXRNb3VzZVN0YXRlKE5VTEwsIE5VTEwpOworCXN0YXRlX2NoYW5nZWQgPSBidXR0b25fc3RhdGUgXiBidXR0b247CisJZm9yICggaT0wOyBpPDg7ICsraSApIHsKKwkJaWYgKCBzdGF0ZV9jaGFuZ2VkICYgKDE8PGkpICkgeworCQkJaWYgKCBidXR0b24gJiAoMTw8aSkgKSB7CisJCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdGUgPSBTRExfUkVMRUFTRUQ7CisJCQl9CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihzdGF0ZSwgaSsxLCAwLCAwKTsKKwkJfQorCX0KK30KKworLyogRm9yIG5vdywgdXNlIEdQTSwgUFMvMiwgYW5kIE1TIHByb3RvY29scworICAgRHJpdmVyIGFkYXB0ZWQgZnJvbSB0aGUgU1ZHQWxpYiBtb3VzZSBkcml2ZXIgY29kZSAodGFrZW4gZnJvbSBncG0sIGV0Yy4pCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9tb3VzZShfVEhJUykKK3sKKwlzdGF0aWMgaW50IHN0YXJ0ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtb3VzZWJ1ZltCVUZTSVpdOworCWludCBpLCBucmVhZDsKKwlpbnQgYnV0dG9uID0gMDsKKwlpbnQgZHggPSAwLCBkeSA9IDA7CisJaW50IHBhY2tldHNpemUgPSAwOworCisJLyogRmlndXJlIG91dCB0aGUgbW91c2UgcGFja2V0IHNpemUgKi8KKwlzd2l0Y2ggKG1vdXNlX2RydikgeworCQljYXNlIE1PVVNFX05PTkU6CisJCQkvKiBBY2shICovCisJCQlyZWFkKG1vdXNlX2ZkLCBtb3VzZWJ1ZiwgQlVGU0laKTsKKwkJCXJldHVybjsKKwkJY2FzZSBNT1VTRV9HUE06CisJCQlwYWNrZXRzaXplID0gNTsKKwkJCWJyZWFrOworCQljYXNlIE1PVVNFX0lNUFMyOgorCQkJcGFja2V0c2l6ZSA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSBNT1VTRV9QUzI6CisJCWNhc2UgTU9VU0VfTVM6CisJCWNhc2UgTU9VU0VfQk06CisJCQlwYWNrZXRzaXplID0gMzsKKwkJCWJyZWFrOworCQljYXNlIE5VTV9NT1VTRV9EUlZTOgorCQkJLyogVWggb2guLiAqLworCQkJcGFja2V0c2l6ZSA9IDA7CisJCQlicmVhazsKKwl9CisKKwkvKiBSZWFkIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZSAqLworCW5yZWFkID0gcmVhZChtb3VzZV9mZCwgJm1vdXNlYnVmW3N0YXJ0XSwgQlVGU0laLXN0YXJ0KTsKKwlpZiAoIG5yZWFkIDwgMCApIHsKKwkJcmV0dXJuOworCX0KKwlucmVhZCArPSBzdGFydDsKKyNpZmRlZiBERUJVR19NT1VTRQorCWZwcmludGYoc3RkZXJyLCAiUmVhZCAlZCBieXRlcyBmcm9tIG1vdXNlLCBzdGFydCA9ICVkXG4iLCBucmVhZCwgc3RhcnQpOworI2VuZGlmCisJZm9yICggaT0wOyBpPChucmVhZC0ocGFja2V0c2l6ZS0xKSk7IGkgKz0gcGFja2V0c2l6ZSApIHsKKwkJc3dpdGNoIChtb3VzZV9kcnYpIHsKKwkJCWNhc2UgTU9VU0VfTk9ORToKKwkJCQlicmVhazsKKwkJCWNhc2UgTU9VU0VfR1BNOgorCQkJCS8qIEdQTSBwcm90b2NvbCBoYXMgMHg4MCBpbiBoaWdoIGJ5dGUgKi8KKwkJCQlpZiAoIChtb3VzZWJ1ZltpXSAmIDB4RjgpICE9IDB4ODAgKSB7CisJCQkJCS8qIEdvIHRvIG5leHQgYnl0ZSAqLworCQkJCQlpIC09IChwYWNrZXRzaXplLTEpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogR2V0IGN1cnJlbnQgbW91c2Ugc3RhdGUgKi8KKwkJCQlidXR0b24gPSAofm1vdXNlYnVmW2ldKSAmIDB4MDc7CisJCQkJZHggPSAgIChzaWduZWQgY2hhcikobW91c2VidWZbaSsxXSkgKworCQkJCSAgICAgICAoc2lnbmVkIGNoYXIpKG1vdXNlYnVmW2krM10pOworCQkJCWR5ID0gLSgoc2lnbmVkIGNoYXIpKG1vdXNlYnVmW2krMl0pICsKKwkJCQkgICAgICAgKHNpZ25lZCBjaGFyKShtb3VzZWJ1ZltpKzRdKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PVVNFX1BTMjoKKwkJCQkvKiBQUy8yIHByb3RvY29sIGhhcyBub3RoaW5nIGluIGhpZ2ggYnl0ZSAqLworCQkJCWlmICggKG1vdXNlYnVmW2ldICYgMHhDMCkgIT0gMCApIHsKKwkJCQkJLyogR28gdG8gbmV4dCBieXRlICovCisJCQkJCWkgLT0gKHBhY2tldHNpemUtMSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBHZXQgY3VycmVudCBtb3VzZSBzdGF0ZSAqLworCQkJCWJ1dHRvbiA9IChtb3VzZWJ1ZltpXSAmIDB4MDQpID4+IDEgfCAvKk1pZGRsZSovCisJCSAgCQkJIChtb3VzZWJ1ZltpXSAmIDB4MDIpID4+IDEgfCAvKlJpZ2h0Ki8KKwkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHgwMSkgPDwgMjsgIC8qTGVmdCovCisJCSAgCQlkeCA9IChtb3VzZWJ1ZltpXSAmIDB4MTApID8KKwkJICAJCSAgICAgIG1vdXNlYnVmW2krMV0gLSAyNTYgOiBtb3VzZWJ1ZltpKzFdOworCQkgIAkJZHkgPSAobW91c2VidWZbaV0gJiAweDIwKSA/CisJCSAgCQkgICAgICAtKG1vdXNlYnVmW2krMl0gLSAyNTYpIDogLW1vdXNlYnVmW2krMl07CisJCQkJYnJlYWs7CisJCQljYXNlIE1PVVNFX0lNUFMyOgorCQkJCS8qIEdldCBjdXJyZW50IG1vdXNlIHN0YXRlICovCisJCQkJYnV0dG9uID0gKG1vdXNlYnVmW2ldICYgMHgwNCkgPj4gMSB8IC8qTWlkZGxlKi8KKwkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHgwMikgPj4gMSB8IC8qUmlnaHQqLworCQkgIAkJCSAobW91c2VidWZbaV0gJiAweDAxKSA8PCAyIHwgLypMZWZ0Ki8KKwkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHg0MCkgPj4gMyB8IC8qIDQgKi8KKwkJICAJCQkgKG1vdXNlYnVmW2ldICYgMHg4MCkgPj4gMzsgIC8qIDUgKi8KKwkJICAJCWR4ID0gKG1vdXNlYnVmW2ldICYgMHgxMCkgPworCQkgIAkJICAgICAgbW91c2VidWZbaSsxXSAtIDI1NiA6IG1vdXNlYnVmW2krMV07CisJCSAgCQlkeSA9IChtb3VzZWJ1ZltpXSAmIDB4MjApID8KKwkJICAJCSAgICAgIC0obW91c2VidWZbaSsyXSAtIDI1NikgOiAtbW91c2VidWZbaSsyXTsKKwkJCQlzd2l0Y2ggKG1vdXNlYnVmW2krM10mMHgwRikgeworCQkJCSAgICBjYXNlIDB4MEU6IC8qIERYID0gKzEgKi8KKwkJCQkgICAgY2FzZSAweDAyOiAvKiBEWCA9IC0xICovCisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIDB4MEY6IC8qIERZID0gKzEgKG1hcCBidXR0b24gNCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCX3ZnYW1vdXNlY2FsbGJhY2soYnV0dG9uIHwgKDE8PDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAwKTsKKwkJCQkJYnJlYWs7CisJCQkJICAgIGNhc2UgMHgwMTogLyogRFkgPSAtMSAobWFwIGJ1dHRvbiA1KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJfdmdhbW91c2VjYWxsYmFjayhidXR0b24gfCAoMTw8NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIE1PVVNFX01TOgorCQkJCS8qIE1pY3Jvc29mdCBwcm90b2NvbCBoYXMgMHg0MCBpbiBoaWdoIGJ5dGUgKi8KKwkJCQlpZiAoIChtb3VzZWJ1ZltpXSAmIDB4NDApICE9IDB4NDAgKSB7CisJCQkJCS8qIEdvIHRvIG5leHQgYnl0ZSAqLworCQkJCQlpIC09IChwYWNrZXRzaXplLTEpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogR2V0IGN1cnJlbnQgbW91c2Ugc3RhdGUgKi8KKwkJCQlidXR0b24gPSAoKG1vdXNlYnVmW2ldICYgMHgyMCkgPj4gMykgfAorCQkJCSAgICAgICAgICgobW91c2VidWZbaV0gJiAweDEwKSA+PiA0KTsKKwkJCQlkeCA9IChzaWduZWQgY2hhcikoKChtb3VzZWJ1ZltpXSAmIDB4MDMpIDw8IDYpIHwKKwkJCQkgICAgICAgICAgICAgICAgICAgKG1vdXNlYnVmW2kgKyAxXSAmIDB4M0YpKTsKKwkJCQlkeSA9IChzaWduZWQgY2hhcikoKChtb3VzZWJ1ZltpXSAmIDB4MEMpIDw8IDQpIHwKKwkJCQkgICAgICAgICAgICAgICAgICAgIChtb3VzZWJ1ZltpICsgMl0gJiAweDNGKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PVVNFX0JNOgorCQkJCS8qIEJ1c01vdXNlIHByb3RvY29sIGhhcyAweEY4IGluIGhpZ2ggYnl0ZSAqLworCQkJCWlmICggKG1vdXNlYnVmW2ldICYgMHhGOCkgIT0gMHg4MCApIHsKKwkJCQkJLyogR28gdG8gbmV4dCBieXRlICovCisJCQkJCWkgLT0gKHBhY2tldHNpemUtMSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBHZXQgY3VycmVudCBtb3VzZSBzdGF0ZSAqLworCQkJCWJ1dHRvbiA9ICh+bW91c2VidWZbaV0pICYgMHgwNzsKKwkJCQlkeCA9ICAoc2lnbmVkIGNoYXIpbW91c2VidWZbaSsxXTsKKwkJCQlkeSA9IC0oc2lnbmVkIGNoYXIpbW91c2VidWZbaSsyXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTlVNX01PVVNFX0RSVlM6CisJCQkJLyogVWggb2guLiAqLworCQkJCWR4ID0gMDsKKwkJCQlkeSA9IDA7CisJCQkJYnJlYWs7CisJCX0KKwkJR1NfdmdhbW91c2VjYWxsYmFjayhidXR0b24sIGR4LCBkeSk7CisJfQorCWlmICggaSA8IG5yZWFkICkgeworCQlTRExfbWVtY3B5KG1vdXNlYnVmLCAmbW91c2VidWZbaV0sIChucmVhZC1pKSk7CisJCXN0YXJ0ID0gKG5yZWFkLWkpOworCX0gZWxzZSB7CisJCXN0YXJ0ID0gMDsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfa2V5Ym9hcmQoX1RISVMpCit7CisJdW5zaWduZWQgY2hhciBrZXlidWZbQlVGU0laXTsKKwlpbnQgaSwgbnJlYWQ7CisJaW50IHByZXNzZWQ7CisJaW50IHNjYW5jb2RlOworCVNETF9rZXlzeW0ga2V5c3ltOworCisJbnJlYWQgPSByZWFkKGtleWJvYXJkX2ZkLCBrZXlidWYsIEJVRlNJWik7CisJZm9yICggaT0wOyBpPG5yZWFkOyArK2kgKSB7CisJCXNjYW5jb2RlID0ga2V5YnVmW2ldICYgMHg3RjsKKwkJaWYgKCBrZXlidWZbaV0gJiAweDgwICkgeworCQkJcHJlc3NlZCA9IFNETF9SRUxFQVNFRDsKKwkJfSBlbHNlIHsKKwkJCXByZXNzZWQgPSBTRExfUFJFU1NFRDsKKwkJfQorCQlUcmFuc2xhdGVLZXkoc2NhbmNvZGUsICZrZXlzeW0pOworCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChwcmVzc2VkLCAma2V5c3ltKTsKKwl9Cit9CisKK3ZvaWQgR1NfUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlmZF9zZXQgZmRzZXQ7CisJaW50IG1heF9mZDsKKwlzdGF0aWMgc3RydWN0IHRpbWV2YWwgemVybzsKKworCWRvIHsKKwkJcG9zdGVkID0gMDsKKworCQlGRF9aRVJPKCZmZHNldCk7CisJCW1heF9mZCA9IDA7CisJCWlmICgga2V5Ym9hcmRfZmQgPj0gMCApIHsKKwkJCUZEX1NFVChrZXlib2FyZF9mZCwgJmZkc2V0KTsKKwkJCWlmICggbWF4X2ZkIDwga2V5Ym9hcmRfZmQgKSB7CisJCQkJbWF4X2ZkID0ga2V5Ym9hcmRfZmQ7CisJCQl9CisJCX0KKwkJaWYgKCBtb3VzZV9mZCA+PSAwICkgeworCQkJRkRfU0VUKG1vdXNlX2ZkLCAmZmRzZXQpOworCQkJaWYgKCBtYXhfZmQgPCBtb3VzZV9mZCApIHsKKwkJCQltYXhfZmQgPSBtb3VzZV9mZDsKKwkJCX0KKwkJfQorCQlpZiAoIHNlbGVjdChtYXhfZmQrMSwgJmZkc2V0LCBOVUxMLCBOVUxMLCAmemVybykgPiAwICkgeworCQkJaWYgKCBrZXlib2FyZF9mZCA+PSAwICkgeworCQkJCWlmICggRkRfSVNTRVQoa2V5Ym9hcmRfZmQsICZmZHNldCkgKSB7CisJCQkJCWhhbmRsZV9rZXlib2FyZCh0aGlzKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoIG1vdXNlX2ZkID49IDAgKSB7CisJCQkJaWYgKCBGRF9JU1NFVChtb3VzZV9mZCwgJmZkc2V0KSApIHsKKwkJCQkJaGFuZGxlX21vdXNlKHRoaXMpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKCBwb3N0ZWQgKTsKK30KKwordm9pZCBHU19Jbml0T1NLZXltYXAoX1RISVMpCit7CisJaW50IGk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBMaW51eCBrZXkgdHJhbnNsYXRpb24gdGFibGUgKi8KKworCS8qIEZpcnN0IGdldCB0aGUgYXNjaWkga2V5cyBhbmQgb3RoZXJzIG5vdCB3ZWxsIGhhbmRsZWQgKi8KKwlmb3IgKGk9MDsgaTxTRExfYXJyYXlzaXplKGtleW1hcCk7ICsraSkgeworCSAgc3dpdGNoKGkpIHsKKwkgIC8qIFRoZXNlIGFyZW4ndCBoYW5kbGVkIGJ5IHRoZSB4ODYga2VybmVsIGtleW1hcHBpbmcgKD8pICovCisJICBjYXNlIFNDQU5DT0RFX1BSSU5UU0NSRUVOOgorCSAgICBrZXltYXBbaV0gPSBTRExLX1BSSU5UOworCSAgICBicmVhazsKKwkgIGNhc2UgU0NBTkNPREVfQlJFQUs6CisJICAgIGtleW1hcFtpXSA9IFNETEtfQlJFQUs7CisJICAgIGJyZWFrOworCSAgY2FzZSBTQ0FOQ09ERV9CUkVBS19BTFRFUk5BVElWRToKKwkgICAga2V5bWFwW2ldID0gU0RMS19QQVVTRTsKKwkgICAgYnJlYWs7CisJICBjYXNlIFNDQU5DT0RFX0xFRlRTSElGVDoKKwkgICAga2V5bWFwW2ldID0gU0RMS19MU0hJRlQ7CisJICAgIGJyZWFrOworCSAgY2FzZSBTQ0FOQ09ERV9SSUdIVFNISUZUOgorCSAgICBrZXltYXBbaV0gPSBTRExLX1JTSElGVDsKKwkgICAgYnJlYWs7CisJICBjYXNlIFNDQU5DT0RFX0xFRlRDT05UUk9MOgorCSAgICBrZXltYXBbaV0gPSBTRExLX0xDVFJMOworCSAgICBicmVhazsKKwkgIGNhc2UgU0NBTkNPREVfUklHSFRDT05UUk9MOgorCSAgICBrZXltYXBbaV0gPSBTRExLX1JDVFJMOworCSAgICBicmVhazsKKwkgIGNhc2UgU0NBTkNPREVfUklHSFRXSU46CisJICAgIGtleW1hcFtpXSA9IFNETEtfUlNVUEVSOworCSAgICBicmVhazsKKwkgIGNhc2UgU0NBTkNPREVfTEVGVFdJTjoKKwkgICAga2V5bWFwW2ldID0gU0RMS19MU1VQRVI7CisJICAgIGJyZWFrOworCSAgY2FzZSAxMjc6CisJICAgIGtleW1hcFtpXSA9IFNETEtfTUVOVTsKKwkgICAgYnJlYWs7CisJICAvKiB0aGlzIHNob3VsZCB0YWtlIGNhcmUgb2YgYWxsIHN0YW5kYXJkIGFzY2lpIGtleXMgKi8KKwkgIGRlZmF1bHQ6CisJICAgIGtleW1hcFtpXSA9IEtWQUwodmdhX2tleW1hcFswXVtpXSk7CisJICAgIGJyZWFrOworICAgICAgICAgIH0KKwl9CisJZm9yIChpPTA7IGk8U0RMX2FycmF5c2l6ZShrZXltYXApOyArK2kpIHsKKwkgIHN3aXRjaChrZXltYXBfdGVtcFtpXSkgeworCSAgICBjYXNlIEtfRjE6ICBrZXltYXBbaV0gPSBTRExLX0YxOyAgYnJlYWs7CisJICAgIGNhc2UgS19GMjogIGtleW1hcFtpXSA9IFNETEtfRjI7ICBicmVhazsKKwkgICAgY2FzZSBLX0YzOiAga2V5bWFwW2ldID0gU0RMS19GMzsgIGJyZWFrOworCSAgICBjYXNlIEtfRjQ6ICBrZXltYXBbaV0gPSBTRExLX0Y0OyAgYnJlYWs7CisJICAgIGNhc2UgS19GNTogIGtleW1hcFtpXSA9IFNETEtfRjU7ICBicmVhazsKKwkgICAgY2FzZSBLX0Y2OiAga2V5bWFwW2ldID0gU0RMS19GNjsgIGJyZWFrOworCSAgICBjYXNlIEtfRjc6ICBrZXltYXBbaV0gPSBTRExLX0Y3OyAgYnJlYWs7CisJICAgIGNhc2UgS19GODogIGtleW1hcFtpXSA9IFNETEtfRjg7ICBicmVhazsKKwkgICAgY2FzZSBLX0Y5OiAga2V5bWFwW2ldID0gU0RMS19GOTsgIGJyZWFrOworCSAgICBjYXNlIEtfRjEwOiBrZXltYXBbaV0gPSBTRExLX0YxMDsgYnJlYWs7CisJICAgIGNhc2UgS19GMTE6IGtleW1hcFtpXSA9IFNETEtfRjExOyBicmVhazsKKwkgICAgY2FzZSBLX0YxMjoga2V5bWFwW2ldID0gU0RMS19GMTI7IGJyZWFrOworCisJICAgIGNhc2UgS19ET1dOOiAga2V5bWFwW2ldID0gU0RMS19ET1dOOyAgYnJlYWs7CisJICAgIGNhc2UgS19MRUZUOiAga2V5bWFwW2ldID0gU0RMS19MRUZUOyAgYnJlYWs7CisJICAgIGNhc2UgS19SSUdIVDoga2V5bWFwW2ldID0gU0RMS19SSUdIVDsgYnJlYWs7CisJICAgIGNhc2UgS19VUDogICAga2V5bWFwW2ldID0gU0RMS19VUDsgICAgYnJlYWs7CisKKwkgICAgY2FzZSBLX1AwOiAgICAga2V5bWFwW2ldID0gU0RMS19LUDA7IGJyZWFrOworCSAgICBjYXNlIEtfUDE6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQMTsgYnJlYWs7CisJICAgIGNhc2UgS19QMjogICAgIGtleW1hcFtpXSA9IFNETEtfS1AyOyBicmVhazsKKwkgICAgY2FzZSBLX1AzOiAgICAga2V5bWFwW2ldID0gU0RMS19LUDM7IGJyZWFrOworCSAgICBjYXNlIEtfUDQ6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQNDsgYnJlYWs7CisJICAgIGNhc2UgS19QNTogICAgIGtleW1hcFtpXSA9IFNETEtfS1A1OyBicmVhazsKKwkgICAgY2FzZSBLX1A2OiAgICAga2V5bWFwW2ldID0gU0RMS19LUDY7IGJyZWFrOworCSAgICBjYXNlIEtfUDc6ICAgICBrZXltYXBbaV0gPSBTRExLX0tQNzsgYnJlYWs7CisJICAgIGNhc2UgS19QODogICAgIGtleW1hcFtpXSA9IFNETEtfS1A4OyBicmVhazsKKwkgICAgY2FzZSBLX1A5OiAgICAga2V5bWFwW2ldID0gU0RMS19LUDk7IGJyZWFrOworCSAgICBjYXNlIEtfUFBMVVM6ICBrZXltYXBbaV0gPSBTRExLX0tQX1BMVVM7IGJyZWFrOworCSAgICBjYXNlIEtfUE1JTlVTOiBrZXltYXBbaV0gPSBTRExLX0tQX01JTlVTOyBicmVhazsKKwkgICAgY2FzZSBLX1BTVEFSOiAga2V5bWFwW2ldID0gU0RMS19LUF9NVUxUSVBMWTsgYnJlYWs7CisJICAgIGNhc2UgS19QU0xBU0g6IGtleW1hcFtpXSA9IFNETEtfS1BfRElWSURFOyBicmVhazsKKwkgICAgY2FzZSBLX1BFTlRFUjoga2V5bWFwW2ldID0gU0RMS19LUF9FTlRFUjsgYnJlYWs7CisJICAgIGNhc2UgS19QRE9UOiAgIGtleW1hcFtpXSA9IFNETEtfS1BfUEVSSU9EOyBicmVhazsKKworCSAgICBjYXNlIEtfU0hJRlQ6ICBpZiAoIGtleW1hcFtpXSAhPSBTRExLX1JTSElGVCApCisJICAgICAgICAgICAgICAgICAgICAga2V5bWFwW2ldID0gU0RMS19MU0hJRlQ7CisJICAgICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICBjYXNlIEtfU0hJRlRMOiBrZXltYXBbaV0gPSBTRExLX0xTSElGVDsgYnJlYWs7CisJICAgIGNhc2UgS19TSElGVFI6IGtleW1hcFtpXSA9IFNETEtfUlNISUZUOyBicmVhazsKKwkgICAgY2FzZSBLX0NUUkw6ICBpZiAoIGtleW1hcFtpXSAhPSBTRExLX1JDVFJMICkKKwkgICAgICAgICAgICAgICAgICAgICBrZXltYXBbaV0gPSBTRExLX0xDVFJMOworCSAgICAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBLX0NUUkxMOiAga2V5bWFwW2ldID0gU0RMS19MQ1RSTDsgIGJyZWFrOworCSAgICBjYXNlIEtfQ1RSTFI6ICBrZXltYXBbaV0gPSBTRExLX1JDVFJMOyAgYnJlYWs7CisJICAgIGNhc2UgS19BTFQ6ICAgIGtleW1hcFtpXSA9IFNETEtfTEFMVDsgICBicmVhazsKKwkgICAgY2FzZSBLX0FMVEdSOiAga2V5bWFwW2ldID0gU0RMS19SQUxUOyAgIGJyZWFrOworCisJICAgIGNhc2UgS19JTlNFUlQ6IGtleW1hcFtpXSA9IFNETEtfSU5TRVJUOyAgIGJyZWFrOworCSAgICBjYXNlIEtfUkVNT1ZFOiBrZXltYXBbaV0gPSBTRExLX0RFTEVURTsgICBicmVhazsKKwkgICAgY2FzZSBLX1BHVVA6ICAga2V5bWFwW2ldID0gU0RMS19QQUdFVVA7ICAgYnJlYWs7CisJICAgIGNhc2UgS19QR0ROOiAgIGtleW1hcFtpXSA9IFNETEtfUEFHRURPV047IGJyZWFrOworCSAgICBjYXNlIEtfRklORDogICBrZXltYXBbaV0gPSBTRExLX0hPTUU7ICAgICBicmVhazsKKwkgICAgY2FzZSBLX1NFTEVDVDoga2V5bWFwW2ldID0gU0RMS19FTkQ7ICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBLX05VTTogIGtleW1hcFtpXSA9IFNETEtfTlVNTE9DSzsgICBicmVhazsKKwkgICAgY2FzZSBLX0NBUFM6IGtleW1hcFtpXSA9IFNETEtfQ0FQU0xPQ0s7ICBicmVhazsKKworCSAgICBjYXNlIEtfRjEzOiAgIGtleW1hcFtpXSA9IFNETEtfUFJJTlQ7ICAgICBicmVhazsKKwkgICAgY2FzZSBLX0hPTEQ6ICBrZXltYXBbaV0gPSBTRExLX1NDUk9MTE9DSzsgYnJlYWs7CisJICAgIGNhc2UgS19QQVVTRToga2V5bWFwW2ldID0gU0RMS19QQVVTRTsgICAgIGJyZWFrOworCisJICAgIGNhc2UgMTI3OiBrZXltYXBbaV0gPSBTRExLX0JBQ0tTUEFDRTsgYnJlYWs7CisJICAgICAKKwkgICAgZGVmYXVsdDogYnJlYWs7CisJICB9CisJfQorfQorCitzdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQoreworCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCisJa2V5c3ltLT5zY2FuY29kZSA9IHNjYW5jb2RlOworCWtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKKwlrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKKworCS8qIElmIFVOSUNPREUgaXMgb24sIGdldCB0aGUgVU5JQ09ERSB2YWx1ZSBmb3IgdGhlIGtleSAqLworCWtleXN5bS0+dW5pY29kZSA9IDA7CisJaWYgKCBTRExfVHJhbnNsYXRlVU5JQ09ERSApIHsKKwkJaW50IG1hcDsKKwkJU0RMTW9kIG1vZHN0YXRlOworCisJCW1vZHN0YXRlID0gU0RMX0dldE1vZFN0YXRlKCk7CisJCW1hcCA9IDA7CisJCWlmICggbW9kc3RhdGUgJiBLTU9EX1NISUZUICkgeworCQkJbWFwIHw9ICgxPDxLR19TSElGVCk7CisJCX0KKwkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQ1RSTCApIHsKKwkJCW1hcCB8PSAoMTw8S0dfQ1RSTCk7CisJCX0KKwkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQUxUICkgeworCQkJbWFwIHw9ICgxPDxLR19BTFQpOworCQl9CisJCWlmICggbW9kc3RhdGUgJiBLTU9EX01PREUgKSB7CisJCQltYXAgfD0gKDE8PEtHX0FMVEdSKTsKKwkJfQorCQlpZiAoIEtUWVAodmdhX2tleW1hcFttYXBdW3NjYW5jb2RlXSkgPT0gS1RfTEVUVEVSICkgeworCQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQ0FQUyApIHsKKwkJCQltYXAgXj0gKDE8PEtHX1NISUZUKTsKKwkJCX0KKwkJfQorCQlpZiAoIEtUWVAodmdhX2tleW1hcFttYXBdW3NjYW5jb2RlXSkgPT0gS1RfUEFEICkgeworCQkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfTlVNICkgeworCQkJCWtleXN5bS0+dW5pY29kZT1LVkFMKHZnYV9rZXltYXBbbWFwXVtzY2FuY29kZV0pOworCQkJfQorCQl9IGVsc2UgeworCQkJa2V5c3ltLT51bmljb2RlID0gS1ZBTCh2Z2Ffa2V5bWFwW21hcF1bc2NhbmNvZGVdKTsKKwkJfQorCX0KKwlyZXR1cm4oa2V5c3ltKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU4YWIzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3NldmVudHNfYy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX2dzdmlkZW8uaCIKKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAorICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQorKi8KK2V4dGVybiBpbnQgR1NfT3BlbktleWJvYXJkKF9USElTKTsKK2V4dGVybiB2b2lkIEdTX0Nsb3NlS2V5Ym9hcmQoX1RISVMpOworZXh0ZXJuIGludCBHU19PcGVuTW91c2UoX1RISVMpOworZXh0ZXJuIHZvaWQgR1NfQ2xvc2VNb3VzZShfVEhJUyk7CitleHRlcm4gaW50IEdTX0VudGVyR3JhcGhpY3NNb2RlKF9USElTKTsKK2V4dGVybiBpbnQgR1NfSW5HcmFwaGljc01vZGUoX1RISVMpOworZXh0ZXJuIHZvaWQgR1NfTGVhdmVHcmFwaGljc01vZGUoX1RISVMpOworCitleHRlcm4gdm9pZCBHU19Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgR1NfUHVtcEV2ZW50cyhfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc2tleXMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dza2V5cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc2tleXMuaApyZW5hbWUgdG8gZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3NrZXlzLmgKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzbW91c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQzMjBkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3Ntb3VzZS5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIi4uL1NETF9jdXJzb3JfYy5oIgorI2luY2x1ZGUgIlNETF9nc3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2dzbW91c2VfYy5oIgorCisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLworc3RydWN0IFdNY3Vyc29yIHsKKwlpbnQgdW51c2VkOworfTsKKworLyogVGhlcmUgaXNuJ3QgYW55IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhICovCit2b2lkIEdTX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKK3sKKwlyZXR1cm47Cit9CisKKy8qIFRoZXJlIGlzbid0IGFueSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSAqLworV01jdXJzb3IgKkdTX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAorCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpCit7CisJcmV0dXJuKChXTWN1cnNvciAqKTB4MDEpOworfQorCitzdGF0aWMgdm9pZCBHU19Nb3ZlQ3Vyc29yKF9USElTLCBTRExfQ3Vyc29yICpjdXJzb3IsIGludCB4LCBpbnQgeSkKK3sKKwlTRExfU3VyZmFjZSAqc2NyZWVuOworCXN0cnVjdCBwczJfaW1hZ2UgaW1hZ2U7CisJU0RMX1JlY3QgYXJlYTsKKwlpbnQgbW91c2VfeTEsIG1vdXNlX3kyOworCXZvaWQgKnNhdmVkX3BpeGVsczsKKwlpbnQgc2NyZWVuX3VwZGF0ZWQ7CisKKwkvKiBMb2NrIHNvIHdlIGRvbid0IGludGVycnVwdCBhbiB1cGRhdGUgd2l0aCBtb3VzZSBtb3Rpb24gKi8KKwlTRExfTG9ja0N1cnNvcigpOworCisJLyogTWFrZSBzdXJlIGFueSBwZW5kaW5nIERNQSBoYXMgY29tcGxldGVkICovCisJaWYgKCBkbWFfcGVuZGluZyApIHsKKwkJaW9jdGwoY29uc29sZV9mZCwgUFMySU9DX1NFTkRRQ1QsIDEpOworCQlkbWFfcGVuZGluZyA9IDA7CisJfQorCisJLyogUmVtb3ZlIHRoZSBjdXJzb3IgaW1hZ2UgZnJvbSB0aGUgRE1BIGFyZWEgKi8KKwlzY3JlZW4gPSB0aGlzLT5zY3JlZW47CisJc2F2ZWRfcGl4ZWxzID0gc2NyZWVuLT5waXhlbHM7CisJc2NyZWVuLT5waXhlbHMgPSBtYXBwZWRfbWVtICsgc2NyZWVuLT5vZmZzZXQ7CisJc2NyZWVuX3VwZGF0ZWQgPSAwOworCWlmICggY3Vyc29yX2RyYXduICkgeworCQlTRExfRXJhc2VDdXJzb3JOb0xvY2soc2NyZWVuKTsKKwkJY3Vyc29yX2RyYXduID0gMDsKKwkJc2NyZWVuX3VwZGF0ZWQgPSAxOworCX0KKworCS8qIFNhdmUgdGhlIGN1cnJlbnQgbW91c2UgYXJlYSAqLworCVNETF9Nb3VzZVJlY3QoJmFyZWEpOworCW1vdXNlX3kxID0gYXJlYS55OworCW1vdXNlX3kyID0gYXJlYS55K2FyZWEuaDsKKworCS8qIE9ubHkgZHJhdyB0aGUgbmV3IGN1cnNvciBpZiB0aGVyZSB3YXMgb25lIHBhc3NlZCBpbiAqLworCWlmICggY3Vyc29yICkgeworCQkvKiBTZXQgdGhlIG5ldyBsb2NhdGlvbiAqLworCQljdXJzb3ItPmFyZWEueCA9ICh4IC0gY3Vyc29yLT5ob3RfeCk7CisJCWN1cnNvci0+YXJlYS55ID0gKHkgLSBjdXJzb3ItPmhvdF95KTsKKworCQkvKiBEcmF3IHRoZSBjdXJzb3IgYXQgdGhlIG5ldyBsb2NhdGlvbiAqLworCQlpZiAoIChTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSkgJiYgc2NyZWVuLT5waXhlbHMgKSB7CisJCQlTRExfRHJhd0N1cnNvck5vTG9jayhzY3JlZW4pOworCQkJY3Vyc29yX2RyYXduID0gMTsKKwkJCXNjcmVlbl91cGRhdGVkID0gMTsKKwkJfQorCX0KKwlzY3JlZW4tPnBpeGVscyA9IHNhdmVkX3BpeGVsczsKKworCS8qIFVwZGF0ZSB0aGUgYWZmZWN0ZWQgYXJlYSBvZiB0aGUgc2NyZWVuICovCisJaWYgKCBzY3JlZW5fdXBkYXRlZCApIHsKKwkJU0RMX01vdXNlUmVjdCgmYXJlYSk7CisJCWlmICggYXJlYS55IDwgbW91c2VfeTEgKSB7CisJCQltb3VzZV95MSA9IGFyZWEueTsKKwkJfQorCQlpZiAoIChhcmVhLnkrYXJlYS5oKSA+IG1vdXNlX3kyICkgeworCQkJbW91c2VfeTIgPSBhcmVhLnkrYXJlYS5oOworCQl9CisJCWltYWdlID0gc2NyZWVuX2ltYWdlOworCQlpbWFnZS55ICs9IHNjcmVlbi0+b2Zmc2V0IC8gc2NyZWVuLT5waXRjaCArIG1vdXNlX3kxOworCQlpbWFnZS5oID0gbW91c2VfeTIgLSBtb3VzZV95MTsKKwkJaW1hZ2UucHRyID0gbWFwcGVkX21lbSArCisJCSAgICAgICAgICAgIChpbWFnZS55IC0gc2NyZWVuX2ltYWdlLnkpICogc2NyZWVuLT5waXRjaDsKKwkJaW9jdGwoY29uc29sZV9mZCwgUFMySU9DX0xPQURJTUFHRSwgJmltYWdlKTsKKworCQkvKiBOZWVkIHRvIHNjYWxlIG9mZnNjcmVlbiBpbWFnZSB0byBUViBvdXRwdXQgKi8KKwkJaWYgKCBpbWFnZS55ID4gMCApIHsKKwkJCXNjYWxlaW1hZ2Vfbm9uYmxvY2soY29uc29sZV9mZCwKKwkJCSAgICAgICAgICAgICAgICAgICAgdGV4X3RhZ3NfbWVtLCBzY2FsZV90YWdzX21lbSk7CisJCX0KKwl9CisKKwkvKiBXZSdyZSBmaW5pc2hlZCAqLworCVNETF9VbmxvY2tDdXJzb3IoKTsKK30KKwordm9pZCBHU19Nb3ZlV01DdXJzb3IoX1RISVMsIGludCB4LCBpbnQgeSkKK3sKKwlHU19Nb3ZlQ3Vyc29yKHRoaXMsIFNETF9jdXJzb3IsIHgsIHkpOworfQorCitpbnQgR1NfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqd21jdXJzb3IpCit7CisJU0RMX0N1cnNvciAqY3Vyc29yOworCWludCB4LCB5OworCisJLyogRHJhdyB0aGUgY3Vyc29yIGF0IHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbiAqLworCVNETF9HZXRNb3VzZVN0YXRlKCZ4LCAmeSk7CisJaWYgKCB3bWN1cnNvciApIHsKKwkJY3Vyc29yID0gU0RMX2N1cnNvcjsKKwl9IGVsc2UgeworCQljdXJzb3IgPSBOVUxMOworCX0KKwlHU19Nb3ZlQ3Vyc29yKHRoaXMsIGN1cnNvciwgeCwgeSk7CisJcmV0dXJuKDEpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3Ntb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc21vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTA3ZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3Ntb3VzZV9jLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfZ3N2aWRlby5oIgorCisvKiBUaGlzIGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGN1cnNvciBzcHJpdGUgKi8KKyNkZWZpbmUgQ1VSU09SX1cJMzIKKyNkZWZpbmUgQ1VSU09SX0gJMzIKKyNkZWZpbmUgQ1VSU09SX1dfUE9XCTUJLyogMzIgPSAyXjUgKi8KKyNkZWZpbmUgQ1VSU09SX0hfUE9XCTUJLyogMzIgPSAyXjUgKi8KKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCitleHRlcm4gdm9pZCBHU19GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworZXh0ZXJuIFdNY3Vyc29yICpHU19DcmVhdGVXTUN1cnNvcihfVEhJUywKKwkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKK2V4dGVybiB2b2lkIEdTX01vdmVXTUN1cnNvcihfVEhJUywgaW50IHgsIGludCB5KTsKK2V4dGVybiBpbnQgR1NfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTcyYzYwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3N2aWRlby5jCkBAIC0wLDAgKzEsNjg5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogRnJhbWVidWZmZXIgY29uc29sZSBiYXNlZCBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICIuLi9TRExfY3Vyc29yX2MuaCIKKyNpbmNsdWRlICJTRExfZ3N2aWRlby5oIgorI2luY2x1ZGUgIlNETF9nc21vdXNlX2MuaCIKKyNpbmNsdWRlICJTRExfZ3NldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9nc3l1dl9jLmgiCisKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IEdTX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKkdTX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgU0RMX1N1cmZhY2UgKkdTX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgR1NfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKK3N0YXRpYyB2b2lkIEdTX1ZpZGVvUXVpdChfVEhJUyk7CisKKy8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IEdTX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IEdTX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIEdTX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgR1NfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKiBHUyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IEdTX0F2YWlsYWJsZSh2b2lkKQoreworCWludCBjb25zb2xlLCBtZW1vcnk7CisKKwljb25zb2xlID0gb3BlbihQUzJfREVWX0dTLCBPX1JEV1IsIDApOworCWlmICggY29uc29sZSA+PSAwICkgeworCQljbG9zZShjb25zb2xlKTsKKwl9CisJbWVtb3J5ID0gb3BlbihQUzJfREVWX01FTSwgT19SRFdSLCAwKTsKKwlpZiAoIG1lbW9yeSA+PSAwICkgeworCQljbG9zZShtZW1vcnkpOworCX0KKwlyZXR1cm4oKGNvbnNvbGUgPj0gMCkgJiYgKG1lbW9yeSA+PSAwKSk7Cit9CisKK3N0YXRpYyB2b2lkIEdTX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqR1NfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXM7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCXRoaXMgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7CisJaWYgKCB0aGlzICkgeworCQlTRExfbWVtc2V0KHRoaXMsIDAsIChzaXplb2YgKnRoaXMpKTsKKwkJdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CisJfQorCWlmICggKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggdGhpcyApIHsKKwkJCVNETF9mcmVlKHRoaXMpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJU0RMX21lbXNldCh0aGlzLT5oaWRkZW4sIDAsIChzaXplb2YgKnRoaXMtPmhpZGRlbikpOworCW1vdXNlX2ZkID0gLTE7CisJa2V5Ym9hcmRfZmQgPSAtMTsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwl0aGlzLT5WaWRlb0luaXQgPSBHU19WaWRlb0luaXQ7CisJdGhpcy0+TGlzdE1vZGVzID0gR1NfTGlzdE1vZGVzOworCXRoaXMtPlNldFZpZGVvTW9kZSA9IEdTX1NldFZpZGVvTW9kZTsKKwl0aGlzLT5DcmVhdGVZVVZPdmVybGF5ID0gR1NfQ3JlYXRlWVVWT3ZlcmxheTsKKwl0aGlzLT5TZXRDb2xvcnMgPSBHU19TZXRDb2xvcnM7CisJdGhpcy0+VXBkYXRlUmVjdHMgPSBOVUxMOworCXRoaXMtPlZpZGVvUXVpdCA9IEdTX1ZpZGVvUXVpdDsKKwl0aGlzLT5BbGxvY0hXU3VyZmFjZSA9IEdTX0FsbG9jSFdTdXJmYWNlOworCXRoaXMtPkNoZWNrSFdCbGl0ID0gTlVMTDsKKwl0aGlzLT5GaWxsSFdSZWN0ID0gTlVMTDsKKwl0aGlzLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwl0aGlzLT5TZXRIV0FscGhhID0gTlVMTDsKKwl0aGlzLT5Mb2NrSFdTdXJmYWNlID0gR1NfTG9ja0hXU3VyZmFjZTsKKwl0aGlzLT5VbmxvY2tIV1N1cmZhY2UgPSBHU19VbmxvY2tIV1N1cmZhY2U7CisJdGhpcy0+RmxpcEhXU3VyZmFjZSA9IE5VTEw7CisJdGhpcy0+RnJlZUhXU3VyZmFjZSA9IEdTX0ZyZWVIV1N1cmZhY2U7CisJdGhpcy0+U2V0SWNvbiA9IE5VTEw7CisJdGhpcy0+U2V0Q2FwdGlvbiA9IE5VTEw7CisJdGhpcy0+R2V0V01JbmZvID0gTlVMTDsKKwl0aGlzLT5GcmVlV01DdXJzb3IgPSBHU19GcmVlV01DdXJzb3I7CisJdGhpcy0+Q3JlYXRlV01DdXJzb3IgPSBHU19DcmVhdGVXTUN1cnNvcjsKKwl0aGlzLT5TaG93V01DdXJzb3IgPSBHU19TaG93V01DdXJzb3I7CisJdGhpcy0+TW92ZVdNQ3Vyc29yID0gR1NfTW92ZVdNQ3Vyc29yOworCXRoaXMtPkluaXRPU0tleW1hcCA9IEdTX0luaXRPU0tleW1hcDsKKwl0aGlzLT5QdW1wRXZlbnRzID0gR1NfUHVtcEV2ZW50czsKKworCXRoaXMtPmZyZWUgPSBHU19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gdGhpczsKK30KKworVmlkZW9Cb290U3RyYXAgUFMyR1NfYm9vdHN0cmFwID0geworCSJwczJncyIsICJQbGF5U3RhdGlvbiAyIEdyYXBoaWNzIFN5bnRoZXNpemVyIiwKKwlHU19BdmFpbGFibGUsIEdTX0NyZWF0ZURldmljZQorfTsKKworLyogVGhlc2UgYXJlIHRoZSBwaXhlbCBmb3JtYXRzIGZvciB0aGUgMzIsIDI0LCBhbmQgMTYgYml0IHZpZGVvIG1vZGVzICovCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgYnBwOworCVVpbnQzMiByOworCVVpbnQzMiBnOworCVVpbnQzMiBiOworfSBHU19waXhlbG1hc2tzW10gPSB7CisJeyAzMiwgMHgwMDAwMDBGRiwJLyogUkdCIGxpdHRsZS1lbmRpYW4gKi8KKwkgICAgICAweDAwMDBGRjAwLAorCSAgICAgIDB4MDBGRjAwMDAgfSwKKwl7IDI0LCAweDAwMDAwMEZGLAkvKiBSR0IgbGl0dGxlLWVuZGlhbiAqLworCSAgICAgIDB4MDAwMEZGMDAsCisJICAgICAgMHgwMEZGMDAwMCB9LAorCXsgMTYsIDB4MDAwMDAwMWYsCS8qIFJHQiBsaXR0bGUtZW5kaWFuICovCisJICAgICAgMHgwMDAwMDNlMCwKKwkgICAgICAweDAwMDA3YzAwIH0sCit9OworLyogVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSBTREwgYnl0ZXMtcGVyLXBpeGVsIHRvIEdTIHBpeGVsIGZvcm1hdCAqLworc3RhdGljIGludCBHU19mb3JtYXRtYXBbXSA9IHsKKwktMSwJCS8qIDAgYnBwLCBub3QgYSBsZWdhbCB2YWx1ZSAqLworCS0xLAkJLyogOCBicHAsIG5vdCBzdXBwb3J0ZWQgKHlldD8pICovCisJUFMyX0dTX1BTTUNUMTYsCS8qIDE2IGJwcCAqLworCVBTMl9HU19QU01DVDI0LAkvKiAyNCBicHAgKi8KKwlQUzJfR1NfUFNNQ1QzMgkvKiAzMiBicHAgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgaGVhZF90YWdzW10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKSA9IHsKKwk0IHwgKDFMTCA8PCA2MCksCS8qIEdJRnRhZyAqLworCTB4MGUsCQkJLyogQStEICovCisJMCwJCQkvKiAyICovCisJUFMyX0dTX0JJVEJMVEJVRiwKKwkwLAkJCS8qIDQgKi8KKwlQUzJfR1NfVFJYUE9TLAorCTAsCQkJLyogNiAqLworCVBTMl9HU19UUlhSRUcsCisJMCwJCQkvKiA4ICovCisJUFMyX0dTX1RSWERJUgorfTsKKworI2RlZmluZSBNQVhJTUcJCSgzMjc2NyAqIDE2KQorI2RlZmluZSBNQVhUQUdTCQk4CisKK3N0YXRpYyBpbmxpbmUgaW50IGxvYWRpbWFnZV9ub25ibG9jayhpbnQgZmQsIHN0cnVjdCBwczJfaW1hZ2UgKmltYWdlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKmhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqaW0pCit7CisJc3RydWN0IHBzMl9wbGlzdCBwbGlzdDsKKwlzdHJ1Y3QgcHMyX3BhY2tldCBwYWNrZXRbMSArIE1BWFRBR1MgKiAyXTsKKwlpbnQgaXNpemU7CisJaW50IHBudW0sIGl0LCBlb3A7CisJY2hhciAqZGF0YTsKKworCS8qIGluaXRpYWxpemUgdGhlIHZhcmlhYmxlcyAqLworCWRhdGEgPSAoY2hhciAqKWltYWdlLT5wdHI7CisJcG51bSA9IGl0ID0gZW9wID0gMDsKKwlwbGlzdC5wYWNrZXQgPSBwYWNrZXQ7CisKKwkvKiBtYWtlIEJJVEJMVCBwYWNrZXQgKi8KKwlwYWNrZXRbcG51bV0ucHRyID0gaG07CisJcGFja2V0W3BudW1dLmxlbiA9IHNpemVvZihoZWFkX3RhZ3MpOworCXBudW0rKzsKKwlobVsyXSA9ICgodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT5mYnAgPDwgMzIpIHwKKwkgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT5mYncgPDwgNDgpIHwKKwkgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT5wc20gPDwgNTYpOworCWhtWzRdID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpaW1hZ2UtPnggPDwgMzIpIHwKKwkgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT55IDw8IDQ4KTsKKwlobVs2XSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpaW1hZ2UtPncgfAorCSAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpaW1hZ2UtPmggPDwgMzIpOworCisJLyogbWFrZSBpbWFnZSBtb2RlIHRhZ3MgKi8KKwl3aGlsZSAoIWVvcCkgeworCQlpc2l6ZSA9IHNpemUgPiBNQVhJTUcgPyBNQVhJTUcgOiBzaXplOworCQlzaXplIC09IGlzaXplOworCQllb3AgPSAoc2l6ZSA9PSAwKTsKKworCQlwYWNrZXRbcG51bV0ucHRyID0gJmltW2l0XTsKKwkJcGFja2V0W3BudW1dLmxlbiA9IHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpICogMjsKKwkJcG51bSsrOworCQlpbVtpdCsrXSA9IChpc2l6ZSA+PiA0KSB8IChlb3AgPyAoMSA8PCAxNSkgOiAwKSB8ICgyTEwgPDwgNTgpOworCQlpbVtpdCsrXSA9IDA7CisKKwkJcGFja2V0W3BudW1dLnB0ciA9ICh2b2lkICopZGF0YTsKKwkJcGFja2V0W3BudW1dLmxlbiA9IGlzaXplOworCQlwbnVtKys7CisJCWRhdGEgKz0gaXNpemU7CisJfQorCXBsaXN0Lm51bSA9IHBudW07CisKKwlyZXR1cm4gaW9jdGwoZmQsIFBTMklPQ19TRU5ETCwgJnBsaXN0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZXhfdGFnc1tdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgPSB7CisJMyB8ICgxTEwgPDwgNjApLAkvKiBHSUZ0YWcgKi8KKwkweDBlLAkJCS8qIEErRCAqLworCTAsCQkJLyogMiAqLworCVBTMl9HU19URVgwXzEsCisJKDEgPDwgNSkgKyAoMSA8PCA2KSwKKwlQUzJfR1NfVEVYMV8xLAorCTAsCisJUFMyX0dTX1RFWEZMVVNICit9Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2FsZV90YWdzW10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKSA9IHsKKwk1IHwgKDFMTCA8PCA2MCksCS8qIEdJRnRhZyAqLworCTB4MGUsCQkJLyogQStEICovCisJNiArICgxIDw8IDQpICsgKDEgPDwgOCksCisJUFMyX0dTX1BSSU0sCisJKCh1bnNpZ25lZCBsb25nIGxvbmcpMCAqIDE2KSArICgoKHVuc2lnbmVkIGxvbmcgbG9uZykwICogMTYpIDw8IDE2KSwKKwlQUzJfR1NfVVYsCisJKCh1bnNpZ25lZCBsb25nIGxvbmcpMCAqIDE2KSArICgoKHVuc2lnbmVkIGxvbmcgbG9uZykwICogMTYpIDw8IDE2KSwKKwlQUzJfR1NfWFlaMiwKKwkwLAkJCS8qIDggKi8KKwlQUzJfR1NfVVYsCisJMCwJCQkvKiAxMCAqLworCVBTMl9HU19YWVoyCit9OworCisKK2ludCBzY2FsZWltYWdlX25vbmJsb2NrKGludCBmZCwgdW5zaWduZWQgbG9uZyBsb25nICp0bSwgdW5zaWduZWQgbG9uZyBsb25nICpzbSkKK3sKKwlzdHJ1Y3QgcHMyX3BsaXN0IHBsaXN0OworCXN0cnVjdCBwczJfcGFja2V0IHBhY2tldFsyXTsKKworCS8qIGluaXRpYWxpemUgdGhlIHZhcmlhYmxlcyAqLworCXBsaXN0Lm51bSA9IDI7CisJcGxpc3QucGFja2V0ID0gcGFja2V0OworCisJcGFja2V0WzBdLnB0ciA9IHRtOworCXBhY2tldFswXS5sZW4gPSBzaXplb2YodGV4X3RhZ3MpOworCXBhY2tldFsxXS5wdHIgPSBzbTsKKwlwYWNrZXRbMV0ubGVuID0gc2l6ZW9mKHNjYWxlX3RhZ3MpOworCisJcmV0dXJuIGlvY3RsKGZkLCBQUzJJT0NfU0VOREwsICZwbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXJfb2ZfMihpbnQgdmFsdWUpCit7CisJaW50IHNoaWZ0OworCisJZm9yICggc2hpZnQgPSAwOyAoMTw8c2hpZnQpIDwgdmFsdWU7ICsrc2hpZnQgKSB7CisJCS8qIEtlZXAgbG9va2luZyAqLyA7CisJfQorCXJldHVybihzaGlmdCk7Cit9CisKK3N0YXRpYyBpbnQgR1NfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisJc3RydWN0IHBzMl9zY3JlZW5pbmZvIHZpbmZvOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSAqLworCWNvbnNvbGVfZmQgPSBvcGVuKFBTMl9ERVZfR1MsIE9fUkRXUiwgMCk7CisJaWYgKCBjb25zb2xlX2ZkIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gb3BlbiAlcyIsIFBTMl9ERVZfR1MpOworCQlyZXR1cm4oLTEpOworCX0KKwltZW1vcnlfZmQgPSBvcGVuKFBTMl9ERVZfTUVNLCBPX1JEV1IsIDApOworCWlmICggbWVtb3J5X2ZkIDwgMCApIHsKKwkJY2xvc2UoY29uc29sZV9mZCk7CisJCWNvbnNvbGVfZmQgPSAtMTsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gb3BlbiAlcyIsIFBTMl9ERVZfTUVNKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19HU0NSRUVOSU5GTywgJnZpbmZvKSA8IDAgKSB7CisJCWNsb3NlKG1lbW9yeV9mZCk7CisJCWNsb3NlKGNvbnNvbGVfZmQpOworCQljb25zb2xlX2ZkID0gLTE7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IGNvbnNvbGUgcGl4ZWwgZm9ybWF0Iik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCisJdGhpcy0+aW5mby5jdXJyZW50X3cgPSB2aW5mby53OworCXRoaXMtPmluZm8uY3VycmVudF9oID0gdmluZm8uaDsKKworCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gZGVwdGggKi8KKwlzd2l0Y2ggKHZpbmZvLnBzbSkgeworCSAgICAvKiBTdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0cyAqLworCSAgICBjYXNlIFBTMl9HU19QU01DVDMyOgorCSAgICBjYXNlIFBTMl9HU19QU01DVDI0OgorCSAgICBjYXNlIFBTMl9HU19QU01DVDE2OgorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJR1NfVmlkZW9RdWl0KHRoaXMpOworCQlTRExfU2V0RXJyb3IoIlVua25vd24gY29uc29sZSBwaXhlbCBmb3JtYXQ6ICVkIiwgdmluZm8ucHNtKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLmJwcDsKKwl2Zm9ybWF0LT5SbWFzayA9IEdTX3BpeGVsbWFza3NbdmluZm8ucHNtXS5yOworCXZmb3JtYXQtPkdtYXNrID0gR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLmc7CisJdmZvcm1hdC0+Qm1hc2sgPSBHU19waXhlbG1hc2tzW3ZpbmZvLnBzbV0uYjsKKwlzYXZlZF92aW5mbyA9IHZpbmZvOworCisJLyogRW5hYmxlIG1vdXNlIGFuZCBrZXlib2FyZCBzdXBwb3J0ICovCisJaWYgKCBHU19PcGVuS2V5Ym9hcmQodGhpcykgPCAwICkgeworCQlHU19WaWRlb1F1aXQodGhpcyk7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4ga2V5Ym9hcmQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJaWYgKCBHU19PcGVuTW91c2UodGhpcykgPCAwICkgeworCQljb25zdCBjaGFyICpzZGxfbm9tb3VzZTsKKworCQlzZGxfbm9tb3VzZSA9IFNETF9nZXRlbnYoIlNETF9OT01PVVNFIik7CisJCWlmICggISBzZGxfbm9tb3VzZSApIHsKKwkJCUdTX1ZpZGVvUXVpdCh0aGlzKTsKKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIG9wZW4gbW91c2UiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisKKwkvKiBXZSdyZSBkb25lISAqLworCXJldHVybigwKTsKK30KKworc3RhdGljIFNETF9SZWN0ICoqR1NfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCXN0YXRpYyBTRExfUmVjdCBHU192ZXNhX21vZGVfbGlzdFtdID0geworCQl7IDAsIDAsIDEyODAsIDEwMjQgfSwKKwkJeyAwLCAwLCAxMDI0LCA3NjggfSwKKwkJeyAwLCAwLCA4MDAsIDYwMCB9LAorCQl7IDAsIDAsIDY0MCwgNDgwIH0KKwl9OworCXN0YXRpYyBTRExfUmVjdCAqR1NfdmVzYV9tb2Rlc1tdID0geworCQkmR1NfdmVzYV9tb2RlX2xpc3RbMF0sCisJCSZHU192ZXNhX21vZGVfbGlzdFsxXSwKKwkJJkdTX3Zlc2FfbW9kZV9saXN0WzJdLAorCQkmR1NfdmVzYV9tb2RlX2xpc3RbM10sCisJCU5VTEwKKwl9OworCXN0YXRpYyBTRExfUmVjdCBHU190dm91dF9zdHJldGNoOworCXN0YXRpYyBTRExfUmVjdCBHU190dm91dF9tb2RlOworCXN0YXRpYyBTRExfUmVjdCAqR1NfdHZvdXRfbW9kZXNbM107CisJU0RMX1JlY3QgKiptb2RlcyA9IE5VTEw7CisKKwlzd2l0Y2ggKGZvcm1hdC0+Qml0c1BlclBpeGVsKSB7CisJICAgIGNhc2UgMTY6CisJICAgIGNhc2UgMjQ6CisJICAgIGNhc2UgMzI6CisJCWlmICggc2F2ZWRfdmluZm8ubW9kZSA9PSBQUzJfR1NfVkVTQSApIHsKKwkJCW1vZGVzID0gR1NfdmVzYV9tb2RlczsKKwkJfSBlbHNlIHsKKwkJCWludCBpLCBqID0gMDsKKworLy8gRklYTUUgLSB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGUgc3RyZXRjaCBjb2RlIGF0IDE2IGJwcD8KK2lmICggZm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gMzIgKSBicmVhazsKKwkJCS8qIEFkZCBhIG1vZGUgdGhhdCB3ZSBjb3VsZCBwb3NzaWJseSBzdHJldGNoIHRvICovCisJCQlmb3IgKCBpPTA7IEdTX3Zlc2FfbW9kZXNbaV07ICsraSApIHsKKwkJCQlpZiAoIChHU192ZXNhX21vZGVzW2ldLT53ID09IHNhdmVkX3ZpbmZvLncpICYmCisJCQkJICAgICAoR1NfdmVzYV9tb2Rlc1tpXS0+aCAhPSBzYXZlZF92aW5mby5oKSApIHsKKwkJCQkJR1NfdHZvdXRfc3RyZXRjaC53PUdTX3Zlc2FfbW9kZXNbaV0tPnc7CisJCQkJCUdTX3R2b3V0X3N0cmV0Y2guaD1HU192ZXNhX21vZGVzW2ldLT5oOworCQkJCQlHU190dm91dF9tb2Rlc1tqKytdID0gJkdTX3R2b3V0X3N0cmV0Y2g7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8qIEFkZCB0aGUgY3VycmVudCBUViB2aWRlbyBtb2RlICovCisJCQlHU190dm91dF9tb2RlLncgPSBzYXZlZF92aW5mby53OworCQkJR1NfdHZvdXRfbW9kZS5oID0gc2F2ZWRfdmluZm8uaDsKKwkJCUdTX3R2b3V0X21vZGVzW2orK10gPSAmR1NfdHZvdXRfbW9kZTsKKwkJCUdTX3R2b3V0X21vZGVzW2orK10gPSBOVUxMOworCisJCQkvKiBSZXR1cm4gdGhlIGNyZWF0ZWQgbGlzdCBvZiBtb2RlcyAqLworCQkJbW9kZXMgPSBHU190dm91dF9tb2RlczsKKwkJfQorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybihtb2Rlcyk7Cit9CisKKy8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCitzdGF0aWMgdm9pZCBHU19ETUFGdWxsVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKK3N0YXRpYyBTRExfU3VyZmFjZSAqR1NfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlzdHJ1Y3QgcHMyX3NjcmVlbmluZm8gdmluZm87CisKKwkvKiBTZXQgdGhlIHRlcm1pbmFsIGludG8gZ3JhcGhpY3MgbW9kZSAqLworCWlmICggR1NfRW50ZXJHcmFwaGljc01vZGUodGhpcykgPCAwICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogU2V0IHRoZSB2aWRlbyBtb2RlIGFuZCBnZXQgdGhlIGZpbmFsIHNjcmVlbiBmb3JtYXQgKi8KKwlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19HU0NSRUVOSU5GTywgJnZpbmZvKSA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IGNvbnNvbGUgc2NyZWVuIGluZm8iKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlpZiAoICh2aW5mby53ICE9IHdpZHRoKSB8fCAodmluZm8uaCAhPSBoZWlnaHQpIHx8CisJICAgICAoR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLmJwcCAhPSBicHApICkgeworCQkvKiBJZiB3ZSdyZSBub3QgaW4gVkVTQSBtb2RlLCB3ZSBoYXZlIHRvIHNjYWxlIHJlc29sdXRpb24gKi8KKwkJaWYgKCBzYXZlZF92aW5mby5tb2RlID09IFBTMl9HU19WRVNBICkgeworCQkJc3dpdGNoICh3aWR0aCkgeworCQkJICAgIGNhc2UgNjQwOgorCQkJCXZpbmZvLnJlcyA9IFBTMl9HU182NDB4NDgwOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgODAwOgorCQkJCXZpbmZvLnJlcyA9IFBTMl9HU184MDB4NjAwOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgMTAyNDoKKwkJCQl2aW5mby5yZXMgPSBQUzJfR1NfMTAyNHg3Njg7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSAxMjgwOgorCQkJCXZpbmZvLnJlcyA9IFBTMl9HU18xMjgweDEwMjQ7CisJCQkJYnJlYWs7CisJCQkgICAgZGVmYXVsdDoKKwkJCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIHJlc29sdXRpb246ICVkeCVkXG4iLAorCQkJCQkgICAgIHdpZHRoLCBoZWlnaHQpOworCQkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJCXZpbmZvLnJlcyB8PSAoUFMyX0dTXzc1SHogPDwgOCk7CisJCQl2aW5mby53ID0gd2lkdGg7CisJCQl2aW5mby5oID0gaGVpZ2h0OworCQl9CisJCXZpbmZvLmZicCA9IDA7CisJCXZpbmZvLnBzbSA9IEdTX2Zvcm1hdG1hcFticHAvOF07CisJCWlmICggdmluZm8ucHNtIDwgMCApIHsKKwkJCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgZGVwdGg6ICVkIGJwcFxuIiwgYnBwKTsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCQlpZiAoIGlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19TU0NSRUVOSU5GTywgJnZpbmZvKSA8IDAgKSB7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCBjb25zb2xlIHNjcmVlbiBpbmZvIik7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKworCQkvKiBVbm1hcCB0aGUgcHJldmlvdXMgRE1BIGJ1ZmZlciAqLworCQlpZiAoIG1hcHBlZF9tZW0gKSB7CisJCQltdW5tYXAobWFwcGVkX21lbSwgbWFwcGVkX2xlbik7CisJCQltYXBwZWRfbWVtID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLmJwcCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NfcGl4ZWxtYXNrc1t2aW5mby5wc21dLnIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTX3BpeGVsbWFza3NbdmluZm8ucHNtXS5nLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU19waXhlbG1hc2tzW3ZpbmZvLnBzbV0uYiwgMCkgKSB7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCisJY3VycmVudC0+ZmxhZ3MgPSBTRExfRlVMTFNDUkVFTjsKKwljdXJyZW50LT53ID0gd2lkdGg7CisJY3VycmVudC0+aCA9IGhlaWdodDsKKwljdXJyZW50LT5waXRjaCA9IFNETF9DYWxjdWxhdGVQaXRjaChjdXJyZW50KTsKKworCS8qIE1lbW9yeSBtYXAgdGhlIERNQSBhcmVhIGZvciBibG9jayBtZW1vcnkgdHJhbnNmZXIgKi8KKwlpZiAoICEgbWFwcGVkX21lbSApIHsKKwkJcGl4ZWxzX2xlbiA9IGhlaWdodCAqIGN1cnJlbnQtPnBpdGNoOworCQltYXBwZWRfbGVuID0gcGl4ZWxzX2xlbiArCisJCSAgICAgICAgICAgICAvKiBTY3JlZW4gdXBkYXRlIERNQSBjb21tYW5kIGFyZWEgKi8KKwkJICAgICAgICAgICAgIHNpemVvZihoZWFkX3RhZ3MpICsgKCgyICogTUFYVEFHUykgKiAxNik7CisJCWlmICggc2F2ZWRfdmluZm8ubW9kZSAhPSBQUzJfR1NfVkVTQSApIHsKKwkJCW1hcHBlZF9sZW4gKz0gc2l6ZW9mKHRleF90YWdzKSArIHNpemVvZihzY2FsZV90YWdzKTsKKwkJfQorCQltYXBwZWRfbWVtID0gbW1hcCgwLCBtYXBwZWRfbGVuLCBQUk9UX1JFQUR8UFJPVF9XUklURSwKKwkJICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgbWVtb3J5X2ZkLCAwKTsKKwkJaWYgKCBtYXBwZWRfbWVtID09IE1BUF9GQUlMRUQgKSB7CisJCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBtYXAgJWQgYnl0ZXMgZm9yIERNQSIsCisJCQkgICAgICAgICAgICAgbWFwcGVkX2xlbik7CisJCQltYXBwZWRfbWVtID0gTlVMTDsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCisJCS8qIFNldCB1cCB0aGUgZW50aXJlIHNjcmVlbiBmb3IgRE1BIHRyYW5zZmVyICovCisJCXNjcmVlbl9pbWFnZS5wdHIgPSBtYXBwZWRfbWVtOworCQlzY3JlZW5faW1hZ2UuZmJwID0gMDsKKwkJc2NyZWVuX2ltYWdlLmZidyA9ICh2aW5mby53ICsgNjMpIC8gNjQ7CisJCXNjcmVlbl9pbWFnZS5wc20gPSB2aW5mby5wc207CisJCXNjcmVlbl9pbWFnZS54ID0gMDsKKwkJaWYgKCB2aW5mby5oID09IGhlaWdodCApIHsKKwkJCXNjcmVlbl9pbWFnZS55ID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFB1dCBpbWFnZSBvZmZzY3JlZW4gYW5kIHNjYWxlIHRvIHNjcmVlbiBoZWlnaHQgKi8KKwkJCXNjcmVlbl9pbWFnZS55ID0gdmluZm8uaDsKKwkJfQorCQlzY3JlZW5faW1hZ2UudyA9IGN1cnJlbnQtPnc7CisJCXNjcmVlbl9pbWFnZS5oID0gY3VycmVudC0+aDsKKworCQkvKiBnZXQgc2NyZWVuIGltYWdlIGRhdGEgc2l6ZSAocXdvcmQgYWxpZ25lZCkgKi8KKwkJc2NyZWVuX2ltYWdlX3NpemUgPSAoc2NyZWVuX2ltYWdlLncgKiBzY3JlZW5faW1hZ2UuaCk7CisJCXN3aXRjaCAoc2NyZWVuX2ltYWdlLnBzbSkgeworCQkgICAgY2FzZSBQUzJfR1NfUFNNQ1QzMjoKKwkJCXNjcmVlbl9pbWFnZV9zaXplICo9IDQ7CisJCQlicmVhazsKKwkJICAgIGNhc2UgUFMyX0dTX1BTTUNUMjQ6CisJCQlzY3JlZW5faW1hZ2Vfc2l6ZSAqPSAzOworCQkJYnJlYWs7CisJCSAgICBjYXNlIFBTMl9HU19QU01DVDE2OgorCQkJc2NyZWVuX2ltYWdlX3NpemUgKj0gMjsKKwkJCWJyZWFrOworCQl9CisJCXNjcmVlbl9pbWFnZV9zaXplID0gKHNjcmVlbl9pbWFnZV9zaXplICsgMTUpICYgfjE1OworCisJCS8qIFNldCB1cCB0aGUgbWVtb3J5IGZvciBzY3JlZW4gdXBkYXRlIERNQSBjb21tYW5kcyAqLworCQloZWFkX3RhZ3NfbWVtID0gKHVuc2lnbmVkIGxvbmcgbG9uZyAqKQorCQkgICAgICAgICAgICAgICAgKG1hcHBlZF9tZW0gKyBwaXhlbHNfbGVuKTsKKwkJaW1hZ2VfdGFnc19tZW0gPSAodW5zaWduZWQgbG9uZyBsb25nICopCisJCSAgICAgICAgICAgICAgICAgKChjYWRkcl90KWhlYWRfdGFnc19tZW0gKyBzaXplb2YoaGVhZF90YWdzKSk7CisJCVNETF9tZW1jcHkoaGVhZF90YWdzX21lbSwgaGVhZF90YWdzLCBzaXplb2YoaGVhZF90YWdzKSk7CisJCWlmICggc2F2ZWRfdmluZm8ubW9kZSAhPSBQUzJfR1NfVkVTQSApIHsKKwkJCXRleF90YWdzX21lbSA9ICh1bnNpZ25lZCBsb25nIGxvbmcgKikKKwkJICAgICAgICAgICAgICAgICAoKGNhZGRyX3QpaW1hZ2VfdGFnc19tZW0gKyAoKDIqTUFYVEFHUykqMTYpKTsKKwkJCXNjYWxlX3RhZ3NfbWVtID0gKHVuc2lnbmVkIGxvbmcgbG9uZyAqKQorCQkgICAgICAgICAgICAgICAgICgoY2FkZHJfdCl0ZXhfdGFnc19tZW0gKyBzaXplb2YodGV4X3RhZ3MpKTsKKwkJCVNETF9tZW1jcHkodGV4X3RhZ3NfbWVtLCB0ZXhfdGFncywgc2l6ZW9mKHRleF90YWdzKSk7CisJCQl0ZXhfdGFnc19tZW1bMl0gPSAKKwkJCQkodmluZm8uaCAqIHZpbmZvLncpIC8gNjQgKworCSAgICAgICAgICAJCSgodW5zaWduZWQgbG9uZyBsb25nKXNjcmVlbl9pbWFnZS5mYncgPDwgMTQpICsKKwkgICAgICAgICAgCQkoKHVuc2lnbmVkIGxvbmcgbG9uZylzY3JlZW5faW1hZ2UucHNtIDw8IDIwKSArCisJICAgICAgICAgIAkJKCh1bnNpZ25lZCBsb25nIGxvbmcpcG93ZXJfb2ZfMihzY3JlZW5faW1hZ2UudykgPDwgMjYpICsKKwkgICAgICAgICAgCQkoKHVuc2lnbmVkIGxvbmcgbG9uZylwb3dlcl9vZl8yKHNjcmVlbl9pbWFnZS5oKSA8PCAzMCkgKworCSAgICAgICAgICAJCSgodW5zaWduZWQgbG9uZyBsb25nKTEgPDwgMzQpICsKKwkgICAgICAgICAgCQkoKHVuc2lnbmVkIGxvbmcgbG9uZykxIDw8IDM1KTsKKwkJCVNETF9tZW1jcHkoc2NhbGVfdGFnc19tZW0sIHNjYWxlX3RhZ3MsIHNpemVvZihzY2FsZV90YWdzKSk7CisJCQlzY2FsZV90YWdzX21lbVs4XSA9CisJCQkJKCh1bnNpZ25lZCBsb25nIGxvbmcpc2NyZWVuX2ltYWdlLncgKiAxNikgKworCQkJICAgICAgICAgKCgodW5zaWduZWQgbG9uZyBsb25nKXNjcmVlbl9pbWFnZS5oICogMTYpIDw8IDE2KTsKKwkJCXNjYWxlX3RhZ3NfbWVtWzEwXSA9CisJCQkJKCh1bnNpZ25lZCBsb25nIGxvbmcpdmluZm8udyAqIDE2KSArCisJCQkgICAgICAgICAoKCh1bnNpZ25lZCBsb25nIGxvbmcpdmluZm8uaCAqIDE2KSA8PCAxNik7CisJCX0KKwl9CisJY3VycmVudC0+cGl4ZWxzID0gTlVMTDsKKwlpZiAoIFNETF9nZXRlbnYoIlNETF9GVUxMU0NSRUVOX1VQREFURSIpICkgeworCQkvKiBDb3JyZWN0IHNlbWFudGljcyAqLworCQljdXJyZW50LT5mbGFncyB8PSBTRExfQVNZTkNCTElUOworCX0gZWxzZSB7CisJCS8qIFdlIGxpZSBoZXJlIC0gdGhlIHNjcmVlbiBtZW1vcnkgaXNuJ3QgcmVhbGx5IHRoZSB2aXNpYmxlCisJCSAgIGRpc3BsYXkgbWVtb3J5IGFuZCBzdGlsbCByZXF1aXJlcyBhbiB1cGRhdGUsIGJ1dCB0aGlzCisJCSAgIGhhcyB0aGUgZGVzaXJlZCBlZmZlY3QgZm9yIG1vc3QgYXBwbGljYXRpb25zLgorCQkgKi8KKwkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKKwl9CisKKwkvKiBTZXQgdGhlIHVwZGF0ZSByZWN0YW5nbGUgZnVuY3Rpb24gKi8KKwl0aGlzLT5VcGRhdGVSZWN0cyA9IEdTX0RNQUZ1bGxVcGRhdGU7CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCisvKiBXZSBkb24ndCBzdXBwb3J0IGhhcmR3YXJlIHN1cmZhY2VzIHlldCAqLworc3RhdGljIGludCBHU19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuKC0xKTsKK30KK3N0YXRpYyB2b2lkIEdTX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbnQgR1NfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaWYgKCBzdXJmYWNlID09IHRoaXMtPnNjcmVlbiApIHsKKwkJLyogU2luY2UgbW91c2UgbW90aW9uIGFmZmVjdHMgJ3BpeGVscycsIGxvY2sgaXQgKi8KKwkJU0RMX0xvY2tDdXJzb3IoKTsKKworCQkvKiBNYWtlIHN1cmUgYW55IHBlbmRpbmcgRE1BIGhhcyBjb21wbGV0ZWQgKi8KKwkJaWYgKCBkbWFfcGVuZGluZyApIHsKKwkJCWlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19TRU5EUUNULCAxKTsKKwkJCWRtYV9wZW5kaW5nID0gMDsKKwkJfQorCisJCS8qIElmIHRoZSBjdXJzb3IgaXMgZHJhd24gb24gdGhlIERNQSBhcmVhLCByZW1vdmUgaXQgKi8KKwkJaWYgKCBjdXJzb3JfZHJhd24gKSB7CisJCQlzdXJmYWNlLT5waXhlbHMgPSBtYXBwZWRfbWVtICsgc3VyZmFjZS0+b2Zmc2V0OworCQkJU0RMX0VyYXNlQ3Vyc29yTm9Mb2NrKHRoaXMtPnNjcmVlbik7CisJCQljdXJzb3JfZHJhd24gPSAwOworCQl9CisKKwkJLyogU2V0IHRoZSBzdXJmYWNlIHBpeGVscyB0byB0aGUgYmFzZSBvZiB0aGUgRE1BIGFyZWEgKi8KKwkJc3VyZmFjZS0+cGl4ZWxzID0gbWFwcGVkX21lbTsKKworCQkvKiBXZSdyZSBmaW5pc2hlZCEgKi8KKwkJU0RMX1VubG9ja0N1cnNvcigpOworCX0KKwlyZXR1cm4oMCk7Cit9CitzdGF0aWMgdm9pZCBHU19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWlmICggc3VyZmFjZSA9PSB0aGlzLT5zY3JlZW4gKSB7CisJCS8qIFNpbmNlIG1vdXNlIG1vdGlvbiBhZmZlY3RzICdwaXhlbHMnLCBsb2NrIGl0ICovCisJCVNETF9Mb2NrQ3Vyc29yKCk7CisJCXN1cmZhY2UtPnBpeGVscyA9IE5VTEw7CisJCVNETF9VbmxvY2tDdXJzb3IoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEdTX0RNQUZ1bGxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCS8qIExvY2sgc28gd2UgYXJlbid0IGludGVycnVwdGVkIGJ5IGEgbW91c2UgdXBkYXRlICovCisJU0RMX0xvY2tDdXJzb3IoKTsKKworCS8qIE1ha2Ugc3VyZSBhbnkgcGVuZGluZyBETUEgaGFzIGNvbXBsZXRlZCAqLworCWlmICggZG1hX3BlbmRpbmcgKSB7CisJCWlvY3RsKGNvbnNvbGVfZmQsIFBTMklPQ19TRU5EUUNULCAxKTsKKwkJZG1hX3BlbmRpbmcgPSAwOworCX0KKworCS8qIElmIHRoZSBtb3VzZSBpcyB2aXNpYmxlLCBkcmF3IGl0IG9uIHRoZSBETUEgYXJlYSAqLworCWlmICggKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9WSVNJQkxFKSAmJiAhY3Vyc29yX2RyYXduICkgeworCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IG1hcHBlZF9tZW0gKyB0aGlzLT5zY3JlZW4tPm9mZnNldDsKKwkJU0RMX0RyYXdDdXJzb3JOb0xvY2sodGhpcy0+c2NyZWVuKTsKKwkJdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOworCQljdXJzb3JfZHJhd24gPSAxOworCX0KKworCS8qIFB1dCB0aGUgaW1hZ2Ugb250byB0aGUgc2NyZWVuICovCisJbG9hZGltYWdlX25vbmJsb2NrKGNvbnNvbGVfZmQsCisJICAgICAgICAgICAgICAgICAgICZzY3JlZW5faW1hZ2UsIHNjcmVlbl9pbWFnZV9zaXplLAorCSAgICAgICAgICAgICAgICAgICBoZWFkX3RhZ3NfbWVtLCBpbWFnZV90YWdzX21lbSk7CisJaWYgKCBzY3JlZW5faW1hZ2UueSA+IDAgKSB7CisJCS8qIE5lZWQgdG8gc2NhbGUgb2Zmc2NyZWVuIGltYWdlIHRvIFRWIG91dHB1dCAqLworCQlpb2N0bChjb25zb2xlX2ZkLCBQUzJJT0NfU0VORFFDVCwgMSk7CisJCWRtYV9wZW5kaW5nID0gMDsKKwkJc2NhbGVpbWFnZV9ub25ibG9jayhjb25zb2xlX2ZkLCB0ZXhfdGFnc19tZW0sIHNjYWxlX3RhZ3NfbWVtKTsKKwl9IGVsc2UgeworCQlkbWFfcGVuZGluZyA9IDE7CisJfQorCisJLyogV2UncmUgZmluaXNoZWQhICovCisJU0RMX1VubG9ja0N1cnNvcigpOworfQorCitzdGF0aWMgaW50IEdTX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKK3sKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIEdTX1ZpZGVvUXVpdChfVEhJUykKK3sKKwkvKiBDbG9zZSBjb25zb2xlIGFuZCBpbnB1dCBmaWxlIGRlc2NyaXB0b3JzICovCisJaWYgKCBjb25zb2xlX2ZkID4gMCApIHsKKwkJLyogVW5tYXAgdGhlIHZpZGVvIGZyYW1lYnVmZmVyICovCisJCWlmICggbWFwcGVkX21lbSApIHsKKwkJCS8qIFVubWFwIHRoZSB2aWRlbyBmcmFtZWJ1ZmZlciAqLworCQkJbXVubWFwKG1hcHBlZF9tZW0sIG1hcHBlZF9sZW4pOworCQkJbWFwcGVkX21lbSA9IE5VTEw7CisJCX0KKwkJY2xvc2UobWVtb3J5X2ZkKTsKKworCQkvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB2aWRlbyBtb2RlICovCisJCWlmICggR1NfSW5HcmFwaGljc01vZGUodGhpcykgKSB7CisJCQlpb2N0bChjb25zb2xlX2ZkLCBQUzJJT0NfU1NDUkVFTklORk8sICZzYXZlZF92aW5mbyk7CisJCX0KKworCQkvKiBXZSdyZSBhbGwgZG9uZSB3aXRoIHRoZSBncmFwaGljcyBkZXZpY2UgKi8KKwkJY2xvc2UoY29uc29sZV9mZCk7CisJCWNvbnNvbGVfZmQgPSAtMTsKKwl9CisJR1NfQ2xvc2VNb3VzZSh0aGlzKTsKKwlHU19DbG9zZUtleWJvYXJkKHRoaXMpOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3N2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3N2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NzJkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc3ZpZGVvLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9nc3ZpZGVvX2gKKyNkZWZpbmUgX1NETF9nc3ZpZGVvX2gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wczIvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHMyL2dzLmg+CisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICJTRExfbXV0ZXguaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcworCisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgeworCS8qIEdvdHRhIGxvdmUgdGhhdCBzaW1wbGUgUFMyIGdyYXBoaWNzIGludGVyZmFjZS4gOikgKi8KKwlpbnQgY29uc29sZV9mZDsKKwlpbnQgbWVtb3J5X2ZkOworCXN0cnVjdCBwczJfc2NyZWVuaW5mbyBzYXZlZF92aW5mbzsKKworCS8qIFllIG9sZGUgbGludXgga2V5Ym9hcmQgY29kZSAqLworCWludCBjdXJyZW50X3Z0OworCWludCBzYXZlZF92dDsKKwlpbnQga2V5Ym9hcmRfZmQ7CisJaW50IHNhdmVkX2tiZF9tb2RlOworCXN0cnVjdCB0ZXJtaW9zIHNhdmVkX2tiZF90ZXJtaW9zOworCisJLyogWWUgb2xkZSBsaW51eCBtb3VzZSBjb2RlICovCisJaW50IG1vdXNlX2ZkOworCWludCBjdXJzb3JfZHJhd247CisKKwkvKiBUaGUgbWVtb3J5IG1hcHBlZCBETUEgYXJlYSBhbmQgYXNzb2NpYXRlZCB2YXJpYWJsZXMgKi8KKwljYWRkcl90IG1hcHBlZF9tZW07CisJaW50IHBpeGVsc19sZW47CisJaW50IG1hcHBlZF9sZW47CisJc3RydWN0IHBzMl9pbWFnZSBzY3JlZW5faW1hZ2U7CisJaW50IHNjcmVlbl9pbWFnZV9zaXplOworCXVuc2lnbmVkIGxvbmcgbG9uZyAqaGVhZF90YWdzX21lbTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgKmltYWdlX3RhZ3NfbWVtOworCXVuc2lnbmVkIGxvbmcgbG9uZyAqdGV4X3RhZ3NfbWVtOworCXVuc2lnbmVkIGxvbmcgbG9uZyAqc2NhbGVfdGFnc19tZW07CisJaW50IGRtYV9wZW5kaW5nOworfTsKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBjb25zb2xlX2ZkCQkodGhpcy0+aGlkZGVuLT5jb25zb2xlX2ZkKQorI2RlZmluZSBtZW1vcnlfZmQJCSh0aGlzLT5oaWRkZW4tPm1lbW9yeV9mZCkKKyNkZWZpbmUgc2F2ZWRfdmluZm8JCSh0aGlzLT5oaWRkZW4tPnNhdmVkX3ZpbmZvKQorI2RlZmluZSBjdXJyZW50X3Z0CQkodGhpcy0+aGlkZGVuLT5jdXJyZW50X3Z0KQorI2RlZmluZSBzYXZlZF92dAkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfdnQpCisjZGVmaW5lIGtleWJvYXJkX2ZkCQkodGhpcy0+aGlkZGVuLT5rZXlib2FyZF9mZCkKKyNkZWZpbmUgc2F2ZWRfa2JkX21vZGUJCSh0aGlzLT5oaWRkZW4tPnNhdmVkX2tiZF9tb2RlKQorI2RlZmluZSBzYXZlZF9rYmRfdGVybWlvcwkodGhpcy0+aGlkZGVuLT5zYXZlZF9rYmRfdGVybWlvcykKKyNkZWZpbmUgbW91c2VfZmQJCSh0aGlzLT5oaWRkZW4tPm1vdXNlX2ZkKQorI2RlZmluZSBjdXJzb3JfZHJhd24JCSh0aGlzLT5oaWRkZW4tPmN1cnNvcl9kcmF3bikKKyNkZWZpbmUgbWFwcGVkX21lbQkJKHRoaXMtPmhpZGRlbi0+bWFwcGVkX21lbSkKKyNkZWZpbmUgcGl4ZWxzX2xlbgkJKHRoaXMtPmhpZGRlbi0+cGl4ZWxzX2xlbikKKyNkZWZpbmUgbWFwcGVkX2xlbgkJKHRoaXMtPmhpZGRlbi0+bWFwcGVkX2xlbikKKyNkZWZpbmUgc2NyZWVuX2ltYWdlCQkodGhpcy0+aGlkZGVuLT5zY3JlZW5faW1hZ2UpCisjZGVmaW5lIHNjcmVlbl9pbWFnZV9zaXplCSh0aGlzLT5oaWRkZW4tPnNjcmVlbl9pbWFnZV9zaXplKQorI2RlZmluZSBoZWFkX3RhZ3NfbWVtCQkodGhpcy0+aGlkZGVuLT5oZWFkX3RhZ3NfbWVtKQorI2RlZmluZSBpbWFnZV90YWdzX21lbQkJKHRoaXMtPmhpZGRlbi0+aW1hZ2VfdGFnc19tZW0pCisjZGVmaW5lIHRleF90YWdzX21lbQkJKHRoaXMtPmhpZGRlbi0+dGV4X3RhZ3NfbWVtKQorI2RlZmluZSBzY2FsZV90YWdzX21lbQkJKHRoaXMtPmhpZGRlbi0+c2NhbGVfdGFnc19tZW0pCisjZGVmaW5lIGRtYV9wZW5kaW5nCQkodGhpcy0+aGlkZGVuLT5kbWFfcGVuZGluZykKKworLyogU2hhcmVkIGJldHdlZW4gdGhlIG1vdXNlIGFuZCB2aWRlbyBjb2RlIGZvciBzY3JlZW4gdXBkYXRlIHNjYWxpbmcgKi8KK2V4dGVybiBpbnQgc2NhbGVpbWFnZV9ub25ibG9jayhpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nICp0bSwgdW5zaWduZWQgbG9uZyBsb25nICpzbSk7CisjZW5kaWYgLyogX1NETF9nc3ZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMyZ3MvU0RMX2dzeXV2LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc3l1di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNTJhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc3l1di5jCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBpcyB0aGUgUGxheXN0YXRpb24gMiBpbXBsZW1lbnRhdGlvbiBvZiBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgkJLyogRm9yIGRlZmluaXRpb24gb2YgUEFHRV9TSVpFICovCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfZ3N5dXZfYy5oIgorI2luY2x1ZGUgIi4uL1NETF95dXZmdW5jcy5oIgorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgMTZ4MTYgcGl4ZWwgYmxvY2sgY29udmVydGVkIGF0IG9uY2UgKi8KKyNkZWZpbmUgTUFYX01BQ1JPQkxPQ0tTCTEwMjQJLyogMl4xMCBtYWNyb2Jsb2NrcyBhdCBvbmNlICovCisKKy8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBtYW5pcHVsYXRlIHZpZGVvIG92ZXJsYXlzICovCitzdGF0aWMgc3RydWN0IHByaXZhdGVfeXV2aHdmdW5jcyBnc195dXZmdW5jcyA9IHsKKwlHU19Mb2NrWVVWT3ZlcmxheSwKKwlHU19VbmxvY2tZVVZPdmVybGF5LAorCUdTX0Rpc3BsYXlZVVZPdmVybGF5LAorCUdTX0ZyZWVZVVZPdmVybGF5Cit9OworCitzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgeworCWludCBpcHVfZmQ7CisJVWludDggKnBpeGVsczsKKwlpbnQgbWFjcm9ibG9ja3M7CisJaW50IGRtYV9sZW47CisJY2FkZHJfdCBkbWFfbWVtOworCWNhZGRyX3QgaXB1X2ltZW07CisJY2FkZHJfdCBpcHVfb21lbTsKKwljYWRkcl90IGRtYV90YWdzOworCXVuc2lnbmVkIGxvbmcgbG9uZyAqc3RyZXRjaF94MXkxOworCXVuc2lnbmVkIGxvbmcgbG9uZyAqc3RyZXRjaF94MnkyOworCXN0cnVjdCBwczJfcGxpc3QgcGxpc3Q7CisKKwkvKiBUaGVzZSBhcmUganVzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIHRoZW0gc2VwYXJhdGVseSAqLworCVVpbnQxNiBwaXRjaGVzWzNdOworCVVpbnQ4ICpwbGFuZXNbM107Cit9OworCitzdGF0aWMgaW50IHBvd2VyX29mXzIoaW50IHZhbHVlKQoreworCWludCBzaGlmdDsKKworCWZvciAoIHNoaWZ0ID0gMDsgKDE8PHNoaWZ0KSA8IHZhbHVlOyArK3NoaWZ0ICkgeworCQkvKiBLZWVwIGxvb2tpbmcgKi8gOworCX0KKwlyZXR1cm4oc2hpZnQpOworfQorCitTRExfT3ZlcmxheSAqR1NfQ3JlYXRlWVVWT3ZlcmxheShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBVaW50MzIgZm9ybWF0LCBTRExfU3VyZmFjZSAqZGlzcGxheSkKK3sKKwlTRExfT3ZlcmxheSAqb3ZlcmxheTsKKwlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKKwlpbnQgbWFwX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgKnRhZ3M7CisJY2FkZHJfdCBiYXNlOworCWludCBicHA7CisJaW50IGZicCwgZmJ3LCBwc207CisJaW50IHgsIHksIHcsIGg7CisJaW50IHBudW07CisJc3RydWN0IHBzMl9wYWNrZXQgKnBhY2tldDsKKwlzdHJ1Y3QgcHMyX3BhY2tldCB0ZXhfcGFja2V0OworCisJLyogV2UgY2FuIG9ubHkgZGVjb2RlIGJsb2NrcyBvZiAxNngxNiBwaXhlbHMgKi8KKwlpZiAoICh3aWR0aCAmIDE1KSB8fCAoaGVpZ2h0ICYgMTUpICkgeworCQlTRExfU2V0RXJyb3IoIk92ZXJsYXkgd2lkdGgvaGVpZ2h0IG11c3QgYmUgbXVsdGlwbGVzIG9mIDE2Iik7CisJCXJldHVybihOVUxMKTsKKwl9CisJLyogTWFrZSBzdXJlIHRoZSBpbWFnZSBpc24ndCB0b28gbGFyZ2UgZm9yIGEgc2luZ2xlIERNQSB0cmFuc2ZlciAqLworCWlmICggKCh3aWR0aC8xNikgKiAoaGVpZ2h0LzE2KSkgPiBNQVhfTUFDUk9CTE9DS1MgKSB7CisJCVNETF9TZXRFcnJvcigiT3ZlcmxheSB0b28gbGFyZ2UgKG1heGltdW0gc2l6ZTogJWQgcGl4ZWxzKSIsCisJCSAgICAgICAgICAgICBNQVhfTUFDUk9CTE9DS1MgKiAxNiAqIDE2KTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIERvdWJsZS1jaGVjayB0aGUgcmVxdWVzdGVkIGZvcm1hdC4gIEZvciBzaW1wbGljaXR5LCB3ZSdsbCBvbmx5CisJICAgc3VwcG9ydCBwbGFuYXIgWVVWIGZvcm1hdHMuCisJICovCisJc3dpdGNoIChmb3JtYXQpIHsKKwkgICAgY2FzZSBTRExfWVYxMl9PVkVSTEFZOgorCSAgICBjYXNlIFNETF9JWVVWX09WRVJMQVk6CisJCS8qIFN1cHBvcnRlZCBwbGFuYXIgWVVWIGZvcm1hdCAqLworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBZVVYgZm9ybWF0Iik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIG92ZXJsYXkgc3RydWN0dXJlICovCisJb3ZlcmxheSA9IChTRExfT3ZlcmxheSAqKVNETF9tYWxsb2Moc2l6ZW9mICpvdmVybGF5KTsKKwlpZiAoIG92ZXJsYXkgPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJU0RMX21lbXNldChvdmVybGF5LCAwLCAoc2l6ZW9mICpvdmVybGF5KSk7CisKKwkvKiBGaWxsIGluIHRoZSBiYXNpYyBtZW1iZXJzICovCisJb3ZlcmxheS0+Zm9ybWF0ID0gZm9ybWF0OworCW92ZXJsYXktPncgPSB3aWR0aDsKKwlvdmVybGF5LT5oID0gaGVpZ2h0OworCisJLyogU2V0IHVwIHRoZSBZVVYgc3VyZmFjZSBmdW5jdGlvbiBzdHJ1Y3R1cmUgKi8KKwlvdmVybGF5LT5od2Z1bmNzID0gJmdzX3l1dmZ1bmNzOworCW92ZXJsYXktPmh3X292ZXJsYXkgPSAxOworCisJLyogQ3JlYXRlIHRoZSBwaXhlbCBkYXRhICovCisJaHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqKVNETF9tYWxsb2Moc2l6ZW9mICpod2RhdGEpOworCW92ZXJsYXktPmh3ZGF0YSA9IGh3ZGF0YTsKKwlpZiAoIGh3ZGF0YSA9PSBOVUxMICkgeworCQlTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWh3ZGF0YS0+aXB1X2ZkID0gLTE7CisJaHdkYXRhLT5waXhlbHMgPSAoVWludDggKilTRExfbWFsbG9jKHdpZHRoKmhlaWdodCoyKTsKKwlpZiAoIGh3ZGF0YS0+cGl4ZWxzID09IE5VTEwgKSB7CisJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJaHdkYXRhLT5tYWNyb2Jsb2NrcyA9ICh3aWR0aC8xNikgKiAoaGVpZ2h0LzE2KTsKKworCS8qIEZpbmQgdGhlIHBpdGNoIGFuZCBvZmZzZXQgdmFsdWVzIGZvciB0aGUgb3ZlcmxheSAqLworCW92ZXJsYXktPnBpdGNoZXMgPSBod2RhdGEtPnBpdGNoZXM7CisJb3ZlcmxheS0+cGl4ZWxzID0gaHdkYXRhLT5wbGFuZXM7CisJc3dpdGNoIChmb3JtYXQpIHsKKwkgICAgY2FzZSBTRExfWVYxMl9PVkVSTEFZOgorCSAgICBjYXNlIFNETF9JWVVWX09WRVJMQVk6CisJCW92ZXJsYXktPnBpdGNoZXNbMF0gPSBvdmVybGF5LT53OworCQlvdmVybGF5LT5waXRjaGVzWzFdID0gb3ZlcmxheS0+cGl0Y2hlc1swXSAvIDI7CisJCW92ZXJsYXktPnBpdGNoZXNbMl0gPSBvdmVybGF5LT5waXRjaGVzWzBdIC8gMjsKKwkgICAgICAgIG92ZXJsYXktPnBpeGVsc1swXSA9IGh3ZGF0YS0+cGl4ZWxzOworCSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzFdID0gb3ZlcmxheS0+cGl4ZWxzWzBdICsKKwkJICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS0+cGl0Y2hlc1swXSAqIG92ZXJsYXktPmg7CisJICAgICAgICBvdmVybGF5LT5waXhlbHNbMl0gPSBvdmVybGF5LT5waXhlbHNbMV0gKworCQkgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LT5waXRjaGVzWzFdICogb3ZlcmxheS0+aCAvIDI7CisJCW92ZXJsYXktPnBsYW5lcyA9IDM7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKGNhdWdodCBhYm92ZSkgKi8KKwkJYnJlYWs7CisJfQorCisJLyogVGhlb3JldGljYWxseSB3ZSBjb3VsZCBzdXBwb3J0IHNldmVyYWwgY29uY3VycmVudCBkZWNvZGUKKwkgICBzdHJlYW1zIHF1ZXVlaW5nIHVwIG9uIHRoZSBzYW1lIGZpbGUgZGVzY3JpcHRvciwgYnV0IGZvcgorCSAgIHNpbXBsaWNpdHkgd2UnbGwgc3VwcG9ydCBvbmx5IG9uZS4gIE9wZW5pbmcgdGhlIElQVSBtb3JlCisJICAgdGhhbiBvbmNlIHdpbGwgZmFpbCB3aXRoIEVCVVNZLgorCSovCisJaHdkYXRhLT5pcHVfZmQgPSBvcGVuKCIvZGV2L3BzMmlwdSIsIE9fUkRXUik7CisJaWYgKCBod2RhdGEtPmlwdV9mZCA8IDAgKSB7CisJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJU0RMX1NldEVycm9yKCJQbGF5c3RhdGlvbiAyIElQVSBidXN5Iik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIERNQSBhcmVhIGZvciBwaXhlbCBjb252ZXJzaW9uICovCisJYnBwID0gdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJbWFwX29mZnNldCA9IChtYXBwZWRfbGVuICsgKHN5c2NvbmYoX1NDX1BBR0VTSVpFKSAtIDEpKSAmIH4oc3lzY29uZihfU0NfUEFHRVNJWkUpIC0gMSk7CisJaHdkYXRhLT5kbWFfbGVuID0gaHdkYXRhLT5tYWNyb2Jsb2NrcyAqICgxNiAqIDE2ICsgOCAqIDggKyA4ICogOCkgKworCSAgICAgICAgICAgICAgICAgIHdpZHRoICogaGVpZ2h0ICogYnBwICsKKwkgICAgICAgICAgICAgICAgICBod2RhdGEtPm1hY3JvYmxvY2tzICogKDE2ICogc2l6ZW9mKGxvbmcgbG9uZykpICsKKwkgICAgICAgICAgICAgICAgICAxMiAqIHNpemVvZihsb25nIGxvbmcpOworCWh3ZGF0YS0+ZG1hX21lbSA9IG1tYXAoMCwgaHdkYXRhLT5kbWFfbGVuLCBQUk9UX1JFQUR8UFJPVF9XUklURSwKKwkgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIG1lbW9yeV9mZCwgbWFwX29mZnNldCk7CisJaWYgKCBod2RhdGEtPmRtYV9tZW0gPT0gTUFQX0ZBSUxFRCApIHsKKwkJaHdkYXRhLT5pcHVfaW1lbSA9IChjYWRkcl90KTA7CisJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gbWFwICVkIGJ5dGVzIGZvciBETUEiLCBod2RhdGEtPmRtYV9sZW4pOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWh3ZGF0YS0+aXB1X2ltZW0gPSBod2RhdGEtPmRtYV9tZW07CisJaHdkYXRhLT5pcHVfb21lbSA9IGh3ZGF0YS0+aXB1X2ltZW0gKworCSAgICAgICAgICAgICAgICAgICBod2RhdGEtPm1hY3JvYmxvY2tzICogKDE2ICogMTYgKyA4ICogOCArIDggKiA4KTsKKwlod2RhdGEtPmRtYV90YWdzID0gaHdkYXRhLT5pcHVfb21lbSArIHdpZHRoICogaGVpZ2h0ICogYnBwOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgRE1BIHBhY2tldHMgKi8KKwlod2RhdGEtPnBsaXN0Lm51bSA9IGh3ZGF0YS0+bWFjcm9ibG9ja3MgKiA0ICsgMTsKKwlod2RhdGEtPnBsaXN0LnBhY2tldCA9IChzdHJ1Y3QgcHMyX3BhY2tldCAqKVNETF9tYWxsb2MoCisJICAgICAgICAgICAgICAgICAgICAgICBod2RhdGEtPnBsaXN0Lm51bSpzaXplb2Yoc3RydWN0IHBzMl9wYWNrZXQpKTsKKwlpZiAoICEgaHdkYXRhLT5wbGlzdC5wYWNrZXQgKSB7CisJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJcG51bSA9IDA7CisJcGFja2V0ID0gaHdkYXRhLT5wbGlzdC5wYWNrZXQ7CisKKwkvKiBTZXQgdXAgdGhlIHRhZ3MgdG8gc2VuZCB0aGUgaW1hZ2UgdG8gdGhlIHNjcmVlbiAqLworCXRhZ3MgPSAodW5zaWduZWQgbG9uZyBsb25nICopaHdkYXRhLT5kbWFfdGFnczsKKwliYXNlID0gaHdkYXRhLT5pcHVfb21lbTsKKwlmYnAgPSBzY3JlZW5faW1hZ2UuZmJwOworCWZidyA9IHNjcmVlbl9pbWFnZS5mYnc7CisJcHNtID0gc2NyZWVuX2ltYWdlLnBzbTsKKwl5ID0gc2NyZWVuX2ltYWdlLnkgKyBzY3JlZW5faW1hZ2UuaDsJLyogT2Zmc2NyZWVuIHZpZGVvIG1lbW9yeSAqLworCWZvciAoIGg9aGVpZ2h0LzE2OyBoOyAtLWggKSB7CisJCXggPSAwOwkJCS8qIFZpc2libGUgdmlkZW8gbWVtb3J5ICovCisJCWZvciAoIHc9d2lkdGgvMTY7IHc7IC0tdyApIHsKKwkJCS8qIFRoZSBoZWFkIHRhZyAqLworCQkJcGFja2V0W3BudW1dLnB0ciA9ICZ0YWdzWzBdOworCQkJcGFja2V0W3BudW1dLmxlbiA9IDEwICogc2l6ZW9mKCp0YWdzKTsKKwkJCSsrcG51bTsKKwkJCXRhZ3NbMF0gPSA0IHwgKDFMTCA8PCA2MCk7CS8qIEdJRnRhZyAqLworCQkJdGFnc1sxXSA9IDB4MGU7CQkJLyogQStEICovCisJCQl0YWdzWzJdID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpZmJwIDw8IDMyKSB8CisJCQkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpZmJ3IDw8IDQ4KSB8CisJCQkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpcHNtIDw8IDU2KTsKKwkJCXRhZ3NbM10gPSBQUzJfR1NfQklUQkxUQlVGOworCQkJdGFnc1s0XSA9ICgodW5zaWduZWQgbG9uZyBsb25nKXggPDwgMzIpIHwKKwkJCSAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZyl5IDw8IDQ4KTsKKwkJCXRhZ3NbNV0gPSBQUzJfR1NfVFJYUE9TOworCQkJdGFnc1s2XSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpMTYgfAorCQkJICAgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKTE2IDw8IDMyKTsKKwkJCXRhZ3NbN10gPSBQUzJfR1NfVFJYUkVHOworCQkJdGFnc1s4XSA9IDA7CisJCQl0YWdzWzldID0gUFMyX0dTX1RSWERJUjsKKwkJCS8qIE5vdyB0aGUgYWN0dWFsIGltYWdlIGRhdGEgKi8KKwkJCXBhY2tldFtwbnVtXS5wdHIgPSAmdGFnc1sxMF07CisJCQlwYWNrZXRbcG51bV0ubGVuID0gMiAqIHNpemVvZigqdGFncyk7CisJCQkrK3BudW07CisJCQl0YWdzWzEwXSA9ICgoMTYqMTYqYnBwKSA+PiA0KSB8ICgyTEwgPDwgNTgpOworCQkJdGFnc1sxMV0gPSAwOworCQkJcGFja2V0W3BudW1dLnB0ciA9ICh2b2lkICopYmFzZTsKKwkJCXBhY2tldFtwbnVtXS5sZW4gPSAxNiAqIDE2ICogYnBwOworCQkJKytwbnVtOworCQkJcGFja2V0W3BudW1dLnB0ciA9ICZ0YWdzWzEyXTsKKwkJCXBhY2tldFtwbnVtXS5sZW4gPSAyICogc2l6ZW9mKCp0YWdzKTsKKwkJCSsrcG51bTsKKwkJCXRhZ3NbMTJdID0gKDAgPj4gNCkgfCAoMSA8PCAxNSkgfCAoMkxMIDw8IDU4KTsKKwkJCXRhZ3NbMTNdID0gMDsKKworCQkJdGFncyArPSAxNjsKKwkJCWJhc2UgKz0gMTYgKiAxNiAqIGJwcDsKKworCQkJeCArPSAxNjsKKwkJfQorCQl5ICs9IDE2OworCX0KKworCS8qIFNldCB1cCB0aGUgdGV4dHVyZSBtZW1vcnkgYXJlYSBmb3IgdGhlIHZpZGVvICovCisJdGV4X3BhY2tldC5wdHIgPSB0YWdzOworCXRleF9wYWNrZXQubGVuID0gOCAqIHNpemVvZigqdGFncyk7CisJdGFnc1swXSA9IDMgfCAoMUxMIDw8IDYwKTsJLyogR0lGdGFnICovCisJdGFnc1sxXSA9IDB4MGU7CQkJLyogQStEICovCisJdGFnc1syXSA9ICgoc2NyZWVuX2ltYWdlLnkgKyBzY3JlZW5faW1hZ2UuaCkgKiBzY3JlZW5faW1hZ2UudykgLyA2NCArCisJICAgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKWZidyA8PCAxNCkgKworCSAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZylwc20gPDwgMjApICsKKwkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpcG93ZXJfb2ZfMih3aWR0aCkgPDwgMjYpICsKKwkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpcG93ZXJfb2ZfMihoZWlnaHQpIDw8IDMwKSArCisJICAgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKTEgPDwgMzQpICsKKwkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpMSA8PCAzNSk7CisJdGFnc1szXSA9IFBTMl9HU19URVgwXzE7CisJdGFnc1s0XSA9ICgxIDw8IDUpICsgKDEgPDwgNik7CisJdGFnc1s1XSA9IFBTMl9HU19URVgxXzE7CisJdGFnc1s2XSA9IDA7CisJdGFnc1s3XSA9IFBTMl9HU19URVhGTFVTSDsKKwlpb2N0bChjb25zb2xlX2ZkLCBQUzJJT0NfU0VORCwgJnRleF9wYWNrZXQpOworCisJLyogU2V0IHVwIHRoZSB0YWdzIGZvciBzY2FsaW5nIHRoZSBpbWFnZSAqLworCXBhY2tldFtwbnVtXS5wdHIgPSB0YWdzOworCXBhY2tldFtwbnVtXS5sZW4gPSAxMiAqIHNpemVvZigqdGFncyk7CisJKytwbnVtOworCXRhZ3NbMF0gPSA1IHwgKDFMTCA8PCA2MCk7CS8qIEdJRnRhZyAqLworCXRhZ3NbMV0gPSAweDBlOwkJCS8qIEErRCAqLworCXRhZ3NbMl0gPSA2ICsgKDEgPDwgNCkgKyAoMSA8PCA4KTsKKwl0YWdzWzNdID0gUFMyX0dTX1BSSU07CisJdGFnc1s0XSA9ICgodW5zaWduZWQgbG9uZyBsb25nKTAgKiAxNikgKworCSAgICAgICAgICAgKCgodW5zaWduZWQgbG9uZyBsb25nKTAgKiAxNikgPDwgMTYpOworCXRhZ3NbNV0gPSBQUzJfR1NfVVY7CisJdGFnc1s2XSA9IDA7IC8qIFgxLCBZMSAqLworCXRhZ3NbN10gPSBQUzJfR1NfWFlaMjsKKwlod2RhdGEtPnN0cmV0Y2hfeDF5MSA9ICZ0YWdzWzZdOworCXRhZ3NbOF0gPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylvdmVybGF5LT53ICogMTYpICsKKwkgICAgICAgICAgICgoKHVuc2lnbmVkIGxvbmcgbG9uZylvdmVybGF5LT5oICogMTYpIDw8IDE2KTsKKwl0YWdzWzldID0gUFMyX0dTX1VWOworCXRhZ3NbMTBdID0gMDsgLyogWDIsIFkyICovCisJdGFnc1sxMV0gPSBQUzJfR1NfWFlaMjsKKwlod2RhdGEtPnN0cmV0Y2hfeDJ5MiA9ICZ0YWdzWzEwXTsKKworCS8qIFdlJ3JlIGFsbCBkb25lLi4gKi8KKwlyZXR1cm4ob3ZlcmxheSk7Cit9CisKK2ludCBHU19Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCit7CisJcmV0dXJuKDApOworfQorCit2b2lkIEdTX1VubG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQoreworCXJldHVybjsKK30KKworaW50IEdTX0Rpc3BsYXlZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSwgU0RMX1JlY3QgKnNyYywgU0RMX1JlY3QgKmRzdCkKK3sKKwlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKKwlfX3UzMiBjbWQ7CisJc3RydWN0IHBzMl9wYWNrZXQgcGFja2V0OworCWludCBoLCB3LCBpOworCVVpbnQzMiAqbHVtLCAqQ3IsICpDYjsKKwlpbnQgbHVtX3BpdGNoOworCWludCBjcmJfcGl0Y2g7CisJVWludDMyICpsdW1fc3JjLCAqQ3Jfc3JjLCAqQ2Jfc3JjOworCVVpbnQzMiAqc3JjcCwgKmRzdHA7CisJdW5zaWduZWQgaW50IHgsIHk7CisJU0RMX1N1cmZhY2UgKnNjcmVlbjsKKworCS8qIEZpbmQgb3V0IHdoZXJlIHRoZSB2YXJpb3VzIHBvcnRpb25zIG9mIHRoZSBpbWFnZSBhcmUgKi8KKwlod2RhdGEgPSBvdmVybGF5LT5od2RhdGE7CisJc3dpdGNoIChvdmVybGF5LT5mb3JtYXQpIHsKKwkgICAgY2FzZSBTRExfWVYxMl9PVkVSTEFZOgorCQlsdW0gPSAoVWludDMyICopb3ZlcmxheS0+cGl4ZWxzWzBdOworCQlDciA9ICAoVWludDMyICopb3ZlcmxheS0+cGl4ZWxzWzFdOworCQlDYiA9ICAoVWludDMyICopb3ZlcmxheS0+cGl4ZWxzWzJdOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfSVlVVl9PVkVSTEFZOgorCQlsdW0gPSAoVWludDMyICopb3ZlcmxheS0+cGl4ZWxzWzBdOworCQlDciA9ICAoVWludDMyICopb3ZlcmxheS0+cGl4ZWxzWzJdOworCQlDYiA9ICAoVWludDMyICopb3ZlcmxheS0+cGl4ZWxzWzFdOworCSAgICBkZWZhdWx0OgorCQlTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIFlVViBmb3JtYXQgaW4gYmxpdCAoPykiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJZHN0cCA9IChVaW50MzIgKilod2RhdGEtPmlwdV9pbWVtOworCWx1bV9waXRjaCA9IG92ZXJsYXktPncvNDsKKwljcmJfcGl0Y2ggPSAob3ZlcmxheS0+dy8yKS80OworCisJLyogQ29weSBibG9ja3Mgb2YgMTZ4MTYgcGl4ZWxzIHRvIHRoZSBETUEgYXJlYSAqLworCWZvciAoIGg9b3ZlcmxheS0+aC8xNjsgaDsgLS1oICkgeworCQlsdW1fc3JjID0gbHVtOworCQlDcl9zcmMgPSBDcjsKKwkJQ2Jfc3JjID0gQ2I7CisJCWZvciAoIHc9b3ZlcmxheS0+dy8xNjsgdzsgLS13ICkgeworCQkJc3JjcCA9IGx1bV9zcmM7CisJCQlmb3IgKCBpPTA7IGk8MTY7ICsraSApIHsKKwkJCQlkc3RwWzBdID0gc3JjcFswXTsKKwkJCQlkc3RwWzFdID0gc3JjcFsxXTsKKwkJCQlkc3RwWzJdID0gc3JjcFsyXTsKKwkJCQlkc3RwWzNdID0gc3JjcFszXTsKKwkJCQlzcmNwICs9IGx1bV9waXRjaDsKKwkJCQlkc3RwICs9IDQ7CisJCQl9CisJCQlzcmNwID0gQ2Jfc3JjOworCQkJZm9yICggaT0wOyBpPDg7ICsraSApIHsKKwkJCQlkc3RwWzBdID0gc3JjcFswXTsKKwkJCQlkc3RwWzFdID0gc3JjcFsxXTsKKwkJCQlzcmNwICs9IGNyYl9waXRjaDsKKwkJCQlkc3RwICs9IDI7CisJCQl9CisJCQlzcmNwID0gQ3Jfc3JjOworCQkJZm9yICggaT0wOyBpPDg7ICsraSApIHsKKwkJCQlkc3RwWzBdID0gc3JjcFswXTsKKwkJCQlkc3RwWzFdID0gc3JjcFsxXTsKKwkJCQlzcmNwICs9IGNyYl9waXRjaDsKKwkJCQlkc3RwICs9IDI7CisJCQl9CisJCQlsdW1fc3JjICs9IDE2IC8gNDsKKwkJCUNiX3NyYyArPSA4IC8gNDsKKwkJCUNyX3NyYyArPSA4IC8gNDsKKwkJfQorCQlsdW0gKz0gbHVtX3BpdGNoICogMTY7CisJCUNyICs9IGNyYl9waXRjaCAqIDg7CisJCUNiICs9IGNyYl9waXRjaCAqIDg7CisJfQorCisJLyogU2VuZCB0aGUgbWFjcm9ibG9jayBkYXRhIHRvIHRoZSBJUFUgKi8KKyNpZmRlZiBERUJVR19ZVVYKKwlmcHJpbnRmKHN0ZGVyciwgIlNlbmRpbmcgZGF0YSB0byBJUFUuLlxuIik7CisjZW5kaWYKKwlwYWNrZXQucHRyID0gaHdkYXRhLT5pcHVfaW1lbTsKKwlwYWNrZXQubGVuID0gaHdkYXRhLT5tYWNyb2Jsb2NrcyAqICgxNiAqIDE2ICsgOCAqIDggKyA4ICogOCk7CisJaW9jdGwoaHdkYXRhLT5pcHVfZmQsIFBTMklPQ19TRU5EQSwgJnBhY2tldCk7CisKKwkvKiBUcmlnZ2VyIHRoZSBETUEgdG8gdGhlIElQVSBmb3IgY29udmVyc2lvbiAqLworI2lmZGVmIERFQlVHX1lVVgorCWZwcmludGYoc3RkZXJyLCAiVHJpZ2dpbmcgY29udmVyc2lvbiBjb21tYW5kXG4iKTsKKyNlbmRpZgorCWNtZCA9ICg3IDw8IDI4KSArIGh3ZGF0YS0+bWFjcm9ibG9ja3M7CisJaWYgKCBzY3JlZW5faW1hZ2UucHNtID09IFBTMl9HU19QU01DVDE2ICkgeworCQljbWQgKz0gKDEgPDwgMjcpICsJLyogT3V0cHV0IFJHQiA1NTUgKi8KKwkJICAgICAgICgxIDw8IDI2KTsJLyogRGl0aGVyIG91dHB1dCAqLworCX0KKwlpb2N0bChod2RhdGEtPmlwdV9mZCwgUFMySU9DX1NJUFVDTUQsICZjbWQpOworCisJLyogUmV0cmlldmUgdGhlIGNvbnZlcnRlZCBpbWFnZSBmcm9tIHRoZSBJUFUgKi8KKyNpZmRlZiBERUJVR19ZVVYKKwlmcHJpbnRmKHN0ZGVyciwgIlJldHJpZXZpbmcgZGF0YSBmcm9tIElQVS4uXG4iKTsKKyNlbmRpZgorCXBhY2tldC5wdHIgPSBod2RhdGEtPmlwdV9vbWVtOworCXBhY2tldC5sZW4gPSBvdmVybGF5LT53ICogb3ZlcmxheS0+aCAqCisJICAgICAgICAgICAgIHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCWlvY3RsKGh3ZGF0YS0+aXB1X2ZkLCBQUzJJT0NfUkVDViwgJnBhY2tldCk7CisKKyNpZmRlZiBERUJVR19ZVVYKKwlmcHJpbnRmKHN0ZGVyciwgIkNvcHlpbmcgaW1hZ2UgdG8gc2NyZWVuLi5cbiIpOworI2VuZGlmCisJLyogV2FpdCBmb3IgcHJldmlvdXMgRE1BIHRvIGNvbXBsZXRlICovCisJaW9jdGwoY29uc29sZV9mZCwgUFMySU9DX1NFTkRRQ1QsIDEpOworCisJLyogU2VuZCB0aGUgY3VycmVudCBpbWFnZSB0byB0aGUgc2NyZWVuIGFuZCBzY2FsZSBpdCAqLworCXNjcmVlbiA9IHRoaXMtPnNjcmVlbjsKKwl4ID0gKHVuc2lnbmVkIGludClkc3QtPng7CisJeSA9ICh1bnNpZ25lZCBpbnQpZHN0LT55OworCWlmICggc2NyZWVuLT5vZmZzZXQgKSB7CisJCXggKz0gKHNjcmVlbi0+b2Zmc2V0ICUgc2NyZWVuLT5waXRjaCkgLworCQkgICAgIHNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCQl5ICs9IChzY3JlZW4tPm9mZnNldCAvIHNjcmVlbi0+cGl0Y2gpOworCX0KKwl5ICs9IHNjcmVlbl9pbWFnZS55OworCSpod2RhdGEtPnN0cmV0Y2hfeDF5MSA9ICh4ICogMTYpICsgKCh5ICogMTYpIDw8IDE2KTsKKwl4ICs9ICh1bnNpZ25lZCBpbnQpZHN0LT53OworCXkgKz0gKHVuc2lnbmVkIGludClkc3QtPmg7CisJKmh3ZGF0YS0+c3RyZXRjaF94MnkyID0gKHggKiAxNikgKyAoKHkgKiAxNikgPDwgMTYpOworCXJldHVybiBpb2N0bChjb25zb2xlX2ZkLCBQUzJJT0NfU0VOREwsICZod2RhdGEtPnBsaXN0KTsKK30KKwordm9pZCBHU19GcmVlWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCit7CisJc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICpod2RhdGE7CisKKwlod2RhdGEgPSBvdmVybGF5LT5od2RhdGE7CisJaWYgKCBod2RhdGEgKSB7CisJCWlmICggaHdkYXRhLT5pcHVfZmQgPj0gMCApIHsKKwkJCWNsb3NlKGh3ZGF0YS0+aXB1X2ZkKTsKKwkJfQorCQlpZiAoIGh3ZGF0YS0+ZG1hX21lbSApIHsKKwkJCW11bm1hcChod2RhdGEtPmRtYV9tZW0sIGh3ZGF0YS0+ZG1hX2xlbik7CisJCX0KKwkJaWYgKCBod2RhdGEtPnBsaXN0LnBhY2tldCApIHsKKwkJCVNETF9mcmVlKGh3ZGF0YS0+cGxpc3QucGFja2V0KTsKKwkJfQorCQlpZiAoIGh3ZGF0YS0+cGl4ZWxzICkgeworCQkJU0RMX2ZyZWUoaHdkYXRhLT5waXhlbHMpOworCQl9CisJCVNETF9mcmVlKGh3ZGF0YSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3N5dXZfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczJncy9TRExfZ3N5dXZfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmZhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMmdzL1NETF9nc3l1dl9jLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgaXMgdGhlIFBsYXlzdGF0aW9uIDIgaW1wbGVtZW50YXRpb24gb2YgWVVWIHZpZGVvIG92ZXJsYXlzICovCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfZ3N2aWRlby5oIgorCitleHRlcm4gU0RMX092ZXJsYXkgKkdTX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpOworCitleHRlcm4gaW50IEdTX0xvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7CisKK2V4dGVybiB2b2lkIEdTX1VubG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKKworZXh0ZXJuIGludCBHU19EaXNwbGF5WVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXksIFNETF9SZWN0ICpzcmMsIFNETF9SZWN0ICpkc3QpOworCitleHRlcm4gdm9pZCBHU19GcmVlWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvU0RMX3BzM2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvU0RMX3BzM2V2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOWVmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9TRExfcHMzZXZlbnRzLmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICogQ0VMTCBCRSBTdXBwb3J0IGZvciBQUzMgRnJhbWVidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMQorICogVVNBCisgKgorICogIE1hcnRpbiBMb3dpbnNraSAgPGxvd2luc2tpIFthdF0gZGUgW2RvdF0gaWJtIFtpYm1dIGNvbT4KKyAqICBEaXJrIEhlcnJlbmRvZXJmZXIgPGQuaGVycmVuZG9lcmZlciBbYXRdIGRlIFtkb3RdIGlibSBbZG90XSBjb20+CisgKiAgU1BFIGNvZGUgYmFzZWQgb24gcmVzZWFyY2ggYnk6CisgKiAgUmVuZSBCZWNrZXIKKyAqICBUaGltbyBFbW1lcmljaAorICovCisKKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfcHMzdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfcHMzZXZlbnRzX2MuaCIKKwordm9pZCBQUzNfUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgUFMzX0luaXRPU0tleW1hcChfVEhJUykKK3sKKyAgICAgICAgcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9TRExfcHMzZXZlbnRzX2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMzL1NETF9wczNldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTEyMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9TRExfcHMzZXZlbnRzX2MuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgKiBDRUxMIEJFIFN1cHBvcnQgZm9yIFBTMyBGcmFtZWJ1ZmZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiBVU0EKKyAqCisgKiAgTWFydGluIExvd2luc2tpICA8bG93aW5za2kgW2F0XSBkZSBbZG90XSBpYm0gW2libV0gY29tPgorICogIERpcmsgSGVycmVuZG9lcmZlciA8ZC5oZXJyZW5kb2VyZmVyIFthdF0gZGUgW2RvdF0gaWJtIFtkb3RdIGNvbT4KKyAqICBTUEUgY29kZSBiYXNlZCBvbiByZXNlYXJjaCBieToKKyAqICBSZW5lIEJlY2tlcgorICogIFRoaW1vIEVtbWVyaWNoCisgKi8KKworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX3BzM2V2ZW50c19oCisjZGVmaW5lIF9TRExfcHMzZXZlbnRzX2gKKworI2luY2x1ZGUgIlNETF9wczN2aWRlby5oIgorCitleHRlcm4gdm9pZCBQUzNfSW5pdE9TS2V5bWFwKF9USElTKTsKK2V4dGVybiB2b2lkIFBTM19QdW1wRXZlbnRzKF9USElTKTsKKworZXh0ZXJuIHZvaWQgZW5hYmxlX2N1cnNvcihpbnQgZW5hYmxlKTsKKworI2VuZGlmIC8qIF9TRExfcHMzZXZlbnRzX2ggKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvU0RMX3BzM3ZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9TRExfcHMzdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTUxOWUwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvU0RMX3BzM3ZpZGVvLmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qCisgKiBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAqIENFTEwgQkUgU3VwcG9ydCBmb3IgUFMzIEZyYW1lYnVmZmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEKKyAqIFVTQQorICoKKyAqICBNYXJ0aW4gTG93aW5za2kgIDxsb3dpbnNraSBbYXRdIGRlIFtkb3RdIGlibSBbaWJtXSBjb20+CisgKiAgRGlyayBIZXJyZW5kb2VyZmVyIDxkLmhlcnJlbmRvZXJmZXIgW2F0XSBkZSBbZG90XSBpYm0gW2RvdF0gY29tPgorICogIFNQRSBjb2RlIGJhc2VkIG9uIHJlc2VhcmNoIGJ5OgorICogIFJlbmUgQmVja2VyCisgKiAgVGhpbW8gRW1tZXJpY2gKKyAqLworCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3BzM2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3BzM3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3BzM3l1dl9jLmgiCisjaW5jbHVkZSAic3B1bGlicy9zcHVfY29tbW9uLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8YXNtL3BzM2ZiLmg+CisjaW5jbHVkZSA8bGlic3BlMi5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCisvKiBTRExfVmlkZW9EZXZpY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IFBTM19BdmFpbGFibGUoKTsKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKlBTM19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KTsKK3N0YXRpYyBpbnQgUFMzX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICogdmZvcm1hdCk7CitzdGF0aWMgdm9pZCBQUzNfVmlkZW9RdWl0KF9USElTKTsKK3N0YXRpYyB2b2lkIFBTM19EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICogZGV2aWNlKTsKK3N0YXRpYyBTRExfU3VyZmFjZSAqUFMzX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKiBjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgU0RMX1JlY3QgKipQUzNfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKiBmb3JtYXQsIFVpbnQzMiBmbGFncyk7CisKKy8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IFBTM19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKiBzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIFBTM19GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqIHN1cmZhY2UpOworc3RhdGljIGludCBQUzNfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKiBzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIFBTM19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICogc3VyZmFjZSk7CitzdGF0aWMgaW50IFBTM19GbGlwRG91YmxlQnVmZmVyKF9USElTLCBTRExfU3VyZmFjZSAqIHN1cmZhY2UpOworc3RhdGljIHZvaWQgUFMzX0RvdWJsZUJ1ZmZlclVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqIHJlY3RzKTsKKworLyogU1BVIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworaW50IFNQRV9TdGFydChfVEhJUywgc3B1X2RhdGFfdCAqIHNwZV9kYXRhKTsKK2ludCBTUEVfU3RvcChfVEhJUywgc3B1X2RhdGFfdCAqIHNwZV9kYXRhKTsKK2ludCBTUEVfQm9vdChfVEhJUywgc3B1X2RhdGFfdCAqIHNwZV9kYXRhKTsKK2ludCBTUEVfU2h1dGRvd24oX1RISVMsIHNwdV9kYXRhX3QgKiBzcGVfZGF0YSk7CitpbnQgU1BFX1NlbmRNc2coX1RISVMsIHNwdV9kYXRhX3QgKiBzcGVfZGF0YSwgdW5zaWduZWQgaW50IG1zZyk7CitpbnQgU1BFX1dhaXRGb3JNc2coX1RISVMsIHNwdV9kYXRhX3QgKiBzcGVfZGF0YSwgdW5zaWduZWQgaW50IG1zZyk7Cit2b2lkIFNQRV9SdW5Db250ZXh0KHZvaWQgKnRocmVhZF9hcmdwKTsKKworLyogSGVscGVycyAqLwordm9pZCBlbmFibGVfY3Vyc29yKGludCBlbmFibGUpOworCisvKiBTdG9yZXMgdGhlIFNQRSBleGVjdXRhYmxlIG5hbWUgb2YgZmJfd3JpdGVyX3NwdSAqLworZXh0ZXJuIHNwZV9wcm9ncmFtX2hhbmRsZV90IGZiX3dyaXRlcl9zcHU7CisKKy8qIFNETCBQUzMgYm9vdHN0cmFwIGZ1bmN0aW9uIGZvciBjaGVja2luZyBhdmFpbGFiaWxpdHkgKi8KK3N0YXRpYyBpbnQgUFMzX0F2YWlsYWJsZSgpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qIFNETCBQUzMgYm9vdHN0cmFwIGZ1bmN0aW9uIGZvciBjcmVhdGluZyB0aGUgZGV2aWNlICovCitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpQUzNfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXM7CisKKwkvKiBJbml0aWFsaXNlIFNETF9WaWRlb0RldmljZSAqLworCXRoaXMgPSAoU0RMX1ZpZGVvRGV2aWNlICopIFNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICh0aGlzKSB7CisJCW1lbXNldCh0aGlzLCAwLCBzaXplb2YgKnRoaXMpOworCQl0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCisJCSAgICBTRExfbWFsbG9jKHNpemVvZihzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEpKTsKKwl9CisJLyogRXJyb3IgaGFuZGxpbmcgKi8KKwlpZiAoKHRoaXMgPT0gTlVMTCkgfHwgKHRoaXMtPmhpZGRlbiA9PSBOVUxMKSkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKHRoaXMpCisJCQlTRExfZnJlZSh0aGlzKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbXNldCh0aGlzLT5oaWRkZW4sIDAsIHNpemVvZihzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEpKTsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwl0aGlzLT5WaWRlb0luaXQgPSBQUzNfVmlkZW9Jbml0OworCXRoaXMtPkxpc3RNb2RlcyA9IFBTM19MaXN0TW9kZXM7CisJdGhpcy0+U2V0VmlkZW9Nb2RlID0gUFMzX1NldFZpZGVvTW9kZTsKKwl0aGlzLT5TZXRDb2xvcnMgPSAwOworCXRoaXMtPkNyZWF0ZVlVVk92ZXJsYXkgPSBQUzNfQ3JlYXRlWVVWT3ZlcmxheTsKKwl0aGlzLT5VcGRhdGVSZWN0cyA9IDA7CisJdGhpcy0+VmlkZW9RdWl0ID0gUFMzX1ZpZGVvUXVpdDsKKwl0aGlzLT5BbGxvY0hXU3VyZmFjZSA9IFBTM19BbGxvY0hXU3VyZmFjZTsKKwl0aGlzLT5DaGVja0hXQmxpdCA9IDA7CisJdGhpcy0+RmlsbEhXUmVjdCA9IDA7CisJdGhpcy0+U2V0SFdDb2xvcktleSA9IDA7CisJdGhpcy0+U2V0SFdBbHBoYSA9IDA7CisJdGhpcy0+TG9ja0hXU3VyZmFjZSA9IFBTM19Mb2NrSFdTdXJmYWNlOworCXRoaXMtPlVubG9ja0hXU3VyZmFjZSA9IFBTM19VbmxvY2tIV1N1cmZhY2U7CisJdGhpcy0+RmxpcEhXU3VyZmFjZSA9IFBTM19GbGlwRG91YmxlQnVmZmVyOworCXRoaXMtPkZyZWVIV1N1cmZhY2UgPSBQUzNfRnJlZUhXU3VyZmFjZTsKKwl0aGlzLT5TZXRDYXB0aW9uID0gMDsKKwl0aGlzLT5TZXRJY29uID0gMDsKKwl0aGlzLT5JY29uaWZ5V2luZG93ID0gMDsKKwl0aGlzLT5HcmFiSW5wdXQgPSAwOworCXRoaXMtPkdldFdNSW5mbyA9IDA7CisJdGhpcy0+SW5pdE9TS2V5bWFwID0gUFMzX0luaXRPU0tleW1hcDsKKwl0aGlzLT5QdW1wRXZlbnRzID0gUFMzX1B1bXBFdmVudHM7CisKKwl0aGlzLT5mcmVlID0gUFMzX0RlbGV0ZURldmljZTsKKworCXJldHVybiB0aGlzOworfQorCisKKy8qIEJvb3RzdHJhcGluZyAoc2VlIFNETF9zeXN2aWRlby5oKSAqLworVmlkZW9Cb290U3RyYXAgUFMzX2Jvb3RzdHJhcCA9IHsKKwkicHMzIiwgIlBTMyBDZWxsIFNQVSBEcml2ZXIiLAorCVBTM19BdmFpbGFibGUsIFBTM19DcmVhdGVEZXZpY2UKK307CisKKworLyogRGVsZXRlIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyB2b2lkIFBTM19EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICogZGV2aWNlKQoreworCWZyZWUoZGV2aWNlLT5oaWRkZW4pOworCWZyZWUoZGV2aWNlKTsKK30KKworCisvKiBJbml0aWFsaXNlIHRoZSBQUzMgdmlkZW8gZGV2aWNlICovCitzdGF0aWMgaW50IFBTM19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqIHZmb3JtYXQpCit7CisJLyogSGlkZSB0aGUgY3Vyc29yICovCisJZW5hYmxlX2N1cnNvcigwKTsKKworCS8qIENyZWF0ZSBTUFUgZmJfcGFybXMgYW5kIHRocmVhZCBzdHJ1Y3R1cmUgKi8KKwlmYl9wYXJtcyA9IChzdHJ1Y3QgZmJfd3JpdGVyX3Bhcm1zX3QgKikKKwkgICAgbWVtYWxpZ24oMTYsIHNpemVvZihzdHJ1Y3QgZmJfd3JpdGVyX3Bhcm1zX3QpKTsKKwlmYl90aHJlYWRfZGF0YSA9IChzcHVfZGF0YV90ICopIG1hbGxvYyhzaXplb2Yoc3B1X2RhdGFfdCkpOworCWlmIChmYl9wYXJtcyA9PSBOVUxMIHx8IGZiX3RocmVhZF9kYXRhID09IE5VTEwpIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybiAtMTsKKwl9CisJZmJfdGhyZWFkX2RhdGEtPnByb2dyYW0gPSBmYl93cml0ZXJfc3B1OworCWZiX3RocmVhZF9kYXRhLT5wcm9ncmFtX25hbWUgPSAiZmJfd3JpdGVyX3NwdSI7CisJZmJfdGhyZWFkX2RhdGEtPmFyZ3AgPSAodm9pZCAqKWZiX3Bhcm1zOworCWZiX3RocmVhZF9kYXRhLT5rZWVwYWxpdmUgPSAxOworCWZiX3RocmVhZF9kYXRhLT5ib290ZWQgPSAwOworCisJU1BFX1N0YXJ0KHRoaXMsIGZiX3RocmVhZF9kYXRhKTsKKworCS8qIE9wZW4gdGhlIGRldmljZSAqLworCWZiX2Rldl9mZCA9IG9wZW4oUFMzX0RFVl9GQiwgT19SRFdSKTsKKwlpZiAoZmJfZGV2X2ZkIDwgMCkgeworCQlTRExfU2V0RXJyb3IoIltQUzNdIFVuYWJsZSB0byBvcGVuIGRldmljZSAlcyIsIFBTM19ERVZfRkIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogR2V0IHZzY3JlZW5pbmZvICovCisJaWYgKGlvY3RsKGZiX2Rldl9mZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJmZiX3ZpbmZvKSkgeworCQlTRExfU2V0RXJyb3IoIltQUzNdIENhbid0IGdldCBWU0NSRUVOSU5GTyIpOworCQlpZiAoZmJfZGV2X2ZkID49IDApCisJCQljbG9zZShmYl9kZXZfZmQpOworCQlmYl9kZXZfZmQgPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEZpbGwgaW4gb3VyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBjYXBhYmlsaXRpZXMgKi8KKwl0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IGZiX3ZpbmZvLnhyZXM7CisJdGhpcy0+aW5mby5jdXJyZW50X2ggPSBmYl92aW5mby55cmVzOworCXRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMDsKKwl0aGlzLT5pbmZvLmh3X2F2YWlsYWJsZSA9IDE7CisKKwkvKiBCYWNrdXAgdGhlIG9yaWdpbmFsIHZpbmZvIHRvIHJlc3RvcmUgbGF0ZXIgKi8KKwlmYl9vcmlnX3ZpbmZvID0gZmJfdmluZm87CisKKwkvKiAxNiBhbmQgMTUgYnBwIGlzIHJlcG9ydGVkIGFzIDE2IGJwcCAqLworCWZiX2JpdHNfcGVyX3BpeGVsID0gZmJfdmluZm8uYml0c19wZXJfcGl4ZWw7CisJaWYgKGZiX2JpdHNfcGVyX3BpeGVsID09IDE2KQorCQlmYl9iaXRzX3Blcl9waXhlbCA9CisJCSAgICBmYl92aW5mby5yZWQubGVuZ3RoICsgZmJfdmluZm8uZ3JlZW4ubGVuZ3RoICsKKwkJICAgIGZiX3ZpbmZvLmJsdWUubGVuZ3RoOworCisJLyogU2V0IFNETF9QaXhlbEZvcm1hdCAqLworCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IGZiX3ZpbmZvLmJpdHNfcGVyX3BpeGVsOworCisJZmJfdmluZm8ueHJlc192aXJ0dWFsID0gZmJfdmluZm8ueHJlczsKKwlmYl92aW5mby55cmVzX3ZpcnR1YWwgPSBmYl92aW5mby55cmVzOworCisJLyogUHV0IHZzY3JlZW5pbmZvICovCisJaWYgKGlvY3RsKGZiX2Rldl9mZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgJmZiX3ZpbmZvKSkgeworCQlTRExfU2V0RXJyb3IoIltQUzNdIENhbid0IHB1dCBWU0NSRUVOSU5GTyIpOworCQlpZiAoZmJfZGV2X2ZkID49IDApCisJCQljbG9zZShmYl9kZXZfZmQpOworCQlmYl9kZXZfZmQgPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNfZmJfcGl4ZWxfc2l6ZSA9IGZiX3ZpbmZvLmJpdHNfcGVyX3BpeGVsIC8gODsKKworCXNfd3JpdGVhYmxlX3dpZHRoID0gZmJfdmluZm8ueHJlczsKKwlzX3dyaXRlYWJsZV9oZWlnaHQgPSBmYl92aW5mby55cmVzOworCisJLyogR2V0IHBzMyBzY3JlZW5pbmZvICovCisJaWYgKGlvY3RsKGZiX2Rldl9mZCwgUFMzRkJfSU9DVExfU0NSRUVOSU5GTywgKHVuc2lnbmVkIGxvbmcpJnJlcykgPCAwKSB7CisJCVNETF9TZXRFcnJvcigiW1BTM10gUFMzRkJfSU9DVExfU0NSRUVOSU5GTyBmYWlsZWQiKTsKKwl9CisJZGVwcmludGYoMSwgIltQUzNdIHhyZXM6JWQgeXJlczolZCB4b2ZmOiVkIHlvZmY6JWRcbiIsIHJlcy54cmVzLCByZXMueXJlcywgcmVzLnhvZmYsIHJlcy55b2ZmKTsKKworCS8qIE9ubHkgdXNlIGRvdWJsZSBidWZmZXJpbmcgaWYgZW5vdWdoIGZiIG1lbW9yeSBpcyBhdmFpbGFibGUgKi8KKwlpZiAocmVzLm51bV9mcmFtZXMgPCAyKSB7CisJCWRvdWJsZV9idWZmZXJpbmcgPSAwOworCX0gZWxzZSB7CisJCWRvdWJsZV9idWZmZXJpbmcgPSAxOworCX0KKworCXJlYWxfd2lkdGggPSByZXMueHJlczsKKwlyZWFsX2hlaWdodCA9IHJlcy55cmVzOworCisJLyoKKwkgKiBUYWtlIGNvbnRyb2wgb2YgZnJhbWUgYnVmZmVyIGZyb20ga2VybmVsLCBmb3IgZGV0YWlscyBzZWUKKwkgKiBodHRwOi8vZmVsdGVyLm9yZy93ZXNsZXkvZmlsZXMvcHMzL2xpbnV4LTIwMDYxMTEwLWRvY3MvQXBwbGljYXRpb25Qcm9ncmFtbWluZ0Vudmlyb25tZW50Lmh0bWwKKwkgKiBrZXJuZWwgd2lsbCBubyBsb25nZXIgZmxpcCB0aGUgc2NyZWVuIGl0c2VsZgorCSAqLworCWlvY3RsKGZiX2Rldl9mZCwgUFMzRkJfSU9DVExfT04sIDApOworCisJLyogVW5ibGFuayBzY3JlZW4gKi8KKwlpb2N0bChmYl9kZXZfZmQsIEZCSU9CTEFOSywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBMaXN0IGF2YWlsYWJsZSBQUzMgcmVzb2x1dGlvbnMgKi8KK3N0YXRpYyBTRExfUmVjdCAqKlBTM19MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqIGZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCS8qIEEgbGlzdCBvZiB2aWRlbyByZXNvbHV0aW9ucyB0aGF0IHdlIHF1ZXJ5IGZvciAoc29ydGVkIGxhcmdlc3QgdG8KKwkgKiBzbWFsbGVzdCkKKwkgKi8KKwlzdGF0aWMgU0RMX1JlY3QgUFMzX3Jlc29sdXRpb25zW10gPSB7CisJCXswLCAwLCAxOTIwLCAxMDgwfSwgLy8gMTA4MHAgMTY6OSBIRAorCQl7MCwgMCwgMTYwMCwgMTIwMH0sIC8vIFdVWEdBCisJCXswLCAwLCAxMjgwLCAxMDI0fSwgLy8gU1hHQQorCQl7MCwgMCwgMTI4MCwgNzIwfSwgIC8vIDcyMHAgMTY6OSBIRAorCQl7MCwgMCwgMTAyNCwgNzY4fSwgIC8vIFdYR0EKKwkJezAsIDAsIDEwMjQsIDU3Nn0sICAvLyA1NzZwIDE2OjkKKwkJezAsIDAsIDg1MywgNDgwfSwgICAvLyA0ODBwIDE2OjkKKwkJezAsIDAsIDcyMCwgNTc2fSwgICAvLyA1NzZwIDQ6MyAoUEFMKQorCQl7MCwgMCwgNzIwLCA0ODB9LCAgIC8vIDQ4MHAgMTY6OSAoTlRTQykKKwl9OworCXN0YXRpYyBTRExfUmVjdCAqUFMzX21vZGVzW10gPSB7CisJCSZQUzNfcmVzb2x1dGlvbnNbMF0sCisJCSZQUzNfcmVzb2x1dGlvbnNbMV0sCisJCSZQUzNfcmVzb2x1dGlvbnNbMl0sCisJCSZQUzNfcmVzb2x1dGlvbnNbM10sCisJCSZQUzNfcmVzb2x1dGlvbnNbNF0sCisJCSZQUzNfcmVzb2x1dGlvbnNbNV0sCisJCSZQUzNfcmVzb2x1dGlvbnNbNl0sCisJCSZQUzNfcmVzb2x1dGlvbnNbN10sCisJCSZQUzNfcmVzb2x1dGlvbnNbOF0sCisJCU5VTEwKKwl9OworCVNETF9SZWN0ICoqbW9kZXMgPSBQUzNfbW9kZXM7CisKKwlyZXR1cm4gbW9kZXM7Cit9CisKKworLyogR2V0IGEgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGRpc3BsYXkgbW9kZXMgKi8KK3N0YXRpYyBTRExfU3VyZmFjZSAqUFMzX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKiBjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlzX2JvdW5kZWRfaW5wdXRfd2lkdGggPSB3aWR0aCA8IHNfd3JpdGVhYmxlX3dpZHRoID8gd2lkdGggOiBzX3dyaXRlYWJsZV93aWR0aDsKKwlzX2JvdW5kZWRfaW5wdXRfaGVpZ2h0ID0gaGVpZ2h0IDwgc193cml0ZWFibGVfaGVpZ2h0ID8gaGVpZ2h0IDogc193cml0ZWFibGVfaGVpZ2h0OworCXNfYm91bmRlZF9pbnB1dF93aWR0aF9vZmZzZXQgPSAoc193cml0ZWFibGVfd2lkdGggLSBzX2JvdW5kZWRfaW5wdXRfd2lkdGgpID4+IDE7CisJc19ib3VuZGVkX2lucHV0X2hlaWdodF9vZmZzZXQgPSAoc193cml0ZWFibGVfaGVpZ2h0IC0gc19ib3VuZGVkX2lucHV0X2hlaWdodCkgPj4gMTsKKwlzX2lucHV0X2xpbmVfbGVuZ3RoID0gd2lkdGggKiBzX2ZiX3BpeGVsX3NpemU7CisKKwljdXJyZW50LT5mbGFncyB8PSBmbGFnczsKKworCWlmIChpb2N0bChmYl9kZXZfZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sICZmYl9maW5mbykpIHsKKwkJU0RMX1NldEVycm9yKCJbUFMzXSBDYW4ndCBnZXQgZml4ZWQgc2NyZWVuaW5mbyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZmJfZmluZm8udHlwZSAhPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMpIHsKKwkJU0RMX1NldEVycm9yKCJbUFMzXSB0eXBlICVzIG5vdCBzdXBwb3J0ZWQiLAorCQkJICAgICBmYl9maW5mby50eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogTm90ZTogb24gUFMzLCBmYl9maW5mby5zbWVtX2xlbiBpcyBlbm91Z2ggZm9yIGRvdWJsZSBidWZmZXJpbmcgKi8KKwlpZiAoKGZyYW1lX2J1ZmZlciA9CisJICAgICAodWludDhfdCAqKSBtbWFwKDAsIGZiX2ZpbmZvLnNtZW1fbGVuLAorCQkJICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKwkJCSAgICAgIGZiX2Rldl9mZCwgMCkpID09ICh1aW50OF90ICopIC0gMSkgeworCQlTRExfU2V0RXJyb3IoIltQUzNdIENhbid0IG1tYXAgZm9yICVzIiwgUFMzX0RFVl9GQik7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCWN1cnJlbnQtPmZsYWdzIHw9IFNETF9ET1VCTEVCVUY7CisJfQorCWlmICghU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgZmJfYml0c19wZXJfcGl4ZWwsIDAsIDAsIDAsIDApKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyogQmxhbmsgc2NyZWVuICovCisJbWVtc2V0KGZyYW1lX2J1ZmZlciwgMHgwMCwgZmJfZmluZm8uc21lbV9sZW4pOworCisJLyogQ2VudGVyaW5nICovCisJc19jZW50ZXJbMF0gPQorCSAgICBmcmFtZV9idWZmZXIgKyBzX2JvdW5kZWRfaW5wdXRfd2lkdGhfb2Zmc2V0ICogc19mYl9waXhlbF9zaXplICsKKwkgICAgc19ib3VuZGVkX2lucHV0X2hlaWdodF9vZmZzZXQgKiBmYl9maW5mby5saW5lX2xlbmd0aDsKKwlzX2NlbnRlclsxXSA9IHNfY2VudGVyWzBdICsgcmVhbF9oZWlnaHQgKiBmYl9maW5mby5saW5lX2xlbmd0aDsKKwlzX2NlbnRlcl9pbmRleCA9IDA7CisKKwljdXJyZW50LT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKwljdXJyZW50LT53ID0gd2lkdGg7CisJY3VycmVudC0+aCA9IGhlaWdodDsKKwljdXJyZW50LT5waXRjaCA9IFNETF9DYWxjdWxhdGVQaXRjaChjdXJyZW50KTsKKworCS8qIEFsbG9jIGFsaWduZWQgbWVtIGZvciBjdXJyZW50LT5waXhlbHMgKi8KKwlzX3BpeGVscyA9IG1lbWFsaWduKDE2LCBjdXJyZW50LT5oICogY3VycmVudC0+cGl0Y2gpOworCWN1cnJlbnQtPnBpeGVscyA9ICh2b2lkICopc19waXhlbHM7CisJaWYgKCFjdXJyZW50LT5waXhlbHMpIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFNldCB0aGUgdXBkYXRlIHJlY3RhbmdsZSBmdW5jdGlvbiAqLworCXRoaXMtPlVwZGF0ZVJlY3RzID0gUFMzX0RvdWJsZUJ1ZmZlclVwZGF0ZTsKKworCXJldHVybiBjdXJyZW50OworfQorCisKKy8qIENvcHkgc2NyZWVuIHRvIGZyYW1lYnVmZmVyIGFuZCBmbGlwICovCit2b2lkIFBTM19Eb3VibGVCdWZmZXJVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKiByZWN0cykKK3sKKwlpZiAoY29udmVydGVyX3RocmVhZF9kYXRhICYmIGNvbnZlcnRlcl90aHJlYWRfZGF0YS0+Ym9vdGVkKQorCQlTUEVfV2FpdEZvck1zZyh0aGlzLCBjb252ZXJ0ZXJfdGhyZWFkX2RhdGEsIFNQVV9GSU4pOworCisJLyogQWRqdXN0IGNlbnRlcmluZyAqLworCXNfYm91bmRlZF9pbnB1dF93aWR0aF9vZmZzZXQgPSAoc193cml0ZWFibGVfd2lkdGggLSBzX2JvdW5kZWRfaW5wdXRfd2lkdGgpID4+IDE7CisJc19ib3VuZGVkX2lucHV0X2hlaWdodF9vZmZzZXQgPSAoc193cml0ZWFibGVfaGVpZ2h0IC0gc19ib3VuZGVkX2lucHV0X2hlaWdodCkgPj4gMTsKKwlzX2NlbnRlclswXSA9IGZyYW1lX2J1ZmZlciArIHNfYm91bmRlZF9pbnB1dF93aWR0aF9vZmZzZXQgKiBzX2ZiX3BpeGVsX3NpemUgKworCQlzX2JvdW5kZWRfaW5wdXRfaGVpZ2h0X29mZnNldCAqIGZiX2ZpbmZvLmxpbmVfbGVuZ3RoOworCXNfY2VudGVyWzFdID0gc19jZW50ZXJbMF0gKyByZWFsX2hlaWdodCAqIGZiX2ZpbmZvLmxpbmVfbGVuZ3RoOworCisJLyogU2V0IFNQVSBwYXJtcyBmb3IgY29weWluZyB0aGUgc3VyZmFjZSB0byBmcmFtZWJ1ZmZlciAqLworCWZiX3Bhcm1zLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilzX3BpeGVsczsKKwlmYl9wYXJtcy0+Y2VudGVyID0gc19jZW50ZXJbc19jZW50ZXJfaW5kZXhdOworCWZiX3Bhcm1zLT5vdXRfbGluZV9zdHJpZGUgPSBmYl9maW5mby5saW5lX2xlbmd0aDsKKwlmYl9wYXJtcy0+aW5fbGluZV9zdHJpZGUgPSBzX2lucHV0X2xpbmVfbGVuZ3RoOworCWZiX3Bhcm1zLT5ib3VuZGVkX2lucHV0X2hlaWdodCA9IHNfYm91bmRlZF9pbnB1dF9oZWlnaHQ7CisJZmJfcGFybXMtPmJvdW5kZWRfaW5wdXRfd2lkdGggPSBzX2JvdW5kZWRfaW5wdXRfd2lkdGg7CisJZmJfcGFybXMtPmZiX3BpeGVsX3NpemUgPSBzX2ZiX3BpeGVsX3NpemU7CisKKwlkZXByaW50ZigzLCAiW1BTMy0+U1BVXSBmYl90aHJlYWRfZGF0YS0+YXJncCA9IDB4JXhcbiIsIGZiX3RocmVhZF9kYXRhLT5hcmdwKTsKKworCS8qIENvcHlpbmcuLiAqLworCVNQRV9TZW5kTXNnKHRoaXMsIGZiX3RocmVhZF9kYXRhLCBTUFVfU1RBUlQpOworCVNQRV9TZW5kTXNnKHRoaXMsIGZiX3RocmVhZF9kYXRhLCAodW5zaWduZWQgaW50KWZiX3RocmVhZF9kYXRhLT5hcmdwKTsKKworCVNQRV9XYWl0Rm9yTXNnKHRoaXMsIGZiX3RocmVhZF9kYXRhLCBTUFVfRklOKTsKKworCS8qIEZsaXAgdGhlIHBhZ2VzICovCisJaWYgKGRvdWJsZV9idWZmZXJpbmcpCisJCXNfY2VudGVyX2luZGV4ID0gc19jZW50ZXJfaW5kZXggXiAweDAxOworCVBTM19GbGlwRG91YmxlQnVmZmVyKHRoaXMsIHRoaXMtPnNjcmVlbik7Cit9CisKKworLyogRW5hYmxlL0Rpc2FibGUgY3Vyc29yICovCit2b2lkIGVuYWJsZV9jdXJzb3IoaW50IGVuYWJsZSkKK3sKKwlpbnQgZmQgPSBvcGVuKCIvZGV2L2NvbnNvbGUiLCBPX1JEV1IgfCBPX05PTkJMT0NLKTsKKwlpZiAoZmQgPj0gMCkgeworCQlpb2N0bChmZCwgS0RTRVRNT0RFLCBlbmFibGUgPyBLRF9URVhUIDogS0RfR1JBUEhJQ1MpOworCQljbG9zZShmZCk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgUFMzX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqIHN1cmZhY2UpCit7CisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyB2b2lkIFBTM19GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqIHN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQgUFMzX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICogc3VyZmFjZSkKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBQUzNfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqIHN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCisKKy8qIEJsaXQvRmxpcCBidWZmZXIgdG8gdGhlIHNjcmVlbi4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBmcmFtZSEgKi8KK2ludCBQUzNfRmxpcERvdWJsZUJ1ZmZlcihfVEhJUywgU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQoreworCXVuc2lnbmVkIGxvbmcgY3J0ID0gMDsKKwkvKiBXYWl0IGZvciB2c3luYyAqLworCWRlcHJpbnRmKDEsICJbUFMzXSBXYWl0IGZvciB2c3luY1xuIik7CisJaW9jdGwoZmJfZGV2X2ZkLCBGQklPX1dBSVRGT1JWU1lOQywgJmNydCk7CisJLyogUGFnZSBmbGlwICovCisJZGVwcmludGYoMSwgIltQUzNdIFBhZ2UgZmxpcCB0byBidWZmZXIgIyV1IDB4JXhcbiIsIHNfY2VudGVyX2luZGV4LCBzX2NlbnRlcltzX2NlbnRlcl9pbmRleF0pOworCWlvY3RsKGZiX2Rldl9mZCwgUFMzRkJfSU9DVExfRlNFTCwgKHVuc2lnbmVkIGxvbmcpJnNfY2VudGVyX2luZGV4KTsKKwlyZXR1cm4gMTsKK30KKworCisvKiBTdGFydCB0aGUgU1BFIHRocmVhZCAqLworaW50IFNQRV9TdGFydChfVEhJUywgc3B1X2RhdGFfdCAqIHNwZV9kYXRhKQoreworCWRlcHJpbnRmKDIsICJbUFMzLT5TUFVdIFN0YXJ0IFNQRTogJXNcbiIsIHNwZV9kYXRhLT5wcm9ncmFtX25hbWUpOworCWlmICghKHNwZV9kYXRhLT5ib290ZWQpKQorCQlTUEVfQm9vdCh0aGlzLCBzcGVfZGF0YSk7CisKKwkvKiBUbyBhbGxvdyByZS1ydW5uaW5nIG9mIGNvbnRleHQsIHNwZV9jdHhfZW50cnkgaGFzIHRvIGJlIHNldCBiZWZvcmUgZWFjaCBjYWxsICovCisJc3BlX2RhdGEtPmVudHJ5ID0gU1BFX0RFRkFVTFRfRU5UUlk7CisJc3BlX2RhdGEtPmVycm9yX2NvZGUgPSAwOworCisJLyogQ3JlYXRlIFNQRSB0aHJlYWQgYW5kIHJ1biAqLworCWRlcHJpbnRmKDIsICJbUFMzLT5TUFVdIENyZWF0ZSBUaHJlYWQ6ICVzXG4iLCBzcGVfZGF0YS0+cHJvZ3JhbV9uYW1lKTsKKwlpZiAocHRocmVhZF9jcmVhdGUKKwkgICAgKCZzcGVfZGF0YS0+dGhyZWFkLCBOVUxMLCAodm9pZCAqKSZTUEVfUnVuQ29udGV4dCwgKHZvaWQgKilzcGVfZGF0YSkpIHsKKwkJZGVwcmludGYoMiwgIltQUzMtPlNQVV0gQ291bGQgbm90IGNyZWF0ZSBwdGhyZWFkIGZvciBzcGU6ICVzXG4iLCBzcGVfZGF0YS0+cHJvZ3JhbV9uYW1lKTsKKwkJU0RMX1NldEVycm9yKCJbUFMzLT5TUFVdIENvdWxkIG5vdCBjcmVhdGUgcHRocmVhZCBmb3Igc3BlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc3BlX2RhdGEtPmtlZXBhbGl2ZSkKKwkJU1BFX1dhaXRGb3JNc2codGhpcywgc3BlX2RhdGEsIFNQVV9SRUFEWSk7Cit9CisKKworLyogU3RvcCB0aGUgU1BFIHRocmVhZCAqLworaW50IFNQRV9TdG9wKF9USElTLCBzcHVfZGF0YV90ICogc3BlX2RhdGEpCit7CisJZGVwcmludGYoMiwgIltQUzMtPlNQVV0gU3RvcCBTUEU6ICVzXG4iLCBzcGVfZGF0YS0+cHJvZ3JhbV9uYW1lKTsKKwkvKiBXYWl0IGZvciBTUEUgdGhyZWFkIHRvIGNvbXBsZXRlICovCisJZGVwcmludGYoMiwgIltQUzMtPlNQVV0gV2FpdCBmb3IgU1BFIHRocmVhZCB0byBjb21wbGV0ZTogJXNcbiIsIHNwZV9kYXRhLT5wcm9ncmFtX25hbWUpOworCWlmIChwdGhyZWFkX2pvaW4oc3BlX2RhdGEtPnRocmVhZCwgTlVMTCkpIHsKKwkJZGVwcmludGYoMiwgIltQUzMtPlNQVV0gRmFpbGVkIGpvaW5pbmcgdGhlIHRocmVhZDogJXNcbiIsIHNwZV9kYXRhLT5wcm9ncmFtX25hbWUpOworCQlTRExfU2V0RXJyb3IoIltQUzMtPlNQVV0gRmFpbGVkIGpvaW5pbmcgdGhlIHRocmVhZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogQ3JlYXRlIFNQRSBjb250ZXh0IGFuZCBsb2FkIHByb2dyYW0gKi8KK2ludCBTUEVfQm9vdChfVEhJUywgc3B1X2RhdGFfdCAqIHNwZV9kYXRhKQoreworCS8qIENyZWF0ZSBTUEUgY29udGV4dCAqLworCWRlcHJpbnRmKDIsICJbUFMzLT5TUFVdIENyZWF0ZSBTUEUgQ29udGV4dDogJXNcbiIsIHNwZV9kYXRhLT5wcm9ncmFtX25hbWUpOworCXNwZV9kYXRhLT5jdHggPSBzcGVfY29udGV4dF9jcmVhdGUoMCwgTlVMTCk7CisJaWYgKHNwZV9kYXRhLT5jdHggPT0gTlVMTCkgeworCQlkZXByaW50ZigyLCAiW1BTMy0+U1BVXSBGYWlsZWQgY3JlYXRpbmcgU1BFIGNvbnRleHQ6ICVzXG4iLCBzcGVfZGF0YS0+cHJvZ3JhbV9uYW1lKTsKKwkJU0RMX1NldEVycm9yKCJbUFMzLT5TUFVdIEZhaWxlZCBjcmVhdGluZyBTUEUgY29udGV4dCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogTG9hZCBTUEUgb2JqZWN0IGludG8gU1BFIGxvY2FsIHN0b3JlICovCisJZGVwcmludGYoMiwgIltQUzMtPlNQVV0gTG9hZCBQcm9ncmFtIGludG8gU1BFOiAlc1xuIiwgc3BlX2RhdGEtPnByb2dyYW1fbmFtZSk7CisJaWYgKHNwZV9wcm9ncmFtX2xvYWQoc3BlX2RhdGEtPmN0eCwgJnNwZV9kYXRhLT5wcm9ncmFtKSkgeworCQlkZXByaW50ZigyLCAiW1BTMy0+U1BVXSBGYWlsZWQgbG9hZGluZyBwcm9ncmFtIGludG8gU1BFIGNvbnRleHQ6ICVzXG4iLCBzcGVfZGF0YS0+cHJvZ3JhbV9uYW1lKTsKKwkJU0RMX1NldEVycm9yCisJCSAgICAoIltQUzMtPlNQVV0gRmFpbGVkIGxvYWRpbmcgcHJvZ3JhbSBpbnRvIFNQRSBjb250ZXh0Iik7CisJCXJldHVybiAtMTsKKwl9CisJc3BlX2RhdGEtPmJvb3RlZCA9IDE7CisJZGVwcmludGYoMiwgIltQUzMtPlNQVV0gU1BFIGJvb3Qgc3VjY2Vzc2Z1bFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogKFN0b3AgYW5kKSBzaHV0ZG93biB0aGUgU1BFICovCitpbnQgU1BFX1NodXRkb3duKF9USElTLCBzcHVfZGF0YV90ICogc3BlX2RhdGEpCit7CisJaWYgKHNwZV9kYXRhLT5rZWVwYWxpdmUgJiYgc3BlX2RhdGEtPmJvb3RlZCkgeworCQlTUEVfU2VuZE1zZyh0aGlzLCBzcGVfZGF0YSwgU1BVX0VYSVQpOworCQlTUEVfU3RvcCh0aGlzLCBzcGVfZGF0YSk7CisJfQorCisJLyogRGVzdHJveSBTUEUgY29udGV4dCAqLworCWRlcHJpbnRmKDIsICJbUFMzLT5TUFVdIERlc3Ryb3kgU1BFIGNvbnRleHQ6ICVzXG4iLCBzcGVfZGF0YS0+cHJvZ3JhbV9uYW1lKTsKKwlpZiAoc3BlX2NvbnRleHRfZGVzdHJveShzcGVfZGF0YS0+Y3R4KSkgeworCQlkZXByaW50ZigyLCAiW1BTMy0+U1BVXSBGYWlsZWQgZGVzdHJveWluZyBjb250ZXh0OiAlc1xuIiwgc3BlX2RhdGEtPnByb2dyYW1fbmFtZSk7CisJCVNETF9TZXRFcnJvcigiW1BTMy0+U1BVXSBGYWlsZWQgZGVzdHJveWluZyBjb250ZXh0Iik7CisJCXJldHVybiAtMTsKKwl9CisJZGVwcmludGYoMiwgIltQUzMtPlNQVV0gU1BFIHNodXRkb3duIHN1Y2Nlc3NmdWw6ICVzXG4iLCBzcGVfZGF0YS0+cHJvZ3JhbV9uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBTZW5kIG1lc3NhZ2UgdG8gdGhlIFNQRSB2aWEgbWFpbGJveGUgKi8KK2ludCBTUEVfU2VuZE1zZyhfVEhJUywgc3B1X2RhdGFfdCAqIHNwZV9kYXRhLCB1bnNpZ25lZCBpbnQgbXNnKQoreworCWRlcHJpbnRmKDIsICJbUFMzLT5TUFVdIFNlbmRpbmcgbWVzc2FnZSAldSB0byAlc1xuIiwgbXNnLCBzcGVfZGF0YS0+cHJvZ3JhbV9uYW1lKTsKKwkvKiBTZW5kIG9uZSBtZXNzYWdlLCBibG9jayB1bnRpbCBtZXNzYWdlIHdhcyBzZW50ICovCisJdW5zaWduZWQgaW50IHNwZV9pbl9tYm94X21zZ3NbMV07CisJc3BlX2luX21ib3hfbXNnc1swXSA9IG1zZzsKKwlpbnQgaW5fbWJveF93cml0ZSA9IHNwZV9pbl9tYm94X3dyaXRlKHNwZV9kYXRhLT5jdHgsIHNwZV9pbl9tYm94X21zZ3MsIDEsIFNQRV9NQk9YX0FMTF9CTE9DS0lORyk7CisKKwlpZiAoMSA+IGluX21ib3hfd3JpdGUpIHsKKwkJZGVwcmludGYoMiwgIltQUzMtPlNQVV0gTm8gbWVzc2FnZSBjb3VsZCBiZSB3cml0dGVuIHRvICVzXG4iLCBzcGVfZGF0YS0+cHJvZ3JhbV9uYW1lKTsKKwkJU0RMX1NldEVycm9yKCJbUFMzLT5TUFVdIE5vIG1lc3NhZ2UgY291bGQgYmUgd3JpdHRlbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIFJlYWQgMSBtZXNzYWdlIGZyb20gU1BFLCBibG9jayB1bnRpbCBhdCBsZWFzdCAxIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkICovCitpbnQgU1BFX1dhaXRGb3JNc2coX1RISVMsIHNwdV9kYXRhX3QgKiBzcGVfZGF0YSwgdW5zaWduZWQgaW50IG1zZykKK3sKKwlkZXByaW50ZigyLCAiW1BTMy0+U1BVXSBXYWl0aW5nIGZvciBtZXNzYWdlIGZyb20gJXNcbiIsIHNwZV9kYXRhLT5wcm9ncmFtX25hbWUpOworCXVuc2lnbmVkIGludCBvdXRfbWVzc2FnZXNbMV07CisJd2hpbGUgKCFzcGVfb3V0X21ib3hfc3RhdHVzKHNwZV9kYXRhLT5jdHgpKTsKKwlpbnQgbWJveF9yZWFkID0gc3BlX291dF9tYm94X3JlYWQoc3BlX2RhdGEtPmN0eCwgb3V0X21lc3NhZ2VzLCAxKTsKKwlkZXByaW50ZigyLCAiW1BTMy0+U1BVXSBHb3QgbWVzc2FnZSBmcm9tICVzLCBtZXNzYWdlIHdhcyAldVxuIiwgc3BlX2RhdGEtPnByb2dyYW1fbmFtZSwgb3V0X21lc3NhZ2VzWzBdKTsKKwlpZiAob3V0X21lc3NhZ2VzWzBdID09IG1zZykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKKworLyogUmUtcnVubmFibGUgaW52b2NhdGlvbiBvZiB0aGUgc3BlX2NvbnRleHRfcnVuIGNhbGwgKi8KK3ZvaWQgU1BFX1J1bkNvbnRleHQodm9pZCAqdGhyZWFkX2FyZ3ApCit7CisJLyogYXJncCBpcyB0aGUgcG9pbnRlciB0byBhcmd1bWVudCB0byBiZSBwYXNzZWQgdG8gdGhlIFNQRSBwcm9ncmFtICovCisJc3B1X2RhdGFfdCAqYXJncyA9IChzcHVfZGF0YV90ICopIHRocmVhZF9hcmdwOworCWRlcHJpbnRmKDMsICJbUFMzLT5TUFVdIHZvaWQqIGFyZ3A9MHgleFxuIiwgKHVuc2lnbmVkIGludClhcmdzLT5hcmdwKTsKKworCS8qIFJ1biBpdC4uICovCisJZGVwcmludGYoMiwgIltQUzMtPlNQVV0gUnVuIFNQRSBwcm9ncmFtOiAlc1xuIiwgYXJncy0+cHJvZ3JhbV9uYW1lKTsKKwlpZiAoc3BlX2NvbnRleHRfcnVuCisJICAgIChhcmdzLT5jdHgsICZhcmdzLT5lbnRyeSwgMCwgKHZvaWQgKilhcmdzLT5hcmdwLCBOVUxMLAorCSAgICAgTlVMTCkgPCAwKSB7CisJCWRlcHJpbnRmKDIsICJbUFMzLT5TUFVdIEZhaWxlZCBydW5uaW5nIFNQRSBjb250ZXh0OiAlc1xuIiwgYXJncy0+cHJvZ3JhbV9uYW1lKTsKKwkJU0RMX1NldEVycm9yKCJbUFMzLT5TUFVdIEZhaWxlZCBydW5uaW5nIFNQRSBjb250ZXh0OiAlcyIsIGFyZ3MtPnByb2dyYW1fbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCisJcHRocmVhZF9leGl0KE5VTEwpOworfQorCisKKy8qIFF1aXRzIHRoZSB2aWRlbyBkcml2ZXIgKi8KK3N0YXRpYyB2b2lkIFBTM19WaWRlb1F1aXQoX1RISVMpCit7CisJaWYgKGZiX2Rldl9mZCA+IDApIHsKKwkJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgdmlkZW8gbW9kZSAqLworCQlpZiAoaW9jdGwoZmJfZGV2X2ZkLCBGQklPUFVUX1ZTQ1JFRU5JTkZPLCAmZmJfb3JpZ192aW5mbykpCisJCQlTRExfU2V0RXJyb3IoIltQUzNdIENhbid0IHJlc3RvcmUgb3JpZ2luYWwgZmJfdmFyX3NjcmVlbmluZm8iKTsKKworCQkvKiBHaXZlIGNvbnRyb2wgb2YgZnJhbWUgYnVmZmVyIHRvIGtlcm5lbCAqLworCQlpb2N0bChmYl9kZXZfZmQsIFBTM0ZCX0lPQ1RMX09GRiwgMCk7CisJCWNsb3NlKGZiX2Rldl9mZCk7CisJCWZiX2Rldl9mZCA9IC0xOworCX0KKworCWlmIChmcmFtZV9idWZmZXIpIHsKKwkJbXVubWFwKGZyYW1lX2J1ZmZlciwgZmJfZmluZm8uc21lbV9sZW4pOworCQlmcmFtZV9idWZmZXIgPSAwOworCX0KKworCWlmIChmYl9wYXJtcykKKwkJZnJlZSgodm9pZCAqKWZiX3Bhcm1zKTsKKwlpZiAoZmJfdGhyZWFkX2RhdGEpIHsKKwkJU1BFX1NodXRkb3duKHRoaXMsIGZiX3RocmVhZF9kYXRhKTsKKwkJZnJlZSgodm9pZCAqKWZiX3RocmVhZF9kYXRhKTsKKwl9CisKKwlpZiAodGhpcy0+c2NyZWVuKSB7CisJCWlmIChkb3VibGVfYnVmZmVyaW5nICYmIHRoaXMtPnNjcmVlbi0+cGl4ZWxzKSB7CisJCQlmcmVlKHRoaXMtPnNjcmVlbi0+cGl4ZWxzKTsKKwkJfQorCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IE5VTEw7CisJfQorCisJZW5hYmxlX2N1cnNvcigxKTsKKwlkZXByaW50ZigxLCAiW1BTM10gVmlkZW9RdWl0XG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvU0RMX3BzM3ZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9TRExfcHMzdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmU1YTJiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvU0RMX3BzM3ZpZGVvLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAqIENFTEwgQkUgU3VwcG9ydCBmb3IgUFMzIEZyYW1lYnVmZmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEKKyAqIFVTQQorICoKKyAqICBNYXJ0aW4gTG93aW5za2kgIDxsb3dpbnNraSBbYXRdIGRlIFtkb3RdIGlibSBbaWJtXSBjb20+CisgKiAgRGlyayBIZXJyZW5kb2VyZmVyIDxkLmhlcnJlbmRvZXJmZXIgW2F0XSBkZSBbZG90XSBpYm0gW2RvdF0gY29tPgorICogIFNQRSBjb2RlIGJhc2VkIG9uIHJlc2VhcmNoIGJ5OgorICogIFJlbmUgQmVja2VyCisgKiAgVGhpbW8gRW1tZXJpY2gKKyAqLworCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgInNwdWxpYnMvc3B1X2NvbW1vbi5oIgorCisjaW5jbHVkZSA8bGlic3BlMi5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8YXNtL3BzM2ZiLmg+CisjaW5jbHVkZSA8bGludXgvdnQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisKKyNpZm5kZWYgX1NETF9wczN2aWRlb19oCisjZGVmaW5lIF9TRExfcHMzdmlkZW9faAorCisvKiBEZWJ1Z2dpbmcKKyAqIDA6IE5vIGRlYnVnIG1lc3NhZ2VzCisgKiAxOiBWaWRlbyBkZWJ1ZyBtZXNzYWdlcworICogMjogU1BFIGRlYnVnIG1lc3NhZ2VzCisgKiAzOiBNZW1vcnkgYWRyZXNzZXMKKyAqLworI2RlZmluZSBERUJVR19MRVZFTCAwCisKKyNpZmRlZiBERUJVR19MRVZFTAorI2RlZmluZSBkZXByaW50ZiggbGV2ZWwsIGZtdCwgYXJncy4uLiApIFwKKyAgICBkbyBcCit7IFwKKyAgICBpZiAoICh1bnNpZ25lZCkobGV2ZWwpIDw9IERFQlVHX0xFVkVMICkgXAorICAgIHsgXAorICAgICAgICBmcHJpbnRmKCBzdGRvdXQsIGZtdCwgIyNhcmdzICk7IFwKKyAgICAgICAgZmZsdXNoKCBzdGRvdXQgKTsgXAorICAgIH0gXAorfSB3aGlsZSAoIDAgKQorI2Vsc2UKKyNkZWZpbmUgZGVwcmludGYoIGxldmVsLCBmbXQsIGFyZ3MuLi4gKQorI2VuZGlmCisKKy8qIEZyYW1lYnVmZmVyIGRldmljZSAqLworI2RlZmluZSBQUzNfREVWX0ZCICIvZGV2L2ZiMCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTICAgU0RMX1ZpZGVvRGV2aWNlICogdGhpcworCisvKiBTUFUgdGhyZWFkIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IHNwdV9kYXRhIHsKKyAgICBzcGVfY29udGV4dF9wdHJfdCBjdHg7CisgICAgcHRocmVhZF90IHRocmVhZDsKKyAgICBzcGVfcHJvZ3JhbV9oYW5kbGVfdCBwcm9ncmFtOworICAgIGNoYXIgKiBwcm9ncmFtX25hbWU7CisgICAgdW5zaWduZWQgaW50IGJvb3RlZDsKKyAgICB1bnNpZ25lZCBpbnQga2VlcGFsaXZlOworICAgIHVuc2lnbmVkIGludCBlbnRyeTsKKyAgICBpbnQgZXJyb3JfY29kZTsKKyAgICB2b2lkICogYXJncDsKK30gc3B1X2RhdGFfdDsKKworLyogUHJpdmF0ZSB2aWRlbyBkcml2ZXIgZGF0YSBuZWVkZWQgZm9yIENlbGwgc3VwcG9ydCAqLworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhCit7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IGZiX2Rldl9uYW1lOyAvKiBGQi1kZXZpY2UgbmFtZSAqLworICAgIGludCBmYl9kZXZfZmQ7IC8qIERlc2NyaXB0b3ItaGFuZGxlIGZvciBmYl9kZXZfbmFtZSAqLworICAgIHVpbnQ4X3QgKiBmcmFtZV9idWZmZXI7IC8qIG1tYXAnZCBhY2Nlc3MgdG8gZmJkZXYgKi8KKworICAgIC8qIFNQRSB0aHJlYWRpbmcgc3R1ZmYgKi8KKyAgICBzcHVfZGF0YV90ICogZmJfdGhyZWFkX2RhdGE7CisgICAgc3B1X2RhdGFfdCAqIHNjYWxlcl90aHJlYWRfZGF0YTsKKyAgICBzcHVfZGF0YV90ICogY29udmVydGVyX3RocmVhZF9kYXRhOworCisgICAgLyogc2NyZWVuaW5mbyAoZnJvbSBsaW51eC9mYi5oKSAqLworICAgIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBmYl9maW5mbzsKKyAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZmJfdmluZm87CisgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGZiX29yaWdfdmluZm87CisKKyAgICAvKiBzY3JlZW5pbmZvIChmcm9tIGFzbS9wczNmYi5oKSAqLworICAgIHN0cnVjdCBwczNmYl9pb2N0bF9yZXMgcmVzOworCisgICAgdW5zaWduZWQgaW50IGRvdWJsZV9idWZmZXJpbmc7CisgICAgdWludDMyX3QgcmVhbF93aWR0aDsgICAgICAvLyByZWFsIHdpZHRoIG9mIHNjcmVlbgorICAgIHVpbnQzMl90IHJlYWxfaGVpZ2h0OyAgICAgLy8gcmVhbCBoZWlnaHQgb2Ygc2NyZWVuCisKKyAgICB1aW50MzJfdCBzX2ZiX3BpeGVsX3NpemU7ICAgLy8gMzI6ICA0ICAyNDogIDMgIDE2OiAgMiAgMTU6ICAyCisgICAgdWludDMyX3QgZmJfYml0c19wZXJfcGl4ZWw7ICAgLy8gMzI6IDMyICAyNDogMjQgIDE2OiAxNiAgMTU6IDE1CisKKyAgICB1aW50MzJfdCBjb25maWdfY291bnQ7CisKKyAgICB1aW50MzJfdCBzX2lucHV0X2xpbmVfbGVuZ3RoOyAgIC8vIHByZWNhbGN1bGF0ZWQ6IGlucHV0X3dpZHRoICogZmJfcGl4ZWxfc2l6ZQorICAgIHVpbnQzMl90IHNfYm91bmRlZF9pbnB1dF93aWR0aDsgLy8gd2lkdGggb2YgaW5wdXQgKGJvdW5kZWQgYnkgd3JpdGVhYmxlIHdpZHRoKQorICAgIHVpbnQzMl90IHNfYm91bmRlZF9pbnB1dF9oZWlnaHQ7Ly8gaGVpZ2h0IG9mIGlucHV0IChib3VuZGVkIGJ5IHdyaXRlYWJsZSBoZWlnaHQpCisgICAgdWludDMyX3Qgc19ib3VuZGVkX2lucHV0X3dpZHRoX29mZnNldDsgIC8vIG9mZnNldCBmcm9tIHRoZSBsZWZ0IHNpZGUgKHVzZWQgZm9yIGNlbnRlcmluZykKKyAgICB1aW50MzJfdCBzX2JvdW5kZWRfaW5wdXRfaGVpZ2h0X29mZnNldDsgLy8gb2Zmc2V0IGZyb20gdGhlIHVwcGVyIHNpZGUgKHVzZWQgZm9yIGNlbnRlcmluZykKKyAgICB1aW50MzJfdCBzX3dyaXRlYWJsZV93aWR0aDsgLy8gd2lkdGggb2Ygc2NyZWVuIHdoaWNoIGlzIHdyaXRlYWJsZQorICAgIHVpbnQzMl90IHNfd3JpdGVhYmxlX2hlaWdodDsgICAgLy8gaGVpZ2h0IG9mIHNjcmVlbiB3aGljaCBpcyB3cml0ZWFibGUKKworICAgIHVpbnQ4X3QgKiBzX2NlbnRlclsyXTsgLy8gd2hlcmUgdG8gYmVnaW4gd3JpdGluZyBvdXIgaW1hZ2UgKGNlbnRlcmVkPykKKyAgICB1aW50MzJfdCBzX2NlbnRlcl9pbmRleDsKKworICAgIHZvbGF0aWxlIHZvaWQgKiBzX3BpeGVscyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKKworICAgIC8qIEZyYW1lYnVmZmVyIGRhdGEgKi8KKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZmJfd3JpdGVyX3Bhcm1zX3QgKiBmYl9wYXJtcyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKK307CisKKyNkZWZpbmUgZmJfZGV2X25hbWUgICAgICh0aGlzLT5oaWRkZW4tPmZiX2Rldl9uYW1lKQorI2RlZmluZSBmYl9kZXZfZmQgICAgICAgKHRoaXMtPmhpZGRlbi0+ZmJfZGV2X2ZkKQorI2RlZmluZSBmcmFtZV9idWZmZXIgICAgICAgKHRoaXMtPmhpZGRlbi0+ZnJhbWVfYnVmZmVyKQorI2RlZmluZSBmYl90aHJlYWRfZGF0YSAgICAgICh0aGlzLT5oaWRkZW4tPmZiX3RocmVhZF9kYXRhKQorI2RlZmluZSBzY2FsZXJfdGhyZWFkX2RhdGEgICAgICAodGhpcy0+aGlkZGVuLT5zY2FsZXJfdGhyZWFkX2RhdGEpCisjZGVmaW5lIGNvbnZlcnRlcl90aHJlYWRfZGF0YSAgICAgICh0aGlzLT5oaWRkZW4tPmNvbnZlcnRlcl90aHJlYWRfZGF0YSkKKyNkZWZpbmUgZmJfcGFybXMgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPmZiX3Bhcm1zKQorI2RlZmluZSBTRExfbnVtbW9kZXMJCSh0aGlzLT5oaWRkZW4tPlNETF9udW1tb2RlcykKKyNkZWZpbmUgU0RMX21vZGVsaXN0CQkodGhpcy0+aGlkZGVuLT5TRExfbW9kZWxpc3QpCisjZGVmaW5lIFNETF92aWRlb21vZGUJCSh0aGlzLT5oaWRkZW4tPlNETF92aWRlb21vZGUpCisjZGVmaW5lIGZiX2ZpbmZvICAgICAgICAodGhpcy0+aGlkZGVuLT5mYl9maW5mbykKKyNkZWZpbmUgZmJfdmluZm8gICAgICAgICh0aGlzLT5oaWRkZW4tPmZiX3ZpbmZvKQorI2RlZmluZSBmYl9vcmlnX3ZpbmZvICAgKHRoaXMtPmhpZGRlbi0+ZmJfb3JpZ192aW5mbykKKyNkZWZpbmUgcmVzICAgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPnJlcykKKyNkZWZpbmUgZG91YmxlX2J1ZmZlcmluZyAodGhpcy0+aGlkZGVuLT5kb3VibGVfYnVmZmVyaW5nKQorI2RlZmluZSByZWFsX3dpZHRoICAgICAgKHRoaXMtPmhpZGRlbi0+cmVhbF93aWR0aCkKKyNkZWZpbmUgcmVhbF9oZWlnaHQgICAgICh0aGlzLT5oaWRkZW4tPnJlYWxfaGVpZ2h0KQorI2RlZmluZSBzX2ZiX3BpeGVsX3NpemUgICAodGhpcy0+aGlkZGVuLT5zX2ZiX3BpeGVsX3NpemUpCisjZGVmaW5lIGZiX2JpdHNfcGVyX3BpeGVsICh0aGlzLT5oaWRkZW4tPmZiX2JpdHNfcGVyX3BpeGVsKQorI2RlZmluZSBjb25maWdfY291bnQgKHRoaXMtPmhpZGRlbi0+Y29uZmlnX2NvdW50KQorI2RlZmluZSBzX2lucHV0X2xpbmVfbGVuZ3RoICh0aGlzLT5oaWRkZW4tPnNfaW5wdXRfbGluZV9sZW5ndGgpCisjZGVmaW5lIHNfYm91bmRlZF9pbnB1dF93aWR0aCAodGhpcy0+aGlkZGVuLT5zX2JvdW5kZWRfaW5wdXRfd2lkdGgpCisjZGVmaW5lIHNfYm91bmRlZF9pbnB1dF9oZWlnaHQgKHRoaXMtPmhpZGRlbi0+c19ib3VuZGVkX2lucHV0X2hlaWdodCkKKyNkZWZpbmUgc19ib3VuZGVkX2lucHV0X3dpZHRoX29mZnNldCAodGhpcy0+aGlkZGVuLT5zX2JvdW5kZWRfaW5wdXRfd2lkdGhfb2Zmc2V0KQorI2RlZmluZSBzX2JvdW5kZWRfaW5wdXRfaGVpZ2h0X29mZnNldCAodGhpcy0+aGlkZGVuLT5zX2JvdW5kZWRfaW5wdXRfaGVpZ2h0X29mZnNldCkKKyNkZWZpbmUgc193cml0ZWFibGVfd2lkdGggKHRoaXMtPmhpZGRlbi0+c193cml0ZWFibGVfd2lkdGgpCisjZGVmaW5lIHNfd3JpdGVhYmxlX2hlaWdodCAodGhpcy0+aGlkZGVuLT5zX3dyaXRlYWJsZV9oZWlnaHQpCisjZGVmaW5lIHNfY2VudGVyICAgICAgICAgICh0aGlzLT5oaWRkZW4tPnNfY2VudGVyKQorI2RlZmluZSBzX2NlbnRlcl9pbmRleCAgICAodGhpcy0+aGlkZGVuLT5zX2NlbnRlcl9pbmRleCkKKyNkZWZpbmUgc19waXhlbHMgICAgICAgICAgICh0aGlzLT5oaWRkZW4tPnNfcGl4ZWxzKQorCisjZW5kaWYgLyogX1NETF9wczN2aWRlb19oICovCisKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvU0RMX3BzM3l1di5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvU0RMX3BzM3l1di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTE3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9TRExfcHMzeXV2LmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAqIENFTEwgQkUgU3VwcG9ydCBmb3IgUFMzIEZyYW1lYnVmZmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEKKyAqIFVTQQorICoKKyAqICBNYXJ0aW4gTG93aW5za2kgIDxsb3dpbnNraSBbYXRdIGRlIFtkb3RdIGlibSBbaWJtXSBjb20+CisgKiAgRGlyayBIZXJyZW5kb2VyZmVyIDxkLmhlcnJlbmRvZXJmZXIgW2F0XSBkZSBbZG90XSBpYm0gW2RvdF0gY29tPgorICogIFNQRSBjb2RlIGJhc2VkIG9uIHJlc2VhcmNoIGJ5OgorICogIFJlbmUgQmVja2VyCisgKiAgVGhpbW8gRW1tZXJpY2gKKyAqLworCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3BzM3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3BzM3l1dl9jLmgiCisjaW5jbHVkZSAiLi4vU0RMX3l1dmZ1bmNzLmgiCisjaW5jbHVkZSAic3B1bGlicy9zcHVfY29tbW9uLmgiCisKKy8qIFN0b3JlcyB0aGUgZXhlY3V0YWJsZSBuYW1lICovCitleHRlcm4gc3BlX3Byb2dyYW1faGFuZGxlX3QgeXV2MnJnYl9zcHU7CitleHRlcm4gc3BlX3Byb2dyYW1faGFuZGxlX3QgYmlsaW5fc2NhbGVyX3NwdTsKKworaW50IFNQRV9TdGFydChfVEhJUywgc3B1X2RhdGFfdCAqIHNwZV9kYXRhKTsKK2ludCBTUEVfU3RvcChfVEhJUywgc3B1X2RhdGFfdCAqIHNwZV9kYXRhKTsKK2ludCBTUEVfQm9vdChfVEhJUywgc3B1X2RhdGFfdCAqIHNwZV9kYXRhKTsKK2ludCBTUEVfU2h1dGRvd24oX1RISVMsIHNwdV9kYXRhX3QgKiBzcGVfZGF0YSk7CitpbnQgU1BFX1NlbmRNc2coX1RISVMsIHNwdV9kYXRhX3QgKiBzcGVfZGF0YSwgdW5zaWduZWQgaW50IG1zZyk7CitpbnQgU1BFX1dhaXRGb3JNc2coX1RISVMsIHNwdV9kYXRhX3QgKiBzcGVfZGF0YSwgdW5zaWduZWQgaW50IG1zZyk7Cit2b2lkIFNQRV9SdW5Db250ZXh0KHZvaWQgKnRocmVhZF9hcmdwKTsKKworCisvKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gbWFuaXB1bGF0ZSBzb2Z0d2FyZSB2aWRlbyBvdmVybGF5cyAqLworc3RhdGljIHN0cnVjdCBwcml2YXRlX3l1dmh3ZnVuY3MgcHMzX3l1dmZ1bmNzID0geworICBQUzNfTG9ja1lVVk92ZXJsYXksCisgIFBTM19VbmxvY2tZVVZPdmVybGF5LAorICBQUzNfRGlzcGxheVlVVk92ZXJsYXksCisgIFBTM19GcmVlWVVWT3ZlcmxheQorfTsKKworCitzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgeworCVNETF9TdXJmYWNlICpkaXNwbGF5OworCVNETF9TdXJmYWNlICpzdHJldGNoOworICAgIHZvbGF0aWxlIHZvaWQgKiBwaXhlbHMgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxMjgpKSk7CisKKwkvKiBUaGVzZSBhcmUganVzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIHRoZW0gc2VwYXJhdGVseSAqLworCVVpbnQxNiBwaXRjaGVzWzNdOworCVVpbnQ4ICogcGxhbmVzWzNdOworCisJdW5zaWduZWQgaW50IHNjYWxlOworCisJLyogU2NhbGVkIFlVViBwaWN0dXJlICovCisJVWludDggKiBzY2FsZXJfb3V0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTI4KSkpOworCisJLyogWVVWMlJHQiBjb252ZXJ0ZXIgZGF0YSAqLworICAgIHZvbGF0aWxlIHN0cnVjdCB5dXYycmdiX3Bhcm1zX3QgKiBjb252ZXJ0ZXJfcGFybXMgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxMjgpKSk7CisKKwkvKiBTY2FsZXIgZGF0YSAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBzY2FsZV9wYXJtc190ICogc2NhbGVyX3Bhcm1zIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTI4KSkpOworCisJVWludDggbG9ja2VkOworfTsKKworCitTRExfT3ZlcmxheSAqUFMzX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpIHsKKwkvKiBPbmx5IFJHQiBwYWNrZWQgcGl4ZWwgY29udmVyc2lvbiBzdXBwb3J0ZWQgKi8KKwlpZiAoKGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCAhPSAyKSAmJgorCQkJKGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCAhPSAzKSAmJgorCQkJKGRpc3BsYXktPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCAhPSA0KSkKKwl7CisJCVNETF9TZXRFcnJvciAoIkNhbid0IHVzZSBZVVYgZGF0YSBvbiBub24gMTYvMjQvMzIgYml0IHN1cmZhY2VzIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIERvdWJsZS1jaGVjayB0aGUgcmVxdWVzdGVkIGZvcm1hdC4gV2UnbGwgb25seSBzdXBwb3J0IFlWMTIgKi8KKwlzd2l0Y2ggKGZvcm1hdCkgeworCSAgICBjYXNlIFNETF9JWVVWX09WRVJMQVk6CisJCWNhc2UgU0RMX1lWMTJfT1ZFUkxBWToKKwkJCS8qIFN1cHBvcnRlZCBZVVYgZm9ybWF0ICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgWVVWIGZvcm1hdCIpOworCQkJcmV0dXJuIE5VTEw7CisJfQorCisJU0RMX092ZXJsYXkqIG92ZXJsYXk7CisJc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhKiBod2RhdGE7CisKKwkvKiBDcmVhdGUgdGhlIG92ZXJsYXkgc3RydWN0dXJlICovCisJb3ZlcmxheSA9IChTRExfT3ZlcmxheSAqKSBTRExfY2FsbG9jKDEsIHNpemVvZihTRExfT3ZlcmxheSkpOworCWlmIChvdmVybGF5ID09IE5VTEwpIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybiBOVUxMOworCX0KKwlTRExfbWVtc2V0KG92ZXJsYXksIDAsIChzaXplb2YgKm92ZXJsYXkpKTsKKworCS8qIFNldCB0aGUgYmFzaWMgYXR0cmlidXRlcyAqLworCW92ZXJsYXktPmZvcm1hdCA9IGZvcm1hdDsKKwlvdmVybGF5LT53ID0gd2lkdGg7CisJb3ZlcmxheS0+aCA9IGhlaWdodDsKKwlvdmVybGF5LT5od2RhdGEgPSBOVUxMOworCisJLyogU2V0IHVwIHRoZSBQUzMgWVVWIHN1cmZhY2UgZnVuY3Rpb24gc3RydWN0dXJlICovCisJb3ZlcmxheS0+aHdmdW5jcyA9ICZwczNfeXV2ZnVuY3M7CisKKwkvKiBDcmVhdGUgdGhlIHBpeGVsIGRhdGEgYW5kIGxvb2t1cCB0YWJsZXMgKi8KKwlod2RhdGEgPSAoc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICopIFNETF9jYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSkpOworCWlmIChod2RhdGEgPT0gTlVMTCkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJb3ZlcmxheS0+aHdkYXRhID0gaHdkYXRhOworCisJaHdkYXRhLT5zdHJldGNoID0gTlVMTDsKKwlod2RhdGEtPmRpc3BsYXkgPSBkaXNwbGF5OworCisJLyogQ3JlYXRlIFNQVSBwYXJtcyBzdHJ1Y3R1cmUgKi8KKwlod2RhdGEtPmNvbnZlcnRlcl9wYXJtcyA9IChzdHJ1Y3QgeXV2MnJnYl9wYXJtc190ICopIG1lbWFsaWduKDE2LCBzaXplb2Yoc3RydWN0IHl1djJyZ2JfcGFybXNfdCkpOworCWh3ZGF0YS0+c2NhbGVyX3Bhcm1zID0gKHN0cnVjdCBzY2FsZV9wYXJtc190ICopIG1lbWFsaWduKDE2LCBzaXplb2Yoc3RydWN0IHNjYWxlX3Bhcm1zX3QpKTsKKwlpZiAoaHdkYXRhLT5jb252ZXJ0ZXJfcGFybXMgPT0gTlVMTCB8fCBod2RhdGEtPnNjYWxlcl9wYXJtcyA9PSBOVUxMKSB7CisJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIFNQRXMgKi8KKwlzY2FsZXJfdGhyZWFkX2RhdGEgPSAoc3B1X2RhdGFfdCAqKSBtYWxsb2Moc2l6ZW9mKHNwdV9kYXRhX3QpKTsKKwljb252ZXJ0ZXJfdGhyZWFkX2RhdGEgPSAoc3B1X2RhdGFfdCAqKSBtYWxsb2Moc2l6ZW9mKHNwdV9kYXRhX3QpKTsKKwlpZiAoY29udmVydGVyX3RocmVhZF9kYXRhID09IE5VTEwgfHwgc2NhbGVyX3RocmVhZF9kYXRhID09IE5VTEwpIHsKKwkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCXNjYWxlcl90aHJlYWRfZGF0YS0+cHJvZ3JhbSA9IGJpbGluX3NjYWxlcl9zcHU7CisJc2NhbGVyX3RocmVhZF9kYXRhLT5wcm9ncmFtX25hbWUgPSAiYmlsaW5fc2NhbGVyX3NwdSI7CisJc2NhbGVyX3RocmVhZF9kYXRhLT5rZWVwYWxpdmUgPSAwOworCXNjYWxlcl90aHJlYWRfZGF0YS0+Ym9vdGVkID0gMDsKKworCWNvbnZlcnRlcl90aHJlYWRfZGF0YS0+cHJvZ3JhbSA9IHl1djJyZ2Jfc3B1OworCWNvbnZlcnRlcl90aHJlYWRfZGF0YS0+cHJvZ3JhbV9uYW1lID0gInl1djJyZ2Jfc3B1IjsKKwljb252ZXJ0ZXJfdGhyZWFkX2RhdGEtPmtlZXBhbGl2ZSA9IDE7CisJY29udmVydGVyX3RocmVhZF9kYXRhLT5ib290ZWQgPSAwOworCisJU1BFX1N0YXJ0KHRoaXMsIGNvbnZlcnRlcl90aHJlYWRfZGF0YSk7CisKKwlod2RhdGEtPnBpeGVscyA9IChVaW50OCAqKSBtZW1hbGlnbigxNiwgd2lkdGggKiBoZWlnaHQgKyAoKHdpZHRoICogaGVpZ2h0KSA+PiAxKSk7CisJaWYgKGh3ZGF0YS0+cGl4ZWxzID09IE5VTEwpIHsKKwkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIEZpbmQgdGhlIHBpdGNoIGFuZCBvZmZzZXQgdmFsdWVzIGZvciB0aGUgb3ZlcmxheSAqLworCW92ZXJsYXktPnBpdGNoZXMgPSBod2RhdGEtPnBpdGNoZXM7CisJb3ZlcmxheS0+cGl4ZWxzID0gaHdkYXRhLT5wbGFuZXM7CisJc3dpdGNoIChmb3JtYXQpIHsKKwkgICAgY2FzZSBTRExfWVYxMl9PVkVSTEFZOgorCSAgICBjYXNlIFNETF9JWVVWX09WRVJMQVk6CisJCQlvdmVybGF5LT5waXRjaGVzWzBdID0gb3ZlcmxheS0+dzsKKwkJCW92ZXJsYXktPnBpdGNoZXNbMV0gPSBvdmVybGF5LT5waXRjaGVzWzBdIC8gMjsKKwkJCW92ZXJsYXktPnBpdGNoZXNbMl0gPSBvdmVybGF5LT5waXRjaGVzWzBdIC8gMjsKKwkJCW92ZXJsYXktPnBpeGVsc1swXSA9IChVaW50OCAqKWh3ZGF0YS0+cGl4ZWxzOworCQkJb3ZlcmxheS0+cGl4ZWxzWzFdID0gb3ZlcmxheS0+cGl4ZWxzWzBdICsKKwkJCQlvdmVybGF5LT5waXRjaGVzWzBdICogb3ZlcmxheS0+aDsKKwkJCW92ZXJsYXktPnBpeGVsc1syXSA9IG92ZXJsYXktPnBpeGVsc1sxXSArCisJCQkJb3ZlcmxheS0+cGl0Y2hlc1sxXSAqIG92ZXJsYXktPmggLyAyOworCQkJb3ZlcmxheS0+cGxhbmVzID0gMzsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAoY2F1Z2h0IGFib3ZlKSAqLworCQlicmVhazsKKwl9CisKKwkvKiBXZSdyZSBhbGwgZG9uZS4uICovCisJcmV0dXJuIG92ZXJsYXk7Cit9CisKKworaW50IFBTM19Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpIHsKKwlpZiAob3ZlcmxheSA9PSBOVUxMKSB7CisJCXJldHVybiAtMTsKKwl9CisJb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBQUzNfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpIHsKKwlpZiAob3ZlcmxheSA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisJb3ZlcmxheS0+aHdkYXRhLT5sb2NrZWQgPSAwOworCisJcmV0dXJuOworfQorCisKK2ludCBQUzNfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KSB7CisJaWYgKChvdmVybGF5ID09IE5VTEwpIHx8IChvdmVybGF5LT5od2RhdGEgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCVVpbnQ4ICpsdW0sICpDciwgKkNiOworCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhOworCVNETF9TdXJmYWNlICpkaXNwbGF5OworCisJaHdkYXRhID0gb3ZlcmxheS0+aHdkYXRhOworCWRpc3BsYXkgPSBod2RhdGEtPmRpc3BsYXk7CisKKwkvKiBEbyB3ZSBoYXZlIHRvIHNjYWxlPyAqLworCWlmICgoc3JjLT53ICE9IGRzdC0+dykgfHwgKHNyYy0+aCAhPSBkc3QtPmgpICkgeworCQlod2RhdGEtPnNjYWxlID0gMTsKKwkJZGVwcmludGYoMSwgIltQUzNdIFdlIG5lZWQgdG8gc2NhbGVcbiIpOworCX0gZWxzZSB7CisJCWh3ZGF0YS0+c2NhbGUgPSAwOworCQlkZXByaW50ZigxLCAiW1BTM10gTm8gc2NhbGluZ1xuIik7CisJfQorCisJLyogRmluZCBvdXQgd2hlcmUgdGhlIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIGltYWdlIGFyZSAqLworCXN3aXRjaCAob3ZlcmxheS0+Zm9ybWF0KSB7CisJCWNhc2UgU0RMX1lWMTJfT1ZFUkxBWToKKwkJCWx1bSA9IChVaW50OCAqKW92ZXJsYXktPnBpeGVsc1swXTsKKwkJCUNyID0gIChVaW50OCAqKW92ZXJsYXktPnBpeGVsc1sxXTsKKwkJCUNiID0gIChVaW50OCAqKW92ZXJsYXktPnBpeGVsc1syXTsKKwkJCWJyZWFrOworCQljYXNlIFNETF9JWVVWX09WRVJMQVk6CisJCQlsdW0gPSAoVWludDggKilvdmVybGF5LT5waXhlbHNbMF07CisJCQlDciA9ICAoVWludDggKilvdmVybGF5LT5waXhlbHNbMl07CisJCQlDYiA9ICAoVWludDggKilvdmVybGF5LT5waXhlbHNbMV07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNETF9TZXRFcnJvcigiVW5zdXBwb3J0ZWQgWVVWIGZvcm1hdCBpbiBibGl0Iik7CisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGh3ZGF0YS0+c2NhbGUpIHsKKwkJLyogQWxsb2MgbWVtIGZvciBzY2FsZWQgWVVWIHBpY3R1cmUgKi8KKwkJaHdkYXRhLT5zY2FsZXJfb3V0ID0gKFVpbnQ4ICopIG1lbWFsaWduKDE2LCBkc3QtPncgKiBkc3QtPmggKyAoKGRzdC0+dyAqIGRzdC0+aCkgPj4gMSkpOworCQlpZiAoaHdkYXRhLT5zY2FsZXJfb3V0ID09IE5VTEwpIHsKKwkJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogU2V0IHBhcm1zIGZvciBzY2FsaW5nICovCisJCWh3ZGF0YS0+c2NhbGVyX3Bhcm1zLT5zcmNfcGl4ZWxfd2lkdGggPSBzcmMtPnc7CisJCWh3ZGF0YS0+c2NhbGVyX3Bhcm1zLT5zcmNfcGl4ZWxfaGVpZ2h0ID0gc3JjLT5oOworCQlod2RhdGEtPnNjYWxlcl9wYXJtcy0+ZHN0X3BpeGVsX3dpZHRoID0gZHN0LT53OworCQlod2RhdGEtPnNjYWxlcl9wYXJtcy0+ZHN0X3BpeGVsX2hlaWdodCA9IGRzdC0+aDsKKwkJaHdkYXRhLT5zY2FsZXJfcGFybXMtPnlfcGxhbmUgPSBsdW07CisJCWh3ZGF0YS0+c2NhbGVyX3Bhcm1zLT52X3BsYW5lID0gQ3I7CisJCWh3ZGF0YS0+c2NhbGVyX3Bhcm1zLT51X3BsYW5lID0gQ2I7CisJCWh3ZGF0YS0+c2NhbGVyX3Bhcm1zLT5kc3RCdWZmZXIgPSBod2RhdGEtPnNjYWxlcl9vdXQ7CisJCXNjYWxlcl90aHJlYWRfZGF0YS0+YXJncCA9ICh2b2lkICopaHdkYXRhLT5zY2FsZXJfcGFybXM7CisKKwkJLyogU2NhbGUgdGhlIFlVViBvdmVybGF5IHRvIGdpdmVuIHNpemUgKi8KKwkJU1BFX1N0YXJ0KHRoaXMsIHNjYWxlcl90aHJlYWRfZGF0YSk7CisJCVNQRV9TdG9wKHRoaXMsIHNjYWxlcl90aHJlYWRfZGF0YSk7CisKKwkJLyogU2V0IHBhcm1zIGZvciBjb252ZXJ0aW5nIGFmdGVyIHNjYWxpbmcgKi8KKwkJaHdkYXRhLT5jb252ZXJ0ZXJfcGFybXMtPnlfcGxhbmUgPSBod2RhdGEtPnNjYWxlcl9vdXQ7CisJCWh3ZGF0YS0+Y29udmVydGVyX3Bhcm1zLT52X3BsYW5lID0gaHdkYXRhLT5zY2FsZXJfb3V0ICsgZHN0LT53ICogZHN0LT5oOworCQlod2RhdGEtPmNvbnZlcnRlcl9wYXJtcy0+dV9wbGFuZSA9IGh3ZGF0YS0+c2NhbGVyX291dCArIGRzdC0+dyAqIGRzdC0+aCArICgoZHN0LT53ICogZHN0LT5oKSA+PiAyKTsKKwl9IGVsc2UgeworCQkvKiBTZXQgcGFybXMgZm9yIGNvbnZlcnRpbmcgKi8KKwkJaHdkYXRhLT5jb252ZXJ0ZXJfcGFybXMtPnlfcGxhbmUgPSBsdW07CisJCWh3ZGF0YS0+Y29udmVydGVyX3Bhcm1zLT52X3BsYW5lID0gQ3I7CisJCWh3ZGF0YS0+Y29udmVydGVyX3Bhcm1zLT51X3BsYW5lID0gQ2I7CisJfQorCisJaHdkYXRhLT5jb252ZXJ0ZXJfcGFybXMtPnNyY19waXhlbF93aWR0aCA9IGRzdC0+dzsKKwlod2RhdGEtPmNvbnZlcnRlcl9wYXJtcy0+c3JjX3BpeGVsX2hlaWdodCA9IGRzdC0+aDsKKwlod2RhdGEtPmNvbnZlcnRlcl9wYXJtcy0+ZHN0QnVmZmVyID0gKFVpbnQ4ICopIHNfcGl4ZWxzOworCWNvbnZlcnRlcl90aHJlYWRfZGF0YS0+YXJncCA9ICh2b2lkICopaHdkYXRhLT5jb252ZXJ0ZXJfcGFybXM7CisKKwkvKiBDb252ZXJ0IFlVViBvdmVybGF5IHRvIFJHQiAqLworCVNQRV9TZW5kTXNnKHRoaXMsIGNvbnZlcnRlcl90aHJlYWRfZGF0YSwgU1BVX1NUQVJUKTsKKwlTUEVfU2VuZE1zZyh0aGlzLCBjb252ZXJ0ZXJfdGhyZWFkX2RhdGEsICh1bnNpZ25lZCBpbnQpY29udmVydGVyX3RocmVhZF9kYXRhLT5hcmdwKTsKKworCS8qIENlbnRlcmluZyAqLworCXNfYm91bmRlZF9pbnB1dF93aWR0aCA9IGRzdC0+dzsKKwlzX2JvdW5kZWRfaW5wdXRfaGVpZ2h0ID0gZHN0LT5oOworCisJLyogVXBkYXRlUmVjdHMoKSB3aWxsIGRvIHRoZSByZXN0Li4gKi8KKwlTRExfVXBkYXRlUmVjdHMoZGlzcGxheSwgMSwgZHN0KTsKKworCWlmIChod2RhdGEtPnNjYWxlKQorCQlTRExfZnJlZSgodm9pZCAqKWh3ZGF0YS0+c2NhbGVyX291dCk7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIFBTM19GcmVlWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpIHsKKwlpZiAob3ZlcmxheSA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAob3ZlcmxheS0+aHdkYXRhID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqIGh3ZGF0YTsKKwlod2RhdGEgPSBvdmVybGF5LT5od2RhdGE7CisKKwlpZiAoc2NhbGVyX3RocmVhZF9kYXRhKQorCQlTRExfZnJlZShzY2FsZXJfdGhyZWFkX2RhdGEpOworCWlmIChjb252ZXJ0ZXJfdGhyZWFkX2RhdGEpIHsKKwkJU1BFX1NodXRkb3duKHRoaXMsIGNvbnZlcnRlcl90aHJlYWRfZGF0YSk7CisJCVNETF9mcmVlKGNvbnZlcnRlcl90aHJlYWRfZGF0YSk7CisJfQorCisJaWYgKGh3ZGF0YSkgeworCQlpZiAoaHdkYXRhLT5waXhlbHMpCisJCQlTRExfZnJlZSgodm9pZCAqKWh3ZGF0YS0+cGl4ZWxzKTsKKwkJU0RMX2ZyZWUoaHdkYXRhKTsKKwl9CisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9TRExfcHMzeXV2X2MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMzL1NETF9wczN5dXZfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjlkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9TRExfcHMzeXV2X2MuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgKiBDRUxMIEJFIFN1cHBvcnQgZm9yIFBTMyBGcmFtZWJ1ZmZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiBVU0EKKyAqCisgKiAgTWFydGluIExvd2luc2tpICA8bG93aW5za2kgW2F0XSBkZSBbZG90XSBpYm0gW2libV0gY29tPgorICogIERpcmsgSGVycmVuZG9lcmZlciA8ZC5oZXJyZW5kb2VyZmVyIFthdF0gZGUgW2RvdF0gaWJtIFtkb3RdIGNvbT4KKyAqICBTUEUgY29kZSBiYXNlZCBvbiByZXNlYXJjaCBieToKKyAqICBSZW5lIEJlY2tlcgorICogIFRoaW1vIEVtbWVyaWNoCisgKi8KKworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX3BzM3l1dl9oCisjZGVmaW5lIF9TRExfcHMzeXV2X2gKKworLyogVGhpcyBpcyB0aGUgUFMzIGltcGxlbWVudGF0aW9uIG9mIFlVViB2aWRlbyBvdmVybGF5cyAqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisKK2V4dGVybiBTRExfT3ZlcmxheSAqUFMzX0NyZWF0ZVlVVk92ZXJsYXkoX1RISVMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCwgU0RMX1N1cmZhY2UgKmRpc3BsYXkpOworZXh0ZXJuIGludCBQUzNfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KTsKK2V4dGVybiBpbnQgUFMzX0xvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7CitleHRlcm4gdm9pZCBQUzNfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpOworZXh0ZXJuIHZvaWQgUFMzX0ZyZWVZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7CisKKyNlbmRpZiAvKiBfU0RMX3BzM3l1dl9oICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMzL3NwdWxpYnMvTWFrZWZpbGUgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9zcHVsaWJzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNTgwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9zcHVsaWJzL01ha2VmaWxlCkBAIC0wLDAgKzEsODMgQEAKKyMgVGhpcyBNYWtlZmlsZSBpcyBmb3IgYnVpbGRpbmcgdGhlIENFTEwgQkUgU1BVIGxpYnMKKyMgbGliZmJfd3JpdGVyX3NwdS5zbywgbGlieXV2MnJnYl9zcHUuc28sIGxpYmJpbGluX3NjYWxlcl9zcHUuc28KKworIyBUb29sY2hhaW4KK1NQVV9HQ0M9L3Vzci9iaW4vc3B1LWdjYworUFBVX0dDQz0vdXNyL2Jpbi9nY2MKK1BQVV9FTUJFRFNQVT0vdXNyL2Jpbi9lbWJlZHNwdQorUFBVX0FSPS91c3IvYmluL2FyCitQUFVfTEQ9L3Vzci9iaW4vbGQKK0lOU1RBTEw9L3Vzci9iaW4vaW5zdGFsbAorCitTUFVfQ0ZMQUdTPS1XIC1XYWxsIC1XaW5saW5lIC1Xbm8tbWFpbiAtSS4gLUkgL3Vzci9zcHUvaW5jbHVkZSAtSSAvb3B0L2NlbGwvc2RrL3Vzci9zcHUvaW5jbHVkZSAtZmlubGluZS1saW1pdD0xMDAwMCAtV2lubGluZSAtZnRyZWUtdmVjdG9yaXplIC1mdW5yb2xsLWxvb3BzIC1mbW9kdWxvLXNjaGVkIC1mZmFzdC1tYXRoIC1mUElDIC1PMgorCisjIFVzdWFsbHkgL3Vzci9saWIsIGRlcGVuZGluZyBvbiB5b3VyIGRpc3RyaWJ1dGlvbgorUFJFRklYPS91c3IvbGliCisKKworYWxsOiBsaWJmYl93cml0ZXJfc3B1LmEgbGliZmJfd3JpdGVyX3NwdS5zbyBcCisJCQkJbGlieXV2MnJnYl9zcHUuc28gbGlieXV2MnJnYl9zcHUuYSBcCisJCQkJbGliYmlsaW5fc2NhbGVyX3NwdS5zbyBsaWJiaWxpbl9zY2FsZXJfc3B1LmEKKworCisjIGZiX3dyaXRlcgorZmJfd3JpdGVyX3NwdS1lbWJlZC5vOiBmYl93cml0ZXIuYyBzcHVfY29tbW9uLmgKKwkkKFNQVV9HQ0MpICQoU1BVX0NGTEFHUykgLW8gZmJfd3JpdGVyX3NwdSBmYl93cml0ZXIuYyAtbG0KKwkkKFBQVV9FTUJFRFNQVSkgLW0zMiBmYl93cml0ZXJfc3B1IGZiX3dyaXRlcl9zcHUgZmJfd3JpdGVyX3NwdS1lbWJlZC5vCisKK2xpYmZiX3dyaXRlcl9zcHUuc286IGZiX3dyaXRlcl9zcHUtZW1iZWQubworCSQoUFBVX0xEKSAtbyBsaWJmYl93cml0ZXJfc3B1LnNvIC1zaGFyZWQgLXNvbmFtZT1saWJmYl93cml0ZXJfc3B1LnNvIGZiX3dyaXRlcl9zcHUtZW1iZWQubworCitsaWJmYl93cml0ZXJfc3B1LmE6IGZiX3dyaXRlcl9zcHUtZW1iZWQubworCSQoUFBVX0FSKSAtcWNzIGxpYmZiX3dyaXRlcl9zcHUuYSBmYl93cml0ZXJfc3B1LWVtYmVkLm8KKworCisjIHl1djJyZ2JfY29udmVydGVyCit5dXYycmdiX3NwdS1lbWJlZC5vOiB5dXYycmdiX2NvbnZlcnRlci5jIHNwdV9jb21tb24uaAorCSQoU1BVX0dDQykgJChTUFVfQ0ZMQUdTKSAtbyB5dXYycmdiX3NwdSB5dXYycmdiX2NvbnZlcnRlci5jIC1sbQorCSQoUFBVX0VNQkVEU1BVKSAtbTMyIHl1djJyZ2Jfc3B1IHl1djJyZ2Jfc3B1IHl1djJyZ2Jfc3B1LWVtYmVkLm8KKworbGlieXV2MnJnYl9zcHUuYTogeXV2MnJnYl9zcHUtZW1iZWQubworCSQoUFBVX0FSKSAtcWNzIGxpYnl1djJyZ2Jfc3B1LmEgeXV2MnJnYl9zcHUtZW1iZWQubworCitsaWJ5dXYycmdiX3NwdS5zbzogeXV2MnJnYl9zcHUtZW1iZWQubworCSQoUFBVX0xEKSAtbyBsaWJ5dXYycmdiX3NwdS5zbyAtc2hhcmVkIC1zb25hbWU9bGlieXV2MnJnYl9zcHUuc28geXV2MnJnYl9zcHUtZW1iZWQubworCisKKyMgYmlsaW5fc2NhbGVyCitiaWxpbl9zY2FsZXJfc3B1LWVtYmVkLm86IGJpbGluX3NjYWxlci5jIHNwdV9jb21tb24uaAorCSQoU1BVX0dDQykgJChTUFVfQ0ZMQUdTKSAtbyBiaWxpbl9zY2FsZXJfc3B1IGJpbGluX3NjYWxlci5jIC1sbQorCSQoUFBVX0VNQkVEU1BVKSAtbTMyIGJpbGluX3NjYWxlcl9zcHUgYmlsaW5fc2NhbGVyX3NwdSBiaWxpbl9zY2FsZXJfc3B1LWVtYmVkLm8KKworbGliYmlsaW5fc2NhbGVyX3NwdS5hOiBiaWxpbl9zY2FsZXJfc3B1LWVtYmVkLm8KKwkkKFBQVV9BUikgLXFjcyBsaWJiaWxpbl9zY2FsZXJfc3B1LmEgYmlsaW5fc2NhbGVyX3NwdS1lbWJlZC5vCisKK2xpYmJpbGluX3NjYWxlcl9zcHUuc286IGJpbGluX3NjYWxlcl9zcHUtZW1iZWQubworCSQoUFBVX0xEKSAtbyBsaWJiaWxpbl9zY2FsZXJfc3B1LnNvIC1zaGFyZWQgLXNvbmFtZT1saWJiaWxpbl9zY2FsZXJfc3B1LnNvIGJpbGluX3NjYWxlcl9zcHUtZW1iZWQubworCitpbnN0YWxsOiBsaWJmYl93cml0ZXJfc3B1LmEgbGliZmJfd3JpdGVyX3NwdS5zbyBcCisJCQkJbGlieXV2MnJnYl9zcHUuc28gbGlieXV2MnJnYl9zcHUuYSBcCisJCQkJbGliYmlsaW5fc2NhbGVyX3NwdS5zbyBsaWJiaWxpbl9zY2FsZXJfc3B1LmEKKwkkKElOU1RBTEwpIC1jIC1tIDA3NTUgbGliZmJfd3JpdGVyX3NwdS5zbyAkKFBSRUZJWCkvLgorCSQoSU5TVEFMTCkgLWMgLW0gMDY1NSBsaWJmYl93cml0ZXJfc3B1LmEgJChQUkVGSVgpLy4KKwkkKElOU1RBTEwpIC1jIC1tIDA3NTUgbGlieXV2MnJnYl9zcHUuc28gJChQUkVGSVgpLy4KKwkkKElOU1RBTEwpIC1jIC1tIDA2NTUgbGlieXV2MnJnYl9zcHUuYSAkKFBSRUZJWCkvLgorCSQoSU5TVEFMTCkgLWMgLW0gMDc1NSBsaWJiaWxpbl9zY2FsZXJfc3B1LnNvICQoUFJFRklYKS8uCisJJChJTlNUQUxMKSAtYyAtbSAwNjU1IGxpYmJpbGluX3NjYWxlcl9zcHUuYSAkKFBSRUZJWCkvLgorCisKK3VuaW5zdGFsbDogJChQUkVGSVgpL2xpYmZiX3dyaXRlcl9zcHUuc28gJChQUkVGSVgpL2xpYmZiX3dyaXRlcl9zcHUuYSBcCisJCSQoUFJFRklYKS9saWJ5dXYycmdiX3NwdS5zbyAkKFBSRUZJWCkvbGlieXV2MnJnYl9zcHUuYSBcCisJCSQoUFJFRklYKS9saWJiaWxpbl9zY2FsZXJfc3B1LnNvICQoUFJFRklYKS9saWJiaWxpbl9zY2FsZXJfc3B1LmEKKwlybSAtZiAkKFBSRUZJWCkvbGliZmJfd3JpdGVyX3NwdS5hCisJcm0gLWYgJChQUkVGSVgpL2xpYmZiX3dyaXRlcl9zcHUuc28KKwlybSAtZiAkKFBSRUZJWCkvbGlieXV2MnJnYl9zcHUuc28KKwlybSAtZiAkKFBSRUZJWCkvbGlieXV2MnJnYl9zcHUuYQorCXJtIC1mICQoUFJFRklYKS9saWJiaWxpbl9zY2FsZXJfc3B1LnNvCisJcm0gLWYgJChQUkVGSVgpL2xpYmJpbGluX3NjYWxlcl9zcHUuYQorCisKK2NsZWFuOgorCXJtIC1mIGJpbGluX3NjYWxlcl9zcHUtZW1iZWQubyBsaWJiaWxpbl9zY2FsZXJfc3B1LnNvIGxpYmJpbGluX3NjYWxlcl9zcHUuYSBiaWxpbl9zY2FsZXJfc3B1CisJcm0gLWYgeXV2MnJnYl9zcHUtZW1iZWQubyBsaWJ5dXYycmdiX3NwdS5zbyBsaWJ5dXYycmdiX3NwdS5hIHl1djJyZ2Jfc3B1CisJcm0gLWYgZmJfd3JpdGVyX3NwdS1lbWJlZC5vIGxpYmZiX3dyaXRlcl9zcHUuc28gbGliZmJfd3JpdGVyX3NwdS5hIGZiX3dyaXRlcl9zcHUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMzL3NwdWxpYnMvYmlsaW5fc2NhbGVyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9zcHVsaWJzL2JpbGluX3NjYWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWI1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9zcHVsaWJzL2JpbGluX3NjYWxlci5jCkBAIC0wLDAgKzEsMjA1MCBAQAorLyoKKyAqIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICogQ0VMTCBCRSBTdXBwb3J0IGZvciBQUzMgRnJhbWVidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMQorICogVVNBCisgKgorICogIE1hcnRpbiBMb3dpbnNraSAgPGxvd2luc2tpIFthdF0gZGUgW2RvdF0gaWJtIFtpYm1dIGNvbT4KKyAqICBEaXJrIEhlcnJlbmRvZXJmZXIgPGQuaGVycmVuZG9lcmZlciBbYXRdIGRlIFtkb3RdIGlibSBbZG90XSBjb20+CisgKiAgU1BFIGNvZGUgYmFzZWQgb24gcmVzZWFyY2ggYnk6CisgKiAgUmVuZSBCZWNrZXIKKyAqICBUaGltbyBFbW1lcmljaAorICovCisKKyNpbmNsdWRlICJzcHVfY29tbW9uLmgiCisKKyNpbmNsdWRlIDxzcHVfaW50cmluc2ljcy5oPgorI2luY2x1ZGUgPHNwdV9tZmNpby5oPgorCisvLyBEZWJ1Z2dpbmcKKy8vI2RlZmluZSBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZGVwcmludGYoZm10LCBhcmdzLi4uICkgXAorCWZwcmludGYoIHN0ZG91dCwgZm10LCAjI2FyZ3MgKTsgXAorCWZmbHVzaCggc3Rkb3V0ICk7CisjZWxzZQorI2RlZmluZSBkZXByaW50ZiggZm10LCBhcmdzLi4uICkKKyNlbmRpZgorCitzdHJ1Y3Qgc2NhbGVfcGFybXNfdCBwYXJtcyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKKworLyogQSBtYXhpbXVtIG9mIDggbGluZXMgWSwgdGhlcmVmb3JlIDQgbGluZXMgViwgNCBsaW5lcyBVIGFyZSBzdG9yZWQKKyAqIHRoZXJlIG1pZ2h0IGJlIHRoZSBuZWVkIHRvIHJldHJpZXZlIG1pc2FsaWduZWQgZGF0YSwgYWRqdXN0CisgKiBpbmNvbWluZyB2IGFuZCB1IHBsYW5lIHRvIGJlIGFibGUgdG8gaGFuZGxlIHRoaXMgKGFkZCAxMjgpCisgKi8KK3Vuc2lnbmVkIGNoYXIgeV9wbGFuZVsyXVsoTUFYX0hEVFZfV0lEVEgrMTI4KSo0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKK3Vuc2lnbmVkIGNoYXIgdl9wbGFuZVsyXVsoTUFYX0hEVFZfV0lEVEgrMTI4KSoyXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKK3Vuc2lnbmVkIGNoYXIgdV9wbGFuZVsyXVsoTUFYX0hEVFZfV0lEVEgrMTI4KSoyXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKKworLyogdGVtcC1idWZmZXIgZm9yIHNjYWxpbmc6IDQgbGluZXMgWSwgdGhlcmVmb3JlIDIgbGluZXMgViwgMiBsaW5lcyBVICovCit1bnNpZ25lZCBjaGFyIHNjYWxlZF95X3BsYW5lWzJdW01BWF9IRFRWX1dJRFRIKjJdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTI4KSkpOwordW5zaWduZWQgY2hhciBzY2FsZWRfdl9wbGFuZVsyXVtNQVhfSERUVl9XSURUSC8yXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKK3Vuc2lnbmVkIGNoYXIgc2NhbGVkX3VfcGxhbmVbMl1bTUFYX0hEVFZfV0lEVEgvMl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxMjgpKSk7CisKKy8qIHNvbWUgdmVjdG9ycyBuZWVkZWQgYnkgdGhlIGZsb2F0IHRvIGludCBjb252ZXJzaW9uICovCitzdGF0aWMgY29uc3QgdmVjdG9yIGZsb2F0IHZlY18yNTUgPSB7IDI1NS4wZiwgMjU1LjBmLCAyNTUuMGYsIDI1NS4wZiB9Oworc3RhdGljIGNvbnN0IHZlY3RvciBmbG9hdCB2ZWNfMF8xID0geyAwLjFmLCAwLjFmLCAwLjFmLCAwLjFmIH07CisKK3ZvaWQgYmlsaW5lYXJfc2NhbGVfbGluZV93OCh1bnNpZ25lZCBjaGFyKiBzcmMsIHVuc2lnbmVkIGNoYXIqIGRzdF8sIHVuc2lnbmVkIGludCBkc3Rfd2lkdGgsIHZlY3RvciBmbG9hdCB2Zl94X3NjYWxlLCB2ZWN0b3IgZmxvYXQgdmZfTlN3ZWlnaHQsIHVuc2lnbmVkIGludCBzcmNfbGluZXN0cmlkZSk7Cit2b2lkIGJpbGluZWFyX3NjYWxlX2xpbmVfdzE2KHVuc2lnbmVkIGNoYXIqIHNyYywgdW5zaWduZWQgY2hhciogZHN0XywgdW5zaWduZWQgaW50IGRzdF93aWR0aCwgdmVjdG9yIGZsb2F0IHZmX3hfc2NhbGUsIHZlY3RvciBmbG9hdCB2Zl9OU3dlaWdodCwgdW5zaWduZWQgaW50IHNyY19saW5lc3RyaWRlKTsKKwordm9pZCBzY2FsZV9zcmN3MTZfZHN0dzE2KCk7Cit2b2lkIHNjYWxlX3NyY3cxNl9kc3R3MzIoKTsKK3ZvaWQgc2NhbGVfc3JjdzMyX2RzdHcxNigpOwordm9pZCBzY2FsZV9zcmN3MzJfZHN0dzMyKCk7CisKK2ludCBtYWluKCB1bnNpZ25lZCBsb25nIGxvbmcgc3BlX2lkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCB1bnNpZ25lZCBsb25nIGxvbmcgYXJncCApCit7CisJZGVwcmludGYoIltTUFVdIGJpbGluX3NjYWxlcl9zcHUgaXMgdXAuLi4gKG9uIFNQRSAjJWxsdSlcbiIsIHNwZV9pZCk7CisJLyogRE1BIHRyYW5zZmVyIGZvciB0aGUgaW5wdXQgcGFyYW1ldGVycyAqLworCXNwdV9tZmNkbWEzMigmcGFybXMsICh1bnNpZ25lZCBpbnQpYXJncCwgc2l6ZW9mKHN0cnVjdCBzY2FsZV9wYXJtc190KSwgVEFHX0lOSVQsIE1GQ19HRVRfQ01EKTsKKwlETUFfV0FJVF9UQUcoVEFHX0lOSVQpOworCisJZGVwcmludGYoIltTUFVdIFNjYWxlICV1eCV1IHRvICV1eCV1XG4iLCBwYXJtcy5zcmNfcGl4ZWxfd2lkdGgsIHBhcm1zLnNyY19waXhlbF9oZWlnaHQsCisJCQlwYXJtcy5kc3RfcGl4ZWxfd2lkdGgsIHBhcm1zLmRzdF9waXhlbF9oZWlnaHQpOworCisJaWYocGFybXMuc3JjX3BpeGVsX3dpZHRoICYgMHgxZikgeworCQlpZihwYXJtcy5kc3RfcGl4ZWxfd2lkdGggJiAweDFGKSB7CisJCQlkZXByaW50ZigiW1NQVV0gVXNpbmcgc2NhbGVfc3JjdzE2X2RzdHcxNlxuIik7CisJCQlzY2FsZV9zcmN3MTZfZHN0dzE2KCk7CisJCX0gZWxzZSB7CisJCQlkZXByaW50ZigiW1NQVV0gVXNpbmcgc2NhbGVfc3JjdzE2X2RzdHczMlxuIik7CisJCQlzY2FsZV9zcmN3MTZfZHN0dzMyKCk7CisJCX0KKwl9IGVsc2UgeworCQlpZihwYXJtcy5kc3RfcGl4ZWxfd2lkdGggJiAweDFGKSB7CisJCQlkZXByaW50ZigiW1NQVV0gVXNpbmcgc2NhbGVfc3JjdzMyX2RzdHcxNlxuIik7CisJCQlzY2FsZV9zcmN3MzJfZHN0dzE2KCk7CisJCX0gZWxzZSB7CisJCQlkZXByaW50ZigiW1NQVV0gVXNpbmcgc2NhbGVfc3JjdzMyX2RzdHczMlxuIik7CisJCQlzY2FsZV9zcmN3MzJfZHN0dzMyKCk7CisJCX0KKwl9CisJZGVwcmludGYoIltTUFVdIGJpbGluX3NjYWxlcl9zcHUuLi4gZG9uZSFcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHZmbG9hdF90b192dWludCgpCisgKgorICogY29udmVydHMgYSBmbG9hdCB2ZWN0b3IgdG8gYW4gdW5zaW5nZWQgaW50IHZlY3RvciB1c2luZyBzYXR1cmF0ZWQKKyAqIGFyaXRobWV0aWMKKyAqCisgKiBAcGFyYW0gdmVjX3MgZmxvYXQgdmVjdG9yIGZvciBjb252ZXJzaW9uCisgKiBAcmV0dXJucyBjb252ZXJ0ZWQgdW5zaWduZWQgaW50IHZlY3RvcgorICovCitpbmxpbmUgc3RhdGljIHZlY3RvciB1bnNpZ25lZCBpbnQgdmZsb2F0X3RvX3Z1aW50KHZlY3RvciBmbG9hdCB2ZWNfcykgeworCXZlY3RvciB1bnNpZ25lZCBpbnQgc2VsZWN0XzEgPSBzcHVfY21wZ3QodmVjXzBfMSwgdmVjX3MpOworCXZlY19zID0gc3B1X3NlbCh2ZWNfcywgdmVjXzBfMSwgc2VsZWN0XzEpOworCisJdmVjdG9yIHVuc2lnbmVkIGludCBzZWxlY3RfMiA9IHNwdV9jbXBndCh2ZWNfcywgdmVjXzI1NSk7CisJdmVjX3MgPSBzcHVfc2VsKHZlY19zLCB2ZWNfMjU1LCBzZWxlY3RfMik7CisJcmV0dXJuIHNwdV9jb252dHUodmVjX3MsMCk7Cit9CisKKworLyoKKyAqIHNjYWxlX3NyY3cxNl9kc3R3MTYoKQorICoKKyAqIHByb2Nlc3NlcyBhbiBpbnB1dCBpbWFnZSBvZiB3aWR0aCAxNgorICogc2NhbGluZyBpcyBkb25lIHRvIGEgd2lkdGggMTYKKyAqIHJlc3VsdCBzdG9yZWQgaW4gUkFNCisgKi8KK3ZvaWQgc2NhbGVfc3JjdzE2X2RzdHcxNigpIHsKKwkvLyBleHRyYWN0IHBhcmFtZXRlcnMKKwl1bnNpZ25lZCBjaGFyKiBkc3RfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopcGFybXMuZHN0QnVmZmVyOworCisJdW5zaWduZWQgaW50IHNyY193aWR0aCA9IHBhcm1zLnNyY19waXhlbF93aWR0aDsKKwl1bnNpZ25lZCBpbnQgc3JjX2hlaWdodCA9IHBhcm1zLnNyY19waXhlbF9oZWlnaHQ7CisJdW5zaWduZWQgaW50IGRzdF93aWR0aCA9IHBhcm1zLmRzdF9waXhlbF93aWR0aDsKKwl1bnNpZ25lZCBpbnQgZHN0X2hlaWdodCA9IHBhcm1zLmRzdF9waXhlbF9oZWlnaHQ7CisKKwkvLyBZVlUKKwl1bnNpZ25lZCBpbnQgc3JjX2xpbmVzdHJpZGVfeSA9IHNyY193aWR0aDsKKwl1bnNpZ25lZCBpbnQgc3JjX2RibF9saW5lc3RyaWRlX3kgPSBzcmNfd2lkdGg8PDE7CisJdW5zaWduZWQgaW50IHNyY19saW5lc3RyaWRlX3Z1ID0gc3JjX3dpZHRoPj4xOworCXVuc2lnbmVkIGludCBzcmNfZGJsX2xpbmVzdHJpZGVfdnUgPSBzcmNfd2lkdGg7CisKKwkvLyBzY2FsZWQgWVZVCisJdW5zaWduZWQgaW50IHNjYWxlZF9zcmNfbGluZXN0cmlkZV95ID0gZHN0X3dpZHRoOworCisJLy8gcmFtIGFkZHJlc3NlcworCXVuc2lnbmVkIGNoYXIqIHNyY19hZGRyX3kgPSBwYXJtcy55X3BsYW5lOworCXVuc2lnbmVkIGNoYXIqIHNyY19hZGRyX3YgPSBwYXJtcy52X3BsYW5lOworCXVuc2lnbmVkIGNoYXIqIHNyY19hZGRyX3UgPSBwYXJtcy51X3BsYW5lOworCisJLy8gZm9yIGhhbmRsaW5nIG1pc2FsaWdubWVudCwgYWRkcmVzc2VzIGFyZSBwcmVjYWxjdWxhdGVkCisJdW5zaWduZWQgY2hhciogcHJlY2FsY19zcmNfYWRkcl92ID0gc3JjX2FkZHJfdjsKKwl1bnNpZ25lZCBjaGFyKiBwcmVjYWxjX3NyY19hZGRyX3UgPSBzcmNfYWRkcl91OworCisJdW5zaWduZWQgaW50IGRzdF9waWN0dXJlX3NpemUgPSBkc3Rfd2lkdGgqZHN0X2hlaWdodDsKKworCS8vIFNpemVzIGZvciBkZXN0aW5hdGlvbgorCXVuc2lnbmVkIGludCBkc3RfZGJsX2xpbmVzdHJpZGVfeSA9IGRzdF93aWR0aDw8MTsKKwl1bnNpZ25lZCBpbnQgZHN0X2RibF9saW5lc3RyaWRlX3Z1ID0gZHN0X3dpZHRoPj4xOworCisJLy8gUGVyZm9ybSBhZGRyZXNzIGNhbGN1bGF0aW9uIGZvciBZLCBWIGFuZCBVIGluIG1haW4gbWVtb3J5IHdpdGggZHN0X2FkZHIgYXMgYmFzZQorCXVuc2lnbmVkIGNoYXIqIGRzdF9hZGRyX21haW5fbWVtb3J5X3kgPSBkc3RfYWRkcjsKKwl1bnNpZ25lZCBjaGFyKiBkc3RfYWRkcl9tYWluX21lbW9yeV92ID0gZHN0X2FkZHIgKyBkc3RfcGljdHVyZV9zaXplOworCXVuc2lnbmVkIGNoYXIqIGRzdF9hZGRyX21haW5fbWVtb3J5X3UgPSBkc3RfYWRkcl9tYWluX21lbW9yeV92ICsoZHN0X3BpY3R1cmVfc2l6ZT4+Mik7CisKKwkvLyBjYWxjdWxhdGUgc2NhbGUgZmFjdG9ycworCXZlY3RvciBmbG9hdCB2Zl94X3NjYWxlID0gc3B1X3NwbGF0cyggKGZsb2F0KXNyY193aWR0aC8oZmxvYXQpZHN0X3dpZHRoICk7CisJZmxvYXQgeV9zY2FsZSA9IChmbG9hdClzcmNfaGVpZ2h0LyhmbG9hdClkc3RfaGVpZ2h0OworCisJLy8gZG91YmxlIGJ1ZmZlcmVkIHByb2Nlc3NpbmcKKwkvLyBidWZmZXIgc3dpdGNoaW5nCisJdW5zaWduZWQgaW50IGN1cnJfc3JjX2lkeCA9IDA7CisJdW5zaWduZWQgaW50IGN1cnJfZHN0X2lkeCA9IDA7CisJdW5zaWduZWQgaW50IG5leHRfc3JjX2lkeCwgbmV4dF9kc3RfaWR4OworCisJLy8gMiBsaW5lcyB5IGFzIG91dHB1dCwgdXBwZXIgYW5kIGxvd2VybGluZQorCXVuc2lnbmVkIGludCBjdXJyX2ludGVycGxfeV91cHBlciA9IDA7CisJdW5zaWduZWQgaW50IG5leHRfaW50ZXJwbF95X3VwcGVyOworCXVuc2lnbmVkIGludCBjdXJyX2ludGVycGxfeV9sb3dlciwgbmV4dF9pbnRlcnBsX3lfbG93ZXI7CisJLy8gb25seSAxIGxpbmUgdi91IG91dHB1dCwgYm90aCBwbGFuZXMgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24KKwl1bnNpZ25lZCBpbnQgY3Vycl9pbnRlcnBsX3Z1ID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9pbnRlcnBsX3Z1OworCisJLy8gd2VpZ2h0cywgY2FsY3VsYXRlZCBpbiBldmVyeSBsb29wIGl0ZXJhdGlvbgorCXZlY3RvciBmbG9hdCB2Zl9jdXJyX05Td2VpZ2h0X3lfdXBwZXIgPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYgfTsKKwl2ZWN0b3IgZmxvYXQgdmZfbmV4dF9OU3dlaWdodF95X3VwcGVyOworCXZlY3RvciBmbG9hdCB2Zl9jdXJyX05Td2VpZ2h0X3lfbG93ZXIsIHZmX25leHRfTlN3ZWlnaHRfeV9sb3dlcjsKKwl2ZWN0b3IgZmxvYXQgdmZfY3Vycl9OU3dlaWdodF92dSA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiB9OworCXZlY3RvciBmbG9hdCB2Zl9uZXh0X05Td2VpZ2h0X3Z1OworCisJLy8gbGluZSBpbmRpY2VzIGZvciB0aGUgc3JjIHBpY3R1cmUKKwlmbG9hdCBjdXJyX3NyY195X3VwcGVyID0gMC4wZiwgbmV4dF9zcmNfeV91cHBlcjsKKwlmbG9hdCBjdXJyX3NyY195X2xvd2VyLCBuZXh0X3NyY195X2xvd2VyOworCWZsb2F0IGN1cnJfc3JjX3Z1ID0gMC4wZiwgbmV4dF9zcmNfdnU7CisKKwkvLyBsaW5lIGluZGljZXMgZm9yIHRoZSBkc3QgcGljdHVyZQorCXVuc2lnbmVkIGludCBkc3RfeT0wLCBkc3RfdnU9MDsKKworCS8vIG9mZnNldCBmb3IgdGhlIHYgYW5kIHUgcGxhbmUgdG8gaGFuZGxlIG1pc2FsaWduZW1lbnQKKwl1bnNpZ25lZCBpbnQgY3Vycl9sc29mZl92ID0gMCwgbmV4dF9sc29mZl92OworCXVuc2lnbmVkIGludCBjdXJyX2xzb2ZmX3UgPSAwLCBuZXh0X2xzb2ZmX3U7CisKKwkvLyBjYWxjdWxhdGUgbG93ZXIgbGluZSBpbmRpY2VzCisJY3Vycl9zcmNfeV9sb3dlciA9ICgoZmxvYXQpY3Vycl9pbnRlcnBsX3lfdXBwZXIrMSkqeV9zY2FsZTsKKwljdXJyX2ludGVycGxfeV9sb3dlciA9ICh1bnNpZ25lZCBpbnQpY3Vycl9zcmNfeV9sb3dlcjsKKwkvLyBsb3dlciBsaW5lIHdlaWdodAorCXZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciA9IHNwdV9zcGxhdHMoIGN1cnJfc3JjX3lfbG93ZXItKGZsb2F0KWN1cnJfaW50ZXJwbF95X2xvd2VyICk7CisKKworCS8vIHN0YXJ0IHBhcnRpYWxseSBkb3VibGUgYnVmZmVyZWQgcHJvY2Vzc2luZworCS8vIGdldCBpbml0aWFsIGRhdGEsIDIgc2V0cyBvZiB5LCAxIHNldCB2LCAxIHNldCB1CisJbWZjX2dldCggeV9wbGFuZVtjdXJyX3NyY19pZHhdLCAodW5zaWduZWQgaW50KSBzcmNfYWRkcl95LCBzcmNfZGJsX2xpbmVzdHJpZGVfeSwgUkVUUl9CVUYsIDAsIDAgKTsKKwltZmNfZ2V0KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0rc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQkodW5zaWduZWQgaW50KSBzcmNfYWRkcl95KyhjdXJyX2ludGVycGxfeV9sb3dlcipzcmNfbGluZXN0cmlkZV95KSwKKwkJCXNyY19kYmxfbGluZXN0cmlkZV95LAorCQkJUkVUUl9CVUYsCisJCQkwLCAwICk7CisJbWZjX2dldCggdl9wbGFuZVtjdXJyX3NyY19pZHhdLCAodW5zaWduZWQgaW50KSBzcmNfYWRkcl92LCBzcmNfZGJsX2xpbmVzdHJpZGVfdnUsIFJFVFJfQlVGLCAwLCAwICk7CisJbWZjX2dldCggdV9wbGFuZVtjdXJyX3NyY19pZHhdLCAodW5zaWduZWQgaW50KSBzcmNfYWRkcl91LCBzcmNfZGJsX2xpbmVzdHJpZGVfdnUsIFJFVFJfQlVGLCAwLCAwICk7CisKKwkvKiBpdGVyYXRpb24gbG9vcAorCSAqIHdpdGhpbiBlYWNoIGl0ZXJhdGlvbiA0IGxpbmVzIHksIDIgbGluZXMgdiwgMiBsaW5lcyB1IGFyZSByZXRyaWV2ZWQKKwkgKiB0aGUgc2NhbGVkIG91dHB1dCBpcyAyIGxpbmVzIHksIDEgbGluZSB2LCAxIGxpbmUgdQorCSAqIHRoZSB5dXYycmdiLWNvbnZlcnRlZCBvdXRwdXQgaXMgc3RvcmVkIHRvIFJBTQorCSAqLworCWZvciggZHN0X3Z1PTA7IGRzdF92dTwoZHN0X2hlaWdodD4+MSktMTsgZHN0X3Z1KysgKSB7CisJCWRzdF95ID0gZHN0X3Z1PDwxOworCisJCS8vIGNhbGN1bGF0ZSBuZXh0IGluZGljZXMKKwkJbmV4dF9zcmNfdnUgPSAoKGZsb2F0KWRzdF92dSsxKSp5X3NjYWxlOworCQluZXh0X3NyY195X3VwcGVyID0gKChmbG9hdClkc3RfeSsyKSp5X3NjYWxlOworCQluZXh0X3NyY195X2xvd2VyID0gKChmbG9hdClkc3RfeSszKSp5X3NjYWxlOworCisJCW5leHRfaW50ZXJwbF92dSA9ICh1bnNpZ25lZCBpbnQpIG5leHRfc3JjX3Z1OworCQluZXh0X2ludGVycGxfeV91cHBlciA9ICh1bnNpZ25lZCBpbnQpIG5leHRfc3JjX3lfdXBwZXI7CisJCW5leHRfaW50ZXJwbF95X2xvd2VyID0gKHVuc2lnbmVkIGludCkgbmV4dF9zcmNfeV9sb3dlcjsKKworCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IE5PUlRILVNPVVRICisJCXZmX25leHRfTlN3ZWlnaHRfdnUgPSBzcHVfc3BsYXRzKCBuZXh0X3NyY192dS0oZmxvYXQpbmV4dF9pbnRlcnBsX3Z1ICk7CisJCXZmX25leHRfTlN3ZWlnaHRfeV91cHBlciA9IHNwdV9zcGxhdHMoIG5leHRfc3JjX3lfdXBwZXItKGZsb2F0KW5leHRfaW50ZXJwbF95X3VwcGVyICk7CisJCXZmX25leHRfTlN3ZWlnaHRfeV9sb3dlciA9IHNwdV9zcGxhdHMoIG5leHRfc3JjX3lfbG93ZXItKGZsb2F0KW5leHRfaW50ZXJwbF95X2xvd2VyICk7CisKKwkJLy8gZ2V0IG5leHQgbGluZXMKKwkJbmV4dF9zcmNfaWR4ID0gY3Vycl9zcmNfaWR4XjE7CisJCW5leHRfZHN0X2lkeCA9IGN1cnJfZHN0X2lkeF4xOworCisJCS8vIDQgbGluZXMgeQorCQltZmNfZ2V0KCB5X3BsYW5lW25leHRfc3JjX2lkeF0sCisJCQkJKHVuc2lnbmVkIGludCkgc3JjX2FkZHJfeSsobmV4dF9pbnRlcnBsX3lfdXBwZXIqc3JjX2xpbmVzdHJpZGVfeSksCisJCQkJc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQkJUkVUUl9CVUYrbmV4dF9zcmNfaWR4LAorCQkJCTAsIDAgKTsKKwkJbWZjX2dldCggeV9wbGFuZVtuZXh0X3NyY19pZHhdK3NyY19kYmxfbGluZXN0cmlkZV95LAorCQkJCSh1bnNpZ25lZCBpbnQpIHNyY19hZGRyX3krKG5leHRfaW50ZXJwbF95X2xvd2VyKnNyY19saW5lc3RyaWRlX3kpLAorCQkJCXNyY19kYmxfbGluZXN0cmlkZV95LAorCQkJCVJFVFJfQlVGK25leHRfc3JjX2lkeCwKKwkJCQkwLCAwICk7CisKKwkJLy8gMiBsaW5lcyB2CisJCXByZWNhbGNfc3JjX2FkZHJfdiA9IHNyY19hZGRyX3YrKG5leHRfaW50ZXJwbF92dSpzcmNfbGluZXN0cmlkZV92dSk7CisJCW5leHRfbHNvZmZfdiA9ICgodW5zaWduZWQgaW50KXByZWNhbGNfc3JjX2FkZHJfdikmMHgwRjsKKwkJbWZjX2dldCggdl9wbGFuZVtuZXh0X3NyY19pZHhdLAorCQkJCSgodW5zaWduZWQgaW50KSBwcmVjYWxjX3NyY19hZGRyX3YpJjB4RkZGRkZGRjAsCisJCQkJc3JjX2RibF9saW5lc3RyaWRlX3Z1KyhuZXh0X2xzb2ZmX3Y8PDEpLAorCQkJCVJFVFJfQlVGK25leHRfc3JjX2lkeCwKKwkJCQkwLCAwICk7CisJCS8vIDIgbGluZXMgdQorCQlwcmVjYWxjX3NyY19hZGRyX3UgPSBzcmNfYWRkcl91KyhuZXh0X2ludGVycGxfdnUqc3JjX2xpbmVzdHJpZGVfdnUpOworCQluZXh0X2xzb2ZmX3UgPSAoKHVuc2lnbmVkIGludClwcmVjYWxjX3NyY19hZGRyX3UpJjB4MEY7CisJCW1mY19nZXQoIHVfcGxhbmVbbmV4dF9zcmNfaWR4XSwKKwkJCQkoKHVuc2lnbmVkIGludCkgcHJlY2FsY19zcmNfYWRkcl91KSYweEZGRkZGRkYwLAorCQkJCXNyY19kYmxfbGluZXN0cmlkZV92dSsobmV4dF9sc29mZl92PDwxKSwKKwkJCQlSRVRSX0JVRituZXh0X3NyY19pZHgsCisJCQkJMCwgMCApOworCisJCURNQV9XQUlUX1RBRyggKFJFVFJfQlVGK2N1cnJfc3JjX2lkeCkgKTsKKworCQkvLyBzY2FsaW5nCisJCS8vIHdvcmsgbGluZSB5X3VwcGVyCisJCWJpbGluZWFyX3NjYWxlX2xpbmVfdzE2KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQkJc2NhbGVkX3lfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCQlkc3Rfd2lkdGgsCisJCQkJdmZfeF9zY2FsZSwKKwkJCQl2Zl9jdXJyX05Td2VpZ2h0X3lfdXBwZXIsCisJCQkJc3JjX2xpbmVzdHJpZGVfeSApOworCQkvLyB3b3JrIGxpbmUgeV9sb3dlcgorCQliaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggeV9wbGFuZVtjdXJyX3NyY19pZHhdK3NyY19kYmxfbGluZXN0cmlkZV95LAorCQkJCXNjYWxlZF95X3BsYW5lW2N1cnJfc3JjX2lkeF0rc2NhbGVkX3NyY19saW5lc3RyaWRlX3ksCisJCQkJZHN0X3dpZHRoLAorCQkJCXZmX3hfc2NhbGUsCisJCQkJdmZfY3Vycl9OU3dlaWdodF95X2xvd2VyLAorCQkJCXNyY19saW5lc3RyaWRlX3kgKTsKKwkJLy8gd29yayBsaW5lIHYKKwkJYmlsaW5lYXJfc2NhbGVfbGluZV93OCggdl9wbGFuZVtjdXJyX3NyY19pZHhdK2N1cnJfbHNvZmZfdiwKKwkJCQlzY2FsZWRfdl9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJCWRzdF93aWR0aD4+MSwKKwkJCQl2Zl94X3NjYWxlLAorCQkJCXZmX2N1cnJfTlN3ZWlnaHRfdnUsCisJCQkJc3JjX2xpbmVzdHJpZGVfdnUgKTsKKwkJLy8gd29yayBsaW5lIHUKKwkJYmlsaW5lYXJfc2NhbGVfbGluZV93OCggdV9wbGFuZVtjdXJyX3NyY19pZHhdK2N1cnJfbHNvZmZfdSwKKwkJCQlzY2FsZWRfdV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJCWRzdF93aWR0aD4+MSwKKwkJCQl2Zl94X3NjYWxlLAorCQkJCXZmX2N1cnJfTlN3ZWlnaHRfdnUsCisJCQkJc3JjX2xpbmVzdHJpZGVfdnUgKTsKKworCisJCS8vIFN0b3JlIHRoZSByZXN1bHQgYmFjayB0byBtYWluIG1lbW9yeSBpbnRvIGEgZGVzdGluYXRpb24gYnVmZmVyIGluIFlVViBmb3JtYXQKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJRE1BX1dBSVRfVEFHKCAoU1RSX0JVRitjdXJyX2RzdF9pZHgpICk7CisKKwkJLy8gUGVyZm9ybSB0aHJlZSBETUEgdHJhbnNmZXJzIHRvIDMgZGlmZmVyZW50IGxvY2F0aW9ucyBpbiB0aGUgbWFpbiBtZW1vcnkhCisJCS8vIGRzdF93aWR0aDoJUGl4ZWwgd2lkdGggb2YgZGVzdGluYXRpb24gaW1hZ2UKKwkJLy8gZHN0X2FkZHI6CURlc3RpbmF0aW9uIGFkZHJlc3MgaW4gbWFpbiBtZW1vcnkKKwkJLy8gZHN0X3Z1OglDb3VudGVyIHdoaWNoIGlzIGluY3JlbWVudGVkIG9uZSBieSBvbmUKKwkJLy8gZHN0X3k6CUNvdW50ZXIgd2hpY2ggaXMgdHdpY2UgbGFyZ2VyIHRoYW4gZHN0X3Z1IChkc3RfeSA9IDIqZHN0X3Z1KQorCQltZmNfcHV0KAlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdLAkJCQkJLy8gV2hhdCBmcm9tIGxvY2FsIHN0b3JlIChhZGRyKQorCQkJCSh1bnNpZ25lZCBpbnQpZHN0X2FkZHJfbWFpbl9tZW1vcnlfeSArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3kpLAkvLyBEZXN0aW5hdGlvbiBpbiBtYWluIG1lbW9yeSAoYWRkcikKKwkJCQlkc3RfZGJsX2xpbmVzdHJpZGVfeSwJCQkJCQkvLyBUd28gWSBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkvLyBUYWcKKwkJCQkwLCAwICk7CisKKwkJbWZjX3B1dCgJc2NhbGVkX3ZfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCS8vIFdoYXQgZnJvbSBsb2NhbCBzdG9yZSAoYWRkcikKKwkJCQkodW5zaWduZWQgaW50KWRzdF9hZGRyX21haW5fbWVtb3J5X3YgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV92dSksCS8vIERlc3RpbmF0aW9uIGluIG1haW4gbWVtb3J5IChhZGRyKQorCQkJCWRzdF9kYmxfbGluZXN0cmlkZV92dSwJCQkJCQkvLyBUd28gViBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkvLyBUYWcKKwkJCQkwLCAwICk7CisKKwkJbWZjX3B1dCgJc2NhbGVkX3VfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCS8vIFdoYXQgZnJvbSBsb2NhbCBzdG9yZSAoYWRkcikKKwkJCQkodW5zaWduZWQgaW50KWRzdF9hZGRyX21haW5fbWVtb3J5X3UgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV92dSksCS8vIERlc3RpbmF0aW9uIGluIG1haW4gbWVtb3J5IChhZGRyKQorCQkJCWRzdF9kYmxfbGluZXN0cmlkZV92dSwJCQkJCQkvLyBUd28gVSBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkvLyBUYWcKKwkJCQkwLCAwICk7CisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCQkvLyB1cGRhdGUgZm9yIG5leHQgY3ljbGUKKwkJY3Vycl9zcmNfaWR4ID0gbmV4dF9zcmNfaWR4OworCQljdXJyX2RzdF9pZHggPSBuZXh0X2RzdF9pZHg7CisKKwkJY3Vycl9pbnRlcnBsX3lfdXBwZXIgPSBuZXh0X2ludGVycGxfeV91cHBlcjsKKwkJY3Vycl9pbnRlcnBsX3lfbG93ZXIgPSBuZXh0X2ludGVycGxfeV9sb3dlcjsKKwkJY3Vycl9pbnRlcnBsX3Z1ID0gbmV4dF9pbnRlcnBsX3Z1OworCisJCXZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlciA9IHZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlcjsKKwkJdmZfY3Vycl9OU3dlaWdodF95X2xvd2VyID0gdmZfY3Vycl9OU3dlaWdodF95X2xvd2VyOworCQl2Zl9jdXJyX05Td2VpZ2h0X3Z1ID0gdmZfbmV4dF9OU3dlaWdodF92dTsKKworCQljdXJyX3NyY195X3VwcGVyID0gbmV4dF9zcmNfeV91cHBlcjsKKwkJY3Vycl9zcmNfeV9sb3dlciA9IG5leHRfc3JjX3lfbG93ZXI7CisJCWN1cnJfc3JjX3Z1ID0gbmV4dF9zcmNfdnU7CisKKwkJY3Vycl9sc29mZl92ID0gbmV4dF9sc29mZl92OworCQljdXJyX2xzb2ZmX3UgPSBuZXh0X2xzb2ZmX3U7CisJfQorCisKKworCURNQV9XQUlUX1RBRyggKFJFVFJfQlVGK2N1cnJfc3JjX2lkeCkgKTsKKworCS8vIHNjYWxpbmcKKwkvLyB3b3JrIGxpbmUgeV91cHBlcgorCWJpbGluZWFyX3NjYWxlX2xpbmVfdzE2KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJZHN0X3dpZHRoLAorCQkJdmZfeF9zY2FsZSwKKwkJCXZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlciwKKwkJCXNyY19saW5lc3RyaWRlX3kgKTsKKwkvLyB3b3JrIGxpbmUgeV9sb3dlcgorCWJpbGluZWFyX3NjYWxlX2xpbmVfdzE2KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0rc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdK3NjYWxlZF9zcmNfbGluZXN0cmlkZV95LAorCQkJZHN0X3dpZHRoLAorCQkJdmZfeF9zY2FsZSwKKwkJCXZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciwKKwkJCXNyY19saW5lc3RyaWRlX3kgKTsKKwkvLyB3b3JrIGxpbmUgdgorCWJpbGluZWFyX3NjYWxlX2xpbmVfdzgoIHZfcGxhbmVbY3Vycl9zcmNfaWR4XStjdXJyX2xzb2ZmX3YsCisJCQlzY2FsZWRfdl9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJZHN0X3dpZHRoPj4xLAorCQkJdmZfeF9zY2FsZSwKKwkJCXZmX2N1cnJfTlN3ZWlnaHRfdnUsCisJCQlzcmNfbGluZXN0cmlkZV92dSApOworCS8vIHdvcmsgbGluZSB1CisJYmlsaW5lYXJfc2NhbGVfbGluZV93OCggdV9wbGFuZVtjdXJyX3NyY19pZHhdK2N1cnJfbHNvZmZfdSwKKwkJCXNjYWxlZF91X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQlkc3Rfd2lkdGg+PjEsCisJCQl2Zl94X3NjYWxlLAorCQkJdmZfY3Vycl9OU3dlaWdodF92dSwKKwkJCXNyY19saW5lc3RyaWRlX3Z1ICk7CisKKworCS8vIFN0b3JlIHRoZSByZXN1bHQgYmFjayB0byBtYWluIG1lbW9yeSBpbnRvIGEgZGVzdGluYXRpb24gYnVmZmVyIGluIFlVViBmb3JtYXQKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCURNQV9XQUlUX1RBRyggKFNUUl9CVUYrY3Vycl9kc3RfaWR4KSApOworCisJLy8gUGVyZm9ybSB0aHJlZSBETUEgdHJhbnNmZXJzIHRvIDMgZGlmZmVyZW50IGxvY2F0aW9ucyBpbiB0aGUgbWFpbiBtZW1vcnkhCisJLy8gZHN0X3dpZHRoOglQaXhlbCB3aWR0aCBvZiBkZXN0aW5hdGlvbiBpbWFnZQorCS8vIGRzdF9hZGRyOglEZXN0aW5hdGlvbiBhZGRyZXNzIGluIG1haW4gbWVtb3J5CisJLy8gZHN0X3Z1OglDb3VudGVyIHdoaWNoIGlzIGluY3JlbWVudGVkIG9uZSBieSBvbmUKKwkvLyBkc3RfeToJQ291bnRlciB3aGljaCBpcyB0d2ljZSBsYXJnZXIgdGhhbiBkc3RfdnUgKGRzdF95ID0gMipkc3RfdnUpCisJbWZjX3B1dCgJc2NhbGVkX3lfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCS8vIFdoYXQgZnJvbSBsb2NhbCBzdG9yZSAoYWRkcikKKwkJCSh1bnNpZ25lZCBpbnQpZHN0X2FkZHJfbWFpbl9tZW1vcnlfeSArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3kpLAkvLyBEZXN0aW5hdGlvbiBpbiBtYWluIG1lbW9yeSAoYWRkcikKKwkJCWRzdF9kYmxfbGluZXN0cmlkZV95LAkJCQkJCS8vIFR3byBZIGxpbmVzIChkZXBlbmRpbmcgb24gdGhlIHdpZGh0IG9mIHRoZSBkZXN0aW5hdGlvbiByZXNvbHV0aW9uKQorCQkJU1RSX0JVRitjdXJyX2RzdF9pZHgsCQkJCQkJLy8gVGFnCisJCQkwLCAwICk7CisKKwltZmNfcHV0KAlzY2FsZWRfdl9wbGFuZVtjdXJyX3NyY19pZHhdLAkJCQkJLy8gV2hhdCBmcm9tIGxvY2FsIHN0b3JlIChhZGRyKQorCQkJKHVuc2lnbmVkIGludClkc3RfYWRkcl9tYWluX21lbW9yeV92ICsgKGRzdF92dSpkc3RfZGJsX2xpbmVzdHJpZGVfdnUpLAkvLyBEZXN0aW5hdGlvbiBpbiBtYWluIG1lbW9yeSAoYWRkcikKKwkJCWRzdF9kYmxfbGluZXN0cmlkZV92dSwJCQkJCQkvLyBUd28gViBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCVNUUl9CVUYrY3Vycl9kc3RfaWR4LAkJCQkJCS8vIFRhZworCQkJMCwgMCApOworCisJbWZjX3B1dCgJc2NhbGVkX3VfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCS8vIFdoYXQgZnJvbSBsb2NhbCBzdG9yZSAoYWRkcikKKwkJCSh1bnNpZ25lZCBpbnQpZHN0X2FkZHJfbWFpbl9tZW1vcnlfdSArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3Z1KSwJLy8gRGVzdGluYXRpb24gaW4gbWFpbiBtZW1vcnkgKGFkZHIpCisJCQlkc3RfZGJsX2xpbmVzdHJpZGVfdnUsCQkJCQkJLy8gVHdvIFUgbGluZXMgKGRlcGVuZGluZyBvbiB0aGUgd2lkaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc29sdXRpb24pCisJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkvLyBUYWcKKwkJCTAsIDAgKTsKKworCS8vIHdhaXQgZm9yIGNvbXBsZXRpb24KKwlETUFfV0FJVF9UQUcoIChTVFJfQlVGK2N1cnJfZHN0X2lkeCkgKTsKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfQorCisKKy8qCisgKiBzY2FsZV9zcmN3MTZfZHN0dzMyKCkKKyAqCisgKiBwcm9jZXNzZXMgYW4gaW5wdXQgaW1hZ2Ugb2Ygd2lkdGggMTYKKyAqIHNjYWxpbmcgaXMgZG9uZSB0byBhIHdpZHRoIDMyCisgKiB5dXYycmdiIGNvbnZlcnNpb24gb24gYSB3aWR0aCBvZiAzMgorICogcmVzdWx0IHN0b3JlZCBpbiBSQU0KKyAqLwordm9pZCBzY2FsZV9zcmN3MTZfZHN0dzMyKCkgeworCS8vIGV4dHJhY3QgcGFyYW1ldGVycworCXVuc2lnbmVkIGNoYXIqIGRzdF9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilwYXJtcy5kc3RCdWZmZXI7CisKKwl1bnNpZ25lZCBpbnQgc3JjX3dpZHRoID0gcGFybXMuc3JjX3BpeGVsX3dpZHRoOworCXVuc2lnbmVkIGludCBzcmNfaGVpZ2h0ID0gcGFybXMuc3JjX3BpeGVsX2hlaWdodDsKKwl1bnNpZ25lZCBpbnQgZHN0X3dpZHRoID0gcGFybXMuZHN0X3BpeGVsX3dpZHRoOworCXVuc2lnbmVkIGludCBkc3RfaGVpZ2h0ID0gcGFybXMuZHN0X3BpeGVsX2hlaWdodDsKKworCS8vIFlWVQorCXVuc2lnbmVkIGludCBzcmNfbGluZXN0cmlkZV95ID0gc3JjX3dpZHRoOworCXVuc2lnbmVkIGludCBzcmNfZGJsX2xpbmVzdHJpZGVfeSA9IHNyY193aWR0aDw8MTsKKwl1bnNpZ25lZCBpbnQgc3JjX2xpbmVzdHJpZGVfdnUgPSBzcmNfd2lkdGg+PjE7CisJdW5zaWduZWQgaW50IHNyY19kYmxfbGluZXN0cmlkZV92dSA9IHNyY193aWR0aDsKKwkvLyBzY2FsZWQgWVZVCisJdW5zaWduZWQgaW50IHNjYWxlZF9zcmNfbGluZXN0cmlkZV95ID0gZHN0X3dpZHRoOworCisJLy8gcmFtIGFkZHJlc3NlcworCXVuc2lnbmVkIGNoYXIqIHNyY19hZGRyX3kgPSBwYXJtcy55X3BsYW5lOworCXVuc2lnbmVkIGNoYXIqIHNyY19hZGRyX3YgPSBwYXJtcy52X3BsYW5lOworCXVuc2lnbmVkIGNoYXIqIHNyY19hZGRyX3UgPSBwYXJtcy51X3BsYW5lOworCisJdW5zaWduZWQgaW50IGRzdF9waWN0dXJlX3NpemUgPSBkc3Rfd2lkdGgqZHN0X2hlaWdodDsKKworCS8vIFNpemVzIGZvciBkZXN0aW5hdGlvbgorCXVuc2lnbmVkIGludCBkc3RfZGJsX2xpbmVzdHJpZGVfeSA9IGRzdF93aWR0aDw8MTsKKwl1bnNpZ25lZCBpbnQgZHN0X2RibF9saW5lc3RyaWRlX3Z1ID0gZHN0X3dpZHRoPj4xOworCisJLy8gUGVyZm9ybSBhZGRyZXNzIGNhbGN1bGF0aW9uIGZvciBZLCBWIGFuZCBVIGluIG1haW4gbWVtb3J5IHdpdGggZHN0X2FkZHIgYXMgYmFzZQorCXVuc2lnbmVkIGNoYXIqIGRzdF9hZGRyX21haW5fbWVtb3J5X3kgPSBkc3RfYWRkcjsKKwl1bnNpZ25lZCBjaGFyKiBkc3RfYWRkcl9tYWluX21lbW9yeV92ID0gZHN0X2FkZHIgKyBkc3RfcGljdHVyZV9zaXplOworCXVuc2lnbmVkIGNoYXIqIGRzdF9hZGRyX21haW5fbWVtb3J5X3UgPSBkc3RfYWRkcl9tYWluX21lbW9yeV92ICsoZHN0X3BpY3R1cmVfc2l6ZT4+Mik7CisKKworCS8vIGZvciBoYW5kbGluZyBtaXNhbGlnbm1lbnQsIGFkZHJlc3NlcyBhcmUgcHJlY2FsY3VsYXRlZAorCXVuc2lnbmVkIGNoYXIqIHByZWNhbGNfc3JjX2FkZHJfdiA9IHNyY19hZGRyX3Y7CisJdW5zaWduZWQgY2hhciogcHJlY2FsY19zcmNfYWRkcl91ID0gc3JjX2FkZHJfdTsKKworCS8vIGNhbGN1bGF0ZSBzY2FsZSBmYWN0b3JzCisJdmVjdG9yIGZsb2F0IHZmX3hfc2NhbGUgPSBzcHVfc3BsYXRzKCAoZmxvYXQpc3JjX3dpZHRoLyhmbG9hdClkc3Rfd2lkdGggKTsKKwlmbG9hdCB5X3NjYWxlID0gKGZsb2F0KXNyY19oZWlnaHQvKGZsb2F0KWRzdF9oZWlnaHQ7CisKKwkvLyBkb3VibGUgYnVmZmVyZWQgcHJvY2Vzc2luZworCS8vIGJ1ZmZlciBzd2l0Y2hpbmcKKwl1bnNpZ25lZCBpbnQgY3Vycl9zcmNfaWR4ID0gMDsKKwl1bnNpZ25lZCBpbnQgY3Vycl9kc3RfaWR4ID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9zcmNfaWR4LCBuZXh0X2RzdF9pZHg7CisKKwkvLyAyIGxpbmVzIHkgYXMgb3V0cHV0LCB1cHBlciBhbmQgbG93ZXJsaW5lCisJdW5zaWduZWQgaW50IGN1cnJfaW50ZXJwbF95X3VwcGVyID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9pbnRlcnBsX3lfdXBwZXI7CisJdW5zaWduZWQgaW50IGN1cnJfaW50ZXJwbF95X2xvd2VyLCBuZXh0X2ludGVycGxfeV9sb3dlcjsKKwkvLyBvbmx5IDEgbGluZSB2L3Ugb3V0cHV0LCBib3RoIHBsYW5lcyBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbgorCXVuc2lnbmVkIGludCBjdXJyX2ludGVycGxfdnUgPSAwOworCXVuc2lnbmVkIGludCBuZXh0X2ludGVycGxfdnU7CisKKwkvLyB3ZWlnaHRzLCBjYWxjdWxhdGVkIGluIGV2ZXJ5IGxvb3AgaXRlcmF0aW9uCisJdmVjdG9yIGZsb2F0IHZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlciA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiB9OworCXZlY3RvciBmbG9hdCB2Zl9uZXh0X05Td2VpZ2h0X3lfdXBwZXI7CisJdmVjdG9yIGZsb2F0IHZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciwgdmZfbmV4dF9OU3dlaWdodF95X2xvd2VyOworCXZlY3RvciBmbG9hdCB2Zl9jdXJyX05Td2VpZ2h0X3Z1ID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmIH07CisJdmVjdG9yIGZsb2F0IHZmX25leHRfTlN3ZWlnaHRfdnU7CisKKwkvLyBsaW5lIGluZGljZXMgZm9yIHRoZSBzcmMgcGljdHVyZQorCWZsb2F0IGN1cnJfc3JjX3lfdXBwZXIgPSAwLjBmLCBuZXh0X3NyY195X3VwcGVyOworCWZsb2F0IGN1cnJfc3JjX3lfbG93ZXIsIG5leHRfc3JjX3lfbG93ZXI7CisJZmxvYXQgY3Vycl9zcmNfdnUgPSAwLjBmLCBuZXh0X3NyY192dTsKKworCS8vIGxpbmUgaW5kaWNlcyBmb3IgdGhlIGRzdCBwaWN0dXJlCisJdW5zaWduZWQgaW50IGRzdF95PTAsIGRzdF92dT0wOworCisJLy8gb2Zmc2V0IGZvciB0aGUgdiBhbmQgdSBwbGFuZSB0byBoYW5kbGUgbWlzYWxpZ25lbWVudAorCXVuc2lnbmVkIGludCBjdXJyX2xzb2ZmX3YgPSAwLCBuZXh0X2xzb2ZmX3Y7CisJdW5zaWduZWQgaW50IGN1cnJfbHNvZmZfdSA9IDAsIG5leHRfbHNvZmZfdTsKKworCS8vIGNhbGN1bGF0ZSBsb3dlciBsaW5lIGlkaWNlcworCWN1cnJfc3JjX3lfbG93ZXIgPSAoKGZsb2F0KWN1cnJfaW50ZXJwbF95X3VwcGVyKzEpKnlfc2NhbGU7CisJY3Vycl9pbnRlcnBsX3lfbG93ZXIgPSAodW5zaWduZWQgaW50KWN1cnJfc3JjX3lfbG93ZXI7CisJLy8gbG93ZXIgbGluZSB3ZWlnaHQKKwl2Zl9jdXJyX05Td2VpZ2h0X3lfbG93ZXIgPSBzcHVfc3BsYXRzKCBjdXJyX3NyY195X2xvd2VyLShmbG9hdCljdXJyX2ludGVycGxfeV9sb3dlciApOworCisKKwkvLyBzdGFydCBwYXJ0aWFsbHkgZG91YmxlIGJ1ZmZlcmVkIHByb2Nlc3NpbmcKKwkvLyBnZXQgaW5pdGlhbCBkYXRhLCAyIHNldHMgb2YgeSwgMSBzZXQgdiwgMSBzZXQgdQorCW1mY19nZXQoIHlfcGxhbmVbY3Vycl9zcmNfaWR4XSwgKHVuc2lnbmVkIGludCkgc3JjX2FkZHJfeSwgc3JjX2RibF9saW5lc3RyaWRlX3ksIFJFVFJfQlVGLCAwLCAwICk7CisJbWZjX2dldCggeV9wbGFuZVtjdXJyX3NyY19pZHhdK3NyY19kYmxfbGluZXN0cmlkZV95LAorCQkJKHVuc2lnbmVkIGludCkgc3JjX2FkZHJfeSsoY3Vycl9pbnRlcnBsX3lfbG93ZXIqc3JjX2xpbmVzdHJpZGVfeSksCisJCQlzcmNfZGJsX2xpbmVzdHJpZGVfeSwKKwkJCVJFVFJfQlVGLAorCQkJMCwgMCApOworCW1mY19nZXQoIHZfcGxhbmVbY3Vycl9zcmNfaWR4XSwgKHVuc2lnbmVkIGludCkgc3JjX2FkZHJfdiwgc3JjX2RibF9saW5lc3RyaWRlX3Z1LCBSRVRSX0JVRiwgMCwgMCApOworCW1mY19nZXQoIHVfcGxhbmVbY3Vycl9zcmNfaWR4XSwgKHVuc2lnbmVkIGludCkgc3JjX2FkZHJfdSwgc3JjX2RibF9saW5lc3RyaWRlX3Z1LCBSRVRSX0JVRiwgMCwgMCApOworCisJLy8gaXRlcmF0aW9uIGxvb3AKKwkvLyB3aXRoaW4gZWFjaCBpdGVyYXRpb24gNCBsaW5lcyB5LCAyIGxpbmVzIHYsIDIgbGluZXMgdSBhcmUgcmV0cmlldmVkCisJLy8gdGhlIHNjYWxlZCBvdXRwdXQgaXMgMiBsaW5lcyB5LCAxIGxpbmUgdiwgMSBsaW5lIHUKKwkvLyB0aGUgeXV2MnJnYi1jb252ZXJ0ZWQgb3V0cHV0IGlzIHN0b3JlZCB0byBSQU0KKwlmb3IoIGRzdF92dT0wOyBkc3RfdnU8KGRzdF9oZWlnaHQ+PjEpLTE7IGRzdF92dSsrICkgeworCQlkc3RfeSA9IGRzdF92dTw8MTsKKworCQkvLyBjYWxjdWxhdGUgbmV4dCBpbmRpY2VzCisJCW5leHRfc3JjX3Z1ID0gKChmbG9hdClkc3RfdnUrMSkqeV9zY2FsZTsKKwkJbmV4dF9zcmNfeV91cHBlciA9ICgoZmxvYXQpZHN0X3krMikqeV9zY2FsZTsKKwkJbmV4dF9zcmNfeV9sb3dlciA9ICgoZmxvYXQpZHN0X3krMykqeV9zY2FsZTsKKworCQluZXh0X2ludGVycGxfdnUgPSAodW5zaWduZWQgaW50KSBuZXh0X3NyY192dTsKKwkJbmV4dF9pbnRlcnBsX3lfdXBwZXIgPSAodW5zaWduZWQgaW50KSBuZXh0X3NyY195X3VwcGVyOworCQluZXh0X2ludGVycGxfeV9sb3dlciA9ICh1bnNpZ25lZCBpbnQpIG5leHRfc3JjX3lfbG93ZXI7CisKKwkJLy8gY2FsY3VsYXRlIHdlaWdodCBOT1JUSC1TT1VUSAorCQl2Zl9uZXh0X05Td2VpZ2h0X3Z1ID0gc3B1X3NwbGF0cyggbmV4dF9zcmNfdnUtKGZsb2F0KW5leHRfaW50ZXJwbF92dSApOworCQl2Zl9uZXh0X05Td2VpZ2h0X3lfdXBwZXIgPSBzcHVfc3BsYXRzKCBuZXh0X3NyY195X3VwcGVyLShmbG9hdCluZXh0X2ludGVycGxfeV91cHBlciApOworCQl2Zl9uZXh0X05Td2VpZ2h0X3lfbG93ZXIgPSBzcHVfc3BsYXRzKCBuZXh0X3NyY195X2xvd2VyLShmbG9hdCluZXh0X2ludGVycGxfeV9sb3dlciApOworCisJCS8vIGdldCBuZXh0IGxpbmVzCisJCW5leHRfc3JjX2lkeCA9IGN1cnJfc3JjX2lkeF4xOworCQluZXh0X2RzdF9pZHggPSBjdXJyX2RzdF9pZHheMTsKKworCQkvLyA0IGxpbmVzIHkKKwkJbWZjX2dldCggeV9wbGFuZVtuZXh0X3NyY19pZHhdLAorCQkJCSh1bnNpZ25lZCBpbnQpIHNyY19hZGRyX3krKG5leHRfaW50ZXJwbF95X3VwcGVyKnNyY19saW5lc3RyaWRlX3kpLAorCQkJCXNyY19kYmxfbGluZXN0cmlkZV95LAorCQkJCVJFVFJfQlVGK25leHRfc3JjX2lkeCwKKwkJCQkwLCAwICk7CisJCW1mY19nZXQoIHlfcGxhbmVbbmV4dF9zcmNfaWR4XStzcmNfZGJsX2xpbmVzdHJpZGVfeSwKKwkJCQkodW5zaWduZWQgaW50KSBzcmNfYWRkcl95KyhuZXh0X2ludGVycGxfeV9sb3dlcipzcmNfbGluZXN0cmlkZV95KSwKKwkJCQlzcmNfZGJsX2xpbmVzdHJpZGVfeSwKKwkJCQlSRVRSX0JVRituZXh0X3NyY19pZHgsCisJCQkJMCwgMCApOworCisJCS8vIDIgbGluZXMgdgorCQlwcmVjYWxjX3NyY19hZGRyX3YgPSBzcmNfYWRkcl92KyhuZXh0X2ludGVycGxfdnUqc3JjX2xpbmVzdHJpZGVfdnUpOworCQluZXh0X2xzb2ZmX3YgPSAoKHVuc2lnbmVkIGludClwcmVjYWxjX3NyY19hZGRyX3YpJjB4MEY7CisJCW1mY19nZXQoIHZfcGxhbmVbbmV4dF9zcmNfaWR4XSwKKwkJCQkoKHVuc2lnbmVkIGludCkgcHJlY2FsY19zcmNfYWRkcl92KSYweEZGRkZGRkYwLAorCQkJCXNyY19kYmxfbGluZXN0cmlkZV92dSsobmV4dF9sc29mZl92PDwxKSwKKwkJCQlSRVRSX0JVRituZXh0X3NyY19pZHgsCisJCQkJMCwgMCApOworCQkvLyAyIGxpbmVzIHUKKwkJcHJlY2FsY19zcmNfYWRkcl91ID0gc3JjX2FkZHJfdSsobmV4dF9pbnRlcnBsX3Z1KnNyY19saW5lc3RyaWRlX3Z1KTsKKwkJbmV4dF9sc29mZl91ID0gKCh1bnNpZ25lZCBpbnQpcHJlY2FsY19zcmNfYWRkcl91KSYweDBGOworCQltZmNfZ2V0KCB1X3BsYW5lW25leHRfc3JjX2lkeF0sCisJCQkJKCh1bnNpZ25lZCBpbnQpIHByZWNhbGNfc3JjX2FkZHJfdSkmMHhGRkZGRkZGMCwKKwkJCQlzcmNfZGJsX2xpbmVzdHJpZGVfdnUrKG5leHRfbHNvZmZfdjw8MSksCisJCQkJUkVUUl9CVUYrbmV4dF9zcmNfaWR4LAorCQkJCTAsIDAgKTsKKworCQlETUFfV0FJVF9UQUcoIChSRVRSX0JVRitjdXJyX3NyY19pZHgpICk7CisKKwkJLy8gc2NhbGluZworCQkvLyB3b3JrIGxpbmUgeV91cHBlcgorCQliaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggeV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJCXNjYWxlZF95X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQkJZHN0X3dpZHRoLAorCQkJCXZmX3hfc2NhbGUsCisJCQkJdmZfY3Vycl9OU3dlaWdodF95X3VwcGVyLAorCQkJCXNyY19saW5lc3RyaWRlX3kgKTsKKwkJLy8gd29yayBsaW5lIHlfbG93ZXIKKwkJYmlsaW5lYXJfc2NhbGVfbGluZV93MTYoIHlfcGxhbmVbY3Vycl9zcmNfaWR4XStzcmNfZGJsX2xpbmVzdHJpZGVfeSwKKwkJCQlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdK3NjYWxlZF9zcmNfbGluZXN0cmlkZV95LAorCQkJCWRzdF93aWR0aCwKKwkJCQl2Zl94X3NjYWxlLAorCQkJCXZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciwKKwkJCQlzcmNfbGluZXN0cmlkZV95ICk7CisJCS8vIHdvcmsgbGluZSB2CisJCWJpbGluZWFyX3NjYWxlX2xpbmVfdzgoIHZfcGxhbmVbY3Vycl9zcmNfaWR4XStjdXJyX2xzb2ZmX3YsCisJCQkJc2NhbGVkX3ZfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCQlkc3Rfd2lkdGg+PjEsCisJCQkJdmZfeF9zY2FsZSwKKwkJCQl2Zl9jdXJyX05Td2VpZ2h0X3Z1LAorCQkJCXNyY19saW5lc3RyaWRlX3Z1ICk7CisJCS8vIHdvcmsgbGluZSB1CisJCWJpbGluZWFyX3NjYWxlX2xpbmVfdzgoIHVfcGxhbmVbY3Vycl9zcmNfaWR4XStjdXJyX2xzb2ZmX3UsCisJCQkJc2NhbGVkX3VfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCQlkc3Rfd2lkdGg+PjEsCisJCQkJdmZfeF9zY2FsZSwKKwkJCQl2Zl9jdXJyX05Td2VpZ2h0X3Z1LAorCQkJCXNyY19saW5lc3RyaWRlX3Z1ICk7CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJRE1BX1dBSVRfVEFHKCAoU1RSX0JVRitjdXJyX2RzdF9pZHgpICk7CisKKwkJLy8gUGVyZm9ybSB0aHJlZSBETUEgdHJhbnNmZXJzIHRvIDMgZGlmZmVyZW50IGxvY2F0aW9ucyBpbiB0aGUgbWFpbiBtZW1vcnkhCisJCS8vIGRzdF93aWR0aDoJUGl4ZWwgd2lkdGggb2YgZGVzdGluYXRpb24gaW1hZ2UKKwkJLy8gZHN0X2FkZHI6CURlc3RpbmF0aW9uIGFkZHJlc3MgaW4gbWFpbiBtZW1vcnkKKwkJLy8gZHN0X3Z1OglDb3VudGVyIHdoaWNoIGlzIGluY3JlbWVudGVkIG9uZSBieSBvbmUKKwkJLy8gZHN0X3k6CUNvdW50ZXIgd2hpY2ggaXMgdHdpY2UgbGFyZ2VyIHRoYW4gZHN0X3Z1IChkc3RfeSA9IDIqZHN0X3Z1KQorCisJCW1mY19wdXQoCXNjYWxlZF95X3BsYW5lW2N1cnJfc3JjX2lkeF0sCQkJCQkJCS8vIFdoYXQgZnJvbSBsb2NhbCBzdG9yZSAoYWRkcikKKwkJCQkodW5zaWduZWQgaW50KSAgZHN0X2FkZHJfbWFpbl9tZW1vcnlfeSArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3kpLAkvLyBEZXN0aW5hdGlvbiBpbiBtYWluIG1lbW9yeSAoYWRkcikKKwkJCQlkc3RfZGJsX2xpbmVzdHJpZGVfeSwJCQkJCQkJCS8vIFR3byBZIGxpbmVzIChkZXBlbmRpbmcgb24gdGhlIHdpZGh0IG9mIHRoZSBkZXN0aW5hdGlvbiByZXNvbHV0aW9uKQorCQkJCVNUUl9CVUYrY3Vycl9kc3RfaWR4LAkJCQkJCQkJLy8gVGFnCisJCQkJMCwgMCApOworCisJCW1mY19wdXQoCXNjYWxlZF92X3BsYW5lW2N1cnJfc3JjX2lkeF0sCQkJCQkJCS8vIFdoYXQgZnJvbSBsb2NhbCBzdG9yZSAoYWRkcikKKwkJCQkodW5zaWduZWQgaW50KSBkc3RfYWRkcl9tYWluX21lbW9yeV92ICsgKGRzdF92dSpkc3RfZGJsX2xpbmVzdHJpZGVfdnUpLAkvLyBEZXN0aW5hdGlvbiBpbiBtYWluIG1lbW9yeSAoYWRkcikKKwkJCQlkc3RfZGJsX2xpbmVzdHJpZGVfdnUsCQkJCQkJCQkvLyBUd28gViBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkJCS8vIFRhZworCQkJCTAsIDAgKTsKKworCQltZmNfcHV0KAlzY2FsZWRfdV9wbGFuZVtjdXJyX3NyY19pZHhdLAkJCQkJCQkvLyBXaGF0IGZyb20gbG9jYWwgc3RvcmUgKGFkZHIpCisJCQkJKHVuc2lnbmVkIGludCkgIGRzdF9hZGRyX21haW5fbWVtb3J5X3UgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV92dSksCS8vIERlc3RpbmF0aW9uIGluIG1haW4gbWVtb3J5IChhZGRyKQorCQkJCWRzdF9kYmxfbGluZXN0cmlkZV92dSwJCQkJCQkJCS8vIFR3byBVIGxpbmVzIChkZXBlbmRpbmcgb24gdGhlIHdpZGh0IG9mIHRoZSBkZXN0aW5hdGlvbiByZXNvbHV0aW9uKQorCQkJCVNUUl9CVUYrY3Vycl9kc3RfaWR4LAkJCQkJCQkJLy8gVGFnCisJCQkJMCwgMCApOworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKwkJLy8gdXBkYXRlIGZvciBuZXh0IGN5Y2xlCisJCWN1cnJfc3JjX2lkeCA9IG5leHRfc3JjX2lkeDsKKwkJY3Vycl9kc3RfaWR4ID0gbmV4dF9kc3RfaWR4OworCisJCWN1cnJfaW50ZXJwbF95X3VwcGVyID0gbmV4dF9pbnRlcnBsX3lfdXBwZXI7CisJCWN1cnJfaW50ZXJwbF95X2xvd2VyID0gbmV4dF9pbnRlcnBsX3lfbG93ZXI7CisJCWN1cnJfaW50ZXJwbF92dSA9IG5leHRfaW50ZXJwbF92dTsKKworCQl2Zl9jdXJyX05Td2VpZ2h0X3lfdXBwZXIgPSB2Zl9jdXJyX05Td2VpZ2h0X3lfdXBwZXI7CisJCXZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciA9IHZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlcjsKKwkJdmZfY3Vycl9OU3dlaWdodF92dSA9IHZmX25leHRfTlN3ZWlnaHRfdnU7CisKKwkJY3Vycl9zcmNfeV91cHBlciA9IG5leHRfc3JjX3lfdXBwZXI7CisJCWN1cnJfc3JjX3lfbG93ZXIgPSBuZXh0X3NyY195X2xvd2VyOworCQljdXJyX3NyY192dSA9IG5leHRfc3JjX3Z1OworCisJCWN1cnJfbHNvZmZfdiA9IG5leHRfbHNvZmZfdjsKKwkJY3Vycl9sc29mZl91ID0gbmV4dF9sc29mZl91OworCX0KKworCisKKwlETUFfV0FJVF9UQUcoIChSRVRSX0JVRitjdXJyX3NyY19pZHgpICk7CisKKwkvLyBzY2FsaW5nCisJLy8gd29yayBsaW5lIHlfdXBwZXIKKwliaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggeV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJc2NhbGVkX3lfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCWRzdF93aWR0aCwKKwkJCXZmX3hfc2NhbGUsCisJCQl2Zl9jdXJyX05Td2VpZ2h0X3lfdXBwZXIsCisJCQlzcmNfbGluZXN0cmlkZV95ICk7CisJLy8gd29yayBsaW5lIHlfbG93ZXIKKwliaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggeV9wbGFuZVtjdXJyX3NyY19pZHhdK3NyY19kYmxfbGluZXN0cmlkZV95LAorCQkJc2NhbGVkX3lfcGxhbmVbY3Vycl9zcmNfaWR4XStzY2FsZWRfc3JjX2xpbmVzdHJpZGVfeSwKKwkJCWRzdF93aWR0aCwKKwkJCXZmX3hfc2NhbGUsCisJCQl2Zl9jdXJyX05Td2VpZ2h0X3lfbG93ZXIsCisJCQlzcmNfbGluZXN0cmlkZV95ICk7CisJLy8gd29yayBsaW5lIHYKKwliaWxpbmVhcl9zY2FsZV9saW5lX3c4KCB2X3BsYW5lW2N1cnJfc3JjX2lkeF0rY3Vycl9sc29mZl92LAorCQkJc2NhbGVkX3ZfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCWRzdF93aWR0aD4+MSwKKwkJCXZmX3hfc2NhbGUsCisJCQl2Zl9jdXJyX05Td2VpZ2h0X3Z1LAorCQkJc3JjX2xpbmVzdHJpZGVfdnUgKTsKKwkvLyB3b3JrIGxpbmUgdQorCWJpbGluZWFyX3NjYWxlX2xpbmVfdzgoIHVfcGxhbmVbY3Vycl9zcmNfaWR4XStjdXJyX2xzb2ZmX3UsCisJCQlzY2FsZWRfdV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJZHN0X3dpZHRoPj4xLAorCQkJdmZfeF9zY2FsZSwKKwkJCXZmX2N1cnJfTlN3ZWlnaHRfdnUsCisJCQlzcmNfbGluZXN0cmlkZV92dSApOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlETUFfV0FJVF9UQUcoIChTVFJfQlVGK2N1cnJfZHN0X2lkeCkgKTsKKworCS8vIFBlcmZvcm0gdGhyZWUgRE1BIHRyYW5zZmVycyB0byAzIGRpZmZlcmVudCBsb2NhdGlvbnMgaW4gdGhlIG1haW4gbWVtb3J5IQorCS8vIGRzdF93aWR0aDoJUGl4ZWwgd2lkdGggb2YgZGVzdGluYXRpb24gaW1hZ2UKKwkvLyBkc3RfYWRkcjoJRGVzdGluYXRpb24gYWRkcmVzcyBpbiBtYWluIG1lbW9yeQorCS8vIGRzdF92dToJQ291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBvbmUgYnkgb25lCisJLy8gZHN0X3k6CUNvdW50ZXIgd2hpY2ggaXMgdHdpY2UgbGFyZ2VyIHRoYW4gZHN0X3Z1IChkc3RfeSA9IDIqZHN0X3Z1KQorCisJbWZjX3B1dCgJc2NhbGVkX3lfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCQkJLy8gV2hhdCBmcm9tIGxvY2FsIHN0b3JlIChhZGRyKQorCQkJKHVuc2lnbmVkIGludCkgIGRzdF9hZGRyX21haW5fbWVtb3J5X3kgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV95KSwJLy8gRGVzdGluYXRpb24gaW4gbWFpbiBtZW1vcnkgKGFkZHIpCisJCQlkc3RfZGJsX2xpbmVzdHJpZGVfeSwJCQkJCQkJCS8vIFR3byBZIGxpbmVzIChkZXBlbmRpbmcgb24gdGhlIHdpZGh0IG9mIHRoZSBkZXN0aW5hdGlvbiByZXNvbHV0aW9uKQorCQkJU1RSX0JVRitjdXJyX2RzdF9pZHgsCQkJCQkJCQkvLyBUYWcKKwkJCTAsIDAgKTsKKworCW1mY19wdXQoCXNjYWxlZF92X3BsYW5lW2N1cnJfc3JjX2lkeF0sCQkJCQkJCS8vIFdoYXQgZnJvbSBsb2NhbCBzdG9yZSAoYWRkcikKKwkJCSh1bnNpZ25lZCBpbnQpIGRzdF9hZGRyX21haW5fbWVtb3J5X3YgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV92dSksCS8vIERlc3RpbmF0aW9uIGluIG1haW4gbWVtb3J5IChhZGRyKQorCQkJZHN0X2RibF9saW5lc3RyaWRlX3Z1LAkJCQkJCQkJLy8gVHdvIFYgbGluZXMgKGRlcGVuZGluZyBvbiB0aGUgd2lkaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc29sdXRpb24pCisJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkJCS8vIFRhZworCQkJMCwgMCApOworCisJbWZjX3B1dCgJc2NhbGVkX3VfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCQkJLy8gV2hhdCBmcm9tIGxvY2FsIHN0b3JlIChhZGRyKQorCQkJKHVuc2lnbmVkIGludCkgIGRzdF9hZGRyX21haW5fbWVtb3J5X3UgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV92dSksCS8vIERlc3RpbmF0aW9uIGluIG1haW4gbWVtb3J5IChhZGRyKQorCQkJZHN0X2RibF9saW5lc3RyaWRlX3Z1LAkJCQkJCQkJLy8gVHdvIFUgbGluZXMgKGRlcGVuZGluZyBvbiB0aGUgd2lkaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc29sdXRpb24pCisJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkJCS8vIFRhZworCQkJMCwgMCApOworCisJLy8gd2FpdCBmb3IgY29tcGxldGlvbgorCURNQV9XQUlUX1RBRyggKFNUUl9CVUYrY3Vycl9kc3RfaWR4KSApOworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9CisKKworLyoKKyAqIHNjYWxlX3NyY3czMl9kc3R3MTYoKQorICoKKyAqIHByb2Nlc3NlcyBhbiBpbnB1dCBpbWFnZSBvZiB3aWR0aCAzMgorICogc2NhbGluZyBpcyBkb25lIHRvIGEgd2lkdGggMTYKKyAqIHl1djJyZ2IgY29udmVyc2lvbiBvbiBhIHdpZHRoIG9mIDE2CisgKiByZXN1bHQgc3RvcmVkIGluIFJBTQorICovCit2b2lkIHNjYWxlX3NyY3czMl9kc3R3MTYoKSB7CisJLy8gZXh0cmFjdCBwYXJhbWV0ZXJzCisJdW5zaWduZWQgY2hhciogZHN0X2FkZHIgPSAodW5zaWduZWQgY2hhciAqKXBhcm1zLmRzdEJ1ZmZlcjsKKworCXVuc2lnbmVkIGludCBzcmNfd2lkdGggPSBwYXJtcy5zcmNfcGl4ZWxfd2lkdGg7CisJdW5zaWduZWQgaW50IHNyY19oZWlnaHQgPSBwYXJtcy5zcmNfcGl4ZWxfaGVpZ2h0OworCXVuc2lnbmVkIGludCBkc3Rfd2lkdGggPSBwYXJtcy5kc3RfcGl4ZWxfd2lkdGg7CisJdW5zaWduZWQgaW50IGRzdF9oZWlnaHQgPSBwYXJtcy5kc3RfcGl4ZWxfaGVpZ2h0OworCisJLy8gWVZVCisJdW5zaWduZWQgaW50IHNyY19saW5lc3RyaWRlX3kgPSBzcmNfd2lkdGg7CisJdW5zaWduZWQgaW50IHNyY19kYmxfbGluZXN0cmlkZV95ID0gc3JjX3dpZHRoPDwxOworCXVuc2lnbmVkIGludCBzcmNfbGluZXN0cmlkZV92dSA9IHNyY193aWR0aD4+MTsKKwl1bnNpZ25lZCBpbnQgc3JjX2RibF9saW5lc3RyaWRlX3Z1ID0gc3JjX3dpZHRoOworCS8vIHNjYWxlZCBZVlUKKwl1bnNpZ25lZCBpbnQgc2NhbGVkX3NyY19saW5lc3RyaWRlX3kgPSBkc3Rfd2lkdGg7CisKKwkvLyByYW0gYWRkcmVzc2VzCisJdW5zaWduZWQgY2hhciogc3JjX2FkZHJfeSA9IHBhcm1zLnlfcGxhbmU7CisJdW5zaWduZWQgY2hhciogc3JjX2FkZHJfdiA9IHBhcm1zLnZfcGxhbmU7CisJdW5zaWduZWQgY2hhciogc3JjX2FkZHJfdSA9IHBhcm1zLnVfcGxhbmU7CisKKwl1bnNpZ25lZCBpbnQgZHN0X3BpY3R1cmVfc2l6ZSA9IGRzdF93aWR0aCpkc3RfaGVpZ2h0OworCisJLy8gU2l6ZXMgZm9yIGRlc3RpbmF0aW9uCisJdW5zaWduZWQgaW50IGRzdF9kYmxfbGluZXN0cmlkZV95ID0gZHN0X3dpZHRoPDwxOworCXVuc2lnbmVkIGludCBkc3RfZGJsX2xpbmVzdHJpZGVfdnUgPSBkc3Rfd2lkdGg+PjE7CisKKwkvLyBQZXJmb3JtIGFkZHJlc3MgY2FsY3VsYXRpb24gZm9yIFksIFYgYW5kIFUgaW4gbWFpbiBtZW1vcnkgd2l0aCBkc3RfYWRkciBhcyBiYXNlCisJdW5zaWduZWQgY2hhciogZHN0X2FkZHJfbWFpbl9tZW1vcnlfeSA9IGRzdF9hZGRyOworCXVuc2lnbmVkIGNoYXIqIGRzdF9hZGRyX21haW5fbWVtb3J5X3YgPSBkc3RfYWRkciArIGRzdF9waWN0dXJlX3NpemU7CisJdW5zaWduZWQgY2hhciogZHN0X2FkZHJfbWFpbl9tZW1vcnlfdSA9IGRzdF9hZGRyX21haW5fbWVtb3J5X3YgKyhkc3RfcGljdHVyZV9zaXplPj4yKTsKKworCS8vIGNhbGN1bGF0ZSBzY2FsZSBmYWN0b3JzCisJdmVjdG9yIGZsb2F0IHZmX3hfc2NhbGUgPSBzcHVfc3BsYXRzKCAoZmxvYXQpc3JjX3dpZHRoLyhmbG9hdClkc3Rfd2lkdGggKTsKKwlmbG9hdCB5X3NjYWxlID0gKGZsb2F0KXNyY19oZWlnaHQvKGZsb2F0KWRzdF9oZWlnaHQ7CisKKwkvLyBkb3VibGUgYnVmZmVyZWQgcHJvY2Vzc2luZworCS8vIGJ1ZmZlciBzd2l0Y2hpbmcKKwl1bnNpZ25lZCBpbnQgY3Vycl9zcmNfaWR4ID0gMDsKKwl1bnNpZ25lZCBpbnQgY3Vycl9kc3RfaWR4ID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9zcmNfaWR4LCBuZXh0X2RzdF9pZHg7CisKKwkvLyAyIGxpbmVzIHkgYXMgb3V0cHV0LCB1cHBlciBhbmQgbG93ZXJsaW5lCisJdW5zaWduZWQgaW50IGN1cnJfaW50ZXJwbF95X3VwcGVyID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9pbnRlcnBsX3lfdXBwZXI7CisJdW5zaWduZWQgaW50IGN1cnJfaW50ZXJwbF95X2xvd2VyLCBuZXh0X2ludGVycGxfeV9sb3dlcjsKKwkvLyBvbmx5IDEgbGluZSB2L3Ugb3V0cHV0LCBib3RoIHBsYW5lcyBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbgorCXVuc2lnbmVkIGludCBjdXJyX2ludGVycGxfdnUgPSAwOworCXVuc2lnbmVkIGludCBuZXh0X2ludGVycGxfdnU7CisKKwkvLyB3ZWlnaHRzLCBjYWxjdWxhdGVkIGluIGV2ZXJ5IGxvb3AgaXRlcmF0aW9uCisJdmVjdG9yIGZsb2F0IHZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlciA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiB9OworCXZlY3RvciBmbG9hdCB2Zl9uZXh0X05Td2VpZ2h0X3lfdXBwZXI7CisJdmVjdG9yIGZsb2F0IHZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciwgdmZfbmV4dF9OU3dlaWdodF95X2xvd2VyOworCXZlY3RvciBmbG9hdCB2Zl9jdXJyX05Td2VpZ2h0X3Z1ID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmIH07CisJdmVjdG9yIGZsb2F0IHZmX25leHRfTlN3ZWlnaHRfdnU7CisKKwkvLyBsaW5lIGluZGljZXMgZm9yIHRoZSBzcmMgcGljdHVyZQorCWZsb2F0IGN1cnJfc3JjX3lfdXBwZXIgPSAwLjBmLCBuZXh0X3NyY195X3VwcGVyOworCWZsb2F0IGN1cnJfc3JjX3lfbG93ZXIsIG5leHRfc3JjX3lfbG93ZXI7CisJZmxvYXQgY3Vycl9zcmNfdnUgPSAwLjBmLCBuZXh0X3NyY192dTsKKworCS8vIGxpbmUgaW5kaWNlcyBmb3IgdGhlIGRzdCBwaWN0dXJlCisJdW5zaWduZWQgaW50IGRzdF95PTAsIGRzdF92dT0wOworCisJLy8gY2FsY3VsYXRlIGxvd2VyIGxpbmUgaWRpY2VzCisJY3Vycl9zcmNfeV9sb3dlciA9ICgoZmxvYXQpY3Vycl9pbnRlcnBsX3lfdXBwZXIrMSkqeV9zY2FsZTsKKwljdXJyX2ludGVycGxfeV9sb3dlciA9ICh1bnNpZ25lZCBpbnQpY3Vycl9zcmNfeV9sb3dlcjsKKwkvLyBsb3dlciBsaW5lIHdlaWdodAorCXZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciA9IHNwdV9zcGxhdHMoIGN1cnJfc3JjX3lfbG93ZXItKGZsb2F0KWN1cnJfaW50ZXJwbF95X2xvd2VyICk7CisKKworCS8vIHN0YXJ0IHBhcnRpYWxseSBkb3VibGUgYnVmZmVyZWQgcHJvY2Vzc2luZworCS8vIGdldCBpbml0aWFsIGRhdGEsIDIgc2V0cyBvZiB5LCAxIHNldCB2LCAxIHNldCB1CisJbWZjX2dldCggeV9wbGFuZVtjdXJyX3NyY19pZHhdLCAodW5zaWduZWQgaW50KSBzcmNfYWRkcl95LCBzcmNfZGJsX2xpbmVzdHJpZGVfeSwgUkVUUl9CVUYsIDAsIDAgKTsKKwltZmNfZ2V0KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0rc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQkodW5zaWduZWQgaW50KSBzcmNfYWRkcl95KyhjdXJyX2ludGVycGxfeV9sb3dlcipzcmNfbGluZXN0cmlkZV95KSwKKwkJCXNyY19kYmxfbGluZXN0cmlkZV95LAorCQkJUkVUUl9CVUYsCisJCQkwLCAwICk7CisJbWZjX2dldCggdl9wbGFuZVtjdXJyX3NyY19pZHhdLCAodW5zaWduZWQgaW50KSBzcmNfYWRkcl92LCBzcmNfZGJsX2xpbmVzdHJpZGVfdnUsIFJFVFJfQlVGLCAwLCAwICk7CisJbWZjX2dldCggdV9wbGFuZVtjdXJyX3NyY19pZHhdLCAodW5zaWduZWQgaW50KSBzcmNfYWRkcl91LCBzcmNfZGJsX2xpbmVzdHJpZGVfdnUsIFJFVFJfQlVGLCAwLCAwICk7CisKKwkvLyBpdGVyYXRpb24gbG9vcAorCS8vIHdpdGhpbiBlYWNoIGl0ZXJhdGlvbiA0IGxpbmVzIHksIDIgbGluZXMgdiwgMiBsaW5lcyB1IGFyZSByZXRyaWV2ZWQKKwkvLyB0aGUgc2NhbGVkIG91dHB1dCBpcyAyIGxpbmVzIHksIDEgbGluZSB2LCAxIGxpbmUgdQorCS8vIHRoZSB5dXYycmdiLWNvbnZlcnRlZCBvdXRwdXQgaXMgc3RvcmVkIHRvIFJBTQorCWZvciggZHN0X3Z1PTA7IGRzdF92dTwoZHN0X2hlaWdodD4+MSktMTsgZHN0X3Z1KysgKSB7CisJCWRzdF95ID0gZHN0X3Z1PDwxOworCisJCS8vIGNhbGN1bGF0ZSBuZXh0IGluZGljZXMKKwkJbmV4dF9zcmNfdnUgPSAoKGZsb2F0KWRzdF92dSsxKSp5X3NjYWxlOworCQluZXh0X3NyY195X3VwcGVyID0gKChmbG9hdClkc3RfeSsyKSp5X3NjYWxlOworCQluZXh0X3NyY195X2xvd2VyID0gKChmbG9hdClkc3RfeSszKSp5X3NjYWxlOworCisJCW5leHRfaW50ZXJwbF92dSA9ICh1bnNpZ25lZCBpbnQpIG5leHRfc3JjX3Z1OworCQluZXh0X2ludGVycGxfeV91cHBlciA9ICh1bnNpZ25lZCBpbnQpIG5leHRfc3JjX3lfdXBwZXI7CisJCW5leHRfaW50ZXJwbF95X2xvd2VyID0gKHVuc2lnbmVkIGludCkgbmV4dF9zcmNfeV9sb3dlcjsKKworCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IE5PUlRILVNPVVRICisJCXZmX25leHRfTlN3ZWlnaHRfdnUgPSBzcHVfc3BsYXRzKCBuZXh0X3NyY192dS0oZmxvYXQpbmV4dF9pbnRlcnBsX3Z1ICk7CisJCXZmX25leHRfTlN3ZWlnaHRfeV91cHBlciA9IHNwdV9zcGxhdHMoIG5leHRfc3JjX3lfdXBwZXItKGZsb2F0KW5leHRfaW50ZXJwbF95X3VwcGVyICk7CisJCXZmX25leHRfTlN3ZWlnaHRfeV9sb3dlciA9IHNwdV9zcGxhdHMoIG5leHRfc3JjX3lfbG93ZXItKGZsb2F0KW5leHRfaW50ZXJwbF95X2xvd2VyICk7CisKKwkJLy8gZ2V0IG5leHQgbGluZXMKKwkJbmV4dF9zcmNfaWR4ID0gY3Vycl9zcmNfaWR4XjE7CisJCW5leHRfZHN0X2lkeCA9IGN1cnJfZHN0X2lkeF4xOworCisJCS8vIDQgbGluZXMgeQorCQltZmNfZ2V0KCB5X3BsYW5lW25leHRfc3JjX2lkeF0sCisJCQkJKHVuc2lnbmVkIGludCkgc3JjX2FkZHJfeSsobmV4dF9pbnRlcnBsX3lfdXBwZXIqc3JjX2xpbmVzdHJpZGVfeSksCisJCQkJc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQkJUkVUUl9CVUYrbmV4dF9zcmNfaWR4LAorCQkJCTAsIDAgKTsKKwkJbWZjX2dldCggeV9wbGFuZVtuZXh0X3NyY19pZHhdK3NyY19kYmxfbGluZXN0cmlkZV95LAorCQkJCSh1bnNpZ25lZCBpbnQpIHNyY19hZGRyX3krKG5leHRfaW50ZXJwbF95X2xvd2VyKnNyY19saW5lc3RyaWRlX3kpLAorCQkJCXNyY19kYmxfbGluZXN0cmlkZV95LAorCQkJCVJFVFJfQlVGK25leHRfc3JjX2lkeCwKKwkJCQkwLCAwICk7CisKKwkJLy8gMiBsaW5lcyB2CisJCW1mY19nZXQoIHZfcGxhbmVbbmV4dF9zcmNfaWR4XSwKKwkJCQkodW5zaWduZWQgaW50KSBzcmNfYWRkcl92KyhuZXh0X2ludGVycGxfdnUqc3JjX2xpbmVzdHJpZGVfdnUpLAorCQkJCXNyY19kYmxfbGluZXN0cmlkZV92dSwKKwkJCQlSRVRSX0JVRituZXh0X3NyY19pZHgsCisJCQkJMCwgMCApOworCQkvLyAyIGxpbmVzIHUKKwkJbWZjX2dldCggdV9wbGFuZVtuZXh0X3NyY19pZHhdLAorCQkJCSh1bnNpZ25lZCBpbnQpIHNyY19hZGRyX3UrKG5leHRfaW50ZXJwbF92dSpzcmNfbGluZXN0cmlkZV92dSksCisJCQkJc3JjX2RibF9saW5lc3RyaWRlX3Z1LAorCQkJCVJFVFJfQlVGK25leHRfc3JjX2lkeCwKKwkJCQkwLCAwICk7CisKKwkJRE1BX1dBSVRfVEFHKCAoUkVUUl9CVUYrY3Vycl9zcmNfaWR4KSApOworCisJCS8vIHNjYWxpbmcKKwkJLy8gd29yayBsaW5lIHlfdXBwZXIKKwkJYmlsaW5lYXJfc2NhbGVfbGluZV93MTYoIHlfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCQlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJCWRzdF93aWR0aCwKKwkJCQl2Zl94X3NjYWxlLAorCQkJCXZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlciwKKwkJCQlzcmNfbGluZXN0cmlkZV95ICk7CisJCS8vIHdvcmsgbGluZSB5X2xvd2VyCisJCWJpbGluZWFyX3NjYWxlX2xpbmVfdzE2KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0rc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQkJc2NhbGVkX3lfcGxhbmVbY3Vycl9zcmNfaWR4XStzY2FsZWRfc3JjX2xpbmVzdHJpZGVfeSwKKwkJCQlkc3Rfd2lkdGgsCisJCQkJdmZfeF9zY2FsZSwKKwkJCQl2Zl9jdXJyX05Td2VpZ2h0X3lfbG93ZXIsCisJCQkJc3JjX2xpbmVzdHJpZGVfeSApOworCQkvLyB3b3JrIGxpbmUgdgorCQliaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggdl9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJCXNjYWxlZF92X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQkJZHN0X3dpZHRoPj4xLAorCQkJCXZmX3hfc2NhbGUsCisJCQkJdmZfY3Vycl9OU3dlaWdodF92dSwKKwkJCQlzcmNfbGluZXN0cmlkZV92dSApOworCQkvLyB3b3JrIGxpbmUgdQorCQliaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggdV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJCXNjYWxlZF91X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQkJZHN0X3dpZHRoPj4xLAorCQkJCXZmX3hfc2NhbGUsCisJCQkJdmZfY3Vycl9OU3dlaWdodF92dSwKKwkJCQlzcmNfbGluZXN0cmlkZV92dSApOworCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCURNQV9XQUlUX1RBRyggKFNUUl9CVUYrY3Vycl9kc3RfaWR4KSApOworCisJCS8vIFBlcmZvcm0gdGhyZWUgRE1BIHRyYW5zZmVycyB0byAzIGRpZmZlcmVudCBsb2NhdGlvbnMgaW4gdGhlIG1haW4gbWVtb3J5IQorCQkvLyBkc3Rfd2lkdGg6CVBpeGVsIHdpZHRoIG9mIGRlc3RpbmF0aW9uIGltYWdlCisJCS8vIGRzdF9hZGRyOglEZXN0aW5hdGlvbiBhZGRyZXNzIGluIG1haW4gbWVtb3J5CisJCS8vIGRzdF92dToJQ291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBvbmUgYnkgb25lCisJCS8vIGRzdF95OglDb3VudGVyIHdoaWNoIGlzIHR3aWNlIGxhcmdlciB0aGFuIGRzdF92dSAoZHN0X3kgPSAyKmRzdF92dSkKKworCQltZmNfcHV0KAlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdLAkJCQkJCQkvLyBXaGF0IGZyb20gbG9jYWwgc3RvcmUgKGFkZHIpCisJCQkJKHVuc2lnbmVkIGludCkgIGRzdF9hZGRyX21haW5fbWVtb3J5X3kgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV95KSwJLy8gRGVzdGluYXRpb24gaW4gbWFpbiBtZW1vcnkgKGFkZHIpCisJCQkJZHN0X2RibF9saW5lc3RyaWRlX3ksCQkJCQkJCQkvLyBUd28gWSBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkJCS8vIFRhZworCQkJCTAsIDAgKTsKKworCQltZmNfcHV0KAlzY2FsZWRfdl9wbGFuZVtjdXJyX3NyY19pZHhdLAkJCQkJCQkvLyBXaGF0IGZyb20gbG9jYWwgc3RvcmUgKGFkZHIpCisJCQkJKHVuc2lnbmVkIGludCkgZHN0X2FkZHJfbWFpbl9tZW1vcnlfdiArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3Z1KSwJLy8gRGVzdGluYXRpb24gaW4gbWFpbiBtZW1vcnkgKGFkZHIpCisJCQkJZHN0X2RibF9saW5lc3RyaWRlX3Z1LAkJCQkJCQkJLy8gVHdvIFYgbGluZXMgKGRlcGVuZGluZyBvbiB0aGUgd2lkaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc29sdXRpb24pCisJCQkJU1RSX0JVRitjdXJyX2RzdF9pZHgsCQkJCQkJCQkvLyBUYWcKKwkJCQkwLCAwICk7CisKKwkJbWZjX3B1dCgJc2NhbGVkX3VfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCQkJLy8gV2hhdCBmcm9tIGxvY2FsIHN0b3JlIChhZGRyKQorCQkJCSh1bnNpZ25lZCBpbnQpICBkc3RfYWRkcl9tYWluX21lbW9yeV91ICsgKGRzdF92dSpkc3RfZGJsX2xpbmVzdHJpZGVfdnUpLCAvLyBEZXN0aW5hdGlvbiBpbiBtYWluIG1lbW9yeSAoYWRkcikKKwkJCQlkc3RfZGJsX2xpbmVzdHJpZGVfdnUsCQkJCQkJCQkvLyBUd28gVSBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkJCS8vIFRhZworCQkJCTAsIDAgKTsKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisJCS8vIHVwZGF0ZSBmb3IgbmV4dCBjeWNsZQorCQljdXJyX3NyY19pZHggPSBuZXh0X3NyY19pZHg7CisJCWN1cnJfZHN0X2lkeCA9IG5leHRfZHN0X2lkeDsKKworCQljdXJyX2ludGVycGxfeV91cHBlciA9IG5leHRfaW50ZXJwbF95X3VwcGVyOworCQljdXJyX2ludGVycGxfeV9sb3dlciA9IG5leHRfaW50ZXJwbF95X2xvd2VyOworCQljdXJyX2ludGVycGxfdnUgPSBuZXh0X2ludGVycGxfdnU7CisKKwkJdmZfY3Vycl9OU3dlaWdodF95X3VwcGVyID0gdmZfY3Vycl9OU3dlaWdodF95X3VwcGVyOworCQl2Zl9jdXJyX05Td2VpZ2h0X3lfbG93ZXIgPSB2Zl9jdXJyX05Td2VpZ2h0X3lfbG93ZXI7CisJCXZmX2N1cnJfTlN3ZWlnaHRfdnUgPSB2Zl9uZXh0X05Td2VpZ2h0X3Z1OworCisJCWN1cnJfc3JjX3lfdXBwZXIgPSBuZXh0X3NyY195X3VwcGVyOworCQljdXJyX3NyY195X2xvd2VyID0gbmV4dF9zcmNfeV9sb3dlcjsKKwkJY3Vycl9zcmNfdnUgPSBuZXh0X3NyY192dTsKKwl9CisKKworCisJRE1BX1dBSVRfVEFHKCAoUkVUUl9CVUYrY3Vycl9zcmNfaWR4KSApOworCisJLy8gc2NhbGluZworCS8vIHdvcmsgbGluZSB5X3VwcGVyCisJYmlsaW5lYXJfc2NhbGVfbGluZV93MTYoIHlfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCXNjYWxlZF95X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQlkc3Rfd2lkdGgsCisJCQl2Zl94X3NjYWxlLAorCQkJdmZfY3Vycl9OU3dlaWdodF95X3VwcGVyLAorCQkJc3JjX2xpbmVzdHJpZGVfeSApOworCS8vIHdvcmsgbGluZSB5X2xvd2VyCisJYmlsaW5lYXJfc2NhbGVfbGluZV93MTYoIHlfcGxhbmVbY3Vycl9zcmNfaWR4XStzcmNfZGJsX2xpbmVzdHJpZGVfeSwKKwkJCXNjYWxlZF95X3BsYW5lW2N1cnJfc3JjX2lkeF0rc2NhbGVkX3NyY19saW5lc3RyaWRlX3ksCisJCQlkc3Rfd2lkdGgsCisJCQl2Zl94X3NjYWxlLAorCQkJdmZfY3Vycl9OU3dlaWdodF95X2xvd2VyLAorCQkJc3JjX2xpbmVzdHJpZGVfeSApOworCS8vIHdvcmsgbGluZSB2CisJYmlsaW5lYXJfc2NhbGVfbGluZV93MTYoIHZfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCXNjYWxlZF92X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQlkc3Rfd2lkdGg+PjEsCisJCQl2Zl94X3NjYWxlLAorCQkJdmZfY3Vycl9OU3dlaWdodF92dSwKKwkJCXNyY19saW5lc3RyaWRlX3Z1ICk7CisJLy8gd29yayBsaW5lIHUKKwliaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggdV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJc2NhbGVkX3VfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCWRzdF93aWR0aD4+MSwKKwkJCXZmX3hfc2NhbGUsCisJCQl2Zl9jdXJyX05Td2VpZ2h0X3Z1LAorCQkJc3JjX2xpbmVzdHJpZGVfdnUgKTsKKworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlETUFfV0FJVF9UQUcoIChTVFJfQlVGK2N1cnJfZHN0X2lkeCkgKTsKKworCS8vIFBlcmZvcm0gdGhyZWUgRE1BIHRyYW5zZmVycyB0byAzIGRpZmZlcmVudCBsb2NhdGlvbnMgaW4gdGhlIG1haW4gbWVtb3J5IQorCS8vIGRzdF93aWR0aDoJUGl4ZWwgd2lkdGggb2YgZGVzdGluYXRpb24gaW1hZ2UKKwkvLyBkc3RfYWRkcjoJRGVzdGluYXRpb24gYWRkcmVzcyBpbiBtYWluIG1lbW9yeQorCS8vIGRzdF92dToJQ291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBvbmUgYnkgb25lCisJLy8gZHN0X3k6CUNvdW50ZXIgd2hpY2ggaXMgdHdpY2UgbGFyZ2VyIHRoYW4gZHN0X3Z1IChkc3RfeSA9IDIqZHN0X3Z1KQorCisJbWZjX3B1dCgJc2NhbGVkX3lfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCQkJLy8gV2hhdCBmcm9tIGxvY2FsIHN0b3JlIChhZGRyKQorCQkJKHVuc2lnbmVkIGludCkgIGRzdF9hZGRyX21haW5fbWVtb3J5X3kgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV95KSwJLy8gRGVzdGluYXRpb24gaW4gbWFpbiBtZW1vcnkgKGFkZHIpCisJCQlkc3RfZGJsX2xpbmVzdHJpZGVfeSwJCQkJCQkJCS8vIFR3byBZIGxpbmVzIChkZXBlbmRpbmcgb24gdGhlIHdpZGh0IG9mIHRoZSBkZXN0aW5hdGlvbiByZXNvbHV0aW9uKQorCQkJU1RSX0JVRitjdXJyX2RzdF9pZHgsCQkJCQkJCQkvLyBUYWcKKwkJCTAsIDAgKTsKKworCW1mY19wdXQoCXNjYWxlZF92X3BsYW5lW2N1cnJfc3JjX2lkeF0sCQkJCQkJCS8vIFdoYXQgZnJvbSBsb2NhbCBzdG9yZSAoYWRkcikKKwkJCSh1bnNpZ25lZCBpbnQpIGRzdF9hZGRyX21haW5fbWVtb3J5X3YgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV92dSksCS8vIERlc3RpbmF0aW9uIGluIG1haW4gbWVtb3J5IChhZGRyKQorCQkJZHN0X2RibF9saW5lc3RyaWRlX3Z1LAkJCQkJCQkJLy8gVHdvIFYgbGluZXMgKGRlcGVuZGluZyBvbiB0aGUgd2lkaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc29sdXRpb24pCisJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkJCS8vIFRhZworCQkJMCwgMCApOworCisJbWZjX3B1dCgJc2NhbGVkX3VfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCQkJLy8gV2hhdCBmcm9tIGxvY2FsIHN0b3JlIChhZGRyKQorCQkJKHVuc2lnbmVkIGludCkgIGRzdF9hZGRyX21haW5fbWVtb3J5X3UgKyAoZHN0X3Z1KmRzdF9kYmxfbGluZXN0cmlkZV92dSksIC8vIERlc3RpbmF0aW9uIGluIG1haW4gbWVtb3J5IChhZGRyKQorCQkJZHN0X2RibF9saW5lc3RyaWRlX3Z1LAkJCQkJCQkJLy8gVHdvIFUgbGluZXMgKGRlcGVuZGluZyBvbiB0aGUgd2lkaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc29sdXRpb24pCisJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkJCS8vIFRhZworCQkJMCwgMCApOworCisJLy8gd2FpdCBmb3IgY29tcGxldGlvbgorCURNQV9XQUlUX1RBRyggKFNUUl9CVUYrY3Vycl9kc3RfaWR4KSApOworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9CisKKworLyoqCisgKiBzY2FsZV9zcmN3MzJfZHN0dzMyKCkKKyAqCisgKiBwcm9jZXNzZXMgYW4gaW5wdXQgaW1hZ2Ugb2Ygd2lkdGggMzIKKyAqIHNjYWxpbmcgaXMgZG9uZSB0byBhIHdpZHRoIDMyCisgKiB5dXYycmdiIGNvbnZlcnNpb24gb24gYSB3aWR0aCBvZiAzMgorICogcmVzdWx0IHN0b3JlZCBpbiBSQU0KKyAqLwordm9pZCBzY2FsZV9zcmN3MzJfZHN0dzMyKCkgeworCS8vIGV4dHJhY3QgcGFyYW1ldGVycworCXVuc2lnbmVkIGNoYXIqIGRzdF9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilwYXJtcy5kc3RCdWZmZXI7CisKKwl1bnNpZ25lZCBpbnQgc3JjX3dpZHRoID0gcGFybXMuc3JjX3BpeGVsX3dpZHRoOworCXVuc2lnbmVkIGludCBzcmNfaGVpZ2h0ID0gcGFybXMuc3JjX3BpeGVsX2hlaWdodDsKKwl1bnNpZ25lZCBpbnQgZHN0X3dpZHRoID0gcGFybXMuZHN0X3BpeGVsX3dpZHRoOworCXVuc2lnbmVkIGludCBkc3RfaGVpZ2h0ID0gcGFybXMuZHN0X3BpeGVsX2hlaWdodDsKKworCS8vIFlWVQorCXVuc2lnbmVkIGludCBzcmNfbGluZXN0cmlkZV95ID0gc3JjX3dpZHRoOworCXVuc2lnbmVkIGludCBzcmNfZGJsX2xpbmVzdHJpZGVfeSA9IHNyY193aWR0aDw8MTsKKwl1bnNpZ25lZCBpbnQgc3JjX2xpbmVzdHJpZGVfdnUgPSBzcmNfd2lkdGg+PjE7CisJdW5zaWduZWQgaW50IHNyY19kYmxfbGluZXN0cmlkZV92dSA9IHNyY193aWR0aDsKKworCS8vIHNjYWxlZCBZVlUKKwl1bnNpZ25lZCBpbnQgc2NhbGVkX3NyY19saW5lc3RyaWRlX3kgPSBkc3Rfd2lkdGg7CisKKwkvLyByYW0gYWRkcmVzc2VzCisJdW5zaWduZWQgY2hhciogc3JjX2FkZHJfeSA9IHBhcm1zLnlfcGxhbmU7CisJdW5zaWduZWQgY2hhciogc3JjX2FkZHJfdiA9IHBhcm1zLnZfcGxhbmU7CisJdW5zaWduZWQgY2hhciogc3JjX2FkZHJfdSA9IHBhcm1zLnVfcGxhbmU7CisKKwl1bnNpZ25lZCBpbnQgZHN0X3BpY3R1cmVfc2l6ZSA9IGRzdF93aWR0aCpkc3RfaGVpZ2h0OworCisJLy8gU2l6ZXMgZm9yIGRlc3RpbmF0aW9uCisJdW5zaWduZWQgaW50IGRzdF9kYmxfbGluZXN0cmlkZV95ID0gZHN0X3dpZHRoPDwxOworCXVuc2lnbmVkIGludCBkc3RfZGJsX2xpbmVzdHJpZGVfdnUgPSBkc3Rfd2lkdGg+PjE7CisKKwkvLyBQZXJmb3JtIGFkZHJlc3MgY2FsY3VsYXRpb24gZm9yIFksIFYgYW5kIFUgaW4gbWFpbiBtZW1vcnkgd2l0aCBkc3RfYWRkciBhcyBiYXNlCisJdW5zaWduZWQgY2hhciogZHN0X2FkZHJfbWFpbl9tZW1vcnlfeSA9IGRzdF9hZGRyOworCXVuc2lnbmVkIGNoYXIqIGRzdF9hZGRyX21haW5fbWVtb3J5X3YgPSBkc3RfYWRkciArIGRzdF9waWN0dXJlX3NpemU7CisJdW5zaWduZWQgY2hhciogZHN0X2FkZHJfbWFpbl9tZW1vcnlfdSA9IGRzdF9hZGRyX21haW5fbWVtb3J5X3YgKyhkc3RfcGljdHVyZV9zaXplPj4yKTsKKworCS8vIGNhbGN1bGF0ZSBzY2FsZSBmYWN0b3JzCisJdmVjdG9yIGZsb2F0IHZmX3hfc2NhbGUgPSBzcHVfc3BsYXRzKCAoZmxvYXQpc3JjX3dpZHRoLyhmbG9hdClkc3Rfd2lkdGggKTsKKwlmbG9hdCB5X3NjYWxlID0gKGZsb2F0KXNyY19oZWlnaHQvKGZsb2F0KWRzdF9oZWlnaHQ7CisKKwkvLyBkb3VibGUgYnVmZmVyZWQgcHJvY2Vzc2luZworCS8vIGJ1ZmZlciBzd2l0Y2hpbmcKKwl1bnNpZ25lZCBpbnQgY3Vycl9zcmNfaWR4ID0gMDsKKwl1bnNpZ25lZCBpbnQgY3Vycl9kc3RfaWR4ID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9zcmNfaWR4LCBuZXh0X2RzdF9pZHg7CisKKwkvLyAyIGxpbmVzIHkgYXMgb3V0cHV0LCB1cHBlciBhbmQgbG93ZXJsaW5lCisJdW5zaWduZWQgaW50IGN1cnJfaW50ZXJwbF95X3VwcGVyID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9pbnRlcnBsX3lfdXBwZXI7CisJdW5zaWduZWQgaW50IGN1cnJfaW50ZXJwbF95X2xvd2VyLCBuZXh0X2ludGVycGxfeV9sb3dlcjsKKwkvLyBvbmx5IDEgbGluZSB2L3Ugb3V0cHV0LCBib3RoIHBsYW5lcyBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbgorCXVuc2lnbmVkIGludCBjdXJyX2ludGVycGxfdnUgPSAwOworCXVuc2lnbmVkIGludCBuZXh0X2ludGVycGxfdnU7CisKKwkvLyB3ZWlnaHRzLCBjYWxjdWxhdGVkIGluIGV2ZXJ5IGxvb3AgaXRlcmF0aW9uCisJdmVjdG9yIGZsb2F0IHZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlciA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiB9OworCXZlY3RvciBmbG9hdCB2Zl9uZXh0X05Td2VpZ2h0X3lfdXBwZXI7CisJdmVjdG9yIGZsb2F0IHZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciwgdmZfbmV4dF9OU3dlaWdodF95X2xvd2VyOworCXZlY3RvciBmbG9hdCB2Zl9jdXJyX05Td2VpZ2h0X3Z1ID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmIH07CisJdmVjdG9yIGZsb2F0IHZmX25leHRfTlN3ZWlnaHRfdnU7CisKKwkvLyBsaW5lIGluZGljZXMgZm9yIHRoZSBzcmMgcGljdHVyZQorCWZsb2F0IGN1cnJfc3JjX3lfdXBwZXIgPSAwLjBmLCBuZXh0X3NyY195X3VwcGVyOworCWZsb2F0IGN1cnJfc3JjX3lfbG93ZXIsIG5leHRfc3JjX3lfbG93ZXI7CisJZmxvYXQgY3Vycl9zcmNfdnUgPSAwLjBmLCBuZXh0X3NyY192dTsKKworCS8vIGxpbmUgaW5kaWNlcyBmb3IgdGhlIGRzdCBwaWN0dXJlCisJdW5zaWduZWQgaW50IGRzdF95PTAsIGRzdF92dT0wOworCisJLy8gY2FsY3VsYXRlIGxvd2VyIGxpbmUgaWRpY2VzCisJY3Vycl9zcmNfeV9sb3dlciA9ICgoZmxvYXQpY3Vycl9pbnRlcnBsX3lfdXBwZXIrMSkqeV9zY2FsZTsKKwljdXJyX2ludGVycGxfeV9sb3dlciA9ICh1bnNpZ25lZCBpbnQpY3Vycl9zcmNfeV9sb3dlcjsKKwkvLyBsb3dlciBsaW5lIHdlaWdodAorCXZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciA9IHNwdV9zcGxhdHMoIGN1cnJfc3JjX3lfbG93ZXItKGZsb2F0KWN1cnJfaW50ZXJwbF95X2xvd2VyICk7CisKKworCS8vIHN0YXJ0IHBhcnRpYWxseSBkb3VibGUgYnVmZmVyZWQgcHJvY2Vzc2luZworCS8vIGdldCBpbml0aWFsIGRhdGEsIDIgc2V0cyBvZiB5LCAxIHNldCB2LCAxIHNldCB1CisJbWZjX2dldCggeV9wbGFuZVtjdXJyX3NyY19pZHhdLCAodW5zaWduZWQgaW50KSBzcmNfYWRkcl95LCBzcmNfZGJsX2xpbmVzdHJpZGVfeSwgUkVUUl9CVUYsIDAsIDAgKTsKKwltZmNfZ2V0KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0rc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQkodW5zaWduZWQgaW50KSBzcmNfYWRkcl95KyhjdXJyX2ludGVycGxfeV9sb3dlcipzcmNfbGluZXN0cmlkZV95KSwKKwkJCXNyY19kYmxfbGluZXN0cmlkZV95LAorCQkJUkVUUl9CVUYsCisJCQkwLCAwICk7CisJbWZjX2dldCggdl9wbGFuZVtjdXJyX3NyY19pZHhdLCAodW5zaWduZWQgaW50KSBzcmNfYWRkcl92LCBzcmNfZGJsX2xpbmVzdHJpZGVfdnUsIFJFVFJfQlVGLCAwLCAwICk7CisJbWZjX2dldCggdV9wbGFuZVtjdXJyX3NyY19pZHhdLCAodW5zaWduZWQgaW50KSBzcmNfYWRkcl91LCBzcmNfZGJsX2xpbmVzdHJpZGVfdnUsIFJFVFJfQlVGLCAwLCAwICk7CisKKwkvLyBpdGVyYXRpb24gbG9vcAorCS8vIHdpdGhpbiBlYWNoIGl0ZXJhdGlvbiA0IGxpbmVzIHksIDIgbGluZXMgdiwgMiBsaW5lcyB1IGFyZSByZXRyaWV2ZWQKKwkvLyB0aGUgc2NhbGVkIG91dHB1dCBpcyAyIGxpbmVzIHksIDEgbGluZSB2LCAxIGxpbmUgdQorCS8vIHRoZSB5dXYycmdiLWNvbnZlcnRlZCBvdXRwdXQgaXMgc3RvcmVkIHRvIFJBTQorCWZvciggZHN0X3Z1PTA7IGRzdF92dTwoZHN0X2hlaWdodD4+MSktMTsgZHN0X3Z1KysgKSB7CisJCWRzdF95ID0gZHN0X3Z1PDwxOworCisJCS8vIGNhbGN1bGF0ZSBuZXh0IGluZGljZXMKKwkJbmV4dF9zcmNfdnUgPSAoKGZsb2F0KWRzdF92dSsxKSp5X3NjYWxlOworCQluZXh0X3NyY195X3VwcGVyID0gKChmbG9hdClkc3RfeSsyKSp5X3NjYWxlOworCQluZXh0X3NyY195X2xvd2VyID0gKChmbG9hdClkc3RfeSszKSp5X3NjYWxlOworCisJCW5leHRfaW50ZXJwbF92dSA9ICh1bnNpZ25lZCBpbnQpIG5leHRfc3JjX3Z1OworCQluZXh0X2ludGVycGxfeV91cHBlciA9ICh1bnNpZ25lZCBpbnQpIG5leHRfc3JjX3lfdXBwZXI7CisJCW5leHRfaW50ZXJwbF95X2xvd2VyID0gKHVuc2lnbmVkIGludCkgbmV4dF9zcmNfeV9sb3dlcjsKKworCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IE5PUlRILVNPVVRICisJCXZmX25leHRfTlN3ZWlnaHRfdnUgPSBzcHVfc3BsYXRzKCBuZXh0X3NyY192dS0oZmxvYXQpbmV4dF9pbnRlcnBsX3Z1ICk7CisJCXZmX25leHRfTlN3ZWlnaHRfeV91cHBlciA9IHNwdV9zcGxhdHMoIG5leHRfc3JjX3lfdXBwZXItKGZsb2F0KW5leHRfaW50ZXJwbF95X3VwcGVyICk7CisJCXZmX25leHRfTlN3ZWlnaHRfeV9sb3dlciA9IHNwdV9zcGxhdHMoIG5leHRfc3JjX3lfbG93ZXItKGZsb2F0KW5leHRfaW50ZXJwbF95X2xvd2VyICk7CisKKwkJLy8gZ2V0IG5leHQgbGluZXMKKwkJbmV4dF9zcmNfaWR4ID0gY3Vycl9zcmNfaWR4XjE7CisJCW5leHRfZHN0X2lkeCA9IGN1cnJfZHN0X2lkeF4xOworCisJCS8vIDQgbGluZXMgeQorCQltZmNfZ2V0KCB5X3BsYW5lW25leHRfc3JjX2lkeF0sCisJCQkJKHVuc2lnbmVkIGludCkgc3JjX2FkZHJfeSsobmV4dF9pbnRlcnBsX3lfdXBwZXIqc3JjX2xpbmVzdHJpZGVfeSksCisJCQkJc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQkJUkVUUl9CVUYrbmV4dF9zcmNfaWR4LAorCQkJCTAsIDAgKTsKKwkJbWZjX2dldCggeV9wbGFuZVtuZXh0X3NyY19pZHhdK3NyY19kYmxfbGluZXN0cmlkZV95LAorCQkJCSh1bnNpZ25lZCBpbnQpIHNyY19hZGRyX3krKG5leHRfaW50ZXJwbF95X2xvd2VyKnNyY19saW5lc3RyaWRlX3kpLAorCQkJCXNyY19kYmxfbGluZXN0cmlkZV95LAorCQkJCVJFVFJfQlVGK25leHRfc3JjX2lkeCwKKwkJCQkwLCAwICk7CisKKwkJLy8gMiBsaW5lcyB2CisJCW1mY19nZXQoIHZfcGxhbmVbbmV4dF9zcmNfaWR4XSwKKwkJCQkodW5zaWduZWQgaW50KSBzcmNfYWRkcl92KyhuZXh0X2ludGVycGxfdnUqc3JjX2xpbmVzdHJpZGVfdnUpLAorCQkJCXNyY19kYmxfbGluZXN0cmlkZV92dSwKKwkJCQlSRVRSX0JVRituZXh0X3NyY19pZHgsCisJCQkJMCwgMCApOworCQkvLyAyIGxpbmVzIHUKKwkJbWZjX2dldCggdV9wbGFuZVtuZXh0X3NyY19pZHhdLAorCQkJCSh1bnNpZ25lZCBpbnQpIHNyY19hZGRyX3UrKG5leHRfaW50ZXJwbF92dSpzcmNfbGluZXN0cmlkZV92dSksCisJCQkJc3JjX2RibF9saW5lc3RyaWRlX3Z1LAorCQkJCVJFVFJfQlVGK25leHRfc3JjX2lkeCwKKwkJCQkwLCAwICk7CisKKwkJRE1BX1dBSVRfVEFHKCAoUkVUUl9CVUYrY3Vycl9zcmNfaWR4KSApOworCisJCS8vIHNjYWxpbmcKKwkJLy8gd29yayBsaW5lIHlfdXBwZXIKKwkJYmlsaW5lYXJfc2NhbGVfbGluZV93MTYoIHlfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCQlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJCWRzdF93aWR0aCwKKwkJCQl2Zl94X3NjYWxlLAorCQkJCXZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlciwKKwkJCQlzcmNfbGluZXN0cmlkZV95ICk7CisJCS8vIHdvcmsgbGluZSB5X2xvd2VyCisJCWJpbGluZWFyX3NjYWxlX2xpbmVfdzE2KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0rc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQkJc2NhbGVkX3lfcGxhbmVbY3Vycl9zcmNfaWR4XStzY2FsZWRfc3JjX2xpbmVzdHJpZGVfeSwKKwkJCQlkc3Rfd2lkdGgsCisJCQkJdmZfeF9zY2FsZSwKKwkJCQl2Zl9jdXJyX05Td2VpZ2h0X3lfbG93ZXIsCisJCQkJc3JjX2xpbmVzdHJpZGVfeSApOworCQkvLyB3b3JrIGxpbmUgdgorCQliaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggdl9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJCXNjYWxlZF92X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQkJZHN0X3dpZHRoPj4xLAorCQkJCXZmX3hfc2NhbGUsCisJCQkJdmZfY3Vycl9OU3dlaWdodF92dSwKKwkJCQlzcmNfbGluZXN0cmlkZV92dSApOworCQkvLyB3b3JrIGxpbmUgdQorCQliaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggdV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJCXNjYWxlZF91X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQkJZHN0X3dpZHRoPj4xLAorCQkJCXZmX3hfc2NhbGUsCisJCQkJdmZfY3Vycl9OU3dlaWdodF92dSwKKwkJCQlzcmNfbGluZXN0cmlkZV92dSApOworCisKKworCQkvLyBTdG9yZSB0aGUgcmVzdWx0IGJhY2sgdG8gbWFpbiBtZW1vcnkgaW50byBhIGRlc3RpbmF0aW9uIGJ1ZmZlciBpbiBZVVYgZm9ybWF0CisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCURNQV9XQUlUX1RBRyggKFNUUl9CVUYrY3Vycl9kc3RfaWR4KSApOworCisJCS8vIFBlcmZvcm0gdGhyZWUgRE1BIHRyYW5zZmVycyB0byAzIGRpZmZlcmVudCBsb2NhdGlvbnMgaW4gdGhlIG1haW4gbWVtb3J5IQorCQkvLyBkc3Rfd2lkdGg6CVBpeGVsIHdpZHRoIG9mIGRlc3RpbmF0aW9uIGltYWdlCisJCS8vIGRzdF9hZGRyOglEZXN0aW5hdGlvbiBhZGRyZXNzIGluIG1haW4gbWVtb3J5CisJCS8vIGRzdF92dToJQ291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBvbmUgYnkgb25lCisJCS8vIGRzdF95OglDb3VudGVyIHdoaWNoIGlzIHR3aWNlIGxhcmdlciB0aGFuIGRzdF92dSAoZHN0X3kgPSAyKmRzdF92dSkKKworCQltZmNfcHV0KAlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdLAkJCQkJCQkvLyBXaGF0IGZyb20gbG9jYWwgc3RvcmUgKGFkZHIpCisJCQkJKHVuc2lnbmVkIGludCkgZHN0X2FkZHJfbWFpbl9tZW1vcnlfeSArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3kpLAkvLyBEZXN0aW5hdGlvbiBpbiBtYWluIG1lbW9yeSAoYWRkcikKKwkJCQlkc3RfZGJsX2xpbmVzdHJpZGVfeSwJCQkJCQkJCS8vIFR3byBZIGxpbmVzIChkZXBlbmRpbmcgb24gdGhlIHdpZGh0IG9mIHRoZSBkZXN0aW5hdGlvbiByZXNvbHV0aW9uKQorCQkJCVNUUl9CVUYrY3Vycl9kc3RfaWR4LAkJCQkJCQkJLy8gVGFnCisJCQkJMCwgMCApOworCisJCW1mY19wdXQoCXNjYWxlZF92X3BsYW5lW2N1cnJfc3JjX2lkeF0sCQkJCQkJCS8vIFdoYXQgZnJvbSBsb2NhbCBzdG9yZSAoYWRkcikKKwkJCQkodW5zaWduZWQgaW50KSBkc3RfYWRkcl9tYWluX21lbW9yeV92ICsgKGRzdF92dSpkc3RfZGJsX2xpbmVzdHJpZGVfdnUpLAkvLyBEZXN0aW5hdGlvbiBpbiBtYWluIG1lbW9yeSAoYWRkcikKKwkJCQlkc3RfZGJsX2xpbmVzdHJpZGVfdnUsCQkJCQkJCQkvLyBUd28gViBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkJCS8vIFRhZworCQkJCTAsIDAgKTsKKworCQltZmNfcHV0KAlzY2FsZWRfdV9wbGFuZVtjdXJyX3NyY19pZHhdLAkJCQkJCQkvLyBXaGF0IGZyb20gbG9jYWwgc3RvcmUgKGFkZHIpCisJCQkJKHVuc2lnbmVkIGludCkgZHN0X2FkZHJfbWFpbl9tZW1vcnlfdSArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3Z1KSwJLy8gRGVzdGluYXRpb24gaW4gbWFpbiBtZW1vcnkgKGFkZHIpCisJCQkJZHN0X2RibF9saW5lc3RyaWRlX3Z1LAkJCQkJCQkJLy8gVHdvIFUgbGluZXMgKGRlcGVuZGluZyBvbiB0aGUgd2lkaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc29sdXRpb24pCisJCQkJU1RSX0JVRitjdXJyX2RzdF9pZHgsCQkJCQkJCQkvLyBUYWcKKwkJCQkwLCAwICk7CisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCQkvLyB1cGRhdGUgZm9yIG5leHQgY3ljbGUKKwkJY3Vycl9zcmNfaWR4ID0gbmV4dF9zcmNfaWR4OworCQljdXJyX2RzdF9pZHggPSBuZXh0X2RzdF9pZHg7CisKKwkJY3Vycl9pbnRlcnBsX3lfdXBwZXIgPSBuZXh0X2ludGVycGxfeV91cHBlcjsKKwkJY3Vycl9pbnRlcnBsX3lfbG93ZXIgPSBuZXh0X2ludGVycGxfeV9sb3dlcjsKKwkJY3Vycl9pbnRlcnBsX3Z1ID0gbmV4dF9pbnRlcnBsX3Z1OworCisJCXZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlciA9IHZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlcjsKKwkJdmZfY3Vycl9OU3dlaWdodF95X2xvd2VyID0gdmZfY3Vycl9OU3dlaWdodF95X2xvd2VyOworCQl2Zl9jdXJyX05Td2VpZ2h0X3Z1ID0gdmZfbmV4dF9OU3dlaWdodF92dTsKKworCQljdXJyX3NyY195X3VwcGVyID0gbmV4dF9zcmNfeV91cHBlcjsKKwkJY3Vycl9zcmNfeV9sb3dlciA9IG5leHRfc3JjX3lfbG93ZXI7CisJCWN1cnJfc3JjX3Z1ID0gbmV4dF9zcmNfdnU7CisJfQorCisKKworCURNQV9XQUlUX1RBRyggKFJFVFJfQlVGK2N1cnJfc3JjX2lkeCkgKTsKKworCS8vIHNjYWxpbmcKKwkvLyB3b3JrIGxpbmUgeV91cHBlcgorCWJpbGluZWFyX3NjYWxlX2xpbmVfdzE2KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJZHN0X3dpZHRoLAorCQkJdmZfeF9zY2FsZSwKKwkJCXZmX2N1cnJfTlN3ZWlnaHRfeV91cHBlciwKKwkJCXNyY19saW5lc3RyaWRlX3kgKTsKKwkvLyB3b3JrIGxpbmUgeV9sb3dlcgorCWJpbGluZWFyX3NjYWxlX2xpbmVfdzE2KCB5X3BsYW5lW2N1cnJfc3JjX2lkeF0rc3JjX2RibF9saW5lc3RyaWRlX3ksCisJCQlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdK3NjYWxlZF9zcmNfbGluZXN0cmlkZV95LAorCQkJZHN0X3dpZHRoLAorCQkJdmZfeF9zY2FsZSwKKwkJCXZmX2N1cnJfTlN3ZWlnaHRfeV9sb3dlciwKKwkJCXNyY19saW5lc3RyaWRlX3kgKTsKKwkvLyB3b3JrIGxpbmUgdgorCWJpbGluZWFyX3NjYWxlX2xpbmVfdzE2KCB2X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQlzY2FsZWRfdl9wbGFuZVtjdXJyX3NyY19pZHhdLAorCQkJZHN0X3dpZHRoPj4xLAorCQkJdmZfeF9zY2FsZSwKKwkJCXZmX2N1cnJfTlN3ZWlnaHRfdnUsCisJCQlzcmNfbGluZXN0cmlkZV92dSApOworCS8vIHdvcmsgbGluZSB1CisJYmlsaW5lYXJfc2NhbGVfbGluZV93MTYoIHVfcGxhbmVbY3Vycl9zcmNfaWR4XSwKKwkJCXNjYWxlZF91X3BsYW5lW2N1cnJfc3JjX2lkeF0sCisJCQlkc3Rfd2lkdGg+PjEsCisJCQl2Zl94X3NjYWxlLAorCQkJdmZfY3Vycl9OU3dlaWdodF92dSwKKwkJCXNyY19saW5lc3RyaWRlX3Z1ICk7CisKKworCS8vIFN0b3JlIHRoZSByZXN1bHQgYmFjayB0byBtYWluIG1lbW9yeSBpbnRvIGEgZGVzdGluYXRpb24gYnVmZmVyIGluIFlVViBmb3JtYXQKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCURNQV9XQUlUX1RBRyggKFNUUl9CVUYrY3Vycl9kc3RfaWR4KSApOworCisJLy8gUGVyZm9ybSB0aHJlZSBETUEgdHJhbnNmZXJzIHRvIDMgZGlmZmVyZW50IGxvY2F0aW9ucyBpbiB0aGUgbWFpbiBtZW1vcnkhCisJLy8gZHN0X3dpZHRoOglQaXhlbCB3aWR0aCBvZiBkZXN0aW5hdGlvbiBpbWFnZQorCS8vIGRzdF9hZGRyOglEZXN0aW5hdGlvbiBhZGRyZXNzIGluIG1haW4gbWVtb3J5CisJLy8gZHN0X3Z1OglDb3VudGVyIHdoaWNoIGlzIGluY3JlbWVudGVkIG9uZSBieSBvbmUKKwkvLyBkc3RfeToJQ291bnRlciB3aGljaCBpcyB0d2ljZSBsYXJnZXIgdGhhbiBkc3RfdnUgKGRzdF95ID0gMipkc3RfdnUpCisKKwltZmNfcHV0KAlzY2FsZWRfeV9wbGFuZVtjdXJyX3NyY19pZHhdLAkJCQkJCQkvLyBXaGF0IGZyb20gbG9jYWwgc3RvcmUgKGFkZHIpCisJCQkodW5zaWduZWQgaW50KSAgZHN0X2FkZHJfbWFpbl9tZW1vcnlfeSArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3kpLAkvLyBEZXN0aW5hdGlvbiBpbiBtYWluIG1lbW9yeSAoYWRkcikKKwkJCWRzdF9kYmxfbGluZXN0cmlkZV95LAkJCQkJCQkJLy8gVHdvIFkgbGluZXMgKGRlcGVuZGluZyBvbiB0aGUgd2lkaHQgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc29sdXRpb24pCisJCQlTVFJfQlVGK2N1cnJfZHN0X2lkeCwJCQkJCQkJCS8vIFRhZworCQkJMCwgMCApOworCisJbWZjX3B1dCgJc2NhbGVkX3ZfcGxhbmVbY3Vycl9zcmNfaWR4XSwJCQkJCQkJLy8gV2hhdCBmcm9tIGxvY2FsIHN0b3JlIChhZGRyKQorCQkJKHVuc2lnbmVkIGludCkgZHN0X2FkZHJfbWFpbl9tZW1vcnlfdiArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3Z1KSwJLy8gRGVzdGluYXRpb24gaW4gbWFpbiBtZW1vcnkgKGFkZHIpCisJCQlkc3RfZGJsX2xpbmVzdHJpZGVfdnUsCQkJCQkJCQkvLyBUd28gViBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCVNUUl9CVUYrY3Vycl9kc3RfaWR4LAkJCQkJCQkJLy8gVGFnCisJCQkwLCAwICk7CisKKwltZmNfcHV0KAlzY2FsZWRfdV9wbGFuZVtjdXJyX3NyY19pZHhdLAkJCQkJCQkvLyBXaGF0IGZyb20gbG9jYWwgc3RvcmUgKGFkZHIpCisJCQkodW5zaWduZWQgaW50KSAgZHN0X2FkZHJfbWFpbl9tZW1vcnlfdSArIChkc3RfdnUqZHN0X2RibF9saW5lc3RyaWRlX3Z1KSwgLy8gRGVzdGluYXRpb24gaW4gbWFpbiBtZW1vcnkgKGFkZHIpCisJCQlkc3RfZGJsX2xpbmVzdHJpZGVfdnUsCQkJCQkJCQkvLyBUd28gVSBsaW5lcyAoZGVwZW5kaW5nIG9uIHRoZSB3aWRodCBvZiB0aGUgZGVzdGluYXRpb24gcmVzb2x1dGlvbikKKwkJCVNUUl9CVUYrY3Vycl9kc3RfaWR4LAkJCQkJCQkJLy8gVGFnCisJCQkwLCAwICk7CisKKwkvLyB3YWl0IGZvciBjb21wbGV0aW9uCisJRE1BX1dBSVRfVEFHKCAoU1RSX0JVRitjdXJyX2RzdF9pZHgpICk7CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK30KKworCisvKgorICogYmlsaW5lYXJfc2NhbGVfbGluZV93OCgpCisgKgorICogcHJvY2Vzc2VzIGEgbGluZSBvZiB5dXYtaW5wdXQsIHdpZHRoIGhhcyB0byBiZSBhIG11bHRpcGxlIG9mIDgKKyAqIHNjYWxlZCB5dXYtb3V0cHV0IGlzIHdyaXR0ZW4gdG8gbG9jYWwgc3RvcmUgYnVmZmVyCisgKgorICogQHBhcmFtIHNyYyBidWZmZXIgZm9yIDIgbGluZXMgaW5wdXQKKyAqIEBwYXJhbSBkc3RfIGJ1ZmZlciBmb3IgMSBsaW5lIG91dHB1dAorICogQHBhcmFtIGRzdF93aWR0aCB0aGUgd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIGxpbmUKKyAqIEBwYXJhbSB2Zl94X3NjYWxlIGEgZmxvYXQgdmVjdG9yLCBhdCBlYWNoIGVudHJ5IGlzIHRoZSB4X3NjYWxlLWZhY3RvcgorICogQHBhcmFtIHZmX05Td2VpZ2h0IGEgZmxvYXQgdmVjdG9yLCBhdCBlYWNoIHBvc2l0aW9uIGlzIHRoZSB3ZWlnaHQgTk9SVEgvU09VVEggZm9yIHRoZSBjdXJyZW50IGxpbmUKKyAqIEBwYXJhbSBzcmNfbGluZXN0cmlkZSB0aGUgc3RyaWRlIG9mIHRoZSBzcmNsaW5lCisgKi8KK3ZvaWQgYmlsaW5lYXJfc2NhbGVfbGluZV93OCggdW5zaWduZWQgY2hhciogc3JjLCB1bnNpZ25lZCBjaGFyKiBkc3RfLCB1bnNpZ25lZCBpbnQgZHN0X3dpZHRoLCB2ZWN0b3IgZmxvYXQgdmZfeF9zY2FsZSwgdmVjdG9yIGZsb2F0IHZmX05Td2VpZ2h0LCB1bnNpZ25lZCBpbnQgc3JjX2xpbmVzdHJpZGUgKSB7CisKKwl1bnNpZ25lZCBjaGFyKiBkc3QgPSBkc3RfOworCisJdW5zaWduZWQgaW50IGRzdF94OworCWZvciggZHN0X3g9MDsgZHN0X3g8ZHN0X3dpZHRoOyBkc3RfeCs9OCkgeworCQkvLyBhZGRyZXNzIGNhbGN1bGF0aW9uIGZvciBsb2FkaW5nIHRoZSA0IHN1cnJvdW5kaW5nIHBpeGVsIG9mIGVhY2ggY2FsY3VsYXRlZAorCQkvLyBkZXN0aW5hdGlvbiBwaXhlbAorCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9kc3RfeF90bXAgPSBzcHVfc3BsYXRzKCBkc3RfeCApOworCQkvLyBsb3dlciByYW5nZS0+Zmlyc3QgNCBwaXhlbAorCQkvLyB1cHBlciByYW5nZS0+bmV4dCA0IHBpeGVsCisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2luY19kc3RfeF9sb3dlcl9yYW5nZSA9IHsgMCwgMSwgMiwgMyB9OworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9pbmNfZHN0X3hfdXBwZXJfcmFuZ2UgPSB7IDQsIDUsIDYsIDcgfTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfZHN0X3hfbG93ZXJfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfZHN0X3hfdG1wLCB2dWlfaW5jX2RzdF94X2xvd2VyX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2RzdF94X3VwcGVyX3JhbmdlID0gc3B1X2FkZCggdnVpX2RzdF94X3RtcCwgdnVpX2luY19kc3RfeF91cHBlcl9yYW5nZSApOworCisJCS8vIGNhbGN1bGF0ZSB3ZWlnaHQgRUFTVC1XRVNUCisJCXZlY3RvciBmbG9hdCB2Zl9kc3RfeF9sb3dlcl9yYW5nZSA9IHNwdV9jb252dGYoIHZ1aV9kc3RfeF9sb3dlcl9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfZHN0X3hfdXBwZXJfcmFuZ2UgPSBzcHVfY29udnRmKCB2dWlfZHN0X3hfdXBwZXJfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3NyY194X2xvd2VyX3JhbmdlID0gc3B1X211bCggdmZfZHN0X3hfbG93ZXJfcmFuZ2UsIHZmX3hfc2NhbGUgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3NyY194X3VwcGVyX3JhbmdlID0gc3B1X211bCggdmZfZHN0X3hfdXBwZXJfcmFuZ2UsIHZmX3hfc2NhbGUgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfaW50ZXJwbF94X2xvd2VyX3JhbmdlID0gc3B1X2NvbnZ0dSggdmZfc3JjX3hfbG93ZXJfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfaW50ZXJwbF94X3VwcGVyX3JhbmdlID0gc3B1X2NvbnZ0dSggdmZfc3JjX3hfdXBwZXJfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX2ludGVycGxfeF9sb3dlcl9yYW5nZSA9IHNwdV9jb252dGYoIHZ1aV9pbnRlcnBsX3hfbG93ZXJfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX2ludGVycGxfeF91cHBlcl9yYW5nZSA9IHNwdV9jb252dGYoIHZ1aV9pbnRlcnBsX3hfdXBwZXJfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX0VXd2VpZ2h0X2xvd2VyX3JhbmdlID0gc3B1X3N1YiggdmZfc3JjX3hfbG93ZXJfcmFuZ2UsIHZmX2ludGVycGxfeF9sb3dlcl9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVd3ZWlnaHRfdXBwZXJfcmFuZ2UgPSBzcHVfc3ViKCB2Zl9zcmNfeF91cHBlcl9yYW5nZSwgdmZfaW50ZXJwbF94X3VwcGVyX3JhbmdlICk7CisKKwkJLy8gY2FsY3VsYXRlIGFkZHJlc3Mgb2Zmc2V0CisJCS8vCisJCS8vIHBpeGVsIE5PUlRIIFdFU1QKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsTldfbG93ZXJfcmFuZ2UgPSB2dWlfaW50ZXJwbF94X2xvd2VyX3JhbmdlOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9vZmZfcGl4ZWxOV191cHBlcl9yYW5nZSA9IHZ1aV9pbnRlcnBsX3hfdXBwZXJfcmFuZ2U7CisKKwkJLy8gcGl4ZWwgTk9SVEggRUFTVC0tPihvZmZwaXhlbE5XKzEpCisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZF8xID0geyAxLCAxLCAxLCAxIH07CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbE5FX2xvd2VyX3JhbmdlID0gc3B1X2FkZCggdnVpX29mZl9waXhlbE5XX2xvd2VyX3JhbmdlLCB2dWlfYWRkXzEgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsTkVfdXBwZXJfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfb2ZmX3BpeGVsTldfdXBwZXJfcmFuZ2UsIHZ1aV9hZGRfMSApOworCisJCS8vIFNPVVRILVdFU1QtLT4ob2ZmcGl4ZWxOVytzcmNfbGluZXN0cmlkZSkKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfc3JjbGluZXN0cmlkZSA9IHNwdV9zcGxhdHMoIHNyY19saW5lc3RyaWRlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbFNXX2xvd2VyX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY2xpbmVzdHJpZGUsIHZ1aV9vZmZfcGl4ZWxOV19sb3dlcl9yYW5nZSApOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9vZmZfcGl4ZWxTV191cHBlcl9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNsaW5lc3RyaWRlLCB2dWlfb2ZmX3BpeGVsTldfdXBwZXJfcmFuZ2UgKTsKKworCQkvLyBTT1VUSC1FQVNULS0+KG9mZnBpeGVsTlcrc3JjX2xpbmVzdHJpZGUrMSkKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsU0VfbG93ZXJfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjbGluZXN0cmlkZSwgdnVpX29mZl9waXhlbE5FX2xvd2VyX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbFNFX3VwcGVyX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY2xpbmVzdHJpZGUsIHZ1aV9vZmZfcGl4ZWxORV91cHBlcl9yYW5nZSApOworCisJCS8vIGNhbGN1bGF0ZSBlYWNoIGFkZHJlc3MKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfc3JjX2xzID0gc3B1X3NwbGF0cyggKHVuc2lnbmVkIGludCkgc3JjICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxOV19sb3dlcl9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNfbHMsIHZ1aV9vZmZfcGl4ZWxOV19sb3dlcl9yYW5nZSApOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9hZGRyX3BpeGVsTldfdXBwZXJfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjX2xzLCB2dWlfb2ZmX3BpeGVsTldfdXBwZXJfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfYWRkcl9waXhlbE5FX2xvd2VyX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY19scywgdnVpX29mZl9waXhlbE5FX2xvd2VyX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxORV91cHBlcl9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNfbHMsIHZ1aV9vZmZfcGl4ZWxORV91cHBlcl9yYW5nZSApOworCisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxTV19sb3dlcl9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNfbHMsIHZ1aV9vZmZfcGl4ZWxTV19sb3dlcl9yYW5nZSApOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9hZGRyX3BpeGVsU1dfdXBwZXJfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjX2xzLCB2dWlfb2ZmX3BpeGVsU1dfdXBwZXJfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfYWRkcl9waXhlbFNFX2xvd2VyX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY19scywgdnVpX29mZl9waXhlbFNFX2xvd2VyX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxTRV91cHBlcl9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNfbHMsIHZ1aV9vZmZfcGl4ZWxTRV91cHBlcl9yYW5nZSApOworCisJCS8vIGdldCBlYWNoIHBpeGVsCisJCS8vCisJCS8vIHNjYWxhciBsb2FkLCBhZnRlcndhcmRzIGluc2VydGlvbiBpbnRvIHRoZSByaWdodCBwb3NpdGlvbgorCQkvLyBOT1JUSCBXRVNUCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIG51bGxfdmVjdG9yID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OworCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcGl4ZWxfTldfbG93ZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxOV19sb3dlcl9yYW5nZSwgMCApKSwgbnVsbF92ZWN0b3IsIDMgKTsKKwkJdnVjX3BpeGVsX05XX2xvd2VyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfbG93ZXJfcmFuZ2UsIDEgKSksCisJCQkJdnVjX3BpeGVsX05XX2xvd2VyX3JhbmdlLCA3ICk7CisJCXZ1Y19waXhlbF9OV19sb3dlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5XX2xvd2VyX3JhbmdlLCAyICkpLAorCQkJCXZ1Y19waXhlbF9OV19sb3dlcl9yYW5nZSwgMTEgKTsKKwkJdnVjX3BpeGVsX05XX2xvd2VyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfbG93ZXJfcmFuZ2UsIDMgKSksCisJCQkJdnVjX3BpeGVsX05XX2xvd2VyX3JhbmdlLCAxNSApOworCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9OV191cHBlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5XX3VwcGVyX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfTldfdXBwZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxOV191cHBlcl9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfTldfdXBwZXJfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX05XX3VwcGVyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfdXBwZXJfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX05XX3VwcGVyX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfTldfdXBwZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxOV191cHBlcl9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfTldfdXBwZXJfcmFuZ2UsIDE1ICk7CisKKwkJLy8gTk9SVEggRUFTVAorCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcGl4ZWxfTkVfbG93ZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxORV9sb3dlcl9yYW5nZSwgMCApKSwgbnVsbF92ZWN0b3IsIDMgKTsKKwkJdnVjX3BpeGVsX05FX2xvd2VyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTkVfbG93ZXJfcmFuZ2UsIDEgKSksCisJCQkJdnVjX3BpeGVsX05FX2xvd2VyX3JhbmdlLCA3ICk7CisJCXZ1Y19waXhlbF9ORV9sb3dlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX2xvd2VyX3JhbmdlLCAyICkpLAorCQkJCXZ1Y19waXhlbF9ORV9sb3dlcl9yYW5nZSwgMTEgKTsKKwkJdnVjX3BpeGVsX05FX2xvd2VyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTkVfbG93ZXJfcmFuZ2UsIDMgKSksCisJCQkJdnVjX3BpeGVsX05FX2xvd2VyX3JhbmdlLCAxNSApOworCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9ORV91cHBlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX3VwcGVyX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfTkVfdXBwZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxORV91cHBlcl9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfTkVfdXBwZXJfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX05FX3VwcGVyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTkVfdXBwZXJfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX05FX3VwcGVyX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfTkVfdXBwZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxORV91cHBlcl9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfTkVfdXBwZXJfcmFuZ2UsIDE1ICk7CisKKworCQkvLyBTT1VUSCBXRVNUCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9TV19sb3dlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNXX2xvd2VyX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfU1dfbG93ZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV19sb3dlcl9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfU1dfbG93ZXJfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX1NXX2xvd2VyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU1dfbG93ZXJfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX1NXX2xvd2VyX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfU1dfbG93ZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV19sb3dlcl9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfU1dfbG93ZXJfcmFuZ2UsIDE1ICk7CisKKwkJdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnVjX3BpeGVsX1NXX3VwcGVyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU1dfdXBwZXJfcmFuZ2UsIDAgKSksIG51bGxfdmVjdG9yLCAzICk7CisJCXZ1Y19waXhlbF9TV191cHBlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNXX3VwcGVyX3JhbmdlLCAxICkpLAorCQkJCXZ1Y19waXhlbF9TV191cHBlcl9yYW5nZSwgNyApOworCQl2dWNfcGl4ZWxfU1dfdXBwZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV191cHBlcl9yYW5nZSwgMiApKSwKKwkJCQl2dWNfcGl4ZWxfU1dfdXBwZXJfcmFuZ2UsIDExICk7CisJCXZ1Y19waXhlbF9TV191cHBlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNXX3VwcGVyX3JhbmdlLCAzICkpLAorCQkJCXZ1Y19waXhlbF9TV191cHBlcl9yYW5nZSwgMTUgKTsKKworCQkvLyBTT1VUSCBFQVNUCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9TRV9sb3dlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNFX2xvd2VyX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfU0VfbG93ZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTRV9sb3dlcl9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfU0VfbG93ZXJfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX1NFX2xvd2VyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0VfbG93ZXJfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX1NFX2xvd2VyX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfU0VfbG93ZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTRV9sb3dlcl9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfU0VfbG93ZXJfcmFuZ2UsIDE1ICk7CisKKwkJdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnVjX3BpeGVsX1NFX3VwcGVyX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0VfdXBwZXJfcmFuZ2UsIDAgKSksIG51bGxfdmVjdG9yLCAzICk7CisJCXZ1Y19waXhlbF9TRV91cHBlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNFX3VwcGVyX3JhbmdlLCAxICkpLAorCQkJCXZ1Y19waXhlbF9TRV91cHBlcl9yYW5nZSwgNyApOworCQl2dWNfcGl4ZWxfU0VfdXBwZXJfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTRV91cHBlcl9yYW5nZSwgMiApKSwKKwkJCQl2dWNfcGl4ZWxfU0VfdXBwZXJfcmFuZ2UsIDExICk7CisJCXZ1Y19waXhlbF9TRV91cHBlcl9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNFX3VwcGVyX3JhbmdlLCAzICkpLAorCQkJCXZ1Y19waXhlbF9TRV91cHBlcl9yYW5nZSwgMTUgKTsKKworCisJCS8vIGNvbnZlcnQgdG8gZmxvYXQKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX05XX2xvd2VyX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9OV19sb3dlcl9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfTldfdXBwZXJfcmFuZ2UgPSBzcHVfY29udnRmKCAodmVjdG9yIHVuc2lnbmVkIGludCkgdnVjX3BpeGVsX05XX3VwcGVyX3JhbmdlLCAwICk7CisKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX1NXX2xvd2VyX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9TV19sb3dlcl9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfU1dfdXBwZXJfcmFuZ2UgPSBzcHVfY29udnRmKCAodmVjdG9yIHVuc2lnbmVkIGludCkgdnVjX3BpeGVsX1NXX3VwcGVyX3JhbmdlLCAwICk7CisKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX05FX2xvd2VyX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9ORV9sb3dlcl9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfTkVfdXBwZXJfcmFuZ2UgPSBzcHVfY29udnRmKCAodmVjdG9yIHVuc2lnbmVkIGludCkgdnVjX3BpeGVsX05FX3VwcGVyX3JhbmdlLCAwICk7CisKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX1NFX2xvd2VyX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9TRV9sb3dlcl9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfU0VfdXBwZXJfcmFuZ2UgPSBzcHVfY29udnRmKCAodmVjdG9yIHVuc2lnbmVkIGludCkgdnVjX3BpeGVsX1NFX3VwcGVyX3JhbmdlLCAwICk7CisKKworCisJCS8vIGZpcnN0IGxpbmVhciBpbnRlcnBvbGF0aW9uOiBFV3RvcAorCQkvLyBFV3RvcCA9IE5XICsgRVd3ZWlnaHQqKE5FLU5XKQorCQkvLworCQkvLyBsb3dlciByYW5nZQorCQl2ZWN0b3IgZmxvYXQgdmZfRVd0b3BfbG93ZXJfcmFuZ2VfdG1wID0gc3B1X3N1YiggdmZfcGl4ZWxfTkVfbG93ZXJfcmFuZ2UsIHZmX3BpeGVsX05XX2xvd2VyX3JhbmdlICk7CisJCXZlY3RvciBmbG9hdCB2Zl9FV3RvcF9sb3dlcl9yYW5nZSA9IHNwdV9tYWRkKCB2Zl9FV3dlaWdodF9sb3dlcl9yYW5nZSwKKwkJCQkJCQkJdmZfRVd0b3BfbG93ZXJfcmFuZ2VfdG1wLAorCQkJCQkJCQl2Zl9waXhlbF9OV19sb3dlcl9yYW5nZSApOworCisJCS8vIHVwcGVyIHJhbmdlCisJCXZlY3RvciBmbG9hdCB2Zl9FV3RvcF91cHBlcl9yYW5nZV90bXAgPSBzcHVfc3ViKCB2Zl9waXhlbF9ORV91cHBlcl9yYW5nZSwgdmZfcGl4ZWxfTldfdXBwZXJfcmFuZ2UgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX0VXdG9wX3VwcGVyX3JhbmdlID0gc3B1X21hZGQoIHZmX0VXd2VpZ2h0X3VwcGVyX3JhbmdlLAorCQkJCQkJCQl2Zl9FV3RvcF91cHBlcl9yYW5nZV90bXAsCisJCQkJCQkJCXZmX3BpeGVsX05XX3VwcGVyX3JhbmdlICk7CisKKworCisJCS8vIHNlY29uZCBsaW5lYXIgaW50ZXJwb2xhdGlvbjogRVdib3R0b20KKwkJLy8gRVdib3R0b20gPSBTVyArIEVXd2VpZ2h0KihTRS1TVykKKwkJLy8KKwkJLy8gbG93ZXIgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX0VXYm90dG9tX2xvd2VyX3JhbmdlX3RtcCA9IHNwdV9zdWIoIHZmX3BpeGVsX1NFX2xvd2VyX3JhbmdlLCB2Zl9waXhlbF9TV19sb3dlcl9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVdib3R0b21fbG93ZXJfcmFuZ2UgPSBzcHVfbWFkZCggdmZfRVd3ZWlnaHRfbG93ZXJfcmFuZ2UsCisJCQkJCQkJCXZmX0VXYm90dG9tX2xvd2VyX3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfcGl4ZWxfU1dfbG93ZXJfcmFuZ2UgKTsKKworCQkvLyB1cHBlciByYW5nZQorCQl2ZWN0b3IgZmxvYXQgdmZfRVdib3R0b21fdXBwZXJfcmFuZ2VfdG1wID0gc3B1X3N1YiggdmZfcGl4ZWxfU0VfdXBwZXJfcmFuZ2UsIHZmX3BpeGVsX1NXX3VwcGVyX3JhbmdlICk7CisJCXZlY3RvciBmbG9hdCB2Zl9FV2JvdHRvbV91cHBlcl9yYW5nZSA9IHNwdV9tYWRkKCB2Zl9FV3dlaWdodF91cHBlcl9yYW5nZSwKKwkJCQkJCQkJdmZfRVdib3R0b21fdXBwZXJfcmFuZ2VfdG1wLAorCQkJCQkJCQl2Zl9waXhlbF9TV191cHBlcl9yYW5nZSApOworCisKKworCQkvLyB0aGlyZCBsaW5lYXIgaW50ZXJwb2xhdGlvbjogdGhlIGJpbGluZWFyIGludGVycG9sYXRlZCB2YWx1ZQorCQkvLyByZXN1bHQgPSBFV3RvcCArIE5Td2VpZ2h0KihFV2JvdHRvbS1FV3RvcCk7CisJCS8vCisJCS8vIGxvd2VyIHJhbmdlCisJCXZlY3RvciBmbG9hdCB2Zl9yZXN1bHRfbG93ZXJfcmFuZ2VfdG1wID0gc3B1X3N1YiggdmZfRVdib3R0b21fbG93ZXJfcmFuZ2UsIHZmX0VXdG9wX2xvd2VyX3JhbmdlICk7CisJCXZlY3RvciBmbG9hdCB2Zl9yZXN1bHRfbG93ZXJfcmFuZ2UgPSBzcHVfbWFkZCggdmZfTlN3ZWlnaHQsCisJCQkJCQkJCXZmX3Jlc3VsdF9sb3dlcl9yYW5nZV90bXAsCisJCQkJCQkJCXZmX0VXdG9wX2xvd2VyX3JhbmdlICk7CisKKwkJLy8gdXBwZXIgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX3Jlc3VsdF91cHBlcl9yYW5nZV90bXAgPSBzcHVfc3ViKCB2Zl9FV2JvdHRvbV91cHBlcl9yYW5nZSwgdmZfRVd0b3BfdXBwZXJfcmFuZ2UgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3Jlc3VsdF91cHBlcl9yYW5nZSA9IHNwdV9tYWRkKCB2Zl9OU3dlaWdodCwKKwkJCQkJCQkJdmZfcmVzdWx0X3VwcGVyX3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfRVd0b3BfdXBwZXJfcmFuZ2UgKTsKKworCisJCS8vIGNvbnZlcnQgYmFjazogdXNpbmcgc2F0dXJhdGVkIGFyaXRobWV0aWMKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfcmVzdWx0X2xvd2VyX3JhbmdlID0gdmZsb2F0X3RvX3Z1aW50KCB2Zl9yZXN1bHRfbG93ZXJfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfcmVzdWx0X3VwcGVyX3JhbmdlID0gdmZsb2F0X3RvX3Z1aW50KCB2Zl9yZXN1bHRfdXBwZXJfcmFuZ2UgKTsKKworCQkvLyBtZXJnZSByZXN1bHRzLT5sb3dlcix1cHBlcgorCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfbWFza19tZXJnZV9yZXN1bHQgPSB7IDB4MDMsIDB4MDcsIDB4MEIsIDB4MEYsCisJCQkJCQkJICAgICAgIDB4MTMsIDB4MTcsIDB4MUIsIDB4MUYsCisJCQkJCQkJICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkJCQkJICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcmVzdWx0ID0gc3B1X3NodWZmbGUoICh2ZWN0b3IgdW5zaWduZWQgY2hhcikgdnVpX3Jlc3VsdF9sb3dlcl9yYW5nZSwKKwkJCQkJCQkJKHZlY3RvciB1bnNpZ25lZCBjaGFyKSB2dWlfcmVzdWx0X3VwcGVyX3JhbmdlLAorCQkJCQkJCQl2dWNfbWFza19tZXJnZV9yZXN1bHQgKTsKKworCQkvLyBwYXJ0aWFsIHN0b3JpbmcKKwkJdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnVjX21hc2tfb3V0ID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkJCQkJICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJCQkJCSAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJCQkJCQkgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CisKKworCQkvLyBnZXQgY3VycmVudGx5IHN0b3JlZCBkYXRhCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19vcmlnID0gKigodmVjdG9yIHVuc2lnbmVkIGNoYXIqKWRzdCk7CisKKwkJLy8gY2xlYXIgY3VycmVudGx5IHN0b3JlZCBkYXRhCisJCXZ1Y19vcmlnID0gc3B1X2FuZCggdnVjX29yaWcsCisJCQkJc3B1X3JscXdieXRlKCB2dWNfbWFza19vdXQsICgodW5zaWduZWQgaW50KWRzdCkmMHgwRikgKTsKKworCQkvLyByb3RhdGUgcmVzdWx0IGFjY29yZGluZyB0byBzdG9yaW5nIGFkZHJlc3MKKwkJdnVjX3Jlc3VsdCA9IHNwdV9ybHF3Ynl0ZSggdnVjX3Jlc3VsdCwgKCh1bnNpZ25lZCBpbnQpZHN0KSYweDBGICk7CisKKwkJLy8gc3RvcmUgcmVzdWx0CisJCSooKHZlY3RvciB1bnNpZ25lZCBjaGFyKilkc3QpID0gc3B1X29yKCB2dWNfcmVzdWx0LAorCQkJCQkJCXZ1Y19vcmlnICk7CisJCWRzdCArPSA4OworCX0KK30KKworCisvKgorICogYmlsaW5lYXJfc2NhbGVfbGluZV93MTYoKQorICoKKyAqIHByb2Nlc3NlcyBhIGxpbmUgb2YgeXV2LWlucHV0LCB3aWR0aCBoYXMgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNgorICogc2NhbGVkIHl1di1vdXRwdXQgaXMgd3JpdHRlbiB0byBsb2NhbCBzdG9yZSBidWZmZXIKKyAqCisgKiBAcGFyYW0gc3JjIGJ1ZmZlciBmb3IgMiBsaW5lcyBpbnB1dAorICogQHBhcmFtIGRzdF8gYnVmZmVyIGZvciAxIGxpbmUgb3V0cHV0CisgKiBAcGFyYW0gZHN0X3dpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gbGluZQorICogQHBhcmFtIHZmX3hfc2NhbGUgYSBmbG9hdCB2ZWN0b3IsIGF0IGVhY2ggZW50cnkgaXMgdGhlIHhfc2NhbGUtZmFjdG9yCisgKiBAcGFyYW0gdmZfTlN3ZWlnaHQgYSBmbG9hdCB2ZWN0b3IsIGF0IGVhY2ggcG9zaXRpb24gaXMgdGhlIHdlaWdodCBOT1JUSC9TT1VUSCBmb3IgdGhlIGN1cnJlbnQgbGluZQorICogQHBhcmFtIHNyY19saW5lc3RyaWRlIHRoZSBzdHJpZGUgb2YgdGhlIHNyY2xpbmUKKyAqLwordm9pZCBiaWxpbmVhcl9zY2FsZV9saW5lX3cxNiggdW5zaWduZWQgY2hhciogc3JjLCB1bnNpZ25lZCBjaGFyKiBkc3RfLCB1bnNpZ25lZCBpbnQgZHN0X3dpZHRoLCB2ZWN0b3IgZmxvYXQgdmZfeF9zY2FsZSwgdmVjdG9yIGZsb2F0IHZmX05Td2VpZ2h0LCB1bnNpZ25lZCBpbnQgc3JjX2xpbmVzdHJpZGUgKSB7CisKKwl1bnNpZ25lZCBjaGFyKiBkc3QgPSBkc3RfOworCisJdW5zaWduZWQgaW50IGRzdF94OworCWZvciggZHN0X3g9MDsgZHN0X3g8ZHN0X3dpZHRoOyBkc3RfeCs9MTYpIHsKKwkJLy8gYWRkcmVzcyBjYWxjdWxhdGlvbiBmb3IgbG9hZGluZyB0aGUgNCBzdXJyb3VuZGluZyBwaXhlbCBvZiBlYWNoIGNhbGN1bGF0ZWQKKwkJLy8gZGVzdGluYXRpb24gcGl4ZWwKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfZHN0X3hfdG1wID0gc3B1X3NwbGF0cyggZHN0X3ggKTsKKwkJLy8gcGFyYWxsZWxpc2VkIHByb2Nlc3NpbmcKKwkJLy8gZmlyc3QgcmFuZ2UtPnBpeGVsIDEgMiAzIDQKKwkJLy8gc2Vjb25kIHJhbmdlLT5waXhlbCA1IDYgNyA4CisJCS8vIHRoaXJkIHJhbmdlLT5waXhlbCA5IDEwIDExIDEyCisJCS8vIGZvdXJ0aCByYW5nZS0+cGl4ZWwgMTMgMTQgMTUgMTYKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfaW5jX2RzdF94X2ZpcnN0X3JhbmdlID0geyAwLCAxLCAyLCAzIH07CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2luY19kc3RfeF9zZWNvbmRfcmFuZ2UgPSB7IDQsIDUsIDYsIDcgfTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfaW5jX2RzdF94X3RoaXJkX3JhbmdlID0geyA4LCA5LCAxMCwgMTEgfTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfaW5jX2RzdF94X2ZvdXJ0aF9yYW5nZSA9IHsgMTIsIDEzLCAxNCwgMTUgfTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfZHN0X3hfZmlyc3RfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfZHN0X3hfdG1wLCB2dWlfaW5jX2RzdF94X2ZpcnN0X3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2RzdF94X3NlY29uZF9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9kc3RfeF90bXAsIHZ1aV9pbmNfZHN0X3hfc2Vjb25kX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2RzdF94X3RoaXJkX3JhbmdlID0gc3B1X2FkZCggdnVpX2RzdF94X3RtcCwgdnVpX2luY19kc3RfeF90aGlyZF9yYW5nZSApOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9kc3RfeF9mb3VydGhfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfZHN0X3hfdG1wLCB2dWlfaW5jX2RzdF94X2ZvdXJ0aF9yYW5nZSApOworCisJCS8vIGNhbGN1bGF0ZSB3ZWlnaHQgRUFTVC1XRVNUCisJCXZlY3RvciBmbG9hdCB2Zl9kc3RfeF9maXJzdF9yYW5nZSA9IHNwdV9jb252dGYoIHZ1aV9kc3RfeF9maXJzdF9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfZHN0X3hfc2Vjb25kX3JhbmdlID0gc3B1X2NvbnZ0ZiggdnVpX2RzdF94X3NlY29uZF9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfZHN0X3hfdGhpcmRfcmFuZ2UgPSBzcHVfY29udnRmKCB2dWlfZHN0X3hfdGhpcmRfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX2RzdF94X2ZvdXJ0aF9yYW5nZSA9IHNwdV9jb252dGYoIHZ1aV9kc3RfeF9mb3VydGhfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3NyY194X2ZpcnN0X3JhbmdlID0gc3B1X211bCggdmZfZHN0X3hfZmlyc3RfcmFuZ2UsIHZmX3hfc2NhbGUgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3NyY194X3NlY29uZF9yYW5nZSA9IHNwdV9tdWwoIHZmX2RzdF94X3NlY29uZF9yYW5nZSwgdmZfeF9zY2FsZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfc3JjX3hfdGhpcmRfcmFuZ2UgPSBzcHVfbXVsKCB2Zl9kc3RfeF90aGlyZF9yYW5nZSwgdmZfeF9zY2FsZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfc3JjX3hfZm91cnRoX3JhbmdlID0gc3B1X211bCggdmZfZHN0X3hfZm91cnRoX3JhbmdlLCB2Zl94X3NjYWxlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2ludGVycGxfeF9maXJzdF9yYW5nZSA9IHNwdV9jb252dHUoIHZmX3NyY194X2ZpcnN0X3JhbmdlLCAwICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2ludGVycGxfeF9zZWNvbmRfcmFuZ2UgPSBzcHVfY29udnR1KCB2Zl9zcmNfeF9zZWNvbmRfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfaW50ZXJwbF94X3RoaXJkX3JhbmdlID0gc3B1X2NvbnZ0dSggdmZfc3JjX3hfdGhpcmRfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfaW50ZXJwbF94X2ZvdXJ0aF9yYW5nZSA9IHNwdV9jb252dHUoIHZmX3NyY194X2ZvdXJ0aF9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfaW50ZXJwbF94X2ZpcnN0X3JhbmdlID0gc3B1X2NvbnZ0ZiggdnVpX2ludGVycGxfeF9maXJzdF9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfaW50ZXJwbF94X3NlY29uZF9yYW5nZSA9IHNwdV9jb252dGYoIHZ1aV9pbnRlcnBsX3hfc2Vjb25kX3JhbmdlLCAwICk7CisJCXZlY3RvciBmbG9hdCB2Zl9pbnRlcnBsX3hfdGhpcmRfcmFuZ2UgPSBzcHVfY29udnRmKCB2dWlfaW50ZXJwbF94X3RoaXJkX3JhbmdlLCAwICk7CisJCXZlY3RvciBmbG9hdCB2Zl9pbnRlcnBsX3hfZm91cnRoX3JhbmdlID0gc3B1X2NvbnZ0ZiggdnVpX2ludGVycGxfeF9mb3VydGhfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX0VXd2VpZ2h0X2ZpcnN0X3JhbmdlID0gc3B1X3N1YiggdmZfc3JjX3hfZmlyc3RfcmFuZ2UsIHZmX2ludGVycGxfeF9maXJzdF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVd3ZWlnaHRfc2Vjb25kX3JhbmdlID0gc3B1X3N1YiggdmZfc3JjX3hfc2Vjb25kX3JhbmdlLCB2Zl9pbnRlcnBsX3hfc2Vjb25kX3JhbmdlICk7CisJCXZlY3RvciBmbG9hdCB2Zl9FV3dlaWdodF90aGlyZF9yYW5nZSA9IHNwdV9zdWIoIHZmX3NyY194X3RoaXJkX3JhbmdlLCB2Zl9pbnRlcnBsX3hfdGhpcmRfcmFuZ2UgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX0VXd2VpZ2h0X2ZvdXJ0aF9yYW5nZSA9IHNwdV9zdWIoIHZmX3NyY194X2ZvdXJ0aF9yYW5nZSwgdmZfaW50ZXJwbF94X2ZvdXJ0aF9yYW5nZSApOworCisJCS8vIGNhbGN1bGF0ZSBhZGRyZXNzIG9mZnNldAorCQkvLworCQkvLyBwaXhlbCBOT1JUSCBXRVNUCisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbE5XX2ZpcnN0X3JhbmdlID0gdnVpX2ludGVycGxfeF9maXJzdF9yYW5nZTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsTldfc2Vjb25kX3JhbmdlID0gdnVpX2ludGVycGxfeF9zZWNvbmRfcmFuZ2U7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbE5XX3RoaXJkX3JhbmdlID0gdnVpX2ludGVycGxfeF90aGlyZF9yYW5nZTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsTldfZm91cnRoX3JhbmdlID0gdnVpX2ludGVycGxfeF9mb3VydGhfcmFuZ2U7CisKKwkJLy8gcGl4ZWwgTk9SVEggRUFTVC0tPihvZmZwaXhlbE5XKzEpCisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZF8xID0geyAxLCAxLCAxLCAxIH07CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbE5FX2ZpcnN0X3JhbmdlID0gc3B1X2FkZCggdnVpX29mZl9waXhlbE5XX2ZpcnN0X3JhbmdlLCB2dWlfYWRkXzEgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsTkVfc2Vjb25kX3JhbmdlID0gc3B1X2FkZCggdnVpX29mZl9waXhlbE5XX3NlY29uZF9yYW5nZSwgdnVpX2FkZF8xICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbE5FX3RoaXJkX3JhbmdlID0gc3B1X2FkZCggdnVpX29mZl9waXhlbE5XX3RoaXJkX3JhbmdlLCB2dWlfYWRkXzEgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsTkVfZm91cnRoX3JhbmdlID0gc3B1X2FkZCggdnVpX29mZl9waXhlbE5XX2ZvdXJ0aF9yYW5nZSwgdnVpX2FkZF8xICk7CisKKwkJLy8gU09VVEgtV0VTVC0tPihvZmZwaXhlbE5XK3NyY19saW5lc3RyaWRlKQorCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9zcmNsaW5lc3RyaWRlID0gc3B1X3NwbGF0cyggc3JjX2xpbmVzdHJpZGUgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsU1dfZmlyc3RfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjbGluZXN0cmlkZSwgdnVpX29mZl9waXhlbE5XX2ZpcnN0X3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbFNXX3NlY29uZF9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNsaW5lc3RyaWRlLCB2dWlfb2ZmX3BpeGVsTldfc2Vjb25kX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbFNXX3RoaXJkX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY2xpbmVzdHJpZGUsIHZ1aV9vZmZfcGl4ZWxOV190aGlyZF9yYW5nZSApOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9vZmZfcGl4ZWxTV19mb3VydGhfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjbGluZXN0cmlkZSwgdnVpX29mZl9waXhlbE5XX2ZvdXJ0aF9yYW5nZSApOworCisJCS8vIFNPVVRILUVBU1QtLT4ob2ZmcGl4ZWxOVytzcmNfbGluZXN0cmlkZSsxKQorCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9vZmZfcGl4ZWxTRV9maXJzdF9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNsaW5lc3RyaWRlLCB2dWlfb2ZmX3BpeGVsTkVfZmlyc3RfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsU0Vfc2Vjb25kX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY2xpbmVzdHJpZGUsIHZ1aV9vZmZfcGl4ZWxORV9zZWNvbmRfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfb2ZmX3BpeGVsU0VfdGhpcmRfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjbGluZXN0cmlkZSwgdnVpX29mZl9waXhlbE5FX3RoaXJkX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX29mZl9waXhlbFNFX2ZvdXJ0aF9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNsaW5lc3RyaWRlLCB2dWlfb2ZmX3BpeGVsTkVfZm91cnRoX3JhbmdlICk7CisKKwkJLy8gY2FsY3VsYXRlIGVhY2ggYWRkcmVzcworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9zcmNfbHMgPSBzcHVfc3BsYXRzKCAodW5zaWduZWQgaW50KSBzcmMgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfYWRkcl9waXhlbE5XX2ZpcnN0X3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY19scywgdnVpX29mZl9waXhlbE5XX2ZpcnN0X3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxOV19zZWNvbmRfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjX2xzLCB2dWlfb2ZmX3BpeGVsTldfc2Vjb25kX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxOV190aGlyZF9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNfbHMsIHZ1aV9vZmZfcGl4ZWxOV190aGlyZF9yYW5nZSApOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9hZGRyX3BpeGVsTldfZm91cnRoX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY19scywgdnVpX29mZl9waXhlbE5XX2ZvdXJ0aF9yYW5nZSApOworCisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxORV9maXJzdF9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNfbHMsIHZ1aV9vZmZfcGl4ZWxORV9maXJzdF9yYW5nZSApOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9hZGRyX3BpeGVsTkVfc2Vjb25kX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY19scywgdnVpX29mZl9waXhlbE5FX3NlY29uZF9yYW5nZSApOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9hZGRyX3BpeGVsTkVfdGhpcmRfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjX2xzLCB2dWlfb2ZmX3BpeGVsTkVfdGhpcmRfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfYWRkcl9waXhlbE5FX2ZvdXJ0aF9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNfbHMsIHZ1aV9vZmZfcGl4ZWxORV9mb3VydGhfcmFuZ2UgKTsKKworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9hZGRyX3BpeGVsU1dfZmlyc3RfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjX2xzLCB2dWlfb2ZmX3BpeGVsU1dfZmlyc3RfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfYWRkcl9waXhlbFNXX3NlY29uZF9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNfbHMsIHZ1aV9vZmZfcGl4ZWxTV19zZWNvbmRfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfYWRkcl9waXhlbFNXX3RoaXJkX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY19scywgdnVpX29mZl9waXhlbFNXX3RoaXJkX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxTV19mb3VydGhfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjX2xzLCB2dWlfb2ZmX3BpeGVsU1dfZm91cnRoX3JhbmdlICk7CisKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfYWRkcl9waXhlbFNFX2ZpcnN0X3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY19scywgdnVpX29mZl9waXhlbFNFX2ZpcnN0X3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxTRV9zZWNvbmRfcmFuZ2UgPSBzcHVfYWRkKCB2dWlfc3JjX2xzLCB2dWlfb2ZmX3BpeGVsU0Vfc2Vjb25kX3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX2FkZHJfcGl4ZWxTRV90aGlyZF9yYW5nZSA9IHNwdV9hZGQoIHZ1aV9zcmNfbHMsIHZ1aV9vZmZfcGl4ZWxTRV90aGlyZF9yYW5nZSApOworCQl2ZWN0b3IgdW5zaWduZWQgaW50IHZ1aV9hZGRyX3BpeGVsU0VfZm91cnRoX3JhbmdlID0gc3B1X2FkZCggdnVpX3NyY19scywgdnVpX29mZl9waXhlbFNFX2ZvdXJ0aF9yYW5nZSApOworCisKKwkJLy8gZ2V0IGVhY2ggcGl4ZWwKKwkJLy8KKwkJLy8gc2NhbGFyIGxvYWQsIGFmdGVyd2FyZHMgaW5zZXJ0aW9uIGludG8gdGhlIHJpZ2h0IHBvc2l0aW9uCisJCS8vIE5PUlRIIFdFU1QKKwkJLy8gZmlyc3QgcmFuZ2UKKwkJdmVjdG9yIHVuc2lnbmVkIGNoYXIgbnVsbF92ZWN0b3IgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9OV19maXJzdF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5XX2ZpcnN0X3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfTldfZmlyc3RfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxOV19maXJzdF9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfTldfZmlyc3RfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX05XX2ZpcnN0X3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfZmlyc3RfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX05XX2ZpcnN0X3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfTldfZmlyc3RfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxOV19maXJzdF9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfTldfZmlyc3RfcmFuZ2UsIDE1ICk7CisJCS8vIHNlY29uZCByYW5nZQorCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcGl4ZWxfTldfc2Vjb25kX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfc2Vjb25kX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfTldfc2Vjb25kX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfc2Vjb25kX3JhbmdlLCAxICkpLAorCQkJCXZ1Y19waXhlbF9OV19zZWNvbmRfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX05XX3NlY29uZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5XX3NlY29uZF9yYW5nZSwgMiApKSwKKwkJCQl2dWNfcGl4ZWxfTldfc2Vjb25kX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfTldfc2Vjb25kX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfc2Vjb25kX3JhbmdlLCAzICkpLAorCQkJCXZ1Y19waXhlbF9OV19zZWNvbmRfcmFuZ2UsIDE1ICk7CisJCS8vIHRoaXJkIHJhbmdlCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9OV190aGlyZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5XX3RoaXJkX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfTldfdGhpcmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxOV190aGlyZF9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfTldfdGhpcmRfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX05XX3RoaXJkX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfdGhpcmRfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX05XX3RoaXJkX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfTldfdGhpcmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxOV190aGlyZF9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfTldfdGhpcmRfcmFuZ2UsIDE1ICk7CisJCS8vIGZvdXJ0aCByYW5nZQorCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcGl4ZWxfTldfZm91cnRoX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfZm91cnRoX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfTldfZm91cnRoX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfZm91cnRoX3JhbmdlLCAxICkpLAorCQkJCXZ1Y19waXhlbF9OV19mb3VydGhfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX05XX2ZvdXJ0aF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5XX2ZvdXJ0aF9yYW5nZSwgMiApKSwKKwkJCQl2dWNfcGl4ZWxfTldfZm91cnRoX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfTldfZm91cnRoX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTldfZm91cnRoX3JhbmdlLCAzICkpLAorCQkJCXZ1Y19waXhlbF9OV19mb3VydGhfcmFuZ2UsIDE1ICk7CisKKwkJLy8gTk9SVEggRUFTVAorCQkvLyBmaXJzdCByYW5nZQorCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcGl4ZWxfTkVfZmlyc3RfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxORV9maXJzdF9yYW5nZSwgMCApKSwgbnVsbF92ZWN0b3IsIDMgKTsKKwkJdnVjX3BpeGVsX05FX2ZpcnN0X3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTkVfZmlyc3RfcmFuZ2UsIDEgKSksCisJCQkJdnVjX3BpeGVsX05FX2ZpcnN0X3JhbmdlLCA3ICk7CisJCXZ1Y19waXhlbF9ORV9maXJzdF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX2ZpcnN0X3JhbmdlLCAyICkpLAorCQkJCXZ1Y19waXhlbF9ORV9maXJzdF9yYW5nZSwgMTEgKTsKKwkJdnVjX3BpeGVsX05FX2ZpcnN0X3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTkVfZmlyc3RfcmFuZ2UsIDMgKSksCisJCQkJdnVjX3BpeGVsX05FX2ZpcnN0X3JhbmdlLCAxNSApOworCQkvLyBzZWNvbmQgcmFuZ2UKKwkJdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnVjX3BpeGVsX05FX3NlY29uZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX3NlY29uZF9yYW5nZSwgMCApKSwgbnVsbF92ZWN0b3IsIDMgKTsKKwkJdnVjX3BpeGVsX05FX3NlY29uZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX3NlY29uZF9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfTkVfc2Vjb25kX3JhbmdlLCA3ICk7CisJCXZ1Y19waXhlbF9ORV9zZWNvbmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxORV9zZWNvbmRfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX05FX3NlY29uZF9yYW5nZSwgMTEgKTsKKwkJdnVjX3BpeGVsX05FX3NlY29uZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX3NlY29uZF9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfTkVfc2Vjb25kX3JhbmdlLCAxNSApOworCQkvLyB0aGlyZCByYW5nZQorCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcGl4ZWxfTkVfdGhpcmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxORV90aGlyZF9yYW5nZSwgMCApKSwgbnVsbF92ZWN0b3IsIDMgKTsKKwkJdnVjX3BpeGVsX05FX3RoaXJkX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTkVfdGhpcmRfcmFuZ2UsIDEgKSksCisJCQkJdnVjX3BpeGVsX05FX3RoaXJkX3JhbmdlLCA3ICk7CisJCXZ1Y19waXhlbF9ORV90aGlyZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX3RoaXJkX3JhbmdlLCAyICkpLAorCQkJCXZ1Y19waXhlbF9ORV90aGlyZF9yYW5nZSwgMTEgKTsKKwkJdnVjX3BpeGVsX05FX3RoaXJkX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsTkVfdGhpcmRfcmFuZ2UsIDMgKSksCisJCQkJdnVjX3BpeGVsX05FX3RoaXJkX3JhbmdlLCAxNSApOworCQkvLyBmb3VydGggcmFuZ2UKKwkJdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnVjX3BpeGVsX05FX2ZvdXJ0aF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX2ZvdXJ0aF9yYW5nZSwgMCApKSwgbnVsbF92ZWN0b3IsIDMgKTsKKwkJdnVjX3BpeGVsX05FX2ZvdXJ0aF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX2ZvdXJ0aF9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfTkVfZm91cnRoX3JhbmdlLCA3ICk7CisJCXZ1Y19waXhlbF9ORV9mb3VydGhfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxORV9mb3VydGhfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX05FX2ZvdXJ0aF9yYW5nZSwgMTEgKTsKKwkJdnVjX3BpeGVsX05FX2ZvdXJ0aF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbE5FX2ZvdXJ0aF9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfTkVfZm91cnRoX3JhbmdlLCAxNSApOworCisJCS8vIFNPVVRIIFdFU1QKKwkJLy8gZmlyc3QgcmFuZ2UKKwkJdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnVjX3BpeGVsX1NXX2ZpcnN0X3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU1dfZmlyc3RfcmFuZ2UsIDAgKSksIG51bGxfdmVjdG9yLCAzICk7CisJCXZ1Y19waXhlbF9TV19maXJzdF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNXX2ZpcnN0X3JhbmdlLCAxICkpLAorCQkJCXZ1Y19waXhlbF9TV19maXJzdF9yYW5nZSwgNyApOworCQl2dWNfcGl4ZWxfU1dfZmlyc3RfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV19maXJzdF9yYW5nZSwgMiApKSwKKwkJCQl2dWNfcGl4ZWxfU1dfZmlyc3RfcmFuZ2UsIDExICk7CisJCXZ1Y19waXhlbF9TV19maXJzdF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNXX2ZpcnN0X3JhbmdlLCAzICkpLAorCQkJCXZ1Y19waXhlbF9TV19maXJzdF9yYW5nZSwgMTUgKTsKKwkJLy8gc2Vjb25kIHJhbmdlCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9TV19zZWNvbmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV19zZWNvbmRfcmFuZ2UsIDAgKSksIG51bGxfdmVjdG9yLCAzICk7CisJCXZ1Y19waXhlbF9TV19zZWNvbmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV19zZWNvbmRfcmFuZ2UsIDEgKSksCisJCQkJdnVjX3BpeGVsX1NXX3NlY29uZF9yYW5nZSwgNyApOworCQl2dWNfcGl4ZWxfU1dfc2Vjb25kX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU1dfc2Vjb25kX3JhbmdlLCAyICkpLAorCQkJCXZ1Y19waXhlbF9TV19zZWNvbmRfcmFuZ2UsIDExICk7CisJCXZ1Y19waXhlbF9TV19zZWNvbmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV19zZWNvbmRfcmFuZ2UsIDMgKSksCisJCQkJdnVjX3BpeGVsX1NXX3NlY29uZF9yYW5nZSwgMTUgKTsKKwkJLy8gdGhpcmQgcmFuZ2UKKwkJdmVjdG9yIHVuc2lnbmVkIGNoYXIgdnVjX3BpeGVsX1NXX3RoaXJkX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU1dfdGhpcmRfcmFuZ2UsIDAgKSksIG51bGxfdmVjdG9yLCAzICk7CisJCXZ1Y19waXhlbF9TV190aGlyZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNXX3RoaXJkX3JhbmdlLCAxICkpLAorCQkJCXZ1Y19waXhlbF9TV190aGlyZF9yYW5nZSwgNyApOworCQl2dWNfcGl4ZWxfU1dfdGhpcmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV190aGlyZF9yYW5nZSwgMiApKSwKKwkJCQl2dWNfcGl4ZWxfU1dfdGhpcmRfcmFuZ2UsIDExICk7CisJCXZ1Y19waXhlbF9TV190aGlyZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNXX3RoaXJkX3JhbmdlLCAzICkpLAorCQkJCXZ1Y19waXhlbF9TV190aGlyZF9yYW5nZSwgMTUgKTsKKwkJLy8gZm91cnRoIHJhbmdlCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9TV19mb3VydGhfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV19mb3VydGhfcmFuZ2UsIDAgKSksIG51bGxfdmVjdG9yLCAzICk7CisJCXZ1Y19waXhlbF9TV19mb3VydGhfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV19mb3VydGhfcmFuZ2UsIDEgKSksCisJCQkJdnVjX3BpeGVsX1NXX2ZvdXJ0aF9yYW5nZSwgNyApOworCQl2dWNfcGl4ZWxfU1dfZm91cnRoX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU1dfZm91cnRoX3JhbmdlLCAyICkpLAorCQkJCXZ1Y19waXhlbF9TV19mb3VydGhfcmFuZ2UsIDExICk7CisJCXZ1Y19waXhlbF9TV19mb3VydGhfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTV19mb3VydGhfcmFuZ2UsIDMgKSksCisJCQkJdnVjX3BpeGVsX1NXX2ZvdXJ0aF9yYW5nZSwgMTUgKTsKKworCQkvLyBOT1JUSCBFQVNUCisJCS8vIGZpcnN0IHJhbmdlCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9TRV9maXJzdF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNFX2ZpcnN0X3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfU0VfZmlyc3RfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTRV9maXJzdF9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfU0VfZmlyc3RfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX1NFX2ZpcnN0X3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0VfZmlyc3RfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX1NFX2ZpcnN0X3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfU0VfZmlyc3RfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTRV9maXJzdF9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfU0VfZmlyc3RfcmFuZ2UsIDE1ICk7CisJCS8vIHNlY29uZCByYW5nZQorCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcGl4ZWxfU0Vfc2Vjb25kX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0Vfc2Vjb25kX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfU0Vfc2Vjb25kX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0Vfc2Vjb25kX3JhbmdlLCAxICkpLAorCQkJCXZ1Y19waXhlbF9TRV9zZWNvbmRfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX1NFX3NlY29uZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNFX3NlY29uZF9yYW5nZSwgMiApKSwKKwkJCQl2dWNfcGl4ZWxfU0Vfc2Vjb25kX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfU0Vfc2Vjb25kX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0Vfc2Vjb25kX3JhbmdlLCAzICkpLAorCQkJCXZ1Y19waXhlbF9TRV9zZWNvbmRfcmFuZ2UsIDE1ICk7CisJCS8vIHRoaXJkIHJhbmdlCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19waXhlbF9TRV90aGlyZF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNFX3RoaXJkX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfU0VfdGhpcmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTRV90aGlyZF9yYW5nZSwgMSApKSwKKwkJCQl2dWNfcGl4ZWxfU0VfdGhpcmRfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX1NFX3RoaXJkX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0VfdGhpcmRfcmFuZ2UsIDIgKSksCisJCQkJdnVjX3BpeGVsX1NFX3RoaXJkX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfU0VfdGhpcmRfcmFuZ2UgPSBzcHVfaW5zZXJ0KAorCQkJCSooKHVuc2lnbmVkIGNoYXIqKSBzcHVfZXh0cmFjdCggdnVpX2FkZHJfcGl4ZWxTRV90aGlyZF9yYW5nZSwgMyApKSwKKwkJCQl2dWNfcGl4ZWxfU0VfdGhpcmRfcmFuZ2UsIDE1ICk7CisJCS8vIGZvdXJ0aCByYW5nZQorCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcGl4ZWxfU0VfZm91cnRoX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0VfZm91cnRoX3JhbmdlLCAwICkpLCBudWxsX3ZlY3RvciwgMyApOworCQl2dWNfcGl4ZWxfU0VfZm91cnRoX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0VfZm91cnRoX3JhbmdlLCAxICkpLAorCQkJCXZ1Y19waXhlbF9TRV9mb3VydGhfcmFuZ2UsIDcgKTsKKwkJdnVjX3BpeGVsX1NFX2ZvdXJ0aF9yYW5nZSA9IHNwdV9pbnNlcnQoCisJCQkJKigodW5zaWduZWQgY2hhciopIHNwdV9leHRyYWN0KCB2dWlfYWRkcl9waXhlbFNFX2ZvdXJ0aF9yYW5nZSwgMiApKSwKKwkJCQl2dWNfcGl4ZWxfU0VfZm91cnRoX3JhbmdlLCAxMSApOworCQl2dWNfcGl4ZWxfU0VfZm91cnRoX3JhbmdlID0gc3B1X2luc2VydCgKKwkJCQkqKCh1bnNpZ25lZCBjaGFyKikgc3B1X2V4dHJhY3QoIHZ1aV9hZGRyX3BpeGVsU0VfZm91cnRoX3JhbmdlLCAzICkpLAorCQkJCXZ1Y19waXhlbF9TRV9mb3VydGhfcmFuZ2UsIDE1ICk7CisKKworCisJCS8vIGNvbnZlcnQgdG8gZmxvYXQKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX05XX2ZpcnN0X3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9OV19maXJzdF9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfTldfc2Vjb25kX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9OV19zZWNvbmRfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX05XX3RoaXJkX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9OV190aGlyZF9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfTldfZm91cnRoX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9OV19mb3VydGhfcmFuZ2UsIDAgKTsKKworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfTkVfZmlyc3RfcmFuZ2UgPSBzcHVfY29udnRmKCAodmVjdG9yIHVuc2lnbmVkIGludCkgdnVjX3BpeGVsX05FX2ZpcnN0X3JhbmdlLCAwICk7CisJCXZlY3RvciBmbG9hdCB2Zl9waXhlbF9ORV9zZWNvbmRfcmFuZ2UgPSBzcHVfY29udnRmKCAodmVjdG9yIHVuc2lnbmVkIGludCkgdnVjX3BpeGVsX05FX3NlY29uZF9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfTkVfdGhpcmRfcmFuZ2UgPSBzcHVfY29udnRmKCAodmVjdG9yIHVuc2lnbmVkIGludCkgdnVjX3BpeGVsX05FX3RoaXJkX3JhbmdlLCAwICk7CisJCXZlY3RvciBmbG9hdCB2Zl9waXhlbF9ORV9mb3VydGhfcmFuZ2UgPSBzcHVfY29udnRmKCAodmVjdG9yIHVuc2lnbmVkIGludCkgdnVjX3BpeGVsX05FX2ZvdXJ0aF9yYW5nZSwgMCApOworCisJCXZlY3RvciBmbG9hdCB2Zl9waXhlbF9TV19maXJzdF9yYW5nZSA9IHNwdV9jb252dGYoICh2ZWN0b3IgdW5zaWduZWQgaW50KSB2dWNfcGl4ZWxfU1dfZmlyc3RfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX1NXX3NlY29uZF9yYW5nZSA9IHNwdV9jb252dGYoICh2ZWN0b3IgdW5zaWduZWQgaW50KSB2dWNfcGl4ZWxfU1dfc2Vjb25kX3JhbmdlLCAwICk7CisJCXZlY3RvciBmbG9hdCB2Zl9waXhlbF9TV190aGlyZF9yYW5nZSA9IHNwdV9jb252dGYoICh2ZWN0b3IgdW5zaWduZWQgaW50KSB2dWNfcGl4ZWxfU1dfdGhpcmRfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX1NXX2ZvdXJ0aF9yYW5nZSA9IHNwdV9jb252dGYoICh2ZWN0b3IgdW5zaWduZWQgaW50KSB2dWNfcGl4ZWxfU1dfZm91cnRoX3JhbmdlLCAwICk7CisKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX1NFX2ZpcnN0X3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9TRV9maXJzdF9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfU0Vfc2Vjb25kX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9TRV9zZWNvbmRfcmFuZ2UsIDAgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3BpeGVsX1NFX3RoaXJkX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9TRV90aGlyZF9yYW5nZSwgMCApOworCQl2ZWN0b3IgZmxvYXQgdmZfcGl4ZWxfU0VfZm91cnRoX3JhbmdlID0gc3B1X2NvbnZ0ZiggKHZlY3RvciB1bnNpZ25lZCBpbnQpIHZ1Y19waXhlbF9TRV9mb3VydGhfcmFuZ2UsIDAgKTsKKworCQkvLyBmaXJzdCBsaW5lYXIgaW50ZXJwb2xhdGlvbjogRVd0b3AKKwkJLy8gRVd0b3AgPSBOVyArIEVXd2VpZ2h0KihORS1OVykKKwkJLy8KKwkJLy8gZmlyc3QgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX0VXdG9wX2ZpcnN0X3JhbmdlX3RtcCA9IHNwdV9zdWIoIHZmX3BpeGVsX05FX2ZpcnN0X3JhbmdlLCB2Zl9waXhlbF9OV19maXJzdF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVd0b3BfZmlyc3RfcmFuZ2UgPSBzcHVfbWFkZCggdmZfRVd3ZWlnaHRfZmlyc3RfcmFuZ2UsCisJCQkJCQkJCXZmX0VXdG9wX2ZpcnN0X3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfcGl4ZWxfTldfZmlyc3RfcmFuZ2UgKTsKKworCQkvLyBzZWNvbmQgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX0VXdG9wX3NlY29uZF9yYW5nZV90bXAgPSBzcHVfc3ViKCB2Zl9waXhlbF9ORV9zZWNvbmRfcmFuZ2UsIHZmX3BpeGVsX05XX3NlY29uZF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVd0b3Bfc2Vjb25kX3JhbmdlID0gc3B1X21hZGQoIHZmX0VXd2VpZ2h0X3NlY29uZF9yYW5nZSwKKwkJCQkJCQkJdmZfRVd0b3Bfc2Vjb25kX3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfcGl4ZWxfTldfc2Vjb25kX3JhbmdlICk7CisKKwkJLy8gdGhpcmQgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX0VXdG9wX3RoaXJkX3JhbmdlX3RtcCA9IHNwdV9zdWIoIHZmX3BpeGVsX05FX3RoaXJkX3JhbmdlLCB2Zl9waXhlbF9OV190aGlyZF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVd0b3BfdGhpcmRfcmFuZ2UgPSBzcHVfbWFkZCggdmZfRVd3ZWlnaHRfdGhpcmRfcmFuZ2UsCisJCQkJCQkJCXZmX0VXdG9wX3RoaXJkX3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfcGl4ZWxfTldfdGhpcmRfcmFuZ2UgKTsKKworCQkvLyBmb3VydGggcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX0VXdG9wX2ZvdXJ0aF9yYW5nZV90bXAgPSBzcHVfc3ViKCB2Zl9waXhlbF9ORV9mb3VydGhfcmFuZ2UsIHZmX3BpeGVsX05XX2ZvdXJ0aF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVd0b3BfZm91cnRoX3JhbmdlID0gc3B1X21hZGQoIHZmX0VXd2VpZ2h0X2ZvdXJ0aF9yYW5nZSwKKwkJCQkJCQkJdmZfRVd0b3BfZm91cnRoX3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfcGl4ZWxfTldfZm91cnRoX3JhbmdlICk7CisKKworCisJCS8vIHNlY29uZCBsaW5lYXIgaW50ZXJwb2xhdGlvbjogRVdib3R0b20KKwkJLy8gRVdib3R0b20gPSBTVyArIEVXd2VpZ2h0KihTRS1TVykKKwkJLy8KKwkJLy8gZmlyc3QgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX0VXYm90dG9tX2ZpcnN0X3JhbmdlX3RtcCA9IHNwdV9zdWIoIHZmX3BpeGVsX1NFX2ZpcnN0X3JhbmdlLCB2Zl9waXhlbF9TV19maXJzdF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVdib3R0b21fZmlyc3RfcmFuZ2UgPSBzcHVfbWFkZCggdmZfRVd3ZWlnaHRfZmlyc3RfcmFuZ2UsCisJCQkJCQkJCXZmX0VXYm90dG9tX2ZpcnN0X3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfcGl4ZWxfU1dfZmlyc3RfcmFuZ2UgKTsKKworCQkvLyBzZWNvbmQgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX0VXYm90dG9tX3NlY29uZF9yYW5nZV90bXAgPSBzcHVfc3ViKCB2Zl9waXhlbF9TRV9zZWNvbmRfcmFuZ2UsIHZmX3BpeGVsX1NXX3NlY29uZF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVdib3R0b21fc2Vjb25kX3JhbmdlID0gc3B1X21hZGQoIHZmX0VXd2VpZ2h0X3NlY29uZF9yYW5nZSwKKwkJCQkJCQkJdmZfRVdib3R0b21fc2Vjb25kX3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfcGl4ZWxfU1dfc2Vjb25kX3JhbmdlICk7CisJCS8vIGZpcnN0IHJhbmdlCisJCXZlY3RvciBmbG9hdCB2Zl9FV2JvdHRvbV90aGlyZF9yYW5nZV90bXAgPSBzcHVfc3ViKCB2Zl9waXhlbF9TRV90aGlyZF9yYW5nZSwgdmZfcGl4ZWxfU1dfdGhpcmRfcmFuZ2UgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX0VXYm90dG9tX3RoaXJkX3JhbmdlID0gc3B1X21hZGQoIHZmX0VXd2VpZ2h0X3RoaXJkX3JhbmdlLAorCQkJCQkJCQl2Zl9FV2JvdHRvbV90aGlyZF9yYW5nZV90bXAsCisJCQkJCQkJCXZmX3BpeGVsX1NXX3RoaXJkX3JhbmdlICk7CisKKwkJLy8gZmlyc3QgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX0VXYm90dG9tX2ZvdXJ0aF9yYW5nZV90bXAgPSBzcHVfc3ViKCB2Zl9waXhlbF9TRV9mb3VydGhfcmFuZ2UsIHZmX3BpeGVsX1NXX2ZvdXJ0aF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfRVdib3R0b21fZm91cnRoX3JhbmdlID0gc3B1X21hZGQoIHZmX0VXd2VpZ2h0X2ZvdXJ0aF9yYW5nZSwKKwkJCQkJCQkJdmZfRVdib3R0b21fZm91cnRoX3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfcGl4ZWxfU1dfZm91cnRoX3JhbmdlICk7CisKKworCisJCS8vIHRoaXJkIGxpbmVhciBpbnRlcnBvbGF0aW9uOiB0aGUgYmlsaW5lYXIgaW50ZXJwb2xhdGVkIHZhbHVlCisJCS8vIHJlc3VsdCA9IEVXdG9wICsgTlN3ZWlnaHQqKEVXYm90dG9tLUVXdG9wKTsKKwkJLy8KKwkJLy8gZmlyc3QgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX3Jlc3VsdF9maXJzdF9yYW5nZV90bXAgPSBzcHVfc3ViKCB2Zl9FV2JvdHRvbV9maXJzdF9yYW5nZSwgdmZfRVd0b3BfZmlyc3RfcmFuZ2UgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3Jlc3VsdF9maXJzdF9yYW5nZSA9IHNwdV9tYWRkKCB2Zl9OU3dlaWdodCwKKwkJCQkJCQkJdmZfcmVzdWx0X2ZpcnN0X3JhbmdlX3RtcCwKKwkJCQkJCQkJdmZfRVd0b3BfZmlyc3RfcmFuZ2UgKTsKKworCQkvLyBzZWNvbmQgcmFuZ2UKKwkJdmVjdG9yIGZsb2F0IHZmX3Jlc3VsdF9zZWNvbmRfcmFuZ2VfdG1wID0gc3B1X3N1YiggdmZfRVdib3R0b21fc2Vjb25kX3JhbmdlLCB2Zl9FV3RvcF9zZWNvbmRfcmFuZ2UgKTsKKwkJdmVjdG9yIGZsb2F0IHZmX3Jlc3VsdF9zZWNvbmRfcmFuZ2UgPSBzcHVfbWFkZCggdmZfTlN3ZWlnaHQsCisJCQkJCQkJCXZmX3Jlc3VsdF9zZWNvbmRfcmFuZ2VfdG1wLAorCQkJCQkJCQl2Zl9FV3RvcF9zZWNvbmRfcmFuZ2UgKTsKKworCQkvLyB0aGlyZCByYW5nZQorCQl2ZWN0b3IgZmxvYXQgdmZfcmVzdWx0X3RoaXJkX3JhbmdlX3RtcCA9IHNwdV9zdWIoIHZmX0VXYm90dG9tX3RoaXJkX3JhbmdlLCB2Zl9FV3RvcF90aGlyZF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfcmVzdWx0X3RoaXJkX3JhbmdlID0gc3B1X21hZGQoIHZmX05Td2VpZ2h0LAorCQkJCQkJCQl2Zl9yZXN1bHRfdGhpcmRfcmFuZ2VfdG1wLAorCQkJCQkJCQl2Zl9FV3RvcF90aGlyZF9yYW5nZSApOworCisJCS8vIGZvdXJ0aCByYW5nZQorCQl2ZWN0b3IgZmxvYXQgdmZfcmVzdWx0X2ZvdXJ0aF9yYW5nZV90bXAgPSBzcHVfc3ViKCB2Zl9FV2JvdHRvbV9mb3VydGhfcmFuZ2UsIHZmX0VXdG9wX2ZvdXJ0aF9yYW5nZSApOworCQl2ZWN0b3IgZmxvYXQgdmZfcmVzdWx0X2ZvdXJ0aF9yYW5nZSA9IHNwdV9tYWRkKCB2Zl9OU3dlaWdodCwKKwkJCQkJCQkJdmZfcmVzdWx0X2ZvdXJ0aF9yYW5nZV90bXAsCisJCQkJCQkJCXZmX0VXdG9wX2ZvdXJ0aF9yYW5nZSApOworCisKKworCQkvLyBjb252ZXJ0IGJhY2s6IHVzaW5nIHNhdHVyYXRlZCBhcml0aG1ldGljCisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX3Jlc3VsdF9maXJzdF9yYW5nZSA9IHZmbG9hdF90b192dWludCggdmZfcmVzdWx0X2ZpcnN0X3JhbmdlICk7CisJCXZlY3RvciB1bnNpZ25lZCBpbnQgdnVpX3Jlc3VsdF9zZWNvbmRfcmFuZ2UgPSB2ZmxvYXRfdG9fdnVpbnQoIHZmX3Jlc3VsdF9zZWNvbmRfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfcmVzdWx0X3RoaXJkX3JhbmdlID0gdmZsb2F0X3RvX3Z1aW50KCB2Zl9yZXN1bHRfdGhpcmRfcmFuZ2UgKTsKKwkJdmVjdG9yIHVuc2lnbmVkIGludCB2dWlfcmVzdWx0X2ZvdXJ0aF9yYW5nZSA9IHZmbG9hdF90b192dWludCggdmZfcmVzdWx0X2ZvdXJ0aF9yYW5nZSApOworCisJCS8vIG1lcmdlIHJlc3VsdHMtPmxvd2VyLHVwcGVyCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19tYXNrX21lcmdlX3Jlc3VsdF9maXJzdF9zZWNvbmQgPSB7IDB4MDMsIDB4MDcsIDB4MEIsIDB4MEYsCisJCQkJCQkJICAgICAgIAkJICAgIDB4MTMsIDB4MTcsIDB4MUIsIDB4MUYsCisJCQkJCQkJICAgICAgIAkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkJCQkJICAgICAgIAkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfbWFza19tZXJnZV9yZXN1bHRfdGhpcmRfZm91cnRoID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkJCQkJCSAgICAgICAJCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkJCQkJCQkJICAgIDB4MDMsIDB4MDcsIDB4MEIsIDB4MEYsCisJCQkJCQkJICAgICAgIAkJICAgIDB4MTMsIDB4MTcsIDB4MUIsIDB4MUYgfTsKKworCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2dWNfcmVzdWx0X2ZpcnN0X3NlY29uZCA9CisJCQkJCQlzcHVfc2h1ZmZsZSggKHZlY3RvciB1bnNpZ25lZCBjaGFyKSB2dWlfcmVzdWx0X2ZpcnN0X3JhbmdlLAorCQkJCQkJCQkgKHZlY3RvciB1bnNpZ25lZCBjaGFyKSB2dWlfcmVzdWx0X3NlY29uZF9yYW5nZSwKKwkJCQkJCQkJdnVjX21hc2tfbWVyZ2VfcmVzdWx0X2ZpcnN0X3NlY29uZCApOworCisJCXZlY3RvciB1bnNpZ25lZCBjaGFyIHZ1Y19yZXN1bHRfdGhpcmRfZm91cnRoID0KKwkJCQkJCXNwdV9zaHVmZmxlKCAodmVjdG9yIHVuc2lnbmVkIGNoYXIpIHZ1aV9yZXN1bHRfdGhpcmRfcmFuZ2UsCisJCQkJCQkJCSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpIHZ1aV9yZXN1bHRfZm91cnRoX3JhbmdlLAorCQkJCQkJCQl2dWNfbWFza19tZXJnZV9yZXN1bHRfdGhpcmRfZm91cnRoICk7CisKKwkJLy8gc3RvcmUgcmVzdWx0CisJCSooKHZlY3RvciB1bnNpZ25lZCBjaGFyKilkc3QpID0gc3B1X29yKCB2dWNfcmVzdWx0X2ZpcnN0X3NlY29uZCwKKwkJCQkJCQl2dWNfcmVzdWx0X3RoaXJkX2ZvdXJ0aCApOworCQlkc3QgKz0gMTY7CisJfQorfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9zcHVsaWJzL2ZiX3dyaXRlci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvc3B1bGlicy9mYl93cml0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWI1MWNjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvc3B1bGlicy9mYl93cml0ZXIuYwpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICogQ0VMTCBCRSBTdXBwb3J0IGZvciBQUzMgRnJhbWVidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMQorICogVVNBCisgKgorICogIE1hcnRpbiBMb3dpbnNraSAgPGxvd2luc2tpIFthdF0gZGUgW2RvdF0gaWJtIFtpYm1dIGNvbT4KKyAqICBEaXJrIEhlcnJlbmRvZXJmZXIgPGQuaGVycmVuZG9lcmZlciBbYXRdIGRlIFtkb3RdIGlibSBbZG90XSBjb20+CisgKiAgU1BFIGNvZGUgYmFzZWQgb24gcmVzZWFyY2ggYnk6CisgKiAgUmVuZSBCZWNrZXIKKyAqICBUaGltbyBFbW1lcmljaAorICovCisKKyNpbmNsdWRlICJzcHVfY29tbW9uLmgiCisKKyNpbmNsdWRlIDxzcHVfaW50cmluc2ljcy5oPgorI2luY2x1ZGUgPHNwdV9tZmNpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIERlYnVnZ2luZworLy8jZGVmaW5lIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBkZXByaW50ZihmbXQsIGFyZ3MuLi4gKSBcCisJZnByaW50Ziggc3Rkb3V0LCBmbXQsICMjYXJncyApOyBcCisJZmZsdXNoKCBzdGRvdXQgKTsKKyNlbHNlCisjZGVmaW5lIGRlcHJpbnRmKCBmbXQsIGFyZ3MuLi4gKQorI2VuZGlmCisKK3ZvaWQgY3B5X3RvX2ZiKHVuc2lnbmVkIGludCk7CisKKy8qIGZiX3dyaXRlcl9zcHUgcGFybXMgKi8KK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgZmJfd3JpdGVyX3Bhcm1zX3QgcGFybXMgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTI4KSkpOworCisvKiBDb2RlIHJ1bm5pbmcgb24gU1BVICovCitpbnQgbWFpbih1bnNpZ25lZCBsb25nIGxvbmcgc3BlX2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgdW5zaWduZWQgbG9uZyBsb25nIGFyZ3AgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworCWRlcHJpbnRmKCJbU1BVXSBmYl93cml0ZXJfc3B1IGlzIHVwLi4uIChvbiBTUEUgIyVsbHUpXG4iLCBzcGVfaWQpOworCXVpbnQzMl90IGVhX21mYywgbWJveDsKKwkvLyBzZW5kIHJlYWR5IG1lc3NhZ2UKKwlzcHVfd3JpdGVfb3V0X21ib3goU1BVX1JFQURZKTsKKworCXdoaWxlICgxKSB7CisJCS8qIENoZWNrIG1haWxib3ggKi8KKwkJbWJveCA9IHNwdV9yZWFkX2luX21ib3goKTsKKwkJZGVwcmludGYoIltTUFVdIE1lc3NhZ2UgaXMgJXVcbiIsIG1ib3gpOworCQlzd2l0Y2ggKG1ib3gpIHsKKwkJCWNhc2UgU1BVX0VYSVQ6CisJCQkJZGVwcmludGYoIltTUFVdIGZiX3dyaXRlciBnb2VzIGRvd24uLi5cbiIpOworCQkJCXJldHVybiAwOworCQkJY2FzZSBTUFVfU1RBUlQ6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWRlcHJpbnRmKCJbU1BVXSBDYW5ub3QgaGFuZGxlIG1lc3NhZ2VcbiIpOworCQkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGFnIE1hbmFnZXIgc2V0dXAgKi8KKwkJdW5zaWduZWQgaW50IHRhZ3M7CisJCXRhZ3MgPSBtZmNfbXVsdGlfdGFnX3Jlc2VydmUoNSk7CisJCWlmICh0YWdzID09IE1GQ19UQUdfSU5WQUxJRCkgeworCQkJZGVwcmludGYoIltTUFVdIEZhaWxlZCB0byByZXNlcnZlIG1mYyB0YWdzIG9uIGZiX3dyaXRlclxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIEZyYW1lYnVmZmVyIHBhcm1zICovCisJCWVhX21mYyA9IHNwdV9yZWFkX2luX21ib3goKTsKKwkJZGVwcmludGYoIltTUFVdIE1lc3NhZ2Ugb24gZmJfd3JpdGVyIGlzICV1XG4iLCBlYV9tZmMpOworCQlzcHVfbWZjZG1hMzIoJnBhcm1zLCAodW5zaWduZWQgaW50KWVhX21mYywKKwkJCQlzaXplb2Yoc3RydWN0IGZiX3dyaXRlcl9wYXJtc190KSwgdGFncywKKwkJCQlNRkNfR0VUX0NNRCk7CisJCWRlcHJpbnRmKCJbU1BVXSBhcmdwID0gJXVcbiIsICh1bnNpZ25lZCBpbnQpYXJncCk7CisJCURNQV9XQUlUX1RBRyh0YWdzKTsKKworCQkvKiBDb3B5IHBhcm1zLT5kYXRhIHRvIGZyYW1lYnVmZmVyICovCisJCWRlcHJpbnRmKCJbU1BVXSBDb3B5aW5nIHRvIGZyYW1lYnVmZmVyIHN0YXJ0ZWRcbiIpOworCQljcHlfdG9fZmIodGFncyk7CisJCWRlcHJpbnRmKCJbU1BVXSBDb3B5aW5nIHRvIGZyYW1lYnVmZmVyIGRvbmUhXG4iKTsKKworCQltZmNfbXVsdGlfdGFnX3JlbGVhc2UodGFncywgNSk7CisJCWRlcHJpbnRmKCJbU1BVXSBmYl93cml0ZXJfc3B1Li4uIGRvbmUhXG4iKTsKKwkJLyogU2VuZCBGSU4gbXNnICovCisJCXNwdV93cml0ZV9vdXRfbWJveChTUFVfRklOKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjcHlfdG9fZmIodW5zaWduZWQgaW50IHRhZ19pZF9iYXNlKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGNoYXIgY3VycmVudF9idWY7CisJdWludDhfdCAqaW4gPSBwYXJtcy5kYXRhOworCisJLyogQWxpZ24gZmIgcG9pbnRlciB3aGljaCB3YXMgY2VudGVyZWQgYmVmb3JlICovCisJdWludDhfdCAqZmIgPQorCSAgICAodW5zaWduZWQgY2hhciAqKSgodW5zaWduZWQgaW50KXBhcm1zLmNlbnRlciAmIDB4RkZGRkZGRjApOworCisJdWludDMyX3QgYm91bmRlZF9pbnB1dF9oZWlnaHQgPSBwYXJtcy5ib3VuZGVkX2lucHV0X2hlaWdodDsKKwl1aW50MzJfdCBib3VuZGVkX2lucHV0X3dpZHRoID0gcGFybXMuYm91bmRlZF9pbnB1dF93aWR0aDsKKwl1aW50MzJfdCBmYl9waXhlbF9zaXplID0gcGFybXMuZmJfcGl4ZWxfc2l6ZTsKKworCXVpbnQzMl90IG91dF9saW5lX3N0cmlkZSA9IHBhcm1zLm91dF9saW5lX3N0cmlkZTsKKwl1aW50MzJfdCBpbl9saW5lX3N0cmlkZSA9IHBhcm1zLmluX2xpbmVfc3RyaWRlOworCXVpbnQzMl90IGluX2xpbmVfc2l6ZSA9IGJvdW5kZWRfaW5wdXRfd2lkdGggKiBmYl9waXhlbF9zaXplOworCisJY3VycmVudF9idWYgPSAwOworCisJLyogTG9jYWwgc3RvcmUgYnVmZmVyICovCisJc3RhdGljIHZvbGF0aWxlIHVpbnQ4X3QgYnVmWzRdW0JVRkZFUl9TSVpFXQorCSAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxMjgpKSk7CisJLyogZG8gNC10aW1lcyBtdWx0aWJ1ZmZlcmluZyB1c2luZyBETUEgbGlzdCwgcHJvY2VzcyBpbiB0d28gc3RlcHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYm91bmRlZF9pbnB1dF9oZWlnaHQgPj4gMjsgaSsrKSB7CisJCS8qIGZpcnN0IGJ1ZmZlciAqLworCQlETUFfV0FJVF9UQUcodGFnX2lkX2Jhc2UgKyAxKTsKKwkJLy8gcmV0cmlldmUgYnVmZmVyCisJCXNwdV9tZmNkbWEzMihidWZbMF0sICh1bnNpZ25lZCBpbnQpaW4sIGluX2xpbmVfc2l6ZSwKKwkJCSAgICAgdGFnX2lkX2Jhc2UgKyAxLCBNRkNfR0VUQl9DTUQpOworCQlETUFfV0FJVF9UQUcodGFnX2lkX2Jhc2UgKyAxKTsKKwkJLy8gc3RvcmUgYnVmZmVyCisJCXNwdV9tZmNkbWEzMihidWZbMF0sICh1bnNpZ25lZCBpbnQpZmIsIGluX2xpbmVfc2l6ZSwKKwkJCSAgICAgdGFnX2lkX2Jhc2UgKyAxLCBNRkNfUFVUQl9DTUQpOworCQlpbiArPSBpbl9saW5lX3N0cmlkZTsKKwkJZmIgKz0gb3V0X2xpbmVfc3RyaWRlOworCQlkZXByaW50ZigiW1NQVV0gMXN0IGJ1ZmZlciBjb3BpZWQgaW49MHgleCwgZmI9MHgleFxuIiwgaW4sCisJCSAgICAgICBmYik7CisKKwkJLyogc2Vjb25kIGJ1ZmZlciAqLworCQlETUFfV0FJVF9UQUcodGFnX2lkX2Jhc2UgKyAyKTsKKwkJLy8gcmV0cmlldmUgYnVmZmVyCisJCXNwdV9tZmNkbWEzMihidWZbMV0sICh1bnNpZ25lZCBpbnQpaW4sIGluX2xpbmVfc2l6ZSwKKwkJCSAgICAgdGFnX2lkX2Jhc2UgKyAyLCBNRkNfR0VUQl9DTUQpOworCQlETUFfV0FJVF9UQUcodGFnX2lkX2Jhc2UgKyAyKTsKKwkJLy8gc3RvcmUgYnVmZmVyCisJCXNwdV9tZmNkbWEzMihidWZbMV0sICh1bnNpZ25lZCBpbnQpZmIsIGluX2xpbmVfc2l6ZSwKKwkJCSAgICAgdGFnX2lkX2Jhc2UgKyAyLCBNRkNfUFVUQl9DTUQpOworCQlpbiArPSBpbl9saW5lX3N0cmlkZTsKKwkJZmIgKz0gb3V0X2xpbmVfc3RyaWRlOworCQlkZXByaW50ZigiW1NQVV0gMm5kIGJ1ZmZlciBjb3BpZWQgaW49MHgleCwgZmI9MHgleFxuIiwgaW4sCisJCSAgICAgICBmYik7CisKKwkJLyogdGhpcmQgYnVmZmVyICovCisJCURNQV9XQUlUX1RBRyh0YWdfaWRfYmFzZSArIDMpOworCQkvLyByZXRyaWV2ZSBidWZmZXIKKwkJc3B1X21mY2RtYTMyKGJ1ZlsyXSwgKHVuc2lnbmVkIGludClpbiwgaW5fbGluZV9zaXplLAorCQkJICAgICB0YWdfaWRfYmFzZSArIDMsIE1GQ19HRVRCX0NNRCk7CisJCURNQV9XQUlUX1RBRyh0YWdfaWRfYmFzZSArIDMpOworCQkvLyBzdG9yZSBidWZmZXIKKwkJc3B1X21mY2RtYTMyKGJ1ZlsyXSwgKHVuc2lnbmVkIGludClmYiwgaW5fbGluZV9zaXplLAorCQkJICAgICB0YWdfaWRfYmFzZSArIDMsIE1GQ19QVVRCX0NNRCk7CisJCWluICs9IGluX2xpbmVfc3RyaWRlOworCQlmYiArPSBvdXRfbGluZV9zdHJpZGU7CisJCWRlcHJpbnRmKCJbU1BVXSAzcmQgYnVmZmVyIGNvcGllZCBpbj0weCV4LCBmYj0weCV4XG4iLCBpbiwKKwkJICAgICAgIGZiKTsKKworCQkvKiBmb3VydGggYnVmZmVyICovCisJCURNQV9XQUlUX1RBRyh0YWdfaWRfYmFzZSArIDQpOworCQkvLyByZXRyaWV2ZSBidWZmZXIKKwkJc3B1X21mY2RtYTMyKGJ1ZlszXSwgKHVuc2lnbmVkIGludClpbiwgaW5fbGluZV9zaXplLAorCQkJICAgICB0YWdfaWRfYmFzZSArIDQsIE1GQ19HRVRCX0NNRCk7CisJCURNQV9XQUlUX1RBRyh0YWdfaWRfYmFzZSArIDQpOworCQkvLyBzdG9yZSBidWZmZXIKKwkJc3B1X21mY2RtYTMyKGJ1ZlszXSwgKHVuc2lnbmVkIGludClmYiwgaW5fbGluZV9zaXplLAorCQkJICAgICB0YWdfaWRfYmFzZSArIDQsIE1GQ19QVVRCX0NNRCk7CisJCWluICs9IGluX2xpbmVfc3RyaWRlOworCQlmYiArPSBvdXRfbGluZV9zdHJpZGU7CisJCWRlcHJpbnRmKCJbU1BVXSA0dGggYnVmZmVyIGNvcGllZCBpbj0weCV4LCBmYj0weCV4XG4iLCBpbiwKKwkJICAgICAgIGZiKTsKKwkJZGVwcmludGYoIltTUFVdIExvb3AgIyVpLCBib3VuZGVkX2lucHV0X2hlaWdodD0laVxuIiwgaSwKKwkJICAgICAgIGJvdW5kZWRfaW5wdXRfaGVpZ2h0ID4+IDIpOworCX0KKwlETUFfV0FJVF9UQUcodGFnX2lkX2Jhc2UgKyAyKTsKKwlETUFfV0FJVF9UQUcodGFnX2lkX2Jhc2UgKyAzKTsKKwlETUFfV0FJVF9UQUcodGFnX2lkX2Jhc2UgKyA0KTsKK30KKworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9zcHVsaWJzL3NwdV9jb21tb24uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMzL3NwdWxpYnMvc3B1X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYzMyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3BzMy9zcHVsaWJzL3NwdV9jb21tb24uaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICogQ0VMTCBCRSBTdXBwb3J0IGZvciBQUzMgRnJhbWVidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMQorICogVVNBCisgKgorICogIE1hcnRpbiBMb3dpbnNraSAgPGxvd2luc2tpIFthdF0gZGUgW2RvdF0gaWJtIFtpYm1dIGNvbT4KKyAqICBEaXJrIEhlcnJlbmRvZXJmZXIgPGQuaGVycmVuZG9lcmZlciBbYXRdIGRlIFtkb3RdIGlibSBbZG90XSBjb20+CisgKiAgU1BFIGNvZGUgYmFzZWQgb24gcmVzZWFyY2ggYnk6CisgKiAgUmVuZSBCZWNrZXIKKyAqICBUaGltbyBFbW1lcmljaAorICovCisKKy8qIENvbW1vbiBkZWZpbml0aW9ucy9tYWtyb3MgZm9yIFNQVXMgKi8KKworI2lmbmRlZiBfU1BVX0NPTU1PTl9ICisjZGVmaW5lIF9TUFVfQ09NTU9OX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIFRhZyBtYW5hZ2VtZW50ICovCisjZGVmaW5lIERNQV9XQUlUX1RBRyhfdGFnKSAgICAgXAorICAgIG1mY193cml0ZV90YWdfbWFzaygxPDwoX3RhZykpOyBcCisgICAgbWZjX3JlYWRfdGFnX3N0YXR1c19hbGwoKTsKKworLyogU1BVIG1haWxib3ggbWVzc2FnZXMgKi8KKyNkZWZpbmUgU1BVX1JFQURZCTAKKyNkZWZpbmUgU1BVX1NUQVJUCTEKKyNkZWZpbmUgU1BVX0ZJTgkJMgorI2RlZmluZSBTUFVfRVhJVAkzCisKKy8qIFRhZ3MgKi8KKyNkZWZpbmUgUkVUUl9CVUYJMAorI2RlZmluZSBTVFJfQlVGCQkxCisjZGVmaW5lIFRBR19JTklUCTIKKworLyogQnVmZmVyc2l6ZXMgKi8KKyNkZWZpbmUgTUFYX0hEVFZfV0lEVEggMTkyMAorI2RlZmluZSBNQVhfSERUVl9IRUlHSFQgMTA4MAorLyogT25lIHN0cmlkZSBvZiBIRFRWICovCisjZGVmaW5lIEJVRkZFUl9TSVpFIDc2ODAKKworLyogZmJfd3JpdGVyIHBwdS9zcHUgZXhjaGFuZ2UgcGFybXMgKi8KK3N0cnVjdCBmYl93cml0ZXJfcGFybXNfdCB7CisJdWludDhfdCAqZGF0YTsKKwl1aW50OF90ICpjZW50ZXI7CisJdWludDMyX3Qgb3V0X2xpbmVfc3RyaWRlOworCXVpbnQzMl90IGluX2xpbmVfc3RyaWRlOworCXVpbnQzMl90IGJvdW5kZWRfaW5wdXRfaGVpZ2h0OworCXVpbnQzMl90IGJvdW5kZWRfaW5wdXRfd2lkdGg7CisJdWludDMyX3QgZmJfcGl4ZWxfc2l6ZTsKKworCS8qIFRoaXMgcGFkZGluZyBpcyB0byBmdWxmaWxsIHRoZSBuZWVkIGZvciAxNiBieXRlIGFsaWdubWVudC4gT24gcGFybSBjaGFuZ2UsIHVwZGF0ZSEgKi8KKwljaGFyIHBhZGRpbmdbNF07Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTI4KSkpOworCisvKiB5dXYycmdiIHBwdS9zcHUgZXhjaGFuZ2UgcGFybXMgKi8KK3N0cnVjdCB5dXYycmdiX3Bhcm1zX3QgeworCXVpbnQ4X3QqIHlfcGxhbmU7CisJdWludDhfdCogdl9wbGFuZTsKKwl1aW50OF90KiB1X3BsYW5lOworCisJdWludDhfdCogZHN0QnVmZmVyOworCisJdW5zaWduZWQgaW50IHNyY19waXhlbF93aWR0aDsKKwl1bnNpZ25lZCBpbnQgc3JjX3BpeGVsX2hlaWdodDsKKworCS8qIFRoaXMgcGFkZGluZyBpcyB0byBmdWxmaWxsIHRoZSBuZWVkIGZvciAxNiBieXRlIGFsaWdubWVudC4gT24gcGFybSBjaGFuZ2UsIHVwZGF0ZSEgKi8KKwljaGFyIHBhZGRpbmdbMTI4IC0gKCg0ICogc2l6ZW9mKHVpbnQ4X3QgKikgKyAyICogc2l6ZW9mKHVuc2lnbmVkIGludCkpICYgMHg3RildOworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKKworLyogYmlsaW5fc2NhbGVyIHBwdS9zcHUgZXhjaGFuZ2UgcGFybXMgKi8KK3N0cnVjdCBzY2FsZV9wYXJtc190IHsKKwl1aW50OF90KiB5X3BsYW5lOworCXVpbnQ4X3QqIHZfcGxhbmU7CisJdWludDhfdCogdV9wbGFuZTsKKworCXVpbnQ4X3QqIGRzdEJ1ZmZlcjsKKworCXVuc2lnbmVkIGludCBzcmNfcGl4ZWxfd2lkdGg7CisJdW5zaWduZWQgaW50IHNyY19waXhlbF9oZWlnaHQ7CisKKwl1bnNpZ25lZCBpbnQgZHN0X3BpeGVsX3dpZHRoOworCXVuc2lnbmVkIGludCBkc3RfcGl4ZWxfaGVpZ2h0OworCisJLyogVGhpcyBwYWRkaW5nIGlzIHRvIGZ1bGZpbGwgdGhlIG5lZWQgZm9yIDE2IGJ5dGUgYWxpZ25tZW50LiBPbiBwYXJtIGNoYW5nZSwgdXBkYXRlISAqLworCWNoYXIgcGFkZGluZ1sxMjggLSAoKDQgKiBzaXplb2YodWludDhfdCAqKSArIDQgKiBzaXplb2YodW5zaWduZWQgaW50KSkgJiAweDdGKV07Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTI4KSkpOworCisjZW5kaWYgLyogX1NQVV9DT01NT05fSCAqLworCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMzL3NwdWxpYnMveXV2MnJnYl9jb252ZXJ0ZXIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcHMzL3NwdWxpYnMveXV2MnJnYl9jb252ZXJ0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTE2NjkxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9wczMvc3B1bGlicy95dXYycmdiX2NvbnZlcnRlci5jCkBAIC0wLDAgKzEsNjI5IEBACisvKgorICogU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgKiBDRUxMIEJFIFN1cHBvcnQgZm9yIFBTMyBGcmFtZWJ1ZmZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiBVU0EKKyAqCisgKiAgTWFydGluIExvd2luc2tpICA8bG93aW5za2kgW2F0XSBkZSBbZG90XSBpYm0gW2libV0gY29tPgorICogIERpcmsgSGVycmVuZG9lcmZlciA8ZC5oZXJyZW5kb2VyZmVyIFthdF0gZGUgW2RvdF0gaWJtIFtkb3RdIGNvbT4KKyAqICBTUEUgY29kZSBiYXNlZCBvbiByZXNlYXJjaCBieToKKyAqICBSZW5lIEJlY2tlcgorICogIFRoaW1vIEVtbWVyaWNoCisgKi8KKworI2luY2x1ZGUgInNwdV9jb21tb24uaCIKKworI2luY2x1ZGUgPHNwdV9pbnRyaW5zaWNzLmg+CisjaW5jbHVkZSA8c3B1X21mY2lvLmg+CisKKy8vIERlYnVnZ2luZworLy8jZGVmaW5lIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBkZXByaW50ZihmbXQsIGFyZ3MuLi4gKSBcCisJZnByaW50Ziggc3Rkb3V0LCBmbXQsICMjYXJncyApOyBcCisJZmZsdXNoKCBzdGRvdXQgKTsKKyNlbHNlCisjZGVmaW5lIGRlcHJpbnRmKCBmbXQsIGFyZ3MuLi4gKQorI2VuZGlmCisKK3N0cnVjdCB5dXYycmdiX3Bhcm1zX3QgcGFybXNfY29udmVydGVyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTI4KSkpOworCisvKiBBIG1heGltdW0gb2YgOCBsaW5lcyBZLCB0aGVyZWZvcmUgNCBsaW5lcyBWLCA0IGxpbmVzIFUgYXJlIHN0b3JlZAorICogdGhlcmUgbWlnaHQgYmUgdGhlIG5lZWQgdG8gcmV0cmlldmUgbWlzYWxpZ25lZCBkYXRhLCBhZGp1c3QKKyAqIGluY29taW5nIHYgYW5kIHUgcGxhbmUgdG8gYmUgYWJsZSB0byBoYW5kbGUgdGhpcyAoYWRkIDEyOCkKKyAqLwordW5zaWduZWQgY2hhciB5X3BsYW5lWzJdWyhNQVhfSERUVl9XSURUSCArIDEyOCkgKiA0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKK3Vuc2lnbmVkIGNoYXIgdl9wbGFuZVsyXVsoTUFYX0hEVFZfV0lEVEggKyAxMjgpICogMl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxMjgpKSk7Cit1bnNpZ25lZCBjaGFyIHVfcGxhbmVbMl1bKE1BWF9IRFRWX1dJRFRIICsgMTI4KSAqIDJdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTI4KSkpOworCisvKiBBIG1heGltdW0gb2YgNCBsaW5lcyBCR1JBIGFyZSBzdG9yZWQsIDQgYnl0ZSBwZXIgcGl4ZWwgKi8KK3Vuc2lnbmVkIGNoYXIgYmdyYVs0ICogTUFYX0hEVFZfV0lEVEggKiA0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKTsKKworLyogc29tZSB2ZWN0b3JzIG5lZWRlZCBieSB0aGUgZmxvYXQgdG8gaW50IGNvbnZlcnNpb24gKi8KK3N0YXRpYyBjb25zdCB2ZWN0b3IgZmxvYXQgdmVjXzI1NSA9IHsgMjU1LjBmLCAyNTUuMGYsIDI1NS4wZiwgMjU1LjBmIH07CitzdGF0aWMgY29uc3QgdmVjdG9yIGZsb2F0IHZlY18wXzEgPSB7IDAuMWYsIDAuMWYsIDAuMWYsIDAuMWYgfTsKKwordm9pZCB5dXZfdG9fcmdiX3cxNigpOwordm9pZCB5dXZfdG9fcmdiX3czMigpOworCit2b2lkIHl1dl90b19yZ2JfdzE2X2xpbmUodW5zaWduZWQgY2hhciogeV9hZGRyLCB1bnNpZ25lZCBjaGFyKiB2X2FkZHIsIHVuc2lnbmVkIGNoYXIqIHVfYWRkciwgdW5zaWduZWQgY2hhciogYmdyYV9hZGRyLCB1bnNpZ25lZCBpbnQgd2lkdGgpOwordm9pZCB5dXZfdG9fcmdiX3czMl9saW5lKHVuc2lnbmVkIGNoYXIqIHlfYWRkciwgdW5zaWduZWQgY2hhciogdl9hZGRyLCB1bnNpZ25lZCBjaGFyKiB1X2FkZHIsIHVuc2lnbmVkIGNoYXIqIGJncmFfYWRkcl8sIHVuc2lnbmVkIGludCB3aWR0aCk7CisKKworaW50IG1haW4odW5zaWduZWQgbG9uZyBsb25nIHNwZV9pZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgdW5zaWduZWQgbG9uZyBsb25nIGFyZ3AgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworCWRlcHJpbnRmKCJbU1BVXSB5dXYycmdiX3NwdSBpcyB1cC4uLiAob24gU1BFICMlbGx1KVxuIiwgc3BlX2lkKTsKKwl1aW50MzJfdCBlYV9tZmMsIG1ib3g7CisJLy8gc2VuZCByZWFkeSBtZXNzYWdlCisJc3B1X3dyaXRlX291dF9tYm94KFNQVV9SRUFEWSk7CisKKwl3aGlsZSAoMSkgeworCQkvKiBDaGVjayBtYWlsYm94ICovCisJCW1ib3ggPSBzcHVfcmVhZF9pbl9tYm94KCk7CisJCWRlcHJpbnRmKCJbU1BVXSBNZXNzYWdlIGlzICV1XG4iLCBtYm94KTsKKwkJc3dpdGNoIChtYm94KSB7CisJCQljYXNlIFNQVV9FWElUOgorCQkJCWRlcHJpbnRmKCJbU1BVXSBmYl93cml0ZXIgZ29lcyBkb3duLi4uXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCWNhc2UgU1BVX1NUQVJUOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkZXByaW50ZigiW1NQVV0gQ2Fubm90IGhhbmRsZSBtZXNzYWdlXG4iKTsKKwkJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRhZyBNYW5hZ2VyIHNldHVwICovCisJCXVuc2lnbmVkIGludCB0YWdfaWQ7CisJCXRhZ19pZCA9IG1mY19tdWx0aV90YWdfcmVzZXJ2ZSgxKTsKKwkJaWYgKHRhZ19pZCA9PSBNRkNfVEFHX0lOVkFMSUQpIHsKKwkJCWRlcHJpbnRmKCJbU1BVXSBGYWlsZWQgdG8gcmVzZXJ2ZSBtZmMgdGFncyBvbiB5dXYycmdiX2NvbnZlcnRlclxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIERNQSB0cmFuc2ZlciBmb3IgdGhlIGlucHV0IHBhcmFtZXRlcnMgKi8KKwkJZWFfbWZjID0gc3B1X3JlYWRfaW5fbWJveCgpOworCQlkZXByaW50ZigiW1NQVV0gTWVzc2FnZSBvbiB5dXYycmdiX2NvbnZlcnRlciBpcyAldVxuIiwgZWFfbWZjKTsKKwkJc3B1X21mY2RtYTMyKCZwYXJtc19jb252ZXJ0ZXIsICh1bnNpZ25lZCBpbnQpZWFfbWZjLCBzaXplb2Yoc3RydWN0IHl1djJyZ2JfcGFybXNfdCksIHRhZ19pZCwgTUZDX0dFVF9DTUQpOworCQlETUFfV0FJVF9UQUcodGFnX2lkKTsKKworCQkvKiBUaGVyZSBhcmUgYWxpZ25tZW50IGlzc3VlcyB0aGF0IGludm9sdmUgaGFuZGxpbmcgb2Ygc3BlY2lhbCBjYXNlcworCQkgKiBhIHdpZHRoIG9mIDMyIHJlc3VsdHMgaW4gYSB3aWR0aCBvZiAxNiBpbiB0aGUgY2hyb21pbmFuY2UKKwkJICogLS0+IGNob29zZSB0aGUgcHJvcGVyIGhhbmRsaW5nIHRvIG9wdGltaXplIHRoZSBwZXJmb3JtYW5jZQorCQkgKi8KKwkJZGVwcmludGYoIltTUFVdIENvbnZlcnQgJWl4JWkgZnJvbSBZVVYgdG8gUkdCXG4iLCBwYXJtc19jb252ZXJ0ZXIuc3JjX3BpeGVsX3dpZHRoLCBwYXJtc19jb252ZXJ0ZXIuc3JjX3BpeGVsX2hlaWdodCk7CisJCWlmIChwYXJtc19jb252ZXJ0ZXIuc3JjX3BpeGVsX3dpZHRoICYgMHgxZikgeworCQkJZGVwcmludGYoIltTUFVdIFVzaW5nIHl1dl90b19yZ2JfdzE2XG4iKTsKKwkJCXl1dl90b19yZ2JfdzE2KCk7CisJCX0gZWxzZSB7CisJCQlkZXByaW50ZigiW1NQVV0gVXNpbmcgeXV2X3RvX3JnYl93MzJcbiIpOworCQkJeXV2X3RvX3JnYl93MzIoKTsKKwkJfQorCisJCW1mY19tdWx0aV90YWdfcmVsZWFzZSh0YWdfaWQsIDEpOworCQlkZXByaW50ZigiW1NQVV0geXV2MnJnYl9zcHUuLi4gZG9uZSFcbiIpOworCQkvKiBTZW5kIEZJTiBtZXNzYWdlICovCisJCXNwdV93cml0ZV9vdXRfbWJveChTUFVfRklOKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogZmxvYXRfdG9fY2hhcigpCisgKgorICogY29udmVydHMgYSBmbG9hdCB0byBhIGNoYXJhY3RlciB1c2luZyBzYXR1cmF0ZWQKKyAqIGFyaXRobWV0aWMKKyAqCisgKiBAcGFyYW0gcyBmbG9hdCBmb3IgY29udmVyc2lvbgorICogQHJldHVybnMgY29udmVydGVkIGNoYXJhY3RlcgorICovCitpbmxpbmUgc3RhdGljIHVuc2lnbmVkIGNoYXIgZmxvYXRfdG9fY2hhcihmbG9hdCBzKSB7CisJdmVjdG9yIGZsb2F0IHZlY19zID0gc3B1X3NwbGF0cyhzKTsKKwl2ZWN0b3IgdW5zaWduZWQgaW50IHNlbGVjdF8xID0gc3B1X2NtcGd0KHZlY18wXzEsIHZlY19zKTsKKwl2ZWNfcyA9IHNwdV9zZWwodmVjX3MsIHZlY18wXzEsIHNlbGVjdF8xKTsKKworCXZlY3RvciB1bnNpZ25lZCBpbnQgc2VsZWN0XzIgPSBzcHVfY21wZ3QodmVjX3MsIHZlY18yNTUpOworCXZlY19zID0gc3B1X3NlbCh2ZWNfcywgdmVjXzI1NSwgc2VsZWN0XzIpOworCXJldHVybiAodW5zaWduZWQgY2hhcikgc3B1X2V4dHJhY3QodmVjX3MsMCk7Cit9CisKKworLyoKKyAqIHZmbG9hdF90b192dWludCgpCisgKgorICogY29udmVydHMgYSBmbG9hdCB2ZWN0b3IgdG8gYW4gdW5zaW5nZWQgaW50IHZlY3RvciB1c2luZyBzYXR1cmF0ZWQKKyAqIGFyaXRobWV0aWMKKyAqCisgKiBAcGFyYW0gdmVjX3MgZmxvYXQgdmVjdG9yIGZvciBjb252ZXJzaW9uCisgKiBAcmV0dXJucyBjb252ZXJ0ZWQgdW5zaWduZWQgaW50IHZlY3RvcgorICovCitpbmxpbmUgc3RhdGljIHZlY3RvciB1bnNpZ25lZCBpbnQgdmZsb2F0X3RvX3Z1aW50KHZlY3RvciBmbG9hdCB2ZWNfcykgeworCXZlY3RvciB1bnNpZ25lZCBpbnQgc2VsZWN0XzEgPSBzcHVfY21wZ3QodmVjXzBfMSwgdmVjX3MpOworCXZlY19zID0gc3B1X3NlbCh2ZWNfcywgdmVjXzBfMSwgc2VsZWN0XzEpOworCisJdmVjdG9yIHVuc2lnbmVkIGludCBzZWxlY3RfMiA9IHNwdV9jbXBndCh2ZWNfcywgdmVjXzI1NSk7CisJdmVjX3MgPSBzcHVfc2VsKHZlY19zLCB2ZWNfMjU1LCBzZWxlY3RfMik7CisJcmV0dXJuIHNwdV9jb252dHUodmVjX3MsMCk7Cit9CisKKwordm9pZCB5dXZfdG9fcmdiX3cxNigpIHsKKwkvLyBQaXhlbCBkaW1lbnNpb25zIG9mIHRoZSBwaWN0dXJlCisJdWludDMyX3Qgd2lkdGgsIGhlaWdodDsKKworCS8vIEV4dHJhY3QgcGFyYW1ldGVycworCXdpZHRoID0gcGFybXNfY29udmVydGVyLnNyY19waXhlbF93aWR0aDsKKwloZWlnaHQgPSBwYXJtc19jb252ZXJ0ZXIuc3JjX3BpeGVsX2hlaWdodDsKKworCS8vIFBsYW5lIGRhdGEgbWFuYWdlbWVudAorCS8vIFkKKwl1bnNpZ25lZCBjaGFyKiByYW1fYWRkcl95ID0gcGFybXNfY29udmVydGVyLnlfcGxhbmU7CisJLy8gVgorCXVuc2lnbmVkIGNoYXIqIHJhbV9hZGRyX3YgPSBwYXJtc19jb252ZXJ0ZXIudl9wbGFuZTsKKwkvLyBVCisJdW5zaWduZWQgY2hhciogcmFtX2FkZHJfdSA9IHBhcm1zX2NvbnZlcnRlci51X3BsYW5lOworCisJLy8gQkdSQQorCXVuc2lnbmVkIGNoYXIqIHJhbV9hZGRyX2JncmEgPSBwYXJtc19jb252ZXJ0ZXIuZHN0QnVmZmVyOworCisJLy8gU3RyaWRlcworCXVuc2lnbmVkIGludCBzdHJpZGVfeSA9IHdpZHRoOworCXVuc2lnbmVkIGludCBzdHJpZGVfdnUgPSB3aWR0aD4+MTsKKworCS8vIEJ1ZmZlciBtYW5hZ2VtZW50CisJdW5zaWduZWQgaW50IGJ1Zl9pZHggPSAwOworCXVuc2lnbmVkIGludCBzaXplXzRsaW5lc195ID0gc3RyaWRlX3k8PDI7CisJdW5zaWduZWQgaW50IHNpemVfMmxpbmVzX3kgPSBzdHJpZGVfeTw8MTsKKwl1bnNpZ25lZCBpbnQgc2l6ZV8ybGluZXNfdnUgPSBzdHJpZGVfdnU8PDE7CisKKwkvLyAyKndpZHRoKjRieXRlX3Blcl9waXhlbAorCXVuc2lnbmVkIGludCBzaXplXzJsaW5lc19iZ3JhID0gd2lkdGg8PDM7CisKKworCS8vIHN0YXJ0IGRvdWJsZS1idWZmZXJlZCBwcm9jZXNzaW5nCisJLy8gNCBsaW5lcyB5CisJc3B1X21mY2RtYTMyKHlfcGxhbmVbYnVmX2lkeF0sICh1bnNpZ25lZCBpbnQpIHJhbV9hZGRyX3ksIHNpemVfNGxpbmVzX3ksIFJFVFJfQlVGK2J1Zl9pZHgsIE1GQ19HRVRfQ01EKTsKKworCS8vIDIgbGluZXMgdgorCXNwdV9tZmNkbWEzMih2X3BsYW5lW2J1Zl9pZHhdLCAodW5zaWduZWQgaW50KSByYW1fYWRkcl92LCBzaXplXzJsaW5lc192dSwgUkVUUl9CVUYrYnVmX2lkeCwgTUZDX0dFVF9DTUQpOworCisJLy8gMiBsaW5lcyB1CisJc3B1X21mY2RtYTMyKHVfcGxhbmVbYnVmX2lkeF0sICh1bnNpZ25lZCBpbnQpIHJhbV9hZGRyX3UsIHNpemVfMmxpbmVzX3Z1LCBSRVRSX0JVRitidWZfaWR4LCBNRkNfR0VUX0NNRCk7CisKKwkvLyBXYWl0IGZvciB0aGVzZSB0cmFuc2ZlcnMgdG8gYmUgY29tcGxldGVkCisJRE1BX1dBSVRfVEFHKChSRVRSX0JVRiArIGJ1Zl9pZHgpKTsKKworCXVuc2lnbmVkIGludCBpOworCWZvcihpPTA7IGk8KGhlaWdodD4+MiktMTsgaSsrKSB7CisKKwkJYnVmX2lkeF49MTsKKworCQkvLyA0IGxpbmVzIHkKKwkJc3B1X21mY2RtYTMyKHlfcGxhbmVbYnVmX2lkeF0sICh1bnNpZ25lZCBpbnQpIHJhbV9hZGRyX3krc2l6ZV80bGluZXNfeSwgc2l6ZV80bGluZXNfeSwgUkVUUl9CVUYrYnVmX2lkeCwgTUZDX0dFVF9DTUQpOworCisJCS8vIDIgbGluZXMgdgorCQlzcHVfbWZjZG1hMzIodl9wbGFuZVtidWZfaWR4XSwgKHVuc2lnbmVkIGludCkgcmFtX2FkZHJfditzaXplXzJsaW5lc192dSwgc2l6ZV8ybGluZXNfdnUsIFJFVFJfQlVGK2J1Zl9pZHgsIE1GQ19HRVRfQ01EKTsKKworCQkvLyAyIGxpbmVzIHUKKwkJc3B1X21mY2RtYTMyKHVfcGxhbmVbYnVmX2lkeF0sICh1bnNpZ25lZCBpbnQpIHJhbV9hZGRyX3Urc2l6ZV8ybGluZXNfdnUsIHNpemVfMmxpbmVzX3Z1LCBSRVRSX0JVRitidWZfaWR4LCBNRkNfR0VUX0NNRCk7CisKKwkJRE1BX1dBSVRfVEFHKChSRVRSX0JVRiArIGJ1Zl9pZHgpKTsKKworCQlidWZfaWR4Xj0xOworCisKKwkJLy8gQ29udmVydCBZVVYgdG8gQkdSQSwgc3RvcmUgaXQgYmFjayAoZmlyc3QgdHdvIGxpbmVzKQorCQl5dXZfdG9fcmdiX3cxNl9saW5lKHlfcGxhbmVbYnVmX2lkeF0sIHZfcGxhbmVbYnVmX2lkeF0sIHVfcGxhbmVbYnVmX2lkeF0sIGJncmEsIHdpZHRoKTsKKworCQkvLyBOZXh0IHR3byBsaW5lcworCQl5dXZfdG9fcmdiX3cxNl9saW5lKHlfcGxhbmVbYnVmX2lkeF0gKyBzaXplXzJsaW5lc195LAorCQkJCXZfcGxhbmVbYnVmX2lkeF0gKyBzdHJpZGVfdnUsCisJCQkJdV9wbGFuZVtidWZfaWR4XSArIHN0cmlkZV92dSwKKwkJCQliZ3JhICsgc2l6ZV8ybGluZXNfYmdyYSwKKwkJCQl3aWR0aCk7CisKKwkJLy8gV2FpdCBmb3IgcHJldmlvdXMgc3RvcmluZyB0cmFuc2ZlciB0byBiZSBjb21wbGV0ZWQKKwkJRE1BX1dBSVRfVEFHKFNUUl9CVUYpOworCisJCS8vIFN0b3JlIGNvbnZlcnRlZCBsaW5lcyBpbiB0d28gc3RlcHMtPm1heCB0cmFuc2ZlciBzaXplIDE2Mzg0CisJCXNwdV9tZmNkbWEzMihiZ3JhLCAodW5zaWduZWQgaW50KSByYW1fYWRkcl9iZ3JhLCBzaXplXzJsaW5lc19iZ3JhLCBTVFJfQlVGLCBNRkNfUFVUX0NNRCk7CisJCXJhbV9hZGRyX2JncmEgKz0gc2l6ZV8ybGluZXNfYmdyYTsKKwkJc3B1X21mY2RtYTMyKGJncmErc2l6ZV8ybGluZXNfYmdyYSwgKHVuc2lnbmVkIGludCkgcmFtX2FkZHJfYmdyYSwgc2l6ZV8ybGluZXNfYmdyYSwgU1RSX0JVRiwgTUZDX1BVVF9DTUQpOworCQlyYW1fYWRkcl9iZ3JhICs9IHNpemVfMmxpbmVzX2JncmE7CisKKwkJLy8gTW92ZSA0IGxpbmVzCisJCXJhbV9hZGRyX3kgKz0gc2l6ZV80bGluZXNfeTsKKwkJcmFtX2FkZHJfdiArPSBzaXplXzJsaW5lc192dTsKKwkJcmFtX2FkZHJfdSArPSBzaXplXzJsaW5lc192dTsKKworCQlidWZfaWR4Xj0xOworCX0KKworCS8vIENvbnZlcnQgWVVWIHRvIEJHUkEsIHN0b3JlIGl0IGJhY2sgKGZpcnN0IHR3byBsaW5lcykKKwl5dXZfdG9fcmdiX3cxNl9saW5lKHlfcGxhbmVbYnVmX2lkeF0sIHZfcGxhbmVbYnVmX2lkeF0sIHVfcGxhbmVbYnVmX2lkeF0sIGJncmEsIHdpZHRoKTsKKworCS8vIE5leHQgdHdvIGxpbmVzCisJeXV2X3RvX3JnYl93MTZfbGluZSh5X3BsYW5lW2J1Zl9pZHhdICsgc2l6ZV8ybGluZXNfeSwKKwkJCXZfcGxhbmVbYnVmX2lkeF0gKyBzdHJpZGVfdnUsCisJCQl1X3BsYW5lW2J1Zl9pZHhdICsgc3RyaWRlX3Z1LAorCQkJYmdyYSArIHNpemVfMmxpbmVzX2JncmEsCisJCQl3aWR0aCk7CisKKwkvLyBXYWl0IGZvciBwcmV2aW91cyBzdG9yaW5nIHRyYW5zZmVyIHRvIGJlIGNvbXBsZXRlZAorCURNQV9XQUlUX1RBRyhTVFJfQlVGKTsKKwlzcHVfbWZjZG1hMzIoYmdyYSwgKHVuc2lnbmVkIGludCkgcmFtX2FkZHJfYmdyYSwgc2l6ZV8ybGluZXNfYmdyYSwgU1RSX0JVRiwgTUZDX1BVVF9DTUQpOworCXJhbV9hZGRyX2JncmEgKz0gc2l6ZV8ybGluZXNfYmdyYTsKKwlzcHVfbWZjZG1hMzIoYmdyYStzaXplXzJsaW5lc19iZ3JhLCAodW5zaWduZWQgaW50KSByYW1fYWRkcl9iZ3JhLCBzaXplXzJsaW5lc19iZ3JhLCBTVFJfQlVGLCBNRkNfUFVUX0NNRCk7CisKKwkvLyB3YWl0IGZvciBwcmV2aW91cyBzdG9yaW5nIHRyYW5zZmVyIHRvIGJlIGNvbXBsZXRlZAorCURNQV9XQUlUX1RBRyhTVFJfQlVGKTsKKworfQorCisKK3ZvaWQgeXV2X3RvX3JnYl93MzIoKSB7CisJLy8gUGl4ZWwgZGltZW5zaW9ucyBvZiB0aGUgcGljdHVyZQorCXVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisKKwkvLyBFeHRyYWN0IHBhcmFtZXRlcnMKKwl3aWR0aCA9IHBhcm1zX2NvbnZlcnRlci5zcmNfcGl4ZWxfd2lkdGg7CisJaGVpZ2h0ID0gcGFybXNfY29udmVydGVyLnNyY19waXhlbF9oZWlnaHQ7CisKKwkvLyBQbGFuZSBkYXRhIG1hbmFnZW1lbnQKKwkvLyBZCisJdW5zaWduZWQgY2hhciogcmFtX2FkZHJfeSA9IHBhcm1zX2NvbnZlcnRlci55X3BsYW5lOworCS8vIFYKKwl1bnNpZ25lZCBjaGFyKiByYW1fYWRkcl92ID0gcGFybXNfY29udmVydGVyLnZfcGxhbmU7CisJLy8gVQorCXVuc2lnbmVkIGNoYXIqIHJhbV9hZGRyX3UgPSBwYXJtc19jb252ZXJ0ZXIudV9wbGFuZTsKKworCS8vIEJHUkEKKwl1bnNpZ25lZCBjaGFyKiByYW1fYWRkcl9iZ3JhID0gcGFybXNfY29udmVydGVyLmRzdEJ1ZmZlcjsKKworCS8vIFN0cmlkZXMKKwl1bnNpZ25lZCBpbnQgc3RyaWRlX3kgPSB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgc3RyaWRlX3Z1ID0gd2lkdGg+PjE7CisKKwkvLyBCdWZmZXIgbWFuYWdlbWVudAorCXVuc2lnbmVkIGludCBidWZfaWR4ID0gMDsKKwl1bnNpZ25lZCBpbnQgc2l6ZV80bGluZXNfeSA9IHN0cmlkZV95PDwyOworCXVuc2lnbmVkIGludCBzaXplXzJsaW5lc195ID0gc3RyaWRlX3k8PDE7CisJdW5zaWduZWQgaW50IHNpemVfMmxpbmVzX3Z1ID0gc3RyaWRlX3Z1PDwxOworCisJLy8gMip3aWR0aCo0Ynl0ZV9wZXJfcGl4ZWwKKwl1bnNpZ25lZCBpbnQgc2l6ZV8ybGluZXNfYmdyYSA9IHdpZHRoPDwzOworCisJLy8gc3RhcnQgZG91YmxlLWJ1ZmZlcmVkIHByb2Nlc3NpbmcKKwkvLyA0IGxpbmVzIHkKKwlzcHVfbWZjZG1hMzIoeV9wbGFuZVtidWZfaWR4XSwgKHVuc2lnbmVkIGludCkgcmFtX2FkZHJfeSwgc2l6ZV80bGluZXNfeSwgUkVUUl9CVUYgKyBidWZfaWR4LCBNRkNfR0VUX0NNRCk7CisJLy8gMiBsaW5lcyB2CisJc3B1X21mY2RtYTMyKHZfcGxhbmVbYnVmX2lkeF0sICh1bnNpZ25lZCBpbnQpIHJhbV9hZGRyX3YsIHNpemVfMmxpbmVzX3Z1LCBSRVRSX0JVRiArIGJ1Zl9pZHgsIE1GQ19HRVRfQ01EKTsKKwkvLyAyIGxpbmVzIHUKKwlzcHVfbWZjZG1hMzIodV9wbGFuZVtidWZfaWR4XSwgKHVuc2lnbmVkIGludCkgcmFtX2FkZHJfdSwgc2l6ZV8ybGluZXNfdnUsIFJFVFJfQlVGICsgYnVmX2lkeCwgTUZDX0dFVF9DTUQpOworCisJLy8gV2FpdCBmb3IgdGhlc2UgdHJhbnNmZXJzIHRvIGJlIGNvbXBsZXRlZAorCURNQV9XQUlUX1RBRygoUkVUUl9CVUYgKyBidWZfaWR4KSk7CisKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IoaT0wOyBpIDwgKGhlaWdodD4+MiktMTsgaSsrKSB7CisJCWJ1Zl9pZHhePTE7CisJCS8vIDQgbGluZXMgeQorCQlzcHVfbWZjZG1hMzIoeV9wbGFuZVtidWZfaWR4XSwgKHVuc2lnbmVkIGludCkgcmFtX2FkZHJfeStzaXplXzRsaW5lc195LCBzaXplXzRsaW5lc195LCBSRVRSX0JVRiArIGJ1Zl9pZHgsIE1GQ19HRVRfQ01EKTsKKwkJZGVwcmludGYoIjRsaW5lcyA9ICVkXG4iLCBzaXplXzRsaW5lc195KTsKKwkJLy8gMiBsaW5lcyB2CisJCXNwdV9tZmNkbWEzMih2X3BsYW5lW2J1Zl9pZHhdLCAodW5zaWduZWQgaW50KSByYW1fYWRkcl92K3NpemVfMmxpbmVzX3Z1LCBzaXplXzJsaW5lc192dSwgUkVUUl9CVUYgKyBidWZfaWR4LCBNRkNfR0VUX0NNRCk7CisJCWRlcHJpbnRmKCIybGluZXMgPSAlZFxuIiwgc2l6ZV8ybGluZXNfdnUpOworCQkvLyAyIGxpbmVzIHUKKwkJc3B1X21mY2RtYTMyKHVfcGxhbmVbYnVmX2lkeF0sICh1bnNpZ25lZCBpbnQpIHJhbV9hZGRyX3Urc2l6ZV8ybGluZXNfdnUsIHNpemVfMmxpbmVzX3Z1LCBSRVRSX0JVRiArIGJ1Zl9pZHgsIE1GQ19HRVRfQ01EKTsKKwkJZGVwcmludGYoIjJsaW5lcyA9ICVkXG4iLCBzaXplXzJsaW5lc192dSk7CisKKwkJRE1BX1dBSVRfVEFHKChSRVRSX0JVRiArIGJ1Zl9pZHgpKTsKKworCQlidWZfaWR4Xj0xOworCisJCS8vIENvbnZlcnQgWVVWIHRvIEJHUkEsIHN0b3JlIGl0IGJhY2sgKGZpcnN0IHR3byBsaW5lcykKKwkJeXV2X3RvX3JnYl93MzJfbGluZSh5X3BsYW5lW2J1Zl9pZHhdLCB2X3BsYW5lW2J1Zl9pZHhdLCB1X3BsYW5lW2J1Zl9pZHhdLCBiZ3JhLCB3aWR0aCk7CisKKwkJLy8gTmV4dCB0d28gbGluZXMKKwkJeXV2X3RvX3JnYl93MzJfbGluZSh5X3BsYW5lW2J1Zl9pZHhdICsgc2l6ZV8ybGluZXNfeSwKKwkJCQl2X3BsYW5lW2J1Zl9pZHhdICsgc3RyaWRlX3Z1LAorCQkJCXVfcGxhbmVbYnVmX2lkeF0gKyBzdHJpZGVfdnUsCisJCQkJYmdyYSArIHNpemVfMmxpbmVzX2JncmEsCisJCQkJd2lkdGgpOworCisJCS8vIFdhaXQgZm9yIHByZXZpb3VzIHN0b3JpbmcgdHJhbnNmZXIgdG8gYmUgY29tcGxldGVkCisJCURNQV9XQUlUX1RBRyhTVFJfQlVGKTsKKworCQkvLyBTdG9yZSBjb252ZXJ0ZWQgbGluZXMgaW4gdHdvIHN0ZXBzLT5tYXggdHJhbnNmZXIgc2l6ZSAxNjM4NAorCQlzcHVfbWZjZG1hMzIoYmdyYSwgKHVuc2lnbmVkIGludClyYW1fYWRkcl9iZ3JhLCBzaXplXzJsaW5lc19iZ3JhLCBTVFJfQlVGLCBNRkNfUFVUX0NNRCk7CisJCXJhbV9hZGRyX2JncmEgKz0gc2l6ZV8ybGluZXNfYmdyYTsKKwkJc3B1X21mY2RtYTMyKGJncmEgKyBzaXplXzJsaW5lc19iZ3JhLCAodW5zaWduZWQgaW50KXJhbV9hZGRyX2JncmEsIHNpemVfMmxpbmVzX2JncmEsIFNUUl9CVUYsIE1GQ19QVVRfQ01EKTsKKwkJcmFtX2FkZHJfYmdyYSArPSBzaXplXzJsaW5lc19iZ3JhOworCisJCS8vIE1vdmUgNCBsaW5lcworCQlyYW1fYWRkcl95ICs9IHNpemVfNGxpbmVzX3k7CisJCXJhbV9hZGRyX3YgKz0gc2l6ZV8ybGluZXNfdnU7CisJCXJhbV9hZGRyX3UgKz0gc2l6ZV8ybGluZXNfdnU7CisKKwkJYnVmX2lkeF49MTsKKwl9CisKKwkvLyBDb252ZXJ0IFlVViB0byBCR1JBLCBzdG9yZSBpdCBiYWNrIChmaXJzdCB0d28gbGluZXMpCisJeXV2X3RvX3JnYl93MzJfbGluZSh5X3BsYW5lW2J1Zl9pZHhdLCB2X3BsYW5lW2J1Zl9pZHhdLCB1X3BsYW5lW2J1Zl9pZHhdLCBiZ3JhLCB3aWR0aCk7CisKKwkvLyBOZXh0IHR3byBsaW5lcworCXl1dl90b19yZ2JfdzMyX2xpbmUoeV9wbGFuZVtidWZfaWR4XSArIHNpemVfMmxpbmVzX3ksCisJCQl2X3BsYW5lW2J1Zl9pZHhdICsgc3RyaWRlX3Z1LAorCQkJdV9wbGFuZVtidWZfaWR4XSArIHN0cmlkZV92dSwKKwkJCWJncmEgKyBzaXplXzJsaW5lc19iZ3JhLAorCQkJd2lkdGgpOworCisJLy8gV2FpdCBmb3IgcHJldmlvdXMgc3RvcmluZyB0cmFuc2ZlciB0byBiZSBjb21wbGV0ZWQKKwlETUFfV0FJVF9UQUcoU1RSX0JVRik7CisJc3B1X21mY2RtYTMyKGJncmEsICh1bnNpZ25lZCBpbnQpIHJhbV9hZGRyX2JncmEsIHNpemVfMmxpbmVzX2JncmEsIFNUUl9CVUYsIE1GQ19QVVRfQ01EKTsKKwlyYW1fYWRkcl9iZ3JhICs9IHNpemVfMmxpbmVzX2JncmE7CisJc3B1X21mY2RtYTMyKGJncmEgKyBzaXplXzJsaW5lc19iZ3JhLCAodW5zaWduZWQgaW50KSByYW1fYWRkcl9iZ3JhLCBzaXplXzJsaW5lc19iZ3JhLCBTVFJfQlVGLCBNRkNfUFVUX0NNRCk7CisKKwkvLyBXYWl0IGZvciBwcmV2aW91cyBzdG9yaW5nIHRyYW5zZmVyIHRvIGJlIGNvbXBsZXRlZAorCURNQV9XQUlUX1RBRyhTVFJfQlVGKTsKK30KKworCisvKiBTb21lIHZlY3RvcnMgbmVlZGVkIGJ5IHRoZSB5dXYgMiByZ2IgY29udmVyc2lvbiBhbGdvcml0aG0gKi8KK2NvbnN0IHZlY3RvciBmbG9hdCB2ZWNfbWludXNfMTI4ID0geyAtMTI4LjBmLCAtMTI4LjBmLCAtMTI4LjBmLCAtMTI4LjBmIH07Citjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZWNfbnVsbCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmVjX2NoYXIyaW50X2ZpcnN0ID0geyAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDEzIH07Citjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZWNfY2hhcjJpbnRfc2Vjb25kID0geyAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDE3IH07Citjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZWNfY2hhcjJpbnRfdGhpcmQgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUIgfTsKK2NvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZlY19jaGFyMmludF9mb3VydGggPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUYgfTsKKworY29uc3QgdmVjdG9yIGZsb2F0IHZlY19SX3ByZWNhbGNfY29lZmYgPSB7MS40MDNmLCAxLjQwM2YsIDEuNDAzZiwgMS40MDNmfTsKK2NvbnN0IHZlY3RvciBmbG9hdCB2ZWNfR3VfcHJlY2FsY19jb2VmZiA9IHstMC4zNDRmLCAtMC4zNDRmLCAtMC4zNDRmLCAtMC4zNDRmfTsKK2NvbnN0IHZlY3RvciBmbG9hdCB2ZWNfR3ZfcHJlY2FsY19jb2VmZiA9IHstMC43MTRmLCAtMC43MTRmLCAtMC43MTRmLCAtMC43MTRmfTsKK2NvbnN0IHZlY3RvciBmbG9hdCB2ZWNfQl9wcmVjYWxjX2NvZWZmID0gezEuNzczZiwgMS43NzNmLCAxLjc3M2YsIDEuNzczZn07CisKK2NvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgdmVjX2FscGhhID0gIHsgMjU1IDw8IDI0LCAyNTUgPDwgMjQsIDI1NSA8PCAyNCwgMjU1IDw8IDI0IH07CisKK2NvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZlY19zZWxlY3RfZmxvYXRzX3VwcGVyID0geyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA0LCAweDA1LCAweDA2LCAweDA3IH07Citjb25zdCB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZWNfc2VsZWN0X2Zsb2F0c19sb3dlciA9IHsgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiB9OworCisKKy8qCisgKiB5dXZfdG9fcmdiX3cxNigpCisgKgorICogcHJvY2Vzc2VzIHRvIGxpbmUgb2YgeXV2LWlucHV0LCB3aWR0aCBoYXMgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNgorICogdHdvIGxpbmVzIG9mIHl1diBhcmUgdGFrZW4gYXMgaW5wdXQKKyAqCisgKiBAcGFyYW0geV9hZGRyIGFkZHJlc3Mgb2YgdGhlIHkgcGxhbmUgaW4gbG9jYWwgc3RvcmUKKyAqIEBwYXJhbSB2X2FkZHIgYWRkcmVzcyBvZiB0aGUgdiBwbGFuZSBpbiBsb2NhbCBzdG9yZQorICogQHBhcmFtIHVfYWRkciBhZGRyZXNzIG9mIHRoZSB1IHBsYW5lIGluIGxvY2FsIHN0b3JlCisgKiBAcGFyYW0gYmdyYV9hZGRyXyBhZGRyZXNzIG9mIHRoZSBiZ3JhIG91dHB1dCBidWZmZXIKKyAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggaW4gcGl4ZWwKKyAqLwordm9pZCB5dXZfdG9fcmdiX3cxNl9saW5lKHVuc2lnbmVkIGNoYXIqIHlfYWRkciwgdW5zaWduZWQgY2hhciogdl9hZGRyLCB1bnNpZ25lZCBjaGFyKiB1X2FkZHIsIHVuc2lnbmVkIGNoYXIqIGJncmFfYWRkcl8sIHVuc2lnbmVkIGludCB3aWR0aCkgeworCS8vIGVhY2ggcGl4ZWwgaXMgc3RvcmVkIGFzIGFuIGludGVnZXIKKwl1bnNpZ25lZCBpbnQqIGJncmFfYWRkciA9ICh1bnNpZ25lZCBpbnQqKSBiZ3JhX2FkZHJfOworCisJdW5zaWduZWQgaW50IHg7CisJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrPTIpIHsKKwkJLy8gR2VoZSB6d2Vpc2Nocml0dGlnIGR1cmNoIGRpZSB6ZWlsZSwgZGEgamVkZXIgdSB1bmQgdiB3ZXJ0IGZ1ZXIgNCBwaXhlbCh6d2VpIGhvY2gsIHp3ZWkgYnJlaXQpIGdpbHQKKwkJY29uc3QgdW5zaWduZWQgY2hhciBZXzEgPSAqKHlfYWRkciArIHgpOworCQljb25zdCB1bnNpZ25lZCBjaGFyIFlfMiA9ICooeV9hZGRyICsgeCArIDEpOworCQljb25zdCB1bnNpZ25lZCBjaGFyIFlfMyA9ICooeV9hZGRyICsgeCArIHdpZHRoKTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciBZXzQgPSAqKHlfYWRkciArIHggKyB3aWR0aCArIDEpOworCQljb25zdCB1bnNpZ25lZCBjaGFyIFUgPSAqKHVfYWRkciArICh4ID4+IDEpKTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciBWID0gKih2X2FkZHIgKyAoeCA+PiAxKSk7CisKKwkJZmxvYXQgVl9taW51c18xMjggPSAoZmxvYXQpKChmbG9hdClWIC0gMTI4LjBmKTsKKwkJZmxvYXQgVV9taW51c18xMjggPSAoZmxvYXQpKChmbG9hdClVIC0gMTI4LjBmKTsKKworCQlmbG9hdCBSX3ByZWNhbGN1bGF0ZSA9IDEuNDAzZiAqIFZfbWludXNfMTI4OworCQlmbG9hdCBHX3ByZWNhbGN1bGF0ZSA9IC0oMC4zNDRmICogVV9taW51c18xMjggKyAwLjcxNGYgKiBWX21pbnVzXzEyOCk7CisJCWZsb2F0IEJfcHJlY2FsY3VsYXRlID0gMS43NzNmICogVV9taW51c18xMjg7CisKKwkJY29uc3QgdW5zaWduZWQgY2hhciBSXzEgPSBmbG9hdF90b19jaGFyKChZXzEgKyBSX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB1bnNpZ25lZCBjaGFyIFJfMiA9IGZsb2F0X3RvX2NoYXIoKFlfMiArIFJfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgUl8zID0gZmxvYXRfdG9fY2hhcigoWV8zICsgUl9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciBSXzQgPSBmbG9hdF90b19jaGFyKChZXzQgKyBSX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB1bnNpZ25lZCBjaGFyIEdfMSA9IGZsb2F0X3RvX2NoYXIoKFlfMSArIEdfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgR18yID0gZmxvYXRfdG9fY2hhcigoWV8yICsgR19wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciBHXzMgPSBmbG9hdF90b19jaGFyKChZXzMgKyBHX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB1bnNpZ25lZCBjaGFyIEdfNCA9IGZsb2F0X3RvX2NoYXIoKFlfNCArIEdfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgQl8xID0gZmxvYXRfdG9fY2hhcigoWV8xICsgQl9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciBCXzIgPSBmbG9hdF90b19jaGFyKChZXzIgKyBCX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB1bnNpZ25lZCBjaGFyIEJfMyA9IGZsb2F0X3RvX2NoYXIoKFlfMyArIEJfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgQl80ID0gZmxvYXRfdG9fY2hhcigoWV80ICsgQl9wcmVjYWxjdWxhdGUpKTsKKworCQkqKGJncmFfYWRkciArIHgpID0gKEJfMSA8PCAwKXwgKEdfMSA8PCA4KSB8IChSXzEgPDwgMTYpIHwgKDI1NSA8PCAyNCk7CisJCSooYmdyYV9hZGRyICsgeCArIDEpID0gKEJfMiA8PCAwKXwgKEdfMiA8PCA4KSB8IChSXzIgPDwgMTYpIHwgKDI1NSA8PCAyNCk7CisJCSooYmdyYV9hZGRyICsgeCArIHdpZHRoKSA9IChCXzMgPDwgMCl8IChHXzMgPDwgOCkgfCAoUl8zIDw8IDE2KSB8ICgyNTUgPDwgMjQpOworCQkqKGJncmFfYWRkciArIHggKyB3aWR0aCArIDEpID0gKEJfNCA8PCAwKXwgKEdfNCA8PCA4KSB8IChSXzQgPDwgMTYpIHwgKDI1NSA8PCAyNCk7CisJfQorfQorCisKKy8qCisgKiB5dXZfdG9fcmdiX3czMigpCisgKgorICogcHJvY2Vzc2VzIHRvIGxpbmUgb2YgeXV2LWlucHV0LCB3aWR0aCBoYXMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzMgorICogdHdvIGxpbmVzIG9mIHl1diBhcmUgdGFrZW4gYXMgaW5wdXQKKyAqCisgKiBAcGFyYW0geV9hZGRyIGFkZHJlc3Mgb2YgdGhlIHkgcGxhbmUgaW4gbG9jYWwgc3RvcmUKKyAqIEBwYXJhbSB2X2FkZHIgYWRkcmVzcyBvZiB0aGUgdiBwbGFuZSBpbiBsb2NhbCBzdG9yZQorICogQHBhcmFtIHVfYWRkciBhZGRyZXNzIG9mIHRoZSB1IHBsYW5lIGluIGxvY2FsIHN0b3JlCisgKiBAcGFyYW0gYmdyYV9hZGRyXyBhZGRyZXNzIG9mIHRoZSBiZ3JhIG91dHB1dCBidWZmZXIKKyAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggaW4gcGl4ZWwKKyAqLwordm9pZCB5dXZfdG9fcmdiX3czMl9saW5lKHVuc2lnbmVkIGNoYXIqIHlfYWRkciwgdW5zaWduZWQgY2hhciogdl9hZGRyLCB1bnNpZ25lZCBjaGFyKiB1X2FkZHIsIHVuc2lnbmVkIGNoYXIqIGJncmFfYWRkcl8sIHVuc2lnbmVkIGludCB3aWR0aCkgeworCS8vIGVhY2ggcGl4ZWwgaXMgc3RvcmVkIGFzIGFuIGludGVnZXIKKwl1bnNpZ25lZCBpbnQqIGJncmFfYWRkciA9ICh1bnNpZ25lZCBpbnQqKSBiZ3JhX2FkZHJfOworCisJdW5zaWduZWQgaW50IHg7CisJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrPTMyKSB7CisJCS8vIEdlaGUgendlaXNjaHJpdHRpZyBkdXJjaCBkaWUgemVpbGUsIGRhIGplZGVyIHUgdW5kIHYgd2VydCBmdWVyIDQgcGl4ZWwoendlaSBob2NoLCB6d2VpIGJyZWl0KSBnaWx0CisKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmNoYXJfWV8xID0gKigodmVjdG9yIHVuc2lnbmVkIGNoYXIqKSh5X2FkZHIgKyB4KSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZjaGFyX1lfMiA9ICooKHZlY3RvciB1bnNpZ25lZCBjaGFyKikoeV9hZGRyICsgeCArIDE2KSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZjaGFyX1lfMyA9ICooKHZlY3RvciB1bnNpZ25lZCBjaGFyKikoeV9hZGRyICsgeCArIHdpZHRoKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZjaGFyX1lfNCA9ICooKHZlY3RvciB1bnNpZ25lZCBjaGFyKikoeV9hZGRyICsgeCArIHdpZHRoICsgMTYpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmNoYXJfVSA9ICooKHZlY3RvciB1bnNpZ25lZCBjaGFyKikodV9hZGRyICsgKHggPj4gMSkpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgdmNoYXJfViA9ICooKHZlY3RvciB1bnNpZ25lZCBjaGFyKikodl9hZGRyICsgKHggPj4gMSkpKTsKKworCQljb25zdCB2ZWN0b3IgZmxvYXQgdmZsb2F0X1VfMSA9IHNwdV9hZGQoc3B1X2NvbnZ0ZigodmVjdG9yIHVuc2lnbmVkIGludClzcHVfc2h1ZmZsZSh2ZWNfbnVsbCwgdmNoYXJfVSwgdmVjX2NoYXIyaW50X2ZpcnN0KSwgMCksdmVjX21pbnVzXzEyOCk7CisJCWNvbnN0IHZlY3RvciBmbG9hdCB2ZmxvYXRfVV8yID0gc3B1X2FkZChzcHVfY29udnRmKCh2ZWN0b3IgdW5zaWduZWQgaW50KXNwdV9zaHVmZmxlKHZlY19udWxsLCB2Y2hhcl9VLCB2ZWNfY2hhcjJpbnRfc2Vjb25kKSwgMCksdmVjX21pbnVzXzEyOCk7CisJCWNvbnN0IHZlY3RvciBmbG9hdCB2ZmxvYXRfVV8zID0gc3B1X2FkZChzcHVfY29udnRmKCh2ZWN0b3IgdW5zaWduZWQgaW50KXNwdV9zaHVmZmxlKHZlY19udWxsLCB2Y2hhcl9VLCB2ZWNfY2hhcjJpbnRfdGhpcmQpLCAwKSx2ZWNfbWludXNfMTI4KTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IHZmbG9hdF9VXzQgPSBzcHVfYWRkKHNwdV9jb252dGYoKHZlY3RvciB1bnNpZ25lZCBpbnQpc3B1X3NodWZmbGUodmVjX251bGwsIHZjaGFyX1UsIHZlY19jaGFyMmludF9mb3VydGgpLCAwKSx2ZWNfbWludXNfMTI4KTsKKworCQljb25zdCB2ZWN0b3IgZmxvYXQgdmZsb2F0X1ZfMSA9IHNwdV9hZGQoc3B1X2NvbnZ0ZigodmVjdG9yIHVuc2lnbmVkIGludClzcHVfc2h1ZmZsZSh2ZWNfbnVsbCwgdmNoYXJfViwgdmVjX2NoYXIyaW50X2ZpcnN0KSwgMCksdmVjX21pbnVzXzEyOCk7CisJCWNvbnN0IHZlY3RvciBmbG9hdCB2ZmxvYXRfVl8yID0gc3B1X2FkZChzcHVfY29udnRmKCh2ZWN0b3IgdW5zaWduZWQgaW50KXNwdV9zaHVmZmxlKHZlY19udWxsLCB2Y2hhcl9WLCB2ZWNfY2hhcjJpbnRfc2Vjb25kKSwgMCksdmVjX21pbnVzXzEyOCk7CisJCWNvbnN0IHZlY3RvciBmbG9hdCB2ZmxvYXRfVl8zID0gc3B1X2FkZChzcHVfY29udnRmKCh2ZWN0b3IgdW5zaWduZWQgaW50KXNwdV9zaHVmZmxlKHZlY19udWxsLCB2Y2hhcl9WLCB2ZWNfY2hhcjJpbnRfdGhpcmQpLCAwKSx2ZWNfbWludXNfMTI4KTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IHZmbG9hdF9WXzQgPSBzcHVfYWRkKHNwdV9jb252dGYoKHZlY3RvciB1bnNpZ25lZCBpbnQpc3B1X3NodWZmbGUodmVjX251bGwsIHZjaGFyX1YsIHZlY19jaGFyMmludF9mb3VydGgpLCAwKSx2ZWNfbWludXNfMTI4KTsKKworCQl2ZWN0b3IgZmxvYXQgWV8xID0gc3B1X2NvbnZ0ZigodmVjdG9yIHVuc2lnbmVkIGludClzcHVfc2h1ZmZsZSh2ZWNfbnVsbCwgdmNoYXJfWV8xLCB2ZWNfY2hhcjJpbnRfZmlyc3QpLCAwKTsKKwkJdmVjdG9yIGZsb2F0IFlfMiA9IHNwdV9jb252dGYoKHZlY3RvciB1bnNpZ25lZCBpbnQpc3B1X3NodWZmbGUodmVjX251bGwsIHZjaGFyX1lfMSwgdmVjX2NoYXIyaW50X3NlY29uZCksIDApOworCQl2ZWN0b3IgZmxvYXQgWV8zID0gc3B1X2NvbnZ0ZigodmVjdG9yIHVuc2lnbmVkIGludClzcHVfc2h1ZmZsZSh2ZWNfbnVsbCwgdmNoYXJfWV8xLCB2ZWNfY2hhcjJpbnRfdGhpcmQpLCAwKTsKKwkJdmVjdG9yIGZsb2F0IFlfNCA9IHNwdV9jb252dGYoKHZlY3RvciB1bnNpZ25lZCBpbnQpc3B1X3NodWZmbGUodmVjX251bGwsIHZjaGFyX1lfMSwgdmVjX2NoYXIyaW50X2ZvdXJ0aCksIDApOworCQl2ZWN0b3IgZmxvYXQgWV81ID0gc3B1X2NvbnZ0ZigodmVjdG9yIHVuc2lnbmVkIGludClzcHVfc2h1ZmZsZSh2ZWNfbnVsbCwgdmNoYXJfWV8yLCB2ZWNfY2hhcjJpbnRfZmlyc3QpLCAwKTsKKwkJdmVjdG9yIGZsb2F0IFlfNiA9IHNwdV9jb252dGYoKHZlY3RvciB1bnNpZ25lZCBpbnQpc3B1X3NodWZmbGUodmVjX251bGwsIHZjaGFyX1lfMiwgdmVjX2NoYXIyaW50X3NlY29uZCksIDApOworCQl2ZWN0b3IgZmxvYXQgWV83ID0gc3B1X2NvbnZ0ZigodmVjdG9yIHVuc2lnbmVkIGludClzcHVfc2h1ZmZsZSh2ZWNfbnVsbCwgdmNoYXJfWV8yLCB2ZWNfY2hhcjJpbnRfdGhpcmQpLCAwKTsKKwkJdmVjdG9yIGZsb2F0IFlfOCA9IHNwdV9jb252dGYoKHZlY3RvciB1bnNpZ25lZCBpbnQpc3B1X3NodWZmbGUodmVjX251bGwsIHZjaGFyX1lfMiwgdmVjX2NoYXIyaW50X2ZvdXJ0aCksIDApOworCQl2ZWN0b3IgZmxvYXQgWV85ID0gc3B1X2NvbnZ0ZigodmVjdG9yIHVuc2lnbmVkIGludClzcHVfc2h1ZmZsZSh2ZWNfbnVsbCwgdmNoYXJfWV8zLCB2ZWNfY2hhcjJpbnRfZmlyc3QpLCAwKTsKKwkJdmVjdG9yIGZsb2F0IFlfMTAgPSBzcHVfY29udnRmKCh2ZWN0b3IgdW5zaWduZWQgaW50KXNwdV9zaHVmZmxlKHZlY19udWxsLCB2Y2hhcl9ZXzMsIHZlY19jaGFyMmludF9zZWNvbmQpLCAwKTsKKwkJdmVjdG9yIGZsb2F0IFlfMTEgPSBzcHVfY29udnRmKCh2ZWN0b3IgdW5zaWduZWQgaW50KXNwdV9zaHVmZmxlKHZlY19udWxsLCB2Y2hhcl9ZXzMsIHZlY19jaGFyMmludF90aGlyZCksIDApOworCQl2ZWN0b3IgZmxvYXQgWV8xMiA9IHNwdV9jb252dGYoKHZlY3RvciB1bnNpZ25lZCBpbnQpc3B1X3NodWZmbGUodmVjX251bGwsIHZjaGFyX1lfMywgdmVjX2NoYXIyaW50X2ZvdXJ0aCksIDApOworCQl2ZWN0b3IgZmxvYXQgWV8xMyA9IHNwdV9jb252dGYoKHZlY3RvciB1bnNpZ25lZCBpbnQpc3B1X3NodWZmbGUodmVjX251bGwsIHZjaGFyX1lfNCwgdmVjX2NoYXIyaW50X2ZpcnN0KSwgMCk7CisJCXZlY3RvciBmbG9hdCBZXzE0ID0gc3B1X2NvbnZ0ZigodmVjdG9yIHVuc2lnbmVkIGludClzcHVfc2h1ZmZsZSh2ZWNfbnVsbCwgdmNoYXJfWV80LCB2ZWNfY2hhcjJpbnRfc2Vjb25kKSwgMCk7CisJCXZlY3RvciBmbG9hdCBZXzE1ID0gc3B1X2NvbnZ0ZigodmVjdG9yIHVuc2lnbmVkIGludClzcHVfc2h1ZmZsZSh2ZWNfbnVsbCwgdmNoYXJfWV80LCB2ZWNfY2hhcjJpbnRfdGhpcmQpLCAwKTsKKwkJdmVjdG9yIGZsb2F0IFlfMTYgPSBzcHVfY29udnRmKCh2ZWN0b3IgdW5zaWduZWQgaW50KXNwdV9zaHVmZmxlKHZlY19udWxsLCB2Y2hhcl9ZXzQsIHZlY19jaGFyMmludF9mb3VydGgpLCAwKTsKKworCQljb25zdCB2ZWN0b3IgZmxvYXQgUjFhX3ByZWNhbGN1bGF0ZSA9IHNwdV9tdWwodmVjX1JfcHJlY2FsY19jb2VmZiwgdmZsb2F0X1ZfMSk7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBSMmFfcHJlY2FsY3VsYXRlID0gc3B1X211bCh2ZWNfUl9wcmVjYWxjX2NvZWZmLCB2ZmxvYXRfVl8yKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IFIzYV9wcmVjYWxjdWxhdGUgPSBzcHVfbXVsKHZlY19SX3ByZWNhbGNfY29lZmYsIHZmbG9hdF9WXzMpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgUjRhX3ByZWNhbGN1bGF0ZSA9IHNwdV9tdWwodmVjX1JfcHJlY2FsY19jb2VmZiwgdmZsb2F0X1ZfNCk7CisKKwkJY29uc3QgdmVjdG9yIGZsb2F0IFIxX3ByZWNhbGN1bGF0ZSA9IHNwdV9zaHVmZmxlKFIxYV9wcmVjYWxjdWxhdGUsICBSMWFfcHJlY2FsY3VsYXRlLCB2ZWNfc2VsZWN0X2Zsb2F0c191cHBlcik7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBSMl9wcmVjYWxjdWxhdGUgPSBzcHVfc2h1ZmZsZShSMWFfcHJlY2FsY3VsYXRlLCAgUjFhX3ByZWNhbGN1bGF0ZSwgdmVjX3NlbGVjdF9mbG9hdHNfbG93ZXIpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgUjNfcHJlY2FsY3VsYXRlID0gc3B1X3NodWZmbGUoUjJhX3ByZWNhbGN1bGF0ZSwgIFIyYV9wcmVjYWxjdWxhdGUsIHZlY19zZWxlY3RfZmxvYXRzX3VwcGVyKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IFI0X3ByZWNhbGN1bGF0ZSA9IHNwdV9zaHVmZmxlKFIyYV9wcmVjYWxjdWxhdGUsICBSMmFfcHJlY2FsY3VsYXRlLCB2ZWNfc2VsZWN0X2Zsb2F0c19sb3dlcik7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBSNV9wcmVjYWxjdWxhdGUgPSBzcHVfc2h1ZmZsZShSM2FfcHJlY2FsY3VsYXRlLCAgUjNhX3ByZWNhbGN1bGF0ZSwgdmVjX3NlbGVjdF9mbG9hdHNfdXBwZXIpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgUjZfcHJlY2FsY3VsYXRlID0gc3B1X3NodWZmbGUoUjNhX3ByZWNhbGN1bGF0ZSwgIFIzYV9wcmVjYWxjdWxhdGUsIHZlY19zZWxlY3RfZmxvYXRzX2xvd2VyKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IFI3X3ByZWNhbGN1bGF0ZSA9IHNwdV9zaHVmZmxlKFI0YV9wcmVjYWxjdWxhdGUsICBSNGFfcHJlY2FsY3VsYXRlLCB2ZWNfc2VsZWN0X2Zsb2F0c191cHBlcik7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBSOF9wcmVjYWxjdWxhdGUgPSBzcHVfc2h1ZmZsZShSNGFfcHJlY2FsY3VsYXRlLCAgUjRhX3ByZWNhbGN1bGF0ZSwgdmVjX3NlbGVjdF9mbG9hdHNfbG93ZXIpOworCisKKwkJY29uc3QgdmVjdG9yIGZsb2F0IEcxYV9wcmVjYWxjdWxhdGUgPSBzcHVfbWFkZCh2ZWNfR3VfcHJlY2FsY19jb2VmZiwgdmZsb2F0X1VfMSwgc3B1X211bCh2ZmxvYXRfVl8xLCB2ZWNfR3ZfcHJlY2FsY19jb2VmZikpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgRzJhX3ByZWNhbGN1bGF0ZSA9IHNwdV9tYWRkKHZlY19HdV9wcmVjYWxjX2NvZWZmLCB2ZmxvYXRfVV8yLCBzcHVfbXVsKHZmbG9hdF9WXzIsIHZlY19Hdl9wcmVjYWxjX2NvZWZmKSk7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBHM2FfcHJlY2FsY3VsYXRlID0gc3B1X21hZGQodmVjX0d1X3ByZWNhbGNfY29lZmYsIHZmbG9hdF9VXzMsIHNwdV9tdWwodmZsb2F0X1ZfMywgdmVjX0d2X3ByZWNhbGNfY29lZmYpKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IEc0YV9wcmVjYWxjdWxhdGUgPSBzcHVfbWFkZCh2ZWNfR3VfcHJlY2FsY19jb2VmZiwgdmZsb2F0X1VfNCwgc3B1X211bCh2ZmxvYXRfVl80LCB2ZWNfR3ZfcHJlY2FsY19jb2VmZikpOworCisJCWNvbnN0IHZlY3RvciBmbG9hdCBHMV9wcmVjYWxjdWxhdGUgPSBzcHVfc2h1ZmZsZShHMWFfcHJlY2FsY3VsYXRlLCAgRzFhX3ByZWNhbGN1bGF0ZSwgdmVjX3NlbGVjdF9mbG9hdHNfdXBwZXIpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgRzJfcHJlY2FsY3VsYXRlID0gc3B1X3NodWZmbGUoRzFhX3ByZWNhbGN1bGF0ZSwgIEcxYV9wcmVjYWxjdWxhdGUsIHZlY19zZWxlY3RfZmxvYXRzX2xvd2VyKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IEczX3ByZWNhbGN1bGF0ZSA9IHNwdV9zaHVmZmxlKEcyYV9wcmVjYWxjdWxhdGUsICBHMmFfcHJlY2FsY3VsYXRlLCB2ZWNfc2VsZWN0X2Zsb2F0c191cHBlcik7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBHNF9wcmVjYWxjdWxhdGUgPSBzcHVfc2h1ZmZsZShHMmFfcHJlY2FsY3VsYXRlLCAgRzJhX3ByZWNhbGN1bGF0ZSwgdmVjX3NlbGVjdF9mbG9hdHNfbG93ZXIpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgRzVfcHJlY2FsY3VsYXRlID0gc3B1X3NodWZmbGUoRzNhX3ByZWNhbGN1bGF0ZSwgIEczYV9wcmVjYWxjdWxhdGUsIHZlY19zZWxlY3RfZmxvYXRzX3VwcGVyKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IEc2X3ByZWNhbGN1bGF0ZSA9IHNwdV9zaHVmZmxlKEczYV9wcmVjYWxjdWxhdGUsICBHM2FfcHJlY2FsY3VsYXRlLCB2ZWNfc2VsZWN0X2Zsb2F0c19sb3dlcik7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBHN19wcmVjYWxjdWxhdGUgPSBzcHVfc2h1ZmZsZShHNGFfcHJlY2FsY3VsYXRlLCAgRzRhX3ByZWNhbGN1bGF0ZSwgdmVjX3NlbGVjdF9mbG9hdHNfdXBwZXIpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgRzhfcHJlY2FsY3VsYXRlID0gc3B1X3NodWZmbGUoRzRhX3ByZWNhbGN1bGF0ZSwgIEc0YV9wcmVjYWxjdWxhdGUsIHZlY19zZWxlY3RfZmxvYXRzX2xvd2VyKTsKKworCisJCWNvbnN0IHZlY3RvciBmbG9hdCBCMWFfcHJlY2FsY3VsYXRlID0gc3B1X211bCh2ZWNfQl9wcmVjYWxjX2NvZWZmLCB2ZmxvYXRfVV8xKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IEIyYV9wcmVjYWxjdWxhdGUgPSBzcHVfbXVsKHZlY19CX3ByZWNhbGNfY29lZmYsIHZmbG9hdF9VXzIpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgQjNhX3ByZWNhbGN1bGF0ZSA9IHNwdV9tdWwodmVjX0JfcHJlY2FsY19jb2VmZiwgdmZsb2F0X1VfMyk7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBCNGFfcHJlY2FsY3VsYXRlID0gc3B1X211bCh2ZWNfQl9wcmVjYWxjX2NvZWZmLCB2ZmxvYXRfVV80KTsKKworCQljb25zdCB2ZWN0b3IgZmxvYXQgQjFfcHJlY2FsY3VsYXRlID0gc3B1X3NodWZmbGUoQjFhX3ByZWNhbGN1bGF0ZSwgIEIxYV9wcmVjYWxjdWxhdGUsIHZlY19zZWxlY3RfZmxvYXRzX3VwcGVyKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IEIyX3ByZWNhbGN1bGF0ZSA9IHNwdV9zaHVmZmxlKEIxYV9wcmVjYWxjdWxhdGUsICBCMWFfcHJlY2FsY3VsYXRlLCB2ZWNfc2VsZWN0X2Zsb2F0c19sb3dlcik7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBCM19wcmVjYWxjdWxhdGUgPSBzcHVfc2h1ZmZsZShCMmFfcHJlY2FsY3VsYXRlLCAgQjJhX3ByZWNhbGN1bGF0ZSwgdmVjX3NlbGVjdF9mbG9hdHNfdXBwZXIpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgQjRfcHJlY2FsY3VsYXRlID0gc3B1X3NodWZmbGUoQjJhX3ByZWNhbGN1bGF0ZSwgIEIyYV9wcmVjYWxjdWxhdGUsIHZlY19zZWxlY3RfZmxvYXRzX2xvd2VyKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IEI1X3ByZWNhbGN1bGF0ZSA9IHNwdV9zaHVmZmxlKEIzYV9wcmVjYWxjdWxhdGUsICBCM2FfcHJlY2FsY3VsYXRlLCB2ZWNfc2VsZWN0X2Zsb2F0c191cHBlcik7CisJCWNvbnN0IHZlY3RvciBmbG9hdCBCNl9wcmVjYWxjdWxhdGUgPSBzcHVfc2h1ZmZsZShCM2FfcHJlY2FsY3VsYXRlLCAgQjNhX3ByZWNhbGN1bGF0ZSwgdmVjX3NlbGVjdF9mbG9hdHNfbG93ZXIpOworCQljb25zdCB2ZWN0b3IgZmxvYXQgQjdfcHJlY2FsY3VsYXRlID0gc3B1X3NodWZmbGUoQjRhX3ByZWNhbGN1bGF0ZSwgIEI0YV9wcmVjYWxjdWxhdGUsIHZlY19zZWxlY3RfZmxvYXRzX3VwcGVyKTsKKwkJY29uc3QgdmVjdG9yIGZsb2F0IEI4X3ByZWNhbGN1bGF0ZSA9IHNwdV9zaHVmZmxlKEI0YV9wcmVjYWxjdWxhdGUsICBCNGFfcHJlY2FsY3VsYXRlLCB2ZWNfc2VsZWN0X2Zsb2F0c19sb3dlcik7CisKKworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICBSXzEgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZCggWV8xLCBSMV9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAgUl8yID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoIFlfMiwgUjJfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgIFJfMyA9IHZmbG9hdF90b192dWludChzcHVfYWRkKCBZXzMsIFIzX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICBSXzQgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZCggWV80LCBSNF9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAgUl81ID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoIFlfNSwgUjVfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgIFJfNiA9IHZmbG9hdF90b192dWludChzcHVfYWRkKCBZXzYsIFI2X3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICBSXzcgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZCggWV83LCBSN19wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAgUl84ID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoIFlfOCwgUjhfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgIFJfOSA9IHZmbG9hdF90b192dWludChzcHVfYWRkKCBZXzksIFIxX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IFJfMTAgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZChZXzEwLCBSMl9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCBSXzExID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoWV8xMSwgUjNfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgUl8xMiA9IHZmbG9hdF90b192dWludChzcHVfYWRkKFlfMTIsIFI0X3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IFJfMTMgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZChZXzEzLCBSNV9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCBSXzE0ID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoWV8xNCwgUjZfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgUl8xNSA9IHZmbG9hdF90b192dWludChzcHVfYWRkKFlfMTUsIFI3X3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IFJfMTYgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZChZXzE2LCBSOF9wcmVjYWxjdWxhdGUpKTsKKworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICBHXzEgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZCggWV8xLCBHMV9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAgR18yID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoIFlfMiwgRzJfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgIEdfMyA9IHZmbG9hdF90b192dWludChzcHVfYWRkKCBZXzMsIEczX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICBHXzQgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZCggWV80LCBHNF9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAgR181ID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoIFlfNSwgRzVfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgIEdfNiA9IHZmbG9hdF90b192dWludChzcHVfYWRkKCBZXzYsIEc2X3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICBHXzcgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZCggWV83LCBHN19wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAgR184ID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoIFlfOCwgRzhfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgIEdfOSA9IHZmbG9hdF90b192dWludChzcHVfYWRkKCBZXzksIEcxX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IEdfMTAgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZChZXzEwLCBHMl9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCBHXzExID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoWV8xMSwgRzNfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgR18xMiA9IHZmbG9hdF90b192dWludChzcHVfYWRkKFlfMTIsIEc0X3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IEdfMTMgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZChZXzEzLCBHNV9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCBHXzE0ID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoWV8xNCwgRzZfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgR18xNSA9IHZmbG9hdF90b192dWludChzcHVfYWRkKFlfMTUsIEc3X3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IEdfMTYgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZChZXzE2LCBHOF9wcmVjYWxjdWxhdGUpKTsKKworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICBCXzEgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZCggWV8xLCBCMV9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAgQl8yID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoIFlfMiwgQjJfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgIEJfMyA9IHZmbG9hdF90b192dWludChzcHVfYWRkKCBZXzMsIEIzX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICBCXzQgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZCggWV80LCBCNF9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAgQl81ID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoIFlfNSwgQjVfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgIEJfNiA9IHZmbG9hdF90b192dWludChzcHVfYWRkKCBZXzYsIEI2X3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50ICBCXzcgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZCggWV83LCBCN19wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCAgQl84ID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoIFlfOCwgQjhfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgIEJfOSA9IHZmbG9hdF90b192dWludChzcHVfYWRkKCBZXzksIEIxX3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IEJfMTAgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZChZXzEwLCBCMl9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCBCXzExID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoWV8xMSwgQjNfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgQl8xMiA9IHZmbG9hdF90b192dWludChzcHVfYWRkKFlfMTIsIEI0X3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IEJfMTMgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZChZXzEzLCBCNV9wcmVjYWxjdWxhdGUpKTsKKwkJY29uc3QgdmVjdG9yIHVuc2lnbmVkIGludCBCXzE0ID0gdmZsb2F0X3RvX3Z1aW50KHNwdV9hZGQoWV8xNCwgQjZfcHJlY2FsY3VsYXRlKSk7CisJCWNvbnN0IHZlY3RvciB1bnNpZ25lZCBpbnQgQl8xNSA9IHZmbG9hdF90b192dWludChzcHVfYWRkKFlfMTUsIEI3X3ByZWNhbGN1bGF0ZSkpOworCQljb25zdCB2ZWN0b3IgdW5zaWduZWQgaW50IEJfMTYgPSB2ZmxvYXRfdG9fdnVpbnQoc3B1X2FkZChZXzE2LCBCOF9wcmVjYWxjdWxhdGUpKTsKKworCQkqKCh2ZWN0b3IgdW5zaWduZWQgaW50KikoYmdyYV9hZGRyICsgeCkpID0gc3B1X29yKHNwdV9vcih2ZWNfYWxwaGEsICBCXzEpLCBzcHVfb3Ioc3B1X3NscXdieXRlKCBSXzEsIDIpLHNwdV9zbHF3Ynl0ZShHXzEsIDEpKSk7CisJCSooKHZlY3RvciB1bnNpZ25lZCBpbnQqKShiZ3JhX2FkZHIgKyB4ICsgNCkpID0gc3B1X29yKHNwdV9vcih2ZWNfYWxwaGEsICBCXzIpLCBzcHVfb3Ioc3B1X3NscXdieXRlKCBSXzIsIDIpLHNwdV9zbHF3Ynl0ZShHXzIsIDEpKSk7CisJCSooKHZlY3RvciB1bnNpZ25lZCBpbnQqKShiZ3JhX2FkZHIgKyB4ICsgOCkpID0gc3B1X29yKHNwdV9vcih2ZWNfYWxwaGEsICBCXzMpLCBzcHVfb3Ioc3B1X3NscXdieXRlKCBSXzMsIDIpLHNwdV9zbHF3Ynl0ZShHXzMsIDEpKSk7CisJCSooKHZlY3RvciB1bnNpZ25lZCBpbnQqKShiZ3JhX2FkZHIgKyB4ICsgMTIpKSA9IHNwdV9vcihzcHVfb3IodmVjX2FscGhhLCAgQl80KSwgc3B1X29yKHNwdV9zbHF3Ynl0ZSggUl80LCAyKSxzcHVfc2xxd2J5dGUoR180LCAxKSkpOworCQkqKCh2ZWN0b3IgdW5zaWduZWQgaW50KikoYmdyYV9hZGRyICsgeCArIDE2KSkgPSBzcHVfb3Ioc3B1X29yKHZlY19hbHBoYSwgIEJfNSksIHNwdV9vcihzcHVfc2xxd2J5dGUoIFJfNSwgMiksc3B1X3NscXdieXRlKEdfNSwgMSkpKTsKKwkJKigodmVjdG9yIHVuc2lnbmVkIGludCopKGJncmFfYWRkciArIHggKyAyMCkpID0gc3B1X29yKHNwdV9vcih2ZWNfYWxwaGEsICBCXzYpLCBzcHVfb3Ioc3B1X3NscXdieXRlKCBSXzYsIDIpLHNwdV9zbHF3Ynl0ZShHXzYsIDEpKSk7CisJCSooKHZlY3RvciB1bnNpZ25lZCBpbnQqKShiZ3JhX2FkZHIgKyB4ICsgMjQpKSA9IHNwdV9vcihzcHVfb3IodmVjX2FscGhhLCAgQl83KSwgc3B1X29yKHNwdV9zbHF3Ynl0ZSggUl83LCAyKSxzcHVfc2xxd2J5dGUoR183LCAxKSkpOworCQkqKCh2ZWN0b3IgdW5zaWduZWQgaW50KikoYmdyYV9hZGRyICsgeCArIDI4KSkgPSBzcHVfb3Ioc3B1X29yKHZlY19hbHBoYSwgIEJfOCksIHNwdV9vcihzcHVfc2xxd2J5dGUoIFJfOCwgMiksc3B1X3NscXdieXRlKEdfOCwgMSkpKTsKKwkJKigodmVjdG9yIHVuc2lnbmVkIGludCopKGJncmFfYWRkciArIHggKyB3aWR0aCkpID0gc3B1X29yKHNwdV9vcih2ZWNfYWxwaGEsICBCXzkpLCBzcHVfb3Ioc3B1X3NscXdieXRlKCBSXzksIDIpLHNwdV9zbHF3Ynl0ZShHXzksIDEpKSk7CisJCSooKHZlY3RvciB1bnNpZ25lZCBpbnQqKShiZ3JhX2FkZHIgKyB4ICsgd2lkdGggKyA0KSkgPSBzcHVfb3Ioc3B1X29yKHZlY19hbHBoYSwgQl8xMCksIHNwdV9vcihzcHVfc2xxd2J5dGUoUl8xMCwgMiksc3B1X3NscXdieXRlKEdfMTAsIDEpKSk7CisJCSooKHZlY3RvciB1bnNpZ25lZCBpbnQqKShiZ3JhX2FkZHIgKyB4ICsgd2lkdGggKyA4KSkgPSBzcHVfb3Ioc3B1X29yKHZlY19hbHBoYSwgQl8xMSksIHNwdV9vcihzcHVfc2xxd2J5dGUoUl8xMSwgMiksc3B1X3NscXdieXRlKEdfMTEsIDEpKSk7CisJCSooKHZlY3RvciB1bnNpZ25lZCBpbnQqKShiZ3JhX2FkZHIgKyB4ICsgd2lkdGggKyAxMikpID0gc3B1X29yKHNwdV9vcih2ZWNfYWxwaGEsIEJfMTIpLCBzcHVfb3Ioc3B1X3NscXdieXRlKFJfMTIsIDIpLHNwdV9zbHF3Ynl0ZShHXzEyLCAxKSkpOworCQkqKCh2ZWN0b3IgdW5zaWduZWQgaW50KikoYmdyYV9hZGRyICsgeCArIHdpZHRoICsgMTYpKSA9IHNwdV9vcihzcHVfb3IodmVjX2FscGhhLCBCXzEzKSwgc3B1X29yKHNwdV9zbHF3Ynl0ZShSXzEzLCAyKSxzcHVfc2xxd2J5dGUoR18xMywgMSkpKTsKKwkJKigodmVjdG9yIHVuc2lnbmVkIGludCopKGJncmFfYWRkciArIHggKyB3aWR0aCArIDIwKSkgPSBzcHVfb3Ioc3B1X29yKHZlY19hbHBoYSwgQl8xNCksIHNwdV9vcihzcHVfc2xxd2J5dGUoUl8xNCwgMiksc3B1X3NscXdieXRlKEdfMTQsIDEpKSk7CisJCSooKHZlY3RvciB1bnNpZ25lZCBpbnQqKShiZ3JhX2FkZHIgKyB4ICsgd2lkdGggKyAyNCkpID0gc3B1X29yKHNwdV9vcih2ZWNfYWxwaGEsIEJfMTUpLCBzcHVfb3Ioc3B1X3NscXdieXRlKFJfMTUsIDIpLHNwdV9zbHF3Ynl0ZShHXzE1LCAxKSkpOworCQkqKCh2ZWN0b3IgdW5zaWduZWQgaW50KikoYmdyYV9hZGRyICsgeCArIHdpZHRoICsgMjgpKSA9IHNwdV9vcihzcHVfb3IodmVjX2FscGhhLCBCXzE2KSwgc3B1X29yKHNwdV9zbHF3Ynl0ZShSXzE2LCAyKSxzcHVfc2xxd2J5dGUoR18xNiwgMSkpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXRvcGlhL1NETF9RUEVBcHAuY2MgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfUVBFQXBwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYWYxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfUVBFQXBwLmNjCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8cXBlL3FwZWFwcGxpY2F0aW9uLmg+CisjaW5jbHVkZSA8cWFwcGxpY2F0aW9uLmg+CisjaW5jbHVkZSA8cWV2ZW50Lmg+CisKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisKKy8qIEZsYWcgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB0aGUgQmUgYXBwbGljYXRpb24gaXMgYWN0aXZlIG9yIG5vdCAqLworaW50IFNETF9RUEVBcHBBY3RpdmUgPSAwOworc3RhdGljIFFQRUFwcGxpY2F0aW9uICphcHA7CisKK2ludCBTRExfSW5pdFFQRUFwcCgpIHsKKyAgaWYoU0RMX1FQRUFwcEFjdGl2ZSA8PSAwKSB7CisgICAgaWYoIXFBcHApIHsKKyAgICAgIGludCBhcmdjID0gMTsKKyAgICAgIGNoYXIgKmFyZ3ZbXSA9IHsgeyAiU0RMQXBwIiB9IH07CisgICAgICBhcHAgPSBuZXcgUVBFQXBwbGljYXRpb24oYXJnYywgYXJndik7CisgICAgICBRV2lkZ2V0IGR1bW15OworICAgICAgYXBwLT5zaG93TWFpbldpZGdldCgmZHVtbXkpOworICAgIH0gZWxzZSB7CisgICAgICBhcHAgPSAoUVBFQXBwbGljYXRpb24qKXFBcHA7CisgICAgfQorICAgIFNETF9RUEVBcHBBY3RpdmUrKzsKKyAgfQorICByZXR1cm4gMDsgIAorfQorCisvKiBRdWl0IHRoZSBRUEUgQXBwbGljYXRpb24sIGlmIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvICovCit2b2lkIFNETF9RdWl0UVBFQXBwKHZvaWQpCit7CisgIC8qIERlY3JlbWVudCB0aGUgYXBwbGljYXRpb24gcmVmZXJlbmNlIGNvdW50ICovCisgIFNETF9RUEVBcHBBY3RpdmUtLTsKKyAgLyogSWYgdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVkIHplcm8sIGNsZWFuIHVwIHRoZSBhcHAgKi8KKyAgaWYgKCBTRExfUVBFQXBwQWN0aXZlID09IDAgJiYgYXBwKSB7CisgICAgZGVsZXRlIGFwcDsKKyAgICBhcHAgPSAwOworICAgIHFBcHAgPSAwOworICB9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfUVBFQXBwLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfUVBFQXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5YWI3NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXRvcGlhL1NETF9RUEVBcHAuaApAQCAtMCwwICsxLDMzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogSGFuZGxlIHRoZSBRUEUgYXBwbGljYXRpb24gbG9vcCAqLworCisvKiBJbml0aWFsaXplIHRoZSBRUEUgQXBwbGljYXRpb24sIGlmIGl0J3Mgbm90IGFscmVhZHkgc3RhcnRlZCAqLworZXh0ZXJuIGludCBTRExfSW5pdFFQRUFwcCh2b2lkKTsKKworLyogUXVpdCB0aGUgUVBFIEFwcGxpY2F0aW9uLCBpZiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyAqLworZXh0ZXJuIHZvaWQgU0RMX1F1aXRRUEVBcHAodm9pZCk7CisKKy8qIEZsYWcgdG8gdGVsbCB3aGV0aGVyIHRoZSBhcHAgaXMgYWN0aXZlIG9yIG5vdCAqLworZXh0ZXJuIGludCBTRExfUVBFQXBwQWN0aXZlOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX1FXaW4uY2MgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfUVdpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQ3NGVkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX1FXaW4uY2MKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX1FXaW4uaCIKKyNpbmNsdWRlIDxxYXBwbGljYXRpb24uaD4KKyNpbmNsdWRlIDxxZGlyZWN0cGFpbnRlcl9xd3MuaD4KKworc2NyZWVuUm90YXRpb25UIHNjcmVlblJvdGF0aW9uID0gU0RMX1FUX05PX1JPVEFUSU9OOworCitTRExfUVdpbjo6U0RMX1FXaW4oY29uc3QgUVNpemUmIHNpemUpCisgIDogUVdpZGdldCgwLCAiU0RMX21haW4iKSwgbXlfcGFpbnRlcigwKSwgbXlfaW1hZ2UoMCksCisgICAgbXlfaW5oaWJpdF9yZXNpemUoZmFsc2UpLCBteV9tb3VzZV9wb3MoLTEsLTEpLCBteV9mbGFncygwKSwKKyAgICBteV9oYXNfZnVsbHNjcmVlbihmYWxzZSksIG15X2xvY2tlZCgwKQoreworICBzZXRCYWNrZ3JvdW5kTW9kZShOb0JhY2tncm91bmQpOworfQorCitTRExfUVdpbjo6flNETF9RV2luKCkgeworICAvLyBOb3RoaW5nIHRvIGRvIHlldC4KKyAgaWYobXlfaW1hZ2UpIHsKKyAgICBkZWxldGUgbXlfaW1hZ2U7CisgIH0KK30KKwordm9pZCBTRExfUVdpbjo6c2V0SW1hZ2UoUUltYWdlICppbWFnZSkgeworICBpZiAoIG15X2ltYWdlICkgeworICAgIGRlbGV0ZSBteV9pbWFnZTsKKyAgfQorICBteV9pbWFnZSA9IGltYWdlOworICAvLyAgc2V0Rml4ZWRTaXplKGltYWdlLT5zaXplKCkpOworfQorCit2b2lkIFNETF9RV2luOjpyZXNpemVFdmVudChRUmVzaXplRXZlbnQgKmUpIHsKKyAgaWYoc2l6ZSgpICE9IHFBcHAtPmRlc2t0b3AoKS0+c2l6ZSgpKSB7CisgICAgLy8gV2lkZ2V0IGlzIG5vdCB0aGUgY29ycmVjdCBzaXplLCBzbyBkbyB0aGUgZnVsbHNjcmVlbiBtYWdpYworICAgIG15X2hhc19mdWxsc2NyZWVuID0gZmFsc2U7CisgICAgZW5hYmxlRnVsbHNjcmVlbigpOworICB9CisgIGlmKG15X2luaGliaXRfcmVzaXplKSB7CisgICAgbXlfaW5oaWJpdF9yZXNpemUgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBTRExfUHJpdmF0ZVJlc2l6ZShlLT5zaXplKCkud2lkdGgoKSwgZS0+c2l6ZSgpLmhlaWdodCgpKTsKKyAgfQorfQorCit2b2lkIFNETF9RV2luOjpmb2N1c0luRXZlbnQoUUZvY3VzRXZlbnQgKikgeworICAvLyBBbHdheXMgZG8gaXQgaGVyZSwgbm8gbWF0dGVyIHRoZSBzaXplLgorICBlbmFibGVGdWxsc2NyZWVuKCk7CisgIFNETF9Qcml2YXRlQXBwQWN0aXZlKHRydWUsIFNETF9BUFBJTlBVVEZPQ1VTKTsKK30KKwordm9pZCBTRExfUVdpbjo6Zm9jdXNPdXRFdmVudChRRm9jdXNFdmVudCAqKSB7CisgIG15X2hhc19mdWxsc2NyZWVuID0gZmFsc2U7CisgIFNETF9Qcml2YXRlQXBwQWN0aXZlKGZhbHNlLCBTRExfQVBQSU5QVVRGT0NVUyk7Cit9CisKK3ZvaWQgU0RMX1FXaW46OmNsb3NlRXZlbnQoUUNsb3NlRXZlbnQgKmUpIHsKKyAgU0RMX1ByaXZhdGVRdWl0KCk7CisgIGUtPmlnbm9yZSgpOworfQorCit2b2lkIFNETF9RV2luOjpzZXRNb3VzZVBvcyhjb25zdCBRUG9pbnQgJnBvcykgeworICBpZihteV9pbWFnZS0+d2lkdGgoKSA9PSBoZWlnaHQoKSkgeworICAgIGlmIChzY3JlZW5Sb3RhdGlvbiA9PSBTRExfUVRfUk9UQVRJT05fOTApCisgICAgICBteV9tb3VzZV9wb3MgPSBRUG9pbnQoaGVpZ2h0KCktcG9zLnkoKSwgcG9zLngoKSk7CisgICAgZWxzZSBpZiAoc2NyZWVuUm90YXRpb24gPT0gU0RMX1FUX1JPVEFUSU9OXzI3MCkKKyAgICAgIG15X21vdXNlX3BvcyA9IFFQb2ludChwb3MueSgpLCB3aWR0aCgpLXBvcy54KCkpOworICB9IGVsc2UgeworICAgIG15X21vdXNlX3BvcyA9IHBvczsKKyAgfQorfQorCit2b2lkIFNETF9RV2luOjptb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCAqZSkgeworICBRdDo6QnV0dG9uU3RhdGUgYnV0dG9uID0gZS0+YnV0dG9uKCk7CisgIGludCBzZGxzdGF0ZSA9IDA7CisgIGlmKCAoYnV0dG9uICYgUXQ6OkxlZnRCdXR0b24pKSB7CisgICAgc2Rsc3RhdGUgfD0gU0RMX0JVVFRPTl9MTUFTSzsKKyAgfQorICBpZiggKGJ1dHRvbiAmIFF0OjpSaWdodEJ1dHRvbikpIHsKKyAgICBzZGxzdGF0ZSB8PSBTRExfQlVUVE9OX1JNQVNLOworICB9CisgIGlmKCAoYnV0dG9uICYgUXQ6Ok1pZEJ1dHRvbikpIHsKKyAgICBzZGxzdGF0ZSB8PSBTRExfQlVUVE9OX01NQVNLOworICB9CisgIHNldE1vdXNlUG9zKGUtPnBvcygpKTsKKyAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbihzZGxzdGF0ZSwgMCwgbXlfbW91c2VfcG9zLngoKSwgbXlfbW91c2VfcG9zLnkoKSk7Cit9CisKK3ZvaWQgU0RMX1FXaW46Om1vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCAqZSkgeworICBtb3VzZU1vdmVFdmVudChlKTsKKyAgUXQ6OkJ1dHRvblN0YXRlIGJ1dHRvbiA9IGUtPmJ1dHRvbigpOworICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELAorCQkJIChidXR0b24gJiBRdDo6TGVmdEJ1dHRvbikgPyAxIDoKKwkJCSAoKGJ1dHRvbiAmIFF0OjpSaWdodEJ1dHRvbikgPyAyIDogMyksCisJCQkgbXlfbW91c2VfcG9zLngoKSwgbXlfbW91c2VfcG9zLnkoKSk7Cit9CisKK3ZvaWQgU0RMX1FXaW46Om1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50ICplKSB7CisgIHNldE1vdXNlUG9zKGUtPnBvcygpKTsKKyAgUXQ6OkJ1dHRvblN0YXRlIGJ1dHRvbiA9IGUtPmJ1dHRvbigpOworICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwKKwkJCSAoYnV0dG9uICYgUXQ6OkxlZnRCdXR0b24pID8gMSA6CisJCQkgKChidXR0b24gJiBRdDo6UmlnaHRCdXR0b24pID8gMiA6IDMpLAorCQkJIG15X21vdXNlX3Bvcy54KCksIG15X21vdXNlX3Bvcy55KCkpOworICBteV9tb3VzZV9wb3MgPSBRUG9pbnQoLTEsIC0xKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitnc19mYXN0Um90YXRlQmxpdF8zICggdW5zaWduZWQgc2hvcnQgKmZiLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCAqYml0cywKKwkJICAgICAgY29uc3QgUVJlY3QmIHJlY3QgKQoreworICAvLyBGSVhNRTogdGhpcyBvbmx5IHdvcmtzIGNvcnJlY3RseSBmb3IgMjQweDMyMCBkaXNwbGF5cworICBpbnQgc3RhcnR4LCBzdGFydHk7CisgIGludCB3aWR0aCwgaGVpZ2h0OworICAKKyAgc3RhcnR4ID0gcmVjdC5sZWZ0KCkgPj4gMTsKKyAgc3RhcnR5ID0gcmVjdC50b3AoKSA+PiAxOworICB3aWR0aCAgPSAoKHJlY3QucmlnaHQoKSAtIHJlY3QubGVmdCgpKSA+PiAxKSArIDI7CisgIGhlaWdodCA9ICgocmVjdC5ib3R0b20oKSAtIHJlY3QudG9wKCkpID4+IDEpICsgMjsKKworICBpZigoc3RhcnR4K3dpZHRoKSA+IDEyMCkgeworICAgIHdpZHRoID0gMTIwIC0gc3RhcnR4OyAvLyBhdm9pZCBob3Jpem9udGFsIG92ZXJmbG93CisgIH0KKyAgaWYoKHN0YXJ0eStoZWlnaHQpID4gMTYwKSB7IAorICAgIGhlaWdodCA9IDE2MCAtIHN0YXJ0eTsgLy8gYXZvaWQgdmVydGljYWwgb3ZlcmZsb3cKKyAgfQorCisgIHVsb25nICpzcDEsICpzcDIsICpkcDEsICpkcDI7CisgIHVsb25nIHN0b3AsIHNib3QsIGR0b3AsIGRib3Q7ICAgIAorICAKKyAgc3AxID0gKHVsb25nKiliaXRzICsgc3RhcnR4ICsgc3RhcnR5KjI0MDsKKyAgc3AyID0gc3AxICsgMTIwOworICBkcDEgPSAodWxvbmcgKilmYiArICgxNTkgLSBzdGFydHkpICsgc3RhcnR4KjMyMDsKKyAgZHAyID0gZHAxICsgMTYwOworICBpbnQgcm93YWRkID0gKC0zMjAqd2lkdGgpIC0gMTsKKyAgaW50IHJvd2FkZDIgPSAyNDAgLSB3aWR0aDsKKyAgLy8gdHJhbnNmZXIgaW4gY2VsbHMgb2YgMngyIHBpeGVscyBpbiB3b3JkcworICBmb3IgKGludCB5PTA7IHk8aGVpZ2h0OyB5KyspIHsKKyAgICBmb3IgKGludCB4PTA7IHg8d2lkdGg7IHgrKykgeworICAgICAgLy8gcmVhZCBzb3VyY2UgcGl4ZWxzCisgICAgICBzdG9wID0gKnNwMTsKKyAgICAgIHNib3QgPSAqc3AyOworICAgICAgLy8gcm90YXRlIHBpeGVscworICAgICAgZHRvcCA9IChzYm90ICYgMHhmZmZmKSArICgoc3RvcCAmIDB4ZmZmZik8PDE2KTsKKyAgICAgIGRib3QgPSAoKHNib3QgJiAweGZmZmYwMDAwKT4+MTYpICsgKHN0b3AgJiAweGZmZmYwMDAwKTsKKyAgICAgIC8vIHdyaXRlIHRvIGZyYW1lYnVmZmVyCisgICAgICAqZHAxID0gZHRvcDsKKyAgICAgICpkcDIgPSBkYm90OworICAgICAgLy8gdXBkYXRlIHNvdXJjZSBwdHJzCisgICAgICBzcDErKzsgc3AyKys7CisgICAgICAvLyB1cGRhdGUgZGVzdCBwdHJzIC0gMiBwaXggYXQgYSB0aW1lCisgICAgICBkcDEgKz0gMzIwOworICAgICAgZHAyICs9IDMyMDsKKyAgICB9CisgICAgLy8gYWRqdXN0IHNyYyBwdHJzIC0gc2tpcCBhIHJvdyBhcyB3ZSB3b3JrIGluIHBhaXJzCisgICAgc3AxICs9IHJvd2FkZDI7CisgICAgc3AyICs9IHJvd2FkZDI7CisgICAgLy8gYWRqdXN0IGRlc3QgcHRycyBmb3Igcm90YXRpb24KKyAgICBkcDEgKz0gcm93YWRkOworICAgIGRwMiArPSByb3dhZGQ7CisgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitnc19mYXN0Um90YXRlQmxpdF8xICggdW5zaWduZWQgc2hvcnQgKmZiLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCAqYml0cywKKwkJICAgICAgY29uc3QgUVJlY3QmIHJlY3QgKSB7CisgIC8vIEZJWE1FOiB0aGlzIG9ubHkgd29ya3MgY29ycmVjdGx5IGZvciAyNDB4MzIwIGRpc3BsYXlzCisgIGludCBzdGFydHgsIHN0YXJ0eTsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgc3RhcnR4ID0gcmVjdC5sZWZ0KCkgPj4gMTsKKyAgc3RhcnR5ID0gcmVjdC50b3AoKSA+PiAxOworICB3aWR0aCAgPSAoKHJlY3QucmlnaHQoKSAtIHJlY3QubGVmdCgpKSA+PiAxKSArIDI7CisgIGhlaWdodCA9ICgocmVjdC5ib3R0b20oKSAtIHJlY3QudG9wKCkpID4+IDEpICsgMjsKKworICBpZigoc3RhcnR4K3dpZHRoKSA+IDEyMCkgeworICAgIHdpZHRoID0gMTIwIC0gc3RhcnR4OyAvLyBhdm9pZCBob3Jpem9udGFsIG92ZXJmbG93CisgIH0KKyAgaWYoKHN0YXJ0eStoZWlnaHQpID4gMTYwKSB7IAorICAgIGhlaWdodCA9IDE2MCAtIHN0YXJ0eTsgLy8gYXZvaWQgdmVydGljYWwgb3ZlcmZsb3cKKyAgfQorCisgIHVsb25nICpzcDEsICpzcDIsICpkcDEsICpkcDI7CisgIHVsb25nIHN0b3AsIHNib3QsIGR0b3AsIGRib3Q7ICAgIAorICBmYiArPSAzMjAqMjM5OyAvLyBNb3ZlICJmYiIgdG8gdG9wIGxlZnQgY29ybmVyCisgIHNwMSA9ICh1bG9uZyopYml0cyArIHN0YXJ0eCArIHN0YXJ0eSoyNDA7CisgIHNwMiA9IHNwMSArIDEyMDsKKyAgZHAxID0gKHVsb25nKilmYiAtIHN0YXJ0eCAqIDMyMCAtIHN0YXJ0eTsKKyAgZHAyID0gZHAxIC0gMTYwOworICBpbnQgcm93YWRkID0gKDMyMCp3aWR0aCkgKyAxOworICBpbnQgcm93YWRkMiA9IDI0MCAtIHdpZHRoOworICAvLyB0cmFuc2ZlciBpbiBjZWxscyBvZiAyeDIgcGl4ZWxzIGluIHdvcmRzCisgIGZvciAoaW50IHk9MDsgeTxoZWlnaHQ7IHkrKykgeworICAgIGZvciAoaW50IHg9MDsgeDx3aWR0aDsgeCsrKSB7CisgICAgICAvLyByZWFkCisgICAgICBzdG9wID0gKnNwMTsKKyAgICAgIHNib3QgPSAqc3AyOworICAgICAgLy8gcm90YXRlCisgICAgICBkdG9wID0gKHN0b3AgJiAweGZmZmYpICsgKChzYm90ICYgMHhmZmZmKTw8MTYpOworICAgICAgZGJvdCA9ICgoc3RvcCAmIDB4ZmZmZjAwMDApPj4xNikgKyAoc2JvdCAmIDB4ZmZmZjAwMDApOworICAgICAgLy8gd3JpdGUKKyAgICAgICpkcDEgPSBkdG9wOworICAgICAgKmRwMiA9IGRib3Q7CisgICAgICAvLyB1cGRhdGUgc291cmNlIHB0cnMKKyAgICAgIHNwMSsrOyBzcDIrKzsKKyAgICAgIC8vIHVwZGF0ZSBkZXN0IHB0cnMgLSAyIHBpeCBhdCBhIHRpbWUKKyAgICAgIGRwMSAtPSAzMjA7CisgICAgICBkcDIgLT0gMzIwOworICAgIH0KKyAgICAvLyBhZGp1c3Qgc3JjIHB0cnMgLSBza2lwIGEgcm93IGFzIHdlIHdvcmsgaW4gcGFpcnMKKyAgICBzcDEgKz0gcm93YWRkMjsKKyAgICBzcDIgKz0gcm93YWRkMjsKKyAgICAvLyBhZGp1c3QgZGVzdCBwdHJzIGZvciByb3RhdGlvbgorICAgIGRwMSArPSByb3dhZGQ7CisgICAgZHAyICs9IHJvd2FkZDsKKyAgfQorfQorCisvLyBkZXNrdG9wLCBTTC1BMzAwIGV0YworYm9vbCBTRExfUVdpbjo6cmVwYWludFJvdGF0aW9uMChjb25zdCBRUmVjdCYgcmVjdCkgeworICBpZihteV9pbWFnZS0+d2lkdGgoKSA9PSB3aWR0aCgpKSB7CisgICAgdWNoYXIgKmZiID0gKHVjaGFyKilteV9wYWludGVyLT5mcmFtZUJ1ZmZlcigpOworICAgIHVjaGFyICpidWYgPSAodWNoYXIqKW15X2ltYWdlLT5iaXRzKCk7CisgICAgaWYocmVjdCA9PSBteV9pbWFnZS0+cmVjdCgpKSB7CisgICAgICBTRExfbWVtY3B5KGZiLCBidWYsIHdpZHRoKCkqaGVpZ2h0KCkqMik7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBoID0gcmVjdC5oZWlnaHQoKTsKKyAgICAgIGludCB3ZCA9IHJlY3Qud2lkdGgoKTw8MTsKKyAgICAgIGludCBmYmxpbmVhZGQgPSBteV9wYWludGVyLT5saW5lU3RlcCgpOworICAgICAgaW50IGJ1ZmxpbmVhZGQgPSBteV9pbWFnZS0+Ynl0ZXNQZXJMaW5lKCk7CisgICAgICBmYiAgKz0gKHJlY3QubGVmdCgpPDwxKSArIHJlY3QudG9wKCkgKiBteV9wYWludGVyLT5saW5lU3RlcCgpOworICAgICAgYnVmICs9IChyZWN0LmxlZnQoKTw8MSkgKyByZWN0LnRvcCgpICogbXlfaW1hZ2UtPmJ5dGVzUGVyTGluZSgpOworICAgICAgd2hpbGUoaC0tKSB7CisJU0RMX21lbWNweShmYiwgYnVmLCB3ZCk7CisJZmIgKz0gZmJsaW5lYWRkOworCWJ1ZiArPSBidWZsaW5lYWRkOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7IC8vIEZJWE1FOiBMYW5kc2NhcGUKKyAgfQorI2lmZGVmIF9faTM4Nl9fCisgIG15X3BhaW50ZXItPmZpbGxSZWN0KCByZWN0LCBRQnJ1c2goIFF0OjpOb0JydXNoICkgKTsKKyNlbmRpZgorICByZXR1cm4gdHJ1ZTsKK30KKworICAKKy8vIFNoYXJwIFphdXJ1cyBTTC01NTAwIGV0YyAKK2Jvb2wgU0RMX1FXaW46OnJlcGFpbnRSb3RhdGlvbjMoY29uc3QgUVJlY3QmIHJlY3QpIHsKKyAgaWYobXlfaW1hZ2UtPndpZHRoKCkgPT0gd2lkdGgoKSkgeworICAgIHVzaG9ydCAqZmIgPSAodXNob3J0KilteV9wYWludGVyLT5mcmFtZUJ1ZmZlcigpOworICAgIHVzaG9ydCAqYnVmID0gKHVzaG9ydCopbXlfaW1hZ2UtPmJpdHMoKTsKKyAgICBnc19mYXN0Um90YXRlQmxpdF8zKGZiLCBidWYsIHJlY3QpOworICB9IGVsc2UgeworICAgIC8vIGxhbmRzY2FwZSBtb2RlCisgICAgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl85MCkgeworICAgICAgdWNoYXIgKmZiID0gKHVjaGFyKilteV9wYWludGVyLT5mcmFtZUJ1ZmZlcigpOworICAgICAgdWNoYXIgKmJ1ZiA9ICh1Y2hhciopbXlfaW1hZ2UtPmJpdHMoKTsKKyAgICAgIGlmKHJlY3QgPT0gbXlfaW1hZ2UtPnJlY3QoKSkgeworCVNETF9tZW1jcHkoZmIsIGJ1Ziwgd2lkdGgoKSpoZWlnaHQoKSoyKTsKKyAgICAgIH0gZWxzZSB7CisJaW50IGggPSByZWN0LmhlaWdodCgpOworCWludCB3ZCA9IHJlY3Qud2lkdGgoKTw8MTsKKwlpbnQgZmJsaW5lYWRkID0gbXlfcGFpbnRlci0+bGluZVN0ZXAoKTsKKwlpbnQgYnVmbGluZWFkZCA9IG15X2ltYWdlLT5ieXRlc1BlckxpbmUoKTsKKwlmYiAgKz0gKHJlY3QubGVmdCgpPDwxKSArIHJlY3QudG9wKCkgKiBteV9wYWludGVyLT5saW5lU3RlcCgpOworCWJ1ZiArPSAocmVjdC5sZWZ0KCk8PDEpICsgcmVjdC50b3AoKSAqIG15X2ltYWdlLT5ieXRlc1BlckxpbmUoKTsKKwl3aGlsZShoLS0pIHsKKwkgIFNETF9tZW1jcHkoZmIsIGJ1Ziwgd2QpOworCSAgZmIgKz0gZmJsaW5lYWRkOworCSAgYnVmICs9IGJ1ZmxpbmVhZGQ7CisJfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2NyZWVuUm90YXRpb24gPT0gU0RMX1FUX1JPVEFUSU9OXzI3MCkgeworICAgICAgaW50IGggPSByZWN0LmhlaWdodCgpOworICAgICAgaW50IHdkID0gcmVjdC53aWR0aCgpOworICAgICAgaW50IGZibGluZWFkZCA9IG15X3BhaW50ZXItPmxpbmVTdGVwKCkgLSAocmVjdC53aWR0aCgpIDw8IDEpOworICAgICAgaW50IGJ1ZmxpbmVhZGQgPSBteV9pbWFnZS0+Ynl0ZXNQZXJMaW5lKCkgLSAocmVjdC53aWR0aCgpIDw8IDEpOworICAgICAgaW50IHc7CisKKyAgICAgIHVjaGFyICpmYiA9ICh1Y2hhciopbXlfcGFpbnRlci0+ZnJhbWVCdWZmZXIoKTsKKyAgICAgIHVjaGFyICpidWYgPSAodWNoYXIqKW15X2ltYWdlLT5iaXRzKCk7CisgICAgICAgIAorICAgICAgZmIgKz0gKChteV9wYWludGVyLT53aWR0aCgpIC0gKHJlY3QudG9wKCkgKyByZWN0LmhlaWdodCgpKSkgKiAKKwkgICAgIG15X3BhaW50ZXItPmxpbmVTdGVwKCkpICsgKChteV9wYWludGVyLT5oZWlnaHQoKSAtICgocmVjdC5sZWZ0KCkgKyAKKwkJCQkJCQkJICByZWN0LndpZHRoKCkpKSkgPDwgMSk7CisKKyAgICAgIGJ1ZiArPSBteV9pbWFnZS0+Ynl0ZXNQZXJMaW5lKCkgKiAocmVjdC50b3AoKSArIHJlY3QuaGVpZ2h0KCkpIC0KKwkoKChteV9pbWFnZS0+d2lkdGgoKSAtIChyZWN0LmxlZnQoKSArIHJlY3Qud2lkdGgoKSkpIDw8IDEpICsgMik7CisKKyAgICAgIHdoaWxlKGgtLSkgeworCXcgPSB3ZDsKKwl3aGlsZSh3LS0pICooKHVuc2lnbmVkIHNob3J0KilmYikrKyA9ICooKHVuc2lnbmVkIHNob3J0KilidWYpLS07CisJZmIgKz0gZmJsaW5lYWRkOworCWJ1ZiAtPSBidWZsaW5lYWRkOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gaXBhcSAzODAwLi4uCitib29sIFNETF9RV2luOjpyZXBhaW50Um90YXRpb24xKGNvbnN0IFFSZWN0JiByZWN0KSB7CisgIGlmKG15X2ltYWdlLT53aWR0aCgpID09IHdpZHRoKCkpIHsKKyAgICB1c2hvcnQgKmZiID0gKHVzaG9ydCopbXlfcGFpbnRlci0+ZnJhbWVCdWZmZXIoKTsKKyAgICB1c2hvcnQgKmJ1ZiA9ICh1c2hvcnQqKW15X2ltYWdlLT5iaXRzKCk7CisgICAgZ3NfZmFzdFJvdGF0ZUJsaXRfMShmYiwgYnVmLCByZWN0KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7IC8vIEZJWE1FOiBsYW5kc2NhcGUgbW9kZQorICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNETF9RV2luOjpyZXBhaW50UmVjdChjb25zdCBRUmVjdCYgcmVjdCkgeworICBpZighbXlfcGFpbnRlciB8fCAhcmVjdC53aWR0aCgpIHx8ICFyZWN0LmhlaWdodCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZihRUGl4bWFwOjpkZWZhdWx0RGVwdGgoKSA9PSAxNikgeworICAgIHN3aXRjaChteV9wYWludGVyLT50cmFuc2Zvcm1PcmllbnRhdGlvbigpKSB7CisgICAgY2FzZSAzOgorICAgICAgaWYocmVwYWludFJvdGF0aW9uMyhyZWN0KSkgeyByZXR1cm47ICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBpZihyZXBhaW50Um90YXRpb24xKHJlY3QpKSB7IHJldHVybjsgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICAgIGlmKHJlcGFpbnRSb3RhdGlvbjAocmVjdCkpIHsgcmV0dXJuOyAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9IAorICBteV9wYWludGVyLT5kcmF3SW1hZ2UocmVjdC50b3BMZWZ0KCksICpteV9pbWFnZSwgcmVjdCk7Cit9CisKKy8vIFRoaXMgcGFpbnRzIHRoZSBjdXJyZW50IGJ1ZmZlciB0byB0aGUgc2NyZWVuLCB3aGVuIGRlc2lyZWQuIAordm9pZCBTRExfUVdpbjo6cGFpbnRFdmVudChRUGFpbnRFdmVudCAqZXYpIHsgIAorICBpZihteV9pbWFnZSkgeworICAgIGxvY2tTY3JlZW4odHJ1ZSk7CisgICAgcmVwYWludFJlY3QoZXYtPnJlY3QoKSk7CisgICAgdW5sb2NrU2NyZWVuKCk7CisgIH0KK30gIAorCisvKiBGdW5jdGlvbiB0byB0cmFuc2xhdGUgYSBrZXlib2FyZCB0cmFuc2l0aW9uIGFuZCBxdWV1ZSB0aGUga2V5IGV2ZW50CisgKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIHRhYmxlIGFsdGhvdWdoIHRoaXMgbWV0aG9kIGlzbid0IGV4YWN0bHkKKyAqIHNsb3cuCisgKi8KK3ZvaWQgU0RMX1FXaW46OlF1ZXVlS2V5KFFLZXlFdmVudCAqZSwgaW50IHByZXNzZWQpCit7ICAKKyAgU0RMX2tleXN5bSBrZXlzeW07CisgIGludCBzY2FuY29kZSA9IGUtPmtleSgpOworICAvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLworICBpZihzY2FuY29kZSA+PSAnQScgJiYgc2NhbmNvZGUgPD0gJ1onKSB7CisgICAgLy8gUXQgc2VuZHMgdXBwZXJjYXNlLCBTREwgd2FudHMgbG93ZXJjYXNlCisgICAga2V5c3ltLnN5bSA9IHN0YXRpY19jYXN0PFNETEtleT4oc2NhbmNvZGUgKyAzMik7CisgIH0gZWxzZSBpZihzY2FuY29kZSAgPj0gMHgxMDAwKSB7CisgICAgLy8gU3BlY2lhbCBrZXlzCisgICAgc3dpdGNoKHNjYW5jb2RlKSB7CisgICAgY2FzZSBRdDo6S2V5X0VzY2FwZTogc2NhbmNvZGUgPSBTRExLX0VTQ0FQRTsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X1RhYjogc2NhbmNvZGUgPSBTRExLX1RBQjsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0JhY2tzcGFjZTogc2NhbmNvZGUgPSBTRExLX0JBQ0tTUEFDRTsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X1JldHVybjogc2NhbmNvZGUgPSBTRExLX1JFVFVSTjsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0VudGVyOiBzY2FuY29kZSA9IFNETEtfS1BfRU5URVI7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9JbnNlcnQ6IHNjYW5jb2RlID0gU0RMS19JTlNFUlQ7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9EZWxldGU6IHNjYW5jb2RlID0gU0RMS19ERUxFVEU7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9QYXVzZTogc2NhbmNvZGUgPSBTRExLX1BBVVNFOyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfUHJpbnQ6IHNjYW5jb2RlID0gU0RMS19QUklOVDsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X1N5c1JlcTogc2NhbmNvZGUgPSBTRExLX1NZU1JFUTsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0hvbWU6IHNjYW5jb2RlID0gU0RMS19IT01FOyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfRW5kOiBzY2FuY29kZSA9IFNETEtfRU5EOyBicmVhazsKKyAgICAvLyBXZSB3YW50IHRoZSBjb250cm9sIGtleXMgdG8gcm90YXRlIHdpdGggdGhlIHNjcmVlbgorICAgIGNhc2UgUXQ6OktleV9MZWZ0OiAKKyAgICAgICAgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl85MCkgc2NhbmNvZGUgPSBTRExLX1VQOworICAgICAgICBlbHNlIGlmIChzY3JlZW5Sb3RhdGlvbiA9PSBTRExfUVRfUk9UQVRJT05fMjcwKSBzY2FuY29kZSA9IFNETEtfRE9XTjsKKyAgICAgICAgZWxzZSBzY2FuY29kZSA9IFNETEtfTEVGVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X1VwOiAKKyAgICAgICAgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl85MCkgc2NhbmNvZGUgPSBTRExLX1JJR0hUOworICAgICAgICBlbHNlIGlmIChzY3JlZW5Sb3RhdGlvbiA9PSBTRExfUVRfUk9UQVRJT05fMjcwKSBzY2FuY29kZSA9IFNETEtfTEVGVDsKKyAgICAgICAgZWxzZSBzY2FuY29kZSA9IFNETEtfVVA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9SaWdodDogCisgICAgICAgIGlmIChzY3JlZW5Sb3RhdGlvbiA9PSBTRExfUVRfUk9UQVRJT05fOTApIHNjYW5jb2RlID0gU0RMS19ET1dOOworICAgICAgICBlbHNlIGlmIChzY3JlZW5Sb3RhdGlvbiA9PSBTRExfUVRfUk9UQVRJT05fMjcwKSBzY2FuY29kZSA9IFNETEtfVVA7CisgICAgICAgIGVsc2Ugc2NhbmNvZGUgPSBTRExLX1JJR0hUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfRG93bjoKKyAgICAgICAgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl85MCkgc2NhbmNvZGUgPSBTRExLX0xFRlQ7CisgICAgICAgIGVsc2UgaWYgKHNjcmVlblJvdGF0aW9uID09IFNETF9RVF9ST1RBVElPTl8yNzApIHNjYW5jb2RlID0gU0RMS19SSUdIVDsKKyAgICAgICAgZWxzZSBzY2FuY29kZSA9IFNETEtfRE9XTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X1ByaW9yOiBzY2FuY29kZSA9IFNETEtfUEFHRVVQOyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfTmV4dDogc2NhbmNvZGUgPSBTRExLX1BBR0VET1dOOyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfU2hpZnQ6IHNjYW5jb2RlID0gU0RMS19MU0hJRlQ7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9Db250cm9sOiBzY2FuY29kZSA9IFNETEtfTENUUkw7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9NZXRhOiBzY2FuY29kZSA9IFNETEtfTE1FVEE7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9BbHQ6IHNjYW5jb2RlID0gU0RMS19MQUxUOyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfQ2Fwc0xvY2s6IHNjYW5jb2RlID0gU0RMS19DQVBTTE9DSzsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X051bUxvY2s6IHNjYW5jb2RlID0gU0RMS19OVU1MT0NLOyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfU2Nyb2xsTG9jazogc2NhbmNvZGUgPSBTRExLX1NDUk9MTE9DSzsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0YxOiBzY2FuY29kZSA9IFNETEtfRjE7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9GMjogc2NhbmNvZGUgPSBTRExLX0YyOyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfRjM6IHNjYW5jb2RlID0gU0RMS19GMzsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0Y0OiBzY2FuY29kZSA9IFNETEtfRjQ7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9GNTogc2NhbmNvZGUgPSBTRExLX0Y1OyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfRjY6IHNjYW5jb2RlID0gU0RMS19GNjsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0Y3OiBzY2FuY29kZSA9IFNETEtfRjc7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9GODogc2NhbmNvZGUgPSBTRExLX0Y4OyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfRjk6IHNjYW5jb2RlID0gU0RMS19GOTsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0YxMDogc2NhbmNvZGUgPSBTRExLX0YxMDsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0YxMTogc2NhbmNvZGUgPSBTRExLX0YxMTsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0YxMjogc2NhbmNvZGUgPSBTRExLX0YxMjsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0YxMzogc2NhbmNvZGUgPSBTRExLX0YxMzsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0YxNDogc2NhbmNvZGUgPSBTRExLX0YxNDsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0YxNTogc2NhbmNvZGUgPSBTRExLX0YxNTsgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X1N1cGVyX0w6IHNjYW5jb2RlID0gU0RMS19MU1VQRVI7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9TdXBlcl9SOiBzY2FuY29kZSA9IFNETEtfUlNVUEVSOyBicmVhazsKKyAgICBjYXNlIFF0OjpLZXlfTWVudTogc2NhbmNvZGUgPSBTRExLX01FTlU7IGJyZWFrOworICAgIGNhc2UgUXQ6OktleV9IZWxwOiBzY2FuY29kZSA9IFNETEtfSEVMUDsgYnJlYWs7CisKKyAgICBjYXNlIFF0OjpLZXlfRjMzOgorICAgICAgLy8gRklYTUU6IFRoaXMgaXMgYSBoYWNrIHRvIGVuYWJsZSB0aGUgT0sga2V5IG9uCisgICAgICAvLyBaYXVyaWkgZGV2aWNlcy4gU0RMS19SRVRVUk4gaXMgYSBzdWl0YWJsZSBrZXkgdG8gdXNlCisgICAgICAvLyBzaW5jZSBpdCBvZnRlbiBpcyB1c2VkIGFzIHN1Y2guCisgICAgICAvLyAgICAgZGF2aWRAaGVkYm9yLm9yZworICAgICAgc2NhbmNvZGUgPSBTRExLX1JFVFVSTjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzY2FuY29kZSA9IFNETEtfVU5LTk9XTjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBrZXlzeW0uc3ltID0gc3RhdGljX2Nhc3Q8U0RMS2V5PihzY2FuY29kZSk7ICAgIAorICB9IGVsc2UgeworICAgIGtleXN5bS5zeW0gPSBzdGF0aWNfY2FzdDxTRExLZXk+KHNjYW5jb2RlKTsgICAgCisgIH0KKyAga2V5c3ltLnNjYW5jb2RlID0gc2NhbmNvZGU7CisgIGtleXN5bS5tb2QgPSBLTU9EX05PTkU7CisgIEJ1dHRvblN0YXRlIHN0ID0gZS0+c3RhdGUoKTsKKyAgaWYoIChzdCAmIFNoaWZ0QnV0dG9uKSApICAgeyBrZXlzeW0ubW9kID0gc3RhdGljX2Nhc3Q8U0RMTW9kPihrZXlzeW0ubW9kIHwgS01PRF9MU0hJRlQpOyAgfQorICBpZiggKHN0ICYgQ29udHJvbEJ1dHRvbikgKSB7IGtleXN5bS5tb2QgPSBzdGF0aWNfY2FzdDxTRExNb2Q+KGtleXN5bS5tb2QgfCBLTU9EX0xDVFJMKTsgIH0KKyAgaWYoIChzdCAmIEFsdEJ1dHRvbikgKSAgICAgeyBrZXlzeW0ubW9kID0gc3RhdGljX2Nhc3Q8U0RMTW9kPihrZXlzeW0ubW9kIHwgS01PRF9MQUxUKTsgIH0KKyAgaWYgKCBTRExfVHJhbnNsYXRlVU5JQ09ERSApIHsKKyAgICBRQ2hhciBxY2hhciA9IGUtPnRleHQoKVswXTsKKyAgICBrZXlzeW0udW5pY29kZSA9IHFjaGFyLnVuaWNvZGUoKTsKKyAgfSBlbHNlIHsKKyAgICBrZXlzeW0udW5pY29kZSA9IDA7CisgIH0KKworICAvKiBOVU1MT0NLIGFuZCBDQVBTTE9DSyBhcmUgaW1wbGVtZW50ZWQgYXMgZG91YmxlLXByZXNzZXMgaW4gcmVhbGl0eSAqLworICAvLwlpZiAoIChrZXlzeW0uc3ltID09IFNETEtfTlVNTE9DSykgfHwgKGtleXN5bS5zeW0gPT0gU0RMS19DQVBTTE9DSykgKSB7CisgIC8vCQlwcmVzc2VkID0gMTsKKyAgLy8JfQorCisgIC8qIFF1ZXVlIHRoZSBrZXkgZXZlbnQgKi8KKyAgaWYgKCBwcmVzc2VkICkgeworICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsICZrZXlzeW0pOworICB9IGVsc2UgeworICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELCAma2V5c3ltKTsKKyAgfQorfQorCit2b2lkIFNETF9RV2luOjpzZXRGdWxsc2NyZWVuKGJvb2wgZnNfb24pIHsKKyAgbXlfaGFzX2Z1bGxzY3JlZW4gPSBmYWxzZTsKKyAgZW5hYmxlRnVsbHNjcmVlbigpOworfQorCit2b2lkIFNETF9RV2luOjplbmFibGVGdWxsc2NyZWVuKCkgeworICAvLyBNYWtlIHN1cmUgc2l6ZSBpcyBjb3JyZWN0CisgIGlmKCFteV9oYXNfZnVsbHNjcmVlbikgeworICAgIHNldEZpeGVkU2l6ZShxQXBwLT5kZXNrdG9wKCktPnNpemUoKSk7CisgICAgLy8gVGhpcyBjYWxsIGlzIG5lZWRlZCBiZWNhdXNlIHNob3dGdWxsU2NyZWVuIHdvbid0IHdvcmsKKyAgICAvLyBjb3JyZWN0bHkgaWYgdGhlIHdpZGdldCBhbHJlYWR5IGNvbnNpZGVycyBpdHNlbGYgdG8gYmUgZnVsbHNjcmVlbi4KKyAgICBzaG93Tm9ybWFsKCk7CisgICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBzaG93Tm9ybWFsKCkgZm9yY2VmdWxseSBjaGFuZ2VzIHRoZSB3aW5kb3cKKyAgICAvLyBzdHlsZSB0byBXU1R5bGVfVG9wTGV2ZWwuCisgICAgc2V0V0ZsYWdzKFdTdHlsZV9DdXN0b21pemUgfCBXU3R5bGVfTm9Cb3JkZXIpOworICAgIC8vIEVuYWJsZSBmdWxsc2NyZWVuLgorICAgIHNob3dGdWxsU2NyZWVuKCk7CisgICAgbXlfaGFzX2Z1bGxzY3JlZW4gPSB0cnVlOworICB9Cit9CisKK2Jvb2wgU0RMX1FXaW46OmxvY2tTY3JlZW4oYm9vbCBmb3JjZSkgeworICBpZighbXlfcGFpbnRlcikgeworICAgIGlmKGZvcmNlIHx8IChpc1Zpc2libGUoKSAmJiBpc0FjdGl2ZVdpbmRvdygpKSkgeworICAgICAgbXlfcGFpbnRlciA9IG5ldyBRRGlyZWN0UGFpbnRlcih0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBteV9sb2NrZWQrKzsgLy8gSW5jcmVhdGUgbG9jayByZWZjb3VudAorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTRExfUVdpbjo6dW5sb2NrU2NyZWVuKCkgeworICBpZihteV9sb2NrZWQgPiAwKSB7CisgICAgbXlfbG9ja2VkLS07IC8vIGRlY3JlYXNlIGxvY2sgcmVmY291bnQ7CisgIH0KKyAgaWYoIW15X2xvY2tlZCAmJiBteV9wYWludGVyKSB7CisgICAgbXlfcGFpbnRlci0+ZW5kKCk7CisgICAgZGVsZXRlIG15X3BhaW50ZXI7CisgICAgbXlfcGFpbnRlciA9IDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXRvcGlhL1NETF9RV2luLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfUVdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzE4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfUVdpbi5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX1FXaW5faAorI2RlZmluZSBfU0RMX1FXaW5faAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHFpbWFnZS5oPgorI2luY2x1ZGUgPHFwaXhtYXAuaD4KKyNpbmNsdWRlIDxxd2lkZ2V0Lmg+CisjaW5jbHVkZSA8cXBhaW50ZXIuaD4KKyNpbmNsdWRlIDxxZGlyZWN0cGFpbnRlcl9xd3MuaD4KKworI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorfTsKKwordHlwZWRlZiBlbnVtIHsgCisgICAgU0RMX1FUX05PX1JPVEFUSU9OID0gMCwgCisgICAgU0RMX1FUX1JPVEFUSU9OXzkwLCAKKyAgICBTRExfUVRfUk9UQVRJT05fMjcwIAorfSBzY3JlZW5Sb3RhdGlvblQ7CisKK2V4dGVybiBzY3JlZW5Sb3RhdGlvblQgc2NyZWVuUm90YXRpb247CisKK2NsYXNzIFNETF9RV2luIDogcHVibGljIFFXaWRnZXQKK3sKKyAgdm9pZCBRdWV1ZUtleShRS2V5RXZlbnQgKmUsIGludCBwcmVzc2VkKTsKKyBwdWJsaWM6CisgIFNETF9RV2luKGNvbnN0IFFTaXplJiBzaXplKTsKKyAgdmlydHVhbCB+U0RMX1FXaW4oKTsKKyAgdmlydHVhbCBib29sIHNob3duKHZvaWQpIHsKKyAgICByZXR1cm4gaXNWaXNpYmxlKCk7CisgIH0KKyAgLyogSWYgY2FsbGVkLCB0aGUgbmV4dCByZXNpemUgZXZlbnQgd2lsbCBub3QgYmUgZm9yd2FyZGVkIHRvIFNETC4gKi8KKyAgdmlydHVhbCB2b2lkIGluaGliaXRSZXNpemUodm9pZCkgeworICAgIG15X2luaGliaXRfcmVzaXplID0gdHJ1ZTsKKyAgfQorICB2b2lkIHNldEltYWdlKFFJbWFnZSAqaW1hZ2UpOworICB2b2lkIHNldE9mZnNldChpbnQgeCwgaW50IHkpIHsKKyAgICBteV9vZmZzZXQgPSBRUG9pbnQoeCwgeSk7CisgIH0KKyAgdm9pZCBHZXRYWU9mZnNldChpbnQgJngsIGludCAmeSkgeworICAgIHggPSBteV9vZmZzZXQueCgpOworICAgIHkgPSBteV9vZmZzZXQueSgpOworICB9CisgIFFJbWFnZSAqaW1hZ2Uodm9pZCkgeyByZXR1cm4gbXlfaW1hZ2U7IH0KKyAgCisgIHZvaWQgc2V0V0ZsYWdzKFdGbGFncyBmbGFncykgeworICAgIFFXaWRnZXQ6OnNldFdGbGFncyhmbGFncyk7CisgICAgbXlfZmxhZ3MgPSBmbGFnczsKKyAgfQorICBjb25zdCBRUG9pbnQmIG1vdXNlUG9zKCkgY29uc3QgeyByZXR1cm4gbXlfbW91c2VfcG9zOyB9CisgIHZvaWQgc2V0TW91c2VQb3MoY29uc3QgUVBvaW50JiBuZXdwb3MpOworICB2b2lkIHNldEZ1bGxzY3JlZW4oYm9vbCk7CisKKyAgYm9vbCBsb2NrU2NyZWVuKGJvb2wgZm9yY2U9ZmFsc2UpOworICB2b2lkIHVubG9ja1NjcmVlbigpOworICB2b2lkIHJlcGFpbnRSZWN0KGNvbnN0IFFSZWN0JiByZWN0KTsKKyBwcm90ZWN0ZWQ6CisgIC8qIEhhbmRsZSByZXNpemluZyBvZiB0aGUgd2luZG93ICovCisgIHZpcnR1YWwgdm9pZCByZXNpemVFdmVudChRUmVzaXplRXZlbnQgKmUpOworICB2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNFdmVudCAqKTsKKyAgdm9pZCBmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50ICopOworICB2b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZlbnQgKmUpOworICB2b2lkIG1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKKyAgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQgKmUpOworICB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKKyAgdm9pZCBwYWludEV2ZW50KFFQYWludEV2ZW50ICpldik7CisgIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKmUpICAgeyBRdWV1ZUtleShlLCAxKTsgfQorICB2b2lkIGtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQgKmUpIHsgUXVldWVLZXkoZSwgMCk7IH0KKyBwcml2YXRlOgorICBib29sIHJlcGFpbnRSb3RhdGlvbjAoY29uc3QgUVJlY3QmIHJlY3QpOworICBib29sIHJlcGFpbnRSb3RhdGlvbjEoY29uc3QgUVJlY3QmIHJlY3QpOworICBib29sIHJlcGFpbnRSb3RhdGlvbjMoY29uc3QgUVJlY3QmIHJlY3QpOworICB2b2lkIGVuYWJsZUZ1bGxzY3JlZW4oKTsKKyAgUURpcmVjdFBhaW50ZXIgKm15X3BhaW50ZXI7CisgIFFJbWFnZSAqbXlfaW1hZ2U7CisgIGJvb2wgbXlfaW5oaWJpdF9yZXNpemU7CisgIFFQb2ludCBteV9vZmZzZXQ7CisgIFFQb2ludCBteV9tb3VzZV9wb3M7CisgIFdGbGFncyBteV9mbGFnczsKKyAgV0ZsYWdzIG15X2hhc19mdWxsc2NyZWVuOworICB1bnNpZ25lZCBpbnQgbXlfbG9ja2VkOworfTsKKworI2VuZGlmIC8qIF9TRExfUVdpbl9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfbG93dmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXRvcGlhL1NETF9sb3d2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMDVjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfbG93dmlkZW8uaApAQCAtMCwwICsxLDY1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX2xvd3ZpZGVvX2gKKyNkZWZpbmUgX1NETF9sb3d2aWRlb19oCisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqX3RoaXMKKworLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgKi8KK3N0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7CisgIC8qIFRoZSBtYWluIHdpbmRvdyAqLworICBTRExfUVdpbiAqU0RMX1dpbjsKKworICAvKiBUaGUgZnVsbHNjcmVlbiBtb2RlIGxpc3QgKi8KKyNkZWZpbmUgTlVNX01PREVMSVNUUwk0CQkvKiA4LCAxNiwgMjQsIGFuZCAzMiBiaXRzLXBlci1waXhlbCAqLworICBpbnQgU0RMX251bW1vZGVzW05VTV9NT0RFTElTVFNdOworICBTRExfUmVjdCAqKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXTsKKworICAvKiBBIGNvbXBsZXRlbHkgY2xlYXIgY3Vyc29yICovCisgIFdNY3Vyc29yICpCbGFua0N1cnNvcjsKKworICAvKiBNb3VzZSBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgVWludDMyIGxhc3RfYnV0dG9uczsKKyAgUVBvaW50IGxhc3RfcG9pbnQ7CisKKyAgLyogS2V5Ym9hcmQgc3RhdGUgdmFyaWFibGVzICovCisgIGludCBrZXlfZmxpcDsKKyAgLy9zdHJ1Y3Qga2V5X2luZm8ga2V5aW5mb1syXTsKK307CisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgU0RMX1dpbgkJKF90aGlzLT5oaWRkZW4tPlNETF9XaW4pCisjZGVmaW5lIHNhdmVkX21vZGUJKF90aGlzLT5oaWRkZW4tPnNhdmVkX21vZGUpCisjZGVmaW5lIFNETF9udW1tb2RlcwkoX3RoaXMtPmhpZGRlbi0+U0RMX251bW1vZGVzKQorI2RlZmluZSBTRExfbW9kZWxpc3QJKF90aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKKyNkZWZpbmUgU0RMX0JsYW5rQ3Vyc29yCShfdGhpcy0+aGlkZGVuLT5CbGFua0N1cnNvcikKKyNkZWZpbmUgbGFzdF9idXR0b25zCShfdGhpcy0+aGlkZGVuLT5sYXN0X2J1dHRvbnMpCisjZGVmaW5lIGxhc3RfcG9pbnQJKF90aGlzLT5oaWRkZW4tPmxhc3RfcG9pbnQpCisjZGVmaW5lIGtleV9mbGlwCShfdGhpcy0+aGlkZGVuLT5rZXlfZmxpcCkKKyNkZWZpbmUga2V5aW5mbwkJKF90aGlzLT5oaWRkZW4tPmtleWluZm8pCisKKyNlbmRpZiAvKiBfU0RMX2xvd3ZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXNldmVudHMuY2MgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzZXZlbnRzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYWY4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzZXZlbnRzLmNjCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHFwZS9xcGVhcHBsaWNhdGlvbi5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJTRExfZXJyb3IuaCIKKyNpbmNsdWRlICJTRExfZXZlbnRzLmgiCisjaW5jbHVkZSAiU0RMX1FXaW4uaCIKKyNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKKyNpbmNsdWRlICJTRExfdGltZXIuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3N5c2V2ZW50c19jLmgiCisKKyAgLy8gIHN0YXRpYyBTRExLZXkga2V5bWFwWzEyOF07CisvKiBUaGlzIGlzIHNwZWNpYWwgYmVjYXVzZSB3ZSBrbm93IGl0IHdpbGwgYmUgcnVuIGluIGEgbG9vcCBpbiBhIHNlcGFyYXRlCisgICB0aHJlYWQuICBOb3JtYWxseSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBsb29wIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGlucHV0CisgICBzdGF0ZXMgY2hhbmdpbmcsIGkuZS4gbmV3IGV2ZW50cyBhcnJpdmluZy4KKyovCit2b2lkIFFUX1B1bXBFdmVudHMoX1RISVMpCit7CisgIGlmKCFxQXBwKSB7CisgICAgcmV0dXJuOyAKKyAgfQorICAvLyAgcHJpbnRmKCJwcm9jZXNzaW5nIGV2ZW50czogJXBcbiIsIHFBcHApOworICAvL3FBcHAtPnByb2Nlc3NPbmVFdmVudCgpOyAvLyB3YWl0IGZvciBhIGV2ZW50CisgIHFBcHAtPnByb2Nlc3NFdmVudHMoKTsgLy8gYW5kIHByb2Nlc3MgYWxsIG91dHN0YW5kaW5nIG9uZXMKKyNpZiAwCisgIEJWaWV3ICp2aWV3OworCUJSZWN0IGJvdW5kczsKKwlCUG9pbnQgcG9pbnQ7CisJdWludDMyIGJ1dHRvbnM7CisJY29uc3QgdWludDMyIGJ1dHRvbl9tYXNrc1szXSA9IHsKKwkJQl9QUklNQVJZX01PVVNFX0JVVFRPTiwKKwkJQl9URVJUSUFSWV9NT1VTRV9CVVRUT04sIAorCQlCX1NFQ09OREFSWV9NT1VTRV9CVVRUT04sCisJfTsKKwl1bnNpZ25lZCBpbnQgICAgaSwgajsKKworCS8qIENoZWNrIG91dCB0aGUgbW91c2UgYnV0dG9ucyBhbmQgcG9zaXRpb24gKHNsaWdodCByYWNlIGNvbmRpdGlvbikgKi8KKwlpZiAoIFNETF9XaW4tPkxvY2soKSApIHsKKwkJLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgaGF2ZSBubyB2aWV3ICovCisJCXZpZXcgPSBTRExfV2luLT5WaWV3KCk7CisJCWlmICggISB2aWV3ICkgeworCQkJU0RMX1dpbi0+VW5sb2NrKCk7CisJCQlyZXR1cm47CisJCX0KKwkJYm91bmRzID0gdmlldy0+Qm91bmRzKCk7CisJCS8qIEdldCBuZXcgaW5wdXQgc3RhdGUsIGlmIHN0aWxsIGFjdGl2ZSAqLworCQlpZiAoIFNETF9XaW4tPklzQWN0aXZlKCkgKSB7CisJCQlrZXlfZmxpcCA9ICFrZXlfZmxpcDsKKwkJCWdldF9rZXlfaW5mbygma2V5aW5mb1trZXlfZmxpcF0pOworCQkJdmlldy0+R2V0TW91c2UoJnBvaW50LCAmYnV0dG9ucywgdHJ1ZSk7CisJCX0gZWxzZSB7CisJCQlrZXlfZmxpcCA9IGtleV9mbGlwOworCQkJcG9pbnQgPSBsYXN0X3BvaW50OworCQkJYnV0dG9ucyA9IGxhc3RfYnV0dG9uczsKKwkJfQorCQlTRExfV2luLT5VbmxvY2soKTsKKwl9IGVsc2UgeworCQlyZXR1cm47CisJfQorCisJLyogSWYgb3VyIHZpZXcgaXMgYWN0aXZlLCB3ZSdsbCBmaW5kIGtleSBjaGFuZ2VzIGhlcmUgKi8KKwlpZiAoIFNETF9tZW1jbXAoa2V5aW5mb1swXS5rZXlfc3RhdGVzLCBrZXlpbmZvWzFdLmtleV9zdGF0ZXMsIDE2KSAhPSAwICkgeworCQlmb3IgKCBpPTA7IGk8MTY7ICsraSApIHsKKwkJCVVpbnQ4IG5ld19zdGF0ZSwgdHJhbnNpdGlvbjsKKworCQkJbmV3X3N0YXRlID0ga2V5aW5mb1trZXlfZmxpcF0ua2V5X3N0YXRlc1tpXTsKKwkJCXRyYW5zaXRpb24gPSBrZXlpbmZvWyFrZXlfZmxpcF0ua2V5X3N0YXRlc1tpXSBeCisJCQkJCWtleWluZm9bIGtleV9mbGlwXS5rZXlfc3RhdGVzW2ldOworCQkJZm9yICggaj0wOyBqPDg7ICsraiApIHsKKwkJCQlpZiAoIHRyYW5zaXRpb24mMHg4MCApCisJCQkJCVF1ZXVlS2V5KGkqOCtqLCBuZXdfc3RhdGUmMHg4MCk7CisJCQkJdHJhbnNpdGlvbiA8PD0gMTsKKwkJCQluZXdfc3RhdGUgPDw9IDE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBXZSBjaGVjayBrZXlib2FyZCwgYnV0IG5vdCBtb3VzZSBpZiBtb3VzZSBpc24ndCBpbiB3aW5kb3cgKi8KKwlpZiAoICEgYm91bmRzLkNvbnRhaW5zKHBvaW50KSApIHsKKwkJLyogTW91c2UgbW92ZWQgb3V0c2lkZSBvdXIgdmlldz8gKi8KKwkJaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBNT1VTRUZPQ1VTICkgeworCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOworCQkJYmVfYXBwLT5TZXRDdXJzb3IoQl9IQU5EX0NVUlNPUik7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvKiBIYXMgdGhlIG1vdXNlIG1vdmVkIGJhY2sgaW50byBvdXIgdmlldz8gKi8KKwlpZiAoICEgKFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUE1PVVNFRk9DVVMpICkgeworCQkvKiBSZXNldCB0aGUgQl9IQU5EX0NVUlNPUiB0byBvdXIgb3duICovCisJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBNT1VTRUZPQ1VTKTsKKwkJU0RMX1NldEN1cnNvcihOVUxMKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgbW91c2UgbW90aW9uICovCisJaWYgKCBwb2ludCAhPSBsYXN0X3BvaW50ICkgeworCQlpbnQgeCwgeTsKKworCQlTRExfV2luLT5HZXRYWU9mZnNldCh4LCB5KTsKKwkJeCA9IChpbnQpcG9pbnQueCAtIHg7CisJCXkgPSAoaW50KXBvaW50LnkgLSB5OworCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHgsIHkpOworCX0KKwlsYXN0X3BvaW50ID0gcG9pbnQ7CisKKwkvKiBBZGQgYW55IG1vdXNlIGJ1dHRvbiBldmVudHMgKi8KKwlmb3IgKCBpPTA7IGk8U0RMX1RBQkxFU0laRShidXR0b25fbWFza3MpOyArK2kgKSB7CisJCWlmICggKGJ1dHRvbnMgXiBsYXN0X2J1dHRvbnMpICYgYnV0dG9uX21hc2tzW2ldICkgeworCQkJaWYgKCBidXR0b25zICYgYnV0dG9uX21hc2tzW2ldICkgeworCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIDEraSwgMCwgMCk7CisJCQl9IGVsc2UgeworCQkJCVNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCAxK2ksIDAsIDApOworCQkJfQorCQl9CisJfQorCWxhc3RfYnV0dG9ucyA9IGJ1dHRvbnM7CisjZW5kaWYKK30KKwordm9pZCBRVF9Jbml0T1NLZXltYXAoX1RISVMpCit7CisjaWYgMAorICB1bnNpZ25lZCBpbnQgaTsKKworICAvKiBJbml0aWFsaXplIGFsbCB0aGUga2V5IHN0YXRlcyBhcyAidXAiICovCisgIGtleV9mbGlwID0gMDsKKyAgU0RMX21lbXNldChrZXlpbmZvW2tleV9mbGlwXS5rZXlfc3RhdGVzLCAwLCAxNik7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUga2V5IHRyYW5zbGF0aW9uIHRhYmxlICovCisgIGZvciAoIGk9MDsgaTxTRExfVEFCTEVTSVpFKGtleW1hcCk7ICsraSApCisgICAga2V5bWFwW2ldID0gU0RMS19VTktOT1dOOworCisgIC8vICBrZXltYXBbMHgwMV0JCT0gU0RMS19FU0NBUEU7CisgIC8vICBrZXltYXBbQl9GMV9LRVldCT0gU0RMS19GMTsKKyAgLy8gIGtleW1hcFtCX0YyX0tFWV0JPSBTRExLX0YyOworICAvLyAga2V5bWFwW0JfRjNfS0VZXQk9IFNETEtfRjM7CisgIC8vICBrZXltYXBbQl9GNF9LRVldCT0gU0RMS19GNDsKKyAgLy8gIGtleW1hcFtCX0Y1X0tFWV0JPSBTRExLX0Y1OworICAvLyAga2V5bWFwW0JfRjZfS0VZXQk9IFNETEtfRjY7CisgIC8vICBrZXltYXBbQl9GN19LRVldCT0gU0RMS19GNzsKKyAgLy8gIGtleW1hcFtCX0Y4X0tFWV0JPSBTRExLX0Y4OworICAvLyAga2V5bWFwW0JfRjlfS0VZXQk9IFNETEtfRjk7CisgIC8vICBrZXltYXBbQl9GMTBfS0VZXQk9IFNETEtfRjEwOworICAvLyAga2V5bWFwW0JfRjExX0tFWV0JPSBTRExLX0YxMTsKKyAgLy8gIGtleW1hcFtCX0YxMl9LRVldCT0gU0RMS19GMTI7CisgIC8vICBrZXltYXBbQl9QUklOVF9LRVldCT0gU0RMS19QUklOVDsKKyAgLy9rZXltYXBbQl9TQ1JPTExfS0VZXQk9IFNETEtfU0NST0xMT0NLOworICAvLyAga2V5bWFwW0JfUEFVU0VfS0VZXQk9IFNETEtfUEFVU0U7CisgIGtleW1hcFsweDExXQkJPSBTRExLX0JBQ0tRVU9URTsKKyAga2V5bWFwWzB4MTJdCQk9IFNETEtfMTsKKyAga2V5bWFwWzB4MTNdCQk9IFNETEtfMjsKKyAga2V5bWFwWzB4MTRdCQk9IFNETEtfMzsKKyAga2V5bWFwWzB4MTVdCQk9IFNETEtfNDsKKyAga2V5bWFwWzB4MTZdCQk9IFNETEtfNTsKKyAga2V5bWFwWzB4MTddCQk9IFNETEtfNjsKKyAga2V5bWFwWzB4MThdCQk9IFNETEtfNzsKKyAga2V5bWFwWzB4MTldCQk9IFNETEtfODsKKyAga2V5bWFwWzB4MWFdCQk9IFNETEtfOTsKKyAga2V5bWFwWzB4MWJdCQk9IFNETEtfMDsKKyAga2V5bWFwWzB4MWNdCQk9IFNETEtfTUlOVVM7CisgIGtleW1hcFsweDFkXQkJPSBTRExLX0VRVUFMUzsKKyAga2V5bWFwWzB4MWVdCQk9IFNETEtfQkFDS1NQQUNFOworICBrZXltYXBbMHgxZl0JCT0gU0RMS19JTlNFUlQ7CisgIGtleW1hcFsweDIwXQkJPSBTRExLX0hPTUU7CisgIGtleW1hcFsweDIxXQkJPSBTRExLX1BBR0VVUDsKKyAgLy9rZXltYXBbMHgyMl0JCT0gU0RMS19OVU1MT0NLOworICBrZXltYXBbMHgyM10JCT0gU0RMS19LUF9ESVZJREU7CisgIGtleW1hcFsweDI0XQkJPSBTRExLX0tQX01VTFRJUExZOworICBrZXltYXBbMHgyNV0JCT0gU0RMS19LUF9NSU5VUzsKKyAga2V5bWFwWzB4MjZdCQk9IFNETEtfVEFCOworICBrZXltYXBbMHgyN10JCT0gU0RMS19xOworICBrZXltYXBbMHgyOF0JCT0gU0RMS193OworICBrZXltYXBbMHgyOV0JCT0gU0RMS19lOworICBrZXltYXBbMHgyYV0JCT0gU0RMS19yOworICBrZXltYXBbMHgyYl0JCT0gU0RMS190OworICBrZXltYXBbMHgyY10JCT0gU0RMS195OworICBrZXltYXBbMHgyZF0JCT0gU0RMS191OworICBrZXltYXBbMHgyZV0JCT0gU0RMS19pOworICBrZXltYXBbMHgyZl0JCT0gU0RMS19vOworICBrZXltYXBbMHgzMF0JCT0gU0RMS19wOworICBrZXltYXBbMHgzMV0JCT0gU0RMS19MRUZUQlJBQ0tFVDsKKyAga2V5bWFwWzB4MzJdCQk9IFNETEtfUklHSFRCUkFDS0VUOworICBrZXltYXBbMHgzM10JCT0gU0RMS19CQUNLU0xBU0g7CisgIGtleW1hcFsweDM0XQkJPSBTRExLX0RFTEVURTsKKyAga2V5bWFwWzB4MzVdCQk9IFNETEtfRU5EOworICBrZXltYXBbMHgzNl0JCT0gU0RMS19QQUdFRE9XTjsKKyAga2V5bWFwWzB4MzddCQk9IFNETEtfS1A3OworICBrZXltYXBbMHgzOF0JCT0gU0RMS19LUDg7CisgIGtleW1hcFsweDM5XQkJPSBTRExLX0tQOTsKKyAga2V5bWFwWzB4M2FdCQk9IFNETEtfS1BfUExVUzsKKyAgLy9rZXltYXBbMHgzYl0JCT0gU0RMS19DQVBTTE9DSzsKKyAga2V5bWFwWzB4M2NdCQk9IFNETEtfYTsKKyAga2V5bWFwWzB4M2RdCQk9IFNETEtfczsKKyAga2V5bWFwWzB4M2VdCQk9IFNETEtfZDsKKyAga2V5bWFwWzB4M2ZdCQk9IFNETEtfZjsKKyAga2V5bWFwWzB4NDBdCQk9IFNETEtfZzsKKyAga2V5bWFwWzB4NDFdCQk9IFNETEtfaDsKKyAga2V5bWFwWzB4NDJdCQk9IFNETEtfajsKKyAga2V5bWFwWzB4NDNdCQk9IFNETEtfazsKKyAga2V5bWFwWzB4NDRdCQk9IFNETEtfbDsKKyAga2V5bWFwWzB4NDVdCQk9IFNETEtfU0VNSUNPTE9OOworICBrZXltYXBbMHg0Nl0JCT0gU0RMS19RVU9URTsKKyAga2V5bWFwWzB4NDddCQk9IFNETEtfUkVUVVJOOworICBrZXltYXBbMHg0OF0JCT0gU0RMS19LUDQ7CisgIGtleW1hcFsweDQ5XQkJPSBTRExLX0tQNTsKKyAga2V5bWFwWzB4NGFdCQk9IFNETEtfS1A2OworICBrZXltYXBbMHg0Yl0JCT0gU0RMS19MU0hJRlQ7CisgIGtleW1hcFsweDRjXQkJPSBTRExLX3o7CisgIGtleW1hcFsweDRkXQkJPSBTRExLX3g7CisgIGtleW1hcFsweDRlXQkJPSBTRExLX2M7CisgIGtleW1hcFsweDRmXQkJPSBTRExLX3Y7CisgIGtleW1hcFsweDUwXQkJPSBTRExLX2I7CisgIGtleW1hcFsweDUxXQkJPSBTRExLX247CisgIGtleW1hcFsweDUyXQkJPSBTRExLX207CisgIGtleW1hcFsweDUzXQkJPSBTRExLX0NPTU1BOworICBrZXltYXBbMHg1NF0JCT0gU0RMS19QRVJJT0Q7CisgIGtleW1hcFsweDU1XQkJPSBTRExLX1NMQVNIOworICBrZXltYXBbMHg1Nl0JCT0gU0RMS19SU0hJRlQ7CisgIGtleW1hcFsweDU3XQkJPSBTRExLX1VQOworICBrZXltYXBbMHg1OF0JCT0gU0RMS19LUDE7CisgIGtleW1hcFsweDU5XQkJPSBTRExLX0tQMjsKKyAga2V5bWFwWzB4NWFdCQk9IFNETEtfS1AzOworICBrZXltYXBbMHg1Yl0JCT0gU0RMS19LUF9FTlRFUjsKKyAgLy9rZXltYXBbMHg1Y10JCT0gU0RMS19MQ1RSTDsKKyAgLy9rZXltYXBbMHg1ZF0JCT0gU0RMS19MQUxUOworICBrZXltYXBbMHg1ZV0JCT0gU0RMS19TUEFDRTsKKyAgLy9rZXltYXBbMHg1Zl0JCT0gU0RMS19SQUxUOworICAvL2tleW1hcFsweDYwXQkJPSBTRExLX1JDVFJMOworICBrZXltYXBbMHg2MV0JCT0gU0RMS19MRUZUOworICBrZXltYXBbMHg2Ml0JCT0gU0RMS19ET1dOOworICBrZXltYXBbMHg2M10JCT0gU0RMS19SSUdIVDsKKyAga2V5bWFwWzB4NjRdCQk9IFNETEtfS1AwOworICBrZXltYXBbMHg2NV0JCT0gU0RMS19LUF9QRVJJT0Q7CisgIC8va2V5bWFwWzB4NjZdCQk9IFNETEtfTE1FVEE7CisgIC8va2V5bWFwWzB4NjddCQk9IFNETEtfUk1FVEE7CisgIC8va2V5bWFwWzB4NjhdCQk9IFNETEtfTUVOVTsKKyAga2V5bWFwWzB4NjldCQk9IFNETEtfRVVSTzsKKyAga2V5bWFwWzB4NmFdCQk9IFNETEtfS1BfRVFVQUxTOworICBrZXltYXBbMHg2Yl0JCT0gU0RMS19QT1dFUjsKKyNlbmRpZgorfQorCit9OyAvKiBFeHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX3N5c2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTI2NzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX3N5c2V2ZW50c19jLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAorICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQorKi8KKworZXh0ZXJuIHZvaWQgUVRfSW5pdE9TS2V5bWFwKF9USElTKTsKK2V4dGVybiB2b2lkIFFUX1B1bXBFdmVudHMoX1RISVMpOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX3N5c21vdXNlLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX3N5c21vdXNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjU1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzbW91c2UuY2MKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfUVdpbi5oIgorCitleHRlcm4gIkMiIHsKKworI2luY2x1ZGUgIlNETF9zeXNtb3VzZV9jLmgiCisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLworc3RydWN0IFdNY3Vyc29yIHsKKwljaGFyICpiaXRzOworfTsKK1dNY3Vyc29yICpRVF9DcmVhdGVXTUN1cnNvcihfVEhJUywKKwkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KQoreworICBzdGF0aWMgV01jdXJzb3IgZHVtbXk7CisgIGR1bW15LmJpdHMgPSAwOworICByZXR1cm4gJmR1bW15OworfQorCitpbnQgUVRfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQoreworICByZXR1cm4gMTsKK30KKwordm9pZCBRVF9GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCit7Cit9CisKK3ZvaWQgUVRfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCit7CisgIFNETF9XaW4tPnNldE1vdXNlUG9zKFFQb2ludCh4LCB5KSk7Cit9CisKK307IC8qIEV4dGVybiBDICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX3N5c21vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGU0Y2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX3N5c21vdXNlX2MuaApAQCAtMCwwICsxLDMyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgorCisvKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KK2V4dGVybiB2b2lkIFFUX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gV01jdXJzb3IgKlFUX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAorCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOworZXh0ZXJuIGludCBRVF9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworZXh0ZXJuIHZvaWQgUVRfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpOworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzdmlkZW8uY2MgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzdmlkZW8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwNzg3NAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXN2aWRlby5jYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFF0b3BpYSBiYXNlZCBmcmFtZWJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxxYXBwbGljYXRpb24uaD4KKyNpbmNsdWRlIDxxcGUvcXBlYXBwbGljYXRpb24uaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorCisjaW5jbHVkZSAiU0RMX1FXaW4uaCIKKworZXh0ZXJuICJDIiB7CisKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3N5c2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3N5c21vdXNlX2MuaCIKKyNpbmNsdWRlICJTRExfc3lzd21fYy5oIgorI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgorCisgIC8vI2RlZmluZSBRVE9QSUFfREVCVUcKKyNkZWZpbmUgUVRfSElEREVOX1NJWkUJMzIJLyogc3RhcnRpbmcgaGlkZGVuIHdpbmRvdyBzaXplICovCisKKyAgLyogTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdXNlZCB0byBpbnZlcnQgdGhlIHNjcmVlbiByb3RhdGlvbiBvciBub3Q6CisgICAgIFBvc3NpYmxlIHZhbHVlczoKKyAgICAgIT0wIDogU2NyZWVuIGlzIDI3MLAgcm90YXRlZAorICAgICAwOiBTY3JlZW4gaXMgOTCwIHJvdGF0ZWQqLworI2RlZmluZSBTRExfUVRfUk9UQVRJT05fRU5WX05BTUUgIlNETF9RVF9JTlZFUlRfUk9UQVRJT04iCisgIAorICAvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KKyAgc3RhdGljIGludCBRVF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CisgIHN0YXRpYyBTRExfUmVjdCAqKlFUX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CisgIHN0YXRpYyBTRExfU3VyZmFjZSAqUVRfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOworICBzdGF0aWMgdm9pZCBRVF9VcGRhdGVNb3VzZShfVEhJUyk7CisgIHN0YXRpYyBpbnQgUVRfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKKyAgc3RhdGljIHZvaWQgUVRfVmlkZW9RdWl0KF9USElTKTsKKworICAvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworICBzdGF0aWMgaW50IFFUX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisgIHN0YXRpYyBpbnQgUVRfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworICBzdGF0aWMgdm9pZCBRVF9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKKyAgc3RhdGljIHZvaWQgUVRfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisgIHN0YXRpYyBpbnQgUVRfVG9nZ2xlRnVsbFNjcmVlbihfVEhJUywgaW50IGZ1bGxzY3JlZW4pOworCisgIHN0YXRpYyBpbnQgUVRfSWNvbmlmeVdpbmRvdyhfVEhJUyk7CisgIHN0YXRpYyBTRExfR3JhYk1vZGUgUVRfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7CisKKyAgLyogRkIgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworICBzdGF0aWMgaW50IFFUX0F2YWlsYWJsZSh2b2lkKQorICB7CisgICAgcmV0dXJuKDEpOworICB9CisKKyAgc3RhdGljIHZvaWQgUVRfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQorICB7CisgICAgU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworICAgIFNETF9mcmVlKGRldmljZSk7CisgIH0KKworICBzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpRVF9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQorICB7CisgICAgU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7CisKKyAgICAvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworICAgIGRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKyAgICBpZiAoIGRldmljZSApIHsKKyAgICAgIFNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKKyAgICAgIGRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKyAgICB9CisgICAgaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKKyAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgaWYgKCBkZXZpY2UgKSB7CisJU0RMX2ZyZWUoZGV2aWNlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKworICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBkZXZpY2UtPlZpZGVvSW5pdCA9IFFUX1ZpZGVvSW5pdDsKKyAgICBkZXZpY2UtPkxpc3RNb2RlcyA9IFFUX0xpc3RNb2RlczsKKyAgICBkZXZpY2UtPlNldFZpZGVvTW9kZSA9IFFUX1NldFZpZGVvTW9kZTsKKyAgICBkZXZpY2UtPlVwZGF0ZU1vdXNlID0gUVRfVXBkYXRlTW91c2U7CisgICAgZGV2aWNlLT5TZXRDb2xvcnMgPSBRVF9TZXRDb2xvcnM7CisgICAgZGV2aWNlLT5VcGRhdGVSZWN0cyA9IE5VTEw7CisgICAgZGV2aWNlLT5WaWRlb1F1aXQgPSBRVF9WaWRlb1F1aXQ7CisgICAgZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IFFUX0FsbG9jSFdTdXJmYWNlOworICAgIGRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOworICAgIGRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7CisgICAgZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKyAgICBkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOworICAgIGRldmljZS0+TG9ja0hXU3VyZmFjZSA9IFFUX0xvY2tIV1N1cmZhY2U7CisgICAgZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBRVF9VbmxvY2tIV1N1cmZhY2U7CisgICAgZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gTlVMTDsKKyAgICBkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBRVF9GcmVlSFdTdXJmYWNlOworICAgIGRldmljZS0+U2V0SWNvbiA9IE5VTEw7CisgICAgZGV2aWNlLT5TZXRDYXB0aW9uID0gUVRfU2V0V01DYXB0aW9uOworICAgIGRldmljZS0+SWNvbmlmeVdpbmRvdyA9IFFUX0ljb25pZnlXaW5kb3c7CisgICAgZGV2aWNlLT5HcmFiSW5wdXQgPSBRVF9HcmFiSW5wdXQ7CisgICAgZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOworICAgIGRldmljZS0+RnJlZVdNQ3Vyc29yID0gUVRfRnJlZVdNQ3Vyc29yOworICAgIGRldmljZS0+Q3JlYXRlV01DdXJzb3IgPSBRVF9DcmVhdGVXTUN1cnNvcjsKKyAgICBkZXZpY2UtPlNob3dXTUN1cnNvciA9IFFUX1Nob3dXTUN1cnNvcjsKKyAgICBkZXZpY2UtPldhcnBXTUN1cnNvciA9IFFUX1dhcnBXTUN1cnNvcjsKKyAgICBkZXZpY2UtPkluaXRPU0tleW1hcCA9IFFUX0luaXRPU0tleW1hcDsKKyAgICBkZXZpY2UtPlB1bXBFdmVudHMgPSBRVF9QdW1wRXZlbnRzOworCisgICAgZGV2aWNlLT5mcmVlID0gUVRfRGVsZXRlRGV2aWNlOworICAgIGRldmljZS0+VG9nZ2xlRnVsbFNjcmVlbiA9IFFUX1RvZ2dsZUZ1bGxTY3JlZW47CisKKyAgICAvKiBTZXQgdGhlIGRyaXZlciBmbGFncyAqLworICAgIGRldmljZS0+aGFuZGxlc19hbnlfc2l6ZSA9IDA7CisJCisgICAgcmV0dXJuIGRldmljZTsKKyAgfQorCisgIFZpZGVvQm9vdFN0cmFwIFF0b3BpYV9ib290c3RyYXAgPSB7CisgICAgInF0b3BpYSIsICJRdG9waWEgLyBRUEUgZ3JhcGhpY3MiLAorICAgIFFUX0F2YWlsYWJsZSwgUVRfQ3JlYXRlRGV2aWNlCisgIH07CisKKyAgLyogRnVuY3Rpb24gdG8gc29ydCB0aGUgZGlzcGxheV9saXN0ICovCisgIHN0YXRpYyBpbnQgQ29tcGFyZU1vZGVzKGNvbnN0IHZvaWQgKkEsIGNvbnN0IHZvaWQgKkIpCisgIHsKKyNpZiAwCisgICAgY29uc3QgZGlzcGxheV9tb2RlICphID0gKGRpc3BsYXlfbW9kZSAqKUE7CisgICAgY29uc3QgZGlzcGxheV9tb2RlICpiID0gKGRpc3BsYXlfbW9kZSAqKUI7CisKKyAgICBpZiAoIGEtPnNwYWNlID09IGItPnNwYWNlICkgeworICAgICAgcmV0dXJuKChiLT52aXJ0dWFsX3dpZHRoKmItPnZpcnR1YWxfaGVpZ2h0KS0KKwkgICAgIChhLT52aXJ0dWFsX3dpZHRoKmEtPnZpcnR1YWxfaGVpZ2h0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybihDb2xvclNwYWNlVG9CaXRzUGVyUGl4ZWwoYi0+c3BhY2UpLQorCSAgICAgQ29sb3JTcGFjZVRvQml0c1BlclBpeGVsKGEtPnNwYWNlKSk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBZZXMsIHRoaXMgaXNuJ3QgdGhlIGZhc3Rlc3QgaXQgY291bGQgYmUsIGJ1dCBpdCB3b3JrcyBuaWNlbHkgKi8KKyAgc3RhdGljIGludCBRVF9BZGRNb2RlKF9USElTLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCB3LCB1bnNpZ25lZCBpbnQgaCkKKyAgeworICAgIFNETF9SZWN0ICptb2RlOworICAgIGludCBpOworICAgIGludCBuZXh0X21vZGU7CisKKyAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbW9kZSAqLworICAgIGlmICggU0RMX251bW1vZGVzW2luZGV4XSA+IDAgKSB7CisgICAgICBmb3IgKCBpPVNETF9udW1tb2Rlc1tpbmRleF0tMTsgaSA+PSAwOyAtLWkgKSB7CisJbW9kZSA9IFNETF9tb2RlbGlzdFtpbmRleF1baV07CisJaWYgKCAobW9kZS0+dyA9PSB3KSAmJiAobW9kZS0+aCA9PSBoKSApIHsKKwkgIHJldHVybigwKTsKKwl9CisgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHVwIHRoZSBuZXcgdmlkZW8gbW9kZSByZWN0YW5nbGUgKi8KKyAgICBtb2RlID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YgKm1vZGUpOworICAgIGlmICggbW9kZSA9PSBOVUxMICkgeworICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBtb2RlLT54ID0gMDsKKyAgICBtb2RlLT55ID0gMDsKKyAgICBtb2RlLT53ID0gdzsKKyAgICBtb2RlLT5oID0gaDsKKyNpZmRlZiBRVE9QSUFfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFkZGluZyBtb2RlICVkeCVkIGF0ICVkIGJ5dGVzIHBlciBwaXhlbFxuIiwgdywgaCwgaW5kZXgrMSk7CisjZW5kaWYKKworICAgIC8qIEFsbG9jYXRlIHRoZSBuZXcgbGlzdCBvZiBtb2RlcywgYW5kIGZpbGwgaW4gdGhlIG5ldyBtb2RlICovCisgICAgbmV4dF9tb2RlID0gU0RMX251bW1vZGVzW2luZGV4XTsKKyAgICBTRExfbW9kZWxpc3RbaW5kZXhdID0gKFNETF9SZWN0ICoqKQorICAgICAgU0RMX3JlYWxsb2MoU0RMX21vZGVsaXN0W2luZGV4XSwgKDErbmV4dF9tb2RlKzEpKnNpemVvZihTRExfUmVjdCAqKSk7CisgICAgaWYgKCBTRExfbW9kZWxpc3RbaW5kZXhdID09IE5VTEwgKSB7CisgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgIFNETF9udW1tb2Rlc1tpbmRleF0gPSAwOworICAgICAgU0RMX2ZyZWUobW9kZSk7CisgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBTRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZV0gPSBtb2RlOworICAgIFNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlKzFdID0gTlVMTDsKKyAgICBTRExfbnVtbW9kZXNbaW5kZXhdKys7CisKKyAgICByZXR1cm4oMCk7CisgIH0KKworICBpbnQgUVRfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCisgIHsKKyAgICAvKiBJbml0aWFsaXplIHRoZSBRUEUgQXBwbGljYXRpb24gICovCisgICAgIC8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICovCisgICAgdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gUVBpeG1hcDo6ZGVmYXVsdERlcHRoKCk7CisKKyAgICAvLyBGb3Igbm93IHdlIGhhcmRjb2RlIHRoZSBjdXJyZW50IGRlcHRoIGJlY2F1c2UgYW55dGhpbmcgZWxzZQorICAgIC8vIG1pZ2h0IGFzIHdlbGwgYmUgZW11bGF0ZWQgYnkgU0RMIHJhdGhlciB0aGFuIGJ5IFF0b3BpYS4KKyAgICAKKyAgICBRU2l6ZSBkZXNrdG9wX3NpemUgPSBxQXBwLT5kZXNrdG9wKCktPnNpemUoKTsKKyAgICBRVF9BZGRNb2RlKF90aGlzLCAoKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xLAorCSAgICAgICBkZXNrdG9wX3NpemUud2lkdGgoKSwgZGVza3RvcF9zaXplLmhlaWdodCgpKTsKKyAgICBRVF9BZGRNb2RlKF90aGlzLCAoKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xLAorCSAgICAgICBkZXNrdG9wX3NpemUuaGVpZ2h0KCksIGRlc2t0b3Bfc2l6ZS53aWR0aCgpKTsKKworICAgIC8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLworICAgIF90aGlzLT5pbmZvLmN1cnJlbnRfdyA9IGRlc2t0b3Bfc2l6ZS53aWR0aCgpOworICAgIF90aGlzLT5pbmZvLmN1cnJlbnRfaCA9IGRlc2t0b3Bfc2l6ZS5oZWlnaHQoKTsKKworICAgIC8qIENyZWF0ZSB0aGUgd2luZG93IC8gd2lkZ2V0ICovCisgICAgU0RMX1dpbiA9IG5ldyBTRExfUVdpbihRU2l6ZShRVF9ISURERU5fU0laRSwgUVRfSElEREVOX1NJWkUpKTsKKyAgICAoKFFQRUFwcGxpY2F0aW9uKilxQXBwKS0+c2hvd01haW5XaWRnZXQoU0RMX1dpbik7CisgICAgLyogRmlsbCBpbiBzb21lIHdpbmRvdyBtYW5hZ2VyIGNhcGFiaWxpdGllcyAqLworICAgIF90aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDA7CisKKyAgICAvKiBXZSdyZSBkb25lISAqLworICAgIHJldHVybigwKTsKKyAgfQorCisgIC8qIFdlIHN1cHBvcnQgYW55IGRpbWVuc2lvbiBhdCBvdXIgYml0LWRlcHRoICovCisgIFNETF9SZWN0ICoqUVRfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQorICB7CisgICAgU0RMX1JlY3QgKiptb2RlczsKKworICAgIG1vZGVzID0gKChTRExfUmVjdCAqKikwKTsKKyAgICBpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKKyAgICAgIG1vZGVzID0gU0RMX21vZGVsaXN0WygoZm9ybWF0LT5CaXRzUGVyUGl4ZWwrNykvOCktMV07CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICggZm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0KKwkgICBfdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCApIHsKKwltb2RlcyA9ICgoU0RMX1JlY3QgKiopLTEpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4obW9kZXMpOworICB9CisKKyAgLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KKyAgc3RhdGljIHZvaWQgUVRfTm9ybWFsVXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKKworICBzdGF0aWMgaW50IFFUX1NldEZ1bGxTY3JlZW4oX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4sIGludCBmdWxsc2NyZWVuKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgc3RhdGljIGludCBRVF9Ub2dnbGVGdWxsU2NyZWVuKF9USElTLCBpbnQgZnVsbHNjcmVlbikKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIEZJWE1FOiBjaGVjayByZXR1cm4gdmFsdWVzIGFuZCBjbGVhbnVwIGhlcmUgKi8KKyAgU0RMX1N1cmZhY2UgKlFUX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisJCQkgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCisgIHsKKworICAgIFFJbWFnZSAqcWltYWdlOworICAgIFFTaXplIGRlc2t0b3Bfc2l6ZSA9IHFBcHAtPmRlc2t0b3AoKS0+c2l6ZSgpOworCisgICAgCisgICAgY3VycmVudC0+ZmxhZ3MgPSAwOyAvL1NETF9GVUxMU0NSRUVOOyAvLyBXZSBhbHdheXMgcnVuIGZ1bGxzY3JlZW4uCisKKyAgICBpZih3aWR0aCA8PSBkZXNrdG9wX3NpemUud2lkdGgoKQorCSAgICAgICYmIGhlaWdodCA8PSBkZXNrdG9wX3NpemUuaGVpZ2h0KCkpIHsKKyAgICAgIGN1cnJlbnQtPncgPSBkZXNrdG9wX3NpemUud2lkdGgoKTsKKyAgICAgIGN1cnJlbnQtPmggPSBkZXNrdG9wX3NpemUuaGVpZ2h0KCk7CisgICAgfSBlbHNlIGlmKHdpZHRoIDw9IGRlc2t0b3Bfc2l6ZS5oZWlnaHQoKSAmJiBoZWlnaHQgPD0gZGVza3RvcF9zaXplLndpZHRoKCkpIHsKKyAgICAgIC8vIExhbmRzY2FwZSBtb2RlCisgICAgICBjaGFyICogZW52U3RyaW5nID0gU0RMX2dldGVudihTRExfUVRfUk9UQVRJT05fRU5WX05BTUUpOworICAgICAgaW50IGVudlZhbHVlID0gZW52U3RyaW5nID8gYXRvaShlbnZTdHJpbmcpIDogMDsKKyAgICAgIHNjcmVlblJvdGF0aW9uID0gZW52VmFsdWUgPyBTRExfUVRfUk9UQVRJT05fMjcwIDogU0RMX1FUX1JPVEFUSU9OXzkwOworICAgICAgY3VycmVudC0+aCA9IGRlc2t0b3Bfc2l6ZS53aWR0aCgpOworICAgICAgY3VycmVudC0+dyA9IGRlc2t0b3Bfc2l6ZS5oZWlnaHQoKTsKKyAgICB9IGVsc2UgeworICAgICAgU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCByZXNvbHV0aW9uLCAlZHglZFxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorICAgIGlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgeworICAgICAgU0RMX1NldEVycm9yKCJPcGVuR0wgbm90IHN1cHBvcnRlZCIpOworICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0gCisgICAgLyogQ3JlYXRlIHRoZSBRSW1hZ2UgZnJhbWVidWZmZXIgKi8KKyAgICBxaW1hZ2UgPSBuZXcgUUltYWdlKGN1cnJlbnQtPncsIGN1cnJlbnQtPmgsIGJwcCk7CisgICAgaWYgKHFpbWFnZS0+aXNOdWxsKCkpIHsKKyAgICAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNjcmVlbiBiaXRtYXAiKTsKKyAgICAgIGRlbGV0ZSBxaW1hZ2U7CisgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGN1cnJlbnQtPnBpdGNoID0gcWltYWdlLT5ieXRlc1BlckxpbmUoKTsKKyAgICBjdXJyZW50LT5waXhlbHMgPSAodm9pZCAqKXFpbWFnZS0+Yml0cygpOworICAgIFNETF9XaW4tPnNldEltYWdlKHFpbWFnZSk7CisgICAgX3RoaXMtPlVwZGF0ZVJlY3RzID0gUVRfTm9ybWFsVXBkYXRlOworICAgIFNETF9XaW4tPnNldEZ1bGxzY3JlZW4odHJ1ZSk7CisgICAgLyogV2UncmUgZG9uZSAqLworICAgIHJldHVybihjdXJyZW50KTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgY3VycmVudCBtb3VzZSBzdGF0ZSBhbmQgcG9zaXRpb24gKi8KKyAgdm9pZCBRVF9VcGRhdGVNb3VzZShfVEhJUykKKyAgeworICAgIFFQb2ludCBwb2ludCgtMSwgLTEpOworICAgIGlmICggU0RMX1dpbi0+aXNBY3RpdmVXaW5kb3coKSApIHsKKyAgICAgIHBvaW50ID0gU0RMX1dpbi0+bW91c2VQb3MoKTsKKyAgICB9CisgICAgCisgICAgaWYgKCAocG9pbnQueCgpID49IDApICYmIChwb2ludC54KCkgPCBTRExfVmlkZW9TdXJmYWNlLT53KSAmJgorCSAocG9pbnQueSgpID49IDApICYmIChwb2ludC55KCkgPCBTRExfVmlkZW9TdXJmYWNlLT5oKSApIHsKKyAgICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBNT1VTRUZPQ1VTKTsKKyAgICAgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwKKwkJCSAgICAgKFNpbnQxNilwb2ludC54KCksIChTaW50MTYpcG9pbnQueSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOworICAgIH0KKyAgfQorCisgIC8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCisgIHN0YXRpYyBpbnQgUVRfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQorICB7CisgICAgcmV0dXJuKC0xKTsKKyAgfQorICBzdGF0aWMgdm9pZCBRVF9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKKyAgeworICAgIHJldHVybjsKKyAgfQorICBzdGF0aWMgaW50IFFUX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQorICB7CisgICAgcmV0dXJuKDApOworICB9CisgIHN0YXRpYyB2b2lkIFFUX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCisgIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdGF0aWMgdm9pZCBRVF9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQorICB7CisgICAgaWYoU0RMX1dpbi0+bG9ja1NjcmVlbigpKSB7CisgICAgICBmb3IoaW50IGk9MDsgaTxudW1yZWN0czsgKytpICkgeworCVFSZWN0IHJlY3QocmVjdHNbaV0ueCwgcmVjdHNbaV0ueSwKKwkJICAgcmVjdHNbaV0udywgcmVjdHNbaV0uaCk7CisJU0RMX1dpbi0+cmVwYWludFJlY3QocmVjdCk7CisgICAgICB9CisgICAgICBTRExfV2luLT51bmxvY2tTY3JlZW4oKTsKKyAgICB9CisgIH0KKyAgLyogSXMgdGhlIHN5c3RlbSBwYWxldHRlIHNldHRhYmxlPyAqLworICBpbnQgUVRfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgdm9pZCBRVF9WaWRlb1F1aXQoX1RISVMpCisgIHsKKyAgICAvLyBUaGlzIGlzIGR1bWIsIGJ1dCBpZiBJIGZyZWUgdGhpcywgdGhlIGFwcCBkb2Vzbid0IGV4aXQgY29ycmVjdGx5LgorICAgIC8vIE9mIGNvdXJzZSwgdGhpcyB3aWxsIGxlYWsgbWVtb3J5IGlmIGluaXQgdmlkZW8gaXMgZG9uZSBtb3JlIHRoYW4gb25jZS4KKyAgICAvLyBTdWNrcyBidXQgc3VjaCBpcyBsaWZlLgorICAgIAorICAgIC8vICAgIC0tIERhdmlkIEhlZGJvcgorICAgIC8vICAgIGRlbGV0ZSBTRExfV2luOyAKKyAgICAvLyAgICBTRExfV2luID0gMDsKKyAgICBfdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOworICAgIFFUX0dyYWJJbnB1dChfdGhpcywgU0RMX0dSQUJfT0ZGKTsKKyAgfQorCisgIHN0YXRpYyBpbnQgUVRfSWNvbmlmeVdpbmRvdyhfVEhJUykgeworICAgIFNETF9XaW4tPmhpZGUoKTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN0YXRpYyBTRExfR3JhYk1vZGUgUVRfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSkgeworICAgIGlmKG1vZGUgPT0gU0RMX0dSQUJfT0ZGKSB7CisgICAgICBRUEVBcHBsaWNhdGlvbjo6Z3JhYktleWJvYXJkKCk7CisgICAgICBxQXBwLT5wcm9jZXNzRXZlbnRzKCk7CisgICAgICBRUEVBcHBsaWNhdGlvbjo6dW5ncmFiS2V5Ym9hcmQoKTsKKyAgICB9IGVsc2UgeworICAgICAgUVBFQXBwbGljYXRpb246OmdyYWJLZXlib2FyZCgpOworICAgIH0KKyAgICBxQXBwLT5wcm9jZXNzRXZlbnRzKCk7CisgICAgcmV0dXJuIG1vZGU7CisgIH0KKyAgCit9OyAvKiBFeHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX3N5c3dtLmNjIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdG9waWEvU0RMX3N5c3dtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Zjk4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzd20uY2MKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfUVdpbi5oIgorCitleHRlcm4gIkMiIHsKKworI2luY2x1ZGUgIlNETF9zeXN3bV9jLmgiCisKK3ZvaWQgUVRfU2V0V01DYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKK3sKKwlTRExfV2luLT5zZXRDYXB0aW9uKHRpdGxlKTsKK30KKworfTsgLyogRXh0ZXJuIEMgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXRvcGlhL1NETF9zeXN3bV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzd21fYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDMyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F0b3BpYS9TRExfc3lzd21fYy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX2xvd3ZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgUVRfU2V0V01DYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L0NHUy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdWFydHovQ0dTLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlNDdmNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L0NHUy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogCisgICAgT2JzY3VyaW5nIGNvZGU6IG1heGltdW0gbnVtYmVyIG9mIHdpbmRvd3MgYWJvdmUgb3VycyAoaW5jbHVzaXZlKSAKKyAgICAKKyAgICBOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayB0b28gd2VsbCBpbiBwcmFjdGljZSBhbmQgc2hvdWxkIGJlCisgICAgcGhhc2VkIG91dCB3aGVuIHdlIGFkZCBPcGVuR0wgMkQgYWNjZWxlcmF0aW9uLiBJdCB3YXMgbmV2ZXIKKyAgICBlbmFibGVkIGluIHRoZSBmaXJzdCBwbGFjZSwgc28gdGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIDstKQorKi8KKyNkZWZpbmUga01heFdpbmRvd3MgMjU2CisKKy8qIFNvbWUgb2YgdGhlIENvcmUgR3JhcGhpY3MgU2VydmVyIEFQSSBmb3Igb2JzY3VyaW5nIGNvZGUgKi8KKyNkZWZpbmUga0NHU1dpbmRvd0xldmVsVG9wICAgICAgICAgIDIxNDc0ODM2MzIKKyNkZWZpbmUga0NHU1dpbmRvd0xldmVsRG9ja0ljb25EcmFnIDUwMAorI2RlZmluZSBrQ0dTV2luZG93TGV2ZWxEb2NrTWVudSAgICAgMTAxCisjZGVmaW5lIGtDR1NXaW5kb3dMZXZlbE1lbnVJZ25vcmUgICAgMjEKKyNkZWZpbmUga0NHU1dpbmRvd0xldmVsTWVudSAgICAgICAgICAyMAorI2RlZmluZSBrQ0dTV2luZG93TGV2ZWxEb2NrTGFiZWwgICAgIDEyCisjZGVmaW5lIGtDR1NXaW5kb3dMZXZlbERvY2tJY29uICAgICAgMTEKKyNkZWZpbmUga0NHU1dpbmRvd0xldmVsRG9jayAgICAgICAgICAxMAorI2RlZmluZSBrQ0dTV2luZG93TGV2ZWxVdGlsaXR5ICAgICAgICAzCisjZGVmaW5lIGtDR1NXaW5kb3dMZXZlbE5vcm1hbCAgICAgICAgIDAKKworLyogCisgICAgRm9yIGNvbXBsZXRlbmVzczsgV2UgbmV2ZXIgdXNlIHRoZXNlIHdpbmRvdyBsZXZlbHMsIHRoZXkgYXJlIGFsd2F5cyBiZWxvdyB1cworICAgICNkZWZpbmUga0NHU1dpbmRvd0xldmVsTUJhclNoYWRvdyAtMjAKKyAgICAjZGVmaW5lIGtDR1NXaW5kb3dMZXZlbERlc2t0b3BQaWN0dXJlIC0yMTQ3NDgzNjQ3CisgICAgI2RlZmluZSBrQ0dTV2luZG93TGV2ZWxEZXNrdG9wICAgICAgICAtMjE0NzQ4MzY0OAorKi8KKwordHlwZWRlZiBDR0Vycm9yICAgICAgIENHU0Vycm9yOwordHlwZWRlZiBsb25nICAgICAgICAgIENHU1dpbmRvd0NvdW50OwordHlwZWRlZiB2b2lkICogICAgICAgIENHU0Nvbm5lY3Rpb25JRDsKK3R5cGVkZWYgaW50ICAgICAgICAgICBDR1NXaW5kb3dJRDsKK3R5cGVkZWYgQ0dTV2luZG93SUQqICBDR1NXaW5kb3dJRExpc3Q7Cit0eXBlZGVmIENHV2luZG93TGV2ZWwgQ0dTV2luZG93TGV2ZWw7Cit0eXBlZGVmIE5TUmVjdCAgICAgICAgQ0dTUmVjdDsKKworZXh0ZXJuIENHU0Nvbm5lY3Rpb25JRCBfQ0dTRGVmYXVsdENvbm5lY3Rpb24gKCk7CisKK2V4dGVybiBDR1NFcnJvciBDR1NHZXRPblNjcmVlbldpbmRvd0xpc3QgKENHU0Nvbm5lY3Rpb25JRCBjaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NDb25uZWN0aW9uSUQgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NXaW5kb3dDb3VudCBsaXN0Q2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NXaW5kb3dJRExpc3QgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHU1dpbmRvd0NvdW50ICpsaXN0Q291bnQpOworCitleHRlcm4gQ0dTRXJyb3IgQ0dTR2V0U2NyZWVuUmVjdEZvcldpbmRvdyAoQ0dTQ29ubmVjdGlvbklEIGNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NXaW5kb3dJRCB3aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dTUmVjdCAqcmVjdCk7CisKK2V4dGVybiBDR1dpbmRvd0xldmVsIENHU0dldFdpbmRvd0xldmVsIChDR1NDb25uZWN0aW9uSUQgY2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHU1dpbmRvd0lEIHdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NXaW5kb3dMZXZlbCAqbGV2ZWwpOworCitleHRlcm4gQ0dTRXJyb3IgQ0dTRGlzcGxheUhXRmlsbCAoQ0dEaXJlY3REaXNwbGF5SUQgaWQsIHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgsIHVuc2lnbmVkIGludCBjb2xvcik7CisKK2V4dGVybiBDR1NFcnJvciBDR1NEaXNwbGF5Q2FuSFdGaWxsIChDR0RpcmVjdERpc3BsYXlJRCBpZCk7CisKK2V4dGVybiBDR1NFcnJvciBDR1NHZXRNb3VzZUVuYWJsZWRGbGFncyAoQ0dTQ29ubmVjdGlvbklEIGNpZCwgQ0dTV2luZG93SUQgd2lkLCBpbnQgKmZsYWdzKTsKKworaW50IENHU0Rpc3BsYXlIV1N5bmMgKENHRGlyZWN0RGlzcGxheUlEIGlkKTsKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0ekV2ZW50cy5tIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0ekV2ZW50cy5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3M2ViMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6RXZlbnRzLm0KQEAgLTAsMCArMSwxMDYzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyICBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfUXVhcnR6VmlkZW8uaCIKKyNpbmNsdWRlICJTRExfUXVhcnR6V00uaCIKKworI2luY2x1ZGUgPElPS2l0L0lPTWVzc2FnZS5oPiAvKiBGb3Igd2FrZSBmcm9tIHNsZWVwIGRldGVjdGlvbiAqLworI2luY2x1ZGUgPElPS2l0L3B3cl9tZ3QvSU9QTUxpYi5oPiAvKiBGb3Igd2FrZSBmcm9tIHNsZWVwIGRldGVjdGlvbiAqLworI2luY2x1ZGUgIlNETF9RdWFydHpLZXlzLmgiCisKKy8qCisgKiBPbiBMZW9wYXJkLCB0aGlzIGlzIG1pc3NpbmcgZnJvbSB0aGUgNjQtYml0IGhlYWRlcnMKKyAqLworI2lmIGRlZmluZWQoX19MUDY0X18pICYmICFkZWZpbmVkKF9fUE9XRVJfXykKKy8qCisgKiBXb3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiB0aGUgMTAuNSBTREs6IEJ5IGFjY2lkZW50LCBPU1NlcnZpY2UuaCBkb2VzCisgKiBub3QgaW5jbHVkZSBQb3dlci5oIGF0IGFsbCB3aGVuIGNvbXBpbGluZyBpbiA2NGJpdCBtb2RlLiBUaGlzIGhhcworICogYmVlbiBmaXhlZCBpbiAxMC42LCBidXQgZm9yIDEwLjUsIHdlIG1hbnVhbGx5IGRlZmluZSBVc3JBY3Rpdml0eQorICogdG8gZW5zdXJlIGNvbXBpbGF0aW9uIHdvcmtzLgorICovCisjZGVmaW5lIFVzckFjdGl2aXR5IDEKKyNlbmRpZgorCisvKiAKKyAqIEluIFBhbnRoZXIsIHRoaXMgaGVhZGVyIGRlZmluZXMgZGV2aWNlIGRlcGVuZGVudCBtYXNrcyBmb3IgCisgKiByaWdodCBzaWRlIGtleXMuIFRoZXNlIGRlZmluaXRpb25zIG9ubHkgZXhpc3QgaW4gUGFudGhlciwgYnV0CisgKiB0aGUgaGVhZGVyIHNlZW1zIHRvIGV4aXN0IGF0IGxlYXN0IGluIEphZ3VhciBhbmQgcHJvYmFibHkgZWFybGllcgorICogdmVyc2lvbnMgb2YgdGhlIE9TLCBzbyB0aGlzIHNob3VsZCd0IGJyZWFrIGFueXRoaW5nLgorICovCisjaW5jbHVkZSA8SU9LaXQvaGlkc3lzdGVtL0lPTExFdmVudC5oPgorLyogCisgKiBUaGVzZSBhcmUgbm90IGRlZmluZWQgYmVmb3JlIFBhbnRoZXIuIFRvIGtlZXAgdGhlIGNvZGUgY29tcGlsaW5nCisgKiBvbiBzeXN0ZW1zIHdpdGhvdXQgdGhlc2UsIEkgd2lsbCBkZWZpbmUgaWYgdGhleSBkb24ndCBleGlzdC4KKyAqLworI2lmbmRlZiBOWF9ERVZJQ0VSQ1RMS0VZTUFTSworICAgICNkZWZpbmUgTlhfREVWSUNFTENUTEtFWU1BU0sgICAgMHgwMDAwMDAwMQorI2VuZGlmCisjaWZuZGVmIE5YX0RFVklDRUxTSElGVEtFWU1BU0sKKyAgICAjZGVmaW5lIE5YX0RFVklDRUxTSElGVEtFWU1BU0sgIDB4MDAwMDAwMDIKKyNlbmRpZgorI2lmbmRlZiBOWF9ERVZJQ0VSU0hJRlRLRVlNQVNLCisgICAgI2RlZmluZSBOWF9ERVZJQ0VSU0hJRlRLRVlNQVNLICAweDAwMDAwMDA0CisjZW5kaWYKKyNpZm5kZWYgTlhfREVWSUNFTENNREtFWU1BU0sKKyAgICAjZGVmaW5lIE5YX0RFVklDRUxDTURLRVlNQVNLICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorI2lmbmRlZiBOWF9ERVZJQ0VSQ01ES0VZTUFTSworICAgICNkZWZpbmUgTlhfREVWSUNFUkNNREtFWU1BU0sgICAgMHgwMDAwMDAxMAorI2VuZGlmCisjaWZuZGVmIE5YX0RFVklDRUxBTFRLRVlNQVNLCisgICAgI2RlZmluZSBOWF9ERVZJQ0VMQUxUS0VZTUFTSyAgICAweDAwMDAwMDIwCisjZW5kaWYKKyNpZm5kZWYgTlhfREVWSUNFUkFMVEtFWU1BU0sKKyAgICAjZGVmaW5lIE5YX0RFVklDRVJBTFRLRVlNQVNLICAgIDB4MDAwMDAwNDAKKyNlbmRpZgorI2lmbmRlZiBOWF9ERVZJQ0VSQ1RMS0VZTUFTSworICAgICNkZWZpbmUgTlhfREVWSUNFUkNUTEtFWU1BU0sgICAgMHgwMDAwMjAwMAorI2VuZGlmCisKK3ZvaWQgICAgIFFaX0luaXRPU0tleW1hcCAoX1RISVMpIHsKKyAgICBCT09MIHNhd19sYXlvdXQgPSBOTzsKKyAgICBVSW50MzIgc3RhdGU7CisgICAgVUludDMyIHZhbHVlOworICAgIFVpbnQxNiBpOworICAgIGludCB3b3JsZCA9IFNETEtfV09STERfMDsKKworICAgIGZvciAoIGk9MDsgaTxTRExfVEFCTEVTSVpFKGtleW1hcCk7ICsraSApCisgICAgICAgIGtleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKKworICAgIC8qIFRoaXMga2V5bWFwIGlzIGFsbW9zdCBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBPUyA5IG9uZSAqLworICAgIGtleW1hcFtRWl9FU0NBUEVdID0gU0RMS19FU0NBUEU7CisgICAga2V5bWFwW1FaX0YxXSA9IFNETEtfRjE7CisgICAga2V5bWFwW1FaX0YyXSA9IFNETEtfRjI7CisgICAga2V5bWFwW1FaX0YzXSA9IFNETEtfRjM7CisgICAga2V5bWFwW1FaX0Y0XSA9IFNETEtfRjQ7CisgICAga2V5bWFwW1FaX0Y1XSA9IFNETEtfRjU7CisgICAga2V5bWFwW1FaX0Y2XSA9IFNETEtfRjY7CisgICAga2V5bWFwW1FaX0Y3XSA9IFNETEtfRjc7CisgICAga2V5bWFwW1FaX0Y4XSA9IFNETEtfRjg7CisgICAga2V5bWFwW1FaX0Y5XSA9IFNETEtfRjk7CisgICAga2V5bWFwW1FaX0YxMF0gPSBTRExLX0YxMDsKKyAgICBrZXltYXBbUVpfRjExXSA9IFNETEtfRjExOworICAgIGtleW1hcFtRWl9GMTJdID0gU0RMS19GMTI7CisgICAga2V5bWFwW1FaX0YxM10gPSBTRExLX0YxMzsKKyAgICBrZXltYXBbUVpfRjE0XSA9IFNETEtfRjE0OworICAgIGtleW1hcFtRWl9GMTVdID0gU0RMS19GMTU7CisvKgorICAgIGtleW1hcFtRWl9QUklOVF0gPSBTRExLX1BSSU5UOworICAgIGtleW1hcFtRWl9TQ1JPTExPQ0tdID0gU0RMS19TQ1JPTExPQ0s7CisgICAga2V5bWFwW1FaX1BBVVNFXSA9IFNETEtfUEFVU0U7CisqLworICAgIGtleW1hcFtRWl9QT1dFUl0gPSBTRExLX1BPV0VSOworICAgIGtleW1hcFtRWl9CQUNLUVVPVEVdID0gU0RMS19CQUNLUVVPVEU7CisgICAga2V5bWFwW1FaXzFdID0gU0RMS18xOworICAgIGtleW1hcFtRWl8yXSA9IFNETEtfMjsKKyAgICBrZXltYXBbUVpfM10gPSBTRExLXzM7CisgICAga2V5bWFwW1FaXzRdID0gU0RMS180OworICAgIGtleW1hcFtRWl81XSA9IFNETEtfNTsKKyAgICBrZXltYXBbUVpfNl0gPSBTRExLXzY7CisgICAga2V5bWFwW1FaXzddID0gU0RMS183OworICAgIGtleW1hcFtRWl84XSA9IFNETEtfODsKKyAgICBrZXltYXBbUVpfOV0gPSBTRExLXzk7CisgICAga2V5bWFwW1FaXzBdID0gU0RMS18wOworICAgIGtleW1hcFtRWl9NSU5VU10gPSBTRExLX01JTlVTOworICAgIGtleW1hcFtRWl9FUVVBTFNdID0gU0RMS19FUVVBTFM7CisgICAga2V5bWFwW1FaX0JBQ0tTUEFDRV0gPSBTRExLX0JBQ0tTUEFDRTsKKyAgICBrZXltYXBbUVpfSU5TRVJUXSA9IFNETEtfSU5TRVJUOworICAgIGtleW1hcFtRWl9IT01FXSA9IFNETEtfSE9NRTsKKyAgICBrZXltYXBbUVpfUEFHRVVQXSA9IFNETEtfUEFHRVVQOworICAgIGtleW1hcFtRWl9OVU1MT0NLXSA9IFNETEtfTlVNTE9DSzsKKyAgICBrZXltYXBbUVpfS1BfRVFVQUxTXSA9IFNETEtfS1BfRVFVQUxTOworICAgIGtleW1hcFtRWl9LUF9ESVZJREVdID0gU0RMS19LUF9ESVZJREU7CisgICAga2V5bWFwW1FaX0tQX01VTFRJUExZXSA9IFNETEtfS1BfTVVMVElQTFk7CisgICAga2V5bWFwW1FaX1RBQl0gPSBTRExLX1RBQjsKKyAgICBrZXltYXBbUVpfcV0gPSBTRExLX3E7CisgICAga2V5bWFwW1FaX3ddID0gU0RMS193OworICAgIGtleW1hcFtRWl9lXSA9IFNETEtfZTsKKyAgICBrZXltYXBbUVpfcl0gPSBTRExLX3I7CisgICAga2V5bWFwW1FaX3RdID0gU0RMS190OworICAgIGtleW1hcFtRWl95XSA9IFNETEtfeTsKKyAgICBrZXltYXBbUVpfdV0gPSBTRExLX3U7CisgICAga2V5bWFwW1FaX2ldID0gU0RMS19pOworICAgIGtleW1hcFtRWl9vXSA9IFNETEtfbzsKKyAgICBrZXltYXBbUVpfcF0gPSBTRExLX3A7CisgICAga2V5bWFwW1FaX0xFRlRCUkFDS0VUXSA9IFNETEtfTEVGVEJSQUNLRVQ7CisgICAga2V5bWFwW1FaX1JJR0hUQlJBQ0tFVF0gPSBTRExLX1JJR0hUQlJBQ0tFVDsKKyAgICBrZXltYXBbUVpfQkFDS1NMQVNIXSA9IFNETEtfQkFDS1NMQVNIOworICAgIGtleW1hcFtRWl9ERUxFVEVdID0gU0RMS19ERUxFVEU7CisgICAga2V5bWFwW1FaX0VORF0gPSBTRExLX0VORDsKKyAgICBrZXltYXBbUVpfUEFHRURPV05dID0gU0RMS19QQUdFRE9XTjsKKyAgICBrZXltYXBbUVpfS1A3XSA9IFNETEtfS1A3OworICAgIGtleW1hcFtRWl9LUDhdID0gU0RMS19LUDg7CisgICAga2V5bWFwW1FaX0tQOV0gPSBTRExLX0tQOTsKKyAgICBrZXltYXBbUVpfS1BfTUlOVVNdID0gU0RMS19LUF9NSU5VUzsKKyAgICBrZXltYXBbUVpfQ0FQU0xPQ0tdID0gU0RMS19DQVBTTE9DSzsKKyAgICBrZXltYXBbUVpfYV0gPSBTRExLX2E7CisgICAga2V5bWFwW1FaX3NdID0gU0RMS19zOworICAgIGtleW1hcFtRWl9kXSA9IFNETEtfZDsKKyAgICBrZXltYXBbUVpfZl0gPSBTRExLX2Y7CisgICAga2V5bWFwW1FaX2ddID0gU0RMS19nOworICAgIGtleW1hcFtRWl9oXSA9IFNETEtfaDsKKyAgICBrZXltYXBbUVpfal0gPSBTRExLX2o7CisgICAga2V5bWFwW1FaX2tdID0gU0RMS19rOworICAgIGtleW1hcFtRWl9sXSA9IFNETEtfbDsKKyAgICBrZXltYXBbUVpfU0VNSUNPTE9OXSA9IFNETEtfU0VNSUNPTE9OOworICAgIGtleW1hcFtRWl9RVU9URV0gPSBTRExLX1FVT1RFOworICAgIGtleW1hcFtRWl9SRVRVUk5dID0gU0RMS19SRVRVUk47CisgICAga2V5bWFwW1FaX0tQNF0gPSBTRExLX0tQNDsKKyAgICBrZXltYXBbUVpfS1A1XSA9IFNETEtfS1A1OworICAgIGtleW1hcFtRWl9LUDZdID0gU0RMS19LUDY7CisgICAga2V5bWFwW1FaX0tQX1BMVVNdID0gU0RMS19LUF9QTFVTOworICAgIGtleW1hcFtRWl9MU0hJRlRdID0gU0RMS19MU0hJRlQ7CisgICAga2V5bWFwW1FaX1JTSElGVF0gPSBTRExLX1JTSElGVDsKKyAgICBrZXltYXBbUVpfel0gPSBTRExLX3o7CisgICAga2V5bWFwW1FaX3hdID0gU0RMS194OworICAgIGtleW1hcFtRWl9jXSA9IFNETEtfYzsKKyAgICBrZXltYXBbUVpfdl0gPSBTRExLX3Y7CisgICAga2V5bWFwW1FaX2JdID0gU0RMS19iOworICAgIGtleW1hcFtRWl9uXSA9IFNETEtfbjsKKyAgICBrZXltYXBbUVpfbV0gPSBTRExLX207CisgICAga2V5bWFwW1FaX0NPTU1BXSA9IFNETEtfQ09NTUE7CisgICAga2V5bWFwW1FaX1BFUklPRF0gPSBTRExLX1BFUklPRDsKKyAgICBrZXltYXBbUVpfU0xBU0hdID0gU0RMS19TTEFTSDsKKyAgICBrZXltYXBbUVpfVVBdID0gU0RMS19VUDsKKyAgICBrZXltYXBbUVpfS1AxXSA9IFNETEtfS1AxOworICAgIGtleW1hcFtRWl9LUDJdID0gU0RMS19LUDI7CisgICAga2V5bWFwW1FaX0tQM10gPSBTRExLX0tQMzsKKyAgICBrZXltYXBbUVpfS1BfRU5URVJdID0gU0RMS19LUF9FTlRFUjsKKyAgICBrZXltYXBbUVpfTENUUkxdID0gU0RMS19MQ1RSTDsKKyAgICBrZXltYXBbUVpfTEFMVF0gPSBTRExLX0xBTFQ7CisgICAga2V5bWFwW1FaX0xNRVRBXSA9IFNETEtfTE1FVEE7CisgICAga2V5bWFwW1FaX1JDVFJMXSA9IFNETEtfUkNUUkw7CisgICAga2V5bWFwW1FaX1JBTFRdID0gU0RMS19SQUxUOworICAgIGtleW1hcFtRWl9STUVUQV0gPSBTRExLX1JNRVRBOworICAgIGtleW1hcFtRWl9TUEFDRV0gPSBTRExLX1NQQUNFOworICAgIGtleW1hcFtRWl9MRUZUXSA9IFNETEtfTEVGVDsKKyAgICBrZXltYXBbUVpfRE9XTl0gPSBTRExLX0RPV047CisgICAga2V5bWFwW1FaX1JJR0hUXSA9IFNETEtfUklHSFQ7CisgICAga2V5bWFwW1FaX0tQMF0gPSBTRExLX0tQMDsKKyAgICBrZXltYXBbUVpfS1BfUEVSSU9EXSA9IFNETEtfS1BfUEVSSU9EOworICAgIGtleW1hcFtRWl9JQk9PS19FTlRFUl0gPSBTRExLX0tQX0VOVEVSOworICAgIGtleW1hcFtRWl9JQk9PS19SSUdIVF0gPSBTRExLX1JJR0hUOworICAgIGtleW1hcFtRWl9JQk9PS19ET1dOXSA9IFNETEtfRE9XTjsKKyAgICBrZXltYXBbUVpfSUJPT0tfVVBdICAgICAgPSBTRExLX1VQOworICAgIGtleW1hcFtRWl9JQk9PS19MRUZUXSA9IFNETEtfTEVGVDsKKworICAgIC8qIAorICAgICAgICBVcCB0aGVyZSB3ZSBzZXR1cCBhIHN0YXRpYyBzY2FuY29kZS0+a2V5c3ltIG1hcC4gSG93ZXZlciwgaXQgd2lsbCBub3QKKyAgICAgICAgd29yayB2ZXJ5IHdlbGwgb24gaW50ZXJuYXRpb25hbCBrZXlib2FyZC4gSGVuY2Ugd2Ugbm93IHF1ZXJ5IE1hY09TCisgICAgICAgIGZvciBpdHMgb3duIGtleW1hcCB0byBhZGp1c3Qgb3VyIG93biBtYXBwaW5nIHRhYmxlLiBIb3dldmVyLCB0aGlzIGlzCisgICAgICAgIGJhc2ljYWxseSBvbmx5IHVzZWZ1bCBmb3IgYXNjaWkgY2hhciBrZXlzLiBUaGlzIGlzIGFsc28gdGhlIHJlYXNvbgorICAgICAgICB3aHkgd2Uga2VlcCB0aGUgc3RhdGljIHRhYmxlLCB0b28uCisgICAgICovCisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSAxMDUwKQorICAgIGlmIChUSVNDb3B5Q3VycmVudEtleWJvYXJkTGF5b3V0SW5wdXRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBUSVNJbnB1dFNvdXJjZVJlZiBzcmMgPSBUSVNDb3B5Q3VycmVudEtleWJvYXJkTGF5b3V0SW5wdXRTb3VyY2UoKTsKKyAgICAgICAgaWYgKHNyYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBDRkRhdGFSZWYgZGF0YSA9IChDRkRhdGFSZWYpCisgICAgICAgICAgICAgICAgVElTR2V0SW5wdXRTb3VyY2VQcm9wZXJ0eShzcmMsCisgICAgICAgICAgICAgICAgICAgIGtUSVNQcm9wZXJ0eVVuaWNvZGVLZXlMYXlvdXREYXRhKTsKKyAgICAgICAgICAgIGlmIChkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBVQ0tleWJvYXJkTGF5b3V0ICpsYXlvdXQgPSAoY29uc3QgVUNLZXlib2FyZExheW91dCAqKQorICAgICAgICAgICAgICAgICAgICBDRkRhdGFHZXRCeXRlUHRyKGRhdGEpOworICAgICAgICAgICAgICAgIGlmIChsYXlvdXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50MzIga2JkdHlwZSA9IExNR2V0S2JkVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBzYXdfbGF5b3V0ID0gWUVTOworCisgICAgICAgICAgICAgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgMTI3IHBvc3NpYmxlIHNjYW4gY29kZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDB4N0Y7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgVW5pQ2hhciBidWZbMTZdOworICAgICAgICAgICAgICAgICAgICAgICAgVW5pQ2hhckNvdW50IGNvdW50ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UgcHJldGVuZCBhIGNsZWFuIHN0YXJ0IHRvIGJlZ2luIHdpdGggKGkuZS4gbm8gZGVhZCBrZXlzIGFjdGl2ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVUNLZXlUcmFuc2xhdGUobGF5b3V0LCBpLCBrVUNLZXlBY3Rpb25Eb3duLCAwLCBrYmR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZzdGF0ZSwgMTYsICZjb3VudCwgYnVmKSAhPSBub0VycikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgc3RhdGUgYmVjb21lIDAsIGl0IHdhcyBhIGRlYWQga2V5LiBXZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgYWdhaW4sIHBhc3NpbmcgaW4gdGhlIG5ldyBzdGF0ZSwgdG8gZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0dWFsIGtleSB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVUNLZXlUcmFuc2xhdGUobGF5b3V0LCBpLCBrVUNLZXlBY3Rpb25Eb3duLCAwLCBrYmR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmc3RhdGUsIDE2LCAmY291bnQsIGJ1ZikgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgLyogbm8gbXVsdGktY2hhci4gVXNlIFNETCAxLjMgaW5zdGVhZC4gOikgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoVUludDMyKSBidWZbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gMTI4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU29tZSBub24tQVNDSUkgY2hhciwgbWFwIGl0IHRvIFNETEtfV09STERfKiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JsZCA8IDB4RkYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bWFwW2ldID0gd29ybGQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDMyKSB7ICAgICAvKiBub24tY29udHJvbCBBU0NJSSBjaGFyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bWFwW2ldID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDRlJlbGVhc2Uoc3JjKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgKE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDwgMTA1MCkKKyAgICBpZiAoIXNhd19sYXlvdXQpIHsKKyAgICAgICAgLyogR2V0IGEgcG9pbnRlciB0byB0aGUgc3lzdGVtcyBjYWNoZWQgS0NIUiAqLworICAgICAgICBjb25zdCB2b2lkICpLQ0hSUHRyID0gKGNvbnN0IHZvaWQgKilHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21LQ0hSQ2FjaGUpOworICAgICAgICBpZiAoS0NIUlB0cikKKyAgICAgICAgeworICAgICAgICAgICAgLyogTG9vcCBvdmVyIGFsbCAxMjcgcG9zc2libGUgc2NhbiBjb2RlcyAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDB4N0Y7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBXZSBwcmV0ZW5kIGEgY2xlYW4gc3RhcnQgdG8gYmVnaW4gd2l0aCAoaS5lLiBubyBkZWFkIGtleXMgYWN0aXZlICovCisgICAgICAgICAgICAgICAgc3RhdGUgPSAwOworCisgICAgICAgICAgICAgICAgLyogTm93IHRyYW5zbGF0ZSB0aGUga2V5IGNvZGUgdG8gYSBrZXkgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IEtleVRyYW5zbGF0ZShLQ0hSUHRyLCBpLCAmc3RhdGUpICYgMHhmZjsKKworICAgICAgICAgICAgICAgIC8qIElmIHRoZSBzdGF0ZSBiZWNvbWUgMCwgaXQgd2FzIGEgZGVhZCBrZXkuIFdlIG5lZWQgdG8gdHJhbnNsYXRlIGFnYWluLAorICAgICAgICAgICAgICAgICAgICBwYXNzaW5nIGluIHRoZSBuZXcgc3RhdGUsIHRvIGdldCB0aGUgYWN0dWFsIGtleSB2YWx1ZSAqLworICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEtleVRyYW5zbGF0ZShLQ0hSUHRyLCBpLCAmc3RhdGUpICYgMHhmZjsKKworICAgICAgICAgICAgICAgIC8qIE5vdyB3ZSBzaG91bGQgaGF2ZSBhbiBhc2NpaSB2YWx1ZSwgb3IgMC4gVHJ5IHRvIGZpZ3VyZSBvdXQgdG8gd2hpY2ggU0RMIHN5bWJvbCBpdCBtYXBzICovCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID49IDEyOCkgeyAgICAgLyogU29tZSBub24tQVNDSUkgY2hhciwgbWFwIGl0IHRvIFNETEtfV09STERfKiAqLworICAgICAgICAgICAgICAgICAgICBpZiAod29ybGQgPCAweEZGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXltYXBbaV0gPSB3b3JsZCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAzMikgeyAgICAgLyogbm9uLWNvbnRyb2wgQVNDSUkgY2hhciAqLworICAgICAgICAgICAgICAgICAgICBrZXltYXBbaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIAorICAgICAgICBUaGUga2V5cGFkIGNvZGVzIGFyZSByZS1zZXR1cCBoZXJlLCBiZWNhdXNlIHRoZSBsb29wIGFib3ZlIGNhbm5vdAorICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEga2V5IG9uIHRoZSBrZXlwYWQgYW5kIGEgcmVndWxhciBrZXkuIFdlIG1heWJlCisgICAgICAgIGNvdWxkIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIGluIGFub3RoZXIgZmFzaGlvbjogTlNFdmVudCdzIGZsYWdzCisgICAgICAgIGluY2x1ZGUgYSAiTlNOdW1lcmljUGFkS2V5TWFzayIgYml0OyB3ZSBjb3VsZCBjaGVjayB0aGF0IGFuZCBtb2RpZnkKKyAgICAgICAgdGhlIHN5bWJvbCB3ZSByZXR1cm4gb24gdGhlIGZseS4gSG93ZXZlciwgdGhpcyBmbGFnIHNlZW1zIHRvIGV4aGliaXQKKyAgICAgICAgc29tZSB3ZWlyZCBiZWhhdmlvdXIgcmVsYXRlZCB0byB0aGUgbnVtIGxvY2sga2V5CisgICAgKi8KKyAgICBrZXltYXBbUVpfS1AwXSA9IFNETEtfS1AwOworICAgIGtleW1hcFtRWl9LUDFdID0gU0RMS19LUDE7CisgICAga2V5bWFwW1FaX0tQMl0gPSBTRExLX0tQMjsKKyAgICBrZXltYXBbUVpfS1AzXSA9IFNETEtfS1AzOworICAgIGtleW1hcFtRWl9LUDRdID0gU0RMS19LUDQ7CisgICAga2V5bWFwW1FaX0tQNV0gPSBTRExLX0tQNTsKKyAgICBrZXltYXBbUVpfS1A2XSA9IFNETEtfS1A2OworICAgIGtleW1hcFtRWl9LUDddID0gU0RMS19LUDc7CisgICAga2V5bWFwW1FaX0tQOF0gPSBTRExLX0tQODsKKyAgICBrZXltYXBbUVpfS1A5XSA9IFNETEtfS1A5OworICAgIGtleW1hcFtRWl9LUF9NSU5VU10gPSBTRExLX0tQX01JTlVTOworICAgIGtleW1hcFtRWl9LUF9QTFVTXSA9IFNETEtfS1BfUExVUzsKKyAgICBrZXltYXBbUVpfS1BfUEVSSU9EXSA9IFNETEtfS1BfUEVSSU9EOworICAgIGtleW1hcFtRWl9LUF9FUVVBTFNdID0gU0RMS19LUF9FUVVBTFM7CisgICAga2V5bWFwW1FaX0tQX0RJVklERV0gPSBTRExLX0tQX0RJVklERTsKKyAgICBrZXltYXBbUVpfS1BfTVVMVElQTFldID0gU0RMS19LUF9NVUxUSVBMWTsKKyAgICBrZXltYXBbUVpfS1BfRU5URVJdID0gU0RMS19LUF9FTlRFUjsKK30KKworc3RhdGljIHZvaWQgUVpfRG9LZXkgKF9USElTLCBpbnQgc3RhdGUsIE5TRXZlbnQgKmV2ZW50KSB7CisKKyAgICBOU1N0cmluZyAqY2hhcnMgPSBOVUxMOworICAgIHVuc2lnbmVkIGludCBpLCBudW1DaGFyczsKKyAgICBTRExfa2V5c3ltIGtleTsKKyAgICAKKyAgICAvKiAKKyAgICAgICAgQSBrZXkgZXZlbnQgY2FuIGNvbnRhaW4gbXVsdGlwbGUgY2hhcmFjdGVycywKKyAgICAgICAgb3Igbm8gY2hhcmFjdGVycyBhdCBhbGwuIEluIG1vc3QgY2FzZXMsIGl0CisgICAgICAgIHdpbGwgY29udGFpbiBhIHNpbmdsZSBjaGFyYWN0ZXIuIElmIGl0IGNvbnRhaW5zCisgICAgICAgIDAgY2hhcmFjdGVycywgd2UnbGwgdXNlIDAgYXMgdGhlIHVuaWNvZGUuIElmIGl0CisgICAgICAgIGNvbnRhaW5zIG11bHRpcGxlIGNoYXJhY3RlcnMsIHdlJ2xsIHVzZSAwIGFzCisgICAgICAgIHRoZSBzY2FuY29kZS9rZXlzeW0uCisgICAgKi8KKyAgICBpZiAoU0RMX1RyYW5zbGF0ZVVOSUNPREUgJiYgc3RhdGUgPT0gU0RMX1BSRVNTRUQpIHsKKyAgICAgICAgW2ZpZWxkX2VkaXQgaW50ZXJwcmV0S2V5RXZlbnRzOltOU0FycmF5IGFycmF5V2l0aE9iamVjdDpldmVudF1dOworICAgICAgICBjaGFycyA9IFsgZXZlbnQgY2hhcmFjdGVycyBdOworICAgICAgICBudW1DaGFycyA9IFsgY2hhcnMgbGVuZ3RoIF07CisgICAgICAgIGlmIChudW1DaGFycyA+IDApCisgICAgICAgICAgICBbZmllbGRfZWRpdCBzZXRTdHJpbmc6QCIiXTsKKyAgICB9IGVsc2UgeworICAgICAgICBudW1DaGFycyA9IDA7CisgICAgfQorCisgICAgaWYgKG51bUNoYXJzID09IDApIHsKKyAgICAgIAorICAgICAgICBrZXkuc2NhbmNvZGUgPSBbIGV2ZW50IGtleUNvZGUgXTsKKyAgICAgICAga2V5LnN5bSAgICAgID0ga2V5bWFwIFsga2V5LnNjYW5jb2RlIF07CisgICAgICAgIGtleS51bmljb2RlICA9IDA7CisgICAgICAgIGtleS5tb2QgICAgICA9IEtNT0RfTk9ORTsKKworICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChzdGF0ZSwgJmtleSk7CisgICAgfQorICAgIGVsc2UgaWYgKG51bUNoYXJzID49IDEpIHsKKworICAgICAgICBrZXkuc2NhbmNvZGUgPSBbIGV2ZW50IGtleUNvZGUgXTsKKyAgICAgICAga2V5LnN5bSAgICAgID0ga2V5bWFwIFsga2V5LnNjYW5jb2RlIF07CisgICAgICAgIGtleS51bmljb2RlICA9IFsgY2hhcnMgY2hhcmFjdGVyQXRJbmRleDowIF07CisgICAgICAgIGtleS5tb2QgICAgICA9IEtNT0RfTk9ORTsKKworICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChzdGF0ZSwgJmtleSk7CisgICAgICAKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IG51bUNoYXJzOyBpKyspIHsKKworICAgICAgICAgICAga2V5LnNjYW5jb2RlID0gMDsKKyAgICAgICAgICAgIGtleS5zeW0gICAgICA9IDA7CisgICAgICAgICAgICBrZXkudW5pY29kZSAgPSBbIGNoYXJzIGNoYXJhY3RlckF0SW5kZXg6aV07CisgICAgICAgICAgICBrZXkubW9kICAgICAgPSBLTU9EX05PTkU7CisKKyAgICAgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKHN0YXRlLCAma2V5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoU0RMX2dldGVudiAoIlNETF9FTkFCTEVBUFBFVkVOVFMiKSkKKyAgICAgICAgWyBOU0FwcCBzZW5kRXZlbnQ6ZXZlbnQgXTsKK30KKworLyogVGhpcyBpcyB0aGUgb3JpZ2luYWwgYmVoYXZpb3IsIGJlZm9yZSBzdXBwb3J0IHdhcyBhZGRlZCBmb3IgCisgKiBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBsZWZ0IGFuZCByaWdodCB2ZXJzaW9ucyBvZiB0aGUga2V5cy4KKyAqLworc3RhdGljIHZvaWQgUVpfRG9VbnNpZGVkTW9kaWZpZXJzIChfVEhJUywgdW5zaWduZWQgaW50IG5ld01vZHMpIHsKKworICAgIGNvbnN0IGludCBtYXBwaW5nW10gPSB7IFNETEtfQ0FQU0xPQ0ssIFNETEtfTFNISUZULCBTRExLX0xDVFJMLCBTRExLX0xBTFQsIFNETEtfTE1FVEEgfTsKKworICAgIGludCBpOworICAgIGludCBiaXQ7CisgICAgU0RMX2tleXN5bSBrZXk7CisgICAgCisgICAga2V5LnNjYW5jb2RlICAgID0gMDsKKyAgICBrZXkuc3ltICAgICAgICAgPSBTRExLX1VOS05PV047CisgICAga2V5LnVuaWNvZGUgICAgID0gMDsKKyAgICBrZXkubW9kICAgICAgICAgPSBLTU9EX05PTkU7CisKKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGJpdHMsIHRlc3RpbmcgZWFjaCBhZ2FpbnN0IHRoZSBjdXJyZW50IG1vZGlmaWVycyAqLworICAgIGZvciAoaSA9IDAsIGJpdCA9IE5TQWxwaGFTaGlmdEtleU1hc2s7IGJpdCA8PSBOU0NvbW1hbmRLZXlNYXNrOyBiaXQgPDw9IDEsICsraSkgeworCisgICAgICAgIHVuc2lnbmVkIGludCBjdXJyZW50TWFzaywgbmV3TWFzazsKKworICAgICAgICBjdXJyZW50TWFzayA9IGN1cnJlbnRfbW9kcyAmIGJpdDsKKyAgICAgICAgbmV3TWFzayAgICAgPSBuZXdNb2RzICYgYml0OworCisgICAgICAgIGlmICggY3VycmVudE1hc2sgJiYKKyAgICAgICAgICAgICBjdXJyZW50TWFzayAhPSBuZXdNYXNrICkgeyAgICAgLyogbW9kaWZpZXIgdXAgZXZlbnQgKi8KKworICAgICAgICAgICAgIGtleS5zeW0gPSBtYXBwaW5nW2ldOworICAgICAgICAgICAgIC8qIElmIHRoaXMgd2FzIENhcHMgTG9jaywgd2UgbmVlZCBzb21lIGFkZGl0aW9uYWwgdm9vZG9vIHRvIG1ha2UgU0RMIGhhcHB5ICovCisgICAgICAgICAgICAgaWYgKGJpdCA9PSBOU0FscGhhU2hpZnRLZXlNYXNrKQorICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1BSRVNTRUQsICZrZXkpOworICAgICAgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9SRUxFQVNFRCwgJmtleSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIG5ld01hc2sgJiYKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRNYXNrICE9IG5ld01hc2sgKSB7ICAgICAvKiBtb2RpZmllciBkb3duIGV2ZW50ICovCisgICAgICAgIAorICAgICAgICAgICAgIGtleS5zeW0gPSBtYXBwaW5nW2ldOworICAgICAgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9QUkVTU0VELCAma2V5KTsKKyAgICAgICAgICAgICAvKiBJZiB0aGlzIHdhcyBDYXBzIExvY2ssIHdlIG5lZWQgc29tZSBhZGRpdGlvbmFsIHZvb2RvbyB0byBtYWtlIFNETCBoYXBweSAqLworICAgICAgICAgICAgIGlmIChiaXQgPT0gTlNBbHBoYVNoaWZ0S2V5TWFzaykKKyAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9SRUxFQVNFRCwgJmtleSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIFFaX0hhbmRsZU1vZGlmaWVyU2lkZS4gVGhpcyAKKyAqIGZ1bmN0aW9uIHJldmVydHMgYmFjayB0byBiZWhhdmlvciBiZWZvcmUgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4KKyAqIHNpZGVzIHdhcyBtYWRlLgorICovCitzdGF0aWMgdm9pZCBRWl9IYW5kbGVOb25EZXZpY2VNb2RpZmllciAoIF9USElTLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2luZGVwZW5kZW50X21hc2ssIHVuc2lnbmVkIGludCBuZXdNb2RzLCB1bnNpZ25lZCBpbnQga2V5X3N5bSkgeworICAgIHVuc2lnbmVkIGludCBjdXJyZW50TWFzaywgbmV3TWFzazsKKyAgICBTRExfa2V5c3ltIGtleTsKKyAgICAKKyAgICBrZXkuc2NhbmNvZGUgICAgPSAwOworICAgIGtleS5zeW0gICAgICAgICA9IGtleV9zeW07CisgICAga2V5LnVuaWNvZGUgICAgID0gMDsKKyAgICBrZXkubW9kICAgICAgICAgPSBLTU9EX05PTkU7CisgICAgCisgICAgLyogSXNvbGF0ZSBqdXN0IHRoZSBiaXRzIHdlIGNhcmUgYWJvdXQgaW4gdGhlIGRlcGVkZW50IGJpdHMgc28gd2UgY2FuIAorICAgICAqIGZpZ3VyZSBvdXQgd2hhdCBjaGFuZ2VkCisgICAgICovIAorICAgIGN1cnJlbnRNYXNrID0gY3VycmVudF9tb2RzICYgZGV2aWNlX2luZGVwZW5kZW50X21hc2s7CisgICAgbmV3TWFzayAgICAgPSBuZXdNb2RzICYgZGV2aWNlX2luZGVwZW5kZW50X21hc2s7CisgICAgCisgICAgaWYgKCBjdXJyZW50TWFzayAmJgorICAgICAgICAgY3VycmVudE1hc2sgIT0gbmV3TWFzayApIHsgICAgIC8qIG1vZGlmaWVyIHVwIGV2ZW50ICovCisgICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUkVMRUFTRUQsICZrZXkpOworICAgIH0KKyAgICBlbHNlIGlmICggbmV3TWFzayAmJgorICAgICAgICAgIGN1cnJlbnRNYXNrICE9IG5ld01hc2sgKSB7ICAgICAvKiBtb2RpZmllciBkb3duIGV2ZW50ICovCisgICAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1BSRVNTRUQsICZrZXkpOworICAgIH0KK30KKworLyogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgUVpfSGFuZGxlTW9kaWZpZXJTaWRlLiAKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYWN0dWFsIFNETF9Qcml2YXRlS2V5Ym9hcmQgZXZlbnQuCisgKi8KK3N0YXRpYyB2b2lkIFFaX0hhbmRsZU1vZGlmaWVyT25lU2lkZSAoIF9USElTLCB1bnNpZ25lZCBpbnQgbmV3TW9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlfc3ltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaWRlZF9kZXZpY2VfZGVwZW5kZW50X21hc2sgKSB7CisgICAgCisgICAgU0RMX2tleXN5bSBrZXk7CisgICAgdW5zaWduZWQgaW50IGN1cnJlbnRfZGVwX21hc2ssIG5ld19kZXBfbWFzazsKKyAgICAKKyAgICBrZXkuc2NhbmNvZGUgICAgPSAwOworICAgIGtleS5zeW0gICAgICAgICA9IGtleV9zeW07CisgICAga2V5LnVuaWNvZGUgICAgID0gMDsKKyAgICBrZXkubW9kICAgICAgICAgPSBLTU9EX05PTkU7CisgICAgCisgICAgLyogSXNvbGF0ZSBqdXN0IHRoZSBiaXRzIHdlIGNhcmUgYWJvdXQgaW4gdGhlIGRlcGVkZW50IGJpdHMgc28gd2UgY2FuIAorICAgICAqIGZpZ3VyZSBvdXQgd2hhdCBjaGFuZ2VkCisgICAgICovIAorICAgIGN1cnJlbnRfZGVwX21hc2sgPSBjdXJyZW50X21vZHMgJiBzaWRlZF9kZXZpY2VfZGVwZW5kZW50X21hc2s7CisgICAgbmV3X2RlcF9tYXNrICAgICA9IG5ld01vZHMgJiBzaWRlZF9kZXZpY2VfZGVwZW5kZW50X21hc2s7CisgICAgCisgICAgLyogV2Ugbm93IGtub3cgdGhhdCB0aGlzIHNpZGUgYml0IGZsaXBwZWQuIEJ1dCB3ZSBkb24ndCBrbm93IGlmCisgICAgICogaXQgd2VudCBwcmVzc2VkIHRvIHJlbGVhc2VkIG9yIHJlbGVhc2VkIHRvIHByZXNzZWQsIHNvIHdlIG11c3QgCisgICAgICogZmluZCBvdXQgd2hpY2ggaXQgaXMuCisgICAgICovCisgICAgaWYoIG5ld19kZXBfbWFzayAmJgorICAgICAgICBjdXJyZW50X2RlcF9tYXNrICE9IG5ld19kZXBfbWFzayApIHsgCisgICAgICAgIC8qIE1vZGlmaWVyIGRvd24gZXZlbnQgKi8KKyAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1BSRVNTRUQsICZrZXkpOworICAgIH0KKyAgICBlbHNlIC8qIE1vZGlmaWVyIHVwIGV2ZW50ICovIHsKKyAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1JFTEVBU0VELCAma2V5KTsKKyAgICB9Cit9CisKKy8qIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIFFaX0RvU2lkZWRNb2RpZmllcnMuCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmlndXJlIG91dCBpZiB0aGUgbW9kaWZpZXIga2V5IGlzIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUsIAorICogZS5nLiBsZWZ0LXNoaWZ0IHZzIHJpZ2h0LXNoaWZ0LiAKKyAqLworc3RhdGljIHZvaWQgUVpfSGFuZGxlTW9kaWZpZXJTaWRlICggX1RISVMsIGludCBkZXZpY2VfaW5kZXBlbmRlbnRfbWFzaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmV3TW9kcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVmdF9rZXlfc3ltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByaWdodF9rZXlfc3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlZnRfZGV2aWNlX2RlcGVuZGVudF9tYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByaWdodF9kZXZpY2VfZGVwZW5kZW50X21hc2sgKSB7CisgICAgdW5zaWduZWQgaW50IGRldmljZV9kZXBlbmRlbnRfbWFzayA9IDA7CisgICAgdW5zaWduZWQgaW50IGRpZmZfbW9kID0gMDsKKyAgICAKKyAgICBkZXZpY2VfZGVwZW5kZW50X21hc2sgPSBsZWZ0X2RldmljZV9kZXBlbmRlbnRfbWFzayB8IHJpZ2h0X2RldmljZV9kZXBlbmRlbnRfbWFzazsKKyAgICAvKiBPbiB0aGUgYmFzaXMgdGhhdCB0aGUgZGV2aWNlIGluZGVwZW5kZW50IG1hc2sgaXMgc2V0LCBidXQgdGhlcmUgYXJlIAorICAgICAqIG5vIGRldmljZSBkZXBlbmRlbnQgZmxhZ3Mgc2V0LCB3ZSdsbCBhc3N1bWUgdGhhdCB3ZSBjYW4ndCBkZXRlY3QgdGhpcyAKKyAgICAgKiBrZXlib2FyZCBhbmQgcmV2ZXJ0IHRvIHRoZSB1bnNpZGVkIGJlaGF2aW9yLgorICAgICAqLworICAgIGlmICggKGRldmljZV9kZXBlbmRlbnRfbWFzayAmIG5ld01vZHMpID09IDAgKSB7CisgICAgICAgIC8qIFJldmVydCB0byB0aGUgb2xkIGJlaGF2aW9yICovCisgICAgICAgIFFaX0hhbmRsZU5vbkRldmljZU1vZGlmaWVyICggdGhpcywgZGV2aWNlX2luZGVwZW5kZW50X21hc2ssIG5ld01vZHMsIGxlZnRfa2V5X3N5bSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgICAgICAKKyAgICAvKiBYT1IgdGhlIHByZXZpb3VzIHN0YXRlIGFnYWluc3QgdGhlIG5ldyBzdGF0ZSB0byBzZWUgaWYgdGhlcmUncyBhIGNoYW5nZSAqLworICAgIGRpZmZfbW9kID0gKGRldmljZV9kZXBlbmRlbnRfbWFzayAmIGN1cnJlbnRfbW9kcykKKyAgICAgICAgXiAoZGV2aWNlX2RlcGVuZGVudF9tYXNrICYgbmV3TW9kcyk7CisKKyAgICBpZiAoIGRpZmZfbW9kICkgeworICAgICAgICAvKiBBIGNoYW5nZSBpbiBzdGF0ZSB3YXMgZm91bmQuIElzb2xhdGUgdGhlIGxlZnQgYW5kIHJpZ2h0IGJpdHMgCisgICAgICAgICAqIHRvIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkganVzdCBpbiBjYXNlIHRoZSB2YWx1ZXMgY2FuIHNpbXVsYXRhbmVvdXNseQorICAgICAgICAgKiBjaGFuZ2Ugb3IgaWYgdGhlIGJpdHMgZG9uJ3QgYm90aCBleGlzdC4KKyAgICAgICAgICovCisgICAgICAgIGlmICggbGVmdF9kZXZpY2VfZGVwZW5kZW50X21hc2sgJiBkaWZmX21vZCApIHsKKyAgICAgICAgICAgIFFaX0hhbmRsZU1vZGlmaWVyT25lU2lkZSAoIHRoaXMsIG5ld01vZHMsIGxlZnRfa2V5X3N5bSwgbGVmdF9kZXZpY2VfZGVwZW5kZW50X21hc2sgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHJpZ2h0X2RldmljZV9kZXBlbmRlbnRfbWFzayAmIGRpZmZfbW9kICkgeworICAgICAgICAgICAgUVpfSGFuZGxlTW9kaWZpZXJPbmVTaWRlICggdGhpcywgbmV3TW9kcywgcmlnaHRfa2V5X3N5bSwgcmlnaHRfZGV2aWNlX2RlcGVuZGVudF9tYXNrICk7CisgICAgICAgIH0KKyAgICB9Cit9CisgICAKKy8qIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIFFaX0RvU2lkZWRNb2RpZmllcnMuCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVsZWFzZSBhIGtleSBwcmVzcyBpbiB0aGUgY2FzZSB0aGF0IAorICogaXQgaXMgY2xlYXIgdGhhdCB0aGUgbW9kaWZpZXIgaGFzIGJlZW4gcmVsZWFzZWQgKGkuZS4gb25lIHNpZGUgCisgKiBjYW4ndCBzdGlsbCBiZSBkb3duKS4KKyAqLworc3RhdGljIHZvaWQgUVpfUmVsZWFzZU1vZGlmaWVyU2lkZSAoIF9USElTLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2luZGVwZW5kZW50X21hc2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuZXdNb2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZWZ0X2tleV9zeW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByaWdodF9rZXlfc3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZWZ0X2RldmljZV9kZXBlbmRlbnRfbWFzaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJpZ2h0X2RldmljZV9kZXBlbmRlbnRfbWFzayApIHsKKyAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2RlcGVuZGVudF9tYXNrID0gMDsKKyAgICBTRExfa2V5c3ltIGtleTsKKyAgICAKKyAgICBrZXkuc2NhbmNvZGUgICAgPSAwOworICAgIGtleS5zeW0gICAgICAgICA9IFNETEtfVU5LTk9XTjsKKyAgICBrZXkudW5pY29kZSAgICAgPSAwOworICAgIGtleS5tb2QgICAgICAgICA9IEtNT0RfTk9ORTsKKyAgICAKKyAgICBkZXZpY2VfZGVwZW5kZW50X21hc2sgPSBsZWZ0X2RldmljZV9kZXBlbmRlbnRfbWFzayB8IHJpZ2h0X2RldmljZV9kZXBlbmRlbnRfbWFzazsKKyAgICAvKiBPbiB0aGUgYmFzaXMgdGhhdCB0aGUgZGV2aWNlIGluZGVwZW5kZW50IG1hc2sgaXMgc2V0LCBidXQgdGhlcmUgYXJlIAorICAgICAqIG5vIGRldmljZSBkZXBlbmRlbnQgZmxhZ3Mgc2V0LCB3ZSdsbCBhc3N1bWUgdGhhdCB3ZSBjYW4ndCBkZXRlY3QgdGhpcyAKKyAgICAgKiBrZXlib2FyZCBhbmQgcmV2ZXJ0IHRvIHRoZSB1bnNpZGVkIGJlaGF2aW9yLgorICAgICAqLworICAgIGlmICggKGRldmljZV9kZXBlbmRlbnRfbWFzayAmIGN1cnJlbnRfbW9kcykgPT0gMCApIHsKKyAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBjYW4ndCBkZXRlY3QgdGhlIGtleWJvYXJkLCBzbyB1c2UgdGhlIGxlZnQgc2lkZSAKKyAgICAgICAgICogdG8gcmVwcmVzZW50IGJvdGgsIGFuZCByZWxlYXNlIGl0LiAKKyAgICAgICAgICovCisgICAgICAgIGtleS5zeW0gPSBsZWZ0X2tleV9zeW07CisgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9SRUxFQVNFRCwgJmtleSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgIC8qIAorICAgICAqIFRoaXMgY291bGQgaGF2ZSBiZWVuIGRvbmUgaW4gYW4gaWYtZWxzZSBjYXNlIGJlY2F1c2UgYXQgdGhpcyBwb2ludCwKKyAgICAgKiB3ZSBrbm93IHRoYXQgYWxsIGtleXMgaGF2ZSBiZWVuIHJlbGVhc2VkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKKyAgICAgKiBCdXQgSSdtIGJlaW5nIHBhcmFub2lkIHNvIEkgd2FudCB0byBoYW5kbGUgZWFjaCBzZXBhcmF0ZWx5LAorICAgICAqIHNvIEkgaG9wZSB0aGlzIGRvZXNuJ3QgY2F1c2Ugb3RoZXIgcHJvYmxlbXMuCisgICAgICovCisgICAgaWYgKCBsZWZ0X2RldmljZV9kZXBlbmRlbnRfbWFzayAmIGN1cnJlbnRfbW9kcyApIHsKKyAgICAgICAga2V5LnN5bSA9IGxlZnRfa2V5X3N5bTsKKyAgICAgICAgU0RMX1ByaXZhdGVLZXlib2FyZCAoU0RMX1JFTEVBU0VELCAma2V5KTsKKyAgICB9CisgICAgaWYgKCByaWdodF9kZXZpY2VfZGVwZW5kZW50X21hc2sgJiBjdXJyZW50X21vZHMgKSB7CisgICAgICAgIGtleS5zeW0gPSByaWdodF9rZXlfc3ltOworICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUkVMRUFTRUQsICZrZXkpOworICAgIH0KK30KKworLyogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgUVpfRG9TaWRlZE1vZGlmaWVycy4KKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgQ2Fwc0xvY2sgY2FzZS4KKyAqLworc3RhdGljIHZvaWQgUVpfSGFuZGxlQ2Fwc0xvY2sgKF9USElTLCB1bnNpZ25lZCBpbnQgbmV3TW9kcykgeworICAgIHVuc2lnbmVkIGludCBjdXJyZW50TWFzaywgbmV3TWFzazsKKyAgICBTRExfa2V5c3ltIGtleTsKKyAgICAKKyAgICBrZXkuc2NhbmNvZGUgICAgPSAwOworICAgIGtleS5zeW0gICAgICAgICA9IFNETEtfQ0FQU0xPQ0s7CisgICAga2V5LnVuaWNvZGUgICAgID0gMDsKKyAgICBrZXkubW9kICAgICAgICAgPSBLTU9EX05PTkU7CisgICAgCisgICAgY3VycmVudE1hc2sgPSBjdXJyZW50X21vZHMgJiBOU0FscGhhU2hpZnRLZXlNYXNrOworICAgIG5ld01hc2sgICAgID0gbmV3TW9kcyAmIE5TQWxwaGFTaGlmdEtleU1hc2s7CisKKyAgICBpZiAoIGN1cnJlbnRNYXNrICYmCisgICAgICAgICBjdXJyZW50TWFzayAhPSBuZXdNYXNrICkgeyAgICAgLyogbW9kaWZpZXIgdXAgZXZlbnQgKi8KKyAgICAgICAgIC8qIElmIHRoaXMgd2FzIENhcHMgTG9jaywgd2UgbmVlZCBzb21lIGFkZGl0aW9uYWwgdm9vZG9vIHRvIG1ha2UgU0RMIGhhcHB5ICovCisgICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUFJFU1NFRCwgJmtleSk7CisgICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUkVMRUFTRUQsICZrZXkpOworICAgIH0KKyAgICBlbHNlIGlmICggbmV3TWFzayAmJgorICAgICAgICAgICAgICBjdXJyZW50TWFzayAhPSBuZXdNYXNrICkgeyAgICAgLyogbW9kaWZpZXIgZG93biBldmVudCAqLworICAgICAgICAvKiBJZiB0aGlzIHdhcyBDYXBzIExvY2ssIHdlIG5lZWQgc29tZSBhZGRpdGlvbmFsIHZvb2RvbyB0byBtYWtlIFNETCBoYXBweSAqLworICAgICAgICBTRExfUHJpdmF0ZUtleWJvYXJkIChTRExfUFJFU1NFRCwgJmtleSk7CisgICAgICAgIFNETF9Qcml2YXRlS2V5Ym9hcmQgKFNETF9SRUxFQVNFRCwgJmtleSk7CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIHRoZSBtb2RpZmllciBrZXlzIGFuZCBhbHNvIGRldGVybWluZSB0aGUgCisgKiBjb3JyZWN0IHNpZGUgb2YgdGhlIGtleS4KKyAqLworc3RhdGljIHZvaWQgUVpfRG9TaWRlZE1vZGlmaWVycyAoX1RISVMsIHVuc2lnbmVkIGludCBuZXdNb2RzKSB7CisJLyogU2V0IHVwIGFycmF5cyBmb3IgdGhlIGtleSBzeW1zIGZvciB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZS4gKi8KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgbGVmdF9tYXBwaW5nW10gID0geyBTRExLX0xTSElGVCwgU0RMS19MQ1RSTCwgU0RMS19MQUxULCBTRExLX0xNRVRBIH07CisgICAgY29uc3QgdW5zaWduZWQgaW50IHJpZ2h0X21hcHBpbmdbXSA9IHsgU0RMS19SU0hJRlQsIFNETEtfUkNUUkwsIFNETEtfUkFMVCwgU0RMS19STUVUQSB9OworCS8qIFNldCB1cCBhcnJheXMgZm9yIHRoZSBkZXZpY2UgZGVwZW5kZW50IG1hc2tzIHdpdGggaW5kaWNlcyB0aGF0IAorICAgICAqIGNvcnJlc3BvbmQgdG8gdGhlIF9tYXBwaW5nIGFycmF5cyAKKyAgICAgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgbGVmdF9kZXZpY2VfbWFwcGluZ1tdICA9IHsgTlhfREVWSUNFTFNISUZUS0VZTUFTSywgTlhfREVWSUNFTENUTEtFWU1BU0ssIE5YX0RFVklDRUxBTFRLRVlNQVNLLCBOWF9ERVZJQ0VMQ01ES0VZTUFTSyB9OworICAgIGNvbnN0IHVuc2lnbmVkIGludCByaWdodF9kZXZpY2VfbWFwcGluZ1tdID0geyBOWF9ERVZJQ0VSU0hJRlRLRVlNQVNLLCBOWF9ERVZJQ0VSQ1RMS0VZTUFTSywgTlhfREVWSUNFUkFMVEtFWU1BU0ssIE5YX0RFVklDRVJDTURLRVlNQVNLIH07CisKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgYml0OworICAgIAorICAgIC8qIEhhbmRsZSBDQVBTTE9DSyBzZXBhcmF0ZWx5IGJlY2F1c2UgaXQgZG9lc24ndCBoYXZlIGEgbGVmdC9yaWdodCBzaWRlICovCisgICAgUVpfSGFuZGxlQ2Fwc0xvY2sgKCB0aGlzLCBuZXdNb2RzICk7CisgICAgICAgIAorICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYml0cywgdGVzdGluZyBlYWNoIGFnYWluc3QgdGhlIGN1cnJlbnQgbW9kaWZpZXJzICovCisgICAgZm9yIChpID0gMCwgYml0ID0gTlNTaGlmdEtleU1hc2s7IGJpdCA8PSBOU0NvbW1hbmRLZXlNYXNrOyBiaXQgPDw9IDEsICsraSkgeworCQkKKyAgICAgICAgdW5zaWduZWQgaW50IGN1cnJlbnRNYXNrLCBuZXdNYXNrOworCQkKKyAgICAgICAgY3VycmVudE1hc2sgPSBjdXJyZW50X21vZHMgJiBiaXQ7CisgICAgICAgIG5ld01hc2sgICAgID0gbmV3TW9kcyAmIGJpdDsKKwkJCisgICAgICAgIC8qIElmIHRoZSBiaXQgaXMgc2V0LCB3ZSBtdXN0IGFsd2F5cyBleGFtaW5lIGl0IGJlY2F1c2UgdGhlIGxlZnQKKyAgICAgICAgICogYW5kIHJpZ2h0IHNpZGUga2V5cyBtYXkgYWx0ZXJuYXRlIG9yIGJvdGggbWF5IGJlIHByZXNzZWQuCisgICAgICAgICAqLworICAgICAgICBpZiAoIG5ld01hc2sgKSB7CisgICAgICAgICAgICBRWl9IYW5kbGVNb2RpZmllclNpZGUgKCB0aGlzLCBiaXQsIG5ld01vZHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9tYXBwaW5nW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfbWFwcGluZ1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfZGV2aWNlX21hcHBpbmdbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9kZXZpY2VfbWFwcGluZ1tpXSApOworICAgICAgICB9CisgICAgICAgIC8qIElmIHRoZSBzdGF0ZSBjaGFuZ2VkIGZyb20gcHJlc3NlZCB0byB1bnByZXNzZWQsIHdlIG11c3QgZXhhbWluZQorICAgICAgICAgICAgKiB0aGUgZGV2aWNlIGRlcGVuZGVudCBiaXRzIHRvIHJlbGVhc2UgdGhlIGNvcnJlY3Qga2V5cy4KKyAgICAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKCBjdXJyZW50TWFzayAmJgorICAgICAgICAgICAgICAgICAgY3VycmVudE1hc2sgIT0gbmV3TWFzayApIHsgLyogbW9kaWZpZXIgdXAgZXZlbnQgKi8KKyAgICAgICAgICAgICAgICAgIFFaX1JlbGVhc2VNb2RpZmllclNpZGUgKCB0aGlzLCBiaXQsIG5ld01vZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9tYXBwaW5nW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0X21hcHBpbmdbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9kZXZpY2VfbWFwcGluZ1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9kZXZpY2VfbWFwcGluZ1tpXSApOworICAgICAgICB9CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBoYW5kbGUgdGhlIG1vZGlmaWVycy4KKyAqIEl0IHdpbGwgdHJ5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGxlZnQgc2lkZSBhbmQgcmlnaHQgc2lkZSAKKyAqIG9mIHRoZSBrZXlib2FyZCBmb3IgdGhvc2UgbW9kaWZpZXJzIHRoYXQgcXVhbGlmeSBpZiB0aGUgCisgKiBvcGVyYXRpbmcgc3lzdGVtIHZlcnNpb24gc3VwcG9ydHMgaXQuIE90aGVyd2lzZSwgdGhlIGNvZGUgCisgKiB3aWxsIG5vdCB0cnkgdG8gbWFrZSB0aGUgZGlzdGluY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIFFaX0RvTW9kaWZpZXJzIChfVEhJUywgdW5zaWduZWQgaW50IG5ld01vZHMpIHsKKwkKKyAgICBpZiAoY3VycmVudF9tb2RzID09IG5ld01vZHMpCisgICAgCXJldHVybjsKKyAgICAKKyAgICAvKiAKKyAgICAgKiBTdGFydGluZyB3aXRoIFBhbnRoZXIgKDEwLjMuMCksIHRoZSBhYmlsaXR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gCisgICAgICogbGVmdCBzaWRlIGFuZCByaWdodCBzaWRlIG1vZGlmaWVycyBpcyBhdmFpbGFibGUuCisgICAgICovCisgICAgaWYoIHN5c3RlbV92ZXJzaW9uID49IDB4MTAzMCApIHsKKyAgICAgICAgUVpfRG9TaWRlZE1vZGlmaWVycyAodGhpcywgbmV3TW9kcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBRWl9Eb1Vuc2lkZWRNb2RpZmllcnMgKHRoaXMsIG5ld01vZHMpOworICAgIH0KKyAgICAKKyAgICBjdXJyZW50X21vZHMgPSBuZXdNb2RzOworfQorCitzdGF0aWMgdm9pZCBRWl9HZXRNb3VzZUxvY2F0aW9uIChfVEhJUywgTlNQb2ludCAqcCkgeworICAgICpwID0gWyBOU0V2ZW50IG1vdXNlTG9jYXRpb24gXTsgLyogZ2xvYmFsIGNvb3JkaW5hdGVzICovCisgICAgaWYgKHF6X3dpbmRvdykKKyAgICAgICAgUVpfUHJpdmF0ZUdsb2JhbFRvTG9jYWwgKHRoaXMsIHApOworICAgIFFaX1ByaXZhdGVDb2NvYVRvU0RMICh0aGlzLCBwKTsKK30KKwordm9pZCBRWl9Eb0FjdGl2YXRlIChfVEhJUykgeworCisgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBJTlBVVEZPQ1VTIHwgKFFaX0lzTW91c2VJbldpbmRvdyAodGhpcykgPyBTRExfQVBQTU9VU0VGT0NVUyA6IDApKTsKKworICAgIFFaX1VwZGF0ZUN1cnNvcih0aGlzKTsKKworICAgIC8qIFJlZ3JhYiBpbnB1dCwgb25seSBpZiBpdCB3YXMgcHJldmlvdXNseSBncmFiYmVkICovCisgICAgaWYgKCBjdXJyZW50X2dyYWJfbW9kZSA9PSBTRExfR1JBQl9PTiApIHsKKyAgICAgICAgCisgICAgICAgIC8qIFJlc3RvcmUgY3Vyc29yIGxvY2F0aW9uIGlmIGlucHV0IHdhcyBncmFiYmVkICovCisgICAgICAgIFFaX1ByaXZhdGVXYXJwQ3Vyc29yICh0aGlzLCBjdXJzb3JfbG9jLngsIGN1cnNvcl9sb2MueSk7CisgICAgICAgIFFaX0NoYW5nZUdyYWJTdGF0ZSAodGhpcywgUVpfRU5BQkxFX0dSQUIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogVXBkYXRlIFNETCdzIG1vdXNlIGxvY2F0aW9uICovCisgICAgICAgIE5TUG9pbnQgcDsKKyAgICAgICAgUVpfR2V0TW91c2VMb2NhdGlvbiAodGhpcywgJnApOworICAgICAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uICgwLCAwLCBwLngsIHAueSk7CisgICAgfQorCisgICAgUVpfVXBkYXRlQ3Vyc29yKHRoaXMpOworfQorCit2b2lkIFFaX0RvRGVhY3RpdmF0ZSAoX1RISVMpIHsKKyAgICAKKyAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMCwgU0RMX0FQUElOUFVURk9DVVMgfCBTRExfQVBQTU9VU0VGT0NVUyk7CisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgY3Vyc29yIGxvY2F0aW9uLCBmb3IgcmVzdG9yZSBvbiBhY3RpdmF0ZSAqLworICAgIFFaX0dldE1vdXNlTG9jYXRpb24gKHRoaXMsICZjdXJzb3JfbG9jKTsKKyAgICAKKyAgICAvKiBSZWFzc29jaWF0ZSBtb3VzZSBhbmQgY3Vyc29yICovCisgICAgQ0dBc3NvY2lhdGVNb3VzZUFuZE1vdXNlQ3Vyc29yUG9zaXRpb24gKDEpOworCisgICAgUVpfVXBkYXRlQ3Vyc29yKHRoaXMpOworfQorCit2b2lkIFFaX1NsZWVwTm90aWZpY2F0aW9uSGFuZGxlciAodm9pZCAqIHJlZmNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19zZXJ2aWNlX3Qgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXR1cmFsX3QgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIG1lc3NhZ2VBcmd1bWVudCApCit7CisgICAgIFNETF9WaWRlb0RldmljZSAqdGhpcyA9IChTRExfVmlkZW9EZXZpY2UqKXJlZmNvbjsKKyAgICAgCisgICAgIHN3aXRjaChtZXNzYWdlVHlwZSkKKyAgICAgeworICAgICAgICAgY2FzZSBrSU9NZXNzYWdlU3lzdGVtV2lsbFNsZWVwOgorICAgICAgICAgICAgIElPQWxsb3dQb3dlckNoYW5nZShwb3dlcl9jb25uZWN0aW9uLCAobG9uZykgbWVzc2FnZUFyZ3VtZW50KTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2Uga0lPTWVzc2FnZUNhblN5c3RlbVNsZWVwOgorICAgICAgICAgICAgIElPQWxsb3dQb3dlckNoYW5nZShwb3dlcl9jb25uZWN0aW9uLCAobG9uZykgbWVzc2FnZUFyZ3VtZW50KTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2Uga0lPTWVzc2FnZVN5c3RlbUhhc1Bvd2VyZWRPbjoKKyAgICAgICAgICAgIC8qIGF3YWtlICovCisgICAgICAgICAgICBTRExfUHJpdmF0ZUV4cG9zZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgIH0KK30KKwordm9pZCBRWl9SZWdpc3RlckZvclNsZWVwTm90aWZpY2F0aW9ucyAoX1RISVMpCit7CisgICAgIENGUnVuTG9vcFNvdXJjZVJlZiBybHM7CisgICAgIElPTm90aWZpY2F0aW9uUG9ydFJlZiB0aGVQb3J0UmVmOworICAgICBpb19vYmplY3RfdCBub3RpZmllcjsKKworICAgICBwb3dlcl9jb25uZWN0aW9uID0gSU9SZWdpc3RlckZvclN5c3RlbVBvd2VyICh0aGlzLCAmdGhlUG9ydFJlZiwgUVpfU2xlZXBOb3RpZmljYXRpb25IYW5kbGVyLCAmbm90aWZpZXIpOworCisgICAgIGlmIChwb3dlcl9jb25uZWN0aW9uID09IDApCisgICAgICAgICBOU0xvZyhAIlNETDogUVpfU2xlZXBOb3RpZmljYXRpb25IYW5kbGVyKCkgSU9SZWdpc3RlckZvclN5c3RlbVBvd2VyIGZhaWxlZC4iKTsKKworICAgICBybHMgPSBJT05vdGlmaWNhdGlvblBvcnRHZXRSdW5Mb29wU291cmNlICh0aGVQb3J0UmVmKTsKKyAgICAgQ0ZSdW5Mb29wQWRkU291cmNlIChDRlJ1bkxvb3BHZXRDdXJyZW50KCksIHJscywga0NGUnVuTG9vcERlZmF1bHRNb2RlKTsKKyAgICAgQ0ZSZWxlYXNlIChybHMpOworfQorCisKKy8qIFRyeSB0byBtYXAgUXVhcnR6IG1vdXNlIGJ1dHRvbnMgdG8gU0RMJ3MgbGluZ28uLi4gKi8KK3N0YXRpYyBpbnQgUVpfT3RoZXJNb3VzZUJ1dHRvblRvU0RMKGludCBidXR0b24pCit7CisgICAgc3dpdGNoIChidXR0b24pCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICByZXR1cm4oU0RMX0JVVFRPTl9MRUZUKTsgICAvKiAxICovCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybihTRExfQlVUVE9OX1JJR0hUKTsgIC8qIDMgKi8KKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmV0dXJuKFNETF9CVVRUT05fTUlERExFKTsgLyogMiAqLworICAgIH0KKworICAgIC8qID49IDM6IHNraXAgNCAmIDUsIHNpbmNlIHRob3NlIGFyZSB0aGUgU0RMIG1vdXNld2hlZWwgYnV0dG9ucy4gKi8KKyAgICByZXR1cm4oYnV0dG9uICsgMyk7Cit9CisKKwordm9pZCBRWl9QdW1wRXZlbnRzIChfVEhJUykKK3sKKyAgICBpbnQzMl90IGR4LCBkeTsKKworICAgIE5TRGF0ZSAqZGlzdGFudFBhc3Q7CisgICAgTlNFdmVudCAqZXZlbnQ7CisgICAgTlNSZWN0IHdpblJlY3Q7CisgICAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7CisKKyAgICBpZiAoIVNETF9WaWRlb1N1cmZhY2UpCisgICAgICAgIHJldHVybjsgIC8qIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZXJlJ3Mgbm8gc2NyZWVuIHN1cmZhY2UuICovCisKKyAgICAvKiBVcGRhdGUgYWN0aXZpdHkgZXZlcnkgZml2ZSBzZWNvbmRzIHRvIHByZXZlbnQgc2NyZWVuc2F2ZXIuIC0tcnlhbi4gKi8KKyAgICBpZiAoIWFsbG93X3NjcmVlbnNhdmVyKSB7CisgICAgICAgIHN0YXRpYyBVaW50MzIgc2NyZWVuc2F2ZXJUaWNrczsKKyAgICAgICAgVWludDMyIG5vd1RpY2tzID0gU0RMX0dldFRpY2tzKCk7CisgICAgICAgIGlmICgobm93VGlja3MgLSBzY3JlZW5zYXZlclRpY2tzKSA+IDUwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFVwZGF0ZVN5c3RlbUFjdGl2aXR5KFVzckFjdGl2aXR5KTsKKyAgICAgICAgICAgIHNjcmVlbnNhdmVyVGlja3MgPSBub3dUaWNrczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBvb2wgPSBbIFsgTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2MgXSBpbml0IF07CisgICAgZGlzdGFudFBhc3QgPSBbIE5TRGF0ZSBkaXN0YW50UGFzdCBdOworCisgICAgd2luUmVjdCA9IE5TTWFrZVJlY3QgKDAsIDAsIFNETF9WaWRlb1N1cmZhY2UtPncsIFNETF9WaWRlb1N1cmZhY2UtPmgpOworICAgIAorICAgIC8qIHdoaWxlIGdyYWJiZWQsIGFjY3VtdWxhdGUgYWxsIG1vdXNlIG1vdmVkIGV2ZW50cyBpbnRvIG9uZSBTREwgbW91c2UgZXZlbnQgKi8KKyAgICBkeCA9IDA7CisgICAgZHkgPSAwOworICAgIAorICAgIGRvIHsKKyAgICAKKyAgICAgICAgLyogUG9sbCBmb3IgYW4gZXZlbnQuIFRoaXMgd2lsbCBub3QgYmxvY2sgKi8KKyAgICAgICAgZXZlbnQgPSBbIE5TQXBwIG5leHRFdmVudE1hdGNoaW5nTWFzazpOU0FueUV2ZW50TWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWxEYXRlOmRpc3RhbnRQYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGU6IE5TRGVmYXVsdFJ1bkxvb3BNb2RlIGRlcXVldWU6WUVTIF07CisgICAgICAgIGlmIChldmVudCAhPSBuaWwpIHsKKworICAgICAgICAgICAgaW50IGJ1dHRvbjsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB0eXBlOworICAgICAgICAgICAgQk9PTCBpc0luR2FtZVdpbjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgI2RlZmluZSBET19NT1VTRV9ET1dOKGJ1dHRvbikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUyApIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uIChTRExfUFJFU1NFRCwgYnV0dG9uLCAwLCAwKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RfbW91c2VfdXAgfD0gMTw8YnV0dG9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTlNBcHAgc2VuZEV2ZW50OmV2ZW50IF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSB3aGlsZSgwKQorICAgICAgICAgICAgCisgICAgICAgICAgICAjZGVmaW5lIERPX01PVVNFX1VQKGJ1dHRvbikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZXhwZWN0X21vdXNlX3VwICYgKDE8PGJ1dHRvbikgKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbiAoU0RMX1JFTEVBU0VELCBidXR0b24sIDAsIDApOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9tb3VzZV91cCAmPSB+KDE8PGJ1dHRvbik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIE5TQXBwIHNlbmRFdmVudDpldmVudCBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IHdoaWxlKDApCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHR5cGUgPSBbIGV2ZW50IHR5cGUgXTsKKyAgICAgICAgICAgIGlzSW5HYW1lV2luID0gUVpfSXNNb3VzZUluV2luZG93ICh0aGlzKTsKKworICAgICAgICAgICAgUVpfRG9Nb2RpZmllcnModGhpcywgWyBldmVudCBtb2RpZmllckZsYWdzIF0gKTsKKworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOU0xlZnRNb3VzZURvd246CisgICAgICAgICAgICAgICAgICAgIGlmICggU0RMX2dldGVudigiU0RMX0hBUzNCVVRUT05NT1VTRSIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgRE9fTU9VU0VfRE9XTiAoU0RMX0JVVFRPTl9MRUZUKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTlNDb21tYW5kS2V5TWFzayAmIGN1cnJlbnRfbW9kcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3ZpcnR1YWxfYnV0dG9uID0gU0RMX0JVVFRPTl9SSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBET19NT1VTRV9ET1dOIChTRExfQlVUVE9OX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBOU0FsdGVybmF0ZUtleU1hc2sgJiBjdXJyZW50X21vZHMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF92aXJ0dWFsX2J1dHRvbiA9IFNETF9CVVRUT05fTUlERExFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPX01PVVNFX0RPV04gKFNETF9CVVRUT05fTUlERExFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPX01PVVNFX0RPV04gKFNETF9CVVRUT05fTEVGVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5TTGVmdE1vdXNlVXA6CisgICAgICAgICAgICAgICAgICAgIGlmICggbGFzdF92aXJ0dWFsX2J1dHRvbiAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgRE9fTU9VU0VfVVAgKGxhc3RfdmlydHVhbF9idXR0b24pOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF92aXJ0dWFsX2J1dHRvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBET19NT1VTRV9VUCAoU0RMX0JVVFRPTl9MRUZUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTlNPdGhlck1vdXNlRG93bjoKKyAgICAgICAgICAgICAgICBjYXNlIE5TUmlnaHRNb3VzZURvd246CisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IFFaX090aGVyTW91c2VCdXR0b25Ub1NETChbIGV2ZW50IGJ1dHRvbk51bWJlciBdKTsKKyAgICAgICAgICAgICAgICAgICAgRE9fTU9VU0VfRE9XTiAoYnV0dG9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5TT3RoZXJNb3VzZVVwOgorICAgICAgICAgICAgICAgIGNhc2UgTlNSaWdodE1vdXNlVXA6CisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IFFaX090aGVyTW91c2VCdXR0b25Ub1NETChbIGV2ZW50IGJ1dHRvbk51bWJlciBdKTsKKyAgICAgICAgICAgICAgICAgICAgRE9fTU9VU0VfVVAgKGJ1dHRvbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBOU1N5c3RlbURlZmluZWQ6CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICBGdXR1cmU6IHVwIHRvIDMyICJtb3VzZSIgYnV0dG9ucyBjYW4gYmUgaGFuZGxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbZXZlbnQgc3VidHlwZV0gPT0gNykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBidXR0b25zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBbIGV2ZW50IGRhdGEyIF07CisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTlNMZWZ0TW91c2VEcmFnZ2VkOgorICAgICAgICAgICAgICAgIGNhc2UgTlNSaWdodE1vdXNlRHJhZ2dlZDoKKyAgICAgICAgICAgICAgICBjYXNlIE5TT3RoZXJNb3VzZURyYWdnZWQ6IC8qIHVzdWFsbHkgbWlkZGxlIG1vdXNlIGRyYWdnZWQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIE5TTW91c2VNb3ZlZDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBncmFiX3N0YXRlID09IFFaX0lOVklTSUJMRV9HUkFCICkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBpbnB1dCBpcyBncmFiYmVkK2hpZGRlbiwgdGhlIGN1cnNvciBkb2Vzbid0IG1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gd2UgaGF2ZSB0byBjYWxsIHRoZSBsb3dsZXZlbCB3aW5kb3cgc2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uIFRoaXMgaXMgbGVzcyBhY2N1cmF0ZSBidXQgd29ya3MgT0suICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHgxLCBkeTE7CisgICAgICAgICAgICAgICAgICAgICAgICBDR0dldExhc3RNb3VzZURlbHRhICgmZHgxLCAmZHkxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR4ICs9IGR4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR5ICs9IGR5MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQgdGhlIGFic29sdXRlIG1vdXNlIGxvY2F0aW9uLiBUaGlzIGlzIG5vdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZSBsb2NhdGlvbiBhZnRlciB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhlICpjdXJyZW50KiBtb3VzZSBsb2NhdGlvbiwgaS5lLiBhZnRlciBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nIGV2ZW50cy4gVGhpcyBtZWFucyB0aGF0IGlmIHRoZXJlIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIG1vdXNlIG1vdmVkIGV2ZW50cyBpbiB0aGUgcXVldWUsIHdlIG1ha2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBpZGVudGljYWwgY2FsbHMgdG8gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aGF0J3Mgbm8gcHJvYmxlbSBzaW5jZSB0aGUgbGF0dGVyIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZXMgU0RMIGV2ZW50cyBmb3Igbm9uemVybyBtb3ZlbWVudHMuIEluIG15CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJpZW5jZSBvbiBQQkc0LzEwLjQuOCwgdGhpcyByYXJlbHkgaGFwcGVucyBhbnl3YXkuCisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgTlNQb2ludCBwOworICAgICAgICAgICAgICAgICAgICAgICAgUVpfR2V0TW91c2VMb2NhdGlvbiAodGhpcywgJnApOworICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZU1vdGlvbiAoMCwgMCwgcC54LCBwLnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSBncmFiIGlucHV0K2N1cnNvciB2aXNpYmxlIGJ5IHdhcnBpbmcgdGhlIGN1cnNvciBiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBnYW1lIHdpbmRvdy4gVGhpcyBzdGlsbCBnZW5lcmF0ZXMgYSBtb3VzZSBtb3ZlZCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBub3QgYXMgYSByZXN1bHQgb2YgdGhlIHdhcnAgKHNvIGl0J3MgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbikuCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICggZ3JhYl9zdGF0ZSA9PSBRWl9WSVNJQkxFX0dSQUIgJiYgIWlzSW5HYW1lV2luICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TUG9pbnQgcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFaX0dldE1vdXNlTG9jYXRpb24gKHRoaXMsICZwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwLnggPCAwLjAgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnggPSAwLjA7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcC55IDwgMC4wICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC55ID0gMC4wOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHAueCA+PSB3aW5SZWN0LnNpemUud2lkdGggKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnggPSB3aW5SZWN0LnNpemUud2lkdGgtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwLnkgPj0gd2luUmVjdC5zaXplLmhlaWdodCApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAueSA9IHdpblJlY3Quc2l6ZS5oZWlnaHQtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgUVpfUHJpdmF0ZVdhcnBDdXJzb3IgKHRoaXMsIHAueCwgcC55KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmICggIWlzSW5HYW1lV2luICYmIChTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBNT1VTRUZPQ1VTKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhYl9zdGF0ZSA9PSBRWl9JTlZJU0lCTEVfR1JBQikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBjdXJzb3IgaGFzIGxlZnQgdGhlIHdpbmRvdyBldmVuIHRob3VnaCBpdCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNzb2NpYXRlZCBmcm9tIHRoZSBtb3VzZSAoYW5kIHRoZXJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkbid0IG1vdmUpOiB0aGlzIGNhbiBoYXBwZW4gd2l0aCBXYWNvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGV0cywgYW5kIGl0IGVmZmVjdGl2ZWx5IGJyZWFrcyB0aGUgZ3JhYiwgc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlIGRvd24gZXZlbnRzIG5vdyBnbyB0byBiYWNrZ3JvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMuIFRoZSBvbmx5IHBvc3NpYmlsaXR5IHRvIGF2b2lkIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW1zIHRvIGJlIHRhbGtpbmcgdG8gdGhlIHRhYmxldCBkcml2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBcHBsZUV2ZW50cykgdG8gY29uc3RyYWluIGl0cyBtYXBwZWQgYXJlYSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdywgd2hpY2ggbWF5IG5vdCBiZSB3b3J0aCB0aGUgZWZmb3J0LiBGb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdywgaGFuZGxlIHRoZSBjb25kaXRpb24gbW9yZSBncmFjZWZ1bGx5IHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBieSByZWFzc29jaWF0aW5nIGN1cnNvciBhbmQgbW91c2UgdW50aWwgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgZW50ZXJzIHRoZSB3aW5kb3cgYWdhaW4sIG1ha2luZyBpdCBvYnZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgdXNlciB0aGF0IHRoZSBncmFiIGlzIGJyb2tlbi4qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHQXNzb2NpYXRlTW91c2VBbmRNb3VzZUN1cnNvclBvc2l0aW9uICgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgUVpfVXBkYXRlQ3Vyc29yKHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpc0luR2FtZVdpbiAmJiAoU0RMX0dldEFwcFN0YXRlKCkgJiAoU0RMX0FQUE1PVVNFRk9DVVMgfCBTRExfQVBQSU5QVVRGT0NVUykpID09IFNETF9BUFBJTlBVVEZPQ1VTICkgeworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlICgxLCBTRExfQVBQTU9VU0VGT0NVUyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFFaX1VwZGF0ZUN1cnNvcih0aGlzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyYWJfc3RhdGUgPT0gUVpfSU5WSVNJQkxFX0dSQUIpIHsgLypzZWUgY29tbWVudCBhYm92ZSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVpfUHJpdmF0ZVdhcnBDdXJzb3IgKHRoaXMsIFNETF9WaWRlb1N1cmZhY2UtPncgLyAyLCBTRExfVmlkZW9TdXJmYWNlLT5oIC8gMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dBc3NvY2lhdGVNb3VzZUFuZE1vdXNlQ3Vyc29yUG9zaXRpb24gKDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTlNTY3JvbGxXaGVlbDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpc0luR2FtZVdpbiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGR5LCBkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQ4IGJ1dHRvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR5ID0gWyBldmVudCBkZWx0YVkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR4ID0gWyBldmVudCBkZWx0YVggXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZHkgPiAwLjAgKSAvKiBTY3JvbGwgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b24gPSBTRExfQlVUVE9OX1dIRUVMVVA7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZHkgPCAwLjAgKSAvKiBTY3JvbGwgZG93biAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IFNETF9CVVRUT05fV0hFRUxET1dOOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBIb3Jpem9udGFsIHNjcm9sbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIG5vdywgd2hlZWwgaXMgc2VudCBhcyBhIHF1aWNrIGRvd24rdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VCdXR0b24gKFNETF9QUkVTU0VELCBidXR0b24sIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbiAoU0RMX1JFTEVBU0VELCBidXR0b24sIDAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTlNLZXlVcDoKKyAgICAgICAgICAgICAgICAgICAgUVpfRG9LZXkgKHRoaXMsIFNETF9SRUxFQVNFRCwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5TS2V5RG93bjoKKyAgICAgICAgICAgICAgICAgICAgUVpfRG9LZXkgKHRoaXMsIFNETF9QUkVTU0VELCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTlNGbGFnc0NoYW5nZWQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTlNBcHBLaXREZWZpbmVkOgorICAgICAgICAgICAgICAgICAgICBbIE5TQXBwIHNlbmRFdmVudDpldmVudCBdOworICAgICAgICAgICAgICAgICAgICBpZiAoWyBldmVudCBzdWJ0eXBlIF0gPT0gTlNBcHBsaWNhdGlvbkFjdGl2YXRlZEV2ZW50VHlwZSAmJiAobW9kZV9mbGFncyAmIFNETF9GVUxMU0NSRUVOKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGRlZmF1bHQgaGFuZGxpbmcgb2YgdGhpcyBldmVudCBzZWVtcyB0byByZXNldCBhbnkgY3Vyc29yIHNldCBieSBbTlNDdXJzb3Igc2V0XSAodXNlZCBieSBTRExfU2V0Q3Vyc29yKCkgaW4gZnVsbHNjcmVlbiBtb2RlKSB0byB0aGUgZGVmYXVsdCBzeXN0ZW0gYXJyb3cgY3Vyc29yICovCisgICAgICAgICAgICAgICAgICAgICAgICBTRExfQ3Vyc29yICpzZGxjID0gU0RMX0dldEN1cnNvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNkbGMgIT0gTlVMTCAmJiBzZGxjLT53bV9jdXJzb3IgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgc2RsYy0+d21fY3Vyc29yLT5uc2N1cnNvciBzZXQgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogY2FzZSBOU0FwcGxpY2F0aW9uRGVmaW5lZDogYnJlYWs7ICovCisgICAgICAgICAgICAgICAgICAgIC8qIGNhc2UgTlNQZXJpb2RpYzogYnJlYWs7ICovCisgICAgICAgICAgICAgICAgICAgIC8qIGNhc2UgTlNDdXJzb3JVcGRhdGU6IGJyZWFrOyAqLworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFsgTlNBcHAgc2VuZEV2ZW50OmV2ZW50IF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChldmVudCAhPSBuaWwpOworICAgIAorICAgIC8qIGhhbmRsZSBhY2N1bXVsYXRlZCBtb3VzZSBtb3ZlZCBldmVudHMgKi8KKyAgICBpZiAoZHggIT0gMCB8fCBkeSAhPSAwKQorICAgICAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uICgwLCAxLCBkeCwgZHkpOworICAgIAorICAgIFsgcG9vbCByZWxlYXNlIF07Cit9CisKK3ZvaWQgUVpfVXBkYXRlTW91c2UgKF9USElTKQoreworICAgIE5TUG9pbnQgcDsKKyAgICBRWl9HZXRNb3VzZUxvY2F0aW9uICh0aGlzLCAmcCk7CisgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKFFaX0lzTW91c2VJbldpbmRvdyAodGhpcyksIFNETF9BUFBNT1VTRUZPQ1VTKTsKKyAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uICgwLCAwLCBwLngsIHAueSk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6R0wubSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpHTC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOGRjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6R0wubQpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiAgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX1F1YXJ0elZpZGVvLmgiCisKKy8qCisgKiBHTF9BUkJfTXVsdGlzYW1wbGUgaXMgc3VwcG9zZWQgdG8gYmUgYXZhaWxhYmxlIGluIDEwLjEsIGFjY29yZGluZyB0byBBcHBsZToKKyAqCisgKiAgIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2dyYXBoaWNzaW1hZ2luZy9vcGVuZ2wvZXh0ZW5zaW9ucy5odG1sI0dMX0FSQl9tdWx0aXNhbXBsZQorICoKKyAqICAuLi5idXQgaXQgaXNuJ3QgaW4gdGhlIHN5c3RlbSBoZWFkZXJzLCBhY2NvcmRpbmcgdG8gU2FtOgorICoKKyAqICAgaHR0cDovL2xpc3RzLmxpYnNkbC5vcmcvcGlwZXJtYWlsL3NkbC1saWJzZGwub3JnLzIwMDMtRGVjZW1iZXIvMDM5Nzk0Lmh0bWwKKyAqCisgKiBUaGVzZSBhcmUgbm9ybWFsbHkgZW51bXMgYW5kIG5vdCAjZGVmaW5lcyBpbiB0aGUgc3lzdGVtIGhlYWRlcnMuCisgKgorICogICAtLXJ5YW4uCisgKi8KKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IDEwMjApCisjZGVmaW5lIE5TT3BlbkdMUEZBU2FtcGxlQnVmZmVycyAoKE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUpIDU1KQorI2RlZmluZSBOU09wZW5HTFBGQVNhbXBsZXMgKChOU09wZW5HTFBpeGVsRm9ybWF0QXR0cmlidXRlKSA1NikKKyNlbmRpZgorCisjaWZkZWYgX19wb3dlcnBjX18gICAvKiB3ZSBsb3N0IHRoaXMgaW4gMTAuNiwgd2hpY2ggaGFzIG5vIFBQQyBzdXBwb3J0LiAqLworQGltcGxlbWVudGF0aW9uIE5TT3BlbkdMQ29udGV4dCAoQ0dMQ29udGV4dEFjY2VzcykKKy0gKENHTENvbnRleHRPYmopIGNnbENvbnRleHQ7Cit7CisgICAgcmV0dXJuIF9jb250ZXh0QXV4aWxpYXJ5OworfQorQGVuZAorQ0dMQ29udGV4dE9iaiBRWl9HZXRDR0xDb250ZXh0T2JqKE5TT3BlbkdMQ29udGV4dCAqbnNjdHgpCit7CisgICAgcmV0dXJuIFtuc2N0eCBjZ2xDb250ZXh0XTsKK30KKyNlbHNlCitDR0xDb250ZXh0T2JqIFFaX0dldENHTENvbnRleHRPYmooTlNPcGVuR0xDb250ZXh0ICpuc2N0eCkKK3sKKyAgICByZXR1cm4gKENHTENvbnRleHRPYmopIFtuc2N0eCBDR0xDb250ZXh0T2JqXTsKK30KKyNlbmRpZgorCisKKy8qIE9wZW5HTCBoZWxwZXIgZnVuY3Rpb25zICh1c2VkIGludGVybmFsbHkpICovCisKK2ludCBRWl9TZXR1cE9wZW5HTCAoX1RISVMsIGludCBicHAsIFVpbnQzMiBmbGFncykgeworCisgICAgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyWzMyXTsKKyAgICBOU09wZW5HTFBpeGVsRm9ybWF0ICpmbXQ7CisgICAgaW50IGkgPSAwOworICAgIGludCBjb2xvckJpdHMgPSBicHA7CisKKyAgICAvKiBpZiBhIEdMIGxpYnJhcnkgaGFzbid0IGJlZW4gbG9hZGVkIGF0IHRoaXMgcG9pbnQsIGxvYWQgdGhlIGRlZmF1bHQuICovCisgICAgaWYgKCF0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCkgeworICAgICAgICBpZiAoUVpfR0xfTG9hZExpYnJhcnkodGhpcywgTlVMTCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7CisKKyAgICAgICAgYXR0cltpKytdID0gTlNPcGVuR0xQRkFGdWxsU2NyZWVuOworICAgIH0KKyAgICAvKiBJbiB3aW5kb3dlZCBtb2RlLCB0aGUgT3BlbkdMIHBpeGVsIGRlcHRoIG11c3QgbWF0Y2ggZGV2aWNlIHBpeGVsIGRlcHRoICovCisgICAgZWxzZSBpZiAoIGNvbG9yQml0cyAhPSBkZXZpY2VfYnBwICkgeworCisgICAgICAgIGNvbG9yQml0cyA9IGRldmljZV9icHA7CisgICAgfQorCisgICAgYXR0cltpKytdID0gTlNPcGVuR0xQRkFDb2xvclNpemU7CisgICAgYXR0cltpKytdID0gY29sb3JCaXRzOworCisgICAgYXR0cltpKytdID0gTlNPcGVuR0xQRkFEZXB0aFNpemU7CisgICAgYXR0cltpKytdID0gdGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemU7CisKKyAgICBpZiAoIHRoaXMtPmdsX2NvbmZpZy5kb3VibGVfYnVmZmVyICkgeworICAgICAgICBhdHRyW2krK10gPSBOU09wZW5HTFBGQURvdWJsZUJ1ZmZlcjsKKyAgICB9CisKKyAgICBpZiAoIHRoaXMtPmdsX2NvbmZpZy5zdGVyZW8gKSB7CisgICAgICAgIGF0dHJbaSsrXSA9IE5TT3BlbkdMUEZBU3RlcmVvOworICAgIH0KKworICAgIGlmICggdGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZSAhPSAwICkgeworICAgICAgICBhdHRyW2krK10gPSBOU09wZW5HTFBGQVN0ZW5jaWxTaXplOworICAgICAgICBhdHRyW2krK10gPSB0aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplOworICAgIH0KKworICAgIGlmICggKHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZSArCisgICAgICAgICAgdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemUgKworICAgICAgICAgIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemUgKworICAgICAgICAgIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9hbHBoYV9zaXplKSA+IDAgKSB7CisgICAgICAgIGF0dHJbaSsrXSA9IE5TT3BlbkdMUEZBQWNjdW1TaXplOworICAgICAgICBhdHRyW2krK10gPSB0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemUgKyB0aGlzLT5nbF9jb25maWcuYWNjdW1fZ3JlZW5fc2l6ZSArIHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemUgKyB0aGlzLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZWJ1ZmZlcnMgIT0gMCApIHsKKyAgICAgICAgYXR0cltpKytdID0gTlNPcGVuR0xQRkFTYW1wbGVCdWZmZXJzOworICAgICAgICBhdHRyW2krK10gPSB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVidWZmZXJzOworICAgIH0KKworICAgIGlmICggdGhpcy0+Z2xfY29uZmlnLm11bHRpc2FtcGxlc2FtcGxlcyAhPSAwICkgeworICAgICAgICBhdHRyW2krK10gPSBOU09wZW5HTFBGQVNhbXBsZXM7CisgICAgICAgIGF0dHJbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXM7CisgICAgICAgIGF0dHJbaSsrXSA9IE5TT3BlbkdMUEZBTm9SZWNvdmVyeTsKKyAgICB9CisKKyAgICBpZiAoIHRoaXMtPmdsX2NvbmZpZy5hY2NlbGVyYXRlZCA+IDAgKSB7CisgICAgICAgIGF0dHJbaSsrXSA9IE5TT3BlbkdMUEZBQWNjZWxlcmF0ZWQ7CisgICAgfQorCisgICAgYXR0cltpKytdID0gTlNPcGVuR0xQRkFTY3JlZW5NYXNrOworICAgIGF0dHJbaSsrXSA9IENHRGlzcGxheUlEVG9PcGVuR0xEaXNwbGF5TWFzayAoZGlzcGxheV9pZCk7CisgICAgYXR0cltpXSA9IDA7CisKKyAgICBmbXQgPSBbIFsgTlNPcGVuR0xQaXhlbEZvcm1hdCBhbGxvYyBdIGluaXRXaXRoQXR0cmlidXRlczphdHRyIF07CisgICAgaWYgKGZtdCA9PSBuaWwpIHsKKyAgICAgICAgU0RMX1NldEVycm9yICgiRmFpbGVkIGNyZWF0aW5nIE9wZW5HTCBwaXhlbCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZ2xfY29udGV4dCA9IFsgWyBOU09wZW5HTENvbnRleHQgYWxsb2MgXSBpbml0V2l0aEZvcm1hdDpmbXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVDb250ZXh0Om5pbF07CisKKyAgICBbIGZtdCByZWxlYXNlIF07CisKKyAgICBpZiAoZ2xfY29udGV4dCA9PSBuaWwpIHsKKyAgICAgICAgU0RMX1NldEVycm9yICgiRmFpbGVkIGNyZWF0aW5nIE9wZW5HTCBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFN5bmNocm9uaXplIFFaX0dMX1N3YXBCdWZmZXJzKCkgdG8gdmVydGljYWwgcmV0cmFjZS4KKyAgICAgKiAoQXBwbGUncyBkb2N1bWVudGF0aW9uIGlzIG5vdCBjb21wbGV0ZWx5IGNsZWFyIGFib3V0IHdoYXQgdGhpcyBzZXR0aW5nCisgICAgICogZXhhY3RseSBkb2VzLCBJTUhPIC0gZm9yIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gc2VlCisgICAgICogaHR0cDovL2xpc3RzLmFwcGxlLmNvbS9hcmNoaXZlcy9tYWMtb3BlbmdsLzIwMDYvSmFuL21zZzAwMDgwLmh0bWwgKQorICAgICAqLworICAgIGlmICggdGhpcy0+Z2xfY29uZmlnLnN3YXBfY29udHJvbCA+PSAwICkgeworICAgICAgICBHTGludCB2YWx1ZTsKKyAgICAgICAgdmFsdWUgPSB0aGlzLT5nbF9jb25maWcuc3dhcF9jb250cm9sOworICAgICAgICBbIGdsX2NvbnRleHQgc2V0VmFsdWVzOiAmdmFsdWUgZm9yUGFyYW1ldGVyOiBOU09wZW5HTENQU3dhcEludGVydmFsIF07CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXaXNkb20gZnJvbSBBcHBsZSBlbmdpbmVlciBpbiByZWZlcmVuY2UgdG8gVVQyMDAzJ3MgT3BlbkdMIHBlcmZvcm1hbmNlOgorICAgICAqICAiWW91IGFyZSBibG93aW5nIGEgY291cGxlIG9mIHRoZSBpbnRlcm5hbCBPcGVuR0wgZnVuY3Rpb24gY2FjaGVzLiBUaGlzCisgICAgICogIGFwcGVhcnMgdG8gYmUgaGFwcGVuaW5nIGluIHRoZSBWQU8gY2FzZS4gIFlvdSBjYW4gdGVsbCBPcGVuR0wgdG8gdXAKKyAgICAgKiAgdGhlIGNhY2hlIHNpemUgYnkgaXNzdWluZyB0aGUgZm9sbG93aW5nIGNhbGxzIHJpZ2h0IGFmdGVyIHlvdSBjcmVhdGUKKyAgICAgKiAgdGhlIE9wZW5HTCBjb250ZXh0LiAgVGhlIGRlZmF1bHQgY2FjaGUgc2l6ZSBpcyAxNi4iICAgIC0tcnlhbi4KKyAgICAgKi8KKworICAgICNpZm5kZWYgR0xJX0FSUkFZX0ZVTkNfQ0FDSEVfTUFYCisgICAgI2RlZmluZSBHTElfQVJSQVlfRlVOQ19DQUNIRV9NQVggMjg0CisgICAgI2VuZGlmCisKKyAgICAjaWZuZGVmIEdMSV9TVUJNSVRfRlVOQ19DQUNIRV9NQVgKKyAgICAjZGVmaW5lIEdMSV9TVUJNSVRfRlVOQ19DQUNIRV9NQVggMjgwCisgICAgI2VuZGlmCisKKyAgICB7CisgICAgICAgIEdMaW50IGNhY2hlX21heCA9IDY0OworICAgICAgICBDR0xDb250ZXh0T2JqIGN0eCA9IFFaX0dldENHTENvbnRleHRPYmooZ2xfY29udGV4dCk7CisgICAgICAgIENHTFNldFBhcmFtZXRlciAoY3R4LCBHTElfU1VCTUlUX0ZVTkNfQ0FDSEVfTUFYLCAmY2FjaGVfbWF4KTsKKyAgICAgICAgQ0dMU2V0UGFyYW1ldGVyIChjdHgsIEdMSV9BUlJBWV9GVU5DX0NBQ0hFX01BWCwgJmNhY2hlX21heCk7CisgICAgfQorCisgICAgLyogRW5kIFdpc2RvbSBmcm9tIEFwcGxlIEVuZ2luZWVyIHNlY3Rpb24uIC0tcnlhbi4gKi8KKworICAgIHJldHVybiAxOworfQorCit2b2lkIFFaX1RlYXJEb3duT3BlbkdMIChfVEhJUykgeworCisgICAgWyBOU09wZW5HTENvbnRleHQgY2xlYXJDdXJyZW50Q29udGV4dCBdOworICAgIFsgZ2xfY29udGV4dCBjbGVhckRyYXdhYmxlIF07CisgICAgWyBnbF9jb250ZXh0IHJlbGVhc2UgXTsKK30KKworCisvKiBTREwgT3BlbkdMIGZ1bmN0aW9ucyAqLworc3RhdGljIGNvbnN0IGNoYXIgKkRFRkFVTFRfT1BFTkdMX0xJQl9OQU1FID0KKyAgICAiL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvT3BlbkdMLmZyYW1ld29yay9MaWJyYXJpZXMvbGliR0wuZHlsaWIiOworCitpbnQgICAgUVpfR0xfTG9hZExpYnJhcnkgICAgKF9USElTLCBjb25zdCBjaGFyICpsb2NhdGlvbikgeworICAgIGlmICggZ2xfY29udGV4dCAhPSBOVUxMICkgeworICAgICAgICBTRExfU2V0RXJyb3IoIk9wZW5HTCBjb250ZXh0IGFscmVhZHkgY3JlYXRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG9wZW5nbF9saWJyYXJ5ICE9IE5VTEwpCisgICAgICAgIFNETF9VbmxvYWRPYmplY3Qob3BlbmdsX2xpYnJhcnkpOworCisgICAgaWYgKGxvY2F0aW9uID09IE5VTEwpCisgICAgICAgIGxvY2F0aW9uID0gREVGQVVMVF9PUEVOR0xfTElCX05BTUU7CisKKyAgICBvcGVuZ2xfbGlicmFyeSA9IFNETF9Mb2FkT2JqZWN0KGxvY2F0aW9uKTsKKyAgICBpZiAob3BlbmdsX2xpYnJhcnkgIT0gTlVMTCkgeworICAgICAgICB0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMDsKKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQqICBRWl9HTF9HZXRQcm9jQWRkcmVzcyAoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpIHsKKyAgICByZXR1cm4gU0RMX0xvYWRGdW5jdGlvbihvcGVuZ2xfbGlicmFyeSwgcHJvYyk7Cit9CisKK2ludCAgICBRWl9HTF9HZXRBdHRyaWJ1dGUgICAoX1RISVMsIFNETF9HTGF0dHIgYXR0cmliLCBpbnQqIHZhbHVlKSB7CisKKyAgICBHTGVudW0gYXR0ciA9IDA7CisKKyAgICBRWl9HTF9NYWtlQ3VycmVudCAodGhpcyk7CisKKyAgICBzd2l0Y2ggKGF0dHJpYikgeworICAgICAgICBjYXNlIFNETF9HTF9SRURfU0laRTogYXR0ciA9IEdMX1JFRF9CSVRTOyAgIGJyZWFrOworICAgICAgICBjYXNlIFNETF9HTF9CTFVFX1NJWkU6IGF0dHIgPSBHTF9CTFVFX0JJVFM7ICBicmVhazsKKyAgICAgICAgY2FzZSBTRExfR0xfR1JFRU5fU0laRTogYXR0ciA9IEdMX0dSRUVOX0JJVFM7IGJyZWFrOworICAgICAgICBjYXNlIFNETF9HTF9BTFBIQV9TSVpFOiBhdHRyID0gR0xfQUxQSEFfQklUUzsgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX0RPVUJMRUJVRkZFUjogYXR0ciA9IEdMX0RPVUJMRUJVRkZFUjsgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX0RFUFRIX1NJWkU6IGF0dHIgPSBHTF9ERVBUSF9CSVRTOyAgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX1NURU5DSUxfU0laRTogYXR0ciA9IEdMX1NURU5DSUxfQklUUzsgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX0FDQ1VNX1JFRF9TSVpFOiBhdHRyID0gR0xfQUNDVU1fUkVEX0JJVFM7IGJyZWFrOworICAgICAgICBjYXNlIFNETF9HTF9BQ0NVTV9HUkVFTl9TSVpFOiBhdHRyID0gR0xfQUNDVU1fR1JFRU5fQklUUzsgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0JMVUVfU0laRTogYXR0ciA9IEdMX0FDQ1VNX0JMVUVfQklUUzsgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0FMUEhBX1NJWkU6IGF0dHIgPSBHTF9BQ0NVTV9BTFBIQV9CSVRTOyBicmVhazsKKyAgICAgICAgY2FzZSBTRExfR0xfU1RFUkVPOiBhdHRyID0gR0xfU1RFUkVPOyBicmVhazsKKyAgICAgICAgY2FzZSBTRExfR0xfTVVMVElTQU1QTEVCVUZGRVJTOiBhdHRyID0gR0xfU0FNUExFX0JVRkZFUlNfQVJCOyBicmVhazsKKyAgICAgICAgY2FzZSBTRExfR0xfTVVMVElTQU1QTEVTQU1QTEVTOiBhdHRyID0gR0xfU0FNUExFU19BUkI7IGJyZWFrOworICAgICAgICBjYXNlIFNETF9HTF9CVUZGRVJfU0laRToKKyAgICAgICAgeworICAgICAgICAgICAgR0xpbnQgYml0cyA9IDA7CisgICAgICAgICAgICBHTGludCBjb21wb25lbnQ7CisKKyAgICAgICAgICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHNpbmdsZSBmbGFnIGluIE9wZW5HTCBmb3IgdGhpcyEgKi8KKyAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYgKEdMX1JFRF9CSVRTLCAmY29tcG9uZW50KTsgICBiaXRzICs9IGNvbXBvbmVudDsKKyAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYgKEdMX0dSRUVOX0JJVFMsJmNvbXBvbmVudCk7ICBiaXRzICs9IGNvbXBvbmVudDsKKyAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYgKEdMX0JMVUVfQklUUywgJmNvbXBvbmVudCk7ICBiaXRzICs9IGNvbXBvbmVudDsKKyAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYgKEdMX0FMUEhBX0JJVFMsICZjb21wb25lbnQpOyBiaXRzICs9IGNvbXBvbmVudDsKKworICAgICAgICAgICAgKnZhbHVlID0gYml0czsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGNhc2UgU0RMX0dMX0FDQ0VMRVJBVEVEX1ZJU1VBTDoKKyAgICAgICAgeworICAgICAgICAgICAgR0xpbnQgdmFsOworCSAgICAvKiBGSVhNRTogSG93IGRvIHdlIGdldCB0aGlzIGluZm9ybWF0aW9uIGhlcmU/CisgICAgICAgICAgICBbZm10IGdldFZhbHVlczogJnZhbCBmb3JBdHRyaWJ1dGU6IE5TT3BlbkdMUEZBQWNjZWxlcmF0ZWQgYXR0ciBmb3JWaXJ0dWFsU2NyZWVuOiAwXTsKKwkgICAgKi8KKwkgICAgdmFsID0gKHRoaXMtPmdsX2NvbmZpZy5hY2NlbGVyYXRlZCAhPSAwKTs7CisgICAgICAgICAgICAqdmFsdWUgPSB2YWw7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNETF9HTF9TV0FQX0NPTlRST0w6CisgICAgICAgIHsKKyAgICAgICAgICAgIEdMaW50IHZhbDsKKyAgICAgICAgICAgIFsgZ2xfY29udGV4dCBnZXRWYWx1ZXM6ICZ2YWwgZm9yUGFyYW1ldGVyOiBOU09wZW5HTENQU3dhcEludGVydmFsIF07CisgICAgICAgICAgICAqdmFsdWUgPSB2YWw7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdsR2V0SW50ZWdlcnYgKGF0dHIsIChHTGludCAqKXZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50ICAgIFFaX0dMX01ha2VDdXJyZW50ICAgIChfVEhJUykgeworICAgIFsgZ2xfY29udGV4dCBtYWtlQ3VycmVudENvbnRleHQgXTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCAgIFFaX0dMX1N3YXBCdWZmZXJzICAgIChfVEhJUykgeworICAgIFsgZ2xfY29udGV4dCBmbHVzaEJ1ZmZlciBdOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0ektleXMuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpLZXlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiNzg1OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpLZXlzLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhlc2UgYXJlIHRoZSBNYWNpbnRvc2gga2V5IHNjYW5jb2RlIGNvbnN0YW50cyAtLSBmcm9tIEluc2lkZSBNYWNpbnRvc2ggKi8KKworI2RlZmluZSBRWl9FU0NBUEUJCTB4MzUKKyNkZWZpbmUgUVpfRjEJCQkweDdBCisjZGVmaW5lIFFaX0YyCQkJMHg3OAorI2RlZmluZSBRWl9GMwkJCTB4NjMKKyNkZWZpbmUgUVpfRjQJCQkweDc2CisjZGVmaW5lIFFaX0Y1CQkJMHg2MAorI2RlZmluZSBRWl9GNgkJCTB4NjEKKyNkZWZpbmUgUVpfRjcJCQkweDYyCisjZGVmaW5lIFFaX0Y4CQkJMHg2NAorI2RlZmluZSBRWl9GOQkJCTB4NjUKKyNkZWZpbmUgUVpfRjEwCQkJMHg2RAorI2RlZmluZSBRWl9GMTEJCQkweDY3CisjZGVmaW5lIFFaX0YxMgkJCTB4NkYKKyNkZWZpbmUgUVpfRjEzCQkJMHg2OQorI2RlZmluZSBRWl9GMTQJCQkweDZCCisjZGVmaW5lIFFaX0YxNQkJCTB4NzEKKy8qCisjZGVmaW5lIFFaX1BSSU5UCQkweDY5CisjZGVmaW5lIFFaX1NDUk9MTE9DSyAgICAweDZCCisjZGVmaW5lIFFaX1BBVVNFCQkweDcxCisqLworI2RlZmluZSBRWl9QT1dFUgkJMHg3RgorI2RlZmluZSBRWl9CQUNLUVVPVEUJMHgzMgorI2RlZmluZSBRWl8xCQkJMHgxMgorI2RlZmluZSBRWl8yCQkJMHgxMworI2RlZmluZSBRWl8zCQkJMHgxNAorI2RlZmluZSBRWl80CQkJMHgxNQorI2RlZmluZSBRWl81CQkJMHgxNworI2RlZmluZSBRWl82CQkJMHgxNgorI2RlZmluZSBRWl83CQkJMHgxQQorI2RlZmluZSBRWl84CQkJMHgxQworI2RlZmluZSBRWl85CQkJMHgxOQorI2RlZmluZSBRWl8wCQkJMHgxRAorI2RlZmluZSBRWl9NSU5VUwkJMHgxQgorI2RlZmluZSBRWl9FUVVBTFMJCTB4MTgKKyNkZWZpbmUgUVpfQkFDS1NQQUNFCTB4MzMKKyNkZWZpbmUgUVpfSU5TRVJUCQkweDcyCisjZGVmaW5lIFFaX0hPTUUJCQkweDczCisjZGVmaW5lIFFaX1BBR0VVUAkJMHg3NAorI2RlZmluZSBRWl9OVU1MT0NLCQkweDQ3CisjZGVmaW5lIFFaX0tQX0VRVUFMUwkweDUxCisjZGVmaW5lIFFaX0tQX0RJVklERQkweDRCCisjZGVmaW5lIFFaX0tQX01VTFRJUExZCTB4NDMKKyNkZWZpbmUgUVpfVEFCCQkJMHgzMAorI2RlZmluZSBRWl9xCQkJMHgwQworI2RlZmluZSBRWl93CQkJMHgwRAorI2RlZmluZSBRWl9lCQkJMHgwRQorI2RlZmluZSBRWl9yCQkJMHgwRgorI2RlZmluZSBRWl90CQkJMHgxMQorI2RlZmluZSBRWl95CQkJMHgxMAorI2RlZmluZSBRWl91CQkJMHgyMAorI2RlZmluZSBRWl9pCQkJMHgyMgorI2RlZmluZSBRWl9vCQkJMHgxRgorI2RlZmluZSBRWl9wCQkJMHgyMworI2RlZmluZSBRWl9MRUZUQlJBQ0tFVAkweDIxCisjZGVmaW5lIFFaX1JJR0hUQlJBQ0tFVAkweDFFCisjZGVmaW5lIFFaX0JBQ0tTTEFTSAkweDJBCisjZGVmaW5lIFFaX0RFTEVURQkJMHg3NQorI2RlZmluZSBRWl9FTkQJCQkweDc3CisjZGVmaW5lIFFaX1BBR0VET1dOCQkweDc5CisjZGVmaW5lIFFaX0tQNwkJCTB4NTkKKyNkZWZpbmUgUVpfS1A4CQkJMHg1QgorI2RlZmluZSBRWl9LUDkJCQkweDVDCisjZGVmaW5lIFFaX0tQX01JTlVTCQkweDRFCisjZGVmaW5lIFFaX0NBUFNMT0NLCQkweDM5CisjZGVmaW5lIFFaX2EJCQkweDAwCisjZGVmaW5lIFFaX3MJCQkweDAxCisjZGVmaW5lIFFaX2QJCQkweDAyCisjZGVmaW5lIFFaX2YJCQkweDAzCisjZGVmaW5lIFFaX2cJCQkweDA1CisjZGVmaW5lIFFaX2gJCQkweDA0CisjZGVmaW5lIFFaX2oJCQkweDI2CisjZGVmaW5lIFFaX2sJCQkweDI4CisjZGVmaW5lIFFaX2wJCQkweDI1CisjZGVmaW5lIFFaX1NFTUlDT0xPTgkweDI5CisjZGVmaW5lIFFaX1FVT1RFCQkweDI3CisjZGVmaW5lIFFaX1JFVFVSTgkJMHgyNAorI2RlZmluZSBRWl9LUDQJCQkweDU2CisjZGVmaW5lIFFaX0tQNQkJCTB4NTcKKyNkZWZpbmUgUVpfS1A2CQkJMHg1OAorI2RlZmluZSBRWl9LUF9QTFVTCQkweDQ1CisjZGVmaW5lIFFaX0xTSElGVAkJMHgzOAorI2RlZmluZSBRWl96CQkJMHgwNgorI2RlZmluZSBRWl94CQkJMHgwNworI2RlZmluZSBRWl9jCQkJMHgwOAorI2RlZmluZSBRWl92CQkJMHgwOQorI2RlZmluZSBRWl9iCQkJMHgwQgorI2RlZmluZSBRWl9uCQkJMHgyRAorI2RlZmluZSBRWl9tCQkJMHgyRQorI2RlZmluZSBRWl9DT01NQQkJMHgyQgorI2RlZmluZSBRWl9QRVJJT0QJCTB4MkYKKyNkZWZpbmUgUVpfU0xBU0gJCTB4MkMKKyNpZiAxCS8qIFBhbnRoZXIgbm93IGRlZmluZXMgcmlnaHQgc2lkZSBrZXlzICovCisjZGVmaW5lIFFaX1JTSElGVAkJMHgzQworI2VuZGlmCisjZGVmaW5lIFFaX1VQCQkJMHg3RQorI2RlZmluZSBRWl9LUDEJCQkweDUzCisjZGVmaW5lIFFaX0tQMgkJCTB4NTQKKyNkZWZpbmUgUVpfS1AzCQkJMHg1NQorI2RlZmluZSBRWl9LUF9FTlRFUgkJMHg0QworI2RlZmluZSBRWl9MQ1RSTAkJMHgzQgorI2RlZmluZSBRWl9MQUxUCQkJMHgzQQorI2RlZmluZSBRWl9MTUVUQQkJMHgzNworI2RlZmluZSBRWl9TUEFDRQkJMHgzMQorI2lmIDEJLyogUGFudGhlciBub3cgZGVmaW5lcyByaWdodCBzaWRlIGtleXMgKi8KKyNkZWZpbmUgUVpfUk1FVEEJCTB4MzYKKyNkZWZpbmUgUVpfUkFMVAkJCTB4M0QKKyNkZWZpbmUgUVpfUkNUUkwJCTB4M0UKKyNlbmRpZgorI2RlZmluZSBRWl9MRUZUCQkJMHg3QgorI2RlZmluZSBRWl9ET1dOCQkJMHg3RAorI2RlZmluZSBRWl9SSUdIVAkJMHg3QworI2RlZmluZSBRWl9LUDAJCQkweDUyCisjZGVmaW5lIFFaX0tQX1BFUklPRAkweDQxCisKKy8qIFdpZXJkLCB0aGVzZSBrZXlzIGFyZSBvbiBteSBpQm9vayB1bmRlciBNYWMgT1MgWCAqLworI2RlZmluZSBRWl9JQk9PS19FTlRFUgkJMHgzNAorI2RlZmluZSBRWl9JQk9PS19MRUZUCQkweDNCCisjZGVmaW5lIFFaX0lCT09LX1JJR0hUCQkweDNDCisjZGVmaW5lIFFaX0lCT09LX0RPV04JCTB4M0QKKyNkZWZpbmUgUVpfSUJPT0tfVVAJCQkweDNFCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6VmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpWaWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMGU0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6VmlkZW8uaApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiAgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiAgICAKKyAgICBAZmlsZSAgIFNETF9RdWFydHpWaWRlby5oCisgICAgQGF1dGhvciBEYXJyZWxsIFdhbGlzc2VyLCBNYXggSG9ybiwgZXQgYWwuCisgICAgCisgICAgQGFic3RyYWN0IFNETCB2aWRlbyBkcml2ZXIgZm9yIE1hYyBPUyBYLgorICAgIAorICAgIEBkaXNjdXNzaW9uCisgICAgCisgICAgVE9ETworICAgICAgICAtIEhhcmR3YXJlIEN1cnNvciBzdXBwb3J0IHdpdGggTlNDdXJzb3IgaW5zdGVhZCBvZiBDYXJib24KKyAgICAgICAgLSBLZXlib2FyZCByZXBlYXQvbW91c2Ugc3BlZWQgYWRqdXN0IChpZiBuZWVkZWQpCisgICAgICAgIC0gTXVsdGlwbGUgbW9uaXRvciBzdXBwb3J0IChjdXJyZW50bHkgb25seSBtYWluIGRpc3BsYXkpCisgICAgICAgIC0gQWNjZWxlcmF0ZWQgYmxpdHRpbmcgc3VwcG9ydAorICAgICAgICAtIEZpeCB3aGl0ZSBPcGVuR0wgd2luZG93IG9uIG1pbmltaXplIChmaXhlZCkgKHVwZGF0ZTogYnJva2VuIGFnYWluIG9uIDEwLjIpCisgICAgICAgIC0gRmluZCBvdXQgd2hhdCBldmVudHMgc2hvdWxkIGJlIHNlbnQvaWdub3JlZCBpZiB3aW5kb3cgaXMgbWluaW1pemVkCisgICAgICAgIC0gRmluZCBhIHdheSB0byBkZWFsIHdpdGggZXh0ZXJuYWwgcmVzb2x1dGlvbi9kZXB0aCBzd2l0Y2ggd2hpbGUgYXBwIGlzIHJ1bm5pbmcKKyAgICAgICAgLSBDaGVjayBhY2N1cmFjeSBvZiBRWl9TZXRHYW1tYSgpCisgICAgUHJvYmxlbXM6CisgICAgICAgIC0gT0dMIG5vdCB3b3JraW5nIGluIGZ1bGwgc2NyZWVuIHdpdGggc29mdHdhcmUgcmVuZGVyZXIKKyAgICAgICAgLSBTZXRDb2xvcnMgc2V0cyBwYWxldHRlIGNvcnJlY3RseSBidXQgY2xlYXJzIGZyYW1lYnVmZmVyCisgICAgICAgIC0gQ3Jhc2ggaW4gQ0cgYWZ0ZXIgc2V2ZXJhbCBtb2RlIHN3aXRjaGVzIChJIHRoaW5rIHRoaXMgaGFzIGJlZW4gZml4ZWQpCisgICAgICAgIC0gUmV0YWluZWQgd2luZG93cyBkb24ndCBkcmF3IHRoZWlyIHRpdGxlIGJhciBxdWl0ZSByaWdodCAoT1MgQnVnKSAobm90IHVzaW5nIHJldGFpbmVkIHdpbmRvd3MpCisgICAgICAgIC0gQ3Vyc29yIGluIDggYml0IG1vZGVzIGlzIHNjcmV3eSAobWlnaHQganVzdCBiZSBSYWRlb24gUENJIGJ1ZykgKHVwZGF0ZTogbm90IGp1c3QgUmFkZW9uKQorICAgICAgICAtIFdhcnBpbmcgY3Vyc29yIGRlbGF5cyBtb3VzZSBldmVudHMgZm9yIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQsCisgICAgICAgICAgdGhlcmUgaXMgYSBoYWNrIGFyb3VuZCB0aGlzIHRoYXQgaGVscHMgYSBiaXQKKyovCisKKy8qIE5lZWRzIHRvIGJlIGZpcnN0LCBzbyBRdWlja1RpbWUuaCBkb2Vzbid0IGluY2x1ZGUgZ2xleHQuaCAoMTAuNCkgKi8KKyNpbmNsdWRlICJTRExfb3BlbmdsLmgiCisKKyNpbmNsdWRlIDxDb2NvYS9Db2NvYS5oPgorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKyNpbmNsdWRlIDxPcGVuR0wvT3BlbkdMLmg+CS8qIEZvciBDR0wgZnVuY3Rpb25zIGFuZCB0eXBlcyAqLworI2luY2x1ZGUgPElPS2l0L0lPS2l0TGliLmg+CS8qIEZvciBwb3dlcnNhdmUgaGFuZGxpbmcgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2xvYWRzby5oIgorI2luY2x1ZGUgIlNETF9zeXN3bS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKworCisjaWZkZWYgX19wb3dlcnBjX18KKy8qIAorICAgIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGRpcmVjdGx5IGFjY2VzcyBOU09wZW5HTENvbnRleHQncyBDR0wgY29udGV4dAorICAgIFdlIG5lZWQgdGhpcyB0byBjaGVjayBmb3IgZXJyb3JzIE5TT3BlbkdMQ29udGV4dCBkb2Vzbid0IHN1cHBvcnQKKyAgICBQbGVhc2Ugbm90ZSB0aGlzIGlzIG9ubHkgdXNlZCBvbiBQb3dlclBDIChJbnRlbCBNYWNzIGFyZSBndWFyYW50ZWVkIHRvCisgICAgaGF2ZSBhIGJldHRlciBBUEkgZm9yIHRoaXMsIHNpbmNlIGl0IHNob3dlZCB1cCBpbiBNYWMgT1MgWCAxMC4zKS4KKyovCitAaW50ZXJmYWNlIE5TT3BlbkdMQ29udGV4dCAoQ0dMQ29udGV4dEFjY2VzcykKKy0gKENHTENvbnRleHRPYmopIGNnbENvbnRleHQ7CitAZW5kCisjZW5kaWYKKworLyogdXNlIHRoaXMgdG8gZ2V0IHRoZSBDR0xDb250ZXh0OyBpdCBoYW5kbGVzIENvY29hIGludGVyZmFjZSBjaGFuZ2VzLiAqLworQ0dMQ29udGV4dE9iaiBRWl9HZXRDR0xDb250ZXh0T2JqKE5TT3BlbkdMQ29udGV4dCAqbnNjdHgpOworCisKKy8qIE1haW4gZHJpdmVyIHN0cnVjdHVyZSB0byBzdG9yZSByZXF1aXJlZCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgeworICAgIEJPT0wgICAgICAgICAgICAgICB1c2VfbmV3X21vZGVfYXBpczsgIC8qIDEgPT0gPj0gMTAuNiBBUElzIGF2YWlsYWJsZSAqLworICAgIEJPT0wgICAgICAgICAgICAgICBhbGxvd19zY3JlZW5zYXZlcjsgIC8qIDAgPT0gZGlzYWJsZSBzY3JlZW5zYXZlciAqLworICAgIENHRGlyZWN0RGlzcGxheUlEICBkaXNwbGF5OyAgICAgICAgICAgIC8qIDAgPT0gbWFpbiBkaXNwbGF5IChvbmx5IHN1cHBvcnQgc2luZ2xlIGRpc3BsYXkpICovCisgICAgY29uc3Qgdm9pZCAgICAgICAgICptb2RlOyAgICAgICAgICAgICAgLyogY3VycmVudCBtb2RlIG9mIHRoZSBkaXNwbGF5ICovCisgICAgY29uc3Qgdm9pZCAgICAgICAgICpzYXZlX21vZGU7ICAgICAgICAgLyogb3JpZ2luYWwgbW9kZSBvZiB0aGUgZGlzcGxheSAqLworICAgIENHRGlyZWN0UGFsZXR0ZVJlZiBwYWxldHRlOyAgICAgICAgICAgIC8qIHBhbGV0dGUgb2YgYW4gOC1iaXQgZGlzcGxheSAqLworICAgIE5TT3BlbkdMQ29udGV4dCAgICAqZ2xfY29udGV4dDsgICAgICAgIC8qIE9wZW5HTCByZW5kZXJpbmcgY29udGV4dCAqLworICAgIE5TR3JhcGhpY3NDb250ZXh0ICAqbnNnZnhfY29udGV4dDsgICAgIC8qIENvY29hIGdyYXBoaWNzIGNvbnRleHQgKi8KKyAgICBVaW50MzIgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYnBwOyAvKiBmcmVxdWVudGx5IHVzZWQgZGF0YSBhYm91dCB0aGUgZGlzcGxheSAqLworICAgIFVpbnQzMiAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAgIC8qIGZsYWdzIGZvciBjdXJyZW50IG1vZGUsIGZvciB0ZWFyZG93biBwdXJwb3NlcyAqLworICAgIFVpbnQzMiAgICAgICAgICAgICB2aWRlb19zZXQ7ICAgICAgICAgIC8qIGJvb2xlYW47IGluZGljYXRlcyBpZiB2aWRlbyB3YXMgc2V0IGNvcnJlY3RseSAqLworICAgIFVpbnQzMiAgICAgICAgICAgICB3YXJwX2ZsYWc7ICAgICAgICAgIC8qIGJvb2xlYW47IG5vdGlmeSB0byBldmVudCBsb29wIHRoYXQgYSB3YXJwIGp1c3Qgb2NjdXJlZCAqLworICAgIFVpbnQzMiAgICAgICAgICAgICB3YXJwX3RpY2tzOyAgICAgICAgIC8qIHRpbWVzdGFtcCB3aGVuIHRoZSB3YXJwIG9jY3VyZWQgKi8KKyAgICBOU1dpbmRvdyAgICAgICAgICAgKndpbmRvdzsgICAgICAgICAgICAvKiBDb2NvYSB3aW5kb3cgdG8gaW1wbGVtZW50IHRoZSBTREwgd2luZG93ICovCisgICAgTlNWaWV3ICAgICAgICAgICAgICp2aWV3OyAgICAgICAgICAgICAgLyogdGhlIHdpbmRvdydzIHZpZXc7IGRyYXcgMkQgYW5kIE9wZW5HTCBpbnRvIHRoaXMgdmlldyAqLworICAgIENHQ29udGV4dFJlZiAgICAgICBjZ19jb250ZXh0OyAgICAgICAgIC8qIENvcmVHcmFwaGljcyByZW5kZXJpbmcgY29udGV4dCAqLworICAgIFNETF9TdXJmYWNlICAgICAgICAqcmVzaXplX2ljb247ICAgICAgIC8qIGljb24gZm9yIHRoZSByZXNpemUgYmFkZ2UsIHdlIGhhdmUgdG8gZHJhdyBpdCBieSBoYW5kICovCisgICAgU0RMX0dyYWJNb2RlICAgICAgIGN1cnJlbnRfZ3JhYl9tb2RlOyAgLyogZGVmYXVsdCB2YWx1ZSBpcyBTRExfR1JBQl9PRkYgKi8KKyAgICBTRExfUmVjdCAgICAgICAgICAgKipjbGllbnRfbW9kZV9saXN0OyAvKiByZXNvbHV0aW9uIGxpc3QgdG8gcGFzcyBiYWNrIHRvIGNsaWVudCAqLworICAgIFNETEtleSAgICAgICAgICAgICBrZXltYXBbMjU2XTsgICAgICAgIC8qIE1hYyBPUyBYIHRvIFNETCBrZXkgbWFwcGluZyAqLworICAgIFVpbnQzMiAgICAgICAgICAgICBjdXJyZW50X21vZHM7ICAgICAgIC8qIGN1cnJlbnQga2V5Ym9hcmQgbW9kaWZpZXJzLCB0byB0cmFjayBtb2RpZmllciBzdGF0ZSAqLworICAgIE5TVGV4dCAgICAgICAgICAgICAqZmllbGRfZWRpdDsgICAgICAgIC8qIGEgZmllbGQgZWRpdG9yIGZvciBrZXlib2FyZCBjb21wb3NpdGlvbiBwcm9jZXNzaW5nICovCisgICAgVWludDMyICAgICAgICAgICAgIGxhc3RfdmlydHVhbF9idXR0b247LyogbGFzdCB2aXJ0dWFsIG1vdXNlIGJ1dHRvbiBwcmVzc2VkICovCisgICAgaW9fY29ubmVjdF90ICAgICAgIHBvd2VyX2Nvbm5lY3Rpb247ICAgLyogdXNlZCB3aXRoIElPS2l0IHRvIGRldGVjdCB3YWtlIGZyb20gc2xlZXAgKi8KKyAgICBVaW50OCAgICAgICAgICAgICAgZXhwZWN0X21vdXNlX3VwOyAgICAvKiB1c2VkIHRvIGRldGVybWluZSB3aGVuIHRvIHNlbmQgbW91c2UgdXAgZXZlbnRzICovCisgICAgVWludDggICAgICAgICAgICAgIGdyYWJfc3RhdGU7ICAgICAgICAgLyogdXNlZCB0byBtYW5hZ2UgZ3JhYiBiZWhhdmlvciAqLworICAgIE5TUG9pbnQgICAgICAgICAgICBjdXJzb3JfbG9jOyAgICAgICAgIC8qIHNhdmVkIGN1cnNvciBjb29yZHMsIGZvciBhY3RpdmF0ZS9kZWFjdGl2YXRlIHdoZW4gZ3JhYmJlZCAqLworICAgIEJPT0wgICAgICAgICAgICAgICBjdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGU7ICAgICAvKiB0ZWxscyBpZiBjdXJzb3IgaXMgc3VwcG9zZWQgdG8gYmUgdmlzaWJsZSAoU0RMX1Nob3dDdXJzb3IpICovCisgICAgQk9PTCAgICAgICAgICAgICAgIGN1cnNvcl92aXNpYmxlOyAgICAgLyogdGVsbHMgaWYgY3Vyc29yIGlzICphY3R1YWxseSogdmlzaWJsZSBvciBub3QgKi8KKyAgICBVaW50OCogICAgICAgICAgICAgc3dfYnVmZmVyc1syXTsgICAgICAvKiBwb2ludGVycyB0byB0aGUgdHdvIHNvZnR3YXJlIGJ1ZmZlcnMgZm9yIGRvdWJsZS1idWZmZXIgZW11bGF0aW9uICovCisgICAgU0RMX1RocmVhZCAgICAgICAgICp0aHJlYWQ7ICAgICAgICAgICAgLyogdGhyZWFkIGZvciBhc3luYyB1cGRhdGVzIHRvIHRoZSBzY3JlZW4gKi8KKyAgICBTRExfc2VtICAgICAgICAgICAgKnNlbTEsICpzZW0yOyAgICAgICAvKiBzeW5jaHJvbml6YXRpb24gZm9yIGFzeW5jIHNjcmVlbiB1cGRhdGVzICovCisgICAgVWludDggICAgICAgICAgICAgICpjdXJyZW50X2J1ZmZlcjsgICAgLyogdGhlIGJ1ZmZlciBiZWluZyBjb3BpZWQgdG8gdGhlIHNjcmVlbiAqLworICAgIEJPT0wgICAgICAgICAgICAgICBxdWl0X3RocmVhZDsgICAgICAgIC8qIHVzZWQgdG8gcXVpdCB0aGUgYXN5bmMgYmxpdHRpbmcgdGhyZWFkICovCisgICAgU0ludDMyICAgICAgICAgICAgIHN5c3RlbV92ZXJzaW9uOyAgICAgLyogdXNlZCB0byBkaXMtL2VuYWJsZSB3b3JrYXJvdW5kcyBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbSB2ZXJzaW9uICovCisKKyAgICB2b2lkICpvcGVuZ2xfbGlicmFyeTsgICAgLyogZHluYW1pY2FsbHkgbG9hZGVkIE9wZW5HTCBsaWJyYXJ5LiAqLworfSBTRExfUHJpdmF0ZVZpZGVvRGF0YTsKKworI2RlZmluZSBfVEhJUyAgICBTRExfVmlkZW9EZXZpY2UgKnRoaXMKKyNkZWZpbmUgZGlzcGxheV9pZCAodGhpcy0+aGlkZGVuLT5kaXNwbGF5KQorI2RlZmluZSBtb2RlICh0aGlzLT5oaWRkZW4tPm1vZGUpCisjZGVmaW5lIHNhdmVfbW9kZSAodGhpcy0+aGlkZGVuLT5zYXZlX21vZGUpCisjZGVmaW5lIHVzZV9uZXdfbW9kZV9hcGlzICh0aGlzLT5oaWRkZW4tPnVzZV9uZXdfbW9kZV9hcGlzKQorI2RlZmluZSBhbGxvd19zY3JlZW5zYXZlciAodGhpcy0+aGlkZGVuLT5hbGxvd19zY3JlZW5zYXZlcikKKyNkZWZpbmUgcGFsZXR0ZSAodGhpcy0+aGlkZGVuLT5wYWxldHRlKQorI2RlZmluZSBnbF9jb250ZXh0ICh0aGlzLT5oaWRkZW4tPmdsX2NvbnRleHQpCisjZGVmaW5lIG5zZ2Z4X2NvbnRleHQgKHRoaXMtPmhpZGRlbi0+bnNnZnhfY29udGV4dCkKKyNkZWZpbmUgZGV2aWNlX3dpZHRoICh0aGlzLT5oaWRkZW4tPndpZHRoKQorI2RlZmluZSBkZXZpY2VfaGVpZ2h0ICh0aGlzLT5oaWRkZW4tPmhlaWdodCkKKyNkZWZpbmUgZGV2aWNlX2JwcCAodGhpcy0+aGlkZGVuLT5icHApCisjZGVmaW5lIG1vZGVfZmxhZ3MgKHRoaXMtPmhpZGRlbi0+ZmxhZ3MpCisjZGVmaW5lIHF6X3dpbmRvdyAodGhpcy0+aGlkZGVuLT53aW5kb3cpCisjZGVmaW5lIHdpbmRvd192aWV3ICh0aGlzLT5oaWRkZW4tPnZpZXcpCisjZGVmaW5lIGNnX2NvbnRleHQgKHRoaXMtPmhpZGRlbi0+Y2dfY29udGV4dCkKKyNkZWZpbmUgdmlkZW9fc2V0ICh0aGlzLT5oaWRkZW4tPnZpZGVvX3NldCkKKyNkZWZpbmUgd2FycF90aWNrcyAodGhpcy0+aGlkZGVuLT53YXJwX3RpY2tzKQorI2RlZmluZSB3YXJwX2ZsYWcgKHRoaXMtPmhpZGRlbi0+d2FycF9mbGFnKQorI2RlZmluZSByZXNpemVfaWNvbiAodGhpcy0+aGlkZGVuLT5yZXNpemVfaWNvbikKKyNkZWZpbmUgY3VycmVudF9ncmFiX21vZGUgKHRoaXMtPmhpZGRlbi0+Y3VycmVudF9ncmFiX21vZGUpCisjZGVmaW5lIGNsaWVudF9tb2RlX2xpc3QgKHRoaXMtPmhpZGRlbi0+Y2xpZW50X21vZGVfbGlzdCkKKyNkZWZpbmUga2V5bWFwICh0aGlzLT5oaWRkZW4tPmtleW1hcCkKKyNkZWZpbmUgY3VycmVudF9tb2RzICh0aGlzLT5oaWRkZW4tPmN1cnJlbnRfbW9kcykKKyNkZWZpbmUgZmllbGRfZWRpdCAodGhpcy0+aGlkZGVuLT5maWVsZF9lZGl0KQorI2RlZmluZSBsYXN0X3ZpcnR1YWxfYnV0dG9uICh0aGlzLT5oaWRkZW4tPmxhc3RfdmlydHVhbF9idXR0b24pCisjZGVmaW5lIHBvd2VyX2Nvbm5lY3Rpb24gKHRoaXMtPmhpZGRlbi0+cG93ZXJfY29ubmVjdGlvbikKKyNkZWZpbmUgZXhwZWN0X21vdXNlX3VwICh0aGlzLT5oaWRkZW4tPmV4cGVjdF9tb3VzZV91cCkKKyNkZWZpbmUgZ3JhYl9zdGF0ZSAodGhpcy0+aGlkZGVuLT5ncmFiX3N0YXRlKQorI2RlZmluZSBjdXJzb3JfbG9jICh0aGlzLT5oaWRkZW4tPmN1cnNvcl9sb2MpCisjZGVmaW5lIGN1cnNvcl9zaG91bGRfYmVfdmlzaWJsZSAodGhpcy0+aGlkZGVuLT5jdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGUpCisjZGVmaW5lIGN1cnNvcl92aXNpYmxlICh0aGlzLT5oaWRkZW4tPmN1cnNvcl92aXNpYmxlKQorI2RlZmluZSBzd19idWZmZXJzICh0aGlzLT5oaWRkZW4tPnN3X2J1ZmZlcnMpCisjZGVmaW5lIHN3X2NvbnRleHRzICh0aGlzLT5oaWRkZW4tPnN3X2NvbnRleHRzKQorI2RlZmluZSB0aHJlYWQgKHRoaXMtPmhpZGRlbi0+dGhyZWFkKQorI2RlZmluZSBzZW0xICh0aGlzLT5oaWRkZW4tPnNlbTEpCisjZGVmaW5lIHNlbTIgKHRoaXMtPmhpZGRlbi0+c2VtMikKKyNkZWZpbmUgY3VycmVudF9idWZmZXIgKHRoaXMtPmhpZGRlbi0+Y3VycmVudF9idWZmZXIpCisjZGVmaW5lIHF1aXRfdGhyZWFkICh0aGlzLT5oaWRkZW4tPnF1aXRfdGhyZWFkKQorI2RlZmluZSBzeXN0ZW1fdmVyc2lvbiAodGhpcy0+aGlkZGVuLT5zeXN0ZW1fdmVyc2lvbikKKyNkZWZpbmUgb3BlbmdsX2xpYnJhcnkgKHRoaXMtPmhpZGRlbi0+b3BlbmdsX2xpYnJhcnkpCisKKy8qIGdyYWIgc3RhdGVzIC0gdGhlIGlucHV0IGlzIGluIG9uZSBvZiB0aGVzZSBzdGF0ZXMgKi8KK2VudW0geworICAgIFFaX1VOR1JBQkJFRCA9IDAsCisgICAgUVpfVklTSUJMRV9HUkFCLAorICAgIFFaX0lOVklTSUJMRV9HUkFCCit9OworCisvKiBncmFiIGFjdGlvbnMgLSB0aGVzZSBjYW4gY2hhbmdlIHRoZSBncmFiYmVkIHN0YXRlICovCitlbnVtIHsKKyAgICBRWl9FTkFCTEVfR1JBQiA9IDAsCisgICAgUVpfRElTQUJMRV9HUkFCLAorICAgIFFaX0hJREVDVVJTT1IsCisgICAgUVpfU0hPV0NVUlNPUgorfTsKKworLyogR2FtbWEgRnVuY3Rpb25zICovCitpbnQgICAgUVpfU2V0R2FtbWEgICAgICAgICAgKF9USElTLCBmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlKTsKK2ludCAgICBRWl9HZXRHYW1tYSAgICAgICAgICAoX1RISVMsIGZsb2F0ICpyZWQsIGZsb2F0ICpncmVlbiwgZmxvYXQgKmJsdWUpOworaW50ICAgIFFaX1NldEdhbW1hUmFtcCAgICAgIChfVEhJUywgVWludDE2ICpyYW1wKTsKK2ludCAgICBRWl9HZXRHYW1tYVJhbXAgICAgICAoX1RISVMsIFVpbnQxNiAqcmFtcCk7CisKKy8qIE9wZW5HTCBmdW5jdGlvbnMgKi8KK2ludCAgICBRWl9TZXR1cE9wZW5HTCAgICAgICAoX1RISVMsIGludCBicHAsIFVpbnQzMiBmbGFncyk7Cit2b2lkICAgUVpfVGVhckRvd25PcGVuR0wgICAgKF9USElTKTsKK3ZvaWQqICBRWl9HTF9HZXRQcm9jQWRkcmVzcyAoX1RISVMsIGNvbnN0IGNoYXIgKnByb2MpOworaW50ICAgIFFaX0dMX0dldEF0dHJpYnV0ZSAgIChfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOworaW50ICAgIFFaX0dMX01ha2VDdXJyZW50ICAgIChfVEhJUyk7Cit2b2lkICAgUVpfR0xfU3dhcEJ1ZmZlcnMgICAgKF9USElTKTsKK2ludCAgICBRWl9HTF9Mb2FkTGlicmFyeSAgICAoX1RISVMsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKKworLyogQ3Vyc29yIGFuZCBNb3VzZSBmdW5jdGlvbnMgKi8KK3ZvaWQgICAgICAgICBRWl9GcmVlV01DdXJzb3IgICAgIChfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitXTWN1cnNvciogICAgUVpfQ3JlYXRlV01DdXJzb3IgICAoX1RISVMsIFVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKK2ludCAgICAgICAgICBRWl9TaG93V01DdXJzb3IgICAgIChfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7Cit2b2lkICAgICAgICAgUVpfV2FycFdNQ3Vyc29yICAgICAoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7Cit2b2lkICAgICAgICAgUVpfTW92ZVdNQ3Vyc29yICAgICAoX1RISVMsIGludCB4LCBpbnQgeSk7Cit2b2lkICAgICAgICAgUVpfQ2hlY2tNb3VzZU1vZGUgICAoX1RISVMpOwordm9pZCAgICAgICAgIFFaX1VwZGF0ZU1vdXNlICAgICAgKF9USElTKTsKKworLyogRXZlbnQgZnVuY3Rpb25zICovCit2b2lkICAgICAgICAgUVpfSW5pdE9TS2V5bWFwICAgICAoX1RISVMpOwordm9pZCAgICAgICAgIFFaX1B1bXBFdmVudHMgICAgICAgKF9USElTKTsKKworLyogV2luZG93IE1hbmFnZXIgZnVuY3Rpb25zICovCit2b2lkICAgICAgICAgUVpfU2V0Q2FwdGlvbiAgICAgICAoX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKK3ZvaWQgICAgICAgICBRWl9TZXRJY29uICAgICAgICAgIChfVEhJUywgU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKTsKK2ludCAgICAgICAgICBRWl9JY29uaWZ5V2luZG93ICAgIChfVEhJUyk7Cit2b2lkICAgICAgICAgUVpfU2V0V2luZG93UG9zICAgICAoX1RISVMsIGludCB4LCBpbnQgeSk7Cit2b2lkICAgICAgICAgUVpfR2V0V2luZG93UG9zICAgICAoX1RISVMsIGludCAqcHgsIGludCAqcHkpOworaW50ICAgICAgICAgIFFaX0lzV2luZG93VmlzaWJsZSAgKF9USElTLCBpbnQgcmVjZW50ZXIpOworaW50ICAgICAgICAgIFFaX0dldE1vbml0b3JEUEkgICAgKF9USElTLCBpbnQgKnhEcGksIGludCAqeURwaSk7CitpbnQgICAgICAgICAgUVpfR2V0TW9uaXRvclJlY3QgICAoX1RISVMsIFNETF9SZWN0ICpyZWN0KTsKKworU0RMX0dyYWJNb2RlIFFaX0dyYWJJbnB1dCAgICAgICAgKF9USElTLCBTRExfR3JhYk1vZGUgZ3JhYl9tb2RlKTsKKy8qaW50ICAgICAgICAgIFFaX0dldFdNSW5mbyAgICAgICAgKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKTsqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAodXNlZCBpbnRlcm5hbGx5KSAqLwordm9pZCAgICAgICAgIFFaX1ByaXZhdGVXYXJwQ3Vyc29yIChfVEhJUywgaW50IHgsIGludCB5KTsKK3ZvaWQgICAgICAgICBRWl9DaGFuZ2VHcmFiU3RhdGUgKF9USElTLCBpbnQgYWN0aW9uKTsKK3ZvaWQgICAgICAgICBRWl9SZWdpc3RlckZvclNsZWVwTm90aWZpY2F0aW9ucyAoX1RISVMpOwordm9pZCAgICAgICAgIFFaX1ByaXZhdGVHbG9iYWxUb0xvY2FsIChfVEhJUywgTlNQb2ludCAqcCk7Cit2b2lkICAgICAgICAgUVpfUHJpdmF0ZUNvY29hVG9TREwgKF9USElTLCBOU1BvaW50ICpwKTsKK0JPT0wgICAgICAgICBRWl9Jc01vdXNlSW5XaW5kb3cgKF9USElTKTsKK3ZvaWQgICAgICAgICBRWl9Eb0FjdGl2YXRlIChfVEhJUyk7Cit2b2lkICAgICAgICAgUVpfRG9EZWFjdGl2YXRlIChfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6VmlkZW8ubSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpWaWRlby5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMjAxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6VmlkZW8ubQpAQCAtMCwwICsxLDE2OTUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9RdWFydHpWaWRlby5oIgorI2luY2x1ZGUgIlNETF9RdWFydHpXaW5kb3cuaCIKKyNpbmNsdWRlICJTRExfUXVhcnR6V00uaCIKKworLyogVGhlc2UgQVBJcyBhcmVuJ3QganVzdCBkZXByZWNhdGVkOyB0aGV5J3JlIGdvbmUgZnJvbSB0aGUgaGVhZGVycyBpbiB0aGUKKyAgIDEwLjcgU0RLLiBJZiB3ZSdyZSB1c2luZyBhID49IDEwLjcgU0RLLCBidXQgdGFyZ2V0aW5nIDwgMTAuNywgdGhlbiB3ZQorICAgZm9yY2UgdGhlc2UgZnVuY3Rpb24gZGVjbGFyYXRpb25zLiAqLworI2lmICgoTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCAxMDcwKSAmJiAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSAxMDcwKSkKK0NHX0VYVEVSTiB2b2lkICpDR0Rpc3BsYXlCYXNlQWRkcmVzcyhDR0RpcmVjdERpc3BsYXlJRCBkaXNwbGF5KQorICBDR19BVkFJTEFCTEVfQlVUX0RFUFJFQ0FURUQoX19NQUNfMTBfMCwgX19NQUNfMTBfNiwKKyAgICBfX0lQSE9ORV9OQSwgX19JUEhPTkVfTkEpOworQ0dfRVhURVJOIHNpemVfdCBDR0Rpc3BsYXlCeXRlc1BlclJvdyhDR0RpcmVjdERpc3BsYXlJRCBkaXNwbGF5KQorICBDR19BVkFJTEFCTEVfQlVUX0RFUFJFQ0FURUQoX19NQUNfMTBfMCwgX19NQUNfMTBfNiwKKyAgICBfX0lQSE9ORV9OQSwgX19JUEhPTkVfTkEpOworI2VuZGlmCisKKworc3RhdGljIGlubGluZSBCT09MIElTX0xJT05fT1JfTEFURVIoX1RISVMpCit7CisgICAgcmV0dXJuIChzeXN0ZW1fdmVyc2lvbiA+PSAweDEwNzApOworfQorCitzdGF0aWMgaW5saW5lIEJPT0wgSVNfU05PV19MRU9QQVJEX09SX0xBVEVSKF9USElTKQoreworICAgIHJldHVybiAoc3lzdGVtX3ZlcnNpb24gPj0gMHgxMDYwKTsKK30KKworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgMTA2MCkgJiYgIWRlZmluZWQoX19MUDY0X18pICAvKiBGaXhlZCBpbiBTbm93IExlb3BhcmQgKi8KKy8qCisgICAgQWRkIG1ldGhvZHMgdG8gZ2V0IGF0IHByaXZhdGUgbWVtYmVycyBvZiBOU1NjcmVlbi4gCisgICAgU2luY2UgdGhlcmUgaXMgYSBidWcgaW4gQXBwbGUncyBzY3JlZW4gc3dpdGNoaW5nIGNvZGUKKyAgICB0aGF0IGRvZXMgbm90IHVwZGF0ZSB0aGlzIHZhcmlhYmxlIHdoZW4gc3dpdGNoaW5nCisgICAgdG8gZnVsbHNjcmVlbiwgd2UnbGwgc2V0IGl0IG1hbnVhbGx5IChidXQgb25seSBmb3IgdGhlCisgICAgbWFpbiBzY3JlZW4pLgorKi8KK0BpbnRlcmZhY2UgTlNTY3JlZW4gKE5TU2NyZWVuQWNjZXNzKQorLSAodm9pZCkgc2V0RnJhbWU6KE5TUmVjdClmcmFtZTsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIE5TU2NyZWVuIChOU1NjcmVlbkFjY2VzcykKKy0gKHZvaWQpIHNldEZyYW1lOihOU1JlY3QpZnJhbWU7Cit7CisgICAgX2ZyYW1lID0gZnJhbWU7Cit9CitAZW5kCitzdGF0aWMgaW5saW5lIHZvaWQgUVpfU2V0RnJhbWUoX1RISVMsIE5TU2NyZWVuICpuc3NjcmVlbiwgTlNSZWN0IGZyYW1lKQoreworICAgIGlmICghSVNfU05PV19MRU9QQVJEX09SX0xBVEVSKHRoaXMpKSB7CisgICAgICAgIFtuc3NjcmVlbiBzZXRGcmFtZTpmcmFtZV07CisgICAgfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBRWl9TZXRGcmFtZShfVEhJUywgTlNTY3JlZW4gKm5zc2NyZWVuLCBOU1JlY3QgZnJhbWUpCit7Cit9CisjZW5kaWYKKworQGludGVyZmFjZSBTRExUcmFuc2xhdG9yUmVzcG9uZGVyIDogTlNUZXh0VmlldworeworfQorLSAodm9pZCkgZG9Db21tYW5kQnlTZWxlY3RvcjooU0VMKW15c2VsZWN0b3I7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTRExUcmFuc2xhdG9yUmVzcG9uZGVyCistICh2b2lkKSBkb0NvbW1hbmRCeVNlbGVjdG9yOihTRUwpIG15c2VsZWN0b3Ige30KK0BlbmQKKworLyogYWJzZW50IGluIDEwLjMuOS4gICovCitDR19FWFRFUk4gQ0dJbWFnZVJlZiBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZSAoQ0dDb250ZXh0UmVmKTsKKworLyogQm9vdHN0cmFwIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCAgICAgICAgICAgICAgUVpfQXZhaWxhYmxlICgpOworc3RhdGljIFNETF9WaWRlb0RldmljZSogUVpfQ3JlYXRlRGV2aWNlIChpbnQgZGV2aWNlX2luZGV4KTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgIFFaX0RlbGV0ZURldmljZSAoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpOworCisvKiBJbml0aWFsaXphdGlvbiwgUXVlcnksIFNldHVwLCBhbmQgUmVkcmF3aW5nIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCAgICAgICAgICBRWl9WaWRlb0luaXQgICAgICAgIChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2aWRlb19mb3JtYXQpOworCitzdGF0aWMgU0RMX1JlY3QqKiAgIFFaX0xpc3RNb2RlcyAgICAgICAgKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDMyIGZsYWdzKTsKK3N0YXRpYyB2b2lkICAgICAgICAgUVpfVW5zZXRWaWRlb01vZGUgICAoX1RISVMsIEJPT0wgdG9fZGVza3RvcCwgQk9PTCBzYXZlX2dsKTsKKworc3RhdGljIFNETF9TdXJmYWNlKiBRWl9TZXRWaWRlb01vZGUgICAgIChfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgICAgICAgICAgUVpfVG9nZ2xlRnVsbFNjcmVlbiAoX1RISVMsIGludCBvbik7CitzdGF0aWMgaW50ICAgICAgICAgIFFaX1NldENvbG9ycyAgICAgICAgKF9USElTLCBpbnQgZmlyc3RfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCAxMDcwKQorc3RhdGljIGludCAgICAgICAgICBRWl9Mb2NrRG91YmxlQnVmZmVyICAgKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCAgICAgICAgIFFaX1VubG9ja0RvdWJsZUJ1ZmZlciAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgICAgICAgICAgUVpfVGhyZWFkRmxpcCAgICAgICAgIChfVEhJUyk7CitzdGF0aWMgaW50ICAgICAgICAgIFFaX0ZsaXBEb3VibGVCdWZmZXIgICAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkICAgICAgICAgUVpfRG91YmxlQnVmZmVyVXBkYXRlIChfVEhJUywgaW50IG51bV9yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKK3N0YXRpYyB2b2lkICAgICAgICAgUVpfRGlyZWN0VXBkYXRlICAgICAoX1RISVMsIGludCBudW1fcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgICAgICAgICBRWl9VcGRhdGVSZWN0cyAgICAgIChfVEhJUywgaW50IG51bV9yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKK3N0YXRpYyB2b2lkICAgICAgICAgUVpfVmlkZW9RdWl0ICAgICAgICAoX1RISVMpOworCitzdGF0aWMgaW50ICBRWl9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBRWl9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgUVpfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIFFaX0ZyZWVIV1N1cmZhY2UgKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKKy8qIEJvb3RzdHJhcCBiaW5kaW5nLCBlbmFibGVzIGVudHJ5IHBvaW50IGludG8gdGhlIGRyaXZlciAqLworVmlkZW9Cb290U3RyYXAgUVpfYm9vdHN0cmFwID0geworICAgICJRdWFydHoiLCAiTWFjIE9TIFggQ29yZUdyYXBoaWNzIiwgUVpfQXZhaWxhYmxlLCBRWl9DcmVhdGVEZXZpY2UKK307CisKKy8qIERpc2FibGUgY29tcGlsZXIgd2FybmluZ3Mgd2UgY2FuJ3QgYXZvaWQuICovCisjaWYgKGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSA0KSkKKyMgIGlmIChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDw9IDEwNzApCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgorIyAgZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBRWl9SZWxlYXNlRGlzcGxheU1vZGUoX1RISVMsIGNvbnN0IHZvaWQgKm1vZGVyZWYpCit7CisgICAgLyogd2Ugb25seSBvd24gdGhlc2UgcmVmZXJlbmNlcyBpbiB0aGUgMTAuNisgQVBJLiAqLworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IDEwNjApCisgICAgaWYgKHVzZV9uZXdfbW9kZV9hcGlzKSB7CisgICAgICAgIENHRGlzcGxheU1vZGVSZWxlYXNlKChDR0Rpc3BsYXlNb2RlUmVmKSBtb2RlcmVmKTsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgUVpfUmVsZWFzZURpc3BsYXlNb2RlTGlzdChfVEhJUywgQ0ZBcnJheVJlZiBtb2RlX2xpc3QpCit7CisgICAgLyogd2Ugb25seSBvd24gdGhlc2UgcmVmZXJlbmNlcyBpbiB0aGUgMTAuNisgQVBJLiAqLworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IDEwNjApCisgICAgaWYgKHVzZV9uZXdfbW9kZV9hcGlzKSB7CisgICAgICAgIENGUmVsZWFzZShtb2RlX2xpc3QpOworICAgIH0KKyNlbmRpZgorfQorCisKKy8qIEJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgUVpfQXZhaWxhYmxlICgpCit7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UqIFFaX0NyZWF0ZURldmljZSAoaW50IGRldmljZV9pbmRleCkKK3sKKyNwcmFnbWEgdW51c2VkIChkZXZpY2VfaW5kZXgpCisKKyAgICBTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKyAgICBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqaGlkZGVuOworCisgICAgZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSopIFNETF9tYWxsb2MgKHNpemVvZiAoKmRldmljZSkgKTsKKyAgICBoaWRkZW4gPSAoU0RMX1ByaXZhdGVWaWRlb0RhdGEqKSBTRExfbWFsbG9jIChzaXplb2YgKCpoaWRkZW4pICk7CisKKyAgICBpZiAoZGV2aWNlID09IE5VTEwgfHwgaGlkZGVuID09IE5VTEwpCisgICAgICAgIFNETF9PdXRPZk1lbW9yeSAoKTsKKworICAgIFNETF9tZW1zZXQgKGRldmljZSwgMCwgc2l6ZW9mICgqZGV2aWNlKSApOworICAgIFNETF9tZW1zZXQgKGhpZGRlbiwgMCwgc2l6ZW9mICgqaGlkZGVuKSApOworCisgICAgZGV2aWNlLT5oaWRkZW4gPSBoaWRkZW47CisKKyAgICBkZXZpY2UtPlZpZGVvSW5pdCAgICAgICAgPSBRWl9WaWRlb0luaXQ7CisgICAgZGV2aWNlLT5MaXN0TW9kZXMgICAgICAgID0gUVpfTGlzdE1vZGVzOworICAgIGRldmljZS0+U2V0VmlkZW9Nb2RlICAgICA9IFFaX1NldFZpZGVvTW9kZTsKKyAgICBkZXZpY2UtPlRvZ2dsZUZ1bGxTY3JlZW4gPSBRWl9Ub2dnbGVGdWxsU2NyZWVuOworICAgIGRldmljZS0+VXBkYXRlTW91c2UgICAgICA9IFFaX1VwZGF0ZU1vdXNlOworICAgIGRldmljZS0+U2V0Q29sb3JzICAgICAgICA9IFFaX1NldENvbG9yczsKKyAgICAvKiBkZXZpY2UtPlVwZGF0ZVJlY3RzICAgICAgPSBRWl9VcGRhdGVSZWN0czsgdGhpcyBpcyBkZXRlcm1pbmVkIGJ5IFNldFZpZGVvTW9kZSgpICovCisgICAgZGV2aWNlLT5WaWRlb1F1aXQgICAgICAgID0gUVpfVmlkZW9RdWl0OworCisgICAgZGV2aWNlLT5Mb2NrSFdTdXJmYWNlICAgPSBRWl9Mb2NrSFdTdXJmYWNlOworICAgIGRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gUVpfVW5sb2NrSFdTdXJmYWNlOworICAgIGRldmljZS0+QWxsb2NIV1N1cmZhY2UgICA9IFFaX0FsbG9jSFdTdXJmYWNlOworICAgIGRldmljZS0+RnJlZUhXU3VyZmFjZSAgID0gUVpfRnJlZUhXU3VyZmFjZTsKKworICAgIGRldmljZS0+U2V0R2FtbWEgICAgID0gUVpfU2V0R2FtbWE7CisgICAgZGV2aWNlLT5HZXRHYW1tYSAgICAgPSBRWl9HZXRHYW1tYTsKKyAgICBkZXZpY2UtPlNldEdhbW1hUmFtcCA9IFFaX1NldEdhbW1hUmFtcDsKKyAgICBkZXZpY2UtPkdldEdhbW1hUmFtcCA9IFFaX0dldEdhbW1hUmFtcDsKKworICAgIGRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBRWl9HTF9HZXRQcm9jQWRkcmVzczsKKyAgICBkZXZpY2UtPkdMX0dldEF0dHJpYnV0ZSAgID0gUVpfR0xfR2V0QXR0cmlidXRlOworICAgIGRldmljZS0+R0xfTWFrZUN1cnJlbnQgICAgPSBRWl9HTF9NYWtlQ3VycmVudDsKKyAgICBkZXZpY2UtPkdMX1N3YXBCdWZmZXJzICAgID0gUVpfR0xfU3dhcEJ1ZmZlcnM7CisgICAgZGV2aWNlLT5HTF9Mb2FkTGlicmFyeSAgICA9IFFaX0dMX0xvYWRMaWJyYXJ5OworCisgICAgZGV2aWNlLT5GcmVlV01DdXJzb3IgICA9IFFaX0ZyZWVXTUN1cnNvcjsKKyAgICBkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gUVpfQ3JlYXRlV01DdXJzb3I7CisgICAgZGV2aWNlLT5TaG93V01DdXJzb3IgICA9IFFaX1Nob3dXTUN1cnNvcjsKKyAgICBkZXZpY2UtPldhcnBXTUN1cnNvciAgID0gUVpfV2FycFdNQ3Vyc29yOworICAgIGRldmljZS0+TW92ZVdNQ3Vyc29yICAgPSBRWl9Nb3ZlV01DdXJzb3I7CisgICAgZGV2aWNlLT5DaGVja01vdXNlTW9kZSA9IFFaX0NoZWNrTW91c2VNb2RlOworICAgIGRldmljZS0+SW5pdE9TS2V5bWFwICAgPSBRWl9Jbml0T1NLZXltYXA7CisgICAgZGV2aWNlLT5QdW1wRXZlbnRzICAgICA9IFFaX1B1bXBFdmVudHM7CisKKyAgICBkZXZpY2UtPlNldENhcHRpb24gICAgPSBRWl9TZXRDYXB0aW9uOworICAgIGRldmljZS0+U2V0SWNvbiAgICAgICA9IFFaX1NldEljb247CisgICAgZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gUVpfSWNvbmlmeVdpbmRvdzsKKyAgICBkZXZpY2UtPlNldFdpbmRvd1BvcyAgPSBRWl9TZXRXaW5kb3dQb3M7CisgICAgZGV2aWNlLT5HZXRXaW5kb3dQb3MgID0gUVpfR2V0V2luZG93UG9zOworICAgIGRldmljZS0+SXNXaW5kb3dWaXNpYmxlID0gUVpfSXNXaW5kb3dWaXNpYmxlOworICAgIGRldmljZS0+R2V0TW9uaXRvckRQSSA9IFFaX0dldE1vbml0b3JEUEk7CisgICAgZGV2aWNlLT5HZXRNb25pdG9yUmVjdCA9IFFaX0dldE1vbml0b3JSZWN0OworICAgIGRldmljZS0+R2V0V01JbmZvICAgICA9IFFaX0dldFdNSW5mbzsKKyAgICBkZXZpY2UtPkdyYWJJbnB1dCAgICAgPSBRWl9HcmFiSW5wdXQ7CisKKyAgICAvKgorICAgICAqIFRoaXMgaXMgYSBiaWcgaGFzc2xlLCBuZWVkaW5nIFF1aWNrRHJhdyBhbmQgUXVpY2tUaW1lIG9uIG9sZGVyCisgICAgICogIHN5c3RlbXMsIGFuZCBnb2Qga25vd3Mgd2hhdCBvbiAxMC42LCBzbyB3ZSBpbW1lZGlhdGVseSBmYWlsIGhlcmUsCisgICAgICogIHdoaWNoIGNhdXNlcyBTREwgdG8gbWFrZSBhbiBSR0Igc3VyZmFjZSBhbmQgbWFuYWdlIHRoZSBZVVYgb3ZlcmxheQorICAgICAqICBpbiBzb2Z0d2FyZS4gU29ycnkuIFVzZSBTREwgMS4zIGlmIHlvdSB3YW50IFlVViByZW5kZXJpbmcgaW4gYSBwaXhlbAorICAgICAqICBzaGFkZXIuICA6KQorICAgICAqLworICAgIC8qZGV2aWNlLT5DcmVhdGVZVVZPdmVybGF5ID0gUVpfQ3JlYXRlWVVWT3ZlcmxheTsqLworCisgICAgZGV2aWNlLT5mcmVlICAgICAgICAgICAgID0gUVpfRGVsZXRlRGV2aWNlOworCisgICAgcmV0dXJuIGRldmljZTsKK30KKworc3RhdGljIHZvaWQgUVpfRGVsZXRlRGV2aWNlIChTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKK3sKKyAgICBfVEhJUyA9IGRldmljZTsKKyAgICBRWl9SZWxlYXNlRGlzcGxheU1vZGUodGhpcywgc2F2ZV9tb2RlKTsKKyAgICBRWl9SZWxlYXNlRGlzcGxheU1vZGUodGhpcywgbW9kZSk7CisgICAgU0RMX2ZyZWUgKGRldmljZS0+aGlkZGVuKTsKKyAgICBTRExfZnJlZSAoZGV2aWNlKTsKK30KKworc3RhdGljIHZvaWQgUVpfR2V0TW9kZUluZm8oX1RISVMsIGNvbnN0IHZvaWQgKl9tb2RlLCBVaW50MzIgKncsIFVpbnQzMiAqaCwgVWludDMyICpicHApCit7CisgICAgKncgPSAqaCA9ICpicHAgPSAwOworICAgIGlmIChfbW9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSAxMDYwKQorICAgIGlmICh1c2VfbmV3X21vZGVfYXBpcykgeworICAgICAgICBDR0Rpc3BsYXlNb2RlUmVmIHZpZG1vZGUgPSAoQ0dEaXNwbGF5TW9kZVJlZikgX21vZGU7CisgICAgICAgIENGU3RyaW5nUmVmIGZtdCA9IENHRGlzcGxheU1vZGVDb3B5UGl4ZWxFbmNvZGluZyh2aWRtb2RlKTsKKworICAgICAgICAqdyA9IChVaW50MzIpIENHRGlzcGxheU1vZGVHZXRXaWR0aCh2aWRtb2RlKTsKKyAgICAgICAgKmggPSAoVWludDMyKSBDR0Rpc3BsYXlNb2RlR2V0SGVpZ2h0KHZpZG1vZGUpOworCisgICAgICAgIC8qIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgMzItYml0IG1vZGVzLi4uICovCisgICAgICAgIGlmIChDRlN0cmluZ0NvbXBhcmUoZm10LCBDRlNUUihJTzMyQml0RGlyZWN0UGl4ZWxzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZDb21wYXJlQ2FzZUluc2Vuc2l0aXZlKSA9PSBrQ0ZDb21wYXJlRXF1YWxUbykgeworICAgICAgICAgICAgKmJwcCA9IDMyOworICAgICAgICB9CisKKyAgICAgICAgQ0ZSZWxlYXNlKGZtdCk7CisgICAgfQorI2VuZGlmCisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCAxMDYwKQorICAgIGlmICghdXNlX25ld19tb2RlX2FwaXMpIHsKKyAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmIHZpZG1vZGUgPSAoQ0ZEaWN0aW9uYXJ5UmVmKSBfbW9kZTsKKyAgICAgICAgQ0ZOdW1iZXJHZXRWYWx1ZSAoCisgICAgICAgICAgICBDRkRpY3Rpb25hcnlHZXRWYWx1ZSAodmlkbW9kZSwga0NHRGlzcGxheUJpdHNQZXJQaXhlbCksCisgICAgICAgICAgICBrQ0ZOdW1iZXJTSW50MzJUeXBlLCBicHApOworCisgICAgICAgIENGTnVtYmVyR2V0VmFsdWUgKAorICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUgKHZpZG1vZGUsIGtDR0Rpc3BsYXlXaWR0aCksCisgICAgICAgICAgICBrQ0ZOdW1iZXJTSW50MzJUeXBlLCB3KTsKKworICAgICAgICBDRk51bWJlckdldFZhbHVlICgKKyAgICAgICAgICAgIENGRGljdGlvbmFyeUdldFZhbHVlICh2aWRtb2RlLCBrQ0dEaXNwbGF5SGVpZ2h0KSwKKyAgICAgICAgICAgIGtDRk51bWJlclNJbnQzMlR5cGUsIGgpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogd2Ugb25seSBjYXJlIGFib3V0IHRoZSAzMi1iaXQgbW9kZXMuLi4gKi8KKyAgICBpZiAoKmJwcCAhPSAzMikgeworICAgICAgICAqYnBwID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgUVpfVmlkZW9Jbml0IChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2aWRlb19mb3JtYXQpCit7CisgICAgTlNSZWN0IHIgPSBOU01ha2VSZWN0KDAuMCwgMC4wLCAwLjAsIDAuMCk7CisgICAgY29uc3QgY2hhciAqZW52ID0gTlVMTDsKKworICAgIGlmICggR2VzdGFsdChnZXN0YWx0U3lzdGVtVmVyc2lvbiwgJnN5c3RlbV92ZXJzaW9uKSAhPSBub0VyciApCisgICAgICAgIHN5c3RlbV92ZXJzaW9uID0gMDsKKworICAgIHVzZV9uZXdfbW9kZV9hcGlzID0gTk87CisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSAxMDYwKQorICAgIHVzZV9uZXdfbW9kZV9hcGlzID0gSVNfU05PV19MRU9QQVJEX09SX0xBVEVSKHRoaXMpOworI2VuZGlmCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSB2aWRlbyBzZXR0aW5nczsgdGhpcyBkYXRhIHBlcnNpc3RzIGJldHdlZW4gbW9kZSBzd2l0Y2hlcyAqLworICAgIGRpc3BsYXlfaWQgPSBrQ0dEaXJlY3RNYWluRGlzcGxheTsKKworI2lmIDAgLyogVGhlIG1vdXNlIGV2ZW50IGNvZGUgbmVlZHMgdG8gdGFrZSB0aGlzIGludG8gYWNjb3VudC4uLiAqLworICAgIGVudiA9IGdldGVudigiU0RMX1ZJREVPX0ZVTExTQ1JFRU5fRElTUExBWSIpOworICAgIGlmICggZW52ICkgeworICAgICAgICBpbnQgbW9uaXRvciA9IFNETF9hdG9pKGVudik7CisgICAgCUNHRGlyZWN0RGlzcGxheUlEIGFjdGl2ZURzcHlzIFszXTsKKyAgICAJQ0dEaXNwbGF5Q291bnQgZHNweUNudDsKKyAgICAJQ0dHZXRBY3RpdmVEaXNwbGF5TGlzdCAoMywgYWN0aXZlRHNweXMsICZkc3B5Q250KTsKKyAgICAgICAgaWYgKCBtb25pdG9yID49IDAgJiYgbW9uaXRvciA8IGRzcHlDbnQgKSB7CisgICAgCSAgICBkaXNwbGF5X2lkID0gYWN0aXZlRHNweXNbbW9uaXRvcl07CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IDEwNjApCisgICAgaWYgKHVzZV9uZXdfbW9kZV9hcGlzKSB7CisgICAgICAgIHNhdmVfbW9kZSA9IENHRGlzcGxheUNvcHlEaXNwbGF5TW9kZShkaXNwbGF5X2lkKTsKKyAgICB9CisjZW5kaWYKKworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNjApCisgICAgaWYgKCF1c2VfbmV3X21vZGVfYXBpcykgeworICAgICAgICBzYXZlX21vZGUgPSBDR0Rpc3BsYXlDdXJyZW50TW9kZShkaXNwbGF5X2lkKTsKKyAgICB9CisjZW5kaWYKKworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNzApCisgICAgaWYgKCFJU19MSU9OX09SX0xBVEVSKHRoaXMpKSB7CisgICAgICAgIHBhbGV0dGUgPSBDR1BhbGV0dGVDcmVhdGVEZWZhdWx0Q29sb3JQYWxldHRlKCk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoc2F2ZV9tb2RlID09IE5VTEwpIHsKKyAgICAgICAgU0RMX1NldEVycm9yKCJDb3VsZG4ndCBmaWd1cmUgb3V0IGN1cnJlbnQgZGlzcGxheSBtb2RlLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQWxsb3cgZW52aXJvbm1lbnQgb3ZlcnJpZGUgb2Ygc2NyZWVuc2F2ZXIgZGlzYWJsZS4gKi8KKyAgICBlbnYgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fQUxMT1dfU0NSRUVOU0FWRVIiKTsKKyAgICBpZiAoIGVudiApIHsKKyAgICAgICAgYWxsb3dfc2NyZWVuc2F2ZXIgPSBTRExfYXRvaShlbnYpOworICAgIH0gZWxzZSB7CisjaWZkZWYgU0RMX1ZJREVPX0RJU0FCTEVfU0NSRUVOU0FWRVIKKyAgICAgICAgYWxsb3dfc2NyZWVuc2F2ZXIgPSAwOworI2Vsc2UKKyAgICAgICAgYWxsb3dfc2NyZWVuc2F2ZXIgPSAxOworI2VuZGlmCisgICAgfQorCisgICAgLyogR2F0aGVyIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VmdWwgdG8ga25vdyBhYm91dCB0aGUgZGlzcGxheSAqLworICAgIFFaX0dldE1vZGVJbmZvKHRoaXMsIHNhdmVfbW9kZSwgJmRldmljZV93aWR0aCwgJmRldmljZV9oZWlnaHQsICZkZXZpY2VfYnBwKTsKKyAgICBpZiAoZGV2aWNlX2JwcCA9PSAwKSB7CisgICAgICAgIFFaX1JlbGVhc2VEaXNwbGF5TW9kZSh0aGlzLCBzYXZlX21vZGUpOworICAgICAgICBzYXZlX21vZGUgPSBOVUxMOworICAgICAgICBTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGRpc3BsYXkgbW9kZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCisgICAgdGhpcy0+aW5mby5jdXJyZW50X3cgPSBkZXZpY2Vfd2lkdGg7CisgICAgdGhpcy0+aW5mby5jdXJyZW50X2ggPSBkZXZpY2VfaGVpZ2h0OworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHNjcmVlbiBkZXB0aCAqLworICAgIHZpZGVvX2Zvcm1hdC0+Qml0c1BlclBpeGVsID0gZGV2aWNlX2JwcDsKKworICAgIC8qIFNldCBtaXNjIGdsb2JhbHMgKi8KKyAgICBjdXJyZW50X2dyYWJfbW9kZSA9IFNETF9HUkFCX09GRjsKKyAgICBjdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGUgICAgPSBZRVM7CisgICAgY3Vyc29yX3Zpc2libGUgICAgICAgICAgICAgID0gWUVTOworICAgIGN1cnJlbnRfbW9kcyA9IDA7CisgICAgZmllbGRfZWRpdCA9ICBbW1NETFRyYW5zbGF0b3JSZXNwb25kZXIgYWxsb2NdIGluaXRXaXRoRnJhbWU6cl07CisKKyAgICAvKiByZWdpc3RlciBmb3Igc2xlZXAgbm90aWZpY2F0aW9ucyBzbyB3YWtlIGZyb20gc2xlZXAgZ2VuZXJhdGVzIFNETF9WSURFT0VYUE9TRSAqLworICAgIFFaX1JlZ2lzdGVyRm9yU2xlZXBOb3RpZmljYXRpb25zICh0aGlzKTsKKyAgICAKKyAgICAvKiBGaWxsIGluIHNvbWUgd2luZG93IG1hbmFnZXIgY2FwYWJpbGl0aWVzICovCisgICAgdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTRExfUmVjdCoqIFFaX0xpc3RNb2RlcyAoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpCit7CisgICAgQ0ZBcnJheVJlZiBtb2RlX2xpc3QgPSBOVUxMOyAgICAgICAgICAvKiBsaXN0IG9mIGF2YWlsYWJsZSBmdWxsc2NyZWVuIG1vZGVzICovCisgICAgQ0ZJbmRleCBudW1fbW9kZXM7CisgICAgQ0ZJbmRleCBpOworCisgICAgaW50IGxpc3Rfc2l6ZSA9IDA7CisKKyAgICAvKiBBbnkgd2luZG93ZWQgbW9kZSBpcyBhY2NlcHRhYmxlICovCisgICAgaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gMCApCisgICAgICAgIHJldHVybiAoU0RMX1JlY3QqKiktMTsKKworICAgIC8qIEZyZWUgbWVtb3J5IGZyb20gcHJldmlvdXMgY2FsbCwgaWYgYW55ICovCisgICAgaWYgKCBjbGllbnRfbW9kZV9saXN0ICE9IE5VTEwgKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGNsaWVudF9tb2RlX2xpc3RbaV0gIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgU0RMX2ZyZWUgKGNsaWVudF9tb2RlX2xpc3RbaV0pOworCisgICAgICAgIFNETF9mcmVlIChjbGllbnRfbW9kZV9saXN0KTsKKyAgICAgICAgY2xpZW50X21vZGVfbGlzdCA9IE5VTEw7CisgICAgfQorCisjaWYgKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gMTA2MCkKKyAgICBpZiAodXNlX25ld19tb2RlX2FwaXMpIHsKKyAgICAgICAgbW9kZV9saXN0ID0gQ0dEaXNwbGF5Q29weUFsbERpc3BsYXlNb2RlcyhkaXNwbGF5X2lkLCBOVUxMKTsKKyAgICB9CisjZW5kaWYKKworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNjApCisgICAgaWYgKCF1c2VfbmV3X21vZGVfYXBpcykgeworICAgICAgICBtb2RlX2xpc3QgPSBDR0Rpc3BsYXlBdmFpbGFibGVNb2RlcyhkaXNwbGF5X2lkKTsKKyAgICB9CisjZW5kaWYKKworICAgIG51bV9tb2RlcyA9IENGQXJyYXlHZXRDb3VudCAobW9kZV9saXN0KTsKKworICAgIC8qIEJ1aWxkIGxpc3Qgb2YgbW9kZXMgd2l0aCB0aGUgcmVxdWVzdGVkIGJwcCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbW9kZXM7IGkrKykgeworICAgICAgICBVaW50MzIgd2lkdGgsIGhlaWdodCwgYnBwOworICAgICAgICBjb25zdCB2b2lkICpvbmVtb2RlID0gQ0ZBcnJheUdldFZhbHVlQXRJbmRleChtb2RlX2xpc3QsIGkpOworCisgICAgICAgIFFaX0dldE1vZGVJbmZvKHRoaXMsIG9uZW1vZGUsICZ3aWR0aCwgJmhlaWdodCwgJmJwcCk7CisKKyAgICAgICAgaWYgKGJwcCAmJiAoYnBwID09IGZvcm1hdC0+Qml0c1BlclBpeGVsKSkgeworICAgICAgICAgICAgaW50IGhhc01vZGUgPSBTRExfRkFMU0U7CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgLyogQ2hlY2sgaWYgbW9kZSBpcyBhbHJlYWR5IGluIHRoZSBsaXN0ICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdF9zaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50X21vZGVfbGlzdFtpXS0+dyA9PSB3aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICBjbGllbnRfbW9kZV9saXN0W2ldLT5oID09IGhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFzTW9kZSA9IFNETF9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBHcm93IHRoZSBsaXN0IGFuZCBhZGQgbW9kZSB0byB0aGUgbGlzdCAqLworICAgICAgICAgICAgaWYgKCAhIGhhc01vZGUgKSB7CisgICAgICAgICAgICAgICAgU0RMX1JlY3QgKnJlY3Q7CisKKyAgICAgICAgICAgICAgICBsaXN0X3NpemUrKzsKKworICAgICAgICAgICAgICAgIGlmIChjbGllbnRfbW9kZV9saXN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGNsaWVudF9tb2RlX2xpc3QgPSAoU0RMX1JlY3QqKikgCisgICAgICAgICAgICAgICAgICAgICAgICBTRExfbWFsbG9jIChzaXplb2YoKmNsaWVudF9tb2RlX2xpc3QpICogKGxpc3Rfc2l6ZSsxKSApOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiAhISEgRklYTUU6IHRoaXMgbGVha3MgbWVtb3J5IGlmIFNETF9yZWFsbG9jKCkgZmFpbHMhICovCisgICAgICAgICAgICAgICAgICAgIGNsaWVudF9tb2RlX2xpc3QgPSAoU0RMX1JlY3QqKikKKyAgICAgICAgICAgICAgICAgICAgICAgIFNETF9yZWFsbG9jIChjbGllbnRfbW9kZV9saXN0LCBzaXplb2YoKmNsaWVudF9tb2RlX2xpc3QpICogKGxpc3Rfc2l6ZSsxKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVjdCA9IChTRExfUmVjdCopIFNETF9tYWxsb2MgKHNpemVvZigqKmNsaWVudF9tb2RlX2xpc3QpKTsKKworICAgICAgICAgICAgICAgIGlmIChjbGllbnRfbW9kZV9saXN0ID09IE5VTEwgfHwgcmVjdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFFaX1JlbGVhc2VEaXNwbGF5TW9kZUxpc3QodGhpcywgbW9kZV9saXN0KTsKKyAgICAgICAgICAgICAgICAgICAgU0RMX091dE9mTWVtb3J5ICgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZWN0LT54ID0gcmVjdC0+eSA9IDA7CisgICAgICAgICAgICAgICAgcmVjdC0+dyA9IHdpZHRoOworICAgICAgICAgICAgICAgIHJlY3QtPmggPSBoZWlnaHQ7CisKKyAgICAgICAgICAgICAgICBjbGllbnRfbW9kZV9saXN0W2xpc3Rfc2l6ZS0xXSA9IHJlY3Q7CisgICAgICAgICAgICAgICAgY2xpZW50X21vZGVfbGlzdFtsaXN0X3NpemVdICAgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUVpfUmVsZWFzZURpc3BsYXlNb2RlTGlzdCh0aGlzLCBtb2RlX2xpc3QpOworCisgICAgLyogU29ydCBsaXN0IGxhcmdlc3QgdG8gc21hbGxlc3QgKGJ5IGFyZWEpICovCisgICAgeworICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpc3Rfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGlzdF9zaXplLTE7IGorKykgeworCisgICAgICAgICAgICAgICAgaW50IGFyZWExLCBhcmVhMjsKKyAgICAgICAgICAgICAgICBhcmVhMSA9IGNsaWVudF9tb2RlX2xpc3Rbal0tPncgKiBjbGllbnRfbW9kZV9saXN0W2pdLT5oOworICAgICAgICAgICAgICAgIGFyZWEyID0gY2xpZW50X21vZGVfbGlzdFtqKzFdLT53ICogY2xpZW50X21vZGVfbGlzdFtqKzFdLT5oOworCisgICAgICAgICAgICAgICAgaWYgKGFyZWExIDwgYXJlYTIpIHsKKyAgICAgICAgICAgICAgICAgICAgU0RMX1JlY3QgKnRtcCA9IGNsaWVudF9tb2RlX2xpc3Rbal07CisgICAgICAgICAgICAgICAgICAgIGNsaWVudF9tb2RlX2xpc3Rbal0gPSBjbGllbnRfbW9kZV9saXN0W2orMV07CisgICAgICAgICAgICAgICAgICAgIGNsaWVudF9tb2RlX2xpc3RbaisxXSA9IHRtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2xpZW50X21vZGVfbGlzdDsKK30KKworc3RhdGljIFNETF9ib29sIFFaX1dpbmRvd1Bvc2l0aW9uKF9USElTLCBpbnQgKngsIGludCAqeSkKK3sKKyAgICBjb25zdCBjaGFyICp3aW5kb3cgPSBnZXRlbnYoIlNETF9WSURFT19XSU5ET1dfUE9TIik7CisgICAgaWYgKCB3aW5kb3cgKSB7CisgICAgICAgIGlmICggc3NjYW5mKHdpbmRvdywgIiVkLCVkIiwgeCwgeSkgPT0gMiApIHsKKyAgICAgICAgICAgIHJldHVybiBTRExfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU0RMX0ZBTFNFOworfQorCitzdGF0aWMgQ0dFcnJvciBRWl9TZXREaXNwbGF5TW9kZShfVEhJUywgY29uc3Qgdm9pZCAqdmlkbW9kZSkKK3sKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSAxMDYwKQorICAgIGlmICh1c2VfbmV3X21vZGVfYXBpcykgeworICAgICAgICByZXR1cm4gQ0dEaXNwbGF5U2V0RGlzcGxheU1vZGUoZGlzcGxheV9pZCwgKENHRGlzcGxheU1vZGVSZWYpIHZpZG1vZGUsIE5VTEwpOworICAgIH0KKyNlbmRpZgorCisjaWYgKE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDwgMTA2MCkKKyAgICBpZiAoIXVzZV9uZXdfbW9kZV9hcGlzKSB7CisgICAgICAgIHJldHVybiBDR0Rpc3BsYXlTd2l0Y2hUb01vZGUoZGlzcGxheV9pZCwgKENGRGljdGlvbmFyeVJlZikgdmlkbW9kZSk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4ga0NHRXJyb3JGYWlsdXJlOworfQorCitzdGF0aWMgaW5saW5lIENHRXJyb3IgUVpfUmVzdG9yZURpc3BsYXlNb2RlKF9USElTKQoreworICAgIHJldHVybiBRWl9TZXREaXNwbGF5TW9kZSh0aGlzLCBzYXZlX21vZGUpOworfQorCitzdGF0aWMgdm9pZCBRWl9VbnNldFZpZGVvTW9kZSAoX1RISVMsIEJPT0wgdG9fZGVza3RvcCwgQk9PTCBzYXZlX2dsKQoreworICAgIC8qIFJlc2V0IHZhbHVlcyB0aGF0IG1heSBjaGFuZ2UgYmV0d2VlbiBzd2l0Y2hlcyAqLworICAgIHRoaXMtPmluZm8uYmxpdF9maWxsICA9IDA7CisgICAgdGhpcy0+RmlsbEhXUmVjdCAgICAgID0gTlVMTDsKKyAgICB0aGlzLT5VcGRhdGVSZWN0cyAgICAgPSBOVUxMOworICAgIHRoaXMtPkxvY2tIV1N1cmZhY2UgICA9IE5VTEw7CisgICAgdGhpcy0+VW5sb2NrSFdTdXJmYWNlID0gTlVMTDsKKworICAgIGlmIChjZ19jb250ZXh0KSB7CisgICAgICAgIENHQ29udGV4dEZsdXNoIChjZ19jb250ZXh0KTsKKyAgICAgICAgQ0dDb250ZXh0UmVsZWFzZSAoY2dfY29udGV4dCk7CisgICAgICAgIGNnX2NvbnRleHQgPSBuaWw7CisgICAgfQorICAgIAorICAgIC8qIFJlbGVhc2UgZnVsbHNjcmVlbiByZXNvdXJjZXMgKi8KKyAgICBpZiAoIG1vZGVfZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKKworICAgICAgICBOU1JlY3Qgc2NyZWVuX3JlY3Q7CisKKyAgICAgICAgLyogIFJlbGVhc2UgZG91YmxlIGJ1ZmZlciBzdHVmZiAqLworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNzApCisgICAgICAgIGlmICggIUlTX0xJT05fT1JfTEFURVIodGhpcykgJiYgKG1vZGVfZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSApIHsKKyAgICAgICAgICAgIHF1aXRfdGhyZWFkID0gWUVTOworICAgICAgICAgICAgU0RMX1NlbVBvc3QgKHNlbTEpOworICAgICAgICAgICAgU0RMX1dhaXRUaHJlYWQgKHRocmVhZCwgTlVMTCk7CisgICAgICAgICAgICBTRExfRGVzdHJveVNlbWFwaG9yZSAoc2VtMSk7CisgICAgICAgICAgICBTRExfRGVzdHJveVNlbWFwaG9yZSAoc2VtMik7CisgICAgICAgICAgICBTRExfZnJlZSAoc3dfYnVmZmVyc1swXSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qIElmIHdlIHN0aWxsIGhhdmUgYSB2YWxpZCB3aW5kb3csIGNsb3NlIGl0LiAqLworICAgICAgICBpZiAoIHF6X3dpbmRvdyApIHsKKyAgICAgICAgICAgIE5TQ0Fzc2VydChbIHF6X3dpbmRvdyBkZWxlZ2F0ZSBdID09IG5pbCwgQCJmdWxsIHNjcmVlbiB3aW5kb3cgc2hvdWxkbid0IGhhdmUgYSBkZWxlZ2F0ZSIpOyAvKiBpZiB0aGF0IHNob3VsZCBldmVyIGNoYW5nZSwgd2UnZCBoYXZlIHRvIHJlbGVhc2UgaXQgaGVyZSAqLworICAgICAgICAgICAgWyBxel93aW5kb3cgY2xvc2UgXTsgLyogaW5jbHVkZXMgcmVsZWFzZSBiZWNhdXNlIFtxel93aW5kb3cgaXNSZWxlYXNlZFdoZW5DbG9zZWRdICovCisgICAgICAgICAgICBxel93aW5kb3cgPSBuaWw7CisgICAgICAgICAgICB3aW5kb3dfdmlldyA9IG5pbDsKKyAgICAgICAgfQorICAgICAgICAvKiAKKyAgICAgICAgICAgIFJlbGVhc2UgdGhlIE9wZW5HTCBjb250ZXh0CisgICAgICAgICAgICBEbyB0aGlzIGZpcnN0IHRvIGF2b2lkIHRyYXNoIG9uIHRoZSBkaXNwbGF5IGJlZm9yZSBmYWRlCisgICAgICAgICovCisgICAgICAgIGlmICggbW9kZV9mbGFncyAmIFNETF9PUEVOR0wgKSB7CisgICAgICAgICAgICBpZiAoIXNhdmVfZ2wpIHsKKyAgICAgICAgICAgICAgICBRWl9UZWFyRG93bk9wZW5HTCAodGhpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNpZmRlZiBfX3Bvd2VycGNfXyAgLyogd2Ugb25seSB1c2UgdGhpcyBmb3IgcHJlLTEwLjMgY29tcGF0aWJpbGl0eS4gKi8KKyAgICAgICAgICAgIENHTFNldEZ1bGxTY3JlZW4gKE5VTEwpOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvX2Rlc2t0b3ApIHsKKyAgICAgICAgICAgIC8qICEhISBGSVhNRToga2VlcCBhbiBleWUgb24gdGhpcy4KKyAgICAgICAgICAgICAqIFRoaXMgQVBJIGlzIG9mZmljaWFsbHkgdW5hdmFpbGFibGUgZm9yIDY0LWJpdCBiaW5hcmllcy4KKyAgICAgICAgICAgICAqICBJdCBoYXBwZW5zIHRvIHdvcmssIGFzIG9mIDEwLjcsIGJ1dCB3ZSdyZSBnb2luZyB0byBzZWUgaWYKKyAgICAgICAgICAgICAqICB3ZSBjYW4ganVzdCBzaW1wbHkgZG8gd2l0aG91dCBpdCBvbiBuZXdlciBPU2VzLi4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICNpZiAoTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCAxMDcwKSAmJiAhZGVmaW5lZChfX0xQNjRfXykKKyAgICAgICAgICAgIGlmICggIUlTX0xJT05fT1JfTEFURVIodGhpcykgKSB7CisgICAgICAgICAgICAgICAgU2hvd01lbnVCYXIgKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgLyogUmVzdG9yZSBvcmlnaW5hbCBzY3JlZW4gcmVzb2x1dGlvbi9icHAgKi8KKyAgICAgICAgICAgIFFaX1Jlc3RvcmVEaXNwbGF5TW9kZSAodGhpcyk7CisgICAgICAgICAgICBDR1JlbGVhc2VBbGxEaXNwbGF5cyAoKTsKKyAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgIFJlc2V0IHRoZSBtYWluIHNjcmVlbidzIHJlY3RhbmdsZQorICAgICAgICAgICAgICAgIFNlZSBjb21tZW50IGluIFFaX1NldFZpZGVvRnVsbHNjcmVlbiBmb3Igd2h5IHdlIGRvIHRoaXMKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBzY3JlZW5fcmVjdCA9IE5TTWFrZVJlY3QoMCwwLGRldmljZV93aWR0aCxkZXZpY2VfaGVpZ2h0KTsKKyAgICAgICAgICAgIFFaX1NldEZyYW1lKHRoaXMsIFsgTlNTY3JlZW4gbWFpblNjcmVlbiBdLCBzY3JlZW5fcmVjdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogUmVsZWFzZSB3aW5kb3cgbW9kZSByZXNvdXJjZXMgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgaWQgZGVsZWdhdGUgPSBbIHF6X3dpbmRvdyBkZWxlZ2F0ZSBdOworICAgICAgICBbIHF6X3dpbmRvdyBjbG9zZSBdOyAvKiBpbmNsdWRlcyByZWxlYXNlIGJlY2F1c2UgW3F6X3dpbmRvdyBpc1JlbGVhc2VkV2hlbkNsb3NlZF0gKi8KKyAgICAgICAgaWYgKGRlbGVnYXRlICE9IG5pbCkgWyBkZWxlZ2F0ZSByZWxlYXNlIF07CisgICAgICAgIHF6X3dpbmRvdyA9IG5pbDsKKyAgICAgICAgd2luZG93X3ZpZXcgPSBuaWw7CisKKyAgICAgICAgLyogUmVsZWFzZSB0aGUgT3BlbkdMIGNvbnRleHQgKi8KKyAgICAgICAgaWYgKCBtb2RlX2ZsYWdzICYgU0RMX09QRU5HTCApIHsKKyAgICAgICAgICAgIGlmICghc2F2ZV9nbCkgeworICAgICAgICAgICAgICAgIFFaX1RlYXJEb3duT3BlbkdMICh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNpZ25hbCBzdWNjZXNzZnVsIHRlYXJkb3duICovCisgICAgdmlkZW9fc2V0ID0gU0RMX0ZBTFNFOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCAqUVpfQmVzdE1vZGUoX1RISVMsIGNvbnN0IGludCBicHAsIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCkKK3sKKyAgICBjb25zdCB2b2lkICpiZXN0ID0gTlVMTDsKKworICAgIGlmIChicHAgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSAxMDYwKQorICAgIGlmICh1c2VfbmV3X21vZGVfYXBpcykgeworICAgICAgICAvKiBhcHBhcmVudGx5LCB3ZSBoYXZlIHRvIHJvbGwgb3VyIG93biBub3cuIDovICovCisgICAgICAgIENGQXJyYXlSZWYgbW9kZV9saXN0ID0gQ0dEaXNwbGF5Q29weUFsbERpc3BsYXlNb2RlcyhkaXNwbGF5X2lkLCBOVUxMKTsKKyAgICAgICAgaWYgKG1vZGVfbGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb25zdCBDRkluZGV4IG51bV9tb2RlcyA9IENGQXJyYXlHZXRDb3VudChtb2RlX2xpc3QpOworICAgICAgICAgICAgQ0ZJbmRleCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9tb2RlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmlkbW9kZSA9IENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgobW9kZV9saXN0LCBpKTsKKyAgICAgICAgICAgICAgICBVaW50MzIgdGhpc3csIHRoaXNoLCB0aGlzYnBwOworICAgICAgICAgICAgICAgIFFaX0dldE1vZGVJbmZvKHRoaXMsIHZpZG1vZGUsICZ0aGlzdywgJnRoaXNoLCAmdGhpc2JwcCk7CisKKyAgICAgICAgICAgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgZXhhY3QgbWF0Y2hlcywgYXBwYXJlbnRseS4gKi8KKyAgICAgICAgICAgICAgICBpZiAoKHRoaXNicHAgPT0gYnBwKSAmJiAodGhpc3cgPT0gdykgJiYgKHRoaXNoID09IGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3QgPSB2aWRtb2RlOworICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8qIGdvdCBpdCEgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDR0Rpc3BsYXlNb2RlUmV0YWluKChDR0Rpc3BsYXlNb2RlUmVmKSBiZXN0KTsgIC8qIE5VTEwgaXMgb2sgKi8KKyAgICAgICAgICAgIENGUmVsZWFzZShtb2RlX2xpc3QpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCAxMDYwKQorICAgIGlmICghdXNlX25ld19tb2RlX2FwaXMpIHsKKyAgICAgICAgYm9vbGVhbl90IGV4YWN0ID0gMDsKKyAgICAgICAgYmVzdCA9IENHRGlzcGxheUJlc3RNb2RlRm9yUGFyYW1ldGVycyhkaXNwbGF5X2lkLCBicHAsIHcsIGgsICZleGFjdCk7CisgICAgICAgIGlmICghZXhhY3QpIHsKKyAgICAgICAgICAgIGJlc3QgPSBOVUxMOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gYmVzdDsKK30KKworc3RhdGljIFNETF9TdXJmYWNlKiBRWl9TZXRWaWRlb0Z1bGxTY3JlZW4gKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCT09MIHNhdmVfZ2wpCit7CisgICAgY29uc3QgQk9PTCBpc0xpb24gPSBJU19MSU9OX09SX0xBVEVSKHRoaXMpOworICAgIE5TUmVjdCBzY3JlZW5fcmVjdDsKKyAgICBDR0Vycm9yIGVycm9yOworICAgIE5TUmVjdCBjb250ZW50UmVjdDsKKyAgICBDR0Rpc3BsYXlGYWRlUmVzZXJ2YXRpb25Ub2tlbiBmYWRlX3Rva2VuID0ga0NHRGlzcGxheUZhZGVSZXNlcnZhdGlvbkludmFsaWRUb2tlbjsKKworICAgIGN1cnJlbnQtPmZsYWdzID0gU0RMX0ZVTExTQ1JFRU47CisgICAgY3VycmVudC0+dyA9IHdpZHRoOworICAgIGN1cnJlbnQtPmggPSBoZWlnaHQ7CisKKyAgICBjb250ZW50UmVjdCA9IE5TTWFrZVJlY3QgKDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCisgICAgLyogRmFkZSB0byBibGFjayB0byBoaWRlIHJlc29sdXRpb24tc3dpdGNoaW5nIGZsaWNrZXIgKGFuZCBnYXJiYWdlCisgICAgICAgdGhhdCBpcyBkaXNwbGF5ZWQgYnkgYSBkZXN0cm95ZWQgT3BlbkdMIGNvbnRleHQsIGlmIGFwcGxpY2FibGUpICovCisgICAgaWYgKCBDR0FjcXVpcmVEaXNwbGF5RmFkZVJlc2VydmF0aW9uICg1LCAmZmFkZV90b2tlbikgPT0ga0NHRXJyb3JTdWNjZXNzICkgeworICAgICAgICBDR0Rpc3BsYXlGYWRlIChmYWRlX3Rva2VuLCAwLjMsIGtDR0Rpc3BsYXlCbGVuZE5vcm1hbCwga0NHRGlzcGxheUJsZW5kU29saWRDb2xvciwgMC4wLCAwLjAsIDAuMCwgVFJVRSk7CisgICAgfQorICAgIAorICAgIC8qIERlc3Ryb3kgYW55IHByZXZpb3VzIG1vZGUgKi8KKyAgICBpZiAodmlkZW9fc2V0ID09IFNETF9UUlVFKQorICAgICAgICBRWl9VbnNldFZpZGVvTW9kZSAodGhpcywgRkFMU0UsIHNhdmVfZ2wpOworCisgICAgLyogU29ycnksIFF1aWNrRHJhdyB3YXMgcmlwcGVkIG91dC4gKi8KKyAgICBpZiAoZ2V0ZW52KCJTRExfTlNXaW5kb3dQb2ludGVyIikgfHwgZ2V0ZW52KCJTRExfTlNRdWlja0RyYXdWaWV3UG9pbnRlciIpKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoIkVtYmVkZGVkIFF1aWNrRHJhdyB3aW5kb3dzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIik7CisgICAgICAgIGdvdG8gRVJSX05PX01BVENIOworICAgIH0KKworICAgIFFaX1JlbGVhc2VEaXNwbGF5TW9kZSh0aGlzLCBtb2RlKTsgIC8qIE5VTEwgaXMgb2theS4gKi8KKworICAgIC8qIFNlZSBpZiByZXF1ZXN0ZWQgbW9kZSBleGlzdHMgKi8KKyAgICBtb2RlID0gUVpfQmVzdE1vZGUodGhpcywgYnBwLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIC8qIFJlcXVpcmUgYW4gZXhhY3QgbWF0Y2ggdG8gdGhlIHJlcXVlc3RlZCBtb2RlICovCisgICAgaWYgKCBtb2RlID09IE5VTEwgKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoIkZhaWxlZCB0byBmaW5kIGRpc3BsYXkgcmVzb2x1dGlvbjogJWR4JWR4JWQiLCB3aWR0aCwgaGVpZ2h0LCBicHApOworICAgICAgICBnb3RvIEVSUl9OT19NQVRDSDsKKyAgICB9CisKKyAgICAvKiBQdXQgdXAgdGhlIGJsYW5raW5nIHdpbmRvdyAoYSB3aW5kb3cgYWJvdmUgYWxsIG90aGVyIHdpbmRvd3MpICovCisgICAgaWYgKGdldGVudiAoIlNETF9TSU5HTEVESVNQTEFZIikpCisgICAgICAgIGVycm9yID0gQ0dEaXNwbGF5Q2FwdHVyZSAoZGlzcGxheV9pZCk7CisgICAgZWxzZQorICAgICAgICBlcnJvciA9IENHQ2FwdHVyZUFsbERpc3BsYXlzICgpOworICAgICAgICAKKyAgICBpZiAoIENHRGlzcGxheU5vRXJyICE9IGVycm9yICkgeworICAgICAgICBTRExfU2V0RXJyb3IgKCJGYWlsZWQgY2FwdHVyaW5nIGRpc3BsYXkiKTsKKyAgICAgICAgZ290byBFUlJfTk9fQ0FQVFVSRTsKKyAgICB9CisKKyAgICAvKiBEbyB0aGUgcGh5c2ljYWwgc3dpdGNoICovCisgICAgaWYgKCBDR0Rpc3BsYXlOb0VyciAhPSBRWl9TZXREaXNwbGF5TW9kZSh0aGlzLCBtb2RlKSApIHsKKyAgICAgICAgU0RMX1NldEVycm9yICgiRmFpbGVkIHN3aXRjaGluZyBkaXNwbGF5IHJlc29sdXRpb24iKTsKKyAgICAgICAgZ290byBFUlJfTk9fU1dJVENIOworICAgIH0KKworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNzApCisgICAgaWYgKCAhaXNMaW9uICkgeworICAgICAgICBjdXJyZW50LT5waXhlbHMgPSAoVWludDMyKikgQ0dEaXNwbGF5QmFzZUFkZHJlc3MgKGRpc3BsYXlfaWQpOworICAgICAgICBjdXJyZW50LT5waXRjaCAgPSBDR0Rpc3BsYXlCeXRlc1BlclJvdyAoZGlzcGxheV9pZCk7CisKKyAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKKyAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX1BSRUFMTE9DOworICAgICAgICAvKiBjdXJyZW50LT5od2RhdGEgPSAodm9pZCAqKSBDR0Rpc3BsYXlHZXREcmF3aW5nQ29udGV4dCAoZGlzcGxheV9pZCk7ICovCisKKyAgICAgICAgdGhpcy0+VXBkYXRlUmVjdHMgICAgID0gUVpfRGlyZWN0VXBkYXRlOworICAgICAgICB0aGlzLT5Mb2NrSFdTdXJmYWNlICAgPSBRWl9Mb2NrSFdTdXJmYWNlOworICAgICAgICB0aGlzLT5VbmxvY2tIV1N1cmZhY2UgPSBRWl9VbmxvY2tIV1N1cmZhY2U7CisKKyAgICAgICAgLyogU2V0dXAgZG91YmxlLWJ1ZmZlciBlbXVsYXRpb24gKi8KKyAgICAgICAgaWYgKCBmbGFncyAmIFNETF9ET1VCTEVCVUYgKSB7CisgICAgICAgIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFNldHVwIGEgc29mdHdhcmUgYmFja2luZyBzdG9yZSBmb3IgcmVhc29uYWJsZSByZXN1bHRzIHdoZW4KKyAgICAgICAgICAgIGRvdWJsZSBidWZmZXJpbmcgaXMgcmVxdWVzdGVkIChzaW5jZSBhIHNpbmdsZS1idWZmZXJlZCBoYXJkd2FyZQorICAgICAgICAgICAgc3VyZmFjZSBsb29rcyBoaWRlb3VzKS4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgVGhlIGFjdHVhbCBzY3JlZW4gYmxpdCBvY2N1cnMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gYWxsb3cgCisgICAgICAgICAgICBvdGhlciBibGl0dGluZyB3aGlsZSB3YWl0aW5nIG9uIHRoZSBWQkwgKGFuZCBoZW5jZSByZXN1bHRzIGluIGhpZ2hlciBmcmFtZXJhdGVzKS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzLT5Mb2NrSFdTdXJmYWNlID0gTlVMTDsKKyAgICAgICAgICAgIHRoaXMtPlVubG9ja0hXU3VyZmFjZSA9IE5VTEw7CisgICAgICAgICAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IE5VTEw7CisgICAgICAgIAorICAgICAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gKFNETF9IV1NVUkZBQ0V8U0RMX0RPVUJMRUJVRik7CisgICAgICAgICAgICB0aGlzLT5VcGRhdGVSZWN0cyA9IFFaX0RvdWJsZUJ1ZmZlclVwZGF0ZTsKKyAgICAgICAgICAgIHRoaXMtPkxvY2tIV1N1cmZhY2UgPSBRWl9Mb2NrRG91YmxlQnVmZmVyOworICAgICAgICAgICAgdGhpcy0+VW5sb2NrSFdTdXJmYWNlID0gUVpfVW5sb2NrRG91YmxlQnVmZmVyOworICAgICAgICAgICAgdGhpcy0+RmxpcEhXU3VyZmFjZSA9IFFaX0ZsaXBEb3VibGVCdWZmZXI7CisKKyAgICAgICAgICAgIGN1cnJlbnQtPnBpeGVscyA9IFNETF9tYWxsb2MgKGN1cnJlbnQtPnBpdGNoICogY3VycmVudC0+aCAqIDIpOworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnBpeGVscyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU0RMX091dE9mTWVtb3J5ICgpOworICAgICAgICAgICAgICAgIGdvdG8gRVJSX0RPVUJMRUJVRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBzd19idWZmZXJzWzBdID0gY3VycmVudC0+cGl4ZWxzOworICAgICAgICAgICAgc3dfYnVmZmVyc1sxXSA9IChVaW50OCopY3VycmVudC0+cGl4ZWxzICsgY3VycmVudC0+cGl0Y2ggKiBjdXJyZW50LT5oOworICAgICAgICAKKyAgICAgICAgICAgIHF1aXRfdGhyZWFkID0gTk87CisgICAgICAgICAgICBzZW0xID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSAoMCk7CisgICAgICAgICAgICBzZW0yID0gU0RMX0NyZWF0ZVNlbWFwaG9yZSAoMSk7CisgICAgICAgICAgICB0aHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkICgoaW50ICgqKSh2b2lkICopKVFaX1RocmVhZEZsaXAsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBDR0Rpc3BsYXlDYW5TZXRQYWxldHRlIChkaXNwbGF5X2lkKSApCisgICAgICAgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOworICAgIH0KKyNlbmRpZgorCisgICAgLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHJlY3JlYXRlIHRoZSB3aW5kb3cgKi8KKyAgICBpZiAocXpfd2luZG93ID09IG5pbCkgeworICAgICAgICAvKiBNYW51YWxseSBjcmVhdGUgYSB3aW5kb3csIGF2b2lkcyBoYXZpbmcgYSBuaWIgZmlsZSByZXNvdXJjZSAqLworICAgICAgICBxel93aW5kb3cgPSBbIFsgU0RMX1F1YXJ0eldpbmRvdyBhbGxvYyBdIAorICAgICAgICAgICAgaW5pdFdpdGhDb250ZW50UmVjdDpjb250ZW50UmVjdAorICAgICAgICAgICAgICAgIHN0eWxlTWFzazooaXNMaW9uID8gTlNCb3JkZXJsZXNzV2luZG93TWFzayA6IDApCisgICAgICAgICAgICAgICAgICAgIGJhY2tpbmc6TlNCYWNraW5nU3RvcmVCdWZmZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXI6Tk8gXTsKKworICAgICAgICBpZiAocXpfd2luZG93ICE9IG5pbCkgeworICAgICAgICAgICAgWyBxel93aW5kb3cgc2V0QWNjZXB0c01vdXNlTW92ZWRFdmVudHM6WUVTIF07CisgICAgICAgICAgICBbIHF6X3dpbmRvdyBzZXRWaWV3c05lZWREaXNwbGF5Ok5PIF07CisgICAgICAgICAgICBpZiAoaXNMaW9uKSB7CisgICAgICAgICAgICAgICAgWyBxel93aW5kb3cgc2V0Q29udGVudFZpZXc6IFsgWyBbIFNETF9RdWFydHpWaWV3IGFsbG9jIF0gaW5pdCBdIGF1dG9yZWxlYXNlIF0gXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBXZSBhbHJlYWR5IGhhdmUgYSB3aW5kb3csIGp1c3QgY2hhbmdlIGl0cyBzaXplICovCisgICAgZWxzZSB7CisgICAgICAgIFsgcXpfd2luZG93IHNldENvbnRlbnRTaXplOmNvbnRlbnRSZWN0LnNpemUgXTsKKyAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gKFNETF9OT0ZSQU1FfFNETF9SRVNJWkFCTEUpICYgbW9kZV9mbGFnczsKKyAgICAgICAgWyB3aW5kb3dfdmlldyBzZXRGcmFtZVNpemU6Y29udGVudFJlY3Quc2l6ZSBdOworICAgIH0KKworICAgIC8qIFNldHVwIE9wZW5HTCBmb3IgYSBmdWxsc2NyZWVuIGNvbnRleHQgKi8KKyAgICBpZiAoZmxhZ3MgJiBTRExfT1BFTkdMKSB7CisKKyAgICAgICAgaWYgKCAhIHNhdmVfZ2wgKSB7CisgICAgICAgICAgICBpZiAoICEgUVpfU2V0dXBPcGVuR0wgKHRoaXMsIGJwcCwgZmxhZ3MpICkgeworICAgICAgICAgICAgICAgIGdvdG8gRVJSX05PX0dMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgTlNWaWV3IGFuZCBhZGQgaXQgdG8gb3VyIHdpbmRvdy4gIFRoZSBwcmVzZW5jZSBvZiBhIHZhbGlkIHdpbmRvdyBhbmQKKyAgICAgICAgICAgdmlldyBhbGxvdyB0aGUgY3Vyc29yIHRvIGJlIGNoYW5nZWQgd2hpbHN0IGluIGZ1bGxzY3JlZW4uKi8KKyAgICAgICAgd2luZG93X3ZpZXcgPSBbIFsgTlNWaWV3IGFsbG9jIF0gaW5pdFdpdGhGcmFtZTpjb250ZW50UmVjdCBdOworCisgICAgICAgIGlmICggaXNMaW9uICkgeworICAgICAgICAgICAgWyB3aW5kb3dfdmlldyBzZXRBdXRvcmVzaXppbmdNYXNrOiBOU1ZpZXdXaWR0aFNpemFibGUgfCBOU1ZpZXdIZWlnaHRTaXphYmxlIF07CisgICAgICAgIH0KKworICAgICAgICBbIFsgcXpfd2luZG93IGNvbnRlbnRWaWV3IF0gYWRkU3Vidmlldzp3aW5kb3dfdmlldyBdOworCisgICAgICAgIC8qIEFwcGFyZW50bHkgTGlvbiBjaGVja3Mgc29tZSB2ZXJzaW9uIGZsYWcgc2V0IGJ5IHRoZSBsaW5rZXIKKyAgICAgICAgICAgYW5kIGNoYW5nZXMgQVBJIGJlaGF2aW9yLiBBbm5veWluZy4gKi8KKyAgICAgICAgaWYgKCBpc0xpb24gKSB7CisgICAgICAgICAgICBbIHF6X3dpbmRvdyBzZXRMZXZlbDpDR1NoaWVsZGluZ1dpbmRvd0xldmVsKCkgXTsKKyAgICAgICAgICAgIFsgZ2xfY29udGV4dCBzZXRWaWV3OiB3aW5kb3dfdmlldyBdOworICAgICAgICAgICAgLy9bIGdsX2NvbnRleHQgc2V0RnVsbFNjcmVlbiBdOworICAgICAgICAgICAgWyBnbF9jb250ZXh0IHVwZGF0ZSBdOworICAgICAgICB9CisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCAxMDcwKQorICAgICAgICBpZiAoICFpc0xpb24gKSB7CisgICAgICAgICAgICBDR0xFcnJvciBlcnI7CisgICAgICAgICAgICBDR0xDb250ZXh0T2JqIGN0eDsKKworICAgICAgICAgICAgWyBxel93aW5kb3cgc2V0TGV2ZWw6TlNOb3JtYWxXaW5kb3dMZXZlbCBdOworICAgICAgICAgICAgY3R4ID0gUVpfR2V0Q0dMQ29udGV4dE9iaiAoZ2xfY29udGV4dCk7CisgICAgICAgICAgICBlcnIgPSBDR0xTZXRGdWxsU2NyZWVuIChjdHgpOworICAgIAorICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIkVycm9yIHNldHRpbmcgT3BlbkdMIGZ1bGxzY3JlZW46ICVzIiwgQ0dMRXJyb3JTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgZ290byBFUlJfTk9fR0w7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIFsgd2luZG93X3ZpZXcgcmVsZWFzZSBdOworICAgICAgICBbIGdsX2NvbnRleHQgbWFrZUN1cnJlbnRDb250ZXh0XTsKKworICAgICAgICBnbENsZWFyIChHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgICAgICBbIGdsX2NvbnRleHQgZmx1c2hCdWZmZXIgXTsKKworICAgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfT1BFTkdMOworICAgIH0gZWxzZSBpZiAoaXNMaW9uKSB7ICAvKiBGb3IgMkQsIHdlIGJ1aWxkIGEgQ0dCaXRtYXBDb250ZXh0ICovCisgICAgICAgIENHQ29sb3JTcGFjZVJlZiBjZ0NvbG9yc3BhY2U7CisKKyAgICAgICAgLyogT25seSByZWNyZWF0ZSB0aGUgdmlldyBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKi8KKyAgICAgICAgaWYgKHdpbmRvd192aWV3ID09IG5pbCkgeworICAgICAgICAgICAgd2luZG93X3ZpZXcgPSBbIFsgTlNWaWV3IGFsbG9jIF0gaW5pdFdpdGhGcmFtZTpjb250ZW50UmVjdCBdOworICAgICAgICAgICAgWyB3aW5kb3dfdmlldyBzZXRBdXRvcmVzaXppbmdNYXNrOiBOU1ZpZXdXaWR0aFNpemFibGUgfCBOU1ZpZXdIZWlnaHRTaXphYmxlIF07CisgICAgICAgICAgICBbIFsgcXpfd2luZG93IGNvbnRlbnRWaWV3IF0gYWRkU3Vidmlldzp3aW5kb3dfdmlldyBdOworICAgICAgICAgICAgWyB3aW5kb3dfdmlldyByZWxlYXNlIF07CisgICAgICAgIH0KKworICAgICAgICBjZ0NvbG9yc3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICAgICAgY3VycmVudC0+cGl0Y2ggPSA0ICogY3VycmVudC0+dzsKKyAgICAgICAgY3VycmVudC0+cGl4ZWxzID0gU0RMX21hbGxvYyAoY3VycmVudC0+aCAqIGN1cnJlbnQtPnBpdGNoKTsKKyAgICAgICAgCisgICAgICAgIGNnX2NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUgKGN1cnJlbnQtPnBpeGVscywgY3VycmVudC0+dywgY3VycmVudC0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsIGN1cnJlbnQtPnBpdGNoLCBjZ0NvbG9yc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7CisgICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UgKGNnQ29sb3JzcGFjZSk7CisgICAgICAgIAorICAgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfU1dTVVJGQUNFOworICAgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfQVNZTkNCTElUOworICAgICAgICBjdXJyZW50LT5od2RhdGEgPSAodm9pZCAqKSBjZ19jb250ZXh0OworCisgICAgICAgIC8qIEZvcmNlIHRoaXMgd2luZG93IHRvIGRyYXcgYWJvdmUgX2V2ZXJ5dGhpbmdfLiAqLworICAgICAgICBbIHF6X3dpbmRvdyBzZXRMZXZlbDpDR1NoaWVsZGluZ1dpbmRvd0xldmVsKCkgXTsKKworICAgICAgICB0aGlzLT5VcGRhdGVSZWN0cyAgICAgPSBRWl9VcGRhdGVSZWN0czsKKyAgICAgICAgdGhpcy0+TG9ja0hXU3VyZmFjZSAgID0gUVpfTG9ja0hXU3VyZmFjZTsKKyAgICAgICAgdGhpcy0+VW5sb2NrSFdTdXJmYWNlID0gUVpfVW5sb2NrSFdTdXJmYWNlOworICAgIH0KKworICAgIGlmIChpc0xpb24pIHsKKyAgICAgICAgWyBxel93aW5kb3cgc2V0SGFzU2hhZG93Ok5PXTsKKyAgICAgICAgWyBxel93aW5kb3cgc2V0T3BhcXVlOllFU107CisgICAgICAgIFsgcXpfd2luZG93IG1ha2VLZXlBbmRPcmRlckZyb250Om5pbCBdOworICAgIH0KKworICAgIC8qICEhISBGSVhNRToga2VlcCBhbiBleWUgb24gdGhpcy4KKyAgICAgKiBUaGlzIEFQSSBpcyBvZmZpY2lhbGx5IHVuYXZhaWxhYmxlIGZvciA2NC1iaXQgYmluYXJpZXMuCisgICAgICogIEl0IGhhcHBlbnMgdG8gd29yaywgYXMgb2YgMTAuNywgYnV0IHdlJ3JlIGdvaW5nIHRvIHNlZSBpZgorICAgICAqICB3ZSBjYW4ganVzdCBzaW1wbHkgZG8gd2l0aG91dCBpdCBvbiBuZXdlciBPU2VzLi4uCisgICAgICovCisgICAgI2lmIChNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNzApICYmICFkZWZpbmVkKF9fTFA2NF9fKQorICAgIGlmICggIWlzTGlvbiApIHsKKyAgICAgICAgLyogSWYgd2UgZG9uJ3QgaGlkZSBtZW51IGJhciwgaXQgd2lsbCBnZXQgZXZlbnRzIGFuZCBpbnRlcnJ1cHQgdGhlIHByb2dyYW0gKi8KKyAgICAgICAgSGlkZU1lbnVCYXIgKCk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyogRmFkZSBpbiBhZ2FpbiAoYXN5bmNocm9ub3VzbHkpICovCisgICAgaWYgKCBmYWRlX3Rva2VuICE9IGtDR0Rpc3BsYXlGYWRlUmVzZXJ2YXRpb25JbnZhbGlkVG9rZW4gKSB7CisgICAgICAgIENHRGlzcGxheUZhZGUgKGZhZGVfdG9rZW4sIDAuNSwga0NHRGlzcGxheUJsZW5kU29saWRDb2xvciwga0NHRGlzcGxheUJsZW5kTm9ybWFsLCAwLjAsIDAuMCwgMC4wLCBGQUxTRSk7CisgICAgICAgIENHUmVsZWFzZURpc3BsYXlGYWRlUmVzZXJ2YXRpb24oZmFkZV90b2tlbik7CisgICAgfQorCisgICAgLyogCisgICAgICAgIFRoZXJlIGlzIGEgYnVnIGluIENvY29hIHdoZXJlIE5TU2NyZWVuIGRvZXNuJ3Qgc3luY2hyb25pemUKKyAgICAgICAgd2l0aCBDR0RpcmVjdERpc3BsYXksIHNvIHRoZSBtYWluIHNjcmVlbidzIGZyYW1lIGlzIHdyb25nLgorICAgICAgICBBcyBhIHJlc3VsdCwgY29vcmRpbmF0ZSB0cmFuc2xhdGlvbiBwcm9kdWNlcyBpbmNvcnJlY3QgcmVzdWx0cy4KKyAgICAgICAgV2UgY2FuIGhhY2sgYXJvdW5kIHRoaXMgYnVnIGJ5IHNldHRpbmcgdGhlIHNjcmVlbiByZWN0CisgICAgICAgIG91cnNlbHZlcy4gVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGlmL3doZW4gdGhlIGJ1ZyBpcyBmaXhlZC4KKyAgICAqLworICAgIHNjcmVlbl9yZWN0ID0gTlNNYWtlUmVjdCgwLDAsd2lkdGgsaGVpZ2h0KTsKKyAgICBRWl9TZXRGcmFtZSh0aGlzLCBbIE5TU2NyZWVuIG1haW5TY3JlZW4gXSwgc2NyZWVuX3JlY3QpOworCisgICAgLyogU2F2ZSB0aGUgZmxhZ3MgdG8gZW5zdXJlIGNvcnJlY3QgdGVhci1kb3duICovCisgICAgbW9kZV9mbGFncyA9IGN1cnJlbnQtPmZsYWdzOworCisgICAgLyogU2V0IGFwcCBzdGF0ZSwgaGlkZSBjdXJzb3IgaWYgbmVjZXNzYXJ5LCAuLi4gKi8KKyAgICBRWl9Eb0FjdGl2YXRlKHRoaXMpOworCisgICAgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAvKiBTaW5jZSB0aGUgYmxhbmtpbmcgd2luZG93IGNvdmVycyAqYWxsKiB3aW5kb3dzIChldmVuIGZvcmNlIHF1aXQpIGNvcnJlY3QgcmVjb3ZlcnkgaXMgY3J1Y2lhbCAqLworRVJSX05PX0dMOiAgICAgIGdvdG8gRVJSX0RPVUJMRUJVRjsgIC8qIHRoaXMgZ290byBpcyB0byBzdG9wIGEgY29tcGlsZXIgd2FybmluZyBvbiBuZXdlciBTREtzLiAqLworRVJSX0RPVUJMRUJVRjogIFFaX1Jlc3RvcmVEaXNwbGF5TW9kZSh0aGlzKTsKK0VSUl9OT19TV0lUQ0g6ICBDR1JlbGVhc2VBbGxEaXNwbGF5cyAoKTsKK0VSUl9OT19DQVBUVVJFOgorRVJSX05PX01BVENIOiAgIGlmICggZmFkZV90b2tlbiAhPSBrQ0dEaXNwbGF5RmFkZVJlc2VydmF0aW9uSW52YWxpZFRva2VuICkgeworICAgICAgICAgICAgICAgICAgICBDR0Rpc3BsYXlGYWRlIChmYWRlX3Rva2VuLCAwLjUsIGtDR0Rpc3BsYXlCbGVuZFNvbGlkQ29sb3IsIGtDR0Rpc3BsYXlCbGVuZE5vcm1hbCwgMC4wLCAwLjAsIDAuMCwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBDR1JlbGVhc2VEaXNwbGF5RmFkZVJlc2VydmF0aW9uIChmYWRlX3Rva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBTRExfU3VyZmFjZSogUVpfU2V0VmlkZW9XaW5kb3dlZCAoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCAqYnBwLCBVaW50MzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJPT0wgc2F2ZV9nbCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3R5bGU7CisgICAgTlNSZWN0IGNvbnRlbnRSZWN0OworICAgIGludCBjZW50ZXJfd2luZG93ID0gMTsKKyAgICBpbnQgb3JpZ2luX3gsIG9yaWdpbl95OworICAgIENHRGlzcGxheUZhZGVSZXNlcnZhdGlvblRva2VuIGZhZGVfdG9rZW4gPSBrQ0dEaXNwbGF5RmFkZVJlc2VydmF0aW9uSW52YWxpZFRva2VuOworCisgICAgY3VycmVudC0+ZmxhZ3MgPSAwOworICAgIGN1cnJlbnQtPncgPSB3aWR0aDsKKyAgICBjdXJyZW50LT5oID0gaGVpZ2h0OworICAgIAorICAgIGNvbnRlbnRSZWN0ID0gTlNNYWtlUmVjdCAoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAvKgorICAgICAgICBDaGVjayBpZiB3ZSBzaG91bGQgY29tcGxldGVseSBkZXN0cm95IHRoZSBwcmV2aW91cyBtb2RlIAorICAgICAgICAtIElmIGl0IGlzIGZ1bGxzY3JlZW4KKyAgICAgICAgLSBJZiBpdCBoYXMgZGlmZmVyZW50IG5vZnJhbWUgb3IgcmVzaXphYmxlIGF0dHJpYnV0ZQorICAgICAgICAtIElmIGl0IGlzIE9wZW5HTCAoc2luY2UgZ2wgYXR0cmlidXRlcyBjb3VsZCBiZSBkaWZmZXJlbnQpCisgICAgICAgIC0gSWYgbmV3IG1vZGUgaXMgT3BlbkdMLCBidXQgcHJldmlvdXMgbW9kZSB3YXNuJ3QKKyAgICAqLworICAgIGlmICh2aWRlb19zZXQgPT0gU0RMX1RSVUUpIHsKKyAgICAgICAgaWYgKG1vZGVfZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgeworICAgICAgICAgICAgLyogRmFkZSB0byBibGFjayB0byBoaWRlIHJlc29sdXRpb24tc3dpdGNoaW5nIGZsaWNrZXIgKGFuZCBnYXJiYWdlCisgICAgICAgICAgICAgICB0aGF0IGlzIGRpc3BsYXllZCBieSBhIGRlc3Ryb3llZCBPcGVuR0wgY29udGV4dCwgaWYgYXBwbGljYWJsZSkgKi8KKyAgICAgICAgICAgIGlmIChDR0FjcXVpcmVEaXNwbGF5RmFkZVJlc2VydmF0aW9uICg1LCAmZmFkZV90b2tlbikgPT0ga0NHRXJyb3JTdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgQ0dEaXNwbGF5RmFkZSAoZmFkZV90b2tlbiwgMC4zLCBrQ0dEaXNwbGF5QmxlbmROb3JtYWwsIGtDR0Rpc3BsYXlCbGVuZFNvbGlkQ29sb3IsIDAuMCwgMC4wLCAwLjAsIFRSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUVpfVW5zZXRWaWRlb01vZGUgKHRoaXMsIFRSVUUsIHNhdmVfZ2wpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoKG1vZGVfZmxhZ3MgXiBmbGFncykgJiAoU0RMX05PRlJBTUV8U0RMX1JFU0laQUJMRSkpIHx8CisgICAgICAgICAgICAgICAgICAobW9kZV9mbGFncyAmIFNETF9PUEVOR0wpIHx8IAorICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU0RMX09QRU5HTCkgKSB7CisgICAgICAgICAgICBRWl9VbnNldFZpZGVvTW9kZSAodGhpcywgVFJVRSwgc2F2ZV9nbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogU29ycnksIFF1aWNrRHJhdyB3YXMgcmlwcGVkIG91dC4gKi8KKyAgICBpZiAoZ2V0ZW52KCJTRExfTlNXaW5kb3dQb2ludGVyIikgfHwgZ2V0ZW52KCJTRExfTlNRdWlja0RyYXdWaWV3UG9pbnRlciIpKSB7CisgICAgICAgIFNETF9TZXRFcnJvciAoIkVtYmVkZGVkIFF1aWNrRHJhdyB3aW5kb3dzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIik7CisgICAgICAgIGlmIChmYWRlX3Rva2VuICE9IGtDR0Rpc3BsYXlGYWRlUmVzZXJ2YXRpb25JbnZhbGlkVG9rZW4pIHsKKyAgICAgICAgICAgIENHRGlzcGxheUZhZGUgKGZhZGVfdG9rZW4sIDAuNSwga0NHRGlzcGxheUJsZW5kU29saWRDb2xvciwga0NHRGlzcGxheUJsZW5kTm9ybWFsLCAwLjAsIDAuMCwgMC4wLCBGQUxTRSk7CisgICAgICAgICAgICBDR1JlbGVhc2VEaXNwbGF5RmFkZVJlc2VydmF0aW9uIChmYWRlX3Rva2VuKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB3ZSBzaG91bGQgcmVjcmVhdGUgdGhlIHdpbmRvdyAqLworICAgIGlmIChxel93aW5kb3cgPT0gbmlsKSB7CisgICAgCisgICAgICAgIC8qIFNldCB0aGUgd2luZG93IHN0eWxlIGJhc2VkIG9uIGlucHV0IGZsYWdzICovCisgICAgICAgIGlmICggZmxhZ3MgJiBTRExfTk9GUkFNRSApIHsKKyAgICAgICAgICAgIHN0eWxlID0gTlNCb3JkZXJsZXNzV2luZG93TWFzazsKKyAgICAgICAgICAgIGN1cnJlbnQtPmZsYWdzIHw9IFNETF9OT0ZSQU1FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3R5bGUgPSBOU1RpdGxlZFdpbmRvd01hc2s7CisgICAgICAgICAgICBzdHlsZSB8PSAoTlNNaW5pYXR1cml6YWJsZVdpbmRvd01hc2sgfCBOU0Nsb3NhYmxlV2luZG93TWFzayk7CisgICAgICAgICAgICBpZiAoIGZsYWdzICYgU0RMX1JFU0laQUJMRSApIHsKKyAgICAgICAgICAgICAgICBzdHlsZSB8PSBOU1Jlc2l6YWJsZVdpbmRvd01hc2s7CisgICAgICAgICAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX1JFU0laQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE1hbnVhbGx5IGNyZWF0ZSBhIHdpbmRvdywgYXZvaWRzIGhhdmluZyBhIG5pYiBmaWxlIHJlc291cmNlICovCisgICAgICAgIHF6X3dpbmRvdyA9IFsgWyBTRExfUXVhcnR6V2luZG93IGFsbG9jIF0gCisgICAgICAgICAgICBpbml0V2l0aENvbnRlbnRSZWN0OmNvbnRlbnRSZWN0CisgICAgICAgICAgICAgICAgc3R5bGVNYXNrOnN0eWxlIAorICAgICAgICAgICAgICAgICAgICBiYWNraW5nOk5TQmFja2luZ1N0b3JlQnVmZmVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyOk5PIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAocXpfd2luZG93ID09IG5pbCkgeworICAgICAgICAgICAgU0RMX1NldEVycm9yICgiQ291bGQgbm90IGNyZWF0ZSB0aGUgQ29jb2Egd2luZG93Iik7CisgICAgICAgICAgICBpZiAoZmFkZV90b2tlbiAhPSBrQ0dEaXNwbGF5RmFkZVJlc2VydmF0aW9uSW52YWxpZFRva2VuKSB7CisgICAgICAgICAgICAgICAgQ0dEaXNwbGF5RmFkZSAoZmFkZV90b2tlbiwgMC41LCBrQ0dEaXNwbGF5QmxlbmRTb2xpZENvbG9yLCBrQ0dEaXNwbGF5QmxlbmROb3JtYWwsIDAuMCwgMC4wLCAwLjAsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICBDR1JlbGVhc2VEaXNwbGF5RmFkZVJlc2VydmF0aW9uIChmYWRlX3Rva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLypbIHF6X3dpbmRvdyBzZXRSZWxlYXNlZFdoZW5DbG9zZWQ6WUVTIF07Ki8gLyogbm8gbmVlZCB0byBzZXQgdGhpcyBhcyBpdCdzIHRoZSBkZWZhdWx0IGZvciBOU1dpbmRvd3MgKi8KKyAgICAgICAgUVpfU2V0Q2FwdGlvbih0aGlzLCB0aGlzLT53bV90aXRsZSwgdGhpcy0+d21faWNvbik7CisgICAgICAgIFsgcXpfd2luZG93IHNldEFjY2VwdHNNb3VzZU1vdmVkRXZlbnRzOllFUyBdOworICAgICAgICBbIHF6X3dpbmRvdyBzZXRWaWV3c05lZWREaXNwbGF5Ok5PIF07CisKKyAgICAgICAgaWYgKCBRWl9XaW5kb3dQb3NpdGlvbih0aGlzLCAmb3JpZ2luX3gsICZvcmlnaW5feSkgKSB7CisgICAgICAgICAgICAvKiBoYXZlIHRvIGZsaXAgdGhlIFkgdmFsdWUgKE5TUG9pbnQgaXMgbG93ZXIgbGVmdCBjb3JuZXIgb3JpZ2luKSAqLworICAgICAgICAgICAgWyBxel93aW5kb3cgc2V0RnJhbWVUb3BMZWZ0UG9pbnQ6TlNNYWtlUG9pbnQoKGZsb2F0KSBvcmlnaW5feCwgKGZsb2F0KSAodGhpcy0+aW5mby5jdXJyZW50X2ggLSBvcmlnaW5feSkpXTsKKyAgICAgICAgICAgIGNlbnRlcl93aW5kb3cgPSAwOworICAgICAgICB9IGVsc2UgaWYgKCBjZW50ZXJfd2luZG93ICkgeworICAgICAgICAgICAgWyBxel93aW5kb3cgY2VudGVyIF07CisgICAgICAgIH0KKworICAgICAgICBbIHF6X3dpbmRvdyBzZXREZWxlZ2F0ZToKKyAgICAgICAgICAgIFsgWyBTRExfUXVhcnR6V2luZG93RGVsZWdhdGUgYWxsb2MgXSBpbml0IF0gXTsKKyAgICAgICAgWyBxel93aW5kb3cgc2V0Q29udGVudFZpZXc6IFsgWyBbIFNETF9RdWFydHpWaWV3IGFsbG9jIF0gaW5pdCBdIGF1dG9yZWxlYXNlIF0gXTsKKyAgICB9CisgICAgLyogV2UgYWxyZWFkeSBoYXZlIGEgd2luZG93LCBqdXN0IGNoYW5nZSBpdHMgc2l6ZSAqLworICAgIGVsc2UgeworICAgICAgICBbIHF6X3dpbmRvdyBzZXRDb250ZW50U2l6ZTpjb250ZW50UmVjdC5zaXplIF07CisgICAgICAgIGN1cnJlbnQtPmZsYWdzIHw9IChTRExfTk9GUkFNRXxTRExfUkVTSVpBQkxFKSAmIG1vZGVfZmxhZ3M7CisgICAgICAgIFsgd2luZG93X3ZpZXcgc2V0RnJhbWVTaXplOmNvbnRlbnRSZWN0LnNpemUgXTsKKyAgICB9CisKKyAgICAvKiBGb3IgT3BlbkdMLCB3ZSBiaW5kIHRoZSBjb250ZXh0IHRvIGEgc3VidmlldyAqLworICAgIGlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgeworCisgICAgICAgIGlmICggISBzYXZlX2dsICkgeworICAgICAgICAgICAgaWYgKCAhIFFaX1NldHVwT3BlbkdMICh0aGlzLCAqYnBwLCBmbGFncykgKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhZGVfdG9rZW4gIT0ga0NHRGlzcGxheUZhZGVSZXNlcnZhdGlvbkludmFsaWRUb2tlbikgeworICAgICAgICAgICAgICAgICAgICBDR0Rpc3BsYXlGYWRlIChmYWRlX3Rva2VuLCAwLjUsIGtDR0Rpc3BsYXlCbGVuZFNvbGlkQ29sb3IsIGtDR0Rpc3BsYXlCbGVuZE5vcm1hbCwgMC4wLCAwLjAsIDAuMCwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBDR1JlbGVhc2VEaXNwbGF5RmFkZVJlc2VydmF0aW9uIChmYWRlX3Rva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3aW5kb3dfdmlldyA9IFsgWyBOU1ZpZXcgYWxsb2MgXSBpbml0V2l0aEZyYW1lOmNvbnRlbnRSZWN0IF07CisgICAgICAgIFsgd2luZG93X3ZpZXcgc2V0QXV0b3Jlc2l6aW5nTWFzazogTlNWaWV3V2lkdGhTaXphYmxlIHwgTlNWaWV3SGVpZ2h0U2l6YWJsZSBdOworICAgICAgICBbIFsgcXpfd2luZG93IGNvbnRlbnRWaWV3IF0gYWRkU3Vidmlldzp3aW5kb3dfdmlldyBdOworICAgICAgICBbIGdsX2NvbnRleHQgc2V0Vmlldzogd2luZG93X3ZpZXcgXTsKKyAgICAgICAgWyB3aW5kb3dfdmlldyByZWxlYXNlIF07CisgICAgICAgIFsgZ2xfY29udGV4dCBtYWtlQ3VycmVudENvbnRleHRdOworICAgICAgICBbIHF6X3dpbmRvdyBtYWtlS2V5QW5kT3JkZXJGcm9udDpuaWwgXTsKKyAgICAgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX09QRU5HTDsKKyAgICB9CisgICAgLyogRm9yIDJELCB3ZSBidWlsZCBhIENHQml0bWFwQ29udGV4dCAqLworICAgIGVsc2UgeworICAgICAgICBDR0NvbG9yU3BhY2VSZWYgY2dDb2xvcnNwYWNlOworCisgICAgICAgIC8qIE9ubHkgcmVjcmVhdGUgdGhlIHZpZXcgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0ICovCisgICAgICAgIGlmICh3aW5kb3dfdmlldyA9PSBuaWwpIHsKKyAgICAgICAgCisgICAgICAgICAgICB3aW5kb3dfdmlldyA9IFsgWyBOU1ZpZXcgYWxsb2MgXSBpbml0V2l0aEZyYW1lOmNvbnRlbnRSZWN0IF07CisgICAgICAgICAgICBbIHdpbmRvd192aWV3IHNldEF1dG9yZXNpemluZ01hc2s6IE5TVmlld1dpZHRoU2l6YWJsZSB8IE5TVmlld0hlaWdodFNpemFibGUgXTsKKyAgICAgICAgICAgIFsgWyBxel93aW5kb3cgY29udGVudFZpZXcgXSBhZGRTdWJ2aWV3OndpbmRvd192aWV3IF07CisgICAgICAgICAgICBbIHdpbmRvd192aWV3IHJlbGVhc2UgXTsKKyAgICAgICAgICAgIFsgcXpfd2luZG93IG1ha2VLZXlBbmRPcmRlckZyb250Om5pbCBdOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjZ0NvbG9yc3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICAgICAgY3VycmVudC0+cGl0Y2ggPSA0ICogY3VycmVudC0+dzsKKyAgICAgICAgY3VycmVudC0+cGl4ZWxzID0gU0RMX21hbGxvYyAoY3VycmVudC0+aCAqIGN1cnJlbnQtPnBpdGNoKTsKKyAgICAgICAgCisgICAgICAgIGNnX2NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUgKGN1cnJlbnQtPnBpeGVscywgY3VycmVudC0+dywgY3VycmVudC0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsIGN1cnJlbnQtPnBpdGNoLCBjZ0NvbG9yc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7CisgICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UgKGNnQ29sb3JzcGFjZSk7CisgICAgICAgIAorICAgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfU1dTVVJGQUNFOworICAgICAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfQVNZTkNCTElUOworICAgICAgICBjdXJyZW50LT5od2RhdGEgPSAodm9pZCAqKSBjZ19jb250ZXh0OworCisgICAgICAgIHRoaXMtPlVwZGF0ZVJlY3RzICAgICA9IFFaX1VwZGF0ZVJlY3RzOworICAgICAgICB0aGlzLT5Mb2NrSFdTdXJmYWNlICAgPSBRWl9Mb2NrSFdTdXJmYWNlOworICAgICAgICB0aGlzLT5VbmxvY2tIV1N1cmZhY2UgPSBRWl9VbmxvY2tIV1N1cmZhY2U7CisgICAgfQorCisgICAgLyogU2F2ZSBmbGFncyB0byBlbnN1cmUgY29ycmVjdCB0ZWFyZG93biAqLworICAgIG1vZGVfZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKKworICAgIC8qIEZhZGUgaW4gYWdhaW4gKGFzeW5jaHJvbm91c2x5KSBpZiB3ZSBjYW1lIGZyb20gYSBmdWxsc2NyZWVuIG1vZGUgYW5kIGZhZGVkIHRvIGJsYWNrICovCisgICAgaWYgKGZhZGVfdG9rZW4gIT0ga0NHRGlzcGxheUZhZGVSZXNlcnZhdGlvbkludmFsaWRUb2tlbikgeworICAgICAgICBDR0Rpc3BsYXlGYWRlIChmYWRlX3Rva2VuLCAwLjUsIGtDR0Rpc3BsYXlCbGVuZFNvbGlkQ29sb3IsIGtDR0Rpc3BsYXlCbGVuZE5vcm1hbCwgMC4wLCAwLjAsIDAuMCwgRkFMU0UpOworICAgICAgICBDR1JlbGVhc2VEaXNwbGF5RmFkZVJlc2VydmF0aW9uIChmYWRlX3Rva2VuKTsKKyAgICB9CisKKyAgICByZXR1cm4gY3VycmVudDsKK30KKworCitzdGF0aWMgU0RMX1N1cmZhY2UqIFFaX1NldFZpZGVvTW9kZUludGVybmFsIChfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50MzIgZmxhZ3MsIEJPT0wgc2F2ZV9nbCkKK3sKKyAgICBjb25zdCBCT09MIGlzTGlvbiA9IElTX0xJT05fT1JfTEFURVIodGhpcyk7CisKKyAgICBjdXJyZW50LT5mbGFncyA9IDA7CisgICAgY3VycmVudC0+cGl4ZWxzID0gTlVMTDsKKworICAgIC8qIFNldHVwIGZ1bGwgc2NyZWVuIHZpZGVvICovCisgICAgaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgeworICAgICAgICBpZiAoIGlzTGlvbiApIHsKKyAgICAgICAgICAgIGJwcCA9IDMyOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnQgPSBRWl9TZXRWaWRlb0Z1bGxTY3JlZW4gKHRoaXMsIGN1cnJlbnQsIHdpZHRoLCBoZWlnaHQsIGJwcCwgZmxhZ3MsIHNhdmVfZ2wgKTsKKyAgICAgICAgaWYgKGN1cnJlbnQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBTZXR1cCB3aW5kb3dlZCB2aWRlbyAqLworICAgIGVsc2UgeworICAgICAgICAvKiBGb3JjZSBicHAgdG8gMzIgKi8KKyAgICAgICAgYnBwID0gMzI7CisgICAgICAgIGN1cnJlbnQgPSBRWl9TZXRWaWRlb1dpbmRvd2VkICh0aGlzLCBjdXJyZW50LCB3aWR0aCwgaGVpZ2h0LCAmYnBwLCBmbGFncywgc2F2ZV9nbCApOworICAgICAgICBpZiAoY3VycmVudCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHF6X3dpbmRvdyAhPSBuaWwpIHsKKyAgICAgICAgbnNnZnhfY29udGV4dCA9IFtOU0dyYXBoaWNzQ29udGV4dCBncmFwaGljc0NvbnRleHRXaXRoV2luZG93OnF6X3dpbmRvd107CisgICAgICAgIFtOU0dyYXBoaWNzQ29udGV4dCBzZXRDdXJyZW50Q29udGV4dDpuc2dmeF9jb250ZXh0XTsKKyAgICB9CisKKyAgICAvKiBTZXR1cCB0aGUgbmV3IHBpeGVsIGZvcm1hdCAqLworICAgIHsKKyAgICAgICAgaW50IGFtYXNrID0gMCwKKyAgICAgICAgcm1hc2sgPSAwLAorICAgICAgICBnbWFzayA9IDAsCisgICAgICAgIGJtYXNrID0gMDsKKworICAgICAgICBzd2l0Y2ggKGJwcCkgeworICAgICAgICAgICAgY2FzZSAxNjogICAvKiAoMSktNS01LTUgUkdCICovCisgICAgICAgICAgICAgICAgYW1hc2sgPSAwOworICAgICAgICAgICAgICAgIHJtYXNrID0gMHg3QzAwOworICAgICAgICAgICAgICAgIGdtYXNrID0gMHgwM0UwOworICAgICAgICAgICAgICAgIGJtYXNrID0gMHgwMDFGOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICBTRExfU2V0RXJyb3IgKCIyNGJwcCBpcyBub3QgYXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBjYXNlIDMyOiAgIC8qICg4KS04LTgtOCBBUkdCICovCisgICAgICAgICAgICAgICAgYW1hc2sgPSAweDAwMDAwMDAwOworICAgICAgICAgICAgICAgIGlmICggKCFpc0xpb24pICYmIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcm1hc2sgPSAweDAwRkYwMDAwOworICAgICAgICAgICAgICAgICAgICBnbWFzayA9IDB4MDAwMEZGMDA7CisgICAgICAgICAgICAgICAgICAgIGJtYXNrID0gMHgwMDAwMDBGRjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KKyAgICAgICAgICAgICAgICAgICAgcm1hc2sgPSAweDAwMDBGRjAwOworICAgICAgICAgICAgICAgICAgICBnbWFzayA9IDB4MDBGRjAwMDA7CisgICAgICAgICAgICAgICAgICAgIGJtYXNrID0gMHhGRjAwMDAwMDsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIHJtYXNrID0gMHgwMEZGMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgZ21hc2sgPSAweDAwMDBGRjAwOworICAgICAgICAgICAgICAgICAgICBibWFzayA9IDB4MDAwMDAwRkY7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhIFNETF9SZWFsbG9jRm9ybWF0IChjdXJyZW50LCBicHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1hc2ssIGdtYXNrLCBibWFzaywgYW1hc2sgKSApIHsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIkNvdWxkbid0IHJlYWxsb2NhdGUgcGl4ZWwgZm9ybWF0Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNpZ25hbCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gKHVzZWQgaW50ZXJuYWxseSkgKi8KKyAgICB2aWRlb19zZXQgPSBTRExfVFJVRTsKKworICAgIHJldHVybiBjdXJyZW50OworfQorCitzdGF0aWMgU0RMX1N1cmZhY2UqIFFaX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50MzIgZmxhZ3MpCit7CisgICAgLyogRG9uJ3QgdGhyb3cgYXdheSB0aGUgR0wgY29udGV4dCBpZiB3ZSBjYW4ganVzdCByZXNpemUgdGhlIGN1cnJlbnQgb25lLiAqLworI2lmIDAgIC8qICEhISBGSVhNRTogaGFsZi1maW5pc2hlZCBzaWRlIHByb2plY3QuIFJlZW5hYmxlIHRoaXMgaWYgeW91IGV2ZXIgZGVidWcgdGhlIGNvcm5lciBjYXNlcy4gKi8KKyAgICBjb25zdCBCT09MIHNhdmVfZ2wgPSAoICh2aWRlb19zZXQgPT0gU0RMX1RSVUUpICYmICgoZmxhZ3MgJiBTRExfT1BFTkdMKSA9PSAoY3VycmVudC0+ZmxhZ3MgJiBTRExfT1BFTkdMKSkgJiYgKGJwcCA9PSBjdXJyZW50LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCkgKTsKKyNlbHNlCisgICAgY29uc3QgQk9PTCBzYXZlX2dsID0gTk87CisjZW5kaWYKKworICAgIE5TT3BlbkdMQ29udGV4dCAqZ2xjdHggPSBnbF9jb250ZXh0OworICAgIFNETF9TdXJmYWNlKiByZXR2YWwgPSBOVUxMOworCisgICAgaWYgKHNhdmVfZ2wpIHsKKyAgICAgICAgW2dsY3R4IHJldGFpbl07ICAvKiBqdXN0IHNvIHdlIGRvbid0IGxvc2UgdGhpcyB3aGVuIGtpbGxpbmcgb2xkIHZpZXdzLCBldGMgKi8KKyAgICB9CisKKyAgICByZXR2YWwgPSBRWl9TZXRWaWRlb01vZGVJbnRlcm5hbCAodGhpcywgY3VycmVudCwgd2lkdGgsIGhlaWdodCwgYnBwLCBmbGFncywgc2F2ZV9nbCk7CisKKyAgICBpZiAoc2F2ZV9nbCkgeworICAgICAgICBbZ2xjdHggcmVsZWFzZV07ICAvKiBzb21ldGhpbmcgZWxzZSBzaG91bGQgb3duIHRoaXMgbm93LCBvciB3ZSBsZWdpdGltYXRlbHkgcmVsZWFzZSBpdC4gKi8KKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBpbnQgUVpfVG9nZ2xlRnVsbFNjcmVlbiAoX1RISVMsIGludCBvbikKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBRWl9TZXRDb2xvcnMgKF9USElTLCBpbnQgZmlyc3RfY29sb3IsIGludCBudW1fY29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9Db2xvciAqY29sb3JzKQoreworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNzApCisgICAgLyogd2Ugc2hvdWxkbid0IGhhdmUgYW4gOC1iaXQgbW9kZSBvbiBMaW9uISAqLworICAgIGlmICghSVNfTElPTl9PUl9MQVRFUih0aGlzKSkgeworICAgICAgICBDR1RhYmxlQ291bnQgIGluZGV4OworICAgICAgICBDR0RldmljZUNvbG9yIGNvbG9yOworCisgICAgICAgIGZvciAoaW5kZXggPSBmaXJzdF9jb2xvcjsgaW5kZXggPCBmaXJzdF9jb2xvcitudW1fY29sb3JzOyBpbmRleCsrKSB7CisKKyAgICAgICAgICAgIC8qIENsYW1wIGNvbG9ycyBiZXR3ZWVuIDAuMCBhbmQgMS4wICovCisgICAgICAgICAgICBjb2xvci5yZWQgICA9IGNvbG9ycy0+ciAvIDI1NS4wOworICAgICAgICAgICAgY29sb3IuYmx1ZSAgPSBjb2xvcnMtPmIgLyAyNTUuMDsKKyAgICAgICAgICAgIGNvbG9yLmdyZWVuID0gY29sb3JzLT5nIC8gMjU1LjA7CisKKyAgICAgICAgICAgIGNvbG9ycysrOworCisgICAgICAgICAgICBDR1BhbGV0dGVTZXRDb2xvckF0SW5kZXggKHBhbGV0dGUsIGNvbG9yLCBpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKCBDR0Rpc3BsYXlOb0VyciA9PSBDR0Rpc3BsYXlTZXRQYWxldHRlIChkaXNwbGF5X2lkLCBwYWxldHRlKSApOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCAxMDcwKQorc3RhdGljIGludCBRWl9Mb2NrRG91YmxlQnVmZmVyIChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIFFaX1VubG9ja0RvdWJsZUJ1ZmZlciAoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworfQorCisvKiBUaGUgVkJMIGRlbGF5IGlzIGJhc2VkIG9uIGNvZGUgYnkgSWFuIFIgT2xsbWFubidzIFJlekxpYiA8aWFub0BjY28uY2FsdGVjaC5lZHU+ICovCitzdGF0aWMgQWJzb2x1dGVUaW1lIFFaX1NlY29uZHNUb0Fic29sdXRlICggZG91YmxlIHNlY29uZHMgKQoreworICAgIHVuaW9uCisgICAgeworICAgICAgICBVSW50NjQgaTsKKyAgICAgICAgTmFub3NlY29uZHMgbnM7CisgICAgfSB0ZW1wOworICAgICAgICAKKyAgICB0ZW1wLmkgPSBzZWNvbmRzICogMTAwMDAwMDAwMC4wOworICAgIAorICAgIHJldHVybiBOYW5vc2Vjb25kc1RvQWJzb2x1dGUgKCB0ZW1wLm5zICk7Cit9CisKK3N0YXRpYyBpbnQgUVpfVGhyZWFkRmxpcCAoX1RISVMpCit7CisgICAgVWludDggKnNyYywgKmRzdDsKKyAgICBpbnQgc2tpcCwgbGVuLCBoOworICAgIAorICAgIC8qCisgICAgICAgIEdpdmUgdGhpcyB0aHJlYWQgdGhlIGhpZ2hlc3Qgc2NoZWR1bGluZyBwcmlvcml0eSBwb3NzaWJsZSwKKyAgICAgICAgaW4gdGhlIGhvcGVzIHRoYXQgaXQgd2lsbCBpbW1lZGlhdGVseSBydW4gYWZ0ZXIgdGhlIFZCTCBkZWxheQorICAgICovCisgICAgeworICAgICAgICBwdGhyZWFkX3QgY3VycmVudF90aHJlYWQ7CisgICAgICAgIGludCBwb2xpY3k7CisgICAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKyAgICAgICAgCisgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gcHRocmVhZF9zZWxmICgpOworICAgICAgICBwdGhyZWFkX2dldHNjaGVkcGFyYW0gKGN1cnJlbnRfdGhyZWFkLCAmcG9saWN5LCAmcGFyYW0pOworICAgICAgICBwb2xpY3kgPSBTQ0hFRF9SUjsKKyAgICAgICAgcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4IChwb2xpY3kpOworICAgICAgICBwdGhyZWFkX3NldHNjaGVkcGFyYW0gKGN1cnJlbnRfdGhyZWFkLCBwb2xpY3ksICZwYXJhbSk7CisgICAgfQorICAgIAorICAgIHdoaWxlICgxKSB7CisgICAgCisgICAgICAgIFNETF9TZW1XYWl0IChzZW0xKTsKKyAgICAgICAgaWYgKHF1aXRfdGhyZWFkKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIFdlIGhhdmUgdG8gYWRkIFNETF9WaWRlb1N1cmZhY2UtPm9mZnNldCBoZXJlLCBzaW5jZSB3ZSBtaWdodCBiZSBhCisgICAgICAgICAqICBzbWFsbGVyIHN1cmZhY2UgaW4gdGhlIGNlbnRlciBvZiB0aGUgZnJhbWVidWZmZXIgKHlvdSBhc2tlZCBmb3IKKyAgICAgICAgICogIGEgZnVsbHNjcmVlbiByZXNvbHV0aW9uIHNtYWxsZXIgdGhhbiB0aGUgaGFyZHdhcmUgY291bGQgc3VwcGx5CisgICAgICAgICAqICBzbyBTREwgaXMgY2VudGVyaW5nIGl0IGluIGEgYmlnZ2VyIHJlc29sdXRpb24pLi4uCisgICAgICAgICAqLworICAgICAgICBkc3QgPSAoKFVpbnQ4ICopKChzaXplX3QpQ0dEaXNwbGF5QmFzZUFkZHJlc3MgKGRpc3BsYXlfaWQpKSkgKyBTRExfVmlkZW9TdXJmYWNlLT5vZmZzZXQ7CisgICAgICAgIHNyYyA9IGN1cnJlbnRfYnVmZmVyICsgU0RMX1ZpZGVvU3VyZmFjZS0+b2Zmc2V0OworICAgICAgICBsZW4gPSBTRExfVmlkZW9TdXJmYWNlLT53ICogU0RMX1ZpZGVvU3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworICAgICAgICBoID0gU0RMX1ZpZGVvU3VyZmFjZS0+aDsKKyAgICAgICAgc2tpcCA9IFNETF9WaWRlb1N1cmZhY2UtPnBpdGNoOworICAgIAorICAgICAgICAvKiBXYWl0IGZvciB0aGUgVkJMIHRvIG9jY3VyIChlc3RpbWF0ZWQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGhhcmR3YXJlIGludGVycnVwdCkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBUaGUgVkJMIGRlbGF5IGlzIGJhc2VkIG9uIElhbiBPbGxtYW5uJ3MgUmV6TGliIDxpYW5vQGNjby5jYWx0ZWNoLmVkdT4gKi8KKyAgICAgICAgICAgIGRvdWJsZSByZWZyZXNoUmF0ZTsKKyAgICAgICAgICAgIGRvdWJsZSBsaW5lc1BlclNlY29uZDsKKyAgICAgICAgICAgIGRvdWJsZSB0YXJnZXQ7CisgICAgICAgICAgICBkb3VibGUgcG9zaXRpb247CisgICAgICAgICAgICBkb3VibGUgYWRqdXN0bWVudDsKKyAgICAgICAgICAgIEFic29sdXRlVGltZSBuZXh0VGltZTsgICAgICAgIAorICAgICAgICAgICAgQ0ZOdW1iZXJSZWYgcmVmcmVzaFJhdGVDRk51bWJlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVmcmVzaFJhdGVDRk51bWJlciA9IENGRGljdGlvbmFyeUdldFZhbHVlIChtb2RlLCBrQ0dEaXNwbGF5UmVmcmVzaFJhdGUpOworICAgICAgICAgICAgaWYgKCBOVUxMID09IHJlZnJlc2hSYXRlQ0ZOdW1iZXIgKSB7CisgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yICgiTW9kZSBoYXMgbm8gcmVmcmVzaCByYXRlIik7CisgICAgICAgICAgICAgICAgZ290byBFUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCAwID09IENGTnVtYmVyR2V0VmFsdWUgKHJlZnJlc2hSYXRlQ0ZOdW1iZXIsIGtDRk51bWJlckRvdWJsZVR5cGUsICZyZWZyZXNoUmF0ZSkgKSB7CisgICAgICAgICAgICAgICAgU0RMX1NldEVycm9yICgiRXJyb3IgZ2V0dGluZyByZWZyZXNoIHJhdGUiKTsKKyAgICAgICAgICAgICAgICBnb3RvIEVSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIDAgPT0gcmVmcmVzaFJhdGUgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIkRpc3BsYXkgaGFzIG5vIHJlZnJlc2ggcmF0ZSwgdXNpbmcgNjBoeiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIG9rLCBmb3IgTENEJ3Mgd2UnbGwgZW11bGF0ZSBhIDYwaHogcmVmcmVzaCwgd2hpY2ggbWF5IG9yIG1heSBub3QgbG9vayByaWdodCAqLworICAgICAgICAgICAgICAgIHJlZnJlc2hSYXRlID0gNjAuMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbGluZXNQZXJTZWNvbmQgPSByZWZyZXNoUmF0ZSAqIGg7CisgICAgICAgICAgICB0YXJnZXQgPSBoOworICAgICAgICAKKyAgICAgICAgICAgIC8qIEZpZ3VyZSBvdXQgdGhlIGZpcnN0IGRlbGF5IHNvIHdlIHN0YXJ0IG9mZiBhYm91dCByaWdodCAqLworICAgICAgICAgICAgcG9zaXRpb24gPSBDR0Rpc3BsYXlCZWFtUG9zaXRpb24gKGRpc3BsYXlfaWQpOworICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gdGFyZ2V0KQorICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYWRqdXN0bWVudCA9ICh0YXJnZXQgLSBwb3NpdGlvbikgLyBsaW5lc1BlclNlY29uZDsgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5leHRUaW1lID0gQWRkQWJzb2x1dGVUb0Fic29sdXRlIChVcFRpbWUgKCksIFFaX1NlY29uZHNUb0Fic29sdXRlIChhZGp1c3RtZW50KSk7CisgICAgICAgIAorICAgICAgICAgICAgTVBEZWxheVVudGlsICgmbmV4dFRpbWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLyogT24gZXJyb3IsIHNraXAgVkJMIGRlbGF5ICovCisgICAgICAgIEVSUk9SOgorICAgICAgICAKKyAgICAgICAgLyogVE9ETzogdXNlIENHQ29udGV4dERyYXdJbWFnZSBoZXJlIHRvbyEgIENyZWF0ZSB0d28gQ0dDb250ZXh0UmVmcyB0aGUgc2FtZSB3YXkgd2UKKyAgICAgICAgICAgY3JlYXRlIHR3byBidWZmZXJzLCByZXBsYWNlIGN1cnJlbnRfYnVmZmVyIHdpdGggY3VycmVudF9jb250ZXh0IGFuZCBzZXQgaXQKKyAgICAgICAgICAgYXBwcm9wcmlhdGVseSBpbiBRWl9GbGlwRG91YmxlQnVmZmVyLiAgKi8KKyAgICAgICAgd2hpbGUgKCBoLS0gKSB7CisgICAgICAgIAorICAgICAgICAgICAgU0RMX21lbWNweSAoZHN0LCBzcmMsIGxlbik7CisgICAgICAgICAgICBzcmMgKz0gc2tpcDsKKyAgICAgICAgICAgIGRzdCArPSBza2lwOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBzaWduYWwgZmxpcCBjb21wbGV0aW9uICovCisgICAgICAgIFNETF9TZW1Qb3N0IChzZW0yKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisgICAgICAgIAorc3RhdGljIGludCBRWl9GbGlwRG91YmxlQnVmZmVyIChfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisgICAgLyogd2FpdCBmb3IgcHJldmlvdXMgZmxpcCB0byBjb21wbGV0ZSAqLworICAgIFNETF9TZW1XYWl0IChzZW0yKTsKKyAgICAKKyAgICBjdXJyZW50X2J1ZmZlciA9IHN1cmZhY2UtPnBpeGVsczsKKyAgICAgICAgCisgICAgaWYgKHN1cmZhY2UtPnBpeGVscyA9PSBzd19idWZmZXJzWzBdKQorICAgICAgICBzdXJmYWNlLT5waXhlbHMgPSBzd19idWZmZXJzWzFdOworICAgIGVsc2UKKyAgICAgICAgc3VyZmFjZS0+cGl4ZWxzID0gc3dfYnVmZmVyc1swXTsKKyAgICAKKyAgICAvKiBzaWduYWwgd29ya2VyIHRocmVhZCB0byBkbyB0aGUgZmxpcCAqLworICAgIFNETF9TZW1Qb3N0IChzZW0xKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgUVpfRG91YmxlQnVmZmVyVXBkYXRlIChfVEhJUywgaW50IG51bV9yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworICAgIC8qIHBlcmZvcm0gYSBmbGlwIGlmIHNvbWVvbmUgY2FsbHMgdXBkYXRlcmVjdHMgb24gYSBkb3VibGVidWZlcnJlZCBzdXJmYWNlICovCisgICAgdGhpcy0+RmxpcEhXU3VyZmFjZSAodGhpcywgU0RMX1ZpZGVvU3VyZmFjZSk7Cit9CisKK3N0YXRpYyB2b2lkIFFaX0RpcmVjdFVwZGF0ZSAoX1RISVMsIGludCBudW1fcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKyNwcmFnbWEgdW51c2VkKHRoaXMsbnVtX3JlY3RzLHJlY3RzKQorfQorI2VuZGlmCisKKy8qIFJlc2l6ZSBpY29uLCBCTVAgZm9ybWF0ICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBRWl9SZXNpemVJY29uW10gPSB7CisgICAgMHg0MiwweDRkLDB4MzEsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM2LDB4MDAsMHgwMCwweDAwLDB4MjgsMHgwMCwKKyAgICAweDAwLDB4MDAsMHgwZCwweDAwLDB4MDAsMHgwMCwweDBkLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLAorICAgIDB4MDAsMHgwMCwweGZiLDB4MDEsMHgwMCwweDAwLDB4MTMsMHgwYiwweDAwLDB4MDAsMHgxMywweDBiLDB4MDAsMHgwMCwweDAwLDB4MDAsCisgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKyAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwYiwweGZmLDB4ZmYsCisgICAgMHhmZiwweGRhLDB4ZGEsMHhkYSwweDg3LDB4ODcsMHg4NywweGU4LDB4ZTgsMHhlOCwweGZmLDB4ZmYsMHhmZiwweGRhLDB4ZGEsMHhkYSwKKyAgICAweDg3LDB4ODcsMHg4NywweGU4LDB4ZTgsMHhlOCwweGZmLDB4ZmYsMHhmZiwweGRhLDB4ZGEsMHhkYSwweDg3LDB4ODcsMHg4NywweGU4LAorICAgIDB4ZTgsMHhlOCwweGZmLDB4ZmYsMHhmZiwweDBiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGEsMHhkYSwweGRhLDB4ODcsCisgICAgMHg4NywweDg3LDB4ZTgsMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4ZGEsMHhkYSwweGRhLDB4ODcsMHg4NywweDg3LDB4ZTgsMHhlOCwKKyAgICAweGU4LDB4ZmYsMHhmZiwweGZmLDB4ZGEsMHhkYSwweGRhLDB4ODcsMHg4NywweDg3LDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweGZmLAorICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkNSwweGQ1LDB4ZDUsMHg4NywweDg3LDB4ODcsMHhlOCwweGU4LDB4ZTgsCisgICAgMHhmZiwweGZmLDB4ZmYsMHhkYSwweGRhLDB4ZGEsMHg4NywweDg3LDB4ODcsMHhlOCwweGU4LDB4ZTgsMHhmZiwweGZmLDB4ZmYsMHhkYSwKKyAgICAweGRhLDB4ZGEsMHhmZiwweGZmLDB4ZmYsMHgwYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorICAgIDB4ZmYsMHhmZiwweGQ3LDB4ZDcsMHhkNywweDg3LDB4ODcsMHg4NywweGU4LDB4ZTgsMHhlOCwweGZmLDB4ZmYsMHhmZiwweGRhLDB4ZGEsCisgICAgMHhkYSwweDg3LDB4ODcsMHg4NywweGU4LDB4ZTgsMHhlOCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDBiLDB4ZmYsMHhmZiwKKyAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDcsMHhkNywweGQ3LAorICAgIDB4ODcsMHg4NywweDg3LDB4ZTgsMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4ZGEsMHhkYSwweGRhLDB4ODcsMHg4NywweDg3LDB4ZTgsCisgICAgMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKyAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkNywweGQ3LDB4ZDcsMHg4NywweDg3LDB4ODcsMHhlOCwweGU4LAorICAgIDB4ZTgsMHhmZiwweGZmLDB4ZmYsMHhkYywweGRjLDB4ZGMsMHg4NywweDg3LDB4ODcsMHhmZiwweGZmLDB4ZmYsMHgwYiwweGZmLDB4ZmYsCisgICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKyAgICAweGZmLDB4ZmYsMHhmZiwweGQ5LDB4ZDksMHhkOSwweDg3LDB4ODcsMHg4NywweGU4LDB4ZTgsMHhlOCwweGZmLDB4ZmYsMHhmZiwweGRjLAorICAgIDB4ZGMsMHhkYywweGZmLDB4ZmYsMHhmZiwweDBiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisgICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGIsMHhkYiwKKyAgICAweGRiLDB4ODcsMHg4NywweDg3LDB4ZTgsMHhlOCwweGU4LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweGZmLAorICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisgICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGRiLDB4ZGIsMHg4NywweDg3LDB4ODcsMHhlOCwKKyAgICAweGU4LDB4ZTgsMHhmZiwweGZmLDB4ZmYsMHgwYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisgICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRjLDB4ZGMsMHhkYywweDg3LDB4ODcsMHg4NywweGZmLDB4ZmYsMHhmZiwweDBiLDB4ZmYsMHhmZiwKKyAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGMsCisgICAgMHhkYywweGRjLDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKyAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorICAgIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwYgorfTsKKworc3RhdGljIHZvaWQgUVpfRHJhd1Jlc2l6ZUljb24gKF9USElTKQoreworICAgIC8qIENoZWNrIGlmIHdlIHNob3VsZCBkcmF3IHRoZSByZXNpemUgaWNvbiAqLworICAgIGlmIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9SRVNJWkFCTEUpIHsKKyAgICAKKyAgICAgICAgU0RMX1JlY3QgaWNvbl9yZWN0OworICAgICAgICAKKyAgICAgICAgLyogQ3JlYXRlIHRoZSBpY29uIGltYWdlICovCisgICAgICAgIGlmIChyZXNpemVfaWNvbiA9PSBOVUxMKSB7CisgICAgICAgIAorICAgICAgICAgICAgU0RMX1JXb3BzICpydzsKKyAgICAgICAgICAgIFNETF9TdXJmYWNlICp0bXA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJ3ID0gU0RMX1JXRnJvbUNvbnN0TWVtIChRWl9SZXNpemVJY29uLCBzaXplb2YoUVpfUmVzaXplSWNvbikpOworICAgICAgICAgICAgdG1wID0gU0RMX0xvYWRCTVBfUlcgKHJ3LCBTRExfVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlc2l6ZV9pY29uID0gU0RMX0NvbnZlcnRTdXJmYWNlICh0bXAsIFNETF9WaWRlb1N1cmZhY2UtPmZvcm1hdCwgU0RMX1NSQ0NPTE9SS0VZKTsKKyAgICAgICAgICAgIFNETF9TZXRDb2xvcktleSAocmVzaXplX2ljb24sIFNETF9TUkNDT0xPUktFWSwgMHhGRkZGRkYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTRExfRnJlZVN1cmZhY2UgKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBpY29uX3JlY3QueCA9IFNETF9WaWRlb1N1cmZhY2UtPncgLSAxMzsKKyAgICAgICAgaWNvbl9yZWN0LnkgPSBTRExfVmlkZW9TdXJmYWNlLT5oIC0gMTM7CisgICAgICAgIGljb25fcmVjdC53ID0gMTM7CisgICAgICAgIGljb25fcmVjdC5oID0gMTM7CisgICAgICAgICAgICAKKyAgICAgICAgU0RMX0JsaXRTdXJmYWNlIChyZXNpemVfaWNvbiwgTlVMTCwgU0RMX1ZpZGVvU3VyZmFjZSwgJmljb25fcmVjdCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBRWl9VcGRhdGVSZWN0cyAoX1RISVMsIGludCBudW1SZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworICAgIGlmIChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9PUEVOR0xCTElUKSB7CisgICAgICAgIFFaX0dMX1N3YXBCdWZmZXJzICh0aGlzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIFsgcXpfd2luZG93IGlzTWluaWF0dXJpemVkIF0gKSB7CisgICAgCisgICAgICAgIC8qIERvIG5vdGhpbmcgaWYgbWluaWF0dXJpemVkICovCisgICAgfQorICAgIAorICAgIGVsc2UgeworICAgICAgICBOU0dyYXBoaWNzQ29udGV4dCAqY3R4ID0gW05TR3JhcGhpY3NDb250ZXh0IGN1cnJlbnRDb250ZXh0XTsKKyAgICAgICAgaWYgKGN0eCAhPSBuc2dmeF9jb250ZXh0KSB7IC8qIHVob2gsIHlvdSBtaWdodCBiZSByZW5kZXJpbmcgZnJvbSBhbm90aGVyIHRocmVhZC4uLiAqLworICAgICAgICAgICAgW05TR3JhcGhpY3NDb250ZXh0IHNldEN1cnJlbnRDb250ZXh0Om5zZ2Z4X2NvbnRleHRdOworICAgICAgICAgICAgY3R4ID0gbnNnZnhfY29udGV4dDsKKyAgICAgICAgfQorICAgICAgICBDR0NvbnRleHRSZWYgY2djID0gKENHQ29udGV4dFJlZikgW2N0eCBncmFwaGljc1BvcnRdOworICAgICAgICBRWl9EcmF3UmVzaXplSWNvbiAodGhpcyk7CisgICAgICAgIENHQ29udGV4dEZsdXNoIChjZ19jb250ZXh0KTsKKyAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlIChjZ19jb250ZXh0KTsKKyAgICAgICAgQ0dSZWN0IHJlY3RhbmdsZSA9IENHUmVjdE1ha2UgKDAsMCxbd2luZG93X3ZpZXcgZnJhbWVdLnNpemUud2lkdGgsW3dpbmRvd192aWV3IGZyYW1lXS5zaXplLmhlaWdodCk7CisgICAgICAgIAorICAgICAgICBDR0NvbnRleHREcmF3SW1hZ2UgKGNnYywgcmVjdGFuZ2xlLCBpbWFnZSk7CisgICAgICAgIENHSW1hZ2VSZWxlYXNlKGltYWdlKTsKKyAgICAgICAgQ0dDb250ZXh0Rmx1c2ggKGNnYyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBRWl9WaWRlb1F1aXQgKF9USElTKQoreworICAgIENHRGlzcGxheUZhZGVSZXNlcnZhdGlvblRva2VuIGZhZGVfdG9rZW4gPSBrQ0dEaXNwbGF5RmFkZVJlc2VydmF0aW9uSW52YWxpZFRva2VuOworCisgICAgLyogUmVzdG9yZSBnYW1tYSBzZXR0aW5ncyAqLworICAgIENHRGlzcGxheVJlc3RvcmVDb2xvclN5bmNTZXR0aW5ncyAoKTsKKworICAgIC8qIEVuc3VyZSB0aGUgY3Vyc29yIHdpbGwgYmUgdmlzaWJsZSBhbmQgd29ya2luZyB3aGVuIHdlIHF1aXQgKi8KKyAgICBDR0Rpc3BsYXlTaG93Q3Vyc29yIChkaXNwbGF5X2lkKTsKKyAgICBDR0Fzc29jaWF0ZU1vdXNlQW5kTW91c2VDdXJzb3JQb3NpdGlvbiAoMSk7CisgICAgCisgICAgaWYgKG1vZGVfZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgeworICAgICAgICAvKiBGYWRlIHRvIGJsYWNrIHRvIGhpZGUgcmVzb2x1dGlvbi1zd2l0Y2hpbmcgZmxpY2tlciAoYW5kIGdhcmJhZ2UKKyAgICAgICAgICAgdGhhdCBpcyBkaXNwbGF5ZWQgYnkgYSBkZXN0cm95ZWQgT3BlbkdMIGNvbnRleHQsIGlmIGFwcGxpY2FibGUpICovCisgICAgICAgIGlmIChDR0FjcXVpcmVEaXNwbGF5RmFkZVJlc2VydmF0aW9uICg1LCAmZmFkZV90b2tlbikgPT0ga0NHRXJyb3JTdWNjZXNzKSB7CisgICAgICAgICAgICBDR0Rpc3BsYXlGYWRlIChmYWRlX3Rva2VuLCAwLjMsIGtDR0Rpc3BsYXlCbGVuZE5vcm1hbCwga0NHRGlzcGxheUJsZW5kU29saWRDb2xvciwgMC4wLCAwLjAsIDAuMCwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgUVpfVW5zZXRWaWRlb01vZGUgKHRoaXMsIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgaWYgKGZhZGVfdG9rZW4gIT0ga0NHRGlzcGxheUZhZGVSZXNlcnZhdGlvbkludmFsaWRUb2tlbikgeworICAgICAgICAgICAgQ0dEaXNwbGF5RmFkZSAoZmFkZV90b2tlbiwgMC41LCBrQ0dEaXNwbGF5QmxlbmRTb2xpZENvbG9yLCBrQ0dEaXNwbGF5QmxlbmROb3JtYWwsIDAuMCwgMC4wLCAwLjAsIEZBTFNFKTsKKyAgICAgICAgICAgIENHUmVsZWFzZURpc3BsYXlGYWRlUmVzZXJ2YXRpb24gKGZhZGVfdG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUVpfVW5zZXRWaWRlb01vZGUgKHRoaXMsIFRSVUUsIEZBTFNFKTsKKworI2lmIChNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNzApCisgICAgaWYgKCFJU19MSU9OX09SX0xBVEVSKHRoaXMpKSB7CisgICAgICAgIENHUGFsZXR0ZVJlbGVhc2UocGFsZXR0ZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAob3BlbmdsX2xpYnJhcnkpIHsKKyAgICAgICAgU0RMX1VubG9hZE9iamVjdChvcGVuZ2xfbGlicmFyeSk7CisgICAgICAgIG9wZW5nbF9saWJyYXJ5ID0gTlVMTDsKKyAgICB9CisgICAgdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgPSAwOworCisgICAgaWYgKGZpZWxkX2VkaXQpIHsKKyAgICAgICAgW2ZpZWxkX2VkaXQgcmVsZWFzZV07CisgICAgICAgIGZpZWxkX2VkaXQgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludCAgUVpfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIFFaX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7Cit9CisKK3N0YXRpYyBpbnQgUVpfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworICAgIHJldHVybigtMSk7IC8qIHVuYWxsb3dlZCAobm8gSFdTVVJGQUNFIHN1cHBvcnQgaGVyZSkuICovCit9CisKK3N0YXRpYyB2b2lkIFFaX0ZyZWVIV1N1cmZhY2UgKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKK30KKworLyogR2FtbWEgZnVuY3Rpb25zICovCitpbnQgUVpfU2V0R2FtbWEgKF9USElTLCBmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlKQoreworICAgIGNvbnN0IENHR2FtbWFWYWx1ZSBtaW4gPSAwLjAsIG1heCA9IDEuMDsKKworICAgIGlmIChyZWQgPT0gMC4wKQorICAgICAgICByZWQgPSBGTFRfTUFYOworICAgIGVsc2UKKyAgICAgICAgcmVkID0gMS4wIC8gcmVkOworCisgICAgaWYgKGdyZWVuID09IDAuMCkKKyAgICAgICAgZ3JlZW4gPSBGTFRfTUFYOworICAgIGVsc2UKKyAgICAgICAgZ3JlZW4gPSAxLjAgLyBncmVlbjsKKworICAgIGlmIChibHVlID09IDAuMCkKKyAgICAgICAgYmx1ZSA9IEZMVF9NQVg7CisgICAgZWxzZQorICAgICAgICBibHVlICA9IDEuMCAvIGJsdWU7CisKKyAgICBpZiAoIENHRGlzcGxheU5vRXJyID09IENHU2V0RGlzcGxheVRyYW5zZmVyQnlGb3JtdWxhCisgICAgICAgICAoZGlzcGxheV9pZCwgbWluLCBtYXgsIHJlZCwgbWluLCBtYXgsIGdyZWVuLCBtaW4sIG1heCwgYmx1ZSkgKSB7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludCBRWl9HZXRHYW1tYSAoX1RISVMsIGZsb2F0ICpyZWQsIGZsb2F0ICpncmVlbiwgZmxvYXQgKmJsdWUpCit7CisgICAgQ0dHYW1tYVZhbHVlIGR1bW15OworICAgIGlmICggQ0dEaXNwbGF5Tm9FcnIgPT0gQ0dHZXREaXNwbGF5VHJhbnNmZXJCeUZvcm11bGEKKyAgICAgICAgIChkaXNwbGF5X2lkLCAmZHVtbXksICZkdW1teSwgcmVkLAorICAgICAgICAgICZkdW1teSwgJmR1bW15LCBncmVlbiwgJmR1bW15LCAmZHVtbXksIGJsdWUpICkKKworICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworaW50IFFaX1NldEdhbW1hUmFtcCAoX1RISVMsIFVpbnQxNiAqcmFtcCkKK3sKKyAgICBjb25zdCB1aW50MzJfdCB0YWJsZVNpemUgPSAyNTU7CisgICAgQ0dHYW1tYVZhbHVlIHJlZFRhYmxlW3RhYmxlU2l6ZV07CisgICAgQ0dHYW1tYVZhbHVlIGdyZWVuVGFibGVbdGFibGVTaXplXTsKKyAgICBDR0dhbW1hVmFsdWUgYmx1ZVRhYmxlW3RhYmxlU2l6ZV07CisKKyAgICBpbnQgaTsKKworICAgIC8qIEV4dHJhY3QgZ2FtbWEgdmFsdWVzIGludG8gc2VwYXJhdGUgdGFibGVzLCBjb252ZXJ0IHRvIGZsb2F0cyBiZXR3ZWVuIDAuMCBhbmQgMS4wICovCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICByZWRUYWJsZVtpICUgMjU2XSA9IHJhbXBbaV0gLyA2NTUzNS4wOworCisgICAgZm9yIChpPTI1NjsgaSA8IDUxMjsgaSsrKQorICAgICAgICBncmVlblRhYmxlW2kgJSAyNTZdID0gcmFtcFtpXSAvIDY1NTM1LjA7CisKKyAgICBmb3IgKGk9NTEyOyBpIDwgNzY4OyBpKyspCisgICAgICAgIGJsdWVUYWJsZVtpICUgMjU2XSA9IHJhbXBbaV0gLyA2NTUzNS4wOworCisgICAgaWYgKCBDR0Rpc3BsYXlOb0VyciA9PSBDR1NldERpc3BsYXlUcmFuc2ZlckJ5VGFibGUKKyAgICAgICAgIChkaXNwbGF5X2lkLCB0YWJsZVNpemUsIHJlZFRhYmxlLCBncmVlblRhYmxlLCBibHVlVGFibGUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK2ludCBRWl9HZXRHYW1tYVJhbXAgKF9USElTLCBVaW50MTYgKnJhbXApCit7CisgICAgY29uc3QgdWludDMyX3QgdGFibGVTaXplID0gMjU1OworICAgIENHR2FtbWFWYWx1ZSByZWRUYWJsZVt0YWJsZVNpemVdOworICAgIENHR2FtbWFWYWx1ZSBncmVlblRhYmxlW3RhYmxlU2l6ZV07CisgICAgQ0dHYW1tYVZhbHVlIGJsdWVUYWJsZVt0YWJsZVNpemVdOworICAgIHVpbnQzMl90IGFjdHVhbDsKKyAgICBpbnQgaTsKKworICAgIGlmICggQ0dEaXNwbGF5Tm9FcnIgIT0gQ0dHZXREaXNwbGF5VHJhbnNmZXJCeVRhYmxlCisgICAgICAgICAoZGlzcGxheV9pZCwgdGFibGVTaXplLCByZWRUYWJsZSwgZ3JlZW5UYWJsZSwgYmx1ZVRhYmxlLCAmYWN0dWFsKSB8fAorICAgICAgICAgYWN0dWFsICE9IHRhYmxlU2l6ZSkKKworICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBQYWNrIHRhYmxlcyBpbnRvIG9uZSBhcnJheSwgd2l0aCB2YWx1ZXMgZnJvbSAwIHRvIDY1NTM1ICovCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICByYW1wW2ldID0gcmVkVGFibGVbaSAlIDI1Nl0gKiA2NTUzNS4wOworCisgICAgZm9yIChpPTI1NjsgaSA8IDUxMjsgaSsrKQorICAgICAgICByYW1wW2ldID0gZ3JlZW5UYWJsZVtpICUgMjU2XSAqIDY1NTM1LjA7CisKKyAgICBmb3IgKGk9NTEyOyBpIDwgNzY4OyBpKyspCisgICAgICAgIHJhbXBbaV0gPSBibHVlVGFibGVbaSAlIDI1Nl0gKiA2NTUzNS4wOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpXTS5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxOWE1OQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpXTS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworCitzdHJ1Y3QgV01jdXJzb3IgeworICAgIE5TQ3Vyc29yICpuc2N1cnNvcjsKK307CisKK3ZvaWQgUVpfVXBkYXRlQ3Vyc29yKF9USElTKTsKK2ludCAgUVpfR2V0V01JbmZvICAoX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pOwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldNLm0gYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6V00ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDBhYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldNLm0KQEAgLTAsMCArMSw1NzQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9RdWFydHpWaWRlby5oIgorI2luY2x1ZGUgIlNETF9RdWFydHpXTS5oIgorCisKK3ZvaWQgUVpfRnJlZVdNQ3Vyc29yICAgICAoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpIHsgCisKKyAgICBpZiAoIGN1cnNvciAhPSBOVUxMICkgeworICAgICAgICBbIGN1cnNvci0+bnNjdXJzb3IgcmVsZWFzZSBdOworICAgICAgICBmcmVlIChjdXJzb3IpOworICAgIH0KK30KKworV01jdXJzb3IqICAgIFFaX0NyZWF0ZVdNQ3Vyc29yICAgKF9USElTLCBVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KSB7IAorICAgIFdNY3Vyc29yICpjdXJzb3I7CisgICAgTlNCaXRtYXBJbWFnZVJlcCAqaW1ncmVwOworICAgIE5TSW1hZ2UgKmltZzsKKyAgICB1bnNpZ25lZCBjaGFyICpwbGFuZXNbNV07CisgICAgaW50IGk7CisgICAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7CisgICAgCisgICAgcG9vbCA9IFsgWyBOU0F1dG9yZWxlYXNlUG9vbCBhbGxvYyBdIGluaXQgXTsKKyAgICAKKyAgICAvKiBBbGxvY2F0ZSB0aGUgY3Vyc29yIG1lbW9yeSAqLworICAgIGN1cnNvciA9IChXTWN1cnNvciAqKVNETF9tYWxsb2Moc2l6ZW9mKFdNY3Vyc29yKSk7CisgICAgaWYgKGN1cnNvciA9PSBOVUxMKSBnb3RvIG91dE9mTWVtb3J5OworCisgICAgLyogY3JlYXRlIHRoZSBpbWFnZSByZXByZXNlbnRhdGlvbiBhbmQgZ2V0IHRoZSBwb2ludGVycyB0byBpdHMgc3RvcmFnZSAqLworICAgIGltZ3JlcCA9IFsgWyBbIE5TQml0bWFwSW1hZ2VSZXAgYWxsb2MgXSBpbml0V2l0aEJpdG1hcERhdGFQbGFuZXM6IE5VTEwgcGl4ZWxzV2lkZTogdyBwaXhlbHNIaWdoOiBoIGJpdHNQZXJTYW1wbGU6IDEgc2FtcGxlc1BlclBpeGVsOiAyIGhhc0FscGhhOiBZRVMgaXNQbGFuYXI6IFlFUyBjb2xvclNwYWNlTmFtZTogTlNEZXZpY2VXaGl0ZUNvbG9yU3BhY2UgYnl0ZXNQZXJSb3c6ICh3KzcpLzggYml0c1BlclBpeGVsOiAwIF0gYXV0b3JlbGVhc2UgXTsKKyAgICBpZiAoaW1ncmVwID09IG5pbCkgZ290byBvdXRPZk1lbW9yeTsKKyAgICBbIGltZ3JlcCBnZXRCaXRtYXBEYXRhUGxhbmVzOiBwbGFuZXMgXTsKKyAgICAKKyAgICAvKiBjb3B5IGRhdGEgYW5kIG1hc2ssIGV4dGVuZGluZyB0aGUgbWFzayB0byBhbGwgYmxhY2sgcGl4ZWxzIGJlY2F1c2UgdGhlIGludmVyc2lvbiBlZmZlY3QgZG9lc24ndCB3b3JrIHdpdGggQ29jb2EncyBhbHBoYS1ibGVuZGVkIGN1cnNvcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgKHcrNykvOCpoOyBpKyspIHsKKyAgICAgICAgcGxhbmVzWzBdW2ldID0gZGF0YVtpXSBeIDB4RkY7CisgICAgICAgIHBsYW5lc1sxXVtpXSA9IG1hc2tbaV0gfCBkYXRhW2ldOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBpbWFnZSBhbmQgY3Vyc29yICovCisgICAgaW1nID0gWyBbIFsgTlNJbWFnZSBhbGxvYyBdIGluaXRXaXRoU2l6ZTogTlNNYWtlU2l6ZSh3LCBoKSBdIGF1dG9yZWxlYXNlIF07CisgICAgaWYgKGltZyA9PSBuaWwpIGdvdG8gb3V0T2ZNZW1vcnk7CisgICAgWyBpbWcgYWRkUmVwcmVzZW50YXRpb246IGltZ3JlcCBdOworICAgIGlmIChzeXN0ZW1fdmVyc2lvbiA8IDB4MTAzMCkgeyAvKiBvbiAxMC4yLCBjdXJzb3JzIG11c3QgYmUgMTYqMTYgKi8KKyAgICAgICAgaWYgKHcgPiAxNiB8fCBoID4gMTYpIHsgLyogdG9vIGJpZzogc2NhbGUgaXQgZG93biAqLworICAgICAgICAgICAgWyBpbWcgc2V0U2NhbGVzV2hlblJlc2l6ZWQ6IFlFUyBdOworICAgICAgICAgICAgaG90X3ggPSBob3RfeCoxNi93OworICAgICAgICAgICAgaG90X3kgPSBob3RfeSoxNi9oOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvKiB0b28gc21hbGwgKG9yIGp1c3QgcmlnaHQpOiBleHRlbmQgaXQgKGZyb20gdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciwgc28gaG90X3kgbXVzdCBiZSBhZGp1c3RlZCkgKi8KKyAgICAgICAgICAgIGhvdF95ICs9IDE2IC0gaDsKKyAgICAgICAgfQorICAgICAgICBbIGltZyBzZXRTaXplOiBOU01ha2VTaXplKDE2LCAxNikgXTsKKyAgICB9CisgICAgY3Vyc29yLT5uc2N1cnNvciA9IFsgWyBOU0N1cnNvciBhbGxvYyBdIGluaXRXaXRoSW1hZ2U6IGltZyBob3RTcG90OiBOU01ha2VQb2ludChob3RfeCwgaG90X3kpIF07CisgICAgaWYgKGN1cnNvci0+bnNjdXJzb3IgPT0gbmlsKSBnb3RvIG91dE9mTWVtb3J5OworICAgIAorICAgIFsgcG9vbCByZWxlYXNlIF07CisgICAgcmV0dXJuKGN1cnNvcik7CisKK291dE9mTWVtb3J5OgorICAgIFsgcG9vbCByZWxlYXNlIF07CisgICAgaWYgKGN1cnNvciAhPSBOVUxMKSBTRExfZnJlZShjdXJzb3IpOworICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgIHJldHVybihOVUxMKTsKK30KKwordm9pZCBRWl9VcGRhdGVDdXJzb3IgKF9USElTKSB7CisgICAgQk9PTCBzdGF0ZTsKKworICAgIGlmIChjdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGUgfHwgIShTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBNT1VTRUZPQ1VTKSkgeworICAgICAgICBzdGF0ZSA9IFlFUzsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0ZSA9IE5POworICAgIH0KKyAgICBpZiAoc3RhdGUgIT0gY3Vyc29yX3Zpc2libGUpIHsKKyAgICAgICAgaWYgKHN0YXRlKSB7CisgICAgICAgICAgICBbIE5TQ3Vyc29yIHVuaGlkZSBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgWyBOU0N1cnNvciBoaWRlIF07CisgICAgICAgIH0KKyAgICAgICAgY3Vyc29yX3Zpc2libGUgPSBzdGF0ZTsKKyAgICB9Cit9CisKK0JPT0wgUVpfSXNNb3VzZUluV2luZG93IChfVEhJUykgeworICAgIGlmIChxel93aW5kb3cgPT0gbmlsIHx8IChtb2RlX2ZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pKSByZXR1cm4gWUVTOyAvKmZ1bGxzY3JlZW4qLworICAgIGVsc2UgeworICAgICAgICBOU1BvaW50IHAgPSBbIHF6X3dpbmRvdyBtb3VzZUxvY2F0aW9uT3V0c2lkZU9mRXZlbnRTdHJlYW0gXTsKKyAgICAgICAgcC55IC09IDEuMGY7IC8qIEFwcGFyZW50bHkgeSBnb2VzIGZyb20gMSB0byBoLCBub3QgZnJvbSAwIHRvIGgtMSAoaS5lLiB0aGUgImxvY2F0aW9uIG9mIHRoZSBtb3VzZSIgc2VlbXMgdG8gYmUgZGVmaW5lZCBhcyAidGhlIGxvY2F0aW9uIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIG1vdXNlIHBvaW50ZXIncyBob3QgcGl4ZWwiICovCisgICAgICAgIHJldHVybiBOU1BvaW50SW5SZWN0KHAsIFsgd2luZG93X3ZpZXcgZnJhbWUgXSk7CisgICAgfQorfQorCitpbnQgUVpfU2hvd1dNQ3Vyc29yIChfVEhJUywgV01jdXJzb3IgKmN1cnNvcikgeyAKKworICAgIGlmICggY3Vyc29yID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCBjdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGUgKSB7CisgICAgICAgICAgICBjdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGUgPSBOTzsKKyAgICAgICAgICAgIFFaX0NoYW5nZUdyYWJTdGF0ZSAodGhpcywgUVpfSElERUNVUlNPUik7CisgICAgICAgIH0KKyAgICAgICAgUVpfVXBkYXRlQ3Vyc29yKHRoaXMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBxel93aW5kb3cgIT0gbmlsICYmICEobW9kZV9mbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKKyAgICAgICAgICAgIFsgcXpfd2luZG93IGludmFsaWRhdGVDdXJzb3JSZWN0c0ZvclZpZXc6IFsgcXpfd2luZG93IGNvbnRlbnRWaWV3IF0gXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgY3Vyc29yX3Nob3VsZF9iZV92aXNpYmxlICkgeworICAgICAgICAgICAgY3Vyc29yX3Nob3VsZF9iZV92aXNpYmxlID0gWUVTOworICAgICAgICAgICAgUVpfQ2hhbmdlR3JhYlN0YXRlICh0aGlzLCBRWl9TSE9XQ1VSU09SKTsKKyAgICAgICAgfQorICAgICAgICBbIGN1cnNvci0+bnNjdXJzb3IgcGVyZm9ybVNlbGVjdG9yT25NYWluVGhyZWFkOkBzZWxlY3RvcihzZXQpIHdpdGhPYmplY3Q6bmlsIHdhaXRVbnRpbERvbmU6Tk8gXTsKKyAgICAgICAgUVpfVXBkYXRlQ3Vyc29yKHRoaXMpOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisvKgorICAgIENvb3JkaW5hdGUgY29udmVyc2lvbiBmdW5jdGlvbnMsIGZvciBjb252ZW5pZW5jZQorICAgIENvY29hIHNldHMgdGhlIG9yaWdpbiBhdCB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHdpbmRvdy9zY3JlZW4KKyAgICBTREwsIENvcmVHcmFwaGljcy9XaW5kb3dTZXJ2ZXIsIGFuZCBRdWlja0RyYXcgdXNlIHRoZSBvcmlnaW4gYXQgdGhlIHVwcGVyIGxlZnQgY29ybmVyCisgICAgVGhlIHJvdXRpbmVzIHdlcmUgd3JpdHRlbiBzbyB0aGV5IGNvdWxkIGJlIGNhbGxlZCBiZWZvcmUgU2V0VmlkZW9Nb2RlKCkgaGFzIGZpbmlzaGVkOworICAgIHRoaXMgbWlnaHQgaGF2ZSBsaW1pdGVkIHVzZWZ1bG5lc3MgYXQgdGhlIG1vbWVudCwgYnV0IHRoZSBleHRyYSBjb3N0IGlzIHRyaXZpYWwuCisqLworCisvKiBDb252ZXJ0IENvY29hIHNjcmVlbiBjb29yZGluYXRlIHRvIENvY29hIHdpbmRvdyBjb29yZGluYXRlICovCit2b2lkIFFaX1ByaXZhdGVHbG9iYWxUb0xvY2FsIChfVEhJUywgTlNQb2ludCAqcCkgeworCisJaWYgKCAhIENHRGlzcGxheUlzQ2FwdHVyZWQgKGRpc3BsYXlfaWQpICkKKwkJKnAgPSBbIHF6X3dpbmRvdyBjb252ZXJ0U2NyZWVuVG9CYXNlOipwIF07Cit9CisKKworLyogQ29udmVydCBDb2NvYSB3aW5kb3cgY29vcmRpbmF0ZSB0byBDb2NvYSBzY3JlZW4gY29vcmRpbmF0ZSAqLwordm9pZCBRWl9Qcml2YXRlTG9jYWxUb0dsb2JhbCAoX1RISVMsIE5TUG9pbnQgKnApIHsKKworCWlmICggISBDR0Rpc3BsYXlJc0NhcHR1cmVkIChkaXNwbGF5X2lkKSApCisJCSpwID0gWyBxel93aW5kb3cgY29udmVydEJhc2VUb1NjcmVlbjoqcCBdOworfQorCisvKiBDb252ZXJ0IFNETCBjb29yZGluYXRlIHRvIENvY29hIGNvb3JkaW5hdGUgKi8KK3ZvaWQgUVpfUHJpdmF0ZVNETFRvQ29jb2EgKF9USElTLCBOU1BvaW50ICpwKSB7CisKKyAgICBpZiAoIENHRGlzcGxheUlzQ2FwdHVyZWQgKGRpc3BsYXlfaWQpICkgeyAvKiBjYXB0dXJlIHNpZ25hbHMgZnVsbHNjcmVlbiAqLworICAgIAorICAgICAgICBwLT55ID0gQ0dEaXNwbGF5UGl4ZWxzSGlnaCAoZGlzcGxheV9pZCkgLSBwLT55OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAKKyAgICAgICAgKnAgPSBbIHdpbmRvd192aWV3IGNvbnZlcnRQb2ludDoqcCB0b1ZpZXc6IG5pbCBdOworICAgICAgICBwLT55ID0gW3dpbmRvd192aWV3IGZyYW1lXS5zaXplLmhlaWdodCAtIHAtPnk7CisgICAgfQorfQorCisvKiBDb252ZXJ0IENvY29hIGNvb3JkaW5hdGUgdG8gU0RMIGNvb3JkaW5hdGUgKi8KK3ZvaWQgUVpfUHJpdmF0ZUNvY29hVG9TREwgKF9USElTLCBOU1BvaW50ICpwKSB7CisKKyAgICBpZiAoIENHRGlzcGxheUlzQ2FwdHVyZWQgKGRpc3BsYXlfaWQpICkgeyAvKiBjYXB0dXJlIHNpZ25hbHMgZnVsbHNjcmVlbiAqLworICAgIAorICAgICAgICBwLT55ID0gQ0dEaXNwbGF5UGl4ZWxzSGlnaCAoZGlzcGxheV9pZCkgLSBwLT55OworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAqcCA9IFsgd2luZG93X3ZpZXcgY29udmVydFBvaW50OipwIGZyb21WaWV3OiBuaWwgXTsKKyAgICAgICAgcC0+eSA9IFt3aW5kb3dfdmlldyBmcmFtZV0uc2l6ZS5oZWlnaHQgLSBwLT55OworICAgIH0KK30KKworLyogQ29udmVydCBTREwgY29vcmRpbmF0ZSB0byB3aW5kb3cgc2VydmVyIChDb3JlR3JhcGhpY3MpIGNvb3JkaW5hdGUgKi8KK0NHUG9pbnQgUVpfUHJpdmF0ZVNETFRvQ0cgKF9USElTLCBOU1BvaW50ICpwKSB7CisgICAgCisgICAgQ0dQb2ludCBjZ3A7CisgICAgCisgICAgaWYgKCAhIENHRGlzcGxheUlzQ2FwdHVyZWQgKGRpc3BsYXlfaWQpICkgeyAvKiBub3QgY2FwdHVyZWQgPT4gbm90IGZ1bGxzY3JlZW4gPT4gbG9jYWwgY29vcmQgKi8KKyAgICAKKyAgICAgICAgaW50IGhlaWdodDsKKyAgICAgICAgCisgICAgICAgIFFaX1ByaXZhdGVTRExUb0NvY29hICh0aGlzLCBwKTsKKyAgICAgICAgUVpfUHJpdmF0ZUxvY2FsVG9HbG9iYWwgKHRoaXMsIHApOworICAgICAgICAKKyAgICAgICAgaGVpZ2h0ID0gQ0dEaXNwbGF5UGl4ZWxzSGlnaCAoZGlzcGxheV9pZCk7CisgICAgICAgIHAtPnkgPSBoZWlnaHQgLSBwLT55OworICAgIH0KKyAgICAKKyAgICBjZ3AueCA9IHAtPng7CisgICAgY2dwLnkgPSBwLT55OworICAgIAorICAgIHJldHVybiBjZ3A7Cit9CisKKyNpZiAwIC8qIERlYWQgY29kZSAqLworLyogQ29udmVydCB3aW5kb3cgc2VydmVyIChDb3JlR3JhcGhpY3MpIGNvb3JkaW5hdGUgdG8gU0RMIGNvb3JkaW5hdGUgKi8KK3ZvaWQgUVpfUHJpdmF0ZUNHVG9TREwgKF9USElTLCBOU1BvaW50ICpwKSB7CisgICAgICAgICAgICAKKyAgICBpZiAoICEgQ0dEaXNwbGF5SXNDYXB0dXJlZCAoZGlzcGxheV9pZCkgKSB7IC8qIG5vdCBjYXB0dXJlZCA9PiBub3QgZnVsbHNjcmVlbiA9PiBsb2NhbCBjb29yZCAqLworICAgIAorICAgICAgICBpbnQgaGVpZ2h0OworCisgICAgICAgIC8qIENvbnZlcnQgQ0cgR2xvYmFsIHRvIENvY29hIEdsb2JhbCAqLworICAgICAgICBoZWlnaHQgPSBDR0Rpc3BsYXlQaXhlbHNIaWdoIChkaXNwbGF5X2lkKTsKKyAgICAgICAgcC0+eSA9IGhlaWdodCAtIHAtPnk7CisKKyAgICAgICAgUVpfUHJpdmF0ZUdsb2JhbFRvTG9jYWwgKHRoaXMsIHApOworICAgICAgICBRWl9Qcml2YXRlQ29jb2FUb1NETCAodGhpcywgcCk7CisgICAgfQorfQorI2VuZGlmIC8qIERlYWQgY29kZSAqLworCit2b2lkICBRWl9Qcml2YXRlV2FycEN1cnNvciAoX1RISVMsIGludCB4LCBpbnQgeSkgeworICAgIE5TUG9pbnQgcDsKKyAgICBDR1BvaW50IGNncDsKKyAgICAKKyAgICBwID0gTlNNYWtlUG9pbnQgKHgsIHkpOworICAgIGNncCA9IFFaX1ByaXZhdGVTRExUb0NHICh0aGlzLCAmcCk7CisgICAgCisgICAgLyogdGhpcyBpcyB0aGUgbWFnaWMgY2FsbCB0aGF0IGZpeGVzIGN1cnNvciAiZnJlZXppbmciIGFmdGVyIHdhcnAgKi8KKyAgICBDR0Fzc29jaWF0ZU1vdXNlQW5kTW91c2VDdXJzb3JQb3NpdGlvbiAoMCk7CisgICAgQ0dXYXJwTW91c2VDdXJzb3JQb3NpdGlvbiAoY2dwKTsKKyAgICBpZiAoZ3JhYl9zdGF0ZSAhPSBRWl9JTlZJU0lCTEVfR1JBQikgeyAvKiBjYW4ndCBsZWF2ZSBpdCBkaXNhc3NvY2lhdGVkPyAqLworICAgICAgICBDR0Fzc29jaWF0ZU1vdXNlQW5kTW91c2VDdXJzb3JQb3NpdGlvbiAoMSk7CisgICAgfQorICAgIFNETF9Qcml2YXRlQXBwQWN0aXZlIChRWl9Jc01vdXNlSW5XaW5kb3cgKHRoaXMpLCBTRExfQVBQTU9VU0VGT0NVUyk7Cit9CisKK3ZvaWQgUVpfV2FycFdNQ3Vyc29yIChfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KSB7CisKKyAgICAvKiBPbmx5IGFsbG93IHdhcnBpbmcgd2hlbiBpbiBmb3JlZ3JvdW5kICovCisgICAgaWYgKCAhIFsgTlNBcHAgaXNBY3RpdmUgXSApCisgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIAorICAgIC8qIERvIHRoZSBhY3R1YWwgd2FycCAqLworICAgIGlmIChncmFiX3N0YXRlICE9IFFaX0lOVklTSUJMRV9HUkFCKSBRWl9Qcml2YXRlV2FycEN1cnNvciAodGhpcywgeCwgeSk7CisKKyAgICAvKiBHZW5lcmF0ZSB0aGUgbW91c2UgbW92ZWQgZXZlbnQgKi8KKyAgICBTRExfUHJpdmF0ZU1vdXNlTW90aW9uICgwLCAwLCB4LCB5KTsKK30KKwordm9pZCBRWl9Nb3ZlV01DdXJzb3IgICAgIChfVEhJUywgaW50IHgsIGludCB5KSB7IH0KK3ZvaWQgUVpfQ2hlY2tNb3VzZU1vZGUgICAoX1RISVMpIHsgfQorCit2b2lkIFFaX1NldENhcHRpb24gICAgKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikgeworCisgICAgaWYgKCBxel93aW5kb3cgIT0gbmlsICkgeworICAgICAgICBOU1N0cmluZyAqc3RyaW5nOworICAgICAgICBpZiAoIHRpdGxlICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzdHJpbmcgPSBbIFsgTlNTdHJpbmcgYWxsb2MgXSBpbml0V2l0aFVURjhTdHJpbmc6dGl0bGUgXTsKKyAgICAgICAgICAgIFsgcXpfd2luZG93IHNldFRpdGxlOnN0cmluZyBdOworICAgICAgICAgICAgWyBzdHJpbmcgcmVsZWFzZSBdOworICAgICAgICB9CisgICAgICAgIGlmICggaWNvbiAhPSBOVUxMICkgeworICAgICAgICAgICAgc3RyaW5nID0gWyBbIE5TU3RyaW5nIGFsbG9jIF0gaW5pdFdpdGhVVEY4U3RyaW5nOmljb24gXTsKKyAgICAgICAgICAgIFsgcXpfd2luZG93IHNldE1pbml3aW5kb3dUaXRsZTpzdHJpbmcgXTsKKyAgICAgICAgICAgIFsgc3RyaW5nIHJlbGVhc2UgXTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBRWl9TZXRXaW5kb3dQb3MgKF9USElTLCBpbnQgIHgsIGludCAgeSkKK3sKKyAgICBpZiAoIHF6X3dpbmRvdyA9PSBuaWwgKSB7CisgICAgICAgIC8vcHJpbnRmKCAiJXMoJWQsJWQpOiBjYWxsZWQgZm9yIE5VTEwgd2luZG93XG4iLCBfX0ZVTkNUSU9OX18sIHgsIHkgKTsgCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgIAorICAgIFsgcXpfd2luZG93IHNldEZyYW1lVG9wTGVmdFBvaW50Ok5TTWFrZVBvaW50KCB4LCB0aGlzLT5oaWRkZW4tPmhlaWdodCAtIHkgKSBdOworICAgIC8vcHJpbnRmKCAiJXMoJWQsJWQpOiBkb25lXG4iLCBfX0ZVTkNUSU9OX18sIHgsIHkgKTsKK30KKwordm9pZCAgUVpfR2V0V2luZG93UG9zKF9USElTLCBpbnQgICpweCwgaW50ICAqcHkpCit7CisgICAgTlNQb2ludCAgcHQ7CisgICAgCisgICAgKnB4ID0gKnB5ID0gMDsKKyAKKyAgICBpZiAoIHF6X3dpbmRvdyA9PSBOVUxMICkgeworICAgICAgICAvL3ByaW50ZiggIiVzOiBjYWxsZWQgb24gTlVMTCB3aW5kb3dcbiIsIF9fRlVOQ1RJT05fXyApOworICAgIH0KKworICAgIGlmICggcXpfd2luZG93ICE9IG5pbCApIHsKKyAgICAgICAgTlNSZWN0ICByZWN0ID0gWyBxel93aW5kb3cgZnJhbWUgXTsKKyAgICAgICAgKnB4ID0gcmVjdC5vcmlnaW4ueDsKKyAgICAgICAgKnB5ID0gdGhpcy0+aGlkZGVuLT5oZWlnaHQgLSByZWN0Lm9yaWdpbi55IC0gcmVjdC5zaXplLmhlaWdodDsKKyAgICAgICAgLy9wcmludGYoICIlczogcmV0dXJuaW5nICglZCwlZClcbiIsIF9fRlVOQ1RJT05fXywgKnB4LCAqcHkgKTsKKyAgICB9Cit9CisKKy8qIGRldGVybWluZSBpZiB0aGUgd2luZG93IGlzIGZ1bGx5IHZpc2libGUgb24gdGhlIGN1cnJlbnQgc2NyZWVuIGNvbmZpZ3VyYXRpb24gKi8KK2ludCAgUVpfSXNXaW5kb3dWaXNpYmxlKF9USElTLCBpbnQgIHJlY2VudGVyKQoreworICAgIGludCAgcmVzdWx0ID0gMDsKKyAgIAorICAgIC8vcHJpbnRmKCAiLi4uIGVudGVyICVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworICAgIGlmICggcXpfd2luZG93ICE9IE5VTEwgKSB7CisgICAgICAgIE5TUmVjdCAgICAgICAgZnJhbWUgICA9IFsgcXpfd2luZG93IGZyYW1lIF07IAorICAgICAgICBOU0FycmF5KiAgICAgIHNjcmVlbnMgPSBbIE5TU2NyZWVuIHNjcmVlbnMgXTsKKyAgICAgICAgdW5zaWduZWQgaW50ICBjb3VudCAgID0gWyBzY3JlZW5zIGNvdW50IF07CisgICAgICAgIHVuc2lnbmVkIGludCAgbjsKKyAgICAgICAgLy9wcmludGYoICJ3aW5kb3cgZnJhbWUgKCVkLCVkKSAoJWQsJWQpXG4iLCBmcmFtZS5vcmlnaW4ueCwgZnJhbWUub3JpZ2luLnksCisgICAgICAgIC8vICAgICAgICBmcmFtZS5zaXplLndpZHRoLCBmcmFtZS5zaXplLmhlaWdodCApOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworICAgICAgICAgICAgTlNTY3JlZW4qICBzY3JlZW4gPSBbIHNjcmVlbnMgb2JqZWN0QXRJbmRleDogbiBdOworICAgICAgICAgICAgTlNSZWN0ICAgICB2aXMgICAgPSBbIHNjcmVlbiB2aXNpYmxlRnJhbWUgXTsKKyAgIAorICAgICAgICAgICAgLy9wcmludGYoICJzY3JlZW4gJWQvJWQgIGZyYW1lICglZCwlZCkgKCVkLCVkKVxuIiwgbisxLCBjb3VudCwKKyAgICAgICAgICAgIC8vICAgICAgICB2aXMub3JpZ2luLngsIHZpcy5vcmlnaW4ueSwgdmlzLnNpemUud2lkdGgsIHZpcy5zaXplLmhlaWdodCApOworCisgICAgICAgICAgICBpZiAoZnJhbWUub3JpZ2luLnggPj0gdmlzLm9yaWdpbi54ICYmIAorICAgICAgICAgICAgICAgIGZyYW1lLm9yaWdpbi54ICsgZnJhbWUuc2l6ZS53aWR0aCA8PSB2aXMub3JpZ2luLnggKyB2aXMuc2l6ZS53aWR0aCAmJgorICAgICAgICAgICAgICAgIGZyYW1lLm9yaWdpbi55ID49IHZpcy5vcmlnaW4ueSAmJgorICAgICAgICAgICAgICAgIGZyYW1lLm9yaWdpbi55ICsgZnJhbWUuc2l6ZS5oZWlnaHQgPD0gdmlzLm9yaWdpbi55ICsgdmlzLnNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vcHJpbnRmICggIi4uLiBleGl0ICVzLCByZXN1bHQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQgKTsKKyAgICBpZiAoICFyZXN1bHQgJiYgcmVjZW50ZXIgKSB7CisgICAgICAgIFsgcXpfd2luZG93IGNlbnRlciBdIDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IFFaX0dldE1vbml0b3JEUEkoX1RISVMsIGludCAgKnhEcGksIGludCAqeURwaSkKK3sKKyAgICAvKiBGSVhNRTogaG93IHRvIGdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20gQ29jb2EgPyAqLworICAgIHJldHVybiAtMTsKK30KKworaW50IFFaX0dldE1vbml0b3JSZWN0ICAgKF9USElTLCBTRExfUmVjdCAgKnJlY3QpCit7CisgICAgTlNXaW5kb3cqICAgICB3aW5kb3cgPSBxel93aW5kb3c7CisgICAgTlNSZWN0ICAgICAgICBmcmFtZSAgID0gWyB3aW5kb3cgZnJhbWUgXTsKKyAgICBpbnQgICAgICAgICAgIGZ4MSAgICAgPSBmcmFtZS5vcmlnaW4ueDsKKyAgICBpbnQgICAgICAgICAgIGZ5MSAgICAgPSBmcmFtZS5vcmlnaW4ueTsKKyAgICBpbnQgICAgICAgICAgIGZ4MiAgICAgPSBmcmFtZS5zaXplLndpZHRoICsgZngxOworICAgIGludCAgICAgICAgICAgZnkyICAgICA9IGZyYW1lLnNpemUuaGVpZ2h0ICsgZnkxOyAKKyAgICBOU0FycmF5KiAgICAgIHNjcmVlbnMgPSBbIE5TU2NyZWVuIHNjcmVlbnMgXTsKKyAgICB1bnNpZ25lZCBpbnQgIGNvdW50ICAgPSBbIHNjcmVlbnMgY291bnQgXTsKKyAgICBpbnQgICAgICAgICAgIGJlc3RTY3JlZW4gPSAtMTsKKyAgICBpbnQgICAgICAgICAgIGJlc3RBcmVhID0gMDsKKworICAgIHVuc2lnbmVkIGludCAgbjsKKworICAgIC8qIHdlIG5lZWQgdG8gY29tcHV0ZSB3aGljaCBzY3JlZW4gaGFzIHRoZSBtb3N0IHdpbmRvdyBwaXhlbHMgKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworICAgICAgICBOU1NjcmVlbiogIHNjcmVlbiA9IFsgc2NyZWVucyBvYmplY3RBdEluZGV4OiBuIF07CisgICAgICAgIE5TUmVjdCAgICAgdmlzICAgID0gWyBzY3JlZW4gdmlzaWJsZUZyYW1lIF07CisgICAgICAgIGludCAgICAgICAgdngxICAgID0gdmlzLm9yaWdpbi54OworICAgICAgICBpbnQgICAgICAgIHZ5MSAgICA9IHZpcy5vcmlnaW4ueTsKKyAgICAgICAgaW50ICAgICAgICB2eDIgICAgPSB2aXMuc2l6ZS53aWR0aCArIHZ4MTsKKyAgICAgICAgaW50ICAgICAgICB2eTIgICAgPSB2aXMuc2l6ZS5oZWlnaHQgKyB2eTE7CisgICAgICAgIGludCAgICAgICAgY3gxLCBjeDIsIGN5MSwgY3kyLCBjQXJlYTsKKworICAgICAgICBpZiAoZngxID49IHZ4MiB8fCB2eDEgPj0gZngyIHx8IGZ5MSA+PSB2eTIgfHwgdnkxID49IGZ5MikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGN4MSA9IChmeDEgPCB2eDEpID8gdngxIDogZngxOworICAgICAgICBjeDIgPSAoZngyID4gdngyKSA/IHZ4MiA6IGZ4MjsKKyAgICAgICAgY3kxID0gKGZ5MSA8IHZ5MSkgPyB2eTEgOiBmeTE7CisgICAgICAgIGN5MiA9IChmeTIgPiB2eTIpID8gdnkyIDogZnkyOworCisgICAgICAgIGlmIChjeDEgPj0gY3gyIHx8IGN5MSA+PSBjeTIpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjQXJlYSA9IChjeDItY3gxKSooY3kyLWN5MSk7CisKKyAgICAgICAgaWYgKGJlc3RTY3JlZW4gPCAwIHx8IGNBcmVhID4gYmVzdEFyZWEpIHsKKyAgICAgICAgICAgIGJlc3RTY3JlZW4gPSBuOworICAgICAgICAgICAgYmVzdEFyZWEgICA9IGNBcmVhOworICAgICAgICB9CisgICAgfQorICAgIGlmIChiZXN0U2NyZWVuIDwgMCkKKyAgICAgICAgYmVzdFNjcmVlbiA9IDA7CisKKyAgICB7CisgICAgICAgIE5TU2NyZWVuKiAgc2NyZWVuID0gWyBzY3JlZW5zIG9iamVjdEF0SW5kZXg6IGJlc3RTY3JlZW4gXTsKKyAgICAgICAgTlNSZWN0ICAgICB2aXMgICAgPSBbIHNjcmVlbiB2aXNpYmxlRnJhbWUgXTsKKworICAgICAgICByZWN0LT54ID0gdmlzLm9yaWdpbi54OworICAgICAgICByZWN0LT55ID0gdmlzLm9yaWdpbi55OworICAgICAgICByZWN0LT53ID0gdmlzLnNpemUud2lkdGg7CisgICAgICAgIHJlY3QtPmggPSB2aXMuc2l6ZS5oZWlnaHQ7IAorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBRWl9TZXRJY29uICAgICAgIChfVEhJUywgU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKQoreworICAgIE5TQml0bWFwSW1hZ2VSZXAgKmltZ3JlcDsKKyAgICBOU0ltYWdlICppbWc7CisgICAgU0RMX1N1cmZhY2UgKm1lcmdlZFN1cmZhY2U7CisgICAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7CisgICAgVWludDggKnBpeGVsczsKKyAgICBTRExfYm9vbCBpY29uU3JjQWxwaGE7CisgICAgVWludDggaWNvbkFscGhhVmFsdWU7CisgICAgaW50IGksIGosIG1hc2tQaXRjaCwgaW5kZXg7CisgICAgCisgICAgcG9vbCA9IFsgWyBOU0F1dG9yZWxlYXNlUG9vbCBhbGxvYyBdIGluaXQgXTsKKyAgICAKKyAgICBpbWdyZXAgPSBbIFsgWyBOU0JpdG1hcEltYWdlUmVwIGFsbG9jIF0gaW5pdFdpdGhCaXRtYXBEYXRhUGxhbmVzOiBOVUxMIHBpeGVsc1dpZGU6IGljb24tPncgcGl4ZWxzSGlnaDogaWNvbi0+aCBiaXRzUGVyU2FtcGxlOiA4IHNhbXBsZXNQZXJQaXhlbDogNCBoYXNBbHBoYTogWUVTIGlzUGxhbmFyOiBOTyBjb2xvclNwYWNlTmFtZTogTlNEZXZpY2VSR0JDb2xvclNwYWNlIGJ5dGVzUGVyUm93OiA0Kmljb24tPncgYml0c1BlclBpeGVsOiAzMiBdIGF1dG9yZWxlYXNlIF07CisgICAgaWYgKGltZ3JlcCA9PSBuaWwpIGdvdG8gZnJlZVBvb2w7CisgICAgcGl4ZWxzID0gWyBpbWdyZXAgYml0bWFwRGF0YSBdOworICAgIFNETF9tZW1zZXQocGl4ZWxzLCAwLCA0Kmljb24tPncqaWNvbi0+aCk7IC8qIG1ha2UgdGhlIGJhY2tncm91bmQsIHdoaWNoIHdpbGwgc3Vydml2ZSBpbiBjb2xvcmtleWVkIGFyZWFzLCBjb21wbGV0ZWx5IHRyYW5zcGFyZW50ICovCisgICAgCisjaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTgorI2RlZmluZSBCWVRFT1JERVJfREVQRU5ERU5UX1JHQkFfTUFTS1MgMHhGRjAwMDAwMCwgMHgwMEZGMDAwMCwgMHgwMDAwRkYwMCwgMHgwMDAwMDBGRgorI2Vsc2UKKyNkZWZpbmUgQllURU9SREVSX0RFUEVOREVOVF9SR0JBX01BU0tTIDB4MDAwMDAwRkYsIDB4MDAwMEZGMDAsIDB4MDBGRjAwMDAsIDB4RkYwMDAwMDAKKyNlbmRpZgorICAgIG1lcmdlZFN1cmZhY2UgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZUZyb20ocGl4ZWxzLCBpY29uLT53LCBpY29uLT5oLCAzMiwgNCppY29uLT53LCBCWVRFT1JERVJfREVQRU5ERU5UX1JHQkFfTUFTS1MpOworICAgIGlmIChtZXJnZWRTdXJmYWNlID09IE5VTEwpIGdvdG8gZnJlZVBvb2w7CisgICAgCisgICAgLyogYmxpdCwgd2l0aCB0ZW1wb3JhcmlseSBjbGVhcmVkIFNSQ0FMUEhBIGZsYWcgYmVjYXVzZSB3ZSB3YW50IHRvIGNvcHksIG5vdCBhbHBoYS1ibGVuZCAqLworICAgIGljb25TcmNBbHBoYSA9ICgoaWNvbi0+ZmxhZ3MgJiBTRExfU1JDQUxQSEEpICE9IDApOworICAgIGljb25BbHBoYVZhbHVlID0gaWNvbi0+Zm9ybWF0LT5hbHBoYTsKKyAgICBTRExfU2V0QWxwaGEoaWNvbiwgMCwgMjU1KTsKKyAgICBTRExfQmxpdFN1cmZhY2UoaWNvbiwgTlVMTCwgbWVyZ2VkU3VyZmFjZSwgTlVMTCk7CisgICAgaWYgKGljb25TcmNBbHBoYSkgU0RMX1NldEFscGhhKGljb24sIFNETF9TUkNBTFBIQSwgaWNvbkFscGhhVmFsdWUpOworICAgIAorICAgIFNETF9GcmVlU3VyZmFjZShtZXJnZWRTdXJmYWNlKTsKKyAgICAKKyAgICAvKiBhcHBseSBtYXNrLCBzb3VyY2UgYWxwaGEsIGFuZCBwcmVtdWx0aXBseSBjb2xvciB2YWx1ZXMgYnkgYWxwaGEgKi8KKyAgICBtYXNrUGl0Y2ggPSAoaWNvbi0+dys3KS84OworICAgIGZvciAoaSA9IDA7IGkgPCBpY29uLT5oOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGljb24tPnc7IGorKykgeworICAgICAgICAgICAgaW5kZXggPSBpKjQqaWNvbi0+dyArIGoqNDsKKyAgICAgICAgICAgIGlmICghKG1hc2tbaSptYXNrUGl0Y2ggKyBqLzhdICYgKDEyOCA+PiBqJTgpKSkgeworICAgICAgICAgICAgICAgIHBpeGVsc1tpbmRleCArIDNdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpY29uU3JjQWxwaGEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGljb24tPmZvcm1hdC0+QW1hc2sgPT0gMCkgcGl4ZWxzW2luZGV4ICsgM10gPSBpY29uLT5mb3JtYXQtPmFscGhhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2luZGV4ICsgM10gPSAyNTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBpeGVsc1tpbmRleCArIDNdIDwgMjU1KSB7CisgICAgICAgICAgICAgICAgcGl4ZWxzW2luZGV4ICsgMF0gPSAoVWludDE2KXBpeGVsc1tpbmRleCArIDBdKnBpeGVsc1tpbmRleCArIDNdLzI1NTsKKyAgICAgICAgICAgICAgICBwaXhlbHNbaW5kZXggKyAxXSA9IChVaW50MTYpcGl4ZWxzW2luZGV4ICsgMV0qcGl4ZWxzW2luZGV4ICsgM10vMjU1OworICAgICAgICAgICAgICAgIHBpeGVsc1tpbmRleCArIDJdID0gKFVpbnQxNilwaXhlbHNbaW5kZXggKyAyXSpwaXhlbHNbaW5kZXggKyAzXS8yNTU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaW1nID0gWyBbIFsgTlNJbWFnZSBhbGxvYyBdIGluaXRXaXRoU2l6ZTogTlNNYWtlU2l6ZShpY29uLT53LCBpY29uLT5oKSBdIGF1dG9yZWxlYXNlIF07CisgICAgaWYgKGltZyA9PSBuaWwpIGdvdG8gZnJlZVBvb2w7CisgICAgWyBpbWcgYWRkUmVwcmVzZW50YXRpb246IGltZ3JlcCBdOworICAgIFsgTlNBcHAgc2V0QXBwbGljYXRpb25JY29uSW1hZ2U6aW1nIF07CisgICAgCitmcmVlUG9vbDoKKyAgICBbIHBvb2wgcmVsZWFzZSBdOworfQorCitpbnQgIFFaX0ljb25pZnlXaW5kb3cgKF9USElTKSB7IAorCisgICAgaWYgKCAhIFsgcXpfd2luZG93IGlzTWluaWF0dXJpemVkIF0gKSB7CisgICAgICAgIFsgcXpfd2luZG93IG1pbmlhdHVyaXplOm5pbCBdOworICAgICAgICBpZiAoICEgWyBxel93aW5kb3cgaXNNaW5pYXR1cml6ZWQgXSApIHsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvciAoIndpbmRvdyBpY29uaWZpY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBTRExfU2V0RXJyb3IgKCJ3aW5kb3cgYWxyZWFkeSBpY29uaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitpbnQgIFFaX0dldFdNSW5mbyAgKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKSB7IAorICAgIGluZm8tPm5zV2luZG93UHRyID0gcXpfd2luZG93OworICAgIHJldHVybiAwOyAKK30KKwordm9pZCBRWl9DaGFuZ2VHcmFiU3RhdGUgKF9USElTLCBpbnQgYWN0aW9uKSB7CisKKyAgICAvKiAKKyAgICAgICAgRmlndXJlIG91dCB3aGF0IHRoZSBuZXh0IHN0YXRlIHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgYWN0aW9uLgorICAgICAgICBJZ25vcmUgYWN0aW9ucyB0aGF0IGNhbid0IGNoYW5nZSB0aGUgY3VycmVudCBzdGF0ZS4KKyAgICAqLworICAgIGlmICggZ3JhYl9zdGF0ZSA9PSBRWl9VTkdSQUJCRUQgKSB7CisgICAgICAgIGlmICggYWN0aW9uID09IFFaX0VOQUJMRV9HUkFCICkgeworICAgICAgICAgICAgaWYgKCBjdXJzb3Jfc2hvdWxkX2JlX3Zpc2libGUgKQorICAgICAgICAgICAgICAgIGdyYWJfc3RhdGUgPSBRWl9WSVNJQkxFX0dSQUI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ3JhYl9zdGF0ZSA9IFFaX0lOVklTSUJMRV9HUkFCOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBncmFiX3N0YXRlID09IFFaX1ZJU0lCTEVfR1JBQiApIHsKKyAgICAgICAgaWYgKCBhY3Rpb24gPT0gUVpfRElTQUJMRV9HUkFCICkKKyAgICAgICAgICAgIGdyYWJfc3RhdGUgPSBRWl9VTkdSQUJCRUQ7CisgICAgICAgIGVsc2UgaWYgKCBhY3Rpb24gPT0gUVpfSElERUNVUlNPUiApCisgICAgICAgICAgICBncmFiX3N0YXRlID0gUVpfSU5WSVNJQkxFX0dSQUI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoIGdyYWJfc3RhdGUgPT0gUVpfSU5WSVNJQkxFX0dSQUIgKTsKKyAgICAgICAgCisgICAgICAgIGlmICggYWN0aW9uID09IFFaX0RJU0FCTEVfR1JBQiApCisgICAgICAgICAgICBncmFiX3N0YXRlID0gUVpfVU5HUkFCQkVEOworICAgICAgICBlbHNlIGlmICggYWN0aW9uID09IFFaX1NIT1dDVVJTT1IgKQorICAgICAgICAgICAgZ3JhYl9zdGF0ZSA9IFFaX1ZJU0lCTEVfR1JBQjsKKyAgICB9CisgICAgCisgICAgLyogbm93IGFwcGx5IHRoZSBuZXcgc3RhdGUgKi8KKyAgICBpZiAoZ3JhYl9zdGF0ZSA9PSBRWl9VTkdSQUJCRUQpIHsKKyAgICAKKyAgICAgICAgQ0dBc3NvY2lhdGVNb3VzZUFuZE1vdXNlQ3Vyc29yUG9zaXRpb24gKDEpOworICAgIH0KKyAgICBlbHNlIGlmIChncmFiX3N0YXRlID09IFFaX1ZJU0lCTEVfR1JBQikgeworICAgIAorICAgICAgICBDR0Fzc29jaWF0ZU1vdXNlQW5kTW91c2VDdXJzb3JQb3NpdGlvbiAoMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoIGdyYWJfc3RhdGUgPT0gUVpfSU5WSVNJQkxFX0dSQUIgKTsKKworICAgICAgICBRWl9Qcml2YXRlV2FycEN1cnNvciAodGhpcywgU0RMX1ZpZGVvU3VyZmFjZS0+dyAvIDIsIFNETF9WaWRlb1N1cmZhY2UtPmggLyAyKTsKKyAgICAgICAgQ0dBc3NvY2lhdGVNb3VzZUFuZE1vdXNlQ3Vyc29yUG9zaXRpb24gKDApOworICAgIH0KK30KKworU0RMX0dyYWJNb2RlIFFaX0dyYWJJbnB1dCAoX1RISVMsIFNETF9HcmFiTW9kZSBncmFiX21vZGUpIHsKKworICAgIGludCBkb0dyYWIgPSBncmFiX21vZGUgJiBTRExfR1JBQl9PTjsKKyAgICAvKmludCBmdWxsc2NyZWVuID0gZ3JhYl9tb2RlICYgU0RMX0dSQUJfRlVMTFNDUkVFTjsqLworCisgICAgaWYgKCB0aGlzLT5zY3JlZW4gPT0gTlVMTCApIHsKKyAgICAgICAgU0RMX1NldEVycm9yICgiUVpfR3JhYklucHV0OiBzY3JlZW4gaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gU0RMX0dSQUJfT0ZGOworICAgIH0KKyAgICAgICAgCisgICAgaWYgKCAhIHZpZGVvX3NldCApIHsKKyAgICAgICAgLypTRExfU2V0RXJyb3IgKCJRWl9HcmFiSW5wdXQ6IHZpZGVvIGlzIG5vdCBzZXQsIGdyYWIgd2lsbCB0YWtlIGVmZmVjdCBvbiBtb2RlIHN3aXRjaCIpOyAqLworICAgICAgICBjdXJyZW50X2dyYWJfbW9kZSA9IGdyYWJfbW9kZTsKKyAgICAgICAgcmV0dXJuIGdyYWJfbW9kZTsgICAgICAgLyogV2lsbCBiZSBzZXQgbGF0ZXIgb24gbW9kZSBzd2l0Y2ggKi8KKyAgICB9CisKKyAgICBpZiAoIGdyYWJfbW9kZSAhPSBTRExfR1JBQl9RVUVSWSApIHsKKyAgICAgICAgaWYgKCBkb0dyYWIgKQorICAgICAgICAgICAgUVpfQ2hhbmdlR3JhYlN0YXRlICh0aGlzLCBRWl9FTkFCTEVfR1JBQik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFFaX0NoYW5nZUdyYWJTdGF0ZSAodGhpcywgUVpfRElTQUJMRV9HUkFCKTsKKyAgICAgICAgCisgICAgICAgIGN1cnJlbnRfZ3JhYl9tb2RlID0gZG9HcmFiID8gU0RMX0dSQUJfT04gOiBTRExfR1JBQl9PRkY7CisgICAgICAgIFFaX1VwZGF0ZUN1cnNvcih0aGlzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY3VycmVudF9ncmFiX21vZGU7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6V2luZG93LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3F1YXJ0ei9TRExfUXVhcnR6V2luZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5Mzc1YgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpXaW5kb3cuaApAQCAtMCwwICsxLDUxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyICBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZiAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IDEwNTApCit0eXBlZGVmIHVuc2lnbmVkIGludCBOU1VJbnRlZ2VyOworI2VuZGlmCisKKy8qIFN1YmNsYXNzIG9mIE5TV2luZG93IHRvIGZpeCBnZW5pZSBlZmZlY3QgYW5kIHN1cHBvcnQgcmVzaXplIGV2ZW50cyAgKi8KK0BpbnRlcmZhY2UgU0RMX1F1YXJ0eldpbmRvdyA6IE5TV2luZG93Cit7CisJQk9PTCB3YXRjaEZvck1vdXNlVXA7Cit9CisKKy0gKHZvaWQpbWluaWF0dXJpemU6KGlkKXNlbmRlcjsKKy0gKHZvaWQpZGlzcGxheTsKKy0gKHZvaWQpc2V0RnJhbWU6KE5TUmVjdClmcmFtZVJlY3QgZGlzcGxheTooQk9PTClmbGFnOworLSAodm9pZClhcHBEaWRIaWRlOihOU05vdGlmaWNhdGlvbiopbm90ZTsKKy0gKHZvaWQpYXBwV2lsbFVuaGlkZTooTlNOb3RpZmljYXRpb24qKW5vdGU7CistICh2b2lkKWFwcERpZFVuaGlkZTooTlNOb3RpZmljYXRpb24qKW5vdGU7CistIChpZClpbml0V2l0aENvbnRlbnRSZWN0OihOU1JlY3QpY29udGVudFJlY3Qgc3R5bGVNYXNrOihOU1VJbnRlZ2VyKXN0eWxlTWFzayBiYWNraW5nOihOU0JhY2tpbmdTdG9yZVR5cGUpYmFja2luZ1R5cGUgZGVmZXI6KEJPT0wpZmxhZzsKK0BlbmQKKworLyogRGVsZWdhdGUgZm9yIG91ciBOU1dpbmRvdyB0byBzZW5kIFNETFF1aXQoKSBvbiBjbG9zZSAqLworQGludGVyZmFjZSBTRExfUXVhcnR6V2luZG93RGVsZWdhdGUgOiBOU09iamVjdAorLSAoQk9PTCl3aW5kb3dTaG91bGRDbG9zZTooaWQpc2VuZGVyOworQGVuZAorCisvKiBTdWJjbGFzcyBvZiBOU1ZpZXcgdG8gc2V0IGN1cnNvciByZWN0YW5nbGUgKi8KK0BpbnRlcmZhY2UgU0RMX1F1YXJ0elZpZXcgOiBOU1ZpZXcKKy0gKHZvaWQpcmVzZXRDdXJzb3JSZWN0czsKK0BlbmQKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpXaW5kb3cubSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcXVhcnR6L1NETF9RdWFydHpXaW5kb3cubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzU4MzNmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9xdWFydHovU0RMX1F1YXJ0eldpbmRvdy5tCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyICBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfUXVhcnR6VmlkZW8uaCIKKyNpbmNsdWRlICJTRExfUXVhcnR6V00uaCIKKyNpbmNsdWRlICJTRExfUXVhcnR6V2luZG93LmgiCisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBtYWtlcyB0aGUgKlNETCByZWdpb24qIG9mIHRoZSB3aW5kb3cgMTAwJSBvcGFxdWUuIAorICAgIFRoZSBnZW5pZSBlZmZlY3QgdXNlcyB0aGUgYWxwaGEgY29tcG9uZW50LiBPdGhlcndpc2UsCisgICAgaXQgZG9lc24ndCBzZWVtIHRvIG1hdHRlciB3aGF0IHZhbHVlIGl0IGhhcy4KKyovCitzdGF0aWMgdm9pZCBRWl9TZXRQb3J0QWxwaGFPcGFxdWUgKCkgeworICAgIAorICAgIFNETF9TdXJmYWNlICpzdXJmYWNlID0gY3VycmVudF92aWRlby0+c2NyZWVuOworICAgIGludCBicHA7CisgICAgCisgICAgYnBwID0gc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisgICAgCisgICAgaWYgKGJwcCA9PSAzMikgeworICAgIAorICAgICAgICBVaW50MzIgICAgKnBpeGVscyA9IChVaW50MzIqKSBzdXJmYWNlLT5waXhlbHM7CisgICAgICAgIFVpbnQzMiAgICByb3dQaXhlbHMgPSBzdXJmYWNlLT5waXRjaCAvIDQ7CisgICAgICAgIFVpbnQzMiAgICBpLCBqOworICAgICAgICAKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1cmZhY2UtPmg7IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdXJmYWNlLT53OyBqKyspIHsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgcGl4ZWxzWyAoaSAqIHJvd1BpeGVscykgKyBqIF0gfD0gMHhGRjAwMDAwMDsKKyAgICAgICAgICAgIH0KKyAgICB9Cit9CisKK0BpbXBsZW1lbnRhdGlvbiBTRExfUXVhcnR6V2luZG93CisKKy8qIHdlIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgdG8gZml4IHRoZSBtaW5pYXR1cml6ZSBhbmltYXRpb24vZG9jayBpY29uIGJ1ZyAqLworLSAodm9pZCltaW5pYXR1cml6ZTooaWQpc2VuZGVyCit7CisgICAgaWYgKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCkgeworICAgIAorICAgICAgICAvKiAKKyAgICAgICAgICAgIEZ1dHVyZTogR3JhYiBmcmFtZWJ1ZmZlciBhbmQgcHV0IGludG8gTlNJbWFnZQorICAgICAgICAgICAgWyBxel93aW5kb3cgc2V0TWluaXdpbmRvd0ltYWdlOmltYWdlIF07CisgICAgICAgICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICAKKyAgICAgICAgLyogbWFrZSB0aGUgYWxwaGEgY2hhbm5lbCBvcGFxdWUgc28gYW5pbSB3b24ndCBoYXZlIGhvbGVzIGluIGl0ICovCisgICAgICAgIFFaX1NldFBvcnRBbHBoYU9wYXF1ZSAoKTsKKyAgICB9CisgICAgCisgICAgLyogd2luZG93IGlzIGhpZGRlbiBub3cgKi8KKyAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMCwgU0RMX0FQUEFDVElWRSk7CisgICAgCisgICAgWyBzdXBlciBtaW5pYXR1cml6ZTpzZW5kZXIgXTsKK30KKworLSAodm9pZClkaXNwbGF5Cit7ICAgIAorICAgIC8qIAorICAgICAgICBUaGlzIG1ldGhvZCBmaXJlcyBqdXN0IGJlZm9yZSB0aGUgd2luZG93IGRlbWluYXR1cml6ZXMgZnJvbSB0aGUgRG9jay4KKyAgICAgICAgCisgICAgICAgIFdlJ2xsIHNhdmUgdGhlIGN1cnJlbnQgdmlzaWJsZSBzdXJmYWNlLCBsZXQgdGhlIHdpbmRvdyBtYW5hZ2VyIHJlZHJhdyBhbnkKKyAgICAgICAgVUkgZWxlbWVudHMsIGFuZCByZXN0b3JlIHRoZSBTREwgc3VyZmFjZS4gVGhpcyB3YXksIG5vIGV4cG9zZSBldmVudCAKKyAgICAgICAgaXMgcmVxdWlyZWQsIGFuZCB0aGUgZGVtaW5pYXR1cml6ZSB3b3JrcyBwZXJmZWN0bHkuCisgICAgKi8KKyAgICAgU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gKFNETF9WaWRlb0RldmljZSopY3VycmVudF92aWRlbzsKKyAgICAKKyAgICAvKiBtYWtlIHN1cmUgcGl4ZWxzIGFyZSBmdWxseSBvcGFxdWUgKi8KKyAgICBpZiAoISAoIFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCApICkKKyAgICAgICAgUVpfU2V0UG9ydEFscGhhT3BhcXVlICgpOworICAgIAorICAgIC8qIHNhdmUgY3VycmVudCB2aXNpYmxlIFNETCBzdXJmYWNlICovCisgICAgWyBzZWxmIGNhY2hlSW1hZ2VJblJlY3Q6WyB3aW5kb3dfdmlldyBmcmFtZSBdIF07CisgICAgCisgICAgLyogbGV0IHRoZSB3aW5kb3cgbWFuYWdlciByZWRyYXcgY29udHJvbHMsIGJvcmRlciwgZXRjICovCisgICAgWyBzdXBlciBkaXNwbGF5IF07CisgICAgCisgICAgLyogcmVzdG9yZSB2aXNpYmxlIFNETCBzdXJmYWNlICovCisgICAgWyBzZWxmIHJlc3RvcmVDYWNoZWRJbWFnZSBdOworICAgIAorICAgIC8qIHdpbmRvdyBpcyB2aXNpYmxlIGFnYWluICovCisgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBBQ1RJVkUpOworfQorCistICh2b2lkKXNldEZyYW1lOihOU1JlY3QpZnJhbWVSZWN0IGRpc3BsYXk6KEJPT0wpZmxhZworeworCisgICAgLyoKKyAgICAgICAgSWYgdGhlIHZpZGVvIHN1cmZhY2UgaXMgTlVMTCwgdGhpcyBvcmlnaW5hdGVkIGZyb20gUVpfU2V0VmlkZW9Nb2RlLAorICAgICAgICBzbyBkb24ndCBzZW5kIHRoZSByZXNpemUgZXZlbnQuIAorICAgICovCisgICAgU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gKFNETF9WaWRlb0RldmljZSopY3VycmVudF92aWRlbzsKKyAgICAKKyAgICBpZiAodGhpcyAmJiBTRExfVmlkZW9TdXJmYWNlID09IE5VTEwpIHsKKworICAgICAgICBbIHN1cGVyIHNldEZyYW1lOmZyYW1lUmVjdCBkaXNwbGF5OmZsYWcgXTsKKyAgICB9CisgICAgZWxzZSBpZiAodGhpcyAmJiBxel93aW5kb3cpIHsKKworICAgICAgICBOU1JlY3QgbmV3Vmlld0ZyYW1lOworICAgICAgICAKKyAgICAgICAgWyBzdXBlciBzZXRGcmFtZTpmcmFtZVJlY3QgZGlzcGxheTpmbGFnIF07CisgICAgICAgIAorICAgICAgICBuZXdWaWV3RnJhbWUgPSBbIHdpbmRvd192aWV3IGZyYW1lIF07CisgICAgICAgIAorICAgICAgICBTRExfUHJpdmF0ZVJlc2l6ZSAobmV3Vmlld0ZyYW1lLnNpemUud2lkdGgsIG5ld1ZpZXdGcmFtZS5zaXplLmhlaWdodCk7CisgICAgfQorfQorCisvKiBRWl9Eb0FjdGl2YXRlKCkgY2FsbHMgYSBsb3ctbGV2ZWwgQ29yZUdyYXBoaWNzIHJvdXRpbmUgdG8gYWRqdXN0CisgICB0aGUgY3Vyc29yIHBvc2l0aW9uLCBpZiBpbnB1dCBpcyBiZWluZyBncmFiYmVkLiBJZiBhcHAgYWN0aXZhdGlvbiBpcworICAgdHJpZ2dlcmVkIGJ5IGEgbW91c2UgY2xpY2sgaW4gdGhlIHRpdGxlIGJhciwgdGhlbiB0aGUgd2luZG93IG1hbmFnZXIKKyAgIGdldHMgY29uZnVzZWQgYW5kIHRoaW5rcyB3ZSdyZSBkcmFnZ2luZyB0aGUgd2luZG93LiBUaGUgc29sdXRpb24KKyAgIGJlbG93IHBvc3Rwb25lcyB0aGUgYWN0aXZhdGUgZXZlbnQgdG8gYXZvaWQgdGhpcyBzY2VuYXJpby4gKi8KKy0gKHZvaWQpYmVjb21lS2V5V2luZG93Cit7CisJTlNFdmVudCAqZXZlbnQgPSBbc2VsZiBjdXJyZW50RXZlbnRdOworCWlmIChbZXZlbnQgdHlwZV0gPT0gTlNMZWZ0TW91c2VEb3duICYmIFtldmVudCB3aW5kb3ddID09IHNlbGYpCisJCXdhdGNoRm9yTW91c2VVcCA9IFlFUzsKKwllbHNlCisJCVtzdXBlciBiZWNvbWVLZXlXaW5kb3ddOworfQorCistICh2b2lkKXNlbmRFdmVudDooTlNFdmVudCAqKWV2ZW50Cit7CisJW3N1cGVyIHNlbmRFdmVudDpldmVudF07CisJaWYgKHdhdGNoRm9yTW91c2VVcCAmJiBbZXZlbnQgdHlwZV0gPT0gTlNMZWZ0TW91c2VVcCkKKwl7CisJCXdhdGNoRm9yTW91c2VVcCA9IE5POworCQlbc3VwZXIgYmVjb21lS2V5V2luZG93XTsKKwl9Cit9CisKKy0gKHZvaWQpYXBwRGlkSGlkZTooTlNOb3RpZmljYXRpb24qKW5vdGUKK3sKKyAgICBTRExfUHJpdmF0ZUFwcEFjdGl2ZSAoMCwgU0RMX0FQUEFDVElWRSk7Cit9CisKKy0gKHZvaWQpYXBwV2lsbFVuaGlkZTooTlNOb3RpZmljYXRpb24qKW5vdGUKK3sKKyAgICBTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSAoU0RMX1ZpZGVvRGV2aWNlKiljdXJyZW50X3ZpZGVvOworICAgIAorICAgIGlmICggdGhpcyApIHsKKyAgICAKKyAgICAgICAgLyogbWFrZSBzdXJlIHBpeGVscyBhcmUgZnVsbHkgb3BhcXVlICovCisgICAgICAgIGlmICghICggU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfT1BFTkdMICkgKQorICAgICAgICAgICAgUVpfU2V0UG9ydEFscGhhT3BhcXVlICgpOworICAgICAgICAgIAorICAgICAgICAvKiBzYXZlIGN1cnJlbnQgdmlzaWJsZSBTREwgc3VyZmFjZSAqLworICAgICAgICBbIHNlbGYgY2FjaGVJbWFnZUluUmVjdDpbIHdpbmRvd192aWV3IGZyYW1lIF0gXTsKKyAgICB9Cit9CisKKy0gKHZvaWQpYXBwRGlkVW5oaWRlOihOU05vdGlmaWNhdGlvbiopbm90ZQoreworICAgIC8qIHJlc3RvcmUgY2FjaGVkIGltYWdlLCBzaW5jZSBpdCBtYXkgbm90IGJlIGN1cnJlbnQsIHBvc3QgZXhwb3NlIGV2ZW50IHRvbyAqLworICAgIFsgc2VsZiByZXN0b3JlQ2FjaGVkSW1hZ2UgXTsKKyAgICAKKyAgICAvKlNETF9Qcml2YXRlRXhwb3NlICgpOyovCisgICAgCisgICAgU0RMX1ByaXZhdGVBcHBBY3RpdmUgKDEsIFNETF9BUFBBQ1RJVkUpOworfQorCistIChpZClpbml0V2l0aENvbnRlbnRSZWN0OihOU1JlY3QpY29udGVudFJlY3Qgc3R5bGVNYXNrOihOU1VJbnRlZ2VyKXN0eWxlTWFzayBiYWNraW5nOihOU0JhY2tpbmdTdG9yZVR5cGUpYmFja2luZ1R5cGUgZGVmZXI6KEJPT0wpZmxhZworeworICAgIC8qIE1ha2Ugb3VyIHdpbmRvdyBzdWJjbGFzcyByZWNlaXZlIHRoZXNlIGFwcGxpY2F0aW9uIG5vdGlmaWNhdGlvbnMgKi8KKyAgICBbIFsgTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlciBdIGFkZE9ic2VydmVyOnNlbGYKKyAgICAgICAgc2VsZWN0b3I6QHNlbGVjdG9yKGFwcERpZEhpZGU6KSBuYW1lOk5TQXBwbGljYXRpb25EaWRIaWRlTm90aWZpY2F0aW9uIG9iamVjdDpOU0FwcCBdOworICAgIAorICAgIFsgWyBOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyIF0gYWRkT2JzZXJ2ZXI6c2VsZgorICAgICAgICBzZWxlY3RvcjpAc2VsZWN0b3IoYXBwRGlkVW5oaWRlOikgbmFtZTpOU0FwcGxpY2F0aW9uRGlkVW5oaWRlTm90aWZpY2F0aW9uIG9iamVjdDpOU0FwcCBdOworICAgCisgICAgWyBbIE5TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXIgXSBhZGRPYnNlcnZlcjpzZWxmCisgICAgICAgIHNlbGVjdG9yOkBzZWxlY3RvcihhcHBXaWxsVW5oaWRlOikgbmFtZTpOU0FwcGxpY2F0aW9uV2lsbFVuaGlkZU5vdGlmaWNhdGlvbiBvYmplY3Q6TlNBcHAgXTsKKyAgICAgICAgCisgICAgcmV0dXJuIFsgc3VwZXIgaW5pdFdpdGhDb250ZW50UmVjdDpjb250ZW50UmVjdCBzdHlsZU1hc2s6c3R5bGVNYXNrIGJhY2tpbmc6YmFja2luZ1R5cGUgZGVmZXI6ZmxhZyBdOworfQorCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTRExfUXVhcnR6V2luZG93RGVsZWdhdGUKKy0gKEJPT0wpd2luZG93U2hvdWxkQ2xvc2U6KGlkKXNlbmRlcgoreworICAgIFNETF9Qcml2YXRlUXVpdCgpOworICAgIHJldHVybiBOTzsKK30KKworLSAodm9pZCl3aW5kb3dEaWRCZWNvbWVLZXk6KE5TTm90aWZpY2F0aW9uICopYU5vdGlmaWNhdGlvbgoreworICAgIFFaX0RvQWN0aXZhdGUgKGN1cnJlbnRfdmlkZW8pOworfQorCistICh2b2lkKXdpbmRvd0RpZFJlc2lnbktleTooTlNOb3RpZmljYXRpb24gKilhTm90aWZpY2F0aW9uCit7CisgICAgUVpfRG9EZWFjdGl2YXRlIChjdXJyZW50X3ZpZGVvKTsKK30KKworQGVuZAorCitAaW1wbGVtZW50YXRpb24gU0RMX1F1YXJ0elZpZXcKKworLSAodm9pZClyZXNldEN1cnNvclJlY3RzCit7CisgICAgU0RMX0N1cnNvciAqc2RsYyA9IFNETF9HZXRDdXJzb3IoKTsKKyAgICBpZiAoc2RsYyAhPSBOVUxMICYmIHNkbGMtPndtX2N1cnNvciAhPSBOVUxMKSB7CisgICAgICAgIFtzZWxmIGFkZEN1cnNvclJlY3Q6IFtzZWxmIHZpc2libGVSZWN0XSBjdXJzb3I6IHNkbGMtPndtX2N1cnNvci0+bnNjdXJzb3JdOworICAgIH0KK30KKworQGVuZApkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc0FTTS5TIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc0FTTS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTMyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zQVNNLlMKQEAgLTAsMCArMSwxMTYgQEAKKzsKKzsgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCis7ICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorOworOyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7ICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCis7ICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7Cis7ICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsKKzsgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKzsgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorOyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCis7Cis7ICAgIFNhbSBMYW50aW5nYQorOyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKzsKKzsgQXNzZW1ibGVyIHJvdXRpbmVzIGZvciBSSVNDIE9TIGRpc3BsYXkKKzsKKworCUFSRUEgfEMkJENPREV8CisKKwlFWFBPUlQgfFJJU0NPU19QdXQzMnwKKworOyBEaXNwbGF5IDMyYnBwIHRvIDMyYnBwLCAxOjEKKzsKKzsgQ29kZSBwcm92aWRlZCBieSBBZHJhaW4gTGVlcworOworOyBlbnRyeSBhMSAtPiBkZXN0aW5hdGlvbgorOyAgICAgICBhMiA9ICBkZXN0IHdpZHRoIGluIHBpeGVscworOyAgICAgICBhMyA9ICBkZXN0IGxpbmUgbGVuZ3RoIGluIGJ5dGVzCis7ICAgICAgIGE0ID0gIGRlc3QgaGVpZ2h0IGluIHNjYW5saW5lcworOyAgICAgICBhcmc1IC0+IHNvdXJjZQorOyAgICAgICBhcmc2ID0gIGJ5dGUgb2Zmc2V0IGZyb20gZW5kIG9mIHNvdXJjZSBsaW5lIHRvIHN0YXJ0IG9mIG5leHQKKworQXJnNSAgICAqICAgICAgIDEwKjQKK0FyZzYgICAgKiAgICAgICBBcmc1KzQKKworUklTQ09TX1B1dDMyICAgIFJPVVQKKyAgICAgICAgICAgICAgICBTVE1GRCAgIHNwISx7YTIsdjEtdjYsc2wsZnAsbHJ9CisgICAgICAgICAgICAgICAgTERSICAgICBpcCxbc3AsI0FyZzVdCisgICAgICAgICAgICAgICAgTU9WICAgICBscixhMQorICAgICAgICAgICAgICAgIEIgICAgICAgdWNwNjRscAorCiswMCAgICAgICAgICAgICAgO3RhaWwgc3RyaXAgb2YgMS0xNSBwaXhlbHMKKworICAgICAgICAgICAgICAgIExEUiAgICAgdjEsW2lwXSwjNAorMDEgICAgICAgICAgICAgIFNVQlMgICAgYTIsYTIsIzEKKyAgICAgICAgICAgICAgICBTVFIgICAgIHYxLFtscl0sIzQKKyAgICAgICAgICAgICAgICBMRFJISSAgIHYxLFtpcF0sIzQKKyAgICAgICAgICAgICAgICBCSEkgICAgICUwMQorICAgICAgICAgICAgICAgIEIgICAgICAgJTAyCisKK3VjcDY0ZW5kICAgICAgICBBRERTICAgIGEyLGEyLCMxNgorICAgICAgICAgICAgICAgIEJORSAgICAgJTAwCisKKzAyICAgICAgICAgICAgICBTVUJTICAgIGE0LGE0LCMxICAgICAgICAgICAgICAgIDtoZWlnaHQtLQorICAgICAgICAgICAgICAgIExEUkhJICAgdjEsW3NwLCNBcmc2XQorICAgICAgICAgICAgICAgIExEUkhJICAgYTIsW3NwXSAgICAgICAgICAgICAgICAgO3JlbG9hZCB3aWR0aAorICAgICAgICAgICAgICAgIEJMUyAgICAgJTAzCisKKyAgICAgICAgICAgICAgICA7bW92ZSB0byBzdGFydCBvZiBuZXh0IHNjYW5saW5lCisKKyAgICAgICAgICAgICAgICBBREQgICAgIGxyLGExLGEzCisgICAgICAgICAgICAgICAgQUREICAgICBhMSxhMSxhMworICAgICAgICAgICAgICAgIEFERCAgICAgaXAsaXAsdjEKKwordWNwNjRscCAgICAgICAgIFNVQlMgICAgYTIsYTIsIzE2CisgICAgICAgICAgICAgICAgQkxPICAgICB1Y3A2NGVuZAorCisgICAgICAgICAgICAgICAgUExEICAgICBbaXAsIzY0XQorCisgICAgICAgICAgICAgICAgTERSICAgICB2MSxbaXBdLCM0CisgICAgICAgICAgICAgICAgTERSICAgICB2MixbaXBdLCM0CisgICAgICAgICAgICAgICAgTERSICAgICB2MyxbaXBdLCM0CisgICAgICAgICAgICAgICAgTERSICAgICB2NCxbaXBdLCM0CisgICAgICAgICAgICAgICAgTERSICAgICB2NSxbaXBdLCM0CisgICAgICAgICAgICAgICAgTERSICAgICB2NixbaXBdLCM0CisgICAgICAgICAgICAgICAgTERSICAgICBzbCxbaXBdLCM0CisgICAgICAgICAgICAgICAgTERSICAgICBmcCxbaXBdLCM0CisgICAgICAgICAgICAgICAgU1RSICAgICB2MSxbbHJdLCM0CisgICAgICAgICAgICAgICAgU1RSICAgICB2MixbbHJdLCM0CisgICAgICAgICAgICAgICAgU1RSICAgICB2MyxbbHJdLCM0CisgICAgICAgICAgICAgICAgU1RSICAgICB2NCxbbHJdLCM0CisgICAgICAgICAgICAgICAgU1RSICAgICB2NSxbbHJdLCM0CisgICAgICAgICAgICAgICAgU1RSICAgICB2NixbbHJdLCM0CisgICAgICAgICAgICAgICAgU1RSICAgICBzbCxbbHJdLCM0CisgICAgICAgICAgICAgICAgU1RSICAgICBmcCxbbHJdLCM0CisKKyAgICAgICAgICAgICAgICBQTEQgICAgIFtpcCwjNjRdCisKKyAgICAgICAgICAgICAgICBMRFIgICAgIHYxLFtpcF0sIzQKKyAgICAgICAgICAgICAgICBMRFIgICAgIHYyLFtpcF0sIzQKKyAgICAgICAgICAgICAgICBMRFIgICAgIHYzLFtpcF0sIzQKKyAgICAgICAgICAgICAgICBMRFIgICAgIHY0LFtpcF0sIzQKKyAgICAgICAgICAgICAgICBMRFIgICAgIHY1LFtpcF0sIzQKKyAgICAgICAgICAgICAgICBMRFIgICAgIHY2LFtpcF0sIzQKKyAgICAgICAgICAgICAgICBMRFIgICAgIHNsLFtpcF0sIzQKKyAgICAgICAgICAgICAgICBMRFIgICAgIGZwLFtpcF0sIzQKKyAgICAgICAgICAgICAgICBTVFIgICAgIHYxLFtscl0sIzQKKyAgICAgICAgICAgICAgICBTVFIgICAgIHYyLFtscl0sIzQKKyAgICAgICAgICAgICAgICBTVFIgICAgIHYzLFtscl0sIzQKKyAgICAgICAgICAgICAgICBTVFIgICAgIHY0LFtscl0sIzQKKyAgICAgICAgICAgICAgICBTVFIgICAgIHY1LFtscl0sIzQKKyAgICAgICAgICAgICAgICBTVFIgICAgIHY2LFtscl0sIzQKKyAgICAgICAgICAgICAgICBTVFIgICAgIHNsLFtscl0sIzQKKyAgICAgICAgICAgICAgICBTVFIgICAgIGZwLFtscl0sIzQKKworICAgICAgICAgICAgICAgIEIgICAgICAgdWNwNjRscAorCiswMyAgICAgICAgICAgICAgTERNRkQgICBzcCEse2EyLHYxLXY2LHNsLGZwLHBjfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zRnVsbFNjcmVlblZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zRnVsbFNjcmVlblZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjM2NmNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3NGdWxsU2NyZWVuVmlkZW8uYwpAQCAtMCwwICsxLDc3NyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgICAgIEZpbGUgYWRkZWQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgZm9yIFJJU0MgT1MgY29tcGF0YWJpbGl0eQorCSAyNyBNYXJjaCAyMDAzCisKKyAgICAgSW1wbGVtZW50cyBSSVNDIE9TIGZ1bGwgc2NyZWVuIGRpc3BsYXkuCisqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX3Jpc2Nvc3Rhc2suaCIKKyNpbmNsdWRlICJTRExfcmlzY29zdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfcmlzY29zZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfcmlzY29zbW91c2VfYy5oIgorCisjaW5jbHVkZSAia2VybmVsLmgiCisjaW5jbHVkZSAic3dpcy5oIgorI2luY2x1ZGUgInVuaXhsaWIvb3MuaCIKKyNpbmNsdWRlICJ1bml4bGliL2xvY2FsLmgiCisKKy8qIFByaXZhdGUgc3RydWN0dXJlcyAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnU2NyZWVuTW9kZUJsb2NrCit7CisgICBpbnQgZmxhZ3M7ICAvLyBtb2RlIHNlbGVjdG9yIGZsYWdzLCBiaXQgMCA9IDEsIGJpdCAxLTcgZm9ybWF0IHNwZWNpZmllciwgOC0zMSByZXNlcnZlZAorICAgaW50IHhfcGl4ZWxzOworICAgaW50IHlfcGl4ZWxzOworICAgaW50IHBpeGVsX2RlcHRoOyAgLy8gMl5waXhlbF9kZXB0aCA9IGJwcCxpLmUuIDAgPSAxLCAxID0gMiwgNCA9IDE2LCA1ID0gMzIKKyAgIGludCBmcmFtZV9yYXRlOyAgIC8vIC0xIHVzZSBmaXJzdCBtYXRjaAorICAgaW50IG1vZGVfdmFyc1s1XTsgLy8gYXJyYXkgb2YgaW5kZXgsIHZhbHVlIHBhaXJzIHRlcm1pbmF0ZWQgYnkgLTEKK30gU0NSRUVOTU9ERUJMT0NLOworCisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KK3ZvaWQgRlVMTFNDUkVFTl9TZXREZXZpY2VNb2RlKF9USElTKTsKK2ludCBGVUxMU0NSRUVOX1NldE1vZGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwKTsKK3ZvaWQgRlVMTFNDUkVFTl9TZXR1cEJhbmtzKF9USElTKTsKKworLyogU0RMIHZpZGVvIGRldmljZSBmdW5jdGlvbnMgZm9yIGZ1bGxzY3JlZW4gbW9kZSAqLworc3RhdGljIGludCBGVUxMU0NSRUVOX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgaW50IEZVTExTQ1JFRU5fRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOwordm9pZCBGVUxMU0NSRUVOX1NldFdNQ2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pOworZXh0ZXJuIGludCBSSVNDT1NfR2V0V21JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKTsKKworLyogVXBkYXRlUmVjdHMgdmFyaWFudHMgKi8KK3N0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKK3N0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHNNZW1DcHkoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKK3N0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHM4YnBwKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CitzdGF0aWMgdm9pZCBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzMTZicHAoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKK3N0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHMzMmJwcChfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9VcGRhdGVSZWN0c09TKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKKy8qIExvY2FsIGhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgY21wbW9kZXMoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKTsKK3N0YXRpYyBpbnQgRlVMTFNDUkVFTl9BZGRNb2RlKF9USElTLCBpbnQgYnBwLCBpbnQgdywgaW50IGgpOwordm9pZCBGVUxMU0NSRUVOX1NldFdyaXRlQmFuayhpbnQgYmFuayk7Cit2b2lkIEZVTExTQ1JFRU5fU2V0RGlzcGxheUJhbmsoaW50IGJhbmspOworc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9EaXNhYmxlRXNjYXBlKCk7CitzdGF0aWMgdm9pZCBGVUxMU0NSRUVOX0VuYWJsZUVzY2FwZSgpOwordm9pZCBGVUxMU0NSRUVOX0J1aWxkTW9kZUxpc3QoX1RISVMpOworCisvKiBGb2xsb3dpbmcgdmFyaWFibGUgaXMgc2V0IHVwIGluIHJpc2tvc1Rhc2suYyAqLworZXh0ZXJuIGludCByaXNjb3NfYmFja2J1ZmZlcjsgLyogQ3JlYXRlIGEgYmFjayBidWZmZXIgaW4gc3lzdGVtIG1lbW9yeSBmb3IgZnVsbCBzY3JlZW4gbW9kZSAqLworCisvKiBGb2xsb3dpbmcgaXMgdXNlZCB0byBjcmVhdGUgYSBzcHJpdGUgYmFjayBidWZmZXIgKi8KK2V4dGVybiB1bnNpZ25lZCBjaGFyICpXSU1QX0NyZWF0ZUJ1ZmZlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApOworCisvKiBGYXN0IGFzc2VtYmxlciBjb3B5ICovCitleHRlcm4gdm9pZCBSSVNDT1NfUHV0MzIodm9pZCAqdG8sIGludCBwaXhlbHMsIGludCBwaXRjaCwgaW50IHJvd3MsIHZvaWQgKmZyb20sIGludCBzcmNfc2tpcF9ieXRlcyk7CisKK1NETF9TdXJmYWNlICpGVUxMU0NSRUVOX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisgICBVaW50MzIgUm1hc2sgPSAwOworICAgVWludDMyIEdtYXNrID0gMDsKKyAgIFVpbnQzMiBCbWFzayA9IDA7CisgICBpbnQgY3JlYXRlX2JhY2tfYnVmZmVyID0gcmlzY29zX2JhY2tidWZmZXI7CisKKyAgIHN3aXRjaChicHApCisgICB7CisJY2FzZSA4OgorCQlmbGFncyB8PSBTRExfSFdQQUxFVFRFOworCQlicmVhazsKKworCWNhc2UgMTU6CisJY2FzZSAxNjoKKwkJQm1hc2sgPSAweDAwMDA3YzAwOworCQlHbWFzayA9IDB4MDAwMDAzZTA7CisJCVJtYXNrID0gMHgwMDAwMDAxZjsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQlCbWFzayA9IDB4MDBmZjAwMDA7CisJCUdtYXNrID0gMHgwMDAwZmYwMDsKKwkJUm1hc2sgPSAweDAwMDAwMGZmOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVNETF9TZXRFcnJvcigiUGl4ZWwgZGVwdGggbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gTlVMTDsKKwkJYnJlYWs7CisgICB9CisKKyAgIGlmIChGVUxMU0NSRUVOX1NldE1vZGUod2lkdGgsIGhlaWdodCwgYnBwKSA9PSAwKQorICAgeworCSAgIFNETF9TZXRFcnJvcigiQ291bGRuJ3Qgc2V0IHJlcXVlc3RlZCBtb2RlIik7CisJICAgcmV0dXJuIChOVUxMKTsKKyAgIH0KKworLyogCXByaW50ZigiU2V0dGluZyBtb2RlICVkeCVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsgKi8KKworCS8qIEFsbG9jYXRlIHRoZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciB0aGUgc2NyZWVuICovCisJaWYgKCAhIFNETF9SZWFsbG9jRm9ybWF0KGN1cnJlbnQsIGJwcCwgUm1hc2ssIEdtYXNrLCBCbWFzaywgMCkgKSB7CisJICAgIFJJU0NPU19SZXN0b3JlV2ltcE1vZGUoKTsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgcGl4ZWwgZm9ybWF0IGZvciByZXF1ZXN0ZWQgbW9kZSIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLworCWN1cnJlbnQtPncgPSB3aWR0aDsKKwl0aGlzLT5oaWRkZW4tPmhlaWdodCA9IGN1cnJlbnQtPmggPSBoZWlnaHQ7CisKKyAgIHJlZ3MuclswXSA9IC0xOyAvKiAtMSBmb3IgY3VycmVudCBzY3JlZW4gbW9kZSAqLworCisgICAvKiBHZXQgc2NyZWVuIHdpZHRoIGluIGJ5dGVzICovCisgICByZWdzLnJbMV0gPSA2OyAvLyBTY3JlZW4gV2lkdGggaW4gYnl0ZXMKKyAgIF9rZXJuZWxfc3dpKE9TX1JlYWRNb2RlVmFyaWFibGUsICZyZWdzLCAmcmVncyk7CisKKyAgIGN1cnJlbnQtPnBpdGNoID0gcmVncy5yWzJdOworCisgICBpZiAoZmxhZ3MgJiBTRExfRE9VQkxFQlVGKQorICAgeworCSAgIHJlZ3MuclswXSA9IDI7IC8qIFNjcmVlbiBhcmVhICovCisJICAgX2tlcm5lbF9zd2koT1NfUmVhZER5bmFtaWNBcmVhLCAmcmVncywgJnJlZ3MpOworCSAgIAorCSAgIC8qIFJlZyAxIGhhcyBhbW91bnQgb2YgbWVtb3J5IGN1cnJlbnRseSB1c2VkIGZvciBkaXNwbGF5ICovCisJICAgcmVncy5yWzBdID0gMjsgLyogU2NyZWVuIGFyZWEgKi8KKwkgICByZWdzLnJbMV0gPSAoY3VycmVudC0+cGl0Y2ggKiBoZWlnaHQgKiAyKSAtIHJlZ3MuclsxXTsKKwkgICBpZiAoX2tlcm5lbF9zd2koT1NfQ2hhbmdlRHluYW1pY0FyZWEsICZyZWdzLCAmcmVncykgIT0gTlVMTCkKKwkgICB7CisJCSAgIC8qIENhbid0IGFsbG9jYXRlIGVub3VnaCBzY3JlZW4gbWVtb3J5IGZvciBkb3VibGUgYnVmZmVyICovCisJCSAgIGZsYWdzICY9IH5TRExfRE9VQkxFQlVGOworCSAgIH0KKyAgIH0KKyAgIAorICAJY3VycmVudC0+ZmxhZ3MgPSBmbGFncyB8IFNETF9GVUxMU0NSRUVOIHwgU0RMX0hXU1VSRkFDRSB8IFNETF9QUkVBTExPQzsKKwkKKworCS8qIE5lZWQgdG8gc2V0IGRpc3BsYXkgYmFua3MgaGVyZSBmb3IgZG91YmxlIGJ1ZmZlcmluZyAqLworCWlmIChmbGFncyAmIFNETF9ET1VCTEVCVUYpCisJeworCSAgIEZVTExTQ1JFRU5fU2V0V3JpdGVCYW5rKDApOworCSAgIEZVTExTQ1JFRU5fU2V0RGlzcGxheUJhbmsoMSk7CisKKyAgICAgICAgIGNyZWF0ZV9iYWNrX2J1ZmZlciA9IDA7IC8qIERvbid0IG5lZWQgYSBiYWNrIGJ1ZmZlciBmb3IgYSBkb3VibGUgYnVmZmVyZWQgZGlzcGxheSAqLworICAgIH0KKworICAgIEZVTExTQ1JFRU5fU2V0dXBCYW5rcyh0aGlzKTsKKworICAgIGlmIChjcmVhdGVfYmFja19idWZmZXIpCisgICAgeworICAgICAgIC8qIElmIG5vdCBkb3VibGUgYnVmZmVyZWQgd2UgbWF5IG5lZWQgdG8gY3JlYXRlIGEgbWVtb3J5CisgICAgICAgICAqKiBiYWNrIGJ1ZmZlciB0byBzaW11bGF0ZSBwcm9jZXNzaW5nIG9uIG90aGVyIE9TZXMuCisgICAgICAgICAqKiBUaGlzIGlzIHR1cm5lZCBvbiBieSBzZXR0aW5nIHRoZSBlbnZpcm9tZW50YWwgdmFyaWFibGUKKyAgICAgICAgICoqIFNETCQ8bmFtZT4kQmFja0J1ZmZlciA+PSAxCisgICAgICAgICAqLworICAgICAgIGlmIChyaXNjb3NfYmFja2J1ZmZlciA9PSAzKQorICAgICAgICAgIHRoaXMtPmhpZGRlbi0+YmFua1swXSA9IFdJTVBfQ3JlYXRlQnVmZmVyKHdpZHRoLCBoZWlnaHQsIGJwcCk7CisgICAgICAgZWxzZQorICAgICAgICAgIHRoaXMtPmhpZGRlbi0+YmFua1swXSA9IFNETF9tYWxsb2MoaGVpZ2h0ICogY3VycmVudC0+cGl0Y2gpOworICAgICAgIGlmICh0aGlzLT5oaWRkZW4tPmJhbmtbMF0gPT0gMCkKKyAgICAgICB7CisgCSAgICAgICBSSVNDT1NfUmVzdG9yZVdpbXBNb2RlKCk7CisgICAgICAgICAgIFNETF9TZXRFcnJvcigiQ291bGRudCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJhY2sgYnVmZmVyIik7CisgICAgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgICAgfQorICAgICAgIC8qIFN1cmZhY2UgdXBkYXRlZCBpbiBwcm9ncmFtcyBpcyBub3cgYSBzb2Z0d2FyZSBzdXJmYWNlICovCisgICAgICAgY3VycmVudC0+ZmxhZ3MgJj0gflNETF9IV1NVUkZBQ0U7CisgICAgfQorCisgICAgLyogU3RvcmUgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgc2NyZWVuIGJhbmsgdG8gYmUgZnJlZWQgbGF0ZXIgKi8KKyAgICBpZiAodGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rKSBTRExfZnJlZSh0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmspOworICAgIGlmIChjcmVhdGVfYmFja19idWZmZXIpCisgICAgeworICAgICAgICB0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmsgPSB0aGlzLT5oaWRkZW4tPmJhbmtbMF07CisgICAgICAgIGlmIChyaXNjb3NfYmFja2J1ZmZlciA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+YmFua1swXSArPSA2MDsgLyogU3RhcnQgb2Ygc3ByaXRlIGRhdGEgKi8KKyAgICAgICAgICAgaWYgKGJwcCA9PSA4KSB0aGlzLT5oaWRkZW4tPmJhbmtbMF0gKz0gMjA0ODsgLyogOGJwcCBzcHJpdGUgaGF2ZSBwYWxldHRlIGZpcnN0ICovCisgICAgICAgIH0KKyAgICB9IGVsc2UKKwkgIHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuayA9IDA7CisKKyAgICAvLyBDbGVhciBib3RoIGJhbmtzIHRvIGJsYWNrCisgICAgU0RMX21lbXNldCh0aGlzLT5oaWRkZW4tPmJhbmtbMF0sIDAsIGhlaWdodCAqIGN1cnJlbnQtPnBpdGNoKTsKKyAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbi0+YmFua1sxXSwgMCwgaGVpZ2h0ICogY3VycmVudC0+cGl0Y2gpOworCisgCSAgIHRoaXMtPmhpZGRlbi0+Y3VycmVudF9iYW5rID0gMDsKKwkgICBjdXJyZW50LT5waXhlbHMgPSB0aGlzLT5oaWRkZW4tPmJhbmtbMF07CisKKyAgICAvKiBIYXZlIHRvIHNldCB0aGUgc2NyZWVuIGhlcmUsIHNvIFNldERldmljZU1vZGUgd2lsbCBwaWNrIGl0IHVwICovCisgICAgdGhpcy0+c2NyZWVuID0gY3VycmVudDsKKworCS8qIFJlc2V0IGRldmljZSBmdW5jdGlvbnMgZm9yIHRoZSB3aW1wICovCisJRlVMTFNDUkVFTl9TZXREZXZpY2VNb2RlKHRoaXMpOworCisvKglGVUxMU0NSRUVOX0Rpc2FibGVFc2NhcGUoKTsgKi8KKworCS8qIFdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4oY3VycmVudCk7Cit9CisKKy8qIFJlc2V0IGFueSBkZXZpY2UgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYmVjYXVzZSB3ZSBoYXZlIHJ1biBpbiBXSU1QIG1vZGUgKi8KK3ZvaWQgRlVMTFNDUkVFTl9TZXREZXZpY2VNb2RlKF9USElTKQoreworCS8qIFVwZGF0ZSByZWN0cyBpcyBkaWZmZXJlbnQgaWYgd2UgaGF2ZSBhIGJhY2tidWZmZXIgKi8KKworCWlmIChyaXNjb3NfYmFja2J1ZmZlciAmJiAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9ET1VCTEVCVUYpID09IDApCisgICAgICB7CisJICAgc3dpdGNoKHJpc2Nvc19iYWNrYnVmZmVyKQorICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAyOiAvKiBBUk0gY29kZSBmdWxsIHdvcmQgY29weSAqLworICAgICAgICAgICAgICAgc3dpdGNoKHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2FzZSAxOiAvKiA4YnBwIG1vZGVzICovCisgICAgICAgICAgICAgICAJICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzOGJwcDsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiAxNS8xNmJwcCBtb2RlcyAqLworICAgICAgICAgICAgICAgCSAgIHRoaXMtPlVwZGF0ZVJlY3RzID0gRlVMTFNDUkVFTl9VcGRhdGVSZWN0czE2YnBwOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIDQ6IC8qIDMyIGJwcCBtb2RlcyAqLworICAgICAgICAgICAgICAgCSAgIHRoaXMtPlVwZGF0ZVJlY3RzID0gRlVMTFNDUkVFTl9VcGRhdGVSZWN0czMyYnBwOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIEp1c3QgZGVmYXVsdCB0byB0aGUgbWVtY3B5IHJvdXRpbmUgKi8KKyAgICAgICAgICAgICAgIAkgICB0aGlzLT5VcGRhdGVSZWN0cyA9IEZVTExTQ1JFRU5fVXBkYXRlUmVjdHNNZW1DcHk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOiAvKiBVc2UgT1Mgc3ByaXRlIHBsb3Qgcm91dGluZSAqLworICAgICAgICAgICAgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzT1M7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDogLyogT2xkIGJ1dCBzYWZlIG1lbWNweSAqLworICAgICAgICAgICAgICAgdGhpcy0+VXBkYXRlUmVjdHMgPSBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzTWVtQ3B5OworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9IGVsc2UKKwkgICB0aGlzLT5VcGRhdGVSZWN0cyA9IEZVTExTQ1JFRU5fVXBkYXRlUmVjdHM7IC8qIERlZmF1bHQgZG8gbm90aGluZyBpbXBsZW1lbnRhdGlvbiAqLworCisJdGhpcy0+U2V0Q29sb3JzICAgPSBGVUxMU0NSRUVOX1NldENvbG9yczsKKworCXRoaXMtPkZsaXBIV1N1cmZhY2UgPSBGVUxMU0NSRUVOX0ZsaXBIV1N1cmZhY2U7CisKKwl0aGlzLT5TZXRDYXB0aW9uID0gRlVMTFNDUkVFTl9TZXRXTUNhcHRpb247CisJdGhpcy0+U2V0SWNvbiA9IE5VTEw7CisJdGhpcy0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7CisJCisJdGhpcy0+U2hvd1dNQ3Vyc29yID0gUklTQ09TX1Nob3dXTUN1cnNvcjsKKwl0aGlzLT5XYXJwV01DdXJzb3IgPSBGVUxMU0NSRUVOX1dhcnBXTUN1cnNvcjsKKworCXRoaXMtPlB1bXBFdmVudHMgPSBGVUxMU0NSRUVOX1B1bXBFdmVudHM7CQorfQorCisvKiBRdWVyeSBmb3IgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHZpZGVvIG1vZGVzICovCit2b2lkIEZVTExTQ1JFRU5fQnVpbGRNb2RlTGlzdChfVEhJUykKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisJY2hhciAqZW51bUluZm8gPSBOVUxMOworCWNoYXIgKmVudW1fcHRyOworCWludCAqYmxvY2tJbmZvOworCWludCBqOworCWludCBudW1fbW9kZXM7CisKKwkvKiBGaW5kIG91dCBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkICovCisJcmVncy5yWzBdID0gMjsgLyogUmVhc29uIGNvZGUgKi8KKwlyZWdzLnJbMl0gPSAwOyAvKiBOdW1iZXIgb2YgbW9kZXMgdG8gc2tpcCAqLworCXJlZ3Mucls2XSA9IDA7IC8qIHBvaW50ZXIgdG8gYmxvY2sgb3IgMCBmb3IgY291bnQgKi8KKwlyZWdzLnJbN10gPSAwOyAvKiBTaXplIG9mIGJsb2NrIGluIGJ5dGVzICovCisJX2tlcm5lbF9zd2koT1NfU2NyZWVuTW9kZSwgJnJlZ3MsICZyZWdzKTsKKworICAgIG51bV9tb2RlcyA9IC1yZWdzLnJbMl07CisKKwkvKiBWaWRlbyBtZW1vcnkgc2hvdWxkIGJlIGluIHJbNV0gKi8KKwl0aGlzLT5pbmZvLnZpZGVvX21lbSA9IHJlZ3Mucls1XS8xMDI0OworCisJZW51bUluZm8gPSAodW5zaWduZWQgY2hhciAqKVNETF9tYWxsb2MoLXJlZ3Mucls3XSk7CisJaWYgKGVudW1JbmZvID09IE5VTEwpCisJeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuOworCX0KKwkvKiBSZWFkIG1vZGUgaW5mb3JtYXRpb24gaW50byBibG9jayAqLworCXJlZ3MuclsyXSA9IDA7CisJcmVncy5yWzZdID0gKGludCllbnVtSW5mbzsKKwlyZWdzLnJbN10gPSAtcmVncy5yWzddOworCV9rZXJuZWxfc3dpKE9TX1NjcmVlbk1vZGUsICZyZWdzLCAmcmVncyk7CisKKwllbnVtX3B0ciA9IGVudW1JbmZvOworCisJZm9yIChqID0wOyBqIDwgbnVtX21vZGVzO2orKykKKwl7CisJCWJsb2NrSW5mbyA9IChpbnQgKillbnVtX3B0cjsKKwkJaWYgKChibG9ja0luZm9bMV0gJiAyNTUpID09IDEpIC8qIFdlIHVuZGVyc3RhbmQgdGhpcyBmb3JtYXQgKi8KKwkJeworCQkJc3dpdGNoKGJsb2NrSW5mb1s0XSkKKwkJCXsKKwkJCWNhc2UgMzogLyogOCBiaXRzIHBlciBwaXhlbCAqLworCQkJCUZVTExTQ1JFRU5fQWRkTW9kZSh0aGlzLCA4LCBibG9ja0luZm9bMl0sIGJsb2NrSW5mb1szXSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6IC8qIDE1IGJpdHMgcGVyIHBpeGVsICovCisJCQkJRlVMTFNDUkVFTl9BZGRNb2RlKHRoaXMsIDE1LCBibG9ja0luZm9bMl0sIGJsb2NrSW5mb1szXSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6IC8qIDMyIGJpdHMgcGVyIHBpeGVsICovCisJCQkJRlVMTFNDUkVFTl9BZGRNb2RlKHRoaXMsIDMyLCBibG9ja0luZm9bMl0sIGJsb2NrSW5mb1szXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQllbnVtX3B0ciArPSBibG9ja0luZm9bMF07CisJfQorCisJU0RMX2ZyZWUoZW51bUluZm8pOworCQkKKwkvKiBTb3J0IHRoZSBtb2RlIGxpc3RzICovCisJZm9yICggaj0wOyBqPE5VTV9NT0RFTElTVFM7ICsraiApIHsKKwkJaWYgKCBTRExfbnVtbW9kZXNbal0gPiAwICkgeworCQkJU0RMX3Fzb3J0KFNETF9tb2RlbGlzdFtqXSwgU0RMX251bW1vZGVzW2pdLCBzaXplb2YgKlNETF9tb2RlbGlzdFtqXSwgY21wbW9kZXMpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IEZVTExTQ1JFRU5fRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisgICByZWdzLnJbMF0gPSAxOTsKKworICAgRlVMTFNDUkVFTl9TZXREaXNwbGF5QmFuayh0aGlzLT5oaWRkZW4tPmN1cnJlbnRfYmFuayk7CisgICB0aGlzLT5oaWRkZW4tPmN1cnJlbnRfYmFuayBePSAxOworICAgRlVMTFNDUkVFTl9TZXRXcml0ZUJhbmsodGhpcy0+aGlkZGVuLT5jdXJyZW50X2JhbmspOworICAgc3VyZmFjZS0+cGl4ZWxzID0gdGhpcy0+aGlkZGVuLT5iYW5rW3RoaXMtPmhpZGRlbi0+Y3VycmVudF9iYW5rXTsKKworICAgLyogV2FpdCBmb3IgVnN5bmMgKi8KKyAgIF9rZXJuZWxfc3dpKE9TX0J5dGUsICZyZWdzLCAmcmVncyk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qIE5vdGhpbmcgdG8gZG8gaWYgd2UgYXJlIHdyaXRpbmcgZGlyZWN0IHRvIGhhcmR3YXJlICovCitzdGF0aWMgdm9pZCBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKK30KKworLyogU2FmZSBidXQgc2xvd2VyIE1lbW9yeSBjb3B5IGZyb20gb3VyIGFsbG9jYXRlZCBiYWNrIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9VcGRhdGVSZWN0c01lbUNweShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisgICAgICBpbnQgajsKKyAgICAgIGNoYXIgKnRvLCAqZnJvbTsKKyAgICAgIGludCBwaXRjaCA9IHRoaXMtPnNjcmVlbi0+cGl0Y2g7CisgICAgICBpbnQgcm93OworICAgICAgaW50IHhtdWx0ID0gdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtcmVjdHM7IGorKykKKyAgICAgIHsKKyAgICAgICAgIGZyb20gPSB0aGlzLT5oaWRkZW4tPmJhbmtbMF0gKyByZWN0cy0+eCAqIHhtdWx0ICsgcmVjdHMtPnkgKiBwaXRjaDsKKyAgICAgICAgIHRvICA9IHRoaXMtPmhpZGRlbi0+YmFua1sxXSArIHJlY3RzLT54ICogeG11bHQgKyByZWN0cy0+eSAqIHBpdGNoOworICAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCByZWN0cy0+aDsgcm93KyspCisgICAgICAgICB7CisgICAgICAgICAgICAgU0RMX21lbWNweSh0bywgZnJvbSwgcmVjdHMtPncgKiB4bXVsdCk7CisgICAgICAgICAgICAgZnJvbSArPSBwaXRjaDsKKyAgICAgICAgICAgICB0byArPSBwaXRjaDsKKyAgICAgICAgIH0KKyAgICAgICAgIHJlY3RzKys7CisgICAgICB9Cit9CisKKy8qIFVzZSBvcHRpbWl6ZWQgYXNzZW1ibGVyIG1lbW9yeSBjb3B5LiBEZWxpYmVyYXRlbHkgY29waWVzIGV4dHJhIGNvbHVtbnMgaWYKKyAgIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlIHJlY3RhbmdsZSBpcyB3b3JkIGFsaWduZWQuICovCitzdGF0aWMgdm9pZCBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzOGJwcChfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisgICBpbnQgajsKKyAgIGNoYXIgKnRvLCAqZnJvbTsKKyAgIGludCBwaXRjaCA9IHRoaXMtPnNjcmVlbi0+cGl0Y2g7CisgICBpbnQgd2lkdGhfYnl0ZXM7CisgICBpbnQgc3JjX3NraXBfYnl0ZXM7CisKKyAgIGZvciAoaiA9IDA7IGogPCBudW1yZWN0czsgaisrKQorICAgeworICAgICAgZnJvbSA9IHRoaXMtPmhpZGRlbi0+YmFua1swXSArIHJlY3RzLT54ICsgcmVjdHMtPnkgKiBwaXRjaDsKKyAgICAgIHRvICA9IHRoaXMtPmhpZGRlbi0+YmFua1sxXSArIHJlY3RzLT54ICsgcmVjdHMtPnkgKiBwaXRjaDsKKyAgICAgIHdpZHRoX2J5dGVzID0gcmVjdHMtPnc7CisgICAgICBpZiAoKGludClmcm9tICYgMykKKyAgICAgIHsKKyAgICAgICAgIGludCBleHRyYSA9ICgoaW50KWZyb20gJiAzKTsKKyAgICAgICAgIGZyb20gLT0gZXh0cmE7CisgICAgICAgICB0byAtPSBleHRyYTsKKyAgICAgICAgIHdpZHRoX2J5dGVzICs9IGV4dHJhOworICAgICAgfQorICAgICAgaWYgKHdpZHRoX2J5dGVzICYgMykgd2lkdGhfYnl0ZXMgKz0gNCAtICh3aWR0aF9ieXRlcyAmIDMpOworICAgICAgc3JjX3NraXBfYnl0ZXMgPSBwaXRjaCAtIHdpZHRoX2J5dGVzOworICAgICAgICAgICAgICAgCisgICAgICBSSVNDT1NfUHV0MzIodG8sICh3aWR0aF9ieXRlcyA+PiAyKSwgcGl0Y2gsIChpbnQpcmVjdHMtPmgsIGZyb20sIHNyY19za2lwX2J5dGVzKTsKKyAgICAgIHJlY3RzKys7CisgICB9Cit9CisKKy8qIFVzZSBvcHRpbWl6ZWQgYXNzZW1ibGVyIG1lbW9yeSBjb3B5LiBEZWxpYmVyYXRlbHkgY29waWVzIGV4dHJhIGNvbHVtbnMgaWYKKyAgIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlIHJlY3RhbmdsZSBpcyB3b3JkIGFsaWduZWQuICovCitzdGF0aWMgdm9pZCBGVUxMU0NSRUVOX1VwZGF0ZVJlY3RzMTZicHAoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworICAgaW50IGo7CisgICBjaGFyICp0bywgKmZyb207CisgICBpbnQgcGl0Y2ggPSB0aGlzLT5zY3JlZW4tPnBpdGNoOworICAgaW50IHdpZHRoX2J5dGVzOworICAgaW50IHNyY19za2lwX2J5dGVzOworCisgICBmb3IgKGogPSAwOyBqIDwgbnVtcmVjdHM7IGorKykKKyAgIHsKKyAgICAgIGZyb20gPSB0aGlzLT5oaWRkZW4tPmJhbmtbMF0gKyAocmVjdHMtPnggPDwgMSkgKyByZWN0cy0+eSAqIHBpdGNoOworICAgICAgdG8gID0gdGhpcy0+aGlkZGVuLT5iYW5rWzFdICsgKHJlY3RzLT54IDw8IDEpICsgcmVjdHMtPnkgKiBwaXRjaDsKKyAgICAgIHdpZHRoX2J5dGVzID0gKCgoaW50KXJlY3RzLT53KSA8PCAxKTsKKyAgICAgIGlmICgoaW50KWZyb20gJiAzKQorICAgICAgeworICAgICAgICAgZnJvbSAtPSAyOworICAgICAgICAgdG8gLT0gMjsKKyAgICAgICAgIHdpZHRoX2J5dGVzICs9IDI7CisgICAgICB9CisgICAgICBpZiAod2lkdGhfYnl0ZXMgJiAzKSB3aWR0aF9ieXRlcyArPSAyOworICAgICAgc3JjX3NraXBfYnl0ZXMgPSBwaXRjaCAtIHdpZHRoX2J5dGVzOworICAgICAgICAgICAgICAgCisgICAgICBSSVNDT1NfUHV0MzIodG8sICh3aWR0aF9ieXRlcyA+PiAyKSwgcGl0Y2gsIChpbnQpcmVjdHMtPmgsIGZyb20sIHNyY19za2lwX2J5dGVzKTsKKyAgICAgIHJlY3RzKys7CisgICB9Cit9CisKKy8qIFVzZSBvcHRpbWl6ZWQgYXNzZW1ibGVyIG1lbW9yeSBjb3B5LiAzMiBicHAgbW9kZXMgYXJlIGFsd2F5cyB3b3JkIGFsaWduZWQgKi8KK3N0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHMzMmJwcChfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisgICBpbnQgajsKKyAgIGNoYXIgKnRvLCAqZnJvbTsKKyAgIGludCBwaXRjaCA9IHRoaXMtPnNjcmVlbi0+cGl0Y2g7CisgICBpbnQgd2lkdGg7CisKKyAgIGZvciAoaiA9IDA7IGogPCBudW1yZWN0czsgaisrKQorICAgeworICAgICAgZnJvbSA9IHRoaXMtPmhpZGRlbi0+YmFua1swXSArIChyZWN0cy0+eCA8PCAyKSArIHJlY3RzLT55ICogcGl0Y2g7CisgICAgICB0byAgPSB0aGlzLT5oaWRkZW4tPmJhbmtbMV0gKyAocmVjdHMtPnggPDwgMikgKyByZWN0cy0+eSAqIHBpdGNoOworICAgICAgd2lkdGggPSAoaW50KXJlY3RzLT53IDsKKyAgICAgICAgICAgICAgIAorICAgICAgUklTQ09TX1B1dDMyKHRvLCB3aWR0aCwgcGl0Y2gsIChpbnQpcmVjdHMtPmgsIGZyb20sIHBpdGNoIC0gKHdpZHRoIDw8IDIpKTsKKyAgICAgIHJlY3RzKys7CisgICB9Cit9CisKKy8qIFVzZSBvcGVyYXRpbmcgc3lzdGVtIHNwcml0ZSBwbG90cy4gQ3VycmVudGx5IHRoaXMgaXMgbXVjaCBzbG93ZXIgdGhhbiB0aGUKKyAgIG90aGVyIHZhcmlhbnRzIGhvd2V2ZXIgYWNjZWxlcmF0ZWQgc3ByaXRlIHBsb3R0aW5nIGNhbiBiZSBzZWVuIG9uIHRoZSBob3Jpem9uCisgICBzbyB0aGlzIHByZXBhcmVzIGZvciBpdC4gKi8KK3N0YXRpYyB2b2lkIEZVTExTQ1JFRU5fVXBkYXRlUmVjdHNPUyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisgICBfa2VybmVsX29zZXJyb3IgKmVycjsKKyAgIGludCBqOworICAgaW50IHk7CisKKyAgIHJlZ3MuclswXSA9IDI4ICsgNTEyOworICAgcmVncy5yWzFdID0gKHVuc2lnbmVkIGludCl0aGlzLT5oaWRkZW4tPmFsbG9jX2Jhbms7CisgICByZWdzLnJbMl0gPSAodW5zaWduZWQgaW50KXRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuaysxNjsKKyAgIHJlZ3Mucls1XSA9IDA7CisKKyAgIGZvciAoaiA9IDA7IGogPCBudW1yZWN0czsgaisrKQorICAgeworICAgICAgeSA9IHRoaXMtPnNjcmVlbi0+aCAtIHJlY3RzLT55OyAvKiB0b3Agb2YgY2xpcHBpbmcgcmVnaW9uICovCisgICAgICBfa2VybmVsX29zd3JjaCgyNCk7IC8qIFNldCBncmFwaGljcyBjbGlwIHJlZ2lvbiAqLworICAgICAgX2tlcm5lbF9vc3dyY2goKHJlY3RzLT54IDw8IHRoaXMtPmhpZGRlbi0+eGVpZykgJiAweEZGKTsgLyogbGVmdCAqLworICAgICAgX2tlcm5lbF9vc3dyY2goKChyZWN0cy0+eCA8PCB0aGlzLT5oaWRkZW4tPnhlaWcpID4+IDgpICYgMHhGRik7CisgICAgICBfa2VybmVsX29zd3JjaCgoKHkgLSByZWN0cy0+aCkgPDwgdGhpcy0+aGlkZGVuLT55ZWlnKSAmIDB4RkYpOyAvKiBib3R0b20gKi8KKyAgICAgIF9rZXJuZWxfb3N3cmNoKCgoKHkgLSByZWN0cy0+aCkgPDwgdGhpcy0+aGlkZGVuLT55ZWlnKT4+IDgpICYgMHhGRik7CisgICAgICBfa2VybmVsX29zd3JjaCgoKHJlY3RzLT54ICsgcmVjdHMtPncgLSAxKSA8PCB0aGlzLT5oaWRkZW4tPnhlaWcpICYgMHhGRik7IC8qIHJpZ2h0ICovCisgICAgICBfa2VybmVsX29zd3JjaCgoKChyZWN0cy0+eCArIHJlY3RzLT53IC0gMSk8PCB0aGlzLT5oaWRkZW4tPnhlaWcpID4+IDgpICYgMHhGRik7CisgICAgICBfa2VybmVsX29zd3JjaCgoKHktMSkgPDwgdGhpcy0+aGlkZGVuLT55ZWlnKSAmIDB4RkYpOyAvKiB0b3AgKi8KKyAgICAgIF9rZXJuZWxfb3N3cmNoKCgoKHktMSkgPDwgdGhpcy0+aGlkZGVuLT55ZWlnKSA+PiA4KSAmIDB4RkYpOworCisgICAgICByZWdzLnJbM10gPSAwOworICAgICAgcmVncy5yWzRdID0gMDsKKworICAgICAgaWYgKChlcnIgPSBfa2VybmVsX3N3aShPU19TcHJpdGVPcCwgJnJlZ3MsICZyZWdzKSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHByaW50ZigiT1NfU3ByaXRlT3AgZmFpbGVkIFxuJXNcbiIsZXJyLT5lcnJtZXNzKTsKKyAgICAgIH0KKworICAgICAgcmVjdHMrKzsKKworICAgICAgLyogUmVzZXQgdG8gZnVsbCBzY3JlZW4gY2xpcHBpbmcgKi8KKyAgICAgIF9rZXJuZWxfb3N3cmNoKDI0KTsgLyogU2V0IGdyYXBoaWNzIGNsaXAgcmVnaW9uICovCisgICAgICBfa2VybmVsX29zd3JjaCgwKTsgLyogbGVmdCAqLworICAgICAgX2tlcm5lbF9vc3dyY2goMCk7CisgICAgICBfa2VybmVsX29zd3JjaCgwKTsgLyogYm90dG9tICovCisgICAgICBfa2VybmVsX29zd3JjaCgwKTsKKyAgICAgIF9rZXJuZWxfb3N3cmNoKCgodGhpcy0+c2NyZWVuLT53LTEpIDw8IHRoaXMtPmhpZGRlbi0+eGVpZykgJiAweEZGKTsgLyogcmlnaHQgKi8KKyAgICAgIF9rZXJuZWxfb3N3cmNoKCgoKHRoaXMtPnNjcmVlbi0+dy0xKSA8PCB0aGlzLT5oaWRkZW4tPnhlaWcpID4+IDgpICYgMHhGRik7CisgICAgICBfa2VybmVsX29zd3JjaCgoKHRoaXMtPnNjcmVlbi0+aC0xKSA8PCB0aGlzLT5oaWRkZW4tPnllaWcpICYgMHhGRik7IC8qIHRvcCAqLworICAgICAgX2tlcm5lbF9vc3dyY2goKCgodGhpcy0+c2NyZWVuLT5oLTEpIDw8IHRoaXMtPmhpZGRlbi0+eWVpZykgPj4gOCkgJiAweEZGKTsKKyAgIH0KK30KKworCitpbnQgRlVMTFNDUkVFTl9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisJX2tlcm5lbF9zd2lfcmVncyByZWdzOworCWludCBwYWxldHRlWzI1Nl07CisKKwlyZWdzLnJbMF0gPSAtMTsKKwlyZWdzLnJbMV0gPSAtMTsKKwlyZWdzLnJbMl0gPSAoaW50KXBhbGV0dGU7CisJcmVncy5yWzNdID0gMTAyNDsKKwlyZWdzLnJbNF0gPSAwOworCV9rZXJuZWxfc3dpKENvbG91clRyYW5zX1JlYWRQYWxldHRlLCAmcmVncywgJnJlZ3MpOworCisJd2hpbGUobmNvbG9ycy0tKQorCXsKKwkJcGFsZXR0ZVtmaXJzdGNvbG9yXSA9ICgoY29sb3JzLT5iKSA8PCAyNCkgfCAoKGNvbG9ycy0+ZykgPDwgMTYpIHwgKChjb2xvcnMtPnIpIDw8IDgpOworCQlmaXJzdGNvbG9yKys7CisJCWNvbG9ycysrOworCX0KKworCXJlZ3MuclswXSA9IC0xOworCXJlZ3MuclsxXSA9IC0xOworCXJlZ3MuclsyXSA9IChpbnQpcGFsZXR0ZTsKKwlyZWdzLnJbM10gPSAwOworCXJlZ3Mucls0XSA9IDA7CisJX2tlcm5lbF9zd2koQ29sb3VyVHJhbnNfV3JpdGVQYWxldHRlLCAmcmVncywgJnJlZ3MpOworCisJcmV0dXJuKDEpOworfQorCisKK3N0YXRpYyBpbnQgY21wbW9kZXMoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQoreworICAgIFNETF9SZWN0ICphID0gKihTRExfUmVjdCAqKil2YTsKKyAgICBTRExfUmVjdCAqYiA9ICooU0RMX1JlY3QgKiopdmI7CisgICAgaWYoYS0+dyA9PSBiLT53KQorICAgICAgICByZXR1cm4gYi0+aCAtIGEtPmg7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYi0+dyAtIGEtPnc7Cit9CisKK3N0YXRpYyBpbnQgRlVMTFNDUkVFTl9BZGRNb2RlKF9USElTLCBpbnQgYnBwLCBpbnQgdywgaW50IGgpCit7CisJU0RMX1JlY3QgKm1vZGU7CisJaW50IGksIGluZGV4OworCWludCBuZXh0X21vZGU7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbW9kZSAqLworCWlmICggYnBwIDwgOCApIHsgIC8qIE5vdCBzdXBwb3J0ZWQgKi8KKwkJcmV0dXJuKDApOworCX0KKwlpbmRleCA9ICgoYnBwKzcpLzgpLTE7CisJZm9yICggaT0wOyBpPFNETF9udW1tb2Rlc1tpbmRleF07ICsraSApIHsKKwkJbW9kZSA9IFNETF9tb2RlbGlzdFtpbmRleF1baV07CisJCWlmICggKG1vZGUtPncgPT0gdykgJiYgKG1vZGUtPmggPT0gaCkgKSB7CisJCQlyZXR1cm4oMCk7CisJCX0KKwl9CisKKwkvKiBTZXQgdXAgdGhlIG5ldyB2aWRlbyBtb2RlIHJlY3RhbmdsZSAqLworCW1vZGUgPSAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZiAqbW9kZSk7CisJaWYgKCBtb2RlID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oLTEpOworCX0KKwltb2RlLT54ID0gMDsKKwltb2RlLT55ID0gMDsKKwltb2RlLT53ID0gdzsKKwltb2RlLT5oID0gaDsKKworCS8qIEFsbG9jYXRlIHRoZSBuZXcgbGlzdCBvZiBtb2RlcywgYW5kIGZpbGwgaW4gdGhlIG5ldyBtb2RlICovCisJbmV4dF9tb2RlID0gU0RMX251bW1vZGVzW2luZGV4XTsKKwlTRExfbW9kZWxpc3RbaW5kZXhdID0gKFNETF9SZWN0ICoqKQorCSAgICAgICBTRExfcmVhbGxvYyhTRExfbW9kZWxpc3RbaW5kZXhdLCAoMStuZXh0X21vZGUrMSkqc2l6ZW9mKFNETF9SZWN0ICopKTsKKwlpZiAoIFNETF9tb2RlbGlzdFtpbmRleF0gPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCVNETF9udW1tb2Rlc1tpbmRleF0gPSAwOworCQlTRExfZnJlZShtb2RlKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJU0RMX21vZGVsaXN0W2luZGV4XVtuZXh0X21vZGVdID0gbW9kZTsKKwlTRExfbW9kZWxpc3RbaW5kZXhdW25leHRfbW9kZSsxXSA9IE5VTEw7CisJU0RMX251bW1vZGVzW2luZGV4XSsrOworCisJcmV0dXJuKDApOworfQorCit2b2lkIEZVTExTQ1JFRU5fU2V0V3JpdGVCYW5rKGludCBiYW5rKQoreworICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOworICAgcmVncy5yWzBdID0gMTEyOworICAgcmVncy5yWzFdID0gYmFuaysxOworICAgX2tlcm5lbF9zd2koT1NfQnl0ZSwgJnJlZ3MsICZyZWdzKTsKK30KKwordm9pZCBGVUxMU0NSRUVOX1NldERpc3BsYXlCYW5rKGludCBiYW5rKQoreworICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOworICAgcmVncy5yWzBdID0gMTEzOworICAgcmVncy5yWzFdID0gYmFuaysxOworICAgX2tlcm5lbF9zd2koT1NfQnl0ZSwgJnJlZ3MsICZyZWdzKTsKK30KKworCisvKiogRGlzYWJsZSBzcGVjaWFsIGVzY2FwZSBrZXkgcHJvY2Vzc2luZyAqLworc3RhdGljIHZvaWQgRlVMTFNDUkVFTl9EaXNhYmxlRXNjYXBlKCkKK3sKKyAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKyAgIHJlZ3MuclswXSA9IDIyOTsKKyAgIHJlZ3MuclsxXSA9IDE7CisgICByZWdzLnJbMl0gPSAwOworICAgX2tlcm5lbF9zd2koT1NfQnl0ZSwgJnJlZ3MsICZyZWdzKTsKKyAgCit9CisKKy8qKiBFbmFibGUgc3BlY2lhbCBlc2NhcGUga2V5IHByb2Nlc3NpbmcgKi8KK3N0YXRpYyB2b2lkIEZVTExTQ1JFRU5fRW5hYmxlRXNjYXBlKCkKK3sKKyAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKyAgIHJlZ3MuclswXSA9IDIyOTsKKyAgIHJlZ3MuclsxXSA9IDA7CisgICByZWdzLnJbMl0gPSAwOworICAgX2tlcm5lbF9zd2koT1NfQnl0ZSwgJnJlZ3MsICZyZWdzKTsKKyAgCit9CisKKy8qKiBTdG9yZSBjYXB0aW9uIGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgYmVmb3JlIHdlIGNyZWF0ZSBhIHdpbmRvdyAqLwordm9pZCBGVUxMU0NSRUVOX1NldFdNQ2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pCit7CisJU0RMX3N0cmxjcHkodGhpcy0+aGlkZGVuLT50aXRsZSwgdGl0bGUsIFNETF9hcnJheXNpemUodGhpcy0+aGlkZGVuLT50aXRsZSkpOworfQorCisvKiBTZXQgc2NyZWVuIG1vZGUKKyoKKyogIFJldHVybnMgMSBpZiBtb2RlIGlzIHNldCBvaywgb3RoZXJ3aXNlIDAKKyovCisKK2ludCBGVUxMU0NSRUVOX1NldE1vZGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwKQoreworICAgU0NSRUVOTU9ERUJMT0NLIHNtYjsKKyAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKworICAgc21iLmZsYWdzID0gMTsKKyAgIHNtYi54X3BpeGVscyA9IHdpZHRoOworICAgc21iLnlfcGl4ZWxzID0gaGVpZ2h0OworICAgc21iLm1vZGVfdmFyc1swXSA9IC0xOworCisgICBzd2l0Y2goYnBwKQorICAgeworCWNhc2UgODoKKwkJc21iLnBpeGVsX2RlcHRoID0gMzsKKwkJLyogTm90ZTogTmVlZCB0byBzZXQgTW9kZUZsYWdzIHRvIDEyOCBhbmQgTkNvbG91ciB2YXJpYWJsZXMgdG8gMjU1IGdldCBmdWxsIDggYml0IHBhbGV0dGUgKi8KKwkJc21iLm1vZGVfdmFyc1swXSA9IDA7IHNtYi5tb2RlX3ZhcnNbMV0gPSAxMjg7IC8qIE1vZGUgZmxhZ3MgKi8KKwkJc21iLm1vZGVfdmFyc1syXSA9IDM7IHNtYi5tb2RlX3ZhcnNbM10gPSAyNTU7IC8qIE5Db2xvdXIgKG51bWJlciBvZiBjb2xvdXJzIC0xKSAqLworCQlzbWIubW9kZV92YXJzWzRdID0gLTE7IC8qIEVuZCBvZiBsaXN0ICovCisJCWJyZWFrOworCisJY2FzZSAxNToKKwljYXNlIDE2OgorCQlzbWIucGl4ZWxfZGVwdGggPSA0OworCQlicmVhazsKKworCWNhc2UgMzI6CisJCXNtYi5waXhlbF9kZXB0aCA9IDU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJU0RMX1NldEVycm9yKCJQaXhlbCBkZXB0aCBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiAwOworCQlicmVhazsKKyAgIH0KKyAgIAorICAgc21iLmZyYW1lX3JhdGUgPSAtMTsKKworICAgcmVncy5yWzBdID0gMDsKKyAgIHJlZ3MuclsxXSA9IChpbnQpJnNtYjsKKworICAgaWYgKF9rZXJuZWxfc3dpKE9TX1NjcmVlbk1vZGUsICZyZWdzLCAmcmVncykgIT0gMCkKKyAgIHsKKwkgICBTRExfU2V0RXJyb3IoIkNvdWxkbid0IHNldCByZXF1ZXN0ZWQgbW9kZSIpOworCSAgIHJldHVybiAwOworICAgfQorCisgICAgLyogVHVybiBjdXJzb3Igb2ZmKi8KKyAgICBfa2VybmVsX29zd3JjaCgyMyk7X2tlcm5lbF9vc3dyY2goMSk7X2tlcm5lbF9vc3dyY2goMCk7CisgICAgX2tlcm5lbF9vc3dyY2goMCk7X2tlcm5lbF9vc3dyY2goMCk7X2tlcm5lbF9vc3dyY2goMCk7CisgICAgX2tlcm5lbF9vc3dyY2goMCk7X2tlcm5lbF9vc3dyY2goMCk7X2tlcm5lbF9vc3dyY2goMCk7CisgICAgX2tlcm5lbF9vc3dyY2goMCk7X2tlcm5lbF9vc3dyY2goMCk7CisKKyAgIHJldHVybiAxOworfQorCisvKiBHZXQgU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgc2NyZWVuIGJhbmtzICovCit2b2lkIEZVTExTQ1JFRU5fU2V0dXBCYW5rcyhfVEhJUykKK3sKKyAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKyAgIGludCBibG9ja1s1XTsKKyAgIGJsb2NrWzBdID0gMTQ4OyAvKiBXcml0ZSBzY3JlZW4gc3RhcnQgKi8KKyAgIGJsb2NrWzFdID0gMTQ5OyAvKiBEaXNwbGF5IHNjcmVlbiBzdGFydCAqLworICAgYmxvY2tbMl0gPSA0OyAgLyogWCBlaWcgZmFjdG9yICovCisgICBibG9ja1szXSA9IDU7ICAvKiBZIGVpZyBmYWN0b3IgKi8KKyAgIGJsb2NrWzRdID0gLTE7ICAvKiBFbmQgb2YgbGlzdCBvZiB2YXJpYWJsZXMgdG8gcmVxdWVzdCAqLworCisgICByZWdzLnJbMF0gPSAoaW50KWJsb2NrOworICAgcmVncy5yWzFdID0gKGludClibG9jazsKKyAgIF9rZXJuZWxfc3dpKE9TX1JlYWRWZHVWYXJpYWJsZXMsICZyZWdzLCAmcmVncyk7CisKKyAgIHRoaXMtPmhpZGRlbi0+YmFua1swXSA9ICh2b2lkICopYmxvY2tbMF07CisgICB0aGlzLT5oaWRkZW4tPmJhbmtbMV0gPSAodm9pZCAqKWJsb2NrWzFdOworICAgdGhpcy0+aGlkZGVuLT54ZWlnID0gYmxvY2tbMl07CisgICB0aGlzLT5oaWRkZW4tPnllaWcgPSBibG9ja1szXTsKK30KKworLyogVG9nZ2xlIHRvIGZ1bGwgc2NyZWVuIG1vZGUgZnJvbSB0aGUgV0lNUCAqLworCitpbnQgRlVMTFNDUkVFTl9Ub2dnbGVGcm9tV2ltcChfVEhJUykKK3sKKyAgIGludCB3aWR0aCA9IHRoaXMtPnNjcmVlbi0+dzsKKyAgIGludCBoZWlnaHQgPSB0aGlzLT5zY3JlZW4tPmg7CisgICBpbnQgYnBwID0gdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKKworICAgUklTQ09TX1N0b3JlV2ltcE1vZGUoKTsKKyAgIGlmIChGVUxMU0NSRUVOX1NldE1vZGUod2lkdGgsIGhlaWdodCwgYnBwKSkKKyAgIHsKKyAgICAgICBjaGFyICpidWZmZXIgPSB0aGlzLT5oaWRkZW4tPmFsbG9jX2Jhbms7IC8qIFRoaXMgaXMgc3RhcnQgb2Ygc3ByaXRlIGRhdGEgKi8KKyAgICAgICAvKiBTdXBwb3J0IGJhY2sgYnVmZmVyIG1vZGUgb25seSAqLworICAgICAgIGlmIChyaXNjb3NfYmFja2J1ZmZlciA9PSAwKSByaXNjb3NfYmFja2J1ZmZlciA9IDE7CisKKyAgICAgICBGVUxMU0NSRUVOX1NldHVwQmFua3ModGhpcyk7CisKKyAgICAgICB0aGlzLT5oaWRkZW4tPmJhbmtbMF0gPSBidWZmZXIgKyA2MDsgLyogU3RhcnQgb2Ygc3ByaXRlIGRhdGEgKi8KKyAgICAgICBpZiAoYnBwID09IDgpIHRoaXMtPmhpZGRlbi0+YmFua1swXSArPSAyMDQ4OyAvKiA4YnBwIHNwcml0ZSBoYXZlIHBhbGV0dGUgZmlyc3QgKi8KKworCSAgIHRoaXMtPmhpZGRlbi0+Y3VycmVudF9iYW5rID0gMDsKKwkgICB0aGlzLT5zY3JlZW4tPnBpeGVscyA9IHRoaXMtPmhpZGRlbi0+YmFua1swXTsKKworICAgICAgIC8qIENvcHkgYmFjayBidWZmZXIgdG8gc2NyZWVuIG1lbW9yeSAqLworICAgICAgIFNETF9tZW1jcHkodGhpcy0+aGlkZGVuLT5iYW5rWzFdLCB0aGlzLT5oaWRkZW4tPmJhbmtbMF0sIHdpZHRoICogaGVpZ2h0ICogdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpOworCisgICAgICAgRlVMTFNDUkVFTl9TZXREZXZpY2VNb2RlKHRoaXMpOworICAgICAgIHJldHVybiAxOworICAgfSBlbHNlCisgICAgICBSSVNDT1NfUmVzdG9yZVdpbXBNb2RlKCk7CisKKyAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc2V2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc2V2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODc1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zZXZlbnRzLmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorICAgICBGaWxlIGFkZGVkIGJ5IEFsYW4gQnVja2xleSAoYWxhbl9iYWFAaG90bWFpbC5jb20pIGZvciBSSVNDIE9TIGNvbXBhdGFiaWxpdHkKKwkgMjcgTWFyY2ggMjAwMworCisgICAgIEltcGxlbWVudHMga2V5Ym9hcmQgc2V0dXAsIGV2ZW50IHB1bXAgYW5kIGtleWJvYXJkIGFuZCBtb3VzZSBwb2xsaW5nCisqLworCisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICIuLi8uLi90aW1lci9TRExfdGltZXJfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIi4uL1NETF9jdXJzb3JfYy5oIgorI2luY2x1ZGUgIlNETF9yaXNjb3N2aWRlby5oIgorI2luY2x1ZGUgIlNETF9yaXNjb3NldmVudHNfYy5oIgorCisjaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAic3RkbGliLmgiCisjaW5jbHVkZSAiY3R5cGUuaCIKKworI2luY2x1ZGUgImtlcm5lbC5oIgorI2luY2x1ZGUgInN3aXMuaCIKKworLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gYSBSSVNDIE9TIGludGVybmFsIGtleSBudW1iZXJzIHRvIGEgU0RMIGtleXN5bSAqLworc3RhdGljIFNETEtleSBST19rZXltYXBbU0RMS19MQVNUXTsKKworLyogUklTQyBPUyBLZXkgY29kZXMgKi8KKyNkZWZpbmUgUk9LRVlfU0hJRlQgMAorI2RlZmluZSBST0tFWV9DVFJMICAxCisjZGVmaW5lIFJPS0VZX0FMVCAgIDIKKy8qIExlZnQgc2hpZnQgaXMgZmlyc3Qga2V5IHdlIHdpbGwgY2hlY2sgZm9yICovCisjZGVmaW5lIFJPS0VZX0xFRlRfU0hJRlQgMworCisvKiBOZWVkIHRvIGlnbm9yZSBtb3VzZSBidXR0b25zIGFzIHRoZXkgYXJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5ICovCisjZGVmaW5lIFJPS0VZX0xFRlRfTU9VU0UgICA5CisjZGVmaW5lIFJPS0VZX0NFTlRSRV9NT1VTRSAxMAorI2RlZmluZSBST0tFWV9SSUdIVF9NT1VTRSAgMTEKKworLyogTm8ga2V5IGhhcyBiZWVuIHByZXNzZWQgcmV0dXJuIHZhbHVlKi8KKyNkZWZpbmUgUk9LRVlfTk9ORSAyNTUKKworLyogSWQgb2YgbGFzdCBrZXkgaW4ga2V5Ym9hcmQgKi8KKyNkZWZpbmUgUk9LRVlfTEFTVF9LRVkgIDEyNAorCisvKiBTaXplIG9mIGFycmF5IGZvciBhbGwga2V5cyAqLworI2RlZmluZSBST0tFWUJEX0FSUkFZU0laRSAxMjUKKworc3RhdGljIGNoYXIgUk9fcHJlc3NlZFtST0tFWUJEX0FSUkFZU0laRV07CisKK3N0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoaW50IGludGtleSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgcHJlc3NlZCk7CisKK3ZvaWQgUklTQ09TX1BvbGxNb3VzZShfVEhJUyk7Cit2b2lkIFJJU0NPU19Qb2xsS2V5Ym9hcmQoKTsKKwordm9pZCBSSVNDT1NfUG9sbE1vdXNlSGVscGVyKF9USElTLCBpbnQgZnVsbHNjcmVlbik7CisKKyNpZiBTRExfVEhSRUFEU19ESVNBQkxFRAorZXh0ZXJuIHZvaWQgRFJlbmRlcmVyX0ZpbGxCdWZmZXJzKCk7CisKKy8qIFRpbWVyIHJ1bm5pbmcgZnVuY3Rpb24gKi8KK2V4dGVybiB2b2lkIFJJU0NPU19DaGVja1RpbWVyKCk7CisKKyNlbmRpZgorCit2b2lkIEZVTExTQ1JFRU5fUHVtcEV2ZW50cyhfVEhJUykKK3sKKyAgICAvKiBDdXJyZW50IGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGtleWJvYXJkIGFuZCBtb3VzZSBwb2xsaW5nICovCisJUklTQ09TX1BvbGxLZXlib2FyZCgpOworCVJJU0NPU19Qb2xsTW91c2UodGhpcyk7CisjaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKKy8vCURSZW5kZXJlcl9GaWxsQnVmZmVycygpOworCWlmIChTRExfdGltZXJfcnVubmluZykgUklTQ09TX0NoZWNrVGltZXIoKTsKKyNlbmRpZgorfQorCisKK3ZvaWQgUklTQ09TX0luaXRPU0tleW1hcChfVEhJUykKK3sKKwlpbnQgaTsKKworCS8qIE1hcCB0aGUgVksga2V5c3ltcyAqLworCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKFJPX2tleW1hcCk7ICsraSApCisJCVJPX2tleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKKworICBST19rZXltYXBbM10gPSBTRExLX0xTSElGVDsKKyAgUk9fa2V5bWFwWzRdID0gU0RMS19MQ1RSTDsKKyAgUk9fa2V5bWFwWzVdID0gU0RMS19MQUxUOworICBST19rZXltYXBbNl0gPSBTRExLX1JTSElGVDsKKyAgUk9fa2V5bWFwWzddID0gU0RMS19SQ1RSTDsKKyAgUk9fa2V5bWFwWzhdID0gU0RMS19SQUxUOworICBST19rZXltYXBbMTZdID0gU0RMS19xOworICBST19rZXltYXBbMTddID0gU0RMS18zOworICBST19rZXltYXBbMThdID0gU0RMS180OworICBST19rZXltYXBbMTldID0gU0RMS181OworICBST19rZXltYXBbMjBdID0gU0RMS19GNDsKKyAgUk9fa2V5bWFwWzIxXSA9IFNETEtfODsKKyAgUk9fa2V5bWFwWzIyXSA9IFNETEtfRjc7CisgIFJPX2tleW1hcFsyM10gPSBTRExLX01JTlVTLAorICBST19rZXltYXBbMjVdID0gU0RMS19MRUZUOworICBST19rZXltYXBbMjZdID0gU0RMS19LUDY7CisgIFJPX2tleW1hcFsyN10gPSBTRExLX0tQNzsKKyAgUk9fa2V5bWFwWzI4XSA9IFNETEtfRjExOworICBST19rZXltYXBbMjldID0gU0RMS19GMTI7CisgIFJPX2tleW1hcFszMF0gPSBTRExLX0YxMDsKKyAgUk9fa2V5bWFwWzMxXSA9IFNETEtfU0NST0xMT0NLOworICBST19rZXltYXBbMzJdID0gU0RMS19QUklOVDsKKyAgUk9fa2V5bWFwWzMzXSA9IFNETEtfdzsKKyAgUk9fa2V5bWFwWzM0XSA9IFNETEtfZTsKKyAgUk9fa2V5bWFwWzM1XSA9IFNETEtfdDsKKyAgUk9fa2V5bWFwWzM2XSA9IFNETEtfNzsKKyAgUk9fa2V5bWFwWzM3XSA9IFNETEtfaTsKKyAgUk9fa2V5bWFwWzM4XSA9IFNETEtfOTsKKyAgUk9fa2V5bWFwWzM5XSA9IFNETEtfMDsKKyAgUk9fa2V5bWFwWzQxXSA9IFNETEtfRE9XTjsKKyAgUk9fa2V5bWFwWzQyXSA9IFNETEtfS1A4OworICBST19rZXltYXBbNDNdID0gU0RMS19LUDk7CisgIFJPX2tleW1hcFs0NF0gPSBTRExLX0JSRUFLOworICBST19rZXltYXBbNDVdID0gU0RMS19CQUNLUVVPVEU7CisvKiAgUk9fa2V5bWFwWzQ2XSA9IFNETEtfY3VycmVuY3k7IFRPRE86IEZpZ3VyZSBvdXQgaWYgdGhpcyBoYXMgYSB2YWx1ZSAqLworICBST19rZXltYXBbNDddID0gU0RMS19CQUNLU1BBQ0U7CisgIFJPX2tleW1hcFs0OF0gPSBTRExLXzE7CisgIFJPX2tleW1hcFs0OV0gPSBTRExLXzI7CisgIFJPX2tleW1hcFs1MF0gPSBTRExLX2Q7CisgIFJPX2tleW1hcFs1MV0gPSBTRExLX3I7CisgIFJPX2tleW1hcFs1Ml0gPSBTRExLXzY7CisgIFJPX2tleW1hcFs1M10gPSBTRExLX3U7CisgIFJPX2tleW1hcFs1NF0gPSBTRExLX287CisgIFJPX2tleW1hcFs1NV0gPSBTRExLX3A7CisgIFJPX2tleW1hcFs1Nl0gPSBTRExLX0xFRlRCUkFDS0VUOworICBST19rZXltYXBbNTddID0gU0RMS19VUDsKKyAgUk9fa2V5bWFwWzU4XSA9IFNETEtfS1BfUExVUzsKKyAgUk9fa2V5bWFwWzU5XSA9IFNETEtfS1BfTUlOVVM7CisgIFJPX2tleW1hcFs2MF0gPSBTRExLX0tQX0VOVEVSOworICBST19rZXltYXBbNjFdID0gU0RMS19JTlNFUlQ7CisgIFJPX2tleW1hcFs2Ml0gPSBTRExLX0hPTUU7CisgIFJPX2tleW1hcFs2M10gPSBTRExLX1BBR0VVUDsKKyAgUk9fa2V5bWFwWzY0XSA9IFNETEtfQ0FQU0xPQ0s7CisgIFJPX2tleW1hcFs2NV0gPSBTRExLX2E7CisgIFJPX2tleW1hcFs2Nl0gPSBTRExLX3g7CisgIFJPX2tleW1hcFs2N10gPSBTRExLX2Y7CisgIFJPX2tleW1hcFs2OF0gPSBTRExLX3k7CisgIFJPX2tleW1hcFs2OV0gPSBTRExLX2o7CisgIFJPX2tleW1hcFs3MF0gPSBTRExLX2s7CisgIFJPX2tleW1hcFs3Ml0gPSBTRExLX1NFTUlDT0xPTjsKKyAgUk9fa2V5bWFwWzczXSA9IFNETEtfUkVUVVJOOworICBST19rZXltYXBbNzRdID0gU0RMS19LUF9ESVZJREU7CisgIFJPX2tleW1hcFs3Nl0gPSBTRExLX0tQX1BFUklPRDsKKyAgUk9fa2V5bWFwWzc3XSA9IFNETEtfTlVNTE9DSzsKKyAgUk9fa2V5bWFwWzc4XSA9IFNETEtfUEFHRURPV047CisgIFJPX2tleW1hcFs3OV0gPSBTRExLX1FVT1RFOworICBST19rZXltYXBbODFdID0gU0RMS19zOworICBST19rZXltYXBbODJdID0gU0RMS19jOworICBST19rZXltYXBbODNdID0gU0RMS19nOworICBST19rZXltYXBbODRdID0gU0RMS19oOworICBST19rZXltYXBbODVdID0gU0RMS19uOworICBST19rZXltYXBbODZdID0gU0RMS19sOworICBST19rZXltYXBbODddID0gU0RMS19TRU1JQ09MT047CisgIFJPX2tleW1hcFs4OF0gPSBTRExLX1JJR0hUQlJBQ0tFVDsKKyAgUk9fa2V5bWFwWzg5XSA9IFNETEtfREVMRVRFOworICBST19rZXltYXBbOTBdID0gU0RMS19LUF9NSU5VUzsKKyAgUk9fa2V5bWFwWzkxXSA9IFNETEtfS1BfTVVMVElQTFk7CisgIFJPX2tleW1hcFs5M10gPSBTRExLX0VRVUFMUzsKKyAgUk9fa2V5bWFwWzk0XSA9IFNETEtfQkFDS1NMQVNIOworICBST19rZXltYXBbOTZdID0gU0RMS19UQUI7CisgIFJPX2tleW1hcFs5N10gPSBTRExLX3o7CisgIFJPX2tleW1hcFs5OF0gPSBTRExLX1NQQUNFOworICBST19rZXltYXBbOTldID0gU0RMS192OworICBST19rZXltYXBbMTAwXSA9IFNETEtfYjsKKyAgUk9fa2V5bWFwWzEwMV0gPSBTRExLX207CisgIFJPX2tleW1hcFsxMDJdID0gU0RMS19DT01NQTsKKyAgUk9fa2V5bWFwWzEwM10gPSBTRExLX1BFUklPRDsKKyAgUk9fa2V5bWFwWzEwNF0gPSBTRExLX1NMQVNIOworICBST19rZXltYXBbMTA1XSA9IFNETEtfRU5EOworICBST19rZXltYXBbMTA2XSA9IFNETEtfS1AwOworICBST19rZXltYXBbMTA3XSA9IFNETEtfS1AxOworICBST19rZXltYXBbMTA4XSA9IFNETEtfS1AzOworICBST19rZXltYXBbMTEyXSA9IFNETEtfRVNDQVBFOworICBST19rZXltYXBbMTEzXSA9IFNETEtfRjE7CisgIFJPX2tleW1hcFsxMTRdID0gU0RMS19GMjsKKyAgUk9fa2V5bWFwWzExNV0gPSBTRExLX0YzOworICBST19rZXltYXBbMTE2XSA9IFNETEtfRjU7CisgIFJPX2tleW1hcFsxMTddID0gU0RMS19GNjsKKyAgUk9fa2V5bWFwWzExOF0gPSBTRExLX0Y4OworICBST19rZXltYXBbMTE5XSA9IFNETEtfRjk7CisgIFJPX2tleW1hcFsxMjBdID0gU0RMS19IQVNIOworICBST19rZXltYXBbMTIxXSA9IFNETEtfUklHSFQ7CisgIFJPX2tleW1hcFsxMjJdID0gU0RMS19LUDQ7CisgIFJPX2tleW1hcFsxMjNdID0gU0RMS19LUDU7CisgIFJPX2tleW1hcFsxMjRdID0gU0RMS19LUDI7CisKKyAgU0RMX21lbXNldChST19wcmVzc2VkLCAwLCBST0tFWUJEX0FSUkFZU0laRSk7Cit9CisKKworLyogVmFyaWFibGUgZm9yIG1vdXNlIHJlbGF0aXZlIHByb2Nlc3NpbmcgKi8KK2ludCBtb3VzZV9yZWxhdGl2ZSA9IDA7CisKKy8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGVudGVyIG9yIGxlYXZlIG1vdXNlIHJlbGF0aXZlIG1vZGUgKi8KKwordm9pZCBSSVNDT1NfQ2hlY2tNb3VzZU1vZGUoX1RISVMpCit7CisgICAgLyogSWYgdGhlIG1vdXNlIGlzIGhpZGRlbiBhbmQgaW5wdXQgaXMgZ3JhYmJlZCwgd2UgdXNlIHJlbGF0aXZlIG1vZGUgKi8KKyAgICBpZiAoICEoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICYmCisgICAgICAgICh0aGlzLT5pbnB1dF9ncmFiICE9IFNETF9HUkFCX09GRikgKSB7CisgICAgICAgICAgICBtb3VzZV9yZWxhdGl2ZSA9IDE7CisgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtb3VzZV9yZWxhdGl2ZSA9IDA7CisgICAgIH0KK30KKworCit2b2lkIFJJU0NPU19Qb2xsTW91c2UoX1RISVMpCit7CisgICBSSVNDT1NfUG9sbE1vdXNlSGVscGVyKHRoaXMsIDEpOworfQorCitleHRlcm4gaW50IG1vdXNlSW5XaW5kb3c7CisKK3ZvaWQgV0lNUF9Qb2xsTW91c2UoX1RISVMpCit7CisgICAvKiBPbmx5IHBvbGwgd2hlbiBtb3VzZSBpcyBvdmVyIHRoZSB3aW5kb3cgKi8KKyAgIGlmICghbW91c2VJbldpbmRvdykgcmV0dXJuOworCisgICBSSVNDT1NfUG9sbE1vdXNlSGVscGVyKHRoaXMsIDApOworfQorCisvKiBTdGF0aWMgdmFyaWFibGVzIHNvIG9ubHkgY2hhbmdlcyBhcmUgcmVwb3J0ZWQgKi8KK3N0YXRpYyBTaW50MTYgbGFzdF94ID0gLTEsIGxhc3RfeSA9IC0xOworc3RhdGljIGludCBsYXN0X2J1dHRvbnMgPSAwOworCisvKiBTaGFyZSByb3V0aW5lIGJldHdlZW4gV0lNUCBhbmQgRlVMTFNDUkVFTiBmb3IgcG9sbGluZyBtb3VzZSBhbmQKKyAgIHBhc3Npbmcgb24gZXZlbnRzICovCit2b2lkIFJJU0NPU19Qb2xsTW91c2VIZWxwZXIoX1RISVMsIGludCBmdWxsc2NyZWVuKQoreworICAgIF9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKyAgICBzdGF0aWMgaW50IHN0YXJ0aW5nID0gMTsKKworICAgIGlmIChfa2VybmVsX3N3aShPU19Nb3VzZSwgJnJlZ3MsICZyZWdzKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICBTaW50MTYgbmV3X3ggPSByZWdzLnJbMF07IC8qIEluaXRpYWx5IGdldCBhcyBPUyB1bml0cyAqLworICAgICAgIFNpbnQxNiBuZXdfeSA9IHJlZ3MuclsxXTsKKworICAgICAgIC8qIERpc2NhcmQgbW91c2UgZXZlbnRzIHVudGlsIHRoZXkgbGV0IGdvIG9mIHRoZSBtb3VzZSBhZnRlciBzdGFydGluZyAqLworICAgICAgIGlmIChzdGFydGluZyAmJiByZWdzLnJbMl0gIT0gMCkKKyAgICAgICAgIHJldHVybjsKKyAgICAgICBlbHNlCisgICAgICAgICBzdGFydGluZyA9IDA7CisKKyAgICAgICBpZiAobmV3X3ggIT0gbGFzdF94IHx8IG5ld195ICE9IGxhc3RfeSB8fCBsYXN0X2J1dHRvbnMgIT0gcmVncy5yWzJdKQorICAgICAgIHsKKyAgICAgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZCBzbyBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBldmVudHMgKi8KKyAgICAgICAgICBpbnQgdG9wTGVmdFgsIHRvcExlZnRZOyAgLyogVG9wIGxlZnQgT1MgdW5pdHMgKi8KKyAgICAgICAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAgLyogTW91c2UgcG9zaXRpb24gaW4gU0RMIHBpeGVscyAqLworCisgICAgICAgICAgaWYgKGZ1bGxzY3JlZW4pCisgICAgICAgICAgeworICAgICAgICAgICAgIHRvcExlZnRYID0gMDsKKyAgICAgICAgICAgICB0b3BMZWZ0WSA9ICh0aGlzLT5oaWRkZW4tPmhlaWdodCA8PCB0aGlzLT5oaWRkZW4tPnllaWcpIC0gMTsKKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAgaW50IHdpbmRvd19zdGF0ZVs5XTsKKworCSAgICAgICAgIC8qIEdldCBjdXJyZW50IHdpbmRvdyBzdGF0ZSAqLworCQkgICAgIHdpbmRvd19zdGF0ZVswXSA9IHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZTsKKwkJICAgICByZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KXdpbmRvd19zdGF0ZTsKKwkJICAgICBfa2VybmVsX3N3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAmcmVncywgJnJlZ3MpOworCisgICAgICAgICAgICAgdG9wTGVmdFggPSB3aW5kb3dfc3RhdGVbMV07CisgICAgICAgICAgICAgdG9wTGVmdFkgPSB3aW5kb3dfc3RhdGVbNF07CisgICAgICAgICAgfQorCisJCSAgLyogQ29udmVydCBjby1vcmRpbmF0ZXMgdG8gd29ya3NwYWNlICovCisJCSAgeCA9IG5ld194IC0gdG9wTGVmdFg7CisgICAgICAgICAgeSA9IHRvcExlZnRZIC0gbmV3X3k7IC8qIFkgZ29lcyBmcm9tIHRvcCBvZiB3aW5kb3cvc2NyZWVuICovCisKKwkgCSAgLyogQ29udmVydCBPUyB1bml0cyB0byBwaXhlbHMgKi8KKwkgICAgICB4ID4+PSB0aGlzLT5oaWRkZW4tPnhlaWc7CisJCSAgeSA+Pj0gdGhpcy0+aGlkZGVuLT55ZWlnOworCisgICAgICAgICAgaWYgKGxhc3RfeCAhPSBuZXdfeCB8fCBsYXN0X3kgIT0gbmV3X3kpCisgICAgICAgICAgeworICAgICAgICAgICAgIGlmIChtb3VzZV9yZWxhdGl2ZSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNlbnRyZV94ID0gU0RMX1ZpZGVvU3VyZmFjZS0+dy8yOworICAgICAgICAgICAgICAgIGludCBjZW50cmVfeSA9IFNETF9WaWRlb1N1cmZhY2UtPmgvMjsKKworICAgICAgICAgICAgICAgIGlmIChjZW50cmVfeCAhPSB4IHx8IGNlbnRyZV95ICE9IHkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGlmIChTRExfVmlkZW9TdXJmYWNlKSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsMSx4IC0gY2VudHJlX3gsIHkgLSBjZW50cmVfeSk7CisgICAgICAgICAgICAgICAgICAgbGFzdF94ID0gdG9wTGVmdFggKyAoY2VudHJlX3ggPDwgdGhpcy0+aGlkZGVuLT54ZWlnKTsKKyAgICAgICAgICAgICAgICAgICBsYXN0X3kgPSB0b3BMZWZ0WSAtIChjZW50cmVfeSA8PCB0aGlzLT5oaWRkZW4tPnllaWcpOworCisgICAgICAgICAgICAgICAgICAgLyogUmUtY2VudHJlIHRoZSBtb3VzZSBwb2ludGVyLCBzbyB3ZSBzdGlsbCBnZXQgcmVsYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICBtb3ZlbWVudCB3aGVuIHRoZSBtb3VzZSBpcyBhdCB0aGUgZWRnZSBvZiB0aGUgd2luZG93CisgICAgICAgICAgICAgICAgICAgICAgb3Igc2NyZWVuLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYmxvY2tbNV07CisKKyAgICAgICAgICAgICAgICAgICAgICBibG9ja1swXSA9IDM7IC8qIE9TV09SRCBtb3ZlIHBvaW50ZXIgc3ViLXJlYXNvbiBjb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbMV0gPSBsYXN0X3ggJiAweEZGOworICAgICAgICAgICAgICAgICAgICAgIGJsb2NrWzJdID0gKGxhc3RfeCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbM10gPSBsYXN0X3kgJiAweEZGOworICAgICAgICAgICAgICAgICAgICAgIGJsb2NrWzRdID0gKGxhc3RfeSA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIHJlZ3MuclswXSA9IDIxOyAvKiBPU1dPUkQgcG9pbnRlciBzdHVmZiBjb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgcmVncy5yWzFdID0gKGludClibG9jazsKKyAgICAgICAgICAgICAgICAgICAgICBfa2VybmVsX3N3aShPU19Xb3JkLCAmcmVncywgJnJlZ3MpOworICAgICAgICAgICAgICAgCSAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxhc3RfeCA9IG5ld194OworICAgICAgICAgICAgICAgIGxhc3RfeSA9IG5ld195OworICAgICAgICAgICAgICAgIFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwwLHgseSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYXN0X2J1dHRvbnMgIT0gcmVncy5yWzJdKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBpbnQgY2hhbmdlZCA9IGxhc3RfYnV0dG9ucyBeIHJlZ3MuclsyXTsKKyAgICAgICAgICAgICBsYXN0X2J1dHRvbnMgPSByZWdzLnJbMl07CisgICAgICAgICAgICAgaWYgKGNoYW5nZWQgJiA0KSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKChsYXN0X2J1dHRvbnMgJiA0KSA/IFNETF9QUkVTU0VEIDogU0RMX1JFTEVBU0VELCBTRExfQlVUVE9OX0xFRlQsIDAsIDApOworICAgICAgICAgICAgIGlmIChjaGFuZ2VkICYgMikgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigobGFzdF9idXR0b25zICYgMikgPyBTRExfUFJFU1NFRCA6IFNETF9SRUxFQVNFRCwgU0RMX0JVVFRPTl9NSURETEUsIDAsIDApOworICAgICAgICAgICAgIGlmIChjaGFuZ2VkICYgMSkgU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigobGFzdF9idXR0b25zICYgMSkgPyBTRExfUFJFU1NFRCA6IFNETF9SRUxFQVNFRCwgU0RMX0JVVFRPTl9SSUdIVCwgMCwgMCk7CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUklTQ09TX1BvbGxLZXlib2FyZCgpCit7CisJaW50IHdoaWNoX2tleSA9IFJPS0VZX0xFRlRfU0hJRlQ7CisJaW50IGo7CisJaW50IG1pbl9rZXksIG1heF9rZXk7CisJU0RMX2tleXN5bSBrZXk7CisKKwkvKiBTY2FuIHRoZSBrZXlib2FyZCB0byBzZWUgd2hhdCBpcyBwcmVzc2VkICovCisJd2hpbGUgKHdoaWNoX2tleSA8PSBST0tFWV9MQVNUX0tFWSkKKwl7CisJCXdoaWNoX2tleSA9IChfa2VybmVsX29zYnl0ZSgxMjEsIHdoaWNoX2tleSwgMCkgJiAweEZGKTsKKwkgICAgaWYgKHdoaWNoX2tleSAhPSBST0tFWV9OT05FKQorCSAgICB7CisJCSAgICBzd2l0Y2god2hpY2hfa2V5KQorCQkgICAgeworCQkgICAgLyogU2tpcCBvdmVyIG1vdXNlIGtleXMgKi8KKwkJICAgIGNhc2UgUk9LRVlfTEVGVF9NT1VTRToKKwkJICAgIGNhc2UgUk9LRVlfQ0VOVFJFX01PVVNFOgorCQkgICAgY2FzZSBST0tFWV9SSUdIVF9NT1VTRToKKwkJCQl3aGljaF9rZXkgPSBST0tFWV9SSUdIVF9NT1VTRTsKKwkJCQlicmVhazsKKworICAgICAgICAgICAgLyogSWdub3JlIGtleXMgdGhhdCBjYXVzZSAyIGludGVybmFsIG51bWJlciB0byBiZSBnZW5lcmF0ZWQgKi8KKwkJCWNhc2UgNzE6IGNhc2UgMjQ6IGNhc2UgODc6IGNhc2UgNDA6CisJCQkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIElnbm9yZSBicmVhayBhcyBpdCBjYW4gYmUgbGF0Y2hlZCBvbiAqLworICAgICAgICAgICAgY2FzZSA0NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlST19wcmVzc2VkW3doaWNoX2tleV0gKz0gMjsKKwkJCQlicmVhazsKKwkJICAgIH0KKwkJCXdoaWNoX2tleSsrOworCQl9CisJfQorCisJLyogR2VuZXJhdGUga2V5IHJlbGVhc2VkIG1lc3NhZ2VzICovCisJbWluX2tleSA9IFJPS0VZX0xBU1RfS0VZKzE7CisJbWF4X2tleSA9IFJPS0VZX0xFRlRfU0hJRlQ7CisKKwlmb3IgKGogPSBST0tFWV9MRUZUX1NISUZUOyBqIDw9IFJPS0VZX0xBU1RfS0VZOyBqKyspCisJeworCQlpZiAoUk9fcHJlc3NlZFtqXSkKKwkJeworCQkJaWYgKFJPX3ByZXNzZWRbal0gPT0gMSkKKwkJCXsKKwkJCQlST19wcmVzc2VkW2pdID0gMDsKKwkJCQlTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwgVHJhbnNsYXRlS2V5KGosJmtleSwwKSk7CisJCQl9IGVsc2UgCisJCQl7CisJCQkJaWYgKGogPCBtaW5fa2V5KSBtaW5fa2V5ID0gajsKKwkJCQlpZiAoaiA+IG1heF9rZXkpIG1heF9rZXkgPSBqOworCQkJfQorCQl9CisJfQorCisJLyogR2VuZXJhdGUga2V5IHByZXNzZWQgbWVzc2FnZXMgKi8KKwlmb3IgKGogPSBtaW5fa2V5OyBqIDw9IG1heF9rZXk7IGorKykKKwl7CisJCWlmIChST19wcmVzc2VkW2pdKQorCQl7CisJCQlpZiAoUk9fcHJlc3NlZFtqXSA9PSAyKQorCQkJeworCQkJCVNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsVHJhbnNsYXRlS2V5KGosJmtleSwxKSk7CisJCQl9CisJCQlST19wcmVzc2VkW2pdID0gMTsKKwkJfQorCX0KK30KKworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgaW50a2V5LCBTRExfa2V5c3ltICprZXlzeW0sIGludCBwcmVzc2VkKQoreworCS8qIFNldCB0aGUga2V5c3ltIGluZm9ybWF0aW9uICovCisJa2V5c3ltLT5zY2FuY29kZSA9ICh1bnNpZ25lZCBjaGFyKSBpbnRrZXk7CisJa2V5c3ltLT5zeW0gPSBST19rZXltYXBbaW50a2V5XTsKKwlrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKKwlrZXlzeW0tPnVuaWNvZGUgPSAwOworCWlmICggcHJlc3NlZCAmJiBTRExfVHJhbnNsYXRlVU5JQ09ERSApCisJeworCQlpbnQgc3RhdGU7CisJCWludCBjaDsKKworCQlzdGF0ZSA9IChfa2VybmVsX29zYnl0ZSgyMDIsIDAsIDI1NSkgJiAweEZGKTsKKworCQkvKlRPRE86IFRha2UgaW50byBhY2NvdW50IG90aGVyIGtleWJvYXJkIGxheW91dHMgKi8KKworCQljaCA9IGtleXN5bS0+c3ltOyAvKiBUaGlzIHNob3VsZCBoYW5kbGUgbW9zdCB1bnNoaWZ0ZWQga2V5cyAqLworCisgICAgICAgIGlmIChpbnRrZXkgPCA5IHx8IGNoID09IFNETEtfVU5LTk9XTikKKyAgICAgICAgeworICAgICAgICAgICBjaCA9IDA7CisKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAmIDY0KSAvKiBDb250cm9sIG9uICovCisJCXsKKwkJCWNoID0gY2ggJiAzMTsKKworCQl9IGVsc2UgCisJCXsKKwkJCWludCB0b3BPZktleSA9IDA7CisgICAgICAgICAgICBpZiAoc3RhdGUgJiA4KSAvKiBTaGlmdCBvbiAqLworCQkJeworCQkJCXRvcE9mS2V5ID0gMTsKKwkJCX0KKworCQkJaWYgKChzdGF0ZSAmIDE2KSA9PSAwKSAvKiBDYXBzIGxvY2sgaXMgb24gKi8KKwkJCXsKKwkJCSAgIGlmIChjaCA+PSBTRExLX2EgJiYgY2ggPD0gU0RMS196KQorCQkJICAgeworIAkJCQkgIGlmICgoc3RhdGUgJiAxMjgpID09IDApIC8qIFNoaWZ0IEVuYWJsZSBvZmYgKi8KKwkJCQkgIHsKKwkJCQkgICAgIC8qIEFsbCBsZXR0ZXIgYmVjb21lIHVwcGVyIGNhc2UgKi8KKwkJCQkgCSB0b3BPZktleSA9IDE7CisJCQkJICB9IGVsc2UKKwkJCQkgIHsKKwkJCQkgICAgIC8qIFNoaWZ0K0xldHRlcnMgZ2l2ZXMgbG93ZXIgY2FzZSAqLworCQkJCSAgICAgdG9wT2ZLZXkgPSAxIC0gdG9wT2ZLZXk7CisJCQkJICB9CisJCSAgICAgICB9CisJCQl9CisKKwkJCWlmICh0b3BPZktleSkKKwkJCXsKKwkJCQkvKiBLZXkgcHJvZHVjZWQgd2l0aCBzaGlmdCBoZWxkIGRvd24gKi8KKworCQkJCS8qIExldHRlcnMganVzdCBnaXZlIHVwcGVyIGNhc2UgdmVyc2lvbiAqLworCQkJCWlmIChjaCA+PSBTRExLX2EgJiYgY2ggPD0gU0RMS196KSBjaCA9IHRvdXBwZXIoY2gpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXN3aXRjaChjaCkKKwkJCQkJeworCQkJCQljYXNlIFNETEtfSEFTSDogICBjaCA9ICd+JzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS19RVU9URTogIGNoID0gJ0AnOyBicmVhazsKKwkJCQkJY2FzZSBTRExLX0NPTU1BOiAgY2ggPSAnPCc7IGJyZWFrOworCQkJCQljYXNlIFNETEtfTUlOVVM6ICBjaCA9ICdfJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS19QRVJJT0Q6IGNoID0gJz4nOyBicmVhazsKKwkJCQkJY2FzZSBTRExLX1NMQVNIOiAgY2ggPSAnPyc7IGJyZWFrOworCisJCQkJCWNhc2UgU0RMS18wOiBjaCA9ICcpJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS18xOiBjaCA9ICchJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS18yOiBjaCA9ICciJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS18zOiBjaCA9ICejJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS180OiBjaCA9ICckJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS181OiBjaCA9ICclJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS182OiBjaCA9ICdeJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS183OiBjaCA9ICcmJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS184OiBjaCA9ICcqJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS185OiBjaCA9ICcoJzsgYnJlYWs7CisKKwkJCQkJY2FzZSBTRExLX1NFTUlDT0xPTjogICAgY2ggPSAnOic7IGJyZWFrOworCQkJCQljYXNlIFNETEtfRVFVQUxTOiAgICAgICBjaCA9ICcrJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS19MRUZUQlJBQ0tFVDogIGNoID0gJ3snOyBicmVhazsKKwkJCQkJY2FzZSBTRExLX0JBQ0tTTEFTSDogICAgY2ggPSAnfCc7IGJyZWFrOworCQkJCQljYXNlIFNETEtfUklHSFRCUkFDS0VUOiBjaCA9ICd9JzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS19CQUNLUVVPVEU6ICAgIGNoID0gJ6wnOyBicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJY2ggPSAwOyAvKiBNYXAgdG8gemVybyBjaGFyYWN0ZXIgaWYgd2UgZG9uJ3QgdW5kZXJzdGFuZCBpdCAqLworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoY2ggPiAxMjYpCisJCQl7CisJCQkJLyogU0RMIGtleSBjb2RlIDwgMTI2IG1hcCBkaXJlY3RseSBvbnRvIHRoZWlyIFVuaWNvZGUgZXF1aXZhbGVudHMgKi8KKwkJCQkvKiBLZXlwYWQgMCB0byA5IG1hcHMgdG8gbnVtZXJpYyBlcXVpdmFsZW50ICovCisJCQkJaWYgKGNoID49IFNETEtfS1AwICYmIGNoIDw9IFNETEtfS1A5KSBjaCA9IGNoIC0gU0RMS19LUDAgKyAnMCc7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogRm9sbG93aW5nIHN3aXRjaCBtYXBzIG90aGVyIGtleXMgdGhhdCBwcm9kdWNlIGFuIEFzY2lpIHZhbHVlICovCisJCQkJCXN3aXRjaChjaCkKKwkJCQkJeworCQkJCQljYXNlIFNETEtfS1BfUEVSSU9EOiAgIGNoID0gJy4nOyBicmVhazsKKwkJCQkJY2FzZSBTRExLX0tQX0RJVklERTogICBjaCA9ICcvJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS19LUF9NVUxUSVBMWTogY2ggPSAnKic7IGJyZWFrOworCQkJCQljYXNlIFNETEtfS1BfTUlOVVM6ICAgIGNoID0gJy0nOyBicmVhazsKKwkJCQkJY2FzZSBTRExLX0tQX1BMVVM6ICAgICBjaCA9ICcrJzsgYnJlYWs7CisJCQkJCWNhc2UgU0RMS19LUF9FUVVBTFM6ICAgY2ggPSAnPSc7IGJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQkvKiBJZiB3ZSBkb24ndCBrbm93IHdoYXQgaXQgaXMgc2V0IHRoZSBVbmljb2RlIHRvIDAgKi8KKwkJCQkJCWNoID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQkJCQorCQl9CisJCQkJCisJCWtleXN5bS0+dW5pY29kZSA9IGNoOworCX0KKwlyZXR1cm4oa2V5c3ltKTsKK30KKworLyogZW5kIG9mIFNETF9yaXNjb3NldmVudHMuYyAuLi4gKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODliM2MwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc2V2ZW50c19jLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfcmlzY29zdmlkZW8uaCIKKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAorICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQorKi8KK2V4dGVybiB2b2lkIFJJU0NPU19Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgRlVMTFNDUkVFTl9QdW1wRXZlbnRzKF9USElTKTsKK2V4dGVybiB2b2lkIFdJTVBfUHVtcEV2ZW50cyhfVEhJUyk7CisKKy8qIGVuZCBvZiBTRExfbnVsbGV2ZW50c19jLmggLi4uICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3Ntb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc21vdXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhMGJmZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3Ntb3VzZS5jCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAgICAgRmlsZSBhZGRlZCBieSBBbGFuIEJ1Y2tsZXkgKGFsYW5fYmFhQGhvdG1haWwuY29tKSBmb3IgUklTQyBPUyBjb21wYXRhYmlsaXR5CisJIDI3IE1hcmNoIDIwMDMKKworICAgICBJbXBsZW1lbnRzIG1vdXNlIGN1cnNvciBzaGFwZSBkZWZpbml0aW9ucyBhbmQgcG9zaXRpb25pbmcKKyovCisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisKKyNpbmNsdWRlICJTRExfcmlzY29zbW91c2VfYy5oIgorCisjaW5jbHVkZSAia2VybmVsLmgiCisjaW5jbHVkZSAic3dpcy5oIgorCitzdGF0aWMgV01jdXJzb3IgKmN1cnJlbnRfY3Vyc29yID0gTlVMTDsKK3N0YXRpYyBXTWN1cnNvciAqZGVmaW5lZF9jdXJzb3IgPSBOVUxMOworCitleHRlcm4gaW50IG1vdXNlSW5XaW5kb3c7CisKKy8qIEFyZWEgdG8gc2F2ZSBjdXJzb3IgcGFsZXR0ZSBjb2xvdXJzIGNoYW5nZWQgYnkgU0RMLgorICAgQWN0dWFsIHZhbHVlcyB3aWxsIGJlIHJlYWQgYmVmb3JlIHdlIGNoYW5nZSB0byB0aGUgU0RMIGN1cnNvciAqLworc3RhdGljIFVpbnQ4IHdpbXBfY3Vyc29yX3BhbGV0dGVbMl1bNV0gPSB7CisgIHsxLCAyNSwgMjU1LCAyNTUsIDI1NX0sCisgIHszLCAyNSwgMjU1LCAyNTUsIDI1NX0KK307CisKK3N0YXRpYyBpbnQgY3Vyc29yX3BhbGV0dGVfc2F2ZWQgPSAwOworCit2b2lkIFdJTVBfU2F2ZUN1cnNvclBhbGV0dGUoKTsKK3ZvaWQgV0lNUF9SZXN0b3JlV2ltcEN1cnNvcigpOwordm9pZCBXSU1QX1NldFNETEN1cnNvclBhbGV0dGUoKTsKKworCit2b2lkIFJJU0NPU19GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCit7CisgICAgU0RMX2ZyZWUoY3Vyc29yLT5kYXRhKTsKKwlTRExfZnJlZShjdXJzb3IpOworfQorCitXTWN1cnNvciAqUklTQ09TX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAorCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpCit7CisJV01jdXJzb3IgKmN1cnNvcjsKKwlVaW50OCAqY3Vyc29yX2RhdGE7CisJVWludDggKnB0cjsKKwlpbnQgaSxqLGs7CisJaW50IGRhdGFfYnl0ZSwgbWFza19ieXRlOworCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjdXJzb3Igc2l6ZSBpcyBva2F5ICovCisJaWYgKCAodyA+IDMyKSB8fCAoaCA+IDMyKSApIHsKKwkJU0RMX1NldEVycm9yKCJPbmx5IHdpdGggd2lkdGggYW5kIGhlaWdodCA8PSAzMiBwaXhlbHMgYXJlIGFsbG93ZWQiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBjdXJzb3IgKi8KKwljdXJzb3IgPSAoV01jdXJzb3IgKilTRExfbWFsbG9jKHNpemVvZigqY3Vyc29yKSk7CisJaWYgKCBjdXJzb3IgPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBOb3RlOiBTREwgc2F5cyB3aWR0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCAqLworCWN1cnNvcl9kYXRhID0gU0RMX21hbGxvYyh3LzQgKiBoKTsKKwlpZiAoY3Vyc29yX2RhdGEgPT0gTlVMTCkKKwl7CisJCVNETF9mcmVlKGN1cnNvcik7CisJCVNETF9TZXRFcnJvcigiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJY3Vyc29yLT53ID0gdzsKKwljdXJzb3ItPmggPSBoOworCWN1cnNvci0+aG90X3ggPSBob3RfeDsKKwljdXJzb3ItPmhvdF95ID0gaG90X3k7CisJY3Vyc29yLT5kYXRhID0gY3Vyc29yX2RhdGE7CisKKworLyogRGF0YSAvIE1hc2sgUmVzdWx0aW5nIHBpeGVsIG9uIHNjcmVlbiAKKyAgIDAgLyAxIFdoaXRlIAorICAgMSAvIDEgQmxhY2sgCisgICAwIC8gMCBUcmFuc3BhcmVudCAKKyAgIDEgLyAwIEludmVydGVkIGNvbG9yIGlmIHBvc3NpYmxlLCBibGFjayBpZiBub3QuIAorKi8KKwlwdHIgPSBjdXJzb3JfZGF0YTsKKworCWZvciAoIGk9MDsgaTxoOyArK2kgKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IHcvODsgKytqKQorCQl7CisJCQlkYXRhX2J5dGUgPSAqZGF0YTsKKwkJCW1hc2tfYnl0ZSA9ICptYXNrOworCQkJKnB0cisrID0gMDsgLyogU2V0cyB3aG9sZSBieXRlIHRyYW5zcGFyZW50ICovCisJCQkqcHRyID0gMDsKKwkJCWZvciAoayA9IDA7IGsgPCA4OyBrKyspCisJCQl7CisJCQkJKCpwdHIpIDw8PSAyOworCQkJCWlmIChkYXRhX2J5dGUgJiAxKSAqcHRyIHw9IDM7IC8qIEJsYWNrIG9yIGludmVydGVkICovCisJCQkJZWxzZSBpZihtYXNrX2J5dGUgJiAxKSAqcHRyIHw9IDE7IC8qIFdoaXRlICovCisJCQkJaWYgKChrJjMpID09IDMpIHB0ci0tOworCQkJCWRhdGFfYnl0ZSA+Pj0gMTsKKwkJCQltYXNrX2J5dGUgPj49IDE7CisJCQl9CisKKyAgICAgICAgICAgIHB0cis9MzsKKwkJICAgIGRhdGErKzsKKwkJICAgIG1hc2srKzsKKwkJfQorCX0KKworCXJldHVybihjdXJzb3IpOworfQorCitpbnQgUklTQ09TX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKK3sKKwljdXJyZW50X2N1cnNvciA9IGN1cnNvcjsKKworCWlmIChjdXJzb3IgPT0gTlVMTCkKKwl7CisJCV9rZXJuZWxfb3NieXRlKDEwNiwwLDApOworCQlkZWZpbmVkX2N1cnNvciA9IE5VTEw7CisJfSBlbHNlCisJeworICAgICAgICBXTWN1cnNvciAqb2xkX2N1cnNvciA9IGRlZmluZWRfY3Vyc29yOworCisJCWlmIChjdXJzb3IgIT0gZGVmaW5lZF9jdXJzb3IpCisJCXsKKwkJCVVpbnQ4IGN1cnNvcl9kZWZbMTBdOworCisJCQljdXJzb3JfZGVmWzBdID0gMDsKKwkJCWN1cnNvcl9kZWZbMV0gPSAyOyAvKiBVc2Ugc2hhcGUgbnVtYmVyIDIgKi8KKwkJCWN1cnNvcl9kZWZbMl0gPSBjdXJzb3ItPncvNDsgLyogV2lkdGggaW4gYnl0ZXMgKi8KKwkJCWN1cnNvcl9kZWZbM10gPSBjdXJzb3ItPmg7IC8qIEhlaWdodCAoaCkgaW4gcGl4ZWxzICovCisJCQljdXJzb3JfZGVmWzRdID0gY3Vyc29yLT5ob3RfeDsgLyogQWN0aXZlWCBpbiBwaXhlbHMgZnJvbSBsZWZ0ICovCisJCQljdXJzb3JfZGVmWzVdID0gY3Vyc29yLT5ob3RfeTsgLyogQWN0aXZlWSBpbiBwaXhlbHMgZnJvbSB0b3AgKi8KKwkJCWN1cnNvcl9kZWZbNl0gPSAoKGludCkoY3Vyc29yLT5kYXRhKSAmIDB4RkYpOyAgICAgICAvKiBMZWFzdCBzaWduaWZpY2FudCBieXRlIG9mIHBvaW50ZXIgdG8gZGF0YSAqLworCQkJY3Vyc29yX2RlZls3XSA9ICgoaW50KShjdXJzb3ItPmRhdGEpID4+IDgpICYgMHhGRjsgIC8qIC4uLiAqLworCQkJY3Vyc29yX2RlZls4XSA9ICgoaW50KShjdXJzb3ItPmRhdGEpID4+IDE2KSAmIDB4RkY7IC8qIC4uLiAqLworCQkJY3Vyc29yX2RlZls5XSA9ICgoaW50KShjdXJzb3ItPmRhdGEpID4+IDI0KSAmIDB4RkY7IC8qIE1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiBwb2ludGVyIHRvIGRhdGEgKi8KKworCQkJaWYgKF9rZXJuZWxfb3N3b3JkKDIxLCAoaW50ICopY3Vyc29yX2RlZikgIT0gMCkKKwkJCXsKKwkJCQlTRExfU2V0RXJyb3IoIlJJU0NPUyBjb3VsZG4ndCBjcmVhdGUgdGhlIGN1cnNvciB0byBzaG93Iik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJZGVmaW5lZF9jdXJzb3IgPSBjdXJzb3I7CisJCX0KKworICAgICAgICBpZiAob2xkX2N1cnNvciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdCB0aW1lIG9yIHJlc2hvdyBpbiB3aW5kb3csIHNvIHNhdmUvc2V0dXAgcGFsZXR0ZSAqLworICAgICAgICAgICAgaWYgKCFjdXJzb3JfcGFsZXR0ZV9zYXZlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXSU1QX1NhdmVDdXJzb3JQYWxldHRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBXSU1QX1NldFNETEN1cnNvclBhbGV0dGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIF9rZXJuZWxfb3NieXRlKDEwNiwgMiwgMCk7ICAgICAgICAKKwl9CisJCisJcmV0dXJuKDEpOworfQorCit2b2lkIEZVTExTQ1JFRU5fV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpCit7CisJVWludDggbW92ZV9ibG9ja1s1XTsKKwlpbnQgZWlnX2Jsb2NrWzNdOworCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKwlpbnQgb3NfeCwgb3NfeTsKKworCWVpZ19ibG9ja1swXSA9IDQ7ICAvKiBYIGVpZyBmYWN0b3IgKi8KKwllaWdfYmxvY2tbMV0gPSA1OyAgLyogWSBlaWcgZmFjdG9yICovCisJZWlnX2Jsb2NrWzJdID0gLTE7ICAvKiBFbmQgb2YgbGlzdCBvZiB2YXJpYWJsZXMgdG8gcmVxdWVzdCAqLworCisgICAgcmVncy5yWzBdID0gKGludCllaWdfYmxvY2s7CisgICAgcmVncy5yWzFdID0gKGludCllaWdfYmxvY2s7CisgICAgX2tlcm5lbF9zd2koT1NfUmVhZFZkdVZhcmlhYmxlcywgJnJlZ3MsICZyZWdzKTsKKworCW9zX3ggPSB4IDw8IGVpZ19ibG9ja1swXTsKKwlvc195ID0geSA8PCBlaWdfYmxvY2tbMV07CisKKwltb3ZlX2Jsb2NrWzBdID0gMzsgLyogTW92ZSBjdXJzb3IgKi8KKwltb3ZlX2Jsb2NrWzFdID0gb3NfeCAmIDB4RkY7CisJbW92ZV9ibG9ja1syXSA9IChvc194ID4+IDgpICYgMHhGRjsKKwltb3ZlX2Jsb2NrWzNdID0gb3NfeSAmIDB4RkY7CisJbW92ZV9ibG9ja1s0XSA9IChvc195ID4+IDgpICYgMHhGRjsKKworCV9rZXJuZWxfb3N3b3JkKDIxLCAoaW50ICopbW92ZV9ibG9jayk7CisJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCB4LCB5KTsKK30KKworCisvKiBSZXNob3cgY3Vyc29yIHdoZW4gbW91c2UgcmUtZW50ZXJzIHRoZSB3aW5kb3cgKi8KK3ZvaWQgV0lNUF9SZXNob3dDdXJzb3IoX1RISVMpCit7CisJZGVmaW5lZF9jdXJzb3IgPSBOVUxMOworICAgIGN1cnNvcl9wYWxldHRlX3NhdmVkID0gMDsKKwlSSVNDT1NfU2hvd1dNQ3Vyc29yKHRoaXMsIGN1cnJlbnRfY3Vyc29yKTsKK30KKwordm9pZCBXSU1QX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KQoreworCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKwlpbnQgd2luZG93X3N0YXRlWzldOworCWNoYXIgYmxvY2tbNV07CisJaW50IG9zWCwgb3NZOworCisJd2luZG93X3N0YXRlWzBdID0gdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlOworCXJlZ3MuclsxXSA9ICh1bnNpZ25lZCBpbnQpd2luZG93X3N0YXRlOworCV9rZXJuZWxfc3dpKFdpbXBfR2V0V2luZG93U3RhdGUsICZyZWdzLCAmcmVncyk7CisKKwkgb3NYID0gKHggPDwgdGhpcy0+aGlkZGVuLT54ZWlnKSArIHdpbmRvd19zdGF0ZVsxXTsKKwkgb3NZID0gd2luZG93X3N0YXRlWzRdIC0gKHkgPDwgdGhpcy0+aGlkZGVuLT55ZWlnKTsKKworCWJsb2NrWzBdID0gMzsKKwlibG9ja1sxXSA9IG9zWCAmIDB4RkY7CisJYmxvY2tbMl0gPSAob3NYID4+IDgpICYgMHhGRjsKKwlibG9ja1szXSA9IG9zWSAmIDB4RkY7CisJYmxvY2tbNF0gPSAob3NZID4+IDgpICYgMHhGRjsKKworCXJlZ3MuclswXSA9IDIxOworCXJlZ3MuclsxXSA9IChpbnQpYmxvY2s7CisJX2tlcm5lbF9zd2koT1NfV29yZCwgJnJlZ3MsICZyZWdzKTsKKwlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHgsIHkpOworfQorCitpbnQgV0lNUF9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCit7CisJaWYgKG1vdXNlSW5XaW5kb3cpIHJldHVybiBSSVNDT1NfU2hvd1dNQ3Vyc29yKHRoaXMsIGN1cnNvcik7CisJZWxzZSBjdXJyZW50X2N1cnNvciA9IGN1cnNvcjsKKworCXJldHVybiAxOworfQorCitTRExfR3JhYk1vZGUgUklTQ09TX0dyYWJJbnB1dChfVEhJUywgU0RMX0dyYWJNb2RlIG1vZGUpCit7CisgICAvKiBJbiBmdWxsc2NyZWVuIG1vZGUgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLworICAgaWYgKG1vZGUgPCBTRExfR1JBQl9GVUxMU0NSRUVOKQorICAgeworICAgICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOworICAgICAgdW5zaWduZWQgY2hhciBibG9ja1s5XTsKKyAgICAgIGJsb2NrWzBdID0gMTsgLyogRGVmaW5lIG1vdXNlIGN1cnNvciBib3VuZGluZyBibG9jayAqLworCisgICAgICBpZiAoIG1vZGUgPT0gU0RMX0dSQUJfT0ZGICkKKyAgICAgIHsKKyAgICAgICAgIC8qIENsaXAgdG8gd2hvbGUgc2NyZWVuICovCisKKyAgICAgICAgIGludCByID0gKHRoaXMtPmhpZGRlbi0+c2NyZWVuX3dpZHRoIDw8IHRoaXMtPmhpZGRlbi0+eGVpZykgLSAxOworICAgICAgICAgaW50IHQgPSAodGhpcy0+aGlkZGVuLT5zY3JlZW5faGVpZ2h0IDw8IHRoaXMtPmhpZGRlbi0+eWVpZykgLSAxOworCisJIGJsb2NrWzFdID0gMDsgYmxvY2tbMl0gPSAwOyAvKiBMZWZ0Ki8KKyAgICAgICAgIGJsb2NrWzNdID0gMDsgYmxvY2tbNF0gPSAwOyAvKiBCb3R0b20gKi8KKyAgICAgICAgIGJsb2NrWzVdID0gciAmIDB4RkY7IGJsb2NrWzZdID0gKHIgPj4gOCkgJiAweEZGOyAvKiBSaWdodCAqLworICAgICAgICAgYmxvY2tbN10gPSB0ICYgMHhGRjsgYmxvY2tbOF0gPSAodCA+PiA4KSAmIDB4RkY7IC8qIFRvcCAqLworICAgICAgfSBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENsaXAgdG8gd2luZG93ICovCisgICAgICAgCXVuc2lnbmVkIGNoYXIgd2luZG93X3N0YXRlWzM2XTsKKworCSooKGludCAqKXdpbmRvd19zdGF0ZSkgPSB0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGU7CisJcmVncy5yWzFdID0gKHVuc2lnbmVkIGludCl3aW5kb3dfc3RhdGU7CisJX2tlcm5lbF9zd2koV2ltcF9HZXRXaW5kb3dTdGF0ZSwgJnJlZ3MsICZyZWdzKTsKKworICAgICAgICBibG9ja1sxXSA9IHdpbmRvd19zdGF0ZVs0XTsKKyAgICAgICAgYmxvY2tbMl0gPSB3aW5kb3dfc3RhdGVbNV07CisgICAgICAgIGJsb2NrWzNdID0gd2luZG93X3N0YXRlWzhdOworICAgICAgICBibG9ja1s0XSA9IHdpbmRvd19zdGF0ZVs5XTsKKyAgICAgICAgYmxvY2tbNV0gPSB3aW5kb3dfc3RhdGVbMTJdOworICAgICAgICBibG9ja1s2XSA9IHdpbmRvd19zdGF0ZVsxM107CisgICAgICAgIGJsb2NrWzddID0gd2luZG93X3N0YXRlWzE2XTsKKyAgICAgICAgYmxvY2tbOF0gPSB3aW5kb3dfc3RhdGVbMTddOworCisgICAgICB9CisKKyAgICAgIHJlZ3MuclswXSA9IDIxOyAvKiBPUyB3b3JkIGNvZGUgKi8KKyAgICAgIHJlZ3MuclsxXSA9IChpbnQpYmxvY2s7CisgICAgICBfa2VybmVsX3N3aShPU19Xb3JkLCAmcmVncywgJnJlZ3MpOworICAgfQorCisgICByZXR1cm4gbW9kZTsKK30KKworLyogU2F2ZSBtb3VzZSBjdXJzb3IgcGFsZXR0ZSB0byBiZSByZXN0b3JlIHdoZW4gd2UgYXJlIG5vIGxvbmdlcgorICAgZGVmaW5pbmcgYSBjdXJzb3IgKi8KKwordm9pZCBXSU1QX1NhdmVDdXJzb3JQYWxldHRlKCkKK3sKKyAgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisgICAgaW50IGNvbG91cjsKKworICAgIGZvciAoY29sb3VyID0gMDsgY29sb3VyIDwgMjsgY29sb3VyKyspCisgICAgeworICAgICAgcmVncy5yWzBdID0gKGludCl3aW1wX2N1cnNvcl9wYWxldHRlW2NvbG91cl1bMF07CisgICAgICByZWdzLnJbMV0gPSAyNTsKKyAgICAgIC8qIFJlYWQgc2V0dGluZ3Mgd2l0aCBPU19SZWFkUGFsZXR0ZSAqLworICAgICAgaWYgKF9rZXJuZWxfc3dpKDB4MmYsICZyZWdzLCAmcmVncykgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgd2ltcF9jdXJzb3JfcGFsZXR0ZVtjb2xvdXJdWzJdID0gKHVuc2lnbmVkIGNoYXIpKChyZWdzLnJbMl0gPj4gOCkgJiAweEZGKTsKKyAgICAgICAgd2ltcF9jdXJzb3JfcGFsZXR0ZVtjb2xvdXJdWzNdID0gKHVuc2lnbmVkIGNoYXIpKChyZWdzLnJbMl0gPj4gMTYpICYgMHhGRik7CisgICAgICAgIHdpbXBfY3Vyc29yX3BhbGV0dGVbY29sb3VyXVs0XSA9ICh1bnNpZ25lZCBjaGFyKSgocmVncy5yWzJdID4+IDI0KSAmIDB4RkYpOworICAgICAgfQorICAgIH0KKworICAgIGN1cnNvcl9wYWxldHRlX3NhdmVkID0gMTsKK30KKworLyogUmVzdG9yZSB0aGUgV0lNUCdzIGN1cnNvciB3aGVuIHdlIGxlYXZlIHRoZSBTREwgd2luZG93ICovCit2b2lkIFdJTVBfUmVzdG9yZVdpbXBDdXJzb3IoKQoreworICAgIGludCBjb2xvdXI7CisKKyAgICAvKiBSZXNldCB0byBwb2ludGVyIHNoYXBlIDEgKi8KKyAgICBfa2VybmVsX29zYnl0ZSgxMDYsIDEsIDApOworCisgICAgLyogUmVzZXQgcG9pbnRlciBjb2xvdXJzICovCisgICAgaWYgKGN1cnNvcl9wYWxldHRlX3NhdmVkKQorICAgIHsKKyAgICAgIGZvciAoY29sb3VyID0gMDsgY29sb3VyIDwgMjsgY29sb3VyKyspCisgICAgICB7CisgICAgICAgIF9rZXJuZWxfb3N3b3JkKDEyLCAoaW50ICopd2ltcF9jdXJzb3JfcGFsZXR0ZVtjb2xvdXJdKTsKKyAgICAgIH0KKyAgICB9CisgICAgY3Vyc29yX3BhbGV0dGVfc2F2ZWQgPSAwOworfQorCisvKiBTZXQgcGFsZXR0ZSB1c2VkIGZvciBTREwgbW91c2UgY3Vyc29ycyAqLwordm9pZCBXSU1QX1NldFNETEN1cnNvclBhbGV0dGUoKQoreworICAvKiBGaXJzdCB0aW1lIHNldCB1cCB0aGUgbW91c2UgY29sb3VycyAqLworICBVaW50OCBibG9ja1s1XTsKKworICAvKiBTZXQgdXAgY29sb3VyIDEgYXMgd2hpdGUgKi8KKyAgYmxvY2tbMF0gPSAxOyAgIC8qIENvbG91ciB0byBjaGFuZ2UgMSAtIDMgKi8KKyAgYmxvY2tbMV0gPSAyNTsgIC8qIFNldCBwb2ludGVyIGNvbG91ciAqLworICBibG9ja1syXSA9IDI1NTsgLyogcmVkIGNvbXBvbmVudCovCisgIGJsb2NrWzNdID0gMjU1OyAvKiBncmVlbiBjb21wb25lbnQgKi8KKyAgYmxvY2tbNF0gPSAyNTU7IC8qIGJsdWUgY29tcG9uZW50Ki8KKyBfa2VybmVsX29zd29yZCgxMiwgKGludCAqKWJsb2NrKTsKKwkJCisgLyogU2V0IGNvbG91ciAzIHRvIGJhY2sgKi8KKyBibG9ja1swXSA9IDM7ICAgLyogQ29sb3VyIHRvIGNoYW5nZSAxIC0gMyAqLworIGJsb2NrWzFdID0gMjU7ICAvKiBTZXQgcG9pbnRlciBjb2xvdXIqLworIGJsb2NrWzJdID0gMDsgLyogcmVkIGNvbXBvbmVudCovCisgYmxvY2tbM10gPSAwOyAvKiBncmVlbiBjb21wb25lbnQgKi8KKyBibG9ja1s0XSA9IDA7IC8qIGJsdWUgY29tcG9uZW50Ki8KKyBfa2VybmVsX29zd29yZCgxMiwgKGludCAqKWJsb2NrKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3Ntb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zbW91c2VfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTljYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zbW91c2VfYy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3Jpc2Nvc3ZpZGVvLmgiCisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLworc3RydWN0IFdNY3Vyc29yIHsKKwlpbnQgdzsKKwlpbnQgaDsKKwlpbnQgaG90X3g7CisJaW50IGhvdF95OworCVVpbnQ4ICpkYXRhOworfTsKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCit2b2lkIFJJU0NPU19GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworV01jdXJzb3IgKlJJU0NPU19DcmVhdGVXTUN1cnNvcihfVEhJUywgVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKKworaW50IFJJU0NPU19TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOwordm9pZCBGVUxMU0NSRUVOX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KTsKKworaW50IFdJTVBfU2hvd1dNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKK3ZvaWQgV0lNUF9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSk7CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3NzcHJpdGUuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3NzcHJpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGIyZjkxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3Nwcml0ZS5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAgICAgRmlsZSBhZGRlZCBieSBBbGFuIEJ1Y2tsZXkgKGFsYW5fYmFhQGhvdG1haWwuY29tKSBmb3IgUklTQyBPUyBjb21wYXRhYmlsaXR5CisJIDI3IE1hcmNoIDIwMDMKKworICAgICBJbXBsZW1lbnRzIFNwcml0ZSBwbG90dGluZyBjb2RlIGZvciB3aW1wIGRpc3BsYXkud2luZG93CisqLworCisjaW5jbHVkZSAia2VybmVsLmgiCisjaW5jbHVkZSAic3dpcy5oIgorCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF9yaXNjb3N2aWRlby5oIgorCitleHRlcm4gdm9pZCBXSU1QX1JlYWRNb2RlSW5mbyhfVEhJUyk7CisKK3ZvaWQgV0lNUF9QYWxldHRlQ2hhbmdlZChfVEhJUyk7CisKKworLyogQ3JlYXRlIHNwcml0ZSBidWZmZXIgZm9yIHNjcmVlbiAqLworCit1bnNpZ25lZCBjaGFyICpXSU1QX0NyZWF0ZUJ1ZmZlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApCit7CisJaW50IHNpemU7CisJY2hhciBzcHJpdGVfbmFtZVsxMl0gPSAiZGlzcGxheSI7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKwlpbnQgYnl0ZXNQZXJQaXhlbDsKKwlpbnQgYnl0ZXNQZXJSb3c7CisJaW50IG9mZnNldFRvU3ByaXRlRGF0YSA9IDYwOworCisJc3dpdGNoKGJwcCkKKwl7CisJY2FzZSAzMjogYnl0ZXNQZXJQaXhlbCA9IDQ7IGJyZWFrOworCWNhc2UgMTY6IGJ5dGVzUGVyUGl4ZWwgPSAyOyBicmVhazsKKwljYXNlIDg6CisJICAgIGJ5dGVzUGVyUGl4ZWwgPSAxOworCSAgICBvZmZzZXRUb1Nwcml0ZURhdGEgKz0gMjA0ODsgLyogQWRkIGluIHNpemUgb2YgcGFsZXR0ZSAqLworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJYnl0ZXNQZXJSb3cgPSBieXRlc1BlclBpeGVsICogd2lkdGg7CisKKwlpZiAoKGJ5dGVzUGVyUm93ICYgMykgIT0gMCkKKwl7CisJCWJ5dGVzUGVyUm93ICs9IDQgLSAoYnl0ZXNQZXJSb3cgJiAzKTsKKwl9CisJc2l6ZSA9IGJ5dGVzUGVyUm93ICogaGVpZ2h0OworCisJYnVmZmVyID0gU0RMX21hbGxvYyggKHNpemVfdCkgc2l6ZSArIG9mZnNldFRvU3ByaXRlRGF0YSApOworCWlmICghYnVmZmVyKSByZXR1cm4gTlVMTDsKKworICAgLyogSW5pdGlhbGlzZSBhIHNwcml0ZSBhcmVhICovCisKKwkqKHVuc2lnbmVkIGludCAqKWJ1ZmZlcgkJPSBzaXplICsgb2Zmc2V0VG9TcHJpdGVEYXRhOworCSoodW5zaWduZWQgaW50ICopKGJ1ZmZlciArIDgpCT0gMTY7CisKKwlyZWdzLnJbMF0gPSAyNTYrOTsKKwlyZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KWJ1ZmZlcjsKKyAgIF9rZXJuZWxfc3dpKE9TX1Nwcml0ZU9wLCAmcmVncywgJnJlZ3MpOworCisJcmVncy5yWzBdID0gMjU2KzE1OworCXJlZ3MuclsxXSA9ICh1bnNpZ25lZCBpbnQpYnVmZmVyOworCXJlZ3MuclsyXSA9ICh1bnNpZ25lZCBpbnQpJnNwcml0ZV9uYW1lOworCXJlZ3MuclszXSA9IDA7IC8qIFBhbGV0dGUgZmxhZzogMCA9IG5vIHBhbGV0dGUgKi8KKwlyZWdzLnJbNF0gPSB3aWR0aDsKKwlyZWdzLnJbNV0gPSBoZWlnaHQ7CisJaWYgKGJwcCA9PSA4KQorCXsKKwkJLyogVXNlIG9sZCBzdHlsZSBtb2RlIG51bWJlciAqLworCQlyZWdzLnJbNl0gPSAyODsgLyogOGJwcCA5MHg5MGRwaSAqLworCX0gZWxzZQorCXsKKwkJcmVncy5yWzZdID0gKCgoYnBwID09IDE2KSA/IDUgOiA2KSA8PCAyNykgLyogVHlwZSA2ID0gMzJicHAgc3ByaXRlLCA1ID0gMTZicHAgc3ByaXRlICovCisJCQkJCXwgKDkwIDw8IDE0KSAvKiBWZXJ0aWNhbCBkcGkgKi8KKwkJCQkJfCAoOTAgPDwgMSkgIC8qIEhvcml6b250YWwgZHBpICovCisJCQkJCXwgMTsgLyogTWFya2VyIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbW9kZSBzZWxlY3RvcnMgYW5kIHNwcml0ZSBtb2RlcyAqLworCX0KKyAgIGlmIChfa2VybmVsX3N3aShPU19TcHJpdGVPcCwgJnJlZ3MsICZyZWdzKSA9PSBOVUxMKQorICAgeworICAgICAgIGlmIChicHAgPT0gOCkKKyAgICAgICB7CisgICAgICAgICAgLyogTW9kaWZ5IHNwcml0ZSB0byB0YWtlIGludG8gYWNjb3VudCAyNTYgY29sb3VyIHBhbGV0dGUgKi8KKyAgICAgICAgICBpbnQgKnNwcml0ZSA9IChpbnQgKikoYnVmZmVyICsgMTYpOworICAgICAgICAgIC8qIEFkanVzdCBzcHJpdGUgb2Zmc2V0cyAqLworICAgICAgICAgIHNwcml0ZVswXSArPSAyMDQ4OworICAgICAgICAgIHNwcml0ZVs4XSArPSAyMDQ4OworICAgICAgICAgIHNwcml0ZVs5XSArPSAyMDQ4OworICAgICAgICAgIC8qIEFkanVzdCBzcHJpdGUgYXJlYSBuZXh0IGZyZWUgcG9pbnRlciAqLworICAgICAgICAgICgqKGludCAqKShidWZmZXIrMTIpKSArPSAyMDQ4OworCisgICAgICAgICAgLyogRG9uJ3QgbmVlZCB0byBzZXQgdXAgcGFsZXR0ZSBhcyBTREwgc2V0cyB1cCB0aGUgZGVmYXVsdAorICAgICAgICAgICAgIDI1NiBjb2xvdXIgcGFsZXR0ZSAqLworLyogICAgICAgICAgeworICAgICAgICAgICAgIGludCAqcGFsID0gc3ByaXRlICsgMTE7CisgICAgICAgICAgICAgdW5zaWduZWQgaW50IGo7CisgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVudHJ5OworICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNTU7IGorKykKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW50cnkgPSAoaiA8PCAyNCkgfCAoaiA8PCAxNikgfCAoaiA8PCA4KTsKKyAgICAgICAgICAgICAgICAqcGFsKysgPSBlbnRyeTsKKyAgICAgICAgICAgICAgICAqcGFsKysgPSBlbnRyeTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgfQorKi8KKyAgICAgICB9CisgICB9IGVsc2UKKyAgIHsKKyAgICAgIFNETF9mcmVlKGJ1ZmZlcik7CisgICAgICBidWZmZXIgPSBOVUxMOworICAgfQorCisgICByZXR1cm4gYnVmZmVyOworfQorCisKKy8qIFNldHVwIHRyYW5zbGF0aW9uIGJ1ZmZlcnMgZm9yIHRoZSBzcHJpdGUgcGxvdHRpbmcgKi8KKwordm9pZCBXSU1QX1NldHVwUGxvdEluZm8oX1RISVMpCit7CisgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisgICBpbnQgKnNwcml0ZSA9ICgoaW50ICopdGhpcy0+aGlkZGVuLT5iYW5rWzFdKSs0OworCisgICByZWdzLnJbMF0gPSAodW5zaWduZWQgaW50KXRoaXMtPmhpZGRlbi0+YmFua1sxXTsKKyAgIHJlZ3MuclsxXSA9ICh1bnNpZ25lZCBpbnQpc3ByaXRlOworICAgcmVncy5yWzJdID0gLTE7IC8qIEN1cnJlbnQgbW9kZSAqLworICAgcmVncy5yWzNdID0gLTE7IC8qIEN1cnJlbnQgcGFsZXR0ZSAqLworICAgcmVncy5yWzRdID0gMDsgLyogR2V0IHNpemUgb2YgYnVmZmVyICovCisgICByZWdzLnJbNV0gPSAxfDJ8MTY7IC8qIFIxIC0gcG9pbnRlciB0byBzcHJpdGUgYW5kIGNhbiB1c2UgZnVsbCBwYWxldHRlIHdvcmRzICovCisgICByZWdzLnJbNl0gPSAwOworICAgcmVncy5yWzddID0gMDsKKworICAgaWYgKHRoaXMtPmhpZGRlbi0+cGl4dHJhbnMpIFNETF9mcmVlKHRoaXMtPmhpZGRlbi0+cGl4dHJhbnMpOworICAgdGhpcy0+aGlkZGVuLT5waXh0cmFucyA9IDA7CisKKyAgIC8qIEdldCB0aGUgc2l6ZSByZXF1aXJlZCBmb3IgdGhlIGJ1ZmZlciAqLworICAgX2tlcm5lbF9zd2koQ29sb3VyVHJhbnNfR2VuZXJhdGVUYWJsZSwgJnJlZ3MsICZyZWdzKTsKKyAgIGlmIChyZWdzLnJbNF0pCisgICB7CisgICAgICB0aGlzLT5oaWRkZW4tPnBpeHRyYW5zID0gU0RMX21hbGxvYyhyZWdzLnJbNF0pOworICAgIAorICAgICAgcmVncy5yWzRdID0gKHVuc2lnbmVkIGludCl0aGlzLT5oaWRkZW4tPnBpeHRyYW5zOworICAgICAgLyogQWN0dWFsbHkgcmVhZCB0aGUgYnVmZmVyICovCisgICAgICBfa2VybmVsX3N3aShDb2xvdXJUcmFuc19HZW5lcmF0ZVRhYmxlLCAmcmVncywgJnJlZ3MpOworICAgfQorfQorCisvKiBQbG90IHRoZSBzcHJpdGUgaW4gdGhlIGdpdmVuIGNvbnRleHQgKi8KK3ZvaWQgV0lNUF9QbG90U3ByaXRlKF9USElTLCBpbnQgeCwgaW50IHkpCit7CisgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisgICBfa2VybmVsX29zZXJyb3IgKmVycjsKKworICAgcmVncy5yWzBdID0gIDUyICsgNTEyOworICAgcmVncy5yWzFdID0gKHVuc2lnbmVkIGludCl0aGlzLT5oaWRkZW4tPmJhbmtbMV07CisgICByZWdzLnJbMl0gPSAodW5zaWduZWQgaW50KXRoaXMtPmhpZGRlbi0+YmFua1sxXSsxNjsKKyAgIHJlZ3MuclszXSA9IHg7CisgICByZWdzLnJbNF0gPSB5OworICAgcmVncy5yWzVdID0gMHwzMjsgLyogT3ZlcndyaXRlIHNjcmVlbiBhbmQgcGl4dHJhbnMgY29udGFpbnMgd2lkZSBjb2xvdXIgZW50cmllcyAqLworICAgcmVncy5yWzZdID0gMDsgLyogTm8gc2NhbGUgZmFjdG9ycyBpLmUuIDE6MSAqLworICAgcmVncy5yWzddID0gKGludCl0aGlzLT5oaWRkZW4tPnBpeHRyYW5zOworCisgICBpZiAoKGVyciA9IF9rZXJuZWxfc3dpKE9TX1Nwcml0ZU9wLCAmcmVncywgJnJlZ3MpKSAhPSAwKQorICAgeworICAgICAgaW50ICpwID0gKGludCAqKXRoaXMtPmhpZGRlbi0+cGl4dHJhbnM7CisgICAgICBwcmludGYoIk9TX1Nwcml0ZU9wIGZhaWxlZCBcbiVzXG4iLGVyci0+ZXJybWVzcyk7CisgICAgICBwcmludGYoInBpeHRyYW5zICVkXG4iLCAoaW50KXRoaXMtPmhpZGRlbi0+cGl4dHJhbnMpOworICAgICAgcHJpbnRmKCIleCAleCAleFxuIiwgcFswXSwgcFsxXSwgcFsyXSk7CisgICB9Cit9CisKKworLyogV2ltcCBtb2RlIGhhcyBjaGFuZ2VzIHNvIHVwZGF0ZSBjb2xvdXIgbWFwcGluZyBhbmQgcGl4ZWwgc2l6ZXMgCisgICBvZiB3aW5kb3dzIGFuZCB0aGUgc3ByaXRlcyB0aGV5IHBsb3QgKi8KKwordm9pZCBXSU1QX01vZGVDaGFuZ2VkKF9USElTKQoreworCWludCBvbGRYZWlnID0gdGhpcy0+aGlkZGVuLT54ZWlnOworCWludCBvbGRZZWlnID0gdGhpcy0+aGlkZGVuLT55ZWlnOworCisJV0lNUF9SZWFkTW9kZUluZm8odGhpcyk7CisKKwlpZiAob2xkWGVpZyA9PSB0aGlzLT5oaWRkZW4tPnhlaWcgJiYgb2xkWWVpZyA9PSB0aGlzLT5oaWRkZW4tPnllaWcpCisJeworCQkvKiBPbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBwYWxldHRlICovCisJCVdJTVBfUGFsZXR0ZUNoYW5nZWQodGhpcyk7CisJfSBlbHNlCisJeworCQlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisJCWludCB3aW5kb3dfc3RhdGVbOV07CisJCWludCBleHRlbnRbNF07CisJCWludCBjdXJyV2lkdGgsIGN1cnJIZWlnaHQ7CisJCWludCBuZXdXaWR0aCwgbmV3SGVpZ2h0OworCQkKKwkJLyogTmVlZCB0byByZXNpemUgd2luZG93cyBhbmQgdXBkYXRlIHRoZSBwYWxldHRlICovCisJCVdJTVBfU2V0dXBQbG90SW5mbyh0aGlzKTsKKworCisJCXdpbmRvd19zdGF0ZVswXSA9IHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZTsKKwkJcmVncy5yWzFdID0gKHVuc2lnbmVkIGludCl3aW5kb3dfc3RhdGU7CisJCV9rZXJuZWxfc3dpKFdpbXBfR2V0V2luZG93U3RhdGUsICZyZWdzLCAmcmVncyk7CisJCQkJCQkKKwkJY3VycldpZHRoID0gd2luZG93X3N0YXRlWzNdIC0gd2luZG93X3N0YXRlWzFdOworCQljdXJySGVpZ2h0ID0gd2luZG93X3N0YXRlWzRdIC0gd2luZG93X3N0YXRlWzJdOworCQkKKwkJbmV3V2lkdGggPSAoY3VycldpZHRoID4+IG9sZFhlaWcpIDw8IHRoaXMtPmhpZGRlbi0+eGVpZzsKKwkJbmV3SGVpZ2h0ID0gKGN1cnJIZWlnaHQgPj4gb2xkWWVpZykgPDwgdGhpcy0+aGlkZGVuLT55ZWlnOworCQkvKiBOZWVkIHRvIGF2b2lkIGV4dGVudCBnZXR0aW5nIHRvbyBzbWFsbCBmb3IgdmlzaWJsZSBwYXJ0CisJCW9mIHdpbmRvdyAqLworCQlleHRlbnRbMF0gPSAwOworCQlpZiAoY3VyckhlaWdodCA8PSBuZXdIZWlnaHQpCisJCXsKKwkJCWV4dGVudFsxXSA9IC1uZXdIZWlnaHQ7CisJCX0gZWxzZQorCQl7CisJCQlleHRlbnRbMV0gPSAtY3VyckhlaWdodDsKKwkJfQorCQlpZiAoY3VycldpZHRoIDw9IG5ld1dpZHRoKQorCQl7CisJCQlleHRlbnRbMl0gPSBuZXdXaWR0aDsKKwkJfSBlbHNlCisJCXsKKwkJCWV4dGVudFsyXSA9IGN1cnJXaWR0aDsKKwkJfQorCQlleHRlbnRbM10gPSAwOworCQkKKwkJcmVncy5yWzBdID0gdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlOworCQlyZWdzLnJbMV0gPSAoaW50KWV4dGVudDsKKwkJX2tlcm5lbF9zd2koV2ltcF9TZXRFeHRlbnQsICZyZWdzLCAmcmVncyk7CisKKwkJLypUT0RPOiBNYXkgbmVlZCB0byBzZXQgZmxhZyB0byByZXNpemUgd2luZG93IG9uIG5leHQgb3BlbiAqLworCX0KK30KKworLyogUGFsZXR0ZSBoYXMgY2hhbmdlZCBzbyB1cGRhdGUgcGFsZXR0ZXMgdXNlZCBmb3Igd2luZG93cyBzcHJpdGVzICovCisKK3ZvaWQgV0lNUF9QYWxldHRlQ2hhbmdlZChfVEhJUykKK3sKKwlXSU1QX1NldHVwUGxvdEluZm8odGhpcyk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zdGFzay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RjM2UyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3Rhc2suYwpAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgICAgVGhpcyBmaWxlIGFkZGVkIGJ5IEFsYW4gQnVja2xleSAoYWxhbl9iYWFAaG90bWFpbC5jb20pIHRvIHN1cHBvcnQgUklTQyBPUyAKKwkyNiBNYXJjaCAyMDAzCisKKwlGaWxlIGluY2x1ZGVzIHJvdXRpbmVzIGZvcjoKKwkgIFNldHRpbmcgdXAgYXMgYSBXSU1QIFRhc2sKKwkgIFJlYWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZGVza3RvcAorCSAgU3RvcmluZyBpbmZvcm1hdGlvbiBiZWZvcmUgYSBzd2l0Y2ggdG8gZnVsbCBzY3JlZW4KKwkgIFJlc3RvcmluZyBkZXNrdG9wIGFmdGVyIHN3aXRjaGluZyB0byBmdWxsIHNjcmVlbgorKi8KKworI2luY2x1ZGUgImtlcm5lbC5oIgorI2luY2x1ZGUgInN3aXMuaCIKKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKyNpbmNsdWRlICJTRExfcmlzY29zdGFzay5oIgorCisjaWYgIVNETF9USFJFQURTX0RJU0FCTEVECisjaW5jbHVkZSA8cHRocmVhZC5oPgorcHRocmVhZF90IG1haW5fdGhyZWFkOworI2VuZGlmCisKKy8qIFJJU0MgT1MgdmFyaWFibGVzICovCisKK3N0YXRpYyBpbnQgdGFza19oYW5kbGUgPSAwOworc3RhdGljIGludCB3aW1wX3ZlcnNpb24gPSAwOworCisvKiBSSVNDIE9TIHZhcmlhYmxlcyB0byBoZWxwIGNvbXBhdGFiaWxpdHkgd2l0aCBjZXJ0YWluIHByb2dyYW1zICovCitpbnQgcmlzY29zX2JhY2tidWZmZXIgPSAwOyAvKiBDcmVhdGUgYSBiYWNrIGJ1ZmZlciBpbiBzeXN0ZW0gbWVtb3J5IGZvciBmdWxsIHNjcmVlbiBtb2RlICovCitpbnQgcmlzY29zX2Nsb3NlYWN0aW9uID0gMTsgLyogQ2xvc2UgaWNvbiBhY3Rpb24gKi8KKworc3RhdGljIGludCBzdG9yZWRfbW9kZSA9IC0xOyAvKiAtMSB3aGVuIGluIGRlc2t0b3AsIG1vZGUgbnVtYmVyIG9yIHBvaW50ZXIgd2hlbiBmdWxsIHNjcmVlbiAqLworCitleHRlcm4gaW50IG1vdXNlSW5XaW5kb3c7IC8qIE1vdXNlIGlzIGluIFdJTVAgd2luZG93ICovCisKKy8qIExvY2FsIGZ1bmN0aW9uICovCisKK3N0YXRpYyBpbnQgUklTQ09TX0dldFRhc2tOYW1lKGNoYXIgKnRhc2tfbmFtZSwgc2l6ZV90IG1heGxlbik7CisKKy8qIFVuY29tbWVudCBuZXh0IGxpbmUgdG8gY29weSBtb2RlIGNoYW5nZXMvcmVzdG9yZXMgdG8gc3RkZXJyICovCisvKiAjZGVmaW5lIERVTVBfTU9ERSAqLworI2lmZGVmIERVTVBfTU9ERQorI2luY2x1ZGUgInN0ZGlvLmgiCitzdGF0aWMgdm9pZCBkdW1wX21vZGUoKQoreworICAgIGZwcmludGYoc3RkZXJyLCAibW9kZSAlZFxuIiwgc3RvcmVkX21vZGUpOworICAgIGlmIChzdG9yZWRfbW9kZSA8IC0xIHx8IHN0b3JlZF9tb2RlID49IDI1NikKKyAgICB7CisgICAgICAgIGludCBibG9ja1NpemUgPSAwOworCQlpbnQgKnN0b3JlQmxvY2sgPSAoaW50ICopc3RvcmVkX21vZGU7CisKKyAgICAgICAgd2hpbGUoYmxvY2tTaXplIDwgNSB8fCBzdG9yZUJsb2NrW2Jsb2NrU2l6ZV0gIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAlZFxuIiwgc3RvcmVCbG9ja1tibG9ja1NpemUrK10pOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEluaXRpYWxpc2UgYXMgUklTQyBPUyBXaW1wIHRhc2sKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IFJJU0NPU19Jbml0VGFzaygpCit7CisgICBjaGFyIHRhc2tfbmFtZVszMl07CisgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisgICBpbnQgbWVzc2FnZXNbNF07CisKKyAgIGlmIChSSVNDT1NfR2V0VGFza05hbWUodGFza19uYW1lLCBTRExfYXJyYXlzaXplKHRhc2tfbmFtZSkpID09IDApIHJldHVybiAwOworCisgICBtZXNzYWdlc1swXSA9IDk7ICAgICAgIC8qIFBhbGV0dGUgY2hhbmdlZCAqLworICAgbWVzc2FnZXNbMV0gPSAweDQwMGMxOyAvKiBNb2RlIGNoYW5nZWQgKi8KKyAgIG1lc3NhZ2VzWzJdID0gODsgICAgICAgLyogUHJlIHF1aXQgKi8KKyAgIG1lc3NhZ2VzWzJdID0gMDsKKyAgIAorCXJlZ3MuclswXSA9ICh1bnNpZ25lZCBpbnQpMzYwOyAvKiBNaW5pbXVtIHZlcnNpb24gMy42ICovCisJcmVncy5yWzFdID0gKHVuc2lnbmVkIGludCkweDRiNTM0MTU0OworCXJlZ3MuclsyXSA9ICh1bnNpZ25lZCBpbnQpdGFza19uYW1lOworCXJlZ3MuclszXSA9ICh1bnNpZ25lZCBpbnQpbWVzc2FnZXM7CisKKyAgIGlmIChfa2VybmVsX3N3aShXaW1wX0luaXRpYWxpc2UsICZyZWdzLCAmcmVncykgPT0gMCkKKyAgIHsKKwkgICB3aW1wX3ZlcnNpb24gPSByZWdzLnJbMF07CisJICAgdGFza19oYW5kbGUgPSByZWdzLnJbMV07CisJICAgcmV0dXJuIDE7CisgICB9CisKKyNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKKyAgIG1haW5fdGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CisjZW5kaWYKKworICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBDbG9zZSBkb3duIGFwcGxpY2F0aW9uIG9uIGV4aXQuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgUklTQ09TX0V4aXRUYXNrKCkKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisKKyAgICBpZiAoc3RvcmVkX21vZGUgPT0gLTEpCisgICAgeworICAgICAgIC8qIEVuc3VyZSBjdXJzb3IgaXMgcHV0IGJhY2sgdG8gc3RhbmRhcmQgcG9pbnRlciBzaGFwZSBpZgorICAgICAgICAgIHdlIGhhdmUgYmVlbiBydW5uaW5nIGluIGEgd2luZG93ICovCisgICAgICAgX2tlcm5lbF9vc2J5dGUoMTA2LDEsMCk7CisgICAgfQorCisJLyogRW5zdXJlIHdlIGVuZCB1cCBiYWNrIGluIHRoZSB3aW1wICovCisJUklTQ09TX1Jlc3RvcmVXaW1wTW9kZSgpOworCisJLyogTmVhdGx5IGV4aXQgdGhlIHRhc2sgKi8KKyAgIAlyZWdzLnJbMF0gPSB0YXNrX2hhbmRsZTsKKyAgIAlyZWdzLnJbMV0gPSAodW5zaWduZWQgaW50KTB4NGI1MzQxNTQ7CisgICAJX2tlcm5lbF9zd2koV2ltcF9DbG9zZURvd24sICZyZWdzLCAmcmVncyk7CisJdGFza19oYW5kbGUgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBHZXQgdGhlIG5hbWUgb2YgdGhlIHRhc2sgZm9yIHRoZSBkZXNrdG9wLgorCisgIFBhcmFtOiAgIHRhc2tfbmFtZSAtIG5hbWUgb2YgdGFzayAzMiBjaGFyYWN0ZXJzLgorCisgIFJldHVybnM6IDEgaXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIDAKKworICBOb3RlczogICBXb3JrcyBieSBnZXR0aW5nIHVzaW5nIE9TX0dldEVudiB0byBnZXQgdGhlIGNvbW1hbmQgbGluZQorCQkgICB1c2VkIHRvIHJ1biB0aGUgcHJvZ3JhbSBhbmQgdGhlbiBwYXJzaW5nIGEgbmFtZSBmcm9tIGl0CisJCSAgIGFzIGZvbGxvd3MuCisKKwkJICAgMS4gVXNlIG5hbWUgYWZ0ZXIgZmluYWwgcGVyaW9kIGlmIG5vdCAhUnVuSW1hZ2UKKwkJICAgMi4gSWYgbmFtZSBpcyAhUnVuSW1hZ2UgdGhlbiBwcm9jZXNzIGl0ZW0gYmVmb3JlIHRoZSBwZXJpb2QKKwkJICAgICAgaW4gZnJvbnQgb2YgIVJ1bkltYWdlLgorCQkgICAzLiBJZiBkaXJlY3RvcnkgbmFtZSB1c2UgdGhhdAorCQkgICA0LiBpZiBpbiBmb3JtIDxYWFgkRGlyPiB1c2UgdGhlIFhYWC4KKworCQkgICBGaW5hbGx5IG9uY2UgdGhpcyB2YWx1ZSBoYXMgYmVlbiByZXRyaWV2ZWQgdXNlIGl0IHVubGVzcworCQkgICB0aGVyZSBpcyBhIHZhcmlhYmxlIHNldCB1cCBpbiB0aGUgZm9ybSBTREwkPG5hbWU+JFRhc2tOYW1lCisJCSAgIGluIHdoaWNoIGNhc2UgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgd2lsbCBiZSB1c2VkLgorCisJCSAgIE5vdyBhbHNvIGdldHMgb3RoZXIgUklTQyBPUyBjb25maWd1cmF0aW9uIHZhcmlibGVzCisgICAgICAgICAgICAgICAgU0RMJDxuYW1lPiRCYWNrQnVmZmVyIC0gc2V0IHRvIDEgdG8gdXNlIGEgc3lzdGVtIG1lbW9yeSBiYWNrYnVmZmVyIGluIGZ1bGxzY3JlZW4gbW9kZQorCQkJCQkJICAgIHNvIHVwZGF0ZXMgd2FpdCB1bnRpbCBhIGNhbGwgdG8gU0RMX1VwZGF0ZVJlY3RzLiAoZGVmYXVsdCAwKQorCQkJCQkJICAgIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHByb2dyYW1tZXMgd2hlcmUgdGhleSBoYXZlIGFzc3VtZWQgdGhpcyBpcworCQkJCQkJICAgIGFsd2F5cyB0aGUgY2FzZSB3aGljaCBpcyBjb250cmFyeSB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAgIFNETCQ8bmFtZT4kQ2xvc2VBY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgMCBEb24ndCBzaG93IGNsb3NlIGljb24KKyAgICAgICAgICAgICAgICAgICAgMSBTaG93IGNsb3NlIGljb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgUklTQ09TX0dldFRhc2tOYW1lKGNoYXIgKnRhc2tfbmFtZSwgc2l6ZV90IG1heGxlbikKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisKKyAgIHRhc2tfbmFtZVswXSA9IDA7CisKKyAgIC8qIEZpZ3VyZSBvdXQgYSBzZW5zaWJsZSB0YXNrIG5hbWUgKi8KKyAgIGlmIChfa2VybmVsX3N3aShPU19HZXRFbnYsICZyZWdzLCAmcmVncykgPT0gMCkKKyAgIHsKKwkgICBjaGFyICpjb21tYW5kX2xpbmUgPSAoY2hhciAqKXJlZ3MuclswXTsKKwkgICBzaXplX3QgbGVuID0gU0RMX3N0cmxlbihjb21tYW5kX2xpbmUpKzE7CisJICAgY2hhciAqYnVmZmVyID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIGxlbik7CisJICAgY2hhciAqZW52X3ZhcjsKKwkgICBjaGFyICpwOworCisJICAgU0RMX3N0cmxjcHkoYnVmZmVyLCBjb21tYW5kX2xpbmUsIGxlbik7CisJICAgcCA9IFNETF9zdHJjaHIoYnVmZmVyLCAnICcpOworCSAgIGlmIChwKSAqcCA9IDA7CisJICAgcCA9IFNETF9zdHJyY2hyKGJ1ZmZlciwgJy4nKTsKKwkgICBpZiAocCA9PSAwKSBwID0gYnVmZmVyOworCSAgIGlmIChzdHJpY21wKHArMSwiIVJ1bkltYWdlIikgPT0gMCkKKwkgICB7CisJCSAgICpwID0gMDsKKwkgICAJICAgcCA9IFNETF9zdHJyY2hyKGJ1ZmZlciwgJy4nKTsKKwkJICAgaWYgKHAgPT0gMCkgcCA9IGJ1ZmZlcjsKKwkgICB9CisJICAgaWYgKCpwID09ICcuJykgcCsrOworCSAgIGlmICgqcCA9PSAnIScpIHArKzsgLyogU2tpcCAiISIgYXQgYmVnaW5uaW5nIG9mIGFwcGxpY2F0aW9uIGRpcmVjdG9yaWVzICovCisKKyAgICAgICBpZiAoKnAgPT0gJzwnKQorICAgICAgIHsKKyAgICAgICAgICAvLyBQcm9iYWJseSBpbiB0aGUgZm9ybSA8YXBwbmFtZSREaXI+CisgICAgICAgICAgY2hhciAqcSA9IFNETF9zdHJjaHIocCwgJyQnKTsKKyAgICAgICAgICBpZiAocSA9PSAwKSBxID0gU0RMX3N0cmNocihwLCc+Jyk7IC8qIFVzZSB2YXJpYWJsZSBuYW1lIGlmIG5vdCAqLworICAgICAgICAgIGlmIChxKSAqcSA9IDA7CisgICAgICAgICAgcCsrOyAvKiBNb3ZlIG92ZXIgdGhlIDwgKi8KKyAgICAgICB9CisKKwkgICBpZiAoKnApCisJICAgeworCQkgICAvKiBSZWFkIHZhcmlhYmxlcyB0aGF0IGVmZmVjdCB0aGUgUklTQyBPUyBTREwgZW5naW5lIGZvciB0aGlzIHRhc2sgKi8KKwkJICAgbGVuID0gU0RMX3N0cmxlbihwKSArIDE4OyAvKiAxOCBpcyBsYXJnZXIgdGhhbiB0aGUgYmlnZ2VzdCB2YXJpYWJsZSBuYW1lICovCisJCSAgIGVudl92YXIgPSBTRExfc3RhY2tfYWxsb2MoY2hhciwgbGVuKTsKKwkJICAgaWYgKGVudl92YXIpCisJCSAgIHsKKwkJCSAgIGNoYXIgKmVudl92YWw7CisKKwkJCSAgIC8qIFNlZSBpZiBhIHZhcmlhYmxlIG9mIGZvcm0gU0RMJDxkaXJuYW1lPiRUYXNrTmFtZSBleGlzdHMgKi8KKworCQkJICAgU0RMX3N0cmxjcHkoZW52X3ZhciwgIlNETCQiLCBsZW4pOworCQkJICAgU0RMX3N0cmxjYXQoZW52X3ZhciwgcCwgbGVuKTsKKwkJCSAgIFNETF9zdHJsY2F0KGVudl92YXIsICIkVGFza05hbWUiLCBsZW4pOworCisJCQkgICBlbnZfdmFsID0gU0RMX2dldGVudihlbnZfdmFyKTsKKwkJCSAgIGlmIChlbnZfdmFsKSBTRExfc3RybGNweSh0YXNrX25hbWUsIGVudl92YWwsIG1heGxlbik7CisKKwkJCSAgIFNETF9zdHJsY3B5KGVudl92YXIsICJTREwkIiwgbGVuKTsKKwkJCSAgIFNETF9zdHJsY2F0KGVudl92YXIsIHAsIGxlbik7CisJCQkgICBTRExfc3RybGNhdChlbnZfdmFyLCAiJEJhY2tCdWZmZXIiLCBsZW4pOworCisJCQkgICBlbnZfdmFsID0gU0RMX2dldGVudihlbnZfdmFyKTsKKwkJCSAgIGlmIChlbnZfdmFsKSByaXNjb3NfYmFja2J1ZmZlciA9IGF0b2koZW52X3ZhbCk7CisKKwkJCSAgIFNETF9zdHJsY3B5KGVudl92YXIsICJTREwkIiwgbGVuKTsKKwkJCSAgIFNETF9zdHJsY2F0KGVudl92YXIsIHAsIGxlbik7CisJCQkgICBTRExfc3RybGNhdChlbnZfdmFyLCAiJENsb3NlQWN0aW9uIiwgbGVuKTsKKworCQkJICAgZW52X3ZhbCA9IFNETF9nZXRlbnYoZW52X3Zhcik7CisJCQkgICBpZiAoZW52X3ZhbCAmJiBTRExfc3RyY21wKGVudl92YWwsIjAiKSA9PSAwKSByaXNjb3NfY2xvc2VhY3Rpb24gPSAwOworCisJCQkgICBTRExfc3RhY2tfZnJlZShlbnZfdmFyKTsKKwkJICAgfQorCQkgICAKKwkJICAgaWYgKCEqdGFza19uYW1lKSBTRExfc3RybGNweSh0YXNrX25hbWUsIHAsIG1heGxlbik7CisJICAgfQorCisJICAgU0RMX3N0YWNrX2ZyZWUoYnVmZmVyKTsKKyAgIH0KKworICAgaWYgKHRhc2tfbmFtZVswXSA9PSAwKSBTRExfc3RybGNweSh0YXNrX25hbWUsICJTREwgVGFzayIsIG1heGxlbik7CisKKyAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBTdG9yZSB0aGUgY3VycmVudCBkZXNrdG9wIHNjcmVlbiBtb2RlIGlmIHdlIGFyZSBpbiB0aGUgZGVza3RvcC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFJJU0NPU19TdG9yZVdpbXBNb2RlKCkKK3sKKyAgICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOworCisJLyogRG9uJ3Qgc3RvcmUgaWYgaW4gZnVsbCBzY3JlZW4gbW9kZSAqLworCWlmIChzdG9yZWRfbW9kZSAhPSAtMSkgcmV0dXJuOworCisgICAgcmVncy5yWzBdID0gMTsKKyAgICBfa2VybmVsX3N3aShPU19TY3JlZW5Nb2RlLCAmcmVncywgJnJlZ3MpOworICAgIGlmIChyZWdzLnJbMV0gPj0gMCAmJiByZWdzLnJbMV0gPCAyNTYpIHN0b3JlZF9tb2RlID0gcmVncy5yWzFdOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBibG9ja1NpemUgPSAwOworICAgICAgICBpbnQgKnJldEJsb2NrID0gKGludCAqKXJlZ3MuclsxXTsKKwkJaW50ICpzdG9yZUJsb2NrOworICAgICAgICBpbnQgajsKKworICAgICAgICB3aGlsZShibG9ja1NpemUgPCA1IHx8IHJldEJsb2NrW2Jsb2NrU2l6ZV0gIT0gLTEpIGJsb2NrU2l6ZSsrOworICAgICAgICBibG9ja1NpemUrKzsKKyAgICAgICAgc3RvcmVCbG9jayA9IChpbnQgKilTRExfbWFsbG9jKGJsb2NrU2l6ZSAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgcmV0QmxvY2sgPSAoaW50ICopcmVncy5yWzFdOworICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsb2NrU2l6ZTsgaisrKQorICAgICAgICAgICBzdG9yZUJsb2NrW2pdID0gcmV0QmxvY2tbal07CisKKwkJc3RvcmVkX21vZGUgPSAoaW50KXN0b3JlQmxvY2s7CisgICAgIH0KKyNpZiBEVU1QX01PREUKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlN0b3JlZCAiKTsgZHVtcF9tb2RlKCk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgUmVzdG9yZSBkZXNrdG9wIHNjcmVlbiBtb2RlIGlmIHdlIGFyZSBpbiBmdWxsIHNjcmVlbiBtb2RlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBSSVNDT1NfUmVzdG9yZVdpbXBNb2RlKCkKK3sKKyAgICBfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisKKwkvKiBPbmx5IG5lZWQgdG8gcmVzdG9yZSBpZiB3ZSBhcmUgaW4gZnVsbCBzY3JlZW4gbW9kZSAqLworCWlmIChzdG9yZWRfbW9kZSA9PSAtMSkgcmV0dXJuOworCisjaWYgRFVNUF9NT0RFCisgICBmcHJpbnRmKHN0ZGVyciwgIlJlc3RvcmVkIik7IGR1bXBfbW9kZSgpOworI2VuZGlmCisKKyAgICByZWdzLnJbMF0gPSBzdG9yZWRfbW9kZTsKKyAgICBfa2VybmVsX3N3aShXaW1wX1NldE1vZGUsICZyZWdzLCAmcmVncyk7CisgICAgaWYgKHN0b3JlZF9tb2RlIDwgMCB8fCBzdG9yZWRfbW9kZSA+IDI1NikKKyAgICB7CisgICAgICAgU0RMX2ZyZWUoKGludCAqKXN0b3JlZF9tb2RlKTsKKyAgICB9CisgICAgc3RvcmVkX21vZGUgPSAtMTsKKworICAgIC8qIEZsdXNoIGtleWJvYXJkIGJ1ZmZlciB0byBkdW1wIHRoZSBrZXlzdHJva2VzIHdlJ3ZlIGFscmVhZHkgcG9sbGVkICovCisgICAgcmVncy5yWzBdID0gMjE7CisgICAgcmVncy5yWzFdID0gMDsgLyogS2V5Ym9hcmQgYnVmZmVyIG51bWJlciAqLworICAgIF9rZXJuZWxfc3dpKE9TX0J5dGUsICZyZWdzLCAmcmVncyk7CisKKyAgICBtb3VzZUluV2luZG93ID0gMDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgR2V0IHZlcnNpb24gb2YgV2ltcCBydW5uaW5nIHdoZW4gdGFzayB3YXMgaW5pdGlhbGlzZWQuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IFJJU0NPU19HZXRXaW1wVmVyc2lvbigpCit7CisJcmV0dXJuIHdpbXBfdmVyc2lvbjsKK30KKworaW50IFJJU0NPU19HZXRUYXNrSGFuZGxlKCkKK3sKKwlyZXR1cm4gdGFza19oYW5kbGU7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zdGFzay5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3Rhc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ0YWZhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3Rhc2suaApAQCAtMCwwICsxLDM5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAgICBUaGlzIGZpbGUgYWRkZWQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgdG8gc3VwcG9ydCBSSVNDIE9TIAorCTI2IE1hcmNoIDIwMDMKKyovCisKKy8qIFRhc2sgaW5pdGlhbGlzYXRpb24vQ2xlYW4gdXAgKi8KKworZXh0ZXJuIGludCBSSVNDT1NfSW5pdFRhc2soKTsKK2V4dGVybiB2b2lkIFJJU0NPU19FeGl0VGFzaygpOworZXh0ZXJuIGludCBSSVNDT1NfR2V0V2ltcFZlcnNpb24oKTsKK2V4dGVybiBpbnQgUklTQ09TX0dldFRhc2tIYW5kbGUoKTsKKworCisvKiBXaW1wIG1vZGUgc2F2ZWluZy9yZXN0b3JpbmcgKi8KK2V4dGVybiB2b2lkIFJJU0NPU19TdG9yZVdpbXBNb2RlKCk7CitleHRlcm4gdm9pZCBSSVNDT1NfUmVzdG9yZVdpbXBNb2RlKCk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcmlzY29zL1NETF9yaXNjb3N2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTVlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zdmlkZW8uYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgICAgIEZpbGUgYWRkZWQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgZm9yIFJJU0MgT1MgY29tcGF0YWJpbGl0eQorCSAyMyBNYXJjaCAyMDAzCisKKyAgICAgSW1wbGVtZW50cyBSSVNDIE9TIGRpc3BsYXkgZGV2aWNlIG1hbmFnZW1lbnQuCisJIFJvdXRpbmVzIGZvciBmdWxsIHNjcmVlbiBhbmQgd2ltcCBtb2RlcyBhcmUgc3BsaXQKKwkgaW50byBvdGhlciBzb3VyY2UgZmlsZXMuCisqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiU0RMX3N5c3dtLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX3Jpc2Nvc3Rhc2suaCIKKyNpbmNsdWRlICJTRExfcmlzY29zdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfcmlzY29zZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfcmlzY29zbW91c2VfYy5oIgorCisjaW5jbHVkZSAia2VybmVsLmgiCisjaW5jbHVkZSAic3dpcy5oIgorCisjZGVmaW5lIFJJU0NPU1ZJRF9EUklWRVJfTkFNRSAicmlzY29zIgorCisvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgUklTQ09TX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyB2b2lkIFJJU0NPU19WaWRlb1F1aXQoX1RISVMpOworCitzdGF0aWMgU0RMX1JlY3QgKipSSVNDT1NfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBTRExfU3VyZmFjZSAqUklTQ09TX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKKworaW50IFJJU0NPU19HZXRXbUluZm8oX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pOworCitpbnQgUklTQ09TX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBmdWxsc2NyZWVuKTsKKy8qIE1vdXNlIGNoZWNraW5nICovCit2b2lkIFJJU0NPU19DaGVja01vdXNlTW9kZShfVEhJUyk7CitleHRlcm4gU0RMX0dyYWJNb2RlIFJJU0NPU19HcmFiSW5wdXQoX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKTsKKworLyogRnVsbHNjcmVlbiBtb2RlIGZ1bmN0aW9ucyAqLworZXh0ZXJuIFNETF9TdXJmYWNlICpGVUxMU0NSRUVOX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK2V4dGVybiB2b2lkIEZVTExTQ1JFRU5fQnVpbGRNb2RlTGlzdChfVEhJUyk7CitleHRlcm4gdm9pZAlGVUxMU0NSRUVOX1NldERldmljZU1vZGUoX1RISVMpOworZXh0ZXJuIGludCBGVUxMU0NSRUVOX1RvZ2dsZUZyb21XaW1wKF9USElTKTsKKworLyogV2ltcCBtb2RlIGZ1bmN0aW9ucyAqLworZXh0ZXJuIFNETF9TdXJmYWNlICpXSU1QX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK2V4dGVybiB2b2lkIFdJTVBfRGVsZXRlV2luZG93KF9USElTKTsKK2V4dGVybiBpbnQgV0lNUF9Ub2dnbGVGcm9tRnVsbFNjcmVlbihfVEhJUyk7CisKKy8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zIC0gY29tbW9uIHRvIFdJTVAgYW5kIEZVTExTQ1JFRU4gKi8KK3N0YXRpYyBpbnQgUklTQ09TX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IFJJU0NPU19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBSSVNDT1NfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBSSVNDT1NfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKiBSSVNDIE9TIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgUklTQ09TX0F2YWlsYWJsZSh2b2lkKQoreworCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQgUklTQ09TX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqUklTQ09TX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKwlpZiAoIGRldmljZSApIHsKKwkJU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOworCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKKwkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisJfQorCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIGRldmljZSApIHsKKwkJCVNETF9mcmVlKGRldmljZSk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCWRldmljZS0+VmlkZW9Jbml0ID0gUklTQ09TX1ZpZGVvSW5pdDsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IFJJU0NPU19WaWRlb1F1aXQ7CisKKwlkZXZpY2UtPkxpc3RNb2RlcyA9IFJJU0NPU19MaXN0TW9kZXM7CisJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBSSVNDT1NfU2V0VmlkZW9Nb2RlOworCWRldmljZS0+Q3JlYXRlWVVWT3ZlcmxheSA9IE5VTEw7CisJZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IFJJU0NPU19BbGxvY0hXU3VyZmFjZTsKKwlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gTlVMTDsKKwlkZXZpY2UtPkZpbGxIV1JlY3QgPSBOVUxMOworCWRldmljZS0+U2V0SFdDb2xvcktleSA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0FscGhhID0gTlVMTDsKKwlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBSSVNDT1NfTG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IFJJU0NPU19VbmxvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gUklTQ09TX0ZyZWVIV1N1cmZhY2U7CisJCisJZGV2aWNlLT5GcmVlV01DdXJzb3IgPSBSSVNDT1NfRnJlZVdNQ3Vyc29yOworCWRldmljZS0+Q3JlYXRlV01DdXJzb3IgPSBSSVNDT1NfQ3JlYXRlV01DdXJzb3I7CisJZGV2aWNlLT5DaGVja01vdXNlTW9kZSA9IFJJU0NPU19DaGVja01vdXNlTW9kZTsKKyAgICBkZXZpY2UtPkdyYWJJbnB1dCA9IFJJU0NPU19HcmFiSW5wdXQ7CisKKwlkZXZpY2UtPkluaXRPU0tleW1hcCA9IFJJU0NPU19Jbml0T1NLZXltYXA7CisKKwlkZXZpY2UtPkdldFdNSW5mbyA9IFJJU0NPU19HZXRXbUluZm87CisKKwlkZXZpY2UtPmZyZWUgPSBSSVNDT1NfRGVsZXRlRGV2aWNlOworCisvKiBDYW4ndCBnZXQgVG9nZ2xlIHNjcmVlbiB0byB3b3JrIGlmIHByb2dyYW0gc3RhcnRzIHVwIGluIEZ1bGwgc2NyZWVuIG1vZGUgc28KKyAgIGRpc2FibGUgaXQgaGVyZSBhbmQgcmUtZW5hYmxlIGl0IHdoZW4gYSB3aW1wIHNjcmVlbiBpcyBjaG9zZW4gKi8KKyAgICBkZXZpY2UtPlRvZ2dsZUZ1bGxTY3JlZW4gPSBOVUxMOyAvKlJJU0NPU19Ub2dnbGVGdWxsU2NyZWVuOyovCisKKwkvKiBTZXQgb3RoZXIgZW50cmllcyBmb3IgZnVsbHNjcmVlbiBtb2RlICovCisJRlVMTFNDUkVFTl9TZXREZXZpY2VNb2RlKGRldmljZSk7CisKKwkvKiBNb3VzZSBwb2ludGVyIG5lZWRzIHRvIHVzZSB0aGUgV0lNUCBTaG93Q3Vyc29yIHZlcnNpb24gc28KKwkgICB0aGF0IGl0IGRvZXNuJ3QgbW9kaWZ5IHRoZSBwb2ludGVyIHVudGlsIHRoZSBTREwgV2luZG93IGlzCisJICAgZW50ZXJlZCBvciB0aGUgYXBwbGljYXRpb24gZ29lcyBmdWxsIHNjcmVlbiAqLworCWRldmljZS0+U2hvd1dNQ3Vyc29yID0gV0lNUF9TaG93V01DdXJzb3I7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBSSVNDT1NfYm9vdHN0cmFwID0geworCVJJU0NPU1ZJRF9EUklWRVJfTkFNRSwgIlJJU0MgT1MgdmlkZW8gZHJpdmVyIiwKKwlSSVNDT1NfQXZhaWxhYmxlLCBSSVNDT1NfQ3JlYXRlRGV2aWNlCit9OworCisKK2ludCBSSVNDT1NfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisJX2tlcm5lbF9zd2lfcmVncyByZWdzOworCWludCB2YXJzWzRdLCB2YWxzWzNdOworCisJaWYgKFJJU0NPU19Jbml0VGFzaygpID09IDApCisJeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBzdGFydCB0YXNrIik7CisJCXJldHVybiAwOworCX0KKworCXZhcnNbMF0gPSA5OyAgLyogTG9nIGJhc2UgMiBicHAgKi8KKwl2YXJzWzFdID0gMTE7IC8qIFhXbmRMaW1pdCAtIG51bSB4IHBpeGVscyAtMSAqLworCXZhcnNbMl0gPSAxMjsgLyogWVduZExpbWl0IC0gbnVtIHkgcGl4ZWxzIC0xICovCisJdmFyc1szXSA9IC0xOyAvKiBUZXJtaW5hdGUgbGlzdCAqLworCXJlZ3MuclswXSA9IChpbnQpdmFyczsKKwlyZWdzLnJbMV0gPSAoaW50KXZhbHM7CisKKwlfa2VybmVsX3N3aShPU19SZWFkVmR1VmFyaWFibGVzLCAmcmVncywgJnJlZ3MpOworCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9ICgxIDw8IHZhbHNbMF0pOworCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCisJdGhpcy0+aW5mby5jdXJyZW50X3cgPSB2YWxzWzFdICsgMTsKKwl0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IHZhbHNbMl0gKyAxOworCisJLyogTWluaW11bSBicHAgZm9yIFNETCBpcyA4ICovCisJaWYgKHZmb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDgpIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IDg7CisKKworCXN3aXRjaCAodmZvcm1hdC0+Qml0c1BlclBpeGVsKQorCXsKKwkJY2FzZSAxNToKKwkJY2FzZSAxNjoKKwkJCXZmb3JtYXQtPkJtYXNrID0gMHgwMDAwN2MwMDsKKwkJCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwMDNlMDsKKwkJCXZmb3JtYXQtPlJtYXNrID0gMHgwMDAwMDAxZjsKKwkJCXZmb3JtYXQtPkJpdHNQZXJQaXhlbCA9IDE2OyAvKiBTREwgd2FudHMgYWN0dWFsIG51bWJlciBvZiBiaXRzIHVzZWQgKi8KKwkJCXZmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSAyNDoKKwkJY2FzZSAzMjoKKwkJCXZmb3JtYXQtPkJtYXNrID0gMHgwMGZmMDAwMDsKKwkJCXZmb3JtYXQtPkdtYXNrID0gMHgwMDAwZmYwMDsKKwkJCXZmb3JtYXQtPlJtYXNrID0gMHgwMDAwMDBmZjsKKwkJCXZmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPSA0OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXZmb3JtYXQtPkJtYXNrID0gMDsKKwkJCXZmb3JtYXQtPkdtYXNrID0gMDsKKwkJCXZmb3JtYXQtPlJtYXNrID0gMDsKKwkJCXZmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgPSAxOwkJCQorCQkJYnJlYWs7CisJfQorCisJLyogRmlsbCBpbiBzb21lIHdpbmRvdyBtYW5hZ2VyIGNhcGFiaWxpdGllcyAqLworCXRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMTsKKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKDApOworfQorCisvKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKKyAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KKyovCit2b2lkIFJJU0NPU19WaWRlb1F1aXQoX1RISVMpCit7CisJUklTQ09TX0V4aXRUYXNrKCk7CisKKwlpZiAodGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rKSBTRExfZnJlZSh0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmspOworCXRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuayA9IDA7Cit9CisKKworU0RMX1JlY3QgKipSSVNDT1NfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCWlmIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKQorCXsKKwkJLyogQnVpbGQgbW9kZSBsaXN0IHdoZW4gZmlyc3QgcmVxdWlyZWQuICovCisJCWlmIChTRExfbnVtbW9kZXNbMF0gPT0gMCkgRlVMTFNDUkVFTl9CdWlsZE1vZGVMaXN0KHRoaXMpOworCisJCXJldHVybihTRExfbW9kZWxpc3RbKChmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xXSk7CisJfSBlbHNlCisJCXJldHVybiAoU0RMX1JlY3QgKiopLTE7Cit9CisKKworLyogU2V0IHVwIHZpZGVvIG1vZGUgKi8KK1NETF9TdXJmYWNlICpSSVNDT1NfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikKKwl7CisJICAgIFJJU0NPU19TdG9yZVdpbXBNb2RlKCk7CisJCS8qIER1bXAgd2ltcCB3aW5kb3cgb24gc3dpdGNoIHRvIGZ1bGwgc2NyZWVuICovCisgIAkgICAgaWYgKHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZSkgV0lNUF9EZWxldGVXaW5kb3codGhpcyk7CisKKwkJcmV0dXJuIEZVTExTQ1JFRU5fU2V0VmlkZW9Nb2RlKHRoaXMsIGN1cnJlbnQsIHdpZHRoLCBoZWlnaHQsIGJwcCwgZmxhZ3MpOworCX0gZWxzZQorCXsKKwkgICAgUklTQ09TX1Jlc3RvcmVXaW1wTW9kZSgpOworCQlyZXR1cm4gV0lNUF9TZXRWaWRlb01vZGUodGhpcywgY3VycmVudCwgd2lkdGgsIGhlaWdodCwgYnBwLCBmbGFncyk7CisJfQorfQorCisKKy8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIG90aGVyIHRoYW4gdGhlIG1haW4gb25lICovCitzdGF0aWMgaW50IFJJU0NPU19BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuKC0xKTsKK30KK3N0YXRpYyB2b2lkIFJJU0NPU19GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKKy8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSBvbiBwYWdlIGZsaXBwZWQgZGlzcGxheXMgKi8KK3N0YXRpYyBpbnQgUklTQ09TX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgUklTQ09TX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCisKK2ludCBSSVNDT1NfR2V0V21JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKQoreworCVNETF9WRVJTSU9OKCYoaW5mby0+dmVyc2lvbikpOworCWluZm8tPndpbXBWZXJzaW9uID0gUklTQ09TX0dldFdpbXBWZXJzaW9uKCk7CisJaW5mby0+dGFza0hhbmRsZSA9IFJJU0NPU19HZXRUYXNrSGFuZGxlKCk7CisJaW5mby0+d2luZG93ID0gdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlOworCisJcmV0dXJuIDE7Cit9CisvKiBUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZS4KKyAgIFJldHVybnMgMSBpZiBzdWNjZXNzZnVsIG90aGVyd2lzZSAwCisqLworCitpbnQgUklTQ09TX1RvZ2dsZUZ1bGxTY3JlZW4oX1RISVMsIGludCBmdWxsc2NyZWVuKQoreworICAgIGlmIChmdWxsc2NyZWVuKQorICAgIHsKKyAgICAgICByZXR1cm4gRlVMTFNDUkVFTl9Ub2dnbGVGcm9tV2ltcCh0aGlzKTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIFdJTVBfVG9nZ2xlRnJvbUZ1bGxTY3JlZW4odGhpcyk7CisgICAgfQorCisgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3ZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfcmlzY29zdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzcxN2FkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9yaXNjb3MvU0RMX3Jpc2Nvc3ZpZGVvLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9yaXNjb3N2aWRlb19oCisjZGVmaW5lIF9TRExfcmlzY29zdmlkZW9faAorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKKworCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgeworICAgIHVuc2lnbmVkIGNoYXIgKmJhbmtbMl07CisgICAgaW50IGN1cnJlbnRfYmFuazsKKwl1bnNpZ25lZCBjaGFyICphbGxvY19iYW5rOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHhlaWc7CisgICAgaW50IHllaWc7CisJaW50IHNjcmVlbl9icHA7CisJaW50IHNjcmVlbl93aWR0aDsKKwlpbnQgc2NyZWVuX2hlaWdodDsKKwljaGFyICpwaXh0cmFuczsKKworCS8qIFdpbXAgdmFyaWFibGVzICovCisJdW5zaWduZWQgaW50IHdpbmRvd19oYW5kbGU7CisJY2hhciB0aXRsZVsyNTZdOworCisjZGVmaW5lIE5VTV9NT0RFTElTVFMJNAkJLyogOCwgMTYsIDI0LCBhbmQgMzIgYml0cy1wZXItcGl4ZWwgKi8KKyAgICBpbnQgU0RMX251bW1vZGVzW05VTV9NT0RFTElTVFNdOworICAgIFNETF9SZWN0ICoqU0RMX21vZGVsaXN0W05VTV9NT0RFTElTVFNdOworfTsKKworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIFNETF9udW1tb2RlcwkJKHRoaXMtPmhpZGRlbi0+U0RMX251bW1vZGVzKQorI2RlZmluZSBTRExfbW9kZWxpc3QJCSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKKworI2VuZGlmIC8qIF9TRExfcmlzb3N2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfd2ltcHBvbGwuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcmlzY29zL1NETF93aW1wcG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTk2NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfd2ltcHBvbGwuYwpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgICAgIEZpbGUgYWRkZWQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgZm9yIFJJU0MgT1MgY29tcGF0YWJpbGl0eQorCSAyNyBNYXJjaCAyMDAzCisKKyAgICAgSW1wbGVtZW50cyBQdW1waW5nIG9mIGV2ZW50cyBhbmQgV0lNUCBwb2xsaW5nCisqLworCisjaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3N5c3dtLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3Jpc2Nvc3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3Jpc2Nvc2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3Jpc2Nvc21vdXNlX2MuaCIKKyNpbmNsdWRlICIuLi8uLi90aW1lci9TRExfdGltZXJfYy5oIgorCisjaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAic3RkbGliLmgiCisjaW5jbHVkZSAiY3R5cGUuaCIKKworI2luY2x1ZGUgImtlcm5lbC5oIgorI2luY2x1ZGUgInN3aXMuaCIKKyNpbmNsdWRlICJ1bml4bGliL29zLmgiCisKKyNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworLyogTG9jYWwgZnVuY3Rpb25zICovCit2b2lkIFdJTVBfUG9sbChfVEhJUywgaW50IHdhaXRUaW1lKTsKK3ZvaWQgV0lNUF9TZXRGb2N1cyhpbnQgd2luKTsKKworLyogU0RMX3Jpc2Nvc3Nwcml0ZSBmdW5jdGlvbnMgKi8KK3ZvaWQgV0lNUF9QbG90U3ByaXRlKF9USElTLCBpbnQgeCwgaW50IHkpOwordm9pZCBXSU1QX01vZGVDaGFuZ2VkKF9USElTKTsKK3ZvaWQgV0lNUF9QYWxldHRlQ2hhbmdlZChfVEhJUyk7CisKKworZXh0ZXJuIHZvaWQgV0lNUF9Qb2xsTW91c2UoX1RISVMpOworZXh0ZXJuIHZvaWQgUklTQ09TX1BvbGxLZXlib2FyZCgpOworCisjaWYgU0RMX1RIUkVBRFNfRElTQUJMRUQKKy8qIFRpbWVyIHJ1bm5pbmcgZnVuY3Rpb24gKi8KK2V4dGVybiB2b2lkIFJJU0NPU19DaGVja1RpbWVyKCk7CisjZWxzZQorZXh0ZXJuIGludCByaXNjb3NfdXNpbmdfdGhyZWFkczsKKyNlbmRpZgorCisvKiBNb3VzZSBjdXJzb3IgaGFuZGxpbmcgKi8KK2V4dGVybiB2b2lkIFdJTVBfUmVzaG93Q3Vyc29yKF9USElTKTsKK2V4dGVybiB2b2lkIFdJTVBfUmVzdG9yZVdpbXBDdXJzb3IoKTsKKworaW50IGhhc0ZvY3VzID0gMDsKK2ludCBtb3VzZUluV2luZG93ID0gMDsKKyAKKy8qIEZsYWcgdG8gZW5zdXJlIHdpbmRvdyBpcyBjb3JyZWN0IHNpemUgYWZ0ZXIgYSBtb2RlIGNoYW5nZSAqLworc3RhdGljIGludCByZXNpemVPbk9wZW4gPSAwOworCit2b2lkIFdJTVBfUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlXSU1QX1BvbGwodGhpcywgMCk7CisJaWYgKGhhc0ZvY3VzKSBSSVNDT1NfUG9sbEtleWJvYXJkKCk7CisJaWYgKG1vdXNlSW5XaW5kb3cpIFdJTVBfUG9sbE1vdXNlKHRoaXMpOworI2lmIFNETF9USFJFQURTX0RJU0FCTEVECisJaWYgKFNETF90aW1lcl9ydW5uaW5nKSBSSVNDT1NfQ2hlY2tUaW1lcigpOworI2VuZGlmCit9CisKKwordm9pZCBXSU1QX1BvbGwoX1RISVMsIGludCB3YWl0VGltZSkKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisJaW50IG1lc3NhZ2VbNjRdOworCXVuc2lnbmVkIGludCBjb2RlOworCWludCBwb2xsTWFzayA9IDA7CisJaW50IGRvUG9sbCA9IDE7CisJaW50IHN5c0V2ZW50OworCWludCBzZGxXaW5kb3cgPSB0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGU7CisKKyAgICBpZiAodGhpcy0+UHVtcEV2ZW50cyAhPSBXSU1QX1B1bXBFdmVudHMpIHJldHVybjsKKworICAgIGlmICh3YWl0VGltZSA+IDApCisgICAgeworCQlfa2VybmVsX3N3aShPU19SZWFkTW9ub3RvbmljVGltZSwgJnJlZ3MsICZyZWdzKTsKKwkJd2FpdFRpbWUgKz0gcmVncy5yWzBdOworICAgIH0KKworICAgIHdoaWxlIChkb1BvbGwpCisgICAgeworI2lmICFTRExfVEhSRUFEU19ESVNBQkxFRAorICAgICAgIC8qIFN0b3AgdGhyZWFkIGNhbGxiYWNrcyB3aGlsZSBwcm9ncmFtIGlzIHBhZ2VkIG91dCAqLworICAgICAgIGlmIChyaXNjb3NfdXNpbmdfdGhyZWFkcykgX19wdGhyZWFkX3N0b3BfdGlja2VyKCk7CisjZW5kaWYKKworICAgICAgICBpZiAod2FpdFRpbWUgPD0gMCkKKyAgICAgICAgeworICAgICAgICAJcmVncy5yWzBdID0gcG9sbE1hc2s7IC8qIFBvbGwgTWFzayAqLworICAgICAgICAJLyogRm9yIG5vIHdhaXQgdGltZSBtYXNrIG91dCBudWxsIGV2ZW50IHNvIHdlIHdhaXQgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMgKi8KKyAgICAgICAgCWlmICh3YWl0VGltZSA8IDApIHJlZ3MuclswXSB8PSAxOworICAgICAgICAJcmVncy5yWzFdID0gKGludCltZXNzYWdlOworICAgICAgICAJX2tlcm5lbF9zd2koV2ltcF9Qb2xsLCAmcmVncywgJnJlZ3MpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAJcmVncy5yWzBdID0gcG9sbE1hc2s7CisgICAgICAgIAlyZWdzLnJbMV0gPSAoaW50KW1lc3NhZ2U7CisgICAgICAgIAlyZWdzLnJbMl0gPSB3YWl0VGltZTsKKyAgICAgICAgCV9rZXJuZWxfc3dpKFdpbXBfUG9sbElkbGUsICZyZWdzLCAmcmVncyk7CisgICAgICAgIH0KKworCQkvKiBGbGFnIHRvIHNwZWNpZnkgaWYgd2UgcG9zdCBhIFNETF9TeXNXTUV2ZW50ICovCisJc3lzRXZlbnQgPSAwOworICAgICAgICAKKyAgICAgICAgY29kZSA9ICh1bnNpZ25lZCBpbnQpcmVncy5yWzBdOworCisJc3dpdGNoKGNvZGUpCisJeworICAgICAgICBjYXNlIDA6ICAvKiBOdWxsIEV2ZW50IC0gZHJvcCBvdXQgZm9yIHN0YW5kYXJkIHByb2Nlc3NpbmcqLworCSAgIGRvUG9sbCA9IDA7CisJICAgYnJlYWs7CisKKwljYXNlIDE6ICAgICAvKiBSZWRyYXcgd2luZG93ICovCisgICAgICAgICAgIF9rZXJuZWxfc3dpKFdpbXBfUmVkcmF3V2luZG93LCAmcmVncywmcmVncyk7CisJICAgaWYgKG1lc3NhZ2VbMF0gPT0gc2RsV2luZG93KQorCSAgIHsKKyAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZ3MuclswXSkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAJICAgIFdJTVBfUGxvdFNwcml0ZSh0aGlzLCBtZXNzYWdlWzFdLCBtZXNzYWdlWzJdKTsKKyAgICAgICAgICAgCSAgICBfa2VybmVsX3N3aShXaW1wX0dldFJlY3RhbmdsZSwgJnJlZ3MsICZyZWdzKTsKKyAgICAgICAgICAgICAgICAgfQorCSAgIH0gZWxzZQorCSAgeworCS8qIFRPRE86IEN1cnJlbnRseSB3ZSBqdXN0IGVhdCB0aGVtIC0gd2UgbWF5IG5lZWQgdG8gcGFzcyB0aGVtIG9uICovCisgICAgICAgIAl3aGlsZSAocmVncy5yWzBdKQorICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAgICAgX2tlcm5lbF9zd2koV2ltcF9HZXRSZWN0YW5nbGUsICZyZWdzLCAmcmVncyk7CisgICAgICAgIAl9CisJICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkKKwkJY2FzZSAyOgkJLyogT3BlbiB3aW5kb3cgKi8KKwkJICAgaWYgKCByZXNpemVPbk9wZW4gJiYgbWVzc2FnZVswXSA9PSBzZGxXaW5kb3cpCisJCSAgIHsKKwkJICAgICAgLyogRW5zdXJlIHdpbmRvdyBpcyBjb3JyZWN0IHNpemUgKi8KKwkJICAgICAgcmVzaXplT25PcGVuID0gMDsKKwkJICAgICAgbWVzc2FnZVszXSA9IG1lc3NhZ2VbMV0gKyAodGhpcy0+c2NyZWVuLT53IDw8IHRoaXMtPmhpZGRlbi0+eGVpZyk7CisJCSAgICAgIG1lc3NhZ2VbNF0gPSBtZXNzYWdlWzJdICsgKHRoaXMtPnNjcmVlbi0+aCA8PCB0aGlzLT5oaWRkZW4tPnllaWcpOyAgICAgICAKKwkJICAgfQorICAgICAgICAJX2tlcm5lbF9zd2koV2ltcF9PcGVuV2luZG93LCAmcmVncywgJnJlZ3MpOworICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkKKwkJY2FzZSAzOgkJLyogQ2xvc2Ugd2luZG93ICovCisJCQlpZiAobWVzc2FnZVswXSA9PSBzZGxXaW5kb3cpCisJCQl7CisJCQkJLyogRG9jdW1lbnRhdGlvbiBtYWtlcyBpdCBsb29rcyBhcyBpZiB0aGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkJCQkqKiAgICBpZiAoU0RMX1ByaXZhdGVRdWl0KCkgPT0gMSkgX2tlcm5lbF9zd2koV2ltcF9DbG9zZVdpbmRvdywgJnJlZ3MsICZyZWdzKTsKKwkJCQkqKiBIb3dldmVyIHNvbWUgcHJvZ3JhbXMgZG9uJ3QgcHJvY2VzcyB0aGlzIG1lc3NhZ2UgYW5kIHNvIHNpdCB0aGVyZSBpbnZpc2libHkKKwkJCQkqKiBpbiB0aGUgYmFja2dyb3VuZCBzbyBJIGp1c3QgcG9zdCB0aGUgcXVpdCBtZXNzYWdlIGFuZCBob3BlIHRoZSBhcHBsaWNhdGlvbgorCQkJCSoqIGRvZXMgdGhlIGNvcnJlY3QgdGhpbmcuCisJCQkJKi8KKwkJCQlTRExfUHJpdmF0ZVF1aXQoKTsKKwkJCX0gZWxzZQorCQkJCXN5c0V2ZW50ID0gMTsKKyAgICAgICAgCWRvUG9sbCA9IDA7CisgICAgICAgIAlicmVhazsKKworCQljYXNlIDQ6IC8qIFBvaW50ZXJfTGVhdmluZ19XaW5kb3cgKi8KKwkJCWlmIChtZXNzYWdlWzBdID09IHNkbFdpbmRvdykKKwkJCXsKKwkJCQltb3VzZUluV2luZG93ID0gMDsKKwkJCQkvL1RPRE86IExvc2UgYnV0dG9ucyAvIGRyYWdnaW5nCisJCQkJIC8qIFJlc2V0IHRvIGRlZmF1bHQgcG9pbnRlciAqLworCQkJCSBXSU1QX1Jlc3RvcmVXaW1wQ3Vyc29yKCk7CisJCQkJIFNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBNT1VTRUZPQ1VTKTsKKwkJCX0gZWxzZQorCQkJCXN5c0V2ZW50ID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgNTogLyogUG9pbnRlcl9FbnRlcmluZ19XaW5kb3cgKi8KKwkJCWlmIChtZXNzYWdlWzBdID09IHNkbFdpbmRvdykgCisJCQl7CisJCQkJbW91c2VJbldpbmRvdyA9IDE7CisJCQkJV0lNUF9SZXNob3dDdXJzb3IodGhpcyk7CisJCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOworCQkJfSBlbHNlIHN5c0V2ZW50ID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgNjoJCS8qIE1vdXNlX0NsaWNrICovCisJCQlpZiAoaGFzRm9jdXMgPT0gMCkKKwkJCXsKKwkJCSAgIC8qIEZpcnN0IGNsaWNrIGdpdmVzIGZvY3VzIGlmIGl0J3Mgbm90IGEgbWVudSAqLworCQkJICAgLyogd2Ugb25seSBjb3VudCBub24tbWVudSBjbGlja3Mgb24gYSB3aW5kb3cgdGhhdCBoYXMgdGhlIGZvY3VzICovCisJCQkgICBXSU1QX1NldEZvY3VzKG1lc3NhZ2VbM10pOworCQkJfSBlbHNlCisJCQkJZG9Qb2xsID0gMDsgLy8gU28gUG9sbE1vdXNlIGdldHMgYSBjaGFuY2UgdG8gcGljayBpdCB1cAorCQkgICBicmVhazsKKworCQljYXNlIDc6IC8qIFVzZXJfRHJhZ19Cb3ggLSBVc2VkIGZvciBtb3VzZSByZWxlYXNlICovCisJCQkvL1RPRE86IE1heSBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGluIHRoZSBmdXR1cmUKKwkJCXN5c0V2ZW50ID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgODogLyogS2V5cHJlc3NlZCAqLworCQkJZG9Qb2xsID0gMDsgLyogUG9sbEtleWJvYXJkIHNob3VsZCBwaWNrIGl0IHVwICovCisJCQlpZiAobWVzc2FnZVswXSAhPSBzZGxXaW5kb3cpIHN5c0V2ZW50ID0gMTsKKwkJCS8qVE9ETzogTWF5IHdhbnQgdG8gYWx3YXlzIHBhc3MgRjEyIGV0YyB0byB0aGUgd2ltcAorCQkJeworCQkJCXJlZ3MuclswXSA9IG1lc3NhZ2VbNl07CisJCQkJX2tlcm5lbF9zd2koV2ltcF9Qcm9jZXNzS2V5LCAmcmVncywgJnJlZ3MpOworCQkJfQorCQkJKi8KKwkJCWJyZWFrOworCisJCWNhc2UgMTE6IC8qIExvc2UgQ2FyZXQgKi8KKwkJCSBoYXNGb2N1cyA9IDA7CisJCQkgaWYgKG1lc3NhZ2VbMF0gPT0gc2RsV2luZG93KSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQSU5QVVRGT0NVUyk7CisJCQkgZWxzZSBzeXNFdmVudCA9IDE7CisJCQkgYnJlYWs7CisKKwkJY2FzZSAxMjogLyogR2FpbiBDYXJldCAqLworCQkJIGhhc0ZvY3VzID0gMTsKKwkJCSBpZiAobWVzc2FnZVswXSA9PSBzZGxXaW5kb3cpIFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBJTlBVVEZPQ1VTKTsKKwkJCSBlbHNlIHN5c0V2ZW50ID0gMTsKKwkJCSBicmVhazsKKyAgICAgICAgCQorCQljYXNlIDE3OgorCQljYXNlIDE4OgorCQkJc3lzRXZlbnQgPSAxOyAvKiBBbGwgbWVzc2FnZXMgYXJlIHBhc3NlZCBvbiAqLworCisJCQlzd2l0Y2gobWVzc2FnZVs0XSkKKwkJCXsKKwkJCWNhc2UgMDogLyogUXVpdCBFdmVudCAqLworCQkJCS8qIE5vIGNob2ljZSAtIGhhdmUgdG8gcXVpdCAqLworCQkJICAgU0RMX1F1aXQoKTsKKyAgICAgICAgCSAgIGV4aXQoMCk7CisJCQkgICBicmVhazsKKworCQkJY2FzZSA4OiAvKiBQcmUgUXVpdCAqLworCQkJCVNETF9Qcml2YXRlUXVpdCgpOworCQkJCWJyZWFrOworCisJCQljYXNlIDB4NDAwYzE6IC8qIE1vZGUgY2hhbmdlICovCisJCQkJV0lNUF9Nb2RlQ2hhbmdlZCh0aGlzKTsKKwkJCQlyZXNpemVPbk9wZW4gPSAxOworCQkJCWJyZWFrOworCisJCQljYXNlIDk6ICAgICAgLyogUGFsZXR0ZSBjaGFuZ2VkICovCisJCQkJV0lNUF9QYWxldHRlQ2hhbmdlZCh0aGlzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBQYXNzIHVua25vd24gZXZlbnRzIG9uICovCisJCQlzeXNFdmVudCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzeXNFdmVudCkKKwkJeworCSAgICAgICAgU0RMX1N5c1dNbXNnIHdtbXNnOworCisJCQlTRExfVkVSU0lPTigmd21tc2cudmVyc2lvbik7CisJCQl3bW1zZy5ldmVudENvZGUgPSBjb2RlOworCQkJU0RMX21lbWNweSh3bW1zZy5wb2xsQmxvY2ssIG1lc3NhZ2UsIDY0ICogc2l6ZW9mKGludCkpOworCisJCQkvKiBGYWxsIG91dCBvZiBwb2xsaW5nIGxvb3AgaWYgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgcG9zdGVkICovCisJCQlpZiAoU0RMX1ByaXZhdGVTeXNXTUV2ZW50KCZ3bW1zZykpIGRvUG9sbCA9IDA7CisJCX0KKyNpZiAhU0RMX1RIUkVBRFNfRElTQUJMRUQKKwkJaWYgKHJpc2Nvc191c2luZ190aHJlYWRzKQorCQl7CisgICAgICAgICAgICAgICAgICAgLyogUmVzdGFydCB0aWNrZXIgaGVyZSBzbyBvdGhlciB0aHJlYWQgY2FuIG5vdCBpbnRlcmZlcmUKKyAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBSZWRyYXcgcHJvY2Vzc2luZyAqLworCQkgICBpZiAocmlzY29zX3VzaW5nX3RocmVhZHMpIF9fcHRocmVhZF9zdGFydF90aWNrZXIoKTsKKyAgICAgICAgICAgICAgICAgICAvKiBHaXZlIG90aGVyIHRocmVhZHMgYSBiZXR0ZXIgY2hhbmNlIG9mIHJ1bm5pbmcgKi8KKwkJICAgcHRocmVhZF95aWVsZCgpOworCQl9CisjZW5kaWYKKyAgICB9Cit9CisKKy8qIFNldCBmb2N1cyB0byBzcGVjaWZpZWQgd2luZG93ICovCit2b2lkIFdJTVBfU2V0Rm9jdXMoaW50IHdpbikKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisKKwlyZWdzLnJbMF0gPSB3aW47CisJcmVncy5yWzFdID0gLTE7IC8qIEljb24gaGFuZGxlICovCisJcmVncy5yWzJdID0gMDsgIC8qIFgtb2Zmc2V0IHdlIGp1c3QgcHV0IGl0IGF0IHBvc2l0aW9uIDAgKi8KKwlyZWdzLnJbM10gPSAwOyAgLyogWS1vZmZzZXQgYXMgYWJvdmUgKi8KKwlyZWdzLnJbNF0gPSAxIDw8IDI1OyAvKiBDYXJldCBpcyBpbnZpc2libGUgKi8KKwlyZWdzLnJbNV0gPSAwOyAgLyogaW5kZXggaW50byBzdHJpbmcgKi8KKworCV9rZXJuZWxfc3dpKFdpbXBfU2V0Q2FyZXRQb3NpdGlvbiwgJnJlZ3MsICZyZWdzKTsKK30KKworLyoqIFJ1biBiYWNrZ3JvdW5kIHRhc2sgd2hpbGUgaW4gYSBzbGVlcCBjb21tYW5kICovCit2b2lkIFJJU0NPU19CYWNrZ3JvdW5kVGFza3Modm9pZCkKK3sKKwlpZiAoY3VycmVudF92aWRlbyAmJiBjdXJyZW50X3ZpZGVvLT5oaWRkZW4tPndpbmRvd19oYW5kbGUpCisJeworCQlXSU1QX1BvbGwoY3VycmVudF92aWRlbywgMCk7CisJfQorI2lmIFNETF9USFJFQURTX0RJU0FCTEVECisJaWYgKFNETF90aW1lcl9ydW5uaW5nKSBSSVNDT1NfQ2hlY2tUaW1lcigpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfd2ltcHZpZGVvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3Jpc2Nvcy9TRExfd2ltcHZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5YzU0NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vcmlzY29zL1NETF93aW1wdmlkZW8uYwpAQCAtMCwwICsxLDUwMSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisgICAgIEZpbGUgYWRkZWQgYnkgQWxhbiBCdWNrbGV5IChhbGFuX2JhYUBob3RtYWlsLmNvbSkgZm9yIFJJU0MgT1MgY29tcGF0YWJpbGl0eQorCSAyNyBNYXJjaCAyMDAzCisKKyAgICAgSW1wbGVtZW50cyBSSVNDIE9TIFdpbXAgZGlzcGxheS4KKyovCisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisKKyNpbmNsdWRlICJTRExfcmlzY29zdGFzay5oIgorI2luY2x1ZGUgIlNETF9yaXNjb3N2aWRlby5oIgorI2luY2x1ZGUgIlNETF9yaXNjb3NldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9yaXNjb3Ntb3VzZV9jLmgiCisKKyNpbmNsdWRlICJrZXJuZWwuaCIKKyNpbmNsdWRlICJzd2lzLmgiCisKKy8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworU0RMX1JlY3QgKipXSU1QX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CitTRExfU3VyZmFjZSAqV0lNUF9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitpbnQgV0lNUF9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpOwordm9pZCBXSU1QX1NldFdNQ2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pOworCisKK2V4dGVybiB1bnNpZ25lZCBjaGFyICpXSU1QX0NyZWF0ZUJ1ZmZlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApOworZXh0ZXJuIHZvaWQgV0lNUF9QdW1wRXZlbnRzKF9USElTKTsKK2V4dGVybiB2b2lkIFdJTVBfUGxvdFNwcml0ZShfVEhJUywgaW50IHgsIGludCB5KTsKK2V4dGVybiB2b2lkIFdJTVBfU2V0dXBQbG90SW5mbyhfVEhJUyk7CitleHRlcm4gdm9pZCBXSU1QX1NldEZvY3VzKGludCB3aW4pOworCisvKiBldGMuICovCitzdGF0aWMgdm9pZCBXSU1QX1VwZGF0ZVJlY3RzKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKKy8qIFJJU0MgT1MgV2ltcCBoYW5kbGluZyBoZWxwZXJzICovCit2b2lkIFdJTVBfUmVhZE1vZGVJbmZvKF9USElTKTsKK3Vuc2lnbmVkIGludCBXSU1QX1NldHVwV2luZG93KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7Cit2b2lkIFdJTVBfU2V0RGV2aWNlTW9kZShfVEhJUyk7Cit2b2lkIFdJTVBfRGVsZXRlV2luZG93KF9USElTKTsKKworLyogRlVMTFNDUkVFTiBmdW5jdGlvbiByZXF1aXJlZCBmb3Igd2ltcC9mdWxsc2NyZWVuIHRvZ2dsaW5nICovCitleHRlcm4gaW50IEZVTExTQ1JFRU5fU2V0TW9kZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApOworCisvKiBDdXJyZW50bHkgbmVlZCB0byBzZXQgdGhpcyB1cCBoZXJlIGFzIGl0IG9ubHkgd29ya3MgaWYgeW91CisgICBzdGFydCB1cCBpbiBhIFdpbXAgbW9kZSAqLworZXh0ZXJuIGludCBSSVNDT1NfVG9nZ2xlRnVsbFNjcmVlbihfVEhJUywgaW50IGZ1bGxzY3JlZW4pOworCitleHRlcm4gaW50IHJpc2Nvc19iYWNrYnVmZmVyOworZXh0ZXJuIGludCBtb3VzZUluV2luZG93OworZXh0ZXJuIGludCByaXNjb3NfY2xvc2VhY3Rpb247CisKKy8qIEZvbGxvd2luZyBuZWVkZWQgdG8gZW5zdXJlIHdpbmRvdyBpcyBzaG93biBpbW1lZGlhdGVseSAqLworZXh0ZXJuIGludCBoYXNGb2N1czsKK2V4dGVybiB2b2lkIFdJTVBfUG9sbChfVEhJUywgaW50IHdhaXRUaW1lKTsKKworU0RMX1N1cmZhY2UgKldJTVBfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKyAgIFVpbnQzMiBSbWFzayA9IDA7CisgICBVaW50MzIgR21hc2sgPSAwOworICAgVWludDMyIEJtYXNrID0gMDsKKyAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICBpbnQgYnl0ZXNQZXJQaXhlbCA9IDE7CisKKyAgIC8qIERvbid0IHN1cHBvcnQgZG91YmxlIGJ1ZmZlcmluZyBpbiBXaW1wIG1vZGUgKi8KKyAgIGZsYWdzICY9IH5TRExfRE9VQkxFQlVGOworICAgZmxhZ3MgJj0gflNETF9IV1NVUkZBQ0U7CisKKyAgIHN3aXRjaChicHApCisgICB7CisJY2FzZSA4OgorCQkvKiBFbXVsYXRlZCBwYWxldHRlIHVzaW5nIENvbG91clRyYW5zICovCisJCWZsYWdzIHw9IFNETF9IV1BBTEVUVEU7CisJCWJyZWFrOworCisJY2FzZSAxNToKKwljYXNlIDE2OgorCQlCbWFzayA9IDB4MDAwMDdjMDA7CisJCUdtYXNrID0gMHgwMDAwMDNlMDsKKwkJUm1hc2sgPSAweDAwMDAwMDFmOworCQlieXRlc1BlclBpeGVsID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQlCbWFzayA9IDB4MDBmZjAwMDA7CisJCUdtYXNrID0gMHgwMDAwZmYwMDsKKwkJUm1hc2sgPSAweDAwMDAwMGZmOworCQlieXRlc1BlclBpeGVsID0gNDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlTRExfU2V0RXJyb3IoIlBpeGVsIGRlcHRoIG5vdCBzdXBwb3J0ZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJCWJyZWFrOworICAgfQorCisvKiAJcHJpbnRmKCJTZXR0aW5nIG1vZGUgJWR4JWRcbiIsIHdpZHRoLCBoZWlnaHQpOyovCisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgdGhlIHNjcmVlbiAqLworCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBicHAsIFJtYXNrLCBHbWFzaywgQm1hc2ssIDApICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGFsbG9jYXRlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHJlcXVlc3RlZCBtb2RlIik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCisJY3VycmVudC0+dyA9IHdpZHRoOworCXRoaXMtPmhpZGRlbi0+aGVpZ2h0ID0gY3VycmVudC0+aCA9IGhlaWdodDsKKworCWlmIChicHAgPT0gMTUpIGJwcCA9IDE2OworCWJ1ZmZlciA9IFdJTVBfQ3JlYXRlQnVmZmVyKHdpZHRoLCBoZWlnaHQsIGJwcCk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgc3ByaXRlIGZvciB2aWRlbyBtZW1vcnkiKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwl0aGlzLT5oaWRkZW4tPmJhbmtbMF0gPSBidWZmZXIgKyA2MDsgLyogU3RhcnQgb2Ygc3ByaXRlIGRhdGEgKi8KKwlpZiAoYnBwID09IDgpIHRoaXMtPmhpZGRlbi0+YmFua1swXSArPSAyMDQ4OyAvKiA4YnBwIHNwcml0ZSBoYXZlIHBhbGV0dGUgZmlyc3QgKi8KKworCXRoaXMtPmhpZGRlbi0+YmFua1sxXSA9IGJ1ZmZlcjsgICAgICAvKiBTdGFydCBvZiBidWZmZXIgKi8KKworCS8qIFJlbWVtYmVyIHNwcml0ZSBidWZmZXIgc28gaXQgY2FuIGJlIGZyZWVkIGxhdGVyICovCisJaWYgKHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuaykgU0RMX2ZyZWUodGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rKTsKKwl0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmsgPSBidWZmZXI7CisKKwljdXJyZW50LT5waXRjaCA9IHdpZHRoICogYnl0ZXNQZXJQaXhlbDsKKwlpZiAoKGN1cnJlbnQtPnBpdGNoICYgMykpCisJeworCQkvKiBTcHJpdGVzIGFyZSAzMmJpdCB3b3JkIGFsaWduZWQgKi8KKwkJY3VycmVudC0+cGl0Y2ggKz0gKDQgLSAoY3VycmVudC0+cGl0Y2ggJiAzKSk7CisJfQorCisgIAljdXJyZW50LT5mbGFncyA9IGZsYWdzIHwgU0RMX1BSRUFMTE9DOworCisJV0lNUF9SZWFkTW9kZUluZm8odGhpcyk7CisJCisgICAgU0RMX21lbXNldCh0aGlzLT5oaWRkZW4tPmJhbmtbMF0sIDAsIGhlaWdodCAqIGN1cnJlbnQtPnBpdGNoKTsKKworCXRoaXMtPmhpZGRlbi0+Y3VycmVudF9iYW5rID0gMDsKKwljdXJyZW50LT5waXhlbHMgPSB0aGlzLT5oaWRkZW4tPmJhbmtbMF07CisKKworCWlmIChXSU1QX1NldHVwV2luZG93KHRoaXMsIGN1cnJlbnQpID09IDApCisJeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgd2luZG93IHRvIGRpc3BsYXkgc3VyZmFjZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBSZXNldCBkZXZpY2UgZnVuY3Rpb25zIGZvciB0aGUgd2ltcCAqLworCVdJTVBfU2V0RGV2aWNlTW9kZSh0aGlzKTsKKworCS8qIE5lZWRzIHRvIHNldCB1cCBwbG90IGluZm8gYWZ0ZXIgd2luZG93IGhhcyBiZWVuIGNyZWF0ZWQgKi8KKwkvKiBOb3Qgc3VyZSB3aHksIGJ1dCBwbG90cyBkb24ndCB3b3JrIGlmIEkgZG8gaXQgZWFybGllciAqLworCVdJTVBfU2V0dXBQbG90SW5mbyh0aGlzKTsKKworCS8qIFBvbGwgdW50aWwgd2luZG93IGlzIHNob3duICovCisJeworCSAgIC8qIFdlIHdhaXQgdW50aWwgaXQgZ2V0cyB0aGUgZm9jdXMsIGJ1dCBnaXZlIHVwIGFmdGVyIDUgc2Vjb25kcworCSAgICAgIGluIGNhc2UgdGhlIGZvY3VzIGlzIHByZXZlbnRlZCBpbiBhbnkgd2F5LgorCSAgICovCisJICAgVWludDMyIG5vdyA9IFNETF9HZXRUaWNrcygpOworCSAgIHdoaWxlICghaGFzRm9jdXMgJiYgU0RMX0dldFRpY2tzKCkgLSBub3cgPCA1MDAwKQorCSAgIHsKKwkgICAgICBXSU1QX1BvbGwodGhpcywgMCk7CisJICAgfQorCX0KKworCS8qIFdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4oY3VycmVudCk7Cit9CisKKwordm9pZCBXSU1QX1JlYWRNb2RlSW5mbyhfVEhJUykKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisJaW50IHZhcnNbNl07CisJaW50IHZhbHNbNV07CisKKwl2YXJzWzBdID0gNDsgIC8qIFhFaWcgKi8KKwl2YXJzWzFdID0gNTsgIC8qIFlFaWcgKi8KKwl2YXJzWzJdID0gOTsgIC8qIExvZyBiYXNlIDIgYnBwICovCisJdmFyc1szXSA9IDExOyAvKiBTY3JlZW4gV2lkdGggLSAxICovCisJdmFyc1s0XSA9IDEyOyAvKiBTY3JlZW4gRGVwdGggLSAxICovCisJdmFyc1s1XSA9IC0xOyAvKiBUZXJtaW5hdGUgbGlzdCAqLworCisJcmVncy5yWzBdID0gKGludCl2YXJzOworCXJlZ3MuclsxXSA9IChpbnQpdmFsczsKKwlfa2VybmVsX3N3aShPU19SZWFkVmR1VmFyaWFibGVzLCAmcmVncywgJnJlZ3MpOworCXRoaXMtPmhpZGRlbi0+eGVpZyA9IHZhbHNbMF07CisJdGhpcy0+aGlkZGVuLT55ZWlnID0gdmFsc1sxXTsKKwl0aGlzLT5oaWRkZW4tPnNjcmVlbl9icHAgPSAxIDw8IHZhbHNbMl07CisJdGhpcy0+aGlkZGVuLT5zY3JlZW5fd2lkdGggPSB2YWxzWzNdICsgMTsKKwl0aGlzLT5oaWRkZW4tPnNjcmVlbl9oZWlnaHQgPSB2YWxzWzRdICsgMTsKK30KKworLyogU2V0IGRldmljZSBmdW5jdGlvbiB0byBjYWxsIHRoZSBjb3JyZWN0IHZlcnNpb25zIGZvciBydW5uaW5nCisgICBpbiBhIHdpbXAgd2luZG93ICovCisKK3ZvaWQgV0lNUF9TZXREZXZpY2VNb2RlKF9USElTKQoreworCWlmICh0aGlzLT5VcGRhdGVSZWN0cyA9PSBXSU1QX1VwZGF0ZVJlY3RzKSByZXR1cm47IC8qIEFscmVhZHkgc2V0IHVwICovCisKKwl0aGlzLT5TZXRDb2xvcnMgICA9IFdJTVBfU2V0Q29sb3JzOworCXRoaXMtPlVwZGF0ZVJlY3RzID0gV0lNUF9VcGRhdGVSZWN0czsKKworCXRoaXMtPkZsaXBIV1N1cmZhY2UgPSBOVUxMOworCisJdGhpcy0+U2V0Q2FwdGlvbiA9IFdJTVBfU2V0V01DYXB0aW9uOworCXRoaXMtPlNldEljb24gPSBOVUxMOworCXRoaXMtPkljb25pZnlXaW5kb3cgPSBOVUxMOworCQorCXRoaXMtPlNob3dXTUN1cnNvciA9IFdJTVBfU2hvd1dNQ3Vyc29yOworCXRoaXMtPldhcnBXTUN1cnNvciA9IFdJTVBfV2FycFdNQ3Vyc29yOworCisgICAgICAgIHRoaXMtPlRvZ2dsZUZ1bGxTY3JlZW4gPSBSSVNDT1NfVG9nZ2xlRnVsbFNjcmVlbjsKKworCXRoaXMtPlB1bXBFdmVudHMgPSBXSU1QX1B1bXBFdmVudHM7CQorfQorCisvKiBTZXR1cCB0aGUgV2luZG93IHRvIGRpc3BsYXkgdGhlIHN1cmZhY2UgKi8KK3Vuc2lnbmVkIGludCBXSU1QX1NldHVwV2luZG93KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisJaW50IHdpbmRvd19kYXRhWzIzXTsKKyAgICBpbnQJKndpbmRvd19ibG9jayA9IHdpbmRvd19kYXRhKzE7CisJaW50IHggPSAodGhpcy0+aGlkZGVuLT5zY3JlZW5fd2lkdGggLSBzdXJmYWNlLT53KSAvIDI7CisJaW50IHkgPSAodGhpcy0+aGlkZGVuLT5zY3JlZW5faGVpZ2h0IC0gc3VyZmFjZS0+aCkgLyAyOworCWludCB4ZWlnID0gdGhpcy0+aGlkZGVuLT54ZWlnOworCWludCB5ZWlnID0gdGhpcy0+aGlkZGVuLT55ZWlnOworCisgICAgbW91c2VJbldpbmRvdyA9IDA7CisgICAgCisJLyogQWx3YXlzIGRlbGV0ZSB0aGUgd2luZG93IGFuZCByZWNyZWF0ZSBvbiBhIGNoYW5nZSAqLworCWlmICh0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGUpIFdJTVBfRGVsZXRlV2luZG93KHRoaXMpOworCisJLyogU2V0dXAgd2luZG93IGNvLW9yZGluYXRlcyAqLworICAgd2luZG93X2Jsb2NrWzBdID0geCA8PCB4ZWlnOworICAgd2luZG93X2Jsb2NrWzFdID0geSA8PCB5ZWlnOworICAgd2luZG93X2Jsb2NrWzJdID0gd2luZG93X2Jsb2NrWzBdICsgKHN1cmZhY2UtPncgPDwgeGVpZyk7CisgICB3aW5kb3dfYmxvY2tbM10gPSB3aW5kb3dfYmxvY2tbMV0gKyAoc3VyZmFjZS0+aCA8PCB5ZWlnKTsKKworICAgCisgICB3aW5kb3dfYmxvY2tbNF0gPSAwOwkJCQkgIC8qIFNjcm9sbCBvZmZzZXRzICovCisgICB3aW5kb3dfYmxvY2tbNV0gPSAwOworICAgd2luZG93X2Jsb2NrWzZdID0gLTE7CQkJICAvKiBPcGVuIG9uIHRvcCBvZiB3aW5kb3cgc3RhY2sgKi8KKworICAgd2luZG93X2Jsb2NrWzddID0gMHg4NTA0MDA0MjsgICAgICAvKiBXaW5kb3cgZmxhZ3MgKi8KKyAgIGlmIChyaXNjb3NfY2xvc2VhY3Rpb24gIT0gMCkgd2luZG93X2Jsb2NrWzddIHw9IDB4MjAwMDAwMDsKKworICAgLyogVE9ETzogVGFrZSBpbnRvIGFjY291bnQgc3VyZmFjZS0+ZmxhZ3MgKi8KKworICAgd2luZG93X2Jsb2NrWzhdID0gMHhmZjA3MDIwNzsgICAgICAvKiBXaW5kb3cgY29sb3VycyAqLworICAgd2luZG93X2Jsb2NrWzldID0gMHgwMDBjMDEwMzsKKyAgIHdpbmRvd19ibG9ja1sxMF0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogV29yayBhcmVhIG1pbmltdW0gKi8KKyAgIHdpbmRvd19ibG9ja1sxMV0gPSAtc3VyZmFjZS0+aCA8PCB5ZWlnOworICAgd2luZG93X2Jsb2NrWzEyXSA9IHN1cmZhY2UtPncgPDwgeGVpZzsgICAvKiBXb3JrIGFyZWEgbWF4aW11bSAqLworICAgd2luZG93X2Jsb2NrWzEzXSA9IDA7CisgICB3aW5kb3dfYmxvY2tbMTRdID0gMHgyNzAwMDEzZDsgICAgLyogVGl0bGUgaWNvbiBmbGFncyAqLworICAgd2luZG93X2Jsb2NrWzE1XSA9IDB4MDAwMDMwMDA7CSAvKiBXb3JrIGFyZWEgZmxhZ3MgLSBNb3VzZSBjbGljayBkb3duIHJlcG9ydGVkICovCisgICB3aW5kb3dfYmxvY2tbMTZdID0gMTsgICAgICAgICAgICAgLyogU3ByaXRlIGFyZWEgY29udHJvbCBibG9jayBwb2ludGVyICovCisgICB3aW5kb3dfYmxvY2tbMTddID0gMHgwMDEwMDAxMDsJIC8qIE1pbmltdW0gd2luZG93IHNpemUgKHdpZHRoICYgaGVpZ2h0KSAoMTZ4MTYpKi8KKyAgIHdpbmRvd19ibG9ja1sxOF0gPSAoaW50KXRoaXMtPmhpZGRlbi0+dGl0bGU7ICAgIC8qIFRpdGxlIGRhdGEgKi8KKyAgIHdpbmRvd19ibG9ja1sxOV0gPSAtMTsKKyAgIHdpbmRvd19ibG9ja1syMF0gPSAyNTY7CisgICB3aW5kb3dfYmxvY2tbMjFdID0gMDsJCQkgLyogTnVtYmVyIG9mIGljb25zICovCisKKyAgIHJlZ3MuclsxXSA9ICh1bnNpZ25lZCBpbnQpKHdpbmRvd19ibG9jayk7CisgICAKKyAgIC8qIENyZWF0ZSB0aGUgd2luZG93ICovCisgICBpZiAoX2tlcm5lbF9zd2koV2ltcF9DcmVhdGVXaW5kb3csICZyZWdzLCAmcmVncykgPT0gTlVMTCkKKyAgIHsKKwkgICB0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGUgPSB3aW5kb3dfZGF0YVswXSA9IHJlZ3MuclswXTsKKworCSAgIC8qIFNob3cgdGhlIHdpbmRvdyBvbiB0aGUgc2NyZWVuICovCisJICAgcmVncy5yWzFdID0gKHVuc2lnbmVkIGludCl3aW5kb3dfZGF0YTsKKyAgICAgICBpZiAoX2tlcm5lbF9zd2koV2ltcF9PcGVuV2luZG93LCAmcmVncywgJnJlZ3MpID09IE5VTEwpCisgICAgICAgeworICAgICAgICAgIFdJTVBfU2V0Rm9jdXModGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlKTsKKyAgICAgICB9IGVsc2UKKyAgICAgICB7CisJCSAgV0lNUF9EZWxldGVXaW5kb3codGhpcyk7CisJICAgfQorICAgfQorICAgCisgICByZXR1cm4gdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlOworfQorCisvKiBEZXN0cm95IHRoZSBXaW5kb3cgKi8KKwordm9pZCBXSU1QX0RlbGV0ZVdpbmRvdyhfVEhJUykKK3sKKwlfa2VybmVsX3N3aV9yZWdzIHJlZ3M7CisgICAgcmVncy5yWzFdID0gKHVuc2lnbmVkIGludCkmKHRoaXMtPmhpZGRlbi0+d2luZG93X2hhbmRsZSk7CisJX2tlcm5lbF9zd2koV2ltcF9EZWxldGVXaW5kb3csICZyZWdzLCAmcmVncyk7CisJdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlID0gMDsKK30KKworCit2b2lkIFdJTVBfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCV9rZXJuZWxfc3dpX3JlZ3MgcmVnczsKKwlpbnQgdXBkYXRlX2Jsb2NrWzEyXTsKKwlpbnQgeGVpZyA9IHRoaXMtPmhpZGRlbi0+eGVpZzsKKwlpbnQgeWVpZyA9IHRoaXMtPmhpZGRlbi0+eWVpZzsKKwlpbnQgajsKKwl1cGRhdGVfYmxvY2tbMF0gPSB0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGU7CisKKwlmb3IgKGogPSAwOyBqIDwgbnVtcmVjdHM7IGorKykKKwl7CisJCXVwZGF0ZV9ibG9ja1sxXSA9IHJlY3RzW2pdLnggPDwgeGVpZzsgLyogTWluIFggKi8KKwkJdXBkYXRlX2Jsb2NrWzRdID0gLShyZWN0c1tqXS55IDw8IHllaWcpOworCQl1cGRhdGVfYmxvY2tbM10gPSB1cGRhdGVfYmxvY2tbMV0gKyAocmVjdHNbal0udyA8PCB4ZWlnKTsKKwkJdXBkYXRlX2Jsb2NrWzJdID0gdXBkYXRlX2Jsb2NrWzRdIC0gKHJlY3RzW2pdLmggPDwgeWVpZyk7CisKKwkJcmVncy5yWzFdID0gKGludCl1cGRhdGVfYmxvY2s7CisJCS8qIFVwZGF0ZSB3aW5kb3cgY2FuIGZhaWwgaWYgY2FsbGVkIGJlZm9yZSBmaXJzdCBwb2xsICovCisJCWlmIChfa2VybmVsX3N3aShXaW1wX1VwZGF0ZVdpbmRvdywgJnJlZ3MsICZyZWdzKSA9PSAwKQorCQl7CisJCQl3aGlsZSAocmVncy5yWzBdKQorCQkJeworCQkJCVdJTVBfUGxvdFNwcml0ZSh0aGlzLCB1cGRhdGVfYmxvY2tbMV0sIHVwZGF0ZV9ibG9ja1syXSk7CisJCQkJX2tlcm5lbF9zd2koV2ltcF9HZXRSZWN0YW5nbGUsICZyZWdzLCAmcmVncyk7CisJCQl9CisJCX0KKwl9Cit9CisKKworaW50IFdJTVBfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworICAgdW5zaWduZWQgaW50ICpwYWwgPSAodW5zaWduZWQgaW50ICopKHRoaXMtPmhpZGRlbi0+YmFua1sxXSs2MCk7CisgICBpbnQgajsKKyAgIFNETF9SZWN0IHVwZGF0ZTsKKworICAgcGFsICs9IGZpcnN0Y29sb3IqMjsKKyAgIGZvciAoaiA9IDA7IGogPCBuY29sb3JzOyBqKyspCisgICB7CisgICAgICAqcGFsID0gKCgodW5zaWduZWQgaW50KWNvbG9ycy0+cikgPDwgOCkKKyAgICAgICAgICAgICArICgoKHVuc2lnbmVkIGludCljb2xvcnMtPmcpIDw8IDE2KQorICAgICAgICAgICAgICsgKCgodW5zaWduZWQgaW50KWNvbG9ycy0+YikgPDwgMjQpOworICAgICAgcGFsWzFdID0gKnBhbDsKKyAgICAgIHBhbCArPSAyOworICAgICAgY29sb3JzKys7CisgICB9CisKKyAgIFdJTVBfU2V0dXBQbG90SW5mbyh0aGlzKTsKKworICAgLyogTmVlZCB0byByZWZyZXNoIHRoZSB3aW5kb3cgKi8KKyAgIHVwZGF0ZS54ID0gMDsKKyAgIHVwZGF0ZS55ID0gMDsKKyAgIHVwZGF0ZS53ID0gU0RMX1ZpZGVvU3VyZmFjZS0+dzsKKyAgIHVwZGF0ZS5oID0gU0RMX1ZpZGVvU3VyZmFjZS0+aDsKKyAgIFdJTVBfVXBkYXRlUmVjdHModGhpcywgMSwgJnVwZGF0ZSk7CisgICAgICAKKwlyZXR1cm4gMTsKK30KKwordm9pZCBXSU1QX1NldFdNQ2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pCit7CisJX2tlcm5lbF9zd2lfcmVncyByZWdzOworCisJU0RMX3N0cmxjcHkodGhpcy0+aGlkZGVuLT50aXRsZSwgdGl0bGUsIFNETF9hcnJheXNpemUodGhpcy0+aGlkZGVuLT50aXRsZSkpOworCisJaWYgKFJJU0NPU19HZXRXaW1wVmVyc2lvbigpIDwgMzgwKQorCXsKKwkJaW50IGJsb2NrWzZdOworCisJCXJlZ3MuclsxXSA9IChpbnQpYmxvY2s7CisJCV9rZXJuZWxfc3dpKFdpbXBfR2V0Q2FyZXRQb3NpdGlvbiwgJnJlZ3MsICZyZWdzKTsKKwkJaWYgKGJsb2NrWzBdID09IChpbnQpdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlKQorCQl7CisJCQlyZWdzLnJbMF0gPSAtMTsKKwkJCV9rZXJuZWxfc3dpKFdpbXBfU2V0Q2FyZXRQb3NpdGlvbiwgJnJlZ3MsJnJlZ3MpOworCQl9IGVsc2UKKwkJeworCQkJcmVncy5yWzBdID0gdGhpcy0+aGlkZGVuLT53aW5kb3dfaGFuZGxlOworCQkJcmVncy5yWzFdID0gLTE7CisJCQlyZWdzLnJbMl0gPSAtMTsKKwkJCXJlZ3MuclszXSA9IC0xOworCQkJX2tlcm5lbF9zd2koV2ltcF9TZXRDYXJldFBvc2l0aW9uLCAmcmVncywmcmVncyk7CisJCX0KKwkJcmVncy5yWzBdID0gYmxvY2tbMF07CisJCXJlZ3MuclsxXSA9IGJsb2NrWzFdOworCQlyZWdzLnJbMl0gPSBibG9ja1syXTsKKwkJcmVncy5yWzNdID0gYmxvY2tbM107CisJCXJlZ3Mucls0XSA9IGJsb2NrWzRdOworCQlyZWdzLnJbNV0gPSBibG9ja1s1XTsKKwkJX2tlcm5lbF9zd2koV2ltcF9TZXRDYXJldFBvc2l0aW9uLCAmcmVncywmcmVncyk7CisJfSBlbHNlCisJeworCQlyZWdzLnJbMF0gPSB0aGlzLT5oaWRkZW4tPndpbmRvd19oYW5kbGU7CisJCXJlZ3MuclsxXSA9IDB4NGI1MzQxNTQ7IC8qICJUQVNLIiAqLworCQlyZWdzLnJbMl0gPSAzOyAvKiBSZWRyYXcgdGl0bGUgKi8KKwkJX2tlcm5lbF9zd2koV2ltcF9Gb3JjZVJlZHJhdywgJnJlZ3MsICZyZWdzKTsKKwl9Cit9CisKK3ZvaWQgV0lNUF9SZWZyZXNoRGVza3RvcChfVEhJUykKK3sKKyAgIGludCB3aWR0aCA9IHRoaXMtPmhpZGRlbi0+c2NyZWVuX3dpZHRoIDw8IHRoaXMtPmhpZGRlbi0+eGVpZzsKKyAgIGludCBoZWlnaHQgPSB0aGlzLT5oaWRkZW4tPnNjcmVlbl9oZWlnaHQgPDwgdGhpcy0+aGlkZGVuLT55ZWlnOworICAgX2tlcm5lbF9zd2lfcmVncyByZWdzOworICAgcmVncy5yWzBdID0gLTE7IC8qIFdob2xlIHNjcmVlbiAqLworICAgcmVncy5yWzFdID0gMDsKKyAgIHJlZ3MuclsyXSA9IDA7CisgICByZWdzLnJbM10gPSB3aWR0aDsKKyAgIHJlZ3Mucls0XSA9IGhlaWdodDsKKyAgIF9rZXJuZWxfc3dpKFdpbXBfRm9yY2VSZWRyYXcsICZyZWdzLCAmcmVncyk7Cit9CisKKy8qIFRvZ2dsZSB0byB3aW5kb3cgZnJvbSBmdWxsIHNjcmVlbiAqLworaW50IFdJTVBfVG9nZ2xlRnJvbUZ1bGxTY3JlZW4oX1RISVMpCit7ICAgICAKKyAgIGludCB3aWR0aCA9IHRoaXMtPnNjcmVlbi0+dzsKKyAgIGludCBoZWlnaHQgPSB0aGlzLT5zY3JlZW4tPmg7CisgICBpbnQgYnBwID0gdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKKyAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICBjaGFyICpvbGRfYmFua1syXTsKKyAgIGNoYXIgKm9sZF9hbGxvY19iYW5rOworCisgICAvKiBFbnN1cmUgZmxhZ3MgYXJlIE9LICovCisgICB0aGlzLT5zY3JlZW4tPmZsYWdzICY9IH4oU0RMX0RPVUJMRUJVRnxTRExfSFdTVVJGQUNFKTsKKworICAgaWYgKHRoaXMtPmhpZGRlbi0+YmFua1swXSA9PSB0aGlzLT5oaWRkZW4tPmFsbG9jX2JhbmsgfHwgcmlzY29zX2JhY2tidWZmZXIgPT0gMCkKKyAgIHsKKyAgICAgIC8qIE5lZWQgdG8gY3JlYXRlIGEgc3ByaXRlIGZvciB0aGUgc2NyZWVuIGFuZCBjb3B5IHRoZSBkYXRhIHRvIGl0ICovCisgICAgICBjaGFyICpkYXRhOworICAgICAgYnVmZmVyID0gV0lNUF9DcmVhdGVCdWZmZXIod2lkdGgsIGhlaWdodCwgYnBwKTsKKyAgICAgIGRhdGEgPSBidWZmZXIgKyA2MDsgICAgICAgICAvKiBTdGFydCBvZiBzcHJpdGUgZGF0YSAqLworICAgICAgaWYgKGJwcCA9PSA4KSBkYXRhICs9IDIwNDg7ICAvKiA4YnBwIHNwcml0ZSBoYXZlIHBhbGV0dGUgZmlyc3QgKi8KKworICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICAgIFNETF9tZW1jcHkoZGF0YSwgdGhpcy0+aGlkZGVuLT5iYW5rWzBdLCB3aWR0aCAqIGhlaWdodCAqIHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKTsKKyAgIH0KKyAgIC8qIGVsc2UgV2UndmUgc3dpdGNoIHRvIGZ1bGwgc2NyZWVuIGJlZm9yZSBzbyB3ZSBhbHJlYWR5IGhhdmUgYSBzcHJpdGUgKi8KKworICAgb2xkX2JhbmtbMF0gPSB0aGlzLT5oaWRkZW4tPmJhbmtbMF07CisgICBvbGRfYmFua1sxXSA9IHRoaXMtPmhpZGRlbi0+YmFua1sxXTsKKyAgIG9sZF9hbGxvY19iYW5rID0gdGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rOworCisgICBpZiAoYnVmZmVyICE9IE5VTEwpIHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuayA9IGJ1ZmZlcjsKKworICAgdGhpcy0+aGlkZGVuLT5iYW5rWzFdID0gdGhpcy0+aGlkZGVuLT5hbGxvY19iYW5rOworICAgdGhpcy0+aGlkZGVuLT5iYW5rWzBdID0gdGhpcy0+aGlkZGVuLT5iYW5rWzFdICsgNjA7IC8qIFN0YXJ0IG9mIHNwcml0ZSBkYXRhICovCisgICBpZiAoYnBwID09IDgpIHRoaXMtPmhpZGRlbi0+YmFua1swXSArPSAyMDQ4OyAvKiA4YnBwIHNwcml0ZSBoYXZlIHBhbGV0dGUgZmlyc3QgKi8KKworICAgdGhpcy0+aGlkZGVuLT5jdXJyZW50X2JhbmsgPSAwOworICAgdGhpcy0+c2NyZWVuLT5waXhlbHMgPSB0aGlzLT5oaWRkZW4tPmJhbmtbMF07CisKKyAgIFJJU0NPU19SZXN0b3JlV2ltcE1vZGUoKTsKKyAgIFdJTVBfUmVhZE1vZGVJbmZvKHRoaXMpOworICAgaWYgKFdJTVBfU2V0dXBXaW5kb3codGhpcywgdGhpcy0+c2NyZWVuKSkKKyAgIHsKKyAgICAgIFdJTVBfU2V0RGV2aWNlTW9kZSh0aGlzKTsKKyAgICAgIFdJTVBfU2V0dXBQbG90SW5mbyh0aGlzKTsKKworICAgICAgaWYgKHJpc2Nvc19iYWNrYnVmZmVyID09IDApIHJpc2Nvc19iYWNrYnVmZmVyID0gMTsKKworICAgICAgaWYgKGJ1ZmZlciAmJiBvbGRfYWxsb2NfYmFuaykgU0RMX2ZyZWUob2xkX2FsbG9jX2JhbmspOworCisgICAgICByZXR1cm4gMTsKKyAgIH0gZWxzZQorICAgeworICAgICAgLyogRHJvcCBiYWNrIHRvIGZ1bGwgc2NyZWVuIG1vZGUgb24gZmFpbHVyZSAqLworICAgICAgdGhpcy0+aGlkZGVuLT5iYW5rWzBdID0gb2xkX2JhbmtbMF07CisgICAgICB0aGlzLT5oaWRkZW4tPmJhbmtbMV0gPSBvbGRfYmFua1sxXTsKKyAgICAgIHRoaXMtPmhpZGRlbi0+YWxsb2NfYmFuayA9IG9sZF9hbGxvY19iYW5rOworICAgICAgaWYgKGJ1ZmZlcikgU0RMX2ZyZWUoYnVmZmVyKTsKKyAgICAgIAorICAgICAgUklTQ09TX1N0b3JlV2ltcE1vZGUoKTsKKyAgICAgIEZVTExTQ1JFRU5fU2V0TW9kZSh3aWR0aCwgaGVpZ2h0LCBicHApOworICAgfQorCisgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYWV2ZW50cy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zdmdhL1NETF9zdmdhZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3YTcwMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYWV2ZW50cy5jCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgWDExIGV2ZW50cyBpbnRvIFNETCBldmVudHMgKi8KKworI2luY2x1ZGUgPHZnYS5oPgorI2luY2x1ZGUgPHZnYW1vdXNlLmg+CisjaW5jbHVkZSA8dmdha2V5Ym9hcmQuaD4KKyNpZiBkZWZpbmVkKF9fTElOVVhfXykKKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tleWJvYXJkLmg+CisjZWxpZiBkZWZpbmVkKF9fRlJFRUJTRF9fKQorI2luY2x1ZGUgPHN5cy9rYmlvLmg+CisjZWxzZQorI2Vycm9yIFlvdSBtdXN0IGNob29zZSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gaGVyZQorI2VuZGlmCisKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfc3ZnYXZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3N2Z2FldmVudHNfYy5oIgorCisvKiBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBjb25zb2xlIHNjYW5jb2RlIHRvIGEgU0RMIGtleXN5bSAqLworI2lmIGRlZmluZWQobGludXgpCisjZGVmaW5lIE5VTV9WR0FLRVlNQVBTCSgxPDxLR19DQVBTU0hJRlQpCitzdGF0aWMgVWludDE2IHZnYV9rZXltYXBbTlVNX1ZHQUtFWU1BUFNdW05SX0tFWVNdOworI2VsaWYgZGVmaW5lZChfX0ZSRUVCU0RfXykKKy8qIEZJWE1FOiBGcmVlIHRoZSBrZXltYXAgd2hlbiB3ZSBzaHV0IGRvd24gdGhlIHZpZGVvIG1vZGUgKi8KK3N0YXRpYyBrZXltYXBfdCAqdmdhX2tleW1hcCA9IE5VTEw7CisjZWxzZQorI2Vycm9yIFlvdSBtdXN0IGNob29zZSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gaGVyZQorI2VuZGlmCitzdGF0aWMgU0RMS2V5IGtleW1hcFsxMjhdOworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSk7CisKKy8qIFVnaCwgd2UgaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGtlcm5lbCdzIGtleXN5bSBtYXBwaW5nIGNvZGUuLi4KKyAgIE9oLCBpdCdzIG5vdCBzbyBiYWQuIDotKQorCisgICBGSVhNRTogQWRkIGtleWJvYXJkIExFRCBoYW5kbGluZyBjb2RlCisgKi8KKyNpZiBkZWZpbmVkKGxpbnV4KQoraW50IFNWR0FfaW5pdGtleW1hcHMoaW50IGZkKQoreworCXN0cnVjdCBrYmVudHJ5IGVudHJ5OworCWludCBtYXAsIGk7CisKKwkvKiBMb2FkIGFsbCB0aGUga2V5c3ltIG1hcHBpbmdzICovCisJZm9yICggbWFwPTA7IG1hcDxOVU1fVkdBS0VZTUFQUzsgKyttYXAgKSB7CisJCVNETF9tZW1zZXQodmdhX2tleW1hcFttYXBdLCAwLCBOUl9LRVlTKnNpemVvZihVaW50MTYpKTsKKwkJZm9yICggaT0wOyBpPE5SX0tFWVM7ICsraSApIHsKKwkJCWVudHJ5LmtiX3RhYmxlID0gbWFwOworCQkJZW50cnkua2JfaW5kZXggPSBpOworCQkJaWYgKCBpb2N0bChmZCwgS0RHS0JFTlQsICZlbnRyeSkgPT0gMCApIHsKKwkJCQkvKiBUaGUgIkVudGVyIiBrZXkgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKwkJCQlpZiAoIGVudHJ5LmtiX3ZhbHVlID09IEtfRU5URVIgKSB7CisJCQkJCWVudHJ5LmtiX3ZhbHVlID0gSyhLVF9BU0NJSSwxMyk7CisJCQkJfQorCQkJCS8qIEhhbmRsZSBudW1wYWQgc3BlY2lhbGx5IGFzIHdlbGwgKi8KKwkJCQlpZiAoIEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX1BBRCApIHsKKwkJCQkgICAgc3dpdGNoICggZW50cnkua2JfdmFsdWUgKSB7CisJCQkJCWNhc2UgS19QMDoKKwkJCQkJY2FzZSBLX1AxOgorCQkJCQljYXNlIEtfUDI6CisJCQkJCWNhc2UgS19QMzoKKwkJCQkJY2FzZSBLX1A0OgorCQkJCQljYXNlIEtfUDU6CisJCQkJCWNhc2UgS19QNjoKKwkJCQkJY2FzZSBLX1A3OgorCQkJCQljYXNlIEtfUDg6CisJCQkJCWNhc2UgS19QOToKKwkJCQkJICAgIHZnYV9rZXltYXBbbWFwXVtpXT1lbnRyeS5rYl92YWx1ZTsKKwkJCQkJICAgIHZnYV9rZXltYXBbbWFwXVtpXSs9ICcwJzsKKwkJCQkJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS19QUExVUzoKKwkJCQkJICAgIHZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcrJyk7CisJCQkJCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtfUE1JTlVTOgorCQkJCQkgICAgdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJy0nKTsKKwkJCQkJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS19QU1RBUjoKKwkJCQkJICAgIHZnYV9rZXltYXBbbWFwXVtpXT1LKEtUX0FTQ0lJLCcqJyk7CisJCQkJCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtfUFNMQVNIOgorCQkJCQkgICAgdmdhX2tleW1hcFttYXBdW2ldPUsoS1RfQVNDSUksJy8nKTsKKwkJCQkJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS19QRU5URVI6CisJCQkJCSAgICB2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnXHInKTsKKwkJCQkJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS19QQ09NTUE6CisJCQkJCSAgICB2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLCcpOworCQkJCQkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLX1BET1Q6CisJCQkJCSAgICB2Z2Ffa2V5bWFwW21hcF1baV09SyhLVF9BU0NJSSwnLicpOworCQkJCQkgICAgYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCSAgICBicmVhazsKKwkJCQkgICAgfQorCQkJCX0KKwkJCQkvKiBEbyB0aGUgbm9ybWFsIGtleSB0cmFuc2xhdGlvbiAqLworCQkJCWlmICggKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0xBVElOKSB8fAorCQkJCSAgICAgKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0FTQ0lJKSB8fAorCQkJCSAgICAgKEtUWVAoZW50cnkua2JfdmFsdWUpID09IEtUX0xFVFRFUikgKSB7CisJCQkJCXZnYV9rZXltYXBbbWFwXVtpXSA9IGVudHJ5LmtiX3ZhbHVlOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4oMCk7Cit9CisjZWxpZiBkZWZpbmVkKF9fRlJFRUJTRF9fKQoraW50IFNWR0FfaW5pdGtleW1hcHMoaW50IGZkKQoreworCXZnYV9rZXltYXAgPSBTRExfbWFsbG9jKHNpemVvZihrZXltYXBfdCkpOworCWlmICggISB2Z2Ffa2V5bWFwICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJaWYgKGlvY3RsKGZkLCBHSU9fS0VZTUFQLCB2Z2Ffa2V5bWFwKSA9PSAtMSkgeworCQlTRExfZnJlZSh2Z2Ffa2V5bWFwKTsKKwkJdmdhX2tleW1hcCA9IE5VTEw7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGdldCBrZXlib2FyZCBtYXAiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKDApOworfQorI2Vsc2UKKyNlcnJvciBZb3UgbXVzdCBjaG9vc2UgeW91ciBvcGVyYXRpbmcgc3lzdGVtIGhlcmUKKyNlbmRpZgorCitpbnQgcG9zdGVkID0gMDsKKwordm9pZCBTVkdBX21vdXNlY2FsbGJhY2soaW50IGJ1dHRvbiwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1MSxpbnQgdTIsaW50IHUzLCBpbnQgdTQpCit7CisJaWYgKCBkeCB8fCBkeSApIHsKKwkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMSwgZHgsIGR5KTsKKwl9CisJaWYgKCBidXR0b24gJiBNT1VTRV9MRUZUQlVUVE9OICkgeworCQlpZiAoICEoU0RMX0dldE1vdXNlU3RhdGUoTlVMTCwgTlVMTCkgJiBTRExfQlVUVE9OKDEpKSApIHsKKwkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCAxLCAwLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICggKFNETF9HZXRNb3VzZVN0YXRlKE5VTEwsIE5VTEwpICYgU0RMX0JVVFRPTigxKSkgKSB7CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIDEsIDAsIDApOworCQl9CisJfQorCWlmICggYnV0dG9uICYgTU9VU0VfTUlERExFQlVUVE9OICkgeworCQlpZiAoICEoU0RMX0dldE1vdXNlU3RhdGUoTlVMTCwgTlVMTCkgJiBTRExfQlVUVE9OKDIpKSApIHsKKwkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCAyLCAwLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICggKFNETF9HZXRNb3VzZVN0YXRlKE5VTEwsIE5VTEwpICYgU0RMX0JVVFRPTigyKSkgKSB7CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIDIsIDAsIDApOworCQl9CisJfQorCWlmICggYnV0dG9uICYgTU9VU0VfUklHSFRCVVRUT04gKSB7CisJCWlmICggIShTRExfR2V0TW91c2VTdGF0ZShOVUxMLCBOVUxMKSAmIFNETF9CVVRUT04oMykpICkgeworCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIDMsIDAsIDApOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCAoU0RMX0dldE1vdXNlU3RhdGUoTlVMTCwgTlVMTCkgJiBTRExfQlVUVE9OKDMpKSApIHsKKwkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgMywgMCwgMCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgU1ZHQV9rZXlib2FyZGNhbGxiYWNrKGludCBzY2FuY29kZSwgaW50IHByZXNzZWQpCit7CisJU0RMX2tleXN5bSBrZXlzeW07CisKKwlpZiAoIHByZXNzZWQgKSB7CisJCXBvc3RlZCArPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELAorCQkJICAgIFRyYW5zbGF0ZUtleShzY2FuY29kZSwgJmtleXN5bSkpOworCX0gZWxzZSB7CisJCXBvc3RlZCArPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9SRUxFQVNFRCwKKwkJCSAgICBUcmFuc2xhdGVLZXkoc2NhbmNvZGUsICZrZXlzeW0pKTsKKwl9Cit9CisKK3ZvaWQgU1ZHQV9QdW1wRXZlbnRzKF9USElTKQoreworCWRvIHsKKwkJcG9zdGVkID0gMDsKKwkJbW91c2VfdXBkYXRlKCk7CisJCWtleWJvYXJkX3VwZGF0ZSgpOworCX0gd2hpbGUgKCBwb3N0ZWQgKTsKK30KKwordm9pZCBTVkdBX0luaXRPU0tleW1hcChfVEhJUykKK3sKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgdGhlIEJlT1Mga2V5IHRyYW5zbGF0aW9uIHRhYmxlICovCisJZm9yICggaT0wOyBpPFNETF9hcnJheXNpemUoa2V5bWFwKTsgKytpICkKKwkJa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOworCisJa2V5bWFwW1NDQU5DT0RFX0VTQ0FQRV0gPSBTRExLX0VTQ0FQRTsKKwlrZXltYXBbU0NBTkNPREVfMV0gPSBTRExLXzE7CisJa2V5bWFwW1NDQU5DT0RFXzJdID0gU0RMS18yOworCWtleW1hcFtTQ0FOQ09ERV8zXSA9IFNETEtfMzsKKwlrZXltYXBbU0NBTkNPREVfNF0gPSBTRExLXzQ7CisJa2V5bWFwW1NDQU5DT0RFXzVdID0gU0RMS181OworCWtleW1hcFtTQ0FOQ09ERV82XSA9IFNETEtfNjsKKwlrZXltYXBbU0NBTkNPREVfN10gPSBTRExLXzc7CisJa2V5bWFwW1NDQU5DT0RFXzhdID0gU0RMS184OworCWtleW1hcFtTQ0FOQ09ERV85XSA9IFNETEtfOTsKKwlrZXltYXBbU0NBTkNPREVfMF0gPSBTRExLXzA7CisJa2V5bWFwW1NDQU5DT0RFX01JTlVTXSA9IFNETEtfTUlOVVM7CisJa2V5bWFwW1NDQU5DT0RFX0VRVUFMXSA9IFNETEtfRVFVQUxTOworCWtleW1hcFtTQ0FOQ09ERV9CQUNLU1BBQ0VdID0gU0RMS19CQUNLU1BBQ0U7CisJa2V5bWFwW1NDQU5DT0RFX1RBQl0gPSBTRExLX1RBQjsKKwlrZXltYXBbU0NBTkNPREVfUV0gPSBTRExLX3E7CisJa2V5bWFwW1NDQU5DT0RFX1ddID0gU0RMS193OworCWtleW1hcFtTQ0FOQ09ERV9FXSA9IFNETEtfZTsKKwlrZXltYXBbU0NBTkNPREVfUl0gPSBTRExLX3I7CisJa2V5bWFwW1NDQU5DT0RFX1RdID0gU0RMS190OworCWtleW1hcFtTQ0FOQ09ERV9ZXSA9IFNETEtfeTsKKwlrZXltYXBbU0NBTkNPREVfVV0gPSBTRExLX3U7CisJa2V5bWFwW1NDQU5DT0RFX0ldID0gU0RMS19pOworCWtleW1hcFtTQ0FOQ09ERV9PXSA9IFNETEtfbzsKKwlrZXltYXBbU0NBTkNPREVfUF0gPSBTRExLX3A7CisJa2V5bWFwW1NDQU5DT0RFX0JSQUNLRVRfTEVGVF0gPSBTRExLX0xFRlRCUkFDS0VUOworCWtleW1hcFtTQ0FOQ09ERV9CUkFDS0VUX1JJR0hUXSA9IFNETEtfUklHSFRCUkFDS0VUOworCWtleW1hcFtTQ0FOQ09ERV9FTlRFUl0gPSBTRExLX1JFVFVSTjsKKwlrZXltYXBbU0NBTkNPREVfTEVGVENPTlRST0xdID0gU0RMS19MQ1RSTDsKKwlrZXltYXBbU0NBTkNPREVfQV0gPSBTRExLX2E7CisJa2V5bWFwW1NDQU5DT0RFX1NdID0gU0RMS19zOworCWtleW1hcFtTQ0FOQ09ERV9EXSA9IFNETEtfZDsKKwlrZXltYXBbU0NBTkNPREVfRl0gPSBTRExLX2Y7CisJa2V5bWFwW1NDQU5DT0RFX0ddID0gU0RMS19nOworCWtleW1hcFtTQ0FOQ09ERV9IXSA9IFNETEtfaDsKKwlrZXltYXBbU0NBTkNPREVfSl0gPSBTRExLX2o7CisJa2V5bWFwW1NDQU5DT0RFX0tdID0gU0RMS19rOworCWtleW1hcFtTQ0FOQ09ERV9MXSA9IFNETEtfbDsKKwlrZXltYXBbU0NBTkNPREVfU0VNSUNPTE9OXSA9IFNETEtfU0VNSUNPTE9OOworCWtleW1hcFtTQ0FOQ09ERV9BUE9TVFJPUEhFXSA9IFNETEtfUVVPVEU7CisJa2V5bWFwW1NDQU5DT0RFX0dSQVZFXSA9IFNETEtfQkFDS1FVT1RFOworCWtleW1hcFtTQ0FOQ09ERV9MRUZUU0hJRlRdID0gU0RMS19MU0hJRlQ7CisJa2V5bWFwW1NDQU5DT0RFX0JBQ0tTTEFTSF0gPSBTRExLX0JBQ0tTTEFTSDsKKwlrZXltYXBbU0NBTkNPREVfWl0gPSBTRExLX3o7CisJa2V5bWFwW1NDQU5DT0RFX1hdID0gU0RMS194OworCWtleW1hcFtTQ0FOQ09ERV9DXSA9IFNETEtfYzsKKwlrZXltYXBbU0NBTkNPREVfVl0gPSBTRExLX3Y7CisJa2V5bWFwW1NDQU5DT0RFX0JdID0gU0RMS19iOworCWtleW1hcFtTQ0FOQ09ERV9OXSA9IFNETEtfbjsKKwlrZXltYXBbU0NBTkNPREVfTV0gPSBTRExLX207CisJa2V5bWFwW1NDQU5DT0RFX0NPTU1BXSA9IFNETEtfQ09NTUE7CisJa2V5bWFwW1NDQU5DT0RFX1BFUklPRF0gPSBTRExLX1BFUklPRDsKKwlrZXltYXBbU0NBTkNPREVfU0xBU0hdID0gU0RMS19TTEFTSDsKKwlrZXltYXBbU0NBTkNPREVfUklHSFRTSElGVF0gPSBTRExLX1JTSElGVDsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFETVVMVElQTFldID0gU0RMS19LUF9NVUxUSVBMWTsKKwlrZXltYXBbU0NBTkNPREVfTEVGVEFMVF0gPSBTRExLX0xBTFQ7CisJa2V5bWFwW1NDQU5DT0RFX1NQQUNFXSA9IFNETEtfU1BBQ0U7CisJa2V5bWFwW1NDQU5DT0RFX0NBUFNMT0NLXSA9IFNETEtfQ0FQU0xPQ0s7CisJa2V5bWFwW1NDQU5DT0RFX0YxXSA9IFNETEtfRjE7CisJa2V5bWFwW1NDQU5DT0RFX0YyXSA9IFNETEtfRjI7CisJa2V5bWFwW1NDQU5DT0RFX0YzXSA9IFNETEtfRjM7CisJa2V5bWFwW1NDQU5DT0RFX0Y0XSA9IFNETEtfRjQ7CisJa2V5bWFwW1NDQU5DT0RFX0Y1XSA9IFNETEtfRjU7CisJa2V5bWFwW1NDQU5DT0RFX0Y2XSA9IFNETEtfRjY7CisJa2V5bWFwW1NDQU5DT0RFX0Y3XSA9IFNETEtfRjc7CisJa2V5bWFwW1NDQU5DT0RFX0Y4XSA9IFNETEtfRjg7CisJa2V5bWFwW1NDQU5DT0RFX0Y5XSA9IFNETEtfRjk7CisJa2V5bWFwW1NDQU5DT0RFX0YxMF0gPSBTRExLX0YxMDsKKwlrZXltYXBbU0NBTkNPREVfTlVNTE9DS10gPSBTRExLX05VTUxPQ0s7CisJa2V5bWFwW1NDQU5DT0RFX1NDUk9MTExPQ0tdID0gU0RMS19TQ1JPTExPQ0s7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDddID0gU0RMS19LUDc7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUlVQTEVGVF0gPSBTRExLX0tQNzsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEOF0gPSBTRExLX0tQODsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SVVBdID0gU0RMS19LUDg7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDldID0gU0RMS19LUDk7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUlVQUklHSFRdID0gU0RMS19LUDk7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRE1JTlVTXSA9IFNETEtfS1BfTUlOVVM7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDRdID0gU0RMS19LUDQ7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUkxFRlRdID0gU0RMS19LUDQ7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDVdID0gU0RMS19LUDU7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDZdID0gU0RMS19LUDY7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUlJJR0hUXSA9IFNETEtfS1A2OworCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURQTFVTXSA9IFNETEtfS1BfUExVUzsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEMV0gPSBTRExLX0tQMTsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SRE9XTkxFRlRdID0gU0RMS19LUDE7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDJdID0gU0RMS19LUDI7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUkRPV05dID0gU0RMS19LUDI7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRDNdID0gU0RMS19LUDM7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUkRPV05SSUdIVF0gPSBTRExLX0tQMzsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEMF0gPSBTRExLX0tQMDsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEUEVSSU9EXSA9IFNETEtfS1BfUEVSSU9EOworCWtleW1hcFtTQ0FOQ09ERV9MRVNTXSA9IFNETEtfTEVTUzsKKwlrZXltYXBbU0NBTkNPREVfRjExXSA9IFNETEtfRjExOworCWtleW1hcFtTQ0FOQ09ERV9GMTJdID0gU0RMS19GMTI7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBREVOVEVSXSA9IFNETEtfS1BfRU5URVI7CisJa2V5bWFwW1NDQU5DT0RFX1JJR0hUQ09OVFJPTF0gPSBTRExLX1JDVFJMOworCWtleW1hcFtTQ0FOQ09ERV9DT05UUk9MXSA9IFNETEtfUkNUUkw7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRERJVklERV0gPSBTRExLX0tQX0RJVklERTsKKwlrZXltYXBbU0NBTkNPREVfUFJJTlRTQ1JFRU5dID0gU0RMS19QUklOVDsKKwlrZXltYXBbU0NBTkNPREVfUklHSFRBTFRdID0gU0RMS19SQUxUOworCWtleW1hcFtTQ0FOQ09ERV9CUkVBS10gPSBTRExLX0JSRUFLOworCWtleW1hcFtTQ0FOQ09ERV9CUkVBS19BTFRFUk5BVElWRV0gPSBTRExLX1VOS05PV047CisJa2V5bWFwW1NDQU5DT0RFX0hPTUVdID0gU0RMS19IT01FOworCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JCTE9DS1VQXSA9IFNETEtfVVA7CisJa2V5bWFwW1NDQU5DT0RFX1BBR0VVUF0gPSBTRExLX1BBR0VVUDsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SQkxPQ0tMRUZUXSA9IFNETEtfTEVGVDsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SQkxPQ0tSSUdIVF0gPSBTRExLX1JJR0hUOworCWtleW1hcFtTQ0FOQ09ERV9FTkRdID0gU0RMS19FTkQ7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUkJMT0NLRE9XTl0gPSBTRExLX0RPV047CisJa2V5bWFwW1NDQU5DT0RFX1BBR0VET1dOXSA9IFNETEtfUEFHRURPV047CisJa2V5bWFwW1NDQU5DT0RFX0lOU0VSVF0gPSBTRExLX0lOU0VSVDsKKwlrZXltYXBbU0NBTkNPREVfUkVNT1ZFXSA9IFNETEtfREVMRVRFOworCWtleW1hcFsxMTldID0gU0RMS19QQVVTRTsKKwlrZXltYXBbU0NBTkNPREVfUklHSFRXSU5dID0gU0RMS19SU1VQRVI7CisJa2V5bWFwW1NDQU5DT0RFX0xFRlRXSU5dID0gU0RMS19MU1VQRVI7CisJa2V5bWFwWzEyN10gPSBTRExLX01FTlU7Cit9CisKKyNpZiBkZWZpbmVkKGxpbnV4KQorc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSkKK3sKKwkvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLworCWtleXN5bS0+c2NhbmNvZGUgPSBzY2FuY29kZTsKKwlrZXlzeW0tPnN5bSA9IGtleW1hcFtzY2FuY29kZV07CisJa2V5c3ltLT5tb2QgPSBLTU9EX05PTkU7CisKKwkvKiBJZiBVTklDT0RFIGlzIG9uLCBnZXQgdGhlIFVOSUNPREUgdmFsdWUgZm9yIHRoZSBrZXkgKi8KKwlrZXlzeW0tPnVuaWNvZGUgPSAwOworCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSB7CisJCWludCBtYXA7CisJCVNETE1vZCBtb2RzdGF0ZTsKKworCQltb2RzdGF0ZSA9IFNETF9HZXRNb2RTdGF0ZSgpOworCQltYXAgPSAwOworCQlpZiAoIG1vZHN0YXRlICYgS01PRF9TSElGVCApIHsKKwkJCW1hcCB8PSAoMTw8S0dfU0hJRlQpOworCQl9CisJCWlmICggbW9kc3RhdGUgJiBLTU9EX0NUUkwgKSB7CisJCQltYXAgfD0gKDE8PEtHX0NUUkwpOworCQl9CisJCWlmICggbW9kc3RhdGUgJiBLTU9EX0FMVCApIHsKKwkJCW1hcCB8PSAoMTw8S0dfQUxUKTsKKwkJfQorCQlpZiAoIG1vZHN0YXRlICYgS01PRF9NT0RFICkgeworCQkJbWFwIHw9ICgxPDxLR19BTFRHUik7CisJCX0KKwkJaWYgKCBLVFlQKHZnYV9rZXltYXBbbWFwXVtzY2FuY29kZV0pID09IEtUX0xFVFRFUiApIHsKKwkJCWlmICggbW9kc3RhdGUgJiBLTU9EX0NBUFMgKSB7CisJCQkJbWFwIF49ICgxPDxLR19TSElGVCk7CisJCQl9CisJCX0KKwkJaWYgKCBLVFlQKHZnYV9rZXltYXBbbWFwXVtzY2FuY29kZV0pID09IEtUX1BBRCApIHsKKwkJCWlmICggbW9kc3RhdGUgJiBLTU9EX05VTSApIHsKKwkJCQlrZXlzeW0tPnVuaWNvZGU9S1ZBTCh2Z2Ffa2V5bWFwW21hcF1bc2NhbmNvZGVdKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWtleXN5bS0+dW5pY29kZSA9IEtWQUwodmdhX2tleW1hcFttYXBdW3NjYW5jb2RlXSk7CisJCX0KKwl9CisJcmV0dXJuKGtleXN5bSk7Cit9CisjZWxpZiBkZWZpbmVkKF9fRlJFRUJTRF9fKQorc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSkKK3sKKwkvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLworCWtleXN5bS0+c2NhbmNvZGUgPSBzY2FuY29kZTsKKwlrZXlzeW0tPnN5bSA9IGtleW1hcFtzY2FuY29kZV07CisJa2V5c3ltLT5tb2QgPSBLTU9EX05PTkU7CisKKwkvKiBJZiBVTklDT0RFIGlzIG9uLCBnZXQgdGhlIFVOSUNPREUgdmFsdWUgZm9yIHRoZSBrZXkgKi8KKwlrZXlzeW0tPnVuaWNvZGUgPSAwOworCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgJiYgdmdhX2tleW1hcCApIHsKKwkJaW50IG1hcDsKKwkJU0RMTW9kIG1vZHN0YXRlOworCisJCW1vZHN0YXRlID0gU0RMX0dldE1vZFN0YXRlKCk7CisJCW1hcCA9IDA7CisJCWlmICggbW9kc3RhdGUgJiBLTU9EX1NISUZUICkgeworCQkJbWFwICs9IDE7CisJCX0KKwkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQ1RSTCApIHsKKwkJCW1hcCArPSAyOworCQl9CisJCWlmICggbW9kc3RhdGUgJiBLTU9EX0FMVCApIHsKKwkJCW1hcCArPSA0OworCQl9CisJCWlmICggISh2Z2Ffa2V5bWFwLT5rZXlbc2NhbmNvZGVdLnNwY2wgJiAoMHg4MCA+PiBtYXApKSApIHsKKwkJCWtleXN5bS0+dW5pY29kZSA9IHZnYV9rZXltYXAtPmtleVtzY2FuY29kZV0ubWFwW21hcF07CisJCX0KKworCX0KKwlyZXR1cm4oa2V5c3ltKTsKK30KKyNlbHNlCisjZXJyb3IgWW91IG11c3QgY2hvb3NlIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBoZXJlCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYWV2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2FldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOWY4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2FldmVudHNfYy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3N2Z2F2aWRlby5oIgorCisvKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfc3lzZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCisgICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX3N5c3ZpZGVvLmMpCisqLworZXh0ZXJuIGludCBTVkdBX2luaXRrZXltYXBzKGludCBmZCk7CitleHRlcm4gdm9pZCBTVkdBX21vdXNlY2FsbGJhY2soaW50IGJ1dHRvbiwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdTEsaW50IHUyLGludCB1MywgaW50IHU0KTsKK2V4dGVybiB2b2lkIFNWR0Ffa2V5Ym9hcmRjYWxsYmFjayhpbnQgc2NhbmNvZGUsIGludCBwcmVzc2VkKTsKKworZXh0ZXJuIHZvaWQgU1ZHQV9Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgU1ZHQV9QdW1wRXZlbnRzKF9USElTKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYW1vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2Ftb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MmRiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2Ftb3VzZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9zdmdhdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfc3ZnYW1vdXNlX2MuaCIKKworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK3N0cnVjdCBXTWN1cnNvciB7CisJaW50IHVudXNlZDsKK307CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2Ftb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2Ftb3VzZV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmZThhYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYW1vdXNlX2MuaApAQCAtMCwwICsxLDI2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9zdmdhdmlkZW8uaCIKKworLyogRnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2F2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zdmdhL1NETF9zdmdhdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVhODAwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zdmdhL1NETF9zdmdhdmlkZW8uYwpAQCAtMCwwICsxLDU4NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFNWR0FsaWIgYmFzZWQgU0RMIHZpZGVvIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZiBkZWZpbmVkKF9fTElOVVhfXykKKyNpbmNsdWRlIDxsaW51eC92dC5oPgorI2VsaWYgZGVmaW5lZChfX0ZSRUVCU0RfXykKKyNpbmNsdWRlIDxzeXMvY29uc2lvLmg+CisjZWxzZQorI2Vycm9yIFlvdSBtdXN0IGNob29zZSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gaGVyZQorI2VuZGlmCisjaW5jbHVkZSA8dmdhLmg+CisjaW5jbHVkZSA8dmdhbW91c2UuaD4KKyNpbmNsdWRlIDx2Z2FrZXlib2FyZC5oPgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9zdmdhdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfc3ZnYWV2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3N2Z2Ftb3VzZV9jLmgiCisKKy8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBTVkdBX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKlNWR0FfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBTRExfU3VyZmFjZSAqU1ZHQV9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgaW50IFNWR0FfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsCisJCQkgIFNETF9Db2xvciAqY29sb3JzKTsKK3N0YXRpYyB2b2lkIFNWR0FfVmlkZW9RdWl0KF9USElTKTsKKworLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgU1ZHQV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBTVkdBX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgU1ZHQV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBTVkdBX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgU1ZHQV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKKy8qIFNWR0FsaWIgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBTVkdBX0F2YWlsYWJsZSh2b2lkKQoreworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgcm9vdCBhbmQgc3RkaW4gaXMgYSB2aXJ0dWFsIGNvbnNvbGUgKi8KKwlpbnQgY29uc29sZTsKKwkKKwkvKiBTVkdBTGliIDEuOS54KyBkb2Vzbid0IHJlcXVpcmUgcm9vdCAodmlhIC9kZXYvc3ZnYSkgKi8KKwlpbnQgc3ZnYWxpYjIgPSAtMTsKKworCS8qIFNlZSBpZiB3ZSBhcmUgY29ubmVjdGVkIHRvIGEgdmlydHVhbCB0ZXJtaW5hbCAqLworCWNvbnNvbGUgPSBTVERJTl9GSUxFTk87CisjaWYgMCAvKiBUaGlzIGlzIG5vIGxvbmdlciBuZWVkZWQsIFNWR0FsaWIgY2FuIHN3aXRjaCBjb25zb2xlcyBmb3IgdXMgKi8KKwlpZiAoIGNvbnNvbGUgPj0gMCApIHsKKwkJc3RydWN0IHN0YXQgc2I7CisJCXN0cnVjdCB2dF9tb2RlIGR1bW15OworCisJCWlmICggKGZzdGF0KGNvbnNvbGUsICZzYikgPCAwKSB8fAorCQkgICAgIChpb2N0bChjb25zb2xlLCBWVF9HRVRNT0RFLCAmZHVtbXkpIDwgMCkgKSB7CisJCQljb25zb2xlID0gLTE7CisJCX0KKwl9CisjZW5kaWYgLyogMCAqLworCisJLyogU2VlIGlmIFNWR0FsaWIgMi4wIGlzIGF2YWlsYWJsZSAqLworCXN2Z2FsaWIyID0gb3BlbigiL2Rldi9zdmdhIiwgT19SRE9OTFkpOworCWlmIChzdmdhbGliMiAhPSAtMSkgeworCQljbG9zZShzdmdhbGliMik7CisJfQorCisJcmV0dXJuKCgoc3ZnYWxpYjIgIT0gLTEpIHx8IChnZXRldWlkKCkgPT0gMCkpICYmIChjb25zb2xlID49IDApKTsKK30KKworc3RhdGljIHZvaWQgU1ZHQV9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCit7CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCVNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKlNWR0FfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwl9CisJaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCWlmICggZGV2aWNlICkgeworCQkJU0RMX2ZyZWUoZGV2aWNlKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCVNETF9tZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBTVkdBX1ZpZGVvSW5pdDsKKwlkZXZpY2UtPkxpc3RNb2RlcyA9IFNWR0FfTGlzdE1vZGVzOworCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gU1ZHQV9TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5TZXRDb2xvcnMgPSBTVkdBX1NldENvbG9yczsKKwlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IFNWR0FfVmlkZW9RdWl0OworCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBTVkdBX0FsbG9jSFdTdXJmYWNlOworCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOworCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IFNWR0FfTG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IFNWR0FfVW5sb2NrSFdTdXJmYWNlOworCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IFNWR0FfRmxpcEhXU3VyZmFjZTsKKwlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBTVkdBX0ZyZWVIV1N1cmZhY2U7CisJZGV2aWNlLT5TZXRDYXB0aW9uID0gTlVMTDsKKwlkZXZpY2UtPlNldEljb24gPSBOVUxMOworCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IE5VTEw7CisJZGV2aWNlLT5HcmFiSW5wdXQgPSBOVUxMOworCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKKwlkZXZpY2UtPkluaXRPU0tleW1hcCA9IFNWR0FfSW5pdE9TS2V5bWFwOworCWRldmljZS0+UHVtcEV2ZW50cyA9IFNWR0FfUHVtcEV2ZW50czsKKworCWRldmljZS0+ZnJlZSA9IFNWR0FfRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIGRldmljZTsKK30KKworVmlkZW9Cb290U3RyYXAgU1ZHQUxJQl9ib290c3RyYXAgPSB7CisJInN2Z2FsaWIiLCAiU1ZHQWxpYiIsCisJU1ZHQV9BdmFpbGFibGUsIFNWR0FfQ3JlYXRlRGV2aWNlCit9OworCitzdGF0aWMgaW50IFNWR0FfQWRkTW9kZShfVEhJUywgaW50IG1vZGUsIGludCBhY3R1YWxseV9hZGQpCit7CisJaW50IGksIGo7CisJdmdhX21vZGVpbmZvICptb2RlaW5mbzsKKworCW1vZGVpbmZvID0gdmdhX2dldG1vZGVpbmZvKG1vZGUpOworCisJaSA9IG1vZGVpbmZvLT5ieXRlc3BlcnBpeGVsLTE7CisJaWYgKCBpIDwgMCApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICggYWN0dWFsbHlfYWRkICkgeworCQlTRExfUmVjdCBzYXZlZF9yZWN0WzJdOworCQlpbnQgICAgICBzYXZlZF9tb2RlWzJdOworCQlpbnQgYjsKKworCQkvKiBBZGQgdGhlIG1vZGUsIHNvcnRlZCBsYXJnZXN0IHRvIHNtYWxsZXN0ICovCisJCWIgPSAwOworCQlqID0gMDsKKwkJd2hpbGUgKCAoU0RMX21vZGVsaXN0W2ldW2pdLT53ID4gbW9kZWluZm8tPndpZHRoKSB8fAorCQkJKFNETF9tb2RlbGlzdFtpXVtqXS0+aCA+IG1vZGVpbmZvLT5oZWlnaHQpICkgeworCQkJKytqOworCQl9CisJCS8qIFNraXAgbW9kZXMgdGhhdCBhcmUgYWxyZWFkeSBpbiBvdXIgbGlzdCAqLworCQlpZiAoIChTRExfbW9kZWxpc3RbaV1bal0tPncgPT0gbW9kZWluZm8tPndpZHRoKSAmJgorCQkgICAgIChTRExfbW9kZWxpc3RbaV1bal0tPmggPT0gbW9kZWluZm8tPmhlaWdodCkgKSB7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJLyogSW5zZXJ0IHRoZSBuZXcgbW9kZSAqLworCQlzYXZlZF9yZWN0W2JdID0gKlNETF9tb2RlbGlzdFtpXVtqXTsKKwkJc2F2ZWRfbW9kZVtiXSA9IFNETF92Z2Ftb2RlW2ldW2pdOworCQlTRExfbW9kZWxpc3RbaV1bal0tPncgPSBtb2RlaW5mby0+d2lkdGg7CisJCVNETF9tb2RlbGlzdFtpXVtqXS0+aCA9IG1vZGVpbmZvLT5oZWlnaHQ7CisJCVNETF92Z2Ftb2RlW2ldW2pdID0gbW9kZTsKKwkJLyogRXZlcnlib2R5IHNjb290IGRvd24hICovCisJCWlmICggc2F2ZWRfcmVjdFtiXS53ICYmIHNhdmVkX3JlY3RbYl0uaCApIHsKKwkJICAgIGZvciAoICsrajsgU0RMX21vZGVsaXN0W2ldW2pdLT53OyArK2ogKSB7CisJCQlzYXZlZF9yZWN0WyFiXSA9ICpTRExfbW9kZWxpc3RbaV1bal07CisJCQlzYXZlZF9tb2RlWyFiXSA9IFNETF92Z2Ftb2RlW2ldW2pdOworCQkJKlNETF9tb2RlbGlzdFtpXVtqXSA9IHNhdmVkX3JlY3RbYl07CisJCQlTRExfdmdhbW9kZVtpXVtqXSA9IHNhdmVkX21vZGVbYl07CisJCQliID0gIWI7CisJCSAgICB9CisJCSAgICAqU0RMX21vZGVsaXN0W2ldW2pdID0gc2F2ZWRfcmVjdFtiXTsKKwkJICAgIFNETF92Z2Ftb2RlW2ldW2pdID0gc2F2ZWRfbW9kZVtiXTsKKwkJfQorCX0gZWxzZSB7CisJCSsrU0RMX251bW1vZGVzW2ldOworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkIFNWR0FfVXBkYXRlVmlkZW9JbmZvKF9USElTKQoreworCXZnYV9tb2RlaW5mbyAqbW9kZWluZm87CisKKwl0aGlzLT5pbmZvLndtX2F2YWlsYWJsZSA9IDA7CisJdGhpcy0+aW5mby5od19hdmFpbGFibGUgPSAoYmFua2VkID8gMCA6IDEpOworCW1vZGVpbmZvID0gdmdhX2dldG1vZGVpbmZvKHZnYV9nZXRjdXJyZW50bW9kZSgpKTsKKwl0aGlzLT5pbmZvLnZpZGVvX21lbSA9IG1vZGVpbmZvLT5tZW1vcnk7CisJLyogRklYTUU6IEFkZCBoYXJkd2FyZSBhY2NlbGVyYXRlZCBibGl0IGluZm9ybWF0aW9uICovCisjaWZkZWYgU1ZHQUxJQl9ERUJVRworCXByaW50ZigiSGFyZHdhcmUgYWNjZWxlcmF0ZWQgYmxpdDogJXNhdmFpbGFibGVcbiIsIG1vZGVpbmZvLT5oYXZlYmxpdCA/ICIiIDogIm5vdCAiKTsKKyNlbmRpZgorfQorCitpbnQgU1ZHQV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKwlpbnQga2V5Ym9hcmQ7CisJaW50IGksIGo7CisJaW50IG1vZGUsIHRvdGFsX21vZGVzOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgeworCQlTRExfbnVtbW9kZXNbaV0gPSAwOworCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOworCQlTRExfdmdhbW9kZVtpXSA9IE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSAqLworCXZnYV9kaXNhYmxlZHJpdmVycmVwb3J0KCk7CisJaWYgKCB2Z2FfaW5pdCgpIDwgMCApIHsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBTVkdBbGliIik7CisJCXJldHVybigtMSk7CisJfQorCXZnYV9zZXRtb2RlKFRFWFQpOworCisJLyogRW5hYmxlIG1vdXNlIGFuZCBrZXlib2FyZCBzdXBwb3J0ICovCisJdmdhX3NldG1vdXNlc3VwcG9ydCgxKTsKKwlrZXlib2FyZCA9IGtleWJvYXJkX2luaXRfcmV0dXJuX2ZkKCk7CisJaWYgKCBrZXlib2FyZCA8IDAgKSB7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUga2V5Ym9hcmQiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJaWYgKCBTVkdBX2luaXRrZXltYXBzKGtleWJvYXJkKSA8IDAgKSB7CisJCXJldHVybigtMSk7CisJfQorCWtleWJvYXJkX3NldGV2ZW50aGFuZGxlcihTVkdBX2tleWJvYXJkY2FsbGJhY2spOworCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCisJdGhpcy0+aW5mby5jdXJyZW50X3cgPSAwOworCXRoaXMtPmluZm8uY3VycmVudF9oID0gMDsKKworCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICh1c2UgZGVmYXVsdCA4LWJpdCBkZXB0aCkgKi8KKwl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSA4OworCisJLyogRW51bWVyYXRlIHRoZSBhdmFpbGFibGUgZnVsbHNjcmVlbiBtb2RlcyAqLworCXRvdGFsX21vZGVzID0gMDsKKwlmb3IgKCBtb2RlPXZnYV9sYXN0bW9kZW51bWJlcigpOyBtb2RlOyAtLW1vZGUgKSB7CisJCWlmICggdmdhX2hhc21vZGUobW9kZSkgKSB7CisJCQlpZiAoIFNWR0FfQWRkTW9kZSh0aGlzLCBtb2RlLCAwKSApIHsKKwkJCQkrK3RvdGFsX21vZGVzOworCQkJfQorCQl9CisJfQorCWlmICggU1ZHQV9BZGRNb2RlKHRoaXMsIEczMjB4MjAweDI1NiwgMCkgKSArK3RvdGFsX21vZGVzOworCWlmICggdG90YWxfbW9kZXMgPT0gMCApIHsKKwkJU0RMX1NldEVycm9yKCJObyBsaW5lYXIgdmlkZW8gbW9kZXMgYXZhaWxhYmxlIik7CisJCXJldHVybigtMSk7CisJfQorCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7CisJCVNETF92Z2Ftb2RlW2ldID0gKGludCAqKVNETF9tYWxsb2MoU0RMX251bW1vZGVzW2ldKnNpemVvZihpbnQpKTsKKwkJaWYgKCBTRExfdmdhbW9kZVtpXSA9PSBOVUxMICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCVNETF9tb2RlbGlzdFtpXSA9IChTRExfUmVjdCAqKikKKwkJCQlTRExfbWFsbG9jKChTRExfbnVtbW9kZXNbaV0rMSkqc2l6ZW9mKFNETF9SZWN0ICopKTsKKwkJaWYgKCBTRExfbW9kZWxpc3RbaV0gPT0gTlVMTCApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlmb3IgKCBqPTA7IGo8U0RMX251bW1vZGVzW2ldOyArK2ogKSB7CisJCQlTRExfbW9kZWxpc3RbaV1bal09KFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKKwkJCWlmICggU0RMX21vZGVsaXN0W2ldW2pdID09IE5VTEwgKSB7CisJCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJCVNETF9tZW1zZXQoU0RMX21vZGVsaXN0W2ldW2pdLCAwLCBzaXplb2YoU0RMX1JlY3QpKTsKKwkJfQorCQlTRExfbW9kZWxpc3RbaV1bal0gPSBOVUxMOworCX0KKwlmb3IgKCBtb2RlPXZnYV9sYXN0bW9kZW51bWJlcigpOyBtb2RlOyAtLW1vZGUgKSB7CisJCWlmICggdmdhX2hhc21vZGUobW9kZSkgKSB7CisJCQlTVkdBX0FkZE1vZGUodGhpcywgbW9kZSwgMSk7CisJCX0KKwl9CisJU1ZHQV9BZGRNb2RlKHRoaXMsIEczMjB4MjAweDI1NiwgMSk7CisKKwkvKiBGcmVlIGV4dHJhIChkdXBsaWNhdGVkKSBtb2RlcyAqLworCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7CisJCWogPSAwOworCQl3aGlsZSAoIFNETF9tb2RlbGlzdFtpXVtqXSAmJiBTRExfbW9kZWxpc3RbaV1bal0tPncgKSB7CisJCQlqKys7CisJCX0KKwkJd2hpbGUgKCBTRExfbW9kZWxpc3RbaV1bal0gKSB7CisJCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV1bal0pOworCQkJU0RMX21vZGVsaXN0W2ldW2pdID0gTlVMTDsKKwkJCWorKzsKKwkJfQorCX0KKworCS8qIEZpbGwgaW4gb3VyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBjYXBhYmlsaXRpZXMgKi8KKwlTVkdBX1VwZGF0ZVZpZGVvSW5mbyh0aGlzKTsKKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKDApOworfQorCitTRExfUmVjdCAqKlNWR0FfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCXJldHVybihTRExfbW9kZWxpc3RbKChmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xXSk7Cit9CisKKy8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCitzdGF0aWMgdm9pZCBTVkdBX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworc3RhdGljIHZvaWQgU1ZHQV9CYW5rZWRVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKKworU0RMX1N1cmZhY2UgKlNWR0FfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlpbnQgbW9kZTsKKwlpbnQgdmdhbW9kZTsKKwl2Z2FfbW9kZWluZm8gKm1vZGVpbmZvOworCWludCBzY3JlZW5wYWdlX2xlbjsKKworCS8qIEZyZWUgb2xkIHBpeGVscyBpZiB3ZSB3ZXJlIGluIGJhbmtlZCBtb2RlICovCisJaWYgKCBiYW5rZWQgJiYgY3VycmVudC0+cGl4ZWxzICkgeworCQlmcmVlKGN1cnJlbnQtPnBpeGVscyk7CisJCWN1cnJlbnQtPnBpeGVscyA9IE5VTEw7CisJfQorCisJLyogVHJ5IHRvIHNldCB0aGUgcmVxdWVzdGVkIGxpbmVhciB2aWRlbyBtb2RlICovCisJYnBwID0gKGJwcCs3KS84LTE7CisJZm9yICggbW9kZT0wOyBTRExfbW9kZWxpc3RbYnBwXVttb2RlXTsgKyttb2RlICkgeworCQlpZiAoIChTRExfbW9kZWxpc3RbYnBwXVttb2RlXS0+dyA9PSB3aWR0aCkgJiYKKwkJICAgICAoU0RMX21vZGVsaXN0W2JwcF1bbW9kZV0tPmggPT0gaGVpZ2h0KSApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICggU0RMX21vZGVsaXN0W2JwcF1bbW9kZV0gPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBmaW5kIHJlcXVlc3RlZCBtb2RlIGluIGxpc3QiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwl2Z2Ftb2RlID0gU0RMX3ZnYW1vZGVbYnBwXVttb2RlXTsKKwl2Z2Ffc2V0bW9kZSh2Z2Ftb2RlKTsKKwl2Z2Ffc2V0cGFnZSgwKTsKKworCWlmICggKHZnYV9zZXRsaW5lYXJhZGRyZXNzaW5nKCkgPCAwKSAmJiAodmdhbW9kZSAhPSBHMzIweDIwMHgyNTYpICkgeworCQliYW5rZWQgPSAxOworCX0gZWxzZSB7CisJCWJhbmtlZCA9IDA7CisJfQorICAgIAorCW1vZGVpbmZvID0gdmdhX2dldG1vZGVpbmZvKFNETF92Z2Ftb2RlW2JwcF1bbW9kZV0pOworCisJLyogVXBkYXRlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpbmZvICovCisJU1ZHQV9VcGRhdGVWaWRlb0luZm8odGhpcyk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgdGhlIHNjcmVlbiAqLworCWJwcCA9IChicHArMSkqODsKKwlpZiAoIChicHAgPT0gMTYpICYmIChtb2RlaW5mby0+Y29sb3JzID09IDMyNzY4KSApIHsKKwkJYnBwID0gMTU7CisJfQorCWlmICggISBTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBicHAsIDAsIDAsIDAsIDApICkgeworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogU2V0IHVwIHRoZSBuZXcgbW9kZSBmcmFtZWJ1ZmZlciAqLworCWN1cnJlbnQtPmZsYWdzID0gU0RMX0ZVTExTQ1JFRU47CisJaWYgKCAhYmFua2VkICkgeworCQljdXJyZW50LT5mbGFncyB8PSBTRExfSFdTVVJGQUNFOworCX0KKwlpZiAoIGJwcCA9PSA4ICkgeworCQkvKiBGSVhNRTogV2hhdCBhYm91dCBEaXJlY3RDb2xvcj8gKi8KKwkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKKwl9CisJY3VycmVudC0+dyA9IHdpZHRoOworCWN1cnJlbnQtPmggPSBoZWlnaHQ7CisJY3VycmVudC0+cGl0Y2ggPSBtb2RlaW5mby0+bGluZXdpZHRoOworCWlmICggYmFua2VkICkgeworCQljdXJyZW50LT5waXhlbHMgPSBTRExfbWFsbG9jKGN1cnJlbnQtPmggKiBjdXJyZW50LT5waXRjaCk7CisJCWlmICggIWN1cnJlbnQtPnBpeGVscyApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuKE5VTEwpOworCQl9CisJfSBlbHNlIHsKKwkJY3VycmVudC0+cGl4ZWxzID0gdmdhX2dldGdyYXBobWVtKCk7CisJfQorCisJLyogc2V0IGRvdWJsZS1idWZmZXJpbmcgKi8KKwlpZiAoIChmbGFncyAmIFNETF9ET1VCTEVCVUYpICYmICFiYW5rZWQgKQorCXsKKwkgICAgLyogbGVuZ3RoIG9mIG9uZSBzY3JlZW4gcGFnZSBpbiBieXRlcyAqLworCSAgICBzY3JlZW5wYWdlX2xlbj1jdXJyZW50LT5oKm1vZGVpbmZvLT5saW5ld2lkdGg7CisKKwkgICAgLyogaWYgc3RhcnQgYWRkcmVzcyBzaG91bGQgYmUgYWxpZ25lZCAqLworCSAgICBpZiAoIG1vZGVpbmZvLT5saW5ld2lkdGhfdW5pdCApCisJICAgIHsKKwkJaWYgKCBzY3JlZW5wYWdlX2xlbiAlIG1vZGVpbmZvLT5saW5ld2lkdGhfdW5pdCApICAgIAorCQl7CisJCSAgICBzY3JlZW5wYWdlX2xlbiArPSBtb2RlaW5mby0+bGluZXdpZHRoX3VuaXQgLSAoIHNjcmVlbnBhZ2VfbGVuICUgbW9kZWluZm8tPmxpbmV3aWR0aF91bml0ICk7CisJCX0KKwkgICAgfQorCisJICAgIC8qIGlmIHdlIGhldmUgZW5vdWdoIHZpZGVvbWVtb3J5ID0gIGFrIGplIGRvc3QgdmlkZW9wYW1ldGUgICovCisJICAgIGlmICggbW9kZWluZm8tPm1lbW9yeSA+ICggc2NyZWVucGFnZV9sZW4gKiAyIC8gMTAyNCApICkKKwkgICAgeworCQljdXJyZW50LT5mbGFncyB8PSBTRExfRE9VQkxFQlVGOworCQlmbGlwX3BhZ2UgPSAwOworCQlmbGlwX29mZnNldFswXSA9IDA7CisJCWZsaXBfb2Zmc2V0WzFdID0gc2NyZWVucGFnZV9sZW47CisJCWZsaXBfYWRkcmVzc1swXSA9IHZnYV9nZXRncmFwaG1lbSgpOworCQlmbGlwX2FkZHJlc3NbMV0gPSBmbGlwX2FkZHJlc3NbMF0rc2NyZWVucGFnZV9sZW47CisJCVNWR0FfRmxpcEhXU3VyZmFjZSh0aGlzLGN1cnJlbnQpOworCSAgICB9CisJfSAKKworCS8qIFNldCB0aGUgYmxpdCBmdW5jdGlvbiAqLworCWlmICggYmFua2VkICkgeworCQl0aGlzLT5VcGRhdGVSZWN0cyA9IFNWR0FfQmFua2VkVXBkYXRlOworCX0gZWxzZSB7CisJCXRoaXMtPlVwZGF0ZVJlY3RzID0gU1ZHQV9EaXJlY3RVcGRhdGU7CisJfQorCisJLyogU2V0IHVwIHRoZSBtb3VzZSBoYW5kbGVyIGFnYWluIChidWdneSBTVkdBbGliIDEuNDApICovCisJbW91c2Vfc2V0ZXZlbnRoYW5kbGVyKFNWR0FfbW91c2VjYWxsYmFjayk7CisKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuKGN1cnJlbnQpOworfQorCisvKiBXZSBkb24ndCBhY3R1YWxseSBhbGxvdyBoYXJkd2FyZSBzdXJmYWNlcyBvdGhlciB0aGFuIHRoZSBtYWluIG9uZSAqLworc3RhdGljIGludCBTVkdBX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oLTEpOworfQorc3RhdGljIHZvaWQgU1ZHQV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKKy8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSBvbiBwYWdlIGZsaXBwZWQgZGlzcGxheXMgKi8KK3N0YXRpYyBpbnQgU1ZHQV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwkvKiBUaGUgd2FpdGluZyBpcyBkb25lIGluIFNWR0FfRmxpcEhXU3VyZmFjZSgpICovCisJcmV0dXJuKDApOworfQorc3RhdGljIHZvaWQgU1ZHQV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybjsKK30KKworc3RhdGljIGludCBTVkdBX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWlmICggIWJhbmtlZCApIHsKKwkJdmdhX3NldGRpc3BsYXlzdGFydChmbGlwX29mZnNldFtmbGlwX3BhZ2VdKTsKKwkJZmxpcF9wYWdlPSFmbGlwX3BhZ2U7CisJCXN1cmZhY2UtPnBpeGVscz1mbGlwX2FkZHJlc3NbZmxpcF9wYWdlXTsKKwkJdmdhX3dhaXRyZXRyYWNlKCk7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgU1ZHQV9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgU1ZHQV9CYW5rZWRVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCWludCBpLCBqOworCVNETF9SZWN0ICpyZWN0OworCWludCBwYWdlLCB2cDsKKwlpbnQgeCwgeSwgdywgaDsKKwl1bnNpZ25lZCBjaGFyICpzcmM7CisJdW5zaWduZWQgY2hhciAqZHN0OworCWludCBicHAgPSB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKKwlpbnQgcGl0Y2ggPSB0aGlzLT5zY3JlZW4tPnBpdGNoOworCisJZHN0ID0gdmdhX2dldGdyYXBobWVtKCk7CisJZm9yICggaT0wOyBpIDwgbnVtcmVjdHM7ICsraSApIHsKKwkJcmVjdCA9ICZyZWN0c1tpXTsKKwkJeCA9IHJlY3QtPng7CisJCXkgPSByZWN0LT55OworCQl3ID0gcmVjdC0+dyAqIGJwcDsKKwkJaCA9IHJlY3QtPmg7CisKKwkJdnAgPSB5ICogcGl0Y2ggKyB4ICogYnBwOworCQlzcmMgPSAodW5zaWduZWQgY2hhciAqKXRoaXMtPnNjcmVlbi0+cGl4ZWxzICsgdnA7CisJCXBhZ2UgPSB2cCA+PiAxNjsKKwkJdnAgJj0gMHhmZmZmOworCQl2Z2Ffc2V0cGFnZShwYWdlKTsKKwkJZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworCQkJaWYgKHZwICsgdyA+IDB4MTAwMDApIHsKKwkJCQlpZiAodnAgPj0gMHgxMDAwMCkgeworCQkJCQlwYWdlKys7CisJCQkJCXZnYV9zZXRwYWdlKHBhZ2UpOworCQkJCQl2cCAmPSAweGZmZmY7CisJCQkJfSBlbHNlIHsKKwkJCQkJU0RMX21lbWNweShkc3QgKyB2cCwgc3JjLCAweDEwMDAwIC0gdnApOworCQkJCQlwYWdlKys7CisJCQkJCXZnYV9zZXRwYWdlKHBhZ2UpOworCQkJCQlTRExfbWVtY3B5KGRzdCwgc3JjICsgMHgxMDAwMCAtIHZwLAorCQkJCQkJICh2cCArIHcpICYgMHhmZmZmKTsKKwkJCQkJdnAgPSAodnAgKyBwaXRjaCkgJiAweGZmZmY7CisJCQkJCXNyYyArPSBwaXRjaDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJU0RMX21lbWNweShkc3QgKyB2cCwgc3JjLCB3KTsKKwkJCXNyYyArPSBwaXRjaDsKKwkJCXZwICs9IHBpdGNoOworCQl9CisJfQorfQorCitpbnQgU1ZHQV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisgICAgICAgIGludCBpOworCisJZm9yKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7CisJICAgICAgICB2Z2Ffc2V0cGFsZXR0ZShmaXJzdGNvbG9yICsgaSwKKwkJCSAgICAgICBjb2xvcnNbaV0ucj4+MiwKKwkJCSAgICAgICBjb2xvcnNbaV0uZz4+MiwKKwkJCSAgICAgICBjb2xvcnNbaV0uYj4+Mik7CisJfQorCXJldHVybigxKTsKK30KKworLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCisgICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCisqLwordm9pZCBTVkdBX1ZpZGVvUXVpdChfVEhJUykKK3sKKwlpbnQgaSwgajsKKworCS8qIFJlc2V0IHRoZSBjb25zb2xlIHZpZGVvIG1vZGUgKi8KKwlpZiAoIHRoaXMtPnNjcmVlbiAmJiAodGhpcy0+c2NyZWVuLT53ICYmIHRoaXMtPnNjcmVlbi0+aCkgKSB7CisJCXZnYV9zZXRtb2RlKFRFWFQpOworCX0KKwlrZXlib2FyZF9jbG9zZSgpOworCisJLyogRnJlZSB2aWRlbyBtb2RlIGxpc3RzICovCisJZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKKwkJaWYgKCBTRExfbW9kZWxpc3RbaV0gIT0gTlVMTCApIHsKKwkJCWZvciAoIGo9MDsgU0RMX21vZGVsaXN0W2ldW2pdOyArK2ogKQorCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXVtqXSk7CisJCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOworCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKKwkJfQorCQlpZiAoIFNETF92Z2Ftb2RlW2ldICE9IE5VTEwgKSB7CisJCQlTRExfZnJlZShTRExfdmdhbW9kZVtpXSk7CisJCQlTRExfdmdhbW9kZVtpXSA9IE5VTEw7CisJCX0KKwl9CisJaWYgKCB0aGlzLT5zY3JlZW4gKSB7CisJCWlmICggYmFua2VkICYmIHRoaXMtPnNjcmVlbi0+cGl4ZWxzICkgeworCQkJU0RMX2ZyZWUodGhpcy0+c2NyZWVuLT5waXhlbHMpOworCQl9CisJCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ZnYS9TRExfc3ZnYXZpZGVvLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2F2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjg2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N2Z2EvU0RMX3N2Z2F2aWRlby5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfc3ZnYXZpZGVvX2gKKyNkZWZpbmUgX1NETF9zdmdhdmlkZW9faAorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKKworLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgKi8KK3N0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7CisjZGVmaW5lIE5VTV9NT0RFTElTVFMJNAkJLyogOCwgMTYsIDI0LCBhbmQgMzIgYml0cy1wZXItcGl4ZWwgKi8KKwlpbnQgU0RMX251bW1vZGVzW05VTV9NT0RFTElTVFNdOworCVNETF9SZWN0ICoqU0RMX21vZGVsaXN0W05VTV9NT0RFTElTVFNdOworCWludCAqU0RMX3ZnYW1vZGVbTlVNX01PREVMSVNUU107CisKKwkvKiBpbmZvcm1hdGlvbiBmb3IgZG91YmxlLWJ1ZmZlcmluZyAqLworCWludCBmbGlwX3BhZ2U7CisJaW50IGZsaXBfb2Zmc2V0WzJdOworCVVpbnQ4ICpmbGlwX2FkZHJlc3NbMl07CisKKwkvKiBTZXQgdG8gMSBpZiB3ZSdyZSBpbiBiYW5rZWQgdmlkZW8gbW9kZSAqLworCWludCBiYW5rZWQ7Cit9OworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIFNETF9udW1tb2RlcwkJKHRoaXMtPmhpZGRlbi0+U0RMX251bW1vZGVzKQorI2RlZmluZSBTRExfbW9kZWxpc3QJCSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKKyNkZWZpbmUgU0RMX3ZnYW1vZGUJCSh0aGlzLT5oaWRkZW4tPlNETF92Z2Ftb2RlKQorI2RlZmluZSBmbGlwX3BhZ2UJCSh0aGlzLT5oaWRkZW4tPmZsaXBfcGFnZSkKKyNkZWZpbmUgZmxpcF9vZmZzZXQJCSh0aGlzLT5oaWRkZW4tPmZsaXBfb2Zmc2V0KQorI2RlZmluZSBmbGlwX2FkZHJlc3MJCSh0aGlzLT5oaWRkZW4tPmZsaXBfYWRkcmVzcykKKyNkZWZpbmUJYmFua2VkCQkJKHRoaXMtPmhpZGRlbi0+YmFua2VkKQorCisjZW5kaWYgLyogX1NETF9zdmdhdmlkZW9faCAqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N5bWJpYW4vRUtBMS9TRExfZXBvY2V2ZW50cy5jcHAgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N5bWJpYW4vRUtBMS9TRExfZXBvY2V2ZW50cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlZWQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0ExL1NETF9lcG9jZXZlbnRzLmNwcApAQCAtMCwwICsxLDYyNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AZGV2b2x1dGlvbi5jb20KKyovCisKKy8qCisgICAgU0RMX2Vwb2NldmVudHMuY3BwCisgICAgSGFuZGxlIHRoZSBldmVudCBzdHJlYW0sIGNvbnZlcnRpbmcgRXBvYyBldmVudHMgaW50byBTREwgZXZlbnRzCisKKyAgICBFcG9jIHZlcnNpb24gYnkgSGFubnUgVmlpdGFsYSAoaGFubnUuai52aWl0YWxhQG1ibmV0LmZpKQorKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyN1bmRlZiBOVUxMCitleHRlcm4gIkMiIHsKKy8vI2RlZmluZSBERUJVR19UUkFDRV9FTkFCTEVECisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2tleXN5bS5oIgorI2luY2x1ZGUgIlNETF9rZXlib2FyZC5oIgorI2luY2x1ZGUgIlNETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorfTsgLyogZXh0ZXJuICJDIiAqLworCisjaW5jbHVkZSAiU0RMX2Vwb2N2aWRlby5oIgorI2luY2x1ZGUgIlNETF9lcG9jZXZlbnRzX2MuaCIKKworI2luY2x1ZGU8bGluZXJlYWRlci5oPgorI2luY2x1ZGU8YmF1dGlscy5oPgorCisKKyNpbmNsdWRlIDxoYWwuaD4KKworZXh0ZXJuICJDIiB7CisvKiBUaGUgdHJhbnNsYXRpb24gdGFibGVzIGZyb20gYSBjb25zb2xlIHNjYW5jb2RlIHRvIGEgU0RMIGtleXN5bSAqLworc3RhdGljIFNETEtleSBrZXltYXBbTUFYX1NDQU5DT0RFXTsKK3N0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoX1RISVMsIGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKTsKK3ZvaWQgRGlzYWJsZUtleUJsb2NraW5nKF9USElTKTsKK307IC8qIGV4dGVybiAiQyIgKi8KKworVEJvb2wgaXNDdXJzb3JWaXNpYmxlID0gRUZhbHNlOworCitpbnQgRVBPQ19IYW5kbGVXc0V2ZW50KF9USElTLCBjb25zdCBUV3NFdmVudCYgYVdzRXZlbnQpCit7CisgICAgaW50IHBvc3RlZCA9IDA7CisgICAgU0RMX2tleXN5bSBrZXlzeW07CisgICAgCisvLyAgICBTRExfVFJBQ0UxKCJod3MgJWQiLCBhV3NFdmVudC5UeXBlKCkpOworCisgICAgc3dpdGNoIChhV3NFdmVudC5UeXBlKCkpCisJCXsgICAgCisgICAgY2FzZSBFRXZlbnRQb2ludGVyOiAvKiBNb3VzZSBwb2ludGVyIGV2ZW50cyAqLworCQl7CisKKyAgICAgICAgY29uc3QgVFBvaW50ZXJDdXJzb3JNb2RlIG1vZGUgPSAgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uUG9pbnRlckN1cnNvck1vZGUoKTsKKworICAgICAgICBpZihtb2RlID09IEVQb2ludGVyQ3Vyc29yTm9uZSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsgLy9UT0RPOiBGaW5kIG91dCB3aHkgZXZlbnRzIGFyZSBnZXQgZGVzcGl0ZSBvZiBjdXJzb3Igc2hvdWxkIGJlIG9mZgorICAgICAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFRQb2ludGVyRXZlbnQqIHBvaW50ZXJFdmVudCA9IGFXc0V2ZW50LlBvaW50ZXIoKTsKKyAgICAgICAgVFBvaW50IG1vdXNlUG9zID0gcG9pbnRlckV2ZW50LT5pUG9zaXRpb247CisKKyAgICAgICAgLyohISBUT0RPIFBvaW50ZXIgZG8gbm90IHlldCB3b3JrIHByb3Blcmx5CisgICAgICAgIC8vU0RMX1RSQUNFMSgiU0RMOiBFUE9DX0hhbmRsZVdzRXZlbnQsIHBvaW50ZXJFdmVudC0+aVR5cGU9JWQiLCBwb2ludGVyRXZlbnQtPmlUeXBlKTsgLy8hIQorCisgICAgICAgIGlmIChQcml2YXRlLT5FUE9DX1Nocmlua2VkSGVpZ2h0KSB7CisgICAgICAgICAgICBtb3VzZVBvcy5pWSA8PD0gMTsgLy8gU2NhbGUgeSBjb29yZGluYXRlIHRvIHNocmlua2VkIHNjcmVlbiBoZWlnaHQKKyAgICAgICAgfQorICAgICAgICBpZiAoUHJpdmF0ZS0+RVBPQ19TaHJpbmtlZFdpZHRoKSB7CisgICAgICAgICAgICBtb3VzZVBvcy5pWCA8PD0gMTsgLy8gU2NhbGUgeCBjb29yZGluYXRlIHRvIHNocmlua2VkIHNjcmVlbiB3aWR0aAorICAgICAgICB9CisgICAgICAgICovCisKKwkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgbW91c2VQb3MuaVgsIG1vdXNlUG9zLmlZKTsgLyogQWJzb2x1dGUgcG9zaXRpb24gb24gc2NyZWVuICovCisKKwkJc3dpdGNoIChwb2ludGVyRXZlbnQtPmlUeXBlKQorCQkJeworICAgICAgICBjYXNlIFRQb2ludGVyRXZlbnQ6OkVCdXR0b24xRG93bjoKKyAgICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBTRExfQlVUVE9OX0xFRlQsIDAsIDApOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgVFBvaW50ZXJFdmVudDo6RUJ1dHRvbjFVcDoKKwkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgU0RMX0JVVFRPTl9MRUZULCAwLCAwKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFRQb2ludGVyRXZlbnQ6OkVCdXR0b24yRG93bjoKKyAgICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBTRExfQlVUVE9OX1JJR0hULCAwLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFRQb2ludGVyRXZlbnQ6OkVCdXR0b24yVXA6CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIFNETF9CVVRUT05fUklHSFQsIDAsIDApOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgVFBvaW50ZXJFdmVudDo6RUJ1dHRvbjNEb3duOgorICAgICAgICAgICAgcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIFNETF9CVVRUT05fTUlERExFLCAwLCAwKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFRQb2ludGVyRXZlbnQ6OkVCdXR0b24zVXA6CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIFNETF9CVVRUT05fTUlERExFLCAwLCAwKTsKKwkJCWJyZWFrOworCQkJfSAvLyBzd2l0Y2gKKyAgICAgICAgYnJlYWs7CisJICAgIH0KKyAgICAKKyAgICBjYXNlIEVFdmVudEtleURvd246IC8qIEtleSBldmVudHMgKi8KKyAgICB7CisjaWZkZWYgU1lNQklBTl9DUllTVEFMCisJCS8vIHNwZWNpYWwgY2FzZTogOTMwMC85NTAwIHJvY2tlciBkb3duLCBzaW11bGF0ZSBsZWZ0IG1vdXNlIGJ1dHRvbgorCQlpZiAoYVdzRXZlbnQuS2V5KCktPmlTY2FuQ29kZSA9PSBFU3RkS2V5RGV2aWNlQSkKKwkJCXsKKyAgICAgICAgICAgIGNvbnN0IFRQb2ludGVyQ3Vyc29yTW9kZSBtb2RlID0gIFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlBvaW50ZXJDdXJzb3JNb2RlKCk7CisgICAgICAgICAgICBpZihtb2RlICE9IEVQb2ludGVyQ3Vyc29yTm9uZSkgCisgICAgICAgICAgICAgICAgcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIFNETF9CVVRUT05fTEVGVCwgMCwgMCk7CisJCQl9CisjZW5kaWYKKyAgICAgICAodm9pZCopVHJhbnNsYXRlS2V5KF90aGlzLCBhV3NFdmVudC5LZXkoKS0+aVNjYW5Db2RlLCAma2V5c3ltKTsKKyAgICAgICAgICAgIAorI2lmbmRlZiBESVNBQkxFX0pPWVNUSUNLCisgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgKi8KKyAgICAgICAgc3dpdGNoKChpbnQpa2V5c3ltLnN5bSkgeworICAgICAgICBjYXNlIFNETEtfQ0FQU0xPQ0s6CisgICAgICAgICAgICBpZiAoIWlzQ3Vyc29yVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSB2aXJ0dWFsIGN1cnNvciAqLworCSAgICAgICAgICAgIEhBTDo6U2V0KEhBTDo6RU1vdXNlU3RhdGUsIEhBTDo6RU1vdXNlU3RhdGVfVmlzaWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHZpcnR1YWwgY3Vyc29yICovCisgICAgICAgICAgICAgICAgSEFMOjpTZXQoSEFMOjpFTW91c2VTdGF0ZSwgSEFMOjpFTW91c2VTdGF0ZV9JbnZpc2libGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXNDdXJzb3JWaXNpYmxlID0gIWlzQ3Vyc29yVmlzaWJsZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYgICAgICAgIAorCSAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgJmtleXN5bSk7CisgICAgICAgIGJyZWFrOworCX0gCisKKyAgICBjYXNlIEVFdmVudEtleVVwOiAvKiBLZXkgZXZlbnRzICovCisJCXsKKyNpZmRlZiBTWU1CSUFOX0NSWVNUQUwKKwkJLy8gc3BlY2lhbCBjYXNlOiA5MzAwLzk1MDAgcm9ja2VyIHVwLCBzaW11bGF0ZSBsZWZ0IG1vdXNlIGJ1dHRvbgorCQlpZiAoYVdzRXZlbnQuS2V5KCktPmlTY2FuQ29kZSA9PSBFU3RkS2V5RGV2aWNlQSkKKwkJCXsKKyAgICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9SRUxFQVNFRCwgU0RMX0JVVFRPTl9MRUZULCAwLCAwKTsKKwkJCX0KKyNlbmRpZgorCSAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsIFRyYW5zbGF0ZUtleShfdGhpcywgYVdzRXZlbnQuS2V5KCktPmlTY2FuQ29kZSwgJmtleXN5bSkpOworICAgICAgICBicmVhazsKKwkJfQorICAgIAorICAgIGNhc2UgRUV2ZW50Rm9jdXNHYWluZWQ6IC8qIFNETCB3aW5kb3cgZ290IGZvY3VzICovCisJICAgIHsKKyAgICAgICAgUHJpdmF0ZS0+RVBPQ19Jc1dpbmRvd0ZvY3VzZWQgPSBFVHJ1ZTsKKwkJcG9zdGVkICs9IFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBJTlBVVEZPQ1VTfFNETF9BUFBNT1VTRUZPQ1VTKTsKKyAgICAgICAgLyogRHJhdyB3aW5kb3cgYmFja2dyb3VuZCBhbmQgc2NyZWVuIGJ1ZmZlciAqLworICAgICAgICBEaXNhYmxlS2V5QmxvY2tpbmcoX3RoaXMpOyAgLy9NYXJrdXM6IGd1ZXNzIHdoeTotKQorIAorICAgICAgICBSZWRyYXdXaW5kb3dMKF90aGlzKTsgIAorICAgICAgICBicmVhazsKKwkgICAgfQorCisgICAgY2FzZSBFRXZlbnRGb2N1c0xvc3Q6IC8qIFNETCB3aW5kb3cgbG9zdCBmb2N1cyAqLworCQl7CisvKiAgICAgICAgCisgICAgICAgIENGYnNCaXRtYXAqIGJtcCA9IG5ldyAoRUxlYXZlKSBDRmJzQml0bWFwKCk7CisgICAgICAgIGJtcC0+Q3JlYXRlKFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZSwgUHJpdmF0ZS0+RVBPQ19EaXNwbGF5TW9kZSk7CisgICAgICAgIFByaXZhdGUtPkVQT0NfV3NTY3JlZW4tPkNvcHlTY3JlZW5Ub0JpdG1hcChibXApOworICAgICAgICBQcml2YXRlLT5FUE9DX1dpbmRvd0djLT5BY3RpdmF0ZShQcml2YXRlLT5FUE9DX1dzV2luZG93KTsKKyAgICAgICAgUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5CZWdpblJlZHJhdyhUUmVjdChQcml2YXRlLT5FUE9DX1dzV2luZG93LlNpemUoKSkpOworCSAgICBQcml2YXRlLT5FUE9DX1dpbmRvd0djLT5CaXRCbHQoVFBvaW50KDAsIDApLCBibXApOworCSAgICBQcml2YXRlLT5FUE9DX1dzV2luZG93LkVuZFJlZHJhdygpOworCSAgICBQcml2YXRlLT5FUE9DX1dpbmRvd0djLT5EZWFjdGl2YXRlKCk7CisgICAgICAgIGJtcC0+U2F2ZShfTCgiQzpcXHNjci5tYm0iKSk7CisgICAgICAgIGRlbGV0ZSBibXA7CisqLyAgICAgICAKKworCQlQcml2YXRlLT5FUE9DX0lzV2luZG93Rm9jdXNlZCA9IEVGYWxzZTsKKworCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUElOUFVURk9DVVN8U0RMX0FQUE1PVVNFRk9DVVMpOworCisgICAgICAgIFJXc1Nlc3Npb24gczsKKyAgICAgICAgcy5Db25uZWN0KCk7CisgICAgICAgIFJXaW5kb3dHcm91cCBnKHMpOworICAgICAgICBnLkNvbnN0cnVjdChUVWludDMyKCZnKSwgRUZhbHNlKTsKKyAgICAgICAgZy5FbmFibGVSZWNlaXB0T2ZGb2N1cyhFRmFsc2UpOworICAgICAgICBSV2luZG93IHcocyk7CisgICAgICAgIHcuQ29uc3RydWN0KGcsIFRVaW50MzIoJncpKTsKKyAgICAgICAgdy5TZXRFeHRlbnQoVFBvaW50KDAsIDApLCBQcml2YXRlLT5FUE9DX1dzV2luZG93LlNpemUoKSk7CisgICAgICAgIHcuU2V0T3JkaW5hbFBvc2l0aW9uKDApOworICAgICAgICB3LkFjdGl2YXRlKCk7CisgICAgICAgIHcuQ2xvc2UoKTsKKyAgICAgICAgZy5DbG9zZSgpOworICAgICAgICBzLkNsb3NlKCk7CisKKy8qCisgICAgICAgIFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlNldFdpbmRvd0dyb3VwT3JkaW5hbFBvc2l0aW9uKFByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cElELCAtMSk7CisKKyAgICAgICAgICAgIAorICAgICAgICBTRExfRGVsYXkoNTAwKTsKKyAgICAgICAgVEludCBmb2N1cyA9IC0xOworICAgICAgICB3aGlsZShmb2N1cyA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBUSW50IGN1cnIgPSBQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5HZXRGb2N1c1dpbmRvd0dyb3VwKCk7CisgICAgICAgICAgICBpZihjdXJyICE9IFByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cElEKQorICAgICAgICAgICAgICAgIGZvY3VzID0gY3VycjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTRExfRGVsYXkoNTAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZigxIDwgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uR2V0V2luZG93R3JvdXBPcmRpbmFsUHJpb3JpdHkoUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwSUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uU2V0V2luZG93R3JvdXBPcmRpbmFsUG9zaXRpb24oZm9jdXMsIC0xKTsKKyAgICAgICAgICAgIFNETF9EZWxheSg1MDApOworICAgICAgICAgICAgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uU2V0V2luZG93R3JvdXBPcmRpbmFsUG9zaXRpb24oZm9jdXMsIDApOworICAgICAgICAgICAgfQorKi8KKyAgICAgICAgLyovL2FuZCB0aGUgcmVxdWVzdCByZWRyYXcKKyAgICAgICAgVFJhd0V2ZW50IHJlZHJhd0V2ZW50OworICAgICAgICByZWRyYXdFdmVudC5TZXQoVFJhd0V2ZW50OjpFUmVkcmF3KTsKKyAgICAgICAgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uU2ltdWxhdGVSYXdFdmVudChyZWRyYXdFdmVudCk7CisgICAgICAgIFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkZsdXNoKCk7Ki8KKyNpZiAwCisgICAgICAgIC8vISEgTm90IHVzZWQKKyAgICAgICAgLy8gV2FpdCBhbmQgZWF0IGV2ZW50cyB1bnRpbCBmb2N1cyBpcyBnYWluZWQgYWdhaW4KKwkgICAgd2hpbGUgKEVUcnVlKSB7CisgICAgICAgICAgICBQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5FdmVudFJlYWR5KCZQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMpOworICAgICAgICAgICAgVXNlcjo6V2FpdEZvclJlcXVlc3QoUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50U3RhdHVzKTsKKwkJICAgIFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkdldEV2ZW50KFByaXZhdGUtPkVQT0NfV3NFdmVudCk7CisgICAgICAgICAgICBUSW50IGV2ZW50VHlwZSA9IFByaXZhdGUtPkVQT0NfV3NFdmVudC5UeXBlKCk7CisJCSAgICBQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMgPSBLUmVxdWVzdFBlbmRpbmc7CisJCSAgICAvL1ByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkV2ZW50UmVhZHkoJlByaXZhdGUtPkVQT0NfV3NFdmVudFN0YXR1cyk7CisgICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IEVFdmVudEZvY3VzR2FpbmVkKSB7CisgICAgICAgICAgICAgICAgUmVkcmF3V2luZG93TChfdGhpcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisJICAgIH0KKyNlbmRpZgorICAgICAgICBicmVhazsKKwkgICAgfQorCisgICAgY2FzZSBFRXZlbnRNb2RpZmllcnNDaGFuZ2VkOiAKKyAgICB7CisJICAgIFRNb2RpZmllcnNDaGFuZ2VkRXZlbnQqIG1vZEV2ZW50ID0gYVdzRXZlbnQuTW9kaWZpZXJzQ2hhbmdlZCgpOworICAgICAgICBUVWludCBtb2RzdGF0ZSA9IEtNT0RfTk9ORTsKKyAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllckxlZnRTaGlmdCkKKyAgICAgICAgICAgIG1vZHN0YXRlIHw9IEtNT0RfTFNISUZUOworICAgICAgICBpZiAobW9kRXZlbnQtPmlNb2RpZmllcnMgPT0gRU1vZGlmaWVyUmlnaHRTaGlmdCkKKyAgICAgICAgICAgIG1vZHN0YXRlIHw9IEtNT0RfUlNISUZUOworICAgICAgICBpZiAobW9kRXZlbnQtPmlNb2RpZmllcnMgPT0gRU1vZGlmaWVyTGVmdEN0cmwpCisgICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX0xDVFJMOworICAgICAgICBpZiAobW9kRXZlbnQtPmlNb2RpZmllcnMgPT0gRU1vZGlmaWVyUmlnaHRDdHJsKQorICAgICAgICAgICAgbW9kc3RhdGUgfD0gS01PRF9SQ1RSTDsKKyAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllckxlZnRBbHQpCisgICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX0xBTFQ7CisgICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJSaWdodEFsdCkKKyAgICAgICAgICAgIG1vZHN0YXRlIHw9IEtNT0RfUkFMVDsKKyAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllckxlZnRGdW5jKQorICAgICAgICAgICAgbW9kc3RhdGUgfD0gS01PRF9MTUVUQTsKKyAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllclJpZ2h0RnVuYykKKyAgICAgICAgICAgIG1vZHN0YXRlIHw9IEtNT0RfUk1FVEE7CisgICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJDYXBzTG9jaykKKyAgICAgICAgICAgIG1vZHN0YXRlIHw9IEtNT0RfQ0FQUzsKKyAgICAgICAgU0RMX1NldE1vZFN0YXRlKFNUQVRJQ19DQVNUKFNETE1vZCwobW9kc3RhdGUgfCBLTU9EX0xTSElGVCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6ICAgICAgICAgICAgCisgICAgICAgIGJyZWFrOworCX0gCisJCisgICAgcmV0dXJuIHBvc3RlZDsKK30KKworZXh0ZXJuICJDIiB7CisKK3ZvaWQgRVBPQ19QdW1wRXZlbnRzKF9USElTKQoreworICAgIGludCBwb3N0ZWQgPSAwOyAvLyAhISBEbyB3ZSBuZWVkIHRoaXM/CisgICAgLy9Qcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5FdmVudFJlYWR5KCZQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMpOworCXdoaWxlIChQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMgIT0gS1JlcXVlc3RQZW5kaW5nKSB7CisKKwkJUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uR2V0RXZlbnQoUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50KTsKKwkJcG9zdGVkID0gRVBPQ19IYW5kbGVXc0V2ZW50KF90aGlzLCBQcml2YXRlLT5FUE9DX1dzRXZlbnQpOworCQlQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMgPSBLUmVxdWVzdFBlbmRpbmc7CisJCVByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkV2ZW50UmVhZHkoJlByaXZhdGUtPkVQT0NfV3NFdmVudFN0YXR1cyk7CisJfQorfQorCisKK19MSVQoS01hcEZpbGVOYW1lLCAiQzpcXHNkbF9pbmZvXFxzZGxrZXltYXAuY2ZnIik7CitMT0NBTF9DIHZvaWQgUmVhZEwoUkZzJiBhRnMsIFJBcnJheTxUSW50PiYgYUFycmF5KQorICAgIHsKKyAgICBUSW50IGRyaXZlID0gLTE7CisgICAgVEZpbGVOYW1lIG5hbWUoS01hcEZpbGVOYW1lKTsKKyAgICBmb3IoVEludCBpID0gJ3onOyBkcml2ZSA8IDAgJiYgaSA+PSAnYSc7IGktLSkKKyAgICAgICAgeworICAgICAgICBuYW1lWzBdID0gKFRVaW50MTYpaTsKKyAgICAgICAgaWYoQmFmbFV0aWxzOjpGaWxlRXhpc3RzKGFGcywgbmFtZSkpCisgICAgICAgICAgICBkcml2ZSA9IGk7CisgICAgICAgIH0KKyAgICBpZihkcml2ZSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBDTGluZVJlYWRlciogcmVhZGVyID0gQ0xpbmVSZWFkZXI6Ok5ld0xDKGFGcywgbmFtZSk7CisgICAgd2hpbGUocmVhZGVyLT5OZXh0TCgpKQorICAgICAgICB7CisgICAgICAgIFRQdHJDIGxuID0gcmVhZGVyLT5DdXJyZW50KCk7CisgICAgICAgIFRMZXggbGluZShsbik7CisgICAgICAgIFRJbnQgbiA9IDA7CisgICAgICAgIGZvcig7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFRQdHJDIHRva2VuID0gbGluZS5OZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmKHRva2VuLkxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZigobiAmIDEpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRJbnQgdmFsdWU7CisgICAgICAgICAgICAgICAgVExleCBsZXgodG9rZW4pOworICAgICAgICAgICAgICAgIFVzZXI6OkxlYXZlSWZFcnJvcihsZXguVmFsKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgVXNlcjo6TGVhdmVJZkVycm9yKGFBcnJheS5BcHBlbmQodmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBDbGVhbnVwU3RhY2s6OlBvcEFuZERlc3Ryb3koKTsKKyAgICB9CisKKwordm9pZCBFUE9DX0luaXRPU0tleW1hcChfVEhJUykKK3sKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgdGhlIGtleSB0cmFuc2xhdGlvbiB0YWJsZSAqLworCWZvciAoIGk9MDsgaTxTRExfVEFCTEVTSVpFKGtleW1hcCk7ICsraSApCisJCWtleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKKworCisJLyogTnVtYmVycyAqLworCWZvciAoIGkgPSAwOyBpPDMyOyArK2kgKXsKKwkJa2V5bWFwWycgJyArIGldID0gKFNETEtleSkoU0RMS19TUEFDRStpKTsKKwl9CisJLyogZS5nLiBBbHBoYWJldCBrZXlzICovCisJZm9yICggaSA9IDA7IGk8MzI7ICsraSApeworCQlrZXltYXBbJ0EnICsgaV0gPSAoU0RMS2V5KShTRExLX2EraSk7CisJfQorCisJa2V5bWFwW0VTdGRLZXlCYWNrc3BhY2VdICAgID0gU0RMS19CQUNLU1BBQ0U7CisJa2V5bWFwW0VTdGRLZXlUYWJdICAgICAgICAgID0gU0RMS19UQUI7CisJa2V5bWFwW0VTdGRLZXlFbnRlcl0gICAgICAgID0gU0RMS19SRVRVUk47CisJa2V5bWFwW0VTdGRLZXlFc2NhcGVdICAgICAgID0gU0RMS19FU0NBUEU7CisgICAJa2V5bWFwW0VTdGRLZXlTcGFjZV0gICAgICAgID0gU0RMS19TUEFDRTsKKyAgIAlrZXltYXBbRVN0ZEtleVBhdXNlXSAgICAgICAgPSBTRExLX1BBVVNFOworICAgCWtleW1hcFtFU3RkS2V5SG9tZV0gICAgICAgICA9IFNETEtfSE9NRTsKKyAgIAlrZXltYXBbRVN0ZEtleUVuZF0gICAgICAgICAgPSBTRExLX0VORDsKKyAgIAlrZXltYXBbRVN0ZEtleVBhZ2VVcF0gICAgICAgPSBTRExLX1BBR0VVUDsKKyAgIAlrZXltYXBbRVN0ZEtleVBhZ2VEb3duXSAgICAgPSBTRExLX1BBR0VET1dOOworCWtleW1hcFtFU3RkS2V5RGVsZXRlXSAgICAgICA9IFNETEtfREVMRVRFOworCWtleW1hcFtFU3RkS2V5VXBBcnJvd10gICAgICA9IFNETEtfVVA7CisJa2V5bWFwW0VTdGRLZXlEb3duQXJyb3ddICAgID0gU0RMS19ET1dOOworCWtleW1hcFtFU3RkS2V5TGVmdEFycm93XSAgICA9IFNETEtfTEVGVDsKKwlrZXltYXBbRVN0ZEtleVJpZ2h0QXJyb3ddICAgPSBTRExLX1JJR0hUOworCWtleW1hcFtFU3RkS2V5Q2Fwc0xvY2tdICAgICA9IFNETEtfQ0FQU0xPQ0s7CisJa2V5bWFwW0VTdGRLZXlMZWZ0U2hpZnRdICAgID0gU0RMS19MU0hJRlQ7CisJa2V5bWFwW0VTdGRLZXlSaWdodFNoaWZ0XSAgID0gU0RMS19SU0hJRlQ7CisJa2V5bWFwW0VTdGRLZXlMZWZ0QWx0XSAgICAgID0gU0RMS19MQUxUOworCWtleW1hcFtFU3RkS2V5UmlnaHRBbHRdICAgICA9IFNETEtfUkFMVDsKKwlrZXltYXBbRVN0ZEtleUxlZnRDdHJsXSAgICAgPSBTRExLX0xDVFJMOworCWtleW1hcFtFU3RkS2V5UmlnaHRDdHJsXSAgICA9IFNETEtfUkNUUkw7CisJa2V5bWFwW0VTdGRLZXlMZWZ0RnVuY10gICAgID0gU0RMS19MTUVUQTsKKwlrZXltYXBbRVN0ZEtleVJpZ2h0RnVuY10gICAgPSBTRExLX1JNRVRBOworCWtleW1hcFtFU3RkS2V5SW5zZXJ0XSAgICAgICA9IFNETEtfSU5TRVJUOworCWtleW1hcFtFU3RkS2V5Q29tbWFdICAgICAgICA9IFNETEtfQ09NTUE7CisJa2V5bWFwW0VTdGRLZXlGdWxsU3RvcF0gICAgID0gU0RMS19QRVJJT0Q7CisJa2V5bWFwW0VTdGRLZXlGb3J3YXJkU2xhc2hdID0gU0RMS19TTEFTSDsKKwlrZXltYXBbRVN0ZEtleUJhY2tTbGFzaF0gICAgPSBTRExLX0JBQ0tTTEFTSDsKKwlrZXltYXBbRVN0ZEtleVNlbWlDb2xvbl0gICAgPSBTRExLX1NFTUlDT0xPTjsKKwlrZXltYXBbRVN0ZEtleVNpbmdsZVF1b3RlXSAgPSBTRExLX1FVT1RFOworCWtleW1hcFtFU3RkS2V5SGFzaF0gICAgICAgICA9IFNETEtfSEFTSDsKKwlrZXltYXBbRVN0ZEtleVNxdWFyZUJyYWNrZXRMZWZ0XSAgICA9IFNETEtfTEVGVEJSQUNLRVQ7CisJa2V5bWFwW0VTdGRLZXlTcXVhcmVCcmFja2V0UmlnaHRdICAgPSBTRExLX1JJR0hUQlJBQ0tFVDsKKwlrZXltYXBbRVN0ZEtleU1pbnVzXSAgICAgICAgPSBTRExLX01JTlVTOworCWtleW1hcFtFU3RkS2V5RXF1YWxzXSAgICAgICA9IFNETEtfRVFVQUxTOworCisgICAJa2V5bWFwW0VTdGRLZXlGMV0gICAgICAgICAgPSBTRExLX0YxOyAgLyogY2hyICsgcSAqLworICAgCWtleW1hcFtFU3RkS2V5RjJdICAgICAgICAgID0gU0RMS19GMjsgIC8qIGNociArIHcgKi8KKyAgIAlrZXltYXBbRVN0ZEtleUYzXSAgICAgICAgICA9IFNETEtfRjM7ICAvKiBjaHIgKyBlICovCisgICAJa2V5bWFwW0VTdGRLZXlGNF0gICAgICAgICAgPSBTRExLX0Y0OyAgLyogY2hyICsgciAqLworICAgCWtleW1hcFtFU3RkS2V5RjVdICAgICAgICAgID0gU0RMS19GNTsgIC8qIGNociArIHQgKi8KKyAgIAlrZXltYXBbRVN0ZEtleUY2XSAgICAgICAgICA9IFNETEtfRjY7ICAvKiBjaHIgKyB5ICovCisgICAJa2V5bWFwW0VTdGRLZXlGN10gICAgICAgICAgPSBTRExLX0Y3OyAgLyogY2hyICsgaSAqLworICAgCWtleW1hcFtFU3RkS2V5RjhdICAgICAgICAgID0gU0RMS19GODsgIC8qIGNociArIG8gKi8KKworICAgCWtleW1hcFtFU3RkS2V5RjldICAgICAgICAgID0gU0RMS19GOTsgIC8qIGNociArIGEgKi8KKyAgIAlrZXltYXBbRVN0ZEtleUYxMF0gICAgICAgICA9IFNETEtfRjEwOyAvKiBjaHIgKyBzICovCisgICAJa2V5bWFwW0VTdGRLZXlGMTFdICAgICAgICAgPSBTRExLX0YxMTsgLyogY2hyICsgZCAqLworICAgCWtleW1hcFtFU3RkS2V5RjEyXSAgICAgICAgID0gU0RMS19GMTI7IC8qIGNociArIGYgKi8KKworCSNpZm5kZWYgU1lNQklBTl9DUllTVEFMIAorCS8vISE3NjUwIGFkZGl0aW9ucworICAgICNpZmRlZiBfX1dJTlNfXworICAgCWtleW1hcFtFU3RkS2V5WFhYXSAgICAgICAgID0gU0RMS19SRVRVUk47CS8qICJmaXJlIiBrZXkgKi8KKwkjZWxzZQorICAgCWtleW1hcFtFU3RkS2V5RGV2aWNlM10gICAgID0gU0RMS19SRVRVUk47CS8qICJmaXJlIiBrZXkgKi8KKwkjZW5kaWYKKyAgIAlrZXltYXBbRVN0ZEtleU5rcEFzdGVyaXNrXSA9IFNETEtfQVNURVJJU0s7IAorICAgCWtleW1hcFtFU3RkS2V5WWVzXSAgICAgICAgID0gU0RMS19IT01FOwkJLyogImNhbGwiIGtleSAqLworICAgCWtleW1hcFtFU3RkS2V5Tm9dCQkgICA9IFNETEtfRU5EOwkJLyogImVuZCBjYWxsIiBrZXkgKi8KKyAgIAlrZXltYXBbRVN0ZEtleURldmljZTBdICAgICA9IFNETEtfU1BBQ0U7CS8qIHJpZ2h0IG1lbnUga2V5ICovCisgICAJa2V5bWFwW0VTdGRLZXlEZXZpY2UxXSAgICAgPSBTRExLX0VTQ0FQRTsJLyogbGVmdCBtZW51IGtleSAqLworICAgCWtleW1hcFtFU3RkS2V5RGV2aWNlMl0gICAgID0gU0RMS19QT1dFUjsJLyogcG93ZXIga2V5ICovCisJI2VuZGlmCisKKyAjaWZkZWYgU1lNQklBTl9DUllTVEFMIAorICAgIGtleW1hcFtFU3RkS2V5TWVudV0gICAgICAgID0gU0RMS19FU0NBUEU7ICAgLy8gbWVudSBrZXkKKyAgICBrZXltYXBbRVN0ZEtleURldmljZTZdICAgICA9IFNETEtfTEVGVDsgICAgIC8vIFJvY2tlciAoam95c3RpY2spIGxlZnQKKyAgICBrZXltYXBbRVN0ZEtleURldmljZTddICAgICA9IFNETEtfUklHSFQ7ICAgIC8vIFJvY2tlciAoam95c3RpY2spIHJpZ2h0CisgICAga2V5bWFwW0VTdGRLZXlEZXZpY2U4XSAgICAgPSBTRExLX1VQOyAgICAgICAvLyBSb2NrZXIgKGpveXN0aWNrKSB1cAorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlOV0gICAgID0gU0RMS19ET1dOOyAgICAgLy8gUm9ja2VyIChqb3lzdGljaykgZG93bgorICAgIGtleW1hcFtFU3RkS2V5TGVmdEZ1bmNdICAgICA9IFNETEtfTEFMVDsgICAgLy9jaHI/CisJa2V5bWFwW0VTdGRLZXlSaWdodEZ1bmNdICAgID0gU0RMS19SQUxUOworICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlQV0gICAgICA9IFNETEtfUkVUVVJOOwkvKiAiZmlyZSIga2V5ICovCisjZW5kaWYKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBSRnMgZnM7CisgICAgaWYoS0Vyck5vbmUgPT0gZnMuQ29ubmVjdCgpKQorICAgICAgICB7CisgICAgICAgIFJBcnJheTxUSW50PiBhcnJheTsKKyAgICAgICAgVFJBUEQoZXJyLCBSZWFkTChmcywgYXJyYXkpKTsKKyAgICAgICAgaWYoZXJyID09IEtFcnJOb25lICYmIGFycmF5LkNvdW50KCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICBTRExLZXkgdGVtcFtNQVhfU0NBTkNPREVdOworICAgICAgICAgICAgTWVtOjpDb3B5KHRlbXAsIGtleW1hcCwgTUFYX1NDQU5DT0RFICogc2l6ZW9mKFNETEtleSkpOworCisgICAgICAgICAgICBmb3IoVEludCBrID0gMDsgayA8IGFycmF5LkNvdW50KCk7IGsrPSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBUSW50IG9sZHZhbCA9IGFycmF5W2tdOyAKKyAgICAgICAgICAgICAgICBjb25zdCBUSW50IG5ld3ZhbCA9IGFycmF5W2sgKyAxXTsgCisgICAgICAgICAgICAgICAgaWYob2xkdmFsID49ICAwICYmIG9sZHZhbCA8IE1BWF9TQ0FOQ09ERSAmJiBuZXd2YWwgPj0gIDAgJiYgbmV3dmFsIDwgTUFYX1NDQU5DT0RFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleW1hcFtvbGR2YWxdID0gdGVtcFtuZXd2YWxdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBhcnJheS5DbG9zZSgpOworICAgICAgICB9CisKKyAgICBmcy5DbG9zZSgpOworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKiAhIVRPRE8KKwlFU3RkS2V5TnVtTG9jaz0weDFiLAorCUVTdGRLZXlTY3JvbGxMb2NrPTB4MWMsCisKKwlFU3RkS2V5TmtwRm9yd2FyZFNsYXNoPTB4ODQsCisJRVN0ZEtleU5rcEFzdGVyaXNrPTB4ODUsCisJRVN0ZEtleU5rcE1pbnVzPTB4ODYsCisJRVN0ZEtleU5rcFBsdXM9MHg4NywKKwlFU3RkS2V5TmtwRW50ZXI9MHg4OCwKKwlFU3RkS2V5TmtwMT0weDg5LAorCUVTdGRLZXlOa3AyPTB4OGEsCisJRVN0ZEtleU5rcDM9MHg4YiwKKwlFU3RkS2V5TmtwND0weDhjLAorCUVTdGRLZXlOa3A1PTB4OGQsCisJRVN0ZEtleU5rcDY9MHg4ZSwKKwlFU3RkS2V5TmtwNz0weDhmLAorCUVTdGRLZXlOa3A4PTB4OTAsCisJRVN0ZEtleU5rcDk9MHg5MSwKKwlFU3RkS2V5TmtwMD0weDkyLAorCUVTdGRLZXlOa3BGdWxsU3RvcD0weDkzLAorICAgIEVTdGRLZXlNZW51PTB4OTQsCisgICAgRVN0ZEtleUJhY2tsaWdodE9uPTB4OTUsCisgICAgRVN0ZEtleUJhY2tsaWdodE9mZj0weDk2LAorICAgIEVTdGRLZXlCYWNrbGlnaHRUb2dnbGU9MHg5NywKKyAgICBFU3RkS2V5SW5jQ29udHJhc3Q9MHg5OCwKKyAgICBFU3RkS2V5RGVjQ29udHJhc3Q9MHg5OSwKKyAgICBFU3RkS2V5U2xpZGVyRG93bj0weDlhLAorICAgIEVTdGRLZXlTbGlkZXJVcD0weDliLAorICAgIEVTdGRLZXlEaWN0YXBob25lUGxheT0weDljLAorICAgIEVTdGRLZXlEaWN0YXBob25lU3RvcD0weDlkLAorICAgIEVTdGRLZXlEaWN0YXBob25lUmVjb3JkPTB4OWUsCisgICAgRVN0ZEtleUhlbHA9MHg5ZiwKKyAgICBFU3RkS2V5T2ZmPTB4YTAsCisgICAgRVN0ZEtleURpYWw9MHhhMSwKKyAgICBFU3RkS2V5SW5jVm9sdW1lPTB4YTIsCisgICAgRVN0ZEtleURlY1ZvbHVtZT0weGEzLAorICAgIEVTdGRLZXlEZXZpY2UwPTB4YTQsCisgICAgRVN0ZEtleURldmljZTE9MHhhNSwKKyAgICBFU3RkS2V5RGV2aWNlMj0weGE2LAorICAgIEVTdGRLZXlEZXZpY2UzPTB4YTcsCisgICAgRVN0ZEtleURldmljZTQ9MHhhOCwKKyAgICBFU3RkS2V5RGV2aWNlNT0weGE5LAorICAgIEVTdGRLZXlEZXZpY2U2PTB4YWEsCisgICAgRVN0ZEtleURldmljZTc9MHhhYiwKKyAgICBFU3RkS2V5RGV2aWNlOD0weGFjLAorICAgIEVTdGRLZXlEZXZpY2U5PTB4YWQsCisgICAgRVN0ZEtleURldmljZUE9MHhhZSwKKyAgICBFU3RkS2V5RGV2aWNlQj0weGFmLAorICAgIEVTdGRLZXlEZXZpY2VDPTB4YjAsCisgICAgRVN0ZEtleURldmljZUQ9MHhiMSwKKyAgICBFU3RkS2V5RGV2aWNlRT0weGIyLAorICAgIEVTdGRLZXlEZXZpY2VGPTB4YjMsCisgICAgRVN0ZEtleUFwcGxpY2F0aW9uMD0weGI0LAorICAgIEVTdGRLZXlBcHBsaWNhdGlvbjE9MHhiNSwKKyAgICBFU3RkS2V5QXBwbGljYXRpb24yPTB4YjYsCisgICAgRVN0ZEtleUFwcGxpY2F0aW9uMz0weGI3LAorICAgIEVTdGRLZXlBcHBsaWNhdGlvbjQ9MHhiOCwKKyAgICBFU3RkS2V5QXBwbGljYXRpb241PTB4YjksCisgICAgRVN0ZEtleUFwcGxpY2F0aW9uNj0weGJhLAorICAgIEVTdGRLZXlBcHBsaWNhdGlvbjc9MHhiYiwKKyAgICBFU3RkS2V5QXBwbGljYXRpb244PTB4YmMsCisgICAgRVN0ZEtleUFwcGxpY2F0aW9uOT0weGJkLAorICAgIEVTdGRLZXlBcHBsaWNhdGlvbkE9MHhiZSwKKyAgICBFU3RkS2V5QXBwbGljYXRpb25CPTB4YmYsCisgICAgRVN0ZEtleUFwcGxpY2F0aW9uQz0weGMwLAorICAgIEVTdGRLZXlBcHBsaWNhdGlvbkQ9MHhjMSwKKyAgICBFU3RkS2V5QXBwbGljYXRpb25FPTB4YzIsCisgICAgRVN0ZEtleUFwcGxpY2F0aW9uRj0weGMzLAorICAgIEVTdGRLZXlZZXM9MHhjNCwKKyAgICBFU3RkS2V5Tm89MHhjNSwKKyAgICBFU3RkS2V5SW5jQnJpZ2h0bmVzcz0weGM2LAorICAgIEVTdGRLZXlEZWNCcmlnaHRuZXNzPTB4YzcsIAorICAgIEVTdGRLZXlDYXNlT3Blbj0weGM4LAorICAgIEVTdGRLZXlDYXNlQ2xvc2U9MHhjOQorICAgICovCisKK30KKworCisKK3N0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoX1RISVMsIGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQoreworLy8gICAgY2hhciBkZWJ1Z1syNTZdOworICAgIC8vU0RMX1RSQUNFMSgiU0RMOiBUcmFuc2xhdGVLZXksIHNjYW5jb2RlPSVkIiwgc2NhbmNvZGUpOyAvLyEhCisKKwkvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLyAKKworCWtleXN5bS0+c2NhbmNvZGUgPSBzY2FuY29kZTsKKworICAgIGlmICgoc2NhbmNvZGUgPj0gTUFYX1NDQU5DT0RFKSAmJiAKKyAgICAgICAgKChzY2FuY29kZSAtIEVOb25DaGFyYWN0ZXJLZXlCYXNlICsgMHgwMDgxKSA+PSBNQVhfU0NBTkNPREUpKSB7CisgICAgICAgIFNETF9TZXRFcnJvcigiVG9vIGJpZyBzY2FuY29kZSIpOworICAgICAgICBrZXlzeW0tPnNjYW5jb2RlID0gU0RMS19VTktOT1dOOworCSAgICBrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsgCisgICAgICAgIHJldHVybiBrZXlzeW07CisgICAgfQorCisJa2V5c3ltLT5tb2QgPSBTRExfR2V0TW9kU3RhdGUoKTsKKworICAgIC8qIEhhbmRsZSBmdW5jdGlvbiBrZXlzOiBGMSwgRjIsIEYzIC4uLiAqLworICAgIGlmIChrZXlzeW0tPm1vZCAmIEtNT0RfTUVUQSkgeworICAgICAgICBpZiAoc2NhbmNvZGUgPj0gJ0EnICYmIHNjYW5jb2RlIDwgKCdBJyArIDI0KSkgeyAvKiBmaXJzdCAzMiBhbHBoYWJldCBrZXlzICovCisgICAgICAgICAgICBzd2l0Y2goc2NhbmNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdRJzogc2NhbmNvZGUgPSBFU3RkS2V5RjE7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1cnOiBzY2FuY29kZSA9IEVTdGRLZXlGMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRSc6IHNjYW5jb2RlID0gRVN0ZEtleUYzOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdSJzogc2NhbmNvZGUgPSBFU3RkS2V5RjQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1QnOiBzY2FuY29kZSA9IEVTdGRLZXlGNTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnWSc6IHNjYW5jb2RlID0gRVN0ZEtleUY2OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdVJzogc2NhbmNvZGUgPSBFU3RkS2V5Rjc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0knOiBzY2FuY29kZSA9IEVTdGRLZXlGODsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnQSc6IHNjYW5jb2RlID0gRVN0ZEtleUY5OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdTJzogc2NhbmNvZGUgPSBFU3RkS2V5RjEwOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdEJzogc2NhbmNvZGUgPSBFU3RkS2V5RjExOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdGJzogc2NhbmNvZGUgPSBFU3RkS2V5RjEyOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzY2FuY29kZSA+PSBFTm9uQ2hhcmFjdGVyS2V5QmFzZSkgeworICAgICAgICAvLyBOb24gY2hhcmFjdGVyIGtleXMKKwkgICAga2V5c3ltLT5zeW0gPSBrZXltYXBbc2NhbmNvZGUgLSAKKyAgICAgICAgICAgIEVOb25DaGFyYWN0ZXJLZXlCYXNlICsgMHgwMDgxXTsgLy8gISFoYXJkIGNvZGVkCisgICAgfSBlbHNlIHsKKwkgICAga2V5c3ltLT5zeW0gPSBrZXltYXBbc2NhbmNvZGVdOworICAgIH0KKworCS8qIFJlbWFwIHRoZSBhcnJvdyBrZXlzIGlmIHRoZSBkZXZpY2UgaXMgcm90YXRlZCAqLworCWlmIChQcml2YXRlLT5FUE9DX1NjcmVlbk9yaWVudGF0aW9uID09IENGYnNCaXRHYzo6RUdyYXBoaWNzT3JpZW50YXRpb25Sb3RhdGVkMjcwKSB7CisJCXN3aXRjaChrZXlzeW0tPnN5bSkgeworCQkJY2FzZSBTRExLX1VQOglrZXlzeW0tPnN5bSA9IFNETEtfTEVGVDsgIGJyZWFrOworCQkJY2FzZSBTRExLX0RPV046IGtleXN5bS0+c3ltID0gU0RMS19SSUdIVDsgYnJlYWs7CisJCQljYXNlIFNETEtfTEVGVDoga2V5c3ltLT5zeW0gPSBTRExLX0RPV047ICBicmVhazsKKwkJCWNhc2UgU0RMS19SSUdIVDprZXlzeW0tPnN5bSA9IFNETEtfVVA7ICAgIGJyZWFrOworCQl9CisJfQorCisJLyogSWYgVU5JQ09ERSBpcyBvbiwgZ2V0IHRoZSBVTklDT0RFIHZhbHVlIGZvciB0aGUga2V5ICovCisJa2V5c3ltLT51bmljb2RlID0gMDsKKworI2lmIDAgLy8gISFUT0RPOnVuaWNvZGUKKworCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSAKKyAgICB7CisJCS8qIFBvcHVsYXRlIHRoZSB1bmljb2RlIGZpZWxkIHdpdGggdGhlIEFTQ0lJIHZhbHVlICovCisJCWtleXN5bS0+dW5pY29kZSA9IHNjYW5jb2RlOworCX0KKyNlbmRpZgorCisgICAgLy8hIQorICAgIC8vc3ByaW50ZihkZWJ1ZywgIlNETDogVHJhbnNsYXRlS2V5OiBrZXlzeW0tPnNjYW5jb2RlPSVkLCBrZXlzeW0tPnN5bT0lZCwga2V5c3ltLT5tb2Q9JWQiLAorICAgIC8vICAgIGtleXN5bS0+c2NhbmNvZGUsIGtleXN5bS0+c3ltLCBrZXlzeW0tPm1vZCk7CisgICAgLy9TRExfVFJBQ0UoZGVidWcpOyAvLyEhCisKKwlyZXR1cm4oa2V5c3ltKTsKK30KKworfTsgLyogZXh0ZXJuICJDIiAqLworCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0ExL1NETF9lcG9jdmlkZW8uY3BwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTEvU0RMX2Vwb2N2aWRlby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4NzRkNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0ExL1NETF9lcG9jdmlkZW8uY3BwCkBAIC0wLDAgKzEsMTM1NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AZGV2b2x1dGlvbi5jb20KKyovCisKKy8qCisgICAgU0RMX2Vwb2N2aWRlby5jcHAKKyAgICBFcG9jIGJhc2VkIFNETCB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb24KKworICAgIFRoYW5rcyB0byBQZXRlciB2YW4gU2ViaWxsZSwgdGhlIGF1dGhvciBvZiBFTWFtZS4gSXQgaXMgYSBncmVhdCBleGFtcGxlIG9mIAorICAgIGxvdyBsZXZlbCBncmFwaGljcyBjb2RpbmcgaW4gRXBvYy4KKworICAgIEVwb2MgdmVyc2lvbiBieSBIYW5udSBWaWl0YWxhIChoYW5udS5qLnZpaXRhbGFAbWJuZXQuZmkpCisJQXNzZW1ibGVyIHJvdXRpbmVzIGJ5IEtpbW1vIEtpbm51bmVuCisqLworCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIlNETF9lcnJvci5oIgorI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF92aWRlby5oIgorI3VuZGVmIE5VTEwKKyNpbmNsdWRlICJTRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICJTREwuaCIKK307CisKKyNpbmNsdWRlICJTRExfZXBvY3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2Vwb2NldmVudHNfYy5oIgorCisjaW5jbHVkZSAic2RsX2Vwb2NydW50aW1lLmgiCisKKyNpbmNsdWRlIDxoYWwuaD4KKyNpbmNsdWRlIDxjb2VkZWYuaD4KKyNpbmNsdWRlIDxmbG9nZ2VyLmg+CisKKyNpZmRlZiBTWU1CSUFOX1FVQVJUWgorU0RMX1ZpZGVvRGV2aWNlKiBfdGhpc0RldmljZTsKKyNlbmRpZgorCitfTElUKEtMaWJOYW1lLCAiU0RMIik7CisKKy8qIEZvciBkZWJ1Z2dpbmcgKi8KKworLy9pZiBvbGQgU09TLCBmcm9tIDcueCB0aGlzIGlzIHB1YmxpYyEKK2NsYXNzIENMb2NrYWJsZSA6IHB1YmxpYyBDRmJzQml0bWFwCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljICBDTG9ja2FibGUqIExvY2thYmxlKENGYnNCaXRtYXAqIGFCbXApIHtyZXR1cm4gc3RhdGljX2Nhc3Q8Q0xvY2thYmxlKj4oYUJtcCk7fQorICAgICAgICB2b2lkIExvY2soKSB7TG9ja0hlYXAoKTt9CisgICAgICAgIHZvaWQgVW5sb2NrKCkge1VubG9ja0hlYXAoKTt9CisgICAgfTsKKyNkZWZpbmUgTG9ja0hlYXAoeCkgQ0xvY2thYmxlOjpMb2NrYWJsZSh4KS0+TG9jaygpCisjZGVmaW5lIFVubG9ja0hlYXAoeCkgQ0xvY2thYmxlOjpMb2NrYWJsZSh4KS0+VW5sb2NrKCkKKwordm9pZCBSRGVidWdfUHJpbnRfYihjaGFyKiBlcnJvcl9zdHIsIHZvaWQqIHBhcmFtKQorICAgIHsKKyAgICBUQnVmODwxMjg+IGVycm9yOCgoVFVpbnQ4KillcnJvcl9zdHIpOworICAgIFRCdWY8MTI4PiBlcnJvcjsKKyAgICBlcnJvci5Db3B5KGVycm9yOCk7CisKKyNpZm5kZWYgVFJBQ0VfVE9fRklMRQorICAgIGlmIChwYXJhbSkgLy8hISBEbyBub3Qgd29yayBpZiB0aGUgcGFyYW1ldGVyIGlzIHJlYWxseSAwISEKKyAgICAgICAgUkRlYnVnOjpQcmludChlcnJvciwgcGFyYW0pOworICAgIGVsc2UgCisgICAgICAgIFJEZWJ1Zzo6UHJpbnQoZXJyb3IpOworI2Vsc2UKKyAgICBpZiAocGFyYW0pIC8vISEgRG8gbm90IHdvcmsgaWYgdGhlIHBhcmFtZXRlciBpcyByZWFsbHkgMCEhCisgICAgICAgIFJGaWxlTG9nZ2VyOjpXcml0ZUZvcm1hdChLTGliTmFtZSwgX0woIlNETC50eHQiKSwgRUZpbGVMb2dnaW5nTW9kZUFwcGVuZCwgZXJyb3IsIHBhcmFtKTsKKyAgICBlbHNlIAorICAgICAgICBSRmlsZUxvZ2dlcjo6V3JpdGUoS0xpYk5hbWUsIF9MKCJTREwudHh0IiksIEVGaWxlTG9nZ2luZ01vZGVBcHBlbmQsIGVycm9yKTsKKyNlbmRpZgorCisgICAgfQorCitleHRlcm4gIkMiIHZvaWQgUkRlYnVnX1ByaW50KGNoYXIqIGVycm9yX3N0ciwgdm9pZCogcGFyYW0pCisgICAgeworICAgIFJEZWJ1Z19QcmludF9iKGVycm9yX3N0ciwgcGFyYW0pOworICAgIH0KKworCitpbnQgRGVidWdfQXZhaWxNZW0yKCkKKyAgICB7CisgICAgLy9Vc2VyOjpDb21wcmVzc0FsbEhlYXBzKCk7CisgICAgVE1lbW9yeUluZm9WMUJ1ZiBtZW1idWY7IAorICAgIFVzZXI6OkxlYXZlSWZFcnJvcihVc2VySGFsOjpNZW1vcnlJbmZvKG1lbWJ1ZikpOworICAgIFRNZW1vcnlJbmZvVjEgbWluZm8gPSBtZW1idWYoKTsKKwlyZXR1cm4obWluZm8uaUZyZWVSYW1JbkJ5dGVzKTsKKyAgICB9CisKK2V4dGVybiAiQyIgaW50IERlYnVnX0F2YWlsTWVtKCkKKyAgICB7CisgICAgcmV0dXJuKERlYnVnX0F2YWlsTWVtMigpKTsKKyAgICB9CisKKworZXh0ZXJuICJDIiB7CisKKy8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IEVQT0NfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOworc3RhdGljIFNETF9SZWN0ICoqRVBPQ19MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworc3RhdGljIFNETF9TdXJmYWNlICpFUE9DX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgRVBPQ19TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywKKwkJCSAgU0RMX0NvbG9yICpjb2xvcnMpOworc3RhdGljIHZvaWQgRVBPQ19WaWRlb1F1aXQoX1RISVMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IEVQT0NfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgRVBPQ19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IEVQT0NfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgRVBPQ19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIEVQT0NfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgRVBPQ19EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKKworc3RhdGljIGludCBFUE9DX0F2YWlsYWJsZSh2b2lkKTsKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKkVQT0NfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCk7CisKK3ZvaWQgRHJhd0JhY2tncm91bmQoX1RISVMpOwordm9pZCBEaXJlY3REcmF3KF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cywgVFVpbnQxNiogc2NyZWVuQnVmZmVyKTsKK3ZvaWQgRGlyZWN0RHJhd1JvdGF0ZWQoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzLCBUVWludDE2KiBzY3JlZW5CdWZmZXIpOworCisvKiBNb3VzZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIFdNY3Vyc29yICpFUE9DX0NyZWF0ZVdNQ3Vyc29yKF9USElTLCBVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpOworc3RhdGljIHZvaWQgRVBPQ19GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworc3RhdGljIGludCBFUE9DX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CisKKworCisvKiAhIUZvciAxMiBiaXQgc2NyZWVuIEhXLiBUYWJsZSBmb3IgZmFzdCBjb252ZXJzaW9uIGZyb20gOCBiaXQgdG8gMTIgYml0ICovCisvLyBUVWludDE2IGlzIGVub3VnaCwgYnV0IHVzaW5nIFRVaW50MzIgc28gd2UgY2FuIHVzZSBiZXR0ZXIgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIG9uIEFSTUkKK3N0YXRpYyBUVWludDMyIEVQT0NfSFdQYWxldHRlXzI1Nl90b19TY3JlZW5bMjU2XTsKKworVmlkZW9Cb290U3RyYXAgRVBPQ19ib290c3RyYXAgPSB7CisJImVwb2MiLCAiRVBPQyBzeXN0ZW0iLAorICAgIEVQT0NfQXZhaWxhYmxlLCBFUE9DX0NyZWF0ZURldmljZQorfTsKKworY29uc3QgVFVpbnQzMiBXaW5kb3dDbGllbnRIYW5kbGUgPSA5MjEwOyAvLyEhIGNvbnN0CisKKy8qIEVwb2MgdmlkZW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBFUE9DX0F2YWlsYWJsZSh2b2lkKQoreworICAgIHJldHVybiAxOyAvKiBBbHdheXMgYXZhaWxhYmxlICovCit9CisKK3N0YXRpYyB2b2lkIEVQT0NfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCWZyZWUoZGV2aWNlLT5oaWRkZW4pOworCWZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqRVBPQ19DcmVhdGVEZXZpY2UoaW50IC8qZGV2aW5kZXgqLykKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCVNETF9UUkFDRSgiU0RMOkVQT0NfQ3JlYXRlRGV2aWNlIik7CisKKwkvKiBBbGxvY2F0ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgZnJlZSBvbiBkZWxldGUgKi8KKwlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKwlpZiAoIGRldmljZSApIHsKKwkJbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCW1hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCX0KKwlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJaWYgKCBkZXZpY2UgKSB7CisJCQlmcmVlKGRldmljZSk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwltZW1zZXQoZGV2aWNlLT5oaWRkZW4sIDAsIChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBFUE9DX1ZpZGVvSW5pdDsKKwlkZXZpY2UtPkxpc3RNb2RlcyA9IEVQT0NfTGlzdE1vZGVzOworCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gRVBPQ19TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5TZXRDb2xvcnMgPSBFUE9DX1NldENvbG9yczsKKwlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IEVQT0NfVmlkZW9RdWl0OworCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBFUE9DX0FsbG9jSFdTdXJmYWNlOworCWRldmljZS0+Q2hlY2tIV0JsaXQgPSBOVUxMOworCWRldmljZS0+RmlsbEhXUmVjdCA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQWxwaGEgPSBOVUxMOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IEVQT0NfTG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IEVQT0NfVW5sb2NrSFdTdXJmYWNlOworCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IEVQT0NfRmxpcEhXU3VyZmFjZTsKKwlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBFUE9DX0ZyZWVIV1N1cmZhY2U7CisJZGV2aWNlLT5TZXRJY29uID0gTlVMTDsKKwlkZXZpY2UtPlNldENhcHRpb24gPSBOVUxMOworCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKKwlkZXZpY2UtPkZyZWVXTUN1cnNvciA9IEVQT0NfRnJlZVdNQ3Vyc29yOworCWRldmljZS0+Q3JlYXRlV01DdXJzb3IgPSBFUE9DX0NyZWF0ZVdNQ3Vyc29yOworCWRldmljZS0+U2hvd1dNQ3Vyc29yID0gRVBPQ19TaG93V01DdXJzb3I7CisJZGV2aWNlLT5XYXJwV01DdXJzb3IgPSBOVUxMOworCWRldmljZS0+SW5pdE9TS2V5bWFwID0gRVBPQ19Jbml0T1NLZXltYXA7CisJZGV2aWNlLT5QdW1wRXZlbnRzID0gRVBPQ19QdW1wRXZlbnRzOworCWRldmljZS0+ZnJlZSA9IEVQT0NfRGVsZXRlRGV2aWNlOworCisJcmV0dXJuIGRldmljZTsKK30KKworCitpbnQgR2V0QnBwKFREaXNwbGF5TW9kZSBkaXNwbGF5bW9kZSkKK3sKKyAgICAvKlRJbnQgbnVtQ29sb3JzID0gVERpc3BsYXlNb2RlVXRpbHM6Ok51bURpc3BsYXlNb2RlQ29sb3JzKGRpc3BsYXltb2RlKTsKKyAgICBUSW50IGJpdHNQZXJQaXhlbCA9IDE7CisgICAgZm9yIChUSW50MzIgaSA9IDI7IGkgPCBudW1Db2xvcnM7IGkgPDw9IDEsIGJpdHNQZXJQaXhlbCsrKTsKKyAgICByZXR1cm4gYml0c1BlclBpeGVsOyovCisgICAgcmV0dXJuICBURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVCaXRzUGVyUGl4ZWwoZGlzcGxheW1vZGUpOyAgIAorfQorCisKK3ZvaWQgRGlzYWJsZUtleUJsb2NraW5nKF9USElTKQorICAgIHsKKyAgICAvLyBEaXNhYmxlIGtleSBibG9ja2luZworICAgIFRSYXdFdmVudCBldmVudDsKKyAgICBldmVudC5TZXQoKFRSYXdFdmVudDo6VFR5cGUpLypFRGlzYWJsZUtleUJsb2NrKi81MSk7IC8vICEhRURpc2FibGVLZXlCbG9jayBub3QgZm91bmQgaW4gZXBvYzMyXGluY2x1ZGUhCisgICAgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uU2ltdWxhdGVSYXdFdmVudChldmVudCk7CisgICAgfQorCit2b2lkIENvbnN0cnVjdFdpbmRvd0woX1RISVMpCit7CisJVEludAllcnJvcjsKKworCVNETF9UUkFDRSgiU0RMOkNvbnN0cnVjdFdpbmRvd0wiKTsKKwllcnJvciA9IFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkNvbm5lY3QoKTsKKwlVc2VyOjpMZWF2ZUlmRXJyb3IoZXJyb3IpOworCVByaXZhdGUtPkVQT0NfV3NTY3JlZW49bmV3KEVMZWF2ZSkgQ1dzU2NyZWVuRGV2aWNlKFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uKTsKKwlVc2VyOjpMZWF2ZUlmRXJyb3IoUHJpdmF0ZS0+RVBPQ19Xc1NjcmVlbi0+Q29uc3RydWN0KCkpOworCVVzZXI6OkxlYXZlSWZFcnJvcihQcml2YXRlLT5FUE9DX1dzU2NyZWVuLT5DcmVhdGVDb250ZXh0KFByaXZhdGUtPkVQT0NfV2luZG93R2MpKTsKKworCVByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cD1SV2luZG93R3JvdXAoUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24pOworCVVzZXI6OkxlYXZlSWZFcnJvcihQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAuQ29uc3RydWN0KFdpbmRvd0NsaWVudEhhbmRsZSkpOworCVByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cC5TZXRPcmRpbmFsUG9zaXRpb24oMCk7CisKKwkvLyBTZXQgd2luZG93IGdyb3VwIG5hbWUgKHRoZSBzYW1lIGFzIHByb2Nlc3MgbmFtZSkpICEhR2l2ZXMgYWx3YXlzICJFUE9DIiBpbiBXSU5TCisJUlByb2Nlc3MgdGhpc1Byb2Nlc3M7CisJVFBhcnNlIGV4ZU5hbWU7CisJZXhlTmFtZS5TZXQodGhpc1Byb2Nlc3MuRmlsZU5hbWUoKSwgTlVMTCwgTlVMTCk7CisgICAgVEJ1ZjwzMj4gd2luR3JvdXBOYW1lOworICAgIHdpbkdyb3VwTmFtZS5BcHBlbmQoMCk7CisgICAgd2luR3JvdXBOYW1lLkFwcGVuZCgwKTsKKyAgICB3aW5Hcm91cE5hbWUuQXBwZW5kKDApOy8vIHVpZAorICAgIHdpbkdyb3VwTmFtZS5BcHBlbmQoMCk7CisgICAgd2luR3JvdXBOYW1lLkFwcGVuZChleGVOYW1lLk5hbWUoKSk7IC8vIGNhcHRpb24KKyAgICB3aW5Hcm91cE5hbWUuQXBwZW5kKDApOworICAgIHdpbkdyb3VwTmFtZS5BcHBlbmQoMCk7IC8vZG9jIG5hbWUKKwlQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAuU2V0TmFtZSh3aW5Hcm91cE5hbWUpOyAKKworCVByaXZhdGUtPkVQT0NfV3NXaW5kb3c9UldpbmRvdyhQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbik7CisgIC8vIE1hcmt1cywgaXQgd2FzOgorICAvLyBVc2VyOjpMZWF2ZUlmRXJyb3IoUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5Db25zdHJ1Y3QoUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwLFdpbmRvd0NsaWVudEhhbmRsZSApKTsKKyAgLy8gYnV0IFNPUyA3LjBzIGRlYnVnIGRvZXMgbm90IGFjY2VwdCBzYW1lIHdpbmRvdyBoYW5kbGUgdHdpY2UKKwlVc2VyOjpMZWF2ZUlmRXJyb3IoUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5Db25zdHJ1Y3QoUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwLFdpbmRvd0NsaWVudEhhbmRsZSAtIDEpKTsKKwlQcml2YXRlLT5FUE9DX1dzV2luZG93LlNldEJhY2tncm91bmRDb2xvcihLUmdiV2hpdGUpOworICAgIFByaXZhdGUtPkVQT0NfV3NXaW5kb3cuQWN0aXZhdGUoKTsKKwlQcml2YXRlLT5FUE9DX1dzV2luZG93LlNldFNpemUoUHJpdmF0ZS0+RVBPQ19Xc1NjcmVlbi0+U2l6ZUluUGl4ZWxzKCkpOyAKKwlQcml2YXRlLT5FUE9DX1dzV2luZG93LlNldFZpc2libGUoRVRydWUpOworCisgICAgUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwSUQgPSBQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAuSWRlbnRpZmllcigpOworICAgIFByaXZhdGUtPkVQT0NfSXNXaW5kb3dGb2N1c2VkID0gRUZhbHNlOworCisgICAgRGlzYWJsZUtleUJsb2NraW5nKF90aGlzKTsgLy9kaXNhYmxlIGtleSBibG9ja2luZworfQorCitpbnQgRVBPQ19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKyAgICAvLyAhIVRPRE86aGFuZGxlIGxlYXZlIGZ1bmN0aW9ucyEKKworICAgIGludCBpOworCisJU0RMX1RSQUNFKCJTREw6RVBPQ19WaWRlb0luaXQiKTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovICAgCisKKwlmb3IgKCBpPTA7IGk8U0RMX05VTU1PREVTOyArK2kgKSB7CisJCVByaXZhdGUtPlNETF9tb2RlbGlzdFtpXSA9IChTRExfUmVjdCAqKW1hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKKwkJUHJpdmF0ZS0+U0RMX21vZGVsaXN0W2ldLT54ID0gUHJpdmF0ZS0+U0RMX21vZGVsaXN0W2ldLT55ID0gMDsKKwl9CisKKwkvKiBNb2RlcyBzb3J0ZWQgbGFyZ2VzdCB0byBzbWFsbGVzdCAqLworCVByaXZhdGUtPlNETF9tb2RlbGlzdFswXS0+dyA9IDgwMDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdLT5oID0gMjUwOworCVByaXZhdGUtPlNETF9tb2RlbGlzdFsxXS0+dyA9IDY0MDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzFdLT5oID0gNDgwOworCVByaXZhdGUtPlNETF9tb2RlbGlzdFsyXS0+dyA9IDQ4MDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzJdLT5oID0gNjAwOworCVByaXZhdGUtPlNETF9tb2RlbGlzdFszXS0+dyA9IDY0MDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzNdLT5oID0gNDAwOworCVByaXZhdGUtPlNETF9tb2RlbGlzdFs0XS0+dyA9IDM1MjsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzRdLT5oID0gNDE2OworCVByaXZhdGUtPlNETF9tb2RlbGlzdFs1XS0+dyA9IDQxNjsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzVdLT5oID0gMzUyOworCVByaXZhdGUtPlNETF9tb2RlbGlzdFs2XS0+dyA9IDQxNjsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzZdLT5oID0gMzEyOworCVByaXZhdGUtPlNETF9tb2RlbGlzdFs3XS0+dyA9IDM1MjsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzddLT5oID0gMjY0OworCVByaXZhdGUtPlNETF9tb2RlbGlzdFs4XS0+dyA9IDgwMDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzhdLT5oID0gMjQwOyAvL2ZvciBkb29tIGFsbCB0aGVzZS4uCisJUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzldLT53ID0gNjQwOyBQcml2YXRlLT5TRExfbW9kZWxpc3RbOV0tPmggPSAyNDA7IAorCVByaXZhdGUtPlNETF9tb2RlbGlzdFsxMF0tPncgPSA0ODA7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsxMF0tPmggPSAyNDA7IAorCVByaXZhdGUtPlNETF9tb2RlbGlzdFsxMV0tPncgPSA2NDA7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsxMV0tPmggPSAyNDA7IAorCVByaXZhdGUtPlNETF9tb2RlbGlzdFsxMl0tPncgPSAzNTI7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsxMl0tPmggPSAyNDA7IAorCVByaXZhdGUtPlNETF9tb2RlbGlzdFsxM10tPncgPSA0MTY7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsxM10tPmggPSAyNDA7IAorCVByaXZhdGUtPlNETF9tb2RlbGlzdFsxNF0tPncgPSA0MTY7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsxNF0tPmggPSAyNDA7IAorCVByaXZhdGUtPlNETF9tb2RlbGlzdFsxNV0tPncgPSAzNTI7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsxNV0tPmggPSAyNDA7IAorICAgIFByaXZhdGUtPlNETF9tb2RlbGlzdFsxNl0tPncgPSA2NDA7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsxNl0tPmggPSAyMDA7IAorCVByaXZhdGUtPlNETF9tb2RlbGlzdFsxN10tPncgPSAzMjA7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsxN10tPmggPSAyNDA7IC8vLi4uZm9yIGRvb20sIGN1cnJlbnRseSBlbmdpbmUgcmVuZGVycyBuby1oaWdoZXIgd2luZG93cyA6LSgsIHByb3BhYmx5IHNob3VsZCBnZXQgZml4ZWQgCisJUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzE4XS0+dyA9IDMyMDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzE4XS0+aCA9IDIwMDsKKwlQcml2YXRlLT5TRExfbW9kZWxpc3RbMTldLT53ID0gMjU2OyBQcml2YXRlLT5TRExfbW9kZWxpc3RbMTldLT5oID0gMTkyOworCVByaXZhdGUtPlNETF9tb2RlbGlzdFsyMF0tPncgPSAxNzY7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsyMF0tPmggPSAyMDg7CisJUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzIxXS0+dyA9IDIwODsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzIxXS0+aCA9IDE3NjsgLy8gUm90YXRlZAorCVByaXZhdGUtPlNETF9tb2RlbGlzdFsyMl0tPncgPSAxNjA7IFByaXZhdGUtPlNETF9tb2RlbGlzdFsyMl0tPmggPSAxNDQ7IAorCisgICAgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzIzXS0+dyA9IDY0MDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzJdLT5oID0gMjAwOyAgLy9zODAgc29tZSBuZXcgbW9kZXMgCisgICAgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzI0XS0+dyA9IDY0MDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzJdLT5oID0gMzIwOyAgLy9zOTAgbW9kZXMgYXJlIGFkZGVkCisgICAgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzI1XS0+dyA9IDY0MDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzJdLT5oID0gMjQwOyAgLy9oZXJlCisJUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzI2XS0+dyA9IDY0MDsgUHJpdmF0ZS0+U0RMX21vZGVsaXN0WzRdLT5oID0gMjAwOyAgLy9ub3cKKworCVByaXZhdGUtPlNETF9tb2RlbGlzdFsyN10gPSBOVUxMOworCisgICAgLyogQ29uc3RydWN0IEVwb2Mgd2luZG93ICovCisKKyAgICBDb25zdHJ1Y3RXaW5kb3dMKF90aGlzKTsKKworICAgIC8qIEluaXRpYWxpc2UgRXBvYyBmcmFtZSBidWZmZXIgKi8KKworICAgIFREaXNwbGF5TW9kZSBkaXNwbGF5TW9kZSA9IFByaXZhdGUtPkVQT0NfV3NTY3JlZW4tPkRpc3BsYXlNb2RlKCk7CisKKyNpZiAhZGVmaW5lZChfX1dJTlNfXykgJiYgIWRlZmluZWQoVEVTVF9CTV9EUkFXKQorCisgICAgVFNjcmVlbkluZm9WMDEgc2NyZWVuSW5mbzsKKwlUUGNrZzxUU2NyZWVuSW5mb1YwMT4gc0luZm8oc2NyZWVuSW5mbyk7CisJVXNlclN2cjo6U2NyZWVuSW5mbyhzSW5mbyk7CisKKwlQcml2YXRlLT5FUE9DX1NjcmVlblNpemUJCT0gc2NyZWVuSW5mby5pU2NyZWVuU2l6ZTsgCisJUHJpdmF0ZS0+RVBPQ19EaXNwbGF5TW9kZQkJPSBkaXNwbGF5TW9kZTsKKyAgICBQcml2YXRlLT5FUE9DX0hhc0ZyYW1lQnVmZmVyCT0gc2NyZWVuSW5mby5pU2NyZWVuQWRkcmVzc1ZhbGlkOworCVByaXZhdGUtPkVQT0NfRnJhbWVCdWZmZXIJCT0gUHJpdmF0ZS0+RVBPQ19IYXNGcmFtZUJ1ZmZlciA/IChUVWludDgqKSBzY3JlZW5JbmZvLmlTY3JlZW5BZGRyZXNzIDogTlVMTDsKKwlQcml2YXRlLT5FUE9DX0J5dGVzUGVyUGl4ZWwJICAgID0gKChHZXRCcHAoZGlzcGxheU1vZGUpLTEpIC8gOCkgKyAxOworCQorICAgIFByaXZhdGUtPkVQT0NfQnl0ZXNQZXJTY2FuTGluZQk9IHNjcmVlbkluZm8uaVNjcmVlblNpemUuaVdpZHRoICogUHJpdmF0ZS0+RVBPQ19CeXRlc1BlclBpeGVsOworCVByaXZhdGUtPkVQT0NfQnl0ZXNQZXJTY3JlZW4JPSBQcml2YXRlLT5FUE9DX0J5dGVzUGVyU2NhbkxpbmUgKiBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaUhlaWdodDsKKworICAgIFNETF9UUkFDRTEoIlNjcmVlbiB3aWR0aCAlZCIsIHNjcmVlbkluZm8uaVNjcmVlblNpemUuaVdpZHRoKTsKKyAgICBTRExfVFJBQ0UxKCJTY3JlZW4gaGVpZ2h0ICVkIiwgc2NyZWVuSW5mby5pU2NyZWVuU2l6ZS5pSGVpZ2h0KTsKKyAgICBTRExfVFJBQ0UxKCJTY3JlZW4gZG1vZGUgJWQiLCBkaXNwbGF5TW9kZSk7CisgICAgU0RMX1RSQUNFMSgiU2NyZWVuIHZhbGlkICVkIiwgc2NyZWVuSW5mby5pU2NyZWVuQWRkcmVzc1ZhbGlkKTsKKworICAgIFNETF9UUkFDRTEoImJwcCAlZCIsIFByaXZhdGUtPkVQT0NfQnl0ZXNQZXJQaXhlbCk7CisgICAgU0RMX1RSQUNFMSgiYnBzbCAlZCIsIFByaXZhdGUtPkVQT0NfQnl0ZXNQZXJTY2FuTGluZSk7CisgICAgU0RMX1RSQUNFMSgiYnBzICVkIiwgUHJpdmF0ZS0+RVBPQ19CeXRlc1BlclNjcmVlbik7CisKKworICAgIC8qIEl0IHNlZW1zIHRoYXQgaW4gU0ExMTAwIG1hY2hpbmVzIGZvciA4YnBwIGRpc3BsYXlzIHRoZXJlIGlzIGEgNTEyIHBhbGV0dGUgdGFibGUgYXQgdGhlIAorICAgICAqIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUgYnVmZmVyLiBFLmcuIFNlcmllcyA3IGFuZCBOZXRib29rLgorICAgICAqIEluIDEyIGJwcCBtYWNoaW5lcyB0aGUgdGFibGUgaGFzIDE2IGVudHJpZXMuCisJICovCisJaWYgKFByaXZhdGUtPkVQT0NfSGFzRnJhbWVCdWZmZXIgJiYgR2V0QnBwKGRpc3BsYXlNb2RlKSA9PSA4KQorICAgICAgICB7CisJCVByaXZhdGUtPkVQT0NfRnJhbWVCdWZmZXIgKz0gNTEyOworICAgICAgICB9CisJZWxzZQorICAgICAgICB7CisgICAgICAgIFByaXZhdGUtPkVQT0NfRnJhbWVCdWZmZXIgKz0gMzI7CisgICAgICAgIH0KKyAgICAgICAgLyppZiAoUHJpdmF0ZS0+RVBPQ19IYXNGcmFtZUJ1ZmZlciAmJiBHZXRCcHAoZGlzcGxheU1vZGUpID09IDEyKQorCQlQcml2YXRlLT5FUE9DX0ZyYW1lQnVmZmVyICs9IDE2ICogMjsKKyAgICBpZiAoUHJpdmF0ZS0+RVBPQ19IYXNGcmFtZUJ1ZmZlciAmJiBHZXRCcHAoZGlzcGxheU1vZGUpID09IDE2KQorCQlQcml2YXRlLT5FUE9DX0ZyYW1lQnVmZmVyICs9IDE2ICogMjsKKyAgICAqLworI2Vsc2UgLyogZGVmaW5lZCBfX1dJTlNfXyAqLworICAgIAorICAgIC8qIENyZWF0ZSBiaXRtYXAsIGRldmljZSBhbmQgY29udGV4dCBmb3Igc2NyZWVuIGRyYXdpbmcgKi8KKyAgICBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUgICAgICAgID0gUHJpdmF0ZS0+RVBPQ19Xc1NjcmVlbi0+U2l6ZUluUGl4ZWxzKCk7CisKKwlQcml2YXRlLT5FUE9DX0JpdG1hcCA9IG5ldyAoRUxlYXZlKSBDV3NCaXRtYXAoUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24pOworCVByaXZhdGUtPkVQT0NfQml0bWFwLT5DcmVhdGUoUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLCBkaXNwbGF5TW9kZSk7CisKKwlQcml2YXRlLT5FUE9DX0Rpc3BsYXlNb2RlCSAgICA9IGRpc3BsYXlNb2RlOworICAgIFByaXZhdGUtPkVQT0NfSGFzRnJhbWVCdWZmZXIgICAgPSBFVHJ1ZTsKKyAgICBQcml2YXRlLT5FUE9DX0ZyYW1lQnVmZmVyICAgICAgID0gTlVMTDsgLyogUHJpdmF0ZS0+RVBPQ19CaXRtYXAtPkRhdGFBZGRyZXNzKCkgY2FuIGNoYW5nZSBhbnkgdGltZSAqLworCVByaXZhdGUtPkVQT0NfQnl0ZXNQZXJQaXhlbAkgICAgPSAoKEdldEJwcChkaXNwbGF5TW9kZSktMSkgLyA4KSArIDE7CisJUHJpdmF0ZS0+RVBPQ19CeXRlc1BlclNjYW5MaW5lICA9IFByaXZhdGUtPkVQT0NfV3NTY3JlZW4tPlNpemVJblBpeGVscygpLmlXaWR0aCAqIFByaXZhdGUtPkVQT0NfQnl0ZXNQZXJQaXhlbDsKKworI2VuZGlmIC8qIF9fV0lOU19fICovCisKKyNpZm5kZWYgU1lNQklBTl9DUllTVEFMCisJLy8gR2V0IGRyYXcgZGV2aWNlIGZvciB1cGRhdGluZyB0aGUgc2NyZWVuCisJVFNjcmVlbkluZm9WMDEgc2NyZWVuSW5mbzI7CisgICAgCisgICAgRXBvY19SdW50aW1lOjpHZXRTY3JlZW5JbmZvKHNjcmVlbkluZm8yKTsKKworCVRSQVBEKHN0YXR1cywgUHJpdmF0ZS0+RVBPQ19EcmF3RGV2aWNlID0gQ0Zic0RyYXdEZXZpY2U6Ok5ld1NjcmVlbkRldmljZUwoc2NyZWVuSW5mbzIsIGRpc3BsYXlNb2RlKSk7CisJVXNlcjo6TGVhdmVJZkVycm9yKHN0YXR1cyk7CisjZW5kaWYKKworICAgIC8qIFRoZSAiYmVzdCIgdmlkZW8gZm9ybWF0IHNob3VsZCBiZSByZXR1cm5lZCB0byBjYWxsZXIuICovCisKKyAgICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgICAgICAgPSAvKiEhR2V0QnBwKGRpc3BsYXlNb2RlKSAqLyA4OworICAgIHZmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgICAgICA9IC8qISFQcml2YXRlLT5FUE9DX0J5dGVzUGVyUGl4ZWwqLyAxOworCisgICAgLyogQWN0aXZhdGUgZXZlbnRzIGZvciBtZSAqLworCisJUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50U3RhdHVzID0gS1JlcXVlc3RQZW5kaW5nOworCVByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkV2ZW50UmVhZHkoJlByaXZhdGUtPkVQT0NfV3NFdmVudFN0YXR1cyk7CisKKyAgICBTRExfVFJBQ0UoIlNETDpXc0V2ZW50U3RhdHVzIik7CisgICAgVXNlcjo6V2FpdEZvclJlcXVlc3QoUHJpdmF0ZS0+RVBPQ19Xc0V2ZW50U3RhdHVzKTsgLy9NYXJrdXM6IEkgYWRkZWQgdGhpcyBhbmQgLi4uCisKKwlQcml2YXRlLT5FUE9DX1JlZHJhd0V2ZW50U3RhdHVzID0gS1JlcXVlc3RQZW5kaW5nOworCVByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlJlZHJhd1JlYWR5KCZQcml2YXRlLT5FUE9DX1JlZHJhd0V2ZW50U3RhdHVzKTsKKyAgICAKKyAgICBTRExfVFJBQ0UoIlNETDpSZWRyYXdFdmVudFN0YXR1cyIpOworICAgIFVzZXI6OldhaXRGb3JSZXF1ZXN0KFByaXZhdGUtPkVQT0NfUmVkcmF3RXZlbnRTdGF0dXMpOyAvLy4uLnRoaXMsIGlmIG5vdCBjYXRjaGVzIGEgc3RyYXkgZXZlbnQgaXMgcmlzZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSBhcmUgYWN0aXZlIG9iamVjdHMgdXNlZCwgb3IgY29uZnVjaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0aW9ucyB3aXRoIFVzZXI6OldhaXRGb3JBbnlSZXF1ZXN0CisgICAgUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5Qb2ludGVyRmlsdGVyKEVQb2ludGVyRmlsdGVyRHJhZywgMCk7IAorCisgICAgUHJpdmF0ZS0+RVBPQ19TY3JlZW5PZmZzZXQgPSBUUG9pbnQoMCwgMCk7CisKKyNpZiBkZWZpbmVkKF9fV0lOU19fKSB8fCBkZWZpbmVkKFRFU1RfQk1fRFJBVykKKwlMb2NrSGVhcChQcml2YXRlLT5FUE9DX0JpdG1hcCk7IC8vIExvY2sgYml0bWFwIGhlYXAKKyNlbmRpZgorCisgICAgU0RMX1RSQUNFKCJTREw6RHJhd0JhY2tncm91bmQiKTsKKwlEcmF3QmFja2dyb3VuZChfdGhpcyk7IC8vIENsZWFyIHNjcmVlbgorCisjaWYgZGVmaW5lZChfX1dJTlNfXykgfHwgZGVmaW5lZChURVNUX0JNX0RSQVcpCisJVW5sb2NrSGVhcChQcml2YXRlLT5FUE9DX0JpdG1hcCk7IC8vIFVubG9jayBiaXRtYXAgaGVhcAorI2VuZGlmCisgICAgLy8hISBUT0RPOiBlcnJvciBoYW5kbGluZworICAgIC8vaWYgKHJldCAhPSBLRXJyTm9uZSkKKyAgICAvLyAgICByZXR1cm4oLTEpOworICAgIC8vZWxzZQorCSAgICByZXR1cm4oMCk7Cit9CisKKworU0RMX1JlY3QgKipFUE9DX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiAvKmZsYWdzKi8pCit7CisgICAgaWYgKGZvcm1hdC0+Qml0c1BlclBpeGVsID09IDEyIHx8IGZvcm1hdC0+Qml0c1BlclBpeGVsID09IDgpCisgICAgICAgIHJldHVybiBQcml2YXRlLT5TRExfbW9kZWxpc3Q7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBFUE9DX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKK3sKKwlpZiAoKGZpcnN0Y29sb3IrbmNvbG9ycykgPiAyNTYpCisJCXJldHVybiAtMTsKKy8vICAgIFNETF9UUkFDRTEoImNvbG9ycyAlZCIsIChURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVDb2xvcnMoUHJpdmF0ZS0+RVBPQ19EaXNwbGF5TW9kZSkpKTsKKyAgICBpZihURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVDb2xvcnMoUHJpdmF0ZS0+RVBPQ19EaXNwbGF5TW9kZSkgPT0gNDA5NikKKyAgICAgICAgeworCS8vIFNldCAxMiBiaXQgcGFsZXR0ZQorICAgICAgICBmb3IoaW50IGkgPSBmaXJzdGNvbG9yOyBpIDwgbmNvbG9yczsgaSsrKQorICAgICAgICAgICAgeworCSAgICAgICAgLy8gNGsgdmFsdWU6IDAwMDAgcnJyciBnZ2dnIGJiYmIKKwkgICAgICAgIFRVaW50MzIgY29sb3I0SwkgPSAoY29sb3JzW2ldLnIgJiAweDAwMDBmMCkgPDwgNDsKKwkgICAgICAgIGNvbG9yNEsJCQl8PSAoY29sb3JzW2ldLmcgJiAweDAwMDBmMCk7ICAgICAgCisJICAgICAgICBjb2xvcjRLCQkJfD0gKGNvbG9yc1tpXS5iICYgMHgwMDAwZjApID4+IDQ7CisgICAgICAgICAgICBFUE9DX0hXUGFsZXR0ZV8yNTZfdG9fU2NyZWVuW2ldID0gY29sb3I0SzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGVsc2UgaWYoVERpc3BsYXlNb2RlVXRpbHM6Ok51bURpc3BsYXlNb2RlQ29sb3JzKFByaXZhdGUtPkVQT0NfRGlzcGxheU1vZGUpID09IDY1NTM2KQorICAgICAgICB7CisgICAgICAgIGZvcihpbnQgaSA9IGZpcnN0Y29sb3I7IGkgPCBuY29sb3JzOyBpKyspCisgICAgICAgICAgICB7CisJCQkvLyA2NGstY29sb3VyIGRpc3BsYXlzIGVmZmVjdGl2ZWx5IHN1cHBvcnQgUkdCIHZhbHVlcworCQkJLy8gd2l0aCA1IGJpdHMgYWxsb2NhdGVkIHRvIHJlZCwgNiB0byBncmVlbiBhbmQgNSB0byBibHVlCisJCQkvLyA2NGsgdmFsdWU6IHJycnIgcmdnZyBnZ2diIGJiYmIKKwkgICAgICAgIFRVaW50MzIgY29sb3I2NEsgPSAoY29sb3JzW2ldLnIgJiAweDAwMDBmOCkgPDwgODsKKwkgICAgICAgIGNvbG9yNjRLCQl8PSAoY29sb3JzW2ldLmcgJiAweDAwMDBmYykgPDwgMzsKKwkgICAgICAgIGNvbG9yNjRLCQl8PSAoY29sb3JzW2ldLmIgJiAweDAwMDBmOCkgPj4gMzsKKyAgICAgICAgICAgIEVQT0NfSFdQYWxldHRlXzI1Nl90b19TY3JlZW5baV0gPSBjb2xvcjY0SzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGVsc2UgaWYoVERpc3BsYXlNb2RlVXRpbHM6Ok51bURpc3BsYXlNb2RlQ29sb3JzKFByaXZhdGUtPkVQT0NfRGlzcGxheU1vZGUpID09IDE2Nzc3MjE2KQorICAgICAgICB7CisgICAgICAgIGZvcihpbnQgaSA9IGZpcnN0Y29sb3I7IGkgPCBuY29sb3JzOyBpKyspCisgICAgICAgICAgICB7CisJCQkvLyAxNk0tY29sb3VyCisgICAgICAgICAgICAvLzAwMDAgMDAwMCBycnJyIHJycnIgZ2dnZyBnZ2dnIGJiYmIgYmJiYgorCSAgICAgICAgVFVpbnQzMiBjb2xvcjE2TSA9IGNvbG9yc1tpXS5yIDw8IDE2OworCSAgICAgICAgY29sb3IxNk0JCXw9IGNvbG9yc1tpXS5nIDw8IDg7CisJICAgICAgICBjb2xvcjE2TQkJfD0gY29sb3JzW2ldLmI7CisgICAgICAgICAgICBFUE9DX0hXUGFsZXR0ZV8yNTZfdG9fU2NyZWVuW2ldID0gY29sb3IxNk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgICAgICB9CisJcmV0dXJuKDApOworfQorCisKK1NETF9TdXJmYWNlICpFUE9DX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgLypmbGFncyovKQoreworCVNETF9UUkFDRSgiU0RMOkVQT0NfU2V0VmlkZW9Nb2RlIik7CisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworI2lmZGVmIFNZTUJJQU5fQ1JZU1RBTAorICAgaWYgKCEgKGJwcCA9PSA4IHx8IGJwcCA9PSAxMiB8fCBicHAgPT0gMTYpICYmCisJCSAoCisJCSAgKHdpZHRoID09IDY0MCAmJiBoZWlnaHQgPT0gMjAwKSB8fAorICAgICAgICAgICh3aWR0aCA9PSA2NDAgJiYgaGVpZ2h0ID09IDQwMCkgfHwgCisgICAgICAgICAgKHdpZHRoID09IDY0MCAmJiBoZWlnaHQgPT0gNDgwKSB8fCAKKyAgICAgICAgICAod2lkdGggPT0gMzIwICYmIGhlaWdodCA9PSAyMDApIHx8IAorICAgICAgICAgICh3aWR0aCA9PSAzMjAgJiYgaGVpZ2h0ID09IDI0MCkKKwkJICkpIHsKKwkJU0RMX1NldEVycm9yKCJSZXF1ZXN0ZWQgdmlkZW8gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbHNlIC8vIFNZTUJJQU5fU0VSSUVTNjAKKyAgIGlmICghIChicHAgPT0gOCB8fCBicHAgPT0gMTIgfHwgYnBwID09IDE2KSAmJgorCQkgKAorCQkgICh3aWR0aCA9PSAzMjAgJiYgaGVpZ2h0ID09IDIwMCkgfHwgCisgICAgICAgICAgKHdpZHRoID09IDMyMCAmJiBoZWlnaHQgPT0gMjQwKSB8fAorCQkgICh3aWR0aCA9PSAyNTYgJiYgaGVpZ2h0ID09IDE5MikgfHwgIAorCQkgICh3aWR0aCA9PSAxNzYgJiYgaGVpZ2h0ID09IDIwOCkgfHwgCisJCSAgKHdpZHRoID09IDIwOCAmJiBoZWlnaHQgPT0gMTc2KSB8fCAvLyBSb3RhdGVkCisJCSAgKHdpZHRoID09IDE2MCAmJiBoZWlnaHQgPT0gMTQ0KSAgICAKKwkJICkpIHsKKwkJU0RMX1NldEVycm9yKCJSZXF1ZXN0ZWQgdmlkZW8gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudC0+cGl4ZWxzKSB7CisgICAgICAgIGZyZWUoY3VycmVudC0+cGl4ZWxzKTsKKyAgICAgICAgY3VycmVudC0+cGl4ZWxzID0gTlVMTDsKKyAgICB9CisJaWYgKCAhIFNETF9SZWFsbG9jRm9ybWF0KGN1cnJlbnQsIGJwcCwgMCwgMCwgMCwgMCkgKSB7CisJCXJldHVybihOVUxMKTsKKwl9CisKKyAgICAvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCisgICAgaWYgKGJwcCA9PSA4KSAKKwkgICAgY3VycmVudC0+ZmxhZ3MgPSAoU0RMX0ZVTExTQ1JFRU58U0RMX1NXU1VSRkFDRXxTRExfUFJFQUxMT0N8U0RMX0hXUEFMRVRURSk7IAorICAgIGVsc2UgLy8gMTIgYnBwLCAxNiBicHAKKwkgICAgY3VycmVudC0+ZmxhZ3MgPSAoU0RMX0ZVTExTQ1JFRU58U0RMX1NXU1VSRkFDRXxTRExfUFJFQUxMT0MpOyAKKwljdXJyZW50LT53ID0gd2lkdGg7CisJY3VycmVudC0+aCA9IGhlaWdodDsKKyAgICBpbnQgbnVtQnl0ZXNQZXJQaXhlbCA9ICgoYnBwLTEpPj4zKSArIDE7ICAgCisJY3VycmVudC0+cGl0Y2ggPSBudW1CeXRlc1BlclBpeGVsICogd2lkdGg7IC8vIE51bWJlciBvZiBieXRlcyBpbiBzY2FubGluZSAKKwljdXJyZW50LT5waXhlbHMgPSBtYWxsb2Mod2lkdGggKiBoZWlnaHQgKiBudW1CeXRlc1BlclBpeGVsKTsKKwltZW1zZXQoY3VycmVudC0+cGl4ZWxzLCAwLCB3aWR0aCAqIGhlaWdodCAqIG51bUJ5dGVzUGVyUGl4ZWwpOworCisJLyogU2V0IHRoZSBibGl0IGZ1bmN0aW9uICovCisJX3RoaXMtPlVwZGF0ZVJlY3RzID0gRVBPQ19EaXJlY3RVcGRhdGU7CisKKyAgICAvKgorICAgICAqICBMb2dpYyBmb3IgZ2V0dGluZyBzdWl0YWJsZSBzY3JlZW4gZGltZW5zaW9ucywgb2Zmc2V0LCBzY2FsaW5nIGFuZCBvcmllbnRhdGlvbgorICAgICAqLworCisJaW50IHcgPSBjdXJyZW50LT53OworCWludCBoID0gY3VycmVudC0+aDsKKwkKKwkvLyBSb3RhdGUsIGlmIHRoZSBzY3JlZW4gZG9lcyBub3QgZml0IGhvcml6b250YWxseSBhbmQgaXQgaXMgbGFuZHNjYXBlIHNjcmVlbgorLyoKKwlpZiAoKHdpZHRoPlByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGgpICYmICAod2lkdGg+aGVpZ2h0KSkgeworCQlQcml2YXRlLT5FUE9DX1NjcmVlbk9yaWVudGF0aW9uID0gQ0Zic0JpdEdjOjpFR3JhcGhpY3NPcmllbnRhdGlvblJvdGF0ZWQyNzA7CisJCXcgPSBjdXJyZW50LT5oOyAKKwkJaCA9IGN1cnJlbnQtPnc7IAorCX0KKyovCisJLy8gR2V0IG5lYXJlc3Qgc3RlcHdpc2Ugc2NhbGUgdmFsdWVzIGZvciB3aWR0aCBhbmQgaGVpZ2h0LiBUaGUgc21hbGxlc3Qgc3VwcG9ydGVkIHNjYWxlZCBzY3JlZW4gaXMgMS8yLgorCVRJbnQgc2NhbGVWYWx1ZSA9IDA7CisJUHJpdmF0ZS0+RVBPQ19TY3JlZW5YU2NhbGVWYWx1ZSA9IDE7CisJUHJpdmF0ZS0+RVBPQ19TY3JlZW5ZU2NhbGVWYWx1ZSA9IDE7CisJaWYgKHcgPiBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaVdpZHRoKSB7CisJCS8vIEZpbmQgdGhlIGJpZ2dlc3Qgc2NhbGUgdmFsdWUgdGhhdCByZXN1bHQgdGhlIHdpZHRoIHRoYXQgZml0cyBpbiB0aGUgc2NyZWVuIEhXCisJCWZvciAoc2NhbGVWYWx1ZSA9IDI7IHNjYWxlVmFsdWUrKzspIHsKKwkJCVRJbnQgc2NhbGVkV2lkdGggPSAodyAqIChzY2FsZVZhbHVlLTEpKS9zY2FsZVZhbHVlOworCQkJaWYgKHNjYWxlZFdpZHRoID4gUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlXaWR0aCkKKwkJCQlicmVhazsKKwkJfQorCQlQcml2YXRlLT5FUE9DX1NjcmVlblhTY2FsZVZhbHVlID0gTWF4KDIsIHNjYWxlVmFsdWUgLSAxKTsKKwkJdyA9ICh3ICogKFByaXZhdGUtPkVQT0NfU2NyZWVuWFNjYWxlVmFsdWUtMSkpL1ByaXZhdGUtPkVQT0NfU2NyZWVuWFNjYWxlVmFsdWU7CisJfQorCWlmIChoID4gUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlIZWlnaHQpIHsKKwkJLy8gRmluZCB0aGUgYmlnZ2VzdCBzY2FsZSB2YWx1ZSB0aGF0IHJlc3VsdCB0aGUgaGVpZ2h0IHRoYXQgZml0cyBpbiB0aGUgc2NyZWVuIEhXCisJCWZvciAoc2NhbGVWYWx1ZSA9IDI7IHNjYWxlVmFsdWUrKzspIHsKKwkJCVRJbnQgc2NhbGVkSGVpZ2h0ID0gKGggKiAoc2NhbGVWYWx1ZS0xKSkvc2NhbGVWYWx1ZTsKKwkJCWlmIChzY2FsZWRIZWlnaHQgPiBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaUhlaWdodCkKKwkJCQlicmVhazsKKwkJfQorCQlQcml2YXRlLT5FUE9DX1NjcmVlbllTY2FsZVZhbHVlID0gTWF4KDIsIHNjYWxlVmFsdWUgLSAxKTsKKwkJaCA9IChoICogKFByaXZhdGUtPkVQT0NfU2NyZWVuWVNjYWxlVmFsdWUtMSkpL1ByaXZhdGUtPkVQT0NfU2NyZWVuWVNjYWxlVmFsdWU7CisJfQorCisgICAgLyogQ2VudHJhbGl6ZSBnYW1lIHdpbmRvdyBvbiBkZXZpY2Ugc2NyZWVuICAqLworICAgIFByaXZhdGUtPkVQT0NfU2NyZWVuT2Zmc2V0LmlYID0gKFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGggLSB3KSAvIDI7CisJaWYgKFByaXZhdGUtPkVQT0NfU2NyZWVuT2Zmc2V0LmlYIDwgMCkKKwkJUHJpdmF0ZS0+RVBPQ19TY3JlZW5PZmZzZXQuaVggPSAwOworICAgIFByaXZhdGUtPkVQT0NfU2NyZWVuT2Zmc2V0LmlZID0gKFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pSGVpZ2h0IC0gaCkgLyAyOworCWlmIChQcml2YXRlLT5FUE9DX1NjcmVlbk9mZnNldC5pWSA8IDApCisJCVByaXZhdGUtPkVQT0NfU2NyZWVuT2Zmc2V0LmlZID0gMDsKKworCisgICAgU0RMX1RSQUNFMSgiVmlldyB3aWR0aCAlZCIsIHcpOworICAgIFNETF9UUkFDRTEoIlZpZXcgaGVpZ2h0ICVkIiwgaCk7CisgICAgU0RMX1RSQUNFMSgiVmlldyBibW9kZSAlZCIsIGJwcCk7CisgICAgU0RMX1RSQUNFMSgiVmlldyBzICVkIiwgc2NhbGVWYWx1ZSk7CisgICAgU0RMX1RSQUNFMSgiVmlldyB4ICVkIiwgUHJpdmF0ZS0+RVBPQ19TY3JlZW5PZmZzZXQuaVgpOworICAgIFNETF9UUkFDRTEoIlZpZXcgeSAlZCIsIFByaXZhdGUtPkVQT0NfU2NyZWVuT2Zmc2V0LmlZKTsKKworCS8qIFdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4oY3VycmVudCk7Cit9CisKKwordm9pZCBSZWRyYXdXaW5kb3dMKF9USElTKQoreworCisjaWYgZGVmaW5lZChfX1dJTlNfXykgfHwgZGVmaW5lZChURVNUX0JNX0RSQVcpCisJICAgIExvY2tIZWFwKFByaXZhdGUtPkVQT0NfQml0bWFwKTsgLy8gTG9jayBiaXRtYXAgaGVhcAorCSAgICBQcml2YXRlLT5FUE9DX1dpbmRvd0djLT5BY3RpdmF0ZShQcml2YXRlLT5FUE9DX1dzV2luZG93KTsKKyNlbmRpZgorCisgICAgaW50IHcgPSBfdGhpcy0+c2NyZWVuLT53OworICAgIGludCBoID0gX3RoaXMtPnNjcmVlbi0+aDsKKwlpZiAoUHJpdmF0ZS0+RVBPQ19TY3JlZW5PcmllbnRhdGlvbiA9PSBDRmJzQml0R2M6OkVHcmFwaGljc09yaWVudGF0aW9uUm90YXRlZDI3MCkgeworCQl3ID0gX3RoaXMtPnNjcmVlbi0+aDsKKwkJaCA9IF90aGlzLT5zY3JlZW4tPnc7CisJfQorICAgIGlmICgodyA8IFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGgpCisgICAgICAgIHx8IChoIDwgUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlIZWlnaHQpKSB7CisJCURyYXdCYWNrZ3JvdW5kKF90aGlzKTsKKyAgICB9CisKKyAgICAvKiBUZWxsIHRoZSBzeXN0ZW0gdGhhdCBzb21ldGhpbmcgaGFzIGJlZW4gZHJhd24gKi8KKwlUUmVjdCAgcmVjdCA9IFRSZWN0KFByaXZhdGUtPkVQT0NfV3NXaW5kb3cuU2l6ZSgpKTsKKyAgCVByaXZhdGUtPkVQT0NfV3NXaW5kb3cuSW52YWxpZGF0ZShyZWN0KTsKKworI2lmIGRlZmluZWQoX19XSU5TX18pIHx8IGRlZmluZWQoVEVTVF9CTV9EUkFXKQorCVByaXZhdGUtPkVQT0NfV3NXaW5kb3cuQmVnaW5SZWRyYXcocmVjdCk7CisJUHJpdmF0ZS0+RVBPQ19XaW5kb3dHYy0+Qml0Qmx0KFRQb2ludCgpLCBQcml2YXRlLT5FUE9DX0JpdG1hcCk7CisJUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5FbmRSZWRyYXcoKTsKKwlQcml2YXRlLT5FUE9DX1dpbmRvd0djLT5EZWFjdGl2YXRlKCk7CisgICAgVW5sb2NrSGVhcChQcml2YXRlLT5FUE9DX0JpdG1hcCk7OyAvLyBVbmxvY2sgYml0bWFwIGhlYXAKKwlQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5GbHVzaCgpOworI2VuZGlmCisKKyAgICAvKiBEcmF3IGN1cnJlbnQgYnVmZmVyICovCisgICAgU0RMX1JlY3QgZnVsbFNjcmVlbjsKKyAgICBmdWxsU2NyZWVuLnggPSAwOworICAgIGZ1bGxTY3JlZW4ueSA9IDA7CisgICAgZnVsbFNjcmVlbi53ID0gX3RoaXMtPnNjcmVlbi0+dzsKKyAgICBmdWxsU2NyZWVuLmggPSBfdGhpcy0+c2NyZWVuLT5oOworICAgIEVQT0NfRGlyZWN0VXBkYXRlKF90aGlzLCAxLCAmZnVsbFNjcmVlbik7Cit9CisKKwordm9pZCBEcmF3QmFja2dyb3VuZChfVEhJUykKK3sKKwkvKiBEcmF3IGJhY2tncm91bmQgKi8KKyNpZiBkZWZpbmVkKF9fV0lOU19fKSB8fCBkZWZpbmVkKFRFU1RfQk1fRFJBVykKKwkvL3dhcm5pbmcgaGVhcCBpcyBub3QgbG9ja2VkISAtIGEgZnVuY3Rpb24gY2FsbGluZyBtdXN0IGVuc3VyZSB0aGF0IGl0J3Mgb2sKKyAgICBUVWludDE2KiBzY3JlZW5CdWZmZXIgPSAoVFVpbnQxNiopUHJpdmF0ZS0+RVBPQ19CaXRtYXAtPkRhdGFBZGRyZXNzKCk7CisjZWxzZQorICAgIFRVaW50MTYqIHNjcmVlbkJ1ZmZlciA9IChUVWludDE2KilQcml2YXRlLT5FUE9DX0ZyYW1lQnVmZmVyOworI2VuZGlmCisJLy8gRHJhdyBibGFjayBiYWNrZ3JvdW5kCisJTWVtOjpGaWxsWihzY3JlZW5CdWZmZXIsIFByaXZhdGUtPkVQT0NfQnl0ZXNQZXJTY3JlZW4pOworCisjaWYgMAorICAgIGZvciAoaW50IHkgPSAwOyB5IDwgUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlIZWlnaHQ7IHkrKykgeworCQlmb3IgKGludCB4ID0gMDsgeCA8IFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGg7IHgrKykgeworI2lmZGVmIFNZTUJJQU5fQ1JZU1RBTAorCQkJY29uc3QgVFVpbnQxNiBjb2xvciA9IDA7IC8vICgoeCt5KT4+MSkgJiAweGY7IC8qIERyYXcgYmx1ZSBzdHJpcGVzIHBhdHRlcm4sIGJlY2F1c2UgaW4gZS5nLiAzMjB4MjAwIG1vZGUgdGhlcmUgaXMgYSBiaWcgYmFja2dyb3VuZCBhcmVhKi8KKyNlbHNlIC8vIFNZTUJJQU5fU0VSSUVTNjAKKyAgICAgICAgICAgIGNvbnN0IFRVaW50MTYgY29sb3IgPSAwOyAvKiBEcmF3IGJsYWNrIGJhY2tncm91bmQgKi8KKyNlbmRpZgorICAgICAgICAgICAgKnNjcmVlbkJ1ZmZlcisrID0gY29sb3I7CisJCX0KKwl9CisjZW5kaWYKK30KKworCisvKiBXZSBkb24ndCBhY3R1YWxseSBhbGxvdyBoYXJkd2FyZSBzdXJmYWNlcyBvdGhlciB0aGFuIHRoZSBtYWluIG9uZSAqLworc3RhdGljIGludCBFUE9DX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSogLypzdXJmYWNlKi8pCit7CisJcmV0dXJuKC0xKTsKK30KK3N0YXRpYyB2b2lkIEVQT0NfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIC8qc3VyZmFjZSovKQoreworCXJldHVybjsKK30KKworc3RhdGljIGludCBFUE9DX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlKiAvKnN1cmZhY2UqLykKK3sKKwlyZXR1cm4oMCk7Cit9CitzdGF0aWMgdm9pZCBFUE9DX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIC8qc3VyZmFjZSovKQoreworCXJldHVybjsKK30KKworc3RhdGljIGludCBFUE9DX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlKiAvKnN1cmZhY2UqLykKK3sKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIEVQT0NfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKyAgICAvL1RJbnQgZm9jdXNXaW5kb3dHcm91cElkID0gUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uR2V0Rm9jdXNXaW5kb3dHcm91cCgpOy8vdGhlc2UgYXJlIGFzeW5jIHNlcnZpY2VzCisgICAvLyBpZiAoZm9jdXNXaW5kb3dHcm91cElkICE9IFByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cElEKSB7ICAgICAgICAgICAgICAvL2ZvciB0aGF0IGNhbm5vdCBiZSBjYWxsZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU0RMIHRocmVhZHMgPz8/CisgICAgaWYgKCFQcml2YXRlLT5FUE9DX0lzV2luZG93Rm9jdXNlZCkKKyAgICAgICAgeworICAgICAgICAvKiBGb3JjZSBmb2N1cyB3aW5kb3cgdG8gcmVkcmF3IGFnYWluIGZvciBjbGVhbmluZyBhd2F5IFNETCBzY3JlZW4gZ3JhcGhpY3MgKi8KKy8qCisgICAgICAgIFRJbnQgcG9zID0gUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwLk9yZGluYWxQb3NpdGlvbigpOworICAgICAgICBQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAuU2V0T3JkaW5hbFBvc2l0aW9uKDAsIEtNYXhUSW50KTsKKyAgICAgICAJVFJlY3QgIHJlY3QgPSBUUmVjdChQcml2YXRlLT5FUE9DX1dzV2luZG93LlNpemUoKSk7CisgICAgICAgIFByaXZhdGUtPkVQT0NfV3NXaW5kb3cuSW52YWxpZGF0ZShyZWN0KTsKKyAgICAgICAgUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwLlNldE9yZGluYWxQb3NpdGlvbihwb3MsIEVDb2VXaW5Qcmlvcml0eU5vcm1hbCk7CisgICAgICAgKi8gLyogSWYgdGhpcyBpcyBub3QgdGhlIHRvcG1vc3Qgd2luZG93LCB3YWl0IGhlcmUhIFNsZWVwIGZvciAxIHNlY29uZCB0byBnaXZlIGNwdSB0aW1lIHRvIAorICAgICAgICAgICBtdWx0aXRhc2tpbmcgYW5kIHBvbGwgZm9yIGJlaW5nIHRoZSB0b3Btb3N0IHdpbmRvdy4KKyAgICAgICAgKi8KKyAgICAvLyAgICBpZiAoUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uR2V0Rm9jdXNXaW5kb3dHcm91cCgpICE9IFByaXZhdGUtPkVQT0NfV3NXaW5kb3dHcm91cElEKSB7CisgICAgICAgICAgIAorCQkgICAvKiAhIVRPRE86IENvdWxkIGNhbGwgR2V0UmVkcmF3KCkgZXRjLiBmb3IgV3NTZXNzaW9uIGFuZCByZWRyYXcgdGhlIHNjcmVlbiBpZiBuZWVkZWQuIFRoYXQgbWlnaHQgYmUgCisJCSAgICAgIG5lZWRlZCBpZiBhIHNtYWxsIGRpYWxvZyBjb21lcyBpbiBmcm9udCBvZiBHYW1lIHNjcmVlbi4KKwkJICAgKi8KKyAgICAgICAgICAgLy8gd2hpbGUgKFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkdldEZvY3VzV2luZG93R3JvdXAoKSAhPSBQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXBJRCkKKyAgICAgICAgCisgICAgICAgIFNETF9QYXVzZUF1ZGlvKDEpOworICAgICAgICBTRExfRGVsYXkoMTAwMCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIC8vICB9CisKKyAgICAvLyAgICBSZWRyYXdXaW5kb3dMKF90aGlzKTsgIAorICAgIH0KKworICAgIFNETF9QYXVzZUF1ZGlvKDApOworCisJLy8gaWYgd2UgYXJlIG5vdCBmb2N1c2VkLCBkbyBub3QgZHJhdworLy8JaWYgKCFQcml2YXRlLT5FUE9DX0lzV2luZG93Rm9jdXNlZCkKKy8vCQlyZXR1cm47CisjaWYgZGVmaW5lZChfX1dJTlNfXykgfHwgZGVmaW5lZChURVNUX0JNX0RSQVcpCisJVEJpdG1hcFV0aWwgbG9jayhQcml2YXRlLT5FUE9DX0JpdG1hcCk7CQorICAgIGxvY2suQmVnaW4oVFBvaW50KDAsMCkpOyAvLyBMb2NrIGJpdG1hcCBoZWFwCisJUHJpdmF0ZS0+RVBPQ19XaW5kb3dHYy0+QWN0aXZhdGUoUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdyk7CisgICAgVFVpbnQxNiogc2NyZWVuQnVmZmVyID0gKFRVaW50MTYqKVByaXZhdGUtPkVQT0NfQml0bWFwLT5EYXRhQWRkcmVzcygpOworI2Vsc2UKKyAgICBUVWludDE2KiBzY3JlZW5CdWZmZXIgPSAoVFVpbnQxNiopUHJpdmF0ZS0+RVBPQ19GcmFtZUJ1ZmZlcjsKKyNlbmRpZgorCisJaWYgKFByaXZhdGUtPkVQT0NfU2NyZWVuT3JpZW50YXRpb24gPT0gQ0Zic0JpdEdjOjpFR3JhcGhpY3NPcmllbnRhdGlvblJvdGF0ZWQyNzApCisJCURpcmVjdERyYXdSb3RhdGVkKF90aGlzLCBudW1yZWN0cywgcmVjdHMsIHNjcmVlbkJ1ZmZlcik7CisJZWxzZQorCQlEaXJlY3REcmF3KF90aGlzLCBudW1yZWN0cywgcmVjdHMsIHNjcmVlbkJ1ZmZlcik7CisgICAgCisgICAKKyNpZiBkZWZpbmVkKF9fV0lOU19fKSB8fCBkZWZpbmVkKFRFU1RfQk1fRFJBVykKKworCVRSZWN0ICByZWN0ID0gVFJlY3QoUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvdy5TaXplKCkpOworCVByaXZhdGUtPkVQT0NfV3NXaW5kb3cuSW52YWxpZGF0ZShyZWN0KTsKKwlQcml2YXRlLT5FUE9DX1dzV2luZG93LkJlZ2luUmVkcmF3KHJlY3QpOworCVByaXZhdGUtPkVQT0NfV2luZG93R2MtPkJpdEJsdChUUG9pbnQoKSwgUHJpdmF0ZS0+RVBPQ19CaXRtYXApOworCVByaXZhdGUtPkVQT0NfV3NXaW5kb3cuRW5kUmVkcmF3KCk7CisJUHJpdmF0ZS0+RVBPQ19XaW5kb3dHYy0+RGVhY3RpdmF0ZSgpOworICAgIGxvY2suRW5kKCk7IC8vIFVubG9jayBiaXRtYXAgaGVhcAorCVByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkZsdXNoKCk7CisjZWxzZQorI2lmbmRlZiBTWU1CSUFOX0NSWVNUQUwKKwkvLyBUaGlzIGlzIG5vdCBuZWVkZWQgaW4gQ3J5c3RhbC4gV2hhdCBpcyB0aGUgcGVyZm9ybWFuY2UgcGVuYWx0eSBpbiBTRVJJRVM2MD8KKyAgICBUUmVjdCAgcmVjdDIgPSBUUmVjdChQcml2YXRlLT5FUE9DX1dzV2luZG93LlNpemUoKSk7CisgICAgCisgICAgUHJpdmF0ZS0+RVBPQ19EcmF3RGV2aWNlLT5VcGRhdGVSZWdpb24ocmVjdDIpOyAvLyBTaG91bGQgd2UgdXBkYXRlIHJlY3RzIHBhcmFtZXRlciBhcmVhIG9ubHk/PworICAgIFByaXZhdGUtPkVQT0NfRHJhd0RldmljZS0+VXBkYXRlKCk7CisjZW5kaWYKKyNlbmRpZgorCisgICAgLyogVXBkYXRlIHZpcnR1YWwgY3Vyc29yLiAhIURvIG5vdCB5ZXQgd29yayBwcm9wZXJseQorICAgIFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlNldFBvaW50ZXJDdXJzb3JQb3NpdGlvbihQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5Qb2ludGVyQ3Vyc29yUG9zaXRpb24oKSk7CisgICAgKi8KKworICAgIC8qc3RhdGljIGludCBmb28gPSAxOworCisgICAgCWZvciAoIGludCBpPTA7IGkgPCBudW1yZWN0czsgKytpICkgeworICAgICAgICBjb25zdCBTRExfUmVjdCYgY3VycmVudFJlY3QgPSByZWN0c1tpXTsKKyAgICAgICAgU0RMX1JlY3QgcmVjdDI7CisgICAgICAgIHJlY3QyLnggPSBjdXJyZW50UmVjdC54OworICAgICAgICByZWN0Mi55ID0gY3VycmVudFJlY3QueTsKKyAgICAgICAgcmVjdDIudyA9IGN1cnJlbnRSZWN0Lnc7CisgICAgICAgIHJlY3QyLmggPSBjdXJyZW50UmVjdC5oOworCisgICAgICAgIGlmIChyZWN0Mi53IDw9IDAgfHwgcmVjdDIuaCA8PSAwKSAKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgCisgICAgZm9vKys7CisgICAgaWYoKGZvbyAlIDIwMCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICBTRExfVFJBQ0UxKCJmb28gJWQiLCBmb28pOworICAgICAgICBDRmJzQml0bWFwKiBiID0gbmV3IChFTGVhdmUpIENGYnNCaXRtYXA7CisgICAgICAgIFNETF9UUkFDRTEoImJlZSAlZCIsIChpbnQpYik7CisgICAgICAgIGludCBlID0gYi0+Q3JlYXRlKFRTaXplKGN1cnJlbnRSZWN0LncsIGN1cnJlbnRSZWN0LmgpLCBQcml2YXRlLT5FUE9DX0Rpc3BsYXlNb2RlKTsKKyAgICAgICAgCisgICAgICAgIFNETF9UUkFDRTEoImVyciAlZCIsIGUpOworICAgICAgICBpZihlICE9IEtFcnJOb25lKQorICAgICAgICAgICAgVXNlcjo6UGFuaWMoX0woImRhbW4iKSwgZSk7CisKKyAgICAgICAgVEJpdG1hcFV0aWwgdShiKTsKKyAgICAgICAgdS5CZWdpbihUUG9pbnQoMCwgMCkpOworICAgICAgICBUVWludDMyKiBkID0gYi0+RGF0YUFkZHJlc3MoKTsKKyAgICAgICAgCisgICAgICAgIFNETF9UUkFDRTEoImFkZHIgJWQiLCAoaW50KWQpOworCisgICAgICAgIGZvcihUSW50IG8gPSAwOyBvIDwgY3VycmVudFJlY3QuaDsgbysrKQorICAgICAgICAgICAgZm9yKFRJbnQgcCA9IDA7IHAgPCBjdXJyZW50UmVjdC53OyBwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUuU2V0UG9zKFRQb2ludChwLCBvKSk7CisgICAgICAgICAgICAgICAgdS5TZXRQaXhlbCgweEZGRkYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICBTRExfVFJBQ0UxKCJ3ICVkIiwgKGludCljdXJyZW50UmVjdC53KTsKKyAgICAgICAgU0RMX1RSQUNFMSgiaCAlZCIsIChpbnQpY3VycmVudFJlY3QuaCk7CisKKyAgICAgICAgU0RMX1RSQUNFMSgiYWRkciAlZCIsIChpbnQpUHJpdmF0ZS0+RVBPQ19EaXNwbGF5TW9kZSk7CisKKyAgICAgICAgCisgICAgICAgIGNvbnN0IFRVaW50IGYgPSAoVFVpbnQpUHJpdmF0ZS0+RVBPQ19GcmFtZUJ1ZmZlcjsKKyAgICAgICAgY29uc3QgVFVpbnQgeSA9IChUVWludClQcml2YXRlLT5FUE9DX0J5dGVzUGVyU2NyZWVuOworCisgICAgICAgIAorICAgICAgICBTRExfVFJBQ0UxKCJmcmFtZSAldSIsIGYpOworICAgICAgICBTRExfVFJBQ0UxKCJieXRlcyAldSIsIHkpOworCisgICAgICAgIE1lbTo6Q29weShkLCBQcml2YXRlLT5FUE9DX0ZyYW1lQnVmZmVyLCBQcml2YXRlLT5FUE9DX0J5dGVzUGVyU2NyZWVuKTsKKworICAgICAgICBTRExfVFJBQ0UoImtvcGllZCIpOworCisgICAgICAgIHUuRW5kKCk7CisgICAgICAgIFRCdWY8MzI+IG5hbWU7CisgICAgICAgIG5hbWUuRm9ybWF0KF9MKCJDOlxcbm9raWFcXGltYWdlc1xcZG9vbSVkLm1ibSIpLCAoZm9vIC8gMjAwKSk7CisgICAgICAgIGU9IGItPlNhdmUobmFtZSk7CisgICAgICAgIGlmKGUgIT0gS0Vyck5vbmUpCisgICAgICAgICAgICBVc2VyOjpQYW5pYyhfTCgiZGFtbmVkIiksIGUpOworICAgICAgICBkZWxldGUgYjsKKyAgICAgICAgICAgIH19Ki8KK30KKworCit2b2lkIERpcmVjdERyYXcoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzLCBUVWludDE2KiBzY3JlZW5CdWZmZXIpCit7CisJVEludCBpOworCisgICAgY29uc3QgVEludCBzb3VyY2VOdW1CeXRlc1BlclBpeGVsID0gKChfdGhpcy0+c2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbC0xKT4+MykgKyAxOyAgIAorICAgIGNvbnN0IFRQb2ludCBmaXhlZE9mZnNldCA9IFByaXZhdGUtPkVQT0NfU2NyZWVuT2Zmc2V0OyAgIAorICAgIGNvbnN0IFRJbnQgc2NyZWVuVyA9IF90aGlzLT5zY3JlZW4tPnc7CisgICAgY29uc3QgVEludCBzY3JlZW5IID0gX3RoaXMtPnNjcmVlbi0+aDsKKyAgICBjb25zdCBUSW50IHNvdXJjZVNjYW5saW5lTGVuZ3RoID0gc2NyZWVuVzsKKyAgICBjb25zdCBUSW50IHRhcmdldFNjYW5saW5lTGVuZ3RoID0gUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlXaWR0aDsKKworCS8qIFJlbmRlciB0aGUgcmVjdGFuZ2xlcyBpbiB0aGUgbGlzdCAqLworCisJZm9yICggaT0wOyBpIDwgbnVtcmVjdHM7ICsraSApIHsKKyAgICAgICAgY29uc3QgU0RMX1JlY3QmIGN1cnJlbnRSZWN0ID0gcmVjdHNbaV07CisgICAgICAgIFNETF9SZWN0IHJlY3QyOworICAgICAgICByZWN0Mi54ID0gY3VycmVudFJlY3QueDsKKyAgICAgICAgcmVjdDIueSA9IGN1cnJlbnRSZWN0Lnk7CisgICAgICAgIHJlY3QyLncgPSBjdXJyZW50UmVjdC53OworICAgICAgICByZWN0Mi5oID0gY3VycmVudFJlY3QuaDsKKworICAgICAgICBpZiAocmVjdDIudyA8PSAwIHx8IHJlY3QyLmggPD0gMCkgLyogc2FuaXR5IGNoZWNrICovCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBBbGwgdmFyaWFibGVzIGFyZSBtZWFzdXJlZCBpbiBwaXhlbHMgKi8KKworICAgICAgICAvKiBDaGVjayByZWN0cyB2YWxpZGl0eSwgaS5lLiB1cHBlciBhbmQgbG93ZXIgYm91bmRzICovCisgICAgICAgIFRJbnQgbWF4WCA9IE1pbihzY3JlZW5XIC0gMSwgcmVjdDIueCArIHJlY3QyLncgLSAxKTsKKyAgICAgICAgVEludCBtYXhZID0gTWluKHNjcmVlbkggLSAxLCByZWN0Mi55ICsgcmVjdDIuaCAtIDEpOworICAgICAgICBpZiAobWF4WCA8IDAgfHwgbWF4WSA8IDApIC8qIHNhbml0eSBjaGVjayAqLworICAgICAgICAgICAgY29udGludWU7CisJCS8qIENsaXAgZnJvbSBib3R0b20gKi8KKyAgICAgICAgbWF4WSA9IE1pbihtYXhZLCBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaUhlaWdodC0xKTsgCisJCS8qIFRPRE86IENsaXAgZnJvbSB0aGUgcmlnaHQgc2lkZSAqLworCisgICAgICAgIGNvbnN0IFRJbnQgc291cmNlUmVjdFdpZHRoID0gbWF4WCAtIHJlY3QyLnggKyAxOworICAgICAgICBjb25zdCBUSW50IHNvdXJjZVJlY3RXaWR0aEluQnl0ZXMgPSBzb3VyY2VSZWN0V2lkdGggKiBzb3VyY2VOdW1CeXRlc1BlclBpeGVsOworICAgICAgICBjb25zdCBUSW50IHNvdXJjZVJlY3RIZWlnaHQgPSBtYXhZIC0gcmVjdDIueSArIDE7CisgICAgICAgIGNvbnN0IFRJbnQgc291cmNlU3RhcnRPZmZzZXQgPSByZWN0Mi54ICsgcmVjdDIueSAqIHNvdXJjZVNjYW5saW5lTGVuZ3RoOworCQljb25zdCBUVWludCBza2lwVmFsdWUgPSAxOyAvLyBubyBza2lwCisKKyAgICAgICAgVEludCB0YXJnZXRTdGFydE9mZnNldCA9IGZpeGVkT2Zmc2V0LmlYICsgcmVjdDIueCArIChmaXhlZE9mZnNldC5pWSArcmVjdDIueSkgKiB0YXJnZXRTY2FubGluZUxlbmd0aDsgICAKKyAgICAgICAgCisgICAgICAgIC8vIE5va2lhNzY1MCBuYXRpdmUgbW9kZTogMTIgYnBwIC0tPiAxMiBicHAKKyAgICAgICAgLy8KKworICAgICAgICBzd2l0Y2ggKF90aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsKQorCQkJeworCQljYXNlIDEyOgorCQkJeworCQkJVFVpbnQxNiogYml0bWFwTGluZSA9IChUVWludDE2KilfdGhpcy0+c2NyZWVuLT5waXhlbHMgKyBzb3VyY2VTdGFydE9mZnNldDsKKwkJCVRVaW50MTYqIHNjcmVlbk1lbW9yeSA9IHNjcmVlbkJ1ZmZlciArIHRhcmdldFN0YXJ0T2Zmc2V0OworCQkJaWYgKHNraXBWYWx1ZSA9PSAxKQorCQkJCXsKKwkJCQlmb3IoVEludCB5ID0gMCA7IHkgPCBzb3VyY2VSZWN0SGVpZ2h0IDsgeSsrKQorCQkJCQl7CisJCQkJCU1lbTo6Q29weShzY3JlZW5NZW1vcnksIGJpdG1hcExpbmUsIHNvdXJjZVJlY3RXaWR0aEluQnl0ZXMpOworCQkJCQl9CisJCQkJCWJpdG1hcExpbmUgKz0gc291cmNlU2NhbmxpbmVMZW5ndGg7CisJCQkJCXNjcmVlbk1lbW9yeSArPSB0YXJnZXRTY2FubGluZUxlbmd0aDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWZvcihUSW50IHkgPSAwIDsgeSA8IHNvdXJjZVJlY3RIZWlnaHQgOyB5KyspCisJCQkJCXsKKwkJCQkJLy9UT0RPOiBvcHRpbWl6ZTogc2VwYXJhdGUgbG9vcHMgZm9yIDEsIDIgYW5kIG4gc2tpcC4gTWVtOjpDb3B5KCkgY2FuIGJlIHVzZWQgaW4gdW5zY2FsZWQgY2FzZS4KKwkJCQkJVFVpbnQxNiogYml0bWFwUG9zID0gYml0bWFwTGluZTsgLyogMiBieXRlcyBwZXIgcGl4ZWwgKi8KKwkJCQkJVFVpbnQxNiogc2NyZWVuTWVtb3J5TGluZVBvcyA9IHNjcmVlbk1lbW9yeTsgLyogMiBieXRlcyBwZXIgcGl4ZWwgKi8KKwkJCQkJZm9yKFRJbnQgeCA9IDAgOyB4IDwgc291cmNlUmVjdFdpZHRoIDsgeCsrKQorCQkJCQkJewkJCQkJCisJCQkJCQlfX0FTU0VSVF9ERUJVRyhzY3JlZW5NZW1vcnkgPCAoc2NyZWVuQnVmZmVyICsgUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlXaWR0aCAqIFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pSGVpZ2h0KSwgVXNlcjo6UGFuaWMoX0woIlNETCIpLCBLRXJyQ29ycnVwdCkpOworCQkJCQkJX19BU1NFUlRfREVCVUcoc2NyZWVuTWVtb3J5ID49IHNjcmVlbkJ1ZmZlciwgVXNlcjo6UGFuaWMoX0woIlNETCIpLCBLRXJyQ29ycnVwdCkpOworCQkJCQkJX19BU1NFUlRfREVCVUcoYml0bWFwTGluZSA8ICgoVFVpbnQxNiopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzICsgKF90aGlzLT5zY3JlZW4tPncgKiBfdGhpcy0+c2NyZWVuLT5oKSksIFVzZXI6OlBhbmljKF9MKCJTREwiKSwgS0VyckNvcnJ1cHQpKTsKKwkJCQkJCV9fQVNTRVJUX0RFQlVHKGJpdG1hcExpbmUgPj0gIChUVWludDE2KilfdGhpcy0+c2NyZWVuLT5waXhlbHMsIFVzZXI6OlBhbmljKF9MKCJTREwiKSwgS0VyckNvcnJ1cHQpKTsKKyAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkqc2NyZWVuTWVtb3J5TGluZVBvcysrID0gKmJpdG1hcFBvczsKKwkJCQkJCWJpdG1hcFBvcys9c2tpcFZhbHVlOworCQkJCQkJfQorCQkJCQliaXRtYXBMaW5lICs9IHNvdXJjZVNjYW5saW5lTGVuZ3RoOworCQkJCQlzY3JlZW5NZW1vcnkgKz0gdGFyZ2V0U2NhbmxpbmVMZW5ndGg7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKyAgICAgICAgLy8gMjU2IGNvbG9yIHBhbGV0dGVkIG1vZGU6IDggYnBwICAtLT4gMTIgYnBwCisgICAgICAgIC8vCisJCWRlZmF1bHQ6CisJCQl7CisgICAgICAgICAgICBpZihQcml2YXRlLT5FUE9DX0J5dGVzUGVyUGl4ZWwgPD0gMikKKyAgICAgICAgICAgICAgICB7CisJCQkgICAgVFVpbnQ4KiBiaXRtYXBMaW5lID0gKFRVaW50OCopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzICsgc291cmNlU3RhcnRPZmZzZXQ7CisgICAgICAgICAgICAgICAgVFVpbnQxNiogc2NyZWVuTWVtb3J5ID0gc2NyZWVuQnVmZmVyICsgdGFyZ2V0U3RhcnRPZmZzZXQ7CisJCQkJICAgIGZvcihUSW50IHkgPSAwIDsgeSA8IHNvdXJjZVJlY3RIZWlnaHQgOyB5KyspCisJCQkJCSAgICB7CisJCQkJCSAgICBUVWludDgqIGJpdG1hcFBvcyA9IGJpdG1hcExpbmU7IC8qIDEgYnl0ZSBwZXIgcGl4ZWwgKi8KKwkJCQkJICAgIFRVaW50MTYqIHNjcmVlbk1lbW9yeUxpbmVQb3MgPSBzY3JlZW5NZW1vcnk7IC8qIDIgYnl0ZXMgcGVyIHBpeGVsICovCisJCQkJCSAgICAvKiBDb252ZXJ0IGVhY2ggcGl4ZWwgZnJvbSAyNTYgcGFsZXR0ZSB0byA0ayBjb2xvciB2YWx1ZXMgKi8KKwkJCQkJICAgIGZvcihUSW50IHggPSAwIDsgeCA8IHNvdXJjZVJlY3RXaWR0aCA7IHgrKykKKwkJCQkJCSAgICB7CisJCQkJCQkgICAgX19BU1NFUlRfREVCVUcoc2NyZWVuTWVtb3J5TGluZVBvcyA8IChzY3JlZW5CdWZmZXIgKyAoUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlXaWR0aCAqIFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pSGVpZ2h0KSksIFVzZXI6OlBhbmljKF9MKCJTREwiKSwgS0VyckNvcnJ1cHQpKTsKKwkJCQkJCSAgICBfX0FTU0VSVF9ERUJVRyhzY3JlZW5NZW1vcnlMaW5lUG9zID49IHNjcmVlbkJ1ZmZlciwgVXNlcjo6UGFuaWMoX0woIlNETCIpLCBLRXJyQ29ycnVwdCkpOworCQkJCQkJICAgIF9fQVNTRVJUX0RFQlVHKGJpdG1hcFBvcyA8ICgoVFVpbnQ4KilfdGhpcy0+c2NyZWVuLT5waXhlbHMgKyAoX3RoaXMtPnNjcmVlbi0+dyAqIF90aGlzLT5zY3JlZW4tPmgpKSwgVXNlcjo6UGFuaWMoX0woIlNETCIpLCBLRXJyQ29ycnVwdCkpOworCQkJCQkJICAgIF9fQVNTRVJUX0RFQlVHKGJpdG1hcFBvcyA+PSAoVFVpbnQ4KilfdGhpcy0+c2NyZWVuLT5waXhlbHMsIFVzZXI6OlBhbmljKF9MKCJTREwiKSwgS0VyckNvcnJ1cHQpKTsgICAgICAgICAgICAgICAKKwkJCQkJCSAgICAqc2NyZWVuTWVtb3J5TGluZVBvcysrID0gRVBPQ19IV1BhbGV0dGVfMjU2X3RvX1NjcmVlblsqYml0bWFwUG9zKytdOworICAgIC8vCQkJCQkJYml0bWFwUG9zKz1za2lwVmFsdWU7IC8vVE9ETzogb3B0aW1pemU6IHNlcGFyYXRlIGxvb3BzIGZvciAxLCAyIGFuZCBuIHNraXAKKwkJCQkJCSAgICB9CisJCQkJCSAgICBiaXRtYXBMaW5lICs9IHNvdXJjZVNjYW5saW5lTGVuZ3RoOworCQkJCQkgICAgc2NyZWVuTWVtb3J5ICs9IHRhcmdldFNjYW5saW5lTGVuZ3RoOworCQkJCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFVpbnQ4KiBiaXRtYXBMaW5lID0gKFRVaW50OCopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzICsgc291cmNlU3RhcnRPZmZzZXQ7CisgICAgICAgICAgICAgICAgVFVpbnQzMiogc2NyZWVuTWVtb3J5ID0gcmVpbnRlcnByZXRfY2FzdDxUVWludDMyKj4oc2NyZWVuQnVmZmVyICsgdGFyZ2V0U3RhcnRPZmZzZXQpOworCQkJCSAgICBmb3IoVEludCB5ID0gMCA7IHkgPCBzb3VyY2VSZWN0SGVpZ2h0IDsgeSsrKQorCQkJCQkgICAgeworCQkJCQkgICAgVFVpbnQ4KiBiaXRtYXBQb3MgPSBiaXRtYXBMaW5lOyAvKiAxIGJ5dGUgcGVyIHBpeGVsICovCisJCQkJCSAgICBUVWludDMyKiBzY3JlZW5NZW1vcnlMaW5lUG9zID0gc2NyZWVuTWVtb3J5OyAvKiAyIGJ5dGVzIHBlciBwaXhlbCAqLworCQkJCQkgICAgLyogQ29udmVydCBlYWNoIHBpeGVsIGZyb20gMjU2IHBhbGV0dGUgdG8gNGsgY29sb3IgdmFsdWVzICovCisJCQkJCSAgICBmb3IoVEludCB4ID0gMCA7IHggPCBzb3VyY2VSZWN0V2lkdGggOyB4KyspCisJCQkJCQkgICAgeworCQkJCQkJICAgIF9fQVNTRVJUX0RFQlVHKHNjcmVlbk1lbW9yeUxpbmVQb3MgPCAocmVpbnRlcnByZXRfY2FzdDxUVWludDMyKj4oc2NyZWVuQnVmZmVyKSArIChQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaVdpZHRoICogUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlIZWlnaHQpKSwgVXNlcjo6UGFuaWMoX0woIlNETCIpLCBLRXJyQ29ycnVwdCkpOworCQkJCQkJICAgIF9fQVNTRVJUX0RFQlVHKHNjcmVlbk1lbW9yeUxpbmVQb3MgPj0gcmVpbnRlcnByZXRfY2FzdDxUVWludDMyKj4oc2NyZWVuQnVmZmVyKSwgVXNlcjo6UGFuaWMoX0woIlNETCIpLCBLRXJyQ29ycnVwdCkpOworCQkJCQkJICAgIF9fQVNTRVJUX0RFQlVHKGJpdG1hcFBvcyA8ICgoVFVpbnQ4KilfdGhpcy0+c2NyZWVuLT5waXhlbHMgKyAoX3RoaXMtPnNjcmVlbi0+dyAqIF90aGlzLT5zY3JlZW4tPmgpKSwgVXNlcjo6UGFuaWMoX0woIlNETCIpLCBLRXJyQ29ycnVwdCkpOworCQkJCQkJICAgIF9fQVNTRVJUX0RFQlVHKGJpdG1hcFBvcyA+PSAoVFVpbnQ4KilfdGhpcy0+c2NyZWVuLT5waXhlbHMsIFVzZXI6OlBhbmljKF9MKCJTREwiKSwgS0VyckNvcnJ1cHQpKTsgICAgICAgICAgICAgICAKKwkJCQkJCSAgICAqc2NyZWVuTWVtb3J5TGluZVBvcysrID0gRVBPQ19IV1BhbGV0dGVfMjU2X3RvX1NjcmVlblsqYml0bWFwUG9zKytdOworICAgIC8vCQkJCQkJYml0bWFwUG9zKz1za2lwVmFsdWU7IC8vVE9ETzogb3B0aW1pemU6IHNlcGFyYXRlIGxvb3BzIGZvciAxLCAyIGFuZCBuIHNraXAKKwkJCQkJCSAgICB9CisJCQkJCSAgICBiaXRtYXBMaW5lICs9IHNvdXJjZVNjYW5saW5lTGVuZ3RoOworCQkJCQkgICAgc2NyZWVuTWVtb3J5ICs9IHRhcmdldFNjYW5saW5lTGVuZ3RoOworCQkJCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKwkJCX0KKwkJfSAvLyBzd2l0Y2gKKwl9IC8vIGZvcgorfQorCisvKgordm9pZCBEaXJlY3REcmF3KF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cywgVFVpbnQxNiogc2NyZWVuQnVmZmVyKQoreworCVRJbnQgaTsKKyAgICBjb25zdCBUSW50IHNvdXJjZU51bUJ5dGVzUGVyUGl4ZWwgPSAoKF90aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsLTEpPj4zKSArIDE7ICAgCisgICAgY29uc3QgVFBvaW50IGZpeGVkT2Zmc2V0ID0gUHJpdmF0ZS0+RVBPQ19TY3JlZW5PZmZzZXQ7ICAgCisgICAgY29uc3QgVEludCBzY3JlZW5XID0gX3RoaXMtPnNjcmVlbi0+dzsKKyAgICBjb25zdCBUSW50IHNjcmVlbkggPSBfdGhpcy0+c2NyZWVuLT5oOworICAgIGNvbnN0IFRJbnQgc291cmNlU2NhbmxpbmVMZW5ndGggPSBzY3JlZW5XOworICAgIGNvbnN0IFRJbnQgdGFyZ2V0U2NhbmxpbmVMZW5ndGggPSBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaVdpZHRoOworCisJLyogUmVuZGVyIHRoZSByZWN0YW5nbGVzIGluIHRoZSBsaXN0ICovCisKKy8qCWZvciAoIGk9MDsgaSA8IG51bXJlY3RzOyArK2kgKSB7CisgICAgICAgIGNvbnN0IFNETF9SZWN0JiBjdXJyZW50UmVjdCA9IHJlY3RzW2ldOworICAgICAgICBTRExfUmVjdCByZWN0MjsKKyAgICAgICAgcmVjdDIueCA9IGN1cnJlbnRSZWN0Lng7CisgICAgICAgIHJlY3QyLnkgPSBjdXJyZW50UmVjdC55OworICAgICAgICByZWN0Mi53ID0gY3VycmVudFJlY3QudzsKKyAgICAgICAgcmVjdDIuaCA9IGN1cnJlbnRSZWN0Lmg7CisKKyAgICAgICAgaWYgKHJlY3QyLncgPD0gMCB8fCByZWN0Mi5oIDw9IDApIC8qIHNhbml0eSBjaGVjayAqLworLyogICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBBbGwgdmFyaWFibGVzIGFyZSBtZWFzdXJlZCBpbiBwaXhlbHMgKi8KKworICAgICAgICAvKiBDaGVjayByZWN0cyB2YWxpZGl0eSwgaS5lLiB1cHBlciBhbmQgbG93ZXIgYm91bmRzICovCisvKiAgICAgICAgVEludCBtYXhYID0gTWluKHNjcmVlblcgLSAxLCByZWN0Mi54ICsgcmVjdDIudyAtIDEpOworICAgICAgICBUSW50IG1heFkgPSBNaW4oc2NyZWVuSCAtIDEsIHJlY3QyLnkgKyByZWN0Mi5oIC0gMSk7CisgICAgICAgIGlmIChtYXhYIDwgMCB8fCBtYXhZIDwgMCkgLyogc2FuaXR5IGNoZWNrICovCisvKiAgICAgICAgICAgIGNvbnRpbnVlOworCQkvKiBDbGlwIGZyb20gYm90dG9tICovCisvKiAgICAgICAgbWF4WSA9IE1pbihtYXhZLCBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaUhlaWdodC0xKTsgCisJCS8qIFRPRE86IENsaXAgZnJvbSB0aGUgcmlnaHQgc2lkZSAqLworCisvKgkJVEludCBzb3VyY2VSZWN0V2lkdGggPSBtYXhYIC0gcmVjdDIueCArIDE7CisgICAgICAgIGNvbnN0IFRJbnQgc291cmNlUmVjdFdpZHRoSW5CeXRlcyA9IHNvdXJjZVJlY3RXaWR0aCAqIHNvdXJjZU51bUJ5dGVzUGVyUGl4ZWw7CisgICAgICAgIGNvbnN0IFRJbnQgc291cmNlUmVjdEhlaWdodCA9IG1heFkgLSByZWN0Mi55ICsgMTsKKyAgICAgICAgY29uc3QgVEludCBzb3VyY2VTdGFydE9mZnNldCA9IHJlY3QyLnggKyByZWN0Mi55ICogc291cmNlU2NhbmxpbmVMZW5ndGg7CisJCWNvbnN0IFRVaW50IHNraXBWYWx1ZSA9IFByaXZhdGUtPkVQT0NfU2NyZWVuWFNjYWxlVmFsdWU7IC8vMTsgLy8gbm8gc2tpcAorCisJCWNvbnN0IFRJbnQgdGFyZ2V0U3RhcnRPZmZzZXQgPSAvLyA9IChmaXhlZE9mZnNldC5pWCArIChyZWN0Mi54IC8gc2tpcFZhbHVlKSArIChmaXhlZE9mZnNldC5pWSArIHJlY3QyLnkpICogdGFyZ2V0U2NhbmxpbmVMZW5ndGggKSA7CisJCQkoc2tpcFZhbHVlID4gMSA/IAorCQkJKGZpeGVkT2Zmc2V0LmlYICsgKHJlY3QyLnggLyBza2lwVmFsdWUpICsgKGZpeGVkT2Zmc2V0LmlZICsgcmVjdDIueSkgKiB0YXJnZXRTY2FubGluZUxlbmd0aCApIDogCisJCQkoZml4ZWRPZmZzZXQuaVggKyAgcmVjdDIueCAgICAgICAgICAgICAgKyAoZml4ZWRPZmZzZXQuaVkgKyByZWN0Mi55KSAqIHRhcmdldFNjYW5saW5lTGVuZ3RoICkpOworCisJCV9fQVNTRVJUX0RFQlVHKHNraXBWYWx1ZSA+PSAxLCBVc2VyOjpQYW5pYyhLTGliTmFtZSwgS0VyckFyZ3VtZW50KSk7CisKKyAgICAgICAgLy8gTm9raWE3NjUwIG5hdGl2ZSBtb2RlOiAxMiBicHAgLS0+IDEyIGJwcAorICAgICAgICAvLworICAgICAgICBzd2l0Y2ggKF90aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsKQorCQkJeworCQljYXNlIDEyOgorCQkJeworCQkJVFVpbnQxNiogYml0bWFwTGluZSA9IChUVWludDE2KilfdGhpcy0+c2NyZWVuLT5waXhlbHMgKyBzb3VyY2VTdGFydE9mZnNldDsKKwkJCVRVaW50MTYqIHNjcmVlbk1lbW9yeSA9IHNjcmVlbkJ1ZmZlciArIHRhcmdldFN0YXJ0T2Zmc2V0OworCQkJaWYgKHNraXBWYWx1ZSA9PSAxKQorCQkJCXsKKwkJCQlmb3IoVEludCB5ID0gMCA7IHkgPCBzb3VyY2VSZWN0SGVpZ2h0IDsgeSsrKQorCQkJCQl7CisJCQkJCU1lbTo6Q29weShzY3JlZW5NZW1vcnksIGJpdG1hcExpbmUsIHNvdXJjZVJlY3RXaWR0aEluQnl0ZXMpOworCQkJCQl9CisJCQkJCWJpdG1hcExpbmUgKz0gc291cmNlU2NhbmxpbmVMZW5ndGg7CisJCQkJCXNjcmVlbk1lbW9yeSArPSB0YXJnZXRTY2FubGluZUxlbmd0aDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWZvcihUSW50IHkgPSAwIDsgeSA8IHNvdXJjZVJlY3RIZWlnaHQgOyB5KyspCisJCQkJCXsKKwkJCQkJLy9UT0RPOiBvcHRpbWl6ZTogc2VwYXJhdGUgbG9vcHMgZm9yIDEsIDIgYW5kIG4gc2tpcC4gTWVtOjpDb3B5KCkgY2FuIGJlIHVzZWQgaW4gdW5zY2FsZWQgY2FzZS4KKwkJCQkJVFVpbnQxNiogYml0bWFwUG9zID0gYml0bWFwTGluZTsgLyogMiBieXRlcyBwZXIgcGl4ZWwgKi8KKy8qCQkJCQlUVWludDE2KiBzY3JlZW5NZW1vcnlMaW5lUG9zID0gc2NyZWVuTWVtb3J5OyAvKiAyIGJ5dGVzIHBlciBwaXhlbCAqLworLyoJCQkJCWZvcihUSW50IHggPSAwIDsgeCA8IHNvdXJjZVJlY3RXaWR0aCA7IHgrKykKKwkJCQkJCXsJCQkJCQorCQkJCQkJX19BU1NFUlRfREVCVUcoc2NyZWVuTWVtb3J5IDwgKHNjcmVlbkJ1ZmZlciArIFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGggKiBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaUhlaWdodCksIFVzZXI6OlBhbmljKEtMaWJOYW1lLCBLRXJyQ29ycnVwdCkpOworCQkJCQkJX19BU1NFUlRfREVCVUcoc2NyZWVuTWVtb3J5ID49IHNjcmVlbkJ1ZmZlciwgVXNlcjo6UGFuaWMoS0xpYk5hbWUsIEtFcnJDb3JydXB0KSk7CisJCQkJCQlfX0FTU0VSVF9ERUJVRyhiaXRtYXBMaW5lIDwgKChUVWludDE2KilfdGhpcy0+c2NyZWVuLT5waXhlbHMgKyAoX3RoaXMtPnNjcmVlbi0+dyAqIF90aGlzLT5zY3JlZW4tPmgpKSwgVXNlcjo6UGFuaWMoS0xpYk5hbWUsIEtFcnJDb3JydXB0KSk7CisJCQkJCQlfX0FTU0VSVF9ERUJVRyhiaXRtYXBMaW5lID49ICAoVFVpbnQxNiopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzLCBVc2VyOjpQYW5pYyhLTGliTmFtZSwgS0VyckNvcnJ1cHQpKTsKKyAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkqc2NyZWVuTWVtb3J5TGluZVBvcysrID0gKmJpdG1hcFBvczsKKwkJCQkJCWJpdG1hcFBvcys9c2tpcFZhbHVlOworCQkJCQkJfQorCQkJCQliaXRtYXBMaW5lICs9IHNvdXJjZVNjYW5saW5lTGVuZ3RoOworCQkJCQlzY3JlZW5NZW1vcnkgKz0gdGFyZ2V0U2NhbmxpbmVMZW5ndGg7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKyAgICAgICAgLy8gMjU2IGNvbG9yIHBhbGV0dGVkIG1vZGU6IDggYnBwICAtLT4gMTIgYnBwCisgICAgICAgIC8vCisJCWRlZmF1bHQ6CisJCQl7CisJCQlUVWludDgqIGJpdG1hcExpbmUgPSAoVFVpbnQ4KilfdGhpcy0+c2NyZWVuLT5waXhlbHMgKyBzb3VyY2VTdGFydE9mZnNldDsKKyAgICAgICAgICAgIFRVaW50MTYqIHNjcmVlbk1lbW9yeSA9IHNjcmVlbkJ1ZmZlciArIHRhcmdldFN0YXJ0T2Zmc2V0OworCQkJaWYgKHNraXBWYWx1ZSA+IDEpCisJCQkJc291cmNlUmVjdFdpZHRoIC89IHNraXBWYWx1ZTsKKyNpZiBkZWZpbmVkIF9fTUFSTV9BUk1JX18KKwkJCV9fYXNtIHZvbGF0aWxlKCIKKwkJCQltb3YJCSU0LCAlNCwgbHNsICMxCUAgdGFyZ2V0U2NhbkxpbmVMZW5ndGggaXMgaW4gcGl4ZWxzLCB3ZSBuZWVkIGl0IGluIGJ5dGVzCisJCQkxOgorCQkJCW1vdgkJcjYsICUwCQkJQCBiaXRtYXBMaW5lCisJCQkJbW92CQlyNywgJTIJCQlAIHNjcmVlbk1lbW9yeQorCQkJCW1vdgkJcjgsICU2CQkJQCBzb3VyY2VSZWN0V2lkdGgKKwkJCTI6CisJCQkJbGRyYglyNCwgWyUwXSwgJTcJCQlAIHI0ID0gKmJpdG1hcFBvczsgYml0bWFwUG9zICs9IHNraXBWYWx1ZQorCQkJCWxkcgkJcjUsIFslMSwgcjQsIGxzbCAjMl0JQCBvbmx5IDE2IGxvd2VyIGJpdHMgYWN0dWFsbHkgdXNlZAorCQkJCXN1YnMJcjgsIHI4LCAjMQkJCQlAIHgtLQorCQkJCXN0cmgJcjUsIFslMl0sICMyCQkJQCAqc2NyZWVuTWVtb3J5TGluZVBvcysrID0gcjQKKwkJCQlibmUJCTJiCisKKwkJCQlhZGQJCSUwLCByNiwgJTMJCUAgYml0bWFwTGluZSArPSBzb3VyY2VTY2FubGluZUxlbmd0aAorCQkJCWFkZAkJJTIsIHI3LCAlNAkJQCBzY3JlZW5NZW1vcnkgKz0gdGFyZ2V0U2NhbmxpbmVMZW5ndGgKKwkJCQlzdWJzICAgICU1LCAlNSwgIzEJCUAgc291cmNlUmVjdEhlaWdodC0tCisJCQkJYm5lCQkxYgorCQkJCSIKKwkJCQk6IC8vIG5vIG91dHB1dAorCQkJCS8vCQklMAkJCQkJCQkJJTEJCQkJCQkJJTIJCQkJCQklMwkJCQkJCQklNAkJCQkJCSU1CQkJCQkJCSU2CQkJCQklNworCQkJCTogInIiIChiaXRtYXBMaW5lKSwgInIiICgmRVBPQ19IV1BhbGV0dGVfMjU2X3RvX1NjcmVlblswXSksICJyIiAoc2NyZWVuTWVtb3J5KSwgInIiIChzb3VyY2VTY2FubGluZUxlbmd0aCksICJyIiAodGFyZ2V0U2NhbmxpbmVMZW5ndGgpLCAiciIgKHNvdXJjZVJlY3RIZWlnaHQpLCAiciIgKHNvdXJjZVJlY3RXaWR0aCksICJyIiAoc2tpcFZhbHVlKQorCQkJCTogInI0IiwgInI1IiwgInI2IiwgInI3IiwgInI4IgorCQkJKTsKKyNlbHNlCisJCQlmb3IoVEludCB5ID0gMCA7IHkgPCBzb3VyY2VSZWN0SGVpZ2h0IDsgeSsrKQorCQkJCXsKKwkJCQlUVWludDgqIGJpdG1hcFBvcyA9IGJpdG1hcExpbmU7IC8qIDEgYnl0ZSBwZXIgcGl4ZWwgKi8KKy8qCQkJCVRVaW50MTYqIHNjcmVlbk1lbW9yeUxpbmVQb3MgPSBzY3JlZW5NZW1vcnk7IC8qIDIgYnl0ZXMgcGVyIHBpeGVsICovCisJCQkJLyogQ29udmVydCBlYWNoIHBpeGVsIGZyb20gMjU2IHBhbGV0dGUgdG8gNGsgY29sb3IgdmFsdWVzICovCisvKgkJCQlmb3IgKFRJbnQgeCA9IDAgOyB4IDwgc291cmNlUmVjdFdpZHRoIDsgeCsrKQorCQkJCQl7CisJCQkJCS8vX19BU1NFUlRfREVCVUcoc2NyZWVuTWVtb3J5TGluZVBvcyA8IChzY3JlZW5CdWZmZXIgKyAoUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlXaWR0aCAqIFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pSGVpZ2h0KSksIFVzZXI6OlBhbmljKEtMaWJOYW1lLCBLRXJyQ29ycnVwdCkpOworCQkJCQkvL19fQVNTRVJUX0RFQlVHKHNjcmVlbk1lbW9yeUxpbmVQb3MgPj0gc2NyZWVuQnVmZmVyLCBVc2VyOjpQYW5pYyhLTGliTmFtZSwgS0VyckNvcnJ1cHQpKTsKKwkJCQkJLy9fX0FTU0VSVF9ERUJVRyhiaXRtYXBQb3MgPCAoKFRVaW50OCopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzICsgKF90aGlzLT5zY3JlZW4tPncgKiBfdGhpcy0+c2NyZWVuLT5oKSksIFVzZXI6OlBhbmljKEtMaWJOYW1lLCBLRXJyQ29ycnVwdCkpOworCQkJCQkvL19fQVNTRVJUX0RFQlVHKGJpdG1hcFBvcyA+PSAoVFVpbnQ4KilfdGhpcy0+c2NyZWVuLT5waXhlbHMsIFVzZXI6OlBhbmljKEtMaWJOYW1lLCBLRXJyQ29ycnVwdCkpOworICAgICAgICAgICAgCisJCQkJCSpzY3JlZW5NZW1vcnlMaW5lUG9zKysgPSBFUE9DX0hXUGFsZXR0ZV8yNTZfdG9fU2NyZWVuWypiaXRtYXBQb3NdOworCQkJCQliaXRtYXBQb3MgKz0gc2tpcFZhbHVlOworCQkJCQl9CisJCQkJYml0bWFwTGluZSArPSBzb3VyY2VTY2FubGluZUxlbmd0aDsKKwkJCQlzY3JlZW5NZW1vcnkgKz0gdGFyZ2V0U2NhbmxpbmVMZW5ndGg7CisJCQkJfQorLy8jZW5kaWYKKwkJCX0KKwkJfSAvLyBzd2l0Y2gKKwl9IC8vIGZvcgorfQorKi8KKwordm9pZCBEaXJlY3REcmF3Um90YXRlZChfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMsIFRVaW50MTYqIHNjcmVlbkJ1ZmZlcikKK3sKKwlUSW50IGk7CisvLyAgICBUSW50IHNvdXJjZU51bUJ5dGVzUGVyUGl4ZWwgPSAoKF90aGlzLT5zY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsLTEpPj4zKSArIDE7ICAgCisgICAgVFBvaW50IGZpeGVkU2NyZWVuT2Zmc2V0ID0gUHJpdmF0ZS0+RVBPQ19TY3JlZW5PZmZzZXQ7ICAgCisgICAgVEludCBidWZmZXJXID0gX3RoaXMtPnNjcmVlbi0+dzsKKyAgICBUSW50IGJ1ZmZlckggPSBfdGhpcy0+c2NyZWVuLT5oOworICAgIFRJbnQgU2NyZWVuVyA9IFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGg7CisvLyAgICBUSW50IFNjcmVlbkggPSBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaVdpZHRoOworICAgIFRJbnQgc291cmNlVyA9IGJ1ZmZlclc7CisgICAgVEludCBzb3VyY2VIID0gYnVmZmVySDsKKyAgICBUSW50IHRhcmdldFcgPSBTY3JlZW5XIC0gZml4ZWRTY3JlZW5PZmZzZXQuaVggKiAyOworLy8gICAgVEludCB0YXJnZXRIID0gU2NyZWVuSCAtIGZpeGVkU2NyZWVuT2Zmc2V0LmlZICogMjsKKwlUSW50IHNvdXJjZVNjYW5saW5lTGVuZ3RoID0gYnVmZmVyVzsKKyAgICBUSW50IHRhcmdldFNjYW5saW5lTGVuZ3RoID0gUHJpdmF0ZS0+RVBPQ19TY3JlZW5TaXplLmlXaWR0aDsKKworCS8qIFJlbmRlciB0aGUgcmVjdGFuZ2xlcyBpbiB0aGUgbGlzdCAqLworCisJZm9yICggaT0wOyBpIDwgbnVtcmVjdHM7ICsraSApIHsKKyAgICAgICAgU0RMX1JlY3QgcmVjdDI7CisgICAgICAgIGNvbnN0IFNETF9SZWN0JiBjdXJyZW50UmVjdCA9IHJlY3RzW2ldOworICAgICAgICByZWN0Mi54ID0gY3VycmVudFJlY3QueDsKKyAgICAgICAgcmVjdDIueSA9IGN1cnJlbnRSZWN0Lnk7CisgICAgICAgIHJlY3QyLncgPSBjdXJyZW50UmVjdC53OworICAgICAgICByZWN0Mi5oID0gY3VycmVudFJlY3QuaDsKKworICAgICAgICBpZiAocmVjdDIudyA8PSAwIHx8IHJlY3QyLmggPD0gMCkgLyogc2FuaXR5IGNoZWNrICovCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBBbGwgdmFyaWFibGVzIGFyZSBtZWFzdXJlZCBpbiBwaXhlbHMgKi8KKworICAgICAgICAvKiBDaGVjayByZWN0cyB2YWxpZGl0eSwgaS5lLiB1cHBlciBhbmQgbG93ZXIgYm91bmRzICovCisgICAgICAgIFRJbnQgbWF4WCA9IE1pbihzb3VyY2VXIC0gMSwgcmVjdDIueCArIHJlY3QyLncgLSAxKTsKKyAgICAgICAgVEludCBtYXhZID0gTWluKHNvdXJjZUggLSAxLCByZWN0Mi55ICsgcmVjdDIuaCAtIDEpOworICAgICAgICBpZiAobWF4WCA8IDAgfHwgbWF4WSA8IDApIC8qIHNhbml0eSBjaGVjayAqLworICAgICAgICAgICAgY29udGludWU7CisJCS8qIENsaXAgZnJvbSBib3R0b20gKi8KKyAgICAgICAgLy9tYXhYID0gTWluKG1heFgsIFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pSGVpZ2h0LTEpOyAKKwkJLyogVE9ETzogQ2xpcCBmcm9tIHRoZSByaWdodCBzaWRlICovCisKKyAgICAgICAgVEludCBzb3VyY2VSZWN0V2lkdGggPSBtYXhYIC0gcmVjdDIueCArIDE7CisvLyAgICAgICAgVEludCBzb3VyY2VSZWN0V2lkdGhJbkJ5dGVzID0gc291cmNlUmVjdFdpZHRoICogc291cmNlTnVtQnl0ZXNQZXJQaXhlbDsKKyAgICAgICAgVEludCBzb3VyY2VSZWN0SGVpZ2h0ID0gbWF4WSAtIHJlY3QyLnkgKyAxOworICAgICAgICBUSW50IHNvdXJjZVN0YXJ0T2Zmc2V0ID0gcmVjdDIueCArIHJlY3QyLnkgKiBzb3VyY2VTY2FubGluZUxlbmd0aDsKKyAgICAgICAgVEludCB0YXJnZXRTdGFydE9mZnNldCA9IGZpeGVkU2NyZWVuT2Zmc2V0LmlYICsgKHRhcmdldFctMSAtIHJlY3QyLnkpICsgKGZpeGVkU2NyZWVuT2Zmc2V0LmlZICtyZWN0Mi54KSAqIHRhcmdldFNjYW5saW5lTGVuZ3RoOyAgIAorICAgICAgICAKKyAgICAgICAgLy8gTm9raWE3NjUwIG5hdGl2ZSBtb2RlOiAxMiBicHAgLS0+IDEyIGJwcAorICAgICAgICBpZiAoX3RoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gMTIpIHsgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qICEhVE9ETzogbm90IHlldCBpbXBsZW1lbnRlZAorCisJICAgICAgICBUVWludDE2KiBiaXRtYXBMaW5lID0gKFRVaW50MTYqKV90aGlzLT5zY3JlZW4tPnBpeGVscyArIHNvdXJjZVN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgVFVpbnQxNiogc2NyZWVuTWVtb3J5ID0gc2NyZWVuQnVmZmVyICsgdGFyZ2V0U3RhcnRPZmZzZXQ7CisgICAgICAgICAgICBmb3IoVEludCB5ID0gMCA7IHkgPCBzb3VyY2VSZWN0SGVpZ2h0IDsgeSsrKSB7CisJCQkJLy9UT0RPOiBvcHRpbWl6ZTogc2VwYXJhdGUgbG9vcHMgZm9yIDEsIDIgYW5kIG4gc2tpcAorCQkgICAgICAgIC8vTWVtOjpDb3B5KHNjcmVlbk1lbW9yeSwgYml0bWFwTGluZSwgc291cmNlUmVjdFdpZHRoSW5CeXRlcyk7CisgICAgICAgICAgICAgICAgVFVpbnQxNiogYml0bWFwUG9zID0gYml0bWFwTGluZTsgLy8gMiBieXRlcyBwZXIgcGl4ZWwgCisgICAgICAgICAgICAgICAgVFVpbnQxNiogc2NyZWVuTWVtb3J5TGluZVBvcyA9IHNjcmVlbk1lbW9yeTsgLy8gMiBieXRlcyBwZXIgcGl4ZWwgCisJCQkJZm9yKFRJbnQgeCA9IDAgOyB4IDwgc291cmNlUmVjdFdpZHRoIDsgeCsrKSB7CisKKwkJCQkJX19BU1NFUlRfREVCVUcoc2NyZWVuTWVtb3J5IDwgKHNjcmVlbkJ1ZmZlciArIFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGggKiBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaUhlaWdodCksIFVzZXI6OlBhbmljKEtMaWJOYW1lLCBLRXJyQ29ycnVwdCkpOworCQkJCQlfX0FTU0VSVF9ERUJVRyhzY3JlZW5NZW1vcnkgPj0gc2NyZWVuQnVmZmVyLCBVc2VyOjpQYW5pYyhLTGliTmFtZSwgS0VyckNvcnJ1cHQpKTsKKwkJCQkJX19BU1NFUlRfREVCVUcoYml0bWFwTGluZSA8ICgoVFVpbnQxNiopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzICsgKF90aGlzLT5zY3JlZW4tPncgKiBfdGhpcy0+c2NyZWVuLT5oKSksIFVzZXI6OlBhbmljKEtMaWJOYW1lLCBLRXJyQ29ycnVwdCkpOworCQkJCQlfX0FTU0VSVF9ERUJVRyhiaXRtYXBMaW5lID49ICAoVFVpbnQxNiopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzLCBVc2VyOjpQYW5pYyhLTGliTmFtZSwgS0VyckNvcnJ1cHQpKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgKnNjcmVlbk1lbW9yeUxpbmVQb3MgPSAqYml0bWFwUG9zOworICAgICAgICAgICAgICAgICAgICBiaXRtYXBQb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgc2NyZWVuTWVtb3J5TGluZVBvcyArPSB0YXJnZXRTY2FubGluZUxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisJCSAgICAgICAgYml0bWFwTGluZSArPSBzb3VyY2VTY2FubGluZUxlbmd0aDsKKwkJICAgICAgICBzY3JlZW5NZW1vcnktLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKi8KKyAgICAgICAgfQorICAgICAgICAvLyAyNTYgY29sb3IgcGFsZXR0ZWQgbW9kZTogOCBicHAgIC0tPiAxMiBicHAKKyAgICAgICAgZWxzZSB7IAorCSAgICAgICAgVFVpbnQ4KiBiaXRtYXBMaW5lID0gKFRVaW50OCopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzICsgc291cmNlU3RhcnRPZmZzZXQ7CisgICAgICAgICAgICBUVWludDE2KiBzY3JlZW5NZW1vcnkgPSBzY3JlZW5CdWZmZXIgKyB0YXJnZXRTdGFydE9mZnNldDsKKwkJCVRJbnQgc2NyZWVuWFNjYWxlVmFsdWUgPSBQcml2YXRlLT5FUE9DX1NjcmVlblhTY2FsZVZhbHVlOworCQkJVEludCBkZWJ1Z195Y291bnQ9MDsKKyAgICAgICAgICAgIGZvcihUSW50IHkgPSAwIDsgeSA8IHNvdXJjZVJlY3RIZWlnaHQgOyB5KyspIHsKKwkJCQlpZigtLXNjcmVlblhTY2FsZVZhbHVlKSB7CisJCQkJCVRVaW50OCogYml0bWFwUG9zID0gYml0bWFwTGluZTsgLyogMSBieXRlIHBlciBwaXhlbCAqLworCQkJCQlUVWludDE2KiBzY3JlZW5NZW1vcnlMaW5lUG9zID0gc2NyZWVuTWVtb3J5OyAvKiAyIGJ5dGVzIHBlciBwaXhlbCAqLworCQkJCQlUSW50IHNjcmVlbllTY2FsZVZhbHVlID0gUHJpdmF0ZS0+RVBPQ19TY3JlZW5ZU2NhbGVWYWx1ZTsKKwkJCQkJVEludCBkZWJ1Z194Y291bnQ9MDsKKwkJCQkJLyogQ29udmVydCBlYWNoIHBpeGVsIGZyb20gMjU2IHBhbGV0dGUgdG8gNGsgY29sb3IgdmFsdWVzICovCisJCQkJCWZvcihUSW50IHggPSAwIDsgeCA8IHNvdXJjZVJlY3RXaWR0aCA7IHgrKykgeworCQkJCQkJaWYoLS1zY3JlZW5ZU2NhbGVWYWx1ZSkgeworCQkJCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVNTRVJUX0RFQlVHKHNjcmVlbk1lbW9yeUxpbmVQb3MgPCAoc2NyZWVuQnVmZmVyICsgKFByaXZhdGUtPkVQT0NfU2NyZWVuU2l6ZS5pV2lkdGggKiBQcml2YXRlLT5FUE9DX1NjcmVlblNpemUuaUhlaWdodCkpLCBVc2VyOjpQYW5pYyhLTGliTmFtZSwgS0VyckNvcnJ1cHQpKTsKKwkJCQkJCQlfX0FTU0VSVF9ERUJVRyhzY3JlZW5NZW1vcnlMaW5lUG9zID49IHNjcmVlbkJ1ZmZlciwgVXNlcjo6UGFuaWMoS0xpYk5hbWUsIEtFcnJDb3JydXB0KSk7CisJCQkJCQkJX19BU1NFUlRfREVCVUcoYml0bWFwUG9zIDwgKChUVWludDgqKV90aGlzLT5zY3JlZW4tPnBpeGVscyArIChfdGhpcy0+c2NyZWVuLT53ICogX3RoaXMtPnNjcmVlbi0+aCkpLCBVc2VyOjpQYW5pYyhLTGliTmFtZSwgS0VyckNvcnJ1cHQpKTsKKwkJCQkJCQlfX0FTU0VSVF9ERUJVRyhiaXRtYXBQb3MgPj0gKFRVaW50OCopX3RoaXMtPnNjcmVlbi0+cGl4ZWxzLCBVc2VyOjpQYW5pYyhLTGliTmFtZSwgS0VyckNvcnJ1cHQpKTsKKwkJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2NyZWVuTWVtb3J5TGluZVBvcyA9IFRVaW50MTYoRVBPQ19IV1BhbGV0dGVfMjU2X3RvX1NjcmVlblsqYml0bWFwUG9zXSk7CisJCQkJCQkJc2NyZWVuTWVtb3J5TGluZVBvcyArPSB0YXJnZXRTY2FubGluZUxlbmd0aDsgZGVidWdfeGNvdW50Kys7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJc2NyZWVuWVNjYWxlVmFsdWUgPSBQcml2YXRlLT5FUE9DX1NjcmVlbllTY2FsZVZhbHVlOworCQkJCQkJYml0bWFwUG9zKys7IAorCQkJCQl9CisJCQkJCXNjcmVlbk1lbW9yeS0tOyBkZWJ1Z195Y291bnQrKzsKKwkJCQl9IC8vIGVuZGlmCisJCQkJZWxzZQorCQkJCQlzY3JlZW5YU2NhbGVWYWx1ZSA9IFByaXZhdGUtPkVQT0NfU2NyZWVuWFNjYWxlVmFsdWU7CisJCQkJYml0bWFwTGluZSArPSBzb3VyY2VTY2FubGluZUxlbmd0aDsKKyAgICAgICAgICAgICB9CisJICAgIH0KKyAgICB9ICAgIAorfQorCisKKy8qIE5vdGU6ICBJZiB3ZSBhcmUgdGVybWluYXRlZCwgdGhpcyBjb3VsZCBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZgorICAgYW5vdGhlciBTREwgdmlkZW8gcm91dGluZSAtLSBub3RhYmx5IFVwZGF0ZVJlY3RzLgorKi8KK3ZvaWQgRVBPQ19WaWRlb1F1aXQoX1RISVMpCit7CisJaW50IGk7CisKKwkvKiBGcmVlIHZpZGVvIG1vZGUgbGlzdHMgKi8KKwlmb3IgKCBpPTA7IGk8U0RMX05VTU1PREVTOyArK2kgKSB7CisJCWlmICggUHJpdmF0ZS0+U0RMX21vZGVsaXN0W2ldICE9IE5VTEwgKSB7CisJCQlmcmVlKFByaXZhdGUtPlNETF9tb2RlbGlzdFtpXSk7CisJCQlQcml2YXRlLT5TRExfbW9kZWxpc3RbaV0gPSBOVUxMOworCQl9CisJfQorCQorICAgIGlmICggX3RoaXMtPnNjcmVlbiAmJiAoX3RoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSApIHsKKwkJLyogRGlyZWN0IHNjcmVlbiBhY2Nlc3MsIG5vIG1lbW9yeSBidWZmZXIgKi8KKwkJX3RoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsKKwl9CisKKyAgICBpZiAoX3RoaXMtPnNjcmVlbiAmJiBfdGhpcy0+c2NyZWVuLT5waXhlbHMpIHsKKyAgICAgICAgZnJlZShfdGhpcy0+c2NyZWVuLT5waXhlbHMpOworICAgICAgICBfdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOworICAgIH0KKworICAgIC8qIEZyZWUgRXBvYyByZXNvdXJjZXMgKi8KKworICAgIC8qIERpc2FibGUgZXZlbnRzIGZvciBtZSAqLworCWlmIChQcml2YXRlLT5FUE9DX1dzRXZlbnRTdGF0dXMgIT0gS1JlcXVlc3RQZW5kaW5nKQorCQlQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5FdmVudFJlYWR5Q2FuY2VsKCk7CisJaWYgKFByaXZhdGUtPkVQT0NfUmVkcmF3RXZlbnRTdGF0dXMgIT0gS1JlcXVlc3RQZW5kaW5nKQorCQlQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5SZWRyYXdSZWFkeUNhbmNlbCgpOworCisJI2lmIGRlZmluZWQoX19XSU5TX18pIHx8IGRlZmluZWQoVEVTVF9CTV9EUkFXKQorCWRlbGV0ZSBQcml2YXRlLT5FUE9DX0JpdG1hcDsKKwlQcml2YXRlLT5FUE9DX0JpdG1hcCA9IE5VTEw7CisJI2Vsc2UKKyAgICAjZW5kaWYKKworI2lmbmRlZiBTWU1CSUFOX0NSWVNUQUwKKwlmcmVlKFByaXZhdGUtPkVQT0NfRHJhd0RldmljZSk7CisjZW5kaWYKKworCWlmIChQcml2YXRlLT5FUE9DX1dzV2luZG93LldzSGFuZGxlKCkpCisJCVByaXZhdGUtPkVQT0NfV3NXaW5kb3cuQ2xvc2UoKTsKKworCWlmIChQcml2YXRlLT5FUE9DX1dzV2luZG93R3JvdXAuV3NIYW5kbGUoKSkKKwkJUHJpdmF0ZS0+RVBPQ19Xc1dpbmRvd0dyb3VwLkNsb3NlKCk7CisKKwlkZWxldGUgUHJpdmF0ZS0+RVBPQ19XaW5kb3dHYzsKKwlQcml2YXRlLT5FUE9DX1dpbmRvd0djID0gTlVMTDsKKworCWRlbGV0ZSBQcml2YXRlLT5FUE9DX1dzU2NyZWVuOworCVByaXZhdGUtPkVQT0NfV3NTY3JlZW4gPSBOVUxMOworCisJaWYgKFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLldzSGFuZGxlKCkpCisJCVByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLkNsb3NlKCk7Cit9CisKKworV01jdXJzb3IgKkVQT0NfQ3JlYXRlV01DdXJzb3IoX1RISVMsIFVpbnQ4KiAvKmRhdGEqLywgVWludDgqIC8qbWFzayovLCBpbnQgLyp3Ki8sIGludCAvKmgqLywgaW50IC8qaG90X3gqLywgaW50IC8qaG90X3kqLykKK3sKKwlyZXR1cm4gKFdNY3Vyc29yICopIDkyMTA7IC8vIGl0J3Mgb2sgdG8gcmV0dXJuIHNvbWV0aGluZyB1bnVzZWZ1bCBidXQgdHJ1ZQorfQorCit2b2lkIEVQT0NfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciogLypjdXJzb3IqLykKK3sKKyAgICAvKiBEaXNhYmxlIHZpcnR1YWwgY3Vyc29yICovCisgICAgSEFMOjpTZXQoSEFMOjpFTW91c2VTdGF0ZSwgSEFMOjpFTW91c2VTdGF0ZV9JbnZpc2libGUpOworICAgIFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlNldFBvaW50ZXJDdXJzb3JNb2RlKEVQb2ludGVyQ3Vyc29yTm9uZSk7Cit9CisKK2ludCBFUE9DX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKK3sKKworICAgIGlmIChjdXJzb3IgPT0gIChXTWN1cnNvciAqKTkyMTApIHsKKyAgICAgICAgLyogRW5hYmxlIHZpcnR1YWwgY3Vyc29yICovCisJICAgIFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlNldFBvaW50ZXJDdXJzb3JNb2RlKEVQb2ludGVyQ3Vyc29yTm9ybWFsKTsKKyAgICAgICAgaWYgKGlzQ3Vyc29yVmlzaWJsZSkKKwkgICAgICAgIEhBTDo6U2V0KEhBTDo6RU1vdXNlU3RhdGUsIEhBTDo6RU1vdXNlU3RhdGVfVmlzaWJsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFByaXZhdGUtPkVQT0NfV3NTZXNzaW9uLlNldFBvaW50ZXJDdXJzb3JNb2RlKEVQb2ludGVyQ3Vyc29yTm9uZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBEaXNhYmxlIHZpcnR1YWwgY3Vyc29yICovCisgICAgICAgIEhBTDo6U2V0KEhBTDo6RU1vdXNlU3RhdGUsIEhBTDo6RU1vdXNlU3RhdGVfSW52aXNpYmxlKTsKKyAgICAgICAgUHJpdmF0ZS0+RVBPQ19Xc1Nlc3Npb24uU2V0UG9pbnRlckN1cnNvck1vZGUoRVBvaW50ZXJDdXJzb3JOb25lKTsKKyAgICB9CisKKwlyZXR1cm4oMSk7Cit9CisKK307IC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0ExL1NETF9lcG9jdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0ExL1NETF9lcG9jdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDBiMGUyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTEvU0RMX2Vwb2N2aWRlby5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGRldm9sdXRpb24uY29tCisqLworCisjaWZuZGVmIF9TRExfZXBvY3ZpZGVvX2gKKyNkZWZpbmUgX1NETF9lcG9jdmlkZW9faAorCisjaWZuZGVmIEVLQTIKKyNpbmNsdWRlIlNETF9lcG9jdmlkZW9fb3JnLmgiCisjZWxzZQorI2luY2x1ZGUiU0RMX2Vwb2N2aWRlbzIuaCIKKyNlbmRpZgorCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N5bWJpYW4vRUtBMi9TRExfZXBvY2V2ZW50cy5jcHAgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N5bWJpYW4vRUtBMi9TRExfZXBvY2V2ZW50cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1MmRhZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0EyL1NETF9lcG9jZXZlbnRzLmNwcApAQCAtMCwwICsxLDUyMSBAQAorI2luY2x1ZGUgImVwb2Nfc2RsLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI3VuZGVmIE5VTEwKK2V4dGVybiAiQyIgeworLy8jZGVmaW5lIERFQlVHX1RSQUNFX0VOQUJMRUQKKyNpbmNsdWRlICJTRExfZXJyb3IuaCIKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfa2V5c3ltLmgiCisjaW5jbHVkZSAiU0RMX2tleWJvYXJkLmgiCisjaW5jbHVkZSAiU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCit9IC8qIGV4dGVybiAiQyIgKi8KKworI2luY2x1ZGUgIlNETF9lcG9jdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfZXBvY2V2ZW50c19jLmgiCisKKyNpbmNsdWRlICJzZGxlcG9jYXBpLmgiCisKKyNpbmNsdWRlIDxlaWtlbnYuaD4KKworI2luY2x1ZGU8YmF1dGlscy5oPgorCisKK2V4dGVybiAiQyIKKwl7CisJc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShfVEhJUywgaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0pOworCX0KKworLy9leHRlcm4gIkMiIHsKKy8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZXMgZnJvbSBhIGNvbnNvbGUgc2NhbmNvZGUgdG8gYSBTREwga2V5c3ltICovCitzdGF0aWMgU0RMS2V5IGtleW1hcFtNQVhfU0NBTkNPREVdOworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShfVEhJUywgaW50IHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0pOwordm9pZCBEaXNhYmxlS2V5QmxvY2tpbmcoX1RISVMpOworLy99IC8qIGV4dGVybiAiQyIgKi8KKworU0RMS2V5KiBLZXlNYXAoKQorCXsKKwlyZXR1cm4ga2V5bWFwOworCX0KKwkKK1RCb29sIGlzQ3Vyc29yVmlzaWJsZSA9IEVGYWxzZTsKKwordm9pZCBSZXNldEtleU1hcCgpCisJeworCWludCBpOworCisJLyogSW5pdGlhbGl6ZSB0aGUga2V5IHRyYW5zbGF0aW9uIHRhYmxlICovCisJZm9yICggaT0wOyBpPFNETF9UQUJMRVNJWkUoa2V5bWFwKTsgKytpICkKKwkJa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOworCisKKwkvKiBOdW1iZXJzICovCisJZm9yICggaSA9IDA7IGk8MzI7ICsraSApeworCQlrZXltYXBbJyAnICsgaV0gPSAoU0RMS2V5KShTRExLX1NQQUNFK2kpOworCX0KKwkvKiBlLmcuIEFscGhhYmV0IGtleXMgKi8KKwlmb3IgKCBpID0gMDsgaTwzMjsgKytpICl7CisJCWtleW1hcFsnQScgKyBpXSA9IChTRExLZXkpKFNETEtfYStpKTsKKwl9CisKKwlrZXltYXBbRVN0ZEtleUJhY2tzcGFjZV0gICAgPSBTRExLX0JBQ0tTUEFDRTsKKwlrZXltYXBbRVN0ZEtleVRhYl0gICAgICAgICAgPSBTRExLX1RBQjsKKwlrZXltYXBbRVN0ZEtleUVudGVyXSAgICAgICAgPSBTRExLX1JFVFVSTjsKKwlrZXltYXBbRVN0ZEtleUVzY2FwZV0gICAgICAgPSBTRExLX0VTQ0FQRTsKKyAgIAlrZXltYXBbRVN0ZEtleVNwYWNlXSAgICAgICAgPSBTRExLX1NQQUNFOworICAgCWtleW1hcFtFU3RkS2V5UGF1c2VdICAgICAgICA9IFNETEtfUEFVU0U7CisgICAJa2V5bWFwW0VTdGRLZXlIb21lXSAgICAgICAgID0gU0RMS19IT01FOworICAgCWtleW1hcFtFU3RkS2V5RW5kXSAgICAgICAgICA9IFNETEtfRU5EOworICAgCWtleW1hcFtFU3RkS2V5UGFnZVVwXSAgICAgICA9IFNETEtfUEFHRVVQOworICAgCWtleW1hcFtFU3RkS2V5UGFnZURvd25dICAgICA9IFNETEtfUEFHRURPV047CisJa2V5bWFwW0VTdGRLZXlEZWxldGVdICAgICAgID0gU0RMS19ERUxFVEU7CisJa2V5bWFwW0VTdGRLZXlVcEFycm93XSAgICAgID0gU0RMS19VUDsKKwlrZXltYXBbRVN0ZEtleURvd25BcnJvd10gICAgPSBTRExLX0RPV047CisJa2V5bWFwW0VTdGRLZXlMZWZ0QXJyb3ddICAgID0gU0RMS19MRUZUOworCWtleW1hcFtFU3RkS2V5UmlnaHRBcnJvd10gICA9IFNETEtfUklHSFQ7CisJa2V5bWFwW0VTdGRLZXlDYXBzTG9ja10gICAgID0gU0RMS19DQVBTTE9DSzsKKwlrZXltYXBbRVN0ZEtleUxlZnRTaGlmdF0gICAgPSBTRExLX0xTSElGVDsKKwlrZXltYXBbRVN0ZEtleVJpZ2h0U2hpZnRdICAgPSBTRExLX1JTSElGVDsKKwlrZXltYXBbRVN0ZEtleUxlZnRBbHRdICAgICAgPSBTRExLX0xBTFQ7CisJa2V5bWFwW0VTdGRLZXlSaWdodEFsdF0gICAgID0gU0RMS19SQUxUOworCWtleW1hcFtFU3RkS2V5TGVmdEN0cmxdICAgICA9IFNETEtfTENUUkw7CisJa2V5bWFwW0VTdGRLZXlSaWdodEN0cmxdICAgID0gU0RMS19SQ1RSTDsKKwlrZXltYXBbRVN0ZEtleUxlZnRGdW5jXSAgICAgPSBTRExLX0xNRVRBOworCWtleW1hcFtFU3RkS2V5UmlnaHRGdW5jXSAgICA9IFNETEtfUk1FVEE7CisJa2V5bWFwW0VTdGRLZXlJbnNlcnRdICAgICAgID0gU0RMS19JTlNFUlQ7CisJa2V5bWFwW0VTdGRLZXlDb21tYV0gICAgICAgID0gU0RMS19DT01NQTsKKwlrZXltYXBbRVN0ZEtleUZ1bGxTdG9wXSAgICAgPSBTRExLX1BFUklPRDsKKwlrZXltYXBbRVN0ZEtleUZvcndhcmRTbGFzaF0gPSBTRExLX1NMQVNIOworCWtleW1hcFtFU3RkS2V5QmFja1NsYXNoXSAgICA9IFNETEtfQkFDS1NMQVNIOworCWtleW1hcFtFU3RkS2V5U2VtaUNvbG9uXSAgICA9IFNETEtfU0VNSUNPTE9OOworCWtleW1hcFtFU3RkS2V5U2luZ2xlUXVvdGVdICA9IFNETEtfUVVPVEU7CisJa2V5bWFwW0VTdGRLZXlIYXNoXSAgICAgICAgID0gU0RMS19IQVNIOworCWtleW1hcFtFU3RkS2V5U3F1YXJlQnJhY2tldExlZnRdICAgID0gU0RMS19MRUZUQlJBQ0tFVDsKKwlrZXltYXBbRVN0ZEtleVNxdWFyZUJyYWNrZXRSaWdodF0gICA9IFNETEtfUklHSFRCUkFDS0VUOworCWtleW1hcFtFU3RkS2V5TWludXNdICAgICAgICA9IFNETEtfTUlOVVM7CisJa2V5bWFwW0VTdGRLZXlFcXVhbHNdICAgICAgID0gU0RMS19FUVVBTFM7CisKKyAgIAlrZXltYXBbRVN0ZEtleUYxXSAgICAgICAgICA9IFNETEtfRjE7ICAKKyAgIAlrZXltYXBbRVN0ZEtleUYyXSAgICAgICAgICA9IFNETEtfRjI7ICAKKyAgIAlrZXltYXBbRVN0ZEtleUYzXSAgICAgICAgICA9IFNETEtfRjM7ICAKKyAgIAlrZXltYXBbRVN0ZEtleUY0XSAgICAgICAgICA9IFNETEtfRjQ7IAorICAgCWtleW1hcFtFU3RkS2V5RjVdICAgICAgICAgID0gU0RMS19GNTsgIAorICAgCWtleW1hcFtFU3RkS2V5RjZdICAgICAgICAgID0gU0RMS19GNjsgIAorICAgCWtleW1hcFtFU3RkS2V5RjddICAgICAgICAgID0gU0RMS19GNzsgIAorICAgCWtleW1hcFtFU3RkS2V5RjhdICAgICAgICAgID0gU0RMS19GODsgIAorCisgICAJa2V5bWFwW0VTdGRLZXlGOV0gICAgICAgICAgPSBTRExLX0Y5OyAgCisgICAJa2V5bWFwW0VTdGRLZXlGMTBdICAgICAgICAgPSBTRExLX0YxMDsgCisgICAJa2V5bWFwW0VTdGRLZXlGMTFdICAgICAgICAgPSBTRExLX0YxMTsgCisgICAJa2V5bWFwW0VTdGRLZXlGMTJdICAgICAgICAgPSBTRExLX0YxMjsgCisKKworICAgCWtleW1hcFtFU3RkS2V5WFhYXSAgICAgICAgID0gU0RMS19SRVRVUk47CS8qICJmaXJlIiBrZXkgKi8KKworICAgCWtleW1hcFtFU3RkS2V5RGV2aWNlM10gICAgID0gU0RMS19SRVRVUk47CS8qICJmaXJlIiBrZXkgKi8KKyAgIAlrZXltYXBbRVN0ZEtleU5rcEFzdGVyaXNrXSA9IFNETEtfQVNURVJJU0s7IAorICAgCWtleW1hcFtFU3RkS2V5WWVzXSAgICAgICAgID0gU0RMS19IT01FOwkJLyogImNhbGwiIGtleSAqLworICAgCWtleW1hcFtFU3RkS2V5Tm9dCQkgICA9IFNETEtfRU5EOwkJLyogImVuZCBjYWxsIiBrZXkgKi8KKyAgIAlrZXltYXBbRVN0ZEtleURldmljZTBdICAgICA9IFNETEtfU1BBQ0U7CS8qIHJpZ2h0IG1lbnUga2V5ICovCisgICAJa2V5bWFwW0VTdGRLZXlEZXZpY2UxXSAgICAgPSBTRExLX0VTQ0FQRTsJLyogbGVmdCBtZW51IGtleSAqLworICAgCWtleW1hcFtFU3RkS2V5RGV2aWNlMl0gICAgID0gU0RMS19QT1dFUjsJLyogcG93ZXIga2V5ICovCisKKyAgICBrZXltYXBbRVN0ZEtleU1lbnVdICAgICAgICA9IFNETEtfTUVOVTsgICAJLy8gbWVudSBrZXkKKyAgICBrZXltYXBbRVN0ZEtleURldmljZTZdICAgICA9IFNETEtfTEVGVDsgICAgIC8vIFJvY2tlciAoam95c3RpY2spIGxlZnQKKyAgICBrZXltYXBbRVN0ZEtleURldmljZTddICAgICA9IFNETEtfUklHSFQ7ICAgIC8vIFJvY2tlciAoam95c3RpY2spIHJpZ2h0CisgICAga2V5bWFwW0VTdGRLZXlEZXZpY2U4XSAgICAgPSBTRExLX1VQOyAgICAgICAvLyBSb2NrZXIgKGpveXN0aWNrKSB1cAorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlOV0gICAgID0gU0RMS19ET1dOOyAgICAgLy8gUm9ja2VyIChqb3lzdGljaykgZG93bgorICAgIGtleW1hcFtFU3RkS2V5TGVmdEZ1bmNdICAgICA9IFNETEtfTEFMVDsgICAgLy9jaHI/CisJa2V5bWFwW0VTdGRLZXlSaWdodEZ1bmNdICAgID0gU0RMS19SQUxUOworICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlQV0gICAgICA9IFNETEtfUkVUVVJOOwkvKiAiZmlyZSIga2V5ICovCisgICAgCisgICAgCisgICAgCisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLyoKKyAgICBSRnMgZnM7CisgICAgaWYoS0Vyck5vbmUgPT0gZnMuQ29ubmVjdCgpKQorICAgICAgICB7CisgICAgICAgIFJBcnJheTxUSW50PiBhcnJheTsKKyAgICAgICAgVFJBUEQoZXJyLCBSZWFkTChmcywgYXJyYXkpKTsKKyAgICAgICAgaWYoZXJyID09IEtFcnJOb25lICYmIGFycmF5LkNvdW50KCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICBTRExLZXkgdGVtcFtNQVhfU0NBTkNPREVdOworICAgICAgICAgICAgTWVtOjpDb3B5KHRlbXAsIGtleW1hcCwgTUFYX1NDQU5DT0RFICogc2l6ZW9mKFNETEtleSkpOworCisgICAgICAgICAgICBmb3IoVEludCBrID0gMDsgayA8IGFycmF5LkNvdW50KCk7IGsrPSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBUSW50IG9sZHZhbCA9IGFycmF5W2tdOyAKKyAgICAgICAgICAgICAgICBjb25zdCBUSW50IG5ld3ZhbCA9IGFycmF5W2sgKyAxXTsgCisgICAgICAgICAgICAgICAgaWYob2xkdmFsID49ICAwICYmIG9sZHZhbCA8IE1BWF9TQ0FOQ09ERSAmJiBuZXd2YWwgPj0gIDAgJiYgbmV3dmFsIDwgTUFYX1NDQU5DT0RFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleW1hcFtvbGR2YWxdID0gdGVtcFtuZXd2YWxdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBhcnJheS5DbG9zZSgpOworICAgICAgICB9CisKKyAgICBmcy5DbG9zZSgpOyovCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIAorCWtleW1hcFtFU3RkS2V5TnVtTG9ja10gPSBTRExLX05VTUxPQ0s7CisJa2V5bWFwW0VTdGRLZXlTY3JvbGxMb2NrXSA9IFNETEtfU0NST0xMT0NLOworCQorCWtleW1hcFtFU3RkS2V5TmtwRm9yd2FyZFNsYXNoXSA9IFNETEtfS1BfRElWSURFOworCWtleW1hcFtFU3RkS2V5TmtwQXN0ZXJpc2tdID0gU0RMS19LUF9NVUxUSVBMWTsKKwlrZXltYXBbRVN0ZEtleU5rcE1pbnVzXSA9IFNETEtfS1BfTUlOVVM7CisJa2V5bWFwW0VTdGRLZXlOa3BQbHVzXSA9IFNETEtfS1BfUExVUzsKKwlrZXltYXBbRVN0ZEtleU5rcEVudGVyXSA9IFNETEtfS1BfRU5URVI7CisJa2V5bWFwW0VTdGRLZXlOa3AxXSA9IFNETEtfS1AxOworCWtleW1hcFtFU3RkS2V5TmtwMl0gPSBTRExLX0tQMjsKKwlrZXltYXBbRVN0ZEtleU5rcDNdID0gU0RMS19LUDM7CisJa2V5bWFwW0VTdGRLZXlOa3A0XSA9IFNETEtfS1A0OworCWtleW1hcFtFU3RkS2V5TmtwNV0gPSBTRExLX0tQNTsKKwlrZXltYXBbRVN0ZEtleU5rcDZdID0gU0RMS19LUDY7CisJa2V5bWFwW0VTdGRLZXlOa3A3XSA9IFNETEtfS1A3OworCWtleW1hcFtFU3RkS2V5TmtwOF0gPSBTRExLX0tQODsKKwlrZXltYXBbRVN0ZEtleU5rcDldID0gU0RMS19LUDk7CisJa2V5bWFwW0VTdGRLZXlOa3AwXSA9IFNETEtfS1AwOworCWtleW1hcFtFU3RkS2V5TmtwRnVsbFN0b3BdID0gU0RMS19LUF9QRVJJT0Q7CisgICAgLyoKKyAgICBrZXltYXBbRVN0ZEtleU1lbnVdID0gU0RMS19NRU5VOyBzaG91bGQgYmUsIGJ1dCBub3QgeWV0CisgICAga2V5bWFwW0VTdGRLZXlCYWNrbGlnaHRPbl0gPQorICAgIGtleW1hcFtFU3RkS2V5QmFja2xpZ2h0T2ZmXSA9CisgICAga2V5bWFwW0VTdGRLZXlCYWNrbGlnaHRUb2dnbGVdID0KKyAgICBrZXltYXBbRVN0ZEtleUluY0NvbnRyYXN0XSA9CisgICAga2V5bWFwW0VTdGRLZXlEZWNDb250cmFzdF0gPQorICAgIGtleW1hcFtFU3RkS2V5U2xpZGVyRG93bl0gPQorICAgIGtleW1hcFtFU3RkS2V5U2xpZGVyVXBdID0KKyAgICBrZXltYXBbRVN0ZEtleURpY3RhcGhvbmVQbGF5XSA9CisgICAga2V5bWFwW0VTdGRLZXlEaWN0YXBob25lU3RvcF0gPQorICAgIGtleW1hcFtFU3RkS2V5RGljdGFwaG9uZVJlY29yZF0gPQorICAgIGtleW1hcFtFU3RkS2V5SGVscF0gPQorICAgIGtleW1hcFtFU3RkS2V5T2ZmXSA9CisgICAga2V5bWFwW0VTdGRLZXlEaWFsXSA9CisgICAga2V5bWFwW0VTdGRLZXlJbmNWb2x1bWVdID0KKyAgICBrZXltYXBbRVN0ZEtleURlY1ZvbHVtZV0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlMF0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlMV0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlMl0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlM10gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlNF0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlNV0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlNl0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlN10gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlOF0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlOV0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlQV0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlQl0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlQ10gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlRF0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlRV0gPQorICAgIGtleW1hcFtFU3RkS2V5RGV2aWNlRl0gPQorICAgIGtleW1hcFtFU3RkS2V5QXBwbGljYXRpb24wXSA9CisgICAga2V5bWFwW0VTdGRLZXlBcHBsaWNhdGlvbjFdID0KKyAgICBrZXltYXBbRVN0ZEtleUFwcGxpY2F0aW9uMl0gPQorICAgIGtleW1hcFtFU3RkS2V5QXBwbGljYXRpb24zXSA9CisgICAga2V5bWFwW0VTdGRLZXlBcHBsaWNhdGlvbjRdID0KKyAgICBrZXltYXBbRVN0ZEtleUFwcGxpY2F0aW9uNV0gPQorICAgIGtleW1hcFtFU3RkS2V5QXBwbGljYXRpb242XSA9CisgICAga2V5bWFwW0VTdGRLZXlBcHBsaWNhdGlvbjddID0KKyAgICBrZXltYXBbRVN0ZEtleUFwcGxpY2F0aW9uOF0gPQorICAgIGtleW1hcFtFU3RkS2V5QXBwbGljYXRpb245XSA9CisgICAga2V5bWFwW0VTdGRLZXlBcHBsaWNhdGlvbkFdID0KKyAgICBrZXltYXBbRVN0ZEtleUFwcGxpY2F0aW9uQl0gPQorICAgIGtleW1hcFtFU3RkS2V5QXBwbGljYXRpb25DXSA9CisgICAga2V5bWFwW0VTdGRLZXlBcHBsaWNhdGlvbkRdID0KKyAgICBrZXltYXBbRVN0ZEtleUFwcGxpY2F0aW9uRV0gPQorICAgIGtleW1hcFtFU3RkS2V5QXBwbGljYXRpb25GXSA9CisgICAga2V5bWFwW0VTdGRLZXlZZXNdID0KKyAgICBrZXltYXBbRVN0ZEtleU5vXSA9CisgICAga2V5bWFwW0VTdGRLZXlJbmNCcmlnaHRuZXNzXSA9CisgICAga2V5bWFwW0VTdGRLZXlEZWNCcmlnaHRuZXNzXSA9IAorICAgIGtleW1hcFtFU3RkS2V5Q2FzZU9wZW5dID0KKyAgICBrZXltYXBbRVN0ZEtleUNhc2VDbG9zZV0gPSAgKi8KKyAgICAKKworCit9CisKKworaW50IEVQT0NfSGFuZGxlV3NFdmVudChfVEhJUywgY29uc3QgVFdzRXZlbnQmIGFXc0V2ZW50KQoreworICAgIGludCBwb3N0ZWQgPSAwOworICAgIFNETF9rZXlzeW0ga2V5c3ltOworICAgIAorLy8gICAgU0RMX1RSQUNFMSgiaHdzICVkIiwgYVdzRXZlbnQuVHlwZSgpKTsKKworICAgIHN3aXRjaCAoYVdzRXZlbnQuVHlwZSgpKQorCQl7ICAgIAorICAgIGNhc2UgRUV2ZW50UG9pbnRlcjogLyogTW91c2UgcG9pbnRlciBldmVudHMgKi8KKwkJeworLyogICAgICAgIGNvbnN0IFRQb2ludGVyQ3Vyc29yTW9kZSBtb2RlID0gRXBvY1NkbEVudjo6UG9pbnRlck1vZGUoKTsKKyAgICAgICAgCisKKyAgICAgICAgaWYobW9kZSA9PSBFUG9pbnRlckN1cnNvck5vbmUpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7IC8vVE9ETzogRmluZCBvdXQgd2h5IGV2ZW50cyBhcmUgZ2V0IGRlc3BpdGUgb2YgY3Vyc29yIHNob3VsZCBiZSBvZmYKKyAgICAgICAgICAgIH0KKyovCisgICAgICAgIGNvbnN0IFRQb2ludGVyRXZlbnQqIHBvaW50ZXJFdmVudCA9IGFXc0V2ZW50LlBvaW50ZXIoKTsKKyAgICAgICAgY29uc3QgVFBvaW50IG1vdXNlUG9zID0gRXBvY1NkbEVudjo6V2luZG93Q29vcmRpbmF0ZXMocG9pbnRlckV2ZW50LT5pUG9zaXRpb24pOworCisgICAgICAgIC8qISEgVE9ETyBQb2ludGVyIGRvIG5vdCB5ZXQgd29yayBwcm9wZXJseQorICAgICAgICAvL1NETF9UUkFDRTEoIlNETDogRVBPQ19IYW5kbGVXc0V2ZW50LCBwb2ludGVyRXZlbnQtPmlUeXBlPSVkIiwgcG9pbnRlckV2ZW50LT5pVHlwZSk7IC8vISEKKworICAgICAgICBpZiAoUHJpdmF0ZS0+RVBPQ19TaHJpbmtlZEhlaWdodCkgeworICAgICAgICAgICAgbW91c2VQb3MuaVkgPDw9IDE7IC8vIFNjYWxlIHkgY29vcmRpbmF0ZSB0byBzaHJpbmtlZCBzY3JlZW4gaGVpZ2h0CisgICAgICAgIH0KKyAgICAgICAgaWYgKFByaXZhdGUtPkVQT0NfU2hyaW5rZWRXaWR0aCkgeworICAgICAgICAgICAgbW91c2VQb3MuaVggPDw9IDE7IC8vIFNjYWxlIHggY29vcmRpbmF0ZSB0byBzaHJpbmtlZCBzY3JlZW4gd2lkdGgKKyAgICAgICAgfQorICAgICAgICAqLworCisJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIG1vdXNlUG9zLmlYLCBtb3VzZVBvcy5pWSk7IC8qIEFic29sdXRlIHBvc2l0aW9uIG9uIHNjcmVlbiAqLworCisJCXN3aXRjaCAocG9pbnRlckV2ZW50LT5pVHlwZSkKKwkJCXsKKyAgICAgICAgY2FzZSBUUG9pbnRlckV2ZW50OjpFQnV0dG9uMURvd246CisgICAgICAgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgU0RMX0JVVFRPTl9MRUZULCAwLCAwKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFRQb2ludGVyRXZlbnQ6OkVCdXR0b24xVXA6CisJCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIFNETF9CVVRUT05fTEVGVCwgMCwgMCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBUUG9pbnRlckV2ZW50OjpFQnV0dG9uMkRvd246CisgICAgICAgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUFJFU1NFRCwgU0RMX0JVVFRPTl9SSUdIVCwgMCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBUUG9pbnRlckV2ZW50OjpFQnV0dG9uMlVwOgorCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBTRExfQlVUVE9OX1JJR0hULCAwLCAwKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFRQb2ludGVyRXZlbnQ6OkVCdXR0b24zRG93bjoKKyAgICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBTRExfQlVUVE9OX01JRERMRSwgMCwgMCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBUUG9pbnRlckV2ZW50OjpFQnV0dG9uM1VwOgorCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1JFTEVBU0VELCBTRExfQlVUVE9OX01JRERMRSwgMCwgMCk7CisJCQlicmVhazsKKwkJCX0gLy8gc3dpdGNoCisgICAgICAgIGJyZWFrOworCSAgICB9CisgICAgCisgICAgY2FzZSBFRXZlbnRLZXlEb3duOiAvKiBLZXkgZXZlbnRzICovCisgICAgeworI2lmZGVmIFNZTUJJQU5fQ1JZU1RBTAorCQkvLyBzcGVjaWFsIGNhc2U6IDkzMDAvOTUwMCByb2NrZXIgZG93biwgc2ltdWxhdGUgbGVmdCBtb3VzZSBidXR0b24KKwkJaWYgKGFXc0V2ZW50LktleSgpLT5pU2NhbkNvZGUgPT0gRVN0ZEtleURldmljZUEpCisJCQl7CisgICAgICAgICAgICBjb25zdCBUUG9pbnRlckN1cnNvck1vZGUgbW9kZSA9ICBQcml2YXRlLT5FUE9DX1dzU2Vzc2lvbi5Qb2ludGVyQ3Vyc29yTW9kZSgpOworICAgICAgICAgICAgaWYobW9kZSAhPSBFUG9pbnRlckN1cnNvck5vbmUpIAorICAgICAgICAgICAgICAgIHBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKFNETF9QUkVTU0VELCBTRExfQlVUVE9OX0xFRlQsIDAsIDApOworCQkJfQorI2VuZGlmCisgICAgICAgKHZvaWQqKVRyYW5zbGF0ZUtleShfdGhpcywgYVdzRXZlbnQuS2V5KCktPmlTY2FuQ29kZSwgJmtleXN5bSk7CisgICAgICAgICAgICAKKyNpZm5kZWYgRElTQUJMRV9KT1lTVElDSworICAgICAgICAvKiBTcGVjaWFsIGhhbmRsaW5nICovCisgICAgICAgIHN3aXRjaCgoaW50KWtleXN5bS5zeW0pIHsKKyAgICAgICAgY2FzZSBTRExLX0NBUFNMT0NLOgorICAgICAgICAgICAgaWYgKCFpc0N1cnNvclZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgdmlydHVhbCBjdXJzb3IgKi8KKwkgICAgICAgICAgICBIQUw6OlNldChIQUw6OkVNb3VzZVN0YXRlLCBIQUw6OkVNb3VzZVN0YXRlX1Zpc2libGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRGlzYWJsZSB2aXJ0dWFsIGN1cnNvciAqLworICAgICAgICAgICAgICAgIEhBTDo6U2V0KEhBTDo6RU1vdXNlU3RhdGUsIEhBTDo6RU1vdXNlU3RhdGVfSW52aXNpYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzQ3Vyc29yVmlzaWJsZSA9ICFpc0N1cnNvclZpc2libGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2VuZGlmICAgICAgICAKKwkgICAgcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsICZrZXlzeW0pOworICAgICAgICBicmVhazsKKwl9IAorCisgICAgY2FzZSBFRXZlbnRLZXlVcDogLyogS2V5IGV2ZW50cyAqLworCQl7CisjaWZkZWYgU1lNQklBTl9DUllTVEFMCisJCS8vIHNwZWNpYWwgY2FzZTogOTMwMC85NTAwIHJvY2tlciB1cCwgc2ltdWxhdGUgbGVmdCBtb3VzZSBidXR0b24KKwkJaWYgKGFXc0V2ZW50LktleSgpLT5pU2NhbkNvZGUgPT0gRVN0ZEtleURldmljZUEpCisJCQl7CisgICAgICAgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIFNETF9CVVRUT05fTEVGVCwgMCwgMCk7CisJCQl9CisjZW5kaWYKKwkgICAgcG9zdGVkICs9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELCBUcmFuc2xhdGVLZXkoX3RoaXMsIGFXc0V2ZW50LktleSgpLT5pU2NhbkNvZGUsICZrZXlzeW0pKTsKKyAgICAgICAgYnJlYWs7CisJCX0KKyAgICAKKyAgICBjYXNlIEVFdmVudEZvY3VzR2FpbmVkOiAvKiBTREwgd2luZG93IGdvdCBmb2N1cyAqLworCSAgICB7CisgICAgICAgIFByaXZhdGUtPmlJc1dpbmRvd0ZvY3VzZWQgPSBFVHJ1ZTsKKwkJcG9zdGVkICs9IFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBJTlBVVEZPQ1VTfFNETF9BUFBNT1VTRUZPQ1VTKTsKKyAgICAgICAgLyogRHJhdyB3aW5kb3cgYmFja2dyb3VuZCBhbmQgc2NyZWVuIGJ1ZmZlciAqLworICAgICAgICBEaXNhYmxlS2V5QmxvY2tpbmcoX3RoaXMpOyAgLy9NYXJrdXM6IGd1ZXNzIHdoeTotKQorIAorICAgICAgICAvL1JlZHJhd1dpbmRvd0woX3RoaXMpOyAgCisgICAgICAgIGJyZWFrOworCSAgICB9CisKKyAgICBjYXNlIEVFdmVudEZvY3VzTG9zdDogLyogU0RMIHdpbmRvdyBsb3N0IGZvY3VzICovCisJCXsKKworCQlQcml2YXRlLT5pSXNXaW5kb3dGb2N1c2VkID0gRUZhbHNlOworCisJCXBvc3RlZCArPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQSU5QVVRGT0NVU3xTRExfQVBQTU9VU0VGT0NVUyk7CisKKyAgICAgICAKKyAgICAgICAgYnJlYWs7CisJICAgIH0KKworICAgIGNhc2UgRUV2ZW50TW9kaWZpZXJzQ2hhbmdlZDogCisgICAgeworCSAgICBUTW9kaWZpZXJzQ2hhbmdlZEV2ZW50KiBtb2RFdmVudCA9IGFXc0V2ZW50Lk1vZGlmaWVyc0NoYW5nZWQoKTsKKyAgICAgICAgVFVpbnQgbW9kc3RhdGUgPSBLTU9EX05PTkU7CisgICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJMZWZ0U2hpZnQpCisgICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX0xTSElGVDsKKyAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllclJpZ2h0U2hpZnQpCisgICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX1JTSElGVDsKKyAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllckxlZnRDdHJsKQorICAgICAgICAgICAgbW9kc3RhdGUgfD0gS01PRF9MQ1RSTDsKKyAgICAgICAgaWYgKG1vZEV2ZW50LT5pTW9kaWZpZXJzID09IEVNb2RpZmllclJpZ2h0Q3RybCkKKyAgICAgICAgICAgIG1vZHN0YXRlIHw9IEtNT0RfUkNUUkw7CisgICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJMZWZ0QWx0KQorICAgICAgICAgICAgbW9kc3RhdGUgfD0gS01PRF9MQUxUOworICAgICAgICBpZiAobW9kRXZlbnQtPmlNb2RpZmllcnMgPT0gRU1vZGlmaWVyUmlnaHRBbHQpCisgICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX1JBTFQ7CisgICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJMZWZ0RnVuYykKKyAgICAgICAgICAgIG1vZHN0YXRlIHw9IEtNT0RfTE1FVEE7CisgICAgICAgIGlmIChtb2RFdmVudC0+aU1vZGlmaWVycyA9PSBFTW9kaWZpZXJSaWdodEZ1bmMpCisgICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX1JNRVRBOworICAgICAgICBpZiAobW9kRXZlbnQtPmlNb2RpZmllcnMgPT0gRU1vZGlmaWVyQ2Fwc0xvY2spCisgICAgICAgICAgICBtb2RzdGF0ZSB8PSBLTU9EX0NBUFM7CisgICAgICAgIFNETF9TZXRNb2RTdGF0ZShTVEFUSUNfQ0FTVChTRExNb2QsKG1vZHN0YXRlIHwgS01PRF9MU0hJRlQpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKwljYXNlIEVFdmVudFNjcmVlbkRldmljZUNoYW5nZWQ6CisJICAgICAgICB7CisJICAgICAgICBFcG9jU2RsRW52OjpXYWl0RGV2aWNlQ2hhbmdlKCk7ICAKKwkgICAgICAgIH0KKwkgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAKKyAgICAgICAgYnJlYWs7CisJfSAKKwkKKyAgICByZXR1cm4gcG9zdGVkOworfQorCitleHRlcm4gIkMiIHsKKwordm9pZCBFUE9DX1B1bXBFdmVudHMoX1RISVMpCisgICAgeworICAgIE1FdmVudFF1ZXVlJiBldmVudHMgPSBFcG9jU2RsRW52OjpFdmVudFF1ZXVlKCk7CisgICAgd2hpbGUoZXZlbnRzLkhhc0RhdGEoKSkKKyAgICAgICAgeworICAgICAgICBldmVudHMuTG9jaygpOworICAgICAgIAorICAgICAgIC8vdGhlcmUgaGF2ZSB0byBiZSBhIGNvcHksIHNvIHdlIGNhbiByZWxlYXNlCisgICAgICAgLy9sb2NrIGltbWVkaWF0ZWx5LiBIYW5kbGVXc0V2ZW50IG1heSBjYXVzZQorICAgICAgIC8vZGVhZGxvY2sgb3RoZXJ3aXNlLgorICAgICAgICAKKyAgICAgICAgY29uc3QgVFdzRXZlbnQgZXZlbnQgPSBldmVudHMuU2hpZnQoKTsKKwkJZXZlbnRzLlVubG9jaygpOworLy8gICAgICAgIGNvbnN0IFRXc0V2ZW50JiBldmVudCA9IGV2ZW50cy5Ub3AoKTsKKwkJRVBPQ19IYW5kbGVXc0V2ZW50KF90aGlzLCBldmVudCk7CisvLwkJZXZlbnRzLlNoaWZ0KCk7CisJICAgIH0KKyAgICB9CisKKworCit2b2lkIEVQT0NfSW5pdE9TS2V5bWFwKF9USElTKQorCXsKKwlSZXNldEtleU1hcCgpOworCUVwb2NTZGxFbnY6Ok9ic2VydmVyRXZlbnQoTVNETE9ic2VydmVyOjpFRXZlbnRLZXlNYXBJbml0ICwwKTsKKwl9CisKK3N0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoX1RISVMsIGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQoreworLy8gICAgY2hhciBkZWJ1Z1syNTZdOworICAgIC8vU0RMX1RSQUNFMSgiU0RMOiBUcmFuc2xhdGVLZXksIHNjYW5jb2RlPSVkIiwgc2NhbmNvZGUpOyAvLyEhCisKKwkvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLyAKKworCWtleXN5bS0+c2NhbmNvZGUgPSBzY2FuY29kZTsKKworICAgIGlmICgoc2NhbmNvZGUgPj0gTUFYX1NDQU5DT0RFKSAmJiAKKyAgICAgICAgKChzY2FuY29kZSAtIEVOb25DaGFyYWN0ZXJLZXlCYXNlICsgMHgwMDgxKSA+PSBNQVhfU0NBTkNPREUpKSB7CisgICAgICAgIFNETF9TZXRFcnJvcigiVG9vIGJpZyBzY2FuY29kZSIpOworICAgICAgICBrZXlzeW0tPnNjYW5jb2RlID0gU0RMS19VTktOT1dOOworCSAgICBrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsgCisgICAgICAgIHJldHVybiBrZXlzeW07CisgICAgfQorCisJa2V5c3ltLT5tb2QgPSBTRExfR2V0TW9kU3RhdGUoKTsKKworICAgIC8qIEhhbmRsZSBmdW5jdGlvbiBrZXlzOiBGMSwgRjIsIEYzIC4uLiAqLworICAgIGlmIChrZXlzeW0tPm1vZCAmIEtNT0RfTUVUQSkgeworICAgICAgICBpZiAoc2NhbmNvZGUgPj0gJ0EnICYmIHNjYW5jb2RlIDwgKCdBJyArIDI0KSkgeyAvKiBmaXJzdCAzMiBhbHBoYWJldCBrZXlzICovCisgICAgICAgICAgICBzd2l0Y2goc2NhbmNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdRJzogc2NhbmNvZGUgPSBFU3RkS2V5RjE7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1cnOiBzY2FuY29kZSA9IEVTdGRLZXlGMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRSc6IHNjYW5jb2RlID0gRVN0ZEtleUYzOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdSJzogc2NhbmNvZGUgPSBFU3RkS2V5RjQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1QnOiBzY2FuY29kZSA9IEVTdGRLZXlGNTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnWSc6IHNjYW5jb2RlID0gRVN0ZEtleUY2OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdVJzogc2NhbmNvZGUgPSBFU3RkS2V5Rjc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0knOiBzY2FuY29kZSA9IEVTdGRLZXlGODsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnQSc6IHNjYW5jb2RlID0gRVN0ZEtleUY5OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdTJzogc2NhbmNvZGUgPSBFU3RkS2V5RjEwOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdEJzogc2NhbmNvZGUgPSBFU3RkS2V5RjExOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdGJzogc2NhbmNvZGUgPSBFU3RkS2V5RjEyOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtleXN5bS0+c3ltID0ga2V5bWFwW3NjYW5jb2RlXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzY2FuY29kZSA+PSBFTm9uQ2hhcmFjdGVyS2V5QmFzZSkgeworICAgICAgICAvLyBOb24gY2hhcmFjdGVyIGtleXMKKwkgICAga2V5c3ltLT5zeW0gPSBrZXltYXBbc2NhbmNvZGUgLSAKKyAgICAgICAgICAgIEVOb25DaGFyYWN0ZXJLZXlCYXNlICsgMHgwMDgxXTsgLy8gISFoYXJkIGNvZGVkCisgICAgfSBlbHNlIHsKKwkgICAga2V5c3ltLT5zeW0gPSBrZXltYXBbc2NhbmNvZGVdOworICAgIH0KKworCS8qIFJlbWFwIHRoZSBhcnJvdyBrZXlzIGlmIHRoZSBkZXZpY2UgaXMgcm90YXRlZCAqLworLyoKKwlpZiAoUHJpdmF0ZS0+RVBPQ19TY3JlZW5PcmllbnRhdGlvbiA9PSBDRmJzQml0R2M6OkVHcmFwaGljc09yaWVudGF0aW9uUm90YXRlZDI3MCkgeworCQlzd2l0Y2goa2V5c3ltLT5zeW0pIHsKKwkJCWNhc2UgU0RMS19VUDoJa2V5c3ltLT5zeW0gPSBTRExLX0xFRlQ7ICBicmVhazsKKwkJCWNhc2UgU0RMS19ET1dOOiBrZXlzeW0tPnN5bSA9IFNETEtfUklHSFQ7IGJyZWFrOworCQkJY2FzZSBTRExLX0xFRlQ6IGtleXN5bS0+c3ltID0gU0RMS19ET1dOOyAgYnJlYWs7CisJCQljYXNlIFNETEtfUklHSFQ6a2V5c3ltLT5zeW0gPSBTRExLX1VQOyAgICBicmVhazsKKwkJfQorCX0KKyovCisJLyogSWYgVU5JQ09ERSBpcyBvbiwgZ2V0IHRoZSBVTklDT0RFIHZhbHVlIGZvciB0aGUga2V5ICovCisJa2V5c3ltLT51bmljb2RlID0gMDsKKworI2lmIDAgLy8gISFUT0RPOnVuaWNvZGUKKworCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSAKKyAgICB7CisJCS8qIFBvcHVsYXRlIHRoZSB1bmljb2RlIGZpZWxkIHdpdGggdGhlIEFTQ0lJIHZhbHVlICovCisJCWtleXN5bS0+dW5pY29kZSA9IHNjYW5jb2RlOworCX0KKyNlbmRpZgorCisgICAgLy8hIQorICAgIC8vc3ByaW50ZihkZWJ1ZywgIlNETDogVHJhbnNsYXRlS2V5OiBrZXlzeW0tPnNjYW5jb2RlPSVkLCBrZXlzeW0tPnN5bT0lZCwga2V5c3ltLT5tb2Q9JWQiLAorICAgIC8vICAgIGtleXN5bS0+c2NhbmNvZGUsIGtleXN5bS0+c3ltLCBrZXlzeW0tPm1vZCk7CisgICAgLy9TRExfVFJBQ0UoZGVidWcpOyAvLyEhCisKKwlyZXR1cm4oa2V5c3ltKTsKK30KKworfSAvKiBleHRlcm4gIkMiICovCisKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTIvU0RMX2Vwb2N2aWRlby5jcHAgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N5bWJpYW4vRUtBMi9TRExfZXBvY3ZpZGVvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTU1MDZkCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTIvU0RMX2Vwb2N2aWRlby5jcHAKQEAgLTAsMCArMSw1OTQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGRldm9sdXRpb24uY29tCisqLworCisvKgorICAgIFNETF9lcG9jdmlkZW8uY3BwCisgICAgRXBvYyBiYXNlZCBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uCisKKyAgICBNYXJrdXMgTWVydGFtYQorKi8KKworCisKKyNpbmNsdWRlICJlcG9jX3NkbC5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiU0RMX2Vycm9yLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjdW5kZWYgTlVMTAorI2luY2x1ZGUgIlNETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorfQorCisjaW5jbHVkZSAiU0RMX2Vwb2N2aWRlby5oIgorI2luY2x1ZGUgIlNETF9lcG9jZXZlbnRzX2MuaCIKKworCisKKyNpbmNsdWRlIDxjb2VkZWYuaD4KKyNpbmNsdWRlIDxmbG9nZ2VyLmg+CisKKyNpbmNsdWRlIDxlaWtlbnYuaD4KKyNpbmNsdWRlIDxlaWthcHB1aS5oPgorI2luY2x1ZGUgPGVpa2FwcC5oPgorI2luY2x1ZGUgInNkbGVwb2NhcGkuaCIKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisKK19MSVQoS0xpYk5hbWUsICJTREwiKTsKKwordm9pZCBSRGVidWdfUHJpbnRfYihjaGFyKiBlcnJvcl9zdHIsIHZvaWQqIHBhcmFtKQorICAgIHsKKyAgICBUQnVmODwxMjg+IGVycm9yOCgoVFVpbnQ4KillcnJvcl9zdHIpOworICAgIFRCdWY8MTI4PiBlcnJvcjsKKyAgICBlcnJvci5Db3B5KGVycm9yOCk7CisKKyNpZm5kZWYgVFJBQ0VfVE9fRklMRQorICAgIGlmIChwYXJhbSkgLy8hISBEbyBub3Qgd29yayBpZiB0aGUgcGFyYW1ldGVyIGlzIHJlYWxseSAwISEKKyAgICAgICAgUkRlYnVnOjpQcmludChlcnJvciwgcGFyYW0pOworICAgIGVsc2UgCisgICAgICAgIFJEZWJ1Zzo6UHJpbnQoZXJyb3IpOworI2Vsc2UKKyAgICBpZiAocGFyYW0pIC8vISEgRG8gbm90IHdvcmsgaWYgdGhlIHBhcmFtZXRlciBpcyByZWFsbHkgMCEhCisgICAgICAgIFJGaWxlTG9nZ2VyOjpXcml0ZUZvcm1hdChLTGliTmFtZSwgX0woIlNETC50eHQiKSwgRUZpbGVMb2dnaW5nTW9kZUFwcGVuZCwgZXJyb3IsIHBhcmFtKTsKKyAgICBlbHNlIAorICAgICAgICBSRmlsZUxvZ2dlcjo6V3JpdGUoS0xpYk5hbWUsIF9MKCJTREwudHh0IiksIEVGaWxlTG9nZ2luZ01vZGVBcHBlbmQsIGVycm9yKTsKKyNlbmRpZgorCisgICAgfQorCitleHRlcm4gIkMiIHZvaWQgUkRlYnVnX1ByaW50KGNoYXIqIGVycm9yX3N0ciwgdm9pZCogcGFyYW0pCisgICAgeworICAgIFJEZWJ1Z19QcmludF9iKGVycm9yX3N0ciwgcGFyYW0pOworICAgIH0KKworLyoKK2ludCBEZWJ1Z19BdmFpbE1lbTIoKQorICAgIHsKKyAgICAvL1VzZXI6OkNvbXByZXNzQWxsSGVhcHMoKTsKKyAgICBUTWVtb3J5SW5mb1YxQnVmIG1lbWJ1ZjsgCisgICAgVXNlcjo6TGVhdmVJZkVycm9yKFVzZXJIYWw6Ok1lbW9yeUluZm8obWVtYnVmKSk7CisgICAgVE1lbW9yeUluZm9WMSBtaW5mbyA9IG1lbWJ1ZigpOworCXJldHVybihtaW5mby5pRnJlZVJhbUluQnl0ZXMpOworICAgIH0KKworZXh0ZXJuICJDIiBpbnQgRGVidWdfQXZhaWxNZW0oKQorICAgIHsKKyAgICByZXR1cm4oRGVidWdfQXZhaWxNZW0yKCkpOworICAgIH0KKyAgICAKKyovCisKK2V4dGVybiAiQyIgeworCisvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBFUE9DX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKkVQT0NfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBTRExfU3VyZmFjZSAqRVBPQ19TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgaW50IEVQT0NfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsCisJCQkgIFNETF9Db2xvciAqY29sb3JzKTsKK3N0YXRpYyB2b2lkIEVQT0NfVmlkZW9RdWl0KF9USElTKTsKKworLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBFUE9DX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IEVQT0NfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIGludCBFUE9DX0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIEVQT0NfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBFUE9DX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIEVQT0NfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKK3N0YXRpYyBpbnQgRVBPQ19BdmFpbGFibGUodm9pZCk7CitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpFUE9DX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpOworCit2b2lkIERyYXdCYWNrZ3JvdW5kKF9USElTKTsKK3ZvaWQgRGlyZWN0RHJhdyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMsIFRVaW50MTYqIHNjcmVlbkJ1ZmZlcik7Cit2b2lkIERpcmVjdERyYXdSb3RhdGVkKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cywgVFVpbnQxNiogc2NyZWVuQnVmZmVyKTsKKworLyogTW91c2UgZnVuY3Rpb25zICovCisKK3N0YXRpYyBXTWN1cnNvciAqRVBPQ19DcmVhdGVXTUN1cnNvcihfVEhJUywgVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKK3N0YXRpYyB2b2lkIEVQT0NfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKTsKK3N0YXRpYyBpbnQgRVBPQ19TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpOworfQorCisKK2V4dGVybiAiQyIKKwl7CisJc3RydWN0IFdNY3Vyc29yCisJCXsKKwkJfTsKKwl9CisKKy8qIEVwb2MgdmlkZW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworCitzdGF0aWMgaW50IEVQT0NfQXZhaWxhYmxlKHZvaWQpCisgICAgeworICAgIHJldHVybiAxOyAvKiBBbHdheXMgYXZhaWxhYmxlICovCisgICAgfQorCitzdGF0aWMgdm9pZCBFUE9DX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKKyAgICB7CisJVXNlcjo6RnJlZShkZXZpY2UtPmhpZGRlbik7CisJVXNlcjo6RnJlZShkZXZpY2UpOworICAgIH0KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqRVBPQ19DcmVhdGVEZXZpY2UoaW50IC8qZGV2aW5kZXgqLykKKyAgICB7CisJU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2U7CisKKwlTRExfVFJBQ0UoIlNETDpFUE9DX0NyZWF0ZURldmljZSIpOworCisJLyogQWxsb2NhdGUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGZyZWUgb24gZGVsZXRlICovCisJZGV2aWNlID0gc3RhdGljX2Nhc3Q8U0RMX1ZpZGVvRGV2aWNlKj4oVXNlcjo6QWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpKTsKKwlpZiAoIGRldmljZSApIAorCSAgICB7CisJCU1lbTo6RmlsbFooZGV2aWNlLCAoc2l6ZW9mICpkZXZpY2UpKTsKKwkJZGV2aWNlLT5oaWRkZW4gPSBzdGF0aWNfY2FzdDxzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEqPgorCQkJCShVc2VyOjpBbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpKTsKKwkgICAgfQorCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKQorCSAgICB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIGRldmljZSApIHsKKwkJVXNlcjo6RnJlZShkZXZpY2UpOworCQl9CisJCXJldHVybigwKTsKKwl9CisJTWVtOjpGaWxsWihkZXZpY2UtPmhpZGRlbiwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwlkZXZpY2UtPlZpZGVvSW5pdCA9IEVQT0NfVmlkZW9Jbml0OworCWRldmljZS0+TGlzdE1vZGVzID0gRVBPQ19MaXN0TW9kZXM7CisJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBFUE9DX1NldFZpZGVvTW9kZTsKKwlkZXZpY2UtPlNldENvbG9ycyA9IEVQT0NfU2V0Q29sb3JzOworCWRldmljZS0+VXBkYXRlUmVjdHMgPSBOVUxMOworCWRldmljZS0+VmlkZW9RdWl0ID0gRVBPQ19WaWRlb1F1aXQ7CisJZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IEVQT0NfQWxsb2NIV1N1cmZhY2U7CisJZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7CisJZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOworCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7CisJZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gRVBPQ19Mb2NrSFdTdXJmYWNlOworCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gRVBPQ19VbmxvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gRVBPQ19GbGlwSFdTdXJmYWNlOworCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IEVQT0NfRnJlZUhXU3VyZmFjZTsKKwlkZXZpY2UtPlNldEljb24gPSBOVUxMOworCWRldmljZS0+U2V0Q2FwdGlvbiA9IE5VTEw7CisJZGV2aWNlLT5HZXRXTUluZm8gPSBOVUxMOworCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gRVBPQ19GcmVlV01DdXJzb3I7CisJZGV2aWNlLT5DcmVhdGVXTUN1cnNvciA9IEVQT0NfQ3JlYXRlV01DdXJzb3I7CisJZGV2aWNlLT5TaG93V01DdXJzb3IgPSBFUE9DX1Nob3dXTUN1cnNvcjsKKwlkZXZpY2UtPldhcnBXTUN1cnNvciA9IE5VTEw7CisJZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBFUE9DX0luaXRPU0tleW1hcDsKKwlkZXZpY2UtPlB1bXBFdmVudHMgPSBFUE9DX1B1bXBFdmVudHM7CisJZGV2aWNlLT5mcmVlID0gRVBPQ19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCisKK1ZpZGVvQm9vdFN0cmFwIEVQT0NfYm9vdHN0cmFwID0geworCSJlcG9jXDBcMFwwIiwgIkVQT0Mgc3lzdGVtIiwKKyAgICBFUE9DX0F2YWlsYWJsZSwgRVBPQ19DcmVhdGVEZXZpY2UKK307CisKKworCit2b2lkIERpc2FibGVLZXlCbG9ja2luZyhfVEhJUykKKyAgICB7CisgICAgRXBvY1NkbEVudjo6UmVxdWVzdChFcG9jU2RsRW52OjpFRGlzYWJsZUtleUJsb2NraW5nKTsKKyAgICB9CisKK3ZvaWQgQ29uc3RydWN0V2luZG93TChfVEhJUykKKwl7CisJU0RMX1RSQUNFKCJTREw6Q29uc3RydWN0V2luZG93TCIpOworCURpc2FibGVLZXlCbG9ja2luZyhfdGhpcyk7IC8vZGlzYWJsZSBrZXkgYmxvY2tpbmcKKwl9CisJCQorCitpbnQgRVBPQ19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKKwl7CisgICAgLyogQ29uc3RydWN0IEVwb2Mgd2luZG93ICovCisKKyAgICBDb25zdHJ1Y3RXaW5kb3dMKF90aGlzKTsKKworICAgIC8qIEluaXRpYWxpc2UgRXBvYyBmcmFtZSBidWZmZXIgKi8KKworICAKKyAgICBjb25zdCBURGlzcGxheU1vZGUgZGlzcGxheU1vZGUgPSBFcG9jU2RsRW52OjpEaXNwbGF5TW9kZSgpOworCisgICAgLyogVGhlICJiZXN0IiB2aWRlbyBmb3JtYXQgc2hvdWxkIGJlIHJldHVybmVkIHRvIGNhbGxlci4gKi8KKworICAgIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCAJPSBURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVCaXRzUGVyUGl4ZWwoZGlzcGxheU1vZGUpOworICAgIHZmb3JtYXQtPkJ5dGVzUGVyUGl4ZWwgID0gVERpc3BsYXlNb2RlVXRpbHM6Ok51bURpc3BsYXlNb2RlQml0c1BlclBpeGVsKGRpc3BsYXlNb2RlKSAvIDg7CisKKyAgICAKKyAvLz8/ICAgUHJpdmF0ZS0+aVdpbmRvdy0+UG9pbnRlckZpbHRlcihFUG9pbnRlckZpbHRlckRyYWcsIDApOyAKKworICAgIFByaXZhdGUtPmlTY3JlZW5Qb3MgPSBUUG9pbnQoMCwgMCk7CisgICAgCisgICAgUHJpdmF0ZS0+aVJlY3QueCA9IFByaXZhdGUtPmlTY3JlZW5Qb3MuaVg7CisgICAgUHJpdmF0ZS0+aVJlY3QueSA9IFByaXZhdGUtPmlTY3JlZW5Qb3MuaVk7CisgICAgCisgICAgY29uc3QgVFNpemUgc3ogPSBFcG9jU2RsRW52OjpXaW5kb3dTaXplKCk7CisgICAgCisgICAgUHJpdmF0ZS0+aVJlY3QudyA9IHN6LmlXaWR0aDsKKyAgICBQcml2YXRlLT5pUmVjdC5oID0gc3ouaUhlaWdodDsKKwlQcml2YXRlLT5pUmVjdFB0ciA9ICZQcml2YXRlLT5pUmVjdDsKKworCXJldHVybigwKTsKKwl9CisKKworU0RMX1JlY3QgKipFUE9DX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKKwl7CisJaWYoZmxhZ3MgJiBTRExfSFdTVVJGQUNFKQorCQl7CisJCWlmKGZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCAhPSA0KSAvL2luIEhXIG9ubHkgZnVsbCBjb2xvciBpcyBzdXBwb3J0ZWQKKwkJCXJldHVybiBOVUxMOworCQl9CisJaWYoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikKKwkJeworCQlyZXR1cm4gJlByaXZhdGUtPmlSZWN0UHRyOworCQl9CisgICAgcmV0dXJuIChTRExfUmVjdCAqKikoLTEpOyAvL2V2ZXJ5dGhpbmdpc29rLCB1bmxlc3MgdG9vIHNtYWxsIHNob2VzCisJfQorCisKK2ludCBFUE9DX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKKwl7CisJaWYgKChmaXJzdGNvbG9yK25jb2xvcnMpID4gMjU2KQorCQlyZXR1cm4gLTE7CisJVFVpbnQzMiBwYWxldHRlWzI1Nl07CisJY29uc3QgVERpc3BsYXlNb2RlIG1vZGUgPSBFcG9jU2RsRW52OjpEaXNwbGF5TW9kZSgpOworICAgIGlmKFREaXNwbGF5TW9kZVV0aWxzOjpOdW1EaXNwbGF5TW9kZUNvbG9ycyhtb2RlKSA9PSA0MDk2KQorICAgICAgICB7CisJLy8gU2V0IDEyIGJpdCBwYWxldHRlCisgICAgICAgIGZvcihpbnQgaSA9IGZpcnN0Y29sb3I7IGkgPCBuY29sb3JzOyBpKyspCisgICAgICAgICAgICB7CisJICAgICAgICAvLyA0ayB2YWx1ZTogMDAwMCBycnJyIGdnZ2cgYmJiYgorCSAgICAgICAgVFVpbnQzMiBjb2xvcjRLCSA9IChjb2xvcnNbaV0uciAmIDB4MDAwMGYwKSA8PCA0OworCSAgICAgICAgY29sb3I0SwkJCXw9IChjb2xvcnNbaV0uZyAmIDB4MDAwMGYwKTsgICAgICAKKwkgICAgICAgIGNvbG9yNEsJCQl8PSAoY29sb3JzW2ldLmIgJiAweDAwMDBmMCkgPj4gNDsKKyAgICAgICAgICAgIHBhbGV0dGVbaV0gPSBjb2xvcjRLOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgZWxzZSBpZihURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVDb2xvcnMobW9kZSkgPT0gNjU1MzYpCisgICAgICAgIHsKKyAgICAgICAgZm9yKGludCBpID0gZmlyc3Rjb2xvcjsgaSA8IG5jb2xvcnM7IGkrKykKKyAgICAgICAgICAgIHsKKwkJCS8vIDY0ay1jb2xvdXIgZGlzcGxheXMgZWZmZWN0aXZlbHkgc3VwcG9ydCBSR0IgdmFsdWVzCisJCQkvLyB3aXRoIDUgYml0cyBhbGxvY2F0ZWQgdG8gcmVkLCA2IHRvIGdyZWVuIGFuZCA1IHRvIGJsdWUKKwkJCS8vIDY0ayB2YWx1ZTogcnJyciByZ2dnIGdnZ2IgYmJiYgorCSAgICAgICAgVFVpbnQzMiBjb2xvcjY0SyA9IChjb2xvcnNbaV0uciAmIDB4MDAwMGY4KSA8PCA4OworCSAgICAgICAgY29sb3I2NEsJCXw9IChjb2xvcnNbaV0uZyAmIDB4MDAwMGZjKSA8PCAzOworCSAgICAgICAgY29sb3I2NEsJCXw9IChjb2xvcnNbaV0uYiAmIDB4MDAwMGY4KSA+PiAzOworICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IGNvbG9yNjRLOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgZWxzZSBpZihURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVDb2xvcnMobW9kZSkgPT0gMTY3NzcyMTYpCisgICAgICAgIHsKKyAgICAgICAgZm9yKGludCBpID0gZmlyc3Rjb2xvcjsgaSA8IG5jb2xvcnM7IGkrKykKKyAgICAgICAgICAgIHsKKwkJCS8vIDE2TS1jb2xvdXIKKyAgICAgICAgICAgIC8vMDAwMCAwMDAwIHJycnIgcnJyciBnZ2dnIGdnZ2cgYmJiYiBiYmJiCisJICAgICAgICBUVWludDMyIGNvbG9yMTZNID0gY29sb3JzW2ldLnIgPDwgMTY7CisJICAgICAgICBjb2xvcjE2TQkJfD0gY29sb3JzW2ldLmcgPDwgODsKKwkgICAgICAgIGNvbG9yMTZNCQl8PSBjb2xvcnNbaV0uYjsKKyAgICAgICAgICAgIHBhbGV0dGVbaV0gPSBjb2xvcjE2TTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIH0KKyAgICBpZihFcG9jU2RsRW52OjpTZXRQYWxldHRlKGZpcnN0Y29sb3IsIG5jb2xvcnMsIHBhbGV0dGUpID09IEtFcnJOb25lKQorICAgIAlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7CisJfQorCisKKy8qCQordm9pZCBBbGxvY0hXU3VyZmFjZUwoQ0Zic0JpdG1hcComIGFCaXRtYXAsIGNvbnN0IFREaXNwbGF5TW9kZSYgYU1vZGUsIGNvbnN0IFRTaXplJiBhU2l6ZSkKKwl7CisJYUJpdG1hcCA9IG5ldyAoRUxlYXZlKSBDRmJzQml0bWFwKCk7CQorCWlmKEtFcnJOb25lICE9IGFCaXRtYXAtPkNyZWF0ZUhhcmR3YXJlQml0bWFwKGFTaXplLCBhTW9kZSwKKwkJRXBvY1NkbEVudjo6RWlrb25FbnYoKS5FaWtBcHBVaSgpLT5BcHBsaWNhdGlvbigpLT5BcHBEbGxVaWQoKSkpIAorCS8vLi4uaWYgaXQgZmFpbHMgLSBzaG91bGQgd2UgdXNlIHdzYml0bWFwcz8/PworCQl7Ly90aGUgZ29vZCByZWFzb24gdG8gdXNlIGh3IGJpdG1hcHMgaXMgdGhhdCB0aGV5IHdvbnQgbmVlZCBsb2NrIGhlYXAKKwkJUEFOSUNfSUZfRVJST1IoYUJpdG1hcC0+Q3JlYXRlKGFTaXplLCBhTW9kZSkpOworCQl9CisJfQorCQoraW50IENyZWF0ZVN1cmZhY2VMKF9USElTLCBTRExfU3VyZmFjZSogc3VyZmFjZSkKKyAgICB7CisgICAgX19BU1NFUlRfQUxXQVlTKFByaXZhdGUtPmlGcmFtZSA9PSBOVUxMLCBQQU5JQyhLRXJyQWxyZWFkeUV4aXN0cykpOworOworCVRJbnQgZG1vZGUgPSBFQ29sb3JMYXN0OworCQorCVREaXNwbGF5TW9kZSBkaXNwbGF5TW9kZTsKKwlFcG9jU2RsRW52OjpHZXREaXBsYXlNb2RlKGRpc3BsYXlNb2RlKTsKKwkKKwlpZigKKwlURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVCaXRzUGVyUGl4ZWwoZGlzcGxheU1vZGUpCisJPT0gc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpCisJCXsKKwkJZG1vZGUgPSBkaXNwbGF5TW9kZTsKKwkJfQorCWVsc2UKKwkJeworCQktLWRtb2RlOworCQl3aGlsZShURGlzcGxheU1vZGVVdGlsczo6SXNEaXNwbGF5TW9kZUNvbG9yKFREaXNwbGF5TW9kZShkbW9kZSkpICYmCisJCQlURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVCaXRzUGVyUGl4ZWwoVERpc3BsYXlNb2RlKGRtb2RlKSkgIT0KKwkJCXN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsKQorCQkJLS1kbW9kZTsKKwkJfQorCisJX19BU1NFUlRfQUxXQVlTKFREaXNwbGF5TW9kZVV0aWxzOjpJc0Rpc3BsYXlNb2RlQ29sb3IoVERpc3BsYXlNb2RlKGRtb2RlKSksIFBBTklDKEtFcnJOb3RTdXBwb3J0ZWQpKTsKKwlUUkFQRChlcnIsIEFsbG9jSFdTdXJmYWNlTChQcml2YXRlLT5pRnJhbWUsIFREaXNwbGF5TW9kZShkbW9kZSksIFRTaXplKHN1cmZhY2UtPncsIHN1cmZhY2UtPmgpKSk7CisJcmV0dXJuIGVyciA9PSBLRXJyTm9uZSA/IDAgOiAtMTsKKyAgICB9CisqLworCitURGlzcGxheU1vZGUgR2V0RGlzcGxheU1vZGUoVEludCBhQml0c1BlclBpeGVsKQorCXsKKwljb25zdCBURGlzcGxheU1vZGUgZGlzcGxheU1vZGUgPSBFcG9jU2RsRW52OjpEaXNwbGF5TW9kZSgpOworCVRJbnQgZG1vZGUgPSBFQ29sb3JMYXN0OworCWlmKAorCVREaXNwbGF5TW9kZVV0aWxzOjpOdW1EaXNwbGF5TW9kZUJpdHNQZXJQaXhlbChkaXNwbGF5TW9kZSkKKwk9PSBhQml0c1BlclBpeGVsKQorCQl7CisJCWRtb2RlID0gZGlzcGxheU1vZGU7CisJCX0KKwllbHNlCisJCXsKKwkJLS1kbW9kZTsKKwkJd2hpbGUoVERpc3BsYXlNb2RlVXRpbHM6OklzRGlzcGxheU1vZGVDb2xvcihURGlzcGxheU1vZGUoZG1vZGUpKSAmJgorCQkJVERpc3BsYXlNb2RlVXRpbHM6Ok51bURpc3BsYXlNb2RlQml0c1BlclBpeGVsKFREaXNwbGF5TW9kZShkbW9kZSkpICE9CisJCQlhQml0c1BlclBpeGVsKQorCQkJLS1kbW9kZTsKKwkJfQorCXJldHVybiBURGlzcGxheU1vZGUoZG1vZGUpOworCX0KKworU0RMX1N1cmZhY2UgKkVQT0NfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKKwl7CisJY29uc3QgVFNpemUgc2NyZWVuU2l6ZSA9IEVwb2NTZGxFbnY6OldpbmRvd1NpemUoVFNpemUod2lkdGgsIGhlaWdodCkpOworCWlmKHdpZHRoID4gc2NyZWVuU2l6ZS5pV2lkdGggfHwgaGVpZ2h0ID4gc2NyZWVuU2l6ZS5pSGVpZ2h0KQorCSAgICB7CisJICAgIGlmKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pCisJICAgICAgICB7CisJICAgICAgICB3aWR0aCA9IHNjcmVlblNpemUuaVdpZHRoOworCSAgICAgICAgaGVpZ2h0ID0gc2NyZWVuU2l6ZS5pSGVpZ2h0OworCSAgICAgICAgfQorCSAgICBlbHNlICAgIAorCQkgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKworICAgIGlmKGN1cnJlbnQgJiYgY3VycmVudC0+cGl4ZWxzKQorICAgIAl7CisgICAgICAvLyAgZnJlZShjdXJyZW50LT5waXhlbHMpOworICAgICAgICBjdXJyZW50LT5waXhlbHMgPSBOVUxMOworICAgIAl9CisgICAgCQorCWlmKCFTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCBicHAsIDAsIDAsIDAsIDApKQorCSAJeworCQlyZXR1cm4oTlVMTCk7CisJIAl9CisKKwljdXJyZW50LT5mbGFncyA9IDA7CisJaWYod2lkdGggPT0gc2NyZWVuU2l6ZS5pV2lkdGggJiYgaGVpZ2h0ID09IHNjcmVlblNpemUuaUhlaWdodCkKKwkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisJCisJY29uc3QgaW50IG51bUJ5dGVzUGVyUGl4ZWwgPSAoKGJwcC0xKT4+MykgKyAxOyAgIAorCWN1cnJlbnQtPnBpdGNoID0gbnVtQnl0ZXNQZXJQaXhlbCAqIHdpZHRoOyAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gc2NhbmxpbmUgCisKKyAgICAvKiBTZXQgdXAgdGhlIG5ldyBtb2RlIGZyYW1lYnVmZmVyICovCisgICAJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX1BSRUFMTE9DOworICAgCQorICAgCWlmKGJwcCA8PSA4KQorICAgCQljdXJyZW50LT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOworICAgCQorICAgCVVzZXI6OkZyZWUoUHJpdmF0ZS0+aVN3U3VyZmFjZSk7CisgICAJY3VycmVudC0+cGl4ZWxzID0gTlVMTDsKKyAgIAlQcml2YXRlLT5pU3dTdXJmYWNlID0gTlVMTDsKKyAgIAkKKyAgIAlpZihmbGFncyAmIFNETF9IV1NVUkZBQ0UpCisgICAJICAgIHsKKyAgIAkgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKKyAgIAkgICAvLwljdXJyZW50LT5waXhlbHMgPSBOVUxMOworICAgCSAgIC8vIAlQcml2YXRlLT5pU3dTdXJmYWNlID0gTlVMTDsKKyAgIAkgICAgfQorICAgCWVsc2UKKyAgIAkgICAgeworICAgCSAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfU1dTVVJGQUNFOworICAgCSAgICBjb25zdCBUSW50IHN1cmZhY2VzaXplID0gd2lkdGggKiBoZWlnaHQgKiBudW1CeXRlc1BlclBpeGVsOyAgCisgICAJICAgCVByaXZhdGUtPmlTd1N1cmZhY2VTaXplID0gVFNpemUod2lkdGgsIGhlaWdodCk7CisgICAJICAgCWRlbGV0ZSBQcml2YXRlLT5pU3dTdXJmYWNlOworICAgCSAgIAlQcml2YXRlLT5pU3dTdXJmYWNlID0gTlVMTDsKKyAgIAkgIAljdXJyZW50LT5waXhlbHMgPSAoVFVpbnQ4KikgVXNlcjo6QWxsb2NMKHN1cmZhY2VzaXplKTsKKyAgIAkgIAlQcml2YXRlLT5pU3dTdXJmYWNlID0gKFRVaW50OCopIGN1cnJlbnQtPnBpeGVsczsKKyAgIAkgIAljb25zdCBUSW50IGVyciA9IEVwb2NTZGxFbnY6OkFsbG9jU3dTdXJmYWNlCisgICAJICAJCShUU2l6ZSh3aWR0aCwgaGVpZ2h0KSwgR2V0RGlzcGxheU1vZGUoY3VycmVudC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpKTsKKwkgICAgaWYoZXJyICE9IEtFcnJOb25lKQorCSAgICAJcmV0dXJuIE5VTEw7CisJICAgIH0KKwkKKwljdXJyZW50LT53ID0gd2lkdGg7CisJY3VycmVudC0+aCA9IGhlaWdodDsKKwkKKyAgCisJCisJLyogU2V0IHRoZSBibGl0IGZ1bmN0aW9uICovCisJX3RoaXMtPlVwZGF0ZVJlY3RzID0gRVBPQ19EaXJlY3RVcGRhdGU7CisKKyAgICAvKgorICAgICAqICBMb2dpYyBmb3IgZ2V0dGluZyBzdWl0YWJsZSBzY3JlZW4gZGltZW5zaW9ucywgb2Zmc2V0LCBzY2FsaW5nIGFuZCBvcmllbnRhdGlvbgorICAgICAqLworCisKKyAgICAvKiBDZW50cmFsaXplIGdhbWUgd2luZG93IG9uIGRldmljZSBzY3JlZW4gICovCisgICAKKyAgICAKKyAgICBQcml2YXRlLT5pU2NyZWVuUG9zLmlYID0gTWF4KDAsIChzY3JlZW5TaXplLmlXaWR0aCAgLSB3aWR0aCkgIC8gMik7CisgICAgUHJpdmF0ZS0+aVNjcmVlblBvcy5pWSA9IE1heCgwLCAoc2NyZWVuU2l6ZS5pSGVpZ2h0IC0gaGVpZ2h0KSAvIDIpOworICAgIAorIC8vICAgZGVsZXRlIChQcml2YXRlLT5pRnJhbWUpOworLy8JUHJpdmF0ZS0+aUZyYW1lID0gTlVMTDsKKwkKKyAgLy8gIFRSQVBEKGVyciwgQ3JlYXRlU3VyZmFjZUwoX3RoaXMsIGN1cnJlbnQpKTsKKyAgLy8gIFBBTklDX0lGX0VSUk9SKGVycik7CisgICAgCisgICAgU0RMX1RSQUNFMSgiVmlldyB3aWR0aCAlZCIsIHdpZHRoKTsKKyAgICBTRExfVFJBQ0UxKCJWaWV3IGhlaWdodCAlZCIsIGhlaWdodCk7CisgICAgU0RMX1RSQUNFMSgiVmlldyBibW9kZSAlZCIsIGJwcCk7CisgICAgU0RMX1RSQUNFMSgiVmlldyB4ICVkIiwgUHJpdmF0ZS0+aVNjcmVlblBvcy5pWCk7CisgICAgU0RMX1RSQUNFMSgiVmlldyB5ICVkIiwgUHJpdmF0ZS0+aVNjcmVlblBvcy5pWSk7CisKKwlFcG9jU2RsRW52OjpMb2NrUGFsZXR0ZShFRmFsc2UpOworCS8qIFdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4oY3VycmVudCk7Cit9CisKKworCitzdGF0aWMgaW50IEVQT0NfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlKQorCXsKKwlyZXR1cm4gS0Vyck5vbmUgPT0gRXBvY1NkbEVudjo6QWxsb2NId1N1cmZhY2UoVFNpemUoc3VyZmFjZS0+dywgc3VyZmFjZS0+aCksIEdldERpc3BsYXlNb2RlKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSk7CisJfQorCQorc3RhdGljIHZvaWQgRVBPQ19GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSogLypzdXJmYWNlKi8pCisJeworCX0KKworc3RhdGljIGludCBFUE9DX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlKiBzdXJmYWNlKQorCXsKKwlpZihFcG9jU2RsRW52OjpJc0RzYUF2YWlsYWJsZSgpKQorCQl7CisJCVRVaW50OCogYWRkcmVzcyA9IEVwb2NTZGxFbnY6OkxvY2tId1N1cmZhY2UoKTsKKwkJaWYoYWRkcmVzcyAhPSBOVUxMKQorCQkJeworCQkJc3VyZmFjZS0+cGl4ZWxzID0gYWRkcmVzczsKKwkJCXJldHVybiAxOworCQkJfQorCQl9CisJcmV0dXJuIDA7CisJfQorc3RhdGljIHZvaWQgRVBPQ19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlKiAvKnN1cmZhY2UqLykKKwl7CisJRXBvY1NkbEVudjo6VW5sb2NrSHdTdXJmYWNlKCk7CisJfQorCitzdGF0aWMgaW50IEVQT0NfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UqIC8qc3VyZmFjZSovKQorCXsKKwlyZXR1cm4oMCk7CisJfQorCitzdGF0aWMgdm9pZCBFUE9DX0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCisJeworCWlmKEVwb2NTZGxFbnY6OklzRHNhQXZhaWxhYmxlKCkpCisJCXsKKwkJaWYoUHJpdmF0ZS0+aVN3U3VyZmFjZSkKKwkJICAgIHsKKwkJICAgIGNvbnN0IFRSZWN0IHRhcmdldChQcml2YXRlLT5pU2NyZWVuUG9zLCBQcml2YXRlLT5pU3dTdXJmYWNlU2l6ZSk7CisJCSAgICBmb3IoVEludCBpID0gMDsgaSA8IG51bXJlY3RzIDtpKyspCisJCSAgICAJeworCQkgICAgCWNvbnN0IFRSZWN0IHJlY3QoVFBvaW50KHJlY3RzW2ldLngsIHJlY3RzW2ldLnkpLAorCQkgICAgCQlUU2l6ZShyZWN0c1tpXS53LCByZWN0c1tpXS5oKSk7CisJCSAgICAJaWYoIUVwb2NTZGxFbnY6OkFkZFVwZGF0ZVJlY3QoUHJpdmF0ZS0+aVN3U3VyZmFjZSwgcmVjdCwgdGFyZ2V0KSkKKwkJICAgIAkJcmV0dXJuOyAvL25vdCBzdWNjZXNmdWwKKwkJICAgIAl9CisJCSAgICBFcG9jU2RsRW52OjpVcGRhdGVTd1N1cmZhY2UoKTsKKwkJICAgIH0KKwkJU0RMX1BhdXNlQXVkaW8oMCk7CisJCX0KKyAgICBlbHNlCisgICAgCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgCVNETF9QYXVzZUF1ZGlvKDEpOworICAgIAlFcG9jU2RsRW52OjpXYWl0RHNhQXZhaWxhYmxlKCk7ICAgICAgICAgICAgICAKKwkJfQorCX0KKworCisvKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKKyAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KKyovCit2b2lkIEVQT0NfVmlkZW9RdWl0KF9USElTKQorCXsKKy8vCWRlbGV0ZSBQcml2YXRlLT5pRnJhbWU7CisvLwlQcml2YXRlLT5pRnJhbWUgPSBOVUxMOworCVVzZXI6OkZyZWUoUHJpdmF0ZS0+aVN3U3VyZmFjZSk7CisJUHJpdmF0ZS0+aVN3U3VyZmFjZSA9IE5VTEw7CisJRXBvY1NkbEVudjo6RnJlZVN1cmZhY2UoKTsKKwl9CisJCisJCisKKworV01jdXJzb3IgKkVQT0NfQ3JlYXRlV01DdXJzb3IoX1RISVMsIFVpbnQ4KiAvKmRhdGEqLywgVWludDgqIC8qbWFzayovLCBpbnQgLyp3Ki8sIGludCAvKmgqLywgaW50IC8qaG90X3gqLywgaW50IC8qaG90X3kqLykKKyAgICB7CisgICAgcmV0dXJuIChXTWN1cnNvciopIDE7IC8vaGlpISBwcmV2ZW50cyBTREwgdG8gdmlldyBhIHN0ZCBjdXJzb3IKKyAgICB9CisKK3ZvaWQgRVBPQ19GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yKiAvKmN1cnNvciovKQorICAgIHsKKyAgICB9CisKK2ludCBFUE9DX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKKyAgICB7CisgICAgcmV0dXJuIHRydWU7ICAKKyAgICB9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0EyL1NETF9lcG9jdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0EyL1NETF9lcG9jdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWEzYTIwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTIvU0RMX2Vwb2N2aWRlby5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGRldm9sdXRpb24uY29tCisqLworCisjaWZuZGVmIEVQT0NWSURFT19ICisjZGVmaW5lIEVQT0NWSURFT19ICisKKyNpbmNsdWRlPHczMnN0ZC5oPgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICpfdGhpcworI2RlZmluZSBQcml2YXRlCV90aGlzLT5oaWRkZW4KKworY2xhc3MgQ0Zic0JpdG1hcDsKKworc3RydWN0IFNETF9WaWRlb0RldmljZTsKK3ZvaWQgRGlzYWJsZUtleUJsb2NraW5nKFNETF9WaWRlb0RldmljZSopOworCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgCisgICAgeworICAgIFRQb2ludAkJCQkJaVNjcmVlblBvczsKKyAgICBUQm9vbCAgICAgICAgICAgICAgICAgICBpSXNXaW5kb3dGb2N1c2VkOworICAgIFRTaXplICAgICAgICAgICAgICAgICAgIGlTd1N1cmZhY2VTaXplOworICAgIFRVaW50OCogICAgICAgICAgICAgICAgIGlTd1N1cmZhY2U7CisgICAgU0RMX1JlY3QJCQkJaVJlY3Q7IC8vc2FtZSBpbmZvIGluIFNETCBmb3JtYXQKKyAgICBTRExfUmVjdCogCQkJCWlSZWN0UHRyOworICAgIH07CisgICAgCisjZW5kaWYgICAgCisKKworCisgICAgCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N5bWJpYW4vRUtBMi9kc2EuY3BwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTIvZHNhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2IxYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTIvZHNhLmNwcApAQCAtMCwwICsxLDE1MDUgQEAKKyNpbmNsdWRlICJkc2EuaCIKKyNpbmNsdWRlICJzZGxlcG9jYXBpLmgiCisjaW5jbHVkZSA8Y2RzYi5oPgorCisKK0xPQ0FMX0MgVEludCBCeXRlc1BlclBpeGVsKFREaXNwbGF5TW9kZSBhTW9kZSkKKwl7CisJcmV0dXJuICgoVERpc3BsYXlNb2RlVXRpbHM6Ok51bURpc3BsYXlNb2RlQml0c1BlclBpeGVsKGFNb2RlKSAtIDEpID4+IDMpICsgMTsgCisJfQorCisKKworCit0ZW1wbGF0ZTxjbGFzcyBUPgorTk9OU0hBUkFCTEVfQ0xBU1MoQ0JpdG1hcFN1cmZhY2UpIDogcHVibGljIFQKKwl7CitwdWJsaWM6CisJQ0JpdG1hcFN1cmZhY2UoUldzU2Vzc2lvbiYgYVNlc3Npb24pOworcHJpdmF0ZToKKwl2b2lkIENvbnN0cnVjdEwoUldpbmRvdyYgYVdpbmRvdywgQ1dzU2NyZWVuRGV2aWNlJiBhRGV2aWNlKTsKKwl+Q0JpdG1hcFN1cmZhY2UoKTsKKwlUVWludDgqIExvY2tTdXJmYWNlKCk7CisJdm9pZCBVbmxvY2tId1N1cmZhY2UoKTsKKwl2b2lkIENyZWF0ZVN1cmZhY2VMKCk7CisJdm9pZCBXaXBlKFRJbnQgYUxlbmd0aCk7CisJdm9pZCBGcmVlKCk7CisJdm9pZCBVcGRhdGUoQ0Zic0JpdG1hcCYgYUJtcCk7CisJVEludCBFeHRlcm5hbFVwZGF0ZSgpOworcHJpdmF0ZToKKwlDRmJzQml0bWFwKiBpQm1wOworCUNGYnNCaXRtYXAqIGlDb3B5Qm1wOworCX07CisJCisKK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkIENCaXRtYXBTdXJmYWNlPFQ+OjpDb25zdHJ1Y3RMKFJXaW5kb3cmIGFXaW5kb3csIENXc1NjcmVlbkRldmljZSYgYURldmljZSkJCQorCXsKKwlkZWxldGUgaUNvcHlCbXA7CisJaUNvcHlCbXAgPSBOVUxMOworCWlDb3B5Qm1wID0gbmV3IChFTGVhdmUpIENGYnNCaXRtYXAoKTsKKwlUOjpDb25zdHJ1Y3RMKGFXaW5kb3csIGFEZXZpY2UpOworCX0KKwkKK3RlbXBsYXRlPGNsYXNzIFQ+CitDQml0bWFwU3VyZmFjZTxUPjo6Q0JpdG1hcFN1cmZhY2UoUldzU2Vzc2lvbiYgYVNlc3Npb24pIDogVChhU2Vzc2lvbikKKwl7CisJfQorCQordGVtcGxhdGU8Y2xhc3MgVD4KK3ZvaWQgQ0JpdG1hcFN1cmZhY2U8VD46OkZyZWUoKQorCXsKKwlkZWxldGUgaUJtcDsKKwlpQm1wID0gTlVMTDsKKwlUOjpGcmVlKCk7CisJfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorQ0JpdG1hcFN1cmZhY2U8VD46On5DQml0bWFwU3VyZmFjZSgpCisJeworCV9fQVNTRVJUX0RFQlVHKGlCbXAgPT0gTlVMTCwgUEFOSUMoS0Vyck5vdFJlYWR5KSk7CisJZGVsZXRlIGlDb3B5Qm1wOworCX0KKwkKK3RlbXBsYXRlPGNsYXNzIFQ+CitUVWludDgqIENCaXRtYXBTdXJmYWNlPFQ+OjpMb2NrU3VyZmFjZSgpCisJeworCWlCbXAtPkxvY2tIZWFwKCk7CisJcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VFVpbnQ4Kj4oaUJtcC0+RGF0YUFkZHJlc3MoKSk7CisJfQorCisKK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkIENCaXRtYXBTdXJmYWNlPFQ+OjpVbmxvY2tId1N1cmZhY2UoKQorCXsKKwlpQm1wLT5VbmxvY2tIZWFwKCk7CisJVDo6U2V0VXBkYXRpbmcoRUZhbHNlKTsKKwlVcGRhdGUoKmlCbXApOworCX0KKworCQordGVtcGxhdGU8Y2xhc3MgVD4JCit2b2lkIENCaXRtYXBTdXJmYWNlPFQ+OjpVcGRhdGUoQ0Zic0JpdG1hcCYgYUJtcCkKKwl7CisJaWYoIVQ6OkJsaXR0ZXIoYUJtcCkpCisJCXsKKwkJaWYoVDo6U3dTaXplKCkgPT0gVDo6SHdSZWN0KCkuU2l6ZSgpKQorCQkJVDo6R2MoKS5CaXRCbHQoVDo6SHdSZWN0KCkuaVRsLCAmYUJtcCk7CisJCWVsc2UKKwkJCVQ6OkdjKCkuRHJhd0JpdG1hcChUOjpId1JlY3QoKSwgJmFCbXApOworCQl9CisJVDo6RHJhd092ZXJsYXlzKCk7CisJVDo6Q29tcGxldGVVcGRhdGUoKTsJCisJfQorCQordGVtcGxhdGU8Y2xhc3MgVD4JCit2b2lkIENCaXRtYXBTdXJmYWNlPFQ+OjpDcmVhdGVTdXJmYWNlTCgpCisJeworCUZyZWUoKTsKKwlpQm1wICA9IG5ldyAoRUxlYXZlKSBDRmJzQml0bWFwKCk7CisJVXNlcjo6TGVhdmVJZkVycm9yKGlCbXAtPkNyZWF0ZShUOjpTd1NpemUoKSwgVDo6RGlzcGxheU1vZGUoKSkpOworCVQ6OkNyZWF0ZVN1cmZhY2VMKCppQm1wKTsKKwl9CisKK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkIENCaXRtYXBTdXJmYWNlPFQ+OjpXaXBlKFRJbnQgYUxlbmd0aCkgLy9kb250IGNhbGwgaW4gZHJhd2luZworCXsKKwlpQm1wLT5Mb2NrSGVhcCgpOworCU1lbTo6RmlsbFooaUJtcC0+RGF0YUFkZHJlc3MoKSwgYUxlbmd0aCk7CisJaUJtcC0+VW5sb2NrSGVhcCgpOworCX0KKwordGVtcGxhdGU8Y2xhc3MgVD4JCQorVEludCBDQml0bWFwU3VyZmFjZTxUPjo6RXh0ZXJuYWxVcGRhdGUoKQorCXsKKwlpZihpQ29weUJtcC0+SGFuZGxlKCkgPT0gMCkKKwkJeworCQljb25zdCBUSW50IGVyciA9IGlDb3B5Qm1wLT5EdXBsaWNhdGUoaUJtcC0+SGFuZGxlKCkpOworCQlpZihlcnIgIT0gS0Vyck5vbmUpCisJCQlyZXR1cm4gZXJyOworCQl9CisJVXBkYXRlKCppQ29weUJtcCk7CisJcmV0dXJuIEtFcnJOb25lOworCX0KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCitOT05TSEFSQUJMRV9DTEFTUyhDRHNhQml0Z2RpKSA6IHB1YmxpYyBDRHNhCisJeworcHVibGljOgorCUNEc2FCaXRnZGkoUldzU2Vzc2lvbiYgYVNlc3Npb24pOworcHJvdGVjdGVkOgorCSB2b2lkIENvbnN0cnVjdEwoUldpbmRvdyYgYVdpbmRvdywgQ1dzU2NyZWVuRGV2aWNlJiBhRGV2aWNlKTsKKwkgQ0JpdG1hcENvbnRleHQmIEdjKCk7CisJIHZvaWQgQ29tcGxldGVVcGRhdGUoKTsKKwkgfkNEc2FCaXRnZGkoKTsKKwkgdm9pZCBDcmVhdGVTdXJmYWNlTChDRmJzQml0bWFwJiBhQm1wKTsKKwkgdm9pZCBGcmVlKCk7CisJIHZvaWQgVW5sb2NrSFdTdXJmYWNlUmVxdWVzdENvbXBsZXRlKCk7Citwcml2YXRlOgorCSB2b2lkIFJlc3VtZSgpOworCSAKKwkgQ0Zic0JpdEdjKiBpR2M7CisJIENGYnNEZXZpY2UqIGlEZXZpY2U7CisJIENGYnNCaXRtYXAqIGlCaXRHZGlCbXA7CisJIENXaW5kb3dHYyogaVdpbkdjOworCSBSV2luZG93KiBpV2luZG93OworCSBUSW50IGlIYW5kbGU7CisJIH07CisKKworQ0RzYUJpdGdkaTo6Q0RzYUJpdGdkaShSV3NTZXNzaW9uJiBhU2Vzc2lvbikgOiBDRHNhKGFTZXNzaW9uKQorCXsKKwl9CisKK0NEc2FCaXRnZGk6On5DRHNhQml0Z2RpKCkKKwl7CisJZGVsZXRlIGlXaW5HYzsKKwlkZWxldGUgaUJpdEdkaUJtcDsKKwl9CisKK3ZvaWQgQ0RzYUJpdGdkaTo6Q29tcGxldGVVcGRhdGUoKQorCXsKKwlFcG9jU2RsRW52OjpSZXF1ZXN0KENEc2E6OkVSZXF1ZXN0VXBkYXRlKTsKKwl9CisKKwkKK3ZvaWQgQ0RzYUJpdGdkaTo6VW5sb2NrSFdTdXJmYWNlUmVxdWVzdENvbXBsZXRlKCkKKwl7CisJaWYoaUhhbmRsZSA9PSAwKQorCQlyZXR1cm47CisJCisJaWYoaUJpdEdkaUJtcCA9PSBOVUxMKQorCQl7CisJCWlCaXRHZGlCbXAgPSBuZXcgQ0Zic0JpdG1hcCgpOworCQlpZihpQml0R2RpQm1wID09IE5VTEwpCisJCQlyZXR1cm47CisJCWlCaXRHZGlCbXAtPkR1cGxpY2F0ZShpSGFuZGxlKTsKKwkJfQorCQorCWlXaW5kb3ctPkludmFsaWRhdGUoKTsKKwkKKwlpV2luZG93LT5CZWdpblJlZHJhdygpOworCWlXaW5HYy0+QWN0aXZhdGUoKmlXaW5kb3cpOworCWlXaW5HYy0+Qml0Qmx0KFRQb2ludCgwLCAwKSwgaUJpdEdkaUJtcCk7CisJaVdpbkdjLT5EZWFjdGl2YXRlKCk7CisJaVdpbmRvdy0+RW5kUmVkcmF3KCk7CisJfQkKKwkKK3ZvaWQgQ0RzYUJpdGdkaTo6UmVzdW1lKCkKKwl7CisJU3RhcnQoKTsKKwl9CisJCitDQml0bWFwQ29udGV4dCYgQ0RzYUJpdGdkaTo6R2MoKQorIAl7CisgCXJldHVybiAqaUdjOworIAl9CisgCQorIHZvaWQgQ0RzYUJpdGdkaTo6Q29uc3RydWN0TChSV2luZG93JiBhV2luZG93LCBDV3NTY3JlZW5EZXZpY2UmIGFEZXZpY2UpCisgCXsKKyAJCisgCWRlbGV0ZSBpQml0R2RpQm1wOworIAlpQml0R2RpQm1wID0gTlVMTDsKKyAJZGVsZXRlIGlXaW5HYzsKKyAJaVdpbkdjID0gTlVMTDsKKyAJaUhhbmRsZSA9IDA7CisgCQorIAlpV2luZG93ID0gJmFXaW5kb3c7CisgCVVzZXI6OkxlYXZlSWZFcnJvcihhRGV2aWNlLkNyZWF0ZUNvbnRleHQoaVdpbkdjKSk7CisgCUNEc2E6OkNvbnN0cnVjdEwoYVdpbmRvdywgYURldmljZSk7CisgCVN0YXJ0KCk7CisgCX0KKyAJCit2b2lkIENEc2FCaXRnZGk6OkNyZWF0ZVN1cmZhY2VMKENGYnNCaXRtYXAmIGFCbXApCQorCXsKKwlpRGV2aWNlID0gQ0Zic0JpdG1hcERldmljZTo6TmV3TCgmYUJtcCk7CisJVXNlcjo6TGVhdmVJZkVycm9yKGlEZXZpY2UtPkNyZWF0ZUNvbnRleHQoaUdjKSk7CisJaUhhbmRsZSA9IGFCbXAuSGFuZGxlKCk7CisJfQorCQordm9pZCBDRHNhQml0Z2RpOjpGcmVlKCkKKwl7CisJZGVsZXRlIGlHYzsKKwlpR2MgPSBOVUxMOworCWRlbGV0ZSBpRGV2aWNlOworCWlEZXZpY2UgPSBOVUxMOworCX0KKwkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTk9OU0hBUkFCTEVfQ0xBU1MoQ0RzYUJhc2UpIDogcHVibGljIENEc2EsIHB1YmxpYyBNRGlyZWN0U2NyZWVuQWNjZXNzCisJeworcHJvdGVjdGVkOgkKKwlpbmxpbmUgQ0RpcmVjdFNjcmVlbkFjY2VzcyYgRHNhKCkgY29uc3Q7CisJQ0RzYUJhc2UoUldzU2Vzc2lvbiYgYVNlc3Npb24pOworCX5DRHNhQmFzZSgpOworCXZvaWQgQ29uc3RydWN0TChSV2luZG93JiBhV2luZG93LCBDV3NTY3JlZW5EZXZpY2UmIGFEZXZpY2UpOworCXZvaWQgU3RvcCgpOworCXZvaWQgUmVzdW1lKCk7CisJQ0JpdG1hcENvbnRleHQmIEdjKCk7Citwcm90ZWN0ZWQ6CisgICAgQ0RpcmVjdFNjcmVlbkFjY2VzcyogIGlEc2E7Citwcml2YXRlOgorCXZvaWQgQWJvcnROb3coUkRpcmVjdFNjcmVlbkFjY2Vzczo6VFRlcm1pbmF0aW9uUmVhc29ucyBhUmVhc29uKTsKKwl2b2lkIFJlc3RhcnQoUkRpcmVjdFNjcmVlbkFjY2Vzczo6VFRlcm1pbmF0aW9uUmVhc29ucyBhUmVhc29uKTsKK3ByaXZhdGU6CisJdm9pZCBSZXN0YXJ0TCgpOworCX07CisKKworaW5saW5lIENEaXJlY3RTY3JlZW5BY2Nlc3MmIENEc2FCYXNlOjpEc2EoKSBjb25zdAorCXsKKwlyZXR1cm4gKmlEc2E7CisJfQorCQorCitDRHNhQmFzZTo6Q0RzYUJhc2UoUldzU2Vzc2lvbiYgYVNlc3Npb24pIDogQ0RzYShhU2Vzc2lvbikKKwl7CisJfQorCQorQ0JpdG1hcENvbnRleHQmIENEc2FCYXNlOjpHYygpCisJeworCXJldHVybiAqRHNhKCkuR2MoKTsKKwl9CisJCit2b2lkIENEc2FCYXNlOjpDb25zdHJ1Y3RMKFJXaW5kb3cmIGFXaW5kb3csIENXc1NjcmVlbkRldmljZSYgYURldmljZSkKKyAgICB7CisgICAgQ0RzYTo6Q29uc3RydWN0TChhV2luZG93LCBhRGV2aWNlKTsKKyAgICBpZihpRHNhICE9IE5VTEwpCisgICAgCXsKKyAgICAJaURzYS0+Q2FuY2VsKCk7CisgICAgCWRlbGV0ZSBpRHNhOworICAgIAlpRHNhID0gTlVMTDsKKyAgICAJfQorICAgIAkKKyAgICBpRHNhID0gQ0RpcmVjdFNjcmVlbkFjY2Vzczo6TmV3TCgKKyAgICAJCQkJU2Vzc2lvbigpLAorCQkJCQlhRGV2aWNlLAorCQkJCQlhV2luZG93LAorCQkJCQkqdGhpcyk7CQkJCQorICAgIFJlc3RhcnRMKCk7CisgICAgfQkKKwkKK3ZvaWQgQ0RzYUJhc2U6OlJlc3VtZSgpCQorCXsKKwlpZihTdG9wcGVkKCkpCisJCVJlc3RhcnQoUkRpcmVjdFNjcmVlbkFjY2Vzczo6RVRlcm1pbmF0ZVJlZ2lvbik7CisJfQkKKwkKK0NEc2FCYXNlOjp+Q0RzYUJhc2UoKQorCXsKKwlpZihpRHNhICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgaURzYS0+Q2FuY2VsKCk7CisgICAgICAgIH0KKyAgICBkZWxldGUgaURzYTsKKwl9CisJCisJCit2b2lkIENEc2FCYXNlOjpSZXN0YXJ0TCgpCisgICAgeworICAgCisgICAgCisgICAgaURzYS0+U3RhcnRMKCk7CQorICAgIAorICAgIGNvbnN0IFJSZWdpb24qIHIgPSBpRHNhLT5EcmF3aW5nUmVnaW9uKCk7CisgICAgY29uc3QgVFJlY3QgcmVjdCA9IHItPkJvdW5kaW5nUmVjdCgpOworICAgIGlEc2EtPkdjKCktPlNldENsaXBwaW5nUmVnaW9uKHIpOwkKKyAgIAorICAgIGlmKHJlY3QgIT0gU2NyZWVuUmVjdCgpKQorICAgIAl7CisgICAgCXJldHVybiA7CQorICAgCSAJfQorICAgCSAJCisgICAgIAorICAgCVNldFRhcmdldFJlY3QoKTsKKwlSZWNyZWF0ZUwoKTsKKwkKKwlTdGFydCgpOworICAgIAorICAgIAorICAgIH0KKwordm9pZCBDRHNhQmFzZTo6QWJvcnROb3coUkRpcmVjdFNjcmVlbkFjY2Vzczo6VFRlcm1pbmF0aW9uUmVhc29ucyAvKmFSZWFzb24qLykKKwl7CisJU3RvcCgpOworCX0KKwkKK3ZvaWQgQ0RzYUJhc2U6OlJlc3RhcnQoUkRpcmVjdFNjcmVlbkFjY2Vzczo6VFRlcm1pbmF0aW9uUmVhc29ucyBhUmVhc29uKQorCXsKKwlpZihhUmVhc29uID09IFJEaXJlY3RTY3JlZW5BY2Nlc3M6OkVUZXJtaW5hdGVSZWdpb24pIC8vYXV0byByZXN0YXJ0CisJCXsJCQkJCQkJCQkJCQkKKwkJVFJBUEQoZXJyLCBSZXN0YXJ0TCgpKTsKKwkJUEFOSUNfSUZfRVJST1IoZXJyKTsKKwkJfQorCX0KKwkKKwkKK3ZvaWQgQ0RzYUJhc2U6OlN0b3AoKQorCXsKKwlDRHNhOjpTdG9wKCk7CisJaURzYS0+Q2FuY2VsKCk7CisJfQorCQkKKyAgICAKKyAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAKK05PTlNIQVJBQkxFX0NMQVNTKFREc2EpCisJeworCXB1YmxpYzoKKwkJaW5saW5lIFREc2EoY29uc3QgQ0RzYSYgYURzYSk7CisJCWlubGluZSBUQm9vbCBJc0ZsaXAoKSBjb25zdDsKKwkJaW5saW5lIFRCb29sIElzVHVybigpIGNvbnN0OworCQlpbmxpbmUgY29uc3QgVFNpemUmIFN3U2l6ZSgpIGNvbnN0OworCQlpbmxpbmUgdm9pZCBDb3B5KFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNyYywgVEludCBhQnl0ZXMsIFRJbnQgYUhlaWdodCkgY29uc3Q7CisJcHJpdmF0ZToKKwkJY29uc3QgQ0RzYSYgaURzYTsKKwl9OworCisKKworCitpbmxpbmUgVERzYTo6VERzYShjb25zdCBDRHNhJiBhRHNhKSA6IGlEc2EoYURzYSkKKwl7CQorCX0KKworaW5saW5lIFRCb29sIFREc2E6OklzVHVybigpIGNvbnN0CisJeworCXJldHVybiBpRHNhLmlTdGF0ZUZsYWdzICYgQ0RzYTo6RU9yaWVudGF0aW9uOTA7CisJfQorCQoraW5saW5lIFRCb29sIFREc2E6OklzRmxpcCgpIGNvbnN0CisJeworCXJldHVybiBpRHNhLmlTdGF0ZUZsYWdzICYgQ0RzYTo6RU9yaWVudGF0aW9uMTgwOworCX0JCisJCitpbmxpbmUgY29uc3QgVFNpemUmIFREc2E6OlN3U2l6ZSgpIGNvbnN0CisJeworCXJldHVybiBpRHNhLlN3U2l6ZSgpOworCX0KKwkJCitpbmxpbmUgdm9pZCBURHNhOjpDb3B5KFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNyYywgVEludCBhQnl0ZXMsIFRJbnQgYUhlaWdodCkgY29uc3QKKwl7CisJaURzYS5pQ29weUZ1bmN0aW9uKGlEc2EsIGFUYXJnZXQsIGFTcmMsIGFCeXRlcywgYUhlaWdodCk7CisJfQorCQordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUz4JCit2b2lkIENsaXBDb3B5KGNvbnN0IFREc2EmIGlEc2EsIFRVaW50OCogYVRhcmdldCwKKyAJCQkJCWNvbnN0IFRVaW50OCogYVNvdXJjZSwKKyAJCQkJCWNvbnN0IFRSZWN0JiBhVXBkYXRlUmVjdCwKKyAJCQkJCWNvbnN0IFRSZWN0JiBhU291cmNlUmVjdCkKKwl7CisJY29uc3QgUyogc291cmNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTKj4oYVNvdXJjZSk7CisJY29uc3QgVEludCBsaW5lV2lkdGggPSBhU291cmNlUmVjdC5XaWR0aCgpOworCQorCXNvdXJjZSArPSAoYVVwZGF0ZVJlY3QuaVRsLmlZICogbGluZVdpZHRoKTsgCisJY29uc3QgVEludCBzb3VyY2VTdGFydE9mZnNldCA9IGFVcGRhdGVSZWN0LmlUbC5pWDsKKwlzb3VyY2UgKz0gc291cmNlU3RhcnRPZmZzZXQ7CisJCisJVCogdGFyZ2V0UHRyID0gcmVpbnRlcnByZXRfY2FzdDxUKj4oYVRhcmdldCk7CisJCisJY29uc3QgVEludCBzY2FuTGluZVdpZHRoID0gaURzYS5Td1NpemUoKS5pV2lkdGg7CisJCisJdGFyZ2V0UHRyICs9IChhU291cmNlUmVjdC5pVGwuaVkgKyBhVXBkYXRlUmVjdC5pVGwuaVkgKSAqIHNjYW5MaW5lV2lkdGg7IAorCWNvbnN0IFRJbnQgdGFyZ2V0U3RhcnRPZmZzZXQgPSAoYVVwZGF0ZVJlY3QuaVRsLmlYICsgYVNvdXJjZVJlY3QuaVRsLmlYKTsKKwkKKwl0YXJnZXRQdHIgKz0gdGFyZ2V0U3RhcnRPZmZzZXQ7CisJCisJCisJY29uc3QgVEludCBoZWlnaHQgPSBhVXBkYXRlUmVjdC5IZWlnaHQoKTsgCisJCQorCWNvbnN0IFRJbnQgbGluZU1vdmUgPSBpRHNhLklzVHVybigpID8gMSA6IGxpbmVXaWR0aDsKKwljb25zdCBUSW50IGNvcHlMZW4gPSBhVXBkYXRlUmVjdC5XaWR0aCgpOworCQorCQorCWlmKGlEc2EuSXNGbGlwKCkpCisJCXsKKwkJCisJCXRhcmdldFB0ciArPSBzY2FuTGluZVdpZHRoICogIChoZWlnaHQgLSAxKTsKKwkKKwkJZm9yKFRJbnQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgLy9zb3VyY2UgaXMgYWx3YXlzIHNtYWxsZXIKKwkJCXsKKwkJCWlEc2EuQ29weShyZWludGVycHJldF9jYXN0PFRVaW50MzIqPih0YXJnZXRQdHIpLCByZWludGVycHJldF9jYXN0PGNvbnN0IFRVaW50OCo+KHNvdXJjZSksIGNvcHlMZW4sIGhlaWdodCk7CisJCQlzb3VyY2UgKz0gbGluZU1vdmU7CisJCQl0YXJnZXRQdHIgLT0gc2NhbkxpbmVXaWR0aDsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQkKKwkJCisJCWZvcihUSW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIC8vc291cmNlIGlzIGFsd2F5cyBzbWFsbGVyCisJCQl7CisJCQlpRHNhLkNvcHkocmVpbnRlcnByZXRfY2FzdDxUVWludDMyKj4odGFyZ2V0UHRyKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUVWludDgqPihzb3VyY2UpLCBjb3B5TGVuLCBoZWlnaHQpOworCQkJc291cmNlICs9IGxpbmVNb3ZlOworCQkJdGFyZ2V0UHRyICs9IHNjYW5MaW5lV2lkdGg7IC8vID4+IDI7CisJCQl9CisJCX0KKworCX0KKwkKKworIAorTk9OU0hBUkFCTEVfQ0xBU1MoQ0RzYUEpIDogcHVibGljIENEc2FCYXNlCisJeworCXB1YmxpYzoKKwkJQ0RzYUEoUldzU2Vzc2lvbiYgYVNlc3Npb24pOworCXByb3RlY3RlZDoKKwkJdm9pZCBDb25zdHJ1Y3RMKFJXaW5kb3cmIGFXaW5kb3csIENXc1NjcmVlbkRldmljZSYgYURldmljZSk7CisJCXZvaWQgQ29tcGxldGVVcGRhdGUoKTsKKwkJdm9pZCBDcmVhdGVTdXJmYWNlTChDRmJzQml0bWFwJiBhQm1wKTsKKwkJdm9pZCBGcmVlKCk7CisJCXZvaWQgVW5sb2NrSFdTdXJmYWNlUmVxdWVzdENvbXBsZXRlKCk7CQorCX07CisJCisJCitDRHNhQTo6Q0RzYUEoUldzU2Vzc2lvbiYgYVNlc3Npb24pIDogQ0RzYUJhc2UoYVNlc3Npb24pCisJeworCX0KKwkKKwordm9pZCBDRHNhQTo6Q29uc3RydWN0TChSV2luZG93JiBhV2luZG93LCBDV3NTY3JlZW5EZXZpY2UmIGFEZXZpY2UpCQkKKwl7CisJQ0RzYUJhc2U6OkNvbnN0cnVjdEwoYVdpbmRvdywgYURldmljZSk7CisJfQorCQordm9pZCBDRHNhQTo6Q29tcGxldGVVcGRhdGUoKQorCXsKKwlpRHNhLT5TY3JlZW5EZXZpY2UoKS0+VXBkYXRlKCk7CisJfQorCQordm9pZCBDRHNhQTo6Q3JlYXRlU3VyZmFjZUwoQ0Zic0JpdG1hcCYgLyphQm1wKi8pCisJeworCX0KKwkKK3ZvaWQgQ0RzYUE6OkZyZWUoKQorCXsKKwkKKwl9CisJCit2b2lkIENEc2FBOjpVbmxvY2tIV1N1cmZhY2VSZXF1ZXN0Q29tcGxldGUoKQorCXsKKwlQQU5JQyhLRXJyTm90U3VwcG9ydGVkKTsKKwl9CQorCQorCQorCQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK05PTlNIQVJBQkxFX0NMQVNTKE1Ec2JPYnMpCisJeworCXB1YmxpYzoKKwkJdmlydHVhbCB2b2lkIFN1cmZhY2VSZWFkeSgpID0gMDsKKwkJdmlydHVhbCBDRGlyZWN0U2NyZWVuQml0bWFwJiBEc2IoKSA9IDA7CisJfTsKKwkKK05PTlNIQVJBQkxFX0NMQVNTKENEc2JTdXJmYWNlKSA6IHB1YmxpYyBDQWN0aXZlCisJeworCXB1YmxpYzoKKwkJQ0RzYlN1cmZhY2UoTURzYk9icyYgYURzYik7CisJCVRVaW50OCogQWRkcmVzcygpOworCQl2b2lkIENvbXBsZXRlKCk7CisJCX5DRHNiU3VyZmFjZSgpOworCXByaXZhdGU6CisJCXZvaWQgUnVuTCgpOworCQl2b2lkIERvQ2FuY2VsKCk7CisJcHJpdmF0ZToKKwkJTURzYk9icyYgaURzYjsgCisJCVRVaW50OCogaUFkZHJlc3M7CisJfTsJCisKK0NEc2JTdXJmYWNlOjpDRHNiU3VyZmFjZShNRHNiT2JzJiBhRHNiKSA6IENBY3RpdmUoQ0FjdGl2ZTo6RVByaW9yaXR5SGlnaCkgLCBpRHNiKGFEc2IpCisJeworCUNBY3RpdmVTY2hlZHVsZXI6OkFkZCh0aGlzKTsKKwl9CisKK0NEc2JTdXJmYWNlOjp+Q0RzYlN1cmZhY2UoKQorCXsKKwlDYW5jZWwoKTsKKwl9CisJCit2b2lkIENEc2JTdXJmYWNlOjpDb21wbGV0ZSgpCisJeworCWlmKGlBZGRyZXNzICE9IE5VTEwgJiYgIUlzQWN0aXZlKCkpCisJCXsKKwkJaUFkZHJlc3MgPSBOVUxMOworCQlTZXRBY3RpdmUoKTsKKwkJaURzYi5Ec2IoKS5FbmRVcGRhdGUoaVN0YXR1cyk7CisJCX0KKwl9CisJCitUVWludDgqIENEc2JTdXJmYWNlOjpBZGRyZXNzKCkKKwl7CisJaWYoaUFkZHJlc3MgPT0gTlVMTCAmJiAhSXNBY3RpdmUoKSkKKwkJeworCQlUQWNjZWxlcmF0ZWRCaXRtYXBJbmZvIGluZm87CisJCWlmKEtFcnJOb25lID09IGlEc2IuRHNiKCkuQmVnaW5VcGRhdGUoaW5mbykpCisJCQlpQWRkcmVzcyA9IGluZm8uaUFkZHJlc3M7CisJCX0KKwlyZXR1cm4gaUFkZHJlc3M7CisJfQorCQordm9pZCBDRHNiU3VyZmFjZTo6UnVuTCgpCisJeworCWlEc2IuU3VyZmFjZVJlYWR5KCk7CisJfQorCit2b2lkIENEc2JTdXJmYWNlOjpEb0NhbmNlbCgpCisJeworCS8vZW1wdHkKKwl9CisJCQorTk9OU0hBUkFCTEVfQ0xBU1MoQ0RzYUIpIDogcHVibGljIENEc2FCYXNlLAorIHB1YmxpYyBNRHNiT2JzCisJeworCXB1YmxpYzoKKwkJQ0RzYUIoUldzU2Vzc2lvbiYgYVNlc3Npb24sIFRJbnQgYUZsYWdzKTsKKwlwcml2YXRlOgorCQl+Q0RzYUIoKTsKKwkJVFVpbnQ4KiBMb2NrU3VyZmFjZSgpOworCQl2b2lkIFVubG9ja0hXU3VyZmFjZVJlcXVlc3RDb21wbGV0ZSgpOworCQl2b2lkIFVubG9ja0h3U3VyZmFjZSgpOworCQl2b2lkIENyZWF0ZVN1cmZhY2VMKCk7CisJCXZvaWQgV2lwZShUSW50IGFMZW5ndGgpOworCQl2b2lkIFJlY3JlYXRlTCgpOworCQl2b2lkIENvbnN0cnVjdEwoUldpbmRvdyYgYVdpbmRvdywgQ1dzU2NyZWVuRGV2aWNlJiBhRGV2aWNlKTsKKwkJQ0RpcmVjdFNjcmVlbkJpdG1hcCYgRHNiKCk7CisJCXZvaWQgU3VyZmFjZVJlYWR5KCk7CisJCVRJbnQgRXh0ZXJuYWxVcGRhdGUoKTsKKwlwcml2YXRlOgorCQlDRHNiU3VyZmFjZSogaVN1cmZhY2UxOworCQlDRHNiU3VyZmFjZSogaVN1cmZhY2UyOworCQlDRGlyZWN0U2NyZWVuQml0bWFwKiBpRHNiOworCQlUSW50IGlUeXBlOworCX07CisKK0NEc2FCOjpDRHNhQihSV3NTZXNzaW9uJiBhU2Vzc2lvbiwgVEludCBhRmxhZ3MpIDogQ0RzYUJhc2UoYVNlc3Npb24pLCBpVHlwZShhRmxhZ3MpCisJeworCX0KKworCisJCit2b2lkIENEc2FCOjpVbmxvY2tIV1N1cmZhY2VSZXF1ZXN0Q29tcGxldGUoKQorCXsKKwlpU3VyZmFjZTEtPkNvbXBsZXRlKCk7CisJaWYoaVN1cmZhY2UyICE9IE5VTEwpCisJCWlTdXJmYWNlMi0+Q29tcGxldGUoKTsKKwl9CQorCit2b2lkIENEc2FCOjpDcmVhdGVTdXJmYWNlTCgpCisJeworCV9fQVNTRVJUX0FMV0FZUyhTd1NpemUoKSA9PSBId1JlY3QoKS5TaXplKCksIFBBTklDKEtFcnJOb3RTdXBwb3J0ZWQpKTsKKwl9CisJCit2b2lkIENEc2FCOjpXaXBlKFRJbnQgYUxlbmd0aCkgLy9kb250IGNhbGwgaW4gZHJhd2luZworCXsKKwlUVWludDgqIGFkZHIgPSBMb2NrU3VyZmFjZSgpOworCWlmKGFkZHIgIT0gTlVMTCkgCisJCXsKKwkJTWVtOjpGaWxsWihhZGRyLCBhTGVuZ3RoKTsKKwkJVW5sb2NrSHdTdXJmYWNlKCk7CisJCX0KKwl9CisJCisKK3ZvaWQgQ0RzYUI6OlVubG9ja0h3U3VyZmFjZSgpCisJeworCUVwb2NTZGxFbnY6OlJlcXVlc3QoQ0RzYTo6RVJlcXVlc3RVcGRhdGUpOworCX0KKwkKK1RVaW50OCogQ0RzYUI6OkxvY2tTdXJmYWNlKCkKKwl7CisJVFVpbnQ4KiBhZGRyID0gIGlTdXJmYWNlMS0+QWRkcmVzcygpOworCWlmKGFkZHIgPT0gTlVMTCAmJiBpU3VyZmFjZTIgIT0gTlVMTCkKKwkJYWRkciA9ICBpU3VyZmFjZTItPkFkZHJlc3MoKTsKKwlTZXRVcGRhdGluZyhhZGRyID09IE5VTEwpOworCXJldHVybiBhZGRyOworCX0KKwkKK3ZvaWQgQ0RzYUI6OlN1cmZhY2VSZWFkeSgpCQorCXsKKwlTZXRVcGRhdGluZyhFRmFsc2UpOworCX0KKworQ0RpcmVjdFNjcmVlbkJpdG1hcCYgQ0RzYUI6OkRzYigpCisJeworCXJldHVybiAqaURzYjsKKwl9CisJCit2b2lkIENEc2FCOjpDb25zdHJ1Y3RMKFJXaW5kb3cmIGFXaW5kb3csIENXc1NjcmVlbkRldmljZSYgYURldmljZSkKKwl7CisJaWYoaURzYiA9PSBOVUxMKQorCQlpRHNiID0gQ0RpcmVjdFNjcmVlbkJpdG1hcDo6TmV3TCgpOwkKKwlDRHNhQmFzZTo6Q29uc3RydWN0TChhV2luZG93LCBhRGV2aWNlKTsKKwlpZihpU3VyZmFjZTEgPT0gTlVMTCkJCisJCWlTdXJmYWNlMSA9IG5ldyAoRUxlYXZlKSBDRHNiU3VyZmFjZSgqdGhpcyk7CisJaWYoaVN1cmZhY2UyID09IE5VTEwgJiYgaVR5cGUgJiBDRGlyZWN0U2NyZWVuQml0bWFwOjpFRG91YmxlQnVmZmVyKQorCQlpU3VyZmFjZTIgPSBuZXcgKEVMZWF2ZSkgQ0RzYlN1cmZhY2UoKnRoaXMpOworCX0KKwkKK0NEc2FCOjp+Q0RzYUIoKQorCXsKKwlkZWxldGUgaVN1cmZhY2UxOworCWRlbGV0ZSBpU3VyZmFjZTI7CisJZGVsZXRlIGlEc2I7CisJfQkKKwordm9pZCBDRHNhQjo6UmVjcmVhdGVMKCkKKwl7CisgICAgaURzYi0+Q2xvc2UoKTsKKyAgICBpRHNiLT5DcmVhdGUoSHdSZWN0KCksIENEaXJlY3RTY3JlZW5CaXRtYXA6OlRTZXR0aW5nc0ZsYWdzKGlUeXBlKSk7CisJfQorCQorVEludCBDRHNhQjo6RXh0ZXJuYWxVcGRhdGUoKQorCXsKKwlpZihMb2NrU3VyZmFjZSgpKQorCQl7CisJCVVubG9ja0hXU3VyZmFjZVJlcXVlc3RDb21wbGV0ZSgpOworCQlyZXR1cm4gS0Vyck5vbmU7CisJCX0KKwlyZXR1cm4gS0Vyck5vdFJlYWR5OworCX0KKwkJCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCQorCisKKworQ0RzYSogQ0RzYTo6Q3JlYXRlTChSV3NTZXNzaW9uJiBhU2Vzc2lvbikKKwl7CisJaWYoRXBvY1NkbEVudjo6RmxhZ3MoQ1NETDo6RURyYXdNb2RlRFNCKSkKKwkJeworCQlUSW50IGZsYWdzID0gQ0RpcmVjdFNjcmVlbkJpdG1hcDo6RU5vbmU7CisJCWlmKEVwb2NTZGxFbnY6OkZsYWdzKENTREw6OkVEcmF3TW9kZURTQkRvdWJsZUJ1ZmZlcikpCisJCQlmbGFncyB8PSBDRGlyZWN0U2NyZWVuQml0bWFwOjpFRG91YmxlQnVmZmVyOworCQlpZihFcG9jU2RsRW52OjpGbGFncyhDU0RMOjpFRHJhd01vZGVEU0JJbmNyZW1lbnRhbFVwZGF0ZSkpCisJCQlmbGFncyB8PSBDRGlyZWN0U2NyZWVuQml0bWFwOjpFSW5jcmVtZW50YWxVcGRhdGU7CisJCXJldHVybiBuZXcgKEVMZWF2ZSkgQ0RzYUIoYVNlc3Npb24sIGZsYWdzKTsKKwkJfQorCWVsc2UgaWYoRXBvY1NkbEVudjo6RmxhZ3MoQ1NETDo6RURyYXdNb2RlR2RpKSkKKwkJeworCQlyZXR1cm4gbmV3IChFTGVhdmUpIENCaXRtYXBTdXJmYWNlPENEc2FCaXRnZGk+KGFTZXNzaW9uKTsKKwkJfQorICAgIGVsc2UKKyAgICAJeworICAgICAgICByZXR1cm4gbmV3IChFTGVhdmUpIENCaXRtYXBTdXJmYWNlPENEc2FBPihhU2Vzc2lvbik7CisJCX0KKwl9CisJCisJCit2b2lkIENEc2E6OlJlY3JlYXRlTCgpCisJeworCX0KKwordm9pZCBDRHNhOjpGcmVlKCkKKwl7CisJfQorCQorVFNpemUgQ0RzYTo6V2luZG93U2l6ZSgpIGNvbnN0CisJeworCVRTaXplIHNpemUgPSBpU3dTaXplOworCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uOTApCisJCXsKKwkJY29uc3QgVEludCB0bXAgPSBzaXplLmlXaWR0aDsKKwkJc2l6ZS5pV2lkdGggPSBzaXplLmlIZWlnaHQ7CisJCXNpemUuaUhlaWdodCA9IHRtcDsKKwkJfQorCXJldHVybiBzaXplOworCX0KKwkKK3ZvaWQgQ0RzYTo6U2V0U3VzcGVuZCgpCisJeworCWlTdGF0ZUZsYWdzIHw9IEVTZGxUaHJlYWRTdXNwZW5kOworCX0KKworCit2b2lkIENEc2E6OlNldFVwZGF0aW5nKFRCb29sIGFVcGRhdGUpCisJeworCWlmKGFVcGRhdGUpCisJCWlTdGF0ZUZsYWdzIHw9IEVVcGRhdGluZzsKKwllbHNlCisJCWlTdGF0ZUZsYWdzICY9IH5FVXBkYXRpbmc7CisJfQorCisKK1RCb29sIENEc2E6OlN0b3BwZWQoKSBjb25zdAorCXsKKwlyZXR1cm4gKGlTdGF0ZUZsYWdzICYgRVNkbFRocmVhZEV4cGxpY2l0U3RvcCk7CisJfQorCit2b2lkIENEc2E6OlNldE9yaWVudGF0aW9uKENTREw6OlRPcmllbnRhdGlvbk1vZGUgYU9yaWVudGF0aW9uKQorCXsKKwlUSW50IGZsYWdzID0gMDsKKwlzd2l0Y2goYU9yaWVudGF0aW9uKQorCQl7CisJCWNhc2UgQ1NETDo6RU9yaWVudGF0aW9uOTA6CisJCQlmbGFncyA9IEVPcmllbnRhdGlvbjkwOworCQkJYnJlYWs7CisJCWNhc2UgQ1NETDo6RU9yaWVudGF0aW9uMTgwOgorCQkJZmxhZ3MgPSBFT3JpZW50YXRpb24xODA7CisJCQlicmVhazsKKwkJY2FzZSBDU0RMOjpFT3JpZW50YXRpb24yNzA6CisJCQlmbGFncyA9IEVPcmllbnRhdGlvbjkwIHwgRU9yaWVudGF0aW9uMTgwOworCQkJYnJlYWs7CisJCWNhc2UgQ1NETDo6RU9yaWVudGF0aW9uMDoKKwkJCWZsYWdzID0gMDsKKwkJCWJyZWFrOworCQl9CisJaWYoZmxhZ3MgIT0gKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uRmxhZ3MpKQorCQl7CisJCWlTdGF0ZUZsYWdzIHw9IEVPcmllbnRhdGlvbkNoYW5nZWQ7CisJCWlOZXdGbGFncyA9IGZsYWdzOyAvL2Nhbm5vdCBiZSBzZXQgZHVyaW5nIGRyYXdpbmcuLi4KKwkJfQorCX0KKworQ0RzYTo6fkNEc2EoKQorICAgIHsKKyAgICBpT3ZlcmxheXMuQ2xvc2UoKTsKKyAgICBVc2VyOjpGcmVlKGlMdXQyNTYpOworICAgIH0KKyAgICAgICAgIAordm9pZCBDRHNhOjpDb25zdHJ1Y3RMKFJXaW5kb3cmIGFXaW5kb3csIENXc1NjcmVlbkRldmljZSYgLyphRGV2aWNlKi8pCisgICAgewkJCQorCWlmKGlMdXQyNTYgPT0gTlVMTCkKKwkJaUx1dDI1NiA9IChUVWludDMyKikgVXNlcjo6QWxsb2NMKDI1NiAqIHNpemVvZihUVWludDMyKSk7CisJaVRhcmdldE1vZGUgPSBhV2luZG93LkRpc3BsYXlNb2RlKCk7CisJaVRhcmdldEJwcCA9IEJ5dGVzUGVyUGl4ZWwoRGlzcGxheU1vZGUoKSk7CisJaVNjcmVlblJlY3QgPSBUUmVjdChhV2luZG93LlBvc2l0aW9uKCksIGFXaW5kb3cuU2l6ZSgpKTsKKwlTZXRUYXJnZXRSZWN0KCk7CisgICAgfQorICAgIAordm9pZCBDRHNhOjpEcmF3T3ZlcmxheXMoKQorCXsKKwljb25zdCBUSW50IGxhc3QgPSBpT3ZlcmxheXMuQ291bnQoKSAtIDE7CisJZm9yKFRJbnQgaSA9IGxhc3Q7IGkgPj0gMCA7IGktLSkKKwkJaU92ZXJsYXlzW2ldLmlPdmVybGF5LT5EcmF3KEdjKCksIEh3UmVjdCgpLCBTd1NpemUoKSk7CisJfQorCitUSW50IENEc2E6OkFwcGVuZE92ZXJsYXkoTU92ZXJsYXkmIGFPdmVybGF5LCBUSW50IGFQcmlvcml0eSkKKwl7CisJVEludCBpOworCWZvcihpID0gMDsgaSA8IGlPdmVybGF5cy5Db3VudCgpICYmIGlPdmVybGF5c1tpXS5pUHJpb3JpdHkgPCBhUHJpb3JpdHk7IGkrKykKKwkJe30KKwljb25zdCBUT3ZlcmxheSBvdmVybGF5ID0geyZhT3ZlcmxheSwgYVByaW9yaXR5fTsKKwlyZXR1cm4gaU92ZXJsYXlzLkluc2VydChvdmVybGF5LCBpKTsKKwl9CisJCitUSW50IENEc2E6OlJlbW92ZU92ZXJsYXkoTU92ZXJsYXkmIGFPdmVybGF5KQorCXsKKwlmb3IoVEludCBpID0gMDsgaSA8IGlPdmVybGF5cy5Db3VudCgpOyBpKyspCisJCXsKKwkJaWYoaU92ZXJsYXlzW2ldLmlPdmVybGF5ID09ICZhT3ZlcmxheSkKKwkJCXsKKwkJCWlPdmVybGF5cy5SZW1vdmUoaSk7CisJCQlyZXR1cm4gS0Vyck5vbmU7CisJCQl9CisJCX0KKwlyZXR1cm4gS0Vyck5vdEZvdW5kOworCX0KKwordm9pZCBDRHNhOjpMb2NrUGFsZXR0ZShUQm9vbCBhTG9jaykKKwl7CisJaWYoYUxvY2spCisJCWlTdGF0ZUZsYWdzIHw9IEVQYWxldHRlTG9ja2VkOworCWVsc2UKKwkJaVN0YXRlRmxhZ3MgJj0gfkVQYWxldHRlTG9ja2VkOworCX0KK1RJbnQgQ0RzYTo6U2V0UGFsZXR0ZShUSW50IGFGaXJzdCwgVEludCBhQ291bnQsIFRVaW50MzIqIGFQYWxldHRlKQorCXsKKwlpZihpTHV0MjU2ID09IE5VTEwpCisJCXJldHVybiBLRXJyTm90Rm91bmQ7CisJY29uc3QgVEludCBjb3VudCA9IGFDb3VudCAtIGFGaXJzdDsKKwlpZihjb3VudCA+IDI1NikKKwkJcmV0dXJuIEtFcnJBcmd1bWVudDsKKwlpZihpU3RhdGVGbGFncyAmIEVQYWxldHRlTG9ja2VkKQorCQlyZXR1cm4gS0Vyck5vbmU7CisJZm9yKFRJbnQgaSA9IGFGaXJzdDsgaSA8IGNvdW50OyBpKyspIC8vbm90IHNvIGJ1c3kgaGVyZTotKQorCQl7CisJCWlMdXQyNTZbaV0gPSBhUGFsZXR0ZVtpXTsKKwkJfQorCXJldHVybiBLRXJyTm9uZTsKKwl9CisJCisJCisKKworICAgIAorQ0RzYTo6Q0RzYShSV3NTZXNzaW9uJiBhU2Vzc2lvbikgOiAKKyAJaVN0YXRlRmxhZ3MoMCksCisgCWlTZXNzaW9uKGFTZXNzaW9uKQorICAKKwl7CisvLwlDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisJaUNGVGFibGVbMF0gPSBDb3B5TWVtOworCWlDRlRhYmxlWzFdID0gQ29weU1lbUZsaXBSZXZlcnNlZDsKKwlpQ0ZUYWJsZVsyXSA9IENvcHlNZW1SZXZlcnNlZDsKKwlpQ0ZUYWJsZVszXSA9IENvcHlNZW1GbGlwOwkKKwkKKwlpQ0ZUYWJsZVs0XSA9IENvcHkyNTY7CisJaUNGVGFibGVbNV0gPSBDb3B5MjU2RmxpcFJldmVyc2VkOworCWlDRlRhYmxlWzZdID0gQ29weTI1NlJldmVyc2VkOworCWlDRlRhYmxlWzddID0gQ29weTI1NkZsaXA7CQorCQorCQorCWlDRlRhYmxlWzhdID0gQ29weVNsb3c7CisJaUNGVGFibGVbOV0gPSBDb3B5U2xvd0ZsaXBSZXZlcnNlZDsKKwlpQ0ZUYWJsZVsxMF0gPSBDb3B5U2xvd1JldmVyc2VkOworCWlDRlRhYmxlWzExXSA9IENvcHlTbG93RmxpcDsJCisJfQorCQorUldzU2Vzc2lvbiYgQ0RzYTo6U2Vzc2lvbigpCisJeworCXJldHVybiBpU2Vzc2lvbjsKKwl9CisKK1RJbnQgQ0RzYTo6UmVkcmF3UmVxdWVzdCgpCisJeworCWlmKCEoaVN0YXRlRmxhZ3MgJiAoRVVwZGF0aW5nKSAmJiAoaVN0YXRlRmxhZ3MgJiBFUnVubmluZykpKQorCQl7CisJCXJldHVybiBFeHRlcm5hbFVwZGF0ZSgpOworCQl9CisJcmV0dXJuIEtFcnJOb3RSZWFkeTsKKwl9CisKK1RVaW50OCogQ0RzYTo6TG9ja0h3U3VyZmFjZSgpCisJeworCWlmKChpU3RhdGVGbGFncyAmIEVVcGRhdGluZykgPT0gMCkgLy9lbHNlIGZyYW1lIGlzIHNraXBwZWQKKwkJeworCQlyZXR1cm4gTG9ja1N1cmZhY2UoKTsKKwkJfQorCXJldHVybiBOVUxMOyAKKwl9CisKKy8qCQordm9pZCBDRHNhOjpSdW5MKCkKKwl7CisJaVN0YXRlRmxhZ3MgJj0gfkVVcGRhdGluZzsKKwl9CisJCQorCQordm9pZCBDRHNhOjpEb0NhbmNlbCgpCisJeworCWlTdGF0ZUZsYWdzICY9IH5FVXBkYXRpbmc7CisJLy9ub3RoaW5nIGNhbiBkbywganVzdCB3YWl0PworCX0KKyovCQorCisJCitUSW50IENEc2E6OkFsbG9jU3VyZmFjZShUQm9vbCBhSHdTdXJmYWNlLCBjb25zdCBUU2l6ZSYgYVNpemUsIFREaXNwbGF5TW9kZSBhTW9kZSkKKwl7CisJaWYoYUh3U3VyZmFjZSAmJiBhTW9kZSAhPSBEaXNwbGF5TW9kZSgpKQorCQlyZXR1cm4gS0VyckFyZ3VtZW50OworCQorCWlTb3VyY2VNb2RlID0gYU1vZGU7CisJCisJaVNvdXJjZUJwcCA9IEJ5dGVzUGVyUGl4ZWwoYU1vZGUpOworCQorCWNvbnN0IFRTaXplIHNpemUgPSBXaW5kb3dTaXplKCk7CisJaWYoYVNpemUuaVdpZHRoID4gc2l6ZS5pV2lkdGgpCisJCXJldHVybiBLRXJyVG9vQmlnOworCWlmKGFTaXplLmlIZWlnaHQgPiBzaXplLmlIZWlnaHQpCisJCXJldHVybiBLRXJyVG9vQmlnOworCQorCVRSQVBEKGVyciwgQ3JlYXRlU3VyZmFjZUwoKSk7CisJaWYoZXJyICE9IEtFcnJOb25lKQorCQlyZXR1cm4gZXJyOworCisJU2V0Q29weUZ1bmN0aW9uKCk7CisJCisJcmV0dXJuIEtFcnJOb25lOworCX0KKwkKKwordm9pZCBDRHNhOjpDcmVhdGVab29tZXJMKGNvbnN0IFRTaXplJiBhU2l6ZSkKKwl7CisJaVN3U2l6ZSA9IGFTaXplOworCWlTdGF0ZUZsYWdzIHw9IEVSZXNpemVSZXF1ZXN0OworCUNyZWF0ZVN1cmZhY2VMKCk7CisJU2V0VGFyZ2V0UmVjdCgpOworCX0KKwkKKworLyoKK3ZvaWQgU2F2ZUJtcChjb25zdCBURGVzQyYgYU5hbWUsIGNvbnN0IFRBbnkqIGFEYXRhLCBUSW50IGFMZW5ndGgsIGNvbnN0IFRTaXplJiBhU3osIFREaXNwbGF5TW9kZSBhTW9kZSkKKwl7CisJQ0Zic0JpdG1hcCogcyA9IG5ldyBDRmJzQml0bWFwKCk7CisJcy0+Q3JlYXRlKGFTeiwgYU1vZGUpOworCXMtPkxvY2tIZWFwKCk7CisJVFVpbnQzMiogYWRkciA9IHMtPkRhdGFBZGRyZXNzKCk7CisJTWVtOjpDb3B5KGFkZHIsIGFEYXRhLCBhTGVuZ3RoKTsKKwlzLT5VbmxvY2tIZWFwKCk7CisJcy0+U2F2ZShhTmFtZSk7CisJcy0+UmVzZXQoKTsKKwlkZWxldGUgczsKKwl9CisJCit2b2lkIFNhdmVCbXAoY29uc3QgVERlc0MmIGFOYW1lLCBjb25zdCBUVWludDMyKiBhRGF0YSwgY29uc3QgVFNpemUmIGFTeikKKwl7CisJQ0Zic0JpdG1hcCogcyA9IG5ldyBDRmJzQml0bWFwKCk7CisJcy0+Q3JlYXRlKGFTeiwgRUNvbG9yNjRLKTsKKwlUQml0bWFwVXRpbCBibXAocyk7CisJYm1wLkJlZ2luKFRQb2ludCgwLCAwKSk7CisJZm9yKFRJbnQgaiA9IDA7IGogPCBhU3ouaUhlaWdodDsgaisrKQorCQl7CisJCWJtcC5TZXRQb3MoVFBvaW50KDAsIGopKTsKKwkJZm9yKFRJbnQgaSA9IDA7IGkgPCBhU3ouaVdpZHRoOyBpKyspCisJCQl7CisJCQlibXAuU2V0UGl4ZWwoKmFEYXRhKTsKKwkJCWFEYXRhKys7CisJCQlibXAuSW5jWFBvcygpOworCQkJfQorCQl9CisJYm1wLkVuZCgpOworCXMtPlNhdmUoYU5hbWUpOworCXMtPlJlc2V0KCk7CisJZGVsZXRlIHM7CisJfQkKKwkKK1RCdWY8MTY+IEZvb05hbWUoVEludCBhRm9vKQorCXsKKwlUQnVmPDE2PiBiOworCWIuRm9ybWF0KF9MKCJDOlxccGljJWQubWJtIiksIGFGb28pOworCXJldHVybiBiOworCX0KKwkKKyovCisKKwordm9pZCBDRHNhOjpDbGlwQ29weShUVWludDgqIGFUYXJnZXQsCisgCQkJCQljb25zdCBUVWludDgqIGFTb3VyY2UsCisgCQkJCQljb25zdCBUUmVjdCYgYVVwZGF0ZVJlY3QsCisgCQkJCQljb25zdCBUUmVjdCYgYVNvdXJjZVJlY3QpIGNvbnN0CisgCQl7CisgCQljb25zdCBURHNhIGRzYSgqdGhpcyk7CisgCQlzd2l0Y2goaVNvdXJjZUJwcCkKKyAJCQl7CisgCQkJY2FzZSAxOgorIAkJCQk6OkNsaXBDb3B5PFRVaW50MzIsIFRVaW50OD4oZHNhLCBhVGFyZ2V0LCBhU291cmNlLCBhVXBkYXRlUmVjdCwgYVNvdXJjZVJlY3QpOworIAkJCQlicmVhazsKKyAJCQljYXNlIDI6CisgCQkJCTo6Q2xpcENvcHk8VFVpbnQzMiwgVFVpbnQxNj4oZHNhLCBhVGFyZ2V0LCBhU291cmNlLCBhVXBkYXRlUmVjdCwgYVNvdXJjZVJlY3QpOworIAkJCQlicmVhazsKKyAJCQljYXNlIDQ6CisgCQkJCTo6Q2xpcENvcHk8VFVpbnQzMiwgVFVpbnQzMj4oZHNhLCBhVGFyZ2V0LCBhU291cmNlLCBhVXBkYXRlUmVjdCwgYVNvdXJjZVJlY3QpOworIAkJCQlicmVhazsKKyAJCQl9CisgCQl9CQorCisKK3ZvaWQgQ0RzYTo6V2lwZSgpIC8vZG9udCBjYWxsIGluIGRyYXdpbmcKKwl7CisJaWYoSXNEc2FBdmFpbGFibGUoKSkKKwkJV2lwZShpVGFyZ2V0QnBwICogU3dTaXplKCkuaVdpZHRoICogU3dTaXplKCkuaUhlaWdodCk7CisJfQorCQordm9pZCBDRHNhOjpTZXRDb3B5RnVuY3Rpb24oKQorCXsKKwkvL2NhbGN1bGF0ZSBvZmZzZXQgdG8gY29ycmVjdCBmdW5jdGlvbiBpbiBpQ0ZUYWJsZSBhY2NvcmRpbmcgdG8gZ2l2ZW4gcGFyYW1ldGVycworCVRJbnQgZnVuY3Rpb24gPSAwOworCWNvbnN0IFRJbnQgS0NvcHlGdW5jdGlvbnMgPSA0OworCWNvbnN0IFRJbnQgS09mZnNldFRvTmF0aXZlID0gMDsKKwljb25zdCBUSW50IEtPZmZzZXRUbzI1NiA9IEtPZmZzZXRUb05hdGl2ZSArIEtDb3B5RnVuY3Rpb25zOworCWNvbnN0IFRJbnQgS09mZnNldFRvT3RoZXJNb2RlcyA9IEtPZmZzZXRUbzI1NiArIEtDb3B5RnVuY3Rpb25zOworCWNvbnN0IFRJbnQgS09mZnNldFRvOTBGdW5jdGlvbnMgPSAxOworCWNvbnN0IFRJbnQgS09mZnNldFRvMTgwRnVuY3Rpb25zID0gMjsKKwkKKwlpZihpU291cmNlTW9kZSA9PSBEaXNwbGF5TW9kZSgpKQorCQlmdW5jdGlvbiA9IEtPZmZzZXRUb05hdGl2ZTsgCQkvLzAKKwllbHNlIGlmKGlTb3VyY2VNb2RlID09IEVDb2xvcjI1NikKKwkJZnVuY3Rpb24gPSBLT2Zmc2V0VG8yNTY7CQkJLy80CisJZWxzZQorCQlmdW5jdGlvbiA9IEtPZmZzZXRUb090aGVyTW9kZXM7IAkvLzgKKwkKKwlpZihpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbjkwKQorCQlmdW5jdGlvbiArPSBLT2Zmc2V0VG85MEZ1bmN0aW9uczsgCS8vICsgMQorCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uMTgwKQorCQlmdW5jdGlvbiArPSBLT2Zmc2V0VG8xODBGdW5jdGlvbnM7IAkvLysgMgorCQorCWlDb3B5RnVuY3Rpb24gPSBpQ0ZUYWJsZVtmdW5jdGlvbl07CisJCisJV2lwZSgpOworCX0KKwkKK2lubGluZSB2b2lkIFJvdGF0ZShUUmVjdCYgYVJlY3QpCisJeworCWNvbnN0IFRJbnQgZHggPSBhUmVjdC5pQnIuaVggLSBhUmVjdC5pVGwuaVg7CisJY29uc3QgVEludCBkeSA9IGFSZWN0LmlCci5pWSAtIGFSZWN0LmlUbC5pWTsKKworCWFSZWN0LmlCci5pWCA9IGFSZWN0LmlUbC5pWCArIGR5OworCWFSZWN0LmlCci5pWSA9IGFSZWN0LmlUbC5pWSArIGR4OworCQorCWNvbnN0IFRJbnQgdG1wID0gYVJlY3QuaVRsLmlYOworCWFSZWN0LmlUbC5pWCA9IGFSZWN0LmlUbC5pWTsKKwlhUmVjdC5pVGwuaVkgPSB0bXA7CisJfQorCQorLyoJCitpbnQgYmFyID0gMDsKKyovCQorCitUQm9vbCBDRHNhOjpBZGRVcGRhdGVSZWN0KGNvbnN0IFRVaW50OCogYUJpdHMsIGNvbnN0IFRSZWN0JiBhVXBkYXRlUmVjdCwgY29uc3QgVFJlY3QmIGFSZWN0KQorCXsKKworCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uQ2hhbmdlZCkKKwkJeworCQlpU3RhdGVGbGFncyAmPSB+RU9yaWVudGF0aW9uRmxhZ3M7CisJCWlTdGF0ZUZsYWdzIHw9IGlOZXdGbGFnczsKKwkJU2V0Q29weUZ1bmN0aW9uKCk7CisJCWlTdGF0ZUZsYWdzICY9IH5FT3JpZW50YXRpb25DaGFuZ2VkOworCSAgICBFcG9jU2RsRW52OjpXYWl0RGV2aWNlQ2hhbmdlKCk7CisJICAgIHJldHVybiBFRmFsc2U7IC8vc2tpcCB0aGlzIGZyYW1lIGFzIGRhdGEgaXMgbWF5IGJlIGNoYW5nZWQKKwkJfQorCisJaWYoaVRhcmdldEFkZHIgPT0gTlVMTCkKKwkJeworCQlpVGFyZ2V0QWRkciA9IExvY2tId1N1cmZhY2UoKTsKKwkJfQorCQkKKwlUVWludDgqIHRhcmdldCA9IGlUYXJnZXRBZGRyOworCWlmKHRhcmdldCA9PSBOVUxMKQorCQlyZXR1cm4gRUZhbHNlOworCQorCQorCVRSZWN0IHRhcmdldFJlY3QgPSBUUmVjdChUUG9pbnQoMCwgMCksIFN3U2l6ZSgpKTsKKwkKKwlUUmVjdCBzb3VyY2VSZWN0ID0gYVJlY3Q7CisJVFJlY3QgdXBkYXRlUmVjdCA9IGFVcGRhdGVSZWN0OworCQorLy8JVFBvaW50IG1vdmUoMCwgMCk7CisJCisJCisJaWYoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb245MCkKKwkJeworCQlSb3RhdGUoc291cmNlUmVjdCk7CisJCVJvdGF0ZSh1cGRhdGVSZWN0KTsKKwkJfQorCQkKKwlpZihpU291cmNlTW9kZSAhPSBEaXNwbGF5TW9kZSgpIHx8ICB0YXJnZXRSZWN0ICE9IHNvdXJjZVJlY3QgfHwgdGFyZ2V0UmVjdCAhPSB1cGRhdGVSZWN0IHx8ICgoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb25GbGFncykgIT0gMCkpCisJCXsKKwkJc291cmNlUmVjdC5JbnRlcnNlY3Rpb24odGFyZ2V0UmVjdCk7IC8vc28gc291cmNlIGFsd2F5cyBzbWFsbGVyIG9yIGVxdWFsIHRoYW4gdGFyZ2V0CisJCS8vdXBkYXRlUmVjdC5JbnRlcnNlY3Rpb24odGFyZ2V0UmVjdCk7CisJCUNsaXBDb3B5KHRhcmdldCwgYUJpdHMsIHVwZGF0ZVJlY3QsIHNvdXJjZVJlY3QpOworCQl9CisJZWxzZQorCQl7CisJCWNvbnN0IFRJbnQgYnl0ZUNvdW50ID0gYVJlY3QuV2lkdGgoKSAqIGFSZWN0LkhlaWdodCgpICogaVNvdXJjZUJwcDsgLy90aGlzIGNvdWxkIGJlIHN0b3JlZAorCQlNZW06OkNvcHkodGFyZ2V0LCBhQml0cywgYnl0ZUNvdW50KTsKKwkJfQorCisJcmV0dXJuIEVUcnVlOworCX0KKwkKKwkJCit2b2lkIENEc2E6OlVwZGF0ZVN3U3VyZmFjZSgpCisJeworCWlUYXJnZXRBZGRyID0gTlVMTDsKKwlVbmxvY2tId1N1cmZhY2UoKTsJLy9jb3VsZCBiZSBmYXN0ZXIgaWYgZG9lcyBub3QgdXNlIEFPLCBidXQgb25seSBjaGVjayBzdGF0dXMgYmVmb3JlIHJlZHJhdywgdGhlbiBubyBjb250ZXh0IHN3aXRjaCBuZWVkZWQKKwl9CisJCisKKworCQordm9pZCBDRHNhOjpEb1N0b3AoKQorCXsKKwlpZihJc0RzYUF2YWlsYWJsZSgpKQorCQlpU3RhdGVGbGFncyB8PSBFU2RsVGhyZWFkRXhwbGljaXRTdG9wOworCVN0b3AoKTsKKwl9CisKKwkKK3ZvaWQgQ0RzYTo6U3RvcCgpCisJeworCWlTdGF0ZUZsYWdzICY9IH5FUnVubmluZzsKKwl9CisJCit2b2lkIENEc2E6OlN0YXJ0KCkKKwl7CisgICAgaVN0YXRlRmxhZ3MgfD0gRVJ1bm5pbmc7CisJCisJaVN0YXRlRmxhZ3MgJj0gfkVTZGxUaHJlYWRFeHBsaWNpdFN0b3A7CisgCisgICAgaWYoaVN0YXRlRmxhZ3MgJiBFU2RsVGhyZWFkU3VzcGVuZCkKKyAgICAJeworICAgIAlFcG9jU2RsRW52OjpSZXN1bWUoKTsKKyAgICAJaVN0YXRlRmxhZ3MgJj0gfiBFU2RsVGhyZWFkU3VzcGVuZDsKKyAgICAJfQkKKyAgICBFcG9jU2RsRW52OjpPYnNlcnZlckV2ZW50KE1TRExPYnNlcnZlcjo6RUV2ZW50V2luZG93UmVzZXJ2ZWQpOwkKKwl9CisKKworVEJvb2wgQ0RzYTo6QmxpdHRlcihDRmJzQml0bWFwJiBhQm1wKQorCXsKKwlyZXR1cm4gaUJsaXR0ZXIgJiYgaUJsaXR0ZXItPkJpdEJsdChHYygpLCBhQm1wLCBId1JlY3QoKSwgU3dTaXplKCkpOwkKKwl9CisJCit2b2lkIENEc2E6OlNldEJsaXR0ZXIoTUJsaXR0ZXIqIGFCbGl0dGVyKQorCXsKKwlpQmxpdHRlciA9IGFCbGl0dGVyOworCX0KKwkKKwkKK1RQb2ludCBDRHNhOjpXaW5kb3dDb29yZGluYXRlcyhjb25zdCBUUG9pbnQmIGFQb2ludCkgY29uc3QJCisJeworCVRQb2ludCBwb3MgPSBhUG9pbnQgLSBpU2NyZWVuUmVjdC5pVGw7CisJY29uc3QgVFNpemUgYXN6ID0gaVNjcmVlblJlY3QuU2l6ZSgpOworCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uMTgwKQorCQl7CisJCXBvcy5pWCA9IGFzei5pV2lkdGggLSBwb3MuaVg7CisJCXBvcy5pWSA9IGFzei5pSGVpZ2h0IC0gcG9zLmlZOwkKKwkJfQkKKwlpZihpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbjkwKQorCQl7CisJCXBvcy5pWCA9IGFQb2ludC5pWTsKKwkJcG9zLmlZID0gYVBvaW50LmlYOwkKKwkJfQorCXBvcy5pWCA8PD0gMTY7CisJcG9zLmlZIDw8PSAxNjsKKwlwb3MuaVggLz0gYXN6LmlXaWR0aDsgCisJcG9zLmlZIC89IGFzei5pSGVpZ2h0OworCXBvcy5pWCAqPSBpU3dTaXplLmlXaWR0aDsKKwlwb3MuaVkgKj0gaVN3U2l6ZS5pSGVpZ2h0OworCXBvcy5pWCA+Pj0gMTY7CisJcG9zLmlZID4+PSAxNjsKKwlyZXR1cm4gcG9zOyAJCisJfQorCQordm9pZCBDRHNhOjpTZXRUYXJnZXRSZWN0KCkKKwl7CisJaVRhcmdldFJlY3QgPSBpU2NyZWVuUmVjdDsKKwlpZihpU3RhdGVGbGFncyAmIEVSZXNpemVSZXF1ZXN0ICYmIEVwb2NTZGxFbnY6OkZsYWdzKENTREw6OkVBbGxvd0ltYWdlUmVzaXplS2VlcFJhdGlvKSkKKwkJeworCQljb25zdCBUU2l6ZSBhc3ogPSBpU2NyZWVuUmVjdC5TaXplKCk7CisJCWNvbnN0IFRTaXplIHN6ID0gaVN3U2l6ZTsKKwkJCisJCVRSZWN0IHJlY3Q7CisJCQorCQljb25zdCBUSW50IGRoID0gKHN6LmlIZWlnaHQgPDwgMTYpIC8gc3ouaVdpZHRoOworCisJCWlmKChhc3ouaVdpZHRoICogZGggKSA+PiAxNiA8PSBhc3ouaUhlaWdodCkKKwkJCXsKKwkJCXJlY3QuU2V0UmVjdChUUG9pbnQoMCwgMCksIFRTaXplKGFzei5pV2lkdGgsIChhc3ouaVdpZHRoICogZGgpID4+IDE2KSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWNvbnN0IFRJbnQgZHcgPSAoc3ouaVdpZHRoIDw8IDE2KSAvIHN6LmlIZWlnaHQ7CisJICAgIAlyZWN0LlNldFJlY3QoVFBvaW50KDAsIDApLCBUU2l6ZSgoYXN6LmlIZWlnaHQgKiBkdykgPj4gMTYsIGFzei5pSGVpZ2h0KSk7CisJCQl9CisJCXJlY3QuTW92ZSgoYXN6LmlXaWR0aCAtIHJlY3QuU2l6ZSgpLmlXaWR0aCkgPj4gMSwgKGFzei5pSGVpZ2h0IC0gcmVjdC5TaXplKCkuaUhlaWdodCkgPj4gMSk7ICAKKwkJCisJCWlUYXJnZXRSZWN0ID0gcmVjdDsKKwkJaVRhcmdldFJlY3QuTW92ZShpU2NyZWVuUmVjdC5pVGwpOworCisJCX0gCisJaWYoIShpU3RhdGVGbGFncyAmIEVSZXNpemVSZXF1ZXN0KSkKKwkJaVN3U2l6ZSA9IGlTY3JlZW5SZWN0LlNpemUoKTsKKworCX0KKwkJCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQ0RzYTo6Q29weTI1Nihjb25zdCBDRHNhJiBhRHNhLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50KQorCXsKKwlUVWludDMyKiB0YXJnZXQgPSBhVGFyZ2V0OworCWNvbnN0IFRVaW50MzIqIGVuZHQgPSB0YXJnZXQgKyBhQnl0ZXM7IAorCWNvbnN0IFRVaW50OCogc291cmNlID0gYVNvdXJjZTsKKwl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQl7CisJCSp0YXJnZXQrKyA9IGFEc2EuaUx1dDI1Nlsqc291cmNlKytdOyAKKwkJfQorCX0KKwkKK3ZvaWQgQ0RzYTo6Q29weTI1NlJldmVyc2VkKGNvbnN0IENEc2EmIGFEc2EsIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQpCisJeworCWNvbnN0IFRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IGFUYXJnZXQgKyBhQnl0ZXM7IAorCWNvbnN0IFRVaW50OCogc291cmNlID0gYVNvdXJjZTsKKwl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQl7CisJCSooLS1lbmR0KSA9IGFEc2EuaUx1dDI1Nlsqc291cmNlKytdOyAKKwkJfQorCX0JCisJCit2b2lkIENEc2E6OkNvcHkyNTZGbGlwKGNvbnN0IENEc2EmIGFEc2EsIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQgYUxpbmVMZW4pCisJeworCVRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJY29uc3QgVFVpbnQzMiogZW5kdCA9IHRhcmdldCArIGFCeXRlczsgCisJY29uc3QgVFVpbnQ4KiBjb2x1bW4gPSBhU291cmNlOworCisJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJeworCQkqdGFyZ2V0KysgPSBhRHNhLmlMdXQyNTZbKmNvbHVtbl07CisJCWNvbHVtbiArPSBhTGluZUxlbjsKKwkJfQorCX0KKwkKK3ZvaWQgQ0RzYTo6Q29weTI1NkZsaXBSZXZlcnNlZChjb25zdCBDRHNhJiBhRHNhLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50IGFMaW5lTGVuKQorCXsKKwljb25zdCBUVWludDMyKiB0YXJnZXQgPSBhVGFyZ2V0OworCVRVaW50MzIqIGVuZHQgPSBhVGFyZ2V0ICsgYUJ5dGVzOyAKKwljb25zdCBUVWludDgqIGNvbHVtbiA9IGFTb3VyY2U7CisKKwl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQl7CisJCSooLS1lbmR0KSA9IGFEc2EuaUx1dDI1NlsqY29sdW1uXTsKKwkJY29sdW1uICs9IGFMaW5lTGVuOworCQl9CisJfQkJCisKK3ZvaWQgQ0RzYTo6Q29weU1lbShjb25zdCBDRHNhJiAvKmFEc2EqLywgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCkKKwl7CisJY29uc3QgVFVpbnQzMiogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUVWludDMyKj4oYVNvdXJjZSk7CisJTWVtOjpDb3B5KGFUYXJnZXQsIHNyYywgYUJ5dGVzIDw8IDIpOworCX0KKwkKK3ZvaWQgQ0RzYTo6Q29weU1lbUZsaXAoY29uc3QgQ0RzYSYgLyphRHNhKi8sIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQgYUxpbmVMZW4pCisJeworCVRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJY29uc3QgVFVpbnQzMiogZW5kdCA9IHRhcmdldCArIGFCeXRlczsgCisJY29uc3QgVFVpbnQzMiogY29sdW1uID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUVWludDMyKj4oYVNvdXJjZSk7CisKKwl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQl7CisJCSp0YXJnZXQrKyA9ICpjb2x1bW47CisJCWNvbHVtbiArPSBhTGluZUxlbjsKKwkJfQorCX0KKwkKK3ZvaWQgQ0RzYTo6Q29weU1lbVJldmVyc2VkKGNvbnN0IENEc2EmIC8qYURzYSovLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50KQorCXsKKwljb25zdCBUVWludDMyKiB0YXJnZXQgPSBhVGFyZ2V0OworCVRVaW50MzIqIGVuZHQgPSBhVGFyZ2V0ICsgYUJ5dGVzOyAKKwljb25zdCBUVWludDMyKiBzb3VyY2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFRVaW50MzIqPihhU291cmNlKTsKKwl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQl7CisJCSooLS1lbmR0KSA9ICpzb3VyY2UrKzsgCisJCX0KKwl9CQorCQorCQordm9pZCBDRHNhOjpDb3B5TWVtRmxpcFJldmVyc2VkKGNvbnN0IENEc2EmIC8qYURzYSovLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50IGFMaW5lTGVuKQorCXsKKwljb25zdCBUVWludDMyKiB0YXJnZXQgPSBhVGFyZ2V0OworCVRVaW50MzIqIGVuZHQgPSBhVGFyZ2V0ICsgYUJ5dGVzOyAKKwljb25zdCBUVWludDMyKiBjb2x1bW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IFRVaW50MzIqPihhU291cmNlKTsKKworCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCXsKKwkJKigtLWVuZHQpID0gKmNvbHVtbjsKKwkJY29sdW1uICs9IGFMaW5lTGVuOworCQl9CisJfQorCQkJCisvKgorCitMT0NBTF9DIFRSZ2IgcmdiMTZNQShUSW50IGFWYWx1ZSkKKwl7CisJcmV0dXJuIFRSZ2I6OkNvbG9yMTZNQShhVmFsdWUpOworCX0KKyovCQorTk9OU0hBUkFCTEVfQ0xBU1MoTVJnYkNvcHkpCisJeworCXB1YmxpYzoKKwl2aXJ0dWFsIHZvaWQgQ29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUQm9vbCBhUmV2ZXJzZWQpID0gMDsKKwl2aXJ0dWFsIHZvaWQgRmxpcENvcHkoVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbiwgVEJvb2wgYVJldmVyc2VkKSA9IDA7CisJfTsKKwkKK3RlbXBsYXRlIDxjbGFzcyBUPgorTk9OU0hBUkFCTEVfQ0xBU1MoVFJnYkNvcHkpIDogcHVibGljIE1SZ2JDb3B5CisJeworCXB1YmxpYzoKKwlUUmdiQ29weShURGlzcGxheU1vZGUgYU1vZGUpOworCXZvaWQqIG9wZXJhdG9yIG5ldyhUVWludCBhQnl0ZXMsIFRBbnkqIGFNZW0pOworCXZvaWQgQ29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUQm9vbCBhUmV2ZXJzZWQpOworCXZvaWQgRmxpcENvcHkoVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbiwgVEJvb2wgYVJldmVyc2VkKTsKKwlzdGF0aWMgVFVpbnQzMiBHcmF5MjU2KGNvbnN0IFRVaW50OCYgYVBpeGVsKTsKKwlzdGF0aWMgVFVpbnQzMiBDb2xvcjI1Nihjb25zdCBUVWludDgmIGFQaXhlbCk7CisJc3RhdGljIFRVaW50MzIgQ29sb3I0Syhjb25zdCBUVWludDE2JiBhUGl4ZWwpOworCXN0YXRpYyBUVWludDMyIENvbG9yNjRLKGNvbnN0IFRVaW50MTYmIGFQaXhlbCk7CisJc3RhdGljIFRVaW50MzIgQ29sb3IxNk0oY29uc3QgVFVpbnQzMiYgYVBpeGVsKTsKKwlzdGF0aWMgVFVpbnQzMiBDb2xvcjE2TVUoY29uc3QgVFVpbnQzMiYgYVBpeGVsKTsKKwlzdGF0aWMgVFVpbnQzMiBDb2xvcjE2TUEoY29uc3QgVFVpbnQzMiYgYVBpeGVsKTsKKwlwcml2YXRlOgorCQl0eXBlZGVmIFRVaW50MzIgKCpUUmdiRnVuYykgKGNvbnN0IFQmIGFWYWx1ZSk7CisJCVRSZ2JGdW5jIGlGdW5jOworCX07CisJCQorCQkKK3RlbXBsYXRlIDxjbGFzcyBUPgkJCit2b2lkKiBUUmdiQ29weTxUPjo6b3BlcmF0b3IgbmV3KFRVaW50IC8qYUJ5dGVzKi8sIFRBbnkqIGFNZW0pCisJeworCXJldHVybiBhTWVtOworCX0KKwkJCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1RSZ2JDb3B5PFQ+OjpUUmdiQ29weShURGlzcGxheU1vZGUgYU1vZGUpCisJeworCXN3aXRjaChhTW9kZSkKKwkJeworCQljYXNlIEVHcmF5MjU2IDogaUZ1bmMgPSAoVFJnYkZ1bmMpIEdyYXkyNTY7IGJyZWFrOworCQljYXNlIEVDb2xvcjI1NiA6IGlGdW5jID0gIChUUmdiRnVuYykgQ29sb3IyNTY7IGJyZWFrOworCQljYXNlIEVDb2xvcjRLIDogaUZ1bmMgPSAgKFRSZ2JGdW5jKSBDb2xvcjRLOyBicmVhazsKKwkJY2FzZSBFQ29sb3I2NEsgOiBpRnVuYyA9ICAoVFJnYkZ1bmMpIENvbG9yNjRLOyBicmVhazsKKwkJY2FzZSBFQ29sb3IxNk0gOiBpRnVuYyA9ICAoVFJnYkZ1bmMpIENvbG9yMTZNOyBicmVhazsKKwkJY2FzZSBFQ29sb3IxNk1VIDogaUZ1bmMgPSAgKFRSZ2JGdW5jKSBDb2xvcjE2TVU7IGJyZWFrOworCQljYXNlIEVDb2xvcjE2TUEgOiBpRnVuYyA9ICAoVFJnYkZ1bmMpIENvbG9yMTZNQTsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQQU5JQyhLRXJyTm90U3VwcG9ydGVkKTsKKwkJfQorCX0KKwkKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBUUmdiQ29weTxUPjo6Q29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUQm9vbCBhUmV2ZXJzZWQpCisJeworCWNvbnN0IFQqIHNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KGFTb3VyY2UpOworCVRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IHRhcmdldCArIGFCeXRlczsKKwkKKwlpZihhUmV2ZXJzZWQpCisJCXsKKwkJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJCXsKKwkJCWNvbnN0IFQgdmFsdWUgPSAqc291cmNlKys7CisJCQkqKC0tZW5kdCkgPSBpRnVuYyh2YWx1ZSk7Ly9pRnVuYyh2YWx1ZSkuVmFsdWUoKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQkJeworCQkJY29uc3QgVCB2YWx1ZSA9ICpzb3VyY2UrKzsKKwkJCSp0YXJnZXQrKyA9IGlGdW5jKHZhbHVlKTsvL2lGdW5jKHZhbHVlKS5WYWx1ZSgpOworCQkJfQorCQl9CisJfQorCQordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIFRSZ2JDb3B5PFQ+OjpGbGlwQ29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50IGFMaW5lTGVuLCBUQm9vbCBhUmV2ZXJzZWQpCisJeworCWNvbnN0IFQqIGNvbHVtbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KGFTb3VyY2UpOworCVRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IHRhcmdldCArIGFCeXRlczsKKwkKKwlpZihhUmV2ZXJzZWQpCisJCXsKKwkJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJCXsKKwkJCSooLS1lbmR0KSA9IGlGdW5jKCpjb2x1bW4pOworCQkJY29sdW1uICs9IGFMaW5lTGVuOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCQl7CisJCQkqdGFyZ2V0KysgPSBpRnVuYygqY29sdW1uKTsKKwkJCWNvbHVtbiArPSBhTGluZUxlbjsKKwkJCX0KKwkJfQorCX0JCisJCQordGVtcGxhdGUgPGNsYXNzIFQ+IFRVaW50MzIgVFJnYkNvcHk8VD46OkdyYXkyNTYoY29uc3QgVFVpbnQ4JiBhUGl4ZWwpCisJeworCWNvbnN0IFRVaW50MzIgcHggPSBhUGl4ZWwgPDwgMTYgfCBhUGl4ZWwgPDwgOCB8IGFQaXhlbDsKKwlyZXR1cm4gcHg7CisJfQorCQordGVtcGxhdGUgPGNsYXNzIFQ+IFRVaW50MzIgVFJnYkNvcHk8VD46OkNvbG9yMjU2KGNvbnN0IFRVaW50OCYgYVBpeGVsKQorCXsKKwlyZXR1cm4gVFJnYjo6Q29sb3IyNTYoYVBpeGVsKS5WYWx1ZSgpOworCX0KKwkKK3RlbXBsYXRlIDxjbGFzcyBUPiBUVWludDMyIFRSZ2JDb3B5PFQ+OjpDb2xvcjRLKGNvbnN0IFRVaW50MTYmIGFQaXhlbCkKKwl7CisJVFVpbnQzMiBjb2wgPSAoYVBpeGVsICYgMHhGMDApIDw8IDEyOworCWNvbCB8PSAoYVBpeGVsICYgMHhGMDApIDw8IDg7IAorCQorCWNvbCB8PSAoYVBpeGVsICYgMHgwRjApIDw8IDg7CisJY29sIHw9IChhUGl4ZWwgJiAweDBGMCk7CisJCisJY29sIHw9IChhUGl4ZWwgJiAweDAwRikgPDwgNDsKKwljb2wgfD0gKGFQaXhlbCAmIDB4MDBGKTsKKwkKKwlyZXR1cm4gY29sOworCX0KKwkKK3RlbXBsYXRlIDxjbGFzcyBUPiBUVWludDMyIFRSZ2JDb3B5PFQ+OjpDb2xvcjY0Syhjb25zdCBUVWludDE2JiBhUGl4ZWwpCisJeworCVRVaW50MzIgY29sID0gKGFQaXhlbCAmIDB4RjgwMCk8PCA4OworCWNvbCB8PSAoYVBpeGVsICYgMHhFMDAwKSA8PCAzOyAKKwkKKwljb2wgfD0gKGFQaXhlbCAmIDB4MDdFMCkgPDwgNTsKKwljb2wgfD0gKGFQaXhlbCAmIDB4QzApID4+IDE7CisJCisJY29sIHw9IChhUGl4ZWwgJiAweDA3RTApIDw8IDM7CisJY29sIHw9IChhUGl4ZWwgJiAweDFDKSA+PiAyOworCQorCXJldHVybiBjb2w7CisJfQorCQordGVtcGxhdGUgPGNsYXNzIFQ+IFRVaW50MzIgVFJnYkNvcHk8VD46OkNvbG9yMTZNKGNvbnN0IFRVaW50MzImIGFQaXhlbCkKKwl7CisJcmV0dXJuIFRSZ2I6OkNvbG9yMTZNKGFQaXhlbCkuVmFsdWUoKTsKKwl9CisJCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVFVpbnQzMiBUUmdiQ29weTxUPjo6Q29sb3IxNk1VKGNvbnN0IFRVaW50MzImIGFQaXhlbCkKKwl7CisJcmV0dXJuIFRSZ2I6OkNvbG9yMTZNVShhUGl4ZWwpLlZhbHVlKCk7CisJfQorCQordGVtcGxhdGUgPGNsYXNzIFQ+IFRVaW50MzIgVFJnYkNvcHk8VD46OkNvbG9yMTZNQShjb25zdCBUVWludDMyJiBhUGl4ZWwpCisJeworCXJldHVybiBUUmdiOjpDb2xvcjE2TUEoYVBpeGVsKS5WYWx1ZSgpOworCX0KKwordHlwZWRlZiBUVWludDY0IFRTdGFja01lbTsKKworTE9DQUxfQyBNUmdiQ29weSogR2V0Q29weShUQW55KiBtZW0sIFREaXNwbGF5TW9kZSBhTW9kZSkKKwl7CisJaWYoYU1vZGUgPT0gRUNvbG9yMjU2IHx8IGFNb2RlID09IEVHcmF5MjU2KQorCQl7CisJCXJldHVybiBuZXcgKG1lbSkgVFJnYkNvcHk8VFVpbnQ4PihhTW9kZSk7CisJCX0KKwlpZihhTW9kZSA9PSBFQ29sb3I0SyB8fCBhTW9kZSA9PSBFQ29sb3I2NEspCisJCXsKKwkJcmV0dXJuIG5ldyAobWVtKSBUUmdiQ29weTxUVWludDE2PihhTW9kZSk7CisJCX0KKwlpZihhTW9kZSA9PSBFQ29sb3IxNk0gfHwgYU1vZGUgPT0gRUNvbG9yMTZNVSB8fCBhTW9kZSA9PSBFQ29sb3IxNk1BKQorCQl7CisJCXJldHVybiBuZXcgKG1lbSkgVFJnYkNvcHk8VFVpbnQzMj4oYU1vZGUpOworCQl9CisJUEFOSUMoS0Vyck5vdFN1cHBvcnRlZCk7CisJcmV0dXJuIE5VTEw7CisJfQorCQorCit2b2lkIENEc2E6OkNvcHlTbG93RmxpcFJldmVyc2VkKGNvbnN0IENEc2EmIGFEc2EsIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQgYUxpbmVMZW4pCisJeworCVRTdGFja01lbSBtZW0gPSAwOworCUdldENvcHkoJm1lbSwgYURzYS5pU291cmNlTW9kZSktPkZsaXBDb3B5KGFUYXJnZXQsIGFTb3VyY2UsIGFCeXRlcywgYUxpbmVMZW4sIEVUcnVlKTsJCisJfQorCQordm9pZCBDRHNhOjpDb3B5U2xvd0ZsaXAoY29uc3QgQ0RzYSYgYURzYSwgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbikKKwl7CisJVFN0YWNrTWVtIG1lbSA9IDA7CisJR2V0Q29weSgmbWVtLCBhRHNhLmlTb3VyY2VNb2RlKS0+RmxpcENvcHkoYVRhcmdldCwgYVNvdXJjZSwgYUJ5dGVzLCBhTGluZUxlbiwgRUZhbHNlKTsKKwl9CisJCit2b2lkIENEc2E6OkNvcHlTbG93KGNvbnN0IENEc2EmIGFEc2EsIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQpCisJeworCVRTdGFja01lbSBtZW0gPSAwOworCUdldENvcHkoJm1lbSwgYURzYS5pU291cmNlTW9kZSktPkNvcHkoYVRhcmdldCwgYVNvdXJjZSwgYUJ5dGVzLCBFRmFsc2UpOwkKKwl9CQorCit2b2lkIENEc2E6OkNvcHlTbG93UmV2ZXJzZWQoY29uc3QgQ0RzYSYgYURzYSwgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCkKKwl7CisJVFN0YWNrTWVtIG1lbSA9IDA7CisJR2V0Q29weSgmbWVtLCBhRHNhLmlTb3VyY2VNb2RlKS0+Q29weShhVGFyZ2V0LCBhU291cmNlLCBhQnl0ZXMsIEVUcnVlKTsJCisJfQkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLzcKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0EyL2RzYV9uZXcuY3BwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTIvZHNhX25ldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4ZmJlOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9FS0EyL2RzYV9uZXcuY3BwCkBAIC0wLDAgKzEsMTQ0MyBAQAorI2luY2x1ZGUgImRzYS5oIgorI2luY2x1ZGUgInNkbGVwb2NhcGkuaCIKKyNpbmNsdWRlIDxjZHNiLmg+CisKKworTE9DQUxfQyBUSW50IEJ5dGVzUGVyUGl4ZWwoVERpc3BsYXlNb2RlIGFNb2RlKQorCXsKKwlyZXR1cm4gKChURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVCaXRzUGVyUGl4ZWwoYU1vZGUpIC0gMSkgPj4gMykgKyAxOyAKKwl9CisKKworTk9OU0hBUkFCTEVfQ0xBU1MoVERzYSkKKwl7CisJcHVibGljOgorCQlpbmxpbmUgVERzYShjb25zdCBDRHNhJiBhRHNhKTsKKwkJaW5saW5lIFRCb29sIElzRmxpcCgpIGNvbnN0OworCQlpbmxpbmUgVEJvb2wgSXNUdXJuKCkgY29uc3Q7CisJCWlubGluZSBjb25zdCBUU2l6ZSYgU3dTaXplKCkgY29uc3Q7CisJCWlubGluZSB2b2lkIENvcHkoVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU3JjLCBUSW50IGFCeXRlcywgVEludCBhSGVpZ2h0KSBjb25zdDsKKwlwcml2YXRlOgorCQljb25zdCBDRHNhJiBpRHNhOworCX07CisKKworaW5saW5lIFREc2E6OlREc2EoY29uc3QgQ0RzYSYgYURzYSkgOiBpRHNhKGFEc2EpCisJewkKKwl9CisKK2lubGluZSBUQm9vbCBURHNhOjpJc1R1cm4oKSBjb25zdAorCXsKKwlyZXR1cm4gaURzYS5pU3RhdGVGbGFncyAmIENEc2E6OkVPcmllbnRhdGlvbjkwOworCX0KKwkKK2lubGluZSBUQm9vbCBURHNhOjpJc0ZsaXAoKSBjb25zdAorCXsKKwlyZXR1cm4gaURzYS5pU3RhdGVGbGFncyAmIENEc2E6OkVPcmllbnRhdGlvbjE4MDsKKwl9CQorCQoraW5saW5lIGNvbnN0IFRTaXplJiBURHNhOjpTd1NpemUoKSBjb25zdAorCXsKKwlyZXR1cm4gaURzYS5Td1NpemUoKTsKKwl9CisJCQoraW5saW5lIHZvaWQgVERzYTo6Q29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTcmMsIFRJbnQgYUJ5dGVzLCBUSW50IGFIZWlnaHQpIGNvbnN0CisJeworCWlEc2EuaUNvcHlGdW5jdGlvbihpRHNhLCBhVGFyZ2V0LCBhU3JjLCBhQnl0ZXMsIGFIZWlnaHQpOworCX0KKwkKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFM+CQordm9pZCBDbGlwQ29weShjb25zdCBURHNhJiBpRHNhLCBUVWludDgqIGFUYXJnZXQsCisgCQkJCQljb25zdCBUVWludDgqIGFTb3VyY2UsCisgCQkJCQljb25zdCBUUmVjdCYgYVVwZGF0ZVJlY3QsCisgCQkJCQljb25zdCBUUmVjdCYgYVNvdXJjZVJlY3QpCisJeworCWNvbnN0IFMqIHNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUyo+KGFTb3VyY2UpOworCWNvbnN0IFRJbnQgbGluZVdpZHRoID0gYVNvdXJjZVJlY3QuV2lkdGgoKTsKKwkKKwlzb3VyY2UgKz0gKGFVcGRhdGVSZWN0LmlUbC5pWSAqIGxpbmVXaWR0aCk7IAorCWNvbnN0IFRJbnQgc291cmNlU3RhcnRPZmZzZXQgPSBhVXBkYXRlUmVjdC5pVGwuaVg7CisJc291cmNlICs9IHNvdXJjZVN0YXJ0T2Zmc2V0OworCQorCVQqIHRhcmdldFB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGFUYXJnZXQpOworCQorCWNvbnN0IFRJbnQgc2NhbkxpbmVXaWR0aCA9IGlEc2EuU3dTaXplKCkuaVdpZHRoOworCQorCXRhcmdldFB0ciArPSAoYVNvdXJjZVJlY3QuaVRsLmlZICsgYVVwZGF0ZVJlY3QuaVRsLmlZICkgKiBzY2FuTGluZVdpZHRoOyAKKwljb25zdCBUSW50IHRhcmdldFN0YXJ0T2Zmc2V0ID0gKGFVcGRhdGVSZWN0LmlUbC5pWCArIGFTb3VyY2VSZWN0LmlUbC5pWCk7CisJCisJdGFyZ2V0UHRyICs9IHRhcmdldFN0YXJ0T2Zmc2V0OworCQorCQorCWNvbnN0IFRJbnQgaGVpZ2h0ID0gYVVwZGF0ZVJlY3QuSGVpZ2h0KCk7IAorCQkKKwljb25zdCBUSW50IGxpbmVNb3ZlID0gaURzYS5Jc1R1cm4oKSA/IDEgOiBsaW5lV2lkdGg7CisJY29uc3QgVEludCBjb3B5TGVuID0gYVVwZGF0ZVJlY3QuV2lkdGgoKTsKKwkKKwkKKwlpZihpRHNhLklzRmxpcCgpKQorCQl7CisJCQorCQl0YXJnZXRQdHIgKz0gc2NhbkxpbmVXaWR0aCAqICAoaGVpZ2h0IC0gMSk7CisJCisJCWZvcihUSW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIC8vc291cmNlIGlzIGFsd2F5cyBzbWFsbGVyCisJCQl7CisJCQlpRHNhLkNvcHkocmVpbnRlcnByZXRfY2FzdDxUVWludDMyKj4odGFyZ2V0UHRyKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUVWludDgqPihzb3VyY2UpLCBjb3B5TGVuLCBoZWlnaHQpOworCQkJc291cmNlICs9IGxpbmVNb3ZlOworCQkJdGFyZ2V0UHRyIC09IHNjYW5MaW5lV2lkdGg7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJCisJCQorCQlmb3IoVEludCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSAvL3NvdXJjZSBpcyBhbHdheXMgc21hbGxlcgorCQkJeworCQkJaURzYS5Db3B5KHJlaW50ZXJwcmV0X2Nhc3Q8VFVpbnQzMio+KHRhcmdldFB0ciksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFVpbnQ4Kj4oc291cmNlKSwgY29weUxlbiwgaGVpZ2h0KTsKKwkJCXNvdXJjZSArPSBsaW5lTW92ZTsKKwkJCXRhcmdldFB0ciArPSBzY2FuTGluZVdpZHRoOyAvLyA+PiAyOworCQkJfQorCQl9CisKKwl9CisJCisKKyAgCitOT05TSEFSQUJMRV9DTEFTUyhDRHNhQSkgOiBwdWJsaWMgQ0RzYQorCXsKKwlwdWJsaWM6CisJCUNEc2FBKFJXc1Nlc3Npb24mIGFTZXNzaW9uKTsKKwlwcml2YXRlOgorCQl+Q0RzYUEoKTsKKwkJVFVpbnQ4KiBMb2NrU3VyZmFjZSgpOworCQl2b2lkIFVubG9ja0hXU3VyZmFjZVJlcXVlc3RDb21wbGV0ZSgpOworCQl2b2lkIFVubG9ja0h3U3VyZmFjZSgpOworCQl2b2lkIENyZWF0ZVN1cmZhY2VMKCk7CisJCXZvaWQgV2lwZShUSW50IGFMZW5ndGgpOworCQl2b2lkIEZyZWUoKTsKKwkJdm9pZCBVcGRhdGUoQ0Zic0JpdG1hcCYgYUJtcCk7CisJCXZvaWQgQ29uc3RydWN0TChSV2luZG93JiBhV2luZG93LCBDV3NTY3JlZW5EZXZpY2UmIGFEZXZpY2UpOworCQlUSW50IEV4dGVybmFsVXBkYXRlKCk7CisJLy8Jdm9pZCBFeHRlcm5hbFVwZGF0ZSgpOworCXByb3RlY3RlZDoKKwkJQ0Zic0JpdG1hcCogaUJtcDsKKwkJQ0Zic0JpdG1hcCogaUNvcHlCbXA7CisJfTsKKwkKKwkKK0NEc2FBOjpDRHNhQShSV3NTZXNzaW9uJiBhU2Vzc2lvbikgOiBDRHNhKGFTZXNzaW9uKQorCXsKKwl9CisJCisJCit2b2lkIENEc2FBOjpGcmVlKCkKKwl7CisJZGVsZXRlIGlCbXA7CisJaUJtcCA9IE5VTEw7CisJfQorCitDRHNhQTo6fkNEc2FBKCkKKwl7CisJX19BU1NFUlRfREVCVUcoaUJtcCA9PSBOVUxMLCBQQU5JQyhLRXJyTm90UmVhZHkpKTsKKwlkZWxldGUgaUNvcHlCbXA7CisJfQorCQorVFVpbnQ4KiBDRHNhQTo6TG9ja1N1cmZhY2UoKQorCXsKKwlpQm1wLT5Mb2NrSGVhcCgpOworCXJldHVybiByZWludGVycHJldF9jYXN0PFRVaW50OCo+KGlCbXAtPkRhdGFBZGRyZXNzKCkpOworCX0KKwordm9pZCBDRHNhQTo6VW5sb2NrSFdTdXJmYWNlUmVxdWVzdENvbXBsZXRlKCkKKwl7CisJUEFOSUMoS0Vyck5vdFN1cHBvcnRlZCk7CisJfQorCit2b2lkIENEc2FBOjpVbmxvY2tId1N1cmZhY2UoKQorCXsKKwlpQm1wLT5VbmxvY2tIZWFwKCk7CisJU2V0VXBkYXRpbmcoRUZhbHNlKTsKKwlVcGRhdGUoKmlCbXApOworCX0KKwkKK3ZvaWQgQ0RzYUE6OlVwZGF0ZShDRmJzQml0bWFwJiBhQm1wKQorCXsKKwlpZighQmxpdHRlcihhQm1wKSkKKwkJeworCQlpZihTd1NpemUoKSA9PSBId1JlY3QoKS5TaXplKCkpCisJCQlEc2EoKS5HYygpLT5CaXRCbHQoSHdSZWN0KCkuaVRsLCAmYUJtcCk7CisJCWVsc2UKKwkJCURzYSgpLkdjKCktPkRyYXdCaXRtYXAoSHdSZWN0KCksICZhQm1wKTsKKwkJfQorCURyYXdPdmVybGF5cygpOworCURzYSgpLlNjcmVlbkRldmljZSgpLT5VcGRhdGUoKTsJCisJfQordm9pZCBDRHNhQTo6Q3JlYXRlU3VyZmFjZUwoKQorCXsKKwlkZWxldGUgaUJtcDsKKwlpQm1wID0gTlVMTDsKKwlpQm1wICA9IG5ldyAoRUxlYXZlKSBDRmJzQml0bWFwKCk7CisJVXNlcjo6TGVhdmVJZkVycm9yKGlCbXAtPkNyZWF0ZShTd1NpemUoKSwgRGlzcGxheU1vZGUoKSkpOworCX0KKwordm9pZCBDRHNhQTo6V2lwZShUSW50IGFMZW5ndGgpIC8vZG9udCBjYWxsIGluIGRyYXdpbmcKKwl7CisJaUJtcC0+TG9ja0hlYXAoKTsKKwlNZW06OkZpbGxaKGlCbXAtPkRhdGFBZGRyZXNzKCksIGFMZW5ndGgpOworCWlCbXAtPlVubG9ja0hlYXAoKTsKKwl9CisJCisKKwkJCitUSW50IENEc2FBOjpFeHRlcm5hbFVwZGF0ZSgpCisJeworCWlmKGlDb3B5Qm1wLT5IYW5kbGUoKSA9PSAwKQorCQl7CisJCWNvbnN0IFRJbnQgZXJyID0gaUNvcHlCbXAtPkR1cGxpY2F0ZShpQm1wLT5IYW5kbGUoKSk7CisJCWlmKGVyciAhPSBLRXJyTm9uZSkKKwkJCXJldHVybiBlcnI7CisJCX0KKwlVcGRhdGUoKmlDb3B5Qm1wKTsKKwlyZXR1cm4gS0Vyck5vbmU7CisJfQorCQordm9pZCBDRHNhQTo6Q29uc3RydWN0TChSV2luZG93JiBhV2luZG93LCBDV3NTY3JlZW5EZXZpY2UmIGFEZXZpY2UpCQkKKwl7CisJaUNvcHlCbXAgPSBuZXcgKEVMZWF2ZSkgQ0Zic0JpdG1hcCgpOworCUNEc2E6OkNvbnN0cnVjdEwoYVdpbmRvdywgYURldmljZSk7CisJfQorCQorCQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK05PTlNIQVJBQkxFX0NMQVNTKE1Ec2JPYnMpCisJeworCXB1YmxpYzoKKwkJdmlydHVhbCB2b2lkIFN1cmZhY2VSZWFkeSgpID0gMDsKKwkJdmlydHVhbCBDRGlyZWN0U2NyZWVuQml0bWFwJiBEc2IoKSA9IDA7CisJfTsKKwkKK05PTlNIQVJBQkxFX0NMQVNTKENEc2JTdXJmYWNlKSA6IHB1YmxpYyBDQWN0aXZlCisJeworCXB1YmxpYzoKKwkJQ0RzYlN1cmZhY2UoTURzYk9icyYgYURzYik7CisJCVRVaW50OCogQWRkcmVzcygpOworCQl2b2lkIENvbXBsZXRlKCk7CisJCX5DRHNiU3VyZmFjZSgpOworCXByaXZhdGU6CisJCXZvaWQgUnVuTCgpOworCQl2b2lkIERvQ2FuY2VsKCk7CisJcHJpdmF0ZToKKwkJTURzYk9icyYgaURzYjsgCisJCVRVaW50OCogaUFkZHJlc3M7CisJfTsJCisKK0NEc2JTdXJmYWNlOjpDRHNiU3VyZmFjZShNRHNiT2JzJiBhRHNiKSA6IENBY3RpdmUoQ0FjdGl2ZTo6RVByaW9yaXR5SGlnaCkgLCBpRHNiKGFEc2IpCisJeworCUNBY3RpdmVTY2hlZHVsZXI6OkFkZCh0aGlzKTsKKwl9CisKK0NEc2JTdXJmYWNlOjp+Q0RzYlN1cmZhY2UoKQorCXsKKwlDYW5jZWwoKTsKKwl9CisJCit2b2lkIENEc2JTdXJmYWNlOjpDb21wbGV0ZSgpCisJeworCWlmKGlBZGRyZXNzICE9IE5VTEwgJiYgIUlzQWN0aXZlKCkpCisJCXsKKwkJaUFkZHJlc3MgPSBOVUxMOworCQlTZXRBY3RpdmUoKTsKKwkJaURzYi5Ec2IoKS5FbmRVcGRhdGUoaVN0YXR1cyk7CisJCX0KKwl9CisJCitUVWludDgqIENEc2JTdXJmYWNlOjpBZGRyZXNzKCkKKwl7CisJaWYoaUFkZHJlc3MgPT0gTlVMTCAmJiAhSXNBY3RpdmUoKSkKKwkJeworCQlUQWNjZWxlcmF0ZWRCaXRtYXBJbmZvIGluZm87CisJCWlmKEtFcnJOb25lID09IGlEc2IuRHNiKCkuQmVnaW5VcGRhdGUoaW5mbykpCisJCQlpQWRkcmVzcyA9IGluZm8uaUFkZHJlc3M7CisJCX0KKwlyZXR1cm4gaUFkZHJlc3M7CisJfQorCQordm9pZCBDRHNiU3VyZmFjZTo6UnVuTCgpCisJeworCWlEc2IuU3VyZmFjZVJlYWR5KCk7CisJfQorCit2b2lkIENEc2JTdXJmYWNlOjpEb0NhbmNlbCgpCisJeworCS8vZW1wdHkKKwl9CisJCQorTk9OU0hBUkFCTEVfQ0xBU1MoQ0RzYUIpIDogcHVibGljIENEc2EsIHB1YmxpYyBNRHNiT2JzCisJeworCXB1YmxpYzoKKwkJQ0RzYUIoUldzU2Vzc2lvbiYgYVNlc3Npb24sIFRJbnQgYUZsYWdzKTsKKwlwcml2YXRlOgorCQl+Q0RzYUIoKTsKKwkJVFVpbnQ4KiBMb2NrU3VyZmFjZSgpOworCQl2b2lkIFVubG9ja0hXU3VyZmFjZVJlcXVlc3RDb21wbGV0ZSgpOworCQl2b2lkIFVubG9ja0h3U3VyZmFjZSgpOworCQl2b2lkIENyZWF0ZVN1cmZhY2VMKCk7CisJCXZvaWQgV2lwZShUSW50IGFMZW5ndGgpOworCQl2b2lkIFJlY3JlYXRlTCgpOworCQl2b2lkIENvbnN0cnVjdEwoUldpbmRvdyYgYVdpbmRvdywgQ1dzU2NyZWVuRGV2aWNlJiBhRGV2aWNlKTsKKwkJQ0RpcmVjdFNjcmVlbkJpdG1hcCYgRHNiKCk7CisJCXZvaWQgU3VyZmFjZVJlYWR5KCk7CisJCVRJbnQgRXh0ZXJuYWxVcGRhdGUoKTsKKwlwcml2YXRlOgorCQlDRHNiU3VyZmFjZSogaVN1cmZhY2UxOworCQlDRHNiU3VyZmFjZSogaVN1cmZhY2UyOworCQlDRGlyZWN0U2NyZWVuQml0bWFwKiBpRHNiOworCQlUSW50IGlUeXBlOworCX07CisKK0NEc2FCOjpDRHNhQihSV3NTZXNzaW9uJiBhU2Vzc2lvbiwgVEludCBhRmxhZ3MpIDogQ0RzYShhU2Vzc2lvbiksIGlUeXBlKGFGbGFncykKKwl7CisJfQorCisKKwkKK3ZvaWQgQ0RzYUI6OlVubG9ja0hXU3VyZmFjZVJlcXVlc3RDb21wbGV0ZSgpCisJeworCWlTdXJmYWNlMS0+Q29tcGxldGUoKTsKKwlpZihpU3VyZmFjZTIgIT0gTlVMTCkKKwkJaVN1cmZhY2UyLT5Db21wbGV0ZSgpOworCX0JCisKK3ZvaWQgQ0RzYUI6OkNyZWF0ZVN1cmZhY2VMKCkKKwl7CisJX19BU1NFUlRfQUxXQVlTKFN3U2l6ZSgpID09IEh3UmVjdCgpLlNpemUoKSwgUEFOSUMoS0Vyck5vdFN1cHBvcnRlZCkpOworCX0KKwkKK3ZvaWQgQ0RzYUI6OldpcGUoVEludCBhTGVuZ3RoKSAvL2RvbnQgY2FsbCBpbiBkcmF3aW5nCisJeworCVRVaW50OCogYWRkciA9IExvY2tTdXJmYWNlKCk7CisJaWYoYWRkciAhPSBOVUxMKSAKKwkJeworCQlNZW06OkZpbGxaKGFkZHIsIGFMZW5ndGgpOworCQlVbmxvY2tId1N1cmZhY2UoKTsKKwkJfQorCX0KKwkKKwordm9pZCBDRHNhQjo6VW5sb2NrSHdTdXJmYWNlKCkKKwl7CisJRXBvY1NkbEVudjo6UmVxdWVzdChDRHNhOjpFUmVxdWVzdFVwZGF0ZSk7CisJfQorCQorVFVpbnQ4KiBDRHNhQjo6TG9ja1N1cmZhY2UoKQorCXsKKwlUVWludDgqIGFkZHIgPSAgaVN1cmZhY2UxLT5BZGRyZXNzKCk7CisJaWYoYWRkciA9PSBOVUxMICYmIGlTdXJmYWNlMiAhPSBOVUxMKQorCQlhZGRyID0gIGlTdXJmYWNlMi0+QWRkcmVzcygpOworCVNldFVwZGF0aW5nKGFkZHIgPT0gTlVMTCk7CisJcmV0dXJuIGFkZHI7CisJfQorCQordm9pZCBDRHNhQjo6U3VyZmFjZVJlYWR5KCkJCisJeworCVNldFVwZGF0aW5nKEVGYWxzZSk7CisJfQorCitDRGlyZWN0U2NyZWVuQml0bWFwJiBDRHNhQjo6RHNiKCkKKwl7CisJcmV0dXJuICppRHNiOworCX0KKwkKK3ZvaWQgQ0RzYUI6OkNvbnN0cnVjdEwoUldpbmRvdyYgYVdpbmRvdywgQ1dzU2NyZWVuRGV2aWNlJiBhRGV2aWNlKQorCXsKKwlpZihpRHNiID09IE5VTEwpCisJCWlEc2IgPSBDRGlyZWN0U2NyZWVuQml0bWFwOjpOZXdMKCk7CQorCUNEc2E6OkNvbnN0cnVjdEwoYVdpbmRvdywgYURldmljZSk7CisJaWYoaVN1cmZhY2UxID09IE5VTEwpCQorCQlpU3VyZmFjZTEgPSBuZXcgKEVMZWF2ZSkgQ0RzYlN1cmZhY2UoKnRoaXMpOworCWlmKGlTdXJmYWNlMiA9PSBOVUxMICYmIGlUeXBlICYgQ0RpcmVjdFNjcmVlbkJpdG1hcDo6RURvdWJsZUJ1ZmZlcikKKwkJaVN1cmZhY2UyID0gbmV3IChFTGVhdmUpIENEc2JTdXJmYWNlKCp0aGlzKTsKKwl9CisJCitDRHNhQjo6fkNEc2FCKCkKKwl7CisJZGVsZXRlIGlTdXJmYWNlMTsKKwlkZWxldGUgaVN1cmZhY2UyOworCWRlbGV0ZSBpRHNiOworCX0JCisKK3ZvaWQgQ0RzYUI6OlJlY3JlYXRlTCgpCisJeworICAgIGlEc2ItPkNsb3NlKCk7CisgICAgaURzYi0+Q3JlYXRlKEh3UmVjdCgpLCBDRGlyZWN0U2NyZWVuQml0bWFwOjpUU2V0dGluZ3NGbGFncyhpVHlwZSkpOworCX0KKwkKK1RJbnQgQ0RzYUI6OkV4dGVybmFsVXBkYXRlKCkKKwl7CisJaWYoTG9ja1N1cmZhY2UoKSkKKwkJeworCQlVbmxvY2tIV1N1cmZhY2VSZXF1ZXN0Q29tcGxldGUoKTsKKwkJcmV0dXJuIEtFcnJOb25lOworCQl9CisJcmV0dXJuIEtFcnJOb3RSZWFkeTsKKwl9CisJCQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwkKKworCitDRHNhKiBDRHNhOjpDcmVhdGVMKFJXc1Nlc3Npb24mIGFTZXNzaW9uKQorCXsKKwlpZihFcG9jU2RsRW52OjpGbGFncyhDU0RMOjpFRHJhd01vZGVEU0IpKQorCQl7CisJCVRJbnQgZmxhZ3MgPSBDRGlyZWN0U2NyZWVuQml0bWFwOjpFTm9uZTsKKwkJaWYoRXBvY1NkbEVudjo6RmxhZ3MoQ1NETDo6RURyYXdNb2RlRFNCRG91YmxlQnVmZmVyKSkKKwkJCWZsYWdzIHw9IENEaXJlY3RTY3JlZW5CaXRtYXA6OkVEb3VibGVCdWZmZXI7CisJCWlmKEVwb2NTZGxFbnY6OkZsYWdzKENTREw6OkVEcmF3TW9kZURTQkluY3JlbnRhbFVwZGF0ZSkpCisJCQlmbGFncyB8PSBDRGlyZWN0U2NyZWVuQml0bWFwOjpFSW5jcmVtZW50YWxVcGRhdGU7CisJCXJldHVybiBuZXcgKEVMZWF2ZSkgQ0RzYUIoYVNlc3Npb24sIGZsYWdzKTsKKwkJfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG5ldyAoRUxlYXZlKSBDRHNhQShhU2Vzc2lvbik7CisJfSAgIAorCQorCQordm9pZCBDRHNhOjpSZWNyZWF0ZUwoKQorCXsKKwl9CisKK3ZvaWQgQ0RzYTo6RnJlZSgpCisJeworCX0KKwkKK1RTaXplIENEc2E6OldpbmRvd1NpemUoKSBjb25zdAorCXsKKwlUU2l6ZSBzaXplID0gaVN3U2l6ZTsKKwlpZihpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbjkwKQorCQl7CisJCWNvbnN0IFRJbnQgdG1wID0gc2l6ZS5pV2lkdGg7CisJCXNpemUuaVdpZHRoID0gc2l6ZS5pSGVpZ2h0OworCQlzaXplLmlIZWlnaHQgPSB0bXA7CisJCX0KKwlyZXR1cm4gc2l6ZTsKKwl9CisJCit2b2lkIENEc2E6OlNldFN1c3BlbmQoKQorCXsKKwlpU3RhdGVGbGFncyB8PSBFU2RsVGhyZWFkU3VzcGVuZDsKKwl9CisKK3ZvaWQgQ0RzYTo6UmVsZWFzZVN0b3AoKQorCXsKKwlpU3RhdGVGbGFncyAmPSB+RVNkbFRocmVhZEV4cGxpY2l0U3RvcDsKKwl9CisKKworVEJvb2wgQ0RzYTo6U3RvcHBlZCgpIGNvbnN0CisJeworCXJldHVybiAoaVN0YXRlRmxhZ3MgJiBFU2RsVGhyZWFkRXhwbGljaXRTdG9wKTsKKwl9CisKK3ZvaWQgQ0RzYTo6U2V0T3JpZW50YXRpb24oQ1NETDo6VE9yaWVudGF0aW9uTW9kZSBhT3JpZW50YXRpb24pCisJeworCVRJbnQgZmxhZ3MgPSAwOworCXN3aXRjaChhT3JpZW50YXRpb24pCisJCXsKKwkJY2FzZSBDU0RMOjpFT3JpZW50YXRpb245MDoKKwkJCWZsYWdzID0gRU9yaWVudGF0aW9uOTA7CisJCQlicmVhazsKKwkJY2FzZSBDU0RMOjpFT3JpZW50YXRpb24xODA6CisJCQlmbGFncyA9IEVPcmllbnRhdGlvbjE4MDsKKwkJCWJyZWFrOworCQljYXNlIENTREw6OkVPcmllbnRhdGlvbjI3MDoKKwkJCWZsYWdzID0gRU9yaWVudGF0aW9uOTAgfCBFT3JpZW50YXRpb24xODA7CisJCQlicmVhazsKKwkJY2FzZSBDU0RMOjpFT3JpZW50YXRpb24wOgorCQkJZmxhZ3MgPSAwOworCQkJYnJlYWs7CisJCX0KKwlpZihmbGFncyAhPSAoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb25GbGFncykpCisJCXsKKwkJaVN0YXRlRmxhZ3MgfD0gRU9yaWVudGF0aW9uQ2hhbmdlZDsKKwkJaU5ld0ZsYWdzID0gZmxhZ3M7IC8vY2Fubm90IGJlIHNldCBkdXJpbmcgZHJhd2luZy4uLgorCQl9CisJfQorCitDRHNhOjp+Q0RzYSgpCisgICAgeworICAgIGlmKGlEc2EgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICBpRHNhLT5DYW5jZWwoKTsKKyAgICAgICAgfQorICAgIGlPdmVybGF5cy5DbG9zZSgpOworICAgIGRlbGV0ZSBpRHNhOworICAgIFVzZXI6OkZyZWUoaUx1dDI1Nik7CisgICAgfQorICAgICAgICAgCit2b2lkIENEc2E6OkNvbnN0cnVjdEwoUldpbmRvdyYgYVdpbmRvdywgQ1dzU2NyZWVuRGV2aWNlJiBhRGV2aWNlKQorICAgIHsKKyAgICBpZihpRHNhICE9IE5VTEwpCisgICAgCXsKKyAgICAJaURzYS0+Q2FuY2VsKCk7CisgICAgCWRlbGV0ZSBpRHNhOworICAgIAlpRHNhID0gTlVMTDsKKyAgICAJfQorICAgIAkKKyAgICBpRHNhID0gQ0RpcmVjdFNjcmVlbkFjY2Vzczo6TmV3TCgKKyAgICAJCQkJaVNlc3Npb24sCisJCQkJCWFEZXZpY2UsCisJCQkJCWFXaW5kb3csCisJCQkJCSp0aGlzKTsJCQkJCisKKwlpZihpTHV0MjU2ID09IE5VTEwpCisJCWlMdXQyNTYgPSAoVFVpbnQzMiopIFVzZXI6OkFsbG9jTCgyNTYgKiBzaXplb2YoVFVpbnQzMikpOworCWlUYXJnZXRNb2RlID0gYVdpbmRvdy5EaXNwbGF5TW9kZSgpOworCWlUYXJnZXRCcHAgPSBCeXRlc1BlclBpeGVsKERpc3BsYXlNb2RlKCkpOworCWlTY3JlZW5SZWN0ID0gVFJlY3QoYVdpbmRvdy5Qb3NpdGlvbigpLCBhV2luZG93LlNpemUoKSk7CisJU2V0VGFyZ2V0UmVjdCgpOworICAgIFJlc3RhcnRMKCk7CisgICAgfQorICAgIAordm9pZCBDRHNhOjpEcmF3T3ZlcmxheXMoKQorCXsKKwljb25zdCBUSW50IGxhc3QgPSBpT3ZlcmxheXMuQ291bnQoKSAtIDE7CisJZm9yKFRJbnQgaSA9IGxhc3Q7IGkgPj0gMCA7IGktLSkKKwkJaU92ZXJsYXlzW2ldLmlPdmVybGF5LT5EcmF3KCppRHNhLT5HYygpLCBId1JlY3QoKSwgU3dTaXplKCkpOworCX0KKworVEludCBDRHNhOjpBcHBlbmRPdmVybGF5KE1PdmVybGF5JiBhT3ZlcmxheSwgVEludCBhUHJpb3JpdHkpCisJeworCVRJbnQgaTsKKwlmb3IoaSA9IDA7IGkgPCBpT3ZlcmxheXMuQ291bnQoKSAmJiBpT3ZlcmxheXNbaV0uaVByaW9yaXR5IDwgYVByaW9yaXR5OyBpKyspCisJCXt9CisJY29uc3QgVE92ZXJsYXkgb3ZlcmxheSA9IHsmYU92ZXJsYXksIGFQcmlvcml0eX07CisJcmV0dXJuIGlPdmVybGF5cy5JbnNlcnQob3ZlcmxheSwgaSk7CisJfQorCQorVEludCBDRHNhOjpSZW1vdmVPdmVybGF5KE1PdmVybGF5JiBhT3ZlcmxheSkKKwl7CisJZm9yKFRJbnQgaSA9IDA7IGkgPCBpT3ZlcmxheXMuQ291bnQoKTsgaSsrKQorCQl7CisJCWlmKGlPdmVybGF5c1tpXS5pT3ZlcmxheSA9PSAmYU92ZXJsYXkpCisJCQl7CisJCQlpT3ZlcmxheXMuUmVtb3ZlKGkpOworCQkJcmV0dXJuIEtFcnJOb25lOworCQkJfQorCQl9CisJcmV0dXJuIEtFcnJOb3RGb3VuZDsKKwl9CisKK3ZvaWQgQ0RzYTo6TG9ja1BhbGV0dGUoVEJvb2wgYUxvY2spCisJeworCWlmKGFMb2NrKQorCQlpU3RhdGVGbGFncyB8PSBFUGFsZXR0ZUxvY2tlZDsKKwllbHNlCisJCWlTdGF0ZUZsYWdzICY9IH5FUGFsZXR0ZUxvY2tlZDsKKwl9CitUSW50IENEc2E6OlNldFBhbGV0dGUoVEludCBhRmlyc3QsIFRJbnQgYUNvdW50LCBUVWludDMyKiBhUGFsZXR0ZSkKKwl7CisJaWYoaUx1dDI1NiA9PSBOVUxMKQorCQlyZXR1cm4gS0Vyck5vdEZvdW5kOworCWNvbnN0IFRJbnQgY291bnQgPSBhQ291bnQgLSBhRmlyc3Q7CisJaWYoY291bnQgPiAyNTYpCisJCXJldHVybiBLRXJyQXJndW1lbnQ7CisJaWYoaVN0YXRlRmxhZ3MgJiBFUGFsZXR0ZUxvY2tlZCkKKwkJcmV0dXJuIEtFcnJOb25lOworCWZvcihUSW50IGkgPSBhRmlyc3Q7IGkgPCBjb3VudDsgaSsrKSAvL25vdCBzbyBidXN5IGhlcmU6LSkKKwkJeworCQlpTHV0MjU2W2ldID0gYVBhbGV0dGVbaV07CisJCX0KKwlyZXR1cm4gS0Vyck5vbmU7CisJfQorCQorCQorCit2b2lkIENEc2E6OlJlc3RhcnRMKCkKKyAgICB7CisgICAgLy9jb25zdCBUQm9vbCBhY3RpdmUgPSBpRHNhLT5Jc0FjdGl2ZSgpOworICAgIAorICAgIC8vaWYoIWFjdGl2ZSkKKyAgICAKKyAgICBpRHNhLT5TdGFydEwoKTsJCisgICAgCisgICAgY29uc3QgUlJlZ2lvbiogciA9IGlEc2EtPkRyYXdpbmdSZWdpb24oKTsKKyAgICBjb25zdCBUUmVjdCByZWN0ID0gci0+Qm91bmRpbmdSZWN0KCk7CisgICAgaURzYS0+R2MoKS0+U2V0Q2xpcHBpbmdSZWdpb24ocik7CQorICAgCisgICAgaWYocmVjdCAhPSBpU2NyZWVuUmVjdCkKKyAgICAJeworICAgIC8vCWlEc2EtPkNhbmNlbCgpOworICAgIAlyZXR1cm4gOwkKKyAgIAkgCX0KKyAgIAkgCQorICAgICAKKyAgICAJCisgICAgLy9pU2NyZWVuUmVjdCA9IHJlY3Q7IC8vdG8gZW5zdXJlIHByb3Blcmx5IHNldCwgYWxiZWl0IG1heSBub3QoPykgbWF0Y2ggdG8gdmFsdWUgU0RMIGhhcyAtIHRoZXJlZm9yZSBtYXkgaGFzIHRvIGNsaXAKKwkvL3RhcmdldHJlY3Qgc2hhbGwgbm8gY2hhbmdlCisJU2V0VGFyZ2V0UmVjdCgpOworCVJlY3JlYXRlTCgpOworCisgICAgaVN0YXRlRmxhZ3MgfD0gRVJ1bm5pbmc7CisgICAgCisgICAgUmVsZWFzZVN0b3AoKTsKKyAgICBpZihpU3RhdGVGbGFncyAmIEVTZGxUaHJlYWRTdXNwZW5kKQorICAgIAl7CisgICAgCUVwb2NTZGxFbnY6OlJlc3VtZSgpOworICAgIAlpU3RhdGVGbGFncyAmPSB+IEVTZGxUaHJlYWRTdXNwZW5kOworICAgIAl9CQorICAgIEVwb2NTZGxFbnY6Ok9ic2VydmVyRXZlbnQoTVNETE9ic2VydmVyOjpFRXZlbnRXaW5kb3dSZXNlcnZlZCk7CQorICAgIH0KKyAgICAKK0NEc2E6OkNEc2EoUldzU2Vzc2lvbiYgYVNlc3Npb24pIDogCisgCWlTZXNzaW9uKGFTZXNzaW9uKSwKKyAgCWlTdGF0ZUZsYWdzKDApCisJeworLy8JQ0FjdGl2ZVNjaGVkdWxlcjo6QWRkKHRoaXMpOworCWlDRlRhYmxlWzBdID0gQ29weU1lbTsKKwlpQ0ZUYWJsZVsxXSA9IENvcHlNZW1GbGlwUmV2ZXJzZWQ7CisJaUNGVGFibGVbMl0gPSBDb3B5TWVtUmV2ZXJzZWQ7CisJaUNGVGFibGVbM10gPSBDb3B5TWVtRmxpcDsJCisJCisJaUNGVGFibGVbNF0gPSBDb3B5MjU2OworCWlDRlRhYmxlWzVdID0gQ29weTI1NkZsaXBSZXZlcnNlZDsKKwlpQ0ZUYWJsZVs2XSA9IENvcHkyNTZSZXZlcnNlZDsKKwlpQ0ZUYWJsZVs3XSA9IENvcHkyNTZGbGlwOwkKKwkKKwkKKwlpQ0ZUYWJsZVs4XSA9IENvcHlTbG93OworCWlDRlRhYmxlWzldID0gQ29weVNsb3dGbGlwUmV2ZXJzZWQ7CisJaUNGVGFibGVbMTBdID0gQ29weVNsb3dSZXZlcnNlZDsKKwlpQ0ZUYWJsZVsxMV0gPSBDb3B5U2xvd0ZsaXA7CQorCX0KKwkKK1JXc1Nlc3Npb24mIENEc2E6OlNlc3Npb24oKQorCXsKKwlyZXR1cm4gaVNlc3Npb247CisJfQorCitUSW50IENEc2E6OlJlZHJhd1JlcXVlc3QoKQorCXsKKwlpZighKGlTdGF0ZUZsYWdzICYgKEVVcGRhdGluZykgJiYgKGlTdGF0ZUZsYWdzICYgRVJ1bm5pbmcpKSkKKwkJeworCQlyZXR1cm4gRXh0ZXJuYWxVcGRhdGUoKTsKKwkJfQorCXJldHVybiBLRXJyTm90UmVhZHk7CisJfQorCitUVWludDgqIENEc2E6OkxvY2tId1N1cmZhY2UoKQorCXsKKwlpZigoaVN0YXRlRmxhZ3MgJiBFVXBkYXRpbmcpID09IDApIC8vZWxzZSBmcmFtZSBpcyBza2lwcGVkCisJCXsKKwkJcmV0dXJuIExvY2tTdXJmYWNlKCk7CisJCX0KKwlyZXR1cm4gTlVMTDsgCisJfQorCisvKgkKK3ZvaWQgQ0RzYTo6UnVuTCgpCisJeworCWlTdGF0ZUZsYWdzICY9IH5FVXBkYXRpbmc7CisJfQorCQkKKwkKK3ZvaWQgQ0RzYTo6RG9DYW5jZWwoKQorCXsKKwlpU3RhdGVGbGFncyAmPSB+RVVwZGF0aW5nOworCS8vbm90aGluZyBjYW4gZG8sIGp1c3Qgd2FpdD8KKwl9CisqLwkKKworCQorVEludCBDRHNhOjpBbGxvY1N1cmZhY2UoVEJvb2wgYUh3U3VyZmFjZSwgY29uc3QgVFNpemUmIGFTaXplLCBURGlzcGxheU1vZGUgYU1vZGUpCisJeworCWlmKGFId1N1cmZhY2UgJiYgYU1vZGUgIT0gRGlzcGxheU1vZGUoKSkKKwkJcmV0dXJuIEtFcnJBcmd1bWVudDsKKwkKKwlpU291cmNlTW9kZSA9IGFNb2RlOworCQorCWlTb3VyY2VCcHAgPSBCeXRlc1BlclBpeGVsKGFNb2RlKTsKKwkKKwljb25zdCBUU2l6ZSBzaXplID0gV2luZG93U2l6ZSgpOworCWlmKGFTaXplLmlXaWR0aCA+IHNpemUuaVdpZHRoKQorCQlyZXR1cm4gS0VyclRvb0JpZzsKKwlpZihhU2l6ZS5pSGVpZ2h0ID4gc2l6ZS5pSGVpZ2h0KQorCQlyZXR1cm4gS0VyclRvb0JpZzsKKwkKKwlUUkFQRChlcnIsIENyZWF0ZVN1cmZhY2VMKCkpOworCWlmKGVyciAhPSBLRXJyTm9uZSkKKwkJcmV0dXJuIGVycjsKKworCVNldENvcHlGdW5jdGlvbigpOworCQorCXJldHVybiBLRXJyTm9uZTsKKwl9CisJCisKK3ZvaWQgQ0RzYTo6Q3JlYXRlWm9vbWVyTChjb25zdCBUU2l6ZSYgYVNpemUpCisJeworCWlTd1NpemUgPSBhU2l6ZTsKKwlpU3RhdGVGbGFncyB8PSBFUmVzaXplUmVxdWVzdDsKKwlDcmVhdGVTdXJmYWNlTCgpOworCVNldFRhcmdldFJlY3QoKTsKKwl9CisJCisKKy8qCit2b2lkIFNhdmVCbXAoY29uc3QgVERlc0MmIGFOYW1lLCBjb25zdCBUQW55KiBhRGF0YSwgVEludCBhTGVuZ3RoLCBjb25zdCBUU2l6ZSYgYVN6LCBURGlzcGxheU1vZGUgYU1vZGUpCisJeworCUNGYnNCaXRtYXAqIHMgPSBuZXcgQ0Zic0JpdG1hcCgpOworCXMtPkNyZWF0ZShhU3osIGFNb2RlKTsKKwlzLT5Mb2NrSGVhcCgpOworCVRVaW50MzIqIGFkZHIgPSBzLT5EYXRhQWRkcmVzcygpOworCU1lbTo6Q29weShhZGRyLCBhRGF0YSwgYUxlbmd0aCk7CisJcy0+VW5sb2NrSGVhcCgpOworCXMtPlNhdmUoYU5hbWUpOworCXMtPlJlc2V0KCk7CisJZGVsZXRlIHM7CisJfQorCQordm9pZCBTYXZlQm1wKGNvbnN0IFREZXNDJiBhTmFtZSwgY29uc3QgVFVpbnQzMiogYURhdGEsIGNvbnN0IFRTaXplJiBhU3opCisJeworCUNGYnNCaXRtYXAqIHMgPSBuZXcgQ0Zic0JpdG1hcCgpOworCXMtPkNyZWF0ZShhU3osIEVDb2xvcjY0Syk7CisJVEJpdG1hcFV0aWwgYm1wKHMpOworCWJtcC5CZWdpbihUUG9pbnQoMCwgMCkpOworCWZvcihUSW50IGogPSAwOyBqIDwgYVN6LmlIZWlnaHQ7IGorKykKKwkJeworCQlibXAuU2V0UG9zKFRQb2ludCgwLCBqKSk7CisJCWZvcihUSW50IGkgPSAwOyBpIDwgYVN6LmlXaWR0aDsgaSsrKQorCQkJeworCQkJYm1wLlNldFBpeGVsKCphRGF0YSk7CisJCQlhRGF0YSsrOworCQkJYm1wLkluY1hQb3MoKTsKKwkJCX0KKwkJfQorCWJtcC5FbmQoKTsKKwlzLT5TYXZlKGFOYW1lKTsKKwlzLT5SZXNldCgpOworCWRlbGV0ZSBzOworCX0JCisJCitUQnVmPDE2PiBGb29OYW1lKFRJbnQgYUZvbykKKwl7CisJVEJ1ZjwxNj4gYjsKKwliLkZvcm1hdChfTCgiQzpcXHBpYyVkLm1ibSIpLCBhRm9vKTsKKwlyZXR1cm4gYjsKKwl9CisJCit2b2lkIENsaXBDb3B5KFRVaW50OCogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBjb25zdCBUUmVjdCYgYVJlY3QsIGNvbnN0IFRQb2ludCYgYVRhcmdldFBvcykKKwl7CisJY29uc3QgVEludCBpU291cmNlQnBwID0gMTsKKwljb25zdCBUSW50IGlUYXJnZXRCcHAgPSA0OworCWNvbnN0IFRJbnQgaVNjYW5MaW5lV2lkdGggPSA4MDA7IAorCQorCVRVaW50OCogdGFyZ2V0ID0gYVRhcmdldDsKKwljb25zdCBUVWludDgqIHNvdXJjZSA9IGFTb3VyY2U7CisJY29uc3QgVEludCBsaW5lV2lkdGggPSBhUmVjdC5XaWR0aCgpOworCXNvdXJjZSArPSBpU291cmNlQnBwICogKGFSZWN0LmlUbC5pWSAqIGxpbmVXaWR0aCk7IAorCWNvbnN0IFRJbnQgc291cmNlU3RhcnRPZmZzZXQgPSBpU291cmNlQnBwICogIGFSZWN0LmlUbC5pWDsKKwlzb3VyY2UgKz0gc291cmNlU3RhcnRPZmZzZXQ7CisJdGFyZ2V0ICs9IGlUYXJnZXRCcHAgKiAoKGFUYXJnZXRQb3MuaVkgKyBhUmVjdC5pVGwuaVkgKSAqIGxpbmVXaWR0aCk7IAorCWNvbnN0IFRJbnQgdGFyZ2V0U3RhcnRPZmZzZXQgPSBpVGFyZ2V0QnBwICogKGFSZWN0LmlUbC5pWCArIGFUYXJnZXRQb3MuaVgpOworCXRhcmdldCArPSB0YXJnZXRTdGFydE9mZnNldDsKKwlUVWludDMyKiB0YXJnZXRQdHIgPSByZWludGVycHJldF9jYXN0PFRVaW50MzIqPih0YXJnZXQpOworCWNvbnN0IFRJbnQgdGFyZ2V0V2lkdGggPSBpU2NhbkxpbmVXaWR0aCA+PiAyOworCWNvbnN0IFRJbnQgaGVpZ2h0ID0gYVJlY3QuSGVpZ2h0KCk7IAorCX0JCisqLworLyoKK3ZvaWQgQ0RzYTo6Q2xpcENvcHkoVFVpbnQ4KiBhVGFyZ2V0LAorIAkJCQkJY29uc3QgVFVpbnQ4KiBhU291cmNlLAorIAkJCQkJY29uc3QgVFJlY3QmIGFVcGRhdGVSZWN0LAorIAkJCQkJY29uc3QgVFJlY3QmIGFTb3VyY2VSZWN0KSBjb25zdAorCXsKKwkvL1RVaW50OCogdGFyZ2V0ID0gYVRhcmdldDsKKwljb25zdCBUVWludDMyKiBzb3VyY2UgPSAoY29uc3QgVFVpbnQzMiopIGFTb3VyY2U7CisJY29uc3QgVEludCBsaW5lV2lkdGggPSBhU291cmNlUmVjdC5XaWR0aCgpOworCQorCXNvdXJjZSArPSAgKGFVcGRhdGVSZWN0LmlUbC5pWSAqIGxpbmVXaWR0aCk7IAorCWNvbnN0IFRJbnQgc291cmNlU3RhcnRPZmZzZXQgPSAgIGFVcGRhdGVSZWN0LmlUbC5pWDsKKwlzb3VyY2UgKz0gc291cmNlU3RhcnRPZmZzZXQ7CisJCisJVFVpbnQzMiogdGFyZ2V0UHRyID0gcmVpbnRlcnByZXRfY2FzdDxUVWludDMyKj4oYVRhcmdldCk7CisJCisJdGFyZ2V0UHRyICs9ICAoYVNvdXJjZVJlY3QuaVRsLmlZICsgYVVwZGF0ZVJlY3QuaVRsLmlZICkgKiBTd1NpemUoKS5pV2lkdGg7IAorCWNvbnN0IFRJbnQgdGFyZ2V0U3RhcnRPZmZzZXQgPSAgKGFVcGRhdGVSZWN0LmlUbC5pWCArIGFTb3VyY2VSZWN0LmlUbC5pWCk7CisJCisJdGFyZ2V0UHRyICs9IHRhcmdldFN0YXJ0T2Zmc2V0OworCQorLy8JVFVpbnQzMiogdGFyZ2V0UHRyID0gcmVpbnRlcnByZXRfY2FzdDxUVWludDMyKj4odGFyZ2V0KTsKKwkKKwljb25zdCBUSW50IHRhcmdldFdpZHRoMzIgPSBTd1NpemUoKS5pV2lkdGg7CisJCisJY29uc3QgVEludCBoZWlnaHQgPSBhVXBkYXRlUmVjdC5IZWlnaHQoKTsgCisJCQorCWNvbnN0IFRJbnQgbGluZU1vdmUgPSBpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbjkwID8gMSA6IGxpbmVXaWR0aDsKKwljb25zdCBUSW50IGNvcHlMZW4gPSBhVXBkYXRlUmVjdC5XaWR0aCgpOworCQorCQorCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uMTgwKQorCQl7CisJCQorCQl0YXJnZXRQdHIgKz0gdGFyZ2V0V2lkdGgzMiAqICAoaGVpZ2h0IC0gMSk7CisJCisJCWZvcihUSW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIC8vc291cmNlIGlzIGFsd2F5cyBzbWFsbGVyCisJCQl7CisJCQlpQ29weUZ1bmN0aW9uKCp0aGlzLCB0YXJnZXRQdHIsIChUVWludDgqKXNvdXJjZSwgY29weUxlbiwgaGVpZ2h0KTsKKwkJCXNvdXJjZSArPSBsaW5lTW92ZTsKKwkJCXRhcmdldFB0ciAtPSB0YXJnZXRXaWR0aDMyOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCQorCQkKKwkJZm9yKFRJbnQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgLy9zb3VyY2UgaXMgYWx3YXlzIHNtYWxsZXIKKwkJCXsKKwkJCWlDb3B5RnVuY3Rpb24oKnRoaXMsIHRhcmdldFB0ciwgKFRVaW50OCopc291cmNlLCBjb3B5TGVuLCBoZWlnaHQpOworCQkJc291cmNlICs9IGxpbmVNb3ZlOworCQkJdGFyZ2V0UHRyICs9IHRhcmdldFdpZHRoMzI7IC8vID4+IDI7CisJCQl9CisJCX0KKworCX0KKwkKKyovCisKK3ZvaWQgQ0RzYTo6Q2xpcENvcHkoVFVpbnQ4KiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIGNvbnN0IFRSZWN0JiBhUmVjdCwgY29uc3QgVFBvaW50JiBhVGFyZ2V0UG9zKSBjb25zdAorCXsKKwlUVWludDgqIHRhcmdldCA9IGFUYXJnZXQ7CisJY29uc3QgVFVpbnQ4KiBzb3VyY2UgPSBhU291cmNlOworCWNvbnN0IFRJbnQgbGluZVdpZHRoID0gYVJlY3QuV2lkdGgoKTsKKwlzb3VyY2UgKz0gaVNvdXJjZUJwcCAqIChhUmVjdC5pVGwuaVkgKiBsaW5lV2lkdGgpOyAKKwlUSW50IHNvdXJjZVN0YXJ0T2Zmc2V0ID0gaVNvdXJjZUJwcCAqICBhUmVjdC5pVGwuaVg7CisJc291cmNlICs9IHNvdXJjZVN0YXJ0T2Zmc2V0OworCXRhcmdldCArPSBpVGFyZ2V0QnBwICogKChhVGFyZ2V0UG9zLmlZICsgYVJlY3QuaVRsLmlZICkgKiBsaW5lV2lkdGgpOyAKKwlUSW50IHRhcmdldFN0YXJ0T2Zmc2V0ID0gaVRhcmdldEJwcCAqIChhUmVjdC5pVGwuaVggKyBhVGFyZ2V0UG9zLmlYKTsKKwl0YXJnZXQgKz0gdGFyZ2V0U3RhcnRPZmZzZXQ7CisJVFVpbnQzMiogdGFyZ2V0UHRyID0gcmVpbnRlcnByZXRfY2FzdDxUVWludDMyKj4odGFyZ2V0KTsKKwljb25zdCBUSW50IHRhcmdldFdpZHRoID0gaVNjYW5MaW5lV2lkdGggPj4gMjsKKwljb25zdCBUSW50IGhlaWdodCA9IGFSZWN0LkhlaWdodCgpOyAKKwkKKwlUSW50IGxpbmVNb3ZlID0gaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb245MCA/IDEgOiBsaW5lV2lkdGg7CisJCisJaWYoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb24xODApCisJCXsKKwkJCisJCXRhcmdldFB0ciArPSB0YXJnZXRXaWR0aCAqICAoaGVpZ2h0IC0gMSk7CisJCisJCWZvcihUSW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIC8vc291cmNlIGlzIGFsd2F5cyBzbWFsbGVyCisJCQl7CisJCQlpQ29weUZ1bmN0aW9uKCp0aGlzLCB0YXJnZXRQdHIsIHNvdXJjZSwgbGluZVdpZHRoLCBoZWlnaHQpOworCQkJc291cmNlICs9IGxpbmVNb3ZlOworCQkJdGFyZ2V0UHRyIC09IHRhcmdldFdpZHRoOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCQorCQkKKwkJZm9yKFRJbnQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgLy9zb3VyY2UgaXMgYWx3YXlzIHNtYWxsZXIKKwkJCXsKKwkJCWlDb3B5RnVuY3Rpb24oKnRoaXMsIHRhcmdldFB0ciwgc291cmNlLCBsaW5lV2lkdGgsIGhlaWdodCk7CisJCQlzb3VyY2UgKz0gbGluZU1vdmU7CisJCQl0YXJnZXRQdHIgKz0gdGFyZ2V0V2lkdGg7CisJCQl9CisJCX0KKworCX0KKwkKKwkJCisJCisJLyoKK3ZvaWQgQ0RzYTo6Q2xpcENvcHkoVFVpbnQ4KiBhVGFyZ2V0LAorIAkJCQkJY29uc3QgVFVpbnQ4KiBhU291cmNlLAorIAkJCQkJY29uc3QgVFJlY3QmIGFVcGRhdGVSZWN0LAorIAkJCQkJY29uc3QgVFJlY3QmIGFTb3VyY2VSZWN0KSBjb25zdAorIAkJeworIAkJY29uc3QgVERzYSBkc2EoKnRoaXMpOworIAkJc3dpdGNoKGlTb3VyY2VCcHApCisgCQkJeworIAkJCWNhc2UgMToKKyAJCQkJOjpDbGlwQ29weTxUVWludDMyLCBUVWludDg+KGRzYSwgYVRhcmdldCwgYVNvdXJjZSwgYVVwZGF0ZVJlY3QsIGFTb3VyY2VSZWN0KTsKKyAJCQkJYnJlYWs7CisgCQkJY2FzZSAyOgorIAkJCQk6OkNsaXBDb3B5PFRVaW50MzIsIFRVaW50MTY+KGRzYSwgYVRhcmdldCwgYVNvdXJjZSwgYVVwZGF0ZVJlY3QsIGFTb3VyY2VSZWN0KTsKKyAJCQkJYnJlYWs7CisgCQkJY2FzZSA0OgorIAkJCQk6OkNsaXBDb3B5PFRVaW50MzIsIFRVaW50MzI+KGRzYSwgYVRhcmdldCwgYVNvdXJjZSwgYVVwZGF0ZVJlY3QsIGFTb3VyY2VSZWN0KTsKKyAJCQkJYnJlYWs7CisgCQkJfQorIAkJfQkKKworCisqLworCisKKwordm9pZCBDRHNhOjpXaXBlKCkgLy9kb250IGNhbGwgaW4gZHJhd2luZworCXsKKwlpZihJc0RzYUF2YWlsYWJsZSgpKQorCQlXaXBlKGlUYXJnZXRCcHAgKiBTd1NpemUoKS5pV2lkdGggKiBTd1NpemUoKS5pSGVpZ2h0KTsKKwl9CisJCit2b2lkIENEc2E6OlNldENvcHlGdW5jdGlvbigpCisJeworCS8vY2FsY3VsYXRlIG9mZnNldCB0byBjb3JyZWN0IGZ1bmN0aW9uIGluIGlDRlRhYmxlIGFjY29yZGluZyB0byBnaXZlbiBwYXJhbWV0ZXJzCisJVEludCBmdW5jdGlvbiA9IDA7CisJY29uc3QgVEludCBLQ29weUZ1bmN0aW9ucyA9IDQ7CisJY29uc3QgVEludCBLT2Zmc2V0VG9OYXRpdmUgPSAwOworCWNvbnN0IFRJbnQgS09mZnNldFRvMjU2ID0gS09mZnNldFRvTmF0aXZlICsgS0NvcHlGdW5jdGlvbnM7CisJY29uc3QgVEludCBLT2Zmc2V0VG9PdGhlck1vZGVzID0gS09mZnNldFRvMjU2ICsgS0NvcHlGdW5jdGlvbnM7CisJY29uc3QgVEludCBLT2Zmc2V0VG85MEZ1bmN0aW9ucyA9IDE7CisJY29uc3QgVEludCBLT2Zmc2V0VG8xODBGdW5jdGlvbnMgPSAyOworCQorCWlmKGlTb3VyY2VNb2RlID09IERpc3BsYXlNb2RlKCkpCisJCWZ1bmN0aW9uID0gS09mZnNldFRvTmF0aXZlOyAJCS8vMAorCWVsc2UgaWYoaVNvdXJjZU1vZGUgPT0gRUNvbG9yMjU2KQorCQlmdW5jdGlvbiA9IEtPZmZzZXRUbzI1NjsJCQkvLzQKKwllbHNlCisJCWZ1bmN0aW9uID0gS09mZnNldFRvT3RoZXJNb2RlczsgCS8vOAorCQorCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uOTApCisJCWZ1bmN0aW9uICs9IEtPZmZzZXRUbzkwRnVuY3Rpb25zOyAJLy8gKyAxCisJaWYoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb24xODApCisJCWZ1bmN0aW9uICs9IEtPZmZzZXRUbzE4MEZ1bmN0aW9uczsgCS8vKyAyCisJCisJaUNvcHlGdW5jdGlvbiA9IGlDRlRhYmxlW2Z1bmN0aW9uXTsKKwkKKwlXaXBlKCk7CisJfQorCQoraW5saW5lIHZvaWQgUm90YXRlKFRSZWN0JiBhUmVjdCkKKwl7CisJY29uc3QgVEludCBkeCA9IGFSZWN0LmlCci5pWCAtIGFSZWN0LmlUbC5pWDsKKwljb25zdCBUSW50IGR5ID0gYVJlY3QuaUJyLmlZIC0gYVJlY3QuaVRsLmlZOworCisJYVJlY3QuaUJyLmlYID0gYVJlY3QuaVRsLmlYICsgZHk7CisJYVJlY3QuaUJyLmlZID0gYVJlY3QuaVRsLmlZICsgZHg7CisJCisJY29uc3QgVEludCB0bXAgPSBhUmVjdC5pVGwuaVg7CisJYVJlY3QuaVRsLmlYID0gYVJlY3QuaVRsLmlZOworCWFSZWN0LmlUbC5pWSA9IHRtcDsKKwl9CisJCisvKgkKK2ludCBiYXIgPSAwOworKi8JCisvKgorVEJvb2wgQ0RzYTo6QWRkVXBkYXRlUmVjdChjb25zdCBUVWludDgqIGFCaXRzLCBjb25zdCBUUmVjdCYgYVVwZGF0ZVJlY3QsIGNvbnN0IFRSZWN0JiBhUmVjdCkKKwl7CisKKwlpZihpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbkNoYW5nZWQpCisJCXsKKwkJaVN0YXRlRmxhZ3MgJj0gfkVPcmllbnRhdGlvbkZsYWdzOworCQlpU3RhdGVGbGFncyB8PSBpTmV3RmxhZ3M7CisJCVNldENvcHlGdW5jdGlvbigpOworCQlpU3RhdGVGbGFncyAmPSB+RU9yaWVudGF0aW9uQ2hhbmdlZDsKKwkgICAgRXBvY1NkbEVudjo6V2FpdERldmljZUNoYW5nZSgpOworCSAgICByZXR1cm4gRUZhbHNlOyAvL3NraXAgdGhpcyBmcmFtZSBhcyBkYXRhIGlzIG1heSBiZSBjaGFuZ2VkCisJCX0KKworCWlmKGlUYXJnZXRBZGRyID09IE5VTEwpCisJCXsKKwkJaVRhcmdldEFkZHIgPSBMb2NrSHdTdXJmYWNlKCk7CisJCX0KKwkJCisJVFVpbnQ4KiB0YXJnZXQgPSBpVGFyZ2V0QWRkcjsKKwlpZih0YXJnZXQgPT0gTlVMTCkKKwkJcmV0dXJuIEVGYWxzZTsKKwkKKwkKKwlUUmVjdCB0YXJnZXRSZWN0ID0gVFJlY3QoVFBvaW50KDAsIDApLCBTd1NpemUoKSk7CisJCisJVFJlY3Qgc291cmNlUmVjdCA9IGFSZWN0OworCVRSZWN0IHVwZGF0ZVJlY3QgPSBhVXBkYXRlUmVjdDsKKwkKKy8vCVRQb2ludCBtb3ZlKDAsIDApOworCQorCQorCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uOTApCisJCXsKKwkJUm90YXRlKHNvdXJjZVJlY3QpOworCQlSb3RhdGUodXBkYXRlUmVjdCk7CisJCX0KKwkJCisJaWYoaVNvdXJjZU1vZGUgIT0gRGlzcGxheU1vZGUoKSB8fCAgdGFyZ2V0UmVjdCAhPSBzb3VyY2VSZWN0IHx8IHRhcmdldFJlY3QgIT0gdXBkYXRlUmVjdCB8fCAoKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uRmxhZ3MpICE9IDApKQorCQl7CisJCXNvdXJjZVJlY3QuSW50ZXJzZWN0aW9uKHRhcmdldFJlY3QpOyAvL3NvIHNvdXJjZSBhbHdheXMgc21hbGxlciBvciBlcXVhbCB0aGFuIHRhcmdldAorCQkvL3VwZGF0ZVJlY3QuSW50ZXJzZWN0aW9uKHRhcmdldFJlY3QpOworCQlDbGlwQ29weSh0YXJnZXQsIGFCaXRzLCB1cGRhdGVSZWN0LCBzb3VyY2VSZWN0KTsKKwkJfQorCWVsc2UKKwkJeworCQljb25zdCBUSW50IGJ5dGVDb3VudCA9IGFSZWN0LldpZHRoKCkgKiBhUmVjdC5IZWlnaHQoKSAqIGlTb3VyY2VCcHA7IC8vdGhpcyBjb3VsZCBiZSBzdG9yZWQKKwkJTWVtOjpDb3B5KHRhcmdldCwgYUJpdHMsIGJ5dGVDb3VudCk7CisJCX0KKworCXJldHVybiBFVHJ1ZTsKKwl9CisJKi8KKwkKK1RCb29sIENEc2E6OkFkZFVwZGF0ZVJlY3QoY29uc3QgVFVpbnQ4KiBhQml0cywgY29uc3QgVFJlY3QmIGFVcGRhdGVSZWN0LCBjb25zdCBUUmVjdCYgYVJlY3QpCisJeworCisJaWYoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb25DaGFuZ2VkKQorCQl7CisJCWlTdGF0ZUZsYWdzICY9IH5FT3JpZW50YXRpb25GbGFnczsKKwkJaVN0YXRlRmxhZ3MgfD0gaU5ld0ZsYWdzOworCQlTZXRDb3B5RnVuY3Rpb24oKTsKKwkJaVN0YXRlRmxhZ3MgJj0gfkVPcmllbnRhdGlvbkNoYW5nZWQ7CisJICAgIEVwb2NTZGxFbnY6OldhaXREZXZpY2VDaGFuZ2UoKTsKKwkgICAgcmV0dXJuIEVGYWxzZTsgLy9za2lwIHRoaXMgZnJhbWUgYXMgZGF0YSBpcyBtYXkgYmUgY2hhbmdlZAorCQl9CisKKwlpZihpVGFyZ2V0QWRkciA9PSBOVUxMKQorCQl7CisJCWlUYXJnZXRBZGRyID0gTG9ja0h3U3VyZmFjZSgpOworCQl9CisJVFVpbnQ4KiB0YXJnZXQgPSBpVGFyZ2V0QWRkcjsKKwlpZih0YXJnZXQgPT0gTlVMTCkKKwkJcmV0dXJuIEVGYWxzZTsKKwkKKwkKKwlUUmVjdCB0YXJnZXRSZWN0ID0gUmVjdCgpOworCVRSZWN0IHNvdXJjZVJlY3QgPSBhUmVjdDsKKwlUUmVjdCB1cGRhdGVSZWN0ID0gYVVwZGF0ZVJlY3Q7CisJCisJaWYoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb245MCkKKwkJeworCQlSb3RhdGUoc291cmNlUmVjdCk7CisJCVJvdGF0ZSh1cGRhdGVSZWN0KTsKKwkJfQorCQkKKwlpZihpU291cmNlTW9kZSAhPSBEaXNwbGF5TW9kZSgpIHx8ICB0YXJnZXRSZWN0ICE9IHNvdXJjZVJlY3QgfHwgdGFyZ2V0UmVjdCAhPSB1cGRhdGVSZWN0IHx8ICgoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb25GbGFncykgIT0gMCkpCisJCXsKKwkJc291cmNlUmVjdC5JbnRlcnNlY3Rpb24odGFyZ2V0UmVjdCk7IC8vc28gc291cmNlIGFsd2F5cyBzbWFsbGVyIG9yIGVxdWFsIHRoYW4gdGFyZ2V0CisJCXVwZGF0ZVJlY3QuSW50ZXJzZWN0aW9uKHRhcmdldFJlY3QpOworCQlDbGlwQ29weSh0YXJnZXQsIGFCaXRzLCB1cGRhdGVSZWN0LCBzb3VyY2VSZWN0LmlUbCk7CisJCX0KKwllbHNlCisJCXsKKwkJY29uc3QgVEludCBieXRlQ291bnQgPSBhUmVjdC5XaWR0aCgpICogYVJlY3QuSGVpZ2h0KCkgKiBpU291cmNlQnBwOyAvL3RoaXMgY291bGQgYmUgc3RvcmVkCisJCU1lbTo6Q29weSh0YXJnZXQsIGFCaXRzLCBieXRlQ291bnQpOworCQl9CisKKwlyZXR1cm4gRVRydWU7CisJfQkKK3ZvaWQgQ0RzYTo6VXBkYXRlU3dTdXJmYWNlKCkKKwl7CisJaVRhcmdldEFkZHIgPSBOVUxMOworCVVubG9ja0h3U3VyZmFjZSgpOwkvL2NvdWxkIGJlIGZhc3RlciBpZiBkb2VzIG5vdCB1c2UgQU8sIGJ1dCBvbmx5IGNoZWNrIHN0YXR1cyBiZWZvcmUgcmVkcmF3LCB0aGVuIG5vIGNvbnRleHQgc3dpdGNoIG5lZWRlZAorCX0KKwkKKwordm9pZCBDRHNhOjpSZXN1bWUoKQkKKwl7CisJaWYoU3RvcHBlZCgpKQorCQlSZXN0YXJ0KFJEaXJlY3RTY3JlZW5BY2Nlc3M6OkVUZXJtaW5hdGVSZWdpb24pOworCX0KKwkKK3ZvaWQgQ0RzYTo6RG9TdG9wKCkKKwl7CisJaWYoSXNEc2FBdmFpbGFibGUoKSkKKwkJaVN0YXRlRmxhZ3MgfD0gRVNkbFRocmVhZEV4cGxpY2l0U3RvcDsKKwlTdG9wKCk7CisJfQorCQordm9pZCBDRHNhOjpTdG9wKCkKKwl7CisJaVN0YXRlRmxhZ3MgJj0gfkVSdW5uaW5nOworLy8JQ2FuY2VsKCk7IC8vY2FuIGJlIGNhbGxlZCBvbmx5IGZyb20gbWFpbiEKKwlpRHNhLT5DYW5jZWwoKTsKKwl9CisJCit2b2lkIENEc2E6OkFib3J0Tm93KFJEaXJlY3RTY3JlZW5BY2Nlc3M6OlRUZXJtaW5hdGlvblJlYXNvbnMgLyphUmVhc29uKi8pCisJeworLy8JaVN0YXRlRmxhZ3MgfD0gRUNoYW5nZU5vdGlmeTsKKwlTdG9wKCk7CisJfQorCQordm9pZCBDRHNhOjpSZXN0YXJ0KFJEaXJlY3RTY3JlZW5BY2Nlc3M6OlRUZXJtaW5hdGlvblJlYXNvbnMgYVJlYXNvbikKKwl7CisJaWYoYVJlYXNvbiA9PSBSRGlyZWN0U2NyZWVuQWNjZXNzOjpFVGVybWluYXRlUmVnaW9uKSAvL2F1dG8gcmVzdGFydAorCQl7CQkJCQkJCQkJCQkJCisJCVRSQVBEKGVyciwgUmVzdGFydEwoKSk7CisJCVBBTklDX0lGX0VSUk9SKGVycik7CisJCX0KKwl9CisJCit2b2lkIENEc2E6OlNldEJsaXR0ZXIoTUJsaXR0ZXIqIGFCbGl0dGVyKQorCXsKKwlpQmxpdHRlciA9IGFCbGl0dGVyOworCX0KKwkKKwkKK1RQb2ludCBDRHNhOjpXaW5kb3dDb29yZGluYXRlcyhjb25zdCBUUG9pbnQmIGFQb2ludCkgY29uc3QJCisJeworCVRQb2ludCBwb3MgPSBhUG9pbnQgLSBpU2NyZWVuUmVjdC5pVGw7CisJY29uc3QgVFNpemUgYXN6ID0gaVNjcmVlblJlY3QuU2l6ZSgpOworCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uMTgwKQorCQl7CisJCXBvcy5pWCA9IGFzei5pV2lkdGggLSBwb3MuaVg7CisJCXBvcy5pWSA9IGFzei5pSGVpZ2h0IC0gcG9zLmlZOwkKKwkJfQkKKwlpZihpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbjkwKQorCQl7CisJCXBvcy5pWCA9IGFQb2ludC5pWTsKKwkJcG9zLmlZID0gYVBvaW50LmlYOwkKKwkJfQorCXBvcy5pWCA8PD0gMTY7CisJcG9zLmlZIDw8PSAxNjsKKwlwb3MuaVggLz0gYXN6LmlXaWR0aDsgCisJcG9zLmlZIC89IGFzei5pSGVpZ2h0OworCXBvcy5pWCAqPSBpU3dTaXplLmlXaWR0aDsKKwlwb3MuaVkgKj0gaVN3U2l6ZS5pSGVpZ2h0OworCXBvcy5pWCA+Pj0gMTY7CisJcG9zLmlZID4+PSAxNjsKKwlyZXR1cm4gcG9zOyAJCisJfQorCQordm9pZCBDRHNhOjpTZXRUYXJnZXRSZWN0KCkKKwl7CisJaVRhcmdldFJlY3QgPSBpU2NyZWVuUmVjdDsKKwlpZihpU3RhdGVGbGFncyAmIEVSZXNpemVSZXF1ZXN0ICYmIEVwb2NTZGxFbnY6OkZsYWdzKENTREw6OkVBbGxvd0ltYWdlUmVzaXplS2VlcFJhdGlvKSkKKwkJeworCQljb25zdCBUU2l6ZSBhc3ogPSBpU2NyZWVuUmVjdC5TaXplKCk7CisJCWNvbnN0IFRTaXplIHN6ID0gaVN3U2l6ZTsKKwkJCisJCVRSZWN0IHJlY3Q7CisJCQorCQljb25zdCBUSW50IGRoID0gKHN6LmlIZWlnaHQgPDwgMTYpIC8gc3ouaVdpZHRoOworCisJCWlmKChhc3ouaVdpZHRoICogZGggKSA+PiAxNiA8PSBhc3ouaUhlaWdodCkKKwkJCXsKKwkJCXJlY3QuU2V0UmVjdChUUG9pbnQoMCwgMCksIFRTaXplKGFzei5pV2lkdGgsIChhc3ouaVdpZHRoICogZGgpID4+IDE2KSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWNvbnN0IFRJbnQgZHcgPSAoc3ouaVdpZHRoIDw8IDE2KSAvIHN6LmlIZWlnaHQ7CisJICAgIAlyZWN0LlNldFJlY3QoVFBvaW50KDAsIDApLCBUU2l6ZSgoYXN6LmlIZWlnaHQgKiBkdykgPj4gMTYsIGFzei5pSGVpZ2h0KSk7CisJCQl9CisJCXJlY3QuTW92ZSgoYXN6LmlXaWR0aCAtIHJlY3QuU2l6ZSgpLmlXaWR0aCkgPj4gMSwgKGFzei5pSGVpZ2h0IC0gcmVjdC5TaXplKCkuaUhlaWdodCkgPj4gMSk7ICAKKwkJCisJCWlUYXJnZXRSZWN0ID0gcmVjdDsKKwkJaVRhcmdldFJlY3QuTW92ZShpU2NyZWVuUmVjdC5pVGwpOworCisJCX0gCisJaWYoIShpU3RhdGVGbGFncyAmIEVSZXNpemVSZXF1ZXN0KSkKKwkJaVN3U2l6ZSA9IGlTY3JlZW5SZWN0LlNpemUoKTsKKy8vCWlTY2FuTGluZVdpZHRoID0gLyppVGFyZ2V0QnBwICoqLyBTd1NpemUoKS5pV2lkdGg7CisJfQorCQkKKy8qKQorVEJvb2wgQ0RzYTo6Q2hhbmdlVHJpZ2dlcigpCisJeworCWNvbnN0IFRCb29sIGNoYW5nZSA9IGlTdGF0ZUZsYWdzICYgRUNoYW5nZU5vdGlmeTsKKwlpU3RhdGVGbGFncyAmPSB+RUNoYW5nZU5vdGlmeTsKKwlyZXR1cm4gY2hhbmdlOworCX0KKyovCQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBDRHNhOjpDb3B5MjU2KGNvbnN0IENEc2EmIGFEc2EsIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQpCisJeworCVRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJY29uc3QgVFVpbnQzMiogZW5kdCA9IHRhcmdldCArIGFCeXRlczsgCisJY29uc3QgVFVpbnQ4KiBzb3VyY2UgPSBhU291cmNlOworCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCXsKKwkJKnRhcmdldCsrID0gYURzYS5pTHV0MjU2Wypzb3VyY2UrK107IAorCQl9CisJfQorCQordm9pZCBDRHNhOjpDb3B5MjU2UmV2ZXJzZWQoY29uc3QgQ0RzYSYgYURzYSwgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCkKKwl7CisJY29uc3QgVFVpbnQzMiogdGFyZ2V0ID0gYVRhcmdldDsKKwlUVWludDMyKiBlbmR0ID0gYVRhcmdldCArIGFCeXRlczsgCisJY29uc3QgVFVpbnQ4KiBzb3VyY2UgPSBhU291cmNlOworCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCXsKKwkJKigtLWVuZHQpID0gYURzYS5pTHV0MjU2Wypzb3VyY2UrK107IAorCQl9CisJfQkKKwkKK3ZvaWQgQ0RzYTo6Q29weTI1NkZsaXAoY29uc3QgQ0RzYSYgYURzYSwgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbikKKwl7CisJVFVpbnQzMiogdGFyZ2V0ID0gYVRhcmdldDsKKwljb25zdCBUVWludDMyKiBlbmR0ID0gdGFyZ2V0ICsgYUJ5dGVzOyAKKwljb25zdCBUVWludDgqIGNvbHVtbiA9IGFTb3VyY2U7CisKKwl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQl7CisJCSp0YXJnZXQrKyA9IGFEc2EuaUx1dDI1NlsqY29sdW1uXTsKKwkJY29sdW1uICs9IGFMaW5lTGVuOworCQl9CisJfQorCQordm9pZCBDRHNhOjpDb3B5MjU2RmxpcFJldmVyc2VkKGNvbnN0IENEc2EmIGFEc2EsIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQgYUxpbmVMZW4pCisJeworCWNvbnN0IFRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IGFUYXJnZXQgKyBhQnl0ZXM7IAorCWNvbnN0IFRVaW50OCogY29sdW1uID0gYVNvdXJjZTsKKworCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCXsKKwkJKigtLWVuZHQpID0gYURzYS5pTHV0MjU2Wypjb2x1bW5dOworCQljb2x1bW4gKz0gYUxpbmVMZW47CisJCX0KKwl9CQkKKwordm9pZCBDRHNhOjpDb3B5TWVtKGNvbnN0IENEc2EmIC8qYURzYSovLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50KQorCXsKKwljb25zdCBUVWludDMyKiBzcmMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFRVaW50MzIqPihhU291cmNlKTsKKwlNZW06OkNvcHkoYVRhcmdldCwgc3JjLCBhQnl0ZXMgPDwgMik7CisJfQorCQordm9pZCBDRHNhOjpDb3B5TWVtRmxpcChjb25zdCBDRHNhJiAvKmFEc2EqLywgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbikKKwl7CisJVFVpbnQzMiogdGFyZ2V0ID0gYVRhcmdldDsKKwljb25zdCBUVWludDMyKiBlbmR0ID0gdGFyZ2V0ICsgYUJ5dGVzOyAKKwljb25zdCBUVWludDMyKiBjb2x1bW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IFRVaW50MzIqPihhU291cmNlKTsKKworCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCXsKKwkJKnRhcmdldCsrID0gKmNvbHVtbjsKKwkJY29sdW1uICs9IGFMaW5lTGVuOworCQl9CisJfQorCQordm9pZCBDRHNhOjpDb3B5TWVtUmV2ZXJzZWQoY29uc3QgQ0RzYSYgLyphRHNhKi8sIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQpCisJeworCWNvbnN0IFRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IGFUYXJnZXQgKyBhQnl0ZXM7IAorCWNvbnN0IFRVaW50MzIqIHNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFVpbnQzMio+KGFTb3VyY2UpOworCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCXsKKwkJKigtLWVuZHQpID0gKnNvdXJjZSsrOyAKKwkJfQorCX0JCisJCisJCit2b2lkIENEc2E6OkNvcHlNZW1GbGlwUmV2ZXJzZWQoY29uc3QgQ0RzYSYgLyphRHNhKi8sIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQgYUxpbmVMZW4pCisJeworCWNvbnN0IFRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IGFUYXJnZXQgKyBhQnl0ZXM7IAorCWNvbnN0IFRVaW50MzIqIGNvbHVtbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFVpbnQzMio+KGFTb3VyY2UpOworCisJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJeworCQkqKC0tZW5kdCkgPSAqY29sdW1uOworCQljb2x1bW4gKz0gYUxpbmVMZW47CisJCX0KKwl9CisJCQkKKy8qCisKK0xPQ0FMX0MgVFJnYiByZ2IxNk1BKFRJbnQgYVZhbHVlKQorCXsKKwlyZXR1cm4gVFJnYjo6Q29sb3IxNk1BKGFWYWx1ZSk7CisJfQorKi8JCitOT05TSEFSQUJMRV9DTEFTUyhNUmdiQ29weSkKKwl7CisJcHVibGljOgorCXZpcnR1YWwgdm9pZCBDb3B5KFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRCb29sIGFSZXZlcnNlZCkgPSAwOworCXZpcnR1YWwgdm9pZCBGbGlwQ29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50IGFMaW5lTGVuLCBUQm9vbCBhUmV2ZXJzZWQpID0gMDsKKwl9OworCQordGVtcGxhdGUgPGNsYXNzIFQ+CitOT05TSEFSQUJMRV9DTEFTUyhUUmdiQ29weSkgOiBwdWJsaWMgTVJnYkNvcHkKKwl7CisJcHVibGljOgorCVRSZ2JDb3B5KFREaXNwbGF5TW9kZSBhTW9kZSk7CisJdm9pZCogb3BlcmF0b3IgbmV3KFRVaW50IGFCeXRlcywgVEFueSogYU1lbSk7CisJdm9pZCBDb3B5KFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRCb29sIGFSZXZlcnNlZCk7CisJdm9pZCBGbGlwQ29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50IGFMaW5lTGVuLCBUQm9vbCBhUmV2ZXJzZWQpOworCXN0YXRpYyBUVWludDMyIEdyYXkyNTYoY29uc3QgVFVpbnQ4JiBhUGl4ZWwpOworCXN0YXRpYyBUVWludDMyIENvbG9yMjU2KGNvbnN0IFRVaW50OCYgYVBpeGVsKTsKKwlzdGF0aWMgVFVpbnQzMiBDb2xvcjRLKGNvbnN0IFRVaW50MTYmIGFQaXhlbCk7CisJc3RhdGljIFRVaW50MzIgQ29sb3I2NEsoY29uc3QgVFVpbnQxNiYgYVBpeGVsKTsKKwlzdGF0aWMgVFVpbnQzMiBDb2xvcjE2TShjb25zdCBUVWludDMyJiBhUGl4ZWwpOworCXN0YXRpYyBUVWludDMyIENvbG9yMTZNVShjb25zdCBUVWludDMyJiBhUGl4ZWwpOworCXN0YXRpYyBUVWludDMyIENvbG9yMTZNQShjb25zdCBUVWludDMyJiBhUGl4ZWwpOworCXByaXZhdGU6CisJCXR5cGVkZWYgVFVpbnQzMiAoKlRSZ2JGdW5jKSAoY29uc3QgVCYgYVZhbHVlKTsKKwkJVFJnYkZ1bmMgaUZ1bmM7CisJfTsKKwkJCisJCQordGVtcGxhdGUgPGNsYXNzIFQ+CQkKK3ZvaWQqIFRSZ2JDb3B5PFQ+OjpvcGVyYXRvciBuZXcoVFVpbnQgLyphQnl0ZXMqLywgVEFueSogYU1lbSkKKwl7CisJcmV0dXJuIGFNZW07CisJfQorCQkKK3RlbXBsYXRlIDxjbGFzcyBUPgorVFJnYkNvcHk8VD46OlRSZ2JDb3B5KFREaXNwbGF5TW9kZSBhTW9kZSkKKwl7CisJc3dpdGNoKGFNb2RlKQorCQl7CisJCWNhc2UgRUdyYXkyNTYgOiBpRnVuYyA9IChUUmdiRnVuYykgR3JheTI1NjsgYnJlYWs7CisJCWNhc2UgRUNvbG9yMjU2IDogaUZ1bmMgPSAgKFRSZ2JGdW5jKSBDb2xvcjI1NjsgYnJlYWs7CisJCWNhc2UgRUNvbG9yNEsgOiBpRnVuYyA9ICAoVFJnYkZ1bmMpIENvbG9yNEs7IGJyZWFrOworCQljYXNlIEVDb2xvcjY0SyA6IGlGdW5jID0gIChUUmdiRnVuYykgQ29sb3I2NEs7IGJyZWFrOworCQljYXNlIEVDb2xvcjE2TSA6IGlGdW5jID0gIChUUmdiRnVuYykgQ29sb3IxNk07IGJyZWFrOworCQljYXNlIEVDb2xvcjE2TVUgOiBpRnVuYyA9ICAoVFJnYkZ1bmMpIENvbG9yMTZNVTsgYnJlYWs7CisJCWNhc2UgRUNvbG9yMTZNQSA6IGlGdW5jID0gIChUUmdiRnVuYykgQ29sb3IxNk1BOyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBBTklDKEtFcnJOb3RTdXBwb3J0ZWQpOworCQl9CisJfQorCQordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIFRSZ2JDb3B5PFQ+OjpDb3B5KFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRCb29sIGFSZXZlcnNlZCkKKwl7CisJY29uc3QgVCogc291cmNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oYVNvdXJjZSk7CisJVFVpbnQzMiogdGFyZ2V0ID0gYVRhcmdldDsKKwlUVWludDMyKiBlbmR0ID0gdGFyZ2V0ICsgYUJ5dGVzOworCQorCWlmKGFSZXZlcnNlZCkKKwkJeworCQl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQkJeworCQkJY29uc3QgVCB2YWx1ZSA9ICpzb3VyY2UrKzsKKwkJCSooLS1lbmR0KSA9IGlGdW5jKHZhbHVlKTsvL2lGdW5jKHZhbHVlKS5WYWx1ZSgpOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCQl7CisJCQljb25zdCBUIHZhbHVlID0gKnNvdXJjZSsrOworCQkJKnRhcmdldCsrID0gaUZ1bmModmFsdWUpOy8vaUZ1bmModmFsdWUpLlZhbHVlKCk7CisJCQl9CisJCX0KKwl9CisJCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgVFJnYkNvcHk8VD46OkZsaXBDb3B5KFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQgYUxpbmVMZW4sIFRCb29sIGFSZXZlcnNlZCkKKwl7CisJY29uc3QgVCogY29sdW1uID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oYVNvdXJjZSk7CisJVFVpbnQzMiogdGFyZ2V0ID0gYVRhcmdldDsKKwlUVWludDMyKiBlbmR0ID0gdGFyZ2V0ICsgYUJ5dGVzOworCQorCWlmKGFSZXZlcnNlZCkKKwkJeworCQl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQkJeworCQkJKigtLWVuZHQpID0gaUZ1bmMoKmNvbHVtbik7CisJCQljb2x1bW4gKz0gYUxpbmVMZW47CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJCXsKKwkJCSp0YXJnZXQrKyA9IGlGdW5jKCpjb2x1bW4pOworCQkJY29sdW1uICs9IGFMaW5lTGVuOworCQkJfQorCQl9CisJfQkKKwkJCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVFVpbnQzMiBUUmdiQ29weTxUPjo6R3JheTI1Nihjb25zdCBUVWludDgmIGFQaXhlbCkKKwl7CisJY29uc3QgVFVpbnQzMiBweCA9IGFQaXhlbCA8PCAxNiB8IGFQaXhlbCA8PCA4IHwgYVBpeGVsOworCXJldHVybiBweDsKKwl9CisJCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVFVpbnQzMiBUUmdiQ29weTxUPjo6Q29sb3IyNTYoY29uc3QgVFVpbnQ4JiBhUGl4ZWwpCisJeworCXJldHVybiBUUmdiOjpDb2xvcjI1NihhUGl4ZWwpLlZhbHVlKCk7CisJfQorCQordGVtcGxhdGUgPGNsYXNzIFQ+IFRVaW50MzIgVFJnYkNvcHk8VD46OkNvbG9yNEsoY29uc3QgVFVpbnQxNiYgYVBpeGVsKQorCXsKKwlUVWludDMyIGNvbCA9IChhUGl4ZWwgJiAweEYwMCkgPDwgMTI7CisJY29sIHw9IChhUGl4ZWwgJiAweEYwMCkgPDwgODsgCisJCisJY29sIHw9IChhUGl4ZWwgJiAweDBGMCkgPDwgODsKKwljb2wgfD0gKGFQaXhlbCAmIDB4MEYwKTsKKwkKKwljb2wgfD0gKGFQaXhlbCAmIDB4MDBGKSA8PCA0OworCWNvbCB8PSAoYVBpeGVsICYgMHgwMEYpOworCQorCXJldHVybiBjb2w7CisJfQorCQordGVtcGxhdGUgPGNsYXNzIFQ+IFRVaW50MzIgVFJnYkNvcHk8VD46OkNvbG9yNjRLKGNvbnN0IFRVaW50MTYmIGFQaXhlbCkKKwl7CisJVFVpbnQzMiBjb2wgPSAoYVBpeGVsICYgMHhGODAwKTw8IDg7CisJY29sIHw9IChhUGl4ZWwgJiAweEUwMDApIDw8IDM7IAorCQorCWNvbCB8PSAoYVBpeGVsICYgMHgwN0UwKSA8PCA1OworCWNvbCB8PSAoYVBpeGVsICYgMHhDMCkgPj4gMTsKKwkKKwljb2wgfD0gKGFQaXhlbCAmIDB4MDdFMCkgPDwgMzsKKwljb2wgfD0gKGFQaXhlbCAmIDB4MUMpID4+IDI7CisJCisJcmV0dXJuIGNvbDsKKwl9CisJCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVFVpbnQzMiBUUmdiQ29weTxUPjo6Q29sb3IxNk0oY29uc3QgVFVpbnQzMiYgYVBpeGVsKQorCXsKKwlyZXR1cm4gVFJnYjo6Q29sb3IxNk0oYVBpeGVsKS5WYWx1ZSgpOworCX0KKwkKK3RlbXBsYXRlIDxjbGFzcyBUPiBUVWludDMyIFRSZ2JDb3B5PFQ+OjpDb2xvcjE2TVUoY29uc3QgVFVpbnQzMiYgYVBpeGVsKQorCXsKKwlyZXR1cm4gVFJnYjo6Q29sb3IxNk1VKGFQaXhlbCkuVmFsdWUoKTsKKwl9CisJCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVFVpbnQzMiBUUmdiQ29weTxUPjo6Q29sb3IxNk1BKGNvbnN0IFRVaW50MzImIGFQaXhlbCkKKwl7CisJcmV0dXJuIFRSZ2I6OkNvbG9yMTZNQShhUGl4ZWwpLlZhbHVlKCk7CisJfQorCit0eXBlZGVmIFRVaW50NjQgVFN0YWNrTWVtOworCitMT0NBTF9DIE1SZ2JDb3B5KiBHZXRDb3B5KFRBbnkqIG1lbSwgVERpc3BsYXlNb2RlIGFNb2RlKQorCXsKKwlpZihhTW9kZSA9PSBFQ29sb3IyNTYgfHwgYU1vZGUgPT0gRUdyYXkyNTYpCisJCXsKKwkJcmV0dXJuIG5ldyAobWVtKSBUUmdiQ29weTxUVWludDg+KGFNb2RlKTsKKwkJfQorCWlmKGFNb2RlID09IEVDb2xvcjRLIHx8IGFNb2RlID09IEVDb2xvcjY0SykKKwkJeworCQlyZXR1cm4gbmV3IChtZW0pIFRSZ2JDb3B5PFRVaW50MTY+KGFNb2RlKTsKKwkJfQorCWlmKGFNb2RlID09IEVDb2xvcjE2TSB8fCBhTW9kZSA9PSBFQ29sb3IxNk1VIHx8IGFNb2RlID09IEVDb2xvcjE2TUEpCisJCXsKKwkJcmV0dXJuIG5ldyAobWVtKSBUUmdiQ29weTxUVWludDMyPihhTW9kZSk7CisJCX0KKwlQQU5JQyhLRXJyTm90U3VwcG9ydGVkKTsKKwlyZXR1cm4gTlVMTDsKKwl9CisJCisKK3ZvaWQgQ0RzYTo6Q29weVNsb3dGbGlwUmV2ZXJzZWQoY29uc3QgQ0RzYSYgYURzYSwgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbikKKwl7CisJVFN0YWNrTWVtIG1lbSA9IDA7CisJR2V0Q29weSgmbWVtLCBhRHNhLmlTb3VyY2VNb2RlKS0+RmxpcENvcHkoYVRhcmdldCwgYVNvdXJjZSwgYUJ5dGVzLCBhTGluZUxlbiwgRVRydWUpOwkKKwl9CisJCit2b2lkIENEc2E6OkNvcHlTbG93RmxpcChjb25zdCBDRHNhJiBhRHNhLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50IGFMaW5lTGVuKQorCXsKKwlUU3RhY2tNZW0gbWVtID0gMDsKKwlHZXRDb3B5KCZtZW0sIGFEc2EuaVNvdXJjZU1vZGUpLT5GbGlwQ29weShhVGFyZ2V0LCBhU291cmNlLCBhQnl0ZXMsIGFMaW5lTGVuLCBFRmFsc2UpOworCX0KKwkKK3ZvaWQgQ0RzYTo6Q29weVNsb3coY29uc3QgQ0RzYSYgYURzYSwgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCkKKwl7CisJVFN0YWNrTWVtIG1lbSA9IDA7CisJR2V0Q29weSgmbWVtLCBhRHNhLmlTb3VyY2VNb2RlKS0+Q29weShhVGFyZ2V0LCBhU291cmNlLCBhQnl0ZXMsIEVGYWxzZSk7CQorCX0JCisKK3ZvaWQgQ0RzYTo6Q29weVNsb3dSZXZlcnNlZChjb25zdCBDRHNhJiBhRHNhLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50KQorCXsKKwlUU3RhY2tNZW0gbWVtID0gMDsKKwlHZXRDb3B5KCZtZW0sIGFEc2EuaVNvdXJjZU1vZGUpLT5Db3B5KGFUYXJnZXQsIGFTb3VyY2UsIGFCeXRlcywgRVRydWUpOwkKKwl9CQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vNwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTIvZHNhX29sZC5jcHAgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N5bWJpYW4vRUtBMi9kc2Ffb2xkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTMyZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby9zeW1iaWFuL0VLQTIvZHNhX29sZC5jcHAKQEAgLTAsMCArMSwxMDc1IEBACisjaW5jbHVkZSAiZHNhLmgiCisjaW5jbHVkZSAic2RsZXBvY2FwaS5oIgorI2luY2x1ZGUgPGNkc2IuaD4KKworTE9DQUxfQyBUSW50IEJ5dGVzUGVyUGl4ZWwoVERpc3BsYXlNb2RlIGFNb2RlKQorCXsKKwlyZXR1cm4gKChURGlzcGxheU1vZGVVdGlsczo6TnVtRGlzcGxheU1vZGVCaXRzUGVyUGl4ZWwoYU1vZGUpIC0gMSkgPj4gMykgKyAxOyAKKwl9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIAorTk9OU0hBUkFCTEVfQ0xBU1MoQ0RzYUEpIDogcHVibGljIENEc2EKKwl7CisJcHVibGljOgorCQlDRHNhQShSV3NTZXNzaW9uJiBhU2Vzc2lvbik7CisJcHJpdmF0ZToKKwkJfkNEc2FBKCk7CisJCVRVaW50OCogTG9ja1N1cmZhY2UoKTsKKwkJdm9pZCBVbmxvY2tIV1N1cmZhY2VSZXF1ZXN0Q29tcGxldGUoKTsKKwkJdm9pZCBVbmxvY2tId1N1cmZhY2UoKTsKKwkJdm9pZCBDcmVhdGVTdXJmYWNlTCgpOworCQl2b2lkIFdpcGUoVEludCBhTGVuZ3RoKTsKKwkJdm9pZCBSZWNyZWF0ZUwoKTsKKwkJdm9pZCBGcmVlKCk7CisJCVRJbnQgRXh0ZXJuYWxVcGRhdGUoKSB7cmV0dXJuIDA7fQorCXByaXZhdGU6CisJCUNGYnNCaXRtYXAqIGlCbXA7CQorCX07CisJCisJCitDRHNhQTo6Q0RzYUEoUldzU2Vzc2lvbiYgYVNlc3Npb24pIDogQ0RzYShhU2Vzc2lvbikKKwl7CisJfQorCQordm9pZCBDRHNhQTo6RnJlZSgpCisJeworCWRlbGV0ZSBpQm1wOworCWlCbXAgPSBOVUxMOworCX0KKworQ0RzYUE6On5DRHNhQSgpCisJeworCV9fQVNTRVJUX0RFQlVHKGlCbXAgPT0gTlVMTCwgUEFOSUMoS0Vyck5vdFJlYWR5KSk7CisJfQorCQorVFVpbnQ4KiBDRHNhQTo6TG9ja1N1cmZhY2UoKQorCXsKKwlpQm1wLT5Mb2NrSGVhcCgpOworCXJldHVybiByZWludGVycHJldF9jYXN0PFRVaW50OCo+KGlCbXAtPkRhdGFBZGRyZXNzKCkpOworCX0KKwordm9pZCBDRHNhQTo6VW5sb2NrSFdTdXJmYWNlUmVxdWVzdENvbXBsZXRlKCkKKwl7CisJUEFOSUMoS0Vyck5vdFN1cHBvcnRlZCk7CisJfQorCit2b2lkIENEc2FBOjpVbmxvY2tId1N1cmZhY2UoKQorCXsKKwlpQm1wLT5VbmxvY2tIZWFwKCk7CisJU2V0VXBkYXRpbmcoRUZhbHNlKTsKKwlEc2EoKS5HYygpLT5CaXRCbHQoSHdSZWN0KCkuaVRsLCBpQm1wKTsKKwlEc2EoKS5TY3JlZW5EZXZpY2UoKS0+VXBkYXRlKCk7CisJfQorCit2b2lkIENEc2FBOjpDcmVhdGVTdXJmYWNlTCgpCisJeworCWRlbGV0ZSBpQm1wOworCWlCbXAgPSBOVUxMOworCWlCbXAgID0gbmV3IChFTGVhdmUpIENGYnNCaXRtYXAoKTsKKwlVc2VyOjpMZWF2ZUlmRXJyb3IoaUJtcC0+Q3JlYXRlKEh3UmVjdCgpLlNpemUoKSwgRGlzcGxheU1vZGUoKSkpOworCX0KKwordm9pZCBDRHNhQTo6V2lwZShUSW50IGFMZW5ndGgpIC8vZG9udCBjYWxsIGluIGRyYXdpbmcKKwl7CisJaUJtcC0+TG9ja0hlYXAoKTsKKwlNZW06OkZpbGxaKGlCbXAtPkRhdGFBZGRyZXNzKCksIGFMZW5ndGgpOworCWlCbXAtPlVubG9ja0hlYXAoKTsKKwl9CisJCit2b2lkIENEc2FBOjpSZWNyZWF0ZUwoKQorCXsKKwl9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitOT05TSEFSQUJMRV9DTEFTUyhNRHNiT2JzKQorCXsKKwlwdWJsaWM6CisJCXZpcnR1YWwgdm9pZCBTdXJmYWNlUmVhZHkoKSA9IDA7CisJCXZpcnR1YWwgQ0RpcmVjdFNjcmVlbkJpdG1hcCYgRHNiKCkgPSAwOworCX07CisJCitOT05TSEFSQUJMRV9DTEFTUyhDRHNiU3VyZmFjZSkgOiBwdWJsaWMgQ0FjdGl2ZQorCXsKKwlwdWJsaWM6CisJCUNEc2JTdXJmYWNlKE1Ec2JPYnMmIGFEc2IpOworCQlUVWludDgqIEFkZHJlc3MoKTsKKwkJdm9pZCBDb21wbGV0ZSgpOworCQl+Q0RzYlN1cmZhY2UoKTsKKwlwcml2YXRlOgorCQl2b2lkIFJ1bkwoKTsKKwkJdm9pZCBEb0NhbmNlbCgpOworCXByaXZhdGU6CisJCU1Ec2JPYnMmIGlEc2I7IAorCQlUVWludDgqIGlBZGRyZXNzOworCX07CQorCitDRHNiU3VyZmFjZTo6Q0RzYlN1cmZhY2UoTURzYk9icyYgYURzYikgOiBDQWN0aXZlKENBY3RpdmU6OkVQcmlvcml0eUhpZ2gpICwgaURzYihhRHNiKQorCXsKKwlDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisJfQorCitDRHNiU3VyZmFjZTo6fkNEc2JTdXJmYWNlKCkKKwl7CisJQ2FuY2VsKCk7CisJfQorCQordm9pZCBDRHNiU3VyZmFjZTo6Q29tcGxldGUoKQorCXsKKwlpZihpQWRkcmVzcyAhPSBOVUxMICYmICFJc0FjdGl2ZSgpKQorCQl7CisJCWlBZGRyZXNzID0gTlVMTDsKKwkJU2V0QWN0aXZlKCk7CisJCWlEc2IuRHNiKCkuRW5kVXBkYXRlKGlTdGF0dXMpOworCQl9CisJfQorCQorVFVpbnQ4KiBDRHNiU3VyZmFjZTo6QWRkcmVzcygpCisJeworCWlmKGlBZGRyZXNzID09IE5VTEwgJiYgIUlzQWN0aXZlKCkpCisJCXsKKwkJVEFjY2VsZXJhdGVkQml0bWFwSW5mbyBpbmZvOworCQlpZihLRXJyTm9uZSA9PSBpRHNiLkRzYigpLkJlZ2luVXBkYXRlKGluZm8pKQorCQkJaUFkZHJlc3MgPSBpbmZvLmlBZGRyZXNzOworCQl9CisJcmV0dXJuIGlBZGRyZXNzOworCX0KKwkKK3ZvaWQgQ0RzYlN1cmZhY2U6OlJ1bkwoKQorCXsKKwlpRHNiLlN1cmZhY2VSZWFkeSgpOworCX0KKwordm9pZCBDRHNiU3VyZmFjZTo6RG9DYW5jZWwoKQorCXsKKwkvL2VtcHR5CisJfQorCQkKK05PTlNIQVJBQkxFX0NMQVNTKENEc2FCKSA6IHB1YmxpYyBDRHNhLCBwdWJsaWMgTURzYk9icworCXsKKwlwdWJsaWM6CisJCUNEc2FCKFJXc1Nlc3Npb24mIGFTZXNzaW9uKTsKKwlwcml2YXRlOgorCQl+Q0RzYUIoKTsKKwkJVFVpbnQ4KiBMb2NrU3VyZmFjZSgpOworCQl2b2lkIFVubG9ja0hXU3VyZmFjZVJlcXVlc3RDb21wbGV0ZSgpOworCQl2b2lkIFVubG9ja0h3U3VyZmFjZSgpOworCQl2b2lkIENyZWF0ZVN1cmZhY2VMKCk7CisJCXZvaWQgV2lwZShUSW50IGFMZW5ndGgpOworCQl2b2lkIFJlY3JlYXRlTCgpOworCQl2b2lkIENvbnN0cnVjdEwoUldpbmRvdyYgYVdpbmRvdywgQ1dzU2NyZWVuRGV2aWNlJiBhRGV2aWNlKTsKKwkJdm9pZCBGcmVlKCk7CisJCUNEaXJlY3RTY3JlZW5CaXRtYXAmIERzYigpOworCQl2b2lkIFN1cmZhY2VSZWFkeSgpOworCQlUSW50IEV4dGVybmFsVXBkYXRlKCkge3JldHVybiAwO30KKwlwcml2YXRlOgorCQlDRHNiU3VyZmFjZSogaVN1cmZhY2UxOworCQlDRHNiU3VyZmFjZSogaVN1cmZhY2UyOworCQlDRGlyZWN0U2NyZWVuQml0bWFwKiBpRHNiOworCX07CisKK0NEc2FCOjpDRHNhQihSV3NTZXNzaW9uJiBhU2Vzc2lvbikgOiBDRHNhKGFTZXNzaW9uKQorCXsKKwl9CisKK3ZvaWQgQ0RzYUI6OkZyZWUoKQorCXsKKwl9CisJCit2b2lkIENEc2FCOjpVbmxvY2tIV1N1cmZhY2VSZXF1ZXN0Q29tcGxldGUoKQorCXsKKwlpU3VyZmFjZTEtPkNvbXBsZXRlKCk7CisJaVN1cmZhY2UyLT5Db21wbGV0ZSgpOworCX0JCisKK3ZvaWQgQ0RzYUI6OkNyZWF0ZVN1cmZhY2VMKCkKKwl7CisJfQorCQordm9pZCBDRHNhQjo6V2lwZShUSW50IGFMZW5ndGgpIC8vZG9udCBjYWxsIGluIGRyYXdpbmcKKwl7CisJVFVpbnQ4KiBhZGRyID0gTG9ja1N1cmZhY2UoKTsKKwlpZihhZGRyICE9IE5VTEwpIAorCQl7CisJCU1lbTo6RmlsbFooYWRkciwgYUxlbmd0aCk7CisJCVVubG9ja0h3U3VyZmFjZSgpOworCQl9CisJfQorCit2b2lkIENEc2FCOjpVbmxvY2tId1N1cmZhY2UoKQorCXsKKwlFcG9jU2RsRW52OjpSZXF1ZXN0KENEc2E6OkVSZXF1ZXN0VXBkYXRlKTsKKwl9CisJCitUVWludDgqIENEc2FCOjpMb2NrU3VyZmFjZSgpCisJeworCVRVaW50OCogYWRkciA9ICBpU3VyZmFjZTEtPkFkZHJlc3MoKTsKKwlpZihhZGRyID09IE5VTEwpCisJCWFkZHIgPSAgaVN1cmZhY2UyLT5BZGRyZXNzKCk7CisJU2V0VXBkYXRpbmcoYWRkciA9PSBOVUxMKTsKKwlyZXR1cm4gYWRkcjsKKwl9CisJCit2b2lkIENEc2FCOjpTdXJmYWNlUmVhZHkoKQkKKwl7CisJU2V0VXBkYXRpbmcoRUZhbHNlKTsKKwl9CisKK0NEaXJlY3RTY3JlZW5CaXRtYXAmIENEc2FCOjpEc2IoKQorCXsKKwlyZXR1cm4gKmlEc2I7CisJfQorCQordm9pZCBDRHNhQjo6Q29uc3RydWN0TChSV2luZG93JiBhV2luZG93LCBDV3NTY3JlZW5EZXZpY2UmIGFEZXZpY2UpCisJeworCWlmKGlEc2IgPT0gTlVMTCkKKwkJaURzYiA9IENEaXJlY3RTY3JlZW5CaXRtYXA6Ok5ld0woKTsJCisJQ0RzYTo6Q29uc3RydWN0TChhV2luZG93LCBhRGV2aWNlKTsKKwlpU3VyZmFjZTEgPSBuZXcgKEVMZWF2ZSkgQ0RzYlN1cmZhY2UoKnRoaXMpOworCWlTdXJmYWNlMiA9IG5ldyAoRUxlYXZlKSBDRHNiU3VyZmFjZSgqdGhpcyk7CisJfQorCQorQ0RzYUI6On5DRHNhQigpCisJeworCWRlbGV0ZSBpU3VyZmFjZTE7CisJZGVsZXRlIGlTdXJmYWNlMjsKKwlkZWxldGUgaURzYjsKKwl9CQorCit2b2lkIENEc2FCOjpSZWNyZWF0ZUwoKQorCXsKKyAgICBpRHNiLT5DbG9zZSgpOworICAgIGlEc2ItPkNyZWF0ZShId1JlY3QoKSwgQ0RpcmVjdFNjcmVlbkJpdG1hcDo6RURvdWJsZUJ1ZmZlcik7CisJfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwkKKworCitUU2l6ZSBDRHNhOjpXaW5kb3dTaXplKCkgY29uc3QKKwl7CisJVFNpemUgc2l6ZSA9IEh3UmVjdCgpLlNpemUoKTsKKwlpZihpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbjkwKQorCQl7CisJCWNvbnN0IFRJbnQgdG1wID0gc2l6ZS5pV2lkdGg7CisJCXNpemUuaVdpZHRoID0gc2l6ZS5pSGVpZ2h0OworCQlzaXplLmlIZWlnaHQgPSB0bXA7CisJCX0KKwlyZXR1cm4gc2l6ZTsKKwl9CisJCit2b2lkIENEc2E6OlNldFN1c3BlbmQoKQorCXsKKwlpU3RhdGVGbGFncyB8PSBFU2RsVGhyZWFkU3VzcGVuZDsKKwl9CisKK3ZvaWQgQ0RzYTo6UmVsZWFzZVN0b3AoKQorCXsKKwlpU3RhdGVGbGFncyAmPSB+RVNkbFRocmVhZEV4cGxpY2l0U3RvcDsKKwl9CisKKworVEJvb2wgQ0RzYTo6U3RvcHBlZCgpIGNvbnN0CisJeworCXJldHVybiAoaVN0YXRlRmxhZ3MgJiBFU2RsVGhyZWFkRXhwbGljaXRTdG9wKTsKKwl9CisKK3ZvaWQgQ0RzYTo6U2V0T3JpZW50YXRpb24oQ1NETDo6VE9yaWVudGF0aW9uTW9kZSBhT3JpZW50YXRpb24pCisJeworCVRJbnQgZmxhZ3MgPSAwOworCXN3aXRjaChhT3JpZW50YXRpb24pCisJCXsKKwkJY2FzZSBDU0RMOjpFT3JpZW50YXRpb245MDoKKwkJCWZsYWdzID0gRU9yaWVudGF0aW9uOTA7CisJCQlicmVhazsKKwkJY2FzZSBDU0RMOjpFT3JpZW50YXRpb24xODA6CisJCQlmbGFncyA9IEVPcmllbnRhdGlvbjE4MDsKKwkJCWJyZWFrOworCQljYXNlIENTREw6OkVPcmllbnRhdGlvbjI3MDoKKwkJCWZsYWdzID0gRU9yaWVudGF0aW9uOTAgfCBFT3JpZW50YXRpb24xODA7CisJCQlicmVhazsKKwkJY2FzZSBDU0RMOjpFT3JpZW50YXRpb24wOgorCQkJZmxhZ3MgPSAwOworCQkJYnJlYWs7CisJCX0KKwlpZihmbGFncyAhPSAoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb25GbGFncykpCisJCXsKKwkJaVN0YXRlRmxhZ3MgfD0gRU9yaWVudGF0aW9uQ2hhbmdlZDsKKwkJaU5ld0ZsYWdzID0gZmxhZ3M7IC8vY2Fubm90IGJlIHNldCBkdXJpbmcgZHJhd2luZy4uLgorCQl9CisJfQorCitDRHNhOjp+Q0RzYSgpCisgICAgeworICAgIGlmKGlEc2EgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICBpRHNhLT5DYW5jZWwoKTsKKyAgICAgICAgfQorICAgIGRlbGV0ZSBpRHNhOworICAgIFVzZXI6OkZyZWUoaUx1dDI1Nik7CisgICAgfQorICAgICAgICAgCit2b2lkIENEc2E6OkNvbnN0cnVjdEwoUldpbmRvdyYgYVdpbmRvdywgQ1dzU2NyZWVuRGV2aWNlJiBhRGV2aWNlKQorICAgIHsKKyAgICBpZihpRHNhICE9IE5VTEwpCisgICAgCXsKKyAgICAJaURzYS0+Q2FuY2VsKCk7CisgICAgCWRlbGV0ZSBpRHNhOworICAgIAlpRHNhID0gTlVMTDsKKyAgICAJfQorICAgIAkKKyAgICAJCisgICAgaURzYSA9IENEaXJlY3RTY3JlZW5BY2Nlc3M6Ok5ld0woCisgICAgCQkJCWlTZXNzaW9uLAorCQkJCQlhRGV2aWNlLAorCQkJCQlhV2luZG93LAorCQkJCQkqdGhpcyk7CQkJCQorCisJaWYoaUx1dDI1NiA9PSBOVUxMKQorCQlpTHV0MjU2ID0gKFRVaW50MzIqKSBVc2VyOjpBbGxvY0woMjU2ICogc2l6ZW9mKFRVaW50MzIpKTsKKwlpVGFyZ2V0TW9kZSA9IGFXaW5kb3cuRGlzcGxheU1vZGUoKTsKKwlpVGFyZ2V0QnBwID0gQnl0ZXNQZXJQaXhlbChEaXNwbGF5TW9kZSgpKTsKKwlpVGFyZ2V0UmVjdCA9IFRSZWN0KGFXaW5kb3cuUG9zaXRpb24oKSwgYVdpbmRvdy5TaXplKCkpOworICAgIFJlc3RhcnRMKCk7CisgICAgfQorCit2b2lkIENEc2E6OkxvY2tQYWxldHRlKFRCb29sIGFMb2NrKQorCXsKKwlpZihhTG9jaykKKwkJaVN0YXRlRmxhZ3MgfD0gRVBhbGV0dGVMb2NrZWQ7CisJZWxzZQorCQlpU3RhdGVGbGFncyAmPSB+RVBhbGV0dGVMb2NrZWQ7CisJfQorVEludCBDRHNhOjpTZXRQYWxldHRlKFRJbnQgYUZpcnN0LCBUSW50IGFDb3VudCwgVFVpbnQzMiogYVBhbGV0dGUpCisJeworCWlmKGlMdXQyNTYgPT0gTlVMTCkKKwkJcmV0dXJuIEtFcnJOb3RGb3VuZDsKKwljb25zdCBUSW50IGNvdW50ID0gYUNvdW50IC0gYUZpcnN0OworCWlmKGNvdW50ID4gMjU2KQorCQlyZXR1cm4gS0VyckFyZ3VtZW50OworCWlmKGlTdGF0ZUZsYWdzICYgRVBhbGV0dGVMb2NrZWQpCisJCXJldHVybiBLRXJyTm9uZTsKKwlmb3IoVEludCBpID0gYUZpcnN0OyBpIDwgY291bnQ7IGkrKykgLy9ub3Qgc28gYnVzeSBoZXJlOi0pCisJCXsKKwkJaUx1dDI1NltpXSA9IGFQYWxldHRlW2ldOworCQl9CisJcmV0dXJuIEtFcnJOb25lOworCX0KKwkKKwkKKworCQordm9pZCBDRHNhOjpSZXN0YXJ0TCgpCisgICAgeworICAgIC8vY29uc3QgVEJvb2wgYWN0aXZlID0gaURzYS0+SXNBY3RpdmUoKTsKKyAgICAKKyAgICAvL2lmKCFhY3RpdmUpCisgICAgaURzYS0+U3RhcnRMKCk7CisgICAgCisgICAgUlJlZ2lvbiogciA9IGlEc2EtPkRyYXdpbmdSZWdpb24oKTsKKyAgICBpRHNhLT5HYygpLT5TZXRDbGlwcGluZ1JlZ2lvbihyKTsKKyAgICBUUmVjdCByZWN0ID0gci0+Qm91bmRpbmdSZWN0KCk7CisgICAKKyAgICBpZihyZWN0LklzRW1wdHkoKSkKKyAgICAJeworICAgIAlyZXR1cm47CisgICAgCX0KKyAgICAJCisgICAgaVNjcmVlblJlY3QgPSByZWN0OyAvL3RvIGVuc3VyZSBwcm9wZXJseSBzZXQsIGFsYmVpdCBtYXkgbm90KD8pIG1hdGNoIHRvIHZhbHVlIFNETCBoYXMgLSB0aGVyZWZvcmUgbWF5IGhhcyB0byBjbGlwCisJCisJUmVjcmVhdGVMKCk7CisKKyAgICBpU3RhdGVGbGFncyB8PSBFUnVubmluZzsKKy8vICAgIGlTY2FuTGluZVdpZHRoID0gaVRhcmdldEJwcCAqIEh3UmVjdCgpLldpZHRoKCk7CisgICAgUmVsZWFzZVN0b3AoKTsKKyAgICBpZihpU3RhdGVGbGFncyAmIEVTZGxUaHJlYWRTdXNwZW5kKQorICAgIAl7CisgICAgCUVwb2NTZGxFbnY6OlJlc3VtZSgpOworICAgIAlpU3RhdGVGbGFncyAmPSB+IEVTZGxUaHJlYWRTdXNwZW5kOworICAgIAl9CisgICAgfQorICAgIAorQ0RzYTo6Q0RzYShSV3NTZXNzaW9uJiBhU2Vzc2lvbikgOiAKKyAJaVNlc3Npb24oYVNlc3Npb24pLAorICAJaVN0YXRlRmxhZ3MoMCkKKwl7CisvLwlDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisJaUNGVGFibGVbMF0gPSBDb3B5TWVtOworCWlDRlRhYmxlWzFdID0gQ29weU1lbUZsaXBSZXZlcnNlZDsKKwlpQ0ZUYWJsZVsyXSA9IENvcHlNZW1SZXZlcnNlZDsKKwlpQ0ZUYWJsZVszXSA9IENvcHlNZW1GbGlwOwkKKwkKKwlpQ0ZUYWJsZVs0XSA9IENvcHkyNTY7CisJaUNGVGFibGVbNV0gPSBDb3B5MjU2RmxpcFJldmVyc2VkOworCWlDRlRhYmxlWzZdID0gQ29weTI1NlJldmVyc2VkOworCWlDRlRhYmxlWzddID0gQ29weTI1NkZsaXA7CQorCQorCQorCWlDRlRhYmxlWzhdID0gQ29weVNsb3c7CisJaUNGVGFibGVbOV0gPSBDb3B5U2xvd0ZsaXBSZXZlcnNlZDsKKwlpQ0ZUYWJsZVsxMF0gPSBDb3B5U2xvd1JldmVyc2VkOworCWlDRlRhYmxlWzExXSA9IENvcHlTbG93RmxpcDsJCisJfQorCQorUldzU2Vzc2lvbiYgQ0RzYTo6U2Vzc2lvbigpCisJeworCXJldHVybiBpU2Vzc2lvbjsKKwl9CisKKworCitUVWludDgqIENEc2E6OkxvY2tId1N1cmZhY2UoKQorCXsKKwlpZigoaVN0YXRlRmxhZ3MgJiBFVXBkYXRpbmcpID09IDApIC8vZWxzZSBmcmFtZSBpcyBza2lwcGVkCisJCXsKKwkJcmV0dXJuIExvY2tTdXJmYWNlKCk7CisJCX0KKwlyZXR1cm4gTlVMTDsgCisJfQorCisvKgkKK3ZvaWQgQ0RzYTo6UnVuTCgpCisJeworCWlTdGF0ZUZsYWdzICY9IH5FVXBkYXRpbmc7CisJfQorCQkKKwkKK3ZvaWQgQ0RzYTo6RG9DYW5jZWwoKQorCXsKKwlpU3RhdGVGbGFncyAmPSB+RVVwZGF0aW5nOworCS8vbm90aGluZyBjYW4gZG8sIGp1c3Qgd2FpdD8KKwl9CisqLwkKKwkKK1RJbnQgQ0RzYTo6QWxsb2NTdXJmYWNlKFRCb29sIGFId1N1cmZhY2UsIGNvbnN0IFRTaXplJiBhU2l6ZSwgVERpc3BsYXlNb2RlIGFNb2RlKQorCXsKKwlpZihhSHdTdXJmYWNlICYmIGFNb2RlICE9IERpc3BsYXlNb2RlKCkpCisJCXJldHVybiBLRXJyQXJndW1lbnQ7CisJCisJaVNvdXJjZU1vZGUgPSBhTW9kZTsKKwkKKwlpU291cmNlQnBwID0gQnl0ZXNQZXJQaXhlbChhTW9kZSk7CisJCisJY29uc3QgVFNpemUgc2l6ZSA9IFdpbmRvd1NpemUoKTsKKwlpZihhU2l6ZS5pV2lkdGggPiBzaXplLmlXaWR0aCkKKwkJcmV0dXJuIEtFcnJUb29CaWc7CisJaWYoYVNpemUuaUhlaWdodCA+IHNpemUuaUhlaWdodCkKKwkJcmV0dXJuIEtFcnJUb29CaWc7CisJCisJVFJBUEQoZXJyLCBDcmVhdGVTdXJmYWNlTCgpKTsKKwlpZihlcnIgIT0gS0Vyck5vbmUpCisJCXJldHVybiBlcnI7CisKKworCVNldENvcHlGdW5jdGlvbigpOworCQorCUVwb2NTZGxFbnY6Ok9ic2VydmVyRXZlbnQoTVNETE9ic2VydmVyOjpFRXZlbnRXaW5kb3dSZXNlcnZlZCk7CisJCisJcmV0dXJuIEtFcnJOb25lOworCX0KKwkKKworLyoKK3ZvaWQgU2F2ZUJtcChjb25zdCBURGVzQyYgYU5hbWUsIGNvbnN0IFRBbnkqIGFEYXRhLCBUSW50IGFMZW5ndGgsIGNvbnN0IFRTaXplJiBhU3osIFREaXNwbGF5TW9kZSBhTW9kZSkKKwl7CisJQ0Zic0JpdG1hcCogcyA9IG5ldyBDRmJzQml0bWFwKCk7CisJcy0+Q3JlYXRlKGFTeiwgYU1vZGUpOworCXMtPkxvY2tIZWFwKCk7CisJVFVpbnQzMiogYWRkciA9IHMtPkRhdGFBZGRyZXNzKCk7CisJTWVtOjpDb3B5KGFkZHIsIGFEYXRhLCBhTGVuZ3RoKTsKKwlzLT5VbmxvY2tIZWFwKCk7CisJcy0+U2F2ZShhTmFtZSk7CisJcy0+UmVzZXQoKTsKKwlkZWxldGUgczsKKwl9CisJCit2b2lkIFNhdmVCbXAoY29uc3QgVERlc0MmIGFOYW1lLCBjb25zdCBUVWludDMyKiBhRGF0YSwgY29uc3QgVFNpemUmIGFTeikKKwl7CisJQ0Zic0JpdG1hcCogcyA9IG5ldyBDRmJzQml0bWFwKCk7CisJcy0+Q3JlYXRlKGFTeiwgRUNvbG9yNjRLKTsKKwlUQml0bWFwVXRpbCBibXAocyk7CisJYm1wLkJlZ2luKFRQb2ludCgwLCAwKSk7CisJZm9yKFRJbnQgaiA9IDA7IGogPCBhU3ouaUhlaWdodDsgaisrKQorCQl7CisJCWJtcC5TZXRQb3MoVFBvaW50KDAsIGopKTsKKwkJZm9yKFRJbnQgaSA9IDA7IGkgPCBhU3ouaVdpZHRoOyBpKyspCisJCQl7CisJCQlibXAuU2V0UGl4ZWwoKmFEYXRhKTsKKwkJCWFEYXRhKys7CisJCQlibXAuSW5jWFBvcygpOworCQkJfQorCQl9CisJYm1wLkVuZCgpOworCXMtPlNhdmUoYU5hbWUpOworCXMtPlJlc2V0KCk7CisJZGVsZXRlIHM7CisJfQkKKwkKK1RCdWY8MTY+IEZvb05hbWUoVEludCBhRm9vKQorCXsKKwlUQnVmPDE2PiBiOworCWIuRm9ybWF0KF9MKCJDOlxccGljJWQubWJtIiksIGFGb28pOworCXJldHVybiBiOworCX0KKyovCit2b2lkIENEc2E6OkNsaXBDb3B5KFRVaW50OCogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBjb25zdCBUUmVjdCYgYVJlY3QsIGNvbnN0IFRSZWN0JiBhVGFyZ2V0UG9zKSBjb25zdAorCXsKKwlUVWludDgqIHRhcmdldCA9IGFUYXJnZXQ7CisJY29uc3QgVFVpbnQ4KiBzb3VyY2UgPSBhU291cmNlOworCWNvbnN0IFRJbnQgbGluZVdpZHRoID0gYVJlY3QuV2lkdGgoKTsKKwlzb3VyY2UgKz0gaVNvdXJjZUJwcCAqIChhUmVjdC5pVGwuaVkgKiBsaW5lV2lkdGgpOyAKKwlUSW50IHNvdXJjZVN0YXJ0T2Zmc2V0ID0gaVNvdXJjZUJwcCAqICBhUmVjdC5pVGwuaVg7CisJc291cmNlICs9IHNvdXJjZVN0YXJ0T2Zmc2V0OworCXRhcmdldCArPSBpVGFyZ2V0QnBwICogKChhVGFyZ2V0UG9zLmlUbC5pWSArIGFSZWN0LmlUbC5pWSApICogbGluZVdpZHRoKTsgCisJVEludCB0YXJnZXRTdGFydE9mZnNldCA9IGlUYXJnZXRCcHAgKiAoYVJlY3QuaVRsLmlYICsgYVRhcmdldFBvcy5pVGwuaVgpOworCXRhcmdldCArPSB0YXJnZXRTdGFydE9mZnNldDsKKwlUVWludDMyKiB0YXJnZXRQdHIgPSByZWludGVycHJldF9jYXN0PFRVaW50MzIqPih0YXJnZXQpOworCWNvbnN0IFRJbnQgdGFyZ2V0V2lkdGggPSBId1JlY3QoKS5TaXplKCkuaVdpZHRoOworCWNvbnN0IFRJbnQgaGVpZ2h0ID0gYVJlY3QuSGVpZ2h0KCk7IAorCQorCVRJbnQgbGluZU1vdmUgPSBpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbjkwID8gMSA6IGxpbmVXaWR0aDsKKwkKKwlpZihpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbjE4MCkKKwkJeworCQkKKwkJdGFyZ2V0UHRyICs9IHRhcmdldFdpZHRoICogIChoZWlnaHQgLSAxKTsKKwkKKwkJZm9yKFRJbnQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgLy9zb3VyY2UgaXMgYWx3YXlzIHNtYWxsZXIKKwkJCXsKKwkJCWlDb3B5RnVuY3Rpb24oKnRoaXMsIHRhcmdldFB0ciwgc291cmNlLCBsaW5lV2lkdGgsIGhlaWdodCk7CisJCQlzb3VyY2UgKz0gbGluZU1vdmU7CisJCQl0YXJnZXRQdHIgLT0gdGFyZ2V0V2lkdGg7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJCisJCQorCQlmb3IoVEludCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSAvL3NvdXJjZSBpcyBhbHdheXMgc21hbGxlcgorCQkJeworCQkJaUNvcHlGdW5jdGlvbigqdGhpcywgdGFyZ2V0UHRyLCBzb3VyY2UsIGxpbmVXaWR0aCwgaGVpZ2h0KTsKKwkJCXNvdXJjZSArPSBsaW5lTW92ZTsKKwkJCXRhcmdldFB0ciArPSB0YXJnZXRXaWR0aDsKKwkJCX0KKwkJfQorCisJfQorCQorCQorCisKK3ZvaWQgQ0RzYTo6V2lwZSgpIC8vZG9udCBjYWxsIGluIGRyYXdpbmcKKwl7CisJaWYoSXNEc2FBdmFpbGFibGUoKSkKKwkJV2lwZShpVGFyZ2V0QnBwICogaVNjcmVlblJlY3QuV2lkdGgoKSAqIGlTY3JlZW5SZWN0LkhlaWdodCgpKTsKKwl9CisJCit2b2lkIENEc2E6OlNldENvcHlGdW5jdGlvbigpCisJeworCS8vY2FsY3VsYXRlIG9mZnNldCB0byBjb3JyZWN0IGZ1bmN0aW9uIGluIGlDRlRhYmxlIGFjY29yZGluZyB0byBnaXZlbiBwYXJhbWV0ZXJzCisJVEludCBmdW5jdGlvbiA9IDA7CisJY29uc3QgVEludCBLQ29weUZ1bmN0aW9ucyA9IDQ7CisJY29uc3QgVEludCBLT2Zmc2V0VG9OYXRpdmUgPSAwOworCWNvbnN0IFRJbnQgS09mZnNldFRvMjU2ID0gS09mZnNldFRvTmF0aXZlICsgS0NvcHlGdW5jdGlvbnM7CisJY29uc3QgVEludCBLT2Zmc2V0VG9PdGhlck1vZGVzID0gS09mZnNldFRvMjU2ICsgS0NvcHlGdW5jdGlvbnM7CisJY29uc3QgVEludCBLT2Zmc2V0VG85MEZ1bmN0aW9ucyA9IDE7CisJY29uc3QgVEludCBLT2Zmc2V0VG8xODBGdW5jdGlvbnMgPSAyOworCQorCWlmKGlTb3VyY2VNb2RlID09IERpc3BsYXlNb2RlKCkpCisJCWZ1bmN0aW9uID0gS09mZnNldFRvTmF0aXZlOyAJCS8vMAorCWVsc2UgaWYoaVNvdXJjZU1vZGUgPT0gRUNvbG9yMjU2KQorCQlmdW5jdGlvbiA9IEtPZmZzZXRUbzI1NjsJCQkvLzQKKwllbHNlCisJCWZ1bmN0aW9uID0gS09mZnNldFRvT3RoZXJNb2RlczsgCS8vOAorCQorCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uOTApCisJCWZ1bmN0aW9uICs9IEtPZmZzZXRUbzkwRnVuY3Rpb25zOyAJLy8gKyAxCisJaWYoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb24xODApCisJCWZ1bmN0aW9uICs9IEtPZmZzZXRUbzE4MEZ1bmN0aW9uczsgCS8vKyAyCisJCisJaUNvcHlGdW5jdGlvbiA9IGlDRlRhYmxlW2Z1bmN0aW9uXTsKKwkKKwlXaXBlKCk7CisJfQorCQoraW5saW5lIHZvaWQgUm90YXRlKFRSZWN0JiBhUmVjdCkKKwl7CisJY29uc3QgVEludCBkeCA9IGFSZWN0LmlCci5pWCAtIGFSZWN0LmlUbC5pWDsKKwljb25zdCBUSW50IGR5ID0gYVJlY3QuaUJyLmlZIC0gYVJlY3QuaVRsLmlZOworCisJYVJlY3QuaUJyLmlYID0gYVJlY3QuaVRsLmlYICsgZHk7CisJYVJlY3QuaUJyLmlZID0gYVJlY3QuaVRsLmlZICsgZHg7CisJCisJY29uc3QgVEludCB0bXAgPSBhUmVjdC5pVGwuaVg7CisJYVJlY3QuaVRsLmlYID0gYVJlY3QuaVRsLmlZOworCWFSZWN0LmlUbC5pWSA9IHRtcDsKKwl9CisJCisvKgkKK2ludCBiYXIgPSAwOworKi8JCitUQm9vbCBDRHNhOjpBZGRVcGRhdGVSZWN0KGNvbnN0IFRVaW50OCogYUJpdHMsIGNvbnN0IFRSZWN0JiBhVXBkYXRlUmVjdCwgY29uc3QgVFJlY3QmIGFSZWN0KQorCXsKKworCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uQ2hhbmdlZCkKKwkJeworCQlpU3RhdGVGbGFncyAmPSB+RU9yaWVudGF0aW9uRmxhZ3M7CisJCWlTdGF0ZUZsYWdzIHw9IGlOZXdGbGFnczsKKwkJU2V0Q29weUZ1bmN0aW9uKCk7CisJCWlTdGF0ZUZsYWdzICY9IH5FT3JpZW50YXRpb25DaGFuZ2VkOworCSAgICBFcG9jU2RsRW52OjpXYWl0RGV2aWNlQ2hhbmdlKCk7CisJICAgIHJldHVybiBFRmFsc2U7IC8vc2tpcCB0aGlzIGZyYW1lIGFzIGRhdGEgaXMgbWF5IGJlIGNoYW5nZWQKKwkJfQorCisJaWYoaVRhcmdldEFkZHIgPT0gTlVMTCkKKwkJeworCQlpVGFyZ2V0QWRkciA9IExvY2tId1N1cmZhY2UoKTsKKwkJfQorCVRVaW50OCogdGFyZ2V0ID0gaVRhcmdldEFkZHI7CisJaWYodGFyZ2V0ID09IE5VTEwpCisJCXJldHVybiBFRmFsc2U7CisJCisJCisJVFJlY3QgdGFyZ2V0UmVjdCA9IEh3UmVjdCgpOworCVRSZWN0IHNvdXJjZVJlY3QgPSBhUmVjdDsKKwlUUmVjdCB1cGRhdGVSZWN0ID0gYVVwZGF0ZVJlY3Q7CisJCisJaWYoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb245MCkKKwkJeworCQlSb3RhdGUoc291cmNlUmVjdCk7CisJCVJvdGF0ZSh1cGRhdGVSZWN0KTsKKwkJfQorCQkKKwlpZihpU291cmNlTW9kZSAhPSBEaXNwbGF5TW9kZSgpIHx8ICB0YXJnZXRSZWN0ICE9IHNvdXJjZVJlY3QgfHwgdGFyZ2V0UmVjdCAhPSB1cGRhdGVSZWN0IHx8ICgoaVN0YXRlRmxhZ3MgJiBFT3JpZW50YXRpb25GbGFncykgIT0gMCkpCisJCXsKKwkJc291cmNlUmVjdC5JbnRlcnNlY3Rpb24odGFyZ2V0UmVjdCk7IC8vc28gc291cmNlIGFsd2F5cyBzbWFsbGVyIG9yIGVxdWFsIHRoYW4gdGFyZ2V0CisJCXVwZGF0ZVJlY3QuSW50ZXJzZWN0aW9uKHRhcmdldFJlY3QpOworCQlDbGlwQ29weSh0YXJnZXQsIGFCaXRzLCB1cGRhdGVSZWN0LCBzb3VyY2VSZWN0KTsKKwkJfQorCWVsc2UKKwkJeworCQljb25zdCBUSW50IGJ5dGVDb3VudCA9IGFSZWN0LldpZHRoKCkgKiBhUmVjdC5IZWlnaHQoKSAqIGlTb3VyY2VCcHA7IC8vdGhpcyBjb3VsZCBiZSBzdG9yZWQKKwkJTWVtOjpDb3B5KHRhcmdldCwgYUJpdHMsIGJ5dGVDb3VudCk7CisJCX0KKworCXJldHVybiBFVHJ1ZTsKKwl9CisJCitDRHNhKiBDRHNhOjpDcmVhdGVMKFJXc1Nlc3Npb24mIGFTZXNzaW9uKQorCXsKKwlpZihFcG9jU2RsRW52OjpGbGFncyhDU0RMOjpFRHJhd01vZGVEU0IpKQorCQl7CisJCVRJbnQgZmxhZ3MgPSBDRGlyZWN0U2NyZWVuQml0bWFwOjpFTm9uZTsKKwkJaWYoRXBvY1NkbEVudjo6RmxhZ3MoQ1NETDo6RURyYXdNb2RlRFNCRG91YmxlQnVmZmVyKSkKKwkJCWZsYWdzIHw9IENEaXJlY3RTY3JlZW5CaXRtYXA6OkVEb3VibGVCdWZmZXI7CisJCWlmKEVwb2NTZGxFbnY6OkZsYWdzKENTREw6OkVEcmF3TW9kZURTQkluY3JlbnRhbFVwZGF0ZSkpCisJCQlmbGFncyB8PSBDRGlyZWN0U2NyZWVuQml0bWFwOjpFSW5jcmVtZW50YWxVcGRhdGU7CisJCXJldHVybiBuZXcgKEVMZWF2ZSkgQ0RzYUIoYVNlc3Npb24pOworCQl9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbmV3IChFTGVhdmUpIENEc2FBKGFTZXNzaW9uKTsKKwl9IAkKKwordm9pZCBDRHNhOjpDcmVhdGVab29tZXJMKGNvbnN0IFRTaXplJiBhU2l6ZSkKKwl7CisJaVN3U2l6ZSA9IGFTaXplOworCWlTdGF0ZUZsYWdzIHw9IEVSZXNpemVSZXF1ZXN0OworCUNyZWF0ZVN1cmZhY2VMKCk7CisJU2V0VGFyZ2V0UmVjdCgpOworCX0KKwkKK1RQb2ludCBDRHNhOjpXaW5kb3dDb29yZGluYXRlcyhjb25zdCBUUG9pbnQmIGFQb2ludCkgY29uc3QJCisJeworCVRQb2ludCBwb3MgPSBhUG9pbnQgLSBpU2NyZWVuUmVjdC5pVGw7CisJY29uc3QgVFNpemUgYXN6ID0gaVNjcmVlblJlY3QuU2l6ZSgpOworCWlmKGlTdGF0ZUZsYWdzICYgRU9yaWVudGF0aW9uMTgwKQorCQl7CisJCXBvcy5pWCA9IGFzei5pV2lkdGggLSBwb3MuaVg7CisJCXBvcy5pWSA9IGFzei5pSGVpZ2h0IC0gcG9zLmlZOwkKKwkJfQkKKwlpZihpU3RhdGVGbGFncyAmIEVPcmllbnRhdGlvbjkwKQorCQl7CisJCXBvcy5pWCA9IGFQb2ludC5pWTsKKwkJcG9zLmlZID0gYVBvaW50LmlYOwkKKwkJfQorCXBvcy5pWCA8PD0gMTY7CisJcG9zLmlZIDw8PSAxNjsKKwlwb3MuaVggLz0gYXN6LmlXaWR0aDsgCisJcG9zLmlZIC89IGFzei5pSGVpZ2h0OworCXBvcy5pWCAqPSBpU3dTaXplLmlXaWR0aDsKKwlwb3MuaVkgKj0gaVN3U2l6ZS5pSGVpZ2h0OworCXBvcy5pWCA+Pj0gMTY7CisJcG9zLmlZID4+PSAxNjsKKwlyZXR1cm4gcG9zOyAJCisJfQorCQordm9pZCBDRHNhOjpTZXRUYXJnZXRSZWN0KCkKKwl7CisJaVRhcmdldFJlY3QgPSBpU2NyZWVuUmVjdDsKKwlpZihpU3RhdGVGbGFncyAmIEVSZXNpemVSZXF1ZXN0ICYmIEVwb2NTZGxFbnY6OkZsYWdzKENTREw6OkVBbGxvd0ltYWdlUmVzaXplS2VlcFJhdGlvKSkKKwkJeworCQljb25zdCBUU2l6ZSBhc3ogPSBpU2NyZWVuUmVjdC5TaXplKCk7CisJCWNvbnN0IFRTaXplIHN6ID0gaVN3U2l6ZTsKKwkJCisJCVRSZWN0IHJlY3Q7CisJCQorCQljb25zdCBUSW50IGRoID0gKHN6LmlIZWlnaHQgPDwgMTYpIC8gc3ouaVdpZHRoOworCisJCWlmKChhc3ouaVdpZHRoICogZGggKSA+PiAxNiA8PSBhc3ouaUhlaWdodCkKKwkJCXsKKwkJCXJlY3QuU2V0UmVjdChUUG9pbnQoMCwgMCksIFRTaXplKGFzei5pV2lkdGgsIChhc3ouaVdpZHRoICogZGgpID4+IDE2KSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWNvbnN0IFRJbnQgZHcgPSAoc3ouaVdpZHRoIDw8IDE2KSAvIHN6LmlIZWlnaHQ7CisJICAgIAlyZWN0LlNldFJlY3QoVFBvaW50KDAsIDApLCBUU2l6ZSgoYXN6LmlIZWlnaHQgKiBkdykgPj4gMTYsIGFzei5pSGVpZ2h0KSk7CisJCQl9CisJCXJlY3QuTW92ZSgoYXN6LmlXaWR0aCAtIHJlY3QuU2l6ZSgpLmlXaWR0aCkgPj4gMSwgKGFzei5pSGVpZ2h0IC0gcmVjdC5TaXplKCkuaUhlaWdodCkgPj4gMSk7ICAKKwkJCisJCWlUYXJnZXRSZWN0ID0gcmVjdDsKKwkJaVRhcmdldFJlY3QuTW92ZShpU2NyZWVuUmVjdC5pVGwpOworCisJCX0gCisJaWYoIShpU3RhdGVGbGFncyAmIEVSZXNpemVSZXF1ZXN0KSkKKwkJaVN3U2l6ZSA9IGlTY3JlZW5SZWN0LlNpemUoKTsKKy8vCWlTY2FuTGluZVdpZHRoID0gLyppVGFyZ2V0QnBwICoqLyBTd1NpemUoKS5pV2lkdGg7CisJfQorCQkKK3ZvaWQgQ0RzYTo6UmVjcmVhdGVMKCkKKwl7CisJfQorCit2b2lkIENEc2E6OkZyZWUoKQorCXsKKwl9CisJCQordm9pZCBDRHNhOjpVcGRhdGVTd1N1cmZhY2UoKQorCXsKKwlpVGFyZ2V0QWRkciA9IE5VTEw7CisJVW5sb2NrSHdTdXJmYWNlKCk7CS8vY291bGQgYmUgZmFzdGVyIGlmIGRvZXMgbm90IHVzZSBBTywgYnV0IG9ubHkgY2hlY2sgc3RhdHVzIGJlZm9yZSByZWRyYXcsIHRoZW4gbm8gY29udGV4dCBzd2l0Y2ggbmVlZGVkCisJfQorCit2b2lkIENEc2E6OlNldEJsaXR0ZXIoTUJsaXR0ZXIqIGFCbGl0dGVyKQorCXsKKwlpQmxpdHRlciA9IGFCbGl0dGVyOworCX0KKwkKK3ZvaWQgQ0RzYTo6RHJhd092ZXJsYXlzKCkKKwl7CisJY29uc3QgVEludCBsYXN0ID0gaU92ZXJsYXlzLkNvdW50KCkgLSAxOworCWZvcihUSW50IGkgPSBsYXN0OyBpID49IDAgOyBpLS0pCisJCWlPdmVybGF5c1tpXS5pT3ZlcmxheS0+RHJhdygqaURzYS0+R2MoKSwgSHdSZWN0KCksIFN3U2l6ZSgpKTsKKwl9CisKK1RJbnQgQ0RzYTo6QXBwZW5kT3ZlcmxheShNT3ZlcmxheSYgYU92ZXJsYXksIFRJbnQgYVByaW9yaXR5KQorCXsKKwlUSW50IGk7CisJZm9yKGkgPSAwOyBpIDwgaU92ZXJsYXlzLkNvdW50KCkgJiYgaU92ZXJsYXlzW2ldLmlQcmlvcml0eSA8IGFQcmlvcml0eTsgaSsrKQorCQl7fQorCWNvbnN0IFRPdmVybGF5IG92ZXJsYXkgPSB7JmFPdmVybGF5LCBhUHJpb3JpdHl9OworCXJldHVybiBpT3ZlcmxheXMuSW5zZXJ0KG92ZXJsYXksIGkpOworCX0KKwkKK1RJbnQgQ0RzYTo6UmVtb3ZlT3ZlcmxheShNT3ZlcmxheSYgYU92ZXJsYXkpCisJeworCWZvcihUSW50IGkgPSAwOyBpIDwgaU92ZXJsYXlzLkNvdW50KCk7IGkrKykKKwkJeworCQlpZihpT3ZlcmxheXNbaV0uaU92ZXJsYXkgPT0gJmFPdmVybGF5KQorCQkJeworCQkJaU92ZXJsYXlzLlJlbW92ZShpKTsKKwkJCXJldHVybiBLRXJyTm9uZTsKKwkJCX0KKwkJfQorCXJldHVybiBLRXJyTm90Rm91bmQ7CisJfQorCQkKK1RJbnQgQ0RzYTo6UmVkcmF3UmVxdWVzdCgpCisJeworCWlmKCEoaVN0YXRlRmxhZ3MgJiAoRVVwZGF0aW5nKSAmJiAoaVN0YXRlRmxhZ3MgJiBFUnVubmluZykpKQorCQl7CisJCXJldHVybiBFeHRlcm5hbFVwZGF0ZSgpOworCQl9CisJcmV0dXJuIEtFcnJOb3RSZWFkeTsKKwl9CisKKwordm9pZCBDRHNhOjpSZXN1bWUoKQkKKwl7CisJaWYoU3RvcHBlZCgpKQorCQlSZXN0YXJ0KFJEaXJlY3RTY3JlZW5BY2Nlc3M6OkVUZXJtaW5hdGVSZWdpb24pOworCX0KKwkKK3ZvaWQgQ0RzYTo6RG9TdG9wKCkKKwl7CisJaWYoSXNEc2FBdmFpbGFibGUoKSkKKwkJaVN0YXRlRmxhZ3MgfD0gRVNkbFRocmVhZEV4cGxpY2l0U3RvcDsKKwlTdG9wKCk7CisJfQorCQordm9pZCBDRHNhOjpTdG9wKCkKKwl7CisJaVN0YXRlRmxhZ3MgJj0gfkVSdW5uaW5nOworLy8JQ2FuY2VsKCk7IC8vY2FuIGJlIGNhbGxlZCBvbmx5IGZyb20gbWFpbiEKKwlpRHNhLT5DYW5jZWwoKTsKKwl9CisJCit2b2lkIENEc2E6OkFib3J0Tm93KFJEaXJlY3RTY3JlZW5BY2Nlc3M6OlRUZXJtaW5hdGlvblJlYXNvbnMgLyphUmVhc29uKi8pCisJeworLy8JaVN0YXRlRmxhZ3MgfD0gRUNoYW5nZU5vdGlmeTsKKwlTdG9wKCk7CisJfQorCQordm9pZCBDRHNhOjpSZXN0YXJ0KFJEaXJlY3RTY3JlZW5BY2Nlc3M6OlRUZXJtaW5hdGlvblJlYXNvbnMgYVJlYXNvbikKKwl7CisJaWYoYVJlYXNvbiA9PSBSRGlyZWN0U2NyZWVuQWNjZXNzOjpFVGVybWluYXRlUmVnaW9uKSAvL2F1dG8gcmVzdGFydAorCQl7CQkJCQkJCQkJCQkJCisJCVRSQVBEKGVyciwgUmVzdGFydEwoKSk7CisJCVBBTklDX0lGX0VSUk9SKGVycik7CisJCX0KKwl9CisvKikKK1RCb29sIENEc2E6OkNoYW5nZVRyaWdnZXIoKQorCXsKKwljb25zdCBUQm9vbCBjaGFuZ2UgPSBpU3RhdGVGbGFncyAmIEVDaGFuZ2VOb3RpZnk7CisJaVN0YXRlRmxhZ3MgJj0gfkVDaGFuZ2VOb3RpZnk7CisJcmV0dXJuIGNoYW5nZTsKKwl9CisqLwkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQ0RzYTo6Q29weTI1Nihjb25zdCBDRHNhJiBhRHNhLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50KQorCXsKKwlUVWludDMyKiB0YXJnZXQgPSBhVGFyZ2V0OworCWNvbnN0IFRVaW50MzIqIGVuZHQgPSB0YXJnZXQgKyBhQnl0ZXM7IAorCWNvbnN0IFRVaW50OCogc291cmNlID0gYVNvdXJjZTsKKwl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQl7CisJCSp0YXJnZXQrKyA9IGFEc2EuaUx1dDI1Nlsqc291cmNlKytdOyAKKwkJfQorCX0KKwkKK3ZvaWQgQ0RzYTo6Q29weTI1NlJldmVyc2VkKGNvbnN0IENEc2EmIGFEc2EsIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQpCisJeworCWNvbnN0IFRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IGFUYXJnZXQgKyBhQnl0ZXM7IAorCWNvbnN0IFRVaW50OCogc291cmNlID0gYVNvdXJjZTsKKwl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQl7CisJCSooLS1lbmR0KSA9IGFEc2EuaUx1dDI1Nlsqc291cmNlKytdOyAKKwkJfQorCX0JCisJCit2b2lkIENEc2E6OkNvcHkyNTZGbGlwKGNvbnN0IENEc2EmIGFEc2EsIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQgYUxpbmVMZW4pCisJeworCVRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJY29uc3QgVFVpbnQzMiogZW5kdCA9IHRhcmdldCArIGFCeXRlczsgCisJY29uc3QgVFVpbnQ4KiBjb2x1bW4gPSBhU291cmNlOworCisJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJeworCQkqdGFyZ2V0KysgPSBhRHNhLmlMdXQyNTZbKmNvbHVtbl07CisJCWNvbHVtbiArPSBhTGluZUxlbjsKKwkJfQorCX0KKwkKK3ZvaWQgQ0RzYTo6Q29weTI1NkZsaXBSZXZlcnNlZChjb25zdCBDRHNhJiBhRHNhLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50IGFMaW5lTGVuKQorCXsKKwljb25zdCBUVWludDMyKiB0YXJnZXQgPSBhVGFyZ2V0OworCVRVaW50MzIqIGVuZHQgPSBhVGFyZ2V0ICsgYUJ5dGVzOyAKKwljb25zdCBUVWludDgqIGNvbHVtbiA9IGFTb3VyY2U7CisKKwl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQl7CisJCSooLS1lbmR0KSA9IGFEc2EuaUx1dDI1NlsqY29sdW1uXTsKKwkJY29sdW1uICs9IGFMaW5lTGVuOworCQl9CisJfQkJCisKK3ZvaWQgQ0RzYTo6Q29weU1lbShjb25zdCBDRHNhJiAvKmFEc2EqLywgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCkKKwl7CisJTWVtOjpDb3B5KGFUYXJnZXQsIGFTb3VyY2UsIGFCeXRlcyk7CisJfQorCQordm9pZCBDRHNhOjpDb3B5TWVtRmxpcChjb25zdCBDRHNhJiAvKmFEc2EqLywgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbikKKwl7CisJVFVpbnQzMiogdGFyZ2V0ID0gYVRhcmdldDsKKwljb25zdCBUVWludDMyKiBlbmR0ID0gdGFyZ2V0ICsgYUJ5dGVzOyAKKwljb25zdCBUVWludDMyKiBjb2x1bW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IFRVaW50MzIqPihhU291cmNlKTsKKworCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCXsKKwkJKnRhcmdldCsrID0gKmNvbHVtbjsKKwkJY29sdW1uICs9IGFMaW5lTGVuOworCQl9CisJfQorCQordm9pZCBDRHNhOjpDb3B5TWVtUmV2ZXJzZWQoY29uc3QgQ0RzYSYgLyphRHNhKi8sIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQpCisJeworCWNvbnN0IFRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IGFUYXJnZXQgKyBhQnl0ZXM7IAorCWNvbnN0IFRVaW50MzIqIHNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFVpbnQzMio+KGFTb3VyY2UpOworCXdoaWxlKHRhcmdldCA8IGVuZHQpCisJCXsKKwkJKigtLWVuZHQpID0gKnNvdXJjZSsrOyAKKwkJfQorCX0JCisJCisJCit2b2lkIENEc2E6OkNvcHlNZW1GbGlwUmV2ZXJzZWQoY29uc3QgQ0RzYSYgLyphRHNhKi8sIFRVaW50MzIqIGFUYXJnZXQsIGNvbnN0IFRVaW50OCogYVNvdXJjZSwgVEludCBhQnl0ZXMsIFRJbnQgYUxpbmVMZW4pCisJeworCWNvbnN0IFRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IGFUYXJnZXQgKyBhQnl0ZXM7IAorCWNvbnN0IFRVaW50MzIqIGNvbHVtbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFVpbnQzMio+KGFTb3VyY2UpOworCisJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJeworCQkqKC0tZW5kdCkgPSAqY29sdW1uOworCQljb2x1bW4gKz0gYUxpbmVMZW47CisJCX0KKwl9CisJCQkKKwordHlwZWRlZiBUUmdiICgqVFJnYkZ1bmMpIChUSW50IGFWYWx1ZSk7CisKK0xPQ0FMX0MgVFJnYiByZ2IxNk1BKFRJbnQgYVZhbHVlKQorCXsKKwlyZXR1cm4gVFJnYjo6Q29sb3IxNk1BKGFWYWx1ZSk7CisJfQorCQorTk9OU0hBUkFCTEVfQ0xBU1MoTVJnYkNvcHkpCisJeworCXB1YmxpYzoKKwl2aXJ0dWFsIHZvaWQgQ29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUQm9vbCBhUmV2ZXJzZWQpID0gMDsKKwl2aXJ0dWFsIHZvaWQgRmxpcENvcHkoVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbiwgVEJvb2wgYVJldmVyc2VkKSA9IDA7CisJfTsKK3RlbXBsYXRlIDxjbGFzcyBUPgorTk9OU0hBUkFCTEVfQ0xBU1MoVFJnYkNvcHkpIDogcHVibGljIE1SZ2JDb3B5CisJeworCXB1YmxpYzoKKwlUUmdiQ29weShURGlzcGxheU1vZGUgYU1vZGUpOworCXZvaWQqIG9wZXJhdG9yIG5ldyhUVWludCBhQnl0ZXMsIFRBbnkqIGFNZW0pOworCXZvaWQgQ29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUQm9vbCBhUmV2ZXJzZWQpOworCXZvaWQgRmxpcENvcHkoVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbiwgVEJvb2wgYVJldmVyc2VkKTsKKwlwcml2YXRlOgorCQlUUmdiRnVuYyBpRnVuYzsKKwl9OworCQkKK3RlbXBsYXRlIDxjbGFzcyBUPgkJCit2b2lkKiBUUmdiQ29weTxUPjo6b3BlcmF0b3IgbmV3KFRVaW50IC8qYUJ5dGVzKi8sIFRBbnkqIGFNZW0pCisJeworCXJldHVybiBhTWVtOworCX0KKwkJCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1RSZ2JDb3B5PFQ+OjpUUmdiQ29weShURGlzcGxheU1vZGUgYU1vZGUpCisJeworCXN3aXRjaChhTW9kZSkKKwl7CisJY2FzZSBFR3JheTI1NiA6IGlGdW5jID0gVFJnYjo6R3JheTI1NjsgYnJlYWs7CisJY2FzZSBFQ29sb3IyNTYgOiBpRnVuYyA9IFRSZ2I6OkNvbG9yMjU2OyBicmVhazsKKwljYXNlIEVDb2xvcjRLIDogaUZ1bmMgPSBUUmdiOjpDb2xvcjRLOyBicmVhazsKKwljYXNlIEVDb2xvcjY0SyA6IGlGdW5jID0gVFJnYjo6Q29sb3I2NEs7IGJyZWFrOworCWNhc2UgRUNvbG9yMTZNIDogaUZ1bmMgPSBUUmdiOjpDb2xvcjE2TTsgYnJlYWs7CisJY2FzZSBFQ29sb3IxNk1VIDogaUZ1bmMgPSBUUmdiOjpDb2xvcjE2TVU7IGJyZWFrOworCWNhc2UgRUNvbG9yMTZNQSA6IGlGdW5jID0gcmdiMTZNQTsgYnJlYWs7CisJZGVmYXVsdDoKKwkJUEFOSUMoS0Vyck5vdFN1cHBvcnRlZCk7CisJfQorCX0KKwkKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBUUmdiQ29weTxUPjo6Q29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUQm9vbCBhUmV2ZXJzZWQpCisJeworCWNvbnN0IFQqIHNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KGFTb3VyY2UpOworCVRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IHRhcmdldCArIGFCeXRlczsKKwkKKwlpZihhUmV2ZXJzZWQpCisJCXsKKwkJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJCXsKKwkJCVRVaW50MzIgdmFsdWUgPSAqc291cmNlKys7CisJCQkqKC0tZW5kdCkgPSBpRnVuYyh2YWx1ZSkuVmFsdWUoKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQl3aGlsZSh0YXJnZXQgPCBlbmR0KQorCQkJeworCQkJVFVpbnQzMiB2YWx1ZSA9ICpzb3VyY2UrKzsKKwkJCSp0YXJnZXQrKyA9IGlGdW5jKHZhbHVlKS5WYWx1ZSgpOworCQkJfQorCQl9CisJfQorCQordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIFRSZ2JDb3B5PFQ+OjpGbGlwQ29weShUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50IGFMaW5lTGVuLCBUQm9vbCBhUmV2ZXJzZWQpCisJeworCWNvbnN0IFQqIGNvbHVtbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KGFTb3VyY2UpOworCVRVaW50MzIqIHRhcmdldCA9IGFUYXJnZXQ7CisJVFVpbnQzMiogZW5kdCA9IHRhcmdldCArIGFCeXRlczsKKwkKKwlpZihhUmV2ZXJzZWQpCisJCXsKKwkJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJCXsKKwkJCSooLS1lbmR0KSA9IGlGdW5jKCpjb2x1bW4pLlZhbHVlKCk7CisJCQljb2x1bW4gKz0gYUxpbmVMZW47CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJd2hpbGUodGFyZ2V0IDwgZW5kdCkKKwkJCXsKKwkJCSp0YXJnZXQrKyA9IGlGdW5jKCpjb2x1bW4pLlZhbHVlKCk7CisJCQljb2x1bW4gKz0gYUxpbmVMZW47CisJCQl9CisJCX0KKwl9CQorCQorCit0eXBlZGVmIFRVaW50NjQgVFN0YWNrTWVtOworCitMT0NBTF9DIE1SZ2JDb3B5KiBHZXRDb3B5KFRBbnkqIG1lbSwgVERpc3BsYXlNb2RlIGFNb2RlKQorCXsKKwlpZihhTW9kZSA9PSBFQ29sb3IyNTYgfHwgYU1vZGUgPT0gRUdyYXkyNTYpCisJCXsKKwkJcmV0dXJuIG5ldyAobWVtKSBUUmdiQ29weTxUVWludDg+KGFNb2RlKTsKKwkJfQorCWlmKGFNb2RlID09IEVDb2xvcjRLIHx8IGFNb2RlID09IEVDb2xvcjY0SykKKwkJeworCQlyZXR1cm4gbmV3IChtZW0pIFRSZ2JDb3B5PFRVaW50MTY+KGFNb2RlKTsKKwkJfQorCWlmKGFNb2RlID09IEVDb2xvcjE2TSB8fCBhTW9kZSA9PSBFQ29sb3IxNk1VIHx8IGFNb2RlID09IEVDb2xvcjE2TUEpCisJCXsKKwkJcmV0dXJuIG5ldyAobWVtKSBUUmdiQ29weTxUVWludDMyPihhTW9kZSk7CisJCX0KKwlQQU5JQyhLRXJyTm90U3VwcG9ydGVkKTsKKwlyZXR1cm4gTlVMTDsKKwl9CisJCisKK3ZvaWQgQ0RzYTo6Q29weVNsb3dGbGlwUmV2ZXJzZWQoY29uc3QgQ0RzYSYgYURzYSwgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCBhTGluZUxlbikKKwl7CisJVFN0YWNrTWVtIG1lbSA9IDA7CisJR2V0Q29weSgmbWVtLCBhRHNhLmlTb3VyY2VNb2RlKS0+RmxpcENvcHkoYVRhcmdldCwgYVNvdXJjZSwgYUJ5dGVzLCBhTGluZUxlbiwgRVRydWUpOwkKKwl9CisJCit2b2lkIENEc2E6OkNvcHlTbG93RmxpcChjb25zdCBDRHNhJiBhRHNhLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50IGFMaW5lTGVuKQorCXsKKwlUU3RhY2tNZW0gbWVtID0gMDsKKwlHZXRDb3B5KCZtZW0sIGFEc2EuaVNvdXJjZU1vZGUpLT5GbGlwQ29weShhVGFyZ2V0LCBhU291cmNlLCBhQnl0ZXMsIGFMaW5lTGVuLCBFRmFsc2UpOworCX0KKwkKK3ZvaWQgQ0RzYTo6Q29weVNsb3coY29uc3QgQ0RzYSYgYURzYSwgVFVpbnQzMiogYVRhcmdldCwgY29uc3QgVFVpbnQ4KiBhU291cmNlLCBUSW50IGFCeXRlcywgVEludCkKKwl7CisJVFN0YWNrTWVtIG1lbSA9IDA7CisJR2V0Q29weSgmbWVtLCBhRHNhLmlTb3VyY2VNb2RlKS0+Q29weShhVGFyZ2V0LCBhU291cmNlLCBhQnl0ZXMsIEVGYWxzZSk7CQorCX0JCisKK3ZvaWQgQ0RzYTo6Q29weVNsb3dSZXZlcnNlZChjb25zdCBDRHNhJiBhRHNhLCBUVWludDMyKiBhVGFyZ2V0LCBjb25zdCBUVWludDgqIGFTb3VyY2UsIFRJbnQgYUJ5dGVzLCBUSW50KQorCXsKKwlUU3RhY2tNZW0gbWVtID0gMDsKKwlHZXRDb3B5KCZtZW0sIGFEc2EuaVNvdXJjZU1vZGUpLT5Db3B5KGFUYXJnZXQsIGFTb3VyY2UsIGFCeXRlcywgRVRydWUpOwkKKwl9CQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vc3ltYmlhbi9TRExfZXBvY2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N5bWJpYW4vU0RMX2Vwb2NldmVudHNfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTBhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3N5bWJpYW4vU0RMX2Vwb2NldmVudHNfYy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGRldm9sdXRpb24uY29tCisqLworCisvKgorICAgIFNETF9lcG9jZXZlbnRzX2MuaAorICAgIEhhbmRsZSB0aGUgZXZlbnQgc3RyZWFtLCBjb252ZXJ0aW5nIEVwb2MgZXZlbnRzIGludG8gU0RMIGV2ZW50cworCisgICAgRXBvYyB2ZXJzaW9uIGJ5IEhhbm51IFZpaXRhbGEgKGhhbm51LmoudmlpdGFsYUBtYm5ldC5maSkgYW5kIE1hcmt1cyBNZXJ0YW1hCisgICAgCisqLworCisKKyNpZmRlZiBTQVZFX1JDU0lECitzdGF0aWMgY2hhciByY3NpZCA9CisgIkAoIykgJElkOiBTRExfYWFldmVudHNfYy5oLHYgMS4xLjIuMiAyMDAwLzAzLzE2IDE1OjIwOjM5IGhlcmN1bGVzIEV4cCAkIjsKKyNlbmRpZgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJTRExfc3lzdmlkZW8uaCIKKy8vI2luY2x1ZGUgIlNETF9lcG9jdmlkZW8uaCIKK30KKworCisKKyNkZWZpbmUgTUFYX1NDQU5DT0RFIDI1NQorCisvKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfc3lzZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCisgICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX3N5c3ZpZGVvLmMpCisqLworCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICpfdGhpcworI2RlZmluZSBQcml2YXRlCV90aGlzLT5oaWRkZW4KKworZXh0ZXJuICJDIiB7CitleHRlcm4gdm9pZCBFUE9DX0luaXRPU0tleW1hcChfVEhJUyk7CitleHRlcm4gdm9pZCBFUE9DX1B1bXBFdmVudHMoX1RISVMpOworfQorCitleHRlcm4gVEJvb2wgaXNDdXJzb3JWaXNpYmxlOworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2YzllNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vdmdsL1NETF92Z2xldmVudHMuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIEhhbmRsZSB0aGUgZXZlbnQgc3RyZWFtLCBjb252ZXJ0aW5nIFgxMSBldmVudHMgaW50byBTREwgZXZlbnRzICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8c3lzL2ZiaW8uaD4KKyNpbmNsdWRlIDxzeXMvY29uc2lvLmg+CisjaW5jbHVkZSA8c3lzL2tiaW8uaD4KKyNpbmNsdWRlIDx2Z2wuaD4KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfdmdsdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfdmdsZXZlbnRzX2MuaCIKKworLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlcyBmcm9tIGEgY29uc29sZSBzY2FuY29kZSB0byBhIFNETCBrZXlzeW0gKi8KKy8qIEZJWE1FOiBGcmVlIHRoZSBrZXltYXAgd2hlbiB3ZSBzaHV0IGRvd24gdGhlIHZpZGVvIG1vZGUgKi8KK3N0YXRpYyBrZXltYXBfdCAqdmdhX2tleW1hcCA9IE5VTEw7CitzdGF0aWMgU0RMS2V5IGtleW1hcFsxMjhdOworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSk7CisKK3N0YXRpYyBpbnQgcG9zdGVkID0gMDsKK3N0YXRpYyBpbnQgb2xkeCA9IC0xOworc3RhdGljIGludCBvbGR5ID0gLTE7CitzdGF0aWMgc3RydWN0IG1vdXNlX2luZm8gbW91c2VpbmZvOworCisvKiBVZ2gsIHdlIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBrZXJuZWwncyBrZXlzeW0gbWFwcGluZyBjb2RlLi4uCisgICBPaCwgaXQncyBub3Qgc28gYmFkLiA6LSkKKworICAgRklYTUU6IEFkZCBrZXlib2FyZCBMRUQgaGFuZGxpbmcgY29kZQorICovCitpbnQgVkdMX2luaXRrZXltYXBzKGludCBmZCkKK3sKKwl2Z2Ffa2V5bWFwID0gU0RMX21hbGxvYyhzaXplb2Yoa2V5bWFwX3QpKTsKKwlpZiAoICEgdmdhX2tleW1hcCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybigtMSk7CisJfQorCWlmIChpb2N0bChmZCwgR0lPX0tFWU1BUCwgdmdhX2tleW1hcCkgPT0gLTEpIHsKKwkJU0RMX2ZyZWUodmdhX2tleW1hcCk7CisJCXZnYV9rZXltYXAgPSBOVUxMOworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBnZXQga2V5Ym9hcmQgbWFwIik7CisJCXJldHVybigtMSk7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2tleWJvYXJkKF9USElTKQoreworCVNETF9rZXlzeW0ga2V5c3ltOworCWludCBjLCBwcmVzc2VkLCBzY2FuY29kZTsKKworCXdoaWxlICgoYyA9IFZHTEtleWJvYXJkR2V0Q2goKSkgIT0gMCkgeworCQlzY2FuY29kZSA9IGMgJiAweDdGOworICAgICAgICAgICAgICAgIGlmIChjICYgMHg4MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3NlZCA9IFNETF9SRUxFQVNFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3NlZCA9IFNETF9QUkVTU0VEOworICAgICAgICAgICAgICAgIH0KKworCQlwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZChwcmVzc2VkLAorCQkJCSBUcmFuc2xhdGVLZXkoc2NhbmNvZGUsICZrZXlzeW0pKTsKKwl9Cit9CisKK2ludCBWR0xfaW5pdG1vdXNlKGludCBmZCkKK3sKKwltb3VzZWluZm8ub3BlcmF0aW9uID0gTU9VU0VfR0VUSU5GTzsKKwlpZiAoaW9jdGwoZmQsIENPTlNfTU9VU0VDVEwsICZtb3VzZWluZm8pICE9IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfbW91c2UoX1RISVMpCit7CisJY2hhciBidXR0b25zOworCWludCB4LCB5OworCWludCBidXR0b25fc3RhdGUsIHN0YXRlX2NoYW5nZWQsIHN0YXRlOworCWludCBpOworCisJaW9jdGwoMCwgQ09OU19NT1VTRUNUTCwgJm1vdXNlaW5mbyk7CisJeCA9IG1vdXNlaW5mby51LmRhdGEueDsKKwl5ID0gbW91c2VpbmZvLnUuZGF0YS55OworCWJ1dHRvbnMgPSBtb3VzZWluZm8udS5kYXRhLmJ1dHRvbnM7CisKKwlpZiAoKHggIT0gb2xkeCkgfHwgKHkgIT0gb2xkeSkpIHsKKwkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgeCwgeSk7CisJCW9sZHggPSB4OworCQlvbGR5ID0geTsKKwl9CisKKwkvKiBTZWUgd2hhdCdzIGNoYW5nZWQgKi8KKwlidXR0b25fc3RhdGUgPSBTRExfR2V0TW91c2VTdGF0ZShOVUxMLCBOVUxMKTsKKwlzdGF0ZV9jaGFuZ2VkID0gYnV0dG9uX3N0YXRlIF4gYnV0dG9uczsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChzdGF0ZV9jaGFuZ2VkICYgKDE8PGkpKSB7CisJCQlpZiAoYnV0dG9ucyAmICgxPDxpKSkgeworCQkJCXN0YXRlID0gU0RMX1BSRVNTRUQ7CisJCQl9IGVsc2UgeworCQkJCXN0YXRlID0gU0RMX1JFTEVBU0VEOworCQkJfQorCQkJcG9zdGVkICs9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oc3RhdGUsIGkgKyAxLCAwLCAwKTsKKwkJfQorCX0KK30KKwkKKwordm9pZCBWR0xfUHVtcEV2ZW50cyhfVEhJUykKK3sKKwlkbyB7CisJCXBvc3RlZCA9IDA7CisJCWhhbmRsZV9rZXlib2FyZCh0aGlzKTsKKwkJaGFuZGxlX21vdXNlKHRoaXMpOworCX0gd2hpbGUgKHBvc3RlZCAhPSAwKTsKK30KKwordm9pZCBWR0xfSW5pdE9TS2V5bWFwKF9USElTKQoreworCWludCBpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgQmVPUyBrZXkgdHJhbnNsYXRpb24gdGFibGUgKi8KKwlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShrZXltYXApOyArK2kgKQorCQlrZXltYXBbaV0gPSBTRExLX1VOS05PV047CisKKwlrZXltYXBbU0NBTkNPREVfRVNDQVBFXSA9IFNETEtfRVNDQVBFOworCWtleW1hcFtTQ0FOQ09ERV8xXSA9IFNETEtfMTsKKwlrZXltYXBbU0NBTkNPREVfMl0gPSBTRExLXzI7CisJa2V5bWFwW1NDQU5DT0RFXzNdID0gU0RMS18zOworCWtleW1hcFtTQ0FOQ09ERV80XSA9IFNETEtfNDsKKwlrZXltYXBbU0NBTkNPREVfNV0gPSBTRExLXzU7CisJa2V5bWFwW1NDQU5DT0RFXzZdID0gU0RMS182OworCWtleW1hcFtTQ0FOQ09ERV83XSA9IFNETEtfNzsKKwlrZXltYXBbU0NBTkNPREVfOF0gPSBTRExLXzg7CisJa2V5bWFwW1NDQU5DT0RFXzldID0gU0RMS185OworCWtleW1hcFtTQ0FOQ09ERV8wXSA9IFNETEtfMDsKKwlrZXltYXBbU0NBTkNPREVfTUlOVVNdID0gU0RMS19NSU5VUzsKKwlrZXltYXBbU0NBTkNPREVfRVFVQUxdID0gU0RMS19FUVVBTFM7CisJa2V5bWFwW1NDQU5DT0RFX0JBQ0tTUEFDRV0gPSBTRExLX0JBQ0tTUEFDRTsKKwlrZXltYXBbU0NBTkNPREVfVEFCXSA9IFNETEtfVEFCOworCWtleW1hcFtTQ0FOQ09ERV9RXSA9IFNETEtfcTsKKwlrZXltYXBbU0NBTkNPREVfV10gPSBTRExLX3c7CisJa2V5bWFwW1NDQU5DT0RFX0VdID0gU0RMS19lOworCWtleW1hcFtTQ0FOQ09ERV9SXSA9IFNETEtfcjsKKwlrZXltYXBbU0NBTkNPREVfVF0gPSBTRExLX3Q7CisJa2V5bWFwW1NDQU5DT0RFX1ldID0gU0RMS195OworCWtleW1hcFtTQ0FOQ09ERV9VXSA9IFNETEtfdTsKKwlrZXltYXBbU0NBTkNPREVfSV0gPSBTRExLX2k7CisJa2V5bWFwW1NDQU5DT0RFX09dID0gU0RMS19vOworCWtleW1hcFtTQ0FOQ09ERV9QXSA9IFNETEtfcDsKKwlrZXltYXBbU0NBTkNPREVfQlJBQ0tFVF9MRUZUXSA9IFNETEtfTEVGVEJSQUNLRVQ7CisJa2V5bWFwW1NDQU5DT0RFX0JSQUNLRVRfUklHSFRdID0gU0RMS19SSUdIVEJSQUNLRVQ7CisJa2V5bWFwW1NDQU5DT0RFX0VOVEVSXSA9IFNETEtfUkVUVVJOOworCWtleW1hcFtTQ0FOQ09ERV9MRUZUQ09OVFJPTF0gPSBTRExLX0xDVFJMOworCWtleW1hcFtTQ0FOQ09ERV9BXSA9IFNETEtfYTsKKwlrZXltYXBbU0NBTkNPREVfU10gPSBTRExLX3M7CisJa2V5bWFwW1NDQU5DT0RFX0RdID0gU0RMS19kOworCWtleW1hcFtTQ0FOQ09ERV9GXSA9IFNETEtfZjsKKwlrZXltYXBbU0NBTkNPREVfR10gPSBTRExLX2c7CisJa2V5bWFwW1NDQU5DT0RFX0hdID0gU0RMS19oOworCWtleW1hcFtTQ0FOQ09ERV9KXSA9IFNETEtfajsKKwlrZXltYXBbU0NBTkNPREVfS10gPSBTRExLX2s7CisJa2V5bWFwW1NDQU5DT0RFX0xdID0gU0RMS19sOworCWtleW1hcFtTQ0FOQ09ERV9TRU1JQ09MT05dID0gU0RMS19TRU1JQ09MT047CisJa2V5bWFwW1NDQU5DT0RFX0FQT1NUUk9QSEVdID0gU0RMS19RVU9URTsKKwlrZXltYXBbU0NBTkNPREVfR1JBVkVdID0gU0RMS19CQUNLUVVPVEU7CisJa2V5bWFwW1NDQU5DT0RFX0xFRlRTSElGVF0gPSBTRExLX0xTSElGVDsKKwlrZXltYXBbU0NBTkNPREVfQkFDS1NMQVNIXSA9IFNETEtfQkFDS1NMQVNIOworCWtleW1hcFtTQ0FOQ09ERV9aXSA9IFNETEtfejsKKwlrZXltYXBbU0NBTkNPREVfWF0gPSBTRExLX3g7CisJa2V5bWFwW1NDQU5DT0RFX0NdID0gU0RMS19jOworCWtleW1hcFtTQ0FOQ09ERV9WXSA9IFNETEtfdjsKKwlrZXltYXBbU0NBTkNPREVfQl0gPSBTRExLX2I7CisJa2V5bWFwW1NDQU5DT0RFX05dID0gU0RMS19uOworCWtleW1hcFtTQ0FOQ09ERV9NXSA9IFNETEtfbTsKKwlrZXltYXBbU0NBTkNPREVfQ09NTUFdID0gU0RMS19DT01NQTsKKwlrZXltYXBbU0NBTkNPREVfUEVSSU9EXSA9IFNETEtfUEVSSU9EOworCWtleW1hcFtTQ0FOQ09ERV9TTEFTSF0gPSBTRExLX1NMQVNIOworCWtleW1hcFtTQ0FOQ09ERV9SSUdIVFNISUZUXSA9IFNETEtfUlNISUZUOworCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURNVUxUSVBMWV0gPSBTRExLX0tQX01VTFRJUExZOworCWtleW1hcFtTQ0FOQ09ERV9MRUZUQUxUXSA9IFNETEtfTEFMVDsKKwlrZXltYXBbU0NBTkNPREVfU1BBQ0VdID0gU0RMS19TUEFDRTsKKwlrZXltYXBbU0NBTkNPREVfQ0FQU0xPQ0tdID0gU0RMS19DQVBTTE9DSzsKKwlrZXltYXBbU0NBTkNPREVfRjFdID0gU0RMS19GMTsKKwlrZXltYXBbU0NBTkNPREVfRjJdID0gU0RMS19GMjsKKwlrZXltYXBbU0NBTkNPREVfRjNdID0gU0RMS19GMzsKKwlrZXltYXBbU0NBTkNPREVfRjRdID0gU0RMS19GNDsKKwlrZXltYXBbU0NBTkNPREVfRjVdID0gU0RMS19GNTsKKwlrZXltYXBbU0NBTkNPREVfRjZdID0gU0RMS19GNjsKKwlrZXltYXBbU0NBTkNPREVfRjddID0gU0RMS19GNzsKKwlrZXltYXBbU0NBTkNPREVfRjhdID0gU0RMS19GODsKKwlrZXltYXBbU0NBTkNPREVfRjldID0gU0RMS19GOTsKKwlrZXltYXBbU0NBTkNPREVfRjEwXSA9IFNETEtfRjEwOworCWtleW1hcFtTQ0FOQ09ERV9OVU1MT0NLXSA9IFNETEtfTlVNTE9DSzsKKwlrZXltYXBbU0NBTkNPREVfU0NST0xMTE9DS10gPSBTRExLX1NDUk9MTE9DSzsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEN10gPSBTRExLX0tQNzsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SVVBMRUZUXSA9IFNETEtfS1A3OworCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQ4XSA9IFNETEtfS1A4OworCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JVUF0gPSBTRExLX0tQODsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEOV0gPSBTRExLX0tQOTsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SVVBSSUdIVF0gPSBTRExLX0tQOTsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFETUlOVVNdID0gU0RMS19LUF9NSU5VUzsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFENF0gPSBTRExLX0tQNDsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09STEVGVF0gPSBTRExLX0tQNDsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFENV0gPSBTRExLX0tQNTsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFENl0gPSBTRExLX0tQNjsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SUklHSFRdID0gU0RMS19LUDY7CisJa2V5bWFwW1NDQU5DT0RFX0tFWVBBRFBMVVNdID0gU0RMS19LUF9QTFVTOworCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQxXSA9IFNETEtfS1AxOworCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JET1dOTEVGVF0gPSBTRExLX0tQMTsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEMl0gPSBTRExLX0tQMjsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SRE9XTl0gPSBTRExLX0tQMjsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFEM10gPSBTRExLX0tQMzsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SRE9XTlJJR0hUXSA9IFNETEtfS1AzOworCWtleW1hcFtTQ0FOQ09ERV9LRVlQQUQwXSA9IFNETEtfS1AwOworCWtleW1hcFtTQ0FOQ09ERV9LRVlQQURQRVJJT0RdID0gU0RMS19LUF9QRVJJT0Q7CisJa2V5bWFwW1NDQU5DT0RFX0xFU1NdID0gU0RMS19MRVNTOworCWtleW1hcFtTQ0FOQ09ERV9GMTFdID0gU0RMS19GMTE7CisJa2V5bWFwW1NDQU5DT0RFX0YxMl0gPSBTRExLX0YxMjsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFERU5URVJdID0gU0RMS19LUF9FTlRFUjsKKwlrZXltYXBbU0NBTkNPREVfUklHSFRDT05UUk9MXSA9IFNETEtfUkNUUkw7CisJa2V5bWFwW1NDQU5DT0RFX0NPTlRST0xdID0gU0RMS19SQ1RSTDsKKwlrZXltYXBbU0NBTkNPREVfS0VZUEFERElWSURFXSA9IFNETEtfS1BfRElWSURFOworCWtleW1hcFtTQ0FOQ09ERV9QUklOVFNDUkVFTl0gPSBTRExLX1BSSU5UOworCWtleW1hcFtTQ0FOQ09ERV9SSUdIVEFMVF0gPSBTRExLX1JBTFQ7CisJa2V5bWFwW1NDQU5DT0RFX0JSRUFLXSA9IFNETEtfQlJFQUs7CisJa2V5bWFwW1NDQU5DT0RFX0JSRUFLX0FMVEVSTkFUSVZFXSA9IFNETEtfVU5LTk9XTjsKKwlrZXltYXBbU0NBTkNPREVfSE9NRV0gPSBTRExLX0hPTUU7CisJa2V5bWFwW1NDQU5DT0RFX0NVUlNPUkJMT0NLVVBdID0gU0RMS19VUDsKKwlrZXltYXBbU0NBTkNPREVfUEFHRVVQXSA9IFNETEtfUEFHRVVQOworCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JCTE9DS0xFRlRdID0gU0RMS19MRUZUOworCWtleW1hcFtTQ0FOQ09ERV9DVVJTT1JCTE9DS1JJR0hUXSA9IFNETEtfUklHSFQ7CisJa2V5bWFwW1NDQU5DT0RFX0VORF0gPSBTRExLX0VORDsKKwlrZXltYXBbU0NBTkNPREVfQ1VSU09SQkxPQ0tET1dOXSA9IFNETEtfRE9XTjsKKwlrZXltYXBbU0NBTkNPREVfUEFHRURPV05dID0gU0RMS19QQUdFRE9XTjsKKwlrZXltYXBbU0NBTkNPREVfSU5TRVJUXSA9IFNETEtfSU5TRVJUOworCWtleW1hcFtTQ0FOQ09ERV9SRU1PVkVdID0gU0RMS19ERUxFVEU7CisJa2V5bWFwWzExOV0gPSBTRExLX1BBVVNFOworCWtleW1hcFtTQ0FOQ09ERV9SSUdIVFdJTl0gPSBTRExLX1JTVVBFUjsKKwlrZXltYXBbU0NBTkNPREVfTEVGVFdJTl0gPSBTRExLX0xTVVBFUjsKKwlrZXltYXBbMTI3XSA9IFNETEtfTUVOVTsKK30KKworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShpbnQgc2NhbmNvZGUsIFNETF9rZXlzeW0gKmtleXN5bSkKK3sKKwkvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLworCWtleXN5bS0+c2NhbmNvZGUgPSBzY2FuY29kZTsKKwlrZXlzeW0tPnN5bSA9IGtleW1hcFtzY2FuY29kZV07CisJa2V5c3ltLT5tb2QgPSBLTU9EX05PTkU7CisKKwkvKiBJZiBVTklDT0RFIGlzIG9uLCBnZXQgdGhlIFVOSUNPREUgdmFsdWUgZm9yIHRoZSBrZXkgKi8KKwlrZXlzeW0tPnVuaWNvZGUgPSAwOworCWlmICggU0RMX1RyYW5zbGF0ZVVOSUNPREUgJiYgdmdhX2tleW1hcCApIHsKKwkJaW50IG1hcDsKKwkJU0RMTW9kIG1vZHN0YXRlOworCisJCW1vZHN0YXRlID0gU0RMX0dldE1vZFN0YXRlKCk7CisJCW1hcCA9IDA7CisJCWlmICggbW9kc3RhdGUgJiBLTU9EX1NISUZUICkgeworCQkJbWFwICs9IDE7CisJCX0KKwkJaWYgKCBtb2RzdGF0ZSAmIEtNT0RfQ1RSTCApIHsKKwkJCW1hcCArPSAyOworCQl9CisJCWlmICggbW9kc3RhdGUgJiBLTU9EX0FMVCApIHsKKwkJCW1hcCArPSA0OworCQl9CisJCWlmICggISh2Z2Ffa2V5bWFwLT5rZXlbc2NhbmNvZGVdLnNwY2wgJiAoMHg4MCA+PiBtYXApKSApIHsKKwkJCWtleXN5bS0+dW5pY29kZSA9IHZnYV9rZXltYXAtPmtleVtzY2FuY29kZV0ubWFwW21hcF07CisJCX0KKworCX0KKwlyZXR1cm4oa2V5c3ltKTsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby92Z2wvU0RMX3ZnbGV2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTRjYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby92Z2wvU0RMX3ZnbGV2ZW50c19jLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3ZnbHZpZGVvLmgiCisKKy8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFNETF9zeXNldmVudHMuYyB0byBvdGhlciBwYXJ0cyAKKyAgIG9mIHRoZSBuYXRpdmUgdmlkZW8gc3Vic3lzdGVtIChTRExfc3lzdmlkZW8uYykKKyovCitleHRlcm4gaW50IFZHTF9pbml0a2V5bWFwcyhpbnQgZmQpOworZXh0ZXJuIGludCBWR0xfaW5pdG1vdXNlKGludCBmZCk7CitleHRlcm4gdm9pZCBWR0xfa2V5Ym9hcmRjYWxsYmFjayhpbnQgc2NhbmNvZGUsIGludCBwcmVzc2VkKTsKKworZXh0ZXJuIHZvaWQgVkdMX0luaXRPU0tleW1hcChfVEhJUyk7CitleHRlcm4gdm9pZCBWR0xfUHVtcEV2ZW50cyhfVEhJUyk7CisKKy8qIE1vdXNlIGJ1dHRvbnMgKi8KKyNkZWZpbmUgTU9VU0VfTEVGVEJVVFRPTiAgICAgICAgMHgwMQorI2RlZmluZSBNT1VTRV9NSURETEVCVVRUT04gICAgICAweDAyCisjZGVmaW5lIE1PVVNFX1JJR0hUQlVUVE9OICAgICAgIDB4MDQKKworLyogU2NhbmNvZGVzICovCisjZGVmaW5lIFNDQU5DT0RFX0VTQ0FQRQkJCTEKKyNkZWZpbmUgU0NBTkNPREVfMQkJCTIKKyNkZWZpbmUgU0NBTkNPREVfMgkJCTMKKyNkZWZpbmUgU0NBTkNPREVfMwkJCTQKKyNkZWZpbmUgU0NBTkNPREVfNAkJCTUKKyNkZWZpbmUgU0NBTkNPREVfNQkJCTYKKyNkZWZpbmUgU0NBTkNPREVfNgkJCTcKKyNkZWZpbmUgU0NBTkNPREVfNwkJCTgKKyNkZWZpbmUgU0NBTkNPREVfOAkJCTkKKyNkZWZpbmUgU0NBTkNPREVfOQkJCTEwCisjZGVmaW5lIFNDQU5DT0RFXzAJCQkxMQorI2RlZmluZSBTQ0FOQ09ERV9NSU5VUwkJCTEyCisjZGVmaW5lIFNDQU5DT0RFX0VRVUFMCQkJMTMKKyNkZWZpbmUgU0NBTkNPREVfQkFDS1NQQUNFCQkxNAorI2RlZmluZSBTQ0FOQ09ERV9UQUIJCQkxNQorI2RlZmluZSBTQ0FOQ09ERV9RCQkJMTYKKyNkZWZpbmUgU0NBTkNPREVfVwkJCTE3CisjZGVmaW5lIFNDQU5DT0RFX0UJCQkxOAorI2RlZmluZSBTQ0FOQ09ERV9SCQkJMTkKKyNkZWZpbmUgU0NBTkNPREVfVAkJCTIwCisjZGVmaW5lIFNDQU5DT0RFX1kJCQkyMQorI2RlZmluZSBTQ0FOQ09ERV9VCQkJMjIKKyNkZWZpbmUgU0NBTkNPREVfSQkJCTIzCisjZGVmaW5lIFNDQU5DT0RFX08JCQkyNAorI2RlZmluZSBTQ0FOQ09ERV9QCQkJMjUKKyNkZWZpbmUgU0NBTkNPREVfQlJBQ0tFVF9MRUZUCQkyNgorI2RlZmluZSBTQ0FOQ09ERV9CUkFDS0VUX1JJR0hUCQkyNworI2RlZmluZSBTQ0FOQ09ERV9FTlRFUgkJCTI4CisjZGVmaW5lIFNDQU5DT0RFX0xFRlRDT05UUk9MCQkyOQorI2RlZmluZSBTQ0FOQ09ERV9BCQkJMzAKKyNkZWZpbmUgU0NBTkNPREVfUwkJCTMxCisjZGVmaW5lIFNDQU5DT0RFX0QJCQkzMgorI2RlZmluZSBTQ0FOQ09ERV9GCQkJMzMKKyNkZWZpbmUgU0NBTkNPREVfRwkJCTM0CisjZGVmaW5lIFNDQU5DT0RFX0gJCQkzNQorI2RlZmluZSBTQ0FOQ09ERV9KCQkJMzYKKyNkZWZpbmUgU0NBTkNPREVfSwkJCTM3CisjZGVmaW5lIFNDQU5DT0RFX0wJCQkzOAorI2RlZmluZSBTQ0FOQ09ERV9TRU1JQ09MT04JCTM5CisjZGVmaW5lIFNDQU5DT0RFX0FQT1NUUk9QSEUJCTQwCisjZGVmaW5lIFNDQU5DT0RFX0dSQVZFCQkJNDEKKyNkZWZpbmUgU0NBTkNPREVfTEVGVFNISUZUCQk0MgorI2RlZmluZSBTQ0FOQ09ERV9CQUNLU0xBU0gJCTQzCisjZGVmaW5lIFNDQU5DT0RFX1oJCQk0NAorI2RlZmluZSBTQ0FOQ09ERV9YCQkJNDUKKyNkZWZpbmUgU0NBTkNPREVfQwkJCTQ2CisjZGVmaW5lIFNDQU5DT0RFX1YJCQk0NworI2RlZmluZSBTQ0FOQ09ERV9CCQkJNDgKKyNkZWZpbmUgU0NBTkNPREVfTgkJCTQ5CisjZGVmaW5lIFNDQU5DT0RFX00JCQk1MAorI2RlZmluZSBTQ0FOQ09ERV9DT01NQQkJCTUxCisjZGVmaW5lIFNDQU5DT0RFX1BFUklPRAkJCTUyCisjZGVmaW5lIFNDQU5DT0RFX1NMQVNICQkJNTMKKyNkZWZpbmUgU0NBTkNPREVfUklHSFRTSElGVAkJNTQKKyNkZWZpbmUgU0NBTkNPREVfS0VZUEFETVVMVElQTFkJCTU1CisjZGVmaW5lIFNDQU5DT0RFX0xFRlRBTFQJCTU2CisjZGVmaW5lIFNDQU5DT0RFX1NQQUNFCQkJNTcKKyNkZWZpbmUgU0NBTkNPREVfQ0FQU0xPQ0sJCTU4CisjZGVmaW5lIFNDQU5DT0RFX0YxCQkJNTkKKyNkZWZpbmUgU0NBTkNPREVfRjIJCQk2MAorI2RlZmluZSBTQ0FOQ09ERV9GMwkJCTYxCisjZGVmaW5lIFNDQU5DT0RFX0Y0CQkJNjIKKyNkZWZpbmUgU0NBTkNPREVfRjUJCQk2MworI2RlZmluZSBTQ0FOQ09ERV9GNgkJCTY0CisjZGVmaW5lIFNDQU5DT0RFX0Y3CQkJNjUKKyNkZWZpbmUgU0NBTkNPREVfRjgJCQk2NgorI2RlZmluZSBTQ0FOQ09ERV9GOQkJCTY3CisjZGVmaW5lIFNDQU5DT0RFX0YxMAkJCTY4CisjZGVmaW5lIFNDQU5DT0RFX05VTUxPQ0sJCTY5CisjZGVmaW5lIFNDQU5DT0RFX1NDUk9MTExPQ0sJCTcwCisjZGVmaW5lIFNDQU5DT0RFX0tFWVBBRDcJCTcxCisjZGVmaW5lIFNDQU5DT0RFX0NVUlNPUlVQTEVGVAkJNzEKKyNkZWZpbmUgU0NBTkNPREVfS0VZUEFEOAkJNzIKKyNkZWZpbmUgU0NBTkNPREVfQ1VSU09SVVAJCTcyCisjZGVmaW5lIFNDQU5DT0RFX0tFWVBBRDkJCTczCisjZGVmaW5lIFNDQU5DT0RFX0NVUlNPUlVQUklHSFQJCTczCisjZGVmaW5lIFNDQU5DT0RFX0tFWVBBRE1JTlVTCQk3NAorI2RlZmluZSBTQ0FOQ09ERV9LRVlQQUQ0CQk3NQorI2RlZmluZSBTQ0FOQ09ERV9DVVJTT1JMRUZUCQk3NQorI2RlZmluZSBTQ0FOQ09ERV9LRVlQQUQ1CQk3NgorI2RlZmluZSBTQ0FOQ09ERV9LRVlQQUQ2CQk3NworI2RlZmluZSBTQ0FOQ09ERV9DVVJTT1JSSUdIVAkJNzcKKyNkZWZpbmUgU0NBTkNPREVfS0VZUEFEUExVUwkJNzgKKyNkZWZpbmUgU0NBTkNPREVfS0VZUEFEMQkJNzkKKyNkZWZpbmUgU0NBTkNPREVfQ1VSU09SRE9XTkxFRlQJCTc5CisjZGVmaW5lIFNDQU5DT0RFX0tFWVBBRDIJCTgwCisjZGVmaW5lIFNDQU5DT0RFX0NVUlNPUkRPV04JCTgwCisjZGVmaW5lIFNDQU5DT0RFX0tFWVBBRDMJCTgxCisjZGVmaW5lIFNDQU5DT0RFX0NVUlNPUkRPV05SSUdIVAk4MQorI2RlZmluZSBTQ0FOQ09ERV9LRVlQQUQwCQk4MgorI2RlZmluZSBTQ0FOQ09ERV9LRVlQQURQRVJJT0QJCTgzCisjZGVmaW5lIFNDQU5DT0RFX0xFU1MJCQk4NgorI2RlZmluZSBTQ0FOQ09ERV9GMTEJCQk4NworI2RlZmluZSBTQ0FOQ09ERV9GMTIJCQk4OAorI2RlZmluZSBTQ0FOQ09ERV9LRVlQQURFTlRFUgkJODkKKyNkZWZpbmUgU0NBTkNPREVfUklHSFRDT05UUk9MCQk5MAorI2RlZmluZSBTQ0FOQ09ERV9DT05UUk9MCQkxMDcKKyNkZWZpbmUgU0NBTkNPREVfS0VZUEFERElWSURFCQk5MQorI2RlZmluZSBTQ0FOQ09ERV9QUklOVFNDUkVFTgkJOTIKKyNkZWZpbmUgU0NBTkNPREVfUklHSFRBTFQJCTkzCisjZGVmaW5lIFNDQU5DT0RFX0JSRUFLCQkJMTA0CS8qIEJld2FyZTogaXMgMTE5ICAgICAqLworI2RlZmluZSBTQ0FOQ09ERV9CUkVBS19BTFRFUk5BVElWRQkxMDQJLyogb24gc29tZSBrZXlib2FyZHMhICovCisjZGVmaW5lIFNDQU5DT0RFX0hPTUUJCQk5NAorI2RlZmluZSBTQ0FOQ09ERV9DVVJTT1JCTE9DS1VQCQk5NQkvKiBDdXJzb3Iga2V5IGJsb2NrICovCisjZGVmaW5lIFNDQU5DT0RFX1BBR0VVUAkJCTk2CisjZGVmaW5lIFNDQU5DT0RFX0NVUlNPUkJMT0NLTEVGVAk5NwkvKiBDdXJzb3Iga2V5IGJsb2NrICovCisjZGVmaW5lIFNDQU5DT0RFX0NVUlNPUkJMT0NLUklHSFQJOTgJLyogQ3Vyc29yIGtleSBibG9jayAqLworI2RlZmluZSBTQ0FOQ09ERV9FTkQJCQk5OQorI2RlZmluZSBTQ0FOQ09ERV9DVVJTT1JCTE9DS0RPV04JMTAwCS8qIEN1cnNvciBrZXkgYmxvY2sgKi8KKyNkZWZpbmUgU0NBTkNPREVfUEFHRURPV04JCTEwMQorI2RlZmluZSBTQ0FOQ09ERV9JTlNFUlQJCQkxMDIKKyNkZWZpbmUgU0NBTkNPREVfUkVNT1ZFCQkJMTAzCisjZGVmaW5lIFNDQU5DT0RFX1JJR0hUV0lOCQkxMDYKKyNkZWZpbmUgU0NBTkNPREVfTEVGVFdJTgkJMTA1CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vdmdsL1NETF92Z2xtb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmYxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsbW91c2UuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfdmdsdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfdmdsbW91c2VfYy5oIgorCisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgZGF0YSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGN1cnNvciAqLworc3RydWN0IFdNY3Vyc29yIHsKKwlpbnQgdW51c2VkOworfTsKKworCit2b2lkIFZHTF9GcmVlV01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCit7CisJcmV0dXJuOworfQorCitXTWN1cnNvciAqVkdMX0NyZWF0ZVdNQ3Vyc29yKF9USElTLAorCQlVaW50OCAqZGF0YSwgVWludDggKm1hc2ssIGludCB3LCBpbnQgaCwgaW50IGhvdF94LCBpbnQgaG90X3kpCit7CisJcmV0dXJuKE5VTEwpOworfQorCitpbnQgVkdMX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKK3sKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgVkdMX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KQoreworCVNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgeCwgeSk7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vdmdsL1NETF92Z2xtb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsbW91c2VfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NzlkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsbW91c2VfYy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3ZnbHZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgVkdMX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gV01jdXJzb3IgKlZHTF9DcmVhdGVXTUN1cnNvcihfVEhJUywKKwkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKK2V4dGVybiBpbnQgVkdMX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gdm9pZCBWR0xfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpOworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsdmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vdmdsL1NETF92Z2x2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjE2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsdmlkZW8uYwpAQCAtMCwwICsxLDYyNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIGxpYnZnYSBiYXNlZCBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGVyci5oPgorI2luY2x1ZGUgPG9zcmVsZGF0ZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxzeXMvZmJpby5oPgorI2luY2x1ZGUgPHN5cy9jb25zaW8uaD4KKyNpbmNsdWRlIDxzeXMva2Jpby5oPgorI2luY2x1ZGUgPHZnbC5oPgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF92Z2x2aWRlby5oIgorI2luY2x1ZGUgIlNETF92Z2xldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF92Z2xtb3VzZV9jLmgiCisKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IFZHTF9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipWR0xfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBTRExfU3VyZmFjZSAqVkdMX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgVkdMX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAorCQkJICBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBWR0xfVmlkZW9RdWl0KF9USElTKTsKKworLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgVkdMX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IFZHTF9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IFZHTF9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBWR0xfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBWR0xfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKiBNaXNjIGZ1bmN0aW9uICovCitzdGF0aWMgVkdMTW9kZSAqKiBWR0xMaXN0TW9kZXMoaW50IGRlcHRoLCBpbnQgbWVtX21vZGVsKTsKKworLyogVkdMIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgVkdMX0F2YWlsYWJsZSh2b2lkKQoreworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSByb290IGFuZCBzdGRpbiBpcyBhCisJICogdmlydHVhbCBjb25zb2xlLiBBbHNvIHRyeSB0byBlbnN1cmUgdGhhdAorCSAqIG1vZGVzIG90aGVyIHRoYW4gMzIweDIwMCBhcmUgYXZhaWxhYmxlCisJICovCisJaW50IGNvbnNvbGUsIGhpcmVzX2F2YWlsYWJsZSwgaTsKKwlWR0xNb2RlICoqbW9kZXM7CisKKwljb25zb2xlID0gU1RESU5fRklMRU5POworCWlmICggY29uc29sZSA+PSAwICkgeworCQlzdHJ1Y3Qgc3RhdCBzYjsKKwkJc3RydWN0IHZ0X21vZGUgZHVtbXk7CisKKwkJaWYgKCAoZnN0YXQoY29uc29sZSwgJnNiKSA8IDApIHx8CisJCSAgICAgKGlvY3RsKGNvbnNvbGUsIFZUX0dFVE1PREUsICZkdW1teSkgPCAwKSApIHsKKwkJCWNvbnNvbGUgPSAtMTsKKwkJfQorCX0KKwlpZiAoZ2V0ZXVpZCgpICE9IDAgJiYgY29uc29sZSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwltb2RlcyA9IFZHTExpc3RNb2Rlcyg4LCBWX0lORk9fTU1fRElSRUNUIHwgVl9JTkZPX01NX1BBQ0tFRCk7CisJaGlyZXNfYXZhaWxhYmxlID0gMDsKKwlmb3IgKGkgPSAwOyBtb2Rlc1tpXSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKChtb2Rlc1tpXS0+TW9kZUluZm8uWHNpemUgPiAzMjApICYmCisJCSAgICAobW9kZXNbaV0tPk1vZGVJbmZvLllzaXplID4gMjAwKSAmJgorCQkgICAgKChtb2Rlc1tpXS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUY4KSB8fAorCQkgICAgIChtb2Rlc1tpXS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUYxNikgfHwKKwkJICAgICAobW9kZXNbaV0tPk1vZGVJbmZvLlR5cGUgPT0gVklEQlVGMzIpKSkgeworCQkJaGlyZXNfYXZhaWxhYmxlID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBoaXJlc19hdmFpbGFibGU7Cit9CisKK3N0YXRpYyB2b2lkIFZHTF9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCit7CisJU0RMX2ZyZWUoZGV2aWNlLT5oaWRkZW4pOworCVNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKlZHTF9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7CisJaWYgKCBkZXZpY2UgKSB7CisJCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKKwkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCisJCQkJICBTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisJfQorCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIGRldmljZSApIHsKKwkJCVNETF9mcmVlKGRldmljZSk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCWRldmljZS0+VmlkZW9Jbml0ID0gVkdMX1ZpZGVvSW5pdDsKKwlkZXZpY2UtPkxpc3RNb2RlcyA9IFZHTF9MaXN0TW9kZXM7CisJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBWR0xfU2V0VmlkZW9Nb2RlOworCWRldmljZS0+U2V0Q29sb3JzID0gVkdMX1NldENvbG9yczsKKwlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IFZHTF9WaWRlb1F1aXQ7CisJZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IFZHTF9BbGxvY0hXU3VyZmFjZTsKKwlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gTlVMTDsKKwlkZXZpY2UtPkZpbGxIV1JlY3QgPSBOVUxMOworCWRldmljZS0+U2V0SFdDb2xvcktleSA9IE5VTEw7CisJZGV2aWNlLT5TZXRIV0FscGhhID0gTlVMTDsKKwlkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBWR0xfTG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPlVubG9ja0hXU3VyZmFjZSA9IFZHTF9VbmxvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gVkdMX0ZsaXBIV1N1cmZhY2U7CisJZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gVkdMX0ZyZWVIV1N1cmZhY2U7CisJZGV2aWNlLT5TZXRJY29uID0gTlVMTDsKKwlkZXZpY2UtPlNldENhcHRpb24gPSBOVUxMOworCWRldmljZS0+R2V0V01JbmZvID0gTlVMTDsKKwlkZXZpY2UtPkZyZWVXTUN1cnNvciA9IFZHTF9GcmVlV01DdXJzb3I7CisJZGV2aWNlLT5DcmVhdGVXTUN1cnNvciA9IFZHTF9DcmVhdGVXTUN1cnNvcjsKKwlkZXZpY2UtPlNob3dXTUN1cnNvciA9IFZHTF9TaG93V01DdXJzb3I7CisJZGV2aWNlLT5XYXJwV01DdXJzb3IgPSBWR0xfV2FycFdNQ3Vyc29yOworCWRldmljZS0+SW5pdE9TS2V5bWFwID0gVkdMX0luaXRPU0tleW1hcDsKKwlkZXZpY2UtPlB1bXBFdmVudHMgPSBWR0xfUHVtcEV2ZW50czsKKworCWRldmljZS0+ZnJlZSA9IFZHTF9EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBWR0xfYm9vdHN0cmFwID0geworCSJ2Z2wiLCAiRnJlZUJTRCBsaWJWR0wiLAorCVZHTF9BdmFpbGFibGUsIFZHTF9DcmVhdGVEZXZpY2UKK307CisKK3N0YXRpYyBpbnQgVkdMX0FkZE1vZGUoX1RISVMsIFZHTE1vZGUgKmlubW9kZSkKK3sKKwlTRExfUmVjdCAqbW9kZTsKKworCWludCBpLCBpbmRleDsKKwlpbnQgbmV4dF9tb2RlOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIG1vZGUgKi8KKwlpZiAoaW5tb2RlLT5EZXB0aCA8IDgpIHsgIC8qIE5vdCBzdXBwb3J0ZWQgKi8KKwkJcmV0dXJuIDA7CisJfQorCWluZGV4ID0gKChpbm1vZGUtPkRlcHRoICsgNykgLyA4KSAtIDE7CisJZm9yIChpPTA7IGk8U0RMX251bW1vZGVzW2luZGV4XTsgKytpKSB7CisJCW1vZGUgPSBTRExfbW9kZWxpc3RbaW5kZXhdW2ldOworCQlpZiAoKG1vZGUtPncgPT0gaW5tb2RlLT5Nb2RlSW5mby5Yc2l6ZSkgJiYKKwkJICAgIChtb2RlLT5oID09IGlubW9kZS0+TW9kZUluZm8uWXNpemUpKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogU2V0IHVwIHRoZSBuZXcgdmlkZW8gbW9kZSByZWN0YW5nbGUgKi8KKwltb2RlID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YgKm1vZGUpOworCWlmIChtb2RlID09IE5VTEwpIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybiAtMTsKKwl9CisJbW9kZS0+eCA9IDA7CisJbW9kZS0+eSA9IDA7CisJbW9kZS0+dyA9IGlubW9kZS0+TW9kZUluZm8uWHNpemU7CisJbW9kZS0+aCA9IGlubW9kZS0+TW9kZUluZm8uWXNpemU7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IGxpc3Qgb2YgbW9kZXMsIGFuZCBmaWxsIGluIHRoZSBuZXcgbW9kZSAqLworCW5leHRfbW9kZSA9IFNETF9udW1tb2Rlc1tpbmRleF07CisJU0RMX21vZGVsaXN0W2luZGV4XSA9IChTRExfUmVjdCAqKikKKwkJU0RMX3JlYWxsb2MoU0RMX21vZGVsaXN0W2luZGV4XSwgKDErbmV4dF9tb2RlKzEpKnNpemVvZihTRExfUmVjdCAqKSk7CisJaWYgKFNETF9tb2RlbGlzdFtpbmRleF0gPT0gTlVMTCkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJU0RMX251bW1vZGVzW2luZGV4XSA9IDA7CisJCVNETF9mcmVlKG1vZGUpOworCQlyZXR1cm4gLTE7CisJfQorCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlXSA9IG1vZGU7CisJU0RMX21vZGVsaXN0W2luZGV4XVtuZXh0X21vZGUrMV0gPSBOVUxMOworCVNETF9udW1tb2Rlc1tpbmRleF0rKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBWR0xfVXBkYXRlVmlkZW9JbmZvKF9USElTKQoreworCXRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMDsKKwl0aGlzLT5pbmZvLmh3X2F2YWlsYWJsZSA9IDE7CisJdGhpcy0+aW5mby52aWRlb19tZW0gPSAwOworCWlmIChWR0xDdXJNb2RlID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoVkdMQ3VyTW9kZS0+TW9kZUluZm8uUGl4ZWxCeXRlcyA+IDApIHsKKwkJdGhpcy0+aW5mby52aWRlb19tZW0gPSBWR0xDdXJNb2RlLT5Nb2RlSW5mby5QaXhlbEJ5dGVzICoKKwkJCQkgICAgICAgVkdMQ3VyTW9kZS0+TW9kZUluZm8uWHNpemUgKgorCQkJCSAgICAgICBWR0xDdXJNb2RlLT5Nb2RlSW5mby5Zc2l6ZTsKKwl9Cit9CisKK2ludCBWR0xfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisJaW50IGk7CisJaW50IHRvdGFsX21vZGVzOworCVZHTE1vZGUgKiptb2RlczsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKKwkJU0RMX251bW1vZGVzW2ldID0gMDsKKwkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKKwl9CisKKwkvKiBFbmFibGUgbW91c2UgYW5kIGtleWJvYXJkIHN1cHBvcnQgKi8KKwlpZiAoU0RMX2dldGVudigiU0RMX05PX1JBV0tCRCIpID09IE5VTEwpIHsKKwkJaWYgKFZHTEtleWJvYXJkSW5pdChWR0xfQ09ERUtFWVMpICE9IDApIHsKKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUga2V5Ym9hcmQiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSB7CisJCXdhcm54KCJSZXF1aWVzdCB0byBwdXQga2V5Ym9hcmQgaW50byBhIHJhdyBtb2RlIGlnbm9yZWQiKTsKKwl9CisJaWYgKFZHTF9pbml0a2V5bWFwcyhTVERJTl9GSUxFTk8pICE9IDApIHsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBrZXltYXAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoVkdMX2luaXRtb3VzZShTVERJTl9GSUxFTk8pICE9IDApIHsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBtb3VzZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCisJaWYgKFZHTEN1ck1vZGUgIT0gTlVMTCkgeworCQl0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IFZHTEN1ck1vZGUtPk1vZGVJbmZvLlhzaXplOworCQl0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IFZHTEN1ck1vZGUtPk1vZGVJbmZvLllzaXplOworCX0KKworCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICovCisJaWYgKFZHTEN1ck1vZGUgIT0gTlVMTCkKKwkJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gVkdMQ3VyTW9kZS0+RGVwdGg7CisJZWxzZQorCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSAxNjsJLyogR29vZCBkZWZhdWx0ICovCisKKwkvKiBRdWVyeSBmb3IgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHZpZGVvIG1vZGVzICovCisJdG90YWxfbW9kZXMgPSAwOworCW1vZGVzID0gVkdMTGlzdE1vZGVzKC0xLCBWX0lORk9fTU1fRElSRUNUIHwgVl9JTkZPX01NX1BBQ0tFRCk7CisJZm9yIChpID0gMDsgbW9kZXNbaV0gIT0gTlVMTDsgaSsrKSB7CisJCWlmICgobW9kZXNbaV0tPk1vZGVJbmZvLlR5cGUgPT0gVklEQlVGOCkgfHwKKwkJICAgIChtb2Rlc1tpXS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUYxNikgfHwKKwkJICAgIChtb2Rlc1tpXS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUYzMikpIHsKKwkJCVZHTF9BZGRNb2RlKHRoaXMsIG1vZGVzW2ldKTsKKwkJCXRvdGFsX21vZGVzKys7CisJCX0KKwl9CisJaWYgKHRvdGFsX21vZGVzID09IDApIHsKKwkJU0RMX1NldEVycm9yKCJObyBsaW5lYXIgdmlkZW8gbW9kZXMgYXZhaWxhYmxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBGaWxsIGluIG91ciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gY2FwYWJpbGl0aWVzICovCisJVkdMX1VwZGF0ZVZpZGVvSW5mbyh0aGlzKTsKKworCS8qIENyZWF0ZSB0aGUgaGFyZHdhcmUgc3VyZmFjZSBsb2NrIG11dGV4ICovCisJaHdfbG9jayA9IFNETF9DcmVhdGVNdXRleCgpOworCWlmIChod19sb2NrID09IE5VTEwpIHsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGxvY2sgbXV0ZXgiKTsKKwkJVkdMX1ZpZGVvUXVpdCh0aGlzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuIDA7Cit9CisKK1NETF9SZWN0ICoqVkdMX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKwlyZXR1cm4gU0RMX21vZGVsaXN0WygoZm9ybWF0LT5CaXRzUGVyUGl4ZWwrNykvOCktMV07Cit9CisKKy8qIFZhcmlvdXMgc2NyZWVuIHVwZGF0ZSBmdW5jdGlvbnMgYXZhaWxhYmxlICovCitzdGF0aWMgdm9pZCBWR0xfRGlyZWN0VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cyk7CisKK1NETF9TdXJmYWNlICpWR0xfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCSAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworCWludCBtb2RlX2ZvdW5kOworCWludCBpOworCVZHTE1vZGUgKiptb2RlczsKKworCW1vZGVzID0gVkdMTGlzdE1vZGVzKGJwcCwgVl9JTkZPX01NX0RJUkVDVCB8IFZfSU5GT19NTV9QQUNLRUQpOworCW1vZGVfZm91bmQgPSAwOworCWZvciAoaSA9IDA7IG1vZGVzW2ldICE9IE5VTEw7IGkrKykgeworCQlpZiAoKG1vZGVzW2ldLT5Nb2RlSW5mby5Yc2l6ZSA9PSB3aWR0aCkgJiYKKwkJICAgIChtb2Rlc1tpXS0+TW9kZUluZm8uWXNpemUgPT0gaGVpZ2h0KSAmJgorCQkgICAgKChtb2Rlc1tpXS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUY4KSB8fAorCQkgICAgIChtb2Rlc1tpXS0+TW9kZUluZm8uVHlwZSA9PSBWSURCVUYxNikgfHwKKwkJICAgICAobW9kZXNbaV0tPk1vZGVJbmZvLlR5cGUgPT0gVklEQlVGMzIpKSkgeworCQkJbW9kZV9mb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobW9kZV9mb3VuZCA9PSAwKSB7CisJCVNETF9TZXRFcnJvcigiTm8gbWF0Y2hpbmcgdmlkZW8gbW9kZSBmb3VuZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBTaHV0ZG93biBwcmV2aW91cyB2aWRlb21vZGUgKGlmIGFueSkgKi8KKwlpZiAoVkdMQ3VyTW9kZSAhPSBOVUxMKQorCQlWR0xFbmQoKTsKKworCS8qIFRyeSB0byBzZXQgdGhlIHJlcXVlc3RlZCBsaW5lYXIgdmlkZW8gbW9kZSAqLworCWlmIChWR0xJbml0KG1vZGVzW2ldLT5Nb2RlSWQpICE9IDApIHsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gc3dpdGNoIHRvIHJlcXVlc3RlZCBtb2RlIik7CisJCXJldHVybiBOVUxMOworCX0KKworCVZHTEN1ck1vZGUgPSBTRExfcmVhbGxvYyhWR0xDdXJNb2RlLCBzaXplb2YoVkdMTW9kZSkpOworCVZHTEN1ck1vZGUtPk1vZGVJbmZvID0gKlZHTERpc3BsYXk7CisJVkdMQ3VyTW9kZS0+RGVwdGggPSBtb2Rlc1tpXS0+RGVwdGg7CisJVkdMQ3VyTW9kZS0+TW9kZUlkID0gbW9kZXNbaV0tPk1vZGVJZDsKKwlWR0xDdXJNb2RlLT5SbWFzayA9IG1vZGVzW2ldLT5SbWFzazsKKwlWR0xDdXJNb2RlLT5HbWFzayA9IG1vZGVzW2ldLT5HbWFzazsKKwlWR0xDdXJNb2RlLT5CbWFzayA9IG1vZGVzW2ldLT5CbWFzazsKKworCS8qIFdvcmthcm91bmQgYSBidWcgaW4gbGlidmdsICovCisJaWYgKFZHTEN1ck1vZGUtPk1vZGVJbmZvLlBpeGVsQnl0ZXMgPT0gMCkKKwkJKFZHTEN1ck1vZGUtPk1vZGVJbmZvLlBpeGVsQnl0ZXMgPSAxKTsKKworCWN1cnJlbnQtPncgPSBWR0xDdXJNb2RlLT5Nb2RlSW5mby5Yc2l6ZTsKKwljdXJyZW50LT5oID0gVkdMQ3VyTW9kZS0+TW9kZUluZm8uWXNpemU7CisJY3VycmVudC0+cGl4ZWxzID0gVkdMQ3VyTW9kZS0+TW9kZUluZm8uQml0bWFwOworCWN1cnJlbnQtPnBpdGNoID0gVkdMQ3VyTW9kZS0+TW9kZUluZm8uWHNpemUgKgorCQkJIFZHTEN1ck1vZGUtPk1vZGVJbmZvLlBpeGVsQnl0ZXM7CisJY3VycmVudC0+ZmxhZ3MgPSAoU0RMX0ZVTExTQ1JFRU4gfCBTRExfSFdTVVJGQUNFKTsKKworCS8qIENoZWNrIGlmIHdlIGFyZSBpbiBhIHBzZXVkby1jb2xvciBtb2RlICovCisJaWYgKFZHTEN1ck1vZGUtPk1vZGVJbmZvLlR5cGUgPT0gVklEQlVGOCkKKwkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKKworCS8qIENoZWNrIGlmIHdlIGNhbiBkbyBkb3VibGVidWZmZXJpbmcgKi8KKwlpZiAoZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSB7CisJCWlmIChWR0xDdXJNb2RlLT5Nb2RlSW5mby5Yc2l6ZSAqIDIgPD0KKwkJICAgIFZHTEN1ck1vZGUtPk1vZGVJbmZvLlZZc2l6ZSkgeworCQkJY3VycmVudC0+ZmxhZ3MgfD0gU0RMX0RPVUJMRUJVRjsKKwkJCWZsaXBfcGFnZSA9IDA7CisJCQlmbGlwX2FkZHJlc3NbMF0gPSAoYnl0ZSAqKWN1cnJlbnQtPnBpeGVsczsKKwkJCWZsaXBfYWRkcmVzc1sxXSA9IChieXRlICopY3VycmVudC0+cGl4ZWxzICsKKwkJCQkJICBjdXJyZW50LT5oICogY3VycmVudC0+cGl0Y2g7CisJCQlWR0xfRmxpcEhXU3VyZmFjZSh0aGlzLCBjdXJyZW50KTsKKwkJfQorCX0KKworCWlmICghIFNETF9SZWFsbG9jRm9ybWF0KGN1cnJlbnQsIG1vZGVzW2ldLT5EZXB0aCwgVkdMQ3VyTW9kZS0+Um1hc2ssCisJCQkJVkdMQ3VyTW9kZS0+R21hc2ssIFZHTEN1ck1vZGUtPkJtYXNrLCAwKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBVcGRhdGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGluZm8gKi8KKwlWR0xfVXBkYXRlVmlkZW9JbmZvKHRoaXMpOworCisJLyogU2V0IHRoZSBibGl0IGZ1bmN0aW9uICovCisJdGhpcy0+VXBkYXRlUmVjdHMgPSBWR0xfRGlyZWN0VXBkYXRlOworCisJLyogV2UncmUgZG9uZSAqLworCXJldHVybiBjdXJyZW50OworfQorCisvKiBXZSBkb24ndCBhY3R1YWxseSBhbGxvdyBoYXJkd2FyZSBzdXJmYWNlcyBvdGhlciB0aGFuIHRoZSBtYWluIG9uZSAqLworc3RhdGljIGludCBWR0xfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybiAtMTsKK30KK3N0YXRpYyB2b2lkIFZHTF9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKKy8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSBvbiBwYWdlIGZsaXBwZWQgZGlzcGxheXMgKi8KK3N0YXRpYyBpbnQgVkdMX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCWlmIChzdXJmYWNlID09IFNETF9WaWRlb1N1cmZhY2UpIHsKKwkJU0RMX211dGV4UChod19sb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBWR0xfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlpZiAoc3VyZmFjZSA9PSBTRExfVmlkZW9TdXJmYWNlKSB7CisJCVNETF9tdXRleFYoaHdfbG9jayk7CisJfQorfQorCitzdGF0aWMgaW50IFZHTF9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlpZiAoVkdMUGFuU2NyZWVuKFZHTERpc3BsYXksIDAsIGZsaXBfcGFnZSAqIHN1cmZhY2UtPmgpIDwgMCkgeworCQlTRExfU2V0RXJyb3IoIlZHTFBhblNyZWVuKCkgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKwlmbGlwX3BhZ2UgPSAhZmxpcF9wYWdlOworCXN1cmZhY2UtPnBpeGVscyA9IGZsaXBfYWRkcmVzc1tmbGlwX3BhZ2VdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIFZHTF9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCXJldHVybjsKK30KKworaW50IFZHTF9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisgICAgICAgIGludCBpOworCisJZm9yKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7CisJICAgICAgICBWR0xTZXRQYWxldHRlSW5kZXgoZmlyc3Rjb2xvciArIGksCisJCQkgICAgICAgY29sb3JzW2ldLnI+PjIsCisJCQkgICAgICAgY29sb3JzW2ldLmc+PjIsCisJCQkgICAgICAgY29sb3JzW2ldLmI+PjIpOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogTm90ZTogIElmIHdlIGFyZSB0ZXJtaW5hdGVkLCB0aGlzIGNvdWxkIGJlIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mCisgICBhbm90aGVyIFNETCB2aWRlbyByb3V0aW5lIC0tIG5vdGFibHkgVXBkYXRlUmVjdHMuCisqLwordm9pZCBWR0xfVmlkZW9RdWl0KF9USElTKQoreworCWludCBpLCBqOworCisJLyogUmV0dXJuIHRoZSBrZXlib2FyZCB0byB0aGUgbm9ybWFsIHN0YXRlICovCisJVkdMS2V5Ym9hcmRFbmQoKTsKKworCS8qIFJlc2V0IHRoZSBjb25zb2xlIHZpZGVvIG1vZGUgaWYgd2UgYWN0dWFsbHkgaW5pdGlhbGlzZWQgb25lICovCisJaWYgKFZHTEN1ck1vZGUgIT0gTlVMTCkgeworCQlWR0xFbmQoKTsKKwkJU0RMX2ZyZWUoVkdMQ3VyTW9kZSk7CisJCVZHTEN1ck1vZGUgPSBOVUxMOworCX0KKworCS8qIENsZWFyIHRoZSBsb2NrIG11dGV4ICovCisJaWYgKGh3X2xvY2sgIT0gTlVMTCkgeworCQlTRExfRGVzdHJveU11dGV4KGh3X2xvY2spOworCQlod19sb2NrID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIHZpZGVvIG1vZGUgbGlzdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX01PREVMSVNUUzsgaSsrKSB7CisJCWlmIChTRExfbW9kZWxpc3RbaV0gIT0gTlVMTCkgeworCQkJZm9yIChqID0gMDsgU0RMX21vZGVsaXN0W2ldW2pdICE9IE5VTEw7ICsraikgeworCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXVtqXSk7CisJCQl9CisJCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOworCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKKwkJfQorCX0KKworCWlmICggdGhpcy0+c2NyZWVuICYmICh0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgKSB7CisJLyogRGlyZWN0IHNjcmVlbiBhY2Nlc3MsIG5vdCBhIG1lbW9yeSBidWZmZXIgKi8KKwkJdGhpcy0+c2NyZWVuLT5waXhlbHMgPSBOVUxMOworCX0KK30KKworI2RlZmluZSBWR0xfUkVEX0lOREVYCTAKKyNkZWZpbmUgVkdMX0dSRUVOX0lOREVYCTEKKyNkZWZpbmUgVkdMX0JMVUVfSU5ERVgJMgorCitzdGF0aWMgVkdMTW9kZSAqKgorVkdMTGlzdE1vZGVzKGludCBkZXB0aCwgaW50IG1lbV9tb2RlbCkKK3sKKyAgc3RhdGljIFZHTE1vZGUgKiptb2RlcyA9IE5VTEw7CisKKyAgVkdMQml0bWFwICp2bWluZm9wOworICBWR0xNb2RlICoqbW9kZXNwLCAqbW9kZXNjcDsKKyAgdmlkZW9faW5mb190IG1pbmZvOworICBpbnQgYWRwdHlwZSwgaSwgbW9kZW51bTsKKworICBpZiAobW9kZXMgPT0gTlVMTCkgeworICAgIG1vZGVzID0gU0RMX21hbGxvYyhzaXplb2YoVkdMTW9kZSAqKSAqIE1fVkVTQV9NT0RFX01BWCk7CisgICAgYnplcm8obW9kZXMsIHNpemVvZihWR0xNb2RlICopICogTV9WRVNBX01PREVfTUFYKTsKKyAgfQorICBtb2Rlc3AgPSBtb2RlczsKKworICBmb3IgKG1vZGVudW0gPSAwOyBtb2RlbnVtIDwgTV9WRVNBX01PREVfTUFYOyBtb2RlbnVtKyspIHsKKyAgICBtaW5mby52aV9tb2RlID0gbW9kZW51bTsKKyAgICBpZiAoaW9jdGwoMCwgQ09OU19NT0RFSU5GTywgJm1pbmZvKSB8fCBpb2N0bCgwLCBDT05TX0NVUlJFTlQsICZhZHB0eXBlKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChtaW5mby52aV9tb2RlICE9IG1vZGVudW0pCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoKG1pbmZvLnZpX2ZsYWdzICYgVl9JTkZPX0dSQVBISUNTKSA9PSAwKQorICAgICAgY29udGludWU7CisgICAgaWYgKChtZW1fbW9kZWwgIT0gLTEpICYmICgobWluZm8udmlfbWVtX21vZGVsICYgbWVtX21vZGVsKSA9PSAwKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICgoZGVwdGggPiAxKSAmJiAobWluZm8udmlfZGVwdGggIT0gZGVwdGgpKQorICAgICAgY29udGludWU7CisKKyAgICAvKiByZWFsbG9jZiBjYW4gZmFpbCAqLworICAgIGlmICgoKm1vZGVzcCA9IHJlYWxsb2NmKCptb2Rlc3AsIHNpemVvZihWR0xNb2RlKSkpID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb2Rlc2NwID0gKm1vZGVzcDsKKworICAgIHZtaW5mb3AgPSAmKG1vZGVzY3AtPk1vZGVJbmZvKTsKKyAgICBiemVybyh2bWluZm9wLCBzaXplb2YoVkdMQml0bWFwKSk7CisKKyAgICB2bWluZm9wLT5UeXBlID0gTk9CVUY7CisKKyAgICB2bWluZm9wLT5QaXhlbEJ5dGVzID0gMTsJLyogR29vZCBkZWZhdWx0IHZhbHVlICovCisgICAgc3dpdGNoIChtaW5mby52aV9tZW1fbW9kZWwpIHsKKyAgICBjYXNlIFZfSU5GT19NTV9QTEFOQVI6CisgICAgICAvKiB3ZSBjYW4gaGFuZGxlIEVHQS9WR0EgcGxhbmFyIG1vZGVzIG9ubHkgKi8KKyAgICAgIGlmICghKG1pbmZvLnZpX2RlcHRoICE9IDQgfHwgbWluZm8udmlfcGxhbmVzICE9IDQKKwkgICAgfHwgKGFkcHR5cGUgIT0gS0RfRUdBICYmIGFkcHR5cGUgIT0gS0RfVkdBKSkpCisJdm1pbmZvcC0+VHlwZSA9IFZJREJVRjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZfSU5GT19NTV9QQUNLRUQ6CisgICAgICAvKiB3ZSBjYW4gZG8gb25seSAyNTYgY29sb3IgcGFja2VkIG1vZGVzICovCisgICAgICBpZiAobWluZm8udmlfZGVwdGggPT0gOCkKKwl2bWluZm9wLT5UeXBlID0gVklEQlVGODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVl9JTkZPX01NX1ZHQVg6CisgICAgICB2bWluZm9wLT5UeXBlID0gVklEQlVGOFg7CisgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKF9fRlJFRUJTRF9fKSAmJiAoZGVmaW5lZChfX0RyYWdvbkZseV9fKSB8fCBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMDApCisgICAgY2FzZSBWX0lORk9fTU1fRElSRUNUOgorICAgICAgdm1pbmZvcC0+UGl4ZWxCeXRlcyA9IG1pbmZvLnZpX3BpeGVsX3NpemU7CisgICAgICBzd2l0Y2ggKHZtaW5mb3AtPlBpeGVsQnl0ZXMpIHsKKyAgICAgIGNhc2UgMjoKKwl2bWluZm9wLT5UeXBlID0gVklEQlVGMTY7CisJYnJlYWs7CisjaWYgbm90eWV0CisgICAgICBjYXNlIDM6CisJdm1pbmZvcC0+VHlwZSA9IFZJREJVRjI0OworCWJyZWFrOworI2VuZGlmCisgICAgICBjYXNlIDQ6CisJdm1pbmZvcC0+VHlwZSA9IFZJREJVRjMyOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICAgIH0KKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHZtaW5mb3AtPlR5cGUgPT0gTk9CVUYpCisgICAgICBjb250aW51ZTsKKworICAgIHN3aXRjaCAodm1pbmZvcC0+VHlwZSkgeworICAgIGNhc2UgVklEQlVGMTY6CisgICAgY2FzZSBWSURCVUYzMjoKKyAgICAgIG1vZGVzY3AtPlJtYXNrID0gKCgxIDw8IG1pbmZvLnZpX3BpeGVsX2ZzaXplc1tWR0xfUkVEX0lOREVYXSkgLSAxKSA8PAorCQkgICAgICAgbWluZm8udmlfcGl4ZWxfZmllbGRzW1ZHTF9SRURfSU5ERVhdOworICAgICAgbW9kZXNjcC0+R21hc2sgPSAoKDEgPDwgbWluZm8udmlfcGl4ZWxfZnNpemVzW1ZHTF9HUkVFTl9JTkRFWF0pIC0gMSkgPDwKKwkJICAgICAgIG1pbmZvLnZpX3BpeGVsX2ZpZWxkc1tWR0xfR1JFRU5fSU5ERVhdOworICAgICAgbW9kZXNjcC0+Qm1hc2sgPSAoKDEgPDwgbWluZm8udmlfcGl4ZWxfZnNpemVzW1ZHTF9CTFVFX0lOREVYXSkgLSAxKSA8PAorCQkgICAgICAgbWluZm8udmlfcGl4ZWxfZmllbGRzW1ZHTF9CTFVFX0lOREVYXTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHZtaW5mb3AtPlhzaXplID0gbWluZm8udmlfd2lkdGg7CisgICAgdm1pbmZvcC0+WXNpemUgPSBtaW5mby52aV9oZWlnaHQ7CisgICAgbW9kZXNjcC0+RGVwdGggPSBtaW5mby52aV9kZXB0aDsKKworICAgIC8qIFhYWCAqLworICAgIGlmIChtaW5mby52aV9tb2RlID49IE1fVkVTQV9CQVNFKQorICAgICAgbW9kZXNjcC0+TW9kZUlkID0gX0lPKCdWJywgbWluZm8udmlfbW9kZSAtIE1fVkVTQV9CQVNFKTsKKyAgICBlbHNlCisgICAgICBtb2Rlc2NwLT5Nb2RlSWQgPSBfSU8oJ1MnLCBtaW5mby52aV9tb2RlKTsKKworICAgIC8qIFNvcnQgbGlzdCAqLworICAgIGZvciAoaSA9IDA7IG1vZGVzICsgaSA8IG1vZGVzcCA7IGkrKykgeworICAgICAgaWYgKG1vZGVzW2ldLT5Nb2RlSW5mby5Yc2l6ZSAqIG1vZGVzW2ldLT5Nb2RlSW5mby5Zc2l6ZSA+CisJICB2bWluZm9wLT5Yc2l6ZSAqIG1vZGVzW2ldLT5Nb2RlSW5mby5Zc2l6ZSkKKwljb250aW51ZTsKKyAgICAgIGlmICgobW9kZXNbaV0tPk1vZGVJbmZvLlhzaXplICogbW9kZXNbaV0tPk1vZGVJbmZvLllzaXplID09CisJICAgdm1pbmZvcC0+WHNpemUgKiB2bWluZm9wLT5Zc2l6ZSkgJiYKKwkgIChtb2Rlc1tpXS0+RGVwdGggPj0gbW9kZXNjcC0+RGVwdGgpKQorCWNvbnRpbnVlOworICAgICAgKm1vZGVzcCA9IG1vZGVzW2ldOworICAgICAgbW9kZXNbaV0gPSBtb2Rlc2NwOworICAgICAgbW9kZXNjcCA9ICptb2Rlc3A7CisgICAgICB2bWluZm9wID0gJihtb2Rlc2NwLT5Nb2RlSW5mbyk7CisgICAgfQorCisgICAgbW9kZXNwKys7CisgIH0KKworICBpZiAoKm1vZGVzcCAhPSBOVUxMKSB7CisgICAgU0RMX2ZyZWUoKm1vZGVzcCk7CisgICAgKm1vZGVzcCA9IE5VTEw7CisgIH0KKworICByZXR1cm4gbW9kZXM7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vdmdsL1NETF92Z2x2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzM1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3ZnbC9TRExfdmdsdmlkZW8uaApAQCAtMCwwICsxLDY1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2lmbmRlZiBfU0RMX3ZnbHZpZGVvX2gKKyNkZWZpbmUgX1NETF92Z2x2aWRlb19oCisKKyNpbmNsdWRlIDxzeXMvZmJpby5oPgorI2luY2x1ZGUgPHN5cy9jb25zaW8uaD4KKyNpbmNsdWRlIDx2Z2wuaD4KKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgTW9kZUlkOworCWludCBEZXB0aDsKKwlpbnQgUm1hc2s7CisJaW50IEdtYXNrOworCWludCBCbWFzazsKKwlWR0xCaXRtYXAgTW9kZUluZm87Cit9IFZHTE1vZGU7CisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgeworI2RlZmluZSBOVU1fTU9ERUxJU1RTCTQJCS8qIDgsIDE2LCAyNCwgYW5kIDMyIGJpdHMtcGVyLXBpeGVsICovCisJaW50IFNETF9udW1tb2Rlc1tOVU1fTU9ERUxJU1RTXTsKKwlTRExfUmVjdCAqKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXTsKKwlTRExfbXV0ZXggKmh3X2xvY2s7CisJVkdMTW9kZSAqVkdMQ3VyTW9kZTsKKwlpbnQgZmxpcF9wYWdlOworCWJ5dGUgKmZsaXBfYWRkcmVzc1syXTsKK307CisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgU0RMX251bW1vZGVzCSh0aGlzLT5oaWRkZW4tPlNETF9udW1tb2RlcykKKyNkZWZpbmUgU0RMX21vZGVsaXN0CSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlbGlzdCkKKyNkZWZpbmUgaHdfbG9jawkJKHRoaXMtPmhpZGRlbi0+aHdfbG9jaykKKyNkZWZpbmUgVkdMQ3VyTW9kZQkodGhpcy0+aGlkZGVuLT5WR0xDdXJNb2RlKQorI2RlZmluZSBmbGlwX3BhZ2UJKHRoaXMtPmhpZGRlbi0+ZmxpcF9wYWdlKQorI2RlZmluZSBmbGlwX2FkZHJlc3MJKHRoaXMtPmhpZGRlbi0+ZmxpcF9hZGRyZXNzKQorCisjZW5kaWYgLyogX1NETF92Z2x2aWRlb19oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfbG93dmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9sb3d2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDFhODgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfbG93dmlkZW8uaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9sb3d2aWRlb19oCisjZGVmaW5lIF9TRExfbG93dmlkZW9faAorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpZm5kZWYgU2V0Q2xhc3NMb25nUHRyCisjZGVmaW5lIFNldENsYXNzTG9uZ1B0cglTZXRDbGFzc0xvbmcKKyNlbmRpZgorI2lmbmRlZiBHZXRXaW5kb3dMb25nUHRyCisjZGVmaW5lIEdldFdpbmRvd0xvbmdQdHIJR2V0V2luZG93TG9uZworI2VuZGlmCisjaWZuZGVmIFNldFdpbmRvd0xvbmdQdHIKKyNkZWZpbmUgU2V0V2luZG93TG9uZ1B0cglTZXRXaW5kb3dMb25nCisjZW5kaWYKKyNpZm5kZWYgR1dMUF9XTkRQUk9DCisjZGVmaW5lIEdXTFBfV05EUFJPQwlHV0xfV05EUFJPQworI2VuZGlmCisjaWZuZGVmIEdXTFBfSElOU1RBTkNFCisjZGVmaW5lIEdXTFBfSElOU1RBTkNFIEdXTF9ISU5TVEFOQ0UKKyNlbmRpZgorI2lmbmRlZiBHQ0xQX0hJQ09OCisjZGVmaW5lIEdDTFBfSElDT04gR0NMX0hJQ09OCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisvKiBIaWRkZW4gInRoaXMiIHBvaW50ZXIgZm9yIHRoZSB2aWRlbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX1RISVMJU0RMX1ZpZGVvRGV2aWNlICp0aGlzCisKKyNkZWZpbmUgRlVMTFNDUkVFTigpIFwKKwkoKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOKQorCisjZGVmaW5lIFdJTkRJQl9GVUxMU0NSRUVOKCkJCQkJCQlcCisoCQkJCQkJCQkJXAorCVNETF9WaWRlb1N1cmZhY2UgJiYJCQkJCQlcCisJRlVMTFNDUkVFTigpICYmIFwKKwkoKChTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9PUEVOR0wgICApID09IFNETF9PUEVOR0wgICAgKSB8fCBcCisJKChTRExfc3RyY21wKHRoaXMtPm5hbWUsICJ3aW5kaWIiKSA9PSAwKSB8fCBcCisJIChTRExfc3RyY21wKHRoaXMtPm5hbWUsICJnYXBpIikgPT0gMCkpKSBcCispCisjZGVmaW5lIEREUkFXX0ZVTExTQ1JFRU4oKSAJCQkJCQlcCisoCQkJCQkJCQkJXAorCVNETF9WaWRlb1N1cmZhY2UgJiYJCQkJCQlcCisJRlVMTFNDUkVFTigpICYmIFwKKwkoKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCAgICApICE9IFNETF9PUEVOR0wgICAgKSAmJiBcCisJKFNETF9zdHJjbXAodGhpcy0+bmFtZSwgImRpcmVjdHgiKSA9PSAwKQkJCQlcCispCisKKyNkZWZpbmUgRElOUFVUX0ZVTExTQ1JFRU4oKSAJCQkJCQlcCisoCQkJCQkJCQkJXAorCUZVTExTQ1JFRU4oKSAmJiBcCisJKHN0cmNtcCh0aGlzLT5uYW1lLCAiZGlyZWN0eCIpID09IDApCQkJCVwKKykKKworI2RlZmluZSBESU5QVVQoKSAoc3RyY21wKHRoaXMtPm5hbWUsICJkaXJlY3R4IikgPT0gMCkKKworLyogVGhlIG1haW4gd2luZG93IC0tIGFuZCBhIGZ1bmN0aW9uIHRvIHNldCBpdCBmb3IgdGhlIGF1ZGlvICovCisjaWZkZWYgX1dJTjMyX1dDRQorZXh0ZXJuIExQV1NUUiBTRExfQXBwbmFtZTsKKyNlbHNlCitleHRlcm4gTFBTVFIgU0RMX0FwcG5hbWU7CisjZW5kaWYKK2V4dGVybiBISU5TVEFOQ0UgU0RMX0luc3RhbmNlOworZXh0ZXJuIEhXTkQgU0RMX1dpbmRvdzsKK2V4dGVybiBCT09MIFNETF93aW5kb3dpZDsKKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIG5hdGl2ZSB2aWRlbworICAgc3Vic3lzdGVtIChTRExfc3lzZXZlbnRzLmMpCisqLworZXh0ZXJuIHZvaWQgV0lOX0ZsdXNoTWVzc2FnZVF1ZXVlKCk7CisKKy8qIENhbGxlZCBieSB3aW5kb3dzIG1lc3NhZ2UgbG9vcCB3aGVuIGFwcGxpY2F0aW9uIGlzIGFjdGl2YXRlZCAqLworZXh0ZXJuIHZvaWQgKCpXSU5fQWN0aXZhdGUpKF9USElTLCBCT09MIGFjdGl2ZSwgQk9PTCBtaW5pbWl6ZWQpOworCisvKiBDYWxsZWQgYnkgd2luZG93cyBtZXNzYWdlIGxvb3Agd2hlbiBzeXN0ZW0gcGFsZXR0ZSBpcyBhdmFpbGFibGUgKi8KK2V4dGVybiB2b2lkICgqV0lOX1JlYWxpemVQYWxldHRlKShfVEhJUyk7CisKKy8qIENhbGxlZCBieSB3aW5kb3dzIG1lc3NhZ2UgbG9vcCB3aGVuIHRoZSBzeXN0ZW0gcGFsZXR0ZSBjaGFuZ2VzICovCitleHRlcm4gdm9pZCAoKldJTl9QYWxldHRlQ2hhbmdlZCkoX1RISVMsIEhXTkQgd2luZG93KTsKKworLyogQ2FsbGVkIGJ5IHdpbmRvd3MgbWVzc2FnZSBsb29wIHdoZW4gYSBwb3J0aW9uIG9mIHRoZSBzY3JlZW4gbmVlZHMgdXBkYXRlICovCitleHRlcm4gdm9pZCAoKldJTl9XaW5QQUlOVCkoX1RISVMsIEhEQyBoZGMpOworCisvKiBDYWxsZWQgYnkgd2luZG93cyBtZXNzYWdlIGxvb3Agd2hlbiB0aGUgbWVzc2FnZSBpc24ndCBoYW5kbGVkICovCitleHRlcm4gTE9ORyAoKkhhbmRsZU1lc3NhZ2UpKF9USElTLCBIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKKworLyogVGhlIHdpbmRvdyBjdXJzb3IgKGZyb20gU0RMX3N5c21vdXNlLmMpICovCitleHRlcm4gSENVUlNPUiBTRExfaGN1cnNvcjsKKworLyogVGhlIGJvdW5kcyBvZiB0aGUgd2luZG93IGluIHNjcmVlbiBjb29yZGluYXRlcyAqLworZXh0ZXJuIFJFQ1QgU0RMX2JvdW5kczsKKworLyogVGhlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cgaW4gd2luZG93ZWQgbW9kZSAqLworZXh0ZXJuIGludCBTRExfd2luZG93WDsKK2V4dGVybiBpbnQgU0RMX3dpbmRvd1k7CisKKy8qIEZsYWcgLS0gU0RMIGlzIHBlcmZvcm1pbmcgYSByZXNpemUsIHJhdGhlciB0aGFuIHRoZSB1c2VyICovCitleHRlcm4gaW50IFNETF9yZXNpemluZzsKKworLyogRmxhZyAtLSB0aGUgbW91c2UgaXMgaW4gcmVsYXRpdmUgbW90aW9uIG1vZGUgKi8KK2V4dGVybiBpbnQgbW91c2VfcmVsYXRpdmU7CisKKy8qIFRoZSBHREkgZnVsbHNjcmVlbiBtb2RlIGN1cnJlbnRseSBhY3RpdmUgKi8KKyNpZm5kZWYgTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTCitleHRlcm4gREVWTU9ERSBTRExfZGVza3RvcF9tb2RlOworZXh0ZXJuIERFVk1PREUgU0RMX2Z1bGxzY3JlZW5fbW9kZTsKKyNlbmRpZgorCisvKiBUaGUgc3lzdGVtIGdhbW1hIHJhbXAgZm9yIEdESSBtb2RlcyAqLworZXh0ZXJuIFdPUkQgKmdhbW1hX3NhdmVkOworCisvKiBUaGlzIGlzIHJlYWxseSBmcm9tIFNETF9keDVhdWRpby5jICovCitleHRlcm4gdm9pZCBEWDVfU291bmRGb2N1cyhIV05EIHdpbmRvdyk7CisKKy8qIERKTTogVGhpcyBpcyByZWFsbHkgZnJvbSBTRExfc3lzZXZlbnRzLmMsIHdlIG5lZWQgaXQgaW4KKyAgIEdETF9DcmVhdGVXaW5kb3cgYXMgd2VsbCAqLworTFJFU1VMVCBDQUxMQkFDSyBXaW5NZXNzYWdlKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworCisjaWZkZWYgX1dJTjY0CisjZGVmaW5lIFNETF9Ub1VuaWNvZGUgIFRvVW5pY29kZQorI2Vsc2UKKy8qIEpGUDogSW1wbGVtZW50YXRpb24gb2YgVG9Vbmljb2RlKCkgdGhhdCB3b3JrcyBvbiA5eC9NRS8ySy9YUCAqLwordHlwZWRlZiBpbnQgKFdJTkFQSSAqVG9Vbmljb2RlRk4pKFVJTlQsIFVJTlQsIGNvbnN0IEJZVEUgKiwgTFBXU1RSLCBpbnQsIFVJTlQpOworCitleHRlcm4gVG9Vbmljb2RlRk4gU0RMX1RvVW5pY29kZTsKKyNlbmRpZgorCisjZW5kaWYgLyogU0RMX2xvd3ZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9zeXNldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9zeXNldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmM2N2ExCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c2V2ZW50cy5jCkBAIC0wLDAgKzEsODU1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvKiBNYWtlIHN1cmUgWEJVVFRPTiBzdHVmZiBpcyBkZWZpbmVkIHRoYXQgaXNuJ3QgaW4gb2xkZXIgUGxhdGZvcm0gU0RLcy4uLiAqLworI2lmbmRlZiBXTV9YQlVUVE9ORE9XTgorI2RlZmluZSBXTV9YQlVUVE9ORE9XTiAweDAyMEIKKyNlbmRpZgorI2lmbmRlZiBXTV9YQlVUVE9OVVAKKyNkZWZpbmUgV01fWEJVVFRPTlVQIDB4MDIwQworI2VuZGlmCisjaWZuZGVmIEdFVF9YQlVUVE9OX1dQQVJBTQorI2RlZmluZSBHRVRfWEJVVFRPTl9XUEFSQU0odykgKEhJV09SRCh3KSkKKyNlbmRpZgorCisjaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgorI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9zeXN3bS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgorI2luY2x1ZGUgIlNETF9zeXN3bV9jLmgiCisjaW5jbHVkZSAiU0RMX21haW4uaCIKKyNpbmNsdWRlICJTRExfbG9hZHNvLmgiCisKKyNpZmRlZiBXTU1TR19ERUJVRworI2luY2x1ZGUgIndtbXNnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL3dpbmRpYi9TRExfZ2FwaWRpYnZpZGVvLmgiCisKKyNpZmRlZiBTRExfVklERU9fRFJJVkVSX0dBUEkKKyNpbmNsdWRlICIuLi9nYXBpL1NETF9nYXBpdmlkZW8uaCIKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyX1dDRQorI2RlZmluZSBJc1pvb21lZChIV05EKSAxCisjZGVmaW5lIE5PX0dFVEtFWUJPQVJEU1RBVEUKKyNpZiBfV0lOMzJfV0NFIDwgNDIwCisjZGVmaW5lIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUworI2VuZGlmCisjZW5kaWYKKworLyogVGhlIHdpbmRvdyB3ZSB1c2UgZm9yIGV2ZXJ5dGhpbmcuLi4gKi8KKyNpZmRlZiBfV0lOMzJfV0NFCitMUFdTVFIgU0RMX0FwcG5hbWUgPSBOVUxMOworI2Vsc2UKK0xQU1RSIFNETF9BcHBuYW1lID0gTlVMTDsKKyNlbmRpZgorVWludDMyIFNETF9BcHBzdHlsZSA9IDA7CitISU5TVEFOQ0UgU0RMX0luc3RhbmNlID0gTlVMTDsKK0hXTkQgU0RMX1dpbmRvdyA9IE5VTEw7CitSRUNUIFNETF9ib3VuZHMgPSB7MCwgMCwgMCwgMH07CitpbnQgU0RMX3dpbmRvd1ggPSAwOworaW50IFNETF93aW5kb3dZID0gMDsKK2ludCBTRExfcmVzaXppbmcgPSAwOworaW50IG1vdXNlX3JlbGF0aXZlID0gMDsKK2ludCBwb3N0ZWQgPSAwOworI2lmbmRlZiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKK0RFVk1PREUgU0RMX2Rlc2t0b3BfbW9kZTsKK0RFVk1PREUgU0RMX2Z1bGxzY3JlZW5fbW9kZTsKKyNlbmRpZgorV09SRCAqZ2FtbWFfc2F2ZWQgPSBOVUxMOworCisKKy8qIEZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZyBmdW5jdGlvbiAqLworTE9ORyAoKkhhbmRsZU1lc3NhZ2UpKF9USElTLCBIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKT1OVUxMOwordm9pZCAoKldJTl9BY3RpdmF0ZSkoX1RISVMsIEJPT0wgYWN0aXZlLCBCT09MIGljb25pYyk7Cit2b2lkICgqV0lOX1JlYWxpemVQYWxldHRlKShfVEhJUyk7Cit2b2lkICgqV0lOX1BhbGV0dGVDaGFuZ2VkKShfVEhJUywgSFdORCB3aW5kb3cpOwordm9pZCAoKldJTl9XaW5QQUlOVCkoX1RISVMsIEhEQyBoZGMpOworZXh0ZXJuIHZvaWQgRElCX1N3YXBHYW1tYShfVEhJUyk7CisKKyNpZm5kZWYgTk9fR0VUS0VZQk9BUkRTVEFURQorI2lmbmRlZiBfV0lONjQKKy8qIFZhcmlhYmxlcyBhbmQgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFNETF9Ub1VuaWNvZGUoKSAqLworc3RhdGljIGludCBjb2RlcGFnZTsKK3N0YXRpYyBpbnQgSXM5eE1FKCk7CitzdGF0aWMgaW50IEdldENvZGVQYWdlKCk7CitzdGF0aWMgaW50IFdJTkFQSSBUb1VuaWNvZGU5eE1FKFVJTlQgdmtleSwgVUlOVCBzY2FuY29kZSwgY29uc3QgQllURSAqa2V5c3RhdGUsIExQV1NUUiB3Y2hhcnMsIGludCB3c2l6ZSwgVUlOVCBmbGFncyk7CisKK1RvVW5pY29kZUZOIFNETF9Ub1VuaWNvZGUgPSBUb1VuaWNvZGU5eE1FOworI2VuZGlmCisjZW5kaWYgLyogIU5PX0dFVEtFWUJPQVJEU1RBVEUgKi8KKworCisjaWYgZGVmaW5lZChfV0lOMzJfV0NFKQorCisvL0FkanVzdFdpbmRvd1JlY3QgaXMgbm90IGF2YWlsYWJsZSB1bmRlciBXaW5DRSAyMDAzCisjZGVmaW5lIEFkanVzdFdpbmRvd1JlY3QoYSxiLGMpIChBZGp1c3RXaW5kb3dSZWN0RXgoKGEpLChiKSwoYyksMCkpCisKKy8vIGR5bmFtaWNhbGx5IGxvYWQgYXlnc2hlbGwgZGxsIGJlY2F1c2Ugd2Ugd2FudCBTREwgdG8gd29yayBvbiBIUEMgYW5kIGJlMzAwCitISU5TVEFOQ0UgYXlnc2hlbGwgPSBOVUxMOworQk9PTCAoV0lOQVBJICpTSEZ1bGxTY3JlZW4pKEhXTkQgaHduZFJlcXVlc3RlciwgRFdPUkQgZHdTdGF0ZSkgPSAwOworCisjZGVmaW5lIFNIRlNfU0hPV1RBU0tCQVIgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgU0hGU19ISURFVEFTS0JBUiAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBTSEZTX1NIT1dTSVBCVVRUT04gICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNIRlNfSElERVNJUEJVVFRPTiAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgU0hGU19TSE9XU1RBUlRJQ09OICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBTSEZTX0hJREVTVEFSVElDT04gICAgICAgICAgMHgwMDIwCisKK3N0YXRpYyB2b2lkIExvYWRBeWdzaGVsbCh2b2lkKQoreworCWlmKCAhYXlnc2hlbGwgKQorCQkgYXlnc2hlbGwgPSBTRExfTG9hZE9iamVjdCgiYXlnc2hlbGwuZGxsIik7CisJaWYoIChheWdzaGVsbCAhPSAwKSAmJiAoU0hGdWxsU2NyZWVuID09IDApICkKKwl7CisJCVNIRnVsbFNjcmVlbiA9IChpbnQgKFdJTkFQSSAqKShzdHJ1Y3QgSFdORF9fICosdW5zaWduZWQgbG9uZykpIFNETF9Mb2FkRnVuY3Rpb24oYXlnc2hlbGwsICJTSEZ1bGxTY3JlZW4iKTsKKwl9Cit9CisKKyNlbmRpZgorCisvKiBKQyAxNCBNYXIgMjAwNgorICAgVGhpcyBpcyB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZSwgaW4gdGhlIHdpbmRpYiBkcml2ZXIgYW5kIGluIHRoZSBkeDUgZHJpdmVyCisgICBTbyB3ZSBtYXkgYXMgd2VsbCBzdGljayBpdCBoZXJlIGluc3RlYWQgb2YgaGF2aW5nIG11bHRpcGxlIGNvcGllcyBzY2F0dGVyZWQKKyAgIGFib3V0CisqLwordm9pZCBXSU5fRmx1c2hNZXNzYWdlUXVldWUoKQoreworCU1TRyAgbXNnOworCXdoaWxlICggUGVla01lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCwgUE1fUkVNT1ZFKSApIHsKKwkJaWYgKCBtc2cubWVzc2FnZSA9PSBXTV9RVUlUICkgYnJlYWs7CisJCVRyYW5zbGF0ZU1lc3NhZ2UoICZtc2cgKTsKKwkJRGlzcGF0Y2hNZXNzYWdlKCAmbXNnICk7CisJfQorfQorCitzdGF0aWMgdm9pZCBTRExfUmVzdG9yZUdhbWVNb2RlKHZvaWQpCit7CisjaWZkZWYgX1dJTjMyX1dDRSAvL1VuZGVyIGNlIHdlIGRvbid0IG1pbmltaXplLCB0aGVyZWZvcmUgbm8gcmVzdG9yZQorCQorI2lmZGVmIFNETF9WSURFT19EUklWRVJfR0FQSQorCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87CisJaWYoU0RMX3N0cmNtcCh0aGlzLT5uYW1lLCAiZ2FwaSIpID09IDApCisJeworCQlpZiggdGhpcy0+aGlkZGVuLT5nYXBpSW5mby0+c3VzcGVuZGVkICkKKwkJeworCQkJdGhpcy0+aGlkZGVuLT5nYXBpSW5mby0+c3VzcGVuZGVkID0gMDsKKwkJfQorCX0KKyNlbmRpZgorCQorI2Vsc2UKKwlTaG93V2luZG93KFNETF9XaW5kb3csIFNXX1JFU1RPUkUpOworI2VuZGlmCisKKyNpZm5kZWYgTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTCisjaWZuZGVmIF9XSU4zMl9XQ0UKKwlDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoJlNETF9mdWxsc2NyZWVuX21vZGUsIENEU19GVUxMU0NSRUVOKTsKKyNlbmRpZgorI2VuZGlmIC8qIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUyAqLworfQorc3RhdGljIHZvaWQgU0RMX1Jlc3RvcmVEZXNrdG9wTW9kZSh2b2lkKQoreworCisjaWZkZWYgX1dJTjMyX1dDRQorCQorI2lmZGVmIFNETF9WSURFT19EUklWRVJfR0FQSQorCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87CisJaWYoU0RMX3N0cmNtcCh0aGlzLT5uYW1lLCAiZ2FwaSIpID09IDApCisJeworCQlpZiggIXRoaXMtPmhpZGRlbi0+Z2FwaUluZm8tPnN1c3BlbmRlZCApCisJCXsKKwkJCXRoaXMtPmhpZGRlbi0+Z2FwaUluZm8tPnN1c3BlbmRlZCA9IDE7CisJCX0KKwl9CisjZW5kaWYKKwkKKyNlbHNlCisJLyogV2luQ0UgZG9lcyBub3QgaGF2ZSBhIHRhc2tiYXIsIHNvIG1pbmltaXppbmcgaXMgbm90IGNvbnZlbmllbnQgKi8KKwlTaG93V2luZG93KFNETF9XaW5kb3csIFNXX01JTklNSVpFKTsKKyNlbmRpZgorCisjaWZuZGVmIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUworI2lmbmRlZiBfV0lOMzJfV0NFCisJQ2hhbmdlRGlzcGxheVNldHRpbmdzKE5VTEwsIDApOworI2VuZGlmCisjZW5kaWYgLyogTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTICovCit9CisKKyNpZmRlZiBXTV9NT1VTRUxFQVZFCisvKiAKKyAgIFNwZWNpYWwgY29kZSB0byBoYW5kbGUgbW91c2UgbGVhdmUgZXZlbnRzIC0gdGhpcyBzdWNrcy4uLgorICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2tiL2FydGljbGVzL3ExODMvMS8wNy5hc3AKKworICAgVHJhY2tNb3VzZUV2ZW50KCkgaXMgb25seSBhdmFpbGFibGUgb24gV2luOTggYW5kIFdpbk5ULgorICAgX1RyYWNrTW91c2VFdmVudCgpIGlzIGF2YWlsYWJsZSBvbiBXaW45NSwgYnV0IGlzbid0IHlldCBpbiB0aGUgbWluZ3czMgorICAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGFuZCBvbmx5IHdvcmtzIG9uIHN5c3RlbXMgdGhhdCBoYXZlIGhhZCBJRSAzLjAKKyAgIG9yIG5ld2VyIGluc3RhbGxlZCBvbiB0aGVtICh3aGljaCBpcyBub3QgdGhlIGNhc2Ugd2l0aCB0aGUgYmFzZSBXaW45NSkuCisgICBUaGVyZWZvcmUsIHdlIGltcGxlbWVudCBvdXIgb3duIHZlcnNpb24gb2YgX1RyYWNrTW91c2VFdmVudCgpIHdoaWNoCisgICB1c2VzIG91ciBvd24gaW1wbGVtZW50YXRpb24gaWYgVHJhY2tNb3VzZUV2ZW50KCkgaXMgbm90IGF2YWlsYWJsZS4KKyovCitzdGF0aWMgQk9PTCAoV0lOQVBJICpfVHJhY2tNb3VzZUV2ZW50KShUUkFDS01PVVNFRVZFTlQgKnB0bWUpID0gTlVMTDsKKworc3RhdGljIFZPSUQgQ0FMTEJBQ0sKK1RyYWNrTW91c2VUaW1lclByb2MoSFdORCBoV25kLCBVSU5UIHVNc2csIFVJTlQgaWRFdmVudCwgRFdPUkQgZHdUaW1lKQoreworCXVuaW9uIHsgUkVDVCByZWN0OyBQT0lOVCBwdDsgfSByZWN0cHQ7ICAvKiBwcmV2ZW50IHR5cGUtcHVubmluZyBpc3N1ZS4gKi8KKwlQT0lOVCBwdDsKKworCUdldENsaWVudFJlY3QoaFduZCwgJnJlY3RwdC5yZWN0KTsKKwlNYXBXaW5kb3dQb2ludHMoaFduZCwgTlVMTCwgJnJlY3RwdC5wdCwgMik7CisJR2V0Q3Vyc29yUG9zKCZwdCk7CisJaWYgKCAhUHRJblJlY3QoJnJlY3RwdC5yZWN0LCBwdCkgfHwgKFdpbmRvd0Zyb21Qb2ludChwdCkgIT0gaFduZCkgKSB7CisJCWlmICggIUtpbGxUaW1lcihoV25kLCBpZEV2ZW50KSApIHsKKwkJCS8qIEVycm9yIGtpbGxpbmcgdGhlIHRpbWVyISAqLworCQl9CisJCVBvc3RNZXNzYWdlKGhXbmQsIFdNX01PVVNFTEVBVkUsIDAsIDApOworCX0KK30KK3N0YXRpYyBCT09MIFdJTkFQSSBXSU5fVHJhY2tNb3VzZUV2ZW50KFRSQUNLTU9VU0VFVkVOVCAqcHRtZSkKK3sKKwlpZiAoIHB0bWUtPmR3RmxhZ3MgPT0gVE1FX0xFQVZFICkgeworCQlyZXR1cm4gU2V0VGltZXIocHRtZS0+aHduZFRyYWNrLCBwdG1lLT5kd0ZsYWdzLCAxMDAsCisJCSAgICAgICAgICAgICAgICAoVElNRVJQUk9DKVRyYWNrTW91c2VUaW1lclByb2MpICE9IDA7CisJfQorCXJldHVybiBGQUxTRTsKK30KKyNlbmRpZiAvKiBXTV9NT1VTRUxFQVZFICovCisKK2ludCBzeXNldmVudHNfbW91c2VfcHJlc3NlZCA9IDA7CisKKy8qIFRoZSBtYWluIFdpbjMyIGV2ZW50IGhhbmRsZXIKK0RKTTogVGhpcyBpcyBubyBsb25nZXIgc3RhdGljIGFzIChEWDUvRElCKV9DcmVhdGVXaW5kb3cgbmVlZHMgaXQKKyovCitMUkVTVUxUIENBTExCQUNLIFdpbk1lc3NhZ2UoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOwkKKyNpZmRlZiBXTU1TR19ERUJVRworCWZwcmludGYoc3RkZXJyLCAiUmVjZWl2ZWQgd2luZG93cyBtZXNzYWdlOiAgIik7CisJaWYgKCBtc2cgPiBNQVhfV01NU0cgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJWQiLCBtc2cpOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMiLCB3bXRhYlttc2ddKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICIgLS0gMHglWCwgMHglWFxuIiwgd1BhcmFtLCBsUGFyYW0pOworI2VuZGlmCisJc3dpdGNoIChtc2cpIHsKKworCQljYXNlIFdNX0FDVElWQVRFOiB7CisJCQlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOworCQkJQk9PTCBhY3RpdmUsIG1pbmltaXplZDsKKwkJCVVpbnQ4IGFwcHN0YXRlOworCisJCQltaW5pbWl6ZWQgPSBISVdPUkQod1BhcmFtKTsKKwkJCWFjdGl2ZSA9IChMT1dPUkQod1BhcmFtKSAhPSBXQV9JTkFDVElWRSkgJiYgIW1pbmltaXplZDsKKwkJCWlmICggYWN0aXZlICkgeworCQkJCS8qIEdhaW4gdGhlIGZvbGxvd2luZyBzdGF0ZXMgKi8KKwkJCQlhcHBzdGF0ZSA9IFNETF9BUFBBQ1RJVkV8U0RMX0FQUElOUFVURk9DVVM7CisJCQkJaWYgKCAhKFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUElOUFVURk9DVVMpICkgeworCQkJCQlpZiAoIHRoaXMtPmlucHV0X2dyYWIgIT0gU0RMX0dSQUJfT0ZGICkgeworCQkJCQkJV0lOX0dyYWJJbnB1dCh0aGlzLCBTRExfR1JBQl9PTik7CisJCQkJCX0KKwkJCQkJaWYgKCAhIEREUkFXX0ZVTExTQ1JFRU4oKSApIHsKKwkJCQkJCURJQl9Td2FwR2FtbWEodGhpcyk7CisJCQkJCX0KKwkJCQkJaWYgKCBXSU5ESUJfRlVMTFNDUkVFTigpICkgeworCQkJCQkJU0RMX1Jlc3RvcmVHYW1lTW9kZSgpOworCQkJCQl9CisJCQkJfQorI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKKwkJCQlpZiAoIFdJTkRJQl9GVUxMU0NSRUVOKCkgKSB7CisJCQkJCUxvYWRBeWdzaGVsbCgpOworCQkJCQlpZiggU0hGdWxsU2NyZWVuICkKKwkJCQkJCVNIRnVsbFNjcmVlbihTRExfV2luZG93LCBTSEZTX0hJREVTVEFSVElDT058U0hGU19ISURFVEFTS0JBUnxTSEZTX0hJREVTSVBCVVRUT04pOworCQkJCQllbHNlCisJCQkJCQlTaG93V2luZG93KEZpbmRXaW5kb3coVEVYVCgiSEhUYXNrQmFyIiksTlVMTCksU1dfSElERSk7CisJCQkJfQorI2VuZGlmCisJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgYXBwc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBMb3NlIHRoZSBmb2xsb3dpbmcgc3RhdGVzICovCisJCQkJYXBwc3RhdGUgPSBTRExfQVBQSU5QVVRGT0NVUzsKKwkJCQlpZiAoIG1pbmltaXplZCApIHsKKwkJCQkJYXBwc3RhdGUgfD0gU0RMX0FQUEFDVElWRTsKKwkJCQl9CisKKwkJCQlpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUElOUFVURk9DVVMgKSB7CisJCQkJCWlmICggdGhpcy0+aW5wdXRfZ3JhYiAhPSBTRExfR1JBQl9PRkYgKSB7CisJCQkJCQlXSU5fR3JhYklucHV0KHRoaXMsIFNETF9HUkFCX09GRik7CisJCQkJCX0KKwkJCQkJaWYgKCAhIEREUkFXX0ZVTExTQ1JFRU4oKSApIHsKKwkJCQkJCURJQl9Td2FwR2FtbWEodGhpcyk7CisJCQkJCX0KKwkJCQkJaWYgKCBXSU5ESUJfRlVMTFNDUkVFTigpICkgeworCQkJCQkJYXBwc3RhdGUgfD0gU0RMX0FQUE1PVVNFRk9DVVM7CisJCQkJCQlTRExfUmVzdG9yZURlc2t0b3BNb2RlKCk7CisJCQkJCQkvKiBBIGZ1bGxzY3JlZW4gYXBwIGdldHMgaGlkZGVuIGJ1dCB3aWxsIG5vdCBnZXQgYSBtaW5pbWl6ZSBldmVudCAqLworCQkJCQkJYXBwc3RhdGUgfD0gKFNETF9BUFBBQ1RJVkUgfCBTRExfQVBQTU9VU0VGT0NVUyk7CisjaWYgZGVmaW5lZChfV0lOMzJfV0NFKQorCQkJCQkJTG9hZEF5Z3NoZWxsKCk7CisJCQkJCQlpZiggU0hGdWxsU2NyZWVuICkgCisJCQkJCQkJU0hGdWxsU2NyZWVuKFNETF9XaW5kb3csIFNIRlNfU0hPV1NUQVJUSUNPTnxTSEZTX1NIT1dUQVNLQkFSfFNIRlNfU0hPV1NJUEJVVFRPTik7CisJCQkJCQllbHNlCisJCQkJCQkJU2hvd1dpbmRvdyhGaW5kV2luZG93KFRFWFQoIkhIVGFza0JhciIpLE5VTEwpLFNXX1NIT1cpOworI2VuZGlmCisJCQkJCX0KKwkJCQl9CisJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgYXBwc3RhdGUpOworCQkJfQorCQkJV0lOX0FjdGl2YXRlKHRoaXMsIGFjdGl2ZSwgbWluaW1pemVkKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFdNX01PVVNFTU9WRTogeworCisjaWZkZWYgV01fTU9VU0VMRUFWRQorCQkJaWYgKCBTRExfVmlkZW9TdXJmYWNlICkgeworCQkJCS8qIG1vdXNlIGhhcyBlbnRlcmVkIHRoZSB3aW5kb3cgKi8KKworCQkJCWlmICggIShTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBNT1VTRUZPQ1VTKSApIHsKKwkJCQkJVFJBQ0tNT1VTRUVWRU5UIHRtZTsKKworCQkJCQl0bWUuY2JTaXplID0gc2l6ZW9mKHRtZSk7CisJCQkJCXRtZS5kd0ZsYWdzID0gVE1FX0xFQVZFOworCQkJCQl0bWUuaHduZFRyYWNrID0gU0RMX1dpbmRvdzsKKwkJCQkJX1RyYWNrTW91c2VFdmVudCgmdG1lKTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLyogV01fTU9VU0VMRUFWRSAqLworCisJCQkvKiBNb3VzZSBtb3Rpb24gaXMgaGFuZGxlZCBpbiBESUJfUHVtcEV2ZW50cyBvcgorCQkJICogRFg1X1B1bXBFdmVudHMsIGRlcGVuZGluZyBvbiB0aGUgdmlkZW8gZHJpdmVyCisJCQkgKiBpbiB1c2UgKi8KKworCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUE1PVVNFRk9DVVMpOworCQl9CisJCXJldHVybigwKTsKKworI2lmZGVmIFdNX01PVVNFTEVBVkUKKwkJY2FzZSBXTV9NT1VTRUxFQVZFOiB7CisKKwkJCWlmICggU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJCQkvKiBtb3VzZSBoYXMgbGVmdCB0aGUgd2luZG93ICovCisJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOworCQkJfQorCQl9CisJCXJldHVybigwKTsKKyNlbmRpZiAvKiBXTV9NT1VTRUxFQVZFICovCisKKwkJY2FzZSBXTV9MQlVUVE9ORE9XTjoKKwkJY2FzZSBXTV9MQlVUVE9OVVA6CisJCWNhc2UgV01fTUJVVFRPTkRPV046CisJCWNhc2UgV01fTUJVVFRPTlVQOgorCQljYXNlIFdNX1JCVVRUT05ET1dOOgorCQljYXNlIFdNX1JCVVRUT05VUDoKKwkJY2FzZSBXTV9YQlVUVE9ORE9XTjoKKwkJY2FzZSBXTV9YQlVUVE9OVVA6IHsKKwkJCS8qIE1vdXNlIGlzIGhhbmRsZWQgYnkgRGlyZWN0SW5wdXQgd2hlbiBmdWxsc2NyZWVuICovCisJCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgJiYgISBESU5QVVQoKSApIHsKKwkJCQlXT1JEIHhidXR0b252YWwgPSAwOworCQkJCVVpbnQ4IGJ1dHRvbiwgc3RhdGU7CisgICAgICAgICAgICAgICAgaW50IHgsIHk7CisKKwkJCQkvKiBESk06CisJCQkJICAgV2Ugd2FudCB0aGUgU0RMIHdpbmRvdyB0byB0YWtlIGZvY3VzIHNvIHRoYXQKKwkJCQkgICBpdCBhY3RzIGxpa2UgYSBub3JtYWwgd2luZG93cyAiY29tcG9uZW50IgorCQkJCSAgIChlLmcuIGdhaW5zIGtleWJvYXJkIGZvY3VzIG9uIGEgbW91c2UgY2xpY2spLgorCQkJCSAqLworCQkJCVNldEZvY3VzKFNETF9XaW5kb3cpOworCisJCQkJLyogRmlndXJlIG91dCB3aGljaCBidXR0b24gdG8gdXNlICovCisJCQkJc3dpdGNoIChtc2cpIHsKKwkJCQkJY2FzZSBXTV9MQlVUVE9ORE9XTjoKKwkJCQkJCWJ1dHRvbiA9IFNETF9CVVRUT05fTEVGVDsKKwkJCQkJCXN0YXRlID0gU0RMX1BSRVNTRUQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBXTV9MQlVUVE9OVVA6CisJCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX0xFRlQ7CisJCQkJCQlzdGF0ZSA9IFNETF9SRUxFQVNFRDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFdNX01CVVRUT05ET1dOOgorCQkJCQkJYnV0dG9uID0gU0RMX0JVVFRPTl9NSURETEU7CisJCQkJCQlzdGF0ZSA9IFNETF9QUkVTU0VEOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgV01fTUJVVFRPTlVQOgorCQkJCQkJYnV0dG9uID0gU0RMX0JVVFRPTl9NSURETEU7CisJCQkJCQlzdGF0ZSA9IFNETF9SRUxFQVNFRDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFdNX1JCVVRUT05ET1dOOgorCQkJCQkJYnV0dG9uID0gU0RMX0JVVFRPTl9SSUdIVDsKKwkJCQkJCXN0YXRlID0gU0RMX1BSRVNTRUQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBXTV9SQlVUVE9OVVA6CisJCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX1JJR0hUOworCQkJCQkJc3RhdGUgPSBTRExfUkVMRUFTRUQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBXTV9YQlVUVE9ORE9XTjoKKwkJCQkJCXhidXR0b252YWwgPSBHRVRfWEJVVFRPTl9XUEFSQU0od1BhcmFtKTsKKwkJCQkJCWJ1dHRvbiA9IFNETF9CVVRUT05fWDEgKyB4YnV0dG9udmFsIC0gMTsKKwkJCQkJCXN0YXRlID0gU0RMX1BSRVNTRUQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBXTV9YQlVUVE9OVVA6CisJCQkJCQl4YnV0dG9udmFsID0gR0VUX1hCVVRUT05fV1BBUkFNKHdQYXJhbSk7CisJCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX1gxICsgeGJ1dHRvbnZhbCAtIDE7CisJCQkJCQlzdGF0ZSA9IFNETF9SRUxFQVNFRDsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJLyogRWg/IFVua25vd24gYnV0dG9uPyAqLworCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCQlpZiAoIHN0YXRlID09IFNETF9QUkVTU0VEICkgeworCQkJCQkvKiBHcmFiIG1vdXNlIHNvIHdlIGdldCB1cCBldmVudHMgKi8KKwkJCQkJaWYgKCArK3N5c2V2ZW50c19tb3VzZV9wcmVzc2VkID4gMCApIHsKKwkJCQkJCVNldENhcHR1cmUoaHduZCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKiBSZWxlYXNlIG1vdXNlIGFmdGVyIGFsbCB1cCBldmVudHMgKi8KKwkJCQkJaWYgKCAtLXN5c2V2ZW50c19tb3VzZV9wcmVzc2VkIDw9IDAgKSB7CisJCQkJCQlSZWxlYXNlQ2FwdHVyZSgpOworCQkJCQkJc3lzZXZlbnRzX21vdXNlX3ByZXNzZWQgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCWlmICggbW91c2VfcmVsYXRpdmUgKSB7CisJCQkJLyoJUkpSOiBNYXJjaCAyOCwgMjAwMAorCQkJCQlyZXBvcnQgaW50ZXJuYWwgbW91c2UgcG9zaXRpb24gaWYgaW4gcmVsYXRpdmUgbW9kZSAqLworCQkJCQl4ID0gMDsgeSA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJeCA9IChTaW50MTYpTE9XT1JEKGxQYXJhbSk7CisJCQkJCXkgPSAoU2ludDE2KUhJV09SRChsUGFyYW0pOworI2lmZGVmIF9XSU4zMl9XQ0UKKwkJCQkJaWYgKFNETF9WaWRlb1N1cmZhY2UpCisJCQkJCQlHYXBpVHJhbnNmb3JtKHRoaXMtPmhpZGRlbi0+dXNlck9yaWVudGF0aW9uLAordGhpcy0+aGlkZGVuLT5oaXJlc0ZpeCwgJngsICZ5KTsKKyNlbmRpZgorCQkJCX0KKwkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlQnV0dG9uKAorCQkJCQkJCXN0YXRlLCBidXR0b24sIHgsIHkpOworCisJCQkJLyoKKwkJCQkgKiBNU0ROIHNheXM6CisJCQkJICogICJVbmxpa2UgdGhlIFdNX0xCVVRUT05VUCwgV01fTUJVVFRPTlVQLCBhbmQgV01fUkJVVFRPTlVQCisJCQkJICogICBtZXNzYWdlcywgYW4gYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBUUlVFIGZyb20gW2FuIAorCQkJCSAqICAgWEJVVFRPTiBtZXNzYWdlXSBpZiBpdCBwcm9jZXNzZXMgaXQuIERvaW5nIHNvIHdpbGwgYWxsb3cKKwkJCQkgKiAgIHNvZnR3YXJlIHRoYXQgc2ltdWxhdGVzIHRoaXMgbWVzc2FnZSBvbiBNaWNyb3NvZnQgV2luZG93cworCQkJCSAqICAgc3lzdGVtcyBlYXJsaWVyIHRoYW4gV2luZG93cyAyMDAwIHRvIGRldGVybWluZSB3aGV0aGVyCisJCQkJICogICB0aGUgd2luZG93IHByb2NlZHVyZSBwcm9jZXNzZWQgdGhlIG1lc3NhZ2Ugb3IgY2FsbGVkCisJCQkJICogICBEZWZXaW5kb3dQcm9jIHRvIHByb2Nlc3MgaXQuCisJCQkJICovCisJCQkJaWYgKHhidXR0b252YWwgPiAwKQorCQkJCQlyZXR1cm4oVFJVRSk7CisJCQl9CisJCX0KKwkJcmV0dXJuKDApOworCisKKyNpZiAoX1dJTjMyX1dJTk5UID49IDB4MDQwMCkgfHwgKF9XSU4zMl9XSU5ET1dTID4gMHgwNDAwKQorCQljYXNlIFdNX01PVVNFV0hFRUw6IAorCQkJaWYgKCBTRExfVmlkZW9TdXJmYWNlICYmICEgRElOUFVUKCkgKSB7CisJCQkJaW50IG1vdmUgPSAoc2hvcnQpSElXT1JEKHdQYXJhbSk7CisJCQkJaWYgKCBtb3ZlICkgeworCQkJCQlVaW50OCBidXR0b247CisJCQkJCWlmICggbW92ZSA+IDAgKQorCQkJCQkJYnV0dG9uID0gU0RMX0JVVFRPTl9XSEVFTFVQOworCQkJCQllbHNlCisJCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX1dIRUVMRE9XTjsKKwkJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigKKwkJCQkJCVNETF9QUkVTU0VELCBidXR0b24sIDAsIDApOworCQkJCQlwb3N0ZWQgfD0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigKKwkJCQkJCVNETF9SRUxFQVNFRCwgYnV0dG9uLCAwLCAwKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4oMCk7CisjZW5kaWYKKworI2lmZGVmIFdNX0dFVE1JTk1BWElORk8KKwkJLyogVGhpcyBtZXNzYWdlIGlzIHNlbnQgYXMgYSB3YXkgZm9yIHVzIHRvICJjaGVjayIgdGhlIHZhbHVlcworCQkgKiBvZiBhIHBvc2l0aW9uIGNoYW5nZS4gIElmIHdlIGRvbid0IGxpa2UgaXQsIHdlIGNhbiBhZGp1c3QKKwkJICogdGhlIHZhbHVlcyBiZWZvcmUgdGhleSBhcmUgY2hhbmdlZC4KKwkJICovCisJCWNhc2UgV01fR0VUTUlOTUFYSU5GTzogeworCQkJTUlOTUFYSU5GTyAqaW5mbzsKKwkJCVJFQ1QgICAgICAgIHNpemU7CisJCQlpbnQgeCwgeTsKKwkJCWludCBzdHlsZTsKKwkJCWludCB3aWR0aDsKKwkJCWludCBoZWlnaHQ7CisKKwkJCS8qIFdlIGRvbid0IHdhbnQgdG8gY2xvYmJlciBhbiBpbnRlcm5hbCByZXNpemUgKi8KKwkJCWlmICggU0RMX3Jlc2l6aW5nICkKKwkJCQlyZXR1cm4oMCk7CisKKwkJCS8qIFdlIGFsbG93IHJlc2l6aW5nIHdpdGggdGhlIFNETF9SRVNJWkFCTEUgZmxhZyAqLworCQkJaWYgKCBTRExfUHVibGljU3VyZmFjZSAmJgorCQkJCShTRExfUHVibGljU3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkVTSVpBQkxFKSApIHsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisKKwkJCS8qIEdldCB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBvdXIgd2luZG93ICovCisJCQlHZXRXaW5kb3dSZWN0KFNETF9XaW5kb3csICZzaXplKTsKKwkJCXggPSBzaXplLmxlZnQ7CisJCQl5ID0gc2l6ZS50b3A7CisKKwkJCS8qIENhbGN1bGF0ZSBjdXJyZW50IHdpZHRoIGFuZCBoZWlnaHQgb2Ygb3VyIHdpbmRvdyAqLworCQkJc2l6ZS50b3AgPSAwOworCQkJc2l6ZS5sZWZ0ID0gMDsKKwkJCWlmICggU0RMX1B1YmxpY1N1cmZhY2UgIT0gTlVMTCApIHsKKwkJCQlzaXplLmJvdHRvbSA9IFNETF9QdWJsaWNTdXJmYWNlLT5oOworCQkJCXNpemUucmlnaHQgPSBTRExfUHVibGljU3VyZmFjZS0+dzsKKwkJCX0gZWxzZSB7CisJCQkJc2l6ZS5ib3R0b20gPSAwOworCQkJCXNpemUucmlnaHQgPSAwOworCQkJfQorCisJCQkvKiBESk0gLSBhY2NvcmRpbmcgdG8gdGhlIGRvY3MgZm9yIEdldE1lbnUoKSwgdGhlCisJCQkgICByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkIGlmIGh3bmQgaXMgYSBjaGlsZCB3aW5kb3cuCisJCQkgICBBcGFyZW50bHkgaXQncyB0b28gZGlmZmljdWx0IGZvciBNUyB0byBjaGVjaworCQkJICAgaW5zaWRlIHRoZWlyIGZ1bmN0aW9uLCBzbyBJIGhhdmUgdG8gZG8gaXQgaGVyZS4KKyAgICAgICAgICAJCSAqLworICAgICAgICAgCQlzdHlsZSA9IEdldFdpbmRvd0xvbmcoaHduZCwgR1dMX1NUWUxFKTsKKyAgICAgICAgIAkJQWRqdXN0V2luZG93UmVjdCgKKwkJCQkmc2l6ZSwKKwkJCQlzdHlsZSwKKyAgICAgICAgICAgIAkJCXN0eWxlICYgV1NfQ0hJTERXSU5ET1cgPyBGQUxTRQorCQkJCQkJICAgICAgIDogR2V0TWVudShod25kKSAhPSBOVUxMKTsKKworCQkJd2lkdGggPSBzaXplLnJpZ2h0IC0gc2l6ZS5sZWZ0OworCQkJaGVpZ2h0ID0gc2l6ZS5ib3R0b20gLSBzaXplLnRvcDsKKworCQkJLyogRml4IG91ciBzaXplIHRvIHRoZSBjdXJyZW50IHNpemUgKi8KKwkJCWluZm8gPSAoTUlOTUFYSU5GTyAqKWxQYXJhbTsKKwkJCWluZm8tPnB0TWF4U2l6ZS54ID0gd2lkdGg7CisJCQlpbmZvLT5wdE1heFNpemUueSA9IGhlaWdodDsKKwkJCWluZm8tPnB0TWF4UG9zaXRpb24ueCA9IHg7CisJCQlpbmZvLT5wdE1heFBvc2l0aW9uLnkgPSB5OworCQkJaW5mby0+cHRNaW5UcmFja1NpemUueCA9IHdpZHRoOworCQkJaW5mby0+cHRNaW5UcmFja1NpemUueSA9IGhlaWdodDsKKwkJCWluZm8tPnB0TWF4VHJhY2tTaXplLnggPSB3aWR0aDsKKwkJCWluZm8tPnB0TWF4VHJhY2tTaXplLnkgPSBoZWlnaHQ7CisJCX0KKwkJcmV0dXJuKDApOworI2VuZGlmIC8qIFdNX0dFVE1JTk1BWElORk8gKi8KKworCQljYXNlIFdNX1dJTkRPV1BPU0NIQU5HSU5HOiB7CisJCQlXSU5ET1dQT1MgKndpbmRvd3BvcyA9IChXSU5ET1dQT1MqKWxQYXJhbTsKKworCQkJLyogV2hlbiBtZW51IGlzIGF0IHRoZSBzaWRlIG9yIHRvcCwgV2luZG93cyBsaWtlcworCQkJICAgdG8gdHJ5IHRvIHJlcG9zaXRpb24gdGhlIGZ1bGxzY3JlZW4gd2luZG93IHdoZW4KKwkJCSAgIGNoYW5naW5nIHZpZGVvIG1vZGVzLgorCQkJICovCisJCQlpZiAoICFTRExfcmVzaXppbmcgJiYKKwkJCSAgICAgU0RMX1B1YmxpY1N1cmZhY2UgJiYKKwkJCSAgICAgKFNETF9QdWJsaWNTdXJmYWNlLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKKwkJCQl3aW5kb3dwb3MtPnggPSAwOworCQkJCXdpbmRvd3Bvcy0+eSA9IDA7CisJCQl9CisJCX0KKwkJcmV0dXJuKDApOworCisJCWNhc2UgV01fV0lORE9XUE9TQ0hBTkdFRDogeworCQkJU0RMX1ZpZGVvRGV2aWNlICp0aGlzID0gY3VycmVudF92aWRlbzsKKwkJCVBPSU5UIHB0OworCQkJaW50IHcsIGg7CisKKwkJCUdldENsaWVudFJlY3QoU0RMX1dpbmRvdywgJlNETF9ib3VuZHMpOworCisJCQkvKiBhdm9pZGluZyB0eXBlLXB1bm5pbmcgaGVyZS4uLiAqLworCQkJcHQueCA9IFNETF9ib3VuZHMubGVmdDsKKwkJCXB0LnkgPSBTRExfYm91bmRzLnRvcDsKKwkJCUNsaWVudFRvU2NyZWVuKFNETF9XaW5kb3csICZwdCk7CisJCQlTRExfYm91bmRzLmxlZnQgPSBwdC54OworCQkJU0RMX2JvdW5kcy50b3AgPSBwdC55OworCisJCQlwdC54ID0gU0RMX2JvdW5kcy5yaWdodDsKKwkJCXB0LnkgPSBTRExfYm91bmRzLmJvdHRvbTsKKwkJCUNsaWVudFRvU2NyZWVuKFNETF9XaW5kb3csICZwdCk7CisJCQlTRExfYm91bmRzLnJpZ2h0ID0gcHQueDsKKwkJCVNETF9ib3VuZHMuYm90dG9tID0gcHQueTsKKworCQkJaWYgKCAhU0RMX3Jlc2l6aW5nICYmICFJc1pvb21lZChTRExfV2luZG93KSAmJgorCQkJICAgICBTRExfUHVibGljU3VyZmFjZSAmJgorCQkJCSEoU0RMX1B1YmxpY1N1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkgeworCQkJCVNETF93aW5kb3dYID0gU0RMX2JvdW5kcy5sZWZ0OworCQkJCVNETF93aW5kb3dZID0gU0RMX2JvdW5kcy50b3A7CisJCQl9CisJCQl3ID0gU0RMX2JvdW5kcy5yaWdodC1TRExfYm91bmRzLmxlZnQ7CisJCQloID0gU0RMX2JvdW5kcy5ib3R0b20tU0RMX2JvdW5kcy50b3A7CisJCQlpZiAoIHRoaXMtPmlucHV0X2dyYWIgIT0gU0RMX0dSQUJfT0ZGICkgeworCQkJCUNsaXBDdXJzb3IoJlNETF9ib3VuZHMpOworCQkJfQorCQkJaWYgKCBTRExfUHVibGljU3VyZmFjZSAmJiAKKwkJCQkoU0RMX1B1YmxpY1N1cmZhY2UtPmZsYWdzICYgU0RMX1JFU0laQUJMRSkgKSB7CisJCQkJU0RMX1ByaXZhdGVSZXNpemUodywgaCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJLyogV2UgbmVlZCB0byBzZXQgdGhlIGN1cnNvciAqLworCQljYXNlIFdNX1NFVENVUlNPUjogeworCQkJVWludDE2IGhpdHRlc3Q7CisKKwkJCWhpdHRlc3QgPSBMT1dPUkQobFBhcmFtKTsKKwkJCWlmICggaGl0dGVzdCA9PSBIVENMSUVOVCApIHsKKwkJCQlTZXRDdXJzb3IoU0RMX2hjdXJzb3IpOworCQkJCXJldHVybihUUlVFKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCQkvKiBXZSBhcmUgYWJvdXQgdG8gZ2V0IHBhbGV0dGUgZm9jdXMhICovCisJCWNhc2UgV01fUVVFUllORVdQQUxFVFRFOiB7CisJCQlXSU5fUmVhbGl6ZVBhbGV0dGUoY3VycmVudF92aWRlbyk7CisJCQlyZXR1cm4oVFJVRSk7CisJCX0KKwkJYnJlYWs7CisKKwkJLyogQW5vdGhlciBhcHBsaWNhdGlvbiBjaGFuZ2VkIHRoZSBwYWxldHRlICovCisJCWNhc2UgV01fUEFMRVRURUNIQU5HRUQ6IHsKKwkJCVdJTl9QYWxldHRlQ2hhbmdlZChjdXJyZW50X3ZpZGVvLCAoSFdORCl3UGFyYW0pOworCQl9CisJCWJyZWFrOworCisJCS8qIFdlIHdlcmUgb2NjbHVkZWQsIHJlZnJlc2ggb3VyIGRpc3BsYXkgKi8KKwkJY2FzZSBXTV9QQUlOVDogeworCQkJSERDIGhkYzsKKwkJCVBBSU5UU1RSVUNUIHBzOworCisJCQloZGMgPSBCZWdpblBhaW50KFNETF9XaW5kb3csICZwcyk7CisJCQlpZiAoIGN1cnJlbnRfdmlkZW8tPnNjcmVlbiAmJgorCQkJICAgICAhKGN1cnJlbnRfdmlkZW8tPnNjcmVlbi0+ZmxhZ3MgJiBTRExfT1BFTkdMKSApIHsKKwkJCQlXSU5fV2luUEFJTlQoY3VycmVudF92aWRlbywgaGRjKTsKKwkJCX0KKwkJCUVuZFBhaW50KFNETF9XaW5kb3csICZwcyk7CisJCX0KKwkJcmV0dXJuKDApOworCisJCS8qIERKTTogU2VuZCBhbiBleHBvc2UgZXZlbnQgaW4gdGhpcyBjYXNlICovCisJCWNhc2UgV01fRVJBU0VCS0dORDogeworCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVFeHBvc2UoKTsKKwkJfQorCQlyZXR1cm4oMCk7CisKKwkJY2FzZSBXTV9DTE9TRTogeworCQkJaWYgKCAocG9zdGVkID0gU0RMX1ByaXZhdGVRdWl0KCkpICkKKwkJCQlQb3N0UXVpdE1lc3NhZ2UoMCk7CisJCX0KKwkJcmV0dXJuKDApOworCisJCWNhc2UgV01fREVTVFJPWTogeworCQkJUG9zdFF1aXRNZXNzYWdlKDApOworCQl9CisJCXJldHVybigwKTsKKworI2lmbmRlZiBOT19HRVRLRVlCT0FSRFNUQVRFCisJCWNhc2UgV01fSU5QVVRMQU5HQ0hBTkdFOgorI2lmbmRlZiBfV0lONjQKKwkJCWNvZGVwYWdlID0gR2V0Q29kZVBhZ2UoKTsKKyNlbmRpZgorCQlyZXR1cm4oVFJVRSk7CisjZW5kaWYKKworCQlkZWZhdWx0OiB7CisJCQkvKiBTcGVjaWFsIGhhbmRsaW5nIGJ5IHRoZSB2aWRlbyBkcml2ZXIgKi8KKwkJCWlmIChIYW5kbGVNZXNzYWdlKSB7CisJCQkJcmV0dXJuKEhhbmRsZU1lc3NhZ2UoY3VycmVudF92aWRlbywKKwkJCSAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuKERlZldpbmRvd1Byb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSkpOworfQorCisvKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gaGFuZGxlIHRvIGJlIHN0b3JlZCBhbmQgcmV0cmlldmVkIGxhdGVyICovCitzdGF0aWMgdm9pZCAqU0RMX2hhbmRsZSA9IE5VTEw7CisKK3ZvaWQgU0RMX1NldE1vZHVsZUhhbmRsZSh2b2lkICpoYW5kbGUpCit7CisJU0RMX2hhbmRsZSA9IGhhbmRsZTsKK30KK3ZvaWQgKlNETF9HZXRNb2R1bGVIYW5kbGUodm9pZCkKK3sKKwl2b2lkICpoYW5kbGU7CisKKwlpZiAoIFNETF9oYW5kbGUgKSB7CisJCWhhbmRsZSA9IFNETF9oYW5kbGU7CisJfSBlbHNlIHsKKwkJaGFuZGxlID0gR2V0TW9kdWxlSGFuZGxlKE5VTEwpOworCX0KKwlyZXR1cm4oaGFuZGxlKTsKK30KKworLyogVGhpcyBhbGxvd3MgdGhlIFNETF9XSU5ET1dJRCBoYWNrICovCitCT09MIFNETF93aW5kb3dpZCA9IEZBTFNFOworCitzdGF0aWMgaW50IGFwcF9yZWdpc3RlcmVkID0gMDsKKworLyogUmVnaXN0ZXIgdGhlIGNsYXNzIGZvciB0aGlzIGFwcGxpY2F0aW9uIC0tIGV4cG9ydGVkIGZvciB3aW5tYWluLmMgKi8KK2ludCBTRExfUmVnaXN0ZXJBcHAoY2hhciAqbmFtZSwgVWludDMyIHN0eWxlLCB2b2lkICpoSW5zdCkKK3sKKwlXTkRDTEFTUyBjbGFzczsKKyNpZmRlZiBXTV9NT1VTRUxFQVZFCisJSE1PRFVMRSBoYW5kbGU7CisjZW5kaWYKKworCS8qIE9ubHkgZG8gdGhpcyBvbmNlLi4uICovCisJaWYgKCBhcHBfcmVnaXN0ZXJlZCApIHsKKwkJKythcHBfcmVnaXN0ZXJlZDsKKwkJcmV0dXJuKDApOworCX0KKworI2lmbmRlZiBDU19CWVRFQUxJR05DTElFTlQKKyNkZWZpbmUgQ1NfQllURUFMSUdOQ0xJRU5UCTAKKyNlbmRpZgorCWlmICggISBuYW1lICYmICEgU0RMX0FwcG5hbWUgKSB7CisJCW5hbWUgPSAiU0RMX2FwcCI7CisJCVNETF9BcHBzdHlsZSA9IENTX0JZVEVBTElHTkNMSUVOVDsKKwkJU0RMX0luc3RhbmNlID0gaEluc3QgPyBoSW5zdCA6IFNETF9HZXRNb2R1bGVIYW5kbGUoKTsKKwl9CisKKwlpZiAoIG5hbWUgKSB7CisjaWZkZWYgX1dJTjMyX1dDRQorCQkvKiBXaW5DRSB1c2VzIHRoZSBVTklDT0RFIHZlcnNpb24gKi8KKwkJU0RMX0FwcG5hbWUgPSBTRExfaWNvbnZfdXRmOF91Y3MyKG5hbWUpOworI2Vsc2UKKwkJU0RMX0FwcG5hbWUgPSBTRExfaWNvbnZfdXRmOF9sb2NhbGUobmFtZSk7CisjZW5kaWYgLyogX1dJTjMyX1dDRSAqLworCQlTRExfQXBwc3R5bGUgPSBzdHlsZTsKKwkJU0RMX0luc3RhbmNlID0gaEluc3QgPyBoSW5zdCA6IFNETF9HZXRNb2R1bGVIYW5kbGUoKTsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgYXBwbGljYXRpb24gY2xhc3MgKi8KKwljbGFzcy5oQ3Vyc29yCQk9IE5VTEw7CisJY2xhc3MuaEljb24JCT0gTG9hZEltYWdlKFNETF9JbnN0YW5jZSwgU0RMX0FwcG5hbWUsCisJCQkJICAgICAgICAgICAgSU1BR0VfSUNPTiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBMUl9ERUZBVUxUQ09MT1IpOworCWNsYXNzLmxwc3pNZW51TmFtZQk9IE5VTEw7CisJY2xhc3MubHBzekNsYXNzTmFtZQk9IFNETF9BcHBuYW1lOworCWNsYXNzLmhickJhY2tncm91bmQJPSBOVUxMOworCWNsYXNzLmhJbnN0YW5jZQkJPSBTRExfSW5zdGFuY2U7CisJY2xhc3Muc3R5bGUJCT0gU0RMX0FwcHN0eWxlOworI2lmIFNETF9WSURFT19PUEVOR0wKKwljbGFzcy5zdHlsZQkJfD0gQ1NfT1dOREM7CisjZW5kaWYKKwljbGFzcy5scGZuV25kUHJvYwk9IFdpbk1lc3NhZ2U7CisJY2xhc3MuY2JXbmRFeHRyYQk9IDA7CisJY2xhc3MuY2JDbHNFeHRyYQk9IDA7CisJaWYgKCAhIFJlZ2lzdGVyQ2xhc3MoJmNsYXNzKSApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCByZWdpc3RlciBhcHBsaWNhdGlvbiBjbGFzcyIpOworCQlyZXR1cm4oLTEpOworCX0KKworI2lmZGVmIFdNX01PVVNFTEVBVkUKKwkvKiBHZXQgdGhlIHZlcnNpb24gb2YgVHJhY2tNb3VzZUV2ZW50KCkgd2UgdXNlICovCisJX1RyYWNrTW91c2VFdmVudCA9IE5VTEw7CisJaGFuZGxlID0gR2V0TW9kdWxlSGFuZGxlKCJVU0VSMzIuRExMIik7CisJaWYgKCBoYW5kbGUgKSB7CisJCV9UcmFja01vdXNlRXZlbnQgPSAoQk9PTCAoV0lOQVBJICopKFRSQUNLTU9VU0VFVkVOVCAqKSlHZXRQcm9jQWRkcmVzcyhoYW5kbGUsICJUcmFja01vdXNlRXZlbnQiKTsKKwl9CisJaWYgKCBfVHJhY2tNb3VzZUV2ZW50ID09IE5VTEwgKSB7CisJCV9UcmFja01vdXNlRXZlbnQgPSBXSU5fVHJhY2tNb3VzZUV2ZW50OworCX0KKyNlbmRpZiAvKiBXTV9NT1VTRUxFQVZFICovCisKKyNpZm5kZWYgTk9fR0VUS0VZQk9BUkRTVEFURQorI2lmbmRlZiBfV0lONjQKKwkvKiBJbml0aWFsaXNlIHZhcmlhYmxlcyBmb3IgU0RMX1RvVW5pY29kZSgpICovCisJY29kZXBhZ2UgPSBHZXRDb2RlUGFnZSgpOworCisJLyogQ3lnd2luIGhlYWRlcnMgZG9uJ3QgbWF0Y2ggd2luZG93cy5oLCBzbyB3ZSBoYXZlIHRvIGNhc3QgYXJvdW5kIGEKKwkgICBjb25zdCBpc3N1ZSBoZXJlLi4uICovCisJU0RMX1RvVW5pY29kZSA9IElzOXhNRSgpID8gVG9Vbmljb2RlOXhNRSA6IChUb1VuaWNvZGVGTikgVG9Vbmljb2RlOworI2VuZGlmCisjZW5kaWYgLyogTk9fR0VUS0VZQk9BUkRTVEFURSAqLworCisJYXBwX3JlZ2lzdGVyZWQgPSAxOworCXJldHVybigwKTsKK30KKworLyogVW5yZWdpc3RlcnMgdGhlIHdpbmRvd2NsYXNzIHJlZ2lzdGVyZWQgaW4gU0RMX1JlZ2lzdGVyQXBwIGFib3ZlLiAqLwordm9pZCBTRExfVW5yZWdpc3RlckFwcCgpCit7CisJV05EQ0xBU1MgY2xhc3M7CisKKwkvKiBTRExfUmVnaXN0ZXJBcHAgbWlnaHQgbm90IGhhdmUgYmVlbiBjYWxsZWQgYmVmb3JlICovCisJaWYgKCAhYXBwX3JlZ2lzdGVyZWQgKSB7CisJCXJldHVybjsKKwl9CisJLS1hcHBfcmVnaXN0ZXJlZDsKKwlpZiAoIGFwcF9yZWdpc3RlcmVkID09IDAgKSB7CisJCS8qIENoZWNrIGZvciBhbnkgcmVnaXN0ZXJlZCB3aW5kb3cgY2xhc3Nlcy4gKi8KKwkJaWYgKCBHZXRDbGFzc0luZm8oU0RMX0luc3RhbmNlLCBTRExfQXBwbmFtZSwgJmNsYXNzKSApIHsKKwkJCVVucmVnaXN0ZXJDbGFzcyhTRExfQXBwbmFtZSwgU0RMX0luc3RhbmNlKTsKKwkJfQorCQlTRExfZnJlZShTRExfQXBwbmFtZSk7CisJCVNETF9BcHBuYW1lID0gTlVMTDsKKwl9Cit9CisKKyNpZm5kZWYgTk9fR0VUS0VZQk9BUkRTVEFURQorI2lmbmRlZiBfV0lONjQKKy8qIEpGUDogSW1wbGVtZW50YXRpb24gb2YgVG9Vbmljb2RlKCkgdGhhdCB3b3JrcyBvbiA5eC9NRS8ySy9YUCAqLworCitzdGF0aWMgaW50IElzOXhNRSgpCit7CisJT1NWRVJTSU9OSU5GTyAgIGluZm87CisKKwlTRExfbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCWluZm8uZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihpbmZvKTsKKwlpZiAoIUdldFZlcnNpb25FeCgmaW5mbykpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAoaW5mby5kd1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1MpOworfQorCitzdGF0aWMgaW50IEdldENvZGVQYWdlKCkKK3sKKwljaGFyCWJ1ZmZbOF07CisJaW50CWxjaWQgPSBNQUtFTENJRChMT1dPUkQoR2V0S2V5Ym9hcmRMYXlvdXQoMCkpLCBTT1JUX0RFRkFVTFQpOworCWludAljcCA9IEdldEFDUCgpOworCisJaWYgKEdldExvY2FsZUluZm8obGNpZCwgTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLCBidWZmLCBzaXplb2YoYnVmZikpKSB7CisJCWNwID0gU0RMX2F0b2koYnVmZik7CisJfQorCXJldHVybiBjcDsKK30KKworc3RhdGljIGludCBXSU5BUEkgVG9Vbmljb2RlOXhNRShVSU5UIHZrZXksIFVJTlQgc2NhbmNvZGUsIGNvbnN0IEJZVEUgKmtleXN0YXRlLCBMUFdTVFIgd2NoYXJzLCBpbnQgd3NpemUsIFVJTlQgZmxhZ3MpCit7CisJQllURQljaGFyc1syXTsKKworCS8qIGFyZyAjMyBzaG91bGQgYmUgY29uc3QgQllURSAqLCBidXQgY3lnd2luIGxpc3RzIGl0IGFzIFBCWVRFLiAqLworCWlmIChUb0FzY2lpRXgodmtleSwgc2NhbmNvZGUsIChQQllURSkga2V5c3RhdGUsIChXT1JEKiljaGFycywgMCwgR2V0S2V5Ym9hcmRMYXlvdXQoMCkpID09IDEpIHsKKwkJcmV0dXJuIE11bHRpQnl0ZVRvV2lkZUNoYXIoY29kZXBhZ2UsIDAsIChMUENTVFIpIGNoYXJzLCAxLCB3Y2hhcnMsIHdzaXplKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiAhTk9fR0VUS0VZQk9BUkRTVEFURSAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c21vdXNlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzbW91c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQxN2UwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c21vdXNlLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vU0RMX2N1cnNvcl9jLmgiCisjaW5jbHVkZSAiU0RMX3N5c21vdXNlX2MuaCIKKyNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgVVNFX1NUQVRJQ19DVVJTT1IKKyNlbmRpZgorCitIQ1VSU09SCVNETF9oY3Vyc29yID0gTlVMTDsJCS8qIEV4cG9ydGVkIGZvciBTRExfZXZlbnRsb29wLmMgKi8KKworLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCisvKiBGb3Igc29tZSByZWFzb24gd2hlbiBjcmVhdGluZyBhIHdpbmRvd3MgY3Vyc29yLCB0aGUgYW5kcyBhbmQgeG9ycyBtZW1vcnkKKyAgIGlzIG5vdCBjb3BpZWQsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBpdCBhbmQgZnJlZSBpdCB3aGVuIHdlIGFyZSBkb25lCisgICB3aXRoIHRoZSBjdXJzb3IuICBJZiB3ZSBmcmVlIHRoZSBtZW1vcnkgcHJlbWF0dXJlbHksIHRoZSBhcHAgY3Jhc2hlcy4gOi19CisqLworc3RydWN0IFdNY3Vyc29yIHsKKwlIQ1VSU09SIGN1cnM7CisjaWZuZGVmIFVTRV9TVEFUSUNfQ1VSU09SCisJVWludDggKmFuZHM7CisJVWludDggKnhvcnM7CisjZW5kaWYKK307CisKKy8qIENvbnZlcnQgYml0cyB0byBwYWRkZWQgYnl0ZXMgKi8KKyNkZWZpbmUgUEFEX0JJVFMoYml0cykJKChiaXRzKzcpLzgpCisKKyNpZmRlZiBDVVJTT1JfREVCVUcKK3N0YXRpYyB2b2lkIFByaW50QklUTUFQKEZJTEUgKm91dCwgY2hhciAqYml0cywgaW50IHcsIGludCBoKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgY2g7CisKKwl3aGlsZSAoIGgtLSA+IDAgKSB7CisJCWZvciAoIGk9MDsgaTx3OyArK2kgKSB7CisJCQlpZiAoIChpJTgpID09IDAgKQorCQkJCWNoID0gKmJpdHMrKzsKKwkJCWlmICggY2gmMHg4MCApCisJCQkJZnByaW50ZihvdXQsICJYIik7CisJCQllbHNlCisJCQkJZnByaW50ZihvdXQsICIgIik7CisJCQljaCA8PD0gMTsKKwkJfQorCQlmcHJpbnRmKG91dCwgIlxuIik7CisJfQorfQorI2VuZGlmCisKKyNpZm5kZWYgVVNFX1NUQVRJQ19DVVJTT1IKKy8qIExvY2FsIGZ1bmN0aW9ucyB0byBjb252ZXJ0IHRoZSBTREwgY3Vyc29yIG1hc2sgaW50byBXaW5kb3dzIGZvcm1hdCAqLworc3RhdGljIHZvaWQgbWVtbm90KFVpbnQ4ICpkc3QsIFVpbnQ4ICpzcmMsIGludCBsZW4pCit7CisJd2hpbGUgKCBsZW4tLSA+IDAgKQorCQkqZHN0KysgPSB+KnNyYysrOworfQorc3RhdGljIHZvaWQgbWVteG9yKFVpbnQ4ICpkc3QsIFVpbnQ4ICpzcmMxLCBVaW50OCAqc3JjMiwgaW50IGxlbikKK3sKKwl3aGlsZSAoIGxlbi0tID4gMCApCisJCSpkc3QrKyA9ICgqc3JjMSsrKV4oKnNyYzIrKyk7Cit9CisjZW5kaWYgLyogIVVTRV9TVEFUSUNfQ1VSU09SICovCisKK3ZvaWQgV0lOX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcikKK3sKKyNpZm5kZWYgVVNFX1NUQVRJQ19DVVJTT1IKKwlpZiAoIGN1cnNvci0+Y3VycyA9PSBHZXRDdXJzb3IoKSApCisJCVNldEN1cnNvcihOVUxMKTsKKwlpZiAoIGN1cnNvci0+Y3VycyAhPSBOVUxMICkKKwkJRGVzdHJveUN1cnNvcihjdXJzb3ItPmN1cnMpOworCWlmICggY3Vyc29yLT5hbmRzICE9IE5VTEwgKQorCQlTRExfZnJlZShjdXJzb3ItPmFuZHMpOworCWlmICggY3Vyc29yLT54b3JzICE9IE5VTEwgKQorCQlTRExfZnJlZShjdXJzb3ItPnhvcnMpOworI2VuZGlmIC8qICFVU0VfU1RBVElDX0NVUlNPUiAqLworCVNETF9mcmVlKGN1cnNvcik7Cit9CisKK1dNY3Vyc29yICpXSU5fQ3JlYXRlV01DdXJzb3IoX1RISVMsCisJCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKK3sKKyNpZmRlZiBVU0VfU1RBVElDX0NVUlNPUgorCVdNY3Vyc29yICpjdXJzb3I7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY3Vyc29yICovCisJY3Vyc29yID0gKFdNY3Vyc29yICopU0RMX21hbGxvYyhzaXplb2YoKmN1cnNvcikpOworCWlmICggY3Vyc29yICkgeworCQljdXJzb3ItPmN1cnMgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7CisJfQorCXJldHVybihjdXJzb3IpOworI2Vsc2UKKwlXTWN1cnNvciAqY3Vyc29yOworCWludCBhbGxvd2VkX3g7CisJaW50IGFsbG93ZWRfeTsKKwlpbnQgcnVuLCBwYWQsIGk7CisJVWludDggKmFwdHIsICp4cHRyOworCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjdXJzb3Igc2l6ZSBpcyBva2F5ICovCisJYWxsb3dlZF94ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWENVUlNPUik7CisJYWxsb3dlZF95ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUNVUlNPUik7CisJaWYgKCAodyA+IGFsbG93ZWRfeCkgfHwgKGggPiBhbGxvd2VkX3kpICkgeworCQlTRExfU2V0RXJyb3IoIk9ubHkgY3Vyc29ycyBvZiBkaW1lbnNpb24gKCVkeCVkKSBhcmUgYWxsb3dlZCIsCisJCQkJCQkJYWxsb3dlZF94LCBhbGxvd2VkX3kpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIGN1cnNvciAqLworCWN1cnNvciA9IChXTWN1cnNvciAqKVNETF9tYWxsb2Moc2l6ZW9mKCpjdXJzb3IpKTsKKwlpZiAoIGN1cnNvciA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwljdXJzb3ItPmN1cnMgPSBOVUxMOworCWN1cnNvci0+YW5kcyA9IE5VTEw7CisJY3Vyc29yLT54b3JzID0gTlVMTDsKKworCS8qIFBhZCBvdXQgdG8gdGhlIG5vcm1hbCBjdXJzb3Igc2l6ZSAqLworCXJ1biA9IFBBRF9CSVRTKHcpOworCXBhZCA9IFBBRF9CSVRTKGFsbG93ZWRfeCktcnVuOworCWFwdHIgPSBjdXJzb3ItPmFuZHMgPSAoVWludDggKilTRExfbWFsbG9jKChydW4rcGFkKSphbGxvd2VkX3kpOworCXhwdHIgPSBjdXJzb3ItPnhvcnMgPSAoVWludDggKilTRExfbWFsbG9jKChydW4rcGFkKSphbGxvd2VkX3kpOworCWlmICggKGFwdHIgPT0gTlVMTCkgfHwgKHhwdHIgPT0gTlVMTCkgKSB7CisJCVdJTl9GcmVlV01DdXJzb3IoTlVMTCwgY3Vyc29yKTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisJZm9yICggaT0wOyBpPGg7ICsraSApIHsKKwkJbWVteG9yKHhwdHIsIGRhdGEsIG1hc2ssIHJ1bik7CisJCXhwdHIgKz0gcnVuOworCQlkYXRhICs9IHJ1bjsKKwkJbWVtbm90KGFwdHIsIG1hc2ssIHJ1bik7CisJCW1hc2sgKz0gcnVuOworCQlhcHRyICs9IHJ1bjsKKwkJU0RMX21lbXNldCh4cHRyLCAgMCwgcGFkKTsKKwkJeHB0ciArPSBwYWQ7CisJCVNETF9tZW1zZXQoYXB0ciwgfjAsIHBhZCk7CisJCWFwdHIgKz0gcGFkOworCX0KKwlwYWQgKz0gcnVuOworCWZvciAoIDsgaTxhbGxvd2VkX3k7ICsraSApIHsKKwkJU0RMX21lbXNldCh4cHRyLCAgMCwgcGFkKTsKKwkJeHB0ciArPSBwYWQ7CisJCVNETF9tZW1zZXQoYXB0ciwgfjAsIHBhZCk7CisJCWFwdHIgKz0gcGFkOworCX0KKworCS8qIENyZWF0ZSB0aGUgY3Vyc29yICovCisJY3Vyc29yLT5jdXJzID0gQ3JlYXRlQ3Vyc29yKAorCQkJKEhJTlNUQU5DRSlHZXRXaW5kb3dMb25nUHRyKFNETF9XaW5kb3csIEdXTFBfSElOU1RBTkNFKSwKKwkJCQkJaG90X3gsIGhvdF95LCBhbGxvd2VkX3gsIGFsbG93ZWRfeSwgCisJCQkJCQljdXJzb3ItPmFuZHMsIGN1cnNvci0+eG9ycyk7CisJaWYgKCBjdXJzb3ItPmN1cnMgPT0gTlVMTCApIHsKKwkJV0lOX0ZyZWVXTUN1cnNvcihOVUxMLCBjdXJzb3IpOworCQlTRExfU2V0RXJyb3IoIldpbmRvd3MgY291bGRuJ3QgY3JlYXRlIHRoZSByZXF1ZXN0ZWQgY3Vyc29yIik7CisJCXJldHVybihOVUxMKTsKKwl9CisJcmV0dXJuKGN1cnNvcik7CisjZW5kaWYgLyogVVNFX1NUQVRJQ19DVVJTT1IgKi8KK30KKworaW50IFdJTl9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCit7CisJUE9JTlQgbW91c2VfcG9zOworCisJaWYgKCAhdGhpcy0+c2NyZWVuICkgeworCQlyZXR1cm4oMCk7CisJfQorCisJLyogU2V0IHRoZSB3aW5kb3cgY3Vyc29yIHRvIG91ciBjdXJzb3IsIGlmIGFwcGxpY2FibGUgKi8KKwlpZiAoIGN1cnNvciAhPSBOVUxMICkgeworCQlTRExfaGN1cnNvciA9IGN1cnNvci0+Y3VyczsKKwl9IGVsc2UgeworCQlTRExfaGN1cnNvciA9IE5VTEw7CisJfQorCUdldEN1cnNvclBvcygmbW91c2VfcG9zKTsKKwlpZiAoIFB0SW5SZWN0KCZTRExfYm91bmRzLCBtb3VzZV9wb3MpICkgeworCQlTZXRDdXJzb3IoU0RMX2hjdXJzb3IpOworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3ZvaWQgV0lOX1dhcnBXTUN1cnNvcihfVEhJUywgVWludDE2IHgsIFVpbnQxNiB5KQoreworCWlmICggbW91c2VfcmVsYXRpdmUpIHsKKwkJLyoJUkpSOiBNYXJjaCAyOCwgMjAwMAorCQkJbGVhdmUgcGh5c2ljYWwgY3Vyc29yIGF0IGNlbnRlciBvZiBzY3JlZW4gaWYKKwkJCW1vdXNlIGhpZGRlbiBhbmQgZ3JhYmJlZCAqLworCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHgsIHkpOworCX0gZWxzZSB7CisJCVBPSU5UIHB0OworCisJCS8qIFdpdGggRGlyZWN0SW5wdXQgdGhlIHBvc2l0aW9uIGRvZXNuJ3QgZm9sbG93CisJCSAqIHRoZSBjdXJzb3IsIHNvIGl0IGlzIHNldCBtYW51YWxseSAqLworCQlpZiAoIERJTlBVVCgpICkgeworCQkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCB4LCB5KTsKKwkJfQorCisJCXB0LnggPSB4OworCQlwdC55ID0geTsKKwkJQ2xpZW50VG9TY3JlZW4oU0RMX1dpbmRvdywgJnB0KTsKKwkJU2V0Q3Vyc29yUG9zKHB0LngsIHB0LnkpOworCX0KK30KKworLyogVXBkYXRlIHRoZSBjdXJyZW50IG1vdXNlIHN0YXRlIGFuZCBwb3NpdGlvbiAqLwordm9pZCBXSU5fVXBkYXRlTW91c2UoX1RISVMpCit7CisJUE9JTlQgcHQ7CisKKwkvKiBBbHdheXMgdW5zZXQgU0RMX0FQUE1PVVNFRk9DVVMgdG8gZ2l2ZSB0aGUgV01fTU9VU0VNT1ZFIGV2ZW50CisJICogaGFuZGxlciBhIGNoYW5jZSB0byBpbnN0YWxsIGEgVFJBQ0tNT1VTRUVWRU5UICovCisJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOworCisJR2V0Q3Vyc29yUG9zKCZwdCk7CisJU2NyZWVuVG9DbGllbnQoU0RMX1dpbmRvdywgJnB0KTsKKwlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsMCwgKFNpbnQxNilwdC54LCAoU2ludDE2KXB0LnkpOworfQorCisvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBlbnRlciBvciBsZWF2ZSBtb3VzZSByZWxhdGl2ZSBtb2RlICovCit2b2lkIFdJTl9DaGVja01vdXNlTW9kZShfVEhJUykKK3sKKyNpZm5kZWYgX1dJTjMyX1dDRSAKKyAgICAgICAgLyogSWYgdGhlIG1vdXNlIGlzIGhpZGRlbiBhbmQgaW5wdXQgaXMgZ3JhYmJlZCwgd2UgdXNlIHJlbGF0aXZlIG1vZGUgKi8KKyAgICAgICAgaWYgKCAhKFNETF9jdXJzb3JzdGF0ZSAmIENVUlNPUl9WSVNJQkxFKSAmJgorICAgICAgICAgICAgICh0aGlzLT5pbnB1dF9ncmFiICE9IFNETF9HUkFCX09GRikgKSB7CisgICAgICAgICAgICAgICAgbW91c2VfcmVsYXRpdmUgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1vdXNlX3JlbGF0aXZlID0gMDsKKyAgICAgICAgfQorI2Vsc2UKKwkJbW91c2VfcmVsYXRpdmUgPSAgMDsgCisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9zeXNtb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzbW91c2VfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWZlOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzbW91c2VfYy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX2xvd3ZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgV0lOX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gV01jdXJzb3IgKldJTl9DcmVhdGVXTUN1cnNvcihfVEhJUywKKwkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKK2V4dGVybiBpbnQgV0lOX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gdm9pZCBXSU5fV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpOworZXh0ZXJuIHZvaWQgV0lOX1VwZGF0ZU1vdXNlKF9USElTKTsKK2V4dGVybiB2b2lkIFdJTl9DaGVja01vdXNlTW9kZShfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzd20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luY29tbW9uL1NETF9zeXN3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNGQ5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzd20uYwpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgIlNETF92ZXJzaW9uLmgiCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2xvYWRzby5oIgorI2luY2x1ZGUgIlNETF9zeXN3bS5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uL1NETF9jdXJzb3JfYy5oIgorI2luY2x1ZGUgIlNETF9zeXN3bV9jLmgiCisjaW5jbHVkZSAiU0RMX3dpbmdsX2MuaCIKKworCisjaWZkZWYgX1dJTjMyX1dDRQorI2RlZmluZSBESVNBQkxFX0lDT05fU1VQUE9SVAorI2VuZGlmCisKKy8qIFRoZSBzY3JlZW4gaWNvbiAtLSBuZWVkcyB0byBiZSBmcmVlZCBvbiBTRExfVmlkZW9RdWl0KCkgKi8KK0hJQ09OICAgc2NyZWVuX2ljbiA9IE5VTEw7CisKKy8qIFdpbjMyIGljb24gbWFzayBzZW1hbnRpY3MgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIG9mIFNETDoKKyAgICAgU0RMIGFwcGxpZXMgdGhlIG1hc2sgdG8gdGhlIGljb24gYW5kIGNvcGllcyByZXN1bHQgdG8gZGVza3RvcC4KKyAgICAgV2luMzIgYXBwbGllcyB0aGUgbWFzayB0byB0aGUgZGVza3RvcCBhbmQgWE9ScyB0aGUgaWNvbiBvbi4KKyAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgU0RMIG1hc2sgbmVlZHMgdG8gYmUgYXBwbGllZCB0byB0aGUgaWNvbiBhbmQKKyAgIHRoZW4gaW52ZXJ0ZWQgYW5kIHBhc3NlZCB0byBXaW4zMi4KKyovCit2b2lkIFdJTl9TZXRXTUljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzaykKK3sKKyNpZmRlZiBESVNBQkxFX0lDT05fU1VQUE9SVAorCXJldHVybjsKKyNlbHNlCisJU0RMX1BhbGV0dGUgKnBhbF8yNTY7CisJU0RMX1N1cmZhY2UgKmljb25fMjU2OworCVVpbnQ4ICpwZGF0YSwgKnB3aW4zMjsKKwlVaW50OCAqbWRhdGEsICptd2luMzIsIG0gPSAwOworCWludCBpY29uX2xlbjsKKwlpbnQgaWNvbl9wbGVuOworCWludCBpY29uX21sZW47CisJaW50IGljb25fcGl0Y2g7CisJaW50IG1hc2tfcGl0Y2g7CisJU0RMX1JlY3QgYm91bmRzOworCWludCBpLCBza2lwOworCWludCByb3csIGNvbDsKKwlzdHJ1Y3QgLyogcXVhc2ktQk1QIGZvcm1hdCAqLyBXaW4zMkljb24geworCQlVaW50MzIgYmlTaXplOworCQlTaW50MzIgYmlXaWR0aDsKKwkJU2ludDMyIGJpSGVpZ2h0OworCQlVaW50MTYgYmlQbGFuZXM7CisJCVVpbnQxNiBiaUJpdENvdW50OworCQlVaW50MzIgYmlDb21wcmVzc2lvbjsKKwkJVWludDMyIGJpU2l6ZUltYWdlOworCQlTaW50MzIgYmlYUGVsc1Blck1ldGVyOworCQlTaW50MzIgYmlZUGVsc1Blck1ldGVyOworCQlVaW50MzIgYmlDbHJVc2VkOworCQlVaW50MzIgYmlDbHJJbXBvcnRhbnQ7CisJCXN0cnVjdCAvKiBSR0JRVUFEIC0tIG5vdGUgaXQncyBCR1Igb3JkZXJlZCAqLyB7CisJCQlVaW50OCByZ2JCbHVlOworCQkJVWludDggcmdiR3JlZW47CisJCQlVaW50OCByZ2JSZWQ7CisJCQlVaW50OCByZ2JSZXNlcnZlZDsKKwkJfSBiaUNvbG9yc1syNTZdOworCQkvKiBQaXhlbHM6CisJCVVpbnQ4IHBpeGVsc1tdCisJCSovCisJCS8qIE1hc2s6CisJCVVpbnQ4IG1hc2tbXQorCQkqLworCX0gKmljb25fd2luMzI7CisJCisJLyogQWxsb2NhdGUgdGhlIHdpbjMyIGJtcCBpY29uIGFuZCBzZXQgZXZlcnl0aGluZyB0byB6ZXJvICovCisJaWNvbl9waXRjaCA9ICgoaWNvbi0+dyszKSZ+Myk7CisJbWFza19waXRjaCA9ICgoaWNvbi0+dys3KS84KTsKKwlpY29uX3BsZW4gPSBpY29uLT5oKmljb25fcGl0Y2g7CisJaWNvbl9tbGVuID0gaWNvbi0+aCptYXNrX3BpdGNoOworCWljb25fbGVuID0gc2l6ZW9mKCppY29uX3dpbjMyKStpY29uX3BsZW4raWNvbl9tbGVuOworCWljb25fd2luMzIgPSAoc3RydWN0IFdpbjMySWNvbiAqKVNETF9zdGFja19hbGxvYyhVaW50OCwgaWNvbl9sZW4pOworCWlmICggaWNvbl93aW4zMiA9PSBOVUxMICkgeworCQlyZXR1cm47CisJfQorCVNETF9tZW1zZXQoaWNvbl93aW4zMiwgMCwgaWNvbl9sZW4pOworCisJLyogU2V0IHRoZSBiYXNpYyBCTVAgcGFyYW1ldGVycyAqLworCWljb25fd2luMzItPmJpU2l6ZSA9IHNpemVvZigqaWNvbl93aW4zMiktc2l6ZW9mKGljb25fd2luMzItPmJpQ29sb3JzKTsKKwlpY29uX3dpbjMyLT5iaVdpZHRoID0gaWNvbi0+dzsKKwlpY29uX3dpbjMyLT5iaUhlaWdodCA9IGljb24tPmgqMjsKKwlpY29uX3dpbjMyLT5iaVBsYW5lcyA9IDE7CisJaWNvbl93aW4zMi0+YmlCaXRDb3VudCA9IDg7CisJaWNvbl93aW4zMi0+YmlTaXplSW1hZ2UgPSBpY29uX3BsZW4raWNvbl9tbGVuOworCisJLyogQWxsb2NhdGUgYSBzdGFuZGFyZCAyNTYgY29sb3IgaWNvbiBzdXJmYWNlICovCisJaWNvbl8yNTYgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLCBpY29uLT53LCBpY29uLT5oLAorCQkJCQkgaWNvbl93aW4zMi0+YmlCaXRDb3VudCwgMCwgMCwgMCwgMCk7CisJaWYgKCBpY29uXzI1NiA9PSBOVUxMICkgeworCQlTRExfc3RhY2tfZnJlZShpY29uX3dpbjMyKTsKKwkJcmV0dXJuOworCX0KKwlwYWxfMjU2ID0gaWNvbl8yNTYtPmZvcm1hdC0+cGFsZXR0ZTsKKwlpZiAoaWNvbi0+Zm9ybWF0LT5wYWxldHRlICYmIAorCQkoaWNvbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gaWNvbl8yNTYtPmZvcm1hdC0+Qml0c1BlclBpeGVsKSl7CisJCVVpbnQ4IGJsYWNrOworCQlTRExfbWVtY3B5KHBhbF8yNTYtPmNvbG9ycywgaWNvbi0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnMsCisJCQkJCXBhbF8yNTYtPm5jb2xvcnMqc2l6ZW9mKFNETF9Db2xvcikpOworCQkvKiBNYWtlIHN1cmUgdGhhdCAwIGlzIGJsYWNrISAqLworCQlibGFjayA9IFNETF9GaW5kQ29sb3IocGFsXzI1NiwgMHgwMCwgMHgwMCwgMHgwMCk7CisJCXBhbF8yNTYtPmNvbG9yc1tibGFja10gPSBwYWxfMjU2LT5jb2xvcnNbMF07CisJCXBhbF8yNTYtPmNvbG9yc1swXS5yID0gMHgwMDsKKwkJcGFsXzI1Ni0+Y29sb3JzWzBdLmcgPSAweDAwOworCQlwYWxfMjU2LT5jb2xvcnNbMF0uYiA9IDB4MDA7CisJfSBlbHNlIHsKKwkJU0RMX0RpdGhlckNvbG9ycyhwYWxfMjU2LT5jb2xvcnMsCisJCQkJCWljb25fMjU2LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCk7CisJfQorCisJLyogTm93IGNvcHkgY29sb3IgZGF0YSB0byB0aGUgaWNvbiBCTVAgKi8KKwlmb3IgKCBpPTA7IGk8KDE8PGljb25fd2luMzItPmJpQml0Q291bnQpOyArK2kgKSB7CisJCWljb25fd2luMzItPmJpQ29sb3JzW2ldLnJnYlJlZCA9IHBhbF8yNTYtPmNvbG9yc1tpXS5yOworCQlpY29uX3dpbjMyLT5iaUNvbG9yc1tpXS5yZ2JHcmVlbiA9IHBhbF8yNTYtPmNvbG9yc1tpXS5nOworCQlpY29uX3dpbjMyLT5iaUNvbG9yc1tpXS5yZ2JCbHVlID0gcGFsXzI1Ni0+Y29sb3JzW2ldLmI7CisJfQorCisJLyogQ29udmVydCBpY29uIHRvIGEgc3RhbmRhcmQgc3VyZmFjZSBmb3JtYXQuICBUaGlzIG1heSBub3QgYWx3YXlzCisJICAgYmUgbmVjZXNzYXJ5LCBhcyBXaW5kb3dzIHN1cHBvcnRzIGEgdmFyaWV0eSBvZiBCTVAgZm9ybWF0cywgYnV0CisJICAgaXQgZ3JlYXRseSBzaW1wbGlmaWVzIG91ciBjb2RlLgorCSovIAorICAgIGJvdW5kcy54ID0gMDsKKyAgICBib3VuZHMueSA9IDA7CisgICAgYm91bmRzLncgPSBpY29uLT53OworICAgIGJvdW5kcy5oID0gaWNvbi0+aDsKKyAgICBpZiAoIFNETF9Mb3dlckJsaXQoaWNvbiwgJmJvdW5kcywgaWNvbl8yNTYsICZib3VuZHMpIDwgMCApIHsKKwkgICAgU0RMX3N0YWNrX2ZyZWUoaWNvbl93aW4zMik7CisJCVNETF9GcmVlU3VyZmFjZShpY29uXzI1Nik7CisgICAgICAgIHJldHVybjsKKwl9CisKKwkvKiBDb3B5IHBpeGVscyB1cHNpZGUtZG93biB0byBpY29uIEJNUCwgbWFza2VkIHdpdGggdGhlIGljb24gbWFzayAqLworCWlmICggU0RMX01VU1RMT0NLKGljb25fMjU2KSB8fCAoaWNvbl8yNTYtPnBpdGNoICE9IGljb25fcGl0Y2gpICkgeworCQlTRExfc3RhY2tfZnJlZShpY29uX3dpbjMyKTsKKwkJU0RMX0ZyZWVTdXJmYWNlKGljb25fMjU2KTsKKwkJU0RMX1NldEVycm9yKCJXYXJuaW5nOiBVbmV4cGVjdGVkIGljb25fMjU2IGNoYXJhY3RlcmlzdGljcyIpOworCQlyZXR1cm47CisJfQorCXBkYXRhID0gKFVpbnQ4ICopaWNvbl8yNTYtPnBpeGVsczsKKwltZGF0YSA9IG1hc2s7CisJcHdpbjMyID0gKFVpbnQ4ICopaWNvbl93aW4zMitzaXplb2YoKmljb25fd2luMzIpK2ljb25fcGxlbi1pY29uX3BpdGNoOworCXNraXAgPSBpY29uX3BpdGNoIC0gaWNvbi0+dzsKKwlmb3IgKCByb3c9MDsgcm93PGljb24tPmg7ICsrcm93ICkgeworCQlmb3IgKCBjb2w9MDsgY29sPGljb24tPnc7ICsrY29sICkgeworCQkJaWYgKCAoY29sJTgpID09IDAgKSB7CisJCQkJbSA9ICptZGF0YSsrOworCQkJfQorCQkJaWYgKCAobSYweDgwKSAhPSAweDAwICkgeworCQkJCSpwd2luMzIgPSAqcGRhdGE7CisJCQl9CisJCQltIDw8PSAxOworCQkJKytwZGF0YTsKKwkJCSsrcHdpbjMyOworCQl9CisJCXBkYXRhICArPSBza2lwOworCQlwd2luMzIgKz0gc2tpcDsKKwkJcHdpbjMyIC09IDIqaWNvbl9waXRjaDsKKwl9CisJU0RMX0ZyZWVTdXJmYWNlKGljb25fMjU2KTsKKworCS8qIENvcHkgbWFzayBpbnZlcnRlZCBhbmQgdXBzaWRlLWRvd24gdG8gaWNvbiBCTVAgKi8KKwltZGF0YSA9IG1hc2s7CisJbXdpbjMyID0gKFVpbnQ4ICopaWNvbl93aW4zMgorCQkJK3NpemVvZigqaWNvbl93aW4zMikraWNvbl9wbGVuK2ljb25fbWxlbi1tYXNrX3BpdGNoOworCWZvciAoIHJvdz0wOyByb3c8aWNvbi0+aDsgKytyb3cgKSB7CisJCWZvciAoIGNvbD0wOyBjb2w8bWFza19waXRjaDsgKytjb2wgKSB7CisJCQkqbXdpbjMyKysgPSB+Km1kYXRhKys7CisJCX0KKwkJbXdpbjMyIC09IDIqbWFza19waXRjaDsKKwl9CisKKwkvKiBGaW5hbGx5LCBjcmVhdGUgdGhlIGljb24gaGFuZGxlIGFuZCBzZXQgdGhlIHdpbmRvdyBpY29uICovCisJc2NyZWVuX2ljbiA9IENyZWF0ZUljb25Gcm9tUmVzb3VyY2VFeCgoVWludDggKilpY29uX3dpbjMyLCBpY29uX2xlbiwKKwkJCVRSVUUsIDB4MDAwMzAwMDAsIGljb24tPncsIGljb24tPmgsIExSX0RFRkFVTFRDT0xPUik7CisJaWYgKCBzY3JlZW5faWNuID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIFdpbjMyIGljb24gaGFuZGxlIik7CisJfSBlbHNlIHsKKwkJU2V0Q2xhc3NMb25nUHRyKFNETF9XaW5kb3csIEdDTFBfSElDT04sIChMT05HX1BUUilzY3JlZW5faWNuKTsKKwl9CisJU0RMX3N0YWNrX2ZyZWUoaWNvbl93aW4zMik7CisjZW5kaWYgLyogRElTQUJMRV9JQ09OX1NVUFBPUlQgKi8KK30KKwordHlwZWRlZiBCT09MIChXSU5BUEkgKlB0clNldFdpbmRvd1RleHRXKShIV05EIGhXbmQsIExQQ1dTVFIgbHBTdHJpbmcpOworCit2b2lkIFdJTl9TZXRXTUNhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKQoreworI2lmZGVmIF9XSU4zMl9XQ0UKKwkvKiBXaW5DRSB1c2VzIHRoZSBVTklDT0RFIHZlcnNpb24gKi8KKwlMUFdTVFIgbHBzelcgPSBTRExfaWNvbnZfdXRmOF91Y3MyKChjaGFyICopdGl0bGUpOworCVNldFdpbmRvd1RleHQoU0RMX1dpbmRvdywgbHBzelcpOworCVNETF9mcmVlKGxwc3pXKTsKKyNlbHNlCisJVWludDE2ICpscHN6ID0gU0RMX2ljb252X3V0ZjhfdWNzMih0aXRsZSk7CisJc2l6ZV90IGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBscHN6LCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisJY2hhciAqY3Z0ID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIGxlbiArIDEpOworCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBscHN6LCAtMSwgY3Z0LCBsZW4sIE5VTEwsIE5VTEwpOworCVNldFdpbmRvd1RleHQoU0RMX1dpbmRvdywgY3Z0KTsKKwlTRExfc3RhY2tfZnJlZShjdnQpOworCVNETF9mcmVlKGxwc3opOworI2VuZGlmCit9CisKK2ludCBXSU5fSWNvbmlmeVdpbmRvdyhfVEhJUykKK3sKKwlTaG93V2luZG93KFNETF9XaW5kb3csIFNXX01JTklNSVpFKTsKKwlyZXR1cm4oMSk7Cit9CisKK1NETF9HcmFiTW9kZSBXSU5fR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSkKK3sKKwlpZiAoIG1vZGUgPT0gU0RMX0dSQUJfT0ZGICkgeworCQlDbGlwQ3Vyc29yKE5VTEwpOworCQlpZiAoICEoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICkgeworCQkvKglSSlI6IE1hcmNoIDI4LCAyMDAwCisJCQltdXN0IGJlIGxlYXZpbmcgcmVsYXRpdmUgbW9kZSwgbW92ZSBtb3VzZSBmcm9tCisJCQljZW50ZXIgb2Ygd2luZG93IHRvIHdoZXJlIGl0IGJlbG9uZ3MgLi4uICovCisJCQlQT0lOVCBwdDsKKwkJCWludCB4LCB5OworCQkJU0RMX0dldE1vdXNlU3RhdGUoJngsJnkpOworCQkJcHQueCA9IHg7CisJCQlwdC55ID0geTsKKwkJCUNsaWVudFRvU2NyZWVuKFNETF9XaW5kb3csICZwdCk7CisJCQlTZXRDdXJzb3JQb3MocHQueCxwdC55KTsKKwkJfQorI2lmZGVmIF9XSU4zMl9XQ0UKKwkJQWxsS2V5cygwKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCUNsaXBDdXJzb3IoJlNETF9ib3VuZHMpOworCQlpZiAoICEoU0RMX2N1cnNvcnN0YXRlICYgQ1VSU09SX1ZJU0lCTEUpICkgeworCQkvKglSSlI6IE1hcmNoIDI4LCAyMDAwCisJCQltdXN0IGJlIGVudGVyaW5nIHJlbGF0aXZlIG1vZGUsIGdldCByZWFkeSBieQorCQkJbW92aW5nIG1vdXNlIHRvCWNlbnRlciBvZiB3aW5kb3cgLi4uICovCisJCQlQT0lOVCBwdDsKKwkJCXB0LnggPSAoU0RMX1ZpZGVvU3VyZmFjZS0+dy8yKTsKKwkJCXB0LnkgPSAoU0RMX1ZpZGVvU3VyZmFjZS0+aC8yKTsKKwkJCUNsaWVudFRvU2NyZWVuKFNETF9XaW5kb3csICZwdCk7CisJCQlTZXRDdXJzb3JQb3MocHQueCwgcHQueSk7CisJCX0KKyNpZmRlZiBfV0lOMzJfV0NFCisJCUFsbEtleXMoMSk7CisjZW5kaWYKKwl9CisJcmV0dXJuKG1vZGUpOworfQorCisvKiBJZiAnaW5mbycgaXMgdGhlIHJpZ2h0IHZlcnNpb24sIHRoaXMgZnVuY3Rpb24gZmlsbHMgaXQgYW5kIHJldHVybnMgMS4KKyAgIE90aGVyd2lzZSwgaW4gY2FzZSBvZiBhIHZlcnNpb24gbWlzbWF0Y2gsIGl0IHJldHVybnMgLTEuCisqLworaW50IFdJTl9HZXRXTUluZm8oX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pCit7CisJaWYgKCBpbmZvLT52ZXJzaW9uLm1ham9yIDw9IFNETF9NQUpPUl9WRVJTSU9OICkgeworCQlpbmZvLT53aW5kb3cgPSBTRExfV2luZG93OworCQlpZiAoIFNETF9WRVJTSU9OTlVNKGluZm8tPnZlcnNpb24ubWFqb3IsCisJCSAgICAgICAgICAgICAgICAgICAgaW5mby0+dmVyc2lvbi5taW5vciwKKwkJICAgICAgICAgICAgICAgICAgICBpbmZvLT52ZXJzaW9uLnBhdGNoKSA+PQorCQkgICAgIFNETF9WRVJTSU9OTlVNKDEsIDIsIDUpICkgeworI2lmIFNETF9WSURFT19PUEVOR0wKKwkJCWluZm8tPmhnbHJjID0gR0xfaHJjOworI2Vsc2UKKwkJCWluZm8tPmhnbHJjID0gTlVMTDsKKyNlbmRpZgorCQl9CisJCXJldHVybigxKTsKKwl9IGVsc2UgeworCQlTRExfU2V0RXJyb3IoIkFwcGxpY2F0aW9uIG5vdCBjb21waWxlZCB3aXRoIFNETCAlZC4lZFxuIiwKKwkJCQkJU0RMX01BSk9SX1ZFUlNJT04sIFNETF9NSU5PUl9WRVJTSU9OKTsKKwkJcmV0dXJuKC0xKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfc3lzd21fYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c3dtX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTAzYjQzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5jb21tb24vU0RMX3N5c3dtX2MuaApAQCAtMCwwICsxLDM1IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF9sb3d2aWRlby5oIgorCisvKiBEYXRhIHRoYXQgbmVlZHMgdG8gYmUgZnJlZWQgYXQgU0RMX1NZU19WaWRlb1F1aXQoKSAqLworZXh0ZXJuIEhJQ09OIHNjcmVlbl9pY247CisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgV0lOX1NldFdNSWNvbihfVEhJUywgU0RMX1N1cmZhY2UgKmljb24sIFVpbnQ4ICptYXNrKTsKK2V4dGVybiB2b2lkIFdJTl9TZXRXTUNhcHRpb24oX1RISVMsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICppY29uKTsKK2V4dGVybiBpbnQgV0lOX0ljb25pZnlXaW5kb3coX1RISVMpOworZXh0ZXJuIFNETF9HcmFiTW9kZSBXSU5fR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7CitleHRlcm4gaW50IFdJTl9HZXRXTUluZm8oX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pOworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfd2luZ2wuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luY29tbW9uL1NETF93aW5nbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNGU5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfd2luZ2wuYwpAQCAtMCwwICsxLDY1OSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFdHTCBpbXBsZW1lbnRhdGlvbiBvZiBTREwgT3BlbkdMIHN1cHBvcnQgKi8KKworI2lmIFNETF9WSURFT19PUEVOR0wKKyNpbmNsdWRlICJTRExfb3BlbmdsLmgiCisjZW5kaWYKKyNpbmNsdWRlICJTRExfbG93dmlkZW8uaCIKKyNpbmNsdWRlICJTRExfd2luZ2xfYy5oIgorCisjaWYgU0RMX1ZJREVPX09QRU5HTAorI2RlZmluZSBERUZBVUxUX0dMX0RSSVZFUl9QQVRIICJPUEVOR0wzMi5ETEwiCisjZW5kaWYKKworLyogSWYgc2V0dGluZyB0aGUgSERDIGZhaWxzLCB3ZSBtYXkgbmVlZCB0byByZWNyZWF0ZSB0aGUgd2luZG93IChNU0ROKSAqLworc3RhdGljIGludCBXSU5fR0xfUmVzZXRXaW5kb3coX1RISVMpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKyNpZm5kZWYgX1dJTjMyX1dDRSAvKiBGSVhNRSBXaW5DRSBuZWVkcyB0aGUgVU5JQ09ERSB2ZXJzaW9uIG9mIENyZWF0ZVdpbmRvdygpICovCisJLyogVGhpcyBkb2Vzbid0IHdvcmsgd2l0aCBEaXJlY3RYIGNvZGUgKHNlZSBDVlMgY29tbWVudHMpICovCisJLyogSWYgd2Ugd2VyZSBwYXNzZWQgYSB3aW5kb3csIHRoZW4gd2UgY2FuJ3QgY3JlYXRlIGEgbmV3IG9uZSAqLworCWlmICggIVNETF93aW5kb3dpZCAmJiBTRExfc3RyY21wKHRoaXMtPm5hbWUsICJ3aW5kaWIiKSA9PSAwICkgeworCQkvKiBTYXZlIHRoZSBleGlzdGluZyB3aW5kb3cgYXR0cmlidXRlcyAqLworCQlMT05HIHN0eWxlOworCQlSRUNUIHJlY3QgPSB7IDAsIDAsIDAsIDAgfTsKKwkJc3R5bGUgPSBHZXRXaW5kb3dMb25nKFNETF9XaW5kb3csIEdXTF9TVFlMRSk7CisJCUdldFdpbmRvd1JlY3QoU0RMX1dpbmRvdywgJnJlY3QpOworCQlEZXN0cm95V2luZG93KFNETF9XaW5kb3cpOworCQlXSU5fRmx1c2hNZXNzYWdlUXVldWUoKTsKKworCQlTRExfcmVzaXppbmcgPSAxOworCQlTRExfV2luZG93ID0gQ3JlYXRlV2luZG93KFNETF9BcHBuYW1lLCBTRExfQXBwbmFtZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQsIHJlY3QudG9wLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWN0LnJpZ2h0LXJlY3QubGVmdCkrMSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAocmVjdC5ib3R0b20tcmVjdC50b3ApKzEsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgU0RMX0luc3RhbmNlLCBOVUxMKTsKKwkJV0lOX0ZsdXNoTWVzc2FnZVF1ZXVlKCk7CisJCVNETF9yZXNpemluZyA9IDA7CisKKwkJaWYgKCBTRExfV2luZG93ICkgeworCQkJdGhpcy0+U2V0Q2FwdGlvbih0aGlzLCB0aGlzLT53bV90aXRsZSwgdGhpcy0+d21faWNvbik7CisJCX0gZWxzZSB7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSB3aW5kb3ciKTsKKwkJCXN0YXR1cyA9IC0xOworCQl9CisJfSBlbHNlCisjZW5kaWYgLyogIV9XSU4zMl9XQ0UgKi8KKwl7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIHJlc2V0IHdpbmRvdyBmb3IgT3BlbkdMIGNvbnRleHQiKTsKKwkJc3RhdHVzID0gLTE7CisJfQorCXJldHVybihzdGF0dXMpOworfQorCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCitzdGF0aWMgaW50IEV4dGVuc2lvblN1cHBvcnRlZChjb25zdCBjaGFyICpleHRlbnNpb24sIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnMpCit7CisJY29uc3QgY2hhciAqc3RhcnQ7CisJY29uc3QgY2hhciAqd2hlcmUsICp0ZXJtaW5hdG9yOworCisJLyogRXh0ZW5zaW9uIG5hbWVzIHNob3VsZCBub3QgaGF2ZSBzcGFjZXMuICovCisJd2hlcmUgPSBTRExfc3RyY2hyKGV4dGVuc2lvbiwgJyAnKTsKKwlpZiAoIHdoZXJlIHx8ICpleHRlbnNpb24gPT0gJ1wwJyApCisJICAgICAgcmV0dXJuIDA7CisJCisJaWYgKCAhIGV4dGVuc2lvbnMgKQorCQlyZXR1cm4gMDsKKworCS8qIEl0IHRha2VzIGEgYml0IG9mIGNhcmUgdG8gYmUgZm9vbC1wcm9vZiBhYm91dCBwYXJzaW5nIHRoZQorCSAqICAgICAgT3BlbkdMIGV4dGVuc2lvbnMgc3RyaW5nLiBEb24ndCBiZSBmb29sZWQgYnkgc3ViLXN0cmluZ3MsCisJICogICAgICAgICAgIGV0Yy4gKi8KKwkKKwlzdGFydCA9IGV4dGVuc2lvbnM7CisJCisJZm9yICg7OykKKwl7CisJCXdoZXJlID0gU0RMX3N0cnN0cihzdGFydCwgZXh0ZW5zaW9uKTsKKwkJaWYgKCF3aGVyZSkgYnJlYWs7CisJCQorCQl0ZXJtaW5hdG9yID0gd2hlcmUgKyBTRExfc3RybGVuKGV4dGVuc2lvbik7CisJCWlmICh3aGVyZSA9PSBzdGFydCB8fCAqKHdoZXJlIC0gMSkgPT0gJyAnKQorCSAgICAgICAgaWYgKCp0ZXJtaW5hdG9yID09ICcgJyB8fCAqdGVybWluYXRvciA9PSAnXDAnKSByZXR1cm4gMTsKKworCQlzdGFydCA9IHRlcm1pbmF0b3I7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IENob29zZVBpeGVsRm9ybWF0QVJCKF9USElTLCBjb25zdCBpbnQgKmlBdHRyaWJzLCBjb25zdCBGTE9BVCAqZkF0dHJpYnMpCit7CisJSFdORCBod25kOworCUhEQyBoZGM7CisJSEdMUkMgaGdscmM7CisJY29uc3QgY2hhciAqIChXSU5BUEkgKndnbEdldEV4dGVuc2lvbnNTdHJpbmdBUkIpKEhEQykgPSAwOworCWNvbnN0IGNoYXIgKmV4dGVuc2lvbnM7CisJaW50IHBmb3JtYXQgPSAwOworCVVJTlQgbWF0Y2hlcyA9IDA7CisKKwlod25kID0gQ3JlYXRlV2luZG93KFNETF9BcHBuYW1lLCBTRExfQXBwbmFtZSwgV1NfUE9QVVAgfCBXU19ESVNBQkxFRCwKKwkgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEwLCAxMCwKKwkgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIFNETF9JbnN0YW5jZSwgTlVMTCk7CisJV0lOX0ZsdXNoTWVzc2FnZVF1ZXVlKCk7CisKKwloZGMgPSBHZXREQyhod25kKTsKKworCVNldFBpeGVsRm9ybWF0KGhkYywgQ2hvb3NlUGl4ZWxGb3JtYXQoaGRjLCAmR0xfcGZkKSwgJkdMX3BmZCk7CisKKwloZ2xyYyA9IHRoaXMtPmdsX2RhdGEtPndnbENyZWF0ZUNvbnRleHQoaGRjKTsKKwlpZiAoIGhnbHJjICkgeworCQl0aGlzLT5nbF9kYXRhLT53Z2xNYWtlQ3VycmVudChoZGMsIGhnbHJjKTsKKwl9CisKKwl3Z2xHZXRFeHRlbnNpb25zU3RyaW5nQVJCID0gKGNvbnN0IGNoYXIgKiAoV0lOQVBJICopKEhEQykpCisJCXRoaXMtPmdsX2RhdGEtPndnbEdldFByb2NBZGRyZXNzKCJ3Z2xHZXRFeHRlbnNpb25zU3RyaW5nQVJCIik7CisKKwlpZiggd2dsR2V0RXh0ZW5zaW9uc1N0cmluZ0FSQiApIHsKKwkJZXh0ZW5zaW9ucyA9IHdnbEdldEV4dGVuc2lvbnNTdHJpbmdBUkIoaGRjKTsKKwl9IGVsc2UgeworCQlleHRlbnNpb25zID0gTlVMTDsKKwl9CisKKwl0aGlzLT5nbF9kYXRhLT5XR0xfQVJCX3BpeGVsX2Zvcm1hdCA9IDA7CisJaWYoIEV4dGVuc2lvblN1cHBvcnRlZCgiV0dMX0FSQl9waXhlbF9mb3JtYXQiLCBleHRlbnNpb25zKSApIHsKKwkJQk9PTCAoV0lOQVBJICp3Z2xDaG9vc2VQaXhlbEZvcm1hdEFSQikoSERDIGhkYywgY29uc3QgaW50ICpwaUF0dHJpYklMaXN0LCBjb25zdCBGTE9BVCAqcGZBdHRyaWJGTGlzdCwgVUlOVCBuTWF4Rm9ybWF0cywgaW50ICpwaUZvcm1hdHMsIFVJTlQgKm5OdW1Gb3JtYXRzKTsKKwkJd2dsQ2hvb3NlUGl4ZWxGb3JtYXRBUkIgPQorCQkJKEJPT0wgKFdJTkFQSSAqKShIREMsIGNvbnN0IGludCAqLCBjb25zdCBGTE9BVCAqLCBVSU5ULCBpbnQgKiwgVUlOVCAqKSkKKwkJCXRoaXMtPmdsX2RhdGEtPndnbEdldFByb2NBZGRyZXNzKCJ3Z2xDaG9vc2VQaXhlbEZvcm1hdEFSQiIpOworCQlpZiggd2dsQ2hvb3NlUGl4ZWxGb3JtYXRBUkIgJiYKKwkJICAgIHdnbENob29zZVBpeGVsRm9ybWF0QVJCKGhkYywgaUF0dHJpYnMsIGZBdHRyaWJzLCAxLCAmcGZvcm1hdCwgJm1hdGNoZXMpICYmIHBmb3JtYXQgKSB7CisJCQl0aGlzLT5nbF9kYXRhLT5XR0xfQVJCX3BpeGVsX2Zvcm1hdCA9IDE7CisJCX0KKwl9CisJCisJaWYgKCBoZ2xyYyApIHsKKwkJdGhpcy0+Z2xfZGF0YS0+d2dsTWFrZUN1cnJlbnQoTlVMTCwgTlVMTCk7CisJCXRoaXMtPmdsX2RhdGEtPndnbERlbGV0ZUNvbnRleHQoaGdscmMpOworCX0KKwlSZWxlYXNlREMoaHduZCwgaGRjKTsKKwlEZXN0cm95V2luZG93KGh3bmQpOworCVdJTl9GbHVzaE1lc3NhZ2VRdWV1ZSgpOworCisJcmV0dXJuIHBmb3JtYXQ7Cit9CisKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCisKK2ludCBXSU5fR0xfU2V0dXBXaW5kb3coX1RISVMpCit7CisJaW50IHJldHZhbDsKKyNpZiBTRExfVklERU9fT1BFTkdMCisJaW50IGk7CisJaW50IGlBdHRyaWJzWzY0XTsKKwlpbnQgKmlBdHRyOworCWludCAqaUFjY2VsQXR0ciA9IE5VTEw7CisJZmxvYXQgZkF0dHJpYnNbMV0gPSB7IDAgfTsKKwljb25zdCBHTHVieXRlICooV0lOQVBJICpnbEdldFN0cmluZ0Z1bmMpKEdMZW51bSk7CisJY29uc3QgY2hhciAqd2dsZXh0OworCisJLyogbG9hZCB0aGUgZ2wgZHJpdmVyIGZyb20gYSBkZWZhdWx0IHBhdGggKi8KKwlpZiAoICEgdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgKSB7CisJCS8qIG5vIGRyaXZlciBoYXMgYmVlbiBsb2FkZWQsIHVzZSBkZWZhdWx0IChvdXJzZWx2ZXMpICovCisJCWlmICggV0lOX0dMX0xvYWRMaWJyYXJ5KHRoaXMsIE5VTEwpIDwgMCApIHsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisKKwkvKiBTZXQgdXAgdGhlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9yIHdpdGggb3VyIG5lZWRlZCBmb3JtYXQgKi8KKwlTRExfbWVtc2V0KCZHTF9wZmQsIDAsIHNpemVvZihHTF9wZmQpKTsKKwlHTF9wZmQublNpemUgPSBzaXplb2YoR0xfcGZkKTsKKwlHTF9wZmQublZlcnNpb24gPSAxOworCUdMX3BmZC5kd0ZsYWdzID0gKFBGRF9EUkFXX1RPX1dJTkRPVyB8IFBGRF9TVVBQT1JUX09QRU5HTCk7CisJaWYgKCB0aGlzLT5nbF9jb25maWcuZG91YmxlX2J1ZmZlciApIHsKKwkJR0xfcGZkLmR3RmxhZ3MgfD0gUEZEX0RPVUJMRUJVRkZFUjsKKwl9CisJaWYgKCB0aGlzLT5nbF9jb25maWcuc3RlcmVvICkgeworCQlHTF9wZmQuZHdGbGFncyB8PSBQRkRfU1RFUkVPOworCX0KKwlHTF9wZmQuaVBpeGVsVHlwZSA9IFBGRF9UWVBFX1JHQkE7CisJR0xfcGZkLmNDb2xvckJpdHMgPSB0aGlzLT5nbF9jb25maWcuYnVmZmVyX3NpemU7CisJR0xfcGZkLmNSZWRCaXRzID0gdGhpcy0+Z2xfY29uZmlnLnJlZF9zaXplOworCUdMX3BmZC5jR3JlZW5CaXRzID0gdGhpcy0+Z2xfY29uZmlnLmdyZWVuX3NpemU7CisJR0xfcGZkLmNCbHVlQml0cyA9IHRoaXMtPmdsX2NvbmZpZy5ibHVlX3NpemU7CisJR0xfcGZkLmNBbHBoYUJpdHMgPSB0aGlzLT5nbF9jb25maWcuYWxwaGFfc2l6ZTsKKwlHTF9wZmQuY0FjY3VtUmVkQml0cyA9IHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZTsKKwlHTF9wZmQuY0FjY3VtR3JlZW5CaXRzID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemU7CisJR0xfcGZkLmNBY2N1bUJsdWVCaXRzID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2JsdWVfc2l6ZTsKKwlHTF9wZmQuY0FjY3VtQWxwaGFCaXRzID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemU7CisJR0xfcGZkLmNBY2N1bUJpdHMgPQorCQkoR0xfcGZkLmNBY2N1bVJlZEJpdHMgKyBHTF9wZmQuY0FjY3VtR3JlZW5CaXRzICsKKwkJIEdMX3BmZC5jQWNjdW1CbHVlQml0cyArIEdMX3BmZC5jQWNjdW1BbHBoYUJpdHMpOworCUdMX3BmZC5jRGVwdGhCaXRzID0gdGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemU7CisJR0xfcGZkLmNTdGVuY2lsQml0cyA9IHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemU7CisKKwkvKiBzZXR1cCBXR0xfQVJCX3BpeGVsX2Zvcm1hdCBhdHRyaWJzICovCisJaUF0dHIgPSAmaUF0dHJpYnNbMF07CisKKwkqaUF0dHIrKyA9IFdHTF9EUkFXX1RPX1dJTkRPV19BUkI7CisJKmlBdHRyKysgPSBHTF9UUlVFOworCSppQXR0cisrID0gV0dMX1JFRF9CSVRTX0FSQjsKKwkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5yZWRfc2l6ZTsKKwkqaUF0dHIrKyA9IFdHTF9HUkVFTl9CSVRTX0FSQjsKKwkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5ncmVlbl9zaXplOworCSppQXR0cisrID0gV0dMX0JMVUVfQklUU19BUkI7CisJKmlBdHRyKysgPSB0aGlzLT5nbF9jb25maWcuYmx1ZV9zaXplOworCisJLyogV2UgYWx3YXlzIGNob29zZSBlaXRoZXIgRlVMTCBvciBOTyBhY2NlbCBvbiBXaW5kb3dzLCBiZWNhdXNlIG9mIGZsYWt5CisJICAgZHJpdmVycy4gSWYgdGhlIGFwcCBkaWRuJ3Qgc3BlY2lmeSwgd2UgdXNlIEZVTEwsIGJlY2F1c2UgdGhhdCdzCisJICAgcHJvYmFibHkgd2hhdCB0aGV5IHdhbnRlZCAoYW5kIGlmIHlvdSBkaWRuJ3QgY2FyZSBhbmQgZ290IEZVTEwsIHRoYXQncworCSAgIGEgcGVyZmVjdGx5IHZhbGlkIHJlc3VsdCBpbiBhbnkgY2FzZS4gKi8KKwkqaUF0dHIrKyA9IFdHTF9BQ0NFTEVSQVRJT05fQVJCOworCWlBY2NlbEF0dHIgPSBpQXR0cjsKKwlpZiAodGhpcy0+Z2xfY29uZmlnLmFjY2VsZXJhdGVkKSB7CisJCSppQXR0cisrID0gV0dMX0ZVTExfQUNDRUxFUkFUSU9OX0FSQjsKKwl9IGVsc2UgeworCQkqaUF0dHIrKyA9IFdHTF9OT19BQ0NFTEVSQVRJT05fQVJCOworCX0KKworCWlmICggdGhpcy0+Z2xfY29uZmlnLmFscGhhX3NpemUgKSB7CisJCSppQXR0cisrID0gV0dMX0FMUEhBX0JJVFNfQVJCOworCQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5hbHBoYV9zaXplOworCX0KKworCSppQXR0cisrID0gV0dMX0RPVUJMRV9CVUZGRVJfQVJCOworCSppQXR0cisrID0gdGhpcy0+Z2xfY29uZmlnLmRvdWJsZV9idWZmZXI7CisKKwkqaUF0dHIrKyA9IFdHTF9ERVBUSF9CSVRTX0FSQjsKKwkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5kZXB0aF9zaXplOworCisJaWYgKCB0aGlzLT5nbF9jb25maWcuc3RlbmNpbF9zaXplICkgeworCQkqaUF0dHIrKyA9IFdHTF9TVEVOQ0lMX0JJVFNfQVJCOworCQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5zdGVuY2lsX3NpemU7CisJfQorCisJaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemUgKSB7CisJCSppQXR0cisrID0gV0dMX0FDQ1VNX1JFRF9CSVRTX0FSQjsKKwkJKmlBdHRyKysgPSB0aGlzLT5nbF9jb25maWcuYWNjdW1fcmVkX3NpemU7CisJfQorCisJaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjdW1fZ3JlZW5fc2l6ZSApIHsKKwkJKmlBdHRyKysgPSBXR0xfQUNDVU1fR1JFRU5fQklUU19BUkI7CisJCSppQXR0cisrID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemU7CisJfQorCisJaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjdW1fYmx1ZV9zaXplICkgeworCQkqaUF0dHIrKyA9IFdHTF9BQ0NVTV9CTFVFX0JJVFNfQVJCOworCQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9ibHVlX3NpemU7CisJfQorCisJaWYgKCB0aGlzLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZSApIHsKKwkJKmlBdHRyKysgPSBXR0xfQUNDVU1fQUxQSEFfQklUU19BUkI7CisJCSppQXR0cisrID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemU7CisJfQorCisJaWYgKCB0aGlzLT5nbF9jb25maWcuc3RlcmVvICkgeworCQkqaUF0dHIrKyA9IFdHTF9TVEVSRU9fQVJCOworCQkqaUF0dHIrKyA9IEdMX1RSVUU7CisJfQorCisJaWYgKCB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVidWZmZXJzICkgeworCQkqaUF0dHIrKyA9IFdHTF9TQU1QTEVfQlVGRkVSU19BUkI7CisJCSppQXR0cisrID0gdGhpcy0+Z2xfY29uZmlnLm11bHRpc2FtcGxlYnVmZmVyczsKKwl9CisKKwlpZiAoIHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXMgKSB7CisJCSppQXR0cisrID0gV0dMX1NBTVBMRVNfQVJCOworCQkqaUF0dHIrKyA9IHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXM7CisJfQorCisJKmlBdHRyID0gMDsKKworCWZvciAoIGk9MDsgOyArK2kgKSB7CisJCS8qIEdldCB0aGUgd2luZG93IGRldmljZSBjb250ZXh0IGZvciBvdXIgT3BlbkdMIGRyYXdpbmcgKi8KKwkJR0xfaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7CisJCWlmICggR0xfaGRjID09IE5VTEwgKSB7CisJCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBnZXQgREMgZm9yIFNETF9XaW5kb3ciKTsKKwkJCXJldHVybigtMSk7CisJCX0KKworCQkvKiBDaG9vc2UgYW5kIHNldCB0aGUgY2xvc2VzdCBhdmFpbGFibGUgcGl4ZWwgZm9ybWF0ICovCisJCXBpeGVsX2Zvcm1hdCA9IENob29zZVBpeGVsRm9ybWF0QVJCKHRoaXMsIGlBdHRyaWJzLCBmQXR0cmlicyk7CisJCS8qIEFwcCBzYWlkICJkb24ndCBjYXJlIGFib3V0IGFjY2VsIiBhbmQgRlVMTCBhY2NlbCBmYWlsZWQuIFRyeSBOTy4gKi8KKwkJaWYgKCAoICFwaXhlbF9mb3JtYXQgKSAmJiAoIHRoaXMtPmdsX2NvbmZpZy5hY2NlbGVyYXRlZCA8IDAgKSApIHsKKwkJCSppQWNjZWxBdHRyID0gV0dMX05PX0FDQ0VMRVJBVElPTl9BUkI7CisJCQlwaXhlbF9mb3JtYXQgPSBDaG9vc2VQaXhlbEZvcm1hdEFSQih0aGlzLCBpQXR0cmlicywgZkF0dHJpYnMpOworCQkJKmlBY2NlbEF0dHIgPSBXR0xfRlVMTF9BQ0NFTEVSQVRJT05fQVJCOyAgLyogaWYgd2UgdHJ5IGFnYWluLiAqLworCQl9CisJCWlmICggIXBpeGVsX2Zvcm1hdCApIHsKKwkJCXBpeGVsX2Zvcm1hdCA9IENob29zZVBpeGVsRm9ybWF0KEdMX2hkYywgJkdMX3BmZCk7CisJCX0KKwkJaWYgKCAhcGl4ZWxfZm9ybWF0ICkgeworCQkJU0RMX1NldEVycm9yKCJObyBtYXRjaGluZyBHTCBwaXhlbCBmb3JtYXQgYXZhaWxhYmxlIik7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCWlmICggIVNldFBpeGVsRm9ybWF0KEdMX2hkYywgcGl4ZWxfZm9ybWF0LCAmR0xfcGZkKSApIHsKKwkJCWlmICggaSA9PSAwICkgeworCQkJCS8qIEZpcnN0IHRpbWUgdGhyb3VnaCwgdHJ5IHJlc2V0dGluZyB0aGUgd2luZG93ICovCisJCQkJaWYgKCBXSU5fR0xfUmVzZXRXaW5kb3codGhpcykgPCAwICkgeworCQkJCQlyZXR1cm4oLTEpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIHNldCBIREMgcGl4ZWwgZm9ybWF0Iik7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCS8qIFdlIGVpdGhlciBzdWNjZWVkZWQgb3IgZmFpbGVkIGJ5IHRoaXMgcG9pbnQgKi8KKwkJYnJlYWs7CisJfQorCURlc2NyaWJlUGl4ZWxGb3JtYXQoR0xfaGRjLCBwaXhlbF9mb3JtYXQsIHNpemVvZihHTF9wZmQpLCAmR0xfcGZkKTsKKworCUdMX2hyYyA9IHRoaXMtPmdsX2RhdGEtPndnbENyZWF0ZUNvbnRleHQoR0xfaGRjKTsKKwlpZiAoIEdMX2hyYyA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgR0wgY29udGV4dCIpOworCQlyZXR1cm4oLTEpOworCX0KKwlpZiAoIFdJTl9HTF9NYWtlQ3VycmVudCh0aGlzKSA8IDAgKSB7CisJCXJldHVybigtMSk7CisJfQorCWdsX2FjdGl2ZSA9IDE7CisKKwkvKiBHZXQgdGhlIHdnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIgcG9pbnRlciBmb3IgdGhlIGNvbnRleHQgKi8KKwlpZiAoIHRoaXMtPmdsX2RhdGEtPldHTF9BUkJfcGl4ZWxfZm9ybWF0ICkgeworCQl0aGlzLT5nbF9kYXRhLT53Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCID0KKwkJCShCT09MIChXSU5BUEkgKikoSERDLCBpbnQsIGludCwgVUlOVCwgY29uc3QgaW50ICosIGludCAqKSkKKwkJCXRoaXMtPmdsX2RhdGEtPndnbEdldFByb2NBZGRyZXNzKCJ3Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCIik7CisJfSBlbHNlIHsKKwkJdGhpcy0+Z2xfZGF0YS0+d2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQiA9IE5VTEw7CisJfQorCisJLyogVnN5bmMgY29udHJvbCB1bmRlciBXaW5kb3dzLiAgQ2hlY2tpbmcgZ2xHZXRTdHJpbmcgaGVyZSBpcworCSAqIHNvbWV3aGF0IGEgZG9jdW1lbnRlZCBhbmQgcmVsaWFibGUgaGFjayAtIGl0IHdhcyBvcmlnaW5hbGx5CisJICogYXMgYSBmZWF0dXJlIGFkZGVkIGJ5IG1pc3Rha2UsIGJ1dCBzaW5jZSBzbyBtYW55IHBlb3BsZSByZWx5CisJICogb24gaXQsIGl0IHdpbGwgbm90IGJlIHJlbW92ZWQuICBzdHJzdHIgc2hvdWxkIGJlIHNhZmUgaGVyZS4qLworCWdsR2V0U3RyaW5nRnVuYyA9IFdJTl9HTF9HZXRQcm9jQWRkcmVzcyh0aGlzLCAiZ2xHZXRTdHJpbmciKTsKKwlpZiAoIGdsR2V0U3RyaW5nRnVuYyApIHsKKwkJd2dsZXh0ID0gKGNvbnN0IGNoYXIgKilnbEdldFN0cmluZ0Z1bmMoR0xfRVhURU5TSU9OUyk7CisJfSBlbHNlIHsKKwkJLyogVWggb2gsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcgaGVyZS4uLiAqLworCQl3Z2xleHQgPSBOVUxMOworCX0KKwlpZiAoIHdnbGV4dCAmJiBTRExfc3Ryc3RyKHdnbGV4dCwgIldHTF9FWFRfc3dhcF9jb250cm9sIikgKSB7CisJCXRoaXMtPmdsX2RhdGEtPndnbFN3YXBJbnRlcnZhbEVYVCA9IFdJTl9HTF9HZXRQcm9jQWRkcmVzcyh0aGlzLCAid2dsU3dhcEludGVydmFsRVhUIik7CisJCXRoaXMtPmdsX2RhdGEtPndnbEdldFN3YXBJbnRlcnZhbEVYVCA9IFdJTl9HTF9HZXRQcm9jQWRkcmVzcyh0aGlzLCAid2dsR2V0U3dhcEludGVydmFsRVhUIik7CisJfSBlbHNlIHsKKwkJdGhpcy0+Z2xfZGF0YS0+d2dsU3dhcEludGVydmFsRVhUID0gTlVMTDsKKwkJdGhpcy0+Z2xfZGF0YS0+d2dsR2V0U3dhcEludGVydmFsRVhUID0gTlVMTDsKKwl9CisJaWYgKCB0aGlzLT5nbF9jb25maWcuc3dhcF9jb250cm9sID49IDAgKSB7CisJCWlmICggdGhpcy0+Z2xfZGF0YS0+d2dsU3dhcEludGVydmFsRVhUICkgeworCQkJdGhpcy0+Z2xfZGF0YS0+d2dsU3dhcEludGVydmFsRVhUKHRoaXMtPmdsX2NvbmZpZy5zd2FwX2NvbnRyb2wpOworCQl9CisJfQorI2Vsc2UKKwlTRExfU2V0RXJyb3IoIldJTiBkcml2ZXIgbm90IGNvbmZpZ3VyZWQgd2l0aCBPcGVuR0wiKTsKKyNlbmRpZgorCWlmICggZ2xfYWN0aXZlICkgeworCQlyZXR2YWwgPSAwOworCX0gZWxzZSB7CisJCXJldHZhbCA9IC0xOworCX0KKwlyZXR1cm4ocmV0dmFsKTsKK30KKwordm9pZCBXSU5fR0xfU2h1dERvd24oX1RISVMpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTAorCS8qIENsZWFuIHVwIE9wZW5HTCAqLworCWlmICggR0xfaHJjICkgeworCQl0aGlzLT5nbF9kYXRhLT53Z2xNYWtlQ3VycmVudChOVUxMLCBOVUxMKTsKKwkJdGhpcy0+Z2xfZGF0YS0+d2dsRGVsZXRlQ29udGV4dChHTF9ocmMpOworCQlHTF9ocmMgPSBOVUxMOworCX0KKwlpZiAoIEdMX2hkYyApIHsKKwkJUmVsZWFzZURDKFNETF9XaW5kb3csIEdMX2hkYyk7CisJCUdMX2hkYyA9IE5VTEw7CisJfQorCWdsX2FjdGl2ZSA9IDA7CisKKwlXSU5fR0xfVW5sb2FkTGlicmFyeSh0aGlzKTsKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCit9CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisKKy8qIE1ha2UgdGhlIGN1cnJlbnQgY29udGV4dCBhY3RpdmUgKi8KK2ludCBXSU5fR0xfTWFrZUN1cnJlbnQoX1RISVMpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IDA7CisJaWYgKCAhIHRoaXMtPmdsX2RhdGEtPndnbE1ha2VDdXJyZW50KEdMX2hkYywgR0xfaHJjKSApIHsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gbWFrZSBHTCBjb250ZXh0IGN1cnJlbnQiKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCXJldHVybihyZXR2YWwpOworfQorCisvKiBHZXQgYXR0cmlidXRlIGRhdGEgZnJvbSB3Z2wuICovCitpbnQgV0lOX0dMX0dldEF0dHJpYnV0ZShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpCit7CisJaW50IHJldHZhbDsKKworCWlmIChhdHRyaWIgPT0gU0RMX0dMX1NXQVBfQ09OVFJPTCkgeworCQlpZiAoIHRoaXMtPmdsX2RhdGEtPndnbEdldFN3YXBJbnRlcnZhbEVYVCApIHsKKwkJCSp2YWx1ZSA9IHRoaXMtPmdsX2RhdGEtPndnbEdldFN3YXBJbnRlcnZhbEVYVCgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCWlmICggdGhpcy0+Z2xfZGF0YS0+d2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQiApIHsKKwkJaW50IHdnbF9hdHRyaWI7CisKKwkJc3dpdGNoKGF0dHJpYikgeworCQkgICAgY2FzZSBTRExfR0xfUkVEX1NJWkU6CisJCQl3Z2xfYXR0cmliID0gV0dMX1JFRF9CSVRTX0FSQjsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBTRExfR0xfR1JFRU5fU0laRToKKwkJCXdnbF9hdHRyaWIgPSBXR0xfR1JFRU5fQklUU19BUkI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0dMX0JMVUVfU0laRToKKwkJCXdnbF9hdHRyaWIgPSBXR0xfQkxVRV9CSVRTX0FSQjsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBTRExfR0xfQUxQSEFfU0laRToKKwkJCXdnbF9hdHRyaWIgPSBXR0xfQUxQSEFfQklUU19BUkI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0dMX0RPVUJMRUJVRkZFUjoKKwkJCXdnbF9hdHRyaWIgPSBXR0xfRE9VQkxFX0JVRkZFUl9BUkI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0dMX0JVRkZFUl9TSVpFOgorCQkJd2dsX2F0dHJpYiA9IFdHTF9DT0xPUl9CSVRTX0FSQjsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBTRExfR0xfREVQVEhfU0laRToKKwkJCXdnbF9hdHRyaWIgPSBXR0xfREVQVEhfQklUU19BUkI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0dMX1NURU5DSUxfU0laRToKKwkJCXdnbF9hdHRyaWIgPSBXR0xfU1RFTkNJTF9CSVRTX0FSQjsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBTRExfR0xfQUNDVU1fUkVEX1NJWkU6CisJCQl3Z2xfYXR0cmliID0gV0dMX0FDQ1VNX1JFRF9CSVRTX0FSQjsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBTRExfR0xfQUNDVU1fR1JFRU5fU0laRToKKwkJCXdnbF9hdHRyaWIgPSBXR0xfQUNDVU1fR1JFRU5fQklUU19BUkI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0JMVUVfU0laRToKKwkJCXdnbF9hdHRyaWIgPSBXR0xfQUNDVU1fQkxVRV9CSVRTX0FSQjsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBTRExfR0xfQUNDVU1fQUxQSEFfU0laRToKKwkJCXdnbF9hdHRyaWIgPSBXR0xfQUNDVU1fQUxQSEFfQklUU19BUkI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0dMX1NURVJFTzoKKwkJCXdnbF9hdHRyaWIgPSBXR0xfU1RFUkVPX0FSQjsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBTRExfR0xfTVVMVElTQU1QTEVCVUZGRVJTOgorCQkJd2dsX2F0dHJpYiA9IFdHTF9TQU1QTEVfQlVGRkVSU19BUkI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0dMX01VTFRJU0FNUExFU0FNUExFUzoKKwkJCXdnbF9hdHRyaWIgPSBXR0xfU0FNUExFU19BUkI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0dMX0FDQ0VMRVJBVEVEX1ZJU1VBTDoKKwkJCXdnbF9hdHRyaWIgPSBXR0xfQUNDRUxFUkFUSU9OX0FSQjsKKwkJCXRoaXMtPmdsX2RhdGEtPndnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIoR0xfaGRjLCBwaXhlbF9mb3JtYXQsIDAsIDEsICZ3Z2xfYXR0cmliLCB2YWx1ZSk7CisJCQlpZiAoICp2YWx1ZSA9PSBXR0xfTk9fQUNDRUxFUkFUSU9OX0FSQiApIHsKKwkJCQkqdmFsdWUgPSBTRExfRkFMU0U7CisJCQl9IGVsc2UgeworCQkJCSp2YWx1ZSA9IFNETF9UUlVFOworCQkJfQorCQkJcmV0dXJuIDA7CisJCSAgICBkZWZhdWx0OgorCQkJcmV0dXJuKC0xKTsKKwkJfQorCQl0aGlzLT5nbF9kYXRhLT53Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCKEdMX2hkYywgcGl4ZWxfZm9ybWF0LCAwLCAxLCAmd2dsX2F0dHJpYiwgdmFsdWUpOworCisJCXJldHVybiAwOworCX0KKworCXJldHZhbCA9IDA7CisJc3dpdGNoICggYXR0cmliICkgeworCSAgICBjYXNlIFNETF9HTF9SRURfU0laRToKKwkJKnZhbHVlID0gR0xfcGZkLmNSZWRCaXRzOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfR1JFRU5fU0laRToKKwkJKnZhbHVlID0gR0xfcGZkLmNHcmVlbkJpdHM7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9CTFVFX1NJWkU6CisJCSp2YWx1ZSA9IEdMX3BmZC5jQmx1ZUJpdHM7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9BTFBIQV9TSVpFOgorCQkqdmFsdWUgPSBHTF9wZmQuY0FscGhhQml0czsKKwkJYnJlYWs7CisJICAgIGNhc2UgU0RMX0dMX0RPVUJMRUJVRkZFUjoKKwkJaWYgKCBHTF9wZmQuZHdGbGFncyAmIFBGRF9ET1VCTEVCVUZGRVIgKSB7CisJCQkqdmFsdWUgPSAxOworCQl9IGVsc2UgeworCQkJKnZhbHVlID0gMDsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfQlVGRkVSX1NJWkU6CisJCSp2YWx1ZSA9IEdMX3BmZC5jQ29sb3JCaXRzOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfREVQVEhfU0laRToKKwkJKnZhbHVlID0gR0xfcGZkLmNEZXB0aEJpdHM7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9TVEVOQ0lMX1NJWkU6CisJCSp2YWx1ZSA9IEdMX3BmZC5jU3RlbmNpbEJpdHM7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9BQ0NVTV9SRURfU0laRToKKwkJKnZhbHVlID0gR0xfcGZkLmNBY2N1bVJlZEJpdHM7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9BQ0NVTV9HUkVFTl9TSVpFOgorCQkqdmFsdWUgPSBHTF9wZmQuY0FjY3VtR3JlZW5CaXRzOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfQUNDVU1fQkxVRV9TSVpFOgorCQkqdmFsdWUgPSBHTF9wZmQuY0FjY3VtQmx1ZUJpdHM7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9BQ0NVTV9BTFBIQV9TSVpFOgorCQkqdmFsdWUgPSBHTF9wZmQuY0FjY3VtQWxwaGFCaXRzOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfU1RFUkVPOgorCQlpZiAoIEdMX3BmZC5kd0ZsYWdzICYgUEZEX1NURVJFTyApIHsKKwkJCSp2YWx1ZSA9IDE7CisJCX0gZWxzZSB7CisJCQkqdmFsdWUgPSAwOworCQl9CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9NVUxUSVNBTVBMRUJVRkZFUlM6CisJCSp2YWx1ZSA9IDA7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9NVUxUSVNBTVBMRVNBTVBMRVM6CisJCSp2YWx1ZSA9IDE7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9TV0FQX0NPTlRST0w6CisJCWlmICggdGhpcy0+Z2xfZGF0YS0+d2dsR2V0U3dhcEludGVydmFsRVhUICkgeworCQkJKnZhbHVlID0gdGhpcy0+Z2xfZGF0YS0+d2dsR2V0U3dhcEludGVydmFsRVhUKCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcmV0dmFsID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIFdJTl9HTF9Td2FwQnVmZmVycyhfVEhJUykKK3sKKwlTd2FwQnVmZmVycyhHTF9oZGMpOworfQorCit2b2lkIFdJTl9HTF9VbmxvYWRMaWJyYXJ5KF9USElTKQoreworCWlmICggdGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9sb2FkZWQgKSB7CisJCUZyZWVMaWJyYXJ5KChITU9EVUxFKXRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlKTsKKworCQl0aGlzLT5nbF9kYXRhLT53Z2xHZXRQcm9jQWRkcmVzcyA9IE5VTEw7CisJCXRoaXMtPmdsX2RhdGEtPndnbENyZWF0ZUNvbnRleHQgPSBOVUxMOworCQl0aGlzLT5nbF9kYXRhLT53Z2xEZWxldGVDb250ZXh0ID0gTlVMTDsKKwkJdGhpcy0+Z2xfZGF0YS0+d2dsTWFrZUN1cnJlbnQgPSBOVUxMOworCQl0aGlzLT5nbF9kYXRhLT53Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCID0gTlVMTDsKKwkJdGhpcy0+Z2xfZGF0YS0+d2dsU3dhcEludGVydmFsRVhUID0gTlVMTDsKKwkJdGhpcy0+Z2xfZGF0YS0+d2dsR2V0U3dhcEludGVydmFsRVhUID0gTlVMTDsKKworCQl0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IE5VTEw7CisJCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMDsKKwl9Cit9CisKKy8qIFBhc3NpbmcgYSBOVUxMIHBhdGggbWVhbnMgbG9hZCBwb2ludGVycyBmcm9tIHRoZSBhcHBsaWNhdGlvbiAqLworaW50IFdJTl9HTF9Mb2FkTGlicmFyeShfVEhJUywgY29uc3QgY2hhciogcGF0aCkgCit7CisJSE1PRFVMRSBoYW5kbGU7CisKKyAJaWYgKCBnbF9hY3RpdmUgKSB7CisgCQlTRExfU2V0RXJyb3IoIk9wZW5HTCBjb250ZXh0IGFscmVhZHkgY3JlYXRlZCIpOworIAkJcmV0dXJuIC0xOworIAl9CisKKwlpZiAoIHBhdGggPT0gTlVMTCApIHsKKwkJcGF0aCA9IERFRkFVTFRfR0xfRFJJVkVSX1BBVEg7CisJfQorCWhhbmRsZSA9IExvYWRMaWJyYXJ5KHBhdGgpOworCWlmICggaGFuZGxlID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGQgbm90IGxvYWQgT3BlbkdMIGxpYnJhcnkiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFVubG9hZCB0aGUgb2xkIGRyaXZlciBhbmQgcmVzZXQgdGhlIHBvaW50ZXJzICovCisJV0lOX0dMX1VubG9hZExpYnJhcnkodGhpcyk7CisKKwkvKiBMb2FkIG5ldyBmdW5jdGlvbiBwb2ludGVycyAqLworCVNETF9tZW1zZXQodGhpcy0+Z2xfZGF0YSwgMCwgc2l6ZW9mKCp0aGlzLT5nbF9kYXRhKSk7CisJdGhpcy0+Z2xfZGF0YS0+d2dsR2V0UHJvY0FkZHJlc3MgPSAodm9pZCAqIChXSU5BUEkgKikoY29uc3QgY2hhciAqKSkKKwkJR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCAid2dsR2V0UHJvY0FkZHJlc3MiKTsKKwl0aGlzLT5nbF9kYXRhLT53Z2xDcmVhdGVDb250ZXh0ID0gKEhHTFJDIChXSU5BUEkgKikoSERDKSkKKwkJR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCAid2dsQ3JlYXRlQ29udGV4dCIpOworCXRoaXMtPmdsX2RhdGEtPndnbERlbGV0ZUNvbnRleHQgPSAoQk9PTCAoV0lOQVBJICopKEhHTFJDKSkKKwkJR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCAid2dsRGVsZXRlQ29udGV4dCIpOworCXRoaXMtPmdsX2RhdGEtPndnbE1ha2VDdXJyZW50ID0gKEJPT0wgKFdJTkFQSSAqKShIREMsIEhHTFJDKSkKKwkJR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCAid2dsTWFrZUN1cnJlbnQiKTsKKwl0aGlzLT5nbF9kYXRhLT53Z2xTd2FwSW50ZXJ2YWxFWFQgPSAodm9pZCAoV0lOQVBJICopKGludCkpCisJCUdldFByb2NBZGRyZXNzKGhhbmRsZSwgIndnbFN3YXBJbnRlcnZhbEVYVCIpOworCXRoaXMtPmdsX2RhdGEtPndnbEdldFN3YXBJbnRlcnZhbEVYVCA9IChpbnQgKFdJTkFQSSAqKSh2b2lkKSkKKwkJR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCAid2dsR2V0U3dhcEludGVydmFsRVhUIik7CisKKwlpZiAoICh0aGlzLT5nbF9kYXRhLT53Z2xHZXRQcm9jQWRkcmVzcyA9PSBOVUxMKSB8fAorCSAgICAgKHRoaXMtPmdsX2RhdGEtPndnbENyZWF0ZUNvbnRleHQgPT0gTlVMTCkgfHwKKwkgICAgICh0aGlzLT5nbF9kYXRhLT53Z2xEZWxldGVDb250ZXh0ID09IE5VTEwpIHx8CisJICAgICAodGhpcy0+Z2xfZGF0YS0+d2dsTWFrZUN1cnJlbnQgPT0gTlVMTCkgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGQgbm90IHJldHJpZXZlIE9wZW5HTCBmdW5jdGlvbnMiKTsKKwkJRnJlZUxpYnJhcnkoaGFuZGxlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlID0gaGFuZGxlOworCVNETF9zdHJsY3B5KHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCwgcGF0aCwgU0RMX2FycmF5c2l6ZSh0aGlzLT5nbF9jb25maWcuZHJpdmVyX3BhdGgpKTsKKwl0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgKldJTl9HTF9HZXRQcm9jQWRkcmVzcyhfVEhJUywgY29uc3QgY2hhciogcHJvYykKK3sKKwl2b2lkICpmdW5jOworCisJLyogVGhpcyBpcyB0byBwaWNrIHVwIGV4dGVuc2lvbnMgKi8KKwlmdW5jID0gdGhpcy0+Z2xfZGF0YS0+d2dsR2V0UHJvY0FkZHJlc3MocHJvYyk7CisJaWYgKCAhIGZ1bmMgKSB7CisJCS8qIFRoaXMgaXMgcHJvYmFibHkgYSBub3JtYWwgR0wgZnVuY3Rpb24gKi8KKwkJZnVuYyA9IEdldFByb2NBZGRyZXNzKHRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlLCBwcm9jKTsKKwl9CisJcmV0dXJuIGZ1bmM7Cit9CisKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi9TRExfd2luZ2xfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5jb21tb24vU0RMX3dpbmdsX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2YyMjkxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5jb21tb24vU0RMX3dpbmdsX2MuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFdHTCBpbXBsZW1lbnRhdGlvbiBvZiBTREwgT3BlbkdMIHN1cHBvcnQgKi8KKworI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisKK3N0cnVjdCBTRExfUHJpdmF0ZUdMRGF0YSB7CisgICAgaW50IGdsX2FjdGl2ZTsgLyogdG8gc3RvcCBzd2l0Y2hpbmcgZHJpdmVycyB3aGlsZSB3ZSBoYXZlIGEgdmFsaWQgY29udGV4dCAqLworCisjaWYgU0RMX1ZJREVPX09QRU5HTAorICAgIFBJWEVMRk9STUFUREVTQ1JJUFRPUiBHTF9wZmQ7CisgICAgSERDIEdMX2hkYzsKKyAgICBIR0xSQyBHTF9ocmM7CisgICAgaW50IHBpeGVsX2Zvcm1hdDsKKyAgICBpbnQgV0dMX0FSQl9waXhlbF9mb3JtYXQ7CisKKyAgICB2b2lkICogKFdJTkFQSSAqd2dsR2V0UHJvY0FkZHJlc3MpKGNvbnN0IGNoYXIgKnByb2MpOworCisgICAgSEdMUkMgKFdJTkFQSSAqd2dsQ3JlYXRlQ29udGV4dCkoSERDIGhkYyk7CisKKyAgICBCT09MIChXSU5BUEkgKndnbERlbGV0ZUNvbnRleHQpKEhHTFJDIGhnbHJjKTsKKworICAgIEJPT0wgKFdJTkFQSSAqd2dsTWFrZUN1cnJlbnQpKEhEQyBoZGMsIEhHTFJDIGhnbHJjKTsKKyAgIAorICAgIEJPT0wgKFdJTkFQSSAqd2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQikoSERDIGhkYywgaW50IGlQaXhlbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpTGF5ZXJQbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbkF0dHJpYnV0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpwaUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBpVmFsdWVzKTsKKyAgICB2b2lkIChXSU5BUEkgKndnbFN3YXBJbnRlcnZhbEVYVCkoaW50IGludGVydmFsKTsKKyAgICBpbnQgKFdJTkFQSSAqd2dsR2V0U3dhcEludGVydmFsRVhUKSh2b2lkKTsKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMICovCit9OworCisvKiBPbGQgdmFyaWFibGUgbmFtZXMgKi8KKyNkZWZpbmUgZ2xfYWN0aXZlCSh0aGlzLT5nbF9kYXRhLT5nbF9hY3RpdmUpCisjZGVmaW5lIEdMX3BmZAkJKHRoaXMtPmdsX2RhdGEtPkdMX3BmZCkKKyNkZWZpbmUgR0xfaGRjCQkodGhpcy0+Z2xfZGF0YS0+R0xfaGRjKQorI2RlZmluZSBHTF9ocmMJCSh0aGlzLT5nbF9kYXRhLT5HTF9ocmMpCisjZGVmaW5lIHBpeGVsX2Zvcm1hdAkodGhpcy0+Z2xfZGF0YS0+cGl4ZWxfZm9ybWF0KQorCisvKiBPcGVuR0wgZnVuY3Rpb25zICovCitleHRlcm4gaW50IFdJTl9HTF9TZXR1cFdpbmRvdyhfVEhJUyk7CitleHRlcm4gdm9pZCBXSU5fR0xfU2h1dERvd24oX1RISVMpOworI2lmIFNETF9WSURFT19PUEVOR0wKK2V4dGVybiBpbnQgV0lOX0dMX01ha2VDdXJyZW50KF9USElTKTsKK2V4dGVybiBpbnQgV0lOX0dMX0dldEF0dHJpYnV0ZShfVEhJUywgU0RMX0dMYXR0ciBhdHRyaWIsIGludCogdmFsdWUpOworZXh0ZXJuIHZvaWQgV0lOX0dMX1N3YXBCdWZmZXJzKF9USElTKTsKK2V4dGVybiB2b2lkIFdJTl9HTF9VbmxvYWRMaWJyYXJ5KF9USElTKTsKK2V4dGVybiBpbnQgV0lOX0dMX0xvYWRMaWJyYXJ5KF9USElTLCBjb25zdCBjaGFyKiBwYXRoKTsKK2V4dGVybiB2b2lkICpXSU5fR0xfR2V0UHJvY0FkZHJlc3MoX1RISVMsIGNvbnN0IGNoYXIqIHByb2MpOworI2VuZGlmCisKKyNpZiBTRExfVklERU9fT1BFTkdMCisKKyNpZm5kZWYgV0dMX0FSQl9waXhlbF9mb3JtYXQKKyNkZWZpbmUgV0dMX05VTUJFUl9QSVhFTF9GT1JNQVRTX0FSQiAgIDB4MjAwMAorI2RlZmluZSBXR0xfRFJBV19UT19XSU5ET1dfQVJCICAgICAgICAgMHgyMDAxCisjZGVmaW5lIFdHTF9EUkFXX1RPX0JJVE1BUF9BUkIgICAgICAgICAweDIwMDIKKyNkZWZpbmUgV0dMX0FDQ0VMRVJBVElPTl9BUkIgICAgICAgICAgIDB4MjAwMworI2RlZmluZSBXR0xfTkVFRF9QQUxFVFRFX0FSQiAgICAgICAgICAgMHgyMDA0CisjZGVmaW5lIFdHTF9ORUVEX1NZU1RFTV9QQUxFVFRFX0FSQiAgICAweDIwMDUKKyNkZWZpbmUgV0dMX1NXQVBfTEFZRVJfQlVGRkVSU19BUkIgICAgIDB4MjAwNgorI2RlZmluZSBXR0xfU1dBUF9NRVRIT0RfQVJCICAgICAgICAgICAgMHgyMDA3CisjZGVmaW5lIFdHTF9OVU1CRVJfT1ZFUkxBWVNfQVJCICAgICAgICAweDIwMDgKKyNkZWZpbmUgV0dMX05VTUJFUl9VTkRFUkxBWVNfQVJCICAgICAgIDB4MjAwOQorI2RlZmluZSBXR0xfVFJBTlNQQVJFTlRfQVJCICAgICAgICAgICAgMHgyMDBBCisjZGVmaW5lIFdHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUVfQVJCICAweDIwMzcKKyNkZWZpbmUgV0dMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFX0FSQiAweDIwMzgKKyNkZWZpbmUgV0dMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUVfQVJCIDB4MjAzOQorI2RlZmluZSBXR0xfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUVfQVJCIDB4MjAzQQorI2RlZmluZSBXR0xfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUVfQVJCIDB4MjAzQgorI2RlZmluZSBXR0xfU0hBUkVfREVQVEhfQVJCICAgICAgICAgICAgMHgyMDBDCisjZGVmaW5lIFdHTF9TSEFSRV9TVEVOQ0lMX0FSQiAgICAgICAgICAweDIwMEQKKyNkZWZpbmUgV0dMX1NIQVJFX0FDQ1VNX0FSQiAgICAgICAgICAgIDB4MjAwRQorI2RlZmluZSBXR0xfU1VQUE9SVF9HRElfQVJCICAgICAgICAgICAgMHgyMDBGCisjZGVmaW5lIFdHTF9TVVBQT1JUX09QRU5HTF9BUkIgICAgICAgICAweDIwMTAKKyNkZWZpbmUgV0dMX0RPVUJMRV9CVUZGRVJfQVJCICAgICAgICAgIDB4MjAxMQorI2RlZmluZSBXR0xfU1RFUkVPX0FSQiAgICAgICAgICAgICAgICAgMHgyMDEyCisjZGVmaW5lIFdHTF9QSVhFTF9UWVBFX0FSQiAgICAgICAgICAgICAweDIwMTMKKyNkZWZpbmUgV0dMX0NPTE9SX0JJVFNfQVJCICAgICAgICAgICAgIDB4MjAxNAorI2RlZmluZSBXR0xfUkVEX0JJVFNfQVJCICAgICAgICAgICAgICAgMHgyMDE1CisjZGVmaW5lIFdHTF9SRURfU0hJRlRfQVJCICAgICAgICAgICAgICAweDIwMTYKKyNkZWZpbmUgV0dMX0dSRUVOX0JJVFNfQVJCICAgICAgICAgICAgIDB4MjAxNworI2RlZmluZSBXR0xfR1JFRU5fU0hJRlRfQVJCICAgICAgICAgICAgMHgyMDE4CisjZGVmaW5lIFdHTF9CTFVFX0JJVFNfQVJCICAgICAgICAgICAgICAweDIwMTkKKyNkZWZpbmUgV0dMX0JMVUVfU0hJRlRfQVJCICAgICAgICAgICAgIDB4MjAxQQorI2RlZmluZSBXR0xfQUxQSEFfQklUU19BUkIgICAgICAgICAgICAgMHgyMDFCCisjZGVmaW5lIFdHTF9BTFBIQV9TSElGVF9BUkIgICAgICAgICAgICAweDIwMUMKKyNkZWZpbmUgV0dMX0FDQ1VNX0JJVFNfQVJCICAgICAgICAgICAgIDB4MjAxRAorI2RlZmluZSBXR0xfQUNDVU1fUkVEX0JJVFNfQVJCICAgICAgICAgMHgyMDFFCisjZGVmaW5lIFdHTF9BQ0NVTV9HUkVFTl9CSVRTX0FSQiAgICAgICAweDIwMUYKKyNkZWZpbmUgV0dMX0FDQ1VNX0JMVUVfQklUU19BUkIgICAgICAgIDB4MjAyMAorI2RlZmluZSBXR0xfQUNDVU1fQUxQSEFfQklUU19BUkIgICAgICAgMHgyMDIxCisjZGVmaW5lIFdHTF9ERVBUSF9CSVRTX0FSQiAgICAgICAgICAgICAweDIwMjIKKyNkZWZpbmUgV0dMX1NURU5DSUxfQklUU19BUkIgICAgICAgICAgIDB4MjAyMworI2RlZmluZSBXR0xfQVVYX0JVRkZFUlNfQVJCICAgICAgICAgICAgMHgyMDI0CisjZGVmaW5lIFdHTF9OT19BQ0NFTEVSQVRJT05fQVJCICAgICAgICAweDIwMjUKKyNkZWZpbmUgV0dMX0dFTkVSSUNfQUNDRUxFUkFUSU9OX0FSQiAgIDB4MjAyNgorI2RlZmluZSBXR0xfRlVMTF9BQ0NFTEVSQVRJT05fQVJCICAgICAgMHgyMDI3CisjZGVmaW5lIFdHTF9TV0FQX0VYQ0hBTkdFX0FSQiAgICAgICAgICAweDIwMjgKKyNkZWZpbmUgV0dMX1NXQVBfQ09QWV9BUkIgICAgICAgICAgICAgIDB4MjAyOQorI2RlZmluZSBXR0xfU1dBUF9VTkRFRklORURfQVJCICAgICAgICAgMHgyMDJBCisjZGVmaW5lIFdHTF9UWVBFX1JHQkFfQVJCICAgICAgICAgICAgICAweDIwMkIKKyNkZWZpbmUgV0dMX1RZUEVfQ09MT1JJTkRFWF9BUkIgICAgICAgIDB4MjAyQworI2VuZGlmCisKKyNpZm5kZWYgV0dMX0FSQl9tdWx0aXNhbXBsZQorI2RlZmluZSBXR0xfU0FNUExFX0JVRkZFUlNfQVJCICAgICAgICAgMHgyMDQxCisjZGVmaW5lIFdHTF9TQU1QTEVTX0FSQiAgICAgICAgICAgICAgICAweDIwNDIKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xMi9zcmMvdmlkZW8vd2luY29tbW9uL3dtbXNnLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi93bW1zZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkaXN0cmliL3NkbC0xLjIuMTIvc3JjL3ZpZGVvL3dpbmNvbW1vbi93bW1zZy5oCnJlbmFtZSB0byBkaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmNvbW1vbi93bW1zZy5oCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmRpYi9TRExfZGliZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmRpYi9TRExfZGliZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlZTU0YQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJldmVudHMuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgIlNETF9tYWluLmgiCisjaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgorI2luY2x1ZGUgIlNETF9zeXN3bS5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIi4uL3dpbmNvbW1vbi9TRExfbG93dmlkZW8uaCIKKyNpbmNsdWRlICJTRExfZ2FwaWRpYnZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3ZrZXlzLmgiCisKKyNpZmRlZiBTRExfVklERU9fRFJJVkVSX0dBUEkKKyNpbmNsdWRlICIuLi9nYXBpL1NETF9nYXBpdmlkZW8uaCIKKyNlbmRpZgorCisjaWZkZWYgU0RMX1ZJREVPX0RSSVZFUl9XSU5ESUIKKyNpbmNsdWRlICJTRExfZGlidmlkZW8uaCIKKyNlbmRpZgorCisjaWZuZGVmIFdNX0FQUAorI2RlZmluZSBXTV9BUFAJMHg4MDAwCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgTk9fR0VUS0VZQk9BUkRTVEFURQorI2VuZGlmCisKKy8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZSBmcm9tIGEgTWljcm9zb2Z0IFZLIGtleXN5bSB0byBhIFNETCBrZXlzeW0gKi8KK3N0YXRpYyBTRExLZXkgVktfa2V5bWFwW1NETEtfTEFTVF07CitzdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KFdQQVJBTSB2a2V5LCBVSU5UIHNjYW5jb2RlLCBTRExfa2V5c3ltICprZXlzeW0sIGludCBwcmVzc2VkKTsKK3N0YXRpYyBTRExLZXkgQXJyb3dzX2tleW1hcFs0XTsKKworLyogTWFza3MgZm9yIHByb2Nlc3NpbmcgdGhlIHdpbmRvd3MgS0VZRE9XTiBhbmQgS0VZVVAgbWVzc2FnZXMgKi8KKyNkZWZpbmUgUkVQRUFURURfS0VZTUFTSwkoMTw8MzApCisjZGVmaW5lIEVYVEVOREVEX0tFWU1BU0sJKDE8PDI0KQorCisvKiBESk06IElmIHRoZSB1c2VyIHNldHVwIHRoZSB3aW5kb3cgZm9yIHVzLCB3ZSB3YW50IHRvIHNhdmUgaGlzIHdpbmRvdyBwcm9jLAorICAgYW5kIGdpdmUgaGltIGEgY2hhbmNlIHRvIGhhbmRsZSBzb21lIG1lc3NhZ2VzLiAqLworI2lmZGVmIFNUUklDVAorI2RlZmluZSBXTkRQUk9DVFlQRQlXTkRQUk9DCisjZWxzZQorI2RlZmluZSBXTkRQUk9DVFlQRQlGQVJQUk9DCisjZW5kaWYKK3N0YXRpYyBXTkRQUk9DVFlQRSB1c2VyV2luZG93UHJvYyA9IE5VTEw7CisKKworI2lmZGVmIFNETF9WSURFT19EUklWRVJfR0FQSQorCitXUEFSQU0gcm90YXRlS2V5KFdQQVJBTSBrZXksaW50IGRpcmVjdGlvbikgCit7CisJaWYoZGlyZWN0aW9uID09MCApIHJldHVybiBrZXk7CisJCisJc3dpdGNoIChrZXkpIHsKKwkJY2FzZSAweDI2OiAvKiB1cCAqLworCQkJcmV0dXJuIEFycm93c19rZXltYXBbKDIgKyBkaXJlY3Rpb24pICUgNF07CisJCWNhc2UgMHgyNzogLyogcmlnaHQgKi8KKwkJCXJldHVybiBBcnJvd3Nfa2V5bWFwWygxICsgZGlyZWN0aW9uKSAlIDRdOworCQljYXNlIDB4Mjg6IC8qIGRvd24gKi8KKwkJCXJldHVybiBBcnJvd3Nfa2V5bWFwW2RpcmVjdGlvbiAlIDRdOworCQljYXNlIDB4MjU6IC8qIGxlZnQgKi8KKwkJCXJldHVybiBBcnJvd3Nfa2V5bWFwWygzICsgZGlyZWN0aW9uKSAlIDRdOworCX0KKworCXJldHVybiBrZXk7Cit9CisKK3N0YXRpYyB2b2lkIEdhcGlUcmFuc2Zvcm0oR2FwaUluZm8gKmdhcGlJbmZvLCBMT05HICp4LCBMT05HICp5KQoreworICAgIGlmKGdhcGlJbmZvLT5oaXJlc0ZpeCkKKyAgICB7CisJKnggKj0gMjsKKwkqeSAqPSAyOworICAgIH0KKworICAgIC8vIDAgMyAwCisgICAgaWYoKCFnYXBpSW5mby0+dXNlck9yaWVudGF0aW9uICYmIGdhcGlJbmZvLT5zeXN0ZW1PcmllbnRhdGlvbiAmJiAhZ2FwaUluZm8tPmdhcGlPcmllbnRhdGlvbikgfHwKKyAgICAvLyAzIDAgMworICAgICAgIChnYXBpSW5mby0+dXNlck9yaWVudGF0aW9uICYmICFnYXBpSW5mby0+c3lzdGVtT3JpZW50YXRpb24gJiYgZ2FwaUluZm8tPmdhcGlPcmllbnRhdGlvbikgfHwKKyAgICAvLyAzIDAgMAorICAgICAgIChnYXBpSW5mby0+dXNlck9yaWVudGF0aW9uICYmICFnYXBpSW5mby0+c3lzdGVtT3JpZW50YXRpb24gJiYgIWdhcGlJbmZvLT5nYXBpT3JpZW50YXRpb24pKQorICAgIHsKKwlTaW50MTYgdGVtcCA9ICp4OworICAgICAgICAqeCA9IFNETF9WaWRlb1N1cmZhY2UtPncgLSAqeTsKKyAgICAgICAgKnkgPSB0ZW1wOworICAgIH0KKyAgICBlbHNlCisgICAgLy8gMCAwIDAKKyAgICBpZigoIWdhcGlJbmZvLT51c2VyT3JpZW50YXRpb24gJiYgIWdhcGlJbmZvLT5zeXN0ZW1PcmllbnRhdGlvbiAmJiAhZ2FwaUluZm8tPmdhcGlPcmllbnRhdGlvbikgfHwKKyAgICAvLyAwIDAgMworICAgICAgKCFnYXBpSW5mby0+dXNlck9yaWVudGF0aW9uICYmICFnYXBpSW5mby0+c3lzdGVtT3JpZW50YXRpb24gJiYgZ2FwaUluZm8tPmdhcGlPcmllbnRhdGlvbikpCisgICAgeworCS8vIHdpdGhvdXQgY2hhbmdlcworCS8vICp4ID0gKng7CisJLy8gKnkgPSAqeTsKKyAgICB9CisgICAgLy8gZGVmYXVsdAorICAgIGVsc2UKKyAgICB7CisJLy8gd2l0aG91dCBjaGFuZ2VzCisJLy8gKnggPSAqeDsKKwkvLyAqeSA9ICp5OworICAgIH0KK30KKyNlbmRpZiAKKworCisvKiBUaGUgbWFpbiBXaW4zMiBldmVudCBoYW5kbGVyICovCitMUkVTVUxUIERJQl9IYW5kbGVNZXNzYWdlKF9USElTLCBIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworCWV4dGVybiBpbnQgcG9zdGVkOworCisJc3dpdGNoIChtc2cpIHsKKwkJY2FzZSBXTV9TWVNLRVlET1dOOgorCQljYXNlIFdNX0tFWURPV046IHsKKwkJCVNETF9rZXlzeW0ga2V5c3ltOworCisjaWZkZWYgU0RMX1ZJREVPX0RSSVZFUl9HQVBJCisJCQlpZih0aGlzLT5oaWRkZW4tPmdhcGlJbmZvKQorCQkJeworCQkJCS8vIERyb3AgR0FQSSBhcnRlZmFjdHMKKwkJCQlpZiAod1BhcmFtID09IDB4ODQgfHwgd1BhcmFtID09IDB4NUIpCisJCQkJCXJldHVybiAwOworCisJCQkJd1BhcmFtID0gcm90YXRlS2V5KHdQYXJhbSwgdGhpcy0+aGlkZGVuLT5nYXBpSW5mby0+Y29vcmRpbmF0ZVRyYW5zZm9ybSk7CisJCQl9CisjZW5kaWYgCisJCQkvKiBJZ25vcmUgcmVwZWF0ZWQga2V5cyAqLworCQkJaWYgKCBsUGFyYW0mUkVQRUFURURfS0VZTUFTSyApIHsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQlzd2l0Y2ggKHdQYXJhbSkgeworCQkJCWNhc2UgVktfQ09OVFJPTDoKKwkJCQkJaWYgKCBsUGFyYW0mRVhURU5ERURfS0VZTUFTSyApCisJCQkJCQl3UGFyYW0gPSBWS19SQ09OVFJPTDsKKwkJCQkJZWxzZQorCQkJCQkJd1BhcmFtID0gVktfTENPTlRST0w7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVktfU0hJRlQ6CisJCQkJCS8qIEVYVEVOREVEIHRyaWNrIGRvZXNuJ3Qgd29yayBoZXJlICovCisJCQkJCXsKKwkJCQkJVWludDggKnN0YXRlID0gU0RMX0dldEtleVN0YXRlKE5VTEwpOworCQkJCQlpZiAoc3RhdGVbU0RMS19MU0hJRlRdID09IFNETF9SRUxFQVNFRCAmJiAoR2V0S2V5U3RhdGUoVktfTFNISUZUKSAmIDB4ODAwMCkpIHsKKwkJCQkJCXdQYXJhbSA9IFZLX0xTSElGVDsKKwkJCQkJfSBlbHNlIGlmIChzdGF0ZVtTRExLX1JTSElGVF0gPT0gU0RMX1JFTEVBU0VEICYmIChHZXRLZXlTdGF0ZShWS19SU0hJRlQpICYgMHg4MDAwKSkgeworCQkJCQkJd1BhcmFtID0gVktfUlNISUZUOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogV2luOXggKi8KKwkJCQkJCWludCBzYyA9IEhJV09SRChsUGFyYW0pICYgMHhGRjsKKworCQkJCQkJaWYgKHNjID09IDB4MkEpCisJCQkJCQkJd1BhcmFtID0gVktfTFNISUZUOworCQkJCQkJZWxzZQorCQkJCQkJaWYgKHNjID09IDB4MzYpCisJCQkJCQkJd1BhcmFtID0gVktfUlNISUZUOworCQkJCQkJZWxzZQorCQkJCQkJCXdQYXJhbSA9IFZLX0xTSElGVDsKKwkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVktfTUVOVToKKwkJCQkJaWYgKCBsUGFyYW0mRVhURU5ERURfS0VZTUFTSyApCisJCQkJCQl3UGFyYW0gPSBWS19STUVOVTsKKwkJCQkJZWxzZQorCQkJCQkJd1BhcmFtID0gVktfTE1FTlU7CisJCQkJCWJyZWFrOworCQkJfQorI2lmZGVmIE5PX0dFVEtFWUJPQVJEU1RBVEUKKwkJCS8qIHRoaXMgaXMgdGhlIHdvcmthcm91bmQgZm9yIHRoZSBtaXNzaW5nIFRvQXNjaWkoKSBhbmQgVG9Vbmljb2RlKCkgaW4gQ0UgKG5vdCBuZWNlc3NhcnkgYXQgS0VZVVAhKSAqLworCQkJaWYgKCBTRExfVHJhbnNsYXRlVU5JQ09ERSApIHsKKwkJCQlNU0cgbTsKKworCQkJCW0uaHduZCA9IGh3bmQ7CisJCQkJbS5tZXNzYWdlID0gbXNnOworCQkJCW0ud1BhcmFtID0gd1BhcmFtOworCQkJCW0ubFBhcmFtID0gbFBhcmFtOworCQkJCW0udGltZSA9IDA7CisJCQkJaWYgKCBUcmFuc2xhdGVNZXNzYWdlKCZtKSAmJiBQZWVrTWVzc2FnZSgmbSwgaHduZCwgMCwgV01fVVNFUiwgUE1fTk9SRU1PVkUpICYmIChtLm1lc3NhZ2UgPT0gV01fQ0hBUikgKSB7CisJCQkJCUdldE1lc3NhZ2UoJm0sIGh3bmQsIDAsIFdNX1VTRVIpOworCQkJICAgIAkJd1BhcmFtID0gbS53UGFyYW07CisJCQkJfQorCQkJfQorI2VuZGlmIC8qIE5PX0dFVEtFWUJPQVJEU1RBVEUgKi8KKwkJCXBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsCisJCQkJVHJhbnNsYXRlS2V5KHdQYXJhbSxISVdPUkQobFBhcmFtKSwma2V5c3ltLDEpKTsKKwkJfQorCQlyZXR1cm4oMCk7CisKKwkJY2FzZSBXTV9TWVNLRVlVUDoKKwkJY2FzZSBXTV9LRVlVUDogeworCQkJU0RMX2tleXN5bSBrZXlzeW07CisKKyNpZmRlZiBTRExfVklERU9fRFJJVkVSX0dBUEkKKwkJCWlmKHRoaXMtPmhpZGRlbi0+Z2FwaUluZm8pCisJCQl7CisJCQkJLy8gRHJvcCBHQVBJIGFydGlmYWN0cworCQkJCWlmICh3UGFyYW0gPT0gMHg4NCB8fCB3UGFyYW0gPT0gMHg1QikKKwkJCQkJcmV0dXJuIDA7CisJCisJCQkJd1BhcmFtID0gcm90YXRlS2V5KHdQYXJhbSwgdGhpcy0+aGlkZGVuLT5nYXBpSW5mby0+Y29vcmRpbmF0ZVRyYW5zZm9ybSk7CisJCQl9CisjZW5kaWYKKworCQkJc3dpdGNoICh3UGFyYW0pIHsKKwkJCQljYXNlIFZLX0NPTlRST0w6CisJCQkJCWlmICggbFBhcmFtJkVYVEVOREVEX0tFWU1BU0sgKQorCQkJCQkJd1BhcmFtID0gVktfUkNPTlRST0w7CisJCQkJCWVsc2UKKwkJCQkJCXdQYXJhbSA9IFZLX0xDT05UUk9MOworCQkJCQlicmVhazsKKwkJCQljYXNlIFZLX1NISUZUOgorCQkJCQkvKiBFWFRFTkRFRCB0cmljayBkb2Vzbid0IHdvcmsgaGVyZSAqLworCQkJCQl7CisJCQkJCVVpbnQ4ICpzdGF0ZSA9IFNETF9HZXRLZXlTdGF0ZShOVUxMKTsKKwkJCQkJaWYgKHN0YXRlW1NETEtfTFNISUZUXSA9PSBTRExfUFJFU1NFRCAmJiAhKEdldEtleVN0YXRlKFZLX0xTSElGVCkgJiAweDgwMDApKSB7CisJCQkJCQl3UGFyYW0gPSBWS19MU0hJRlQ7CisJCQkJCX0gZWxzZSBpZiAoc3RhdGVbU0RMS19SU0hJRlRdID09IFNETF9QUkVTU0VEICYmICEoR2V0S2V5U3RhdGUoVktfUlNISUZUKSAmIDB4ODAwMCkpIHsKKwkJCQkJCXdQYXJhbSA9IFZLX1JTSElGVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIFdpbjl4ICovCisJCQkJCQlpbnQgc2MgPSBISVdPUkQobFBhcmFtKSAmIDB4RkY7CisKKwkJCQkJCWlmIChzYyA9PSAweDJBKQorCQkJCQkJCXdQYXJhbSA9IFZLX0xTSElGVDsKKwkJCQkJCWVsc2UKKwkJCQkJCWlmIChzYyA9PSAweDM2KQorCQkJCQkJCXdQYXJhbSA9IFZLX1JTSElGVDsKKwkJCQkJCWVsc2UKKwkJCQkJCQl3UGFyYW0gPSBWS19MU0hJRlQ7CisJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFZLX01FTlU6CisJCQkJCWlmICggbFBhcmFtJkVYVEVOREVEX0tFWU1BU0sgKQorCQkJCQkJd1BhcmFtID0gVktfUk1FTlU7CisJCQkJCWVsc2UKKwkJCQkJCXdQYXJhbSA9IFZLX0xNRU5VOworCQkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFdpbmRvd3Mgb25seSByZXBvcnRzIGtleXVwIGZvciBwcmludCBzY3JlZW4gKi8KKwkJCWlmICggd1BhcmFtID09IFZLX1NOQVBTSE9UICYmIFNETF9HZXRLZXlTdGF0ZShOVUxMKVtTRExLX1BSSU5UXSA9PSBTRExfUkVMRUFTRUQgKSB7CisJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwKKwkJCQkJVHJhbnNsYXRlS2V5KHdQYXJhbSxISVdPUkQobFBhcmFtKSwma2V5c3ltLDEpKTsKKwkJCX0KKwkJCXBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELAorCQkJCVRyYW5zbGF0ZUtleSh3UGFyYW0sSElXT1JEKGxQYXJhbSksJmtleXN5bSwwKSk7CisJCX0KKwkJcmV0dXJuKDApOworI2lmIGRlZmluZWQoU0NfU0NSRUVOU0FWRSkgJiYgZGVmaW5lZChTQ19NT05JVE9SUE9XRVIpCisJCWNhc2UgV01fU1lTQ09NTUFORDogeworCQkJY29uc3QgRFdPUkQgdmFsID0gKERXT1JEKSAod1BhcmFtICYgMHhGRkYwKTsKKwkJCWlmICgodmFsID09IFNDX1NDUkVFTlNBVkUpIHx8ICh2YWwgPT0gU0NfTU9OSVRPUlBPV0VSKSkgeworCQkJCWlmICh0aGlzLT5oaWRkZW4tPmRpYkluZm8gJiYgIWFsbG93X3NjcmVlbnNhdmVyKSB7CisJCQkJCS8qIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3Qgc3RvcCBhbnl0aGluZyBvbiBWaXN0YQorCQkJCQkgICBpZiB0aGUgc2NyZWVuc2F2ZXIgaGFzIGEgcGFzc3dvcmQuICovCisJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgcHJvY2Vzc2luZyAqLworI2VuZGlmIC8qIFNDX1NDUkVFTlNBVkUgJiYgU0NfTU9OSVRPUlBPV0VSICovCisKKwkJZGVmYXVsdDogeworCQkJLyogT25seSBwb3N0IHRoZSBldmVudCBpZiB3ZSdyZSB3YXRjaGluZyBmb3IgaXQgKi8KKwkJCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX1NZU1dNRVZFTlRdID09IFNETF9FTkFCTEUgKSB7CisJCQkgICAgICAgIFNETF9TeXNXTW1zZyB3bW1zZzsKKworCQkJCVNETF9WRVJTSU9OKCZ3bW1zZy52ZXJzaW9uKTsKKwkJCQl3bW1zZy5od25kID0gaHduZDsKKwkJCQl3bW1zZy5tc2cgPSBtc2c7CisJCQkJd21tc2cud1BhcmFtID0gd1BhcmFtOworCQkJCXdtbXNnLmxQYXJhbSA9IGxQYXJhbTsKKwkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZVN5c1dNRXZlbnQoJndtbXNnKTsKKworCQkJLyogREpNOiBJZiB0aGUgdXNlciBpc24ndCB3YXRjaGluZyBmb3IgcHJpdmF0ZQorCQkJCW1lc3NhZ2VzIGluIGhlciBTREwgZXZlbnQgbG9vcCwgdGhlbiBwYXNzIGl0CisJCQkJYWxvbmcgdG8gYW55IHdpbjMyIHNwZWNpZmljIHdpbmRvdyBwcm9jLgorCQkJICovCisJCQl9IGVsc2UgaWYgKHVzZXJXaW5kb3dQcm9jKSB7CisJCQkJcmV0dXJuIENhbGxXaW5kb3dQcm9jKHVzZXJXaW5kb3dQcm9jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuKERlZldpbmRvd1Byb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSkpOworfQorCisjaWZkZWYgX1dJTjMyX1dDRQorc3RhdGljIEJPT0wgR2V0TGFzdFN0eWx1c1BvcyhQT0lOVCogcHRMYXN0KQoreworICAgIEJPT0wgYlJlc3VsdCA9IEZBTFNFOworICAgIFVJTlQgblJldDsKKyAgICBHZXRNb3VzZU1vdmVQb2ludHMocHRMYXN0LCAxLCAmblJldCk7CisgICAgaWYgKCBuUmV0ID09IDEgKSB7CisgICAgICAgIHB0TGFzdC0+eCAvPSA0OworICAgICAgICBwdExhc3QtPnkgLz0gNDsKKyAgICAgICAgYlJlc3VsdCA9IFRSVUU7CisgICAgfQorICAgIHJldHVybiBiUmVzdWx0OworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIERJQl9HZW5lcmF0ZU1vdXNlTW90aW9uRXZlbnQoX1RISVMpCit7CisJZXh0ZXJuIGludCBtb3VzZV9yZWxhdGl2ZTsKKwlleHRlcm4gaW50IHBvc3RlZDsKKworCVBPSU5UIG1vdXNlOworI2lmZGVmIF9XSU4zMl9XQ0UKKwlpZiAoICFHZXRDdXJzb3JQb3MoJm1vdXNlKSAmJiAhR2V0TGFzdFN0eWx1c1BvcygmbW91c2UpICkgcmV0dXJuOworI2Vsc2UKKwlpZiAoICFHZXRDdXJzb3JQb3MoJm1vdXNlKSApIHJldHVybjsKKyNlbmRpZgorCisJaWYgKCBtb3VzZV9yZWxhdGl2ZSApIHsKKwkJUE9JTlQgY2VudGVyOworCQljZW50ZXIueCA9IChTRExfVmlkZW9TdXJmYWNlLT53LzIpOworCQljZW50ZXIueSA9IChTRExfVmlkZW9TdXJmYWNlLT5oLzIpOworCQlDbGllbnRUb1NjcmVlbihTRExfV2luZG93LCAmY2VudGVyKTsKKworCQltb3VzZS54IC09IGNlbnRlci54OworCQltb3VzZS55IC09IGNlbnRlci55OworCQlpZiAoIG1vdXNlLnggfHwgbW91c2UueSApIHsKKwkJCVNldEN1cnNvclBvcyhjZW50ZXIueCwgY2VudGVyLnkpOworCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAxLCAoU2ludDE2KW1vdXNlLngsIChTaW50MTYpbW91c2UueSk7CisJCX0KKwl9IGVsc2UgeworCQlTY3JlZW5Ub0NsaWVudChTRExfV2luZG93LCAmbW91c2UpOworI2lmZGVmIFNETF9WSURFT19EUklWRVJfR0FQSQorICAgICAgIGlmIChTRExfVmlkZW9TdXJmYWNlICYmIHRoaXMtPmhpZGRlbi0+Z2FwaUluZm8pCisJCQlHYXBpVHJhbnNmb3JtKHRoaXMtPmhpZGRlbi0+Z2FwaUluZm8sICZtb3VzZS54LCAmbW91c2UueSk7CisjZW5kaWYKKwkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCAoU2ludDE2KW1vdXNlLngsIChTaW50MTYpbW91c2UueSk7CisJfQorfQorCit2b2lkIERJQl9QdW1wRXZlbnRzKF9USElTKQoreworCU1TRyBtc2c7CisKKwl3aGlsZSAoIFBlZWtNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDAsIFBNX05PUkVNT1ZFKSApIHsKKwkJaWYgKCBHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApID4gMCApIHsKKwkJCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKKwkJfQorCX0KKworCWlmICggU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUyApIHsKKwkJRElCX0dlbmVyYXRlTW91c2VNb3Rpb25FdmVudCggdGhpcyApOworCX0KK30KKworc3RhdGljIEhLTCBoTGF5b3V0VVMgPSBOVUxMOworCit2b2lkIERJQl9Jbml0T1NLZXltYXAoX1RISVMpCit7CisJaW50CWk7CisjaWZuZGVmIF9XSU4zMl9XQ0UKKwljaGFyCWN1cnJlbnRfbGF5b3V0W0tMX05BTUVMRU5HVEhdOworCisJR2V0S2V5Ym9hcmRMYXlvdXROYW1lKGN1cnJlbnRfbGF5b3V0KTsKKwkvL3ByaW50ZigiSW5pdGlhbCBLZXlib2FyZCBMYXlvdXQgTmFtZTogJyVzJ1xuIiwgY3VycmVudF9sYXlvdXQpOworCisJaExheW91dFVTID0gTG9hZEtleWJvYXJkTGF5b3V0KCIwMDAwMDQwOSIsIEtMRl9OT1RFTExTSEVMTCk7CisKKwlpZiAoIWhMYXlvdXRVUykgeworCQkvL3ByaW50ZigiRmFpbGVkIHRvIGxvYWQgVVMga2V5Ym9hcmQgbGF5b3V0LiBVc2luZyBjdXJyZW50LlxuIik7CisJCWhMYXlvdXRVUyA9IEdldEtleWJvYXJkTGF5b3V0KDApOworCX0KKwlMb2FkS2V5Ym9hcmRMYXlvdXQoY3VycmVudF9sYXlvdXQsIEtMRl9BQ1RJVkFURSk7CisjZWxzZQorI2lmIF9XSU4zMl9XQ0UgPj00MjAKKwlUQ0hBUgljdXJyZW50X2xheW91dFtLTF9OQU1FTEVOR1RIXTsKKworCUdldEtleWJvYXJkTGF5b3V0TmFtZShjdXJyZW50X2xheW91dCk7CisJLy9wcmludGYoIkluaXRpYWwgS2V5Ym9hcmQgTGF5b3V0IE5hbWU6ICclcydcbiIsIGN1cnJlbnRfbGF5b3V0KTsKKworCWhMYXlvdXRVUyA9IExvYWRLZXlib2FyZExheW91dChMIjAwMDAwNDA5IiwgMCk7CisKKwlpZiAoIWhMYXlvdXRVUykgeworCQkvL3ByaW50ZigiRmFpbGVkIHRvIGxvYWQgVVMga2V5Ym9hcmQgbGF5b3V0LiBVc2luZyBjdXJyZW50LlxuIik7CisJCWhMYXlvdXRVUyA9IEdldEtleWJvYXJkTGF5b3V0KDApOworCX0KKwlMb2FkS2V5Ym9hcmRMYXlvdXQoY3VycmVudF9sYXlvdXQsIDApOworI2VuZGlmIC8vIF9XSU4zMl9XQ0UgPj00MjAKKyNlbmRpZgorCS8qIE1hcCB0aGUgVksga2V5c3ltcyAqLworCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKFZLX2tleW1hcCk7ICsraSApCisJCVZLX2tleW1hcFtpXSA9IFNETEtfVU5LTk9XTjsKKworCVZLX2tleW1hcFtWS19CQUNLXSA9IFNETEtfQkFDS1NQQUNFOworCVZLX2tleW1hcFtWS19UQUJdID0gU0RMS19UQUI7CisJVktfa2V5bWFwW1ZLX0NMRUFSXSA9IFNETEtfQ0xFQVI7CisJVktfa2V5bWFwW1ZLX1JFVFVSTl0gPSBTRExLX1JFVFVSTjsKKwlWS19rZXltYXBbVktfUEFVU0VdID0gU0RMS19QQVVTRTsKKwlWS19rZXltYXBbVktfRVNDQVBFXSA9IFNETEtfRVNDQVBFOworCVZLX2tleW1hcFtWS19TUEFDRV0gPSBTRExLX1NQQUNFOworCVZLX2tleW1hcFtWS19BUE9TVFJPUEhFXSA9IFNETEtfUVVPVEU7CisJVktfa2V5bWFwW1ZLX0NPTU1BXSA9IFNETEtfQ09NTUE7CisJVktfa2V5bWFwW1ZLX01JTlVTXSA9IFNETEtfTUlOVVM7CisJVktfa2V5bWFwW1ZLX1BFUklPRF0gPSBTRExLX1BFUklPRDsKKwlWS19rZXltYXBbVktfU0xBU0hdID0gU0RMS19TTEFTSDsKKwlWS19rZXltYXBbVktfMF0gPSBTRExLXzA7CisJVktfa2V5bWFwW1ZLXzFdID0gU0RMS18xOworCVZLX2tleW1hcFtWS18yXSA9IFNETEtfMjsKKwlWS19rZXltYXBbVktfM10gPSBTRExLXzM7CisJVktfa2V5bWFwW1ZLXzRdID0gU0RMS180OworCVZLX2tleW1hcFtWS181XSA9IFNETEtfNTsKKwlWS19rZXltYXBbVktfNl0gPSBTRExLXzY7CisJVktfa2V5bWFwW1ZLXzddID0gU0RMS183OworCVZLX2tleW1hcFtWS184XSA9IFNETEtfODsKKwlWS19rZXltYXBbVktfOV0gPSBTRExLXzk7CisJVktfa2V5bWFwW1ZLX1NFTUlDT0xPTl0gPSBTRExLX1NFTUlDT0xPTjsKKwlWS19rZXltYXBbVktfRVFVQUxTXSA9IFNETEtfRVFVQUxTOworCVZLX2tleW1hcFtWS19MQlJBQ0tFVF0gPSBTRExLX0xFRlRCUkFDS0VUOworCVZLX2tleW1hcFtWS19CQUNLU0xBU0hdID0gU0RMS19CQUNLU0xBU0g7CisJVktfa2V5bWFwW1ZLX09FTV8xMDJdID0gU0RMS19MRVNTOworCVZLX2tleW1hcFtWS19SQlJBQ0tFVF0gPSBTRExLX1JJR0hUQlJBQ0tFVDsKKwlWS19rZXltYXBbVktfR1JBVkVdID0gU0RMS19CQUNLUVVPVEU7CisJVktfa2V5bWFwW1ZLX0JBQ0tUSUNLXSA9IFNETEtfQkFDS1FVT1RFOworCVZLX2tleW1hcFtWS19BXSA9IFNETEtfYTsKKwlWS19rZXltYXBbVktfQl0gPSBTRExLX2I7CisJVktfa2V5bWFwW1ZLX0NdID0gU0RMS19jOworCVZLX2tleW1hcFtWS19EXSA9IFNETEtfZDsKKwlWS19rZXltYXBbVktfRV0gPSBTRExLX2U7CisJVktfa2V5bWFwW1ZLX0ZdID0gU0RMS19mOworCVZLX2tleW1hcFtWS19HXSA9IFNETEtfZzsKKwlWS19rZXltYXBbVktfSF0gPSBTRExLX2g7CisJVktfa2V5bWFwW1ZLX0ldID0gU0RMS19pOworCVZLX2tleW1hcFtWS19KXSA9IFNETEtfajsKKwlWS19rZXltYXBbVktfS10gPSBTRExLX2s7CisJVktfa2V5bWFwW1ZLX0xdID0gU0RMS19sOworCVZLX2tleW1hcFtWS19NXSA9IFNETEtfbTsKKwlWS19rZXltYXBbVktfTl0gPSBTRExLX247CisJVktfa2V5bWFwW1ZLX09dID0gU0RMS19vOworCVZLX2tleW1hcFtWS19QXSA9IFNETEtfcDsKKwlWS19rZXltYXBbVktfUV0gPSBTRExLX3E7CisJVktfa2V5bWFwW1ZLX1JdID0gU0RMS19yOworCVZLX2tleW1hcFtWS19TXSA9IFNETEtfczsKKwlWS19rZXltYXBbVktfVF0gPSBTRExLX3Q7CisJVktfa2V5bWFwW1ZLX1VdID0gU0RMS191OworCVZLX2tleW1hcFtWS19WXSA9IFNETEtfdjsKKwlWS19rZXltYXBbVktfV10gPSBTRExLX3c7CisJVktfa2V5bWFwW1ZLX1hdID0gU0RMS194OworCVZLX2tleW1hcFtWS19ZXSA9IFNETEtfeTsKKwlWS19rZXltYXBbVktfWl0gPSBTRExLX3o7CisJVktfa2V5bWFwW1ZLX0RFTEVURV0gPSBTRExLX0RFTEVURTsKKworCVZLX2tleW1hcFtWS19OVU1QQUQwXSA9IFNETEtfS1AwOworCVZLX2tleW1hcFtWS19OVU1QQUQxXSA9IFNETEtfS1AxOworCVZLX2tleW1hcFtWS19OVU1QQUQyXSA9IFNETEtfS1AyOworCVZLX2tleW1hcFtWS19OVU1QQUQzXSA9IFNETEtfS1AzOworCVZLX2tleW1hcFtWS19OVU1QQUQ0XSA9IFNETEtfS1A0OworCVZLX2tleW1hcFtWS19OVU1QQUQ1XSA9IFNETEtfS1A1OworCVZLX2tleW1hcFtWS19OVU1QQUQ2XSA9IFNETEtfS1A2OworCVZLX2tleW1hcFtWS19OVU1QQUQ3XSA9IFNETEtfS1A3OworCVZLX2tleW1hcFtWS19OVU1QQUQ4XSA9IFNETEtfS1A4OworCVZLX2tleW1hcFtWS19OVU1QQUQ5XSA9IFNETEtfS1A5OworCVZLX2tleW1hcFtWS19ERUNJTUFMXSA9IFNETEtfS1BfUEVSSU9EOworCVZLX2tleW1hcFtWS19ESVZJREVdID0gU0RMS19LUF9ESVZJREU7CisJVktfa2V5bWFwW1ZLX01VTFRJUExZXSA9IFNETEtfS1BfTVVMVElQTFk7CisJVktfa2V5bWFwW1ZLX1NVQlRSQUNUXSA9IFNETEtfS1BfTUlOVVM7CisJVktfa2V5bWFwW1ZLX0FERF0gPSBTRExLX0tQX1BMVVM7CisKKwlWS19rZXltYXBbVktfVVBdID0gU0RMS19VUDsKKwlWS19rZXltYXBbVktfRE9XTl0gPSBTRExLX0RPV047CisJVktfa2V5bWFwW1ZLX1JJR0hUXSA9IFNETEtfUklHSFQ7CisJVktfa2V5bWFwW1ZLX0xFRlRdID0gU0RMS19MRUZUOworCVZLX2tleW1hcFtWS19JTlNFUlRdID0gU0RMS19JTlNFUlQ7CisJVktfa2V5bWFwW1ZLX0hPTUVdID0gU0RMS19IT01FOworCVZLX2tleW1hcFtWS19FTkRdID0gU0RMS19FTkQ7CisJVktfa2V5bWFwW1ZLX1BSSU9SXSA9IFNETEtfUEFHRVVQOworCVZLX2tleW1hcFtWS19ORVhUXSA9IFNETEtfUEFHRURPV047CisKKwlWS19rZXltYXBbVktfRjFdID0gU0RMS19GMTsKKwlWS19rZXltYXBbVktfRjJdID0gU0RMS19GMjsKKwlWS19rZXltYXBbVktfRjNdID0gU0RMS19GMzsKKwlWS19rZXltYXBbVktfRjRdID0gU0RMS19GNDsKKwlWS19rZXltYXBbVktfRjVdID0gU0RMS19GNTsKKwlWS19rZXltYXBbVktfRjZdID0gU0RMS19GNjsKKwlWS19rZXltYXBbVktfRjddID0gU0RMS19GNzsKKwlWS19rZXltYXBbVktfRjhdID0gU0RMS19GODsKKwlWS19rZXltYXBbVktfRjldID0gU0RMS19GOTsKKwlWS19rZXltYXBbVktfRjEwXSA9IFNETEtfRjEwOworCVZLX2tleW1hcFtWS19GMTFdID0gU0RMS19GMTE7CisJVktfa2V5bWFwW1ZLX0YxMl0gPSBTRExLX0YxMjsKKwlWS19rZXltYXBbVktfRjEzXSA9IFNETEtfRjEzOworCVZLX2tleW1hcFtWS19GMTRdID0gU0RMS19GMTQ7CisJVktfa2V5bWFwW1ZLX0YxNV0gPSBTRExLX0YxNTsKKworCVZLX2tleW1hcFtWS19OVU1MT0NLXSA9IFNETEtfTlVNTE9DSzsKKwlWS19rZXltYXBbVktfQ0FQSVRBTF0gPSBTRExLX0NBUFNMT0NLOworCVZLX2tleW1hcFtWS19TQ1JPTExdID0gU0RMS19TQ1JPTExPQ0s7CisJVktfa2V5bWFwW1ZLX1JTSElGVF0gPSBTRExLX1JTSElGVDsKKwlWS19rZXltYXBbVktfTFNISUZUXSA9IFNETEtfTFNISUZUOworCVZLX2tleW1hcFtWS19SQ09OVFJPTF0gPSBTRExLX1JDVFJMOworCVZLX2tleW1hcFtWS19MQ09OVFJPTF0gPSBTRExLX0xDVFJMOworCVZLX2tleW1hcFtWS19STUVOVV0gPSBTRExLX1JBTFQ7CisJVktfa2V5bWFwW1ZLX0xNRU5VXSA9IFNETEtfTEFMVDsKKwlWS19rZXltYXBbVktfUldJTl0gPSBTRExLX1JTVVBFUjsKKwlWS19rZXltYXBbVktfTFdJTl0gPSBTRExLX0xTVVBFUjsKKworCVZLX2tleW1hcFtWS19IRUxQXSA9IFNETEtfSEVMUDsKKyNpZmRlZiBWS19QUklOVAorCVZLX2tleW1hcFtWS19QUklOVF0gPSBTRExLX1BSSU5UOworI2VuZGlmCisJVktfa2V5bWFwW1ZLX1NOQVBTSE9UXSA9IFNETEtfUFJJTlQ7CisJVktfa2V5bWFwW1ZLX0NBTkNFTF0gPSBTRExLX0JSRUFLOworCVZLX2tleW1hcFtWS19BUFBTXSA9IFNETEtfTUVOVTsKKworCUFycm93c19rZXltYXBbM10gPSAweDI1OworCUFycm93c19rZXltYXBbMl0gPSAweDI2OworCUFycm93c19rZXltYXBbMV0gPSAweDI3OworCUFycm93c19rZXltYXBbMF0gPSAweDI4OworfQorCisjZGVmaW5lIEVYVEtFWVBBRChrZXlwYWQpICgoc2NhbmNvZGUgJiAweDEwMCk/KG12a2UpOihrZXlwYWQpKQorCitzdGF0aWMgaW50IFNETF9NYXBWaXJ0dWFsS2V5KGludCBzY2FuY29kZSwgaW50IHZrZXkpCit7CisjaWZuZGVmIF9XSU4zMl9XQ0UKKwlpbnQJbXZrZSAgPSBNYXBWaXJ0dWFsS2V5RXgoc2NhbmNvZGUgJiAweEZGLCAxLCBoTGF5b3V0VVMpOworI2Vsc2UKKwlpbnQJbXZrZSAgPSBNYXBWaXJ0dWFsS2V5KHNjYW5jb2RlICYgMHhGRiwgMSk7CisjZW5kaWYKKworCXN3aXRjaCh2a2V5KSB7CisJCS8qIFRoZXNlIGFyZSBhbHdheXMgY29ycmVjdCAqLworCQljYXNlIFZLX0RJVklERToKKwkJY2FzZSBWS19NVUxUSVBMWToKKwkJY2FzZSBWS19TVUJUUkFDVDoKKwkJY2FzZSBWS19BREQ6CisJCWNhc2UgVktfTFdJTjoKKwkJY2FzZSBWS19SV0lOOgorCQljYXNlIFZLX0FQUFM6CisJCS8qIFRoZXNlIGFyZSBhbHJlYWR5IGhhbmRsZWQgKi8KKwkJY2FzZSBWS19MQ09OVFJPTDoKKwkJY2FzZSBWS19SQ09OVFJPTDoKKwkJY2FzZSBWS19MU0hJRlQ6CisJCWNhc2UgVktfUlNISUZUOgorCQljYXNlIFZLX0xNRU5VOgorCQljYXNlIFZLX1JNRU5VOgorCQljYXNlIFZLX1NOQVBTSE9UOgorCQljYXNlIFZLX1BBVVNFOgorCQkJcmV0dXJuIHZrZXk7CisJfQkKKwlzd2l0Y2gobXZrZSkgeworCQkvKiBEaXN0aW5ndWlzaCBiZXR3ZWVuIGtleXBhZCBhbmQgZXh0ZW5kZWQga2V5cyAqLworCQljYXNlIFZLX0lOU0VSVDogcmV0dXJuIEVYVEtFWVBBRChWS19OVU1QQUQwKTsKKwkJY2FzZSBWS19ERUxFVEU6IHJldHVybiBFWFRLRVlQQUQoVktfREVDSU1BTCk7CisJCWNhc2UgVktfRU5EOiAgICByZXR1cm4gRVhUS0VZUEFEKFZLX05VTVBBRDEpOworCQljYXNlIFZLX0RPV046ICAgcmV0dXJuIEVYVEtFWVBBRChWS19OVU1QQUQyKTsKKwkJY2FzZSBWS19ORVhUOiAgIHJldHVybiBFWFRLRVlQQUQoVktfTlVNUEFEMyk7CisJCWNhc2UgVktfTEVGVDogICByZXR1cm4gRVhUS0VZUEFEKFZLX05VTVBBRDQpOworCQljYXNlIFZLX0NMRUFSOiAgcmV0dXJuIEVYVEtFWVBBRChWS19OVU1QQUQ1KTsKKwkJY2FzZSBWS19SSUdIVDogIHJldHVybiBFWFRLRVlQQUQoVktfTlVNUEFENik7CisJCWNhc2UgVktfSE9NRTogICByZXR1cm4gRVhUS0VZUEFEKFZLX05VTVBBRDcpOworCQljYXNlIFZLX1VQOiAgICAgcmV0dXJuIEVYVEtFWVBBRChWS19OVU1QQUQ4KTsKKwkJY2FzZSBWS19QUklPUjogIHJldHVybiBFWFRLRVlQQUQoVktfTlVNUEFEOSk7CisJfQorCXJldHVybiBtdmtlP212a2U6dmtleTsKK30KKworc3RhdGljIFNETF9rZXlzeW0gKlRyYW5zbGF0ZUtleShXUEFSQU0gdmtleSwgVUlOVCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgcHJlc3NlZCkKK3sKKwkvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLworCWtleXN5bS0+c2NhbmNvZGUgPSAodW5zaWduZWQgY2hhcikgc2NhbmNvZGU7CisJa2V5c3ltLT5tb2QgPSBLTU9EX05PTkU7CisJa2V5c3ltLT51bmljb2RlID0gMDsKKwkKKwlpZiAoKHZrZXkgPT0gVktfUkVUVVJOKSAmJiAoc2NhbmNvZGUgJiAweDEwMCkpIHsKKwkJLyogTm8gVktfIGNvZGUgZm9yIHRoZSBrZXlwYWQgZW50ZXIga2V5ICovCisJCWtleXN5bS0+c3ltID0gU0RMS19LUF9FTlRFUjsKKwl9CisJZWxzZSB7CisJCWtleXN5bS0+c3ltID0gVktfa2V5bWFwW1NETF9NYXBWaXJ0dWFsS2V5KHNjYW5jb2RlLCB2a2V5KV07CisJfQorCisJaWYgKCBwcmVzc2VkICYmIFNETF9UcmFuc2xhdGVVTklDT0RFICkgeworI2lmZGVmIE5PX0dFVEtFWUJPQVJEU1RBVEUKKwkJLyogVWggb2gsIGJldHRlciBob3BlIHRoZSB2a2V5IGlzIGNsb3NlIGVub3VnaC4uICovCisJCWlmKChrZXlzeW0tPnN5bSA9PSB2a2V5KSB8fCAodmtleSA+IDB4N2YpKQorCQlrZXlzeW0tPnVuaWNvZGUgPSB2a2V5OworI2Vsc2UKKwkJQllURQlrZXlzdGF0ZVsyNTZdOworCQlVaW50MTYJd2NoYXJzWzJdOworCisJCUdldEtleWJvYXJkU3RhdGUoa2V5c3RhdGUpOworCQkvKiBOdW1sb2NrIGlzbid0IHRha2VuIGludG8gYWNjb3VudCBpbiBUb1VuaWNvZGUsCisJCSAqIHNvIHdlIGhhbmRsZSBpdCBhcyBhIHNwZWNpYWwgY2FzZSBoZXJlICovCisJCWlmICgoa2V5c3RhdGVbVktfTlVNTE9DS10gJiAxKSAmJiB2a2V5ID49IFZLX05VTVBBRDAgJiYgdmtleSA8PSBWS19OVU1QQUQ5KQorCQl7CisJCQlrZXlzeW0tPnVuaWNvZGUgPSB2a2V5IC0gVktfTlVNUEFEMCArICcwJzsKKwkJfQorCQllbHNlIGlmIChTRExfVG9Vbmljb2RlKChVSU5UKXZrZXksIHNjYW5jb2RlLCBrZXlzdGF0ZSwgd2NoYXJzLCBzaXplb2Yod2NoYXJzKS9zaXplb2Yod2NoYXJzWzBdKSwgMCkgPiAwKQorCQl7CisJCQlrZXlzeW0tPnVuaWNvZGUgPSB3Y2hhcnNbMF07CisJCX0KKyNlbmRpZiAvKiBOT19HRVRLRVlCT0FSRFNUQVRFICovCisJfQorCisjaWYgMAorCXsKKwkJSEtMICAgICBoTGF5b3V0Q3VycmVudCA9IEdldEtleWJvYXJkTGF5b3V0KDApOworCQlpbnQgICAgIHNjID0gc2NhbmNvZGUgJiAweEZGOworCisJCXByaW50ZigiU1lNOiVkLCBWSzoweCUwMlgsIFNDOjB4JTA0WCwgVVM6KDE6MHglMDJYLCAzOjB4JTAyWCksICIKKwkJCSJDdXJyZW50OigxOjB4JTAyWCwgMzoweCUwMlgpXG4iLAorCQkJa2V5c3ltLT5zeW0sIHZrZXksIHNjYW5jb2RlLAorCQkJTWFwVmlydHVhbEtleUV4KHNjLCAxLCBoTGF5b3V0VVMpLAorCQkJTWFwVmlydHVhbEtleUV4KHNjLCAzLCBoTGF5b3V0VVMpLAorCQkJTWFwVmlydHVhbEtleUV4KHNjLCAxLCBoTGF5b3V0Q3VycmVudCksCisJCQlNYXBWaXJ0dWFsS2V5RXgoc2MsIDMsIGhMYXlvdXRDdXJyZW50KQorCQkpOworCX0KKyNlbmRpZgorCXJldHVybihrZXlzeW0pOworfQorCitpbnQgRElCX0NyZWF0ZVdpbmRvdyhfVEhJUykKK3sKKwljaGFyICp3aW5kb3dpZDsKKworCVNETF9SZWdpc3RlckFwcChOVUxMLCAwLCAwKTsKKworCXdpbmRvd2lkID0gU0RMX2dldGVudigiU0RMX1dJTkRPV0lEIik7CisJU0RMX3dpbmRvd2lkID0gKHdpbmRvd2lkICE9IE5VTEwpOworCWlmICggU0RMX3dpbmRvd2lkICkgeworI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgKF9XSU4zMl9XQ0UgPCAzMDApCisJCS8qIHdpbmNlIDIuMSBkb2VzIG5vdCBoYXZlIHN0cnRvbCAqLworCQl3Y2hhcl90ICp3aW5kb3dpZF90ID0gU0RMX21hbGxvYygoU0RMX3N0cmxlbih3aW5kb3dpZCkgKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7CisJCU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCBNQl9QUkVDT01QT1NFRCwgd2luZG93aWQsIC0xLCB3aW5kb3dpZF90LCBTRExfc3RybGVuKHdpbmRvd2lkKSArIDEpOworCQlTRExfV2luZG93ID0gKEhXTkQpd2NzdG9sKHdpbmRvd2lkX3QsIE5VTEwsIDApOworCQlTRExfZnJlZSh3aW5kb3dpZF90KTsKKyNlbHNlCisJCVNETF9XaW5kb3cgPSAoSFdORCkoKHNpemVfdClTRExfc3RydG91bGwod2luZG93aWQsIE5VTEwsIDApKTsKKyNlbmRpZgorCQlpZiAoIFNETF9XaW5kb3cgPT0gTlVMTCApIHsKKwkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgZ2V0IHVzZXIgc3BlY2lmaWVkIHdpbmRvdyIpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCisJCS8qIERKTTogd2Ugd2FudCBhbGwgZXZlbnQncyBmb3IgdGhlIHVzZXIgc3BlY2lmaWVkCisJCQl3aW5kb3cgdG8gYmUgaGFuZGxlZCBieSBTREwuCisJCSAqLworCQl1c2VyV2luZG93UHJvYyA9IChXTkRQUk9DVFlQRSlHZXRXaW5kb3dMb25nUHRyKFNETF9XaW5kb3csIEdXTFBfV05EUFJPQyk7CisJCVNldFdpbmRvd0xvbmdQdHIoU0RMX1dpbmRvdywgR1dMUF9XTkRQUk9DLCAoTE9OR19QVFIpV2luTWVzc2FnZSk7CisJfSBlbHNlIHsKKwkJU0RMX1dpbmRvdyA9IENyZWF0ZVdpbmRvdyhTRExfQXBwbmFtZSwgU0RMX0FwcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAoV1NfT1ZFUkxBUFBFRHxXU19DQVBUSU9OfFdTX1NZU01FTlV8V1NfTUlOSU1JWkVCT1gpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgMCwgMCwgTlVMTCwgTlVMTCwgU0RMX0luc3RhbmNlLCBOVUxMKTsKKwkJaWYgKCBTRExfV2luZG93ID09IE5VTEwgKSB7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSB3aW5kb3ciKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJU2hvd1dpbmRvdyhTRExfV2luZG93LCBTV19ISURFKTsKKwl9CisKKwkvKiBKQyAxNCBNYXIgMjAwNgorCQlGbHVzaCB0aGUgbWVzc2FnZSBsb29wIG9yIHRoaXMgY2FuIGNhdXNlIGJpZyBwcm9ibGVtcyBsYXRlcgorCQlFc3BlY2lhbGx5IGlmIHRoZSB1c2VyIGRlY2lkZXMgdG8gdXNlIGRpYWxvZyBib3hlcyBvciBhc3NlcnQoKSEKKwkqLworCVdJTl9GbHVzaE1lc3NhZ2VRdWV1ZSgpOworCisJcmV0dXJuKDApOworfQorCit2b2lkIERJQl9EZXN0cm95V2luZG93KF9USElTKQoreworCWlmICggU0RMX3dpbmRvd2lkICkgeworCQlTZXRXaW5kb3dMb25nUHRyKFNETF9XaW5kb3csIEdXTFBfV05EUFJPQywgKExPTkdfUFRSKXVzZXJXaW5kb3dQcm9jKTsKKwl9IGVsc2UgeworCQlEZXN0cm95V2luZG93KFNETF9XaW5kb3cpOworCX0KKwlTRExfVW5yZWdpc3RlckFwcCgpOworCisJLyogSkMgMTQgTWFyIDIwMDYKKwkJRmx1c2ggdGhlIG1lc3NhZ2UgbG9vcCBvciB0aGlzIGNhbiBjYXVzZSBiaWcgcHJvYmxlbXMgbGF0ZXIKKwkJRXNwZWNpYWxseSBpZiB0aGUgdXNlciBkZWNpZGVzIHRvIHVzZSBkaWFsb2cgYm94ZXMgb3IgYXNzZXJ0KCkhCisJKi8KKwlXSU5fRmx1c2hNZXNzYWdlUXVldWUoKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5kaWIvU0RMX2RpYmV2ZW50c19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2YWE2OAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJldmVudHNfYy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9sb3d2aWRlby5oIgorCisvKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfZGliZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCisgICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX2RpYnZpZGVvLmMpCisqLworZXh0ZXJuIExPTkcKKyBESUJfSGFuZGxlTWVzc2FnZShfVEhJUywgSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitleHRlcm4gaW50IERJQl9DcmVhdGVXaW5kb3coX1RISVMpOworZXh0ZXJuIHZvaWQgRElCX0Rlc3Ryb3lXaW5kb3coX1RISVMpOworCitleHRlcm4gdm9pZCBESUJfUHVtcEV2ZW50cyhfVEhJUyk7CitleHRlcm4gdm9pZCBESUJfSW5pdE9TS2V5bWFwKF9USElTKTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJ2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5kaWIvU0RMX2RpYnZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxZmZmZgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJ2aWRlby5jCkBAIC0wLDAgKzEsMTQ5OSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLyogTm90IHlldCBpbiB0aGUgbWluZ3czMiBjcm9zcy1jb21waWxlIGhlYWRlcnMgKi8KKyNpZm5kZWYgQ0RTX0ZVTExTQ1JFRU4KKyNkZWZpbmUgQ0RTX0ZVTExTQ1JFRU4JNAorI2VuZGlmCisKKyNpbmNsdWRlICJTRExfc3lzd20uaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX3N5c2V2ZW50cy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfZ2FwaWRpYnZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2RpYnZpZGVvLmgiCisjaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9zeXN3bV9jLmgiCisjaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9zeXNtb3VzZV9jLmgiCisjaW5jbHVkZSAiU0RMX2RpYmV2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF93aW5nbF9jLmgiCisKKyNpZmRlZiBfV0lOMzJfV0NFCisKKyNpZm5kZWYgRE1fRElTUExBWU9SSUVOVEFUSU9OCisjZGVmaW5lIERNX0RJU1BMQVlPUklFTlRBVElPTiAweDAwODAwMDAwTAorI2VuZGlmCisjaWZuZGVmIERNX0RJU1BMQVlRVUVSWU9SSUVOVEFUSU9OIAorI2RlZmluZSBETV9ESVNQTEFZUVVFUllPUklFTlRBVElPTiAweDAxMDAwMDAwTAorI2VuZGlmCisjaWZuZGVmIERNRE9fMAorI2RlZmluZSBETURPXzAgICAgICAwCisjZW5kaWYKKyNpZm5kZWYgRE1ET185MAorI2RlZmluZSBETURPXzkwICAgICAxCisjZW5kaWYKKyNpZm5kZWYgRE1ET18xODAKKyNkZWZpbmUgRE1ET18xODAgICAgMgorI2VuZGlmCisjaWZuZGVmIERNRE9fMjcwCisjZGVmaW5lIERNRE9fMjcwICAgIDQKKyNlbmRpZgorCisjZGVmaW5lIE5PX0dFVERJQklUUworI2RlZmluZSBOT19HQU1NQV9TVVBQT1JUCisgICNpZiBfV0lOMzJfV0NFIDwgNDIwCisgICAgI2RlZmluZSBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIENoYW5nZURpc3BsYXlTZXR0aW5ncyhscERldk1vZGUsIGR3RmxhZ3MpIENoYW5nZURpc3BsYXlTZXR0aW5nc0V4KE5VTEwsIChscERldk1vZGUpLCAwLCAoZHdGbGFncyksIDApCisgICNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFdTX01BWElNSVpFCisjZGVmaW5lIFdTX01BWElNSVpFCTAKKyNlbmRpZgorI2lmbmRlZiBXU19USElDS0ZSQU1FCisjZGVmaW5lIFdTX1RISUNLRlJBTUUJMAorI2VuZGlmCisjaWZuZGVmIFNXUF9OT0NPUFlCSVRTCisjZGVmaW5lIFNXUF9OT0NPUFlCSVRTCTAKKyNlbmRpZgorI2lmbmRlZiBQQ19OT0NPTExBUFNFCisjZGVmaW5lIFBDX05PQ09MTEFQU0UJMAorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzJfV0NFCisvLyBkZWZpbmVkIGFuZCB1c2VkIGluIFNETF9zeXNldmVudHMuYworZXh0ZXJuIEhJTlNUQU5DRSBheWdzaGVsbDsKKyNlbmRpZgorCisvKiBJbml0aWFsaXphdGlvbi9RdWVyeSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgRElCX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKkRJQl9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworU0RMX1N1cmZhY2UgKkRJQl9TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgaW50IERJQl9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywKKwkJCSBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBESUJfQ2hlY2tHYW1tYShfVEhJUyk7Cit2b2lkIERJQl9Td2FwR2FtbWEoX1RISVMpOwordm9pZCBESUJfUXVpdEdhbW1hKF9USElTKTsKK2ludCBESUJfU2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApOworaW50IERJQl9HZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCk7CitzdGF0aWMgdm9pZCBESUJfVmlkZW9RdWl0KF9USElTKTsKKworLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgRElCX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IERJQl9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBESUJfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBESUJfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKiBXaW5kb3dzIG1lc3NhZ2UgaGFuZGxpbmcgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBESUJfR3JhYlN0YXRpY0NvbG9ycyhIV05EIHdpbmRvdyk7CitzdGF0aWMgdm9pZCBESUJfUmVsZWFzZVN0YXRpY0NvbG9ycyhIV05EIHdpbmRvdyk7CitzdGF0aWMgdm9pZCBESUJfQWN0aXZhdGUoX1RISVMsIEJPT0wgYWN0aXZlLCBCT09MIG1pbmltaXplZCk7CitzdGF0aWMgdm9pZCBESUJfUmVhbGl6ZVBhbGV0dGUoX1RISVMpOworc3RhdGljIHZvaWQgRElCX1BhbGV0dGVDaGFuZ2VkKF9USElTLCBIV05EIHdpbmRvdyk7CitzdGF0aWMgdm9pZCBESUJfV2luUEFJTlQoX1RISVMsIEhEQyBoZGMpOworCitzdGF0aWMgdm9pZCBESUJfR2V0V2luUG9zKF9USElTLCBpbnQqIHB4LCBpbnQgKnB5KTsKK3N0YXRpYyB2b2lkIERJQl9TZXRXaW5Qb3MoX1RISVMsIGludCAgeCwgaW50ICB5KTsKK3N0YXRpYyBpbnQgIERJQl9Jc1dpblZpc2libGUoX1RISVMsIGludCByZWNlbnRlcik7CitzdGF0aWMgaW50ICBESUJfR2V0TW9uaXRvckRQSShfVEhJUywgaW50KiB4RHBpLCBpbnQgKnlEcGkpOworc3RhdGljIGludCAgRElCX0dldE1vbml0b3JSZWN0KF9USElTLCBTRExfUmVjdCogIHJlY3QpOworCisvKiBoZWxwZXIgZm4gKi8KK3N0YXRpYyBpbnQgRElCX1N1c3NTY3JlZW5EZXB0aCgpOworCisvKiBESUIgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBESUJfQXZhaWxhYmxlKHZvaWQpCit7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgdm9pZCBESUJfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworCWlmICggZGV2aWNlICkgeworCQlpZiAoIGRldmljZS0+aGlkZGVuICkgeworCQkJaWYgKCBkZXZpY2UtPmhpZGRlbi0+ZGliSW5mbyApIHsKKwkJCQlTRExfZnJlZSggZGV2aWNlLT5oaWRkZW4tPmRpYkluZm8gKTsKKwkJCX0KKwkJCVNETF9mcmVlKGRldmljZS0+aGlkZGVuKTsKKwkJfQorCQlpZiAoIGRldmljZS0+Z2xfZGF0YSApIHsKKwkJCVNETF9mcmVlKGRldmljZS0+Z2xfZGF0YSk7CisJCX0KKwkJU0RMX2ZyZWUoZGV2aWNlKTsKKwl9Cit9CisKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKkRJQl9DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworCVNETF9WaWRlb0RldmljZSAqZGV2aWNlOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlkZXZpY2UgPSAoU0RMX1ZpZGVvRGV2aWNlICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1ZpZGVvRGV2aWNlKSk7CisJaWYgKCBkZXZpY2UgKSB7CisJCVNETF9tZW1zZXQoZGV2aWNlLCAwLCAoc2l6ZW9mICpkZXZpY2UpKTsKKwkJZGV2aWNlLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhICopCisJCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCQlpZihkZXZpY2UtPmhpZGRlbil7CisJCQlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCQkJZGV2aWNlLT5oaWRkZW4tPmRpYkluZm8gPSAoRGliSW5mbyAqKVNETF9tYWxsb2MoKHNpemVvZihEaWJJbmZvKSkpOworCQkJaWYoZGV2aWNlLT5oaWRkZW4tPmRpYkluZm8gPT0gTlVMTCkKKwkJCXsKKwkJCQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJCQkJZGV2aWNlLT5oaWRkZW4gPSBOVUxMOworCQkJfQorCQl9CisJCQorCQlkZXZpY2UtPmdsX2RhdGEgPSAoc3RydWN0IFNETF9Qcml2YXRlR0xEYXRhICopCisJCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmdsX2RhdGEpKTsKKwl9CisJaWYgKCAoZGV2aWNlID09IE5VTEwpIHx8IChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSB8fAorCQkgICAgICAgICAgICAgICAgIChkZXZpY2UtPmdsX2RhdGEgPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlESUJfRGVsZXRlRGV2aWNlKGRldmljZSk7CisJCXJldHVybihOVUxMKTsKKwl9CisJU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbi0+ZGliSW5mbywgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4tPmRpYkluZm8pKTsKKwlTRExfbWVtc2V0KGRldmljZS0+Z2xfZGF0YSwgMCwgKHNpemVvZiAqZGV2aWNlLT5nbF9kYXRhKSk7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBESUJfVmlkZW9Jbml0OworCWRldmljZS0+TGlzdE1vZGVzID0gRElCX0xpc3RNb2RlczsKKwlkZXZpY2UtPlNldFZpZGVvTW9kZSA9IERJQl9TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5VcGRhdGVNb3VzZSA9IFdJTl9VcGRhdGVNb3VzZTsKKwlkZXZpY2UtPlNldENvbG9ycyA9IERJQl9TZXRDb2xvcnM7CisJZGV2aWNlLT5VcGRhdGVSZWN0cyA9IE5VTEw7CisJZGV2aWNlLT5WaWRlb1F1aXQgPSBESUJfVmlkZW9RdWl0OworCWRldmljZS0+QWxsb2NIV1N1cmZhY2UgPSBESUJfQWxsb2NIV1N1cmZhY2U7CisJZGV2aWNlLT5DaGVja0hXQmxpdCA9IE5VTEw7CisJZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKKwlkZXZpY2UtPlNldEhXQ29sb3JLZXkgPSBOVUxMOworCWRldmljZS0+U2V0SFdBbHBoYSA9IE5VTEw7CisJZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gRElCX0xvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBESUJfVW5sb2NrSFdTdXJmYWNlOworCWRldmljZS0+RmxpcEhXU3VyZmFjZSA9IE5VTEw7CisJZGV2aWNlLT5GcmVlSFdTdXJmYWNlID0gRElCX0ZyZWVIV1N1cmZhY2U7CisJZGV2aWNlLT5TZXRHYW1tYVJhbXAgPSBESUJfU2V0R2FtbWFSYW1wOworCWRldmljZS0+R2V0R2FtbWFSYW1wID0gRElCX0dldEdhbW1hUmFtcDsKKyNpZiBTRExfVklERU9fT1BFTkdMCisJZGV2aWNlLT5HTF9Mb2FkTGlicmFyeSA9IFdJTl9HTF9Mb2FkTGlicmFyeTsKKwlkZXZpY2UtPkdMX0dldFByb2NBZGRyZXNzID0gV0lOX0dMX0dldFByb2NBZGRyZXNzOworCWRldmljZS0+R0xfR2V0QXR0cmlidXRlID0gV0lOX0dMX0dldEF0dHJpYnV0ZTsKKwlkZXZpY2UtPkdMX01ha2VDdXJyZW50ID0gV0lOX0dMX01ha2VDdXJyZW50OworCWRldmljZS0+R0xfU3dhcEJ1ZmZlcnMgPSBXSU5fR0xfU3dhcEJ1ZmZlcnM7CisjZW5kaWYKKwlkZXZpY2UtPlNldENhcHRpb24gPSBXSU5fU2V0V01DYXB0aW9uOworCWRldmljZS0+U2V0SWNvbiA9IFdJTl9TZXRXTUljb247CisJZGV2aWNlLT5JY29uaWZ5V2luZG93ID0gV0lOX0ljb25pZnlXaW5kb3c7CisJZGV2aWNlLT5HcmFiSW5wdXQgPSBXSU5fR3JhYklucHV0OworCWRldmljZS0+R2V0V01JbmZvID0gV0lOX0dldFdNSW5mbzsKKwlkZXZpY2UtPkZyZWVXTUN1cnNvciA9IFdJTl9GcmVlV01DdXJzb3I7CisJZGV2aWNlLT5DcmVhdGVXTUN1cnNvciA9IFdJTl9DcmVhdGVXTUN1cnNvcjsKKwlkZXZpY2UtPlNob3dXTUN1cnNvciA9IFdJTl9TaG93V01DdXJzb3I7CisJZGV2aWNlLT5XYXJwV01DdXJzb3IgPSBXSU5fV2FycFdNQ3Vyc29yOworCWRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBXSU5fQ2hlY2tNb3VzZU1vZGU7CisJZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBESUJfSW5pdE9TS2V5bWFwOworCWRldmljZS0+UHVtcEV2ZW50cyA9IERJQl9QdW1wRXZlbnRzOworCisJZGV2aWNlLT5HZXRXaW5kb3dQb3MgPSBESUJfR2V0V2luUG9zOworCWRldmljZS0+U2V0V2luZG93UG9zID0gRElCX1NldFdpblBvczsKKwlkZXZpY2UtPklzV2luZG93VmlzaWJsZSA9IERJQl9Jc1dpblZpc2libGU7CisJZGV2aWNlLT5HZXRNb25pdG9yRFBJID0gRElCX0dldE1vbml0b3JEUEk7CisJZGV2aWNlLT5HZXRNb25pdG9yUmVjdCA9IERJQl9HZXRNb25pdG9yUmVjdDsKKworCS8qIFNldCB1cCB0aGUgd2luZG93cyBtZXNzYWdlIGhhbmRsaW5nIGZ1bmN0aW9ucyAqLworCVdJTl9BY3RpdmF0ZSA9IERJQl9BY3RpdmF0ZTsKKwlXSU5fUmVhbGl6ZVBhbGV0dGUgPSBESUJfUmVhbGl6ZVBhbGV0dGU7CisJV0lOX1BhbGV0dGVDaGFuZ2VkID0gRElCX1BhbGV0dGVDaGFuZ2VkOworCVdJTl9XaW5QQUlOVCA9IERJQl9XaW5QQUlOVDsKKwlIYW5kbGVNZXNzYWdlID0gRElCX0hhbmRsZU1lc3NhZ2U7CisKKwlkZXZpY2UtPmZyZWUgPSBESUJfRGVsZXRlRGV2aWNlOworCisJLyogV2UncmUgZmluYWxseSByZWFkeSAqLworCXJldHVybiBkZXZpY2U7Cit9CisKK1ZpZGVvQm9vdFN0cmFwIFdJTkRJQl9ib290c3RyYXAgPSB7CisJIndpbmRpYiIsICJXaW45NS85OC9OVC8yMDAwL0NFIEdESSIsCisJRElCX0F2YWlsYWJsZSwgRElCX0NyZWF0ZURldmljZQorfTsKKworc3RhdGljIGludCBjbXBtb2Rlcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCit7CisgICAgU0RMX1JlY3QgKmEgPSAqKFNETF9SZWN0ICoqKXZhOworICAgIFNETF9SZWN0ICpiID0gKihTRExfUmVjdCAqKil2YjsKKyAgICBpZiAoIGEtPncgPT0gYi0+dyApCisgICAgICAgIHJldHVybiBiLT5oIC0gYS0+aDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBiLT53IC0gYS0+dzsKK30KKworc3RhdGljIGludCBESUJfQWRkTW9kZShfVEhJUywgaW50IGJwcCwgaW50IHcsIGludCBoKQoreworCVNETF9SZWN0ICptb2RlOworCWludCBpLCBpbmRleDsKKwlpbnQgbmV4dF9tb2RlOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIG1vZGUgKi8KKwlpZiAoIGJwcCA8IDggfHwgYnBwID4gMzIgKSB7ICAvKiBOb3Qgc3VwcG9ydGVkICovCisJCXJldHVybigwKTsKKwl9CisJaW5kZXggPSAoKGJwcCs3KS84KS0xOworCWZvciAoIGk9MDsgaTxTRExfbnVtbW9kZXNbaW5kZXhdOyArK2kgKSB7CisJCW1vZGUgPSBTRExfbW9kZWxpc3RbaW5kZXhdW2ldOworCQlpZiAoIChtb2RlLT53ID09IHcpICYmIChtb2RlLT5oID09IGgpICkgeworCQkJcmV0dXJuKDApOworCQl9CisJfQorCisJLyogU2V0IHVwIHRoZSBuZXcgdmlkZW8gbW9kZSByZWN0YW5nbGUgKi8KKwltb2RlID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YgKm1vZGUpOworCWlmICggbW9kZSA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJbW9kZS0+eCA9IDA7CisJbW9kZS0+eSA9IDA7CisJbW9kZS0+dyA9IHc7CisJbW9kZS0+aCA9IGg7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IGxpc3Qgb2YgbW9kZXMsIGFuZCBmaWxsIGluIHRoZSBuZXcgbW9kZSAqLworCW5leHRfbW9kZSA9IFNETF9udW1tb2Rlc1tpbmRleF07CisJU0RMX21vZGVsaXN0W2luZGV4XSA9IChTRExfUmVjdCAqKikKKwkgICAgICAgU0RMX3JlYWxsb2MoU0RMX21vZGVsaXN0W2luZGV4XSwgKDErbmV4dF9tb2RlKzEpKnNpemVvZihTRExfUmVjdCAqKSk7CisJaWYgKCBTRExfbW9kZWxpc3RbaW5kZXhdID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlTRExfbnVtbW9kZXNbaW5kZXhdID0gMDsKKwkJU0RMX2ZyZWUobW9kZSk7CisJCXJldHVybigtMSk7CisJfQorCVNETF9tb2RlbGlzdFtpbmRleF1bbmV4dF9tb2RlXSA9IG1vZGU7CisJU0RMX21vZGVsaXN0W2luZGV4XVtuZXh0X21vZGUrMV0gPSBOVUxMOworCVNETF9udW1tb2Rlc1tpbmRleF0rKzsKKworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgRElCX0NyZWF0ZVBhbGV0dGUoX1RISVMsIGludCBicHApCit7CisvKglSSlI6IE1hcmNoIDI4LCAyMDAwCisJbW92ZWQgcGFsZXR0ZSBjcmVhdGlvbiBoZXJlIGZyb20gIkRJQl9WaWRlb0luaXQiICovCisKKwlMT0dQQUxFVFRFICpwYWxldHRlOworCUhEQyBoZGM7CisJaW50IG5jb2xvcnM7CisKKwluY29sb3JzID0gKDEgPDwgYnBwKTsKKwlwYWxldHRlID0gKExPR1BBTEVUVEUgKilTRExfbWFsbG9jKHNpemVvZigqcGFsZXR0ZSkrCisJCQkJbmNvbG9ycypzaXplb2YoUEFMRVRURUVOVFJZKSk7CisJcGFsZXR0ZS0+cGFsVmVyc2lvbiA9IDB4MzAwOworCXBhbGV0dGUtPnBhbE51bUVudHJpZXMgPSBuY29sb3JzOworCWhkYyA9IEdldERDKFNETF9XaW5kb3cpOworCUdldFN5c3RlbVBhbGV0dGVFbnRyaWVzKGhkYywgMCwgbmNvbG9ycywgcGFsZXR0ZS0+cGFsUGFsRW50cnkpOworCVJlbGVhc2VEQyhTRExfV2luZG93LCBoZGMpOworCXNjcmVlbl9wYWwgPSBDcmVhdGVQYWxldHRlKHBhbGV0dGUpOworCXNjcmVlbl9sb2dwYWwgPSBwYWxldHRlOworfQorCitpbnQgRElCX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQoreworCWNvbnN0IGNoYXIgKmVudiA9IE5VTEw7CisjaWZuZGVmIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUworCWludCBpOworCURFVk1PREUgc2V0dGluZ3M7CisjZW5kaWYKKworCS8qIENyZWF0ZSB0aGUgd2luZG93ICovCisJaWYgKCBESUJfQ3JlYXRlV2luZG93KHRoaXMpIDwgMCApIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKyNpZiAhU0RMX0FVRElPX0RJU0FCTEVECisJRFg1X1NvdW5kRm9jdXMoU0RMX1dpbmRvdyk7CisjZW5kaWYKKworCS8qIERldGVybWluZSB0aGUgc2NyZWVuIGRlcHRoICovCisJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gRElCX1N1c3NTY3JlZW5EZXB0aCgpOworCXN3aXRjaCAodmZvcm1hdC0+Qml0c1BlclBpeGVsKSB7CisJCWNhc2UgMTU6CisJCQl2Zm9ybWF0LT5SbWFzayA9IDB4MDAwMDdjMDA7CisJCQl2Zm9ybWF0LT5HbWFzayA9IDB4MDAwMDAzZTA7CisJCQl2Zm9ybWF0LT5CbWFzayA9IDB4MDAwMDAwMWY7CisJCQl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJdmZvcm1hdC0+Um1hc2sgPSAweDAwMDBmODAwOworCQkJdmZvcm1hdC0+R21hc2sgPSAweDAwMDAwN2UwOworCQkJdmZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMDFmOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCWNhc2UgMzI6CisJCQkvKiBHREkgZGVmaW5lZCBhcyA4LTgtOCAqLworCQkJdmZvcm1hdC0+Um1hc2sgPSAweDAwZmYwMDAwOworCQkJdmZvcm1hdC0+R21hc2sgPSAweDAwMDBmZjAwOworCQkJdmZvcm1hdC0+Qm1hc2sgPSAweDAwMDAwMGZmOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwkvKiBTZWUgaWYgZ2FtbWEgaXMgc3VwcG9ydGVkIG9uIHRoaXMgc2NyZWVuICovCisJRElCX0NoZWNrR2FtbWEodGhpcyk7CisKKyNpZm5kZWYgTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTCisKKwlzZXR0aW5ncy5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7CisJc2V0dGluZ3MuZG1Ecml2ZXJFeHRyYSA9IDA7CisjaWZkZWYgX1dJTjMyX1dDRQorCXNldHRpbmdzLmRtRmllbGRzID0gRE1fRElTUExBWVFVRVJZT1JJRU5UQVRJT047CisJdGhpcy0+aGlkZGVuLT5zdXBwb3J0Um90YXRpb24gPSBDaGFuZ2VEaXNwbGF5U2V0dGluZ3NFeChOVUxMLCAmc2V0dGluZ3MsIE5VTEwsIENEU19URVNULCBOVUxMKSA9PSBESVNQX0NIQU5HRV9TVUNDRVNTRlVMOworI2VuZGlmCisJLyogUXVlcnkgZm9yIHRoZSBkZXNrdG9wIHJlc29sdXRpb24gKi8KKwlTRExfZGVza3RvcF9tb2RlLmRtU2l6ZSA9IHNpemVvZihTRExfZGVza3RvcF9tb2RlKTsKKwlTRExfZGVza3RvcF9tb2RlLmRtRHJpdmVyRXh0cmEgPSAwOworCUVudW1EaXNwbGF5U2V0dGluZ3MoTlVMTCwgRU5VTV9DVVJSRU5UX1NFVFRJTkdTLCAmU0RMX2Rlc2t0b3BfbW9kZSk7CisJdGhpcy0+aW5mby5jdXJyZW50X3cgPSBTRExfZGVza3RvcF9tb2RlLmRtUGVsc1dpZHRoOworCXRoaXMtPmluZm8uY3VycmVudF9oID0gU0RMX2Rlc2t0b3BfbW9kZS5kbVBlbHNIZWlnaHQ7CisKKwkvKiBRdWVyeSBmb3IgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHZpZGVvIG1vZGVzICovCisJZm9yICggaT0wOyBFbnVtRGlzcGxheVNldHRpbmdzKE5VTEwsIGksICZzZXR0aW5ncyk7ICsraSApIHsKKwkJRElCX0FkZE1vZGUodGhpcywgc2V0dGluZ3MuZG1CaXRzUGVyUGVsLAorCQkJc2V0dGluZ3MuZG1QZWxzV2lkdGgsIHNldHRpbmdzLmRtUGVsc0hlaWdodCk7CisjaWZkZWYgX1dJTjMyX1dDRQkJCisJCWlmKCB0aGlzLT5oaWRkZW4tPnN1cHBvcnRSb3RhdGlvbiApCisJCQlESUJfQWRkTW9kZSh0aGlzLCBzZXR0aW5ncy5kbUJpdHNQZXJQZWwsCisJCQkJc2V0dGluZ3MuZG1QZWxzSGVpZ2h0LCBzZXR0aW5ncy5kbVBlbHNXaWR0aCk7CisjZW5kaWYKKwl9CisJLyogU29ydCB0aGUgbW9kZSBsaXN0cyAqLworCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7CisJCWlmICggU0RMX251bW1vZGVzW2ldID4gMCApIHsKKwkJCVNETF9xc29ydChTRExfbW9kZWxpc3RbaV0sIFNETF9udW1tb2Rlc1tpXSwgc2l6ZW9mICpTRExfbW9kZWxpc3RbaV0sIGNtcG1vZGVzKTsKKwkJfQorCX0KKyNlbHNlCisJLy8gV2luQ0UgYW5kIGZ1bGxzY3JlZW4gbW9kZToKKwkvLyBXZSB1c2Ugb25seSB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgdGhhdCBhbGxvdyBTREwgdG8KKwkvLyBlbXVsYXRlIG90aGVyIGJwcCAoOCwgMzIpIGFuZCB1c2UgdHJpcGxlIGJ1ZmZlciwgCisJLy8gYmVjYXVzZSBTREwgc3VyZmFjZSBjb252ZXJzaW9uIGlzIG11Y2ggZmFzdGVyIHRoYW4gdGhlIFdpbkNFIG9uZS4KKwkvLyBBbHRob3VnaCBpdCBzaG91bGQgYmUgdGVzdGVkIG9uIGRldmljZXMgd2l0aCBncmFwaGljcyBhY2NlbGVyYXRvci4KKworCURJQl9BZGRNb2RlKHRoaXMsIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCwKKwkJCUdldERldmljZUNhcHMoR2V0REMoTlVMTCksIEhPUlpSRVMpLCAKKwkJCUdldERldmljZUNhcHMoR2V0REMoTlVMTCksIFZFUlRSRVMpKTsKKworI2VuZGlmIC8qICFOT19DSEFOR0VESVNQTEFZU0VUVElOR1MgKi8KKworCS8qIEdyYWIgYW4gaWRlbnRpdHkgcGFsZXR0ZSBpZiB3ZSBhcmUgaW4gYSBwYWxldHRpemVkIG1vZGUgKi8KKwlpZiAoIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCA8PSA4ICkgeworCS8qCVJKUjogTWFyY2ggMjgsIDIwMDAKKwkJbW92ZWQgcGFsZXR0ZSBjcmVhdGlvbiB0byAiRElCX0NyZWF0ZVBhbGV0dGUiICovCisJCURJQl9DcmVhdGVQYWxldHRlKHRoaXMsIHZmb3JtYXQtPkJpdHNQZXJQaXhlbCk7CisJfQorCisJLyogRmlsbCBpbiBzb21lIHdpbmRvdyBtYW5hZ2VyIGNhcGFiaWxpdGllcyAqLworCXRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMTsKKworI2lmZGVmIF9XSU4zMl9XQ0UKKwl0aGlzLT5oaWRkZW4tPm9yaWdSb3RhdGlvbiA9IC0xOworI2VuZGlmCisKKwkvKiBBbGxvdyBlbnZpcm9ubWVudCBvdmVycmlkZSBvZiBzY3JlZW5zYXZlciBkaXNhYmxlLiAqLworCWVudiA9IFNETF9nZXRlbnYoIlNETF9WSURFT19BTExPV19TQ1JFRU5TQVZFUiIpOworCWlmICggZW52ICkgeworCQlhbGxvd19zY3JlZW5zYXZlciA9IFNETF9hdG9pKGVudik7CisJfSBlbHNlIHsKKyNpZmRlZiBTRExfVklERU9fRElTQUJMRV9TQ1JFRU5TQVZFUgorCQlhbGxvd19zY3JlZW5zYXZlciA9IDA7CisjZWxzZQorCQlhbGxvd19zY3JlZW5zYXZlciA9IDE7CisjZW5kaWYKKwl9CisKKwkvKiBXZSdyZSBkb25lISAqLworCXJldHVybigwKTsKK30KKworLyogV2Ugc3VwcG9ydCBhbnkgZm9ybWF0IGF0IGFueSBkaW1lbnNpb24gKi8KK1NETF9SZWN0ICoqRElCX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKwlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSA9PSBTRExfRlVMTFNDUkVFTiApIHsKKwkJcmV0dXJuKFNETF9tb2RlbGlzdFsoKGZvcm1hdC0+Qml0c1BlclBpeGVsKzcpLzgpLTFdKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oKFNETF9SZWN0ICoqKS0xKTsKKwl9Cit9CisKKworLyoKKyAgSGVscGVyIGZuIHRvIHdvcmsgb3V0IHdoaWNoIHNjcmVlbiBkZXB0aCB3aW5kb3dzIGlzIGN1cnJlbnRseSB1c2luZy4KKyAgMTUgYml0IG1vZGUgaXMgY29uc2lkZXJlZCA1NTUgZm9ybWF0LCAxNiBiaXQgaXMgNTY1LgorICByZXR1cm5zIDAgZm9yIHVua25vd24gbW9kZS4KKyAgKERlcml2ZWQgZnJvbSBjb2RlIGluIHNlcHQgMTk5OSBXaW5kb3dzIERldmVsb3BlciBKb3VybmFsCisgIGh0dHA6Ly93d3cud2RqLmNvbS9jb2RlL2FyY2hpdmUuaHRtbCkKKyovCitzdGF0aWMgaW50IERJQl9TdXNzU2NyZWVuRGVwdGgoKQoreworI2lmZGVmIE5PX0dFVERJQklUUworCWludCBkZXB0aDsKKwlIREMgaGRjOworCisJaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7CisJZGVwdGggPSBHZXREZXZpY2VDYXBzKGhkYywgUExBTkVTKSAqIEdldERldmljZUNhcHMoaGRjLCBCSVRTUElYRUwpOworCVJlbGVhc2VEQyhTRExfV2luZG93LCBoZGMpOworCXJldHVybihkZXB0aCk7CisjZWxzZQorICAgIGludCBkZXB0aDsKKyAgICBpbnQgZGliX3NpemU7CisgICAgTFBCSVRNQVBJTkZPSEVBREVSIGRpYl9oZHI7CisgICAgSERDIGhkYzsKKyAgICBIQklUTUFQIGhibTsKKworICAgIC8qIEFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgYSBESUIgaGVhZGVyIHBsdXMgcGFsZXR0ZSAoZm9yCisgICAgICogOC1iaXQgbW9kZXMpIG9yIGJpdGZpZWxkcyAoZm9yIDE2LSBhbmQgMzItYml0IG1vZGVzKQorICAgICAqLworICAgIGRpYl9zaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgMjU2ICogc2l6ZW9mIChSR0JRVUFEKTsKKyAgICBkaWJfaGRyID0gKExQQklUTUFQSU5GT0hFQURFUikgU0RMX21hbGxvYyhkaWJfc2l6ZSk7CisgICAgU0RMX21lbXNldChkaWJfaGRyLCAwLCBkaWJfc2l6ZSk7CisgICAgZGliX2hkci0+YmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICAgIAorICAgIC8qIEdldCBhIGRldmljZS1kZXBlbmRlbnQgYml0bWFwIHRoYXQncyBjb21wYXRpYmxlIHdpdGggdGhlCisgICAgICAgc2NyZWVuLgorICAgICAqLworICAgIGhkYyA9IEdldERDKE5VTEwpOworICAgIGhibSA9IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAoIGhkYywgMSwgMSApOworCisgICAgLyogQ29udmVydCB0aGUgRERCIHRvIGEgRElCLiAgV2UgbmVlZCB0byBjYWxsIEdldERJQml0cyB0d2ljZToKKyAgICAgKiB0aGUgZmlyc3QgY2FsbCBqdXN0IGZpbGxzIGluIHRoZSBCSVRNQVBJTkZPSEVBREVSOyB0aGUgCisgICAgICogc2Vjb25kIGZpbGxzIGluIHRoZSBiaXRmaWVsZHMgb3IgcGFsZXR0ZS4KKyAgICAgKi8KKyAgICBHZXRESUJpdHMoaGRjLCBoYm0sIDAsIDEsIE5VTEwsIChMUEJJVE1BUElORk8pIGRpYl9oZHIsIERJQl9SR0JfQ09MT1JTKTsKKyAgICBHZXRESUJpdHMoaGRjLCBoYm0sIDAsIDEsIE5VTEwsIChMUEJJVE1BUElORk8pIGRpYl9oZHIsIERJQl9SR0JfQ09MT1JTKTsKKyAgICBEZWxldGVPYmplY3QoaGJtKTsKKyAgICBSZWxlYXNlREMoTlVMTCwgaGRjKTsKKworICAgIGRlcHRoID0gMDsKKyAgICBzd2l0Y2goIGRpYl9oZHItPmJpQml0Q291bnQgKQorICAgIHsKKyAgICBjYXNlIDg6ICAgICBkZXB0aCA9IDg7IGJyZWFrOworICAgIGNhc2UgMjQ6ICAgIGRlcHRoID0gMjQ7IGJyZWFrOworICAgIGNhc2UgMzI6ICAgIGRlcHRoID0gMzI7IGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICAgIGlmKCBkaWJfaGRyLT5iaUNvbXByZXNzaW9uID09IEJJX0JJVEZJRUxEUyApIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIHRoZSByZWQgbWFzayAqLworICAgICAgICAgICAgc3dpdGNoKCAoKERXT1JEKikoKGNoYXIqKWRpYl9oZHIgKyBkaWJfaGRyLT5iaVNpemUpKVswXSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4ZjgwMDogZGVwdGggPSAxNjsgYnJlYWs7ICAgLyogNTY1ICovCisgICAgICAgICAgICAgICAgY2FzZSAweDdjMDA6IGRlcHRoID0gMTU7IGJyZWFrOyAgIC8qIDU1NSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFNETF9mcmVlKGRpYl9oZHIpOworICAgIHJldHVybiBkZXB0aDsKKyNlbmRpZiAvKiBOT19HRVRESUJJVFMgKi8KK30KKworCisvKiBWYXJpb3VzIHNjcmVlbiB1cGRhdGUgZnVuY3Rpb25zIGF2YWlsYWJsZSAqLworc3RhdGljIHZvaWQgRElCX05vcm1hbFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCitzdGF0aWMgdm9pZCBESUJfUmVzaXplV2luZG93KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwcmV2X3dpZHRoLCBpbnQgcHJldl9oZWlnaHQsIFVpbnQzMiBmbGFncykKK3sKKwlSRUNUIGJvdW5kczsKKwlpbnQgeCwgeTsKKworI2lmbmRlZiBfV0lOMzJfV0NFCisJLyogUmVzaXplIHRoZSB3aW5kb3cgKi8KKwlpZiAoICFTRExfd2luZG93aWQgJiYgIUlzWm9vbWVkKFNETF9XaW5kb3cpICkgeworI2Vsc2UKKwlpZiAoICFTRExfd2luZG93aWQgKSB7CisjZW5kaWYKKwkJSFdORCB0b3A7CisJCVVJTlQgc3dwX2ZsYWdzOworCQljb25zdCBjaGFyICp3aW5kb3cgPSBOVUxMOworCQljb25zdCBjaGFyICpjZW50ZXIgPSBOVUxMOworCisJCWlmICggd2lkdGggIT0gcHJldl93aWR0aCB8fCBoZWlnaHQgIT0gcHJldl9oZWlnaHQgKSB7CisJCQl3aW5kb3cgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fV0lORE9XX1BPUyIpOworCQkJY2VudGVyID0gU0RMX2dldGVudigiU0RMX1ZJREVPX0NFTlRFUkVEIik7CisJCQlpZiAoIHdpbmRvdyApIHsKKwkJCQlpZiAoIFNETF9zc2NhbmYod2luZG93LCAiJWQsJWQiLCAmeCwgJnkpID09IDIgKSB7CisJCQkJCVNETF93aW5kb3dYID0geDsKKwkJCQkJU0RMX3dpbmRvd1kgPSB5OworCQkJCX0KKwkJCQlpZiAoIFNETF9zdHJjbXAod2luZG93LCAiY2VudGVyIikgPT0gMCApIHsKKwkJCQkJY2VudGVyID0gd2luZG93OworCQkJCX0KKwkJCX0KKwkJfQorCQlzd3BfZmxhZ3MgPSAoU1dQX05PQ09QWUJJVFMgfCBTV1BfU0hPV1dJTkRPVyk7CisKKwkJYm91bmRzLmxlZnQgPSBTRExfd2luZG93WDsKKwkJYm91bmRzLnRvcCA9IFNETF93aW5kb3dZOworCQlib3VuZHMucmlnaHQgPSBTRExfd2luZG93WCt3aWR0aDsKKwkJYm91bmRzLmJvdHRvbSA9IFNETF93aW5kb3dZK2hlaWdodDsKKyNpZm5kZWYgX1dJTjMyX1dDRQorCQlBZGp1c3RXaW5kb3dSZWN0RXgoJmJvdW5kcywgR2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUpLCAoR2V0TWVudShTRExfV2luZG93KSAhPSBOVUxMKSwgMCk7CisjZWxzZQorCQkvLyBUaGUgYk1lbnUgcGFyYW1ldGVyIG11c3QgYmUgRkFMU0U7IG1lbnUgYmFycyBhcmUgbm90IHN1cHBvcnRlZAorCQlBZGp1c3RXaW5kb3dSZWN0RXgoJmJvdW5kcywgR2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUpLCAwLCAwKTsKKyNlbmRpZgorCQl3aWR0aCA9IGJvdW5kcy5yaWdodC1ib3VuZHMubGVmdDsKKwkJaGVpZ2h0ID0gYm91bmRzLmJvdHRvbS1ib3VuZHMudG9wOworCQlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKKwkJCXggPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTiktd2lkdGgpLzI7CisJCQl5ID0gKEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pLWhlaWdodCkvMjsKKwkJfSBlbHNlIGlmICggY2VudGVyICkgeworCQkJeCA9IChHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKS13aWR0aCkvMjsKKwkJCXkgPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTiktaGVpZ2h0KS8yOworCQl9IGVsc2UgaWYgKCBTRExfd2luZG93WCB8fCBTRExfd2luZG93WSB8fCB3aW5kb3cgKSB7CisJCQl4ID0gYm91bmRzLmxlZnQ7CisJCQl5ID0gYm91bmRzLnRvcDsKKwkJfSBlbHNlIHsKKwkJCXggPSB5ID0gLTE7CisJCQlzd3BfZmxhZ3MgfD0gU1dQX05PTU9WRTsKKwkJfQorCQlpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7CisJCQl0b3AgPSBIV05EX1RPUE1PU1Q7CisJCX0gZWxzZSB7CisJCQl0b3AgPSBIV05EX05PVE9QTU9TVDsKKwkJfQorCQlTZXRXaW5kb3dQb3MoU0RMX1dpbmRvdywgdG9wLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzd3BfZmxhZ3MpOworCQlpZiAoICEoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgKSB7CisJCQlTRExfd2luZG93WCA9IFNETF9ib3VuZHMubGVmdDsKKwkJCVNETF93aW5kb3dZID0gU0RMX2JvdW5kcy50b3A7CisJCX0KKwkJaWYgKCBHZXRQYXJlbnQoU0RMX1dpbmRvdykgPT0gTlVMTCApIHsKKwkJCVNldEZvcmVncm91bmRXaW5kb3coU0RMX1dpbmRvdyk7CisJCX0KKwl9Cit9CisKK1NETF9TdXJmYWNlICpESUJfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlTRExfU3VyZmFjZSAqdmlkZW87CisJaW50IHByZXZfdywgcHJldl9oOworCVVpbnQzMiBwcmV2X2ZsYWdzOworCURXT1JEIHN0eWxlOworCWNvbnN0IERXT1JEIGRpcmVjdHN0eWxlID0KKwkJCShXU19QT1BVUCk7CisJY29uc3QgRFdPUkQgd2luZG93c3R5bGUgPSAKKwkJCShXU19PVkVSTEFQUEVEfFdTX0NBUFRJT058V1NfU1lTTUVOVXxXU19NSU5JTUlaRUJPWCk7CisJY29uc3QgRFdPUkQgcmVzaXplc3R5bGUgPQorCQkJKFdTX1RISUNLRlJBTUV8V1NfTUFYSU1JWkVCT1gpOworCWludCBiaW5mb19zaXplOworCUJJVE1BUElORk8gKmJpbmZvOworCUhEQyBoZGM7CisJVWludDMyIFJtYXNrLCBHbWFzaywgQm1hc2s7CisKKwlwcmV2X3cgPSBjdXJyZW50LT53OworCXByZXZfaCA9IGN1cnJlbnQtPmg7CisJcHJldl9mbGFncyA9IGN1cnJlbnQtPmZsYWdzOworCisJLyoKKwkgKiBTcGVjaWFsIGNhc2UgZm9yIE9wZW5HTCB3aW5kb3dzLi4uc2luY2UgdGhlIGFwcCBuZWVkcyB0byBjYWxsCisJICogIFNETF9TZXRWaWRlb01vZGUoKSBpbiByZXNwb25zZSB0byByZXNpemUgZXZlbnRzIHRvIGNvbnRpbnVlIHRvCisJICogIGZ1bmN0aW9uLCBidXQgV0dMIGhhbmRsZXMgdGhlIEdMIGNvbnRleHQgZGV0YWlscyBiZWhpbmQgdGhlIHNjZW5lcywKKwkgKiAgdGhlcmUncyBubyBzZW5zZSBpbiB0ZWFyaW5nIHRoZSBjb250ZXh0IGRvd24ganVzdCB0byByZWJ1aWxkIGl0CisJICogIHRvIHdoYXQgaXQgYWxyZWFkeSB3YXMuLi50ZWFyaW5nIGl0IGRvd24gc2FjcmlmaWNlcyB5b3VyIEdMIHN0YXRlCisJICogIGFuZCB1cGxvYWRlZCB0ZXh0dXJlcy4gU28gaWYgd2UncmUgcmVxdWVzdGluZyB0aGUgc2FtZSB2aWRlbyBtb2RlCisJICogIGF0dHJpYnV0ZXMganVzdCByZXNpemUgdGhlIHdpbmRvdyBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgorCSAqLworCWlmICggU0RMX1dpbmRvdyAmJgorCSAgICAgKChjdXJyZW50LT5mbGFncyAmIH5TRExfQU5ZRk9STUFUKSA9PSAoZmxhZ3MgJiB+U0RMX0FOWUZPUk1BVCkpICYmCisJICAgICAoY3VycmVudC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gYnBwKSAmJgorCSAgICAgKGZsYWdzICYgU0RMX09QRU5HTCkgJiYgCisJICAgICAhKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkgeyAgLyogcHJvYmFibHkgbm90IHNhZmUgZm9yIGZzICovCisJCWN1cnJlbnQtPncgPSB3aWR0aDsKKwkJY3VycmVudC0+aCA9IGhlaWdodDsKKwkJU0RMX3Jlc2l6aW5nID0gMTsKKwkJRElCX1Jlc2l6ZVdpbmRvdyh0aGlzLCB3aWR0aCwgaGVpZ2h0LCBwcmV2X3csIHByZXZfaCwgZmxhZ3MpOworCQlTRExfcmVzaXppbmcgPSAwOworCQlyZXR1cm4gY3VycmVudDsKKwl9CisKKwkvKiBDbGVhbiB1cCBhbnkgR0wgY29udGV4dCB0aGF0IG1heSBiZSBoYW5naW5nIGFyb3VuZCAqLworCWlmICggY3VycmVudC0+ZmxhZ3MgJiBTRExfT1BFTkdMICkgeworCQlXSU5fR0xfU2h1dERvd24odGhpcyk7CisJfQorCVNETF9yZXNpemluZyA9IDE7CisKKwkvKiBSZWNhbGN1bGF0ZSB0aGUgYml0bWFza3MgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCBicHAgPT0gY3VycmVudC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgKSB7CisJCXZpZGVvID0gY3VycmVudDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGJwcCkgeworCQkJY2FzZSAxNToKKwkJCWNhc2UgMTY6CisJCQkJaWYgKCBESUJfU3Vzc1NjcmVlbkRlcHRoKCkgPT0gMTUgKSB7CisJCQkJCS8qIDUtNS01ICovCisJCQkJCVJtYXNrID0gMHgwMDAwN2MwMDsKKwkJCQkJR21hc2sgPSAweDAwMDAwM2UwOworCQkJCQlCbWFzayA9IDB4MDAwMDAwMWY7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogNS02LTUgKi8KKwkJCQkJUm1hc2sgPSAweDAwMDBmODAwOworCQkJCQlHbWFzayA9IDB4MDAwMDA3ZTA7CisJCQkJCUJtYXNrID0gMHgwMDAwMDAxZjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDI0OgorCQkJY2FzZSAzMjoKKwkJCQkvKiBHREkgZGVmaW5lZCBhcyA4LTgtOCAqLworCQkJCVJtYXNrID0gMHgwMGZmMDAwMDsKKwkJCQlHbWFzayA9IDB4MDAwMGZmMDA7CisJCQkJQm1hc2sgPSAweDAwMDAwMGZmOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlSbWFzayA9IDB4MDAwMDAwMDA7CisJCQkJR21hc2sgPSAweDAwMDAwMDAwOworCQkJCUJtYXNrID0gMHgwMDAwMDAwMDsKKwkJCQlicmVhazsKKwkJfQorCQl2aWRlbyA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsCisJCQkJCTAsIDAsIGJwcCwgUm1hc2ssIEdtYXNrLCBCbWFzaywgMCk7CisJCWlmICggdmlkZW8gPT0gTlVMTCApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuKE5VTEwpOworCQl9CisJfQorCisJLyogRmlsbCBpbiBwYXJ0IG9mIHRoZSB2aWRlbyBzdXJmYWNlICovCisJdmlkZW8tPmZsYWdzID0gMDsJLyogQ2xlYXIgZmxhZ3MgKi8KKwl2aWRlby0+dyA9IHdpZHRoOworCXZpZGVvLT5oID0gaGVpZ2h0OworCXZpZGVvLT5waXRjaCA9IFNETF9DYWxjdWxhdGVQaXRjaCh2aWRlbyk7CisKKwkvKiBTbWFsbCBmaXggZm9yIFdpbkNFL1dpbjMyIC0gd2hlbiBhY3RpdmF0aW5nIHdpbmRvdworCSAgIFNETF9WaWRlb1N1cmZhY2UgaXMgZXF1YWwgdG8gemVybywgc28gYWN0aXZhdGluZyBjb2RlCisJICAgaXMgbm90IGNhbGxlZCBwcm9wZXJseSBmb3IgZnVsbHNjcmVlbiB3aW5kb3dzIGJlY2F1c2UKKwkgICBtYWNyb3MgV0lORElCX0ZVTExTQ1JFRU4gdXNlcyBTRExfVmlkZW9TdXJmYWNlCisJKi8KKwlTRExfVmlkZW9TdXJmYWNlID0gdmlkZW87CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisJaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkKKwkJdmlkZW8tPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworI2VuZGlmCisKKyNpZm5kZWYgTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTCisJLyogU2V0IGZ1bGxzY3JlZW4gbW9kZSBpZiBhcHByb3ByaWF0ZSAqLworCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgeworCQlERVZNT0RFIHNldHRpbmdzOworCQlCT09MIGNoYW5nZWQ7CisKKwkJU0RMX21lbXNldCgmc2V0dGluZ3MsIDAsIHNpemVvZihERVZNT0RFKSk7CisJCXNldHRpbmdzLmRtU2l6ZSA9IHNpemVvZihERVZNT0RFKTsKKworI2lmZGVmIF9XSU4zMl9XQ0UKKwkJLy8gdHJ5IHRvIHJvdGF0ZSBzY3JlZW4gdG8gZml0IHJlcXVlc3RlZCByZXNvbHV0aW9uCisJCWlmKCB0aGlzLT5oaWRkZW4tPnN1cHBvcnRSb3RhdGlvbiApCisJCXsKKwkJCURXT1JEIHJvdGF0aW9uOworCisJCQkvLyBhc2sgY3VycmVudCBtb2RlCisJCQlzZXR0aW5ncy5kbUZpZWxkcyA9IERNX0RJU1BMQVlPUklFTlRBVElPTjsKKwkJCUNoYW5nZURpc3BsYXlTZXR0aW5nc0V4KE5VTEwsICZzZXR0aW5ncywgTlVMTCwgQ0RTX1RFU1QsIE5VTEwpOworCQkJcm90YXRpb24gPSBzZXR0aW5ncy5kbURpc3BsYXlPcmllbnRhdGlvbjsKKworCQkJaWYoICh3aWR0aCA+IEdldERldmljZUNhcHMoR2V0REMoTlVMTCksIEhPUlpSRVMpKQorCQkJCSYmIChoZWlnaHQgPCBHZXREZXZpY2VDYXBzKEdldERDKE5VTEwpLCBWRVJUUkVTKSkpCisJCQl7CisJCQkJc3dpdGNoKCByb3RhdGlvbiApCisJCQkJeworCQkJCWNhc2UgRE1ET18wOgorCQkJCQlzZXR0aW5ncy5kbURpc3BsYXlPcmllbnRhdGlvbiA9IERNRE9fOTA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRE1ET18yNzA6CisJCQkJCXNldHRpbmdzLmRtRGlzcGxheU9yaWVudGF0aW9uID0gRE1ET18xODA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiggc2V0dGluZ3MuZG1EaXNwbGF5T3JpZW50YXRpb24gIT0gcm90YXRpb24gKQorCQkJCXsKKwkJCQkJLy8gZ28gdG8gbGFuZHNjYXBlCisJCQkJCXRoaXMtPmhpZGRlbi0+b3JpZ1JvdGF0aW9uID0gcm90YXRpb247CisJCQkJCUNoYW5nZURpc3BsYXlTZXR0aW5nc0V4KE5VTEwsJnNldHRpbmdzLE5VTEwsQ0RTX1JFU0VULE5VTEwpOworCQkJCX0KKwkJCX0KKwkJCWlmKCAod2lkdGggPCBHZXREZXZpY2VDYXBzKEdldERDKE5VTEwpLCBIT1JaUkVTKSkKKwkJCQkmJiAoaGVpZ2h0ID4gR2V0RGV2aWNlQ2FwcyhHZXREQyhOVUxMKSwgVkVSVFJFUykpKQorCQkJeworCQkJCXN3aXRjaCggcm90YXRpb24gKQorCQkJCXsKKwkJCQljYXNlIERNRE9fOTA6CisJCQkJCXNldHRpbmdzLmRtRGlzcGxheU9yaWVudGF0aW9uID0gRE1ET18wOworCQkJCQlicmVhazsKKwkJCQljYXNlIERNRE9fMTgwOgorCQkJCQlzZXR0aW5ncy5kbURpc3BsYXlPcmllbnRhdGlvbiA9IERNRE9fMjcwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYoIHNldHRpbmdzLmRtRGlzcGxheU9yaWVudGF0aW9uICE9IHJvdGF0aW9uICkKKwkJCQl7CisJCQkJCS8vIGdvIHRvIHBvcnRyYWl0CisJCQkJCXRoaXMtPmhpZGRlbi0+b3JpZ1JvdGF0aW9uID0gcm90YXRpb247CisJCQkJCUNoYW5nZURpc3BsYXlTZXR0aW5nc0V4KE5VTEwsJnNldHRpbmdzLE5VTEwsQ0RTX1JFU0VULE5VTEwpOworCQkJCX0KKwkJCX0KKworCQl9CisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzJfV0NFCisJCXNldHRpbmdzLmRtQml0c1BlclBlbCA9IHZpZGVvLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKKwkJc2V0dGluZ3MuZG1QZWxzV2lkdGggPSB3aWR0aDsKKwkJc2V0dGluZ3MuZG1QZWxzSGVpZ2h0ID0gaGVpZ2h0OworCQlzZXR0aW5ncy5kbUZpZWxkcyA9IERNX1BFTFNXSURUSCB8IERNX1BFTFNIRUlHSFQgfCBETV9CSVRTUEVSUEVMOworCQlpZiAoIHdpZHRoIDw9IChpbnQpU0RMX2Rlc2t0b3BfbW9kZS5kbVBlbHNXaWR0aCAmJgorCQkgICAgIGhlaWdodCA8PSAoaW50KVNETF9kZXNrdG9wX21vZGUuZG1QZWxzSGVpZ2h0ICkgeworCQkJc2V0dGluZ3MuZG1EaXNwbGF5RnJlcXVlbmN5ID0gU0RMX2Rlc2t0b3BfbW9kZS5kbURpc3BsYXlGcmVxdWVuY3k7CisJCQlzZXR0aW5ncy5kbUZpZWxkcyB8PSBETV9ESVNQTEFZRlJFUVVFTkNZOworCQl9CisJCWNoYW5nZWQgPSAoQ2hhbmdlRGlzcGxheVNldHRpbmdzKCZzZXR0aW5ncywgQ0RTX0ZVTExTQ1JFRU4pID09IERJU1BfQ0hBTkdFX1NVQ0NFU1NGVUwpOworCQlpZiAoICEgY2hhbmdlZCAmJiAoc2V0dGluZ3MuZG1GaWVsZHMgJiBETV9ESVNQTEFZRlJFUVVFTkNZKSApIHsKKwkJCXNldHRpbmdzLmRtRmllbGRzICY9IH5ETV9ESVNQTEFZRlJFUVVFTkNZOworCQkJY2hhbmdlZCA9IChDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoJnNldHRpbmdzLCBDRFNfRlVMTFNDUkVFTikgPT0gRElTUF9DSEFOR0VfU1VDQ0VTU0ZVTCk7CisJCX0KKyNlbHNlCisJCWNoYW5nZWQgPSAxOworI2VuZGlmCisJCWlmICggY2hhbmdlZCApIHsKKwkJCXZpZGVvLT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKwkJCVNETF9mdWxsc2NyZWVuX21vZGUgPSBzZXR0aW5nczsKKwkJfQorCisJfQorI2VuZGlmIC8qICFOT19DSEFOR0VESVNQTEFZU0VUVElOR1MgKi8KKworCS8qIFJlc2V0IHRoZSBwYWxldHRlIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeSAqLworCWlmICggZ3JhYl9wYWxldHRlICkgeworCQlESUJfUmVsZWFzZVN0YXRpY0NvbG9ycyhTRExfV2luZG93KTsKKwkJZ3JhYl9wYWxldHRlID0gRkFMU0U7CisJfQorCWlmICggc2NyZWVuX3BhbCAhPSBOVUxMICkgeworCS8qCVJKUjogTWFyY2ggMjgsIDIwMDAKKwkJZGVsZXRlIGlkZW50aXR5IHBhbGV0dGUgaWYgc3dpdGNoaW5nIGZyb20gYSBwYWxldHRpemVkIG1vZGUgKi8KKwkJRGVsZXRlT2JqZWN0KHNjcmVlbl9wYWwpOworCQlzY3JlZW5fcGFsID0gTlVMTDsKKwl9CisJaWYgKCBzY3JlZW5fbG9ncGFsICE9IE5VTEwgKSB7CisJCVNETF9mcmVlKHNjcmVlbl9sb2dwYWwpOworCQlzY3JlZW5fbG9ncGFsID0gTlVMTDsKKwl9CisKKwlpZiAoIGJwcCA8PSA4ICkKKwl7CisJLyoJUkpSOiBNYXJjaCAyOCwgMjAwMAorCQljcmVhdGUgaWRlbnRpdHkgcGFsZXR0ZSBzd2l0Y2hpbmcgdG8gYSBwYWxldHRpemVkIG1vZGUgKi8KKwkJRElCX0NyZWF0ZVBhbGV0dGUodGhpcywgYnBwKTsKKwl9CisKKwlzdHlsZSA9IEdldFdpbmRvd0xvbmcoU0RMX1dpbmRvdywgR1dMX1NUWUxFKTsKKwlzdHlsZSAmPSB+KHJlc2l6ZXN0eWxlfFdTX01BWElNSVpFKTsKKwlpZiAoICh2aWRlby0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisJCXN0eWxlICY9IH53aW5kb3dzdHlsZTsKKwkJc3R5bGUgfD0gZGlyZWN0c3R5bGU7CisJfSBlbHNlIHsKKyNpZm5kZWYgTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTCisJCWlmICggKHByZXZfZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisJCQlDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoTlVMTCwgMCk7CisJCX0KKyNlbmRpZgorCQlpZiAoIGZsYWdzICYgU0RMX05PRlJBTUUgKSB7CisJCQlzdHlsZSAmPSB+d2luZG93c3R5bGU7CisJCQlzdHlsZSB8PSBkaXJlY3RzdHlsZTsKKwkJCXZpZGVvLT5mbGFncyB8PSBTRExfTk9GUkFNRTsKKwkJfSBlbHNlIHsKKwkJCXN0eWxlICY9IH5kaXJlY3RzdHlsZTsKKwkJCXN0eWxlIHw9IHdpbmRvd3N0eWxlOworCQkJaWYgKCBmbGFncyAmIFNETF9SRVNJWkFCTEUgKSB7CisJCQkJc3R5bGUgfD0gcmVzaXplc3R5bGU7CisJCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9SRVNJWkFCTEU7CisJCQl9CisJCX0KKyNpZiBXU19NQVhJTUlaRSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQorCQlpZiAoSXNab29tZWQoU0RMX1dpbmRvdykpIHN0eWxlIHw9IFdTX01BWElNSVpFOworI2VuZGlmCisJfQorCisJLyogREpNOiBEb24ndCBwaXNzIG9mIGFueW9uZSB3aG8gaGFzIHNldHVwIGhpcyBvd24gd2luZG93ICovCisJaWYgKCAhU0RMX3dpbmRvd2lkICkKKwkJU2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUsIHN0eWxlKTsKKworCS8qIERlbGV0ZSB0aGUgb2xkIGJpdG1hcCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIHNjcmVlbl9ibXAgIT0gTlVMTCApIHsKKwkJRGVsZXRlT2JqZWN0KHNjcmVlbl9ibXApOworCX0KKwlpZiAoICEgKGZsYWdzICYgU0RMX09QRU5HTCkgKSB7CisJCUJPT0wgaXMxNmJpdG1vZGUgPSAodmlkZW8tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCA9PSAyKTsKKworCQkvKiBTdXNzIG91dCB0aGUgYml0bWFwIGluZm8gaGVhZGVyICovCisJCWJpbmZvX3NpemUgPSBzaXplb2YoKmJpbmZvKTsKKwkJaWYoIGlzMTZiaXRtb2RlICkgeworCQkJLyogMTZiaXQgbW9kZXMsIHBhbGV0dGUgYXJlYSB1c2VkIGZvciByZ2IgYml0bWFza3MgKi8KKwkJCWJpbmZvX3NpemUgKz0gMypzaXplb2YoRFdPUkQpOworCQl9IGVsc2UgaWYgKCB2aWRlby0+Zm9ybWF0LT5wYWxldHRlICkgeworCQkJYmluZm9fc2l6ZSArPSB2aWRlby0+Zm9ybWF0LT5wYWxldHRlLT5uY29sb3JzICoKKwkJCQkJCQlzaXplb2YoUkdCUVVBRCk7CisJCX0KKwkJYmluZm8gPSAoQklUTUFQSU5GTyAqKVNETF9tYWxsb2MoYmluZm9fc2l6ZSk7CisJCWlmICggISBiaW5mbyApIHsKKwkJCWlmICggdmlkZW8gIT0gY3VycmVudCApIHsKKwkJCQlTRExfRnJlZVN1cmZhY2UodmlkZW8pOworCQkJfQorCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKworCQliaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKwkJYmluZm8tPmJtaUhlYWRlci5iaVdpZHRoID0gdmlkZW8tPnc7CisJCWJpbmZvLT5ibWlIZWFkZXIuYmlIZWlnaHQgPSAtdmlkZW8tPmg7CS8qIC12ZSBmb3IgdG9wZG93biBiaXRtYXAgKi8KKwkJYmluZm8tPmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7CisJCWJpbmZvLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgPSB2aWRlby0+aCAqIHZpZGVvLT5waXRjaDsKKwkJYmluZm8tPmJtaUhlYWRlci5iaVhQZWxzUGVyTWV0ZXIgPSAwOworCQliaW5mby0+Ym1pSGVhZGVyLmJpWVBlbHNQZXJNZXRlciA9IDA7CisJCWJpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkID0gMDsKKwkJYmluZm8tPmJtaUhlYWRlci5iaUNsckltcG9ydGFudCA9IDA7CisJCWJpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IHZpZGVvLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKKworCQlpZiAoIGlzMTZiaXRtb2RlICkgeworCQkJLyogQklfQklURklFTERTIHRlbGxzIENyZWF0ZURJQlNlY3Rpb24gYWJvdXQgdGhlIHJnYiBtYXNrcyBpbiB0aGUgcGFsZXR0ZSAqLworCQkJYmluZm8tPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfQklURklFTERTOworCQkJKChVaW50MzIqKWJpbmZvLT5ibWlDb2xvcnMpWzBdID0gdmlkZW8tPmZvcm1hdC0+Um1hc2s7CisJCQkoKFVpbnQzMiopYmluZm8tPmJtaUNvbG9ycylbMV0gPSB2aWRlby0+Zm9ybWF0LT5HbWFzazsKKwkJCSgoVWludDMyKiliaW5mby0+Ym1pQ29sb3JzKVsyXSA9IHZpZGVvLT5mb3JtYXQtPkJtYXNrOworCQl9IGVsc2UgeworCQkJYmluZm8tPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOwkvKiBCSV9CSVRGSUVMRFMgZm9yIDU2NSB2cyA1NTUgKi8KKwkJCWlmICggdmlkZW8tPmZvcm1hdC0+cGFsZXR0ZSApIHsKKwkJCQlTRExfbWVtc2V0KGJpbmZvLT5ibWlDb2xvcnMsIDAsCisJCQkJCXZpZGVvLT5mb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnMqc2l6ZW9mKFJHQlFVQUQpKTsKKwkJCX0KKwkJfQorCisJCS8qIENyZWF0ZSB0aGUgb2Zmc2NyZWVuIGJpdG1hcCBidWZmZXIgKi8KKwkJaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7CisJCXNjcmVlbl9ibXAgPSBDcmVhdGVESUJTZWN0aW9uKGhkYywgYmluZm8sIERJQl9SR0JfQ09MT1JTLAorCQkJCQkodm9pZCAqKikoJnZpZGVvLT5waXhlbHMpLCBOVUxMLCAwKTsKKwkJUmVsZWFzZURDKFNETF9XaW5kb3csIGhkYyk7CisJCVNETF9mcmVlKGJpbmZvKTsKKwkJaWYgKCBzY3JlZW5fYm1wID09IE5VTEwgKSB7CisJCQlpZiAoIHZpZGVvICE9IGN1cnJlbnQgKSB7CisJCQkJU0RMX0ZyZWVTdXJmYWNlKHZpZGVvKTsKKwkJCX0KKwkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIERJQiBzZWN0aW9uIik7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKwkJdGhpcy0+VXBkYXRlUmVjdHMgPSBESUJfTm9ybWFsVXBkYXRlOworCisJCS8qIFNldCB2aWRlbyBzdXJmYWNlIGZsYWdzICovCisJCWlmICggc2NyZWVuX3BhbCAmJiAoZmxhZ3MgJiAoU0RMX0ZVTExTQ1JFRU58U0RMX0hXUEFMRVRURSkpICkgeworCQkJZ3JhYl9wYWxldHRlID0gVFJVRTsKKwkJfQorCQlpZiAoIHNjcmVlbl9wYWwgKSB7CisJCQkvKiBCaXRCbHQoKSBtYXBzIGNvbG9ycyBmb3IgdXMgKi8KKwkJCXZpZGVvLT5mbGFncyB8PSBTRExfSFdQQUxFVFRFOworCQl9CisJfQorCURJQl9SZXNpemVXaW5kb3codGhpcywgd2lkdGgsIGhlaWdodCwgcHJldl93LCBwcmV2X2gsIGZsYWdzKTsKKwlTRExfcmVzaXppbmcgPSAwOworCisJLyogU2V0IHVwIGZvciBPcGVuR0wgKi8KKwlpZiAoIGZsYWdzICYgU0RMX09QRU5HTCApIHsKKwkJaWYgKCBXSU5fR0xfU2V0dXBXaW5kb3codGhpcykgPCAwICkgeworCQkJcmV0dXJuKE5VTEwpOworCQl9CisJCXZpZGVvLT5mbGFncyB8PSBTRExfT1BFTkdMOworCX0KKworCS8qIEpDIDE0IE1hciAyMDA2CisJCUZsdXNoIHRoZSBtZXNzYWdlIGxvb3Agb3IgdGhpcyBjYW4gY2F1c2UgYmlnIHByb2JsZW1zIGxhdGVyCisJCUVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgZGVjaWRlcyB0byB1c2UgZGlhbG9nIGJveGVzIG9yIGFzc2VydCgpIQorCSovCisJV0lOX0ZsdXNoTWVzc2FnZVF1ZXVlKCk7CisKKwkvKiBXZSdyZSBsaXZlISAqLworCXJldHVybih2aWRlbyk7Cit9CisKKy8qIFdlIGRvbid0IGFjdHVhbGx5IGFsbG93IGhhcmR3YXJlIHN1cmZhY2VzIGluIHRoZSBESUIgZHJpdmVyICovCitzdGF0aWMgaW50IERJQl9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuKC0xKTsKK30KK3N0YXRpYyB2b2lkIERJQl9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW50IERJQl9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oMCk7Cit9CitzdGF0aWMgdm9pZCBESUJfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIERJQl9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCUhEQyBoZGMsIG1kYzsKKwlpbnQgaTsKKworCWhkYyA9IEdldERDKFNETF9XaW5kb3cpOworCWlmICggc2NyZWVuX3BhbCApIHsKKwkJU2VsZWN0UGFsZXR0ZShoZGMsIHNjcmVlbl9wYWwsIEZBTFNFKTsKKwl9CisJbWRjID0gQ3JlYXRlQ29tcGF0aWJsZURDKGhkYyk7CisJU2VsZWN0T2JqZWN0KG1kYywgc2NyZWVuX2JtcCk7CisJZm9yICggaT0wOyBpPG51bXJlY3RzOyArK2kgKSB7CisJCUJpdEJsdChoZGMsIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgsCisJCQkJCW1kYywgcmVjdHNbaV0ueCwgcmVjdHNbaV0ueSwgU1JDQ09QWSk7CisJfQorCURlbGV0ZURDKG1kYyk7CisJUmVsZWFzZURDKFNETF9XaW5kb3csIGhkYyk7Cit9CisKK3N0YXRpYyBpbnQgRmluZFBhbGV0dGVJbmRleChMT0dQQUxFVFRFICpwYWwsIEJZVEUgciwgQllURSBnLCBCWVRFIGIpCit7CisJUEFMRVRURUVOVFJZICplbnRyeTsKKwlpbnQgaTsKKwlpbnQgbmVudHJpZXMgPSBwYWwtPnBhbE51bUVudHJpZXM7CisKKwlmb3IgKCBpID0gMDsgaSA8IG5lbnRyaWVzOyArK2kgKSB7CisJCWVudHJ5ID0gJnBhbC0+cGFsUGFsRW50cnlbaV07CisJCWlmICggZW50cnktPnBlUmVkID09IHIgJiYgZW50cnktPnBlR3JlZW4gPT0gZyAmJiBlbnRyeS0+cGVCbHVlID09IGIgKSB7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBCT09MIENoZWNrUGFsZXR0ZUVudHJ5KExPR1BBTEVUVEUgKnBhbCwgaW50IGluZGV4LCBCWVRFIHIsIEJZVEUgZywgQllURSBiKQoreworCVBBTEVUVEVFTlRSWSAqZW50cnk7CisJQk9PTCBtb3ZlZCA9IDA7CisKKwllbnRyeSA9ICZwYWwtPnBhbFBhbEVudHJ5W2luZGV4XTsKKwlpZiAoIGVudHJ5LT5wZVJlZCAhPSByIHx8IGVudHJ5LT5wZUdyZWVuICE9IGcgfHwgZW50cnktPnBlQmx1ZSAhPSBiICkgeworCQlpbnQgZm91bmQgPSBGaW5kUGFsZXR0ZUluZGV4KHBhbCwgciwgZywgYik7CisJCWlmICggZm91bmQgPj0gMCApIHsKKwkJCXBhbC0+cGFsUGFsRW50cnlbZm91bmRdID0gKmVudHJ5OworCQl9CisJCWVudHJ5LT5wZVJlZCA9IHI7CisJCWVudHJ5LT5wZUdyZWVuID0gZzsKKwkJZW50cnktPnBlQmx1ZSA9IGI7CisJCW1vdmVkID0gMTsKKwl9CisJZW50cnktPnBlRmxhZ3MgPSAwOworCisJcmV0dXJuIG1vdmVkOworfQorCitpbnQgRElCX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycykKK3sKKyNpZiAhZGVmaW5lZChfV0lOMzJfV0NFKSB8fCAoX1dJTjMyX1dDRSA+PSA0MDApCisJSERDIGhkYywgbWRjOworCVJHQlFVQUQgKnBhbDsKKyNlbHNlCisJSERDIGhkYzsKKyNlbmRpZgorCWludCBpOworCWludCBtb3ZlZF9lbnRyaWVzID0gMDsKKworCS8qIFVwZGF0ZSB0aGUgZGlzcGxheSBwYWxldHRlICovCisJaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7CisJaWYgKCBzY3JlZW5fcGFsICkgeworCQlQQUxFVFRFRU5UUlkgKmVudHJ5OworCisJCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7CisJCQllbnRyeSA9ICZzY3JlZW5fbG9ncGFsLT5wYWxQYWxFbnRyeVtmaXJzdGNvbG9yK2ldOworCQkJZW50cnktPnBlUmVkICAgPSBjb2xvcnNbaV0ucjsKKwkJCWVudHJ5LT5wZUdyZWVuID0gY29sb3JzW2ldLmc7CisJCQllbnRyeS0+cGVCbHVlICA9IGNvbG9yc1tpXS5iOworCQkJZW50cnktPnBlRmxhZ3MgPSBQQ19OT0NPTExBUFNFOworCQl9CisjaWYgZGVmaW5lZChTWVNQQUxfTk9TVEFUSUMpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBibGFjayBhbmQgd2hpdGUgYXJlIGluIHBvc2l0aW9uICovCisJCWlmICggR2V0U3lzdGVtUGFsZXR0ZVVzZShoZGMpICE9IFNZU1BBTF9OT1NUQVRJQzI1NiApIHsKKwkJCW1vdmVkX2VudHJpZXMgKz0gQ2hlY2tQYWxldHRlRW50cnkoc2NyZWVuX2xvZ3BhbCwgMCwgMHgwMCwgMHgwMCwgMHgwMCk7CisJCQltb3ZlZF9lbnRyaWVzICs9IENoZWNrUGFsZXR0ZUVudHJ5KHNjcmVlbl9sb2dwYWwsIHNjcmVlbl9sb2dwYWwtPnBhbE51bUVudHJpZXMtMSwgMHhmZiwgMHhmZiwgMHhmZik7CisJCX0KKwkJLyogRklYTUU6CisJCSAgIElmIHdlIGRvbid0IGhhdmUgZnVsbCBhY2Nlc3MgdG8gdGhlIHBhbGV0dGUsIHdoYXQgd2UKKwkJICAgcmVhbGx5IHdhbnQgdG8gZG8gaXMgZmluZCB0aGUgMjM2IG1vc3QgZGl2ZXJzZSBjb2xvcnMKKwkJICAgaW4gdGhlIGRlc2lyZWQgcGFsZXR0ZSwgc2V0IHRob3NlIGVudHJpZXMgKDEwLTI0NSkgYW5kCisJCSAgIHRoZW4gbWFwIGV2ZXJ5dGhpbmcgaW50byB0aGUgbmV3IHN5c3RlbSBwYWxldHRlLgorCQkgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9XSU4zMl9XQ0UKKwkJLyogQ29weSB0aGUgZW50cmllcyBpbnRvIHRoZSBzeXN0ZW0gcGFsZXR0ZSAqLworCQlVbnJlYWxpemVPYmplY3Qoc2NyZWVuX3BhbCk7CisjZW5kaWYKKwkJU2V0UGFsZXR0ZUVudHJpZXMoc2NyZWVuX3BhbCwgMCwgc2NyZWVuX2xvZ3BhbC0+cGFsTnVtRW50cmllcywgc2NyZWVuX2xvZ3BhbC0+cGFsUGFsRW50cnkpOworCQlTZWxlY3RQYWxldHRlKGhkYywgc2NyZWVuX3BhbCwgRkFMU0UpOworCQlSZWFsaXplUGFsZXR0ZShoZGMpOworCX0KKworI2lmICFkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IChfV0lOMzJfV0NFID49IDQwMCkKKwkvKiBDb3B5IHBhbGV0dGUgY29sb3JzIGludG8gRElCIHBhbGV0dGUgKi8KKwlwYWwgPSBTRExfc3RhY2tfYWxsb2MoUkdCUVVBRCwgbmNvbG9ycyk7CisJZm9yICggaT0wOyBpPG5jb2xvcnM7ICsraSApIHsKKwkJcGFsW2ldLnJnYlJlZCA9IGNvbG9yc1tpXS5yOworCQlwYWxbaV0ucmdiR3JlZW4gPSBjb2xvcnNbaV0uZzsKKwkJcGFsW2ldLnJnYkJsdWUgPSBjb2xvcnNbaV0uYjsKKwkJcGFsW2ldLnJnYlJlc2VydmVkID0gMDsKKwl9CisKKwkvKiBTZXQgdGhlIERJQiBwYWxldHRlIGFuZCB1cGRhdGUgdGhlIGRpc3BsYXkgKi8KKwltZGMgPSBDcmVhdGVDb21wYXRpYmxlREMoaGRjKTsKKwlTZWxlY3RPYmplY3QobWRjLCBzY3JlZW5fYm1wKTsKKwlTZXRESUJDb2xvclRhYmxlKG1kYywgZmlyc3Rjb2xvciwgbmNvbG9ycywgcGFsKTsKKwlpZiAoIG1vdmVkX2VudHJpZXMgfHwgIWdyYWJfcGFsZXR0ZSApIHsKKwkJQml0Qmx0KGhkYywgMCwgMCwgdGhpcy0+c2NyZWVuLT53LCB0aGlzLT5zY3JlZW4tPmgsCisJCSAgICAgICBtZGMsIDAsIDAsIFNSQ0NPUFkpOworCX0KKwlEZWxldGVEQyhtZGMpOworCVNETF9zdGFja19mcmVlKHBhbCk7CisjZW5kaWYKKwlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKKwlyZXR1cm4oMSk7Cit9CisKKworc3RhdGljIHZvaWQgRElCX0NoZWNrR2FtbWEoX1RISVMpCit7CisjaWZuZGVmIE5PX0dBTU1BX1NVUFBPUlQKKwlIREMgaGRjOworCVdPUkQgcmFtcFszKjI1Nl07CisKKwkvKiBJZiB3ZSBmYWlsIHRvIGdldCBnYW1tYSwgZGlzYWJsZSBnYW1tYSBjb250cm9sICovCisJaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7CisJaWYgKCAhIEdldERldmljZUdhbW1hUmFtcChoZGMsIHJhbXApICkgeworCQl0aGlzLT5HZXRHYW1tYVJhbXAgPSBOVUxMOworCQl0aGlzLT5TZXRHYW1tYVJhbXAgPSBOVUxMOworCX0KKwlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKKyNlbmRpZiAvKiAhTk9fR0FNTUFfU1VQUE9SVCAqLworfQordm9pZCBESUJfU3dhcEdhbW1hKF9USElTKQoreworI2lmbmRlZiBOT19HQU1NQV9TVVBQT1JUCisJSERDIGhkYzsKKworCWlmICggZ2FtbWFfc2F2ZWQgKSB7CisJCWhkYyA9IEdldERDKFNETF9XaW5kb3cpOworCQlpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUElOUFVURk9DVVMgKSB7CisJCQkvKiBBYm91dCB0byBsZWF2ZSBhY3RpdmUgc3RhdGUsIHJlc3RvcmUgZ2FtbWEgKi8KKwkJCVNldERldmljZUdhbW1hUmFtcChoZGMsIGdhbW1hX3NhdmVkKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEFib3V0IHRvIGVudGVyIGFjdGl2ZSBzdGF0ZSwgc2V0IGdhbWUgZ2FtbWEgKi8KKwkJCUdldERldmljZUdhbW1hUmFtcChoZGMsIGdhbW1hX3NhdmVkKTsKKwkJCVNldERldmljZUdhbW1hUmFtcChoZGMsIHRoaXMtPmdhbW1hKTsKKwkJfQorCQlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKKwl9CisjZW5kaWYgLyogIU5PX0dBTU1BX1NVUFBPUlQgKi8KK30KK3ZvaWQgRElCX1F1aXRHYW1tYShfVEhJUykKK3sKKyNpZm5kZWYgTk9fR0FNTUFfU1VQUE9SVAorCWlmICggZ2FtbWFfc2F2ZWQgKSB7CisJCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGdhbW1hIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUElOUFVURk9DVVMgKSB7CisJCQlIREMgaGRjOworCisJCQloZGMgPSBHZXREQyhTRExfV2luZG93KTsKKwkJCVNldERldmljZUdhbW1hUmFtcChoZGMsIGdhbW1hX3NhdmVkKTsKKwkJCVJlbGVhc2VEQyhTRExfV2luZG93LCBoZGMpOworCQl9CisKKwkJLyogRnJlZSB0aGUgc2F2ZWQgZ2FtbWEgbWVtb3J5ICovCisJCVNETF9mcmVlKGdhbW1hX3NhdmVkKTsKKwkJZ2FtbWFfc2F2ZWQgPSAwOworCX0KKyNlbmRpZiAvKiAhTk9fR0FNTUFfU1VQUE9SVCAqLworfQorCitpbnQgRElCX1NldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKQoreworI2lmZGVmIE5PX0dBTU1BX1NVUFBPUlQKKwlTRExfU2V0RXJyb3IoIlNETCBjb21waWxlZCB3aXRob3V0IGdhbW1hIHJhbXAgc3VwcG9ydCIpOworCXJldHVybiAtMTsKKyNlbHNlCisJSERDIGhkYzsKKwlCT09MIHN1Y2NlZWRlZDsKKworCS8qIFNldCB0aGUgcmFtcCBmb3IgdGhlIGRpc3BsYXkgKi8KKwlpZiAoICEgZ2FtbWFfc2F2ZWQgKSB7CisJCWdhbW1hX3NhdmVkID0gKFdPUkQgKilTRExfbWFsbG9jKDMqMjU2KnNpemVvZigqZ2FtbWFfc2F2ZWQpKTsKKwkJaWYgKCAhIGdhbW1hX3NhdmVkICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7CisJCUdldERldmljZUdhbW1hUmFtcChoZGMsIGdhbW1hX3NhdmVkKTsKKwkJUmVsZWFzZURDKFNETF9XaW5kb3csIGhkYyk7CisJfQorCWlmICggU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQSU5QVVRGT0NVUyApIHsKKwkJaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7CisJCXN1Y2NlZWRlZCA9IFNldERldmljZUdhbW1hUmFtcChoZGMsIHJhbXApOworCQlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKKwl9IGVsc2UgeworCQlzdWNjZWVkZWQgPSBUUlVFOworCX0KKwlyZXR1cm4gc3VjY2VlZGVkID8gMCA6IC0xOworI2VuZGlmIC8qICFOT19HQU1NQV9TVVBQT1JUICovCit9CisKK2ludCBESUJfR2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApCit7CisjaWZkZWYgTk9fR0FNTUFfU1VQUE9SVAorCVNETF9TZXRFcnJvcigiU0RMIGNvbXBpbGVkIHdpdGhvdXQgZ2FtbWEgcmFtcCBzdXBwb3J0Iik7CisJcmV0dXJuIC0xOworI2Vsc2UKKwlIREMgaGRjOworCUJPT0wgc3VjY2VlZGVkOworCisJLyogR2V0IHRoZSByYW1wIGZyb20gdGhlIGRpc3BsYXkgKi8KKwloZGMgPSBHZXREQyhTRExfV2luZG93KTsKKwlzdWNjZWVkZWQgPSBHZXREZXZpY2VHYW1tYVJhbXAoaGRjLCByYW1wKTsKKwlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKKwlyZXR1cm4gc3VjY2VlZGVkID8gMCA6IC0xOworI2VuZGlmIC8qICFOT19HQU1NQV9TVVBQT1JUICovCit9CisKK3ZvaWQgRElCX1ZpZGVvUXVpdChfVEhJUykKK3sKKwlpbnQgaSwgajsKKworCS8qIERlc3Ryb3kgdGhlIHdpbmRvdyBhbmQgZXZlcnl0aGluZyBhc3NvY2lhdGVkIHdpdGggaXQgKi8KKwlpZiAoIFNETF9XaW5kb3cgKSB7CisJCS8qIERlbGV0ZSB0aGUgc2NyZWVuIGJpdG1hcCAoYWxzbyBmcmVlcyBzY3JlZW4tPnBpeGVscykgKi8KKwkJaWYgKCB0aGlzLT5zY3JlZW4gKSB7CisJCQlpZiAoIGdyYWJfcGFsZXR0ZSApIHsKKwkJCQlESUJfUmVsZWFzZVN0YXRpY0NvbG9ycyhTRExfV2luZG93KTsKKwkJCX0KKyNpZm5kZWYgTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTCisJCQlpZiAoIHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKKwkJCQlDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoTlVMTCwgMCk7CisJCQkJU2hvd1dpbmRvdyhTRExfV2luZG93LCBTV19ISURFKTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKCB0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX09QRU5HTCApIHsKKwkJCQlXSU5fR0xfU2h1dERvd24odGhpcyk7CisJCQl9CisJCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IE5VTEw7CisJCX0KKwkJaWYgKCBzY3JlZW5fcGFsICE9IE5VTEwgKSB7CisJCQlEZWxldGVPYmplY3Qoc2NyZWVuX3BhbCk7CisJCQlzY3JlZW5fcGFsID0gTlVMTDsKKwkJfQorCQlpZiAoIHNjcmVlbl9sb2dwYWwgIT0gTlVMTCApIHsKKwkJCVNETF9mcmVlKHNjcmVlbl9sb2dwYWwpOworCQkJc2NyZWVuX2xvZ3BhbCA9IE5VTEw7CisJCX0KKwkJaWYgKCBzY3JlZW5fYm1wICkgeworCQkJRGVsZXRlT2JqZWN0KHNjcmVlbl9ibXApOworCQkJc2NyZWVuX2JtcCA9IE5VTEw7CisJCX0KKwkJaWYgKCBzY3JlZW5faWNuICkgeworCQkJRGVzdHJveUljb24oc2NyZWVuX2ljbik7CisJCQlzY3JlZW5faWNuID0gTlVMTDsKKwkJfQorCQlESUJfUXVpdEdhbW1hKHRoaXMpOworCQlESUJfRGVzdHJveVdpbmRvdyh0aGlzKTsKKworCQlTRExfV2luZG93ID0gTlVMTDsKKworI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKKworLy8gVW5sb2FkIHdpbmNlIGF5Z3NoZWxsIGxpYnJhcnkgdG8gcHJldmVudCBsZWFrCisJCWlmKCBheWdzaGVsbCApIAorCQl7CisJCQlGcmVlTGlicmFyeShheWdzaGVsbCk7CisJCQlheWdzaGVsbCA9IE5VTEw7CisJCX0KKyNlbmRpZgorCX0KKworCWZvciAoIGk9MDsgaSA8IFNETF9hcnJheXNpemUoU0RMX21vZGVsaXN0KTsgKytpICkgeworCQlpZiAoICFTRExfbW9kZWxpc3RbaV0gKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlmb3IgKCBqPTA7IFNETF9tb2RlbGlzdFtpXVtqXTsgKytqICkgeworCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldW2pdKTsKKwkJfQorCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOworCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOworCQlTRExfbnVtbW9kZXNbaV0gPSAwOworCX0KK30KKworLyogRXhwb3J0ZWQgZm9yIHRoZSB3aW5kb3dzIG1lc3NhZ2UgbG9vcCBvbmx5ICovCitzdGF0aWMgdm9pZCBESUJfR3JhYlN0YXRpY0NvbG9ycyhIV05EIHdpbmRvdykKK3sKKyNpZiBkZWZpbmVkKFNZU1BBTF9OT1NUQVRJQykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKwlIREMgaGRjOworCisJaGRjID0gR2V0REMod2luZG93KTsKKwlTZXRTeXN0ZW1QYWxldHRlVXNlKGhkYywgU1lTUEFMX05PU1RBVElDMjU2KTsKKwlpZiAoIEdldFN5c3RlbVBhbGV0dGVVc2UoaGRjKSAhPSBTWVNQQUxfTk9TVEFUSUMyNTYgKSB7CisJCVNldFN5c3RlbVBhbGV0dGVVc2UoaGRjLCBTWVNQQUxfTk9TVEFUSUMpOworCX0KKwlSZWxlYXNlREMod2luZG93LCBoZGMpOworI2VuZGlmCit9CitzdGF0aWMgdm9pZCBESUJfUmVsZWFzZVN0YXRpY0NvbG9ycyhIV05EIHdpbmRvdykKK3sKKyNpZiBkZWZpbmVkKFNZU1BBTF9OT1NUQVRJQykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKwlIREMgaGRjOworCisJaGRjID0gR2V0REMod2luZG93KTsKKwlTZXRTeXN0ZW1QYWxldHRlVXNlKGhkYywgU1lTUEFMX1NUQVRJQyk7CisJUmVsZWFzZURDKHdpbmRvdywgaGRjKTsKKyNlbmRpZgorfQorc3RhdGljIHZvaWQgRElCX0FjdGl2YXRlKF9USElTLCBCT09MIGFjdGl2ZSwgQk9PTCBtaW5pbWl6ZWQpCit7CisJaWYgKCBncmFiX3BhbGV0dGUgKSB7CisJCWlmICggIWFjdGl2ZSApIHsKKwkJCURJQl9SZWxlYXNlU3RhdGljQ29sb3JzKFNETF9XaW5kb3cpOworCQkJRElCX1JlYWxpemVQYWxldHRlKHRoaXMpOworCQl9IGVsc2UgaWYgKCAhbWluaW1pemVkICkgeworCQkJRElCX0dyYWJTdGF0aWNDb2xvcnMoU0RMX1dpbmRvdyk7CisJCQlESUJfUmVhbGl6ZVBhbGV0dGUodGhpcyk7CisJCX0KKwl9Cit9CitzdGF0aWMgdm9pZCBESUJfUmVhbGl6ZVBhbGV0dGUoX1RISVMpCit7CisJaWYgKCBzY3JlZW5fcGFsICE9IE5VTEwgKSB7CisJCUhEQyBoZGM7CisKKwkJaGRjID0gR2V0REMoU0RMX1dpbmRvdyk7CisjaWZuZGVmIF9XSU4zMl9XQ0UKKwkJVW5yZWFsaXplT2JqZWN0KHNjcmVlbl9wYWwpOworI2VuZGlmCisJCVNlbGVjdFBhbGV0dGUoaGRjLCBzY3JlZW5fcGFsLCBGQUxTRSk7CisJCWlmICggUmVhbGl6ZVBhbGV0dGUoaGRjKSApIHsKKwkJCUludmFsaWRhdGVSZWN0KFNETF9XaW5kb3csIE5VTEwsIEZBTFNFKTsKKwkJfQorCQlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBESUJfUGFsZXR0ZUNoYW5nZWQoX1RISVMsIEhXTkQgd2luZG93KQoreworCWlmICggd2luZG93ICE9IFNETF9XaW5kb3cgKSB7CisJCURJQl9SZWFsaXplUGFsZXR0ZSh0aGlzKTsKKwl9Cit9CisKKy8qIEV4cG9ydGVkIGZvciB0aGUgd2luZG93cyBtZXNzYWdlIGxvb3Agb25seSAqLworc3RhdGljIHZvaWQgRElCX1dpblBBSU5UKF9USElTLCBIREMgaGRjKQoreworCUhEQyBtZGM7CisKKwlpZiAoIHNjcmVlbl9wYWwgKSB7CisJCVNlbGVjdFBhbGV0dGUoaGRjLCBzY3JlZW5fcGFsLCBGQUxTRSk7CisJfQorCW1kYyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpOworCVNlbGVjdE9iamVjdChtZGMsIHNjcmVlbl9ibXApOworCUJpdEJsdChoZGMsIDAsIDAsIFNETF9WaWRlb1N1cmZhY2UtPncsIFNETF9WaWRlb1N1cmZhY2UtPmgsCisJCQkJCQkJbWRjLCAwLCAwLCBTUkNDT1BZKTsKKwlEZWxldGVEQyhtZGMpOworfQorCitzdGF0aWMgdm9pZCBESUJfR2V0V2luUG9zKF9USElTLCBpbnQqIHB4LCBpbnQgKnB5KQoreworCVJFQ1QgIHJlY3Q7CisJR2V0V2luZG93UmVjdChTRExfV2luZG93LCAmcmVjdCk7CisJKnB4ID0gcmVjdC5sZWZ0OworCSpweSA9IHJlY3QudG9wOworfQorCitzdGF0aWMgdm9pZCBESUJfU2V0V2luUG9zKF9USElTLCBpbnQgIHgsIGludCAgeSkKK3sKKyAgICBTZXRXaW5kb3dQb3MoU0RMX1dpbmRvdywgSFdORF9UT1BNT1NULCAKKyAgICAgICAgICAgICAgICAgeCwgeSwgMCwgMCwgU1dQX05PU0laRXxTV1BfTk9aT1JERVIpOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgcmVzdWx0OworICAgIGludCAgIGZpcnN0OworICAgIFJFQ1QgIHdyZWN0OworICAgIFJFQ1QgIHByaW1hcnk7Cit9IFZpc2liaWxpdHlEYXRhOworCisKK0JPT0wgQ0FMTEJBQ0sgdmlzaWJpbGl0eV9jYihITU9OSVRPUiAgaE1vbml0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDICAgICAgIGhkY01vbml0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSRUNUICAgIG1yZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSAgICBkd0RhdGEpCit7CisgICAgVmlzaWJpbGl0eURhdGEqICBkYXRhID0gKFZpc2liaWxpdHlEYXRhKilkd0RhdGE7CisgICAgCisgICAgaWYgKCBkYXRhLT5maXJzdCApIHsKKyAgICAgICAgZGF0YS0+Zmlyc3QgICA9IDA7CisgICAgICAgIGRhdGEtPnByaW1hcnkgPSBtcmVjdFswXTsKKyAgICB9CisgICAgCisgICAgaWYgKCBkYXRhLT53cmVjdC5sZWZ0ICAgPj0gbXJlY3QtPmxlZnQgICAmJgorICAgICAgICAgZGF0YS0+d3JlY3QucmlnaHQgIDw9IG1yZWN0LT5yaWdodCAgJiYKKyAgICAgICAgIGRhdGEtPndyZWN0LnRvcCAgICA+PSBtcmVjdC0+dG9wICAgICYmCisgICAgICAgICBkYXRhLT53cmVjdC5ib3R0b20gPD0gbXJlY3QtPmJvdHRvbSApCisgICAgeworICAgICAgICBkYXRhLT5yZXN1bHQgPSAxOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50ICBESUJfSXNXaW5WaXNpYmxlKF9USElTLCBpbnQgIHJlY2VudGVyKQoreworICAgIFZpc2liaWxpdHlEYXRhICBkYXRhOworICAgIGRhdGEucmVzdWx0ID0gMDsKKyAgICBkYXRhLmZpcnN0ICA9IDE7CisgICAgCisgICAgR2V0V2luZG93UmVjdChTRExfV2luZG93LCAmZGF0YS53cmVjdCk7CisKKyAgICBFbnVtRGlzcGxheU1vbml0b3JzKE5VTEwsIE5VTEwsIHZpc2liaWxpdHlfY2IsIChMUEFSQU0pJmRhdGEpOworICAgIAorICAgIGlmICggIWRhdGEucmVzdWx0ICYmIHJlY2VudGVyICkgeworICAgICAgICBpbnQgIG5ld194ID0gMTA7CisgICAgICAgIGludCAgbmV3X3kgPSAxMDsKKworICAgICAgICBpZiAoICFkYXRhLmZpcnN0ICkgeworICAgICAgICAgICAgaW50ICBwcmltYXJ5X3cgPSBkYXRhLnByaW1hcnkucmlnaHQgIC0gZGF0YS5wcmltYXJ5LmxlZnQ7CisgICAgICAgICAgICBpbnQgIHByaW1hcnlfaCA9IGRhdGEucHJpbWFyeS5ib3R0b20gLSBkYXRhLnByaW1hcnkudG9wOworCisgICAgICAgICAgICBuZXdfeCA9IGRhdGEucHJpbWFyeS5sZWZ0ICsgKHByaW1hcnlfdyAtIHRoaXMtPnNjcmVlbi0+dykvMjsKKyAgICAgICAgICAgIG5ld195ID0gZGF0YS5wcmltYXJ5LnRvcCAgKyAocHJpbWFyeV9oIC0gdGhpcy0+c2NyZWVuLT5oKS8yOworICAgICAgICB9CisgICAgICAgIERJQl9TZXRXaW5Qb3ModGhpcywgbmV3X3gsIG5ld195KTsKKyAgICB9CisgICAgcmV0dXJuICBkYXRhLnJlc3VsdDsKK30KKworc3RhdGljIGludCAgRElCX0dldE1vbml0b3JEUEkoX1RISVMsIGludCogeERwaSwgaW50ICp5RHBpKQoreworICAgIEhEQyAgZGlzcGxheURDID0gQ3JlYXRlREMoICJESVNQTEFZIiwgTlVMTCwgTlVMTCwgTlVMTCApOworICAgIGludCAgeGRwaSwgeWRwaTsKKworICAgIGlmIChkaXNwbGF5REMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhkcGkgPSBHZXREZXZpY2VDYXBzKCBkaXNwbGF5REMsIExPR1BJWEVMU1ggKTsKKyAgICB5ZHBpID0gR2V0RGV2aWNlQ2FwcyggZGlzcGxheURDLCBMT0dQSVhFTFNZICk7CisKKyAgICBEZWxldGVEQyhkaXNwbGF5REMpOworCisgICAgLyogc2FuaXR5IGNoZWNrcyAqLworICAgIGlmICh4ZHBpIDwgMjAgfHwgeGRwaSA+IDQwMCB8fCB5ZHBpIDwgMjAgfHwgeWRwaSA+IDQwMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgKnhEcGkgPSB4ZHBpOworICAgICp5RHBpID0geWRwaTsKKyAgICByZXR1cm4gMDsKK30KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgZmlyc3Q7CisgICAgUkVDVCAgd3JlY3Q7CisJbG9uZyAgYmVzdEFyZWE7CisJUkVDVCAgYmVzdFJlY3Q7CisJUkVDVCAgcHJpbWFyeTsKK30gUHJveGltaXR5RGF0YTsKKworQk9PTCBDQUxMQkFDSyBwcm94aW1pdHlfY2IoSE1PTklUT1IgIGhNb25pdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDICAgICAgIGhkY01vbml0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJFQ1QgICAgbXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gICAgZHdEYXRhKQoreworICAgIFByb3hpbWl0eURhdGEqICBkYXRhID0gKFByb3hpbWl0eURhdGEqKWR3RGF0YTsKKyAgICBpbnQgICB4MSwgeTEsIHgyLCB5MiwgYXJlYTsKKwkKKwl4MSA9IG1yZWN0LT5sZWZ0OworCXgyID0gbXJlY3QtPnJpZ2h0OworCXkxID0gbXJlY3QtPnRvcDsKKwl5MiA9IG1yZWN0LT5ib3R0b207CisKKwlpZiAoZGF0YS0+Zmlyc3QpIHsKKwkJZGF0YS0+cHJpbWFyeSA9IG1yZWN0WzBdOworCX0KKwkKKwlpZiAoeDEgPCBkYXRhLT53cmVjdC5sZWZ0KQorCQl4MSA9IGRhdGEtPndyZWN0LmxlZnQ7CisgICAgaWYgKHgyID4gZGF0YS0+d3JlY3QucmlnaHQpCisJCXgyID0gZGF0YS0+d3JlY3QucmlnaHQ7CisJaWYgKHkxIDwgZGF0YS0+d3JlY3QudG9wKQorCQl5MSA9IGRhdGEtPndyZWN0LnRvcDsKKwlpZiAoeTIgPiBkYXRhLT53cmVjdC5ib3R0b20pCisJCXkyID0gZGF0YS0+d3JlY3QuYm90dG9tOworCQorCWlmICh4MSA+PSB4MiB8fCB5MSA+PSB5MikKKwkJcmV0dXJuIFRSVUU7CisKKwlhcmVhID0gKHgyLXgxKSooeTIteTEpOworCWlmIChkYXRhLT5maXJzdCB8fCBhcmVhID4gZGF0YS0+YmVzdEFyZWEpIHsKKwkJZGF0YS0+Zmlyc3QgICAgPSAwOworCQlkYXRhLT5iZXN0UmVjdCA9IG1yZWN0WzBdOworCQlkYXRhLT5iZXN0QXJlYSA9IGFyZWE7CisJfQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50ICBESUJfR2V0TW9uaXRvclJlY3QoX1RISVMsIFNETF9SZWN0KiAgcmVjdCkKK3sKKyAgICBQcm94aW1pdHlEYXRhICBkYXRhOworCVJFQ1QqICAgICAgICAgIHNyOworCisgICAgZGF0YS5maXJzdCAgPSAxOworICAgIEdldFdpbmRvd1JlY3QoU0RMX1dpbmRvdywgJmRhdGEud3JlY3QpOworCisgICAgRW51bURpc3BsYXlNb25pdG9ycyhOVUxMLCBOVUxMLCBwcm94aW1pdHlfY2IsIChMUEFSQU0pJmRhdGEpOworCisJaWYgKGRhdGEuZmlyc3QpCisJCXJldHVybiAtMTsKKworCXNyID0gJmRhdGEuYmVzdFJlY3Q7CisKKwlyZWN0LT54ID0gc3ItPmxlZnQ7CisJcmVjdC0+eSA9IHNyLT50b3A7CisJcmVjdC0+dyA9IHNyLT5yaWdodCAtIHNyLT5sZWZ0OworCXJlY3QtPmggPSBzci0+Ym90dG9tIC0gc3ItPnRvcDsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogU3R1YiBpbiBjYXNlIERpcmVjdFggaXNuJ3QgYXZhaWxhYmxlICovCisjaWYgIVNETF9BVURJT19EUklWRVJfRFNPVU5ECit2b2lkIERYNV9Tb3VuZEZvY3VzKEhXTkQgaHduZCkKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJ2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5kaWIvU0RMX2RpYnZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiMTk0MwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZGliL1NETF9kaWJ2aWRlby5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfZGlidmlkZW9faAorI2RlZmluZSBfU0RMX2RpYnZpZGVvX2gKKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCitzdHJ1Y3QgRGliSW5mbyB7CisJSEJJVE1BUCBzY3JlZW5fYm1wOworICAgIEhQQUxFVFRFIHNjcmVlbl9wYWw7CisgICAgTE9HUEFMRVRURSAqc2NyZWVuX2xvZ3BhbDsKKyAgICBCT09MIGdyYWJfcGFsZXR0ZTsKKworI2RlZmluZSBOVU1fTU9ERUxJU1RTCTQJCS8qIDgsIDE2LCAyNCwgYW5kIDMyIGJpdHMtcGVyLXBpeGVsICovCisgICAgaW50IFNETF9udW1tb2Rlc1tOVU1fTU9ERUxJU1RTXTsKKyAgICBTRExfUmVjdCAqKlNETF9tb2RlbGlzdFtOVU1fTU9ERUxJU1RTXTsKKyAgICAgICAgCisjaWZkZWYgX1dJTjMyX1dDRQorCWludCBzdXBwb3J0Um90YXRpb247IC8qIGZvciBQb2NrZXQgUEMgZGV2aWNlcyAqLworCURXT1JEIG9yaWdSb3RhdGlvbjsgLyogZm9yIFBvY2tldCBQQyBkZXZpY2VzICovCisjZW5kaWYKKworICAgIC8qIFNjcmVlbnNhdmVyIHNldHRpbmdzICovCisgICAgaW50IGFsbG93X3NjcmVlbnNhdmVyOworfTsKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBzY3JlZW5fYm1wCQkodGhpcy0+aGlkZGVuLT5kaWJJbmZvLT5zY3JlZW5fYm1wKQorI2RlZmluZSBzY3JlZW5fcGFsCQkodGhpcy0+aGlkZGVuLT5kaWJJbmZvLT5zY3JlZW5fcGFsKQorI2RlZmluZSBzY3JlZW5fbG9ncGFsCQkodGhpcy0+aGlkZGVuLT5kaWJJbmZvLT5zY3JlZW5fbG9ncGFsKQorI2RlZmluZSBncmFiX3BhbGV0dGUJCSh0aGlzLT5oaWRkZW4tPmRpYkluZm8tPmdyYWJfcGFsZXR0ZSkKKyNkZWZpbmUgU0RMX251bW1vZGVzCQkodGhpcy0+aGlkZGVuLT5kaWJJbmZvLT5TRExfbnVtbW9kZXMpCisjZGVmaW5lIFNETF9tb2RlbGlzdAkJKHRoaXMtPmhpZGRlbi0+ZGliSW5mby0+U0RMX21vZGVsaXN0KQorI2RlZmluZSBhbGxvd19zY3JlZW5zYXZlcgkodGhpcy0+aGlkZGVuLT5kaWJJbmZvLT5hbGxvd19zY3JlZW5zYXZlcikKKworI2VuZGlmIC8qIF9TRExfZGlidmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5kaWIvU0RMX2dhcGlkaWJ2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5kaWIvU0RMX2dhcGlkaWJ2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzQzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmRpYi9TRExfZ2FwaWRpYnZpZGVvLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF9nYXBpZGlidmlkZW9faAorI2RlZmluZSBfU0RMX2dhcGlkaWJ2aWRlb19oCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcworCisvKiB0eXBlZGVmIHRoZXNlIHRvIGJlIGFibGUgdG8gZGVmaW5lIHBvaW50ZXJzLCBidXQgc3RpbGwgZm9yY2UgZXZlcnlib2R5IHdobworICogd2FudHMgdG8gYWNjZXNzIHRoZW0gdG8gaW5jbHVkZSB0aGUgY29ycmVzcG9uZGluZyBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IEdhcGlJbmZvIEdhcGlJbmZvOwordHlwZWRlZiBzdHJ1Y3QgRGliSW5mbyBEaWJJbmZvOworCisvKiBmb3IgUERBICovCit0eXBlZGVmIGVudW0KK3sKKwlTRExfT1JJRU5UQVRJT05fVVAsCisJU0RMX09SSUVOVEFUSU9OX0RPV04sCisJU0RMX09SSUVOVEFUSU9OX0xFRlQsCisJU0RMX09SSUVOVEFUSU9OX1JJR0hUCit9IFNETF9TY3JlZW5PcmllbnRhdGlvbjsKKworLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgc2hhcmVkIGJ5IGdhcGkgYW5kIHdpbmRpYiovCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgeworCWludCBzdXBwb3J0Um90YXRpb247IC8qIGZvciBQb2NrZXQgUEMgZGV2aWNlcyAqLworCURXT1JEIG9yaWdSb3RhdGlvbjsgLyogZm9yIFBvY2tldCBQQyBkZXZpY2VzICovCisJCisJR2FwaUluZm8qIGdhcGlJbmZvOworCURpYkluZm8qIGRpYkluZm87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZGliL1NETF92a2V5cy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5kaWIvU0RMX3ZrZXlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkOTI0NgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZGliL1NETF92a2V5cy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisKKyNpZm5kZWYgVktfMAorI2RlZmluZSBWS18wCScwJworI2RlZmluZSBWS18xCScxJworI2RlZmluZSBWS18yCScyJworI2RlZmluZSBWS18zCSczJworI2RlZmluZSBWS180CSc0JworI2RlZmluZSBWS181CSc1JworI2RlZmluZSBWS182CSc2JworI2RlZmluZSBWS183CSc3JworI2RlZmluZSBWS184CSc4JworI2RlZmluZSBWS185CSc5JworI2RlZmluZSBWS19BCSdBJworI2RlZmluZSBWS19CCSdCJworI2RlZmluZSBWS19DCSdDJworI2RlZmluZSBWS19ECSdEJworI2RlZmluZSBWS19FCSdFJworI2RlZmluZSBWS19GCSdGJworI2RlZmluZSBWS19HCSdHJworI2RlZmluZSBWS19ICSdIJworI2RlZmluZSBWS19JCSdJJworI2RlZmluZSBWS19KCSdKJworI2RlZmluZSBWS19LCSdLJworI2RlZmluZSBWS19MCSdMJworI2RlZmluZSBWS19NCSdNJworI2RlZmluZSBWS19OCSdOJworI2RlZmluZSBWS19PCSdPJworI2RlZmluZSBWS19QCSdQJworI2RlZmluZSBWS19RCSdRJworI2RlZmluZSBWS19SCSdSJworI2RlZmluZSBWS19TCSdTJworI2RlZmluZSBWS19UCSdUJworI2RlZmluZSBWS19VCSdVJworI2RlZmluZSBWS19WCSdWJworI2RlZmluZSBWS19XCSdXJworI2RlZmluZSBWS19YCSdYJworI2RlZmluZSBWS19ZCSdZJworI2RlZmluZSBWS19aCSdaJworI2VuZGlmIC8qIFZLXzAgKi8KKworLyogVGhlc2Uga2V5cyBoYXZlbid0IGJlZW4gZGVmaW5lZCwgYnV0IHdlcmUgZXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lZCAqLworI2RlZmluZSBWS19TRU1JQ09MT04JMHhCQQorI2RlZmluZSBWS19FUVVBTFMJMHhCQgorI2RlZmluZSBWS19DT01NQQkweEJDCisjZGVmaW5lIFZLX01JTlVTCTB4QkQKKyNkZWZpbmUgVktfUEVSSU9ECTB4QkUKKyNkZWZpbmUgVktfU0xBU0gJMHhCRgorI2RlZmluZSBWS19HUkFWRQkweEMwCisjZGVmaW5lIFZLX0xCUkFDS0VUCTB4REIKKyNkZWZpbmUgVktfQkFDS1NMQVNICTB4REMKKyNkZWZpbmUgVktfUkJSQUNLRVQJMHhERAorI2RlZmluZSBWS19BUE9TVFJPUEhFCTB4REUKKyNkZWZpbmUgVktfQkFDS1RJQ0sJMHhERgorI2RlZmluZSBWS19PRU1fMTAyCTB4RTIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDVldmVudHMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDVldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTIwOTJmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5keDUvU0RMX2R4NWV2ZW50cy5jCkBAIC0wLDAgKzEsMTAwNSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIENBVVRJT04hISEhICBJZiB5b3UgbW9kaWZ5IHRoaXMgZmlsZSwgY2hlY2sgLi4vd2luZGliL1NETF9zeXNldmVudHMuYyAqLworCisjaW5jbHVkZSAiZGlyZWN0eC5oIgorCisjaW5jbHVkZSAiU0RMX21haW4uaCIKKyNpbmNsdWRlICJTRExfZXZlbnRzLmgiCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3N5c3dtLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9zeXNldmVudHMuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9sb3d2aWRlby5oIgorI2luY2x1ZGUgIlNETF9keDV2aWRlby5oIgorCisjaWZuZGVmIFdNX0FQUAorI2RlZmluZSBXTV9BUFAJMHg4MDAwCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgTk9fR0VUS0VZQk9BUkRTVEFURQorI2VuZGlmCisKKy8qIFRoZSBrZXlib2FyZCBhbmQgbW91c2UgZGV2aWNlIGlucHV0ICovCisjZGVmaW5lIE1BWF9JTlBVVFMJMgorI2RlZmluZSBJTlBVVF9RU0laRQk1MTIJCS8qIEJ1ZmZlciB1cCB0byA1MTIgaW5wdXQgbWVzc2FnZXMgKi8KKworc3RhdGljIExQRElSRUNUSU5QVVQgZGlucHV0ID0gTlVMTDsKK3N0YXRpYyBMUERJUkVDVElOUFVUREVWSUNFMiBTRExfRElkZXZbTUFYX0lOUFVUU107CitzdGF0aWMgSEFORExFICAgICAgICAgICAgICAgU0RMX0RJZXZ0W01BWF9JTlBVVFNdOworc3RhdGljIHZvaWQgKCpTRExfRElmdW5bTUFYX0lOUFVUU10pKGNvbnN0IGludCwgRElERVZJQ0VPQkpFQ1REQVRBICopOworc3RhdGljIGludCBTRExfREluZGV2ID0gMDsKK3N0YXRpYyBpbnQgbW91c2VfbG9zdDsKK3N0YXRpYyBpbnQgbW91c2VfcHJlc3NlZDsKK3N0YXRpYyBpbnQgbW91c2VfYnV0dG9uc19zd2FwcGVkID0gMDsKKworLyogVGhlIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gYSBEaXJlY3RJbnB1dCBzY2FuY29kZSB0byBhbiBTREwga2V5c3ltICovCitzdGF0aWMgU0RMS2V5IERJS19rZXltYXBbMjU2XTsKK3N0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoVUlOVCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgcHJlc3NlZCk7CisKKy8qIERKTTogSWYgdGhlIHVzZXIgc2V0dXAgdGhlIHdpbmRvdyBmb3IgdXMsIHdlIHdhbnQgdG8gc2F2ZSBoaXMgd2luZG93IHByb2MsCisgICBhbmQgZ2l2ZSBoaW0gYSBjaGFuY2UgdG8gaGFuZGxlIHNvbWUgbWVzc2FnZXMuICovCisjaWZkZWYgU1RSSUNUCisjZGVmaW5lIFdORFBST0NUWVBFCVdORFBST0MKKyNlbHNlCisjZGVmaW5lIFdORFBST0NUWVBFCUZBUlBST0MKKyNlbmRpZgorc3RhdGljIFdORFBST0NUWVBFIHVzZXJXaW5kb3dQcm9jID0gTlVMTDsKKworc3RhdGljIEhXTkQgR2V0VG9wTGV2ZWxQYXJlbnQoSFdORCBoV25kKQoreworICAgIEhXTkQgaFBhcmVudFduZDsKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGhQYXJlbnRXbmQgPSBHZXRQYXJlbnQoaFduZCk7CisgICAgICAgIGlmIChoUGFyZW50V25kID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaFduZCA9IGhQYXJlbnRXbmQ7CisgICAgfQorICAgIHJldHVybiBoV25kOworfQorCisvKiBDb252ZXJ0IGEgRGlyZWN0SW5wdXQgcmV0dXJuIGNvZGUgdG8gYSB0ZXh0IG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIFNldERJZXJyb3IoY2hhciAqZnVuY3Rpb24sIGludCBjb2RlKQoreworCXN0YXRpYyBjaGFyICplcnJvcjsKKwlzdGF0aWMgY2hhciAgZXJyYnVmWzEwMjRdOworCisJZXJyYnVmWzBdID0gMDsKKwlzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJRVJSX0dFTkVSSUM6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJVbmRlZmluZWQgZXJyb3IhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIERJRVJSX09MRERJUkVDVElOUFVUVkVSU0lPTjoKKwkJCWVycm9yID0gIllvdXIgdmVyc2lvbiBvZiBEaXJlY3RJbnB1dCBuZWVkcyB1cGdyYWRpbmciOworCQkJYnJlYWs7CisJCWNhc2UgRElFUlJfSU5WQUxJRFBBUkFNOgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiSW52YWxpZCBwYXJhbWV0ZXJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElFUlJfT1VUT0ZNRU1PUlk6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJPdXQgb2YgbWVtb3J5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIERJRVJSX0RFVklDRU5PVFJFRzoKKwkJCWVycm9yID0gIkRldmljZSBub3QgcmVnaXN0ZXJlZCI7CisJCQlicmVhazsKKwkJY2FzZSBESUVSUl9OT0lOVEVSRkFDRToKKwkJCWVycm9yID0gIkludGVyZmFjZSBub3Qgc3VwcG9ydGVkIjsKKwkJCWJyZWFrOworCQljYXNlIERJRVJSX05PVElOSVRJQUxJWkVEOgorCQkJZXJyb3IgPSAiRGV2aWNlIG5vdCBpbml0aWFsaXplZCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNETF9zbnByaW50ZihlcnJidWYsIFNETF9hcnJheXNpemUoZXJyYnVmKSwKKwkJCSAgICAgICAgICIlczogVW5rbm93biBEaXJlY3RJbnB1dCBlcnJvcjogMHgleCIsCisJCQkJCQkJCWZ1bmN0aW9uLCBjb2RlKTsKKwkJCWJyZWFrOworCX0KKwlpZiAoICEgZXJyYnVmWzBdICkgeworCQlTRExfc25wcmludGYoZXJyYnVmLCBTRExfYXJyYXlzaXplKGVycmJ1ZiksICIlczogJXMiLCBmdW5jdGlvbiwgZXJyb3IpOworCX0KKwlTRExfU2V0RXJyb3IoIiVzIiwgZXJyYnVmKTsKKwlyZXR1cm47Cit9CisKKy8qIEluaXRpYWxpemUgRGlyZWN0SW5wdXQKKyAgIE5vdGU6ICBJZiBOT05FWENMVVNJVkUgYWNjZXNzIGlzIHJlcXVlc3RlZCBmb3IgdGhlIGRldmljZXMsIG5vcm1hbCAKKyAgICAgICAgICB3aW5kb3dzIGlucHV0IG1lc3NhZ2VzIHdpbGwgY29udGludWUgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGF0CisgICAgICAgICAgaW5wdXQgZGV2aWNlLCBpbiBhZGRpdGlvbiB0byBEaXJlY3RJbnB1dCBtZXNzYWdlcy4KKyAqLworc3RhdGljIHZvaWQgaGFuZGxlX2tleWJvYXJkKGNvbnN0IGludCBudW1ldmVudHMsIERJREVWSUNFT0JKRUNUREFUQSAqZXZlbnRzKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9tb3VzZShjb25zdCBpbnQgbnVtZXZlbnRzLCBESURFVklDRU9CSkVDVERBVEEgKmV2ZW50cyk7CitzdHJ1Y3QgeworCWNoYXIgKm5hbWU7CisJUkVGR1VJRCBndWlkOworCUxQQ0RJREFUQUZPUk1BVCBmb3JtYXQ7CisJRFdPUkQgd2luX2xldmVsOworCURXT1JEIHJhd19sZXZlbDsKKwl2b2lkICgqZnVuKShjb25zdCBpbnQgbnVtZXZlbnRzLCBESURFVklDRU9CSkVDVERBVEEgKmV2ZW50cyk7Cit9IGlucHV0c1tdID0geworCXsgImtleWJvYXJkIiwKKwkJJkdVSURfU3lzS2V5Ym9hcmQsICZjX2RmRElLZXlib2FyZCwKKwkJKERJU0NMX0ZPUkVHUk9VTkR8RElTQ0xfTk9ORVhDTFVTSVZFKSwKKwkJKERJU0NMX0ZPUkVHUk9VTkR8RElTQ0xfTk9ORVhDTFVTSVZFKSwgaGFuZGxlX2tleWJvYXJkIH0sCisJeyAibW91c2UiLAorCQkmR1VJRF9TeXNNb3VzZSwKKyNpZiBESVJFQ1RJTlBVVF9WRVJTSU9OID49IDB4NzAwCisJCSZjX2RmRElNb3VzZTIsCisjZWxzZQorCQkmY19kZkRJTW91c2UsCisjZW5kaWYKKwkJKERJU0NMX0JBQ0tHUk9VTkR8RElTQ0xfTk9ORVhDTFVTSVZFKSwKKwkJKERJU0NMX0JBQ0tHUk9VTkR8RElTQ0xfTk9ORVhDTFVTSVZFKSwgaGFuZGxlX21vdXNlIH0sCisJeyBOVUxMLCBOVUxMLCBOVUxMLCAwLCAwLCBOVUxMIH0KK307CisJCitzdGF0aWMgaW50IERYNV9ESW5wdXRJbml0KF9USElTKQoreworCWludCAgICAgICAgIGk7CisJTFBESVJFQ1RJTlBVVERFVklDRSBkZXZpY2U7CisJSFJFU1VMVCAgICAgcmVzdWx0OworCURJUFJPUERXT1JEIGRpcGR3OworCUhXTkQgICAgICAgIHRvcHduZDsKKworCS8qIENyZWF0ZSB0aGUgRGlyZWN0SW5wdXQgb2JqZWN0ICovCisJcmVzdWx0ID0gRElucHV0Q3JlYXRlKFNETF9JbnN0YW5jZSwgRElSRUNUSU5QVVRfVkVSU0lPTiwKKwkJCQkJCQkmZGlucHV0LCBOVUxMKTsKKwlpZiAoIHJlc3VsdCAhPSBESV9PSyApIHsKKwkJU2V0REllcnJvcigiRGlyZWN0SW5wdXRDcmVhdGUiLCByZXN1bHQpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIENyZWF0ZSBhbGwgb2Ygb3VyIHJlZ2lzdGVyZWQgaW5wdXQgZGV2aWNlcyAqLworCVNETF9ESW5kZXYgPSAwOworCWZvciAoIGk9MDsgaW5wdXRzW2ldLm5hbWU7ICsraSApIHsKKwkJLyogQ3JlYXRlIHRoZSBEaXJlY3RJbnB1dCBkZXZpY2UgKi8KKwkJcmVzdWx0ID0gSURpcmVjdElucHV0X0NyZWF0ZURldmljZShkaW5wdXQsIGlucHV0c1tpXS5ndWlkLAorCQkJCQkJCQkmZGV2aWNlLCBOVUxMKTsKKwkJaWYgKCByZXN1bHQgIT0gRElfT0sgKSB7CisJCQlTZXRESWVycm9yKCJEaXJlY3RJbnB1dDo6Q3JlYXRlRGV2aWNlIiwgcmVzdWx0KTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJcmVzdWx0ID0gSURpcmVjdElucHV0RGV2aWNlX1F1ZXJ5SW50ZXJmYWNlKGRldmljZSwKKwkJCSZJSURfSURpcmVjdElucHV0RGV2aWNlMiwgKExQVk9JRCAqKSZTRExfRElkZXZbaV0pOworCQlJRGlyZWN0SW5wdXREZXZpY2VfUmVsZWFzZShkZXZpY2UpOworCQlpZiAoIHJlc3VsdCAhPSBESV9PSyApIHsKKwkJCVNldERJZXJyb3IoIkRpcmVjdElucHV0RGV2aWNlOjpRdWVyeUludGVyZmFjZSIsIHJlc3VsdCk7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCXRvcHduZCA9ICBHZXRUb3BMZXZlbFBhcmVudChTRExfV2luZG93KTsKKwkJcmVzdWx0ID0gSURpcmVjdElucHV0RGV2aWNlMl9TZXRDb29wZXJhdGl2ZUxldmVsKFNETF9ESWRldltpXSwKKwkJCQkJdG9wd25kLCBpbnB1dHNbaV0ud2luX2xldmVsKTsKKwkJaWYgKCByZXN1bHQgIT0gRElfT0sgKSB7CisJCQlTZXRESWVycm9yKCJEaXJlY3RJbnB1dERldmljZTo6U2V0Q29vcGVyYXRpdmVMZXZlbCIsCisJCQkJCQkJCQlyZXN1bHQpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlyZXN1bHQgPSBJRGlyZWN0SW5wdXREZXZpY2UyX1NldERhdGFGb3JtYXQoU0RMX0RJZGV2W2ldLAorCQkJCQkJCWlucHV0c1tpXS5mb3JtYXQpOworCQlpZiAoIHJlc3VsdCAhPSBESV9PSyApIHsKKwkJCVNldERJZXJyb3IoIkRpcmVjdElucHV0RGV2aWNlOjpTZXREYXRhRm9ybWF0IiwgcmVzdWx0KTsKKwkJCXJldHVybigtMSk7CisJCX0KKworCQkvKiBTZXQgYnVmZmVyZWQgaW5wdXQgLS0gd2UgYXJlbid0IHBvbGxpbmcgKi8KKwkJU0RMX21lbXNldCgmZGlwZHcsIDAsIHNpemVvZihkaXBkdykpOworCQlkaXBkdy5kaXBoLmR3U2l6ZSA9IHNpemVvZihkaXBkdyk7CisJCWRpcGR3LmRpcGguZHdIZWFkZXJTaXplID0gc2l6ZW9mKGRpcGR3LmRpcGgpOworCQlkaXBkdy5kaXBoLmR3T2JqID0gMDsKKwkJZGlwZHcuZGlwaC5kd0hvdyA9IERJUEhfREVWSUNFOworCQlkaXBkdy5kd0RhdGEgPSBJTlBVVF9RU0laRTsKKwkJcmVzdWx0ID0gSURpcmVjdElucHV0RGV2aWNlMl9TZXRQcm9wZXJ0eShTRExfRElkZXZbaV0sCisJCQkJCQlESVBST1BfQlVGRkVSU0laRSwgJmRpcGR3LmRpcGgpOworCQlpZiAoIHJlc3VsdCAhPSBESV9PSyApIHsKKwkJCVNldERJZXJyb3IoIkRpcmVjdElucHV0RGV2aWNlOjpTZXRQcm9wZXJ0eSIsIHJlc3VsdCk7CisJCQlyZXR1cm4oLTEpOworCQl9CisKKwkJLyogQ3JlYXRlIGFuIGV2ZW50IHRvIGJlIHNpZ25hbGVkIHdoZW4gaW5wdXQgaXMgcmVhZHkgKi8KKwkJU0RMX0RJZXZ0W2ldID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKwkJaWYgKCBTRExfRElldnRbaV0gPT0gTlVMTCApIHsKKwkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIERpcmVjdElucHV0IGV2ZW50Iik7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCXJlc3VsdCA9IElEaXJlY3RJbnB1dERldmljZTJfU2V0RXZlbnROb3RpZmljYXRpb24oU0RMX0RJZGV2W2ldLAorCQkJCQkJCQlTRExfRElldnRbaV0pOworCQlpZiAoIHJlc3VsdCAhPSBESV9PSyApIHsKKwkJCVNldERJZXJyb3IoIkRpcmVjdElucHV0RGV2aWNlOjpTZXRFdmVudE5vdGlmaWNhdGlvbiIsCisJCQkJCQkJCQlyZXN1bHQpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlTRExfRElmdW5baV0gPSBpbnB1dHNbaV0uZnVuOworCisJCS8qIEFjcXVpcmUgdGhlIGRldmljZSBmb3IgaW5wdXQgKi8KKwkJSURpcmVjdElucHV0RGV2aWNlMl9BY3F1aXJlKFNETF9ESWRldltpXSk7CisKKwkJLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgZGV2aWNlcyB3ZSBoYXZlICovCisJCSsrU0RMX0RJbmRldjsKKwl9CisJbW91c2VfcHJlc3NlZCA9IDA7CisJbW91c2VfYnV0dG9uc19zd2FwcGVkID0gR2V0U3lzdGVtTWV0cmljcyhTTV9TV0FQQlVUVE9OKTsKKworCS8qIERpcmVjdElucHV0IGlzIHJlYWR5ISAqLworCXJldHVybigwKTsKK30KKworLyogQ2xlYW4gdXAgRGlyZWN0SW5wdXQgKi8KK3N0YXRpYyB2b2lkIERYNV9ESW5wdXRRdWl0KF9USElTKQoreworCWludCBpOworCisJaWYgKCBkaW5wdXQgIT0gTlVMTCApIHsKKwkJLyogQ2xvc2UgYW5kIHJlbGVhc2UgYWxsIERpcmVjdElucHV0IGRldmljZXMgKi8KKwkJZm9yICggaT0wOyBpPE1BWF9JTlBVVFM7ICsraSApIHsKKwkJCWlmICggU0RMX0RJZGV2W2ldICE9IE5VTEwgKSB7CisJCQkJSURpcmVjdElucHV0RGV2aWNlMl9VbmFjcXVpcmUoU0RMX0RJZGV2W2ldKTsKKwkJCQlJRGlyZWN0SW5wdXREZXZpY2UyX1NldEV2ZW50Tm90aWZpY2F0aW9uKAorCQkJCQkJCVNETF9ESWRldltpXSwgTlVMTCk7CisJCQkJaWYgKCBTRExfRElldnRbaV0gIT0gTlVMTCApIHsKKwkJCQkJQ2xvc2VIYW5kbGUoU0RMX0RJZXZ0W2ldKTsKKwkJCQkJU0RMX0RJZXZ0W2ldID0gTlVMTDsKKwkJCQl9CisJCQkJSURpcmVjdElucHV0RGV2aWNlMl9SZWxlYXNlKFNETF9ESWRldltpXSk7CisJCQkJU0RMX0RJZGV2W2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCQlTRExfREluZGV2ID0gMDsKKworCQkvKiBSZWxlYXNlIERpcmVjdElucHV0ICovCisJCUlEaXJlY3RJbnB1dF9SZWxlYXNlKGRpbnB1dCk7CisJCWRpbnB1dCA9IE5VTEw7CisJfQorfQorCisvKiBGbGFnIHRvIHRlbGwgU0RMIHdoZXRoZXIgb3Igbm90IHdlIHF1ZXVlZCBhbiBldmVudCAqLworc3RhdGljIGludCBwb3N0ZWQgPSAwOworCisvKiBJbnB1dCBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgaGFuZGxlX2tleWJvYXJkKGNvbnN0IGludCBudW1ldmVudHMsIERJREVWSUNFT0JKRUNUREFUQSAqa2V5YnVmKQoreworCWludCBpOworCVNETF9rZXlzeW0ga2V5c3ltOworCisJLyogVHJhbnNsYXRlIGtleWJvYXJkIG1lc3NhZ2VzICovCisJZm9yICggaT0wOyBpPG51bWV2ZW50czsgKytpICkgeworCQlpZiAoIGtleWJ1ZltpXS5kd0RhdGEgJiAweDgwICkgeworCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwKKwkJCQkgICAgVHJhbnNsYXRlS2V5KGtleWJ1ZltpXS5kd09mcywgJmtleXN5bSwgMSkpOworCQl9IGVsc2UgeworCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUkVMRUFTRUQsCisJCQkJICAgIFRyYW5zbGF0ZUtleShrZXlidWZbaV0uZHdPZnMsICZrZXlzeW0sIDApKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcG9zdF9tb3VzZV9tb3Rpb24oaW50IHJlbGF0aXZlLCBTaW50MTYgeCwgU2ludDE2IHkpCit7CisJZXh0ZXJuIGludCBtb3VzZV9yZWxhdGl2ZTsKKworCWlmICggU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUyApIHsKKwkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigKKwkJCTAsIHJlbGF0aXZlLCB4LCB5KTsKKworCQlpZiAoICFtb3VzZV9yZWxhdGl2ZSApIHsKKwkJCS8qIEFzIERpcmVjdElucHV0IHJlYWRzIHJhdyBkZXZpY2UgY29vcmRpbmF0ZXMsIGl0IGhhcyBubyBub3Rpb24gb2YKKwkJCSAqIGN1cnNvcnMgb3IgYWJzb2x1dGUgcG9zaXRpb24uIFdlIG11c3QgYXNzdW1lIHJlc3BvbnNpYmlsaXR5IGZvcgorCQkJICoga2VlcGluZyB0cmFjayBvZiB0aGlzLiAqLworCQkJaW50IGN1cnJlbnRfeCwgY3VycmVudF95OworCQkJUE9JTlQgY3Vyc29yOworCQkJUkVDVCB0cmFwOworCQkJUkVDVCB3aW5kb3c7CisJCQlpbnQgYXRfZWRnZTsKKworCQkJLyogR2V0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiAqLworCQkJU0RMX0dldE1vdXNlU3RhdGUoJmN1cnJlbnRfeCwgJmN1cnJlbnRfeSk7CisJCQljdXJzb3IueCA9IGN1cnJlbnRfeDsKKwkJCWN1cnNvci55ID0gY3VycmVudF95OworCQkJQ2xpZW50VG9TY3JlZW4oU0RMX1dpbmRvdywgJmN1cnNvcik7CisKKwkJCS8qIENvbnN0cnVjdCBhIDEgcGl4ZWwgc3F1YXJlIFJFQ1QgdGhhdCBpcyB1c2VkIHRvIGNvbmZpbmUgdGhlIGN1cnNvcgorCQkJICogcG9pbnRlciB0byBhIHNwZWNpZmljIHBpeGVsIHVzaW5nIENsaXBDdXJzb3IuIFRoaXMgaXMgdXNlZCBpbgorCQkJICogcHJlZmVyZW5jZSB0byBTZXRDdXJzb3JQb3MgYXMgaXQgYXZvaWRzIHRoZSBjdXJzb3IganVtcGluZyBhcm91bmQgYXMKKwkJCSAqIGJvdGggdGhlIE9TIGFuZCBTREwgYXR0ZW1wdCB0byBtb3ZlIGl0IHNpbXVsdGFuZW91c2x5LiAqLworCQkJdHJhcC5sZWZ0ID0gY3Vyc29yLng7CisJCQl0cmFwLnRvcCA9IGN1cnNvci55OworCQkJdHJhcC5yaWdodCA9IGN1cnNvci54ICsgMTsKKwkJCXRyYXAuYm90dG9tID0gY3Vyc29yLnkgKyAxOworCisJCQlHZXRDbGllbnRSZWN0KFNETF9XaW5kb3csICZ3aW5kb3cpOworCQkJd2luZG93LnJpZ2h0IC09IHdpbmRvdy5sZWZ0OyB3aW5kb3cubGVmdCA9IDA7CisJCQl3aW5kb3cuYm90dG9tIC09IHdpbmRvdy50b3A7IHdpbmRvdy50b3AgPSAwOworCisJCQkvKiBBcyB3ZSdyZSBhc3N1bWluZyBjb250cm9sIG92ZXIgdGhlIGN1cnNvciwgd2UgbmVlZCB0byBrbm93IHdoZW4gdG8KKwkJCSAqIHJlbGlucXVpc2ggY29udHJvbCBvZiBpdCBiYWNrIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBUaGlzIGlzIHdoZW4KKwkJCSAqIHRoZSBjdXJzb3IgcmVhY2hlcyB0aGUgZWRnZSBvZiB0aGUgd2luZG93LiAqLworCQkJYXRfZWRnZSA9IChjdXJyZW50X3ggPT0gd2luZG93LmxlZnQpIHx8CisJCQkJKGN1cnJlbnRfeCA9PSAod2luZG93LnJpZ2h0IC0gMSkpIHx8CisJCQkJKGN1cnJlbnRfeSA9PSB3aW5kb3cudG9wKSB8fAorCQkJCShjdXJyZW50X3kgPT0gKHdpbmRvdy5ib3R0b20gLSAxKSk7CisKKwkJCWlmICggYXRfZWRnZSApIHsKKwkJCQlDbGlwQ3Vyc29yKE5VTEwpOworCQkJfSBlbHNlIHsKKwkJCQlDbGlwQ3Vyc29yKCZ0cmFwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFdoZW4gaW4gcmVsYXRpdmUgbW9kZSwgd2FycCB0aGUgT1MncyBpZGVhIG9mIHdoZXJlIHRoZSBjdXJzb3IgaXMgdG8KKwkJCSAqIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4gVGhpcyBpc24ndCByZWFsbHkgbmVjZXNzYXJ5IGFzIERpcmVjdElucHV0CisJCQkgKiByZWFkcyBmcm9tIHRoZSBoYXJkd2FyZSBpdHNlbGYsIGJ1dCBpbiBjYXNlIHRoaW5ncyBnbyB3cm9uZywgdGhlCisJCQkgKiBjdXJzb3Igd2lsbCBiZSBsZWZ0IGluIGEgc2Vuc2libGUgcGxhY2UuICovCisJCQlQT0lOVCBjZW50ZXI7CisJCQljZW50ZXIueCA9IChTRExfVmlkZW9TdXJmYWNlLT53LzIpOworCQkJY2VudGVyLnkgPSAoU0RMX1ZpZGVvU3VyZmFjZS0+aC8yKTsKKwkJCUNsaWVudFRvU2NyZWVuKFNETF9XaW5kb3csICZjZW50ZXIpOworCQkJU2V0Q3Vyc29yUG9zKGNlbnRlci54LCBjZW50ZXIueSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9tb3VzZShjb25zdCBpbnQgbnVtZXZlbnRzLCBESURFVklDRU9CSkVDVERBVEEgKnB0cmJ1ZikKK3sKKwlpbnQgaTsKKwlTaW50MTYgeHJlbCwgeXJlbDsKKwlVaW50OCBzdGF0ZTsKKwlVaW50OCBidXR0b247CisJRFdPUkQgdGltZXN0YW1wID0gMDsKKworCS8qIFNhbml0eSBjaGVjay4gTWFpbGluZyBsaXN0IHJlcG9ydHMgdGhpcyBiZWluZyBOVUxMIHVuZXhwZWN0ZWRseS4gKi8KKwlpZiAoU0RMX1B1YmxpY1N1cmZhY2UgPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCisJLyogSWYgbW91c2UgZm9jdXMgaGFzIGJlZW4gbG9zdCwgbWFrZSBzdXJlIHdlIHJlbGVhc2UgdGhlIGN1cnNvci4gKi8KKwlpZiAoICEoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQTU9VU0VGT0NVUykgKSB7CisJCW1vdXNlX2xvc3QgPSAxOworCQlDbGlwQ3Vyc29yKE5VTEwpOworCX0gZWxzZSB7CisJCS8qIElmIHRoZSBtb3VzZSB3YXMgbG9zdCwgcmVnYWluIHNvbWUgc2Vuc2Ugb2YgbW91c2Ugc3RhdGUgKi8KKwkJaWYgKCBtb3VzZV9sb3N0ICkgeworCQkJUE9JTlQgbW91c2VfcG9zOworCQkJVWludDggb2xkX3N0YXRlOworCQkJVWludDggbmV3X3N0YXRlOworCisJCQkvKiBTZXQgb3Vyc2VsdmVzIHVwIHdpdGggdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uICovCisJCQlHZXRDdXJzb3JQb3MoJm1vdXNlX3Bvcyk7CisJCQlTY3JlZW5Ub0NsaWVudChTRExfV2luZG93LCAmbW91c2VfcG9zKTsKKwkJCXBvc3RfbW91c2VfbW90aW9uKCAwLCAoU2ludDE2KW1vdXNlX3Bvcy54LCAoU2ludDE2KW1vdXNlX3Bvcy55KTsKKworCQkJLyogQ2hlY2sgZm9yIG1vdXNlIGJ1dHRvbiBjaGFuZ2VzICovCisJCQlvbGRfc3RhdGUgPSBTRExfR2V0TW91c2VTdGF0ZShOVUxMLCBOVUxMKTsKKwkJCW5ld19zdGF0ZSA9IDA7CisJCQl7IC8qIEdldCB0aGUgbmV3IERpcmVjdElucHV0IGJ1dHRvbiBzdGF0ZSBmb3IgdGhlIG1vdXNlICovCisJI2lmIERJUkVDVElOUFVUX1ZFUlNJT04gPj0gMHg3MDAKKwkJCQlESU1PVVNFU1RBVEUyIGRpc3RhdGU7CisJI2Vsc2UKKwkJCQlESU1PVVNFU1RBVEUgZGlzdGF0ZTsKKwkjZW5kaWYKKwkJCQlIUkVTVUxUIHJlc3VsdDsKKworCQkJCXJlc3VsdD1JRGlyZWN0SW5wdXREZXZpY2UyX0dldERldmljZVN0YXRlKFNETF9ESWRldlsxXSwKKwkJCQkJCQlzaXplb2YoZGlzdGF0ZSksICZkaXN0YXRlKTsKKwkJCQlpZiAoIHJlc3VsdCAhPSBESV9PSyApIHsKKwkJCQkJLyogVHJ5IGFnYWluIG5leHQgdGltZSAqLworCQkJCQlTZXRESWVycm9yKAorCQkJCQkiSURpcmVjdElucHV0RGV2aWNlMjo6R2V0RGV2aWNlU3RhdGUiLCByZXN1bHQpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWZvciAoIGk9MzsgaT49MDsgLS1pICkgeworCQkJCQlpZiAoIChkaXN0YXRlLnJnYkJ1dHRvbnNbaV0mMHg4MCkgPT0gMHg4MCApIHsKKwkJCQkJCW5ld19zdGF0ZSB8PSAweDAxOworCQkJCQl9CisJCQkJCW5ld19zdGF0ZSA8PD0gMTsKKwkJCQl9CisJCQl9CisJCQlmb3IgKCBpPTA7IGk8ODsgKytpICkgeworCQkJCWlmICggKG9sZF9zdGF0ZSYweDAxKSAhPSAobmV3X3N0YXRlJjB4MDEpICkgeworCQkJCQlidXR0b24gPSAoVWludDgpKGkrMSk7CisJCQkJCS8qIE1hcCBESSBidXR0b24gbnVtYmVycyB0byBTREwgKi8KKwkJCQkJc3dpdGNoICggYnV0dG9uICkgeworCQkJCQkJY2FzZSAyOiBidXR0b24gPSBTRExfQlVUVE9OX1JJR0hUOyBicmVhazsKKwkJCQkJCWNhc2UgMzogYnV0dG9uID0gU0RMX0JVVFRPTl9NSURETEU7IGJyZWFrOworCQkJCQkJY2FzZSA0OiBidXR0b24gPSBTRExfQlVUVE9OX1gxOyBicmVhazsKKwkJCQkJCWNhc2UgNTogYnV0dG9uID0gU0RMX0JVVFRPTl9YMjsgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiBicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoIG5ld19zdGF0ZSAmIDB4MDEgKSB7CisJCQkJCQkvKiBHcmFiIG1vdXNlIHNvIHdlIGdldCBtb3VzZS11cCAqLworCQkJCQkJaWYgKCArK21vdXNlX3ByZXNzZWQgPiAwICkgeworCQkJCQkJCVNldENhcHR1cmUoU0RMX1dpbmRvdyk7CisJCQkJCQl9CisJCQkJCQlzdGF0ZSA9IFNETF9QUkVTU0VEOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogUmVsZWFzZSBtb3VzZSBhZnRlciBhbGwgbW91c2UtdXBzICovCisJCQkJCQlpZiAoIC0tbW91c2VfcHJlc3NlZCA8PSAwICkgeworCQkJCQkJCVJlbGVhc2VDYXB0dXJlKCk7CisJCQkJCQkJbW91c2VfcHJlc3NlZCA9IDA7CisJCQkJCQl9CisJCQkJCQlzdGF0ZSA9IFNETF9SRUxFQVNFRDsKKwkJCQkJfQorCQkJCQlpZiAoIG1vdXNlX2J1dHRvbnNfc3dhcHBlZCApIHsKKwkJCQkJCWlmICggYnV0dG9uID09IDEgKSBidXR0b24gPSAzOworCQkJCQkJZWxzZQorCQkJCQkJaWYgKCBidXR0b24gPT0gMyApIGJ1dHRvbiA9IDE7CisJCQkJCX0KKwkJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihzdGF0ZSwgYnV0dG9uLAorCQkJCQkJCQkJCTAsIDApOworCQkJCX0KKwkJCQlvbGRfc3RhdGUgPj49IDE7CisJCQkJbmV3X3N0YXRlID4+PSAxOworCQkJfQorCQkJbW91c2VfbG9zdCA9IDA7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBUcmFuc2xhdGUgbW91c2UgbWVzc2FnZXMgKi8KKwkJeHJlbCA9IDA7CisJCXlyZWwgPSAwOworCQlmb3IgKCBpPTA7IGk8KGludCludW1ldmVudHM7ICsraSApIHsKKwkJCXN3aXRjaCAocHRyYnVmW2ldLmR3T2ZzKSB7CisJCQkJY2FzZSBESU1PRlNfWDoKKwkJCQkJaWYgKCB0aW1lc3RhbXAgIT0gcHRyYnVmW2ldLmR3VGltZVN0YW1wICkgeworCQkJCQkJaWYgKCB4cmVsIHx8IHlyZWwgKSB7CisJCQkJCQkJcG9zdF9tb3VzZV9tb3Rpb24oMSwgeHJlbCwgeXJlbCk7CisJCQkJCQkJeHJlbCA9IDA7CisJCQkJCQkJeXJlbCA9IDA7CisJCQkJCQl9CisJCQkJCQl0aW1lc3RhbXAgPSBwdHJidWZbaV0uZHdUaW1lU3RhbXA7CisJCQkJCX0KKwkJCQkJeHJlbCArPSAoU2ludDE2KXB0cmJ1ZltpXS5kd0RhdGE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRElNT0ZTX1k6CisJCQkJCWlmICggdGltZXN0YW1wICE9IHB0cmJ1ZltpXS5kd1RpbWVTdGFtcCApIHsKKwkJCQkJCWlmICggeHJlbCB8fCB5cmVsICkgeworCQkJCQkJCXBvc3RfbW91c2VfbW90aW9uKDEsIHhyZWwsIHlyZWwpOworCQkJCQkJCXhyZWwgPSAwOworCQkJCQkJCXlyZWwgPSAwOworCQkJCQkJfQorCQkJCQkJdGltZXN0YW1wID0gcHRyYnVmW2ldLmR3VGltZVN0YW1wOworCQkJCQl9CisJCQkJCXlyZWwgKz0gKFNpbnQxNilwdHJidWZbaV0uZHdEYXRhOworCQkJCQlicmVhazsKKwkJCQljYXNlIERJTU9GU19aOgorCQkJCQlpZiAoIHhyZWwgfHwgeXJlbCApIHsKKwkJCQkJCXBvc3RfbW91c2VfbW90aW9uKDEsIHhyZWwsIHlyZWwpOworCQkJCQkJeHJlbCA9IDA7CisJCQkJCQl5cmVsID0gMDsKKwkJCQkJfQorCQkJCQl0aW1lc3RhbXAgPSAwOworCQkJCQlpZigoaW50KXB0cmJ1ZltpXS5kd0RhdGEgPiAwKQorCQkJCQkJYnV0dG9uID0gU0RMX0JVVFRPTl9XSEVFTFVQOworCQkJCQllbHNlCisJCQkJCQlidXR0b24gPSBTRExfQlVUVE9OX1dIRUVMRE9XTjsKKwkJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbigKKwkJCQkJCQlTRExfUFJFU1NFRCwgYnV0dG9uLCAwLCAwKTsKKwkJCQkJcG9zdGVkIHw9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oCisJCQkJCQkJU0RMX1JFTEVBU0VELCBidXR0b24sIDAsIDApOworCQkJCQlicmVhazsKKwkJCQljYXNlIERJTU9GU19CVVRUT04wOgorCQkJCWNhc2UgRElNT0ZTX0JVVFRPTjE6CisJCQkJY2FzZSBESU1PRlNfQlVUVE9OMjoKKwkJCQljYXNlIERJTU9GU19CVVRUT04zOgorCSNpZiBESVJFQ1RJTlBVVF9WRVJTSU9OID49IDB4NzAwCisJCQkJY2FzZSBESU1PRlNfQlVUVE9ONDoKKwkJCQljYXNlIERJTU9GU19CVVRUT041OgorCQkJCWNhc2UgRElNT0ZTX0JVVFRPTjY6CisJCQkJY2FzZSBESU1PRlNfQlVUVE9ONzoKKwkjZW5kaWYKKwkJCQkJaWYgKCB4cmVsIHx8IHlyZWwgKSB7CisJCQkJCQlwb3N0X21vdXNlX21vdGlvbigxLCB4cmVsLCB5cmVsKTsKKwkJCQkJCXhyZWwgPSAwOworCQkJCQkJeXJlbCA9IDA7CisJCQkJCX0KKwkJCQkJdGltZXN0YW1wID0gMDsKKwkJCQkJYnV0dG9uID0gKFVpbnQ4KShwdHJidWZbaV0uZHdPZnMtRElNT0ZTX0JVVFRPTjApKzE7CisJCQkJCS8qIE1hcCBESSBidXR0b24gbnVtYmVycyB0byBTREwgKi8KKwkJCQkJc3dpdGNoICggYnV0dG9uICkgeworCQkJCQkJY2FzZSAyOiBidXR0b24gPSBTRExfQlVUVE9OX1JJR0hUOyBicmVhazsKKwkJCQkJCWNhc2UgMzogYnV0dG9uID0gU0RMX0JVVFRPTl9NSURETEU7IGJyZWFrOworCQkJCQkJY2FzZSA0OiBidXR0b24gPSBTRExfQlVUVE9OX1gxOyBicmVhazsKKwkJCQkJCWNhc2UgNTogYnV0dG9uID0gU0RMX0JVVFRPTl9YMjsgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiBicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoIHB0cmJ1ZltpXS5kd0RhdGEgJiAweDgwICkgeworCQkJCQkJLyogR3JhYiBtb3VzZSBzbyB3ZSBnZXQgbW91c2UtdXAgKi8KKwkJCQkJCWlmICggKyttb3VzZV9wcmVzc2VkID4gMCApIHsKKwkJCQkJCQlTZXRDYXB0dXJlKFNETF9XaW5kb3cpOworCQkJCQkJfQorCQkJCQkJc3RhdGUgPSBTRExfUFJFU1NFRDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIFJlbGVhc2UgbW91c2UgYWZ0ZXIgYWxsIG1vdXNlLXVwcyAqLworCQkJCQkJaWYgKCAtLW1vdXNlX3ByZXNzZWQgPD0gMCApIHsKKwkJCQkJCQlSZWxlYXNlQ2FwdHVyZSgpOworCQkJCQkJCW1vdXNlX3ByZXNzZWQgPSAwOworCQkJCQkJfQorCQkJCQkJc3RhdGUgPSBTRExfUkVMRUFTRUQ7CisJCQkJCX0KKwkJCQkJaWYgKCBtb3VzZV9idXR0b25zX3N3YXBwZWQgKSB7CisJCQkJCQlpZiAoIGJ1dHRvbiA9PSAxICkgYnV0dG9uID0gMzsKKwkJCQkJCWVsc2UKKwkJCQkJCWlmICggYnV0dG9uID09IDMgKSBidXR0b24gPSAxOworCQkJCQl9CisJCQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oc3RhdGUsIGJ1dHRvbiwKKwkJCQkJCQkJCQkwLCAwKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCB4cmVsIHx8IHlyZWwgKSB7CisJCQlwb3N0X21vdXNlX21vdGlvbigxLCB4cmVsLCB5cmVsKTsKKwkJfQorCX0KK30KKworLyogVGhlIG1haW4gV2luMzIgZXZlbnQgaGFuZGxlciAqLworTFJFU1VMVCBEWDVfSGFuZGxlTWVzc2FnZShfVEhJUywgSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKwlzd2l0Y2ggKG1zZykgeworI2lmZGVmIFdNX0FDVElWQVRFQVBQCisJCWNhc2UgV01fQUNUSVZBVEVBUFA6IHsKKwkJCWludCBpLCBhY3RpdmU7CisKKwkJCWFjdGl2ZSA9ICh3UGFyYW0gJiYgKEdldEZvcmVncm91bmRXaW5kb3coKSA9PSBod25kKSk7CisJCQlpZiAoIGFjdGl2ZSApIHsKKwkJCQlmb3IgKCBpPTA7IGk8TUFYX0lOUFVUUzsgKytpICkgeworCQkJCQlpZiAoU0RMX0RJZGV2W2ldICE9IE5VTEwpCisJCQkJCQlJRGlyZWN0SW5wdXREZXZpY2UyX0FjcXVpcmUoCisJCQkJCQkJCVNETF9ESWRldltpXSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCBpPTA7IGk8TUFYX0lOUFVUUzsgKytpICkgeworCQkJCQlpZiAoU0RMX0RJZGV2W2ldICE9IE5VTEwpIAorCQkJCQkJSURpcmVjdElucHV0RGV2aWNlMl9VbmFjcXVpcmUoCisJCQkJCQkJCVNETF9ESWRldltpXSk7CisJCQkJfQorCQkJCW1vdXNlX2xvc3QgPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIFdNX0FDVElWQVRFQVBQICovCisKKyNpZmRlZiBXTV9ESVNQTEFZQ0hBTkdFCisJCWNhc2UgV01fRElTUExBWUNIQU5HRTogeworCQkJV1BBUkFNIEJpdHNQZXJQaXhlbDsKKwkJCVdPUkQgU2l6ZVgsIFNpemVZOworCisJCQkvKiBBY2shICBUaGUgZGlzcGxheSBjaGFuZ2VkIHNpemUgYW5kL29yIGRlcHRoISAqLworCQkJU2l6ZVggPSBMT1dPUkQobFBhcmFtKTsKKwkJCVNpemVZID0gSElXT1JEKGxQYXJhbSk7CisJCQlCaXRzUGVyUGl4ZWwgPSB3UGFyYW07CisJCQkvKiBXZSBjYXVzZSB0aGlzIG1lc3NhZ2Ugd2hlbiB3ZSBnbyBmdWxsc2NyZWVuICovCisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLyogV01fRElTUExBWUNIQU5HRSAqLworCisJCS8qIFRoZSBrZXlib2FyZCBpcyBoYW5kbGVkIHZpYSBEaXJlY3RJbnB1dCAqLworCQljYXNlIFdNX1NZU0tFWVVQOgorCQljYXNlIFdNX1NZU0tFWURPV046CisJCWNhc2UgV01fS0VZVVA6CisJCWNhc2UgV01fS0VZRE9XTjogeworCQkJLyogSWdub3JlIHdpbmRvd3Mga2V5Ym9hcmQgbWVzc2FnZXMgKi87CisJCX0KKwkJcmV0dXJuKDApOworCisjaWYgZGVmaW5lZChTQ19TQ1JFRU5TQVZFKSB8fCBkZWZpbmVkKFNDX01PTklUT1JQT1dFUikKKwkJLyogRG9uJ3QgYWxsb3cgc2NyZWVuIHNhdmVycyBvciBtb25pdG9yIHBvd2VyIGRvd25zLgorCQkgICBUaGlzIGlzIGJlY2F1c2UgdGhleSBxdWlldGx5IGNsZWFyIERpcmVjdFggc3VyZmFjZXMuCisJCSAgIEl0IHdvdWxkIGJlIGJldHRlciB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8KKwkJICAgZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGJsb3cgdGhlc2Ugb2ZmLCBidXQgdGhlCisJCSAgIHNlbWFudGljcyBvZiBTRExfUHJpdmF0ZVN5c1dNRXZlbnQoKSBkb24ndCBhbGxvdworCQkgICB0aGUgYXBwbGljYXRpb24gdGhhdCBjaG9pY2UuCisJCSAqLworCQljYXNlIFdNX1NZU0NPTU1BTkQ6IHsKKwkJCWlmICgod1BhcmFtJjB4RkZGMCk9PVNDX1NDUkVFTlNBVkUgfHwgCisJCQkgICAgKHdQYXJhbSYweEZGRjApPT1TQ19NT05JVE9SUE9XRVIpCisJCQkJcmV0dXJuKDApOworCQl9CisJCS8qIEZhbGwgdGhyb3VnaCB0byBkZWZhdWx0IHByb2Nlc3NpbmcgKi8KKworI2VuZGlmIC8qIFNDX1NDUkVFTlNBVkUgfHwgU0NfTU9OSVRPUlBPV0VSICovCisKKwkJZGVmYXVsdDogeworCQkJLyogT25seSBwb3N0IHRoZSBldmVudCBpZiB3ZSdyZSB3YXRjaGluZyBmb3IgaXQgKi8KKwkJCWlmICggU0RMX1Byb2Nlc3NFdmVudHNbU0RMX1NZU1dNRVZFTlRdID09IFNETF9FTkFCTEUgKSB7CisJCQkgICAgICAgIFNETF9TeXNXTW1zZyB3bW1zZzsKKworCQkJCVNETF9WRVJTSU9OKCZ3bW1zZy52ZXJzaW9uKTsKKwkJCQl3bW1zZy5od25kID0gaHduZDsKKwkJCQl3bW1zZy5tc2cgPSBtc2c7CisJCQkJd21tc2cud1BhcmFtID0gd1BhcmFtOworCQkJCXdtbXNnLmxQYXJhbSA9IGxQYXJhbTsKKwkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZVN5c1dNRXZlbnQoJndtbXNnKTsKKworCQkJLyogREpNOiBJZiB0aGUgdXNlciBpc24ndCB3YXRjaGluZyBmb3IgcHJpdmF0ZQorCQkJCW1lc3NhZ2VzIGluIGhlciBTREwgZXZlbnQgbG9vcCwgdGhlbiBwYXNzIGl0CisJCQkJYWxvbmcgdG8gYW55IHdpbjMyIHNwZWNpZmljIHdpbmRvdyBwcm9jLgorCQkJICovCisJCQl9IGVsc2UgaWYgKHVzZXJXaW5kb3dQcm9jKSB7CisJCQkJcmV0dXJuIENhbGxXaW5kb3dQcm9jKHVzZXJXaW5kb3dQcm9jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuKERlZldpbmRvd1Byb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSkpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgd2luZG93cyBtZXNzYWdlIHF1ZXVlIGFuZCBEaXJlY3RJbnB1dCBhbmQgcmV0dXJucworICAgMSBpZiB0aGVyZSB3YXMgaW5wdXQsIDAgaWYgdGhlcmUgd2FzIG5vIGlucHV0LCBvciAtMSBpZiB0aGUgYXBwbGljYXRpb24gaGFzCisgICBwb3N0ZWQgYSBxdWl0IG1lc3NhZ2UuCisqLworc3RhdGljIGludCBEWDVfQ2hlY2tJbnB1dChfVEhJUywgaW50IHRpbWVvdXQsIEJPT0wgcHJvY2Vzc0lucHV0KQoreworCU1TRyBtc2c7CisJaW50ICAgICAgaTsKKwlIUkVTVUxUICByZXN1bHQ7CisJRFdPUkQgICAgZXZlbnQ7CisKKwkvKiBDaGVjayB0aGUgbm9ybWFsIHdpbmRvd3MgcXVldWUgKGhpZ2hlc3QgcHJlZmVyZW5jZSkgKi8KKwlwb3N0ZWQgPSAwOworCXdoaWxlICggISBwb3N0ZWQgJiYKKwkgICAgICAgIFBlZWtNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDAsIFBNX05PUkVNT1ZFKSApIHsKKwkJaWYgKCBHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApID4gMCApIHsKKwkJCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisJaWYgKCBwb3N0ZWQgKSB7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBQdW1wIHRoZSBEaXJlY3RJbnB1dCBmbG93ICovCisJaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBNT1VTRUZPQ1VTICkgeworCQlmb3IgKCBpPTA7IGk8TUFYX0lOUFVUUzsgKytpICkgeworCQkJaWYgKCBTRExfRElkZXZbaV0gIT0gTlVMTCApIHsKKwkJCQlyZXN1bHQgPSBJRGlyZWN0SW5wdXREZXZpY2UyX1BvbGwoU0RMX0RJZGV2W2ldKTsKKwkJCQlpZiAoIChyZXN1bHQgPT0gRElFUlJfSU5QVVRMT1NUKSB8fAorCQkJCQkJKHJlc3VsdCA9PSBESUVSUl9OT1RBQ1FVSVJFRCkgKSB7CisJCQkJCWlmICggU0RMX3N0cmNtcChpbnB1dHNbaV0ubmFtZSwgIm1vdXNlIikgPT0gMCApIHsKKwkJCQkJCW1vdXNlX2xvc3QgPSAxOworCQkJCQl9CisJCQkJCUlEaXJlY3RJbnB1dERldmljZTJfQWNxdWlyZShTRExfRElkZXZbaV0pOworCQkJCQlJRGlyZWN0SW5wdXREZXZpY2UyX1BvbGwoU0RMX0RJZGV2W2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBXYWl0IGZvciBtZXNzYWdlcyBhbmQgaW5wdXQgZXZlbnRzICovCisJZXZlbnQgPSBNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKFNETF9ESW5kZXYsIFNETF9ESWV2dCwgRkFMU0UsCisJCQkJCQkJdGltZW91dCwgUVNfQUxMRVZFTlRTKTsKKwlpZiAoKGV2ZW50ID49IFdBSVRfT0JKRUNUXzApICYmIChldmVudCA8IChXQUlUX09CSkVDVF8wK1NETF9ESW5kZXYpKSkgeworCQlEV09SRCBudW1ldmVudHM7CisJCXN0YXRpYyBESURFVklDRU9CSkVDVERBVEEgZXZ0YnVmW0lOUFVUX1FTSVpFXTsKKworCQlldmVudCAtPSBXQUlUX09CSkVDVF8wOworCQludW1ldmVudHMgPSBJTlBVVF9RU0laRTsKKwkJcmVzdWx0ID0gSURpcmVjdElucHV0RGV2aWNlMl9HZXREZXZpY2VEYXRhKAorCQkJCVNETF9ESWRldltldmVudF0sIHNpemVvZihESURFVklDRU9CSkVDVERBVEEpLAorCQkJCQkJCWV2dGJ1ZiwgJm51bWV2ZW50cywgMCk7CisJCWlmICggKHJlc3VsdCA9PSBESUVSUl9JTlBVVExPU1QpIHx8CisJCQkJCShyZXN1bHQgPT0gRElFUlJfTk9UQUNRVUlSRUQpICkgeworCQkJaWYgKCBTRExfc3RyY21wKGlucHV0c1tldmVudF0ubmFtZSwgIm1vdXNlIikgPT0gMCApIHsKKwkJCQltb3VzZV9sb3N0ID0gMTsKKwkJCX0KKwkJCUlEaXJlY3RJbnB1dERldmljZTJfQWNxdWlyZShTRExfRElkZXZbZXZlbnRdKTsKKwkJCXJlc3VsdCA9IElEaXJlY3RJbnB1dERldmljZTJfR2V0RGV2aWNlRGF0YSgKKwkJCQlTRExfRElkZXZbZXZlbnRdLCBzaXplb2YoRElERVZJQ0VPQkpFQ1REQVRBKSwKKwkJCQkJCQlldnRidWYsICZudW1ldmVudHMsIDApOworCQl9CisJCS8qIEhhbmRsZSB0aGUgZXZlbnRzICovCisJCWlmICggcmVzdWx0ID09IERJX09LICYmIHByb2Nlc3NJbnB1dCApIHsKKwkJCS8qIE5vdGU6IFRoaXMgY2FuIHBvc3QgbXVsdGlwbGUgZXZlbnRzIHRvIGV2ZW50IHF1ZXVlCisJCQkgKi8KKwkJCSgqU0RMX0RJZnVuW2V2ZW50XSkoKGludCludW1ldmVudHMsIGV2dGJ1Zik7CisJCQlyZXR1cm4oMSk7CisJCX0KKwl9CisJaWYgKCBldmVudCAhPSBXQUlUX1RJTUVPVVQgKSB7CisJCS8qIE1heWJlIHRoZXJlIHdhcyBhIHdpbmRvd3MgbWVzc2FnZT8gKi8KKwkJaWYgKCBQZWVrTWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwLCBQTV9OT1JFTU9WRSkgKSB7CisJCQlpZiAoIEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkgPiAwICkgeworCQkJCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJCXJldHVybigxKTsKKwkJfQorCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qIENoYW5nZSBjb29wZXJhdGl2ZSBsZXZlbCBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgZnVsbHNjcmVlbiAqLwordm9pZCBEWDVfRElucHV0UmVzZXQoX1RISVMsIGludCBmdWxsc2NyZWVuKQoreworCURXT1JEIGxldmVsOworCWludCBpOworCUhSRVNVTFQgcmVzdWx0OworCUhXTkQgdG9wd25kOworCisJZm9yICggaT0wOyBpPE1BWF9JTlBVVFM7ICsraSApIHsKKwkJaWYgKCBTRExfRElkZXZbaV0gIT0gTlVMTCApIHsKKwkJCWlmICggZnVsbHNjcmVlbiApIHsKKwkJCQlsZXZlbCA9IGlucHV0c1tpXS5yYXdfbGV2ZWw7CisJCQl9IGVsc2UgeworCQkJCWxldmVsID0gaW5wdXRzW2ldLndpbl9sZXZlbDsKKwkJCX0KKwkJCUlEaXJlY3RJbnB1dERldmljZTJfVW5hY3F1aXJlKFNETF9ESWRldltpXSk7CisJCQl0b3B3bmQgPSBHZXRUb3BMZXZlbFBhcmVudChTRExfV2luZG93KTsKKwkJCXJlc3VsdCA9IElEaXJlY3RJbnB1dERldmljZTJfU2V0Q29vcGVyYXRpdmVMZXZlbCgKKwkJCQkJU0RMX0RJZGV2W2ldLCB0b3B3bmQsIGxldmVsKTsKKwkJCUlEaXJlY3RJbnB1dERldmljZTJfQWNxdWlyZShTRExfRElkZXZbaV0pOworCQkJaWYgKCByZXN1bHQgIT0gRElfT0sgKSB7CisJCQkJU2V0REllcnJvcigKKwkJCSJEaXJlY3RJbnB1dERldmljZTo6U2V0Q29vcGVyYXRpdmVMZXZlbCIsIHJlc3VsdCk7CisJCQl9CisJCX0KKwl9CisJbW91c2VfbG9zdCA9IDE7CisKKwkvKiBGbHVzaCBwZW5kaW5nIGlucHV0ICovCisJRFg1X0NoZWNrSW5wdXQodGhpcywgMCwgRkFMU0UpOworfQorCit2b2lkIERYNV9QdW1wRXZlbnRzKF9USElTKQoreworCS8qIFdhaXQgZm9yIG1lc3NhZ2VzIGFuZCBEaXJlY3RJbnB1dCAqLworCXdoaWxlICggRFg1X0NoZWNrSW5wdXQodGhpcywgMCwgVFJVRSkgPiAwICkgeworCQkvKiBMb29wIGFuZCBjaGVjayBhZ2FpbiAqLzsKKwl9Cit9CisKK3ZvaWQgRFg1X0luaXRPU0tleW1hcChfVEhJUykKK3sKKyNpZm5kZWYgRElLX1BBVVNFCisjZGVmaW5lIERJS19QQVVTRQkweEM1CisjZW5kaWYKKyNpZm5kZWYgRElLX09FTV8xMDIKKyNkZWZpbmUgRElLX09FTV8xMDIJMHg1NgkvKiA8ID4gfCBvbiBVSy9HZXJtYW55IGtleWJvYXJkcyAqLworI2VuZGlmCisJaW50IGk7CisKKwkvKiBNYXAgdGhlIERJSyBzY2FuY29kZXMgdG8gU0RMIGtleXN5bXMgKi8KKwlmb3IgKCBpPTA7IGk8U0RMX2FycmF5c2l6ZShESUtfa2V5bWFwKTsgKytpICkKKwkJRElLX2tleW1hcFtpXSA9IDA7CisKKwkvKiBEZWZpbmVkIERJS18qIGNvbnN0YW50cyAqLworCURJS19rZXltYXBbRElLX0VTQ0FQRV0gPSBTRExLX0VTQ0FQRTsKKwlESUtfa2V5bWFwW0RJS18xXSA9IFNETEtfMTsKKwlESUtfa2V5bWFwW0RJS18yXSA9IFNETEtfMjsKKwlESUtfa2V5bWFwW0RJS18zXSA9IFNETEtfMzsKKwlESUtfa2V5bWFwW0RJS180XSA9IFNETEtfNDsKKwlESUtfa2V5bWFwW0RJS181XSA9IFNETEtfNTsKKwlESUtfa2V5bWFwW0RJS182XSA9IFNETEtfNjsKKwlESUtfa2V5bWFwW0RJS183XSA9IFNETEtfNzsKKwlESUtfa2V5bWFwW0RJS184XSA9IFNETEtfODsKKwlESUtfa2V5bWFwW0RJS185XSA9IFNETEtfOTsKKwlESUtfa2V5bWFwW0RJS18wXSA9IFNETEtfMDsKKwlESUtfa2V5bWFwW0RJS19NSU5VU10gPSBTRExLX01JTlVTOworCURJS19rZXltYXBbRElLX0VRVUFMU10gPSBTRExLX0VRVUFMUzsKKwlESUtfa2V5bWFwW0RJS19CQUNLXSA9IFNETEtfQkFDS1NQQUNFOworCURJS19rZXltYXBbRElLX1RBQl0gPSBTRExLX1RBQjsKKwlESUtfa2V5bWFwW0RJS19RXSA9IFNETEtfcTsKKwlESUtfa2V5bWFwW0RJS19XXSA9IFNETEtfdzsKKwlESUtfa2V5bWFwW0RJS19FXSA9IFNETEtfZTsKKwlESUtfa2V5bWFwW0RJS19SXSA9IFNETEtfcjsKKwlESUtfa2V5bWFwW0RJS19UXSA9IFNETEtfdDsKKwlESUtfa2V5bWFwW0RJS19ZXSA9IFNETEtfeTsKKwlESUtfa2V5bWFwW0RJS19VXSA9IFNETEtfdTsKKwlESUtfa2V5bWFwW0RJS19JXSA9IFNETEtfaTsKKwlESUtfa2V5bWFwW0RJS19PXSA9IFNETEtfbzsKKwlESUtfa2V5bWFwW0RJS19QXSA9IFNETEtfcDsKKwlESUtfa2V5bWFwW0RJS19MQlJBQ0tFVF0gPSBTRExLX0xFRlRCUkFDS0VUOworCURJS19rZXltYXBbRElLX1JCUkFDS0VUXSA9IFNETEtfUklHSFRCUkFDS0VUOworCURJS19rZXltYXBbRElLX1JFVFVSTl0gPSBTRExLX1JFVFVSTjsKKwlESUtfa2V5bWFwW0RJS19MQ09OVFJPTF0gPSBTRExLX0xDVFJMOworCURJS19rZXltYXBbRElLX0FdID0gU0RMS19hOworCURJS19rZXltYXBbRElLX1NdID0gU0RMS19zOworCURJS19rZXltYXBbRElLX0RdID0gU0RMS19kOworCURJS19rZXltYXBbRElLX0ZdID0gU0RMS19mOworCURJS19rZXltYXBbRElLX0ddID0gU0RMS19nOworCURJS19rZXltYXBbRElLX0hdID0gU0RMS19oOworCURJS19rZXltYXBbRElLX0pdID0gU0RMS19qOworCURJS19rZXltYXBbRElLX0tdID0gU0RMS19rOworCURJS19rZXltYXBbRElLX0xdID0gU0RMS19sOworCURJS19rZXltYXBbRElLX1NFTUlDT0xPTl0gPSBTRExLX1NFTUlDT0xPTjsKKwlESUtfa2V5bWFwW0RJS19BUE9TVFJPUEhFXSA9IFNETEtfUVVPVEU7CisJRElLX2tleW1hcFtESUtfR1JBVkVdID0gU0RMS19CQUNLUVVPVEU7CisJRElLX2tleW1hcFtESUtfTFNISUZUXSA9IFNETEtfTFNISUZUOworCURJS19rZXltYXBbRElLX0JBQ0tTTEFTSF0gPSBTRExLX0JBQ0tTTEFTSDsKKwlESUtfa2V5bWFwW0RJS19PRU1fMTAyXSA9IFNETEtfTEVTUzsKKwlESUtfa2V5bWFwW0RJS19aXSA9IFNETEtfejsKKwlESUtfa2V5bWFwW0RJS19YXSA9IFNETEtfeDsKKwlESUtfa2V5bWFwW0RJS19DXSA9IFNETEtfYzsKKwlESUtfa2V5bWFwW0RJS19WXSA9IFNETEtfdjsKKwlESUtfa2V5bWFwW0RJS19CXSA9IFNETEtfYjsKKwlESUtfa2V5bWFwW0RJS19OXSA9IFNETEtfbjsKKwlESUtfa2V5bWFwW0RJS19NXSA9IFNETEtfbTsKKwlESUtfa2V5bWFwW0RJS19DT01NQV0gPSBTRExLX0NPTU1BOworCURJS19rZXltYXBbRElLX1BFUklPRF0gPSBTRExLX1BFUklPRDsKKwlESUtfa2V5bWFwW0RJS19TTEFTSF0gPSBTRExLX1NMQVNIOworCURJS19rZXltYXBbRElLX1JTSElGVF0gPSBTRExLX1JTSElGVDsKKwlESUtfa2V5bWFwW0RJS19NVUxUSVBMWV0gPSBTRExLX0tQX01VTFRJUExZOworCURJS19rZXltYXBbRElLX0xNRU5VXSA9IFNETEtfTEFMVDsKKwlESUtfa2V5bWFwW0RJS19TUEFDRV0gPSBTRExLX1NQQUNFOworCURJS19rZXltYXBbRElLX0NBUElUQUxdID0gU0RMS19DQVBTTE9DSzsKKwlESUtfa2V5bWFwW0RJS19GMV0gPSBTRExLX0YxOworCURJS19rZXltYXBbRElLX0YyXSA9IFNETEtfRjI7CisJRElLX2tleW1hcFtESUtfRjNdID0gU0RMS19GMzsKKwlESUtfa2V5bWFwW0RJS19GNF0gPSBTRExLX0Y0OworCURJS19rZXltYXBbRElLX0Y1XSA9IFNETEtfRjU7CisJRElLX2tleW1hcFtESUtfRjZdID0gU0RMS19GNjsKKwlESUtfa2V5bWFwW0RJS19GN10gPSBTRExLX0Y3OworCURJS19rZXltYXBbRElLX0Y4XSA9IFNETEtfRjg7CisJRElLX2tleW1hcFtESUtfRjldID0gU0RMS19GOTsKKwlESUtfa2V5bWFwW0RJS19GMTBdID0gU0RMS19GMTA7CisJRElLX2tleW1hcFtESUtfTlVNTE9DS10gPSBTRExLX05VTUxPQ0s7CisJRElLX2tleW1hcFtESUtfU0NST0xMXSA9IFNETEtfU0NST0xMT0NLOworCURJS19rZXltYXBbRElLX05VTVBBRDddID0gU0RMS19LUDc7CisJRElLX2tleW1hcFtESUtfTlVNUEFEOF0gPSBTRExLX0tQODsKKwlESUtfa2V5bWFwW0RJS19OVU1QQUQ5XSA9IFNETEtfS1A5OworCURJS19rZXltYXBbRElLX1NVQlRSQUNUXSA9IFNETEtfS1BfTUlOVVM7CisJRElLX2tleW1hcFtESUtfTlVNUEFENF0gPSBTRExLX0tQNDsKKwlESUtfa2V5bWFwW0RJS19OVU1QQUQ1XSA9IFNETEtfS1A1OworCURJS19rZXltYXBbRElLX05VTVBBRDZdID0gU0RMS19LUDY7CisJRElLX2tleW1hcFtESUtfQUREXSA9IFNETEtfS1BfUExVUzsKKwlESUtfa2V5bWFwW0RJS19OVU1QQUQxXSA9IFNETEtfS1AxOworCURJS19rZXltYXBbRElLX05VTVBBRDJdID0gU0RMS19LUDI7CisJRElLX2tleW1hcFtESUtfTlVNUEFEM10gPSBTRExLX0tQMzsKKwlESUtfa2V5bWFwW0RJS19OVU1QQUQwXSA9IFNETEtfS1AwOworCURJS19rZXltYXBbRElLX0RFQ0lNQUxdID0gU0RMS19LUF9QRVJJT0Q7CisJRElLX2tleW1hcFtESUtfRjExXSA9IFNETEtfRjExOworCURJS19rZXltYXBbRElLX0YxMl0gPSBTRExLX0YxMjsKKworCURJS19rZXltYXBbRElLX0YxM10gPSBTRExLX0YxMzsKKwlESUtfa2V5bWFwW0RJS19GMTRdID0gU0RMS19GMTQ7CisJRElLX2tleW1hcFtESUtfRjE1XSA9IFNETEtfRjE1OworCisJRElLX2tleW1hcFtESUtfTlVNUEFERVFVQUxTXSA9IFNETEtfS1BfRVFVQUxTOworCURJS19rZXltYXBbRElLX05VTVBBREVOVEVSXSA9IFNETEtfS1BfRU5URVI7CisJRElLX2tleW1hcFtESUtfUkNPTlRST0xdID0gU0RMS19SQ1RSTDsKKwlESUtfa2V5bWFwW0RJS19ESVZJREVdID0gU0RMS19LUF9ESVZJREU7CisJRElLX2tleW1hcFtESUtfU1lTUlFdID0gU0RMS19QUklOVDsKKwlESUtfa2V5bWFwW0RJS19STUVOVV0gPSBTRExLX1JBTFQ7CisJRElLX2tleW1hcFtESUtfUEFVU0VdID0gU0RMS19QQVVTRTsKKwlESUtfa2V5bWFwW0RJS19IT01FXSA9IFNETEtfSE9NRTsKKwlESUtfa2V5bWFwW0RJS19VUF0gPSBTRExLX1VQOworCURJS19rZXltYXBbRElLX1BSSU9SXSA9IFNETEtfUEFHRVVQOworCURJS19rZXltYXBbRElLX0xFRlRdID0gU0RMS19MRUZUOworCURJS19rZXltYXBbRElLX1JJR0hUXSA9IFNETEtfUklHSFQ7CisJRElLX2tleW1hcFtESUtfRU5EXSA9IFNETEtfRU5EOworCURJS19rZXltYXBbRElLX0RPV05dID0gU0RMS19ET1dOOworCURJS19rZXltYXBbRElLX05FWFRdID0gU0RMS19QQUdFRE9XTjsKKwlESUtfa2V5bWFwW0RJS19JTlNFUlRdID0gU0RMS19JTlNFUlQ7CisJRElLX2tleW1hcFtESUtfREVMRVRFXSA9IFNETEtfREVMRVRFOworCURJS19rZXltYXBbRElLX0xXSU5dID0gU0RMS19MTUVUQTsKKwlESUtfa2V5bWFwW0RJS19SV0lOXSA9IFNETEtfUk1FVEE7CisJRElLX2tleW1hcFtESUtfQVBQU10gPSBTRExLX01FTlU7Cit9CisKK3N0YXRpYyBTRExfa2V5c3ltICpUcmFuc2xhdGVLZXkoVUlOVCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltLCBpbnQgcHJlc3NlZCkKK3sKKwkvKiBTZXQgdGhlIGtleXN5bSBpbmZvcm1hdGlvbiAqLworCWtleXN5bS0+c2NhbmNvZGUgPSAodW5zaWduZWQgY2hhcilzY2FuY29kZTsKKwlrZXlzeW0tPnN5bSA9IERJS19rZXltYXBbc2NhbmNvZGVdOworCWtleXN5bS0+bW9kID0gS01PRF9OT05FOworCWtleXN5bS0+dW5pY29kZSA9IDA7CisJaWYgKCBwcmVzc2VkICYmIFNETF9UcmFuc2xhdGVVTklDT0RFICkgeworCQlVSU5UIHZrZXk7CisjaWZuZGVmIE5PX0dFVEtFWUJPQVJEU1RBVEUKKwkJQllURQlrZXlzdGF0ZVsyNTZdOworCQlVaW50MTYJd2NoYXJzWzJdOworI2VuZGlmCisKKwkJdmtleSA9IE1hcFZpcnR1YWxLZXkoc2NhbmNvZGUsIDEpOworI2lmZGVmIE5PX0dFVEtFWUJPQVJEU1RBVEUKKwkJLyogVWggb2gsIGJldHRlciBob3BlIHRoZSB2a2V5IGlzIGNsb3NlIGVub3VnaC4uICovCisJCWtleXN5bS0+dW5pY29kZSA9IHZrZXk7CisjZWxzZQorCQlHZXRLZXlib2FyZFN0YXRlKGtleXN0YXRlKTsKKwkJLyogTnVtbG9jayBpc24ndCB0YWtlbiBpbnRvIGFjY291bnQgaW4gVG9Vbmljb2RlLAorCQkgKiBzbyB3ZSBoYW5kbGUgaXQgYXMgYSBzcGVjaWFsIGNhc2UgaGVyZSAqLworCQlpZiAoKGtleXN0YXRlW1ZLX05VTUxPQ0tdICYgMSkgJiYgdmtleSA+PSBWS19OVU1QQUQwICYmIHZrZXkgPD0gVktfTlVNUEFEOSkKKwkJeworCQkJa2V5c3ltLT51bmljb2RlID0gdmtleSAtIFZLX05VTVBBRDAgKyAnMCc7CisJCX0KKwkJZWxzZSBpZiAoU0RMX1RvVW5pY29kZSh2a2V5LCBzY2FuY29kZSwga2V5c3RhdGUsIHdjaGFycywgc2l6ZW9mKHdjaGFycykvc2l6ZW9mKHdjaGFyc1swXSksIDApID4gMCkKKwkJeworCQkJa2V5c3ltLT51bmljb2RlID0gd2NoYXJzWzBdOworCQl9CisjZW5kaWYgLyogTk9fR0VUS0VZQk9BUkRTVEFURSAqLworCX0KKwlyZXR1cm4oa2V5c3ltKTsKK30KKworaW50IERYNV9DcmVhdGVXaW5kb3coX1RISVMpCit7CisJY2hhciAqd2luZG93aWQgPSBTRExfZ2V0ZW52KCJTRExfV0lORE9XSUQiKTsKKwlpbnQgaTsKKworCS8qIENsZWFyIG91dCBEaXJlY3RJbnB1dCB2YXJpYWJsZXMgaW4gY2FzZSB3ZSBmYWlsICovCisJZm9yICggaT0wOyBpPE1BWF9JTlBVVFM7ICsraSApIHsKKwkJU0RMX0RJZGV2W2ldID0gTlVMTDsKKwkJU0RMX0RJZXZ0W2ldID0gTlVMTDsKKwkJU0RMX0RJZnVuW2ldID0gTlVMTDsKKwl9CisKKwlTRExfUmVnaXN0ZXJBcHAoTlVMTCwgMCwgMCk7CisKKwlTRExfd2luZG93aWQgPSAod2luZG93aWQgIT0gTlVMTCk7CisJaWYgKCBTRExfd2luZG93aWQgKSB7CisJCVNETF9XaW5kb3cgPSAoSFdORCkoKHNpemVfdClTRExfc3RydG91bGwod2luZG93aWQsIE5VTEwsIDApKTsKKwkJaWYgKCBTRExfV2luZG93ID09IE5VTEwgKSB7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGdldCB1c2VyIHNwZWNpZmllZCB3aW5kb3ciKTsKKwkJCXJldHVybigtMSk7CisJCX0KKworCQkvKiBESk06IHdlIHdhbnQgYWxsIGV2ZW50J3MgZm9yIHRoZSB1c2VyIHNwZWNpZmllZAorCQkJd2luZG93IHRvIGJlIGhhbmRsZWQgYnkgU0RMLgorCQkgKi8KKwkJdXNlcldpbmRvd1Byb2MgPSAoV05EUFJPQ1RZUEUpR2V0V2luZG93TG9uZ1B0cihTRExfV2luZG93LCBHV0xQX1dORFBST0MpOworCQlTZXRXaW5kb3dMb25nUHRyKFNETF9XaW5kb3csIEdXTFBfV05EUFJPQywgKExPTkdfUFRSKVdpbk1lc3NhZ2UpOworCX0gZWxzZSB7CisJCVNETF9XaW5kb3cgPSBDcmVhdGVXaW5kb3coU0RMX0FwcG5hbWUsIFNETF9BcHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgKFdTX09WRVJMQVBQRUR8V1NfQ0FQVElPTnxXU19TWVNNRU5VfFdTX01JTklNSVpFQk9YKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIDAsIDAsIE5VTEwsIE5VTEwsIFNETF9JbnN0YW5jZSwgTlVMTCk7CisJCWlmICggU0RMX1dpbmRvdyA9PSBOVUxMICkgeworCQkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgd2luZG93Iik7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCVNob3dXaW5kb3coU0RMX1dpbmRvdywgU1dfSElERSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSBEaXJlY3RJbnB1dCAqLworCWlmICggRFg1X0RJbnB1dEluaXQodGhpcykgPCAwICkgeworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIEpDIDE0IE1hciAyMDA2CisJCUZsdXNoIHRoZSBtZXNzYWdlIGxvb3Agb3IgdGhpcyBjYW4gY2F1c2UgYmlnIHByb2JsZW1zIGxhdGVyCisJCUVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgZGVjaWRlcyB0byB1c2UgZGlhbG9nIGJveGVzIG9yIGFzc2VydCgpIQorCSovCisJV0lOX0ZsdXNoTWVzc2FnZVF1ZXVlKCk7CisKKwkvKiBSZWFkeSB0byByb2xsICovCisJcmV0dXJuKDApOworfQorCit2b2lkIERYNV9EZXN0cm95V2luZG93KF9USElTKQoreworCS8qIENsb3NlIGRvd24gRGlyZWN0SW5wdXQgKi8KKwlEWDVfRElucHV0UXVpdCh0aGlzKTsKKworCS8qIERlc3Ryb3kgb3VyIHdpbmRvdyAqLworCWlmICggU0RMX3dpbmRvd2lkICkgeworCQlTZXRXaW5kb3dMb25nUHRyKFNETF9XaW5kb3csIEdXTFBfV05EUFJPQywgKExPTkdfUFRSKXVzZXJXaW5kb3dQcm9jKTsKKwl9IGVsc2UgeworCQlEZXN0cm95V2luZG93KFNETF9XaW5kb3cpOworCX0KKwlTRExfVW5yZWdpc3RlckFwcCgpOworCisJLyogSkMgMTQgTWFyIDIwMDYKKwkJRmx1c2ggdGhlIG1lc3NhZ2UgbG9vcCBvciB0aGlzIGNhbiBjYXVzZSBiaWcgcHJvYmxlbXMgbGF0ZXIKKwkJRXNwZWNpYWxseSBpZiB0aGUgdXNlciBkZWNpZGVzIHRvIHVzZSBkaWFsb2cgYm94ZXMgb3IgYXNzZXJ0KCkhCisJKi8KKwlXSU5fRmx1c2hNZXNzYWdlUXVldWUoKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDVldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5keDUvU0RMX2R4NWV2ZW50c19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlMWI2YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDVldmVudHNfYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9sb3d2aWRlby5oIgorCisvKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBTRExfZHg1ZXZlbnRzLmMgdG8gb3RoZXIgcGFydHMgCisgICBvZiB0aGUgbmF0aXZlIHZpZGVvIHN1YnN5c3RlbSAoU0RMX2R4NXZpZGVvLmMpCisqLworZXh0ZXJuIExPTkcKKyBEWDVfSGFuZGxlTWVzc2FnZShfVEhJUywgSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitleHRlcm4gaW50IERYNV9DcmVhdGVXaW5kb3coX1RISVMpOworZXh0ZXJuIHZvaWQgRFg1X0Rlc3Ryb3lXaW5kb3coX1RISVMpOworCitleHRlcm4gdm9pZCBEWDVfUHVtcEV2ZW50cyhfVEhJUyk7CitleHRlcm4gdm9pZCBEWDVfSW5pdE9TS2V5bWFwKF9USElTKTsKK2V4dGVybiB2b2lkIERYNV9ESW5wdXRSZXNldChfVEhJUywgaW50IGZ1bGxzY3JlZW4pOworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmR4NS9TRExfZHg1dmlkZW8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDV2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MGNhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmR4NS9TRExfZHg1dmlkZW8uYwpAQCAtMCwwICsxLDI1MzcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiZGlyZWN0eC5oIgorCisvKiBOb3QgeWV0IGluIHRoZSBtaW5ndzMyIGNyb3NzLWNvbXBpbGUgaGVhZGVycyAqLworI2lmbmRlZiBDRFNfRlVMTFNDUkVFTgorI2RlZmluZSBDRFNfRlVMTFNDUkVFTgk0CisjZW5kaWYKKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9ldmVudHMuaCIKKyNpbmNsdWRlICJTRExfc3lzd20uaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfYmxpdC5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIlNETF9keDV2aWRlby5oIgorI2luY2x1ZGUgIi4uL3dpbmNvbW1vbi9TRExfc3lzd21fYy5oIgorI2luY2x1ZGUgIi4uL3dpbmNvbW1vbi9TRExfc3lzbW91c2VfYy5oIgorI2luY2x1ZGUgIlNETF9keDVldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF9keDV5dXZfYy5oIgorI2luY2x1ZGUgIi4uL3dpbmNvbW1vbi9TRExfd2luZ2xfYy5oIgorCisjaWZkZWYgX1dJTjMyX1dDRQorI2RlZmluZSBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKKyNlbmRpZgorI2lmbmRlZiBXU19NQVhJTUlaRQorI2RlZmluZSBXU19NQVhJTUlaRQkJMAorI2VuZGlmCisjaWZuZGVmIFNXUF9OT0NPUFlCSVRTCisjZGVmaW5lIFNXUF9OT0NPUFlCSVRTCTAKKyNlbmRpZgorI2lmbmRlZiBQQ19OT0NPTExBUFNFCisjZGVmaW5lIFBDX05PQ09MTEFQU0UJMAorI2VuZGlmCisKKworLyogRGlyZWN0WCBmdW5jdGlvbiBwb2ludGVycyBmb3IgdmlkZW8gYW5kIGV2ZW50cyAqLworSFJFU1VMVCAoV0lOQVBJICpERHJhd0NyZWF0ZSkoIEdVSUQgRkFSICpscEdVSUQsIExQRElSRUNURFJBVyBGQVIgKmxwbHBERCwgSVVua25vd24gRkFSICpwVW5rT3V0ZXIgKTsKK0hSRVNVTFQgKFdJTkFQSSAqRElucHV0Q3JlYXRlKShISU5TVEFOQ0UgaGluc3QsIERXT1JEIGR3VmVyc2lvbiwgTFBESVJFQ1RJTlBVVCAqcHBESSwgTFBVTktOT1dOIHB1bmtPdXRlcik7CisKKy8qIFRoaXMgaXMgdGhlIHJlY3QgRW51bU1vZGVzMiB1c2VzICovCitzdHJ1Y3QgRFg1RW51bVJlY3QgeworCVNETF9SZWN0IHI7CisJaW50IHJlZnJlc2hSYXRlOworCXN0cnVjdCBEWDVFbnVtUmVjdCogbmV4dDsKK307CitzdGF0aWMgc3RydWN0IERYNUVudW1SZWN0ICplbnVtbGlzdHNbTlVNX01PREVMSVNUU107CisKKy8qCisgKiBFeHBlcmltZW50YWxseSBkZXRlcm1pbmVkIHZhbHVlcyBmb3IgY19jZkRJKiBjb25zdGFudHMgdXNlZCBpbiBEaXJlY3RYIDUuMAorICovCisKKy8qIEtleWJvYXJkICovCisKK3N0YXRpYyBESU9CSkVDVERBVEFGT1JNQVQgS0JEX2ZtdFtdID0geworCXsgJkdVSURfS2V5LCAwLCAweDgwMDAwMDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEsIDB4ODAwMDAxMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMiwgMHg4MDAwMDIwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAzLCAweDgwMDAwMzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQsIDB4ODAwMDA0MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgNSwgMHg4MDAwMDUwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCA2LCAweDgwMDAwNjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDcsIDB4ODAwMDA3MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgOCwgMHg4MDAwMDgwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCA5LCAweDgwMDAwOTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEwLCAweDgwMDAwQTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDExLCAweDgwMDAwQjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEyLCAweDgwMDAwQzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEzLCAweDgwMDAwRDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE0LCAweDgwMDAwRTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE1LCAweDgwMDAwRjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE2LCAweDgwMDAxMDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE3LCAweDgwMDAxMTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE4LCAweDgwMDAxMjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE5LCAweDgwMDAxMzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIwLCAweDgwMDAxNDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIxLCAweDgwMDAxNTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIyLCAweDgwMDAxNjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIzLCAweDgwMDAxNzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI0LCAweDgwMDAxODBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI1LCAweDgwMDAxOTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI2LCAweDgwMDAxQTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI3LCAweDgwMDAxQjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI4LCAweDgwMDAxQzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI5LCAweDgwMDAxRDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDMwLCAweDgwMDAxRTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDMxLCAweDgwMDAxRjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDMyLCAweDgwMDAyMDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDMzLCAweDgwMDAyMTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDM0LCAweDgwMDAyMjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDM1LCAweDgwMDAyMzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDM2LCAweDgwMDAyNDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDM3LCAweDgwMDAyNTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDM4LCAweDgwMDAyNjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDM5LCAweDgwMDAyNzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQwLCAweDgwMDAyODBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQxLCAweDgwMDAyOTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQyLCAweDgwMDAyQTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQzLCAweDgwMDAyQjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQ0LCAweDgwMDAyQzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQ1LCAweDgwMDAyRDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQ2LCAweDgwMDAyRTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQ3LCAweDgwMDAyRjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQ4LCAweDgwMDAzMDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDQ5LCAweDgwMDAzMTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDUwLCAweDgwMDAzMjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDUxLCAweDgwMDAzMzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDUyLCAweDgwMDAzNDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDUzLCAweDgwMDAzNTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDU0LCAweDgwMDAzNjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDU1LCAweDgwMDAzNzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDU2LCAweDgwMDAzODBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDU3LCAweDgwMDAzOTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDU4LCAweDgwMDAzQTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDU5LCAweDgwMDAzQjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDYwLCAweDgwMDAzQzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDYxLCAweDgwMDAzRDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDYyLCAweDgwMDAzRTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDYzLCAweDgwMDAzRjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDY0LCAweDgwMDA0MDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDY1LCAweDgwMDA0MTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDY2LCAweDgwMDA0MjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDY3LCAweDgwMDA0MzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDY4LCAweDgwMDA0NDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDY5LCAweDgwMDA0NTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDcwLCAweDgwMDA0NjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDcxLCAweDgwMDA0NzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDcyLCAweDgwMDA0ODBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDczLCAweDgwMDA0OTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDc0LCAweDgwMDA0QTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDc1LCAweDgwMDA0QjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDc2LCAweDgwMDA0QzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDc3LCAweDgwMDA0RDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDc4LCAweDgwMDA0RTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDc5LCAweDgwMDA0RjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDgwLCAweDgwMDA1MDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDgxLCAweDgwMDA1MTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDgyLCAweDgwMDA1MjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDgzLCAweDgwMDA1MzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDg0LCAweDgwMDA1NDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDg1LCAweDgwMDA1NTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDg2LCAweDgwMDA1NjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDg3LCAweDgwMDA1NzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDg4LCAweDgwMDA1ODBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDg5LCAweDgwMDA1OTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDkwLCAweDgwMDA1QTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDkxLCAweDgwMDA1QjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDkyLCAweDgwMDA1QzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDkzLCAweDgwMDA1RDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDk0LCAweDgwMDA1RTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDk1LCAweDgwMDA1RjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDk2LCAweDgwMDA2MDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDk3LCAweDgwMDA2MTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDk4LCAweDgwMDA2MjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDk5LCAweDgwMDA2MzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEwMCwgMHg4MDAwNjQwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMDEsIDB4ODAwMDY1MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTAyLCAweDgwMDA2NjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEwMywgMHg4MDAwNjcwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMDQsIDB4ODAwMDY4MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTA1LCAweDgwMDA2OTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEwNiwgMHg4MDAwNkEwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMDcsIDB4ODAwMDZCMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTA4LCAweDgwMDA2QzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEwOSwgMHg4MDAwNkQwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMTAsIDB4ODAwMDZFMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTExLCAweDgwMDA2RjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDExMiwgMHg4MDAwNzAwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMTMsIDB4ODAwMDcxMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTE0LCAweDgwMDA3MjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDExNSwgMHg4MDAwNzMwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMTYsIDB4ODAwMDc0MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTE3LCAweDgwMDA3NTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDExOCwgMHg4MDAwNzYwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMTksIDB4ODAwMDc3MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTIwLCAweDgwMDA3ODBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEyMSwgMHg4MDAwNzkwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMjIsIDB4ODAwMDdBMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTIzLCAweDgwMDA3QjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEyNCwgMHg4MDAwN0MwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMjUsIDB4ODAwMDdEMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTI2LCAweDgwMDA3RTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEyNywgMHg4MDAwN0YwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMjgsIDB4ODAwMDgwMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTI5LCAweDgwMDA4MTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEzMCwgMHg4MDAwODIwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMzEsIDB4ODAwMDgzMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTMyLCAweDgwMDA4NDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEzMywgMHg4MDAwODUwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMzQsIDB4ODAwMDg2MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTM1LCAweDgwMDA4NzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEzNiwgMHg4MDAwODgwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxMzcsIDB4ODAwMDg5MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTM4LCAweDgwMDA4QTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDEzOSwgMHg4MDAwOEIwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNDAsIDB4ODAwMDhDMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTQxLCAweDgwMDA4RDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE0MiwgMHg4MDAwOEUwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNDMsIDB4ODAwMDhGMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTQ0LCAweDgwMDA5MDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE0NSwgMHg4MDAwOTEwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNDYsIDB4ODAwMDkyMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTQ3LCAweDgwMDA5MzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE0OCwgMHg4MDAwOTQwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNDksIDB4ODAwMDk1MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTUwLCAweDgwMDA5NjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE1MSwgMHg4MDAwOTcwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNTIsIDB4ODAwMDk4MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTUzLCAweDgwMDA5OTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE1NCwgMHg4MDAwOUEwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNTUsIDB4ODAwMDlCMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTU2LCAweDgwMDA5QzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE1NywgMHg4MDAwOUQwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNTgsIDB4ODAwMDlFMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTU5LCAweDgwMDA5RjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE2MCwgMHg4MDAwQTAwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNjEsIDB4ODAwMEExMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTYyLCAweDgwMDBBMjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE2MywgMHg4MDAwQTMwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNjQsIDB4ODAwMEE0MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTY1LCAweDgwMDBBNTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE2NiwgMHg4MDAwQTYwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNjcsIDB4ODAwMEE3MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTY4LCAweDgwMDBBODBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE2OSwgMHg4MDAwQTkwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNzAsIDB4ODAwMEFBMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTcxLCAweDgwMDBBQjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE3MiwgMHg4MDAwQUMwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNzMsIDB4ODAwMEFEMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTc0LCAweDgwMDBBRTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE3NSwgMHg4MDAwQUYwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNzYsIDB4ODAwMEIwMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTc3LCAweDgwMDBCMTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE3OCwgMHg4MDAwQjIwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxNzksIDB4ODAwMEIzMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTgwLCAweDgwMDBCNDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE4MSwgMHg4MDAwQjUwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxODIsIDB4ODAwMEI2MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTgzLCAweDgwMDBCNzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE4NCwgMHg4MDAwQjgwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxODUsIDB4ODAwMEI5MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTg2LCAweDgwMDBCQTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE4NywgMHg4MDAwQkIwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxODgsIDB4ODAwMEJDMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTg5LCAweDgwMDBCRDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE5MCwgMHg4MDAwQkUwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxOTEsIDB4ODAwMEJGMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTkyLCAweDgwMDBDMDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE5MywgMHg4MDAwQzEwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxOTQsIDB4ODAwMEMyMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTk1LCAweDgwMDBDMzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE5NiwgMHg4MDAwQzQwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAxOTcsIDB4ODAwMEM1MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMTk4LCAweDgwMDBDNjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDE5OSwgMHg4MDAwQzcwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMDAsIDB4ODAwMEM4MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjAxLCAweDgwMDBDOTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIwMiwgMHg4MDAwQ0EwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMDMsIDB4ODAwMENCMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjA0LCAweDgwMDBDQzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIwNSwgMHg4MDAwQ0QwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMDYsIDB4ODAwMENFMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjA3LCAweDgwMDBDRjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIwOCwgMHg4MDAwRDAwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMDksIDB4ODAwMEQxMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjEwLCAweDgwMDBEMjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIxMSwgMHg4MDAwRDMwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMTIsIDB4ODAwMEQ0MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjEzLCAweDgwMDBENTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIxNCwgMHg4MDAwRDYwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMTUsIDB4ODAwMEQ3MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjE2LCAweDgwMDBEODBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIxNywgMHg4MDAwRDkwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMTgsIDB4ODAwMERBMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjE5LCAweDgwMDBEQjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIyMCwgMHg4MDAwREMwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMjEsIDB4ODAwMEREMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjIyLCAweDgwMDBERTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIyMywgMHg4MDAwREYwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMjQsIDB4ODAwMEUwMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjI1LCAweDgwMDBFMTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIyNiwgMHg4MDAwRTIwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMjcsIDB4ODAwMEUzMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjI4LCAweDgwMDBFNDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIyOSwgMHg4MDAwRTUwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMzAsIDB4ODAwMEU2MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjMxLCAweDgwMDBFNzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIzMiwgMHg4MDAwRTgwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMzMsIDB4ODAwMEU5MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjM0LCAweDgwMDBFQTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIzNSwgMHg4MDAwRUIwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMzYsIDB4ODAwMEVDMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjM3LCAweDgwMDBFRDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDIzOCwgMHg4MDAwRUUwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyMzksIDB4ODAwMEVGMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjQwLCAweDgwMDBGMDBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI0MSwgMHg4MDAwRjEwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyNDIsIDB4ODAwMEYyMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjQzLCAweDgwMDBGMzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI0NCwgMHg4MDAwRjQwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyNDUsIDB4ODAwMEY1MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjQ2LCAweDgwMDBGNjBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI0NywgMHg4MDAwRjcwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyNDgsIDB4ODAwMEY4MEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjQ5LCAweDgwMDBGOTBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI1MCwgMHg4MDAwRkEwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyNTEsIDB4ODAwMEZCMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjUyLCAweDgwMDBGQzBDLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9LZXksIDI1MywgMHg4MDAwRkQwQywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfS2V5LCAyNTQsIDB4ODAwMEZFMEMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX0tleSwgMjU1LCAweDgwMDBGRjBDLCAweDAwMDAwMDAwIH0sCit9OworCitjb25zdCBESURBVEFGT1JNQVQgY19kZkRJS2V5Ym9hcmQgPSB7IHNpemVvZihESURBVEFGT1JNQVQpLCBzaXplb2YoRElPQkpFQ1REQVRBRk9STUFUKSwgMHgwMDAwMDAwMiwgMjU2LCAyNTYsIEtCRF9mbXQgfTsKKworCisvKiBNb3VzZSAqLworCitzdGF0aWMgRElPQkpFQ1REQVRBRk9STUFUIFBUUl9mbXRbXSA9IHsKKwl7ICZHVUlEX1hBeGlzLCAwLCAweDAwRkZGRjAzLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9ZQXhpcywgNCwgMHgwMEZGRkYwMywgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfWkF4aXMsIDgsIDB4ODBGRkZGMDMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsICAgICAgIDEyLCAweDAwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCAgICAgICAxMywgMHgwMEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgICAgICAgMTQsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsICAgICAgIDE1LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCit9OworCitjb25zdCBESURBVEFGT1JNQVQgY19kZkRJTW91c2UgPSB7IHNpemVvZihESURBVEFGT1JNQVQpLCBzaXplb2YoRElPQkpFQ1REQVRBRk9STUFUKSwgMHgwMDAwMDAwMiwgMTYsIDcsIFBUUl9mbXQgfTsKKworc3RhdGljIERJT0JKRUNUREFUQUZPUk1BVCBQVFIyX2ZtdFtdID0geworCXsgJkdVSURfWEF4aXMsIDAsIDB4MDBGRkZGMDMsIDB4MDAwMDAwMDAgfSwKKwl7ICZHVUlEX1lBeGlzLCA0LCAweDAwRkZGRjAzLCAweDAwMDAwMDAwIH0sCisJeyAmR1VJRF9aQXhpcywgOCwgMHg4MEZGRkYwMywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgICAgICAgMTIsIDB4MDBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsICAgICAgIDEzLCAweDAwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCAgICAgICAxNCwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgICAgICAgMTUsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsICAgICAgIDE2LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCAgICAgICAxNywgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgICAgICAgMTgsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsICAgICAgIDE5LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0KK307CisKK2NvbnN0IERJREFUQUZPUk1BVCBjX2RmRElNb3VzZTIgPSB7IHNpemVvZihESURBVEFGT1JNQVQpLCBzaXplb2YoRElPQkpFQ1REQVRBRk9STUFUKSwgMHgwMDAwMDAwMiwgMjAsIDExLCBQVFIyX2ZtdCB9OworCisKKy8qIEpveXN0aWNrICovCisKK3N0YXRpYyBESU9CSkVDVERBVEFGT1JNQVQgSk9ZX2ZtdFtdID0geworCXsgJkdVSURfWEF4aXMsIDAsIDB4ODBGRkZGMDMsIDB4MDAwMDAxMDAgfSwKKwl7ICZHVUlEX1lBeGlzLCA0LCAweDgwRkZGRjAzLCAweDAwMDAwMTAwIH0sCisJeyAmR1VJRF9aQXhpcywgOCwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAorCXsgJkdVSURfUnhBeGlzLCAxMiwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAorCXsgJkdVSURfUnlBeGlzLCAxNiwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAorCXsgJkdVSURfUnpBeGlzLCAyMCwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAorCXsgJkdVSURfU2xpZGVyLCAyNCwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAorCXsgJkdVSURfU2xpZGVyLCAyOCwgMHg4MEZGRkYwMywgMHgwMDAwMDEwMCB9LAorCXsgJkdVSURfUE9WLCAzMiwgMHg4MEZGRkYxMCwgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfUE9WLCAzNiwgMHg4MEZGRkYxMCwgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfUE9WLCA0MCwgMHg4MEZGRkYxMCwgMHgwMDAwMDAwMCB9LAorCXsgJkdVSURfUE9WLCA0NCwgMHg4MEZGRkYxMCwgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNDgsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDQ5LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA1MCwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNTEsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDUyLCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA1MywgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNTQsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDU1LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA1NiwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNTcsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDU4LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA1OSwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNjAsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDYxLCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA2MiwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNjMsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDY0LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA2NSwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNjYsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDY3LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA2OCwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNjksIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDcwLCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA3MSwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNzIsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDczLCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA3NCwgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNzUsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDc2LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCisJeyBOVUxMLCA3NywgMHg4MEZGRkYwQywgMHgwMDAwMDAwMCB9LAorCXsgTlVMTCwgNzgsIDB4ODBGRkZGMEMsIDB4MDAwMDAwMDAgfSwKKwl7IE5VTEwsIDc5LCAweDgwRkZGRjBDLCAweDAwMDAwMDAwIH0sCit9OworCitjb25zdCBESURBVEFGT1JNQVQgY19kZkRJSm95c3RpY2sgPSB7IHNpemVvZihESURBVEFGT1JNQVQpLCBzaXplb2YoRElPQkpFQ1REQVRBRk9STUFUKSwgMHgwMDAwMDAwMSwgODAsIDQ0LCBKT1lfZm10IH07CisKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IERYNV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipEWDVfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBTRExfU3VyZmFjZSAqRFg1X1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgRFg1X1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLAorCQkJIFNETF9Db2xvciAqY29sb3JzKTsKK3N0YXRpYyBpbnQgRFg1X1NldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKK3N0YXRpYyBpbnQgRFg1X0dldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKK3N0YXRpYyB2b2lkIERYNV9WaWRlb1F1aXQoX1RISVMpOworCisvKiBIYXJkd2FyZSBzdXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBEWDVfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgRFg1X0NoZWNrSFdCbGl0KF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KTsKK3N0YXRpYyBpbnQgRFg1X0ZpbGxIV1JlY3QoX1RISVMsIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0LCBVaW50MzIgY29sb3IpOworc3RhdGljIGludCBEWDVfU2V0SFdDb2xvcktleShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQzMiBrZXkpOworc3RhdGljIGludCBEWDVfU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQ4IGFscGhhKTsKK3N0YXRpYyBpbnQgRFg1X0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIERYNV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgRFg1X0ZsaXBIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyB2b2lkIERYNV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKK3N0YXRpYyBpbnQgRFg1X0FsbG9jRERTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgCisJCQkJTFBESVJFQ1REUkFXU1VSRkFDRTMgcmVxdWVzdGVkLCBVaW50MzIgZmxhZyk7CisKKy8qIFdpbmRvd3MgbWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIERYNV9BY3RpdmF0ZShfVEhJUywgQk9PTCBhY3RpdmUsIEJPT0wgbWluaW1pemVkKTsKK3N0YXRpYyB2b2lkIERYNV9SZWFsaXplUGFsZXR0ZShfVEhJUyk7CitzdGF0aWMgdm9pZCBEWDVfUGFsZXR0ZUNoYW5nZWQoX1RISVMsIEhXTkQgd2luZG93KTsKK3N0YXRpYyB2b2lkIERYNV9XaW5QQUlOVChfVEhJUywgSERDIGhkYyk7CisKKy8qIFdpbkRJQiBkcml2ZXIgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgZ2FtbWEgcmFtcHMgKi8KK2V4dGVybiBpbnQgRElCX1NldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKK2V4dGVybiBpbnQgRElCX0dldEdhbW1hUmFtcChfVEhJUywgVWludDE2ICpyYW1wKTsKK2V4dGVybiB2b2lkIERJQl9RdWl0R2FtbWEoX1RISVMpOworCisvKiBEWDUgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBEWDVfQXZhaWxhYmxlKHZvaWQpCit7CisJSElOU1RBTkNFIERJbnB1dERMTDsKKwlISU5TVEFOQ0UgRERyYXdETEw7CisJaW50IGRpbnB1dF9vazsKKwlpbnQgZGRyYXdfb2s7CisKKwkvKiBWZXJzaW9uIGNoZWNrIERJTlBVVC5ETEwgYW5kIEREUkFXLkRMTCAoSXMgRGlyZWN0WCBva2F5PykgKi8KKwlkaW5wdXRfb2sgPSAwOworCURJbnB1dERMTCA9IExvYWRMaWJyYXJ5KFRFWFQoIkRJTlBVVC5ETEwiKSk7CisJaWYgKCBESW5wdXRETEwgIT0gTlVMTCApIHsKKwkJZGlucHV0X29rID0gMTsKKwkgIAlGcmVlTGlicmFyeShESW5wdXRETEwpOworCX0KKwlkZHJhd19vayA9IDA7CisJRERyYXdETEwgPSBMb2FkTGlicmFyeShURVhUKCJERFJBVy5ETEwiKSk7CisJaWYgKCBERHJhd0RMTCAhPSBOVUxMICkgeworCSAgSFJFU1VMVCAoV0lOQVBJICpERHJhd0NyZWF0ZSkoR1VJRCAqLExQRElSRUNURFJBVyAqLElVbmtub3duICopOworCSAgTFBESVJFQ1REUkFXIEREcmF3OworCisJICAvKiBUcnkgdG8gY3JlYXRlIGEgdmFsaWQgRGlyZWN0RHJhdyBvYmplY3QgKi8KKwkgIEREcmF3Q3JlYXRlID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhERHJhd0RMTCwgVEVYVCgiRGlyZWN0RHJhd0NyZWF0ZSIpKTsKKwkgIGlmICggKEREcmF3Q3JlYXRlICE9IE5VTEwpCisJCQkmJiAhRkFJTEVEKEREcmF3Q3JlYXRlKE5VTEwsICZERHJhdywgTlVMTCkpICkgeworCSAgICBpZiAoICFGQUlMRUQoSURpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbChERHJhdywKKwkJCQkJCQlOVUxMLCBERFNDTF9OT1JNQUwpKSApIHsKKwkgICAgICBERFNVUkZBQ0VERVNDIGRlc2M7CisJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSAgRERyYXdTdXJmOworCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UzIEREcmF3U3VyZjM7CisKKwkgICAgICAvKiBUcnkgdG8gY3JlYXRlIGEgRGlyZWN0RHJhd1N1cmZhY2UzIG9iamVjdCAqLworCSAgICAgIFNETF9tZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisJICAgICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7CisJICAgICAgZGVzYy5kd0ZsYWdzID0gRERTRF9DQVBTOworCSAgICAgIGRlc2MuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1BSSU1BUllTVVJGQUNFfEREU0NBUFNfVklERU9NRU1PUlk7CisJICAgICAgaWYgKCAhRkFJTEVEKElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UoRERyYXcsICZkZXNjLAorCQkJCQkJCSZERHJhd1N1cmYsIE5VTEwpKSApIHsKKwkgICAgICAgIGlmICggIUZBSUxFRChJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoRERyYXdTdXJmLAorCQkJJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UzLCAoTFBWT0lEICopJkREcmF3U3VyZjMpKSApIHsKKwkgICAgICAgICAgLyogWWF5ISAqLworCQkgIGRkcmF3X29rID0gMTsKKworCSAgICAgICAgICAvKiBDbGVhbiB1cC4uICovCisJICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTNfUmVsZWFzZShERHJhd1N1cmYzKTsKKwkgICAgICAgIH0KKwkgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKEREcmF3U3VyZik7CisJICAgICAgfQorCSAgICB9CisJICAgIElEaXJlY3REcmF3X1JlbGVhc2UoRERyYXcpOworCSAgfQorCSAgRnJlZUxpYnJhcnkoRERyYXdETEwpOworCX0KKwlyZXR1cm4oZGlucHV0X29rICYmIGRkcmF3X29rKTsKK30KKworLyogRnVuY3Rpb25zIGZvciBsb2FkaW5nIHRoZSBEaXJlY3RYIGZ1bmN0aW9ucyBkeW5hbWljYWxseSAqLworc3RhdGljIEhJTlNUQU5DRSBERHJhd0RMTCA9IE5VTEw7CitzdGF0aWMgSElOU1RBTkNFIERJbnB1dERMTCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIERYNV9VbmxvYWQodm9pZCkKK3sKKwlpZiAoIEREcmF3RExMICE9IE5VTEwgKSB7CisJCUZyZWVMaWJyYXJ5KEREcmF3RExMKTsKKwkJRERyYXdDcmVhdGUgPSBOVUxMOworCQlERHJhd0RMTCA9IE5VTEw7CisJfQorCWlmICggRElucHV0RExMICE9IE5VTEwgKSB7CisJCUZyZWVMaWJyYXJ5KERJbnB1dERMTCk7CisJCURJbnB1dENyZWF0ZSA9IE5VTEw7CisJCURJbnB1dERMTCA9IE5VTEw7CisJfQorfQorc3RhdGljIGludCBEWDVfTG9hZCh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlEWDVfVW5sb2FkKCk7CisJRERyYXdETEwgPSBMb2FkTGlicmFyeShURVhUKCJERFJBVy5ETEwiKSk7CisJaWYgKCBERHJhd0RMTCAhPSBOVUxMICkgeworCQlERHJhd0NyZWF0ZSA9ICh2b2lkICopR2V0UHJvY0FkZHJlc3MoRERyYXdETEwsCisJCQkJCVRFWFQoIkRpcmVjdERyYXdDcmVhdGUiKSk7CisJfQorCURJbnB1dERMTCA9IExvYWRMaWJyYXJ5KFRFWFQoIkRJTlBVVC5ETEwiKSk7CisJaWYgKCBESW5wdXRETEwgIT0gTlVMTCApIHsKKwkJRElucHV0Q3JlYXRlID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhESW5wdXRETEwsCisJCQkJCVRFWFQoIkRpcmVjdElucHV0Q3JlYXRlQSIpKTsKKwl9CisJaWYgKCBERHJhd0RMTCAmJiBERHJhd0NyZWF0ZSAmJiBESW5wdXRETEwgJiYgRElucHV0Q3JlYXRlICkgeworCQlzdGF0dXMgPSAwOworCX0gZWxzZSB7CisJCURYNV9VbmxvYWQoKTsKKwkJc3RhdHVzID0gLTE7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIERYNV9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICp0aGlzKQoreworCS8qIEZyZWUgRGlyZWN0RHJhdyBvYmplY3QgKi8KKwlpZiAoIGRkcmF3MiAhPSBOVUxMICkgeworCQlJRGlyZWN0RHJhdzJfUmVsZWFzZShkZHJhdzIpOworCX0KKwlEWDVfVW5sb2FkKCk7CisJaWYgKCB0aGlzICkgeworCQlpZiAoIHRoaXMtPmhpZGRlbiApIHsKKwkJCVNETF9mcmVlKHRoaXMtPmhpZGRlbik7CisJCX0KKwkJaWYgKCB0aGlzLT5nbF9kYXRhICkgeworCQkJU0RMX2ZyZWUodGhpcy0+Z2xfZGF0YSk7CisJCX0KKwkJU0RMX2ZyZWUodGhpcyk7CisJfQorfQorCitzdGF0aWMgU0RMX1ZpZGVvRGV2aWNlICpEWDVfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCS8qIExvYWQgRGlyZWN0WCAqLworCWlmICggRFg1X0xvYWQoKSA8IDAgKSB7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLworCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKwlpZiAoIGRldmljZSApIHsKKwkJU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOworCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKKwkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisJCWRldmljZS0+Z2xfZGF0YSA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVHTERhdGEgKikKKwkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+Z2xfZGF0YSkpOworCX0KKwlpZiAoIChkZXZpY2UgPT0gTlVMTCkgfHwgKGRldmljZS0+aGlkZGVuID09IE5VTEwpIHx8CisJCSAgICAgICAgICAgICAgICAgKGRldmljZS0+Z2xfZGF0YSA9PSBOVUxMKSApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCURYNV9EZWxldGVEZXZpY2UoZGV2aWNlKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCVNETF9tZW1zZXQoZGV2aWNlLT5nbF9kYXRhLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmdsX2RhdGEpKTsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwlkZXZpY2UtPlZpZGVvSW5pdCA9IERYNV9WaWRlb0luaXQ7CisJZGV2aWNlLT5MaXN0TW9kZXMgPSBEWDVfTGlzdE1vZGVzOworCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gRFg1X1NldFZpZGVvTW9kZTsKKwlkZXZpY2UtPlVwZGF0ZU1vdXNlID0gV0lOX1VwZGF0ZU1vdXNlOworCWRldmljZS0+Q3JlYXRlWVVWT3ZlcmxheSA9IERYNV9DcmVhdGVZVVZPdmVybGF5OworCWRldmljZS0+U2V0Q29sb3JzID0gRFg1X1NldENvbG9yczsKKwlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKKwlkZXZpY2UtPlZpZGVvUXVpdCA9IERYNV9WaWRlb1F1aXQ7CisJZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IERYNV9BbGxvY0hXU3VyZmFjZTsKKwlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gRFg1X0NoZWNrSFdCbGl0OworCWRldmljZS0+RmlsbEhXUmVjdCA9IERYNV9GaWxsSFdSZWN0OworCWRldmljZS0+U2V0SFdDb2xvcktleSA9IERYNV9TZXRIV0NvbG9yS2V5OworCWRldmljZS0+U2V0SFdBbHBoYSA9IERYNV9TZXRIV0FscGhhOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IERYNV9Mb2NrSFdTdXJmYWNlOworCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gRFg1X1VubG9ja0hXU3VyZmFjZTsKKwlkZXZpY2UtPkZsaXBIV1N1cmZhY2UgPSBEWDVfRmxpcEhXU3VyZmFjZTsKKwlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBEWDVfRnJlZUhXU3VyZmFjZTsKKwlkZXZpY2UtPlNldEdhbW1hUmFtcCA9IERYNV9TZXRHYW1tYVJhbXA7CisJZGV2aWNlLT5HZXRHYW1tYVJhbXAgPSBEWDVfR2V0R2FtbWFSYW1wOworI2lmIFNETF9WSURFT19PUEVOR0wKKwlkZXZpY2UtPkdMX0xvYWRMaWJyYXJ5ID0gV0lOX0dMX0xvYWRMaWJyYXJ5OworCWRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBXSU5fR0xfR2V0UHJvY0FkZHJlc3M7CisJZGV2aWNlLT5HTF9HZXRBdHRyaWJ1dGUgPSBXSU5fR0xfR2V0QXR0cmlidXRlOworCWRldmljZS0+R0xfTWFrZUN1cnJlbnQgPSBXSU5fR0xfTWFrZUN1cnJlbnQ7CisJZGV2aWNlLT5HTF9Td2FwQnVmZmVycyA9IFdJTl9HTF9Td2FwQnVmZmVyczsKKyNlbmRpZgorCWRldmljZS0+U2V0Q2FwdGlvbiA9IFdJTl9TZXRXTUNhcHRpb247CisJZGV2aWNlLT5TZXRJY29uID0gV0lOX1NldFdNSWNvbjsKKwlkZXZpY2UtPkljb25pZnlXaW5kb3cgPSBXSU5fSWNvbmlmeVdpbmRvdzsKKwlkZXZpY2UtPkdyYWJJbnB1dCA9IFdJTl9HcmFiSW5wdXQ7CisJZGV2aWNlLT5HZXRXTUluZm8gPSBXSU5fR2V0V01JbmZvOworCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gV0lOX0ZyZWVXTUN1cnNvcjsKKwlkZXZpY2UtPkNyZWF0ZVdNQ3Vyc29yID0gV0lOX0NyZWF0ZVdNQ3Vyc29yOworCWRldmljZS0+U2hvd1dNQ3Vyc29yID0gV0lOX1Nob3dXTUN1cnNvcjsKKwlkZXZpY2UtPldhcnBXTUN1cnNvciA9IFdJTl9XYXJwV01DdXJzb3I7CisJZGV2aWNlLT5DaGVja01vdXNlTW9kZSA9IFdJTl9DaGVja01vdXNlTW9kZTsKKwlkZXZpY2UtPkluaXRPU0tleW1hcCA9IERYNV9Jbml0T1NLZXltYXA7CisJZGV2aWNlLT5QdW1wRXZlbnRzID0gRFg1X1B1bXBFdmVudHM7CisKKwkvKiBTZXQgdXAgdGhlIHdpbmRvd3MgbWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMgKi8KKwlXSU5fQWN0aXZhdGUgPSBEWDVfQWN0aXZhdGU7CisJV0lOX1JlYWxpemVQYWxldHRlID0gRFg1X1JlYWxpemVQYWxldHRlOworCVdJTl9QYWxldHRlQ2hhbmdlZCA9IERYNV9QYWxldHRlQ2hhbmdlZDsKKwlXSU5fV2luUEFJTlQgPSBEWDVfV2luUEFJTlQ7CisJSGFuZGxlTWVzc2FnZSA9IERYNV9IYW5kbGVNZXNzYWdlOworCisJZGV2aWNlLT5mcmVlID0gRFg1X0RlbGV0ZURldmljZTsKKworCS8qIFdlJ3JlIGZpbmFsbHkgcmVhZHkgKi8KKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBESVJFQ1RYX2Jvb3RzdHJhcCA9IHsKKwkiZGlyZWN0eCIsICJXaW45NS85OC8yMDAwIERpcmVjdFgiLAorCURYNV9BdmFpbGFibGUsIERYNV9DcmVhdGVEZXZpY2UKK307CisKK3N0YXRpYyBpbnQgY21wbW9kZXMoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQoreworICAgIFNETF9SZWN0ICphID0gKihTRExfUmVjdCAqKil2YTsKKyAgICBTRExfUmVjdCAqYiA9ICooU0RMX1JlY3QgKiopdmI7CisgICAgaWYgKCBhLT53ID09IGItPncgKQorICAgICAgICByZXR1cm4gYi0+aCAtIGEtPmg7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYi0+dyAtIGEtPnc7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBFbnVtTW9kZXMyKEREU1VSRkFDRURFU0MgKmRlc2MsIFZPSUQgKnVkYXRhKQoreworCVNETF9WaWRlb0RldmljZSAqdGhpcyA9IChTRExfVmlkZW9EZXZpY2UgKil1ZGF0YTsKKwlzdHJ1Y3QgRFg1RW51bVJlY3QgKmVudW1yZWN0OworI2lmIGRlZmluZWQoTk9OQU1FTEVTU1VOSU9OKQorCWludCBicHAgPSBkZXNjLT5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudDsKKwlpbnQgcmVmcmVzaFJhdGUgPSBkZXNjLT51Mi5kd1JlZnJlc2hSYXRlOworI2Vsc2UKKwlpbnQgYnBwID0gZGVzYy0+ZGRwZlBpeGVsRm9ybWF0LmR3UkdCQml0Q291bnQ7CisJaW50IHJlZnJlc2hSYXRlID0gZGVzYy0+ZHdSZWZyZXNoUmF0ZTsKKyNlbmRpZgorCWludCBtYXhSZWZyZXNoUmF0ZTsKKworCWlmICggZGVzYy0+ZHdXaWR0aCA8PSBTRExfZGVza3RvcF9tb2RlLmRtUGVsc1dpZHRoICYmCisJICAgICBkZXNjLT5kd0hlaWdodCA8PSBTRExfZGVza3RvcF9tb2RlLmRtUGVsc0hlaWdodCApIHsKKwkJbWF4UmVmcmVzaFJhdGUgPSBTRExfZGVza3RvcF9tb2RlLmRtRGlzcGxheUZyZXF1ZW5jeTsKKwl9IGVsc2UgeworCQltYXhSZWZyZXNoUmF0ZSA9IDg1OwkvKiBzYWZlIHZhbHVlPyAqLworCX0KKworCXN3aXRjaCAoYnBwKSAgeworCQljYXNlIDg6CisJCWNhc2UgMTY6CisJCWNhc2UgMjQ6CisJCWNhc2UgMzI6CisJCQlicHAgLz0gODsgLS1icHA7CisJCQlpZiAoIGVudW1saXN0c1ticHBdICYmCisJCQkgICAgIGVudW1saXN0c1ticHBdLT5yLncgPT0gKFVpbnQxNilkZXNjLT5kd1dpZHRoICYmCisJCQkgICAgIGVudW1saXN0c1ticHBdLT5yLmggPT0gKFVpbnQxNilkZXNjLT5kd0hlaWdodCApIHsKKwkJCQlpZiAoIHJlZnJlc2hSYXRlID4gZW51bWxpc3RzW2JwcF0tPnJlZnJlc2hSYXRlICYmCisJCQkJICAgICByZWZyZXNoUmF0ZSA8PSBtYXhSZWZyZXNoUmF0ZSApIHsKKwkJCQkJZW51bWxpc3RzW2JwcF0tPnJlZnJlc2hSYXRlID0gcmVmcmVzaFJhdGU7CisjaWZkZWYgRERSQVdfREVCVUcKKyBmcHJpbnRmKHN0ZGVyciwgIk5ldyByZWZyZXNoIHJhdGUgZm9yICVkIGJwcDogJWR4JWQgYXQgJWQgSHpcbiIsIChicHArMSkqOCwgKGludClkZXNjLT5kd1dpZHRoLCAoaW50KWRlc2MtPmR3SGVpZ2h0LCByZWZyZXNoUmF0ZSk7CisjZW5kaWYKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQkrK1NETF9udW1tb2Rlc1ticHBdOworCQkJZW51bXJlY3QgPSAoc3RydWN0IERYNUVudW1SZWN0KilTRExfbWFsbG9jKHNpemVvZihzdHJ1Y3QgRFg1RW51bVJlY3QpKTsKKwkJCWlmICggIWVudW1yZWN0ICkgeworCQkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJCXJldHVybihEREVOVU1SRVRfQ0FOQ0VMKTsKKwkJCX0KKwkJCWVudW1yZWN0LT5yZWZyZXNoUmF0ZSA9IHJlZnJlc2hSYXRlOworCQkJZW51bXJlY3QtPnIueCA9IDA7CisJCQllbnVtcmVjdC0+ci55ID0gMDsKKwkJCWVudW1yZWN0LT5yLncgPSAoVWludDE2KWRlc2MtPmR3V2lkdGg7CisJCQllbnVtcmVjdC0+ci5oID0gKFVpbnQxNilkZXNjLT5kd0hlaWdodDsKKwkJCWVudW1yZWN0LT5uZXh0ID0gZW51bWxpc3RzW2JwcF07CisJCQllbnVtbGlzdHNbYnBwXSA9IGVudW1yZWN0OworI2lmZGVmIEREUkFXX0RFQlVHCisgZnByaW50ZihzdGRlcnIsICJOZXcgbW9kZSBmb3IgJWQgYnBwOiAlZHglZCBhdCAlZCBIelxuIiwgKGJwcCsxKSo4LCAoaW50KWRlc2MtPmR3V2lkdGgsIChpbnQpZGVzYy0+ZHdIZWlnaHQsIHJlZnJlc2hSYXRlKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuKERERU5VTVJFVF9PSyk7Cit9CisKK3ZvaWQgU2V0RERlcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGNvZGUpCit7CisJc3RhdGljIGNoYXIgKmVycm9yOworCXN0YXRpYyBjaGFyICBlcnJidWZbMTAyNF07CisKKwllcnJidWZbMF0gPSAwOworCXN3aXRjaCAoY29kZSkgeworCQljYXNlIERERVJSX0dFTkVSSUM6CisJCQllcnJvciA9ICJVbmRlZmluZWQgZXJyb3IhIjsKKwkJCWJyZWFrOworCQljYXNlIERERVJSX0VYQ0VQVElPTjoKKwkJCWVycm9yID0gIkV4Y2VwdGlvbiBlbmNvdW50ZXJlZCI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9JTlZBTElET0JKRUNUOgorCQkJZXJyb3IgPSAiSW52YWxpZCBvYmplY3QiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfSU5WQUxJRFBBUkFNUzoKKwkJCWVycm9yID0gIkludmFsaWQgcGFyYW1ldGVycyI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9OT1RGT1VORDoKKwkJCWVycm9yID0gIk9iamVjdCBub3QgZm91bmQiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfSU5WQUxJRFJFQ1Q6CisJCQllcnJvciA9ICJJbnZhbGlkIHJlY3RhbmdsZSI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9JTlZBTElEQ0FQUzoKKwkJCWVycm9yID0gIkludmFsaWQgY2FwcyBtZW1iZXIiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfSU5WQUxJRFBJWEVMRk9STUFUOgorCQkJZXJyb3IgPSAiSW52YWxpZCBwaXhlbCBmb3JtYXQiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfT1VUT0ZNRU1PUlk6CisJCQllcnJvciA9ICJPdXQgb2YgbWVtb3J5IjsKKwkJCWJyZWFrOworCQljYXNlIERERVJSX09VVE9GVklERU9NRU1PUlk6CisJCQllcnJvciA9ICJPdXQgb2YgdmlkZW8gbWVtb3J5IjsKKwkJCWJyZWFrOworCQljYXNlIERERVJSX1NVUkZBQ0VCVVNZOgorCQkJZXJyb3IgPSAiU3VyZmFjZSBidXN5IjsKKwkJCWJyZWFrOworCQljYXNlIERERVJSX1NVUkZBQ0VMT1NUOgorCQkJZXJyb3IgPSAiU3VyZmFjZSB3YXMgbG9zdCI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9XQVNTVElMTERSQVdJTkc6CisJCQllcnJvciA9ICJEaXJlY3REcmF3IGlzIHN0aWxsIGRyYXdpbmciOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfSU5WQUxJRFNVUkZBQ0VUWVBFOgorCQkJZXJyb3IgPSAiSW52YWxpZCBzdXJmYWNlIHR5cGUiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfTk9FWENMVVNJVkVNT0RFOgorCQkJZXJyb3IgPSAiTm90IGluIGV4Y2x1c2l2ZSBhY2Nlc3MgbW9kZSI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9OT1BBTEVUVEVBVFRBQ0hFRDoKKwkJCWVycm9yID0gIk5vIHBhbGV0dGUgYXR0YWNoZWQiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfTk9QQUxFVFRFSFc6CisJCQllcnJvciA9ICJObyBwYWxldHRlIGhhcmR3YXJlIjsKKwkJCWJyZWFrOworCQljYXNlIERERVJSX05PVDhCSVRDT0xPUjoKKwkJCWVycm9yID0gIk5vdCA4LWJpdCBjb2xvciI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9FWENMVVNJVkVNT0RFQUxSRUFEWVNFVDoKKwkJCWVycm9yID0gIkV4Y2x1c2l2ZSBtb2RlIHdhcyBhbHJlYWR5IHNldCI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9IV05EQUxSRUFEWVNFVDoKKwkJCWVycm9yID0gIldpbmRvdyBoYW5kbGUgYWxyZWFkeSBzZXQiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfSFdORFNVQkNMQVNTRUQ6CisJCQllcnJvciA9ICJXaW5kb3cgaGFuZGxlIGlzIHN1YmNsYXNzZWQiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfTk9CTFRIVzoKKwkJCWVycm9yID0gIk5vIGJsaXQgaGFyZHdhcmUiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfSU1QTElDSVRMWUNSRUFURUQ6CisJCQllcnJvciA9ICJTdXJmYWNlIHdhcyBpbXBsaWNpdGx5IGNyZWF0ZWQiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfSU5DT01QQVRJQkxFUFJJTUFSWToKKwkJCWVycm9yID0gIkluY29tcGF0aWJsZSBwcmltYXJ5IHN1cmZhY2UiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfTk9DT09QRVJBVElWRUxFVkVMU0VUOgorCQkJZXJyb3IgPSAiTm8gY29vcGVyYXRpdmUgbGV2ZWwgc2V0IjsKKwkJCWJyZWFrOworCQljYXNlIERERVJSX05PRElSRUNURFJBV0hXOgorCQkJZXJyb3IgPSAiTm8gRGlyZWN0RHJhdyBoYXJkd2FyZSI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9OT0VNVUxBVElPTjoKKwkJCWVycm9yID0gIk5vIGVtdWxhdGlvbiBhdmFpbGFibGUiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfTk9GTElQSFc6CisJCQllcnJvciA9ICJObyBmbGlwIGhhcmR3YXJlIjsKKwkJCWJyZWFrOworCQljYXNlIERERVJSX05PVEZMSVBQQUJMRToKKwkJCWVycm9yID0gIlN1cmZhY2Ugbm90IGZsaXBwYWJsZSI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9QUklNQVJZU1VSRkFDRUFMUkVBRFlFWElTVFM6CisJCQllcnJvciA9ICJQcmltYXJ5IHN1cmZhY2UgYWxyZWFkeSBleGlzdHMiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfVU5TVVBQT1JURURNT0RFOgorCQkJZXJyb3IgPSAiVW5zdXBwb3J0ZWQgbW9kZSI7CisJCQlicmVhazsKKwkJY2FzZSBEREVSUl9XUk9OR01PREU6CisJCQllcnJvciA9ICJTdXJmYWNlIGNyZWF0ZWQgaW4gZGlmZmVyZW50IG1vZGUiOworCQkJYnJlYWs7CisJCWNhc2UgRERFUlJfVU5TVVBQT1JURUQ6CisJCQllcnJvciA9ICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCI7CisJCQlicmVhazsKKwkJY2FzZSBFX05PSU5URVJGQUNFOgorCQkJZXJyb3IgPSAiSW50ZXJmYWNlIG5vdCBwcmVzZW50IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0RMX3NucHJpbnRmKGVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLAorCQkJICAgICAgICAgIiVzOiBVbmtub3duIERpcmVjdERyYXcgZXJyb3I6IDB4JXgiLAorCQkJCQkJCQlmdW5jdGlvbiwgY29kZSk7CisJCQlicmVhazsKKwl9CisJaWYgKCAhIGVycmJ1ZlswXSApIHsKKwkJU0RMX3NucHJpbnRmKGVycmJ1ZiwgU0RMX2FycmF5c2l6ZShlcnJidWYpLCAiJXM6ICVzIiwgZnVuY3Rpb24sIGVycm9yKTsKKwl9CisJU0RMX1NldEVycm9yKCIlcyIsIGVycmJ1Zik7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQgRFg1X1VwZGF0ZVZpZGVvSW5mbyhfVEhJUykKK3sKKwkvKiBUaGlzIG5lZWRzIHRvIGJlIEREQ0FQU19EWDUgZm9yIHRoZSBEaXJlY3REcmF3MiBpbnRlcmZhY2UgKi8KKyNpZiBESVJFQ1REUkFXX1ZFUlNJT04gPD0gMHgzMDAKKyNlcnJvciBZb3VyIHZlcnNpb24gb2YgRGlyZWN0WCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1LjAKKyNlbmRpZgorI2lmbmRlZiBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9TZXRHYW1tYVJhbXAKKwkvKmlmIGdhbW1hIGlzIHVuZGVmaW5lZCB0aGVuIHdlIHJlYWxseSBoYXZlIGRpcmVjdHggPD0gMHg1MDAqLworCUREQ0FQUyBERENhcHM7CisjZWxzZQorCUREQ0FQU19EWDUgRERDYXBzOworI2VuZGlmCisJSFJFU1VMVCByZXN1bHQ7CisKKwkvKiBGaWxsIGluIG91ciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gY2FwYWJpbGl0aWVzICovCisJU0RMX21lbXNldCgmRERDYXBzLCAwLCBzaXplb2YoRERDYXBzKSk7CisJRERDYXBzLmR3U2l6ZSA9IHNpemVvZihERENhcHMpOworCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9HZXRDYXBzKGRkcmF3MiwgKEREQ0FQUyAqKSZERENhcHMsIE5VTEwpOworCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlTZXRERGVycm9yKCJEaXJlY3REcmF3Mjo6R2V0Q2FwcyIsIHJlc3VsdCk7CisJCXJldHVybigtMSk7CisJfQorCXRoaXMtPmluZm8uaHdfYXZhaWxhYmxlID0gMTsKKwlpZiAoIChERENhcHMuZHdDYXBzICYgRERDQVBTX0JMVCkgPT0gRERDQVBTX0JMVCApIHsKKwkJdGhpcy0+aW5mby5ibGl0X2h3ID0gMTsKKwl9CisJaWYgKCAoKEREQ2Fwcy5kd0NhcHMgJiBERENBUFNfQ09MT1JLRVkpID09IEREQ0FQU19DT0xPUktFWSkgJiYKKwkgICAgICgoRERDYXBzLmR3Q0tleUNhcHMgJiBERENLRVlDQVBTX1NSQ0JMVCkgPT0gRERDS0VZQ0FQU19TUkNCTFQpICkgeworCQl0aGlzLT5pbmZvLmJsaXRfaHdfQ0MgPSAxOworCX0KKwlpZiAoIChERENhcHMuZHdDYXBzICYgRERDQVBTX0FMUEhBKSA9PSBERENBUFNfQUxQSEEgKSB7CisJCS8qIFRoaXMgaXMgb25seSBmb3IgYWxwaGEgY2hhbm5lbCwgYW5kIERpcmVjdFggNgorCQkgICBkb2Vzbid0IHN1cHBvcnQgMkQgYWxwaGEgYmxpdHMgeWV0LCBzbyBzZXQgaXQgMAorCQkgKi8KKwkJdGhpcy0+aW5mby5ibGl0X2h3X0EgPSAwOworCX0KKwlpZiAoIChERENhcHMuZHdDYXBzICYgRERDQVBTX0NBTkJMVFNZU01FTSkgPT0gRERDQVBTX0NBTkJMVFNZU01FTSApIHsKKwkJdGhpcy0+aW5mby5ibGl0X3N3ID0gMTsKKwkJLyogVGhpcyBpc24ndCBuZWNlc3NhcmlseSB0cnVlLCBidXQgdGhlIEhFTCB3aWxsIGNvdmVyIHVzICovCisJCXRoaXMtPmluZm8uYmxpdF9zd19DQyA9IHRoaXMtPmluZm8uYmxpdF9od19DQzsKKwkJdGhpcy0+aW5mby5ibGl0X3N3X0EgPSB0aGlzLT5pbmZvLmJsaXRfaHdfQTsKKwl9CisJaWYgKCAoRERDYXBzLmR3Q2FwcyAmIEREQ0FQU19CTFRDT0xPUkZJTEwpID09IEREQ0FQU19CTFRDT0xPUkZJTEwgKSB7CisJCXRoaXMtPmluZm8uYmxpdF9maWxsID0gMTsKKwl9CisKKwkvKiBGaW5kIG91dCBob3cgbXVjaCB2aWRlbyBtZW1vcnkgaXMgYXZhaWxhYmxlICovCisJeyBERFNDQVBTIGRkc0NhcHM7CisJICBEV09SRCB0b3RhbF9tZW07CisJCWRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19WSURFT01FTU9SWTsKKwkJcmVzdWx0ID0gSURpcmVjdERyYXcyX0dldEF2YWlsYWJsZVZpZE1lbShkZHJhdzIsCisJCQkJCQkmZGRzQ2FwcywgJnRvdGFsX21lbSwgTlVMTCk7CisJCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQkJdG90YWxfbWVtID0gRERDYXBzLmR3VmlkTWVtVG90YWw7IAorCQl9CisJCXRoaXMtPmluZm8udmlkZW9fbWVtID0gdG90YWxfbWVtLzEwMjQ7CisJfQorCXJldHVybigwKTsKK30KKworaW50IERYNV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKwlIUkVTVUxUIHJlc3VsdDsKKwlMUERJUkVDVERSQVcgZGRyYXc7CisJaW50IGksIGo7CisJSERDIGhkYzsKKworCS8qIEludGlhbGl6ZSBldmVyeXRoaW5nICovCisJZGRyYXcyID0gTlVMTDsKKwlTRExfcHJpbWFyeSA9IE5VTEw7CisJU0RMX2NsaXBwZXIgPSBOVUxMOworCVNETF9wYWxldHRlID0gTlVMTDsKKwlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgeworCQlTRExfbnVtbW9kZXNbaV0gPSAwOworCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOworCQlTRExfbW9kZWluZGV4W2ldID0gMDsKKwl9CisJY29sb3JjaGFuZ2VfZXhwZWN0ZWQgPSAwOworCisJLyogQ3JlYXRlIHRoZSB3aW5kb3cgKi8KKwlpZiAoIERYNV9DcmVhdGVXaW5kb3codGhpcykgPCAwICkgeworCQlyZXR1cm4oLTEpOworCX0KKworI2lmICFTRExfQVVESU9fRElTQUJMRUQKKwlEWDVfU291bmRGb2N1cyhTRExfV2luZG93KTsKKyNlbmRpZgorCisJLyogQ3JlYXRlIHRoZSBEaXJlY3REcmF3IG9iamVjdCAqLworCXJlc3VsdCA9IEREcmF3Q3JlYXRlKE5VTEwsICZkZHJhdywgTlVMTCk7CisJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCVNldEREZXJyb3IoIkRpcmVjdERyYXdDcmVhdGUiLCByZXN1bHQpOworCQlyZXR1cm4oLTEpOworCX0KKwlyZXN1bHQgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShkZHJhdywgJklJRF9JRGlyZWN0RHJhdzIsCisJCQkJCQkJKExQVk9JRCAqKSZkZHJhdzIpOworCUlEaXJlY3REcmF3X1JlbGVhc2UoZGRyYXcpOworCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlTZXRERGVycm9yKCJEaXJlY3REcmF3OjpRdWVyeUludGVyZmFjZSIsIHJlc3VsdCk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBzY3JlZW4gZGVwdGggKi8KKwloZGMgPSBHZXREQyhTRExfV2luZG93KTsKKwl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBHZXREZXZpY2VDYXBzKGhkYyxQTEFORVMpICoKKwkJCQkJR2V0RGV2aWNlQ2FwcyhoZGMsQklUU1BJWEVMKTsKKwlSZWxlYXNlREMoU0RMX1dpbmRvdywgaGRjKTsKKworI2lmbmRlZiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKKwkvKiBRdWVyeSBmb3IgdGhlIGRlc2t0b3AgcmVzb2x1dGlvbiAqLworCUVudW1EaXNwbGF5U2V0dGluZ3MoTlVMTCwgRU5VTV9DVVJSRU5UX1NFVFRJTkdTLCAmU0RMX2Rlc2t0b3BfbW9kZSk7CisJdGhpcy0+aW5mby5jdXJyZW50X3cgPSBTRExfZGVza3RvcF9tb2RlLmRtUGVsc1dpZHRoOworCXRoaXMtPmluZm8uY3VycmVudF9oID0gU0RMX2Rlc2t0b3BfbW9kZS5kbVBlbHNIZWlnaHQ7CisjZW5kaWYKKworCS8qIEVudW1lcmF0ZSB0aGUgYXZhaWxhYmxlIGZ1bGxzY3JlZW4gbW9kZXMgKi8KKwlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkKKwkJZW51bWxpc3RzW2ldID0gTlVMTDsKKworCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9FbnVtRGlzcGxheU1vZGVzKGRkcmF3MixEREVETV9SRUZSRVNIUkFURVMsTlVMTCx0aGlzLEVudW1Nb2RlczIpOworCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlTZXRERGVycm9yKCJEaXJlY3REcmF3Mjo6RW51bURpc3BsYXlNb2RlcyIsIHJlc3VsdCk7CisJCXJldHVybigtMSk7CisJfQorCWZvciAoIGk9MDsgaTxOVU1fTU9ERUxJU1RTOyArK2kgKSB7CisJCXN0cnVjdCBEWDVFbnVtUmVjdCAqcmVjdDsKKwkJU0RMX21vZGVsaXN0W2ldID0gKFNETF9SZWN0ICoqKQorCQkJCVNETF9tYWxsb2MoKFNETF9udW1tb2Rlc1tpXSsxKSpzaXplb2YoU0RMX1JlY3QgKikpOworCQlpZiAoIFNETF9tb2RlbGlzdFtpXSA9PSBOVUxMICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm4oLTEpOworCQl9CisJCWZvciAoIGogPSAwLCByZWN0ID0gZW51bWxpc3RzW2ldOyByZWN0OyArK2osIHJlY3QgPSByZWN0LT5uZXh0ICkgeworCQkJU0RMX21vZGVsaXN0W2ldW2pdID0gJnJlY3QtPnI7CisJCX0KKwkJU0RMX21vZGVsaXN0W2ldW2pdID0gTlVMTDsKKworCQlpZiAoIFNETF9udW1tb2Rlc1tpXSA+IDAgKSB7CisJCQlTRExfcXNvcnQoU0RMX21vZGVsaXN0W2ldLCBTRExfbnVtbW9kZXNbaV0sIHNpemVvZiAqU0RMX21vZGVsaXN0W2ldLCBjbXBtb2Rlcyk7CisJCX0KKwl9CisJCisJLyogRmlsbCBpbiBzb21lIHdpbmRvdyBtYW5hZ2VyIGNhcGFiaWxpdGllcyAqLworCXRoaXMtPmluZm8ud21fYXZhaWxhYmxlID0gMTsKKworCS8qIEZpbGwgaW4gdGhlIHZpZGVvIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAqLworCURYNV9VcGRhdGVWaWRlb0luZm8odGhpcyk7CisKKwlyZXR1cm4oMCk7Cit9CisKK1NETF9SZWN0ICoqRFg1X0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKwlpbnQgYnBwOworCisJYnBwID0gZm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisJaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisJCS8qIEZJWE1FOiAgTm8gc3VwcG9ydCBmb3IgMSBicHAgb3IgNCBicHAgZm9ybWF0cyAqLworCQlzd2l0Y2ggKGJwcCkgeyAgLyogRG9lcyB3aW5kb3dzIHN1cHBvcnQgb3RoZXIgQlBQPyAqLworCQkJY2FzZSA4OgorCQkJY2FzZSAxNjoKKwkJCWNhc2UgMjQ6CisJCQljYXNlIDMyOgorCQkJCWJwcCA9IChicHAvOCktMTsKKwkJCQlpZiAoIFNETF9udW1tb2Rlc1ticHBdID4gMCApCisJCQkJCXJldHVybihTRExfbW9kZWxpc3RbYnBwXSk7CisJCQkJLyogRmFsbCB0aHJvdWdoICovCisJCQlkZWZhdWx0OgorCQkJCXJldHVybigoU0RMX1JlY3QgKiopMCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPT0gYnBwICkgeworCQkJcmV0dXJuKChTRExfUmVjdCAqKiktMSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4oKFNETF9SZWN0ICoqKTApOworCQl9CisJfQorfQorCisvKiBWYXJpb3VzIHNjcmVlbiB1cGRhdGUgZnVuY3Rpb25zIGF2YWlsYWJsZSAqLworc3RhdGljIHZvaWQgRFg1X1dpbmRvd1VwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworc3RhdGljIHZvaWQgRFg1X0RpcmVjdFVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCitTRExfU3VyZmFjZSAqRFg1X1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsCisJCQkJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisJU0RMX1N1cmZhY2UgKnZpZGVvOworCWludCBwcmV2X3cgPSAtMTsKKwlpbnQgcHJldl9oID0gLTE7CisJSFJFU1VMVCByZXN1bHQ7CisJRFdPUkQgc2hhcmVtb2RlOworCURXT1JEIHN0eWxlOworCWNvbnN0IERXT1JEIGRpcmVjdHN0eWxlID0KKwkJCShXU19QT1BVUCk7CisJY29uc3QgRFdPUkQgd2luZG93c3R5bGUgPSAKKwkJCShXU19PVkVSTEFQUEVEfFdTX0NBUFRJT058V1NfU1lTTUVOVXxXU19NSU5JTUlaRUJPWCk7CisJY29uc3QgRFdPUkQgcmVzaXplc3R5bGUgPQorCQkJKFdTX1RISUNLRlJBTUV8V1NfTUFYSU1JWkVCT1gpOworCUREU1VSRkFDRURFU0MgZGRzZDsKKwlMUERJUkVDVERSQVdTVVJGQUNFICBkZF9zdXJmYWNlMTsKKwlMUERJUkVDVERSQVdTVVJGQUNFMyBkZF9zdXJmYWNlMzsKKworCVNETF9yZXNpemluZyA9IDE7CisjaWZkZWYgRERSQVdfREVCVUcKKyBmcHJpbnRmKHN0ZGVyciwgIlNldHRpbmcgJWR4JWR4JWQgdmlkZW8gbW9kZVxuIiwgd2lkdGgsIGhlaWdodCwgYnBwKTsKKyNlbmRpZgorCS8qIENsZWFuIHVwIGFueSBwcmV2aW91cyBEaXJlY3REcmF3IHN1cmZhY2VzICovCisJaWYgKCBjdXJyZW50LT5od2RhdGEgKSB7CisJCXRoaXMtPkZyZWVIV1N1cmZhY2UodGhpcywgY3VycmVudCk7CisJCWN1cnJlbnQtPmh3ZGF0YSA9IE5VTEw7CisJfQorCWlmICggU0RMX3ByaW1hcnkgIT0gTlVMTCApIHsKKwkJSURpcmVjdERyYXdTdXJmYWNlM19SZWxlYXNlKFNETF9wcmltYXJ5KTsKKwkJU0RMX3ByaW1hcnkgPSBOVUxMOworCX0KKworI2lmbmRlZiBOT19DSEFOR0VESVNQTEFZU0VUVElOR1MKKwkvKiBVbnNldCBhbnkgcHJldmlvdXMgT3BlbkdMIGZ1bGxzY3JlZW4gbW9kZSAqLworCWlmICggKGN1cnJlbnQtPmZsYWdzICYgKFNETF9PUEVOR0x8U0RMX0ZVTExTQ1JFRU4pKSA9PQorCSAgICAgICAgICAgICAgICAgICAgICAgKFNETF9PUEVOR0x8U0RMX0ZVTExTQ1JFRU4pICkgeworCQlDaGFuZ2VEaXNwbGF5U2V0dGluZ3MoTlVMTCwgMCk7CisJfQorI2VuZGlmCisKKwkvKiBDbGVhbiB1cCBhbnkgR0wgY29udGV4dCB0aGF0IG1heSBiZSBoYW5naW5nIGFyb3VuZCAqLworCWlmICggY3VycmVudC0+ZmxhZ3MgJiBTRExfT1BFTkdMICkgeworCQlXSU5fR0xfU2h1dERvd24odGhpcyk7CisJfQorCisJLyogSWYgd2UgYXJlIHNldHRpbmcgYSBHTCBtb2RlLCB1c2UgR0RJLCBub3QgRGlyZWN0WCAoeXVjaykgKi8KKwlpZiAoIGZsYWdzICYgU0RMX09QRU5HTCApIHsKKwkJVWludDMyIFJtYXNrLCBHbWFzaywgQm1hc2s7CisKKwkJLyogUmVjYWxjdWxhdGUgdGhlIGJpdG1hc2tzIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoIGJwcCA9PSBjdXJyZW50LT5mb3JtYXQtPkJpdHNQZXJQaXhlbCApIHsKKwkJCXZpZGVvID0gY3VycmVudDsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoYnBwKSB7CisJCQkgICAgY2FzZSAxNToKKwkJCSAgICBjYXNlIDE2OgorCQkJCWlmICggMCAvKkRJQl9TdXNzU2NyZWVuRGVwdGgoKSA9PSAxNSovICkgeworCQkJCQkvKiA1LTUtNSAqLworCQkJCQlSbWFzayA9IDB4MDAwMDdjMDA7CisJCQkJCUdtYXNrID0gMHgwMDAwMDNlMDsKKwkJCQkJQm1hc2sgPSAweDAwMDAwMDFmOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIDUtNi01ICovCisJCQkJCVJtYXNrID0gMHgwMDAwZjgwMDsKKwkJCQkJR21hc2sgPSAweDAwMDAwN2UwOworCQkJCQlCbWFzayA9IDB4MDAwMDAwMWY7CisJCQkJfQorCQkJCWJyZWFrOworCQkJICAgIGNhc2UgMjQ6CisJCQkgICAgY2FzZSAzMjoKKwkJCQkvKiBHREkgZGVmaW5lZCBhcyA4LTgtOCAqLworCQkJCVJtYXNrID0gMHgwMGZmMDAwMDsKKwkJCQlHbWFzayA9IDB4MDAwMGZmMDA7CisJCQkJQm1hc2sgPSAweDAwMDAwMGZmOworCQkJCWJyZWFrOworCQkJICAgIGRlZmF1bHQ6CisJCQkJUm1hc2sgPSAweDAwMDAwMDAwOworCQkJCUdtYXNrID0gMHgwMDAwMDAwMDsKKwkJCQlCbWFzayA9IDB4MDAwMDAwMDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQl2aWRlbyA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsIDAsIDAsIGJwcCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm1hc2ssIEdtYXNrLCBCbWFzaywgMCk7CisJCQlpZiAoIHZpZGVvID09IE5VTEwgKSB7CisJCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQl9CisKKwkJLyogRmlsbCBpbiBwYXJ0IG9mIHRoZSB2aWRlbyBzdXJmYWNlICovCisJCXByZXZfdyA9IHZpZGVvLT53OworCQlwcmV2X2ggPSB2aWRlby0+aDsKKwkJdmlkZW8tPmZsYWdzID0gMDsJLyogQ2xlYXIgZmxhZ3MgKi8KKwkJdmlkZW8tPncgPSB3aWR0aDsKKwkJdmlkZW8tPmggPSBoZWlnaHQ7CisJCXZpZGVvLT5waXRjaCA9IFNETF9DYWxjdWxhdGVQaXRjaCh2aWRlbyk7CisKKyNpZm5kZWYgTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTCisJCS8qIFNldCBmdWxsc2NyZWVuIG1vZGUgaWYgYXBwcm9wcmlhdGUuCisJCSAgIFVnaCwgc2luY2Ugb3VyIGxpc3Qgb2YgdmFsaWQgdmlkZW8gbW9kZXMgY29tZXMgZnJvbQorCQkgICB0aGUgRGlyZWN0WCBkcml2ZXIsIHdlIG1heSBub3QgYWN0dWFsbHkgYmUgYWJsZSB0bworCQkgICBjaGFuZ2UgdG8gdGhlIGRlc2lyZWQgcmVzb2x1dGlvbiBoZXJlLgorCQkgICBGSVhNRTogU2hvdWxkIHdlIGRvIGEgY2xvc2VzdCBtYXRjaD8KKwkJICovCisJCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgeworCQkJREVWTU9ERSBzZXR0aW5nczsKKwkJCUJPT0wgY2hhbmdlZDsKKworCQkJU0RMX21lbXNldCgmc2V0dGluZ3MsIDAsIHNpemVvZihERVZNT0RFKSk7CisJCQlzZXR0aW5ncy5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7CisJCQlzZXR0aW5ncy5kbUJpdHNQZXJQZWwgPSB2aWRlby0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisJCQlzZXR0aW5ncy5kbVBlbHNXaWR0aCA9IHdpZHRoOworCQkJc2V0dGluZ3MuZG1QZWxzSGVpZ2h0ID0gaGVpZ2h0OworCQkJc2V0dGluZ3MuZG1GaWVsZHMgPSBETV9QRUxTV0lEVEggfCBETV9QRUxTSEVJR0hUIHwgRE1fQklUU1BFUlBFTDsKKwkJCWlmICggd2lkdGggPD0gKGludClTRExfZGVza3RvcF9tb2RlLmRtUGVsc1dpZHRoICYmCisJCQkgICAgIGhlaWdodCA8PSAoaW50KVNETF9kZXNrdG9wX21vZGUuZG1QZWxzSGVpZ2h0ICkgeworCQkJCXNldHRpbmdzLmRtRGlzcGxheUZyZXF1ZW5jeSA9IFNETF9kZXNrdG9wX21vZGUuZG1EaXNwbGF5RnJlcXVlbmN5OworCQkJCXNldHRpbmdzLmRtRmllbGRzIHw9IERNX0RJU1BMQVlGUkVRVUVOQ1k7CisJCQl9CisJCQljaGFuZ2VkID0gKENoYW5nZURpc3BsYXlTZXR0aW5ncygmc2V0dGluZ3MsIENEU19GVUxMU0NSRUVOKSA9PSBESVNQX0NIQU5HRV9TVUNDRVNTRlVMKTsKKwkJCWlmICggISBjaGFuZ2VkICYmIChzZXR0aW5ncy5kbUZpZWxkcyAmIERNX0RJU1BMQVlGUkVRVUVOQ1kpICkgeworCQkJCXNldHRpbmdzLmRtRmllbGRzICY9IH5ETV9ESVNQTEFZRlJFUVVFTkNZOworCQkJCWNoYW5nZWQgPSAoQ2hhbmdlRGlzcGxheVNldHRpbmdzKCZzZXR0aW5ncywgQ0RTX0ZVTExTQ1JFRU4pID09IERJU1BfQ0hBTkdFX1NVQ0NFU1NGVUwpOworCQkJfQorCQkJaWYgKCBjaGFuZ2VkICkgeworCQkJCXZpZGVvLT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKwkJCQlTRExfZnVsbHNjcmVlbl9tb2RlID0gc2V0dGluZ3M7CisJCQl9CisJCX0KKyNlbmRpZiAvKiAhTk9fQ0hBTkdFRElTUExBWVNFVFRJTkdTICovCisKKwkJc3R5bGUgPSBHZXRXaW5kb3dMb25nKFNETF9XaW5kb3csIEdXTF9TVFlMRSk7CisJCXN0eWxlICY9IH4ocmVzaXplc3R5bGV8V1NfTUFYSU1JWkUpOworCQlpZiAoIHZpZGVvLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOICkgeworCQkJc3R5bGUgJj0gfndpbmRvd3N0eWxlOworCQkJc3R5bGUgfD0gZGlyZWN0c3R5bGU7CisJCX0gZWxzZSB7CisJCQlpZiAoIGZsYWdzICYgU0RMX05PRlJBTUUgKSB7CisJCQkJc3R5bGUgJj0gfndpbmRvd3N0eWxlOworCQkJCXN0eWxlIHw9IGRpcmVjdHN0eWxlOworCQkJCXZpZGVvLT5mbGFncyB8PSBTRExfTk9GUkFNRTsKKwkJCX0gZWxzZSB7CisJCQkJc3R5bGUgJj0gfmRpcmVjdHN0eWxlOworCQkJCXN0eWxlIHw9IHdpbmRvd3N0eWxlOworCQkJCWlmICggZmxhZ3MgJiBTRExfUkVTSVpBQkxFICkgeworCQkJCQlzdHlsZSB8PSByZXNpemVzdHlsZTsKKwkJCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9SRVNJWkFCTEU7CisJCQkJfQorCQkJfQorI2lmIFdTX01BWElNSVpFCisJCQlpZiAoSXNab29tZWQoU0RMX1dpbmRvdykpIHN0eWxlIHw9IFdTX01BWElNSVpFOworI2VuZGlmCisJCX0KKworCQkvKiBESk06IERvbid0IHBpc3Mgb2YgYW55b25lIHdobyBoYXMgc2V0dXAgaGlzIG93biB3aW5kb3cgKi8KKwkJaWYgKCAhU0RMX3dpbmRvd2lkICkKKwkJCVNldFdpbmRvd0xvbmcoU0RMX1dpbmRvdywgR1dMX1NUWUxFLCBzdHlsZSk7CisKKwkJLyogUmVzaXplIHRoZSB3aW5kb3cgKGNvcGllZCBmcm9tIFNETCBXaW5ESUIgZHJpdmVyKSAqLworCQlpZiAoICFTRExfd2luZG93aWQgJiYgIUlzWm9vbWVkKFNETF9XaW5kb3cpICkgeworCQkJUkVDVCBib3VuZHM7CisJCQlpbnQgeCwgeTsKKwkJCUhXTkQgdG9wOworCQkJVUlOVCBzd3BfZmxhZ3M7CisJCQljb25zdCBjaGFyICp3aW5kb3cgPSBOVUxMOworCQkJY29uc3QgY2hhciAqY2VudGVyID0gTlVMTDsKKworCQkJaWYgKCB2aWRlby0+dyAhPSBwcmV2X3cgfHwgdmlkZW8tPmggIT0gcHJldl9oICkgeworCQkJCXdpbmRvdyA9IFNETF9nZXRlbnYoIlNETF9WSURFT19XSU5ET1dfUE9TIik7CisJCQkJY2VudGVyID0gU0RMX2dldGVudigiU0RMX1ZJREVPX0NFTlRFUkVEIik7CisJCQkJaWYgKCB3aW5kb3cgKSB7CisJCQkJCWlmICggU0RMX3NzY2FuZih3aW5kb3csICIlZCwlZCIsICZ4LCAmeSkgPT0gMiApIHsKKwkJCQkJCVNETF93aW5kb3dYID0geDsKKwkJCQkJCVNETF93aW5kb3dZID0geTsKKwkJCQkJfQorCQkJCQlpZiAoIFNETF9zdHJjbXAod2luZG93LCAiY2VudGVyIikgPT0gMCApIHsKKwkJCQkJCWNlbnRlciA9IHdpbmRvdzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXN3cF9mbGFncyA9IChTV1BfTk9DT1BZQklUUyB8IFNXUF9TSE9XV0lORE9XKTsKKworCQkJYm91bmRzLmxlZnQgPSBTRExfd2luZG93WDsKKwkJCWJvdW5kcy50b3AgPSBTRExfd2luZG93WTsKKwkJCWJvdW5kcy5yaWdodCA9IFNETF93aW5kb3dYK3ZpZGVvLT53OworCQkJYm91bmRzLmJvdHRvbSA9IFNETF93aW5kb3dZK3ZpZGVvLT5oOworCQkJQWRqdXN0V2luZG93UmVjdEV4KCZib3VuZHMsIEdldFdpbmRvd0xvbmcoU0RMX1dpbmRvdywgR1dMX1NUWUxFKSwgKEdldE1lbnUoU0RMX1dpbmRvdykgIT0gTlVMTCksIDApOworCQkJd2lkdGggPSBib3VuZHMucmlnaHQtYm91bmRzLmxlZnQ7CisJCQloZWlnaHQgPSBib3VuZHMuYm90dG9tLWJvdW5kcy50b3A7CisJCQlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSApIHsKKwkJCQl4ID0gKEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pLXdpZHRoKS8yOworCQkJCXkgPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTiktaGVpZ2h0KS8yOworCQkJfSBlbHNlIGlmICggY2VudGVyICkgeworCQkJCXggPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTiktd2lkdGgpLzI7CisJCQkJeSA9IChHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKS1oZWlnaHQpLzI7CisJCQl9IGVsc2UgaWYgKCBTRExfd2luZG93WCB8fCBTRExfd2luZG93WSB8fCB3aW5kb3cgKSB7CisJCQkJeCA9IGJvdW5kcy5sZWZ0OworCQkJCXkgPSBib3VuZHMudG9wOworCQkJfSBlbHNlIHsKKwkJCQl4ID0geSA9IC0xOworCQkJCXN3cF9mbGFncyB8PSBTV1BfTk9NT1ZFOworCQkJfQorCQkJaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgeworCQkJCXRvcCA9IEhXTkRfVE9QTU9TVDsKKwkJCX0gZWxzZSB7CisJCQkJdG9wID0gSFdORF9OT1RPUE1PU1Q7CisJCQl9CisJCQlTZXRXaW5kb3dQb3MoU0RMX1dpbmRvdywgdG9wLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzd3BfZmxhZ3MpOworCQkJaWYgKCAhKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkgeworCQkJCVNETF93aW5kb3dYID0gU0RMX2JvdW5kcy5sZWZ0OworCQkJCVNETF93aW5kb3dZID0gU0RMX2JvdW5kcy50b3A7CisJCQl9CisJCQlTZXRGb3JlZ3JvdW5kV2luZG93KFNETF9XaW5kb3cpOworCQl9CisJCVNETF9yZXNpemluZyA9IDA7CisKKwkJLyogU2V0IHVwIGZvciBPcGVuR0wgKi8KKwkJaWYgKCBXSU5fR0xfU2V0dXBXaW5kb3codGhpcykgPCAwICkgeworCQkJcmV0dXJuKE5VTEwpOworCQl9CisJCXZpZGVvLT5mbGFncyB8PSBTRExfT1BFTkdMOworCQlyZXR1cm4odmlkZW8pOworCX0KKworCS8qIFNldCB0aGUgYXBwcm9wcmlhdGUgd2luZG93IHN0eWxlICovCisJc3R5bGUgPSBHZXRXaW5kb3dMb25nKFNETF9XaW5kb3csIEdXTF9TVFlMRSk7CisJc3R5bGUgJj0gfihyZXNpemVzdHlsZXxXU19NQVhJTUlaRSk7CisJaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisJCXN0eWxlICY9IH53aW5kb3dzdHlsZTsKKwkJc3R5bGUgfD0gZGlyZWN0c3R5bGU7CisJfSBlbHNlIHsKKwkJaWYgKCBmbGFncyAmIFNETF9OT0ZSQU1FICkgeworCQkJc3R5bGUgJj0gfndpbmRvd3N0eWxlOworCQkJc3R5bGUgfD0gZGlyZWN0c3R5bGU7CisJCX0gZWxzZSB7CisJCQlzdHlsZSAmPSB+ZGlyZWN0c3R5bGU7CisJCQlzdHlsZSB8PSB3aW5kb3dzdHlsZTsKKwkJCWlmICggZmxhZ3MgJiBTRExfUkVTSVpBQkxFICkgeworCQkJCXN0eWxlIHw9IHJlc2l6ZXN0eWxlOworCQkJfQorCQl9CisjaWYgV1NfTUFYSU1JWkUKKwkJaWYgKElzWm9vbWVkKFNETF9XaW5kb3cpKSBzdHlsZSB8PSBXU19NQVhJTUlaRTsKKyNlbmRpZgorCX0KKwkvKiBESk06IERvbid0IHBpc3Mgb2YgYW55b25lIHdobyBoYXMgc2V0dXAgaGlzIG93biB3aW5kb3cgKi8KKwlpZiAoICFTRExfd2luZG93aWQgKQorCQlTZXRXaW5kb3dMb25nKFNETF9XaW5kb3csIEdXTF9TVFlMRSwgc3R5bGUpOworCisJLyogU2V0IERpcmVjdERyYXcgc2hhcmluZyBtb2RlLi4gZXhjbHVzaXZlIHdoZW4gZnVsbHNjcmVlbiAqLworCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgeworCQlzaGFyZW1vZGUgPSBERFNDTF9GVUxMU0NSRUVOfEREU0NMX0VYQ0xVU0lWRXxERFNDTF9BTExPV1JFQk9PVDsKKwl9IGVsc2UgeworCQlzaGFyZW1vZGUgPSBERFNDTF9OT1JNQUw7CisJfQorCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9TZXRDb29wZXJhdGl2ZUxldmVsKGRkcmF3MixTRExfV2luZG93LHNoYXJlbW9kZSk7CisJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCVNldEREZXJyb3IoIkRpcmVjdERyYXcyOjpTZXRDb29wZXJhdGl2ZUxldmVsIiwgcmVzdWx0KTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIFNldCB0aGUgZGlzcGxheSBtb2RlLCBpZiB3ZSBhcmUgaW4gZnVsbHNjcmVlbiBtb2RlICovCisJaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisJCVJFQ1QgYm91bmRzOworCQlzdHJ1Y3QgRFg1RW51bVJlY3QgKnJlY3Q7CisJCWludCBtYXhSZWZyZXNoUmF0ZTsKKworCQkvKiBDb3ZlciB1cCBkZXNrdG9wIGR1cmluZyBtb2RlIGNoYW5nZSAqLworCQlib3VuZHMubGVmdCA9IDA7CisJCWJvdW5kcy50b3AgPSAwOworCQlib3VuZHMucmlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKKwkJYm91bmRzLmJvdHRvbSA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pOworCQlBZGp1c3RXaW5kb3dSZWN0RXgoJmJvdW5kcywgR2V0V2luZG93TG9uZyhTRExfV2luZG93LCBHV0xfU1RZTEUpLCAoR2V0TWVudShTRExfV2luZG93KSAhPSBOVUxMKSwgMCk7CisJCVNldFdpbmRvd1BvcyhTRExfV2luZG93LCBIV05EX1RPUE1PU1QsCisJCQlib3VuZHMubGVmdCwgYm91bmRzLnRvcCwgCisJCQlib3VuZHMucmlnaHQgLSBib3VuZHMubGVmdCwKKwkJCWJvdW5kcy5ib3R0b20gLSBib3VuZHMudG9wLCBTV1BfTk9DT1BZQklUUyk7CisJCVNob3dXaW5kb3coU0RMX1dpbmRvdywgU1dfU0hPVyk7CisJCXdoaWxlICggR2V0Rm9yZWdyb3VuZFdpbmRvdygpICE9IFNETF9XaW5kb3cgKSB7CisJCQlTZXRGb3JlZ3JvdW5kV2luZG93KFNETF9XaW5kb3cpOworCQkJU0RMX0RlbGF5KDEwMCk7CisJCX0KKworCQkvKiBmaW5kIG1heGltdW0gbW9uaXRvciByZWZyZXNoIHJhdGUgZm9yIHRoaXMgcmVzb2x1dGlvbiAqLworCQkvKiBEbWl0cnkgWWFraW1vdiBmdGVjaEB0dWxhLm5ldCAqLworCQltYXhSZWZyZXNoUmF0ZSA9IDA7IC8qIHN5c3RlbSBkZWZhdWx0ICovCisJCWZvciAoIHJlY3QgPSBlbnVtbGlzdHNbYnBwIC8gOCAtIDFdOyByZWN0OyByZWN0ID0gcmVjdC0+bmV4dCApIHsKKwkJCWlmICggKHdpZHRoID09IHJlY3QtPnIudykgJiYgKGhlaWdodCA9PSByZWN0LT5yLmgpICkgeworCQkJCW1heFJlZnJlc2hSYXRlID0gcmVjdC0+cmVmcmVzaFJhdGU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNpZmRlZiBERFJBV19ERUJVRworIGZwcmludGYoc3RkZXJyLCAicmVmcmVzaCByYXRlID0gJWQgSHpcbiIsIG1heFJlZnJlc2hSYXRlKTsKKyNlbmRpZgorCisJCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9TZXREaXNwbGF5TW9kZShkZHJhdzIsIHdpZHRoLCBoZWlnaHQsIGJwcCwgbWF4UmVmcmVzaFJhdGUsIDApOworCQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9TZXREaXNwbGF5TW9kZShkZHJhdzIsIHdpZHRoLCBoZWlnaHQsIGJwcCwgMCwgMCk7CisJCQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJCQkvKiBXZSBjb3VsZG4ndCBzZXQgZnVsbHNjcmVlbiBtb2RlLCB0cnkgd2luZG93ICovCisJCQkJcmV0dXJuKERYNV9TZXRWaWRlb01vZGUodGhpcywgY3VycmVudCwgd2lkdGgsIGhlaWdodCwgYnBwLCBmbGFncyAmIH5TRExfRlVMTFNDUkVFTikpOyAKKwkJCX0KKwkJfQorCQlEWDVfRElucHV0UmVzZXQodGhpcywgMSk7CisJfSBlbHNlIHsKKwkJRFg1X0RJbnB1dFJlc2V0KHRoaXMsIDApOworCX0KKwlEWDVfVXBkYXRlVmlkZW9JbmZvKHRoaXMpOworCisJLyogQ3JlYXRlIGEgcHJpbWFyeSBEaXJlY3REcmF3IHN1cmZhY2UgKi8KKwlTRExfbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOworCWRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOworCWRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUzsKKwlkZHNkLmRkc0NhcHMuZHdDYXBzID0gKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0V8RERTQ0FQU19WSURFT01FTU9SWSk7CisJaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgIT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisJCS8qIFRoZXJlJ3Mgbm8gd2luZG93ZWQgZG91YmxlLWJ1ZmZlcmluZyAqLworCQlmbGFncyAmPSB+U0RMX0RPVUJMRUJVRjsKKwl9CisJaWYgKCAoZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGICkgeworCQlkZHNkLmR3RmxhZ3MgfD0gRERTRF9CQUNLQlVGRkVSQ09VTlQ7CisJCWRkc2QuZGRzQ2Fwcy5kd0NhcHMgfD0gKEREU0NBUFNfQ09NUExFWHxERFNDQVBTX0ZMSVApOworCQlkZHNkLmR3QmFja0J1ZmZlckNvdW50ID0gMTsKKwl9CisJcmVzdWx0ID0gSURpcmVjdERyYXcyX0NyZWF0ZVN1cmZhY2UoZGRyYXcyLCAmZGRzZCwgJmRkX3N1cmZhY2UxLCBOVUxMKTsgCisJaWYgKCAocmVzdWx0ICE9IEREX09LKSAmJiAoKGZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gU0RMX0RPVUJMRUJVRikgKSB7CisJCWRkc2QuZHdGbGFncyAmPSB+RERTRF9CQUNLQlVGRkVSQ09VTlQ7CisJCWRkc2QuZGRzQ2Fwcy5kd0NhcHMgJj0gfihERFNDQVBTX0NPTVBMRVh8RERTQ0FQU19GTElQKTsKKwkJZGRzZC5kd0JhY2tCdWZmZXJDb3VudCA9IDA7CisJCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlKGRkcmF3MiwKKwkJCQkJCSZkZHNkLCAmZGRfc3VyZmFjZTEsIE5VTEwpOyAKKwl9CisJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCVNldEREZXJyb3IoIkRpcmVjdERyYXcyOjpDcmVhdGVTdXJmYWNlKFBSSU1BUlkpIiwgcmVzdWx0KTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoZGRfc3VyZmFjZTEsCisJCQkmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTMsIChMUFZPSUQgKikmU0RMX3ByaW1hcnkpOworCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlTZXRERGVycm9yKCJEaXJlY3REcmF3U3VyZmFjZTo6UXVlcnlJbnRlcmZhY2UiLCByZXN1bHQpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCUlEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGRkX3N1cmZhY2UxKTsKKworCS8qIEdldCB0aGUgZm9ybWF0IG9mIHRoZSBwcmltYXJ5IERpcmVjdERyYXcgc3VyZmFjZSAqLworCVNETF9tZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CisJZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CisJZGRzZC5kd0ZsYWdzID0gRERTRF9QSVhFTEZPUk1BVHxERFNEX0NBUFM7CisJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19HZXRTdXJmYWNlRGVzYyhTRExfcHJpbWFyeSwgJmRkc2QpOworCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlTZXRERGVycm9yKCJEaXJlY3REcmF3U3VyZmFjZTo6R2V0U3VyZmFjZURlc2MiLCByZXN1bHQpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWlmICggISAoZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyZERFBGX1JHQikgKSB7CisJCVNETF9TZXRFcnJvcigiUHJpbWFyeSBERFJBVyBzdXJmYWNlIGlzIG5vdCBSR0IgZm9ybWF0Iik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBGcmVlIG9sZCBwYWxldHRlIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIHdlJ3JlIGluIDgtYml0IG1vZGUgKi8KKwlpZiAoIFNETF9wYWxldHRlICE9IE5VTEwgKSB7CisJCUlEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKFNETF9wYWxldHRlKTsKKwkJU0RMX3BhbGV0dGUgPSBOVUxMOworCX0KKyNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKKwlpZiAoIGRkc2QuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgPT0gOCApIHsKKyNlbHNlCisJaWYgKCBkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JHQkJpdENvdW50ID09IDggKSB7CisjZW5kaWYKKwkJaW50IGk7CisKKwkJaWYgKCAoZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisJCQkvKiBXZSBoYXZlIGFjY2VzcyB0byB0aGUgZW50aXJlIHBhbGV0dGUgKi8KKwkJCWZvciAoIGk9MDsgaTwyNTY7ICsraSApIHsKKwkJCQlTRExfY29sb3JzW2ldLnBlRmxhZ3MgPQorCQkJCQkJKFBDX05PQ09MTEFQU0V8UENfUkVTRVJWRUQpOworCQkJCVNETF9jb2xvcnNbaV0ucGVSZWQgPSAwOworCQkJCVNETF9jb2xvcnNbaV0ucGVHcmVlbiA9IDA7CisJCQkJU0RMX2NvbG9yc1tpXS5wZUJsdWUgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRmlyc3QgMTAgY29sb3JzIGFyZSByZXNlcnZlZCBieSBXaW5kb3dzICovCisJCQlmb3IgKCBpPTA7IGk8MTA7ICsraSApIHsKKwkJCQlTRExfY29sb3JzW2ldLnBlRmxhZ3MgPSBQQ19FWFBMSUNJVDsKKwkJCQlTRExfY29sb3JzW2ldLnBlUmVkID0gaTsKKwkJCQlTRExfY29sb3JzW2ldLnBlR3JlZW4gPSAwOworCQkJCVNETF9jb2xvcnNbaV0ucGVCbHVlID0gMDsKKwkJCX0KKwkJCWZvciAoIGk9MTA7IGk8KDEwKzIzNik7ICsraSApIHsKKwkJCQlTRExfY29sb3JzW2ldLnBlRmxhZ3MgPSBQQ19OT0NPTExBUFNFOworCQkJCVNETF9jb2xvcnNbaV0ucGVSZWQgPSAwOworCQkJCVNETF9jb2xvcnNbaV0ucGVHcmVlbiA9IDA7CisJCQkJU0RMX2NvbG9yc1tpXS5wZUJsdWUgPSAwOworCQkJfQorCQkJLyogTGFzdCAxMCBjb2xvcnMgYXJlIHJlc2VydmVkIGJ5IFdpbmRvd3MgKi8KKwkJCWZvciAoIGk9MjQ2OyBpPDI1NjsgKytpICkgeworCQkJCVNETF9jb2xvcnNbaV0ucGVGbGFncyA9IFBDX0VYUExJQ0lUOworCQkJCVNETF9jb2xvcnNbaV0ucGVSZWQgPSBpOworCQkJCVNETF9jb2xvcnNbaV0ucGVHcmVlbiA9IDA7CisJCQkJU0RMX2NvbG9yc1tpXS5wZUJsdWUgPSAwOworCQkJfQorCQl9CisJCXJlc3VsdCA9IElEaXJlY3REcmF3Ml9DcmVhdGVQYWxldHRlKGRkcmF3MiwKKwkJICAgICAJCQkoRERQQ0FQU184QklUfEREUENBUFNfQUxMT1cyNTYpLAorCQkJCQkJU0RMX2NvbG9ycywgJlNETF9wYWxldHRlLCBOVUxMKTsKKwkJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCQlTZXRERGVycm9yKCJEaXJlY3REcmF3Mjo6Q3JlYXRlUGFsZXR0ZSIsIHJlc3VsdCk7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKwkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19TZXRQYWxldHRlKFNETF9wcmltYXJ5LAorCQkJCQkJCQlTRExfcGFsZXR0ZSk7CisJCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpTZXRQYWxldHRlIiwgcmVzdWx0KTsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCX0KKworCS8qIENyZWF0ZSBvdXIgdmlkZW8gc3VyZmFjZSB1c2luZyB0aGUgc2FtZSBwaXhlbCBmb3JtYXQgKi8KKwl2aWRlbyA9IGN1cnJlbnQ7CisJaWYgKCAod2lkdGggIT0gdmlkZW8tPncpIHx8IChoZWlnaHQgIT0gdmlkZW8tPmgpCisJCQl8fCAodmlkZW8tPmZvcm1hdC0+Qml0c1BlclBpeGVsICE9IAorI2lmIGRlZmluZWQoTk9OQU1FTEVTU1VOSU9OKQorCQkJCWRkc2QuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQpICkgeworI2Vsc2UKKwkJCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JHQkJpdENvdW50KSApIHsKKyNlbmRpZgorCQlTRExfRnJlZVN1cmZhY2UodmlkZW8pOworCQl2aWRlbyA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsIDAsIDAsCisjaWYgZGVmaW5lZChOT05BTUVMRVNTVU5JT04pCisJCQkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCwKKwkJCQkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdSQml0TWFzaywKKwkJCQkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTMuZHdHQml0TWFzaywKKwkJCQkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdCQml0TWFzaywKKyNlbHNlCisJCQkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdSR0JCaXRDb3VudCwKKwkJCQkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdSQml0TWFzaywKKwkJCQkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdHQml0TWFzaywKKwkJCQkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdCQml0TWFzaywKKyNlbmRpZgorCQkJCQkJCQkwKTsKKwkJaWYgKCB2aWRlbyA9PSBOVUxMICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKwkJcHJldl93ID0gdmlkZW8tPnc7CisJCXByZXZfaCA9IHZpZGVvLT5oOworCQl2aWRlby0+dyA9IHdpZHRoOworCQl2aWRlby0+aCA9IGhlaWdodDsKKwkJdmlkZW8tPnBpdGNoID0gMDsKKwl9CisJdmlkZW8tPmZsYWdzID0gMDsJLyogQ2xlYXIgZmxhZ3MgKi8KKworCS8qIElmIG5vdCBmdWxsc2NyZWVuLCBsb2NraW5nIGlzIHBvc3NpYmxlLCBidXQgaXQgZG9lc24ndCBkbyB3aGF0IAorCSAgIHRoZSBjYWxsZXIgcmVhbGx5IGV4cGVjdHMgLS0gaWYgdGhlIGxvY2tlZCBzdXJmYWNlIGlzIHdyaXR0ZW4gdG8sCisJICAgdGhlIGFwcHJvcHJpYXRlIHBvcnRpb24gb2YgdGhlIGVudGlyZSBzY3JlZW4gaXMgbW9kaWZpZWQsIG5vdCAKKwkgICB0aGUgYXBwbGljYXRpb24gd2luZG93LCBhcyB3ZSB3b3VsZCBsaWtlLgorCSAgIE5vdGUgdGhhdCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byB3cml0ZSBkaXJlY3RseSB0byBkaXNwbGF5CisJICAgbWVtb3J5LCBidXQgdGhlIGFwcGxpY2F0aW9uIG11c3QgcmVzcGVjdCB0aGUgY2xpcCBsaXN0IG9mCisJICAgdGhlIHN1cmZhY2UuICBUaGVyZSBtaWdodCBiZSBzb21lIG9kZCB0aW1pbmcgaW50ZXJhY3Rpb25zCisJICAgaW52b2x2aW5nIGNsaXAgbGlzdCB1cGRhdGVzIGFuZCBiYWNrZ3JvdW5kIHJlZnJlc2hpbmcgYXMKKwkgICBXaW5kb3dzIG1vdmVzIG90aGVyIHdpbmRvd3MgYWNyb3NzIG91ciB3aW5kb3cuCisJICAgV2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgdGhpcywgZXZlbiB0aG91Z2ggaXQgbWlnaHQgYmUgYQorCSAgIGdvb2QgaWRlYSBzaW5jZSBCZU9TIGhhcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCRGlyZWN0V2luZG93CisJICAgdGhhdCBkb2VzIHRoZSBzYW1lIHRoaW5nLiAgVGhpcyB3b3VsZCBiZSBtb3N0IHVzZWZ1bCBmb3IKKwkgICBhcHBsaWNhdGlvbnMgdGhhdCBkbyBjb21wbGV0ZSBzY3JlZW4gdXBkYXRlcyBldmVyeSBmcmFtZS4KKwkgICAgLS0gRml4bWU/CisJKi8KKwlpZiAoIChmbGFncyAmIFNETF9GVUxMU0NSRUVOKSAhPSBTRExfRlVMTFNDUkVFTiApIHsKKwkJLyogTmVjZXNzYXJ5IGlmIHdlJ3JlIGdvaW5nIGZyb20gZnVsbHNjcmVlbiB0byB3aW5kb3cgKi8KKwkJaWYgKCB2aWRlby0+cGl4ZWxzID09IE5VTEwgKSB7CisJCQl2aWRlby0+cGl0Y2ggPSAod2lkdGgqdmlkZW8tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCk7CisJCQkvKiBQaXRjaCBuZWVkcyB0byBiZSBRV09SRCAoOC1ieXRlKSBhbGlnbmVkICovCisJCQl2aWRlby0+cGl0Y2ggPSAodmlkZW8tPnBpdGNoICsgNykgJiB+NzsKKwkJCXZpZGVvLT5waXhlbHMgPSAodm9pZCAqKVNETF9tYWxsb2ModmlkZW8tPmgqdmlkZW8tPnBpdGNoKTsKKwkJCWlmICggdmlkZW8tPnBpeGVscyA9PSBOVUxMICkgeworCQkJCWlmICggdmlkZW8gIT0gY3VycmVudCApIHsKKwkJCQkJU0RMX0ZyZWVTdXJmYWNlKHZpZGVvKTsKKwkJCQl9CisJCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQl9CisJCWRkX3N1cmZhY2UzID0gTlVMTDsKKyNpZiAwIC8qIEZJWE1FOiBlbmFibGUgdGhpcyB3aGVuIFNETCBjb25zaXN0ZW50bHkgcmVwb3J0cyBsb3N0IHN1cmZhY2VzICovCisJCWlmICggKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX0hXU1VSRkFDRSApIHsKKwkJCXZpZGVvLT5mbGFncyB8PSBTRExfSFdTVVJGQUNFOworCQl9IGVsc2UgeworCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9TV1NVUkZBQ0U7CisJCX0KKyNlbHNlCisJCXZpZGVvLT5mbGFncyB8PSBTRExfU1dTVVJGQUNFOworI2VuZGlmCisJCWlmICggKGZsYWdzICYgU0RMX1JFU0laQUJMRSkgJiYgIShmbGFncyAmIFNETF9OT0ZSQU1FKSApIHsKKwkJCXZpZGVvLT5mbGFncyB8PSBTRExfUkVTSVpBQkxFOworCQl9CisJCWlmICggZmxhZ3MgJiBTRExfTk9GUkFNRSApIHsKKwkJCXZpZGVvLT5mbGFncyB8PSBTRExfTk9GUkFNRTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5lY2Vzc2FyeSBpZiB3ZSdyZSBnb2luZyBmcm9tIHdpbmRvdyB0byBmdWxsc2NyZWVuICovCisJCWlmICggdmlkZW8tPnBpeGVscyAhPSBOVUxMICkgeworCQkJU0RMX2ZyZWUodmlkZW8tPnBpeGVscyk7CisJCQl2aWRlby0+cGl4ZWxzID0gTlVMTDsKKwkJfQorCQlkZF9zdXJmYWNlMyA9IFNETF9wcmltYXJ5OworCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKKwl9CisKKwkvKiBTZWUgaWYgdGhlIHByaW1hcnkgc3VyZmFjZSBoYXMgZG91YmxlLWJ1ZmZlcmluZyBlbmFibGVkICovCisJaWYgKCAoZGRzZC5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfRkxJUCkgPT0gRERTQ0FQU19GTElQICkgeworCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX0RPVUJMRUJVRjsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgU0RMIHN1cmZhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5IHN1cmZhY2UgKi8KKwlpZiAoIERYNV9BbGxvY0REU3VyZmFjZSh0aGlzLCB2aWRlbywgZGRfc3VyZmFjZTMsCisJICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmZsYWdzJlNETF9IV1NVUkZBQ0UpIDwgMCApIHsKKwkJaWYgKCB2aWRlbyAhPSBjdXJyZW50ICkgeworCQkJU0RMX0ZyZWVTdXJmYWNlKHZpZGVvKTsKKwkJfQorCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogVXNlIHRoZSBhcHByb3ByaWF0ZSBibGl0dGluZyBmdW5jdGlvbiAqLworCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pID09IFNETF9GVUxMU0NSRUVOICkgeworCQl2aWRlby0+ZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisJCWlmICggdmlkZW8tPmZvcm1hdC0+cGFsZXR0ZSAhPSBOVUxMICkgeworCQkJdmlkZW8tPmZsYWdzIHw9IFNETF9IV1BBTEVUVEU7CisJCX0KKwkJdGhpcy0+VXBkYXRlUmVjdHMgPSBEWDVfRGlyZWN0VXBkYXRlOworCX0gZWxzZSB7CisJCXRoaXMtPlVwZGF0ZVJlY3RzID0gRFg1X1dpbmRvd1VwZGF0ZTsKKwl9CisKKwkvKiBNYWtlIG91ciB3aW5kb3cgdGhlIHByb3BlciBzaXplLCBzZXQgdGhlIGNsaXBwZXIsIHRoZW4gc2hvdyBpdCAqLworCWlmICggKGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICE9IFNETF9GVUxMU0NSRUVOICkgeworCQkvKiBDcmVhdGUgYW5kIHNldCBhIGNsaXBwZXIgb24gb3VyIHByaW1hcnkgc3VyZmFjZSAqLworCQlpZiAoIFNETF9jbGlwcGVyID09IE5VTEwgKSB7CisJCQlyZXN1bHQgPSBJRGlyZWN0RHJhdzJfQ3JlYXRlQ2xpcHBlcihkZHJhdzIsCisJCQkJCQkJMCwgJlNETF9jbGlwcGVyLCBOVUxMKTsKKwkJCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQkJCWlmICggdmlkZW8gIT0gY3VycmVudCApIHsKKwkJCQkJU0RMX0ZyZWVTdXJmYWNlKHZpZGVvKTsKKwkJCQl9CisJCQkJU2V0RERlcnJvcigiRGlyZWN0RHJhdzI6OkNyZWF0ZUNsaXBwZXIiLHJlc3VsdCk7CisJCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQl9CisJCXJlc3VsdCA9IElEaXJlY3REcmF3Q2xpcHBlcl9TZXRIV25kKFNETF9jbGlwcGVyLCAwLCBTRExfV2luZG93KTsKKwkJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCQlpZiAoIHZpZGVvICE9IGN1cnJlbnQgKSB7CisJCQkJU0RMX0ZyZWVTdXJmYWNlKHZpZGVvKTsKKwkJCX0KKwkJCVNldEREZXJyb3IoIkRpcmVjdERyYXdDbGlwcGVyOjpTZXRIV25kIiwgcmVzdWx0KTsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX1NldENsaXBwZXIoU0RMX3ByaW1hcnksCisJCQkJCQkJCVNETF9jbGlwcGVyKTsKKwkJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCQlpZiAoIHZpZGVvICE9IGN1cnJlbnQgKSB7CisJCQkJU0RMX0ZyZWVTdXJmYWNlKHZpZGVvKTsKKwkJCX0KKwkJCVNldEREZXJyb3IoIkRpcmVjdERyYXdTdXJmYWNlMzo6U2V0Q2xpcHBlciIsIHJlc3VsdCk7CisJCQlyZXR1cm4oTlVMTCk7CisJCX0KKworCQkvKiBSZXNpemUgdGhlIHdpbmRvdyAoY29waWVkIGZyb20gU0RMIFdpbkRJQiBkcml2ZXIpICovCisJCWlmICggIVNETF93aW5kb3dpZCAmJiAhSXNab29tZWQoU0RMX1dpbmRvdykgKSB7CisJCQlSRUNUIGJvdW5kczsKKwkJCWludCAgeCwgeTsKKwkJCVVJTlQgc3dwX2ZsYWdzOworCQkJY29uc3QgY2hhciAqd2luZG93ID0gTlVMTDsKKwkJCWNvbnN0IGNoYXIgKmNlbnRlciA9IE5VTEw7CisKKwkJCWlmICggdmlkZW8tPncgIT0gcHJldl93IHx8IHZpZGVvLT5oICE9IHByZXZfaCApIHsKKwkJCQl3aW5kb3cgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fV0lORE9XX1BPUyIpOworCQkJCWNlbnRlciA9IFNETF9nZXRlbnYoIlNETF9WSURFT19DRU5URVJFRCIpOworCQkJCWlmICggd2luZG93ICkgeworCQkJCQlpZiAoIFNETF9zc2NhbmYod2luZG93LCAiJWQsJWQiLCAmeCwgJnkpID09IDIgKSB7CisJCQkJCQlTRExfd2luZG93WCA9IHg7CisJCQkJCQlTRExfd2luZG93WSA9IHk7CisJCQkJCX0KKwkJCQkJaWYgKCBTRExfc3RyY21wKHdpbmRvdywgImNlbnRlciIpID09IDAgKSB7CisJCQkJCQljZW50ZXIgPSB3aW5kb3c7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzd3BfZmxhZ3MgPSBTV1BfTk9DT1BZQklUUzsKKworCQkJYm91bmRzLmxlZnQgPSBTRExfd2luZG93WDsKKwkJCWJvdW5kcy50b3AgPSBTRExfd2luZG93WTsKKwkJCWJvdW5kcy5yaWdodCA9IFNETF93aW5kb3dYK3ZpZGVvLT53OworCQkJYm91bmRzLmJvdHRvbSA9IFNETF93aW5kb3dZK3ZpZGVvLT5oOworCQkJQWRqdXN0V2luZG93UmVjdEV4KCZib3VuZHMsIEdldFdpbmRvd0xvbmcoU0RMX1dpbmRvdywgR1dMX1NUWUxFKSwgKEdldE1lbnUoU0RMX1dpbmRvdykgIT0gTlVMTCksIDApOworCQkJd2lkdGggPSBib3VuZHMucmlnaHQtYm91bmRzLmxlZnQ7CisJCQloZWlnaHQgPSBib3VuZHMuYm90dG9tLWJvdW5kcy50b3A7CisJCQlpZiAoIGNlbnRlciApIHsKKwkJCQl4ID0gKEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pLXdpZHRoKS8yOworCQkJCXkgPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTiktaGVpZ2h0KS8yOworCQkJfSBlbHNlIGlmICggU0RMX3dpbmRvd1ggfHwgU0RMX3dpbmRvd1kgfHwgd2luZG93ICkgeworCQkJCXggPSBib3VuZHMubGVmdDsKKwkJCQl5ID0gYm91bmRzLnRvcDsKKwkJCX0gZWxzZSB7CisJCQkJeCA9IHkgPSAtMTsKKwkJCQlzd3BfZmxhZ3MgfD0gU1dQX05PTU9WRTsKKwkJCX0KKwkJCVNldFdpbmRvd1BvcyhTRExfV2luZG93LCBIV05EX05PVE9QTU9TVCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgc3dwX2ZsYWdzKTsKKwkJCVNETF93aW5kb3dYID0gU0RMX2JvdW5kcy5sZWZ0OworCQkJU0RMX3dpbmRvd1kgPSBTRExfYm91bmRzLnRvcDsKKwkJfQorCisJfQorCVNob3dXaW5kb3coU0RMX1dpbmRvdywgU1dfU0hPVyk7CisJU2V0Rm9yZWdyb3VuZFdpbmRvdyhTRExfV2luZG93KTsKKwlTRExfcmVzaXppbmcgPSAwOworCisJLyogSkMgMTQgTWFyIDIwMDYKKwkJRmx1c2ggdGhlIG1lc3NhZ2UgbG9vcCBvciB0aGlzIGNhbiBjYXVzZSBiaWcgcHJvYmxlbXMgbGF0ZXIKKwkJRXNwZWNpYWxseSBpZiB0aGUgdXNlciBkZWNpZGVzIHRvIHVzZSBkaWFsb2cgYm94ZXMgb3IgYXNzZXJ0KCkhCisJKi8KKwlXSU5fRmx1c2hNZXNzYWdlUXVldWUoKTsKKworCS8qIFdlJ3JlIGxpdmUhICovCisJcmV0dXJuKHZpZGVvKTsKK30KKworc3RydWN0IHByaXZhdGVfaHdkYXRhIHsKKwlMUERJUkVDVERSQVdTVVJGQUNFMyBkZF9zdXJmYWNlOworCUxQRElSRUNURFJBV1NVUkZBQ0UzIGRkX3dyaXRlYnVmOworfTsKKworc3RhdGljIGludCBEWDVfQWxsb2NERFN1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlLCAKKwkJCQlMUERJUkVDVERSQVdTVVJGQUNFMyByZXF1ZXN0ZWQsIFVpbnQzMiBmbGFnKQoreworCUxQRElSRUNURFJBV1NVUkZBQ0UgIGRkX3N1cmZhY2UxOworCUxQRElSRUNURFJBV1NVUkZBQ0UzIGRkX3N1cmZhY2UzOworCUREU1VSRkFDRURFU0MgZGRzZDsKKwlIUkVTVUxUIHJlc3VsdDsKKworCS8qIENsZWFyIHRoZSBoYXJkd2FyZSBmbGFnLCBpbiBjYXNlIHdlIGZhaWwgKi8KKwlzdXJmYWNlLT5mbGFncyAmPSB+ZmxhZzsKKworCS8qIEFsbG9jYXRlIHRoZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZGF0YSAqLworCXN1cmZhY2UtPmh3ZGF0YSA9IChzdHJ1Y3QgcHJpdmF0ZV9od2RhdGEgKikKKwkJCQkJU0RMX21hbGxvYyhzaXplb2YoKnN1cmZhY2UtPmh3ZGF0YSkpOworCWlmICggc3VyZmFjZS0+aHdkYXRhID09IE5VTEwgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oLTEpOworCX0KKwlkZF9zdXJmYWNlMyA9IE5VTEw7CisKKwkvKiBTZXQgdXAgdGhlIHN1cmZhY2UgZGVzY3JpcHRpb24gKi8KKwlTRExfbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOworCWRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOworCWRkc2QuZHdGbGFncyA9IChERFNEX1dJRFRIfEREU0RfSEVJR0hUfEREU0RfQ0FQU3wKKwkJCQkJRERTRF9QSVRDSHxERFNEX1BJWEVMRk9STUFUKTsKKwlkZHNkLmR3V2lkdGggPSBzdXJmYWNlLT53OworCWRkc2QuZHdIZWlnaHQ9IHN1cmZhY2UtPmg7CisjaWYgZGVmaW5lZChOT05BTUVMRVNTVU5JT04pCisJZGRzZC51MS5sUGl0Y2ggPSBzdXJmYWNlLT5waXRjaDsKKyNlbHNlCisJZGRzZC5sUGl0Y2ggPSBzdXJmYWNlLT5waXRjaDsKKyNlbmRpZgorCWlmICggKGZsYWcgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgeworCQlkZHNkLmRkc0NhcHMuZHdDYXBzID0KKwkJCQkoRERTQ0FQU19PRkZTQ1JFRU5QTEFJTnxERFNDQVBTX1ZJREVPTUVNT1JZKTsKKwl9IGVsc2UgeworCQlkZHNkLmRkc0NhcHMuZHdDYXBzID0KKwkJCQkoRERTQ0FQU19PRkZTQ1JFRU5QTEFJTnxERFNDQVBTX1NZU1RFTU1FTU9SWSk7CisJfQorCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSA9IHNpemVvZihkZHNkLmRkcGZQaXhlbEZvcm1hdCk7CisJZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9IEREUEZfUkdCOworCWlmICggc3VyZmFjZS0+Zm9ybWF0LT5wYWxldHRlICkgeworCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzIHw9IEREUEZfUEFMRVRURUlOREVYRUQ4OworCX0KKyNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKKwlkZHNkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50ID0gc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWw7CisJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdSQml0TWFzayA9IHN1cmZhY2UtPmZvcm1hdC0+Um1hc2s7CisJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTMuZHdHQml0TWFzayA9IHN1cmZhY2UtPmZvcm1hdC0+R21hc2s7CisJZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdCQml0TWFzayA9IHN1cmZhY2UtPmZvcm1hdC0+Qm1hc2s7CisjZWxzZQorCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3UkdCQml0Q291bnQgPSBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbDsKKwlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JCaXRNYXNrID0gc3VyZmFjZS0+Zm9ybWF0LT5SbWFzazsKKwlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0dCaXRNYXNrID0gc3VyZmFjZS0+Zm9ybWF0LT5HbWFzazsKKwlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0JCaXRNYXNrID0gc3VyZmFjZS0+Zm9ybWF0LT5CbWFzazsKKyNlbmRpZgorCisJLyogQ3JlYXRlIHRoZSBEaXJlY3REcmF3IHZpZGVvIHN1cmZhY2UgKi8KKwlpZiAoIHJlcXVlc3RlZCAhPSBOVUxMICkgeworCQlkZF9zdXJmYWNlMyA9IHJlcXVlc3RlZDsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBJRGlyZWN0RHJhdzJfQ3JlYXRlU3VyZmFjZShkZHJhdzIsCisJCQkJCQkmZGRzZCwgJmRkX3N1cmZhY2UxLCBOVUxMKTsgCisJCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQkJU2V0RERlcnJvcigiRGlyZWN0RHJhdzI6OkNyZWF0ZVN1cmZhY2UiLCByZXN1bHQpOworCQkJZ290byBlcnJvcl9lbmQ7CisJCX0KKwkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlKGRkX3N1cmZhY2UxLAorCQkJJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UzLCAoTFBWT0lEICopJmRkX3N1cmZhY2UzKTsKKwkJSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoZGRfc3VyZmFjZTEpOworCQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJCVNldEREZXJyb3IoIkRpcmVjdERyYXdTdXJmYWNlOjpRdWVyeUludGVyZmFjZSIsIHJlc3VsdCk7CisJCQlnb3RvIGVycm9yX2VuZDsKKwkJfQorCX0KKworCWlmICggKGZsYWcgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgeworCQkvKiBDaGVjayB0byBzZWUgd2hldGhlciB0aGUgc3VyZmFjZSBhY3R1YWxseSBlbmRlZCB1cAorCQkgICBpbiB2aWRlbyBtZW1vcnksIGFuZCBmYWlsIGlmIG5vdC4gIFdlIGV4cGVjdCB0aGUKKwkJICAgc3VyZmFjZXMgd2UgY3JlYXRlIGhlcmUgdG8gYWN0dWFsbHkgYmUgaW4gaGFyZHdhcmUhCisJCSovCisJCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfR2V0Q2FwcyhkZF9zdXJmYWNlMywmZGRzZC5kZHNDYXBzKTsKKwkJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCQlTZXRERGVycm9yKCJEaXJlY3REcmF3U3VyZmFjZTM6OkdldENhcHMiLCByZXN1bHQpOworCQkJZ290byBlcnJvcl9lbmQ7CisJCX0KKwkJaWYgKCAoZGRzZC5kZHNDYXBzLmR3Q2FwcyZERFNDQVBTX1ZJREVPTUVNT1JZKSAhPQorCQkJCQkJCUREU0NBUFNfVklERU9NRU1PUlkgKSB7CisJCQlTRExfU2V0RXJyb3IoIk5vIHJvb20gaW4gdmlkZW8gbWVtb3J5Iik7CisJCQlnb3RvIGVycm9yX2VuZDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFRyeSB0byBob29rIG91ciBzdXJmYWNlIG1lbW9yeSAqLworCQlkZHNkLmR3RmxhZ3MgPSBERFNEX0xQU1VSRkFDRTsKKwkJZGRzZC5scFN1cmZhY2UgPSBzdXJmYWNlLT5waXhlbHM7CisJCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfU2V0U3VyZmFjZURlc2MoZGRfc3VyZmFjZTMsCisJCQkJCQkJCSZkZHNkLCAwKTsKKwkJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCQlTZXRERGVycm9yKCJEaXJlY3REcmF3Mjo6U2V0U3VyZmFjZURlc2MiLCByZXN1bHQpOworCQkJZ290byBlcnJvcl9lbmQ7CisJCX0KKwkKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlIHN1cmZhY2UgZm9ybWF0IHdhcyBzZXQgcHJvcGVybHkgKi8KKwlTRExfbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOworCWRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOworCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfTG9jayhkZF9zdXJmYWNlMywgTlVMTCwKKwkJJmRkc2QsIChERExPQ0tfTk9TWVNMT0NLfERETE9DS19XQUlUKSwgTlVMTCk7CisJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCVNldEREZXJyb3IoIkRpcmVjdERyYXdTdXJmYWNlMzo6TG9jayIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfZW5kOworCX0KKwlJRGlyZWN0RHJhd1N1cmZhY2UzX1VubG9jayhkZF9zdXJmYWNlMywgTlVMTCk7CisKKwlpZiAoIChmbGFnICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX1NXU1VSRkFDRSApIHsKKwkJaWYgKCBkZHNkLmxwU3VyZmFjZSAhPSBzdXJmYWNlLT5waXhlbHMgKSB7CisJCQlTRExfU2V0RXJyb3IoIkREcmF3IGRpZG4ndCB1c2UgU0RMIHN1cmZhY2UgbWVtb3J5Iik7CisJCQlnb3RvIGVycm9yX2VuZDsKKwkJfQorCQlpZiAoCisjaWYgZGVmaW5lZChOT05BTUVMRVNTVU5JT04pCisJCQlkZHNkLnUxLmxQaXRjaAorI2Vsc2UKKwkJCWRkc2QubFBpdGNoCisjZW5kaWYKKwkJCQkgIT0gKExPTkcpc3VyZmFjZS0+cGl0Y2ggKSB7CisJCQlTRExfU2V0RXJyb3IoIkREcmF3IGNyZWF0ZWQgc3VyZmFjZSB3aXRoIHdyb25nIHBpdGNoIik7CisJCQlnb3RvIGVycm9yX2VuZDsKKwkJfQorCX0gZWxzZSB7CisjaWYgZGVmaW5lZChOT05BTUVMRVNTVU5JT04pCisJCXN1cmZhY2UtPnBpdGNoID0gKFVpbnQxNilkZHNkLnUxLmxQaXRjaDsKKyNlbHNlCisJCXN1cmZhY2UtPnBpdGNoID0gKFVpbnQxNilkZHNkLmxQaXRjaDsKKyNlbmRpZgorCX0KKyNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKKwlpZiAoIChkZHNkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50ICE9IAorCQkJCQlzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCkgfHwKKwkgICAgIChkZHNkLmRkcGZQaXhlbEZvcm1hdC51Mi5kd1JCaXRNYXNrICE9IHN1cmZhY2UtPmZvcm1hdC0+Um1hc2spIHx8CisJICAgICAoZGRzZC5kZHBmUGl4ZWxGb3JtYXQudTMuZHdHQml0TWFzayAhPSBzdXJmYWNlLT5mb3JtYXQtPkdtYXNrKSB8fAorCSAgICAgKGRkc2QuZGRwZlBpeGVsRm9ybWF0LnU0LmR3QkJpdE1hc2sgIT0gc3VyZmFjZS0+Zm9ybWF0LT5CbWFzaykgKXsKKyNlbHNlCisJaWYgKCAoZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdSR0JCaXRDb3VudCAhPSAKKwkJCQkJc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpIHx8CisJICAgICAoZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdSQml0TWFzayAhPSBzdXJmYWNlLT5mb3JtYXQtPlJtYXNrKSB8fAorCSAgICAgKGRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3R0JpdE1hc2sgIT0gc3VyZmFjZS0+Zm9ybWF0LT5HbWFzaykgfHwKKwkgICAgIChkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0JCaXRNYXNrICE9IHN1cmZhY2UtPmZvcm1hdC0+Qm1hc2spICl7CisjZW5kaWYKKwkJU0RMX1NldEVycm9yKCJERHJhdyBkaWRuJ3QgdXNlIFNETCBzdXJmYWNlIGRlc2NyaXB0aW9uIik7CisJCWdvdG8gZXJyb3JfZW5kOworCX0KKwlpZiAoIChkZHNkLmR3V2lkdGggIT0gKERXT1JEKXN1cmZhY2UtPncpIHx8CisJCShkZHNkLmR3SGVpZ2h0ICE9IChEV09SRClzdXJmYWNlLT5oKSApIHsKKwkJU0RMX1NldEVycm9yKCJERHJhdyBjcmVhdGVkIHN1cmZhY2Ugd2l0aCB3cm9uZyBzaXplIik7CisJCWdvdG8gZXJyb3JfZW5kOworCX0KKworCS8qIFNldCB0aGUgc3VyZmFjZSBwcml2YXRlIGRhdGEgKi8KKwlzdXJmYWNlLT5mbGFncyB8PSBmbGFnOworCXN1cmZhY2UtPmh3ZGF0YS0+ZGRfc3VyZmFjZSA9IGRkX3N1cmZhY2UzOworCWlmICggKHN1cmZhY2UtPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gU0RMX0RPVUJMRUJVRiApIHsKKwkJTFBESVJFQ1REUkFXU1VSRkFDRTMgZGRfd3JpdGVidWY7CisKKwkJZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfQkFDS0JVRkZFUjsKKwkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19HZXRBdHRhY2hlZFN1cmZhY2UoZGRfc3VyZmFjZTMsCisJCQkJCQkmZGRzZC5kZHNDYXBzLCAmZGRfd3JpdGVidWYpOworCQlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJCVNldEREZXJyb3IoIkRpcmVjdERyYXdTdXJmYWNlMzo6R2V0QXR0YWNoZWRTdXJmYWNlIiwKKwkJCQkJCQkJcmVzdWx0KTsKKwkJfSBlbHNlIHsKKwkJCWRkX3N1cmZhY2UzID0gZGRfd3JpdGVidWY7CisJCX0KKwl9CisJc3VyZmFjZS0+aHdkYXRhLT5kZF93cml0ZWJ1ZiA9IGRkX3N1cmZhY2UzOworCisJLyogV2UncmUgcmVhZHkgdG8gZ28hICovCisJcmV0dXJuKDApOworCisJLyogT2theSwgc28gZ290bydzIGFyZSBjaGVlc3ksIGJ1dCB0aGVyZSBhcmUgc28gbWFueSBwb3NzaWJsZQorCSAgIGVycm9ycyBpbiB0aGlzIGZ1bmN0aW9uLCBhbmQgdGhlIGNsZWFudXAgaXMgdGhlIHNhbWUgaW4gCisJICAgZXZlcnkgc2luZ2xlIGNhc2UuICBJcyB0aGVyZSBhIGJldHRlciB3YXksIG90aGVyIHRoYW4gZGVlcGx5CisJICAgbmVzdGluZyB0aGUgY29kZT8KKwkqLworZXJyb3JfZW5kOgorCWlmICggKGRkX3N1cmZhY2UzICE9IE5VTEwpICYmIChkZF9zdXJmYWNlMyAhPSByZXF1ZXN0ZWQpICkgeworCQlJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShkZF9zdXJmYWNlMyk7CisJfQorCVNETF9mcmVlKHN1cmZhY2UtPmh3ZGF0YSk7CisJc3VyZmFjZS0+aHdkYXRhID0gTlVMTDsKKwlyZXR1cm4oLTEpOworfQorCitzdGF0aWMgaW50IERYNV9BbGxvY0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJLyogRERyYXcgbGltaXRhdGlvbiAtLSB5b3UgbmVlZCB0byBzZXQgY29vcGVyYXRpdmUgbGV2ZWwgZmlyc3QgKi8KKwlpZiAoIFNETF9wcmltYXJ5ID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiWW91IG11c3Qgc2V0IGEgbm9uLUdMIHZpZGVvIG1vZGUgZmlyc3QiKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKERYNV9BbGxvY0REU3VyZmFjZSh0aGlzLCBzdXJmYWNlLCBOVUxMLCBTRExfSFdTVVJGQUNFKSk7Cit9CisKKyNpZmRlZiBERFJBV19ERUJVRwordm9pZCBQcmludFN1cmZhY2UoY2hhciAqdGl0bGUsIExQRElSRUNURFJBV1NVUkZBQ0UzIHN1cmZhY2UsIFVpbnQzMiBmbGFncykKK3sKKwlERFNVUkZBQ0VERVNDIGRkc2Q7CisKKwkvKiBMb2NrIGFuZCBsb2FkISAqLworCVNETF9tZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CisJZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CisJaWYgKCBJRGlyZWN0RHJhd1N1cmZhY2UzX0xvY2soc3VyZmFjZSwgTlVMTCwgJmRkc2QsCisJCQkoRERMT0NLX05PU1lTTE9DS3xERExPQ0tfV0FJVCksIE5VTEwpICE9IEREX09LICkgeworCQlyZXR1cm47CisJfQorCUlEaXJlY3REcmF3U3VyZmFjZTNfVW5sb2NrKHN1cmZhY2UsIE5VTEwpOworCQorCWZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCB0aXRsZSk7CisJZnByaW50ZihzdGRlcnIsICJcdFNpemU6ICVkeCVkIGluICVzIGF0ICVsZCBicHAgKHBpdGNoID0gJWxkKVxuIiwKKwkJZGRzZC5kd1dpZHRoLCBkZHNkLmR3SGVpZ2h0LAorCQkoZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA/ICJoYXJkd2FyZSIgOiAic29mdHdhcmUiLAorI2lmIGRlZmluZWQoTk9OQU1FTEVTU1VOSU9OKQorCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50LCBkZHNkLnUxLmxQaXRjaCk7CisjZWxzZQorCQlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1JHQkJpdENvdW50LCBkZHNkLmxQaXRjaCk7CisjZW5kaWYKKwlmcHJpbnRmKHN0ZGVyciwgIlx0UiA9IDB4JVgsIEcgPSAweCVYLCBCID0gMHglWFxuIiwgCisjaWYgZGVmaW5lZChOT05BTUVMRVNTVU5JT04pCisJICAgICAJCWRkc2QuZGRwZlBpeGVsRm9ybWF0LnUyLmR3UkJpdE1hc2ssCisJICAgICAJCWRkc2QuZGRwZlBpeGVsRm9ybWF0LnUzLmR3R0JpdE1hc2ssCisJICAgICAJCWRkc2QuZGRwZlBpeGVsRm9ybWF0LnU0LmR3QkJpdE1hc2spOworI2Vsc2UKKwkgICAgIAkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdSQml0TWFzaywKKwkgICAgIAkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdHQml0TWFzaywKKwkgICAgIAkJZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdCQml0TWFzayk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBERFJBV19ERUJVRyAqLworCitzdGF0aWMgaW50IERYNV9IV0FjY2VsQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKKwkJCQkJU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCit7CisJTFBESVJFQ1REUkFXU1VSRkFDRTMgc3JjX3N1cmZhY2U7CisJTFBESVJFQ1REUkFXU1VSRkFDRTMgZHN0X3N1cmZhY2U7CisJRFdPUkQgZmxhZ3M7CisJUkVDVCByZWN0OworCUhSRVNVTFQgcmVzdWx0OworCisJLyogU2V0IGl0IHVwLi4gdGhlIGRlc2luYXRpb24gbXVzdCBoYXZlIGEgRERSQVcgc3VyZmFjZSAqLworCXNyY19zdXJmYWNlID0gc3JjLT5od2RhdGEtPmRkX3dyaXRlYnVmOworCWRzdF9zdXJmYWNlID0gZHN0LT5od2RhdGEtPmRkX3dyaXRlYnVmOworCXJlY3QudG9wICAgID0gKExPTkcpc3JjcmVjdC0+eTsKKwlyZWN0LmJvdHRvbSA9IChMT05HKXNyY3JlY3QtPnkrc3JjcmVjdC0+aDsKKwlyZWN0LmxlZnQgICA9IChMT05HKXNyY3JlY3QtPng7CisJcmVjdC5yaWdodCAgPSAoTE9ORylzcmNyZWN0LT54K3NyY3JlY3QtPnc7CisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkKKwkJZmxhZ3MgPSBEREJMVEZBU1RfU1JDQ09MT1JLRVk7CisJZWxzZQorCQlmbGFncyA9IEREQkxURkFTVF9OT0NPTE9SS0VZOworCS8qIEZJWE1FOiAgV2UgY2FuIHJlbW92ZSB0aGlzIGZsYWcgZm9yIF9yZWFsbHlfIGZhc3QgYmxpdCBxdWV1aW5nLAorCSAgICAgICAgICAgYnV0IGl0IHdpbGwgYWZmZWN0IHRoZSByZXR1cm4gdmFsdWVzIG9mIGxvY2tzIGFuZCBmbGlwcy4KKwkgKi8KKwlmbGFncyB8PSBEREJMVEZBU1RfV0FJVDsKKworCS8qIERvIHRoZSBibGl0ISAqLworCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfQmx0RmFzdChkc3Rfc3VyZmFjZSwKKwkJCWRzdHJlY3QtPngsIGRzdHJlY3QtPnksIHNyY19zdXJmYWNlLCAmcmVjdCwgZmxhZ3MpOworCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlpZiAoIHJlc3VsdCA9PSBEREVSUl9TVVJGQUNFTE9TVCApIHsKKwkJCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfUmVzdG9yZShzcmNfc3VyZmFjZSk7CisJCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX1Jlc3RvcmUoZHN0X3N1cmZhY2UpOworCQkJLyogVGhlIHN1cmZhY2VzIG5lZWQgdG8gYmUgcmVsb2FkZWQgd2l0aCBhcnR3b3JrICovCisJCQlTRExfU2V0RXJyb3IoIkJsaXQgc3VyZmFjZXMgd2VyZSBsb3N0LCByZWxvYWQgdGhlbSIpOworCQkJcmV0dXJuKC0yKTsKKwkJfQorCQlTZXRERGVycm9yKCJJRGlyZWN0RHJhd1N1cmZhY2UzOjpCbHRGYXN0IiwgcmVzdWx0KTsKKyNpZmRlZiBERFJBV19ERUJVRworIGZwcmludGYoc3RkZXJyLCAiT3JpZ2luYWwgZGVzdCByZWN0OiAlZHglZCBhdCAlZCwlZFxuIiwgZHN0cmVjdC0+dywgZHN0cmVjdC0+aCwgZHN0cmVjdC0+eCwgZHN0cmVjdC0+eSk7CisgZnByaW50ZihzdGRlcnIsICJIVyBhY2NlbGVyYXRlZCAlc2JsaXQgdG8gZnJvbSAweCVwIHRvIDB4JXAgYXQgKCVkLCVkKVxuIiwKKwkJKHNyYy0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID8gImNvbG9ya2V5ICIgOiAiIiwgc3JjLCBkc3QsCisJCQkJCWRzdHJlY3QtPngsIGRzdHJlY3QtPnkpOworICBQcmludFN1cmZhY2UoIlNSQyIsIHNyY19zdXJmYWNlLCBzcmMtPmZsYWdzKTsKKyAgUHJpbnRTdXJmYWNlKCJEU1QiLCBkc3Rfc3VyZmFjZSwgZHN0LT5mbGFncyk7CisgZnByaW50ZihzdGRlcnIsICJTb3VyY2UgcmVjdGFuZ2xlOiAoJWQsJWQpIC0gKCVkLCVkKVxuIiwKKwkJcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOworI2VuZGlmCisJCS8qIFVuZXhwZWN0ZWQgZXJyb3IsIGZhbGwgYmFjayB0byBzb2Z0d2FyZSBibGl0ICovCisJCXJldHVybihzcmMtPm1hcC0+c3dfYmxpdChzcmMsIHNyY3JlY3QsIGRzdCwgZHN0cmVjdCkpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgRFg1X0NoZWNrSFdCbGl0KF9USElTLCBTRExfU3VyZmFjZSAqc3JjLCBTRExfU3VyZmFjZSAqZHN0KQoreworCWludCBhY2NlbGVyYXRlZDsKKworCS8qIFdlIG5lZWQgdG8gaGF2ZSBhIEREcmF3IHN1cmZhY2UgZm9yIEhXIGJsaXRzICovCisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9TV1NVUkZBQ0UgKSB7CisJCS8qIEFsbG9jYXRlIGEgRERyYXcgc3VyZmFjZSBmb3IgdGhlIGJsaXQgKi8KKwkJaWYgKCBzcmMtPmh3ZGF0YSA9PSBOVUxMICkgeworCQkJRFg1X0FsbG9jRERTdXJmYWNlKHRoaXMsIHNyYywgTlVMTCwgU0RMX1NXU1VSRkFDRSk7CisJCX0KKwl9CisJaWYgKCBzcmMtPmh3ZGF0YSA9PSBOVUxMICkgeworCQlyZXR1cm4oMCk7CisJfQorCisJLyogU2V0IGluaXRpYWwgYWNjZWxlcmF0aW9uIG9uICovCisJc3JjLT5mbGFncyB8PSBTRExfSFdBQ0NFTDsKKworCS8qIFNldCB0aGUgc3VyZmFjZSBhdHRyaWJ1dGVzICovCisJaWYgKCAoc3JjLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZICkgeworCQlpZiAoIERYNV9TZXRIV0NvbG9yS2V5KHRoaXMsIHNyYywgc3JjLT5mb3JtYXQtPmNvbG9ya2V5KSA8IDAgKSB7CisJCQlzcmMtPmZsYWdzICY9IH5TRExfSFdBQ0NFTDsKKwkJfQorCX0KKwlpZiAoIChzcmMtPmZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7CisJCWlmICggRFg1X1NldEhXQWxwaGEodGhpcywgc3JjLCBzcmMtPmZvcm1hdC0+YWxwaGEpIDwgMCApIHsKKwkJCXNyYy0+ZmxhZ3MgJj0gflNETF9IV0FDQ0VMOworCQl9CisJfQorCisJLyogQ2hlY2sgdG8gc2VlIGlmIGZpbmFsIHN1cmZhY2UgYmxpdCBpcyBhY2NlbGVyYXRlZCAqLworCWFjY2VsZXJhdGVkID0gISEoc3JjLT5mbGFncyAmIFNETF9IV0FDQ0VMKTsKKwlpZiAoIGFjY2VsZXJhdGVkICkgeworI2lmZGVmIEREUkFXX0RFQlVHCisgIGZwcmludGYoc3RkZXJyLCAiU2V0dGluZyBhY2NlbGVyYXRlZCBibGl0IG9uIDB4JXBcbiIsIHNyYyk7CisjZW5kaWYKKwkJc3JjLT5tYXAtPmh3X2JsaXQgPSBEWDVfSFdBY2NlbEJsaXQ7CisJfQorCXJldHVybihhY2NlbGVyYXRlZCk7Cit9CisKK3N0YXRpYyBpbnQgRFg1X0ZpbGxIV1JlY3QoX1RISVMsIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0LCBVaW50MzIgY29sb3IpCit7CisJTFBESVJFQ1REUkFXU1VSRkFDRTMgZHN0X3N1cmZhY2U7CisJUkVDVCBhcmVhOworCUREQkxURlggYmx0Zng7CisJSFJFU1VMVCByZXN1bHQ7CisKKyNpZmRlZiBERFJBV19ERUJVRworIGZwcmludGYoc3RkZXJyLCAiSFcgYWNjZWxlcmF0ZWQgZmlsbCBhdCAoJWQsJWQpXG4iLCBkc3RyZWN0LT54LCBkc3RyZWN0LT55KTsKKyNlbmRpZgorCWRzdF9zdXJmYWNlID0gZHN0LT5od2RhdGEtPmRkX3dyaXRlYnVmOworCWFyZWEudG9wICAgID0gKExPTkcpZHN0cmVjdC0+eTsKKwlhcmVhLmJvdHRvbSA9IChMT05HKWRzdHJlY3QtPnkrZHN0cmVjdC0+aDsKKwlhcmVhLmxlZnQgICA9IChMT05HKWRzdHJlY3QtPng7CisJYXJlYS5yaWdodCAgPSAoTE9ORylkc3RyZWN0LT54K2RzdHJlY3QtPnc7CisJYmx0ZnguZHdTaXplID0gc2l6ZW9mKGJsdGZ4KTsKKyNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKKwlibHRmeC51NS5kd0ZpbGxDb2xvciA9IGNvbG9yOworI2Vsc2UKKwlibHRmeC5kd0ZpbGxDb2xvciA9IGNvbG9yOworI2VuZGlmCisJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19CbHQoZHN0X3N1cmZhY2UsCisJCQkmYXJlYSwgTlVMTCwgTlVMTCwgRERCTFRfQ09MT1JGSUxMfEREQkxUX1dBSVQsICZibHRmeCk7CisJaWYgKCByZXN1bHQgPT0gRERFUlJfU1VSRkFDRUxPU1QgKSB7CisJCUlEaXJlY3REcmF3U3VyZmFjZTNfUmVzdG9yZShkc3Rfc3VyZmFjZSk7CisJCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfQmx0KGRzdF9zdXJmYWNlLAorCQkJJmFyZWEsIE5VTEwsIE5VTEwsIEREQkxUX0NPTE9SRklMTHxEREJMVF9XQUlULCAmYmx0ZngpOworCX0KKwlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJU2V0RERlcnJvcigiSURpcmVjdERyYXdTdXJmYWNlMzo6Qmx0IiwgcmVzdWx0KTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IERYNV9TZXRIV0NvbG9yS2V5KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDMyIGtleSkKK3sKKwlERENPTE9SS0VZIGNvbG9ya2V5OworCUhSRVNVTFQgcmVzdWx0OworCisJLyogU2V0IHRoZSBzdXJmYWNlIGNvbG9ya2V5ICovCisJY29sb3JrZXkuZHdDb2xvclNwYWNlTG93VmFsdWUgPSBrZXk7CisJY29sb3JrZXkuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0ga2V5OworCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfU2V0Q29sb3JLZXkoCisJCQlzdXJmYWNlLT5od2RhdGEtPmRkX3N1cmZhY2UsIEREQ0tFWV9TUkNCTFQsICZjb2xvcmtleSk7CisJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCVNldEREZXJyb3IoIklEaXJlY3REcmF3U3VyZmFjZTM6OlNldENvbG9yS2V5IiwgcmVzdWx0KTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcmV0dXJuKDApOworfQorc3RhdGljIGludCBEWDVfU2V0SFdBbHBoYShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UsIFVpbnQ4IGFscGhhKQoreworCXJldHVybigtMSk7Cit9CisKK3N0YXRpYyBpbnQgRFg1X0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCUhSRVNVTFQgcmVzdWx0OworCUxQRElSRUNURFJBV1NVUkZBQ0UzIGRkX3N1cmZhY2U7CisJRERTVVJGQUNFREVTQyBkZHNkOworCisJLyogTG9jayBhbmQgbG9hZCEgKi8KKwlkZF9zdXJmYWNlID0gc3VyZmFjZS0+aHdkYXRhLT5kZF93cml0ZWJ1ZjsKKwlTRExfbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOworCWRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOworCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfTG9jayhkZF9zdXJmYWNlLCBOVUxMLCAmZGRzZCwKKwkJCQkJKERETE9DS19OT1NZU0xPQ0t8RERMT0NLX1dBSVQpLCBOVUxMKTsKKwlpZiAoIHJlc3VsdCA9PSBEREVSUl9TVVJGQUNFTE9TVCApIHsKKwkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19SZXN0b3JlKAorCQkJCQkJc3VyZmFjZS0+aHdkYXRhLT5kZF9zdXJmYWNlKTsKKwkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19Mb2NrKGRkX3N1cmZhY2UsIE5VTEwsICZkZHNkLCAKKwkJCQkJKERETE9DS19OT1NZU0xPQ0t8RERMT0NLX1dBSVQpLCBOVUxMKTsKKwl9CisJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCVNldEREZXJyb3IoIkRpcmVjdERyYXdTdXJmYWNlMzo6TG9jayIsIHJlc3VsdCk7CisJCXJldHVybigtMSk7CisJfQorCS8qIFBpdGNoIG1pZ2h0IGhhdmUgY2hhbmdlZCAtLSByZWNhbGN1bGF0ZSBwaXRjaCBhbmQgb2Zmc2V0ICovCisjaWYgZGVmaW5lZChOT05BTUVMRVNTVU5JT04pCisJaWYgKCBzdXJmYWNlLT5waXRjaCAhPSBkZHNkLnUxLmxQaXRjaCApIHsKKwkJc3VyZmFjZS0+cGl0Y2ggPSBkZHNkLnUxLmxQaXRjaDsKKyNlbHNlCisJaWYgKCBzdXJmYWNlLT5waXRjaCAhPSBkZHNkLmxQaXRjaCApIHsKKwkJc3VyZmFjZS0+cGl0Y2ggPSAoVWludDE2KWRkc2QubFBpdGNoOworI2VuZGlmCisJCXN1cmZhY2UtPm9mZnNldCA9CisJCQkoKGRkc2QuZHdIZWlnaHQtc3VyZmFjZS0+aCkvMikqc3VyZmFjZS0+cGl0Y2ggKworCQkJKChkZHNkLmR3V2lkdGgtc3VyZmFjZS0+dykvMikqCisJCQkJCXN1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKKwl9CisJc3VyZmFjZS0+cGl4ZWxzID0gZGRzZC5scFN1cmZhY2U7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZCBEWDVfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlJRGlyZWN0RHJhd1N1cmZhY2UzX1VubG9jayhzdXJmYWNlLT5od2RhdGEtPmRkX3dyaXRlYnVmLCBOVUxMKTsKKwlzdXJmYWNlLT5waXhlbHMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IERYNV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlIUkVTVUxUIHJlc3VsdDsKKwlMUERJUkVDVERSQVdTVVJGQUNFMyBkZF9zdXJmYWNlOworCisJZGRfc3VyZmFjZSA9IHN1cmZhY2UtPmh3ZGF0YS0+ZGRfc3VyZmFjZTsKKworCS8qIHRvIHByZXZlbnQgYmlnIHNsb3dkb3duIG9uIGZhc3QgY29tcHV0ZXJzLCB3YWl0IGhlcmUgaW5zdGVhZCBvZiBkcml2ZXIgcmluZyAwIGNvZGUgKi8KKwkvKiBEbWl0cnkgWWFraW1vdiAoZnRlY2hAdHVsYS5uZXQpICovCisJd2hpbGUoSURpcmVjdERyYXdTdXJmYWNlM19HZXRGbGlwU3RhdHVzKGRkX3N1cmZhY2UsIERER0JTX0lTQkxURE9ORSkgPT0gRERFUlJfV0FTU1RJTExEUkFXSU5HKTsKKworCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfRmxpcChkZF9zdXJmYWNlLCBOVUxMLCBEREZMSVBfV0FJVCk7CisJaWYgKCByZXN1bHQgPT0gRERFUlJfU1VSRkFDRUxPU1QgKSB7CisJCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfUmVzdG9yZSgKKwkJCQkJCXN1cmZhY2UtPmh3ZGF0YS0+ZGRfc3VyZmFjZSk7CisJCXdoaWxlKElEaXJlY3REcmF3U3VyZmFjZTNfR2V0RmxpcFN0YXR1cyhkZF9zdXJmYWNlLCBEREdCU19JU0JMVERPTkUpID09IERERVJSX1dBU1NUSUxMRFJBV0lORyk7CisJCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfRmxpcChkZF9zdXJmYWNlLCBOVUxMLCBEREZMSVBfV0FJVCk7CisJfQorCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlTZXRERGVycm9yKCJEaXJlY3REcmF3U3VyZmFjZTM6OkZsaXAiLCByZXN1bHQpOworCQlyZXR1cm4oLTEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIERYNV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlpZiAoIHN1cmZhY2UtPmh3ZGF0YSApIHsKKwkJaWYgKCBzdXJmYWNlLT5od2RhdGEtPmRkX3N1cmZhY2UgIT0gU0RMX3ByaW1hcnkgKSB7CisJCQlJRGlyZWN0RHJhd1N1cmZhY2UzX1JlbGVhc2Uoc3VyZmFjZS0+aHdkYXRhLT5kZF9zdXJmYWNlKTsKKwkJfQorCQlTRExfZnJlZShzdXJmYWNlLT5od2RhdGEpOworCQlzdXJmYWNlLT5od2RhdGEgPSBOVUxMOworCX0KK30KKwordm9pZCBEWDVfV2luZG93VXBkYXRlKF9USElTLCBpbnQgbnVtcmVjdHMsIFNETF9SZWN0ICpyZWN0cykKK3sKKwlIUkVTVUxUIHJlc3VsdDsKKwlpbnQgaTsKKwlSRUNUIHNyYywgZHN0OworCisJZm9yICggaT0wOyBpPG51bXJlY3RzOyArK2kgKSB7CisJCXNyYy50b3AgICAgPSAoTE9ORylyZWN0c1tpXS55OworCQlzcmMuYm90dG9tID0gKExPTkcpcmVjdHNbaV0ueStyZWN0c1tpXS5oOworCQlzcmMubGVmdCAgID0gKExPTkcpcmVjdHNbaV0ueDsKKwkJc3JjLnJpZ2h0ICA9IChMT05HKXJlY3RzW2ldLngrcmVjdHNbaV0udzsKKwkJZHN0LnRvcCAgICA9IFNETF9ib3VuZHMudG9wK3NyYy50b3A7CisJCWRzdC5sZWZ0ICAgPSBTRExfYm91bmRzLmxlZnQrc3JjLmxlZnQ7CisJCWRzdC5ib3R0b20gPSBTRExfYm91bmRzLnRvcCtzcmMuYm90dG9tOworCQlkc3QucmlnaHQgID0gU0RMX2JvdW5kcy5sZWZ0K3NyYy5yaWdodDsKKwkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19CbHQoU0RMX3ByaW1hcnksICZkc3QsIAorCQkJCQl0aGlzLT5zY3JlZW4tPmh3ZGF0YS0+ZGRfc3VyZmFjZSwgJnNyYywKKwkJCQkJCQlEREJMVF9XQUlULCBOVUxMKTsKKwkJLyogRG9oISAgQ2hlY2sgZm9yIGxvc3Qgc3VyZmFjZSBhbmQgcmVzdG9yZSBpdCAqLworCQlpZiAoIHJlc3VsdCA9PSBEREVSUl9TVVJGQUNFTE9TVCApIHsKKwkJCUlEaXJlY3REcmF3U3VyZmFjZTNfUmVzdG9yZShTRExfcHJpbWFyeSk7CisJCQlJRGlyZWN0RHJhd1N1cmZhY2UzX0JsdChTRExfcHJpbWFyeSwgJmRzdCwgCisJCQkJCXRoaXMtPnNjcmVlbi0+aHdkYXRhLT5kZF9zdXJmYWNlLCAmc3JjLAorCQkJCQkJCUREQkxUX1dBSVQsIE5VTEwpOworCQl9CisJfQorfQorCit2b2lkIERYNV9EaXJlY3RVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworfQorCisvKiBDb21wcmVzcyBhIGZ1bGwgcGFsZXR0ZSBpbnRvIHRoZSBsaW1pdGVkIG51bWJlciBvZiBjb2xvcnMgZ2l2ZW4gdG8gdXMKKyAgIGJ5IHdpbmRvd3MuCisKKyAgIFRoZSAiYmVzdCIgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc29ydCB0aGUgY29sb3JzIGJ5IGRpdmVyc2l0eSBhbmQgcGxhY2UKKyAgIHRoZSBtb3N0IGRpdmVyc2UgY29sb3JzIGludG8gdGhlIGxpbWl0ZWQgcGFsZXR0ZS4gIFVuZm9ydHVuYXRlbHkgdGhpcworICAgcmVzdWx0cyBpbiB3aWRlbHkgdmFyeWluZyBjb2xvcnMgYmVpbmcgZGlzcGxheWVkIGluIHRoZSBpbnRlcnZhbCBkdXJpbmcKKyAgIHdoaWNoIHRoZSB3aW5kb3dzIHBhbGV0dGUgaGFzIGJlZW4gc2V0LCBhbmQgdGhlIG1hcHBpbmcgb2YgdGhlIHNoYWRvdworICAgc3VyZmFjZSB0byB0aGUgbmV3IHBhbGV0dGUuICBUaGlzIGlzIGVzcGVjaWFsbHkgbm90aWNlYWJsZSBkdXJpbmcgZmFkZXMuCisKKyAgIFRvIGRlYWwgd2l0aCB0aGlzIHByb2JsZW0sIHdlIGNhbiBjb3B5IGEgcHJlZGV0ZXJtaW5lZCBwb3J0aW9uIG9mIHRoZQorICAgZnVsbCBwYWxldHRlLCBhbmQgdXNlIHRoYXQgYXMgdGhlIGxpbWl0ZWQgcGFsZXR0ZS4gIFRoaXMgYWxsb3dzIGNvbG9ycworICAgdG8gZmFkZSBzbW9vdGhseSBhcyB0aGUgcmVtYXBwaW5nIGlzIHZlcnkgc2ltaWxhciBvbiBlYWNoIHBhbGV0dGUgY2hhbmdlLgorICAgVW5mb3J0dW5hdGVseSwgdGhpcyBicmVha3MgYXBwbGljYXRpb25zIHdoaWNoIHBhcnRpdGlvbiB0aGUgcGFsZXR0ZSBpbnRvCisgICBkaXN0aW5jdCBhbmQgd2lkZWx5IHZhcnlpbmcgYXJlYXMsIGV4cGVjdGluZyBhbGwgY29sb3JzIHRvIGJlIGF2YWlsYWJsZS4KKworICAgSSdtIG1ha2luZyB0aGVtIGJvdGggYXZhaWxhYmxlLCBjaG9zZW4gYXQgY29tcGlsZSB0aW1lLgorICAgSWYgeW91IHdhbnQgdGhlIGNodW5rLW8tcGFsZXR0ZSBhbGdvcml0aG0sIGRlZmluZSBTSU1QTEVfQ09NUFJFU1NJT04sCisgICBvdGhlcndpc2UgdGhlIHNvcnQtYnktZGl2ZXJzaXR5IGFsZ29yaXRobSB3aWxsIGJlIHVzZWQuCisqLworI2RlZmluZSBTSU1QTEVfQ09NUFJFU1NJT04KKyNkZWZpbmUgQ1NfQ1NfRElTVChBLCBCKSAoewkJCQkJCVwKKwlpbnQgciA9IChBLnIgLSBCLnIpOwkJCQkJCVwKKwlpbnQgZyA9IChBLmcgLSBCLmcpOwkJCQkJCVwKKwlpbnQgYiA9IChBLmIgLSBCLmIpOwkJCQkJCVwKKwkocipyICsgZypnICsgYipiKTsJCQkJCQlcCit9KQorc3RhdGljIHZvaWQgRFg1X0NvbXByZXNzUGFsZXR0ZShfVEhJUywgU0RMX0NvbG9yICpjb2xvcnMsIGludCBuY29sb3JzLCBpbnQgbWF4Y29sb3JzKQoreworI2lmZGVmIFNJTVBMRV9DT01QUkVTU0lPTgorCWludCBpLCBqOworI2Vsc2UKKwlzdGF0aWMgU0RMX0NvbG9yIHplcm8gPSB7IDAsIDAsIDAsIDAgfTsKKwlpbnQgaSwgajsKKwlpbnQgbWF4LCBkaXN0OworCWludCBwcmV2LCBuZXh0OworCWludCAqcG9vbDsKKwlpbnQgKnNlZW4sICpvcmRlcjsKKyNlbmRpZgorCisJLyogRG9lcyB0aGlzIGhhcHBlbj8gKi8KKwlpZiAoIG1heGNvbG9ycyA+IG5jb2xvcnMgKSB7CisJCW1heGNvbG9ycyA9IG5jb2xvcnM7CisJfQorCisjaWZkZWYgU0lNUExFX0NPTVBSRVNTSU9OCisJLyogSnVzdCBjb3B5IHRoZSBmaXJzdCAibWF4Y29sb3JzIiBjb2xvcnMgKi8KKwlmb3IgKCBqPTEwLCBpPTA7IGk8bWF4Y29sb3JzOyArK2ksICsraiApIHsKKwkJU0RMX2NvbG9yc1tqXS5wZVJlZCA9IGNvbG9yc1tpXS5yOworCQlTRExfY29sb3JzW2pdLnBlR3JlZW4gPSBjb2xvcnNbaV0uZzsKKwkJU0RMX2NvbG9yc1tqXS5wZUJsdWUgPSBjb2xvcnNbaV0uYjsKKwl9CisjZWxzZQorCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGFycmF5cyB3ZSB1c2UgKi8KKwlwb29sID0gU0RMX3N0YWNrX2FsbG9jKGludCwgMipuY29sb3JzKTsKKwlpZiAoIHBvb2wgPT0gTlVMTCApIHsKKwkJLyogTm8gd29ycmllcywganVzdCByZXR1cm4gKi87CisJCXJldHVybjsKKwl9CisJc2VlbiA9IHBvb2w7CisJU0RMX21lbXNldChzZWVuLCAwLCBuY29sb3JzKnNpemVvZihpbnQpKTsKKwlvcmRlciA9IHBvb2wrbmNvbG9yczsKKworCS8qIFN0YXJ0IHdpdGggdGhlIGJyaWdodGVzdCBjb2xvciAqLworCW1heCA9IDA7CisJZm9yICggaT0wOyBpPG5jb2xvcnM7ICsraSApIHsKKwkJZGlzdCA9IENTX0NTX0RJU1QoemVybywgY29sb3JzW2ldKTsKKwkJaWYgKCBkaXN0ID49IG1heCApIHsKKwkJCW1heCA9IGRpc3Q7CisJCQluZXh0ID0gaTsKKwkJfQorCX0KKwlqID0gMDsKKwlvcmRlcltqKytdID0gbmV4dDsKKwlzZWVuW25leHRdID0gMTsKKwlwcmV2ID0gbmV4dDsKKworCS8qIEtlZXAgZ29pbmcgdGhyb3VnaCBhbGwgdGhlIGNvbG9ycyAqLworCXdoaWxlICggaiA8IG1heGNvbG9ycyApIHsKKwkJbWF4ID0gMDsKKwkJZm9yICggaT0wOyBpPG5jb2xvcnM7ICsraSApIHsKKwkJCWlmICggc2VlbltpXSApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRpc3QgPSBDU19DU19ESVNUKGNvbG9yc1tpXSwgY29sb3JzW3ByZXZdKTsKKwkJCWlmICggZGlzdCA+PSBtYXggKSB7CisJCQkJbWF4ID0gZGlzdDsKKwkJCQluZXh0ID0gaTsKKwkJCX0KKwkJfQorCQlvcmRlcltqKytdID0gbmV4dDsKKwkJc2VlbltuZXh0XSA9IDE7CisJCXByZXYgPSBuZXh0OworCX0KKworCS8qIENvbXByZXNzIHRoZSBjb2xvcnMgdG8gdGhlIHBhbGV0dGUgKi8KKwlmb3IgKCBqPTEwLCBpPTA7IGk8bWF4Y29sb3JzOyArK2ksICsraiApIHsKKwkJU0RMX2NvbG9yc1tqXS5wZVJlZCA9IGNvbG9yc1tvcmRlcltpXV0ucjsKKwkJU0RMX2NvbG9yc1tqXS5wZUdyZWVuID0gY29sb3JzW29yZGVyW2ldXS5nOworCQlTRExfY29sb3JzW2pdLnBlQmx1ZSA9IGNvbG9yc1tvcmRlcltpXV0uYjsKKwl9CisJU0RMX3N0YWNrX2ZyZWUocG9vbCk7CisjZW5kaWYgLyogU0lNUExFX0NPTVBSRVNTSU9OICovCit9CisKKy8qIFNldCB0aGUgc3lzdGVtIGNvbG9ybWFwIGluIGJvdGggZnVsbHNjcmVlbiBhbmQgd2luZG93ZWQgbW9kZXMgKi8KK2ludCBEWDVfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworCWludCBpOworCWludCBhbGxvY3RfYWxsOworCisJLyogQ29weSBwYWxldHRlIGNvbG9ycyBpbnRvIGRpc3BsYXkgcGFsZXR0ZSAqLworCWFsbG9jdF9hbGwgPSAwOworCWlmICggU0RMX3BhbGV0dGUgIT0gTlVMTCApIHsKKwkJaWYgKCAodGhpcy0+c2NyZWVuLT5mbGFncyZTRExfRlVMTFNDUkVFTikgPT0gU0RMX0ZVTExTQ1JFRU4gKSB7CisJCQkvKiBXZSBjYW4gc2V0IGFsbCBlbnRyaWVzIGV4cGxpY2l0bHkgKi8KKwkJCWZvciAoIGk9MDsgaTwgbmNvbG9yczsgKytpICkgeworCQkJICAgICAgICBpbnQgaiA9IGZpcnN0Y29sb3IgKyBpOworCQkJCVNETF9jb2xvcnNbal0ucGVSZWQgPSBjb2xvcnNbaV0ucjsKKwkJCQlTRExfY29sb3JzW2pdLnBlR3JlZW4gPSBjb2xvcnNbaV0uZzsKKwkJCQlTRExfY29sb3JzW2pdLnBlQmx1ZSA9IGNvbG9yc1tpXS5iOworCQkJfQorCQkJLyogVGhpcyBzZW5kcyBhbiBXTV9QQUxFVFRFQ0hBTkdFRCBtZXNzYWdlIHRvIHVzICovCisJCQljb2xvcmNoYW5nZV9leHBlY3RlZCA9IDE7CisJCQlJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhTRExfcGFsZXR0ZSwgMCwKKwkJCQlmaXJzdGNvbG9yLCBuY29sb3JzLCAmU0RMX2NvbG9yc1tmaXJzdGNvbG9yXSk7CisJCQlhbGxvY3RfYWxsID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIEdyYWIgdGhlIDIzNiBtb3N0IGRpdmVyc2UgY29sb3JzIGluIHRoZSBwYWxldHRlICovCisJCQlEWDVfQ29tcHJlc3NQYWxldHRlKHRoaXMsIGNvbG9ycywgbmNvbG9ycywgMjM2KTsKKwkJCS8qIFRoaXMgc2VuZHMgYW4gV01fUEFMRVRURUNIQU5HRUQgbWVzc2FnZSB0byB1cyAqLworCQkJY29sb3JjaGFuZ2VfZXhwZWN0ZWQgPSAxOworCQkJSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMoU0RMX3BhbGV0dGUsIDAsCisJCQkJCQkJMCwgMjU2LCBTRExfY29sb3JzKTsKKwkJfQorCX0KKwlyZXR1cm4oYWxsb2N0X2FsbCk7Cit9CisKKy8qIEdhbW1hIGNvZGUgaXMgb25seSBhdmFpbGFibGUgb24gRGlyZWN0WCA3IGFuZCBuZXdlciAqLworc3RhdGljIGludCBEWDVfU2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApCit7CisjaWZkZWYgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfU2V0R2FtbWFSYW1wCisJTFBESVJFQ1REUkFXR0FNTUFDT05UUk9MIGdhbW1hOworCURER0FNTUFSQU1QIGdhbW1hX3JhbXA7CisJSFJFU1VMVCByZXN1bHQ7CisjZW5kaWYKKworCS8qIEluIHdpbmRvd2VkIG9yIE9wZW5HTCBtb2RlLCB1c2Ugd2luZGliIGdhbW1hIGNvZGUgKi8KKwlpZiAoICEgRERSQVdfRlVMTFNDUkVFTigpICkgeworCQlyZXR1cm4gRElCX1NldEdhbW1hUmFtcCh0aGlzLCByYW1wKTsKKwl9CisKKyNpZm5kZWYgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfU2V0R2FtbWFSYW1wCisJU0RMX1NldEVycm9yKCJTREwgY29tcGlsZWQgd2l0aG91dCBEaXJlY3RYIGdhbW1hIHJhbXAgc3VwcG9ydCIpOworCXJldHVybiAtMTsKKyNlbHNlCisJLyogQ2hlY2sgZm9yIGEgdmlkZW8gbW9kZSEgKi8KKwlpZiAoICEgU0RMX3ByaW1hcnkgKSB7CisJCVNETF9TZXRFcnJvcigiQSB2aWRlbyBtb2RlIG11c3QgYmUgc2V0IGZvciBnYW1tYSBjb3JyZWN0aW9uIik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogR2V0IHRoZSBnYW1tYSBjb250cm9sIG9iamVjdCAqLworCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfUXVlcnlJbnRlcmZhY2UoU0RMX3ByaW1hcnksCisJCQkmSUlEX0lEaXJlY3REcmF3R2FtbWFDb250cm9sLCAoTFBWT0lEICopJmdhbW1hKTsKKwlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpRdWVyeUludGVyZmFjZShHQU1NQSkiLCByZXN1bHQpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFNldCB1cCB0aGUgZ2FtbWEgcmFtcCAqLworCVNETF9tZW1jcHkoZ2FtbWFfcmFtcC5yZWQsICZyYW1wWzAqMjU2XSwgMjU2KnNpemVvZigqcmFtcCkpOworCVNETF9tZW1jcHkoZ2FtbWFfcmFtcC5ncmVlbiwgJnJhbXBbMSoyNTZdLCAyNTYqc2l6ZW9mKCpyYW1wKSk7CisJU0RMX21lbWNweShnYW1tYV9yYW1wLmJsdWUsICZyYW1wWzIqMjU2XSwgMjU2KnNpemVvZigqcmFtcCkpOworCXJlc3VsdCA9IElEaXJlY3REcmF3R2FtbWFDb250cm9sX1NldEdhbW1hUmFtcChnYW1tYSwgMCwgJmdhbW1hX3JhbXApOworCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlTZXRERGVycm9yKCJEaXJlY3REcmF3R2FtbWFDb250cm9sOjpTZXRHYW1tYVJhbXAoKSIsIHJlc3VsdCk7CisJfQorCisJLyogUmVsZWFzZSB0aGUgaW50ZXJmYWNlIGFuZCByZXR1cm4gKi8KKwlJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9SZWxlYXNlKGdhbW1hKTsKKwlyZXR1cm4gKHJlc3VsdCA9PSBERF9PSykgPyAwIDogLTE7CisjZW5kaWYgLyogIUlEaXJlY3REcmF3R2FtbWFDb250cm9sX1NldEdhbW1hUmFtcCAqLworfQorCitzdGF0aWMgaW50IERYNV9HZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCkKK3sKKyNpZmRlZiBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9TZXRHYW1tYVJhbXAKKwlMUERJUkVDVERSQVdHQU1NQUNPTlRST0wgZ2FtbWE7CisJRERHQU1NQVJBTVAgZ2FtbWFfcmFtcDsKKwlIUkVTVUxUIHJlc3VsdDsKKyNlbmRpZgorCisJLyogSW4gd2luZG93ZWQgb3IgT3BlbkdMIG1vZGUsIHVzZSB3aW5kaWIgZ2FtbWEgY29kZSAqLworCWlmICggISBERFJBV19GVUxMU0NSRUVOKCkgKSB7CisJCXJldHVybiBESUJfR2V0R2FtbWFSYW1wKHRoaXMsIHJhbXApOworCX0KKworI2lmbmRlZiBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9TZXRHYW1tYVJhbXAKKwlTRExfU2V0RXJyb3IoIlNETCBjb21waWxlZCB3aXRob3V0IERpcmVjdFggZ2FtbWEgcmFtcCBzdXBwb3J0Iik7CisJcmV0dXJuIC0xOworI2Vsc2UKKwkvKiBDaGVjayBmb3IgYSB2aWRlbyBtb2RlISAqLworCWlmICggISBTRExfcHJpbWFyeSApIHsKKwkJU0RMX1NldEVycm9yKCJBIHZpZGVvIG1vZGUgbXVzdCBiZSBzZXQgZm9yIGdhbW1hIGNvcnJlY3Rpb24iKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBHZXQgdGhlIGdhbW1hIGNvbnRyb2wgb2JqZWN0ICovCisJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19RdWVyeUludGVyZmFjZShTRExfcHJpbWFyeSwKKwkJCSZJSURfSURpcmVjdERyYXdHYW1tYUNvbnRyb2wsIChMUFZPSUQgKikmZ2FtbWEpOworCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlTZXRERGVycm9yKCJEaXJlY3REcmF3U3VyZmFjZTM6OlF1ZXJ5SW50ZXJmYWNlKEdBTU1BKSIsIHJlc3VsdCk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogU2V0IHVwIHRoZSBnYW1tYSByYW1wICovCisJcmVzdWx0ID0gSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfR2V0R2FtbWFSYW1wKGdhbW1hLCAwLCAmZ2FtbWFfcmFtcCk7CisJaWYgKCByZXN1bHQgPT0gRERfT0sgKSB7CisJCVNETF9tZW1jcHkoJnJhbXBbMCoyNTZdLCBnYW1tYV9yYW1wLnJlZCwgMjU2KnNpemVvZigqcmFtcCkpOworCQlTRExfbWVtY3B5KCZyYW1wWzEqMjU2XSwgZ2FtbWFfcmFtcC5ncmVlbiwgMjU2KnNpemVvZigqcmFtcCkpOworCQlTRExfbWVtY3B5KCZyYW1wWzIqMjU2XSwgZ2FtbWFfcmFtcC5ibHVlLCAyNTYqc2l6ZW9mKCpyYW1wKSk7CisJfSBlbHNlIHsKKwkJU2V0RERlcnJvcigiRGlyZWN0RHJhd0dhbW1hQ29udHJvbDo6R2V0R2FtbWFSYW1wKCkiLCByZXN1bHQpOworCX0KKworCS8qIFJlbGVhc2UgdGhlIGludGVyZmFjZSBhbmQgcmV0dXJuICovCisJSURpcmVjdERyYXdHYW1tYUNvbnRyb2xfUmVsZWFzZShnYW1tYSk7CisJcmV0dXJuIChyZXN1bHQgPT0gRERfT0spID8gMCA6IC0xOworI2VuZGlmIC8qICFJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9TZXRHYW1tYVJhbXAgKi8KK30KKwordm9pZCBEWDVfVmlkZW9RdWl0KF9USElTKQoreworCWludCBpLCBqOworCisJLyogSWYgd2UncmUgZnVsbHNjcmVlbiBHTCwgd2UgbmVlZCB0byByZXNldCB0aGUgZGlzcGxheSAqLworCWlmICggdGhpcy0+c2NyZWVuICE9IE5VTEwgKSB7CisjaWZuZGVmIE5PX0NIQU5HRURJU1BMQVlTRVRUSU5HUworCQlpZiAoICh0aGlzLT5zY3JlZW4tPmZsYWdzICYgKFNETF9PUEVOR0x8U0RMX0ZVTExTQ1JFRU4pKSA9PQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNETF9PUEVOR0x8U0RMX0ZVTExTQ1JFRU4pICkgeworCQkJQ2hhbmdlRGlzcGxheVNldHRpbmdzKE5VTEwsIDApOworCQkJU2hvd1dpbmRvdyhTRExfV2luZG93LCBTV19ISURFKTsKKwkJfQorI2VuZGlmCisJCWlmICggdGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9PUEVOR0wgKSB7CisJCQlXSU5fR0xfU2h1dERvd24odGhpcyk7CisJCX0KKwl9CisKKwkvKiBGcmVlIGFueSBwYWxldHRlcyB3ZSB1c2VkICovCisJaWYgKCBTRExfcGFsZXR0ZSAhPSBOVUxMICkgeworCQlJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZShTRExfcGFsZXR0ZSk7CisJCVNETF9wYWxldHRlID0gTlVMTDsKKwl9CisKKwkvKiBBbGxvdyB0aGUgcHJpbWFyeSBzdXJmYWNlIHRvIGJlIGZyZWVkICovCisJaWYgKCBTRExfcHJpbWFyeSAhPSBOVUxMICkgeworCQlTRExfcHJpbWFyeSA9IE5VTEw7CisJfQorCisJLyogRnJlZSB2aWRlbyBtb2RlIGxpc3RzICovCisJZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKKwkJaWYgKCBTRExfbW9kZWxpc3RbaV0gIT0gTlVMTCApIHsKKwkJCWZvciAoIGo9MDsgU0RMX21vZGVsaXN0W2ldW2pdOyArK2ogKQorCQkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXVtqXSk7CisJCQlTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOworCQkJU0RMX21vZGVsaXN0W2ldID0gTlVMTDsKKwkJfQorCX0KKworCS8qIEZyZWUgdGhlIHdpbmRvdyAqLworCURJQl9RdWl0R2FtbWEodGhpcyk7CisJaWYgKCBTRExfV2luZG93ICkgeworCQlEWDVfRGVzdHJveVdpbmRvdyh0aGlzKTsKKwl9CisKKwkvKiBGcmVlIG91ciB3aW5kb3cgaWNvbiAqLworCWlmICggc2NyZWVuX2ljbiApIHsKKwkJRGVzdHJveUljb24oc2NyZWVuX2ljbik7CisJCXNjcmVlbl9pY24gPSBOVUxMOworCX0KK30KKworLyogRXhwb3J0ZWQgZm9yIHRoZSB3aW5kb3dzIG1lc3NhZ2UgbG9vcCBvbmx5ICovCit2b2lkIERYNV9BY3RpdmF0ZShfVEhJUywgQk9PTCBhY3RpdmUsIEJPT0wgbWluaW1pemVkKQoreworfQordm9pZCBEWDVfUmVhbGl6ZVBhbGV0dGUoX1RISVMpCit7CisJaWYgKCBTRExfcGFsZXR0ZSApIHsKKwkJSURpcmVjdERyYXdTdXJmYWNlM19TZXRQYWxldHRlKFNETF9wcmltYXJ5LCBTRExfcGFsZXR0ZSk7CisJfQorfQorc3RhdGljIHZvaWQgRFg1X1JlY29sb3I4Qml0KF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSwgVWludDggKm1hcHBpbmcpCit7CisJaW50IHJvdywgY29sOworCVVpbnQ4ICpwaXhlbHM7CisKKwlpZiAoIHN1cmZhY2UtPncgJiYgc3VyZmFjZS0+aCApIHsKKwkJaWYgKCAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgeworCQkJaWYgKCB0aGlzLT5Mb2NrSFdTdXJmYWNlKHRoaXMsIHN1cmZhY2UpIDwgMCApIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZm9yICggcm93PTA7IHJvdzxzdXJmYWNlLT5oOyArK3JvdyApIHsKKwkJCXBpeGVscyA9IChVaW50OCAqKXN1cmZhY2UtPnBpeGVscytyb3cqc3VyZmFjZS0+cGl0Y2g7CisJCQlmb3IgKCBjb2w9MDsgY29sPHN1cmZhY2UtPnc7ICsrY29sLCArK3BpeGVscyApIHsKKwkJCQkqcGl4ZWxzID0gbWFwcGluZ1sqcGl4ZWxzXTsKKwkJCX0KKwkJfQorCQlpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UgKSB7CisJCQl0aGlzLT5VbmxvY2tIV1N1cmZhY2UodGhpcywgc3VyZmFjZSk7CisJCX0KKwkJU0RMX1VwZGF0ZVJlY3Qoc3VyZmFjZSwgMCwgMCwgMCwgMCk7CisJfQorfQordm9pZCBEWDVfUGFsZXR0ZUNoYW5nZWQoX1RISVMsIEhXTkQgd2luZG93KQoreworCVNETF9QYWxldHRlICpwYWxldHRlOworCVNETF9Db2xvciAqc2F2ZWQgPSBOVUxMOworCUhEQyBoZGM7CisJaW50IGk7CisJUEFMRVRURUVOVFJZICplbnRyaWVzOworCisJLyogVGhpcyBpcyB0cnVlIHdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zaW5nICovCisJaWYgKCAoU0RMX3ByaW1hcnkgPT0gTlVMTCkgfHwgKFNETF9WaWRlb1N1cmZhY2UgPT0gTlVMTCkgKQorCQlyZXR1cm47CisKKwkvKiBXZSBuZWVkIHRvIGdldCB0aGUgY29sb3JzIGFzIHRoZXkgd2VyZSBzZXQgKi8KKwlwYWxldHRlID0gdGhpcy0+cGh5c3BhbDsKKwlpZighcGFsZXR0ZSkKKwkgICAgICAgIHBhbGV0dGUgPSBTRExfVmlkZW9TdXJmYWNlLT5mb3JtYXQtPnBhbGV0dGU7CisJaWYgKCBwYWxldHRlID09IE5VTEwgKSB7IC8qIFNvbWV0aW1lcyB3ZSBkb24ndCBoYXZlIGEgcGFsZXR0ZSAqLworCQlyZXR1cm47CisJfQorCWVudHJpZXMgPSBTRExfc3RhY2tfYWxsb2MoUEFMRVRURUVOVFJZLCBwYWxldHRlLT5uY29sb3JzKTsKKwloZGMgPSBHZXREQyh3aW5kb3cpOworCUdldFN5c3RlbVBhbGV0dGVFbnRyaWVzKGhkYywgMCwgcGFsZXR0ZS0+bmNvbG9ycywgZW50cmllcyk7CisJUmVsZWFzZURDKHdpbmRvdywgaGRjKTsKKwlpZiAoICEgY29sb3JjaGFuZ2VfZXhwZWN0ZWQgKSB7CisJCXNhdmVkID0gU0RMX3N0YWNrX2FsbG9jKFNETF9Db2xvciwgcGFsZXR0ZS0+bmNvbG9ycyk7CisJCVNETF9tZW1jcHkoc2F2ZWQsIHBhbGV0dGUtPmNvbG9ycywgCisJCQkJCXBhbGV0dGUtPm5jb2xvcnMqc2l6ZW9mKFNETF9Db2xvcikpOworCX0KKwlmb3IgKCBpPTA7IGk8cGFsZXR0ZS0+bmNvbG9yczsgKytpICkgeworCQlwYWxldHRlLT5jb2xvcnNbaV0uciA9IGVudHJpZXNbaV0ucGVSZWQ7CisJCXBhbGV0dGUtPmNvbG9yc1tpXS5nID0gZW50cmllc1tpXS5wZUdyZWVuOworCQlwYWxldHRlLT5jb2xvcnNbaV0uYiA9IGVudHJpZXNbaV0ucGVCbHVlOworCX0KKwlTRExfc3RhY2tfZnJlZShlbnRyaWVzKTsKKwlpZiAoICEgY29sb3JjaGFuZ2VfZXhwZWN0ZWQgKSB7CisJCVVpbnQ4IG1hcHBpbmdbMjU2XTsKKworCQlTRExfbWVtc2V0KG1hcHBpbmcsIDAsIHNpemVvZihtYXBwaW5nKSk7CisJCWZvciAoIGk9MDsgaTxwYWxldHRlLT5uY29sb3JzOyArK2kgKSB7CisJCQltYXBwaW5nW2ldID0gU0RMX0ZpbmRDb2xvcihwYWxldHRlLAorCQkJCQlzYXZlZFtpXS5yLCBzYXZlZFtpXS5nLCBzYXZlZFtpXS5iKTsKKwkJfQorCQlEWDVfUmVjb2xvcjhCaXQodGhpcywgU0RMX1ZpZGVvU3VyZmFjZSwgbWFwcGluZyk7CisJCVNETF9zdGFja19mcmVlKHNhdmVkKTsKKwl9CisJY29sb3JjaGFuZ2VfZXhwZWN0ZWQgPSAwOworCisJLyogTm90aWZ5IGFsbCBtYXBwZWQgc3VyZmFjZXMgb2YgdGhlIGNoYW5nZSAqLworCVNETF9Gb3JtYXRDaGFuZ2VkKFNETF9WaWRlb1N1cmZhY2UpOworfQorCisvKiBFeHBvcnRlZCBmb3IgdGhlIHdpbmRvd3MgbWVzc2FnZSBsb29wIG9ubHkgKi8KK3ZvaWQgRFg1X1dpblBBSU5UKF9USElTLCBIREMgaGRjKQoreworCVNETF9VcGRhdGVSZWN0KFNETF9QdWJsaWNTdXJmYWNlLCAwLCAwLCAwLCAwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDV2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5keDUvU0RMX2R4NXZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3NTRhMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDV2aWRlby5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfZHg1dmlkZW9faAorI2RlZmluZSBfU0RMX2R4NXZpZGVvX2gKKworI2luY2x1ZGUgImRpcmVjdHguaCIKKworLyogUHJpdmF0ZSBkaXNwbGF5IGRhdGEgKi8KK3N0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSB7CisgICAgTFBESVJFQ1REUkFXMiBkZHJhdzI7CisgICAgTFBESVJFQ1REUkFXU1VSRkFDRTMgU0RMX3ByaW1hcnk7CisgICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBTRExfY2xpcHBlcjsKKyAgICBMUERJUkVDVERSQVdQQUxFVFRFIFNETF9wYWxldHRlOworICAgIFBBTEVUVEVFTlRSWSBTRExfY29sb3JzWzI1Nl07CisgICAgaW50IGNvbG9yY2hhbmdlX2V4cGVjdGVkOworCisjZGVmaW5lIE5VTV9NT0RFTElTVFMJNAkJLyogOCwgMTYsIDI0LCBhbmQgMzIgYml0cy1wZXItcGl4ZWwgKi8KKyAgICBpbnQgU0RMX251bW1vZGVzW05VTV9NT0RFTElTVFNdOworICAgIFNETF9SZWN0ICoqU0RMX21vZGVsaXN0W05VTV9NT0RFTElTVFNdOworICAgIGludCBTRExfbW9kZWluZGV4W05VTV9NT0RFTElTVFNdOworfTsKKy8qIE9sZCB2YXJpYWJsZSBuYW1lcyAqLworI2RlZmluZSBkZHJhdzIJCQkodGhpcy0+aGlkZGVuLT5kZHJhdzIpCisjZGVmaW5lIFNETF9wcmltYXJ5CQkodGhpcy0+aGlkZGVuLT5TRExfcHJpbWFyeSkKKyNkZWZpbmUgU0RMX2NsaXBwZXIJCSh0aGlzLT5oaWRkZW4tPlNETF9jbGlwcGVyKQorI2RlZmluZSBTRExfcGFsZXR0ZQkJKHRoaXMtPmhpZGRlbi0+U0RMX3BhbGV0dGUpCisjZGVmaW5lIFNETF9jb2xvcnMJCSh0aGlzLT5oaWRkZW4tPlNETF9jb2xvcnMpCisjZGVmaW5lIGNvbG9yY2hhbmdlX2V4cGVjdGVkCSh0aGlzLT5oaWRkZW4tPmNvbG9yY2hhbmdlX2V4cGVjdGVkKQorI2RlZmluZSBTRExfbnVtbW9kZXMJCSh0aGlzLT5oaWRkZW4tPlNETF9udW1tb2RlcykKKyNkZWZpbmUgU0RMX21vZGVsaXN0CQkodGhpcy0+aGlkZGVuLT5TRExfbW9kZWxpc3QpCisjZGVmaW5lIFNETF9tb2RlaW5kZXgJCSh0aGlzLT5oaWRkZW4tPlNETF9tb2RlaW5kZXgpCisKKy8qIERpcmVjdFggZnVuY3Rpb24gcG9pbnRlcnMgZm9yIHZpZGVvIGFuZCBldmVudHMgKi8KK2V4dGVybiBIUkVTVUxUIChXSU5BUEkgKkREcmF3Q3JlYXRlKSggR1VJRCBGQVIgKmxwR1VJRCwgTFBESVJFQ1REUkFXIEZBUiAqbHBscERELCBJVW5rbm93biBGQVIgKnBVbmtPdXRlciApOworZXh0ZXJuIEhSRVNVTFQgKFdJTkFQSSAqRElucHV0Q3JlYXRlKShISU5TVEFOQ0UgaGluc3QsIERXT1JEIGR3VmVyc2lvbiwgTFBESVJFQ1RJTlBVVCAqcHBESSwgTFBVTktOT1dOIHB1bmtPdXRlcik7CisKKy8qIERpcmVjdERyYXcgZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9uICovCitleHRlcm4gdm9pZCBTZXRERGVycm9yKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBpbnQgY29kZSk7CisKKyNlbmRpZiAvKiBfU0RMX2R4NXZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDV5dXYuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDV5dXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjg5ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5keDUvU0RMX2R4NXl1di5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBpcyB0aGUgRGlyZWN0RHJhdyBpbXBsZW1lbnRhdGlvbiBvZiBZVVYgdmlkZW8gb3ZlcmxheXMgKi8KKyNpbmNsdWRlICJkaXJlY3R4LmgiCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX2R4NXl1dl9jLmgiCisjaW5jbHVkZSAiLi4vU0RMX3l1dmZ1bmNzLmgiCisKKy8vI2RlZmluZSBVU0VfRElSRUNUWF9PVkVSTEFZCisKKy8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBtYW5pcHVsYXRlIHNvZnR3YXJlIHZpZGVvIG92ZXJsYXlzICovCitzdGF0aWMgc3RydWN0IHByaXZhdGVfeXV2aHdmdW5jcyBkeDVfeXV2ZnVuY3MgPSB7CisJRFg1X0xvY2tZVVZPdmVybGF5LAorCURYNV9VbmxvY2tZVVZPdmVybGF5LAorCURYNV9EaXNwbGF5WVVWT3ZlcmxheSwKKwlEWDVfRnJlZVlVVk92ZXJsYXkKK307CisKK3N0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSB7CisJTFBESVJFQ1REUkFXU1VSRkFDRTMgc3VyZmFjZTsKKworCS8qIFRoZXNlIGFyZSBqdXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgdGhlbSBzZXBhcmF0ZWx5ICovCisJVWludDE2IHBpdGNoZXNbM107CisJVWludDggKnBsYW5lc1szXTsKK307CisKKworc3RhdGljIExQRElSRUNURFJBV1NVUkZBQ0UzIENyZWF0ZVlVVlN1cmZhY2UoX1RISVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgVWludDMyIGZvcm1hdCkKK3sKKwlIUkVTVUxUIHJlc3VsdDsKKwlMUERJUkVDVERSQVdTVVJGQUNFICBkZF9zdXJmYWNlMTsKKwlMUERJUkVDVERSQVdTVVJGQUNFMyBkZF9zdXJmYWNlMzsKKwlERFNVUkZBQ0VERVNDIGRkc2Q7CisKKwkvKiBTZXQgdXAgdGhlIHN1cmZhY2UgZGVzY3JpcHRpb24gKi8KKwlTRExfbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOworCWRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOworCWRkc2QuZHdGbGFncyA9IChERFNEX1dJRFRIfEREU0RfSEVJR0hUfEREU0RfQ0FQU3xERFNEX1BJWEVMRk9STUFUKTsKKwlkZHNkLmR3V2lkdGggPSB3aWR0aDsKKwlkZHNkLmR3SGVpZ2h0PSBoZWlnaHQ7CisjaWZkZWYgVVNFX0RJUkVDVFhfT1ZFUkxBWQorCWRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSAoRERTQ0FQU19PVkVSTEFZfEREU0NBUFNfVklERU9NRU1PUlkpOworI2Vsc2UKKwlkZHNkLmRkc0NhcHMuZHdDYXBzID0gKEREU0NBUFNfT0ZGU0NSRUVOUExBSU58RERTQ0FQU19WSURFT01FTU9SWSk7CisjZW5kaWYKKwlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoZGRzZC5kZHBmUGl4ZWxGb3JtYXQpOworCWRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPSBERFBGX0ZPVVJDQzsKKwlkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQyA9IGZvcm1hdDsKKworCS8qIENyZWF0ZSB0aGUgRGlyZWN0RHJhdyB2aWRlbyBzdXJmYWNlICovCisJcmVzdWx0ID0gSURpcmVjdERyYXcyX0NyZWF0ZVN1cmZhY2UoZGRyYXcyLCAmZGRzZCwgJmRkX3N1cmZhY2UxLCBOVUxMKTsgCisJaWYgKCByZXN1bHQgIT0gRERfT0sgKSB7CisJCVNldEREZXJyb3IoIkRpcmVjdERyYXcyOjpDcmVhdGVTdXJmYWNlIiwgcmVzdWx0KTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoZGRfc3VyZmFjZTEsCisJCQkmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTMsIChMUFZPSUQgKikmZGRfc3VyZmFjZTMpOworCUlEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGRkX3N1cmZhY2UxKTsKKwlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2U6OlF1ZXJ5SW50ZXJmYWNlIiwgcmVzdWx0KTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgc3VyZmFjZSBmb3JtYXQgd2FzIHNldCBwcm9wZXJseSAqLworCVNETF9tZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CisJZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CisJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19Mb2NrKGRkX3N1cmZhY2UzLCBOVUxMLAorCQkJCQkgICZkZHNkLCBERExPQ0tfTk9TWVNMT0NLLCBOVUxMKTsKKwlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpMb2NrIiwgcmVzdWx0KTsKKwkJSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoZGRfc3VyZmFjZTMpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCUlEaXJlY3REcmF3U3VyZmFjZTNfVW5sb2NrKGRkX3N1cmZhY2UzLCBOVUxMKTsKKworCWlmICggIShkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpIHx8CisJICAgICAgKGRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDICE9IGZvcm1hdCkgKSB7CisJCVNETF9TZXRFcnJvcigiRERyYXcgZGlkbid0IHVzZSByZXF1ZXN0ZWQgRm91ckNDIGZvcm1hdCIpOworCQlJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShkZF9zdXJmYWNlMyk7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBXZSdyZSByZWFkeSB0byBnbyEgKi8KKwlyZXR1cm4oZGRfc3VyZmFjZTMpOworfQorCisjaWZkZWYgREVCVUdfWVVWCitzdGF0aWMgY2hhciAqUHJpbnRGT1VSQ0MoVWludDMyIGNvZGUpCit7CisJc3RhdGljIGNoYXIgYnVmWzVdOworCisJYnVmWzNdID0gY29kZSA+PiAyNDsKKwlidWZbMl0gPSAoY29kZSA+PiAxNikgJiAweEZGOworCWJ1ZlsxXSA9IChjb2RlID4+IDgpICYgMHhGRjsKKwlidWZbMF0gPSAoY29kZSAmIDB4RkYpOworCXJldHVybihidWYpOworfQorI2VuZGlmCisKK1NETF9PdmVybGF5ICpEWDVfQ3JlYXRlWVVWT3ZlcmxheShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBVaW50MzIgZm9ybWF0LCBTRExfU3VyZmFjZSAqZGlzcGxheSkKK3sKKwlTRExfT3ZlcmxheSAqb3ZlcmxheTsKKwlzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgKmh3ZGF0YTsKKworI2lmZGVmIERFQlVHX1lVVgorCURXT1JEIG51bWNvZGVzOworCURXT1JEICpjb2RlczsKKworCXByaW50ZigiRk9VUkNDIGZvcm1hdCByZXF1ZXN0ZWQ6IDB4JXhcbiIsIFByaW50Rk9VUkNDKGZvcm1hdCkpOworCUlEaXJlY3REcmF3Ml9HZXRGb3VyQ0NDb2RlcyhkZHJhdzIsICZudW1jb2RlcywgTlVMTCk7CisJaWYgKCBudW1jb2RlcyApIHsKKwkJRFdPUkQgaTsKKwkJY29kZXMgPSBTRExfbWFsbG9jKG51bWNvZGVzKnNpemVvZigqY29kZXMpKTsKKwkJaWYgKCBjb2RlcyApIHsKKwkJCUlEaXJlY3REcmF3Ml9HZXRGb3VyQ0NDb2RlcyhkZHJhdzIsICZudW1jb2RlcywgY29kZXMpOworCQkJZm9yICggaT0wOyBpPG51bWNvZGVzOyArK2kgKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDb2RlICVkOiAweCV4XG4iLCBpLCBQcmludEZPVVJDQyhjb2Rlc1tpXSkpOworCQkJfQorCQkJU0RMX2ZyZWUoY29kZXMpOworCQl9CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBGT1VSQ0MgY29kZXMgc3VwcG9ydGVkXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIENyZWF0ZSB0aGUgb3ZlcmxheSBzdHJ1Y3R1cmUgKi8KKwlvdmVybGF5ID0gKFNETF9PdmVybGF5ICopU0RMX21hbGxvYyhzaXplb2YgKm92ZXJsYXkpOworCWlmICggb3ZlcmxheSA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlTRExfbWVtc2V0KG92ZXJsYXksIDAsIChzaXplb2YgKm92ZXJsYXkpKTsKKworCS8qIEZpbGwgaW4gdGhlIGJhc2ljIG1lbWJlcnMgKi8KKwlvdmVybGF5LT5mb3JtYXQgPSBmb3JtYXQ7CisJb3ZlcmxheS0+dyA9IHdpZHRoOworCW92ZXJsYXktPmggPSBoZWlnaHQ7CisKKwkvKiBTZXQgdXAgdGhlIFlVViBzdXJmYWNlIGZ1bmN0aW9uIHN0cnVjdHVyZSAqLworCW92ZXJsYXktPmh3ZnVuY3MgPSAmZHg1X3l1dmZ1bmNzOworCisJLyogQ3JlYXRlIHRoZSBwaXhlbCBkYXRhIGFuZCBsb29rdXAgdGFibGVzICovCisJaHdkYXRhID0gKHN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqKVNETF9tYWxsb2Moc2l6ZW9mICpod2RhdGEpOworCW92ZXJsYXktPmh3ZGF0YSA9IGh3ZGF0YTsKKwlpZiAoIGh3ZGF0YSA9PSBOVUxMICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWh3ZGF0YS0+c3VyZmFjZSA9IENyZWF0ZVlVVlN1cmZhY2UodGhpcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKwlpZiAoIGh3ZGF0YS0+c3VyZmFjZSA9PSBOVUxMICkgeworCQlTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisJCXJldHVybihOVUxMKTsKKwl9CisJb3ZlcmxheS0+aHdfb3ZlcmxheSA9IDE7CisKKwkvKiBTZXQgdXAgdGhlIHBsYW5lIHBvaW50ZXJzICovCisJb3ZlcmxheS0+cGl0Y2hlcyA9IGh3ZGF0YS0+cGl0Y2hlczsKKwlvdmVybGF5LT5waXhlbHMgPSBod2RhdGEtPnBsYW5lczsKKwlzd2l0Y2ggKGZvcm1hdCkgeworCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6CisJICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKKwkJb3ZlcmxheS0+cGxhbmVzID0gMzsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCW92ZXJsYXktPnBsYW5lcyA9IDE7CisJCWJyZWFrOworCX0KKworCS8qIFdlJ3JlIGFsbCBkb25lLi4gKi8KKwlyZXR1cm4ob3ZlcmxheSk7Cit9CisKK2ludCBEWDVfTG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQoreworCUhSRVNVTFQgcmVzdWx0OworCUxQRElSRUNURFJBV1NVUkZBQ0UzIHN1cmZhY2U7CisJRERTVVJGQUNFREVTQyBkZHNkOworCisJc3VyZmFjZSA9IG92ZXJsYXktPmh3ZGF0YS0+c3VyZmFjZTsKKwlTRExfbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOworCWRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOworCXJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTNfTG9jayhzdXJmYWNlLCBOVUxMLAorCQkJCQkgICZkZHNkLCBERExPQ0tfTk9TWVNMT0NLLCBOVUxMKTsKKwlpZiAoIHJlc3VsdCA9PSBEREVSUl9TVVJGQUNFTE9TVCApIHsKKwkJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19SZXN0b3JlKHN1cmZhY2UpOworCQlyZXN1bHQgPSBJRGlyZWN0RHJhd1N1cmZhY2UzX0xvY2soc3VyZmFjZSwgTlVMTCwgJmRkc2QsIAorCQkJCQkoRERMT0NLX05PU1lTTE9DS3xERExPQ0tfV0FJVCksIE5VTEwpOworCX0KKwlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpMb2NrIiwgcmVzdWx0KTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBGaW5kIHRoZSBwaXRjaCBhbmQgb2Zmc2V0IHZhbHVlcyBmb3IgdGhlIG92ZXJsYXkgKi8KKyNpZiBkZWZpbmVkKE5PTkFNRUxFU1NVTklPTikKKwlvdmVybGF5LT5waXRjaGVzWzBdID0gKFVpbnQxNilkZHNkLnUxLmxQaXRjaDsKKyNlbHNlCisJb3ZlcmxheS0+cGl0Y2hlc1swXSA9IChVaW50MTYpZGRzZC5sUGl0Y2g7CisjZW5kaWYKKwlvdmVybGF5LT5waXhlbHNbMF0gPSAoVWludDggKilkZHNkLmxwU3VyZmFjZTsKKwlzd2l0Y2ggKG92ZXJsYXktPmZvcm1hdCkgeworCSAgICBjYXNlIFNETF9ZVjEyX09WRVJMQVk6CisJICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKKwkJLyogQWRkIHRoZSB0d28gZXh0cmEgcGxhbmVzICovCisJCW92ZXJsYXktPnBpdGNoZXNbMV0gPSBvdmVybGF5LT5waXRjaGVzWzBdIC8gMjsKKwkJb3ZlcmxheS0+cGl0Y2hlc1syXSA9IG92ZXJsYXktPnBpdGNoZXNbMF0gLyAyOworCSAgICAgICAgb3ZlcmxheS0+cGl4ZWxzWzFdID0gb3ZlcmxheS0+cGl4ZWxzWzBdICsKKwkJICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS0+cGl0Y2hlc1swXSAqIG92ZXJsYXktPmg7CisJICAgICAgICBvdmVybGF5LT5waXhlbHNbMl0gPSBvdmVybGF5LT5waXhlbHNbMV0gKworCQkgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LT5waXRjaGVzWzFdICogb3ZlcmxheS0+aCAvIDI7CisJICAgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJLyogT25seSBvbmUgcGxhbmUsIG5vIHdvcnJpZXMgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybigwKTsKK30KKwordm9pZCBEWDVfVW5sb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCit7CisJTFBESVJFQ1REUkFXU1VSRkFDRTMgc3VyZmFjZTsKKworCXN1cmZhY2UgPSBvdmVybGF5LT5od2RhdGEtPnN1cmZhY2U7CisJSURpcmVjdERyYXdTdXJmYWNlM19VbmxvY2soc3VyZmFjZSwgTlVMTCk7Cit9CisKK2ludCBEWDVfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KQoreworCUhSRVNVTFQgcmVzdWx0OworCUxQRElSRUNURFJBV1NVUkZBQ0UzIHN1cmZhY2U7CisJUkVDVCBzcmNyZWN0LCBkc3RyZWN0OworCisJc3VyZmFjZSA9IG92ZXJsYXktPmh3ZGF0YS0+c3VyZmFjZTsKKwlzcmNyZWN0LnRvcCA9IHNyYy0+eTsKKwlzcmNyZWN0LmJvdHRvbSA9IHNyY3JlY3QudG9wK3NyYy0+aDsKKwlzcmNyZWN0LmxlZnQgPSBzcmMtPng7CisJc3JjcmVjdC5yaWdodCA9IHNyY3JlY3QubGVmdCtzcmMtPnc7CisJZHN0cmVjdC50b3AgPSBTRExfYm91bmRzLnRvcCtkc3QtPnk7CisJZHN0cmVjdC5sZWZ0ID0gU0RMX2JvdW5kcy5sZWZ0K2RzdC0+eDsKKwlkc3RyZWN0LmJvdHRvbSA9IGRzdHJlY3QudG9wK2RzdC0+aDsKKwlkc3RyZWN0LnJpZ2h0ID0gZHN0cmVjdC5sZWZ0K2RzdC0+dzsKKyNpZmRlZiBVU0VfRElSRUNUWF9PVkVSTEFZCisJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19VcGRhdGVPdmVybGF5KHN1cmZhY2UsICZzcmNyZWN0LAorCQkJCVNETF9wcmltYXJ5LCAmZHN0cmVjdCwgRERPVkVSX1NIT1csIE5VTEwpOworCWlmICggcmVzdWx0ICE9IEREX09LICkgeworCQlTZXRERGVycm9yKCJEaXJlY3REcmF3U3VyZmFjZTM6OlVwZGF0ZU92ZXJsYXkiLCByZXN1bHQpOworCQlyZXR1cm4oLTEpOworCX0KKyNlbHNlCisJcmVzdWx0ID0gSURpcmVjdERyYXdTdXJmYWNlM19CbHQoU0RMX3ByaW1hcnksICZkc3RyZWN0LCBzdXJmYWNlLCAmc3JjcmVjdCwKKwkJCQkJCQlEREJMVF9XQUlULCBOVUxMKTsKKwlpZiAoIHJlc3VsdCAhPSBERF9PSyApIHsKKwkJU2V0RERlcnJvcigiRGlyZWN0RHJhd1N1cmZhY2UzOjpCbHQiLCByZXN1bHQpOworCQlyZXR1cm4oLTEpOworCX0KKyNlbmRpZgorCXJldHVybigwKTsKK30KKwordm9pZCBEWDVfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQoreworCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhOworCisJaHdkYXRhID0gb3ZlcmxheS0+aHdkYXRhOworCWlmICggaHdkYXRhICkgeworCQlpZiAoIGh3ZGF0YS0+c3VyZmFjZSApIHsKKwkJCUlEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGh3ZGF0YS0+c3VyZmFjZSk7CisJCX0KKwkJU0RMX2ZyZWUoaHdkYXRhKTsKKwkJb3ZlcmxheS0+aHdkYXRhID0gTlVMTDsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDV5dXZfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93aW5keDUvU0RMX2R4NXl1dl9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjZWFmOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L1NETF9keDV5dXZfYy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBUaGlzIGlzIHRoZSBEaXJlY3REcmF3IGltcGxlbWVudGF0aW9uIG9mIFlVViB2aWRlbyBvdmVybGF5cyAqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vd2luY29tbW9uL1NETF9sb3d2aWRlby5oIgorI2luY2x1ZGUgIlNETF9keDV2aWRlby5oIgorCitleHRlcm4gU0RMX092ZXJsYXkgKkRYNV9DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KTsKKworZXh0ZXJuIGludCBEWDVfTG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKKworZXh0ZXJuIHZvaWQgRFg1X1VubG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKKworZXh0ZXJuIGludCBEWDVfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KTsKKworZXh0ZXJuIHZvaWQgRFg1X0ZyZWVZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmR4NS9kaXJlY3R4LmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dpbmR4NS9kaXJlY3R4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmNTM2NQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd2luZHg1L2RpcmVjdHguaApAQCAtMCwwICsxLDk3IEBACisKKyNpZm5kZWYgX2RpcmVjdHhfaAorI2RlZmluZSBfZGlyZWN0eF9oCisKKy8qIEluY2x1ZGUgYWxsIG9mIHRoZSBEaXJlY3RYIDUuMCBoZWFkZXJzIGFuZCBhZGRzIGFueSBuZWNlc3NhcnkgdHdlYWtzICovCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtbXN5c3RlbS5oPgorI2lmbmRlZiBXSU4zMgorI2RlZmluZSBXSU4zMgorI2VuZGlmCisjdW5kZWYgIFdJTk5UCisKKy8qIEZhciBwb2ludGVycyBkb24ndCBleGlzdCBpbiAzMi1iaXQgY29kZSAqLworI2lmbmRlZiBGQVIKKyNkZWZpbmUgRkFSCisjZW5kaWYKKworLyogRXJyb3IgY29kZXMgbm90IHlldCBpbmNsdWRlZCBpbiBXaW4zMiBBUEkgaGVhZGVyIGZpbGVzICovCisjaWZuZGVmIE1BS0VfSFJFU1VMVAorI2RlZmluZSBNQUtFX0hSRVNVTFQoc2V2LGZhYyxjb2RlKSBcCisJKChIUkVTVUxUKSgoKHVuc2lnbmVkIGxvbmcpKHNldik8PDMxKSB8ICgodW5zaWduZWQgbG9uZykoZmFjKTw8MTYpIHwgKCh1bnNpZ25lZCBsb25nKShjb2RlKSkpKQorI2VuZGlmCisKKyNpZm5kZWYgU19PSworI2RlZmluZSBTX09LCQkoSFJFU1VMVCkweDAwMDAwMDAwTAorI2VuZGlmCisKKyNpZm5kZWYgU1VDQ0VFREVECisjZGVmaW5lIFNVQ0NFRURFRCh4KQkoKEhSRVNVTFQpKHgpID49IDApCisjZW5kaWYKKyNpZm5kZWYgRkFJTEVECisjZGVmaW5lIEZBSUxFRCh4KQkoKEhSRVNVTFQpKHgpPDApCisjZW5kaWYKKworI2lmbmRlZiBFX0ZBSUwKKyNkZWZpbmUgRV9GQUlMCQkoSFJFU1VMVCkweDgwMDAwMDA4TAorI2VuZGlmCisjaWZuZGVmIEVfTk9JTlRFUkZBQ0UKKyNkZWZpbmUgRV9OT0lOVEVSRkFDRQkoSFJFU1VMVCkweDgwMDA0MDAyTAorI2VuZGlmCisjaWZuZGVmIEVfT1VUT0ZNRU1PUlkKKyNkZWZpbmUgRV9PVVRPRk1FTU9SWQkoSFJFU1VMVCkweDgwMDcwMDBFTAorI2VuZGlmCisjaWZuZGVmIEVfSU5WQUxJREFSRworI2RlZmluZSBFX0lOVkFMSURBUkcJKEhSRVNVTFQpMHg4MDA3MDA1N0wKKyNlbmRpZgorI2lmbmRlZiBFX05PVElNUEwKKyNkZWZpbmUgRV9OT1RJTVBMCShIUkVTVUxUKTB4ODAwMDQwMDFMCisjZW5kaWYKKyNpZm5kZWYgUkVHREJfRV9DTEFTU05PVFJFRworI2RlZmluZSBSRUdEQl9FX0NMQVNTTk9UUkVHCShIUkVTVUxUKTB4ODAwNDAxNTRMCisjZW5kaWYKKworLyogU2V2ZXJpdHkgY29kZXMgKi8KKyNpZm5kZWYgU0VWRVJJVFlfRVJST1IKKyNkZWZpbmUgU0VWRVJJVFlfRVJST1IJMQorI2VuZGlmCisKKy8qIEVycm9yIGZhY2lsaXR5IGNvZGVzICovCisjaWZuZGVmIEZBQ0lMSVRZX1dJTjMyCisjZGVmaW5lIEZBQ0lMSVRZX1dJTjMyCTcKKyNlbmRpZgorCisjaWZuZGVmIEZJRUxEX09GRlNFVAorI2RlZmluZSBGSUVMRF9PRkZTRVQodHlwZSwgZmllbGQpICAgICgoTE9ORykmKCgodHlwZSAqKTApLT5maWVsZCkpCisjZW5kaWYKKworLyogRGlyZWN0WCBoZWFkZXJzIChpZiBpdCBpc24ndCBpbmNsdWRlZCwgSSBoYXZlbid0IHRlc3RlZCBpdCB5ZXQpCisgKi8KKy8qIFdlIG5lZWQgdGhlc2UgZGVmaW5lcyB0byBtYXJrIHdoYXQgdmVyc2lvbiBvZiBEaXJlY3RYIEFQSSB3ZSB1c2UgKi8KKyNkZWZpbmUgRElSRUNURFJBV19WRVJTSU9OICAweDA3MDAKKyNkZWZpbmUgRElSRUNUU09VTkRfVkVSU0lPTiAweDA1MDAKKyNkZWZpbmUgRElSRUNUSU5QVVRfVkVSU0lPTiAweDA3MDAKKworI2luY2x1ZGUgPGRkcmF3Lmg+CisjaW5jbHVkZSA8ZHNvdW5kLmg+CisjaW5jbHVkZSA8ZGlucHV0Lmg+CisKKyNpZiBESVJFQ1RJTlBVVF9WRVJTSU9OID49IDB4MDcwMCAmJiAhZGVmaW5lZChESU1PRlNfQlVUVE9ONCkKK3R5cGVkZWYgc3RydWN0IF9ESU1PVVNFU1RBVEUyIHsKKyAgICBMT05HICAgIGxYOworICAgIExPTkcgICAgbFk7CisgICAgTE9ORyAgICBsWjsKKyAgICBCWVRFICAgIHJnYkJ1dHRvbnNbOF07Cit9IERJTU9VU0VTVEFURTIsICpMUERJTU9VU0VTVEFURTI7CisKKyNkZWZpbmUgRElNT0ZTX0JVVFRPTjQgKEZJRUxEX09GRlNFVChESU1PVVNFU1RBVEUyLCByZ2JCdXR0b25zKSArIDQpCisjZGVmaW5lIERJTU9GU19CVVRUT041IChGSUVMRF9PRkZTRVQoRElNT1VTRVNUQVRFMiwgcmdiQnV0dG9ucykgKyA1KQorI2RlZmluZSBESU1PRlNfQlVUVE9ONiAoRklFTERfT0ZGU0VUKERJTU9VU0VTVEFURTIsIHJnYkJ1dHRvbnMpICsgNikKKyNkZWZpbmUgRElNT0ZTX0JVVFRPTjcgKEZJRUxEX09GRlNFVChESU1PVVNFU1RBVEUyLCByZ2JCdXR0b25zKSArIDcpCisKK2V4dGVybiBjb25zdCBESURBVEFGT1JNQVQgY19kZkRJTW91c2UyOworI2VuZGlmCisKKyNlbmRpZiAvKiBfZGlyZWN0eF9oICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dzY29ucy9TRExfd3Njb25zZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dzY29ucy9TRExfd3Njb25zZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1Yjk3MgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnNldmVudHMuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkZXYvd3Njb25zL3dzZGlzcGxheV91c2xfaW8uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPiAgICAKKyNpbmNsdWRlIDx1bmlzdGQuaD4gIAorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxlcnJuby5oPiAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF93c2NvbnN2aWRlby5oIgorI2luY2x1ZGUgIlNETF93c2NvbnNldmVudHNfYy5oIgorCitzdGF0aWMgaW50IHBvc3RlZCA9IDA7CisKK2ludCBXU0NPTlNfSW5pdEtleWJvYXJkKF9USElTKQoreworICBzdHJ1Y3QgdGVybWlvcyB0dHk7CisKKyAgaWYgKGlvY3RsKHByaXZhdGUtPmZkLCBXU0tCRElPX0dUWVBFLCAmcHJpdmF0ZS0+a2JkVHlwZSkgPT0gLTEpIHsKKyAgICBXU0NPTlNfUmVwb3J0RXJyb3IoImNhbm5vdCBnZXQga2V5Ym9hcmQgdHlwZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICh0Y2dldGF0dHIocHJpdmF0ZS0+ZmQsICZwcml2YXRlLT5zYXZlZF90dHkpID09IC0xKSB7CisgICAgV1NDT05TX1JlcG9ydEVycm9yKCJjYW5ub3QgZ2V0IHRlcm1pbmFsIGF0dHJpYnV0ZXM6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcHJpdmF0ZS0+ZGlkX3NhdmVfdHR5ID0gMTsKKyAgdHR5ID0gcHJpdmF0ZS0+c2F2ZWRfdHR5OworICB0dHkuY19pZmxhZyA9IElHTlBBUiB8IElHTkJSSzsKKyAgdHR5LmNfb2ZsYWcgPSAwOworICB0dHkuY19jZmxhZyA9IENSRUFEIHwgQ1M4OworICB0dHkuY19sZmxhZyA9IDA7CisgIHR0eS5jX2NjW1ZUSU1FXSA9IDA7CisgIHR0eS5jX2NjW1ZNSU5dID0gMTsKKyAgY2ZzZXRpc3BlZWQoJnR0eSwgOTYwMCk7CisgIGNmc2V0b3NwZWVkKCZ0dHksIDk2MDApOworICBpZiAodGNzZXRhdHRyKHByaXZhdGUtPmZkLCBUQ1NBTk9XLCAmdHR5KSA8IDApIHsKKyAgICBXU0NPTlNfUmVwb3J0RXJyb3IoImNhbm5vdCBzZXQgdGVybWluYWwgYXR0cmlidXRlczogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoaW9jdGwocHJpdmF0ZS0+ZmQsIEtEU0tCTU9ERSwgS19SQVcpID09IC0xKSB7CisgICAgV1NDT05TX1JlcG9ydEVycm9yKCJjYW5ub3Qgc2V0IHJhdyBrZXlib2FyZCBtb2RlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgV1NDT05TX1JlbGVhc2VLZXlib2FyZChfVEhJUykKK3sKKyAgaWYgKHByaXZhdGUtPmZkICE9IC0xKSB7CisgICAgaWYgKGlvY3RsKHByaXZhdGUtPmZkLCBLRFNLQk1PREUsIEtfWExBVEUpID09IC0xKSB7CisgICAgICBXU0NPTlNfUmVwb3J0RXJyb3IoImNhbm5vdCByZXN0b3JlIGtleWJvYXJkIHRvIHRyYW5zbGF0ZWQgbW9kZTogJXMiLAorCQkJIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorICAgIGlmIChwcml2YXRlLT5kaWRfc2F2ZV90dHkpIHsKKyAgICAgIGlmICh0Y3NldGF0dHIocHJpdmF0ZS0+ZmQsIFRDU0FOT1csICZwcml2YXRlLT5zYXZlZF90dHkpIDwgMCkgeworCVdTQ09OU19SZXBvcnRFcnJvcigiY2Fubm90IHJlc3RvcmUga2V5bm9hcmQgYXR0cmlidXRlczogJXMiLAorCQkJICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgdXBkYXRlTW91c2UoKQoreworfQorCitzdGF0aWMgU0RMS2V5IGtleW1hcFsxMjhdOworCitzdGF0aWMgU0RMX2tleXN5bSAqVHJhbnNsYXRlS2V5KGludCBzY2FuY29kZSwgU0RMX2tleXN5bSAqa2V5c3ltKQoreworICBrZXlzeW0tPnNjYW5jb2RlID0gc2NhbmNvZGU7CisgIGtleXN5bS0+c3ltID0gU0RMS19VTktOT1dOOworICBrZXlzeW0tPm1vZCA9IEtNT0RfTk9ORTsKKworICBpZiAoc2NhbmNvZGUgPCBTRExfYXJyYXlzaXplKGtleW1hcCkpCisgICAga2V5c3ltLT5zeW0gPSBrZXltYXBbc2NhbmNvZGVdOworCisgIGlmIChrZXlzeW0tPnN5bSA9PSBTRExLX1VOS05PV04pCisgICAgcHJpbnRmKCJVbmtub3duIG1hcHBpbmcgZm9yIHNjYW5jb2RlICVkXG4iLCBzY2FuY29kZSk7CisKKyAgcmV0dXJuIGtleXN5bTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlS2V5Ym9hcmQoX1RISVMpCit7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMF07CisgIFNETF9rZXlzeW0ga2V5c3ltOworICBpbnQgbiwgaTsKKworICBpZiAoKG4gPSByZWFkKHByaXZhdGUtPmZkLCBidWYsIHNpemVvZihidWYpKSkgPiAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgdW5zaWduZWQgY2hhciBjID0gYnVmW2ldICYgMHg3ZjsKKyAgICAgIGlmIChjID09IDIyNCkgLy8gc3BlY2lhbCBrZXkgcHJlZml4IC0tIHdoYXQgc2hvdWxkIHdlIGRvIHdpdGggaXQ/CisJY29udGludWU7CisgICAgICBwb3N0ZWQgKz0gU0RMX1ByaXZhdGVLZXlib2FyZCgoYnVmW2ldICYgMHg4MCkgPyBTRExfUkVMRUFTRUQgOiBTRExfUFJFU1NFRCwKKwkJCQkgICAgVHJhbnNsYXRlS2V5KGMsICZrZXlzeW0pKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBXU0NPTlNfUHVtcEV2ZW50cyhfVEhJUykKK3sKKyAgZG8geworICAgIHBvc3RlZCA9IDA7CisgICAgdXBkYXRlTW91c2UoKTsKKyAgICB1cGRhdGVLZXlib2FyZCh0aGlzKTsKKyAgfSB3aGlsZSAocG9zdGVkKTsKK30KKwordm9pZCBXU0NPTlNfSW5pdE9TS2V5bWFwKF9USElTKQoreworICBpbnQgaTsKKworICAvKiBNYWtlIHN1cmUgdW5rbm93biBrZXlzIGFyZSBtYXBwZWQgY29ycmVjdGx5ICovCisgIGZvciAoaT0wOyBpIDwgU0RMX2FycmF5c2l6ZShrZXltYXApOyBpKyspIHsKKyAgICBrZXltYXBbaV0gPSBTRExLX1VOS05PV047CisgIH0KKworICBzd2l0Y2ggKHByaXZhdGUtPmtiZFR5cGUpIHsKKyNpZmRlZiBXU0tCRF9UWVBFX1pBVVJVUworICBjYXNlIFdTS0JEX1RZUEVfWkFVUlVTOgorICAgIC8qIHRvcCByb3cgKi8KKyAgICBrZXltYXBbMl0gPSBTRExLXzE7CisgICAga2V5bWFwWzNdID0gU0RMS18yOworICAgIGtleW1hcFs0XSA9IFNETEtfMzsKKyAgICBrZXltYXBbNV0gPSBTRExLXzQ7CisgICAga2V5bWFwWzZdID0gU0RMS181OworICAgIGtleW1hcFs3XSA9IFNETEtfNjsKKyAgICBrZXltYXBbOF0gPSBTRExLXzc7CisgICAga2V5bWFwWzldID0gU0RMS184OworICAgIGtleW1hcFsxMF0gPSBTRExLXzk7CisgICAga2V5bWFwWzExXSA9IFNETEtfMDsKKyAgICBrZXltYXBbMTRdID0gU0RMS19CQUNLU1BBQ0U7CisgICAgCisgICAgLyogc2Vjb25kIHJvdyAqLworICAgIGtleW1hcFsxNl0gPSBTRExLX3E7CisgICAga2V5bWFwWzE3XSA9IFNETEtfdzsKKyAgICBrZXltYXBbMThdID0gU0RMS19lOworICAgIGtleW1hcFsxOV0gPSBTRExLX3I7CisgICAga2V5bWFwWzIwXSA9IFNETEtfdDsKKyAgICBrZXltYXBbMjFdID0gU0RMS195OworICAgIGtleW1hcFsyMl0gPSBTRExLX3U7CisgICAga2V5bWFwWzIzXSA9IFNETEtfaTsKKyAgICBrZXltYXBbMjRdID0gU0RMS19vOworICAgIGtleW1hcFsyNV0gPSBTRExLX3A7CisKKyAgICAvKiB0aGlyZCByb3cgKi8KKyAgICBrZXltYXBbMTVdID0gU0RMS19UQUI7CisgICAga2V5bWFwWzMwXSA9IFNETEtfYTsKKyAgICBrZXltYXBbMzFdID0gU0RMS19zOworICAgIGtleW1hcFszMl0gPSBTRExLX2Q7CisgICAga2V5bWFwWzMzXSA9IFNETEtfZjsKKyAgICBrZXltYXBbMzRdID0gU0RMS19nOworICAgIGtleW1hcFszNV0gPSBTRExLX2g7CisgICAga2V5bWFwWzM2XSA9IFNETEtfajsKKyAgICBrZXltYXBbMzddID0gU0RMS19rOworICAgIGtleW1hcFszOF0gPSBTRExLX2w7CisKKyAgICAvKiBmb3VydGggcm93ICovCisgICAga2V5bWFwWzQyXSA9IFNETEtfTFNISUZUOworICAgIGtleW1hcFs0NF0gPSBTRExLX3o7CisgICAga2V5bWFwWzQ1XSA9IFNETEtfeDsKKyAgICBrZXltYXBbNDZdID0gU0RMS19jOworICAgIGtleW1hcFs0N10gPSBTRExLX3Y7CisgICAga2V5bWFwWzQ4XSA9IFNETEtfYjsKKyAgICBrZXltYXBbNDldID0gU0RMS19uOworICAgIGtleW1hcFs1MF0gPSBTRExLX207CisgICAga2V5bWFwWzU0XSA9IFNETEtfUlNISUZUOworICAgIGtleW1hcFsyOF0gPSBTRExLX1JFVFVSTjsKKworICAgIC8qIGZpZnRoIHJvdyAqLworICAgIGtleW1hcFs1Nl0gPSBTRExLX0xBTFQ7CisgICAga2V5bWFwWzI5XSA9IFNETEtfTENUUkw7CisgICAgLyoga2V5bWFwWzU2XSA9IDsgKi8KKyAgICBrZXltYXBbMF0gPSBTRExLX0xTVVBFUjsKKyAgICBrZXltYXBbMTJdID0gU0RMS19NSU5VUzsKKyAgICBrZXltYXBbNTddID0gU0RMS19TUEFDRTsKKyAgICBrZXltYXBbNTFdID0gU0RMS19DT01NQTsKKyAgICBrZXltYXBbNTJdID0gU0RMS19QRVJJT0Q7CisKKyAgICAvKiBtaXNjICovCisgICAga2V5bWFwWzU5XSA9IFNETEtfRjE7CisgICAga2V5bWFwWzYwXSA9IFNETEtfRjI7CisgICAga2V5bWFwWzYxXSA9IFNETEtfRjM7CisgICAga2V5bWFwWzYyXSA9IFNETEtfRjQ7CisgICAga2V5bWFwWzYzXSA9IFNETEtfRjU7CisgICAga2V5bWFwWzFdID0gU0RMS19FU0NBUEU7CisgICAgLyoga2V5bWFwWzI4XSA9IFNETEtfS1BfRU5URVI7ICovCisgICAga2V5bWFwWzcyXSA9IFNETEtfVVA7CisgICAga2V5bWFwWzc1XSA9IFNETEtfTEVGVDsKKyAgICBrZXltYXBbNzddID0gU0RMS19SSUdIVDsKKyAgICBrZXltYXBbODBdID0gU0RMS19ET1dOOworICAgIGJyZWFrOworI2VuZGlmIC8qIFdTS0JEX1RZUEVfWkFVUlVTICovCisKKyAgZGVmYXVsdDoKKyAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIlVuYWJsZSB0byBtYXAga2V5cyBmb3Iga2V5Ym9hcmQgdHlwZSAldSIsIAorCQkgICAgICAgcHJpdmF0ZS0+a2JkVHlwZSk7CisgICAgYnJlYWs7CisgIH0KK30KKworLyogZW5kIG9mIFNETF93c2NvbnNldmVudHMuYyAuLi4gKi8KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc2V2ZW50c19jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dzY29ucy9TRExfd3Njb25zZXZlbnRzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhlZTZlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc2V2ZW50c19jLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTRExfd3Njb25zdmlkZW8uaCIKKworaW50IFdTQ09OU19Jbml0S2V5Ym9hcmQoX1RISVMpOwordm9pZCBXU0NPTlNfUmVsZWFzZUtleWJvYXJkKF9USElTKTsKKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgU0RMX3N5c2V2ZW50cy5jIHRvIG90aGVyIHBhcnRzIAorICAgb2YgdGhlIG5hdGl2ZSB2aWRlbyBzdWJzeXN0ZW0gKFNETF9zeXN2aWRlby5jKQorKi8KK2V4dGVybiB2b2lkIFdTQ09OU19Jbml0T1NLZXltYXAoX1RISVMpOworZXh0ZXJuIHZvaWQgV1NDT05TX1B1bXBFdmVudHMoX1RISVMpOworCisvKiBlbmQgb2YgU0RMX3dzY29uc2V2ZW50c19jLmggLi4uICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnNtb3VzZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc21vdXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5ZTBjNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnNtb3VzZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiU0RMX3dzY29uc21vdXNlX2MuaCIKKworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGRhdGEgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBjdXJzb3IgKi8KK3N0cnVjdCBXTWN1cnNvciB7CisJaW50IHVudXNlZDsKK307CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3dzY29ucy9TRExfd3Njb25zbW91c2VfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc21vdXNlX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzU0MzdiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc21vdXNlX2MuaApAQCAtMCwwICsxLDI2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF93c2NvbnN2aWRlby5oIgorCisvKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnN2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc3ZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4NTBkMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnN2aWRlby5jCkBAIC0wLDAgKzEsNjA5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxkZXYvd3Njb25zL3dzZGlzcGxheV91c2xfaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJTRExfdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfbW91c2UuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKyNpbmNsdWRlICIuLi9TRExfcGl4ZWxzX2MuaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisKKyNpbmNsdWRlICJTRExfd3Njb25zdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfd3Njb25zZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfd3Njb25zbW91c2VfYy5oIgorCisjZGVmaW5lIFdTQ09OU1ZJRF9EUklWRVJfTkFNRSAid3Njb25zIgorZW51bSB7CisgIFdTQ09OU19ST1RBVEVfTk9ORSA9IDAsCisgIFdTQ09OU19ST1RBVEVfQ0NXID0gOTAsCisgIFdTQ09OU19ST1RBVEVfVUQgPSAxODAsCisgIFdTQ09OU19ST1RBVEVfQ1cgPSAyNzAKK307CisKKyNkZWZpbmUgbWluKGEsYikgKChhKTwoYik/KGEpOihiKSkKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IFdTQ09OU19WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCk7CitzdGF0aWMgU0RMX1JlY3QgKipXU0NPTlNfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBTRExfU3VyZmFjZSAqV1NDT05TX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgV1NDT05TX1NldENvbG9ycyhfVEhJUywgaW50IGZpcnN0Y29sb3IsIGludCBuY29sb3JzLCBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgdm9pZCBXU0NPTlNfVmlkZW9RdWl0KF9USElTKTsKKworLyogSGFyZHdhcmUgc3VyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgV1NDT05TX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IFdTQ09OU19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBXU0NPTlNfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBXU0NPTlNfRnJlZUhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworCisvKiBldGMuICovCitzdGF0aWMgV1NDT05TX2JpdEJsaXQgV1NDT05TX2JsaXQxNjsKK3N0YXRpYyBXU0NPTlNfYml0QmxpdCBXU0NPTlNfYmxpdDE2YmxvY2tlZDsKK3N0YXRpYyB2b2lkIFdTQ09OU19VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCit2b2lkIFdTQ09OU19SZXBvcnRFcnJvcihjaGFyICpmbXQsIC4uLikKK3sKKyAgY2hhciBtZXNzYWdlWzIwMF07CisgIHZhX2xpc3QgdmFBcmdzOworICAKKyAgbWVzc2FnZVsxOTldID0gJ1wwJzsKKyAgCisgIHZhX3N0YXJ0KHZhQXJncywgZm10KTsKKyAgdnNucHJpbnRmKG1lc3NhZ2UsIDE5OSwgZm10LCB2YUFyZ3MpOworICB2YV9lbmQodmFBcmdzKTsKKworICBTRExfU2V0RXJyb3IobWVzc2FnZSk7IAorICBmcHJpbnRmKHN0ZGVyciwgIldTQ09OUyBlcnJvcjogJXNcbiIsIG1lc3NhZ2UpOworfQorCisvKiBXU0NPTlMgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBXU0NPTlNfQXZhaWxhYmxlKHZvaWQpCit7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBXU0NPTlNfRGVsZXRlRGV2aWNlKFNETF9WaWRlb0RldmljZSAqZGV2aWNlKQoreworICBTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisgIFNETF9mcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKldTQ09OU19DcmVhdGVEZXZpY2UoaW50IGRldmluZGV4KQoreworICBTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKyAgCisgIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisgIGRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKyAgaWYgKGRldmljZSA9PSBOVUxMKSB7CisgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgU0RMX21lbXNldChkZXZpY2UsIDAsIChzaXplb2YgKmRldmljZSkpOworICBkZXZpY2UtPmhpZGRlbiA9IAorICAgIChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKilTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+aGlkZGVuKSk7CisgIGlmIChkZXZpY2UtPmhpZGRlbiA9PSBOVUxMKSB7CisgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgU0RMX2ZyZWUoZGV2aWNlKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKyAgZGV2aWNlLT5oaWRkZW4tPmZkID0gLTE7CisgIAorICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgIGRldmljZS0+VmlkZW9Jbml0ID0gV1NDT05TX1ZpZGVvSW5pdDsKKyAgZGV2aWNlLT5MaXN0TW9kZXMgPSBXU0NPTlNfTGlzdE1vZGVzOworICBkZXZpY2UtPlNldFZpZGVvTW9kZSA9IFdTQ09OU19TZXRWaWRlb01vZGU7CisgIGRldmljZS0+U2V0Q29sb3JzID0gV1NDT05TX1NldENvbG9yczsKKyAgZGV2aWNlLT5VcGRhdGVSZWN0cyA9IFdTQ09OU19VcGRhdGVSZWN0czsKKyAgZGV2aWNlLT5WaWRlb1F1aXQgPSBXU0NPTlNfVmlkZW9RdWl0OworICBkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gV1NDT05TX0FsbG9jSFdTdXJmYWNlOworICBkZXZpY2UtPkxvY2tIV1N1cmZhY2UgPSBXU0NPTlNfTG9ja0hXU3VyZmFjZTsKKyAgZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBXU0NPTlNfVW5sb2NrSFdTdXJmYWNlOworICBkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBXU0NPTlNfRnJlZUhXU3VyZmFjZTsKKyAgZGV2aWNlLT5Jbml0T1NLZXltYXAgPSBXU0NPTlNfSW5pdE9TS2V5bWFwOworICBkZXZpY2UtPlB1bXBFdmVudHMgPSBXU0NPTlNfUHVtcEV2ZW50czsKKyAgZGV2aWNlLT5mcmVlID0gV1NDT05TX0RlbGV0ZURldmljZTsKKyAgCisgIHJldHVybiBkZXZpY2U7Cit9CisKK1ZpZGVvQm9vdFN0cmFwIFdTQ09OU19ib290c3RyYXAgPSB7CisgIFdTQ09OU1ZJRF9EUklWRVJfTkFNRSwKKyAgIlNETCB3c2NvbnMgdmlkZW8gZHJpdmVyIiwKKyAgV1NDT05TX0F2YWlsYWJsZSwKKyAgV1NDT05TX0NyZWF0ZURldmljZQorfTsKKworI2RlZmluZSBXU0NPTlNERVZfRk9STUFUICIvZGV2L3R0eUMlMDF4IgorCitpbnQgV1NDT05TX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KQoreworICBjaGFyIGRldm5hbWVidWZbMzBdOworICBjaGFyICpkZXZuYW1lOworICBjaGFyICpyb3RhdGlvbjsKKyAgaW50IHdzdHlwZTsKKyAgaW50IHdzbW9kZSA9IFdTRElTUExBWUlPX01PREVfRFVNQkZCOworICBzaXplX3QgbGVuLCBtYXBzaXplOworICBpbnQgcGFnZW1hc2s7CisgIGludCB3aWR0aCwgaGVpZ2h0OworICAKKyAgZGV2bmFtZSA9IFNETF9nZXRlbnYoIlNETF9XU0NPTlNERVYiKTsKKyAgaWYgKGRldm5hbWUgPT0gTlVMTCkgeworICAgIGludCBhY3RpdmVWVDsKKyAgICBpZiAoaW9jdGwoU1RESU5fRklMRU5PLCBWVF9HRVRBQ1RJVkUsICZhY3RpdmVWVCkgPT0gLTEpIHsKKyAgICAgIFdTQ09OU19SZXBvcnRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBhY3RpdmUgdGVybWluYWw6ICVzIiwgCisJCQkgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgU0RMX3NucHJpbnRmKGRldm5hbWVidWYsIHNpemVvZihkZXZuYW1lYnVmKSwgV1NDT05TREVWX0ZPUk1BVCwgYWN0aXZlVlQgLSAxKTsKKyAgICBkZXZuYW1lID0gZGV2bmFtZWJ1ZjsKKyAgfQorCisgIHByaXZhdGUtPmZkID0gb3BlbihkZXZuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKKyAgaWYgKHByaXZhdGUtPmZkID09IC0xKSB7CisgICAgV1NDT05TX1JlcG9ydEVycm9yKCJvcGVuICVzOiAlcyIsIGRldm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChpb2N0bChwcml2YXRlLT5mZCwgV1NESVNQTEFZSU9fR0lORk8sICZwcml2YXRlLT5pbmZvKSA9PSAtMSkgeworICAgIFdTQ09OU19SZXBvcnRFcnJvcigiaW9jdGwgV1NESVNQTEFZX0dJTkZPOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChpb2N0bChwcml2YXRlLT5mZCwgV1NESVNQTEFZSU9fR1RZUEUsICZ3c3R5cGUpID09IC0xKSB7CisgICAgV1NDT05TX1JlcG9ydEVycm9yKCJpb2N0bCBXU0RJU1BMQVlfR1RZUEU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGlvY3RsKHByaXZhdGUtPmZkLCBXU0RJU1BMQVlJT19MSU5FQllURVMsICZwcml2YXRlLT5waHlzbGluZWJ5dGVzKSA9PSAtMSkgeworICAgIFdTQ09OU19SZXBvcnRFcnJvcigiaW9jdGwgV1NESVNQTEFZSU9fTElORUJZVEVTOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChwcml2YXRlLT5pbmZvLmRlcHRoID4gOCkgeworICAgIGlmICh3c3R5cGUgPT0gV1NESVNQTEFZX1RZUEVfU1VOMjQgfHwKKwl3c3R5cGUgPT0gV1NESVNQTEFZX1RZUEVfU1VOQ0cxMiB8fAorCXdzdHlwZSA9PSBXU0RJU1BMQVlfVFlQRV9TVU5DRzE0IHx8CisJd3N0eXBlID09IFdTRElTUExBWV9UWVBFX1NVTlRDWCB8fAorCXdzdHlwZSA9PSBXU0RJU1BMQVlfVFlQRV9TVU5GRkIpIHsKKyAgICAgIHByaXZhdGUtPnJlZE1hc2sgPSAweDAwMDBmZjsKKyAgICAgIHByaXZhdGUtPmdyZWVuTWFzayA9IDB4MDBmZjAwOworICAgICAgcHJpdmF0ZS0+Ymx1ZU1hc2sgPSAweGZmMDAwMDsKKyNpZmRlZiBXU0RJU1BMQVlfVFlQRV9QWEFMQ0QKKyAgICB9IGVsc2UgaWYgKHdzdHlwZSA9PSBXU0RJU1BMQVlfVFlQRV9QWEFMQ0QpIHsKKyAgICAgIHByaXZhdGUtPnJlZE1hc2sgPSAweDFmIDw8IDExOworICAgICAgcHJpdmF0ZS0+Z3JlZW5NYXNrID0gMHgzZiA8PCA1OworICAgICAgcHJpdmF0ZS0+Ymx1ZU1hc2sgPSAweDFmOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIFdTQ09OU19SZXBvcnRFcnJvcigiVW5rbm93biB2aWRlbyBoYXJkd2FyZSIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIkRpc3BsYXlzIHdpdGggOCBicHAgb3IgbGVzcyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAKKyAgcHJpdmF0ZS0+cm90YXRlID0gV1NDT05TX1JPVEFURV9OT05FOworICByb3RhdGlvbiA9IFNETF9nZXRlbnYoIlNETF9WSURFT19XU0NPTlNfUk9UQVRJT04iKTsKKyAgaWYgKHJvdGF0aW9uICE9IE5VTEwpIHsKKyAgICBpZiAoU0RMX3N0cmxlbihyb3RhdGlvbikgPT0gMCkgeworICAgICAgcHJpdmF0ZS0+c2hhZG93RkIgPSAwOworICAgICAgcHJpdmF0ZS0+cm90YXRlID0gV1NDT05TX1JPVEFURV9OT05FOworICAgICAgcHJpbnRmKCJOb3Qgcm90YXRpbmcsIG5vIHNoYWRvd1xuIik7CisgICAgfSBlbHNlIGlmICghU0RMX3N0cmNtcChyb3RhdGlvbiwgIk5PTkUiKSkgeworICAgICAgcHJpdmF0ZS0+c2hhZG93RkIgPSAxOworICAgICAgcHJpdmF0ZS0+cm90YXRlID0gV1NDT05TX1JPVEFURV9OT05FOworICAgICAgcHJpbnRmKCJOb3Qgcm90YXRpbmcsIGJ1dCBzdGlsbCB1c2luZyBzaGFkb3dcbiIpOworICAgIH0gZWxzZSBpZiAoIVNETF9zdHJjbXAocm90YXRpb24sICJDVyIpKSB7CisgICAgICBwcml2YXRlLT5zaGFkb3dGQiA9IDE7CisgICAgICBwcml2YXRlLT5yb3RhdGUgPSBXU0NPTlNfUk9UQVRFX0NXOworICAgICAgcHJpbnRmKCJSb3RhdGluZyBzY3JlZW4gY2xvY2t3aXNlXG4iKTsKKyAgICB9IGVsc2UgaWYgKCFTRExfc3RyY21wKHJvdGF0aW9uLCAiQ0NXIikpIHsKKyAgICAgIHByaXZhdGUtPnNoYWRvd0ZCID0gMTsKKyAgICAgIHByaXZhdGUtPnJvdGF0ZSA9IFdTQ09OU19ST1RBVEVfQ0NXOworICAgICAgcHJpbnRmKCJSb3RhdGluZyBzY3JlZW4gY291bnRlciBjbG9ja3dpc2VcbiIpOworICAgIH0gZWxzZSBpZiAoIVNETF9zdHJjbXAocm90YXRpb24sICJVRCIpKSB7CisgICAgICBwcml2YXRlLT5zaGFkb3dGQiA9IDE7CisgICAgICBwcml2YXRlLT5yb3RhdGUgPSBXU0NPTlNfUk9UQVRFX1VEOworICAgICAgcHJpbnRmKCJSb3RhdGluZyBzY3JlZW4gdXBzaWRlIGRvd25cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIlwiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgIgorCQkJICJTRExfVklERU9fV1NDT05TX1JPVEFUSU9OIiwgcm90YXRpb24pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHN3aXRjaCAocHJpdmF0ZS0+aW5mby5kZXB0aCkgeworICAgIGNhc2UgMToKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA4OgorICAgICAgbGVuID0gcHJpdmF0ZS0+cGh5c2xpbmVieXRlcyAqIHByaXZhdGUtPmluZm8uaGVpZ2h0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgIGlmIChwcml2YXRlLT5waHlzbGluZWJ5dGVzID09IHByaXZhdGUtPmluZm8ud2lkdGgpIHsKKwlsZW4gPSBwcml2YXRlLT5pbmZvLndpZHRoICogcHJpdmF0ZS0+aW5mby5oZWlnaHQgKiBzaXplb2Yoc2hvcnQpOworICAgICAgfSBlbHNlIHsKKwlsZW4gPSBwcml2YXRlLT5waHlzbGluZWJ5dGVzICogcHJpdmF0ZS0+aW5mby5oZWlnaHQ7CisgICAgICB9CisgICAgICBpZiAocHJpdmF0ZS0+cm90YXRlID09IFdTQ09OU19ST1RBVEVfTk9ORSB8fAorCSAgcHJpdmF0ZS0+cm90YXRlID09IFdTQ09OU19ST1RBVEVfVUQpIHsKKwlwcml2YXRlLT5ibGl0RnVuYyA9IFdTQ09OU19ibGl0MTY7CisgICAgICB9IGVsc2UgeworCXByaXZhdGUtPmJsaXRGdW5jID0gV1NDT05TX2JsaXQxNmJsb2NrZWQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgaWYgKHByaXZhdGUtPnBoeXNsaW5lYnl0ZXMgPT0gcHJpdmF0ZS0+aW5mby53aWR0aCkgeworCWxlbiA9IHByaXZhdGUtPmluZm8ud2lkdGggKiBwcml2YXRlLT5pbmZvLmhlaWdodCAqIHNpemVvZihpbnQpOworICAgICAgfSBlbHNlIHsKKwlsZW4gPSBwcml2YXRlLT5waHlzbGluZWJ5dGVzICogcHJpdmF0ZS0+aW5mby5oZWlnaHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgV1NDT05TX1JlcG9ydEVycm9yKCJ1bnN1cHBvcnRlZCBkZXB0aCAlZCIsIHByaXZhdGUtPmluZm8uZGVwdGgpOworICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHByaXZhdGUtPnNoYWRvd0ZCICYmIHByaXZhdGUtPmJsaXRGdW5jID09IE5VTEwpIHsKKyAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIlVzaW5nIHNvZnR3YXJlIGJ1ZmZlciwgYnV0IG5vIGJsaXR0ZXIgZnVuY3Rpb24gaXMgIgorCQkgICAgICAgImF2YWlsYWJsZSBmb3IgdGhpcyAlZCBicHAuIiwgcHJpdmF0ZS0+aW5mby5kZXB0aCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGlvY3RsKHByaXZhdGUtPmZkLCBXU0RJU1BMQVlJT19TTU9ERSwgJndzbW9kZSkgPT0gLTEpIHsKKyAgICBXU0NPTlNfUmVwb3J0RXJyb3IoImlvY3RsIFNNT0RFIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcGFnZW1hc2sgPSBnZXRwYWdlc2l6ZSgpIC0gMTsKKyAgbWFwc2l6ZSA9ICgoaW50KWxlbiArIHBhZ2VtYXNrKSAmIH5wYWdlbWFzazsKKyAgcHJpdmF0ZS0+cGh5c21lbSA9IChVaW50OCAqKW1tYXAoTlVMTCwgbWFwc2l6ZSwKKwkJCQkgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAorCQkJCSAgIHByaXZhdGUtPmZkLCAob2ZmX3QpMCk7CisgIGlmIChwcml2YXRlLT5waHlzbWVtID09IChVaW50OCAqKU1BUF9GQUlMRUQpIHsKKyAgICBwcml2YXRlLT5waHlzbWVtID0gTlVMTDsKKyAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIm1tYXA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcHJpdmF0ZS0+ZmJtZW1fbGVuID0gbGVuOworCisgIGlmIChwcml2YXRlLT5yb3RhdGUgPT0gV1NDT05TX1JPVEFURV9DVyB8fCAKKyAgICAgIHByaXZhdGUtPnJvdGF0ZSA9PSBXU0NPTlNfUk9UQVRFX0NDVykgeworICAgIHdpZHRoID0gcHJpdmF0ZS0+aW5mby5oZWlnaHQ7CisgICAgaGVpZ2h0ID0gcHJpdmF0ZS0+aW5mby53aWR0aDsKKyAgfSBlbHNlIHsKKyAgICB3aWR0aCA9IHByaXZhdGUtPmluZm8ud2lkdGg7CisgICAgaGVpZ2h0ID0gcHJpdmF0ZS0+aW5mby5oZWlnaHQ7CisgIH0KKworICB0aGlzLT5pbmZvLmN1cnJlbnRfdyA9IHdpZHRoOworICB0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IGhlaWdodDsKKworICBpZiAocHJpdmF0ZS0+c2hhZG93RkIpIHsKKyAgICBwcml2YXRlLT5zaGFkb3dtZW0gPSAoVWludDggKilTRExfbWFsbG9jKGxlbik7CisgICAgaWYgKHByaXZhdGUtPnNoYWRvd21lbSA9PSBOVUxMKSB7CisgICAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIk5vIG1lbW9yeSBmb3Igc2hhZG93Iik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHByaXZhdGUtPmZic3RhcnQgPSBwcml2YXRlLT5zaGFkb3dtZW07CisgICAgcHJpdmF0ZS0+ZmJsaW5lYnl0ZXMgPSB3aWR0aCAqICgocHJpdmF0ZS0+aW5mby5kZXB0aCArIDcpIC8gOCk7CisgIH0gZWxzZSB7IAorICAgIHByaXZhdGUtPmZic3RhcnQgPSBwcml2YXRlLT5waHlzbWVtOworICAgIHByaXZhdGUtPmZibGluZWJ5dGVzID0gcHJpdmF0ZS0+cGh5c2xpbmVieXRlczsKKyAgfQorICAKKyAgcHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKKyAgcHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdLT53ID0gd2lkdGg7CisgIHByaXZhdGUtPlNETF9tb2RlbGlzdFswXS0+aCA9IGhlaWdodDsKKworICB2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSBwcml2YXRlLT5pbmZvLmRlcHRoOworICB2Zm9ybWF0LT5CeXRlc1BlclBpeGVsID0gcHJpdmF0ZS0+aW5mby5kZXB0aCAvIDg7CisgIAorICBpZiAoV1NDT05TX0luaXRLZXlib2FyZCh0aGlzKSA9PSAtMSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKK1NETF9SZWN0ICoqV1NDT05TX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncykKK3sKKyAgaWYgKGZvcm1hdC0+Qml0c1BlclBpeGVsID09IHByaXZhdGUtPmluZm8uZGVwdGgpIHsKKyAgICByZXR1cm4gcHJpdmF0ZS0+U0RMX21vZGVsaXN0OworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK1NETF9TdXJmYWNlICpXU0NPTlNfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQkgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisgIGlmICh3aWR0aCAhPSBwcml2YXRlLT5TRExfbW9kZWxpc3RbMF0tPncgfHwgCisgICAgICBoZWlnaHQgIT0gcHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdLT5oKSB7CisgICAgV1NDT05TX1JlcG9ydEVycm9yKCJSZXF1ZXN0ZWQgdmlkZW8gbW9kZSAlZHglZCBub3Qgc3VwcG9ydGVkLiIsCisJCSAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoYnBwICE9IHByaXZhdGUtPmluZm8uZGVwdGgpIHsKKyAgICBXU0NPTlNfUmVwb3J0RXJyb3IoIlJlcXVlc3RlZCB2aWRlbyBkZXB0aCAlZCBicHAgbm90IHN1cHBvcnRlZC4iLCBicHApOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFTRExfUmVhbGxvY0Zvcm1hdChjdXJyZW50LCAKKwkJCSBicHAsIAorCQkJIHByaXZhdGUtPnJlZE1hc2ssCisJCQkgcHJpdmF0ZS0+Z3JlZW5NYXNrLAorCQkJIHByaXZhdGUtPmJsdWVNYXNrLAorCQkJIDApKSB7CisgICAgV1NDT05TX1JlcG9ydEVycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgcGl4ZWwgZm9ybWF0Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjdXJyZW50LT5mbGFncyAmPSBTRExfRlVMTFNDUkVFTjsKKyAgaWYgKHByaXZhdGUtPnNoYWRvd0ZCKSB7CisgICAgY3VycmVudC0+ZmxhZ3MgfD0gU0RMX1NXU1VSRkFDRTsKKyAgfSBlbHNlIHsKKyAgICBjdXJyZW50LT5mbGFncyB8PSBTRExfSFdTVVJGQUNFOworICB9CisgIGN1cnJlbnQtPncgPSB3aWR0aDsKKyAgY3VycmVudC0+aCA9IGhlaWdodDsKKyAgY3VycmVudC0+cGl0Y2ggPSBwcml2YXRlLT5mYmxpbmVieXRlczsKKyAgY3VycmVudC0+cGl4ZWxzID0gcHJpdmF0ZS0+ZmJzdGFydDsKKworICBTRExfbWVtc2V0KHByaXZhdGUtPmZic3RhcnQsIDAsIHByaXZhdGUtPmZibWVtX2xlbik7CisKKyAgcmV0dXJuIGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbnQgV1NDT05TX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgcmV0dXJuIC0xOworfQorc3RhdGljIHZvaWQgV1NDT05TX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworfQorCitzdGF0aWMgaW50IFdTQ09OU19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIFdTQ09OU19VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworfQorCitzdGF0aWMgdm9pZCBXU0NPTlNfYmxpdDE2KFVpbnQ4ICpieXRlX3NyY19wb3MsCisJCQkgIGludCBzcmNSaWdodERlbHRhLCAKKwkJCSAgaW50IHNyY0Rvd25EZWx0YSwgCisJCQkgIFVpbnQ4ICpieXRlX2RzdF9wb3MsCisJCQkgIGludCBkc3RfbGluZWJ5dGVzLAorCQkJICBpbnQgd2lkdGgsCisJCQkgIGludCBoZWlnaHQpCit7CisgIGludCB3OworICBVaW50MTYgKnNyY19wb3MgPSAoVWludDE2ICopYnl0ZV9zcmNfcG9zOworICBVaW50MTYgKmRzdF9wb3MgPSAoVWludDE2ICopYnl0ZV9kc3RfcG9zOworCisgIHdoaWxlIChoZWlnaHQpIHsKKyAgICBVaW50MTYgKnNyYyA9IHNyY19wb3M7CisgICAgVWludDE2ICpkc3QgPSBkc3RfcG9zOworICAgIGZvciAodyA9IHdpZHRoOyB3ICE9IDA7IHctLSkgeworICAgICAgKmRzdCA9ICpzcmM7CisgICAgICBzcmMgKz0gc3JjUmlnaHREZWx0YTsKKyAgICAgIGRzdCsrOworICAgIH0KKyAgICBkc3RfcG9zID0gKFVpbnQxNiAqKSgoVWludDggKilkc3RfcG9zICsgZHN0X2xpbmVieXRlcyk7CisgICAgc3JjX3BvcyArPSBzcmNEb3duRGVsdGE7CisgICAgaGVpZ2h0LS07CisgIH0KK30KKworI2RlZmluZSBCTE9DS1NJWkVfVyAzMgorI2RlZmluZSBCTE9DS1NJWkVfSCAzMgorCitzdGF0aWMgdm9pZCBXU0NPTlNfYmxpdDE2YmxvY2tlZChVaW50OCAqYnl0ZV9zcmNfcG9zLAorCQkJCSBpbnQgc3JjUmlnaHREZWx0YSwgCisJCQkJIGludCBzcmNEb3duRGVsdGEsIAorCQkJCSBVaW50OCAqYnl0ZV9kc3RfcG9zLAorCQkJCSBpbnQgZHN0X2xpbmVieXRlcywKKwkJCQkgaW50IHdpZHRoLAorCQkJCSBpbnQgaGVpZ2h0KQoreworICBpbnQgdzsKKyAgVWludDE2ICpzcmNfcG9zID0gKFVpbnQxNiAqKWJ5dGVfc3JjX3BvczsKKyAgVWludDE2ICpkc3RfcG9zID0gKFVpbnQxNiAqKWJ5dGVfZHN0X3BvczsKKworICB3aGlsZSAoaGVpZ2h0ID4gMCkgeworICAgIFVpbnQxNiAqc3JjID0gc3JjX3BvczsKKyAgICBVaW50MTYgKmRzdCA9IGRzdF9wb3M7CisgICAgZm9yICh3ID0gd2lkdGg7IHcgPiAwOyB3IC09IEJMT0NLU0laRV9XKSB7CisgICAgICBXU0NPTlNfYmxpdDE2KChVaW50OCAqKXNyYywKKwkJICAgIHNyY1JpZ2h0RGVsdGEsCisJCSAgICBzcmNEb3duRGVsdGEsCisJCSAgICAoVWludDggKilkc3QsCisJCSAgICBkc3RfbGluZWJ5dGVzLAorCQkgICAgbWluKHcsIEJMT0NLU0laRV9XKSwKKwkJICAgIG1pbihoZWlnaHQsIEJMT0NLU0laRV9IKSk7CisgICAgICBzcmMgKz0gc3JjUmlnaHREZWx0YSAqIEJMT0NLU0laRV9XOworICAgICAgZHN0ICs9IEJMT0NLU0laRV9XOworICAgIH0KKyAgICBkc3RfcG9zID0gKFVpbnQxNiAqKSgoVWludDggKilkc3RfcG9zICsgZHN0X2xpbmVieXRlcyAqIEJMT0NLU0laRV9IKTsKKyAgICBzcmNfcG9zICs9IHNyY0Rvd25EZWx0YSAqIEJMT0NLU0laRV9IOworICAgIGhlaWdodCAtPSBCTE9DS1NJWkVfSDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBXU0NPTlNfVXBkYXRlUmVjdHMoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworICBpbnQgd2lkdGggPSBwcml2YXRlLT5TRExfbW9kZWxpc3RbMF0tPnc7CisgIGludCBoZWlnaHQgPSBwcml2YXRlLT5TRExfbW9kZWxpc3RbMF0tPmg7CisgIGludCBieXRlc1BlclBpeGVsID0gKHByaXZhdGUtPmluZm8uZGVwdGggKyA3KSAvIDg7CisgIGludCBpOworCisgIGlmICghcHJpdmF0ZS0+c2hhZG93RkIpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocHJpdmF0ZS0+aW5mby5kZXB0aCAhPSAxNikgeworICAgIFdTQ09OU19SZXBvcnRFcnJvcigiU2hhZG93IGNvcHkgb25seSBpbXBsZW1lbnRlZCBmb3IgMTYgYnBwIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG51bXJlY3RzOyBpKyspIHsKKyAgICBpbnQgeDEsIHkxLCB4MiwgeTI7CisgICAgaW50IHNjcl94MSwgc2NyX3kxLCBzY3JfeDIsIHNjcl95MjsKKyAgICBpbnQgc2hhX3gxLCBzaGFfeTE7CisgICAgaW50IHNoYWRvd1JpZ2h0RGVsdGE7ICAvKiBBZGRyZXNzIGNoYW5nZSB3aGVuIG1vdmluZyByaWdodCBpbiBkZXN0ICovCisgICAgaW50IHNoYWRvd0Rvd25EZWx0YTsgICAvKiBBZGRyZXNzIGNoYW5nZSB3aGVuIG1vdmluZyBkb3duIGluIGRlc3QgKi8KKyAgICBVaW50OCAqc3JjX3N0YXJ0OworICAgIFVpbnQ4ICpkc3Rfc3RhcnQ7CisKKyAgICB4MSA9IHJlY3RzW2ldLng7IAorICAgIHkxID0gcmVjdHNbaV0ueTsKKyAgICB4MiA9IHgxICsgcmVjdHNbaV0udzsgCisgICAgeTIgPSB5MSArIHJlY3RzW2ldLmg7CisKKyAgICBpZiAoeDEgPCAwKSB7CisgICAgICB4MSA9IDA7CisgICAgfSBlbHNlIGlmICh4MSA+IHdpZHRoKSB7CisgICAgICB4MSA9IHdpZHRoOworICAgIH0KKyAgICBpZiAoeDIgPCAwKSB7CisgICAgICB4MiA9IDA7CisgICAgfSBlbHNlIGlmICh4MiA+IHdpZHRoKSB7CisgICAgICB4MiA9IHdpZHRoOworICAgIH0KKyAgICBpZiAoeTEgPCAwKSB7CisgICAgICB5MSA9IDA7CisgICAgfSBlbHNlIGlmICh5MSA+IGhlaWdodCkgeworICAgICAgeTEgPSBoZWlnaHQ7CisgICAgfQorICAgIGlmICh5MiA8IDApIHsKKyAgICAgIHkyID0gMDsKKyAgICB9IGVsc2UgaWYgKHkyID4gaGVpZ2h0KSB7CisgICAgICB5MiA9IGhlaWdodDsKKyAgICB9CisgICAgaWYgKHgyIDw9IHgxIHx8IHkyIDw9IHkxKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHByaXZhdGUtPnJvdGF0ZSkgeworICAgICAgY2FzZSBXU0NPTlNfUk9UQVRFX05PTkU6CisJc2hhX3gxID0gc2NyX3gxID0geDE7CisJc2hhX3kxID0gc2NyX3kxID0geTE7CisJc2NyX3gyID0geDI7CisJc2NyX3kyID0geTI7CisJc2hhZG93UmlnaHREZWx0YSA9IDE7CisJc2hhZG93RG93bkRlbHRhID0gd2lkdGg7CisJYnJlYWs7CisgICAgICBjYXNlIFdTQ09OU19ST1RBVEVfQ0NXOgorCXNjcl94MSA9IHkxOworCXNjcl95MSA9IHdpZHRoIC0geDI7CisJc2NyX3gyID0geTI7CisJc2NyX3kyID0gd2lkdGggLSB4MTsKKwlzaGFfeDEgPSB4MiAtIDE7CisJc2hhX3kxID0geTE7CisJc2hhZG93UmlnaHREZWx0YSA9IHdpZHRoOworCXNoYWRvd0Rvd25EZWx0YSA9IC0xOworCWJyZWFrOworICAgICAgY2FzZSBXU0NPTlNfUk9UQVRFX1VEOgorCXNjcl94MSA9IHdpZHRoIC0geDI7CisJc2NyX3kxID0gaGVpZ2h0IC0geTI7CisJc2NyX3gyID0gd2lkdGggLSB4MTsKKwlzY3JfeTIgPSBoZWlnaHQgLSB5MTsKKwlzaGFfeDEgPSB4MiAtIDE7CisJc2hhX3kxID0geTIgLSAxOworCXNoYWRvd1JpZ2h0RGVsdGEgPSAtMTsKKwlzaGFkb3dEb3duRGVsdGEgPSAtd2lkdGg7CisJYnJlYWs7CisgICAgICBjYXNlIFdTQ09OU19ST1RBVEVfQ1c6CisJc2NyX3gxID0gaGVpZ2h0IC0geTI7CisJc2NyX3kxID0geDE7CisJc2NyX3gyID0gaGVpZ2h0IC0geTE7CisJc2NyX3kyID0geDI7CisJc2hhX3gxID0geDE7CisJc2hhX3kxID0geTIgLSAxOworCXNoYWRvd1JpZ2h0RGVsdGEgPSAtd2lkdGg7CisJc2hhZG93RG93bkRlbHRhID0gMTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJV1NDT05TX1JlcG9ydEVycm9yKCJVbmtub3duIHJvdGF0aW9uIik7CisJcmV0dXJuOworICAgIH0KKworICAgIHNyY19zdGFydCA9IHByaXZhdGUtPnNoYWRvd21lbSArIChzaGFfeTEgKiB3aWR0aCArIHNoYV94MSkgKiBieXRlc1BlclBpeGVsOworICAgIGRzdF9zdGFydCA9IHByaXZhdGUtPnBoeXNtZW0gKyBzY3JfeTEgKiBwcml2YXRlLT5waHlzbGluZWJ5dGVzICsgCisgICAgICBzY3JfeDEgKiBieXRlc1BlclBpeGVsOworCisgICAgcHJpdmF0ZS0+YmxpdEZ1bmMoc3JjX3N0YXJ0LAorCQkgICAgICBzaGFkb3dSaWdodERlbHRhLCAKKwkJICAgICAgc2hhZG93RG93bkRlbHRhLCAKKwkJICAgICAgZHN0X3N0YXJ0LAorCQkgICAgICBwcml2YXRlLT5waHlzbGluZWJ5dGVzLAorCQkgICAgICBzY3JfeDIgLSBzY3JfeDEsCisJCSAgICAgIHNjcl95MiAtIHNjcl95MSk7CisgIH0KK30KKworaW50IFdTQ09OU19TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywgU0RMX0NvbG9yICpjb2xvcnMpCit7CisgIHJldHVybiAwOworfQorCisvKgorICogTm90ZTogSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKKyAqIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KKyAqLwordm9pZCBXU0NPTlNfVmlkZW9RdWl0KF9USElTKQoreworICBpbnQgbW9kZSA9IFdTRElTUExBWUlPX01PREVfRU1VTDsKKworICBpZiAocHJpdmF0ZS0+c2hhZG93bWVtICE9IE5VTEwpIHsKKyAgICBTRExfZnJlZShwcml2YXRlLT5zaGFkb3dtZW0pOworICAgIHByaXZhdGUtPnNoYWRvd21lbSA9IE5VTEw7CisgIH0KKyAgcHJpdmF0ZS0+ZmJzdGFydCA9IE5VTEw7CisgIGlmICh0aGlzLT5zY3JlZW4gIT0gTlVMTCkgeworICAgIHRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsKKyAgfQorCisgIGlmIChwcml2YXRlLT5TRExfbW9kZWxpc3RbMF0gIT0gTlVMTCkgeworICAgIFNETF9mcmVlKHByaXZhdGUtPlNETF9tb2RlbGlzdFswXSk7CisgICAgcHJpdmF0ZS0+U0RMX21vZGVsaXN0WzBdID0gTlVMTDsKKyAgfQorCisgIGlmIChpb2N0bChwcml2YXRlLT5mZCwgV1NESVNQTEFZSU9fU01PREUsICZtb2RlKSA9PSAtMSkgeworICAgIFdTQ09OU19SZXBvcnRFcnJvcigiaW9jdGwgU01PREUiKTsKKyAgfQorCisgIFdTQ09OU19SZWxlYXNlS2V5Ym9hcmQodGhpcyk7CisKKyAgaWYgKHByaXZhdGUtPmZkICE9IC0xKSB7CisgICAgY2xvc2UocHJpdmF0ZS0+ZmQpOworICAgIHByaXZhdGUtPmZkID0gLTE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnN2aWRlby5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby93c2NvbnMvU0RMX3dzY29uc3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3NWMxNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8vd3Njb25zL1NETF93c2NvbnN2aWRlby5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfd3Njb25zdmlkZW9faAorI2RlZmluZSBfU0RMX3dzY29uc3ZpZGVvX2gKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPGRldi93c2NvbnMvd3Njb25zaW8uaD4KKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIlNETF9tdXRleC5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCit2b2lkIFdTQ09OU19SZXBvcnRFcnJvcihjaGFyICpmbXQsIC4uLik7CisKKy8qIEhpZGRlbiAidGhpcyIgcG9pbnRlciBmb3IgdGhlIHZpZGVvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfVEhJUwlTRExfVmlkZW9EZXZpY2UgKnRoaXMKKyNkZWZpbmUgcHJpdmF0ZQkodGhpcy0+aGlkZGVuKQorCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworCit0eXBlZGVmIHZvaWQgV1NDT05TX2JpdEJsaXQoVWludDggKnNyY19wb3MsCisJCQkgICAgaW50IHNyY1JpZ2h0RGVsdGEsIC8vIHBpeGVscywgbm90IGJ5dGVzCisJCQkgICAgaW50IHNyY0Rvd25EZWx0YSwgIC8vIHBpeGVscywgbm90IGJ5dGVzCisJCQkgICAgVWludDggKmRzdF9wb3MsCisJCQkgICAgaW50IGRzdF9saW5lYnl0ZXMsCisJCQkgICAgaW50IHdpZHRoLAorCQkJICAgIGludCBoZWlnaHQpOworCitzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgeworICBpbnQgZmQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3Igb2Ygb3BlbiBkZXZpY2UgKi8KKyAgc3RydWN0IHdzZGlzcGxheV9mYmluZm8gaW5mbzsgLyogZnJhbWUgYnVmZmVyIGNoYXJhY3RlcmlzdGljcyAqLworICBpbnQgcGh5c2xpbmVieXRlczsgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgcGVyIHJvdyAqLworICBpbnQgcmVkTWFzaywgZ3JlZW5NYXNrLCBibHVlTWFzazsKKworICBVaW50OCAqZmJzdGFydDsgICAgICAgICAgICAgICAvKiBUaGVzZSByZWZlciB0byB0aGUgc3VyZmFjZSB1c2VkLCAqLworICBpbnQgZmJsaW5lYnl0ZXM7ICAgICAgICAgICAgICAvKiBwaHlzaWNhbCBmcmFtZSBidWZmZXIgb3Igc2hhZG93LiAqLworCisgIHNpemVfdCBmYm1lbV9sZW47CisgIFVpbnQ4ICpwaHlzbWVtOworICBVaW50OCAqc2hhZG93bWVtOworICBpbnQgcm90YXRlOworICBpbnQgc2hhZG93RkI7ICAgICAgICAgICAgICAgICAvKiBUZWxscyB3aGV0aGVyIGEgc2hhZG93IGlzIGJlaW5nIHVzZWQuICovCisKKyAgV1NDT05TX2JpdEJsaXQgKmJsaXRGdW5jOworCisgIFNETF9SZWN0ICpTRExfbW9kZWxpc3RbMl07CisKKyAgdW5zaWduZWQgaW50IGtiZFR5cGU7CisgIGludCBkaWRfc2F2ZV90dHk7CisgIHN0cnVjdCB0ZXJtaW9zIHNhdmVkX3R0eTsKK307CisKKworI2VuZGlmIC8qIF9TRExfd3Njb25zdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMWRnYS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMWRnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzBjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZGdhLmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZCB0byBlbmFibGUgREdBIG1vdXNlLgorICAgVGhlcmUgaXMgYSBjb21wbGV0ZWx5IHNlcGFyYXRlIERHQSBkcml2ZXIgdGhhdCBpcyBmdWxsc2NyZWVuLW9ubHkuCisqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX2N1cnNvcl9jLmgiCisjaW5jbHVkZSAiU0RMX3gxMWRnYV9jLmgiCisKKy8qIEdsb2JhbCBmb3IgdGhlIGVycm9yIGhhbmRsZXIgKi8KK2ludCBkZ2FfZXZlbnQsIGRnYV9lcnJvciA9IC0xOworCit2b2lkIFgxMV9FbmFibGVER0FNb3VzZShfVEhJUykKK3sKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9ER0FNT1VTRQorICAgIHN0YXRpYyBpbnQgdXNlX2RnYW1vdXNlID0gLTE7CisKKyAgICAvKiBDaGVjayBjb25maWd1cmF0aW9uIHRvIHNlZSBpZiB3ZSBzaG91bGQgdXNlIERHQSBtb3VzZSAqLworICAgIGlmICggdXNlX2RnYW1vdXNlIDwgMCApIHsKKyAgICAgICAgaW50IGRnYV9tYWpvciwgZGdhX21pbm9yOworICAgICAgICBpbnQgZGdhX2ZsYWdzOworICAgICAgICBjb25zdCBjaGFyICplbnZfdXNlX2RnYW1vdXNlOworCisgICAgICAgIHVzZV9kZ2Ftb3VzZSA9IDE7CisgICAgICAgIGVudl91c2VfZGdhbW91c2UgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fWDExX0RHQU1PVVNFIik7CisgICAgICAgIGlmICggZW52X3VzZV9kZ2Ftb3VzZSApIHsKKyAgICAgICAgICAgIHVzZV9kZ2Ftb3VzZSA9IFNETF9hdG9pKGVudl91c2VfZGdhbW91c2UpOworICAgICAgICB9CisgICAgICAgIC8qIENoZWNrIGZvciBidWdneSBYIHNlcnZlcnMgKi8KKyAgICAgICAgaWYgKCB1c2VfZGdhbW91c2UgJiYgQlVHR1lfWEZSRUU4Nig9PSwgNDAwMCkgKSB7CisgICAgICAgICAgICB1c2VfZGdhbW91c2UgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICggIXVzZV9kZ2Ftb3VzZSB8fCAhbG9jYWxfWDExIHx8CisgICAgICAgICAgICAgIVNETF9OQU1FKFhGODZER0FRdWVyeUV4dGVuc2lvbikoU0RMX0Rpc3BsYXksICZkZ2FfZXZlbnQsICZkZ2FfZXJyb3IpIHx8CisgICAgICAgICAgICAgIVNETF9OQU1FKFhGODZER0FRdWVyeVZlcnNpb24pKFNETF9EaXNwbGF5LCAmZGdhX21ham9yLCAmZGdhX21pbm9yKSB8fAorICAgICAgICAgICAgICFTRExfTkFNRShYRjg2REdBUXVlcnlEaXJlY3RWaWRlbykoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sICZkZ2FfZmxhZ3MpIHx8CisgICAgICAgICAgICAgIShkZ2FfZmxhZ3MgJiBYRjg2REdBRGlyZWN0UHJlc2VudCkgKSB7CisgICAgICAgICAgICB1c2VfZGdhbW91c2UgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCB1c2VfZGdhbW91c2UgJiYgISh1c2luZ19kZ2EgJiBER0FfTU9VU0UpICkgeworCWlmICggU0RMX05BTUUoWEY4NkRHQURpcmVjdFZpZGVvKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgWEY4NkRHQURpcmVjdE1vdXNlKSApIHsKKyAgICAgICAgICAgIHVzaW5nX2RnYSB8PSBER0FfTU9VU0U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfREdBTU9VU0UgKi8KK30KKworLyogQXJnaC4gIEdsaWRlIHJlc2V0cyBER0EgbW91c2UgbW9kZSB3aGVuIGl0IG1ha2VzIHRoZSBjb250ZXh0IGN1cnJlbnQhICovCit2b2lkIFgxMV9DaGVja0RHQU1vdXNlKF9USElTKQoreworI2lmIFNETF9WSURFT19EUklWRVJfWDExX0RHQU1PVVNFCisgICAgaWYgKCB1c2luZ19kZ2EgJiBER0FfTU9VU0UgKSB7CisJU0RMX05BTUUoWEY4NkRHQURpcmVjdFZpZGVvKShTRExfRGlzcGxheSxTRExfU2NyZWVuLFhGODZER0FEaXJlY3RNb3VzZSk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgWDExX0Rpc2FibGVER0FNb3VzZShfVEhJUykKK3sKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9ER0FNT1VTRQorICAgIGlmICggdXNpbmdfZGdhICYgREdBX01PVVNFICkgeworCVNETF9OQU1FKFhGODZER0FEaXJlY3RWaWRlbykoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sIDApOworICAgICAgICB1c2luZ19kZ2EgJj0gfkRHQV9NT1VTRTsKKyAgICB9CisjZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfREdBTU9VU0UgKi8KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFkZ2FfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMWRnYV9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3NTExYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFkZ2FfYy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCisKKy8qIERpZmZlcmVudCBER0EgYWNjZXNzIHN0YXRlcyAqLworI2RlZmluZSBER0FfR1JBUEhJQ1MJMHgwMQorI2RlZmluZSBER0FfS0VZQk9BUkQJMHgwMgorI2RlZmluZSBER0FfTU9VU0UJMHgwNAorCitleHRlcm4gdm9pZCBYMTFfRW5hYmxlREdBTW91c2UoX1RISVMpOworZXh0ZXJuIHZvaWQgWDExX0NoZWNrREdBTW91c2UoX1RISVMpOworZXh0ZXJuIHZvaWQgWDExX0Rpc2FibGVER0FNb3VzZShfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZHluLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZHluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0YWNiYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFkeW4uYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNkZWZpbmUgREVCVUdfRFlOQU1JQ19YMTEgMAorCisjaW5jbHVkZSAiU0RMX3gxMWR5bi5oIgorCisjaWYgREVCVUdfRFlOQU1JQ19YMTEKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpZmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDCisKKyNpbmNsdWRlICJTRExfbmFtZS5oIgorI2luY2x1ZGUgIlNETF9sb2Fkc28uaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2b2lkICpsaWI7CisgICAgY29uc3QgY2hhciAqbGlibmFtZTsKK30geDExZHlubGliOworCisjaWZuZGVmIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUMKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQyBOVUxMCisjZW5kaWYKKyNpZm5kZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YRVhUCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWEVYVCBOVUxMCisjZW5kaWYKKyNpZm5kZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YUkVOREVSCisjZGVmaW5lIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWFJFTkRFUiBOVUxMCisjZW5kaWYKKyNpZm5kZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YUkFORFIKKyNkZWZpbmUgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YUkFORFIgTlVMTAorI2VuZGlmCisKK3N0YXRpYyB4MTFkeW5saWIgeDExbGlic1tdID0KK3sKKyAgICB7IE5VTEwsIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUMgfSwKKyAgICB7IE5VTEwsIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUNfWEVYVCB9LAorICAgIHsgTlVMTCwgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQ19YUkVOREVSIH0sCisgICAgeyBOVUxMLCBTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDX1hSQU5EUiB9LAorfTsKKworc3RhdGljIHZvaWQgKlgxMV9HZXRTeW0oY29uc3QgY2hhciAqZm5uYW1lLCBpbnQgKnJjKQoreworCXZvaWQgKmZuID0gTlVMTDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMX1RBQkxFU0laRSh4MTFsaWJzKTsgaSsrKSB7CisJCWlmICh4MTFsaWJzW2ldLmxpYiAhPSBOVUxMKQorCQl7CisJCQlmbiA9IFNETF9Mb2FkRnVuY3Rpb24oeDExbGlic1tpXS5saWIsIGZubmFtZSk7CisJCQlpZiAoZm4gIT0gTlVMTCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCSNpZiBERUJVR19EWU5BTUlDX1gxMQorCWlmIChmbiAhPSBOVUxMKQorCQlwcmludGYoIlgxMTogRm91bmQgJyVzJyBpbiAlcyAoJXApXG4iLCBmbm5hbWUsIHgxMWxpYnNbaV0ubGlibmFtZSwgKmZuKTsKKwllbHNlCisJCXByaW50ZigiWDExOiBTeW1ib2wgJyVzJyBOT1QgRk9VTkQhXG4iLCBmbm5hbWUpOworCSNlbmRpZgorCisJaWYgKGZuID09IE5VTEwpCisJCSpyYyA9IDA7ICAvKiBraWxsIHRoaXMgbW9kdWxlLiAqLworCisJcmV0dXJuIGZuOworfQorCisKKy8qIERlZmluZSBhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCB3cmFwcGVycy4uLiAqLworI2RlZmluZSBTRExfWDExX01PRFVMRShtb2RuYW1lKQorI2RlZmluZSBTRExfWDExX1NZTShyYyxmbixwYXJhbXMsYXJncyxyZXQpIFwKKwlzdGF0aWMgcmMgKCpwIyNmbikgcGFyYW1zID0gTlVMTDsgXAorCXJjIGZuIHBhcmFtcyB7IHJldCBwIyNmbiBhcmdzIDsgfQorI2luY2x1ZGUgIlNETF94MTFzeW0uaCIKKyN1bmRlZiBTRExfWDExX01PRFVMRQorI3VuZGVmIFNETF9YMTFfU1lNCisjZW5kaWYgIC8qIFNETF9WSURFT19EUklWRVJfWDExX0RZTkFNSUMgKi8KKworLyogQW5ub3lpbmcgdmFyYXJncyBlbnRyeSBwb2ludC4uLiAqLworI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworWElDICgqcFhDcmVhdGVJQykoWElNLC4uLikgPSBOVUxMOworY2hhciAqKCpwWEdldElDVmFsdWVzKShYSUMsIC4uLikgPSBOVUxMOworI2VuZGlmCisKKy8qIFRoZXNlIFNETF9YMTFfSEFWRV8qIGZsYWdzIGFyZSBoZXJlIHdoZXRoZXIgeW91IGhhdmUgZHluYW1pYyBYMTEgb3Igbm90LiAqLworI2RlZmluZSBTRExfWDExX01PRFVMRShtb2RuYW1lKSBpbnQgU0RMX1gxMV9IQVZFXyMjbW9kbmFtZSA9IDE7CisjZGVmaW5lIFNETF9YMTFfU1lNKHJjLGZuLHBhcmFtcyxhcmdzLHJldCkKKyNpbmNsdWRlICJTRExfeDExc3ltLmgiCisjdW5kZWYgU0RMX1gxMV9NT0RVTEUKKyN1bmRlZiBTRExfWDExX1NZTQorCisKK3N0YXRpYyB2b2lkICpTRExfWEdldFJlcXVlc3Rfd29ya2Fyb3VuZChEaXNwbGF5KiBkcHksIENBUkQ4IHR5cGUsIHNpemVfdCBsZW4pCit7CisJeFJlcSAqcmVxOworCVdPUkQ2NEFMSUdOCisJaWYgKGRweS0+YnVmcHRyICsgbGVuID4gZHB5LT5idWZtYXgpCisJCV9YRmx1c2goZHB5KTsKKwlkcHktPmxhc3RfcmVxID0gZHB5LT5idWZwdHI7CisJcmVxID0gKHhSZXEqKWRweS0+YnVmcHRyOworCXJlcS0+cmVxVHlwZSA9IHR5cGU7CisJcmVxLT5sZW5ndGggPSBsZW4gLyA0OworCWRweS0+YnVmcHRyICs9IGxlbjsKKwlkcHktPnJlcXVlc3QrKzsKKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgaW50IHgxMV9sb2FkX3JlZmNvdW50ID0gMDsKKwordm9pZCBTRExfWDExX1VubG9hZFN5bWJvbHModm9pZCkKK3sKKwkjaWZkZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQworCS8qIERvbid0IGFjdHVhbGx5IHVubG9hZCBpZiBtb3JlIHRoYW4gb25lIG1vZHVsZSBpcyB1c2luZyB0aGUgbGlicy4uLiAqLworCWlmICh4MTFfbG9hZF9yZWZjb3VudCA+IDApIHsKKwkJaWYgKC0teDExX2xvYWRfcmVmY291bnQgPT0gMCkgeworCQkJaW50IGk7CisKKwkJCS8qIHNldCBhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIE5VTEwuICovCisJCQkjZGVmaW5lIFNETF9YMTFfTU9EVUxFKG1vZG5hbWUpIFNETF9YMTFfSEFWRV8jI21vZG5hbWUgPSAxOworCQkJI2RlZmluZSBTRExfWDExX1NZTShyYyxmbixwYXJhbXMsYXJncyxyZXQpIHAjI2ZuID0gTlVMTDsKKwkJCSNpbmNsdWRlICJTRExfeDExc3ltLmgiCisJCQkjdW5kZWYgU0RMX1gxMV9NT0RVTEUKKwkJCSN1bmRlZiBTRExfWDExX1NZTQorCisJCQkjaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCisJCQlwWENyZWF0ZUlDID0gTlVMTDsKKwkJCXBYR2V0SUNWYWx1ZXMgPSBOVUxMOworCQkJI2VuZGlmCisKKwkJCWZvciAoaSA9IDA7IGkgPCBTRExfVEFCTEVTSVpFKHgxMWxpYnMpOyBpKyspIHsKKwkJCQlpZiAoeDExbGlic1tpXS5saWIgIT0gTlVMTCkgeworCQkJCQlTRExfVW5sb2FkT2JqZWN0KHgxMWxpYnNbaV0ubGliKTsKKwkJCQkJeDExbGlic1tpXS5saWIgPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkjZW5kaWYKK30KKworLyogcmV0dXJucyBub24temVybyBpZiBhbGwgbmVlZGVkIHN5bWJvbHMgd2VyZSBsb2FkZWQuICovCitpbnQgU0RMX1gxMV9Mb2FkU3ltYm9scyh2b2lkKQoreworCWludCByYyA9IDE7ICAvKiBhbHdheXMgc3VjY2VlZCBpZiBub3QgdXNpbmcgRHluYW1pYyBYMTEgc3R1ZmYuICovCisKKwkjaWZkZWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfRFlOQU1JQworCS8qIGRlYWwgd2l0aCBtdWx0aXBsZSBtb2R1bGVzIChkZ2EsIHgxMSwgZXRjKSBuZWVkaW5nIHRoZXNlIHN5bWJvbHMuLi4gKi8KKwlpZiAoeDExX2xvYWRfcmVmY291bnQrKyA9PSAwKSB7CisJCWludCBpOworCQlpbnQgKnRoaXNtb2QgPSBOVUxMOworCQlmb3IgKGkgPSAwOyBpIDwgU0RMX1RBQkxFU0laRSh4MTFsaWJzKTsgaSsrKSB7CisJCQlpZiAoeDExbGlic1tpXS5saWJuYW1lICE9IE5VTEwpIHsKKwkJCQl4MTFsaWJzW2ldLmxpYiA9IFNETF9Mb2FkT2JqZWN0KHgxMWxpYnNbaV0ubGlibmFtZSk7CisJCQl9CisJCX0KKwkJI2RlZmluZSBTRExfWDExX01PRFVMRShtb2RuYW1lKSB0aGlzbW9kID0gJlNETF9YMTFfSEFWRV8jI21vZG5hbWU7CisJCSNkZWZpbmUgU0RMX1gxMV9TWU0ocmMsZm4scGFyYW1zLGFyZ3MscmV0KSBcCisgICAgICAgICAgICBwIyNmbiA9IChyYygqKXBhcmFtcykgWDExX0dldFN5bSgjZm4sIHRoaXNtb2QpOworCQkjaW5jbHVkZSAiU0RMX3gxMXN5bS5oIgorCQkjdW5kZWYgU0RMX1gxMV9NT0RVTEUKKwkJI3VuZGVmIFNETF9YMTFfU1lNCisKKwkJI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworCQlwWENyZWF0ZUlDID0gKFhJQygqKShYSU0sLi4uKSkgWDExX0dldFN5bSgiWENyZWF0ZUlDIiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNETF9YMTFfSEFWRV9VVEY4KTsKKwkJcFhHZXRJQ1ZhbHVlcyA9IChjaGFyICogKCopKFhJQywuLi4pKSBYMTFfR2V0U3ltKCJYR2V0SUNWYWx1ZXMiLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNETF9YMTFfSEFWRV9VVEY4KTsKKwkJI2VuZGlmCisKKwkJLyoKKwkJICogSW4gY2FzZSB3ZSdyZSBidWlsdCB3aXRoIG5ld2VyIFhsaWIgaGVhZGVycywgd2UgbmVlZCB0byBtYWtlIHN1cmUKKwkJICogIHRoYXQgX1hHZXRSZXF1ZXN0KCkgaXMgYXZhaWxhYmxlLCBldmVuIG9uIG9sZGVyIHN5c3RlbXMuCisJCSAqICBPdGhlcndpc2UsIHZhcmlvdXMgWGxpYiBtYWNyb3Mgd2UgdXNlIHdpbGwgY2FsbCBhIE5VTEwgcG9pbnRlci4KKwkJICovCisJCWlmICghU0RMX1gxMV9IQVZFX1hHRVRSRVFVRVNUKSB7CisJCQlwX1hHZXRSZXF1ZXN0ID0gU0RMX1hHZXRSZXF1ZXN0X3dvcmthcm91bmQ7CisJCX0KKworCQlpZiAoU0RMX1gxMV9IQVZFX0JBU0VYTElCKSB7ICAvKiBhbGwgcmVxdWlyZWQgc3ltYm9scyBsb2FkZWQuICovCisJCQlTRExfQ2xlYXJFcnJvcigpOworCQkJWEluaXRUaHJlYWRzKCk7CisJCX0gZWxzZSB7CisJCQlTRExfWDExX1VubG9hZFN5bWJvbHMoKTsgIC8qIGluIGNhc2Ugc29tZXRoaW5nIGdvdCBsb2FkZWQuLi4gKi8KKwkJCXJjID0gMDsKKwkJfQorCX0KKwkjZWxzZQorCQkjaWYgREVCVUdfRFlOQU1JQ19YMTEKKwkJcHJpbnRmKCJYMTE6IE5vIGR5bmFtaWMgWDExIHN1cHBvcnQgaW4gdGhpcyBidWlsZCBvZiBTREwuXG4iKTsKKwkJI2VuZGlmCisJCSNpZmRlZiBYX0hBVkVfVVRGOF9TVFJJTkcKKwkJcFhDcmVhdGVJQyA9IFhDcmVhdGVJQzsKKwkJcFhHZXRJQ1ZhbHVlcyA9IFhHZXRJQ1ZhbHVlczsKKwkJI2VuZGlmCisJI2VuZGlmCisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGVuZCBvZiBTRExfeDExZHluLmMgLi4uICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFkeW4uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFkeW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmZmODJhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMWR5bi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfeDExZHluX2gKKyNkZWZpbmUgX1NETF94MTFkeW5faAorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNpbmNsdWRlIDxYMTEvWGF0b20uaD4KKworLyogQXBwYXJlbnRseSBzb21lIFgxMSBzeXN0ZW1zIGNhbid0IGluY2x1ZGUgdGhpcyBtdWx0aXBsZSB0aW1lcy4uLiAqLworI2lmbmRlZiBTRExfSU5DTFVERURfWExJQklOVF9ICisjZGVmaW5lIFNETF9JTkNMVURFRF9YTElCSU5UX0ggMQorI2luY2x1ZGUgPFgxMS9YbGliaW50Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4KKworI2luY2x1ZGUgIi4uL1hleHQvZXh0ZW5zaW9ucy9YZXh0LmgiCisjaW5jbHVkZSAiLi4vWGV4dC9leHRlbnNpb25zL2V4dHV0aWwuaCIKKworI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YU2htLmg+CisjZW5kaWYKKworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hyYW5kci5oPgorI2VuZGlmCisKKy8qCisgKiBXaGVuIHVzaW5nIHRoZSAiZHluYW1pYyBYMTEiIGZ1bmN0aW9uYWxpdHksIHdlIGR1cGxpY2F0ZSBhbGwgdGhlIFhsaWIKKyAqICBzeW1ib2xzIHRoYXQgd291bGQgYmUgcmVmZXJlbmNlZCBieSBTREwgaW5zaWRlIG9mIFNETCBpdHNlbGYuCisgKiAgVGhlc2UgZHVwbGljYXRlZCBzeW1ib2xzIGp1c3Qgc2VydmUgYXMgcGFzc3Rocm91Z2hzIHRvIHRoZSBmdW5jdGlvbnMKKyAqICBpbiBYbGliLCB0aGF0IHdhcyBkeW5hbWljYWxseSBsb2FkZWQuCisgKgorICogVGhpcyBhbGxvd3MgdXMgdG8gdXNlIFhsaWIgYXMtaXMgd2hlbiBsaW5raW5nIGFnYWluc3QgaXQgZGlyZWN0bHksIGJ1dAorICogIGFsc28gaGFuZGxlcyBhbGwgdGhlIHN0cmFuZ2UgY2FzZXMgd2hlcmUgdGhlcmUgd2FzIGNvZGUgaW4gdGhlIFhsaWIKKyAqICBoZWFkZXJzIHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3Qgb3IgdmFyeSBvbiBhIGdpdmVuIHBsYXRmb3JtLgorICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIGV2aWwgZnVuY3Rpb24gc2lnbmF0dXJlcy4uLiAqLwordHlwZWRlZiBCb29sICgqU0RMX1gxMV9YRVNldFdpcmVUb0V2ZW50UmV0VHlwZSkoRGlzcGxheSosWEV2ZW50Kix4RXZlbnQqKTsKK3R5cGVkZWYgaW50ICgqU0RMX1gxMV9YU3luY2hyb25pemVSZXRUeXBlKShEaXNwbGF5Kik7Cit0eXBlZGVmIFN0YXR1cyAoKlNETF9YMTFfWEVTZXRFdmVudFRvV2lyZVJldFR5cGUpKERpc3BsYXkqLFhFdmVudCoseEV2ZW50Kik7CisKK2ludCBTRExfWDExX0xvYWRTeW1ib2xzKHZvaWQpOwordm9pZCBTRExfWDExX1VubG9hZFN5bWJvbHModm9pZCk7CisKKy8qIFRoYXQncyByZWFsbHkgYW5ub3lpbmcuLi5tYWtlIHRoaXMgYSBmdW5jdGlvbiBwb2ludGVyIG5vIG1hdHRlciB3aGF0LiAqLworI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworZXh0ZXJuIFhJQyAoKnBYQ3JlYXRlSUMpKFhJTSwuLi4pOworZXh0ZXJuIGNoYXIgKigqcFhHZXRJQ1ZhbHVlcykoWElDLCAuLi4pOworI2VuZGlmCisKKy8qIFRoZXNlIFNETF9YMTFfSEFWRV8qIGZsYWdzIGFyZSBoZXJlIHdoZXRoZXIgeW91IGhhdmUgZHluYW1pYyBYMTEgb3Igbm90LiAqLworI2RlZmluZSBTRExfWDExX01PRFVMRShtb2RuYW1lKSBleHRlcm4gaW50IFNETF9YMTFfSEFWRV8jI21vZG5hbWU7CisjZGVmaW5lIFNETF9YMTFfU1lNKHJjLGZuLHBhcmFtcyxhcmdzLHJldCkKKyNpbmNsdWRlICJTRExfeDExc3ltLmgiCisjdW5kZWYgU0RMX1gxMV9NT0RVTEUKKyN1bmRlZiBTRExfWDExX1NZTQorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLyogIWRlZmluZWQgX1NETF94MTFkeW5faCAqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZXZlbnRzLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5YTAwMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFldmVudHMuYwpAQCAtMCwwICsxLDE0MTQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBIYW5kbGUgdGhlIGV2ZW50IHN0cmVhbSwgY29udmVydGluZyBYMTEgZXZlbnRzIGludG8gU0RMIGV2ZW50cyAqLworCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CisjaWZkZWYgX19TVlI0CisjaW5jbHVkZSA8WDExL1N1bmtleXN5bS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlNETF90aW1lci5oIgorI2luY2x1ZGUgIlNETF9zeXN3bS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfc3lzZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF94MTF2aWRlby5oIgorI2luY2x1ZGUgIlNETF94MTFkZ2FfYy5oIgorI2luY2x1ZGUgIlNETF94MTFtb2Rlc19jLmgiCisjaW5jbHVkZSAiU0RMX3gxMWltYWdlX2MuaCIKKyNpbmNsdWRlICJTRExfeDExZ2FtbWFfYy5oIgorI2luY2x1ZGUgIlNETF94MTF3bV9jLmgiCisjaW5jbHVkZSAiU0RMX3gxMW1vdXNlX2MuaCIKKyNpbmNsdWRlICJTRExfeDExZXZlbnRzX2MuaCIKKworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBkZWJ1ZyBYMTEgZXZlbnRzICovCisvKiNkZWZpbmUgREVCVUdfWEVWRU5UUyovCisKKy8qIFRoZSB0cmFuc2xhdGlvbiB0YWJsZXMgZnJvbSBhbiBYMTEga2V5c3ltIHRvIGEgU0RMIGtleXN5bSAqLworc3RhdGljIFNETEtleSBPRERfa2V5bWFwWzI1Nl07CitzdGF0aWMgU0RMS2V5IE1JU0Nfa2V5bWFwWzI1Nl07CitTRExLZXkgWDExX1RyYW5zbGF0ZUtleWNvZGUoRGlzcGxheSAqZGlzcGxheSwgS2V5Q29kZSBrYyk7CisKKy8qCisgUGVuZGluZyByZXNpemUgdGFyZ2V0IGZvciBDb25maWd1cmVOb3RpZnkgKHNvIG91dGRhdGVkIGV2ZW50cyBkb24ndAorIGNhdXNlIGluYXBwcm9wcmlhdGUgcmVzaXplIGV2ZW50cykKKyovCitpbnQgWDExX1BlbmRpbmdDb25maWd1cmVOb3RpZnlXaWR0aCA9IC0xOworaW50IFgxMV9QZW5kaW5nQ29uZmlndXJlTm90aWZ5SGVpZ2h0ID0gLTE7CisKKyNpZmRlZiBYX0hBVkVfVVRGOF9TVFJJTkcKK1VpbnQzMiBVdGY4VG9VY3M0KGNvbnN0IFVpbnQ4ICp1dGY4KQoreworCVVpbnQzMiBjOworCWludCBpID0gMTsKKwlpbnQgbm9PY3RldHMgPSAwOworCWludCBmaXJzdE9jdGV0TWFzayA9IDA7CisJdW5zaWduZWQgY2hhciBmaXJzdE9jdGV0ID0gdXRmOFswXTsKKwlpZiAoZmlyc3RPY3RldCA8IDB4ODApIHsKKwkJLyoKKwkJICBDaGFyYWN0ZXJzIGluIHRoZSByYW5nZToKKwkJICAgIDAwMDAwMDAwIHRvIDAxMTExMTExIChBU0NJSSBSYW5nZSkKKwkJICBhcmUgc3RvcmVkIGluIG9uZSBvY3RldDoKKwkJICAgIDB4eHh4eHh4IChUaGUgc2FtZSBhcyBpdHMgQVNDSUkgcmVwcmVzZW50YXRpb24pCisJCSAgVGhlIGxlYXN0IDYgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZmlyc3Qgb2N0ZXQgaXMgdGhlIG1vc3QgNiBzaWduaWZpY2FudCBub256ZXJvIGJpdHMKKwkJICBvZiB0aGUgVUNTNCByZXByZXNlbnRhdGlvbi4KKwkJKi8KKwkJbm9PY3RldHMgPSAxOworCQlmaXJzdE9jdGV0TWFzayA9IDB4N0Y7ICAvKiAwKDExMTExMTEpIC0gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIGlnbm9yZWQgKi8KKwl9IGVsc2UgaWYgKChmaXJzdE9jdGV0ICYgMHhFMCkgLyogZ2V0IHRoZSBtb3N0IDMgc2lnbmlmaWNhbnQgYml0cyBieSBBTkQnaW5nIHdpdGggMTExMDAwMDAgKi8KKwkgICAgICAgICAgICAgID09IDB4QzAgKSB7ICAvKiBzZWUgaWYgdGhvc2UgMyBiaXRzIGFyZSAxMTAuIElmIHNvLCB0aGUgY2hhciBpcyBpbiB0aGlzIHJhbmdlICovCisJCS8qCisJCSAgQ2hhcmFjdGVycyBpbiB0aGUgcmFuZ2U6CisJCSAgICAwMDAwMDAwMCAxMDAwMDAwMCB0byAwMDAwMDExMSAxMTExMTExMQorCQkgIGFyZSBzdG9yZWQgaW4gdHdvIG9jdGV0czoKKwkJICAgIDExMHh4eHh4IDEweHh4eHh4CisJCSAgVGhlIGxlYXN0IDUgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZmlyc3Qgb2N0ZXQgaXMgdGhlIG1vc3QgNSBzaWduaWZpY2FudCBub256ZXJvIGJpdHMKKwkJICBvZiB0aGUgVUNTNCByZXByZXNlbnRhdGlvbi4KKwkJKi8KKwkJbm9PY3RldHMgPSAyOworCQlmaXJzdE9jdGV0TWFzayA9IDB4MUY7ICAvKiAwMDAoMTExMTEpIC0gVGhlIG1vc3QgMyBzaWduaWZpY2FudCBiaXRzIGFyZSBpZ25vcmVkICovCisJfSBlbHNlIGlmICgoZmlyc3RPY3RldCAmIDB4RjApIC8qIGdldCB0aGUgbW9zdCA0IHNpZ25pZmljYW50IGJpdHMgYnkgQU5EJ2luZyB3aXRoIDExMTEwMDAwICovCisJICAgICAgICAgICAgICA9PSAweEUwKSB7ICAvKiBzZWUgaWYgdGhvc2UgNCBiaXRzIGFyZSAxMTEwLiBJZiBzbywgdGhlIGNoYXIgaXMgaW4gdGhpcyByYW5nZSAqLworCQkvKgorCQkgIENoYXJhY3RlcnMgaW4gdGhlIHJhbmdlOgorCQkgICAgMDAwMDEwMDAgMDAwMDAwMDAgdG8gMTExMTExMTEgMTExMTExMTEKKwkJICBhcmUgc3RvcmVkIGluIHRocmVlIG9jdGV0czoKKwkJICAgIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4CisJCSAgVGhlIGxlYXN0IDQgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZmlyc3Qgb2N0ZXQgaXMgdGhlIG1vc3QgNCBzaWduaWZpY2FudCBub256ZXJvIGJpdHMKKwkJICBvZiB0aGUgVUNTNCByZXByZXNlbnRhdGlvbi4KKwkJKi8KKwkJbm9PY3RldHMgPSAzOworCQlmaXJzdE9jdGV0TWFzayA9IDB4MEY7IC8qIDAwMDAoMTExMSkgLSBUaGUgbW9zdCA0IHNpZ25pZmljYW50IGJpdHMgYXJlIGlnbm9yZWQgKi8KKwl9IGVsc2UgaWYgKChmaXJzdE9jdGV0ICYgMHhGOCkgLyogZ2V0IHRoZSBtb3N0IDUgc2lnbmlmaWNhbnQgYml0cyBieSBBTkQnaW5nIHdpdGggMTExMTEwMDAgKi8KKwkgICAgICAgICAgICAgID09IDB4RjApIHsgIC8qIHNlZSBpZiB0aG9zZSA1IGJpdHMgYXJlIDExMTEwLiBJZiBzbywgdGhlIGNoYXIgaXMgaW4gdGhpcyByYW5nZSAqLworCQkvKgorCQkgIENoYXJhY3RlcnMgaW4gdGhlIHJhbmdlOgorCQkgICAgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgdG8gMDAwMTExMTEgMTExMTExMTEgMTExMTExMTEKKwkJICBhcmUgc3RvcmVkIGluIGZvdXIgb2N0ZXRzOgorCQkgICAgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKwkJICBUaGUgbGVhc3QgMyBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBmaXJzdCBvY3RldCBpcyB0aGUgbW9zdCAzIHNpZ25pZmljYW50IG5vbnplcm8gYml0cworCQkgIG9mIHRoZSBVQ1M0IHJlcHJlc2VudGF0aW9uLgorCQkqLworCQlub09jdGV0cyA9IDQ7CisJCWZpcnN0T2N0ZXRNYXNrID0gMHgwNzsgLyogMTExMTAoMTExKSAtIFRoZSBtb3N0IDUgc2lnbmlmaWNhbnQgYml0cyBhcmUgaWdub3JlZCAqLworCX0gZWxzZSBpZiAoKGZpcnN0T2N0ZXQgJiAweEZDKSAvKiBnZXQgdGhlIG1vc3QgNiBzaWduaWZpY2FudCBiaXRzIGJ5IEFORCdpbmcgd2l0aCAxMTExMTEwMCAqLworCSAgICAgICAgICAgICAgPT0gMHhGOCkgeyAvKiBzZWUgaWYgdGhvc2UgNiBiaXRzIGFyZSAxMTExMTAuIElmIHNvLCB0aGUgY2hhciBpcyBpbiB0aGlzIHJhbmdlICovCisJCS8qCisJCSAgQ2hhcmFjdGVycyBpbiB0aGUgcmFuZ2U6CisJCSAgICAwMDAwMDAwMCAwMDEwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCB0bworCQkgICAgMDAwMDAwMTEgMTExMTExMTEgMTExMTExMTEgMTExMTExMTEKKwkJICBhcmUgc3RvcmVkIGluIGZpdmUgb2N0ZXRzOgorCQkgICAgMTExMTEweHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKwkJICBUaGUgbGVhc3QgMiBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBmaXJzdCBvY3RldCBpcyB0aGUgbW9zdCAyIHNpZ25pZmljYW50IG5vbnplcm8gYml0cworCQkgIG9mIHRoZSBVQ1M0IHJlcHJlc2VudGF0aW9uLgorCQkqLworCQlub09jdGV0cyA9IDU7CisJCWZpcnN0T2N0ZXRNYXNrID0gMHgwMzsgLyogMTExMTEwKDExKSAtIFRoZSBtb3N0IDYgc2lnbmlmaWNhbnQgYml0cyBhcmUgaWdub3JlZCAqLworCX0gZWxzZSBpZiAoKGZpcnN0T2N0ZXQgJiAweEZFKSAvKiBnZXQgdGhlIG1vc3QgNyBzaWduaWZpY2FudCBiaXRzIGJ5IEFORCdpbmcgd2l0aCAxMTExMTExMCAqLworCSAgICAgICAgICAgICAgPT0gMHhGQykgeyAvKiBzZWUgaWYgdGhvc2UgNyBiaXRzIGFyZSAxMTExMTEwLiBJZiBzbywgdGhlIGNoYXIgaXMgaW4gdGhpcyByYW5nZSAqLworCQkvKgorCQkgIENoYXJhY3RlcnMgaW4gdGhlIHJhbmdlOgorCQkgICAgMDAwMDAxMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgdG8KKwkJICAgIDAxMTExMTExIDExMTExMTExIDExMTExMTExIDExMTExMTExCisJCSAgYXJlIHN0b3JlZCBpbiBzaXggb2N0ZXRzOgorCQkgICAgMTExMTExMHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKwkJICBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBmaXJzdCBvY3RldCBpcyB0aGUgbW9zdCBzaWduaWZpY2FudCBub256ZXJvIGJpdAorCQkgIG9mIHRoZSBVQ1M0IHJlcHJlc2VudGF0aW9uLgorCQkqLworCQlub09jdGV0cyA9IDY7CisJCWZpcnN0T2N0ZXRNYXNrID0gMHgwMTsgLyogMTExMTExMCgxKSAtIFRoZSBtb3N0IDcgc2lnbmlmaWNhbnQgYml0cyBhcmUgaWdub3JlZCAqLworCX0gZWxzZQorCQlyZXR1cm4gMDsgIC8qIFRoZSBnaXZlbiBjaHVuayBpcyBub3QgYSB2YWxpZCBVVEYtOCBlbmNvZGVkIFVuaWNvZGUgY2hhcmFjdGVyICovCisJCisJLyoKKwkgIFRoZSBsZWFzdCBub09jdGV0cyBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBmaXJzdCBvY3RldCBpcyB0aGUgbW9zdCAyIHNpZ25pZmljYW50IG5vbnplcm8gYml0cworCSAgb2YgdGhlIFVDUzQgcmVwcmVzZW50YXRpb24uCisJICBUaGUgZmlyc3QgNiBiaXRzIG9mIHRoZSBVQ1M0IHJlcHJlc2VudGF0aW9uIGlzIHRoZSBsZWFzdCA4LW5vT2N0ZXRzLTEgc2lnbmlmaWNhbnQgYml0cyBvZgorCSAgZmlyc3RPY3RldCBpZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBBU0NJSS4gSWYgc28sIGl0J3MgdGhlIGxlYXN0IDcgc2lnbmlmaWNhbnQgYml0cyBvZiBmaXJzdE9jdGV0LgorCSAgVGhpcyBkb25lIGJ5IEFORCdpbmcgZmlyc3RPY3RldCB3aXRoIGl0cyBtYXNrIHRvIHRyaW0gdGhlIGJpdHMgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlCisJICBudW1iZXIgb2YgY29udGludWluZyBvY3RldHMgKGlmIGFueSkgYW5kIGxlYXZlIG9ubHkgdGhlIGZyZWUgYml0cyAodGhlIHgncykKKwkgIFNhbXBsZToKKwkgIDEtb2N0ZXQ6ICAgIDB4eHh4eHh4ICAmICAwMTExMTExMSA9IDB4eHh4eHh4CisJICAyLW9jdGV0czogIDExMHh4eHh4ICAmICAwMDAxMTExMSA9IDAwMHh4eHh4CisJKi8KKwljID0gZmlyc3RPY3RldCAmIGZpcnN0T2N0ZXRNYXNrOworCQorCS8qIE5vdywgc3RhcnQgZmlsbGluZyBjLnVjczQgd2l0aCB0aGUgYml0cyBmcm9tIHRoZSBjb250aW51aW5nIG9jdGV0cyBmcm9tIHV0ZjguICovCisJZm9yIChpID0gMTsgaSA8IG5vT2N0ZXRzOyBpKyspIHsKKwkJLyogQSB2YWxpZCBjb250aW51aW5nIG9jdGV0IGlzIG9mIHRoZSBmb3JtIDEweHh4eHh4ICovCisJCWlmICgodXRmOFtpXSAmIDB4QzApIC8qIGdldCB0aGUgbW9zdCAyIHNpZ25pZmljYW50IGJpdHMgYnkgQU5EJ2luZyB3aXRoIDExMDAwMDAwICovCisJCSAgICAhPSAweDgwKSAvKiBzZWUgaWYgdGhvc2UgMiBiaXRzIGFyZSAxMC4gSWYgbm90LCB0aGUgaXMgYSBtYWxmb3JtZWQgc2VxdWVuY2UuICovCisJCQkvKlRoZSBnaXZlbiBjaHVuayBpcyBhIHBhcnRpYWwgc2VxdWVuY2UgYXQgdGhlIGVuZCBvZiBhIHN0cmluZyB0aGF0IGNvdWxkCisJCQkgICBiZWdpbiBhIHZhbGlkIGNoYXJhY3RlciAqLworCQkJcmV0dXJuIDA7CisJCQorCQkvKiBNYWtlIHJvb20gZm9yIHRoZSBuZXh0IDYtYml0cyAqLworCQljIDw8PSA2OworCQkKKwkJLyoKKwkJICBUYWtlIG9ubHkgdGhlIGxlYXN0IDYgc2lnbmlmaWNhbmNlIGJpdHMgb2YgdGhlIGN1cnJlbnQgb2N0ZXQgKHV0ZjhbaV0pIGFuZCBmaWxsIHRoZSBjcmVhdGVkIHJvb20KKwkJICBvZiBjLnVjczQgd2l0aCB0aGVtLgorCQkgIFRoaXMgZG9uZSBieSBBTkQnaW5nIHV0ZjhbaV0gd2l0aCAwMDExMTExMSBhbmQgdGhlIE9SJ2luZyB0aGUgcmVzdWx0IHdpdGggYy51Y3M0LgorCQkqLworCQljIHw9IHV0ZjhbaV0gJiAweDNGOworCX0KKwlyZXR1cm4gYzsKK30KKworLyogR2l2ZW4gYSBVVEYtOCBlbmNvZGVkIHN0cmluZyBwb2ludGVkIHRvIGJ5IHV0Zjggb2YgbGVuZ3RoIGxlbmd0aCBpbgorICAgYnl0ZXMsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgVVRGLTE2IGVuY29kZWQgc3RyaW5nIGluIHRoZQorICAgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdXRmMTYuICBUaGUgbWF4aW11bSBudW1iZXIgb2YgVVRGLTE2IGVuY29kaW5nCisgICB1bml0cyAoaS5lLiwgVW5pdDE2cykgYWxsb3dlZCBpbiB0aGUgYnVmZmVyIGlzIHNwZWNpZmllZCBpbgorICAgdXRmMTZfbWF4X2xlbmd0aC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBVVEYtMTYKKyAgIGVuY29kaW5nIHVuaXRzIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHV0ZjE2LgorCisgICBJbiBjYXNlIG9mIGFuIGVycm9yLCAtMSBpcyByZXR1cm5lZCwgbGVhdmluZyBzb21lIHVudXNhYmxlIHBhcnRpYWwKKyAgIHJlc3VsdHMgaW4gdGhlIG91dHB1dCBidWZmZXIuCisKKyAgIFRoZSBjYWxsZXIgbXVzdCBlc3RpbWF0ZSB0aGUgc2l6ZSBvZiB1dGYxNiBidWZmZXIgYnkgaXRzZWxmIGJlZm9yZQorICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgSW5zdWZmaWNpZW50IG91dHB1dCBidWZmZXIgaXMgY29uc2lkZXJlZCBhcworICAgYW4gZXJyb3IsIGFuZCBvbmNlIGFuIGVycm9yIG9jY3VyZWQsIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBnaXZlIGFueQorICAgY2x1ZSBob3cgbGFyZ2UgdGhlIHJlc3VsdCB3aWxsIGJlLgorCisgICBUaGUgZXJyb3IgY2FzZXMgaW5jbHVkZSBmb2xsb3dpbmc6CisKKyAgIC0gSW52YWxpZCBieXRlIHNlcXVlbmNlcyB3ZXJlIGluIHRoZSBpbnB1dCBVVEYtOCBieXRlcy4gIFRoZSBjYWxsZXIKKyAgICAgaGFzIG5vIHdheSB0byBrbm93IHdoYXQgcG9pbnQgaW4gdGhlIGlucHV0IGJ1ZmZlciB3YXMgdGhlCisgICAgIGVycm9ybm91cyBieXRlLgorCisgICAtIFRoZSBpbnB1dCBjb250YWluZWQgYSBjaGFyYWN0ZXIgKGEgdmFsaWQgVVRGLTggYnl0ZSBzZXF1ZW5jZSkKKyAgICAgd2hvc2Ugc2NhbGFyIHZhbHVlIGV4Y2VlZGVkIHRoZSByYW5nZSB0aGF0IFVURi0xNiBjYW4gcmVwcmVzZW50CisgICAgIChpLmUuLCBjaGFyYWN0ZXJzIHdob3NlIFVuaWNvZGUgc2NhbGFyIHZhbHVlIGFib3ZlIDB4MTEwMDAwKS4KKworICAgLSBUaGUgb3V0cHV0IGJ1ZmZlciBoYXMgbm8gZW5vdWdoIHNwYWNlIHRvIGhvbGQgZW50aXJlIHV0ZjE2IGRhdGEuCisKKyAgIFBsZWFzZSBub3RlOgorCisgICAtICdcMCctdGVybWluYXRpb24gaXMgbm90IGFzc3VtZWQgYm90aCBvbiB0aGUgaW5wdXQgVVRGLTggc3RyaW5nCisgICAgIGFuZCBvbiB0aGUgb3V0cHV0IFVURi0xNiBzdHJpbmc7IGFueSBsZWdhbCB6ZXJvIGJ5dGUgaW4gdGhlIGlucHV0CisgICAgIFVURi04IHN0cmluZyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIDE2LWJpdCB6ZXJvIGluIG91dHB1dC4gIEFzIGEKKyAgICAgc2lkZSBlZmZlY3QsIHRoZSBsYXN0IFVURi0xNiBlbmNvZGluZyB1bml0IHN0b3JlZCBpbiB0aGUgb3V0cHV0CisgICAgIGJ1ZmZlciB3aWxsIGhhdmUgYSBub24temVybyB2YWx1ZSBpZiB0aGUgaW5wdXQgVVRGLTggd2FzIG5vdAorICAgICAnXDAnLXRlcm1pbmF0ZWQuCisKKyAgIC0gVVRGLTggYWxpYXNlcyBhcmUgKm5vdCogY29uc2lkZXJlZCBhcyBhbiBlcnJvci4gIFRoZXkgYXJlCisgICAgIGNvbnZlcnRlZCB0byBVVEYtMTYuICBGb3IgZXhhbXBsZSwgMHhDMCAweEEwLCAweEUwIDB4ODAgMHhBMCwgCisgICAgIGFuZCAweEYwIDB4ODAgMHg4MCAweEEwIGFyZSBhbGwgbWFwcGVkIHRvIGEgc2luZ2xlIFVURi0xNgorICAgICBlbmNvZGluZyB1bml0IDB4MDAyMC4KKworICAgLSBUaHJlZSBieXRlIFVURi04IHNlcXVlbmNlcyB3aG9zZSB2YWx1ZSBjb3JyZXNwb25kcyB0byBhIHN1cnJvZ2F0ZQorICAgICBjb2RlIG9yIG90aGVyIHJlc2VydmVkIHNjYWxhciB2YWx1ZSBhcmUgbm90IGNvbnNpZGVyZWQgYXMgYW4KKyAgICAgZXJyb3IgZWl0aGVyLiAgVGhleSBtYXkgY2F1c2UgYW4gaW52YWxpZCBVVEYtMTYgZGF0YSAoZS5nLiwgdGhvc2UKKyAgICAgY29udGFpbmluZyB1bnBhaXJlZCBzdXJyb2dhdGVzKS4KKworKi8KKworc3RhdGljIGludCBVdGY4VG9VdGYxNihjb25zdCBVaW50OCAqdXRmOCwgY29uc3QgaW50IHV0ZjhfbGVuZ3RoLCBVaW50MTYgKnV0ZjE2LCBjb25zdCBpbnQgdXRmMTZfbWF4X2xlbmd0aCkgeworCisgICAgLyogcCBtb3ZlcyBvdmVyIHRoZSBvdXRwdXQgYnVmZmVyLiAgbWF4X3B0ciBwb2ludHMgdG8gdGhlIG5leHQgdG8gdGhlIGxhc3Qgc2xvdCBvZiB0aGUgYnVmZmVyLiAgKi8KKyAgICBVaW50MTYgKnAgPSB1dGYxNjsKKyAgICBVaW50MTYgY29uc3QgKmNvbnN0IG1heF9wdHIgPSB1dGYxNiArIHV0ZjE2X21heF9sZW5ndGg7CisKKyAgICAvKiBlbmRfb2ZfaW5wdXQgcG9pbnRzIHRvIHRoZSBsYXN0IGJ5dGUgb2YgaW5wdXQgYXMgb3Bwb3NlZCB0byB0aGUgbmV4dCB0byB0aGUgbGFzdCBieXRlLiAgKi8KKyAgICBVaW50OCBjb25zdCAqY29uc3QgZW5kX29mX2lucHV0ID0gdXRmOCArIHV0ZjhfbGVuZ3RoIC0gMTsKKworICAgIHdoaWxlICh1dGY4IDw9IGVuZF9vZl9pbnB1dCkgeworCVVpbnQ4IGNvbnN0IGMgPSAqdXRmODsKKwlpZiAocCA+PSBtYXhfcHRyKSB7CisJICAgIC8qIE5vIG1vcmUgb3V0cHV0IHNwYWNlLiAgKi8KKwkgICAgcmV0dXJuIC0xOworCX0KKwlpZiAoYyA8IDB4ODApIHsKKwkgICAgLyogT25lIGJ5dGUgQVNDSUkuICAqLworCSAgICAqcCsrID0gYzsKKwkgICAgdXRmOCArPSAxOworCX0gZWxzZSBpZiAoYyA8IDB4QzApIHsKKwkgICAgLyogRm9sbG93ZXIgYnl0ZSB3aXRob3V0IHByZWNlZWRpbmcgbGVhZGVyIGJ5dGVzLiAgKi8KKwkgICAgcmV0dXJuIC0xOworCX0gZWxzZSBpZiAoYyA8IDB4RTApIHsKKwkgICAgLyogVHdvIGJ5dGUgc2VxdWVuY2UuICBXZSBuZWVkIG9uZSBmb2xsb3dlciBieXRlLiAgKi8KKwkgICAgaWYgKGVuZF9vZl9pbnB1dCAtIHV0ZjggPCAxIHx8ICgoKHV0ZjhbMV0gXiAweDgwKSkgJiAweEMwKSkgeworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgKnArKyA9IChVaW50MTYpKDB4Q0Y4MCArIChjIDw8IDYpICsgdXRmOFsxXSk7CisJICAgIHV0ZjggKz0gMjsKKwl9IGVsc2UgaWYgKGMgPCAweEYwKSB7CisJICAgIC8qIFRocmVlIGJ5dGUgc2VxdWVuY2UuICBXZSBuZWVkIHR3byBmb2xsb3dlciBieXRlLiAgKi8KKwkgICAgaWYgKGVuZF9vZl9pbnB1dCAtIHV0ZjggPCAyIHx8ICgoKHV0ZjhbMV0gXiAweDgwKSB8ICh1dGY4WzJdIF4gMHg4MCkpICYgMHhDMCkpIHsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgICpwKysgPSAoVWludDE2KSgweERGODAgKyAoYyA8PCAxMikgKyAodXRmOFsxXSA8PCA2KSArIHV0ZjhbMl0pOworCSAgICB1dGY4ICs9IDM7CisJfSBlbHNlIGlmIChjIDwgMHhGOCkgeworCSAgICBpbnQgcGxhbmU7CisJICAgIC8qIEZvdXIgYnl0ZSBzZXF1ZW5jZS4gIFdlIG5lZWQgdGhyZWUgZm9sbG93ZXIgYnl0ZXMuICAqLworCSAgICBpZiAoZW5kX29mX2lucHV0IC0gdXRmOCA8IDMgfHwgKCgodXRmOFsxXSBeIDB4ODApIHwgKHV0ZjhbMl0gXjB4ODApIHwgKHV0ZjhbM10gXiAweDgwKSkgJiAweEMwKSkgeworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgcGxhbmUgPSAoLTB4QzggKyAoYyA8PCAyKSArICh1dGY4WzFdID4+IDQpKTsKKwkgICAgaWYgKHBsYW5lID09IDApIHsKKwkJLyogVGhpcyBmb3VyIGJ5dGUgc2VxdWVuY2UgaXMgYW4gYWxpYXMgdGhhdAorICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGEgVW5pY29kZSBzY2FsYXIgdmFsdWUgaW4gQk1QLgorCQkgICBJdCBmaXRzIGluIGFuIFVURi0xNiBlbmNvZGluZyB1bml0LiAgKi8KKwkJKnArKyA9IChVaW50MTYpKDB4REY4MCArICh1dGY4WzFdIDw8IDEyKSArICh1dGY4WzJdIDw8IDYpICsgdXRmOFszXSk7CisJICAgIH0gZWxzZSBpZiAocGxhbmUgPD0gMTYpIHsKKwkJLyogVGhpcyBpcyBhIGxlZ2FsIGZvdXIgYnl0ZSBzZXF1ZW5jZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc3Vycm9nYXRlIHBhaXIuICAqLworCQlpZiAocCArIDEgPj0gbWF4X3B0cikgeworCQkgICAgLyogTm8gZW5vdWdoIHNwYWNlIG9uIHRoZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgcGFpci4gICovCisJCSAgICByZXR1cm4gLTE7CisJCX0KKwkJKnArKyA9IChVaW50MTYpKDB4RTVCOCArIChjIDw8IDgpICsgKHV0ZjhbMV0gPDwgMikgKyAodXRmOFsyXSA+PiA0KSk7CisJCSpwKysgPSAoVWludDE2KSgweERCODAgKyAoKHV0ZjhbMl0gJiAweDBGKSA8PCA2KSArIHV0ZjhbM10pOworCSAgICB9IGVsc2UgeworCQkvKiBUaGlzIGZvdXIgYnl0ZSBzZXF1ZW5jZSBpcyBvdXQgb2YgVVRGLTE2IGNvZGUgc3BhY2UuICAqLworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgdXRmOCArPSA0OworCX0gZWxzZSB7CisJICAgIC8qIExvbmdlciBzZXF1ZW5jZSBvciB1bnVzZWQgYnl0ZS4gICovCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorICAgIHJldHVybiBwIC0gdXRmMTY7Cit9CisKKyNlbmRpZgorCisvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIHJlcGVhdGVkIGtleS4KKyAgIChpZGVhIHNoYW1lbGVzc2x5IGxpZnRlZCBmcm9tIEdJSSAtLSB0aGFua3MgZ3V5cyEgOikKKyAqLworc3RhdGljIGludCBYMTFfS2V5UmVwZWF0KERpc3BsYXkgKmRpc3BsYXksIFhFdmVudCAqZXZlbnQpCit7CisJWEV2ZW50IHBlZWtldmVudDsKKwlpbnQgcmVwZWF0ZWQ7CisKKwlyZXBlYXRlZCA9IDA7CisJaWYgKCBYUGVuZGluZyhkaXNwbGF5KSApIHsKKwkJWFBlZWtFdmVudChkaXNwbGF5LCAmcGVla2V2ZW50KTsKKwkJaWYgKCAocGVla2V2ZW50LnR5cGUgPT0gS2V5UHJlc3MpICYmCisJCSAgICAgKHBlZWtldmVudC54a2V5LmtleWNvZGUgPT0gZXZlbnQtPnhrZXkua2V5Y29kZSkgJiYKKwkJICAgICAoKHBlZWtldmVudC54a2V5LnRpbWUtZXZlbnQtPnhrZXkudGltZSkgPCAyKSApIHsKKwkJCXJlcGVhdGVkID0gMTsKKwkJCVhOZXh0RXZlbnQoZGlzcGxheSwgJnBlZWtldmVudCk7CisJCX0KKwl9CisJcmV0dXJuKHJlcGVhdGVkKTsKK30KKworLyogTm90ZTogIFRoZSBYIHNlcnZlciBidWZmZXJzIGFuZCBhY2N1bXVsYXRlcyBtb3VzZSBtb3Rpb24gZXZlbnRzLCBzbworICAgdGhlIG1vdGlvbiBldmVudCBnZW5lcmF0ZWQgYnkgdGhlIHdhcnAgbWF5IG5vdCBhcHBlYXIgZXhhY3RseSBhcyB3ZQorICAgZXhwZWN0IGl0IHRvLiAgV2Ugd29yayBhcm91bmQgdGhpcyAoYW5kIGltcHJvdmUgcGVyZm9ybWFuY2UpIGJ5IG9ubHkKKyAgIHdhcnBpbmcgdGhlIHBvaW50ZXIgd2hlbiBpdCByZWFjaGVzIHRoZSBlZGdlLCBhbmQgdGhlbiB3YWl0IGZvciBpdC4KKyovCisjZGVmaW5lIE1PVVNFX0ZVREdFX0ZBQ1RPUgk4CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBYMTFfV2FycGVkTW90aW9uKF9USElTLCBYRXZlbnQgKnhldmVudCkKK3sKKwlpbnQgdywgaCwgaTsKKwlpbnQgZGVsdGF4LCBkZWx0YXk7CisJaW50IHBvc3RlZDsKKworCXcgPSBTRExfVmlkZW9TdXJmYWNlLT53OworCWggPSBTRExfVmlkZW9TdXJmYWNlLT5oOworCWRlbHRheCA9IHhldmVudC0+eG1vdGlvbi54IC0gbW91c2VfbGFzdC54OworCWRlbHRheSA9IHhldmVudC0+eG1vdGlvbi55IC0gbW91c2VfbGFzdC55OworI2lmZGVmIERFQlVHX01PVElPTgorICBwcmludGYoIldhcnBlZCBtb3VzZSBtb3Rpb246ICVkLCVkXG4iLCBkZWx0YXgsIGRlbHRheSk7CisjZW5kaWYKKwltb3VzZV9sYXN0LnggPSB4ZXZlbnQtPnhtb3Rpb24ueDsKKwltb3VzZV9sYXN0LnkgPSB4ZXZlbnQtPnhtb3Rpb24ueTsKKwlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDEsIGRlbHRheCwgZGVsdGF5KTsKKworCWlmICggKHhldmVudC0+eG1vdGlvbi54IDwgTU9VU0VfRlVER0VfRkFDVE9SKSB8fAorCSAgICAgKHhldmVudC0+eG1vdGlvbi54ID4gKHctTU9VU0VfRlVER0VfRkFDVE9SKSkgfHwKKwkgICAgICh4ZXZlbnQtPnhtb3Rpb24ueSA8IE1PVVNFX0ZVREdFX0ZBQ1RPUikgfHwKKwkgICAgICh4ZXZlbnQtPnhtb3Rpb24ueSA+IChoLU1PVVNFX0ZVREdFX0ZBQ1RPUikpICkgeworCQkvKiBHZXQgdGhlIGV2ZW50cyB0aGF0IGhhdmUgYWNjdW11bGF0ZWQgKi8KKwkJd2hpbGUgKCBYQ2hlY2tUeXBlZEV2ZW50KFNETF9EaXNwbGF5LCBNb3Rpb25Ob3RpZnksIHhldmVudCkgKSB7CisJCQlkZWx0YXggPSB4ZXZlbnQtPnhtb3Rpb24ueCAtIG1vdXNlX2xhc3QueDsKKwkJCWRlbHRheSA9IHhldmVudC0+eG1vdGlvbi55IC0gbW91c2VfbGFzdC55OworI2lmZGVmIERFQlVHX01PVElPTgorICBwcmludGYoIkV4dHJhIG1vdXNlIG1vdGlvbjogJWQsJWRcbiIsIGRlbHRheCwgZGVsdGF5KTsKKyNlbmRpZgorCQkJbW91c2VfbGFzdC54ID0geGV2ZW50LT54bW90aW9uLng7CisJCQltb3VzZV9sYXN0LnkgPSB4ZXZlbnQtPnhtb3Rpb24ueTsKKwkJCXBvc3RlZCArPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDEsIGRlbHRheCwgZGVsdGF5KTsKKwkJfQorCQltb3VzZV9sYXN0LnggPSB3LzI7CisJCW1vdXNlX2xhc3QueSA9IGgvMjsKKwkJWFdhcnBQb2ludGVyKFNETF9EaXNwbGF5LCBOb25lLCBTRExfV2luZG93LCAwLCAwLCAwLCAwLAorCQkJCQltb3VzZV9sYXN0LngsIG1vdXNlX2xhc3QueSk7CisJCWZvciAoIGk9MDsgaTwxMDsgKytpICkgeworICAgICAgICAJCVhNYXNrRXZlbnQoU0RMX0Rpc3BsYXksIFBvaW50ZXJNb3Rpb25NYXNrLCB4ZXZlbnQpOworCQkJaWYgKCAoeGV2ZW50LT54bW90aW9uLnggPgorCQkJICAgICAgICAgIChtb3VzZV9sYXN0LngtTU9VU0VfRlVER0VfRkFDVE9SKSkgJiYKKwkJCSAgICAgKHhldmVudC0+eG1vdGlvbi54IDwKKwkJCSAgICAgICAgICAobW91c2VfbGFzdC54K01PVVNFX0ZVREdFX0ZBQ1RPUikpICYmCisJCQkgICAgICh4ZXZlbnQtPnhtb3Rpb24ueSA+CisJCQkgICAgICAgICAgKG1vdXNlX2xhc3QueS1NT1VTRV9GVURHRV9GQUNUT1IpKSAmJgorCQkJICAgICAoeGV2ZW50LT54bW90aW9uLnkgPAorCQkJICAgICAgICAgIChtb3VzZV9sYXN0LnkrTU9VU0VfRlVER0VfRkFDVE9SKSkgKSB7CisJCQkJYnJlYWs7CisJCQl9CisjaWZkZWYgREVCVUdfWEVWRU5UUworICBwcmludGYoIkxvc3QgbW91c2UgbW90aW9uOiAlZCwlZFxuIiwgeGV2ZW50LT54bW90aW9uLngsIHhldmVudC0+eG1vdGlvbi55KTsKKyNlbmRpZgorCQl9CisjaWZkZWYgREVCVUdfWEVWRU5UUworCQlpZiAoIGkgPT0gMTAgKSB7CisJCQlwcmludGYoIldhcm5pbmc6IGRpZG4ndCBkZXRlY3QgbW91c2Ugd2FycCBtb3Rpb25cbiIpOworCQl9CisjZW5kaWYKKwl9CisJcmV0dXJuKHBvc3RlZCk7Cit9CisKK3N0YXRpYyBpbnQgWDExX0Rpc3BhdGNoRXZlbnQoX1RISVMpCit7CisJaW50IHBvc3RlZDsKKwlYRXZlbnQgeGV2ZW50OworCisJU0RMX21lbXNldCgmeGV2ZW50LCAnXDAnLCBzaXplb2YgKFhFdmVudCkpOyAgLyogdmFsZ3JpbmQgZml4LiAtLXJ5YW4uICovCisJWE5leHRFdmVudChTRExfRGlzcGxheSwgJnhldmVudCk7CisKKwkvKiBEaXNjYXJkIEtleVJlbGVhc2UgYW5kIEtleVByZXNzIGV2ZW50cyBnZW5lcmF0ZWQgYnkgYXV0by1yZXBlYXQuCisJICAgV2UgbmVlZCB0byBkbyBpdCBiZWZvcmUgcGFzc2luZyBldmVudCB0byBYRmlsdGVyRXZlbnQuICBPdGhlcndpc2UsCisJICAgS2V5UmVsZWFzZSBhd2FyZSBJTXMgYXJlIGNvbmZ1c2VkLi4uICAqLworCWlmICggeGV2ZW50LnR5cGUgPT0gS2V5UmVsZWFzZQorCSAgICAgJiYgWDExX0tleVJlcGVhdChTRExfRGlzcGxheSwgJnhldmVudCkgKSB7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworCS8qIElmIHdlIGFyZSB0cmFuc2xhdGluZyB3aXRoIElNLCB3ZSBuZWVkIHRvIHBhc3MgYWxsIGV2ZW50cworCSAgIHRvIFhGaWx0ZXJFdmVudCwgYW5kIGRpc2NhcmQgdGhvc2UgZmlsdGVyZWQgZXZlbnRzIGltbWVkaWF0ZWx5LiAgKi8KKwlpZiAoIFNETF9UcmFuc2xhdGVVTklDT0RFCisJICAgICAmJiBTRExfSU0gIT0gTlVMTAorCSAgICAgJiYgWEZpbHRlckV2ZW50KCZ4ZXZlbnQsIE5vbmUpICkgeworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCXBvc3RlZCA9IDA7CisJc3dpdGNoICh4ZXZlbnQudHlwZSkgeworCisJICAgIC8qIEdhaW5pbmcgbW91c2UgY292ZXJhZ2U/ICovCisJICAgIGNhc2UgRW50ZXJOb3RpZnk6IHsKKyNpZmRlZiBERUJVR19YRVZFTlRTCitwcmludGYoIkVudGVyTm90aWZ5ISAoJWQsJWQpXG4iLCB4ZXZlbnQueGNyb3NzaW5nLngsIHhldmVudC54Y3Jvc3NpbmcueSk7CitpZiAoIHhldmVudC54Y3Jvc3NpbmcubW9kZSA9PSBOb3RpZnlHcmFiICkKK3ByaW50ZigiTW9kZTogTm90aWZ5R3JhYlxuIik7CitpZiAoIHhldmVudC54Y3Jvc3NpbmcubW9kZSA9PSBOb3RpZnlVbmdyYWIgKQorcHJpbnRmKCJNb2RlOiBOb3RpZnlVbmdyYWJcbiIpOworI2VuZGlmCisJCWlmICggdGhpcy0+aW5wdXRfZ3JhYiA9PSBTRExfR1JBQl9PRkYgKSB7CisJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7CisJCX0KKwkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLAorCQkJCXhldmVudC54Y3Jvc3NpbmcueCwKKwkJCQl4ZXZlbnQueGNyb3NzaW5nLnkpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICAgIC8qIExvc2luZyBtb3VzZSBjb3ZlcmFnZT8gKi8KKwkgICAgY2FzZSBMZWF2ZU5vdGlmeTogeworI2lmZGVmIERFQlVHX1hFVkVOVFMKK3ByaW50ZigiTGVhdmVOb3RpZnkhICglZCwlZClcbiIsIHhldmVudC54Y3Jvc3NpbmcueCwgeGV2ZW50Lnhjcm9zc2luZy55KTsKK2lmICggeGV2ZW50Lnhjcm9zc2luZy5tb2RlID09IE5vdGlmeUdyYWIgKQorcHJpbnRmKCJNb2RlOiBOb3RpZnlHcmFiXG4iKTsKK2lmICggeGV2ZW50Lnhjcm9zc2luZy5tb2RlID09IE5vdGlmeVVuZ3JhYiApCitwcmludGYoIk1vZGU6IE5vdGlmeVVuZ3JhYlxuIik7CisjZW5kaWYKKwkJaWYgKCAoeGV2ZW50Lnhjcm9zc2luZy5tb2RlICE9IE5vdGlmeUdyYWIpICYmCisJCSAgICAgKHhldmVudC54Y3Jvc3NpbmcubW9kZSAhPSBOb3RpZnlVbmdyYWIpICYmCisJCSAgICAgKHhldmVudC54Y3Jvc3NpbmcuZGV0YWlsICE9IE5vdGlmeUluZmVyaW9yKSApIHsKKyAgICAgICAgICAgICAgIAkJaWYgKCB0aGlzLT5pbnB1dF9ncmFiID09IFNETF9HUkFCX09GRiApIHsKKwkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLCBTRExfQVBQTU9VU0VGT0NVUyk7CisJCQl9IGVsc2UgeworCQkJCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwKKwkJCQkJCXhldmVudC54Y3Jvc3NpbmcueCwKKwkJCQkJCXhldmVudC54Y3Jvc3NpbmcueSk7CisJCQl9CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCSAgICAvKiBHYWluaW5nIGlucHV0IGZvY3VzPyAqLworCSAgICBjYXNlIEZvY3VzSW46IHsKKyNpZmRlZiBERUJVR19YRVZFTlRTCitwcmludGYoIkZvY3VzSW4hXG4iKTsKKyNlbmRpZgorCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQSU5QVVRGT0NVUyk7CisKKyNpZmRlZiBYX0hBVkVfVVRGOF9TVFJJTkcKKwkJaWYgKCBTRExfSUMgIT0gTlVMTCApIHsKKwkJCVhTZXRJQ0ZvY3VzKFNETF9JQyk7CisJCX0KKyNlbmRpZgorCQkvKiBRdWV1ZSBlbnRyeSBpbnRvIGZ1bGxzY3JlZW4gbW9kZSAqLworCQlzd2l0Y2hfd2FpdGluZyA9IDB4MDEgfCBTRExfRlVMTFNDUkVFTjsKKwkJc3dpdGNoX3RpbWUgPSBTRExfR2V0VGlja3MoKSArIDE1MDA7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgLyogTG9zaW5nIGlucHV0IGZvY3VzPyAqLworCSAgICBjYXNlIEZvY3VzT3V0OiB7CisjaWZkZWYgREVCVUdfWEVWRU5UUworcHJpbnRmKCJGb2N1c091dCFcbiIpOworI2VuZGlmCisJCXBvc3RlZCA9IFNETF9Qcml2YXRlQXBwQWN0aXZlKDAsIFNETF9BUFBJTlBVVEZPQ1VTKTsKKworI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworCQlpZiAoIFNETF9JQyAhPSBOVUxMICkgeworCQkJWFVuc2V0SUNGb2N1cyhTRExfSUMpOworCQl9CisjZW5kaWYKKwkJLyogUXVldWUgbGVhdmluZyBmdWxsc2NyZWVuIG1vZGUgKi8KKwkJc3dpdGNoX3dhaXRpbmcgPSAweDAxOworCQlzd2l0Y2hfdGltZSA9IFNETF9HZXRUaWNrcygpICsgMjAwOworCSAgICB9CisJICAgIGJyZWFrOworCisjaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCisJICAgIC8qIFNvbWUgSU0gcmVxdWlyZXMgTWFwcGluZ05vdGlmeSB0byBiZSBwYXNzZWQgdG8KKwkgICAgICAgWFJlZnJlc2hLZXlib2FyZE1hcHBpbmcgYnkgdGhlIGFwcC4gICovCisJICAgIGNhc2UgTWFwcGluZ05vdGlmeTogeworCQlYUmVmcmVzaEtleWJvYXJkTWFwcGluZygmeGV2ZW50LnhtYXBwaW5nKTsKKwkgICAgfQorCSAgICBicmVhazsKKyNlbmRpZiAvKiBYX0hBVkVfVVRGOF9TVFJJTkcgKi8KKworCSAgICAvKiBHZW5lcmF0ZWQgdXBvbiBFbnRlcldpbmRvdyBhbmQgRm9jdXNJbiAqLworCSAgICBjYXNlIEtleW1hcE5vdGlmeTogeworI2lmZGVmIERFQlVHX1hFVkVOVFMKK3ByaW50ZigiS2V5bWFwTm90aWZ5IVxuIik7CisjZW5kaWYKKwkJWDExX1NldEtleWJvYXJkU3RhdGUoU0RMX0Rpc3BsYXksICB4ZXZlbnQueGtleW1hcC5rZXlfdmVjdG9yKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgICAvKiBNb3VzZSBtb3Rpb24/ICovCisJICAgIGNhc2UgTW90aW9uTm90aWZ5OiB7CisJCWlmICggU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJCWlmICggbW91c2VfcmVsYXRpdmUgKSB7CisJCQkJaWYgKCB1c2luZ19kZ2EgJiBER0FfTU9VU0UgKSB7CisjaWZkZWYgREVCVUdfTU9USU9OCisgIHByaW50ZigiREdBIG1vdGlvbjogJWQsJWRcbiIsIHhldmVudC54bW90aW9uLnhfcm9vdCwgeGV2ZW50Lnhtb3Rpb24ueV9yb290KTsKKyNlbmRpZgorCQkJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDEsCisJCQkJCQkJeGV2ZW50Lnhtb3Rpb24ueF9yb290LAorCQkJCQkJCXhldmVudC54bW90aW9uLnlfcm9vdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcG9zdGVkID0gWDExX1dhcnBlZE1vdGlvbih0aGlzLCZ4ZXZlbnQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisjaWZkZWYgREVCVUdfTU9USU9OCisgIHByaW50ZigiWDExIG1vdGlvbjogJWQsJWRcbiIsIHhldmVudC54bW90aW9uLngsIHhldmVudC54bW90aW9uLnkpOworI2VuZGlmCisJCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLAorCQkJCQkJeGV2ZW50Lnhtb3Rpb24ueCwKKwkJCQkJCXhldmVudC54bW90aW9uLnkpOworCQkJfQorCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgLyogTW91c2UgYnV0dG9uIHByZXNzPyAqLworCSAgICBjYXNlIEJ1dHRvblByZXNzOiB7CisJCXBvc3RlZCA9IFNETF9Qcml2YXRlTW91c2VCdXR0b24oU0RMX1BSRVNTRUQsIAorCQkJCQl4ZXZlbnQueGJ1dHRvbi5idXR0b24sIDAsIDApOworCSAgICB9CisJICAgIGJyZWFrOworCisJICAgIC8qIE1vdXNlIGJ1dHRvbiByZWxlYXNlPyAqLworCSAgICBjYXNlIEJ1dHRvblJlbGVhc2U6IHsKKwkJcG9zdGVkID0gU0RMX1ByaXZhdGVNb3VzZUJ1dHRvbihTRExfUkVMRUFTRUQsIAorCQkJCQl4ZXZlbnQueGJ1dHRvbi5idXR0b24sIDAsIDApOworCSAgICB9CisJICAgIGJyZWFrOworCisJICAgIC8qIEtleSBwcmVzcz8gKi8KKwkgICAgY2FzZSBLZXlQcmVzczogeworCQlTRExfa2V5c3ltIGtleXN5bTsKKwkJS2V5Q29kZSBrZXljb2RlID0geGV2ZW50LnhrZXkua2V5Y29kZTsKKworI2lmZGVmIERFQlVHX1hFVkVOVFMKK3ByaW50ZigiS2V5UHJlc3MgKFgxMSBrZXljb2RlID0gMHglWClcbiIsIHhldmVudC54a2V5LmtleWNvZGUpOworI2VuZGlmCisJCS8qIElmIHdlJ3JlIG5vdCBkb2luZyB0cmFuc2xhdGlvbiwgd2UncmUgZG9uZSEgKi8KKwkJaWYgKCAhU0RMX1RyYW5zbGF0ZVVOSUNPREUgKSB7CisJCQkvKiBHZXQgdGhlIHRyYW5zbGF0ZWQgU0RMIHZpcnR1YWwga2V5c3ltIGFuZCBwdXQgaXQgb24gdGhlIHF1ZXVlLiovCisJCQlrZXlzeW0uc2NhbmNvZGUgPSBrZXljb2RlOworCQkJa2V5c3ltLnN5bSA9IFgxMV9UcmFuc2xhdGVLZXljb2RlKFNETF9EaXNwbGF5LCBrZXljb2RlKTsKKwkJCWtleXN5bS5tb2QgPSBLTU9EX05PTkU7CisJCQlrZXlzeW0udW5pY29kZSA9IDA7CisJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELCAma2V5c3ltKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTG9vayB1cCB0aGUgdHJhbnNsYXRlZCB2YWx1ZSBmb3IgdGhlIGtleSBldmVudCAqLworI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworCQlpZiAoIFNETF9JQyAhPSBOVUxMICkgeworCQkJU3RhdHVzIHN0YXR1czsKKwkJCUtleVN5bSB4a2V5c3ltOworCQkJaW50IGk7CisJCQkvKiBBIFVURi04IGNoYXJhY3RlciBjYW4gYmUgYXQgbW9zdCA2IGJ5dGVzICovCisJCQkvKiAuLi4gSXQncyB0cnVlLCBidXQgWHV0ZjhMb29rdXBTdHJpbmcgY2FuCisJCQkgICByZXR1cm4gbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXJzLiAgTW9yZW92ZXIsCisJCQkgICB0aGUgc3BlYy4gcHV0IG5vIHVwcGVyIGJvdW5kLCBzbyB3ZSBzaG91bGQKKwkJCSAgIGJlIHJlYWR5IGZvciBsb25nZXIgc3RyaW5ncy4gICovCisJCQljaGFyIGtleWJ1ZlszMl07CisJCQljaGFyICprZXlkYXRhID0ga2V5YnVmOworCQkJaW50IGNvdW50OworCQkJVWludDE2IHV0ZjE2YnVmWzMyXTsKKwkJCVVpbnQxNiAqdXRmMTZkYXRhID0gdXRmMTZidWY7CisJCQlpbnQgdXRmMTZzaXplOworCQkJaW50IHV0ZjE2bGVuZ3RoOworCisJCQljb3VudCA9IFh1dGY4TG9va3VwU3RyaW5nKFNETF9JQywgJnhldmVudC54a2V5LCBrZXlkYXRhLCBzaXplb2Yoa2V5YnVmKSwgJnhrZXlzeW0sICZzdGF0dXMpOworCQkJaWYgKFhCdWZmZXJPdmVyZmxvdyA9PSBzdGF0dXMpIHsKKwkJCSAgLyogVGhlIElNIGhhcyBqdXN0IGdlbmVyYXRlZCBzb21ld2hhdCBsb25nCisJCQkgICAgIHN0cmluZy4gIFdlIG5lZWQgYSBsb25nZXIgYnVmZmVyIGluIHRoaXMKKwkJCSAgICAgY2FzZS4gICovCisJCQkgIGtleWRhdGEgPSBTRExfbWFsbG9jKGNvdW50KTsKKwkJCSAgaWYgKCBrZXlkYXRhID09IE5VTEwgKSB7CisJCQkgICAgU0RMX091dE9mTWVtb3J5KCk7CisJCQkgICAgYnJlYWs7CisJCQkgIH0KKwkJCSAgY291bnQgPSBYdXRmOExvb2t1cFN0cmluZyhTRExfSUMsICZ4ZXZlbnQueGtleSwga2V5ZGF0YSwgY291bnQsICZ4a2V5c3ltLCAmc3RhdHVzKTsKKwkJCX0KKworCQkJc3dpdGNoIChzdGF0dXMpIHsKKworCQkJY2FzZSBYQnVmZmVyT3ZlcmZsb3c6IHsKKwkJCSAgLyogT29wcyEgIFdlIGhhdmUgYWxsb2NhdGVkIHRoZSBieXRlcyBhcworCQkJICAgICByZXF1ZXN0ZWQgYnkgWHV0ZjhMb29rdXBTdHJpbmcsIHNvIHRoZQorCQkJICAgICBsZW5ndGggb2YgdGhlIGJ1ZmZlciBtdXN0IGJlCisJCQkgICAgIHN1ZmZpY2llbnQuICBUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyCisJCQkgICAgIGhhcHBlbiEgKi8KKwkJCSAgU0RMX1NldEVycm9yKCJYdXRmOExvb2t1cFN0cmluZyBpbmRpY2F0ZWQgYSBkb3VibGUgYnVmZmVyIG92ZXJmbG93ISIpOworCQkJICBicmVhazsKKwkJCX0KKworCQkJY2FzZSBYTG9va3VwQ2hhcnM6CisJCQljYXNlIFhMb29rdXBCb3RoOiB7CisJCQkgIGlmICgwID09IGNvdW50KSB7CisJCQkgICAgYnJlYWs7CisJCQkgIH0KKworCQkJICAvKiBXZSBnb3QgYSBjb252ZXJ0ZWQgc3RyaW5nIGZyb20gSU0uICBNYWtlCisJCQkgICAgIHN1cmUgdG8gZGVsaXZlciBhbGwgY2hhcmFjdGVycyB0byB0aGUKKwkJCSAgICAgYXBwbGljYXRpb24gYXMgU0RMIGV2ZW50cy4gIE5vdGUgdGhhdAorCQkJICAgICBhbiBTREwgZXZlbnQgY2FuIG9ubHkgY2Fycnkgb25lIFVURi0xNgorCQkJICAgICBlbmNvZGluZyB1bml0LCBhbmQgYSBzdXJyb2dhdGUgcGFpciBpcworCQkJICAgICBkZWxpdmVyZWQgYXMgdHdvIFNETCBldmVudHMuICBJIGd1ZXNzCisJCQkgICAgIHRoaXMgYmVoYXZpb3VyIGlzIHByb2JhYmx5IF9pbXBvcnRlZF8KKwkJCSAgICAgZnJvbSBXaW5kb3dzIG9yIE1hY09TLiAgVG8gZG8gc28sIHdlIG5lZWQKKwkJCSAgICAgdG8gY29udmVydCB0aGUgVVRGLTggZGF0YSBpbnRvIFVURi0xNgorCQkJICAgICBkYXRhIChub3QgVUNTNC9VVEYtMzIhKS4gIFdlIG5lZWQgYW4KKwkJCSAgICAgZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBVVEYtMTYgZW5jb2RpbmcKKwkJCSAgICAgdW5pdHMgaGVyZS4gIFRoZSB3b3JzdCBjYXNlIGlzIHB1cmUgQVNDSUkKKwkJCSAgICAgc3RyaW5nLiAgQXNzdW1lIHNvLiAqLworCQkJICAvKiBJbiAxLjMgU0RMIG1heSBoYXZlIGEgdGV4dCBldmVudCBpbnN0ZWFkLCB0aGF0CisJCQkgICAgIGNhcnJpZXMgdGhlIHdob2xlIFVURi04IHN0cmluZyB3aXRoIGl0LiAqLworCQkJICB1dGYxNnNpemUgPSBjb3VudCAqIHNpemVvZihVaW50MTYpOworCQkJICBpZiAodXRmMTZzaXplID4gc2l6ZW9mKHV0ZjE2YnVmKSkgeworCQkJICAgIHV0ZjE2ZGF0YSA9IChVaW50MTYgKikgU0RMX21hbGxvYyh1dGYxNnNpemUpOworCQkJICAgIGlmICh1dGYxNmRhdGEgPT0gTlVMTCkgeworCQkJICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisJCQkgICAgICBicmVhazsKKwkJCSAgICB9CisJCQkgIH0KKwkJCSAgdXRmMTZsZW5ndGggPSBVdGY4VG9VdGYxNigoVWludDggKilrZXlkYXRhLCBjb3VudCwgdXRmMTZkYXRhLCB1dGYxNnNpemUpOworCQkJICBpZiAodXRmMTZsZW5ndGggPCAwKSB7CisJCQkgICAgLyogVGhlIGtleWRhdGEgY29udGFpbmVkIGFuIGludmFsaWQgYnl0ZQorCQkJICAgICAgIHNlcXVlbmNlLiAgSXQgc2hvdWxkIGJlIGEgYnVnIG9mIHRoZSBJTQorCQkJICAgICAgIG9yIFhsaWIuLi4gKi8KKwkJCSAgICBTRExfU2V0RXJyb3IoIk9vcHMhIFh1dGY4TG9va3VwU3RyaW5nIHJldHVybmVkIGFuIGludmFsaWQgVVRGLTggc2VxdWVuY2UhIik7CisJCQkgICAgYnJlYWs7CisJCQkgIH0KKworCQkJICAvKiBEZWxpdmVyIGFsbCBVVEYtMTYgZW5jb2RpbmcgdW5pdHMuICBBdAorCQkJICAgICB0aGlzIG1vbWVudCwgU0RMIGV2ZW50IHF1ZXVlIGhhcyBhCisJCQkgICAgIGZpeGVkIHNpemUgKDEyOCBldmVudHMpLCBhbmQgYW4gU0RMCisJCQkgICAgIGV2ZW50IGNhbiBob2xkIGp1c3Qgb25lIFVURi0xNiBlbmNvZGluZworCQkJICAgICB1bml0LiAgU28sIGlmIHdlIHJlY2VpdmUgbW9yZSB0aGFuIDEyOAorCQkJICAgICBVVEYtMTYgZW5jb2RpbmcgdW5pdHMgZnJvbSBhIGNvbW1pdCwKKwkJCSAgICAgZXhjZWVkZWQgY2hhcmFjdGVycyB3aWxsIGJlIGxvc3QuICAqLworCQkJICBmb3IgKGkgPSAwOyBpIDwgdXRmMTZsZW5ndGggLSAxOyBpKyspIHsKKwkJCSAgICBrZXlzeW0uc2NhbmNvZGUgPSAwOworCQkJICAgIGtleXN5bS5zeW0gPSBTRExLX1VOS05PV047CisJCQkgICAga2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsKKwkJCSAgICBrZXlzeW0udW5pY29kZSA9IHV0ZjE2ZGF0YVtpXTsKKwkJCSAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELCAma2V5c3ltKTsKKwkJCSAgfQorCQkJICAvKiBUaGUga2V5c3ltIGZvciB0aGUgbGFzdCBjaGFyYWN0ZXIgY2FycmllcyB0aGUKKwkJCSAgICAgc2NhbmNvZGUgYW5kIHN5bWJvbCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBYMTEKKwkJCSAgICAga2V5Y29kZS4gICovCisJCQkgIGlmICh1dGYxNmxlbmd0aCA+IDApIHsJCQkgICAgICAgCisJCQkgICAga2V5c3ltLnNjYW5jb2RlID0ga2V5Y29kZTsKKwkJCSAgICBrZXlzeW0uc3ltID0gKGtleWNvZGUgPyBYMTFfVHJhbnNsYXRlS2V5Y29kZShTRExfRGlzcGxheSwga2V5Y29kZSkgOiAwKTsKKwkJCSAgICBrZXlzeW0ubW9kID0gS01PRF9OT05FOworCQkJICAgIGtleXN5bS51bmljb2RlID0gdXRmMTZkYXRhW3V0ZjE2bGVuZ3RoIC0gMV07CisJCQkgICAgcG9zdGVkID0gU0RMX1ByaXZhdGVLZXlib2FyZChTRExfUFJFU1NFRCwgJmtleXN5bSk7CisJCQkgIH0KKwkJCSAgYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgWExvb2t1cEtleVN5bTogeworCQkJICAvKiBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0aGF0CisJCQkgICAgIGEgemVybyBrZXljb2RlIG1ha2VzIFhMb29rdXBLZXlTeW0KKwkJCSAgICAgc3RhdHVzLiAgV2hhdCBJJ20gc3VyZSBpcyB0aGF0IGEKKwkJCSAgICAgY29tYmluYXRpb24gb2YgYSB6ZXJvIHNjYW4gY29kZSBhbmQgYSBub24KKwkJCSAgICAgemVybyBzeW0gbWFrZXMgU0RMX1ByaXZhdGVLZXlib2FyZAorCQkJICAgICBzdHJhbmdlIHN0YXRlLi4uICBTbywganVzdCBkaXNjYXJkIGl0LgorCQkJICAgICBJZiB0aGlzIGRvZXNuJ3Qgd29yaywgSSdtIHJlY2VpdmluZyBidWcKKwkJCSAgICAgcmVwb3J0cywgYW5kIEkgY2FuIGtub3cgdW5kZXIgd2hhdAorCQkJICAgICBjb25kaXRpb24gdGhpcyBjYXNlIGhhcHBlbnMuICAqLworCQkJICBpZiAoa2V5Y29kZSkgeworCQkJICAgIGtleXN5bS5zY2FuY29kZSA9IGtleWNvZGU7CisJCQkgICAga2V5c3ltLnN5bSA9IFgxMV9UcmFuc2xhdGVLZXljb2RlKFNETF9EaXNwbGF5LCBrZXljb2RlKTsKKwkJCSAgICBrZXlzeW0ubW9kID0gS01PRF9OT05FOworCQkJICAgIGtleXN5bS51bmljb2RlID0gMDsKKwkJCSAgICBwb3N0ZWQgPSBTRExfUHJpdmF0ZUtleWJvYXJkKFNETF9QUkVTU0VELCAma2V5c3ltKTsKKwkJCSAgfQorCQkJICBicmVhazsKKwkJCX0KKworCQkJY2FzZSBYTG9va3VwTm9uZTogeworCQkJICAvKiBJTSBoYXMgZWF0ZW4gdGhlIGV2ZW50LiAgKi8KKwkJCSAgYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkgIC8qIEFuIHVua25vd24gc3RhdHVzIGZyb20gWHV0ZjhMb29rdXBTdHJpbmcuICAqLworCQkJICBTRExfU2V0RXJyb3IoIk9vcHMhIFh1dGY4TG9va3VwU3RyaW5ncmV0dXJuZWQgYW4gdW5rbm93biBzdGF0dXMiKTsKKwkJCX0KKworCQkJLyogUmVsZWFzZSBkeW5hbWljIGJ1ZmZlcnMgaWYgYWxsb2NhdGVkLiAgKi8KKwkJCWlmIChrZXlkYXRhICE9IE5VTEwgJiYga2V5YnVmICE9IGtleWRhdGEpIHsKKwkJCSAgU0RMX2ZyZWUoa2V5ZGF0YSk7CisJCQl9CisJCQlpZiAodXRmMTZkYXRhICE9IE5VTEwgJiYgdXRmMTZidWYgIT0gdXRmMTZkYXRhKSB7CisJCQkgIFNETF9mcmVlKHV0ZjE2ZGF0YSk7CisJCQl9CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXsKKwkJCXN0YXRpYyBYQ29tcG9zZVN0YXR1cyBzdGF0ZTsKKwkJCWNoYXIga2V5YnVmWzMyXTsKKworCQkJa2V5c3ltLnNjYW5jb2RlID0ga2V5Y29kZTsKKwkJCWtleXN5bS5zeW0gPSBYMTFfVHJhbnNsYXRlS2V5Y29kZShTRExfRGlzcGxheSwga2V5Y29kZSk7CisJCQlrZXlzeW0ubW9kID0gS01PRF9OT05FOworCQkJa2V5c3ltLnVuaWNvZGUgPSAwOworCQkJaWYgKCBYTG9va3VwU3RyaW5nKCZ4ZXZlbnQueGtleSwKKwkJCSAgICAgICAgICAgICAgICAgICAga2V5YnVmLCBzaXplb2Yoa2V5YnVmKSwKKwkJCSAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnN0YXRlKSApIHsKKwkJCQkvKgorCQkJCSogRklYTUU6IFhMb29rdXBTdHJpbmcoKSBtYXkgeWllbGQgbW9yZSB0aGFuIG9uZQorCQkJCSogY2hhcmFjdGVyLCBzbyB3ZSBuZWVkIGEgbWVjaGFuaXNtIHRvIGFsbG93IGZvcgorCQkJCSogdGhpcyAocGVyaGFwcyBudWxsIGtleXByZXNzIGV2ZW50cyB3aXRoIGEKKwkJCQkqIHVuaWNvZGUgdmFsdWUpCisJCQkJKi8KKwkJCQlrZXlzeW0udW5pY29kZSA9IChVaW50OClrZXlidWZbMF07CisJCQl9CisKKwkJCXBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1BSRVNTRUQsICZrZXlzeW0pOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgLyogS2V5IHJlbGVhc2U/ICovCisJICAgIGNhc2UgS2V5UmVsZWFzZTogeworCQlTRExfa2V5c3ltIGtleXN5bTsKKwkJS2V5Q29kZSBrZXljb2RlID0geGV2ZW50LnhrZXkua2V5Y29kZTsKKworCQlpZiAoa2V5Y29kZSA9PSAwKSB7CisJCSAgLyogVGhlcmUgc2hvdWxkIGJlIG5vIEtleVJlbGVhc2UgZm9yIGtleWNvZGUgPT0gMCwKKwkJICAgICBzaW5jZSBpdCBpcyBhIG5vdGlmaWNhdGlvbiBmcm9tIElNIGJ1dCBhIHJlYWwKKwkJICAgICBrZXlzdHJva2UuICAqLworCQkgIC8qIFdlIG5lZWQgdG8gZW1pdCBzb21lIGRpYWdub3N0aWMgbWVzc2FnZSBoZXJlLiAgKi8KKwkJICBicmVhazsKKwkJfQorCisjaWZkZWYgREVCVUdfWEVWRU5UUworcHJpbnRmKCJLZXlSZWxlYXNlIChYMTEga2V5Y29kZSA9IDB4JVgpXG4iLCB4ZXZlbnQueGtleS5rZXljb2RlKTsKKyNlbmRpZgorCisJCS8qIEdldCB0aGUgdHJhbnNsYXRlZCBTREwgdmlydHVhbCBrZXlzeW0gKi8KKwkJa2V5c3ltLnNjYW5jb2RlID0ga2V5Y29kZTsKKwkJa2V5c3ltLnN5bSA9IFgxMV9UcmFuc2xhdGVLZXljb2RlKFNETF9EaXNwbGF5LCBrZXljb2RlKTsKKwkJa2V5c3ltLm1vZCA9IEtNT0RfTk9ORTsKKwkJa2V5c3ltLnVuaWNvZGUgPSAwOworCisJCXBvc3RlZCA9IFNETF9Qcml2YXRlS2V5Ym9hcmQoU0RMX1JFTEVBU0VELCAma2V5c3ltKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgICAvKiBIYXZlIHdlIGJlZW4gaWNvbmlmaWVkPyAqLworCSAgICBjYXNlIFVubWFwTm90aWZ5OiB7CisjaWZkZWYgREVCVUdfWEVWRU5UUworcHJpbnRmKCJVbm1hcE5vdGlmeSFcbiIpOworI2VuZGlmCisJCS8qIElmIHdlJ3JlIGFjdGl2ZSwgbWFrZSBvdXJzZWx2ZXMgaW5hY3RpdmUgKi8KKwkJaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBBQ1RJVkUgKSB7CisJCQkvKiBTd2FwIG91dCB0aGUgZ2FtbWEgYmVmb3JlIHdlIGdvIGluYWN0aXZlICovCisJCQlYMTFfU3dhcFZpZE1vZGVHYW1tYSh0aGlzKTsKKworCQkJLyogU2VuZCBhbiBpbnRlcm5hbCBkZWFjdGl2YXRlIGV2ZW50ICovCisJCQlwb3N0ZWQgPSBTRExfUHJpdmF0ZUFwcEFjdGl2ZSgwLAorCQkJCQlTRExfQVBQQUNUSVZFfFNETF9BUFBJTlBVVEZPQ1VTKTsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJICAgIC8qIEhhdmUgd2UgYmVlbiByZXN0b3JlZD8gKi8KKwkgICAgY2FzZSBNYXBOb3RpZnk6IHsKKyNpZmRlZiBERUJVR19YRVZFTlRTCitwcmludGYoIk1hcE5vdGlmeSFcbiIpOworI2VuZGlmCisJCS8qIElmIHdlJ3JlIG5vdCBhY3RpdmUsIG1ha2Ugb3Vyc2VsdmVzIGFjdGl2ZSAqLworCQlpZiAoICEoU0RMX0dldEFwcFN0YXRlKCkgJiBTRExfQVBQQUNUSVZFKSApIHsKKwkJCS8qIFNlbmQgYW4gaW50ZXJuYWwgYWN0aXZhdGUgZXZlbnQgKi8KKwkJCXBvc3RlZCA9IFNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBBQ1RJVkUpOworCisJCQkvKiBOb3cgdGhhdCB3ZSdyZSBhY3RpdmUsIHN3YXAgdGhlIGdhbW1hIGJhY2sgKi8KKwkJCVgxMV9Td2FwVmlkTW9kZUdhbW1hKHRoaXMpOworCQl9CisKKwkJaWYgKCBTRExfVmlkZW9TdXJmYWNlICYmCisJCSAgICAgKFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkgeworCQkJWDExX0VudGVyRnVsbFNjcmVlbih0aGlzKTsKKwkJfSBlbHNlIHsKKwkJCVgxMV9HcmFiSW5wdXROb0xvY2sodGhpcywgdGhpcy0+aW5wdXRfZ3JhYik7CisJCX0KKwkJWDExX0NoZWNrTW91c2VNb2RlTm9Mb2NrKHRoaXMpOworCisJCWlmICggU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJCVgxMV9SZWZyZXNoRGlzcGxheSh0aGlzKTsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJICAgIC8qIEhhdmUgd2UgYmVlbiByZXNpemVkIG9yIG1vdmVkPyAqLworCSAgICBjYXNlIENvbmZpZ3VyZU5vdGlmeTogeworI2lmZGVmIERFQlVHX1hFVkVOVFMKK3ByaW50ZigiQ29uZmlndXJlTm90aWZ5ISAocmVzaXplOiAlZHglZClcbiIsIHhldmVudC54Y29uZmlndXJlLndpZHRoLCB4ZXZlbnQueGNvbmZpZ3VyZS5oZWlnaHQpOworI2VuZGlmCisJCWlmICgoWDExX1BlbmRpbmdDb25maWd1cmVOb3RpZnlXaWR0aCAhPSAtMSkgJiYKKwkJICAgIChYMTFfUGVuZGluZ0NvbmZpZ3VyZU5vdGlmeUhlaWdodCAhPSAtMSkpIHsKKwkJICAgIGlmICgoeGV2ZW50Lnhjb25maWd1cmUud2lkdGggIT0gWDExX1BlbmRpbmdDb25maWd1cmVOb3RpZnlXaWR0aCkgJiYKKwkJCSh4ZXZlbnQueGNvbmZpZ3VyZS5oZWlnaHQgIT0gWDExX1BlbmRpbmdDb25maWd1cmVOb3RpZnlIZWlnaHQpKSB7CisJCQkgICAgLyogRXZlbnQgaXMgZnJvbSBiZWZvcmUgdGhlIHJlc2l6ZSwgc28gaWdub3JlLiAqLworCQkJICAgIGJyZWFrOworCQkgICAgfQorCQkgICAgWDExX1BlbmRpbmdDb25maWd1cmVOb3RpZnlXaWR0aCA9IC0xOworCQkgICAgWDExX1BlbmRpbmdDb25maWd1cmVOb3RpZnlIZWlnaHQgPSAtMTsKKwkJfQorCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UgKSB7CisJCSAgICBpZiAoKHhldmVudC54Y29uZmlndXJlLndpZHRoICE9IFNETF9WaWRlb1N1cmZhY2UtPncpIHx8CisJCSAgICAgICAgKHhldmVudC54Y29uZmlndXJlLmhlaWdodCAhPSBTRExfVmlkZW9TdXJmYWNlLT5oKSkgeworCQkJLyogRklYTUU6IEZpbmQgYSBiZXR0ZXIgZml4IGZvciB0aGUgYnVnIHdpdGggS0RFIDEuMiAqLworCQkJaWYgKCAhICgoeGV2ZW50Lnhjb25maWd1cmUud2lkdGggPT0gMzIpICYmCisJCQkgICAgICAgICh4ZXZlbnQueGNvbmZpZ3VyZS5oZWlnaHQgPT0gMzIpKSApIHsKKwkJCQlTRExfUHJpdmF0ZVJlc2l6ZSh4ZXZlbnQueGNvbmZpZ3VyZS53aWR0aCwKKwkJCQkgICAgICAgICAgICAgICAgICB4ZXZlbnQueGNvbmZpZ3VyZS5oZWlnaHQpOworCQkJfQorCQkgICAgfSBlbHNlIHsKKwkJCS8qIE9wZW5HTCB3aW5kb3dzIG5lZWQgdG8ga25vdyBhYm91dCB0aGUgY2hhbmdlICovCisJCQlpZiAoIFNETF9WaWRlb1N1cmZhY2UtPmZsYWdzICYgU0RMX09QRU5HTCApIHsKKwkJCQlTRExfUHJpdmF0ZUV4cG9zZSgpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgLyogSGF2ZSB3ZSBiZWVuIHJlcXVlc3RlZCB0byBxdWl0IChvciBhbm90aGVyIGNsaWVudCBtZXNzYWdlPykgKi8KKwkgICAgY2FzZSBDbGllbnRNZXNzYWdlOiB7CisJCWlmICggKHhldmVudC54Y2xpZW50LmZvcm1hdCA9PSAzMikgJiYKKwkJICAgICAoeGV2ZW50LnhjbGllbnQuZGF0YS5sWzBdID09IFdNX0RFTEVURV9XSU5ET1cpICkKKwkJeworCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVRdWl0KCk7CisJCX0gZWxzZQorCQlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW1NETF9TWVNXTUVWRU5UXSA9PSBTRExfRU5BQkxFICkgeworCQkJU0RMX1N5c1dNbXNnIHdtbXNnOworCisJCQlTRExfVkVSU0lPTigmd21tc2cudmVyc2lvbik7CisJCQl3bW1zZy5zdWJzeXN0ZW0gPSBTRExfU1lTV01fWDExOworCQkJd21tc2cuZXZlbnQueGV2ZW50ID0geGV2ZW50OworCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVTeXNXTUV2ZW50KCZ3bW1zZyk7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCSAgICAvKiBEbyB3ZSBuZWVkIHRvIHJlZnJlc2ggb3Vyc2VsdmVzPyAqLworCSAgICBjYXNlIEV4cG9zZTogeworI2lmZGVmIERFQlVHX1hFVkVOVFMKK3ByaW50ZigiRXhwb3NlIChjb3VudCA9ICVkKVxuIiwgeGV2ZW50LnhleHBvc2UuY291bnQpOworI2VuZGlmCisJCWlmICggU0RMX1ZpZGVvU3VyZmFjZSAmJiAoeGV2ZW50LnhleHBvc2UuY291bnQgPT0gMCkgKSB7CisJCQlYMTFfUmVmcmVzaERpc3BsYXkodGhpcyk7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCSAgICBkZWZhdWx0OiB7CisjaWZkZWYgREVCVUdfWEVWRU5UUworcHJpbnRmKCJVbmhhbmRsZWQgZXZlbnQgJWRcbiIsIHhldmVudC50eXBlKTsKKyNlbmRpZgorCQkvKiBPbmx5IHBvc3QgdGhlIGV2ZW50IGlmIHdlJ3JlIHdhdGNoaW5nIGZvciBpdCAqLworCQlpZiAoIFNETF9Qcm9jZXNzRXZlbnRzW1NETF9TWVNXTUVWRU5UXSA9PSBTRExfRU5BQkxFICkgeworCQkJU0RMX1N5c1dNbXNnIHdtbXNnOworCisJCQlTRExfVkVSU0lPTigmd21tc2cudmVyc2lvbik7CisJCQl3bW1zZy5zdWJzeXN0ZW0gPSBTRExfU1lTV01fWDExOworCQkJd21tc2cuZXZlbnQueGV2ZW50ID0geGV2ZW50OworCQkJcG9zdGVkID0gU0RMX1ByaXZhdGVTeXNXTUV2ZW50KCZ3bW1zZyk7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwl9CisJcmV0dXJuKHBvc3RlZCk7Cit9CisKKy8qIEFjayEgIFhQZW5kaW5nKCkgYWN0dWFsbHkgcGVyZm9ybXMgYSBibG9ja2luZyByZWFkIGlmIG5vIGV2ZW50cyBhdmFpbGFibGUgKi8KK2ludCBYMTFfUGVuZGluZyhEaXNwbGF5ICpkaXNwbGF5KQoreworCS8qIEZsdXNoIHRoZSBkaXNwbGF5IGNvbm5lY3Rpb24gYW5kIGxvb2sgdG8gc2VlIGlmIGV2ZW50cyBhcmUgcXVldWVkICovCisJWEZsdXNoKGRpc3BsYXkpOworCWlmICggWEV2ZW50c1F1ZXVlZChkaXNwbGF5LCBRdWV1ZWRBbHJlYWR5KSApIHsKKwkJcmV0dXJuKDEpOworCX0KKworCS8qIE1vcmUgZHJhc3RpYyBtZWFzdXJlcyBhcmUgcmVxdWlyZWQgLS0gc2VlIGlmIFggaXMgcmVhZHkgdG8gdGFsayAqLworCXsKKwkJc3RhdGljIHN0cnVjdCB0aW1ldmFsIHplcm9fdGltZTsJLyogc3RhdGljID09IDAgKi8KKwkJaW50IHgxMV9mZDsKKwkJZmRfc2V0IGZkc2V0OworCisJCXgxMV9mZCA9IENvbm5lY3Rpb25OdW1iZXIoZGlzcGxheSk7CisJCUZEX1pFUk8oJmZkc2V0KTsKKwkJRkRfU0VUKHgxMV9mZCwgJmZkc2V0KTsKKwkJaWYgKCBzZWxlY3QoeDExX2ZkKzEsICZmZHNldCwgTlVMTCwgTlVMTCwgJnplcm9fdGltZSkgPT0gMSApIHsKKwkJCXJldHVybihYUGVuZGluZyhkaXNwbGF5KSk7CisJCX0KKwl9CisKKwkvKiBPaCB3ZWxsLCBub3RoaW5nIGlzIHJlYWR5IC4uICovCisJcmV0dXJuKDApOworfQorCit2b2lkIFgxMV9QdW1wRXZlbnRzKF9USElTKQoreworCWludCBwZW5kaW5nOworCisJLyogVXBkYXRlIGFjdGl2aXR5IGV2ZXJ5IGZpdmUgc2Vjb25kcyB0byBwcmV2ZW50IHNjcmVlbnNhdmVyLiAtLXJ5YW4uICovCisJaWYgKCFhbGxvd19zY3JlZW5zYXZlcikgeworCQlzdGF0aWMgVWludDMyIHNjcmVlbnNhdmVyVGlja3M7CisJCVVpbnQzMiBub3dUaWNrcyA9IFNETF9HZXRUaWNrcygpOworCQlpZiAoKG5vd1RpY2tzIC0gc2NyZWVuc2F2ZXJUaWNrcykgPiA1MDAwKSB7CisJCQlYUmVzZXRTY3JlZW5TYXZlcihTRExfRGlzcGxheSk7CisJCQlzY3JlZW5zYXZlclRpY2tzID0gbm93VGlja3M7CisJCX0KKwl9CisKKwkvKiBLZWVwIHByb2Nlc3NpbmcgcGVuZGluZyBldmVudHMgKi8KKwlwZW5kaW5nID0gMDsKKwl3aGlsZSAoIFgxMV9QZW5kaW5nKFNETF9EaXNwbGF5KSApIHsKKwkJWDExX0Rpc3BhdGNoRXZlbnQodGhpcyk7CisJCSsrcGVuZGluZzsKKwl9CisJaWYgKCBzd2l0Y2hfd2FpdGluZyApIHsKKwkJVWludDMyIG5vdzsKKworCQlub3cgID0gU0RMX0dldFRpY2tzKCk7CisJCWlmICggcGVuZGluZyB8fCAhU0RMX1ZpZGVvU3VyZmFjZSApIHsKKwkJCS8qIFRyeSBhZ2FpbiBsYXRlci4uLiAqLworCQkJaWYgKCBzd2l0Y2hfd2FpdGluZyAmIFNETF9GVUxMU0NSRUVOICkgeworCQkJCXN3aXRjaF90aW1lID0gbm93ICsgMTUwMDsKKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoX3RpbWUgPSBub3cgKyAyMDA7CisJCQl9CisJCX0gZWxzZSBpZiAoIChpbnQpKHN3aXRjaF90aW1lLW5vdykgPD0gMCApIHsKKwkJCVVpbnQzMiBnb19mdWxsc2NyZWVuOworCisJCQlnb19mdWxsc2NyZWVuID0gc3dpdGNoX3dhaXRpbmcgJiBTRExfRlVMTFNDUkVFTjsKKwkJCXN3aXRjaF93YWl0aW5nID0gMDsKKwkJCWlmICggU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKKwkJCQlpZiAoIGdvX2Z1bGxzY3JlZW4gKSB7CisJCQkJCVgxMV9FbnRlckZ1bGxTY3JlZW4odGhpcyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJWDExX0xlYXZlRnVsbFNjcmVlbih0aGlzKTsKKwkJCQl9CisJCQl9CisJCQkvKiBIYW5kbGUgZm9jdXMgaW4vb3V0IHdoZW4gZ3JhYmJlZCAqLworCQkJaWYgKCBnb19mdWxsc2NyZWVuICkgeworCQkJCVgxMV9HcmFiSW5wdXROb0xvY2sodGhpcywgdGhpcy0+aW5wdXRfZ3JhYik7CisJCQl9IGVsc2UgeworCQkJCVgxMV9HcmFiSW5wdXROb0xvY2sodGhpcywgU0RMX0dSQUJfT0ZGKTsKKwkJCX0KKwkJCVgxMV9DaGVja01vdXNlTW9kZU5vTG9jayh0aGlzKTsKKwkJfQorCX0KK30KKwordm9pZCBYMTFfSW5pdEtleW1hcCh2b2lkKQoreworCWludCBpOworCisJLyogT2RkIGtleXMgdXNlZCBpbiBpbnRlcm5hdGlvbmFsIGtleWJvYXJkcyAqLworCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKE9ERF9rZXltYXApOyArK2kgKQorCQlPRERfa2V5bWFwW2ldID0gU0RMS19VTktOT1dOOworCisgCS8qIFNvbWUgb2YgdGhlc2UgbWlnaHQgYmUgbWFwcGFibGUgdG8gYW4gZXhpc3RpbmcgU0RMS18gY29kZSAqLworIAlPRERfa2V5bWFwW1hLX2RlYWRfZ3JhdmUmMHhGRl0gPSBTRExLX0NPTVBPU0U7CisgCU9ERF9rZXltYXBbWEtfZGVhZF9hY3V0ZSYweEZGXSA9IFNETEtfQ09NUE9TRTsKKyAJT0REX2tleW1hcFtYS19kZWFkX3RpbGRlJjB4RkZdID0gU0RMS19DT01QT1NFOworIAlPRERfa2V5bWFwW1hLX2RlYWRfbWFjcm9uJjB4RkZdID0gU0RMS19DT01QT1NFOworIAlPRERfa2V5bWFwW1hLX2RlYWRfYnJldmUmMHhGRl0gPSBTRExLX0NPTVBPU0U7CisgCU9ERF9rZXltYXBbWEtfZGVhZF9hYm92ZWRvdCYweEZGXSA9IFNETEtfQ09NUE9TRTsKKyAJT0REX2tleW1hcFtYS19kZWFkX2RpYWVyZXNpcyYweEZGXSA9IFNETEtfQ09NUE9TRTsKKyAJT0REX2tleW1hcFtYS19kZWFkX2Fib3ZlcmluZyYweEZGXSA9IFNETEtfQ09NUE9TRTsKKyAJT0REX2tleW1hcFtYS19kZWFkX2RvdWJsZWFjdXRlJjB4RkZdID0gU0RMS19DT01QT1NFOworIAlPRERfa2V5bWFwW1hLX2RlYWRfY2Fyb24mMHhGRl0gPSBTRExLX0NPTVBPU0U7CisgCU9ERF9rZXltYXBbWEtfZGVhZF9jZWRpbGxhJjB4RkZdID0gU0RMS19DT01QT1NFOworIAlPRERfa2V5bWFwW1hLX2RlYWRfb2dvbmVrJjB4RkZdID0gU0RMS19DT01QT1NFOworIAlPRERfa2V5bWFwW1hLX2RlYWRfaW90YSYweEZGXSA9IFNETEtfQ09NUE9TRTsKKyAJT0REX2tleW1hcFtYS19kZWFkX3ZvaWNlZF9zb3VuZCYweEZGXSA9IFNETEtfQ09NUE9TRTsKKyAJT0REX2tleW1hcFtYS19kZWFkX3NlbWl2b2ljZWRfc291bmQmMHhGRl0gPSBTRExLX0NPTVBPU0U7CisgCU9ERF9rZXltYXBbWEtfZGVhZF9iZWxvd2RvdCYweEZGXSA9IFNETEtfQ09NUE9TRTsKKyNpZmRlZiBYS19kZWFkX2hvb2sKKyAJT0REX2tleW1hcFtYS19kZWFkX2hvb2smMHhGRl0gPSBTRExLX0NPTVBPU0U7CisjZW5kaWYKKyNpZmRlZiBYS19kZWFkX2hvcm4KKyAJT0REX2tleW1hcFtYS19kZWFkX2hvcm4mMHhGRl0gPSBTRExLX0NPTVBPU0U7CisjZW5kaWYKKworI2lmZGVmIFhLX2RlYWRfY2lyY3VtZmxleAorCS8qIFRoZXNlIFgga2V5c3ltcyBoYXZlIDB4RkUgYXMgdGhlIGhpZ2ggYnl0ZSAqLworCU9ERF9rZXltYXBbWEtfZGVhZF9jaXJjdW1mbGV4JjB4RkZdID0gU0RMS19DQVJFVDsKKyNlbmRpZgorI2lmZGVmIFhLX0lTT19MZXZlbDNfU2hpZnQKKwlPRERfa2V5bWFwW1hLX0lTT19MZXZlbDNfU2hpZnQmMHhGRl0gPSBTRExLX01PREU7IC8qICJBbHQgR3IiIGtleSAqLworI2VuZGlmCisKKwkvKiBNYXAgdGhlIG1pc2NlbGxhbmVvdXMga2V5cyAqLworCWZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKE1JU0Nfa2V5bWFwKTsgKytpICkKKwkJTUlTQ19rZXltYXBbaV0gPSBTRExLX1VOS05PV047CisKKwkvKiBUaGVzZSBYIGtleXN5bXMgaGF2ZSAweEZGIGFzIHRoZSBoaWdoIGJ5dGUgKi8KKwlNSVNDX2tleW1hcFtYS19CYWNrU3BhY2UmMHhGRl0gPSBTRExLX0JBQ0tTUEFDRTsKKwlNSVNDX2tleW1hcFtYS19UYWImMHhGRl0gPSBTRExLX1RBQjsKKwlNSVNDX2tleW1hcFtYS19DbGVhciYweEZGXSA9IFNETEtfQ0xFQVI7CisJTUlTQ19rZXltYXBbWEtfUmV0dXJuJjB4RkZdID0gU0RMS19SRVRVUk47CisJTUlTQ19rZXltYXBbWEtfUGF1c2UmMHhGRl0gPSBTRExLX1BBVVNFOworCU1JU0Nfa2V5bWFwW1hLX0VzY2FwZSYweEZGXSA9IFNETEtfRVNDQVBFOworCU1JU0Nfa2V5bWFwW1hLX0RlbGV0ZSYweEZGXSA9IFNETEtfREVMRVRFOworCisJTUlTQ19rZXltYXBbWEtfS1BfMCYweEZGXSA9IFNETEtfS1AwOwkJLyogS2V5cGFkIDAtOSAqLworCU1JU0Nfa2V5bWFwW1hLX0tQXzEmMHhGRl0gPSBTRExLX0tQMTsKKwlNSVNDX2tleW1hcFtYS19LUF8yJjB4RkZdID0gU0RMS19LUDI7CisJTUlTQ19rZXltYXBbWEtfS1BfMyYweEZGXSA9IFNETEtfS1AzOworCU1JU0Nfa2V5bWFwW1hLX0tQXzQmMHhGRl0gPSBTRExLX0tQNDsKKwlNSVNDX2tleW1hcFtYS19LUF81JjB4RkZdID0gU0RMS19LUDU7CisJTUlTQ19rZXltYXBbWEtfS1BfNiYweEZGXSA9IFNETEtfS1A2OworCU1JU0Nfa2V5bWFwW1hLX0tQXzcmMHhGRl0gPSBTRExLX0tQNzsKKwlNSVNDX2tleW1hcFtYS19LUF84JjB4RkZdID0gU0RMS19LUDg7CisJTUlTQ19rZXltYXBbWEtfS1BfOSYweEZGXSA9IFNETEtfS1A5OworCU1JU0Nfa2V5bWFwW1hLX0tQX0luc2VydCYweEZGXSA9IFNETEtfS1AwOworCU1JU0Nfa2V5bWFwW1hLX0tQX0VuZCYweEZGXSA9IFNETEtfS1AxOwkKKwlNSVNDX2tleW1hcFtYS19LUF9Eb3duJjB4RkZdID0gU0RMS19LUDI7CisJTUlTQ19rZXltYXBbWEtfS1BfUGFnZV9Eb3duJjB4RkZdID0gU0RMS19LUDM7CisJTUlTQ19rZXltYXBbWEtfS1BfTGVmdCYweEZGXSA9IFNETEtfS1A0OworCU1JU0Nfa2V5bWFwW1hLX0tQX0JlZ2luJjB4RkZdID0gU0RMS19LUDU7CisJTUlTQ19rZXltYXBbWEtfS1BfUmlnaHQmMHhGRl0gPSBTRExLX0tQNjsKKwlNSVNDX2tleW1hcFtYS19LUF9Ib21lJjB4RkZdID0gU0RMS19LUDc7CisJTUlTQ19rZXltYXBbWEtfS1BfVXAmMHhGRl0gPSBTRExLX0tQODsKKwlNSVNDX2tleW1hcFtYS19LUF9QYWdlX1VwJjB4RkZdID0gU0RMS19LUDk7CisJTUlTQ19rZXltYXBbWEtfS1BfRGVsZXRlJjB4RkZdID0gU0RMS19LUF9QRVJJT0Q7CisJTUlTQ19rZXltYXBbWEtfS1BfRGVjaW1hbCYweEZGXSA9IFNETEtfS1BfUEVSSU9EOworCU1JU0Nfa2V5bWFwW1hLX0tQX0RpdmlkZSYweEZGXSA9IFNETEtfS1BfRElWSURFOworCU1JU0Nfa2V5bWFwW1hLX0tQX011bHRpcGx5JjB4RkZdID0gU0RMS19LUF9NVUxUSVBMWTsKKwlNSVNDX2tleW1hcFtYS19LUF9TdWJ0cmFjdCYweEZGXSA9IFNETEtfS1BfTUlOVVM7CisJTUlTQ19rZXltYXBbWEtfS1BfQWRkJjB4RkZdID0gU0RMS19LUF9QTFVTOworCU1JU0Nfa2V5bWFwW1hLX0tQX0VudGVyJjB4RkZdID0gU0RMS19LUF9FTlRFUjsKKwlNSVNDX2tleW1hcFtYS19LUF9FcXVhbCYweEZGXSA9IFNETEtfS1BfRVFVQUxTOworCisJTUlTQ19rZXltYXBbWEtfVXAmMHhGRl0gPSBTRExLX1VQOworCU1JU0Nfa2V5bWFwW1hLX0Rvd24mMHhGRl0gPSBTRExLX0RPV047CisJTUlTQ19rZXltYXBbWEtfUmlnaHQmMHhGRl0gPSBTRExLX1JJR0hUOworCU1JU0Nfa2V5bWFwW1hLX0xlZnQmMHhGRl0gPSBTRExLX0xFRlQ7CisJTUlTQ19rZXltYXBbWEtfSW5zZXJ0JjB4RkZdID0gU0RMS19JTlNFUlQ7CisJTUlTQ19rZXltYXBbWEtfSG9tZSYweEZGXSA9IFNETEtfSE9NRTsKKwlNSVNDX2tleW1hcFtYS19FbmQmMHhGRl0gPSBTRExLX0VORDsKKwlNSVNDX2tleW1hcFtYS19QYWdlX1VwJjB4RkZdID0gU0RMS19QQUdFVVA7CisJTUlTQ19rZXltYXBbWEtfUGFnZV9Eb3duJjB4RkZdID0gU0RMS19QQUdFRE9XTjsKKworCU1JU0Nfa2V5bWFwW1hLX0YxJjB4RkZdID0gU0RMS19GMTsKKwlNSVNDX2tleW1hcFtYS19GMiYweEZGXSA9IFNETEtfRjI7CisJTUlTQ19rZXltYXBbWEtfRjMmMHhGRl0gPSBTRExLX0YzOworCU1JU0Nfa2V5bWFwW1hLX0Y0JjB4RkZdID0gU0RMS19GNDsKKwlNSVNDX2tleW1hcFtYS19GNSYweEZGXSA9IFNETEtfRjU7CisJTUlTQ19rZXltYXBbWEtfRjYmMHhGRl0gPSBTRExLX0Y2OworCU1JU0Nfa2V5bWFwW1hLX0Y3JjB4RkZdID0gU0RMS19GNzsKKwlNSVNDX2tleW1hcFtYS19GOCYweEZGXSA9IFNETEtfRjg7CisJTUlTQ19rZXltYXBbWEtfRjkmMHhGRl0gPSBTRExLX0Y5OworCU1JU0Nfa2V5bWFwW1hLX0YxMCYweEZGXSA9IFNETEtfRjEwOworCU1JU0Nfa2V5bWFwW1hLX0YxMSYweEZGXSA9IFNETEtfRjExOworCU1JU0Nfa2V5bWFwW1hLX0YxMiYweEZGXSA9IFNETEtfRjEyOworCU1JU0Nfa2V5bWFwW1hLX0YxMyYweEZGXSA9IFNETEtfRjEzOworCU1JU0Nfa2V5bWFwW1hLX0YxNCYweEZGXSA9IFNETEtfRjE0OworCU1JU0Nfa2V5bWFwW1hLX0YxNSYweEZGXSA9IFNETEtfRjE1OworCisJTUlTQ19rZXltYXBbWEtfTnVtX0xvY2smMHhGRl0gPSBTRExLX05VTUxPQ0s7CisJTUlTQ19rZXltYXBbWEtfQ2Fwc19Mb2NrJjB4RkZdID0gU0RMS19DQVBTTE9DSzsKKwlNSVNDX2tleW1hcFtYS19TY3JvbGxfTG9jayYweEZGXSA9IFNETEtfU0NST0xMT0NLOworCU1JU0Nfa2V5bWFwW1hLX1NoaWZ0X1ImMHhGRl0gPSBTRExLX1JTSElGVDsKKwlNSVNDX2tleW1hcFtYS19TaGlmdF9MJjB4RkZdID0gU0RMS19MU0hJRlQ7CisJTUlTQ19rZXltYXBbWEtfQ29udHJvbF9SJjB4RkZdID0gU0RMS19SQ1RSTDsKKwlNSVNDX2tleW1hcFtYS19Db250cm9sX0wmMHhGRl0gPSBTRExLX0xDVFJMOworCU1JU0Nfa2V5bWFwW1hLX0FsdF9SJjB4RkZdID0gU0RMS19SQUxUOworCU1JU0Nfa2V5bWFwW1hLX0FsdF9MJjB4RkZdID0gU0RMS19MQUxUOworCU1JU0Nfa2V5bWFwW1hLX01ldGFfUiYweEZGXSA9IFNETEtfUk1FVEE7CisJTUlTQ19rZXltYXBbWEtfTWV0YV9MJjB4RkZdID0gU0RMS19MTUVUQTsKKwlNSVNDX2tleW1hcFtYS19TdXBlcl9MJjB4RkZdID0gU0RMS19MU1VQRVI7IC8qIExlZnQgIldpbmRvd3MiICovCisJTUlTQ19rZXltYXBbWEtfU3VwZXJfUiYweEZGXSA9IFNETEtfUlNVUEVSOyAvKiBSaWdodCAiV2luZG93cyAqLworCU1JU0Nfa2V5bWFwW1hLX01vZGVfc3dpdGNoJjB4RkZdID0gU0RMS19NT0RFOyAvKiAiQWx0IEdyIiBrZXkgKi8KKwlNSVNDX2tleW1hcFtYS19NdWx0aV9rZXkmMHhGRl0gPSBTRExLX0NPTVBPU0U7IC8qIE11bHRpLWtleSBjb21wb3NlICovCisKKwlNSVNDX2tleW1hcFtYS19IZWxwJjB4RkZdID0gU0RMS19IRUxQOworCU1JU0Nfa2V5bWFwW1hLX1ByaW50JjB4RkZdID0gU0RMS19QUklOVDsKKwlNSVNDX2tleW1hcFtYS19TeXNfUmVxJjB4RkZdID0gU0RMS19TWVNSRVE7CisJTUlTQ19rZXltYXBbWEtfQnJlYWsmMHhGRl0gPSBTRExLX0JSRUFLOworCU1JU0Nfa2V5bWFwW1hLX01lbnUmMHhGRl0gPSBTRExLX01FTlU7CisJTUlTQ19rZXltYXBbWEtfSHlwZXJfUiYweEZGXSA9IFNETEtfTUVOVTsgICAvKiBXaW5kb3dzICJNZW51IiBrZXkgKi8KK30KKworLyogR2V0IHRoZSB0cmFuc2xhdGVkIFNETCB2aXJ0dWFsIGtleXN5bSAqLworU0RMS2V5IFgxMV9UcmFuc2xhdGVLZXljb2RlKERpc3BsYXkgKmRpc3BsYXksIEtleUNvZGUga2MpCit7CisJS2V5U3ltIHhzeW07CisJU0RMS2V5IGtleTsKKworCXhzeW0gPSBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtjLCAwKTsKKyNpZmRlZiBERUJVR19LRVlTCisJZnByaW50ZihzdGRlcnIsICJUcmFuc2xhdGluZyBrZXkgY29kZSAlZCAtPiAweCUuNHhcbiIsIGtjLCB4c3ltKTsKKyNlbmRpZgorCWtleSA9IFNETEtfVU5LTk9XTjsKKwlpZiAoIHhzeW0gKSB7CisJCXN3aXRjaCAoeHN5bT4+OCkgeworCQkgICAgY2FzZSAweDEwMDVGRjoKKyNpZmRlZiBTdW5YS19GMzYKKwkJCWlmICggeHN5bSA9PSBTdW5YS19GMzYgKQorCQkJCWtleSA9IFNETEtfRjExOworI2VuZGlmCisjaWZkZWYgU3VuWEtfRjM3CisJCQlpZiAoIHhzeW0gPT0gU3VuWEtfRjM3ICkKKwkJCQlrZXkgPSBTRExLX0YxMjsKKyNlbmRpZgorCQkJYnJlYWs7CisJCSAgICBjYXNlIDB4MDA6CS8qIExhdGluIDEgKi8KKwkJCWtleSA9IChTRExLZXkpKHhzeW0gJiAweEZGKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAweDAxOgkvKiBMYXRpbiAyICovCisJCSAgICBjYXNlIDB4MDI6CS8qIExhdGluIDMgKi8KKwkJICAgIGNhc2UgMHgwMzoJLyogTGF0aW4gNCAqLworCQkgICAgY2FzZSAweDA0OgkvKiBLYXRha2FuYSAqLworCQkgICAgY2FzZSAweDA1OgkvKiBBcmFiaWMgKi8KKwkJICAgIGNhc2UgMHgwNjoJLyogQ3lyaWxsaWMgKi8KKwkJICAgIGNhc2UgMHgwNzoJLyogR3JlZWsgKi8KKwkJICAgIGNhc2UgMHgwODoJLyogVGVjaG5pY2FsICovCisJCSAgICBjYXNlIDB4MEE6CS8qIFB1Ymxpc2hpbmcgKi8KKwkJICAgIGNhc2UgMHgwQzoJLyogSGVicmV3ICovCisJCSAgICBjYXNlIDB4MEQ6CS8qIFRoYWkgKi8KKwkJCS8qIFRoZXNlIGFyZSB3cm9uZywgYnV0IGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZyAqLworCQkJa2V5ID0gKFNETEtleSkoeHN5bSAmIDB4RkYpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIDB4RkU6CisJCQlrZXkgPSBPRERfa2V5bWFwW3hzeW0mMHhGRl07CisJCQlicmVhazsKKwkJICAgIGNhc2UgMHhGRjoKKwkJCWtleSA9IE1JU0Nfa2V5bWFwW3hzeW0mMHhGRl07CisJCQlicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCQkvKgorCQkJZnByaW50ZihzdGRlcnIsICJYMTE6IFVuaGFuZGxlZCB4c3ltLCBzeW0gPSAweCUwNHhcbiIsCisJCQkJCSh1bnNpZ25lZCBpbnQpeHN5bSk7CisJCQkqLworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBYMTEgZG9lc24ndCBrbm93IGhvdyB0byB0cmFuc2xhdGUgdGhlIGtleSEgKi8KKwkJc3dpdGNoIChrYykgeworCQkgICAgLyogQ2F1dGlvbjoKKwkJICAgICAgIFRoZXNlIGtleWNvZGVzIGFyZSBmcm9tIHRoZSBNaWNyb3NvZnQgS2V5Ym9hcmQKKwkJICAgICAqLworCQkgICAgY2FzZSAxMTU6CisJCQlrZXkgPSBTRExLX0xTVVBFUjsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAxMTY6CisJCQlrZXkgPSBTRExLX1JTVVBFUjsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAxMTc6CisJCQlrZXkgPSBTRExLX01FTlU7CisJCQlicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCQkvKgorCQkJICogbm8gcG9pbnQgaW4gYW4gZXJyb3IgbWVzc2FnZTsgaGFwcGVucyBmb3IKKwkJCSAqIHNldmVyYWwga2V5cyB3aGVuIHdlIGdldCBhIGtleW1hcCBub3RpZnkKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGtleTsKK30KKworLyogWDExIG1vZGlmaWVyIG1hc2tzIGZvciB2YXJpb3VzIGtleXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBtZXRhX2xfbWFzaywgbWV0YV9yX21hc2ssIGFsdF9sX21hc2ssIGFsdF9yX21hc2s7CitzdGF0aWMgdW5zaWduZWQgbnVtX21hc2ssIG1vZGVfc3dpdGNoX21hc2s7CisKK3N0YXRpYyB2b2lkIGdldF9tb2RpZmllcl9tYXNrcyhEaXNwbGF5ICpkaXNwbGF5KQoreworCXN0YXRpYyB1bnNpZ25lZCBnb3RfbWFza3M7CisJaW50IGksIGo7CisJWE1vZGlmaWVyS2V5bWFwICp4bW9kczsKKwl1bnNpZ25lZCBuOworCisJaWYoZ290X21hc2tzKQorCQlyZXR1cm47CisKKwl4bW9kcyA9IFhHZXRNb2RpZmllck1hcHBpbmcoZGlzcGxheSk7CisJbiA9IHhtb2RzLT5tYXhfa2V5cGVybW9kOworCWZvcihpID0gMzsgaSA8IDg7IGkrKykgeworCQlmb3IoaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJCUtleUNvZGUga2MgPSB4bW9kcy0+bW9kaWZpZXJtYXBbaSAqIG4gKyBqXTsKKwkJCUtleVN5bSBrcyA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2MsIDApOworCQkJdW5zaWduZWQgbWFzayA9IDEgPDwgaTsKKwkJCXN3aXRjaChrcykgeworCQkJY2FzZSBYS19OdW1fTG9jazoKKwkJCQludW1fbWFzayA9IG1hc2s7IGJyZWFrOworCQkJY2FzZSBYS19BbHRfTDoKKwkJCQlhbHRfbF9tYXNrID0gbWFzazsgYnJlYWs7CisJCQljYXNlIFhLX0FsdF9SOgorCQkJCWFsdF9yX21hc2sgPSBtYXNrOyBicmVhazsKKwkJCWNhc2UgWEtfTWV0YV9MOgorCQkJCW1ldGFfbF9tYXNrID0gbWFzazsgYnJlYWs7CisJCQljYXNlIFhLX01ldGFfUjoKKwkJCQltZXRhX3JfbWFzayA9IG1hc2s7IGJyZWFrOworCQkJY2FzZSBYS19Nb2RlX3N3aXRjaDoKKwkJCQltb2RlX3N3aXRjaF9tYXNrID0gbWFzazsgYnJlYWs7CisJCQl9CisJCX0KKwl9CisJWEZyZWVNb2RpZmllcm1hcCh4bW9kcyk7CisJZ290X21hc2tzID0gMTsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBzZW1pLW9mZmljaWFsOyBpdCBpcyBub3Qgb2ZmaWNpYWxseSBleHBvcnRlZCBhbmQgc2hvdWxkCisgKiBub3QgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBTREwgQVBJLCBidXQgbWF5IGJlIHVzZWQgYnkgY2xpZW50IGNvZGUKKyAqIHRoYXQgKnJlYWxseSogbmVlZHMgaXQgKGluY2x1ZGluZyBsZWdhY3kgY29kZSkuCisgKiBJdCBpcyBzbG93LCB0aG91Z2gsIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBpZiBwb3NzaWJsZS4KKyAqCisgKiBOb3RlIHRoYXQgaXQgaXNuJ3QgY29tcGxldGVseSBhY2N1cmF0ZSBlaXRoZXI7IGluIHBhcnRpY3VsYXIsIG11bHRpLWtleQorICogc2VxdWVuY2VzIChkZWFkIGFjY2VudHMsIGNvbXBvc2Uga2V5IHNlcXVlbmNlcykgd2lsbCBub3Qgd29yayBzaW5jZSB0aGUKKyAqIHN0YXRlIGhhcyBiZWVuIGlycmV2b2NhYmx5IGxvc3QuCisgKi8KK1VpbnQxNiBYMTFfS2V5VG9Vbmljb2RlKFNETEtleSBrZXlzeW0sIFNETE1vZCBtb2RpZmllcnMpCit7CisJc3RydWN0IFNETF9WaWRlb0RldmljZSAqdGhpcyA9IGN1cnJlbnRfdmlkZW87CisJY2hhciBrZXlidWZbMzJdOworCWludCBpOworCUtleVN5bSB4c3ltID0gMDsKKwlYS2V5RXZlbnQgeGtleTsKKwlVaW50MTYgdW5pY29kZTsKKworCWlmICggIXRoaXMgfHwgIVNETF9EaXNwbGF5ICkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlTRExfbWVtc2V0KCZ4a2V5LCAwLCBzaXplb2YoeGtleSkpOworCXhrZXkuZGlzcGxheSA9IFNETF9EaXNwbGF5OworCisJeHN5bSA9IGtleXN5bTsJCS8qIGxhc3QgcmVzb3J0IGlmIG5vdCBmb3VuZCAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQlpZiAoIE1JU0Nfa2V5bWFwW2ldID09IGtleXN5bSApIHsKKwkJCXhzeW0gPSAweEZGMDAgfCBpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoIE9ERF9rZXltYXBbaV0gPT0ga2V5c3ltICkgeworCQkJeHN5bSA9IDB4RkUwMCB8IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXhrZXkua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoeGtleS5kaXNwbGF5LCB4c3ltKTsKKworCWdldF9tb2RpZmllcl9tYXNrcyhTRExfRGlzcGxheSk7CisJaWYobW9kaWZpZXJzICYgS01PRF9TSElGVCkKKwkJeGtleS5zdGF0ZSB8PSBTaGlmdE1hc2s7CisJaWYobW9kaWZpZXJzICYgS01PRF9DQVBTKQorCQl4a2V5LnN0YXRlIHw9IExvY2tNYXNrOworCWlmKG1vZGlmaWVycyAmIEtNT0RfQ1RSTCkKKwkJeGtleS5zdGF0ZSB8PSBDb250cm9sTWFzazsKKwlpZihtb2RpZmllcnMgJiBLTU9EX01PREUpCisJCXhrZXkuc3RhdGUgfD0gbW9kZV9zd2l0Y2hfbWFzazsKKwlpZihtb2RpZmllcnMgJiBLTU9EX0xBTFQpCisJCXhrZXkuc3RhdGUgfD0gYWx0X2xfbWFzazsKKwlpZihtb2RpZmllcnMgJiBLTU9EX1JBTFQpCisJCXhrZXkuc3RhdGUgfD0gYWx0X3JfbWFzazsKKwlpZihtb2RpZmllcnMgJiBLTU9EX0xNRVRBKQorCQl4a2V5LnN0YXRlIHw9IG1ldGFfbF9tYXNrOworCWlmKG1vZGlmaWVycyAmIEtNT0RfUk1FVEEpCisJCXhrZXkuc3RhdGUgfD0gbWV0YV9yX21hc2s7CisJaWYobW9kaWZpZXJzICYgS01PRF9OVU0pCisJCXhrZXkuc3RhdGUgfD0gbnVtX21hc2s7CisKKwl1bmljb2RlID0gMDsKKwlpZiAoIFhMb29rdXBTdHJpbmcoJnhrZXksIGtleWJ1Ziwgc2l6ZW9mKGtleWJ1ZiksIE5VTEwsIE5VTEwpICkKKwkJdW5pY29kZSA9ICh1bnNpZ25lZCBjaGFyKWtleWJ1ZlswXTsKKwlyZXR1cm4odW5pY29kZSk7Cit9CisKKworLyoKKyAqIENhbGxlZCB3aGVuIGZvY3VzIGlzIHJlZ2FpbmVkLCB0byByZWFkIHRoZSBrZXlib2FyZCBzdGF0ZSBhbmQgZ2VuZXJhdGUKKyAqIHN5bnRoZXRpYyBrZXlwcmVzcy9yZWxlYXNlIGV2ZW50cy4KKyAqIGtleV92ZWMgaXMgYSBiaXQgdmVjdG9yIG9mIGtleWNvZGVzICgyNTYgYml0cykKKyAqLwordm9pZCBYMTFfU2V0S2V5Ym9hcmRTdGF0ZShEaXNwbGF5ICpkaXNwbGF5LCBjb25zdCBjaGFyICprZXlfdmVjKQoreworCWNoYXIga2V5c19yZXR1cm5bMzJdOworCWludCBpOworCVVpbnQ4ICprc3RhdGUgPSBTRExfR2V0S2V5U3RhdGUoTlVMTCk7CisJU0RMTW9kIG1vZHN0YXRlOworCVdpbmRvdyBqdW5rX3dpbmRvdzsKKwlpbnQgeCwgeTsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCS8qIFRoZSBmaXJzdCB0aW1lIHRoZSB3aW5kb3cgaXMgbWFwcGVkLCB3ZSBpbml0aWFsaXplIGtleSBzdGF0ZSAqLworCWlmICggISBrZXlfdmVjICkgeworCQlYUXVlcnlLZXltYXAoZGlzcGxheSwga2V5c19yZXR1cm4pOworCQlrZXlfdmVjID0ga2V5c19yZXR1cm47CisJfQorCisJLyogR2V0IHRoZSBrZXlib2FyZCBtb2RpZmllciBzdGF0ZSAqLworCW1vZHN0YXRlID0gMDsKKwlnZXRfbW9kaWZpZXJfbWFza3MoZGlzcGxheSk7CisJaWYgKCBYUXVlcnlQb2ludGVyKGRpc3BsYXksIERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLAorCQkmanVua193aW5kb3csICZqdW5rX3dpbmRvdywgJngsICZ5LCAmeCwgJnksICZtYXNrKSApIHsKKwkJaWYgKCBtYXNrICYgTG9ja01hc2sgKSB7CisJCQltb2RzdGF0ZSB8PSBLTU9EX0NBUFM7CisJCX0KKwkJaWYgKCBtYXNrICYgbW9kZV9zd2l0Y2hfbWFzayApIHsKKwkJCW1vZHN0YXRlIHw9IEtNT0RfTU9ERTsKKwkJfQorCQlpZiAoIG1hc2sgJiBudW1fbWFzayApIHsKKwkJCW1vZHN0YXRlIHw9IEtNT0RfTlVNOworCQl9CisJfQorCisJLyogWmVybyB0aGUgbmV3IGtleWJvYXJkIHN0YXRlIGFuZCBnZW5lcmF0ZSBpdCAqLworCVNETF9tZW1zZXQoa3N0YXRlLCAwLCBTRExLX0xBU1QpOworCS8qCisJICogQW4gb2J2aW91cyBvcHRpbWlzYXRpb24gaXMgdG8gY2hlY2sgZW50aXJlIGxvbmd3b3JkcyBhdCBhIHRpbWUgaW4KKwkgKiBib3RoIGxvb3BzLCBidXQgd2UgY2FuJ3QgYmUgc3VyZSB0aGUgYXJyYXlzIGFyZSBhbGlnbmVkIHNvIGl0J3Mgbm90CisJICogd29ydGggdGhlIGV4dHJhIGNvbXBsZXhpdHkKKwkgKi8KKwlmb3IgKCBpID0gMDsgaSA8IDMyOyBpKysgKSB7CisJCWludCBqOworCQlpZiAoICFrZXlfdmVjW2ldICkKKwkJCWNvbnRpbnVlOworCQlmb3IgKCBqID0gMDsgaiA8IDg7IGorKyApIHsKKwkJCWlmICgga2V5X3ZlY1tpXSAmICgxIDw8IGopICkgeworCQkJCVNETEtleSBrZXk7CisJCQkJS2V5Q29kZSBrYyA9IChpIDw8IDMgfCBqKTsKKwkJCQlrZXkgPSBYMTFfVHJhbnNsYXRlS2V5Y29kZShkaXNwbGF5LCBrYyk7CisJCQkJaWYgKCBrZXkgPT0gU0RMS19VTktOT1dOICkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJa3N0YXRlW2tleV0gPSBTRExfUFJFU1NFRDsKKwkJCQlzd2l0Y2ggKGtleSkgeworCQkJCSAgICBjYXNlIFNETEtfTFNISUZUOgorCQkJCQltb2RzdGF0ZSB8PSBLTU9EX0xTSElGVDsKKwkJCQkJYnJlYWs7CisJCQkJICAgIGNhc2UgU0RMS19SU0hJRlQ6CisJCQkJCW1vZHN0YXRlIHw9IEtNT0RfUlNISUZUOworCQkJCQlicmVhazsKKwkJCQkgICAgY2FzZSBTRExLX0xDVFJMOgorCQkJCQltb2RzdGF0ZSB8PSBLTU9EX0xDVFJMOworCQkJCQlicmVhazsKKwkJCQkgICAgY2FzZSBTRExLX1JDVFJMOgorCQkJCQltb2RzdGF0ZSB8PSBLTU9EX1JDVFJMOworCQkJCQlicmVhazsKKwkJCQkgICAgY2FzZSBTRExLX0xBTFQ6CisJCQkJCW1vZHN0YXRlIHw9IEtNT0RfTEFMVDsKKwkJCQkJYnJlYWs7CisJCQkJICAgIGNhc2UgU0RMS19SQUxUOgorCQkJCQltb2RzdGF0ZSB8PSBLTU9EX1JBTFQ7CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIFNETEtfTE1FVEE6CisJCQkJCW1vZHN0YXRlIHw9IEtNT0RfTE1FVEE7CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIFNETEtfUk1FVEE6CisJCQkJCW1vZHN0YXRlIHw9IEtNT0RfUk1FVEE7CisJCQkJCWJyZWFrOworCQkJCSAgICBkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBIYWNrIC0gc2V0IHRvZ2dsZSBrZXkgc3RhdGUgKi8KKwlpZiAoIG1vZHN0YXRlICYgS01PRF9DQVBTICkgeworCQlrc3RhdGVbU0RMS19DQVBTTE9DS10gPSBTRExfUFJFU1NFRDsKKwl9IGVsc2UgeworCQlrc3RhdGVbU0RMS19DQVBTTE9DS10gPSBTRExfUkVMRUFTRUQ7CisJfQorCWlmICggbW9kc3RhdGUgJiBLTU9EX05VTSApIHsKKwkJa3N0YXRlW1NETEtfTlVNTE9DS10gPSBTRExfUFJFU1NFRDsKKwl9IGVsc2UgeworCQlrc3RhdGVbU0RMS19OVU1MT0NLXSA9IFNETF9SRUxFQVNFRDsKKwl9CisKKwkvKiBTZXQgdGhlIGZpbmFsIG1vZGlmaWVyIHN0YXRlICovCisJU0RMX1NldE1vZFN0YXRlKG1vZHN0YXRlKTsKK30KKwordm9pZCBYMTFfSW5pdE9TS2V5bWFwKF9USElTKQoreworCVgxMV9Jbml0S2V5bWFwKCk7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFldmVudHNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMWV2ZW50c19jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyNmQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFldmVudHNfYy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgWDExX0luaXRPU0tleW1hcChfVEhJUyk7CitleHRlcm4gdm9pZCBYMTFfUHVtcEV2ZW50cyhfVEhJUyk7CitleHRlcm4gdm9pZCBYMTFfU2V0S2V5Ym9hcmRTdGF0ZShEaXNwbGF5ICpkaXNwbGF5LCBjb25zdCBjaGFyICprZXlfdmVjKTsKKworLyogVmFyaWFibGVzIHRvIGJlIGV4cG9ydGVkICovCitleHRlcm4gaW50IFgxMV9QZW5kaW5nQ29uZmlndXJlTm90aWZ5V2lkdGg7CitleHRlcm4gaW50IFgxMV9QZW5kaW5nQ29uZmlndXJlTm90aWZ5SGVpZ2h0OworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZ2FtbWEuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFnYW1tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWZiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZ2FtbWEuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfZXZlbnRzLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF94MTF2aWRlby5oIgorCisvKiBGcm9tIHRoZSBYIHNlcnZlciBzb3VyY2VzLi4uICovCisjZGVmaW5lIE1BWF9HQU1NQSAxMC4wCisjZGVmaW5lIE1JTl9HQU1NQSAoMS4wL01BWF9HQU1NQSkKKworc3RhdGljIGludCBYMTFfU2V0R2FtbWFOb0xvY2soX1RISVMsIGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpCit7CisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQorICAgIGlmICh1c2VfdmlkbW9kZSA+PSAyMDApIHsKKyAgICAgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVHYW1tYSkgZ2FtbWE7CisgICAgICAgIEJvb2wgc3VjY2VlZGVkOworCisJLyogQ2xhbXAgdGhlIGdhbW1hIHZhbHVlcyAqLworCWlmICggcmVkIDwgTUlOX0dBTU1BICkgeworCQlnYW1tYS5yZWQgPSBNSU5fR0FNTUE7CisJfSBlbHNlCisJaWYgKCByZWQgPiBNQVhfR0FNTUEgKSB7CisJCWdhbW1hLnJlZCA9IE1BWF9HQU1NQTsKKwl9IGVsc2UgeworICAgICAgICAJZ2FtbWEucmVkID0gcmVkOworCX0KKwlpZiAoIGdyZWVuIDwgTUlOX0dBTU1BICkgeworCQlnYW1tYS5ncmVlbiA9IE1JTl9HQU1NQTsKKwl9IGVsc2UKKwlpZiAoIGdyZWVuID4gTUFYX0dBTU1BICkgeworCQlnYW1tYS5ncmVlbiA9IE1BWF9HQU1NQTsKKwl9IGVsc2UgeworICAgICAgICAJZ2FtbWEuZ3JlZW4gPSBncmVlbjsKKwl9CisJaWYgKCBibHVlIDwgTUlOX0dBTU1BICkgeworCQlnYW1tYS5ibHVlID0gTUlOX0dBTU1BOworCX0gZWxzZQorCWlmICggYmx1ZSA+IE1BWF9HQU1NQSApIHsKKwkJZ2FtbWEuYmx1ZSA9IE1BWF9HQU1NQTsKKwl9IGVsc2UgeworICAgICAgICAJZ2FtbWEuYmx1ZSA9IGJsdWU7CisJfQorICAgICAgICBpZiAoIFNETF9HZXRBcHBTdGF0ZSgpICYgU0RMX0FQUEFDVElWRSApIHsKKyAgICAgICAgICAgIHN1Y2NlZWRlZCA9IFNETF9OQU1FKFhGODZWaWRNb2RlU2V0R2FtbWEpKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuLCAmZ2FtbWEpOworICAgICAgICAgICAgWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdhbW1hX3NhdmVkWzBdID0gZ2FtbWEucmVkOworICAgICAgICAgICAgZ2FtbWFfc2F2ZWRbMV0gPSBnYW1tYS5ncmVlbjsKKyAgICAgICAgICAgIGdhbW1hX3NhdmVkWzJdID0gZ2FtbWEuYmx1ZTsKKyAgICAgICAgICAgIHN1Y2NlZWRlZCA9IFRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBzdWNjZWVkZWQgKSB7CisgICAgICAgICAgICArK2dhbW1hX2NoYW5nZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1Y2NlZWRlZCA/IDAgOiAtMTsKKyAgICB9CisjZW5kaWYKKyAgICBTRExfU2V0RXJyb3IoIkdhbW1hIGNvcnJlY3Rpb24gbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiAtMTsKK30KK2ludCBYMTFfU2V0VmlkTW9kZUdhbW1hKF9USElTLCBmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlKQoreworICAgIGludCByZXN1bHQ7CisKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOworICAgIHJlc3VsdCA9IFgxMV9TZXRHYW1tYU5vTG9jayh0aGlzLCByZWQsIGdyZWVuLCBibHVlKTsKKyAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7CisKKyAgICByZXR1cm4ocmVzdWx0KTsKK30KKworc3RhdGljIGludCBYMTFfR2V0R2FtbWFOb0xvY2soX1RISVMsIGZsb2F0ICpyZWQsIGZsb2F0ICpncmVlbiwgZmxvYXQgKmJsdWUpCit7CisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQorICAgIGlmICh1c2VfdmlkbW9kZSA+PSAyMDApIHsKKyAgICAgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVHYW1tYSkgZ2FtbWE7CisgICAgICAgIGlmIChTRExfTkFNRShYRjg2VmlkTW9kZUdldEdhbW1hKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgJmdhbW1hKSkgeworICAgICAgICAgICAgKnJlZCAgID0gZ2FtbWEucmVkOworICAgICAgICAgICAgKmdyZWVuID0gZ2FtbWEuZ3JlZW47CisgICAgICAgICAgICAqYmx1ZSAgPSBnYW1tYS5ibHVlOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAtMTsKK30KK2ludCBYMTFfR2V0VmlkTW9kZUdhbW1hKF9USElTLCBmbG9hdCAqcmVkLCBmbG9hdCAqZ3JlZW4sIGZsb2F0ICpibHVlKQoreworICAgIGludCByZXN1bHQ7CisKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOworICAgIHJlc3VsdCA9IFgxMV9HZXRHYW1tYU5vTG9jayh0aGlzLCByZWQsIGdyZWVuLCBibHVlKTsKKyAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7CisKKyAgICByZXR1cm4ocmVzdWx0KTsKK30KKwordm9pZCBYMTFfU2F2ZVZpZE1vZGVHYW1tYShfVEhJUykKK3sKKyAgICAvKiBUcnkgdG8gc2F2ZSB0aGUgY3VycmVudCBnYW1tYSwgb3RoZXJ3aXNlIGRpc2FibGUgZ2FtbWEgY29udHJvbCAqLworICAgIGlmICggWDExX0dldEdhbW1hTm9Mb2NrKHRoaXMsCisgICAgICAgICAgICAgICZnYW1tYV9zYXZlZFswXSwgJmdhbW1hX3NhdmVkWzFdLCAmZ2FtbWFfc2F2ZWRbMl0pIDwgMCApIHsKKyAgICAgICAgdGhpcy0+U2V0R2FtbWEgPSAwOworICAgICAgICB0aGlzLT5HZXRHYW1tYSA9IDA7CisgICAgfQorICAgIGdhbW1hX2NoYW5nZWQgPSAwOworfQordm9pZCBYMTFfU3dhcFZpZE1vZGVHYW1tYShfVEhJUykKK3sKKyAgICBmbG9hdCBuZXdfZ2FtbWFbM107CisKKyAgICBpZiAoIGdhbW1hX2NoYW5nZWQgKSB7CisgICAgICAgIG5ld19nYW1tYVswXSA9IGdhbW1hX3NhdmVkWzBdOworICAgICAgICBuZXdfZ2FtbWFbMV0gPSBnYW1tYV9zYXZlZFsxXTsKKyAgICAgICAgbmV3X2dhbW1hWzJdID0gZ2FtbWFfc2F2ZWRbMl07CisgICAgICAgIFgxMV9HZXRHYW1tYU5vTG9jayh0aGlzLCAmZ2FtbWFfc2F2ZWRbMF0sICZnYW1tYV9zYXZlZFsxXSwgJmdhbW1hX3NhdmVkWzJdKTsKKyAgICAgICAgWDExX1NldEdhbW1hTm9Mb2NrKHRoaXMsIG5ld19nYW1tYVswXSwgbmV3X2dhbW1hWzFdLCBuZXdfZ2FtbWFbMl0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFnYW1tYV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZ2FtbWFfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjM1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZ2FtbWFfYy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfeDExZ2FtbWFfaAorI2RlZmluZSBfU0RMX3gxMWdhbW1hX2gKKworZXh0ZXJuIGludCBYMTFfU2V0VmlkTW9kZUdhbW1hKF9USElTLCBmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlKTsKK2V4dGVybiBpbnQgWDExX0dldFZpZE1vZGVHYW1tYShfVEhJUywgZmxvYXQgKnJlZCwgZmxvYXQgKmdyZWVuLCBmbG9hdCAqYmx1ZSk7CitleHRlcm4gdm9pZCBYMTFfU2F2ZVZpZE1vZGVHYW1tYShfVEhJUyk7CitleHRlcm4gdm9pZCBYMTFfU3dhcFZpZE1vZGVHYW1tYShfVEhJUyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMWdsLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZ2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTUyOTdiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMWdsLmMKQEAgLTAsMCArMSw1NzcgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF94MTFkZ2FfYy5oIgorI2luY2x1ZGUgIlNETF94MTFnbF9jLmgiCisKKyNpZiBkZWZpbmVkKF9fSVJJWF9fKQorLyogSVJJWCBkb2Vzbid0IGhhdmUgYSBHTCBsaWJyYXJ5IHZlcnNpb25pbmcgc3lzdGVtICovCisjZGVmaW5lIERFRkFVTFRfT1BFTkdMCSJsaWJHTC5zbyIKKyNlbGlmIGRlZmluZWQoX19NQUNPU1hfXykKKyNkZWZpbmUgREVGQVVMVF9PUEVOR0wJIi91c3IvWDExUjYvbGliL2xpYkdMLjEuZHlsaWIiCisjZWxpZiBkZWZpbmVkKF9fUU5YTlRPX18pCisjZGVmaW5lIERFRkFVTFRfT1BFTkdMCSJsaWJHTC5zby4zIgorI2VsaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyNkZWZpbmUgREVGQVVMVF9PUEVOR0wJImxpYkdMLnNvLjQuMCIKKyNlbHNlCisjZGVmaW5lIERFRkFVTFRfT1BFTkdMCSJsaWJHTC5zby4xIgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTFhfQVJCX211bHRpc2FtcGxlCisjZGVmaW5lIEdMWF9TQU1QTEVfQlVGRkVSU19BUkIgICAgICAgICAgICAgMTAwMDAwCisjZGVmaW5lIEdMWF9TQU1QTEVTX0FSQiAgICAgICAgICAgICAgICAgICAgMTAwMDAxCisjZW5kaWYKKworLyogR0xYX0VYVF92aXN1YWxfcmF0aW5nIHN0dWZmIHRoYXQgbWlnaHQgbm90IGJlIGluIHRoZSBzeXN0ZW0gaGVhZGVycy4uLiAqLworI2lmbmRlZiBHTFhfVklTVUFMX0NBVkVBVF9FWFQKKyNkZWZpbmUgR0xYX1ZJU1VBTF9DQVZFQVRfRVhUICAgICAgICAgICAgICAweDIwCisjZW5kaWYKKyNpZm5kZWYgR0xYX05PTkVfRVhUCisjZGVmaW5lIEdMWF9OT05FX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZW5kaWYKKyNpZm5kZWYgR0xYX1NMT1dfVklTVUFMX0VYVAorI2RlZmluZSBHTFhfU0xPV19WSVNVQUxfRVhUICAgICAgICAgICAgICAgIDB4ODAwMQorI2VuZGlmCisjaWZuZGVmIEdMWF9OT05fQ09ORk9STUFOVF9WSVNVQUxfRVhUCisjZGVmaW5lIEdMWF9OT05fQ09ORk9STUFOVF9WSVNVQUxfRVhUICAgICAgMHg4MDBECisjZW5kaWYKKworCisjaWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKK3N0YXRpYyBpbnQgZ2xYRXh0ZW5zaW9uU3VwcG9ydGVkKF9USElTLCBjb25zdCBjaGFyICpleHRlbnNpb24pCit7CisJY29uc3QgY2hhciAqZXh0ZW5zaW9uczsKKwljb25zdCBjaGFyICpzdGFydDsKKwljb25zdCBjaGFyICp3aGVyZSwgKnRlcm1pbmF0b3I7CisKKwkvKiBFeHRlbnNpb24gbmFtZXMgc2hvdWxkIG5vdCBoYXZlIHNwYWNlcy4gKi8KKwl3aGVyZSA9IFNETF9zdHJjaHIoZXh0ZW5zaW9uLCAnICcpOworCWlmICggd2hlcmUgfHwgKmV4dGVuc2lvbiA9PSAnXDAnICkgeworCSAgICAgIHJldHVybiAwOworCX0KKworCWV4dGVuc2lvbnMgPSB0aGlzLT5nbF9kYXRhLT5nbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoR0ZYX0Rpc3BsYXksU0RMX1NjcmVlbik7CisJLyogSXQgdGFrZXMgYSBiaXQgb2YgY2FyZSB0byBiZSBmb29sLXByb29mIGFib3V0IHBhcnNpbmcgdGhlCisJICogT3BlbkdMIGV4dGVuc2lvbnMgc3RyaW5nLiBEb24ndCBiZSBmb29sZWQgYnkgc3ViLXN0cmluZ3MsIGV0Yy4KKwkgKi8KKworCS8qIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvNTM3NDg3ICovCisJaWYgKGV4dGVuc2lvbnMgPT0gTlVMTCkgeworCSAgICAgIHJldHVybiAwOworCX0KKwkKKwlzdGFydCA9IGV4dGVuc2lvbnM7CisJCisJZm9yICg7OykgeworCQl3aGVyZSA9IFNETF9zdHJzdHIoc3RhcnQsIGV4dGVuc2lvbik7CisJCWlmICghd2hlcmUpIGJyZWFrOworCQkKKwkJdGVybWluYXRvciA9IHdoZXJlICsgc3RybGVuKGV4dGVuc2lvbik7CisJCWlmICh3aGVyZSA9PSBzdGFydCB8fCAqKHdoZXJlIC0gMSkgPT0gJyAnKQorCSAgICAgICAgaWYgKCp0ZXJtaW5hdG9yID09ICcgJyB8fCAqdGVybWluYXRvciA9PSAnXDAnKSByZXR1cm4gMTsKKwkJCQkJCSAgCisJCXN0YXJ0ID0gdGVybWluYXRvcjsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTF9HTFggKi8KKworWFZpc3VhbEluZm8gKlgxMV9HTF9HZXRWaXN1YWwoX1RISVMpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKKwkvKiA2NCBzZWVtcyBuaWNlLiAqLworCWludCBhdHRyaWJzWzY0XTsKKwlpbnQgaTsKKworCS8qIGxvYWQgdGhlIGdsIGRyaXZlciBmcm9tIGEgZGVmYXVsdCBwYXRoICovCisJaWYgKCAhIHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkICkgeworCSAgICAgICAgLyogbm8gZHJpdmVyIGhhcyBiZWVuIGxvYWRlZCwgdXNlIGRlZmF1bHQgKG91cnNlbHZlcykgKi8KKwkgICAgICAgIGlmICggWDExX0dMX0xvYWRMaWJyYXJ5KHRoaXMsIE5VTEwpIDwgMCApIHsKKwkJICAgICAgICByZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCS8qIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSB3aW5kb3cgd2hpY2ggd2UgbXVzdCB1c2UgKi8KKwlpZiAoIFNETF93aW5kb3dpZCApIHsKKwkJWFdpbmRvd0F0dHJpYnV0ZXMgYTsKKwkJWFZpc3VhbEluZm8gdmlfaW47CisJCWludCBvdXRfY291bnQ7CisKKwkJWEdldFdpbmRvd0F0dHJpYnV0ZXMoU0RMX0Rpc3BsYXksIFNETF9XaW5kb3csICZhKTsKKwkJdmlfaW4uc2NyZWVuID0gU0RMX1NjcmVlbjsKKwkJdmlfaW4udmlzdWFsaWQgPSBYVmlzdWFsSURGcm9tVmlzdWFsKGEudmlzdWFsKTsKKwkJZ2x4X3Zpc3VhbGluZm8gPSBYR2V0VmlzdWFsSW5mbyhTRExfRGlzcGxheSwKKwkgICAgICAgICAgICAgICAgICAgICBWaXN1YWxTY3JlZW5NYXNrfFZpc3VhbElETWFzaywgJnZpX2luLCAmb3V0X2NvdW50KTsKKwkJcmV0dXJuIGdseF92aXN1YWxpbmZvOworCX0KKworICAgICAgICAvKiBTZXR1cCBvdXIgR0xYIGF0dHJpYnV0ZXMgYWNjb3JkaW5nIHRvIHRoZSBnbF9jb25maWcuICovCisJaSA9IDA7CisJYXR0cmlic1tpKytdID0gR0xYX1JHQkE7CisJYXR0cmlic1tpKytdID0gR0xYX1JFRF9TSVpFOworCWF0dHJpYnNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5yZWRfc2l6ZTsKKwlhdHRyaWJzW2krK10gPSBHTFhfR1JFRU5fU0laRTsKKwlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcuZ3JlZW5fc2l6ZTsKKwlhdHRyaWJzW2krK10gPSBHTFhfQkxVRV9TSVpFOworCWF0dHJpYnNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5ibHVlX3NpemU7CisKKwlpZiggdGhpcy0+Z2xfY29uZmlnLmFscGhhX3NpemUgKSB7CisJCWF0dHJpYnNbaSsrXSA9IEdMWF9BTFBIQV9TSVpFOworCQlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcuYWxwaGFfc2l6ZTsKKwl9CisKKwlpZiggdGhpcy0+Z2xfY29uZmlnLmRvdWJsZV9idWZmZXIgKSB7CisJCWF0dHJpYnNbaSsrXSA9IEdMWF9ET1VCTEVCVUZGRVI7CisJfQorCisJYXR0cmlic1tpKytdID0gR0xYX0RFUFRIX1NJWkU7CisJYXR0cmlic1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmRlcHRoX3NpemU7CisKKwlpZiggdGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZSApIHsKKwkJYXR0cmlic1tpKytdID0gR0xYX1NURU5DSUxfU0laRTsKKwkJYXR0cmlic1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLnN0ZW5jaWxfc2l6ZTsKKwl9CisKKwlpZiggdGhpcy0+Z2xfY29uZmlnLmFjY3VtX3JlZF9zaXplICkgeworCQlhdHRyaWJzW2krK10gPSBHTFhfQUNDVU1fUkVEX1NJWkU7CisJCWF0dHJpYnNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5hY2N1bV9yZWRfc2l6ZTsKKwl9CisKKwlpZiggdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2dyZWVuX3NpemUgKSB7CisJCWF0dHJpYnNbaSsrXSA9IEdMWF9BQ0NVTV9HUkVFTl9TSVpFOworCQlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcuYWNjdW1fZ3JlZW5fc2l6ZTsKKwl9CisKKwlpZiggdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2JsdWVfc2l6ZSApIHsKKwkJYXR0cmlic1tpKytdID0gR0xYX0FDQ1VNX0JMVUVfU0laRTsKKwkJYXR0cmlic1tpKytdID0gdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2JsdWVfc2l6ZTsKKwl9CisKKwlpZiggdGhpcy0+Z2xfY29uZmlnLmFjY3VtX2FscGhhX3NpemUgKSB7CisJCWF0dHJpYnNbaSsrXSA9IEdMWF9BQ0NVTV9BTFBIQV9TSVpFOworCQlhdHRyaWJzW2krK10gPSB0aGlzLT5nbF9jb25maWcuYWNjdW1fYWxwaGFfc2l6ZTsKKwl9CisKKwlpZiggdGhpcy0+Z2xfY29uZmlnLnN0ZXJlbyApIHsKKwkJYXR0cmlic1tpKytdID0gR0xYX1NURVJFTzsKKwl9CisJCisJaWYoIHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZWJ1ZmZlcnMgKSB7CisJCWF0dHJpYnNbaSsrXSA9IEdMWF9TQU1QTEVfQlVGRkVSU19BUkI7CisJCWF0dHJpYnNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZWJ1ZmZlcnM7CisJfQorCQorCWlmKCB0aGlzLT5nbF9jb25maWcubXVsdGlzYW1wbGVzYW1wbGVzICkgeworCQlhdHRyaWJzW2krK10gPSBHTFhfU0FNUExFU19BUkI7CisJCWF0dHJpYnNbaSsrXSA9IHRoaXMtPmdsX2NvbmZpZy5tdWx0aXNhbXBsZXNhbXBsZXM7CisJfQorCisJaWYoIHRoaXMtPmdsX2NvbmZpZy5hY2NlbGVyYXRlZCA+PSAwICYmCisJICAgIGdsWEV4dGVuc2lvblN1cHBvcnRlZCh0aGlzLCAiR0xYX0VYVF92aXN1YWxfcmF0aW5nIikgKSB7CisJCWF0dHJpYnNbaSsrXSA9IEdMWF9WSVNVQUxfQ0FWRUFUX0VYVDsKKwkJYXR0cmlic1tpKytdID0gR0xYX05PTkVfRVhUOworCX0KKworI2lmZGVmIEdMWF9ESVJFQ1RfQ09MT1IgLyogVHJ5IGZvciBhIERpcmVjdENvbG9yIHZpc3VhbCBmb3IgZ2FtbWEgc3VwcG9ydCAqLworCWlmICggIVNETF9nZXRlbnYoIlNETF9WSURFT19YMTFfTk9ESVJFQ1RDT0xPUiIpICkgeworCQlhdHRyaWJzW2krK10gPSBHTFhfWF9WSVNVQUxfVFlQRTsKKwkJYXR0cmlic1tpKytdID0gR0xYX0RJUkVDVF9DT0xPUjsKKwl9CisjZW5kaWYKKwlhdHRyaWJzW2krK10gPSBOb25lOworCisgCWdseF92aXN1YWxpbmZvID0gdGhpcy0+Z2xfZGF0YS0+Z2xYQ2hvb3NlVmlzdWFsKEdGWF9EaXNwbGF5LCAKKwkJCQkJCSAgU0RMX1NjcmVlbiwgYXR0cmlicyk7CisjaWZkZWYgR0xYX0RJUkVDVF9DT0xPUgorCWlmKCAhZ2x4X3Zpc3VhbGluZm8gJiYgIVNETF9nZXRlbnYoIlNETF9WSURFT19YMTFfTk9ESVJFQ1RDT0xPUiIpICkgeyAvKiBObyBEaXJlY3RDb2xvciB2aXN1YWw/ICBUcnkgYWdhaW4uLiAqLworCQlhdHRyaWJzW2ktM10gPSBOb25lOworIAkJZ2x4X3Zpc3VhbGluZm8gPSB0aGlzLT5nbF9kYXRhLT5nbFhDaG9vc2VWaXN1YWwoR0ZYX0Rpc3BsYXksIAorCQkJCQkJICBTRExfU2NyZWVuLCBhdHRyaWJzKTsKKwl9CisjZW5kaWYKKwlpZiggIWdseF92aXN1YWxpbmZvICkgeworCQlTRExfU2V0RXJyb3IoICJDb3VsZG4ndCBmaW5kIG1hdGNoaW5nIEdMWCB2aXN1YWwiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorLyoKKwlwcmludGYoIkZvdW5kIEdMWCB2aXN1YWwgMHgleFxuIiwgZ2x4X3Zpc3VhbGluZm8tPnZpc3VhbGlkKTsKKyovCisJcmV0dXJuIGdseF92aXN1YWxpbmZvOworI2Vsc2UKKwlTRExfU2V0RXJyb3IoIlgxMSBkcml2ZXIgbm90IGNvbmZpZ3VyZWQgd2l0aCBPcGVuR0wiKTsKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitpbnQgWDExX0dMX0NyZWF0ZVdpbmRvdyhfVEhJUywgaW50IHcsIGludCBoKQoreworCWludCByZXR2YWw7CisjaWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKKwlYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyaWJ1dGVzOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1bnNpZ25lZCBsb25nIGJsYWNrOworCisJYmxhY2sgPSAoZ2x4X3Zpc3VhbGluZm8tPnZpc3VhbCA9PSBEZWZhdWx0VmlzdWFsKFNETF9EaXNwbGF5LAorCQkJCQkJIAlTRExfU2NyZWVuKSkKKwkgICAgICAgCT8gQmxhY2tQaXhlbChTRExfRGlzcGxheSwgU0RMX1NjcmVlbikgOiAwOworCWF0dHJpYnV0ZXMuYmFja2dyb3VuZF9waXhlbCA9IGJsYWNrOworCWF0dHJpYnV0ZXMuYm9yZGVyX3BpeGVsID0gYmxhY2s7CisJYXR0cmlidXRlcy5jb2xvcm1hcCA9IFNETF9YQ29sb3JNYXA7CisJbWFzayA9IENXQmFja1BpeGVsIHwgQ1dCb3JkZXJQaXhlbCB8IENXQ29sb3JtYXA7CisKKwlTRExfV2luZG93ID0gWENyZWF0ZVdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3csCisJCQkwLCAwLCB3LCBoLCAwLCBnbHhfdmlzdWFsaW5mby0+ZGVwdGgsCisJCQlJbnB1dE91dHB1dCwgZ2x4X3Zpc3VhbGluZm8tPnZpc3VhbCwKKwkJCW1hc2ssICZhdHRyaWJ1dGVzKTsKKwlpZiAoICFTRExfV2luZG93ICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgd2luZG93Iik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dmFsID0gMDsKKyNlbHNlCisJU0RMX1NldEVycm9yKCJYMTEgZHJpdmVyIG5vdCBjb25maWd1cmVkIHdpdGggT3BlbkdMIik7CisJcmV0dmFsID0gLTE7CisjZW5kaWYKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworaW50IFgxMV9HTF9DcmVhdGVDb250ZXh0KF9USElTKQoreworCWludCByZXR2YWw7CisjaWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKKworCS8qIFdlIGRvIHRoaXMgdG8gY3JlYXRlIGEgY2xlYW4gc2VwYXJhdGlvbiBiZXR3ZWVuIFggYW5kIEdMWCBlcnJvcnMuICovCisJWFN5bmMoIFNETF9EaXNwbGF5LCBGYWxzZSApOworCWdseF9jb250ZXh0ID0gdGhpcy0+Z2xfZGF0YS0+Z2xYQ3JlYXRlQ29udGV4dChHRlhfRGlzcGxheSwgCisJCQkJICAgICBnbHhfdmlzdWFsaW5mbywgTlVMTCwgVHJ1ZSk7CisJWFN5bmMoIEdGWF9EaXNwbGF5LCBGYWxzZSApOworCisJaWYgKCBnbHhfY29udGV4dCA9PSBOVUxMICkgeworCQlTRExfU2V0RXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgR0wgY29udGV4dCIpOworCQlyZXR1cm4oLTEpOworCX0KKwlpZiAoIFgxMV9HTF9NYWtlQ3VycmVudCh0aGlzKSA8IDAgKSB7CisJCXJldHVybigtMSk7CisJfQorCWdsX2FjdGl2ZSA9IDE7CisKKwlpZiAoICFnbFhFeHRlbnNpb25TdXBwb3J0ZWQodGhpcywgIkdMWF9TR0lfc3dhcF9jb250cm9sIikgKSB7CisJCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbFNHSSA9IE5VTEw7CisJfQorCWlmICggIWdsWEV4dGVuc2lvblN1cHBvcnRlZCh0aGlzLCAiR0xYX01FU0Ffc3dhcF9jb250cm9sIikgKSB7CisJCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbE1FU0EgPSBOVUxMOworCX0KKwlpZiAoICFnbFhFeHRlbnNpb25TdXBwb3J0ZWQodGhpcywgIkdMWF9FWFRfc3dhcF9jb250cm9sIikgKSB7CisJCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbEVYVCA9IE5VTEw7CisJfQorCisJaWYgKCB0aGlzLT5nbF9jb25maWcuc3dhcF9jb250cm9sID49IDAgKSB7CisJCWludCByYyA9IC0xOworCQlpZiAoIHRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbEVYVCApIHsKKwkJCXJjID0gdGhpcy0+Z2xfZGF0YS0+Z2xYU3dhcEludGVydmFsRVhUKEdGWF9EaXNwbGF5LCBTRExfV2luZG93LAorCQkJCQl0aGlzLT5nbF9jb25maWcuc3dhcF9jb250cm9sKTsKKwkJfSBlbHNlIGlmICggdGhpcy0+Z2xfZGF0YS0+Z2xYU3dhcEludGVydmFsTUVTQSApIHsKKwkJCXJjID0gdGhpcy0+Z2xfZGF0YS0+Z2xYU3dhcEludGVydmFsTUVTQSh0aGlzLT5nbF9jb25maWcuc3dhcF9jb250cm9sKTsKKwkJfSBlbHNlIGlmICggdGhpcy0+Z2xfZGF0YS0+Z2xYU3dhcEludGVydmFsU0dJICkgeworCQkJcmMgPSB0aGlzLT5nbF9kYXRhLT5nbFhTd2FwSW50ZXJ2YWxTR0kodGhpcy0+Z2xfY29uZmlnLnN3YXBfY29udHJvbCk7CisJCX0KKwkJaWYgKHJjID09IDApIHsKKwkJCXRoaXMtPmdsX2RhdGEtPnN3YXBfaW50ZXJ2YWwgPSB0aGlzLT5nbF9jb25maWcuc3dhcF9jb250cm9sOworCQl9CisJfQorI2Vsc2UKKwlTRExfU2V0RXJyb3IoIlgxMSBkcml2ZXIgbm90IGNvbmZpZ3VyZWQgd2l0aCBPcGVuR0wiKTsKKyNlbmRpZgorCWlmICggZ2xfYWN0aXZlICkgeworCQlyZXR2YWwgPSAwOworCX0gZWxzZSB7CisJCXJldHZhbCA9IC0xOworCX0KKwlyZXR1cm4ocmV0dmFsKTsKK30KKwordm9pZCBYMTFfR0xfU2h1dGRvd24oX1RISVMpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKKwkvKiBDbGVhbiB1cCBPcGVuR0wgKi8KKwlpZiggZ2x4X2NvbnRleHQgKSB7CisJCXRoaXMtPmdsX2RhdGEtPmdsWE1ha2VDdXJyZW50KEdGWF9EaXNwbGF5LCBOb25lLCBOVUxMKTsKKworCQlpZiAoZ2x4X2NvbnRleHQgIT0gTlVMTCkKKwkJCXRoaXMtPmdsX2RhdGEtPmdsWERlc3Ryb3lDb250ZXh0KEdGWF9EaXNwbGF5LCBnbHhfY29udGV4dCk7CisKKwkJZ2x4X2NvbnRleHQgPSBOVUxMOworCX0KKwlnbF9hY3RpdmUgPSAwOworI2VuZGlmIC8qIFNETF9WSURFT19PUEVOR0xfR0xYICovCit9CisKKyNpZiBTRExfVklERU9fT1BFTkdMX0dMWAorCisvKiBNYWtlIHRoZSBjdXJyZW50IGNvbnRleHQgYWN0aXZlICovCitpbnQgWDExX0dMX01ha2VDdXJyZW50KF9USElTKQoreworCWludCByZXR2YWw7CisJCisJcmV0dmFsID0gMDsKKwlpZiAoICEgdGhpcy0+Z2xfZGF0YS0+Z2xYTWFrZUN1cnJlbnQoR0ZYX0Rpc3BsYXksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9XaW5kb3csIGdseF9jb250ZXh0KSApIHsKKwkJU0RMX1NldEVycm9yKCJVbmFibGUgdG8gbWFrZSBHTCBjb250ZXh0IGN1cnJlbnQiKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCVhTeW5jKCBHRlhfRGlzcGxheSwgRmFsc2UgKTsKKworCS8qIE1vcmUgVm9vZG9vIFggc2VydmVyIHdvcmthcm91bmRzLi4uIEdyci4uLiAqLworCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7CisJWDExX0NoZWNrREdBTW91c2UodGhpcyk7CisJU0RMX1VubG9ja19FdmVudFRocmVhZCgpOworCisJcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qIEdldCBhdHRyaWJ1dGUgZGF0YSBmcm9tIGdsWC4gKi8KK2ludCBYMTFfR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSkKK3sKKwlpbnQgcmV0dmFsID0gLTE7CisJaW50IHVuc3VwcG9ydGVkID0gMDsKKwlpbnQgZ2x4X2F0dHJpYiA9IE5vbmU7CisKKwlzd2l0Y2goIGF0dHJpYiApIHsKKwkgICAgY2FzZSBTRExfR0xfUkVEX1NJWkU6CisJCWdseF9hdHRyaWIgPSBHTFhfUkVEX1NJWkU7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9HUkVFTl9TSVpFOgorCQlnbHhfYXR0cmliID0gR0xYX0dSRUVOX1NJWkU7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9HTF9CTFVFX1NJWkU6CisJCWdseF9hdHRyaWIgPSBHTFhfQkxVRV9TSVpFOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfQUxQSEFfU0laRToKKwkJZ2x4X2F0dHJpYiA9IEdMWF9BTFBIQV9TSVpFOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfRE9VQkxFQlVGRkVSOgorCQlnbHhfYXR0cmliID0gR0xYX0RPVUJMRUJVRkZFUjsKKwkJYnJlYWs7CisJICAgIGNhc2UgU0RMX0dMX0JVRkZFUl9TSVpFOgorCQlnbHhfYXR0cmliID0gR0xYX0JVRkZFUl9TSVpFOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfREVQVEhfU0laRToKKwkJZ2x4X2F0dHJpYiA9IEdMWF9ERVBUSF9TSVpFOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfU1RFTkNJTF9TSVpFOgorCQlnbHhfYXR0cmliID0gR0xYX1NURU5DSUxfU0laRTsKKwkJYnJlYWs7CisJICAgIGNhc2UgU0RMX0dMX0FDQ1VNX1JFRF9TSVpFOgorCQlnbHhfYXR0cmliID0gR0xYX0FDQ1VNX1JFRF9TSVpFOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfQUNDVU1fR1JFRU5fU0laRToKKwkJZ2x4X2F0dHJpYiA9IEdMWF9BQ0NVTV9HUkVFTl9TSVpFOworCQlicmVhazsKKwkgICAgY2FzZSBTRExfR0xfQUNDVU1fQkxVRV9TSVpFOgorCQlnbHhfYXR0cmliID0gR0xYX0FDQ1VNX0JMVUVfU0laRTsKKwkJYnJlYWs7CisJICAgIGNhc2UgU0RMX0dMX0FDQ1VNX0FMUEhBX1NJWkU6CisJCWdseF9hdHRyaWIgPSBHTFhfQUNDVU1fQUxQSEFfU0laRTsKKwkJYnJlYWs7CisJICAgIGNhc2UgU0RMX0dMX1NURVJFTzoKKwkJZ2x4X2F0dHJpYiA9IEdMWF9TVEVSRU87CisJCWJyZWFrOworIAkgICAgY2FzZSBTRExfR0xfTVVMVElTQU1QTEVCVUZGRVJTOgorIAkJZ2x4X2F0dHJpYiA9IEdMWF9TQU1QTEVfQlVGRkVSU19BUkI7CisgCQlicmVhazsKKyAJICAgIGNhc2UgU0RMX0dMX01VTFRJU0FNUExFU0FNUExFUzoKKyAJCWdseF9hdHRyaWIgPSBHTFhfU0FNUExFU19BUkI7CisgCQlicmVhazsKKyAJICAgIGNhc2UgU0RMX0dMX0FDQ0VMRVJBVEVEX1ZJU1VBTDoKKwkJaWYgKCBnbFhFeHRlbnNpb25TdXBwb3J0ZWQodGhpcywgIkdMWF9FWFRfdmlzdWFsX3JhdGluZyIpICkgeworCQkJZ2x4X2F0dHJpYiA9IEdMWF9WSVNVQUxfQ0FWRUFUX0VYVDsKKwkJCXJldHZhbCA9IHRoaXMtPmdsX2RhdGEtPmdsWEdldENvbmZpZyhHRlhfRGlzcGxheSwgZ2x4X3Zpc3VhbGluZm8sIGdseF9hdHRyaWIsIHZhbHVlKTsKKwkJCWlmICggKnZhbHVlID09IEdMWF9TTE9XX1ZJU1VBTF9FWFQgKSB7CisJCQkJKnZhbHVlID0gU0RMX0ZBTFNFOworCQkJfSBlbHNlIHsKKwkJCQkqdmFsdWUgPSBTRExfVFJVRTsKKwkJCX0KKwkJCXJldHVybiByZXR2YWw7CisJCX0gZWxzZSB7CisJCQl1bnN1cHBvcnRlZCA9IDE7CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgU0RMX0dMX1NXQVBfQ09OVFJPTDoKKwkJaWYgKCAoIHRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbEVYVCApIHx8CisJCSAgICAgKCB0aGlzLT5nbF9kYXRhLT5nbFhTd2FwSW50ZXJ2YWxNRVNBICkgfHwKKwkJICAgICAoIHRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbFNHSSApICkgeworCQkJKnZhbHVlID0gdGhpcy0+Z2xfZGF0YS0+c3dhcF9pbnRlcnZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJdW5zdXBwb3J0ZWQgPSAxOworCQl9CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQkJdW5zdXBwb3J0ZWQgPSAxOworCQkJYnJlYWs7CisJfQorCisJaWYgKHVuc3VwcG9ydGVkKSB7CisJCVNETF9TZXRFcnJvcigiT3BlbkdMIGF0dHJpYnV0ZSBpcyB1bnN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSIpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IHRoaXMtPmdsX2RhdGEtPmdsWEdldENvbmZpZyhHRlhfRGlzcGxheSwgZ2x4X3Zpc3VhbGluZm8sIGdseF9hdHRyaWIsIHZhbHVlKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBYMTFfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpCit7CisJdGhpcy0+Z2xfZGF0YS0+Z2xYU3dhcEJ1ZmZlcnMoR0ZYX0Rpc3BsYXksIFNETF9XaW5kb3cpOworfQorCisjZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTF9HTFggKi8KKworI2RlZmluZSBPUEVOR0xfUkVRVUlSU19ETE9QRU4KKyNpZiBkZWZpbmVkKE9QRU5HTF9SRVFVSVJTX0RMT1BFTikgJiYgZGVmaW5lZChTRExfTE9BRFNPX0RMT1BFTikKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2RlZmluZSBHTF9Mb2FkT2JqZWN0KFgpCWRsb3BlbihYLCAoUlRMRF9OT1d8UlRMRF9HTE9CQUwpKQorI2RlZmluZSBHTF9Mb2FkRnVuY3Rpb24JCWRsc3ltCisjZGVmaW5lIEdMX1VubG9hZE9iamVjdAkJZGxjbG9zZQorI2Vsc2UKKyNkZWZpbmUgR0xfTG9hZE9iamVjdAlTRExfTG9hZE9iamVjdAorI2RlZmluZSBHTF9Mb2FkRnVuY3Rpb24JU0RMX0xvYWRGdW5jdGlvbgorI2RlZmluZSBHTF9VbmxvYWRPYmplY3QJU0RMX1VubG9hZE9iamVjdAorI2VuZGlmCisKK3ZvaWQgWDExX0dMX1VubG9hZExpYnJhcnkoX1RISVMpCit7CisjaWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKKwlpZiAoIHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkICkgeworCisJCUdMX1VubG9hZE9iamVjdCh0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSk7CisKKwkJdGhpcy0+Z2xfZGF0YS0+Z2xYR2V0UHJvY0FkZHJlc3MgPSBOVUxMOworCQl0aGlzLT5nbF9kYXRhLT5nbFhDaG9vc2VWaXN1YWwgPSBOVUxMOworCQl0aGlzLT5nbF9kYXRhLT5nbFhDcmVhdGVDb250ZXh0ID0gTlVMTDsKKwkJdGhpcy0+Z2xfZGF0YS0+Z2xYRGVzdHJveUNvbnRleHQgPSBOVUxMOworCQl0aGlzLT5nbF9kYXRhLT5nbFhNYWtlQ3VycmVudCA9IE5VTEw7CisJCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBCdWZmZXJzID0gTlVMTDsKKwkJdGhpcy0+Z2xfZGF0YS0+Z2xYU3dhcEludGVydmFsU0dJID0gTlVMTDsKKwkJdGhpcy0+Z2xfZGF0YS0+Z2xYU3dhcEludGVydmFsTUVTQSA9IE5VTEw7CisJCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbEVYVCA9IE5VTEw7CisKKwkJdGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUgPSBOVUxMOworCQl0aGlzLT5nbF9jb25maWcuZHJpdmVyX2xvYWRlZCA9IDA7CisJfQorI2VuZGlmCit9CisKKyNpZiBTRExfVklERU9fT1BFTkdMX0dMWAorCisvKiBQYXNzaW5nIGEgTlVMTCBwYXRoIG1lYW5zIGxvYWQgcG9pbnRlcnMgZnJvbSB0aGUgYXBwbGljYXRpb24gKi8KK2ludCBYMTFfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIqIHBhdGgpIAoreworCXZvaWQqIGhhbmRsZSA9IE5VTEw7CisKKwlpZiAoIGdsX2FjdGl2ZSApIHsKKwkJU0RMX1NldEVycm9yKCJPcGVuR0wgY29udGV4dCBhbHJlYWR5IGNyZWF0ZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICggcGF0aCA9PSBOVUxMICkgeworCQlwYXRoID0gU0RMX2dldGVudigiU0RMX1ZJREVPX0dMX0RSSVZFUiIpOworCQlpZiAoIHBhdGggPT0gTlVMTCApIHsKKwkJCXBhdGggPSBERUZBVUxUX09QRU5HTDsKKwkJfQorCX0KKworCWhhbmRsZSA9IEdMX0xvYWRPYmplY3QocGF0aCk7CisJaWYgKCBoYW5kbGUgPT0gTlVMTCApIHsKKyNpZiBkZWZpbmVkKE9QRU5HTF9SRVFVSVJTX0RMT1BFTikgJiYgZGVmaW5lZChTRExfTE9BRFNPX0RMT1BFTikKKwkJU0RMX1NldEVycm9yKCJGYWlsZWQgbG9hZGluZyAlcyIsIHBhdGgpOworI2Vsc2UKKwkJLyogU0RMX0xvYWRPYmplY3QoKSB3aWxsIGNhbGwgU0RMX1NldEVycm9yKCkgZm9yIHVzLiAqLworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBVbmxvYWQgdGhlIG9sZCBkcml2ZXIgYW5kIHJlc2V0IHRoZSBwb2ludGVycyAqLworCVgxMV9HTF9VbmxvYWRMaWJyYXJ5KHRoaXMpOworCisJLyogU2F2ZSB0aGUgaGFuZGxlIGZvciBYMTFfR0xfR2V0UHJvY0FkZHJlc3MoKSAqLworCXRoaXMtPmdsX2NvbmZpZy5kbGxfaGFuZGxlID0gaGFuZGxlOworCisJLyogTG9hZCBuZXcgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwl0aGlzLT5nbF9kYXRhLT5nbFhHZXRQcm9jQWRkcmVzcyA9CisJCSh2b2lkICooKikoY29uc3QgR0x1Ynl0ZSAqKSkgR0xfTG9hZEZ1bmN0aW9uKGhhbmRsZSwgImdsWEdldFByb2NBZGRyZXNzQVJCIik7CisJdGhpcy0+Z2xfZGF0YS0+Z2xYQ2hvb3NlVmlzdWFsID0KKwkJKFhWaXN1YWxJbmZvICooKikoRGlzcGxheSAqLCBpbnQsIGludCAqKSkgWDExX0dMX0dldFByb2NBZGRyZXNzKHRoaXMsICJnbFhDaG9vc2VWaXN1YWwiKTsKKwl0aGlzLT5nbF9kYXRhLT5nbFhDcmVhdGVDb250ZXh0ID0KKwkJKEdMWENvbnRleHQgKCopKERpc3BsYXkgKiwgWFZpc3VhbEluZm8gKiwgR0xYQ29udGV4dCwgaW50KSkgWDExX0dMX0dldFByb2NBZGRyZXNzKHRoaXMsICJnbFhDcmVhdGVDb250ZXh0Iik7CisJdGhpcy0+Z2xfZGF0YS0+Z2xYRGVzdHJveUNvbnRleHQgPQorCQkodm9pZCAoKikoRGlzcGxheSAqLCBHTFhDb250ZXh0KSkgWDExX0dMX0dldFByb2NBZGRyZXNzKHRoaXMsICJnbFhEZXN0cm95Q29udGV4dCIpOworCXRoaXMtPmdsX2RhdGEtPmdsWE1ha2VDdXJyZW50ID0KKwkJKGludCAoKikoRGlzcGxheSAqLCBHTFhEcmF3YWJsZSwgR0xYQ29udGV4dCkpIFgxMV9HTF9HZXRQcm9jQWRkcmVzcyh0aGlzLCAiZ2xYTWFrZUN1cnJlbnQiKTsKKwl0aGlzLT5nbF9kYXRhLT5nbFhTd2FwQnVmZmVycyA9CisJCSh2b2lkICgqKShEaXNwbGF5ICosIEdMWERyYXdhYmxlKSkgWDExX0dMX0dldFByb2NBZGRyZXNzKHRoaXMsICJnbFhTd2FwQnVmZmVycyIpOworCXRoaXMtPmdsX2RhdGEtPmdsWEdldENvbmZpZyA9CisJCShpbnQgKCopKERpc3BsYXkgKiwgWFZpc3VhbEluZm8gKiwgaW50LCBpbnQgKikpIFgxMV9HTF9HZXRQcm9jQWRkcmVzcyh0aGlzLCAiZ2xYR2V0Q29uZmlnIik7CisJdGhpcy0+Z2xfZGF0YS0+Z2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nID0KKwkJKGNvbnN0IGNoYXIgKigqKShEaXNwbGF5ICosIGludCkpIFgxMV9HTF9HZXRQcm9jQWRkcmVzcyh0aGlzLCAiZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nIik7CisJdGhpcy0+Z2xfZGF0YS0+Z2xYU3dhcEludGVydmFsU0dJID0KKwkJKGludCAoKikoaW50KSkgWDExX0dMX0dldFByb2NBZGRyZXNzKHRoaXMsICJnbFhTd2FwSW50ZXJ2YWxTR0kiKTsKKwl0aGlzLT5nbF9kYXRhLT5nbFhTd2FwSW50ZXJ2YWxNRVNBID0KKwkJKEdMaW50ICgqKSh1bnNpZ25lZCkpIFgxMV9HTF9HZXRQcm9jQWRkcmVzcyh0aGlzLCAiZ2xYU3dhcEludGVydmFsTUVTQSIpOworCXRoaXMtPmdsX2RhdGEtPmdsWFN3YXBJbnRlcnZhbEVYVCA9CisJCShpbnQgKCopKERpc3BsYXkqLEdMWERyYXdhYmxlLGludCkpIFgxMV9HTF9HZXRQcm9jQWRkcmVzcyh0aGlzLCAiZ2xYU3dhcEludGVydmFsRVhUIik7CisKKwlpZiAoICh0aGlzLT5nbF9kYXRhLT5nbFhDaG9vc2VWaXN1YWwgPT0gTlVMTCkgfHwgCisJICAgICAodGhpcy0+Z2xfZGF0YS0+Z2xYQ3JlYXRlQ29udGV4dCA9PSBOVUxMKSB8fAorCSAgICAgKHRoaXMtPmdsX2RhdGEtPmdsWERlc3Ryb3lDb250ZXh0ID09IE5VTEwpIHx8CisJICAgICAodGhpcy0+Z2xfZGF0YS0+Z2xYTWFrZUN1cnJlbnQgPT0gTlVMTCkgfHwKKwkgICAgICh0aGlzLT5nbF9kYXRhLT5nbFhTd2FwQnVmZmVycyA9PSBOVUxMKSB8fAorCSAgICAgKHRoaXMtPmdsX2RhdGEtPmdsWEdldENvbmZpZyA9PSBOVUxMKSB8fAorCSAgICAgKHRoaXMtPmdsX2RhdGEtPmdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyA9PSBOVUxMKSkgeworCQlHTF9VbmxvYWRPYmplY3QodGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUpOworCQl0aGlzLT5nbF9jb25maWcuZGxsX2hhbmRsZSA9IE5VTEw7CisJCVNETF9TZXRFcnJvcigiQ291bGQgbm90IHJldHJpZXZlIE9wZW5HTCBmdW5jdGlvbnMiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfbG9hZGVkID0gMTsKKwlpZiAoIHBhdGggKSB7CisJCVNETF9zdHJsY3B5KHRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCwgcGF0aCwKKwkJCVNETF9hcnJheXNpemUodGhpcy0+Z2xfY29uZmlnLmRyaXZlcl9wYXRoKSk7CisJfSBlbHNlIHsKKwkJKnRoaXMtPmdsX2NvbmZpZy5kcml2ZXJfcGF0aCA9ICdcMCc7CisJfQorCXJldHVybiAwOworfQorCit2b2lkICpYMTFfR0xfR2V0UHJvY0FkZHJlc3MoX1RISVMsIGNvbnN0IGNoYXIqIHByb2MpCit7CisJaWYgKCB0aGlzLT5nbF9kYXRhLT5nbFhHZXRQcm9jQWRkcmVzcyApIHsKKwkJcmV0dXJuIHRoaXMtPmdsX2RhdGEtPmdsWEdldFByb2NBZGRyZXNzKChjb25zdCBHTHVieXRlICopcHJvYyk7CisJfQorCXJldHVybiBHTF9Mb2FkRnVuY3Rpb24odGhpcy0+Z2xfY29uZmlnLmRsbF9oYW5kbGUsIHByb2MpOworfQorCisjZW5kaWYgLyogU0RMX1ZJREVPX09QRU5HTF9HTFggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFnbF9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZ2xfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODIyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExZ2xfYy5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKKyNpbmNsdWRlIDxHTC9nbHguaD4KKyNpbmNsdWRlICJTRExfbG9hZHNvLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCitzdHJ1Y3QgU0RMX1ByaXZhdGVHTERhdGEgeworICAgIGludCBnbF9hY3RpdmU7IC8qIHRvIHN0b3Agc3dpdGNoaW5nIGRyaXZlcnMgd2hpbGUgd2UgaGF2ZSBhIHZhbGlkIGNvbnRleHQgKi8KKworI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCisgICAgR0xYQ29udGV4dCBnbHhfY29udGV4dDsJLyogQ3VycmVudCBHTCBjb250ZXh0ICovCisgICAgWFZpc3VhbEluZm8qIGdseF92aXN1YWxpbmZvOyAvKiBYVmlzdWFsSW5mbyogcmV0dXJuZWQgYnkgZ2xYQ2hvb3NlVmlzdWFsICovCisKKyAgICB2b2lkICogKCpnbFhHZXRQcm9jQWRkcmVzcykoY29uc3QgR0x1Ynl0ZSAqcHJvY05hbWUpOworCisgICAgWFZpc3VhbEluZm8qICgqZ2xYQ2hvb3NlVmlzdWFsKQorCQkoIERpc3BsYXkqCQlkcHksCisJCSAgaW50CQkJc2NyZWVuLAorCQkgIGludCoJCQlhdHRyaWJMaXN0ICk7CisKKyAgICBHTFhDb250ZXh0ICgqZ2xYQ3JlYXRlQ29udGV4dCkKKwkJKCBEaXNwbGF5KgkJZHB5LAorCQkgIFhWaXN1YWxJbmZvKgkJdmlzLAorCQkgIEdMWENvbnRleHQJCXNoYXJlTGlzdCwKKwkJICBCb29sCQkJZGlyZWN0ICk7CisKKyAgICB2b2lkICgqZ2xYRGVzdHJveUNvbnRleHQpCisJCSggRGlzcGxheSogCQlkcHksCisJCSAgR0xYQ29udGV4dAkJY3R4ICk7CisKKyAgICBCb29sICgqZ2xYTWFrZUN1cnJlbnQpCisJCSggRGlzcGxheSoJCWRweSwKKwkJICBHTFhEcmF3YWJsZQkJZHJhd2FibGUsCisJCSAgR0xYQ29udGV4dAkJY3R4ICk7CisKKyAgICB2b2lkICgqZ2xYU3dhcEJ1ZmZlcnMpCisJCSggRGlzcGxheSoJCWRweSwKKwkJICBHTFhEcmF3YWJsZQkJZHJhd2FibGUgKTsKKworICAgIGludCAoKmdsWEdldENvbmZpZykKKwkgKCBEaXNwbGF5KiBkcHksCisJICAgWFZpc3VhbEluZm8qIHZpc3VhbF9pbmZvLAorCSAgIGludCBhdHRyaWIsCisJICAgaW50KiB2YWx1ZSApOworCisgICAgY29uc3QgY2hhciAqKCpnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcpCisJICAgICggRGlzcGxheSogZHB5LAorCSAgICAgIGludCBzY3JlZW4gKTsKKworICAgIGludCAoKmdsWFN3YXBJbnRlcnZhbFNHSSkgKCBpbnQgaW50ZXJ2YWwgKTsKKyAgICBHTGludCAoKmdsWFN3YXBJbnRlcnZhbE1FU0EpICggdW5zaWduZWQgaW50ZXJ2YWwgKTsKKyAgICBpbnQgKCpnbFhTd2FwSW50ZXJ2YWxFWFQpKCBEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRydywgaW50IGludGVydmFsKTsKKyAgICBpbnQgc3dhcF9pbnRlcnZhbDsKKyNlbmRpZiAvKiBTRExfVklERU9fT1BFTkdMX0dMWCAqLworfTsKKworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIGdsX2FjdGl2ZQkJKHRoaXMtPmdsX2RhdGEtPmdsX2FjdGl2ZSkKKyNkZWZpbmUgZ2x4X2NvbnRleHQJCSh0aGlzLT5nbF9kYXRhLT5nbHhfY29udGV4dCkKKyNkZWZpbmUgZ2x4X3Zpc3VhbGluZm8JCSh0aGlzLT5nbF9kYXRhLT5nbHhfdmlzdWFsaW5mbykKKworLyogT3BlbkdMIGZ1bmN0aW9ucyAqLworZXh0ZXJuIFhWaXN1YWxJbmZvICpYMTFfR0xfR2V0VmlzdWFsKF9USElTKTsKK2V4dGVybiBpbnQgWDExX0dMX0NyZWF0ZVdpbmRvdyhfVEhJUywgaW50IHcsIGludCBoKTsKK2V4dGVybiBpbnQgWDExX0dMX0NyZWF0ZUNvbnRleHQoX1RISVMpOworZXh0ZXJuIHZvaWQgWDExX0dMX1NodXRkb3duKF9USElTKTsKKyNpZiBTRExfVklERU9fT1BFTkdMX0dMWAorZXh0ZXJuIGludCBYMTFfR0xfTWFrZUN1cnJlbnQoX1RISVMpOworZXh0ZXJuIGludCBYMTFfR0xfR2V0QXR0cmlidXRlKF9USElTLCBTRExfR0xhdHRyIGF0dHJpYiwgaW50KiB2YWx1ZSk7CitleHRlcm4gdm9pZCBYMTFfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpOworZXh0ZXJuIGludCBYMTFfR0xfTG9hZExpYnJhcnkoX1RISVMsIGNvbnN0IGNoYXIqIHBhdGgpOworZXh0ZXJuIHZvaWQgKlgxMV9HTF9HZXRQcm9jQWRkcmVzcyhfVEhJUywgY29uc3QgY2hhciogcHJvYyk7CisjZW5kaWYKK2V4dGVybiB2b2lkIFgxMV9HTF9VbmxvYWRMaWJyYXJ5KF9USElTKTsKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMWltYWdlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRiYzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMWltYWdlLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlNETF9lbmRpYW4uaCIKKyNpbmNsdWRlICIuLi8uLi9ldmVudHMvU0RMX2V2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3gxMWltYWdlX2MuaCIKKworI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCisKKy8qIFNoYXJlZCBtZW1vcnkgZXJyb3IgaGFuZGxlciByb3V0aW5lICovCitzdGF0aWMgaW50IHNobV9lcnJvcjsKK3N0YXRpYyBpbnQgKCpYX2hhbmRsZXIpKERpc3BsYXkgKiwgWEVycm9yRXZlbnQgKikgPSBOVUxMOworc3RhdGljIGludCBzaG1fZXJyaGFuZGxlcihEaXNwbGF5ICpkLCBYRXJyb3JFdmVudCAqZSkKK3sKKyAgICAgICAgaWYgKCBlLT5lcnJvcl9jb2RlID09IEJhZEFjY2VzcyApIHsKKyAgICAgICAgCXNobV9lcnJvciA9IFRydWU7CisgICAgICAgIAlyZXR1cm4oMCk7CisgICAgICAgIH0gZWxzZQorCQlyZXR1cm4oWF9oYW5kbGVyKGQsZSkpOworfQorCitzdGF0aWMgdm9pZCB0cnlfbWl0c2htKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKQoreworCS8qIER5bmFtaWMgWDExIG1heSBub3QgaGF2ZSBTSE0gZW50cnkgcG9pbnRzIG9uIHRoaXMgYm94LiAqLworCWlmICgodXNlX21pdHNobSkgJiYgKCFTRExfWDExX0hBVkVfU0hNKSkKKwkJdXNlX21pdHNobSA9IDA7CisKKwlpZighdXNlX21pdHNobSkKKwkJcmV0dXJuOworCXNobWluZm8uc2htaWQgPSBzaG1nZXQoSVBDX1BSSVZBVEUsIHNjcmVlbi0+aCpzY3JlZW4tPnBpdGNoLAorCQkJICAgICAgIElQQ19DUkVBVCB8IDA3NzcpOworCWlmICggc2htaW5mby5zaG1pZCA+PSAwICkgeworCQlzaG1pbmZvLnNobWFkZHIgPSAoY2hhciAqKXNobWF0KHNobWluZm8uc2htaWQsIDAsIDApOworCQlzaG1pbmZvLnJlYWRPbmx5ID0gRmFsc2U7CisJCWlmICggc2htaW5mby5zaG1hZGRyICE9IChjaGFyICopLTEgKSB7CisJCQlzaG1fZXJyb3IgPSBGYWxzZTsKKwkJCVhfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIoc2htX2VycmhhbmRsZXIpOworCQkJWFNobUF0dGFjaChTRExfRGlzcGxheSwgJnNobWluZm8pOworCQkJWFN5bmMoU0RMX0Rpc3BsYXksIFRydWUpOworCQkJWFNldEVycm9ySGFuZGxlcihYX2hhbmRsZXIpOworCQkJaWYgKCBzaG1fZXJyb3IgKQorCQkJCXNobWR0KHNobWluZm8uc2htYWRkcik7CisJCX0gZWxzZSB7CisJCQlzaG1fZXJyb3IgPSBUcnVlOworCQl9CisJCXNobWN0bChzaG1pbmZvLnNobWlkLCBJUENfUk1JRCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJc2htX2Vycm9yID0gVHJ1ZTsKKwl9CisJaWYgKCBzaG1fZXJyb3IgKQorCQl1c2VfbWl0c2htID0gMDsKKwlpZiAoIHVzZV9taXRzaG0gKQorCQlzY3JlZW4tPnBpeGVscyA9IHNobWluZm8uc2htYWRkcjsKK30KKyNlbmRpZiAvKiAhIE5PX1NIQVJFRF9NRU1PUlkgKi8KKworLyogVmFyaW91cyBzY3JlZW4gdXBkYXRlIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KK3N0YXRpYyB2b2lkIFgxMV9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKK3N0YXRpYyB2b2lkIFgxMV9NSVRTSE1VcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKTsKKworaW50IFgxMV9TZXR1cEltYWdlKF9USElTLCBTRExfU3VyZmFjZSAqc2NyZWVuKQoreworI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCisJdHJ5X21pdHNobSh0aGlzLCBzY3JlZW4pOworCWlmKHVzZV9taXRzaG0pIHsKKwkJU0RMX1hpbWFnZSA9IFhTaG1DcmVhdGVJbWFnZShTRExfRGlzcGxheSwgU0RMX1Zpc3VhbCwKKwkJCQkJICAgICB0aGlzLT5oaWRkZW4tPmRlcHRoLCBaUGl4bWFwLAorCQkJCQkgICAgIHNobWluZm8uc2htYWRkciwgJnNobWluZm8sIAorCQkJCQkgICAgIHNjcmVlbi0+dywgc2NyZWVuLT5oKTsKKwkJaWYoIVNETF9YaW1hZ2UpIHsKKwkJCVhTaG1EZXRhY2goU0RMX0Rpc3BsYXksICZzaG1pbmZvKTsKKwkJCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7CisJCQlzaG1kdChzaG1pbmZvLnNobWFkZHIpOworCQkJc2NyZWVuLT5waXhlbHMgPSBOVUxMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQl0aGlzLT5VcGRhdGVSZWN0cyA9IFgxMV9NSVRTSE1VcGRhdGU7CisJfQorCWlmKCF1c2VfbWl0c2htKQorI2VuZGlmIC8qIG5vdCBOT19TSEFSRURfTUVNT1JZICovCisJeworCQlzY3JlZW4tPnBpeGVscyA9IFNETF9tYWxsb2Moc2NyZWVuLT5oKnNjcmVlbi0+cGl0Y2gpOworCQlpZiAoIHNjcmVlbi0+cGl4ZWxzID09IE5VTEwgKSB7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlTRExfWGltYWdlID0gWENyZWF0ZUltYWdlKFNETF9EaXNwbGF5LCBTRExfVmlzdWFsLAorCQkJCQkgIHRoaXMtPmhpZGRlbi0+ZGVwdGgsIFpQaXhtYXAsIDAsCisJCQkJCSAgKGNoYXIgKilzY3JlZW4tPnBpeGVscywgCisJCQkJCSAgc2NyZWVuLT53LCBzY3JlZW4tPmgsCisJCQkJCSAgMzIsIDApOworCQlpZiAoIFNETF9YaW1hZ2UgPT0gTlVMTCApCisJCQlnb3RvIGVycm9yOworCQkvKiBYUHV0SW1hZ2Ugd2lsbCBjb252ZXJ0IGJ5dGUgc2V4IGF1dG9tYXRpY2FsbHkgKi8KKwkJU0RMX1hpbWFnZS0+Ynl0ZV9vcmRlciA9IChTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKQorCQkJICAgICAgICAgICAgICAgICA/IE1TQkZpcnN0IDogTFNCRmlyc3Q7CisJCXRoaXMtPlVwZGF0ZVJlY3RzID0gWDExX05vcm1hbFVwZGF0ZTsKKwl9CisJc2NyZWVuLT5waXRjaCA9IFNETF9YaW1hZ2UtPmJ5dGVzX3Blcl9saW5lOworCXJldHVybigwKTsKKworZXJyb3I6CisJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgWEltYWdlIik7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgWDExX0Rlc3Ryb3lJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbikKK3sKKwlpZiAoIFNETF9YaW1hZ2UgKSB7CisJCVhEZXN0cm95SW1hZ2UoU0RMX1hpbWFnZSk7CisjaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKKwkJaWYgKCB1c2VfbWl0c2htICkgeworCQkJWFNobURldGFjaChTRExfRGlzcGxheSwgJnNobWluZm8pOworCQkJWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKwkJCXNobWR0KHNobWluZm8uc2htYWRkcik7CisJCX0KKyNlbmRpZiAvKiAhIE5PX1NIQVJFRF9NRU1PUlkgKi8KKwkJU0RMX1hpbWFnZSA9IE5VTEw7CisJfQorCWlmICggc2NyZWVuICkgeworCQlzY3JlZW4tPnBpeGVscyA9IE5VTEw7CisJfQorfQorCisvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW0gKi8KK3N0YXRpYyBpbnQgbnVtX0NQVSh2b2lkKQoreworICAgICAgIHN0YXRpYyBpbnQgbnVtX2NwdXMgPSAwOworCisgICAgICAgaWYoIW51bV9jcHVzKSB7CisjaWYgZGVmaW5lZChfX0xJTlVYX18pCisgICAgICAgICAgIGNoYXIgbGluZVtCVUZTSVpdOworICAgICAgICAgICBGSUxFICpwc3RhdCA9IGZvcGVuKCIvcHJvYy9zdGF0IiwgInIiKTsKKyAgICAgICAgICAgaWYgKCBwc3RhdCApIHsKKyAgICAgICAgICAgICAgIHdoaWxlICggZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBwc3RhdCkgKSB7CisgICAgICAgICAgICAgICAgICAgaWYgKFNETF9tZW1jbXAobGluZSwgImNwdSIsIDMpID09IDAgJiYgbGluZVszXSAhPSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgKytudW1fY3B1czsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBmY2xvc2UocHN0YXQpOworICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKF9fSVJJWF9fKQorCSAgIG51bV9jcHVzID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZWxpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorCSAgIC8qIG51bWJlciBvZiBwcm9jZXNzb3JzIG9ubGluZSAoU1ZSNC4wTVAgY29tcGxpYW50IG1hY2hpbmVzKSAqLworICAgICAgICAgICBudW1fY3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2VsaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfQ09ORikKKwkgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBjb25maWd1cmVkIChTVlI0LjBNUCBjb21wbGlhbnQgbWFjaGluZXMpICovCisgICAgICAgICAgIG51bV9jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORik7CisjZW5kaWYKKyAgICAgICAgICAgaWYgKCBudW1fY3B1cyA8PSAwICkgeworICAgICAgICAgICAgICAgbnVtX2NwdXMgPSAxOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHJldHVybiBudW1fY3B1czsKK30KKworaW50IFgxMV9SZXNpemVJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbiwgVWludDMyIGZsYWdzKQoreworCWludCByZXR2YWw7CisKKwlYMTFfRGVzdHJveUltYWdlKHRoaXMsIHNjcmVlbik7CisgICAgICAgIGlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgeyAgLyogTm8gaW1hZ2Ugd2hlbiB1c2luZyBHTCAqLworICAgICAgICAJcmV0dmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKwkJcmV0dmFsID0gWDExX1NldHVwSW1hZ2UodGhpcywgc2NyZWVuKTsKKwkJLyogV2Ugc3VwcG9ydCBhc3luY2hyb25vdXMgYmxpdHRpbmcgb24gdGhlIGRpc3BsYXkgKi8KKwkJaWYgKCBmbGFncyAmIFNETF9BU1lOQ0JMSVQgKSB7CisJCQkvKiBUaGlzIGlzIGFjdHVhbGx5IHNsb3dlciBvbiBzaW5nbGUtQ1BVIHN5c3RlbXMsCisJCQkgICBwcm9iYWJseSBiZWNhdXNlIG9mIENQVSBjb250ZW50aW9uIGJldHdlZW4gdGhlCisJCQkgICBYIHNlcnZlciBhbmQgdGhlIGFwcGxpY2F0aW9uLgorCQkJICAgTm90ZTogSXMgdGhpcyBzdGlsbCB0cnVlIHdpdGggWEZyZWU4NiA0LjA/CisJCQkqLworCQkJaWYgKCBudW1fQ1BVKCkgPiAxICkgeworCQkJCXNjcmVlbi0+ZmxhZ3MgfD0gU0RMX0FTWU5DQkxJVDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KK2ludCBYMTFfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybigtMSk7Cit9Cit2b2lkIFgxMV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm47Cit9CisKK2ludCBYMTFfTG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaWYgKCAoc3VyZmFjZSA9PSBTRExfVmlkZW9TdXJmYWNlKSAmJiBibGl0X3F1ZXVlZCApIHsKKwkJWFN5bmMoR0ZYX0Rpc3BsYXksIEZhbHNlKTsKKwkJYmxpdF9xdWV1ZWQgPSAwOworCX0KKwlyZXR1cm4oMCk7Cit9Cit2b2lkIFgxMV9VbmxvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybjsKK30KKworaW50IFgxMV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIFgxMV9Ob3JtYWxVcGRhdGUoX1RISVMsIGludCBudW1yZWN0cywgU0RMX1JlY3QgKnJlY3RzKQoreworCWludCBpOworCQorCWZvciAoaSA9IDA7IGkgPCBudW1yZWN0czsgKytpKSB7CisJCWlmICggcmVjdHNbaV0udyA9PSAwIHx8IHJlY3RzW2ldLmggPT0gMCApIHsgLyogQ2xpcHBlZD8gKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCVhQdXRJbWFnZShHRlhfRGlzcGxheSwgU0RMX1dpbmRvdywgU0RMX0dDLCBTRExfWGltYWdlLAorCQkJICByZWN0c1tpXS54LCByZWN0c1tpXS55LAorCQkJICByZWN0c1tpXS54LCByZWN0c1tpXS55LCByZWN0c1tpXS53LCByZWN0c1tpXS5oKTsKKwl9CisJaWYgKCBTRExfVmlkZW9TdXJmYWNlLT5mbGFncyAmIFNETF9BU1lOQ0JMSVQgKSB7CisJCVhGbHVzaChHRlhfRGlzcGxheSk7CisJCWJsaXRfcXVldWVkID0gMTsKKwl9IGVsc2UgeworCQlYU3luYyhHRlhfRGlzcGxheSwgRmFsc2UpOworCX0KK30KKworc3RhdGljIHZvaWQgWDExX01JVFNITVVwZGF0ZShfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisjaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKKwlpbnQgaTsKKworCWZvciAoIGk9MDsgaTxudW1yZWN0czsgKytpICkgeworCQlpZiAoIHJlY3RzW2ldLncgPT0gMCB8fCByZWN0c1tpXS5oID09IDAgKSB7IC8qIENsaXBwZWQ/ICovCisJCQljb250aW51ZTsKKwkJfQorCQlYU2htUHV0SW1hZ2UoR0ZYX0Rpc3BsYXksIFNETF9XaW5kb3csIFNETF9HQywgU0RMX1hpbWFnZSwKKwkJCQlyZWN0c1tpXS54LCByZWN0c1tpXS55LAorCQkJCXJlY3RzW2ldLngsIHJlY3RzW2ldLnksIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgsCisJCQkJCQkJCQlGYWxzZSk7CisJfQorCWlmICggU0RMX1ZpZGVvU3VyZmFjZS0+ZmxhZ3MgJiBTRExfQVNZTkNCTElUICkgeworCQlYRmx1c2goR0ZYX0Rpc3BsYXkpOworCQlibGl0X3F1ZXVlZCA9IDE7CisJfSBlbHNlIHsKKwkJWFN5bmMoR0ZYX0Rpc3BsYXksIEZhbHNlKTsKKwl9CisjZW5kaWYgLyogISBOT19TSEFSRURfTUVNT1JZICovCit9CisKKy8qIFRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggdGhlIGF1dG9tYXRpYyByZWZyZXNoaW5nIG9mIHRoZSBkaXNwbGF5LgorICAgRXZlbiB0aG91Z2ggdGhlIFhWaWRlbyBjb2RlIHVzZXMgdGhlIEdGWF9EaXNwbGF5IHRvIHVwZGF0ZSB0aGUKKyAgIHZpZGVvIG1lbW9yeSwgaXQgYXBwZWFycyB0aGF0IHVwZGF0aW5nIHRoZSB3aW5kb3cgYXN5bmNocm9ub3VzbHkKKyAgIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHdpbGwgY2F1c2UgImJsYWNrb3V0cyIgb2YgdGhlIHdpbmRvdy4KKyAgIFRoaXMgaXMgYSBzb3J0IG9mIGEgaGFja2VkIHdvcmthcm91bmQgZm9yIHRoZSBwcm9ibGVtLgorKi8KK3N0YXRpYyBpbnQgZW5hYmxlX2F1dG9yZWZyZXNoID0gMTsKKwordm9pZCBYMTFfRGlzYWJsZUF1dG9SZWZyZXNoKF9USElTKQoreworCS0tZW5hYmxlX2F1dG9yZWZyZXNoOworfQorCit2b2lkIFgxMV9FbmFibGVBdXRvUmVmcmVzaChfVEhJUykKK3sKKwkrK2VuYWJsZV9hdXRvcmVmcmVzaDsKK30KKwordm9pZCBYMTFfUmVmcmVzaERpc3BsYXkoX1RISVMpCit7CisJLyogRG9uJ3QgcmVmcmVzaCBhIGRpc3BsYXkgdGhhdCBkb2Vzbid0IGhhdmUgYW4gaW1hZ2UgKGxpa2UgR0wpCisJICAgSW5zdGVhZCwgcG9zdCBhbiBleHBvc2UgZXZlbnQgc28gdGhlIGFwcGxpY2F0aW9uIGNhbiByZWZyZXNoLgorCSAqLworCWlmICggISBTRExfWGltYWdlIHx8IChlbmFibGVfYXV0b3JlZnJlc2ggPD0gMCkgKSB7CisJCVNETF9Qcml2YXRlRXhwb3NlKCk7CisJCXJldHVybjsKKwl9CisjaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKKwlpZiAoIHRoaXMtPlVwZGF0ZVJlY3RzID09IFgxMV9NSVRTSE1VcGRhdGUgKSB7CisJCVhTaG1QdXRJbWFnZShTRExfRGlzcGxheSwgU0RMX1dpbmRvdywgU0RMX0dDLCBTRExfWGltYWdlLAorCQkJCTAsIDAsIDAsIDAsIHRoaXMtPnNjcmVlbi0+dywgdGhpcy0+c2NyZWVuLT5oLAorCQkJCUZhbHNlKTsKKwl9IGVsc2UKKyNlbmRpZiAvKiAhIE5PX1NIQVJFRF9NRU1PUlkgKi8KKwl7CisJCVhQdXRJbWFnZShTRExfRGlzcGxheSwgU0RMX1dpbmRvdywgU0RMX0dDLCBTRExfWGltYWdlLAorCQkJICAwLCAwLCAwLCAwLCB0aGlzLT5zY3JlZW4tPncsIHRoaXMtPnNjcmVlbi0+aCk7CisJfQorCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7Cit9CisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFpbWFnZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExaW1hZ2VfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZTE1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExaW1hZ2VfYy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCisKK2V4dGVybiBpbnQgWDExX1NldHVwSW1hZ2UoX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4pOworZXh0ZXJuIHZvaWQgWDExX0Rlc3Ryb3lJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbik7CitleHRlcm4gaW50IFgxMV9SZXNpemVJbWFnZShfVEhJUywgU0RMX1N1cmZhY2UgKnNjcmVlbiwgVWludDMyIGZsYWdzKTsKKworZXh0ZXJuIGludCBYMTFfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK2V4dGVybiB2b2lkIFgxMV9GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitleHRlcm4gaW50IFgxMV9Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitleHRlcm4gdm9pZCBYMTFfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitleHRlcm4gaW50IFgxMV9GbGlwSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CisKK2V4dGVybiB2b2lkIFgxMV9EaXNhYmxlQXV0b1JlZnJlc2goX1RISVMpOworZXh0ZXJuIHZvaWQgWDExX0VuYWJsZUF1dG9SZWZyZXNoKF9USElTKTsKK2V4dGVybiB2b2lkIFgxMV9SZWZyZXNoRGlzcGxheShfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW9kZXMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFtb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzJlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW9kZXMuYwpAQCAtMCwwICsxLDExNDMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKiBVdGlsaXRpZXMgZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIFggZGlzcGxheSBtb2RlICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX2V2ZW50cy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfeDExdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfeDExd21fYy5oIgorI2luY2x1ZGUgIlNETF94MTFtb2Rlc19jLmgiCisjaW5jbHVkZSAiU0RMX3gxMWltYWdlX2MuaCIKKworLyojZGVmaW5lIFgxMU1PREVTX0RFQlVHKi8KKworI2RlZmluZSBNQVgoYSwgYikgICAgICAgIChhID4gYiA/IGEgOiBiKQorCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFJBTkRSCitzdGF0aWMgaW50IGNtcG1vZGVsaXN0KGNvbnN0IHZvaWQgKnZhLCBjb25zdCB2b2lkICp2YikKK3sKKyAgICBjb25zdCBTRExfUmVjdCAqYSA9ICooY29uc3QgU0RMX1JlY3QgKiopdmE7CisgICAgY29uc3QgU0RMX1JlY3QgKmIgPSAqKGNvbnN0IFNETF9SZWN0ICoqKXZiOworICAgIGlmICggYS0+dyA9PSBiLT53ICkKKyAgICAgICAgcmV0dXJuIGItPmggLSBhLT5oOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGItPncgLSBhLT53OworfQorI2VuZGlmCisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFCitCb29sIFNETF9OQU1FKFhGODZWaWRNb2RlR2V0TW9kZUluZm8pKERpc3BsYXkgKmRweSwgaW50IHNjciwgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKmluZm8pCit7CisgICAgQm9vbCByZXR2YWw7CisgICAgaW50IGRvdGNsb2NrOworICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUxpbmUpIGw7CisgICAgU0RMX21lbXNldCgmbCwgMCwgc2l6ZW9mKGwpKTsKKyAgICByZXR2YWwgPSBTRExfTkFNRShYRjg2VmlkTW9kZUdldE1vZGVMaW5lKShkcHksIHNjciwgJmRvdGNsb2NrLCAmbCk7CisgICAgaW5mby0+ZG90Y2xvY2sgPSBkb3RjbG9jazsKKyAgICBpbmZvLT5oZGlzcGxheSA9IGwuaGRpc3BsYXk7CisgICAgaW5mby0+aHN5bmNzdGFydCA9IGwuaHN5bmNzdGFydDsKKyAgICBpbmZvLT5oc3luY2VuZCA9IGwuaHN5bmNlbmQ7CisgICAgaW5mby0+aHRvdGFsID0gbC5odG90YWw7CisgICAgaW5mby0+aHNrZXcgPSBsLmhza2V3OworICAgIGluZm8tPnZkaXNwbGF5ID0gbC52ZGlzcGxheTsKKyAgICBpbmZvLT52c3luY3N0YXJ0ID0gbC52c3luY3N0YXJ0OworICAgIGluZm8tPnZzeW5jZW5kID0gbC52c3luY2VuZDsKKyAgICBpbmZvLT52dG90YWwgPSBsLnZ0b3RhbDsKKyAgICBpbmZvLT5mbGFncyA9IGwuZmxhZ3M7CisgICAgaW5mby0+cHJpdnNpemUgPSBsLnByaXZzaXplOworICAgIGluZm8tPnByaXZhdGUgPSBsLnByaXZhdGU7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFICovCisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFCitzdGF0aWMgdm9pZCBzYXZlX21vZGUoX1RISVMpCit7CisgICAgU0RMX21lbXNldCgmc2F2ZWRfbW9kZSwgMCwgc2l6ZW9mKHNhdmVkX21vZGUpKTsKKyAgICBTRExfTkFNRShYRjg2VmlkTW9kZUdldE1vZGVJbmZvKShTRExfRGlzcGxheSxTRExfU2NyZWVuLCZzYXZlZF9tb2RlKTsKKyAgICBTRExfTkFNRShYRjg2VmlkTW9kZUdldFZpZXdQb3J0KShTRExfRGlzcGxheSxTRExfU2NyZWVuLCZzYXZlZF92aWV3LngsJnNhdmVkX3ZpZXcueSk7Cit9CisjZW5kaWYKKworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKK3N0YXRpYyB2b2lkIHJlc3RvcmVfbW9kZShfVEhJUykKK3sKKyAgICBTRExfTkFNRShYRjg2VmlkTW9kZU1vZGVMaW5lKSBtb2RlOworICAgIGludCB1bnVzZWQ7CisKKyAgICBpZiAoIFNETF9OQU1FKFhGODZWaWRNb2RlR2V0TW9kZUxpbmUpKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuLCAmdW51c2VkLCAmbW9kZSkgKSB7CisgICAgICAgIGlmICggKHNhdmVkX21vZGUuaGRpc3BsYXkgIT0gbW9kZS5oZGlzcGxheSkgfHwKKyAgICAgICAgICAgICAoc2F2ZWRfbW9kZS52ZGlzcGxheSAhPSBtb2RlLnZkaXNwbGF5KSApIHsKKyAgICAgICAgICAgIFNETF9OQU1FKFhGODZWaWRNb2RlU3dpdGNoVG9Nb2RlKShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgJnNhdmVkX21vZGUpOworICAgICAgICB9CisgICAgfQorICAgIGlmICggKHNhdmVkX3ZpZXcueCAhPSAwKSB8fCAoc2F2ZWRfdmlldy55ICE9IDApICkgeworICAgICAgICBTRExfTkFNRShYRjg2VmlkTW9kZVNldFZpZXdQb3J0KShTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwgc2F2ZWRfdmlldy54LCBzYXZlZF92aWV3LnkpOworICAgIH0KK30KKyNlbmRpZgorCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQorc3RhdGljIGludCBjbXBtb2Rlcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCit7CisgICAgY29uc3QgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKmEgPSAqKGNvbnN0IFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiopdmE7CisgICAgY29uc3QgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKmIgPSAqKGNvbnN0IFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pKiopdmI7CisgICAgaWYgKCBhLT5oZGlzcGxheSA9PSBiLT5oZGlzcGxheSApCisgICAgICAgIHJldHVybiBiLT52ZGlzcGxheSAtIGEtPnZkaXNwbGF5OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGItPmhkaXNwbGF5IC0gYS0+aGRpc3BsYXk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X3JlYWxfcmVzb2x1dGlvbihfVEhJUywgaW50KiB3LCBpbnQqIGgpOworCitzdGF0aWMgdm9pZCBzZXRfYmVzdF9yZXNvbHV0aW9uKF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQorICAgIGlmICggdXNlX3ZpZG1vZGUgKSB7CisgICAgICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUxpbmUpIG1vZGU7CisgICAgICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTW9kZUluZm8pICoqbW9kZXM7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgbm1vZGVzOworICAgICAgICBpbnQgYmVzdCA9IC0xOworCisgICAgICAgIGlmICggU0RMX05BTUUoWEY4NlZpZE1vZGVHZXRNb2RlTGluZSkoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sICZpLCAmbW9kZSkgJiYKKyAgICAgICAgICAgICBTRExfTkFNRShYRjg2VmlkTW9kZUdldEFsbE1vZGVMaW5lcykoU0RMX0Rpc3BsYXksU0RMX1NjcmVlbiwmbm1vZGVzLCZtb2RlcykgKSB7CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG5tb2RlcyA7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChtb2Rlc1tpXS0+aGRpc3BsYXkgPT0gd2lkdGgpICYmCisgICAgICAgICAgICAgICAgICAgICAobW9kZXNbaV0tPnZkaXNwbGF5ID09IGhlaWdodCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBtb2Rlc1tpXS0+aGRpc3BsYXkgPj0gd2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgIG1vZGVzW2ldLT52ZGlzcGxheSA+PSBoZWlnaHQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggYmVzdCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZXNbaV0tPmhkaXNwbGF5IDwgbW9kZXNbYmVzdF0tPmhkaXNwbGF5ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzW2ldLT52ZGlzcGxheSA8PSBtb2Rlc1tiZXN0XS0+dmRpc3BsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGVzW2ldLT52ZGlzcGxheSA8IG1vZGVzW2Jlc3RdLT52ZGlzcGxheSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2Rlc1tpXS0+aGRpc3BsYXkgPD0gbW9kZXNbYmVzdF0tPmhkaXNwbGF5KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBiZXN0ID49IDAgJiYKKyAgICAgICAgICAgICAgICAgKChtb2Rlc1tiZXN0XS0+aGRpc3BsYXkgIT0gbW9kZS5oZGlzcGxheSkgfHwKKyAgICAgICAgICAgICAgICAgIChtb2Rlc1tiZXN0XS0+dmRpc3BsYXkgIT0gbW9kZS52ZGlzcGxheSkpICkgeworI2lmZGVmIFgxMU1PREVTX0RFQlVHCisgICAgICAgICAgICAgICAgcHJpbnRmKCJCZXN0IE1vZGUgJWQ6ICVkIHggJWQgQCAlZFxuIiwgYmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzW2Jlc3RdLT5oZGlzcGxheSwgbW9kZXNbYmVzdF0tPnZkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGVzW2Jlc3RdLT5odG90YWwgJiYgbW9kZXNbYmVzdF0tPnZ0b3RhbCkgPyAoMTAwMCAqIG1vZGVzW2Jlc3RdLT5kb3RjbG9jayAvIChtb2Rlc1tiZXN0XS0+aHRvdGFsICogbW9kZXNbYmVzdF0tPnZ0b3RhbCkpIDogMCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVTd2l0Y2hUb01vZGUpKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuLCBtb2Rlc1tiZXN0XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBYRnJlZShtb2Rlcyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhpRyAqLworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hNRQorICAgIGlmICggdXNlX3htZSAmJiBTRExfbW9kZWxpc3QgKSB7CisgICAgICAgIGludCBpOworCisjaWZkZWYgWDExTU9ERVNfREVCVUcKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJYTUU6IHNldF9iZXN0X3Jlc29sdXRpb24oKTogdyA9ICVkLCBoID0gJWRcbiIsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisjZW5kaWYKKyAgICAgICAgZm9yICggaT0wOyBTRExfbW9kZWxpc3RbaV07ICsraSApIHsKKyAgICAgICAgICAgIGlmICggKFNETF9tb2RlbGlzdFtpXS0+dyA+PSB3aWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgKFNETF9tb2RlbGlzdFtpXS0+aCA+PSBoZWlnaHQpICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIFNETF9tb2RlbGlzdFtpXSApIHsgLyogZm91bmQgb25lLCBsZXRzIHRyeSBpdCAqLworICAgICAgICAgICAgaW50IHcsIGg7ICAgICAgICAKKworICAgICAgICAgICAgLyogY2hlY2sgY3VycmVudCBtb2RlIHNvIHdlIGNhbiBhdm9pZCB1bmVjY2Vzc2FyeSBtb2RlIGNoYW5nZXMgKi8KKyAgICAgICAgICAgIGdldF9yZWFsX3Jlc29sdXRpb24odGhpcywgJncsICZoKTsKKworICAgICAgICAgICAgaWYgKCAoU0RMX21vZGVsaXN0W2ldLT53ICE9IHcpIHx8IChTRExfbW9kZWxpc3RbaV0tPmggIT0gaCkgKSB7CisjaWZkZWYgWDExTU9ERVNfREVCVUcKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhNRTogc2V0X2Jlc3RfcmVzb2x1dGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgIlhpR01pc2NDaGFuZ2VSZXNvbHV0aW9uOiAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+dywgU0RMX21vZGVsaXN0W2ldLT5oKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIFhpR01pc2NDaGFuZ2VSZXNvbHV0aW9uKFNETF9EaXNwbGF5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfU2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHZpZXcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPncsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUgKi8KKworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUgorICAgIGlmICggdXNlX3hyYW5kciAmJiBTRExfbW9kZWxpc3QgKSB7CisjaWZkZWYgWDExTU9ERVNfREVCVUcKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJYUkFORFI6IHNldF9iZXN0X3Jlc29sdXRpb24oKTogdyA9ICVkLCBoID0gJWRcbiIsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisjZW5kaWYKKyAgICAgICAgaW50IGksIG5zaXplczsKKyAgICAgICAgWFJSU2NyZWVuU2l6ZSAqc2l6ZXM7CisKKyAgICAgICAgLyogZmluZCB0aGUgc21hbGxlc3QgcmVzb2x1dGlvbiB0aGF0IGlzIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgdXNlciByZXF1ZXN0ZWQgKi8KKyAgICAgICAgc2l6ZXMgPSBYUlJDb25maWdTaXplcyhzY3JlZW5fY29uZmlnLCAmbnNpemVzKTsKKyAgICAgICAgZm9yICggaSA9IChuc2l6ZXMtMSk7IGkgPj0gMDsgaS0tICkgeworICAgICAgICAgICAgaWYgKCAoU0RMX21vZGVsaXN0W2ldLT53ID49IHdpZHRoKSAmJgorICAgICAgICAgICAgICAgICAoU0RMX21vZGVsaXN0W2ldLT5oID49IGhlaWdodCkgKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGkgPj0gMCAmJiBTRExfbW9kZWxpc3RbaV0gKSB7IC8qIGZvdW5kIG9uZSwgbGV0cyB0cnkgaXQgKi8KKyAgICAgICAgICAgIGludCB3LCBoOworCisgICAgICAgICAgICAvKiBjaGVjayBjdXJyZW50IG1vZGUgc28gd2UgY2FuIGF2b2lkIHVuZWNjZXNzYXJ5IG1vZGUgY2hhbmdlcyAqLworICAgICAgICAgICAgZ2V0X3JlYWxfcmVzb2x1dGlvbih0aGlzLCAmdywgJmgpOworCisgICAgICAgICAgICBpZiAoIChTRExfbW9kZWxpc3RbaV0tPncgIT0gdykgfHwgKFNETF9tb2RlbGlzdFtpXS0+aCAhPSBoKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZV9pZDsKKworI2lmZGVmIFgxMU1PREVTX0RFQlVHCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYUkFORFI6IHNldF9iZXN0X3Jlc29sdXRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJYWFJTZXRTY3JlZW5Db25maWc6ICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldLT53LCBTRExfbW9kZWxpc3RbaV0tPmgpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAvKiBmaW5kIHRoZSBtYXRjaGluZyBzaXplIGVudHJ5IGluZGV4ICovCisgICAgICAgICAgICAgICAgZm9yICggc2l6ZV9pZCA9IDA7IHNpemVfaWQgPCBuc2l6ZXM7ICsrc2l6ZV9pZCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc2l6ZXNbc2l6ZV9pZF0ud2lkdGggPT0gU0RMX21vZGVsaXN0W2ldLT53KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplc1tzaXplX2lkXS5oZWlnaHQgPT0gU0RMX21vZGVsaXN0W2ldLT5oKSApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBYUlJTZXRTY3JlZW5Db25maWcoU0RMX0Rpc3BsYXksIHNjcmVlbl9jb25maWcsIFNETF9Sb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2lkLCBzYXZlZF9yb3RhdGlvbiwgQ3VycmVudFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUiAqLworfQorCitzdGF0aWMgdm9pZCBnZXRfcmVhbF9yZXNvbHV0aW9uKF9USElTLCBpbnQqIHcsIGludCogaCkKK3sKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUKKyAgICBpZiAoIHVzZV94bWUgKSB7CisgICAgICAgIGludCByYWN0aXZlOworICAgICAgICBYaUdNaXNjUmVzb2x1dGlvbkluZm8gKm1vZGVsaXN0OworCisgICAgICAgIFhpR01pc2NRdWVyeVJlc29sdXRpb25zKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiB2aWV3ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYWN0aXZlLCAmbW9kZWxpc3QpOworICAgICAgICAqdyA9IG1vZGVsaXN0W3JhY3RpdmVdLndpZHRoOworICAgICAgICAqaCA9IG1vZGVsaXN0W3JhY3RpdmVdLmhlaWdodDsKKyNpZmRlZiBYMTFNT0RFU19ERUJVRworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhNRTogZ2V0X3JlYWxfcmVzb2x1dGlvbjogdyA9ICVkIGggPSAlZFxuIiwgKncsICpoKTsKKyNlbmRpZgorICAgICAgICBYRnJlZShtb2RlbGlzdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FICovCisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFCisgICAgaWYgKCB1c2VfdmlkbW9kZSApIHsKKyAgICAgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlTGluZSkgbW9kZTsKKyAgICAgICAgaW50IHVudXNlZDsKKworICAgICAgICBpZiAoIFNETF9OQU1FKFhGODZWaWRNb2RlR2V0TW9kZUxpbmUpKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuLCAmdW51c2VkLCAmbW9kZSkgKSB7CisgICAgICAgICAgICAqdyA9IG1vZGUuaGRpc3BsYXk7CisgICAgICAgICAgICAqaCA9IG1vZGUudmRpc3BsYXk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERSAqLworCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFJBTkRSCisgICAgaWYgKCB1c2VfeHJhbmRyICkgeworICAgICAgICBpbnQgbnNpemVzOworICAgICAgICBYUlJTY3JlZW5TaXplKiBzaXplczsKKworICAgICAgICBzaXplcyA9IFhSUkNvbmZpZ1NpemVzKHNjcmVlbl9jb25maWcsICZuc2l6ZXMpOworICAgICAgICBpZiAoIG5zaXplcyA+IDAgKSB7CisgICAgICAgICAgICBpbnQgY3VyX3NpemU7CisgICAgICAgICAgICBSb3RhdGlvbiBjdXJfcm90YXRpb247CisKKyAgICAgICAgICAgIGN1cl9zaXplID0gWFJSQ29uZmlnQ3VycmVudENvbmZpZ3VyYXRpb24oc2NyZWVuX2NvbmZpZywgJmN1cl9yb3RhdGlvbik7CisgICAgICAgICAgICBpZiAoIGN1cl9zaXplID49IDAgJiYgY3VyX3NpemUgPCBuc2l6ZXMgKSB7CisgICAgICAgICAgICAgICAgKncgPSBzaXplc1tjdXJfc2l6ZV0ud2lkdGg7CisgICAgICAgICAgICAgICAgKmggPSBzaXplc1tjdXJfc2l6ZV0uaGVpZ2h0OworICAgICAgICAgICAgfQorI2lmZGVmIFgxMU1PREVTX0RFQlVHCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhSQU5EUjogZ2V0X3JlYWxfcmVzb2x1dGlvbjogdyA9ICVkIGggPSAlZFxuIiwgKncsICpoKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUiAqLworCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKKyAgICBpZiAoIHVzZV94aW5lcmFtYSApIHsKKyAgICAgICAgKncgPSB4aW5lcmFtYV9pbmZvLndpZHRoOworICAgICAgICAqaCA9IHhpbmVyYW1hX2luZm8uaGVpZ2h0OworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BICovCisKKyAgICAqdyA9IERpc3BsYXlXaWR0aChTRExfRGlzcGxheSwgU0RMX1NjcmVlbik7CisgICAgKmggPSBEaXNwbGF5SGVpZ2h0KFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKK30KKworLyogQ2FsbGVkIGFmdGVyIG1hcHBpbmcgYSB3aW5kb3cgLSB3YWl0cyB1bnRpbCB0aGUgd2luZG93IGlzIG1hcHBlZCAqLwordm9pZCBYMTFfV2FpdE1hcHBlZChfVEhJUywgV2luZG93IHdpbikKK3sKKyAgICBYRXZlbnQgZXZlbnQ7CisgICAgZG8geworICAgICAgICBYTWFza0V2ZW50KFNETF9EaXNwbGF5LCBTdHJ1Y3R1cmVOb3RpZnlNYXNrLCAmZXZlbnQpOworICAgIH0gd2hpbGUgKCAoZXZlbnQudHlwZSAhPSBNYXBOb3RpZnkpIHx8IChldmVudC54bWFwLmV2ZW50ICE9IHdpbikgKTsKK30KKworLyogQ2FsbGVkIGFmdGVyIHVubWFwcGluZyBhIHdpbmRvdyAtIHdhaXRzIHVudGlsIHRoZSB3aW5kb3cgaXMgdW5tYXBwZWQgKi8KK3ZvaWQgWDExX1dhaXRVbm1hcHBlZChfVEhJUywgV2luZG93IHdpbikKK3sKKyAgICBYRXZlbnQgZXZlbnQ7CisgICAgZG8geworICAgICAgICBYTWFza0V2ZW50KFNETF9EaXNwbGF5LCBTdHJ1Y3R1cmVOb3RpZnlNYXNrLCAmZXZlbnQpOworICAgIH0gd2hpbGUgKCAoZXZlbnQudHlwZSAhPSBVbm1hcE5vdGlmeSkgfHwgKGV2ZW50Lnh1bm1hcC5ldmVudCAhPSB3aW4pICk7Cit9CisKK3N0YXRpYyB2b2lkIG1vdmVfY3Vyc29yX3RvKF9USElTLCBpbnQgeCwgaW50IHkpCit7CisgICAgWFdhcnBQb2ludGVyKFNETF9EaXNwbGF5LCBOb25lLCBTRExfUm9vdCwgMCwgMCwgMCwgMCwgeCwgeSk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2RlZmF1bHRfdmlzdWFsKF9USElTKQoreworICAgIGludCBpOworICAgIGludCBuID0gdGhpcy0+aGlkZGVuLT5udmlzdWFsczsKKyAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKKyAgICAgICAgaWYgKHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS52aXN1YWwgPT0gRGVmYXVsdFZpc3VhbChTRExfRGlzcGxheSwgU0RMX1NjcmVlbikpIHJldHVybiBuOworICAgIH0KKyAgICB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbbl0uZGVwdGggPSBEZWZhdWx0RGVwdGgoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOzsKKyAgICB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbbl0udmlzdWFsID0gRGVmYXVsdFZpc3VhbChTRExfRGlzcGxheSwgU0RMX1NjcmVlbik7OworICAgIHRoaXMtPmhpZGRlbi0+bnZpc3VhbHMrKzsKKyAgICByZXR1cm4odGhpcy0+aGlkZGVuLT5udmlzdWFscyk7Cit9CitzdGF0aWMgaW50IGFkZF92aXN1YWwoX1RISVMsIGludCBkZXB0aCwgaW50IGNsYXNzKQoreworICAgIFhWaXN1YWxJbmZvIHZpOworICAgIGlmKFhNYXRjaFZpc3VhbEluZm8oU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sIGRlcHRoLCBjbGFzcywgJnZpKSkgeworICAgICAgICBpbnQgbiA9IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHM7CisgICAgICAgIHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tuXS5kZXB0aCA9IHZpLmRlcHRoOworICAgICAgICB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbbl0udmlzdWFsID0gdmkudmlzdWFsOworICAgICAgICB0aGlzLT5oaWRkZW4tPm52aXN1YWxzKys7CisgICAgfQorICAgIHJldHVybih0aGlzLT5oaWRkZW4tPm52aXN1YWxzKTsKK30KK3N0YXRpYyBpbnQgYWRkX3Zpc3VhbF9ieWlkKF9USElTLCBjb25zdCBjaGFyICp2aXN1YWxfaWQpCit7CisgICAgWFZpc3VhbEluZm8gKnZpLCB0ZW1wbGF0ZTsKKyAgICBpbnQgbnZpczsKKworICAgIGlmICggdmlzdWFsX2lkICkgeworICAgICAgICBTRExfbWVtc2V0KCZ0ZW1wbGF0ZSwgMCwgKHNpemVvZiB0ZW1wbGF0ZSkpOworICAgICAgICB0ZW1wbGF0ZS52aXN1YWxpZCA9IFNETF9zdHJ0b2wodmlzdWFsX2lkLCBOVUxMLCAwKTsKKyAgICAgICAgdmkgPSBYR2V0VmlzdWFsSW5mbyhTRExfRGlzcGxheSwgVmlzdWFsSURNYXNrLCAmdGVtcGxhdGUsICZudmlzKTsKKyAgICAgICAgaWYgKCB2aSApIHsKKyAgICAgICAgICAgIGludCBuID0gdGhpcy0+aGlkZGVuLT5udmlzdWFsczsKKyAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tuXS5kZXB0aCA9IHZpLT5kZXB0aDsKKyAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tuXS52aXN1YWwgPSB2aS0+dmlzdWFsOworICAgICAgICAgICAgdGhpcy0+aGlkZGVuLT5udmlzdWFscysrOworICAgICAgICAgICAgWEZyZWUodmkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybih0aGlzLT5oaWRkZW4tPm52aXN1YWxzKTsKK30KKworLyogR2xvYmFsIGZvciB0aGUgZXJyb3IgaGFuZGxlciAqLworaW50IHZtX2V2ZW50LCB2bV9lcnJvciA9IC0xOworCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKK3N0YXRpYyBpbnQgQ2hlY2tYaW5lcmFtYShfVEhJUywgaW50ICptYWpvciwgaW50ICptaW5vcikKK3sKKyAgICBjb25zdCBjaGFyICplbnY7CisKKyAgICAvKiBEZWZhdWx0IHRoZSBleHRlbnNpb24gbm90IGF2YWlsYWJsZSAqLworICAgICptYWpvciA9ICptaW5vciA9IDA7CisKKyAgICAvKiBBbGxvdyBlbnZpcm9ubWVudCBvdmVycmlkZSAqLworICAgIGVudiA9IGdldGVudigiU0RMX1ZJREVPX1gxMV9YSU5FUkFNQSIpOworICAgIGlmICggZW52ICYmICFTRExfYXRvaShlbnYpICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBRdWVyeSB0aGUgZXh0ZW5zaW9uIHZlcnNpb24gKi8KKyAgICBpZiAoICFTRExfTkFNRShYaW5lcmFtYVF1ZXJ5RXh0ZW5zaW9uKShTRExfRGlzcGxheSwgbWFqb3IsIG1pbm9yKSB8fAorICAgICAgICAgIVNETF9OQU1FKFhpbmVyYW1hSXNBY3RpdmUpKFNETF9EaXNwbGF5KSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BICovCisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKK3N0YXRpYyBpbnQgQ2hlY2tYUmFuZFIoX1RISVMsIGludCAqbWFqb3IsIGludCAqbWlub3IpCit7CisgICAgY29uc3QgY2hhciAqZW52OworCisgICAgLyogRGVmYXVsdCB0aGUgZXh0ZW5zaW9uIG5vdCBhdmFpbGFibGUgKi8KKyAgICAqbWFqb3IgPSAqbWlub3IgPSAwOworCisgICAgLyogQWxsb3cgZW52aXJvbm1lbnQgb3ZlcnJpZGUgKi8KKyAgICBlbnYgPSBnZXRlbnYoIlNETF9WSURFT19YMTFfWFJBTkRSIik7CisgICAgaWYgKCBlbnYgJiYgIVNETF9hdG9pKGVudikgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFRoaXMgZGVmYXVsdHMgb2ZmIG5vdywgZHVlIHRvIEtERSB3aW5kb3cgbWF4aW1pemUgcHJvYmxlbXMgKi8KKyAgICBpZiAoICFlbnYgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggIVNETF9YMTFfSEFWRV9YUkFORFIgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFF1ZXJ5IHRoZSBleHRlbnNpb24gdmVyc2lvbiAqLworICAgIGlmICggIVhSUlF1ZXJ5VmVyc2lvbihTRExfRGlzcGxheSwgbWFqb3IsIG1pbm9yKSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUiAqLworCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQorc3RhdGljIGludCBDaGVja1ZpZE1vZGUoX1RISVMsIGludCAqbWFqb3IsIGludCAqbWlub3IpCit7CisgICAgY29uc3QgY2hhciAqZW52OworCisgICAgLyogRGVmYXVsdCB0aGUgZXh0ZW5zaW9uIG5vdCBhdmFpbGFibGUgKi8KKyAgICAqbWFqb3IgPSAqbWlub3IgPSAwOworCisgICAgLyogQWxsb3cgZW52aXJvbm1lbnQgb3ZlcnJpZGUgKi8KKyAgICBlbnYgPSBnZXRlbnYoIlNETF9WSURFT19YMTFfVklETU9ERSIpOworICAgIGlmICggZW52ICYmICFTRExfYXRvaShlbnYpICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgLyogTWV0cm8tWCA0LjMuMCBhbmQgZWFybGllciBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICBYRjg2VmlkTW9kZUdldEFsbE1vZGVMaW5lcygpIC0gaXQgaGFuZ3MgdGhlIGNsaWVudC4KKyAgICAgKi8KKyAgICBpZiAoIFNETF9zdHJjbXAoU2VydmVyVmVuZG9yKFNETF9EaXNwbGF5KSwgIk1ldHJvIExpbmsgSW5jb3Jwb3JhdGVkIikgPT0gMCApIHsKKyAgICAgICAgRklMRSAqbWV0cm9fZnA7CisKKyAgICAgICAgbWV0cm9fZnAgPSBmb3BlbigiL3Vzci9YMTFSNi9saWIvWDExL01ldHJvLy52ZXJzaW9uIiwgInIiKTsKKyAgICAgICAgaWYgKCBtZXRyb19mcCAhPSBOVUxMICkgeworICAgICAgICAgICAgaW50IG1ham9yLCBtaW5vciwgcGF0Y2gsIHZlcnNpb24sIHNjYW5udW07CisgICAgICAgICAgICBtYWpvciA9IDA7IG1pbm9yID0gMDsgcGF0Y2ggPSAwOworICAgICAgICAgICAgc2Nhbm51bSA9IGZzY2FuZihtZXRyb19mcCwgIiVkLiVkLiVkIiwgJm1ham9yLCAmbWlub3IsICZwYXRjaCk7CisgICAgICAgICAgICBmY2xvc2UobWV0cm9fZnApOworICAgICAgICAgICAgaWYgKCAoc2Nhbm51bSA8IDApIHx8IChzY2FubnVtID4gMykgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAvKiB3ZSBuZWVkIF9zb21ldGhpbmdfIHVzZWZ1bCBmcm9tIGZzY2FuZigpLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmVyc2lvbiA9IG1ham9yKjEwMCttaW5vcioxMCtwYXRjaDsKKyAgICAgICAgICAgIGlmICggdmVyc2lvbiA8IDQzMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFF1ZXJ5IHRoZSBleHRlbnNpb24gdmVyc2lvbiAqLworICAgIHZtX2Vycm9yID0gLTE7CisgICAgaWYgKCAhU0RMX05BTUUoWEY4NlZpZE1vZGVRdWVyeUV4dGVuc2lvbikoU0RMX0Rpc3BsYXksICZ2bV9ldmVudCwgJnZtX2Vycm9yKSB8fAorICAgICAgICAgIVNETF9OQU1FKFhGODZWaWRNb2RlUXVlcnlWZXJzaW9uKShTRExfRGlzcGxheSwgbWFqb3IsIG1pbm9yKSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUgKi8KKworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hNRQorc3RhdGljIGludCBDaGVja1hNRShfVEhJUywgaW50ICptYWpvciwgaW50ICptaW5vcikKK3sKKyAgICBjb25zdCBjaGFyICplbnY7CisKKyAgICAvKiBEZWZhdWx0IHRoZSBleHRlbnNpb24gbm90IGF2YWlsYWJsZSAqLworICAgICptYWpvciA9ICptaW5vciA9IDA7CisKKyAgICAvKiBBbGxvdyBlbnZpcm9ubWVudCBvdmVycmlkZSAqLworICAgIGVudiA9IGdldGVudigiU0RMX1ZJREVPX1gxMV9WSURNT0RFIik7CisgICAgaWYgKCBlbnYgJiYgIVNETF9hdG9pKGVudikgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICAvKiBRdWVyeSB0aGUgZXh0ZW5zaW9uIHZlcnNpb24gKi8KKyAgICBpZiAoICFYaUdNaXNjUXVlcnlWZXJzaW9uKFNETF9EaXNwbGF5LCBtYWpvciwgbWlub3IpICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FICovCisKK2ludCBYMTFfR2V0VmlkZW9Nb2RlcyhfVEhJUykKK3sKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQorICAgIGludCB4aW5lcmFtYV9tYWpvciwgeGluZXJhbWFfbWlub3I7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKKyAgICBpbnQgeHJhbmRyX21ham9yLCB4cmFuZHJfbWlub3I7CisgICAgaW50IG5zaXplczsKKyAgICBYUlJTY3JlZW5TaXplICpzaXplczsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKKyAgICBpbnQgdm1fbWFqb3IsIHZtX21pbm9yOworICAgIGludCBubW9kZXM7CisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgKiptb2RlczsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hNRQorICAgIGludCB4bWVfbWFqb3IsIHhtZV9taW5vcjsKKyAgICBpbnQgcmFjdGl2ZSwgbnVtbW9kZXM7CisgICAgWGlHTWlzY1Jlc29sdXRpb25JbmZvICptb2RlbGlzdDsKKyNlbmRpZgorICAgIGludCBpLCBuOworICAgIGludCBzY3JlZW5fdzsKKyAgICBpbnQgc2NyZWVuX2g7CisKKyAgICB1c2VfeGluZXJhbWEgPSAwOworICAgIHVzZV94cmFuZHIgPSAwOworICAgIHVzZV92aWRtb2RlID0gMDsKKyAgICB1c2VfeG1lID0gMDsKKyAgICBzY3JlZW5fdyA9IERpc3BsYXlXaWR0aChTRExfRGlzcGxheSwgU0RMX1NjcmVlbik7CisgICAgc2NyZWVuX2ggPSBEaXNwbGF5SGVpZ2h0KFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKKworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BCisgICAgLyogUXVlcnkgWGluZXJhbWEgZXh0ZW50aW9uICovCisgICAgaWYgKCBDaGVja1hpbmVyYW1hKHRoaXMsICZ4aW5lcmFtYV9tYWpvciwgJnhpbmVyYW1hX21pbm9yKSApIHsKKyAgICAgICAgLyogRmluZCBvdXQgd2hpY2ggc2NyZWVuIGlzIHRoZSBkZXNpcmVkIG9uZSAqLworICAgICAgICBpbnQgZGVzaXJlZCA9IC0xOworICAgICAgICBpbnQgc2NyZWVuczsKKyAgICAgICAgaW50IHcsIGg7CisgICAgICAgIFNETF9OQU1FKFhpbmVyYW1hU2NyZWVuSW5mbykgKnhpbmVyYW1hOworCisgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhYmxlID0gU0RMX2dldGVudigiU0RMX1ZJREVPX0ZVTExTQ1JFRU5fRElTUExBWSIpOworCWlmICggIXZhcmlhYmxlICkgeworICAgICAgICAJdmFyaWFibGUgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fRlVMTFNDUkVFTl9IRUFEIik7CisJfQorICAgICAgICBpZiAoIHZhcmlhYmxlICkgeworICAgICAgICAgICAgICAgIGRlc2lyZWQgPSBTRExfYXRvaSh2YXJpYWJsZSk7CisgICAgICAgIH0KKyNpZmRlZiBYMTFNT0RFU19ERUJVRworICAgICAgICBwcmludGYoIlgxMSBkZXRlY3RlZCBYaW5lcmFtYTpcbiIpOworI2VuZGlmCisgICAgICAgIHhpbmVyYW1hID0gU0RMX05BTUUoWGluZXJhbWFRdWVyeVNjcmVlbnMpKFNETF9EaXNwbGF5LCAmc2NyZWVucyk7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgc2NyZWVuczsgaSsrICkgeworI2lmZGVmIFgxMU1PREVTX0RFQlVHCisgICAgICAgICAgICBwcmludGYoInhpbmVyYW1hICVkOiAlZHglZCslZCslZFxuIiwKKyAgICAgICAgICAgICAgICB4aW5lcmFtYVtpXS5zY3JlZW5fbnVtYmVyLAorICAgICAgICAgICAgICAgIHhpbmVyYW1hW2ldLndpZHRoLCB4aW5lcmFtYVtpXS5oZWlnaHQsCisgICAgICAgICAgICAgICAgeGluZXJhbWFbaV0ueF9vcmcsIHhpbmVyYW1hW2ldLnlfb3JnKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKCB4aW5lcmFtYVtpXS5zY3JlZW5fbnVtYmVyID09IGRlc2lyZWQgKSB7CisgICAgICAgICAgICAgICAgdXNlX3hpbmVyYW1hID0gMTsKKyAgICAgICAgICAgICAgICB4aW5lcmFtYV9pbmZvID0geGluZXJhbWFbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgWEZyZWUoeGluZXJhbWEpOworCisgICAgICAgIGlmICggdXNlX3hpbmVyYW1hICkgeworICAgICAgICAgICAgU0RMX21vZGVsaXN0ID0gKFNETF9SZWN0ICoqKVNETF9tYWxsb2MoMypzaXplb2YoU0RMX1JlY3QgKikpOworICAgICAgICAgICAgaWYgKCAhU0RMX21vZGVsaXN0ICkgeworICAgICAgICAgICAgICAgIFNETF9PdXRPZk1lbW9yeSgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQWRkIHRoZSBmdWxsIHhpbmVyYW1hIG1vZGUgKi8KKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgdyA9IHhpbmVyYW1hX2luZm8ud2lkdGg7CisgICAgICAgICAgICBoID0geGluZXJhbWFfaW5mby5oZWlnaHQ7CisgICAgICAgICAgICBpZiAoIHNjcmVlbl93ID4gdyB8fCBzY3JlZW5faCA+IGgpIHsKKyAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0gPSAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpOworICAgICAgICAgICAgICAgIGlmICggU0RMX21vZGVsaXN0W25dICkgeworICAgICAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPnggPSAwOworICAgICAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPnkgPSAwOworICAgICAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPncgPSBzY3JlZW5fdzsKKyAgICAgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT5oID0gc2NyZWVuX2g7CisgICAgICAgICAgICAgICAgICAgICsrbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEFkZCB0aGUgaGVhZCB4aW5lcmFtYSBtb2RlICovCisgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0gPSAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpOworICAgICAgICAgICAgaWYgKCBTRExfbW9kZWxpc3Rbbl0gKSB7CisgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT54ID0gMDsKKyAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPnkgPSAwOworICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+dyA9IHc7CisgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT5oID0gaDsKKyAgICAgICAgICAgICAgICArK247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hJTkVSQU1BICovCisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKKyAgICAvKiBYUmFuZFIgKi8KKyAgICAvKiByZXF1aXJlIGF0IGxlYXN0IFhSYW5kUiB2MS4wIChhcmJpdHJhcnkpICovCisgICAgaWYgKCBDaGVja1hSYW5kUih0aGlzLCAmeHJhbmRyX21ham9yLCAmeHJhbmRyX21pbm9yKSAmJiAoeHJhbmRyX21ham9yID49IDEpICkKKyAgICB7CisjaWZkZWYgWDExTU9ERVNfREVCVUcKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJYUkFORFI6IFhSUlF1ZXJ5VmVyc2lvbjogViVkLiVkXG4iLAorICAgICAgICAgICAgICAgIHhyYW5kcl9tYWpvciwgeHJhbmRyX21pbm9yKTsKKyNlbmRpZgorCisgICAgICAgIC8qIHNhdmUgdGhlIHNjcmVlbiBjb25maWd1cmF0aW9uIHNpbmNlIHdlIG11c3QgcmVmZXJlbmNlIGl0CisgICAgICAgICAgIGVhY2ggdGltZSB3ZSB0b2dnbGUgbW9kZXMuCisgICAgICAgICovCisgICAgICAgIHNjcmVlbl9jb25maWcgPSBYUlJHZXRTY3JlZW5JbmZvKFNETF9EaXNwbGF5LCBTRExfUm9vdCk7CisKKyAgICAgICAgLyogcmV0cmlldmUgdGhlIGxpc3Qgb2YgcmVzb2x1dGlvbiAqLworICAgICAgICBzaXplcyA9IFhSUkNvbmZpZ1NpemVzKHNjcmVlbl9jb25maWcsICZuc2l6ZXMpOworICAgICAgICBpZiAobnNpemVzID4gMCkgeworICAgICAgICAgICAgaWYgKCBTRExfbW9kZWxpc3QgKSB7CisgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IFNETF9tb2RlbGlzdFtpXTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTRExfZnJlZShTRExfbW9kZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0RMX21vZGVsaXN0ID0gKFNETF9SZWN0ICoqKW1hbGxvYygobnNpemVzKzEpKnNpemVvZihTRExfUmVjdCAqKSk7CisgICAgICAgICAgICBpZiAoICFTRExfbW9kZWxpc3QgKSB7CisgICAgICAgICAgICAgICAgU0RMX091dE9mTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICggaT0wOyBpIDwgbnNpemVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaWYgKChTRExfbW9kZWxpc3RbaV0gPQorICAgICAgICAgICAgICAgICAgICAgKFNETF9SZWN0ICopbWFsbG9jKHNpemVvZihTRExfUmVjdCkpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBYMTFNT0RFU19ERUJVRworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWFJBTkRSOiBtb2RlID0gJTRkLCB3ID0gJTRkLCBoID0gJTRkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgc2l6ZXNbaV0ud2lkdGgsIHNpemVzW2ldLmhlaWdodCk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+eCA9IDA7CisgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldLT55ID0gMDsKKyAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPncgPSBzaXplc1tpXS53aWR0aDsKKyAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPmggPSBzaXplc1tpXS5oZWlnaHQ7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHNvcnQgdGhlIG1vZGUgbGlzdCBkZXNjZW5kaW5nIGFzIFNETCBleHBlY3RzICovCisgICAgICAgICAgICBTRExfcXNvcnQoU0RMX21vZGVsaXN0LCBuc2l6ZXMsIHNpemVvZiAqU0RMX21vZGVsaXN0LCBjbXBtb2RlbGlzdCk7CisgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0gPSBOVUxMOyAvKiB0ZXJtaW5hdG9yICovCisKKyAgICAgICAgICAgIHVzZV94cmFuZHIgPSB4cmFuZHJfbWFqb3IgKiAxMDAgKyB4cmFuZHJfbWlub3I7CisgICAgICAgICAgICBzYXZlZF9zaXplX2lkID0gWFJSQ29uZmlnQ3VycmVudENvbmZpZ3VyYXRpb24oc2NyZWVuX2NvbmZpZywgJnNhdmVkX3JvdGF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIgKi8KKworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKKyAgICAvKiBYVmlkTW9kZSAqLworICAgIGlmICggIXVzZV94cmFuZHIgJiYKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQorICAgICAgICAgKCF1c2VfeGluZXJhbWEgfHwgeGluZXJhbWFfaW5mby5zY3JlZW5fbnVtYmVyID09IC0xKSAmJgorI2VuZGlmCisgICAgICAgICBDaGVja1ZpZE1vZGUodGhpcywgJnZtX21ham9yLCAmdm1fbWlub3IpICYmCisgICAgICAgICBTRExfTkFNRShYRjg2VmlkTW9kZUdldEFsbE1vZGVMaW5lcykoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sJm5tb2RlcywmbW9kZXMpICkKKyAgICB7CisjaWZkZWYgWDExTU9ERVNfREVCVUcKKyAgICAgICAgcHJpbnRmKCJWaWRNb2RlIG1vZGVzOiAodW5zb3J0ZWQpXG4iKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBubW9kZXM7ICsraSApIHsKKyAgICAgICAgICAgIHByaW50ZigiTW9kZSAlZDogJWQgeCAlZCBAICVkXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICBtb2Rlc1tpXS0+aGRpc3BsYXksIG1vZGVzW2ldLT52ZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgKG1vZGVzW2ldLT5odG90YWwgJiYgbW9kZXNbaV0tPnZ0b3RhbCkgPyAoMTAwMCAqIG1vZGVzW2ldLT5kb3RjbG9jayAvIChtb2Rlc1tpXS0+aHRvdGFsICogbW9kZXNbaV0tPnZ0b3RhbCkpIDogMCApOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKCBTRExfbW9kZWxpc3QgKSB7CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgU0RMX21vZGVsaXN0W2ldOyArK2kgKSB7CisgICAgICAgICAgICAgICAgU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNETF9mcmVlKFNETF9tb2RlbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgU0RMX21vZGVsaXN0ID0gKFNETF9SZWN0ICoqKVNETF9tYWxsb2MoKG5tb2RlcysyKSpzaXplb2YoU0RMX1JlY3QgKikpOworICAgICAgICBpZiAoICFTRExfbW9kZWxpc3QgKSB7CisgICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBTRExfcXNvcnQobW9kZXMsIG5tb2Rlcywgc2l6ZW9mICptb2RlcywgY21wbW9kZXMpOworICAgICAgICBuID0gMDsKKyAgICAgICAgZm9yICggaT0wOyBpPG5tb2RlczsgKytpICkgeworICAgICAgICAgICAgaW50IHcsIGg7CisKKyAgICAgICAgICAgIC8qIEVsaW1pbmF0ZSBkdXBsaWNhdGUgbW9kZXMgd2l0aCBkaWZmZXJlbnQgcmVmcmVzaCByYXRlcyAqLworICAgICAgICAgICAgaWYgKCBpID4gMCAmJgorICAgICAgICAgICAgICAgICBtb2Rlc1tpXS0+aGRpc3BsYXkgPT0gbW9kZXNbaS0xXS0+aGRpc3BsYXkgJiYKKyAgICAgICAgICAgICAgICAgbW9kZXNbaV0tPnZkaXNwbGF5ID09IG1vZGVzW2ktMV0tPnZkaXNwbGF5ICkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBhZGQgdGhlIHNjcmVlbiBzaXplIChYaW5lcmFtYSkgKi8KKyAgICAgICAgICAgIHcgPSBtb2Rlc1tpXS0+aGRpc3BsYXk7CisgICAgICAgICAgICBoID0gbW9kZXNbaV0tPnZkaXNwbGF5OworICAgICAgICAgICAgaWYgKCAoc2NyZWVuX3cgKiBzY3JlZW5faCkgPj0gKHcgKiBoKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChzY3JlZW5fdyAhPSB3KSB8fCAoc2NyZWVuX2ggIT0gaCkgKSB7CisgICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7CisgICAgICAgICAgICAgICAgICAgIGlmICggU0RMX21vZGVsaXN0W25dICkgeworICAgICAgICAgICAgICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT54ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+eSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPncgPSBzY3JlZW5fdzsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+aCA9IHNjcmVlbl9oOworICAgICAgICAgICAgICAgICAgICAgICAgKytuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNjcmVlbl93ID0gMDsKKyAgICAgICAgICAgICAgICBzY3JlZW5faCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEFkZCB0aGUgc2l6ZSBmcm9tIHRoZSB2aWRlbyBtb2RlIGxpc3QgKi8KKyAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXSA9IChTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7CisgICAgICAgICAgICBpZiAoIFNETF9tb2RlbGlzdFtuXSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT54ID0gMDsKKyAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+eSA9IDA7CisgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPncgPSB3OworICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT5oID0gaDsKKyAgICAgICAgICAgICsrbjsKKyAgICAgICAgfQorICAgICAgICBTRExfbW9kZWxpc3Rbbl0gPSBOVUxMOworICAgICAgICBYRnJlZShtb2Rlcyk7CisKKyAgICAgICAgdXNlX3ZpZG1vZGUgPSB2bV9tYWpvciAqIDEwMCArIHZtX21pbm9yOworICAgICAgICBzYXZlX21vZGUodGhpcyk7CisgICAgfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUgKi8KKworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hNRQorICAgIC8qIFhpRyAqLworICAgIG1vZGVsaXN0ID0gTlVMTDsKKyAgICAvKiBmaXJzdCBsZXRzIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBleHRlbnNpb24sIGFuZCBpdCdzIGF0IGxlYXN0IHYyLjAgKi8KKyAgICBpZiAoIENoZWNrWE1FKHRoaXMsICZ4bWVfbWFqb3IsICZ4bWVfbWlub3IpICYmIHhtZV9tYWpvciA+PSAyICYmCisgICAgICAgICAobnVtbW9kZXMgPSBYaUdNaXNjUXVlcnlSZXNvbHV0aW9ucyhTRExfRGlzcGxheSwgU0RMX1NjcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHZpZXcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYWN0aXZlLCAmbW9kZWxpc3QpKSA+IDEgKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gd2UgYWN0dWFsbHkgaGF2ZSBzb21lICovCisgICAgICAgIGludCBqOworCisgICAgICAgIC8qIFdlIGdldCB0aGUgbGlzdCBhbHJlYWR5IHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyLgorICAgICAgICAgICBXZSdsbCBjb3B5IGl0IGluIHJldmVyc2Ugb3JkZXIgc28gU0RMIGlzIGhhcHB5ICovCisjaWZkZWYgWDExTU9ERVNfREVCVUcKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJYTUU6IG51bW1vZGVzID0gJWQsIGFjdGl2ZSBtb2RlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgbnVtbW9kZXMsIHJhY3RpdmUpOworI2VuZGlmCisgICAgICAgIGlmICggU0RMX21vZGVsaXN0ICkgeworICAgICAgICAgICAgZm9yICggaSA9IDA7IFNETF9tb2RlbGlzdFtpXTsgKytpICkgeworICAgICAgICAgICAgICAgIFNETF9mcmVlKFNETF9tb2RlbGlzdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTRExfZnJlZShTRExfbW9kZWxpc3QpOworICAgICAgICB9CisgICAgICAgIFNETF9tb2RlbGlzdCA9IChTRExfUmVjdCAqKilTRExfbWFsbG9jKChudW1tb2RlcysxKSpzaXplb2YoU0RMX1JlY3QgKikpOworICAgICAgICBpZiAoICFTRExfbW9kZWxpc3QgKSB7CisgICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCBpPTAsIGo9bnVtbW9kZXMtMTsgaj49MDsgaSsrLCBqLS0gKSB7CisgICAgICAgICAgICBpZiAoKFNETF9tb2RlbGlzdFtpXSA9IAorICAgICAgICAgICAgICAgICAoU0RMX1JlY3QgKilTRExfbWFsbG9jKHNpemVvZihTRExfUmVjdCkpKSA9PSBOVUxMKQorICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBYMTFNT0RFU19ERUJVRworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYTUU6IG1vZGUgPSAlNGQsIHcgPSAlNGQsIGggPSAlNGRcbiIsCisgICAgICAgICAgICAgICAgICAgaSwgbW9kZWxpc3RbaV0ud2lkdGgsIG1vZGVsaXN0W2ldLmhlaWdodCk7CisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU0RMX21vZGVsaXN0W2ldLT54ID0gMDsKKyAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+eSA9IDA7CisgICAgICAgICAgICBTRExfbW9kZWxpc3RbaV0tPncgPSBtb2RlbGlzdFtqXS53aWR0aDsKKyAgICAgICAgICAgIFNETF9tb2RlbGlzdFtpXS0+aCA9IG1vZGVsaXN0W2pdLmhlaWdodDsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIFNETF9tb2RlbGlzdFtpXSA9IE5VTEw7IC8qIHRlcm1pbmF0b3IgKi8KKworICAgICAgICB1c2VfeG1lID0geG1lX21ham9yICogMTAwICsgeG1lX21pbm9yOworICAgICAgICBzYXZlZF9yZXMgPSBtb2RlbGlzdFtyYWN0aXZlXTsgLyogc2F2ZSB0aGUgY3VycmVudCByZXNvbHV0aW9uICovCisgICAgfQorICAgIGlmICggbW9kZWxpc3QgKSB7CisgICAgICAgIFhGcmVlKG1vZGVsaXN0KTsKKyAgICB9CisjZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FICovCisKKyAgICB7CisJLyogSXQncyBpbnRlcmVzdGluZyB0byBub3RlIHRoYXQgaWYgd2UgYWxsb3cgMzIgYml0IGRlcHRocywKKwkgICB3ZSBnZXQgYSB2aXN1YWwgd2l0aCBhbiBhbHBoYSBtYXNrIG9uIGNvbXBvc2l0ZSBzZXJ2ZXJzLgorICAgICAgICBzdGF0aWMgaW50IGRlcHRoX2xpc3RbXSA9IHsgMzIsIDI0LCAxNiwgMTUsIDggfTsKKwkqLworICAgICAgICBzdGF0aWMgaW50IGRlcHRoX2xpc3RbXSA9IHsgMjQsIDE2LCAxNSwgOCB9OworICAgICAgICBpbnQgaiwgbnA7CisgICAgICAgIGludCB1c2VfZGlyZWN0Y29sb3IgPSAxOworICAgICAgICBYUGl4bWFwRm9ybWF0VmFsdWVzICpwZjsKKworICAgICAgICAvKiBTZWFyY2ggZm9yIHRoZSB2aXN1YWxzIGluIGRlZXBlc3QtZmlyc3Qgb3JkZXIsIHNvIHRoYXQgdGhlIGZpcnN0CisgICAgICAgICAgIHdpbGwgYmUgdGhlIHJpY2hlc3Qgb25lICovCisgICAgICAgIGlmICggU0RMX2dldGVudigiU0RMX1ZJREVPX1gxMV9OT0RJUkVDVENPTE9SIikgKSB7CisgICAgICAgICAgICAgICAgdXNlX2RpcmVjdGNvbG9yID0gMDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLT5oaWRkZW4tPm52aXN1YWxzID0gMDsKKyAgICAgICAgaWYgKCAhIGFkZF92aXN1YWxfYnlpZCh0aGlzLCBTRExfZ2V0ZW52KCJTRExfVklERU9fWDExX1ZJU1VBTElEIikpICkgeworICAgICAgICAgICAgICAgIGZvciAoIGk9MDsgaTxTRExfYXJyYXlzaXplKGRlcHRoX2xpc3QpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRlcHRoX2xpc3RbaV0gPiA4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHVzZV9kaXJlY3Rjb2xvciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdmlzdWFsKHRoaXMsIGRlcHRoX2xpc3RbaV0sIERpcmVjdENvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdmlzdWFsKHRoaXMsIGRlcHRoX2xpc3RbaV0sIFRydWVDb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdmlzdWFsKHRoaXMsIGRlcHRoX2xpc3RbaV0sIFBzZXVkb0NvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3Zpc3VhbCh0aGlzLCBkZXB0aF9saXN0W2ldLCBTdGF0aWNDb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZF9kZWZhdWx0X3Zpc3VhbCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHRoaXMtPmhpZGRlbi0+bnZpc3VhbHMgPT0gMCApIHsKKyAgICAgICAgICAgIFNETF9TZXRFcnJvcigiRm91bmQgbm8gc3VmZmljaWVudGx5IGNhcGFibGUgWDExIHZpc3VhbHMiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIC8qIGxvb2sgdXAgdGhlIHBpeGVsIHF1YW50dW0gZm9yIGVhY2ggZGVwdGggKi8KKyAgICAgICAgcGYgPSBYTGlzdFBpeG1hcEZvcm1hdHMoU0RMX0Rpc3BsYXksICZucCk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHM7IGkrKykgeworICAgICAgICAgICAgaW50IGQgPSB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uZGVwdGg7CisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBucDsgaisrKQorICAgICAgICAgICAgICAgIGlmKHBmW2pdLmRlcHRoID09IGQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLmJwcCA9IGogPCBucCA/IHBmW2pdLmJpdHNfcGVyX3BpeGVsIDogZDsKKyAgICAgICAgfQorCisgICAgICAgIFhGcmVlKHBmKTsKKyAgICB9CisKKyAgICBpZiAoIFNETF9tb2RlbGlzdCA9PSBOVUxMICkgeworICAgICAgICBTRExfbW9kZWxpc3QgPSAoU0RMX1JlY3QgKiopU0RMX21hbGxvYygoMSsxKSpzaXplb2YoU0RMX1JlY3QgKikpOworICAgICAgICBpZiAoICFTRExfbW9kZWxpc3QgKSB7CisgICAgICAgICAgICBTRExfT3V0T2ZNZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBuID0gMDsKKyAgICAgICAgU0RMX21vZGVsaXN0W25dID0gKFNETF9SZWN0ICopU0RMX21hbGxvYyhzaXplb2YoU0RMX1JlY3QpKTsKKyAgICAgICAgaWYgKCBTRExfbW9kZWxpc3Rbbl0gKSB7CisgICAgICAgICAgICBTRExfbW9kZWxpc3Rbbl0tPnggPSAwOworICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT55ID0gMDsKKyAgICAgICAgICAgIFNETF9tb2RlbGlzdFtuXS0+dyA9IHNjcmVlbl93OworICAgICAgICAgICAgU0RMX21vZGVsaXN0W25dLT5oID0gc2NyZWVuX2g7CisgICAgICAgICAgICArK247CisgICAgICAgIH0KKyAgICAgICAgU0RMX21vZGVsaXN0W25dID0gTlVMTDsKKyAgICB9CisKKyNpZmRlZiBYMTFNT0RFU19ERUJVRworICAgIGlmICggdXNlX3hpbmVyYW1hICkgeworICAgICAgICBwcmludGYoIlhpbmVyYW1hIGlzIGVuYWJsZWRcbiIpOworICAgIH0KKworICAgIGlmICggdXNlX3hyYW5kciApIHsKKyAgICAgICAgcHJpbnRmKCJYUmFuZFIgaXMgZW5hYmxlZFxuIik7CisgICAgfQorCisgICAgaWYgKCB1c2VfdmlkbW9kZSApIHsKKyAgICAgICAgcHJpbnRmKCJWaWRNb2RlIGlzIGVuYWJsZWRcbiIpOworICAgIH0KKworICAgIGlmICggdXNlX3htZSApIHsKKyAgICAgICAgcHJpbnRmKCJYaSBHcmFwaGljcyBYTUUgZnVsbHNjcmVlbiBpcyBlbmFibGVkXG4iKTsKKyAgICB9CisKKyAgICBpZiAoIFNETF9tb2RlbGlzdCApIHsKKyAgICAgICAgcHJpbnRmKCJYMTEgdmlkZW8gbW9kZSBsaXN0OlxuIik7CisgICAgICAgIGZvciAoIGk9MDsgU0RMX21vZGVsaXN0W2ldOyArK2kgKSB7CisgICAgICAgICAgICBwcmludGYoIlx0JWR4JWRcbiIsIFNETF9tb2RlbGlzdFtpXS0+dywgU0RMX21vZGVsaXN0W2ldLT5oKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBYMTFNT0RFU19ERUJVRyAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBYMTFfU3VwcG9ydGVkVmlzdWFsKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoaSA9IDA7IGkgPCB0aGlzLT5oaWRkZW4tPm52aXN1YWxzOyBpKyspCisgICAgICAgIGlmKHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5icHAgPT0gZm9ybWF0LT5CaXRzUGVyUGl4ZWwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworU0RMX1JlY3QgKipYMTFfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworICAgIGlmICggWDExX1N1cHBvcnRlZFZpc3VhbCh0aGlzLCBmb3JtYXQpICkgeworICAgICAgICBpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7CisgICAgICAgICAgICByZXR1cm4oU0RMX21vZGVsaXN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybigoU0RMX1JlY3QgKiopLTEpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuKChTRExfUmVjdCAqKikwKTsKKyAgICB9Cit9CisKK3ZvaWQgWDExX0ZyZWVWaWRlb01vZGVzKF9USElTKQoreworICAgIGludCBpOworCisgICAgaWYgKCBTRExfbW9kZWxpc3QgKSB7CisgICAgICAgIGZvciAoIGk9MDsgU0RMX21vZGVsaXN0W2ldOyArK2kgKSB7CisgICAgICAgICAgICBTRExfZnJlZShTRExfbW9kZWxpc3RbaV0pOworICAgICAgICB9CisgICAgICAgIFNETF9mcmVlKFNETF9tb2RlbGlzdCk7CisgICAgICAgIFNETF9tb2RlbGlzdCA9IE5VTEw7CisgICAgfQorCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFJBTkRSCisgICAgLyogRnJlZSB0aGUgWHJhbmRyIHNjcmVlbiBjb25maWd1cmF0aW9uICovCisgICAgaWYgKCBzY3JlZW5fY29uZmlnICkgeworICAgICAgICBYUlJGcmVlU2NyZWVuQ29uZmlnSW5mbyhzY3JlZW5fY29uZmlnKTsKKyAgICAgICAgc2NyZWVuX2NvbmZpZyA9IE5VTEw7CisgICAgfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUiAqLworfQorCitpbnQgWDExX1Jlc2l6ZUZ1bGxTY3JlZW4oX1RISVMpCit7CisgICAgaW50IHggPSAwLCB5ID0gMDsKKyAgICBpbnQgcmVhbF93LCByZWFsX2g7CisgICAgaW50IHNjcmVlbl93OworICAgIGludCBzY3JlZW5faDsKKworICAgIHNjcmVlbl93ID0gRGlzcGxheVdpZHRoKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKKyAgICBzY3JlZW5faCA9IERpc3BsYXlIZWlnaHQoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOworCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKKyAgICBpZiAoIHVzZV94aW5lcmFtYSAmJgorICAgICAgICAgd2luZG93X3cgPD0geGluZXJhbWFfaW5mby53aWR0aCAmJgorICAgICAgICAgd2luZG93X2ggPD0geGluZXJhbWFfaW5mby5oZWlnaHQgKSB7CisgICAgICAgIHggPSB4aW5lcmFtYV9pbmZvLnhfb3JnOworICAgICAgICB5ID0geGluZXJhbWFfaW5mby55X29yZzsKKyAgICB9CisjZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEgKi8KKworICAgIGlmICggY3VycmVudGx5X2Z1bGxzY3JlZW4gKSB7CisgICAgICAgIC8qIFN3aXRjaCByZXNvbHV0aW9uIGFuZCBjb3ZlciBpdCB3aXRoIHRoZSBGU3dpbmRvdyAqLworICAgICAgICBtb3ZlX2N1cnNvcl90byh0aGlzLCB4LCB5KTsKKyAgICAgICAgc2V0X2Jlc3RfcmVzb2x1dGlvbih0aGlzLCB3aW5kb3dfdywgd2luZG93X2gpOworICAgICAgICBtb3ZlX2N1cnNvcl90byh0aGlzLCB4LCB5KTsKKyAgICAgICAgZ2V0X3JlYWxfcmVzb2x1dGlvbih0aGlzLCAmcmVhbF93LCAmcmVhbF9oKTsKKyAgICAgICAgaWYgKCB3aW5kb3dfdyA+IHJlYWxfdyApIHsKKyAgICAgICAgICAgIHJlYWxfdyA9IE1BWChyZWFsX3csIHNjcmVlbl93KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHdpbmRvd19oID4gcmVhbF9oICkgeworICAgICAgICAgICAgcmVhbF9oID0gTUFYKHJlYWxfaCwgc2NyZWVuX2gpOworICAgICAgICB9CisgICAgICAgIFhNb3ZlUmVzaXplV2luZG93KFNETF9EaXNwbGF5LCBGU3dpbmRvdywgeCwgeSwgcmVhbF93LCByZWFsX2gpOworICAgICAgICBtb3ZlX2N1cnNvcl90byh0aGlzLCByZWFsX3cvMiwgcmVhbF9oLzIpOworCisgICAgICAgIC8qIENlbnRlciBhbmQgcmVwYXJlbnQgdGhlIGRyYXdpbmcgd2luZG93ICovCisgICAgICAgIHggPSAocmVhbF93IC0gd2luZG93X3cpLzI7CisgICAgICAgIHkgPSAocmVhbF9oIC0gd2luZG93X2gpLzI7CisgICAgICAgIFhSZXBhcmVudFdpbmRvdyhTRExfRGlzcGxheSwgU0RMX1dpbmRvdywgRlN3aW5kb3csIHgsIHkpOworICAgICAgICAvKiBGSVhNRTogbW92ZSB0aGUgbW91c2UgdG8gdGhlIG9sZCByZWxhdGl2ZSBsb2NhdGlvbiAqLworICAgICAgICBYU3luYyhTRExfRGlzcGxheSwgVHJ1ZSk7ICAgLyogRmx1c2ggc3B1cmlvdXMgbW9kZSBjaGFuZ2UgZXZlbnRzICovCisgICAgfQorICAgIHJldHVybigxKTsKK30KKwordm9pZCBYMTFfUXVldWVFbnRlckZ1bGxTY3JlZW4oX1RISVMpCit7CisgICAgc3dpdGNoX3dhaXRpbmcgPSAweDAxIHwgU0RMX0ZVTExTQ1JFRU47CisgICAgc3dpdGNoX3RpbWUgPSBTRExfR2V0VGlja3MoKSArIDE1MDA7CisjaWYgMCAvKiBUaGlzIGNhdXNlcyBhIEJhZE1hdGNoIGVycm9yIGlmIHRoZSB3aW5kb3cgaXMgaWNvbmlmaWVkIChub3QgbmVlZGVkKSAqLworICAgIFhTZXRJbnB1dEZvY3VzKFNETF9EaXNwbGF5LCBXTXdpbmRvdywgUmV2ZXJ0VG9Ob25lLCBDdXJyZW50VGltZSk7CisjZW5kaWYKK30KKworaW50IFgxMV9FbnRlckZ1bGxTY3JlZW4oX1RISVMpCit7CisgICAgaW50IG9rYXk7CisjaWYgMAorICAgIFdpbmRvdyB0bXB3aW4sICp3aW5kb3dzOworICAgIGludCBpLCBud2luZG93czsKKyNlbmRpZgorICAgIGludCB4ID0gMCwgeSA9IDA7CisgICAgaW50IHJlYWxfdywgcmVhbF9oOworICAgIGludCBzY3JlZW5fdzsKKyAgICBpbnQgc2NyZWVuX2g7CisKKyAgICBva2F5ID0gMTsKKyAgICBpZiAoIGN1cnJlbnRseV9mdWxsc2NyZWVuICkgeworICAgICAgICByZXR1cm4ob2theSk7CisgICAgfQorCisgICAgLyogVW5ncmFiIHRoZSBpbnB1dCBzbyB0aGF0IHdlIGNhbiBtb3ZlIHRoZSBtb3VzZSBhcm91bmQgKi8KKyAgICBYMTFfR3JhYklucHV0Tm9Mb2NrKHRoaXMsIFNETF9HUkFCX09GRik7CisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQorICAgIGlmICggdXNlX3hpbmVyYW1hICYmCisgICAgICAgICB3aW5kb3dfdyA8PSB4aW5lcmFtYV9pbmZvLndpZHRoICYmCisgICAgICAgICB3aW5kb3dfaCA8PSB4aW5lcmFtYV9pbmZvLmhlaWdodCApIHsKKyAgICAgICAgeCA9IHhpbmVyYW1hX2luZm8ueF9vcmc7CisgICAgICAgIHkgPSB4aW5lcmFtYV9pbmZvLnlfb3JnOworICAgIH0KKyNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQSAqLworCisgICAgLyogTWFwIHRoZSBmdWxsc2NyZWVuIHdpbmRvdyB0byBibGFuayB0aGUgc2NyZWVuICovCisgICAgc2NyZWVuX3cgPSBEaXNwbGF5V2lkdGgoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOworICAgIHNjcmVlbl9oID0gRGlzcGxheUhlaWdodChTRExfRGlzcGxheSwgU0RMX1NjcmVlbik7CisgICAgZ2V0X3JlYWxfcmVzb2x1dGlvbih0aGlzLCAmcmVhbF93LCAmcmVhbF9oKTsKKyAgICByZWFsX3cgPSBNQVgod2luZG93X3csIE1BWChyZWFsX3csIHNjcmVlbl93KSk7CisgICAgcmVhbF9oID0gTUFYKHdpbmRvd19oLCBNQVgocmVhbF9oLCBzY3JlZW5faCkpOworICAgIFhNb3ZlUmVzaXplV2luZG93KFNETF9EaXNwbGF5LCBGU3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICB4LCB5LCByZWFsX3csIHJlYWxfaCk7CisgICAgWE1hcFJhaXNlZChTRExfRGlzcGxheSwgRlN3aW5kb3cpOworICAgIFgxMV9XYWl0TWFwcGVkKHRoaXMsIEZTd2luZG93KTsKKworI2lmIDAgLyogVGhpcyBzZWVtcyB0byBicmVhayBXaW5kb3dNYWtlciBpbiBmb2N1cy1mb2xsb3dzLW1vdXNlIG1vZGUgKi8KKyAgICAvKiBNYWtlIHN1cmUgd2UgZ290IHRvIHRoZSB0b3Agb2YgdGhlIHdpbmRvdyBzdGFjayAqLworICAgIGlmICggWFF1ZXJ5VHJlZShTRExfRGlzcGxheSwgU0RMX1Jvb3QsICZ0bXB3aW4sICZ0bXB3aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd3MsICZud2luZG93cykgJiYgd2luZG93cyApIHsKKyAgICAgICAgLyogSWYgbm90LCB0cnkgdG8gcHV0IHVzIHRoZXJlIC0gaWYgZmFpbC4uLiBvaCB3ZWxsICovCisgICAgICAgIGlmICggd2luZG93c1tud2luZG93cy0xXSAhPSBGU3dpbmRvdyApIHsKKyAgICAgICAgICAgIHRtcHdpbiA9IHdpbmRvd3NbbndpbmRvd3MtMV07CisgICAgICAgICAgICBmb3IgKCBpPTA7IGk8bndpbmRvd3M7ICsraSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHdpbmRvd3NbaV0gPT0gRlN3aW5kb3cgKSB7CisgICAgICAgICAgICAgICAgICAgIFNETF9tZW1jcHkoJndpbmRvd3NbaV0sICZ3aW5kb3dzW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobndpbmRvd3MtaS0xKSpzaXplb2Yod2luZG93c1tpXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aW5kb3dzW253aW5kb3dzLTFdID0gRlN3aW5kb3c7CisgICAgICAgICAgICBYUmVzdGFja1dpbmRvd3MoU0RMX0Rpc3BsYXksIHdpbmRvd3MsIG53aW5kb3dzKTsKKyAgICAgICAgICAgIFhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgWEZyZWUod2luZG93cyk7CisgICAgfQorI2Vsc2UKKyAgICBYUmFpc2VXaW5kb3coU0RMX0Rpc3BsYXksIEZTd2luZG93KTsKKyNlbmRpZgorCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQorICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgdmlkZW8gbW9kZSAqLworICAgIGlmICggdXNlX3ZpZG1vZGUgKSB7CisgICAgICAgIFNETF9OQU1FKFhGODZWaWRNb2RlTG9ja01vZGVTd2l0Y2gpKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuLCBUcnVlKTsKKyAgICAgICAgc2F2ZV9tb2RlKHRoaXMpOworICAgIH0KKyNlbmRpZgorICAgIGN1cnJlbnRseV9mdWxsc2NyZWVuID0gMTsKKworICAgIC8qIFNldCB0aGUgbmV3IHJlc29sdXRpb24gKi8KKyAgICBva2F5ID0gWDExX1Jlc2l6ZUZ1bGxTY3JlZW4odGhpcyk7CisgICAgaWYgKCAhIG9rYXkgKSB7CisgICAgICAgIFgxMV9MZWF2ZUZ1bGxTY3JlZW4odGhpcyk7CisgICAgfQorICAgIC8qIFNldCB0aGUgY29sb3JtYXAgKi8KKyAgICBpZiAoIFNETF9YQ29sb3JNYXAgKSB7CisgICAgICAgIFhJbnN0YWxsQ29sb3JtYXAoU0RMX0Rpc3BsYXksIFNETF9YQ29sb3JNYXApOworICAgIH0KKyAgICBpZiAoIG9rYXkgKSB7CisgICAgICAgIFgxMV9HcmFiSW5wdXROb0xvY2sodGhpcywgdGhpcy0+aW5wdXRfZ3JhYiB8IFNETF9HUkFCX0ZVTExTQ1JFRU4pOworICAgIH0KKworICAgIC8qIFdlIG1heSBuZWVkIHRvIHJlZnJlc2ggdGhlIHNjcmVlbiBhdCB0aGlzIHBvaW50IChubyBiYWNraW5nIHN0b3JlKQorICAgICAgIFdlIGFsc28gZG9uJ3QgZ2V0IGFuIGV2ZW50LCB3aGljaCBpcyB3aHkgd2UgZXhwbGljaXRseSByZWZyZXNoLiAqLworICAgIGlmICggdGhpcy0+c2NyZWVuICkgeworICAgICAgICBpZiAoIHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfT1BFTkdMICkgeworICAgICAgICAgICAgU0RMX1ByaXZhdGVFeHBvc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFgxMV9SZWZyZXNoRGlzcGxheSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihva2F5KTsKK30KKworaW50IFgxMV9MZWF2ZUZ1bGxTY3JlZW4oX1RISVMpCit7CisgICAgaWYgKCBjdXJyZW50bHlfZnVsbHNjcmVlbiApIHsKKyAgICAgICAgWFJlcGFyZW50V2luZG93KFNETF9EaXNwbGF5LCBTRExfV2luZG93LCBXTXdpbmRvdywgMCwgMCk7CisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERQorICAgICAgICBpZiAoIHVzZV92aWRtb2RlICkgeworICAgICAgICAgICAgcmVzdG9yZV9tb2RlKHRoaXMpOworICAgICAgICAgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVMb2NrTW9kZVN3aXRjaCkoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4sIEZhbHNlKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUKKyAgICAgICAgaWYgKCB1c2VfeG1lICkgeworICAgICAgICAgICAgaW50IHJ3LCByaDsgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBjaGVjayBjdXJyZW50IG1vZGUgc28gd2UgY2FuIGF2b2lkIHVuZWNjZXNzYXJ5IG1vZGUgY2hhbmdlcyAqLworICAgICAgICAgICAgZ2V0X3JlYWxfcmVzb2x1dGlvbih0aGlzLCAmcncsICZyaCk7CisKKyAgICAgICAgICAgIGlmIChydyAhPSBzYXZlZF9yZXMud2lkdGggfHwgcmggIT0gc2F2ZWRfcmVzLmhlaWdodCkgeworICAgICAgICAgICAgICAgIFhpR01pc2NDaGFuZ2VSZXNvbHV0aW9uKFNETF9EaXNwbGF5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfU2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHZpZXcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZF9yZXMud2lkdGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkX3Jlcy5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKKyAgICAgICAgaWYgKCB1c2VfeHJhbmRyICkgeworICAgICAgICAgICAgWFJSU2V0U2NyZWVuQ29uZmlnKFNETF9EaXNwbGF5LCBzY3JlZW5fY29uZmlnLCBTRExfUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZF9zaXplX2lkLCBzYXZlZF9yb3RhdGlvbiwgQ3VycmVudFRpbWUpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBYVW5tYXBXaW5kb3coU0RMX0Rpc3BsYXksIEZTd2luZG93KTsKKyAgICAgICAgWDExX1dhaXRVbm1hcHBlZCh0aGlzLCBGU3dpbmRvdyk7CisgICAgICAgIFhTeW5jKFNETF9EaXNwbGF5LCBUcnVlKTsgICAvKiBGbHVzaCBzcHVyaW91cyBtb2RlIGNoYW5nZSBldmVudHMgKi8KKyAgICAgICAgY3VycmVudGx5X2Z1bGxzY3JlZW4gPSAwOworICAgIH0KKyAgICAvKiBJZiB3ZSBnZXQgcG9wcGVkIG91dCBvZiBmdWxsc2NyZWVuIG1vZGUgZm9yIHNvbWUgcmVhc29uLCBpbnB1dF9ncmFiCisgICAgICAgd2lsbCBzdGlsbCBoYXZlIHRoZSBTRExfR1JBQl9GVUxMU0NSRUVOIGZsYWcgc2V0LCBzaW5jZSB0aGlzIGlzIG9ubHkKKyAgICAgICB0ZW1wb3JhcnkuICBJbiB0aGlzIGNhc2UsIHJlbGVhc2UgdGhlIGdyYWIgdW5sZXNzIHRoZSBpbnB1dCBoYXMgYmVlbgorICAgICAgIGV4cGxpY2l0bHkgZ3JhYmJlZC4KKyAgICAgKi8KKyAgICBYMTFfR3JhYklucHV0Tm9Mb2NrKHRoaXMsIHRoaXMtPmlucHV0X2dyYWIgJiB+U0RMX0dSQUJfRlVMTFNDUkVFTik7CisKKyAgICAvKiBXZSBtYXkgbmVlZCB0byByZWZyZXNoIHRoZSBzY3JlZW4gYXQgdGhpcyBwb2ludCAobm8gYmFja2luZyBzdG9yZSkKKyAgICAgICBXZSBhbHNvIGRvbid0IGdldCBhbiBldmVudCwgd2hpY2ggaXMgd2h5IHdlIGV4cGxpY2l0bHkgcmVmcmVzaC4gKi8KKyAgICBpZiAoIHRoaXMtPnNjcmVlbiApIHsKKyAgICAgICAgaWYgKCB0aGlzLT5zY3JlZW4tPmZsYWdzICYgU0RMX09QRU5HTCApIHsKKyAgICAgICAgICAgIFNETF9Qcml2YXRlRXhwb3NlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBYMTFfUmVmcmVzaERpc3BsYXkodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW9kZXNfYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMW1vZGVzX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzc4MGJmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMW1vZGVzX2MuaApAQCAtMCwwICsxLDQzIEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVXRpbGl0aWVzIGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIHRoZSBYIGRpc3BsYXkgbW9kZSAqLworCisjaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRvIGdyYWIgdGhlIGtleWJvYXJkIGluIGZ1bGxzY3JlZW4gbW9kZS4KKyAgIElmIHlvdSBkbyBub3QgZGVmaW5lIHRoaXMsIFNETCB3aWxsIHJldHVybiBmcm9tIFNETF9TZXRWaWRlb01vZGUoKQorICAgaW1tZWRpYXRlbHksIGJ1dCB3aWxsIG5vdCBhY3R1YWxseSBnbyBmdWxsc2NyZWVuIHVudGlsIHRoZSB3aW5kb3cKKyAgIG1hbmFnZXIgaXMgaWRsZS4KKyovCisjZGVmaW5lIEdSQUJfRlVMTFNDUkVFTgorCitleHRlcm4gaW50IFgxMV9HZXRWaWRlb01vZGVzKF9USElTKTsKK2V4dGVybiBTRExfUmVjdCAqKlgxMV9MaXN0TW9kZXMoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqZm9ybWF0LCBVaW50MzIgZmxhZ3MpOworZXh0ZXJuIHZvaWQgWDExX0ZyZWVWaWRlb01vZGVzKF9USElTKTsKK2V4dGVybiBpbnQgWDExX1Jlc2l6ZUZ1bGxTY3JlZW4oX1RISVMpOworZXh0ZXJuIHZvaWQgWDExX1dhaXRNYXBwZWQoX1RISVMsIFdpbmRvdyB3aW4pOworZXh0ZXJuIHZvaWQgWDExX1dhaXRVbm1hcHBlZChfVEhJUywgV2luZG93IHdpbik7CitleHRlcm4gdm9pZCBYMTFfUXVldWVFbnRlckZ1bGxTY3JlZW4oX1RISVMpOworZXh0ZXJuIGludCBYMTFfRW50ZXJGdWxsU2NyZWVuKF9USElTKTsKK2V4dGVybiBpbnQgWDExX0xlYXZlRnVsbFNjcmVlbihfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW91c2UuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFtb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YWQ3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW91c2UuYwpAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIi4uL1NETF9jdXJzb3JfYy5oIgorI2luY2x1ZGUgIlNETF94MTFkZ2FfYy5oIgorI2luY2x1ZGUgIlNETF94MTFtb3VzZV9jLmgiCisKKworLyogVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkYXRhIGZvciB0aGUgd2luZG93IG1hbmFnZXIgY3Vyc29yICovCitzdHJ1Y3QgV01jdXJzb3IgeworCUN1cnNvciB4X2N1cnNvcjsKK307CisKKwordm9pZCBYMTFfRnJlZVdNQ3Vyc29yKF9USElTLCBXTWN1cnNvciAqY3Vyc29yKQoreworCWlmICggU0RMX0Rpc3BsYXkgIT0gTlVMTCApIHsKKwkJU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKKwkJWEZyZWVDdXJzb3IoU0RMX0Rpc3BsYXksIGN1cnNvci0+eF9jdXJzb3IpOworCQlYU3luYyhTRExfRGlzcGxheSwgRmFsc2UpOworCQlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7CisJfQorCVNETF9mcmVlKGN1cnNvcik7Cit9CisKK1dNY3Vyc29yICpYMTFfQ3JlYXRlV01DdXJzb3IoX1RISVMsCisJCVVpbnQ4ICpkYXRhLCBVaW50OCAqbWFzaywgaW50IHcsIGludCBoLCBpbnQgaG90X3gsIGludCBob3RfeSkKK3sKKwlXTWN1cnNvciAqY3Vyc29yOworCVhHQ1ZhbHVlcyBHQ3ZhbHVlczsKKwlHQyAgICAgICAgR0NjdXJzb3I7CisJWEltYWdlICpkYXRhX2ltYWdlLCAqbWFza19pbWFnZTsKKwlQaXhtYXAgIGRhdGFfcGl4bWFwLCBtYXNrX3BpeG1hcDsKKwlpbnQgICAgICAgY2xlbiwgaTsKKwljaGFyICAgICAqeF9kYXRhLCAqeF9tYXNrOworCXN0YXRpYyBYQ29sb3IgYmxhY2sgPSB7ICAwLCAgMCwgIDAsICAwIH07CisJc3RhdGljIFhDb2xvciB3aGl0ZSA9IHsgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmIH07CisKKwkvKiBBbGxvY2F0ZSB0aGUgY3Vyc29yIG1lbW9yeSAqLworCWN1cnNvciA9IChXTWN1cnNvciAqKVNETF9tYWxsb2Moc2l6ZW9mKFdNY3Vyc29yKSk7CisJaWYgKCBjdXJzb3IgPT0gTlVMTCApIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBNaXggdGhlIG1hc2sgYW5kIHRoZSBkYXRhICovCisJY2xlbiA9ICh3LzgpKmg7CisJeF9kYXRhID0gKGNoYXIgKilTRExfbWFsbG9jKGNsZW4pOworCWlmICggeF9kYXRhID09IE5VTEwgKSB7CisJCVNETF9mcmVlKGN1cnNvcik7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCXhfbWFzayA9IChjaGFyICopU0RMX21hbGxvYyhjbGVuKTsKKwlpZiAoIHhfbWFzayA9PSBOVUxMICkgeworCQlTRExfZnJlZShjdXJzb3IpOworCQlTRExfZnJlZSh4X2RhdGEpOworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlmb3IgKCBpPTA7IGk8Y2xlbjsgKytpICkgeworCQkvKiBUaGUgbWFzayBpcyBPUidkIHdpdGggdGhlIGRhdGEgdG8gdHVybiBpbnZlcnRlZCBjb2xvcgorCQkgICBwaXhlbHMgYmxhY2sgc2luY2UgaW52ZXJ0ZWQgY29sb3IgY3Vyc29ycyBhcmVuJ3Qgc3VwcG9ydGVkCisJCSAgIHVuZGVyIFgxMS4KKwkJICovCisJCXhfbWFza1tpXSA9IGRhdGFbaV0gfCBtYXNrW2ldOworCQl4X2RhdGFbaV0gPSBkYXRhW2ldOworCX0KKworCS8qIFByZXZlbnQgdGhlIGV2ZW50IHRocmVhZCBmcm9tIHJ1bm5pbmcgd2hpbGUgd2UgdXNlIHRoZSBYIHNlcnZlciAqLworCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7CisKKwkvKiBDcmVhdGUgdGhlIGRhdGEgaW1hZ2UgKi8KKwlkYXRhX2ltYWdlID0gWENyZWF0ZUltYWdlKFNETF9EaXNwbGF5LCAKKwkJCURlZmF1bHRWaXN1YWwoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pLAorCQkJCQkxLCBYWUJpdG1hcCwgMCwgeF9kYXRhLCB3LCBoLCA4LCB3LzgpOworCWRhdGFfaW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdDsKKwlkYXRhX2ltYWdlLT5iaXRtYXBfYml0X29yZGVyID0gTVNCRmlyc3Q7CisJZGF0YV9waXhtYXAgPSBYQ3JlYXRlUGl4bWFwKFNETF9EaXNwbGF5LCBTRExfUm9vdCwgdywgaCwgMSk7CisKKwkvKiBDcmVhdGUgdGhlIGRhdGEgbWFzayAqLworCW1hc2tfaW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoU0RMX0Rpc3BsYXksIAorCQkJRGVmYXVsdFZpc3VhbChTRExfRGlzcGxheSwgU0RMX1NjcmVlbiksCisJCQkJCTEsIFhZQml0bWFwLCAwLCB4X21hc2ssIHcsIGgsIDgsIHcvOCk7CisJbWFza19pbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0OworCW1hc2tfaW1hZ2UtPmJpdG1hcF9iaXRfb3JkZXIgPSBNU0JGaXJzdDsKKwltYXNrX3BpeG1hcCA9IFhDcmVhdGVQaXhtYXAoU0RMX0Rpc3BsYXksIFNETF9Sb290LCB3LCBoLCAxKTsKKworCS8qIENyZWF0ZSB0aGUgZ3JhcGhpY3MgY29udGV4dCAqLworCUdDdmFsdWVzLmZ1bmN0aW9uID0gR1hjb3B5OworCUdDdmFsdWVzLmZvcmVncm91bmQgPSB+MDsKKwlHQ3ZhbHVlcy5iYWNrZ3JvdW5kID0gIDA7CisJR0N2YWx1ZXMucGxhbmVfbWFzayA9IEFsbFBsYW5lczsKKwlHQ2N1cnNvciA9IFhDcmVhdGVHQyhTRExfRGlzcGxheSwgZGF0YV9waXhtYXAsCisJCQkoR0NGdW5jdGlvbnxHQ0ZvcmVncm91bmR8R0NCYWNrZ3JvdW5kfEdDUGxhbmVNYXNrKSwKKwkJCQkJCQkJJkdDdmFsdWVzKTsKKworCS8qIEJsaXQgdGhlIGltYWdlcyB0byB0aGUgcGl4bWFwcyAqLworCVhQdXRJbWFnZShTRExfRGlzcGxheSwgZGF0YV9waXhtYXAsIEdDY3Vyc29yLCBkYXRhX2ltYWdlLAorCQkJCQkJCTAsIDAsIDAsIDAsIHcsIGgpOworCVhQdXRJbWFnZShTRExfRGlzcGxheSwgbWFza19waXhtYXAsIEdDY3Vyc29yLCBtYXNrX2ltYWdlLAorCQkJCQkJCTAsIDAsIDAsIDAsIHcsIGgpOworCVhGcmVlR0MoU0RMX0Rpc3BsYXksIEdDY3Vyc29yKTsKKwkvKiBUaGVzZSBmcmVlIHRoZSB4X2RhdGEgYW5kIHhfbWFzayBtZW1vcnkgcG9pbnRlcnMgKi8KKwlYRGVzdHJveUltYWdlKGRhdGFfaW1hZ2UpOworCVhEZXN0cm95SW1hZ2UobWFza19pbWFnZSk7CisKKwkvKiBDcmVhdGUgdGhlIGN1cnNvciAqLworCWN1cnNvci0+eF9jdXJzb3IgPSBYQ3JlYXRlUGl4bWFwQ3Vyc29yKFNETF9EaXNwbGF5LCBkYXRhX3BpeG1hcCwKKwkJCQltYXNrX3BpeG1hcCwgJmJsYWNrLCAmd2hpdGUsIGhvdF94LCBob3RfeSk7CisJWEZyZWVQaXhtYXAoU0RMX0Rpc3BsYXksIGRhdGFfcGl4bWFwKTsKKwlYRnJlZVBpeG1hcChTRExfRGlzcGxheSwgbWFza19waXhtYXApOworCisJLyogUmVsZWFzZSB0aGUgZXZlbnQgdGhyZWFkICovCisJWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKwlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7CisKKwlyZXR1cm4oY3Vyc29yKTsKK30KKworaW50IFgxMV9TaG93V01DdXJzb3IoX1RISVMsIFdNY3Vyc29yICpjdXJzb3IpCit7CisJLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGRpc3BsYXkgaXMgZ29uZSAqLworCWlmICggU0RMX0Rpc3BsYXkgPT0gTlVMTCApIHsKKwkJcmV0dXJuKDApOworCX0KKworCS8qIFNldCB0aGUgWDExIGN1cnNvciBjdXJzb3IsIG9yIGJsYW5rIGlmIGN1cnNvciBpcyBOVUxMICovCisJaWYgKCBTRExfV2luZG93ICkgeworCQlTRExfTG9ja19FdmVudFRocmVhZCgpOworCQlpZiAoIGN1cnNvciA9PSBOVUxMICkgeworCQkJaWYgKCBTRExfQmxhbmtDdXJzb3IgIT0gTlVMTCApIHsKKwkJCQlYRGVmaW5lQ3Vyc29yKFNETF9EaXNwbGF5LCBTRExfV2luZG93LAorCQkJCQlTRExfQmxhbmtDdXJzb3ItPnhfY3Vyc29yKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVhEZWZpbmVDdXJzb3IoU0RMX0Rpc3BsYXksIFNETF9XaW5kb3csIGN1cnNvci0+eF9jdXJzb3IpOworCQl9CisJCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7CisJCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKKwl9CisJcmV0dXJuKDEpOworfQorCit2b2lkIFgxMV9XYXJwV01DdXJzb3IoX1RISVMsIFVpbnQxNiB4LCBVaW50MTYgeSkKK3sKKwlpZiAoIHVzaW5nX2RnYSAmIERHQV9NT1VTRSApIHsKKwkJU0RMX1ByaXZhdGVNb3VzZU1vdGlvbigwLCAwLCB4LCB5KTsKKwl9IGVsc2UgaWYgKCBtb3VzZV9yZWxhdGl2ZSkgeworCQkvKglSSlI6IE1hcmNoIDI4LCAyMDAwCisJCQlsZWF2ZSBwaHlzaWNhbCBjdXJzb3IgYXQgY2VudGVyIG9mIHNjcmVlbiBpZgorCQkJbW91c2UgaGlkZGVuIGFuZCBncmFiYmVkICovCisJCVNETF9Qcml2YXRlTW91c2VNb3Rpb24oMCwgMCwgeCwgeSk7CisJfSBlbHNlIHsKKwkJU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKKwkJWFdhcnBQb2ludGVyKFNETF9EaXNwbGF5LCBOb25lLCBTRExfV2luZG93LCAwLCAwLCAwLCAwLCB4LCB5KTsKKwkJWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKwkJU0RMX1VubG9ja19FdmVudFRocmVhZCgpOworCX0KK30KKworLyogU2V0cyB0aGUgbW91c2UgYWNjZWxlcmF0aW9uIGZyb20gYSBzdHJpbmcgb2YgdGhlIGZvcm06CisJMi8xLzAKKyAgIFRoZSBmaXJzdCBudW1iZXIgaXMgdGhlIG51bWVyYXRvciwgZm9sbG93ZWQgYnkgdGhlIGFjY2VsZXJhdGlvbgorICAgZGVudW1lbmF0b3IgYW5kIHRocmVzaG9sZC4KKyovCitzdGF0aWMgdm9pZCBTZXRNb3VzZUFjY2VsKF9USElTLCBjb25zdCBjaGFyICphY2NlbF9wYXJhbSkKK3sKKwlpbnQgaTsKKwlzaXplX3QgbGVuOworCWludCBhY2NlbF92YWx1ZVszXTsKKwljaGFyICptb3VzZV9wYXJhbSwgKm1vdXNlX3BhcmFtX2J1ZiwgKnBpbjsKKworCWxlbiA9IFNETF9zdHJsZW4oYWNjZWxfcGFyYW0pKzE7CisJbW91c2VfcGFyYW1fYnVmID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIGxlbik7CisJaWYgKCAhIG1vdXNlX3BhcmFtX2J1ZiApIHsKKwkJcmV0dXJuOworCX0KKwlTRExfc3RybGNweShtb3VzZV9wYXJhbV9idWYsIGFjY2VsX3BhcmFtLCBsZW4pOworCW1vdXNlX3BhcmFtID0gbW91c2VfcGFyYW1fYnVmOworCisJZm9yICggaT0wOyAoaSA8IDMpICYmIG1vdXNlX3BhcmFtOyArK2kgKSB7CisJCXBpbiA9IFNETF9zdHJjaHIobW91c2VfcGFyYW0sICcvJyk7CisJCWlmICggcGluICkgeworCQkJKnBpbiA9ICdcMCc7CisJCX0KKwkJYWNjZWxfdmFsdWVbaV0gPSBhdG9pKG1vdXNlX3BhcmFtKTsKKwkJaWYgKCBwaW4gKSB7CisJCQltb3VzZV9wYXJhbSA9IHBpbisxOworCQl9IGVsc2UgeworCQkJbW91c2VfcGFyYW0gPSBOVUxMOworCQl9CisJfQorCWlmICggaSA9PSAzICkgeworCQlYQ2hhbmdlUG9pbnRlckNvbnRyb2woU0RMX0Rpc3BsYXksIFRydWUsIFRydWUsCisJCQlhY2NlbF92YWx1ZVswXSwgYWNjZWxfdmFsdWVbMV0sIGFjY2VsX3ZhbHVlWzJdKTsKKwl9CisJU0RMX3N0YWNrX2ZyZWUobW91c2VfcGFyYW1fYnVmKTsKK30KKworLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZW50ZXIgb3IgbGVhdmUgbW91c2UgcmVsYXRpdmUgbW9kZSAqLwordm9pZCBYMTFfQ2hlY2tNb3VzZU1vZGVOb0xvY2soX1RISVMpCit7CisJY29uc3QgVWludDggZnVsbF9mb2N1cyA9IChTRExfQVBQQUNUSVZFfFNETF9BUFBJTlBVVEZPQ1VTfFNETF9BUFBNT1VTRUZPQ1VTKTsKKwljaGFyICplbnZfb3ZlcnJpZGU7CisJaW50IGVuYWJsZV9yZWxhdGl2ZSA9IDE7CisKKwkvKiBUaGlzIGhhcHBlbnMgd2hlbiBxdWl0aW5nIGFmdGVyIGFuIHhpbyBlcnJvciAqLworCWlmICggU0RMX0Rpc3BsYXkgPT0gTlVMTCApCisJICAgICAgICByZXR1cm47CisKKwkvKiBBbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgcmVsYXRpdmUgbW91c2UgbW9kZS4KKwkgICBUaGV5IGFsbW9zdCBuZXZlciB3YW50IHRvIGRvIHRoaXMsIGFzIGl0IHNlcmlvdXNseSBhZmZlY3RzCisJICAgYXBwbGljYXRpb25zIHRoYXQgcmVseSBvbiBjb250aW51b3VzIHJlbGF0aXZlIG1vdXNlIG1vdGlvbi4KKwkqLworCWVudl9vdmVycmlkZSA9IFNETF9nZXRlbnYoIlNETF9NT1VTRV9SRUxBVElWRSIpOworCWlmICggZW52X292ZXJyaWRlICkgeworCQllbmFibGVfcmVsYXRpdmUgPSBhdG9pKGVudl9vdmVycmlkZSk7CisJfQorCisJLyogSWYgdGhlIG1vdXNlIGlzIGhpZGRlbiBhbmQgaW5wdXQgaXMgZ3JhYmJlZCwgd2UgdXNlIHJlbGF0aXZlIG1vZGUgKi8KKwlpZiAoIGVuYWJsZV9yZWxhdGl2ZSAmJgorCSAgICAgIShTRExfY3Vyc29yc3RhdGUgJiBDVVJTT1JfVklTSUJMRSkgJiYKKwkgICAgICh0aGlzLT5pbnB1dF9ncmFiICE9IFNETF9HUkFCX09GRikgJiYKKyAgICAgICAgICAgICAoU0RMX0dldEFwcFN0YXRlKCkgJiBmdWxsX2ZvY3VzKSA9PSBmdWxsX2ZvY3VzICkgeworCQlpZiAoICEgbW91c2VfcmVsYXRpdmUgKSB7CisJCQlYMTFfRW5hYmxlREdBTW91c2UodGhpcyk7CisJCQlpZiAoICEgKHVzaW5nX2RnYSAmIERHQV9NT1VTRSkgKSB7CisJCQkJY2hhciAqeG1vdXNlX2FjY2VsOworCisJCQkJU0RMX0dldE1vdXNlU3RhdGUoJm1vdXNlX2xhc3QueCwgJm1vdXNlX2xhc3QueSk7CisJCQkJLyogVXNlIGFzIHJhdyBtb3VzZSBtaWNrZXlzIGFzIHBvc3NpYmxlICovCisJCQkJWEdldFBvaW50ZXJDb250cm9sKFNETF9EaXNwbGF5LAorCQkJCQkJJm1vdXNlX2FjY2VsLm51bWVyYXRvciwgCisJCQkJCQkmbW91c2VfYWNjZWwuZGVub21pbmF0b3IsCisJCQkJCQkmbW91c2VfYWNjZWwudGhyZXNob2xkKTsKKwkJCQl4bW91c2VfYWNjZWw9U0RMX2dldGVudigiU0RMX1ZJREVPX1gxMV9NT1VTRUFDQ0VMIik7CisJCQkJaWYgKCB4bW91c2VfYWNjZWwgKSB7CisJCQkJCVNldE1vdXNlQWNjZWwodGhpcywgeG1vdXNlX2FjY2VsKTsKKwkJCQl9CisJCQl9CisJCQltb3VzZV9yZWxhdGl2ZSA9IDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIG1vdXNlX3JlbGF0aXZlICkgeworCQkJaWYgKCB1c2luZ19kZ2EgJiBER0FfTU9VU0UgKSB7CisJCQkJWDExX0Rpc2FibGVER0FNb3VzZSh0aGlzKTsKKwkJCX0gZWxzZSB7CisJCQkJWENoYW5nZVBvaW50ZXJDb250cm9sKFNETF9EaXNwbGF5LCBUcnVlLCBUcnVlLAorCQkJCQkJbW91c2VfYWNjZWwubnVtZXJhdG9yLCAKKwkJCQkJCW1vdXNlX2FjY2VsLmRlbm9taW5hdG9yLAorCQkJCQkJbW91c2VfYWNjZWwudGhyZXNob2xkKTsKKwkJCX0KKwkJCW1vdXNlX3JlbGF0aXZlID0gMDsKKwkJfQorCX0KK30KK3ZvaWQgWDExX0NoZWNrTW91c2VNb2RlKF9USElTKQoreworCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7CisJWDExX0NoZWNrTW91c2VNb2RlTm9Mb2NrKHRoaXMpOworCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFtb3VzZV9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW91c2VfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDk3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExbW91c2VfYy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCisKKy8qIEZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZCAqLworZXh0ZXJuIHZvaWQgWDExX0ZyZWVXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gV01jdXJzb3IgKlgxMV9DcmVhdGVXTUN1cnNvcihfVEhJUywKKwkJVWludDggKmRhdGEsIFVpbnQ4ICptYXNrLCBpbnQgdywgaW50IGgsIGludCBob3RfeCwgaW50IGhvdF95KTsKK2V4dGVybiBpbnQgWDExX1Nob3dXTUN1cnNvcihfVEhJUywgV01jdXJzb3IgKmN1cnNvcik7CitleHRlcm4gdm9pZCBYMTFfV2FycFdNQ3Vyc29yKF9USElTLCBVaW50MTYgeCwgVWludDE2IHkpOworZXh0ZXJuIHZvaWQgWDExX0NoZWNrTW91c2VNb2RlTm9Mb2NrKF9USElTKTsKK2V4dGVybiB2b2lkIFgxMV9DaGVja01vdXNlTW9kZShfVEhJUyk7CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExc3ltLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExc3ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljN2RmMwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTFzeW0uaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKworU0RMX1gxMV9NT0RVTEUoQkFTRVhMSUIpCitTRExfWDExX1NZTShYQ2xhc3NIaW50KixYQWxsb2NDbGFzc0hpbnQsKHZvaWQpLCgpLHJldHVybikKK1NETF9YMTFfU1lNKFN0YXR1cyxYQWxsb2NDb2xvciwoRGlzcGxheSogYSxDb2xvcm1hcCBiLFhDb2xvciogYyksKGEsYixjKSxyZXR1cm4pCitTRExfWDExX1NZTShYU2l6ZUhpbnRzKixYQWxsb2NTaXplSGludHMsKHZvaWQpLCgpLHJldHVybikKK1NETF9YMTFfU1lNKFhXTUhpbnRzKixYQWxsb2NXTUhpbnRzLCh2b2lkKSwoKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWENoYW5nZVBvaW50ZXJDb250cm9sLChEaXNwbGF5KiBhLEJvb2wgYixCb29sIGMsaW50IGQsaW50IGUsaW50IGYpLChhLGIsYyxkLGUsZikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhDaGFuZ2VQcm9wZXJ0eSwoRGlzcGxheSogYSxXaW5kb3cgYixBdG9tIGMsQXRvbSBkLGludCBlLGludCBmLF9YY29uc3QgdW5zaWduZWQgY2hhciogZyxpbnQgaCksKGEsYixjLGQsZSxmLGcsaCkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzLChEaXNwbGF5KiBhLFdpbmRvdyBiLHVuc2lnbmVkIGxvbmcgYyxYU2V0V2luZG93QXR0cmlidXRlcyogZCksKGEsYixjLGQpLHJldHVybikKK1NETF9YMTFfU1lNKEJvb2wsWENoZWNrVHlwZWRFdmVudCwoRGlzcGxheSogYSxpbnQgYixYRXZlbnQqIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhDbGVhcldpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYiksKGEsYikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhDbG9zZURpc3BsYXksKERpc3BsYXkqIGEpLChhKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWENvbmZpZ3VyZVdpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYix1bnNpZ25lZCBpbnQgYyxYV2luZG93Q2hhbmdlcyogZCksKGEsYixjLGQpLHJldHVybikKK1NETF9YMTFfU1lNKENvbG9ybWFwLFhDcmVhdGVDb2xvcm1hcCwoRGlzcGxheSogYSxXaW5kb3cgYixWaXN1YWwqIGMsaW50IGQpLChhLGIsYyxkKSxyZXR1cm4pCitTRExfWDExX1NZTShDdXJzb3IsWENyZWF0ZVBpeG1hcEN1cnNvciwoRGlzcGxheSogYSxQaXhtYXAgYixQaXhtYXAgYyxYQ29sb3IqIGQsWENvbG9yKiBlLHVuc2lnbmVkIGludCBmLHVuc2lnbmVkIGludCBnKSwoYSxiLGMsZCxlLGYsZykscmV0dXJuKQorU0RMX1gxMV9TWU0oR0MsWENyZWF0ZUdDLChEaXNwbGF5KiBhLERyYXdhYmxlIGIsdW5zaWduZWQgbG9uZyBjLFhHQ1ZhbHVlcyogZCksKGEsYixjLGQpLHJldHVybikKK1NETF9YMTFfU1lNKFhJbWFnZSosWENyZWF0ZUltYWdlLChEaXNwbGF5KiBhLFZpc3VhbCogYix1bnNpZ25lZCBpbnQgYyxpbnQgZCxpbnQgZSxjaGFyKiBmLHVuc2lnbmVkIGludCBnLHVuc2lnbmVkIGludCBoLGludCBpLGludCBqKSwoYSxiLGMsZCxlLGYsZyxoLGksaikscmV0dXJuKQorU0RMX1gxMV9TWU0oUGl4bWFwLFhDcmVhdGVQaXhtYXAsKERpc3BsYXkqIGEsRHJhd2FibGUgYix1bnNpZ25lZCBpbnQgYyx1bnNpZ25lZCBpbnQgZCx1bnNpZ25lZCBpbnQgZSksKGEsYixjLGQsZSkscmV0dXJuKQorU0RMX1gxMV9TWU0oUGl4bWFwLFhDcmVhdGVQaXhtYXBGcm9tQml0bWFwRGF0YSwoRGlzcGxheSogYSxEcmF3YWJsZSBiLGNoYXIqIGMsdW5zaWduZWQgaW50IGQsdW5zaWduZWQgaW50IGUsdW5zaWduZWQgbG9uZyBmLHVuc2lnbmVkIGxvbmcgZyx1bnNpZ25lZCBpbnQgaCksKGEsYixjLGQsZSxmLGcsaCkscmV0dXJuKQorU0RMX1gxMV9TWU0oV2luZG93LFhDcmVhdGVTaW1wbGVXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIsaW50IGMsaW50IGQsdW5zaWduZWQgaW50IGUsdW5zaWduZWQgaW50IGYsdW5zaWduZWQgaW50IGcsdW5zaWduZWQgbG9uZyBoLHVuc2lnbmVkIGxvbmcgaSksKGEsYixjLGQsZSxmLGcsaCxpKSxyZXR1cm4pCitTRExfWDExX1NZTShXaW5kb3csWENyZWF0ZVdpbmRvdywoRGlzcGxheSogYSxXaW5kb3cgYixpbnQgYyxpbnQgZCx1bnNpZ25lZCBpbnQgZSx1bnNpZ25lZCBpbnQgZix1bnNpZ25lZCBpbnQgZyxpbnQgaCx1bnNpZ25lZCBpbnQgaSxWaXN1YWwqIGosdW5zaWduZWQgbG9uZyBrLFhTZXRXaW5kb3dBdHRyaWJ1dGVzKiBsKSwoYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYRGVmYXVsdFNjcmVlbiwoRGlzcGxheSogYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYRGlzcGxheVdpZHRoLChEaXNwbGF5KiBhLGludCBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWERpc3BsYXlXaWR0aE1NLChEaXNwbGF5KiBhLCBpbnQgYiksKGEsIGIpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYRGlzcGxheUhlaWdodCwoRGlzcGxheSogYSxpbnQgYiksKGEsYikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhEaXNwbGF5SGVpZ2h0TU0sKERpc3BsYXkqIGEsIGludCBiKSwoYSwgYikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhEZWZpbmVDdXJzb3IsKERpc3BsYXkqIGEsV2luZG93IGIsQ3Vyc29yIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhEZWxldGVQcm9wZXJ0eSwoRGlzcGxheSogYSxXaW5kb3cgYixBdG9tIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhEZXN0cm95V2luZG93LChEaXNwbGF5KiBhLFdpbmRvdyBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShjaGFyKixYRGlzcGxheU5hbWUsKF9YY29uc3QgY2hhciogYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYRXZlbnRzUXVldWVkLChEaXNwbGF5KiBhLGludCBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShCb29sLFhGaWx0ZXJFdmVudCwoWEV2ZW50ICpldmVudCwgV2luZG93IHcpLChldmVudCx3KSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWEZsdXNoLChEaXNwbGF5KiBhKSwoYSkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhGcmVlLCh2b2lkKmEpLChhKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWEZyZWVDb2xvcm1hcCwoRGlzcGxheSogYSxDb2xvcm1hcCBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWEZyZWVDb2xvcnMsKERpc3BsYXkqIGEsQ29sb3JtYXAgYix1bnNpZ25lZCBsb25nKiBjLGludCBkLHVuc2lnbmVkIGxvbmcgZSksKGEsYixjLGQsZSkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhGcmVlQ3Vyc29yLChEaXNwbGF5KiBhLEN1cnNvciBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWEZyZWVHQywoRGlzcGxheSogYSxHQyBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWEZyZWVNb2RpZmllcm1hcCwoWE1vZGlmaWVyS2V5bWFwKiBhKSwoYSkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhGcmVlUGl4bWFwLChEaXNwbGF5KiBhLFBpeG1hcCBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWEdldEVycm9yRGF0YWJhc2VUZXh0LChEaXNwbGF5KiBhLF9YY29uc3QgY2hhciogYixfWGNvbnN0IGNoYXIqIGMsX1hjb25zdCBjaGFyKiBkLGNoYXIqIGUsaW50IGYpLChhLGIsYyxkLGUsZikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhHZXRHZW9tZXRyeSwoRGlzcGxheSogYSxEcmF3YWJsZSBiLFdpbmRvdyogYyxpbnQqIGQsaW50KiBlLHVuc2lnbmVkIGludCogZix1bnNpZ25lZCBpbnQqIGcsdW5zaWduZWQgaW50KiBoLHVuc2lnbmVkIGludCogaSksKGEsYixjLGQsZSxmLGcsaCxpKSxyZXR1cm4pCitTRExfWDExX1NZTShYTW9kaWZpZXJLZXltYXAqLFhHZXRNb2RpZmllck1hcHBpbmcsKERpc3BsYXkqIGEpLChhKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWEdldFBvaW50ZXJDb250cm9sLChEaXNwbGF5KiBhLGludCogYixpbnQqIGMsaW50KiBkKSwoYSxiLGMsZCkscmV0dXJuKQorU0RMX1gxMV9TWU0oWFZpc3VhbEluZm8qLFhHZXRWaXN1YWxJbmZvLChEaXNwbGF5KiBhLGxvbmcgYixYVmlzdWFsSW5mbyogYyxpbnQqIGQpLChhLGIsYyxkKSxyZXR1cm4pCitTRExfWDExX1NZTShYV01IaW50cyosWEdldFdNSGludHMsKERpc3BsYXkqIGEsV2luZG93IGIpLChhLGIpLHJldHVybikKK1NETF9YMTFfU1lNKFN0YXR1cyxYR2V0V2luZG93QXR0cmlidXRlcywoRGlzcGxheSogYSxXaW5kb3cgYixYV2luZG93QXR0cmlidXRlcyogYyksKGEsYixjKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWEdyYWJLZXlib2FyZCwoRGlzcGxheSogYSxXaW5kb3cgYixCb29sIGMsaW50IGQsaW50IGUsVGltZSBmKSwoYSxiLGMsZCxlLGYpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYR3JhYlBvaW50ZXIsKERpc3BsYXkqIGEsV2luZG93IGIsQm9vbCBjLHVuc2lnbmVkIGludCBkLGludCBlLGludCBmLFdpbmRvdyBnLEN1cnNvciBoLFRpbWUgaSksKGEsYixjLGQsZSxmLGcsaCxpKSxyZXR1cm4pCitTRExfWDExX1NZTShTdGF0dXMsWEljb25pZnlXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIsaW50IGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oU3RhdHVzLFhJbml0VGhyZWFkcywodm9pZCksKCkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhJbnN0YWxsQ29sb3JtYXAsKERpc3BsYXkqIGEsQ29sb3JtYXAgYiksKGEsYikscmV0dXJuKQorU0RMX1gxMV9TWU0oS2V5Q29kZSxYS2V5c3ltVG9LZXljb2RlLChEaXNwbGF5KiBhLEtleVN5bSBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShBdG9tLFhJbnRlcm5BdG9tLChEaXNwbGF5KiBhLF9YY29uc3QgY2hhciogYixCb29sIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oWFBpeG1hcEZvcm1hdFZhbHVlcyosWExpc3RQaXhtYXBGb3JtYXRzLChEaXNwbGF5KiBhLGludCogYiksKGEsYikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhMb29rdXBTdHJpbmcsKFhLZXlFdmVudCogYSxjaGFyKiBiLGludCBjLEtleVN5bSogZCxYQ29tcG9zZVN0YXR1cyogZSksKGEsYixjLGQsZSkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhNYXBSYWlzZWQsKERpc3BsYXkqIGEsV2luZG93IGIpLChhLGIpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYTWFwV2luZG93LChEaXNwbGF5KiBhLFdpbmRvdyBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWE1hc2tFdmVudCwoRGlzcGxheSogYSxsb25nIGIsWEV2ZW50KiBjKSwoYSxiLGMpLHJldHVybikKK1NETF9YMTFfU1lNKFN0YXR1cyxYTWF0Y2hWaXN1YWxJbmZvLChEaXNwbGF5KiBhLGludCBiLGludCBjLGludCBkLFhWaXN1YWxJbmZvKiBlKSwoYSxiLGMsZCxlKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWE1pc3NpbmdFeHRlbnNpb24sKERpc3BsYXkqIGEsX1hjb25zdCBjaGFyKiBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWE1vdmVSZXNpemVXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIsaW50IGMsaW50IGQsdW5zaWduZWQgaW50IGUsdW5zaWduZWQgaW50IGYpLChhLGIsYyxkLGUsZikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhNb3ZlV2luZG93LChEaXNwbGF5KiBhLFdpbmRvdyBiLGludCBjLGludCBkKSwoYSxiLGMsZCkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhOZXh0RXZlbnQsKERpc3BsYXkqIGEsWEV2ZW50KiBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShEaXNwbGF5KixYT3BlbkRpc3BsYXksKF9YY29uc3QgY2hhciogYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYUGVla0V2ZW50LChEaXNwbGF5KiBhLFhFdmVudCogYiksKGEsYikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhQZW5kaW5nLChEaXNwbGF5KiBhKSwoYSkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhQdXRJbWFnZSwoRGlzcGxheSogYSxEcmF3YWJsZSBiLEdDIGMsWEltYWdlKiBkLGludCBlLGludCBmLGludCBnLGludCBoLHVuc2lnbmVkIGludCBpLHVuc2lnbmVkIGludCBqKSwoYSxiLGMsZCxlLGYsZyxoLGksaikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhRdWVyeUNvbG9ycywoRGlzcGxheSogYSxDb2xvcm1hcCBiLFhDb2xvciogYyxpbnQgZCksKGEsYixjLGQpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYUXVlcnlLZXltYXAsKERpc3BsYXkqIGEsY2hhciAqYiksKGEsYikscmV0dXJuKQorU0RMX1gxMV9TWU0oQm9vbCxYUXVlcnlQb2ludGVyLChEaXNwbGF5KiBhLFdpbmRvdyBiLFdpbmRvdyogYyxXaW5kb3cqIGQsaW50KiBlLGludCogZixpbnQqIGcsaW50KiBoLHVuc2lnbmVkIGludCogaSksKGEsYixjLGQsZSxmLGcsaCxpKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWFF1ZXJ5VHJlZSwoRGlzcGxheSogYSxXaW5kb3cgYixXaW5kb3cqIGMsV2luZG93KiBkLFdpbmRvdyoqIGUsdW5zaWduZWQgaW50KiBmKSwoYSxiLGMsZCxlLGYpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYUmFpc2VXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIpLChhLGIpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYUmVwYXJlbnRXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIsV2luZG93IGMsaW50IGQsaW50IGUpLChhLGIsYyxkLGUpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYUmVzZXRTY3JlZW5TYXZlciwoRGlzcGxheSogYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYUmVzaXplV2luZG93LChEaXNwbGF5KiBhLFdpbmRvdyBiLHVuc2lnbmVkIGludCBjLHVuc2lnbmVkIGludCBkKSwoYSxiLGMsZCkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhTZWxlY3RJbnB1dCwoRGlzcGxheSogYSxXaW5kb3cgYixsb25nIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oU3RhdHVzLFhTZW5kRXZlbnQsKERpc3BsYXkqIGEsV2luZG93IGIsQm9vbCBjLGxvbmcgZCxYRXZlbnQqIGUpLChhLGIsYyxkLGUpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYU2V0Q2xhc3NIaW50LChEaXNwbGF5KiBhLFdpbmRvdyBiLFhDbGFzc0hpbnQqIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oWEVycm9ySGFuZGxlcixYU2V0RXJyb3JIYW5kbGVyLChYRXJyb3JIYW5kbGVyIGEpLChhKSxyZXR1cm4pCitTRExfWDExX1NZTShYSU9FcnJvckhhbmRsZXIsWFNldElPRXJyb3JIYW5kbGVyLChYSU9FcnJvckhhbmRsZXIgYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYU2V0VHJhbnNpZW50Rm9ySGludCwoRGlzcGxheSogYSxXaW5kb3cgYixXaW5kb3cgYyksKGEsYixjKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWFNldFdNSGludHMsKERpc3BsYXkqIGEsV2luZG93IGIsWFdNSGludHMqIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0odm9pZCxYU2V0VGV4dFByb3BlcnR5LChEaXNwbGF5KiBhLFdpbmRvdyBiLFhUZXh0UHJvcGVydHkqIGMsQXRvbSBkKSwoYSxiLGMsZCksKQorU0RMX1gxMV9TWU0odm9pZCxYU2V0V01Ob3JtYWxIaW50cywoRGlzcGxheSogYSxXaW5kb3cgYixYU2l6ZUhpbnRzKiBjKSwoYSxiLGMpLCkKK1NETF9YMTFfU1lNKFN0YXR1cyxYU2V0V01Qcm90b2NvbHMsKERpc3BsYXkqIGEsV2luZG93IGIsQXRvbSogYyxpbnQgZCksKGEsYixjLGQpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYU2V0V2luZG93QmFja2dyb3VuZCwoRGlzcGxheSogYSxXaW5kb3cgYix1bnNpZ25lZCBsb25nIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhTZXRXaW5kb3dCYWNrZ3JvdW5kUGl4bWFwLChEaXNwbGF5KiBhLFdpbmRvdyBiLFBpeG1hcCBjKSwoYSxiLGMpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYU2V0V2luZG93Q29sb3JtYXAsKERpc3BsYXkqIGEsV2luZG93IGIsQ29sb3JtYXAgYyksKGEsYixjKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWFN0b3JlQ29sb3JzLChEaXNwbGF5KiBhLENvbG9ybWFwIGIsWENvbG9yKiBjLGludCBkKSwoYSxiLGMsZCkscmV0dXJuKQorU0RMX1gxMV9TWU0oU3RhdHVzLFhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHksKGNoYXIqKiBhLGludCBiLFhUZXh0UHJvcGVydHkqIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhTeW5jLChEaXNwbGF5KiBhLEJvb2wgYiksKGEsYikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhVbmdyYWJLZXlib2FyZCwoRGlzcGxheSogYSxUaW1lIGIpLChhLGIpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYVW5ncmFiUG9pbnRlciwoRGlzcGxheSogYSxUaW1lIGIpLChhLGIpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYVW5tYXBXaW5kb3csKERpc3BsYXkqIGEsV2luZG93IGIpLChhLGIpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYV2FycFBvaW50ZXIsKERpc3BsYXkqIGEsV2luZG93IGIsV2luZG93IGMsaW50IGQsaW50IGUsdW5zaWduZWQgaW50IGYsdW5zaWduZWQgaW50IGcsaW50IGgsIGludCBpKSwoYSxiLGMsZCxlLGYsZyxoLGkpLHJldHVybikKK1NETF9YMTFfU1lNKFZpc3VhbElELFhWaXN1YWxJREZyb21WaXN1YWwsKFZpc3VhbCogYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKFhFeHREaXNwbGF5SW5mbyosWGV4dEFkZERpc3BsYXksKFhFeHRlbnNpb25JbmZvKiBhLERpc3BsYXkqIGIsY2hhciogYyxYRXh0ZW5zaW9uSG9va3MqIGQsaW50IGUsWFBvaW50ZXIgZiksKGEsYixjLGQsZSxmKSxyZXR1cm4pCitTRExfWDExX1NZTShYRXh0ZW5zaW9uSW5mbyosWGV4dENyZWF0ZUV4dGVuc2lvbiwodm9pZCksKCkscmV0dXJuKQorU0RMX1gxMV9TWU0odm9pZCxYZXh0RGVzdHJveUV4dGVuc2lvbiwoWEV4dGVuc2lvbkluZm8qIGEpLChhKSwpCitTRExfWDExX1NZTShYRXh0RGlzcGxheUluZm8qLFhleHRGaW5kRGlzcGxheSwoWEV4dGVuc2lvbkluZm8qIGEsRGlzcGxheSogYiksKGEsYikscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFhleHRSZW1vdmVEaXNwbGF5LChYRXh0ZW5zaW9uSW5mbyogYSxEaXNwbGF5KiBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShCb29sLFhRdWVyeUV4dGVuc2lvbiwoRGlzcGxheSogYSxfWGNvbnN0IGNoYXIqIGIsaW50KiBjLGludCogZCxpbnQqIGUpLChhLGIsYyxkLGUpLHJldHVybikKK1NETF9YMTFfU1lNKGNoYXIgKixYRGlzcGxheVN0cmluZywoRGlzcGxheSogYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYR2V0RXJyb3JUZXh0LChEaXNwbGF5KiBhLGludCBiLGNoYXIqIGMsaW50IGQpLChhLGIsYyxkKSxyZXR1cm4pCitTRExfWDExX1NZTSh2b2lkLF9YRWF0RGF0YSwoRGlzcGxheSogYSx1bnNpZ25lZCBsb25nIGIpLChhLGIpLCkKK1NETF9YMTFfU1lNKHZvaWQsX1hGbHVzaCwoRGlzcGxheSogYSksKGEpLCkKK1NETF9YMTFfU1lNKHZvaWQsX1hGbHVzaEdDQ2FjaGUsKERpc3BsYXkqIGEsR0MgYiksKGEsYiksKQorU0RMX1gxMV9TWU0oaW50LF9YUmVhZCwoRGlzcGxheSogYSxjaGFyKiBiLGxvbmcgYyksKGEsYixjKSxyZXR1cm4pCitTRExfWDExX1NZTSh2b2lkLF9YUmVhZFBhZCwoRGlzcGxheSogYSxjaGFyKiBiLGxvbmcgYyksKGEsYixjKSwpCitTRExfWDExX1NZTSh2b2lkLF9YU2VuZCwoRGlzcGxheSogYSxfWGNvbnN0IGNoYXIqIGIsbG9uZyBjKSwoYSxiLGMpLCkKK1NETF9YMTFfU1lNKFN0YXR1cyxfWFJlcGx5LChEaXNwbGF5KiBhLHhSZXBseSogYixpbnQgYyxCb29sIGQpLChhLGIsYyxkKSxyZXR1cm4pCitTRExfWDExX1NZTSh1bnNpZ25lZCBsb25nLF9YU2V0TGFzdFJlcXVlc3RSZWFkLChEaXNwbGF5KiBhLHhHZW5lcmljUmVwbHkqIGIpLChhLGIpLHJldHVybikKK1NETF9YMTFfU1lNKFNETF9YMTFfWFN5bmNocm9uaXplUmV0VHlwZSxYU3luY2hyb25pemUsKERpc3BsYXkqIGEsQm9vbCBiKSwoYSxiKSxyZXR1cm4pCitTRExfWDExX1NZTShpbnQsWFRyYW5zbGF0ZUNvb3JkaW5hdGVzLChEaXNwbGF5KiBhLFdpbmRvdyBiLFdpbmRvdyBjLGludCBkLGludCBlLGludCogZixpbnQqIGcsV2luZG93KiBoKSwoYSxiLGMsZCxlLGYsZyxoKSxyZXR1cm4pCitTRExfWDExX1NZTShTRExfWDExX1hFU2V0V2lyZVRvRXZlbnRSZXRUeXBlLFhFU2V0V2lyZVRvRXZlbnQsKERpc3BsYXkqIGEsaW50IGIsU0RMX1gxMV9YRVNldFdpcmVUb0V2ZW50UmV0VHlwZSBjKSwoYSxiLGMpLHJldHVybikKK1NETF9YMTFfU1lNKFNETF9YMTFfWEVTZXRFdmVudFRvV2lyZVJldFR5cGUsWEVTZXRFdmVudFRvV2lyZSwoRGlzcGxheSogYSxpbnQgYixTRExfWDExX1hFU2V0RXZlbnRUb1dpcmVSZXRUeXBlIGMpLChhLGIsYykscmV0dXJuKQorU0RMX1gxMV9TWU0oWEV4dGVuc2lvbkVycm9ySGFuZGxlcixYU2V0RXh0ZW5zaW9uRXJyb3JIYW5kbGVyLChYRXh0ZW5zaW9uRXJyb3JIYW5kbGVyIGEpLChhKSxyZXR1cm4pCisKKyNpZiBOZWVkV2lkZVByb3RvdHlwZXMKK1NETF9YMTFfU1lNKEtleVN5bSxYS2V5Y29kZVRvS2V5c3ltLChEaXNwbGF5KiBhLHVuc2lnbmVkIGludCBiLGludCBjKSwoYSxiLGMpLHJldHVybikKKyNlbHNlCitTRExfWDExX1NZTShLZXlTeW0sWEtleWNvZGVUb0tleXN5bSwoRGlzcGxheSogYSxLZXlDb2RlIGIsaW50IGMpLChhLGIsYykscmV0dXJuKQorI2VuZGlmCisKKyNpZmRlZiBYX0hBVkVfVVRGOF9TVFJJTkcKK1NETF9YMTFfTU9EVUxFKFVURjgpCitTRExfWDExX1NZTShpbnQsWHV0ZjhUZXh0TGlzdFRvVGV4dFByb3BlcnR5LChEaXNwbGF5KiBhLGNoYXIqKiBiLGludCBjLFhJQ0NFbmNvZGluZ1N0eWxlIGQsWFRleHRQcm9wZXJ0eSogZSksKGEsYixjLGQsZSkscmV0dXJuKQorU0RMX1gxMV9TWU0oaW50LFh1dGY4TG9va3VwU3RyaW5nLChYSUMgYSxYS2V5UHJlc3NlZEV2ZW50KiBiLGNoYXIqIGMsaW50IGQsS2V5U3ltKiBlLFN0YXR1cyogZiksKGEsYixjLGQsZSxmKSxyZXR1cm4pCisvKlNETF9YMTFfU1lNKFhJQyxYQ3JlYXRlSUMsKFhJTSwgLi4uKSxyZXR1cm4pICAhISEgQVJHSCEgKi8KK1NETF9YMTFfU1lNKHZvaWQsWERlc3Ryb3lJQywoWElDIGEpLChhKSwpCitTRExfWDExX1NZTSh2b2lkLFhTZXRJQ0ZvY3VzLChYSUMgYSksKGEpLCkKK1NETF9YMTFfU1lNKHZvaWQsWFVuc2V0SUNGb2N1cywoWElDIGEpLChhKSwpCisvKlNETF9YMTFfU1lNKGNoYXIqLFhHZXRJQ1ZhbHVlcywoWElDIGEsIC4uLikscmV0dXJuKSovCitTRExfWDExX1NZTShYSU0sWE9wZW5JTSwoRGlzcGxheSogYSxzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMqIGIsY2hhciogYyxjaGFyKiBkKSwoYSxiLGMsZCkscmV0dXJuKQorU0RMX1gxMV9TWU0oU3RhdHVzLFhDbG9zZUlNLChYSU0gYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKGNoYXIqLFhTZXRMb2NhbGVNb2RpZmllcnMsKF9YY29uc3QgY2hhciogYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxYUmVmcmVzaEtleWJvYXJkTWFwcGluZywoWE1hcHBpbmdFdmVudCogYSksKGEpLHJldHVybikKK1NETF9YMTFfU1lNKERpc3BsYXkqLFhEaXNwbGF5T2ZJTSwoWElNIGEpLChhKSxyZXR1cm4pCisjZW5kaWYKKworI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCitTRExfWDExX01PRFVMRShTSE0pCitTRExfWDExX1NZTShTdGF0dXMsWFNobUF0dGFjaCwoRGlzcGxheSogYSxYU2htU2VnbWVudEluZm8qIGIpLChhLGIpLHJldHVybikKK1NETF9YMTFfU1lNKFN0YXR1cyxYU2htRGV0YWNoLChEaXNwbGF5KiBhLFhTaG1TZWdtZW50SW5mbyogYiksKGEsYikscmV0dXJuKQorU0RMX1gxMV9TWU0oU3RhdHVzLFhTaG1QdXRJbWFnZSwoRGlzcGxheSogYSxEcmF3YWJsZSBiLEdDIGMsWEltYWdlKiBkLGludCBlLGludCBmLGludCBnLGludCBoLHVuc2lnbmVkIGludCBpLHVuc2lnbmVkIGludCBqLEJvb2wgayksKGEsYixjLGQsZSxmLGcsaCxpLGosaykscmV0dXJuKQorU0RMX1gxMV9TWU0oWEltYWdlKixYU2htQ3JlYXRlSW1hZ2UsKERpc3BsYXkqIGEsVmlzdWFsKiBiLHVuc2lnbmVkIGludCBjLGludCBkLGNoYXIqIGUsWFNobVNlZ21lbnRJbmZvKiBmLHVuc2lnbmVkIGludCBnLHVuc2lnbmVkIGludCBoKSwoYSxiLGMsZCxlLGYsZyxoKSxyZXR1cm4pCitTRExfWDExX1NZTShCb29sLFhTaG1RdWVyeUV4dGVuc2lvbiwoRGlzcGxheSogYSksKGEpLHJldHVybikKKyNlbmRpZgorCisvKgorICogTm90IHJlcXVpcmVkLi4udGhlc2Ugb25seSBleGlzdCBpbiBjb2RlIGluIGhlYWRlcnMgb24gc29tZSA2NC1iaXQgcGxhdGZvcm1zLAorICogIGFuZCBhcmUgcmVtb3ZlZCB2aWEgbWFjcm9zIGVsc2V3aGVyZSwgc28gaXQncyBzYWZlIGZvciB0aGVtIHRvIGJlIG1pc3NpbmcuCisgKi8KKyNpZmRlZiBMT05HNjQKK1NETF9YMTFfTU9EVUxFKElPXzMyQklUKQorU0RMX1gxMV9TWU0oaW50LF9YRGF0YTMyLChEaXNwbGF5ICpkcHkscmVnaXN0ZXIgbG9uZyAqZGF0YSx1bnNpZ25lZCBsZW4pLChkcHksZGF0YSxsZW4pLHJldHVybikKK1NETF9YMTFfU1lNKHZvaWQsX1hSZWFkMzIsKERpc3BsYXkgKmRweSxyZWdpc3RlciBsb25nICpkYXRhLGxvbmcgbGVuKSwoZHB5LGRhdGEsbGVuKSwpCisjZW5kaWYKKworLyoKKyAqIGxpYlgxMSAxLjQuOTkuMSBhZGRlZCBfWEdldFJlcXVlc3QsIGFuZCBtYWNyb3MgdXNlIGl0IGJlaGluZCB0aGUgc2NlbmVzLgorICovCitTRExfWDExX01PRFVMRShYR0VUUkVRVUVTVCkKK1NETF9YMTFfU1lNKHZvaWQgKixfWEdldFJlcXVlc3QsKERpc3BsYXkqIGEsQ0FSRDggYixzaXplX3QgYyksKGEsYixjKSxyZXR1cm4pCisKKy8qCisgKiBUaGVzZSBvbmx5IHNob3cgdXAgb24gc29tZSB2YXJpYW50cyBvZiBVbml4LgorICovCisjaWYgZGVmaW5lZChfX29zZl9fKQorU0RMX1gxMV9NT0RVTEUoT1NGX0VOVFJZX1BPSU5UUykKK1NETF9YMTFfU1lNKHZvaWQsX1NtdEJ1ZmZlck92ZXJmbG93LChEaXNwbGF5ICpkcHkscmVnaXN0ZXIgc210RGlzcGxheVB0ciBwKSwoZHB5LHApLCkKK1NETF9YMTFfU1lNKHZvaWQsX1NtdElwRXJyb3IsKERpc3BsYXkgKmRweSxyZWdpc3RlciBzbXREaXNwbGF5UHRyIHAsIGludCBpKSwoZHB5LHAsaSksKQorU0RMX1gxMV9TWU0oaW50LGlwQWxsb2NhdGVEYXRhLChDaGFubmVsUHRyIGEsIElQQ2FyZCBiLCBJUERhdGFQdHIgKiBjKSwoYSxiLGMpLHJldHVybikKK1NETF9YMTFfU1lNKGludCxpcFVuYWxsb2NhdGVBbmRTZW5kRGF0YSwoQ2hhbm5lbFB0ciBhLCBJUENhcmQgYiksKGEsYikscmV0dXJuKQorI2VuZGlmCisKKy8qIFhyYW5kciBzdXBwb3J0LiAqLworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUgorU0RMX1gxMV9NT0RVTEUoWFJBTkRSKQorU0RMX1gxMV9TWU0oU3RhdHVzLFhSUlF1ZXJ5VmVyc2lvbiwoRGlzcGxheSAqZHB5LGludCAqbWFqb3JfdmVyc2lvbnAsaW50ICptaW5vcl92ZXJzaW9ucCksKGRweSxtYWpvcl92ZXJzaW9ucCxtaW5vcl92ZXJzaW9ucCkscmV0dXJuKQorU0RMX1gxMV9TWU0oWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqLFhSUkdldFNjcmVlbkluZm8sKERpc3BsYXkgKmRweSxEcmF3YWJsZSBkcmF3KSwoZHB5LGRyYXcpLHJldHVybikKK1NETF9YMTFfU1lNKFNpemVJRCxYUlJDb25maWdDdXJyZW50Q29uZmlndXJhdGlvbiwoWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqY29uZmlnLFJvdGF0aW9uICpyb3RhdGlvbiksKGNvbmZpZyxyb3RhdGlvbikscmV0dXJuKQorU0RMX1gxMV9TWU0oWFJSU2NyZWVuU2l6ZSAqLFhSUkNvbmZpZ1NpemVzLChYUlJTY3JlZW5Db25maWd1cmF0aW9uICpjb25maWcsIGludCAqbnNpemVzKSwoY29uZmlnLG5zaXplcykscmV0dXJuKQorU0RMX1gxMV9TWU0oU3RhdHVzLFhSUlNldFNjcmVlbkNvbmZpZywoRGlzcGxheSAqZHB5LCBYUlJTY3JlZW5Db25maWd1cmF0aW9uICpjb25maWcsIERyYXdhYmxlIGRyYXcsIGludCBzaXplX2luZGV4LCBSb3RhdGlvbiByb3RhdGlvbiwgVGltZSB0aW1lc3RhbXApLChkcHksY29uZmlnLGRyYXcsc2l6ZV9pbmRleCxyb3RhdGlvbix0aW1lc3RhbXApLHJldHVybikKK1NETF9YMTFfU1lNKHZvaWQsWFJSRnJlZVNjcmVlbkNvbmZpZ0luZm8sKFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZyksKGNvbmZpZyksKQorI2VuZGlmCisKKy8qIGVuZCBvZiBTRExfeDExc3ltLmggLi4uICovCisKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTF2aWRlby5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyNDQyMgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTF2aWRlby5jCkBAIC0wLDAgKzEsMTU4MCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFgxMSBiYXNlZCBTREwgdmlkZW8gZHJpdmVyIGltcGxlbWVudGF0aW9uLgorICAgTm90ZTogIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY3VycmVudGx5IG5lZWQgWDExIHRocmVhZCBsb2NraW5nLAorICAgICAgICAgIHNpbmNlIHRoZSBldmVudCB0aHJlYWQgdXNlcyBhIHNlcGFyYXRlIFggY29ubmVjdGlvbiBhbmQgYW55CisgICAgICAgICAgYWRkaXRpb25hbCBsb2NraW5nIG5lY2Vzc2FyeSBpcyBoYW5kbGVkIGludGVybmFsbHkuICBIb3dldmVyLAorICAgICAgICAgIGlmIGZ1bGwgbG9ja2luZyBpcyBuZWNjZXNzYXJ5LCB0YWtlIGEgbG9vayBhdCBYSW5pdFRocmVhZHMoKS4KKyovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpZmRlZiBNVFJSX1NVUFBPUlQKKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJTRExfZW5kaWFuLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorI2luY2x1ZGUgIlNETF92aWRlby5oIgorI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorI2luY2x1ZGUgIi4uL1NETF9waXhlbHNfYy5oIgorI2luY2x1ZGUgIi4uLy4uL2V2ZW50cy9TRExfZXZlbnRzX2MuaCIKKyNpbmNsdWRlICJTRExfeDExdmlkZW8uaCIKKyNpbmNsdWRlICJTRExfeDExd21fYy5oIgorI2luY2x1ZGUgIlNETF94MTFtb3VzZV9jLmgiCisjaW5jbHVkZSAiU0RMX3gxMWV2ZW50c19jLmgiCisjaW5jbHVkZSAiU0RMX3gxMW1vZGVzX2MuaCIKKyNpbmNsdWRlICJTRExfeDExaW1hZ2VfYy5oIgorI2luY2x1ZGUgIlNETF94MTF5dXZfYy5oIgorI2luY2x1ZGUgIlNETF94MTFnbF9jLmgiCisjaW5jbHVkZSAiU0RMX3gxMWdhbW1hX2MuaCIKKyNpbmNsdWRlICIuLi9ibGFua19jdXJzb3IuaCIKKworI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworI2luY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKy8qIEluaXRpYWxpemF0aW9uL1F1ZXJ5IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBYMTFfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpOworc3RhdGljIFNETF9TdXJmYWNlICpYMTFfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpOworc3RhdGljIGludCBYMTFfVG9nZ2xlRnVsbFNjcmVlbihfVEhJUywgaW50IG9uKTsKK3N0YXRpYyB2b2lkIFgxMV9VcGRhdGVNb3VzZShfVEhJUyk7CitzdGF0aWMgaW50IFgxMV9TZXRDb2xvcnMoX1RISVMsIGludCBmaXJzdGNvbG9yLCBpbnQgbmNvbG9ycywKKwkJCSBTRExfQ29sb3IgKmNvbG9ycyk7CitzdGF0aWMgaW50IFgxMV9TZXRHYW1tYVJhbXAoX1RISVMsIFVpbnQxNiAqcmFtcCk7CitzdGF0aWMgdm9pZCBYMTFfVmlkZW9RdWl0KF9USElTKTsKKworaW50ICBYMTFfd21YQWRqdXN0OworaW50ICBYMTFfd21ZQWRqdXN0OworCisvKiBYMTEgZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBYMTFfQXZhaWxhYmxlKHZvaWQpCit7CisJRGlzcGxheSAqZGlzcGxheSA9IE5VTEw7CisJaWYgKCBTRExfWDExX0xvYWRTeW1ib2xzKCkgKSB7CisJCWRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoTlVMTCk7CisJCWlmICggZGlzcGxheSAhPSBOVUxMICkgeworCQkJWENsb3NlRGlzcGxheShkaXNwbGF5KTsKKwkJfQorCQlTRExfWDExX1VubG9hZFN5bWJvbHMoKTsKKwl9CisJcmV0dXJuKGRpc3BsYXkgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIFgxMV9EZWxldGVEZXZpY2UoU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UpCit7CisJaWYgKCBkZXZpY2UgKSB7CisJCWlmICggZGV2aWNlLT5oaWRkZW4gKSB7CisJCQlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJCX0KKwkJaWYgKCBkZXZpY2UtPmdsX2RhdGEgKSB7CisJCQlTRExfZnJlZShkZXZpY2UtPmdsX2RhdGEpOworCQl9CisJCVNETF9mcmVlKGRldmljZSk7CisJCVNETF9YMTFfVW5sb2FkU3ltYm9scygpOworCX0KK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqWDExX0NyZWF0ZURldmljZShpbnQgZGV2aW5kZXgpCit7CisJU0RMX1ZpZGVvRGV2aWNlICpkZXZpY2UgPSBOVUxMOworCisJaWYgKCBTRExfWDExX0xvYWRTeW1ib2xzKCkgKSB7CisJCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJCWRldmljZSA9IChTRExfVmlkZW9EZXZpY2UgKilTRExfbWFsbG9jKHNpemVvZihTRExfVmlkZW9EZXZpY2UpKTsKKwkJaWYgKCBkZXZpY2UgKSB7CisJCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCQlkZXZpY2UtPmhpZGRlbiA9IChzdHJ1Y3QgU0RMX1ByaXZhdGVWaWRlb0RhdGEgKikKKwkJCQkJU0RMX21hbGxvYygoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCQkJZGV2aWNlLT5nbF9kYXRhID0gKHN0cnVjdCBTRExfUHJpdmF0ZUdMRGF0YSAqKQorCQkJCQlTRExfbWFsbG9jKChzaXplb2YgKmRldmljZS0+Z2xfZGF0YSkpOworCQl9CisJCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgfHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UtPmdsX2RhdGEgPT0gTlVMTCkgKSB7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCVgxMV9EZWxldGVEZXZpY2UoZGV2aWNlKTsgLyogY2FsbHMgU0RMX1gxMV9VbmxvYWRTeW1ib2xzKCkuICovCisJCQlyZXR1cm4oMCk7CisJCX0KKwkJU0RMX21lbXNldChkZXZpY2UtPmhpZGRlbiwgMCwgKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwkJU0RMX21lbXNldChkZXZpY2UtPmdsX2RhdGEsIDAsIChzaXplb2YgKmRldmljZS0+Z2xfZGF0YSkpOworCisjaWYgU0RMX1ZJREVPX09QRU5HTF9HTFgKKwkJZGV2aWNlLT5nbF9kYXRhLT5zd2FwX2ludGVydmFsID0gLTE7CisjZW5kaWYKKworCQkvKiBTZXQgdGhlIGRyaXZlciBmbGFncyAqLworCQlkZXZpY2UtPmhhbmRsZXNfYW55X3NpemUgPSAxOworCisJCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwkJZGV2aWNlLT5WaWRlb0luaXQgPSBYMTFfVmlkZW9Jbml0OworCQlkZXZpY2UtPkxpc3RNb2RlcyA9IFgxMV9MaXN0TW9kZXM7CisJCWRldmljZS0+U2V0VmlkZW9Nb2RlID0gWDExX1NldFZpZGVvTW9kZTsKKwkJZGV2aWNlLT5Ub2dnbGVGdWxsU2NyZWVuID0gWDExX1RvZ2dsZUZ1bGxTY3JlZW47CisJCWRldmljZS0+VXBkYXRlTW91c2UgPSBYMTFfVXBkYXRlTW91c2U7CisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWFYKKwkJZGV2aWNlLT5DcmVhdGVZVVZPdmVybGF5ID0gWDExX0NyZWF0ZVlVVk92ZXJsYXk7CisjZW5kaWYKKwkJZGV2aWNlLT5TZXRDb2xvcnMgPSBYMTFfU2V0Q29sb3JzOworCQlkZXZpY2UtPlVwZGF0ZVJlY3RzID0gTlVMTDsKKwkJZGV2aWNlLT5WaWRlb1F1aXQgPSBYMTFfVmlkZW9RdWl0OworCQlkZXZpY2UtPkFsbG9jSFdTdXJmYWNlID0gWDExX0FsbG9jSFdTdXJmYWNlOworCQlkZXZpY2UtPkNoZWNrSFdCbGl0ID0gTlVMTDsKKwkJZGV2aWNlLT5GaWxsSFdSZWN0ID0gTlVMTDsKKwkJZGV2aWNlLT5TZXRIV0NvbG9yS2V5ID0gTlVMTDsKKwkJZGV2aWNlLT5TZXRIV0FscGhhID0gTlVMTDsKKwkJZGV2aWNlLT5Mb2NrSFdTdXJmYWNlID0gWDExX0xvY2tIV1N1cmZhY2U7CisJCWRldmljZS0+VW5sb2NrSFdTdXJmYWNlID0gWDExX1VubG9ja0hXU3VyZmFjZTsKKwkJZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gWDExX0ZsaXBIV1N1cmZhY2U7CisJCWRldmljZS0+RnJlZUhXU3VyZmFjZSA9IFgxMV9GcmVlSFdTdXJmYWNlOworCQlkZXZpY2UtPlNldEdhbW1hID0gWDExX1NldFZpZE1vZGVHYW1tYTsKKwkJZGV2aWNlLT5HZXRHYW1tYSA9IFgxMV9HZXRWaWRNb2RlR2FtbWE7CisJCWRldmljZS0+U2V0R2FtbWFSYW1wID0gWDExX1NldEdhbW1hUmFtcDsKKwkJZGV2aWNlLT5HZXRHYW1tYVJhbXAgPSBOVUxMOworI2lmIFNETF9WSURFT19PUEVOR0xfR0xYCisJCWRldmljZS0+R0xfTG9hZExpYnJhcnkgPSBYMTFfR0xfTG9hZExpYnJhcnk7CisJCWRldmljZS0+R0xfR2V0UHJvY0FkZHJlc3MgPSBYMTFfR0xfR2V0UHJvY0FkZHJlc3M7CisJCWRldmljZS0+R0xfR2V0QXR0cmlidXRlID0gWDExX0dMX0dldEF0dHJpYnV0ZTsKKwkJZGV2aWNlLT5HTF9NYWtlQ3VycmVudCA9IFgxMV9HTF9NYWtlQ3VycmVudDsKKwkJZGV2aWNlLT5HTF9Td2FwQnVmZmVycyA9IFgxMV9HTF9Td2FwQnVmZmVyczsKKyNlbmRpZgorCQlkZXZpY2UtPlNldENhcHRpb24gPSBYMTFfU2V0Q2FwdGlvbjsKKwkJZGV2aWNlLT5TZXRJY29uID0gWDExX1NldEljb247CisJCWRldmljZS0+SWNvbmlmeVdpbmRvdyA9IFgxMV9JY29uaWZ5V2luZG93OworCQlkZXZpY2UtPkdyYWJJbnB1dCA9IFgxMV9HcmFiSW5wdXQ7CisJCWRldmljZS0+R2V0V2luZG93UG9zID0gWDExX0dldFdpbmRvd1BvczsKKwkJZGV2aWNlLT5TZXRXaW5kb3dQb3MgPSBYMTFfU2V0V2luZG93UG9zOworCQlkZXZpY2UtPklzV2luZG93VmlzaWJsZSA9IFgxMV9Jc1dpbmRvd1Zpc2libGU7CisJCWRldmljZS0+R2V0TW9uaXRvckRQSSA9IFgxMV9HZXRNb25pdG9yRFBJOworCQlkZXZpY2UtPkdldE1vbml0b3JSZWN0ID0gWDExX0dldE1vbml0b3JSZWN0OworCQlkZXZpY2UtPkdldFdNSW5mbyA9IFgxMV9HZXRXTUluZm87CisJCWRldmljZS0+RnJlZVdNQ3Vyc29yID0gWDExX0ZyZWVXTUN1cnNvcjsKKwkJZGV2aWNlLT5DcmVhdGVXTUN1cnNvciA9IFgxMV9DcmVhdGVXTUN1cnNvcjsKKwkJZGV2aWNlLT5TaG93V01DdXJzb3IgPSBYMTFfU2hvd1dNQ3Vyc29yOworCQlkZXZpY2UtPldhcnBXTUN1cnNvciA9IFgxMV9XYXJwV01DdXJzb3I7CisJCWRldmljZS0+Q2hlY2tNb3VzZU1vZGUgPSBYMTFfQ2hlY2tNb3VzZU1vZGU7CisJCWRldmljZS0+SW5pdE9TS2V5bWFwID0gWDExX0luaXRPU0tleW1hcDsKKwkJZGV2aWNlLT5QdW1wRXZlbnRzID0gWDExX1B1bXBFdmVudHM7CisKKwkJZGV2aWNlLT5mcmVlID0gWDExX0RlbGV0ZURldmljZTsKKwl9CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBYMTFfYm9vdHN0cmFwID0geworCSJ4MTEiLCAiWCBXaW5kb3cgU3lzdGVtIiwKKwlYMTFfQXZhaWxhYmxlLCBYMTFfQ3JlYXRlRGV2aWNlCit9OworCisvKiBOb3JtYWwgWDExIGVycm9yIGhhbmRsZXIgcm91dGluZSAqLworc3RhdGljIGludCAoKlhfaGFuZGxlcikoRGlzcGxheSAqLCBYRXJyb3JFdmVudCAqKSA9IE5VTEw7CitzdGF0aWMgaW50IHhfZXJyaGFuZGxlcihEaXNwbGF5ICpkLCBYRXJyb3JFdmVudCAqZSkKK3sKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFCisJZXh0ZXJuIGludCB2bV9lcnJvcjsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfWDExX0RHQU1PVVNFCisJZXh0ZXJuIGludCBkZ2FfZXJyb3I7CisjZW5kaWYKKworI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKKwkvKiBWaWRNb2RlIGVycm9ycyBhcmUgbm9uLWZhdGFsLiA6KSAqLworCS8qIEFyZSB0aGUgZXJyb3JzIG9mZnNldCBieSBvbmUgZnJvbSB0aGUgZXJyb3IgYmFzZT8KKwkgICBlLmcuIHRoZSBlcnJvciBiYXNlIGlzIDE0MywgdGhlIGNvZGUgaXMgMTQ4LCBhbmQgdGhlCisJICAgICAgICBhY3R1YWwgZXJyb3IgaXMgWEY4NlZpZE1vZGVFeHRlbnNpb25EaXNhYmxlZCAoNCkgPworCSAqLworICAgICAgICBpZiAoICh2bV9lcnJvciA+PSAwKSAmJgorCSAgICAgKCgoZS0+ZXJyb3JfY29kZSA9PSBCYWRSZXF1ZXN0KSYmKGUtPnJlcXVlc3RfY29kZSA9PSB2bV9lcnJvcikpIHx8CisJICAgICAgKChlLT5lcnJvcl9jb2RlID4gdm1fZXJyb3IpICYmCisJICAgICAgIChlLT5lcnJvcl9jb2RlIDw9ICh2bV9lcnJvcitYRjg2VmlkTW9kZU51bWJlckVycm9ycykpKSkgKSB7CisjaWZkZWYgWDExX0RFQlVHCit7IGNoYXIgZXJybXNnWzEwMjRdOworICBYR2V0RXJyb3JUZXh0KGQsIGUtPmVycm9yX2NvZGUsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworcHJpbnRmKCJWaWRNb2RlIGVycm9yOiAlc1xuIiwgZXJybXNnKTsKK30KKyNlbmRpZgorICAgICAgICAJcmV0dXJuKDApOworICAgICAgICB9CisjZW5kaWYgLyogU0RMX1ZJREVPX0RSSVZFUl9YMTFfVklETU9ERSAqLworCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfREdBTU9VU0UKKwkvKiBER0EgZXJyb3JzIGNhbiBiZSBub24tZmF0YWwuIDopICovCisgICAgICAgIGlmICggKGRnYV9lcnJvciA+PSAwKSAmJgorCSAgICAgKChlLT5lcnJvcl9jb2RlID4gZGdhX2Vycm9yKSAmJgorCSAgICAgIChlLT5lcnJvcl9jb2RlIDw9IChkZ2FfZXJyb3IrWEY4NkRHQU51bWJlckVycm9ycykpKSApIHsKKyNpZmRlZiBYMTFfREVCVUcKK3sgY2hhciBlcnJtc2dbMTAyNF07CisgIFhHZXRFcnJvclRleHQoZCwgZS0+ZXJyb3JfY29kZSwgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CitwcmludGYoIkRHQSBlcnJvcjogJXNcbiIsIGVycm1zZyk7Cit9CisjZW5kaWYKKyAgICAgICAgCXJldHVybigwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFNETF9WSURFT19EUklWRVJfWDExX0RHQU1PVVNFICovCisKKwlyZXR1cm4oWF9oYW5kbGVyKGQsZSkpOworfQorCisvKiBYMTEgSS9PIGVycm9yIGhhbmRsZXIgcm91dGluZSAqLworc3RhdGljIGludCAoKlhJT19oYW5kbGVyKShEaXNwbGF5ICopID0gTlVMTDsKK3N0YXRpYyBpbnQgeGlvX2VycmhhbmRsZXIoRGlzcGxheSAqZCkKK3sKKwkvKiBBY2shICBMb3N0IFgxMSBjb25uZWN0aW9uISAqLworCisJLyogV2Ugd2lsbCBjcmFzaCBpZiB3ZSB0cnkgdG8gY2xlYW4gdXAgb3VyIGRpc3BsYXkgKi8KKwlpZiAoIFNETF9WaWRlb1N1cmZhY2UgJiYgY3VycmVudF92aWRlby0+aGlkZGVuLT5YaW1hZ2UgKSB7CisJCVNETF9WaWRlb1N1cmZhY2UtPnBpeGVscyA9IE5VTEw7CisJfQorCWN1cnJlbnRfdmlkZW8tPmhpZGRlbi0+WDExX0Rpc3BsYXkgPSBOVUxMOworCisJLyogQ29udGludWUgd2l0aCB0aGUgc3RhbmRhcmQgWDExIGVycm9yIGhhbmRsZXIgKi8KKwlyZXR1cm4oWElPX2hhbmRsZXIoZCkpOworfQorCitzdGF0aWMgaW50ICgqWGV4dF9oYW5kbGVyKShEaXNwbGF5ICosIF9YY29uc3QgY2hhciAqLCBfWGNvbnN0IGNoYXIgKikgPSBOVUxMOworc3RhdGljIGludCB4ZXh0X2VycmhhbmRsZXIoRGlzcGxheSAqZCwgX1hjb25zdCBjaGFyICpleHQsIF9YY29uc3QgY2hhciAqcmVhc29uKQoreworI2lmZGVmIFgxMV9ERUJVRworCXByaW50ZigiWGV4dCBlcnJvciBpbnNpZGUgU0RMIChtYXkgYmUgaGFybWxlc3MpOlxuIik7CisJcHJpbnRmKCIgIEV4dGVuc2lvbiBcIiVzXCIgJXMgb24gZGlzcGxheSBcIiVzXCIuXG4iLAorCSAgICAgICBleHQsIHJlYXNvbiwgWERpc3BsYXlTdHJpbmcoZCkpOworI2VuZGlmCisKKwlpZiAoU0RMX3N0cmNtcChyZWFzb24sICJtaXNzaW5nIikgPT0gMCkgeworCQkvKgorCQkgKiBTaW5jZSB0aGUgcXVlcnkgaXRzZWxmLCBlbHNld2hlcmUsIGNhbiBoYW5kbGUgYSBtaXNzaW5nIGV4dGVuc2lvbgorCQkgKiAgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpbiBYbGliIGlzIHRvIHdyaXRlIHRvIHN0ZGVyciwgd2hpY2gKKwkJICogIGdlbmVyYXRlcyB1bm5lY2Vzc2FyeSBidWcgcmVwb3J0cywgd2UganVzdCBpZ25vcmUgdGhlc2UuCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBFdmVyeXRoaW5nIGVsc2UgZ29lcyB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLi4uICovCisJcmV0dXJuIFhleHRfaGFuZGxlcihkLCBleHQsIHJlYXNvbik7Cit9CisKKy8qIEZpbmQgb3V0IHdoYXQgY2xhc3MgbmFtZSB3ZSBzaG91bGQgdXNlICovCitzdGF0aWMgY2hhciAqZ2V0X2NsYXNzbmFtZShjaGFyICpjbGFzc25hbWUsIGludCBtYXhsZW4pCit7CisJY2hhciAqc3BvdDsKKyNpZiBkZWZpbmVkKF9fTElOVVhfXykgfHwgZGVmaW5lZChfX0ZSRUVCU0RfXykKKwljaGFyIHByb2NmaWxlWzEwMjRdOworCWNoYXIgbGlua2ZpbGVbMTAyNF07CisJaW50IGxpbmtzaXplOworI2VuZGlmCisKKwkvKiBGaXJzdCBhbGxvdyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZSAqLworCXNwb3QgPSBTRExfZ2V0ZW52KCJTRExfVklERU9fWDExX1dNQ0xBU1MiKTsKKwlpZiAoIHNwb3QgKSB7CisJCVNETF9zdHJsY3B5KGNsYXNzbmFtZSwgc3BvdCwgbWF4bGVuKTsKKwkJcmV0dXJuIGNsYXNzbmFtZTsKKwl9CisKKwkvKiBOZXh0IGxvb2sgYXQgdGhlIGFwcGxpY2F0aW9uJ3MgZXhlY3V0YWJsZSBuYW1lICovCisjaWYgZGVmaW5lZChfX0xJTlVYX18pIHx8IGRlZmluZWQoX19GUkVFQlNEX18pCisjaWYgZGVmaW5lZChfX0xJTlVYX18pCisJU0RMX3NucHJpbnRmKHByb2NmaWxlLCBTRExfYXJyYXlzaXplKHByb2NmaWxlKSwgIi9wcm9jLyVkL2V4ZSIsIGdldHBpZCgpKTsKKyNlbGlmIGRlZmluZWQoX19GUkVFQlNEX18pCisJU0RMX3NucHJpbnRmKHByb2NmaWxlLCBTRExfYXJyYXlzaXplKHByb2NmaWxlKSwgIi9wcm9jLyVkL2ZpbGUiLCBnZXRwaWQoKSk7CisjZWxzZQorI2Vycm9yIFdoZXJlIGNhbiB3ZSBmaW5kIHRoZSBleGVjdXRhYmxlIG5hbWU/CisjZW5kaWYKKwlsaW5rc2l6ZSA9IHJlYWRsaW5rKHByb2NmaWxlLCBsaW5rZmlsZSwgc2l6ZW9mKGxpbmtmaWxlKS0xKTsKKwlpZiAoIGxpbmtzaXplID4gMCApIHsKKwkJbGlua2ZpbGVbbGlua3NpemVdID0gJ1wwJzsKKwkJc3BvdCA9IFNETF9zdHJyY2hyKGxpbmtmaWxlLCAnLycpOworCQlpZiAoIHNwb3QgKSB7CisJCQlTRExfc3RybGNweShjbGFzc25hbWUsIHNwb3QrMSwgbWF4bGVuKTsKKwkJfSBlbHNlIHsKKwkJCVNETF9zdHJsY3B5KGNsYXNzbmFtZSwgbGlua2ZpbGUsIG1heGxlbik7CisJCX0KKwkJcmV0dXJuIGNsYXNzbmFtZTsKKwl9CisjZW5kaWYgLyogX19MSU5VWF9fICovCisKKwkvKiBGaW5hbGx5IHVzZSB0aGUgZGVmYXVsdCB3ZSd2ZSB1c2VkIGZvcmV2ZXIgKi8KKwlTRExfc3RybGNweShjbGFzc25hbWUsICJTRExfQXBwIiwgbWF4bGVuKTsKKwlyZXR1cm4gY2xhc3NuYW1lOworfQorCisvKiBDcmVhdGUgYXV4aWxpYXJ5ICh0b3BsZXZlbCkgd2luZG93cyB3aXRoIHRoZSBjdXJyZW50IHZpc3VhbCAqLworc3RhdGljIHZvaWQgY3JlYXRlX2F1eF93aW5kb3dzKF9USElTKQoreworICAgIGludCB4ID0gMCwgeSA9IDA7CisgICAgY2hhciBjbGFzc25hbWVbMTAyNF07CisgICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgeGF0dHI7CisgICAgWFdNSGludHMgKmhpbnRzOworICAgIHVuc2lnbmVkIGxvbmcgYXBwX2V2ZW50X21hc2s7CisgICAgaW50IGRlZl92aXMgPSAoU0RMX1Zpc3VhbCA9PSBEZWZhdWx0VmlzdWFsKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKSk7CisKKyAgICAvKiBMb29rIHVwIHNvbWUgdXNlZnVsIEF0b21zICovCisgICAgV01fREVMRVRFX1dJTkRPVyA9IFhJbnRlcm5BdG9tKFNETF9EaXNwbGF5LCAiV01fREVMRVRFX1dJTkRPVyIsIEZhbHNlKTsKKworICAgIC8qIERvbid0IGNyZWF0ZSBhbnkgZXh0cmEgd2luZG93cyBpZiB3ZSBhcmUgYmVpbmcgbWFuYWdlZCAqLworICAgIGlmICggU0RMX3dpbmRvd2lkICkgeworCUZTd2luZG93ID0gMDsKKwlXTXdpbmRvdyA9IFNETF9zdHJ0b2woU0RMX3dpbmRvd2lkLCBOVUxMLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKEZTd2luZG93KQorCVhEZXN0cm95V2luZG93KFNETF9EaXNwbGF5LCBGU3dpbmRvdyk7CisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQorICAgIGlmICggdXNlX3hpbmVyYW1hICkgeworICAgICAgICB4ID0geGluZXJhbWFfaW5mby54X29yZzsKKyAgICAgICAgeSA9IHhpbmVyYW1hX2luZm8ueV9vcmc7CisgICAgfQorI2VuZGlmCisgICAgeGF0dHIub3ZlcnJpZGVfcmVkaXJlY3QgPSBUcnVlOworICAgIHhhdHRyLmJhY2tncm91bmRfcGl4ZWwgPSBkZWZfdmlzID8gQmxhY2tQaXhlbChTRExfRGlzcGxheSwgU0RMX1NjcmVlbikgOiAwOworICAgIHhhdHRyLmJvcmRlcl9waXhlbCA9IDA7CisgICAgeGF0dHIuY29sb3JtYXAgPSBTRExfWENvbG9yTWFwOworCisgICAgRlN3aW5kb3cgPSBYQ3JlYXRlV2luZG93KFNETF9EaXNwbGF5LCBTRExfUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIFgxMV93bVhBZGp1c3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgKyBYMTFfd21ZQWRqdXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgMzIsIDAsCisJCQkgICAgIHRoaXMtPmhpZGRlbi0+ZGVwdGgsIElucHV0T3V0cHV0LCBTRExfVmlzdWFsLAorCQkJICAgICBDV092ZXJyaWRlUmVkaXJlY3QgfCBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWwKKwkJCSAgICAgfCBDV0NvbG9ybWFwLAorCQkJICAgICAmeGF0dHIpOworCisgICAgWFNlbGVjdElucHV0KFNETF9EaXNwbGF5LCBGU3dpbmRvdywgU3RydWN0dXJlTm90aWZ5TWFzayk7CisKKyAgICAvKiBUZWxsIEtERSB0byBrZWVwIHRoZSBmdWxsc2NyZWVuIHdpbmRvdyBvbiB0b3AgKi8KKyAgICB7CisJWEV2ZW50IGV2OworCWxvbmcgbWFzazsKKworCVNETF9tZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKKwlldi54Y2xpZW50LnR5cGUgPSBDbGllbnRNZXNzYWdlOworCWV2LnhjbGllbnQud2luZG93ID0gU0RMX1Jvb3Q7CisJZXYueGNsaWVudC5tZXNzYWdlX3R5cGUgPSBYSW50ZXJuQXRvbShTRExfRGlzcGxheSwKKwkJCQkJICAgICAgIktXTV9LRUVQX09OX1RPUCIsIEZhbHNlKTsKKwlldi54Y2xpZW50LmZvcm1hdCA9IDMyOworCWV2LnhjbGllbnQuZGF0YS5sWzBdID0gRlN3aW5kb3c7CisJZXYueGNsaWVudC5kYXRhLmxbMV0gPSBDdXJyZW50VGltZTsKKwltYXNrID0gU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrOworCVhTZW5kRXZlbnQoU0RMX0Rpc3BsYXksIFNETF9Sb290LCBGYWxzZSwgbWFzaywgJmV2KTsKKyAgICB9CisKKyAgICBoaW50cyA9IE5VTEw7CisgICAgaWYoV013aW5kb3cpIHsKKwkvKiBBbGwgd2luZG93IGF0dHJpYnV0ZXMgbXVzdCBzdXJ2aXZlIHRoZSByZWNyZWF0aW9uICovCisJaGludHMgPSBYR2V0V01IaW50cyhTRExfRGlzcGxheSwgV013aW5kb3cpOworCVhEZXN0cm95V2luZG93KFNETF9EaXNwbGF5LCBXTXdpbmRvdyk7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRoZSB3aW5kb3cgZm9yIHdpbmRvd2VkIG1hbmFnZW1lbnQgKi8KKyAgICAvKiAocmV1c2luZyB0aGUgeGF0dHIgc3RydWN0dXJlIGFib3ZlKSAqLworICAgIFdNd2luZG93ID0gWENyZWF0ZVdpbmRvdyhTRExfRGlzcGxheSwgU0RMX1Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIDMyLCAzMiwgMCwKKwkJCSAgICAgdGhpcy0+aGlkZGVuLT5kZXB0aCwgSW5wdXRPdXRwdXQsIFNETF9WaXN1YWwsCisJCQkgICAgIENXQmFja1BpeGVsIHwgQ1dCb3JkZXJQaXhlbCB8IENXQ29sb3JtYXAsCisJCQkgICAgICZ4YXR0cik7CisKKyAgICAvKiBTZXQgdGhlIGlucHV0IGhpbnRzIHNvIHdlIGdldCBrZXlib2FyZCBpbnB1dCAqLworICAgIGlmKCFoaW50cykgeworCWhpbnRzID0gWEFsbG9jV01IaW50cygpOworCWhpbnRzLT5pbnB1dCA9IFRydWU7CisJaGludHMtPmZsYWdzID0gSW5wdXRIaW50OworICAgIH0KKyAgICBYU2V0V01IaW50cyhTRExfRGlzcGxheSwgV013aW5kb3csIGhpbnRzKTsKKyAgICBYRnJlZShoaW50cyk7CisgICAgWDExX1NldENhcHRpb25Ob0xvY2sodGhpcywgdGhpcy0+d21fdGl0bGUsIHRoaXMtPndtX2ljb24pOworCisgICAgYXBwX2V2ZW50X21hc2sgPSBGb2N1c0NoYW5nZU1hc2sgfCBLZXlQcmVzc01hc2sgfCBLZXlSZWxlYXNlTWFzaworCXwgUHJvcGVydHlDaGFuZ2VNYXNrIHwgU3RydWN0dXJlTm90aWZ5TWFzayB8IEtleW1hcFN0YXRlTWFzazsKKyAgICBYU2VsZWN0SW5wdXQoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBhcHBfZXZlbnRfbWFzayk7CisKKyAgICAvKiBTZXQgdGhlIGNsYXNzIGhpbnRzIHNvIHdlIGNhbiBnZXQgYW4gaWNvbiAoQWZ0ZXJTdGVwKSAqLworICAgIGdldF9jbGFzc25hbWUoY2xhc3NuYW1lLCBzaXplb2YoY2xhc3NuYW1lKSk7CisgICAgeworCVhDbGFzc0hpbnQgKmNsYXNzaGludHM7CisJY2xhc3NoaW50cyA9IFhBbGxvY0NsYXNzSGludCgpOworCWlmKGNsYXNzaGludHMgIT0gTlVMTCkgeworCSAgICBjbGFzc2hpbnRzLT5yZXNfbmFtZSA9IGNsYXNzbmFtZTsKKwkgICAgY2xhc3NoaW50cy0+cmVzX2NsYXNzID0gY2xhc3NuYW1lOworCSAgICBYU2V0Q2xhc3NIaW50KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgY2xhc3NoaW50cyk7CisJICAgIFhGcmVlKGNsYXNzaGludHMpOworCX0KKyAgICB9CisKKwl7CisJCXBpZF90IHBpZCA9IGdldHBpZCgpOworCQljaGFyIGhvc3RuYW1lWzI1Nl07CisKKwkJaWYgKHBpZCA+IDAgJiYgZ2V0aG9zdG5hbWUoaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSkpID4gLTEpIHsKKwkJCUF0b20gX05FVF9XTV9QSUQgPSBYSW50ZXJuQXRvbShTRExfRGlzcGxheSwgIl9ORVRfV01fUElEIiwgRmFsc2UpOworCQkJQXRvbSBXTV9DTElFTlRfTUFDSElORSA9IFhJbnRlcm5BdG9tKFNETF9EaXNwbGF5LCAiV01fQ0xJRU5UX01BQ0hJTkUiLCBGYWxzZSk7CisJCQkKKwkJCWhvc3RuYW1lW3NpemVvZihob3N0bmFtZSktMV0gPSAnXDAnOworCQkJWENoYW5nZVByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgX05FVF9XTV9QSUQsIFhBX0NBUkRJTkFMLCAzMiwKKwkJCQkJUHJvcE1vZGVSZXBsYWNlLCAodW5zaWduZWQgY2hhciAqKSZwaWQsIDEpOworCQkJWENoYW5nZVByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgV01fQ0xJRU5UX01BQ0hJTkUsIFhBX1NUUklORywgOCwKKwkJCQkJUHJvcE1vZGVSZXBsYWNlLCAodW5zaWduZWQgY2hhciAqKWhvc3RuYW1lLCBTRExfc3RybGVuKGhvc3RuYW1lKSk7CisJCX0KKwl9CisKKwkvKiBTZXR1cCB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBJTSBzZXJ2ZXIgKi8KKwkvKiBjcmVhdGVfYXV4X3dpbmRvd3MgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIGFnYWluc3QgdGhlIHNhbWUKKwkgICBEaXNwbGF5LiAgV2Ugc2hvdWxkIHJldXNlIHRoZSBTRExfSU0gaWYgb25lIGhhcyBiZWVuIG9wZW5lZCBmb3IKKwkgICB0aGUgRGlzcGxheSwgc28gd2Ugc2hvdWxkIG5vdCBzaW1wbHkgcmVzZXQgU0RMX0lNIGhlcmUuICAqLworCisJI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworCWlmIChTRExfWDExX0hBVkVfVVRGOCkgeworCQkvKiBEaXNjYXJkIG9ic29sZXRlIHJlc291cmNlcyBpZiBhbnkuICAqLworCQlpZiAoU0RMX0lNICE9IE5VTEwgJiYgU0RMX0Rpc3BsYXkgIT0gWERpc3BsYXlPZklNKFNETF9JTSkpIHsKKwkJCS8qIEp1c3QgYSBkb3VibGUgY2hlY2suIEkgZG9uJ3QgdGhpbmsgdGhpcworCQkgICAgICAgICAgIGNvZGUgaXMgZXZlciBleGVjdXRlZC4gKi8KKwkJCVNETF9TZXRFcnJvcigiZGlzcGxheSBoYXMgY2hhbmdlZCB3aGlsZSBhbiBJTSBpcyBrZXB0Iik7CisJCQlpZiAoU0RMX0lDKSB7CisJCQkJWFVuc2V0SUNGb2N1cyhTRExfSUMpOworCQkJCVhEZXN0cm95SUMoU0RMX0lDKTsKKwkJCQlTRExfSUMgPSBOVUxMOworCQkJfQorCQkJWENsb3NlSU0oU0RMX0lNKTsKKwkJCVNETF9JTSA9IE5VTEw7CisJCX0KKworCQkvKiBPcGVuIGFuIGlucHV0IG1ldGhvZC4gICovCisJCWlmIChTRExfSU0gPT0gTlVMTCkgeworCQkJY2hhciAqb2xkX2xvY2FsZSA9IE5VTEwsICpvbGRfbW9kaWZpZXJzID0gTlVMTDsKKwkJCWNvbnN0IGNoYXIgKnA7CisJCQlzaXplX3QgbjsKKwkJCS8qIEknbSBub3QgY29tZm9ydGFibGUgdG8gZG8gbG9jYWxlIHNldHVwCisJCQkgICBoZXJlLiAgSG93ZXZlciwgd2UgbmVlZCBDIGxpYnJhcnkgbG9jYWxlCisJCQkgICAoYW5kIHhsaWIgbW9kaWZpZXJzKSB0byBiZSBzZXQgYmFzZWQgb24gdGhlCisJCQkgICB1c2VyJ3MgcHJlZmVyZW5jZSB0byB1c2UgWElNLCBhbmQgbWFueQorCQkJICAgZXhpc3RpbmcgZ2FtZSBwcm9ncmFtcyBkb2Vzbid0IHRha2UgY2FyZSBvZgorCQkJICAgdXNlcnMnIGxvY2FsZSBwcmVmZXJlbmNlcywgc28gc29tZW9uZSBvdGhlcgorCQkJICAgdGhhbiB0aGUgZ2FtZSBwcm9ncmFtIHNob3VsZCBkbyBpdC4KKwkJCSAgIE1vcmVvdmVyLCBvbmVzIHNheSB0aGF0IHNvbWUgZ2FtZSBwcm9ncmFtcworCQkJICAgaGVhdmlseSByZWx5IG9uIHRoZSBDIGxvY2FsZSBiZWhhdmlvdXIsCisJCQkgICBlLmcuLCBzdHJjb2woKSdzLCBhbmQgd2UgY2FuJ3QgY2hhbmdlIHRoZSBDCisJCQkgICBsaWJyYXJ5IGxvY2FsZS4gIEdpdmVuIHRoZSBzaXR1YXRpb24sIEkKKwkJCSAgIGNvdWxkbid0IGZpbmQgYmV0dGVyIHBsYWNlIHRvIGRvIHRoZQorCQkJICAgam9iLi4uICovCisKKwkJCS8qIFNhdmUgdGhlIGN1cnJlbnQgKGFwcGxpY2F0aW9uIHByb2dyYW0ncykKKwkJCSAgIGxvY2FsZSBzZXR0aW5ncy4gICovCisJCQlwID0gc2V0bG9jYWxlKExDX0FMTCwgTlVMTCk7CisJCQlpZiAoIHAgKSB7CisJCQkJbiA9IFNETF9zdHJsZW4ocCkrMTsKKwkJCQlvbGRfbG9jYWxlID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIG4pOworCQkJCWlmICggb2xkX2xvY2FsZSApIHsKKwkJCQkJU0RMX3N0cmxjcHkob2xkX2xvY2FsZSwgcCwgbik7CisJCQkJfQorCQkJfQorCQkJcCA9IFhTZXRMb2NhbGVNb2RpZmllcnMoTlVMTCk7CisJCQlpZiAoIHAgKSB7CisJCQkJbiA9IFNETF9zdHJsZW4ocCkrMTsKKwkJCQlvbGRfbW9kaWZpZXJzID0gU0RMX3N0YWNrX2FsbG9jKGNoYXIsIG4pOworCQkJCWlmICggb2xkX21vZGlmaWVycyApIHsKKwkJCQkJU0RMX3N0cmxjcHkob2xkX21vZGlmaWVycywgcCwgbik7CisJCQkJfQorCQkJfQorCisJCQkvKiBGZXRjaCB0aGUgdXNlcidzIHByZWZlcmVuY2VzIGFuZCBvcGVuIHRoZQorCQkJICAgaW5wdXQgbWV0aG9kIHdpdGggdGhlbS4gICovCisJCQlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisJCQlYU2V0TG9jYWxlTW9kaWZpZXJzKCIiKTsKKwkJCVNETF9JTSA9IFhPcGVuSU0oU0RMX0Rpc3BsYXksIE5VTEwsIGNsYXNzbmFtZSwgY2xhc3NuYW1lKTsKKworCQkJLyogUmVzdG9yZSB0aGUgYXBwbGljYXRpb24ncyBsb2NhbGUgc2V0dGluZ3MKKwkJCSAgIHNvIHRoYXQgd2UgZG9uJ3QgYnJlYWsgdGhlIGFwcGxpY2F0aW9uJ3MKKwkJCSAgIGV4cGVjdGVkIGJlaGF2aW91ci4gICovCisJCQlpZiAoIG9sZF9sb2NhbGUgKSB7CisJCQkJLyogV2UgbmVlZCB0byByZXN0b3JlIHRoZSBDIGxpYnJhcnkKKwkJCQkgICBsb2NhbGUgZmlyc3QsIHNpbmNlIHRoZQorCQkJCSAgIGludGVycHJldGF0aW9uIG9mIHRoZSBYIG1vZGlmaWVyCisJCQkJICAgbWF5IGRlcGVuZCBvbiBpdC4gICovCisJCQkJc2V0bG9jYWxlKExDX0FMTCwgb2xkX2xvY2FsZSk7CisJCQkJU0RMX3N0YWNrX2ZyZWUob2xkX2xvY2FsZSk7CisJCQl9CisJCQlpZiAoIG9sZF9tb2RpZmllcnMgKSB7CisJCQkJWFNldExvY2FsZU1vZGlmaWVycyhvbGRfbW9kaWZpZXJzKTsKKwkJCQlTRExfc3RhY2tfZnJlZShvbGRfbW9kaWZpZXJzKTsKKwkJCX0KKwkJfQorCisJCS8qIENyZWF0ZSBhIG5ldyBpbnB1dCBjb250ZXh0IGZvciB0aGUgbmV3IHdpbmRvdyBqdXN0IGNyZWF0ZWQuICAqLworCQlpZiAoU0RMX0lNID09IE5VTEwpIHsKKwkJCVNETF9TZXRFcnJvcigibm8gaW5wdXQgbWV0aG9kIGNvdWxkIGJlIG9wZW5lZCIpOworCQl9IGVsc2UgeworCQkJaWYgKFNETF9JQyAhPSBOVUxMKSB7CisJCQkJLyogRGlzY2FyZCB0aGUgb2xkIElDIGJlZm9yZSBjcmVhdGluZyBuZXcgb25lLiAgKi8KKwkJCSAgICBYVW5zZXRJQ0ZvY3VzKFNETF9JQyk7CisJCQkgICAgWERlc3Ryb3lJQyhTRExfSUMpOworCQkJfQorCQkJLyogVGhlb3JldGljYWxseSB3ZSBzaG91bGQgY2hlY2sgdGhlIGN1cnJlbnQgSU0gc3VwcG9ydHMKKwkJCSAgIFByZWVkaXROb3RoaW5nK1N0YXR1c05vdGhpbmcgc3R5bGUgKGkuZS4sIHJvb3Qgd2luZG93IG1ldGhvZCkKKwkJCSAgIGJlZm9yZSBjcmVhdGluZyB0aGUgSUMuICBIb3dldmVyLCBpdCBpcyB0aGUgYm90dG9tIGxpbmUgbWV0aG9kLAorCQkJICAgYW5kIHdlIHN1cHBvcnRzIGFueSBvdGhlciBvcHRpb25zLiAgSWYgdGhlIElNIGRpZG4ndCBzdXBwb3J0CisJCQkgICByb290IHdpbmRvdyBtZXRob2QsIHRoZSBmb2xsb3dpbmcgY2FsbCBmYWlscywgYW5kIFNETCBmYWxscworCQkJICAgYmFjayB0byBwcmUtWElNIGtleWJvYXJkIGhhbmRsaW5nLiAgKi8KKwkJCVNETF9JQyA9IHBYQ3JlYXRlSUMoU0RMX0lNLAorCQkJCQlYTkNsaWVudFdpbmRvdywgV013aW5kb3csCisJCQkJCVhORm9jdXNXaW5kb3csIFdNd2luZG93LAorCQkJCQlYTklucHV0U3R5bGUsIFhJTVByZWVkaXROb3RoaW5nIHwgWElNU3RhdHVzTm90aGluZywKKwkJCQkJWE5SZXNvdXJjZU5hbWUsIGNsYXNzbmFtZSwKKwkJCQkJWE5SZXNvdXJjZUNsYXNzLCBjbGFzc25hbWUsCisJCQkJCU5VTEwpOworCisJCQlpZiAoU0RMX0lDID09IE5VTEwpIHsKKwkJCQlTRExfU2V0RXJyb3IoIm5vIGlucHV0IGNvbnRleHQgY291bGQgYmUgY3JlYXRlZCIpOworCQkJCVhDbG9zZUlNKFNETF9JTSk7CisJCQkJU0RMX0lNID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJLyogV2UgbmVlZCB0byByZWNlaXZlIFggZXZlbnRzIHRoYXQgYW4gSU0gd2FudHMgYW5kIHRvIHBhc3MKKwkJCQkgICB0aGVtIHRvIHRoZSBJTSB0aHJvdWdoIFhGaWx0ZXJFdmVudC4gVGhlIHNldCBvZiBldmVudHMgbWF5CisJCQkJICAgdmFyeSBkZXBlbmRpbmcgb24gdGhlIElNIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgb3B0aW9ucworCQkJCSAgIHNwZWNpZmllZCB0aHJvdWdoIHZhcmlvdXMgcm91dGVzLiBBbHRob3VnaCB1bmxpa2VseSwgdGhlCisJCQkJICAgeGxpYiBzcGVjaWZpY2F0aW9uIGFsbG93cyBJTSB0byBjaGFuZ2UgdGhlIGV2ZW50IHJlcXVpcmVtZW50CisJCQkJICAgd2l0aCBpdHMgb3duIGNpcmN1bXN0YW5jZXMsIGl0IGlzIHNhZmUgdG8gY2FsbCBTZWxlY3RJbnB1dAorCQkJCSAgIHdoZW5ldmVyIHdlIHJlLWNyZWF0ZSBhbiBJQy4gICovCisJCQkJdW5zaWduZWQgbG9uZyBtYXNrID0gMDsKKwkJCQljaGFyICpyZXQgPSBwWEdldElDVmFsdWVzKFNETF9JQywgWE5GaWx0ZXJFdmVudHMsICZtYXNrLCBOVUxMKTsKKwkJCQlpZiAocmV0ICE9IE5VTEwpIHsKKwkJCQkJWFVuc2V0SUNGb2N1cyhTRExfSUMpOworCQkJCQlYRGVzdHJveUlDKFNETF9JQyk7CisJCQkJCVNETF9JQyA9IE5VTEw7CisJCQkJCVNETF9TZXRFcnJvcigibm8gaW5wdXQgY29udGV4dCBjb3VsZCBiZSBjcmVhdGVkIik7CisJCQkJCVhDbG9zZUlNKFNETF9JTSk7CisJCQkJCVNETF9JTSA9IE5VTEw7CisJCQkJfSBlbHNlIHsKKwkJCQkJWFNlbGVjdElucHV0KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgYXBwX2V2ZW50X21hc2sgfCBtYXNrKTsKKwkJCQkJWFNldElDRm9jdXMoU0RMX0lDKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJI2VuZGlmCisKKwkvKiBBbGxvdyB0aGUgd2luZG93IHRvIGJlIGRlbGV0ZWQgYnkgdGhlIHdpbmRvdyBtYW5hZ2VyICovCisJWFNldFdNUHJvdG9jb2xzKFNETF9EaXNwbGF5LCBXTXdpbmRvdywgJldNX0RFTEVURV9XSU5ET1csIDEpOworfQorCitzdGF0aWMgaW50IFgxMV9WaWRlb0luaXQoX1RISVMsIFNETF9QaXhlbEZvcm1hdCAqdmZvcm1hdCkKK3sKKwljb25zdCBjaGFyICplbnY7CisJY2hhciAqZGlzcGxheTsKKwlpbnQgaTsKKworCS8qIE9wZW4gdGhlIFgxMSBkaXNwbGF5ICovCisJZGlzcGxheSA9IE5VTEw7CQkvKiBHZXQgaXQgZnJvbSBESVNQTEFZIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKwlpZiAoIChTRExfc3RybmNtcChYRGlzcGxheU5hbWUoZGlzcGxheSksICI6IiwgMSkgPT0gMCkgfHwKKwkgICAgIChTRExfc3RybmNtcChYRGlzcGxheU5hbWUoZGlzcGxheSksICJ1bml4OiIsIDUpID09IDApICkgeworCQlsb2NhbF9YMTEgPSAxOworCX0gZWxzZSB7CisJCWxvY2FsX1gxMSA9IDA7CisJfQorCVNETF9EaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXkpOworI2lmIGRlZmluZWQoX19vc2ZfXykgJiYgZGVmaW5lZChTRExfVklERU9fRFJJVkVSX1gxMV9EWU5BTUlDKQorCS8qIE9uIFRydTY0IGlmIGxpbmtpbmcgd2l0aG91dCAtbFgxMSwgaXQgZmFpbHMgYW5kIHlvdSBnZXQgZm9sbG93aW5nIG1lc3NhZ2UuCisJICogWGxpYjogY29ubmVjdGlvbiB0byAiOjAuMCIgcmVmdXNlZCBieSBzZXJ2ZXIKKwkgKiBYbGliOiBYRE0gYXV0aG9yaXphdGlvbiBrZXkgbWF0Y2hlcyBhbiBleGlzdGluZyBjbGllbnQhCisJICoKKwkgKiBJdCBzdWNjZWVkcyBpZiByZXRyeWluZyAxIHNlY29uZCBsYXRlcgorCSAqIG9yIGlmIHJ1bm5pbmcgeGhvc3QgK2xvY2FsaG9zdCBvbiBzaGVsbC4KKwkgKgorCSAqLworCWlmICggU0RMX0Rpc3BsYXkgPT0gTlVMTCApIHsKKwkJU0RMX0RlbGF5KDEwMDApOworCQlTRExfRGlzcGxheSA9IFhPcGVuRGlzcGxheShkaXNwbGF5KTsKKwl9CisjZW5kaWYKKwlpZiAoIFNETF9EaXNwbGF5ID09IE5VTEwgKSB7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiBYMTEgZGlzcGxheSIpOworCQlyZXR1cm4oLTEpOworCX0KKyNpZmRlZiBYMTFfREVCVUcKKwlYU3luY2hyb25pemUoU0RMX0Rpc3BsYXksIFRydWUpOworI2VuZGlmCisKKwkvKiBDcmVhdGUgYW4gYWx0ZXJuYXRlIFggZGlzcGxheSBmb3IgZ3JhcGhpY3MgdXBkYXRlcyAtLSBhbGxvd3MgdXMKKwkgICB0byBkbyBncmFwaGljcyB1cGRhdGVzIGluIGEgc2VwYXJhdGUgdGhyZWFkIGZyb20gZXZlbnQgaGFuZGxpbmcuCisJICAgVGhyZWFkLXNhZmUgWDExIGRvZXNuJ3Qgc2VlbSB0byBleGlzdC4KKwkgKi8KKwlHRlhfRGlzcGxheSA9IFhPcGVuRGlzcGxheShkaXNwbGF5KTsKKwlpZiAoIEdGWF9EaXNwbGF5ID09IE5VTEwgKSB7CisJCVhDbG9zZURpc3BsYXkoU0RMX0Rpc3BsYXkpOworCQlTRExfRGlzcGxheSA9IE5VTEw7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3Qgb3BlbiBYMTEgZGlzcGxheSIpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIFNldCB0aGUgbm9ybWFsIFggZXJyb3IgaGFuZGxlciAqLworCVhfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIoeF9lcnJoYW5kbGVyKTsKKworCS8qIFNldCB0aGUgZXJyb3IgaGFuZGxlciBpZiB3ZSBsb3NlIHRoZSBYIGRpc3BsYXkgKi8KKwlYSU9faGFuZGxlciA9IFhTZXRJT0Vycm9ySGFuZGxlcih4aW9fZXJyaGFuZGxlcik7CisKKwkvKiBTZXQgdGhlIFggZXh0ZW5zaW9uIGVycm9yIGhhbmRsZXIgKi8KKwlYZXh0X2hhbmRsZXIgPSBYU2V0RXh0ZW5zaW9uRXJyb3JIYW5kbGVyKHhleHRfZXJyaGFuZGxlcik7CisKKwkvKiB1c2UgZGVmYXVsdCBzY3JlZW4gKGZyb20gJERJU1BMQVkpICovCisJU0RMX1NjcmVlbiA9IERlZmF1bHRTY3JlZW4oU0RMX0Rpc3BsYXkpOworCisjaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKKwkvKiBDaGVjayBmb3IgTUlUIHNoYXJlZCBtZW1vcnkgZXh0ZW5zaW9uICovCisJdXNlX21pdHNobSA9IDA7CisJaWYgKCBsb2NhbF9YMTEgKSB7CisJCXVzZV9taXRzaG0gPSBYU2htUXVlcnlFeHRlbnNpb24oU0RMX0Rpc3BsYXkpOworCX0KKyNlbmRpZiAvKiBOT19TSEFSRURfTUVNT1JZICovCisKKwkvKiBHZXQgdGhlIGF2YWlsYWJsZSB2aWRlbyBtb2RlcyAqLworCWlmKFgxMV9HZXRWaWRlb01vZGVzKHRoaXMpIDwgMCkgeworCQlYQ2xvc2VEaXNwbGF5KEdGWF9EaXNwbGF5KTsKKwkJR0ZYX0Rpc3BsYXkgPSBOVUxMOworCQlYQ2xvc2VEaXNwbGF5KFNETF9EaXNwbGF5KTsKKwkJU0RMX0Rpc3BsYXkgPSBOVUxMOworCSAgICByZXR1cm4gLTE7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplICovCisJdGhpcy0+aW5mby5jdXJyZW50X3cgPSBEaXNwbGF5V2lkdGgoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOworCXRoaXMtPmluZm8uY3VycmVudF9oID0gRGlzcGxheUhlaWdodChTRExfRGlzcGxheSwgU0RMX1NjcmVlbik7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgc2NyZWVuIGRlcHRoOgorCSAgIFVzZSB0aGUgZGVmYXVsdCB2aXN1YWwgKG9yIGF0IGxlYXN0IG9uZSB3aXRoIHRoZSBzYW1lIGRlcHRoKSAqLworCVNETF9EaXNwbGF5Q29sb3JtYXAgPSBEZWZhdWx0Q29sb3JtYXAoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOworCWZvcihpID0gMDsgaSA8IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHM7IGkrKykKKwkgICAgaWYodGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLmRlcHRoID09IERlZmF1bHREZXB0aChTRExfRGlzcGxheSwKKwkJCQkJCQkgICAgICBTRExfU2NyZWVuKSkKKwkJYnJlYWs7CisJaWYoaSA9PSB0aGlzLT5oaWRkZW4tPm52aXN1YWxzKSB7CisJICAgIC8qIGRlZmF1bHQgdmlzdWFsIHdhcyB1c2VsZXNzLCB0YWtlIHRoZSBkZWVwZXN0IG9uZSBpbnN0ZWFkICovCisJICAgIGkgPSAwOworCX0KKwlTRExfVmlzdWFsID0gdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLnZpc3VhbDsKKwlpZiAoIFNETF9WaXN1YWwgPT0gRGVmYXVsdFZpc3VhbChTRExfRGlzcGxheSwgU0RMX1NjcmVlbikgKSB7CisJICAgIFNETF9YQ29sb3JNYXAgPSBTRExfRGlzcGxheUNvbG9ybWFwOworCX0gZWxzZSB7CisJICAgIFNETF9YQ29sb3JNYXAgPSBYQ3JlYXRlQ29sb3JtYXAoU0RMX0Rpc3BsYXksIFNETF9Sb290LAorCQkJCQkgICAgU0RMX1Zpc3VhbCwgQWxsb2NOb25lKTsKKwl9CisJdGhpcy0+aGlkZGVuLT5kZXB0aCA9IHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5kZXB0aDsKKwl2Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPSB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uYnBwOworCWlmICggdmZvcm1hdC0+Qml0c1BlclBpeGVsID4gOCApIHsKKwkJdmZvcm1hdC0+Um1hc2sgPSBTRExfVmlzdWFsLT5yZWRfbWFzazsKKwkgIAl2Zm9ybWF0LT5HbWFzayA9IFNETF9WaXN1YWwtPmdyZWVuX21hc2s7CisJICAJdmZvcm1hdC0+Qm1hc2sgPSBTRExfVmlzdWFsLT5ibHVlX21hc2s7CisJfQorCWlmICggdGhpcy0+aGlkZGVuLT5kZXB0aCA9PSAzMiApIHsKKwkJdmZvcm1hdC0+QW1hc2sgPSAoMHhGRkZGRkZGRiAmIH4odmZvcm1hdC0+Um1hc2t8dmZvcm1hdC0+R21hc2t8dmZvcm1hdC0+Qm1hc2spKTsKKwl9CisJWDExX1NhdmVWaWRNb2RlR2FtbWEodGhpcyk7CisKKwkvKiBBbGxvdyBlbnZpcm9ubWVudCBvdmVycmlkZSBvZiBzY3JlZW5zYXZlciBkaXNhYmxlLiAqLworCWVudiA9IFNETF9nZXRlbnYoIlNETF9WSURFT19BTExPV19TQ1JFRU5TQVZFUiIpOworCWlmICggZW52ICkgeworCQlhbGxvd19zY3JlZW5zYXZlciA9IFNETF9hdG9pKGVudik7CisJfSBlbHNlIHsKKyNpZmRlZiBTRExfVklERU9fRElTQUJMRV9TQ1JFRU5TQVZFUgorCQlhbGxvd19zY3JlZW5zYXZlciA9IDA7CisjZWxzZQorCQlhbGxvd19zY3JlZW5zYXZlciA9IDE7CisjZW5kaWYKKwl9CisKKwkvKiBTZWUgaWYgd2UgaGF2ZSBiZWVuIHBhc3NlZCBhIHdpbmRvdyB0byB1c2UgKi8KKwlTRExfd2luZG93aWQgPSBTRExfZ2V0ZW52KCJTRExfV0lORE9XSUQiKTsKKworCS8qIENyZWF0ZSB0aGUgZnVsbHNjcmVlbiBhbmQgbWFuYWdlZCB3aW5kb3dzICovCisJY3JlYXRlX2F1eF93aW5kb3dzKHRoaXMpOworCisJLyogQ3JlYXRlIHRoZSBibGFuayBjdXJzb3IgKi8KKwlTRExfQmxhbmtDdXJzb3IgPSB0aGlzLT5DcmVhdGVXTUN1cnNvcih0aGlzLCBibGFua19jZGF0YSwgYmxhbmtfY21hc2ssCisJCQkJCUJMQU5LX0NXSURUSCwgQkxBTktfQ0hFSUdIVCwKKwkJCQkJCUJMQU5LX0NIT1RYLCBCTEFOS19DSE9UWSk7CisKKwkvKiBGaWxsIGluIHNvbWUgd2luZG93IG1hbmFnZXIgY2FwYWJpbGl0aWVzICovCisJdGhpcy0+aW5mby53bV9hdmFpbGFibGUgPSAxOworCisJLyogV2UncmUgZG9uZSEgKi8KKwlYRmx1c2goU0RMX0Rpc3BsYXkpOworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgWDExX0Rlc3Ryb3lXaW5kb3coX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4pCit7CisJLyogQ2xlYW4gdXAgT3BlbkdMICovCisJaWYgKCBzY3JlZW4gKSB7CisJCXNjcmVlbi0+ZmxhZ3MgJj0gfihTRExfT1BFTkdMfFNETF9PUEVOR0xCTElUKTsKKwl9CisJWDExX0dMX1NodXRkb3duKHRoaXMpOworCisJaWYgKCAhIFNETF93aW5kb3dpZCApIHsKKwkJLyogSGlkZSB0aGUgbWFuYWdlZCB3aW5kb3cgKi8KKwkJaWYgKCBXTXdpbmRvdyApIHsKKwkJCVhVbm1hcFdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3cpOworCQl9CisJCWlmICggc2NyZWVuICYmIChzY3JlZW4tPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pICkgeworCQkJc2NyZWVuLT5mbGFncyAmPSB+U0RMX0ZVTExTQ1JFRU47CisJCQlYMTFfTGVhdmVGdWxsU2NyZWVuKHRoaXMpOworCQl9CisKKwkJLyogRGVzdHJveSB0aGUgb3V0cHV0IHdpbmRvdyAqLworCQlpZiAoIFNETF9XaW5kb3cgKSB7CisJCQlYRGVzdHJveVdpbmRvdyhTRExfRGlzcGxheSwgU0RMX1dpbmRvdyk7CisJCX0KKworCQkvKiBGcmVlIHRoZSBjb2xvcm1hcCBlbnRyaWVzICovCisJCWlmICggU0RMX1hQaXhlbHMgKSB7CisJCQlpbnQgbnVtY29sb3JzOworCQkJdW5zaWduZWQgbG9uZyBwaXhlbDsKKwkJCW51bWNvbG9ycyA9IFNETF9WaXN1YWwtPm1hcF9lbnRyaWVzOworCQkJZm9yICggcGl4ZWw9MDsgcGl4ZWw8bnVtY29sb3JzOyArK3BpeGVsICkgeworCQkJCXdoaWxlICggU0RMX1hQaXhlbHNbcGl4ZWxdID4gMCApIHsKKwkJCQkJWEZyZWVDb2xvcnMoR0ZYX0Rpc3BsYXksCisJCQkJCQlTRExfRGlzcGxheUNvbG9ybWFwLCZwaXhlbCwxLDApOworCQkJCQktLVNETF9YUGl4ZWxzW3BpeGVsXTsKKwkJCQl9CisJCQl9CisJCQlTRExfZnJlZShTRExfWFBpeGVscyk7CisJCQlTRExfWFBpeGVscyA9IE5VTEw7CisJCX0gCisKKwkJLyogRnJlZSB0aGUgZ3JhcGhpY3MgY29udGV4dCAqLworCQlpZiAoIFNETF9HQyApIHsKKwkJCVhGcmVlR0MoU0RMX0Rpc3BsYXksIFNETF9HQyk7CisJCQlTRExfR0MgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgU0RMX2Jvb2wgWDExX1dpbmRvd1Bvc2l0aW9uKF9USElTLCBpbnQgKngsIGludCAqeSwgaW50IHcsIGludCBoKQoreworCWNvbnN0IGNoYXIgKndpbmRvdyA9IFNETF9nZXRlbnYoIlNETF9WSURFT19XSU5ET1dfUE9TIik7CisJY29uc3QgY2hhciAqY2VudGVyID0gU0RMX2dldGVudigiU0RMX1ZJREVPX0NFTlRFUkVEIik7CisJaWYgKCB3aW5kb3cgKSB7CisJCWlmICggU0RMX3NzY2FuZih3aW5kb3csICIlZCwlZCIsIHgsIHkpID09IDIgKSB7CisJCQlyZXR1cm4gU0RMX1RSVUU7CisJCX0KKwkJaWYgKCBTRExfc3RyY21wKHdpbmRvdywgImNlbnRlciIpID09IDAgKSB7CisJCQljZW50ZXIgPSB3aW5kb3c7CisJCX0KKwl9CisJaWYgKCBjZW50ZXIgKSB7CisJCSp4ID0gKERpc3BsYXlXaWR0aChTRExfRGlzcGxheSwgU0RMX1NjcmVlbikgLSB3KS8yOworCQkqeSA9IChEaXNwbGF5SGVpZ2h0KFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKSAtIGgpLzI7CisJCXJldHVybiBTRExfVFJVRTsKKwl9CisJcmV0dXJuIFNETF9GQUxTRTsKK30KKworc3RhdGljIHZvaWQgWDExX1NldFNpemVIaW50cyhfVEhJUywgaW50IHcsIGludCBoLCBVaW50MzIgZmxhZ3MpCit7CisJWFNpemVIaW50cyAqaGludHM7CisKKwloaW50cyA9IFhBbGxvY1NpemVIaW50cygpOworCWlmICggaGludHMgKSB7CisJCWlmICghKGZsYWdzICYgU0RMX1JFU0laQUJMRSkpIHsKKwkJCWhpbnRzLT5taW5fd2lkdGggPSBoaW50cy0+bWF4X3dpZHRoID0gdzsKKwkJCWhpbnRzLT5taW5faGVpZ2h0ID0gaGludHMtPm1heF9oZWlnaHQgPSBoOworCQkJaGludHMtPmZsYWdzID0gUE1heFNpemUgfCBQTWluU2l6ZTsKKwkJfQorCQlpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7CisJCQloaW50cy0+eCA9IDA7CisJCQloaW50cy0+eSA9IDA7CisJCQloaW50cy0+ZmxhZ3MgfD0gVVNQb3NpdGlvbjsKKwkJfSBlbHNlCisJCS8qIENlbnRlciBpdCwgaWYgZGVzaXJlZCAqLworCQlpZiAoIFgxMV9XaW5kb3dQb3NpdGlvbih0aGlzLCAmaGludHMtPngsICZoaW50cy0+eSwgdywgaCkgKSB7CisJCQloaW50cy0+ZmxhZ3MgfD0gVVNQb3NpdGlvbjsKKworCQkJLyogSGludHMgbXVzdCBiZSBzZXQgYmVmb3JlIG1vdmluZyB0aGUgd2luZG93LCBvdGhlcndpc2UgYW4KKwkJCSAgIHVud2FudGVkIENvbmZpZ3VyZU5vdGlmeSBldmVudCB3aWxsIGJlIGlzc3VlZCAqLworCQkJWFNldFdNTm9ybWFsSGludHMoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBoaW50cyk7CisKKwkJCVhNb3ZlV2luZG93KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgaGludHMtPngsIGhpbnRzLT55KTsKKworCQkJLyogRmx1c2ggdGhlIHJlc2l6ZSBldmVudCBzbyB3ZSBkb24ndCBjYXRjaCBpdCBsYXRlciAqLworCQkJWFN5bmMoU0RMX0Rpc3BsYXksIFRydWUpOworCQl9CisJCVhTZXRXTU5vcm1hbEhpbnRzKFNETF9EaXNwbGF5LCBXTXdpbmRvdywgaGludHMpOworCQlYRnJlZShoaW50cyk7CisJfQorCisJLyogUmVzcGVjdCB0aGUgd2luZG93IGNhcHRpb24gc3R5bGUgKi8KKwlpZiAoIGZsYWdzICYgU0RMX05PRlJBTUUgKSB7CisJCVNETF9ib29sIHNldDsKKwkJQXRvbSBXTV9ISU5UUzsKKworCQkvKiBXZSBoYXZlbid0IG1vZGlmaWVkIHRoZSB3aW5kb3cgbWFuYWdlciBoaW50cyB5ZXQgKi8KKwkJc2V0ID0gU0RMX0ZBTFNFOworCisJCS8qIEZpcnN0IHRyeSB0byBzZXQgTVdNIGhpbnRzICovCisJCVdNX0hJTlRTID0gWEludGVybkF0b20oU0RMX0Rpc3BsYXksICJfTU9USUZfV01fSElOVFMiLCBUcnVlKTsKKwkJaWYgKCBXTV9ISU5UUyAhPSBOb25lICkgeworCQkJLyogSGludHMgdXNlZCBieSBNb3RpZiBjb21wbGlhbnQgd2luZG93IG1hbmFnZXJzICovCisJCQlzdHJ1Y3QgeworCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJdW5zaWduZWQgbG9uZyBmdW5jdGlvbnM7CisJCQkJdW5zaWduZWQgbG9uZyBkZWNvcmF0aW9uczsKKwkJCQlsb25nIGlucHV0X21vZGU7CisJCQkJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJCQl9IE1XTUhpbnRzID0geyAoMUwgPDwgMSksIDAsIDAsIDAsIDAgfTsKKworCQkJWENoYW5nZVByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywKKwkJCSAgICAgICAgICAgICAgICBXTV9ISU5UUywgV01fSElOVFMsIDMyLAorCQkJICAgICAgICAgICAgICAgIFByb3BNb2RlUmVwbGFjZSwKKwkJCQkJKHVuc2lnbmVkIGNoYXIgKikmTVdNSGludHMsCisJCQkJCXNpemVvZihNV01IaW50cykvc2l6ZW9mKGxvbmcpKTsKKwkJCXNldCA9IFNETF9UUlVFOworCQl9CisJCS8qIE5vdyB0cnkgdG8gc2V0IEtXTSBoaW50cyAqLworCQlXTV9ISU5UUyA9IFhJbnRlcm5BdG9tKFNETF9EaXNwbGF5LCAiS1dNX1dJTl9ERUNPUkFUSU9OIiwgVHJ1ZSk7CisJCWlmICggV01fSElOVFMgIT0gTm9uZSApIHsKKwkJCWxvbmcgS1dNSGludHMgPSAwOworCisJCQlYQ2hhbmdlUHJvcGVydHkoU0RMX0Rpc3BsYXksIFdNd2luZG93LAorCQkJICAgICAgICAgICAgICAgIFdNX0hJTlRTLCBXTV9ISU5UUywgMzIsCisJCQkgICAgICAgICAgICAgICAgUHJvcE1vZGVSZXBsYWNlLAorCQkJCQkodW5zaWduZWQgY2hhciAqKSZLV01IaW50cywKKwkJCQkJc2l6ZW9mKEtXTUhpbnRzKS9zaXplb2YobG9uZykpOworCQkJc2V0ID0gU0RMX1RSVUU7CisJCX0KKwkJLyogTm93IHRyeSB0byBzZXQgR05PTUUgaGludHMgKi8KKwkJV01fSElOVFMgPSBYSW50ZXJuQXRvbShTRExfRGlzcGxheSwgIl9XSU5fSElOVFMiLCBUcnVlKTsKKwkJaWYgKCBXTV9ISU5UUyAhPSBOb25lICkgeworCQkJbG9uZyBHTk9NRUhpbnRzID0gMDsKKworCQkJWENoYW5nZVByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywKKwkJCSAgICAgICAgICAgICAgICBXTV9ISU5UUywgV01fSElOVFMsIDMyLAorCQkJICAgICAgICAgICAgICAgIFByb3BNb2RlUmVwbGFjZSwKKwkJCQkJKHVuc2lnbmVkIGNoYXIgKikmR05PTUVIaW50cywKKwkJCQkJc2l6ZW9mKEdOT01FSGludHMpL3NpemVvZihsb25nKSk7CisJCQlzZXQgPSBTRExfVFJVRTsKKwkJfQorCQkvKiBGaW5hbGx5IHNldCB0aGUgdHJhbnNpZW50IGhpbnRzIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoICEgc2V0ICkgeworCQkJWFNldFRyYW5zaWVudEZvckhpbnQoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBTRExfUm9vdCk7CisJCX0KKwl9IGVsc2UgeworCQlTRExfYm9vbCBzZXQ7CisJCUF0b20gV01fSElOVFM7CisKKwkJLyogV2UgaGF2ZW4ndCBtb2RpZmllZCB0aGUgd2luZG93IG1hbmFnZXIgaGludHMgeWV0ICovCisJCXNldCA9IFNETF9GQUxTRTsKKworCQkvKiBGaXJzdCB0cnkgdG8gdW5zZXQgTVdNIGhpbnRzICovCisJCVdNX0hJTlRTID0gWEludGVybkF0b20oU0RMX0Rpc3BsYXksICJfTU9USUZfV01fSElOVFMiLCBUcnVlKTsKKwkJaWYgKCBXTV9ISU5UUyAhPSBOb25lICkgeworCQkJWERlbGV0ZVByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgV01fSElOVFMpOworCQkJc2V0ID0gU0RMX1RSVUU7CisJCX0KKwkJLyogTm93IHRyeSB0byB1bnNldCBLV00gaGludHMgKi8KKwkJV01fSElOVFMgPSBYSW50ZXJuQXRvbShTRExfRGlzcGxheSwgIktXTV9XSU5fREVDT1JBVElPTiIsIFRydWUpOworCQlpZiAoIFdNX0hJTlRTICE9IE5vbmUgKSB7CisJCQlYRGVsZXRlUHJvcGVydHkoU0RMX0Rpc3BsYXksIFdNd2luZG93LCBXTV9ISU5UUyk7CisJCQlzZXQgPSBTRExfVFJVRTsKKwkJfQorCQkvKiBOb3cgdHJ5IHRvIHVuc2V0IEdOT01FIGhpbnRzICovCisJCVdNX0hJTlRTID0gWEludGVybkF0b20oU0RMX0Rpc3BsYXksICJfV0lOX0hJTlRTIiwgVHJ1ZSk7CisJCWlmICggV01fSElOVFMgIT0gTm9uZSApIHsKKwkJCVhEZWxldGVQcm9wZXJ0eShTRExfRGlzcGxheSwgV013aW5kb3csIFdNX0hJTlRTKTsKKwkJCXNldCA9IFNETF9UUlVFOworCQl9CisJCS8qIEZpbmFsbHkgdW5zZXQgdGhlIHRyYW5zaWVudCBoaW50cyBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKCAhIHNldCApIHsKKwkJCVhEZWxldGVQcm9wZXJ0eShTRExfRGlzcGxheSwgV013aW5kb3csIFhBX1dNX1RSQU5TSUVOVF9GT1IpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IFgxMV9DcmVhdGVXaW5kb3coX1RISVMsIFNETF9TdXJmYWNlICpzY3JlZW4sCisJCQkgICAgaW50IHcsIGludCBoLCBpbnQgYnBwLCBVaW50MzIgZmxhZ3MpCit7CisJaW50IGksIGRlcHRoOworCVZpc3VhbCAqdmlzOworCWludCB2aXNfY2hhbmdlOworCVVpbnQzMiBBbWFzazsKKworCS8qIElmIGEgd2luZG93IGlzIGFscmVhZHkgcHJlc2VudCwgZGVzdHJveSBpdCBhbmQgc3RhcnQgZnJlc2ggKi8KKwlpZiAoIFNETF9XaW5kb3cgKSB7CisJCVgxMV9EZXN0cm95V2luZG93KHRoaXMsIHNjcmVlbik7CisJCXN3aXRjaF93YWl0aW5nID0gMDsgLyogUHJldmVudCBqdW1wIGJhY2sgdG8gbm93LW1lYW5pbmdsZXNzIHN0YXRlLiAqLworCX0KKworCS8qIFNlZSBpZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYSB3aW5kb3cgaWQgKi8KKwlpZiAoIFNETF93aW5kb3dpZCApIHsKKwkJU0RMX1dpbmRvdyA9IFNETF9zdHJ0b2woU0RMX3dpbmRvd2lkLCBOVUxMLCAwKTsKKwl9IGVsc2UgeworCQlTRExfV2luZG93ID0gMDsKKwl9CisKKwkvKiBmaW5kIG91dCB3aGljaCB2aXN1YWwgd2UgYXJlIGdvaW5nIHRvIHVzZSAqLworCWlmICggZmxhZ3MgJiBTRExfT1BFTkdMICkgeworCQlYVmlzdWFsSW5mbyAqdmk7CisKKwkJdmkgPSBYMTFfR0xfR2V0VmlzdWFsKHRoaXMpOworCQlpZiggIXZpICkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCXZpcyA9IHZpLT52aXN1YWw7CisJCWRlcHRoID0gdmktPmRlcHRoOworCX0gZWxzZSBpZiAoIFNETF93aW5kb3dpZCApIHsKKwkJWFdpbmRvd0F0dHJpYnV0ZXMgYTsKKworCQlYR2V0V2luZG93QXR0cmlidXRlcyhTRExfRGlzcGxheSwgU0RMX1dpbmRvdywgJmEpOworCQl2aXMgPSBhLnZpc3VhbDsKKwkJZGVwdGggPSBhLmRlcHRoOworCX0gZWxzZSB7CisJCWZvciAoIGkgPSAwOyBpIDwgdGhpcy0+aGlkZGVuLT5udmlzdWFsczsgaSsrICkgeworCQkJaWYgKCB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0uYnBwID09IGJwcCApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCBpID09IHRoaXMtPmhpZGRlbi0+bnZpc3VhbHMgKSB7CisJCQlTRExfU2V0RXJyb3IoIk5vIG1hdGNoaW5nIHZpc3VhbCBmb3IgcmVxdWVzdGVkIGRlcHRoIik7CisJCQlyZXR1cm4gLTE7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJfQorCQl2aXMgPSB0aGlzLT5oaWRkZW4tPnZpc3VhbHNbaV0udmlzdWFsOworCQlkZXB0aCA9IHRoaXMtPmhpZGRlbi0+dmlzdWFsc1tpXS5kZXB0aDsKKwl9CisjaWZkZWYgWDExX0RFQlVHCisgICAgICAgIHByaW50ZigiQ2hvb3NpbmcgJXMgdmlzdWFsIGF0ICVkIGJwcCAtICVkIGNvbG9ybWFwIGVudHJpZXNcbiIsIHZpcy0+Y2xhc3MgPT0gUHNldWRvQ29sb3IgPyAiUHNldWRvQ29sb3IiIDogKHZpcy0+Y2xhc3MgPT0gVHJ1ZUNvbG9yID8gIlRydWVDb2xvciIgOiAodmlzLT5jbGFzcyA9PSBEaXJlY3RDb2xvciA/ICJEaXJlY3RDb2xvciIgOiAiVW5rbm93biIpKSwgZGVwdGgsIHZpcy0+bWFwX2VudHJpZXMpOworI2VuZGlmCisJdmlzX2NoYW5nZSA9ICh2aXMgIT0gU0RMX1Zpc3VhbCk7CisJU0RMX1Zpc3VhbCA9IHZpczsKKwl0aGlzLT5oaWRkZW4tPmRlcHRoID0gZGVwdGg7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgdGhpcyB2aWRlbyBtb2RlICovCisJaWYgKCB0aGlzLT5oaWRkZW4tPmRlcHRoID09IDMyICkgeworCQlBbWFzayA9ICgweEZGRkZGRkZGICYgfih2aXMtPnJlZF9tYXNrfHZpcy0+Z3JlZW5fbWFza3x2aXMtPmJsdWVfbWFzaykpOworCX0gZWxzZSB7CisJCUFtYXNrID0gMDsKKwl9CisJaWYgKCAhIFNETF9SZWFsbG9jRm9ybWF0KHNjcmVlbiwgYnBwLAorCQkJdmlzLT5yZWRfbWFzaywgdmlzLT5ncmVlbl9tYXNrLCB2aXMtPmJsdWVfbWFzaywgQW1hc2spICkgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjb2xvcm1hcCAqLworCWlmICggU0RMX1hDb2xvck1hcCAhPSBTRExfRGlzcGxheUNvbG9ybWFwICkgeworCQlYRnJlZUNvbG9ybWFwKFNETF9EaXNwbGF5LCBTRExfWENvbG9yTWFwKTsKKwl9CisJaWYgKCBTRExfVmlzdWFsLT5jbGFzcyA9PSBQc2V1ZG9Db2xvciApIHsKKwkgICAgaW50IG5jb2xvcnM7CisKKwkgICAgLyogQWxsb2NhdGUgdGhlIHBpeGVsIGZsYWdzICovCisJICAgIG5jb2xvcnMgPSBTRExfVmlzdWFsLT5tYXBfZW50cmllczsKKwkgICAgU0RMX1hQaXhlbHMgPSBTRExfbWFsbG9jKG5jb2xvcnMgKiBzaXplb2YoaW50KSk7CisJICAgIGlmKFNETF9YUGl4ZWxzID09IE5VTEwpIHsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBTRExfbWVtc2V0KFNETF9YUGl4ZWxzLCAwLCBuY29sb3JzICogc2l6ZW9mKCpTRExfWFBpeGVscykpOworCisJICAgIC8qIGFsd2F5cyBhbGxvY2F0ZSBhIHByaXZhdGUgY29sb3JtYXAgb24gbm9uLWRlZmF1bHQgdmlzdWFscyAqLworCSAgICBpZiAoIFNETF9WaXN1YWwgIT0gRGVmYXVsdFZpc3VhbChTRExfRGlzcGxheSwgU0RMX1NjcmVlbikgKSB7CisJCWZsYWdzIHw9IFNETF9IV1BBTEVUVEU7CisJICAgIH0KKwkgICAgaWYgKCBmbGFncyAmIFNETF9IV1BBTEVUVEUgKSB7CisJCXNjcmVlbi0+ZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKKwkJU0RMX1hDb2xvck1hcCA9IFhDcmVhdGVDb2xvcm1hcChTRExfRGlzcGxheSwgU0RMX1Jvb3QsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1Zpc3VhbCwgQWxsb2NBbGwpOworCSAgICB9IGVsc2UgeworCQlTRExfWENvbG9yTWFwID0gU0RMX0Rpc3BsYXlDb2xvcm1hcDsKKwkgICAgfQorCX0gZWxzZSBpZiAoIFNETF9WaXN1YWwtPmNsYXNzID09IERpcmVjdENvbG9yICkgeworCisJICAgIC8qIENyZWF0ZSBhIGNvbG9ybWFwIHdoaWNoIHdlIGNhbiBtYW5pcHVsYXRlIGZvciBnYW1tYSAqLworCSAgICBTRExfWENvbG9yTWFwID0gWENyZWF0ZUNvbG9ybWFwKFNETF9EaXNwbGF5LCBTRExfUm9vdCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9WaXN1YWwsIEFsbG9jQWxsKTsKKyAgICAgICAgICAgIFhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7CisKKwkgICAgLyogSW5pdGlhbGl6ZSB0aGUgY29sb3JtYXAgdG8gdGhlIGlkZW50aXR5IG1hcHBpbmcgKi8KKwkgICAgU0RMX0dldEdhbW1hUmFtcCgwLCAwLCAwKTsKKwkgICAgdGhpcy0+c2NyZWVuID0gc2NyZWVuOworCSAgICBYMTFfU2V0R2FtbWFSYW1wKHRoaXMsIHRoaXMtPmdhbW1hKTsKKwkgICAgdGhpcy0+c2NyZWVuID0gTlVMTDsKKwl9IGVsc2UgeworCSAgICAvKiBDcmVhdGUgYSByZWFkLW9ubHkgY29sb3JtYXAgZm9yIG91ciB3aW5kb3cgKi8KKwkgICAgU0RMX1hDb2xvck1hcCA9IFhDcmVhdGVDb2xvcm1hcChTRExfRGlzcGxheSwgU0RMX1Jvb3QsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1Zpc3VhbCwgQWxsb2NOb25lKTsKKwl9CisKKwkvKiBSZWNyZWF0ZSB0aGUgYXV4aWxpYXJ5IHdpbmRvd3MsIGlmIG5lZWRlZCAocmVxdWlyZWQgZm9yIEdMKSAqLworCWlmICggdmlzX2NoYW5nZSApCisJICAgIGNyZWF0ZV9hdXhfd2luZG93cyh0aGlzKTsKKworCWlmKHNjcmVlbi0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFKSB7CisJICAgIC8qIFNpbmNlIHRoZSBmdWxsLXNjcmVlbiB3aW5kb3cgbWlnaHQgaGF2ZSBnb3QgYSBub256ZXJvIGJhY2tncm91bmQKKwkgICAgICAgY29sb3VyICgwIGlzIHdoaXRlIG9uIHNvbWUgZGlzcGxheXMpLCB3ZSBzaG91bGQgcmVzZXQgdGhlCisJICAgICAgIGJhY2tncm91bmQgdG8gMCBoZXJlIHNpbmNlIHRoYXQgaXMgd2hhdCB0aGUgdXNlciBleHBlY3RzCisJICAgICAgIHdpdGggYSBwcml2YXRlIGNvbG9ybWFwICovCisJICAgIFhTZXRXaW5kb3dCYWNrZ3JvdW5kKFNETF9EaXNwbGF5LCBGU3dpbmRvdywgMCk7CisJICAgIFhDbGVhcldpbmRvdyhTRExfRGlzcGxheSwgRlN3aW5kb3cpOworCX0KKworCS8qIHJlc2l6ZSB0aGUgKHBvc3NpYmx5IG5ldykgd2luZG93IG1hbmFnZXIgd2luZG93ICovCisJaWYoICFTRExfd2luZG93aWQgKSB7CisJICAgICAgICBYMTFfU2V0U2l6ZUhpbnRzKHRoaXMsIHcsIGgsIGZsYWdzKTsKKwkJd2luZG93X3cgPSB3OworCQl3aW5kb3dfaCA9IGg7CisJCVhSZXNpemVXaW5kb3coU0RMX0Rpc3BsYXksIFdNd2luZG93LCB3LCBoKTsKKwl9CisKKwkvKiBDcmVhdGUgKG9yIHVzZSkgdGhlIFgxMSBkaXNwbGF5IHdpbmRvdyAqLworCWlmICggIVNETF93aW5kb3dpZCApIHsKKwkJaWYgKCBmbGFncyAmIFNETF9PUEVOR0wgKSB7CisJCQlpZiAoIFgxMV9HTF9DcmVhdGVXaW5kb3codGhpcywgdywgaCkgPCAwICkgeworCQkJCXJldHVybigtMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlYU2V0V2luZG93QXR0cmlidXRlcyBzd2E7CisKKwkJCXN3YS5iYWNrZ3JvdW5kX3BpeGVsID0gMDsKKwkJCXN3YS5ib3JkZXJfcGl4ZWwgPSAwOworCQkJc3dhLmNvbG9ybWFwID0gU0RMX1hDb2xvck1hcDsKKwkJCVNETF9XaW5kb3cgPSBYQ3JlYXRlV2luZG93KFNETF9EaXNwbGF5LCBXTXdpbmRvdywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgCTAsIDAsIHcsIGgsIDAsIGRlcHRoLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAJSW5wdXRPdXRwdXQsIFNETF9WaXN1YWwsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIAlDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgCXwgQ1dDb2xvcm1hcCwgJnN3YSk7CisJCX0KKwkJLyogT25seSBtYW5hZ2Ugb3VyIGlucHV0IGlmIHdlIG93biB0aGUgd2luZG93ICovCisJCVhTZWxlY3RJbnB1dChTRExfRGlzcGxheSwgU0RMX1dpbmRvdywKKwkJCQkJKCBFbnRlcldpbmRvd01hc2sgfCBMZWF2ZVdpbmRvd01hc2sKKwkJCQkJfCBCdXR0b25QcmVzc01hc2sgfCBCdXR0b25SZWxlYXNlTWFzaworCQkJCQl8IFBvaW50ZXJNb3Rpb25NYXNrIHwgRXhwb3N1cmVNYXNrICkpOworCX0KKwkvKiBDcmVhdGUgdGhlIGdyYXBoaWNzIGNvbnRleHQgaGVyZSwgb25jZSB3ZSBoYXZlIGEgd2luZG93ICovCisJaWYgKCBmbGFncyAmIFNETF9PUEVOR0wgKSB7CisJCWlmICggWDExX0dMX0NyZWF0ZUNvbnRleHQodGhpcykgPCAwICkgeworCQkJcmV0dXJuKC0xKTsKKwkJfSBlbHNlIHsKKwkJCXNjcmVlbi0+ZmxhZ3MgfD0gU0RMX09QRU5HTDsKKwkJfQorCX0gZWxzZSB7CisJCVhHQ1ZhbHVlcyBnY3Y7CisKKwkJZ2N2LmdyYXBoaWNzX2V4cG9zdXJlcyA9IEZhbHNlOworCQlTRExfR0MgPSBYQ3JlYXRlR0MoU0RMX0Rpc3BsYXksIFNETF9XaW5kb3csCisJCSAgICAgICAgICAgICAgICAgICBHQ0dyYXBoaWNzRXhwb3N1cmVzLCAmZ2N2KTsKKwkJaWYgKCAhIFNETF9HQyApIHsKKwkJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgY3JlYXRlIGdyYXBoaWNzIGNvbnRleHQiKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisKKwkvKiBTZXQgb3VyIGNvbG9ybWFwcyB3aGVuIG5vdCBzZXR0aW5nIGEgR0wgbW9kZSAqLworCWlmICggISAoZmxhZ3MgJiBTRExfT1BFTkdMKSApIHsKKwkJWFNldFdpbmRvd0NvbG9ybWFwKFNETF9EaXNwbGF5LCBTRExfV2luZG93LCBTRExfWENvbG9yTWFwKTsKKwkJaWYoICFTRExfd2luZG93aWQgKSB7CisJCSAgICBYU2V0V2luZG93Q29sb3JtYXAoU0RMX0Rpc3BsYXksIEZTd2luZG93LCBTRExfWENvbG9yTWFwKTsKKwkJICAgIFhTZXRXaW5kb3dDb2xvcm1hcChTRExfRGlzcGxheSwgV013aW5kb3csIFNETF9YQ29sb3JNYXApOworCQl9CisJfQorCisjaWYgMCAvKiBUaGlzIGlzIGFuIGV4cGVyaW1lbnQgLSBhcmUgdGhlIGdyYXBoaWNzIGZhc3RlciBub3c/IC0gbm9wZS4gKi8KKwlpZiAoIFNETF9nZXRlbnYoIlNETF9WSURFT19YMTFfQkFDS0lOR1NUT1JFIikgKQorI2VuZGlmCisJLyogQ2FjaGUgdGhlIHdpbmRvdyBpbiB0aGUgc2VydmVyLCB3aGVuIHBvc3NpYmxlICovCisJeworCQlTY3JlZW4gKnhzY3JlZW47CisJCVhTZXRXaW5kb3dBdHRyaWJ1dGVzIGE7CisKKwkJeHNjcmVlbiA9IFNjcmVlbk9mRGlzcGxheShTRExfRGlzcGxheSwgU0RMX1NjcmVlbik7CisJCWEuYmFja2luZ19zdG9yZSA9IERvZXNCYWNraW5nU3RvcmUoeHNjcmVlbik7CisJCWlmICggYS5iYWNraW5nX3N0b3JlICE9IE5vdFVzZWZ1bCApIHsKKwkJCVhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKFNETF9EaXNwbGF5LCBTRExfV2luZG93LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgQ1dCYWNraW5nU3RvcmUsICZhKTsKKwkJfQorCX0KKworCS8qIE1hcCB0aGVtIGJvdGggYW5kIGdvIGZ1bGxzY3JlZW4sIGlmIHJlcXVlc3RlZCAqLworCWlmICggISBTRExfd2luZG93aWQgKSB7CisJCVhNYXBXaW5kb3coU0RMX0Rpc3BsYXksIFNETF9XaW5kb3cpOworCQlYTWFwV2luZG93KFNETF9EaXNwbGF5LCBXTXdpbmRvdyk7CisJCVgxMV9XYWl0TWFwcGVkKHRoaXMsIFdNd2luZG93KTsKKwkJaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgeworCQkJc2NyZWVuLT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKwkJCVgxMV9FbnRlckZ1bGxTY3JlZW4odGhpcyk7CisJCX0gZWxzZSB7CisJCQlzY3JlZW4tPmZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKKwkJfQorCX0KKwkKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgWDExX1Jlc2l6ZVdpbmRvdyhfVEhJUywKKwkJCVNETF9TdXJmYWNlICpzY3JlZW4sIGludCB3LCBpbnQgaCwgVWludDMyIGZsYWdzKQoreworCWlmICggISBTRExfd2luZG93aWQgKSB7CisJCS8qIFJlc2l6ZSB0aGUgd2luZG93IG1hbmFnZXIgd2luZG93ICovCisJCVgxMV9TZXRTaXplSGludHModGhpcywgdywgaCwgZmxhZ3MpOworCQl3aW5kb3dfdyA9IHc7CisJCXdpbmRvd19oID0gaDsKKwkJWFJlc2l6ZVdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3csIHcsIGgpOworCisJCS8qIFJlc2l6ZSB0aGUgZnVsbHNjcmVlbiBhbmQgZGlzcGxheSB3aW5kb3dzICovCisJCWlmICggZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKKwkJCWlmICggc2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOICkgeworCQkJCVgxMV9SZXNpemVGdWxsU2NyZWVuKHRoaXMpOworCQkJfSBlbHNlIHsKKwkJCQlzY3JlZW4tPmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworCQkJCVgxMV9FbnRlckZ1bGxTY3JlZW4odGhpcyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiApIHsKKwkJCQlzY3JlZW4tPmZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKKwkJCQlYMTFfTGVhdmVGdWxsU2NyZWVuKHRoaXMpOworCQkJfQorCQl9CisJCVhSZXNpemVXaW5kb3coU0RMX0Rpc3BsYXksIFNETF9XaW5kb3csIHcsIGgpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK1NETF9TdXJmYWNlICpYMTFfU2V0VmlkZW9Nb2RlKF9USElTLCBTRExfU3VyZmFjZSAqY3VycmVudCwKKwkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIFVpbnQzMiBmbGFncykKK3sKKwlVaW50MzIgc2F2ZWRfZmxhZ3M7CisKKwkvKiBMb2NrIHRoZSBldmVudCB0aHJlYWQsIGluIG11bHRpLXRocmVhZGluZyBlbnZpcm9ubWVudHMgKi8KKwlTRExfTG9ja19FdmVudFRocmVhZCgpOworCisJLyogQ2hlY2sgdGhlIGNvbWJpbmF0aW9uIG9mIGZsYWdzIHdlIHdlcmUgcGFzc2VkICovCisJaWYgKCBmbGFncyAmIFNETF9GVUxMU0NSRUVOICkgeworCQkvKiBDbGVhciBmdWxsc2NyZWVuIGZsYWcgaWYgbm90IHN1cHBvcnRlZCAqLworCQlpZiAoIFNETF93aW5kb3dpZCApIHsKKwkJCWZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKKwkJfQorCX0KKworCS8qIEZsdXNoIGFueSBkZWxheWVkIHVwZGF0ZXMgKi8KKwlYU3luYyhHRlhfRGlzcGxheSwgRmFsc2UpOworCisJLyogU2V0IHVwIHRoZSBYMTEgd2luZG93ICovCisJc2F2ZWRfZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKKwlpZiAoIChTRExfV2luZG93KSAmJiAoKHNhdmVkX2ZsYWdzJlNETF9PUEVOR0wpID09IChmbGFncyZTRExfT1BFTkdMKSkKKwkgICAgICAmJiAoYnBwID09IGN1cnJlbnQtPmZvcm1hdC0+Qml0c1BlclBpeGVsKQorICAgICAgICAgICYmICgoc2F2ZWRfZmxhZ3MmU0RMX05PRlJBTUUpID09IChmbGFncyZTRExfTk9GUkFNRSkpICkgeworCQlpZiAoWDExX1Jlc2l6ZVdpbmRvdyh0aGlzLCBjdXJyZW50LCB3aWR0aCwgaGVpZ2h0LCBmbGFncykgPCAwKSB7CisJCQljdXJyZW50ID0gTlVMTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlYMTFfUGVuZGluZ0NvbmZpZ3VyZU5vdGlmeVdpZHRoID0gd2lkdGg7CisJCVgxMV9QZW5kaW5nQ29uZmlndXJlTm90aWZ5SGVpZ2h0ID0gaGVpZ2h0OworCX0gZWxzZSB7CisJCWlmIChYMTFfQ3JlYXRlV2luZG93KHRoaXMsY3VycmVudCx3aWR0aCxoZWlnaHQsYnBwLGZsYWdzKSA8IDApIHsKKwkJCWN1cnJlbnQgPSBOVUxMOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJLyogVXBkYXRlIHRoZSBpbnRlcm5hbCBrZXlib2FyZCBzdGF0ZSAqLworCVgxMV9TZXRLZXlib2FyZFN0YXRlKFNETF9EaXNwbGF5LCBOVUxMKTsKKworCS8qIFdoZW4gdGhlIHdpbmRvdyBpcyBmaXJzdCBtYXBwZWQsIGlnbm9yZSBub24tbW9kaWZpZXIga2V5cyAqLworCWlmICggIWN1cnJlbnQtPncgJiYgIWN1cnJlbnQtPmggKSB7CisJCVVpbnQ4ICprZXlzID0gU0RMX0dldEtleVN0YXRlKE5VTEwpOworCQlpbnQgaTsKKwkJZm9yICggaSA9IDA7IGkgPCBTRExLX0xBU1Q7ICsraSApIHsKKwkJCXN3aXRjaCAoaSkgeworCQkJICAgIGNhc2UgU0RMS19OVU1MT0NLOgorCQkJICAgIGNhc2UgU0RMS19DQVBTTE9DSzoKKwkJCSAgICBjYXNlIFNETEtfTENUUkw6CisJCQkgICAgY2FzZSBTRExLX1JDVFJMOgorCQkJICAgIGNhc2UgU0RMS19MU0hJRlQ6CisJCQkgICAgY2FzZSBTRExLX1JTSElGVDoKKwkJCSAgICBjYXNlIFNETEtfTEFMVDoKKwkJCSAgICBjYXNlIFNETEtfUkFMVDoKKwkJCSAgICBjYXNlIFNETEtfTE1FVEE6CisJCQkgICAgY2FzZSBTRExLX1JNRVRBOgorCQkJICAgIGNhc2UgU0RMS19NT0RFOgorCQkJCWJyZWFrOworCQkJICAgIGRlZmF1bHQ6CisJCQkJa2V5c1tpXSA9IFNETF9SRUxFQVNFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNldCB1cCB0aGUgbmV3IG1vZGUgZnJhbWVidWZmZXIgKi8KKwlpZiAoICgoY3VycmVudC0+dyAhPSB3aWR0aCkgfHwgKGN1cnJlbnQtPmggIT0gaGVpZ2h0KSkgfHwKKyAgICAgICAgICAgICAoKHNhdmVkX2ZsYWdzJlNETF9PUEVOR0wpICE9IChmbGFncyZTRExfT1BFTkdMKSkgKSB7CisJCWN1cnJlbnQtPncgPSB3aWR0aDsKKwkJY3VycmVudC0+aCA9IGhlaWdodDsKKwkJY3VycmVudC0+cGl0Y2ggPSBTRExfQ2FsY3VsYXRlUGl0Y2goY3VycmVudCk7CisJCWlmIChYMTFfUmVzaXplSW1hZ2UodGhpcywgY3VycmVudCwgZmxhZ3MpIDwgMCkgeworCQkJY3VycmVudCA9IE5VTEw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwkvKiBDbGVhciB0aGVzZSBmbGFncyBhbmQgc2V0IHRoZW0gb25seSBpZiB0aGV5IGFyZSBpbiB0aGUgbmV3IHNldC4gKi8KKwljdXJyZW50LT5mbGFncyAmPSB+KFNETF9SRVNJWkFCTEV8U0RMX05PRlJBTUUpOworCWN1cnJlbnQtPmZsYWdzIHw9IChmbGFncyYoU0RMX1JFU0laQUJMRXxTRExfTk9GUkFNRSkpOworCisgIGRvbmU6CisJLyogUmVsZWFzZSB0aGUgZXZlbnQgdGhyZWFkICovCisJWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKwlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7CisKKwkvKiBXZSdyZSBkb25lISAqLworCXJldHVybihjdXJyZW50KTsKK30KKworc3RhdGljIGludCBYMTFfVG9nZ2xlRnVsbFNjcmVlbihfVEhJUywgaW50IG9uKQoreworCVVpbnQzMiBldmVudF90aHJlYWQ7CisKKwkvKiBEb24ndCBzd2l0Y2ggaWYgd2UgZG9uJ3Qgb3duIHRoZSB3aW5kb3cgKi8KKwlpZiAoIFNETF93aW5kb3dpZCApIHsKKwkJcmV0dXJuKDApOworCX0KKworCS8qIERvbid0IGxvY2sgaWYgd2UgYXJlIHRoZSBldmVudCB0aHJlYWQgKi8KKwlldmVudF90aHJlYWQgPSBTRExfRXZlbnRUaHJlYWRJRCgpOworCWlmICggZXZlbnRfdGhyZWFkICYmIChTRExfVGhyZWFkSUQoKSA9PSBldmVudF90aHJlYWQpICkgeworCQlldmVudF90aHJlYWQgPSAwOworCX0KKwlpZiAoIGV2ZW50X3RocmVhZCApIHsKKwkJU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKKwl9CisJaWYgKCBvbiApIHsKKwkJdGhpcy0+c2NyZWVuLT5mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKwkJWDExX0VudGVyRnVsbFNjcmVlbih0aGlzKTsKKwl9IGVsc2UgeworCQl0aGlzLT5zY3JlZW4tPmZsYWdzICY9IH5TRExfRlVMTFNDUkVFTjsKKwkJWDExX0xlYXZlRnVsbFNjcmVlbih0aGlzKTsKKwl9CisJWDExX1JlZnJlc2hEaXNwbGF5KHRoaXMpOworCWlmICggZXZlbnRfdGhyZWFkICkgeworCQlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7CisJfQorCVNETF9SZXNldEtleWJvYXJkKCk7CisJcmV0dXJuKDEpOworfQorCisvKiBVcGRhdGUgdGhlIGN1cnJlbnQgbW91c2Ugc3RhdGUgYW5kIHBvc2l0aW9uICovCitzdGF0aWMgdm9pZCBYMTFfVXBkYXRlTW91c2UoX1RISVMpCit7CisJV2luZG93IHUxOyBpbnQgdTI7CisJV2luZG93IGN1cnJlbnRfd2luOworCWludCB4LCB5OworCXVuc2lnbmVkIGludCBtYXNrOworCisJLyogTG9jayB0aGUgZXZlbnQgdGhyZWFkLCBpbiBtdWx0aS10aHJlYWRpbmcgZW52aXJvbm1lbnRzICovCisJU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKKwlpZiAoIFhRdWVyeVBvaW50ZXIoU0RMX0Rpc3BsYXksIFNETF9XaW5kb3csICZ1MSwgJmN1cnJlbnRfd2luLAorCSAgICAgICAgICAgICAgICAgICAmdTIsICZ1MiwgJngsICZ5LCAmbWFzaykgKSB7CisJCWlmICggKHggPj0gMCkgJiYgKHggPCBTRExfVmlkZW9TdXJmYWNlLT53KSAmJgorCQkgICAgICh5ID49IDApICYmICh5IDwgU0RMX1ZpZGVvU3VyZmFjZS0+aCkgKSB7CisJCQlTRExfUHJpdmF0ZUFwcEFjdGl2ZSgxLCBTRExfQVBQTU9VU0VGT0NVUyk7CisJCQlTRExfUHJpdmF0ZU1vdXNlTW90aW9uKDAsIDAsIHgsIHkpOworCQl9IGVsc2UgeworCQkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMCwgU0RMX0FQUE1PVVNFRk9DVVMpOworCQl9CisJfQorCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKK30KKworLyogc2ltcGxlIGNvbG91ciBkaXN0YW5jZSBtZXRyaWMuIFN1cHBvc2VkIHRvIGJlIGJldHRlciB0aGFuIGEgcGxhaW4KKyAgIEV1Y2xpZGlhbiBkaXN0YW5jZSBhbnl3YXkuICovCisjZGVmaW5lIENPTE9VUl9GQUNUT1IgMworI2RlZmluZSBMSUdIVF9GQUNUT1IgMQorI2RlZmluZSBDT0xPVVJfRElTVChyMSwgZzEsIGIxLCByMiwgZzIsIGIyKQkJCQlcCisJKENPTE9VUl9GQUNUT1IgKiAoYWJzKHIxIC0gcjIpICsgYWJzKGcxIC0gZzIpICsgYWJzKGIxIC0gYjIpKQlcCisJICsgTElHSFRfRkFDVE9SICogYWJzKHIxICsgZzEgKyBiMSAtIChyMiArIGcyICsgYjIpKSkKKworc3RhdGljIHZvaWQgYWxsb2NhdGVfbmVhcmVzdChfVEhJUywgU0RMX0NvbG9yICpjb2xvcnMsCisJCQkgICAgIFNETF9Db2xvciAqd2FudCwgaW50IG53YW50KQoreworCS8qCisJICogVGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hpY2ggb25lcyB0byBjaG9vc2UgZnJvbSwgc28gd2UgcmV0cmlldmUKKwkgKiB0aGUgZW50aXJlIGNvbG9ybWFwIGFuZCB0cnkgdGhlIG5lYXJlc3QgcG9zc2libGUsIHVudGlsIHdlIGZpbmQgb25lCisJICogdGhhdCBpcyBzaGFyZWQuCisJICovCisJWENvbG9yIGFsbFsyNTZdOworCWludCBpOworCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlhbGxbaV0ucGl4ZWwgPSBpOworCS8qIAorCSAqIFhRdWVyeUNvbG9ycyBzZXRzIHRoZSBmbGFncyBpbiB0aGUgWENvbG9yIHN0cnVjdCwgc28gd2UgdXNlCisJICogdGhhdCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGNvbG91cnMgYXJlIGF2YWlsYWJsZQorCSAqLworCVhRdWVyeUNvbG9ycyhHRlhfRGlzcGxheSwgU0RMX1hDb2xvck1hcCwgYWxsLCAyNTYpOworCisJZm9yKGkgPSAwOyBpIDwgbndhbnQ7IGkrKykgeworCQlYQ29sb3IgKmM7CisJCWludCBqOworCQlpbnQgYmVzdCA9IDA7CisJCWludCBtaW5kaXN0ID0gMHg3ZmZmZmZmZjsKKwkJaW50IHJpID0gd2FudFtpXS5yOworCQlpbnQgZ2kgPSB3YW50W2ldLmc7CisJCWludCBiaSA9IHdhbnRbaV0uYjsKKwkJZm9yKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKwkJCWludCByaiwgZ2osIGJqLCBkMjsKKwkJCWlmKCFhbGxbal0uZmxhZ3MpCisJCQkJY29udGludWU7CS8qIHVuYXZhaWxhYmxlIGNvbG91ciBjZWxsICovCisJCQlyaiA9IGFsbFtqXS5yZWQgPj4gODsKKwkJCWdqID0gYWxsW2pdLmdyZWVuID4+IDg7CisJCQliaiA9IGFsbFtqXS5ibHVlID4+IDg7CisJCQlkMiA9IENPTE9VUl9ESVNUKHJpLCBnaSwgYmksIHJqLCBnaiwgYmopOworCQkJaWYoZDIgPCBtaW5kaXN0KSB7CisJCQkJbWluZGlzdCA9IGQyOworCQkJCWJlc3QgPSBqOworCQkJfQorCQl9CisJCWlmKFNETF9YUGl4ZWxzW2Jlc3RdKQorCQkJY29udGludWU7IC8qIGFscmVhZHkgYWxsb2NhdGVkLCB3YXN0ZSBubyBtb3JlIHRpbWUgKi8KKwkJYyA9IGFsbCArIGJlc3Q7CisJCWlmKFhBbGxvY0NvbG9yKEdGWF9EaXNwbGF5LCBTRExfWENvbG9yTWFwLCBjKSkgeworCQkJLyogZ290IGl0ICovCisJCQljb2xvcnNbYy0+cGl4ZWxdLnIgPSBjLT5yZWQgPj4gODsKKwkJCWNvbG9yc1tjLT5waXhlbF0uZyA9IGMtPmdyZWVuID4+IDg7CisJCQljb2xvcnNbYy0+cGl4ZWxdLmIgPSBjLT5ibHVlID4+IDg7CisJCQkrK1NETF9YUGl4ZWxzW2MtPnBpeGVsXTsKKwkJfSBlbHNlIHsKKwkJCS8qIAorCQkJICogVGhlIGNvbG91ciBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQsIHByb2JhYmx5IGJlaW5nCisJCQkgKiBvd25lZCBhcyBhIHIvdyBjZWxsIGJ5IGFub3RoZXIgY2xpZW50LiBGbGFnIGl0IGFzCisJCQkgKiB1bmF2YWlsYWJsZSBhbmQgdHJ5IGFnYWluLiBUaGUgdGVybWluYXRpb24gb2YgdGhlCisJCQkgKiBsb29wIGlzIGd1YXJhbnRlZWQgc2luY2UgYXQgbGVhc3QgYmxhY2sgYW5kIHdoaXRlCisJCQkgKiBhcmUgYWx3YXlzIHRoZXJlLgorCQkJICovCisJCQljLT5mbGFncyA9IDA7CisJCQlpLS07CisJCX0KKwl9Cit9CisKK2ludCBYMTFfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworCWludCBucmVqID0gMDsKKworCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgY29sb3JtYXAgYWxsb2NhdGVkICovCisJaWYgKCBTRExfWFBpeGVscyA9PSBOVUxMICkgeworCQlyZXR1cm4oMCk7CisJfQorCWlmICggKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfSFdQQUxFVFRFKSA9PSBTRExfSFdQQUxFVFRFICkgeworCSAgICAgICAgLyogcHJpdmF0ZSB3cml0YWJsZSBjb2xvcm1hcDoganVzdCBzZXQgdGhlIGNvbG91cnMgd2UgbmVlZCAqLworCSAgICAgICAgWENvbG9yICAqeGNtYXA7CisJCWludCBpOworCSAgICAgICAgeGNtYXAgPSBTRExfc3RhY2tfYWxsb2MoWENvbG9yLCBuY29sb3JzKTsKKwkJaWYoeGNtYXAgPT0gTlVMTCkKKwkJICAgICAgICByZXR1cm4gMDsKKwkJZm9yICggaT0wOyBpPG5jb2xvcnM7ICsraSApIHsKKwkJCXhjbWFwW2ldLnBpeGVsID0gaSArIGZpcnN0Y29sb3I7CisJCQl4Y21hcFtpXS5yZWQgICA9IChjb2xvcnNbaV0ucjw8OCl8Y29sb3JzW2ldLnI7CisJCQl4Y21hcFtpXS5ncmVlbiA9IChjb2xvcnNbaV0uZzw8OCl8Y29sb3JzW2ldLmc7CisJCQl4Y21hcFtpXS5ibHVlICA9IChjb2xvcnNbaV0uYjw8OCl8Y29sb3JzW2ldLmI7CisJCQl4Y21hcFtpXS5mbGFncyA9IChEb1JlZHxEb0dyZWVufERvQmx1ZSk7CisJCX0KKwkJWFN0b3JlQ29sb3JzKEdGWF9EaXNwbGF5LCBTRExfWENvbG9yTWFwLCB4Y21hcCwgbmNvbG9ycyk7CisJCVhTeW5jKEdGWF9EaXNwbGF5LCBGYWxzZSk7CisJCVNETF9zdGFja19mcmVlKHhjbWFwKTsKKwl9IGVsc2UgeworCSAgICAgICAgLyoKKwkJICogU2hhcmVkIGNvbG9ybWFwOiBXZSBvbmx5IGFsbG9jYXRlIHJlYWQtb25seSBjZWxscywgd2hpY2gKKwkJICogaW5jcmVhc2VzIHRoZSBsaWtlbHlob29kIG9mIGNvbG91ciBzaGFyaW5nIHdpdGggb3RoZXIKKwkJICogY2xpZW50cy4gVGhlIHBpeGVsIHZhbHVlcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUKKwkJICogZGlmZmVyZW50IGZyb20gdGhlIHJlcXVlc3RlZCBvbmVzLCBzbyB0aGUgdXNlciBoYXMgdG8KKwkJICogd2FsayB0aGUgY29sb3JtYXAgYW5kIHNlZSB3aGljaCBpbmRleCBnb3Qgd2hhdCBjb2xvdXIuCisJCSAqCisJCSAqIFdlIGNhbiB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIGxvZ2ljYWwgcGFsZXR0ZSBzaW5jZSBpdAorCQkgKiBoYXMgYWxyZWFkeSBiZWVuIHNldCB3aGVuIHdlIGdldCBoZXJlLgorCQkgKi8KKwkJU0RMX0NvbG9yICp3YW50LCAqcmVqZWN0OworCSAgICAgICAgdW5zaWduZWQgbG9uZyAqZnJlZWxpc3Q7CisJCWludCBpOworCQlpbnQgbmZyZWUgPSAwOworCQlpbnQgbmMgPSB0aGlzLT5zY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsKKwkgICAgICAgIGNvbG9ycyA9IHRoaXMtPnNjcmVlbi0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnM7CisJCWZyZWVsaXN0ID0gU0RMX3N0YWNrX2FsbG9jKHVuc2lnbmVkIGxvbmcsIG5jKTsKKwkJLyogbWFrZSBzdXJlIG11bHRpcGxlIGFsbG9jYXRpb25zIG9mIHRoZSBzYW1lIGNlbGwgYXJlIGZyZWVkICovCisJICAgICAgICBmb3IoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspIHsKKwkJICAgICAgICBpbnQgcGl4ZWwgPSBmaXJzdGNvbG9yICsgaTsKKwkJICAgICAgICB3aGlsZShTRExfWFBpeGVsc1twaXhlbF0pIHsKKwkJCSAgICAgICAgZnJlZWxpc3RbbmZyZWUrK10gPSBwaXhlbDsKKwkJCQktLVNETF9YUGl4ZWxzW3BpeGVsXTsKKwkJCX0KKwkJfQorCQlYRnJlZUNvbG9ycyhHRlhfRGlzcGxheSwgU0RMX1hDb2xvck1hcCwgZnJlZWxpc3QsIG5mcmVlLCAwKTsKKwkJU0RMX3N0YWNrX2ZyZWUoZnJlZWxpc3QpOworCisJCXdhbnQgPSBTRExfc3RhY2tfYWxsb2MoU0RMX0NvbG9yLCBuY29sb3JzKTsKKwkJcmVqZWN0ID0gU0RMX3N0YWNrX2FsbG9jKFNETF9Db2xvciwgbmNvbG9ycyk7CisJCVNETF9tZW1jcHkod2FudCwgY29sb3JzICsgZmlyc3Rjb2xvciwgbmNvbG9ycyAqIHNpemVvZihTRExfQ29sb3IpKTsKKwkJLyogbWFrZSBzdXJlIHRoZSB1c2VyIGlzbid0IGZvb2xlZCBieSBoZXIgb3duIHdpc2hlcworCQkgICAoYmxhY2sgaXMgc2FmZSwgYWx3YXlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBjb2xvcm1hcCkgKi8KKwkJU0RMX21lbXNldChjb2xvcnMgKyBmaXJzdGNvbG9yLCAwLCBuY29sb3JzICogc2l6ZW9mKFNETF9Db2xvcikpOworCisJCS8qIG5vdyB0cnkgdG8gYWxsb2NhdGUgdGhlIGNvbG91cnMgKi8KKwkJZm9yKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKSB7CisJCSAgICAgICAgWENvbG9yIGNvbDsKKwkJCWNvbC5yZWQgPSB3YW50W2ldLnIgPDwgODsKKwkJCWNvbC5ncmVlbiA9IHdhbnRbaV0uZyA8PCA4OworCQkJY29sLmJsdWUgPSB3YW50W2ldLmIgPDwgODsKKwkJCWNvbC5mbGFncyA9IERvUmVkIHwgRG9HcmVlbiB8IERvQmx1ZTsKKwkJCWlmKFhBbGxvY0NvbG9yKEdGWF9EaXNwbGF5LCBTRExfWENvbG9yTWFwLCAmY29sKSkgeworCQkJICAgICAgICAvKiBXZSBnb3QgdGhlIGNvbG91ciwgb3IgYXQgbGVhc3QgdGhlIG5lYXJlc3QKKwkJCQkgICB0aGUgaGFyZHdhcmUgY291bGQgZ2V0LiAqLworCQkJICAgICAgICBjb2xvcnNbY29sLnBpeGVsXS5yID0gY29sLnJlZCA+PiA4OworCQkJCWNvbG9yc1tjb2wucGl4ZWxdLmcgPSBjb2wuZ3JlZW4gPj4gODsKKwkJCQljb2xvcnNbY29sLnBpeGVsXS5iID0gY29sLmJsdWUgPj4gODsKKwkJCQkrK1NETF9YUGl4ZWxzW2NvbC5waXhlbF07CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogbm8gbW9yZSBmcmVlIGNlbGxzLCBhZGQgaXQgdG8gdGhlIGxpc3QKKwkJCQkgKiBvZiByZWplY3RlZCBjb2xvdXJzCisJCQkJICovCisJCQkJcmVqZWN0W25yZWorK10gPSB3YW50W2ldOworCQkJfQorCQl9CisJCWlmKG5yZWopCisJCQlhbGxvY2F0ZV9uZWFyZXN0KHRoaXMsIGNvbG9ycywgcmVqZWN0LCBucmVqKTsKKwkJU0RMX3N0YWNrX2ZyZWUocmVqZWN0KTsKKwkJU0RMX3N0YWNrX2ZyZWUod2FudCk7CisJfQorCXJldHVybiBucmVqID09IDA7Cit9CisKK2ludCBYMTFfU2V0R2FtbWFSYW1wKF9USElTLCBVaW50MTYgKnJhbXApCit7CisJaW50IGksIG5jb2xvcnM7CisJWENvbG9yIHhjbWFwWzI1Nl07CisKKwkvKiBTZWUgaWYgYWN0dWFsbHkgc2V0dGluZyB0aGUgZ2FtbWEgaXMgc3VwcG9ydGVkICovCisJaWYgKCBTRExfVmlzdWFsLT5jbGFzcyAhPSBEaXJlY3RDb2xvciApIHsKKwkgICAgU0RMX1NldEVycm9yKCJHYW1tYSBjb3JyZWN0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB2aXN1YWwiKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIGFwcHJvcHJpYXRlIHBhbGV0dGUgZm9yIHRoZSBnaXZlbiBnYW1tYSByYW1wICovCisJbmNvbG9ycyA9IFNETF9WaXN1YWwtPm1hcF9lbnRyaWVzOworCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7CisJCVVpbnQ4IGMgPSAoMjU2ICogaSAvIG5jb2xvcnMpOworCQl4Y21hcFtpXS5waXhlbCA9IFNETF9NYXBSR0IodGhpcy0+c2NyZWVuLT5mb3JtYXQsIGMsIGMsIGMpOworCQl4Y21hcFtpXS5yZWQgICA9IHJhbXBbMCoyNTYrY107CisJCXhjbWFwW2ldLmdyZWVuID0gcmFtcFsxKjI1NitjXTsKKwkJeGNtYXBbaV0uYmx1ZSAgPSByYW1wWzIqMjU2K2NdOworCQl4Y21hcFtpXS5mbGFncyA9IChEb1JlZHxEb0dyZWVufERvQmx1ZSk7CisJfQorCVhTdG9yZUNvbG9ycyhHRlhfRGlzcGxheSwgU0RMX1hDb2xvck1hcCwgeGNtYXAsIG5jb2xvcnMpOworCVhTeW5jKEdGWF9EaXNwbGF5LCBGYWxzZSk7CisJcmV0dXJuKDApOworfQorCisvKiBOb3RlOiAgSWYgd2UgYXJlIHRlcm1pbmF0ZWQsIHRoaXMgY291bGQgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YKKyAgIGFub3RoZXIgU0RMIHZpZGVvIHJvdXRpbmUgLS0gbm90YWJseSBVcGRhdGVSZWN0cy4KKyovCit2b2lkIFgxMV9WaWRlb1F1aXQoX1RISVMpCit7CisJLyogU2h1dGRvd24gZXZlcnl0aGluZyB0aGF0J3Mgc3RpbGwgdXAgKi8KKwkvKiBUaGUgZXZlbnQgdGhyZWFkIHNob3VsZCBiZSBkb25lLCBzbyB3ZSBjYW4gdG91Y2ggU0RMX0Rpc3BsYXkgKi8KKwlpZiAoIFNETF9EaXNwbGF5ICE9IE5VTEwgKSB7CisJCS8qIEZsdXNoIGFueSBkZWxheWVkIHVwZGF0ZXMgKi8KKwkJWFN5bmMoR0ZYX0Rpc3BsYXksIEZhbHNlKTsKKworCQkvKiBDbG9zZSB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBJTSBzZXJ2ZXIgKi8KKwkJI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworCQlpZiAoU0RMX0lDICE9IE5VTEwpIHsKKwkJCVhVbnNldElDRm9jdXMoU0RMX0lDKTsKKwkJCVhEZXN0cm95SUMoU0RMX0lDKTsKKwkJCVNETF9JQyA9IE5VTEw7CisJCX0KKwkJaWYgKFNETF9JTSAhPSBOVUxMKSB7CisJCQlYQ2xvc2VJTShTRExfSU0pOworCQkJU0RMX0lNID0gTlVMTDsKKwkJfQorCQkjZW5kaWYKKworCQkvKiBTdGFydCBzaHV0dGluZyBkb3duIHRoZSB3aW5kb3dzICovCisJCVgxMV9EZXN0cm95SW1hZ2UodGhpcywgdGhpcy0+c2NyZWVuKTsKKwkJWDExX0Rlc3Ryb3lXaW5kb3codGhpcywgdGhpcy0+c2NyZWVuKTsKKwkJWDExX0ZyZWVWaWRlb01vZGVzKHRoaXMpOworCQlpZiAoIFNETF9YQ29sb3JNYXAgIT0gU0RMX0Rpc3BsYXlDb2xvcm1hcCApIHsKKwkJCVhGcmVlQ29sb3JtYXAoU0RMX0Rpc3BsYXksIFNETF9YQ29sb3JNYXApOworCQl9CisJCWlmICggU0RMX2ljb25jb2xvcnMgKSB7CisJCQl1bnNpZ25lZCBsb25nIHBpeGVsOworCQkJQ29sb3JtYXAgZGNtYXAgPSBEZWZhdWx0Q29sb3JtYXAoU0RMX0Rpc3BsYXksCisJCQkJCQkJIFNETF9TY3JlZW4pOworCQkJZm9yKHBpeGVsID0gMDsgcGl4ZWwgPCAyNTY7ICsrcGl4ZWwpIHsKKwkJCQl3aGlsZShTRExfaWNvbmNvbG9yc1twaXhlbF0gPiAwKSB7CisJCQkJCVhGcmVlQ29sb3JzKEdGWF9EaXNwbGF5LAorCQkJCQkJICAgIGRjbWFwLCAmcGl4ZWwsIDEsIDApOworCQkJCQktLVNETF9pY29uY29sb3JzW3BpeGVsXTsKKwkJCQl9CisJCQl9CisJCQlTRExfZnJlZShTRExfaWNvbmNvbG9ycyk7CisJCQlTRExfaWNvbmNvbG9ycyA9IE5VTEw7CisJCX0gCisKKwkJLyogUmVzdG9yZSBnYW1tYSBzZXR0aW5ncyBpZiB0aGV5J3ZlIGNoYW5nZWQgKi8KKwkJaWYgKCBTRExfR2V0QXBwU3RhdGUoKSAmIFNETF9BUFBBQ1RJVkUgKSB7CisJCQlYMTFfU3dhcFZpZE1vZGVHYW1tYSh0aGlzKTsKKwkJfQorCisJCS8qIEZyZWUgdGhhdCBibGFuayBjdXJzb3IgKi8KKwkJaWYgKCBTRExfQmxhbmtDdXJzb3IgIT0gTlVMTCApIHsKKwkJCXRoaXMtPkZyZWVXTUN1cnNvcih0aGlzLCBTRExfQmxhbmtDdXJzb3IpOworCQkJU0RMX0JsYW5rQ3Vyc29yID0gTlVMTDsKKwkJfQorCisJCS8qIENsb3NlIHRoZSBYMTEgZ3JhcGhpY3MgY29ubmVjdGlvbiAqLworCQlpZiAoIEdGWF9EaXNwbGF5ICE9IE5VTEwgKSB7CisJCQlYQ2xvc2VEaXNwbGF5KEdGWF9EaXNwbGF5KTsKKwkJCUdGWF9EaXNwbGF5ID0gTlVMTDsKKwkJfQorCisJCS8qIENsb3NlIHRoZSBYMTEgZGlzcGxheSBjb25uZWN0aW9uICovCisJCVhDbG9zZURpc3BsYXkoU0RMX0Rpc3BsYXkpOworCQlTRExfRGlzcGxheSA9IE5VTEw7CisKKwkJLyogUmVzZXQgdGhlIFgxMSBlcnJvciBoYW5kbGVycyAqLworCQlpZiAoIFhJT19oYW5kbGVyICkgeworCQkJWFNldElPRXJyb3JIYW5kbGVyKFhJT19oYW5kbGVyKTsKKwkJfQorCQlpZiAoIFhfaGFuZGxlciApIHsKKwkJCVhTZXRFcnJvckhhbmRsZXIoWF9oYW5kbGVyKTsKKwkJfQorCisJCS8qIFVubG9hZCBHTCBsaWJyYXJ5IGFmdGVyIFgxMSBzaHV0cyBkb3duICovCisJCVgxMV9HTF9VbmxvYWRMaWJyYXJ5KHRoaXMpOworCX0KKwlpZiAoIHRoaXMtPnNjcmVlbiAmJiAodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICkgeworCQkvKiBEaXJlY3Qgc2NyZWVuIGFjY2Vzcywgbm8gbWVtb3J5IGJ1ZmZlciAqLworCQl0aGlzLT5zY3JlZW4tPnBpeGVscyA9IE5VTEw7CisJfQorCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWE1FCisgICAgWGlHTWlzY0Rlc3Ryb3koKTsKKyNlbmRpZgorfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExdmlkZW8uaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTF2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Y2Y0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExdmlkZW8uaApAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKyNpZm5kZWYgX1NETF94MTF2aWRlb19oCisjZGVmaW5lIF9TRExfeDExdmlkZW9faAorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNpbmNsdWRlIDxYMTEvWGF0b20uaD4KKworI2luY2x1ZGUgIlNETF9tb3VzZS5oIgorI2luY2x1ZGUgIi4uL1NETF9zeXN2aWRlby5oIgorCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfREdBTU9VU0UKKyNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMveGY4NmRnYS5oIgorI2VuZGlmCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKKyNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMvWGluZXJhbWEuaCIKKyNlbmRpZiAKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YUkFORFIKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YcmFuZHIuaD4KKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfWDExX1ZJRE1PREUKKyNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMveGY4NnZtb2RlLmgiCisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUKKyNpbmNsdWRlICIuLi9YZXh0L2V4dGVuc2lvbnMveG1lLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIlNETF94MTFkeW4uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcworCisvKiBQcml2YXRlIGRpc3BsYXkgZGF0YSAqLworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKKyAgICBpbnQgbG9jYWxfWDExOwkJLyogRmxhZzogdHJ1ZSBpZiBsb2NhbCBkaXNwbGF5ICovCisgICAgRGlzcGxheSAqWDExX0Rpc3BsYXk7CS8qIFVzZWQgZm9yIGV2ZW50cyBhbmQgd2luZG93IG1hbmFnZW1lbnQgKi8KKyAgICBEaXNwbGF5ICpHRlhfRGlzcGxheTsJLyogVXNlZCBmb3IgZ3JhcGhpY3MgYW5kIGNvbG9ybWFwIHN0dWZmICovCisgICAgVmlzdWFsICpTRExfVmlzdWFsOwkJLyogVGhlIHZpc3VhbCB1c2VkIGJ5IG91ciB3aW5kb3cgKi8KKyAgICBXaW5kb3cgV013aW5kb3c7CQkvKiBJbnB1dCB3aW5kb3csIG1hbmFnZWQgYnkgd2luZG93IG1hbmFnZXIgKi8KKyAgICBXaW5kb3cgRlN3aW5kb3c7CQkvKiBGdWxsc2NyZWVuIHdpbmRvdywgY29tcGxldGVseSB1bm1hbmFnZWQgKi8KKyAgICBXaW5kb3cgU0RMX1dpbmRvdzsJCS8qIFNoYXJlZCBieSBib3RoIGRpc3BsYXlzIChubyBYIHNlY3VyaXR5PykgKi8KKyAgICBBdG9tIFdNX0RFTEVURV9XSU5ET1c7CS8qICJjbG9zZS13aW5kb3ciIHByb3RvY29sIGF0b20gKi8KKyAgICBXTWN1cnNvciAqQmxhbmtDdXJzb3I7CS8qIFRoZSBpbnZpc2libGUgY3Vyc29yICovCisgICAgWElNIFgxMV9JTTsJCS8qIFVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgaW5wdXQgbWV0aG9kIChJTSkgc2VydmVyICovCisgICAgWElDIFgxMV9JQzsJCS8qIFVzZWQgZm9yIHJldGFpbmluZyB0aGUgc3RhdGUsIHByb3BlcnRpZXMsIGFuZCBzZW1hbnRpY3Mgb2YgY29tbXVuaWNhdGlvbiB3aXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgbWV0aG9kIChJTSkgc2VydmVyICovCisKKyAgICBjaGFyICpTRExfd2luZG93aWQ7CQkvKiBGbGFnOiB0cnVlIGlmIHdlIGhhdmUgYmVlbiBwYXNzZWQgYSB3aW5kb3cgKi8KKworICAgIC8qIERpcmVjdCBHcmFwaGljcyBBY2Nlc3MgZXh0ZW5zaW9uIGluZm9ybWF0aW9uICovCisgICAgaW50IHVzaW5nX2RnYTsKKworI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCisgICAgLyogTUlUIHNoYXJlZCBtZW1vcnkgZXh0ZW5zaW9uIGluZm9ybWF0aW9uICovCisgICAgaW50IHVzZV9taXRzaG07CisgICAgWFNobVNlZ21lbnRJbmZvIHNobWluZm87CisjZW5kaWYKKworICAgIC8qIFRoZSB2YXJpYWJsZXMgdXNlZCBmb3IgZGlzcGxheWluZyBncmFwaGljcyAqLworICAgIFhJbWFnZSAqWGltYWdlOwkJLyogVGhlIFggaW1hZ2UgZm9yIG91ciB3aW5kb3cgKi8KKyAgICBHQwlnYzsJCQkvKiBUaGUgZ3JhcGhpYyBjb250ZXh0IGZvciBkcmF3aW5nICovCisKKyAgICAvKiBUaGUgY3VycmVudCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBmdWxsc2NyZWVuIG1vZGUgKi8KKyAgICBpbnQgd2luZG93X3c7CisgICAgaW50IHdpbmRvd19oOworCisgICAgLyogU3VwcG9ydCBmb3IgaW50ZXJuYWwgbW91c2Ugd2FycGluZyAqLworICAgIHN0cnVjdCB7CisgICAgICAgIGludCB4OworICAgICAgICBpbnQgeTsKKyAgICB9IG1vdXNlX2xhc3Q7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG51bWVyYXRvcjsKKyAgICAgICAgaW50IGRlbm9taW5hdG9yOworICAgICAgICBpbnQgdGhyZXNob2xkOworICAgIH0gbW91c2VfYWNjZWw7CisgICAgaW50IG1vdXNlX3JlbGF0aXZlOworCisgICAgLyogVGhlIGN1cnJlbnQgbGlzdCBvZiBhdmFpbGFibGUgdmlkZW8gbW9kZXMgKi8KKyAgICBTRExfUmVjdCAqKm1vZGVsaXN0OworCisgICAgLyogYXZhaWxhYmxlIHZpc3VhbHMgb2YgaW50ZXJlc3QgdG8gdXMsIHNvcnRlZCBkZWVwZXN0IGZpcnN0ICovCisgICAgc3RydWN0IHsKKwlWaXN1YWwgKnZpc3VhbDsKKwlpbnQgZGVwdGg7CQkvKiBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cy9waXhlbCAqLworCWludCBicHA7CQkvKiBwaXhlbCBxdWFudHVtIGluIGJpdHMgKi8KKyAgICB9IHZpc3VhbHNbMio1XTsJCS8qIGF0IG1vc3QgMiBlbnRyaWVzIGZvciA4LCAxNSwgMTYsIDI0LCAzMiAqLworICAgIGludCBudmlzdWFsczsKKworICAgIFZpc3VhbCAqdmlzOwkJLyogY3VycmVudCB2aXN1YWwgaW4gdXNlICovCisgICAgaW50IGRlcHRoOwkJCS8qIGN1cnJlbnQgdmlzdWFsIGRlcHRoIChub3QgYnBwKSAqLworCisgICAgLyogVmFyaWFibGVzIHVzZWQgYnkgdGhlIFgxMSB2aWRlbyBtb2RlIGNvZGUgKi8KKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQorICAgIFNETF9OQU1FKFhpbmVyYW1hU2NyZWVuSW5mbykgeGluZXJhbWFfaW5mbzsKKyNlbmRpZgorI2lmIFNETF9WSURFT19EUklWRVJfWDExX1hSQU5EUgorICAgIFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24qIHNjcmVlbl9jb25maWc7CisgICAgaW50IHNhdmVkX3NpemVfaWQ7CisgICAgUm90YXRpb24gc2F2ZWRfcm90YXRpb247CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9WSURNT0RFCisgICAgU0RMX05BTUUoWEY4NlZpZE1vZGVNb2RlSW5mbykgc2F2ZWRfbW9kZTsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgeCwgeTsKKyAgICB9IHNhdmVkX3ZpZXc7CisjZW5kaWYKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YTUUgLyogWGlHIFhNRSBmdWxsc2NyZWVuICovCisgICAgWGlHTWlzY1Jlc29sdXRpb25JbmZvIHNhdmVkX3JlczsKKyNlbmRpZgorCisgICAgaW50IHVzZV94aW5lcmFtYTsKKyAgICBpbnQgdXNlX3hyYW5kcjsKKyAgICBpbnQgdXNlX3ZpZG1vZGU7CisgICAgaW50IHVzZV94bWU7CisgICAgaW50IGN1cnJlbnRseV9mdWxsc2NyZWVuOworCisgICAgLyogQXV0b21hdGljIG1vZGUgc3dpdGNoaW5nIHN1cHBvcnQgKGVudGVyaW5nL2xlYXZpbmcgZnVsbHNjcmVlbikgKi8KKyAgICBVaW50MzIgc3dpdGNoX3dhaXRpbmc7CisgICAgVWludDMyIHN3aXRjaF90aW1lOworCisgICAgLyogUHJldmVudCB0b28gbWFueSBYU3luYygpIGNhbGxzICovCisgICAgaW50IGJsaXRfcXVldWVkOworCisgICAgLyogQ29sb3JtYXAgaGFuZGxpbmcgKi8KKyAgICBDb2xvcm1hcCBEaXNwbGF5Q29sb3JtYXA7CS8qIFRoZSBkZWZhdWx0IGRpc3BsYXkgY29sb3JtYXAgKi8KKyAgICBDb2xvcm1hcCBYQ29sb3JNYXA7CQkvKiBUaGUgY3VycmVudCB3aW5kb3cgY29sb3JtYXAgKi8KKyAgICBpbnQgKlhQaXhlbHM7CQkvKiBwaXhlbHMgdmFsdWUgYWxsb2NhdGlvbiBjb3VudHMgKi8KKyAgICBmbG9hdCBnYW1tYV9zYXZlZFszXTsJLyogU2F2ZWQgZ2FtbWEgdmFsdWVzIGZvciBWaWRNb2RlIGdhbW1hICovCisgICAgaW50IGdhbW1hX2NoYW5nZWQ7CQkvKiBmbGFnOiBoYXMgVmlkTW9kZSBnYW1tYSBiZWVuIG1vZGlmaWVkPyAqLworCisgICAgc2hvcnQgKmljb25jb2xvcnM7CQkvKiBMaXN0IG9mIGNvbG9ycyB1c2VkIGJ5IHRoZSBpY29uICovCisKKyAgICAvKiBTY3JlZW5zYXZlciBzZXR0aW5ncyAqLworICAgIGludCBhbGxvd19zY3JlZW5zYXZlcjsKK307CisKK2V4dGVybiBpbnQgWDExX3dtWEFkanVzdDsKK2V4dGVybiBpbnQgWDExX3dtWUFkanVzdDsKKworLyogT2xkIHZhcmlhYmxlIG5hbWVzICovCisjZGVmaW5lIGxvY2FsX1gxMQkJKHRoaXMtPmhpZGRlbi0+bG9jYWxfWDExKQorI2RlZmluZSBTRExfRGlzcGxheQkJKHRoaXMtPmhpZGRlbi0+WDExX0Rpc3BsYXkpCisjZGVmaW5lIEdGWF9EaXNwbGF5CQkodGhpcy0+aGlkZGVuLT5HRlhfRGlzcGxheSkKKyNkZWZpbmUgU0RMX1NjcmVlbgkJRGVmYXVsdFNjcmVlbih0aGlzLT5oaWRkZW4tPlgxMV9EaXNwbGF5KQorI2RlZmluZSBTRExfVmlzdWFsCQkodGhpcy0+aGlkZGVuLT52aXMpCisjZGVmaW5lIFNETF9Sb290CQlSb290V2luZG93KFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKQorI2RlZmluZSBXTXdpbmRvdwkJKHRoaXMtPmhpZGRlbi0+V013aW5kb3cpCisjZGVmaW5lIEZTd2luZG93CQkodGhpcy0+aGlkZGVuLT5GU3dpbmRvdykKKyNkZWZpbmUgU0RMX1dpbmRvdwkJKHRoaXMtPmhpZGRlbi0+U0RMX1dpbmRvdykKKyNkZWZpbmUgV01fREVMRVRFX1dJTkRPVwkodGhpcy0+aGlkZGVuLT5XTV9ERUxFVEVfV0lORE9XKQorI2RlZmluZSBTRExfQmxhbmtDdXJzb3IJCSh0aGlzLT5oaWRkZW4tPkJsYW5rQ3Vyc29yKQorI2RlZmluZSBTRExfSU0JCQkodGhpcy0+aGlkZGVuLT5YMTFfSU0pCisjZGVmaW5lIFNETF9JQwkJCSh0aGlzLT5oaWRkZW4tPlgxMV9JQykKKyNkZWZpbmUgU0RMX3dpbmRvd2lkCQkodGhpcy0+aGlkZGVuLT5TRExfd2luZG93aWQpCisjZGVmaW5lIHVzaW5nX2RnYQkJKHRoaXMtPmhpZGRlbi0+dXNpbmdfZGdhKQorI2RlZmluZSB1c2VfbWl0c2htCQkodGhpcy0+aGlkZGVuLT51c2VfbWl0c2htKQorI2RlZmluZSBzaG1pbmZvCQkJKHRoaXMtPmhpZGRlbi0+c2htaW5mbykKKyNkZWZpbmUgU0RMX1hpbWFnZQkJKHRoaXMtPmhpZGRlbi0+WGltYWdlKQorI2RlZmluZSBTRExfR0MJCQkodGhpcy0+aGlkZGVuLT5nYykKKyNkZWZpbmUgd2luZG93X3cJCSh0aGlzLT5oaWRkZW4tPndpbmRvd193KQorI2RlZmluZSB3aW5kb3dfaAkJKHRoaXMtPmhpZGRlbi0+d2luZG93X2gpCisjZGVmaW5lIG1vdXNlX2xhc3QJCSh0aGlzLT5oaWRkZW4tPm1vdXNlX2xhc3QpCisjZGVmaW5lIG1vdXNlX2FjY2VsCQkodGhpcy0+aGlkZGVuLT5tb3VzZV9hY2NlbCkKKyNkZWZpbmUgbW91c2VfcmVsYXRpdmUJCSh0aGlzLT5oaWRkZW4tPm1vdXNlX3JlbGF0aXZlKQorI2RlZmluZSBTRExfbW9kZWxpc3QJCSh0aGlzLT5oaWRkZW4tPm1vZGVsaXN0KQorI2RlZmluZSB4aW5lcmFtYV9pbmZvCQkodGhpcy0+aGlkZGVuLT54aW5lcmFtYV9pbmZvKQorI2RlZmluZSBzYXZlZF9tb2RlCQkodGhpcy0+aGlkZGVuLT5zYXZlZF9tb2RlKQorI2RlZmluZSBzYXZlZF92aWV3CQkodGhpcy0+aGlkZGVuLT5zYXZlZF92aWV3KQorI2RlZmluZSBzYXZlZF9yZXMJCSh0aGlzLT5oaWRkZW4tPnNhdmVkX3JlcykKKyNkZWZpbmUgc2NyZWVuX2NvbmZpZwkJKHRoaXMtPmhpZGRlbi0+c2NyZWVuX2NvbmZpZykKKyNkZWZpbmUgc2F2ZWRfc2l6ZV9pZAkJKHRoaXMtPmhpZGRlbi0+c2F2ZWRfc2l6ZV9pZCkKKyNkZWZpbmUgc2F2ZWRfcm90YXRpb24JCSh0aGlzLT5oaWRkZW4tPnNhdmVkX3JvdGF0aW9uKQorI2RlZmluZSB1c2VfeGluZXJhbWEJCSh0aGlzLT5oaWRkZW4tPnVzZV94aW5lcmFtYSkKKyNkZWZpbmUgdXNlX3ZpZG1vZGUJCSh0aGlzLT5oaWRkZW4tPnVzZV92aWRtb2RlKQorI2RlZmluZSB1c2VfeHJhbmRyCQkodGhpcy0+aGlkZGVuLT51c2VfeHJhbmRyKQorI2RlZmluZSB1c2VfeG1lCQkJKHRoaXMtPmhpZGRlbi0+dXNlX3htZSkKKyNkZWZpbmUgY3VycmVudGx5X2Z1bGxzY3JlZW4JKHRoaXMtPmhpZGRlbi0+Y3VycmVudGx5X2Z1bGxzY3JlZW4pCisjZGVmaW5lIHN3aXRjaF93YWl0aW5nCQkodGhpcy0+aGlkZGVuLT5zd2l0Y2hfd2FpdGluZykKKyNkZWZpbmUgc3dpdGNoX3RpbWUJCSh0aGlzLT5oaWRkZW4tPnN3aXRjaF90aW1lKQorI2RlZmluZSBibGl0X3F1ZXVlZAkJKHRoaXMtPmhpZGRlbi0+YmxpdF9xdWV1ZWQpCisjZGVmaW5lIFNETF9EaXNwbGF5Q29sb3JtYXAJKHRoaXMtPmhpZGRlbi0+RGlzcGxheUNvbG9ybWFwKQorI2RlZmluZSBTRExfUHJpdmF0ZUNvbG9ybWFwCSh0aGlzLT5oaWRkZW4tPlByaXZhdGVDb2xvcm1hcCkKKyNkZWZpbmUgU0RMX1hDb2xvck1hcAkJKHRoaXMtPmhpZGRlbi0+WENvbG9yTWFwKQorI2RlZmluZSBTRExfWFBpeGVscwkJKHRoaXMtPmhpZGRlbi0+WFBpeGVscykKKyNkZWZpbmUgZ2FtbWFfc2F2ZWQJCSh0aGlzLT5oaWRkZW4tPmdhbW1hX3NhdmVkKQorI2RlZmluZSBnYW1tYV9jaGFuZ2VkCQkodGhpcy0+aGlkZGVuLT5nYW1tYV9jaGFuZ2VkKQorI2RlZmluZSBTRExfaWNvbmNvbG9ycwkJKHRoaXMtPmhpZGRlbi0+aWNvbmNvbG9ycykKKyNkZWZpbmUgYWxsb3dfc2NyZWVuc2F2ZXIJKHRoaXMtPmhpZGRlbi0+YWxsb3dfc2NyZWVuc2F2ZXIpCisKKy8qIFNvbWUgdmVyc2lvbnMgb2YgWEZyZWU4NiBoYXZlIGJ1Z3MgLSBkZXRlY3QgaWYgdGhpcyBpcyBvbmUgb2YgdGhlbSAqLworI2RlZmluZSBCVUdHWV9YRlJFRTg2KGNvbmRpdGlvbiwgYnVnZ3lfdmVyc2lvbikgXAorKChTRExfc3RyY21wKFNlcnZlclZlbmRvcihTRExfRGlzcGxheSksICJUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMiKSA9PSAwKSAmJiBcCisgKFZlbmRvclJlbGVhc2UoU0RMX0Rpc3BsYXkpIGNvbmRpdGlvbiBidWdneV92ZXJzaW9uKSkKKworI2VuZGlmIC8qIF9TRExfeDExdmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMXdtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExd20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQ1OWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMXdtLmMKQEAgLTAsMCArMSw2MjAgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKworI2luY2x1ZGUgIlNETF92ZXJzaW9uLmgiCisjaW5jbHVkZSAiU0RMX3RpbWVyLmgiCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3N5c3dtLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorI2luY2x1ZGUgIlNETF94MTFtb2Rlc19jLmgiCisjaW5jbHVkZSAiU0RMX3gxMXdtX2MuaCIKKworc3RhdGljIFVpbnQ4IHJldmVyc2VfYnl0ZShVaW50OCB4KQoreworCXggPSAoeCAmIDB4YWEpID4+IDEgfCAoeCAmIDB4NTUpIDw8IDE7CisJeCA9ICh4ICYgMHhjYykgPj4gMiB8ICh4ICYgMHgzMykgPDwgMjsKKwl4ID0gKHggJiAweGYwKSA+PiA0IHwgKHggJiAweDBmKSA8PCA0OworCXJldHVybiB4OworfQorCit2b2lkIFgxMV9TZXRJY29uKF9USElTLCBTRExfU3VyZmFjZSAqaWNvbiwgVWludDggKm1hc2spCit7CisJU0RMX1N1cmZhY2UgKnNpY29uOworCVhXTUhpbnRzICp3bWhpbnRzOworCVhJbWFnZSAqaWNvbl9pbWFnZTsKKwlQaXhtYXAgaWNvbl9waXhtYXA7CisJUGl4bWFwIG1hc2tfcGl4bWFwOworCVdpbmRvdyBpY29uX3dpbmRvdyA9IE5vbmU7CisJR0MgZ2M7CisJWEdDVmFsdWVzIEdDdmFsdWVzOworCWludCBpLCBkYnBwOworCVNETF9SZWN0IGJvdW5kczsKKwlVaW50OCAqTFNCbWFzazsKKwlWaXN1YWwgKmR2aXM7CisJY2hhciAqcDsKKwlpbnQgbWFza3NpemU7CisKKwlTRExfTG9ja19FdmVudFRocmVhZCgpOworCisJLyogVGhlIGljb24gbXVzdCB1c2UgdGhlIGRlZmF1bHQgdmlzdWFsLCBkZXB0aCBhbmQgY29sb3JtYXAgb2YgdGhlCisJICAgc2NyZWVuLCBzbyBpdCBtaWdodCBuZWVkIGEgY29udmVyc2lvbiAqLworCWR2aXMgPSBEZWZhdWx0VmlzdWFsKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKKwlkYnBwID0gRGVmYXVsdERlcHRoKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKTsKKwlmb3IoaSA9IDA7IGkgPCB0aGlzLT5oaWRkZW4tPm52aXN1YWxzOyBpKyspIHsKKwkJaWYodGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLnZpc3VhbCA9PSBkdmlzKSB7CisJCQlkYnBwID0gdGhpcy0+aGlkZGVuLT52aXN1YWxzW2ldLmJwcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVGhlIFZpc3VhbCBzdHJ1Y3QgaXMgc3VwcG9zZWQgdG8gYmUgb3BhcXVlIGJ1dCB3ZSBjaGVhdCBhIGxpdHRsZSAqLworCXNpY29uID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwgaWNvbi0+dywgaWNvbi0+aCwKKwkJCQkgICAgIGRicHAsCisJCQkJICAgICBkdmlzLT5yZWRfbWFzaywgZHZpcy0+Z3JlZW5fbWFzaywKKwkJCQkgICAgIGR2aXMtPmJsdWVfbWFzaywgMCk7CisJaWYgKCBzaWNvbiA9PSBOVUxMICkKKwkJZ290byBkb25lOworCisJaWYoZGJwcCA9PSA4KSB7CisJCS8qIERlZmF1bHQgdmlzdWFsIGlzIDhiaXQ7IHdlIG5lZWQgdG8gYWxsb2NhdGUgY29sb3VycyBmcm9tCisJCSAgIHRoZSBkZWZhdWx0IGNvbG9ybWFwICovCisJCVNETF9Db2xvciB3YW50WzI1Nl0sIGdvdFsyNTZdOworCQlpbnQgbndhbnQ7CisJCUNvbG9ybWFwIGRjbWFwOworCQlpbnQgbWlzc2luZzsKKwkJZGNtYXAgPSBEZWZhdWx0Q29sb3JtYXAoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pOworCQlpZihpY29uLT5mb3JtYXQtPnBhbGV0dGUpIHsKKwkJCS8qIFRoZSBpY29uIGhhcyBhIHBhbGV0dGUgYXMgd2VsbCAtIHdlIGp1c3QgaGF2ZSB0bworCQkJICAgZmluZCB0aG9zZSBjb2xvdXJzICovCisJCQlud2FudCA9IGljb24tPmZvcm1hdC0+cGFsZXR0ZS0+bmNvbG9yczsKKwkJCVNETF9tZW1jcHkod2FudCwgaWNvbi0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnMsCisJCQkgICAgICAgbndhbnQgKiBzaXplb2Ygd2FudFswXSk7CisJCX0gZWxzZSB7CisJCQkvKiB0cnkgdGhlIHN0YW5kYXJkIDZ4Nng2IGN1YmUgZm9yIGxhY2sgb2YgYmV0dGVyCisJCQkgICBpZGVhcyAqLworCQkJaW50IHIsIGcsIGIsIGk7CisJCQlmb3IociA9IGkgPSAwOyByIDwgMjU2OyByICs9IDB4MzMpCisJCQkJZm9yKGcgPSAwOyBnIDwgMjU2OyBnICs9IDB4MzMpCisJCQkJCWZvcihiID0gMDsgYiA8IDI1NjsgYiArPSAweDMzLCBpKyspIHsKKwkJCQkJCXdhbnRbaV0uciA9IHI7CisJCQkJCQl3YW50W2ldLmcgPSBnOworCQkJCQkJd2FudFtpXS5iID0gYjsKKwkJCQkJfQorCQkJbndhbnQgPSAyMTY7CisJCX0KKwkJaWYoU0RMX2ljb25jb2xvcnMpIHsKKwkJCS8qIGZyZWUgYWxyZWFkeSBhbGxvY2F0ZWQgY29sb3VycyBmaXJzdCAqLworCQkJdW5zaWduZWQgbG9uZyBmcmVlbGlzdFs1MTJdOworCQkJaW50IG5mcmVlID0gMDsKKwkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQkJd2hpbGUoU0RMX2ljb25jb2xvcnNbaV0pIHsKKwkJCQkJZnJlZWxpc3RbbmZyZWUrK10gPSBpOworCQkJCQlTRExfaWNvbmNvbG9yc1tpXS0tOworCQkJCX0KKwkJCX0KKwkJCVhGcmVlQ29sb3JzKEdGWF9EaXNwbGF5LCBkY21hcCwgZnJlZWxpc3QsIG5mcmVlLCAwKTsKKwkJfQorCQlpZighU0RMX2ljb25jb2xvcnMpCisJCQlTRExfaWNvbmNvbG9ycyA9IFNETF9tYWxsb2MoMjU2ICogc2l6ZW9mICpTRExfaWNvbmNvbG9ycyk7CisJCVNETF9tZW1zZXQoU0RMX2ljb25jb2xvcnMsIDAsIDI1NiAqIHNpemVvZiAqU0RMX2ljb25jb2xvcnMpOworCisJCS8qIHRyeSB0byBhbGxvY2F0ZSB0aGUgY29sb3VycyAqLworCQlTRExfbWVtc2V0KGdvdCwgMCwgc2l6ZW9mIGdvdCk7CisJCW1pc3NpbmcgPSAwOworCQlmb3IoaSA9IDA7IGkgPCBud2FudDsgaSsrKSB7CisJCQlYQ29sb3IgYzsKKwkJCWMucmVkID0gd2FudFtpXS5yIDw8IDg7CisJCQljLmdyZWVuID0gd2FudFtpXS5nIDw8IDg7CisJCQljLmJsdWUgPSB3YW50W2ldLmIgPDwgODsKKwkJCWMuZmxhZ3MgPSBEb1JlZCB8IERvR3JlZW4gfCBEb0JsdWU7CisJCQlpZihYQWxsb2NDb2xvcihHRlhfRGlzcGxheSwgZGNtYXAsICZjKSkgeworCQkJCS8qIGdvdCB0aGUgY29sb3VyICovCisJCQkJU0RMX2ljb25jb2xvcnNbYy5waXhlbF0rKzsKKwkJCQlnb3RbYy5waXhlbF0gPSB3YW50W2ldOworCQkJfSBlbHNlIHsKKwkJCQltaXNzaW5nID0gMTsKKwkJCX0KKwkJfQorCQlpZihtaXNzaW5nKSB7CisJCQkvKiBTb21lIGNvbG91cnMgd2VyZSBhcHBhcmVudGx5IG1pc3NpbmcsIHNvIHdlIGp1c3QKKwkJCSAgIGFsbG9jYXRlIGFsbCB0aGUgcmVzdCBhcyB3ZWxsICovCisJCQlYQ29sb3IgY29sc1syNTZdOworCQkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQkJY29sc1tpXS5waXhlbCA9IGk7CisJCQlYUXVlcnlDb2xvcnMoR0ZYX0Rpc3BsYXksIGRjbWFwLCBjb2xzLCAyNTYpOworCQkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCQlnb3RbaV0uciA9IGNvbHNbaV0ucmVkID4+IDg7CisJCQkJZ290W2ldLmcgPSBjb2xzW2ldLmdyZWVuID4+IDg7CisJCQkJZ290W2ldLmIgPSBjb2xzW2ldLmJsdWUgPj4gODsKKwkJCQlpZighU0RMX2ljb25jb2xvcnNbaV0pIHsKKwkJCQkJaWYoWEFsbG9jQ29sb3IoR0ZYX0Rpc3BsYXksIGRjbWFwLAorCQkJCQkJCWNvbHMgKyBpKSkgeworCQkJCQkJU0RMX2ljb25jb2xvcnNbaV0gPSAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogaW5kZXggbm90IGF2YWlsYWJsZSAqLworCQkJCQkJZ290W2ldLnIgPSAwOworCQkJCQkJZ290W2ldLmcgPSAwOworCQkJCQkJZ290W2ldLmIgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJU0RMX1NldENvbG9ycyhzaWNvbiwgZ290LCAwLCAyNTYpOworCX0KKworCWJvdW5kcy54ID0gMDsKKwlib3VuZHMueSA9IDA7CisJYm91bmRzLncgPSBpY29uLT53OworCWJvdW5kcy5oID0gaWNvbi0+aDsKKwlpZiAoIFNETF9Mb3dlckJsaXQoaWNvbiwgJmJvdW5kcywgc2ljb24sICZib3VuZHMpIDwgMCApCisJCWdvdG8gZG9uZTsKKworCS8qIFdlIG5lZWQgdGhlIG1hc2sgYXMgZ2l2ZW4sIGV4Y2VwdCBpbiBMU0JmaXJzdCBmb3JtYXQgaW5zdGVhZCBvZgorCSAgIE1TQmZpcnN0LiBSZXZlcnNlIHRoZSBiaXRzIGluIGVhY2ggYnl0ZS4gKi8KKwltYXNrc2l6ZSA9ICgoc2ljb24tPncgKyA3KSA+PiAzKSAqIHNpY29uLT5oOworCUxTQm1hc2sgPSBTRExfbWFsbG9jKG1hc2tzaXplKTsKKwlpZiAoIExTQm1hc2sgPT0gTlVMTCApIHsKKwkJZ290byBkb25lOworCX0KKwlTRExfbWVtc2V0KExTQm1hc2ssIDAsIG1hc2tzaXplKTsKKwlmb3IoaSA9IDA7IGkgPCBtYXNrc2l6ZTsgaSsrKQorCQlMU0JtYXNrW2ldID0gcmV2ZXJzZV9ieXRlKG1hc2tbaV0pOworCW1hc2tfcGl4bWFwID0gWENyZWF0ZVBpeG1hcEZyb21CaXRtYXBEYXRhKFNETF9EaXNwbGF5LCBXTXdpbmRvdywKKwkJCQkJCSAgKGNoYXIgKilMU0JtYXNrLAorCQkJCQkJICBzaWNvbi0+dywgc2ljb24tPmgsCisJCQkJCQkgIDFMLCAwTCwgMSk7CisKKwkvKiBUcmFuc2ZlciB0aGUgaW1hZ2UgdG8gYW4gWDExIHBpeG1hcCAqLworCWljb25faW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoU0RMX0Rpc3BsYXksCisJCQkJICBEZWZhdWx0VmlzdWFsKFNETF9EaXNwbGF5LCBTRExfU2NyZWVuKSwKKwkJCQkgIERlZmF1bHREZXB0aChTRExfRGlzcGxheSwgU0RMX1NjcmVlbiksCisJCQkJICBaUGl4bWFwLCAwLCBzaWNvbi0+cGl4ZWxzLAorCQkJCSAgc2ljb24tPncsIHNpY29uLT5oLAorCQkJCSAgMzIsIDApOworCWljb25faW1hZ2UtPmJ5dGVfb3JkZXIgPSAoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikKKwkJICAgICAgICAgICAgICAgICA/IE1TQkZpcnN0IDogTFNCRmlyc3Q7CisJaWNvbl9waXhtYXAgPSBYQ3JlYXRlUGl4bWFwKFNETF9EaXNwbGF5LCBTRExfUm9vdCwgc2ljb24tPncsIHNpY29uLT5oLAorCQkJCSAgICBEZWZhdWx0RGVwdGgoU0RMX0Rpc3BsYXksIFNETF9TY3JlZW4pKTsKKwlnYyA9IFhDcmVhdGVHQyhTRExfRGlzcGxheSwgaWNvbl9waXhtYXAsIDAsICZHQ3ZhbHVlcyk7CisJWFB1dEltYWdlKFNETF9EaXNwbGF5LCBpY29uX3BpeG1hcCwgZ2MsIGljb25faW1hZ2UsCisJCSAgMCwgMCwgMCwgMCwgc2ljb24tPncsIHNpY29uLT5oKTsKKwlYRnJlZUdDKFNETF9EaXNwbGF5LCBnYyk7CisJWERlc3Ryb3lJbWFnZShpY29uX2ltYWdlKTsKKwlTRExfZnJlZShMU0JtYXNrKTsKKwlzaWNvbi0+cGl4ZWxzID0gTlVMTDsKKworCS8qIFNvbWUgYnVnZ3kgd2luZG93IG1hbmFnZXJzIChzb21lIHZlcnNpb25zIG9mIEVubGlnaHRlbm1lbnQsIGl0CisJICAgc2VlbXMpIG5lZWQgYW4gaWNvbiB3aW5kb3cgKmFuZCogaWNvbiBwaXhtYXAgdG8gd29yayBwcm9wZXJseSwgd2hpbGUKKwkgICBpdCBzY3Jld3MgdXAgb3RoZXJzLiBUaGUgZGVmYXVsdCBpcyBvbmx5IHRvIHVzZSBhIHBpeG1hcC4gKi8KKwlwID0gU0RMX2dldGVudigiU0RMX1ZJREVPX1gxMV9JQ09OV0lOIik7CisJaWYocCAmJiAqcCkgeworCQlpY29uX3dpbmRvdyA9IFhDcmVhdGVTaW1wbGVXaW5kb3coU0RMX0Rpc3BsYXksIFNETF9Sb290LAorCQkJCQkJICAwLCAwLCBzaWNvbi0+dywgc2ljb24tPmgsIDAsCisJCQkJCQkgIENvcHlGcm9tUGFyZW50LAorCQkJCQkJICBDb3B5RnJvbVBhcmVudCk7CisJCVhTZXRXaW5kb3dCYWNrZ3JvdW5kUGl4bWFwKFNETF9EaXNwbGF5LCBpY29uX3dpbmRvdywKKwkJCQkJICAgaWNvbl9waXhtYXApOworCQlYQ2xlYXJXaW5kb3coU0RMX0Rpc3BsYXksIGljb25fd2luZG93KTsKKwl9CisKKwkvKiBTZXQgdGhlIHdpbmRvdyBpY29uIHRvIHRoZSBpY29uIHBpeG1hcCAoYW5kIGljb24gd2luZG93KSAqLworCXdtaGludHMgPSBYQWxsb2NXTUhpbnRzKCk7CisJd21oaW50cy0+ZmxhZ3MgPSAoSWNvblBpeG1hcEhpbnQgfCBJY29uTWFza0hpbnQgfCBJbnB1dEhpbnQpOworCXdtaGludHMtPmljb25fcGl4bWFwID0gaWNvbl9waXhtYXA7CisJd21oaW50cy0+aWNvbl9tYXNrID0gbWFza19waXhtYXA7CisJd21oaW50cy0+aW5wdXQgPSBUcnVlOworCWlmKGljb25fd2luZG93ICE9IE5vbmUpIHsKKwkJd21oaW50cy0+ZmxhZ3MgfD0gSWNvbldpbmRvd0hpbnQ7CisJCXdtaGludHMtPmljb25fd2luZG93ID0gaWNvbl93aW5kb3c7CisJfQorCVhTZXRXTUhpbnRzKFNETF9EaXNwbGF5LCBXTXdpbmRvdywgd21oaW50cyk7CisJWEZyZWUod21oaW50cyk7CisJWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKworICBkb25lOgorCVNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKKwlTRExfRnJlZVN1cmZhY2Uoc2ljb24pOworfQorCit2b2lkIFgxMV9TZXRDYXB0aW9uTm9Mb2NrKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKK3sKKwlYVGV4dFByb3BlcnR5IHRpdGxlcHJvcCwgaWNvbnByb3A7CisJU3RhdHVzIHN0YXR1czsKKworI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworCUF0b20gX05FVF9XTV9OQU1FID0gMDsKKwlBdG9tIF9ORVRfV01fSUNPTl9OQU1FID0gMDsKKworCS8qIExvb2sgdXAgc29tZSB1c2VmdWwgQXRvbXMgKi8KKwlpZiAoU0RMX1gxMV9IQVZFX1VURjgpIHsKKwkJX05FVF9XTV9OQU1FID0gWEludGVybkF0b20oU0RMX0Rpc3BsYXksICJfTkVUX1dNX05BTUUiLCBGYWxzZSk7CisJCV9ORVRfV01fSUNPTl9OQU1FID0gWEludGVybkF0b20oU0RMX0Rpc3BsYXksICJfTkVUX1dNX0lDT05fTkFNRSIsIEZhbHNlKTsKKwl9CisjZW5kaWYKKworCWlmICggdGl0bGUgIT0gTlVMTCApIHsKKwkJY2hhciAqdGl0bGVfbG9jYWxlID0gU0RMX2ljb252X3V0ZjhfbG9jYWxlKHRpdGxlKTsKKwkJaWYgKCAhdGl0bGVfbG9jYWxlICkgeworCQkJU0RMX091dE9mTWVtb3J5KCk7CisJCQlyZXR1cm47CisJCX0KKwkJc3RhdHVzID0gWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmdGl0bGVfbG9jYWxlLCAxLCAmdGl0bGVwcm9wKTsKKwkJU0RMX2ZyZWUodGl0bGVfbG9jYWxlKTsKKwkJaWYgKCBzdGF0dXMgKSB7CisJCQlYU2V0VGV4dFByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgJnRpdGxlcHJvcCwgWEFfV01fTkFNRSk7CisJCQlYRnJlZSh0aXRsZXByb3AudmFsdWUpOworCQl9CisjaWZkZWYgWF9IQVZFX1VURjhfU1RSSU5HCisJCWlmIChTRExfWDExX0hBVkVfVVRGOCkgeworCQkJc3RhdHVzID0gWHV0ZjhUZXh0TGlzdFRvVGV4dFByb3BlcnR5KFNETF9EaXNwbGF5LAorCQkJCQkoY2hhciAqKikmdGl0bGUsIDEsIFhVVEY4U3RyaW5nU3R5bGUsICZ0aXRsZXByb3ApOworCQkJaWYgKCBzdGF0dXMgPT0gU3VjY2VzcyApIHsKKwkJCQlYU2V0VGV4dFByb3BlcnR5KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgJnRpdGxlcHJvcCwgX05FVF9XTV9OQU1FKTsKKwkJCQlYRnJlZSh0aXRsZXByb3AudmFsdWUpOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisJaWYgKCBpY29uICE9IE5VTEwgKSB7CisJCWNoYXIgKmljb25fbG9jYWxlID0gU0RMX2ljb252X3V0ZjhfbG9jYWxlKGljb24pOworCQlpZiAoICFpY29uX2xvY2FsZSApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuOworCQl9CisJCXN0YXR1cyA9IFhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJmljb25fbG9jYWxlLCAxLCAmaWNvbnByb3ApOworCQlTRExfZnJlZShpY29uX2xvY2FsZSk7CisJCWlmICggc3RhdHVzICkgeworCQkJWFNldFRleHRQcm9wZXJ0eShTRExfRGlzcGxheSwgV013aW5kb3csICZpY29ucHJvcCwgWEFfV01fSUNPTl9OQU1FKTsKKwkJCVhGcmVlKGljb25wcm9wLnZhbHVlKTsKKwkJfQorI2lmZGVmIFhfSEFWRV9VVEY4X1NUUklORworCQlpZiAoU0RMX1gxMV9IQVZFX1VURjgpIHsKKwkJCXN0YXR1cyA9IFh1dGY4VGV4dExpc3RUb1RleHRQcm9wZXJ0eShTRExfRGlzcGxheSwKKwkJCQkJKGNoYXIgKiopJmljb24sIDEsIFhVVEY4U3RyaW5nU3R5bGUsICZpY29ucHJvcCk7CisJCQlpZiAoIHN0YXR1cyA9PSBTdWNjZXNzICkgeworCQkJCVhTZXRUZXh0UHJvcGVydHkoU0RMX0Rpc3BsYXksIFdNd2luZG93LCAmaWNvbnByb3AsIF9ORVRfV01fSUNPTl9OQU1FKTsKKwkJCQlYRnJlZShpY29ucHJvcC52YWx1ZSk7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKwlYU3luYyhTRExfRGlzcGxheSwgRmFsc2UpOworfQorCit2b2lkIFgxMV9TZXRDYXB0aW9uKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbikKK3sKKwlTRExfTG9ja19FdmVudFRocmVhZCgpOworCVgxMV9TZXRDYXB0aW9uTm9Mb2NrKHRoaXMsIHRpdGxlLCBpY29uKTsKKwlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Cit9CisKKy8qIEljb25pZnkgdGhlIHdpbmRvdyAqLworaW50IFgxMV9JY29uaWZ5V2luZG93KF9USElTKQoreworCWludCByZXN1bHQ7CisKKwlTRExfTG9ja19FdmVudFRocmVhZCgpOworCXJlc3VsdCA9IFhJY29uaWZ5V2luZG93KFNETF9EaXNwbGF5LCBXTXdpbmRvdywgU0RMX1NjcmVlbik7CisJWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKwlTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7CisJcmV0dXJuKHJlc3VsdCk7Cit9CisKKyNpZiAwCisjZGVmaW5lICBEKC4uLikgIHByaW50ZihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIEUoLi4uKSAgRChfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lICBEKC4uLikgICgodm9pZCkwKQorI2RlZmluZSAgRSguLi4pICAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCAgc2V0X3dpbmRvd19wb3Nfbm9sb2NrKF9USElTLCBpbnQgeCwgaW50IHkpCit7CisgICAgaW50ICAgICAgICAgIHhOZXcsIHlOZXc7CisgICAgV2luZG93ICAgICAgIGNoaWxkOworICAgIGludCAgICAgICAgICB4QWRqdXN0ID0gWDExX3dtWEFkanVzdDsKKyAgICBpbnQgICAgICAgICAgeUFkanVzdCA9IFgxMV93bVlBZGp1c3Q7CisKKyAgICAvKiBkb24ndCBkbyBhbnl0aGluZyBpbiBmdWxsLXNjcmVlbiBtb2RlLCBiZWNhdXNlIHRoZSBGU3dpbmRvdyBpcyB1c2VkCisgICAgICogaW5zdGVhZCBvZiB0aGUgV013aW5kb3csIHdoaWNoIHdpbGwgbWFrZSB0aGUgYWRqdXN0bWVudCBnbyB3aWxkCisgICAgICovCisgICAgaWYgKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogdGhpcyBjb2RlIGlzIHRyaWNreSBiZWNhdXNlIHNvbWUgd2luZG93IG1hbmFnZXJzLCBidXQgbm90IGFsbCwKKyAgICAgKiB3aWxsIHRyYW5zbGF0ZSB0aGUgZmluYWwgd2luZG93IHBvc2l0aW9uIGJ5IGEgZ2l2ZW4gb2Zmc2V0CisgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgZnJhbWUgZGVjb3JhdGlvbi4KKyAgICAgKgorICAgICAqIHNvIHdlIGZpcnN0IHRyeSB0byBtb3ZlIHRoZSB3aW5kb3csIGdldCB0aGUgcG9zaXRpb24gdGhhdCB0aGUKKyAgICAgKiB3aW5kb3cgbWFuYWdlciBoYXMgc2V0LCBhbmQgaWYgdGhleSBhcmUgZGlmZmVyZW50LCByZS1wb3NpdGlvbiB0aGUKKyAgICAgKiB3aW5kb3cgYWdhaW4gd2l0aCBhbiBhZGp1c3RtZW50LgorICAgICAqCisgICAgICogdGhpcyBjYXVzZXMgYSBzbGlnaHQgZmxpY2tlciBzaW5jZSB0aGUgd2luZG93ICdqdW1wcycgdmVyeQorICAgICAqIHF1aWNrbHkgZnJvbSBvbmUgcG9zaXRpb24gdG8gdGhlIG90aGVyLgorICAgICAqLworCisgICAgRCgiJXM6IG1vdmUgdG8gWyVkLCVkXSBhZGp1c3RlZCB0byBbJWQsJWRdXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICB4LCB5LCB4K3hBZGp1c3QsIHkreUFkanVzdCk7CisgICAgWE1vdmVXaW5kb3coU0RMX0Rpc3BsYXksIFdNd2luZG93LCB4ICsgeEFkanVzdCwgeSArIHlBZGp1c3QpOworICAgIFhTeW5jKFNETF9EaXNwbGF5LCBUcnVlKTsKKyAgICBYVHJhbnNsYXRlQ29vcmRpbmF0ZXMoIFNETF9EaXNwbGF5LCBXTXdpbmRvdywgU0RMX1Jvb3QsIDAsIDAsICZ4TmV3LCAmeU5ldywgJmNoaWxkICk7CisgICAgaWYgKHhOZXcgIT0geCB8fCB5TmV3ICE9IHkpIHsKKyAgICAgICAgWDExX3dtWEFkanVzdCA9IHhBZGp1c3QgPSB4IC0geE5ldzsKKyAgICAgICAgWDExX3dtWUFkanVzdCA9IHlBZGp1c3QgPSB5IC0geU5ldzsKKyAgICAgICAgRCgiJXM6IHJlYWQgcG9zIFslZCwlZF0sIHJlY29tcHV0aW5nIGFkanVzdD1bJWQsJWRdIG1vdmluZyB0byBbJWQsJWRdXG4iLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgeE5ldywgeU5ldywgeEFkanVzdCwgeUFkanVzdCwgeCt4QWRqdXN0LCB5K3lBZGp1c3QpOworICAgICAgICBYTW92ZVdpbmRvdyhTRExfRGlzcGxheSwgV013aW5kb3csIHggKyB4QWRqdXN0LCB5ICsgeUFkanVzdCApOworICAgIH0KKyAgICBYU3luYyhTRExfRGlzcGxheSwgRmFsc2UpOworfQorCisvKiBTZXQgd2luZG93IHBvc2l0aW9uICovCit2b2lkICBYMTFfU2V0V2luZG93UG9zKF9USElTLCBpbnQgIHgsIGludCAgeSkKK3sKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOworICAgIHNldF93aW5kb3dfcG9zX25vbG9jayh0aGlzLCB4LCB5KTsKKyAgICBTRExfVW5sb2NrX0V2ZW50VGhyZWFkKCk7Cit9CisKKy8qIEdldCB3aW5kb3cgcG9zaXRpb24gKi8KK3ZvaWQgIFgxMV9HZXRXaW5kb3dQb3MoX1RISVMsIGludCAgKnB4LCBpbnQgICpweSkKK3sKKyAgICAvKiBpbiBmdWxsLXNjcmVlbiBtb2RlLCB5b3UgY2FuJ3QgbW92ZSB0aGUgd2luZG93ICovCisgICAgaWYgKHRoaXMtPnNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgeworICAgICAgICAqcHggPSAqcHkgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICBTRExfTG9ja19FdmVudFRocmVhZCgpOworICAgIHsKKyAgICAgICAgV2luZG93ICBjaGlsZDsKKworICAgICAgICBYVHJhbnNsYXRlQ29vcmRpbmF0ZXMoIFNETF9EaXNwbGF5LCBXTXdpbmRvdywgU0RMX1Jvb3QsIDAsIDAsIHB4LCBweSwgJmNoaWxkICk7CisgICAgfQorICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKK30KKworc3RhdGljIGludAoraXNfd2luZG93X3Zpc2libGUoX1RISVMsIGludCAgc2NyZWVuX3gsIGludCAgc2NyZWVuX3ksIGludCAgc2NyZWVuX3csIGludCAgc2NyZWVuX2ggKQoreworICAgIFhXaW5kb3dBdHRyaWJ1dGVzICAgYXR0cjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHgsIHk7CisgICAgV2luZG93ICAgICAgICAgICAgICBjaGlsZDsKKworICAgIFhHZXRXaW5kb3dBdHRyaWJ1dGVzKCBTRExfRGlzcGxheSwgV013aW5kb3csICZhdHRyICk7CisgICAgWFRyYW5zbGF0ZUNvb3JkaW5hdGVzKCBTRExfRGlzcGxheSwgV013aW5kb3csIFNETF9Sb290LCAwLCAwLCAmeCwgJnksICZjaGlsZCApOworCisgICAgcmV0dXJuICggeCA+PSBzY3JlZW5feCAmJiB4ICsgYXR0ci53aWR0aCAgPD0gc2NyZWVuX3ggKyBzY3JlZW5fdyAgJiYKKyAgICAgICAgICAgICB5ID49IHNjcmVlbl95ICYmIHkgKyBhdHRyLmhlaWdodCA8PSBzY3JlZW5feSArIHNjcmVlbl9oICk7Cit9CisKK2ludCAgWDExX0lzV2luZG93VmlzaWJsZShfVEhJUywgaW50ICByZWNlbnRlcikKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgWFdpbmRvd0F0dHJpYnV0ZXMgICBhdHRyOworICAgIGludCAgICAgICAgICAgICAgICAgc2NyZWVuX3csIHNjcmVlbl9oOworCisgICAgU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKKyAgICBYR2V0V2luZG93QXR0cmlidXRlcyggU0RMX0Rpc3BsYXksIFNETF9Sb290LCAmYXR0ciApOworICAgIHNjcmVlbl93ID0gYXR0ci53aWR0aDsKKyAgICBzY3JlZW5faCA9IGF0dHIuaGVpZ2h0OworCisjaWYgU0RMX1ZJREVPX0RSSVZFUl9YMTFfWElORVJBTUEKKyAgICBpZiAodXNlX3hpbmVyYW1hKSB7CisgICAgICAgIFNETF9OQU1FKFhpbmVyYW1hU2NyZWVuSW5mbykgKnhpbmVyYW1hOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzY3JlZW5zOworCisgICAgICAgIHhpbmVyYW1hID0gU0RMX05BTUUoWGluZXJhbWFRdWVyeVNjcmVlbnMpKFNETF9EaXNwbGF5LCAmc2NyZWVucyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzY3JlZW5zOyBpKyspIHsKKyAgICAgICAgICAgIGlmICggaXNfd2luZG93X3Zpc2libGUoIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aW5lcmFtYVtpXS54X29yZywgeGluZXJhbWFbaV0ueV9vcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aW5lcmFtYVtpXS53aWR0aCwgeGluZXJhbWFbaV0uaGVpZ2h0ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFyZXN1bHQgJiYgcmVjZW50ZXIgKSB7CisgICAgICAgICAgICBzZXRfd2luZG93X3Bvc19ub2xvY2sodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpbmVyYW1hWzBdLnhfb3JnICsgKHhpbmVyYW1hWzBdLndpZHRoICAtIHRoaXMtPnNjcmVlbi0+dykvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpbmVyYW1hWzBdLnlfb3JnICsgKHhpbmVyYW1hWzBdLmhlaWdodCAtIHRoaXMtPnNjcmVlbi0+aCkvMiApOworICAgICAgICB9CisgICAgICAgIFhGcmVlKHhpbmVyYW1hKTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKyNlbmRpZgorICAgIGlmICggaXNfd2luZG93X3Zpc2libGUoIHRoaXMsIDAsIDAsIHNjcmVlbl93LCBzY3JlZW5faCApICkgeworICAgICAgICByZXN1bHQgPSAxOworICAgIH0KKworICAgIGlmICggIXJlc3VsdCAmJiByZWNlbnRlciApIHsKKyAgICAgICAgc2V0X3dpbmRvd19wb3Nfbm9sb2NrKCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoc2NyZWVuX3cgLSB0aGlzLT5zY3JlZW4tPncpLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzY3JlZW5faCAtIHRoaXMtPnNjcmVlbi0+aCkvMiApOworICAgIH0KKyNpZmRlZiBTRExfVklERU9fRFJJVkVSX1gxMV9YSU5FUkFNQQorRXhpdDoKKyNlbmRpZgorICAgIFNETF9VbmxvY2tfRXZlbnRUaHJlYWQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTRExfR3JhYk1vZGUgWDExX0dyYWJJbnB1dE5vTG9jayhfVEhJUywgU0RMX0dyYWJNb2RlIG1vZGUpCit7CisJaW50IHJlc3VsdDsKKworCWlmICggdGhpcy0+c2NyZWVuID09IE5VTEwgfHwgU0RMX0Rpc3BsYXkgPT0gTlVMTCApIHsKKwkJcmV0dXJuKFNETF9HUkFCX09GRik7CisJfQorCWlmICggISBTRExfV2luZG93ICkgeworCQlyZXR1cm4obW9kZSk7CS8qIFdpbGwgYmUgc2V0IGxhdGVyIG9uIG1vZGUgc3dpdGNoICovCisJfQorCWlmICggbW9kZSA9PSBTRExfR1JBQl9PRkYgKSB7CisJCVhVbmdyYWJQb2ludGVyKFNETF9EaXNwbGF5LCBDdXJyZW50VGltZSk7CisJCVhVbmdyYWJLZXlib2FyZChTRExfRGlzcGxheSwgQ3VycmVudFRpbWUpOworCX0gZWxzZSB7CisJCWlmICggdGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOICkgeworCQkJLyogVW5iaW5kIHRoZSBtb3VzZSBmcm9tIHRoZSBmdWxsc2NyZWVuIHdpbmRvdyAqLworCQkJWFVuZ3JhYlBvaW50ZXIoU0RMX0Rpc3BsYXksIEN1cnJlbnRUaW1lKTsKKwkJfQorCQkvKiBUcnkgdG8gZ3JhYiB0aGUgbW91c2UgKi8KKyNpZiAwIC8qIFdlJ2xsIHdhaXQgaGVyZSB1bnRpbCB3ZSBhY3R1YWxseSBncmFiLCBvdGhlcndpc2UgYmVoYXZpb3IgdW5kZWZpbmVkICovCisJCWZvciAoIG51bXRyaWVzID0gMDsgbnVtdHJpZXMgPCAxMDsgKytudW10cmllcyApIHsKKyNlbHNlCisJCWZvciAoIDsgOyApIHsKKyNlbmRpZgorCQkJcmVzdWx0ID0gWEdyYWJQb2ludGVyKFNETF9EaXNwbGF5LCBTRExfV2luZG93LCBUcnVlLCAwLAorCQkJCQkJR3JhYk1vZGVBc3luYywgR3JhYk1vZGVBc3luYywKKwkJCQkJCVNETF9XaW5kb3csIE5vbmUsIEN1cnJlbnRUaW1lKTsKKwkJCWlmICggcmVzdWx0ID09IEdyYWJTdWNjZXNzICkgeworCQkJCWJyZWFrOworCQkJfQorCQkJU0RMX0RlbGF5KDEwMCk7CisJCX0KKwkJaWYgKCByZXN1bHQgIT0gR3JhYlN1Y2Nlc3MgKSB7CisJCQkvKiBVaCwgb2gsIHdoYXQgZG8gd2UgZG8gaGVyZT8gKi8gOworCQl9CisJCS8qIE5vdyBncmFiIHRoZSBrZXlib2FyZCAqLworCQlYR3JhYktleWJvYXJkKFNETF9EaXNwbGF5LCBXTXdpbmRvdywgVHJ1ZSwKKwkJCQlHcmFiTW9kZUFzeW5jLCBHcmFiTW9kZUFzeW5jLCBDdXJyZW50VGltZSk7CisKKwkJLyogUmFpc2UgdGhlIHdpbmRvdyBpZiB3ZSBncmFiIHRoZSBtb3VzZSAqLworCQlpZiAoICEodGhpcy0+c2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOKSApCisJCQlYUmFpc2VXaW5kb3coU0RMX0Rpc3BsYXksIFdNd2luZG93KTsKKworCQkvKiBNYWtlIHN1cmUgd2UgcmVnaXN0ZXIgaW5wdXQgZm9jdXMgKi8KKwkJU0RMX1ByaXZhdGVBcHBBY3RpdmUoMSwgU0RMX0FQUElOUFVURk9DVVMpOworCQkvKiBTaW5jZSB3ZSBncmFiYmVkIHRoZSBwb2ludGVyLCB3ZSBoYXZlIG1vdXNlIGZvY3VzLCB0b28uICovCisJCVNETF9Qcml2YXRlQXBwQWN0aXZlKDEsIFNETF9BUFBNT1VTRUZPQ1VTKTsKKwl9CisJWFN5bmMoU0RMX0Rpc3BsYXksIEZhbHNlKTsKKworCXJldHVybihtb2RlKTsKK30KKworU0RMX0dyYWJNb2RlIFgxMV9HcmFiSW5wdXQoX1RISVMsIFNETF9HcmFiTW9kZSBtb2RlKQoreworCVNETF9Mb2NrX0V2ZW50VGhyZWFkKCk7CisJbW9kZSA9IFgxMV9HcmFiSW5wdXROb0xvY2sodGhpcywgbW9kZSk7CisJU0RMX1VubG9ja19FdmVudFRocmVhZCgpOworCisJcmV0dXJuKG1vZGUpOworfQorCisjZGVmaW5lICBNTV9QRVJfSU5DSCAgMjUuNAorCitpbnQKK1gxMV9HZXRNb25pdG9yRFBJKF9USElTLCBpbnQgICpweF9kcGksIGludCAqcHlfZHBpKQoreworICAgIERpc3BsYXkqICAgICAgZGlzcGxheSA9IFNETF9EaXNwbGF5OworICAgIGludCAgICAgICAgICAgc2NyZWVuICA9IFhEZWZhdWx0U2NyZWVuKGRpc3BsYXkpOworICAgIGludCAgICAgICAgICAgeGRwaSwgeWRwaTsKKworICAgIGludCAgd2lkdGggICAgID0gWERpc3BsYXlXaWR0aChkaXNwbGF5LCBzY3JlZW4pOworICAgIGludCAgd2lkdGhfbW0gID0gWERpc3BsYXlXaWR0aE1NKGRpc3BsYXksIHNjcmVlbik7CisgICAgaW50ICBoZWlnaHQgICAgPSBYRGlzcGxheUhlaWdodChkaXNwbGF5LCBzY3JlZW4pOworICAgIGludCAgaGVpZ2h0X21tID0gWERpc3BsYXlIZWlnaHRNTShkaXNwbGF5LCBzY3JlZW4pOworCisgICAgaWYgKHdpZHRoX21tIDw9IDAgfHwgaGVpZ2h0X21tIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHhkcGkgPSAoaW50KSh3aWR0aCAgKiBNTV9QRVJfSU5DSCAvIHdpZHRoX21tICsgMC41KTsKKyAgICB5ZHBpID0gKGludCkoaGVpZ2h0ICogTU1fUEVSX0lOQ0ggLyBoZWlnaHRfbW0gKyAwLjUpOworCisgICAgaWYgKHhkcGkgPCAyMCB8fCB4ZHBpID4gNDAwIHx8IHlkcGkgPCAyMCB8fCB5ZHBpID4gNDAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAqcHhfZHBpID0geGRwaTsKKyAgICAqcHlfZHBpID0geWRwaTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK1gxMV9HZXRNb25pdG9yUmVjdChfVEhJUywgU0RMX1JlY3QgKnJlY3QpCit7CisgICAgRGlzcGxheSogIGRpc3BsYXkgPSBTRExfRGlzcGxheTsKKyAgICBpbnQgICAgICAgc2NyZWVuICA9IFhEZWZhdWx0U2NyZWVuKGRpc3BsYXkpOworCisgICAgcmVjdC0+eCA9IDA7CisgICAgcmVjdC0+eSA9IDA7CisgICAgcmVjdC0+dyA9IFhEaXNwbGF5V2lkdGgoZGlzcGxheSwgc2NyZWVuKTsKKyAgICByZWN0LT5oID0gWERpc3BsYXlIZWlnaHQoZGlzcGxheSwgc2NyZWVuKTsKKworICAgIHJldHVybiAwOworfQorCisvKiBJZiAnaW5mbycgaXMgdGhlIHJpZ2h0IHZlcnNpb24sIHRoaXMgZnVuY3Rpb24gZmlsbHMgaXQgYW5kIHJldHVybnMgMS4KKyAgIE90aGVyd2lzZSwgaW4gY2FzZSBvZiBhIHZlcnNpb24gbWlzbWF0Y2gsIGl0IHJldHVybnMgLTEuCisqLworc3RhdGljIHZvaWQgbG9ja19kaXNwbGF5KHZvaWQpCit7CisJU0RMX0xvY2tfRXZlbnRUaHJlYWQoKTsKK30KK3N0YXRpYyB2b2lkIHVubG9ja19kaXNwbGF5KHZvaWQpCit7CisJLyogTWFrZSBzdXJlIGFueSBYMTEgdHJhbnNhY3Rpb25zIGFyZSBjb21wbGV0ZWQgKi8KKwlTRExfVmlkZW9EZXZpY2UgKnRoaXMgPSBjdXJyZW50X3ZpZGVvOworCVhTeW5jKFNETF9EaXNwbGF5LCBGYWxzZSk7CisJU0RMX1VubG9ja19FdmVudFRocmVhZCgpOworfQorCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBYMTFfR2V0V01JbmZvKF9USElTLCBTRExfU3lzV01pbmZvICppbmZvKQoreworCWlmICggaW5mby0+dmVyc2lvbi5tYWpvciA8PSBTRExfTUFKT1JfVkVSU0lPTiApIHsKKwkJaW5mby0+c3Vic3lzdGVtID0gU0RMX1NZU1dNX1gxMTsKKwkJaW5mby0+aW5mby54MTEuZGlzcGxheSA9IFNETF9EaXNwbGF5OworCQlpbmZvLT5pbmZvLngxMS53aW5kb3cgPSBTRExfV2luZG93OworCQlpZiAoIFNETF9WRVJTSU9OTlVNKGluZm8tPnZlcnNpb24ubWFqb3IsCisJCSAgICAgICAgICAgICAgICAgICAgaW5mby0+dmVyc2lvbi5taW5vciwKKwkJICAgICAgICAgICAgICAgICAgICBpbmZvLT52ZXJzaW9uLnBhdGNoKSA+PSAxMDAyICkgeworCQkJaW5mby0+aW5mby54MTEuZnN3aW5kb3cgPSBGU3dpbmRvdzsKKwkJCWluZm8tPmluZm8ueDExLndtd2luZG93ID0gV013aW5kb3c7CisJCX0KKworCisJCWlmICggU0RMX1ZFUlNJT05OVU0oaW5mby0+dmVyc2lvbi5tYWpvciwKKwkJICAgICAgICAgICAgICAgICAgICBpbmZvLT52ZXJzaW9uLm1pbm9yLAorCQkgICAgICAgICAgICAgICAgICAgIGluZm8tPnZlcnNpb24ucGF0Y2gpID49IDEyMTIgKSB7CisJCQlpbmZvLT5pbmZvLngxMS5nZnhkaXNwbGF5ID0gR0ZYX0Rpc3BsYXk7CisJCX0KKworCQlpbmZvLT5pbmZvLngxMS5sb2NrX2Z1bmMgPSBsb2NrX2Rpc3BsYXk7CisJCWluZm8tPmluZm8ueDExLnVubG9ja19mdW5jID0gdW5sb2NrX2Rpc3BsYXk7CisJCXJldHVybigxKTsKKwl9IGVsc2UgeworCQlTRExfU2V0RXJyb3IoIkFwcGxpY2F0aW9uIG5vdCBjb21waWxlZCB3aXRoIFNETCAlZC4lZFxuIiwKKwkJCQkJU0RMX01BSk9SX1ZFUlNJT04sIFNETF9NSU5PUl9WRVJTSU9OKTsKKwkJcmV0dXJuKC0xKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExd21fYy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMXdtX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGY5MzhiCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMXdtX2MuaApAQCAtMCwwICsxLDM4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgIlNETF94MTF2aWRlby5oIgorCisvKiBGdW5jdGlvbnMgdG8gYmUgZXhwb3J0ZWQgKi8KK2V4dGVybiB2b2lkIFgxMV9TZXRDYXB0aW9uTm9Mb2NrKF9USElTLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqaWNvbik7CitleHRlcm4gdm9pZCBYMTFfU2V0Q2FwdGlvbihfVEhJUywgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmljb24pOworZXh0ZXJuIHZvaWQgWDExX1NldEljb24oX1RISVMsIFNETF9TdXJmYWNlICppY29uLCBVaW50OCAqbWFzayk7CitleHRlcm4gaW50IFgxMV9JY29uaWZ5V2luZG93KF9USElTKTsKK2V4dGVybiBTRExfR3JhYk1vZGUgWDExX0dyYWJJbnB1dE5vTG9jayhfVEhJUywgU0RMX0dyYWJNb2RlIG1vZGUpOworZXh0ZXJuIFNETF9HcmFiTW9kZSBYMTFfR3JhYklucHV0KF9USElTLCBTRExfR3JhYk1vZGUgbW9kZSk7CitleHRlcm4gaW50IFgxMV9HZXRXTUluZm8oX1RISVMsIFNETF9TeXNXTWluZm8gKmluZm8pOworZXh0ZXJuIHZvaWQgIFgxMV9HZXRXaW5kb3dQb3MoX1RISVMsIGludCAgKnB4LCBpbnQgICpweSk7CitleHRlcm4gdm9pZCAgWDExX1NldFdpbmRvd1BvcyhfVEhJUywgaW50ICB4LCBpbnQgIHkpOworZXh0ZXJuIGludCAgIFgxMV9Jc1dpbmRvd1Zpc2libGUoX1RISVMsIGludCAgcmVjZW50ZXIpOworZXh0ZXJuIGludCBYMTFfR2V0TW9uaXRvckRQSShfVEhJUywgaW50KiB4ZHBpLCBpbnQgKnlkcGkpOworZXh0ZXJuIGludCBYMTFfR2V0TW9uaXRvclJlY3QoX1RISVMsIFNETF9SZWN0ICpyZWN0KTsKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTF5dXYuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veDExL1NETF94MTF5dXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjY5OGRmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMXl1di5jCkBAIC0wLDAgKzEsNTM4IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyogVGhpcyBpcyB0aGUgWEZyZWU4NiBYdiBleHRlbnNpb24gaW1wbGVtZW50YXRpb24gb2YgWVVWIHZpZGVvIG92ZXJsYXlzICovCisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YVgorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpZm5kZWYgTk9fU0hBUkVEX01FTU9SWQorI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvc2htLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWFNobS5oPgorI2VuZGlmCisjaW5jbHVkZSAiLi4vWGV4dC9leHRlbnNpb25zL1h2bGliLmgiCisKKyNpbmNsdWRlICJTRExfeDExeXV2X2MuaCIKKyNpbmNsdWRlICIuLi9TRExfeXV2ZnVuY3MuaCIKKworI2RlZmluZSBYRlJFRTg2X1JFRlJFU0hfSEFDSworI2lmZGVmIFhGUkVFODZfUkVGUkVTSF9IQUNLCisjaW5jbHVkZSAiU0RMX3gxMWltYWdlX2MuaCIKKyNlbmRpZgorCisvKiBXb3JrYXJvdW5kIHdoZW4gcGl0Y2ggIT0gd2lkdGggKi8KKyNkZWZpbmUgUElUQ0hfV09SS0FST1VORAorCisvKiBXb3JrYXJvdW5kIGludGVsIGk4MTAgdmlkZW8gb3ZlcmxheSB3YWl0aW5nIHdpdGggZmFpbGluZyB1bnRpbCB0aGUKKyAgIGZpcnN0IFh2W1NobV1QdXRJbWFnZSBjYWxsIDxzaWdoPiAqLworI2RlZmluZSBJTlRFTF9YVl9CQURBTExPQ19XT1JLQVJPVU5ECisKKy8qIEZpeCBmb3IgdGhlIE5WaWRpYSBHZUZvcmNlIDIgLSB1c2UgdGhlIGxhc3QgYXZhaWxhYmxlIGFkYXB0b3IgKi8KKy8qI2RlZmluZSBVU0VfTEFTVF9BREFQVE9SKi8gIC8qIEFwcGFyZW50bHkgdGhlIE5WaWRpYSBkcml2ZXJzIGFyZSBmaXhlZCAqLworCisvKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gbWFuaXB1bGF0ZSBzb2Z0d2FyZSB2aWRlbyBvdmVybGF5cyAqLworc3RhdGljIHN0cnVjdCBwcml2YXRlX3l1dmh3ZnVuY3MgeDExX3l1dmZ1bmNzID0geworCVgxMV9Mb2NrWVVWT3ZlcmxheSwKKwlYMTFfVW5sb2NrWVVWT3ZlcmxheSwKKwlYMTFfRGlzcGxheVlVVk92ZXJsYXksCisJWDExX0ZyZWVZVVZPdmVybGF5Cit9OworCitzdHJ1Y3QgcHJpdmF0ZV95dXZod2RhdGEgeworCWludCBwb3J0OworI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCisJaW50IHl1dl91c2VfbWl0c2htOworCVhTaG1TZWdtZW50SW5mbyB5dXZzaG07CisjZW5kaWYKKwlTRExfTkFNRShYdkltYWdlKSAqaW1hZ2U7Cit9OworCisKK3N0YXRpYyBpbnQgKCpYX2hhbmRsZXIpKERpc3BsYXkgKiwgWEVycm9yRXZlbnQgKikgPSBOVUxMOworCisjaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKKy8qIFNoYXJlZCBtZW1vcnkgZXJyb3IgaGFuZGxlciByb3V0aW5lICovCitzdGF0aWMgaW50IHNobV9lcnJvcjsKK3N0YXRpYyBpbnQgc2htX2VycmhhbmRsZXIoRGlzcGxheSAqZCwgWEVycm9yRXZlbnQgKmUpCit7CisgICAgICAgIGlmICggZS0+ZXJyb3JfY29kZSA9PSBCYWRBY2Nlc3MgKSB7CisgICAgICAgIAlzaG1fZXJyb3IgPSBUcnVlOworICAgICAgICAJcmV0dXJuKDApOworICAgICAgICB9IGVsc2UKKwkJcmV0dXJuKFhfaGFuZGxlcihkLGUpKTsKK30KKyNlbmRpZiAvKiAhTk9fU0hBUkVEX01FTU9SWSAqLworCitzdGF0aWMgaW50IHh2X2Vycm9yOworc3RhdGljIGludCB4dl9lcnJoYW5kbGVyKERpc3BsYXkgKmQsIFhFcnJvckV2ZW50ICplKQoreworICAgICAgICBpZiAoIGUtPmVycm9yX2NvZGUgPT0gQmFkTWF0Y2ggKSB7CisgICAgICAgIAl4dl9lcnJvciA9IFRydWU7CisgICAgICAgIAlyZXR1cm4oMCk7CisgICAgICAgIH0gZWxzZQorCQlyZXR1cm4oWF9oYW5kbGVyKGQsZSkpOworfQorCisjaWZkZWYgSU5URUxfWFZfQkFEQUxMT0NfV09SS0FST1VORAorc3RhdGljIGludCBpbnRlbF9lcnJoYW5kbGVyKERpc3BsYXkgKmQsIFhFcnJvckV2ZW50ICplKQoreworICAgICAgICBpZiAoIGUtPmVycm9yX2NvZGUgPT0gQmFkQWxsb2MgKSB7CisgICAgICAgIAl4dl9lcnJvciA9IFRydWU7CisgICAgICAgIAlyZXR1cm4oMCk7CisgICAgICAgIH0gZWxzZQorCQlyZXR1cm4oWF9oYW5kbGVyKGQsZSkpOworfQorCitzdGF0aWMgdm9pZCBYMTFfQ2xlYXJZVVZPdmVybGF5KFNETF9PdmVybGF5ICpvdmVybGF5KQoreworCWludCB4LHk7CisJICAgIAorCXN3aXRjaCAob3ZlcmxheS0+Zm9ybWF0KQorCXsKKwljYXNlIFNETF9ZVjEyX09WRVJMQVk6CisJY2FzZSBTRExfSVlVVl9PVkVSTEFZOgorCQlmb3IgKHkgPSAwOyB5IDwgb3ZlcmxheS0+aDsgeSsrKQorCQkJbWVtc2V0KG92ZXJsYXktPnBpeGVsc1swXSArIHkgKiBvdmVybGF5LT5waXRjaGVzWzBdLAorCQkJCTAsIG92ZXJsYXktPncpOworCQkKKwkJZm9yICh5ID0gMDsgeSA8IChvdmVybGF5LT5oIC8gMik7IHkrKykKKwkJeworCQkJbWVtc2V0KG92ZXJsYXktPnBpeGVsc1sxXSArIHkgKiBvdmVybGF5LT5waXRjaGVzWzFdLAorCQkJCS0xMjgsIG92ZXJsYXktPncgLyAyKTsKKwkJCW1lbXNldChvdmVybGF5LT5waXhlbHNbMl0gKyB5ICogb3ZlcmxheS0+cGl0Y2hlc1syXSwKKwkJCQktMTI4LCBvdmVybGF5LT53IC8gMik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTRExfWVVZMl9PVkVSTEFZOgorCWNhc2UgU0RMX1lWWVVfT1ZFUkxBWToKKwkJZm9yICh5ID0gMDsgeSA8IG92ZXJsYXktPmg7IHkrKykKKwkJeworCQkJZm9yICh4ID0gMDsgeCA8IG92ZXJsYXktPnc7IHggKz0gMikKKwkJCXsKKwkJCQlVaW50OCAqcGl4ZWxfcGFpciA9IG92ZXJsYXktPnBpeGVsc1swXSArCisJCQkJCXkgKiBvdmVybGF5LT5waXRjaGVzWzBdICsgeCAqIDI7CisJCQkJcGl4ZWxfcGFpclswXSA9IDA7CisJCQkJcGl4ZWxfcGFpclsxXSA9IC0xMjg7CisJCQkJcGl4ZWxfcGFpclsyXSA9IDA7CisJCQkJcGl4ZWxfcGFpclszXSA9IC0xMjg7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTRExfVVlWWV9PVkVSTEFZOgorCQlmb3IgKHkgPSAwOyB5IDwgb3ZlcmxheS0+aDsgeSsrKQorCQl7CisJCQlmb3IgKHggPSAwOyB4IDwgb3ZlcmxheS0+dzsgeCArPSAyKQorCQkJeworCQkJCVVpbnQ4ICpwaXhlbF9wYWlyID0gb3ZlcmxheS0+cGl4ZWxzWzBdICsKKwkJCQkJeSAqIG92ZXJsYXktPnBpdGNoZXNbMF0gKyB4ICogMjsKKwkJCQlwaXhlbF9wYWlyWzBdID0gLTEyODsKKwkJCQlwaXhlbF9wYWlyWzFdID0gMDsKKwkJCQlwaXhlbF9wYWlyWzJdID0gLTEyODsKKwkJCQlwaXhlbF9wYWlyWzNdID0gMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9Cit9CisjZW5kaWYKKworU0RMX092ZXJsYXkgKlgxMV9DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KQoreworCVNETF9PdmVybGF5ICpvdmVybGF5OworCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhOworCWludCB4dl9wb3J0OworCXVuc2lnbmVkIGludCBpLCBqLCBrOworCXVuc2lnbmVkIGludCBhZGFwdG9yczsKKwlTRExfTkFNRShYdkFkYXB0b3JJbmZvKSAqYWluZm87CisJaW50IGJwcDsKKyNpZm5kZWYgTk9fU0hBUkVEX01FTU9SWQorCVhTaG1TZWdtZW50SW5mbyAqeXV2c2htOworI2VuZGlmCisjaWZkZWYgSU5URUxfWFZfQkFEQUxMT0NfV09SS0FST1VORAorCWludCBpbnRlbF9hZGFwdGVyID0gRmFsc2U7CisjZW5kaWYKKworCS8qIExvb2sgZm9yIHRoZSBYVmlkZW8gZXh0ZW5zaW9uIHdpdGggYSB2YWxpZCBwb3J0IGZvciB0aGlzIGZvcm1hdCAqLworCXh2X3BvcnQgPSAtMTsKKwlpZiAoIChTdWNjZXNzID09IFNETF9OQU1FKFh2UXVlcnlFeHRlbnNpb24pKEdGWF9EaXNwbGF5LCAmaiwgJmosICZqLCAmaiwgJmopKSAmJgorCSAgICAgKFN1Y2Nlc3MgPT0gU0RMX05BTUUoWHZRdWVyeUFkYXB0b3JzKShHRlhfRGlzcGxheSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb290V2luZG93KEdGWF9EaXNwbGF5LCBTRExfU2NyZWVuKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRhcHRvcnMsICZhaW5mbykpICkgeworI2lmZGVmIFVTRV9MQVNUX0FEQVBUT1IKKwkJZm9yICggaT0wOyBpIDwgYWRhcHRvcnM7ICsraSApCisjZWxzZQorCQlmb3IgKCBpPTA7IChpIDwgYWRhcHRvcnMpICYmICh4dl9wb3J0ID09IC0xKTsgKytpICkKKyNlbmRpZiAvKiBVU0VfTEFTVF9BREFQVE9SICovCisJCXsKKwkJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdmlzdWFsIGNhbiBiZSB1c2VkICovCisJCQlpZiAoIEJVR0dZX1hGUkVFODYoPD0sIDQwMDEpICkgeworCQkJCWludCB2aXN1YWxfb2sgPSAwOworCQkJCWZvciAoIGo9MDsgajxhaW5mb1tpXS5udW1fZm9ybWF0czsgKytqICkgeworCQkJCQlpZiAoIGFpbmZvW2ldLmZvcm1hdHNbal0udmlzdWFsX2lkID09CisJCQkJCQkJU0RMX1Zpc3VhbC0+dmlzdWFsaWQgKSB7CisJCQkJCQl2aXN1YWxfb2sgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCAhIHZpc3VhbF9vayApIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorI2lmZGVmIElOVEVMX1hWX0JBREFMTE9DX1dPUktBUk9VTkQKKwkJCWlmICggIXN0cmNtcChhaW5mb1tpXS5uYW1lLCAiSW50ZWwoUikgVmlkZW8gT3ZlcmxhIikpCisJCQkJaW50ZWxfYWRhcHRlciA9IFRydWU7CisJCQllbHNlCisJCQkJaW50ZWxfYWRhcHRlciA9IEZhbHNlOworI2VuZGlmCisJCQlpZiAoIChhaW5mb1tpXS50eXBlICYgWHZJbnB1dE1hc2spICYmCisJCQkgICAgIChhaW5mb1tpXS50eXBlICYgWHZJbWFnZU1hc2spICkgeworCQkJCWludCBudW1fZm9ybWF0czsKKwkJCQlTRExfTkFNRShYdkltYWdlRm9ybWF0VmFsdWVzKSAqZm9ybWF0czsKKwkJCQlmb3JtYXRzID0gU0RMX05BTUUoWHZMaXN0SW1hZ2VGb3JtYXRzKShHRlhfRGlzcGxheSwKKwkJCQkgICAgICAgICAgICAgIGFpbmZvW2ldLmJhc2VfaWQsICZudW1fZm9ybWF0cyk7CisjaWZkZWYgVVNFX0xBU1RfQURBUFRPUgorCQkJCWZvciAoIGo9MDsgaiA8IG51bV9mb3JtYXRzOyArK2ogKQorI2Vsc2UKKwkJCQlmb3IgKCBqPTA7IChqIDwgbnVtX2Zvcm1hdHMpICYmICh4dl9wb3J0ID09IC0xKTsgKytqICkKKyNlbmRpZiAvKiBVU0VfTEFTVF9BREFQVE9SICovCisJCQkJeworCQkJCQlpZiAoIChVaW50MzIpZm9ybWF0c1tqXS5pZCA9PSBmb3JtYXQgKSB7CisJCQkJCQlmb3IgKCBrPTA7IGsgPCBhaW5mb1tpXS5udW1fcG9ydHM7ICsrayApIHsKKwkJCQkJCQlpZiAoIFN1Y2Nlc3MgPT0gU0RMX05BTUUoWHZHcmFiUG9ydCkoR0ZYX0Rpc3BsYXksIGFpbmZvW2ldLmJhc2VfaWQraywgQ3VycmVudFRpbWUpICkgeworCQkJCQkJCQl4dl9wb3J0ID0gYWluZm9baV0uYmFzZV9pZCtrOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCBmb3JtYXRzICkgeworCQkJCQlYRnJlZShmb3JtYXRzKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJU0RMX05BTUUoWHZGcmVlQWRhcHRvckluZm8pKGFpbmZvKTsKKwl9CisKKwkvKiBQcmVjYWxjdWxhdGUgdGhlIGJwcCBmb3IgdGhlIHBpdGNoIHdvcmthcm91bmQgYmVsb3cgKi8KKwlzd2l0Y2ggKGZvcm1hdCkgeworCSAgICAvKiBBZGQgYW55IG90aGVyIGNhc2VzIHdlIG5lZWQgdG8gc3VwcG9ydC4uLiAqLworCSAgICBjYXNlIFNETF9ZVVkyX09WRVJMQVk6CisJICAgIGNhc2UgU0RMX1VZVllfT1ZFUkxBWToKKwkgICAgY2FzZSBTRExfWVZZVV9PVkVSTEFZOgorCQlicHAgPSAyOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJYnBwID0gMTsKKwkJYnJlYWs7CisJfQorCisjaWYgMAorICAgIC8qCisgICAgICogISEhIEZJWE1FOgorICAgICAqICJIZXJlIGFyZSBzb21lIGRpZmZzIGZvciBYMTEgYW5kIHl1di4gIE5vdGUgdGhhdCB0aGUgbGFzdCBwYXJ0IDJuZAorICAgICAqICBkaWZmIHNob3VsZCBwcm9iYWJseSBiZSBhIG5ldyBjYWxsIHRvIFh2UXVlcnlBZGFwdG9yRnJlZSB3aXRoIGFpbmZvCisgICAgICogIGFuZCB0aGUgbnVtYmVyIG9mIGFkYXB0b3JzLCBpbnN0ZWFkIG9mIHRoZSBsb29wIHRocm91Z2ggbGlrZSBJIGRpZC4iCisgICAgICoKKyAgICAgKiAgQUNIVFVORzogVGhpcyBpcyBicm9rZW4hIEl0IGxvb2tzIGxpa2UgWHZGcmVlQWRhcHRvckluZm8gZG9lcyB0aGlzCisgICAgICogIGZvciB5b3UsIHNvIHdlIGVuZCB1cCB3aXRoIGEgZG91YmxlLWZyZWUuIEkgbmVlZCB0byBsb29rIGF0IHRoaXMKKyAgICAgKiAgbW9yZSBjbG9zZWx5Li4uICAtLXJ5YW4uCisgICAgICovCisgCWZvciAoIGk9MDsgaSA8IGFkYXB0b3JzOyArK2kgKSB7CisgCSAgaWYgKGFpbmZvW2ldLm5hbWUgIT0gTlVMTCkgWGZyZWUoYWluZm9baV0ubmFtZSk7CisgCSAgaWYgKGFpbmZvW2ldLmZvcm1hdHMgIT0gTlVMTCkgWGZyZWUoYWluZm9baV0uZm9ybWF0cyk7CisgICAJfQorIAlYZnJlZShhaW5mbyk7CisjZW5kaWYKKworCWlmICggeHZfcG9ydCA9PSAtMSApIHsKKwkJU0RMX1NldEVycm9yKCJObyBhdmFpbGFibGUgdmlkZW8gcG9ydHMgZm9yIHJlcXVlc3RlZCBmb3JtYXQiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIEVuYWJsZSBhdXRvLXBhaW50aW5nIG9mIHRoZSBvdmVybGF5IGNvbG9ya2V5ICovCisJeworCQlzdGF0aWMgY29uc3QgY2hhciAqYXR0cltdID0geyAiWFZfQVVUT1BBSU5UX0NPTE9SS0VZIiwgIlhWX0FVVE9QQUlOVF9DT0xPVVJLRVkiIH07CisJCXVuc2lnbmVkIGludCBpOworCisJCVNETF9OQU1FKFh2U2VsZWN0UG9ydE5vdGlmeSkoR0ZYX0Rpc3BsYXksIHh2X3BvcnQsIFRydWUpOworCQlYX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHh2X2VycmhhbmRsZXIpOworCQlmb3IgKCBpPTA7IGkgPCBzaXplb2YoYXR0cikvKHNpemVvZiBhdHRyWzBdKTsgKytpICkgeworCQkJQXRvbSBhOworCisJCQl4dl9lcnJvciA9IEZhbHNlOworCQkJYSA9IFhJbnRlcm5BdG9tKEdGWF9EaXNwbGF5LCBhdHRyW2ldLCBUcnVlKTsKKwkJCWlmICggYSAhPSBOb25lICkgeworICAgICAJCQkJU0RMX05BTUUoWHZTZXRQb3J0QXR0cmlidXRlKShHRlhfRGlzcGxheSwgeHZfcG9ydCwgYSwgMSk7CisJCQkJWFN5bmMoR0ZYX0Rpc3BsYXksIFRydWUpOworCQkJCWlmICggISB4dl9lcnJvciApIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCVhTZXRFcnJvckhhbmRsZXIoWF9oYW5kbGVyKTsKKwkJU0RMX05BTUUoWHZTZWxlY3RQb3J0Tm90aWZ5KShHRlhfRGlzcGxheSwgeHZfcG9ydCwgRmFsc2UpOworCX0KKworCS8qIENyZWF0ZSB0aGUgb3ZlcmxheSBzdHJ1Y3R1cmUgKi8KKwlvdmVybGF5ID0gKFNETF9PdmVybGF5ICopU0RMX21hbGxvYyhzaXplb2YgKm92ZXJsYXkpOworCWlmICggb3ZlcmxheSA9PSBOVUxMICkgeworCQlTRExfTkFNRShYdlVuZ3JhYlBvcnQpKEdGWF9EaXNwbGF5LCB4dl9wb3J0LCBDdXJyZW50VGltZSk7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCVNETF9tZW1zZXQob3ZlcmxheSwgMCwgKHNpemVvZiAqb3ZlcmxheSkpOworCisJLyogRmlsbCBpbiB0aGUgYmFzaWMgbWVtYmVycyAqLworCW92ZXJsYXktPmZvcm1hdCA9IGZvcm1hdDsKKwlvdmVybGF5LT53ID0gd2lkdGg7CisJb3ZlcmxheS0+aCA9IGhlaWdodDsKKworCS8qIFNldCB1cCB0aGUgWVVWIHN1cmZhY2UgZnVuY3Rpb24gc3RydWN0dXJlICovCisJb3ZlcmxheS0+aHdmdW5jcyA9ICZ4MTFfeXV2ZnVuY3M7CisJb3ZlcmxheS0+aHdfb3ZlcmxheSA9IDE7CisKKwkvKiBDcmVhdGUgdGhlIHBpeGVsIGRhdGEgYW5kIGxvb2t1cCB0YWJsZXMgKi8KKwlod2RhdGEgPSAoc3RydWN0IHByaXZhdGVfeXV2aHdkYXRhICopU0RMX21hbGxvYyhzaXplb2YgKmh3ZGF0YSk7CisJb3ZlcmxheS0+aHdkYXRhID0gaHdkYXRhOworCWlmICggaHdkYXRhID09IE5VTEwgKSB7CisJCVNETF9OQU1FKFh2VW5ncmFiUG9ydCkoR0ZYX0Rpc3BsYXksIHh2X3BvcnQsIEN1cnJlbnRUaW1lKTsKKwkJU0RMX091dE9mTWVtb3J5KCk7CisJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlod2RhdGEtPnBvcnQgPSB4dl9wb3J0OworI2lmbmRlZiBOT19TSEFSRURfTUVNT1JZCisJeXV2c2htID0gJmh3ZGF0YS0+eXV2c2htOworCVNETF9tZW1zZXQoeXV2c2htLCAwLCBzaXplb2YoKnl1dnNobSkpOworCWh3ZGF0YS0+aW1hZ2UgPSBTRExfTkFNRShYdlNobUNyZWF0ZUltYWdlKShHRlhfRGlzcGxheSwgeHZfcG9ydCwgZm9ybWF0LAorCQkJCQkJICAgMCwgd2lkdGgsIGhlaWdodCwgeXV2c2htKTsKKyNpZmRlZiBQSVRDSF9XT1JLQVJPVU5ECisJaWYgKCBod2RhdGEtPmltYWdlICE9IE5VTEwgJiYgaHdkYXRhLT5pbWFnZS0+cGl0Y2hlc1swXSAhPSAod2lkdGgqYnBwKSApIHsKKwkJLyogQWp1c3Qgb3ZlcmxheSB3aWR0aCBhY2NvcmRpbmcgdG8gcGl0Y2ggKi8gCisJCXdpZHRoID0gaHdkYXRhLT5pbWFnZS0+cGl0Y2hlc1swXSAvIGJwcDsKKwkJWEZyZWUoaHdkYXRhLT5pbWFnZSk7CisJCWh3ZGF0YS0+aW1hZ2UgPSBTRExfTkFNRShYdlNobUNyZWF0ZUltYWdlKShHRlhfRGlzcGxheSwgeHZfcG9ydCwgZm9ybWF0LAorCQkJCQkJCSAgIDAsIHdpZHRoLCBoZWlnaHQsIHl1dnNobSk7CisJfQorI2VuZGlmIC8qIFBJVENIX1dPUktBUk9VTkQgKi8KKwlod2RhdGEtPnl1dl91c2VfbWl0c2htID0gKGh3ZGF0YS0+aW1hZ2UgIT0gTlVMTCk7CisJaWYgKCBod2RhdGEtPnl1dl91c2VfbWl0c2htICkgeworCQl5dXZzaG0tPnNobWlkID0gc2htZ2V0KElQQ19QUklWQVRFLCBod2RhdGEtPmltYWdlLT5kYXRhX3NpemUsCisJCQkJICAgICAgIElQQ19DUkVBVCB8IDA3NzcpOworCQlpZiAoIHl1dnNobS0+c2htaWQgPj0gMCApIHsKKwkJCXl1dnNobS0+c2htYWRkciA9IChjaGFyICopc2htYXQoeXV2c2htLT5zaG1pZCwgMCwgMCk7CisJCQl5dXZzaG0tPnJlYWRPbmx5ID0gRmFsc2U7CisJCQlpZiAoIHl1dnNobS0+c2htYWRkciAhPSAoY2hhciAqKS0xICkgeworCQkJCXNobV9lcnJvciA9IEZhbHNlOworCQkJCVhfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIoc2htX2VycmhhbmRsZXIpOworCQkJCVhTaG1BdHRhY2goR0ZYX0Rpc3BsYXksIHl1dnNobSk7CisJCQkJWFN5bmMoR0ZYX0Rpc3BsYXksIFRydWUpOworCQkJCVhTZXRFcnJvckhhbmRsZXIoWF9oYW5kbGVyKTsKKwkJCQlpZiAoIHNobV9lcnJvciApCisJCQkJCXNobWR0KHl1dnNobS0+c2htYWRkcik7CisJCQl9IGVsc2UgeworCQkJCXNobV9lcnJvciA9IFRydWU7CisJCQl9CisJCQlzaG1jdGwoeXV2c2htLT5zaG1pZCwgSVBDX1JNSUQsIE5VTEwpOworCQl9IGVsc2UgeworCQkJc2htX2Vycm9yID0gVHJ1ZTsKKwkJfQorCQlpZiAoIHNobV9lcnJvciApIHsKKwkJCVhGcmVlKGh3ZGF0YS0+aW1hZ2UpOworCQkJaHdkYXRhLT55dXZfdXNlX21pdHNobSA9IDA7CisJCX0gZWxzZSB7CisJCQlod2RhdGEtPmltYWdlLT5kYXRhID0geXV2c2htLT5zaG1hZGRyOworCQl9CisJfQorCWlmICggIWh3ZGF0YS0+eXV2X3VzZV9taXRzaG0gKQorI2VuZGlmIC8qIE5PX1NIQVJFRF9NRU1PUlkgKi8KKwl7CisJCWh3ZGF0YS0+aW1hZ2UgPSBTRExfTkFNRShYdkNyZWF0ZUltYWdlKShHRlhfRGlzcGxheSwgeHZfcG9ydCwgZm9ybWF0LAorCQkJCQkJCTAsIHdpZHRoLCBoZWlnaHQpOworCisjaWZkZWYgUElUQ0hfV09SS0FST1VORAorCQlpZiAoIGh3ZGF0YS0+aW1hZ2UgIT0gTlVMTCAmJiBod2RhdGEtPmltYWdlLT5waXRjaGVzWzBdICE9ICh3aWR0aCpicHApICkgeworCQkJLyogQWp1c3Qgb3ZlcmxheSB3aWR0aCBhY2NvcmRpbmcgdG8gcGl0Y2ggKi8gCisJCQlYRnJlZShod2RhdGEtPmltYWdlKTsKKwkJCXdpZHRoID0gaHdkYXRhLT5pbWFnZS0+cGl0Y2hlc1swXSAvIGJwcDsKKwkJCWh3ZGF0YS0+aW1hZ2UgPSBTRExfTkFNRShYdkNyZWF0ZUltYWdlKShHRlhfRGlzcGxheSwgeHZfcG9ydCwgZm9ybWF0LAorCQkJCQkJCQkwLCB3aWR0aCwgaGVpZ2h0KTsKKwkJfQorI2VuZGlmIC8qIFBJVENIX1dPUktBUk9VTkQgKi8KKwkJaWYgKCBod2RhdGEtPmltYWdlID09IE5VTEwgKSB7CisJCQlTRExfU2V0RXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBYVmlkZW8gaW1hZ2UiKTsKKwkJCVNETF9GcmVlWVVWT3ZlcmxheShvdmVybGF5KTsKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCQlod2RhdGEtPmltYWdlLT5kYXRhID0gU0RMX21hbGxvYyhod2RhdGEtPmltYWdlLT5kYXRhX3NpemUpOworCQlpZiAoIGh3ZGF0YS0+aW1hZ2UtPmRhdGEgPT0gTlVMTCApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOworCQkJcmV0dXJuKE5VTEwpOworCQl9CisJfQorCisJLyogRmluZCB0aGUgcGl0Y2ggYW5kIG9mZnNldCB2YWx1ZXMgZm9yIHRoZSBvdmVybGF5ICovCisJb3ZlcmxheS0+cGxhbmVzID0gaHdkYXRhLT5pbWFnZS0+bnVtX3BsYW5lczsKKwlvdmVybGF5LT5waXRjaGVzID0gKFVpbnQxNiAqKVNETF9tYWxsb2Mob3ZlcmxheS0+cGxhbmVzICogc2l6ZW9mKFVpbnQxNikpOworCW92ZXJsYXktPnBpeGVscyA9IChVaW50OCAqKilTRExfbWFsbG9jKG92ZXJsYXktPnBsYW5lcyAqIHNpemVvZihVaW50OCAqKSk7CisJaWYgKCAhb3ZlcmxheS0+cGl0Y2hlcyB8fCAhb3ZlcmxheS0+cGl4ZWxzICkgeworCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJU0RMX0ZyZWVZVVZPdmVybGF5KG92ZXJsYXkpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCWZvciAoIGk9MDsgaTxvdmVybGF5LT5wbGFuZXM7ICsraSApIHsKKwkJb3ZlcmxheS0+cGl0Y2hlc1tpXSA9IGh3ZGF0YS0+aW1hZ2UtPnBpdGNoZXNbaV07CisJCW92ZXJsYXktPnBpeGVsc1tpXSA9IChVaW50OCAqKWh3ZGF0YS0+aW1hZ2UtPmRhdGEgKworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2RhdGEtPmltYWdlLT5vZmZzZXRzW2ldOworCX0KKworI2lmZGVmIFhGUkVFODZfUkVGUkVTSF9IQUNLCisJLyogV29yayBhcm91bmQgYW4gWEZyZWU4NiBYIHNlcnZlciBidWcgKD8pCisJICAgV2UgY2FuJ3QgcGVyZm9ybSBub3JtYWwgdXBkYXRlcyBpbiB3aW5kb3dzIHRoYXQgaGF2ZSB2aWRlbworCSAgIGJlaW5nIG91dHB1dCB0byB0aGVtLiAgU2VlIFNETF94MTFpbWFnZS5jIGZvciBtb3JlIGRldGFpbHMuCisJICovCisJWDExX0Rpc2FibGVBdXRvUmVmcmVzaCh0aGlzKTsKKyNlbmRpZgorCisjaWZkZWYgSU5URUxfWFZfQkFEQUxMT0NfV09SS0FST1VORAorCS8qIEhBQ0ssIEdSUlIgc29tZXRpbWVzIChpODEwKSBjcmVhdGluZyB0aGUgb3ZlcmxheSBzdWNjZWVkcywgYnV0IHRoZQorCSAgIGZpcnN0IGNhbGwgdG8gWHZTaG1bUHV0XUltYWdlIHRvIGEgbWFwcGVkIHdpbmRvdyBmYWlscyB3aXRoOgorCSAgICJCYWRBbGxvYyAoaW5zdWZmaWNpZW50IHJlc291cmNlcyBmb3Igb3BlcmF0aW9uKSIuIFRoaXMgaGFwcGVucyB3aXRoCisJICAgY2VydGFpbiBmb3JtYXRzIHdoZW4gdGhlIFh2SW1hZ2UgaXMgdG9vIGxhcmdlIHRvIHRoZSBpODEwJ3MgbGlraW5nLgorCisJICAgV2Ugd29yayBhcm91bmQgdGhpcyBieSBkb2luZyBhIHRlc3QgWHZTaG1bUHV0XUltYWdlIHdpdGggYSBibGFjaworCSAgIFh2IGltYWdlLCB0aGlzIG1heSBjYXVzZSBzb21lIGZsYXNoaW5nLCBzbyBvbmx5IGRvIHRoaXMgY2hlY2sgaWYgd2UKKwkgICBhcmUgcnVubmluZyBvbiBhbiBpbnRlbCBYdi1hZGFwdGVyLiAqLworCWlmIChpbnRlbF9hZGFwdGVyKQorCXsKKwkJeHZfZXJyb3IgPSBGYWxzZTsKKwkJWF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcihpbnRlbF9lcnJoYW5kbGVyKTsKKwkJCisJCVgxMV9DbGVhcllVVk92ZXJsYXkob3ZlcmxheSk7CisKKwkJLyogV2Ugc2V0IHRoZSBkZXN0aW5hdGlvbiBoZWlnaHQgYW5kIHdpZHRoIHRvIDEgcGl4ZWwgdG8gYXZvaWQKKwkJICAgcHV0dGluZyBhIGxhcmdlIGJsYWNrIHJlY3RhbmdsZSBvdmVyIHRoZSBzY3JlZW4sIHRodXMKKwkJICAgc3Ryb25nbHkgcmVkdWNpbmcgcG9zc2libGUgZmxhc2hpbmcuICovCisjaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKKwkJaWYgKCBod2RhdGEtPnl1dl91c2VfbWl0c2htICkgeworCQkJU0RMX05BTUUoWHZTaG1QdXRJbWFnZSkoR0ZYX0Rpc3BsYXksIGh3ZGF0YS0+cG9ydCwKKwkJCQlTRExfV2luZG93LCBTRExfR0MsCisJCQkJaHdkYXRhLT5pbWFnZSwKKwkJCQkwLCAwLCBvdmVybGF5LT53LCBvdmVybGF5LT5oLAorCQkJCTAsIDAsIDEsIDEsIEZhbHNlKTsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkJU0RMX05BTUUoWHZQdXRJbWFnZSkoR0ZYX0Rpc3BsYXksIGh3ZGF0YS0+cG9ydCwKKwkJCQlTRExfV2luZG93LCBTRExfR0MsCisJCQkJaHdkYXRhLT5pbWFnZSwKKwkJCQkwLCAwLCBvdmVybGF5LT53LCBvdmVybGF5LT5oLAorCQkJCTAsIDAsIDEsIDEpOworCQl9CisJCVhTeW5jKEdGWF9EaXNwbGF5LCBGYWxzZSk7CisJCVhTZXRFcnJvckhhbmRsZXIoWF9oYW5kbGVyKTsKKworCQlpZiAoeHZfZXJyb3IpCisJCXsKKwkJCVgxMV9GcmVlWVVWT3ZlcmxheSh0aGlzLCBvdmVybGF5KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8qIFJlcGFpciB0aGUgKDEgcGl4ZWwgd29ydGggb2YpIGRhbWFnZSB3ZSd2ZSBqdXN0IGRvbmUgKi8KKwkJWDExX1JlZnJlc2hEaXNwbGF5KHRoaXMpOworCX0KKyNlbmRpZgorCisJLyogV2UncmUgYWxsIGRvbmUuLiAqLworCXJldHVybihvdmVybGF5KTsKK30KKworaW50IFgxMV9Mb2NrWVVWT3ZlcmxheShfVEhJUywgU0RMX092ZXJsYXkgKm92ZXJsYXkpCit7CisJcmV0dXJuKDApOworfQorCit2b2lkIFgxMV9VbmxvY2tZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSkKK3sKKwlyZXR1cm47Cit9CisKK2ludCBYMTFfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KQoreworCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhOworCisJaHdkYXRhID0gb3ZlcmxheS0+aHdkYXRhOworCisjaWZuZGVmIE5PX1NIQVJFRF9NRU1PUlkKKwlpZiAoIGh3ZGF0YS0+eXV2X3VzZV9taXRzaG0gKSB7CisJCVNETF9OQU1FKFh2U2htUHV0SW1hZ2UpKEdGWF9EaXNwbGF5LCBod2RhdGEtPnBvcnQsIFNETF9XaW5kb3csIFNETF9HQywKKwkgICAgICAgICAgICAgIGh3ZGF0YS0+aW1hZ2UsCisJCSAgICAgIHNyYy0+eCwgc3JjLT55LCBzcmMtPncsIHNyYy0+aCwKKwkJICAgICAgZHN0LT54LCBkc3QtPnksIGRzdC0+dywgZHN0LT5oLCBGYWxzZSk7CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkJU0RMX05BTUUoWHZQdXRJbWFnZSkoR0ZYX0Rpc3BsYXksIGh3ZGF0YS0+cG9ydCwgU0RMX1dpbmRvdywgU0RMX0dDLAorCQkJCSAgICAgaHdkYXRhLT5pbWFnZSwKKwkJICAgICAgICAgICAgICAgICAgICAgc3JjLT54LCBzcmMtPnksIHNyYy0+dywgc3JjLT5oLAorCQkgICAgICAgICAgICAgICAgICAgICBkc3QtPngsIGRzdC0+eSwgZHN0LT53LCBkc3QtPmgpOworCX0KKwlYU3luYyhHRlhfRGlzcGxheSwgRmFsc2UpOworCXJldHVybigwKTsKK30KKwordm9pZCBYMTFfRnJlZVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KQoreworCXN0cnVjdCBwcml2YXRlX3l1dmh3ZGF0YSAqaHdkYXRhOworCisJaHdkYXRhID0gb3ZlcmxheS0+aHdkYXRhOworCWlmICggaHdkYXRhICkgeworCQlTRExfTkFNRShYdlVuZ3JhYlBvcnQpKEdGWF9EaXNwbGF5LCBod2RhdGEtPnBvcnQsIEN1cnJlbnRUaW1lKTsKKyNpZm5kZWYgTk9fU0hBUkVEX01FTU9SWQorCQlpZiAoIGh3ZGF0YS0+eXV2X3VzZV9taXRzaG0gKSB7CisJCQlYU2htRGV0YWNoKEdGWF9EaXNwbGF5LCAmaHdkYXRhLT55dXZzaG0pOworCQkJc2htZHQoaHdkYXRhLT55dXZzaG0uc2htYWRkcik7CisJCX0KKyNlbmRpZgorCQlpZiAoIGh3ZGF0YS0+aW1hZ2UgKSB7CisJCQlYRnJlZShod2RhdGEtPmltYWdlKTsKKwkJfQorCQlTRExfZnJlZShod2RhdGEpOworCX0KKwlpZiAoIG92ZXJsYXktPnBpdGNoZXMgKSB7CisJCVNETF9mcmVlKG92ZXJsYXktPnBpdGNoZXMpOworCQlvdmVybGF5LT5waXRjaGVzID0gTlVMTDsKKwl9CisJaWYgKCBvdmVybGF5LT5waXhlbHMgKSB7CisJCVNETF9mcmVlKG92ZXJsYXktPnBpeGVscyk7CisJCW92ZXJsYXktPnBpeGVscyA9IE5VTEw7CisJfQorI2lmZGVmIFhGUkVFODZfUkVGUkVTSF9IQUNLCisJWDExX0VuYWJsZUF1dG9SZWZyZXNoKHRoaXMpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YViAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMXl1dl9jLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3gxMS9TRExfeDExeXV2X2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk3NjgzCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94MTEvU0RMX3gxMXl1dl9jLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qIFRoaXMgaXMgdGhlIFhGcmVlODYgWHYgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uIG9mIFlVViB2aWRlbyBvdmVybGF5cyAqLworCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX3gxMXZpZGVvLmgiCisKKyNpZiBTRExfVklERU9fRFJJVkVSX1gxMV9YVgorCitleHRlcm4gU0RMX092ZXJsYXkgKlgxMV9DcmVhdGVZVVZPdmVybGF5KF9USElTLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFVpbnQzMiBmb3JtYXQsIFNETF9TdXJmYWNlICpkaXNwbGF5KTsKKworZXh0ZXJuIGludCBYMTFfTG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKKworZXh0ZXJuIHZvaWQgWDExX1VubG9ja1lVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5KTsKKworZXh0ZXJuIGludCBYMTFfRGlzcGxheVlVVk92ZXJsYXkoX1RISVMsIFNETF9PdmVybGF5ICpvdmVybGF5LCBTRExfUmVjdCAqc3JjLCBTRExfUmVjdCAqZHN0KTsKKworZXh0ZXJuIHZvaWQgWDExX0ZyZWVZVVZPdmVybGF5KF9USElTLCBTRExfT3ZlcmxheSAqb3ZlcmxheSk7CisKKyNlbmRpZiAvKiBTRExfVklERU9fRFJJVkVSX1gxMV9YViAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3MuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiZjZhYgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zLmMKQEAgLTAsMCArMSwxMTE2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKyAqIFhiaW9zIFNETCB2aWRlbyBkcml2ZXIKKyAqIAorICogUGF0cmljZSBNYW5kaW4KKyAqLworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogTWludCBpbmNsdWRlcyAqLworI2luY2x1ZGUgPG1pbnQvY29va2llLmg+CisjaW5jbHVkZSA8bWludC9vc2JpbmQuaD4KKyNpbmNsdWRlIDxtaW50L2ZhbGNvbi5oPgorCisjaW5jbHVkZSAiU0RMX3ZpZGVvLmgiCisjaW5jbHVkZSAiU0RMX21vdXNlLmgiCisjaW5jbHVkZSAiLi4vU0RMX3N5c3ZpZGVvLmgiCisjaW5jbHVkZSAiLi4vU0RMX3BpeGVsc19jLmgiCisjaW5jbHVkZSAiLi4vLi4vZXZlbnRzL1NETF9ldmVudHNfYy5oIgorCisjaW5jbHVkZSAiLi4vYXRhcmljb21tb24vU0RMX2F0YXJpYzJwX3MuaCIKKyNpbmNsdWRlICIuLi9hdGFyaWNvbW1vbi9TRExfYXRhcmlldmVudHNfYy5oIgorI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaW14YWxsb2NfYy5oIgorI2luY2x1ZGUgIi4uL2F0YXJpY29tbW9uL1NETF9hdGFyaWdsX2MuaCIKKyNpbmNsdWRlICJTRExfeGJpb3MuaCIKKyNpbmNsdWRlICJTRExfeGJpb3NfYmxvd3VwLmgiCisjaW5jbHVkZSAiU0RMX3hiaW9zX2NlbnRzY3JlZW4uaCIKKyNpbmNsdWRlICJTRExfeGJpb3Nfc2IzLmgiCisjaW5jbHVkZSAiU0RMX3hiaW9zX3R2ZWlsbGUuaCIKKyNpbmNsdWRlICJTRExfeGJpb3NfbWlsYW4uaCIKKworI2RlZmluZSBYQklPU19WSURfRFJJVkVSX05BTUUgInhiaW9zIgorCisjaWZuZGVmIENfZlZESQorI2RlZmluZSBDX2ZWREkgMHg2NjU2NDQ0OUwKKyNlbmRpZgorCisvKiBEZWJ1ZyBwcmludCBpbmZvICovCisjaWYgMAorI2RlZmluZSBERUJVR19QUklOVCh3aGF0KSBcCisJeyBcCisJCXByaW50ZiB3aGF0OyBcCisJfQorI2RlZmluZSBERUJVR19WSURFT19YQklPUyAxCisjZWxzZQorI2RlZmluZSBERUJVR19QUklOVCh3aGF0KQorI3VuZGVmIERFQlVHX1ZJREVPX1hCSU9TCisjZW5kaWYKKworLyogSW5pdGlhbGl6YXRpb24vUXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IFhCSU9TX1ZpZGVvSW5pdChfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICp2Zm9ybWF0KTsKK3N0YXRpYyBTRExfUmVjdCAqKlhCSU9TX0xpc3RNb2RlcyhfVEhJUywgU0RMX1BpeGVsRm9ybWF0ICpmb3JtYXQsIFVpbnQzMiBmbGFncyk7CitzdGF0aWMgU0RMX1N1cmZhY2UgKlhCSU9TX1NldFZpZGVvTW9kZShfVEhJUywgU0RMX1N1cmZhY2UgKmN1cnJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKTsKK3N0YXRpYyBpbnQgWEJJT1NfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKTsKK3N0YXRpYyB2b2lkIFhCSU9TX1ZpZGVvUXVpdChfVEhJUyk7CisKKy8qIEhhcmR3YXJlIHN1cmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IFhCSU9TX0FsbG9jSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgaW50IFhCSU9TX0xvY2tIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKTsKK3N0YXRpYyBpbnQgWEJJT1NfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpOworc3RhdGljIHZvaWQgWEJJT1NfVW5sb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBYQklPU19GcmVlSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBYQklPU19VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpOworCisjaWYgU0RMX1ZJREVPX09QRU5HTAorLyogT3BlbkdMIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgWEJJT1NfR0xfU3dhcEJ1ZmZlcnMoX1RISVMpOworI2VuZGlmCisKKy8qIFRvIHNldHVwIHBhbGV0dGUgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0CVRUX3BhbGV0dGVbMjU2XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nCUYzMF9wYWxldHRlWzI1Nl07CisKKy8qIERlZmF1bHQgbGlzdCBvZiB2aWRlbyBtb2RlcyAqLworCitzdGF0aWMgY29uc3QgeGJpb3Ntb2RlX3Qgc3Rtb2Rlc1sxXT17CisJe1NUX0xPVz4+OCwzMjAsMjAwLDQsIFhCSU9TTU9ERV9DMlB9Cit9OworCitzdGF0aWMgY29uc3QgeGJpb3Ntb2RlX3QgdHRtb2Rlc1syXT17CisJe1RUX0xPVywzMjAsNDgwLDgsIFhCSU9TTU9ERV9DMlB9LAorCXtUVF9MT1csMzIwLDI0MCw4LCBYQklPU01PREVfQzJQfFhCSU9TTU9ERV9ET1VCTEVMSU5FfQorfTsKKworc3RhdGljIGNvbnN0IHhiaW9zbW9kZV90IGZhbGNvbnJnYm1vZGVzWzE2XT17CisJe0JQUzE2fENPTDgwfE9WRVJTQ0FOfFZFUlRGTEFHLDc2OCw0ODAsMTYsMH0sCisJe0JQUzE2fENPTDgwfE9WRVJTQ0FOLDc2OCwyNDAsMTYsMH0sCisJe0JQUzE2fENPTDgwfFZFUlRGTEFHLDY0MCw0MDAsMTYsMH0sCisJe0JQUzE2fENPTDgwLDY0MCwyMDAsMTYsMH0sCisJe0JQUzE2fE9WRVJTQ0FOfFZFUlRGTEFHLDM4NCw0ODAsMTYsMH0sCisJe0JQUzE2fE9WRVJTQ0FOLDM4NCwyNDAsMTYsMH0sCisJe0JQUzE2fFZFUlRGTEFHLDMyMCw0MDAsMTYsMH0sCisJe0JQUzE2LDMyMCwyMDAsMTYsMH0sCisJe0JQUzh8Q09MODB8T1ZFUlNDQU58VkVSVEZMQUcsNzY4LDQ4MCw4LFhCSU9TTU9ERV9DMlB9LAorCXtCUFM4fENPTDgwfE9WRVJTQ0FOLDc2OCwyNDAsOCxYQklPU01PREVfQzJQfSwKKwl7QlBTOHxDT0w4MHxWRVJURkxBRyw2NDAsNDAwLDgsWEJJT1NNT0RFX0MyUH0sCisJe0JQUzh8Q09MODAsNjQwLDIwMCw4LFhCSU9TTU9ERV9DMlB9LAorCXtCUFM4fE9WRVJTQ0FOfFZFUlRGTEFHLDM4NCw0ODAsOCxYQklPU01PREVfQzJQfSwKKwl7QlBTOHxPVkVSU0NBTiwzODQsMjQwLDgsWEJJT1NNT0RFX0MyUH0sCisJe0JQUzh8VkVSVEZMQUcsMzIwLDQwMCw4LFhCSU9TTU9ERV9DMlB9LAorCXtCUFM4LDMyMCwyMDAsOCxYQklPU01PREVfQzJQfQorfTsKKworc3RhdGljIGNvbnN0IHhiaW9zbW9kZV90IGZhbGNvbnZnYW1vZGVzWzZdPXsKKwl7QlBTMTYsMzIwLDQ4MCwxNiwwfSwKKwl7QlBTMTZ8VkVSVEZMQUcsMzIwLDI0MCwxNiwwfSwKKwl7QlBTOHxDT0w4MCw2NDAsNDgwLDgsWEJJT1NNT0RFX0MyUH0sCisJe0JQUzh8Q09MODB8VkVSVEZMQUcsNjQwLDI0MCw4LFhCSU9TTU9ERV9DMlB9LAorCXtCUFM4LDMyMCw0ODAsOCxYQklPU01PREVfQzJQfSwKKwl7QlBTOHxWRVJURkxBRywzMjAsMjQwLDgsWEJJT1NNT0RFX0MyUH0KK307CisKKy8qIFhiaW9zIGRyaXZlciBib290c3RyYXAgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgWEJJT1NfQXZhaWxhYmxlKHZvaWQpCit7CisJbG9uZyBjb29raWVfdmRvLCAvKmNvb2tpZV9taWwsKi8gY29va2llX2hhZGUsIGNvb2tpZV9zY3BuOworCWxvbmcgY29va2llX2Z2ZGk7CisJY29uc3QgY2hhciAqZW52ciA9IFNETF9nZXRlbnYoIlNETF9WSURFT0RSSVZFUiIpOworCisJLyogTWlsYW4vSGFkZXMgQXRhcmkgY2xvbmVzIGRvIG5vdCBoYXZlIGFuIEF0YXJpIHZpZGVvIGNoaXAgKi8KKwlpZiAoIC8qKEdldGNvb2tpZShDX19NSUwsICZjb29raWVfbWlsKSA9PSBDX0ZPVU5EKSB8fCovCisJCShHZXRjb29raWUoQ19oYWRlLCAmY29va2llX2hhZGUpID09IENfRk9VTkQpICkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBmVkRJIG1lYW5zIGdyYXBoaWMgY2FyZCwgc28gbm8gWGJpb3Mgd2l0aCBpdCAqLworCWlmIChHZXRjb29raWUoQ19mVkRJLCAmY29va2llX2Z2ZGkpID09IENfRk9VTkQpIHsKKwkJaWYgKCFlbnZyKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoU0RMX3N0cmNtcChlbnZyLCBYQklPU19WSURfRFJJVkVSX05BTUUpIT0wKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBFeGNlcHQgaWYgd2UgZm9yY2UgWGJpb3MgdXNhZ2UsIHRocm91Z2ggZW52IHZhciAqLworCX0KKworCS8qIENvb2tpZSBfVkRPIHByZXNlbnQgPyBpZiBub3QsIGFzc3VtZSBTVCBtYWNoaW5lICovCisJaWYgKEdldGNvb2tpZShDX19WRE8sICZjb29raWVfdmRvKSAhPSBDX0ZPVU5EKSB7CisJCWNvb2tpZV92ZG8gPSBWRE9fU1QgPDwgMTY7CisJfQorCisJLyogVGVzdCBpZiB3ZSBoYXZlIGEgbW9ub2Nocm9tZSBtb25pdG9yIHBsdWdnZWQgaW4gKi8KKwlzd2l0Y2goIGNvb2tpZV92ZG8gPj4xNikgeworCQljYXNlIFZET19TVDoKKwkJY2FzZSBWRE9fU1RFOgorCQkJaWYgKCBHZXRyZXooKSA9PSAoU1RfSElHSD4+OCkgKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCWNhc2UgVkRPX1RUOgorCQkJaWYgKCAoRWdldFNoaWZ0KCkgJiBFU19NT0RFKSA9PSBUVF9ISUdIKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCWNhc2UgVkRPX0YzMDoKKwkJCWlmICggVmdldE1vbml0b3IoKSA9PSBNT05JVE9SX01PTk8pCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoR2V0Y29va2llKENfU0NQTiwgJmNvb2tpZV9zY3BuKSA9PSBDX0ZPVU5EKSB7CisJCQkJaWYgKCFTRExfWEJJT1NfU0IzVXNhYmxlKChzY3BuX2Nvb2tpZV90ICopY29va2llX3NjcG4pKSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFZET19NSUxBTjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIFhCSU9TX0RlbGV0ZURldmljZShTRExfVmlkZW9EZXZpY2UgKmRldmljZSkKK3sKKwlTRExfZnJlZShkZXZpY2UtPmhpZGRlbik7CisJU0RMX2ZyZWUoZGV2aWNlKTsKK30KKworc3RhdGljIFNETF9WaWRlb0RldmljZSAqWEJJT1NfQ3JlYXRlRGV2aWNlKGludCBkZXZpbmRleCkKK3sKKwlTRExfVmlkZW9EZXZpY2UgKmRldmljZTsKKworCS8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCisJZGV2aWNlID0gKFNETF9WaWRlb0RldmljZSAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9WaWRlb0RldmljZSkpOworCWlmICggZGV2aWNlICkgeworCQlTRExfbWVtc2V0KGRldmljZSwgMCwgKHNpemVvZiAqZGV2aWNlKSk7CisJCWRldmljZS0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZVZpZGVvRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5oaWRkZW4pKTsKKwkJZGV2aWNlLT5nbF9kYXRhID0gKHN0cnVjdCBTRExfUHJpdmF0ZUdMRGF0YSAqKQorCQkJCVNETF9tYWxsb2MoKHNpemVvZiAqZGV2aWNlLT5nbF9kYXRhKSk7CisJfQorCWlmICggKGRldmljZSA9PSBOVUxMKSB8fCAoZGV2aWNlLT5oaWRkZW4gPT0gTlVMTCkgKSB7CisJCVNETF9PdXRPZk1lbW9yeSgpOworCQlpZiAoIGRldmljZSApIHsKKwkJCVNETF9mcmVlKGRldmljZSk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwlTRExfbWVtc2V0KGRldmljZS0+aGlkZGVuLCAwLCAoc2l6ZW9mICpkZXZpY2UtPmhpZGRlbikpOworCVNETF9tZW1zZXQoZGV2aWNlLT5nbF9kYXRhLCAwLCBzaXplb2YoKmRldmljZS0+Z2xfZGF0YSkpOworCisJLyogVmlkZW8gZnVuY3Rpb25zICovCisJZGV2aWNlLT5WaWRlb0luaXQgPSBYQklPU19WaWRlb0luaXQ7CisJZGV2aWNlLT5MaXN0TW9kZXMgPSBYQklPU19MaXN0TW9kZXM7CisJZGV2aWNlLT5TZXRWaWRlb01vZGUgPSBYQklPU19TZXRWaWRlb01vZGU7CisJZGV2aWNlLT5TZXRDb2xvcnMgPSBYQklPU19TZXRDb2xvcnM7CisJZGV2aWNlLT5VcGRhdGVSZWN0cyA9IE5VTEw7CisJZGV2aWNlLT5WaWRlb1F1aXQgPSBYQklPU19WaWRlb1F1aXQ7CisJZGV2aWNlLT5BbGxvY0hXU3VyZmFjZSA9IFhCSU9TX0FsbG9jSFdTdXJmYWNlOworCWRldmljZS0+TG9ja0hXU3VyZmFjZSA9IFhCSU9TX0xvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5VbmxvY2tIV1N1cmZhY2UgPSBYQklPU19VbmxvY2tIV1N1cmZhY2U7CisJZGV2aWNlLT5GbGlwSFdTdXJmYWNlID0gWEJJT1NfRmxpcEhXU3VyZmFjZTsKKwlkZXZpY2UtPkZyZWVIV1N1cmZhY2UgPSBYQklPU19GcmVlSFdTdXJmYWNlOworCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCS8qIE9wZW5HTCBmdW5jdGlvbnMgKi8KKwlkZXZpY2UtPkdMX0xvYWRMaWJyYXJ5ID0gU0RMX0F0YXJpR0xfTG9hZExpYnJhcnk7CisJZGV2aWNlLT5HTF9HZXRQcm9jQWRkcmVzcyA9IFNETF9BdGFyaUdMX0dldFByb2NBZGRyZXNzOworCWRldmljZS0+R0xfR2V0QXR0cmlidXRlID0gU0RMX0F0YXJpR0xfR2V0QXR0cmlidXRlOworCWRldmljZS0+R0xfTWFrZUN1cnJlbnQgPSBTRExfQXRhcmlHTF9NYWtlQ3VycmVudDsKKwlkZXZpY2UtPkdMX1N3YXBCdWZmZXJzID0gWEJJT1NfR0xfU3dhcEJ1ZmZlcnM7CisjZW5kaWYKKworCS8qIEV2ZW50cyAqLworCWRldmljZS0+SW5pdE9TS2V5bWFwID0gQXRhcmlfSW5pdE9TS2V5bWFwOworCWRldmljZS0+UHVtcEV2ZW50cyA9IEF0YXJpX1B1bXBFdmVudHM7CisKKwlkZXZpY2UtPmZyZWUgPSBYQklPU19EZWxldGVEZXZpY2U7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCitWaWRlb0Jvb3RTdHJhcCBYQklPU19ib290c3RyYXAgPSB7CisJWEJJT1NfVklEX0RSSVZFUl9OQU1FLCAiQXRhcmkgWGJpb3MgZHJpdmVyIiwKKwlYQklPU19BdmFpbGFibGUsIFhCSU9TX0NyZWF0ZURldmljZQorfTsKKwordm9pZCBTRExfWEJJT1NfQWRkTW9kZShfVEhJUywgaW50IGFjdHVhbGx5X2FkZCwgY29uc3QgeGJpb3Ntb2RlX3QgKm1vZGVpbmZvKQoreworCWludCBpID0gMDsKKworCXN3aXRjaChtb2RlaW5mby0+ZGVwdGgpIHsKKwkJY2FzZSAxNToKKwkJY2FzZSAxNjoKKwkJCWkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQlpID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJaSA9IDM7CisJCQlicmVhazsKKwl9CisKKwlpZiAoIGFjdHVhbGx5X2FkZCApIHsKKwkJU0RMX1JlY3Qgc2F2ZWRfcmVjdFsyXTsKKwkJeGJpb3Ntb2RlX3Qgc2F2ZWRfbW9kZVsyXTsKKwkJaW50IGIsIGo7CisKKwkJLyogQWRkIHRoZSBtb2RlLCBzb3J0ZWQgbGFyZ2VzdCB0byBzbWFsbGVzdCAqLworCQliID0gMDsKKwkJaiA9IDA7CisJCXdoaWxlICggKFNETF9tb2RlbGlzdFtpXVtqXS0+dyA+IG1vZGVpbmZvLT53aWR0aCkgfHwKKwkJCShTRExfbW9kZWxpc3RbaV1bal0tPmggPiBtb2RlaW5mby0+aGVpZ2h0KSApIHsKKwkJCSsrajsKKwkJfQorCQkvKiBTa2lwIG1vZGVzIHRoYXQgYXJlIGFscmVhZHkgaW4gb3VyIGxpc3QgKi8KKwkJaWYgKCAoU0RMX21vZGVsaXN0W2ldW2pdLT53ID09IG1vZGVpbmZvLT53aWR0aCkgJiYKKwkJICAgICAoU0RMX21vZGVsaXN0W2ldW2pdLT5oID09IG1vZGVpbmZvLT5oZWlnaHQpICkgeworCQkJcmV0dXJuOworCQl9CisJCS8qIEluc2VydCB0aGUgbmV3IG1vZGUgKi8KKwkJc2F2ZWRfcmVjdFtiXSA9ICpTRExfbW9kZWxpc3RbaV1bal07CisJCVNETF9tZW1jcHkoJnNhdmVkX21vZGVbYl0sIFNETF94Ymlvc21vZGVbaV1bal0sIHNpemVvZih4Ymlvc21vZGVfdCkpOworCQlTRExfbW9kZWxpc3RbaV1bal0tPncgPSBtb2RlaW5mby0+d2lkdGg7CisJCVNETF9tb2RlbGlzdFtpXVtqXS0+aCA9IG1vZGVpbmZvLT5oZWlnaHQ7CisJCVNETF9tZW1jcHkoU0RMX3hiaW9zbW9kZVtpXVtqXSwgbW9kZWluZm8sIHNpemVvZih4Ymlvc21vZGVfdCkpOworCQkvKiBFdmVyeWJvZHkgc2Nvb3QgZG93biEgKi8KKwkJaWYgKCBzYXZlZF9yZWN0W2JdLncgJiYgc2F2ZWRfcmVjdFtiXS5oICkgeworCQkgICAgZm9yICggKytqOyBTRExfbW9kZWxpc3RbaV1bal0tPnc7ICsraiApIHsKKwkJCXNhdmVkX3JlY3RbIWJdID0gKlNETF9tb2RlbGlzdFtpXVtqXTsKKwkJCW1lbWNweSgmc2F2ZWRfbW9kZVshYl0sIFNETF94Ymlvc21vZGVbaV1bal0sIHNpemVvZih4Ymlvc21vZGVfdCkpOworCQkJKlNETF9tb2RlbGlzdFtpXVtqXSA9IHNhdmVkX3JlY3RbYl07CisJCQlTRExfbWVtY3B5KFNETF94Ymlvc21vZGVbaV1bal0sICZzYXZlZF9tb2RlW2JdLCBzaXplb2YoeGJpb3Ntb2RlX3QpKTsKKwkJCWIgPSAhYjsKKwkJICAgIH0KKwkJICAgICpTRExfbW9kZWxpc3RbaV1bal0gPSBzYXZlZF9yZWN0W2JdOworCQkgICAgU0RMX21lbWNweShTRExfeGJpb3Ntb2RlW2ldW2pdLCAmc2F2ZWRfbW9kZVtiXSwgc2l6ZW9mKHhiaW9zbW9kZV90KSk7CisJCX0KKwl9IGVsc2UgeworCQkrK1NETF9udW1tb2Rlc1tpXTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFhCSU9TX0xpc3RTVE1vZGVzKF9USElTLCBpbnQgYWN0dWFsbHlfYWRkKQoreworCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIGFjdHVhbGx5X2FkZCwgJnN0bW9kZXNbMF0pOworfQorCitzdGF0aWMgdm9pZCBYQklPU19MaXN0VFRNb2RlcyhfVEhJUywgaW50IGFjdHVhbGx5X2FkZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPDI7IGkrKykgeworCQlTRExfWEJJT1NfQWRkTW9kZSh0aGlzLCBhY3R1YWxseV9hZGQsICZ0dG1vZGVzW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFhCSU9TX0xpc3RGYWxjb25SZ2JNb2RlcyhfVEhJUywgaW50IGFjdHVhbGx5X2FkZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwkJeGJpb3Ntb2RlX3QgbW9kZWluZm87CisKKwkJU0RMX21lbWNweSgmbW9kZWluZm8sICZmYWxjb25yZ2Jtb2Rlc1tpXSwgc2l6ZW9mKHhiaW9zbW9kZV90KSk7CisJCW1vZGVpbmZvLm51bWJlciAmPSB+KFZHQXxQQUwpOworCQltb2RlaW5mby5udW1iZXIgfD0gWEJJT1Nfb2xkdm1vZGUgJiAoVkdBfFBBTCk7CisKKwkJU0RMX1hCSU9TX0FkZE1vZGUodGhpcywgYWN0dWFsbHlfYWRkLCAmbW9kZWluZm8pOworCX0KK30KKworc3RhdGljIHZvaWQgWEJJT1NfTGlzdEZhbGNvblZnYU1vZGVzKF9USElTLCBpbnQgYWN0dWFsbHlfYWRkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8NjsgaSsrKSB7CisJCXhiaW9zbW9kZV90IG1vZGVpbmZvOworCisJCVNETF9tZW1jcHkoJm1vZGVpbmZvLCAmZmFsY29udmdhbW9kZXNbaV0sIHNpemVvZih4Ymlvc21vZGVfdCkpOworCQltb2RlaW5mby5udW1iZXIgJj0gfihWR0F8UEFMKTsKKwkJbW9kZWluZm8ubnVtYmVyIHw9IFhCSU9TX29sZHZtb2RlICYgKFZHQXxQQUwpOworCisJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIGFjdHVhbGx5X2FkZCwgJm1vZGVpbmZvKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgWEJJT1NfVmlkZW9Jbml0KF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKnZmb3JtYXQpCit7CisJaW50IGk7CisJbG9uZyBjb29raWVfYmxvdywgY29va2llX3NjcG4sIGNvb2tpZV9jbnRzOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdmFyaWFibGVzIHRoYXQgd2UgY2xlYW4gb24gc2h1dGRvd24gKi8KKwlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgeworCQlTRExfbnVtbW9kZXNbaV0gPSAwOworCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOworCQlTRExfeGJpb3Ntb2RlW2ldID0gTlVMTDsKKwl9CisKKwkvKiBDb29raWUgX1ZETyBwcmVzZW50ID8gaWYgbm90LCBhc3N1bWUgU1QgbWFjaGluZSAqLworCWlmIChHZXRjb29raWUoQ19fVkRPLCAmWEJJT1NfY3ZkbykgIT0gQ19GT1VORCkgeworCQlYQklPU19jdmRvID0gVkRPX1NUIDw8IDE2OworCX0KKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb2xkIHBhbGV0dGUgKi8KKwlYQklPU19vbGRwYWxldHRlID0gKHZvaWQgKilTRExfbWFsbG9jKDI1NipzaXplb2YobG9uZykpOworCWlmICggIVhCSU9TX29sZHBhbGV0dGUgKSB7CisJCVNETF9TZXRFcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb2xkIHBhbGV0dGVcbiIpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIEluaXRpYWxpemUgdmlkZW8gbW9kZSBsaXN0ICovCisJLyogYW5kIHNhdmUgY3VycmVudCBzY3JlZW4gc3RhdHVzIChwYWxldHRlLCBzY3JlZW4gYWRkcmVzcywgdmlkZW8gbW9kZSkgKi8KKwlYQklPU19jZW50c2NyZWVuID0gU0RMX0ZBTFNFOworCVhCSU9TX29sZHZiYXNlID0gUGh5c2Jhc2UoKTsKKworCS8qIERldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSAqLworCXRoaXMtPmluZm8uY3VycmVudF93ID0gMDsKKwl0aGlzLT5pbmZvLmN1cnJlbnRfaCA9IDA7CisKKwkvKiBEZXRlcm1pbmUgdGhlIHNjcmVlbiBkZXB0aCAodXNlIGRlZmF1bHQgOC1iaXQgZGVwdGgpICovCisJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gODsKKworCS8qIEZpcnN0IGFsbG9jYXRlIHJvb20gZm9yIG5lZWRlZCB2aWRlbyBtb2RlcyAqLworCXN3aXRjaCAoWEJJT1NfY3ZkbyA+PjE2KSB7CisJCWNhc2UgVkRPX1NUOgorCQljYXNlIFZET19TVEU6CisJCQl7CisJCQkJc2hvcnQgKm9sZHBhbGV0dGU7CisJCQkKKwkJCQlYQklPU19vbGR2bW9kZT1HZXRyZXooKTsKKwkJCQlzd2l0Y2goWEJJT1Nfb2xkdm1vZGUgPDwgOCkgeworCQkJCQljYXNlIFNUX0xPVzoKKwkJCQkJCVhCSU9TX29sZG51bWNvbD0xNjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNUX01FRDoKKwkJCQkJCVhCSU9TX29sZG51bWNvbD00OworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU1RfSElHSDoKKwkJCQkJCVhCSU9TX29sZG51bWNvbD0yOworCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJb2xkcGFsZXR0ZT0gKHNob3J0ICopIFhCSU9TX29sZHBhbGV0dGU7CisJCQkJZm9yIChpPTA7aTxYQklPU19vbGRudW1jb2w7aSsrKSB7CisJCQkJCSpvbGRwYWxldHRlKys9U2V0Y29sb3IoaSwtMSk7CisJCQkJfQorCisJCQkJWEJJT1NfTGlzdFNUTW9kZXModGhpcywgMCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWRE9fVFQ6CisJCQlYQklPU19vbGR2bW9kZT1FZ2V0U2hpZnQoKTsKKworCQkJc3dpdGNoKFhCSU9TX29sZHZtb2RlICYgRVNfTU9ERSkgeworCQkJCWNhc2UgVFRfTE9XOgorCQkJCQlYQklPU19vbGRudW1jb2w9MjU2OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNUX0xPVzoKKwkJCQljYXNlIFRUX01FRDoKKwkJCQkJWEJJT1Nfb2xkbnVtY29sPTE2OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNUX01FRDoKKwkJCQkJWEJJT1Nfb2xkbnVtY29sPTQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1RfSElHSDoKKwkJCQljYXNlIFRUX0hJR0g6CisJCQkJCVhCSU9TX29sZG51bWNvbD0yOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChYQklPU19vbGRudW1jb2wpIHsKKwkJCQlFZ2V0UGFsZXR0ZSgwLCBYQklPU19vbGRudW1jb2wsIFhCSU9TX29sZHBhbGV0dGUpOworCQkJfQorCisJCQlYQklPU19MaXN0VFRNb2Rlcyh0aGlzLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFZET19GMzA6CisJCQlYQklPU19vbGR2bW9kZT1Wc2V0TW9kZSgtMSk7CisKKwkJCVhCSU9TX29sZG51bWNvbD0gMTw8ICgxIDw8IChYQklPU19vbGR2bW9kZSAmIE5VTUNPTFMpKTsKKwkJCWlmIChYQklPU19vbGRudW1jb2wgPiAyNTYpIHsKKwkJCQlYQklPU19vbGRudW1jb2wgPSAwOworCQkJfQorCQkJaWYgKFhCSU9TX29sZG51bWNvbCkgeworCQkJCVZnZXRSR0IoMCwgWEJJT1Nfb2xkbnVtY29sLCBYQklPU19vbGRwYWxldHRlKTsKKwkJCX0KKworCQkJdmZvcm1hdC0+Qml0c1BlclBpeGVsID0gMTY7CisKKwkJCS8qIFNjcmVlbkJsYXN0ZXIgMyA/ICovCisJCQlpZiAoR2V0Y29va2llKENfU0NQTiwgJmNvb2tpZV9zY3BuKSA9PSBDX0ZPVU5EKSB7CisJCQkJU0RMX1hCSU9TX0xpc3RTQjNNb2Rlcyh0aGlzLCAwLCAoc2Nwbl9jb29raWVfdCAqKWNvb2tpZV9zY3BuKTsKKwkJCX0gZWxzZQorCQkJLyogQ2VudHNjcmVlbiA/ICovCisJCQlpZiAoR2V0Y29va2llKENfQ05UUywgJmNvb2tpZV9jbnRzKSA9PSBDX0ZPVU5EKSB7CisJCQkJWEJJT1Nfb2xkdm1vZGUgPSBTRExfWEJJT1NfTGlzdENlbnRzY3JlZW5Nb2Rlcyh0aGlzLCAwKTsKKwkJCQlYQklPU19jZW50c2NyZWVuID0gU0RMX1RSVUU7CisJCQl9IGVsc2UKKwkJCS8qIFN0YW5kYXJkLCB3aXRoIG9yIHdpdGhvdXQgQmxvd3VwICovCisJCQl7CisJCQkJc3dpdGNoIChWZ2V0TW9uaXRvcigpKQorCQkJCXsKKwkJCQkJY2FzZSBNT05JVE9SX1JHQjoKKwkJCQkJY2FzZSBNT05JVE9SX1RWOgorCQkJCQkJWEJJT1NfTGlzdEZhbGNvblJnYk1vZGVzKHRoaXMsIDApOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgTU9OSVRPUl9WR0E6CisJCQkJCQlYQklPU19MaXN0RmFsY29uVmdhTW9kZXModGhpcywgMCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoR2V0Y29va2llKENfQkxPVywgJmNvb2tpZV9ibG93KSA9PSBDX0ZPVU5EKSB7CisJCQkJCVNETF9YQklPU19MaXN0Qmxvd3VwTW9kZXModGhpcywgMCwgKGJsb3dfY29va2llX3QgKiljb29raWVfYmxvdyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVkRPX01JTEFOOgorCQkJeworCQkJCVNDUkVFTklORk8gc2k7CisKKwkJCQkvKiBSZWFkIGluZm9zIGFib3V0IGN1cnJlbnQgbW9kZSAqLyAKKwkJCQlWc2V0U2NyZWVuKC0xLCAmWEJJT1Nfb2xkdm1vZGUsIE1JX01BR0lDLCBDTURfR0VUTU9ERSk7CisKKwkJCQlzaS5zaXplID0gc2l6ZW9mKFNDUkVFTklORk8pOworCQkJCXNpLmRldklEID0gWEJJT1Nfb2xkdm1vZGU7CisJCQkJc2kuc2NyRmxhZ3MgPSAwOworCQkJCVZzZXRTY3JlZW4oLTEsICZzaSwgTUlfTUFHSUMsIENNRF9HRVRJTkZPKTsKKworCQkJCXRoaXMtPmluZm8uY3VycmVudF93ID0gc2kuc2NyV2lkdGg7CisJCQkJdGhpcy0+aW5mby5jdXJyZW50X2ggPSBzaS5zY3JIZWlnaHQ7CisKKwkJCQlYQklPU19vbGRudW1jb2wgPSAwOworCQkJCWlmIChzaS5zY3JGbGFncyAmIFNDUklORk9fT0spIHsKKwkJCQkJaWYgKHNpLnNjclBsYW5lcyA8PSA4KSB7CisJCQkJCQlYQklPU19vbGRudW1jb2wgPSAxPDxzaS5zY3JQbGFuZXM7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKFhCSU9TX29sZG51bWNvbCkgeworCQkJCQlWZ2V0UkdCKDAsIFhCSU9TX29sZG51bWNvbCwgWEJJT1Nfb2xkcGFsZXR0ZSk7CisJCQkJfQorCisJCQkJU0RMX1hCSU9TX0xpc3RNaWxhbk1vZGVzKHRoaXMsIDApOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJZm9yICggaT0wOyBpPE5VTV9NT0RFTElTVFM7ICsraSApIHsKKwkJaW50IGo7CisKKwkJU0RMX3hiaW9zbW9kZVtpXSA9ICh4Ymlvc21vZGVfdCAqKikKKwkJCVNETF9tYWxsb2MoKFNETF9udW1tb2Rlc1tpXSsxKSpzaXplb2YoeGJpb3Ntb2RlX3QgKikpOworCQlpZiAoIFNETF94Ymlvc21vZGVbaV0gPT0gTlVMTCApIHsKKwkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCQlmb3IgKCBqPTA7IGo8U0RMX251bW1vZGVzW2ldOyArK2ogKSB7CisJCQlTRExfeGJpb3Ntb2RlW2ldW2pdPSh4Ymlvc21vZGVfdCAqKVNETF9tYWxsb2Moc2l6ZW9mKHhiaW9zbW9kZV90KSk7CisJCQlpZiAoIFNETF94Ymlvc21vZGVbaV1bal0gPT0gTlVMTCApIHsKKwkJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJfQorCQkJU0RMX21lbXNldChTRExfeGJpb3Ntb2RlW2ldW2pdLCAwLCBzaXplb2YoeGJpb3Ntb2RlX3QpKTsKKwkJfQorCQlTRExfeGJpb3Ntb2RlW2ldW2pdID0gTlVMTDsKKworCQlTRExfbW9kZWxpc3RbaV0gPSAoU0RMX1JlY3QgKiopCisJCQkJU0RMX21hbGxvYygoU0RMX251bW1vZGVzW2ldKzEpKnNpemVvZihTRExfUmVjdCAqKSk7CisJCWlmICggU0RMX21vZGVsaXN0W2ldID09IE5VTEwgKSB7CisJCQlTRExfT3V0T2ZNZW1vcnkoKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJZm9yICggaj0wOyBqPFNETF9udW1tb2Rlc1tpXTsgKytqICkgeworCQkJU0RMX21vZGVsaXN0W2ldW2pdPShTRExfUmVjdCAqKVNETF9tYWxsb2Moc2l6ZW9mKFNETF9SZWN0KSk7CisJCQlpZiAoIFNETF9tb2RlbGlzdFtpXVtqXSA9PSBOVUxMICkgeworCQkJCVNETF9PdXRPZk1lbW9yeSgpOworCQkJCXJldHVybigtMSk7CisJCQl9CisJCQlTRExfbWVtc2V0KFNETF9tb2RlbGlzdFtpXVtqXSwgMCwgc2l6ZW9mKFNETF9SZWN0KSk7CisJCX0KKwkJU0RMX21vZGVsaXN0W2ldW2pdID0gTlVMTDsKKwl9CisKKwkvKiBOb3cgZmlsbCB0aGUgbW9kZSBsaXN0ICovCisJc3dpdGNoIChYQklPU19jdmRvID4+MTYpIHsKKwkJY2FzZSBWRE9fU1Q6CisJCWNhc2UgVkRPX1NURToKKwkJCVhCSU9TX0xpc3RTVE1vZGVzKHRoaXMsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgVkRPX1RUOgorCQkJWEJJT1NfTGlzdFRUTW9kZXModGhpcywgMSk7CisJCQlicmVhazsKKwkJY2FzZSBWRE9fRjMwOgorCQkJLyogU2NyZWVuQmxhc3RlciAzID8gKi8KKwkJCWlmIChHZXRjb29raWUoQ19TQ1BOLCAmY29va2llX3NjcG4pID09IENfRk9VTkQpIHsKKwkJCQlTRExfWEJJT1NfTGlzdFNCM01vZGVzKHRoaXMsIDEsIChzY3BuX2Nvb2tpZV90ICopY29va2llX3NjcG4pOworCQkJfSBlbHNlCisJCQkvKiBDZW50c2NyZWVuID8gKi8KKwkJCWlmIChHZXRjb29raWUoQ19DTlRTLCAmY29va2llX2NudHMpID09IENfRk9VTkQpIHsKKwkJCQlYQklPU19vbGR2bW9kZSA9IFNETF9YQklPU19MaXN0Q2VudHNjcmVlbk1vZGVzKHRoaXMsIDEpOworCQkJCVhCSU9TX2NlbnRzY3JlZW4gPSBTRExfVFJVRTsKKwkJCX0gZWxzZQorCQkJLyogU3RhbmRhcmQsIHdpdGggb3Igd2l0aG91dCBCbG93dXAgKi8KKwkJCXsKKwkJCQlzd2l0Y2ggKFZnZXRNb25pdG9yKCkpCisJCQkJeworCQkJCQljYXNlIE1PTklUT1JfUkdCOgorCQkJCQljYXNlIE1PTklUT1JfVFY6CisJCQkJCQlYQklPU19MaXN0RmFsY29uUmdiTW9kZXModGhpcywgMSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBNT05JVE9SX1ZHQToKKwkJCQkJCVhCSU9TX0xpc3RGYWxjb25WZ2FNb2Rlcyh0aGlzLCAxKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChHZXRjb29raWUoQ19CTE9XLCAmY29va2llX2Jsb3cpID09IENfRk9VTkQpIHsKKwkJCQkJU0RMX1hCSU9TX0xpc3RCbG93dXBNb2Rlcyh0aGlzLCAxLCAoYmxvd19jb29raWVfdCAqKWNvb2tpZV9ibG93KTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWRE9fTUlMQU46CisJCQlTRExfWEJJT1NfTGlzdE1pbGFuTW9kZXModGhpcywgMSk7CisJCQlicmVhazsKKwl9CisKKwlYQklPU19zY3JlZW5zWzBdPU5VTEw7CisJWEJJT1Nfc2NyZWVuc1sxXT1OVUxMOworCVhCSU9TX3NoYWRvd3NjcmVlbj1OVUxMOworCisJLyogVXBkYXRlIGhhcmR3YXJlIGluZm8gKi8KKwl0aGlzLT5pbmZvLmh3X2F2YWlsYWJsZSA9IDE7CisJdGhpcy0+aW5mby52aWRlb19tZW0gPSAoVWludDMyKSBBdGFyaV9TeXNNYWxsb2MoLTFMLCBNWF9TVFJBTSk7CisKKwkvKiBJbml0IGNodW5reSB0byBwbGFuYXIgcm91dGluZSAqLworCVNETF9BdGFyaV9DMnBDb252ZXJ0ID0gU0RMX0F0YXJpX0MycENvbnZlcnQ4OworCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCVNETF9BdGFyaUdMX0luaXRQb2ludGVycyh0aGlzKTsKKyNlbmRpZgorCisJLyogRGlzYWJsZSBzY3JlZW5zYXZlcnMgKi8KKwlpZiAoU0RMX1hCSU9TX1R2ZWlsbGVQcmVzZW50KHRoaXMpKSB7CisJCVNETF9YQklPU19UdmVpbGxlRGlzYWJsZSh0aGlzKTsKKwl9CisKKwkvKiBXZSdyZSBkb25lISAqLworCXJldHVybigwKTsKK30KKworc3RhdGljIFNETF9SZWN0ICoqWEJJT1NfTGlzdE1vZGVzKF9USElTLCBTRExfUGl4ZWxGb3JtYXQgKmZvcm1hdCwgVWludDMyIGZsYWdzKQoreworCXJldHVybihTRExfbW9kZWxpc3RbKChmb3JtYXQtPkJpdHNQZXJQaXhlbCs3KS84KS0xXSk7Cit9CisKK3N0YXRpYyB2b2lkIFhCSU9TX0ZyZWVCdWZmZXJzKF9USElTKQoreworCWludCBpOworCisJZm9yIChpPTA7aTwyO2krKykgeworCQlpZiAoWEJJT1Nfc2NyZWVuc21lbVtpXSE9TlVMTCkgeworCQkJaWYgKChYQklPU19jdmRvPj4xNikgPT0gVkRPX01JTEFOKSB7CisJCQkJaWYgKGk9PTEpIHsKKwkJCQkJVnNldFNjcmVlbigtMSwgLTEsIE1JX01BR0lDLCBDTURfRlJFRVBBR0UpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJTWZyZWUoWEJJT1Nfc2NyZWVuc21lbVtpXSk7CisJCQl9CisJCQlYQklPU19zY3JlZW5zbWVtW2ldPU5VTEw7CisJCX0KKwl9CisKKwlpZiAoWEJJT1Nfc2hhZG93c2NyZWVuIT1OVUxMKSB7CisJCU1mcmVlKFhCSU9TX3NoYWRvd3NjcmVlbik7CisJCVhCSU9TX3NoYWRvd3NjcmVlbj1OVUxMOworCX0KK30KKworc3RhdGljIFNETF9TdXJmYWNlICpYQklPU19TZXRWaWRlb01vZGUoX1RISVMsIFNETF9TdXJmYWNlICpjdXJyZW50LAorCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwgVWludDMyIGZsYWdzKQoreworCWludCBtb2RlLCBuZXdfZGVwdGg7CisJaW50IGksIG51bV9idWZmZXJzOworCXhiaW9zbW9kZV90ICpuZXdfdmlkZW9fbW9kZTsKKwlVaW50MzIgbmV3X3NjcmVlbl9zaXplOworCVVpbnQzMiBtb2RlZmxhZ3M7CisKKwkvKiBGcmVlIGN1cnJlbnQgYnVmZmVycyAqLworCVhCSU9TX0ZyZWVCdWZmZXJzKHRoaXMpOworCisJLyogVHJ5IHRvIHNldCB0aGUgcmVxdWVzdGVkIGxpbmVhciB2aWRlbyBtb2RlICovCisJYnBwID0gKGJwcCs3KS84LTE7CisJZm9yICggbW9kZT0wOyBTRExfbW9kZWxpc3RbYnBwXVttb2RlXTsgKyttb2RlICkgeworCQlpZiAoIChTRExfbW9kZWxpc3RbYnBwXVttb2RlXS0+dyA9PSB3aWR0aCkgJiYKKwkJICAgICAoU0RMX21vZGVsaXN0W2JwcF1bbW9kZV0tPmggPT0gaGVpZ2h0KSApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICggU0RMX21vZGVsaXN0W2JwcF1bbW9kZV0gPT0gTlVMTCApIHsKKwkJU0RMX1NldEVycm9yKCJDb3VsZG4ndCBmaW5kIHJlcXVlc3RlZCBtb2RlIGluIGxpc3QiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwluZXdfdmlkZW9fbW9kZSA9IFNETF94Ymlvc21vZGVbYnBwXVttb2RlXTsKKworCW1vZGVmbGFncyA9IFNETF9GVUxMU0NSRUVOIHwgU0RMX1BSRUFMTE9DOworCisJLyogQWxsb2NhdGUgbmVlZGVkIGJ1ZmZlcnM6IHNpbXBsZS9kb3VibGUgYnVmZmVyIGFuZCBzaGFkb3cgc3VyZmFjZSAqLworCW5ld19kZXB0aCA9IG5ld192aWRlb19tb2RlLT5kZXB0aDsKKwlpZiAobmV3X2RlcHRoID09IDQpIHsKKwkJU0RMX0F0YXJpX0MycENvbnZlcnQgPSBTRExfQXRhcmlfQzJwQ29udmVydDQ7CisJCW5ld19kZXB0aD04OworCQltb2RlZmxhZ3MgfD0gU0RMX1NXU1VSRkFDRXxTRExfSFdQQUxFVFRFOworCX0gZWxzZSBpZiAobmV3X2RlcHRoID09IDgpIHsKKwkJU0RMX0F0YXJpX0MycENvbnZlcnQgPSBTRExfQXRhcmlfQzJwQ29udmVydDg7CisJCW1vZGVmbGFncyB8PSBTRExfU1dTVVJGQUNFfFNETF9IV1BBTEVUVEU7CisJfSBlbHNlIHsKKwkJbW9kZWZsYWdzIHw9IFNETF9IV1NVUkZBQ0U7CisJfQorCisJbmV3X3NjcmVlbl9zaXplID0gd2lkdGggKiBoZWlnaHQgKiAoKG5ld19kZXB0aCk+PjMpOworCW5ld19zY3JlZW5fc2l6ZSArPSAyNTY7IC8qIFRvIGFsaWduIG9uIGEgMjU2IGJ5dGUgYWRyZXNzICovCQorCisJaWYgKG5ld192aWRlb19tb2RlLT5mbGFncyAmIFhCSU9TTU9ERV9DMlApIHsKKwkJWEJJT1Nfc2hhZG93c2NyZWVuID0gQXRhcmlfU3lzTWFsbG9jKG5ld19zY3JlZW5fc2l6ZSwgTVhfUFJFRlRUUkFNKTsKKworCQlpZiAoWEJJT1Nfc2hhZG93c2NyZWVuID09IE5VTEwpIHsKKwkJCVNETF9TZXRFcnJvcigiQ2FuIG5vdCBhbGxvY2F0ZSAlZCBLQiBmb3Igc2hhZG93IGJ1ZmZlciIsIG5ld19zY3JlZW5fc2l6ZT4+MTApOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQlTRExfbWVtc2V0KFhCSU9TX3NoYWRvd3NjcmVlbiwgMCwgbmV3X3NjcmVlbl9zaXplKTsKKwl9CisKKwkvKiBPdXRwdXQgYnVmZmVyIG5lZWRzIHRvIGJlIHR3aWNlIGluIHNpemUgZm9yIHRoZSBzb2Z0d2FyZSBkb3VibGUtbGluZSBtb2RlICovCisJaWYgKG5ld192aWRlb19tb2RlLT5mbGFncyAmIFhCSU9TTU9ERV9ET1VCTEVMSU5FKSB7CisJCW5ld19zY3JlZW5fc2l6ZSA8PD0gMTsKKwl9CisKKwkvKiBEb3VibGUgYnVmZmVyID8gKi8KKwludW1fYnVmZmVycyA9IDE7CisKKyNpZiBTRExfVklERU9fT1BFTkdMCisJaWYgKGZsYWdzICYgU0RMX09QRU5HTCkgeworCQlpZiAodGhpcy0+Z2xfY29uZmlnLmRvdWJsZV9idWZmZXIpIHsKKwkJCWZsYWdzIHw9IFNETF9ET1VCTEVCVUY7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoKGZsYWdzICYgU0RMX0RPVUJMRUJVRikgJiYgKChYQklPU19jdmRvPj4xNikgIT0gVkRPX01JTEFOKSkgeworCQludW1fYnVmZmVycyA9IDI7CisJCW1vZGVmbGFncyB8PSBTRExfRE9VQkxFQlVGOworCX0KKworCS8qIEFsbG9jYXRlIGJ1ZmZlcnMgKi8KKwlmb3IgKGk9MDsgaTxudW1fYnVmZmVyczsgaSsrKSB7CisJCWlmICgoWEJJT1NfY3Zkbz4+MTYpID09IFZET19NSUxBTikgeworCQkJaWYgKGk9PTApIHsKKwkJCQlYQklPU19zY3JlZW5zbWVtW2ldID0gWEJJT1Nfb2xkdmJhc2U7CisJCQl9IGVsc2UgeworCQkJCVZzZXRTY3JlZW4oLTEsICZYQklPU19zY3JlZW5zbWVtW2ldLCBNSV9NQUdJQywgQ01EX0FMTE9DUEFHRSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlYQklPU19zY3JlZW5zbWVtW2ldID0gQXRhcmlfU3lzTWFsbG9jKG5ld19zY3JlZW5fc2l6ZSwgTVhfU1RSQU0pOworCQl9CisKKwkJaWYgKFhCSU9TX3NjcmVlbnNtZW1baV09PU5VTEwpIHsKKwkJCVhCSU9TX0ZyZWVCdWZmZXJzKHRoaXMpOworCQkJU0RMX1NldEVycm9yKCJDYW4gbm90IGFsbG9jYXRlICVkIEtCIGZvciBidWZmZXIgJWQiLCBuZXdfc2NyZWVuX3NpemU+PjEwLCBpKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJU0RMX21lbXNldChYQklPU19zY3JlZW5zbWVtW2ldLCAwLCBuZXdfc2NyZWVuX3NpemUpOworCisJCVhCSU9TX3NjcmVlbnNbaV09KHZvaWQgKikgKCggKGxvbmcpIFhCSU9TX3NjcmVlbnNtZW1baV0rMjU2KSAmIDB4RkZGRkZGMDBVTCk7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgZm9yIHRoZSBzY3JlZW4gKi8KKwlpZiAoICEgU0RMX1JlYWxsb2NGb3JtYXQoY3VycmVudCwgbmV3X2RlcHRoLCAwLCAwLCAwLCAwKSApIHsKKwkJWEJJT1NfRnJlZUJ1ZmZlcnModGhpcyk7CisJCVNETF9TZXRFcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgbmV3IHBpeGVsIGZvcm1hdCBmb3IgcmVxdWVzdGVkIG1vZGUiKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCVhCSU9TX2N1cnJlbnQgPSBuZXdfdmlkZW9fbW9kZTsKKwljdXJyZW50LT53ID0gd2lkdGg7CisJY3VycmVudC0+aCA9IGhlaWdodDsKKwljdXJyZW50LT5waXRjaCA9ICh3aWR0aCAqIG5ld19kZXB0aCk+PjM7CisKKwkvKiB0aGlzIGlzIGZvciBDMlAgY29udmVyc2lvbiAqLworCVhCSU9TX3BpdGNoID0gKG5ld192aWRlb19tb2RlLT53aWR0aCAqIG5ld192aWRlb19tb2RlLT5kZXB0aCk+PjM7CisKKwlpZiAobmV3X3ZpZGVvX21vZGUtPmZsYWdzICYgWEJJT1NNT0RFX0MyUCkKKwkJY3VycmVudC0+cGl4ZWxzID0gWEJJT1Nfc2hhZG93c2NyZWVuOworCWVsc2UKKwkJY3VycmVudC0+cGl4ZWxzID0gWEJJT1Nfc2NyZWVuc1swXTsKKworCVhCSU9TX2ZibnVtID0gMDsKKworI2lmIFNETF9WSURFT19PUEVOR0wKKwlpZiAoZmxhZ3MgJiBTRExfT1BFTkdMKSB7CisJCWlmICghU0RMX0F0YXJpR0xfSW5pdCh0aGlzLCBjdXJyZW50KSkgeworCQkJWEJJT1NfRnJlZUJ1ZmZlcnModGhpcyk7CisJCQlTRExfU2V0RXJyb3IoIkNhbiBub3QgY3JlYXRlIE9wZW5HTCBjb250ZXh0Iik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1vZGVmbGFncyB8PSBTRExfT1BFTkdMOworCX0KKyNlbmRpZgorCisJY3VycmVudC0+ZmxhZ3MgPSBtb2RlZmxhZ3M7CisKKyNpZm5kZWYgREVCVUdfVklERU9fWEJJT1MKKwkvKiBOb3cgc2V0IHRoZSB2aWRlbyBtb2RlICovCisJaWYgKChYQklPU19jdmRvPj4xNikgPT0gVkRPX01JTEFOKSB7CisJCVZzZXRTY3JlZW4oLTEsIFhCSU9TX3NjcmVlbnNbMF0sIE1JX01BR0lDLCBDTURfU0VUQURSKTsKKwl9IGVsc2UgeworCQlTZXRzY3JlZW4oLTEsWEJJT1Nfc2NyZWVuc1swXSwtMSk7CisJfQorCisJc3dpdGNoKFhCSU9TX2N2ZG8gPj4gMTYpIHsKKwkJY2FzZSBWRE9fU1Q6CisJCQlTZXRzY3JlZW4oLTEsLTEsbmV3X3ZpZGVvX21vZGUtPm51bWJlcik7CisKKwkJCS8qIFJlc2V0IHBhbGV0dGUgKi8KKwkJCWZvciAoaT0wO2k8MTY7aSsrKSB7CisJCQkJVFRfcGFsZXR0ZVtpXT0gKChpPj4xKTw8OCkgfCAoKChpKjgpLzE3KTw8NCkgfCAoaT4+MSk7CisJCQl9CisJCQlTZXRwYWxldHRlKFRUX3BhbGV0dGUpOworCQkJYnJlYWs7CisJCWNhc2UgVkRPX1NURToKKwkJCVNldHNjcmVlbigtMSwtMSxuZXdfdmlkZW9fbW9kZS0+bnVtYmVyKTsKKworCQkJLyogUmVzZXQgcGFsZXR0ZSAqLworCQkJZm9yIChpPTA7aTwxNjtpKyspCisJCQl7CisJCQkJaW50IGM7CisKKwkJCQljPSgoaSYxKTw8Myl8KChpPj4xKSY3KTsKKwkJCQlUVF9wYWxldHRlW2ldPShjPDw4KXwoYzw8NCl8YzsKKwkJCX0KKwkJCVNldHBhbGV0dGUoVFRfcGFsZXR0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBWRE9fVFQ6CisJCQlFc2V0U2hpZnQobmV3X3ZpZGVvX21vZGUtPm51bWJlcik7CisJCQlicmVhazsKKwkJY2FzZSBWRE9fRjMwOgorCQkJaWYgKFhCSU9TX2NlbnRzY3JlZW4pIHsKKwkJCQlTRExfWEJJT1NfQ2VudHNjcmVlblNldG1vZGUodGhpcywgd2lkdGgsIGhlaWdodCwgbmV3X2RlcHRoKTsKKwkJCX0gZWxzZSB7CisJCQkJVnNldE1vZGUobmV3X3ZpZGVvX21vZGUtPm51bWJlcik7CisJCQl9CisKKwkJCS8qIFNldCBoYXJkd2FyZSBwYWxldHRlIHRvIGJsYWNrIGluIFRydWUgQ29sb3VyICovCisJCQlpZiAobmV3X2RlcHRoID4gOCkgeworCQkJCVNETF9tZW1zZXQoRjMwX3BhbGV0dGUsIDAsIHNpemVvZihGMzBfcGFsZXR0ZSkpOworCQkJCVZzZXRSR0IoMCwyNTYsRjMwX3BhbGV0dGUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVkRPX01JTEFOOgorCQkJVnNldFNjcmVlbigtMSwgbmV3X3ZpZGVvX21vZGUtPm51bWJlciwgTUlfTUFHSUMsIENNRF9TRVRNT0RFKTsKKworCQkJLyogU2V0IGhhcmR3YXJlIHBhbGV0dGUgdG8gYmxhY2sgaW4gVHJ1ZSBDb2xvdXIgKi8KKwkJCWlmIChuZXdfZGVwdGggPiA4KSB7CisJCQkJU0RMX21lbXNldChGMzBfcGFsZXR0ZSwgMCwgc2l6ZW9mKEYzMF9wYWxldHRlKSk7CisJCQkJVnNldFJHQigwLDI1NixGMzBfcGFsZXR0ZSk7CisJCQl9CisJCQlicmVhazsKKwl9CisKKwlWc3luYygpOworI2VuZGlmCisKKwl0aGlzLT5VcGRhdGVSZWN0cyA9IFhCSU9TX1VwZGF0ZVJlY3RzOworCisJcmV0dXJuIChjdXJyZW50KTsKK30KKworLyogV2UgZG9uJ3QgYWN0dWFsbHkgYWxsb3cgaGFyZHdhcmUgc3VyZmFjZXMgb3RoZXIgdGhhbiB0aGUgbWFpbiBvbmUgKi8KK3N0YXRpYyBpbnQgWEJJT1NfQWxsb2NIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybigtMSk7Cit9CisKK3N0YXRpYyB2b2lkIFhCSU9TX0ZyZWVIV1N1cmZhY2UoX1RISVMsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworCXJldHVybjsKK30KKworc3RhdGljIGludCBYQklPU19Mb2NrSFdTdXJmYWNlKF9USElTLCBTRExfU3VyZmFjZSAqc3VyZmFjZSkKK3sKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIFhCSU9TX1VubG9ja0hXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBYQklPU19VcGRhdGVSZWN0cyhfVEhJUywgaW50IG51bXJlY3RzLCBTRExfUmVjdCAqcmVjdHMpCit7CisJU0RMX1N1cmZhY2UgKnN1cmZhY2U7CisKKwlzdXJmYWNlID0gdGhpcy0+c2NyZWVuOworCisJaWYgKFhCSU9TX2N1cnJlbnQtPmZsYWdzICYgWEJJT1NNT0RFX0MyUCkgeworCQlpbnQgaTsKKwkJaW50IGRvdWJsZWxpbmUgPSAoWEJJT1NfY3VycmVudC0+ZmxhZ3MgJiBYQklPU01PREVfRE9VQkxFTElORSA/IDEgOiAwKTsKKworCQlmb3IgKGk9MDtpPG51bXJlY3RzO2krKykgeworCQkJdm9pZCAqc291cmNlLCpkZXN0aW5hdGlvbjsKKwkJCWludCB4MSx4MjsKKworCQkJeDEgPSByZWN0c1tpXS54ICYgfjE1OworCQkJeDIgPSByZWN0c1tpXS54K3JlY3RzW2ldLnc7CisJCQlpZiAoeDIgJiAxNSkgeworCQkJCXgyID0gKHgyIHwgMTUpICsxOworCQkJfQorCisJCQlzb3VyY2UgPSBzdXJmYWNlLT5waXhlbHM7CisJCQlzb3VyY2UgKz0gc3VyZmFjZS0+cGl0Y2ggKiByZWN0c1tpXS55OworCQkJc291cmNlICs9IHgxOworCisJCQlkZXN0aW5hdGlvbiA9IFhCSU9TX3NjcmVlbnNbWEJJT1NfZmJudW1dOworCQkJZGVzdGluYXRpb24gKz0gWEJJT1NfcGl0Y2ggKiByZWN0c1tpXS55OworCQkJZGVzdGluYXRpb24gKz0geDE7CisKKwkJCS8qIENvbnZlcnQgY2h1bmt5IHRvIHBsYW5hciBzY3JlZW4gKi8KKwkJCVNETF9BdGFyaV9DMnBDb252ZXJ0KAorCQkJCXNvdXJjZSwKKwkJCQlkZXN0aW5hdGlvbiwKKwkJCQl4Mi14MSwKKwkJCQlyZWN0c1tpXS5oLAorCQkJCWRvdWJsZWxpbmUsCisJCQkJc3VyZmFjZS0+cGl0Y2gsCisJCQkJWEJJT1NfcGl0Y2gKKwkJCSk7CisJCX0KKwl9CisKKyNpZm5kZWYgREVCVUdfVklERU9fWEJJT1MKKwlpZiAoKFhCSU9TX2N2ZG8+PjE2KSA9PSBWRE9fTUlMQU4pIHsKKwkJVnNldFNjcmVlbigtMSwgWEJJT1Nfc2NyZWVuc1tYQklPU19mYm51bV0sIE1JX01BR0lDLCBDTURfU0VUQURSKTsKKwl9IGVsc2UgeworCQlTZXRzY3JlZW4oLTEsWEJJT1Nfc2NyZWVuc1tYQklPU19mYm51bV0sLTEpOworCX0KKworCVZzeW5jKCk7CisjZW5kaWYKKworCWlmICgoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGKSB7CisJCVhCSU9TX2ZibnVtIF49IDE7CisJCWlmICgoWEJJT1NfY3VycmVudC0+ZmxhZ3MgJiBYQklPU01PREVfQzJQKSA9PSAwKSB7CisJCQlzdXJmYWNlLT5waXhlbHM9WEJJT1Nfc2NyZWVuc1tYQklPU19mYm51bV07CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgWEJJT1NfRmxpcEhXU3VyZmFjZShfVEhJUywgU0RMX1N1cmZhY2UgKnN1cmZhY2UpCit7CisJaWYgKFhCSU9TX2N1cnJlbnQtPmZsYWdzICYgWEJJT1NNT0RFX0MyUCkgeworCQl2b2lkICpkZXN0c2NyOworCQlpbnQgZGVzdHg7CisJCWludCBkb3VibGVsaW5lID0gKFhCSU9TX2N1cnJlbnQtPmZsYWdzICYgWEJJT1NNT0RFX0RPVUJMRUxJTkUgPyAxIDogMCk7CisJCQkKKwkJLyogQ2VudGVyIG9uIGRlc3RpbmF0aW9uIHNjcmVlbiAqLworCQlkZXN0c2NyID0gWEJJT1Nfc2NyZWVuc1tYQklPU19mYm51bV07CisJCWRlc3RzY3IgKz0gWEJJT1NfcGl0Y2ggKiAoKFhCSU9TX2N1cnJlbnQtPmhlaWdodCAtIHN1cmZhY2UtPmgpID4+IDEpOworCQlkZXN0eCA9IChYQklPU19jdXJyZW50LT53aWR0aCAtIHN1cmZhY2UtPncpID4+IDE7CisJCWRlc3R4ICY9IH4xNTsKKwkJZGVzdHNjciArPSBkZXN0eDsKKworCQkvKiBDb252ZXJ0IGNodW5reSB0byBwbGFuYXIgc2NyZWVuICovCisJCVNETF9BdGFyaV9DMnBDb252ZXJ0KAorCQkJc3VyZmFjZS0+cGl4ZWxzLAorCQkJZGVzdHNjciwKKwkJCXN1cmZhY2UtPncsCisJCQlzdXJmYWNlLT5oLAorCQkJZG91YmxlbGluZSwKKwkJCXN1cmZhY2UtPnBpdGNoLAorCQkJWEJJT1NfcGl0Y2gKKwkJKTsKKwl9CisKKyNpZm5kZWYgREVCVUdfVklERU9fWEJJT1MKKwlpZiAoKFhCSU9TX2N2ZG8+PjE2KSA9PSBWRE9fTUlMQU4pIHsKKwkJVnNldFNjcmVlbigtMSwgWEJJT1Nfc2NyZWVuc1tYQklPU19mYm51bV0sIE1JX01BR0lDLCBDTURfU0VUQURSKTsKKwl9IGVsc2UgeworCQlTZXRzY3JlZW4oLTEsWEJJT1Nfc2NyZWVuc1tYQklPU19mYm51bV0sLTEpOworCX0KKworCVZzeW5jKCk7CisjZW5kaWYKKworCWlmICgoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGKSB7CisJCVhCSU9TX2ZibnVtIF49IDE7CisJCWlmICgoWEJJT1NfY3VycmVudC0+ZmxhZ3MgJiBYQklPU01PREVfQzJQKSA9PSAwKSB7CisJCQlzdXJmYWNlLT5waXhlbHM9WEJJT1Nfc2NyZWVuc1tYQklPU19mYm51bV07CisJCX0KKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgWEJJT1NfU2V0Q29sb3JzKF9USElTLCBpbnQgZmlyc3Rjb2xvciwgaW50IG5jb2xvcnMsIFNETF9Db2xvciAqY29sb3JzKQoreworI2lmbmRlZiBERUJVR19WSURFT19YQklPUworCWludAkJaTsKKwlpbnQJCXIsdixiOworCisJc3dpdGNoKCBYQklPU19jdmRvID4+IDE2KSB7CisJCWNhc2UgVkRPX1NUOgorCQljYXNlIFZET19TVEU6CisJCSAJZm9yIChpPTA7aTxuY29sb3JzO2krKykKKwkJCXsKKwkJCQlyID0gY29sb3JzW2ldLnI7CQorCQkJCXYgPSBjb2xvcnNbaV0uZzsKKwkJCQliID0gY29sb3JzW2ldLmI7CisKKwkJCQlUVF9wYWxldHRlW2ZpcnN0Y29sb3IraV09KChyKjMwKSsodio1OSkrKGIqMTEpKS8xMDA7CisJCQl9CisJCQlTRExfQXRhcmlfQzJwQ29udmVydDRfcGFsKFRUX3BhbGV0dGUpOyAvKiBjb252ZXJ0IHRoZSBsaWdodGluZyAqLworCQkJYnJlYWs7CisJCWNhc2UgVkRPX1RUOgorCQkJZm9yKGkgPSAwOyBpIDwgbmNvbG9yczsgaSsrKQorCQkJeworCQkJCXIgPSBjb2xvcnNbaV0ucjsJCisJCQkJdiA9IGNvbG9yc1tpXS5nOworCQkJCWIgPSBjb2xvcnNbaV0uYjsKKwkJCQkJCisJCQkJVFRfcGFsZXR0ZVtpXT0oKHI+PjQpPDw4KXwoKHY+PjQpPDw0KXwoYj4+NCk7CisJCQl9CisJCQlFc2V0UGFsZXR0ZShmaXJzdGNvbG9yLG5jb2xvcnMsVFRfcGFsZXR0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBWRE9fRjMwOgorCQljYXNlIFZET19NSUxBTjoKKwkJCWZvcihpID0gMDsgaSA8IG5jb2xvcnM7IGkrKykKKwkJCXsKKwkJCQlyID0gY29sb3JzW2ldLnI7CQorCQkJCXYgPSBjb2xvcnNbaV0uZzsKKwkJCQliID0gY29sb3JzW2ldLmI7CisKKwkJCQlGMzBfcGFsZXR0ZVtpXT0ocjw8MTYpfCh2PDw4KXxiOworCQkJfQorCQkJVnNldFJHQihmaXJzdGNvbG9yLG5jb2xvcnMsRjMwX3BhbGV0dGUpOworCQkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlyZXR1cm4oMSk7Cit9CisKKy8qIE5vdGU6ICBJZiB3ZSBhcmUgdGVybWluYXRlZCwgdGhpcyBjb3VsZCBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZgorICAgYW5vdGhlciBTREwgdmlkZW8gcm91dGluZSAtLSBub3RhYmx5IFVwZGF0ZVJlY3RzLgorKi8KK3N0YXRpYyB2b2lkIFhCSU9TX1ZpZGVvUXVpdChfVEhJUykKK3sKKwlpbnQgaSxqOworCisJQXRhcmlfU2h1dGRvd25FdmVudHMoKTsKKworCS8qIFJlc3RvcmUgdmlkZW8gbW9kZSBhbmQgcGFsZXR0ZSAqLworI2lmbmRlZiBERUJVR19WSURFT19YQklPUworCXN3aXRjaChYQklPU19jdmRvID4+IDE2KSB7CisJCWNhc2UgVkRPX1NUOgorCQljYXNlIFZET19TVEU6CisJCQlTZXRzY3JlZW4oLTEsWEJJT1Nfb2xkdmJhc2UsWEJJT1Nfb2xkdm1vZGUpOworCQkJaWYgKFhCSU9TX29sZG51bWNvbCkgeworCQkJCVNldHBhbGV0dGUoWEJJT1Nfb2xkcGFsZXR0ZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWRE9fVFQ6CisJCQlTZXRzY3JlZW4oLTEsWEJJT1Nfb2xkdmJhc2UsLTEpOworCQkJRXNldFNoaWZ0KFhCSU9TX29sZHZtb2RlKTsKKwkJCWlmIChYQklPU19vbGRudW1jb2wpIHsKKwkJCQlFc2V0UGFsZXR0ZSgwLCBYQklPU19vbGRudW1jb2wsIFhCSU9TX29sZHBhbGV0dGUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVkRPX0YzMDoKKwkJCVNldHNjcmVlbigtMSwgWEJJT1Nfb2xkdmJhc2UsIC0xKTsKKwkJCWlmIChYQklPU19jZW50c2NyZWVuKSB7CisJCQkJU0RMX1hCSU9TX0NlbnRzY3JlZW5SZXN0b3JlKHRoaXMsIFhCSU9TX29sZHZtb2RlKTsKKwkJCX0gZWxzZSB7CisJCQkJVnNldE1vZGUoWEJJT1Nfb2xkdm1vZGUpOworCQkJfQorCQkJaWYgKFhCSU9TX29sZG51bWNvbCkgeworCQkJCVZzZXRSR0IoMCwgWEJJT1Nfb2xkbnVtY29sLCBYQklPU19vbGRwYWxldHRlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFZET19NSUxBTjoKKwkJCVZzZXRTY3JlZW4oLTEsICZYQklPU19vbGR2YmFzZSwgTUlfTUFHSUMsIENNRF9TRVRBRFIpOworCQkJVnNldFNjcmVlbigtMSwgJlhCSU9TX29sZHZtb2RlLCBNSV9NQUdJQywgQ01EX1NFVE1PREUpOworCQkJaWYgKFhCSU9TX29sZG51bWNvbCkgeworCQkJCVZzZXRSR0IoMCwgWEJJT1Nfb2xkbnVtY29sLCBYQklPU19vbGRwYWxldHRlKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwlWc3luYygpOworI2VuZGlmCisKKyNpZiBTRExfVklERU9fT1BFTkdMCisJaWYgKGdsX2FjdGl2ZSkgeworCQlTRExfQXRhcmlHTF9RdWl0KHRoaXMsIFNETF9UUlVFKTsKKwl9CisjZW5kaWYKKworCWlmIChYQklPU19vbGRwYWxldHRlKSB7CisJCVNETF9mcmVlKFhCSU9TX29sZHBhbGV0dGUpOworCQlYQklPU19vbGRwYWxldHRlPU5VTEw7CisJfQorCVhCSU9TX0ZyZWVCdWZmZXJzKHRoaXMpOworCisJLyogRnJlZSBtb2RlIGxpc3QgKi8KKwlmb3IgKCBpPTA7IGk8TlVNX01PREVMSVNUUzsgKytpICkgeworCQlpZiAoIFNETF9tb2RlbGlzdFtpXSAhPSBOVUxMICkgeworCQkJZm9yICggaj0wOyBTRExfbW9kZWxpc3RbaV1bal07ICsraiApCisJCQkJU0RMX2ZyZWUoU0RMX21vZGVsaXN0W2ldW2pdKTsKKwkJCVNETF9mcmVlKFNETF9tb2RlbGlzdFtpXSk7CisJCQlTRExfbW9kZWxpc3RbaV0gPSBOVUxMOworCQl9CisJCWlmICggU0RMX3hiaW9zbW9kZVtpXSAhPSBOVUxMICkgeworCQkJZm9yICggaj0wOyBTRExfeGJpb3Ntb2RlW2ldW2pdOyArK2ogKQorCQkJCVNETF9mcmVlKFNETF94Ymlvc21vZGVbaV1bal0pOworCQkJU0RMX2ZyZWUoU0RMX3hiaW9zbW9kZVtpXSk7CisJCQlTRExfeGJpb3Ntb2RlW2ldID0gTlVMTDsKKwkJfQorCX0KKworCXRoaXMtPnNjcmVlbi0+cGl4ZWxzID0gTlVMTDsJCisKKwkvKiBSZXN0b3JlIHNjcmVlbnNhdmVycyAqLworCWlmIChTRExfWEJJT1NfVHZlaWxsZVByZXNlbnQodGhpcykpIHsKKwkJU0RMX1hCSU9TX1R2ZWlsbGVFbmFibGUodGhpcyk7CisJfQorfQorCisjaWYgU0RMX1ZJREVPX09QRU5HTAorCitzdGF0aWMgdm9pZCBYQklPU19HTF9Td2FwQnVmZmVycyhfVEhJUykKK3sKKwlTRExfQXRhcmlHTF9Td2FwQnVmZmVycyh0aGlzKTsKKwlYQklPU19GbGlwSFdTdXJmYWNlKHRoaXMsIHRoaXMtPnNjcmVlbik7CisJU0RMX0F0YXJpR0xfTWFrZUN1cnJlbnQodGhpcyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3MuaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkNjgyNwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisjaWZuZGVmIF9TRExfeGJpb3NfaAorI2RlZmluZSBfU0RMX3hiaW9zX2gKKworI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKKyNpbmNsdWRlICIuLi9TRExfc3lzdmlkZW8uaCIKKworLyogSGlkZGVuICJ0aGlzIiBwb2ludGVyIGZvciB0aGUgdmlkZW8gZnVuY3Rpb25zICovCisjZGVmaW5lIF9USElTCVNETF9WaWRlb0RldmljZSAqdGhpcworCisjZGVmaW5lIFhCSU9TTU9ERV9ET1VCTEVMSU5FICgxPDwwKQorI2RlZmluZSBYQklPU01PREVfQzJQICgxPDwxKQorCit0eXBlZGVmIHN0cnVjdAoreworCVVpbnQxNiBudW1iZXI7CQkvKiBWaWRlbyBtb2RlIG51bWJlciAqLworCVVpbnQxNiB3aWR0aDsJCS8qIFNpemUgKi8JCisJVWludDE2IGhlaWdodDsKKwlVaW50MTYgZGVwdGg7CQkvKiBiaXRzIHBlciBwbGFuZSAqLworCVVpbnQxNiBmbGFnczsKK30geGJpb3Ntb2RlX3Q7CisKKy8qIFByaXZhdGUgZGlzcGxheSBkYXRhICovCisjZGVmaW5lIE5VTV9NT0RFTElTVFMJNAkJLyogOCwgMTYsIDI0LCBhbmQgMzIgYml0cy1wZXItcGl4ZWwgKi8KKworc3RydWN0IFNETF9Qcml2YXRlVmlkZW9EYXRhIHsKKwlsb25nIGNvb2tpZV92ZG87CisJbG9uZyBvbGRfdmlkZW9fbW9kZTsJCQkJLyogT2xkIHZpZGVvIG1vZGUgYmVmb3JlIGVudGVyaW5nIFNETCAqLworCXZvaWQgKm9sZF92aWRlb19iYXNlOwkJCS8qIE9sZCBwb2ludGVyIHRvIHNjcmVlbiBidWZmZXIgKi8KKwl2b2lkICpvbGRfcGFsZXR0ZTsJCQkJLyogT2xkIHBhbGV0dGUgKi8KKwlVaW50MzIgb2xkX251bV9jb2xvcnM7CQkJLyogTmIgb2YgY29sb3JzIGluIHNhdmVkIHBhbGV0dGUgKi8KKworCXZvaWQgKnNjcmVlbnNbMl07CQkvKiBQb2ludGVycyB0byBhbGlnbmVkIHNjcmVlbiBidWZmZXIgKi8KKwl2b2lkICpzY3JlZW5zbWVtWzJdOwkvKiBQb2ludGVycyB0byBzY3JlZW4gYnVmZmVyICovCisJdm9pZCAqc2hhZG93c2NyZWVuOwkJLyogU2hhZG93IHNjcmVlbiBmb3IgYzJwIGNvbnZlcnNpb24gKi8KKwlpbnQgZnJhbWVfbnVtYmVyOwkJLyogTnVtYmVyIG9mIGZyYW1lIGZvciBkb3VibGUgYnVmZmVyICovCisJaW50IHBpdGNoOwkJCQkvKiBEZXN0aW5hdGlvbiBsaW5lIHdpZHRoIGZvciBDMlAgKi8KKworCVNETF9ib29sIGNlbnRzY3JlZW47CS8qIENlbnRzY3JlZW4gZXh0ZW5zaW9uIHByZXNlbnQgPyAqLworCisJeGJpb3Ntb2RlX3QgKmN1cnJlbnQ7CS8qIEN1cnJlbnQgc2V0IG1vZGUgKi8KKwlpbnQgU0RMX251bW1vZGVzW05VTV9NT0RFTElTVFNdOworCVNETF9SZWN0ICoqU0RMX21vZGVsaXN0W05VTV9NT0RFTElTVFNdOworCXhiaW9zbW9kZV90ICoqU0RMX3hiaW9zbW9kZVtOVU1fTU9ERUxJU1RTXTsKK307CisKKy8qIF9WRE8gY29va2llIHZhbHVlcyAqLworZW51bSB7CisJVkRPX1NUPTAsCisJVkRPX1NURSwKKwlWRE9fVFQsCisJVkRPX0YzMCwKKwlWRE9fTUlMQU4KK307CisKKy8qIE1vbml0b3IgdHlwZXMgKi8KK2VudW0geworCU1PTklUT1JfTU9OTz0wLAorCU1PTklUT1JfVFYsCisJTU9OSVRPUl9WR0EsCisJTU9OSVRPUl9SR0IKK307CisKKy8qIEVnZXRTaGlmdCBtYXNrcyAqLworI2RlZmluZSBFU19NT0RFCQkweDA3MDAKKworLyogSGlkZGVuIHN0cnVjdHVyZSAtPiB2YXJpYWJsZXMgbmFtZXMgKi8KKyNkZWZpbmUgU0RMX251bW1vZGVzCQkodGhpcy0+aGlkZGVuLT5TRExfbnVtbW9kZXMpCisjZGVmaW5lIFNETF9tb2RlbGlzdAkJKHRoaXMtPmhpZGRlbi0+U0RMX21vZGVsaXN0KQorI2RlZmluZSBTRExfeGJpb3Ntb2RlCQkodGhpcy0+aGlkZGVuLT5TRExfeGJpb3Ntb2RlKQorI2RlZmluZSBYQklPU19tdXRleAkJICAgICh0aGlzLT5oaWRkZW4tPm11dGV4KQorI2RlZmluZSBYQklPU19jdmRvCQkgICAgKHRoaXMtPmhpZGRlbi0+Y29va2llX3ZkbykKKyNkZWZpbmUgWEJJT1Nfb2xkcGFsZXR0ZQkodGhpcy0+aGlkZGVuLT5vbGRfcGFsZXR0ZSkKKyNkZWZpbmUgWEJJT1Nfb2xkbnVtY29sCQkodGhpcy0+aGlkZGVuLT5vbGRfbnVtX2NvbG9ycykKKyNkZWZpbmUgWEJJT1Nfb2xkdmJhc2UJCSh0aGlzLT5oaWRkZW4tPm9sZF92aWRlb19iYXNlKQorI2RlZmluZSBYQklPU19vbGR2bW9kZQkJKHRoaXMtPmhpZGRlbi0+b2xkX3ZpZGVvX21vZGUpCisjZGVmaW5lIFhCSU9TX3NjcmVlbnMJCSh0aGlzLT5oaWRkZW4tPnNjcmVlbnMpCisjZGVmaW5lIFhCSU9TX3NjcmVlbnNtZW0JKHRoaXMtPmhpZGRlbi0+c2NyZWVuc21lbSkKKyNkZWZpbmUgWEJJT1Nfc2hhZG93c2NyZWVuCSh0aGlzLT5oaWRkZW4tPnNoYWRvd3NjcmVlbikKKyNkZWZpbmUgWEJJT1NfZmJudW0JCQkodGhpcy0+aGlkZGVuLT5mcmFtZV9udW1iZXIpCisjZGVmaW5lIFhCSU9TX3BpdGNoCQkJKHRoaXMtPmhpZGRlbi0+cGl0Y2gpCisjZGVmaW5lIFhCSU9TX2NlbnRzY3JlZW4JKHRoaXMtPmhpZGRlbi0+Y2VudHNjcmVlbikKKyNkZWZpbmUgWEJJT1NfY3VycmVudAkJKHRoaXMtPmhpZGRlbi0+Y3VycmVudCkKKworLyotLS0gRnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tKi8KKwordm9pZCBTRExfWEJJT1NfQWRkTW9kZShfVEhJUywgaW50IGFjdHVhbGx5X2FkZCwgY29uc3QgeGJpb3Ntb2RlX3QgKm1vZGVpbmZvKTsKKworI2VuZGlmIC8qIF9TRExfeGJpb3NfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfYmxvd3VwLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19ibG93dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUwYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfYmxvd3VwLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJQmxvd3VwIGV4dGVuc2lvbiBkZWZpbml0aW9ucworCisJUGF0cmljZSBNYW5kaW4KKyovCisKKyNpbmNsdWRlIDxtaW50L2ZhbGNvbi5oPgorCisjaW5jbHVkZSAiU0RMX3hiaW9zLmgiCisjaW5jbHVkZSAiU0RMX3hiaW9zX2Jsb3d1cC5oIgorCit2b2lkIFNETF9YQklPU19MaXN0Qmxvd3VwTW9kZXMoX1RISVMsIGludCBhY3R1YWxseV9hZGQsIGJsb3dfY29va2llX3QgKmNvb2tpZV9ibG93KQoreworCWludCBpLCBqLCBudW1fbW9kZSwgYmFuazsKKwlibG93X21vZGVfdCAqYmxvd19tb2RlOworCXhiaW9zbW9kZV90IG1vZGVpbmZvOworCisJaWYgKGFjdHVhbGx5X2FkZCkgeworCQkvKiBTZXQgYml0IDE1IGZvciBvbGQgbW9kZXMgKi8KKwkJZm9yIChpPTA7aTxOVU1fTU9ERUxJU1RTO2krKykgeworCQkJaWYgKCBTRExfeGJpb3Ntb2RlW2ldICE9IE5VTEwgKSB7CisJCQkJZm9yICggaj0wOyBTRExfeGJpb3Ntb2RlW2ldW2pdOyArK2ogKSB7CisJCQkJCVNETF94Ymlvc21vZGVbaV1bal0tPm51bWJlciB8PSAxPDwxNTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBBZGQgQmxvd3VwIG1vZGVzIGZvciA4IGFuZCAxNiBicHAgKi8KKwlmb3IgKG51bV9tb2RlPTM7IG51bV9tb2RlPDU7IG51bV9tb2RlKyspIHsKKwkJYmFuayA9IGNvb2tpZV9ibG93LT5udW1fbW9kZVtudW1fbW9kZV07CisJCWJsb3dfbW9kZSA9ICYoY29va2llX2Jsb3ctPmJsb3d1cF9tb2Rlc1tudW1fbW9kZSsoYmFuayo1KV0pOworCisJCS8qIENoZWNrIGV4dGVuZGVkIG1vZGUgZW5hYmxlZCAqLworCQlpZiAoYmxvd19tb2RlLT5lbmFibGVkID09IDApIHsKKwkJCS8qIENoZWNrIG1vbml0b3IgbmVlZGVkIGZvciB0aGlzIG1vZGUgKi8KKwkJCWlmICgoYmxvd19tb2RlLT5tb25pdG9yID09IGNvb2tpZV9ibG93LT5tb250eXBlKQorCQkJCXx8ICgoYmxvd19tb2RlLT5tb25pdG9yID09IE1PTklUT1JfVFYpCisJCQkJCSYmIChjb29raWVfYmxvdy0+bW9udHlwZSA9PSBNT05JVE9SX1JHQikpCisJCQkJfHwgKChibG93X21vZGUtPm1vbml0b3IgPT0gTU9OSVRPUl9SR0IpCisJCQkJCSYmIChjb29raWVfYmxvdy0+bW9udHlwZSA9PSBNT05JVE9SX1RWKSkpCisJCQl7CisJCQkJLyogd2UgY2FuIHVzZSB0aGlzIGV4dGVuZGVkIG1vZGUgKi8KKwkJCQltb2RlaW5mby5udW1iZXIgPSAobnVtX21vZGUgPT0gMyA/IEJQUzggOiBCUFMxNik7CisJCQkJbW9kZWluZm8ud2lkdGggPSBibG93X21vZGUtPndpZHRoICsgMTsKKwkJCQltb2RlaW5mby5oZWlnaHQgPSBibG93X21vZGUtPmhlaWdodCArIDE7CisJCQkJbW9kZWluZm8uZGVwdGggPSAobnVtX21vZGUgPT0gMyA/IDggOiAxNik7CisJCQkJbW9kZWluZm8uZmxhZ3MgPSAobW9kZWluZm8uZGVwdGggPT0gOCA/IFhCSU9TTU9ERV9DMlAgOiAwKTsKKworCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIGFjdHVhbGx5X2FkZCwgJm1vZGVpbmZvKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2Jsb3d1cC5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfYmxvd3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhMzY1MQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2Jsb3d1cC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCUJsb3d1cCBleHRlbnNpb24gZGVmaW5pdGlvbnMKKworCVBhdHJpY2UgTWFuZGluCisqLworCisjaWZuZGVmIF9TRExfeGJpb3NfYmxvd3VwX2gKKyNkZWZpbmUgX1NETF94Ymlvc19ibG93dXBfaAorCisjaW5jbHVkZSAiU0RMX3hiaW9zLmgiCisKKy8qLS0tIFR5cGVzIC0tLSovCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiA2NCBieXRlcyAqLworCXVuc2lnbmVkIHNob3J0CWVuYWJsZWQ7CQkvKiBFeHRlbmRlZCBtb2RlIGVuYWJsZWQgPyAwPXllcywgPD4wPW5vICovCisJdW5zaWduZWQgc2hvcnQJZHVtbXkxMFs2XTsKKwl1bnNpZ25lZCBzaG9ydAlyZWdpc3RlcnNfMEU7CS8qIHZhbHVlIGZvciByZWdpc3RlciAweGZmZmY4MjBlICovCisJdW5zaWduZWQgc2hvcnQJcmVnaXN0ZXJzXzEwOwkvKiB2YWx1ZSBmb3IgcmVnaXN0ZXIgMHhmZmZmODIxMCAqLworCXVuc2lnbmVkIHNob3J0CWR1bW15MTFbMjNdOworCisJLyogNjQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBzaG9ydAl3aWR0aDsJCQkvKiB3aWR0aC0xICovCisJdW5zaWduZWQgc2hvcnQJaGVpZ2h0OwkJCS8qIGhlaWdodC0xICovCisJdW5zaWduZWQgc2hvcnQJZHVtbXkyMDsKKwl1bnNpZ25lZCBsb25nCXNjcmVlbnNpemU7CQkvKiBzY3JlZW5zaXplIGluIGJ5dGVzICovCisJdW5zaWduZWQgc2hvcnQJZHVtbXkyMVs4XTsKKwl1bnNpZ25lZCBzaG9ydAl2aXJ0dWFsOwkJLyogVmlydHVhbCBzY3JlZW4gPyAqLworCXVuc2lnbmVkIHNob3J0CXZpcndpZHRoOwkJLyogVmlydHVhbCBzY3JlZW4gd2lkdGggKi8KKwl1bnNpZ25lZCBzaG9ydAl2aXJoZWlnaHQ7CQkvKiBWaXJ0dWFsIHNjcmVlbiBoZWlnaHQgKi8KKworCXVuc2lnbmVkIHNob3J0IGR1bW15MjI7CisJdW5zaWduZWQgc2hvcnQgbW9uaXRvcjsJCQkvKiBNb25pdG9yIGRlZmluZWQgZm9yIHRoaXMgbW9kZSAqLworCXVuc2lnbmVkIHNob3J0IGV4dGVuc2lvbjsJCS8qIEV4dGVuZGVkIG1vZGUgZGVmaW5lZCA/IDA9eWVzLCAxPW5vICovCisJdW5zaWduZWQgc2hvcnQgZHVtbXkyM1sxM107CisKKwkvKiA2NCBieXRlcyAqLworCXVuc2lnbmVkIHNob3J0CWR1bW15MzA7CisJdW5zaWduZWQgc2hvcnQJcmVnaXN0ZXJzXzgyWzZdOwkvKiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAweGZmZmY4MjgyLThjICovCisJdW5zaWduZWQgc2hvcnQJZHVtbXkzMVs5XTsKKworCXVuc2lnbmVkIHNob3J0CWR1bW15MzI7CisJdW5zaWduZWQgc2hvcnQJcmVnaXN0ZXJzX0EyWzZdOwkvKiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAweGZmZmY4MmEyLWFjICovCisJdW5zaWduZWQgc2hvcnQJZHVtbXkzM1s5XTsKKworCS8qIDY0IGJ5dGVzICovCisJdW5zaWduZWQgc2hvcnQJcmVnaXN0ZXJzX0MwOwkvKiB2YWx1ZSBmb3IgcmVnaXN0ZXIgMHhmZmZmODJjMCAqLworCXVuc2lnbmVkIHNob3J0CXJlZ2lzdGVyc19DMjsJLyogdmFsdWUgZm9yIHJlZ2lzdGVyIDB4ZmZmZjgyYzIgKi8KKwl1bnNpZ25lZCBzaG9ydAlkdW1teTQwWzMwXTsKK30gYmxvd19tb2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlibG93X21vZGVfdAlibG93dXBfbW9kZXNbMTBdOworCXVuc2lnbmVkIGNoYXIJbnVtX21vZGVbNl07CisJdW5zaWduZWQgbG9uZwlkdW1teTsKKwl1bnNpZ25lZCBzaG9ydAltb250eXBlOworfSBibG93X2Nvb2tpZV90OworCisvKi0tLSBGdW5jdGlvbnMgcHJvdG90eXBlcyAtLS0qLworCit2b2lkIFNETF9YQklPU19MaXN0Qmxvd3VwTW9kZXMoX1RISVMsIGludCBhY3R1YWxseV9hZGQsIGJsb3dfY29va2llX3QgKmNvb2tpZV9ibG93KTsKKworI2VuZGlmIC8qIF9TRExfeGJpb3NfYmxvd3VwX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2NlbnRzY3JlZW4uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2NlbnRzY3JlZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFhZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfY2VudHNjcmVlbi5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKwlDZW50c2NyZWVuIGV4dGVuc2lvbiBkZWZpbml0aW9ucworCisJUGF0cmljZSBNYW5kaW4KKyovCisKKyNpbmNsdWRlIDxtaW50L2ZhbGNvbi5oPgorCisjaW5jbHVkZSAiU0RMX3hiaW9zLmgiCisjaW5jbHVkZSAiU0RMX3hiaW9zX2NlbnRzY3JlZW4uaCIKKworaW50IFNETF9YQklPU19MaXN0Q2VudHNjcmVlbk1vZGVzKF9USElTLCBpbnQgYWN0dWFsbHlfYWRkKQoreworCWNlbnRzY3JlZW5fbW9kZV90IGN1cm1vZGUsIGxpc3RlZG1vZGU7CisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisJaW50IGN1cl9oYW5kbGU7CS8qIEN1cnJlbnQgQ2VudHNjcmVlbiBtb2RlIGhhbmRsZSAqLworCisJLyogQWRkIENlbnRzY3JlZW4gbW9kZXMgKi8KKwlWcmVhZCgmY3VybW9kZSk7CisJY3VyX2hhbmRsZSA9IGN1cm1vZGUuaGFuZGxlOworCWN1cm1vZGUubW9kZSA9IGN1cm1vZGUucGh5c3ggPSBjdXJtb2RlLnBoeXN5ID0gY3VybW9kZS5wbGFuID0KKwkJY3VybW9kZS5sb2d4ID0gY3VybW9kZS5sb2d5ID0gLTE7CisKKwlyZXN1bHQgPSBWZmlyc3QoJmN1cm1vZGUsICZsaXN0ZWRtb2RlKTsKKwlpZiAocmVzdWx0PT0wKSB7CisJCXdoaWxlIChyZXN1bHQ9PTApIHsKKwkJCS8qIERvbid0IGFkZCBtb2RlcyB3aXRoIHZpcnR1YWwgc2NyZWVuICovCisJCQlpZiAoKGxpc3RlZG1vZGUubW9kZSAmIENTQ1JFRU5fVklSVFVBTCk9PTApIHsKKwkJCQkvKiBEb24ndCBhZGQgbW9kZXMgd2l0aCBicHA8OCAqLworCQkJCWlmIChsaXN0ZWRtb2RlLnBsYW4+PTgpIHsKKwkJCQkJeGJpb3Ntb2RlX3QgbW9kZWluZm87CisKKwkJCQkJbW9kZWluZm8ubnVtYmVyID0gbGlzdGVkbW9kZS5tb2RlOworCQkJCQltb2RlaW5mby53aWR0aCA9IGxpc3RlZG1vZGUucGh5c3g7CisJCQkJCW1vZGVpbmZvLmhlaWdodCA9IGxpc3RlZG1vZGUucGh5c3k7CisJCQkJCW1vZGVpbmZvLmRlcHRoID0gbGlzdGVkbW9kZS5wbGFuOworCQkJCQltb2RlaW5mby5mbGFncyA9IChtb2RlaW5mby5kZXB0aCA9PSA4ID8gWEJJT1NNT0RFX0MyUCA6IDApOworCisJCQkJCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIGFjdHVhbGx5X2FkZCwgJm1vZGVpbmZvKTsKKwkJCQl9CisJCQl9CisJCQlTRExfbWVtY3B5KCZjdXJtb2RlLCAmbGlzdGVkbW9kZSwgc2l6ZW9mKGNlbnRzY3JlZW5fbW9kZV90KSk7CisJCQljdXJtb2RlLm1vZGUgPSBjdXJtb2RlLnBoeXN4ID0gY3VybW9kZS5waHlzeSA9IGN1cm1vZGUucGxhbiA9CisJCQkJY3VybW9kZS5sb2d4ID0gY3VybW9kZS5sb2d5ID0gLTE7CisJCQlyZXN1bHQgPSBWbmV4dCgmY3VybW9kZSwgJmxpc3RlZG1vZGUpOworCQl9CQkKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHN1aXRhYmxlIENlbnRzY3JlZW4gbW9kZXNcbiIpOworCX0KKworCXJldHVybiBjdXJfaGFuZGxlOworfQorCit2b2lkIFNETF9YQklPU19DZW50c2NyZWVuU2V0bW9kZShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGxhbmVzKQoreworCWNlbnRzY3JlZW5fbW9kZV90IG5ld21vZGUsIGN1cm1vZGU7CisJCisJbmV3bW9kZS5oYW5kbGUgPSBuZXdtb2RlLm1vZGUgPSBuZXdtb2RlLmxvZ3ggPSBuZXdtb2RlLmxvZ3kgPSAtMTsKKwluZXdtb2RlLnBoeXN4ID0gd2lkdGg7CisJbmV3bW9kZS5waHlzeSA9IGhlaWdodDsKKwluZXdtb2RlLnBsYW4gPSBwbGFuZXM7CisJVndyaXRlKDAsICZuZXdtb2RlLCAmY3VybW9kZSk7CisKKyNpZmRlZiBTRExfVklERU9fRElTQUJMRV9TQ1JFRU5TQVZFUgorCS8qIERpc2FibGUgc2NyZWVuc2F2ZXIgKi8KKwlWcmVhZCgmbmV3bW9kZSk7CisJbmV3bW9kZS5tb2RlICY9IH4oQ1NDUkVFTl9TQVZFUnxDU0NSRUVOX0VORVJHWVNUQVIpOworCVZ3cml0ZSgwLCAmbmV3bW9kZSwgJmN1cm1vZGUpOworI2VuZGlmIC8qIFNETF9WSURFT19ESVNBQkxFX1NDUkVFTlNBVkVSICovCit9CisKK3ZvaWQgU0RMX1hCSU9TX0NlbnRzY3JlZW5SZXN0b3JlKF9USElTLCBpbnQgcHJldl9oYW5kbGUpCit7CisJY2VudHNjcmVlbl9tb2RlX3QgbmV3bW9kZSwgY3VybW9kZTsKKworCS8qIFJlc3RvcmUgb2xkIHZpZGVvIG1vZGUgKi8KKwluZXdtb2RlLmhhbmRsZSA9IHByZXZfaGFuZGxlOworCW5ld21vZGUubW9kZSA9IG5ld21vZGUucGh5c3ggPSBuZXdtb2RlLnBoeXN5ID0gbmV3bW9kZS5wbGFuID0KKwkJbmV3bW9kZS5sb2d4ID0gbmV3bW9kZS5sb2d5ID0gLTE7CisJVndyaXRlKDAsICZuZXdtb2RlLCAmY3VybW9kZSk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19jZW50c2NyZWVuLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19jZW50c2NyZWVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlODhkOQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX2NlbnRzY3JlZW4uaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJQ2VudHNjcmVlbiBleHRlbnNpb24gZGVmaW5pdGlvbnMKKworCVBhdHJpY2UgTWFuZGluCisqLworCisjaWZuZGVmIF9TRExfeGJpb3NfY2VudHNjcmVlbl9oCisjZGVmaW5lIF9TRExfeGJpb3NfY2VudHNjcmVlbl9oCisKKyNpbmNsdWRlIDxtaW50L2ZhbGNvbi5oPgkvKiBmb3IgdHJhcF8xNF94eHggbWFjcm9zICovCisKKyNpbmNsdWRlICJTRExfeGJpb3MuaCIKKworLyotLS0gRGVmaW5lcyAtLS0qLworCisjZGVmaW5lIENTQ1JFRU5fRU5FUkdZU1RBUgkJKDE8PDkpCisjZGVmaW5lIENTQ1JFRU5fU0FWRVIJCQkoMTw8MTApCisjZGVmaW5lIENTQ1JFRU5fVklSVFVBTAkJCSgxPDwxMSkKKyNkZWZpbmUgQ1NDUkVFTl9FWFRDTE9DS19DVDIJKDE8PDEyKQorI2RlZmluZSBDU0NSRUVOX0VYVENMT0NLCQkoMTw8MTMpCisjZGVmaW5lIENTQ1JFRU5fU1RBTkRBUkQJCSgxPDwxNCkKKyNkZWZpbmUgQ1NDUkVFTl9ERUZBVUxUCQkJKDE8PDE1KQorCisvKi0tLSBTdHJ1Y3R1cmVzIC0tLSovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydAloYW5kbGU7CS8qIHZpZGVvbW9kZSBoYW5kbGUgKi8KKwl1bnNpZ25lZCBzaG9ydAltb2RlOwkvKiBGYWxjb24gdmlkZW9tb2RlIGNvZGUgKi8KKwl1bnNpZ25lZCBzaG9ydAlwaHlzeDsJLyogdmlzaWJsZSB3aWR0aCAqLworCXVuc2lnbmVkIHNob3J0CXBoeXN5OwkvKiB2aXNpYmxlIGhlaWdodCAqLworCXVuc2lnbmVkIHNob3J0CXBsYW47CS8qIGJpdHBsYW5lcyAqLworCXVuc2lnbmVkIHNob3J0CWxvZ3g7CS8qIHZpcnR1YWwgd2lkdGggKi8KKwl1bnNpZ25lZCBzaG9ydAlsb2d5OwkvKiB2aXJ0dWFsIGhlaWdodCAqLworCXVuc2lnbmVkIHNob3J0CWVjbzsJLyogc2NyZWVuIHNhdmVyIGRlbGF5ICovCisJdW5zaWduZWQgc2hvcnQJZWNvMjsJLyogZW5lcmd5IHN0YXIgc2NyZWVuIHNhdmVyIGRlbGF5ICovCisJdW5zaWduZWQgc2hvcnQJd3NpemU7CS8qIHNjcmVlbiB3aWR0aCAobW0pICovCisJdW5zaWduZWQgc2hvcnQJaHNpemU7CS8qIHNjcmVlbiBoZWlnaHQgKG1tKSAqLworCXVuc2lnbmVkIHNob3J0CWR1bW15WzIxXTsKKwl1bnNpZ25lZCBjaGFyCW5hbWVbMzJdOwkvKiB2aWRlb21vZGUgbmFtZSAqLworfSBjZW50c2NyZWVuX21vZGVfdDsKKworLyotLS0gRnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tKi8KKworI2RlZmluZSBWcmVhZChjdXJyZW50X21vZGUpCVwKKwkodm9pZCl0cmFwXzE0X3dsKChzaG9ydCkweDQxLChsb25nKShjdXJyZW50X21vZGUpKQorI2RlZmluZSBWd3JpdGUoaW5pdF92ZGksIGlucGFyYW0sIG91dHBhcmFtKQlcCisJKGxvbmcpdHJhcF8xNF93d2xsKChzaG9ydCkweDQyLChzaG9ydCkoaW5pdF92ZGkpLChsb25nKShpbnBhcmFtKSwobG9uZykob3V0cGFyYW0pKQorI2RlZmluZSBWYXR0cmliKGlucGFyYW0sIG91dHBhcmFtKQlcCisJKHZvaWQpdHJhcF8xNF93bGwoKHNob3J0KTB4NDMsKGxvbmcpKGlucGFyYW0pLChsb25nKShvdXRwYXJhbSkpCisjZGVmaW5lIFZjcmVhdGUoaW5wYXJhbSwgb3V0cGFyYW0pCVwKKwkodm9pZCl0cmFwXzE0X3dsbCgoc2hvcnQpMHg0NCwobG9uZykoaW5wYXJhbSksKGxvbmcpKG91dHBhcmFtKSkKKyNkZWZpbmUgVmRlbGV0ZShoYW5kbGUpCVwKKwkobG9uZyl0cmFwXzE0X3d3KChzaG9ydCkweDQ1LChzaG9ydCkoaGFuZGxlKSkKKyNkZWZpbmUgVmZpcnN0KG1hc2ssbW9kZSkJXAorCShsb25nKXRyYXBfMTRfd2xsKChzaG9ydCkweDQ2LChsb25nKShtYXNrKSwobG9uZykobW9kZSkpCisjZGVmaW5lIFZuZXh0KG1hc2ssbW9kZSkJXAorCShsb25nKXRyYXBfMTRfd2xsKChzaG9ydCkweDQ3LChsb25nKShtYXNrKSwobG9uZykobW9kZSkpCisjZGVmaW5lIFZ2YWxpZChoYW5kbGUpCVwKKwkobG9uZyl0cmFwXzE0X3d3KChzaG9ydCkweDQ4LChzaG9ydCkoaGFuZGxlKSkKKyNkZWZpbmUgVmxvYWQoKQlcCisJKGxvbmcpdHJhcF8xNF93KChzaG9ydCkweDQ5KQorI2RlZmluZSBWc2F2ZSgpCVwKKwkobG9uZyl0cmFwXzE0X3coKHNob3J0KTB4NGEpCisjZGVmaW5lIFZvcGVuKCkJXAorCShsb25nKXRyYXBfMTRfdygoc2hvcnQpMHg0YikKKyNkZWZpbmUgVmNsb3NlKCkJXAorCShsb25nKXRyYXBfMTRfdygoc2hvcnQpMHg0YykKKyNkZWZpbmUgVnNjcm9sbChzY3JvbGxtb2RlKQlcCisJKGxvbmcpdHJhcF8xNF93dygoc2hvcnQpMHg0ZCwoc2hvcnQpKHNjcm9sbG1vZGUpKQorI2RlZmluZSBWb2Zmc2V0KCkJXAorCShsb25nKXRyYXBfMTRfdygoc2hvcnQpMHg0ZSkKKyNkZWZpbmUgVnNlZWsoKQlcCisJKGxvbmcpdHJhcF8xNF93KChzaG9ydCkweDRmKQorI2RlZmluZSBWbG9jayhjbWQpCVwKKwkobG9uZyl0cmFwXzE0X3d3KChzaG9ydCkweDUwLChzaG9ydCkoY21kKSkKKyNkZWZpbmUgU2V0TW9uKG1vbnR5cGUpCVwKKwkobG9uZyl0cmFwXzE0X3d3KChzaG9ydCkweDUxLChzaG9ydCkobW9udHlwZSkpCisjZGVmaW5lIE11bHRpTW9uKGNtZCkJXAorCShsb25nKXRyYXBfMTRfd3coKHNob3J0KTB4NTIsKHNob3J0KShjbWQpKQorI2RlZmluZSBWU2l6ZUNvbXAoKQlcCisJKGxvbmcpdHJhcF8xNF93KChzaG9ydCkweDUzKQorI2RlZmluZSBWc2l6ZShtb2RlKQlcCisJKGxvbmcpdHJhcF8xNF93bCgoc2hvcnQpMHg1NCwobG9uZykobW9kZSkpCisKKy8qLS0tIEZ1bmN0aW9ucyBwcm90b3R5cGVzIC0tLSovCisKK2ludCBTRExfWEJJT1NfTGlzdENlbnRzY3JlZW5Nb2RlcyhfVEhJUywgaW50IGFjdHVhbGx5X2FkZCk7Cit2b2lkIFNETF9YQklPU19DZW50c2NyZWVuU2V0bW9kZShfVEhJUywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGxhbmVzKTsKK3ZvaWQgU0RMX1hCSU9TX0NlbnRzY3JlZW5SZXN0b3JlKF9USElTLCBpbnQgcHJldl9oYW5kbGUpOworCisjZW5kaWYgLyogX1NETF94Ymlvc19jZW50c2NyZWVuX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX21pbGFuLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19taWxhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OWVlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19taWxhbi5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKwlNaWxhbiBYYmlvcyB2aWRlbyBmdW5jdGlvbnMKKworCVBhdHJpY2UgTWFuZGluCisqLworCisjaW5jbHVkZSA8bWludC9jb29raWUuaD4KKyNpbmNsdWRlIDxtaW50L2ZhbGNvbi5oPgorCisjaW5jbHVkZSAiU0RMX3hiaW9zLmgiCisjaW5jbHVkZSAiU0RMX3hiaW9zX21pbGFuLmgiCisKKyNkZWZpbmUgTlVNX1BSRURFRklORURfTU9ERVMgNworCit0eXBlZGVmIHN0cnVjdCB7CisJVWludDE2IHdpZHRoLCBoZWlnaHQ7Cit9IHByZWRlZmluZWRfbW9kZV90OworCitzdGF0aWMgY29uc3QgcHJlZGVmaW5lZF9tb2RlX3QgbW9kZV9saXN0W05VTV9QUkVERUZJTkVEX01PREVTXT17CisJezY0MCw0MDB9LAorCXs2NDAsNDgwfSwKKwl7ODAwLDYwOH0sCisJezEwMjQsNzY4fSwKKwl7MTE1Miw4NjR9LAorCXsxMjgwLDEwMjR9LAorCXsxNjAwLDEyMDB9CQorfTsKKworc3RhdGljIGNvbnN0IFVpbnQ4IG1vZGVfYnBwWzRdPXsKKwk4LCAxNSwgMTYsIDMyCit9OworCisvKi0tLSBWYXJpYWJsZXMgLS0tKi8KKworc3RhdGljIGludCBlbnVtX2FjdHVhbGx5X2FkZDsKK3N0YXRpYyBTRExfVmlkZW9EZXZpY2UgKmVudW1fdGhpczsKKworLyotLS0gRnVuY3Rpb25zIC0tLSovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIC8qY2RlY2wqLyBlbnVtZnVuYyhTQ1JFRU5JTkZPICppbmYsIHVuc2lnbmVkIGxvbmcgZmxhZykKK3sKKwl4Ymlvc21vZGVfdCBtb2RlaW5mbzsKKworCW1vZGVpbmZvLm51bWJlciA9IGluZi0+ZGV2SUQ7CisJbW9kZWluZm8ud2lkdGggPSBpbmYtPnNjcldpZHRoOworCW1vZGVpbmZvLmhlaWdodCA9IGluZi0+c2NySGVpZ2h0OworCW1vZGVpbmZvLmRlcHRoID0gaW5mLT5zY3JQbGFuZXM7CisJbW9kZWluZm8uZmxhZ3MgPSAwOworCisJU0RMX1hCSU9TX0FkZE1vZGUoZW51bV90aGlzLCBlbnVtX2FjdHVhbGx5X2FkZCwgJm1vZGVpbmZvKTsKKworCXJldHVybiBFTlVNTU9ERV9DT05UOyAKK30gCisKK3ZvaWQgU0RMX1hCSU9TX0xpc3RNaWxhbk1vZGVzKF9USElTLCBpbnQgYWN0dWFsbHlfYWRkKQoreworCWludCBpOworCisJLyogUmVhZCB2YWxpZGF0ZWQgcHJlZGVmaW5lZCBtb2RlcyAqLworCWZvciAoaT0wOyBpPE5VTV9QUkVERUZJTkVEX01PREVTOyBpKyspIHsKKwkJaW50IGo7CisJCVVpbnQxNiBkZXZpY2VpZCA9IDB4MTAwMCArIChpPDw0KTsKKworCQlmb3IgKGo9MTsgajw0OyBqKyspIHsKKwkJCWlmIChWYWxpZG1vZGUoZGV2aWNlaWQgKyBqKSkgeworCQkJCXhiaW9zbW9kZV90IG1vZGVpbmZvOworCQkJCQorCQkJCW1vZGVpbmZvLm51bWJlciA9IGRldmljZWlkICsgajsKKwkJCQltb2RlaW5mby53aWR0aCA9IG1vZGVfbGlzdFtpXS53aWR0aDsKKwkJCQltb2RlaW5mby5oZWlnaHQgPSBtb2RlX2xpc3RbaV0uaGVpZ2h0OworCQkJCW1vZGVpbmZvLmRlcHRoID0gbW9kZV9icHBbai0xXTsKKwkJCQltb2RlaW5mby5mbGFncyA9IDA7CisKKwkJCQlTRExfWEJJT1NfQWRkTW9kZSh0aGlzLCBhY3R1YWxseV9hZGQsICZtb2RlaW5mbyk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBSZWFkIGN1c3RvbSBjcmVhdGVkIG1vZGVzICovCisJZW51bV90aGlzID0gdGhpczsKKwllbnVtX2FjdHVhbGx5X2FkZCA9IGFjdHVhbGx5X2FkZDsKKwlWc2V0U2NyZWVuKC0xLCAmZW51bWZ1bmMsIE1JX01BR0lDLCBDTURfRU5VTU1PREVTKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX21pbGFuLmggYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19taWxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjVjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc19taWxhbi5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEyIFNhbSBMYW50aW5nYQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgU2FtIExhbnRpbmdhCisgICAgc2xvdWtlbkBsaWJzZGwub3JnCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworLyoKKwlNaWxhbiBYYmlvcyB2aWRlbyBmdW5jdGlvbnMKKworCVBhdHJpY2UgTWFuZGluCisqLworCisjaWZuZGVmIF9TRExfeGJpb3NfbWlsYW5faAorI2RlZmluZSBfU0RMX3hiaW9zX21pbGFuX2gKKworI2luY2x1ZGUgIlNETF94Ymlvcy5oIgorCisvKi0tLSBEZWZpbmVzIC0tLSovCisKKy8qIFZzZXRzY3JlZW4oKSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1JX01BR0lDCTB4NEQ0OSAKKworZW51bSB7CisJQ01EX0dFVE1PREU9MCwKKwlDTURfU0VUTU9ERSwKKwlDTURfR0VUSU5GTywKKwlDTURfQUxMT0NQQUdFLAorCUNNRF9GUkVFUEFHRSwKKwlDTURfRkxJUFBBR0UsCisJQ01EX0FMTE9DTUVNLAorCUNNRF9GUkVFTUVNLAorCUNNRF9TRVRBRFIsCisJQ01EX0VOVU1NT0RFUworfTsKKworZW51bSB7CisJRU5VTU1PREVfRVhJVD0wLAorCUVOVU1NT0RFX0NPTlQKK307CisKK2VudW0geworCUJMS19FUlI9MCwKKwlCTEtfT0ssCisJQkxLX0NMRUFSRUQKK307CisKKy8qIHNjckZsYWdzICovCisjZGVmaW5lIFNDUklORk9fT0sgMQorCisvKiBzY3JDbHV0ICovCisjZGVmaW5lIE5PX0NMVVQgMAorI2RlZmluZSBIQVJEX0NMVVQgMQorI2RlZmluZSBTT0ZUX0NMVVQgMgorCisvKiBzY3JGb3JtYXQgKi8KKyNkZWZpbmUgSU5URVJMRUFWRV9QTEFORVMgMAorI2RlZmluZSBTVEFOREFSRF9QTEFORVMgIDEKKyNkZWZpbmUgUEFDS0VEUElYX1BMQU5FUyAyCisKKy8qIGJpdEZsYWdzICovCisjZGVmaW5lIFNUQU5EQVJEX0JJVFMgIDEKKyNkZWZpbmUgRkFMQ09OX0JJVFMgICAyCisjZGVmaW5lIElOVEVMX0JJVFMgICA4CisKKy8qLS0tIFN0cnVjdHVyZXMgLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3NjcmJsayB7IAorCXVuc2lnbmVkIGxvbmcJc2l6ZTsJCS8qIHNpemUgb2Ygc3RydWt0dXJlICovIAorCXVuc2lnbmVkIGxvbmcJYmxrX3N0YXR1czsJLyogc3RhdHVzIGJpdHMgb2YgYmxrICovIAorCXVuc2lnbmVkIGxvbmcJYmxrX3N0YXJ0OwkvKiBTdGFydCBBZHJlc3MgKi8gCisJdW5zaWduZWQgbG9uZwlibGtfbGVuOwkvKiBsZW5ndGggb2YgbWVtYmxrICovIAorCXVuc2lnbmVkIGxvbmcJYmxrX3g7CQkvKiB4IHBvcyBpbiB0b3RhbCBzY3JlZW4qLyAKKwl1bnNpZ25lZCBsb25nCWJsa195OwkJLyogeSBwb3MgaW4gdG90YWwgc2NyZWVuICovIAorCXVuc2lnbmVkIGxvbmcJYmxrX3c7CQkvKiB3aWR0aCAqLyAKKwl1bnNpZ25lZCBsb25nCWJsa19oOwkJLyogaGVpZ2h0ICovIAorCXVuc2lnbmVkIGxvbmcJYmxrX3dyYXA7CS8qIHdpZHRoIGluIGJ5dGVzICovIAorfSBTQ1JNRU1CTEs7CisKK3R5cGVkZWYgc3RydWN0IHNjcmVlbmluZm8geyAKKwl1bnNpZ25lZCBsb25nCXNpemU7CQkvKiBTaXplIG9mIHN0cnVjdHVyZSAqLyAKKwl1bnNpZ25lZCBsb25nCWRldklEOwkJLyogZGV2aWNlIGlkIG51bWJlciAqLyAKKwl1bnNpZ25lZCBjaGFyCW5hbWVbNjRdOwkvKiBGcmllbmRseSBuYW1lIG9mIFNjcmVlbiAqLyAKKwl1bnNpZ25lZCBsb25nCXNjckZsYWdzOwkvKiBzb21lIEZsYWdzICovIAorCXVuc2lnbmVkIGxvbmcJZnJhbWVhZHI7CS8qIEFkcmVzcyBvZiBmcmFtZWJ1ZmZlciAqLyAKKwl1bnNpZ25lZCBsb25nCXNjckhlaWdodDsJLyogdmlzaWJsZSBYIHJlcyAqLyAKKwl1bnNpZ25lZCBsb25nCXNjcldpZHRoOwkvKiB2aXNpYmxlIFkgcmVzICovIAorCXVuc2lnbmVkIGxvbmcJdmlydEhlaWdodDsJLyogdmlydHVhbCBYIHJlcyAqLyAKKwl1bnNpZ25lZCBsb25nCXZpcnRXaWR0aDsJLyogdmlydHVhbCBZIHJlcyAqLyAKKwl1bnNpZ25lZCBsb25nCXNjclBsYW5lczsJLyogY29sb3IgUGxhbmVzICovIAorCXVuc2lnbmVkIGxvbmcJc2NyQ29sb3JzOwkvKiAjIG9mIGNvbG9ycyAqLyAKKwl1bnNpZ25lZCBsb25nCWxpbmVXcmFwOwkvKiAjIG9mIEJ5dGVzIHRvIG5leHQgbGluZSAqLyAKKwl1bnNpZ25lZCBsb25nCXBsYW5lV2FycDsJLyogIyBvZiBCeXRlcyB0byBuZXh0IHBsYW5lICovIAorCXVuc2lnbmVkIGxvbmcJc2NyRm9ybWF0OwkvKiBzY3JlZW4gRm9ybWF0ICovIAorCXVuc2lnbmVkIGxvbmcJc2NyQ2x1dDsJLyogdHlwZSBvZiBjbHV0ICovIAorCXVuc2lnbmVkIGxvbmcJcmVkQml0czsJLyogTWFzayBvZiBSZWQgQml0cyAqLyAKKwl1bnNpZ25lZCBsb25nCWdyZWVuQml0czsJLyogTWFzayBvZiBHcmVlbiBCaXRzICovIAorCXVuc2lnbmVkIGxvbmcJYmx1ZUJpdHM7CS8qIE1hc2sgb2YgQmx1ZSBCaXRzICovIAorCXVuc2lnbmVkIGxvbmcJYWxwaGFCaXRzOwkvKiBNYXNrIG9mIEFscGhhIEJpdHMgKi8gCisJdW5zaWduZWQgbG9uZwlnZW5sb2NrQml0czsvKiBNYXNrIG9mIEdlbmxvY2sgQml0cyAqLyAKKwl1bnNpZ25lZCBsb25nCXVudXNlZEJpdHM7CS8qIE1hc2sgb2YgdW51c2VkIEJpdHMgKi8gCisJdW5zaWduZWQgbG9uZwliaXRGbGFnczsJLyogQml0cyBvcmdhbmlzYXRpb24gZmxhZ3MgKi8gCisJdW5zaWduZWQgbG9uZwltYXhtZW07CQkvKiBtYXguIG1lbW9yeSBpbiB0aGlzIG1vZGUgKi8gCisJdW5zaWduZWQgbG9uZwlwYWdlbWVtOwkvKiBuZWVkZWQgbWVtb3J5IGZvciBvbmUgcGFnZSAqLyAKKwl1bnNpZ25lZCBsb25nCW1heF94OwkJLyogbWF4LiBwb3NzaWJsZSB3aWR0aCAqLyAKKwl1bnNpZ25lZCBsb25nCW1heF95OwkJLyogbWF4LiBwb3NzaWJsZSBoZWlndGggKi8gCit9IFNDUkVFTklORk87IAorCisvKi0tLSBGdW5jdGlvbnMgcHJvdG90eXBlcyAtLS0qLworCit2b2lkIFNETF9YQklPU19MaXN0TWlsYW5Nb2RlcyhfVEhJUywgaW50IGFjdHVhbGx5X2FkZCk7CisKKyNlbmRpZiAvKiBfU0RMX3hiaW9zX21pbGFuX2ggKi8KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX3NiMy5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3Nfc2IzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwZWQyYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX3NiMy5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCVNjcmVlbkJsYXN0ZXIgMyBmdW5jdGlvbnMKKworCVBhdHJpY2UgTWFuZGluCisqLworCisvKi0tLSBJbmNsdWRlcyAtLS0qLworCisjaW5jbHVkZSAiU0RMX3N0ZGluYy5oIgorI2luY2x1ZGUgIlNETF94Ymlvcy5oIgorI2luY2x1ZGUgIlNETF94Ymlvc19zYjMuaCIKKworLyotLS0gRGVmaW5lcyAtLS0qLworCitjb25zdCBpbnQgU0RMX1hCSU9TX3NjcG5fcGxhbmVzX2RldmljZVtdPXsKKwlTQ1BOX0RFVl8xQlBQLAorCVNDUE5fREVWXzRCUFAsCisJU0NQTl9ERVZfOEJQUCwKKwlTQ1BOX0RFVl8xNkJQUCwKKwlTQ1BOX0RFVl8yQlBQLAorCVNDUE5fREVWXzRCUFAsCisJU0NQTl9ERVZfMUJQUAorfTsKKworLyotLS0gRnVuY3Rpb25zIC0tLSovCisKK2ludCBTRExfWEJJT1NfU0IzVXNhYmxlKHNjcG5fY29va2llX3QgKmNvb2tpZV9zY3BuKQoreworCXNjcG5fc2NyZWVuaW5mb190ICpzY3JpbmZvOworCWludCBicHA7CisKKwkvKiBDaGVjayBpZiBjdXJyZW50IFNCMyBtb2RlIGlzIHVzYWJsZSwgaS5lLiA4IG9yIDE2YnBwICovCisJc2NyaW5mbyA9IGNvb2tpZV9zY3BuLT5zY3JlZW5faW5mbzsKKwlicHAgPSAxPDwoU0RMX1hCSU9TX3NjcG5fcGxhbmVzX2RldmljZVtzY3JpbmZvLT5kZXZpY2VdKTsKKworCWlmICgoYnBwPT04KSB8fCAoYnBwPT0xNikpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgU0RMX1hCSU9TX0xpc3RTQjNNb2RlcyhfVEhJUywgaW50IGFjdHVhbGx5X2FkZCwgc2Nwbl9jb29raWVfdCAqY29va2llX3NjcG4pCit7CisJc2Nwbl9zY3JlZW5pbmZvX3QgKnNjcmluZm87CisJeGJpb3Ntb2RlX3QgbW9kZWluZm87CisKKwlzY3JpbmZvID0gY29va2llX3NjcG4tPnNjcmVlbl9pbmZvOworCWlmIChhY3R1YWxseV9hZGQpIHsKKwkJc2NyaW5mby0+aF9wb3MgPSBzY3JpbmZvLT52X3BvcyA9IDA7CisJfQorCisJbW9kZWluZm8ubnVtYmVyID0gLTE7CisJbW9kZWluZm8ud2lkdGggPSBzY3JpbmZvLT52aXJ0dWFsX3dpZHRoOworCW1vZGVpbmZvLmhlaWdodCA9IHNjcmluZm8tPnZpcnR1YWxfaGVpZ2h0OworCW1vZGVpbmZvLmRlcHRoID0gMTw8KFNETF9YQklPU19zY3BuX3BsYW5lc19kZXZpY2Vbc2NyaW5mby0+ZGV2aWNlXSk7CisJbW9kZWluZm8uZmxhZ3MgPSAobW9kZWluZm8uZGVwdGggPT0gOCA/IFhCSU9TTU9ERV9DMlAgOiAwKTsKKworCVNETF9YQklPU19BZGRNb2RlKHRoaXMsIGFjdHVhbGx5X2FkZCwgJm1vZGVpbmZvKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX3NiMy5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3Nfc2IzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3MmMzMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS9zcmMvdmlkZW8veGJpb3MvU0RMX3hiaW9zX3NiMy5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgICAgU0RMIC0gU2ltcGxlIERpcmVjdE1lZGlhIExheWVyCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBTYW0gTGFudGluZ2EKKyAgICBzbG91a2VuQGxpYnNkbC5vcmcKKyovCisjaW5jbHVkZSAiU0RMX2NvbmZpZy5oIgorCisvKgorCVNjcmVlbkJsYXN0ZXIgMyBkZWZpbml0aW9ucworCisJUGF0cmljZSBNYW5kaW4KKyovCisKKyNpZm5kZWYgX1NETF94Ymlvc19zYjNfaF8KKyNkZWZpbmUgX1NETF94Ymlvc19zYjNfaF8KKworLyotLS0gRGVmaW5lcyAtLS0qLworCisjaWZuZGVmIENfU0NQTgorI2RlZmluZSBDX1NDUE4gMHg1MzQzNTA0RUwKKyNlbmRpZgorCisjZGVmaW5lIFNDUE5fREVWXzFCUFAJMAorI2RlZmluZSBTQ1BOX0RFVl8yQlBQCTEKKyNkZWZpbmUgU0NQTl9ERVZfNEJQUAkyCisjZGVmaW5lIFNDUE5fREVWXzhCUFAJMworI2RlZmluZSBTQ1BOX0RFVl8xNkJQUAk0CisKK2V4dGVybiBjb25zdCBpbnQgU0RMX1hCSU9TX3NjcG5fcGxhbmVzX2RldmljZVtdOworCisvKi0tLSBUeXBlcyAtLS0qLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQJdmlydHVhbF93aWR0aDsJLyogVmlydHVhbCBzY3JlZW4gd2lkdGggKi8KKwl1bnNpZ25lZCBzaG9ydAl2aXJ0dWFsX2hlaWdodDsJLyogVmlydHVhbCBzY3JlZW4gaGVpZ2h0ICovCisJdW5zaWduZWQgc2hvcnQJdmlzaWJsZV93aWR0aDsJLyogVmlzaWJsZSB3aWR0aCAqLworCXVuc2lnbmVkIHNob3J0CXZpc2libGVfaGVpZ2h0OwkvKiBWaXNpYmxlIGhlaWdodCAqLworCXVuc2lnbmVkIHNob3J0CWhfcG9zOwkvKiBIb3Jpem9udGFsIHBvc2l0aW9uIGluIHZpcnR1YWwgc2NyZWVuICovCisJdW5zaWduZWQgc2hvcnQJdl9wb3M7CS8qIFZlcnRpY2FsIHBvc2l0aW9uIGluIHZpcnR1YWwgc2NyZWVuICovCisJdW5zaWduZWQgc2hvcnQJZHVtbXk7CisJdW5zaWduZWQgbG9uZwlzaXplOwkvKiBTaXplIG9mIHNjcmVlbiBpbiBieXRlcyAqLworCXVuc2lnbmVkIHNob3J0CWRldmljZTsJLyogRGV2aWNlIG51bWJlciB0byBmaW5kIHBsYW5lcyA9IGdldFJleigpICovCisJCQkJCQkJLyogPSBJbmRleCBpbiBzY3BuX3BsYW5lc19kZXZpY2VbXSAqLworfSBzY3BuX3NjcmVlbmluZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJbWFnaWM7CS8qIGp1c3QgYSBCUkEgYXNzZW1ibGVyIGp1bXAgKi8KKwl1bnNpZ25lZCBzaG9ydAl2ZXJzaW9uOworCXZvaWQJCQkqZHVtbXkxOworCXVuc2lnbmVkIHNob3J0CXB0c291dDBfMTsKKwl1bnNpZ25lZCBzaG9ydAlwdHNvdXQwXzI7CisJdW5zaWduZWQgc2hvcnQJZHVtbXkzOworCXVuc2lnbmVkIGNoYXIJZGF0ZVs4XTsJLyogRGF0ZSBvZiBwcm9ncmFtIGJ1aWxkICovCisJdW5zaWduZWQgY2hhcglhc21fc3RyaW5nWzMwXTsJLyogMTAgdGltZXMgdGhlICdBU00nIHN0cmluZyAqLworCXVuc2lnbmVkIHNob3J0CWR1bW15NDsKKwlzY3BuX3NjcmVlbmluZm9fdAkqc2NyZWVuX2luZm87CisJdW5zaWduZWQgc2hvcnQJZHVtbXk2OworfSBzY3BuX2Nvb2tpZV90OworCisvKi0tLSBGdW5jdGlvbiBwcm90b3R5cGVzIC0tLSovCisKK2ludCBTRExfWEJJT1NfU0IzVXNhYmxlKHNjcG5fY29va2llX3QgKmNvb2tpZV9zY3BuKTsKKwordm9pZCBTRExfWEJJT1NfTGlzdFNCM01vZGVzKF9USElTLCBpbnQgYWN0dWFsbHlfYWRkLCBzY3BuX2Nvb2tpZV90ICpjb29raWVfc2Nwbik7CisKKyNlbmRpZiAvKiBfU0RMX3hiaW9zX3NiM19oXyAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfdHZlaWxsZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfdHZlaWxsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjg0OTkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc190dmVpbGxlLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJVHVyYm8gdmVpbGxlIHNjcmVlbnNhdmVyCisKKwlQYXRyaWNlIE1hbmRpbgorKi8KKworI2luY2x1ZGUgPG1pbnQvY29va2llLmg+CisKKyNpbmNsdWRlICJTRExfeGJpb3MuaCIKKyNpbmNsdWRlICJTRExfeGJpb3NfdHZlaWxsZS5oIgorCitzdGF0aWMgdHZlaWxsZV90ICpjb29raWVfdmVpbCA9IE5VTEw7CitzdGF0aWMgaW50IHN0YXR1czsKKworaW50IFNETF9YQklPU19UdmVpbGxlUHJlc2VudChfVEhJUykKK3sKKwlsb25nIGR1bW15OworCisJY29va2llX3ZlaWwgPSBOVUxMOworCWlmIChHZXRjb29raWUoQ19WZWlMLCAmZHVtbXkpID09IENfRk9VTkQpIHsKKwkJY29va2llX3ZlaWwgPSAodHZlaWxsZV90ICopIGR1bW15OworCX0KKworCXJldHVybiAoY29va2llX3ZlaWwgIT0gTlVMTCk7Cit9CisKK3ZvaWQgU0RMX1hCSU9TX1R2ZWlsbGVEaXNhYmxlKF9USElTKQoreworCWlmIChjb29raWVfdmVpbCkgeworCQlzdGF0dXMgPSBjb29raWVfdmVpbC0+ZW5hYmxlZDsKKwkJY29va2llX3ZlaWwtPmVuYWJsZWQgPSAweGZmOworCX0KK30KKwordm9pZCBTRExfWEJJT1NfVHZlaWxsZUVuYWJsZShfVEhJUykKK3sKKwlpZiAoY29va2llX3ZlaWwpIHsKKwkJY29va2llX3ZlaWwtPmVuYWJsZWQgPSBzdGF0dXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfdHZlaWxsZS5oIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3NyYy92aWRlby94Ymlvcy9TRExfeGJpb3NfdHZlaWxsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWNkN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3JjL3ZpZGVvL3hiaW9zL1NETF94Ymlvc190dmVpbGxlLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAgICBTREwgLSBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMiBTYW0gTGFudGluZ2EKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICAgIFNhbSBMYW50aW5nYQorICAgIHNsb3VrZW5AbGlic2RsLm9yZworKi8KKyNpbmNsdWRlICJTRExfY29uZmlnLmgiCisKKy8qCisJVHVyYm8gdmVpbGxlIHNjcmVlbnNhdmVyCisKKwlQYXRyaWNlIE1hbmRpbgorKi8KKworI2lmbmRlZiBfU0RMX3hiaW9zX3R2ZWlsbGVfaAorI2RlZmluZSBfU0RMX3hiaW9zX3R2ZWlsbGVfaAorCisjaW5jbHVkZSAiU0RMX3hiaW9zLmgiCisKKy8qLS0tIFN0cnVjdHVyZXMgLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJdmVyc2lvbjsKKwl2b2lkCQkoKnByZ19wdHIpKCk7CisJdm9pZAkJKCprYmRfcHRyKSgpOworCXZvaWQJCSgqdmJsX3B0cikoKTsKKwl1bnNpZ25lZCBsb25nCXZibF9jb3VudDsKKwl2b2lkCQkoKm9sZGtiZF9wdHIpKCk7CisJdW5zaWduZWQgbG9uZwlvZmZfY291bnQ7CisJdW5zaWduZWQgbG9uZwlwcmdfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCWR1bW15MVs0XTsKKwl1bnNpZ25lZCBjaGFyCWR1bW15MjsKKwl1bnNpZ25lZCBjaGFyCXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAlmcmVxOworCXVuc2lnbmVkIHNob3J0CWR1bW15MzsKKwl1bnNpZ25lZCBjaGFyCWNsZWFyX2ZpcnN0OworCXVuc2lnbmVkIGNoYXIJZW5hYmxlZDsJLyogMD1lbmFibGVkLCAweGZmPWRpc2FibGVkICovCisJdW5zaWduZWQgY2hhcglzZXJpYWxfcmVkaXI7CisJdW5zaWduZWQgY2hhcglkdW1teTQ7CisJdm9pZAkJKCpvbGRzZXJpYWxfcHRyKSgpOworfSB0dmVpbGxlX3Q7CisKKy8qLS0tIEZ1bmN0aW9ucyBwcm90b3R5cGVzIC0tLSovCisKK2ludCBTRExfWEJJT1NfVHZlaWxsZVByZXNlbnQoX1RISVMpOwordm9pZCBTRExfWEJJT1NfVHZlaWxsZURpc2FibGUoX1RISVMpOwordm9pZCBTRExfWEJJT1NfVHZlaWxsZUVuYWJsZShfVEhJUyk7CisKKyNlbmRpZiAvKiBfU0RMX3hiaW9zX3R2ZWlsbGVfaCAqLwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3N5bWJpYW4uemlwIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3N5bWJpYW4uemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNjg2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvc3ltYmlhbi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvQ09QWUlORyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjMjdlMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L0NPUFlJTkcKQEAgLTAsMCArMSw4IEBACisKK1RoZSB0ZXN0IHByb2dyYW1zIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUgYXJlIGZvciBkZW1vbnN0cmF0aW5nIGFuZAordGVzdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgU0RMIGxpYnJhcnksIGFuZCBhcmUgcGxhY2VkIGluIHRoZQorcHVibGljIGRvbWFpbi4KKworT2N0b2JlciAyOCwgMTk5NworLS0KKwlTYW0gTGFudGluZ2EJCQkJKHNsb3VrZW5AbGlic2RsLm9yZykKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L01ha2VmaWxlLmluIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1YmI4YgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTE3IEBACisjIE1ha2VmaWxlIHRvIGJ1aWxkIHRoZSBTREwgdGVzdHMKKworc3JjZGlyICA9IEBzcmNkaXJACisKK0NDICAgICAgPSBAQ0NACitFWEUJPSBARVhFQAorQ0ZMQUdTICA9IEBDRkxBR1NACitMSUJTCT0gQExJQlNACisKK1RBUkdFVFMgPSBjaGVja2tleXMkKEVYRSkgZ3JheXdpbiQoRVhFKSBsb29wd2F2ZSQoRVhFKSB0ZXN0YWxwaGEkKEVYRSkgdGVzdGJpdG1hcCQoRVhFKSB0ZXN0YmxpdHNwZWVkJChFWEUpIHRlc3RjZHJvbSQoRVhFKSB0ZXN0Y3Vyc29yJChFWEUpIHRlc3RkeW5nbCQoRVhFKSB0ZXN0ZXJyb3IkKEVYRSkgdGVzdGZpbGUkKEVYRSkgdGVzdGdhbW1hJChFWEUpIHRlc3RnbCQoRVhFKSB0ZXN0aHJlYWQkKEVYRSkgdGVzdGljb252JChFWEUpIHRlc3Rqb3lzdGljayQoRVhFKSB0ZXN0a2V5cyQoRVhFKSB0ZXN0bG9jayQoRVhFKSB0ZXN0b3ZlcmxheTIkKEVYRSkgdGVzdG92ZXJsYXkkKEVYRSkgdGVzdHBhbGV0dGUkKEVYRSkgdGVzdHBsYXRmb3JtJChFWEUpIHRlc3RzZW0kKEVYRSkgdGVzdHNwcml0ZSQoRVhFKSB0ZXN0dGltZXIkKEVYRSkgdGVzdHZlciQoRVhFKSB0ZXN0dmlkaW5mbyQoRVhFKSB0ZXN0d2luJChFWEUpIHRlc3R3bSQoRVhFKSB0aHJlYWR3aW4kKEVYRSkgdG9ydHVyZXRocmVhZCQoRVhFKSB0ZXN0bG9hZHNvJChFWEUpCisKK2FsbDogJChUQVJHRVRTKQorCitjaGVja2tleXMkKEVYRSk6ICQoc3JjZGlyKS9jaGVja2tleXMuYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpCisKK2dyYXl3aW4kKEVYRSk6ICQoc3JjZGlyKS9ncmF5d2luLmMKKwkkKENDKSAtbyAkQCAkPyAkKENGTEFHUykgJChMSUJTKQorCitsb29wd2F2ZSQoRVhFKTogJChzcmNkaXIpL2xvb3B3YXZlLmMKKwkkKENDKSAtbyAkQCAkPyAkKENGTEFHUykgJChMSUJTKQorCit0ZXN0YWxwaGEkKEVYRSk6ICQoc3JjZGlyKS90ZXN0YWxwaGEuYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpIEBNQVRITElCQAorCit0ZXN0Yml0bWFwJChFWEUpOiAkKHNyY2RpcikvdGVzdGJpdG1hcC5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdGJsaXRzcGVlZCQoRVhFKTogJChzcmNkaXIpL3Rlc3RibGl0c3BlZWQuYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpCisKK3Rlc3RjZHJvbSQoRVhFKTogJChzcmNkaXIpL3Rlc3RjZHJvbS5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdGN1cnNvciQoRVhFKTogJChzcmNkaXIpL3Rlc3RjdXJzb3IuYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpCisKK3Rlc3RkeW5nbCQoRVhFKTogJChzcmNkaXIpL3Rlc3RkeW5nbC5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdGVycm9yJChFWEUpOiAkKHNyY2RpcikvdGVzdGVycm9yLmMKKwkkKENDKSAtbyAkQCAkPyAkKENGTEFHUykgJChMSUJTKQorCit0ZXN0ZmlsZSQoRVhFKTogJChzcmNkaXIpL3Rlc3RmaWxlLmMKKwkkKENDKSAtbyAkQCAkPyAkKENGTEFHUykgJChMSUJTKQorCit0ZXN0Z2FtbWEkKEVYRSk6ICQoc3JjZGlyKS90ZXN0Z2FtbWEuYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpIEBNQVRITElCQAorCit0ZXN0Z2wkKEVYRSk6ICQoc3JjZGlyKS90ZXN0Z2wuYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpIEBHTExJQkAgQE1BVEhMSUJACisKK3Rlc3RocmVhZCQoRVhFKTogJChzcmNkaXIpL3Rlc3RocmVhZC5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdGljb252JChFWEUpOiAkKHNyY2RpcikvdGVzdGljb252LmMKKwkkKENDKSAtbyAkQCAkPyAkKENGTEFHUykgJChMSUJTKQorCit0ZXN0am95c3RpY2skKEVYRSk6ICQoc3JjZGlyKS90ZXN0am95c3RpY2suYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpCisKK3Rlc3RrZXlzJChFWEUpOiAkKHNyY2RpcikvdGVzdGtleXMuYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpCisKK3Rlc3Rsb2NrJChFWEUpOiAkKHNyY2RpcikvdGVzdGxvY2suYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpCisKK3Rlc3RvdmVybGF5MiQoRVhFKTogJChzcmNkaXIpL3Rlc3RvdmVybGF5Mi5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdG92ZXJsYXkkKEVYRSk6ICQoc3JjZGlyKS90ZXN0b3ZlcmxheS5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdHBhbGV0dGUkKEVYRSk6ICQoc3JjZGlyKS90ZXN0cGFsZXR0ZS5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykgQE1BVEhMSUJACisKK3Rlc3RwbGF0Zm9ybSQoRVhFKTogJChzcmNkaXIpL3Rlc3RwbGF0Zm9ybS5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdHNlbSQoRVhFKTogJChzcmNkaXIpL3Rlc3RzZW0uYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpCisKK3Rlc3RzcHJpdGUkKEVYRSk6ICQoc3JjZGlyKS90ZXN0c3ByaXRlLmMKKwkkKENDKSAtbyAkQCAkPyAkKENGTEFHUykgJChMSUJTKSBATUFUSExJQkAKKwordGVzdHRpbWVyJChFWEUpOiAkKHNyY2RpcikvdGVzdHRpbWVyLmMKKwkkKENDKSAtbyAkQCAkPyAkKENGTEFHUykgJChMSUJTKQorCit0ZXN0dmVyJChFWEUpOiAkKHNyY2RpcikvdGVzdHZlci5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdHZpZGluZm8kKEVYRSk6ICQoc3JjZGlyKS90ZXN0dmlkaW5mby5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdHdpbiQoRVhFKTogJChzcmNkaXIpL3Rlc3R3aW4uYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpCisKK3Rlc3R3bSQoRVhFKTogJChzcmNkaXIpL3Rlc3R3bS5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGhyZWFkd2luJChFWEUpOiAkKHNyY2RpcikvdGhyZWFkd2luLmMKKwkkKENDKSAtbyAkQCAkPyAkKENGTEFHUykgJChMSUJTKQorCit0b3J0dXJldGhyZWFkJChFWEUpOiAkKHNyY2RpcikvdG9ydHVyZXRocmVhZC5jCisJJChDQykgLW8gJEAgJD8gJChDRkxBR1MpICQoTElCUykKKwordGVzdGxvYWRzbyQoRVhFKTogJChzcmNkaXIpL3Rlc3Rsb2Fkc28uYworCSQoQ0MpIC1vICRAICQ/ICQoQ0ZMQUdTKSAkKExJQlMpCisKKworY2xlYW46CisJcm0gLWYgJChUQVJHRVRTKQorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgTWFrZWZpbGUKKwlybSAtZiBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBjb25maWcubG9nCisJcm0gLXJmICQoc3JjZGlyKS9hdXRvbTR0ZSoKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L1JFQURNRSBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Y1NjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvUkVBRE1FCkBAIC0wLDAgKzEsMzUgQEAKKworVGhlc2UgYXJlIHRlc3QgcHJvZ3JhbXMgZm9yIHRoZSBTREwgbGlicmFyeToKKworCWNoZWNra2V5cwlXYXRjaCB0aGUga2V5IGV2ZW50cyB0byBjaGVjayB0aGUga2V5Ym9hcmQKKwlncmF5d2luCQlEaXNwbGF5IGEgZ3JheSBncmFkaWVudCBhbmQgY2VudGVyIG1vdXNlIG9uIHNwYWNlYmFyCisJbG9vcHdhdmUJQXVkaW8gdGVzdCAtLSBsb29wIHBsYXlpbmcgYSBXQVYgZmlsZQorCXRlc3RhbHBoYQlEaXNwbGF5IGFuIGFscGhhIGZhZGVkIGljb24gLS0gcGFpbnQgd2l0aCBtb3VzZQorCXRlc3RiaXRtYXAJVGVzdCBkaXNwbGF5aW5nIDEtYml0IGJpdG1hcHMKKwl0ZXN0YmxpdHNwZWVkCVRlc3RzIHBlcmZvcm1hbmNlIG9mIFNETCdzIGJsaXR0ZXJzIGFuZCBjb252ZXJ0ZXJzLgorCXRlc3RjZHJvbQlTYW1wbGUgYXVkaW8gQ0QgY29udHJvbCBwcm9ncmFtCisJdGVzdGN1cnNvcglUZXN0cyBjdXN0b20gbW91c2UgY3Vyc29yCisJdGVzdGR5bmdsCVRlc3RzIGR5bmFtaWNhbGx5IGxvYWRpbmcgT3BlbkdMIGxpYnJhcnkKKwl0ZXN0ZXJyb3IJVGVzdHMgbXVsdGktdGhyZWFkZWQgZXJyb3IgaGFuZGxpbmcKKwl0ZXN0ZmlsZQlUZXN0cyBSV29wcyBsYXllcgorCXRlc3RnYW1tYQlUZXN0cyB2aWRlbyBkZXZpY2UgZ2FtbWEgcmFtcAorCXRlc3RnbAkJQSB2ZXJ5IHNpbXBsZSBleGFtcGxlIG9mIHVzaW5nIE9wZW5HTCB3aXRoIFNETAorCXRlc3RocmVhZAlIYWNrZWQgdXAgdGVzdCBvZiBtdWx0aS10aHJlYWRpbmcKKwl0ZXN0aWNvbnYJVGVzdHMgaW50ZXJuYXRpb25hbCBzdHJpbmcgY29udmVyc2lvbgorCXRlc3Rqb3lzdGljawlMaXN0IGpveXN0aWNrcyBhbmQgd2F0Y2ggam95c3RpY2sgZXZlbnRzCisJdGVzdGtleXMJTGlzdCB0aGUgYXZhaWxhYmxlIGtleWJvYXJkIGtleXMKKwl0ZXN0bG9hZHNvCVRlc3RzIHRoZSBsb2FkYWJsZSBsaWJyYXJ5IGxheWVyCisJdGVzdGxvY2sJSGFja2VkIHVwIHRlc3Qgb2YgbXVsdGktdGhyZWFkaW5nIGFuZCBsb2NraW5nCisJdGVzdG92ZXJsYXkJVGVzdHMgdGhlIHNvZnR3YXJlL2hhcmR3YXJlIG92ZXJsYXkgZnVuY3Rpb25hbGl0eS4KKwl0ZXN0b3ZlcmxheTIJVGVzdHMgdGhlIG92ZXJsYXkgZmxpY2tlcmluZy9zY2FsaW5nIGR1cmluZyBwbGF5YmFjay4KKwl0ZXN0cGFsZXR0ZQlUZXN0cyBwYWxldHRlIGNvbG9yIGN5Y2xpbmcKKwl0ZXN0cGxhdGZvcm0JVGVzdHMgdHlwZXMsIGVuZGlhbm5lc3MgYW5kIGNwdSBjYXBhYmlsaXRpZXMKKwl0ZXN0c2VtCQlUZXN0cyBTREwncyBzZW1hcGhvcmUgaW1wbGVtZW50YXRpb24KKwl0ZXN0c3ByaXRlCUV4YW1wbGUgb2YgZmFzdCBzcHJpdGUgbW92ZW1lbnQgb24gdGhlIHNjcmVlbgorCXRlc3R0aW1lcglUZXN0IHRoZSB0aW1lciBmYWNpbGl0aWVzCisJdGVzdHZlcgkJQ2hlY2sgdGhlIHZlcnNpb24gYW5kIGR5bmFtaWMgbG9hZGluZyBhbmQgZW5kaWFubmVzcworCXRlc3R2aWRpbmZvCVNob3cgdGhlIHBpeGVsIGZvcm1hdCBvZiB0aGUgZGlzcGxheSBhbmQgcGVyZm9tIHRoZSBiZW5jaG1hcmsKKwl0ZXN0d2luCQlEaXNwbGF5IGEgQk1QIGltYWdlIGF0IHZhcmlvdXMgZGVwdGhzCisJdGVzdHdtCQlUZXN0IHdpbmRvdyBtYW5hZ2VyIC0tIHRpdGxlLCBpY29uLCBldmVudHMKKwl0aHJlYWR3aW4JVGVzdCBtdWx0aS10aHJlYWRlZCBldmVudCBoYW5kbGluZworCXRvcnR1cmV0aHJlYWQJU2ltcGxlIHRlc3QgZm9yIHRocmVhZCBjcmVhdGlvbi9kZXN0cnVjdGlvbgpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvYWNpbmNsdWRlLm00IGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvYWNpbmNsdWRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGY0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9hY2luY2x1ZGUubTQKQEAgLTAsMCArMSwxODEgQEAKKyMgQ29uZmlndXJlIHBhdGhzIGZvciBTREwKKyMgU2FtIExhbnRpbmdhIDkvMjEvOTkKKyMgc3RvbGVuIGZyb20gTWFuaXNoIFNpbmdoCisjIHN0b2xlbiBiYWNrIGZyb20gRnJhbmsgQmVsZXcKKyMgc3RvbGVuIGZyb20gTWFuaXNoIFNpbmdoCisjIFNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIE93ZW4gVGF5bG9yCisKK2RubCBBTV9QQVRIX1NETChbTUlOSU1VTS1WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXV0pCitkbmwgVGVzdCBmb3IgU0RMLCBhbmQgZGVmaW5lIFNETF9DRkxBR1MgYW5kIFNETF9MSUJTCitkbmwKK0FDX0RFRlVOKFtBTV9QQVRIX1NETF0sCitbZG5sIAorZG5sIEdldCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMgZnJvbSB0aGUgc2RsLWNvbmZpZyBzY3JpcHQKK2RubAorQUNfQVJHX1dJVEgoc2RsLXByZWZpeCxbICAtLXdpdGgtc2RsLXByZWZpeD1QRlggICBQcmVmaXggd2hlcmUgU0RMIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKyAgICAgICAgICAgIHNkbF9wcmVmaXg9IiR3aXRodmFsIiwgc2RsX3ByZWZpeD0iIikKK0FDX0FSR19XSVRIKHNkbC1leGVjLXByZWZpeCxbICAtLXdpdGgtc2RsLWV4ZWMtcHJlZml4PVBGWCBFeGVjIHByZWZpeCB3aGVyZSBTREwgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLAorICAgICAgICAgICAgc2RsX2V4ZWNfcHJlZml4PSIkd2l0aHZhbCIsIHNkbF9leGVjX3ByZWZpeD0iIikKK0FDX0FSR19FTkFCTEUoc2RsdGVzdCwgWyAgLS1kaXNhYmxlLXNkbHRlc3QgICAgICAgRG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IFNETCBwcm9ncmFtXSwKKwkJICAgICwgZW5hYmxlX3NkbHRlc3Q9eWVzKQorCisgIGlmIHRlc3QgeCRzZGxfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICBzZGxfYXJncz0iJHNkbF9hcmdzIC0tZXhlYy1wcmVmaXg9JHNkbF9leGVjX3ByZWZpeCIKKyAgICBpZiB0ZXN0IHgke1NETF9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgIFNETF9DT05GSUc9JHNkbF9leGVjX3ByZWZpeC9iaW4vc2RsLWNvbmZpZworICAgIGZpCisgIGZpCisgIGlmIHRlc3QgeCRzZGxfcHJlZml4ICE9IHggOyB0aGVuCisgICAgc2RsX2FyZ3M9IiRzZGxfYXJncyAtLXByZWZpeD0kc2RsX3ByZWZpeCIKKyAgICBpZiB0ZXN0IHgke1NETF9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgIFNETF9DT05GSUc9JHNkbF9wcmVmaXgvYmluL3NkbC1jb25maWcKKyAgICBmaQorICBmaQorCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIFBBVEg9IiRwcmVmaXgvYmluOiRwcmVmaXgvdXNyL2JpbjokUEFUSCIKKyAgZmkKKyAgQUNfUEFUSF9QUk9HKFNETF9DT05GSUcsIHNkbC1jb25maWcsIG5vLCBbJFBBVEhdKQorICBtaW5fc2RsX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjExLjAsJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgU0RMIC0gdmVyc2lvbiA+PSAkbWluX3NkbF92ZXJzaW9uKQorICBub19zZGw9IiIKKyAgaWYgdGVzdCAiJFNETF9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICBub19zZGw9eWVzCisgIGVsc2UKKyAgICBTRExfQ0ZMQUdTPWAkU0RMX0NPTkZJRyAkc2RsY29uZl9hcmdzIC0tY2ZsYWdzYAorICAgIFNETF9MSUJTPWAkU0RMX0NPTkZJRyAkc2RsY29uZl9hcmdzIC0tbGlic2AKKworICAgIHNkbF9tYWpvcl92ZXJzaW9uPWAkU0RMX0NPTkZJRyAkc2RsX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBzZGxfbWlub3JfdmVyc2lvbj1gJFNETF9DT05GSUcgJHNkbF9hcmdzIC0tdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wyLydgCisgICAgc2RsX21pY3JvX3ZlcnNpb249YCRTRExfQ09ORklHICRzZGxfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9zZGx0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkU0RMX0NGTEFHUyIKKyAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJFNETF9DRkxBR1MiCisgICAgICBMSUJTPSIkTElCUyAkU0RMX0xJQlMiCitkbmwKK2RubCBOb3cgY2hlY2sgaWYgdGhlIGluc3RhbGxlZCBTREwgaXMgc3VmZmljaWVudGx5IG5ldy4gKEFsc28gc2FuaXR5CitkbmwgY2hlY2tzIHRoZSByZXN1bHRzIG9mIHNkbC1jb25maWcgdG8gc29tZSBleHRlbnQKK2RubAorICAgICAgcm0gLWYgY29uZi5zZGx0ZXN0CisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIlNETC5oIgorCitjaGFyKgorbXlfc3RyZHVwIChjaGFyICpzdHIpCit7CisgIGNoYXIgKm5ld19zdHI7CisgIAorICBpZiAoc3RyKQorICAgIHsKKyAgICAgIG5ld19zdHIgPSAoY2hhciAqKW1hbGxvYyAoKHN0cmxlbiAoc3RyKSArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgIHN0cmNweSAobmV3X3N0ciwgc3RyKTsKKyAgICB9CisgIGVsc2UKKyAgICBuZXdfc3RyID0gTlVMTDsKKyAgCisgIHJldHVybiBuZXdfc3RyOworfQorCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IG1ham9yLCBtaW5vciwgbWljcm87CisgIGNoYXIgKnRtcF92ZXJzaW9uOworCisgIC8qIFRoaXMgaGFuZ3Mgb24gc29tZSBzeXN0ZW1zICg/KQorICBzeXN0ZW0gKCJ0b3VjaCBjb25mLnNkbHRlc3QiKTsKKyAgKi8KKyAgeyBGSUxFICpmcCA9IGZvcGVuKCJjb25mLnNkbHRlc3QiLCAiYSIpOyBpZiAoIGZwICkgZmNsb3NlKGZwKTsgfQorCisgIC8qIEhQL1VYIDkgKCVAIyEpIHdyaXRlcyB0byBzc2NhbmYgc3RyaW5ncyAqLworICB0bXBfdmVyc2lvbiA9IG15X3N0cmR1cCgiJG1pbl9zZGxfdmVyc2lvbiIpOworICBpZiAoc3NjYW5mKHRtcF92ZXJzaW9uLCAiJWQuJWQuJWQiLCAmbWFqb3IsICZtaW5vciwgJm1pY3JvKSAhPSAzKSB7CisgICAgIHByaW50ZigiJXMsIGJhZCB2ZXJzaW9uIHN0cmluZ1xuIiwgIiRtaW5fc2RsX3ZlcnNpb24iKTsKKyAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgaWYgKCgkc2RsX21ham9yX3ZlcnNpb24gPiBtYWpvcikgfHwKKyAgICAgICgoJHNkbF9tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAoJHNkbF9taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICAgKCgkc2RsX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmICgkc2RsX21pbm9yX3ZlcnNpb24gPT0gbWlub3IpICYmICgkc2RsX21pY3JvX3ZlcnNpb24gPj0gbWljcm8pKSkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYoIlxuKioqICdzZGwtY29uZmlnIC0tdmVyc2lvbicgcmV0dXJuZWQgJWQuJWQuJWQsIGJ1dCB0aGUgbWluaW11bSB2ZXJzaW9uXG4iLCAkc2RsX21ham9yX3ZlcnNpb24sICRzZGxfbWlub3JfdmVyc2lvbiwgJHNkbF9taWNyb192ZXJzaW9uKTsKKyAgICAgIHByaW50ZigiKioqIG9mIFNETCByZXF1aXJlZCBpcyAlZC4lZC4lZC4gSWYgc2RsLWNvbmZpZyBpcyBjb3JyZWN0LCB0aGVuIGl0IGlzXG4iLCBtYWpvciwgbWlub3IsIG1pY3JvKTsKKyAgICAgIHByaW50ZigiKioqIGJlc3QgdG8gdXBncmFkZSB0byB0aGUgcmVxdWlyZWQgdmVyc2lvbi5cbiIpOworICAgICAgcHJpbnRmKCIqKiogSWYgc2RsLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgU0RMX0NPTkZJR1xuIik7CisgICAgICBwcmludGYoIioqKiB0byBwb2ludCB0byB0aGUgY29ycmVjdCBjb3B5IG9mIHNkbC1jb25maWcsIGFuZCByZW1vdmUgdGhlIGZpbGVcbiIpOworICAgICAgcHJpbnRmKCIqKiogY29uZmlnLmNhY2hlIGJlZm9yZSByZS1ydW5uaW5nIGNvbmZpZ3VyZVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK10sLCBub19zZGw9eWVzLFtlY2hvICRhY19uICJjcm9zcyBjb21waWxpbmc7IGFzc3VtZWQgT0suLi4gJGFjX2MiXSkKKyAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCisgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAieCRub19zZGwiID0geCA7IHRoZW4KKyAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pICAgICAKKyAgZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICBpZiB0ZXN0ICIkU0RMX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgICAgIGVjaG8gIioqKiBUaGUgc2RsLWNvbmZpZyBzY3JpcHQgaW5zdGFsbGVkIGJ5IFNETCBjb3VsZCBub3QgYmUgZm91bmQiCisgICAgICAgZWNobyAiKioqIElmIFNETCB3YXMgaW5zdGFsbGVkIGluIFBSRUZJWCwgbWFrZSBzdXJlIFBSRUZJWC9iaW4gaXMgaW4iCisgICAgICAgZWNobyAiKioqIHlvdXIgcGF0aCwgb3Igc2V0IHRoZSBTRExfQ09ORklHIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSIKKyAgICAgICBlY2hvICIqKiogZnVsbCBwYXRoIHRvIHNkbC1jb25maWcuIgorICAgICBlbHNlCisgICAgICAgaWYgdGVzdCAtZiBjb25mLnNkbHRlc3QgOyB0aGVuCisgICAgICAgIDoKKyAgICAgICBlbHNlCisgICAgICAgICAgZWNobyAiKioqIENvdWxkIG5vdCBydW4gU0RMIHRlc3QgcHJvZ3JhbSwgY2hlY2tpbmcgd2h5Li4uIgorICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkU0RMX0NGTEFHUyIKKyAgICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRTRExfQ0ZMQUdTIgorICAgICAgICAgIExJQlM9IiRMSUJTICRTRExfTElCUyIKKyAgICAgICAgICBBQ19UUllfTElOSyhbCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJTREwuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sgcmV0dXJuIDA7IH0KKyN1bmRlZiAgbWFpbgorI2RlZmluZSBtYWluIEtfYW5kX1JfQ19tYWluCitdLCAgICAgIFsgcmV0dXJuIDA7IF0sCisgICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gY29tcGlsZWQsIGJ1dCBkaWQgbm90IHJ1bi4gVGhpcyB1c3VhbGx5IG1lYW5zIgorICAgICAgICAgIGVjaG8gIioqKiB0aGF0IHRoZSBydW4tdGltZSBsaW5rZXIgaXMgbm90IGZpbmRpbmcgU0RMIG9yIGZpbmRpbmcgdGhlIHdyb25nIgorICAgICAgICAgIGVjaG8gIioqKiB2ZXJzaW9uIG9mIFNETC4gSWYgaXQgaXMgbm90IGZpbmRpbmcgU0RMLCB5b3UnbGwgbmVlZCB0byBzZXQgeW91ciIKKyAgICAgICAgICBlY2hvICIqKiogTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBlZGl0IC9ldGMvbGQuc28uY29uZiB0byBwb2ludCIKKyAgICAgICAgICBlY2hvICIqKiogdG8gdGhlIGluc3RhbGxlZCBsb2NhdGlvbiAgQWxzbywgbWFrZSBzdXJlIHlvdSBoYXZlIHJ1biBsZGNvbmZpZyBpZiB0aGF0IgorICAgICAgICAgIGVjaG8gIioqKiBpcyByZXF1aXJlZCBvbiB5b3VyIHN5c3RlbSIKKwkgIGVjaG8gIioqKiIKKyAgICAgICAgICBlY2hvICIqKiogSWYgeW91IGhhdmUgYW4gb2xkIHZlcnNpb24gaW5zdGFsbGVkLCBpdCBpcyBiZXN0IHRvIHJlbW92ZSBpdCwgYWx0aG91Z2giCisgICAgICAgICAgZWNobyAiKioqIHlvdSBtYXkgYWxzbyBiZSBhYmxlIHRvIGdldCB0aGluZ3MgdG8gd29yayBieSBtb2RpZnlpbmcgTERfTElCUkFSWV9QQVRIIl0sCisgICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gZmFpbGVkIHRvIGNvbXBpbGUgb3IgbGluay4gU2VlIHRoZSBmaWxlIGNvbmZpZy5sb2cgZm9yIHRoZSIKKyAgICAgICAgICBlY2hvICIqKiogZXhhY3QgZXJyb3IgdGhhdCBvY2N1cmVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgU0RMIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgU0RMIHNpbmNlIGl0IHdhcyBpbnN0YWxsZWQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91IgorICAgICAgICAgIGVjaG8gIioqKiBtYXkgd2FudCB0byBlZGl0IHRoZSBzZGwtY29uZmlnIHNjcmlwdDogJFNETF9DT05GSUciIF0pCisgICAgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgorICAgICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgICAgZmkKKyAgICAgZmkKKyAgICAgU0RMX0NGTEFHUz0iIgorICAgICBTRExfTElCUz0iIgorICAgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICBmaQorICBBQ19TVUJTVChTRExfQ0ZMQUdTKQorICBBQ19TVUJTVChTRExfTElCUykKKyAgcm0gLWYgY29uZi5zZGx0ZXN0CitdKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvYXV0b2dlbi5zaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L2F1dG9nZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM5ZjM0YwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L2F1dG9nZW4uc2gKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL3NoCisjCisjIFJlZ2VuZXJhdGUgY29uZmlndXJhdGlvbiBmaWxlcworY3AgYWNpbmNsdWRlLm00IGFjbG9jYWwubTQKK2ZvdW5kPWZhbHNlCitmb3IgYXV0b2NvbmYgaW4gYXV0b2NvbmYgYXV0b2NvbmYyNTkgYXV0b2NvbmYtMi41OQorZG8gaWYgd2hpY2ggJGF1dG9jb25mID4vZGV2L251bGwgMj4mMTsgdGhlbiAkYXV0b2NvbmYgJiYgZm91bmQ9dHJ1ZTsgYnJlYWs7IGZpCitkb25lCitpZiB0ZXN0IHgkZm91bmQgPSB4ZmFsc2U7IHRoZW4KKyAgICBlY2hvICJDb3VsZG4ndCBmaW5kIGF1dG9jb25mLCBhYm9ydGluZyIKKyAgICBleGl0IDEKK2ZpCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9jaGVja2tleXMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L2NoZWNra2V5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmIyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9jaGVja2tleXMuYwpAQCAtMCwwICsxLDE0NiBAQAorCisvKiBTaW1wbGUgcHJvZ3JhbTogIExvb3AsIHdhdGNoaW5nIGtleXN0cm9rZXMKKyAgIE5vdGUgdGhhdCB5b3UgbmVlZCB0byBjYWxsIFNETF9Qb2xsRXZlbnQoKSBvciBTRExfV2FpdEV2ZW50KCkgdG8gCisgICBwdW1wIHRoZSBldmVudCBsb29wIGFuZCBjYXRjaCBrZXlzdHJva2VzLgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworLyogQ2FsbCB0aGlzIGluc3RlYWQgb2YgZXhpdCgpLCBzbyB3ZSBjYW4gY2xlYW4gdXAgU0RMOiBhdGV4aXQoKSBpcyBldmlsLiAqLworc3RhdGljIHZvaWQgcXVpdChpbnQgcmMpCit7CisJU0RMX1F1aXQoKTsKKwlleGl0KHJjKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbW9kaWZpZXJzKHZvaWQpCit7CisJaW50IG1vZDsKKwlwcmludGYoIiBtb2RpZmllcnM6Iik7CisJbW9kID0gU0RMX0dldE1vZFN0YXRlKCk7CisJaWYoIW1vZCkgeworCQlwcmludGYoIiAobm9uZSkiKTsKKwkJcmV0dXJuOworCX0KKwlpZihtb2QgJiBLTU9EX0xTSElGVCkKKwkJcHJpbnRmKCIgTFNISUZUIik7CisJaWYobW9kICYgS01PRF9SU0hJRlQpCisJCXByaW50ZigiIFJTSElGVCIpOworCWlmKG1vZCAmIEtNT0RfTENUUkwpCisJCXByaW50ZigiIExDVFJMIik7CisJaWYobW9kICYgS01PRF9SQ1RSTCkKKwkJcHJpbnRmKCIgUkNUUkwiKTsKKwlpZihtb2QgJiBLTU9EX0xBTFQpCisJCXByaW50ZigiIExBTFQiKTsKKwlpZihtb2QgJiBLTU9EX1JBTFQpCisJCXByaW50ZigiIFJBTFQiKTsKKwlpZihtb2QgJiBLTU9EX0xNRVRBKQorCQlwcmludGYoIiBMTUVUQSIpOworCWlmKG1vZCAmIEtNT0RfUk1FVEEpCisJCXByaW50ZigiIFJNRVRBIik7CisJaWYobW9kICYgS01PRF9OVU0pCisJCXByaW50ZigiIE5VTSIpOworCWlmKG1vZCAmIEtNT0RfQ0FQUykKKwkJcHJpbnRmKCIgQ0FQUyIpOworCWlmKG1vZCAmIEtNT0RfTU9ERSkKKwkJcHJpbnRmKCIgTU9ERSIpOworfQorCitzdGF0aWMgdm9pZCBQcmludEtleShTRExfa2V5c3ltICpzeW0sIGludCBwcmVzc2VkKQoreworCS8qIFByaW50IHRoZSBrZXljb2RlLCBuYW1lIGFuZCBzdGF0ZSAqLworCWlmICggc3ltLT5zeW0gKSB7CisJCXByaW50ZigiS2V5ICVzOiAgJWQtJXMgIiwgcHJlc3NlZCA/ICAicHJlc3NlZCIgOiAicmVsZWFzZWQiLAorCQkJCQlzeW0tPnN5bSwgU0RMX0dldEtleU5hbWUoc3ltLT5zeW0pKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlVua25vd24gS2V5IChzY2FuY29kZSA9ICVkKSAlcyAiLCBzeW0tPnNjYW5jb2RlLAorCQkJCQlwcmVzc2VkID8gICJwcmVzc2VkIiA6ICJyZWxlYXNlZCIpOworCX0KKworCS8qIFByaW50IHRoZSB0cmFuc2xhdGVkIGNoYXJhY3RlciwgaWYgb25lIGV4aXN0cyAqLworCWlmICggc3ltLT51bmljb2RlICkgeworCQkvKiBJcyBpdCBhIGNvbnRyb2wtY2hhcmFjdGVyPyAqLworCQlpZiAoIHN5bS0+dW5pY29kZSA8ICcgJyApIHsKKwkJCXByaW50ZigiICheJWMpIiwgc3ltLT51bmljb2RlKydAJyk7CisJCX0gZWxzZSB7CisjaWZkZWYgVU5JQ09ERQorCQkJcHJpbnRmKCIgKCVjKSIsIHN5bS0+dW5pY29kZSk7CisjZWxzZQorCQkJLyogVGhpcyBpcyBhIExhdGluLTEgcHJvZ3JhbSwgc28gb25seSBzaG93IDgtYml0cyAqLworCQkJaWYgKCAhKHN5bS0+dW5pY29kZSAmIDB4RkYwMCkgKQorCQkJCXByaW50ZigiICglYykiLCBzeW0tPnVuaWNvZGUpOworCQkJZWxzZQorCQkJCXByaW50ZigiICgweCVYKSIsIHN5bS0+dW5pY29kZSk7CisjZW5kaWYKKwkJfQorCX0KKwlwcmludF9tb2RpZmllcnMoKTsKKwlwcmludGYoIlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJU0RMX0V2ZW50IGV2ZW50OworCWludCBkb25lOworCVVpbnQzMiB2aWRlb2ZsYWdzOworCisJLyogSW5pdGlhbGl6ZSBTREwgKi8KKwlpZiAoIFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuKDEpOworCX0KKworCXZpZGVvZmxhZ3MgPSBTRExfU1dTVVJGQUNFOworCXdoaWxlKCBhcmdjID4gMSApIHsKKwkJLS1hcmdjOworCQlpZiAoIGFyZ3ZbYXJnY10gJiYgIXN0cmNtcChhcmd2W2FyZ2NdLCAiLWZ1bGxzY3JlZW4iKSApIHsKKwkJCXZpZGVvZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWZ1bGxzY3JlZW5dXG4iLCBhcmd2WzBdKTsKKwkJCXF1aXQoMSk7CisJCX0KKwl9CisKKwkvKiBTZXQgNjQweDQ4MCB2aWRlbyBtb2RlICovCisJaWYgKCBTRExfU2V0VmlkZW9Nb2RlKDY0MCwgNDgwLCAwLCB2aWRlb2ZsYWdzKSA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IHNldCA2NDB4NDgwIHZpZGVvIG1vZGU6ICVzXG4iLAorCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJcXVpdCgyKTsKKwl9CisKKwkvKiBFbmFibGUgVU5JQ09ERSB0cmFuc2xhdGlvbiBmb3Iga2V5Ym9hcmQgaW5wdXQgKi8KKwlTRExfRW5hYmxlVU5JQ09ERSgxKTsKKworCS8qIEVuYWJsZSBhdXRvIHJlcGVhdCBmb3Iga2V5Ym9hcmQgaW5wdXQgKi8KKwlTRExfRW5hYmxlS2V5UmVwZWF0KFNETF9ERUZBVUxUX1JFUEVBVF9ERUxBWSwKKwkgICAgICAgICAgICAgICAgICAgIFNETF9ERUZBVUxUX1JFUEVBVF9JTlRFUlZBTCk7CisKKwkvKiBXYXRjaCBrZXlzdHJva2VzICovCisJZG9uZSA9IDA7CisJd2hpbGUgKCAhZG9uZSApIHsKKwkJLyogQ2hlY2sgZm9yIGV2ZW50cyAqLworCQlTRExfV2FpdEV2ZW50KCZldmVudCk7CisJCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCQkJY2FzZSBTRExfS0VZRE9XTjoKKwkJCQlQcmludEtleSgmZXZlbnQua2V5LmtleXN5bSwgMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNETF9LRVlVUDoKKwkJCQlQcmludEtleSgmZXZlbnQua2V5LmtleXN5bSwgMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisJCQkJLyogQW55IGJ1dHRvbiBwcmVzcyBxdWl0cyB0aGUgYXBwLi4uICovCisJCQljYXNlIFNETF9RVUlUOgorCQkJCWRvbmUgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCX0KKworCVNETF9RdWl0KCk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvY29uZmlndXJlLmluIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjVjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxMDUgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorQUNfSU5JVChSRUFETUUpCisKK2RubCBEZXRlY3QgdGhlIGNhbm9uaWNhbCBidWlsZCBhbmQgaG9zdCBlbnZpcm9ubWVudHMKK0FDX0NPTkZJR19BVVhfRElSUygkc3JjZGlyLy4uL2J1aWxkLXNjcmlwdHMpCitBQ19DQU5PTklDQUxfSE9TVAorCitkbmwgQ2hlY2sgZm9yIHRvb2xzCisKK0FDX1BST0dfQ0MKKworZG5sIENoZWNrIGZvciBjb21waWxlciBlbnZpcm9ubWVudAorCitBQ19DX0NPTlNUCisKK2RubCBGaWd1cmUgb3V0IHdoaWNoIG1hdGggbGlicmFyeSB0byB1c2UKK2Nhc2UgIiRob3N0IiBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3MzIqKQorICAgICAgICBFWEU9Ii5leGUiCisgICAgICAgIE1BVEhMSUI9IiIKKyAgICAgICAgU1lTX0dMX0xJQlM9Ii1sb3BlbmdsMzIiCisgICAgICAgIDs7CisgICAgKi0qLWJlb3MqIHwgKi0qLWhhaWt1KikKKyAgICAgICAgRVhFPSIiCisgICAgICAgIE1BVEhMSUI9IiIKKyAgICAgICAgU1lTX0dMX0xJQlM9Ii1sR0wiCisgICAgICAgIDs7CisgICAgKi0qLWRhcndpbiogKQorICAgICAgICBFWEU9IiIKKyAgICAgICAgTUFUSExJQj0iIgorICAgICAgICBTWVNfR0xfTElCUz0iLVdsLC1mcmFtZXdvcmssT3BlbkdMIgorICAgICAgICA7OworICAgICotKi1haXgqKQorICAgICAgICBFWEU9IiIKKyAgICAgICAgaWYgdGVzdCB4JGFjX2N2X3Byb2dfZ2NjID0geHllczsgdGhlbgorICAgICAgICAgICAgQ0ZMQUdTPSItbXRocmVhZHMiCisgICAgICAgIGZpCisgICAgICAgIFNZU19HTF9MSUJTPSIiCisgICAgICAgIDs7CisgICAgKi0qLW1pbnQqKQorICAgICAgICBFWEU9IiIKKyAgICAgICAgTUFUSExJQj0iIgorICAgICAgICBBQ19QQVRIX1BST0coT1NNRVNBX0NPTkZJRywgb3NtZXNhLWNvbmZpZywgbm8pCisgICAgICAgIGlmIHRlc3QgIngkT1NNRVNBX0NPTkZJRyIgPSAieHllcyI7IHRoZW4KKyAgICAgICAgICAgIE9TTUVTQV9DRkxBR1M9YCRPU01FU0FfQ09ORklHIC0tY2ZsYWdzYAorICAgICAgICAgICAgT1NNRVNBX0xJQlM9YCRPU01FU0FfQ09ORklHIC0tbGlic2AKKyAgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkT1NNRVNBX0NGTEFHUyIKKyAgICAgICAgICAgIFNZU19HTF9MSUJTPSIkT1NNRVNBX0xJQlMiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNZU19HTF9MSUJTPSItbE9TTWVzYSIKKyAgICAgICAgZmkKKwkJOzsKKyAgICAqKQorICAgICAgICBFWEU9IiIKKyAgICAgICAgTUFUSExJQj0iLWxtIgorICAgICAgICBTWVNfR0xfTElCUz0iLWxHTCIKKyAgICAgICAgOzsKK2VzYWMKK0FDX1NVQlNUKEVYRSkKK0FDX1NVQlNUKE1BVEhMSUIpCisKK2RubCBDaGVjayBmb3IgU0RMCitTRExfVkVSU0lPTj0xLjIuMTAKK0FNX1BBVEhfU0RMKCRTRExfVkVSU0lPTiwKKyAgICAgICAgICAgIDosCisJICAgIEFDX01TR19FUlJPUihbKioqIFNETCB2ZXJzaW9uICRTRExfVkVSU0lPTiBub3QgZm91bmQhXSkKKykKK0NGTEFHUz0iJENGTEFHUyAkU0RMX0NGTEFHUyIKK0xJQlM9IiRMSUJTICRTRExfTElCUyIKKworZG5sIENoZWNrIGZvciBYMTEgcGF0aCwgbmVlZGVkIGZvciBPcGVuR0wgb24gc29tZSBzeXN0ZW1zCitBQ19QQVRIX1gKK2lmIHRlc3QgeCRoYXZlX3ggPSB4eWVzOyB0aGVuCisgICAgaWYgdGVzdCB4JGFjX3hfaW5jbHVkZXMgPSB4bm8gfHwgdGVzdCB4JGFjX3hfaW5jbHVkZXMgPSB4OyB0aGVuCisgICAgICAgIDoKKyAgICBlbHNlCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtSSRhY194X2luY2x1ZGVzIgorICAgIGZpCisgICAgaWYgdGVzdCB4JGFjX3hfbGlicmFyaWVzID0geG5vIHx8IHRlc3QgeCRhY194X2xpYnJhcmllcyA9IHg7IHRoZW4KKyAgICAgICAgOgorICAgIGVsc2UKKyAgICAgICAgWFBBVEg9Ii1MJGFjX3hfbGlicmFyaWVzIgorICAgIGZpCitmaQorCitkbmwgQ2hlY2sgZm9yIE9wZW5HTAorQUNfTVNHX0NIRUNLSU5HKGZvciBPcGVuR0wgc3VwcG9ydCkKK2hhdmVfb3BlbmdsPW5vCitBQ19UUllfQ09NUElMRShbCisgI2luY2x1ZGUgIlNETF9vcGVuZ2wuaCIKK10sWworXSxbCitoYXZlX29wZW5nbD15ZXMKK10pCitBQ19NU0dfUkVTVUxUKCRoYXZlX29wZW5nbCkKK2lmIHRlc3QgeCRoYXZlX29wZW5nbCA9IHh5ZXM7IHRoZW4KKyAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX09QRU5HTCIKKyAgICBHTExJQj0iJFhQQVRIICRTWVNfR0xfTElCUyIKK2Vsc2UKKyAgICBHTExJQj0iIgorZmkKK0FDX1NVQlNUKEdMTElCKQorCitkbmwgRmluYWxseSBjcmVhdGUgYWxsIHRoZSBnZW5lcmF0ZWQgZmlsZXMKK0FDX09VVFBVVChbTWFrZWZpbGVdKQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvZ2NjLWZhdC5zaCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L2djYy1mYXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjAzYjk0MQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L2djYy1mYXQuc2gKQEAgLTAsMCArMSwxMzQgQEAKKyMhL2Jpbi9zaAorIworIyBCdWlsZCBVbml2ZXJzYWwgYmluYXJpZXMgb24gTWFjIE9TIFgsIHRoYW5rcyBSeWFuIQorIworIyBVc2FnZTogLi9jb25maWd1cmUgQ0M9InNoIGdjYy1mYXQuc2giICYmIG1ha2UgJiYgcm0gLXJmIHBwYyB4ODYKKworIyBMb2NhdGUgWGNvZGUgU0RLIHBhdGgKK1NES19QQVRIPS9EZXZlbG9wZXIvU0RLcworaWYgWyAhIC1kICRTREtfUEFUSCBdOyB0aGVuCisgICAgZWNobyAiQ291bGRuJ3QgZmluZCBTREsgcGF0aCIKKyAgICBleGl0IDEKK2ZpCisKK2lmIFsgLWQgIiRTREtfUEFUSC9NYWNPU1gxMC4yLjguc2RrIiBdOyB0aGVuCisgICAgIyBQb3dlclBDIGNvbXBpbGVyIGZsYWdzICgxMC4yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSkKKyAgICBHQ0NfQ09NUElMRV9QUEM9ImdjYy0zLjMgLWFyY2ggcHBjIFwKKy1ETUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQ9MTAyMCBcCistbm9zdGRpbmMgXAorLUYkU0RLX1BBVEgvTWFjT1NYMTAuMi44LnNkay9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzIFwKKy1JJFNES19QQVRIL01hY09TWDEwLjIuOC5zZGsvdXNyL2luY2x1ZGUvZ2NjL2Rhcndpbi8zLjMgXAorLWlzeXN0ZW0gJFNES19QQVRIL01hY09TWDEwLjIuOC5zZGsvdXNyL2luY2x1ZGUiCisKKyAgICBHQ0NfTElOS19QUEM9IlwKKy1MJFNES19QQVRIL01hY09TWDEwLjIuOC5zZGsvdXNyL2xpYi9nY2MvZGFyd2luLzMuMyBcCistRiRTREtfUEFUSC9NYWNPU1gxMC4yLjguc2RrL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MgXAorLVdsLC1zeXNsaWJyb290LCRTREtfUEFUSC9NYWNPU1gxMC4yLjguc2RrIgorCitlbHNlICMgMTAuMiBvciAxMC4zIFNESworICAgICMgUG93ZXJQQyBjb21waWxlciBmbGFncyAoMTAuMyBydW50aW1lIGNvbXBhdGliaWxpdHkpCisgICAgR0NDX0NPTVBJTEVfUFBDPSJnY2MtNC4wIC1hcmNoIHBwYyAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC4zIFwKKy1ETUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQ9MTAzMCBcCistbm9zdGRpbmMgXAorLUYkU0RLX1BBVEgvTWFjT1NYMTAuMy45LnNkay9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzIFwKKy1JJFNES19QQVRIL01hY09TWDEwLjMuOS5zZGsvdXNyL2xpYi9nY2MvcG93ZXJwYy1hcHBsZS1kYXJ3aW45LzQuMC4xL2luY2x1ZGUgXAorLWlzeXN0ZW0gJFNES19QQVRIL01hY09TWDEwLjMuOS5zZGsvdXNyL2luY2x1ZGUiCisKKyAgICBHQ0NfTElOS19QUEM9IlwKKy1MJFNES19QQVRIL01hY09TWDEwLjMuOS5zZGsvdXNyL2xpYi9nY2MvcG93ZXJwYy1hcHBsZS1kYXJ3aW45LzQuMC4xIFwKKy1GJFNES19QQVRIL01hY09TWDEwLjMuOS5zZGsvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3JrcyBcCistV2wsLXN5c2xpYnJvb3QsJFNES19QQVRIL01hY09TWDEwLjMuOS5zZGsiCisKK2ZpICMgMTAuMiBvciAxMC4zIFNESworCisjIEludGVsIGNvbXBpbGVyIGZsYWdzICgxMC40IHJ1bnRpbWUgY29tcGF0aWJpbGl0eSkKK0dDQ19DT01QSUxFX1g4Nj0iZ2NjLTQuMCAtYXJjaCBpMzg2IC1tbWFjb3N4LXZlcnNpb24tbWluPTEwLjQgXAorLURNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRD0xMDQwIFwKKy1ub3N0ZGluYyBcCistRiRTREtfUEFUSC9NYWNPU1gxMC40dS5zZGsvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3JrcyBcCistSSRTREtfUEFUSC9NYWNPU1gxMC40dS5zZGsvdXNyL2xpYi9nY2MvaTY4Ni1hcHBsZS1kYXJ3aW45LzQuMC4xL2luY2x1ZGUgXAorLWlzeXN0ZW0gJFNES19QQVRIL01hY09TWDEwLjR1LnNkay91c3IvaW5jbHVkZSIKKworR0NDX0xJTktfWDg2PSJcCistTCRTREtfUEFUSC9NYWNPU1gxMC40dS5zZGsvdXNyL2xpYi9nY2MvaTY4Ni1hcHBsZS1kYXJ3aW45LzQuMC4xIFwKKy1XbCwtc3lzbGlicm9vdCwkU0RLX1BBVEgvTWFjT1NYMTAuNHUuc2RrIgorCisjIE91dHB1dCBib3RoIFBvd2VyUEMgYW5kIEludGVsIG9iamVjdCBmaWxlcworYXJncz0iJCoiCitjb21waWxlPXllcworbGluaz15ZXMKK3doaWxlIHRlc3QgeCQxICE9IHg7IGRvCisgICAgY2FzZSAkMSBpbgorICAgICAgICAtLXZlcnNpb24pIGV4ZWMgZ2NjICQxOzsKKyAgICAgICAgLXYpIGV4ZWMgZ2NjICQxOzsKKyAgICAgICAgLVYpIGV4ZWMgZ2NjICQxOzsKKyAgICAgICAgLXByaW50LXByb2ctbmFtZT0qKSBleGVjIGdjYyAkMTs7CisgICAgICAgIC1wcmludC1zZWFyY2gtZGlycykgZXhlYyBnY2MgJDE7OworICAgICAgICAtRSkgR0NDX0NPTVBJTEVfUFBDPSIkR0NDX0NPTVBJTEVfUFBDIC1FIgorICAgICAgICAgICAgR0NDX0NPTVBJTEVfWDg2PSIkR0NDX0NPTVBJTEVfWDg2IC1FIgorICAgICAgICAgICAgY29tcGlsZT1ubzsgbGluaz1ubzs7CisgICAgICAgIC1jKSBsaW5rPW5vOzsKKyAgICAgICAgLW8pIG91dHB1dD0kMjs7CisgICAgICAgICouY3wqLmNjfCouY3BwfCouUykgc291cmNlPSQxOzsKKyAgICBlc2FjCisgICAgc2hpZnQKK2RvbmUKK2lmIHRlc3QgeCRsaW5rID0geHllczsgdGhlbgorICAgIEdDQ19DT01QSUxFX1BQQz0iJEdDQ19DT01QSUxFX1BQQyAkR0NDX0xJTktfUFBDIgorICAgIEdDQ19DT01QSUxFX1g4Nj0iJEdDQ19DT01QSUxFX1g4NiAkR0NDX0xJTktfWDg2IgorZmkKK2lmIHRlc3QgeCIkb3V0cHV0IiA9IHg7IHRoZW4KKyAgICBpZiB0ZXN0IHgkbGluayA9IHh5ZXM7IHRoZW4KKyAgICAgICAgb3V0cHV0PWEub3V0CisgICAgZWxpZiB0ZXN0IHgkY29tcGlsZSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgb3V0cHV0PWBlY2hvICRzb3VyY2UgfCBzZWQgLWUgJ3N8LiovfHwnIC1lICdzfFwoLipcKVwuW15cLl0qfFwxfCdgLm8KKyAgICBmaQorZmkKKworaWYgdGVzdCB4IiRvdXRwdXQiICE9IHg7IHRoZW4KKyAgICBkaXI9cHBjL2BkaXJuYW1lICRvdXRwdXRgCisgICAgaWYgdGVzdCAtZCAkZGlyOyB0aGVuCisgICAgICAgIDoKKyAgICBlbHNlCisgICAgICAgIG1rZGlyIC1wICRkaXIKKyAgICBmaQorZmkKK3NldCAtLSAkYXJncword2hpbGUgdGVzdCB4JDEgIT0geDsgZG8KKyAgICBpZiB0ZXN0IC1mICJwcGMvJDEiICYmIHRlc3QgIiQxIiAhPSAiJG91dHB1dCI7IHRoZW4KKyAgICAgICAgcHBjX2FyZ3M9IiRwcGNfYXJncyBwcGMvJDEiCisgICAgZWxzZQorICAgICAgICBwcGNfYXJncz0iJHBwY19hcmdzICQxIgorICAgIGZpCisgICAgc2hpZnQKK2RvbmUKKyRHQ0NfQ09NUElMRV9QUEMgJHBwY19hcmdzIHx8IGV4aXQgJD8KK2lmIHRlc3QgeCIkb3V0cHV0IiAhPSB4OyB0aGVuCisgICAgY3AgJG91dHB1dCBwcGMvJG91dHB1dAorZmkKKworaWYgdGVzdCB4IiRvdXRwdXQiICE9IHg7IHRoZW4KKyAgICBkaXI9eDg2L2BkaXJuYW1lICRvdXRwdXRgCisgICAgaWYgdGVzdCAtZCAkZGlyOyB0aGVuCisgICAgICAgIDoKKyAgICBlbHNlCisgICAgICAgIG1rZGlyIC1wICRkaXIKKyAgICBmaQorZmkKK3NldCAtLSAkYXJncword2hpbGUgdGVzdCB4JDEgIT0geDsgZG8KKyAgICBpZiB0ZXN0IC1mICJ4ODYvJDEiICYmIHRlc3QgIiQxIiAhPSAiJG91dHB1dCI7IHRoZW4KKyAgICAgICAgeDg2X2FyZ3M9IiR4ODZfYXJncyB4ODYvJDEiCisgICAgZWxzZQorICAgICAgICB4ODZfYXJncz0iJHg4Nl9hcmdzICQxIgorICAgIGZpCisgICAgc2hpZnQKK2RvbmUKKyRHQ0NfQ09NUElMRV9YODYgJHg4Nl9hcmdzIHx8IGV4aXQgJD8KK2lmIHRlc3QgeCIkb3V0cHV0IiAhPSB4OyB0aGVuCisgICAgY3AgJG91dHB1dCB4ODYvJG91dHB1dAorZmkKKworaWYgdGVzdCB4IiRvdXRwdXQiICE9IHg7IHRoZW4KKyAgICBsaXBvIC1jcmVhdGUgLW8gJG91dHB1dCBwcGMvJG91dHB1dCB4ODYvJG91dHB1dAorZmkKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L2dyYXl3aW4uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L2dyYXl3aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYzMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvZ3JheXdpbi5jCkBAIC0wLDAgKzEsMjU3IEBACisKKy8qIFNpbXBsZSBwcm9ncmFtOiAgRmlsbCBhIGNvbG9ybWFwIHdpdGggZ3JheSBhbmQgc3RyaXBlIGl0IGRvd24gdGhlIHNjcmVlbiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworI2lmZGVmIFRFU1RfVkdBMTYgLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gdGVzdCBWR0EgMTYtY29sb3IgdmlkZW8gbW9kZXMgKi8KKyNkZWZpbmUgTlVNX0NPTE9SUwkxNgorI2Vsc2UKKyNkZWZpbmUgTlVNX0NPTE9SUwkyNTYKKyNlbmRpZgorCisvKiBEcmF3IGEgcmFuZG9tbHkgc2l6ZWQgYW5kIGNvbG9yZWQgYm94IGNlbnRlcmVkIGFib3V0IChYLFkpICovCit2b2lkIERyYXdCb3goU0RMX1N1cmZhY2UgKnNjcmVlbiwgaW50IFgsIGludCBZLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCBzZWVkZWQgPSAwOworCVNETF9SZWN0IGFyZWE7CisJVWludDMyIGNvbG9yOworICAgICAgICBVaW50MzIgcmFuZGM7CisKKwkvKiBTZWVkIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqLworCWlmICggc2VlZGVkID09IDAgKSB7CisJCXNyYW5kKHRpbWUoTlVMTCkpOworCQlzZWVkZWQgPSAxOworCX0KKworCS8qIEdldCB0aGUgYm91bmRzIG9mIHRoZSByZWN0YW5nbGUgKi8KKwlhcmVhLncgPSAocmFuZCgpJXdpZHRoKTsKKwlhcmVhLmggPSAocmFuZCgpJWhlaWdodCk7CisJYXJlYS54ID0gWC0oYXJlYS53LzIpOworCWFyZWEueSA9IFktKGFyZWEuaC8yKTsKKyAgICAgICAgcmFuZGMgPSAocmFuZCgpJU5VTV9DT0xPUlMpOworCisgICAgICAgIGlmIChzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbD09MSkKKyAgICAgICAgeworICAgICAgICAgICAgY29sb3IgPSByYW5kYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbG9yID0gU0RMX01hcFJHQihzY3JlZW4tPmZvcm1hdCwgcmFuZGMsIHJhbmRjLCByYW5kYyk7CisgICAgICAgIH0KKworCS8qIERvIGl0ISAqLworCVNETF9GaWxsUmVjdChzY3JlZW4sICZhcmVhLCBjb2xvcik7CisJaWYgKCBzY3JlZW4tPmZsYWdzICYgU0RMX0RPVUJMRUJVRiApIHsKKwkJU0RMX0ZsaXAoc2NyZWVuKTsKKwl9IGVsc2UgeworCQlTRExfVXBkYXRlUmVjdHMoc2NyZWVuLCAxLCAmYXJlYSk7CisJfQorfQorCit2b2lkIERyYXdCYWNrZ3JvdW5kKFNETF9TdXJmYWNlICpzY3JlZW4pCit7CisJaW50IGksIGosIGs7CisJVWludDggICpidWZmZXI7CisJVWludDE2ICpidWZmZXIxNjsKKyAgICAgICAgVWludDE2IGNvbG9yOworICAgICAgICBVaW50OCAgZ3JhZGllbnQ7CisKKwkvKiBTZXQgdGhlIHN1cmZhY2UgcGl4ZWxzIGFuZCByZWZyZXNoISAqLworCS8qIFVzZSB0d28gbG9vcHMgaW4gY2FzZSB0aGUgc3VyZmFjZSBpcyBkb3VibGUtYnVmZmVyZWQgKGJvdGggc2lkZXMpICovCisKKwlmb3IgKCBqPTA7IGo8MjsgKytqICkgeworCQlpZiAoIFNETF9Mb2NrU3VyZmFjZShzY3JlZW4pIDwgMCApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgbG9jayBkaXNwbGF5IHN1cmZhY2U6ICVzXG4iLAorCQkJCQkJCQlTRExfR2V0RXJyb3IoKSk7CisJCQlyZXR1cm47CisJCX0KKwkJYnVmZmVyID0gKFVpbnQ4ICopc2NyZWVuLT5waXhlbHM7CisKKwkJaWYgKHNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsIT0yKSB7CisJCQlmb3IgKCBpPTA7IGk8c2NyZWVuLT5oOyArK2kgKSB7CisJCQkJbWVtc2V0KGJ1ZmZlciwoaSooTlVNX0NPTE9SUy0xKSkvc2NyZWVuLT5oLCBzY3JlZW4tPncgKiBzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCk7CisJCQkJYnVmZmVyICs9IHNjcmVlbi0+cGl0Y2g7CisJCQl9CisJCX0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworCQkJZm9yICggaT0wOyBpPHNjcmVlbi0+aDsgKytpICkgeworCQkJCWdyYWRpZW50PSgoaSooTlVNX0NPTE9SUy0xKSkvc2NyZWVuLT5oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCBncmFkaWVudCwgZ3JhZGllbnQsIGdyYWRpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyMTY9KFVpbnQxNiopYnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazxzY3JlZW4tPnc7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGJ1ZmZlcjE2K2spPWNvbG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJYnVmZmVyICs9IHNjcmVlbi0+cGl0Y2g7CisJCQl9CisgICAgICAgICAgICAgICAgfQorCisJCVNETF9VbmxvY2tTdXJmYWNlKHNjcmVlbik7CisJCWlmICggc2NyZWVuLT5mbGFncyAmIFNETF9ET1VCTEVCVUYgKSB7CisJCQlTRExfRmxpcChzY3JlZW4pOworCQl9IGVsc2UgeworCQkJU0RMX1VwZGF0ZVJlY3Qoc2NyZWVuLCAwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQl9CisJfQorfQorCitTRExfU3VyZmFjZSAqQ3JlYXRlU2NyZWVuKFVpbnQxNiB3LCBVaW50MTYgaCwgVWludDggYnBwLCBVaW50MzIgZmxhZ3MpCit7CisJU0RMX1N1cmZhY2UgKnNjcmVlbjsKKwlpbnQgaTsKKwlTRExfQ29sb3IgcGFsZXR0ZVtOVU1fQ09MT1JTXTsKKworCS8qIFNldCB0aGUgdmlkZW8gbW9kZSAqLworCXNjcmVlbiA9IFNETF9TZXRWaWRlb01vZGUodywgaCwgYnBwLCBmbGFncyk7CisJaWYgKCBzY3JlZW4gPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBzZXQgZGlzcGxheSBtb2RlOiAlc1xuIiwKKwkJCQkJCQlTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybihOVUxMKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICJTY3JlZW4gaXMgaW4gJXMgbW9kZVxuIiwKKwkJKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTikgPyAiZnVsbHNjcmVlbiIgOiAid2luZG93ZWQiKTsKKworCWlmIChicHA9PTgpIHsKKwkJLyogU2V0IGEgZ3JheSBjb2xvcm1hcCwgcmV2ZXJzZSBvcmRlciBmcm9tIHdoaXRlIHRvIGJsYWNrICovCisJCWZvciAoIGk9MDsgaTxOVU1fQ09MT1JTOyArK2kgKSB7CisJCQlwYWxldHRlW2ldLnIgPSAoTlVNX0NPTE9SUy0xKS1pICogKDI1NiAvIE5VTV9DT0xPUlMpOworCQkJcGFsZXR0ZVtpXS5nID0gKE5VTV9DT0xPUlMtMSktaSAqICgyNTYgLyBOVU1fQ09MT1JTKTsKKwkJCXBhbGV0dGVbaV0uYiA9IChOVU1fQ09MT1JTLTEpLWkgKiAoMjU2IC8gTlVNX0NPTE9SUyk7CisJCX0KKwkJU0RMX1NldENvbG9ycyhzY3JlZW4sIHBhbGV0dGUsIDAsIE5VTV9DT0xPUlMpOworCX0KKworCXJldHVybihzY3JlZW4pOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCVNETF9TdXJmYWNlICpzY3JlZW47CisJVWludDMyIHZpZGVvZmxhZ3M7CisJaW50ICAgIGRvbmU7CisJU0RMX0V2ZW50IGV2ZW50OworCWludCB3aWR0aCwgaGVpZ2h0LCBicHA7CisKKwkvKiBJbml0aWFsaXplIFNETCAqLworCWlmICggU0RMX0luaXQoU0RMX0lOSVRfVklERU8pIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBpbml0aWFsaXplIFNETDogJXNcbiIsU0RMX0dldEVycm9yKCkpOworCQlleGl0KDEpOworCX0KKworCS8qIFNlZSBpZiB3ZSB0cnkgdG8gZ2V0IGEgaGFyZHdhcmUgY29sb3JtYXAgKi8KKwl3aWR0aCA9IDY0MDsKKwloZWlnaHQgPSA0ODA7CisJYnBwID0gODsKKwl2aWRlb2ZsYWdzID0gU0RMX1NXU1VSRkFDRTsKKwl3aGlsZSAoIGFyZ2MgPiAxICkgeworCQktLWFyZ2M7CisJCWlmICggYXJndlthcmdjLTFdICYmIChzdHJjbXAoYXJndlthcmdjLTFdLCAiLXdpZHRoIikgPT0gMCkgKSB7CisJCQl3aWR0aCA9IGF0b2koYXJndlthcmdjXSk7CisJCQktLWFyZ2M7CisJCX0gZWxzZQorCQlpZiAoIGFyZ3ZbYXJnYy0xXSAmJiAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgIi1oZWlnaHQiKSA9PSAwKSApIHsKKwkJCWhlaWdodCA9IGF0b2koYXJndlthcmdjXSk7CisJCQktLWFyZ2M7CisJCX0gZWxzZQorCQlpZiAoIGFyZ3ZbYXJnYy0xXSAmJiAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgIi1icHAiKSA9PSAwKSApIHsKKwkJCWJwcCA9IGF0b2koYXJndlthcmdjXSk7CisJCQktLWFyZ2M7CisJCX0gZWxzZQorCQlpZiAoIGFyZ3ZbYXJnY10gJiYgKHN0cmNtcChhcmd2W2FyZ2NdLCAiLWh3IikgPT0gMCkgKSB7CisJCQl2aWRlb2ZsYWdzIHw9IFNETF9IV1NVUkZBQ0U7CisJCX0gZWxzZQorCQlpZiAoIGFyZ3ZbYXJnY10gJiYgKHN0cmNtcChhcmd2W2FyZ2NdLCAiLWh3cGFsZXR0ZSIpID09IDApICkgeworCQkJdmlkZW9mbGFncyB8PSBTRExfSFdQQUxFVFRFOworCQl9IGVsc2UKKwkJaWYgKCBhcmd2W2FyZ2NdICYmIChzdHJjbXAoYXJndlthcmdjXSwgIi1mbGlwIikgPT0gMCkgKSB7CisJCQl2aWRlb2ZsYWdzIHw9IFNETF9ET1VCTEVCVUY7CisJCX0gZWxzZQorCQlpZiAoIGFyZ3ZbYXJnY10gJiYgKHN0cmNtcChhcmd2W2FyZ2NdLCAiLW5vZnJhbWUiKSA9PSAwKSApIHsKKwkJCXZpZGVvZmxhZ3MgfD0gU0RMX05PRlJBTUU7CisJCX0gZWxzZQorCQlpZiAoIGFyZ3ZbYXJnY10gJiYgKHN0cmNtcChhcmd2W2FyZ2NdLCAiLXJlc2l6ZSIpID09IDApICkgeworCQkJdmlkZW9mbGFncyB8PSBTRExfUkVTSVpBQkxFOworCQl9IGVsc2UKKwkJaWYgKCBhcmd2W2FyZ2NdICYmIChzdHJjbXAoYXJndlthcmdjXSwgIi1mdWxsc2NyZWVuIikgPT0gMCkgKSB7CisJCQl2aWRlb2ZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy13aWR0aF0gWy1oZWlnaHRdIFstYnBwXSBbLWh3XSBbLWh3cGFsZXR0ZV0gWy1mbGlwXSBbLW5vZnJhbWVdIFstZnVsbHNjcmVlbl0gWy1yZXNpemVdXG4iLAorCQkJCQkJCQlhcmd2WzBdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwkvKiBTZXQgYSB2aWRlbyBtb2RlICovCisJc2NyZWVuID0gQ3JlYXRlU2NyZWVuKHdpZHRoLCBoZWlnaHQsIGJwcCwgdmlkZW9mbGFncyk7CisJaWYgKCBzY3JlZW4gPT0gTlVMTCApIHsKKwkJZXhpdCgyKTsKKwl9CisgICAgICAgIAorICAgICAgICBEcmF3QmFja2dyb3VuZChzY3JlZW4pOworCQkKKwkvKiBXYWl0IGZvciBhIGtleXN0cm9rZSAqLworCWRvbmUgPSAwOworCXdoaWxlICggIWRvbmUgJiYgU0RMX1dhaXRFdmVudCgmZXZlbnQpICkgeworCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKwkJCWNhc2UgU0RMX01PVVNFQlVUVE9ORE9XTjoKKwkJCQlEcmF3Qm94KHNjcmVlbiwgZXZlbnQuYnV0dG9uLngsIGV2ZW50LmJ1dHRvbi55LCB3aWR0aCwgaGVpZ2h0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMX0tFWURPV046CisJCQkJLyogSWdub3JlIEFMVC1UQUIgZm9yIHdpbmRvd3MgKi8KKwkJCQlpZiAoIChldmVudC5rZXkua2V5c3ltLnN5bSA9PSBTRExLX0xBTFQpIHx8CisJCQkJICAgICAoZXZlbnQua2V5LmtleXN5bS5zeW0gPT0gU0RMS19UQUIpICkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogQ2VudGVyIHRoZSBtb3VzZSBvbiA8U1BBQ0U+ICovCisJCQkJaWYgKCBldmVudC5rZXkua2V5c3ltLnN5bSA9PSBTRExLX1NQQUNFICkgeworCQkJCQlTRExfV2FycE1vdXNlKHdpZHRoLzIsIGhlaWdodC8yKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIFRvZ2dsZSBmdWxsc2NyZWVuIG1vZGUgb24gPFJFVFVSTj4gKi8KKwkJCQlpZiAoIGV2ZW50LmtleS5rZXlzeW0uc3ltID09IFNETEtfUkVUVVJOICkgeworCQkJCQl2aWRlb2ZsYWdzIF49IFNETF9GVUxMU0NSRUVOOworCQkJCQlzY3JlZW4gPSBDcmVhdGVTY3JlZW4oCisJCQkJCQlzY3JlZW4tPncsIHNjcmVlbi0+aCwKKwkJCQkJCXNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwsCisJCQkJCQkJCXZpZGVvZmxhZ3MpOworCQkJCQlpZiAoIHNjcmVlbiA9PSBOVUxMICkgeworCQkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJDb3VsZG4ndCB0b2dnbGUgZnVsbHNjcmVlbiBtb2RlXG4iKTsKKwkJCQkJCWRvbmUgPSAxOworCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd0JhY2tncm91bmQoc2NyZWVuKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIEFueSBvdGhlciBrZXkgcXVpdHMgdGhlIGFwcGxpY2F0aW9uLi4uICovCisJCQljYXNlIFNETF9RVUlUOgorCQkJCWRvbmUgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTRExfVklERU9FWFBPU0U6CisJCQkJRHJhd0JhY2tncm91bmQoc2NyZWVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RMX1ZJREVPUkVTSVpFOgorCQkJCQlzY3JlZW4gPSBDcmVhdGVTY3JlZW4oCisJCQkJCQlldmVudC5yZXNpemUudywgZXZlbnQucmVzaXplLmgsCisJCQkJCQlzY3JlZW4tPmZvcm1hdC0+Qml0c1BlclBpeGVsLAorCQkJCQkJCQl2aWRlb2ZsYWdzKTsKKwkJCQkJaWYgKCBzY3JlZW4gPT0gTlVMTCApIHsKKwkJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiQ291bGRuJ3QgcmVzaXplIHZpZGVvIG1vZGVcbiIpOworCQkJCQkJZG9uZSA9IDE7CisJCQkJCX0KKwkJCQkJRHJhd0JhY2tncm91bmQoc2NyZWVuKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9CisJU0RMX1F1aXQoKTsKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9pY29uLmJtcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L2ljb24uYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9pY29uLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9sb29wd2F2ZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvbG9vcHdhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWRmNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvbG9vcHdhdmUuYwpAQCAtMCwwICsxLDExNCBAQAorCisvKiBQcm9ncmFtIHRvIGxvYWQgYSB3YXZlIGZpbGUgYW5kIGxvb3AgcGxheWluZyBpdCB1c2luZyBTREwgc291bmQgKi8KKworLyogbG9vcHdhdmVzLmMgaXMgbXVjaCBtb3JlIHJvYnVzdCBpbiBoYW5kbGluZyBXQVZFIGZpbGVzIC0tIAorCVRoaXMgaXMgb25seSBmb3Igc2ltcGxlIFdBVkVzCisqLworI2luY2x1ZGUgIlNETF9jb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZiBIQVZFX1NJR05BTF9ICisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF9hdWRpby5oIgorCitzdHJ1Y3QgeworCVNETF9BdWRpb1NwZWMgc3BlYzsKKwlVaW50OCAgICpzb3VuZDsJCQkvKiBQb2ludGVyIHRvIHdhdmUgZGF0YSAqLworCVVpbnQzMiAgIHNvdW5kbGVuOwkJLyogTGVuZ3RoIG9mIHdhdmUgZGF0YSAqLworCWludCAgICAgIHNvdW5kcG9zOwkJLyogQ3VycmVudCBwbGF5IHBvc2l0aW9uICovCit9IHdhdmU7CisKKworLyogQ2FsbCB0aGlzIGluc3RlYWQgb2YgZXhpdCgpLCBzbyB3ZSBjYW4gY2xlYW4gdXAgU0RMOiBhdGV4aXQoKSBpcyBldmlsLiAqLworc3RhdGljIHZvaWQgcXVpdChpbnQgcmMpCit7CisJU0RMX1F1aXQoKTsKKwlleGl0KHJjKTsKK30KKworCit2b2lkIFNETENBTEwgZmlsbGVydXAodm9pZCAqdW51c2VkLCBVaW50OCAqc3RyZWFtLCBpbnQgbGVuKQoreworCVVpbnQ4ICp3YXZlcHRyOworCWludCAgICB3YXZlbGVmdDsKKworCS8qIFNldCB1cCB0aGUgcG9pbnRlcnMgKi8KKwl3YXZlcHRyID0gd2F2ZS5zb3VuZCArIHdhdmUuc291bmRwb3M7CisJd2F2ZWxlZnQgPSB3YXZlLnNvdW5kbGVuIC0gd2F2ZS5zb3VuZHBvczsKKworCS8qIEdvISAqLworCXdoaWxlICggd2F2ZWxlZnQgPD0gbGVuICkgeworCQlTRExfbWVtY3B5KHN0cmVhbSwgd2F2ZXB0ciwgd2F2ZWxlZnQpOworCQlzdHJlYW0gKz0gd2F2ZWxlZnQ7CisJCWxlbiAtPSB3YXZlbGVmdDsKKwkJd2F2ZXB0ciA9IHdhdmUuc291bmQ7CisJCXdhdmVsZWZ0ID0gd2F2ZS5zb3VuZGxlbjsKKwkJd2F2ZS5zb3VuZHBvcyA9IDA7CisJfQorCVNETF9tZW1jcHkoc3RyZWFtLCB3YXZlcHRyLCBsZW4pOworCXdhdmUuc291bmRwb3MgKz0gbGVuOworfQorCitzdGF0aWMgaW50IGRvbmUgPSAwOwordm9pZCBwb2tlZChpbnQgc2lnKQoreworCWRvbmUgPSAxOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgbmFtZVszMl07CisKKwkvKiBMb2FkIHRoZSBTREwgbGlicmFyeSAqLworCWlmICggU0RMX0luaXQoU0RMX0lOSVRfQVVESU8pIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBpbml0aWFsaXplIFNETDogJXNcbiIsU0RMX0dldEVycm9yKCkpOworCQlyZXR1cm4oMSk7CisJfQorCWlmICggYXJndlsxXSA9PSBOVUxMICkgeworCQlhcmd2WzFdID0gInNhbXBsZS53YXYiOworCX0KKwkvKiBMb2FkIHRoZSB3YXZlIGZpbGUgaW50byBtZW1vcnkgKi8KKwlpZiAoIFNETF9Mb2FkV0FWKGFyZ3ZbMV0sCisJCQkmd2F2ZS5zcGVjLCAmd2F2ZS5zb3VuZCwgJndhdmUuc291bmRsZW4pID09IE5VTEwgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgbG9hZCAlczogJXNcbiIsCisJCQkJCQlhcmd2WzFdLCBTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMSk7CisJfQorCisJd2F2ZS5zcGVjLmNhbGxiYWNrID0gZmlsbGVydXA7CisjaWYgSEFWRV9TSUdOQUxfSAorCS8qIFNldCB0aGUgc2lnbmFscyAqLworI2lmZGVmIFNJR0hVUAorCXNpZ25hbChTSUdIVVAsIHBva2VkKTsKKyNlbmRpZgorCXNpZ25hbChTSUdJTlQsIHBva2VkKTsKKyNpZmRlZiBTSUdRVUlUCisJc2lnbmFsKFNJR1FVSVQsIHBva2VkKTsKKyNlbmRpZgorCXNpZ25hbChTSUdURVJNLCBwb2tlZCk7CisjZW5kaWYgLyogSEFWRV9TSUdOQUxfSCAqLworCisJLyogSW5pdGlhbGl6ZSBmaWxsZXJ1cCgpIHZhcmlhYmxlcyAqLworCWlmICggU0RMX09wZW5BdWRpbygmd2F2ZS5zcGVjLCBOVUxMKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgb3BlbiBhdWRpbzogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJU0RMX0ZyZWVXQVYod2F2ZS5zb3VuZCk7CisJCXF1aXQoMik7CisJfQorCVNETF9QYXVzZUF1ZGlvKDApOworCisJLyogTGV0IHRoZSBhdWRpbyBydW4gKi8KKwlwcmludGYoIlVzaW5nIGF1ZGlvIGRyaXZlcjogJXNcbiIsIFNETF9BdWRpb0RyaXZlck5hbWUobmFtZSwgMzIpKTsKKwl3aGlsZSAoICEgZG9uZSAmJiAoU0RMX0dldEF1ZGlvU3RhdHVzKCkgPT0gU0RMX0FVRElPX1BMQVlJTkcpICkKKwkJU0RMX0RlbGF5KDEwMDApOworCisJLyogQ2xlYW4gdXAgb24gc2lnbmFsICovCisJU0RMX0Nsb3NlQXVkaW8oKTsKKwlTRExfRnJlZVdBVih3YXZlLnNvdW5kKTsKKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L21vb3NlLmRhdCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L21vb3NlLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDUzMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvbW9vc2UuZGF0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3BpY3R1cmUueGJtIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvcGljdHVyZS54Ym0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3M2E2MAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3BpY3R1cmUueGJtCkBAIC0wLDAgKzEsMTQgQEAKKyNkZWZpbmUgcGljdHVyZV93aWR0aCAzMgorI2RlZmluZSBwaWN0dXJlX2hlaWdodCAzMgorc3RhdGljIGNoYXIgcGljdHVyZV9iaXRzW10gPSB7CisgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDgwLCAweDAxLCAweDE4LAorICAgMHg2NCwgMHg2ZiwgMHhmNiwgMHgyNiwgMHgwYSwgMHgwMCwgMHgwMCwgMHg1MCwgMHhmMiwgMHhmZiwgMHhmZiwgMHg0ZiwKKyAgIDB4MTQsIDB4MDQsIDB4MDAsIDB4MjgsIDB4MTQsIDB4MGUsIDB4MDAsIDB4MjgsIDB4MTAsIDB4MzIsIDB4MDAsIDB4MDgsCisgICAweDk0LCAweDAzLCAweDAwLCAweDA4LCAweGY0LCAweDA0LCAweDAwLCAweDA4LCAweGIwLCAweDA4LCAweDAwLCAweDA4LAorICAgMHgzNCwgMHgwMSwgMHgwMCwgMHgyOCwgMHgzNCwgMHgwMSwgMHgwMCwgMHgyOCwgMHgxMiwgMHgwMCwgMHg0MCwgMHg0OCwKKyAgIDB4MTIsIDB4MjAsIDB4YTYsIDB4NDgsIDB4MTQsIDB4NTAsIDB4MTEsIDB4MjksIDB4MTQsIDB4NTAsIDB4NDgsIDB4MmEsCisgICAweDEwLCAweDI3LCAweGFjLCAweDBlLCAweGQ0LCAweDcxLCAweGU4LCAweDBhLCAweDc0LCAweDIwLCAweGE4LCAweDBhLAorICAgMHgxNCwgMHgyMCwgMHgwMCwgMHgwOCwgMHgxMCwgMHg1MCwgMHgwMCwgMHgwOCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgyOCwKKyAgIDB4MTQsIDB4MDAsIDB4MDAsIDB4MjgsIDB4ZjIsIDB4ZmYsIDB4ZmYsIDB4NGYsIDB4MGEsIDB4MDAsIDB4MDAsIDB4NTAsCisgICAweDY0LCAweDZmLCAweGY2LCAweDI2LCAweDE4LCAweDgwLCAweDAxLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9zYWlsLmJtcCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3NhaWwuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODUwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9zYWlsLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9zYW1wbGUuYm1wIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3Qvc2FtcGxlLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E4YmJjCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3Qvc2FtcGxlLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC9zYW1wbGUud2F2IGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3Qvc2FtcGxlLndhdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJmODE1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3Qvc2FtcGxlLndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0YWxwaGEuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RhbHBoYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDRmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0YWxwaGEuYwpAQCAtMCwwICsxLDU0NyBAQAorCisvKiBTaW1wbGUgcHJvZ3JhbTogIEZpbGwgYSBjb2xvcm1hcCB3aXRoIGdyYXkgYW5kIHN0cmlwZSBpdCBkb3duIHRoZSBzY3JlZW4sCisJCSAgICBUaGVuIG1vdmUgYW4gYWxwaGEgdmFsdWVkIHNwcml0ZSBhcm91bmQgdGhlIHNjcmVlbi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworI2RlZmluZSBGUkFNRV9USUNLUwkoMTAwMC8zMCkJCS8qIDMwIGZyYW1lcy9zZWNvbmQgKi8KKworLyogQ2FsbCB0aGlzIGluc3RlYWQgb2YgZXhpdCgpLCBzbyB3ZSBjYW4gY2xlYW4gdXAgU0RMOiBhdGV4aXQoKSBpcyBldmlsLiAqLworc3RhdGljIHZvaWQgcXVpdChpbnQgcmMpCit7CisJU0RMX1F1aXQoKTsKKwlleGl0KHJjKTsKK30KKworLyogRmlsbCB0aGUgc2NyZWVuIHdpdGggYSBncmFkaWVudCAqLworc3RhdGljIHZvaWQgRmlsbEJhY2tncm91bmQoU0RMX1N1cmZhY2UgKnNjcmVlbikKK3sKKwlVaW50OCAqYnVmZmVyOworCVVpbnQxNiAqYnVmZmVyMTY7CisgICAgICAgIFVpbnQxNiBjb2xvcjsKKyAgICAgICAgVWludDggIGdyYWRpZW50OworCWludCAgICBpLCBrOworCisJLyogU2V0IHRoZSBzdXJmYWNlIHBpeGVscyBhbmQgcmVmcmVzaCEgKi8KKwlpZiAoIFNETF9Mb2NrU3VyZmFjZShzY3JlZW4pIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBsb2NrIHRoZSBkaXNwbGF5IHN1cmZhY2U6ICVzXG4iLAorCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJcXVpdCgyKTsKKwl9CisJYnVmZmVyPShVaW50OCAqKXNjcmVlbi0+cGl4ZWxzOworCWlmIChzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCE9MikgeworCQlmb3IgKCBpPTA7IGk8c2NyZWVuLT5oOyArK2kgKSB7CisJCQltZW1zZXQoYnVmZmVyLChpKjI1NSkvc2NyZWVuLT5oLCBzY3JlZW4tPncqc2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpOworCQkJYnVmZmVyICs9IHNjcmVlbi0+cGl0Y2g7CisJCX0KKwl9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCQlmb3IgKCBpPTA7IGk8c2NyZWVuLT5oOyArK2kgKSB7CisJCQlncmFkaWVudD0oKGkqMjU1KS9zY3JlZW4tPmgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAoVWludDE2KVNETF9NYXBSR0Ioc2NyZWVuLT5mb3JtYXQsIGdyYWRpZW50LCBncmFkaWVudCwgZ3JhZGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyMTY9KFVpbnQxNiopYnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8c2NyZWVuLT53OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihidWZmZXIxNitrKT1jb2xvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCWJ1ZmZlciArPSBzY3JlZW4tPnBpdGNoOworCQl9CisgICAgICAgIH0KKworCVNETF9VbmxvY2tTdXJmYWNlKHNjcmVlbik7CisJU0RMX1VwZGF0ZVJlY3Qoc2NyZWVuLCAwLCAwLCAwLCAwKTsKK30KKworLyogQ3JlYXRlIGEgImxpZ2h0IiAtLSBhIHllbGxvd2lzaCBzdXJmYWNlIHdpdGggdmFyaWFibGUgYWxwaGEgKi8KK1NETF9TdXJmYWNlICpDcmVhdGVMaWdodChpbnQgcmFkaXVzKQoreworCVVpbnQ4ICB0cmFucywgYWxwaGFtYXNrOworCWludCAgICByYW5nZSwgYWRkaXRpb247CisJaW50ICAgIHhkaXN0LCB5ZGlzdDsKKwlVaW50MTYgeCwgeTsKKwlVaW50MTYgc2tpcDsKKwlVaW50MzIgcGl4ZWw7CisJU0RMX1N1cmZhY2UgKmxpZ2h0OworCisjaWZkZWYgTElHSFRfMTZCSVQKKwlVaW50MTYgKmJ1ZjsKKworCS8qIENyZWF0ZSBhIDE2ICg0LzQvNC80KSBicHAgc3F1YXJlIHdpdGggYSBmdWxsIDQtYml0IGFscGhhIGNoYW5uZWwgKi8KKwkvKiBOb3RlOiB0aGlzIGlzbid0IGFueSBmYXN0ZXIgdGhhbiBhIDMyIGJpdCBhbHBoYSBzdXJmYWNlICovCisJYWxwaGFtYXNrID0gMHgwMDAwMDAwRjsKKwlsaWdodCA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsIDIqcmFkaXVzLCAyKnJhZGl1cywgMTYsCisJCQkweDAwMDBGMDAwLCAweDAwMDAwRjAwLCAweDAwMDAwMEYwLCBhbHBoYW1hc2spOworI2Vsc2UKKwlVaW50MzIgKmJ1ZjsKKworCS8qIENyZWF0ZSBhIDMyICg4LzgvOC84KSBicHAgc3F1YXJlIHdpdGggYSBmdWxsIDgtYml0IGFscGhhIGNoYW5uZWwgKi8KKwlhbHBoYW1hc2sgPSAweDAwMDAwMEZGOworCWxpZ2h0ID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwgMipyYWRpdXMsIDIqcmFkaXVzLCAzMiwKKwkJCTB4RkYwMDAwMDAsIDB4MDBGRjAwMDAsIDB4MDAwMEZGMDAsIGFscGhhbWFzayk7CisJaWYgKCBsaWdodCA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGNyZWF0ZSBsaWdodDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKyNlbmRpZgorCisJLyogRmlsbCB3aXRoIGEgbGlnaHQgeWVsbG93LW9yYW5nZSBjb2xvciAqLworCXNraXAgPSBsaWdodC0+cGl0Y2gtKGxpZ2h0LT53KmxpZ2h0LT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpOworI2lmZGVmIExJR0hUXzE2QklUCisJYnVmID0gKFVpbnQxNiAqKWxpZ2h0LT5waXhlbHM7CisjZWxzZQorCWJ1ZiA9IChVaW50MzIgKilsaWdodC0+cGl4ZWxzOworI2VuZGlmCisgICAgICAgIC8qIEdldCBhIHRyYW5wYXJlbnQgcGl4ZWwgdmFsdWUgLSB3ZSdsbCBhZGQgYWxwaGEgbGF0ZXIgKi8KKwlwaXhlbCA9IFNETF9NYXBSR0JBKGxpZ2h0LT5mb3JtYXQsIDB4RkYsIDB4REQsIDB4ODgsIDApOworCWZvciAoIHk9MDsgeTxsaWdodC0+aDsgKyt5ICkgeworCQlmb3IgKCB4PTA7IHg8bGlnaHQtPnc7ICsreCApIHsKKwkJCSpidWYrKyA9IHBpeGVsOworCQl9CisJCWJ1ZiArPSBza2lwOwkvKiBBbG1vc3QgYWx3YXlzIDAsIGJ1dCBqdXN0IGluIGNhc2UuLi4gKi8KKwl9CisKKwkvKiBDYWxjdWxhdGUgYWxwaGEgdmFsdWVzIGZvciB0aGUgc3VyZmFjZS4gKi8KKyNpZmRlZiBMSUdIVF8xNkJJVAorCWJ1ZiA9IChVaW50MTYgKilsaWdodC0+cGl4ZWxzOworI2Vsc2UKKwlidWYgPSAoVWludDMyICopbGlnaHQtPnBpeGVsczsKKyNlbmRpZgorCWZvciAoIHk9MDsgeTxsaWdodC0+aDsgKyt5ICkgeworCQlmb3IgKCB4PTA7IHg8bGlnaHQtPnc7ICsreCApIHsKKwkJCS8qIFNsb3cgZGlzdGFuY2UgZm9ybXVsYSAoZnJvbSBjZW50ZXIgb2YgbGlnaHQpICovCisJCQl4ZGlzdCA9IHgtKGxpZ2h0LT53LzIpOworCQkJeWRpc3QgPSB5LShsaWdodC0+aC8yKTsKKwkJCXJhbmdlID0gKGludClzcXJ0KHhkaXN0KnhkaXN0K3lkaXN0KnlkaXN0KTsKKworCQkJLyogU2NhbGUgZGlzdGFuY2UgdG8gcmFuZ2Ugb2YgdHJhbnNwYXJlbmN5ICgwLTI1NSkgKi8KKwkJCWlmICggcmFuZ2UgPiByYWRpdXMgKSB7CisJCQkJdHJhbnMgPSBhbHBoYW1hc2s7CisJCQl9IGVsc2UgeworCQkJCS8qIEluY3JlYXNpbmcgdHJhbnNwYXJlbmN5IHdpdGggZGlzdGFuY2UgKi8KKwkJCQl0cmFucyA9IChVaW50OCkoKHJhbmdlKmFscGhhbWFzaykvcmFkaXVzKTsKKworCQkJCS8qIExpZ2h0cyBhcmUgdmVyeSB0cmFuc3BhcmVudCAqLworCQkJCWFkZGl0aW9uID0gKGFscGhhbWFzaysxKS84OworCQkJCWlmICggKGludCl0cmFucythZGRpdGlvbiA+IGFscGhhbWFzayApIHsKKwkJCQkJdHJhbnMgPSBhbHBoYW1hc2s7CisJCQkJfSBlbHNlIHsKKwkJCQkJdHJhbnMgKz0gYWRkaXRpb247CisJCQkJfQorCQkJfQorCQkJLyogV2Ugc2V0IHRoZSBhbHBoYSBjb21wb25lbnQgYXMgdGhlIHJpZ2h0IE4gYml0cyAqLworCQkJKmJ1ZisrIHw9ICgyNTUtdHJhbnMpOworCQl9CisJCWJ1ZiArPSBza2lwOwkvKiBBbG1vc3QgYWx3YXlzIDAsIGJ1dCBqdXN0IGluIGNhc2UuLi4gKi8KKwl9CisJLyogRW5hYmxlIFJMRSBhY2NlbGVyYXRpb24gb2YgdGhpcyBhbHBoYSBzdXJmYWNlICovCisJU0RMX1NldEFscGhhKGxpZ2h0LCBTRExfU1JDQUxQSEF8U0RMX1JMRUFDQ0VMLCAwKTsKKworCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuKGxpZ2h0KTsKK30KKworc3RhdGljIFVpbnQzMiBmbGFzaGVzID0gMDsKK3N0YXRpYyBVaW50MzIgZmxhc2h0aW1lID0gMDsKKwordm9pZCBGbGFzaExpZ2h0KFNETF9TdXJmYWNlICpzY3JlZW4sIFNETF9TdXJmYWNlICpsaWdodCwgaW50IHgsIGludCB5KQoreworCVNETF9SZWN0IHBvc2l0aW9uOworCVVpbnQzMiAgIHRpY2tzMTsKKwlVaW50MzIgICB0aWNrczI7CisKKwkvKiBFYXN5LCBjZW50ZXIgbGlnaHQgKi8KKwlwb3NpdGlvbi54ID0geC0obGlnaHQtPncvMik7CisJcG9zaXRpb24ueSA9IHktKGxpZ2h0LT5oLzIpOworCXBvc2l0aW9uLncgPSBsaWdodC0+dzsKKwlwb3NpdGlvbi5oID0gbGlnaHQtPmg7CisJdGlja3MxID0gU0RMX0dldFRpY2tzKCk7CisJU0RMX0JsaXRTdXJmYWNlKGxpZ2h0LCBOVUxMLCBzY3JlZW4sICZwb3NpdGlvbik7CisJdGlja3MyID0gU0RMX0dldFRpY2tzKCk7CisJU0RMX1VwZGF0ZVJlY3RzKHNjcmVlbiwgMSwgJnBvc2l0aW9uKTsKKwkrK2ZsYXNoZXM7CisKKwkvKiBVcGRhdGUgdGltZSBzcGVuZCBkb2luZyBhbHBoYSBibGl0dGluZyAqLworCWZsYXNodGltZSArPSAodGlja3MyLXRpY2tzMSk7Cit9CisKK3N0YXRpYyBpbnQgc3ByaXRlX3Zpc2libGUgPSAwOworc3RhdGljIFNETF9TdXJmYWNlICpzcHJpdGU7CitzdGF0aWMgU0RMX1N1cmZhY2UgKmJhY2tpbmc7CitzdGF0aWMgU0RMX1JlY3QgICAgcG9zaXRpb247CitzdGF0aWMgaW50ICAgICAgICAgeF92ZWwsIHlfdmVsOworc3RhdGljIGludAkgICBhbHBoYV92ZWw7CisKK2ludCBMb2FkU3ByaXRlKFNETF9TdXJmYWNlICpzY3JlZW4sIGNoYXIgKmZpbGUpCit7CisJU0RMX1N1cmZhY2UgKmNvbnZlcnRlZDsKKworCS8qIExvYWQgdGhlIHNwcml0ZSBpbWFnZSAqLworCXNwcml0ZSA9IFNETF9Mb2FkQk1QKGZpbGUpOworCWlmICggc3ByaXRlID09IE5VTEwgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgbG9hZCAlczogJXMiLCBmaWxlLCBTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigtMSk7CisJfQorCisJLyogU2V0IHRyYW5zcGFyZW50IHBpeGVsIGFzIHRoZSBwaXhlbCBhdCAoMCwwKSAqLworCWlmICggc3ByaXRlLT5mb3JtYXQtPnBhbGV0dGUgKSB7CisJCVNETF9TZXRDb2xvcktleShzcHJpdGUsIFNETF9TUkNDT0xPUktFWSwKKwkJCQkJCSooVWludDggKilzcHJpdGUtPnBpeGVscyk7CisJfQorCisJLyogQ29udmVydCBzcHJpdGUgdG8gdmlkZW8gZm9ybWF0ICovCisJY29udmVydGVkID0gU0RMX0Rpc3BsYXlGb3JtYXQoc3ByaXRlKTsKKwlTRExfRnJlZVN1cmZhY2Uoc3ByaXRlKTsKKwlpZiAoIGNvbnZlcnRlZCA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGNvbnZlcnQgYmFja2dyb3VuZDogJXNcbiIsCisJCQkJCQkJU0RMX0dldEVycm9yKCkpOworCQlyZXR1cm4oLTEpOworCX0KKwlzcHJpdGUgPSBjb252ZXJ0ZWQ7CisKKwkvKiBDcmVhdGUgdGhlIGJhY2tncm91bmQgKi8KKwliYWNraW5nID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwgc3ByaXRlLT53LCBzcHJpdGUtPmgsIDgsCisJCQkJCQkJCTAsIDAsIDAsIDApOworCWlmICggYmFja2luZyA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGNyZWF0ZSBiYWNrZ3JvdW5kOiAlc1xuIiwKKwkJCQkJCQlTRExfR2V0RXJyb3IoKSk7CisJCVNETF9GcmVlU3VyZmFjZShzcHJpdGUpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIENvbnZlcnQgYmFja2dyb3VuZCB0byB2aWRlbyBmb3JtYXQgKi8KKwljb252ZXJ0ZWQgPSBTRExfRGlzcGxheUZvcm1hdChiYWNraW5nKTsKKwlTRExfRnJlZVN1cmZhY2UoYmFja2luZyk7CisJaWYgKCBjb252ZXJ0ZWQgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBjb252ZXJ0IGJhY2tncm91bmQ6ICVzXG4iLAorCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJU0RMX0ZyZWVTdXJmYWNlKHNwcml0ZSk7CisJCXJldHVybigtMSk7CisJfQorCWJhY2tpbmcgPSBjb252ZXJ0ZWQ7CisKKwkvKiBTZXQgdGhlIGluaXRpYWwgcG9zaXRpb24gb2YgdGhlIHNwcml0ZSAqLworCXBvc2l0aW9uLnggPSAoc2NyZWVuLT53LXNwcml0ZS0+dykvMjsKKwlwb3NpdGlvbi55ID0gKHNjcmVlbi0+aC1zcHJpdGUtPmgpLzI7CisJcG9zaXRpb24udyA9IHNwcml0ZS0+dzsKKwlwb3NpdGlvbi5oID0gc3ByaXRlLT5oOworCXhfdmVsID0gMDsgeV92ZWwgPSAwOworCWFscGhhX3ZlbCA9IDE7CisKKwkvKiBXZSdyZSByZWFkeSB0byByb2xsLiA6KSAqLworCXJldHVybigwKTsKK30KKwordm9pZCBBdHRyYWN0U3ByaXRlKFVpbnQxNiB4LCBVaW50MTYgeSkKK3sKKwl4X3ZlbCA9ICgoaW50KXgtcG9zaXRpb24ueCkvMTA7CisJeV92ZWwgPSAoKGludCl5LXBvc2l0aW9uLnkpLzEwOworfQorCit2b2lkIE1vdmVTcHJpdGUoU0RMX1N1cmZhY2UgKnNjcmVlbiwgU0RMX1N1cmZhY2UgKmxpZ2h0KQoreworCVNETF9SZWN0IHVwZGF0ZXNbMl07CisJaW50IGFscGhhOworCisJLyogRXJhc2UgdGhlIHNwcml0ZSBpZiBpdCB3YXMgdmlzaWJsZSAqLworCWlmICggc3ByaXRlX3Zpc2libGUgKSB7CisJCXVwZGF0ZXNbMF0gPSBwb3NpdGlvbjsKKwkJU0RMX0JsaXRTdXJmYWNlKGJhY2tpbmcsIE5VTEwsIHNjcmVlbiwgJnVwZGF0ZXNbMF0pOworCX0gZWxzZSB7CisJCXVwZGF0ZXNbMF0ueCA9IDA7IHVwZGF0ZXNbMF0ueSA9IDA7CisJCXVwZGF0ZXNbMF0udyA9IDA7IHVwZGF0ZXNbMF0uaCA9IDA7CisJCXNwcml0ZV92aXNpYmxlID0gMTsKKwl9CisKKwkvKiBTaW5jZSB0aGUgc3ByaXRlIGlzIG9mZiB0aGUgc2NyZWVuLCB3ZSBjYW4gZG8gb3RoZXIgZHJhd2luZworCSAgIHdpdGhvdXQgYmVpbmcgb3ZlcndyaXR0ZW4gYnkgdGhlIHNhdmVkIGFyZWEgYmVoaW5kIHRoZSBzcHJpdGUuCisJICovCisJaWYgKCBsaWdodCAhPSBOVUxMICkgeworCQlpbnQgeCwgeTsKKworCQlTRExfR2V0TW91c2VTdGF0ZSgmeCwgJnkpOworCQlGbGFzaExpZ2h0KHNjcmVlbiwgbGlnaHQsIHgsIHkpOworCX0KKwkgICAKKwkvKiBNb3ZlIHRoZSBzcHJpdGUsIGJvdW5jZSBhdCB0aGUgd2FsbCAqLworCXBvc2l0aW9uLnggKz0geF92ZWw7CisJaWYgKCAocG9zaXRpb24ueCA8IDApIHx8IChwb3NpdGlvbi54ID49IHNjcmVlbi0+dykgKSB7CisJCXhfdmVsID0gLXhfdmVsOworCQlwb3NpdGlvbi54ICs9IHhfdmVsOworCX0KKwlwb3NpdGlvbi55ICs9IHlfdmVsOworCWlmICggKHBvc2l0aW9uLnkgPCAwKSB8fCAocG9zaXRpb24ueSA+PSBzY3JlZW4tPmgpICkgeworCQl5X3ZlbCA9IC15X3ZlbDsKKwkJcG9zaXRpb24ueSArPSB5X3ZlbDsKKwl9CisKKwkvKiBVcGRhdGUgdHJhbnNwYXJlbmN5IChmYWRlIGluIGFuZCBvdXQpICovCisJYWxwaGEgPSBzcHJpdGUtPmZvcm1hdC0+YWxwaGE7CisJaWYgKCAoYWxwaGErYWxwaGFfdmVsKSA8IDAgKSB7CisJCWFscGhhX3ZlbCA9IC1hbHBoYV92ZWw7CisJfSBlbHNlCisJaWYgKCAoYWxwaGErYWxwaGFfdmVsKSA+IDI1NSApIHsKKwkJYWxwaGFfdmVsID0gLWFscGhhX3ZlbDsKKwl9CisJU0RMX1NldEFscGhhKHNwcml0ZSwgU0RMX1NSQ0FMUEhBLCAoVWludDgpKGFscGhhK2FscGhhX3ZlbCkpOworCisJLyogU2F2ZSB0aGUgYXJlYSBiZWhpbmQgdGhlIHNwcml0ZSAqLworCXVwZGF0ZXNbMV0gPSBwb3NpdGlvbjsKKwlTRExfQmxpdFN1cmZhY2Uoc2NyZWVuLCAmdXBkYXRlc1sxXSwgYmFja2luZywgTlVMTCk7CisJCisJLyogQmxpdCB0aGUgc3ByaXRlIG9udG8gdGhlIHNjcmVlbiAqLworCXVwZGF0ZXNbMV0gPSBwb3NpdGlvbjsKKwlTRExfQmxpdFN1cmZhY2Uoc3ByaXRlLCBOVUxMLCBzY3JlZW4sICZ1cGRhdGVzWzFdKTsKKworCS8qIE1ha2UgaXQgc28hICovCisJU0RMX1VwZGF0ZVJlY3RzKHNjcmVlbiwgMiwgdXBkYXRlcyk7Cit9CisKK3ZvaWQgV2FycFNwcml0ZShTRExfU3VyZmFjZSAqc2NyZWVuLCBpbnQgeCwgaW50IHkpCit7CisJU0RMX1JlY3QgdXBkYXRlc1syXTsKKworCS8qIEVyYXNlLCBtb3ZlLCBEcmF3LCB1cGRhdGUgKi8KKwl1cGRhdGVzWzBdID0gcG9zaXRpb247CisJU0RMX0JsaXRTdXJmYWNlKGJhY2tpbmcsIE5VTEwsIHNjcmVlbiwgJnVwZGF0ZXNbMF0pOworCXBvc2l0aW9uLnggPSB4LXNwcml0ZS0+dy8yOwkvKiBDZW50ZXIgYWJvdXQgWCAqLworCXBvc2l0aW9uLnkgPSB5LXNwcml0ZS0+aC8yOwkvKiBDZW50ZXIgYWJvdXQgWSAqLworCXVwZGF0ZXNbMV0gPSBwb3NpdGlvbjsKKwlTRExfQmxpdFN1cmZhY2Uoc2NyZWVuLCAmdXBkYXRlc1sxXSwgYmFja2luZywgTlVMTCk7CisJdXBkYXRlc1sxXSA9IHBvc2l0aW9uOworCVNETF9CbGl0U3VyZmFjZShzcHJpdGUsIE5VTEwsIHNjcmVlbiwgJnVwZGF0ZXNbMV0pOworCVNETF9VcGRhdGVSZWN0cyhzY3JlZW4sIDIsIHVwZGF0ZXMpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNvbnN0IFNETF9WaWRlb0luZm8gKmluZm87CisJU0RMX1N1cmZhY2UgKnNjcmVlbjsKKwlpbnQgICAgdywgaDsKKwlVaW50OCAgdmlkZW9fYnBwOworCVVpbnQzMiB2aWRlb2ZsYWdzOworCWludCAgICBpLCBkb25lOworCVNETF9FdmVudCBldmVudDsKKwlTRExfU3VyZmFjZSAqbGlnaHQ7CisJaW50IG1vdXNlX3ByZXNzZWQ7CisJVWludDMyIHRpY2tzLCBsYXN0dGlja3M7CisKKworCS8qIEluaXRpYWxpemUgU0RMICovCisJaWYgKCBTRExfSW5pdChTRExfSU5JVF9WSURFTykgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBBbHBoYSBibGVuZGluZyBkb2Vzbid0IHdvcmsgd2VsbCBhdCA4LWJpdCBjb2xvciAqLworI2lmZGVmIF9XSU4zMl9XQ0UKKwkvKiBQb2NrZXQgUEMgKi8KKwl3ID0gMjQwOworCWggPSAzMjA7CisjZWxzZQorCXcgPSA2NDA7CisJaCA9IDQ4MDsKKyNlbmRpZgorCWluZm8gPSBTRExfR2V0VmlkZW9JbmZvKCk7CisJaWYgKCBpbmZvLT52Zm10LT5CaXRzUGVyUGl4ZWwgPiA4ICkgeworCQl2aWRlb19icHAgPSBpbmZvLT52Zm10LT5CaXRzUGVyUGl4ZWw7CisJfSBlbHNlIHsKKwkJdmlkZW9fYnBwID0gMTY7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmb3JjZWQgMTYgYnBwIG1vZGVcbiIpOworCX0KKwl2aWRlb2ZsYWdzID0gU0RMX1NXU1VSRkFDRTsKKwlmb3IgKCBpID0gMTsgYXJndltpXTsgKytpICkgeworCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLWJwcCIpID09IDAgKSB7CisJCQl2aWRlb19icHAgPSBhdG9pKGFyZ3ZbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9fYnBwPD04KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fYnBwPTE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZm9yY2VkIDE2IGJwcCBtb2RlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItaHciKSA9PSAwICkgeworCQkJdmlkZW9mbGFncyB8PSBTRExfSFdTVVJGQUNFOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndltpXSwgIi13YXJwIikgPT0gMCApIHsKKwkJCXZpZGVvZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItd2lkdGgiKSA9PSAwICYmIGFyZ3ZbaSsxXSApIHsKKwkJCXcgPSBhdG9pKGFyZ3ZbKytpXSk7CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLWhlaWdodCIpID09IDAgJiYgYXJndltpKzFdICkgeworCQkJaCA9IGF0b2koYXJndlsrK2ldKTsKKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItcmVzaXplIikgPT0gMCApIHsKKwkJCXZpZGVvZmxhZ3MgfD0gU0RMX1JFU0laQUJMRTsKKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItbm9mcmFtZSIpID09IDAgKSB7CisJCQl2aWRlb2ZsYWdzIHw9IFNETF9OT0ZSQU1FOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndltpXSwgIi1mdWxsc2NyZWVuIikgPT0gMCApIHsKKwkJCXZpZGVvZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgCisJCQkiVXNhZ2U6ICVzIFstd2lkdGggTl0gWy1oZWlnaHQgTl0gWy1icHAgTl0gWy13YXJwXSBbLWh3XSBbLWZ1bGxzY3JlZW5dXG4iLAorCQkJCQkJCQlhcmd2WzBdKTsKKwkJCXF1aXQoMSk7CisJCX0KKwl9CisKKwkvKiBTZXQgdmlkZW8gbW9kZSAqLworCWlmICggKHNjcmVlbj1TRExfU2V0VmlkZW9Nb2RlKHcsaCx2aWRlb19icHAsdmlkZW9mbGFncykpID09IE5VTEwgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0ICVkeCVkeCVkIHZpZGVvIG1vZGU6ICVzXG4iLAorCQkJCQkJdywgaCwgdmlkZW9fYnBwLCBTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMik7CisJfQorCUZpbGxCYWNrZ3JvdW5kKHNjcmVlbik7CisKKwkvKiBDcmVhdGUgdGhlIGxpZ2h0ICovCisJbGlnaHQgPSBDcmVhdGVMaWdodCg4Mik7CisJaWYgKCBsaWdodCA9PSBOVUxMICkgeworCQlxdWl0KDEpOworCX0KKworCS8qIExvYWQgdGhlIHNwcml0ZSAqLworCWlmICggTG9hZFNwcml0ZShzY3JlZW4sICJpY29uLmJtcCIpIDwgMCApIHsKKwkJU0RMX0ZyZWVTdXJmYWNlKGxpZ2h0KTsKKwkJcXVpdCgxKTsKKwl9CisKKwkvKiBQcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgb3VyIHN1cmZhY2VzICovCisJcHJpbnRmKCJTY3JlZW4gaXMgYXQgJWQgYml0cyBwZXIgcGl4ZWxcbiIsc2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCk7CisJaWYgKCAoc2NyZWVuLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UgKSB7CisJCXByaW50ZigiU2NyZWVuIGlzIGluIHZpZGVvIG1lbW9yeVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJTY3JlZW4gaXMgaW4gc3lzdGVtIG1lbW9yeVxuIik7CisJfQorCWlmICggKHNjcmVlbi0+ZmxhZ3MgJiBTRExfRE9VQkxFQlVGKSA9PSBTRExfRE9VQkxFQlVGICkgeworCQlwcmludGYoIlNjcmVlbiBoYXMgZG91YmxlLWJ1ZmZlcmluZyBlbmFibGVkXG4iKTsKKwl9CisJaWYgKCAoc3ByaXRlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpID09IFNETF9IV1NVUkZBQ0UgKSB7CisJCXByaW50ZigiU3ByaXRlIGlzIGluIHZpZGVvIG1lbW9yeVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJTcHJpdGUgaXMgaW4gc3lzdGVtIG1lbW9yeVxuIik7CisJfQorCisJLyogUnVuIGEgc2FtcGxlIGJsaXQgdG8gdHJpZ2dlciBibGl0IGFjY2VsZXJhdGlvbiAqLworCU1vdmVTcHJpdGUoc2NyZWVuLCBOVUxMKTsKKwlpZiAoIChzcHJpdGUtPmZsYWdzICYgU0RMX0hXQUNDRUwpID09IFNETF9IV0FDQ0VMICkgeworCQlwcmludGYoIlNwcml0ZSBibGl0IHVzZXMgaGFyZHdhcmUgYWxwaGEgYWNjZWxlcmF0aW9uXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlNwcml0ZSBibGl0IGRvc24ndCB1c2VzIGhhcmR3YXJlIGFscGhhIGFjY2VsZXJhdGlvblxuIik7CisJfQorCisJLyogU2V0IGEgY2xpcHBpbmcgcmVjdGFuZ2xlIHRvIGNsaXAgdGhlIG91dHNpZGUgZWRnZSBvZiB0aGUgc2NyZWVuICovCisJeyBTRExfUmVjdCBjbGlwOworCQljbGlwLnggPSAzMjsKKwkJY2xpcC55ID0gMzI7CisJCWNsaXAudyA9IHNjcmVlbi0+dy0oMiozMik7CisJCWNsaXAuaCA9IHNjcmVlbi0+aC0oMiozMik7CisJCVNETF9TZXRDbGlwUmVjdChzY3JlZW4sICZjbGlwKTsKKwl9CisKKwkvKiBXYWl0IGZvciBhIGtleXN0cm9rZSAqLworCWxhc3R0aWNrcyA9IFNETF9HZXRUaWNrcygpOworCWRvbmUgPSAwOworCW1vdXNlX3ByZXNzZWQgPSAwOworCXdoaWxlICggIWRvbmUgKSB7CisJCS8qIFVwZGF0ZSB0aGUgZnJhbWUgLS0gbW92ZSB0aGUgc3ByaXRlICovCisJCWlmICggbW91c2VfcHJlc3NlZCApIHsKKwkJCU1vdmVTcHJpdGUoc2NyZWVuLCBsaWdodCk7CisJCQltb3VzZV9wcmVzc2VkID0gMDsKKwkJfSBlbHNlIHsKKwkJCU1vdmVTcHJpdGUoc2NyZWVuLCBOVUxMKTsKKwkJfQorCisJCS8qIFNsb3cgZG93biB0aGUgbG9vcCB0byAzMCBmcmFtZXMvc2Vjb25kICovCisJCXRpY2tzID0gU0RMX0dldFRpY2tzKCk7CisJCWlmICggKHRpY2tzLWxhc3R0aWNrcykgPCBGUkFNRV9USUNLUyApIHsKKyNpZmRlZiBDSEVDS19TTEVFUF9HUkFOVUxBUklUWQorZnByaW50ZihzdGRlcnIsICJTbGVlcGluZyAlZCB0aWNrc1xuIiwgRlJBTUVfVElDS1MtKHRpY2tzLWxhc3R0aWNrcykpOworI2VuZGlmCisJCQlTRExfRGVsYXkoRlJBTUVfVElDS1MtKHRpY2tzLWxhc3R0aWNrcykpOworI2lmZGVmIENIRUNLX1NMRUVQX0dSQU5VTEFSSVRZCitmcHJpbnRmKHN0ZGVyciwgIlNsZXB0ICVkIHRpY2tzXG4iLCAoU0RMX0dldFRpY2tzKCktdGlja3MpKTsKKyNlbmRpZgorCQl9CisJCWxhc3R0aWNrcyA9IHRpY2tzOworCisJCS8qIENoZWNrIGZvciBldmVudHMgKi8KKwkJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZldmVudCkgKSB7CisJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKwkJCQljYXNlIFNETF9WSURFT1JFU0laRToKKwkJCQkJc2NyZWVuID0gU0RMX1NldFZpZGVvTW9kZShldmVudC5yZXNpemUudywgZXZlbnQucmVzaXplLmgsIHZpZGVvX2JwcCwgdmlkZW9mbGFncyk7CisJCQkJCWlmICggc2NyZWVuICkgeworCQkJCQkJRmlsbEJhY2tncm91bmQoc2NyZWVuKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQkvKiBBdHRyYWN0IHNwcml0ZSB3aGlsZSBtb3VzZSBpcyBoZWxkIGRvd24gKi8KKwkJCQljYXNlIFNETF9NT1VTRU1PVElPTjoKKwkJCQkJaWYgKGV2ZW50Lm1vdGlvbi5zdGF0ZSAhPSAwKSB7CisJCQkJCQlBdHRyYWN0U3ByaXRlKGV2ZW50Lm1vdGlvbi54LAorCQkJCQkJCQlldmVudC5tb3Rpb24ueSk7CisJCQkJCQltb3VzZV9wcmVzc2VkID0gMTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisJCQkJCWlmICggZXZlbnQuYnV0dG9uLmJ1dHRvbiA9PSAxICkgeworCQkJCQkJQXR0cmFjdFNwcml0ZShldmVudC5idXR0b24ueCwKKwkJCQkJCSAgICAgICAgICAgICAgZXZlbnQuYnV0dG9uLnkpOworCQkJCQkJbW91c2VfcHJlc3NlZCA9IDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlTRExfUmVjdCBhcmVhOworCisJCQkJCQlhcmVhLnggPSBldmVudC5idXR0b24ueC0xNjsKKwkJCQkJCWFyZWEueSA9IGV2ZW50LmJ1dHRvbi55LTE2OworCQkJCQkJYXJlYS53ID0gMzI7CisJCQkJCQlhcmVhLmggPSAzMjsKKwkJCQkJCVNETF9GaWxsUmVjdChzY3JlZW4sICZhcmVhLCAwKTsKKwkJCQkJCVNETF9VcGRhdGVSZWN0cyhzY3JlZW4sMSwmYXJlYSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRExfS0VZRE9XTjoKKyNpZmRlZiBfV0lOMzJfV0NFCisJCQkJCS8vIHRoZXJlIGlzIG5vIEVTQyBrZXkgYXQgYWxsCisJCQkJCWRvbmUgPSAxOworI2Vsc2UKKwkJCQkJaWYgKCBldmVudC5rZXkua2V5c3ltLnN5bSA9PSBTRExLX0VTQ0FQRSApIHsKKwkJCQkJCWRvbmUgPSAxOworCQkJCQl9IGVsc2UgaWYgKGV2ZW50LmtleS5rZXlzeW0uc3ltID09IFNETEtfdCkgeworCQkJCQkJdmlkZW9mbGFncyBePSBTRExfRlVMTFNDUkVFTjsKKwkJCQkJCXNjcmVlbiA9IFNETF9TZXRWaWRlb01vZGUodywgaCwgdmlkZW9fYnBwLCB2aWRlb2ZsYWdzKTsKKwkJCQkJCWlmICggc2NyZWVuID09IE5VTEwgKSB7CisJCQkJCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCB0b2dnbGUgdmlkZW8gbW9kZTogJXNcbiIsCisJCQkJCQkJCQlTRExfR2V0RXJyb3IoKSk7CisJCQkJCQkJcXVpdCgyKTsKKwkJCQkJCX0KKwkJCQkJCUZpbGxCYWNrZ3JvdW5kKHNjcmVlbik7CisJCQkJCX0KKyNlbmRpZgorCisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX1FVSVQ6CisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlTRExfRnJlZVN1cmZhY2UobGlnaHQpOworCVNETF9GcmVlU3VyZmFjZShzcHJpdGUpOworCVNETF9GcmVlU3VyZmFjZShiYWNraW5nKTsKKworCS8qIFByaW50IG91dCBzb21lIHRpbWluZyBpbmZvcm1hdGlvbiAqLworCWlmICggZmxhc2hlcyA+IDAgKSB7CisJCXByaW50ZigiJWQgYWxwaGEgYmxpdHMsIH4lNC40ZiBtcyBwZXIgYmxpdFxuIiwgCisJCQlmbGFzaGVzLCAoZmxvYXQpZmxhc2h0aW1lL2ZsYXNoZXMpOworCX0KKworCVNETF9RdWl0KCk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGJpdG1hcC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGJpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2ZjYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0Yml0bWFwLmMKQEAgLTAsMCArMSwxODQgQEAKKworLyogU2ltcGxlIHByb2dyYW06ICBUZXN0IGJpdG1hcCBibGl0cyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgInBpY3R1cmUueGJtIgorCisvKiBDYWxsIHRoaXMgaW5zdGVhZCBvZiBleGl0KCksIHNvIHdlIGNhbiBjbGVhbiB1cCBTREw6IGF0ZXhpdCgpIGlzIGV2aWwuICovCitzdGF0aWMgdm9pZCBxdWl0KGludCByYykKK3sKKwlTRExfUXVpdCgpOworCWV4aXQocmMpOworfQorCitTRExfU3VyZmFjZSAqTG9hZFhCTShTRExfU3VyZmFjZSAqc2NyZWVuLCBpbnQgdywgaW50IGgsIFVpbnQ4ICpiaXRzKQoreworCVNETF9TdXJmYWNlICpiaXRtYXA7CisJVWludDggKmxpbmU7CisKKwkvKiBBbGxvY2F0ZSB0aGUgYml0bWFwICovCisJYml0bWFwID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwgdywgaCwgMSwgMCwgMCwgMCwgMCk7CisJaWYgKCBiaXRtYXAgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBhbGxvY2F0ZSBiaXRtYXA6ICVzXG4iLAorCQkJCQkJU0RMX0dldEVycm9yKCkpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogQ29weSB0aGUgcGl4ZWxzICovCisJbGluZSA9IChVaW50OCAqKWJpdG1hcC0+cGl4ZWxzOworCXcgPSAodys3KS84OworCXdoaWxlICggaC0tICkgeworCQltZW1jcHkobGluZSwgYml0cywgdyk7CisJCS8qIFgxMSBCaXRtYXAgaW1hZ2VzIGhhdmUgdGhlIGJpdHMgcmV2ZXJzZWQgKi8KKwkJeyBpbnQgaSwgajsgVWludDggKmJ1ZiwgYnl0ZTsKKwkJCWZvciAoIGJ1Zj1saW5lLCBpPTA7IGk8dzsgKytpLCArK2J1ZiApIHsKKwkJCQlieXRlID0gKmJ1ZjsKKwkJCQkqYnVmID0gMDsKKwkJCQlmb3IgKCBqPTc7IGo+PTA7IC0taiApIHsKKwkJCQkJKmJ1ZiB8PSAoYnl0ZSYweDAxKTw8ajsKKwkJCQkJYnl0ZSA+Pj0gMTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbGluZSArPSBiaXRtYXAtPnBpdGNoOworCQliaXRzICs9IHc7CisJfQorCXJldHVybihiaXRtYXApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCVNETF9TdXJmYWNlICpzY3JlZW47CisJU0RMX1N1cmZhY2UgKmJpdG1hcDsKKwlVaW50OCAgdmlkZW9fYnBwOworCVVpbnQzMiB2aWRlb2ZsYWdzOworCVVpbnQ4ICpidWZmZXI7CisJaW50IGksIGssIGRvbmU7CisJU0RMX0V2ZW50IGV2ZW50OworCVVpbnQxNiAqYnVmZmVyMTY7CisgICAgICAgIFVpbnQxNiBjb2xvcjsKKyAgICAgICAgVWludDggIGdyYWRpZW50OworCVNETF9Db2xvciBwYWxldHRlWzI1Nl07CisKKworCS8qIEluaXRpYWxpemUgU0RMICovCisJaWYgKCBTRExfSW5pdChTRExfSU5JVF9WSURFTykgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwl2aWRlb19icHAgPSAwOworCXZpZGVvZmxhZ3MgPSBTRExfU1dTVVJGQUNFOworCXdoaWxlICggYXJnYyA+IDEgKSB7CisJCS0tYXJnYzsKKwkJaWYgKCBzdHJjbXAoYXJndlthcmdjLTFdLCAiLWJwcCIpID09IDAgKSB7CisJCQl2aWRlb19icHAgPSBhdG9pKGFyZ3ZbYXJnY10pOworCQkJLS1hcmdjOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlthcmdjXSwgIi13YXJwIikgPT0gMCApIHsKKwkJCXZpZGVvZmxhZ3MgfD0gU0RMX0hXUEFMRVRURTsKKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbYXJnY10sICItaHciKSA9PSAwICkgeworCQkJdmlkZW9mbGFncyB8PSBTRExfSFdTVVJGQUNFOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlthcmdjXSwgIi1mdWxsc2NyZWVuIikgPT0gMCApIHsKKwkJCXZpZGVvZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJVc2FnZTogJXMgWy1icHAgTl0gWy13YXJwXSBbLWh3XSBbLWZ1bGxzY3JlZW5dXG4iLAorCQkJCQkJCQlhcmd2WzBdKTsKKwkJCXF1aXQoMSk7CisJCX0KKwl9CisKKwkvKiBTZXQgNjQweDQ4MCB2aWRlbyBtb2RlICovCisJaWYgKCAoc2NyZWVuPVNETF9TZXRWaWRlb01vZGUoNjQwLDQ4MCx2aWRlb19icHAsdmlkZW9mbGFncykpID09IE5VTEwgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0IDY0MHg0ODB4JWQgdmlkZW8gbW9kZTogJXNcbiIsCisJCQkJCQl2aWRlb19icHAsIFNETF9HZXRFcnJvcigpKTsKKwkJcXVpdCgyKTsKKwl9CisKKwlpZiAodmlkZW9fYnBwPT04KSB7CisJCS8qIFNldCBhIGdyYXkgY29sb3JtYXAsIHJldmVyc2Ugb3JkZXIgZnJvbSB3aGl0ZSB0byBibGFjayAqLworCQlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7CisJCQlwYWxldHRlW2ldLnIgPSAyNTUtaTsKKwkJCXBhbGV0dGVbaV0uZyA9IDI1NS1pOworCQkJcGFsZXR0ZVtpXS5iID0gMjU1LWk7CisJCX0KKwkJU0RMX1NldENvbG9ycyhzY3JlZW4sIHBhbGV0dGUsIDAsIDI1Nik7CisJfQorCisJLyogU2V0IHRoZSBzdXJmYWNlIHBpeGVscyBhbmQgcmVmcmVzaCEgKi8KKwlpZiAoIFNETF9Mb2NrU3VyZmFjZShzY3JlZW4pIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBsb2NrIHRoZSBkaXNwbGF5IHN1cmZhY2U6ICVzXG4iLAorCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJcXVpdCgyKTsKKwl9CisJYnVmZmVyPShVaW50OCAqKXNjcmVlbi0+cGl4ZWxzOworCWlmIChzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCE9MikgeworICAgICAgICAJZm9yICggaT0wOyBpPHNjcmVlbi0+aDsgKytpICkgeworICAgICAgICAJCW1lbXNldChidWZmZXIsKGkqMjU1KS9zY3JlZW4tPmgsIHNjcmVlbi0+cGl0Y2gpOworICAgICAgICAJCWJ1ZmZlciArPSBzY3JlZW4tPnBpdGNoOworICAgICAgICAJfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCQlmb3IgKCBpPTA7IGk8c2NyZWVuLT5oOyArK2kgKSB7CisJCQlncmFkaWVudD0oKGkqMjU1KS9zY3JlZW4tPmgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCBncmFkaWVudCwgZ3JhZGllbnQsIGdyYWRpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjE2PShVaW50MTYqKWJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrPHNjcmVlbi0+dzsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICooYnVmZmVyMTYrayk9Y29sb3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlidWZmZXIgKz0gc2NyZWVuLT5waXRjaDsKKwkJfQorICAgICAgICB9CisJU0RMX1VubG9ja1N1cmZhY2Uoc2NyZWVuKTsKKwlTRExfVXBkYXRlUmVjdChzY3JlZW4sIDAsIDAsIDAsIDApOworCisJLyogTG9hZCB0aGUgYml0bWFwICovCisJYml0bWFwID0gTG9hZFhCTShzY3JlZW4sIHBpY3R1cmVfd2lkdGgsIHBpY3R1cmVfaGVpZ2h0LAorCQkJCQkoVWludDggKilwaWN0dXJlX2JpdHMpOworCWlmICggYml0bWFwID09IE5VTEwgKSB7CisJCXF1aXQoMSk7CisJfQorCisJLyogV2FpdCBmb3IgYSBrZXlzdHJva2UgKi8KKwlkb25lID0gMDsKKwl3aGlsZSAoICFkb25lICkgeworCQkvKiBDaGVjayBmb3IgZXZlbnRzICovCisJCXdoaWxlICggU0RMX1BvbGxFdmVudCgmZXZlbnQpICkgeworCQkJc3dpdGNoIChldmVudC50eXBlKSB7CisJCQkJY2FzZSBTRExfTU9VU0VCVVRUT05ET1dOOiB7CisJCQkJCVNETF9SZWN0IGRzdDsKKworCQkJCQlkc3QueCA9IGV2ZW50LmJ1dHRvbi54IC0gYml0bWFwLT53LzI7CisJCQkJCWRzdC55ID0gZXZlbnQuYnV0dG9uLnkgLSBiaXRtYXAtPmgvMjsKKwkJCQkJZHN0LncgPSBiaXRtYXAtPnc7CisJCQkJCWRzdC5oID0gYml0bWFwLT5oOworCQkJCQlTRExfQmxpdFN1cmZhY2UoYml0bWFwLCBOVUxMLAorCQkJCQkJCQlzY3JlZW4sICZkc3QpOworCQkJCQlTRExfVXBkYXRlUmVjdHMoc2NyZWVuLDEsJmRzdCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRExfS0VZRE9XTjoKKwkJCQkJLyogQW55IGtleSBwcmVzcyBxdWl0cyB0aGUgYXBwLi4uICovCisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9RVUlUOgorCQkJCQlkb25lID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJU0RMX0ZyZWVTdXJmYWNlKGJpdG1hcCk7CisJU0RMX1F1aXQoKTsKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0YmxpdHNwZWVkLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0YmxpdHNwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkZmY2YgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RibGl0c3BlZWQuYwpAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIEJlbmNobWFya3Mgc3VyZmFjZS10by1zdXJmYWNlIGJsaXRzIGluIHZhcmlvdXMgZm9ybWF0cy4KKyAqCisgKiAgV3JpdHRlbiBieSBSeWFuIEMuIEdvcmRvbi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNETC5oIgorCitzdGF0aWMgU0RMX1N1cmZhY2UgKmRlc3QgPSBOVUxMOworc3RhdGljIFNETF9TdXJmYWNlICpzcmMgPSBOVUxMOworc3RhdGljIGludCB0ZXN0U2Vjb25kcyA9IDEwOworCisKK3N0YXRpYyBpbnQgcGVyY2VudChpbnQgdmFsLCBpbnQgdG90YWwpCit7CisgICAgcmV0dXJuKChpbnQpICgoKChmbG9hdCkgdmFsKSAvICgoZmxvYXQpIHRvdGFsKSkgKiAxMDAuMGYpKTsKK30KKworc3RhdGljIGludCByYW5kUmFuZ2UoaW50IGxvLCBpbnQgaGkpCit7CisgICAgcmV0dXJuKGxvICsgKGludCkgKCgoZG91YmxlKSBoaSkqcmFuZCgpLyhSQU5EX01BWCsxLjApKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfdHJ1bmNfc3RyKGNoYXIgKnN0ciwgc2l6ZV90IHN0cnNpemUsIGNvbnN0IGNoYXIgKmZsYWdzdHIpCit7CisgICAgaWYgKCAoc3RybGVuKHN0cikgKyBzdHJsZW4oZmxhZ3N0cikpID49IChzdHJzaXplIC0gMSkgKQorICAgICAgICBzdHJjcHkoc3RyICsgKHN0cnNpemUgLSA1KSwgIiAuLi4iKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNhdChzdHIsIGZsYWdzdHIpOworfQorCitzdGF0aWMgdm9pZCBfX2FwcGVuZF9zZGxfc3VyZmFjZV9mbGFnKFNETF9TdXJmYWNlICpfc3VyZmFjZSwgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3Ryc2l6ZSwgVWludDMyIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZsYWdzdHIpCit7CisgICAgaWYgKF9zdXJmYWNlLT5mbGFncyAmIGZsYWcpCisgICAgICAgIGNvcHlfdHJ1bmNfc3RyKHN0ciwgc3Ryc2l6ZSwgZmxhZ3N0cik7Cit9CisKKworI2RlZmluZSBhcHBlbmRfc2RsX3N1cmZhY2VfZmxhZyhhLCBiLCBjLCBmbCkgX19hcHBlbmRfc2RsX3N1cmZhY2VfZmxhZyhhLCBiLCBjLCBmbCwgIiAiICNmbCkKKyNkZWZpbmUgcHJpbnRfdGZfc3RhdGUoc3RyLCB2YWwpIHByaW50ZigiJXM6IHslc31cbiIsIHN0ciwgKHZhbCkgPyAidHJ1ZSIgOiAiZmFsc2UiICkKKworc3RhdGljIHZvaWQgb3V0cHV0X3ZpZGVvaW5mb19kZXRhaWxzKHZvaWQpCit7CisgICAgY29uc3QgU0RMX1ZpZGVvSW5mbyAqaW5mbyA9IFNETF9HZXRWaWRlb0luZm8oKTsKKyAgICBwcmludGYoIlNETF9HZXRWaWRlb0luZm8oKTpcbiIpOworICAgIGlmIChpbmZvID09IE5VTEwpCisgICAgICAgIHByaW50ZigiICAobnVsbC4pXG4iKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludF90Zl9zdGF0ZSgiICBoYXJkd2FyZSBzdXJmYWNlIGF2YWlsYWJsZSIsIGluZm8tPmh3X2F2YWlsYWJsZSk7CisgICAgICAgIHByaW50X3RmX3N0YXRlKCIgIHdpbmRvdyBtYW5hZ2VyIGF2YWlsYWJsZSIsIGluZm8tPndtX2F2YWlsYWJsZSk7CisgICAgICAgIHByaW50X3RmX3N0YXRlKCIgIGFjY2VsZXJhdGVkIGhhcmR3YXJlLT5oYXJkd2FyZSBibGl0cyIsIGluZm8tPmJsaXRfaHcpOworICAgICAgICBwcmludF90Zl9zdGF0ZSgiICBhY2NlbGVyYXRlZCBoYXJkd2FyZS0+aGFyZHdhcmUgY29sb3JrZXkgYmxpdHMiLCBpbmZvLT5ibGl0X2h3X0NDKTsKKyAgICAgICAgcHJpbnRfdGZfc3RhdGUoIiAgYWNjZWxlcmF0ZWQgaGFyZHdhcmUtPmhhcmR3YXJlIGFscGhhIGJsaXRzIiwgaW5mby0+YmxpdF9od19BKTsKKyAgICAgICAgcHJpbnRfdGZfc3RhdGUoIiAgYWNjZWxlcmF0ZWQgc29mdHdhcmUtPmhhcmR3YXJlIGJsaXRzIiwgaW5mby0+YmxpdF9zdyk7CisgICAgICAgIHByaW50X3RmX3N0YXRlKCIgIGFjY2VsZXJhdGVkIHNvZnR3YXJlLT5oYXJkd2FyZSBjb2xvcmtleSBibGl0cyIsIGluZm8tPmJsaXRfc3dfQ0MpOworICAgICAgICBwcmludF90Zl9zdGF0ZSgiICBhY2NlbGVyYXRlZCBzb2Z0d2FyZS0+aGFyZHdhcmUgYWxwaGEgYmxpdHMiLCBpbmZvLT5ibGl0X3N3X0EpOworICAgICAgICBwcmludF90Zl9zdGF0ZSgiICBhY2NlbGVyYXRlZCBjb2xvciBmaWxscyIsIGluZm8tPmJsaXRfZmlsbCk7CisgICAgICAgIHByaW50ZigiICB2aWRlbyBtZW1vcnk6ICglZClcbiIsIGluZm8tPnZpZGVvX21lbSk7CisgICAgfQorCisgICAgcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfc3VyZmFjZV9kZXRhaWxzKGNvbnN0IGNoYXIgKm5hbWUsIFNETF9TdXJmYWNlICpzdXJmYWNlKQoreworICAgIHByaW50ZigiRGV0YWlscyBmb3IgJXM6XG4iLCBuYW1lKTsKKworICAgIGlmIChzdXJmYWNlID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoIi1XQVJOSU5HLSBZb3UndmUgZ290IGEgTlVMTCBzdXJmYWNlISIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjaGFyIGZbMjU2XTsKKyAgICAgICAgcHJpbnRmKCIgIHdpZHRoICAgICAgOiAlZFxuIiwgc3VyZmFjZS0+dyk7CisgICAgICAgIHByaW50ZigiICBoZWlnaHQgICAgIDogJWRcbiIsIHN1cmZhY2UtPmgpOworICAgICAgICBwcmludGYoIiAgZGVwdGggICAgICA6ICVkIGJpdHMgcGVyIHBpeGVsXG4iLCBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCk7CisgICAgICAgIHByaW50ZigiICBwaXRjaCAgICAgIDogJWRcbiIsIChpbnQpIHN1cmZhY2UtPnBpdGNoKTsKKyAgICAgICAgcHJpbnRmKCIgIGFscGhhICAgICAgOiAlZFxuIiwgKGludCkgc3VyZmFjZS0+Zm9ybWF0LT5hbHBoYSk7CisgICAgICAgIHByaW50ZigiICBjb2xvcmtleSAgIDogMHglWFxuIiwgKHVuc2lnbmVkIGludCkgc3VyZmFjZS0+Zm9ybWF0LT5jb2xvcmtleSk7CisKKyAgICAgICAgcHJpbnRmKCIgIHJlZCBiaXRzICAgOiAweCUwOFggbWFzaywgJWQgc2hpZnQsICVkIGxvc3NcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHN1cmZhY2UtPmZvcm1hdC0+Um1hc2ssCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHN1cmZhY2UtPmZvcm1hdC0+UnNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAoaW50KSBzdXJmYWNlLT5mb3JtYXQtPlJsb3NzKTsKKyAgICAgICAgcHJpbnRmKCIgIGdyZWVuIGJpdHMgOiAweCUwOFggbWFzaywgJWQgc2hpZnQsICVkIGxvc3NcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHN1cmZhY2UtPmZvcm1hdC0+R21hc2ssCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHN1cmZhY2UtPmZvcm1hdC0+R3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAoaW50KSBzdXJmYWNlLT5mb3JtYXQtPkdsb3NzKTsKKyAgICAgICAgcHJpbnRmKCIgIGJsdWUgYml0cyAgOiAweCUwOFggbWFzaywgJWQgc2hpZnQsICVkIGxvc3NcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHN1cmZhY2UtPmZvcm1hdC0+Qm1hc2ssCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHN1cmZhY2UtPmZvcm1hdC0+QnNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAoaW50KSBzdXJmYWNlLT5mb3JtYXQtPkJsb3NzKTsKKyAgICAgICAgcHJpbnRmKCIgIGFscGhhIGJpdHMgOiAweCUwOFggbWFzaywgJWQgc2hpZnQsICVkIGxvc3NcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHN1cmZhY2UtPmZvcm1hdC0+QW1hc2ssCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHN1cmZhY2UtPmZvcm1hdC0+QXNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAoaW50KSBzdXJmYWNlLT5mb3JtYXQtPkFsb3NzKTsKKworICAgICAgICBmWzBdID0gJ1wwJzsKKworICAgICAgICAvKmFwcGVuZF9zZGxfc3VyZmFjZV9mbGFnKHN1cmZhY2UsIGYsIHNpemVvZiAoZiksIFNETF9TV1NVUkZBQ0UpOyovCisgICAgICAgIGlmICgoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSAwKQorICAgICAgICAgICAgY29weV90cnVuY19zdHIoZiwgc2l6ZW9mIChmKSwgIiBTRExfU1dTVVJGQUNFIik7CisKKyAgICAgICAgYXBwZW5kX3NkbF9zdXJmYWNlX2ZsYWcoc3VyZmFjZSwgZiwgc2l6ZW9mIChmKSwgU0RMX0hXU1VSRkFDRSk7CisgICAgICAgIGFwcGVuZF9zZGxfc3VyZmFjZV9mbGFnKHN1cmZhY2UsIGYsIHNpemVvZiAoZiksIFNETF9BU1lOQ0JMSVQpOworICAgICAgICBhcHBlbmRfc2RsX3N1cmZhY2VfZmxhZyhzdXJmYWNlLCBmLCBzaXplb2YgKGYpLCBTRExfQU5ZRk9STUFUKTsKKyAgICAgICAgYXBwZW5kX3NkbF9zdXJmYWNlX2ZsYWcoc3VyZmFjZSwgZiwgc2l6ZW9mIChmKSwgU0RMX0hXUEFMRVRURSk7CisgICAgICAgIGFwcGVuZF9zZGxfc3VyZmFjZV9mbGFnKHN1cmZhY2UsIGYsIHNpemVvZiAoZiksIFNETF9ET1VCTEVCVUYpOworICAgICAgICBhcHBlbmRfc2RsX3N1cmZhY2VfZmxhZyhzdXJmYWNlLCBmLCBzaXplb2YgKGYpLCBTRExfRlVMTFNDUkVFTik7CisgICAgICAgIGFwcGVuZF9zZGxfc3VyZmFjZV9mbGFnKHN1cmZhY2UsIGYsIHNpemVvZiAoZiksIFNETF9PUEVOR0wpOworICAgICAgICBhcHBlbmRfc2RsX3N1cmZhY2VfZmxhZyhzdXJmYWNlLCBmLCBzaXplb2YgKGYpLCBTRExfT1BFTkdMQkxJVCk7CisgICAgICAgIGFwcGVuZF9zZGxfc3VyZmFjZV9mbGFnKHN1cmZhY2UsIGYsIHNpemVvZiAoZiksIFNETF9SRVNJWkFCTEUpOworICAgICAgICBhcHBlbmRfc2RsX3N1cmZhY2VfZmxhZyhzdXJmYWNlLCBmLCBzaXplb2YgKGYpLCBTRExfTk9GUkFNRSk7CisgICAgICAgIGFwcGVuZF9zZGxfc3VyZmFjZV9mbGFnKHN1cmZhY2UsIGYsIHNpemVvZiAoZiksIFNETF9IV0FDQ0VMKTsKKyAgICAgICAgYXBwZW5kX3NkbF9zdXJmYWNlX2ZsYWcoc3VyZmFjZSwgZiwgc2l6ZW9mIChmKSwgU0RMX1NSQ0NPTE9SS0VZKTsKKyAgICAgICAgYXBwZW5kX3NkbF9zdXJmYWNlX2ZsYWcoc3VyZmFjZSwgZiwgc2l6ZW9mIChmKSwgU0RMX1JMRUFDQ0VMT0spOworICAgICAgICBhcHBlbmRfc2RsX3N1cmZhY2VfZmxhZyhzdXJmYWNlLCBmLCBzaXplb2YgKGYpLCBTRExfUkxFQUNDRUwpOworICAgICAgICBhcHBlbmRfc2RsX3N1cmZhY2VfZmxhZyhzdXJmYWNlLCBmLCBzaXplb2YgKGYpLCBTRExfU1JDQUxQSEEpOworICAgICAgICBhcHBlbmRfc2RsX3N1cmZhY2VfZmxhZyhzdXJmYWNlLCBmLCBzaXplb2YgKGYpLCBTRExfUFJFQUxMT0MpOworCisgICAgICAgIGlmIChmWzBdID09ICdcMCcpCisgICAgICAgICAgICBzdHJjcHkoZiwgIiAobm9uZSkiKTsKKworICAgICAgICBwcmludGYoIiAgZmxhZ3MgICAgICA6JXNcbiIsIGYpOworICAgIH0KKworICAgIHByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgb3V0cHV0X2RldGFpbHModm9pZCkKK3sKKyAgICBvdXRwdXRfdmlkZW9pbmZvX2RldGFpbHMoKTsKKyAgICBvdXRwdXRfc3VyZmFjZV9kZXRhaWxzKCJTb3VyY2UgU3VyZmFjZSIsIHNyYyk7CisgICAgb3V0cHV0X3N1cmZhY2VfZGV0YWlscygiRGVzdGluYXRpb24gU3VyZmFjZSIsIGRlc3QpOworfQorCitzdGF0aWMgVWludDMyIGJsaXQoU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1N1cmZhY2UgKnNyYywgaW50IHgsIGludCB5KQoreworICAgIFVpbnQzMiBzdGFydCA9IDA7CisgICAgU0RMX1JlY3Qgc3JjUmVjdDsKKyAgICBTRExfUmVjdCBkc3RSZWN0OworCisgICAgc3JjUmVjdC54ID0gMDsKKyAgICBzcmNSZWN0LnkgPSAwOworICAgIGRzdFJlY3QueCA9IHg7CisgICAgZHN0UmVjdC55ID0geTsKKyAgICBkc3RSZWN0LncgPSBzcmNSZWN0LncgPSBzcmMtPnc7ICAvKiBTREwgd2lsbCBjbGlwIGFzIGFwcHJvcHJpYXRlLiAqLworICAgIGRzdFJlY3QuaCA9IHNyY1JlY3QuaCA9IHNyYy0+aDsKKworICAgIHN0YXJ0ID0gU0RMX0dldFRpY2tzKCk7CisgICAgU0RMX0JsaXRTdXJmYWNlKHNyYywgJnNyY1JlY3QsIGRzdCwgJmRzdFJlY3QpOworICAgIHJldHVybihTRExfR2V0VGlja3MoKSAtIHN0YXJ0KTsKK30KKworc3RhdGljIHZvaWQgYmxpdENlbnRlcmVkKFNETF9TdXJmYWNlICpkc3QsIFNETF9TdXJmYWNlICpzcmMpCit7CisgICAgaW50IHggPSAoZHN0LT53IC0gc3JjLT53KSAvIDI7CisgICAgaW50IHkgPSAoZHN0LT5oIC0gc3JjLT5oKSAvIDI7CisgICAgYmxpdChkc3QsIHNyYywgeCwgeSk7Cit9CisKK3N0YXRpYyBpbnQgYXRvaV9oZXgoY29uc3QgY2hhciAqc3RyKQoreworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoc3RybGVuKHN0cikgPiAyKQorICAgIHsKKyAgICAgICAgaW50IHJldHZhbCA9IDA7CisgICAgICAgIGlmICgoc3RyWzBdID09ICcwJykgJiYgKHN0clsxXSA9PSAneCcpKQorICAgICAgICAgICAgc3NjYW5mKHN0ciArIDIsICIlWCIsICZyZXR2YWwpOworICAgICAgICByZXR1cm4ocmV0dmFsKTsKKyAgICB9CisKKyAgICByZXR1cm4oYXRvaShzdHIpKTsKK30KKworCitzdGF0aWMgaW50IHNldHVwX3Rlc3QoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGNvbnN0IGNoYXIgKmR1bXBmaWxlID0gTlVMTDsKKyAgICBTRExfU3VyZmFjZSAqYm1wID0gTlVMTDsKKyAgICBVaW50MzIgZHN0YnBwID0gMzI7CisgICAgVWludDMyIGRzdHJtYXNrID0gMHgwMEZGMDAwMDsKKyAgICBVaW50MzIgZHN0Z21hc2sgPSAweDAwMDBGRjAwOworICAgIFVpbnQzMiBkc3RibWFzayA9IDB4MDAwMDAwRkY7CisgICAgVWludDMyIGRzdGFtYXNrID0gMHgwMDAwMDAwMDsKKyAgICBVaW50MzIgZHN0ZmxhZ3MgPSAwOworICAgIGludCBkc3R3ID0gNjQwOworICAgIGludCBkc3RoID0gNDgwOworICAgIFVpbnQzMiBzcmNicHAgPSAzMjsKKyAgICBVaW50MzIgc3Jjcm1hc2sgPSAweDAwRkYwMDAwOworICAgIFVpbnQzMiBzcmNnbWFzayA9IDB4MDAwMEZGMDA7CisgICAgVWludDMyIHNyY2JtYXNrID0gMHgwMDAwMDBGRjsKKyAgICBVaW50MzIgc3JjYW1hc2sgPSAweDAwMDAwMDAwOworICAgIFVpbnQzMiBzcmNmbGFncyA9IDA7CisgICAgaW50IHNyY3cgPSA2NDA7CisgICAgaW50IHNyY2ggPSA0ODA7CisgICAgVWludDMyIG9yaWdzcmNhbHBoYWZsYWdzID0gMDsKKyAgICBVaW50MzIgb3JpZ2RzdGFscGhhZmxhZ3MgPSAwOworICAgIFVpbnQzMiBzcmNhbHBoYWZsYWdzID0gMDsKKyAgICBVaW50MzIgZHN0YWxwaGFmbGFncyA9IDA7CisgICAgaW50IHNyY2FscGhhID0gMjU1OworICAgIGludCBkc3RhbHBoYSA9IDI1NTsKKyAgICBpbnQgc2NyZWVuU3VyZmFjZSA9IDA7CisgICAgaW50IGkgPSAwOworCisgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgICAgaWYgKHN0cmNtcChhcmcsICItLWRzdGJwcCIpID09IDApCisgICAgICAgICAgICBkc3RicHAgPSBhdG9pKGFyZ3ZbKytpXSk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWRzdHJtYXNrIikgPT0gMCkKKyAgICAgICAgICAgIGRzdHJtYXNrID0gYXRvaV9oZXgoYXJndlsrK2ldKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tZHN0Z21hc2siKSA9PSAwKQorICAgICAgICAgICAgZHN0Z21hc2sgPSBhdG9pX2hleChhcmd2WysraV0pOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1kc3RibWFzayIpID09IDApCisgICAgICAgICAgICBkc3RibWFzayA9IGF0b2lfaGV4KGFyZ3ZbKytpXSk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWRzdGFtYXNrIikgPT0gMCkKKyAgICAgICAgICAgIGRzdGFtYXNrID0gYXRvaV9oZXgoYXJndlsrK2ldKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tZHN0d2lkdGgiKSA9PSAwKQorICAgICAgICAgICAgZHN0dyA9IGF0b2koYXJndlsrK2ldKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tZHN0aGVpZ2h0IikgPT0gMCkKKyAgICAgICAgICAgIGRzdGggPSBhdG9pKGFyZ3ZbKytpXSk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWRzdGh3c3VyZmFjZSIpID09IDApCisgICAgICAgICAgICBkc3RmbGFncyB8PSBTRExfSFdTVVJGQUNFOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zcmNicHAiKSA9PSAwKQorICAgICAgICAgICAgc3JjYnBwID0gYXRvaShhcmd2WysraV0pOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zcmNybWFzayIpID09IDApCisgICAgICAgICAgICBzcmNybWFzayA9IGF0b2lfaGV4KGFyZ3ZbKytpXSk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXNyY2dtYXNrIikgPT0gMCkKKyAgICAgICAgICAgIHNyY2dtYXNrID0gYXRvaV9oZXgoYXJndlsrK2ldKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tc3JjYm1hc2siKSA9PSAwKQorICAgICAgICAgICAgc3JjYm1hc2sgPSBhdG9pX2hleChhcmd2WysraV0pOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zcmNhbWFzayIpID09IDApCisgICAgICAgICAgICBzcmNhbWFzayA9IGF0b2lfaGV4KGFyZ3ZbKytpXSk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXNyY3dpZHRoIikgPT0gMCkKKyAgICAgICAgICAgIHNyY3cgPSBhdG9pKGFyZ3ZbKytpXSk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXNyY2hlaWdodCIpID09IDApCisgICAgICAgICAgICBzcmNoID0gYXRvaShhcmd2WysraV0pOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zcmNod3N1cmZhY2UiKSA9PSAwKQorICAgICAgICAgICAgc3JjZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tc2Vjb25kcyIpID09IDApCisgICAgICAgICAgICB0ZXN0U2Vjb25kcyA9IGF0b2koYXJndlsrK2ldKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tc2NyZWVuIikgPT0gMCkKKyAgICAgICAgICAgIHNjcmVlblN1cmZhY2UgPSAxOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1kdW1wZmlsZSIpID09IDApCisgICAgICAgICAgICBkdW1wZmlsZSA9IGFyZ3ZbKytpXTsKKyAgICAgICAgLyogISEhIEZJWE1FOiBzZXQgY29sb3JrZXkuICovCisgICAgICAgIGVsc2UgaWYgKDApICAvKiAhISEgRklYTUU6IHdlIGhhbmRsZSBzb21lIGNvbW1hbmRsaW5lcyBlbHNld2hlcmUgbm93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBjb21tYW5kbGluZSBvcHRpb246ICVzXG4iLCBhcmcpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU0RMX0luaXQgZmFpbGVkOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgYm1wID0gU0RMX0xvYWRCTVAoInNhbXBsZS5ibXAiKTsKKyAgICBpZiAoYm1wID09IE5VTEwpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNETF9Mb2FkQk1QIGZhaWxlZDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgU0RMX1F1aXQoKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGlmICgoZHN0ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSAwKSBkc3RmbGFncyB8PSBTRExfU1dTVVJGQUNFOworICAgIGlmICgoc3JjZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSAwKSBzcmNmbGFncyB8PSBTRExfU1dTVVJGQUNFOworCisgICAgaWYgKHNjcmVlblN1cmZhY2UpCisgICAgICAgIGRlc3QgPSBTRExfU2V0VmlkZW9Nb2RlKGRzdHcsIGRzdGgsIGRzdGJwcCwgZHN0ZmxhZ3MpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRlc3QgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShkc3RmbGFncywgZHN0dywgZHN0aCwgZHN0YnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0cm1hc2ssIGRzdGdtYXNrLCBkc3RibWFzaywgZHN0YW1hc2spOworICAgIH0KKworICAgIGlmIChkZXN0ID09IE5VTEwpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlc3Qgc3VyZmFjZSBjcmVhdGlvbiBmYWlsZWQ6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIFNETF9RdWl0KCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBzcmMgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShzcmNmbGFncywgc3Jjdywgc3JjaCwgc3JjYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3JtYXNrLCBzcmNnbWFzaywgc3JjYm1hc2ssIHNyY2FtYXNrKTsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNyYyBzdXJmYWNlIGNyZWF0aW9uIGZhaWxlZDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgU0RMX1F1aXQoKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIC8qIGhhbmRsZSBhbHBoYSBzZXR0aW5ncy4uLiAqLworICAgIHNyY2FscGhhZmxhZ3MgPSAoc3JjLT5mbGFncyZTRExfU1JDQUxQSEEpIHwgKHNyYy0+ZmxhZ3MmU0RMX1JMRUFDQ0VMKTsKKyAgICBkc3RhbHBoYWZsYWdzID0gKGRlc3QtPmZsYWdzJlNETF9TUkNBTFBIQSkgfCAoZGVzdC0+ZmxhZ3MmU0RMX1JMRUFDQ0VMKTsKKyAgICBvcmlnc3JjYWxwaGFmbGFncyA9IHNyY2FscGhhZmxhZ3M7CisgICAgb3JpZ2RzdGFscGhhZmxhZ3MgPSBkc3RhbHBoYWZsYWdzOworICAgIHNyY2FscGhhID0gc3JjLT5mb3JtYXQtPmFscGhhOworICAgIGRzdGFscGhhID0gZGVzdC0+Zm9ybWF0LT5hbHBoYTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworICAgICAgICBpZiAoc3RyY21wKGFyZywgIi0tc3JjYWxwaGEiKSA9PSAwKQorICAgICAgICAgICAgc3JjYWxwaGEgPSBhdG9pKGFyZ3ZbKytpXSk7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWRzdGFscGhhIikgPT0gMCkKKyAgICAgICAgICAgIGRzdGFscGhhID0gYXRvaShhcmd2WysraV0pOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zcmNzcmNhbHBoYSIpID09IDApCisgICAgICAgICAgICBzcmNhbHBoYWZsYWdzIHw9IFNETF9TUkNBTFBIQTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tc3Jjbm9zcmNhbHBoYSIpID09IDApCisgICAgICAgICAgICBzcmNhbHBoYWZsYWdzICY9IH5TRExfU1JDQUxQSEE7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXNyY3JsZWFjY2VsIikgPT0gMCkKKyAgICAgICAgICAgIHNyY2FscGhhZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zcmNub3JsZWFjY2VsIikgPT0gMCkKKyAgICAgICAgICAgIHNyY2FscGhhZmxhZ3MgJj0gflNETF9STEVBQ0NFTDsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tZHN0c3JjYWxwaGEiKSA9PSAwKQorICAgICAgICAgICAgZHN0YWxwaGFmbGFncyB8PSBTRExfU1JDQUxQSEE7CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWRzdG5vc3JjYWxwaGEiKSA9PSAwKQorICAgICAgICAgICAgZHN0YWxwaGFmbGFncyAmPSB+U0RMX1NSQ0FMUEhBOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1kc3RybGVhY2NlbCIpID09IDApCisgICAgICAgICAgICBkc3RhbHBoYWZsYWdzIHw9IFNETF9STEVBQ0NFTDsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tZHN0bm9ybGVhY2NlbCIpID09IDApCisgICAgICAgICAgICBkc3RhbHBoYWZsYWdzICY9IH5TRExfUkxFQUNDRUw7CisgICAgfQorICAgIGlmICgoZHN0YWxwaGFmbGFncyAhPSBvcmlnZHN0YWxwaGFmbGFncykgfHwgKGRzdGFscGhhICE9IGRlc3QtPmZvcm1hdC0+YWxwaGEpKQorICAgICAgICBTRExfU2V0QWxwaGEoZGVzdCwgZHN0YWxwaGFmbGFncywgKFVpbnQ4KSBkc3RhbHBoYSk7CisgICAgaWYgKChzcmNhbHBoYWZsYWdzICE9IG9yaWdzcmNhbHBoYWZsYWdzKSB8fCAoc3JjYWxwaGEgIT0gc3JjLT5mb3JtYXQtPmFscGhhKSkKKyAgICAgICAgU0RMX1NldEFscGhhKHNyYywgc3JjYWxwaGFmbGFncywgKFVpbnQ4KSBzcmNhbHBoYSk7CisKKyAgICAvKiBzZXQgc29tZSBzYW5lIGRlZmF1bHRzIHNvIHdlIGNhbiBzZWUgaWYgdGhlIGJsaXQgY29kZSBpcyBicm9rZW4uLi4gKi8KKyAgICBTRExfRmlsbFJlY3QoZGVzdCwgTlVMTCwgU0RMX01hcFJHQihkZXN0LT5mb3JtYXQsIDAsIDAsIDApKTsKKyAgICBTRExfRmlsbFJlY3Qoc3JjLCBOVUxMLCBTRExfTWFwUkdCKHNyYy0+Zm9ybWF0LCAwLCAwLCAwKSk7CisKKyAgICBibGl0Q2VudGVyZWQoc3JjLCBibXApOworICAgIFNETF9GcmVlU3VyZmFjZShibXApOworCisgICAgaWYgKGR1bXBmaWxlKQorICAgICAgICBTRExfU2F2ZUJNUChzcmMsIGR1bXBmaWxlKTsgIC8qIG1ha2Ugc3VyZSBpbml0aWFsIGNvbnZlcnQgaXMgc2FuZS4gKi8KKworICAgIG91dHB1dF9kZXRhaWxzKCk7CisKKyAgICByZXR1cm4oMSk7Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9ibGl0X3NwZWVkKHZvaWQpCit7CisgICAgVWludDMyIGNsZWFyQ29sb3IgPSBTRExfTWFwUkdCKGRlc3QtPmZvcm1hdCwgMCwgMCwgMCk7CisgICAgVWludDMyIGl0ZXJhdGlvbnMgPSAwOworICAgIFVpbnQzMiBlbGFzcGVkID0gMDsKKyAgICBVaW50MzIgZW5kID0gMDsKKyAgICBVaW50MzIgbm93ID0gMDsKKyAgICBVaW50MzIgbGFzdCA9IDA7CisgICAgaW50IHRlc3RtcyA9IHRlc3RTZWNvbmRzICogMTAwMDsKKyAgICBpbnQgd21heCA9IChkZXN0LT53IC0gc3JjLT53KTsKKyAgICBpbnQgaG1heCA9IChkZXN0LT5oIC0gc3JjLT5oKTsKKyAgICBpbnQgaXNTY3JlZW4gPSAoU0RMX0dldFZpZGVvU3VyZmFjZSgpID09IGRlc3QpOworICAgIFNETF9FdmVudCBldmVudDsKKworICAgIHByaW50ZigiVGVzdGluZyBibGl0IHNwZWVkIGZvciAlZCBzZWNvbmRzLi4uXG4iLCB0ZXN0U2Vjb25kcyk7CisKKyAgICBub3cgPSBTRExfR2V0VGlja3MoKTsKKyAgICBlbmQgPSBub3cgKyB0ZXN0bXM7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogcHVtcCB0aGUgZXZlbnQgcXVldWUgb2NjYXNpb25hbGx5IHRvIGtlZXAgT1MgaGFwcHkuLi4gKi8KKyAgICAgICAgaWYgKG5vdyAtIGxhc3QgPiAxMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0ID0gbm93OworICAgICAgICAgICAgd2hpbGUgKFNETF9Qb2xsRXZlbnQoJmV2ZW50KSkgeyAvKiBuby1vcC4gKi8gfQorICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0aW9ucysrOworICAgICAgICBlbGFzcGVkICs9IGJsaXQoZGVzdCwgc3JjLCByYW5kUmFuZ2UoMCwgd21heCksIHJhbmRSYW5nZSgwLCBobWF4KSk7CisgICAgICAgIGlmIChpc1NjcmVlbikKKyAgICAgICAgeworICAgICAgICAgICAgU0RMX0ZsaXAoZGVzdCk7ICAvKiBzaG93IGl0ISAqLworICAgICAgICAgICAgU0RMX0ZpbGxSZWN0KGRlc3QsIE5VTEwsIGNsZWFyQ29sb3IpOyAvKiBibGFuayBpdCBmb3IgbmV4dCB0aW1lISAqLworICAgICAgICB9CisKKyAgICAgICAgbm93ID0gU0RMX0dldFRpY2tzKCk7CisgICAgfSB3aGlsZSAobm93IDwgZW5kKTsKKworICAgIHByaW50ZigiTm9uLWJsaXR0aW5nIGNyYXAgYWNjb3VudGVkIGZvciAlZCBwZXJjZW50IG9mIHRoaXMgcnVuLlxuIiwKKyAgICAgICAgICAgIHBlcmNlbnQodGVzdG1zIC0gZWxhc3BlZCwgdGVzdG1zKSk7CisKKyAgICBwcmludGYoIiVkIGJsaXRzIHRvb2sgJWQgbXMgKCVkIGZwcykuXG4iLAorICAgICAgICAgICAgKGludCkgaXRlcmF0aW9ucywKKyAgICAgICAgICAgIChpbnQpIGVsYXNwZWQsCisgICAgICAgICAgICAoaW50KSAoKChmbG9hdClpdGVyYXRpb25zKSAvICgoKGZsb2F0KWVsYXNwZWQpIC8gMTAwMC4wZikpKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBpbml0aWFsaXplZCA9IHNldHVwX3Rlc3QoYXJnYywgYXJndik7CisgICAgaWYgKGluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgdGVzdF9ibGl0X3NwZWVkKCk7CisgICAgICAgIFNETF9RdWl0KCk7CisgICAgfQorICAgIHJldHVybighaW5pdGlhbGl6ZWQpOworfQorCisvKiBlbmQgb2YgdGVzdGJsaXRzcGVlZC5jIC4uLiAqLworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0Y2Ryb20uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RjZHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MmE2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0Y2Ryb20uYwpAQCAtMCwwICsxLDIwOSBAQAorCisvKiBUZXN0IHRoZSBTREwgQ0QtUk9NIGF1ZGlvIGZ1bmN0aW9ucyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKKy8qIENhbGwgdGhpcyBpbnN0ZWFkIG9mIGV4aXQoKSwgc28gd2UgY2FuIGNsZWFuIHVwIFNETDogYXRleGl0KCkgaXMgZXZpbC4gKi8KK3N0YXRpYyB2b2lkIHF1aXQoaW50IHJjKQoreworCVNETF9RdWl0KCk7CisJZXhpdChyYyk7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50U3RhdHVzKGludCBkcml2ZWluZGV4LCBTRExfQ0QgKmNkcm9tKQoreworCUNEc3RhdHVzIHN0YXR1czsKKwljaGFyICpzdGF0dXNfc3RyOworCisJc3RhdHVzID0gU0RMX0NEU3RhdHVzKGNkcm9tKTsKKwlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIENEX1RSQVlFTVBUWToKKwkJCXN0YXR1c19zdHIgPSAidHJheSBlbXB0eSI7CisJCQlicmVhazsKKwkJY2FzZSBDRF9TVE9QUEVEOgorCQkJc3RhdHVzX3N0ciA9ICJzdG9wcGVkIjsKKwkJCWJyZWFrOworCQljYXNlIENEX1BMQVlJTkc6CisJCQlzdGF0dXNfc3RyID0gInBsYXlpbmciOworCQkJYnJlYWs7CisJCWNhc2UgQ0RfUEFVU0VEOgorCQkJc3RhdHVzX3N0ciA9ICJwYXVzZWQiOworCQkJYnJlYWs7CisJCWNhc2UgQ0RfRVJST1I6CisJCQlzdGF0dXNfc3RyID0gImVycm9yIHN0YXRlIjsKKwkJCWJyZWFrOworCX0KKwlwcmludGYoIkRyaXZlICVkIHN0YXR1czogJXNcbiIsIGRyaXZlaW5kZXgsIHN0YXR1c19zdHIpOworCWlmICggc3RhdHVzID49IENEX1BMQVlJTkcgKSB7CisJCWludCBtLCBzLCBmOworCQlGUkFNRVNfVE9fTVNGKGNkcm9tLT5jdXJfZnJhbWUsICZtLCAmcywgJmYpOworCQlwcmludGYoIkN1cnJlbnRseSBwbGF5aW5nIHRyYWNrICVkLCAlZDolMi4yZFxuIiwKKwkJCWNkcm9tLT50cmFja1tjZHJvbS0+Y3VyX3RyYWNrXS5pZCwgbSwgcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBMaXN0VHJhY2tzKFNETF9DRCAqY2Ryb20pCit7CisJaW50IGk7CisJaW50IG0sIHMsIGY7CisJY2hhciogdHJ0eXBlOworCisJU0RMX0NEU3RhdHVzKGNkcm9tKTsKKwlwcmludGYoIkRyaXZlIHRyYWNrczogJWRcbiIsIGNkcm9tLT5udW10cmFja3MpOworCWZvciAoIGk9MDsgaTxjZHJvbS0+bnVtdHJhY2tzOyArK2kgKSB7CisJCUZSQU1FU19UT19NU0YoY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCwgJm0sICZzLCAmZik7CisJCWlmICggZiA+IDAgKQorCQkJKytzOworCQlzd2l0Y2goY2Ryb20tPnRyYWNrW2ldLnR5cGUpCisJCXsKKwkJICAgIGNhc2UgU0RMX0FVRElPX1RSQUNLOgorCQkJdHJ0eXBlPSJhdWRpbyI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgU0RMX0RBVEFfVFJBQ0s6CisJCQl0cnR5cGU9ImRhdGEiOworCQkJYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkJdHJ0eXBlPSJ1bmtub3duIjsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ZigiXHRUcmFjayAoaW5kZXggJWQpICVkOiAlZDolMi4yZCAvICVkIFslcyB0cmFja11cbiIsIGksCisJCQkJCWNkcm9tLT50cmFja1tpXS5pZCwgbSwgcywgY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCwgdHJ0eXBlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFByaW50VXNhZ2UoY2hhciAqYXJndjApCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW2RyaXZlI10gW2NvbW1hbmRdIFtjb21tYW5kXSAuLi5cbiIsIGFyZ3YwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlICdjb21tYW5kJyBpcyBvbmUgb2Y6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgktc3RhdHVzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgktbGlzdFxuIik7CisJZnByaW50ZihzdGRlcnIsICIJLXBsYXkgW2ZpcnN0X3RyYWNrXSBbZmlyc3RfZnJhbWVdIFtudW1fdHJhY2tzXSBbbnVtX2ZyYW1lc11cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCS1wYXVzZVxuIik7CisJZnByaW50ZihzdGRlcnIsICIJLXJlc3VtZVxuIik7CisJZnByaW50ZihzdGRlcnIsICIJLXN0b3BcbiIpOworCWZwcmludGYoc3RkZXJyLCAiCS1lamVjdFxuIik7CisJZnByaW50ZihzdGRlcnIsICIJLXNsZWVwIDxtaWxsaXNlY29uZHM+XG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZHJpdmU7CisJaW50IGk7CisJU0RMX0NEICpjZHJvbTsKKworCS8qIEluaXRpYWxpemUgU0RMIGZpcnN0ICovCisJaWYgKCBTRExfSW5pdChTRExfSU5JVF9DRFJPTSkgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBGaW5kIG91dCBob3cgbWFueSBDRC1ST00gZHJpdmVzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIHN5c3RlbSAqLworCWlmICggU0RMX0NETnVtRHJpdmVzKCkgPT0gMCApIHsKKwkJcHJpbnRmKCJObyBDRC1ST00gZGV2aWNlcyBkZXRlY3RlZFxuIik7CisJCXF1aXQoMCk7CisJfQorCXByaW50ZigiRHJpdmVzIGF2YWlsYWJsZTogJWRcbiIsIFNETF9DRE51bURyaXZlcygpKTsKKwlmb3IgKCBpPTA7IGk8U0RMX0NETnVtRHJpdmVzKCk7ICsraSApIHsKKwkJcHJpbnRmKCJEcml2ZSAlZDogIFwiJXNcIlxuIiwgaSwgU0RMX0NETmFtZShpKSk7CisJfQorCisJLyogT3BlbiB0aGUgQ0QtUk9NICovCisJZHJpdmUgPSAwOworCWk9MTsKKwlpZiAoIGFyZ3ZbaV0gJiYgaXNkaWdpdChhcmd2W2ldWzBdKSApIHsKKwkJZHJpdmUgPSBhdG9pKGFyZ3ZbaSsrXSk7CisJfQorCWNkcm9tID0gU0RMX0NET3Blbihkcml2ZSk7CisJaWYgKCBjZHJvbSA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IG9wZW4gZHJpdmUgJWQ6ICVzXG4iLCBkcml2ZSwKKwkJCQkJCQlTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMik7CisJfQorI2lmZGVmIFRFU1RfTlVMTENECisJY2Ryb20gPSBOVUxMOworI2VuZGlmCisJCisJLyogRmluZCBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gcGVyZm9ybSAqLworCWZvciAoIDsgYXJndltpXTsgKytpICkgeworCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLXN0YXR1cyIpID09IDAgKSB7CisJCQkvKiBQcmludFN0YXR1cyhkcml2ZSwgY2Ryb20pOyAqLworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndltpXSwgIi1saXN0IikgPT0gMCApIHsKKwkJCUxpc3RUcmFja3MoY2Ryb20pOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndltpXSwgIi1wbGF5IikgPT0gMCApIHsKKwkJCWludCBzdHJhY2ssIHNmcmFtZTsKKwkJCWludCBudHJhY2ssIG5mcmFtZTsKKworCQkJc3RyYWNrID0gMDsKKwkJCWlmICggYXJndltpKzFdICYmIGlzZGlnaXQoYXJndltpKzFdWzBdKSApIHsKKwkJCQlzdHJhY2sgPSBhdG9pKGFyZ3ZbKytpXSk7CisJCQl9CisJCQlzZnJhbWUgPSAwOworCQkJaWYgKCBhcmd2W2krMV0gJiYgaXNkaWdpdChhcmd2W2krMV1bMF0pICkgeworCQkJCXNmcmFtZSA9IGF0b2koYXJndlsrK2ldKTsKKwkJCX0KKwkJCW50cmFjayA9IDA7CisJCQlpZiAoIGFyZ3ZbaSsxXSAmJiBpc2RpZ2l0KGFyZ3ZbaSsxXVswXSkgKSB7CisJCQkJbnRyYWNrID0gYXRvaShhcmd2WysraV0pOworCQkJfQorCQkJbmZyYW1lID0gMDsKKwkJCWlmICggYXJndltpKzFdICYmIGlzZGlnaXQoYXJndltpKzFdWzBdKSApIHsKKwkJCQluZnJhbWUgPSBhdG9pKGFyZ3ZbKytpXSk7CisJCQl9CisJCQlpZiAoIENEX0lORFJJVkUoU0RMX0NEU3RhdHVzKGNkcm9tKSkgKSB7CisJCQkJaWYgKCBTRExfQ0RQbGF5VHJhY2tzKGNkcm9tLCBzdHJhY2ssIHNmcmFtZSwKKwkJCQkJCQludHJhY2ssIG5mcmFtZSkgPCAwICkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJDb3VsZG4ndCBwbGF5IHRyYWNrcyAlZC8lZCBmb3IgJWQvJWQ6ICVzXG4iLAorCQkJCXN0cmFjaywgc2ZyYW1lLCBudHJhY2ssIG5mcmFtZSwgU0RMX0dldEVycm9yKCkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJObyBDRCBpbiBkcml2ZSFcbiIpOworCQkJfQorCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndltpXSwgIi1wYXVzZSIpID09IDAgKSB7CisJCQlpZiAoIFNETF9DRFBhdXNlKGNkcm9tKSA8IDAgKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBwYXVzZSBDRDogJXNcbiIsCisJCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJCX0KKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItcmVzdW1lIikgPT0gMCApIHsKKwkJCWlmICggU0RMX0NEUmVzdW1lKGNkcm9tKSA8IDAgKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCByZXN1bWUgQ0Q6ICVzXG4iLAorCQkJCQkJCQlTRExfR2V0RXJyb3IoKSk7CisJCQl9CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLXN0b3AiKSA9PSAwICkgeworCQkJaWYgKCBTRExfQ0RTdG9wKGNkcm9tKSA8IDAgKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBlamVjdCBDRDogJXNcbiIsCisJCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJCX0KKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItZWplY3QiKSA9PSAwICkgeworCQkJaWYgKCBTRExfQ0RFamVjdChjZHJvbSkgPCAwICkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgZWplY3QgQ0Q6ICVzXG4iLAorCQkJCQkJCQlTRExfR2V0RXJyb3IoKSk7CisJCQl9CisJCX0gZWxzZQorCQlpZiAoIChzdHJjbXAoYXJndltpXSwgIi1zbGVlcCIpID09IDApICYmCisJCQkJKGFyZ3ZbaSsxXSAmJiBpc2RpZ2l0KGFyZ3ZbaSsxXVswXSkpICkgeworCQkJU0RMX0RlbGF5KGF0b2koYXJndlsrK2ldKSk7CisJCQlwcmludGYoIkRlbGF5ZWQgJWQgbWlsbGlzZWNvbmRzXG4iLCBhdG9pKGFyZ3ZbaV0pKTsKKwkJfSBlbHNlIHsKKwkJCVByaW50VXNhZ2UoYXJndlswXSk7CisJCQlTRExfQ0RDbG9zZShjZHJvbSk7CisJCQlxdWl0KDEpOworCQl9CisJfQorCVByaW50U3RhdHVzKGRyaXZlLCBjZHJvbSk7CisJU0RMX0NEQ2xvc2UoY2Ryb20pOworCVNETF9RdWl0KCk7CisKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0Y3Vyc29yLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0Y3Vyc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwZTBhNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RjdXJzb3IuYwpAQCAtMCwwICsxLDIxNiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworLyogVGhpcyBpcyBhbiBleGFtcGxlIDE2eDE2IGN1cnNvcgorCXRvcCBsZWZ0IDoJYmxhY2sKKwl0b3AgcmlnaHQgOiBpbnZlcnRlZCBjb2xvciBvciBibGFjaworCWJvdHRvbSBsZWZ0OiB3aGl0ZQorCWJvdHRvbSByaWdodDogdHJhbnNwYXJlbnQKKwkoc3dhcCBsZWZ0IGFuZCByaWdodCBmb3IgZGlmZmVyZW50IGVuZGlhbm5lc3MpCisqLworCitVaW50MTYgY3Vyc29yX2RhdGFbMTZdPXsKKwkweGZmZmYsCisJMHhmZmZmLAorCTB4ZmZmZiwKKwkweGZmZmYsCQorCisJMHhmZmZmLAorCTB4ZmZmZiwKKwkweGZmZmYsCisJMHhmZmZmLAkKKworCTB4MDAwMCwKKwkweDAwMDAsCisJMHgwMDAwLAorCTB4MDAwMCwKKworCTB4MDAwMCwKKwkweDAwMDAsCisJMHgwMDAwLAorCTB4MDAwMAorfTsKKworVWludDE2IGN1cnNvcl9tYXNrWzE2XT17CisJMHhmZjAwLAorCTB4ZmYwMCwKKwkweGZmMDAsCisJMHhmZjAwLAorCisJMHhmZjAwLAorCTB4ZmYwMCwKKwkweGZmMDAsCisJMHhmZjAwLAorCisJMHhmZjAwLAorCTB4ZmYwMCwKKwkweGZmMDAsCisJMHhmZjAwLAorCisJMHhmZjAwLAorCTB4ZmYwMCwKKwkweGZmMDAsCisJMHhmZjAwCit9OworCisvKiBhbm90aGVyIHRlc3QgY3Vyc29yOiBzbWFsbGVyIHRoYW4gMTZ4MTYsIGFuZCB3aXRoIGFuIG9kZCBoZWlnaHQgKi8KKworVWludDggc21hbGxfY3Vyc29yX2RhdGFbMTFdID0geyAweDAwLCAweDE4LCAweDA4LCAweDM4LCAweDQ0LCAweDU0LCAweDQ0LCAweDM4LCAweDIwLCAweDIwLCAweDAwIH07CitVaW50OCBzbWFsbF9jdXJzb3JfbWFza1sxMV0gPSB7IDB4M0MsIDB4M0MsIDB4M0MsIDB4N0MsIDB4QzYsIDB4QzYsIDB4QzYsIDB4N0MsIDB4NzgsIDB4NzAsIDB4NzAgfTsKKworLyogWFBNICovCitzdGF0aWMgY29uc3QgY2hhciAqYXJyb3dbXSA9IHsKKyAgLyogd2lkdGggaGVpZ2h0IG51bV9jb2xvcnMgY2hhcnNfcGVyX3BpeGVsICovCisgICIgICAgMzIgICAgMzIgICAgICAgIDMgICAgICAgICAgICAxIiwKKyAgLyogY29sb3JzICovCisgICJYIGMgIzAwMDAwMCIsCisgICIuIGMgI2ZmZmZmZiIsCisgICIgIGMgTm9uZSIsCisgIC8qIHBpeGVscyAqLworICAiWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC5YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC4uWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC4uLlggICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC4uLi5YICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC4uLi4uWCAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC4uLi4uLlggICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC4uLi4uLi5YICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC4uLi4uLi4uWCAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC4uLi4uWFhYWFggICAgICAgICAgICAgICAgICAgICAiLAorICAiWC4uWC4uWCAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWC5YIFguLlggICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWFggIFguLlggICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiWCAgICBYLi5YICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICBYLi5YICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgWC4uWCAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgWC4uWCAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgIFhYICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorICAiMCwwIgorfTsKKworc3RhdGljIFNETF9DdXJzb3IgKmNyZWF0ZV9hcnJvd19jdXJzb3IoKQoreworICBpbnQgaSwgcm93LCBjb2w7CisgIFVpbnQ4IGRhdGFbNCozMl07CisgIFVpbnQ4IG1hc2tbNCozMl07CisgIGludCBob3RfeCwgaG90X3k7CisKKyAgaSA9IC0xOworICBmb3IgKCByb3c9MDsgcm93PDMyOyArK3JvdyApIHsKKyAgICBmb3IgKCBjb2w9MDsgY29sPDMyOyArK2NvbCApIHsKKyAgICAgIGlmICggY29sICUgOCApIHsKKyAgICAgICAgZGF0YVtpXSA8PD0gMTsKKyAgICAgICAgbWFza1tpXSA8PD0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICsraTsKKyAgICAgICAgZGF0YVtpXSA9IG1hc2tbaV0gPSAwOworICAgICAgfQorICAgICAgc3dpdGNoIChhcnJvd1s0K3Jvd11bY29sXSkgeworICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICBkYXRhW2ldIHw9IDB4MDE7CisgICAgICAgICAgbWFza1tpXSB8PSAweDAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICBtYXNrW2ldIHw9IDB4MDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBzc2NhbmYoYXJyb3dbNCtyb3ddLCAiJWQsJWQiLCAmaG90X3gsICZob3RfeSk7CisgIHJldHVybiBTRExfQ3JlYXRlQ3Vyc29yKGRhdGEsIG1hc2ssIDMyLCAzMiwgaG90X3gsIGhvdF95KTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCVNETF9TdXJmYWNlICpzY3JlZW47CisJU0RMX2Jvb2wgcXVpdCA9IFNETF9GQUxTRSwgZmlyc3RfdGltZSA9IFNETF9UUlVFOworCVNETF9DdXJzb3IgKmN1cnNvclszXTsKKwlpbnQgY3VycmVudDsKKworCS8qIExvYWQgdGhlIFNETCBsaWJyYXJ5ICovCisJaWYgKCBTRExfSW5pdChTRExfSU5JVF9WSURFTykgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwlzY3JlZW4gPSBTRExfU2V0VmlkZW9Nb2RlKDMyMCwyMDAsOCxTRExfQU5ZRk9STUFUKTsKKwlpZiAoc2NyZWVuPT1OVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSB2aWRlbyBtb2RlOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwlTRExfRmlsbFJlY3Qoc2NyZWVuLCBOVUxMLCAweDY2NDQyMik7CisKKwljdXJzb3JbMF0gPSBTRExfQ3JlYXRlQ3Vyc29yKChVaW50OCAqKWN1cnNvcl9kYXRhLCAoVWludDggKiljdXJzb3JfbWFzaywKKwkJMTYsIDE2LCA4LCA4KTsKKwlpZiAoY3Vyc29yWzBdPT1OVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSB0ZXN0IGN1cnNvcjogJXNcbiIsU0RMX0dldEVycm9yKCkpOworCQlTRExfUXVpdCgpOworCQlyZXR1cm4oMSk7CisJfQorCWN1cnNvclsxXSA9IGNyZWF0ZV9hcnJvd19jdXJzb3IoKTsKKwlpZiAoY3Vyc29yWzFdPT1OVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBhcnJvdyBjdXJzb3I6ICVzXG4iLFNETF9HZXRFcnJvcigpKTsKKwkJU0RMX0ZyZWVDdXJzb3IoY3Vyc29yWzBdKTsKKwkJU0RMX1F1aXQoKTsKKwkJcmV0dXJuKDEpOworCX0KKwljdXJzb3JbMl0gPSBTRExfQ3JlYXRlQ3Vyc29yKHNtYWxsX2N1cnNvcl9kYXRhLCBzbWFsbF9jdXJzb3JfbWFzaywKKwkJOCwgMTEsIDMsIDUpOworCWlmIChjdXJzb3JbMl09PU5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBpbml0aWFsaXplIHRlc3QgY3Vyc29yOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCVNETF9RdWl0KCk7CisJCXJldHVybigxKTsKKwl9CisKKwljdXJyZW50ID0gMDsKKwlTRExfU2V0Q3Vyc29yKGN1cnNvcltjdXJyZW50XSk7CisKKwl3aGlsZSAoIXF1aXQpIHsKKwkJU0RMX0V2ZW50CWV2ZW50OworCQl3aGlsZSAoU0RMX1BvbGxFdmVudCgmZXZlbnQpKSB7CisJCQlzd2l0Y2goZXZlbnQudHlwZSkgeworCQkJCWNhc2UgU0RMX01PVVNFQlVUVE9ORE9XTjoKKwkJCQkJY3VycmVudCA9IChjdXJyZW50ICsgMSklMzsKKwkJCQkJU0RMX1NldEN1cnNvcihjdXJzb3JbY3VycmVudF0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9LRVlET1dOOgorCQkJCQlpZiAoZXZlbnQua2V5LmtleXN5bS5zeW0gPT0gU0RMS19FU0NBUEUpIHsKKwkJCQkJCXF1aXQgPSBTRExfVFJVRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNETF9RVUlUOgorCQkJCQlxdWl0ID0gU0RMX1RSVUU7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CQorCQlTRExfRmxpcChzY3JlZW4pOworCQlTRExfRGVsYXkoMSk7CisJfQorCisJU0RMX0ZyZWVDdXJzb3IoY3Vyc29yWzBdKTsKKwlTRExfRnJlZUN1cnNvcihjdXJzb3JbMV0pOworCVNETF9GcmVlQ3Vyc29yKGN1cnNvclsyXSk7CisKKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RkeW5nbC5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGR5bmdsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwYmQxYQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RkeW5nbC5jCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogU21hbGwgU0RMIGV4YW1wbGUgdG8gZGVtb25zdHJhdGUgZHluYW1pY2FsbHkgbG9hZGluZyAKKyAqIE9wZW5HTCBsaWIgYW5kIGZ1bmN0aW9ucworICoKKyAqIChGWUkgaXQgd2FzIHN1cHBvc2VkIHRvIGxvb2sgbGlrZSBzbm93IGluIHRoZSB3aW5kIG9yIHNvbWV0aGluZy4uLikKKyAqCisgKiBDb21waWxlIHdpdGggOgorICogZ2NjIHRlc3RkeW5nbC5jIGBzZGwtY29uZmlnIC0tbGlicyAtLWNmbGFnc2AgLW8gdGVzdGR5bmdsIC1ESEFWRV9PUEVOR0wKKyAqCisgKiBZb3UgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQgT3BlbkdMIGxpYiBvbiB0aGUgY29tbWFuZCBsaW5lLCBpLmUuIDoKKyAqIC4vdGVzdGR5bmdsICAvdXNyL1gxMVI2L2xpYi9saWJHTC5zby4xLjIKKyAqIG9yCisgKiAuL3Rlc3RkeW5nbCAgL3Vzci9saWIvbGliR0wuc28uMS4wLjQ0OTYKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworI2lmZGVmIF9fTUFDT1NfXworI2RlZmluZSBIQVZFX09QRU5HTAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX09QRU5HTAorCisjaW5jbHVkZSAiU0RMX29wZW5nbC5oIgorCisvKiBDYWxsIHRoaXMgaW5zdGVhZCBvZiBleGl0KCksIHNvIHdlIGNhbiBjbGVhbiB1cCBTREw6IGF0ZXhpdCgpIGlzIGV2aWwuICovCitzdGF0aWMgdm9pZCBxdWl0KGludCByYykKK3sKKwlTRExfUXVpdCgpOworCWV4aXQocmMpOworfQorCit2b2lkKiBnZXRfZnVuY2FkZHIoY29uc3QgY2hhciogcCkKK3sKKwl2b2lkKiBmPVNETF9HTF9HZXRQcm9jQWRkcmVzcyhwKTsKKwlpZiAoZikKKwl7CisJCXJldHVybiBmOworCX0KKwllbHNlCisJeworCQlwcmludGYoIlVuYWJsZSB0byBnZXQgZnVuY3Rpb24gcG9pbnRlciBmb3IgJXNcbiIscCk7CisJCXF1aXQoMSk7CisJfQorCXJldHVybiBOVUxMOworfQorCit0eXBlZGVmIHN0cnVjdAoreworCXZvaWQoQVBJRU5UUlkqZ2xCZWdpbikoR0xlbnVtKTsKKwl2b2lkKEFQSUVOVFJZKmdsRW5kKSgpOworCXZvaWQoQVBJRU5UUlkqZ2xWZXJ0ZXgzZikoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CisJdm9pZChBUElFTlRSWSpnbENsZWFyQ29sb3IpKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworCXZvaWQoQVBJRU5UUlkqZ2xDbGVhcikoR0xiaXRmaWVsZCk7CisJdm9pZChBUElFTlRSWSpnbERpc2FibGUpKEdMZW51bSk7CisJdm9pZChBUElFTlRSWSpnbEVuYWJsZSkoR0xlbnVtKTsKKwl2b2lkKEFQSUVOVFJZKmdsQ29sb3I0dWIpKEdMdWJ5dGUsR0x1Ynl0ZSxHTHVieXRlLEdMdWJ5dGUpOworCXZvaWQoQVBJRU5UUlkqZ2xQb2ludFNpemUpKEdMZmxvYXQpOworCXZvaWQoQVBJRU5UUlkqZ2xIaW50KShHTGVudW0sR0xlbnVtKTsKKwl2b2lkKEFQSUVOVFJZKmdsQmxlbmRGdW5jKShHTGVudW0sR0xlbnVtKTsKKwl2b2lkKEFQSUVOVFJZKmdsTWF0cml4TW9kZSkoR0xlbnVtKTsKKwl2b2lkKEFQSUVOVFJZKmdsTG9hZElkZW50aXR5KSgpOworCXZvaWQoQVBJRU5UUlkqZ2xPcnRobykoR0xkb3VibGUsR0xkb3VibGUsR0xkb3VibGUsR0xkb3VibGUsR0xkb3VibGUsR0xkb3VibGUpOworCXZvaWQoQVBJRU5UUlkqZ2xSb3RhdGVmKShHTGZsb2F0LEdMZmxvYXQsR0xmbG9hdCxHTGZsb2F0KTsKKwl2b2lkKEFQSUVOVFJZKmdsVmlld3BvcnQpKEdMaW50LEdMaW50LEdMc2l6ZWksR0xzaXplaSk7CisJdm9pZChBUElFTlRSWSpnbEZvZ2YpKEdMZW51bSxHTGZsb2F0KTsKK30KK2dsZnVuY3M7CisKK3ZvaWQgaW5pdF9nbGZ1bmNzKGdsZnVuY3MqIGYpCit7CisJZi0+Z2xCZWdpbj1nZXRfZnVuY2FkZHIoImdsQmVnaW4iKTsKKwlmLT5nbEVuZD1nZXRfZnVuY2FkZHIoImdsRW5kIik7CisJZi0+Z2xWZXJ0ZXgzZj1nZXRfZnVuY2FkZHIoImdsVmVydGV4M2YiKTsKKwlmLT5nbENsZWFyQ29sb3I9Z2V0X2Z1bmNhZGRyKCJnbENsZWFyQ29sb3IiKTsKKwlmLT5nbENsZWFyPWdldF9mdW5jYWRkcigiZ2xDbGVhciIpOworCWYtPmdsRGlzYWJsZT1nZXRfZnVuY2FkZHIoImdsRGlzYWJsZSIpOworCWYtPmdsRW5hYmxlPWdldF9mdW5jYWRkcigiZ2xFbmFibGUiKTsKKwlmLT5nbENvbG9yNHViPWdldF9mdW5jYWRkcigiZ2xDb2xvcjR1YiIpOworCWYtPmdsUG9pbnRTaXplPWdldF9mdW5jYWRkcigiZ2xQb2ludFNpemUiKTsKKwlmLT5nbEhpbnQ9Z2V0X2Z1bmNhZGRyKCJnbEhpbnQiKTsKKwlmLT5nbEJsZW5kRnVuYz1nZXRfZnVuY2FkZHIoImdsQmxlbmRGdW5jIik7CisJZi0+Z2xNYXRyaXhNb2RlPWdldF9mdW5jYWRkcigiZ2xNYXRyaXhNb2RlIik7CisJZi0+Z2xMb2FkSWRlbnRpdHk9Z2V0X2Z1bmNhZGRyKCJnbExvYWRJZGVudGl0eSIpOworCWYtPmdsT3J0aG89Z2V0X2Z1bmNhZGRyKCJnbE9ydGhvIik7CisJZi0+Z2xSb3RhdGVmPWdldF9mdW5jYWRkcigiZ2xSb3RhdGVmIik7CisJZi0+Z2xWaWV3cG9ydD1nZXRfZnVuY2FkZHIoImdsVmlld3BvcnQiKTsKKwlmLT5nbEZvZ2Y9Z2V0X2Z1bmNhZGRyKCJnbEZvZ2YiKTsKK30KKworI2RlZmluZSBOQl9QSVhFTFMgMTAwMAorCitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCit7CisJZ2xmdW5jcyBmOworCWludCBpOworCVNETF9FdmVudCBldmVudDsKKwlpbnQgZG9uZT0wOworCUdMZmxvYXQgcGl4ZWxzW05CX1BJWEVMUyozXTsKKwljb25zdCBjaGFyICpnbF9saWJyYXJ5ID0gTlVMTDsgLyogVXNlIHRoZSBkZWZhdWx0IEdMIGxpYnJhcnkgKi8KKworCWlmIChhcmd2WzFdKSB7CisJCWdsX2xpYnJhcnkgPSBhcmd2WzFdOworCX0KKwkKKwlpZiAoU0RMX0luaXQoU0RMX0lOSVRfVklERU8pPDApCisJeworCQlwcmludGYoIlVuYWJsZSB0byBpbml0IFNETCA6ICVzXG4iLFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuKDEpOworCX0KKworCWlmIChTRExfR0xfU2V0QXR0cmlidXRlKFNETF9HTF9ET1VCTEVCVUZGRVIsMSk8MCkKKwl7CisJCXByaW50ZigiVW5hYmxlIHRvIHNldCBHTCBhdHRyaWJ1dGUgOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMSk7CisJfQorCQorCWlmIChTRExfR0xfTG9hZExpYnJhcnkoZ2xfbGlicmFyeSk8MCkKKwl7CisJCXByaW50ZigiVW5hYmxlIHRvIGR5bmFtaWNhbGx5IG9wZW4gR0wgbGliIDogJXNcbiIsU0RMX0dldEVycm9yKCkpOworCQlxdWl0KDEpOworCX0KKworCWlmIChTRExfU2V0VmlkZW9Nb2RlKDY0MCw0ODAsMCxTRExfT1BFTkdMKT09TlVMTCkKKwl7CisJCXByaW50ZigiVW5hYmxlIHRvIG9wZW4gdmlkZW8gbW9kZSA6ICVzXG4iLFNETF9HZXRFcnJvcigpKTsKKwkJcXVpdCgxKTsKKwl9CisKKwkvKiBTZXQgdGhlIHdpbmRvdyBtYW5hZ2VyIHRpdGxlIGJhciAqLworCVNETF9XTV9TZXRDYXB0aW9uKCAiU0RMIER5bmFtaWMgT3BlbkdMIExvYWRpbmcgVGVzdCIsICJ0ZXN0ZHluZ2wiICk7CisKKwlpbml0X2dsZnVuY3MoJmYpOworCisJZm9yKGk9MDtpPE5CX1BJWEVMUztpKyspCisJeworCQlwaXhlbHNbMyppXT1yYW5kKCklMjUwLTEyNTsKKwkJcGl4ZWxzWzMqaSsxXT1yYW5kKCklMjUwLTEyNTsKKwkJcGl4ZWxzWzMqaSsyXT1yYW5kKCklMjUwLTEyNTsKKwl9CisJCisJZi5nbFZpZXdwb3J0KDAsMCw2NDAsNDgwKTsKKwkKKwlmLmdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKwlmLmdsTG9hZElkZW50aXR5KCk7CisJZi5nbE9ydGhvKC0xMDAsMTAwLC0xMDAsMTAwLC01MDAsNTAwKTsKKwkKKwlmLmdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCWYuZ2xMb2FkSWRlbnRpdHkoKTsKKwkKKwlmLmdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworCWYuZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOworCWYuZ2xFbmFibGUoR0xfQkxFTkQpOworCWYuZ2xCbGVuZEZ1bmMoR0xfU1JDX0FMUEhBLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKwkKKwlmLmdsQ2xlYXJDb2xvcigwLjBmLDAuMGYsMC4wZiwwLjBmKTsKKwlmLmdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVHxHTF9ERVBUSF9CVUZGRVJfQklUKTsKKwkKKwlmLmdsRW5hYmxlKEdMX1BPSU5UX1NNT09USCk7CisJZi5nbEhpbnQoR0xfUE9JTlRfU01PT1RIX0hJTlQsR0xfTklDRVNUKTsKKwlmLmdsUG9pbnRTaXplKDUuMGYpOworCWYuZ2xFbmFibGUoR0xfRk9HKTsKKwlmLmdsRm9nZihHTF9GT0dfU1RBUlQsLTUwMCk7CisJZi5nbEZvZ2YoR0xfRk9HX0VORCw1MDApOworCWYuZ2xGb2dmKEdMX0ZPR19ERU5TSVRZLDAuMDA1KTsKKwkKKwlkbworCXsKKwkJZi5nbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVR8R0xfREVQVEhfQlVGRkVSX0JJVCk7CisJCQorCQlmLmdsUm90YXRlZigyLjAsMS4wLDEuMCwxLjApOworCQlmLmdsUm90YXRlZigxLjAsMC4wLDEuMCwxLjApOworCQkKKwkJZi5nbENvbG9yNHViKDI1NSwyNTUsMjU1LDI1NSk7CisJCWYuZ2xCZWdpbihHTF9QT0lOVFMpOworCQlmb3IoaT0wO2k8TkJfUElYRUxTO2krKykKKwkJeworCQkJZi5nbFZlcnRleDNmKHBpeGVsc1szKmldLHBpeGVsc1szKmkrMV0scGl4ZWxzWzMqaSsyXSk7CisJCX0KKwkJZi5nbEVuZCgpOworCQlTRExfR0xfU3dhcEJ1ZmZlcnMoKTsKKworCQl3aGlsZShTRExfUG9sbEV2ZW50KCZldmVudCkpCisJCXsKKwkJCWlmKGV2ZW50LnR5cGUgJiBTRExfS0VZRE9XTikKKwkJCQlkb25lPTE7CisJCX0KKworCQlTRExfRGVsYXkoMjApOworCX0KKwl3aGlsZSghZG9uZSk7CisJCisJU0RMX1F1aXQoKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UgLyogSEFWRV9PUEVOR0wgKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlwcmludGYoIk5vIE9wZW5HTCBzdXBwb3J0IG9uIHRoaXMgc3lzdGVtXG4iKTsKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIEhBVkVfT1BFTkdMICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0ZXJyb3IuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RlcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTFkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0ZXJyb3IuYwpAQCAtMCwwICsxLDYxIEBACisKKy8qIFNpbXBsZSB0ZXN0IG9mIHRoZSBTREwgdGhyZWFkaW5nIGNvZGUgYW5kIGVycm9yIGhhbmRsaW5nICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorCitzdGF0aWMgaW50IGFsaXZlID0gMDsKKworLyogQ2FsbCB0aGlzIGluc3RlYWQgb2YgZXhpdCgpLCBzbyB3ZSBjYW4gY2xlYW4gdXAgU0RMOiBhdGV4aXQoKSBpcyBldmlsLiAqLworc3RhdGljIHZvaWQgcXVpdChpbnQgcmMpCit7CisJU0RMX1F1aXQoKTsKKwlleGl0KHJjKTsKK30KKworaW50IFNETENBTEwgVGhyZWFkRnVuYyh2b2lkICpkYXRhKQoreworCS8qIFNldCB0aGUgY2hpbGQgdGhyZWFkIGVycm9yIHN0cmluZyAqLworCVNETF9TZXRFcnJvcigiVGhyZWFkICVzICglZCkgaGFkIGEgcHJvYmxlbTogJXMiLAorCQkJKGNoYXIgKilkYXRhLCBTRExfVGhyZWFkSUQoKSwgIm5ldmVybWluZCIpOworCXdoaWxlICggYWxpdmUgKSB7CisJCXByaW50ZigiVGhyZWFkICclcycgaXMgYWxpdmUhXG4iLCAoY2hhciAqKWRhdGEpOworCQlTRExfRGVsYXkoMSoxMDAwKTsKKwl9CisJcHJpbnRmKCJDaGlsZCB0aHJlYWQgZXJyb3Igc3RyaW5nOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCXJldHVybigwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlTRExfVGhyZWFkICp0aHJlYWQ7CisKKwkvKiBMb2FkIHRoZSBTREwgbGlicmFyeSAqLworCWlmICggU0RMX0luaXQoMCkgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBTZXQgdGhlIGVycm9yIHZhbHVlIGZvciB0aGUgbWFpbiB0aHJlYWQgKi8KKwlTRExfU2V0RXJyb3IoIk5vIHdvcnJpZXMiKTsKKworCWFsaXZlID0gMTsKKwl0aHJlYWQgPSBTRExfQ3JlYXRlVGhyZWFkKFRocmVhZEZ1bmMsICIjMSIpOworCWlmICggdGhyZWFkID09IE5VTEwgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgY3JlYXRlIHRocmVhZDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJcXVpdCgxKTsKKwl9CisJU0RMX0RlbGF5KDUqMTAwMCk7CisJcHJpbnRmKCJXYWl0aW5nIGZvciB0aHJlYWQgIzFcbiIpOworCWFsaXZlID0gMDsKKwlTRExfV2FpdFRocmVhZCh0aHJlYWQsIE5VTEwpOworCisJcHJpbnRmKCJNYWluIHRocmVhZCBlcnJvciBzdHJpbmc6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisKKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RmaWxlLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0ZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWJiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0ZmlsZS5jCkBAIC0wLDAgKzEsMTgyIEBACisKKy8qIHNhbml0eSB0ZXN0cyBvbiBTRExfcndvcHMuYyAodXNlZnVsbCBmb3IgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zIG9mIHN0ZGlvIHJ3b3BzKSAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX2VuZGlhbi5oIgorCisKKyNpbmNsdWRlIDxzdGRpby5oPgkKKworLyogV0FSTklORyAhIHRob3NlIDIgZmlsZXMgd2lsbCBiZSBkZXN0cm95ZWQgYnkgdGhpcyB0ZXN0IHByb2dyYW0gKi8KKyNkZWZpbmUgRkJBU0VOQU1FMQkic2RsZGF0YTEiCQkvKiB0aGlzIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGR1cmluZyB0ZXN0cyAqLworI2RlZmluZSBGQkFTRU5BTUUyCSJzZGxkYXRhMiIJCS8qIHRoaXMgZmlsZSBzaG91bGQgbm90IGV4aXN0cyBiZWZvcmUgc3RhcnRpbmcgdGVzdCAqLworCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYgCisKK3N0YXRpYyB2b2lkIGNsZWFudXAoIHZvaWQgKSB7CisKKwl1bmxpbmsoRkJBU0VOQU1FMSk7CisJdW5saW5rKEZCQVNFTkFNRTIpOyAKK30KKworc3RhdGljIHZvaWQgcndvcHNfZXJyb3JfcXVpdCggdW5zaWduZWQgbGluZSwgU0RMX1JXb3BzICpyd29wcykgeworCQorCXByaW50ZigidGVzdGZpbGUuYyglZCk6IGZhaWxlZFxuIixsaW5lKTsKKwlpZiAocndvcHMpIHsKKwkJcndvcHMtPmNsb3NlKHJ3b3BzKTsgLyogVGhpcyBjYWxscyBTRExfRnJlZVJXKHJ3b3BzKTsgKi8KKwl9CisJY2xlYW51cCgpOworCWV4aXQoMSk7IC8qIHF1aXQgd2l0aCByd29wcyBlcnJvciAodGVzdCBmYWlsZWQpICovCit9CisKKyNkZWZpbmUgUldPUF9FUlJfUVVJVCh4KQlyd29wc19lcnJvcl9xdWl0KCBfX0xJTkVfXywgKHgpICkKKworCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJU0RMX1JXb3BzICpyd29wcyA9IE5VTEw7CisJY2hhciB0ZXN0X2J1ZlszMF07CisJCisJY2xlYW51cCgpOworCisvKiB0ZXN0IDEgOiBiYXNpYyBhcmd1bWVudCB0ZXN0OiBhbGwgdGhvc2UgY2FsbHMgdG8gU0RMX1JXRnJvbUZpbGUgc2hvdWxkIGZhaWwgKi8KKwkKKwlyd29wcyA9IFNETF9SV0Zyb21GaWxlKE5VTEwsTlVMTCk7CisJaWYgKHJ3b3BzKSBSV09QX0VSUl9RVUlUKHJ3b3BzKTsKKwlyd29wcyA9IFNETF9SV0Zyb21GaWxlKE5VTEwsImFiKyIpOworCWlmIChyd29wcykgUldPUF9FUlJfUVVJVChyd29wcyk7CisJcndvcHMgPSBTRExfUldGcm9tRmlsZShOVUxMLCJzbGRma2pzbGRrZmoiKTsKKwlpZiAocndvcHMpIFJXT1BfRVJSX1FVSVQocndvcHMpOworCXJ3b3BzID0gU0RMX1JXRnJvbUZpbGUoInNvbWV0aGluZyIsIiIpOworCWlmIChyd29wcykgUldPUF9FUlJfUVVJVChyd29wcyk7CisJcndvcHMgPSBTRExfUldGcm9tRmlsZSgic29tZXRoaW5nIixOVUxMKTsKKwlpZiAocndvcHMpIFJXT1BfRVJSX1FVSVQocndvcHMpOwkKKwlwcmludGYoInRlc3QxIE9LXG4iKTsKKworLyogdGVzdCAyIDogY2hlY2sgdGhhdCBpbmV4aXN0YW50IGZpbGUgaXMgbm90IHN1Y2Nlc3NmdWxseSBvcGVuZWQvY3JlYXRlZCB3aGVuIHJlcXVpcmVkICovCisvKiBtb2RlcyA6IHIsIHIrIGltcGxpZSB0aGF0IGZpbGUgTVVTVCBleGlzdCAKKyAgIG1vZGVzIDogYSwgYSssIHcsIHcrIGNoZWNrcyB0aGF0IGl0IHN1Y2NlZWRzIChmaWxlIG1heSBub3QgZXhpc3RzKQorICAgCisgKi8KKwlyd29wcyA9IFNETF9SV0Zyb21GaWxlKEZCQVNFTkFNRTIsInJiIik7IC8qIHRoaXMgZmlsZSBkb2Vzbid0IGV4aXN0IHRoYXQgY2FsbCBtdXN0IGZhaWwgKi8KKwlpZiAocndvcHMpIFJXT1BfRVJSX1FVSVQocndvcHMpOworCXJ3b3BzID0gU0RMX1JXRnJvbUZpbGUoRkJBU0VOQU1FMiwicmIrIik7IC8qIHRoaXMgZmlsZSBkb2Vzbid0IGV4aXN0IHRoYXQgY2FsbCBtdXN0IGZhaWwgKi8KKwlpZiAocndvcHMpIFJXT1BfRVJSX1FVSVQocndvcHMpOworCXJ3b3BzID0gU0RMX1JXRnJvbUZpbGUoRkJBU0VOQU1FMiwid2IiKTsKKwlpZiAoIXJ3b3BzKSBSV09QX0VSUl9RVUlUKHJ3b3BzKTsgCisJcndvcHMtPmNsb3NlKHJ3b3BzKTsgdW5saW5rKEZCQVNFTkFNRTIpOworCXJ3b3BzID0gU0RMX1JXRnJvbUZpbGUoRkJBU0VOQU1FMiwid2IrIik7CisJaWYgKCFyd29wcykgUldPUF9FUlJfUVVJVChyd29wcyk7IAorCXJ3b3BzLT5jbG9zZShyd29wcyk7IHVubGluayhGQkFTRU5BTUUyKTsKKwlyd29wcyA9IFNETF9SV0Zyb21GaWxlKEZCQVNFTkFNRTIsImFiIik7IAorCWlmICghcndvcHMpIFJXT1BfRVJSX1FVSVQocndvcHMpOyAKKwlyd29wcy0+Y2xvc2UocndvcHMpOyB1bmxpbmsoRkJBU0VOQU1FMik7CisJcndvcHMgPSBTRExfUldGcm9tRmlsZShGQkFTRU5BTUUyLCJhYisiKTsKKwlpZiAoIXJ3b3BzKSBSV09QX0VSUl9RVUlUKHJ3b3BzKTsgCisJcndvcHMtPmNsb3NlKHJ3b3BzKTsgdW5saW5rKEZCQVNFTkFNRTIpOworCXByaW50ZigidGVzdDIgT0tcbiIpOworCisvKiB0ZXN0IDMgOiBjcmVhdGlvbiwgd3JpdGluZyAsIHJlYWRpbmcsIHNlZWtpbmcsIAorCSAgICAgICAgdGVzdCA6IHcgbW9kZSwgciBtb2RlLCB3KyBtb2RlCisgKi8KKwlyd29wcyA9IFNETF9SV0Zyb21GaWxlKEZCQVNFTkFNRTEsIndiIik7IC8qIHdyaXRlIG9ubHkgKi8JCisJaWYgKCFyd29wcykJCQkJCQkJCQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOworCWlmICgxICE9IHJ3b3BzLT53cml0ZShyd29wcywiMTIzNDU2Nzg5MCIsMTAsMSkgKQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQorCWlmICgxMCAhPSByd29wcy0+d3JpdGUocndvcHMsIjEyMzQ1Njc4OTAiLDEsMTApICkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoNyAhPSByd29wcy0+d3JpdGUocndvcHMsIjEyMzQ1NjciLDEsNykgKQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoMCE9cndvcHMtPnNlZWsocndvcHMsMEwsUldfU0VFS19TRVQpKQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCQkJCisJaWYgKDAhPXJ3b3BzLT5yZWFkKHJ3b3BzLHRlc3RfYnVmLDEsMSkpCQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOyAvKiB3ZSBhcmUgaW4gd3JpdGUgb25seSBtb2RlICovCisJcndvcHMtPmNsb3NlKHJ3b3BzKTsKKworCXJ3b3BzID0gU0RMX1JXRnJvbUZpbGUoRkJBU0VOQU1FMSwicmIiKTsgLyogcmVhZCBtb2RlLCBmaWxlIG11c3QgZXhpc3RzICovCisJaWYgKCFyd29wcykJCQkJCQkJCQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOworCWlmICgwIT1yd29wcy0+c2Vlayhyd29wcywwTCxSV19TRUVLX1NFVCkpCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkJCQkKKwlpZiAoMjAhPXJ3b3BzLT5zZWVrKHJ3b3BzLC03LFJXX1NFRUtfRU5EKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQkJCQorCWlmICg3IT1yd29wcy0+cmVhZChyd29wcyx0ZXN0X2J1ZiwxLDcpKQkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQorCWlmIChTRExfbWVtY21wKHRlc3RfYnVmLCIxMjM0NTY3Iiw3KSkJCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoMCE9cndvcHMtPnJlYWQocndvcHMsdGVzdF9idWYsMSwxKSkJCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoMCE9cndvcHMtPnJlYWQocndvcHMsdGVzdF9idWYsMTAsMTAwKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQorCWlmICgwIT1yd29wcy0+c2Vlayhyd29wcywtMjcsUldfU0VFS19DVVIpKQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDIhPXJ3b3BzLT5yZWFkKHJ3b3BzLHRlc3RfYnVmLDEwLDMpKQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCQkKKwlpZiAoU0RMX21lbWNtcCh0ZXN0X2J1ZiwiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLDIwKSkJUldPUF9FUlJfUVVJVChyd29wcyk7CisJaWYgKDAhPXJ3b3BzLT53cml0ZShyd29wcyx0ZXN0X2J1ZiwxLDEpKQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOyAvKiByZWFkb25seSBtb2RlICovCisJcndvcHMtPmNsb3NlKHJ3b3BzKTsKKworLyogdGVzdCAzOiBzYW1lIHdpdGggdysgbW9kZSAqLworCXJ3b3BzID0gU0RMX1JXRnJvbUZpbGUoRkJBU0VOQU1FMSwid2IrIik7IC8qIHdyaXRlICsgcmVhZCArIHRydW5jYXRpb24gKi8JCQorCWlmICghcndvcHMpCQkJCQkJCQkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsKKwlpZiAoMSAhPSByd29wcy0+d3JpdGUocndvcHMsIjEyMzQ1Njc4OTAiLDEwLDEpICkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoMTAgIT0gcndvcHMtPndyaXRlKHJ3b3BzLCIxMjM0NTY3ODkwIiwxLDEwKSApCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDcgIT0gcndvcHMtPndyaXRlKHJ3b3BzLCIxMjM0NTY3IiwxLDcpICkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDAhPXJ3b3BzLT5zZWVrKHJ3b3BzLDBMLFJXX1NFRUtfU0VUKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQkJCQorCWlmICgxIT1yd29wcy0+cmVhZChyd29wcyx0ZXN0X2J1ZiwxLDEpKQkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsgLyogd2UgYXJlIGluIHJlYWQvd3JpdGUgbW9kZSAqLworCWlmICgwIT1yd29wcy0+c2Vlayhyd29wcywwTCxSV19TRUVLX1NFVCkpCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkJCQkKKwlpZiAoMjAhPXJ3b3BzLT5zZWVrKHJ3b3BzLC03LFJXX1NFRUtfRU5EKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQkJCQorCWlmICg3IT1yd29wcy0+cmVhZChyd29wcyx0ZXN0X2J1ZiwxLDcpKQkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQorCWlmIChTRExfbWVtY21wKHRlc3RfYnVmLCIxMjM0NTY3Iiw3KSkJCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoMCE9cndvcHMtPnJlYWQocndvcHMsdGVzdF9idWYsMSwxKSkJCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoMCE9cndvcHMtPnJlYWQocndvcHMsdGVzdF9idWYsMTAsMTAwKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQorCWlmICgwIT1yd29wcy0+c2Vlayhyd29wcywtMjcsUldfU0VFS19DVVIpKQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDIhPXJ3b3BzLT5yZWFkKHJ3b3BzLHRlc3RfYnVmLDEwLDMpKQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCQkKKwlpZiAoU0RMX21lbWNtcCh0ZXN0X2J1ZiwiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLDIwKSkJUldPUF9FUlJfUVVJVChyd29wcyk7CisJcndvcHMtPmNsb3NlKHJ3b3BzKTsKKwlwcmludGYoInRlc3QzIE9LXG4iKTsKKworLyogdGVzdCA0OiBzYW1lIGluIHIrIG1vZGUgKi8KKwlyd29wcyA9IFNETF9SV0Zyb21GaWxlKEZCQVNFTkFNRTEsInJiKyIpOyAvKiB3cml0ZSArIHJlYWQgKyBmaWxlIG11c3QgZXhpc3RzLCBubyB0cnVuY2F0aW9uICovCQkKKwlpZiAoIXJ3b3BzKQkJCQkJCQkJCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CisJaWYgKDEgIT0gcndvcHMtPndyaXRlKHJ3b3BzLCIxMjM0NTY3ODkwIiwxMCwxKSApCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDEwICE9IHJ3b3BzLT53cml0ZShyd29wcywiMTIzNDU2Nzg5MCIsMSwxMCkgKQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQorCWlmICg3ICE9IHJ3b3BzLT53cml0ZShyd29wcywiMTIzNDU2NyIsMSw3KSApCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQorCWlmICgwIT1yd29wcy0+c2Vlayhyd29wcywwTCxSV19TRUVLX1NFVCkpCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkJCQkKKwlpZiAoMSE9cndvcHMtPnJlYWQocndvcHMsdGVzdF9idWYsMSwxKSkJCQkJUldPUF9FUlJfUVVJVChyd29wcyk7IC8qIHdlIGFyZSBpbiByZWFkL3dyaXRlIG1vZGUgKi8KKwlpZiAoMCE9cndvcHMtPnNlZWsocndvcHMsMEwsUldfU0VFS19TRVQpKQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCQkJCisJaWYgKDIwIT1yd29wcy0+c2Vlayhyd29wcywtNyxSV19TRUVLX0VORCkpCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkJCQkKKwlpZiAoNyE9cndvcHMtPnJlYWQocndvcHMsdGVzdF9idWYsMSw3KSkJCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoU0RMX21lbWNtcCh0ZXN0X2J1ZiwiMTIzNDU2NyIsNykpCQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDAhPXJ3b3BzLT5yZWFkKHJ3b3BzLHRlc3RfYnVmLDEsMSkpCQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDAhPXJ3b3BzLT5yZWFkKHJ3b3BzLHRlc3RfYnVmLDEwLDEwMCkpCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoMCE9cndvcHMtPnNlZWsocndvcHMsLTI3LFJXX1NFRUtfQ1VSKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQorCWlmICgyIT1yd29wcy0+cmVhZChyd29wcyx0ZXN0X2J1ZiwxMCwzKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQkJCisJaWYgKFNETF9tZW1jbXAodGVzdF9idWYsIjEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwyMCkpCVJXT1BfRVJSX1FVSVQocndvcHMpOworCXJ3b3BzLT5jbG9zZShyd29wcyk7CisJcHJpbnRmKCJ0ZXN0NCBPS1xuIik7CisKKy8qIHRlc3Q1IDogYXBwZW5kIG1vZGUgKi8KKwlyd29wcyA9IFNETF9SV0Zyb21GaWxlKEZCQVNFTkFNRTEsImFiKyIpOyAvKiB3cml0ZSArIHJlYWQgKyBhcHBlbmQgKi8JCQorCWlmICghcndvcHMpCQkJCQkJCQkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsKKwlpZiAoMSAhPSByd29wcy0+d3JpdGUocndvcHMsIjEyMzQ1Njc4OTAiLDEwLDEpICkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoMTAgIT0gcndvcHMtPndyaXRlKHJ3b3BzLCIxMjM0NTY3ODkwIiwxLDEwKSApCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDcgIT0gcndvcHMtPndyaXRlKHJ3b3BzLCIxMjM0NTY3IiwxLDcpICkJCVJXT1BfRVJSX1FVSVQocndvcHMpOyAJCisJaWYgKDAhPXJ3b3BzLT5zZWVrKHJ3b3BzLDBMLFJXX1NFRUtfU0VUKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQkJCQorCQorCWlmICgxIT1yd29wcy0+cmVhZChyd29wcyx0ZXN0X2J1ZiwxLDEpKQkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsgCisJaWYgKDAhPXJ3b3BzLT5zZWVrKHJ3b3BzLDBMLFJXX1NFRUtfU0VUKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsJCQkJCQorCQorCWlmICgyMCsyNyE9cndvcHMtPnNlZWsocndvcHMsLTcsUldfU0VFS19FTkQpKQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkJCQkKKwlpZiAoNyE9cndvcHMtPnJlYWQocndvcHMsdGVzdF9idWYsMSw3KSkJCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwlpZiAoU0RMX21lbWNtcCh0ZXN0X2J1ZiwiMTIzNDU2NyIsNykpCQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDAhPXJ3b3BzLT5yZWFkKHJ3b3BzLHRlc3RfYnVmLDEsMSkpCQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOwkJCisJaWYgKDAhPXJ3b3BzLT5yZWFkKHJ3b3BzLHRlc3RfYnVmLDEwLDEwMCkpCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkKKwkKKwlpZiAoMjchPXJ3b3BzLT5zZWVrKHJ3b3BzLC0yNyxSV19TRUVLX0NVUikpCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CisJCisJaWYgKDAhPXJ3b3BzLT5zZWVrKHJ3b3BzLDBMLFJXX1NFRUtfU0VUKSkJCQlSV09QX0VSUl9RVUlUKHJ3b3BzKTsKKwlpZiAoMyE9cndvcHMtPnJlYWQocndvcHMsdGVzdF9idWYsMTAsMykpCQkJUldPUF9FUlJfUVVJVChyd29wcyk7CQkJCQorCWlmIChTRExfbWVtY21wKHRlc3RfYnVmLCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1NjcxMjMiLDMwKSkJCisJCQkJCQkJCQkJCQkJCVJXT1BfRVJSX1FVSVQocndvcHMpOworCXJ3b3BzLT5jbG9zZShyd29wcyk7CisJcHJpbnRmKCJ0ZXN0NSBPS1xuIik7CisJY2xlYW51cCgpOworCXJldHVybiAwOyAvKiBhbGwgb2sgKi8KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RnYW1tYS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGdhbW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmNGIzYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RnYW1tYS5jCkBAIC0wLDAgKzEsMTk3IEBACisKKy8qIEJyaW5nIHVwIGEgd2luZG93IGFuZCBtYW5pcHVsYXRlIHRoZSBnYW1tYSBvbiBpdCAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworLyogQ2FsbCB0aGlzIGluc3RlYWQgb2YgZXhpdCgpLCBzbyB3ZSBjYW4gY2xlYW4gdXAgU0RMOiBhdGV4aXQoKSBpcyBldmlsLiAqLworc3RhdGljIHZvaWQgcXVpdChpbnQgcmMpCit7CisJU0RMX1F1aXQoKTsKKwlleGl0KHJjKTsKK30KKworLyogVHVybiBhIG5vcm1hbCBnYW1tYSB2YWx1ZSBpbnRvIGFuIGFwcHJvcHJpYXRlIGdhbW1hIHJhbXAgKi8KK3ZvaWQgQ2FsY3VsYXRlR2FtbWEoZG91YmxlIGdhbW1hLCBVaW50MTYgKnJhbXApCit7CisJaW50IGksIHZhbHVlOworCisJZ2FtbWEgPSAxLjAgLyBnYW1tYTsKKwlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7CisJCXZhbHVlID0gKGludCkocG93KChkb3VibGUpaS8yNTYuMCwgZ2FtbWEpKjY1NTM1LjAgKyAwLjUpOworCQlpZiAoIHZhbHVlID4gNjU1MzUgKSB7CisJCQl2YWx1ZSA9IDY1NTM1OworCQl9CisJCXJhbXBbaV0gPSAoVWludDE2KXZhbHVlOworCX0KK30KKworLyogVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGdlbmVyYWwgcm91dGluZSBmb3IgYWxsIG9mIHRoZSB0ZXN0IHByb2dyYW1zICovCitpbnQgZ2V0X3ZpZGVvX2FyZ3MoY2hhciAqYXJndltdLCBpbnQgKncsIGludCAqaCwgaW50ICpicHAsIFVpbnQzMiAqZmxhZ3MpCit7CisJaW50IGk7CisKKwkqdyA9IDY0MDsKKwkqaCA9IDQ4MDsKKwkqYnBwID0gMDsKKwkqZmxhZ3MgPSBTRExfU1dTVVJGQUNFOworCisJZm9yICggaT0xOyBhcmd2W2ldOyArK2kgKSB7CisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItd2lkdGgiKSA9PSAwICkgeworCQkJaWYgKCBhcmd2W2krMV0gKSB7CisJCQkJKncgPSBhdG9pKGFyZ3ZbKytpXSk7CisJCQl9CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLWhlaWdodCIpID09IDAgKSB7CisJCQlpZiAoIGFyZ3ZbaSsxXSApIHsKKwkJCQkqaCA9IGF0b2koYXJndlsrK2ldKTsKKwkJCX0KKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItYnBwIikgPT0gMCApIHsKKwkJCWlmICggYXJndltpKzFdICkgeworCQkJCSpicHAgPSBhdG9pKGFyZ3ZbKytpXSk7CisJCQl9CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLWZ1bGxzY3JlZW4iKSA9PSAwICkgeworCQkJKmZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndltpXSwgIi1odyIpID09IDAgKSB7CisJCQkqZmxhZ3MgfD0gU0RMX0hXU1VSRkFDRTsKKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItaHdwYWxldHRlIikgPT0gMCApIHsKKwkJCSpmbGFncyB8PSBTRExfSFdQQUxFVFRFOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlTRExfU3VyZmFjZSAqc2NyZWVuOworCVNETF9TdXJmYWNlICppbWFnZTsKKwlmbG9hdCBnYW1tYTsKKwlpbnQgaTsKKwlpbnQgdywgaCwgYnBwOworCVVpbnQzMiBmbGFnczsKKwlVaW50MTYgcmFtcFsyNTZdOworCVVpbnQxNiByZWRfcmFtcFsyNTZdOworCVVpbnQzMiB0aGVuLCB0aW1lb3V0OworCisJLyogQ2hlY2sgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLworCWFyZ3YgKz0gZ2V0X3ZpZGVvX2FyZ3MoYXJndiwgJncsICZoLCAmYnBwLCAmZmxhZ3MpOworCisJLyogSW5pdGlhbGl6ZSBTREwgKi8KKwlpZiAoIFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCQlyZXR1cm4oMSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZGlzcGxheSwgYWx3YXlzIHVzZSBoYXJkd2FyZSBwYWxldHRlICovCisJc2NyZWVuID0gU0RMX1NldFZpZGVvTW9kZSh3LCBoLCBicHAsIGZsYWdzIHwgU0RMX0hXUEFMRVRURSk7CisJaWYgKCBzY3JlZW4gPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBzZXQgJWR4JWQgdmlkZW8gbW9kZTogJXNcbiIsCisJCQkJCQl3LCBoLCBTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMSk7CisJfQorCisJLyogU2V0IHRoZSB3aW5kb3cgbWFuYWdlciB0aXRsZSBiYXIgKi8KKwlTRExfV01fU2V0Q2FwdGlvbigiU0RMIGdhbW1hIHRlc3QiLCAidGVzdGdhbW1hIik7CisKKwkvKiBTZXQgdGhlIGRlc2lyZWQgZ2FtbWEsIGlmIGFueSAqLworCWdhbW1hID0gMS4wZjsKKwlpZiAoICphcmd2ICkgeworCQlnYW1tYSA9IChmbG9hdClhdG9mKCphcmd2KTsKKwl9CisJaWYgKCBTRExfU2V0R2FtbWEoZ2FtbWEsIGdhbW1hLCBnYW1tYSkgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzZXQgZ2FtbWE6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMSk7CisJfQorCisjaWYgMCAvKiBUaGlzIGlzbid0IHN1cHBvcnRlZC4gIEludGVncmF0aW5nIHRoZSBnYW1tYSByYW1wcyBpc24ndCBleGFjdCAqLworCS8qIFNlZSB3aGF0IGdhbW1hIHdhcyBhY3R1YWxseSBzZXQgKi8KKwlmbG9hdCByZWFsWzNdOworCWlmICggU0RMX0dldEdhbW1hKCZyZWFsWzBdLCAmcmVhbFsxXSwgJnJlYWxbMl0pIDwgMCApIHsKKwkJcHJpbnRmKCJDb3VsZG4ndCBnZXQgZ2FtbWE6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJTZXQgZ2FtbWEgdmFsdWVzOiBSPSUyLjJmLCBHPSUyLjJmLCBCPSUyLjJmXG4iLAorCQkJcmVhbFswXSwgcmVhbFsxXSwgcmVhbFsyXSk7CisJfQorI2VuZGlmCisKKwkvKiBEbyBhbGwgdGhlIGRyYXdpbmcgd29yayAqLworCWltYWdlID0gU0RMX0xvYWRCTVAoInNhbXBsZS5ibXAiKTsKKwlpZiAoIGltYWdlICkgeworCQlTRExfUmVjdCBkc3Q7CisKKwkJZHN0LnggPSAoc2NyZWVuLT53IC0gaW1hZ2UtPncpLzI7CisJCWRzdC55ID0gKHNjcmVlbi0+aCAtIGltYWdlLT5oKS8yOworCQlkc3QudyA9IGltYWdlLT53OworCQlkc3QuaCA9IGltYWdlLT5oOworCQlTRExfQmxpdFN1cmZhY2UoaW1hZ2UsIE5VTEwsIHNjcmVlbiwgJmRzdCk7CisJCVNETF9VcGRhdGVSZWN0cyhzY3JlZW4sIDEsICZkc3QpOworCX0KKworCS8qIFdhaXQgYSBiaXQsIGhhbmRsaW5nIGV2ZW50cyAqLworCXRoZW4gPSBTRExfR2V0VGlja3MoKTsKKwl0aW1lb3V0ID0gKDUqMTAwMCk7CisJd2hpbGUgKCAoU0RMX0dldFRpY2tzKCktdGhlbikgPCB0aW1lb3V0ICkgeworCQlTRExfRXZlbnQgZXZlbnQ7CisKKwkJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZldmVudCkgKSB7CisJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKwkJCSAgICBjYXNlIFNETF9RVUlUOgkvKiBRdWl0IG5vdyAqLworCQkJCXRpbWVvdXQgPSAwOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgU0RMX0tFWURPV046CisJCQkJc3dpdGNoIChldmVudC5rZXkua2V5c3ltLnN5bSkgeworCQkJCSAgICBjYXNlIFNETEtfU1BBQ0U6CS8qIEdvIGxvbmdlci4uICovCisJCQkJCXRpbWVvdXQgKz0gKDUqMTAwMCk7CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIFNETEtfVVA6CisJCQkJCWdhbW1hICs9IDAuMmY7CisJCQkJCVNETF9TZXRHYW1tYShnYW1tYSwgZ2FtbWEsIGdhbW1hKTsKKwkJCQkJYnJlYWs7CisJCQkJICAgIGNhc2UgU0RMS19ET1dOOgorCQkJCQlnYW1tYSAtPSAwLjJmOworCQkJCQlTRExfU2V0R2FtbWEoZ2FtbWEsIGdhbW1hLCBnYW1tYSk7CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIFNETEtfRVNDQVBFOgorCQkJCQl0aW1lb3V0ID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJICAgIGRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIFBlcmZvcm0gYSBnYW1tYSBmbGFzaCB0byByZWQgdXNpbmcgY29sb3IgcmFtcHMgKi8KKwl3aGlsZSAoIGdhbW1hIDwgMTAuMCApIHsKKwkJLyogSW5jcmVhc2UgdGhlIHJlZCBnYW1tYSBhbmQgZGVjcmVhc2UgZXZlcnl0aGluZyBlbHNlLi4uICovCisJCWdhbW1hICs9IDAuMWY7CisJCUNhbGN1bGF0ZUdhbW1hKGdhbW1hLCByZWRfcmFtcCk7CisJCUNhbGN1bGF0ZUdhbW1hKDEuMC9nYW1tYSwgcmFtcCk7CisJCVNETF9TZXRHYW1tYVJhbXAocmVkX3JhbXAsIHJhbXAsIHJhbXApOworCX0KKwkvKiBGaW5pc2ggY29tcGxldGVseSByZWQgKi8KKwltZW1zZXQocmVkX3JhbXAsIDI1NSwgc2l6ZW9mKHJlZF9yYW1wKSk7CisJbWVtc2V0KHJhbXAsIDAsIHNpemVvZihyYW1wKSk7CisJU0RMX1NldEdhbW1hUmFtcChyZWRfcmFtcCwgcmFtcCwgcmFtcCk7CisKKwkvKiBOb3cgZmFkZSBvdXQgdG8gYmxhY2sgKi8KKwlmb3IgKCBpPShyZWRfcmFtcFswXSA+PiA4KTsgaSA+PSAwOyAtLWkgKSB7CisJCW1lbXNldChyZWRfcmFtcCwgaSwgc2l6ZW9mKHJlZF9yYW1wKSk7CisJCVNETF9TZXRHYW1tYVJhbXAocmVkX3JhbXAsIE5VTEwsIE5VTEwpOworCX0KKwlTRExfRGVsYXkoMSoxMDAwKTsKKworCVNETF9RdWl0KCk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGdsLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0Z2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGI4OGNmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGdsLmMKQEAgLTAsMCArMSw4NTYgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIlNETC5oIgorCisjaWZkZWYgX19NQUNPU19fCisjZGVmaW5lIEhBVkVfT1BFTkdMCisjZW5kaWYKKworI2lmZGVmIEhBVkVfT1BFTkdMCisKKyNpbmNsdWRlICJTRExfb3BlbmdsLmgiCisKKy8qIFVuZGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgYSBmbGF0IGN1YmUgaW5zdGVhZCBvZiBhIHJhaW5ib3cgY3ViZSAqLworI2RlZmluZSBTSEFERURfQ1VCRQorCisvKiBEZWZpbmUgdGhpcyB0byBiZSB0aGUgbmFtZSBvZiB0aGUgbG9nbyBpbWFnZSB0byB1c2Ugd2l0aCAtbG9nbyAqLworI2RlZmluZSBMT0dPX0ZJTEUJImljb24uYm1wIgorCisvKiBUaGUgU0RMX09QRU5HTEJMSVQgaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQuCisgICBUaGUgY29kZSBpcyBzdGlsbCBhdmFpbGFibGUgZm9yIGJlbmNobWFyayBwdXJwb3NlcyB0aG91Z2guCisqLworCitzdGF0aWMgU0RMX2Jvb2wgVVNFX0RFUFJFQ0FURURfT1BFTkdMQkxJVCA9IFNETF9GQUxTRTsKKworc3RhdGljIFNETF9TdXJmYWNlICpnbG9iYWxfaW1hZ2UgPSBOVUxMOworc3RhdGljIEdMdWludCBnbG9iYWxfdGV4dHVyZSA9IDA7CitzdGF0aWMgR0x1aW50IGN1cnNvcl90ZXh0dXJlID0gMDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgSG90S2V5X1RvZ2dsZUZ1bGxTY3JlZW4odm9pZCkKK3sKKwlTRExfU3VyZmFjZSAqc2NyZWVuOworCisJc2NyZWVuID0gU0RMX0dldFZpZGVvU3VyZmFjZSgpOworCWlmICggU0RMX1dNX1RvZ2dsZUZ1bGxTY3JlZW4oc2NyZWVuKSApIHsKKwkJcHJpbnRmKCJUb2dnbGVkIGZ1bGxzY3JlZW4gbW9kZSAtIG5vdyAlc1xuIiwKKwkJICAgIChzY3JlZW4tPmZsYWdzJlNETF9GVUxMU0NSRUVOKSA/ICJmdWxsc2NyZWVuIiA6ICJ3aW5kb3dlZCIpOworCX0gZWxzZSB7CisJCXByaW50ZigiVW5hYmxlIHRvIHRvZ2dsZSBmdWxsc2NyZWVuIG1vZGVcbiIpOworCX0KK30KKwordm9pZCBIb3RLZXlfVG9nZ2xlR3JhYih2b2lkKQoreworCVNETF9HcmFiTW9kZSBtb2RlOworCisJcHJpbnRmKCJDdHJsLUc6IHRvZ2dsaW5nIGlucHV0IGdyYWIhXG4iKTsKKwltb2RlID0gU0RMX1dNX0dyYWJJbnB1dChTRExfR1JBQl9RVUVSWSk7CisJaWYgKCBtb2RlID09IFNETF9HUkFCX09OICkgeworCQlwcmludGYoIkdyYWIgd2FzIG9uXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkdyYWIgd2FzIG9mZlxuIik7CisJfQorCW1vZGUgPSBTRExfV01fR3JhYklucHV0KCFtb2RlKTsKKwlpZiAoIG1vZGUgPT0gU0RMX0dSQUJfT04gKSB7CisJCXByaW50ZigiR3JhYiBpcyBub3cgb25cbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiR3JhYiBpcyBub3cgb2ZmXG4iKTsKKwl9Cit9CisKK3ZvaWQgSG90S2V5X0ljb25pZnkodm9pZCkKK3sKKwlwcmludGYoIkN0cmwtWjogaWNvbmlmeWluZyB3aW5kb3chXG4iKTsKKwlTRExfV01fSWNvbmlmeVdpbmRvdygpOworfQorCitpbnQgSGFuZGxlRXZlbnQoU0RMX0V2ZW50ICpldmVudCkKK3sKKwlpbnQgZG9uZTsKKworCWRvbmUgPSAwOworCXN3aXRjaCggZXZlbnQtPnR5cGUgKSB7CisJICAgIGNhc2UgU0RMX0FDVElWRUVWRU5UOgorCQkvKiBTZWUgd2hhdCBoYXBwZW5lZCAqLworCQlwcmludGYoICJhcHAgJXMgIiwgZXZlbnQtPmFjdGl2ZS5nYWluID8gImdhaW5lZCIgOiAibG9zdCIgKTsKKwkJaWYgKCBldmVudC0+YWN0aXZlLnN0YXRlICYgU0RMX0FQUEFDVElWRSApIHsKKwkJCXByaW50ZiggImFjdGl2ZSAiICk7CisJCX0gZWxzZSBpZiAoIGV2ZW50LT5hY3RpdmUuc3RhdGUgJiBTRExfQVBQTU9VU0VGT0NVUyApIHsKKwkJCXByaW50ZiggIm1vdXNlICIgKTsKKwkJfSBlbHNlIGlmICggZXZlbnQtPmFjdGl2ZS5zdGF0ZSAmIFNETF9BUFBJTlBVVEZPQ1VTICkgeworCQkJcHJpbnRmKCAiaW5wdXQgIiApOworCQl9CisJCXByaW50ZiggImZvY3VzXG4iICk7CisJCWJyZWFrOworCQkKKworCSAgICBjYXNlIFNETF9LRVlET1dOOgorCQlpZiAoIGV2ZW50LT5rZXkua2V5c3ltLnN5bSA9PSBTRExLX0VTQ0FQRSApIHsKKwkJCWRvbmUgPSAxOworCQl9CisJCWlmICggKGV2ZW50LT5rZXkua2V5c3ltLnN5bSA9PSBTRExLX2cpICYmCisJCSAgICAgKGV2ZW50LT5rZXkua2V5c3ltLm1vZCAmIEtNT0RfQ1RSTCkgKSB7CisJCQlIb3RLZXlfVG9nZ2xlR3JhYigpOworCQl9CisJCWlmICggKGV2ZW50LT5rZXkua2V5c3ltLnN5bSA9PSBTRExLX3opICYmCisJCSAgICAgKGV2ZW50LT5rZXkua2V5c3ltLm1vZCAmIEtNT0RfQ1RSTCkgKSB7CisJCQlIb3RLZXlfSWNvbmlmeSgpOworCQl9CisJCWlmICggKGV2ZW50LT5rZXkua2V5c3ltLnN5bSA9PSBTRExLX1JFVFVSTikgJiYKKwkJICAgICAoZXZlbnQtPmtleS5rZXlzeW0ubW9kICYgS01PRF9BTFQpICkgeworCQkJSG90S2V5X1RvZ2dsZUZ1bGxTY3JlZW4oKTsKKwkJfQorCQlwcmludGYoImtleSAnJXMnIHByZXNzZWRcbiIsIAorCQkJU0RMX0dldEtleU5hbWUoZXZlbnQtPmtleS5rZXlzeW0uc3ltKSk7CisJCWJyZWFrOworCSAgICBjYXNlIFNETF9RVUlUOgorCQlkb25lID0gMTsKKwkJYnJlYWs7CisJfQorCXJldHVybihkb25lKTsKK30KKwordm9pZCBTRExfR0xfRW50ZXIyRE1vZGUoKQoreworCVNETF9TdXJmYWNlICpzY3JlZW4gPSBTRExfR2V0VmlkZW9TdXJmYWNlKCk7CisKKwkvKiBOb3RlLCB0aGVyZSBtYXkgYmUgb3RoZXIgdGhpbmdzIHlvdSBuZWVkIHRvIGNoYW5nZSwKKwkgICBkZXBlbmRpbmcgb24gaG93IHlvdSBoYXZlIHlvdXIgT3BlbkdMIHN0YXRlIHNldCB1cC4KKwkqLworCWdsUHVzaEF0dHJpYihHTF9FTkFCTEVfQklUKTsKKwlnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisJZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisJZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisKKwkvKiBUaGlzIGFsbG93cyBhbHBoYSBibGVuZGluZyBvZiAyRCB0ZXh0dXJlcyB3aXRoIHRoZSBzY2VuZSAqLworCWdsRW5hYmxlKEdMX0JMRU5EKTsKKwlnbEJsZW5kRnVuYyhHTF9TUkNfQUxQSEEsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOworCisJZ2xWaWV3cG9ydCgwLCAwLCBzY3JlZW4tPncsIHNjcmVlbi0+aCk7CisKKwlnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisJZ2xQdXNoTWF0cml4KCk7CisJZ2xMb2FkSWRlbnRpdHkoKTsKKworCWdsT3J0aG8oMC4wLCAoR0xkb3VibGUpc2NyZWVuLT53LCAoR0xkb3VibGUpc2NyZWVuLT5oLCAwLjAsIDAuMCwgMS4wKTsKKworCWdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCWdsUHVzaE1hdHJpeCgpOworCWdsTG9hZElkZW50aXR5KCk7CisKKwlnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0RFQ0FMKTsKK30KKwordm9pZCBTRExfR0xfTGVhdmUyRE1vZGUoKQoreworCWdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCWdsUG9wTWF0cml4KCk7CisKKwlnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisJZ2xQb3BNYXRyaXgoKTsKKworCWdsUG9wQXR0cmliKCk7Cit9CisKKy8qIFF1aWNrIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHRleHR1cmUgY3JlYXRpb24gKi8KK3N0YXRpYyBpbnQgcG93ZXJfb2ZfdHdvKGludCBpbnB1dCkKK3sKKwlpbnQgdmFsdWUgPSAxOworCisJd2hpbGUgKCB2YWx1ZSA8IGlucHV0ICkgeworCQl2YWx1ZSA8PD0gMTsKKwl9CisJcmV0dXJuIHZhbHVlOworfQorCitHTHVpbnQgU0RMX0dMX0xvYWRUZXh0dXJlKFNETF9TdXJmYWNlICpzdXJmYWNlLCBHTGZsb2F0ICp0ZXhjb29yZCkKK3sKKwlHTHVpbnQgdGV4dHVyZTsKKwlpbnQgdywgaDsKKwlTRExfU3VyZmFjZSAqaW1hZ2U7CisJU0RMX1JlY3QgYXJlYTsKKwlVaW50MzIgc2F2ZWRfZmxhZ3M7CisJVWludDggIHNhdmVkX2FscGhhOworCisJLyogVXNlIHRoZSBzdXJmYWNlIHdpZHRoIGFuZCBoZWlnaHQgZXhwYW5kZWQgdG8gcG93ZXJzIG9mIDIgKi8KKwl3ID0gcG93ZXJfb2ZfdHdvKHN1cmZhY2UtPncpOworCWggPSBwb3dlcl9vZl90d28oc3VyZmFjZS0+aCk7CisJdGV4Y29vcmRbMF0gPSAwLjBmOwkJCS8qIE1pbiBYICovCisJdGV4Y29vcmRbMV0gPSAwLjBmOwkJCS8qIE1pbiBZICovCisJdGV4Y29vcmRbMl0gPSAoR0xmbG9hdClzdXJmYWNlLT53IC8gdzsJLyogTWF4IFggKi8KKwl0ZXhjb29yZFszXSA9IChHTGZsb2F0KXN1cmZhY2UtPmggLyBoOwkvKiBNYXggWSAqLworCisJaW1hZ2UgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZSgKKwkJCVNETF9TV1NVUkZBQ0UsCisJCQl3LCBoLAorCQkJMzIsCisjaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTiAvKiBPcGVuR0wgUkdCQSBtYXNrcyAqLworCQkJMHgwMDAwMDBGRiwgCisJCQkweDAwMDBGRjAwLCAKKwkJCTB4MDBGRjAwMDAsIAorCQkJMHhGRjAwMDAwMAorI2Vsc2UKKwkJCTB4RkYwMDAwMDAsCisJCQkweDAwRkYwMDAwLCAKKwkJCTB4MDAwMEZGMDAsIAorCQkJMHgwMDAwMDBGRgorI2VuZGlmCisJCSAgICAgICApOworCWlmICggaW1hZ2UgPT0gTlVMTCApIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2F2ZSB0aGUgYWxwaGEgYmxlbmRpbmcgYXR0cmlidXRlcyAqLworCXNhdmVkX2ZsYWdzID0gc3VyZmFjZS0+ZmxhZ3MmKFNETF9TUkNBTFBIQXxTRExfUkxFQUNDRUxPSyk7CisJc2F2ZWRfYWxwaGEgPSBzdXJmYWNlLT5mb3JtYXQtPmFscGhhOworCWlmICggKHNhdmVkX2ZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEgKSB7CisJCVNETF9TZXRBbHBoYShzdXJmYWNlLCAwLCAwKTsKKwl9CisKKwkvKiBDb3B5IHRoZSBzdXJmYWNlIGludG8gdGhlIEdMIHRleHR1cmUgaW1hZ2UgKi8KKwlhcmVhLnggPSAwOworCWFyZWEueSA9IDA7CisJYXJlYS53ID0gc3VyZmFjZS0+dzsKKwlhcmVhLmggPSBzdXJmYWNlLT5oOworCVNETF9CbGl0U3VyZmFjZShzdXJmYWNlLCAmYXJlYSwgaW1hZ2UsICZhcmVhKTsKKworCS8qIFJlc3RvcmUgdGhlIGFscGhhIGJsZW5kaW5nIGF0dHJpYnV0ZXMgKi8KKwlpZiAoIChzYXZlZF9mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBICkgeworCQlTRExfU2V0QWxwaGEoc3VyZmFjZSwgc2F2ZWRfZmxhZ3MsIHNhdmVkX2FscGhhKTsKKwl9CisKKwkvKiBDcmVhdGUgYW4gT3BlbkdMIHRleHR1cmUgZm9yIHRoZSBpbWFnZSAqLworCWdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUpOworCWdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisJZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisJZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisJZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsCisJCSAgICAgMCwKKwkJICAgICBHTF9SR0JBLAorCQkgICAgIHcsIGgsCisJCSAgICAgMCwKKwkJICAgICBHTF9SR0JBLAorCQkgICAgIEdMX1VOU0lHTkVEX0JZVEUsCisJCSAgICAgaW1hZ2UtPnBpeGVscyk7CisJU0RMX0ZyZWVTdXJmYWNlKGltYWdlKTsgLyogTm8gbG9uZ2VyIG5lZWRlZCAqLworCisJcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgRHJhd0xvZ29DdXJzb3Iodm9pZCkKK3sKKwlzdGF0aWMgR0xmbG9hdCB0ZXhNaW5YLCB0ZXhNaW5ZOworCXN0YXRpYyBHTGZsb2F0IHRleE1heFgsIHRleE1heFk7CisJc3RhdGljIGludCB3LCBoOworCWludCB4LCB5OworCisJaWYgKCAhIGN1cnNvcl90ZXh0dXJlICkgeworCQlTRExfU3VyZmFjZSAqaW1hZ2U7CisJCUdMZmxvYXQgdGV4Y29vcmRbNF07CisKKwkJLyogTG9hZCB0aGUgaW1hZ2UgKGNvdWxkIHVzZSBTRExfaW1hZ2UgbGlicmFyeSBoZXJlKSAqLworCQlpbWFnZSA9IFNETF9Mb2FkQk1QKExPR09fRklMRSk7CisJCWlmICggaW1hZ2UgPT0gTlVMTCApIHsKKwkJCXJldHVybjsKKwkJfQorCQl3ID0gaW1hZ2UtPnc7CisJCWggPSBpbWFnZS0+aDsKKworCQkvKiBDb252ZXJ0IHRoZSBpbWFnZSBpbnRvIGFuIE9wZW5HTCB0ZXh0dXJlICovCisJCWN1cnNvcl90ZXh0dXJlID0gU0RMX0dMX0xvYWRUZXh0dXJlKGltYWdlLCB0ZXhjb29yZCk7CisKKwkJLyogTWFrZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGVhc3kgdG8gdW5kZXJzdGFuZCAqLworCQl0ZXhNaW5YID0gdGV4Y29vcmRbMF07CisJCXRleE1pblkgPSB0ZXhjb29yZFsxXTsKKwkJdGV4TWF4WCA9IHRleGNvb3JkWzJdOworCQl0ZXhNYXhZID0gdGV4Y29vcmRbM107CisKKwkJLyogV2UgZG9uJ3QgbmVlZCB0aGUgb3JpZ2luYWwgaW1hZ2UgYW55bW9yZSAqLworCQlTRExfRnJlZVN1cmZhY2UoaW1hZ2UpOworCisJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXh0dXJlIGNvbnZlcnNpb24gaXMgb2theSAqLworCQlpZiAoICEgY3Vyc29yX3RleHR1cmUgKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBNb3ZlIHRoZSBpbWFnZSBhcm91bmQgKi8KKwlTRExfR2V0TW91c2VTdGF0ZSgmeCwgJnkpOworCXggLT0gdy8yOworCXkgLT0gaC8yOworCisJLyogU2hvdyB0aGUgaW1hZ2Ugb24gdGhlIHNjcmVlbiAqLworCVNETF9HTF9FbnRlcjJETW9kZSgpOworCWdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgY3Vyc29yX3RleHR1cmUpOworCWdsQmVnaW4oR0xfVFJJQU5HTEVfU1RSSVApOworCWdsVGV4Q29vcmQyZih0ZXhNaW5YLCB0ZXhNaW5ZKTsgZ2xWZXJ0ZXgyaSh4LCAgIHkgICk7CisJZ2xUZXhDb29yZDJmKHRleE1heFgsIHRleE1pblkpOyBnbFZlcnRleDJpKHgrdywgeSAgKTsKKwlnbFRleENvb3JkMmYodGV4TWluWCwgdGV4TWF4WSk7IGdsVmVydGV4MmkoeCwgICB5K2gpOworCWdsVGV4Q29vcmQyZih0ZXhNYXhYLCB0ZXhNYXhZKTsgZ2xWZXJ0ZXgyaSh4K3csIHkraCk7CisJZ2xFbmQoKTsKKwlTRExfR0xfTGVhdmUyRE1vZGUoKTsKK30KKwordm9pZCBEcmF3TG9nb1RleHR1cmUodm9pZCkKK3sKKwlzdGF0aWMgR0xmbG9hdCB0ZXhNaW5YLCB0ZXhNaW5ZOworCXN0YXRpYyBHTGZsb2F0IHRleE1heFgsIHRleE1heFk7CisJc3RhdGljIGludCB4ID0gMDsKKwlzdGF0aWMgaW50IHkgPSAwOworCXN0YXRpYyBpbnQgdywgaDsKKwlzdGF0aWMgaW50IGRlbHRhX3ggPSAxOworCXN0YXRpYyBpbnQgZGVsdGFfeSA9IDE7CisKKwlTRExfU3VyZmFjZSAqc2NyZWVuID0gU0RMX0dldFZpZGVvU3VyZmFjZSgpOworCisJaWYgKCAhIGdsb2JhbF90ZXh0dXJlICkgeworCQlTRExfU3VyZmFjZSAqaW1hZ2U7CisJCUdMZmxvYXQgdGV4Y29vcmRbNF07CisKKwkJLyogTG9hZCB0aGUgaW1hZ2UgKGNvdWxkIHVzZSBTRExfaW1hZ2UgbGlicmFyeSBoZXJlKSAqLworCQlpbWFnZSA9IFNETF9Mb2FkQk1QKExPR09fRklMRSk7CisJCWlmICggaW1hZ2UgPT0gTlVMTCApIHsKKwkJCXJldHVybjsKKwkJfQorCQl3ID0gaW1hZ2UtPnc7CisJCWggPSBpbWFnZS0+aDsKKworCQkvKiBDb252ZXJ0IHRoZSBpbWFnZSBpbnRvIGFuIE9wZW5HTCB0ZXh0dXJlICovCisJCWdsb2JhbF90ZXh0dXJlID0gU0RMX0dMX0xvYWRUZXh0dXJlKGltYWdlLCB0ZXhjb29yZCk7CisKKwkJLyogTWFrZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGVhc3kgdG8gdW5kZXJzdGFuZCAqLworCQl0ZXhNaW5YID0gdGV4Y29vcmRbMF07CisJCXRleE1pblkgPSB0ZXhjb29yZFsxXTsKKwkJdGV4TWF4WCA9IHRleGNvb3JkWzJdOworCQl0ZXhNYXhZID0gdGV4Y29vcmRbM107CisKKwkJLyogV2UgZG9uJ3QgbmVlZCB0aGUgb3JpZ2luYWwgaW1hZ2UgYW55bW9yZSAqLworCQlTRExfRnJlZVN1cmZhY2UoaW1hZ2UpOworCisJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXh0dXJlIGNvbnZlcnNpb24gaXMgb2theSAqLworCQlpZiAoICEgZ2xvYmFsX3RleHR1cmUgKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBNb3ZlIHRoZSBpbWFnZSBhcm91bmQgKi8KKwl4ICs9IGRlbHRhX3g7CisJaWYgKCB4IDwgMCApIHsKKwkJeCA9IDA7CisJCWRlbHRhX3ggPSAtZGVsdGFfeDsKKwl9IGVsc2UKKwlpZiAoICh4K3cpID4gc2NyZWVuLT53ICkgeworCQl4ID0gc2NyZWVuLT53LXc7CisJCWRlbHRhX3ggPSAtZGVsdGFfeDsKKwl9CisJeSArPSBkZWx0YV95OworCWlmICggeSA8IDAgKSB7CisJCXkgPSAwOworCQlkZWx0YV95ID0gLWRlbHRhX3k7CisJfSBlbHNlCisJaWYgKCAoeStoKSA+IHNjcmVlbi0+aCApIHsKKwkJeSA9IHNjcmVlbi0+aC1oOworCQlkZWx0YV95ID0gLWRlbHRhX3k7CisJfQorCisJLyogU2hvdyB0aGUgaW1hZ2Ugb24gdGhlIHNjcmVlbiAqLworCVNETF9HTF9FbnRlcjJETW9kZSgpOworCWdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgZ2xvYmFsX3RleHR1cmUpOworCWdsQmVnaW4oR0xfVFJJQU5HTEVfU1RSSVApOworCWdsVGV4Q29vcmQyZih0ZXhNaW5YLCB0ZXhNaW5ZKTsgZ2xWZXJ0ZXgyaSh4LCAgIHkgICk7CisJZ2xUZXhDb29yZDJmKHRleE1heFgsIHRleE1pblkpOyBnbFZlcnRleDJpKHgrdywgeSAgKTsKKwlnbFRleENvb3JkMmYodGV4TWluWCwgdGV4TWF4WSk7IGdsVmVydGV4MmkoeCwgICB5K2gpOworCWdsVGV4Q29vcmQyZih0ZXhNYXhYLCB0ZXhNYXhZKTsgZ2xWZXJ0ZXgyaSh4K3csIHkraCk7CisJZ2xFbmQoKTsKKwlTRExfR0xfTGVhdmUyRE1vZGUoKTsKK30KKworLyogVGhpcyBjb2RlIGlzIGRlcHJlY2F0ZWQsIGJ1dCBhdmFpbGFibGUgZm9yIHNwZWVkIGNvbXBhcmlzb25zICovCit2b2lkIERyYXdMb2dvQmxpdCh2b2lkKQoreworCXN0YXRpYyBpbnQgeCA9IDA7CisJc3RhdGljIGludCB5ID0gMDsKKwlzdGF0aWMgaW50IHcsIGg7CisJc3RhdGljIGludCBkZWx0YV94ID0gMTsKKwlzdGF0aWMgaW50IGRlbHRhX3kgPSAxOworCisJU0RMX1JlY3QgZHN0OworCVNETF9TdXJmYWNlICpzY3JlZW4gPSBTRExfR2V0VmlkZW9TdXJmYWNlKCk7CisKKwlpZiAoIGdsb2JhbF9pbWFnZSA9PSBOVUxMICkgeworCQlTRExfU3VyZmFjZSAqdGVtcDsKKworCQkvKiBMb2FkIHRoZSBpbWFnZSAoY291bGQgdXNlIFNETF9pbWFnZSBsaWJyYXJ5IGhlcmUpICovCisJCXRlbXAgPSBTRExfTG9hZEJNUChMT0dPX0ZJTEUpOworCQlpZiAoIHRlbXAgPT0gTlVMTCApIHsKKwkJCXJldHVybjsKKwkJfQorCQl3ID0gdGVtcC0+dzsKKwkJaCA9IHRlbXAtPmg7CisKKwkJLyogQ29udmVydCB0aGUgaW1hZ2UgaW50byB0aGUgc2NyZWVuIGZvcm1hdCAqLworCQlnbG9iYWxfaW1hZ2UgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZSgKKwkJCQlTRExfU1dTVVJGQUNFLAorCQkJCXcsIGgsCisJCQkJc2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCwKKwkJCQlzY3JlZW4tPmZvcm1hdC0+Um1hc2ssCisJCQkJc2NyZWVuLT5mb3JtYXQtPkdtYXNrLAorCQkJCXNjcmVlbi0+Zm9ybWF0LT5CbWFzaywKKwkJCQlzY3JlZW4tPmZvcm1hdC0+QW1hc2spOworCQlpZiAoIGdsb2JhbF9pbWFnZSApIHsKKwkJCVNETF9CbGl0U3VyZmFjZSh0ZW1wLCBOVUxMLCBnbG9iYWxfaW1hZ2UsIE5VTEwpOworCQl9CisJCVNETF9GcmVlU3VyZmFjZSh0ZW1wKTsKKworCQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgdGV4dHVyZSBjb252ZXJzaW9uIGlzIG9rYXkgKi8KKwkJaWYgKCAhIGdsb2JhbF9pbWFnZSApIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIE1vdmUgdGhlIGltYWdlIGFyb3VuZAorICAgICAgICAgICBOb3RlIHRoYXQgd2UgZG8gbm90IGNsZWFyIHRoZSBvbGQgcG9zaXRpb24uICBUaGlzIGlzIGJlY2F1c2Ugd2UKKyAgICAgICAgICAgcGVyZm9ybSBhIGdsQ2xlYXIoKSB3aGljaCBjbGVhcnMgdGhlIGZyYW1lYnVmZmVyIGFuZCB0aGVuIG9ubHkKKyAgICAgICAgICAgdXBkYXRlIHRoZSBuZXcgYXJlYS4KKyAgICAgICAgICAgTm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBhY2hpZXZlIGludGVyZXN0aW5nIGVmZmVjdHMgYnkgbW9kaWZ5aW5nCisgICAgICAgICAgIHRoZSBzY3JlZW4gc3VyZmFjZSBhbHBoYSBjaGFubmVsLiAgSXQncyBzZXQgdG8gMjU1IGJ5IGRlZmF1bHQuLgorICAgICAgICAgKi8KKwl4ICs9IGRlbHRhX3g7CisJaWYgKCB4IDwgMCApIHsKKwkJeCA9IDA7CisJCWRlbHRhX3ggPSAtZGVsdGFfeDsKKwl9IGVsc2UKKwlpZiAoICh4K3cpID4gc2NyZWVuLT53ICkgeworCQl4ID0gc2NyZWVuLT53LXc7CisJCWRlbHRhX3ggPSAtZGVsdGFfeDsKKwl9CisJeSArPSBkZWx0YV95OworCWlmICggeSA8IDAgKSB7CisJCXkgPSAwOworCQlkZWx0YV95ID0gLWRlbHRhX3k7CisJfSBlbHNlCisJaWYgKCAoeStoKSA+IHNjcmVlbi0+aCApIHsKKwkJeSA9IHNjcmVlbi0+aC1oOworCQlkZWx0YV95ID0gLWRlbHRhX3k7CisJfQorCWRzdC54ID0geDsKKwlkc3QueSA9IHk7CisJZHN0LncgPSB3OworCWRzdC5oID0gaDsKKwlTRExfQmxpdFN1cmZhY2UoZ2xvYmFsX2ltYWdlLCBOVUxMLCBzY3JlZW4sICZkc3QpOworCisJLyogU2hvdyB0aGUgaW1hZ2Ugb24gdGhlIHNjcmVlbiAqLworCVNETF9VcGRhdGVSZWN0cyhzY3JlZW4sIDEsICZkc3QpOworfQorCitpbnQgUnVuR0xUZXN0KCBpbnQgYXJnYywgY2hhciogYXJndltdLAorICAgICAgICAgICAgICAgaW50IGxvZ28sIGludCBsb2dvY3Vyc29yLCBpbnQgc2xvd2x5LCBpbnQgYnBwLCBmbG9hdCBnYW1tYSwgaW50IG5vZnJhbWUsIGludCBmc2FhLCBpbnQgc3luYywgaW50IGFjY2VsICkKK3sKKwlpbnQgaTsKKwlpbnQgcmdiX3NpemVbM107CisJaW50IHcgPSA2NDA7CisJaW50IGggPSA0ODA7CisJaW50IGRvbmUgPSAwOworCWludCBmcmFtZXM7CisJVWludDMyIHN0YXJ0X3RpbWUsIHRoaXNfdGltZTsKKyAgICAgICAgZmxvYXQgY29sb3JbOF1bM109IHt7IDEuMCwgIDEuMCwgIDAuMH0sIAorCQkJICAgIHsgMS4wLCAgMC4wLCAgMC4wfSwKKwkJCSAgICB7IDAuMCwgIDAuMCwgIDAuMH0sCisJCQkgICAgeyAwLjAsICAxLjAsICAwLjB9LAorCQkJICAgIHsgMC4wLCAgMS4wLCAgMS4wfSwKKwkJCSAgICB7IDEuMCwgIDEuMCwgIDEuMH0sCisJCQkgICAgeyAxLjAsICAwLjAsICAxLjB9LAorCQkJICAgIHsgMC4wLCAgMC4wLCAgMS4wfX07CisJZmxvYXQgY3ViZVs4XVszXT0ge3sgMC41LCAgMC41LCAtMC41fSwgCisJCQkgICB7IDAuNSwgLTAuNSwgLTAuNX0sCisJCQkgICB7LTAuNSwgLTAuNSwgLTAuNX0sCisJCQkgICB7LTAuNSwgIDAuNSwgLTAuNX0sCisJCQkgICB7LTAuNSwgIDAuNSwgIDAuNX0sCisJCQkgICB7IDAuNSwgIDAuNSwgIDAuNX0sCisJCQkgICB7IDAuNSwgLTAuNSwgIDAuNX0sCisJCQkgICB7LTAuNSwgLTAuNSwgIDAuNX19OworCVVpbnQzMiB2aWRlb19mbGFnczsKKwlpbnQgdmFsdWU7CisKKwlpZiggU0RMX0luaXQoIFNETF9JTklUX1ZJREVPICkgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLFNETF9HZXRFcnJvcigpKTsKKwkJZXhpdCggMSApOworCX0KKworCS8qIFNlZSBpZiB3ZSBzaG91bGQgZGV0ZWN0IHRoZSBkaXNwbGF5IGRlcHRoICovCisJaWYgKCBicHAgPT0gMCApIHsKKwkJaWYgKCBTRExfR2V0VmlkZW9JbmZvKCktPnZmbXQtPkJpdHNQZXJQaXhlbCA8PSA4ICkgeworCQkJYnBwID0gODsKKwkJfSBlbHNlIHsKKwkJCWJwcCA9IDE2OyAgLyogTW9yZSBkb2Vzbid0IHNlZW0gdG8gd29yayAqLworCQl9CisJfQorCisJLyogU2V0IHRoZSBmbGFncyB3ZSB3YW50IHRvIHVzZSBmb3Igc2V0dGluZyB0aGUgdmlkZW8gbW9kZSAqLworCWlmICggbG9nbyAmJiBVU0VfREVQUkVDQVRFRF9PUEVOR0xCTElUICkgeworCQl2aWRlb19mbGFncyA9IFNETF9PUEVOR0xCTElUOworCX0gZWxzZSB7CisJCXZpZGVvX2ZsYWdzID0gU0RMX09QRU5HTDsKKwl9CisJZm9yICggaT0xOyBhcmd2W2ldOyArK2kgKSB7CisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItZnVsbHNjcmVlbiIpID09IDAgKSB7CisJCQl2aWRlb19mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKwkJfQorCX0KKworICAgICAgICBpZiAobm9mcmFtZSkgeworICAgICAgICAgICB2aWRlb19mbGFncyB8PSBTRExfTk9GUkFNRTsKKyAgICAgICAgfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZGlzcGxheSAqLworCXN3aXRjaCAoYnBwKSB7CisJICAgIGNhc2UgODoKKwkJcmdiX3NpemVbMF0gPSAzOworCQlyZ2Jfc2l6ZVsxXSA9IDM7CisJCXJnYl9zaXplWzJdID0gMjsKKwkJYnJlYWs7CisJICAgIGNhc2UgMTU6CisJICAgIGNhc2UgMTY6CisJCXJnYl9zaXplWzBdID0gNTsKKwkJcmdiX3NpemVbMV0gPSA1OworCQlyZ2Jfc2l6ZVsyXSA9IDU7CisJCWJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKwkJcmdiX3NpemVbMF0gPSA4OworCQlyZ2Jfc2l6ZVsxXSA9IDg7CisJCXJnYl9zaXplWzJdID0gODsKKwkJYnJlYWs7CisJfQorCVNETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9SRURfU0laRSwgcmdiX3NpemVbMF0gKTsKKwlTRExfR0xfU2V0QXR0cmlidXRlKCBTRExfR0xfR1JFRU5fU0laRSwgcmdiX3NpemVbMV0gKTsKKwlTRExfR0xfU2V0QXR0cmlidXRlKCBTRExfR0xfQkxVRV9TSVpFLCByZ2Jfc2l6ZVsyXSApOworCVNETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9ERVBUSF9TSVpFLCAxNiApOworCVNETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9ET1VCTEVCVUZGRVIsIDEgKTsKKwlpZiAoIGZzYWEgKSB7CisJCVNETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9NVUxUSVNBTVBMRUJVRkZFUlMsIDEgKTsKKwkJU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX01VTFRJU0FNUExFU0FNUExFUywgZnNhYSApOworCX0KKwlpZiAoIGFjY2VsICkgeworCQlTRExfR0xfU2V0QXR0cmlidXRlKCBTRExfR0xfQUNDRUxFUkFURURfVklTVUFMLCAxICk7CisJfQorCWlmICggc3luYyApIHsKKwkJU0RMX0dMX1NldEF0dHJpYnV0ZSggU0RMX0dMX1NXQVBfQ09OVFJPTCwgMSApOworCX0gZWxzZSB7CisJCVNETF9HTF9TZXRBdHRyaWJ1dGUoIFNETF9HTF9TV0FQX0NPTlRST0wsIDAgKTsKKwl9CisJaWYgKCBTRExfU2V0VmlkZW9Nb2RlKCB3LCBoLCBicHAsIHZpZGVvX2ZsYWdzICkgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBzZXQgR0wgbW9kZTogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJU0RMX1F1aXQoKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlwcmludGYoIlNjcmVlbiBCUFA6ICVkXG4iLCBTRExfR2V0VmlkZW9TdXJmYWNlKCktPmZvcm1hdC0+Qml0c1BlclBpeGVsKTsKKwlwcmludGYoIlxuIik7CisJcHJpbnRmKCAiVmVuZG9yICAgICA6ICVzXG4iLCBnbEdldFN0cmluZyggR0xfVkVORE9SICkgKTsKKwlwcmludGYoICJSZW5kZXJlciAgIDogJXNcbiIsIGdsR2V0U3RyaW5nKCBHTF9SRU5ERVJFUiApICk7CisJcHJpbnRmKCAiVmVyc2lvbiAgICA6ICVzXG4iLCBnbEdldFN0cmluZyggR0xfVkVSU0lPTiApICk7CisJcHJpbnRmKCAiRXh0ZW5zaW9ucyA6ICVzXG4iLCBnbEdldFN0cmluZyggR0xfRVhURU5TSU9OUyApICk7CisJcHJpbnRmKCJcbiIpOworCisJU0RMX0dMX0dldEF0dHJpYnV0ZSggU0RMX0dMX1JFRF9TSVpFLCAmdmFsdWUgKTsKKwlwcmludGYoICJTRExfR0xfUkVEX1NJWkU6IHJlcXVlc3RlZCAlZCwgZ290ICVkXG4iLCByZ2Jfc2l6ZVswXSx2YWx1ZSk7CisJU0RMX0dMX0dldEF0dHJpYnV0ZSggU0RMX0dMX0dSRUVOX1NJWkUsICZ2YWx1ZSApOworCXByaW50ZiggIlNETF9HTF9HUkVFTl9TSVpFOiByZXF1ZXN0ZWQgJWQsIGdvdCAlZFxuIiwgcmdiX3NpemVbMV0sdmFsdWUpOworCVNETF9HTF9HZXRBdHRyaWJ1dGUoIFNETF9HTF9CTFVFX1NJWkUsICZ2YWx1ZSApOworCXByaW50ZiggIlNETF9HTF9CTFVFX1NJWkU6IHJlcXVlc3RlZCAlZCwgZ290ICVkXG4iLCByZ2Jfc2l6ZVsyXSx2YWx1ZSk7CisJU0RMX0dMX0dldEF0dHJpYnV0ZSggU0RMX0dMX0RFUFRIX1NJWkUsICZ2YWx1ZSApOworCXByaW50ZiggIlNETF9HTF9ERVBUSF9TSVpFOiByZXF1ZXN0ZWQgJWQsIGdvdCAlZFxuIiwgYnBwLCB2YWx1ZSApOworCVNETF9HTF9HZXRBdHRyaWJ1dGUoIFNETF9HTF9ET1VCTEVCVUZGRVIsICZ2YWx1ZSApOworCXByaW50ZiggIlNETF9HTF9ET1VCTEVCVUZGRVI6IHJlcXVlc3RlZCAxLCBnb3QgJWRcbiIsIHZhbHVlICk7CisJaWYgKCBmc2FhICkgeworCQlTRExfR0xfR2V0QXR0cmlidXRlKCBTRExfR0xfTVVMVElTQU1QTEVCVUZGRVJTLCAmdmFsdWUgKTsKKwkJcHJpbnRmKCJTRExfR0xfTVVMVElTQU1QTEVCVUZGRVJTOiByZXF1ZXN0ZWQgMSwgZ290ICVkXG4iLCB2YWx1ZSApOworCQlTRExfR0xfR2V0QXR0cmlidXRlKCBTRExfR0xfTVVMVElTQU1QTEVTQU1QTEVTLCAmdmFsdWUgKTsKKwkJcHJpbnRmKCJTRExfR0xfTVVMVElTQU1QTEVTQU1QTEVTOiByZXF1ZXN0ZWQgJWQsIGdvdCAlZFxuIiwgZnNhYSwgdmFsdWUgKTsKKwl9CisJaWYgKCBhY2NlbCApIHsKKwkJU0RMX0dMX0dldEF0dHJpYnV0ZSggU0RMX0dMX0FDQ0VMRVJBVEVEX1ZJU1VBTCwgJnZhbHVlICk7CisJCXByaW50ZiggIlNETF9HTF9BQ0NFTEVSQVRFRF9WSVNVQUw6IHJlcXVlc3RlZCAxLCBnb3QgJWRcbiIsIHZhbHVlICk7CisJfQorCWlmICggc3luYyApIHsKKwkJU0RMX0dMX0dldEF0dHJpYnV0ZSggU0RMX0dMX1NXQVBfQ09OVFJPTCwgJnZhbHVlICk7CisJCXByaW50ZiggIlNETF9HTF9TV0FQX0NPTlRST0w6IHJlcXVlc3RlZCAxLCBnb3QgJWRcbiIsIHZhbHVlICk7CisJfQorCisJLyogU2V0IHRoZSB3aW5kb3cgbWFuYWdlciB0aXRsZSBiYXIgKi8KKwlTRExfV01fU2V0Q2FwdGlvbiggIlNETCBHTCB0ZXN0IiwgInRlc3RnbCIgKTsKKworCS8qIFNldCB0aGUgZ2FtbWEgZm9yIHRoZSB3aW5kb3cgKi8KKwlpZiAoIGdhbW1hICE9IDAuMCApIHsKKwkJU0RMX1NldEdhbW1hKGdhbW1hLCBnYW1tYSwgZ2FtbWEpOworCX0KKworCWdsVmlld3BvcnQoIDAsIDAsIHcsIGggKTsKKwlnbE1hdHJpeE1vZGUoIEdMX1BST0pFQ1RJT04gKTsKKwlnbExvYWRJZGVudGl0eSggKTsKKworCWdsT3J0aG8oIC0yLjAsIDIuMCwgLTIuMCwgMi4wLCAtMjAuMCwgMjAuMCApOworCisJZ2xNYXRyaXhNb2RlKCBHTF9NT0RFTFZJRVcgKTsKKwlnbExvYWRJZGVudGl0eSggKTsKKworCWdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworCisJZ2xEZXB0aEZ1bmMoR0xfTEVTUyk7CisKKwlnbFNoYWRlTW9kZWwoR0xfU01PT1RIKTsKKworCS8qIExvb3AgdW50aWwgZG9uZS4gKi8KKwlzdGFydF90aW1lID0gU0RMX0dldFRpY2tzKCk7CisJZnJhbWVzID0gMDsKKwl3aGlsZSggIWRvbmUgKSB7CisJCUdMZW51bSBnbF9lcnJvcjsKKwkJY2hhciogc2RsX2Vycm9yOworCQlTRExfRXZlbnQgZXZlbnQ7CisKKwkJLyogRG8gb3VyIGRyYXdpbmcsIHRvby4gKi8KKwkJZ2xDbGVhckNvbG9yKCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsKKwkJZ2xDbGVhciggR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOworCisJCWdsQmVnaW4oIEdMX1FVQURTICk7CisKKyNpZmRlZiBTSEFERURfQ1VCRQorCQkJZ2xDb2xvcjNmdihjb2xvclswXSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzBdKTsKKwkJCWdsQ29sb3IzZnYoY29sb3JbMV0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVsxXSk7CisJCQlnbENvbG9yM2Z2KGNvbG9yWzJdKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbMl0pOworCQkJZ2xDb2xvcjNmdihjb2xvclszXSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzNdKTsKKwkJCQorCQkJZ2xDb2xvcjNmdihjb2xvclszXSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzNdKTsKKwkJCWdsQ29sb3IzZnYoY29sb3JbNF0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVs0XSk7CisJCQlnbENvbG9yM2Z2KGNvbG9yWzddKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbN10pOworCQkJZ2xDb2xvcjNmdihjb2xvclsyXSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzJdKTsKKwkJCQorCQkJZ2xDb2xvcjNmdihjb2xvclswXSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzBdKTsKKwkJCWdsQ29sb3IzZnYoY29sb3JbNV0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVs1XSk7CisJCQlnbENvbG9yM2Z2KGNvbG9yWzZdKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbNl0pOworCQkJZ2xDb2xvcjNmdihjb2xvclsxXSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzFdKTsKKwkJCQorCQkJZ2xDb2xvcjNmdihjb2xvcls1XSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzVdKTsKKwkJCWdsQ29sb3IzZnYoY29sb3JbNF0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVs0XSk7CisJCQlnbENvbG9yM2Z2KGNvbG9yWzddKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbN10pOworCQkJZ2xDb2xvcjNmdihjb2xvcls2XSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzZdKTsKKworCQkJZ2xDb2xvcjNmdihjb2xvcls1XSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzVdKTsKKwkJCWdsQ29sb3IzZnYoY29sb3JbMF0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVswXSk7CisJCQlnbENvbG9yM2Z2KGNvbG9yWzNdKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbM10pOworCQkJZ2xDb2xvcjNmdihjb2xvcls0XSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzRdKTsKKworCQkJZ2xDb2xvcjNmdihjb2xvcls2XSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzZdKTsKKwkJCWdsQ29sb3IzZnYoY29sb3JbMV0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVsxXSk7CisJCQlnbENvbG9yM2Z2KGNvbG9yWzJdKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbMl0pOworCQkJZ2xDb2xvcjNmdihjb2xvcls3XSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzddKTsKKyNlbHNlIC8qIGZsYXQgY3ViZSAqLworCQkJZ2xDb2xvcjNmKDEuMCwgMC4wLCAwLjApOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVswXSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzFdKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbMl0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVszXSk7CisJCQkKKwkJCWdsQ29sb3IzZigwLjAsIDEuMCwgMC4wKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbM10pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVs0XSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzddKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbMl0pOworCQkJCisJCQlnbENvbG9yM2YoMC4wLCAwLjAsIDEuMCk7CisJCQlnbFZlcnRleDNmdihjdWJlWzBdKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbNV0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVs2XSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzFdKTsKKwkJCQorCQkJZ2xDb2xvcjNmKDAuMCwgMS4wLCAxLjApOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVs1XSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzRdKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbN10pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVs2XSk7CisKKwkJCWdsQ29sb3IzZigxLjAsIDEuMCwgMC4wKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbNV0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVswXSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzNdKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbNF0pOworCisJCQlnbENvbG9yM2YoMS4wLCAwLjAsIDEuMCk7CisJCQlnbFZlcnRleDNmdihjdWJlWzZdKTsKKwkJCWdsVmVydGV4M2Z2KGN1YmVbMV0pOworCQkJZ2xWZXJ0ZXgzZnYoY3ViZVsyXSk7CisJCQlnbFZlcnRleDNmdihjdWJlWzddKTsKKyNlbmRpZiAvKiBTSEFERURfQ1VCRSAqLworCisJCWdsRW5kKCApOworCQkKKwkJZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisJCWdsUm90YXRlZig1LjAsIDEuMCwgMS4wLCAxLjApOworCisJCS8qIERyYXcgMkQgbG9nbyBvbnRvIHRoZSAzRCBkaXNwbGF5ICovCisJCWlmICggbG9nbyApIHsKKwkJCWlmICggVVNFX0RFUFJFQ0FURURfT1BFTkdMQkxJVCApIHsKKwkJCQlEcmF3TG9nb0JsaXQoKTsKKwkJCX0gZWxzZSB7CisJCQkJRHJhd0xvZ29UZXh0dXJlKCk7CisJCQl9CisJCX0KKwkJaWYgKCBsb2dvY3Vyc29yICkgeworCQkJRHJhd0xvZ29DdXJzb3IoKTsKKwkJfQorCisJCVNETF9HTF9Td2FwQnVmZmVycyggKTsKKworCQkvKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucy4gKi8KKwkJZ2xfZXJyb3IgPSBnbEdldEVycm9yKCApOworCisJCWlmKCBnbF9lcnJvciAhPSBHTF9OT19FUlJPUiApIHsKKwkJCWZwcmludGYoIHN0ZGVyciwgInRlc3RnbDogT3BlbkdMIGVycm9yOiAlZFxuIiwgZ2xfZXJyb3IgKTsKKwkJfQorCisJCXNkbF9lcnJvciA9IFNETF9HZXRFcnJvciggKTsKKworCQlpZiggc2RsX2Vycm9yWzBdICE9ICdcMCcgKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInRlc3RnbDogU0RMIGVycm9yICclcydcbiIsIHNkbF9lcnJvcik7CisJCQlTRExfQ2xlYXJFcnJvcigpOworCQl9CisKKwkJLyogQWxsb3cgdGhlIHVzZXIgdG8gc2VlIHdoYXQncyBoYXBwZW5pbmcgKi8KKwkJaWYgKCBzbG93bHkgKSB7CisJCQlTRExfRGVsYXkoIDIwICk7CisJCX0KKworCQkvKiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZyBldmVudC4gKi8KKwkJd2hpbGUoIFNETF9Qb2xsRXZlbnQoICZldmVudCApICkgeworCQkJZG9uZSA9IEhhbmRsZUV2ZW50KCZldmVudCk7CisJCX0KKwkJKytmcmFtZXM7CisJfQorCisJLyogUHJpbnQgb3V0IHRoZSBmcmFtZXMgcGVyIHNlY29uZCAqLworCXRoaXNfdGltZSA9IFNETF9HZXRUaWNrcygpOworCWlmICggdGhpc190aW1lICE9IHN0YXJ0X3RpbWUgKSB7CisJCXByaW50ZigiJTIuMmYgRlBTXG4iLAorCQkJKChmbG9hdClmcmFtZXMvKHRoaXNfdGltZS1zdGFydF90aW1lKSkqMTAwMC4wKTsKKwl9CisKKwlpZiAoIGdsb2JhbF9pbWFnZSApIHsKKwkgICAJU0RMX0ZyZWVTdXJmYWNlKGdsb2JhbF9pbWFnZSk7CisJCWdsb2JhbF9pbWFnZSA9IE5VTEw7CisJfQorCWlmICggZ2xvYmFsX3RleHR1cmUgKSB7CisJCWdsRGVsZXRlVGV4dHVyZXMoIDEsICZnbG9iYWxfdGV4dHVyZSApOworCQlnbG9iYWxfdGV4dHVyZSA9IDA7CisJfQorCWlmICggY3Vyc29yX3RleHR1cmUgKSB7CisJCWdsRGVsZXRlVGV4dHVyZXMoIDEsICZjdXJzb3JfdGV4dHVyZSApOworCQljdXJzb3JfdGV4dHVyZSA9IDA7CisJfQorCisJLyogRGVzdHJveSBvdXIgR0wgY29udGV4dCwgZXRjLiAqLworCVNETF9RdWl0KCApOworCXJldHVybigwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaSwgbG9nbywgbG9nb2N1cnNvciA9IDA7CisJaW50IG51bXRlc3RzOworCWludCBicHAgPSAwOworCWludCBzbG93bHk7CisJZmxvYXQgZ2FtbWEgPSAwLjA7CisJaW50IG5vZnJhbWUgPSAwOworCWludCBmc2FhID0gMDsKKwlpbnQgYWNjZWwgPSAwOworCWludCBzeW5jID0gMDsKKworCWxvZ28gPSAwOworCXNsb3dseSA9IDA7CisJbnVtdGVzdHMgPSAxOworCWZvciAoIGk9MTsgYXJndltpXTsgKytpICkgeworCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLXR3aWNlIikgPT0gMCApIHsKKwkJCSsrbnVtdGVzdHM7CisJCX0KKwkJaWYgKCBzdHJjbXAoYXJndltpXSwgIi1sb2dvIikgPT0gMCApIHsKKwkJCWxvZ28gPSAxOworCQkJVVNFX0RFUFJFQ0FURURfT1BFTkdMQkxJVCA9IFNETF9GQUxTRTsKKwkJfQorCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLWxvZ29ibGl0IikgPT0gMCApIHsKKwkJCWxvZ28gPSAxOworCQkJVVNFX0RFUFJFQ0FURURfT1BFTkdMQkxJVCA9IFNETF9UUlVFOworCQl9CisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItbG9nb2N1cnNvciIpID09IDAgKSB7CisJCQlsb2dvY3Vyc29yID0gMTsKKwkJfQorCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLXNsb3ciKSA9PSAwICkgeworCQkJc2xvd2x5ID0gMTsKKwkJfQorCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLWJwcCIpID09IDAgKSB7CisgCQkgICAgICAgYnBwID0gYXRvaShhcmd2WysraV0pOworCQl9CisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItZ2FtbWEiKSA9PSAwICkgeworIAkJICAgICAgIGdhbW1hID0gKGZsb2F0KWF0b2YoYXJndlsrK2ldKTsKKwkJfQorCQlpZiAoIHN0cmNtcChhcmd2W2ldLCAiLW5vZnJhbWUiKSA9PSAwICkgeworIAkJICAgICAgIG5vZnJhbWUgPSAxOworCQl9CisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItZnNhYSIpID09IDAgKSB7CisgCQkgICAgICAgKytmc2FhOworCQl9CisJCWlmICggc3RyY21wKGFyZ3ZbaV0sICItYWNjZWwiKSA9PSAwICkgeworIAkJICAgICAgICsrYWNjZWw7CisJCX0KKwkJaWYgKCBzdHJjbXAoYXJndltpXSwgIi1zeW5jIikgPT0gMCApIHsKKyAJCSAgICAgICArK3N5bmM7CisJCX0KKwkJaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItaCIsIDIpID09IDAgKSB7CisgCQkgICAgICAgcHJpbnRmKAorIlVzYWdlOiAlcyBbLXR3aWNlXSBbLWxvZ29dIFstbG9nb2N1cnNvcl0gWy1zbG93XSBbLWJwcCBuXSBbLWdhbW1hIG5dIFstbm9mcmFtZV0gWy1mc2FhXSBbLWFjY2VsXSBbLXN5bmNdIFstZnVsbHNjcmVlbl1cbiIsCisgCQkJICAgICAgYXJndlswXSk7CisJCQlleGl0KDApOworCQl9CisJfQorCWZvciAoIGk9MDsgaTxudW10ZXN0czsgKytpICkgeworIAkJUnVuR0xUZXN0KGFyZ2MsIGFyZ3YsIGxvZ28sIGxvZ29jdXJzb3IsIHNsb3dseSwgYnBwLCBnYW1tYSwgbm9mcmFtZSwgZnNhYSwgc3luYywgYWNjZWwpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2Vsc2UgLyogSEFWRV9PUEVOR0wgKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlwcmludGYoIk5vIE9wZW5HTCBzdXBwb3J0IG9uIHRoaXMgc3lzdGVtXG4iKTsKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIEhBVkVfT1BFTkdMICovCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2YzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0aHJlYWQuYwpAQCAtMCwwICsxLDgyIEBACisKKy8qIFNpbXBsZSB0ZXN0IG9mIHRoZSBTREwgdGhyZWFkaW5nIGNvZGUgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisKK3N0YXRpYyBpbnQgYWxpdmUgPSAwOworCisvKiBDYWxsIHRoaXMgaW5zdGVhZCBvZiBleGl0KCksIHNvIHdlIGNhbiBjbGVhbiB1cCBTREw6IGF0ZXhpdCgpIGlzIGV2aWwuICovCitzdGF0aWMgdm9pZCBxdWl0KGludCByYykKK3sKKwlTRExfUXVpdCgpOworCWV4aXQocmMpOworfQorCitpbnQgU0RMQ0FMTCBUaHJlYWRGdW5jKHZvaWQgKmRhdGEpCit7CisJcHJpbnRmKCJTdGFydGVkIHRocmVhZCAlczogTXkgdGhyZWFkIGlkIGlzICV1XG4iLAorCQkJCShjaGFyICopZGF0YSwgU0RMX1RocmVhZElEKCkpOworCXdoaWxlICggYWxpdmUgKSB7CisJCXByaW50ZigiVGhyZWFkICclcycgaXMgYWxpdmUhXG4iLCAoY2hhciAqKWRhdGEpOworCQlTRExfRGVsYXkoMSoxMDAwKTsKKwl9CisJcHJpbnRmKCJUaHJlYWQgJyVzJyBleGl0aW5nIVxuIiwgKGNoYXIgKilkYXRhKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIGtpbGxlZChpbnQgc2lnKQoreworCXByaW50ZigiS2lsbGVkIHdpdGggU0lHVEVSTSwgd2FpdGluZyA1IHNlY29uZHMgdG8gZXhpdFxuIik7CisJU0RMX0RlbGF5KDUqMTAwMCk7CisJYWxpdmUgPSAwOworCXF1aXQoMCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJU0RMX1RocmVhZCAqdGhyZWFkOworCisJLyogTG9hZCB0aGUgU0RMIGxpYnJhcnkgKi8KKwlpZiAoIFNETF9Jbml0KDApIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBpbml0aWFsaXplIFNETDogJXNcbiIsU0RMX0dldEVycm9yKCkpOworCQlyZXR1cm4oMSk7CisJfQorCisJYWxpdmUgPSAxOworCXRocmVhZCA9IFNETF9DcmVhdGVUaHJlYWQoVGhyZWFkRnVuYywgIiMxIik7CisJaWYgKCB0aHJlYWQgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBjcmVhdGUgdGhyZWFkOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCQlxdWl0KDEpOworCX0KKwlTRExfRGVsYXkoNSoxMDAwKTsKKwlwcmludGYoIldhaXRpbmcgZm9yIHRocmVhZCAjMVxuIik7CisJYWxpdmUgPSAwOworCVNETF9XYWl0VGhyZWFkKHRocmVhZCwgTlVMTCk7CisKKwlhbGl2ZSA9IDE7CisJdGhyZWFkID0gU0RMX0NyZWF0ZVRocmVhZChUaHJlYWRGdW5jLCAiIzIiKTsKKwlpZiAoIHRocmVhZCA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGNyZWF0ZSB0aHJlYWQ6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMSk7CisJfQorCVNETF9EZWxheSg1KjEwMDApOworCXByaW50ZigiS2lsbGluZyB0aHJlYWQgIzJcbiIpOworCVNETF9LaWxsVGhyZWFkKHRocmVhZCk7CisKKwlhbGl2ZSA9IDE7CisJc2lnbmFsKFNJR1RFUk0sIGtpbGxlZCk7CisJdGhyZWFkID0gU0RMX0NyZWF0ZVRocmVhZChUaHJlYWRGdW5jLCAiIzMiKTsKKwlpZiAoIHRocmVhZCA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGNyZWF0ZSB0aHJlYWQ6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMSk7CisJfQorCXJhaXNlKFNJR1RFUk0pOworCisJU0RMX1F1aXQoKTsJLyogTmV2ZXIgcmVhY2hlZCAqLworCXJldHVybigwKTsJLyogTmV2ZXIgcmVhY2hlZCAqLworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGljb252LmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0aWNvbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQxNWQwCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGljb252LmMKQEAgLTAsMCArMSw3MyBAQAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIlNETC5oIgorCitzdGF0aWMgc2l6ZV90IHdpZGVsZW4oY2hhciAqZGF0YSkKK3sKKwlzaXplX3QgbGVuID0gMDsKKwlVaW50MzIgKnAgPSAoVWludDMyICopZGF0YTsKKwl3aGlsZSgqcCsrKSB7CisJCSsrbGVuOworCX0KKwlyZXR1cm4gbGVuOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNvbnN0IGNoYXIgKiBmb3JtYXRzW10gPSB7CisJCSJVVEY4IiwKKwkJIlVURi04IiwKKwkJIlVURjE2QkUiLAorCQkiVVRGLTE2QkUiLAorCQkiVVRGMTZMRSIsCisJCSJVVEYtMTZMRSIsCisJCSJVVEYzMkJFIiwKKwkJIlVURi0zMkJFIiwKKwkJIlVURjMyTEUiLAorCQkiVVRGLTMyTEUiLAorCQkiVUNTNCIsCisJCSJVQ1MtNCIsCisJfTsKKwljaGFyIGJ1ZmZlcltCVUZTSVpdOworCWNoYXIgKnVjczQ7CisJY2hhciAqdGVzdFsyXTsKKwlpbnQgaSwgaW5kZXggPSAwOworCUZJTEUgKmZpbGU7CisJaW50IGVycm9ycyA9IDA7CisKKwlpZiAoICFhcmd2WzFdICkgeworCQlhcmd2WzFdID0gInV0ZjgudHh0IjsKKwl9CisJZmlsZSA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOworCWlmICggIWZpbGUgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gJXNcbiIsIGFyZ3ZbMV0pOworCQlyZXR1cm4gKDEpOworCX0KKworCXdoaWxlICggZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZmlsZSkgKSB7CisJCS8qIENvbnZlcnQgdG8gVUNTLTQgKi8KKwkJc2l6ZV90IGxlbjsKKwkJdWNzNCA9IFNETF9pY29udl9zdHJpbmcoIlVDUy00IiwgIlVURi04IiwgYnVmZmVyLCBTRExfc3RybGVuKGJ1ZmZlcikrMSk7CisJCWxlbiA9ICh3aWRlbGVuKHVjczQpKzEpKjQ7CisJCWZvciAoIGkgPSAwOyBpIDwgU0RMX2FycmF5c2l6ZShmb3JtYXRzKTsgKytpICkgeworCQkJdGVzdFswXSA9IFNETF9pY29udl9zdHJpbmcoZm9ybWF0c1tpXSwgIlVDUy00IiwgdWNzNCwgbGVuKTsKKwkJCXRlc3RbMV0gPSBTRExfaWNvbnZfc3RyaW5nKCJVQ1MtNCIsIGZvcm1hdHNbaV0sIHRlc3RbMF0sIGxlbik7CisJCQlpZiAoICF0ZXN0WzFdIHx8IFNETF9tZW1jbXAodGVzdFsxXSwgdWNzNCwgbGVuKSAhPSAwICkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRkFJTDogJXNcbiIsIGZvcm1hdHNbaV0pOworCQkJCSsrZXJyb3JzOworCQkJfQorCQkJaWYgKCB0ZXN0WzBdICkgeworCQkJCVNETF9mcmVlKHRlc3RbMF0pOworCQkJfQorCQkJaWYgKCB0ZXN0WzFdICkgeworCQkJCVNETF9mcmVlKHRlc3RbMV0pOworCQkJfQorCQl9CisJCXRlc3RbMF0gPSBTRExfaWNvbnZfc3RyaW5nKCJVVEYtOCIsICJVQ1MtNCIsIHVjczQsIGxlbik7CisJCVNETF9mcmVlKHVjczQpOworCQlmcHV0cyh0ZXN0WzBdLCBzdGRvdXQpOworCQlTRExfZnJlZSh0ZXN0WzBdKTsKKwl9CisJcmV0dXJuIChlcnJvcnMgPyBlcnJvcnMgKyAxIDogMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0am95c3RpY2suYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3Rqb3lzdGljay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZDgyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0am95c3RpY2suYwpAQCAtMCwwICsxLDE4OCBAQAorCisvKiBTaW1wbGUgcHJvZ3JhbSB0byB0ZXN0IHRoZSBTREwgam95c3RpY2sgcm91dGluZXMgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworI2RlZmluZSBTQ1JFRU5fV0lEVEgJNjQwCisjZGVmaW5lIFNDUkVFTl9IRUlHSFQJNDgwCisKK3ZvaWQgV2F0Y2hKb3lzdGljayhTRExfSm95c3RpY2sgKmpveXN0aWNrKQoreworCVNETF9TdXJmYWNlICpzY3JlZW47CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgaSwgZG9uZTsKKwlTRExfRXZlbnQgZXZlbnQ7CisJaW50IHgsIHksIGRyYXc7CisJU0RMX1JlY3QgYXhpc19hcmVhWzJdOworCisJLyogU2V0IGEgdmlkZW8gbW9kZSB0byBkaXNwbGF5IGpveXN0aWNrIGF4aXMgcG9zaXRpb24gKi8KKwlzY3JlZW4gPSBTRExfU2V0VmlkZW9Nb2RlKFNDUkVFTl9XSURUSCwgU0NSRUVOX0hFSUdIVCwgMTYsIDApOworCWlmICggc2NyZWVuID09IE5VTEwgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0IHZpZGVvIG1vZGU6ICVzXG4iLFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFByaW50IGluZm8gYWJvdXQgdGhlIGpveXN0aWNrIHdlIGFyZSB3YXRjaGluZyAqLworCW5hbWUgPSBTRExfSm95c3RpY2tOYW1lKFNETF9Kb3lzdGlja0luZGV4KGpveXN0aWNrKSk7CisJcHJpbnRmKCJXYXRjaGluZyBqb3lzdGljayAlZDogKCVzKVxuIiwgU0RMX0pveXN0aWNrSW5kZXgoam95c3RpY2spLAorCSAgICAgICBuYW1lID8gbmFtZSA6ICJVbmtub3duIEpveXN0aWNrIik7CisJcHJpbnRmKCJKb3lzdGljayBoYXMgJWQgYXhlcywgJWQgaGF0cywgJWQgYmFsbHMsIGFuZCAlZCBidXR0b25zXG4iLAorCSAgICAgICBTRExfSm95c3RpY2tOdW1BeGVzKGpveXN0aWNrKSwgU0RMX0pveXN0aWNrTnVtSGF0cyhqb3lzdGljayksCisJICAgICAgIFNETF9Kb3lzdGlja051bUJhbGxzKGpveXN0aWNrKSxTRExfSm95c3RpY2tOdW1CdXR0b25zKGpveXN0aWNrKSk7CisKKwkvKiBJbml0aWFsaXplIGRyYXdpbmcgcmVjdGFuZ2xlcyAqLworCW1lbXNldChheGlzX2FyZWEsIDAsIChzaXplb2YgYXhpc19hcmVhKSk7CisJZHJhdyA9IDA7CisKKwkvKiBMb29wLCBnZXR0aW5nIGpveXN0aWNrIGV2ZW50cyEgKi8KKwlkb25lID0gMDsKKwl3aGlsZSAoICEgZG9uZSApIHsKKwkJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZldmVudCkgKSB7CisJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKwkJCSAgICBjYXNlIFNETF9KT1lBWElTTU9USU9OOgorCQkJCXByaW50ZigiSm95c3RpY2sgJWQgYXhpcyAlZCB2YWx1ZTogJWRcbiIsCisJCQkJICAgICAgIGV2ZW50LmpheGlzLndoaWNoLAorCQkJCSAgICAgICBldmVudC5qYXhpcy5heGlzLAorCQkJCSAgICAgICBldmVudC5qYXhpcy52YWx1ZSk7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBTRExfSk9ZSEFUTU9USU9OOgorCQkJCXByaW50ZigiSm95c3RpY2sgJWQgaGF0ICVkIHZhbHVlOiIsCisJCQkJICAgICAgIGV2ZW50LmpoYXQud2hpY2gsCisJCQkJICAgICAgIGV2ZW50LmpoYXQuaGF0KTsKKwkJCQlpZiAoIGV2ZW50LmpoYXQudmFsdWUgPT0gU0RMX0hBVF9DRU5URVJFRCApCisJCQkJCXByaW50ZigiIGNlbnRlcmVkIik7CisJCQkJaWYgKCBldmVudC5qaGF0LnZhbHVlICYgU0RMX0hBVF9VUCApCisJCQkJCXByaW50ZigiIHVwIik7CisJCQkJaWYgKCBldmVudC5qaGF0LnZhbHVlICYgU0RMX0hBVF9SSUdIVCApCisJCQkJCXByaW50ZigiIHJpZ2h0Iik7CisJCQkJaWYgKCBldmVudC5qaGF0LnZhbHVlICYgU0RMX0hBVF9ET1dOICkKKwkJCQkJcHJpbnRmKCIgZG93biIpOworCQkJCWlmICggZXZlbnQuamhhdC52YWx1ZSAmIFNETF9IQVRfTEVGVCApCisJCQkJCXByaW50ZigiIGxlZnQiKTsKKwkJCQlwcmludGYoIlxuIik7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBTRExfSk9ZQkFMTE1PVElPTjoKKwkJCQlwcmludGYoIkpveXN0aWNrICVkIGJhbGwgJWQgZGVsdGE6ICglZCwlZClcbiIsCisJCQkJICAgICAgIGV2ZW50LmpiYWxsLndoaWNoLAorCQkJCSAgICAgICBldmVudC5qYmFsbC5iYWxsLAorCQkJCSAgICAgICBldmVudC5qYmFsbC54cmVsLAorCQkJCSAgICAgICBldmVudC5qYmFsbC55cmVsKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFNETF9KT1lCVVRUT05ET1dOOgorCQkJCXByaW50ZigiSm95c3RpY2sgJWQgYnV0dG9uICVkIGRvd25cbiIsCisJCQkJICAgICAgIGV2ZW50LmpidXR0b24ud2hpY2gsCisJCQkJICAgICAgIGV2ZW50LmpidXR0b24uYnV0dG9uKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFNETF9KT1lCVVRUT05VUDoKKwkJCQlwcmludGYoIkpveXN0aWNrICVkIGJ1dHRvbiAlZCB1cFxuIiwKKwkJCQkgICAgICAgZXZlbnQuamJ1dHRvbi53aGljaCwKKwkJCQkgICAgICAgZXZlbnQuamJ1dHRvbi5idXR0b24pOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgU0RMX0tFWURPV046CisJCQkJaWYgKCBldmVudC5rZXkua2V5c3ltLnN5bSAhPSBTRExLX0VTQ0FQRSApIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIEZhbGwgdGhyb3VnaCB0byBzaWduYWwgcXVpdCAqLworCQkJICAgIGNhc2UgU0RMX1FVSVQ6CisJCQkJZG9uZSA9IDE7CisJCQkJYnJlYWs7CisJCQkgICAgZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBVcGRhdGUgdmlzdWFsIGpveXN0aWNrIHN0YXRlICovCisJCWZvciAoIGk9MDsgaTxTRExfSm95c3RpY2tOdW1CdXR0b25zKGpveXN0aWNrKTsgKytpICkgeworCQkJU0RMX1JlY3QgYXJlYTsKKworCQkJYXJlYS54ID0gaSozNDsKKwkJCWFyZWEueSA9IFNDUkVFTl9IRUlHSFQtMzQ7CisJCQlhcmVhLncgPSAzMjsKKwkJCWFyZWEuaCA9IDMyOworCQkJaWYgKFNETF9Kb3lzdGlja0dldEJ1dHRvbihqb3lzdGljaywgaSkgPT0gU0RMX1BSRVNTRUQpIHsKKwkJCQlTRExfRmlsbFJlY3Qoc2NyZWVuLCAmYXJlYSwgMHhGRkZGKTsKKwkJCX0gZWxzZSB7CisJCQkJU0RMX0ZpbGxSZWN0KHNjcmVlbiwgJmFyZWEsIDB4MDAwMCk7CisJCQl9CisJCQlTRExfVXBkYXRlUmVjdHMoc2NyZWVuLCAxLCAmYXJlYSk7CisJCX0KKworCQkvKiBFcmFzZSBwcmV2aW91cyBheGVzICovCisJCVNETF9GaWxsUmVjdChzY3JlZW4sICZheGlzX2FyZWFbZHJhd10sIDB4MDAwMCk7CisKKwkJLyogRHJhdyB0aGUgWC9ZIGF4aXMgKi8KKwkJZHJhdyA9ICFkcmF3OworCQl4ID0gKCgoaW50KVNETF9Kb3lzdGlja0dldEF4aXMoam95c3RpY2ssIDApKSszMjc2OCk7CisJCXggKj0gU0NSRUVOX1dJRFRIOworCQl4IC89IDY1NTM1OworCQlpZiAoIHggPCAwICkgeworCQkJeCA9IDA7CisJCX0gZWxzZQorCQlpZiAoIHggPiAoU0NSRUVOX1dJRFRILTE2KSApIHsKKwkJCXggPSBTQ1JFRU5fV0lEVEgtMTY7CisJCX0KKwkJeSA9ICgoKGludClTRExfSm95c3RpY2tHZXRBeGlzKGpveXN0aWNrLCAxKSkrMzI3NjgpOworCQl5ICo9IFNDUkVFTl9IRUlHSFQ7CisJCXkgLz0gNjU1MzU7CisJCWlmICggeSA8IDAgKSB7CisJCQl5ID0gMDsKKwkJfSBlbHNlCisJCWlmICggeSA+IChTQ1JFRU5fSEVJR0hULTE2KSApIHsKKwkJCXkgPSBTQ1JFRU5fSEVJR0hULTE2OworCQl9CisJCWF4aXNfYXJlYVtkcmF3XS54ID0gKFNpbnQxNil4OworCQlheGlzX2FyZWFbZHJhd10ueSA9IChTaW50MTYpeTsKKwkJYXhpc19hcmVhW2RyYXddLncgPSAxNjsKKwkJYXhpc19hcmVhW2RyYXddLmggPSAxNjsKKwkJU0RMX0ZpbGxSZWN0KHNjcmVlbiwgJmF4aXNfYXJlYVtkcmF3XSwgMHhGRkZGKTsKKworCQlTRExfVXBkYXRlUmVjdHMoc2NyZWVuLCAyLCBheGlzX2FyZWEpOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljb25zdCBjaGFyICpuYW1lOworCWludCBpOworCVNETF9Kb3lzdGljayAqam95c3RpY2s7CisKKwkvKiBJbml0aWFsaXplIFNETCAoTm90ZTogdmlkZW8gaXMgcmVxdWlyZWQgdG8gc3RhcnQgZXZlbnQgbG9vcCkgKi8KKwlpZiAoIFNETF9Jbml0KFNETF9JTklUX1ZJREVPfFNETF9JTklUX0pPWVNUSUNLKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLFNETF9HZXRFcnJvcigpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgam95c3RpY2tzICovCisJcHJpbnRmKCJUaGVyZSBhcmUgJWQgam95c3RpY2tzIGF0dGFjaGVkXG4iLCBTRExfTnVtSm95c3RpY2tzKCkpOworCWZvciAoIGk9MDsgaTxTRExfTnVtSm95c3RpY2tzKCk7ICsraSApIHsKKwkJbmFtZSA9IFNETF9Kb3lzdGlja05hbWUoaSk7CisJCXByaW50ZigiSm95c3RpY2sgJWQ6ICVzXG4iLGksbmFtZSA/IG5hbWUgOiAiVW5rbm93biBKb3lzdGljayIpOworCQlqb3lzdGljayA9IFNETF9Kb3lzdGlja09wZW4oaSk7CisJCWlmIChqb3lzdGljayA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlNETF9Kb3lzdGlja09wZW4oJWQpIGZhaWxlZDogJXNcbiIsIGksIFNETF9HZXRFcnJvcigpKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiICAgICAgIGF4ZXM6ICVkXG4iLCBTRExfSm95c3RpY2tOdW1BeGVzKGpveXN0aWNrKSk7CisJCQlwcmludGYoIiAgICAgIGJhbGxzOiAlZFxuIiwgU0RMX0pveXN0aWNrTnVtQmFsbHMoam95c3RpY2spKTsKKwkJCXByaW50ZigiICAgICAgIGhhdHM6ICVkXG4iLCBTRExfSm95c3RpY2tOdW1IYXRzKGpveXN0aWNrKSk7CisJCQlwcmludGYoIiAgICBidXR0b25zOiAlZFxuIiwgU0RMX0pveXN0aWNrTnVtQnV0dG9ucyhqb3lzdGljaykpOworCQkJU0RMX0pveXN0aWNrQ2xvc2Uoam95c3RpY2spOworCQl9CisJfQorCisJaWYgKCBhcmd2WzFdICkgeworCQlqb3lzdGljayA9IFNETF9Kb3lzdGlja09wZW4oYXRvaShhcmd2WzFdKSk7CisJCWlmICggam95c3RpY2sgPT0gTlVMTCApIHsKKwkJCXByaW50ZigiQ291bGRuJ3Qgb3BlbiBqb3lzdGljayAlZDogJXNcbiIsIGF0b2koYXJndlsxXSksCisJCQkgICAgICAgU0RMX0dldEVycm9yKCkpOworCQl9IGVsc2UgeworCQkJV2F0Y2hKb3lzdGljayhqb3lzdGljayk7CisJCQlTRExfSm95c3RpY2tDbG9zZShqb3lzdGljayk7CisJCX0KKwl9CisJU0RMX1F1aXRTdWJTeXN0ZW0oU0RMX0lOSVRfVklERU98U0RMX0lOSVRfSk9ZU1RJQ0spOworCisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGtleXMuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RrZXlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyMGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3RrZXlzLmMKQEAgLTAsMCArMSwyNSBAQAorCisvKiBQcmludCBvdXQgYWxsIHRoZSBrZXlzeW1zIHdlIGhhdmUsIGp1c3QgdG8gdmVyaWZ5IHRoZW0gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNETC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCVNETEtleSBrZXk7CisKKwlpZiAoIFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLAorCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJZXhpdCgxKTsKKwl9CisJZm9yICgga2V5PVNETEtfRklSU1Q7IGtleTxTRExLX0xBU1Q7ICsra2V5ICkgeworCQlwcmludGYoIktleSAjJWQsIFwiJXNcIlxuIiwga2V5LCBTRExfR2V0S2V5TmFtZShrZXkpKTsKKwl9CisJU0RMX1F1aXQoKTsKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0bG9hZHNvLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0bG9hZHNvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljMTRjNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3Rsb2Fkc28uYwpAQCAtMCwwICsxLDcxIEBACisKKy8qIFRlc3QgcHJvZ3JhbSB0byB0ZXN0IGR5bmFtaWMgbG9hZGluZyB3aXRoIHRoZSBsb2Fkc28gc3Vic3lzdGVtLiAKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKK3R5cGVkZWYgaW50ICgqZm50eXBlKShjb25zdCBjaGFyICopOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCByZXR2YWwgPSAwOworCWludCBoZWxsbyA9IDA7CisJY29uc3QgY2hhciAqbGlibmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqc3ltbmFtZSA9IE5VTEw7CisJdm9pZCAqbGliID0gTlVMTDsKKwlmbnR5cGUgZm4gPSBOVUxMOworCisJaWYgKGFyZ2MgIT0gMykgeworCQljb25zdCBjaGFyICphcHAgPSBhcmd2WzBdOworCQlmcHJpbnRmKHN0ZGVyciwgIlVTQUdFOiAlcyA8bGlicmFyeT4gPGZ1bmN0aW9ubmFtZT5cbiIsIGFwcCk7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICVzIC0taGVsbG8gPGxpYiB3aXRoIHB1dHMoKT5cbiIsIGFwcCk7CisJCXJldHVybiAxOworCX0KKworCS8qIEluaXRpYWxpemUgU0RMICovCisJaWYgKCBTRExfSW5pdCgwKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuIDI7CisJfQorCisJaWYgKHN0cmNtcChhcmd2WzFdLCAiLS1oZWxsbyIpID09IDApIHsKKwkJaGVsbG8gPSAxOworCQlsaWJuYW1lID0gYXJndlsyXTsKKwkJc3ltbmFtZSA9ICJwdXRzIjsKKwl9IGVsc2UgeworCQlsaWJuYW1lID0gYXJndlsxXTsKKwkJc3ltbmFtZSA9IGFyZ3ZbMl07CisJfQorCisJbGliID0gU0RMX0xvYWRPYmplY3QobGlibmFtZSk7CisgICAgICAgIGlmIChsaWIgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlNETF9Mb2FkT2JqZWN0KCclcycpIGZhaWxlZDogJXNcbiIsCisJCSAgICAgICAgbGlibmFtZSwgU0RMX0dldEVycm9yKCkpOworCQlyZXR2YWwgPSAzOworCX0gZWxzZSB7CisJCWZuID0gKGZudHlwZSkgU0RMX0xvYWRGdW5jdGlvbihsaWIsIHN5bW5hbWUpOworCQlpZiAoZm4gPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJTRExfTG9hZEZ1bmN0aW9uKCclcycpIGZhaWxlZDogJXNcbiIsCisJCQkgICAgICAgIHN5bW5hbWUsIFNETF9HZXRFcnJvcigpKTsKKwkJCXJldHZhbCA9IDQ7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIkZvdW5kICVzIGluICVzIGF0ICVwXG4iLCBzeW1uYW1lLCBsaWJuYW1lLCBmbik7CisJCQlpZiAoaGVsbG8pIHsKKwkJCQlwcmludGYoIkNhbGxpbmcgZnVuY3Rpb24uLi5cbiIpOworCQkJCWZmbHVzaChzdGRvdXQpOworCQkJCWZuKCIgICAgIEhFTExPLCBXT1JMRCFcbiIpOworCQkJCXByaW50ZigiLi4uYXBwYXJlbnRseSwgd2Ugc3Vydml2ZWQuICA6KVxuIik7CisJCQkJcHJpbnRmKCJVbmxvYWRpbmcgbGlicmFyeS4uLlxuIik7CisJCQkJZmZsdXNoKHN0ZG91dCk7CisJCQl9CisJCX0KKwkJU0RMX1VubG9hZE9iamVjdChsaWIpOworCX0KKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KKworCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0bG9jay5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGE0YjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdGxvY2suYwpAQCAtMCwwICsxLDEwMiBAQAorCisvKiBUZXN0IHRoZSB0aHJlYWQgYW5kIG11dGV4IGxvY2tpbmcgZnVuY3Rpb25zIAorICAgQWxzbyBleGVyY2lzZXMgdGhlIHN5c3RlbSdzIHNpZ25hbC90aHJlYWQgaW50ZXJhY3Rpb24KKyovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisjaW5jbHVkZSAiU0RMX211dGV4LmgiCisjaW5jbHVkZSAiU0RMX3RocmVhZC5oIgorCitzdGF0aWMgU0RMX211dGV4ICptdXRleCA9IE5VTEw7CitzdGF0aWMgVWludDMyIG1haW50aHJlYWQ7CitzdGF0aWMgU0RMX1RocmVhZCAqdGhyZWFkc1s2XTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgZG90ZXJtaW5hdGUgPSAwOworCisvKgorICogU0RMX1F1aXQoKSBzaG91bGRuJ3QgYmUgdXNlZCB3aXRoIGF0ZXhpdCgpIGRpcmVjdGx5IGJlY2F1c2UKKyAqICBjYWxsaW5nIGNvbnZlbnRpb25zIG1heSBkaWZmZXIuLi4KKyAqLworc3RhdGljIHZvaWQgU0RMX1F1aXRfV3JhcHBlcih2b2lkKQoreworCVNETF9RdWl0KCk7Cit9CisKK3ZvaWQgcHJpbnRpZCh2b2lkKQoreworCXByaW50ZigiUHJvY2VzcyAldTogIGV4aXRpbmdcbiIsIFNETF9UaHJlYWRJRCgpKTsKK30KKwkKK3ZvaWQgdGVybWluYXRlKGludCBzaWcpCit7CisJc2lnbmFsKFNJR0lOVCwgdGVybWluYXRlKTsKKwlkb3Rlcm1pbmF0ZSA9IDE7Cit9Cit2b2lkIGNsb3NlbXV0ZXgoaW50IHNpZykKK3sKKwlVaW50MzIgaWQgPSBTRExfVGhyZWFkSUQoKTsKKwlpbnQgaTsKKwlwcmludGYoIlByb2Nlc3MgJXU6ICBDbGVhbmluZyB1cC4uLlxuIiwgaWQgPT0gbWFpbnRocmVhZCA/IDAgOiBpZCk7CisJZm9yICggaT0wOyBpPDY7ICsraSApCisJCVNETF9LaWxsVGhyZWFkKHRocmVhZHNbaV0pOworCVNETF9EZXN0cm95TXV0ZXgobXV0ZXgpOworCWV4aXQoc2lnKTsKK30KK2ludCBTRExDQUxMIFJ1bih2b2lkICpkYXRhKQoreworCWlmICggU0RMX1RocmVhZElEKCkgPT0gbWFpbnRocmVhZCApCisJCXNpZ25hbChTSUdURVJNLCBjbG9zZW11dGV4KTsKKwl3aGlsZSAoIDEgKSB7CisJCXByaW50ZigiUHJvY2VzcyAldSByZWFkeSB0byB3b3JrXG4iLCBTRExfVGhyZWFkSUQoKSk7CisJCWlmICggU0RMX211dGV4UChtdXRleCkgPCAwICkgeworCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBsb2NrIG11dGV4OiAlcyIsIFNETF9HZXRFcnJvcigpKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJcHJpbnRmKCJQcm9jZXNzICV1LCB3b3JraW5nIVxuIiwgU0RMX1RocmVhZElEKCkpOworCQlTRExfRGVsYXkoMSoxMDAwKTsKKwkJcHJpbnRmKCJQcm9jZXNzICV1LCBkb25lIVxuIiwgU0RMX1RocmVhZElEKCkpOworCQlpZiAoIFNETF9tdXRleFYobXV0ZXgpIDwgMCApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgdW5sb2NrIG11dGV4OiAlcyIsIFNETF9HZXRFcnJvcigpKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJLyogSWYgdGhpcyBzbGVlcCBpc24ndCBkb25lLCB0aGVuIHRocmVhZHMgbWF5IHN0YXJ2ZSAqLworCQlTRExfRGVsYXkoMTApOworCQlpZiAoU0RMX1RocmVhZElEKCkgPT0gbWFpbnRocmVhZCAmJiBkb3Rlcm1pbmF0ZSkgeworCQkJcHJpbnRmKCJQcm9jZXNzICV1OiAgcmFpc2luZyBTSUdURVJNXG4iLCBTRExfVGhyZWFkSUQoKSk7CisJCQlyYWlzZShTSUdURVJNKTsKKwkJfQorCX0KKwlyZXR1cm4oMCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisJaW50IG1heHByb2MgPSA2OworCisJLyogTG9hZCB0aGUgU0RMIGxpYnJhcnkgKi8KKwlpZiAoIFNETF9Jbml0KDApIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCQlleGl0KDEpOworCX0KKwlhdGV4aXQoU0RMX1F1aXRfV3JhcHBlcik7CisKKwlpZiAoIChtdXRleD1TRExfQ3JlYXRlTXV0ZXgoKSkgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBjcmVhdGUgbXV0ZXg6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJCWV4aXQoMSk7CisJfQorCisJbWFpbnRocmVhZCA9IFNETF9UaHJlYWRJRCgpOworCXByaW50ZigiTWFpbiB0aHJlYWQ6ICV1XG4iLCBtYWludGhyZWFkKTsKKwlhdGV4aXQocHJpbnRpZCk7CisJZm9yICggaT0wOyBpPG1heHByb2M7ICsraSApIHsKKwkJaWYgKCAodGhyZWFkc1tpXT1TRExfQ3JlYXRlVGhyZWFkKFJ1biwgTlVMTCkpID09IE5VTEwgKQorCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBjcmVhdGUgdGhyZWFkIVxuIik7CisJfQorCXNpZ25hbChTSUdJTlQsIHRlcm1pbmF0ZSk7CisJUnVuKE5VTEwpOworCisJcmV0dXJuKDApOwkvKiBOZXZlciByZWFjaGVkICovCit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0b3ZlcmxheS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdG92ZXJsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTUzZjllCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdG92ZXJsYXkuYwpAQCAtMCwwICsxLDU5NCBAQAorCisvKiBCcmluZyB1cCBhIHdpbmRvdyBhbmQgcGxheSB3aXRoIGl0ICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEJFTkNITUFSS19TREwKKworI2RlZmluZSBOT1RJQ0UoWCkJcHJpbnRmKCIlcyIsIFgpOworCisjZGVmaW5lIFdJTkRPV19XSURUSCAgNjQwCisjZGVmaW5lIFdJTkRPV19IRUlHSFQgNDgwCisKKyNpbmNsdWRlICJTREwuaCIKKworU0RMX1N1cmZhY2UgKnNjcmVlbiwgKnBpYzsKK1NETF9PdmVybGF5ICpvdmVybGF5OworaW50IHNjYWxlOworaW50IG1vbm9jaHJvbWU7CitpbnQgbHVtaW5hbmNlOworaW50IHcsIGg7CisKKy8qIENhbGwgdGhpcyBpbnN0ZWFkIG9mIGV4aXQoKSwgc28gd2UgY2FuIGNsZWFuIHVwIFNETDogYXRleGl0KCkgaXMgZXZpbC4gKi8KK3N0YXRpYyB2b2lkIHF1aXQoaW50IHJjKQoreworCVNETF9RdWl0KCk7CisJZXhpdChyYyk7Cit9CisKKy8qIE5PVEU6IFRoZXNlIFJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgbm90IGludGVuZGVkIGZvciBzcGVlZCwKKyAgICAgICAgIG9ubHkgYXMgZXhhbXBsZXMuCisqLworCit2b2lkIFJHQnRvWVVWKFVpbnQ4ICpyZ2IsIGludCAqeXV2LCBpbnQgbW9ub2Nocm9tZSwgaW50IGx1bWluYW5jZSkKK3sKKyAgICBpZiAobW9ub2Nocm9tZSkKKyAgICB7CisjaWYgMSAvKiB0aGVzZSBhcmUgdGhlIHR3byBmb3JtdWxhcyB0aGF0IEkgZm91bmQgb24gdGhlIEZvdXJDQyBzaXRlLi4uICovCisgICAgICAgIHl1dlswXSA9IDAuMjk5KnJnYlswXSArIDAuNTg3KnJnYlsxXSArIDAuMTE0KnJnYlsyXTsKKyAgICAgICAgeXV2WzFdID0gMTI4OworICAgICAgICB5dXZbMl0gPSAxMjg7CisjZWxzZQorICAgICAgICB5dXZbMF0gPSAoMC4yNTcgKiByZ2JbMF0pICsgKDAuNTA0ICogcmdiWzFdKSArICgwLjA5OCAqIHJnYlsyXSkgKyAxNjsKKyAgICAgICAgeXV2WzFdID0gMTI4OworICAgICAgICB5dXZbMl0gPSAxMjg7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZiAxIC8qIHRoZXNlIGFyZSB0aGUgdHdvIGZvcm11bGFzIHRoYXQgSSBmb3VuZCBvbiB0aGUgRm91ckNDIHNpdGUuLi4gKi8KKyAgICAgICAgeXV2WzBdID0gMC4yOTkqcmdiWzBdICsgMC41ODcqcmdiWzFdICsgMC4xMTQqcmdiWzJdOworICAgICAgICB5dXZbMV0gPSAocmdiWzJdLXl1dlswXSkqMC41NjUgKyAxMjg7CisgICAgICAgIHl1dlsyXSA9IChyZ2JbMF0teXV2WzBdKSowLjcxMyArIDEyODsKKyNlbHNlCisgICAgICAgIHl1dlswXSA9ICgwLjI1NyAqIHJnYlswXSkgKyAoMC41MDQgKiByZ2JbMV0pICsgKDAuMDk4ICogcmdiWzJdKSArIDE2OworICAgICAgICB5dXZbMV0gPSAxMjggLSAoMC4xNDggKiByZ2JbMF0pIC0gKDAuMjkxICogcmdiWzFdKSArICgwLjQzOSAqIHJnYlsyXSk7CisgICAgICAgIHl1dlsyXSA9IDEyOCArICgwLjQzOSAqIHJnYlswXSkgLSAoMC4zNjggKiByZ2JbMV0pIC0gKDAuMDcxICogcmdiWzJdKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChsdW1pbmFuY2UhPTEwMCkKKyAgICB7CisgICAgICAgIHl1dlswXT15dXZbMF0qbHVtaW5hbmNlLzEwMDsKKyAgICAgICAgaWYgKHl1dlswXT4yNTUpCisgICAgICAgICAgICB5dXZbMF09MjU1OworICAgIH0KKworICAgIC8qIGNsYW1wIHZhbHVlcy4uLmlmIHlvdSBuZWVkIHRvLCB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgYSBuZWVkICovCisgICAgLyoKKyAgICBmb3IoaT0wO2k8MztpKyspCisgICAgeworICAgICAgICBpZih5dXZbaV08MCkKKyAgICAgICAgICAgIHl1dltpXT0wOworICAgICAgICBpZih5dXZbaV0+MjU1KQorICAgICAgICAgICAgeXV2W2ldPTI1NTsKKyAgICB9CisgICAgKi8KK30KKwordm9pZCBDb252ZXJ0UkdCdG9ZVjEyKFNETF9TdXJmYWNlICpzLCBTRExfT3ZlcmxheSAqbywgaW50IG1vbm9jaHJvbWUsIGludCBsdW1pbmFuY2UpCit7CisJaW50IHgseTsKKwlpbnQgeXV2WzNdOworCVVpbnQ4ICpwLCpvcFszXTsKKworCVNETF9Mb2NrU3VyZmFjZShzKTsKKwlTRExfTG9ja1lVVk92ZXJsYXkobyk7CisKKwkvKiBCbGFjayBpbml0aWFsaXphdGlvbiAqLworCS8qCisJbWVtc2V0KG8tPnBpeGVsc1swXSwwLG8tPnBpdGNoZXNbMF0qby0+aCk7CisJbWVtc2V0KG8tPnBpeGVsc1sxXSwxMjgsby0+cGl0Y2hlc1sxXSooKG8tPmgrMSkvMikpOworCW1lbXNldChvLT5waXhlbHNbMl0sMTI4LG8tPnBpdGNoZXNbMl0qKChvLT5oKzEpLzIpKTsKKwkqLworCisJLyogQ29udmVydCAqLworCWZvcih5PTA7IHk8cy0+aCAmJiB5PG8tPmg7IHkrKykKKwl7CisJCXA9KChVaW50OCAqKSBzLT5waXhlbHMpK3MtPnBpdGNoKnk7CisJCW9wWzBdPW8tPnBpeGVsc1swXStvLT5waXRjaGVzWzBdKnk7CisJCW9wWzFdPW8tPnBpeGVsc1sxXStvLT5waXRjaGVzWzFdKih5LzIpOworCQlvcFsyXT1vLT5waXhlbHNbMl0rby0+cGl0Y2hlc1syXSooeS8yKTsKKwkJZm9yKHg9MDsgeDxzLT53ICYmIHg8by0+dzsgeCsrKQorCQl7CisJCQlSR0J0b1lVVihwLCB5dXYsIG1vbm9jaHJvbWUsIGx1bWluYW5jZSk7CisJCQkqKG9wWzBdKyspPXl1dlswXTsKKwkJCWlmKHglMj09MCAmJiB5JTI9PTApCisJCQl7CisJCQkJKihvcFsxXSsrKT15dXZbMl07CisJCQkJKihvcFsyXSsrKT15dXZbMV07CisJCQl9CisJCQlwKz1zLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJCX0KKwl9CisKKwlTRExfVW5sb2NrWVVWT3ZlcmxheShvKTsKKwlTRExfVW5sb2NrU3VyZmFjZShzKTsKK30KKwordm9pZCBDb252ZXJ0UkdCdG9JWVVWKFNETF9TdXJmYWNlICpzLCBTRExfT3ZlcmxheSAqbywgaW50IG1vbm9jaHJvbWUsIGludCBsdW1pbmFuY2UpCit7CisJaW50IHgseTsKKwlpbnQgeXV2WzNdOworCVVpbnQ4ICpwLCpvcFszXTsKKworCVNETF9Mb2NrU3VyZmFjZShzKTsKKwlTRExfTG9ja1lVVk92ZXJsYXkobyk7CisKKwkvKiBCbGFjayBpbml0aWFsaXphdGlvbiAqLworCS8qCisJbWVtc2V0KG8tPnBpeGVsc1swXSwwLG8tPnBpdGNoZXNbMF0qby0+aCk7CisJbWVtc2V0KG8tPnBpeGVsc1sxXSwxMjgsby0+cGl0Y2hlc1sxXSooKG8tPmgrMSkvMikpOworCW1lbXNldChvLT5waXhlbHNbMl0sMTI4LG8tPnBpdGNoZXNbMl0qKChvLT5oKzEpLzIpKTsKKwkqLworCisJLyogQ29udmVydCAqLworCWZvcih5PTA7IHk8cy0+aCAmJiB5PG8tPmg7IHkrKykKKwl7CisJCXA9KChVaW50OCAqKSBzLT5waXhlbHMpK3MtPnBpdGNoKnk7CisJCW9wWzBdPW8tPnBpeGVsc1swXStvLT5waXRjaGVzWzBdKnk7CisJCW9wWzFdPW8tPnBpeGVsc1sxXStvLT5waXRjaGVzWzFdKih5LzIpOworCQlvcFsyXT1vLT5waXhlbHNbMl0rby0+cGl0Y2hlc1syXSooeS8yKTsKKwkJZm9yKHg9MDsgeDxzLT53ICYmIHg8by0+dzsgeCsrKQorCQl7CisJCQlSR0J0b1lVVihwLHl1diwgbW9ub2Nocm9tZSwgbHVtaW5hbmNlKTsKKwkJCSoob3BbMF0rKyk9eXV2WzBdOworCQkJaWYoeCUyPT0wICYmIHklMj09MCkKKwkJCXsKKwkJCQkqKG9wWzFdKyspPXl1dlsxXTsKKwkJCQkqKG9wWzJdKyspPXl1dlsyXTsKKwkJCX0KKwkJCXArPXMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKKwkJfQorCX0KKworCVNETF9VbmxvY2tZVVZPdmVybGF5KG8pOworCVNETF9VbmxvY2tTdXJmYWNlKHMpOworfQorCit2b2lkIENvbnZlcnRSR0J0b1VZVlkoU0RMX1N1cmZhY2UgKnMsIFNETF9PdmVybGF5ICpvLCBpbnQgbW9ub2Nocm9tZSwgaW50IGx1bWluYW5jZSkKK3sKKwlpbnQgeCx5OworCWludCB5dXZbM107CisJVWludDggKnAsKm9wOworCisJU0RMX0xvY2tTdXJmYWNlKHMpOworCVNETF9Mb2NrWVVWT3ZlcmxheShvKTsKKworCWZvcih5PTA7IHk8cy0+aCAmJiB5PG8tPmg7IHkrKykKKwl7CisJCXA9KChVaW50OCAqKSBzLT5waXhlbHMpK3MtPnBpdGNoKnk7CisJCW9wPW8tPnBpeGVsc1swXStvLT5waXRjaGVzWzBdKnk7CisJCWZvcih4PTA7IHg8cy0+dyAmJiB4PG8tPnc7IHgrKykKKwkJeworCQkJUkdCdG9ZVVYocCwgeXV2LCBtb25vY2hyb21lLCBsdW1pbmFuY2UpOworCQkJaWYoeCUyPT0wKQorCQkJeworCQkJCSoob3ArKyk9eXV2WzFdOworCQkJCSoob3ArKyk9eXV2WzBdOworCQkJCSoob3ArKyk9eXV2WzJdOworCQkJfQorCQkJZWxzZQorCQkJCSoob3ArKyk9eXV2WzBdOworCisJCQlwKz1zLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJCX0KKwl9CisKKwlTRExfVW5sb2NrWVVWT3ZlcmxheShvKTsKKwlTRExfVW5sb2NrU3VyZmFjZShzKTsKK30KKwordm9pZCBDb252ZXJ0UkdCdG9ZVllVKFNETF9TdXJmYWNlICpzLCBTRExfT3ZlcmxheSAqbywgaW50IG1vbm9jaHJvbWUsIGludCBsdW1pbmFuY2UpCit7CisJaW50IHgseTsKKwlpbnQgeXV2WzNdOworCVVpbnQ4ICpwLCpvcDsKKworCVNETF9Mb2NrU3VyZmFjZShzKTsKKwlTRExfTG9ja1lVVk92ZXJsYXkobyk7CisKKwlmb3IoeT0wOyB5PHMtPmggJiYgeTxvLT5oOyB5KyspCisJeworCQlwPSgoVWludDggKikgcy0+cGl4ZWxzKStzLT5waXRjaCp5OworCQlvcD1vLT5waXhlbHNbMF0rby0+cGl0Y2hlc1swXSp5OworCQlmb3IoeD0wOyB4PHMtPncgJiYgeDxvLT53OyB4KyspCisJCXsKKwkJCVJHQnRvWVVWKHAseXV2LCBtb25vY2hyb21lLCBsdW1pbmFuY2UpOworCQkJaWYoeCUyPT0wKQorCQkJeworCQkJCSoob3ArKyk9eXV2WzBdOworCQkJCSoob3ArKyk9eXV2WzJdOworCQkJCW9wWzFdPXl1dlsxXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqb3A9eXV2WzBdOworCQkJCW9wKz0yOworCQkJfQorCisJCQlwKz1zLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJCX0KKwl9CisKKwlTRExfVW5sb2NrWVVWT3ZlcmxheShvKTsKKwlTRExfVW5sb2NrU3VyZmFjZShzKTsKK30KKwordm9pZCBDb252ZXJ0UkdCdG9ZVVkyKFNETF9TdXJmYWNlICpzLCBTRExfT3ZlcmxheSAqbywgaW50IG1vbm9jaHJvbWUsIGludCBsdW1pbmFuY2UpCit7CisJaW50IHgseTsKKwlpbnQgeXV2WzNdOworCVVpbnQ4ICpwLCpvcDsKKworCVNETF9Mb2NrU3VyZmFjZShzKTsKKwlTRExfTG9ja1lVVk92ZXJsYXkobyk7CisKKwlmb3IoeT0wOyB5PHMtPmggJiYgeTxvLT5oOyB5KyspCisJeworCQlwPSgoVWludDggKikgcy0+cGl4ZWxzKStzLT5waXRjaCp5OworCQlvcD1vLT5waXhlbHNbMF0rby0+cGl0Y2hlc1swXSp5OworCQlmb3IoeD0wOyB4PHMtPncgJiYgeDxvLT53OyB4KyspCisJCXsKKwkJCVJHQnRvWVVWKHAseXV2LCBtb25vY2hyb21lLCBsdW1pbmFuY2UpOworCQkJaWYoeCUyPT0wKQorCQkJeworCQkJCSoob3ArKyk9eXV2WzBdOworCQkJCSoob3ArKyk9eXV2WzFdOworCQkJCW9wWzFdPXl1dlsyXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqb3A9eXV2WzBdOworCQkJCW9wKz0yOworCQkJfQorCisJCQlwKz1zLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJCX0KKwl9CisKKwlTRExfVW5sb2NrWVVWT3ZlcmxheShvKTsKKwlTRExfVW5sb2NrU3VyZmFjZShzKTsKK30KKwordm9pZCBEcmF3KCkKK3sKKwlTRExfUmVjdCByZWN0OworCWludCBpOworICAgICAgICBpbnQgZGlzcDsKKworCWlmKCFzY2FsZSkKKwl7CisJCXJlY3Qudz1vdmVybGF5LT53OworCQlyZWN0Lmg9b3ZlcmxheS0+aDsKKwkJZm9yKGk9MDsgaTxoLXJlY3QuaCAmJiBpPHctcmVjdC53OyBpKyspCisJCXsKKwkJCXJlY3QueD1pOworCQkJcmVjdC55PWk7CisJCQlTRExfRGlzcGxheVlVVk92ZXJsYXkob3ZlcmxheSwmcmVjdCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmVjdC53PW92ZXJsYXktPncvMjsKKwkJcmVjdC5oPW92ZXJsYXktPmgvMjsKKwkJcmVjdC54PSh3LXJlY3QudykvMjsKKwkJcmVjdC55PShoLXJlY3QuaCkvMjsKKyAgICAgICAgICAgICAgICBkaXNwPXJlY3QueS0xOworCQlmb3IoaT0wOyBpPGRpc3A7IGkrKykKKwkJeworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53Kz0yOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5oKz0yOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC54LS07CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnktLTsKKwkJCVNETF9EaXNwbGF5WVVWT3ZlcmxheShvdmVybGF5LCZyZWN0KTsKKwkJfQorCX0KKwlwcmludGYoIkRpc3BsYXllZCAlZCB0aW1lcy5cbiIsaSk7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50VXNhZ2UoY2hhciAqYXJndjApCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW2FyZ10gW2FyZ10gW2FyZ10gLi4uXG4iLCBhcmd2MCk7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZSAnYXJnJyBpcyBvbmUgb2Y6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgktZGVsYXkgPHNlY29uZHM+XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgktd2lkdGggPHBpeGVscz5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCS1oZWlnaHQgPHBpeGVscz5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCS1icHAgPGJpdHM+XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgktZm9ybWF0IDxmbXQ+IChvbmUgb2YgdGhlOiBZVjEyLCBJWVVWLCBZVVkyLCBVWVZZLCBZVllVKVxuIik7CisJZnByaW50ZihzdGRlcnIsICIJLWh3XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgktZmxpcFxuIik7CisJZnByaW50ZihzdGRlcnIsICIJLXNjYWxlICh0ZXN0IHNjYWxpbmcgZmVhdHVyZXMsIGZyb20gNTAlJSB1cHRvIHdpbmRvdyBzaXplKVxuIik7CisJZnByaW50ZihzdGRlcnIsICIJLW1vbm8gKHVzZSBtb25vY2hyb21hdGljIFJHQjJZVVYgY29udmVyc2lvbilcbiIpOworCWZwcmludGYoc3RkZXJyLCAiCS1sdW0gPHBlcmM+ICh1c2UgbHVtaW5hbmNlIGNvcnJlY3Rpb24gZHVyaW5nIFJHQjJZVVYgY29udmVyc2lvbixcbiIpOworCWZwcmludGYoc3RkZXJyLCAiCSAgICAgICAgICAgICBmcm9tIDAlJSB0byB1bmxpbWl0ZWQsIG5vcm1hbCBpcyAxMDAlJSlcbiIpOworCWZwcmludGYoc3RkZXJyLCAiCS1oZWxwIChzaG93cyB0aGlzIGhlbHApXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgktZnVsbHNjcmVlbiAodGVzdCBvdmVybGF5IGluIGZ1bGxzY3JlZW4gbW9kZSlcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYXJndjAgPSBhcmd2WzBdOworCWludCBmbGlwOworCWludCBkZWxheTsKKwlpbnQgZGVzaXJlZF9icHA7CisJVWludDMyIHZpZGVvX2ZsYWdzLCBvdmVybGF5X2Zvcm1hdDsKKwljaGFyICpibXBmaWxlOworI2lmZGVmIEJFTkNITUFSS19TREwKKwlVaW50MzIgdGhlbiwgbm93OworI2VuZGlmCisJaW50IGk7CisKKwkvKiBTZXQgZGVmYXVsdCBvcHRpb25zIGFuZCBjaGVjayBjb21tYW5kLWxpbmUgKi8KKwlmbGlwID0gMDsKKwlzY2FsZT0wOworICAgICAgICBtb25vY2hyb21lPTA7CisgICAgICAgIGx1bWluYW5jZT0xMDA7CisJZGVsYXkgPSAxOworCXcgPSBXSU5ET1dfV0lEVEg7CisJaCA9IFdJTkRPV19IRUlHSFQ7CisJZGVzaXJlZF9icHAgPSAwOworCXZpZGVvX2ZsYWdzID0gMDsKKwlvdmVybGF5X2Zvcm1hdCA9IFNETF9ZVjEyX09WRVJMQVk7CisKKwl3aGlsZSAoIGFyZ2MgPiAxICkgeworCQlpZiAoIHN0cmNtcChhcmd2WzFdLCAiLWRlbGF5IikgPT0gMCApIHsKKwkJCWlmICggYXJndlsyXSApIHsKKwkJCQlkZWxheSA9IGF0b2koYXJndlsyXSk7CisJCQkJYXJndiArPSAyOworCQkJCWFyZ2MgLT0gMjsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlRoZSAtZGVsYXkgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlyZXR1cm4oMSk7CisJCQl9CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2WzFdLCAiLXdpZHRoIikgPT0gMCApIHsKKwkJCWlmICggYXJndlsyXSAmJiAoKHcgPSBhdG9pKGFyZ3ZbMl0pKSA+IDApICkgeworCQkJCWFyZ3YgKz0gMjsKKwkJCQlhcmdjIC09IDI7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJUaGUgLXdpZHRoIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlsxXSwgIi1oZWlnaHQiKSA9PSAwICkgeworCQkJaWYgKCBhcmd2WzJdICYmICgoaCA9IGF0b2koYXJndlsyXSkpID4gMCkgKSB7CisJCQkJYXJndiArPSAyOworCQkJCWFyZ2MgLT0gMjsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlRoZSAtaGVpZ2h0IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlsxXSwgIi1icHAiKSA9PSAwICkgeworCQkJaWYgKCBhcmd2WzJdICkgeworCQkJCWRlc2lyZWRfYnBwID0gYXRvaShhcmd2WzJdKTsKKwkJCQlhcmd2ICs9IDI7CisJCQkJYXJnYyAtPSAyOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiVGhlIC1icHAgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlyZXR1cm4oMSk7CisJCQl9CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2WzFdLCAiLWx1bSIpID09IDAgKSB7CisJCQlpZiAoIGFyZ3ZbMl0gKSB7CisJCQkJbHVtaW5hbmNlID0gYXRvaShhcmd2WzJdKTsKKwkJCQlhcmd2ICs9IDI7CisJCQkJYXJnYyAtPSAyOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiVGhlIC1sdW0gb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlyZXR1cm4oMSk7CisJCQl9CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2WzFdLCAiLWZvcm1hdCIpID09IDAgKSB7CisJCQlpZiAoIGFyZ3ZbMl0gKSB7CisJCQkJaWYoIXN0cmNtcChhcmd2WzJdLCJZVjEyIikpCisJCQkJCW92ZXJsYXlfZm9ybWF0ID0gU0RMX1lWMTJfT1ZFUkxBWTsKKwkJCQllbHNlIGlmKCFzdHJjbXAoYXJndlsyXSwiSVlVViIpKQorCQkJCQlvdmVybGF5X2Zvcm1hdCA9IFNETF9JWVVWX09WRVJMQVk7CisJCQkJZWxzZSBpZighc3RyY21wKGFyZ3ZbMl0sIllVWTIiKSkKKwkJCQkJb3ZlcmxheV9mb3JtYXQgPSBTRExfWVVZMl9PVkVSTEFZOworCQkJCWVsc2UgaWYoIXN0cmNtcChhcmd2WzJdLCJVWVZZIikpCisJCQkJCW92ZXJsYXlfZm9ybWF0ID0gU0RMX1VZVllfT1ZFUkxBWTsKKwkJCQllbHNlIGlmKCFzdHJjbXAoYXJndlsyXSwiWVZZVSIpKQorCQkJCQlvdmVybGF5X2Zvcm1hdCA9IFNETF9ZVllVX09WRVJMQVk7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJUaGUgLWZvcm1hdCBvcHRpb24gJXMgaXMgbm90IHJlY29nbml6ZWRcbiIsYXJndlsyXSk7CisJCQkJCXJldHVybigxKTsKKwkJCQl9CisJCQkJYXJndiArPSAyOworCQkJCWFyZ2MgLT0gMjsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlRoZSAtZm9ybWF0IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlsxXSwgIi1odyIpID09IDAgKSB7CisJCQl2aWRlb19mbGFncyB8PSBTRExfSFdTVVJGQUNFOworCQkJYXJndiArPSAxOworCQkJYXJnYyAtPSAxOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlsxXSwgIi1mbGlwIikgPT0gMCApIHsKKwkJCXZpZGVvX2ZsYWdzIHw9IFNETF9ET1VCTEVCVUY7CisJCQlhcmd2ICs9IDE7CisJCQlhcmdjIC09IDE7CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2WzFdLCAiLXNjYWxlIikgPT0gMCApIHsKKwkJCXNjYWxlID0gMTsKKwkJCWFyZ3YgKz0gMTsKKwkJCWFyZ2MgLT0gMTsKKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbMV0sICItbW9ubyIpID09IDAgKSB7CisJCQltb25vY2hyb21lID0gMTsKKwkJCWFyZ3YgKz0gMTsKKwkJCWFyZ2MgLT0gMTsKKwkJfSBlbHNlCisJCWlmICgoIHN0cmNtcChhcmd2WzFdLCAiLWhlbHAiKSA9PSAwICkgfHwgKHN0cmNtcChhcmd2WzFdLCAiLWgiKSA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRVc2FnZShhcmd2MCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2WzFdLCAiLWZ1bGxzY3JlZW4iKSA9PSAwICkgeworCQkJdmlkZW9fZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisJCQlhcmd2ICs9IDE7CisJCQlhcmdjIC09IDE7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCWlmICggU0RMX0luaXQoU0RMX0lOSVRfVklERU8pIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBkaXNwbGF5ICovCisJc2NyZWVuID0gU0RMX1NldFZpZGVvTW9kZSh3LCBoLCBkZXNpcmVkX2JwcCwgdmlkZW9fZmxhZ3MpOworCWlmICggc2NyZWVuID09IE5VTEwgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0ICVkeCVkeCVkIHZpZGVvIG1vZGU6ICVzXG4iLAorCQkJCQl3LCBoLCBkZXNpcmVkX2JwcCwgU0RMX0dldEVycm9yKCkpOworCQlxdWl0KDEpOworCX0KKwlwcmludGYoIlNldCVzICVkeCVkeCVkIG1vZGVcbiIsCisJCQlzY3JlZW4tPmZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gPyAiIGZ1bGxzY3JlZW4iIDogIiIsCisJCQlzY3JlZW4tPncsIHNjcmVlbi0+aCwgc2NyZWVuLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCk7CisJcHJpbnRmKCIodmlkZW8gc3VyZmFjZSBsb2NhdGVkIGluICVzIG1lbW9yeSlcbiIsCisJCQkoc2NyZWVuLT5mbGFncyZTRExfSFdTVVJGQUNFKSA/ICJ2aWRlbyIgOiAic3lzdGVtIik7CisJaWYgKCBzY3JlZW4tPmZsYWdzICYgU0RMX0RPVUJMRUJVRiApIHsKKwkJcHJpbnRmKCJEb3VibGUtYnVmZmVyaW5nIGVuYWJsZWRcbiIpOworCQlmbGlwID0gMTsKKwl9CisKKwkvKiBTZXQgdGhlIHdpbmRvdyBtYW5hZ2VyIHRpdGxlIGJhciAqLworCVNETF9XTV9TZXRDYXB0aW9uKCJTREwgdGVzdCBvdmVybGF5IiwgInRlc3RvdmVybGF5Iik7CisKKwkvKiBMb2FkIHBpY3R1cmUgKi8KKwlibXBmaWxlPShhcmd2WzFdP2FyZ3ZbMV06InNhbXBsZS5ibXAiKTsKKwlwaWMgPSBTRExfTG9hZEJNUChibXBmaWxlKTsKKwlpZiAoIHBpYyA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGxvYWQgJXM6ICVzXG4iLCBibXBmaWxlLAorCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJcXVpdCgxKTsKKwl9CisKKwkvKiBDb252ZXJ0IHRoZSBwaWN0dXJlIHRvIDMyYml0cywgZm9yIGVhc3kgY29udmVyc2lvbiAqLworCXsKKwkJU0RMX1N1cmZhY2UgKm5ld3N1cmY7CisJCVNETF9QaXhlbEZvcm1hdCBmb3JtYXQ7CisKKwkJZm9ybWF0LnBhbGV0dGU9TlVMTDsKKwkJZm9ybWF0LkJpdHNQZXJQaXhlbD0zMjsKKwkJZm9ybWF0LkJ5dGVzUGVyUGl4ZWw9NDsKKyNpZiBTRExfQllURU9SREVSID09IFNETF9MSUxfRU5ESUFOCisJCWZvcm1hdC5Sc2hpZnQ9MDsKKwkJZm9ybWF0LkdzaGlmdD04OworCQlmb3JtYXQuQnNoaWZ0PTE2OworI2Vsc2UKKwkJZm9ybWF0LlJzaGlmdD0yNDsKKwkJZm9ybWF0LkdzaGlmdD0xNjsKKwkJZm9ybWF0LkJzaGlmdD04OworI2VuZGlmCisJCWZvcm1hdC5Bc2hpZnQ9MDsKKwkJZm9ybWF0LlJtYXNrPTB4ZmY8PGZvcm1hdC5Sc2hpZnQ7CisJCWZvcm1hdC5HbWFzaz0weGZmPDxmb3JtYXQuR3NoaWZ0OworCQlmb3JtYXQuQm1hc2s9MHhmZjw8Zm9ybWF0LkJzaGlmdDsKKwkJZm9ybWF0LkFtYXNrPTA7CisJCWZvcm1hdC5SbG9zcz0wOworCQlmb3JtYXQuR2xvc3M9MDsKKwkJZm9ybWF0LkJsb3NzPTA7CisJCWZvcm1hdC5BbG9zcz04OworCQlmb3JtYXQuY29sb3JrZXk9MDsKKwkJZm9ybWF0LmFscGhhPTA7CisKKwkJbmV3c3VyZj1TRExfQ29udmVydFN1cmZhY2UocGljLCAmZm9ybWF0LCBTRExfU1dTVVJGQUNFKTsKKwkJaWYoIW5ld3N1cmYpCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgY29udmVydCBwaWN0dXJlIHRvIDMyYml0cyBSR0I6ICVzXG4iLAorCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJCXF1aXQoMSk7CisJCX0KKwkJU0RMX0ZyZWVTdXJmYWNlKHBpYyk7CisJCXBpYz1uZXdzdXJmOworCX0KKwkKKwkvKiBDcmVhdGUgdGhlIG92ZXJsYXkgKi8KKwlvdmVybGF5ID0gU0RMX0NyZWF0ZVlVVk92ZXJsYXkocGljLT53LCBwaWMtPmgsIG92ZXJsYXlfZm9ybWF0LCBzY3JlZW4pOworCWlmICggb3ZlcmxheSA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGNyZWF0ZSBvdmVybGF5OiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCQlxdWl0KDEpOworCX0KKwlwcmludGYoIkNyZWF0ZWQgJWR4JWR4JWQgJXMgJXMgb3ZlcmxheVxuIixvdmVybGF5LT53LG92ZXJsYXktPmgsb3ZlcmxheS0+cGxhbmVzLAorCQkJb3ZlcmxheS0+aHdfb3ZlcmxheT8iaGFyZHdhcmUiOiJzb2Z0d2FyZSIsCisJCQlvdmVybGF5LT5mb3JtYXQ9PVNETF9ZVjEyX09WRVJMQVk/IllWMTIiOgorCQkJb3ZlcmxheS0+Zm9ybWF0PT1TRExfSVlVVl9PVkVSTEFZPyJJWVVWIjoKKwkJCW92ZXJsYXktPmZvcm1hdD09U0RMX1lVWTJfT1ZFUkxBWT8iWVVZMiI6CisJCQlvdmVybGF5LT5mb3JtYXQ9PVNETF9VWVZZX09WRVJMQVk/IlVZVlkiOgorCQkJb3ZlcmxheS0+Zm9ybWF0PT1TRExfWVZZVV9PVkVSTEFZPyJZVllVIjoKKwkJCSJVbmtub3duIik7CisJZm9yKGk9MDsgaTxvdmVybGF5LT5wbGFuZXM7IGkrKykKKwl7CisJCXByaW50ZigiICBwbGFuZSAlZDogcGl0Y2g9JWRcbiIsIGksIG92ZXJsYXktPnBpdGNoZXNbaV0pOworCX0KKwkKKwkvKiBDb252ZXJ0IHRvIFlVViwgYW5kIGRyYXcgdG8gdGhlIG92ZXJsYXkgKi8KKyNpZmRlZiBCRU5DSE1BUktfU0RMCisJdGhlbiA9IFNETF9HZXRUaWNrcygpOworI2VuZGlmCisJc3dpdGNoKG92ZXJsYXktPmZvcm1hdCkKKwl7CisJCWNhc2UgU0RMX1lWMTJfT1ZFUkxBWToKKwkJCUNvbnZlcnRSR0J0b1lWMTIocGljLG92ZXJsYXksbW9ub2Nocm9tZSxsdW1pbmFuY2UpOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX1VZVllfT1ZFUkxBWToKKwkJCUNvbnZlcnRSR0J0b1VZVlkocGljLG92ZXJsYXksbW9ub2Nocm9tZSxsdW1pbmFuY2UpOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX1lWWVVfT1ZFUkxBWToKKwkJCUNvbnZlcnRSR0J0b1lWWVUocGljLG92ZXJsYXksbW9ub2Nocm9tZSxsdW1pbmFuY2UpOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX1lVWTJfT1ZFUkxBWToKKwkJCUNvbnZlcnRSR0J0b1lVWTIocGljLG92ZXJsYXksbW9ub2Nocm9tZSxsdW1pbmFuY2UpOworCQkJYnJlYWs7CisJCWNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKKwkJCUNvbnZlcnRSR0J0b0lZVVYocGljLG92ZXJsYXksbW9ub2Nocm9tZSxsdW1pbmFuY2UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoImNhbm5vdCBjb252ZXJ0IFJHQiBwaWN0dXJlIHRvIG9idGFpbmVkIFlVViBmb3JtYXQhXG4iKTsKKwkJCXF1aXQoMSk7CisJCQlicmVhazsKKwl9CisjaWZkZWYgQkVOQ0hNQVJLX1NETAorCW5vdyA9IFNETF9HZXRUaWNrcygpOworCXByaW50ZigiQ29udmVyc2lvbiBUaW1lOiAlZCBtaWxsaXNlY29uZHNcbiIsIG5vdy10aGVuKTsKKyNlbmRpZgorCQorCS8qIERvIGFsbCB0aGUgZHJhd2luZyB3b3JrICovCisjaWZkZWYgQkVOQ0hNQVJLX1NETAorCXRoZW4gPSBTRExfR2V0VGlja3MoKTsKKyNlbmRpZgorCURyYXcoKTsKKyNpZmRlZiBCRU5DSE1BUktfU0RMCisJbm93ID0gU0RMX0dldFRpY2tzKCk7CisJcHJpbnRmKCJUaW1lOiAlZCBtaWxsaXNlY29uZHNcbiIsIG5vdy10aGVuKTsKKyNlbmRpZgorCVNETF9EZWxheShkZWxheSoxMDAwKTsKKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdG92ZXJsYXkyLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0b3ZlcmxheTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ5MWYyCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdG92ZXJsYXkyLmMKQEAgLTAsMCArMSw2MDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUZXN0IG9mIHRoZSBvdmVybGF5IHVzZWQgZm9yIG1vdmVkIHBpY3R1cmVzLCB0ZXN0IG1vcmUgY2xvc2VkIHRvIHJlYWwgbGlmZS4gICoKKyAqIFJ1bm5pbmcgdHJvamFuIG1vb3NlIDopIENvZGVkIGJ5IE1pa2UgR29yY2hhay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKKyNkZWZpbmUgTU9PU0VQSUNfVyA2NAorI2RlZmluZSBNT09TRVBJQ19IIDg4CisKKyNkZWZpbmUgTU9PU0VGUkFNRV9TSVpFIChNT09TRVBJQ19XICogTU9PU0VQSUNfSCkKKyNkZWZpbmUgTU9PU0VGUkFNRVNfQ09VTlQgMTAKKworU0RMX0NvbG9yIE1vb3NlQ29sb3JzWzg0XT17CisgICAgeyA0OSwgIDQ5LCAgNDl9LCB7IDY2LCAgMjQsICAgMH0sIHsgNjYsICAzMywgICAwfSwgeyA2NiwgIDY2LCAgNjZ9LAorICAgIHsgNjYsIDExNSwgIDQ5fSwgeyA3NCwgIDMzLCAgIDB9LCB7IDc0LCAgNDEsICAxNn0sIHsgODIsICAzMywgICA4fSwKKyAgICB7IDgyLCAgNDEsICAgOH0sIHsgODIsICA0OSwgIDE2fSwgeyA4MiwgIDgyLCAgODJ9LCB7IDkwLCAgNDEsICAgOH0sCisgICAgeyA5MCwgIDQxLCAgMTZ9LCB7IDkwLCAgNTcsICAyNH0sIHsgOTksICA0OSwgIDE2fSwgeyA5OSwgIDY2LCAgMjR9LAorICAgIHsgOTksICA2NiwgIDMzfSwgeyA5OSwgIDc0LCAgMzN9LCB7MTA3LCAgNTcsICAyNH0sIHsxMDcsICA4MiwgIDQxfSwKKyAgICB7MTE1LCAgNTcsICAzM30sIHsxMTUsICA2NiwgIDMzfSwgezExNSwgIDY2LCAgNDF9LCB7MTE1LCAgNzQsICAgMH0sCisgICAgezExNSwgIDkwLCAgNDl9LCB7MTE1LCAxMTUsIDExNX0sIHsxMjMsICA4MiwgICAwfSwgezEyMywgIDk5LCAgNTd9LAorICAgIHsxMzIsICA2NiwgIDQxfSwgezEzMiwgIDc0LCAgNDF9LCB7MTMyLCAgOTAsICAgOH0sIHsxMzIsICA5OSwgIDMzfSwKKyAgICB7MTMyLCAgOTksICA2Nn0sIHsxMzIsIDEwNywgIDY2fSwgezE0MCwgIDc0LCAgNDl9LCB7MTQwLCAgOTksICAxNn0sCisgICAgezE0MCwgMTA3LCAgNzR9LCB7MTQwLCAxMTUsICA3NH0sIHsxNDgsIDEwNywgIDI0fSwgezE0OCwgMTE1LCAgODJ9LAorICAgIHsxNDgsIDEyMywgIDc0fSwgezE0OCwgMTIzLCAgOTB9LCB7MTU2LCAxMTUsICAzM30sIHsxNTYsIDExNSwgIDkwfSwKKyAgICB7MTU2LCAxMjMsICA4Mn0sIHsxNTYsIDEzMiwgIDgyfSwgezE1NiwgMTMyLCAgOTl9LCB7MTU2LCAxNTYsIDE1Nn0sCisgICAgezE2NSwgMTIzLCAgNDl9LCB7MTY1LCAxMjMsICA5MH0sIHsxNjUsIDEzMiwgIDgyfSwgezE2NSwgMTMyLCAgOTB9LAorICAgIHsxNjUsIDEzMiwgIDk5fSwgezE2NSwgMTQwLCAgOTB9LCB7MTczLCAxMzIsICA1N30sIHsxNzMsIDEzMiwgIDk5fSwKKyAgICB7MTczLCAxNDAsIDEwN30sIHsxNzMsIDE0MCwgMTE1fSwgezE3MywgMTQ4LCAgOTl9LCB7MTczLCAxNzMsIDE3M30sCisgICAgezE4MSwgMTQwLCAgNzR9LCB7MTgxLCAxNDgsIDExNX0sIHsxODEsIDE0OCwgMTIzfSwgezE4MSwgMTU2LCAxMDd9LAorICAgIHsxODksIDE0OCwgMTIzfSwgezE4OSwgMTU2LCAgODJ9LCB7MTg5LCAxNTYsIDEyM30sIHsxODksIDE1NiwgMTMyfSwKKyAgICB7MTg5LCAxODksIDE4OX0sIHsxOTgsIDE1NiwgMTIzfSwgezE5OCwgMTY1LCAxMzJ9LCB7MjA2LCAxNjUsICA5OX0sCisgICAgezIwNiwgMTY1LCAxMzJ9LCB7MjA2LCAxNzMsIDE0MH0sIHsyMDYsIDIwNiwgMjA2fSwgezIxNCwgMTczLCAxMTV9LAorICAgIHsyMTQsIDE3MywgMTQwfSwgezIyMiwgMTgxLCAxNDh9LCB7MjIyLCAxODksIDEzMn0sIHsyMjIsIDE4OSwgMTU2fSwKKyAgICB7MjIyLCAyMjIsIDIyMn0sIHsyMzEsIDE5OCwgMTY1fSwgezIzMSwgMjMxLCAyMzF9LCB7MjM5LCAyMDYsIDE3M30KK307CisKKworLyogQ2FsbCB0aGlzIGluc3RlYWQgb2YgZXhpdCgpLCBzbyB3ZSBjYW4gY2xlYW4gdXAgU0RMOiBhdGV4aXQoKSBpcyBldmlsLiAqLworc3RhdGljIHZvaWQgcXVpdChpbnQgcmMpCit7CisJU0RMX1F1aXQoKTsKKwlleGl0KHJjKTsKK30KKworLyogQWxsIFJHQjJZVVYgY29udmVyc2lvbiBjb2RlIGFuZCBzb21lIG90aGVyIHBhcnRzIG9mIGNvZGUgaGFzIGJlZW4gdGFrZW4gZnJvbSB0ZXN0b3ZlcmxheS5jICovCisKKy8qIE5PVEU6IFRoZXNlIFJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgbm90IGludGVuZGVkIGZvciBzcGVlZCwKKyAgICAgICAgIG9ubHkgYXMgZXhhbXBsZXMuCisqLworCit2b2lkIFJHQnRvWVVWKFVpbnQ4ICpyZ2IsIGludCAqeXV2LCBpbnQgbW9ub2Nocm9tZSwgaW50IGx1bWluYW5jZSkKK3sKKyAgICBpZiAobW9ub2Nocm9tZSkKKyAgICB7CisjaWYgMSAvKiB0aGVzZSBhcmUgdGhlIHR3byBmb3JtdWxhcyB0aGF0IEkgZm91bmQgb24gdGhlIEZvdXJDQyBzaXRlLi4uICovCisgICAgICAgIHl1dlswXSA9IDAuMjk5KnJnYlswXSArIDAuNTg3KnJnYlsxXSArIDAuMTE0KnJnYlsyXTsKKyAgICAgICAgeXV2WzFdID0gMTI4OworICAgICAgICB5dXZbMl0gPSAxMjg7CisjZWxzZQorICAgICAgICB5dXZbMF0gPSAoMC4yNTcgKiByZ2JbMF0pICsgKDAuNTA0ICogcmdiWzFdKSArICgwLjA5OCAqIHJnYlsyXSkgKyAxNjsKKyAgICAgICAgeXV2WzFdID0gMTI4OworICAgICAgICB5dXZbMl0gPSAxMjg7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZiAxIC8qIHRoZXNlIGFyZSB0aGUgdHdvIGZvcm11bGFzIHRoYXQgSSBmb3VuZCBvbiB0aGUgRm91ckNDIHNpdGUuLi4gKi8KKyAgICAgICAgeXV2WzBdID0gMC4yOTkqcmdiWzBdICsgMC41ODcqcmdiWzFdICsgMC4xMTQqcmdiWzJdOworICAgICAgICB5dXZbMV0gPSAocmdiWzJdLXl1dlswXSkqMC41NjUgKyAxMjg7CisgICAgICAgIHl1dlsyXSA9IChyZ2JbMF0teXV2WzBdKSowLjcxMyArIDEyODsKKyNlbHNlCisgICAgICAgIHl1dlswXSA9ICgwLjI1NyAqIHJnYlswXSkgKyAoMC41MDQgKiByZ2JbMV0pICsgKDAuMDk4ICogcmdiWzJdKSArIDE2OworICAgICAgICB5dXZbMV0gPSAxMjggLSAoMC4xNDggKiByZ2JbMF0pIC0gKDAuMjkxICogcmdiWzFdKSArICgwLjQzOSAqIHJnYlsyXSk7CisgICAgICAgIHl1dlsyXSA9IDEyOCArICgwLjQzOSAqIHJnYlswXSkgLSAoMC4zNjggKiByZ2JbMV0pIC0gKDAuMDcxICogcmdiWzJdKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChsdW1pbmFuY2UhPTEwMCkKKyAgICB7CisgICAgICAgIHl1dlswXT15dXZbMF0qbHVtaW5hbmNlLzEwMDsKKyAgICAgICAgaWYgKHl1dlswXT4yNTUpCisgICAgICAgICAgICB5dXZbMF09MjU1OworICAgIH0KK30KKwordm9pZCBDb252ZXJ0UkdCdG9ZVjEyKFNETF9TdXJmYWNlICpzLCBTRExfT3ZlcmxheSAqbywgaW50IG1vbm9jaHJvbWUsIGludCBsdW1pbmFuY2UpCit7CisJaW50IHgseTsKKwlpbnQgeXV2WzNdOworCVVpbnQ4ICpwLCpvcFszXTsKKworCVNETF9Mb2NrU3VyZmFjZShzKTsKKwlTRExfTG9ja1lVVk92ZXJsYXkobyk7CisKKwkvKiBDb252ZXJ0ICovCisJZm9yKHk9MDsgeTxzLT5oICYmIHk8by0+aDsgeSsrKQorCXsKKwkJcD0oKFVpbnQ4ICopIHMtPnBpeGVscykrcy0+cGl0Y2gqeTsKKwkJb3BbMF09by0+cGl4ZWxzWzBdK28tPnBpdGNoZXNbMF0qeTsKKwkJb3BbMV09by0+cGl4ZWxzWzFdK28tPnBpdGNoZXNbMV0qKHkvMik7CisJCW9wWzJdPW8tPnBpeGVsc1syXStvLT5waXRjaGVzWzJdKih5LzIpOworCQlmb3IoeD0wOyB4PHMtPncgJiYgeDxvLT53OyB4KyspCisJCXsKKwkJCVJHQnRvWVVWKHAsIHl1diwgbW9ub2Nocm9tZSwgbHVtaW5hbmNlKTsKKwkJCSoob3BbMF0rKyk9eXV2WzBdOworCQkJaWYoeCUyPT0wICYmIHklMj09MCkKKwkJCXsKKwkJCQkqKG9wWzFdKyspPXl1dlsyXTsKKwkJCQkqKG9wWzJdKyspPXl1dlsxXTsKKwkJCX0KKwkJCXArPXMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKKwkJfQorCX0KKworCVNETF9VbmxvY2tZVVZPdmVybGF5KG8pOworCVNETF9VbmxvY2tTdXJmYWNlKHMpOworfQorCit2b2lkIENvbnZlcnRSR0J0b0lZVVYoU0RMX1N1cmZhY2UgKnMsIFNETF9PdmVybGF5ICpvLCBpbnQgbW9ub2Nocm9tZSwgaW50IGx1bWluYW5jZSkKK3sKKwlpbnQgeCx5OworCWludCB5dXZbM107CisJVWludDggKnAsKm9wWzNdOworCisJU0RMX0xvY2tTdXJmYWNlKHMpOworCVNETF9Mb2NrWVVWT3ZlcmxheShvKTsKKworCS8qIENvbnZlcnQgKi8KKwlmb3IoeT0wOyB5PHMtPmggJiYgeTxvLT5oOyB5KyspCisJeworCQlwPSgoVWludDggKikgcy0+cGl4ZWxzKStzLT5waXRjaCp5OworCQlvcFswXT1vLT5waXhlbHNbMF0rby0+cGl0Y2hlc1swXSp5OworCQlvcFsxXT1vLT5waXhlbHNbMV0rby0+cGl0Y2hlc1sxXSooeS8yKTsKKwkJb3BbMl09by0+cGl4ZWxzWzJdK28tPnBpdGNoZXNbMl0qKHkvMik7CisJCWZvcih4PTA7IHg8cy0+dyAmJiB4PG8tPnc7IHgrKykKKwkJeworCQkJUkdCdG9ZVVYocCx5dXYsIG1vbm9jaHJvbWUsIGx1bWluYW5jZSk7CisJCQkqKG9wWzBdKyspPXl1dlswXTsKKwkJCWlmKHglMj09MCAmJiB5JTI9PTApCisJCQl7CisJCQkJKihvcFsxXSsrKT15dXZbMV07CisJCQkJKihvcFsyXSsrKT15dXZbMl07CisJCQl9CisJCQlwKz1zLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJCX0KKwl9CisKKwlTRExfVW5sb2NrWVVWT3ZlcmxheShvKTsKKwlTRExfVW5sb2NrU3VyZmFjZShzKTsKK30KKwordm9pZCBDb252ZXJ0UkdCdG9VWVZZKFNETF9TdXJmYWNlICpzLCBTRExfT3ZlcmxheSAqbywgaW50IG1vbm9jaHJvbWUsIGludCBsdW1pbmFuY2UpCit7CisJaW50IHgseTsKKwlpbnQgeXV2WzNdOworCVVpbnQ4ICpwLCpvcDsKKworCVNETF9Mb2NrU3VyZmFjZShzKTsKKwlTRExfTG9ja1lVVk92ZXJsYXkobyk7CisKKwlmb3IoeT0wOyB5PHMtPmggJiYgeTxvLT5oOyB5KyspCisJeworCQlwPSgoVWludDggKikgcy0+cGl4ZWxzKStzLT5waXRjaCp5OworCQlvcD1vLT5waXhlbHNbMF0rby0+cGl0Y2hlc1swXSp5OworCQlmb3IoeD0wOyB4PHMtPncgJiYgeDxvLT53OyB4KyspCisJCXsKKwkJCVJHQnRvWVVWKHAsIHl1diwgbW9ub2Nocm9tZSwgbHVtaW5hbmNlKTsKKwkJCWlmKHglMj09MCkKKwkJCXsKKwkJCQkqKG9wKyspPXl1dlsxXTsKKwkJCQkqKG9wKyspPXl1dlswXTsKKwkJCQkqKG9wKyspPXl1dlsyXTsKKwkJCX0KKwkJCWVsc2UKKwkJCQkqKG9wKyspPXl1dlswXTsKKworCQkJcCs9cy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCQl9CisJfQorCisJU0RMX1VubG9ja1lVVk92ZXJsYXkobyk7CisJU0RMX1VubG9ja1N1cmZhY2Uocyk7Cit9CisKK3ZvaWQgQ29udmVydFJHQnRvWVZZVShTRExfU3VyZmFjZSAqcywgU0RMX092ZXJsYXkgKm8sIGludCBtb25vY2hyb21lLCBpbnQgbHVtaW5hbmNlKQoreworCWludCB4LHk7CisJaW50IHl1dlszXTsKKwlVaW50OCAqcCwqb3A7CisKKwlTRExfTG9ja1N1cmZhY2Uocyk7CisJU0RMX0xvY2tZVVZPdmVybGF5KG8pOworCisJZm9yKHk9MDsgeTxzLT5oICYmIHk8by0+aDsgeSsrKQorCXsKKwkJcD0oKFVpbnQ4ICopIHMtPnBpeGVscykrcy0+cGl0Y2gqeTsKKwkJb3A9by0+cGl4ZWxzWzBdK28tPnBpdGNoZXNbMF0qeTsKKwkJZm9yKHg9MDsgeDxzLT53ICYmIHg8by0+dzsgeCsrKQorCQl7CisJCQlSR0J0b1lVVihwLHl1diwgbW9ub2Nocm9tZSwgbHVtaW5hbmNlKTsKKwkJCWlmKHglMj09MCkKKwkJCXsKKwkJCQkqKG9wKyspPXl1dlswXTsKKwkJCQkqKG9wKyspPXl1dlsyXTsKKwkJCQlvcFsxXT15dXZbMV07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKm9wPXl1dlswXTsKKwkJCQlvcCs9MjsKKwkJCX0KKworCQkJcCs9cy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOworCQl9CisJfQorCisJU0RMX1VubG9ja1lVVk92ZXJsYXkobyk7CisJU0RMX1VubG9ja1N1cmZhY2Uocyk7Cit9CisKK3ZvaWQgQ29udmVydFJHQnRvWVVZMihTRExfU3VyZmFjZSAqcywgU0RMX092ZXJsYXkgKm8sIGludCBtb25vY2hyb21lLCBpbnQgbHVtaW5hbmNlKQoreworCWludCB4LHk7CisJaW50IHl1dlszXTsKKwlVaW50OCAqcCwqb3A7CisKKwlTRExfTG9ja1N1cmZhY2Uocyk7CisJU0RMX0xvY2tZVVZPdmVybGF5KG8pOworICAgICAgICAKKwlmb3IoeT0wOyB5PHMtPmggJiYgeTxvLT5oOyB5KyspCisJeworCQlwPSgoVWludDggKikgcy0+cGl4ZWxzKStzLT5waXRjaCp5OworCQlvcD1vLT5waXhlbHNbMF0rby0+cGl0Y2hlc1swXSp5OworCQlmb3IoeD0wOyB4PHMtPncgJiYgeDxvLT53OyB4KyspCisJCXsKKwkJCVJHQnRvWVVWKHAseXV2LCBtb25vY2hyb21lLCBsdW1pbmFuY2UpOworCQkJaWYoeCUyPT0wKQorCQkJeworCQkJCSoob3ArKyk9eXV2WzBdOworCQkJCSoob3ArKyk9eXV2WzFdOworCQkJCW9wWzFdPXl1dlsyXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqb3A9eXV2WzBdOworCQkJCW9wKz0yOworCQkJfQorCisJCQlwKz1zLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CisJCX0KKwl9CisKKwlTRExfVW5sb2NrWVVWT3ZlcmxheShvKTsKKwlTRExfVW5sb2NrU3VyZmFjZShzKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRVc2FnZShjaGFyICphcmd2MCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbYXJnXSBbYXJnXSBbYXJnXSAuLi5cbiIsIGFyZ3YwKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJXaGVyZSAnYXJnJyBpcyBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiCS1mcHMgPGZyYW1lcyBwZXIgc2Vjb25kPlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIJLWZvcm1hdCA8Zm10PiAob25lIG9mIHRoZTogWVYxMiwgSVlVViwgWVVZMiwgVVlWWSwgWVZZVSlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiCS1zY2FsZSA8c2NhbGUgZmFjdG9yPiAoaW5pdGlhbCBzY2FsZSBvZiB0aGUgb3ZlcmxheSlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiCS1oZWxwIChzaG93cyB0aGlzIGhlbHApXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJQcmVzcyBFU0MgdG8gZXhpdCwgb3IgU1BBQ0UgdG8gZnJlZXplIHRoZSBtb3ZpZSB3aGlsZSBhcHBsaWNhdGlvbiBydW5uaW5nLlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgVWludDgqIFJhd01vb3NlRGF0YTsKKyAgICBTRExfUldvcHMqIGhhbmRsZTsKKyAgICBTRExfU3VyZmFjZSogc2NyZWVuOworICAgIFNETF9TdXJmYWNlKiBNb29zZUZyYW1lW01PT1NFRlJBTUVTX0NPVU5UXTsKKyAgICBTRExfT3ZlcmxheSogb3ZlcmxheTsKKyAgICBTRExfUmVjdCBvdmVybGF5cmVjdDsKKyAgICBTRExfRXZlbnQgZXZlbnQ7CisgICAgVWludDMyIGxhc3RmdGljazsKKyAgICBpbnQgcGF1c2VkPTA7CisgICAgaW50IHJlc2l6ZWQ9MDsKKyAgICBpbnQgaTsKKyAgICBpbnQgZnBzPTEyOworICAgIGludCBmcHNkZWxheTsKKyAgICBpbnQgb3ZlcmxheV9mb3JtYXQ9U0RMX1lVWTJfT1ZFUkxBWTsKKyAgICBpbnQgc2NhbGU9NTsKKworICAgIGlmIChTRExfSW5pdChTRExfSU5JVF9WSURFTyB8IFNETF9JTklUX05PUEFSQUNIVVRFKSA8IDApCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisKKyAgICB3aGlsZSAoIGFyZ2MgPiAxICkKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIi1mcHMiKT09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcmd2WzJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcyA9IGF0b2koYXJndlsyXSk7CisgICAgICAgICAgICAgICAgaWYgKGZwcz09MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIC1mcHMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IFtmcm9tIDEgdG8gMTAwMF0sIGRlZmF1bHQgaXMgMTIuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcXVpdCgxMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoZnBzPDApIHx8IChmcHM+MTAwMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRoZSAtZnBzIG9wdGlvbiBtdXN0IGJlIGluIHJhbmdlIGZyb20gMSB0byAxMDAwLCBkZWZhdWx0IGlzIDEyLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHF1aXQoMTApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmd2ICs9IDI7CisgICAgICAgICAgICAgICAgYXJnYyAtPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIC1mcHMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IFtmcm9tIDEgdG8gMTAwMF0sIGRlZmF1bHQgaXMgMTIuXG4iKTsKKyAgICAgICAgICAgICAgICBxdWl0KDEwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIi1mb3JtYXQiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJndlsyXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChhcmd2WzJdLCJZVjEyIikpCisgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfZm9ybWF0ID0gU0RMX1lWMTJfT1ZFUkxBWTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCFzdHJjbXAoYXJndlsyXSwiSVlVViIpKQorICAgICAgICAgICAgICAgICAgICBvdmVybGF5X2Zvcm1hdCA9IFNETF9JWVVWX09WRVJMQVk7CisgICAgICAgICAgICAgICAgZWxzZSBpZighc3RyY21wKGFyZ3ZbMl0sIllVWTIiKSkKKyAgICAgICAgICAgICAgICAgICAgb3ZlcmxheV9mb3JtYXQgPSBTRExfWVVZMl9PVkVSTEFZOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIXN0cmNtcChhcmd2WzJdLCJVWVZZIikpCisgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfZm9ybWF0ID0gU0RMX1VZVllfT1ZFUkxBWTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCFzdHJjbXAoYXJndlsyXSwiWVZZVSIpKQorICAgICAgICAgICAgICAgICAgICBvdmVybGF5X2Zvcm1hdCA9IFNETF9ZVllVX09WRVJMQVk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaGUgLWZvcm1hdCBvcHRpb24gJXMgaXMgbm90IHJlY29nbml6ZWQsIHNlZSBoZWxwIGZvciBpbmZvLlxuIiwgYXJndlsyXSk7CisgICAgICAgICAgICAgICAgICAgIHF1aXQoMTApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmd2ICs9IDI7CisgICAgICAgICAgICAgICAgYXJnYyAtPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIC1mb3JtYXQgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LCBkZWZhdWx0IGlzIFlVWTIuXG4iKTsKKyAgICAgICAgICAgICAgICBxdWl0KDEwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIi1zY2FsZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcmd2WzJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjYWxlID0gYXRvaShhcmd2WzJdKTsKKyAgICAgICAgICAgICAgICBpZiAoc2NhbGU9PTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRoZSAtc2NhbGUgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IFtmcm9tIDEgdG8gNTBdLCBkZWZhdWx0IGlzIDUuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcXVpdCgxMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoc2NhbGU8MCkgfHwgKHNjYWxlPjUwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIC1zY2FsZSBvcHRpb24gbXVzdCBiZSBpbiByYW5nZSBmcm9tIDEgdG8gNTAsIGRlZmF1bHQgaXMgNS5cbiIpOworICAgICAgICAgICAgICAgICAgICBxdWl0KDEwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXJndiArPSAyOworICAgICAgICAgICAgICAgIGFyZ2MgLT0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRoZSAtZnBzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCBbZnJvbSAxIHRvIDEwMDBdLCBkZWZhdWx0IGlzIDEyLlxuIik7CisgICAgICAgICAgICAgICAgcXVpdCgxMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICBpZiAoKHN0cmNtcChhcmd2WzFdLCAiLWhlbHAiKSA9PSAwICkgfHwgKHN0cmNtcChhcmd2WzFdLCAiLWgiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHJpbnRVc2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgIHF1aXQoMCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBvcHRpb246ICVzLlxuIiwgYXJndlsxXSk7CisgICAgICAgICAgICBxdWl0KDEwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAKKyAgICBSYXdNb29zZURhdGE9KFVpbnQ4KiltYWxsb2MoTU9PU0VGUkFNRV9TSVpFICogTU9PU0VGUkFNRVNfQ09VTlQpOworICAgIGlmIChSYXdNb29zZURhdGE9PU5VTEwpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgbW92aWUgIVxuIik7CisgICAgICAgIGZyZWUoUmF3TW9vc2VEYXRhKTsKKyAgICAgICAgcXVpdCgxKTsKKyAgICB9CisKKyAgICAvKiBsb2FkIHRoZSB0cm9qYW4gbW9vc2UgaW1hZ2VzICovCisgICAgaGFuZGxlPVNETF9SV0Zyb21GaWxlKCJtb29zZS5kYXQiLCAicmIiKTsKKyAgICBpZiAoaGFuZGxlPT1OVUxMKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBmaW5kIHRoZSBmaWxlIG1vb3NlLmRhdCAhXG4iKTsKKyAgICAgICAgZnJlZShSYXdNb29zZURhdGEpOworICAgICAgICBxdWl0KDIpOworICAgIH0KKyAgIAorICAgIFNETF9SV3JlYWQoaGFuZGxlLCBSYXdNb29zZURhdGEsIE1PT1NFRlJBTUVfU0laRSwgTU9PU0VGUkFNRVNfQ09VTlQpOworCisgICAgU0RMX1JXY2xvc2UoaGFuZGxlKTsKKworICAgIC8qIFNldCB2aWRlbyBtb2RlICovCisgICAgaWYgKCAoc2NyZWVuPVNETF9TZXRWaWRlb01vZGUoTU9PU0VQSUNfVypzY2FsZSwgTU9PU0VQSUNfSCpzY2FsZSwgMCwgU0RMX1JFU0laQUJMRSB8IFNETF9TV1NVUkZBQ0UpKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0IHZpZGVvIG1vZGU6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIGZyZWUoUmF3TW9vc2VEYXRhKTsKKyAgICAgICAgcXVpdCg0KTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIHdpbmRvdyBtYW5hZ2VyIHRpdGxlIGJhciAqLworICAgIFNETF9XTV9TZXRDYXB0aW9uKCJTREwgdGVzdCBvdmVybGF5OiBydW5uaW5nIG1vb3NlIiwgInRlc3RvdmVybGF5MiIpOworCisgICAgZm9yIChpPTA7IGk8TU9PU0VGUkFNRVNfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIE1vb3NlRnJhbWVbaV09U0RMX0NyZWF0ZVJHQlN1cmZhY2VGcm9tKFJhd01vb3NlRGF0YStpKk1PT1NFRlJBTUVfU0laRSwgTU9PU0VQSUNfVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9PU0VQSUNfSCwgOCwgTU9PU0VQSUNfVywgMCwgMCwgMCwgMCk7CisgICAgICAgIGlmIChNb29zZUZyYW1lW2ldPT1OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGNyZWF0ZSBTRExfU3VyZmFjZXM6JXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgICAgIGZyZWUoUmF3TW9vc2VEYXRhKTsKKyAgICAgICAgICAgIHF1aXQoNSk7CisgICAgICAgIH0KKyAgICAgICAgU0RMX1NldENvbG9ycyhNb29zZUZyYW1lW2ldLCBNb29zZUNvbG9ycywgMCwgODQpOworCisJeworCQlTRExfU3VyZmFjZSAqbmV3c3VyZjsKKwkJU0RMX1BpeGVsRm9ybWF0IGZvcm1hdDsKKworCQlmb3JtYXQucGFsZXR0ZT1OVUxMOworCQlmb3JtYXQuQml0c1BlclBpeGVsPTMyOworCQlmb3JtYXQuQnl0ZXNQZXJQaXhlbD00OworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KKwkJZm9ybWF0LlJzaGlmdD0wOworCQlmb3JtYXQuR3NoaWZ0PTg7CisJCWZvcm1hdC5Cc2hpZnQ9MTY7CisjZWxzZQorCQlmb3JtYXQuUnNoaWZ0PTI0OworCQlmb3JtYXQuR3NoaWZ0PTE2OworCQlmb3JtYXQuQnNoaWZ0PTg7CisjZW5kaWYKKwkJZm9ybWF0LkFzaGlmdD0wOworCQlmb3JtYXQuUm1hc2s9MHhmZjw8Zm9ybWF0LlJzaGlmdDsKKwkJZm9ybWF0LkdtYXNrPTB4ZmY8PGZvcm1hdC5Hc2hpZnQ7CisJCWZvcm1hdC5CbWFzaz0weGZmPDxmb3JtYXQuQnNoaWZ0OworCQlmb3JtYXQuQW1hc2s9MDsKKwkJZm9ybWF0LlJsb3NzPTA7CisJCWZvcm1hdC5HbG9zcz0wOworCQlmb3JtYXQuQmxvc3M9MDsKKwkJZm9ybWF0LkFsb3NzPTg7CisJCWZvcm1hdC5jb2xvcmtleT0wOworCQlmb3JtYXQuYWxwaGE9MDsKKworCQluZXdzdXJmPVNETF9Db252ZXJ0U3VyZmFjZShNb29zZUZyYW1lW2ldLCAmZm9ybWF0LCBTRExfU1dTVVJGQUNFKTsKKwkJaWYoIW5ld3N1cmYpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBjb252ZXJ0IHBpY3R1cmUgdG8gMzJiaXRzIFJHQjogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgcXVpdCg2KTsKKwkJfQorCQlTRExfRnJlZVN1cmZhY2UoTW9vc2VGcmFtZVtpXSk7CisJCU1vb3NlRnJhbWVbaV09bmV3c3VyZjsKKwl9CisgICAgfQorCisgICAgZnJlZShSYXdNb29zZURhdGEpOworCisgICAgb3ZlcmxheT1TRExfQ3JlYXRlWVVWT3ZlcmxheShNT09TRVBJQ19XLCBNT09TRVBJQ19ILCBvdmVybGF5X2Zvcm1hdCwgc2NyZWVuKTsKKyAgICBpZiAoIW92ZXJsYXkpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGNyZWF0ZSBvdmVybGF5OiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICBxdWl0KDcpOworICAgIH0KKworICAgIHByaW50ZigiQ3JlYXRlZCAlZHglZHglZCAlcyAlcyBvdmVybGF5XG4iLG92ZXJsYXktPncsb3ZlcmxheS0+aCxvdmVybGF5LT5wbGFuZXMsCisgICAgICAgICAgIG92ZXJsYXktPmh3X292ZXJsYXk/ImhhcmR3YXJlIjoic29mdHdhcmUiLAorICAgICAgICAgICBvdmVybGF5LT5mb3JtYXQ9PVNETF9ZVjEyX09WRVJMQVk/IllWMTIiOgorICAgICAgICAgICBvdmVybGF5LT5mb3JtYXQ9PVNETF9JWVVWX09WRVJMQVk/IklZVVYiOgorICAgICAgICAgICBvdmVybGF5LT5mb3JtYXQ9PVNETF9ZVVkyX09WRVJMQVk/IllVWTIiOgorICAgICAgICAgICBvdmVybGF5LT5mb3JtYXQ9PVNETF9VWVZZX09WRVJMQVk/IlVZVlkiOgorICAgICAgICAgICBvdmVybGF5LT5mb3JtYXQ9PVNETF9ZVllVX09WRVJMQVk/IllWWVUiOgorICAgICAgICAgICAiVW5rbm93biIpOworCisgICAgZm9yKGk9MDsgaTxvdmVybGF5LT5wbGFuZXM7IGkrKykKKyAgICB7CisgICAgICAgIHByaW50ZigiICBwbGFuZSAlZDogcGl0Y2g9JWRcbiIsIGksIG92ZXJsYXktPnBpdGNoZXNbaV0pOworICAgIH0KKworICAgIG92ZXJsYXlyZWN0Lng9MDsKKyAgICBvdmVybGF5cmVjdC55PTA7CisgICAgb3ZlcmxheXJlY3Qudz1NT09TRVBJQ19XKnNjYWxlOworICAgIG92ZXJsYXlyZWN0Lmg9TU9PU0VQSUNfSCpzY2FsZTsKKworICAgIC8qIHNldCB0aGUgc3RhcnQgZnJhbWUgKi8KKyAgICBpPTA7CisgICAgZnBzZGVsYXk9MTAwMC9mcHM7CisKKyAgICAvKiBJZ25vcmUga2V5IHVwIGV2ZW50cywgdGhleSBkb24ndCBldmVuIGdldCBmaWx0ZXJlZCAqLworICAgIFNETF9FdmVudFN0YXRlKFNETF9LRVlVUCwgU0RMX0lHTk9SRSk7CisKKyAgICBsYXN0ZnRpY2s9U0RMX0dldFRpY2tzKCk7CisKKyAgICAvKiBMb29wLCB3YWl0aW5nIGZvciBRVUlUIG9yIFJFU0laRSAqLworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgaWYgKFNETF9Qb2xsRXZlbnQoJmV2ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU0RMX1ZJREVPUkVTSVpFOgorICAgICAgICAgICAgICAgICAgICAgc2NyZWVuPVNETF9TZXRWaWRlb01vZGUoZXZlbnQucmVzaXplLncsIGV2ZW50LnJlc2l6ZS5oLCAwLCBTRExfUkVTSVpBQkxFIHwgU0RMX1NXU1VSRkFDRSk7CisgICAgICAgICAgICAgICAgICAgICBvdmVybGF5cmVjdC53PWV2ZW50LnJlc2l6ZS53OworICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheXJlY3QuaD1ldmVudC5yZXNpemUuaDsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChwYXVzZWQpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplZD0xOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRExfTU9VU0VCVVRUT05ET1dOOgorICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheXJlY3QueCA9IGV2ZW50LmJ1dHRvbi54IC0gb3ZlcmxheXJlY3Qudy8yOworICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheXJlY3QueSA9IGV2ZW50LmJ1dHRvbi55IC0gb3ZlcmxheXJlY3QuaC8yOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRExfS0VZRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkua2V5c3ltLnN5bSA9PSBTRExLX1NQQUNFKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIHBhdXNlZD0hcGF1c2VkOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleS5rZXlzeW0uc3ltICE9IFNETEtfRVNDQVBFKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU0RMX1FVSVQ6CisgICAgICAgICAgICAgICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkob3ZlcmxheSk7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxNT09TRUZSQU1FU19DT1VOVDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9GcmVlU3VyZmFjZShNb29zZUZyYW1lW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIHF1aXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKCFwYXVzZWQpfHwocmVzaXplZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKFNETF9HZXRUaWNrcygpLWxhc3RmdGljayk+ZnBzZGVsYXkpfHwocmVzaXplZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFzdGZ0aWNrPVNETF9HZXRUaWNrcygpOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChvdmVybGF5X2Zvcm1hdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0RMX1lVWTJfT1ZFUkxBWToKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0UkdCdG9ZVVkyKE1vb3NlRnJhbWVbaV0sIG92ZXJsYXksIDAsIDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0RMX1lWMTJfT1ZFUkxBWToKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0UkdCdG9ZVjEyKE1vb3NlRnJhbWVbaV0sIG92ZXJsYXksIDAsIDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0RMX1VZVllfT1ZFUkxBWToKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0UkdCdG9VWVZZKE1vb3NlRnJhbWVbaV0sIG92ZXJsYXksIDAsIDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0RMX1lWWVVfT1ZFUkxBWToKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0UkdCdG9ZVllVKE1vb3NlRnJhbWVbaV0sIG92ZXJsYXksIDAsIDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0RMX0lZVVZfT1ZFUkxBWToKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0UkdCdG9JWVVWKE1vb3NlRnJhbWVbaV0sIG92ZXJsYXksIDAsIDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0RMX0Rpc3BsYXlZVVZPdmVybGF5KG92ZXJsYXksICZvdmVybGF5cmVjdCk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXNpemVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBpZiAoaT09MTApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGk9MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXNpemVkPTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGtpbmQgb2YgdGltZXNsaWNlIHRvIE9TICovCisgICAgICAgIFNETF9EZWxheSgxKTsKKyAgICB9CisKKwlTRExfUXVpdCgpOworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0cGFsZXR0ZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHBhbGV0dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQ0OTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHBhbGV0dGUuYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIHRlc3RwYWxldHRlLmMKKyAqCisgKiBBIHNpbXBsZSB0ZXN0IG9mIHJ1bnRpbWUgcGFsZXR0ZSBtb2RpZmljYXRpb24gZm9yIGFuaW1hdGlvbgorICogKHVzaW5nIHRoZSBTRExfU2V0UGFsZXR0ZSgpIEFQSSkuIAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworLyogVGhpcyBpc24ndCBpbiB0aGUgV2luZG93cyBoZWFkZXJzICovCisjaWZuZGVmIE1fUEkKKyNkZWZpbmUgTV9QSQkzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKworI2luY2x1ZGUgIlNETC5oIgorCisvKiBzY3JlZW4gc2l6ZSAqLworI2RlZmluZSBTQ1JXIDY0MAorI2RlZmluZSBTQ1JIIDQ4MAorCisjZGVmaW5lIE5CT0FUUyA1CisjZGVmaW5lIFNQRUVEIDIKKworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKy8qCisgKiB3YXZlIGNvbG91cnM6IE1hZGUgYnkgdGFraW5nIGEgbmFycm93IGNyb3NzLXNlY3Rpb24gb2YgYSB3YXZlIHBpY3R1cmUKKyAqIGluIEdpbXAsIHNhdmluZyBpbiBQUE0gYXNjaWkgZm9ybWF0IGFuZCBmb3JtYXR0aW5nIHdpdGggRW1hY3MgbWFjcm9zLgorICovCitzdGF0aWMgU0RMX0NvbG9yIHdhdmVtYXBbXSA9IHsKKyAgICB7MCwyLDEwM30sIHswLDcsMTEwfSwgezAsMTMsMTE3fSwgezAsMTksMTI1fSwKKyAgICB7MCwyNSwxMzN9LCB7MCwzMSwxNDF9LCB7MCwzNywxNTB9LCB7MCw0MywxNTh9LAorICAgIHswLDQ5LDE2Nn0sIHswLDU1LDE3NH0sIHswLDYxLDE4Mn0sIHswLDY3LDE5MH0sCisgICAgezAsNzMsMTk4fSwgezAsNzksMjA2fSwgezAsODYsMjE0fSwgezAsOTYsMjIwfSwKKyAgICB7NSwxMDUsMjI0fSwgezEyLDExMiwyMjZ9LCB7MTksMTIwLDIyN30sIHsyNiwxMjgsMjI5fSwKKyAgICB7MzMsMTM1LDIzMH0sIHs0MCwxNDMsMjMyfSwgezQ3LDE1MCwyMzR9LCB7NTQsMTU4LDIzNn0sCisgICAgezYxLDE2NSwyMzh9LCB7NjgsMTczLDIzOX0sIHs3NSwxODAsMjQxfSwgezgyLDE4OCwyNDJ9LAorICAgIHs4OSwxOTUsMjQ0fSwgezk2LDIwMywyNDZ9LCB7MTAzLDIxMCwyNDh9LCB7MTEyLDIxOCwyNTB9LAorICAgIHsxMjQsMjI0LDI1MH0sIHsxMzUsMjI2LDI1MX0sIHsxNDYsMjI5LDI1MX0sIHsxNTYsMjMxLDI1Mn0sCisgICAgezE2NywyMzMsMjUyfSwgezE3OCwyMzYsMjUyfSwgezE4OSwyMzgsMjUyfSwgezIwMCwyNDAsMjUyfSwKKyAgICB7MjExLDI0MiwyNTJ9LCB7MjIyLDI0NCwyNTJ9LCB7MjMzLDI0NywyNTJ9LCB7MjQyLDI0OSwyNTJ9LAorICAgIHsyMzcsMjUwLDI1Mn0sIHsyMDksMjUxLDI1Mn0sIHsxNzQsMjUxLDI1Mn0sIHsxMzgsMjUyLDI1Mn0sCisgICAgezEwMiwyNTEsMjUyfSwgezYzLDI1MCwyNTJ9LCB7MjQsMjQzLDI1Mn0sIHs3LDIyNSwyNTJ9LAorICAgIHs0LDIwMywyNTJ9LCB7MywxODEsMjUyfSwgezIsMTU4LDI1Mn0sIHsxLDEzNiwyNTF9LAorICAgIHswLDExMSwyNDh9LCB7MCw4MiwyMzR9LCB7MCw2MywyMTN9LCB7MCw1MCwxOTJ9LAorICAgIHswLDM5LDE3Mn0sIHswLDI4LDE1Mn0sIHswLDE3LDEzMn0sIHswLDcsMTE0fQorfTsKKworLyogQ2FsbCB0aGlzIGluc3RlYWQgb2YgZXhpdCgpLCBzbyB3ZSBjYW4gY2xlYW4gdXAgU0RMOiBhdGV4aXQoKSBpcyBldmlsLiAqLworc3RhdGljIHZvaWQgcXVpdChpbnQgcmMpCit7CisJU0RMX1F1aXQoKTsKKwlleGl0KHJjKTsKK30KKworc3RhdGljIHZvaWQgc2RsZXJyKGNoYXIgKndoZW4pCit7CisgICAgZnByaW50ZihzdGRlcnIsICJTREwgZXJyb3I6ICVzOiAlc1xuIiwgd2hlbiwgU0RMX0dldEVycm9yKCkpOworICAgIHF1aXQoMSk7Cit9CisKKy8qIGNyZWF0ZSBhIGJhY2tncm91bmQgc3VyZmFjZSAqLworc3RhdGljIFNETF9TdXJmYWNlICptYWtlX2JnKFNETF9TdXJmYWNlICpzY3JlZW4sIGludCBzdGFydGNvbCkKK3sKKyAgICBpbnQgaTsKKyAgICBTRExfU3VyZmFjZSAqYmcgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLCBzY3JlZW4tPncsIHNjcmVlbi0+aCwKKwkJCQkJICAgOCwgMCwgMCwgMCwgMCk7CisgICAgaWYoIWJnKQorCXNkbGVycigiY3JlYXRpbmcgYmFja2dyb3VuZCBzdXJmYWNlIik7CisKKyAgICAvKiBzZXQgdGhlIHBhbGV0dGUgdG8gdGhlIGxvZ2ljYWwgc2NyZWVuIHBhbGV0dGUgc28gdGhhdCBibGl0cworICAgICAgIHdvbid0IGJlIHRyYW5zbGF0ZWQgKi8KKyAgICBTRExfU2V0Q29sb3JzKGJnLCBzY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzLCAwLCAyNTYpOworCisgICAgLyogTWFrZSBhIHdhdnkgYmFja2dyb3VuZCBwYXR0ZXJuIHVzaW5nIGNvbG91cnMgMC02MyAqLworICAgIGlmKFNETF9Mb2NrU3VyZmFjZShiZykgPCAwKQorCXNkbGVycigibG9ja2luZyBiYWNrZ3JvdW5kIik7CisgICAgZm9yKGkgPSAwOyBpIDwgU0NSSDsgaSsrKSB7CisJVWludDggKnAgPSAoVWludDggKiliZy0+cGl4ZWxzICsgaSAqIGJnLT5waXRjaDsKKwlpbnQgaiwgZDsKKwlkID0gMDsKKwlmb3IoaiA9IDA7IGogPCBTQ1JXOyBqKyspIHsKKwkgICAgaW50IHYgPSBNQVgoZCwgLTIpOworCSAgICB2ID0gTUlOKHYsIDIpOworCSAgICBpZihpID4gMCkKKwkJdiArPSBwWy1iZy0+cGl0Y2hdICsgNjUgLSBzdGFydGNvbDsKKwkgICAgcFtqXSA9IHN0YXJ0Y29sICsgKHYgJiA2Myk7CisJICAgIGQgKz0gKChyYW5kKCkgPj4gMykgJSAzKSAtIDE7CisJfQorICAgIH0KKyAgICBTRExfVW5sb2NrU3VyZmFjZShiZyk7CisgICAgcmV0dXJuKGJnKTsKK30KKworLyoKKyAqIFJldHVybiBhIHN1cmZhY2UgZmxpcHBlZCBob3Jpc29udGFsbHkuIE9ubHkgd29ya3MgZm9yIDhicHA7CisgKiBleHRlbnNpb24gdG8gYXJiaXRyYXJ5IGJpdG5lc3MgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci4KKyAqLworc3RhdGljIFNETF9TdXJmYWNlICpoZmxpcChTRExfU3VyZmFjZSAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBTRExfU3VyZmFjZSAqeiA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsIHMtPncsIHMtPmgsIDgsCisJCQkJCSAgMCwgMCwgMCwgMCk7CisgICAgLyogY29weSBwYWxldHRlICovCisgICAgU0RMX1NldENvbG9ycyh6LCBzLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9ycywKKwkJICAwLCBzLT5mb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnMpOworICAgIGlmKFNETF9Mb2NrU3VyZmFjZShzKSA8IDAgfHwgU0RMX0xvY2tTdXJmYWNlKHopIDwgMCkKKwlzZGxlcnIoImxvY2tpbmcgZmxpcCBpbWFnZXMiKTsKKworICAgIGZvcihpID0gMDsgaSA8IHMtPmg7IGkrKykgeworCWludCBqOworCVVpbnQ4ICpmcm9tID0gKFVpbnQ4ICopcy0+cGl4ZWxzICsgaSAqIHMtPnBpdGNoOworCVVpbnQ4ICp0byA9IChVaW50OCAqKXotPnBpeGVscyArIGkgKiB6LT5waXRjaCArIHMtPncgLSAxOworCWZvcihqID0gMDsgaiA8IHMtPnc7IGorKykKKwkgICAgdG9bLWpdID0gZnJvbVtqXTsKKyAgICB9CisKKyAgICBTRExfVW5sb2NrU3VyZmFjZSh6KTsKKyAgICBTRExfVW5sb2NrU3VyZmFjZShzKTsKKyAgICByZXR1cm4gejsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIFNETF9Db2xvciBjbWFwWzI1Nl07CisgICAgU0RMX1N1cmZhY2UgKnNjcmVlbjsKKyAgICBTRExfU3VyZmFjZSAqYmc7CisgICAgU0RMX1N1cmZhY2UgKmJvYXRbMl07CisgICAgdW5zaWduZWQgdmlkZmxhZ3MgPSAwOworICAgIHVuc2lnbmVkIHN0YXJ0OworICAgIGludCBmYWRlX21heCA9IDQwMDsKKyAgICBpbnQgZmFkZV9sZXZlbCwgZmFkZV9kaXI7CisgICAgaW50IGJvYXRjb2xzLCBmcmFtZXMsIGksIHJlZDsKKyAgICBpbnQgYm9hdHhbTkJPQVRTXSwgYm9hdHlbTkJPQVRTXSwgYm9hdGRpcltOQk9BVFNdOworICAgIGludCBnYW1tYV9mYWRlID0gMDsKKyAgICBpbnQgZ2FtbWFfcmFtcCA9IDA7CisKKyAgICBpZihTRExfSW5pdChTRExfSU5JVF9WSURFTykgPCAwKQorCXNkbGVycigiaW5pdGlhbGlzaW5nIFNETCIpOworCisgICAgd2hpbGUoLS1hcmdjKSB7CisJKythcmd2OworCWlmKHN0cmNtcCgqYXJndiwgIi1odyIpID09IDApCisJICAgIHZpZGZsYWdzIHw9IFNETF9IV1NVUkZBQ0U7CisJZWxzZSBpZihzdHJjbXAoKmFyZ3YsICItZnVsbHNjcmVlbiIpID09IDApCisJICAgIHZpZGZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOworCWVsc2UgaWYoc3RyY21wKCphcmd2LCAiLW5vZmFkZSIpID09IDApCisJICAgIGZhZGVfbWF4ID0gMTsKKwllbHNlIGlmKHN0cmNtcCgqYXJndiwgIi1nYW1tYSIpID09IDApCisJICAgIGdhbW1hX2ZhZGUgPSAxOworCWVsc2UgaWYoc3RyY21wKCphcmd2LCAiLWdhbW1hcmFtcCIpID09IDApCisJICAgIGdhbW1hX3JhbXAgPSAxOworCWVsc2UgeworCSAgICBmcHJpbnRmKHN0ZGVyciwKKwkJICAgICJ1c2FnZTogdGVzdHBhbGV0dGUgIgorCQkgICAgIiBbLWh3XSBbLWZ1bGxzY3JlZW5dIFstbm9mYWRlXSBbLWdhbW1hXSBbLWdhbW1hcmFtcF1cbiIpOworCSAgICBxdWl0KDEpOworCX0KKyAgICB9CisKKyAgICAvKiBBc2sgZXhwbGljaXRseSBmb3IgOGJwcCBhbmQgYSBoYXJkd2FyZSBwYWxldHRlICovCisgICAgaWYoKHNjcmVlbiA9IFNETF9TZXRWaWRlb01vZGUoU0NSVywgU0NSSCwgOCwgdmlkZmxhZ3MgfCBTRExfSFdQQUxFVFRFKSkgPT0gTlVMTCkgeworCWZwcmludGYoc3RkZXJyLCAiZXJyb3Igc2V0dGluZyAlZHglZCA4YnBwIGluZGV4ZWQgbW9kZTogJXNcbiIsCisJCVNDUlcsIFNDUkgsIFNETF9HZXRFcnJvcigpKTsKKwlxdWl0KDEpOworICAgIH0KKworICAgIGlmICh2aWRmbGFncyAmIFNETF9GVUxMU0NSRUVOKSBTRExfU2hvd0N1cnNvciAoU0RMX0ZBTFNFKTsKKworICAgIGlmKChib2F0WzBdID0gU0RMX0xvYWRCTVAoInNhaWwuYm1wIikpID09IE5VTEwpCisJc2RsZXJyKCJsb2FkaW5nIHNhaWwuYm1wIik7CisgICAgLyogV2UndmUgY2hvc2VuIG1hZ2VudGEgKCNmZjAwZmYpIGFzIGNvbG91ciBrZXkgZm9yIHRoZSBib2F0ICovCisgICAgU0RMX1NldENvbG9yS2V5KGJvYXRbMF0sIFNETF9TUkNDT0xPUktFWSB8IFNETF9STEVBQ0NFTCwKKwkJICAgIFNETF9NYXBSR0IoYm9hdFswXS0+Zm9ybWF0LCAweGZmLCAweDAwLCAweGZmKSk7CisgICAgYm9hdGNvbHMgPSBib2F0WzBdLT5mb3JtYXQtPnBhbGV0dGUtPm5jb2xvcnM7CisgICAgYm9hdFsxXSA9IGhmbGlwKGJvYXRbMF0pOworICAgIFNETF9TZXRDb2xvcktleShib2F0WzFdLCBTRExfU1JDQ09MT1JLRVkgfCBTRExfUkxFQUNDRUwsCisJCSAgICBTRExfTWFwUkdCKGJvYXRbMV0tPmZvcm1hdCwgMHhmZiwgMHgwMCwgMHhmZikpOworCisgICAgLyoKKyAgICAgKiBGaXJzdCBzZXQgdGhlIHBoeXNpY2FsIHNjcmVlbiBwYWxldHRlIHRvIGJsYWNrLCBzbyB0aGUgdXNlciB3b24ndAorICAgICAqIHNlZSBvdXIgaW5pdGlhbCBkcmF3aW5nIG9uIHRoZSBzY3JlZW4uCisgICAgICovCisgICAgbWVtc2V0KGNtYXAsIDAsIHNpemVvZihjbWFwKSk7CisgICAgU0RMX1NldFBhbGV0dGUoc2NyZWVuLCBTRExfUEhZU1BBTCwgY21hcCwgMCwgMjU2KTsKKworICAgIC8qCisgICAgICogUHJvcGVyIHBhbGV0dGUgbWFuYWdlbWVudCBpcyBpbXBvcnRhbnQgd2hlbiBwbGF5aW5nIGdhbWVzIHdpdGggdGhlCisgICAgICogY29sb3JtYXAuIFdlIGhhdmUgZGl2aWRlZCB0aGUgcGFsZXR0ZSBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogaW5kZXggMC4uKGJvYXRjb2xzLTEpOgkJdXNlZCBmb3IgdGhlIGJvYXQKKyAgICAgKiBpbmRleCBib2F0Y29scy4uKGJvYXRjb2xzKzYzKToJdXNlZCBmb3IgdGhlIHdhdmVzCisgICAgICovCisgICAgU0RMX1NldFBhbGV0dGUoc2NyZWVuLCBTRExfTE9HUEFMLAorCQkgICBib2F0WzBdLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9ycywgMCwgYm9hdGNvbHMpOworICAgIFNETF9TZXRQYWxldHRlKHNjcmVlbiwgU0RMX0xPR1BBTCwgd2F2ZW1hcCwgYm9hdGNvbHMsIDY0KTsKKworICAgIC8qCisgICAgICogTm93IHRoZSBsb2dpY2FsIHNjcmVlbiBwYWxldHRlIGlzIHNldCwgYW5kIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4KKyAgICAgKiBUaGUgYm9hdHMgYWxyZWFkeSBoYXZlIHRoZSBzYW1lIHBhbGV0dGUgc28gZmFzdCBibGl0cyBjYW4gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBtZW1jcHkoY21hcCwgc2NyZWVuLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9ycywgMjU2ICogc2l6ZW9mKFNETF9Db2xvcikpOworCisgICAgLyogc2F2ZSB0aGUgaW5kZXggb2YgdGhlIHJlZCBjb2xvdXIgZm9yIGxhdGVyICovCisgICAgcmVkID0gU0RMX01hcFJHQihzY3JlZW4tPmZvcm1hdCwgMHhmZiwgMHgwMCwgMHgwMCk7CisKKyAgICBiZyA9IG1ha2VfYmcoc2NyZWVuLCBib2F0Y29scyk7IC8qIG1ha2UgYSBuaWNlIHdhdnkgYmFja2dyb3VuZCBzdXJmYWNlICovCisKKyAgICAvKiBpbml0aWFsIHNjcmVlbiBjb250ZW50cyAqLworICAgIGlmKFNETF9CbGl0U3VyZmFjZShiZywgTlVMTCwgc2NyZWVuLCBOVUxMKSA8IDApCisJc2RsZXJyKCJibGl0dGluZyBiYWNrZ3JvdW5kIHRvIHNjcmVlbiIpOworICAgIFNETF9GbGlwKHNjcmVlbik7CQkvKiBhY3R1YWxseSBwdXQgdGhlIGJhY2tncm91bmQgb24gc2NyZWVuICovCisKKyAgICAvKiBkZXRlcm1pbmUgaW5pdGlhbCBib2F0IHBsYWNlbWVudHMgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBOQk9BVFM7IGkrKykgeworCWJvYXR4W2ldID0gKHJhbmQoKSAlIChTQ1JXICsgYm9hdFswXS0+dykpIC0gYm9hdFswXS0+dzsKKwlib2F0eVtpXSA9IGkgKiAoU0NSSCAtIGJvYXRbMF0tPmgpIC8gKE5CT0FUUyAtIDEpOworCWJvYXRkaXJbaV0gPSAoKHJhbmQoKSA+PiA1KSAmIDEpICogMiAtIDE7CisgICAgfQorCisgICAgc3RhcnQgPSBTRExfR2V0VGlja3MoKTsKKyAgICBmcmFtZXMgPSAwOworICAgIGZhZGVfZGlyID0gMTsKKyAgICBmYWRlX2xldmVsID0gMDsKKyAgICBkbyB7CisJU0RMX0V2ZW50IGU7CisJU0RMX1JlY3QgdXBkYXRlc1tOQk9BVFNdOworCVNETF9SZWN0IHI7CisJaW50IHJlZHBoYXNlOworCisJLyogQSBzbWFsbCBldmVudCBsb29wOiBqdXN0IGV4aXQgb24gYW55IGtleSBvciBtb3VzZSBidXR0b24gZXZlbnQgKi8KKwl3aGlsZShTRExfUG9sbEV2ZW50KCZlKSkgeworCSAgICBpZihlLnR5cGUgPT0gU0RMX0tFWURPV04gfHwgZS50eXBlID09IFNETF9RVUlUCisJICAgICAgIHx8IGUudHlwZSA9PSBTRExfTU9VU0VCVVRUT05ET1dOKSB7CisJCWlmKGZhZGVfZGlyIDwgMCkKKwkJICAgIGZhZGVfbGV2ZWwgPSAwOworCQlmYWRlX2RpciA9IC0xOworCSAgICB9CisJfQorCisJLyogbW92ZSBib2F0cyAqLworCWZvcihpID0gMDsgaSA8IE5CT0FUUzsgaSsrKSB7CisJICAgIGludCBvbGRfeCA9IGJvYXR4W2ldOworCSAgICAvKiB1cGRhdGUgYm9hdCBwb3NpdGlvbiAqLworCSAgICBib2F0eFtpXSArPSBib2F0ZGlyW2ldICogU1BFRUQ7CisJICAgIGlmKGJvYXR4W2ldIDw9IC1ib2F0WzBdLT53IHx8IGJvYXR4W2ldID49IFNDUlcpCisJCWJvYXRkaXJbaV0gPSAtYm9hdGRpcltpXTsKKworCSAgICAvKiBwYWludCBvdmVyIHRoZSBvbGQgYm9hdCBwb3NpdGlvbiAqLworCSAgICByLnggPSBvbGRfeDsKKwkgICAgci55ID0gYm9hdHlbaV07CisJICAgIHIudyA9IGJvYXRbMF0tPnc7CisJICAgIHIuaCA9IGJvYXRbMF0tPmg7CisJICAgIGlmKFNETF9CbGl0U3VyZmFjZShiZywgJnIsIHNjcmVlbiwgJnIpIDwgMCkKKwkJc2RsZXJyKCJibGl0dGluZyBiYWNrZ3JvdW5kIik7CisKKwkgICAgLyogY29uc3RydWN0IHVwZGF0ZSByZWN0YW5nbGUgKGJvdW5kaW5nIGJveCBvZiBvbGQgYW5kIG5ldyBwb3MpICovCisJICAgIHVwZGF0ZXNbaV0ueCA9IE1JTihvbGRfeCwgYm9hdHhbaV0pOworCSAgICB1cGRhdGVzW2ldLnkgPSBib2F0eVtpXTsKKwkgICAgdXBkYXRlc1tpXS53ID0gYm9hdFswXS0+dyArIFNQRUVEOworCSAgICB1cGRhdGVzW2ldLmggPSBib2F0WzBdLT5oOworCSAgICAvKiBjbGlwIHVwZGF0ZSByZWN0YW5nbGUgdG8gc2NyZWVuICovCisJICAgIGlmKHVwZGF0ZXNbaV0ueCA8IDApIHsKKwkJdXBkYXRlc1tpXS53ICs9IHVwZGF0ZXNbaV0ueDsKKwkJdXBkYXRlc1tpXS54ID0gMDsKKwkgICAgfQorCSAgICBpZih1cGRhdGVzW2ldLnggKyB1cGRhdGVzW2ldLncgPiBTQ1JXKQorCQl1cGRhdGVzW2ldLncgPSBTQ1JXIC0gdXBkYXRlc1tpXS54OworCX0KKworCWZvcihpID0gMDsgaSA8IE5CT0FUUzsgaSsrKSB7CisJICAgIC8qIHBhaW50IGJvYXQgb24gbmV3IHBvc2l0aW9uICovCisJICAgIHIueCA9IGJvYXR4W2ldOworCSAgICByLnkgPSBib2F0eVtpXTsKKwkgICAgaWYoU0RMX0JsaXRTdXJmYWNlKGJvYXRbKGJvYXRkaXJbaV0gKyAxKSAvIDJdLCBOVUxMLAorCQkJICAgICAgIHNjcmVlbiwgJnIpIDwgMCkKKwkJc2RsZXJyKCJibGl0dGluZyBib2F0Iik7CisJfQorCisJLyogY3ljbGUgd2F2ZSBwYWxldHRlICovCisJZm9yKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkgICAgY21hcFtib2F0Y29scyArICgoaSArIGZyYW1lcykgJiA2MyldID0gd2F2ZW1hcFtpXTsKKworCWlmKGZhZGVfZGlyKSB7CisJICAgIC8qIEZhZGUgdGhlIGVudGlyZSBwYWxldHRlIGluL291dCAqLworCSAgICBmYWRlX2xldmVsICs9IGZhZGVfZGlyOworCisJICAgIGlmKGdhbW1hX2ZhZGUpIHsKKwkJLyogRmFkZSBsaW5lYXJseSBpbiBnYW1tYSBsZXZlbCAobG91c3kpICovCisJCWZsb2F0IGxldmVsID0gKGZsb2F0KWZhZGVfbGV2ZWwgLyBmYWRlX21heDsKKwkJaWYoU0RMX1NldEdhbW1hKGxldmVsLCBsZXZlbCwgbGV2ZWwpIDwgMCkKKwkJICAgIHNkbGVycigic2V0dGluZyBnYW1tYSIpOworCisJICAgIH0gZWxzZSBpZihnYW1tYV9yYW1wKSB7CisJCS8qIEZhZGUgdXNpbmcgZ2FtbWEgcmFtcCAoYmV0dGVyKSAqLworCQlVaW50MTYgcmFtcFsyNTZdOworCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJICAgIHJhbXBbaV0gPSAoaSAqIGZhZGVfbGV2ZWwgLyBmYWRlX21heCkgPDwgODsKKwkJaWYoU0RMX1NldEdhbW1hUmFtcChyYW1wLCByYW1wLCByYW1wKSA8IDApCisJCSAgICBzZGxlcnIoInNldHRpbmcgZ2FtbWEgcmFtcCIpOworCisJICAgIH0gZWxzZSB7CisJCS8qIEZhZGUgdXNpbmcgZGlyZWN0IHBhbGV0dGUgbWFuaXB1bGF0aW9uIChiZXN0KSAqLworCQltZW1jcHkoY21hcCwgc2NyZWVuLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9ycywKKwkJICAgICAgIGJvYXRjb2xzICogc2l6ZW9mKFNETF9Db2xvcikpOworCQlmb3IoaSA9IDA7IGkgPCBib2F0Y29scyArIDY0OyBpKyspIHsKKwkJICAgIGNtYXBbaV0uciA9IGNtYXBbaV0uciAqIGZhZGVfbGV2ZWwgLyBmYWRlX21heDsKKwkJICAgIGNtYXBbaV0uZyA9IGNtYXBbaV0uZyAqIGZhZGVfbGV2ZWwgLyBmYWRlX21heDsKKwkJICAgIGNtYXBbaV0uYiA9IGNtYXBbaV0uYiAqIGZhZGVfbGV2ZWwgLyBmYWRlX21heDsKKwkJfQorCSAgICB9CisJICAgIGlmKGZhZGVfbGV2ZWwgPT0gZmFkZV9tYXgpCisJCWZhZGVfZGlyID0gMDsKKwl9CisKKwkvKiBwdWxzZSB0aGUgcmVkIGNvbG91ciAoZG9uZSBhZnRlciB0aGUgZmFkZSwgZm9yIGEgbmlnaHQgZWZmZWN0KSAqLworCXJlZHBoYXNlID0gZnJhbWVzICUgNjQ7CisJY21hcFtyZWRdLnIgPSAoaW50KSgyNTUgKiBzaW4ocmVkcGhhc2UgKiBNX1BJIC8gNjMpKTsKKworCVNETF9TZXRQYWxldHRlKHNjcmVlbiwgU0RMX1BIWVNQQUwsIGNtYXAsIDAsIGJvYXRjb2xzICsgNjQpOworCisJLyogdXBkYXRlIGNoYW5nZWQgYXJlYXMgb2YgdGhlIHNjcmVlbiAqLworCVNETF9VcGRhdGVSZWN0cyhzY3JlZW4sIE5CT0FUUywgdXBkYXRlcyk7CisJZnJhbWVzKys7CisgICAgfSB3aGlsZShmYWRlX2xldmVsID4gMCk7CisKKyAgICBwcmludGYoIiVkIGZyYW1lcywgJS4yZiBmcHNcbiIsCisJICAgZnJhbWVzLCAxMDAwLjAgKiBmcmFtZXMgLyAoU0RMX0dldFRpY2tzKCkgLSBzdGFydCkpOworCisgICAgaWYgKHZpZGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4pIFNETF9TaG93Q3Vyc29yIChTRExfVFJVRSk7CisgICAgU0RMX1F1aXQoKTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHBsYXRmb3JtLmMgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0cGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjhhOTZmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHBsYXRmb3JtLmMKQEAgLTAsMCArMSwyMTAgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfZW5kaWFuLmgiCisjaW5jbHVkZSAiU0RMX2NwdWluZm8uaCIKKworLyoKKyAqIFdhdGNvbSBDIGZsYWdzIHRoZXNlIGFzIFdhcm5pbmcgMjAxOiAiVW5yZWFjaGFibGUgY29kZSIgaWYgeW91IGp1c3QKKyAqICBjb21wYXJlIHRoZW0gZGlyZWN0bHksIHNvIHdlIHB1c2ggaXQgdGhyb3VnaCBhIGZ1bmN0aW9uIHRvIGtlZXAgdGhlCisgKiAgY29tcGlsZXIgcXVpZXQuICAtLXJ5YW4uCisgKi8KK3N0YXRpYyBpbnQgYmFkc2l6ZShzaXplX3Qgc2l6ZW9mdHlwZSwgc2l6ZV90IGhhcmRjb2RldHlwZSkKK3sKKyAgICByZXR1cm4gc2l6ZW9mdHlwZSAhPSBoYXJkY29kZXR5cGU7Cit9CisKK2ludCBUZXN0VHlwZXMoU0RMX2Jvb2wgdmVyYm9zZSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKCBiYWRzaXplKHNpemVvZihVaW50OCksIDEpICkgeworCQlpZiAoIHZlcmJvc2UgKQorCQkJcHJpbnRmKCJzaXplb2YoVWludDgpICE9IDEsIGluc3RlYWQgPSAlbHVcbiIsCisJCQkJCQkJCSh1bnNpZ25lZCBsb25nKSBzaXplb2YoVWludDgpKTsKKwkJKytlcnJvcjsKKwl9CisJaWYgKCBiYWRzaXplKHNpemVvZihVaW50MTYpLCAyKSApIHsKKwkJaWYgKCB2ZXJib3NlICkKKwkJCXByaW50Zigic2l6ZW9mKFVpbnQxNikgIT0gMiwgaW5zdGVhZCA9ICVsdVxuIiwKKwkJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihVaW50MTYpKTsKKwkJKytlcnJvcjsKKwl9CisJaWYgKCBiYWRzaXplKHNpemVvZihVaW50MzIpLCA0KSApIHsKKwkJaWYgKCB2ZXJib3NlICkKKwkJCXByaW50Zigic2l6ZW9mKFVpbnQzMikgIT0gNCwgaW5zdGVhZCA9ICVsdVxuIiwKKwkJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihVaW50MzIpKTsKKwkJKytlcnJvcjsKKwl9CisjaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCisJaWYgKCBiYWRzaXplKHNpemVvZihVaW50NjQpLCA4KSApIHsKKwkJaWYgKCB2ZXJib3NlICkKKwkJCXByaW50Zigic2l6ZW9mKFVpbnQ2NCkgIT0gOCwgaW5zdGVhZCA9ICVsdVxuIiwKKwkJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihVaW50NjQpKTsKKwkJKytlcnJvcjsKKwl9CisjZWxzZQorCWlmICggdmVyYm9zZSApIHsKKwkJcHJpbnRmKCJXQVJOSU5HOiBObyA2NC1iaXQgZGF0YXR5cGUgb24gdGhpcyBwbGF0Zm9ybVxuIik7CisJfQorI2VuZGlmCisJaWYgKCB2ZXJib3NlICYmICFlcnJvciApCisJCXByaW50ZigiQWxsIGRhdGEgdHlwZXMgYXJlIHRoZSBleHBlY3RlZCBzaXplLlxuIik7CisKKwlyZXR1cm4oIGVycm9yID8gMSA6IDAgKTsKK30KKworaW50IFRlc3RFbmRpYW4oU0RMX2Jvb2wgdmVyYm9zZSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCVVpbnQxNiB2YWx1ZSA9IDB4MTIzNDsKKwlpbnQgcmVhbF9ieXRlb3JkZXI7CisJVWludDE2IHZhbHVlMTYgPSAweENEQUI7CisJVWludDE2IHN3YXBwZWQxNiA9IDB4QUJDRDsKKwlVaW50MzIgdmFsdWUzMiA9IDB4RUZCRUFEREU7CisJVWludDMyIHN3YXBwZWQzMiA9IDB4REVBREJFRUY7CisjaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCisJVWludDY0IHZhbHVlNjQsIHN3YXBwZWQ2NDsKKwl2YWx1ZTY0ID0gMHhFRkJFQURERTsKKwl2YWx1ZTY0IDw8PSAzMjsKKwl2YWx1ZTY0IHw9IDB4Q0RBQjM0MTI7CisJc3dhcHBlZDY0ID0gMHgxMjM0QUJDRDsKKwlzd2FwcGVkNjQgPDw9IDMyOworCXN3YXBwZWQ2NCB8PSAweERFQURCRUVGOworI2VuZGlmCisKKwlpZiAoIHZlcmJvc2UgKSB7CisJCXByaW50ZigiRGV0ZWN0ZWQgYSAlcyBlbmRpYW4gbWFjaGluZS5cbiIsCisJCQkoU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTikgPyAibGl0dGxlIiA6ICJiaWciKTsKKwl9CisJaWYgKCAoKigoY2hhciAqKSZ2YWx1ZSkgPj4gNCkgPT0gMHgxICkgeworCQlyZWFsX2J5dGVvcmRlciA9IFNETF9CSUdfRU5ESUFOOworCX0gZWxzZSB7CisJCXJlYWxfYnl0ZW9yZGVyID0gU0RMX0xJTF9FTkRJQU47CisJfQorCWlmICggcmVhbF9ieXRlb3JkZXIgIT0gU0RMX0JZVEVPUkRFUiApIHsKKwkJaWYgKCB2ZXJib3NlICkgeworCQkJcHJpbnRmKCJBY3R1YWxseSBhICVzIGVuZGlhbiBtYWNoaW5lIVxuIiwKKwkJCQkocmVhbF9ieXRlb3JkZXIgPT0gU0RMX0xJTF9FTkRJQU4pID8gImxpdHRsZSIgOiAiYmlnIik7CisJCX0KKwkJKytlcnJvcjsKKwl9CisJaWYgKCB2ZXJib3NlICkgeworCQlwcmludGYoIlZhbHVlIDE2ID0gMHglWCwgc3dhcHBlZCA9IDB4JVhcbiIsIHZhbHVlMTYsIFNETF9Td2FwMTYodmFsdWUxNikpOworCX0KKwlpZiAoIFNETF9Td2FwMTYodmFsdWUxNikgIT0gc3dhcHBlZDE2ICkgeworCQlpZiAoIHZlcmJvc2UgKSB7CisJCQlwcmludGYoIjE2IGJpdCB2YWx1ZSBzd2FwcGVkIGluY29ycmVjdGx5IVxuIik7CisJCX0KKwkJKytlcnJvcjsKKwl9CisJaWYgKCB2ZXJib3NlICkgeworCQlwcmludGYoIlZhbHVlIDMyID0gMHglWCwgc3dhcHBlZCA9IDB4JVhcbiIsIHZhbHVlMzIsIFNETF9Td2FwMzIodmFsdWUzMikpOworCX0KKwlpZiAoIFNETF9Td2FwMzIodmFsdWUzMikgIT0gc3dhcHBlZDMyICkgeworCQlpZiAoIHZlcmJvc2UgKSB7CisJCQlwcmludGYoIjMyIGJpdCB2YWx1ZSBzd2FwcGVkIGluY29ycmVjdGx5IVxuIik7CisJCX0KKwkJKytlcnJvcjsKKwl9CisjaWZkZWYgU0RMX0hBU182NEJJVF9UWVBFCisJaWYgKCB2ZXJib3NlICkgeworI2lmZGVmIF9NU0NfVkVSCisJCXByaW50ZigiVmFsdWUgNjQgPSAweCVJNjRYLCBzd2FwcGVkID0gMHglSTY0WFxuIiwgdmFsdWU2NCwgU0RMX1N3YXA2NCh2YWx1ZTY0KSk7CisjZWxzZQorCQlwcmludGYoIlZhbHVlIDY0ID0gMHglbGxYLCBzd2FwcGVkID0gMHglbGxYXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKSB2YWx1ZTY0LCAodW5zaWduZWQgbG9uZyBsb25nKSBTRExfU3dhcDY0KHZhbHVlNjQpKTsKKyNlbmRpZgorCX0KKwlpZiAoIFNETF9Td2FwNjQodmFsdWU2NCkgIT0gc3dhcHBlZDY0ICkgeworCQlpZiAoIHZlcmJvc2UgKSB7CisJCQlwcmludGYoIjY0IGJpdCB2YWx1ZSBzd2FwcGVkIGluY29ycmVjdGx5IVxuIik7CisJCX0KKwkJKytlcnJvcjsKKwl9CisjZW5kaWYKKwlyZXR1cm4oIGVycm9yID8gMSA6IDAgKTsKK30KKworCitpbnQgVGVzdENQVUluZm8oU0RMX2Jvb2wgdmVyYm9zZSkKK3sKKwlpZiAoIHZlcmJvc2UgKSB7CisJCXByaW50ZigiUkRUU0MgJXNcbiIsIFNETF9IYXNSRFRTQygpID8gImRldGVjdGVkIiA6ICJub3QgZGV0ZWN0ZWQiKTsKKwkJcHJpbnRmKCJNTVggJXNcbiIsIFNETF9IYXNNTVgoKSA/ICJkZXRlY3RlZCIgOiAibm90IGRldGVjdGVkIik7CisJCXByaW50ZigiTU1YIEV4dCAlc1xuIiwgU0RMX0hhc01NWEV4dCgpID8gImRldGVjdGVkIiA6ICJub3QgZGV0ZWN0ZWQiKTsKKwkJcHJpbnRmKCIzRE5vdyAlc1xuIiwgU0RMX0hhczNETm93KCkgPyAiZGV0ZWN0ZWQiIDogIm5vdCBkZXRlY3RlZCIpOworCQlwcmludGYoIjNETm93IEV4dCAlc1xuIiwgU0RMX0hhczNETm93RXh0KCkgPyAiZGV0ZWN0ZWQiIDogIm5vdCBkZXRlY3RlZCIpOworCQlwcmludGYoIlNTRSAlc1xuIiwgU0RMX0hhc1NTRSgpID8gImRldGVjdGVkIiA6ICJub3QgZGV0ZWN0ZWQiKTsKKwkJcHJpbnRmKCJTU0UyICVzXG4iLCBTRExfSGFzU1NFMigpID8gImRldGVjdGVkIiA6ICJub3QgZGV0ZWN0ZWQiKTsKKwkJcHJpbnRmKCJBbHRpVmVjICVzXG4iLCBTRExfSGFzQWx0aVZlYygpID8gImRldGVjdGVkIiA6ICJub3QgZGV0ZWN0ZWQiKTsKKwl9CisJcmV0dXJuKDApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCVNETF9ib29sIHZlcmJvc2UgPSBTRExfVFJVRTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICggYXJndlsxXSAmJiAoU0RMX3N0cmNtcChhcmd2WzFdLCAiLXEiKSA9PSAwKSApIHsKKwkJdmVyYm9zZSA9IFNETF9GQUxTRTsKKwl9CisJaWYgKCB2ZXJib3NlICkgeworCQlwcmludGYoIlRoaXMgc3lzdGVtIGlzIHJ1bm5pbmcgJXNcbiIsCisjaWYgX19BSVhfXworCQkJIkFJWCIKKyNlbGlmIF9fSEFJS1VfXworLyogSGFpa3UgbXVzdCBhcHBlYXIgaGVyZSBiZWZvcmUgQmVPUywgc2luY2UgaXQgYWxzbyBkZWZpbmVzIF9fQkVPU19fICovCisJCQkiSGFpa3UiCisjZWxpZiBfX0JFT1NfXworCQkJIkJlT1MiCisjZWxpZiBfX0JTRElfXworCQkJIkJTREkiCisjZWxpZiBfX0RSRUFNQ0FTVF9fCisJCQkiRHJlYW1jYXN0IgorI2VsaWYgX19GUkVFQlNEX18KKwkJCSJGcmVlQlNEIgorI2VsaWYgX19IUFVYX18KKwkJCSJIUC1VWCIKKyNlbGlmIF9fSVJJWF9fCisJCQkiSXJpeCIKKyNlbGlmIF9fTElOVVhfXworCQkJIkxpbnV4IgorI2VsaWYgX19NSU5UX18KKwkJCSJBdGFyaSBNaU5UIgorI2VsaWYgX19NQUNPU19fCisJCQkiTWFjT1MgQ2xhc3NpYyIKKyNlbGlmIF9fTUFDT1NYX18KKwkJCSJNYWMgT1MgWCIKKyNlbGlmIF9fTkVUQlNEX18KKwkJCSJOZXRCU0QiCisjZWxpZiBfX09QRU5CU0RfXworCQkJIk9wZW5CU0QiCisjZWxpZiBfX09TMl9fCisJCQkiT1MvMiIKKyNlbGlmIF9fT1NGX18KKwkJCSJPU0YvMSIKKyNlbGlmIF9fUU5YTlRPX18KKwkJCSJRTlggTmV1dHJpbm8iCisjZWxpZiBfX1JJU0NPU19fCisJCQkiUklTQyBPUyIKKyNlbGlmIF9fU09MQVJJU19fCisJCQkiU29sYXJpcyIKKyNlbGlmIF9fV0lOMzJfXworI2lmZGVmIF9XSU4zMl9XQ0UKKwkJCSJXaW5kb3dzIENFIgorI2Vsc2UKKwkJCSJXaW5kb3dzIgorI2VuZGlmCisjZWxzZQorCQkJImFuIHVua25vd24gb3BlcmF0aW5nIHN5c3RlbSEgKHNlZSBTRExfcGxhdGZvcm0uaCkiCisjZW5kaWYKKwkJKTsKKwl9CisKKwlzdGF0dXMgKz0gVGVzdFR5cGVzKHZlcmJvc2UpOworCXN0YXR1cyArPSBUZXN0RW5kaWFuKHZlcmJvc2UpOworCXN0YXR1cyArPSBUZXN0Q1BVSW5mbyh2ZXJib3NlKTsKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHNlbS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHNlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDY0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0c2VtLmMKQEAgLTAsMCArMSwxMDMgQEAKKworLyogU2ltcGxlIHRlc3Qgb2YgdGhlIFNETCBzZW1hcGhvcmUgY29kZSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKworI2RlZmluZSBOVU1fVEhSRUFEUyAxMAorCitzdGF0aWMgU0RMX3NlbSAqc2VtOworaW50IGFsaXZlID0gMTsKKworaW50IFNETENBTEwgVGhyZWFkRnVuYyh2b2lkICpkYXRhKQoreworCWludCB0aHJlYWRudW0gPSAoaW50KSh1aW50cHRyX3QpZGF0YTsKKwl3aGlsZSAoIGFsaXZlICkgeworCQlTRExfU2VtV2FpdChzZW0pOworCQlmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBudW1iZXIgJWQgaGFzIGdvdCB0aGUgc2VtYXBob3JlICh2YWx1ZSA9ICVkKSFcbiIsIHRocmVhZG51bSwgU0RMX1NlbVZhbHVlKHNlbSkpOworCQlTRExfRGVsYXkoMjAwKTsKKwkJU0RMX1NlbVBvc3Qoc2VtKTsKKwkJZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnVtYmVyICVkIGhhcyByZWxlYXNlZCB0aGUgc2VtYXBob3JlICh2YWx1ZSA9ICVkKSFcbiIsIHRocmVhZG51bSwgU0RMX1NlbVZhbHVlKHNlbSkpOworCQlTRExfRGVsYXkoMSk7IC8qIEZvciB0aGUgc2NoZWR1bGVyICovCisJfQorCXByaW50ZigiVGhyZWFkIG51bWJlciAlZCBleGl0aW5nLlxuIiwgdGhyZWFkbnVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQga2lsbGVkKGludCBzaWcpCit7CisJYWxpdmUgPSAwOworfQorCitzdGF0aWMgdm9pZCBUZXN0V2FpdFRpbWVvdXQodm9pZCkKK3sKKwlVaW50MzIgc3RhcnRfdGlja3M7CisJVWludDMyIGVuZF90aWNrczsKKwlVaW50MzIgZHVyYXRpb247CisKKwlzZW0gPSBTRExfQ3JlYXRlU2VtYXBob3JlKDApOworCXByaW50ZigiV2FpdGluZyAyIHNlY29uZHMgb24gc2VtYXBob3JlXG4iKTsKKworCXN0YXJ0X3RpY2tzID0gU0RMX0dldFRpY2tzKCk7CisJU0RMX1NlbVdhaXRUaW1lb3V0KHNlbSwgMjAwMCk7CisJZW5kX3RpY2tzID0gU0RMX0dldFRpY2tzKCk7CisKKwlkdXJhdGlvbiA9IGVuZF90aWNrcyAtIHN0YXJ0X3RpY2tzOworCQorCS8qIEFjY2VwdCBhIGxpdHRsZSBvZmZzZXQgaW4gdGhlIGVmZmVjdGl2ZSB3YWl0ICovCisJaWYgKGR1cmF0aW9uID4gMTkwMCAmJiBkdXJhdGlvbiA8IDIwNTApCisJCXByaW50ZigiV2FpdCBkb25lLlxuIik7CisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgIldhaXQgdG9vayAlZCBtaWxsaXNlY29uZHNcbiIsIGR1cmF0aW9uKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCVNETF9UaHJlYWQgKnRocmVhZHNbTlVNX1RIUkVBRFNdOworCXVpbnRwdHJfdCBpOworCWludCBpbml0X3NlbTsKKworCWlmKGFyZ2MgPCAyKSB7CisJCWZwcmludGYoc3RkZXJyLCJVc2FnZTogJXMgaW5pdF92YWx1ZVxuIiwgYXJndlswXSk7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBMb2FkIHRoZSBTREwgbGlicmFyeSAqLworCWlmICggU0RMX0luaXQoMCkgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisJc2lnbmFsKFNJR1RFUk0sIGtpbGxlZCk7CisJc2lnbmFsKFNJR0lOVCwga2lsbGVkKTsKKwkKKwlpbml0X3NlbSA9IGF0b2koYXJndlsxXSk7CisJc2VtID0gU0RMX0NyZWF0ZVNlbWFwaG9yZShpbml0X3NlbSk7CisJCisJcHJpbnRmKCJSdW5uaW5nICVkIHRocmVhZHMsIHNlbWFwaG9yZSB2YWx1ZSA9ICVkXG4iLCBOVU1fVEhSRUFEUywgaW5pdF9zZW0pOworCS8qIENyZWF0ZSBhbGwgdGhlIHRocmVhZHMgKi8KKwlmb3IoIGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7ICsraSApIHsKKwkJdGhyZWFkc1tpXSA9IFNETF9DcmVhdGVUaHJlYWQoVGhyZWFkRnVuYywgKHZvaWQqKWkpOworCX0KKworCS8qIFdhaXQgMTAgc2Vjb25kcyAqLworCVNETF9EZWxheSgxMCAqIDEwMDApOworCisJLyogV2FpdCBmb3IgYWxsIHRocmVhZHMgdG8gZmluaXNoICovCisJcHJpbnRmKCJXYWl0aW5nIGZvciB0aHJlYWRzIHRvIGZpbmlzaFxuIik7CisJYWxpdmUgPSAwOworCWZvciggaSA9IDA7IGkgPCBOVU1fVEhSRUFEUzsgKytpICkgeworCQlTRExfV2FpdFRocmVhZCh0aHJlYWRzW2ldLCBOVUxMKTsKKwl9CisJcHJpbnRmKCJGaW5pc2hlZCB3YWl0aW5nIGZvciB0aHJlYWRzXG4iKTsKKworCVNETF9EZXN0cm95U2VtYXBob3JlKHNlbSk7CisKKwlUZXN0V2FpdFRpbWVvdXQoKTsKKworCVNETF9RdWl0KCk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHNwcml0ZS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHNwcml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOWUwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC90ZXN0c3ByaXRlLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qIFNpbXBsZSBwcm9ncmFtOiAgTW92ZSBOIHNwcml0ZXMgYXJvdW5kIG9uIHRoZSBzY3JlZW4gYXMgZmFzdCBhcyBwb3NzaWJsZSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworI2RlZmluZSBOVU1fU1BSSVRFUwkxMDAKKyNkZWZpbmUgTUFYX1NQRUVEIAkxCisKK1NETF9TdXJmYWNlICpzcHJpdGU7CitpbnQgbnVtc3ByaXRlczsKK1NETF9SZWN0ICpzcHJpdGVfcmVjdHM7CitTRExfUmVjdCAqcG9zaXRpb25zOworU0RMX1JlY3QgKnZlbG9jaXRpZXM7CitpbnQgc3ByaXRlc192aXNpYmxlOworaW50IGRlYnVnX2ZsaXA7CitVaW50MTYgc3ByaXRlX3csIHNwcml0ZV9oOworCisvKiBDYWxsIHRoaXMgaW5zdGVhZCBvZiBleGl0KCksIHNvIHdlIGNhbiBjbGVhbiB1cCBTREw6IGF0ZXhpdCgpIGlzIGV2aWwuICovCitzdGF0aWMgdm9pZCBxdWl0KGludCByYykKK3sKKwlTRExfUXVpdCgpOworCWV4aXQocmMpOworfQorCitpbnQgTG9hZFNwcml0ZShjaGFyICpmaWxlKQoreworCVNETF9TdXJmYWNlICp0ZW1wOworCisJLyogTG9hZCB0aGUgc3ByaXRlIGltYWdlICovCisJc3ByaXRlID0gU0RMX0xvYWRCTVAoZmlsZSk7CisJaWYgKCBzcHJpdGUgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBsb2FkICVzOiAlcyIsIGZpbGUsIFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwkvKiBTZXQgdHJhbnNwYXJlbnQgcGl4ZWwgYXMgdGhlIHBpeGVsIGF0ICgwLDApICovCisJaWYgKCBzcHJpdGUtPmZvcm1hdC0+cGFsZXR0ZSApIHsKKwkJU0RMX1NldENvbG9yS2V5KHNwcml0ZSwgKFNETF9TUkNDT0xPUktFWXxTRExfUkxFQUNDRUwpLAorCQkJCQkJKihVaW50OCAqKXNwcml0ZS0+cGl4ZWxzKTsKKwl9CisKKwkvKiBDb252ZXJ0IHNwcml0ZSB0byB2aWRlbyBmb3JtYXQgKi8KKwl0ZW1wID0gU0RMX0Rpc3BsYXlGb3JtYXQoc3ByaXRlKTsKKwlTRExfRnJlZVN1cmZhY2Uoc3ByaXRlKTsKKwlpZiAoIHRlbXAgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBjb252ZXJ0IGJhY2tncm91bmQ6ICVzXG4iLAorCQkJCQkJCVNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJc3ByaXRlID0gdGVtcDsKKworCS8qIFdlJ3JlIHJlYWR5IHRvIHJvbGwuIDopICovCisJcmV0dXJuKDApOworfQorCit2b2lkIE1vdmVTcHJpdGVzKFNETF9TdXJmYWNlICpzY3JlZW4sIFVpbnQzMiBiYWNrZ3JvdW5kKQoreworCWludCBpLCBudXBkYXRlczsKKwlTRExfUmVjdCBhcmVhLCAqcG9zaXRpb24sICp2ZWxvY2l0eTsKKworCW51cGRhdGVzID0gMDsKKwkvKiBFcmFzZSBhbGwgdGhlIHNwcml0ZXMgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCBzcHJpdGVzX3Zpc2libGUgKSB7CisJCVNETF9GaWxsUmVjdChzY3JlZW4sIE5VTEwsIGJhY2tncm91bmQpOworCX0KKworCS8qIE1vdmUgdGhlIHNwcml0ZSwgYm91bmNlIGF0IHRoZSB3YWxsLCBhbmQgZHJhdyAqLworCWZvciAoIGk9MDsgaTxudW1zcHJpdGVzOyArK2kgKSB7CisJCXBvc2l0aW9uID0gJnBvc2l0aW9uc1tpXTsKKwkJdmVsb2NpdHkgPSAmdmVsb2NpdGllc1tpXTsKKwkJcG9zaXRpb24tPnggKz0gdmVsb2NpdHktPng7CisJCWlmICggKHBvc2l0aW9uLT54IDwgMCkgfHwgKHBvc2l0aW9uLT54ID49IChzY3JlZW4tPncgLSBzcHJpdGVfdykpICkgeworCQkJdmVsb2NpdHktPnggPSAtdmVsb2NpdHktPng7CisJCQlwb3NpdGlvbi0+eCArPSB2ZWxvY2l0eS0+eDsKKwkJfQorCQlwb3NpdGlvbi0+eSArPSB2ZWxvY2l0eS0+eTsKKwkJaWYgKCAocG9zaXRpb24tPnkgPCAwKSB8fCAocG9zaXRpb24tPnkgPj0gKHNjcmVlbi0+aCAtIHNwcml0ZV93KSkgKSB7CisJCQl2ZWxvY2l0eS0+eSA9IC12ZWxvY2l0eS0+eTsKKwkJCXBvc2l0aW9uLT55ICs9IHZlbG9jaXR5LT55OworCQl9CisKKwkJLyogQmxpdCB0aGUgc3ByaXRlIG9udG8gdGhlIHNjcmVlbiAqLworCQlhcmVhID0gKnBvc2l0aW9uOworCQlTRExfQmxpdFN1cmZhY2Uoc3ByaXRlLCBOVUxMLCBzY3JlZW4sICZhcmVhKTsKKwkJc3ByaXRlX3JlY3RzW251cGRhdGVzKytdID0gYXJlYTsKKwl9CisKKwlpZiAoZGVidWdfZmxpcCkgeworCQlpZiAoIChzY3JlZW4tPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gU0RMX0RPVUJMRUJVRiApIHsKKwkJCXN0YXRpYyBpbnQgdCA9IDA7CisKKwkJCVVpbnQzMiBjb2xvciA9IFNETF9NYXBSR0IgKHNjcmVlbi0+Zm9ybWF0LCAyNTUsIDAsIDApOworCQkJU0RMX1JlY3QgcjsKKwkJCXIueCA9IChzaW4oKGZsb2F0KXQgKiAyICogMy4xNDU5KSArIDEuMCkgLyAyLjAgKiAoc2NyZWVuLT53LTIwKTsKKwkJCXIueSA9IDA7CisJCQlyLncgPSAyMDsKKwkJCXIuaCA9IHNjcmVlbi0+aDsKKworCQkJU0RMX0ZpbGxSZWN0IChzY3JlZW4sICZyLCBjb2xvcik7CisJCQl0Kz0yOworCQl9CisJfQorCisJLyogVXBkYXRlIHRoZSBzY3JlZW4hICovCisJaWYgKCAoc2NyZWVuLT5mbGFncyAmIFNETF9ET1VCTEVCVUYpID09IFNETF9ET1VCTEVCVUYgKSB7CisJCVNETF9GbGlwKHNjcmVlbik7CisJfSBlbHNlIHsKKwkJU0RMX1VwZGF0ZVJlY3RzKHNjcmVlbiwgbnVwZGF0ZXMsIHNwcml0ZV9yZWN0cyk7CisJfQorCXNwcml0ZXNfdmlzaWJsZSA9IDE7Cit9CisKKy8qIFRoaXMgaXMgYSB3YXkgb2YgdGVsbGluZyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgaGFyZHdhcmUgc3VyZmFjZXMgKi8KK1VpbnQzMiBGYXN0ZXN0RmxhZ3MoVWludDMyIGZsYWdzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHApCit7CisJY29uc3QgU0RMX1ZpZGVvSW5mbyAqaW5mbzsKKworCS8qIEhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBvbmx5IHVzZWQgaW4gZnVsbHNjcmVlbiBtb2RlICovCisJZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisKKwkvKiBDaGVjayBmb3IgdmFyaW91cyB2aWRlbyBjYXBhYmlsaXRpZXMgKi8KKwlpbmZvID0gU0RMX0dldFZpZGVvSW5mbygpOworCWlmICggaW5mby0+YmxpdF9od19DQyAmJiBpbmZvLT5ibGl0X2ZpbGwgKSB7CisJCS8qIFdlIHVzZSBhY2NlbGVyYXRlZCBjb2xvcmtleWluZyBhbmQgY29sb3IgZmlsbGluZyAqLworCQlmbGFncyB8PSBTRExfSFdTVVJGQUNFOworCX0KKwkvKiBJZiB3ZSBoYXZlIGVub3VnaCB2aWRlbyBtZW1vcnksIGFuZCB3aWxsIHVzZSBhY2NlbGVyYXRlZAorCSAgIGJsaXRzIGRpcmVjdGx5IHRvIGl0LCB0aGVuIHVzZSBwYWdlIGZsaXBwaW5nLgorCSAqLworCWlmICggKGZsYWdzICYgU0RMX0hXU1VSRkFDRSkgPT0gU0RMX0hXU1VSRkFDRSApIHsKKwkJLyogRGlyZWN0IGhhcmR3YXJlIGJsaXR0aW5nIHdpdGhvdXQgZG91YmxlLWJ1ZmZlcmluZworCQkgICBjYXVzZXMgcmVhbGx5IGJhZCBmbGlja2VyaW5nLgorCQkgKi8KKwkJaWYgKCBpbmZvLT52aWRlb19tZW0qMTAyNCA+IChoZWlnaHQqd2lkdGgqYnBwLzgpICkgeworCQkJZmxhZ3MgfD0gU0RMX0RPVUJMRUJVRjsKKwkJfSBlbHNlIHsKKwkJCWZsYWdzICY9IH5TRExfSFdTVVJGQUNFOworCQl9CisJfQorCisJLyogUmV0dXJuIHRoZSBmbGFncyAqLworCXJldHVybihmbGFncyk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJU0RMX1N1cmZhY2UgKnNjcmVlbjsKKwlVaW50OCAqbWVtOworCWludCB3aWR0aCwgaGVpZ2h0OworCVVpbnQ4ICB2aWRlb19icHA7CisJVWludDMyIHZpZGVvZmxhZ3M7CisJVWludDMyIGJhY2tncm91bmQ7CisJaW50ICAgIGksIGRvbmU7CisJU0RMX0V2ZW50IGV2ZW50OworCVVpbnQzMiB0aGVuLCBub3csIGZyYW1lczsKKworCS8qIEluaXRpYWxpemUgU0RMICovCisJaWYgKCBTRExfSW5pdChTRExfSU5JVF9WSURFTykgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIixTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwludW1zcHJpdGVzID0gTlVNX1NQUklURVM7CisJdmlkZW9mbGFncyA9IFNETF9TV1NVUkZBQ0V8U0RMX0FOWUZPUk1BVDsKKwl3aWR0aCA9IDY0MDsKKwloZWlnaHQgPSA0ODA7CisJdmlkZW9fYnBwID0gODsKKwlkZWJ1Z19mbGlwID0gMDsKKwl3aGlsZSAoIGFyZ2MgPiAxICkgeworCQktLWFyZ2M7CisJCWlmICggc3RyY21wKGFyZ3ZbYXJnYy0xXSwgIi13aWR0aCIpID09IDAgKSB7CisJCQl3aWR0aCA9IGF0b2koYXJndlthcmdjXSk7CisJCQktLWFyZ2M7CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2W2FyZ2MtMV0sICItaGVpZ2h0IikgPT0gMCApIHsKKwkJCWhlaWdodCA9IGF0b2koYXJndlthcmdjXSk7CisJCQktLWFyZ2M7CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2W2FyZ2MtMV0sICItYnBwIikgPT0gMCApIHsKKwkJCXZpZGVvX2JwcCA9IGF0b2koYXJndlthcmdjXSk7CisJCQl2aWRlb2ZsYWdzICY9IH5TRExfQU5ZRk9STUFUOworCQkJLS1hcmdjOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlthcmdjXSwgIi1mYXN0IikgPT0gMCApIHsKKwkJCXZpZGVvZmxhZ3MgPSBGYXN0ZXN0RmxhZ3ModmlkZW9mbGFncywgd2lkdGgsIGhlaWdodCwgdmlkZW9fYnBwKTsKKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbYXJnY10sICItaHciKSA9PSAwICkgeworCQkJdmlkZW9mbGFncyBePSBTRExfSFdTVVJGQUNFOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlthcmdjXSwgIi1mbGlwIikgPT0gMCApIHsKKwkJCXZpZGVvZmxhZ3MgXj0gU0RMX0RPVUJMRUJVRjsKKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbYXJnY10sICItZGVidWdmbGlwIikgPT0gMCApIHsKKwkJCWRlYnVnX2ZsaXAgXj0gMTsKKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbYXJnY10sICItZnVsbHNjcmVlbiIpID09IDAgKSB7CisJCQl2aWRlb2ZsYWdzIF49IFNETF9GVUxMU0NSRUVOOworCQl9IGVsc2UKKwkJaWYgKCBpc2RpZ2l0KGFyZ3ZbYXJnY11bMF0pICkgeworCQkJbnVtc3ByaXRlcyA9IGF0b2koYXJndlthcmdjXSk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgCisJIlVzYWdlOiAlcyBbLWJwcCBOXSBbLWh3XSBbLWZsaXBdIFstZmFzdF0gWy1mdWxsc2NyZWVuXSBbbnVtc3ByaXRlc11cbiIsCisJCQkJCQkJCWFyZ3ZbMF0pOworCQkJcXVpdCgxKTsKKwkJfQorCX0KKworCS8qIFNldCB2aWRlbyBtb2RlICovCisJc2NyZWVuID0gU0RMX1NldFZpZGVvTW9kZSh3aWR0aCwgaGVpZ2h0LCB2aWRlb19icHAsIHZpZGVvZmxhZ3MpOworCWlmICggISBzY3JlZW4gKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0ICVkeCVkIHZpZGVvIG1vZGU6ICVzXG4iLAorCQkJCQl3aWR0aCwgaGVpZ2h0LCBTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMik7CisJfQorCisJLyogTG9hZCB0aGUgc3ByaXRlICovCisJaWYgKCBMb2FkU3ByaXRlKCJpY29uLmJtcCIpIDwgMCApIHsKKwkJcXVpdCgxKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzcHJpdGUgaW5mbyAqLworCW1lbSA9IChVaW50OCAqKW1hbGxvYyg0KnNpemVvZihTRExfUmVjdCkqbnVtc3ByaXRlcyk7CisJaWYgKCBtZW0gPT0gTlVMTCApIHsKKwkJU0RMX0ZyZWVTdXJmYWNlKHNwcml0ZSk7CisJCWZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeSFcbiIpOworCQlxdWl0KDIpOworCX0KKwlzcHJpdGVfcmVjdHMgPSAoU0RMX1JlY3QgKiltZW07CisJcG9zaXRpb25zID0gc3ByaXRlX3JlY3RzOworCXNwcml0ZV9yZWN0cyArPSBudW1zcHJpdGVzOworCXZlbG9jaXRpZXMgPSBzcHJpdGVfcmVjdHM7CisJc3ByaXRlX3JlY3RzICs9IG51bXNwcml0ZXM7CisJc3ByaXRlX3cgPSBzcHJpdGUtPnc7CisJc3ByaXRlX2ggPSBzcHJpdGUtPmg7CisJc3JhbmQodGltZShOVUxMKSk7CisJZm9yICggaT0wOyBpPG51bXNwcml0ZXM7ICsraSApIHsKKwkJcG9zaXRpb25zW2ldLnggPSByYW5kKCklKHNjcmVlbi0+dyAtIHNwcml0ZV93KTsKKwkJcG9zaXRpb25zW2ldLnkgPSByYW5kKCklKHNjcmVlbi0+aCAtIHNwcml0ZV9oKTsKKwkJcG9zaXRpb25zW2ldLncgPSBzcHJpdGUtPnc7CisJCXBvc2l0aW9uc1tpXS5oID0gc3ByaXRlLT5oOworCQl2ZWxvY2l0aWVzW2ldLnggPSAwOworCQl2ZWxvY2l0aWVzW2ldLnkgPSAwOworCQl3aGlsZSAoICEgdmVsb2NpdGllc1tpXS54ICYmICEgdmVsb2NpdGllc1tpXS55ICkgeworCQkJdmVsb2NpdGllc1tpXS54ID0gKHJhbmQoKSUoTUFYX1NQRUVEKjIrMSkpLU1BWF9TUEVFRDsKKwkJCXZlbG9jaXRpZXNbaV0ueSA9IChyYW5kKCklKE1BWF9TUEVFRCoyKzEpKS1NQVhfU1BFRUQ7CisJCX0KKwl9CisJYmFja2dyb3VuZCA9IFNETF9NYXBSR0Ioc2NyZWVuLT5mb3JtYXQsIDB4MDAsIDB4MDAsIDB4MDApOworCisJLyogUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IG91ciBzdXJmYWNlcyAqLworCXByaW50ZigiU2NyZWVuIGlzIGF0ICVkIGJpdHMgcGVyIHBpeGVsXG4iLHNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpOworCWlmICggKHNjcmVlbi0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgeworCQlwcmludGYoIlNjcmVlbiBpcyBpbiB2aWRlbyBtZW1vcnlcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiU2NyZWVuIGlzIGluIHN5c3RlbSBtZW1vcnlcbiIpOworCX0KKwlpZiAoIChzY3JlZW4tPmZsYWdzICYgU0RMX0RPVUJMRUJVRikgPT0gU0RMX0RPVUJMRUJVRiApIHsKKwkJcHJpbnRmKCJTY3JlZW4gaGFzIGRvdWJsZS1idWZmZXJpbmcgZW5hYmxlZFxuIik7CisJfQorCWlmICggKHNwcml0ZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSA9PSBTRExfSFdTVVJGQUNFICkgeworCQlwcmludGYoIlNwcml0ZSBpcyBpbiB2aWRlbyBtZW1vcnlcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiU3ByaXRlIGlzIGluIHN5c3RlbSBtZW1vcnlcbiIpOworCX0KKwkvKiBSdW4gYSBzYW1wbGUgYmxpdCB0byB0cmlnZ2VyIGJsaXQgYWNjZWxlcmF0aW9uICovCisJeyBTRExfUmVjdCBkc3Q7CisJCWRzdC54ID0gMDsKKwkJZHN0LnkgPSAwOworCQlkc3QudyA9IHNwcml0ZS0+dzsKKwkJZHN0LmggPSBzcHJpdGUtPmg7CisJCVNETF9CbGl0U3VyZmFjZShzcHJpdGUsIE5VTEwsIHNjcmVlbiwgJmRzdCk7CisJCVNETF9GaWxsUmVjdChzY3JlZW4sICZkc3QsIGJhY2tncm91bmQpOworCX0KKwlpZiAoIChzcHJpdGUtPmZsYWdzICYgU0RMX0hXQUNDRUwpID09IFNETF9IV0FDQ0VMICkgeworCQlwcmludGYoIlNwcml0ZSBibGl0IHVzZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uXG4iKTsKKwl9CisJaWYgKCAoc3ByaXRlLT5mbGFncyAmIFNETF9STEVBQ0NFTCkgPT0gU0RMX1JMRUFDQ0VMICkgeworCQlwcmludGYoIlNwcml0ZSBibGl0IHVzZXMgUkxFIGFjY2VsZXJhdGlvblxuIik7CisJfQorCisJLyogTG9vcCwgYmxpdHRpbmcgc3ByaXRlcyBhbmQgd2FpdGluZyBmb3IgYSBrZXlzdHJva2UgKi8KKwlmcmFtZXMgPSAwOworCXRoZW4gPSBTRExfR2V0VGlja3MoKTsKKwlkb25lID0gMDsKKwlzcHJpdGVzX3Zpc2libGUgPSAwOworCXdoaWxlICggIWRvbmUgKSB7CisJCS8qIENoZWNrIGZvciBldmVudHMgKi8KKwkJKytmcmFtZXM7CisJCXdoaWxlICggU0RMX1BvbGxFdmVudCgmZXZlbnQpICkgeworCQkJc3dpdGNoIChldmVudC50eXBlKSB7CisJCQkJY2FzZSBTRExfTU9VU0VCVVRUT05ET1dOOgorCQkJCQlTRExfV2FycE1vdXNlKHNjcmVlbi0+dy8yLCBzY3JlZW4tPmgvMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMX0tFWURPV046CisJCQkJCS8qIEFueSBrZXlwcmVzcyBxdWl0cyB0aGUgYXBwLi4uICovCisJCQkJY2FzZSBTRExfUVVJVDoKKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCU1vdmVTcHJpdGVzKHNjcmVlbiwgYmFja2dyb3VuZCk7CisJfQorCVNETF9GcmVlU3VyZmFjZShzcHJpdGUpOworCWZyZWUobWVtKTsKKworCS8qIFByaW50IG91dCBzb21lIHRpbWluZyBpbmZvcm1hdGlvbiAqLworCW5vdyA9IFNETF9HZXRUaWNrcygpOworCWlmICggbm93ID4gdGhlbiApIHsKKwkJcHJpbnRmKCIlMi4yZiBmcmFtZXMgcGVyIHNlY29uZFxuIiwKKwkJCQkJKChkb3VibGUpZnJhbWVzKjEwMDApLyhub3ctdGhlbikpOworCX0KKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R0aW1lci5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2MDhjMQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R0aW1lci5jCkBAIC0wLDAgKzEsODcgQEAKKworLyogVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBTREwgdGltZXIgb24gdGhlIGN1cnJlbnQKKyAgIHBsYXRmb3JtCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIlNETC5oIgorCisjZGVmaW5lIERFRkFVTFRfUkVTT0xVVElPTgkxCisKK3N0YXRpYyBpbnQgdGlja3MgPSAwOworCitzdGF0aWMgVWludDMyIFNETENBTEwgdGlja3RvY2soVWludDMyIGludGVydmFsKQoreworCSsrdGlja3M7CisJcmV0dXJuKGludGVydmFsKTsKK30KKworc3RhdGljIFVpbnQzMiBTRExDQUxMIGNhbGxiYWNrKFVpbnQzMiBpbnRlcnZhbCwgdm9pZCAqcGFyYW0pCit7CisgIHByaW50ZigiVGltZXIgJWQgOiBwYXJhbSA9ICVkXG4iLCBpbnRlcnZhbCwgKGludCkodWludHB0cl90KXBhcmFtKTsKKyAgcmV0dXJuIGludGVydmFsOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBkZXNpcmVkOworCVNETF9UaW1lcklEIHQxLCB0MiwgdDM7CisKKwlpZiAoIFNETF9Jbml0KFNETF9JTklUX1RJTUVSKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBTdGFydCB0aGUgdGltZXIgKi8KKwlkZXNpcmVkID0gMDsKKwlpZiAoIGFyZ3ZbMV0gKSB7CisJCWRlc2lyZWQgPSBhdG9pKGFyZ3ZbMV0pOworCX0KKwlpZiAoIGRlc2lyZWQgPT0gMCApIHsKKwkJZGVzaXJlZCA9IERFRkFVTFRfUkVTT0xVVElPTjsKKwl9CisJU0RMX1NldFRpbWVyKGRlc2lyZWQsIHRpY2t0b2NrKTsKKworCS8qIFdhaXQgMTAgc2Vjb25kcyAqLworCXByaW50ZigiV2FpdGluZyAxMCBzZWNvbmRzXG4iKTsKKwlTRExfRGVsYXkoMTAqMTAwMCk7CisKKwkvKiBTdG9wIHRoZSB0aW1lciAqLworCVNETF9TZXRUaW1lcigwLCBOVUxMKTsKKworCS8qIFByaW50IHRoZSByZXN1bHRzICovCisJaWYgKCB0aWNrcyApIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCSJUaW1lciByZXNvbHV0aW9uOiBkZXNpcmVkID0gJWQgbXMsIGFjdHVhbCA9ICVmIG1zXG4iLAorCQkJCQlkZXNpcmVkLCAoZG91YmxlKSgxMCoxMDAwKS90aWNrcyk7CisJfQorCQorCS8qIFRlc3QgbXVsdGlwbGUgdGltZXJzICovCisJcHJpbnRmKCJUZXN0aW5nIG11bHRpcGxlIHRpbWVycy4uLlxuIik7CisJdDEgPSBTRExfQWRkVGltZXIoMTAwLCBjYWxsYmFjaywgKHZvaWQqKTEpOworCWlmKCF0MSkKKwkgIGZwcmludGYoc3RkZXJyLCJDb3VsZCBub3QgY3JlYXRlIHRpbWVyIDE6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJdDIgPSBTRExfQWRkVGltZXIoNTAsIGNhbGxiYWNrLCAodm9pZCopMik7CisJaWYoIXQyKQorCSAgZnByaW50ZihzdGRlcnIsIkNvdWxkIG5vdCBjcmVhdGUgdGltZXIgMjogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwl0MyA9IFNETF9BZGRUaW1lcigyMzMsIGNhbGxiYWNrLCAodm9pZCopMyk7CisJaWYoIXQzKQorCSAgZnByaW50ZihzdGRlcnIsIkNvdWxkIG5vdCBjcmVhdGUgdGltZXIgMzogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkKKwkvKiBXYWl0IDEwIHNlY29uZHMgKi8KKwlwcmludGYoIldhaXRpbmcgMTAgc2Vjb25kc1xuIik7CisJU0RMX0RlbGF5KDEwKjEwMDApOworCisJcHJpbnRmKCJSZW1vdmluZyB0aW1lciAxIGFuZCB3YWl0aW5nIDUgbW9yZSBzZWNvbmRzXG4iKTsKKwlTRExfUmVtb3ZlVGltZXIodDEpOworCisJU0RMX0RlbGF5KDUqMTAwMCk7CisKKwlTRExfUmVtb3ZlVGltZXIodDIpOworCVNETF9SZW1vdmVUaW1lcih0Myk7CisKKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R2ZXIuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ1ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHZlci5jCkBAIC0wLDAgKzEsMzcgQEAKKworLyogVGVzdCBwcm9ncmFtIHRvIGNvbXBhcmUgdGhlIGNvbXBpbGUtdGltZSB2ZXJzaW9uIG9mIFNETCB3aXRoIHRoZSBsaW5rZWQKKyAgIHZlcnNpb24gb2YgU0RMCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIlNETC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCVNETF92ZXJzaW9uIGNvbXBpbGVkOworCisJLyogSW5pdGlhbGl6ZSBTREwgKi8KKwlpZiAoIFNETF9Jbml0KDApIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBpbml0aWFsaXplIFNETDogJXNcbiIsU0RMX0dldEVycm9yKCkpOworCQlleGl0KDEpOworCX0KKyNpZmRlZiBERUJVRworCWZwcmludGYoc3RkZXJyLCAiU0RMIGluaXRpYWxpemVkXG4iKTsKKyNlbmRpZgorI2lmIFNETF9WRVJTSU9OX0FUTEVBU1QoMSwgMiwgMCkKKwlwcmludGYoIkNvbXBpbGVkIHdpdGggU0RMIDEuMiBvciBuZXdlclxuIik7CisjZWxzZQorCXByaW50ZigiQ29tcGlsZWQgd2l0aCBTREwgb2xkZXIgdGhhbiAxLjJcbiIpOworI2VuZGlmCisJU0RMX1ZFUlNJT04oJmNvbXBpbGVkKTsKKwlwcmludGYoIkNvbXBpbGVkIHZlcnNpb246ICVkLiVkLiVkXG4iLAorCQkJY29tcGlsZWQubWFqb3IsIGNvbXBpbGVkLm1pbm9yLCBjb21waWxlZC5wYXRjaCk7CisJcHJpbnRmKCJMaW5rZWQgdmVyc2lvbjogJWQuJWQuJWRcbiIsCisJCQlTRExfTGlua2VkX1ZlcnNpb24oKS0+bWFqb3IsCisJCQlTRExfTGlua2VkX1ZlcnNpb24oKS0+bWlub3IsCisJCQlTRExfTGlua2VkX1ZlcnNpb24oKS0+cGF0Y2gpOworCVNETF9RdWl0KCk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHZpZGluZm8uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R2aWRpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhZmViOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R2aWRpbmZvLmMKQEAgLTAsMCArMSw0NjUgQEAKKworLyogU2ltcGxlIHByb2dyYW0gLS0gZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgdmlkZW8gZGlzcGxheSB3ZSBoYXZlICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0RMLmgiCisKKyNkZWZpbmUgTlVNX0JMSVRTCTEwCisjZGVmaW5lIE5VTV9VUERBVEVTCTUwMAorCisjZGVmaW5lIEZMQUdfTUFTSwkoU0RMX0hXU1VSRkFDRSB8IFNETF9GVUxMU0NSRUVOIHwgU0RMX0RPVUJMRUJVRiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRExfU1JDQ09MT1JLRVkgfCBTRExfU1JDQUxQSEEgfCBTRExfUkxFQUNDRUwgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9STEVBQ0NFTE9LKQorCit2b2lkIFByaW50RmxhZ3MoVWludDMyIGZsYWdzKQoreworCXByaW50ZigiMHglOC44eCIsIChmbGFncyAmIEZMQUdfTUFTSykpOworCWlmICggZmxhZ3MgJiBTRExfSFdTVVJGQUNFICkgeworCQlwcmludGYoIiBTRExfSFdTVVJGQUNFIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIgU0RMX1NXU1VSRkFDRSIpOworCX0KKwlpZiAoIGZsYWdzICYgU0RMX0ZVTExTQ1JFRU4gKSB7CisJCXByaW50ZigiIHwgU0RMX0ZVTExTQ1JFRU4iKTsKKwl9CisJaWYgKCBmbGFncyAmIFNETF9ET1VCTEVCVUYgKSB7CisJCXByaW50ZigiIHwgU0RMX0RPVUJMRUJVRiIpOworCX0KKwlpZiAoIGZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZICkgeworCQlwcmludGYoIiB8IFNETF9TUkNDT0xPUktFWSIpOworCX0KKwlpZiAoIGZsYWdzICYgU0RMX1NSQ0FMUEhBICkgeworCQlwcmludGYoIiB8IFNETF9TUkNBTFBIQSIpOworCX0KKwlpZiAoIGZsYWdzICYgU0RMX1JMRUFDQ0VMICkgeworCQlwcmludGYoIiB8IFNETF9STEVBQ0NFTCIpOworCX0KKwlpZiAoIGZsYWdzICYgU0RMX1JMRUFDQ0VMT0sgKSB7CisJCXByaW50ZigiIHwgU0RMX1JMRUFDQ0VMT0siKTsKKwl9Cit9CisKK2ludCBSdW5CbGl0VGVzdHMoU0RMX1N1cmZhY2UgKnNjcmVlbiwgU0RMX1N1cmZhY2UgKmJtcCwgaW50IGJsaXRjb3VudCkKK3sKKwlpbnQgaSwgajsKKwlpbnQgbWF4eDsKKwlpbnQgbWF4eTsKKwlTRExfUmVjdCBkc3Q7CisKKwltYXh4ID0gKGludClzY3JlZW4tPncgLSBibXAtPncgKyAxOworCW1heHkgPSAoaW50KXNjcmVlbi0+aCAtIGJtcC0+aCArIDE7CisJZm9yICggaSA9IDA7IGkgPCBOVU1fVVBEQVRFUzsgKytpICkgeworCQlmb3IgKCBqID0gMDsgaiA8IGJsaXRjb3VudDsgKytqICkgeworCQkJaWYgKCBtYXh4ICkgeworCQkJCWRzdC54ID0gcmFuZCgpICUgbWF4eDsKKwkJCX0gZWxzZSB7CisJCQkJZHN0LnggPSAwOworCQkJfQorCQkJaWYgKCBtYXh5ICkgeworCQkJCWRzdC55ID0gcmFuZCgpICUgbWF4eTsKKwkJCX0gZWxzZSB7CisJCQkJZHN0LnkgPSAwOworCQkJfQorCQkJZHN0LncgPSBibXAtPnc7CisJCQlkc3QuaCA9IGJtcC0+aDsKKwkJCVNETF9CbGl0U3VyZmFjZShibXAsIE5VTEwsIHNjcmVlbiwgJmRzdCk7CisJCX0KKwkJU0RMX0ZsaXAoc2NyZWVuKTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworaW50IFJ1bk1vZGVUZXN0cyhTRExfU3VyZmFjZSAqc2NyZWVuKQoreworCVVpbnQzMiB0aGVuLCBub3c7CisJVWludDMyIGZyYW1lczsKKwlmbG9hdCBzZWNvbmRzOworCWludCBpOworCVVpbnQ4IHIsIGcsIGI7CisJU0RMX1N1cmZhY2UgKmJtcCwgKmJtcGNjLCAqdG1wOworCVNETF9FdmVudCBldmVudDsKKworCXdoaWxlICggU0RMX1BvbGxFdmVudCgmZXZlbnQpICkgeworCQlpZiAoIGV2ZW50LnR5cGUgPT0gU0RMX0tFWURPV04gKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogRmlyc3QgdGVzdCBmaWxscyBhbmQgc2NyZWVuIHVwZGF0ZSBzcGVlZCAqLworCXByaW50ZigiUnVubmluZyBjb2xvciBmaWxsIGFuZCBmdWxsc2NyZWVuIHVwZGF0ZSB0ZXN0XG4iKTsKKwl0aGVuID0gU0RMX0dldFRpY2tzKCk7CisJZnJhbWVzID0gMDsKKwlmb3IgKCBpID0gMDsgaSA8IDI1NjsgKytpICkgeworCQlyID0gaTsKKwkJZyA9IDA7CisJCWIgPSAwOworCQlTRExfRmlsbFJlY3Qoc2NyZWVuLCBOVUxMLCBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCByLCBnLCBiKSk7CisJCVNETF9GbGlwKHNjcmVlbik7CisJCSsrZnJhbWVzOworCX0KKwlmb3IgKCBpID0gMDsgaSA8IDI1NjsgKytpICkgeworCQlyID0gMDsKKwkJZyA9IGk7CisJCWIgPSAwOworCQlTRExfRmlsbFJlY3Qoc2NyZWVuLCBOVUxMLCBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCByLCBnLCBiKSk7CisJCVNETF9GbGlwKHNjcmVlbik7CisJCSsrZnJhbWVzOworCX0KKwlmb3IgKCBpID0gMDsgaSA8IDI1NjsgKytpICkgeworCQlyID0gMDsKKwkJZyA9IDA7CisJCWIgPSBpOworCQlTRExfRmlsbFJlY3Qoc2NyZWVuLCBOVUxMLCBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCByLCBnLCBiKSk7CisJCVNETF9GbGlwKHNjcmVlbik7CisJCSsrZnJhbWVzOworCX0KKwlub3cgPSBTRExfR2V0VGlja3MoKTsKKwlzZWNvbmRzID0gKGZsb2F0KShub3cgLSB0aGVuKSAvIDEwMDAuMGY7CisJaWYgKCBzZWNvbmRzID4gMC4wZiApIHsKKwkJcHJpbnRmKCIlZCBmaWxscyBhbmQgZmxpcHMgaW4gJTIuMmYgc2Vjb25kcywgJTIuMmYgRlBTXG4iLCBmcmFtZXMsIHNlY29uZHMsIChmbG9hdClmcmFtZXMgLyBzZWNvbmRzKTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVkIGZpbGxzIGFuZCBmbGlwcyBpbiB6ZXJvIHNlY29uZHMhbiIsIGZyYW1lcyk7CisJfQorCisgICAgICAgIC8qIGNsZWFyIHRoZSBzY3JlZW4gYWZ0ZXIgZmlsbCB0ZXN0ICovCisgICAgICAgIFNETF9GaWxsUmVjdChzY3JlZW4sIE5VTEwsIFNETF9NYXBSR0Ioc2NyZWVuLT5mb3JtYXQsIDAsIDAsIDApKTsKKwlTRExfRmxpcChzY3JlZW4pOworCisJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZldmVudCkgKSB7CisJCWlmICggZXZlbnQudHlwZSA9PSBTRExfS0VZRE9XTiApCisJCQlyZXR1cm4gMDsKKwl9CisKKyAgICAgICAgLyogcnVuIHRoZSBnZW5lcmljIGJsaXQgdGVzdCAqLworCWJtcCA9IFNETF9Mb2FkQk1QKCJzYW1wbGUuYm1wIik7CisJaWYgKCAhIGJtcCApIHsKKwkJcHJpbnRmKCJDb3VsZG4ndCBsb2FkIHNhbXBsZS5ibXA6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybiAwOworCX0KKwlwcmludGYoIlJ1bm5pbmcgZnJlc2hseSBsb2FkZWQgYmxpdCB0ZXN0OiAlZHglZCBhdCAlZCBicHAsIGZsYWdzOiAiLAorCQlibXAtPncsIGJtcC0+aCwgYm1wLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCk7CisJUHJpbnRGbGFncyhibXAtPmZsYWdzKTsKKwlwcmludGYoIlxuIik7CisJdGhlbiA9IFNETF9HZXRUaWNrcygpOworCWZyYW1lcyA9IFJ1bkJsaXRUZXN0cyhzY3JlZW4sIGJtcCwgTlVNX0JMSVRTKTsKKwlub3cgPSBTRExfR2V0VGlja3MoKTsKKwlzZWNvbmRzID0gKGZsb2F0KShub3cgLSB0aGVuKSAvIDEwMDAuMGY7CisJaWYgKCBzZWNvbmRzID4gMC4wZiApIHsKKwkJcHJpbnRmKCIlZCBibGl0cyAvICVkIHVwZGF0ZXMgaW4gJTIuMmYgc2Vjb25kcywgJTIuMmYgRlBTXG4iLCBOVU1fQkxJVFMqZnJhbWVzLCBmcmFtZXMsIHNlY29uZHMsIChmbG9hdClmcmFtZXMgLyBzZWNvbmRzKTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVkIGJsaXRzIC8gJWQgdXBkYXRlcyBpbiB6ZXJvIHNlY29uZHMhXG4iLCBOVU1fQkxJVFMqZnJhbWVzLCBmcmFtZXMpOworCX0KKworICAgICAgICAvKiBjbGVhciB0aGUgc2NyZWVuIGFmdGVyIGJsaXQgdGVzdCAqLworICAgICAgICBTRExfRmlsbFJlY3Qoc2NyZWVuLCBOVUxMLCBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCAwLCAwLCAwKSk7CisJU0RMX0ZsaXAoc2NyZWVuKTsKKworCXdoaWxlICggU0RMX1BvbGxFdmVudCgmZXZlbnQpICkgeworCQlpZiAoIGV2ZW50LnR5cGUgPT0gU0RMX0tFWURPV04gKQorCQkJcmV0dXJuIDA7CisJfQorCisgICAgICAgIC8qIHJ1biB0aGUgY29sb3JrZXllZCBibGl0IHRlc3QgKi8KKwlibXBjYyA9IFNETF9Mb2FkQk1QKCJzYW1wbGUuYm1wIik7CisJaWYgKCAhIGJtcGNjICkgeworCQlwcmludGYoIkNvdWxkbid0IGxvYWQgc2FtcGxlLmJtcDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuIDA7CisJfQorCXByaW50ZigiUnVubmluZyBmcmVzaGx5IGxvYWRlZCBjYyBibGl0IHRlc3Q6ICVkeCVkIGF0ICVkIGJwcCwgZmxhZ3M6ICIsCisJCWJtcGNjLT53LCBibXBjYy0+aCwgYm1wY2MtPmZvcm1hdC0+Qml0c1BlclBpeGVsKTsKKyAgICAgICAgU0RMX1NldENvbG9yS2V5KGJtcGNjLCBTRExfU1JDQ09MT1JLRVkgfCBTRExfUkxFQUNDRUwsICooVWludDggKilibXBjYy0+cGl4ZWxzKTsKKworCVByaW50RmxhZ3MoYm1wY2MtPmZsYWdzKTsKKwlwcmludGYoIlxuIik7CisJdGhlbiA9IFNETF9HZXRUaWNrcygpOworCWZyYW1lcyA9IFJ1bkJsaXRUZXN0cyhzY3JlZW4sIGJtcGNjLCBOVU1fQkxJVFMpOworCW5vdyA9IFNETF9HZXRUaWNrcygpOworCXNlY29uZHMgPSAoZmxvYXQpKG5vdyAtIHRoZW4pIC8gMTAwMC4wZjsKKwlpZiAoIHNlY29uZHMgPiAwLjBmICkgeworCQlwcmludGYoIiVkIGNjIGJsaXRzIC8gJWQgdXBkYXRlcyBpbiAlMi4yZiBzZWNvbmRzLCAlMi4yZiBGUFNcbiIsIE5VTV9CTElUUypmcmFtZXMsIGZyYW1lcywgc2Vjb25kcywgKGZsb2F0KWZyYW1lcyAvIHNlY29uZHMpOworCX0gZWxzZSB7CisJCXByaW50ZigiJWQgY2MgYmxpdHMgLyAlZCB1cGRhdGVzIGluIHplcm8gc2Vjb25kcyFcbiIsIE5VTV9CTElUUypmcmFtZXMsIGZyYW1lcyk7CisJfQorCisgICAgICAgIC8qIGNsZWFyIHRoZSBzY3JlZW4gYWZ0ZXIgY2MgYmxpdCB0ZXN0ICovCisgICAgICAgIFNETF9GaWxsUmVjdChzY3JlZW4sIE5VTEwsIFNETF9NYXBSR0Ioc2NyZWVuLT5mb3JtYXQsIDAsIDAsIDApKTsKKwlTRExfRmxpcChzY3JlZW4pOworCisJd2hpbGUgKCBTRExfUG9sbEV2ZW50KCZldmVudCkgKSB7CisJCWlmICggZXZlbnQudHlwZSA9PSBTRExfS0VZRE9XTiApCisJCQlyZXR1cm4gMDsKKwl9CisKKyAgICAgICAgLyogcnVuIHRoZSBnZW5lcmljIGJsaXQgdGVzdCAqLworCXRtcCA9IGJtcDsKKwlibXAgPSBTRExfRGlzcGxheUZvcm1hdChibXApOworCVNETF9GcmVlU3VyZmFjZSh0bXApOworCWlmICggISBibXAgKSB7CisJCXByaW50ZigiQ291bGRuJ3QgY29udmVydCBzYW1wbGUuYm1wOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCQlyZXR1cm4gMDsKKwl9CisJcHJpbnRmKCJSdW5uaW5nIGRpc3BsYXkgZm9ybWF0IGJsaXQgdGVzdDogJWR4JWQgYXQgJWQgYnBwLCBmbGFnczogIiwKKwkJYm1wLT53LCBibXAtPmgsIGJtcC0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpOworCVByaW50RmxhZ3MoYm1wLT5mbGFncyk7CisJcHJpbnRmKCJcbiIpOworCXRoZW4gPSBTRExfR2V0VGlja3MoKTsKKwlmcmFtZXMgPSBSdW5CbGl0VGVzdHMoc2NyZWVuLCBibXAsIE5VTV9CTElUUyk7CisJbm93ID0gU0RMX0dldFRpY2tzKCk7CisJc2Vjb25kcyA9IChmbG9hdCkobm93IC0gdGhlbikgLyAxMDAwLjBmOworCWlmICggc2Vjb25kcyA+IDAuMGYgKSB7CisJCXByaW50ZigiJWQgYmxpdHMgLyAlZCB1cGRhdGVzIGluICUyLjJmIHNlY29uZHMsICUyLjJmIEZQU1xuIiwgTlVNX0JMSVRTKmZyYW1lcywgZnJhbWVzLCBzZWNvbmRzLCAoZmxvYXQpZnJhbWVzIC8gc2Vjb25kcyk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlZCBibGl0cyAvICVkIHVwZGF0ZXMgaW4gemVybyBzZWNvbmRzIVxuIiwgTlVNX0JMSVRTKmZyYW1lcywgZnJhbWVzKTsKKwl9CisKKyAgICAgICAgLyogY2xlYXIgdGhlIHNjcmVlbiBhZnRlciBibGl0IHRlc3QgKi8KKyAgICAgICAgU0RMX0ZpbGxSZWN0KHNjcmVlbiwgTlVMTCwgU0RMX01hcFJHQihzY3JlZW4tPmZvcm1hdCwgMCwgMCwgMCkpOworCVNETF9GbGlwKHNjcmVlbik7CisKKwl3aGlsZSAoIFNETF9Qb2xsRXZlbnQoJmV2ZW50KSApIHsKKwkJaWYgKCBldmVudC50eXBlID09IFNETF9LRVlET1dOICkKKwkJCXJldHVybiAwOworCX0KKworICAgICAgICAvKiBydW4gdGhlIGNvbG9ya2V5ZWQgYmxpdCB0ZXN0ICovCisJdG1wID0gYm1wY2M7CisJYm1wY2MgPSBTRExfRGlzcGxheUZvcm1hdChibXBjYyk7CisJU0RMX0ZyZWVTdXJmYWNlKHRtcCk7CisJaWYgKCAhIGJtcGNjICkgeworCQlwcmludGYoIkNvdWxkbid0IGNvbnZlcnQgc2FtcGxlLmJtcDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuIDA7CisJfQorCXByaW50ZigiUnVubmluZyBkaXNwbGF5IGZvcm1hdCBjYyBibGl0IHRlc3Q6ICVkeCVkIGF0ICVkIGJwcCwgZmxhZ3M6ICIsCisJCWJtcGNjLT53LCBibXBjYy0+aCwgYm1wY2MtPmZvcm1hdC0+Qml0c1BlclBpeGVsKTsKKwlQcmludEZsYWdzKGJtcGNjLT5mbGFncyk7CisJcHJpbnRmKCJcbiIpOworCXRoZW4gPSBTRExfR2V0VGlja3MoKTsKKwlmcmFtZXMgPSBSdW5CbGl0VGVzdHMoc2NyZWVuLCBibXBjYywgTlVNX0JMSVRTKTsKKwlub3cgPSBTRExfR2V0VGlja3MoKTsKKwlzZWNvbmRzID0gKGZsb2F0KShub3cgLSB0aGVuKSAvIDEwMDAuMGY7CisJaWYgKCBzZWNvbmRzID4gMC4wZiApIHsKKwkJcHJpbnRmKCIlZCBjYyBibGl0cyAvICVkIHVwZGF0ZXMgaW4gJTIuMmYgc2Vjb25kcywgJTIuMmYgRlBTXG4iLCBOVU1fQkxJVFMqZnJhbWVzLCBmcmFtZXMsIHNlY29uZHMsIChmbG9hdClmcmFtZXMgLyBzZWNvbmRzKTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVkIGNjIGJsaXRzIC8gJWQgdXBkYXRlcyBpbiB6ZXJvIHNlY29uZHMhXG4iLCBOVU1fQkxJVFMqZnJhbWVzLCBmcmFtZXMpOworCX0KKworICAgICAgICAvKiBjbGVhciB0aGUgc2NyZWVuIGFmdGVyIGNjIGJsaXQgdGVzdCAqLworICAgICAgICBTRExfRmlsbFJlY3Qoc2NyZWVuLCBOVUxMLCBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCAwLCAwLCAwKSk7CisJU0RMX0ZsaXAoc2NyZWVuKTsKKworCXdoaWxlICggU0RMX1BvbGxFdmVudCgmZXZlbnQpICkgeworCQlpZiAoIGV2ZW50LnR5cGUgPT0gU0RMX0tFWURPV04gKQorCQkJcmV0dXJuIDA7CisJfQorCisgICAgICAgIC8qIHJ1biB0aGUgYWxwaGEgYmxpdCB0ZXN0IG9ubHkgaWYgc2NyZWVuIGJwcD44ICovCisgICAgICAgIGlmIChibXAtPmZvcm1hdC0+Qml0c1BlclBpeGVsPjgpCisgICAgICAgIHsKKwkJU0RMX0ZyZWVTdXJmYWNlKGJtcCk7CisgICAgICAgICAgICAgICAgYm1wID0gU0RMX0xvYWRCTVAoInNhbXBsZS5ibXAiKTsKKwkJU0RMX1NldEFscGhhKGJtcCwgU0RMX1NSQ0FMUEhBLCA4NSk7IC8qIDg1IC0gMzMlIGFscGhhICovCisJCXRtcCA9IGJtcDsKKwkJYm1wID0gU0RMX0Rpc3BsYXlGb3JtYXQoYm1wKTsKKwkJU0RMX0ZyZWVTdXJmYWNlKHRtcCk7CisJCWlmICggISBibXAgKSB7CisJCQlwcmludGYoIkNvdWxkbid0IGNvbnZlcnQgc2FtcGxlLmJtcDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ZigiUnVubmluZyBkaXNwbGF5IGZvcm1hdCBhbHBoYSBibGl0IHRlc3Q6ICVkeCVkIGF0ICVkIGJwcCwgZmxhZ3M6ICIsCisJCQlibXAtPncsIGJtcC0+aCwgYm1wLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCk7CisJCVByaW50RmxhZ3MoYm1wLT5mbGFncyk7CisJCXByaW50ZigiXG4iKTsKKwkJdGhlbiA9IFNETF9HZXRUaWNrcygpOworCQlmcmFtZXMgPSBSdW5CbGl0VGVzdHMoc2NyZWVuLCBibXAsIE5VTV9CTElUUyk7CisJCW5vdyA9IFNETF9HZXRUaWNrcygpOworCQlzZWNvbmRzID0gKGZsb2F0KShub3cgLSB0aGVuKSAvIDEwMDAuMGY7CisJCWlmICggc2Vjb25kcyA+IDAuMGYgKSB7CisJCQlwcmludGYoIiVkIGFscGhhIGJsaXRzIC8gJWQgdXBkYXRlcyBpbiAlMi4yZiBzZWNvbmRzLCAlMi4yZiBGUFNcbiIsIE5VTV9CTElUUypmcmFtZXMsIGZyYW1lcywgc2Vjb25kcywgKGZsb2F0KWZyYW1lcyAvIHNlY29uZHMpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIlZCBhbHBoYSBibGl0cyAvICVkIHVwZGF0ZXMgaW4gemVybyBzZWNvbmRzIVxuIiwgTlVNX0JMSVRTKmZyYW1lcywgZnJhbWVzKTsKKwkJfQorCX0KKworICAgICAgICAvKiBjbGVhciB0aGUgc2NyZWVuIGFmdGVyIGFscGhhIGJsaXQgdGVzdCAqLworICAgICAgICBTRExfRmlsbFJlY3Qoc2NyZWVuLCBOVUxMLCBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCAwLCAwLCAwKSk7CisJU0RMX0ZsaXAoc2NyZWVuKTsKKworCXdoaWxlICggU0RMX1BvbGxFdmVudCgmZXZlbnQpICkgeworCQlpZiAoIGV2ZW50LnR5cGUgPT0gU0RMX0tFWURPV04gKQorCQkJcmV0dXJuIDA7CisJfQorCisgICAgICAgIC8qIHJ1biB0aGUgY2MrYWxwaGEgYmxpdCB0ZXN0IG9ubHkgaWYgc2NyZWVuIGJwcD44ICovCisgICAgICAgIGlmIChibXAtPmZvcm1hdC0+Qml0c1BlclBpeGVsPjgpCisgICAgICAgIHsKKwkJU0RMX0ZyZWVTdXJmYWNlKGJtcGNjKTsKKyAgICAgICAgICAgICAgICBibXBjYyA9IFNETF9Mb2FkQk1QKCJzYW1wbGUuYm1wIik7CisJCVNETF9TZXRBbHBoYShibXBjYywgU0RMX1NSQ0FMUEhBLCA4NSk7IC8qIDg1IC0gMzMlIGFscGhhICovCisgICAgICAgICAgICAgICAgU0RMX1NldENvbG9yS2V5KGJtcGNjLCBTRExfU1JDQ09MT1JLRVkgfCBTRExfUkxFQUNDRUwsICooVWludDggKilibXBjYy0+cGl4ZWxzKTsKKwkJdG1wID0gYm1wY2M7CisJCWJtcGNjID0gU0RMX0Rpc3BsYXlGb3JtYXQoYm1wY2MpOworCQlTRExfRnJlZVN1cmZhY2UodG1wKTsKKwkJaWYgKCAhIGJtcGNjICkgeworCQkJcHJpbnRmKCJDb3VsZG4ndCBjb252ZXJ0IHNhbXBsZS5ibXA6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGYoIlJ1bm5pbmcgZGlzcGxheSBmb3JtYXQgY2MrYWxwaGEgYmxpdCB0ZXN0OiAlZHglZCBhdCAlZCBicHAsIGZsYWdzOiAiLAorCQkJYm1wY2MtPncsIGJtcGNjLT5oLCBibXBjYy0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpOworCQlQcmludEZsYWdzKGJtcGNjLT5mbGFncyk7CisJCXByaW50ZigiXG4iKTsKKwkJdGhlbiA9IFNETF9HZXRUaWNrcygpOworCQlmcmFtZXMgPSBSdW5CbGl0VGVzdHMoc2NyZWVuLCBibXBjYywgTlVNX0JMSVRTKTsKKwkJbm93ID0gU0RMX0dldFRpY2tzKCk7CisJCXNlY29uZHMgPSAoZmxvYXQpKG5vdyAtIHRoZW4pIC8gMTAwMC4wZjsKKwkJaWYgKCBzZWNvbmRzID4gMC4wZiApIHsKKwkJCXByaW50ZigiJWQgY2MrYWxwaGEgYmxpdHMgLyAlZCB1cGRhdGVzIGluICUyLjJmIHNlY29uZHMsICUyLjJmIEZQU1xuIiwgTlVNX0JMSVRTKmZyYW1lcywgZnJhbWVzLCBzZWNvbmRzLCAoZmxvYXQpZnJhbWVzIC8gc2Vjb25kcyk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiVkIGNjK2FscGhhIGJsaXRzIC8gJWQgdXBkYXRlcyBpbiB6ZXJvIHNlY29uZHMhXG4iLCBOVU1fQkxJVFMqZnJhbWVzLCBmcmFtZXMpOworCQl9CisJfQorCisJU0RMX0ZyZWVTdXJmYWNlKGJtcGNjKTsKKwlTRExfRnJlZVN1cmZhY2UoYm1wKTsKKworCXdoaWxlICggU0RMX1BvbGxFdmVudCgmZXZlbnQpICkgeworCQlpZiAoIGV2ZW50LnR5cGUgPT0gU0RMX0tFWURPV04gKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCit2b2lkIFJ1blZpZGVvVGVzdHMoKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQlpbnQgdywgaCwgYnBwOworCX0gbW9kZV9saXN0W10gPSB7CisJCXsgNjQwLCA0ODAsIDggfSwgeyA2NDAsIDQ4MCwgMTYgfSwgeyA2NDAsIDQ4MCwgMzIgfSwKKwkJeyA4MDAsIDYwMCwgOCB9LCB7IDgwMCwgNjAwLCAxNiB9LCB7IDgwMCwgNjAwLCAzMiB9LAorCQl7IDEwMjQsIDc2OCwgOCB9LCB7IDEwMjQsIDc2OCwgMTYgfSwgeyAxMDI0LCA3NjgsIDMyIH0KKwl9OworCXN0YXRpYyBjb25zdCBVaW50MzIgZmxhZ3NbXSA9IHsKKwkJKFNETF9TV1NVUkZBQ0UpLAorCQkoU0RMX1NXU1VSRkFDRSB8IFNETF9GVUxMU0NSRUVOKSwKKwkJKFNETF9IV1NVUkZBQ0UgfCBTRExfRlVMTFNDUkVFTiksCisJCShTRExfSFdTVVJGQUNFIHwgU0RMX0ZVTExTQ1JFRU4gfCBTRExfRE9VQkxFQlVGKQorCX07CisJaW50IGksIGo7CisJU0RMX1N1cmZhY2UgKnNjcmVlbjsKKworCS8qIFRlc3Qgb3V0IHNldmVyYWwgZGlmZmVyZW50IHZpZGVvIG1vZGUgY29tYmluYXRpb25zICovCisJU0RMX1dNX1NldENhcHRpb24oIlNETCBWaWRlbyBCZW5jaG1hcmsiLCAidmlkdGVzdCIpOworCVNETF9TaG93Q3Vyc29yKDApOworCWZvciAoIGkgPSAwOyBpIDwgU0RMX1RBQkxFU0laRShtb2RlX2xpc3QpOyArK2kgKSB7CisJCWZvciAoIGogPSAwOyBqIDwgU0RMX1RBQkxFU0laRShmbGFncyk7ICsraiApIHsKKwkJCXByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCQkJcHJpbnRmKCJTZXR0aW5nIHZpZGVvIG1vZGU6ICVkeCVkIGF0ICVkIGJwcCwgZmxhZ3M6ICIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbGlzdFtpXS53LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2xpc3RbaV0uaCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9saXN0W2ldLmJwcCk7CisJCQlQcmludEZsYWdzKGZsYWdzW2pdKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJCXNjcmVlbiA9IFNETF9TZXRWaWRlb01vZGUobW9kZV9saXN0W2ldLncsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbGlzdFtpXS5oLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX2xpc3RbaV0uYnBwLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc1tqXSk7CisJCQlpZiAoICEgc2NyZWVuICkgeworCQkJCXByaW50ZigiU2V0dGluZyB2aWRlbyBtb2RlIGZhaWxlZDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICggKHNjcmVlbi0+ZmxhZ3MgJiBGTEFHX01BU0spICE9IGZsYWdzW2pdICkgeworCQkJCXByaW50ZigiRmxhZ3MgZGlkbid0IG1hdGNoOiAiKTsKKwkJCQlQcmludEZsYWdzKHNjcmVlbi0+ZmxhZ3MpOworCQkJCXByaW50ZigiXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICggISBSdW5Nb2RlVGVzdHMoc2NyZWVuKSApIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY29uc3QgU0RMX1ZpZGVvSW5mbyAqaW5mbzsKKwlpbnQgaTsKKwlTRExfUmVjdCAqKm1vZGVzOworCWNoYXIgZHJpdmVyWzEyOF07CisKKwlpZiAoIFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCQlleGl0KDEpOworCX0KKwlpZiAoIFNETF9WaWRlb0RyaXZlck5hbWUoZHJpdmVyLCBzaXplb2YoZHJpdmVyKSkgKSB7CisJCXByaW50ZigiVmlkZW8gZHJpdmVyOiAlc1xuIiwgZHJpdmVyKTsKKwl9CisJaW5mbyA9IFNETF9HZXRWaWRlb0luZm8oKTsKKwlwcmludGYoCisiQ3VycmVudCBkaXNwbGF5OiAlZHglZCwgJWQgYml0cy1wZXItcGl4ZWxcbiIsCisJCWluZm8tPmN1cnJlbnRfdywgaW5mby0+Y3VycmVudF9oLCBpbmZvLT52Zm10LT5CaXRzUGVyUGl4ZWwpOworCWlmICggaW5mby0+dmZtdC0+cGFsZXR0ZSA9PSBOVUxMICkgeworCQlwcmludGYoIglSZWQgTWFzayA9IDB4JS44eFxuIiwgaW5mby0+dmZtdC0+Um1hc2spOworCQlwcmludGYoIglHcmVlbiBNYXNrID0gMHglLjh4XG4iLCBpbmZvLT52Zm10LT5HbWFzayk7CisJCXByaW50ZigiCUJsdWUgTWFzayA9IDB4JS44eFxuIiwgaW5mby0+dmZtdC0+Qm1hc2spOworCX0KKwkvKiBQcmludCBhdmFpbGFibGUgZnVsbHNjcmVlbiB2aWRlbyBtb2RlcyAqLworCW1vZGVzID0gU0RMX0xpc3RNb2RlcyhOVUxMLCBTRExfRlVMTFNDUkVFTik7CisJaWYgKCBtb2RlcyA9PSAoU0RMX1JlY3QgKiopMCApIHsKKwkJcHJpbnRmKCJObyBhdmFpbGFibGUgZnVsbHNjcmVlbiB2aWRlbyBtb2Rlc1xuIik7CisJfSBlbHNlCisJaWYgKCBtb2RlcyA9PSAoU0RMX1JlY3QgKiopLTEgKSB7CisJCXByaW50ZigiTm8gc3BlY2lhbCBmdWxsc2NyZWVuIHZpZGVvIG1vZGVzXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkZ1bGxzY3JlZW4gdmlkZW8gbW9kZXM6XG4iKTsKKwkJZm9yICggaT0wOyBtb2Rlc1tpXTsgKytpICkgeworCQkJcHJpbnRmKCJcdCVkeCVkeCVkXG4iLCBtb2Rlc1tpXS0+dywgbW9kZXNbaV0tPmgsIGluZm8tPnZmbXQtPkJpdHNQZXJQaXhlbCk7CisJCX0KKwl9CisJaWYgKCBpbmZvLT53bV9hdmFpbGFibGUgKSB7CisJCXByaW50ZigiQSB3aW5kb3cgbWFuYWdlciBpcyBhdmFpbGFibGVcbiIpOworCX0KKwlpZiAoIGluZm8tPmh3X2F2YWlsYWJsZSApIHsKKwkJcHJpbnRmKCJIYXJkd2FyZSBzdXJmYWNlcyBhcmUgYXZhaWxhYmxlICglZEsgdmlkZW8gbWVtb3J5KVxuIiwKKwkJCWluZm8tPnZpZGVvX21lbSk7CisJfQorCWlmICggaW5mby0+YmxpdF9odyApIHsKKwkJcHJpbnRmKAorIkNvcHkgYmxpdHMgYmV0d2VlbiBoYXJkd2FyZSBzdXJmYWNlcyBhcmUgYWNjZWxlcmF0ZWRcbiIpOworCX0KKwlpZiAoIGluZm8tPmJsaXRfaHdfQ0MgKSB7CisJCXByaW50ZigKKyJDb2xvcmtleSBibGl0cyBiZXR3ZWVuIGhhcmR3YXJlIHN1cmZhY2VzIGFyZSBhY2NlbGVyYXRlZFxuIik7CisJfQorCWlmICggaW5mby0+YmxpdF9od19BICkgeworCQlwcmludGYoCisiQWxwaGEgYmxpdHMgYmV0d2VlbiBoYXJkd2FyZSBzdXJmYWNlcyBhcmUgYWNjZWxlcmF0ZWRcbiIpOworCX0KKwlpZiAoIGluZm8tPmJsaXRfc3cgKSB7CisJCXByaW50ZigKKyJDb3B5IGJsaXRzIGZyb20gc29mdHdhcmUgc3VyZmFjZXMgdG8gaGFyZHdhcmUgc3VyZmFjZXMgYXJlIGFjY2VsZXJhdGVkXG4iKTsKKwl9CisJaWYgKCBpbmZvLT5ibGl0X3N3X0NDICkgeworCQlwcmludGYoCisiQ29sb3JrZXkgYmxpdHMgZnJvbSBzb2Z0d2FyZSBzdXJmYWNlcyB0byBoYXJkd2FyZSBzdXJmYWNlcyBhcmUgYWNjZWxlcmF0ZWRcbiIpOworCX0KKwlpZiAoIGluZm8tPmJsaXRfc3dfQSApIHsKKwkJcHJpbnRmKAorIkFscGhhIGJsaXRzIGZyb20gc29mdHdhcmUgc3VyZmFjZXMgdG8gaGFyZHdhcmUgc3VyZmFjZXMgYXJlIGFjY2VsZXJhdGVkXG4iKTsKKwl9CisJaWYgKCBpbmZvLT5ibGl0X2ZpbGwgKSB7CisJCXByaW50ZigKKyJDb2xvciBmaWxscyBvbiBoYXJkd2FyZSBzdXJmYWNlcyBhcmUgYWNjZWxlcmF0ZWRcbiIpOworCX0KKworCWlmICggYXJndlsxXSAmJiAoc3RyY21wKGFyZ3ZbMV0sICItYmVuY2htYXJrIikgPT0gMCkgKSB7CisJCVJ1blZpZGVvVGVzdHMoKTsKKwl9CisKKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R3aW4uYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R3aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjFlYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHdpbi5jCkBAIC0wLDAgKzEsMzc3IEBACisKKy8qIEJyaW5nIHVwIGEgd2luZG93IGFuZCBwbGF5IHdpdGggaXQgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgQkVOQ0hNQVJLX1NETAorCisjZGVmaW5lIE5PVElDRShYKQlwcmludGYoIiVzIiwgWCk7CisKKyNpbmNsdWRlICJTREwuaCIKKworLyogQ2FsbCB0aGlzIGluc3RlYWQgb2YgZXhpdCgpLCBzbyB3ZSBjYW4gY2xlYW4gdXAgU0RMOiBhdGV4aXQoKSBpcyBldmlsLiAqLworc3RhdGljIHZvaWQgcXVpdChpbnQgcmMpCit7CisJU0RMX1F1aXQoKTsKKwlleGl0KHJjKTsKK30KKwordm9pZCBEcmF3UGljdChTRExfU3VyZmFjZSAqc2NyZWVuLCBjaGFyICpibXBmaWxlLAorCQkJCQlpbnQgc3BlZWR5LCBpbnQgZmxpcCwgaW50IG5vZmFkZSkKK3sKKwlTRExfU3VyZmFjZSAqcGljdHVyZTsKKwlTRExfUmVjdCBkZXN0LCB1cGRhdGU7CisJaW50IGksIGNlbnRlcmVkOworCWludCBuY29sb3JzOworCVNETF9Db2xvciAqY29sb3JzLCAqY21hcDsKKworCS8qIExvYWQgdGhlIGltYWdlIGludG8gYSBzdXJmYWNlICovCisJaWYgKCBibXBmaWxlID09IE5VTEwgKSB7CisJCWJtcGZpbGUgPSAic2FtcGxlLmJtcCI7CQkvKiBTYW1wbGUgaW1hZ2UgKi8KKwl9CitmcHJpbnRmKHN0ZGVyciwgIkxvYWRpbmcgcGljdHVyZTogJXNcbiIsIGJtcGZpbGUpOworCXBpY3R1cmUgPSBTRExfTG9hZEJNUChibXBmaWxlKTsKKwlpZiAoIHBpY3R1cmUgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBsb2FkICVzOiAlc1xuIiwgYm1wZmlsZSwKKwkJCQkJCQlTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBTZXQgdGhlIGRpc3BsYXkgY29sb3JzIC0tIG9uIGEgaGljb2xvciBkaXNwbGF5IHRoaXMgaXMgYSBuby1vcCAqLworCWlmICggcGljdHVyZS0+Zm9ybWF0LT5wYWxldHRlICkgeworCQluY29sb3JzID0gcGljdHVyZS0+Zm9ybWF0LT5wYWxldHRlLT5uY29sb3JzOworCQljb2xvcnMgID0gKFNETF9Db2xvciAqKW1hbGxvYyhuY29sb3JzKnNpemVvZihTRExfQ29sb3IpKTsKKwkJY21hcCAgICA9IChTRExfQ29sb3IgKiltYWxsb2MobmNvbG9ycypzaXplb2YoU0RMX0NvbG9yKSk7CisJCW1lbWNweShjb2xvcnMsIHBpY3R1cmUtPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzLAorCQkJCQkJbmNvbG9ycypzaXplb2YoU0RMX0NvbG9yKSk7CisJfSBlbHNlIHsKKwkJaW50ICAgICAgIHIsIGcsIGI7CisKKwkJLyogQWxsb2NhdGUgMjU2IGNvbG9yIHBhbGV0dGUgKi8KKwkJbmNvbG9ycyA9IDI1NjsKKwkJY29sb3JzICA9IChTRExfQ29sb3IgKiltYWxsb2MobmNvbG9ycypzaXplb2YoU0RMX0NvbG9yKSk7CisJCWNtYXAgICAgPSAoU0RMX0NvbG9yICopbWFsbG9jKG5jb2xvcnMqc2l6ZW9mKFNETF9Db2xvcikpOworCisJCS8qIFNldCBhIDMsMywyIGNvbG9yIGN1YmUgKi8KKwkJZm9yICggcj0wOyByPDg7ICsrciApIHsKKwkJCWZvciAoIGc9MDsgZzw4OyArK2cgKSB7CisJCQkJZm9yICggYj0wOyBiPDQ7ICsrYiApIHsKKwkJCQkJaSA9ICgocjw8NSl8KGc8PDIpfGIpOworCQkJCQljb2xvcnNbaV0uciA9IHI8PDU7CisJCQkJCWNvbG9yc1tpXS5nID0gZzw8NTsKKwkJCQkJY29sb3JzW2ldLmIgPSBiPDw2OworCQkJCX0KKwkJCX0KKwkJfQorCX0KK05PVElDRSgidGVzdHdpbjogc2V0dGluZyBjb2xvcnNcbiIpOworCWlmICggISBTRExfU2V0Q29sb3JzKHNjcmVlbiwgY29sb3JzLCAwLCBuY29sb3JzKSAmJgorCQkJCShzY3JlZW4tPmZvcm1hdC0+cGFsZXR0ZSAhPSBOVUxMKSApIHsKKwkJZnByaW50ZihzdGRlcnIsCisiV2FybmluZzogQ291bGRuJ3Qgc2V0IGFsbCBvZiB0aGUgY29sb3JzLCBidXQgU0RMIHdpbGwgbWFwIHRoZSBpbWFnZVxuIgorIiAgICAgICAgIChjb2xvcm1hcCBmYWRpbmcgd2lsbCBzdWZmZXIgLSB0cnkgdGhlIC13YXJwIG9wdGlvbilcbiIKKwkJKTsKKwl9CisKKwkvKiBTZXQgdGhlIHNjcmVlbiB0byBibGFjayAobm90IHJlYWxseSBuZWNlc3NhcnkpICovCisJaWYgKCBTRExfTG9ja1N1cmZhY2Uoc2NyZWVuKSA9PSAwICkgeworCQlVaW50MzIgYmxhY2s7CisJCVVpbnQ4ICpwaXhlbHM7CisKKwkJYmxhY2sgPSBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCAwLCAwLCAwKTsKKwkJcGl4ZWxzID0gKFVpbnQ4ICopc2NyZWVuLT5waXhlbHM7CisJCWZvciAoIGk9MDsgaTxzY3JlZW4tPmg7ICsraSApIHsKKwkJCW1lbXNldChwaXhlbHMsIGJsYWNrLAorCQkJCXNjcmVlbi0+dypzY3JlZW4tPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCk7CisJCQlwaXhlbHMgKz0gc2NyZWVuLT5waXRjaDsKKwkJfQorCQlTRExfVW5sb2NrU3VyZmFjZShzY3JlZW4pOworCQlTRExfVXBkYXRlUmVjdChzY3JlZW4sIDAsIDAsIDAsIDApOworCX0KKwkKKwkvKiBEaXNwbGF5IHRoZSBwaWN0dXJlICovCisJaWYgKCBzcGVlZHkgKSB7CisJCVNETF9TdXJmYWNlICpkaXNwbGF5Zm10OworCitmcHJpbnRmKHN0ZGVyciwgIkNvbnZlcnRpbmcgcGljdHVyZVxuIik7CisJCWRpc3BsYXlmbXQgPSBTRExfRGlzcGxheUZvcm1hdChwaWN0dXJlKTsKKwkJaWYgKCBkaXNwbGF5Zm10ID09IE5VTEwgKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiQ291bGRuJ3QgY29udmVydCBpbWFnZTogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlTRExfRnJlZVN1cmZhY2UocGljdHVyZSk7CisJCXBpY3R1cmUgPSBkaXNwbGF5Zm10OworCX0KKwlwcmludGYoIihpbWFnZSBzdXJmYWNlIGxvY2F0ZWQgaW4gJXMgbWVtb3J5KVxuIiwgCisJCQkocGljdHVyZS0+ZmxhZ3MmU0RMX0hXU1VSRkFDRSkgPyAidmlkZW8iIDogInN5c3RlbSIpOworCWNlbnRlcmVkID0gKHNjcmVlbi0+dyAtIHBpY3R1cmUtPncpLzI7CisJaWYgKCBjZW50ZXJlZCA8IDAgKSB7CisJCWNlbnRlcmVkID0gMDsKKwl9CisJZGVzdC55ID0gKHNjcmVlbi0+aCAtIHBpY3R1cmUtPmgpLzI7CisJZGVzdC53ID0gcGljdHVyZS0+dzsKKwlkZXN0LmggPSBwaWN0dXJlLT5oOworTk9USUNFKCJ0ZXN0d2luOiBtb3ZpbmcgaW1hZ2VcbiIpOworCWZvciAoIGk9MDsgaTw9Y2VudGVyZWQ7ICsraSApIHsKKwkJZGVzdC54ID0gaTsKKwkJdXBkYXRlID0gZGVzdDsKKwkJaWYgKCBTRExfQmxpdFN1cmZhY2UocGljdHVyZSwgTlVMTCwgc2NyZWVuLCAmdXBkYXRlKSA8IDAgKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkJsaXQgZmFpbGVkOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCBmbGlwICkgeworCQkJU0RMX0ZsaXAoc2NyZWVuKTsKKwkJfSBlbHNlIHsKKwkJCVNETF9VcGRhdGVSZWN0cyhzY3JlZW4sIDEsICZ1cGRhdGUpOworCQl9CisJfQorCisjaWZkZWYgU0NSRUVOU0hPVAorCWlmICggU0RMX1NhdmVCTVAoc2NyZWVuLCAic2NyZWVuLmJtcCIpIDwgMCApCisJCXByaW50ZigiQ291bGRuJ3Qgc2F2ZSBzY3JlZW46ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisjZW5kaWYKKworI2lmbmRlZiBCRU5DSE1BUktfU0RMCisJLyogTGV0IGl0IHNpdCB0aGVyZSBmb3IgYSB3aGlsZSAqLworCVNETF9EZWxheSg1KjEwMDApOworI2VuZGlmCisJLyogRmFkZSB0aGUgY29sb3JtYXAgKi8KKwlpZiAoICEgbm9mYWRlICkgeworCQlpbnQgbWF4c3RlcDsKKwkJU0RMX0NvbG9yIGZpbmFsOworCQlTRExfQ29sb3IgcGFsY29sb3JzWzI1Nl07CisJCXN0cnVjdCB7CisJCQlTaW50MTYgciwgZywgYjsKKwkJfSBjZGlzdFsyNTZdOworCitOT1RJQ0UoInRlc3R3aW46IGZhZGluZyBvdXQuLi5cbiIpOworCQltZW1jcHkoY21hcCwgY29sb3JzLCBuY29sb3JzKnNpemVvZihTRExfQ29sb3IpKTsKKwkJbWF4c3RlcCA9IDMyLTE7CisJCWZpbmFsLnIgPSAweEZGOworCQlmaW5hbC5nID0gMHgwMDsKKwkJZmluYWwuYiA9IDB4MDA7CisJCW1lbWNweShwYWxjb2xvcnMsIGNvbG9ycywgbmNvbG9ycypzaXplb2YoU0RMX0NvbG9yKSk7CisJCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7CisJCQljZGlzdFtpXS5yID0gZmluYWwuci1wYWxjb2xvcnNbaV0ucjsKKwkJCWNkaXN0W2ldLmcgPSBmaW5hbC5nLXBhbGNvbG9yc1tpXS5nOworCQkJY2Rpc3RbaV0uYiA9IGZpbmFsLmItcGFsY29sb3JzW2ldLmI7CisJCX0KKwkJZm9yICggaT0wOyBpPD1tYXhzdGVwLzI7ICsraSApIHsJLyogaGFsZndheSBmYWRlICovCisJCQlpbnQgYzsKKwkJCWZvciAoIGM9MDsgYzxuY29sb3JzOyArK2MgKSB7CisJCQkJY29sb3JzW2NdLnIgPQorCQkJCQlwYWxjb2xvcnNbY10ucisoKGNkaXN0W2NdLnIqaSkpL21heHN0ZXA7CisJCQkJY29sb3JzW2NdLmcgPQorCQkJCQlwYWxjb2xvcnNbY10uZysoKGNkaXN0W2NdLmcqaSkpL21heHN0ZXA7CisJCQkJY29sb3JzW2NdLmIgPQorCQkJCQlwYWxjb2xvcnNbY10uYisoKGNkaXN0W2NdLmIqaSkpL21heHN0ZXA7CisJCQl9CisJCQlTRExfU2V0Q29sb3JzKHNjcmVlbiwgY29sb3JzLCAwLCBuY29sb3JzKTsKKwkJCVNETF9EZWxheSgxKTsKKwkJfQorCQlmaW5hbC5yID0gMHgwMDsKKwkJZmluYWwuZyA9IDB4MDA7CisJCWZpbmFsLmIgPSAweDAwOworCQltZW1jcHkocGFsY29sb3JzLCBjb2xvcnMsIG5jb2xvcnMqc2l6ZW9mKFNETF9Db2xvcikpOworCQlmb3IgKCBpPTA7IGk8bmNvbG9yczsgKytpICkgeworCQkJY2Rpc3RbaV0uciA9IGZpbmFsLnItcGFsY29sb3JzW2ldLnI7CisJCQljZGlzdFtpXS5nID0gZmluYWwuZy1wYWxjb2xvcnNbaV0uZzsKKwkJCWNkaXN0W2ldLmIgPSBmaW5hbC5iLXBhbGNvbG9yc1tpXS5iOworCQl9CisJCW1heHN0ZXAgLz0gMjsKKwkJZm9yICggaT0wOyBpPD1tYXhzdGVwOyArK2kgKSB7CQkvKiBmaW5pc2ggZmFkZSBvdXQgKi8KKwkJCWludCBjOworCQkJZm9yICggYz0wOyBjPG5jb2xvcnM7ICsrYyApIHsKKwkJCQljb2xvcnNbY10uciA9CisJCQkJCXBhbGNvbG9yc1tjXS5yKygoY2Rpc3RbY10ucippKSkvbWF4c3RlcDsKKwkJCQljb2xvcnNbY10uZyA9CisJCQkJCXBhbGNvbG9yc1tjXS5nKygoY2Rpc3RbY10uZyppKSkvbWF4c3RlcDsKKwkJCQljb2xvcnNbY10uYiA9CisJCQkJCXBhbGNvbG9yc1tjXS5iKygoY2Rpc3RbY10uYippKSkvbWF4c3RlcDsKKwkJCX0KKwkJCVNETF9TZXRDb2xvcnMoc2NyZWVuLCBjb2xvcnMsIDAsIG5jb2xvcnMpOworCQkJU0RMX0RlbGF5KDEpOworCQl9CisJCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7CisJCQljb2xvcnNbaV0uciA9IGZpbmFsLnI7CisJCQljb2xvcnNbaV0uZyA9IGZpbmFsLmc7CisJCQljb2xvcnNbaV0uYiA9IGZpbmFsLmI7CisJCX0KKwkJU0RMX1NldENvbG9ycyhzY3JlZW4sIGNvbG9ycywgMCwgbmNvbG9ycyk7CitOT1RJQ0UoInRlc3R3aW46IGZhZGluZyBpbi4uLlxuIik7CisJCW1lbWNweShwYWxjb2xvcnMsIGNvbG9ycywgbmNvbG9ycypzaXplb2YoU0RMX0NvbG9yKSk7CisJCWZvciAoIGk9MDsgaTxuY29sb3JzOyArK2kgKSB7CisJCQljZGlzdFtpXS5yID0gY21hcFtpXS5yLXBhbGNvbG9yc1tpXS5yOworCQkJY2Rpc3RbaV0uZyA9IGNtYXBbaV0uZy1wYWxjb2xvcnNbaV0uZzsKKwkJCWNkaXN0W2ldLmIgPSBjbWFwW2ldLmItcGFsY29sb3JzW2ldLmI7CisJCX0KKwkJZm9yICggaT0wOyBpPD1tYXhzdGVwOyArK2kgKSB7CS8qIDMyIHN0ZXAgZmFkZSBpbiAqLworCQkJaW50IGM7CisJCQlmb3IgKCBjPTA7IGM8bmNvbG9yczsgKytjICkgeworCQkJCWNvbG9yc1tjXS5yID0KKwkJCQkJcGFsY29sb3JzW2NdLnIrKChjZGlzdFtjXS5yKmkpKS9tYXhzdGVwOworCQkJCWNvbG9yc1tjXS5nID0KKwkJCQkJcGFsY29sb3JzW2NdLmcrKChjZGlzdFtjXS5nKmkpKS9tYXhzdGVwOworCQkJCWNvbG9yc1tjXS5iID0KKwkJCQkJcGFsY29sb3JzW2NdLmIrKChjZGlzdFtjXS5iKmkpKS9tYXhzdGVwOworCQkJfQorCQkJU0RMX1NldENvbG9ycyhzY3JlZW4sIGNvbG9ycywgMCwgbmNvbG9ycyk7CisJCQlTRExfRGVsYXkoMSk7CisJCX0KK05PVElDRSgidGVzdHdpbjogZmFkaW5nIG92ZXJcbiIpOworCX0KKwkKK2RvbmU6CisJLyogRnJlZSB0aGUgcGljdHVyZSBhbmQgcmV0dXJuICovCisJU0RMX0ZyZWVTdXJmYWNlKHBpY3R1cmUpOworCWZyZWUoY29sb3JzKTsgZnJlZShjbWFwKTsKKwlyZXR1cm47Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJU0RMX1N1cmZhY2UgKnNjcmVlbjsKKwkvKiBPcHRpb25zICovCisJaW50IHNwZWVkeSwgZmxpcCwgbm9mYWRlOworCWludCBkZWxheTsKKwlpbnQgdywgaDsKKwlpbnQgZGVzaXJlZF9icHA7CisJVWludDMyIHZpZGVvX2ZsYWdzOworI2lmZGVmIEJFTkNITUFSS19TREwKKwlVaW50MzIgdGhlbiwgbm93OworI2VuZGlmCisJLyogU2V0IGRlZmF1bHQgb3B0aW9ucyBhbmQgY2hlY2sgY29tbWFuZC1saW5lICovCisJc3BlZWR5ID0gMDsKKwlmbGlwID0gMDsKKwlub2ZhZGUgPSAwOworCWRlbGF5ID0gMTsKKworI2lmZGVmIF9XSU4zMl9XQ0UKKwl3ID0gMjQwOworCWggPSAzMjA7CisJZGVzaXJlZF9icHAgPSA4OworCXZpZGVvX2ZsYWdzID0gU0RMX0ZVTExTQ1JFRU47CisjZWxzZQorCXcgPSA2NDA7CisJaCA9IDQ4MDsKKwlkZXNpcmVkX2JwcCA9IDA7CisJdmlkZW9fZmxhZ3MgPSAwOworI2VuZGlmCisJaWYgKCBTRExfSW5pdChTRExfSU5JVF9WSURFTykgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJDb3VsZG4ndCBpbml0aWFsaXplIFNETDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuKDEpOworCX0KKworCXdoaWxlICggYXJnYyA+IDEgKSB7CisJCWlmICggc3RyY21wKGFyZ3ZbMV0sICItc3BlZWR5IikgPT0gMCApIHsKKwkJCXNwZWVkeSA9IDE7CisJCQlhcmd2ICs9IDE7CisJCQlhcmdjIC09IDE7CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2WzFdLCAiLW5vZmFkZSIpID09IDAgKSB7CisJCQlub2ZhZGUgPSAxOworCQkJYXJndiArPSAxOworCQkJYXJnYyAtPSAxOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlsxXSwgIi1kZWxheSIpID09IDAgKSB7CisJCQlpZiAoIGFyZ3ZbMl0gKSB7CisJCQkJZGVsYXkgPSBhdG9pKGFyZ3ZbMl0pOworCQkJCWFyZ3YgKz0gMjsKKwkJCQlhcmdjIC09IDI7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJUaGUgLWRlbGF5IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcXVpdCgxKTsKKwkJCX0KKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbMV0sICItd2lkdGgiKSA9PSAwICkgeworCQkJaWYgKCBhcmd2WzJdICYmICgodyA9IGF0b2koYXJndlsyXSkpID4gMCkgKSB7CisJCQkJYXJndiArPSAyOworCQkJCWFyZ2MgLT0gMjsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlRoZSAtd2lkdGggb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlxdWl0KDEpOworCQkJfQorCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlsxXSwgIi1oZWlnaHQiKSA9PSAwICkgeworCQkJaWYgKCBhcmd2WzJdICYmICgoaCA9IGF0b2koYXJndlsyXSkpID4gMCkgKSB7CisJCQkJYXJndiArPSAyOworCQkJCWFyZ2MgLT0gMjsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlRoZSAtaGVpZ2h0IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcXVpdCgxKTsKKwkJCX0KKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbMV0sICItYnBwIikgPT0gMCApIHsKKwkJCWlmICggYXJndlsyXSApIHsKKwkJCQlkZXNpcmVkX2JwcCA9IGF0b2koYXJndlsyXSk7CisJCQkJYXJndiArPSAyOworCQkJCWFyZ2MgLT0gMjsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlRoZSAtYnBwIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcXVpdCgxKTsKKwkJCX0KKwkJfSBlbHNlCisJCWlmICggc3RyY21wKGFyZ3ZbMV0sICItd2FycCIpID09IDAgKSB7CisJCQl2aWRlb19mbGFncyB8PSBTRExfSFdQQUxFVFRFOworCQkJYXJndiArPSAxOworCQkJYXJnYyAtPSAxOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlsxXSwgIi1odyIpID09IDAgKSB7CisJCQl2aWRlb19mbGFncyB8PSBTRExfSFdTVVJGQUNFOworCQkJYXJndiArPSAxOworCQkJYXJnYyAtPSAxOworCQl9IGVsc2UKKwkJaWYgKCBzdHJjbXAoYXJndlsxXSwgIi1mbGlwIikgPT0gMCApIHsKKwkJCXZpZGVvX2ZsYWdzIHw9IFNETF9ET1VCTEVCVUY7CisJCQlhcmd2ICs9IDE7CisJCQlhcmdjIC09IDE7CisJCX0gZWxzZQorCQlpZiAoIHN0cmNtcChhcmd2WzFdLCAiLWZ1bGxzY3JlZW4iKSA9PSAwICkgeworCQkJdmlkZW9fZmxhZ3MgfD0gU0RMX0ZVTExTQ1JFRU47CisJCQlhcmd2ICs9IDE7CisJCQlhcmdjIC09IDE7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZGlzcGxheSAqLworCXNjcmVlbiA9IFNETF9TZXRWaWRlb01vZGUodywgaCwgZGVzaXJlZF9icHAsIHZpZGVvX2ZsYWdzKTsKKwlpZiAoIHNjcmVlbiA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IHNldCAlZHglZHglZCB2aWRlbyBtb2RlOiAlc1xuIiwKKwkJCQkJdywgaCwgZGVzaXJlZF9icHAsIFNETF9HZXRFcnJvcigpKTsKKwkJcXVpdCgxKTsKKwl9CisJcHJpbnRmKCJTZXQlcyAlZHglZHglZCBtb2RlXG4iLAorCQkJc2NyZWVuLT5mbGFncyAmIFNETF9GVUxMU0NSRUVOID8gIiBmdWxsc2NyZWVuIiA6ICIiLAorCQkJc2NyZWVuLT53LCBzY3JlZW4tPmgsIHNjcmVlbi0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwpOworCXByaW50ZigiKHZpZGVvIHN1cmZhY2UgbG9jYXRlZCBpbiAlcyBtZW1vcnkpXG4iLAorCQkJKHNjcmVlbi0+ZmxhZ3MmU0RMX0hXU1VSRkFDRSkgPyAidmlkZW8iIDogInN5c3RlbSIpOworCWlmICggc2NyZWVuLT5mbGFncyAmIFNETF9ET1VCTEVCVUYgKSB7CisJCXByaW50ZigiRG91YmxlLWJ1ZmZlcmluZyBlbmFibGVkXG4iKTsKKwkJZmxpcCA9IDE7CisJfQorCisJLyogU2V0IHRoZSB3aW5kb3cgbWFuYWdlciB0aXRsZSBiYXIgKi8KKwlTRExfV01fU2V0Q2FwdGlvbigiU0RMIHRlc3Qgd2luZG93IiwgInRlc3R3aW4iKTsKKworCS8qIERvIGFsbCB0aGUgZHJhd2luZyB3b3JrICovCisjaWZkZWYgQkVOQ0hNQVJLX1NETAorCXRoZW4gPSBTRExfR2V0VGlja3MoKTsKKwlEcmF3UGljdChzY3JlZW4sIGFyZ3ZbMV0sIHNwZWVkeSwgZmxpcCwgbm9mYWRlKTsKKwlub3cgPSBTRExfR2V0VGlja3MoKTsKKwlwcmludGYoIlRpbWU6ICVkIG1pbGxpc2Vjb25kc1xuIiwgbm93LXRoZW4pOworI2Vsc2UKKwlEcmF3UGljdChzY3JlZW4sIGFyZ3ZbMV0sIHNwZWVkeSwgZmxpcCwgbm9mYWRlKTsKKyNlbmRpZgorCVNETF9EZWxheShkZWxheSoxMDAwKTsKKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R3bS5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGVzdHdtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzYzA1MAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3Rlc3R3bS5jCkBAIC0wLDAgKzEsNDQzIEBACisKKy8qIFRlc3Qgb3V0IHRoZSB3aW5kb3cgbWFuYWdlciBpbnRlcmFjdGlvbiBmdW5jdGlvbnMgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKworLyogSXMgdGhlIGN1cnNvciB2aXNpYmxlPyAqLworc3RhdGljIGludCB2aXNpYmxlID0gMTsKKworc3RhdGljIFVpbnQ4ICB2aWRlb19icHA7CitzdGF0aWMgVWludDMyIHZpZGVvX2ZsYWdzOworCisvKiBDYWxsIHRoaXMgaW5zdGVhZCBvZiBleGl0KCksIHNvIHdlIGNhbiBjbGVhbiB1cCBTREw6IGF0ZXhpdCgpIGlzIGV2aWwuICovCitzdGF0aWMgdm9pZCBxdWl0KGludCByYykKK3sKKwlTRExfUXVpdCgpOworCWV4aXQocmMpOworfQorCitpbnQgU2V0VmlkZW9Nb2RlKGludCB3LCBpbnQgaCkKK3sKKwlTRExfU3VyZmFjZSAqc2NyZWVuOworCWludCBpOworCVVpbnQ4ICpidWZmZXI7CisJU0RMX0NvbG9yIHBhbGV0dGVbMjU2XTsKKworCXNjcmVlbiA9IFNETF9TZXRWaWRlb01vZGUodywgaCwgdmlkZW9fYnBwLCB2aWRlb19mbGFncyk7CisJaWYgKCAgc2NyZWVuID09IE5VTEwgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0ICVkeCVkeCVkIHZpZGVvIG1vZGU6ICVzXG4iLAorCQkJCQl3LCBoLCB2aWRlb19icHAsIFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJcHJpbnRmKCJSdW5uaW5nIGluICVzIG1vZGVcbiIsIHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiA/CisJCQkJCQkiZnVsbHNjcmVlbiIgOiAid2luZG93ZWQiKTsKKworCS8qIFNldCB0aGUgc3VyZmFjZSBwaXhlbHMgYW5kIHJlZnJlc2ghICovCisJZm9yICggaT0wOyBpPDI1NjsgKytpICkgeworCQlwYWxldHRlW2ldLnIgPSAyNTUtaTsKKwkJcGFsZXR0ZVtpXS5nID0gMjU1LWk7CisJCXBhbGV0dGVbaV0uYiA9IDI1NS1pOworCX0KKwlTRExfU2V0Q29sb3JzKHNjcmVlbiwgcGFsZXR0ZSwgMCwgMjU2KTsKKwlpZiAoIFNETF9Mb2NrU3VyZmFjZShzY3JlZW4pIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBsb2NrIGRpc3BsYXkgc3VyZmFjZTogJXNcbiIsCisJCQkJCQkJU0RMX0dldEVycm9yKCkpOworCQlyZXR1cm4oLTEpOworCX0KKwlidWZmZXIgPSAoVWludDggKilzY3JlZW4tPnBpeGVsczsKKwlmb3IgKCBpPTA7IGk8c2NyZWVuLT5oOyArK2kgKSB7CisJCW1lbXNldChidWZmZXIsKGkqMjU1KS9zY3JlZW4tPmgsCisJCQkJc2NyZWVuLT53KnNjcmVlbi0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKTsKKwkJYnVmZmVyICs9IHNjcmVlbi0+cGl0Y2g7CisJfQorCVNETF9VbmxvY2tTdXJmYWNlKHNjcmVlbik7CisJU0RMX1VwZGF0ZVJlY3Qoc2NyZWVuLCAwLCAwLCAwLCAwKTsKKworCXJldHVybigwKTsKK30KKworU0RMX1N1cmZhY2UgKkxvYWRJY29uU3VyZmFjZShjaGFyICpmaWxlLCBVaW50OCAqKm1hc2twKQoreworCVNETF9TdXJmYWNlICppY29uOworCVVpbnQ4ICAgICAgICpwaXhlbHM7CisJVWludDggICAgICAgKm1hc2s7CisJaW50ICAgICAgICAgIG1sZW4sIGksIGo7CisKKwkqbWFza3AgPSBOVUxMOworCisJLyogTG9hZCB0aGUgaWNvbiBzdXJmYWNlICovCisJaWNvbiA9IFNETF9Mb2FkQk1QKGZpbGUpOworCWlmICggaWNvbiA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGxvYWQgJXM6ICVzXG4iLCBmaWxlLCBTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBDaGVjayB3aWR0aCBhbmQgaGVpZ2h0IAorCWlmICggKGljb24tPnclOCkgIT0gMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJJY29uIHdpZHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IVxuIik7CisJCVNETF9GcmVlU3VyZmFjZShpY29uKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKyovCisgICAgCisgICAgCisJaWYgKCBpY29uLT5mb3JtYXQtPnBhbGV0dGUgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJJY29uIG11c3QgaGF2ZSBhIHBhbGV0dGUhXG4iKTsKKwkJU0RMX0ZyZWVTdXJmYWNlKGljb24pOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogU2V0IHRoZSBjb2xvcmtleSAqLworCVNETF9TZXRDb2xvcktleShpY29uLCBTRExfU1JDQ09MT1JLRVksICooKFVpbnQ4ICopaWNvbi0+cGl4ZWxzKSk7CisKKwkvKiBDcmVhdGUgdGhlIG1hc2sgKi8KKwlwaXhlbHMgPSAoVWludDggKilpY29uLT5waXhlbHM7CisJcHJpbnRmKCJUcmFuc3BhcmVudCBwaXhlbDogKCVkLCVkLCVkKVxuIiwKKwkJCQlpY29uLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1sqcGl4ZWxzXS5yLAorCQkJCWljb24tPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzWypwaXhlbHNdLmcsCisJCQkJaWNvbi0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbKnBpeGVsc10uYik7CisJbWxlbiA9IChpY29uLT53Kmljb24tPmggKyA3KSAvIDg7CisJbWFzayA9IChVaW50OCAqKW1hbGxvYyhtbGVuKTsKKwlpZiAoIG1hc2sgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5IVxuIik7CisJCVNETF9GcmVlU3VyZmFjZShpY29uKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwltZW1zZXQobWFzaywgMCwgbWxlbik7CisJZm9yICggaT0wOyBpIDwgaWNvbi0+aDsgaSsrKQorICAgICAgICBmb3IgKGo9MDsgaiA8IGljb24tPnc7IGorKykgeworICAgICAgICAgICAgaW50IHBpbmRleCA9IGkgKiBpY29uLT5waXRjaCArIGo7CisgICAgICAgICAgICBpbnQgbWluZGV4ID0gaSAqIGljb24tPncgKyBqOworICAgICAgICAgICAgaWYgKCBwaXhlbHNbcGluZGV4XSAhPSAqcGl4ZWxzICkKKyAgICAgICAgICAgICAgICBtYXNrW21pbmRleD4+M10gfD0gMSA8PCAoNyAtIChtaW5kZXggJiA3KSk7CisgICAgICAgIH0KKwkqbWFza3AgPSBtYXNrOworCXJldHVybihpY29uKTsKK30KKwordm9pZCBIb3RLZXlfVG9nZ2xlRnVsbFNjcmVlbih2b2lkKQoreworCVNETF9TdXJmYWNlICpzY3JlZW47CisKKwlzY3JlZW4gPSBTRExfR2V0VmlkZW9TdXJmYWNlKCk7CisJaWYgKCBTRExfV01fVG9nZ2xlRnVsbFNjcmVlbihzY3JlZW4pICkgeworCQlwcmludGYoIlRvZ2dsZWQgZnVsbHNjcmVlbiBtb2RlIC0gbm93ICVzXG4iLAorCQkgICAgKHNjcmVlbi0+ZmxhZ3MmU0RMX0ZVTExTQ1JFRU4pID8gImZ1bGxzY3JlZW4iIDogIndpbmRvd2VkIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJVbmFibGUgdG8gdG9nZ2xlIGZ1bGxzY3JlZW4gbW9kZVxuIik7CisJCXZpZGVvX2ZsYWdzIF49IFNETF9GVUxMU0NSRUVOOworCQlTZXRWaWRlb01vZGUoc2NyZWVuLT53LCBzY3JlZW4tPmgpOworCX0KK30KKwordm9pZCBIb3RLZXlfVG9nZ2xlR3JhYih2b2lkKQoreworCVNETF9HcmFiTW9kZSBtb2RlOworCisJcHJpbnRmKCJDdHJsLUc6IHRvZ2dsaW5nIGlucHV0IGdyYWIhXG4iKTsKKwltb2RlID0gU0RMX1dNX0dyYWJJbnB1dChTRExfR1JBQl9RVUVSWSk7CisJaWYgKCBtb2RlID09IFNETF9HUkFCX09OICkgeworCQlwcmludGYoIkdyYWIgd2FzIG9uXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkdyYWIgd2FzIG9mZlxuIik7CisJfQorCW1vZGUgPSBTRExfV01fR3JhYklucHV0KG1vZGUgPyBTRExfR1JBQl9PRkYgOiBTRExfR1JBQl9PTik7CisJaWYgKCBtb2RlID09IFNETF9HUkFCX09OICkgeworCQlwcmludGYoIkdyYWIgaXMgbm93IG9uXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkdyYWIgaXMgbm93IG9mZlxuIik7CisJfQorfQorCit2b2lkIEhvdEtleV9JY29uaWZ5KHZvaWQpCit7CisJcHJpbnRmKCJDdHJsLVo6IGljb25pZnlpbmcgd2luZG93IVxuIik7CisJU0RMX1dNX0ljb25pZnlXaW5kb3coKTsKK30KKwordm9pZCBIb3RLZXlfUXVpdCh2b2lkKQoreworCVNETF9FdmVudCBldmVudDsKKworCXByaW50ZigiUG9zdGluZyBpbnRlcm5hbCBxdWl0IHJlcXVlc3RcbiIpOworCWV2ZW50LnR5cGUgPSBTRExfVVNFUkVWRU5UOworCVNETF9QdXNoRXZlbnQoJmV2ZW50KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbW9kaWZpZXJzKHZvaWQpCit7CisJaW50IG1vZDsKKwlwcmludGYoIiBtb2RpZmllcnM6Iik7CisJbW9kID0gU0RMX0dldE1vZFN0YXRlKCk7CisJaWYoIW1vZCkgeworCQlwcmludGYoIiAobm9uZSkiKTsKKwkJcmV0dXJuOworCX0KKwlpZihtb2QgJiBLTU9EX0xTSElGVCkKKwkJcHJpbnRmKCIgTFNISUZUIik7CisJaWYobW9kICYgS01PRF9SU0hJRlQpCisJCXByaW50ZigiIFJTSElGVCIpOworCWlmKG1vZCAmIEtNT0RfTENUUkwpCisJCXByaW50ZigiIExDVFJMIik7CisJaWYobW9kICYgS01PRF9SQ1RSTCkKKwkJcHJpbnRmKCIgUkNUUkwiKTsKKwlpZihtb2QgJiBLTU9EX0xBTFQpCisJCXByaW50ZigiIExBTFQiKTsKKwlpZihtb2QgJiBLTU9EX1JBTFQpCisJCXByaW50ZigiIFJBTFQiKTsKKwlpZihtb2QgJiBLTU9EX0xNRVRBKQorCQlwcmludGYoIiBMTUVUQSIpOworCWlmKG1vZCAmIEtNT0RfUk1FVEEpCisJCXByaW50ZigiIFJNRVRBIik7CisJaWYobW9kICYgS01PRF9OVU0pCisJCXByaW50ZigiIE5VTSIpOworCWlmKG1vZCAmIEtNT0RfQ0FQUykKKwkJcHJpbnRmKCIgQ0FQUyIpOworCWlmKG1vZCAmIEtNT0RfTU9ERSkKKwkJcHJpbnRmKCIgTU9ERSIpOworfQorCitzdGF0aWMgdm9pZCBQcmludEtleShjb25zdCBTRExfa2V5c3ltICpzeW0sIGludCBwcmVzc2VkKQoreworCS8qIFByaW50IHRoZSBrZXljb2RlLCBuYW1lIGFuZCBzdGF0ZSAqLworCWlmICggc3ltLT5zeW0gKSB7CisJCXByaW50ZigiS2V5ICVzOiAgJWQtJXMgIiwgcHJlc3NlZCA/ICAicHJlc3NlZCIgOiAicmVsZWFzZWQiLAorCQkJCQlzeW0tPnN5bSwgU0RMX0dldEtleU5hbWUoc3ltLT5zeW0pKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlVua25vd24gS2V5IChzY2FuY29kZSA9ICVkKSAlcyAiLCBzeW0tPnNjYW5jb2RlLAorCQkJCQlwcmVzc2VkID8gICJwcmVzc2VkIiA6ICJyZWxlYXNlZCIpOworCX0KKworCS8qIFByaW50IHRoZSB0cmFuc2xhdGVkIGNoYXJhY3RlciwgaWYgb25lIGV4aXN0cyAqLworCWlmICggc3ltLT51bmljb2RlICkgeworCQkvKiBJcyBpdCBhIGNvbnRyb2wtY2hhcmFjdGVyPyAqLworCQlpZiAoIHN5bS0+dW5pY29kZSA8ICcgJyApIHsKKwkJCXByaW50ZigiICheJWMpIiwgc3ltLT51bmljb2RlKydAJyk7CisJCX0gZWxzZSB7CisjaWZkZWYgVU5JQ09ERQorCQkJcHJpbnRmKCIgKCVjKSIsIHN5bS0+dW5pY29kZSk7CisjZWxzZQorCQkJLyogVGhpcyBpcyBhIExhdGluLTEgcHJvZ3JhbSwgc28gb25seSBzaG93IDgtYml0cyAqLworCQkJaWYgKCAhKHN5bS0+dW5pY29kZSAmIDB4RkYwMCkgKQorCQkJCXByaW50ZigiICglYykiLCBzeW0tPnVuaWNvZGUpOworCQkJZWxzZQorCQkJCXByaW50ZigiICgweCVYKSIsIHN5bS0+dW5pY29kZSk7CisjZW5kaWYKKwkJfQorCX0KKwlwcmludF9tb2RpZmllcnMoKTsKKwlwcmludGYoIlxuIik7Cit9CisKK2ludCBTRExDQUxMIEZpbHRlckV2ZW50cyhjb25zdCBTRExfRXZlbnQgKmV2ZW50KQoreworCXN0YXRpYyBpbnQgcmVhbGx5cXVpdCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CisKKwkJY2FzZSBTRExfQUNUSVZFRVZFTlQ6CisJCQkvKiBTZWUgd2hhdCBoYXBwZW5lZCAqLworCQkJcHJpbnRmKCJBcHAgJXMgIiwKKwkJCQlldmVudC0+YWN0aXZlLmdhaW4gPyAiZ2FpbmVkIiA6ICJsb3N0Iik7CisJCQlpZiAoIGV2ZW50LT5hY3RpdmUuc3RhdGUgJiBTRExfQVBQQUNUSVZFICkKKwkJCQlwcmludGYoImFjdGl2ZSAiKTsKKwkJCWlmICggZXZlbnQtPmFjdGl2ZS5zdGF0ZSAmIFNETF9BUFBJTlBVVEZPQ1VTICkKKwkJCQlwcmludGYoImlucHV0ICIpOworCQkJaWYgKCBldmVudC0+YWN0aXZlLnN0YXRlICYgU0RMX0FQUE1PVVNFRk9DVVMgKQorCQkJCXByaW50ZigibW91c2UgIik7CisJCQlwcmludGYoImZvY3VzXG4iKTsKKworCQkJLyogU2VlIGlmIHdlIGFyZSBpY29uaWZpZWQgb3IgcmVzdG9yZWQgKi8KKwkJCWlmICggZXZlbnQtPmFjdGl2ZS5zdGF0ZSAmIFNETF9BUFBBQ1RJVkUgKSB7CisJCQkJcHJpbnRmKCJBcHAgaGFzIGJlZW4gJXNcbiIsCisJCQkJCWV2ZW50LT5hY3RpdmUuZ2FpbiA/CisJCQkJCQkgInJlc3RvcmVkIiA6ICJpY29uaWZpZWQiKTsKKwkJCX0KKwkJCXJldHVybigwKTsKKworCQkvKiBXZSB3YW50IHRvIHRvZ2dsZSB2aXNpYmlsaXR5IG9uIGJ1dHRvbnByZXNzICovCisJCWNhc2UgU0RMX01PVVNFQlVUVE9ORE9XTjoKKwkJY2FzZSBTRExfTU9VU0VCVVRUT05VUDoKKwkJCWlmICggZXZlbnQtPmJ1dHRvbi5zdGF0ZSA9PSBTRExfUFJFU1NFRCApIHsKKwkJCQl2aXNpYmxlID0gIXZpc2libGU7CisJCQkJU0RMX1Nob3dDdXJzb3IodmlzaWJsZSk7CisJCQl9CisJCQlwcmludGYoIk1vdXNlIGJ1dHRvbiAlZCBoYXMgYmVlbiAlc1xuIiwKKwkJCQlldmVudC0+YnV0dG9uLmJ1dHRvbiwKKwkJCQkoZXZlbnQtPmJ1dHRvbi5zdGF0ZSA9PSBTRExfUFJFU1NFRCkgPworCQkJCQkJInByZXNzZWQiIDogInJlbGVhc2VkIik7CisJCQlyZXR1cm4oMCk7CisKKwkJLyogU2hvdyByZWxhdGl2ZSBtb3VzZSBtb3Rpb24gKi8KKwkJY2FzZSBTRExfTU9VU0VNT1RJT046CisjaWYgMAorCQkJcHJpbnRmKCJNb3VzZSBtb3Rpb246IHslZCwlZH0gKCVkLCVkKVxuIiwKKwkJCQlldmVudC0+bW90aW9uLngsIGV2ZW50LT5tb3Rpb24ueSwKKwkJCQlldmVudC0+bW90aW9uLnhyZWwsIGV2ZW50LT5tb3Rpb24ueXJlbCk7CisjZW5kaWYKKwkJCXJldHVybigwKTsKKworCQljYXNlIFNETF9LRVlET1dOOgorCQkJUHJpbnRLZXkoJmV2ZW50LT5rZXkua2V5c3ltLCAxKTsKKwkJCWlmICggZXZlbnQtPmtleS5rZXlzeW0uc3ltID09IFNETEtfRVNDQVBFICkgeworCQkJCUhvdEtleV9RdWl0KCk7CisJCQl9CisJCQlpZiAoIChldmVudC0+a2V5LmtleXN5bS5zeW0gPT0gU0RMS19nKSAmJgorCQkJICAgICAoZXZlbnQtPmtleS5rZXlzeW0ubW9kICYgS01PRF9DVFJMKSApIHsKKwkJCQlIb3RLZXlfVG9nZ2xlR3JhYigpOworCQkJfQorCQkJaWYgKCAoZXZlbnQtPmtleS5rZXlzeW0uc3ltID09IFNETEtfeikgJiYKKwkJCSAgICAgKGV2ZW50LT5rZXkua2V5c3ltLm1vZCAmIEtNT0RfQ1RSTCkgKSB7CisJCQkJSG90S2V5X0ljb25pZnkoKTsKKwkJCX0KKwkJCWlmICggKGV2ZW50LT5rZXkua2V5c3ltLnN5bSA9PSBTRExLX1JFVFVSTikgJiYKKwkJCSAgICAgKGV2ZW50LT5rZXkua2V5c3ltLm1vZCAmIEtNT0RfQUxUKSApIHsKKwkJCQlIb3RLZXlfVG9nZ2xlRnVsbFNjcmVlbigpOworCQkJfQorCQkJcmV0dXJuKDApOworCisJCWNhc2UgU0RMX0tFWVVQOgorCQkJUHJpbnRLZXkoJmV2ZW50LT5rZXkua2V5c3ltLCAwKTsKKwkJCXJldHVybigwKTsKKworCQkvKiBQYXNzIHRoZSB2aWRlbyByZXNpemUgZXZlbnQgdGhyb3VnaCAuLiAqLworCQljYXNlIFNETF9WSURFT1JFU0laRToKKwkJCXJldHVybigxKTsKKworCQkvKiBUaGlzIGlzIGltcG9ydGFudCEgIFF1ZXVlIGl0IGlmIHdlIHdhbnQgdG8gcXVpdC4gKi8KKwkJY2FzZSBTRExfUVVJVDoKKwkJCWlmICggISByZWFsbHlxdWl0ICkgeworCQkJCXJlYWxseXF1aXQgPSAxOworCQkJCXByaW50ZigiUXVpdCByZXF1ZXN0ZWRcbiIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCXByaW50ZigiUXVpdCBkZW1hbmRlZFxuIik7CisJCQlyZXR1cm4oMSk7CisKKwkJLyogVGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGV2ZW50cyBxdWV1ZWQgZGlyZWN0bHkKKwkJICAgdG8gdGhlIGV2ZW50IHF1ZXVlIGFyZSBub3QgZmlsdGVyZWQuCisJCSAqLworCQljYXNlIFNETF9VU0VSRVZFTlQ6CisJCQlyZXR1cm4oMSk7CisKKwkJLyogRHJvcCBhbGwgb3RoZXIgZXZlbnRzICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oMCk7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCVNETF9FdmVudCBldmVudDsKKwljaGFyICp0aXRsZTsKKwlTRExfU3VyZmFjZSAqaWNvbjsKKwlVaW50OCAqaWNvbl9tYXNrOworCWludCBwYXJzZWQ7CisJaW50IHcsIGg7CisKKwlpZiAoIFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkNvdWxkbid0IGluaXRpYWxpemUgU0RMOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworCQlyZXR1cm4oMSk7CisJfQorCisJLyogQ2hlY2sgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLworCXcgPSA2NDA7CisJaCA9IDQ4MDsKKwl2aWRlb19icHAgPSA4OworCXZpZGVvX2ZsYWdzID0gU0RMX1NXU1VSRkFDRTsKKwlwYXJzZWQgPSAxOworCXdoaWxlICggcGFyc2VkICkgeworCQlpZiAoIChhcmdjID49IDIpICYmIChzdHJjbXAoYXJndlsxXSwgIi1mdWxsc2NyZWVuIikgPT0gMCkgKSB7CisJCQl2aWRlb19mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKwkJCWFyZ2MgLT0gMTsKKwkJCWFyZ3YgKz0gMTsKKwkJfSBlbHNlCisJCWlmICggKGFyZ2MgPj0gMikgJiYgKHN0cmNtcChhcmd2WzFdLCAiLXJlc2l6ZSIpID09IDApICkgeworCQkJdmlkZW9fZmxhZ3MgfD0gU0RMX1JFU0laQUJMRTsKKwkJCWFyZ2MgLT0gMTsKKwkJCWFyZ3YgKz0gMTsKKwkJfSBlbHNlCisJCWlmICggKGFyZ2MgPj0gMikgJiYgKHN0cmNtcChhcmd2WzFdLCAiLW5vZnJhbWUiKSA9PSAwKSApIHsKKwkJCXZpZGVvX2ZsYWdzIHw9IFNETF9OT0ZSQU1FOworCQkJYXJnYyAtPSAxOworCQkJYXJndiArPSAxOworCQl9IGVsc2UKKwkJaWYgKCAoYXJnYyA+PSAzKSAmJiAoc3RyY21wKGFyZ3ZbMV0sICItd2lkdGgiKSA9PSAwKSApIHsKKwkJCXcgPSBhdG9pKGFyZ3ZbMl0pOworCQkJYXJnYyAtPSAyOworCQkJYXJndiArPSAyOworCQl9IGVsc2UKKwkJaWYgKCAoYXJnYyA+PSAzKSAmJiAoc3RyY21wKGFyZ3ZbMV0sICItaGVpZ2h0IikgPT0gMCkgKSB7CisJCQloID0gYXRvaShhcmd2WzJdKTsKKwkJCWFyZ2MgLT0gMjsKKwkJCWFyZ3YgKz0gMjsKKwkJfSBlbHNlCisJCWlmICggKGFyZ2MgPj0gMykgJiYgKHN0cmNtcChhcmd2WzFdLCAiLWJwcCIpID09IDApICkgeworCQkJdmlkZW9fYnBwID0gYXRvaShhcmd2WzJdKTsKKwkJCWFyZ2MgLT0gMjsKKwkJCWFyZ3YgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCXBhcnNlZCA9IDA7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIGljb24gLS0gdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBmaXJzdCBtb2RlIHNldCAqLworCWljb24gPSBMb2FkSWNvblN1cmZhY2UoImljb24uYm1wIiwgJmljb25fbWFzayk7CisJaWYgKCBpY29uICE9IE5VTEwgKSB7CisJCVNETF9XTV9TZXRJY29uKGljb24sIGljb25fbWFzayk7CisJfQorCWlmICggaWNvbl9tYXNrICE9IE5VTEwgKQorCQlmcmVlKGljb25fbWFzayk7CisKKwkvKiBTZXQgdGhlIHRpdGxlIGJhciAqLworCWlmICggYXJndlsxXSA9PSBOVUxMICkKKwkJdGl0bGUgPSAiVGVzdGluZyAgMS4uIDIuLiAzLi4uIjsKKwllbHNlCisJCXRpdGxlID0gYXJndlsxXTsKKwlTRExfV01fU2V0Q2FwdGlvbih0aXRsZSwgInRlc3R3bSIpOworCisJLyogU2VlIGlmIGl0J3MgcmVhbGx5IHNldCAqLworCVNETF9XTV9HZXRDYXB0aW9uKCZ0aXRsZSwgTlVMTCk7CisJaWYgKCB0aXRsZSApCisJCXByaW50ZigiVGl0bGUgd2FzIHNldCB0bzogJXNcbiIsIHRpdGxlKTsKKwllbHNlCisJCXByaW50ZigiTm8gd2luZG93IHRpdGxlIHdhcyBzZXQhXG4iKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRpc3BsYXkgKi8KKwlpZiAoIFNldFZpZGVvTW9kZSh3LCBoKSA8IDAgKSB7CisJCXF1aXQoMSk7CisJfQorCisJLyogU2V0IGFuIGV2ZW50IGZpbHRlciB0aGF0IGRpc2NhcmRzIGV2ZXJ5dGhpbmcgYnV0IFFVSVQgKi8KKwlTRExfU2V0RXZlbnRGaWx0ZXIoRmlsdGVyRXZlbnRzKTsKKworCS8qIExvb3AsIHdhaXRpbmcgZm9yIFFVSVQgKi8KKwl3aGlsZSAoIFNETF9XYWl0RXZlbnQoJmV2ZW50KSApIHsKKwkJc3dpdGNoIChldmVudC50eXBlKSB7CisJCQljYXNlIFNETF9WSURFT1JFU0laRToKKwkJCQlwcmludGYoIkdvdCBhIHJlc2l6ZSBldmVudDogJWR4JWRcbiIsCisJCQkJICAgICAgIGV2ZW50LnJlc2l6ZS53LCBldmVudC5yZXNpemUuaCk7CisJCQkJU2V0VmlkZW9Nb2RlKGV2ZW50LnJlc2l6ZS53LCBldmVudC5yZXNpemUuaCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNETF9VU0VSRVZFTlQ6CisJCQkJcHJpbnRmKCJIYW5kbGluZyBpbnRlcm5hbCBxdWl0IHJlcXVlc3RcbiIpOworCQkJCS8qIEZhbGwgdGhyb3VnaCB0byB0aGUgcXVpdCBoYW5kbGVyICovCisJCQljYXNlIFNETF9RVUlUOgorCQkJCXByaW50ZigiQnllIGJ5ZS4uXG4iKTsKKwkJCQlxdWl0KDApOworCQkJZGVmYXVsdDoKKwkJCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCQlwcmludGYoIldhcm5pbmc6IEV2ZW50ICVkIHdhc24ndCBmaWx0ZXJlZFxuIiwKKwkJCQkJCQkJZXZlbnQudHlwZSk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcHJpbnRmKCJTRExfV2FpdEV2ZW50KCkgZXJyb3I6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJU0RMX1F1aXQoKTsKKwlyZXR1cm4oMjU1KTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3RocmVhZHdpbi5jIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdGhyZWFkd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwNGIzMAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3RocmVhZHdpbi5jCkBAIC0wLDAgKzEsMzM4IEBACisKKy8qIFRlc3Qgb3V0IHRoZSBtdWx0aS10aHJlYWRlZCBldmVudCBoYW5kbGluZyBmdW5jdGlvbnMgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTREwuaCIKKyNpbmNsdWRlICJTRExfdGhyZWFkLmgiCisKKy8qIEFyZSB3ZSBkb25lIHlldD8gKi8KK3N0YXRpYyBpbnQgZG9uZSA9IDA7CisKKy8qIElzIHRoZSBjdXJzb3IgdmlzaWJsZT8gKi8KK3N0YXRpYyBpbnQgdmlzaWJsZSA9IDE7CisKKy8qIENhbGwgdGhpcyBpbnN0ZWFkIG9mIGV4aXQoKSwgc28gd2UgY2FuIGNsZWFuIHVwIFNETDogYXRleGl0KCkgaXMgZXZpbC4gKi8KK3N0YXRpYyB2b2lkIHF1aXQoaW50IHJjKQoreworCVNETF9RdWl0KCk7CisJZXhpdChyYyk7Cit9CisKK1NETF9TdXJmYWNlICpMb2FkSWNvblN1cmZhY2UoY2hhciAqZmlsZSwgVWludDggKiptYXNrcCkKK3sKKwlTRExfU3VyZmFjZSAqaWNvbjsKKwlVaW50OCAgICAgICAqcGl4ZWxzOworCVVpbnQ4ICAgICAgICptYXNrOworCWludCAgICAgICAgICBtbGVuLCBpOworCisJKm1hc2twID0gTlVMTDsKKworCS8qIExvYWQgdGhlIGljb24gc3VyZmFjZSAqLworCWljb24gPSBTRExfTG9hZEJNUChmaWxlKTsKKwlpZiAoIGljb24gPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBsb2FkICVzOiAlc1xuIiwgZmlsZSwgU0RMX0dldEVycm9yKCkpOworCQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogQ2hlY2sgd2lkdGggYW5kIGhlaWdodCAqLworCWlmICggKGljb24tPnclOCkgIT0gMCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJJY29uIHdpZHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IVxuIik7CisJCVNETF9GcmVlU3VyZmFjZShpY29uKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwlpZiAoIGljb24tPmZvcm1hdC0+cGFsZXR0ZSA9PSBOVUxMICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkljb24gbXVzdCBoYXZlIGEgcGFsZXR0ZSFcbiIpOworCQlTRExfRnJlZVN1cmZhY2UoaWNvbik7CisJCXJldHVybihOVUxMKTsKKwl9CisKKwkvKiBTZXQgdGhlIGNvbG9ya2V5ICovCisJU0RMX1NldENvbG9yS2V5KGljb24sIFNETF9TUkNDT0xPUktFWSwgKigoVWludDggKilpY29uLT5waXhlbHMpKTsKKworCS8qIENyZWF0ZSB0aGUgbWFzayAqLworCXBpeGVscyA9IChVaW50OCAqKWljb24tPnBpeGVsczsKKwlwcmludGYoIlRyYW5zcGFyZW50IHBpeGVsOiAoJWQsJWQsJWQpXG4iLAorCQkJCWljb24tPmZvcm1hdC0+cGFsZXR0ZS0+Y29sb3JzWypwaXhlbHNdLnIsCisJCQkJaWNvbi0+Zm9ybWF0LT5wYWxldHRlLT5jb2xvcnNbKnBpeGVsc10uZywKKwkJCQlpY29uLT5mb3JtYXQtPnBhbGV0dGUtPmNvbG9yc1sqcGl4ZWxzXS5iKTsKKwltbGVuID0gaWNvbi0+dyppY29uLT5oOworCW1hc2sgPSAoVWludDggKiltYWxsb2MobWxlbi84KTsKKwlpZiAoIG1hc2sgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5IVxuIik7CisJCVNETF9GcmVlU3VyZmFjZShpY29uKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKwltZW1zZXQobWFzaywgMCwgbWxlbi84KTsKKwlmb3IgKCBpPTA7IGk8bWxlbjsgKSB7CisJCWlmICggcGl4ZWxzW2ldICE9ICpwaXhlbHMgKQorCQkJbWFza1tpLzhdIHw9IDB4MDE7CisJCSsraTsKKwkJaWYgKCAoaSU4KSAhPSAwICkKKwkJCW1hc2tbaS84XSA8PD0gMTsKKwl9CisJKm1hc2twID0gbWFzazsKKwlyZXR1cm4oaWNvbik7Cit9CisKK2ludCBTRExDQUxMIEZpbHRlckV2ZW50cyhjb25zdCBTRExfRXZlbnQgKmV2ZW50KQoreworCXN0YXRpYyBpbnQgcmVhbGx5cXVpdCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CisKKwkJY2FzZSBTRExfQUNUSVZFRVZFTlQ6CisJCQkvKiBTZWUgd2hhdCBoYXBwZW5lZCAqLworCQkJcHJpbnRmKCJBcHAgJXMgIiwKKwkJCQlldmVudC0+YWN0aXZlLmdhaW4gPyAiZ2FpbmVkIiA6ICJsb3N0Iik7CisJCQlpZiAoIGV2ZW50LT5hY3RpdmUuc3RhdGUgJiBTRExfQVBQQUNUSVZFICkKKwkJCQlwcmludGYoImFjdGl2ZSAiKTsKKwkJCWlmICggZXZlbnQtPmFjdGl2ZS5zdGF0ZSAmIFNETF9BUFBNT1VTRUZPQ1VTICkKKwkJCQlwcmludGYoIm1vdXNlICIpOworCQkJaWYgKCBldmVudC0+YWN0aXZlLnN0YXRlICYgU0RMX0FQUElOUFVURk9DVVMgKQorCQkJCXByaW50ZigiaW5wdXQgIik7CisJCQlwcmludGYoImZvY3VzXG4iKTsKKworCQkJLyogU2VlIGlmIHdlIGFyZSBpY29uaWZpZWQgb3IgcmVzdG9yZWQgKi8KKwkJCWlmICggZXZlbnQtPmFjdGl2ZS5zdGF0ZSAmIFNETF9BUFBBQ1RJVkUgKSB7CisJCQkJcHJpbnRmKCJBcHAgaGFzIGJlZW4gJXNcbiIsCisJCQkJCWV2ZW50LT5hY3RpdmUuZ2FpbiA/CisJCQkJCQkgInJlc3RvcmVkIiA6ICJpY29uaWZpZWQiKTsKKwkJCX0KKwkJCXJldHVybigwKTsKKworCQkvKiBUaGlzIGlzIGltcG9ydGFudCEgIFF1ZXVlIGl0IGlmIHdlIHdhbnQgdG8gcXVpdC4gKi8KKwkJY2FzZSBTRExfUVVJVDoKKwkJCWlmICggISByZWFsbHlxdWl0ICkgeworCQkJCXJlYWxseXF1aXQgPSAxOworCQkJCXByaW50ZigiUXVpdCByZXF1ZXN0ZWRcbiIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCXByaW50ZigiUXVpdCBkZW1hbmRlZFxuIik7CisJCQlyZXR1cm4oMSk7CisKKwkJLyogTW91c2UgYW5kIGtleWJvYXJkIGV2ZW50cyBnbyB0byB0aHJlYWRzICovCisJCWNhc2UgU0RMX01PVVNFTU9USU9OOgorCQljYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisJCWNhc2UgU0RMX01PVVNFQlVUVE9OVVA6CisJCWNhc2UgU0RMX0tFWURPV046CisJCWNhc2UgU0RMX0tFWVVQOgorCQkJcmV0dXJuKDEpOworCisJCS8qIERyb3AgYWxsIG90aGVyIGV2ZW50cyAqLworCQlkZWZhdWx0OgorCQkJcmV0dXJuKDApOworCX0KK30KKworaW50IFNETENBTEwgSGFuZGxlTW91c2Uodm9pZCAqdW51c2VkKQoreworCVNETF9FdmVudCBldmVudHNbMTBdOworCWludCBpLCBmb3VuZDsKKwlVaW50MzIgbWFzazsKKworCS8qIEhhbmRsZSBtb3VzZSBldmVudHMgaGVyZSAqLworCW1hc2sgPSAoU0RMX01PVVNFTU9USU9OTUFTS3xTRExfTU9VU0VCVVRUT05ET1dOTUFTS3xTRExfTU9VU0VCVVRUT05VUE1BU0spOworCXdoaWxlICggISBkb25lICkgeworCQlmb3VuZCA9IFNETF9QZWVwRXZlbnRzKGV2ZW50cywgMTAsIFNETF9HRVRFVkVOVCwgbWFzayk7CisJCWZvciAoIGk9MDsgaTxmb3VuZDsgKytpICkgeworCQkJc3dpdGNoKGV2ZW50c1tpXS50eXBlKSB7CisJCQkJLyogV2Ugd2FudCB0byB0b2dnbGUgdmlzaWJpbGl0eSBvbiBidXR0b25wcmVzcyAqLworCQkJCWNhc2UgU0RMX01PVVNFQlVUVE9ORE9XTjoKKwkJCQljYXNlIFNETF9NT1VTRUJVVFRPTlVQOgorCQkJCQlpZiAoIGV2ZW50c1tpXS5idXR0b24uc3RhdGUgPT0gU0RMX1BSRVNTRUQgKSB7CisJCQkJCQl2aXNpYmxlID0gIXZpc2libGU7CisJCQkJCQlTRExfU2hvd0N1cnNvcih2aXNpYmxlKTsKKwkJCQkJfQorCQkJCQlwcmludGYoIk1vdXNlIGJ1dHRvbiAlZCBoYXMgYmVlbiAlc1xuIiwKKwkJCQkJCWV2ZW50c1tpXS5idXR0b24uYnV0dG9uLAorCQkJCQkJKGV2ZW50c1tpXS5idXR0b24uc3RhdGUgPT0gU0RMX1BSRVNTRUQpID8KKwkJCQkJCSJwcmVzc2VkIiA6ICJyZWxlYXNlZCIpOworCQkJCQlicmVhazsKKwkJCQkvKiBTaG93IHJlbGF0aXZlIG1vdXNlIG1vdGlvbiAqLworCQkJCWNhc2UgU0RMX01PVVNFTU9USU9OOgorCQkJCQlwcmludGYoIk1vdXNlIHJlbGF0aXZlIG1vdGlvbjogeyVkLCVkfVxuIiwKKwkJCQkJCQlldmVudHNbaV0ubW90aW9uLnhyZWwsIGV2ZW50c1tpXS5tb3Rpb24ueXJlbCk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIEdpdmUgdXAgc29tZSBDUFUgdG8gYWxsb3cgZXZlbnRzIHRvIGFycml2ZSAqLworCQlTRExfRGVsYXkoMjApOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK2ludCBTRExDQUxMIEhhbmRsZUtleWJvYXJkKHZvaWQgKnVudXNlZCkKK3sKKwlTRExfRXZlbnQgZXZlbnRzWzEwXTsKKwlpbnQgaSwgZm91bmQ7CisJVWludDMyIG1hc2s7CisKKwkvKiBIYW5kbGUgbW91c2UgZXZlbnRzIGhlcmUgKi8KKwltYXNrID0gKFNETF9LRVlET1dOTUFTS3xTRExfS0VZVVBNQVNLKTsKKwl3aGlsZSAoICEgZG9uZSApIHsKKwkJZm91bmQgPSBTRExfUGVlcEV2ZW50cyhldmVudHMsIDEwLCBTRExfR0VURVZFTlQsIG1hc2spOworCQlmb3IgKCBpPTA7IGk8Zm91bmQ7ICsraSApIHsKKwkJCXN3aXRjaChldmVudHNbaV0udHlwZSkgeworCQkJICAgIC8qIFdlIHdhbnQgdG8gdG9nZ2xlIHZpc2liaWxpdHkgb24gYnV0dG9ucHJlc3MgKi8KKwkJCSAgICBjYXNlIFNETF9LRVlET1dOOgorCQkJICAgIGNhc2UgU0RMX0tFWVVQOgorCQkJICAgIAlwcmludGYoIktleSAnJWMnIChrZXlzeW09PSVkKSBoYXMgYmVlbiAlc1xuIiwKKwkJCQkJCWV2ZW50c1tpXS5rZXkua2V5c3ltLnVuaWNvZGUsCisJCQkJCQkoaW50KSBldmVudHNbaV0ua2V5LmtleXN5bS5zeW0sCisJCQkJCShldmVudHNbaV0ua2V5LnN0YXRlID09IFNETF9QUkVTU0VEKSA/CisJCQkJCQkicHJlc3NlZCIgOiAicmVsZWFzZWQiKTsKKworCQkJICAgIAkvKiBBbGxvdyBoaXR0aW5nIDxFU0M+IHRvIHF1aXQgdGhlIGFwcCAqLworCQkJICAgIAlpZiAoIGV2ZW50c1tpXS5rZXkua2V5c3ltLnN5bSA9PSBTRExLX0VTQ0FQRSApIHsKKwkJCSAgICAJCWRvbmUgPSAxOworCQkJICAgIAl9CisKKwkJCQkJLyogc2tpcCBldmVudHMgbm93IHRoYXQgYXJlbid0IEtFWVVQcy4uLiAqLworCQkJCQlpZiAoZXZlbnRzW2ldLmtleS5zdGF0ZSA9PSBTRExfUFJFU1NFRCkKKwkJCQkJCWJyZWFrOworCisJCQkgICAgCWlmICggZXZlbnRzW2ldLmtleS5rZXlzeW0uc3ltID09IFNETEtfZiApIHsKKwkJCQkJCWludCByYyA9IDA7CisJCQkJCQlwcmludGYoImF0dGVtcHRpbmcgdG8gdG9nZ2xlIGZ1bGxzY3JlZW4uLi5cbiIpOworCQkJCQkJcmMgPSBTRExfV01fVG9nZ2xlRnVsbFNjcmVlbihTRExfR2V0VmlkZW9TdXJmYWNlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTRExfV01fVG9nZ2xlRnVsbFNjcmVlbiByZXR1cm5lZCAlZC5cbiIsIHJjKTsKKwkJCSAgICAJfQorCisJCQkgICAgCWlmICggZXZlbnRzW2ldLmtleS5rZXlzeW0uc3ltID09IFNETEtfZyApIHsKKwkJCQkJCVNETF9HcmFiTW9kZSBtOworCQkJCQkJbSA9IFNETF9XTV9HcmFiSW5wdXQoU0RMX0dSQUJfUVVFUlkpID09IFNETF9HUkFCX09OID8KKwkJCQkJCQkJU0RMX0dSQUJfT0ZGIDogU0RMX0dSQUJfT047CisJCQkJCQlwcmludGYoImF0dGVtcHRpbmcgdG8gdG9nZ2xlIGlucHV0IGdyYWIgdG8gJXMuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPT0gU0RMX0dSQUJfT04gPyAiT04iIDogIk9GRiIpOworICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1dNX0dyYWJJbnB1dChtKTsKKwkJCQkJCXByaW50ZigiYXR0ZW1wdCBmaW5pc2hlZC5cbiIpOworCQkJICAgIAl9CisKKwkJCSAgICAJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogR2l2ZSB1cCBzb21lIENQVSB0byBhbGxvdyBldmVudHMgdG8gYXJyaXZlICovCisJCVNETF9EZWxheSgyMCk7CisJfQorCXJldHVybigwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlTRExfU3VyZmFjZSAqc2NyZWVuOworCVNETF9TdXJmYWNlICppY29uOworCVVpbnQ4ICppY29uX21hc2s7CisJaW50IGksIHBhcnNlZDsKKwlVaW50OCAqYnVmZmVyOworCVNETF9Db2xvciBwYWxldHRlWzI1Nl07CisJVWludDMyIGluaXRfZmxhZ3M7CisJVWludDggIHZpZGVvX2JwcDsKKwlVaW50MzIgdmlkZW9fZmxhZ3M7CisJU0RMX1RocmVhZCAqbW91c2VfdGhyZWFkOworCVNETF9UaHJlYWQgKmtleWJkX3RocmVhZDsKKworCS8qIFNldCB0aGUgb3B0aW9ucywgYmFzZWQgb24gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLworCWluaXRfZmxhZ3MgPSBTRExfSU5JVF9WSURFTzsKKwl2aWRlb19icHAgPSA4OworCXZpZGVvX2ZsYWdzID0gU0RMX1NXU1VSRkFDRTsKKwlwYXJzZWQgPSAxOworCXdoaWxlICggcGFyc2VkICkgeworCQkvKiBJZiB0aGUgdGhyZWFkZWQgb3B0aW9uIGlzIGVuYWJsZWQsIGFuZCB0aGUgU0RMIGxpYnJhcnkgaGFzbid0CisJCSAgIGJlZW4gY29tcGlsZWQgd2l0aCB0aHJlYWRlZCBldmVudHMgZW5hYmxlZCwgdGhlbiB0aGUgbW91c2UgYW5kCisJCSAgIGtleWJvYXJkIHdvbid0IHJlc3BvbmQuCisJCSAqLworCQlpZiAoIChhcmdjID49IDIpICYmIChzdHJjbXAoYXJndlsxXSwgIi10aHJlYWRlZCIpID09IDApICkgeworCQkJaW5pdF9mbGFncyB8PSBTRExfSU5JVF9FVkVOVFRIUkVBRDsKKwkJCWFyZ2MgLT0gMTsKKwkJCWFyZ3YgKz0gMTsKKwkJCXByaW50ZigiUnVubmluZyB3aXRoIHRocmVhZGVkIGV2ZW50c1xuIik7CisJCX0gZWxzZQorCQlpZiAoIChhcmdjID49IDIpICYmIChzdHJjbXAoYXJndlsxXSwgIi1mdWxsc2NyZWVuIikgPT0gMCkgKSB7CisJCQl2aWRlb19mbGFncyB8PSBTRExfRlVMTFNDUkVFTjsKKwkJCWFyZ2MgLT0gMTsKKwkJCWFyZ3YgKz0gMTsKKwkJfSBlbHNlCisJCWlmICggKGFyZ2MgPj0gMykgJiYgKHN0cmNtcChhcmd2WzFdLCAiLWJwcCIpID09IDApICkgeworCQkJdmlkZW9fYnBwID0gYXRvaShhcmd2WzJdKTsKKwkJCWFyZ2MgLT0gMjsKKwkJCWFyZ3YgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCXBhcnNlZCA9IDA7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIFNETCB3aXRoIHRoZSByZXF1ZXN0ZWQgZmxhZ3MgKi8KKwlpZiAoIFNETF9Jbml0KGluaXRfZmxhZ3MpIDwgMCApIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBTZXQgdGhlIGljb24gLS0gdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBmaXJzdCBtb2RlIHNldCAqLworCWljb24gPSBMb2FkSWNvblN1cmZhY2UoImljb24uYm1wIiwgJmljb25fbWFzayk7CisJaWYgKCBpY29uICE9IE5VTEwgKSB7CisJCVNETF9XTV9TZXRJY29uKGljb24sIGljb25fbWFzayk7CisJfQorCWlmICggaWNvbl9tYXNrICE9IE5VTEwgKQorCQlmcmVlKGljb25fbWFzayk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkaXNwbGF5ICovCisJc2NyZWVuID0gU0RMX1NldFZpZGVvTW9kZSg2NDAsIDQ4MCwgdmlkZW9fYnBwLCB2aWRlb19mbGFncyk7CisJaWYgKCAgc2NyZWVuID09IE5VTEwgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgc2V0IDY0MHg0ODB4JWQgdmlkZW8gbW9kZTogJXNcbiIsCisJCQkJCQl2aWRlb19icHAsIFNETF9HZXRFcnJvcigpKTsKKwkJcXVpdCgxKTsKKwl9CisJcHJpbnRmKCJSdW5uaW5nIGluICVzIG1vZGVcbiIsIHNjcmVlbi0+ZmxhZ3MgJiBTRExfRlVMTFNDUkVFTiA/CisJCQkJCQkiZnVsbHNjcmVlbiIgOiAid2luZG93ZWQiKTsKKworCS8qIEVuYWJsZSBwcmludGFibGUgY2hhcmFjdGVycyAqLworCVNETF9FbmFibGVVTklDT0RFKDEpOworCisJLyogU2V0IGFuIGV2ZW50IGZpbHRlciB0aGF0IGRpc2NhcmRzIGV2ZXJ5dGhpbmcgYnV0IFFVSVQgKi8KKwlTRExfU2V0RXZlbnRGaWx0ZXIoRmlsdGVyRXZlbnRzKTsKKworCS8qIENyZWF0ZSB0aGUgZXZlbnQgaGFuZGxpbmcgdGhyZWFkcyAqLworCW1vdXNlX3RocmVhZCA9IFNETF9DcmVhdGVUaHJlYWQoSGFuZGxlTW91c2UsIE5VTEwpOworCWtleWJkX3RocmVhZCA9IFNETF9DcmVhdGVUaHJlYWQoSGFuZGxlS2V5Ym9hcmQsIE5VTEwpOworCisJLyogU2V0IHRoZSBzdXJmYWNlIHBpeGVscyBhbmQgcmVmcmVzaCEgKi8KKwlmb3IgKCBpPTA7IGk8MjU2OyArK2kgKSB7CisJCXBhbGV0dGVbaV0uciA9IDI1NS1pOworCQlwYWxldHRlW2ldLmcgPSAyNTUtaTsKKwkJcGFsZXR0ZVtpXS5iID0gMjU1LWk7CisJfQorCVNETF9TZXRDb2xvcnMoc2NyZWVuLCBwYWxldHRlLCAwLCAyNTYpOworCWlmICggU0RMX0xvY2tTdXJmYWNlKHNjcmVlbikgPCAwICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGxvY2sgZGlzcGxheSBzdXJmYWNlOiAlc1xuIiwKKwkJCQkJCQlTRExfR2V0RXJyb3IoKSk7CisJCXF1aXQoMik7CisJfQorCWJ1ZmZlciA9IChVaW50OCAqKXNjcmVlbi0+cGl4ZWxzOworCWZvciAoIGk9MDsgaTxzY3JlZW4tPmg7ICsraSApIHsKKwkJbWVtc2V0KGJ1ZmZlciwoaSoyNTUpL3NjcmVlbi0+aCwKKwkJCQlzY3JlZW4tPncqc2NyZWVuLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWwpOworCQlidWZmZXIgKz0gc2NyZWVuLT5waXRjaDsKKwl9CisJU0RMX1VubG9ja1N1cmZhY2Uoc2NyZWVuKTsKKwlTRExfVXBkYXRlUmVjdChzY3JlZW4sIDAsIDAsIDAsIDApOworCisJLyogTG9vcCwgd2FpdGluZyBmb3IgUVVJVCAqLworCXdoaWxlICggISBkb25lICkgeworCQlpZiAoICEgKGluaXRfZmxhZ3MgJiBTRExfSU5JVF9FVkVOVFRIUkVBRCkgKSB7CisJCQlTRExfUHVtcEV2ZW50cygpOyAvKiBOZWVkZWQgd2hlbiBldmVudCB0aHJlYWQgaXMgb2ZmICovCisJCX0KKwkJaWYgKCBTRExfUGVlcEV2ZW50cyhOVUxMLCAwLCBTRExfUEVFS0VWRU5ULCBTRExfUVVJVE1BU0spICkgeworCQkJZG9uZSA9IDE7CisJCX0KKwkJLyogR2l2ZSB1cCBzb21lIENQVSBzbyB0aGUgZXZlbnRzIGNhbiBhY2N1bXVsYXRlICovCisJCVNETF9EZWxheSgyMCk7CisJfQorCVNETF9XYWl0VGhyZWFkKG1vdXNlX3RocmVhZCwgTlVMTCk7CisJU0RMX1dhaXRUaHJlYWQoa2V5YmRfdGhyZWFkLCBOVUxMKTsKKwlTRExfUXVpdCgpOworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3RvcnR1cmV0aHJlYWQuYyBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3RvcnR1cmV0aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE4OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYi9zZGwtMS4yLjE1L3Rlc3QvdG9ydHVyZXRocmVhZC5jCkBAIC0wLDAgKzEsOTEgQEAKKworLyogU2ltcGxlIHRlc3Qgb2YgdGhlIFNETCB0aHJlYWRpbmcgY29kZSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNETC5oIgorI2luY2x1ZGUgIlNETF90aHJlYWQuaCIKKworI2RlZmluZSBOVU1USFJFQURTIDEwCisKK3N0YXRpYyBjaGFyIHZvbGF0aWxlIHRpbWVfZm9yX3RocmVhZHNfdG9fZGllW05VTVRIUkVBRFNdOworCisvKiBDYWxsIHRoaXMgaW5zdGVhZCBvZiBleGl0KCksIHNvIHdlIGNhbiBjbGVhbiB1cCBTREw6IGF0ZXhpdCgpIGlzIGV2aWwuICovCitzdGF0aWMgdm9pZCBxdWl0KGludCByYykKK3sKKwlTRExfUXVpdCgpOworCWV4aXQocmMpOworfQorCitpbnQgU0RMQ0FMTCBTdWJUaHJlYWRGdW5jKHZvaWQgKmRhdGEpIHsKKwl3aGlsZSghICooaW50IHZvbGF0aWxlICopZGF0YSkgeworCQk7IC8qU0RMX0RlbGF5KDEwKTsqLyAgLyogZG8gbm90aGluZyAqLworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IFNETENBTEwgVGhyZWFkRnVuYyh2b2lkICpkYXRhKSB7CisJU0RMX1RocmVhZCAqc3ViX3RocmVhZHNbTlVNVEhSRUFEU107CisJaW50IGZsYWdzW05VTVRIUkVBRFNdOworCWludCBpOworCWludCB0aWQgPSAoaW50KSh1aW50cHRyX3QpZGF0YTsKKworCWZwcmludGYoc3RkZXJyLCAiQ3JlYXRpbmcgVGhyZWFkICVkXG4iLCB0aWQpOworCisJZm9yKGkgPSAwOyBpIDwgTlVNVEhSRUFEUzsgaSsrKSB7CisJCWZsYWdzW2ldID0gMDsKKwkJc3ViX3RocmVhZHNbaV0gPSBTRExfQ3JlYXRlVGhyZWFkKFN1YlRocmVhZEZ1bmMsICZmbGFnc1tpXSk7CisJfQorCisJcHJpbnRmKCJUaHJlYWQgJyVkJyB3YWl0aW5nIGZvciBzaWduYWxcbiIsIHRpZCk7CisJd2hpbGUodGltZV9mb3JfdGhyZWFkc190b19kaWVbdGlkXSAhPSAxKSB7CisJCTsgLyogZG8gbm90aGluZyAqLworCX0KKworCXByaW50ZigiVGhyZWFkICclZCcgc2VuZGluZyBzaWduYWxzIHRvIHN1YnRocmVhZHNcbiIsIHRpZCk7CisJZm9yKGkgPSAwOyBpIDwgIE5VTVRIUkVBRFM7IGkrKykgeworCQlmbGFnc1tpXSA9IDE7CisJCVNETF9XYWl0VGhyZWFkKHN1Yl90aHJlYWRzW2ldLCBOVUxMKTsKKwl9CisKKwlwcmludGYoIlRocmVhZCAnJWQnIGV4aXRpbmchXG4iLCB0aWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJU0RMX1RocmVhZCAqdGhyZWFkc1tOVU1USFJFQURTXTsKKwlpbnQgaTsKKworCS8qIExvYWQgdGhlIFNETCBsaWJyYXJ5ICovCisJaWYgKCBTRExfSW5pdCgwKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBTREw6ICVzXG4iLFNETF9HZXRFcnJvcigpKTsKKwkJcmV0dXJuKDEpOworCX0KKworCXNpZ25hbChTSUdTRUdWLCBTSUdfREZMKTsKKwlmb3IoaSA9IDA7IGkgPCBOVU1USFJFQURTOyBpKyspIHsKKwkJdGltZV9mb3JfdGhyZWFkc190b19kaWVbaV0gPSAwOworCQl0aHJlYWRzW2ldID0gU0RMX0NyZWF0ZVRocmVhZChUaHJlYWRGdW5jLCAodm9pZCAqKSh1aW50cHRyX3QpaSk7CisJCisJCWlmICggdGhyZWFkc1tpXSA9PSBOVUxMICkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkiQ291bGRuJ3QgY3JlYXRlIHRocmVhZDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKwkJCXF1aXQoMSk7CisJCX0KKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBOVU1USFJFQURTOyBpKyspIHsKKwkJdGltZV9mb3JfdGhyZWFkc190b19kaWVbaV0gPSAxOworCX0KKworCWZvcihpID0gMDsgaSA8IE5VTVRIUkVBRFM7IGkrKykgeworCQlTRExfV2FpdFRocmVhZCh0aHJlYWRzW2ldLCBOVUxMKTsKKwl9CisJU0RMX1F1aXQoKTsKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC91dGY4LnR4dCBiL2Rpc3RyaWIvc2RsLTEuMi4xNS90ZXN0L3V0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYjIyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmliL3NkbC0xLjIuMTUvdGVzdC91dGY4LnR4dApAQCAtMCwwICsxLDI4NyBAQAorVVRGLTggZGVjb2RlciBjYXBhYmlsaXR5IGFuZCBzdHJlc3MgdGVzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNYXJrdXMgS3VobiA8aHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1Lz4gLSAyMDAzLTAyLTE5CisKK1RoaXMgdGVzdCBmaWxlIGNhbiBoZWxwIHlvdSBleGFtaW5lLCBob3cgeW91ciBVVEYtOCBkZWNvZGVyIGhhbmRsZXMKK3ZhcmlvdXMgdHlwZXMgb2YgY29ycmVjdCwgbWFsZm9ybWVkLCBvciBvdGhlcndpc2UgaW50ZXJlc3RpbmcgVVRGLTgKK3NlcXVlbmNlcy4gVGhpcyBmaWxlIGlzIG5vdCBtZWFudCB0byBiZSBhIGNvbmZvcm1hbmNlIHRlc3QuIEl0IGRvZXMKK25vdCBwcmVzY3JpYmVzIGFueSBwYXJ0aWN1bGFyIG91dGNvbWUgYW5kIHRoZXJlZm9yZSB0aGVyZSBpcyBubyB3YXkgdG8KKyJwYXNzIiBvciAiZmFpbCIgdGhpcyB0ZXN0IGZpbGUsIGV2ZW4gdGhvdWdoIHRoZSB0ZXh0cyBzdWdnZXN0cyBhCitwcmVmZXJhYmxlIGRlY29kZXIgYmVoYXZpb3VyIGF0IHNvbWUgcGxhY2VzLiBUaGUgYWltIGlzIGluc3RlYWQgdG8KK2hlbHAgeW91IHRoaW5rIGFib3V0IGFuZCB0ZXN0IHRoZSBiZWhhdmlvdXIgb2YgeW91ciBVVEYtOCBvbiBhCitzeXN0ZW1hdGljIGNvbGxlY3Rpb24gb2YgdW51c3VhbCBpbnB1dHMuIEV4cGVyaWVuY2Ugc28gZmFyIHN1Z2dlc3RzCit0aGF0IG1vc3QgZmlyc3QtdGltZSBhdXRob3JzIG9mIFVURi04IGRlY29kZXJzIGZpbmQgYXQgbGVhc3Qgb25lCitzZXJpb3VzIHByb2JsZW0gaW4gdGhlaXIgZGVjb2RlciBieSB1c2luZyB0aGlzIGZpbGUuCisKK1RoZSB0ZXN0IGxpbmVzIGJlbG93IGNvdmVyIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIG1hbGZvcm1lZCBVVEYtOAorc2VxdWVuY2VzIGFzIHdlbGwgYXMgY29ycmVjdGx5IGVuY29kZWQgVVRGLTggc2VxdWVuY2VzIG9mIFVuaWNvZGUgY29kZQorcG9pbnRzIHRoYXQgc2hvdWxkIG5ldmVyIG9jY3VyIGluIGEgY29ycmVjdCBVVEYtOCBmaWxlLgorCitBY2NvcmRpbmcgdG8gSVNPIDEwNjQ2LTE6MjAwMCwgc2VjdGlvbnMgRC43IGFuZCAyLjNjLCBhIGRldmljZQorcmVjZWl2aW5nIFVURi04IHNoYWxsIGludGVycHJldCBhICJtYWxmb3JtZWQgc2VxdWVuY2UgaW4gdGhlIHNhbWUgd2F5Cit0aGF0IGl0IGludGVycHJldHMgYSBjaGFyYWN0ZXIgdGhhdCBpcyBvdXRzaWRlIHRoZSBhZG9wdGVkIHN1YnNldCIgYW5kCisiY2hhcmFjdGVycyB0aGF0IGFyZSBub3Qgd2l0aGluIHRoZSBhZG9wdGVkIHN1YnNldCBzaGFsbCBiZSBpbmRpY2F0ZWQKK3RvIHRoZSB1c2VyIiBieSBhIHJlY2VpdmluZyBkZXZpY2UuIEEgcXVpdGUgY29tbW9ubHkgdXNlZCBhcHByb2FjaCBpbgorVVRGLTggZGVjb2RlcnMgaXMgdG8gcmVwbGFjZSBhbnkgbWFsZm9ybWVkIFVURi04IHNlcXVlbmNlIGJ5IGEKK3JlcGxhY2VtZW50IGNoYXJhY3RlciAoVStGRkZEKSwgd2hpY2ggbG9va3MgYSBiaXQgbGlrZSBhbiBpbnZlcnRlZAorcXVlc3Rpb24gbWFyaywgb3IgYSBzaW1pbGFyIHN5bWJvbC4gSXQgbWlnaHQgYmUgYSBnb29kIGlkZWEgdG8KK3Zpc3VhbGx5IGRpc3Rpbmd1aXNoIGEgbWFsZm9ybWVkIFVURi04IHNlcXVlbmNlIGZyb20gYSBjb3JyZWN0bHkKK2VuY29kZWQgVW5pY29kZSBjaGFyYWN0ZXIgdGhhdCBpcyBqdXN0IG5vdCBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQKK2ZvbnQgYnV0IG90aGVyd2lzZSBmdWxseSBsZWdhbCwgZXZlbiB0aG91Z2ggSVNPIDEwNjQ2LTEgZG9lc24ndAorbWFuZGF0ZSB0aGlzLiBJbiBhbnkgY2FzZSwganVzdCBpZ25vcmluZyBtYWxmb3JtZWQgc2VxdWVuY2VzIG9yCit1bmF2YWlsYWJsZSBjaGFyYWN0ZXJzIGRvZXMgbm90IGNvbmZvcm0gdG8gSVNPIDEwNjQ2LCB3aWxsIG1ha2UKK2RlYnVnZ2luZyBtb3JlIGRpZmZpY3VsdCwgYW5kIGNhbiBsZWFkIHRvIHVzZXIgY29uZnVzaW9uLgorCitQbGVhc2UgY2hlY2ssIHdoZXRoZXIgYSBtYWxmb3JtZWQgVVRGLTggc2VxdWVuY2UgaXMgKDEpIHJlcHJlc2VudGVkIGF0CithbGwsICgyKSByZXByZXNlbnRlZCBieSBleGFjdGx5IG9uZSBzaW5nbGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIChvcgorZXF1aXZhbGVudCBzaWduYWwpLCBhbmQgKDMpIHRoZSBmb2xsb3dpbmcgcXVvdGF0aW9uIG1hcmsgYWZ0ZXIgYW4KK2lsbGVnYWwgVVRGLTggc2VxdWVuY2UgaXMgY29ycmVjdGx5IGRpc3BsYXllZCwgaS5lLiBwcm9wZXIKK3Jlc3luY2hyb25pemF0aW9uIHRha2VzIHBsYWNlIGltbWFnZWF0ZWx5IGFmdGVyIGFueSBtYWxmb3JtZWQKK3NlcXVlbmNlLiBUaGlzIGZpbGUgc2F5cyAiVEhFIEVORCIgaW4gdGhlIGxhc3QgbGluZSwgc28gaWYgeW91IGRvbid0CitzZWUgdGhhdCwgeW91ciBkZWNvZGVyIGNyYXNoZWQgc29tZWhvdyBiZWZvcmUsIHdoaWNoIHNob3VsZCBhbHdheXMgYmUKK2NhdXNlIGZvciBjb25jZXJuLgorCitBbGwgbGluZXMgaW4gdGhpcyBmaWxlIGFyZSBleGFjdGx5IDc5IGNoYXJhY3RlcnMgbG9uZyAocGx1cyB0aGUgbGluZQorZmVlZCkuIEluIGFkZGl0aW9uLCBhbGwgbGluZXMgZW5kIHdpdGggInwiLCBleGNlcHQgZm9yIHRoZSB0d28gdGVzdAorbGluZXMgMi4xLjEgYW5kIDIuMi4xLCB3aGljaCBjb250YWluIG5vbi1wcmludGFibGUgQVNDSUkgY29udHJvbHMKK1UrMDAwMCBhbmQgVSswMDdGLiBJZiB5b3UgZGlzcGxheSB0aGlzIGZpbGUgd2l0aCBhIGZpeGVkLXdpZHRoIGZvbnQsCit0aGVzZSAifCIgY2hhcmFjdGVycyBzaG91bGQgYWxsIGxpbmUgdXAgaW4gY29sdW1uIDc5IChyaWdodCBtYXJnaW4pLgorVGhpcyBhbGxvd3MgeW91IHRvIHRlc3QgcXVpY2tseSwgd2hldGhlciB5b3VyIFVURi04IGRlY29kZXIgZmluZHMgdGhlCitjb3JyZWN0IG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGV2ZXJ5IGxpbmUsIHRoYXQgaXMgd2hldGhlciBlYWNoCittYWxmb3JtZWQgc2VxdWVuY2VzIGlzIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4KKworTm90ZSB0aGF0IGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBub3Rpb24gb2YgbWFsZm9ybWVkIHNlcXVlbmNlIHVzZWQKK2hlcmUsIGl0IGlzIGFsc28gYSBwZXJmZWN0bHkgYWNjZXB0YWJsZSAoYW5kIGluIHNvbWUgc2l0dWF0aW9ucyBldmVuCitwcmVmZXJhYmxlKSBzb2x1dGlvbiB0byByZXByZXNlbnQgZWFjaCBpbmRpdmlkdWFsIGJ5dGUgb2YgYSBtYWxmb3JtZWQKK3NlcXVlbmNlIGJ5IGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyLiBJZiB5b3UgZm9sbG93IHRoaXMgc3RyYXRlZ3kgaW4KK3lvdXIgZGVjb2RlciwgdGhlbiBwbGVhc2UgaWdub3JlIHRoZSAifCIgY29sdW1uLgorCisKK0hlcmUgY29tZSB0aGUgdGVzdHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzEgIFNvbWUgY29ycmVjdCBVVEYtOCB0ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyhUaGUgY29kZXBvaW50cyBmb3IgdGhpcyB0ZXN0IGFyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgVSswM0JBIFUrMUY3OSBVKzAzQzMgVSswM0JDIFUrMDNCNSAgLS1yeWFuLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK1lvdSBzaG91bGQgc2VlIHRoZSBHcmVlayB3b3JkICdrb3NtZSc6ICAgICAgICLOuuG9uc+DzrzOtSIgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIgIEJvdW5kYXJ5IGNvbmRpdGlvbiB0ZXN0IGNhc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMSAgRmlyc3QgcG9zc2libGUgc2VxdWVuY2Ugb2YgYSBjZXJ0YWluIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyhieXRlIHplcm8gc2tpcHBlZC4uLnRoZXJlJ3MgYSBudWxsIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QuIC0tcnlhbi4pICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMS4yICAyIGJ5dGVzIChVLTAwMDAwMDgwKTogICAgICAgICLCgCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisyLjEuMyAgMyBieXRlcyAoVS0wMDAwMDgwMCk6ICAgICAgICAi4KCAIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMS40ICA0IGJ5dGVzIChVLTAwMDEwMDAwKTogICAgICAgICLwkICAIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyg1IGFuZCA2IGJ5dGUgc2VxdWVuY2VzIHdlcmUgbWFkZSBpbGxlZ2FsIGluIHJmYzM2MjkuIC0tcnlhbi4pICAgICAgICAgICAgICAgIHwKKzIuMS41ICA1IGJ5dGVzIChVLTAwMjAwMDAwKTogICAgICAgICL4iICAgCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisyLjEuNiAgNiBieXRlcyAoVS0wNDAwMDAwMCk6ICAgICAgICAi/ISAgICAIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMiAgTGFzdCBwb3NzaWJsZSBzZXF1ZW5jZSBvZiBhIGNlcnRhaW4gbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMi4xICAxIGJ5dGUgIChVLTAwMDAwMDdGKTogICAgICAgICJ/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMi4yICAyIGJ5dGVzIChVLTAwMDAwN0ZGKTogICAgICAgICLfvyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisoU2VjdGlvbiA1LjMuMiBiZWxvdyBjYWxscyB0aGlzIGlsbGVnYWwuIC0tcnlhbi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisyLjIuMyAgMyBieXRlcyAoVS0wMDAwRkZGRik6ICAgICAgICAi77+/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyg1IGFuZCA2IGJ5dGVzIHNlcXVlbmNlcywgYW5kIDQgYnl0ZXMgc2VxdWVuY2VzID4gMHgxMEZGRkYgd2VyZSBtYWRlIGlsbGVnYWwgIHwKKyBpbiByZmMzNjI5LCBzbyB0aGVzZSBuZXh0IHRocmVlIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgaW52YWxpZCAgICAgICAgICAgIHwKKyBjaGFyYWN0ZXIgY29kZXBvaW50LiAtLXJ5YW4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMi40ICA0IGJ5dGVzIChVLTAwMUZGRkZGKTogICAgICAgICL3v7+/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMi41ICA1IGJ5dGVzIChVLTAzRkZGRkZGKTogICAgICAgICL7v7+/vyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisyLjIuNiAgNiBieXRlcyAoVS03RkZGRkZGRik6ICAgICAgICAi/b+/v7+/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMyAgT3RoZXIgYm91bmRhcnkgY29uZGl0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMy4xICBVLTAwMDBEN0ZGID0gZWQgOWYgYmYgPSAi7Z+/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorMi4zLjIgIFUtMDAwMEUwMDAgPSBlZSA4MCA4MCA9ICLugIAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisyLjMuMyAgVS0wMDAwRkZGRCA9IGVmIGJmIGJkID0gIu+/vSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMy40ICBVLTAwMTBGRkZGID0gZjQgOGYgYmYgYmYgPSAi9I+/vyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyhUaGlzIG9uZSBpcyBib2d1cyBpbiByZmMzNjI5LiAtLXJ5YW4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzIuMy41ICBVLTAwMTEwMDAwID0gZjQgOTAgODAgODAgPSAi9JCAgCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMgIE1hbGZvcm1lZCBzZXF1ZW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMSAgVW5leHBlY3RlZCBjb250aW51YXRpb24gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK0VhY2ggdW5leHBlY3RlZCBjb250aW51YXRpb24gYnl0ZSBzaG91bGQgYmUgc2VwYXJhdGVseSBzaWduYWxsZWQgYXMgYSAgICAgICAgIHwKK21hbGZvcm1lZCBzZXF1ZW5jZSBvZiBpdHMgb3duLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMS4xICBGaXJzdCBjb250aW51YXRpb24gYnl0ZSAweDgwOiAigCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMS4yICBMYXN0ICBjb250aW51YXRpb24gYnl0ZSAweGJmOiAivyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMS4zICAyIGNvbnRpbnVhdGlvbiBieXRlczogIoC/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMS40ICAzIGNvbnRpbnVhdGlvbiBieXRlczogIoC/gCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMS41ICA0IGNvbnRpbnVhdGlvbiBieXRlczogIoC/gL8iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMS42ICA1IGNvbnRpbnVhdGlvbiBieXRlczogIoC/gL+AIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMS43ICA2IGNvbnRpbnVhdGlvbiBieXRlczogIoC/gL+AvyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMS44ICA3IGNvbnRpbnVhdGlvbiBieXRlczogIoC/gL+Av4AiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMS45ICBTZXF1ZW5jZSBvZiBhbGwgNjQgcG9zc2libGUgY29udGludWF0aW9uIGJ5dGVzICgweDgwLTB4YmYpOiAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICKAgYKDhIWGh4iJiouMjY6PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICCQkZKTlJWWl5iZmpucnZ6fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICCgoaKjpKWmp6ipqqusra6vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICCwsbKztLW2t7i5uru8vb6/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMiAgTG9uZWx5IHN0YXJ0IGNoYXJhY3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMi4xICBBbGwgMzIgZmlyc3QgYnl0ZXMgb2YgMi1ieXRlIHNlcXVlbmNlcyAoMHhjMC0weGRmKSwgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICBlYWNoIGZvbGxvd2VkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICLAIMEgwiDDIMQgxSDGIMcgyCDJIMogyyDMIM0gziDPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICDQINEg0iDTINQg1SDWINcg2CDZINog2yDcIN0g3iDfICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMi4yICBBbGwgMTYgZmlyc3QgYnl0ZXMgb2YgMy1ieXRlIHNlcXVlbmNlcyAoMHhlMC0weGVmKSwgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICBlYWNoIGZvbGxvd2VkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICLgIOEg4iDjIOQg5SDmIOcg6CDpIOog6yDsIO0g7iDvICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMi4zICBBbGwgOCBmaXJzdCBieXRlcyBvZiA0LWJ5dGUgc2VxdWVuY2VzICgweGYwLTB4ZjcpLCAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICBlYWNoIGZvbGxvd2VkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICLwIPEg8iDzIPQg9SD2IPcgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMi40ICBBbGwgNCBmaXJzdCBieXRlcyBvZiA1LWJ5dGUgc2VxdWVuY2VzICgweGY4LTB4ZmIpLCAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICBlYWNoIGZvbGxvd2VkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICL4IPkg+iD7ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMi41ICBBbGwgMiBmaXJzdCBieXRlcyBvZiA2LWJ5dGUgc2VxdWVuY2VzICgweGZjLTB4ZmQpLCAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICBlYWNoIGZvbGxvd2VkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICL8IP0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMyAgU2VxdWVuY2VzIHdpdGggbGFzdCBjb250aW51YXRpb24gYnl0ZSBtaXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK0FsbCBieXRlcyBvZiBhbiBpbmNvbXBsZXRlIHNlcXVlbmNlIHNob3VsZCBiZSBzaWduYWxsZWQgYXMgYSBzaW5nbGUgICAgICAgICAgIHwKK21hbGZvcm1lZCBzZXF1ZW5jZSwgaS5lLiwgeW91IHNob3VsZCBzZWUgb25seSBhIHNpbmdsZSByZXBsYWNlbWVudCAgICAgICAgICAgIHwKK2NoYXJhY3RlciBpbiBlYWNoIG9mIHRoZSBuZXh0IDEwIHRlc3RzLiAoQ2hhcmFjdGVycyBhcyBpbiBzZWN0aW9uIDIpICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzMuMy4xICAyLWJ5dGUgc2VxdWVuY2Ugd2l0aCBsYXN0IGJ5dGUgbWlzc2luZyAoVSswMDAwKTogICAgICLAIiAgICAgICAgICAgICAgIHwKKzMuMy4yICAzLWJ5dGUgc2VxdWVuY2Ugd2l0aCBsYXN0IGJ5dGUgbWlzc2luZyAoVSswMDAwKTogICAgICLggCIgICAgICAgICAgICAgICB8CiszLjMuMyAgNC1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUrMDAwMCk6ICAgICAi8ICAIiAgICAgICAgICAgICAgIHwKKzMuMy40ICA1LWJ5dGUgc2VxdWVuY2Ugd2l0aCBsYXN0IGJ5dGUgbWlzc2luZyAoVSswMDAwKTogICAgICL4gICAIiAgICAgICAgICAgICAgIHwKKzMuMy41ICA2LWJ5dGUgc2VxdWVuY2Ugd2l0aCBsYXN0IGJ5dGUgbWlzc2luZyAoVSswMDAwKTogICAgICL8gICAgCIgICAgICAgICAgICAgICB8CiszLjMuNiAgMi1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUtMDAwMDA3RkYpOiAi3yIgICAgICAgICAgICAgICB8CiszLjMuNyAgMy1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUtMDAwMEZGRkYpOiAi778iICAgICAgICAgICAgICAgfAorMy4zLjggIDQtYnl0ZSBzZXF1ZW5jZSB3aXRoIGxhc3QgYnl0ZSBtaXNzaW5nIChVLTAwMUZGRkZGKTogIve/vyIgICAgICAgICAgICAgICB8CiszLjMuOSAgNS1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUtMDNGRkZGRkYpOiAi+7+/vyIgICAgICAgICAgICAgICB8CiszLjMuMTAgNi1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUtN0ZGRkZGRkYpOiAi/b+/v78iICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorMy40ICBDb25jYXRlbmF0aW9uIG9mIGluY29tcGxldGUgc2VxdWVuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorQWxsIHRoZSAxMCBzZXF1ZW5jZXMgb2YgMy4zIGNvbmNhdGVuYXRlZCwgeW91IHNob3VsZCBzZWUgMTAgbWFsZm9ybWVkICAgICAgICAgfAorc2VxdWVuY2VzIGJlaW5nIHNpZ25hbGxlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIsDggPCAgPiAgID8gICAgN/vv/e/v/u/v7/9v7+/vyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiszLjUgIEltcG9zc2libGUgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitUaGUgZm9sbG93aW5nIHR3byBieXRlcyBjYW5ub3QgYXBwZWFyIGluIGEgY29ycmVjdCBVVEYtOCBzdHJpbmcgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiszLjUuMSAgZmUgPSAi/iIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiszLjUuMiAgZmYgPSAi/yIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiszLjUuMyAgZmUgZmUgZmYgZmYgPSAi/v7//yIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0ICBPdmVybG9uZyBzZXF1ZW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitUaGUgZm9sbG93aW5nIHNlcXVlbmNlcyBhcmUgbm90IG1hbGZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIGxldHRlciBvZiAgICAgICAgICB8Cit0aGUgVW5pY29kZSAyLjAgc3RhbmRhcmQuIEhvd2V2ZXIsIHRoZXkgYXJlIGxvbmdlciB0aGVuIG5lY2Vzc2FyeSBhbmQgICAgICAgICB8CithIGNvcnJlY3QgVVRGLTggZW5jb2RlciBpcyBub3QgYWxsb3dlZCB0byBwcm9kdWNlIHRoZW0uIEEgInNhZmUgVVRGLTggICAgICAgICB8CitkZWNvZGVyIiBzaG91bGQgcmVqZWN0IHRoZW0ganVzdCBsaWtlIG1hbGZvcm1lZCBzZXF1ZW5jZXMgZm9yIHR3byAgICAgICAgICAgICB8CityZWFzb25zOiAoMSkgSXQgaGVscHMgdG8gZGVidWcgYXBwbGljYXRpb25zIGlmIG92ZXJsb25nIHNlcXVlbmNlcyBhcmUgICAgICAgICB8Citub3QgdHJlYXRlZCBhcyB2YWxpZCByZXByZXNlbnRhdGlvbnMgb2YgY2hhcmFjdGVycywgYmVjYXVzZSB0aGlzIGhlbHBzICAgICAgICB8Cit0byBzcG90IHByb2JsZW1zIG1vcmUgcXVpY2tseS4gKDIpIE92ZXJsb25nIHNlcXVlbmNlcyBwcm92aWRlICAgICAgICAgICAgICAgICB8CithbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgb2YgY2hhcmFjdGVycywgdGhhdCBjb3VsZCBtYWxpY2lvdXNseSBiZSAgICAgICAgICB8Cit1c2VkIHRvIGJ5cGFzcyBmaWx0ZXJzIHRoYXQgY2hlY2sgb25seSBmb3IgQVNDSUkgY2hhcmFjdGVycy4gRm9yICAgICAgICAgICAgICB8CitpbnN0YW5jZSwgYSAyLWJ5dGUgZW5jb2RlZCBsaW5lIGZlZWQgKExGKSB3b3VsZCBub3QgYmUgY2F1Z2h0IGJ5IGEgICAgICAgICAgICB8CitsaW5lIGNvdW50ZXIgdGhhdCBjb3VudHMgb25seSAweDBhIGJ5dGVzLCBidXQgaXQgd291bGQgc3RpbGwgYmUgICAgICAgICAgICAgICB8Citwcm9jZXNzZWQgYXMgYSBsaW5lIGZlZWQgYnkgYW4gdW5zYWZlIFVURi04IGRlY29kZXIgbGF0ZXIgaW4gdGhlICAgICAgICAgICAgICB8CitwaXBlbGluZS4gRnJvbSBhIHNlY3VyaXR5IHBvaW50IG9mIHZpZXcsIEFTQ0lJIGNvbXBhdGliaWxpdHkgb2YgVVRGLTggICAgICAgICB8CitzZXF1ZW5jZXMgbWVhbnMgYWxzbywgdGhhdCBBU0NJSSBjaGFyYWN0ZXJzIGFyZSAqb25seSogYWxsb3dlZCB0byBiZSAgICAgICAgICB8CityZXByZXNlbnRlZCBieSBBU0NJSSBieXRlcyBpbiB0aGUgcmFuZ2UgMHgwMC0weDdmLiBUbyBlbnN1cmUgdGhpcyAgICAgICAgICAgICB8Cithc3BlY3Qgb2YgQVNDSUkgY29tcGF0aWJpbGl0eSwgdXNlIG9ubHkgInNhZmUgVVRGLTggZGVjb2RlcnMiIHRoYXQgICAgICAgICAgICB8CityZWplY3Qgb3ZlcmxvbmcgVVRGLTggc2VxdWVuY2VzIGZvciB3aGljaCBhIHNob3J0ZXIgZW5jb2RpbmcgZXhpc3RzLiAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjEgIEV4YW1wbGVzIG9mIGFuIG92ZXJsb25nIEFTQ0lJIGNoYXJhY3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitXaXRoIGEgc2FmZSBVVEYtOCBkZWNvZGVyLCBhbGwgb2YgdGhlIGZvbGxvd2luZyBmaXZlIG92ZXJsb25nICAgICAgICAgICAgICAgICB8CityZXByZXNlbnRhdGlvbnMgb2YgdGhlIEFTQ0lJIGNoYXJhY3RlciBzbGFzaCAoIi8iKSBzaG91bGQgYmUgcmVqZWN0ZWQgICAgICAgICB8CitsaWtlIGEgbWFsZm9ybWVkIFVURi04IHNlcXVlbmNlLCBmb3IgaW5zdGFuY2UgYnkgc3Vic3RpdHV0aW5nIGl0IHdpdGggICAgICAgICB8CithIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gSWYgeW91IHNlZSBhIHNsYXNoIGJlbG93LCB5b3UgZG8gbm90IGhhdmUgYSAgICAgICAgICB8CitzYWZlIFVURi04IGRlY29kZXIhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjEuMSBVKzAwMkYgPSBjMCBhZiAgICAgICAgICAgICA9ICLAryIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNC4xLjIgVSswMDJGID0gZTAgODAgYWYgICAgICAgICAgPSAi4ICvIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjEuMyBVKzAwMkYgPSBmMCA4MCA4MCBhZiAgICAgICA9ICLwgICvIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjEuNCBVKzAwMkYgPSBmOCA4MCA4MCA4MCBhZiAgICA9ICL4gICAryIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNC4xLjUgVSswMDJGID0gZmMgODAgODAgODAgODAgYWYgPSAi/ICAgICvIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjIgIE1heGltdW0gb3Zlcmxvbmcgc2VxdWVuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitCZWxvdyB5b3Ugc2VlIHRoZSBoaWdoZXN0IFVuaWNvZGUgdmFsdWUgdGhhdCBpcyBzdGlsbCByZXN1bHRpbmcgaW4gYW4gICAgICAgICB8CitvdmVybG9uZyBzZXF1ZW5jZSBpZiByZXByZXNlbnRlZCB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuIFRoaXMgICAgICAgICB8CitpcyBhIGJvdW5kYXJ5IHRlc3QgZm9yIHNhZmUgVVRGLTggZGVjb2RlcnMuIEFsbCBmaXZlIGNoYXJhY3RlcnMgc2hvdWxkICAgICAgICB8CitiZSByZWplY3RlZCBsaWtlIG1hbGZvcm1lZCBVVEYtOCBzZXF1ZW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjIuMSAgVS0wMDAwMDA3RiA9IGMxIGJmICAgICAgICAgICAgID0gIsG/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNC4yLjIgIFUtMDAwMDA3RkYgPSBlMCA5ZiBiZiAgICAgICAgICA9ICLgn78iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjIuMyAgVS0wMDAwRkZGRiA9IGYwIDhmIGJmIGJmICAgICAgID0gIvCPv78iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjIuNCAgVS0wMDFGRkZGRiA9IGY4IDg3IGJmIGJmIGJmICAgID0gIviHv7+/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNC4yLjUgIFUtMDNGRkZGRkYgPSBmYyA4MyBiZiBiZiBiZiBiZiA9ICL8g7+/v78iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjMgIE92ZXJsb25nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBOVUwgY2hhcmFjdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitUaGUgZm9sbG93aW5nIGZpdmUgc2VxdWVuY2VzIHNob3VsZCBhbHNvIGJlIHJlamVjdGVkIGxpa2UgbWFsZm9ybWVkICAgICAgICAgICB8CitVVEYtOCBzZXF1ZW5jZXMgYW5kIHNob3VsZCBub3QgYmUgdHJlYXRlZCBsaWtlIHRoZSBBU0NJSSBOVUwgICAgICAgICAgICAgICAgICB8CitjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjMuMSAgVSswMDAwID0gYzAgODAgICAgICAgICAgICAgPSAiwIAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNC4zLjIgIFUrMDAwMCA9IGUwIDgwIDgwICAgICAgICAgID0gIuCAgCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjMuMyAgVSswMDAwID0gZjAgODAgODAgODAgICAgICAgPSAi8ICAgCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis0LjMuNCAgVSswMDAwID0gZjggODAgODAgODAgODAgICAgPSAi+ICAgIAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNC4zLjUgIFUrMDAwMCA9IGZjIDgwIDgwIDgwIDgwIDgwID0gIvyAgICAgCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis1ICBJbGxlZ2FsIGNvZGUgcG9zaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitUaGUgZm9sbG93aW5nIFVURi04IHNlcXVlbmNlcyBzaG91bGQgYmUgcmVqZWN0ZWQgbGlrZSBtYWxmb3JtZWQgICAgICAgICAgICAgICB8CitzZXF1ZW5jZXMsIGJlY2F1c2UgdGhleSBuZXZlciByZXByZXNlbnQgdmFsaWQgSVNPIDEwNjQ2IGNoYXJhY3RlcnMgYW5kICAgICAgICB8CithIFVURi04IGRlY29kZXIgdGhhdCBhY2NlcHRzIHRoZW0gbWlnaHQgaW50cm9kdWNlIHNlY3VyaXR5IHByb2JsZW1zICAgICAgICAgICB8Citjb21wYXJhYmxlIHRvIG92ZXJsb25nIFVURi04IHNlcXVlbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis1LjEgU2luZ2xlIFVURi0xNiBzdXJyb2dhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis1LjEuMSAgVStEODAwID0gZWQgYTAgODAgPSAi7aCAIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzUuMS4yICBVK0RCN0YgPSBlZCBhZCBiZiA9ICLtrb8iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNS4xLjMgIFUrREI4MCA9IGVkIGFlIDgwID0gIu2ugCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis1LjEuNCAgVStEQkZGID0gZWQgYWYgYmYgPSAi7a+/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzUuMS41ICBVK0RDMDAgPSBlZCBiMCA4MCA9ICLtsIAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNS4xLjYgIFUrREY4MCA9IGVkIGJlIDgwID0gIu2+gCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis1LjEuNyAgVStERkZGID0gZWQgYmYgYmYgPSAi7b+/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzUuMiBQYWlyZWQgVVRGLTE2IHN1cnJvZ2F0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzUuMi4xICBVK0Q4MDAgVStEQzAwID0gZWQgYTAgODAgZWQgYjAgODAgPSAi7aCA7bCAIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis1LjIuMiAgVStEODAwIFUrREZGRiA9IGVkIGEwIDgwIGVkIGJmIGJmID0gIu2ggO2/vyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNS4yLjMgIFUrREI3RiBVK0RDMDAgPSBlZCBhZCBiZiBlZCBiMCA4MCA9ICLtrb/tsIAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzUuMi40ICBVK0RCN0YgVStERkZGID0gZWQgYWQgYmYgZWQgYmYgYmYgPSAi7a2/7b+/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis1LjIuNSAgVStEQjgwIFUrREMwMCA9IGVkIGFlIDgwIGVkIGIwIDgwID0gIu2ugO2wgCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNS4yLjYgIFUrREI4MCBVK0RGRkYgPSBlZCBhZSA4MCBlZCBiZiBiZiA9ICLtroDtv78iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzUuMi43ICBVK0RCRkYgVStEQzAwID0gZWQgYWYgYmYgZWQgYjAgODAgPSAi7a+/7bCAIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis1LjIuOCAgVStEQkZGIFUrREZGRiA9IGVkIGFmIGJmIGVkIGJmIGJmID0gIu2vv+2/vyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNS4zIE90aGVyIGlsbGVnYWwgY29kZSBwb3NpdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorNS4zLjEgIFUrRkZGRSA9IGVmIGJmIGJlID0gIu+/viIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis1LjMuMiAgVStGRkZGID0gZWYgYmYgYmYgPSAi77+/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK1RIRSBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwo=